ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uLzAwLUlOREVYCmluZGV4IDhkZThhMDEuLmYyOGEyNGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi8wMC1JTkRFWApAQCAtMTM4LDYgKzEzOCw4IEBACiAJLSBpbmZvIG9uIHRoZSBpbi1rZXJuZWwgYmluYXJ5IHN1cHBvcnQgZm9yIEphdmEodG0pLgoga2J1aWxkLwogCS0gZGlyZWN0b3J5IHdpdGggaW5mbyBhYm91dCB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuCitrZHVtcHQudHh0CisgICAgICAgLSBtaW5pIEhvd1RvIG9uIGdldHRpbmcgdGhlIGNyYXNoIGR1bXAgY29kZSB0byB3b3JrLgoga2VybmVsLWRvYy1uYW5vLUhPV1RPLnR4dAogCS0gbWluaSBIb3dUbyBvbiBnZW5lcmF0aW9uIGFuZCBsb2NhdGlvbiBvZiBrZXJuZWwgZG9jdW1lbnRhdGlvbiBmaWxlcy4KIGtlcm5lbC1kb2NzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzIGIvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCmluZGV4IDU3NTQyYmMuLmRmZWM3NTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQ2hhbmdlcworKysgYi9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKQEAgLTQ0LDkgKzQ0LDkgQEAKIAogQWdhaW4sIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgbGlzdCBhc3N1bWVzIHlvdSBhcmUgYWxyZWFkeQogZnVuY3Rpb25hbGx5IHJ1bm5pbmcgYSBMaW51eCAyLjQga2VybmVsLiAgQWxzbywgbm90IGFsbCB0b29scyBhcmUKLW5lY2Vzc2FyeSBvbiBhbGwgc3lzdGVtczsgb2J2aW91c2x5LCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgUENNQ0lBIChQQwotQ2FyZCkgaGFyZHdhcmUsIGZvciBleGFtcGxlLCB5b3UgcHJvYmFibHkgbmVlZG4ndCBjb25jZXJuIHlvdXJzZWxmCi13aXRoIHBjbWNpYS1jcy4KK25lY2Vzc2FyeSBvbiBhbGwgc3lzdGVtczsgb2J2aW91c2x5LCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgSVNETgoraGFyZHdhcmUsIGZvciBleGFtcGxlLCB5b3UgcHJvYmFibHkgbmVlZG4ndCBjb25jZXJuIHlvdXJzZWxmIHdpdGgKK2lzZG40ay11dGlscy4KIAogbyAgR251IEMgICAgICAgICAgICAgICAgICAyLjk1LjMgICAgICAgICAgICAgICAgICAjIGdjYyAtLXZlcnNpb24KIG8gIEdudSBtYWtlICAgICAgICAgICAgICAgMy43OS4xICAgICAgICAgICAgICAgICAgIyBtYWtlIC0tdmVyc2lvbgpAQCAtNTcsMTMgKzU3LDE0IEBACiBvICBqZnN1dGlscyAgICAgICAgICAgICAgIDEuMS4zICAgICAgICAgICAgICAgICAgICMgZnNjay5qZnMgLVYKIG8gIHJlaXNlcmZzcHJvZ3MgICAgICAgICAgMy42LjMgICAgICAgICAgICAgICAgICAgIyByZWlzZXJmc2NrIC1WIDI+JjF8Z3JlcCByZWlzZXJmc3Byb2dzCiBvICB4ZnNwcm9ncyAgICAgICAgICAgICAgIDIuNi4wICAgICAgICAgICAgICAgICAgICMgeGZzX2RiIC1WCitvICBwY21jaWF1dGlscyAgICAgICAgICAgIDAwNAogbyAgcGNtY2lhLWNzICAgICAgICAgICAgICAzLjEuMjEgICAgICAgICAgICAgICAgICAjIGNhcmRtZ3IgLVYKIG8gIHF1b3RhLXRvb2xzICAgICAgICAgICAgMy4wOSAgICAgICAgICAgICAgICAgICAgIyBxdW90YSAtVgogbyAgUFBQICAgICAgICAgICAgICAgICAgICAyLjQuMCAgICAgICAgICAgICAgICAgICAjIHBwcGQgLS12ZXJzaW9uCiBvICBpc2RuNGstdXRpbHMgICAgICAgICAgIDMuMXByZTEgICAgICAgICAgICAgICAgICMgaXNkbmN0cmwgMj4mMXxncmVwIHZlcnNpb24KIG8gIG5mcy11dGlscyAgICAgICAgICAgICAgMS4wLjUgICAgICAgICAgICAgICAgICAgIyBzaG93bW91bnQgLS12ZXJzaW9uCiBvICBwcm9jcHMgICAgICAgICAgICAgICAgIDMuMi4wICAgICAgICAgICAgICAgICAgICMgcHMgLS12ZXJzaW9uCi1vICBvcHJvZmlsZSAgICAgICAgICAgICAgIDAuNS4zICAgICAgICAgICAgICAgICAgICMgb3Byb2ZpbGVkIC0tdmVyc2lvbgorbyAgb3Byb2ZpbGUgICAgICAgICAgICAgICAwLjkgICAgICAgICAgICAgICAgICAgICAjIG9wcm9maWxlZCAtLXZlcnNpb24KIAogS2VybmVsIGNvbXBpbGF0aW9uCiA9PT09PT09PT09PT09PT09PT0KQEAgLTE4NiwxMyArMTg3LDIwIEBACiB3b3JrIGNvcnJlY3RseSB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUgWEZTIGtlcm5lbCBjb2RlICgyLjYuMCBvcgogbGF0ZXIgaXMgcmVjb21tZW5kZWQsIGR1ZSB0byBzb21lIHNpZ25pZmljYW50IGltcHJvdmVtZW50cykuCiAKK1BDTUNJQXV0aWxzCistLS0tLS0tLS0tLQorCitQQ01DSUF1dGlscyByZXBsYWNlcyBwY21jaWEtY3MgKHNlZSBiZWxvdykuIEl0IHByb3Blcmx5IHNldHMgdXAKK1BDTUNJQSBzb2NrZXRzIGF0IHN5c3RlbSBzdGFydHVwIGFuZCBsb2FkcyB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlcworZm9yIDE2LWJpdCBQQ01DSUEgZGV2aWNlcyBpZiB0aGUga2VybmVsIGlzIG1vZHVsYXJpemVkIGFuZCB0aGUgaG90cGx1Zworc3Vic3lzdGVtIGlzIHVzZWQuCiAKIFBjbWNpYS1jcwogLS0tLS0tLS0tCiAKIFBDTUNJQSAoUEMgQ2FyZCkgc3VwcG9ydCBpcyBub3cgcGFydGlhbGx5IGltcGxlbWVudGVkIGluIHRoZSBtYWluCi1rZXJuZWwgc291cmNlLiAgUGF5IGF0dGVudGlvbiB3aGVuIHlvdSByZWNvbXBpbGUgeW91ciBrZXJuZWwgOy0pLgotQWxzbywgYmUgc3VyZSB0byB1cGdyYWRlIHRvIHRoZSBsYXRlc3QgcGNtY2lhLWNzIHJlbGVhc2UuCitrZXJuZWwgc291cmNlLiBUaGUgInBjbWNpYXV0aWxzIiBwYWNrYWdlIChzZWUgYWJvdmUpIHJlcGxhY2VzIHBjbWNpYS1jcworZm9yIG5ld2VzdCBrZXJuZWxzLgogCiBRdW90YS10b29scwogLS0tLS0tLS0tLS0KQEAgLTM0OSw5ICszNTcsMTMgQEAKIC0tLS0tLS0tCiBvICA8ZnRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMveGZzL2Rvd25sb2FkLz4KIAorUGNtY2lhdXRpbHMKKy0tLS0tLS0tLS0tCitvICA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9wY21jaWEvPgorCiBQY21jaWEtY3MKIC0tLS0tLS0tLQotbyAgPGZ0cDovL3BjbWNpYS1jcy5zb3VyY2Vmb3JnZS5uZXQvcHViL3BjbWNpYS1jcy9wY21jaWEtY3MtMy4xLjIxLnRhci5nej4KK28gIDxodHRwOi8vcGNtY2lhLWNzLnNvdXJjZWZvcmdlLm5ldC8+CiAKIFF1b3RhLXRvb2xzCiAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKaW5kZXggODdkYTM0Ny4uZmEzZTI5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQpAQCAtNDksNyArNDksNyBAQAogS0VSTkVMRE9DID0gc2NyaXB0cy9rZXJuZWwtZG9jCiBET0NQUk9DICAgPSBzY3JpcHRzL2Jhc2ljL2RvY3Byb2MKIAotWE1MVE9GTEFHUyA9IC1tIERvY3VtZW50YXRpb24vRG9jQm9vay9zdHlsZXNoZWV0LnhzbAorWE1MVE9GTEFHUyA9IC1tICQoc3JjdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3N0eWxlc2hlZXQueHNsCiAjWE1MVE9GTEFHUyArPSAtLXNraXAtdmFsaWRhdGlvbgogCiAjIyMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCmluZGV4IGJiNmEwMTAuLmQ2NTBjZTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbApAQCAtMjY2LDcgKzI2Niw3IEBACiAgIDxjaGFwdGVyIGlkPSJoYXJkd2FyZSI+CiAgICAgIDx0aXRsZT5IYXJkd2FyZSBJbnRlcmZhY2VzPC90aXRsZT4KICAgICAgPHNlY3QxPjx0aXRsZT5JbnRlcnJ1cHQgSGFuZGxpbmc8L3RpdGxlPgotIUlhcmNoL2kzODYva2VybmVsL2lycS5jCishSWtlcm5lbC9pcnEvbWFuYWdlLmMKICAgICAgPC9zZWN0MT4KIAogICAgICA8c2VjdDE+PHRpdGxlPlJlc291cmNlcyBNYW5hZ2VtZW50PC90aXRsZT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9saWJhdGEudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9saWJhdGEudG1wbAppbmRleCA2ZGYxZGZkLi4zNzVhZTc2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbGliYXRhLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2xpYmF0YS50bXBsCkBAIC04NCw2ICs4NCwxNCBAQAogCUNhbGxlZCBmcm9tIGF0YV9idXNfcHJvYmUoKSBhbmQgYXRhX2J1c19yZXNldCgpIGVycm9yIHBhdGhzLAogCWFzIHdlbGwgYXMgd2hlbiB1bnJlZ2lzdGVyaW5nIGZyb20gdGhlIFNDU0kgbW9kdWxlIChybW1vZCwgaG90CiAJdW5wbHVnKS4KKwlUaGlzIGZ1bmN0aW9uIHNob3VsZCBkbyB3aGF0ZXZlciBuZWVkcyB0byBiZSBkb25lIHRvIHRha2UgdGhlCisJcG9ydCBvdXQgb2YgdXNlLiAgSW4gbW9zdCBjYXNlcywgYXRhX3BvcnRfZGlzYWJsZSgpIGNhbiBiZSB1c2VkCisJYXMgdGhpcyBob29rLgorCTwvcGFyYT4KKwk8cGFyYT4KKwlDYWxsZWQgZnJvbSBhdGFfYnVzX3Byb2JlKCkgb24gYSBmYWlsZWQgcHJvYmUuCisJQ2FsbGVkIGZyb20gYXRhX2J1c19yZXNldCgpIG9uIGEgZmFpbGVkIGJ1cyByZXNldC4KKwlDYWxsZWQgZnJvbSBhdGFfc2NzaV9yZWxlYXNlKCkuCiAJPC9wYXJhPgogCiAJPC9zZWN0Mj4KQEAgLTk4LDYgKzEwNiwxMyBAQAogCWZvdW5kLiAgVHlwaWNhbGx5IHVzZWQgdG8gYXBwbHkgZGV2aWNlLXNwZWNpZmljIGZpeHVwcyBwcmlvciB0bwogCWlzc3VlIG9mIFNFVCBGRUFUVVJFUyAtIFhGRVIgTU9ERSwgYW5kIHByaW9yIHRvIG9wZXJhdGlvbi4KIAk8L3BhcmE+CisJPHBhcmE+CisJQ2FsbGVkIGJ5IGF0YV9kZXZpY2VfYWRkKCkgYWZ0ZXIgYXRhX2Rldl9pZGVudGlmeSgpIGRldGVybWluZXMKKwlhIGRldmljZSBpcyBwcmVzZW50LgorCTwvcGFyYT4KKwk8cGFyYT4KKwlUaGlzIGVudHJ5IG1heSBiZSBzcGVjaWZpZWQgYXMgTlVMTCBpbiBhdGFfcG9ydF9vcGVyYXRpb25zLgorCTwvcGFyYT4KIAogCTwvc2VjdDI+CiAKQEAgLTEzNSw2ICsxNTAsOCBAQAogCXJlZ2lzdGVycyAvIERNQSBidWZmZXJzLiAgLT50Zl9yZWFkKCkgaXMgY2FsbGVkIHRvIHJlYWQgdGhlCiAJaGFyZHdhcmUgcmVnaXN0ZXJzIC8gRE1BIGJ1ZmZlcnMsIHRvIG9idGFpbiB0aGUgY3VycmVudCBzZXQgb2YKIAl0YXNrZmlsZSByZWdpc3RlciB2YWx1ZXMuCisJTW9zdCBkcml2ZXJzIGZvciB0YXNrZmlsZS1iYXNlZCBoYXJkd2FyZSAoUElPIG9yIE1NSU8pIHVzZQorCWF0YV90Zl9sb2FkKCkgYW5kIGF0YV90Zl9yZWFkKCkgZm9yIHRoZXNlIGhvb2tzLgogCTwvcGFyYT4KIAogCTwvc2VjdDI+CkBAIC0xNDcsNiArMTY0LDggQEAKIAk8cGFyYT4KIAljYXVzZXMgYW4gQVRBIGNvbW1hbmQsIHByZXZpb3VzbHkgbG9hZGVkIHdpdGgKIAktPnRmX2xvYWQoKSwgdG8gYmUgaW5pdGlhdGVkIGluIGhhcmR3YXJlLgorCU1vc3QgZHJpdmVycyBmb3IgdGFza2ZpbGUtYmFzZWQgaGFyZHdhcmUgdXNlIGF0YV9leGVjX2NvbW1hbmQoKQorCWZvciB0aGlzIGhvb2suCiAJPC9wYXJhPgogCiAJPC9zZWN0Mj4KQEAgLTE2MSw2ICsxODAsMTAgQEAKIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgaXQgaXMgT0sgdG8gdXNlIERNQSBmb3IgdGhlIHN1cHBsaWVkIFBBQ0tFVAogY29tbWFuZC4KIAk8L3BhcmE+CisJPHBhcmE+CisJVGhpcyBob29rIG1heSBiZSBzcGVjaWZpZWQgYXMgTlVMTCwgaW4gd2hpY2ggY2FzZSBsaWJhdGEgd2lsbAorCWFzc3VtZSB0aGF0IGF0YXBpIGRtYSBjYW4gYmUgc3VwcG9ydGVkLgorCTwvcGFyYT4KIAogCTwvc2VjdDI+CiAKQEAgLTE3NSw2ICsxOTgsMTQgQEAKIAlSZWFkcyB0aGUgU3RhdHVzL0FsdFN0YXR1cy9FcnJvciBBVEEgc2hhZG93IHJlZ2lzdGVyIGZyb20KIAloYXJkd2FyZS4gIE9uIHNvbWUgaGFyZHdhcmUsIHJlYWRpbmcgdGhlIFN0YXR1cyByZWdpc3RlciBoYXMKIAl0aGUgc2lkZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIGludGVycnVwdCBjb25kaXRpb24uCisJTW9zdCBkcml2ZXJzIGZvciB0YXNrZmlsZS1iYXNlZCBoYXJkd2FyZSB1c2UKKwlhdGFfY2hlY2tfc3RhdHVzKCkgZm9yIHRoaXMgaG9vay4KKwk8L3BhcmE+CisJPHBhcmE+CisJTm90ZSB0aGF0IGJlY2F1c2UgdGhpcyBpcyBjYWxsZWQgZnJvbSBhdGFfZGV2aWNlX2FkZCgpLCBhdAorCWxlYXN0IGEgZHVtbXkgZnVuY3Rpb24gdGhhdCBjbGVhcnMgZGV2aWNlIGludGVycnVwdHMgbXVzdCBiZQorCXByb3ZpZGVkIGZvciBhbGwgZHJpdmVycywgZXZlbiBpZiB0aGUgY29udHJvbGxlciBkb2Vzbid0CisJYWN0dWFsbHkgaGF2ZSBhIHRhc2tmaWxlIHN0YXR1cyByZWdpc3Rlci4KIAk8L3BhcmE+CiAKIAk8L3NlY3QyPgpAQCAtMTg4LDcgKzIxOSwxMyBAQAogCUlzc3VlcyB0aGUgbG93LWxldmVsIGhhcmR3YXJlIGNvbW1hbmQocykgdGhhdCBjYXVzZXMgb25lIG9mIE4KIAloYXJkd2FyZSBkZXZpY2VzIHRvIGJlIGNvbnNpZGVyZWQgJ3NlbGVjdGVkJyAoYWN0aXZlIGFuZAogCWF2YWlsYWJsZSBmb3IgdXNlKSBvbiB0aGUgQVRBIGJ1cy4gIFRoaXMgZ2VuZXJhbGx5IGhhcyBubwotbWVhbmluZyBvbiBGSVMtYmFzZWQgZGV2aWNlcy4KKwltZWFuaW5nIG9uIEZJUy1iYXNlZCBkZXZpY2VzLgorCTwvcGFyYT4KKwk8cGFyYT4KKwlNb3N0IGRyaXZlcnMgZm9yIHRhc2tmaWxlLWJhc2VkIGhhcmR3YXJlIHVzZQorCWF0YV9zdGRfZGV2X3NlbGVjdCgpIGZvciB0aGlzIGhvb2suICBDb250cm9sbGVycyB3aGljaCBkbyBub3QKKwlzdXBwb3J0IHNlY29uZCBkcml2ZXMgb24gYSBwb3J0IChzdWNoIGFzIFNBVEEgY29udG9sbGVycykgd2lsbAorCXVzZSBhdGFfbm9vcF9kZXZfc2VsZWN0KCkuCiAJPC9wYXJhPgogCiAJPC9zZWN0Mj4KQEAgLTIwNCw2ICsyNDEsOCBAQAogCWZvciBkZXZpY2UgcHJlc2VuY2UgKFBBVEEgYW5kIFNBVEEpLCB0eXBpY2FsbHkgYSBzb2Z0IHJlc2V0CiAJKFNSU1QpIHdpbGwgYmUgcGVyZm9ybWVkLiAgRHJpdmVycyB0eXBpY2FsbHkgdXNlIHRoZSBoZWxwZXIKIAlmdW5jdGlvbnMgYXRhX2J1c19yZXNldCgpIG9yIHNhdGFfcGh5X3Jlc2V0KCkgZm9yIHRoaXMgaG9vay4KKwlNYW55IFNBVEEgZHJpdmVycyB1c2Ugc2F0YV9waHlfcmVzZXQoKSBvciBjYWxsIGl0IGZyb20gd2l0aGluCisJdGhlaXIgb3duIHBoeV9yZXNldCgpIGZ1bmN0aW9ucy4KIAk8L3BhcmE+CiAKIAk8L3NlY3QyPgpAQCAtMjI3LDYgKzI2NiwyNSBAQAogVGhlc2UgaG9va3MgYXJlIHR5cGljYWxseSBlaXRoZXIgbm8tb3BzLCBvciBzaW1wbHkgbm90IGltcGxlbWVudGVkLCBpbgogRklTLWJhc2VkIGRyaXZlcnMuCiAJPC9wYXJhPgorCTxwYXJhPgorTW9zdCBsZWdhY3kgSURFIGRyaXZlcnMgdXNlIGF0YV9ibWRtYV9zZXR1cCgpIGZvciB0aGUgYm1kbWFfc2V0dXAoKQoraG9vay4gIGF0YV9ibWRtYV9zZXR1cCgpIHdpbGwgd3JpdGUgdGhlIHBvaW50ZXIgdG8gdGhlIFBSRCB0YWJsZSB0bwordGhlIElERSBQUkQgVGFibGUgQWRkcmVzcyByZWdpc3RlciwgZW5hYmxlIERNQSBpbiB0aGUgRE1BIENvbW1hbmQKK3JlZ2lzdGVyLCBhbmQgY2FsbCBleGVjX2NvbW1hbmQoKSB0byBiZWdpbiB0aGUgdHJhbnNmZXIuCisJPC9wYXJhPgorCTxwYXJhPgorTW9zdCBsZWdhY3kgSURFIGRyaXZlcnMgdXNlIGF0YV9ibWRtYV9zdGFydCgpIGZvciB0aGUgYm1kbWFfc3RhcnQoKQoraG9vay4gIGF0YV9ibWRtYV9zdGFydCgpIHdpbGwgd3JpdGUgdGhlIEFUQV9ETUFfU1RBUlQgZmxhZyB0byB0aGUgRE1BCitDb21tYW5kIHJlZ2lzdGVyLgorCTwvcGFyYT4KKwk8cGFyYT4KK01hbnkgbGVnYWN5IElERSBkcml2ZXJzIHVzZSBhdGFfYm1kbWFfc3RvcCgpIGZvciB0aGUgYm1kbWFfc3RvcCgpCitob29rLiAgYXRhX2JtZG1hX3N0b3AoKSBjbGVhcnMgdGhlIEFUQV9ETUFfU1RBUlQgZmxhZyBpbiB0aGUgRE1BCitjb21tYW5kIHJlZ2lzdGVyLgorCTwvcGFyYT4KKwk8cGFyYT4KK01hbnkgbGVnYWN5IElERSBkcml2ZXJzIHVzZSBhdGFfYm1kbWFfc3RhdHVzKCkgYXMgdGhlIGJtZG1hX3N0YXR1cygpIGhvb2suCisJPC9wYXJhPgogCiAJPC9zZWN0Mj4KIApAQCAtMjUwLDYgKzMwOCwxMCBAQAogCWhlbHBlciBmdW5jdGlvbiBhdGFfcWNfaXNzdWVfcHJvdCgpIGZvciB0YXNrZmlsZSBwcm90b2NvbC1iYXNlZAogCWRpc3BhdGNoLiAgTW9yZSBhZHZhbmNlZCBkcml2ZXJzIGltcGxlbWVudCB0aGVpciBvd24gLT5xY19pc3N1ZS4KIAk8L3BhcmE+CisJPHBhcmE+CisJYXRhX3FjX2lzc3VlX3Byb3QoKSBjYWxscyAtPnRmX2xvYWQoKSwgLT5ibWRtYV9zZXR1cCgpLCBhbmQKKwktPmJtZG1hX3N0YXJ0KCkgYXMgbmVjZXNzYXJ5IHRvIGluaXRpYXRlIGEgdHJhbnNmZXIuCisJPC9wYXJhPgogCiAJPC9zZWN0Mj4KIApAQCAtMjc5LDYgKzM0MSwyMSBAQAogCWJlZm9yZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCwgdG8gYmUgc3VyZSBoYXJkd2FyZQogCWlzIHF1aWV0LgogCTwvcGFyYT4KKwk8cGFyYT4KKwlUaGUgc2Vjb25kIGFyZ3VtZW50LCBkZXZfaW5zdGFuY2UsIHNob3VsZCBiZSBjYXN0IHRvIGEgcG9pbnRlcgorCXRvIHN0cnVjdCBhdGFfaG9zdF9zZXQuCisJPC9wYXJhPgorCTxwYXJhPgorCU1vc3QgbGVnYWN5IElERSBkcml2ZXJzIHVzZSBhdGFfaW50ZXJydXB0KCkgZm9yIHRoZQorCWlycV9oYW5kbGVyIGhvb2ssIHdoaWNoIHNjYW5zIGFsbCBwb3J0cyBpbiB0aGUgaG9zdF9zZXQsCisJZGV0ZXJtaW5lcyB3aGljaCBxdWV1ZWQgY29tbWFuZCB3YXMgYWN0aXZlIChpZiBhbnkpLCBhbmQgY2FsbHMKKwlhdGFfaG9zdF9pbnRyKGFwLHFjKS4KKwk8L3BhcmE+CisJPHBhcmE+CisJTW9zdCBsZWdhY3kgSURFIGRyaXZlcnMgdXNlIGF0YV9ibWRtYV9pcnFfY2xlYXIoKSBmb3IgdGhlCisJaXJxX2NsZWFyKCkgaG9vaywgd2hpY2ggc2ltcGx5IGNsZWFycyB0aGUgaW50ZXJydXB0IGFuZCBlcnJvcgorCWZsYWdzIGluIHRoZSBETUEgc3RhdHVzIHJlZ2lzdGVyLgorCTwvcGFyYT4KIAogCTwvc2VjdDI+CiAKQEAgLTI5Miw2ICszNjksNyBAQAogCTxwYXJhPgogCVJlYWQgYW5kIHdyaXRlIHN0YW5kYXJkIFNBVEEgcGh5IHJlZ2lzdGVycy4gIEN1cnJlbnRseSBvbmx5IHVzZWQKIAlpZiAtPnBoeV9yZXNldCBob29rIGNhbGxlZCB0aGUgc2F0YV9waHlfcmVzZXQoKSBoZWxwZXIgZnVuY3Rpb24uCisJc2NfcmVnIGlzIG9uZSBvZiBTQ1JfU1RBVFVTLCBTQ1JfQ09OVFJPTCwgU0NSX0VSUk9SLCBvciBTQ1JfQUNUSVZFLgogCTwvcGFyYT4KIAogCTwvc2VjdDI+CkBAIC0zMDcsMTcgKzM4NSwyOSBAQAogCS0+cG9ydF9zdGFydCgpIGlzIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIGVhY2gKIAlwb3J0IGFyZSBpbml0aWFsaXplZC4gIFR5cGljYWxseSB0aGlzIGlzIHVzZWQgdG8gYWxsb2MgcGVyLXBvcnQKIAlETUEgYnVmZmVycyAvIHRhYmxlcyAvIHJpbmdzLCBlbmFibGUgRE1BIGVuZ2luZXMsIGFuZCBzaW1pbGFyCi0JdGFza3MuICAKKwl0YXNrcy4gIFNvbWUgZHJpdmVycyBhbHNvIHVzZSB0aGlzIGVudHJ5IHBvaW50IGFzIGEgY2hhbmNlIHRvCisJYWxsb2NhdGUgZHJpdmVyLXByaXZhdGUgbWVtb3J5IGZvciBhcC0+cHJpdmF0ZV9kYXRhLgorCTwvcGFyYT4KKwk8cGFyYT4KKwlNYW55IGRyaXZlcnMgdXNlIGF0YV9wb3J0X3N0YXJ0KCkgYXMgdGhpcyBob29rIG9yIGNhbGwKKwlpdCBmcm9tIHRoZWlyIG93biBwb3J0X3N0YXJ0KCkgaG9va3MuICBhdGFfcG9ydF9zdGFydCgpCisJYWxsb2NhdGVzIHNwYWNlIGZvciBhIGxlZ2FjeSBJREUgUFJEIHRhYmxlIGFuZCByZXR1cm5zLgogCTwvcGFyYT4KIAk8cGFyYT4KIAktPnBvcnRfc3RvcCgpIGlzIGNhbGxlZCBhZnRlciAtPmhvc3Rfc3RvcCgpLiAgSXQncyBzb2xlIGZ1bmN0aW9uCiAJaXMgdG8gcmVsZWFzZSBETUEvbWVtb3J5IHJlc291cmNlcywgbm93IHRoYXQgdGhleSBhcmUgbm8gbG9uZ2VyCi0JYWN0aXZlbHkgYmVpbmcgdXNlZC4KKwlhY3RpdmVseSBiZWluZyB1c2VkLiAgTWFueSBkcml2ZXJzIGFsc28gZnJlZSBkcml2ZXItcHJpdmF0ZQorCWRhdGEgZnJvbSBwb3J0IGF0IHRoaXMgdGltZS4KKwk8L3BhcmE+CisJPHBhcmE+CisJTWFueSBkcml2ZXJzIHVzZSBhdGFfcG9ydF9zdG9wKCkgYXMgdGhpcyBob29rLCB3aGljaCBmcmVlcyB0aGUKKwlQUkQgdGFibGUuCiAJPC9wYXJhPgogCTxwYXJhPgogCS0+aG9zdF9zdG9wKCkgaXMgY2FsbGVkIGFmdGVyIGFsbCAtPnBvcnRfc3RvcCgpIGNhbGxzCiBoYXZlIGNvbXBsZXRlZC4gIFRoZSBob29rIG11c3QgZmluYWxpemUgaGFyZHdhcmUgc2h1dGRvd24sIHJlbGVhc2UgRE1BCiBhbmQgb3RoZXIgcmVzb3VyY2VzLCBldGMuCisJVGhpcyBob29rIG1heSBiZSBzcGVjaWZpZWQgYXMgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgY2FsbGVkLgogCTwvcGFyYT4KIAogCTwvc2VjdDI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc3R5bGVzaGVldC54c2wgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svc3R5bGVzaGVldC54c2wKaW5kZXggZTE0YzIxZC4uNjRiZTlmNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3N0eWxlc2hlZXQueHNsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9zdHlsZXNoZWV0LnhzbApAQCAtMiw0ICsyLDUgQEAKIDxzdHlsZXNoZWV0IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHZlcnNpb249IjEuMCI+CiA8cGFyYW0gbmFtZT0iY2h1bmsucXVpZXRseSI+MTwvcGFyYW0+CiA8cGFyYW0gbmFtZT0iZnVuY3N5bm9wc2lzLnN0eWxlIj5hbnNpPC9wYXJhbT4KKzxwYXJhbSBuYW1lPSJmdW5jc3lub3BzaXMudGFidWxhci50aHJlc2hvbGQiPjgwPC9wYXJhbT4KIDwvc3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSVBNSS50eHQgYi9Eb2N1bWVudGF0aW9uL0lQTUkudHh0CmluZGV4IDkwZDEwZTcuLjg0ZDNkNGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vSVBNSS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9JUE1JLnR4dApAQCAtMjUsOSArMjUsMTAgQEAKIENvbmZpZ3VyYXRpb24KIC0tLS0tLS0tLS0tLS0KIAotVGhlIExpbnV4SVBNSSBkcml2ZXIgaXMgbW9kdWxhciwgd2hpY2ggbWVhbnMgeW91IGhhdmUgdG8gcGljayBzZXZlcmFsCitUaGUgTGludXggSVBNSSBkcml2ZXIgaXMgbW9kdWxhciwgd2hpY2ggbWVhbnMgeW91IGhhdmUgdG8gcGljayBzZXZlcmFsCiB0aGluZ3MgdG8gaGF2ZSBpdCB3b3JrIHJpZ2h0IGRlcGVuZGluZyBvbiB5b3VyIGhhcmR3YXJlLiAgTW9zdCBvZgotdGhlc2UgYXJlIGF2YWlsYWJsZSBpbiB0aGUgJ0NoYXJhY3RlciBEZXZpY2VzJyBtZW51LgordGhlc2UgYXJlIGF2YWlsYWJsZSBpbiB0aGUgJ0NoYXJhY3RlciBEZXZpY2VzJyBtZW51IHRoZW4gdGhlIElQTUkKK21lbnUuCiAKIE5vIG1hdHRlciB3aGF0LCB5b3UgbXVzdCBwaWNrICdJUE1JIHRvcC1sZXZlbCBtZXNzYWdlIGhhbmRsZXInIHRvIHVzZQogSVBNSS4gIFdoYXQgeW91IGRvIGJleW9uZCB0aGF0IGRlcGVuZHMgb24geW91ciBuZWVkcyBhbmQgaGFyZHdhcmUuCkBAIC0zNSwzMyArMzYsMzAgQEAKIFRoZSBtZXNzYWdlIGhhbmRsZXIgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlci1sZXZlbCBpbnRlcmZhY2VzLgogS2VybmVsIGNvZGUgKGxpa2UgdGhlIHdhdGNoZG9nKSBjYW4gc3RpbGwgdXNlIGl0LiAgSWYgeW91IG5lZWQgYWNjZXNzCiBmcm9tIHVzZXJsYW5kLCB5b3UgbmVlZCB0byBzZWxlY3QgJ0RldmljZSBpbnRlcmZhY2UgZm9yIElQTUknIGlmIHlvdQotd2FudCBhY2Nlc3MgdGhyb3VnaCBhIGRldmljZSBkcml2ZXIuICBBbm90aGVyIGludGVyZmFjZSBpcyBhbHNvCi1hdmFpbGFibGUsIHlvdSBtYXkgc2VsZWN0ICdJUE1JIHNvY2tldHMnIGluIHRoZSAnTmV0d29ya2luZyBTdXBwb3J0JwotbWFpbiBtZW51LiAgVGhpcyBwcm92aWRlcyBhIHNvY2tldCBpbnRlcmZhY2UgdG8gSVBNSS4gIFlvdSBtYXkgc2VsZWN0Ci1ib3RoIG9mIHRoZXNlIGF0IHRoZSBzYW1lIHRpbWUsIHRoZXkgd2lsbCBib3RoIHdvcmsgdG9nZXRoZXIuCit3YW50IGFjY2VzcyB0aHJvdWdoIGEgZGV2aWNlIGRyaXZlci4KIAotVGhlIGRyaXZlciBpbnRlcmZhY2UgZGVwZW5kcyBvbiB5b3VyIGhhcmR3YXJlLiAgSWYgeW91IGhhdmUgYSBib2FyZAotd2l0aCBhIHN0YW5kYXJkIGludGVyZmFjZSAoVGhlc2Ugd2lsbCBnZW5lcmFsbHkgYmUgZWl0aGVyICJLQ1MiLAotIlNNSUMiLCBvciAiQlQiLCBjb25zdWx0IHlvdXIgaGFyZHdhcmUgbWFudWFsKSwgY2hvb3NlIHRoZSAnSVBNSSBTSQotaGFuZGxlcicgb3B0aW9uLiAgQSBkcml2ZXIgYWxzbyBleGlzdHMgZm9yIGRpcmVjdCBJMkMgYWNjZXNzIHRvIHRoZQotSVBNSSBtYW5hZ2VtZW50IGNvbnRyb2xsZXIuICBTb21lIGJvYXJkcyBzdXBwb3J0IHRoaXMsIGJ1dCBpdCBpcwotdW5rbm93biBpZiBpdCB3aWxsIHdvcmsgb24gZXZlcnkgYm9hcmQuICBGb3IgdGhpcywgY2hvb3NlICdJUE1JIFNNQnVzCi1oYW5kbGVyJywgYnV0IGJlIHJlYWR5IHRvIHRyeSB0byBkbyBzb21lIGZpZ3VyaW5nIHRvIHNlZSBpZiBpdCB3aWxsCi13b3JrLgotCi1UaGVyZSBpcyBhbHNvIGEgS0NTLW9ubHkgZHJpdmVyIGludGVyZmFjZSBzdXBwbGllZCwgYnV0IGl0IGlzCi1kZXByYWNhdGVkIGluIGZhdm9yIG9mIHRoZSBTSSBpbnRlcmZhY2UuCitUaGUgZHJpdmVyIGludGVyZmFjZSBkZXBlbmRzIG9uIHlvdXIgaGFyZHdhcmUuICBJZiB5b3VyIHN5c3RlbQorcHJvcGVybHkgcHJvdmlkZXMgdGhlIFNNQklPUyBpbmZvIGZvciBJUE1JLCB0aGUgZHJpdmVyIHdpbGwgZGV0ZWN0IGl0CithbmQganVzdCB3b3JrLiAgSWYgeW91IGhhdmUgYSBib2FyZCB3aXRoIGEgc3RhbmRhcmQgaW50ZXJmYWNlIChUaGVzZQord2lsbCBnZW5lcmFsbHkgYmUgZWl0aGVyICJLQ1MiLCAiU01JQyIsIG9yICJCVCIsIGNvbnN1bHQgeW91ciBoYXJkd2FyZQorbWFudWFsKSwgY2hvb3NlIHRoZSAnSVBNSSBTSSBoYW5kbGVyJyBvcHRpb24uICBBIGRyaXZlciBhbHNvIGV4aXN0cworZm9yIGRpcmVjdCBJMkMgYWNjZXNzIHRvIHRoZSBJUE1JIG1hbmFnZW1lbnQgY29udHJvbGxlci4gIFNvbWUgYm9hcmRzCitzdXBwb3J0IHRoaXMsIGJ1dCBpdCBpcyB1bmtub3duIGlmIGl0IHdpbGwgd29yayBvbiBldmVyeSBib2FyZC4gIEZvcgordGhpcywgY2hvb3NlICdJUE1JIFNNQnVzIGhhbmRsZXInLCBidXQgYmUgcmVhZHkgdG8gdHJ5IHRvIGRvIHNvbWUKK2ZpZ3VyaW5nIHRvIHNlZSBpZiBpdCB3aWxsIHdvcmsgb24geW91ciBzeXN0ZW0gaWYgdGhlIFNNQklPUy9BUENJCitpbmZvcm1hdGlvbiBpcyB3cm9uZyBvciBub3QgcHJlc2VudC4gIEl0IGlzIGZhaXJseSBzYWZlIHRvIGhhdmUgYm90aAordGhlc2UgZW5hYmxlZCBhbmQgbGV0IHRoZSBkcml2ZXJzIGF1dG8tZGV0ZWN0IHdoYXQgaXMgcHJlc2VudC4KIAogWW91IHNob3VsZCBnZW5lcmFsbHkgZW5hYmxlIEFDUEkgb24geW91ciBzeXN0ZW0sIGFzIHN5c3RlbXMgd2l0aCBJUE1JCi1zaG91bGQgaGF2ZSBBQ1BJIHRhYmxlcyBkZXNjcmliaW5nIHRoZW0uCitjYW4gaGF2ZSBBQ1BJIHRhYmxlcyBkZXNjcmliaW5nIHRoZW0uCiAKIElmIHlvdSBoYXZlIGEgc3RhbmRhcmQgaW50ZXJmYWNlIGFuZCB0aGUgYm9hcmQgbWFudWZhY3R1cmVyIGhhcyBkb25lCiB0aGVpciBqb2IgY29ycmVjdGx5LCB0aGUgSVBNSSBjb250cm9sbGVyIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5Ci1kZXRlY3QgKHZpYSBBQ1BJIG9yIFNNQklPUyB0YWJsZXMpIGFuZCBzaG91bGQganVzdCB3b3JrLiAgU2FkbHksIG1hbnkKLWJvYXJkcyBkbyBub3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIGRyaXZlciBhdHRlbXB0cyBzdGFuZGFyZAotZGVmYXVsdHMsIGJ1dCB0aGV5IG1heSBub3Qgd29yay4gIElmIHlvdSBmYWxsIGludG8gdGhpcyBzaXR1YXRpb24sIHlvdQotbmVlZCB0byByZWFkIHRoZSBzZWN0aW9uIGJlbG93IG5hbWVkICdUaGUgU0kgRHJpdmVyJyBvbiBob3cgdG8KLWhhbmQtY29uZmlndXJlIHlvdXIgc3lzdGVtLgorZGV0ZWN0ZWQgKHZpYSBBQ1BJIG9yIFNNQklPUyB0YWJsZXMpIGFuZCBzaG91bGQganVzdCB3b3JrLiAgU2FkbHksCittYW55IGJvYXJkcyBkbyBub3QgaGF2ZSB0aGlzIGluZm9ybWF0aW9uLiAgVGhlIGRyaXZlciBhdHRlbXB0cworc3RhbmRhcmQgZGVmYXVsdHMsIGJ1dCB0aGV5IG1heSBub3Qgd29yay4gIElmIHlvdSBmYWxsIGludG8gdGhpcworc2l0dWF0aW9uLCB5b3UgbmVlZCB0byByZWFkIHRoZSBzZWN0aW9uIGJlbG93IG5hbWVkICdUaGUgU0kgRHJpdmVyJyBvcgorIlRoZSBTTUJ1cyBEcml2ZXIiIG9uIGhvdyB0byBoYW5kLWNvbmZpZ3VyZSB5b3VyIHN5c3RlbS4KIAogSVBNSSBkZWZpbmVzIGEgc3RhbmRhcmQgd2F0Y2hkb2cgdGltZXIuICBZb3UgY2FuIGVuYWJsZSB0aGlzIHdpdGggdGhlCiAnSVBNSSBXYXRjaGRvZyBUaW1lcicgY29uZmlnIG9wdGlvbi4gIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50bwpAQCAtNzMsNiArNzEsMTggQEAKIENhcmRzJyBtZW51LCBlbmFibGUgJ1dhdGNoZG9nIFRpbWVyIFN1cHBvcnQnLCBhbmQgZW5hYmxlIHRoZSBvcHRpb24KICdEaXNhYmxlIHdhdGNoZG9nIHNodXRkb3duIG9uIGNsb3NlJy4KIAorSVBNSSBzeXN0ZW1zIGNhbiBvZnRlbiBiZSBwb3dlcmVkIG9mZiB1c2luZyBJUE1JIGNvbW1hbmRzLiAgU2VsZWN0CisnSVBNSSBQb3dlcm9mZicgdG8gZG8gdGhpcy4gIFRoZSBkcml2ZXIgd2lsbCBhdXRvLWRldGVjdCBpZiB0aGUgc3lzdGVtCitjYW4gYmUgcG93ZXJlZCBvZmYgYnkgSVBNSS4gIEl0IGlzIHNhZmUgdG8gZW5hYmxlIHRoaXMgZXZlbiBpZiB5b3VyCitzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHRoaXMgb3B0aW9uLiAgVGhpcyB3b3JrcyBvbiBBVENBIHN5c3RlbXMsIHRoZQorUmFkaXN5cyBDUEkxIGNhcmQsIGFuZCBhbnkgSVBNSSBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBzdGFuZGFyZCBjaGFzc2lzCittYW5hZ2VtZW50IGNvbW1hbmRzLgorCitJZiB5b3Ugd2FudCB0aGUgZHJpdmVyIHRvIHB1dCBhbiBldmVudCBpbnRvIHRoZSBldmVudCBsb2cgb24gYSBwYW5pYywKK2VuYWJsZSB0aGUgJ0dlbmVyYXRlIGEgcGFuaWMgZXZlbnQgdG8gYWxsIEJNQ3Mgb24gYSBwYW5pYycgb3B0aW9uLiAgSWYKK3lvdSB3YW50IHRoZSB3aG9sZSBwYW5pYyBzdHJpbmcgcHV0IGludG8gdGhlIGV2ZW50IGxvZyB1c2luZyBPRU0KK2V2ZW50cywgZW5hYmxlIHRoZSAnR2VuZXJhdGUgT0VNIGV2ZW50cyBjb250YWluaW5nIHRoZSBwYW5pYyBzdHJpbmcnCitvcHRpb24uCiAKIEJhc2ljIERlc2lnbgogLS0tLS0tLS0tLS0tCkBAIC04MCw3ICs5MCw3IEBACiBUaGUgTGludXggSVBNSSBkcml2ZXIgaXMgZGVzaWduZWQgdG8gYmUgdmVyeSBtb2R1bGFyIGFuZCBmbGV4aWJsZSwgeW91CiBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgcGllY2VzIHlvdSBuZWVkIGFuZCB5b3UgY2FuIHVzZSBpdCBpbiBtYW55CiBkaWZmZXJlbnQgd2F5cy4gIEJlY2F1c2Ugb2YgdGhhdCwgaXQncyBicm9rZW4gaW50byBtYW55IGNodW5rcyBvZgotY29kZS4gIFRoZXNlIGNodW5rcyBhcmU6Citjb2RlLiAgVGhlc2UgY2h1bmtzIChieSBtb2R1bGUgbmFtZSkgYXJlOgogCiBpcG1pX21zZ2hhbmRsZXIgLSBUaGlzIGlzIHRoZSBjZW50cmFsIHBpZWNlIG9mIHNvZnR3YXJlIGZvciB0aGUgSVBNSQogc3lzdGVtLiAgSXQgaGFuZGxlcyBhbGwgbWVzc2FnZXMsIG1lc3NhZ2UgdGltaW5nLCBhbmQgcmVzcG9uc2VzLiAgVGhlCkBAIC05MywxOCArMTAzLDI2IEBACiBkcml2ZXIsIGVhY2ggb3BlbiBmaWxlIGZvciB0aGlzIGRldmljZSB0aWVzIGluIHRvIHRoZSBtZXNzYWdlIGhhbmRsZXIKIGFzIGFuIElQTUkgdXNlci4KIAotaXBtaV9zaSAtIEEgZHJpdmVyIGZvciB2YXJpb3VzIHN5c3RlbSBpbnRlcmZhY2VzLiAgVGhpcyBzdXBwb3J0cwotS0NTLCBTTUlDLCBhbmQgbWF5IHN1cHBvcnQgQlQgaW4gdGhlIGZ1dHVyZS4gIFVubGVzcyB5b3UgaGF2ZSB5b3VyIG93bgotY3VzdG9tIGludGVyZmFjZSwgeW91IHByb2JhYmx5IG5lZWQgdG8gdXNlIHRoaXMuCitpcG1pX3NpIC0gQSBkcml2ZXIgZm9yIHZhcmlvdXMgc3lzdGVtIGludGVyZmFjZXMuICBUaGlzIHN1cHBvcnRzIEtDUywKK1NNSUMsIGFuZCBCVCBpbnRlcmZhY2VzLiAgVW5sZXNzIHlvdSBoYXZlIGFuIFNNQnVzIGludGVyZmFjZSBvciB5b3VyCitvd24gY3VzdG9tIGludGVyZmFjZSwgeW91IHByb2JhYmx5IG5lZWQgdG8gdXNlIHRoaXMuCiAKIGlwbWlfc21iIC0gQSBkcml2ZXIgZm9yIGFjY2Vzc2luZyBCTUNzIG9uIHRoZSBTTUJ1cy4gSXQgdXNlcyB0aGUKIEkyQyBrZXJuZWwgZHJpdmVyJ3MgU01CdXMgaW50ZXJmYWNlcyB0byBzZW5kIGFuZCByZWNlaXZlIElQTUkgbWVzc2FnZXMKIG92ZXIgdGhlIFNNQnVzLgogCi1hZl9pcG1pIC0gQSBuZXR3b3JrIHNvY2tldCBpbnRlcmZhY2UgdG8gSVBNSS4gIFRoaXMgZG9lc24ndCB0YWtlIHVwCi1hIGNoYXJhY3RlciBkZXZpY2UgaW4geW91ciBzeXN0ZW0uCitpcG1pX3dhdGNoZG9nIC0gSVBNSSByZXF1aXJlcyBzeXN0ZW1zIHRvIGhhdmUgYSB2ZXJ5IGNhcGFibGUgd2F0Y2hkb2cKK3RpbWVyLiAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgTGludXggd2F0Y2hkb2cgdGltZXIKK2ludGVyZmFjZSBvbiB0b3Agb2YgdGhlIElQTUkgbWVzc2FnZSBoYW5kbGVyLgogCi1Ob3RlIHRoYXQgdGhlIEtDUy1vbmx5IGludGVyZmFjZSBhaHMgYmVlbiByZW1vdmVkLgoraXBtaV9wb3dlcm9mZiAtIFNvbWUgc3lzdGVtcyBzdXBwb3J0IHRoZSBhYmlsaXR5IHRvIGJlIHR1cm5lZCBvZmYgdmlhCitJUE1JIGNvbW1hbmRzLgorCitUaGVzZSBhcmUgYWxsIGluZGl2aWR1YWxseSBzZWxlY3RhYmxlIHZpYSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCisKK05vdGUgdGhhdCB0aGUgS0NTLW9ubHkgaW50ZXJmYWNlIGhhcyBiZWVuIHJlbW92ZWQuICBUaGUgYWZfaXBtaSBkcml2ZXIKK2lzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYW5kIGhhcyBiZWVuIHJlbW92ZWQgYmVjYXVzZSBpdCB3YXMgaW1wb3NzaWJsZQordG8gZG8gMzIgYml0IGVtdWxhdGlvbiBvbiA2NC1iaXQga2VybmVscyB3aXRoIGl0LgogCiBNdWNoIGRvY3VtZW50YXRpb24gZm9yIHRoZSBpbnRlcmZhY2UgaXMgaW4gdGhlIGluY2x1ZGUgZmlsZXMuICBUaGUKIElQTUkgaW5jbHVkZSBmaWxlcyBhcmU6CkBAIC00MjQsNyArNDQyLDcgQEAKICAgbW9kcHJvYmUgaXBtaV9zbWIubwogCWFkZHI9PGFkYXB0ZXIxPiw8aTJjYWRkcjE+Wyw8YWRhcHRlcjI+LDxpMmNhZGRyMj5bLC4uLl1dCiAJZGJnPTxmbGFnczE+LDxmbGFnczI+Li4uCi0JW2RlZmF1bHRwcm9iZT0wXSBbZGJnX3Byb2JlPTFdCisJW2RlZmF1bHRwcm9iZT0xXSBbZGJnX3Byb2JlPTFdCiAKIFRoZSBhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBpbiBwYWlycywgdGhlIGZpcnN0IGlzIHRoZSBhZGFwdGVyIElEIGFuZCB0aGUKIHNlY29uZCBpcyB0aGUgSTJDIGFkZHJlc3Mgb24gdGhhdCBhZGFwdGVyLgpAQCAtNTMyLDMgKzU1MCw2NyBAQAogZGV2aWNlIHRvIGNsb3NlIGl0LCBvciB0aGUgdGltZXIgd2lsbCBub3Qgc3RvcC4gIFRoaXMgaXMgYSBuZXcgc2VtYW50aWMKIGZvciB0aGUgZHJpdmVyLCBidXQgbWFrZXMgaXQgY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB3YXRjaGRvZwogZHJpdmVycyBpbiBMaW51eC4KKworCitQYW5pYyBUaW1lb3V0cworLS0tLS0tLS0tLS0tLS0KKworVGhlIE9wZW5JUE1JIGRyaXZlciBzdXBwb3J0cyB0aGUgYWJpbGl0eSB0byBwdXQgc2VtaS1jdXN0b20gYW5kIGN1c3RvbQorZXZlbnRzIGluIHRoZSBzeXN0ZW0gZXZlbnQgbG9nIGlmIGEgcGFuaWMgb2NjdXJzLiAgaWYgeW91IGVuYWJsZSB0aGUKKydHZW5lcmF0ZSBhIHBhbmljIGV2ZW50IHRvIGFsbCBCTUNzIG9uIGEgcGFuaWMnIG9wdGlvbiwgeW91IHdpbGwgZ2V0CitvbmUgZXZlbnQgb24gYSBwYW5pYyBpbiBhIHN0YW5kYXJkIElQTUkgZXZlbnQgZm9ybWF0LiAgSWYgeW91IGVuYWJsZQordGhlICdHZW5lcmF0ZSBPRU0gZXZlbnRzIGNvbnRhaW5pbmcgdGhlIHBhbmljIHN0cmluZycgb3B0aW9uLCB5b3Ugd2lsbAorYWxzbyBnZXQgYSBidW5jaCBvZiBPRU0gZXZlbnRzIGhvbGRpbmcgdGhlIHBhbmljIHN0cmluZy4KKworCitUaGUgZmllbGQgc2V0dGluZ3Mgb2YgdGhlIGV2ZW50cyBhcmU6CisqIEdlbmVyYXRvciBJRDogMHgyMSAoa2VybmVsKQorKiBFdk0gUmV2OiAweDAzICh0aGlzIGV2ZW50IGlzIGZvcm1hdHRpbmcgaW4gSVBNSSAxLjAgZm9ybWF0KQorKiBTZW5zb3IgVHlwZTogMHgyMCAoT1MgY3JpdGljYWwgc3RvcCBzZW5zb3IpCisqIFNlbnNvciAjOiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgcGFuaWMgc3RyaW5nICgwIGlmIG5vIHBhbmljIHN0cmluZykKKyogRXZlbnQgRGlyIHwgRXZlbnQgVHlwZTogMHg2ZiAoQXNzZXJ0aW9uLCBzZW5zb3Itc3BlY2lmaWMgZXZlbnQgaW5mbykKKyogRXZlbnQgRGF0YSAxOiAweGExIChSdW50aW1lIHN0b3AgaW4gT0VNIGJ5dGVzIDIgYW5kIDMpCisqIEV2ZW50IGRhdGEgMjogc2Vjb25kIGJ5dGUgb2YgcGFuaWMgc3RyaW5nCisqIEV2ZW50IGRhdGEgMzogdGhpcmQgYnl0ZSBvZiBwYW5pYyBzdHJpbmcKK1NlZSB0aGUgSVBNSSBzcGVjIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgZXZlbnQgbGF5b3V0LiAgVGhpcyBldmVudCBpcworYWx3YXlzIHNlbnQgdG8gdGhlIGxvY2FsIG1hbmFnZW1lbnQgY29udHJvbGxlci4gIEl0IHdpbGwgaGFuZGxlIHJvdXRpbmcKK3RoZSBtZXNzYWdlIHRvIHRoZSByaWdodCBwbGFjZQorCitPdGhlciBPRU0gZXZlbnRzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CitSZWNvcmQgSUQgKGJ5dGVzIDAtMSk6IFNldCBieSB0aGUgU0VMLgorUmVjb3JkIHR5cGUgKGJ5dGUgMik6IDB4ZjAgKE9FTSBub24tdGltZXN0YW1wZWQpCitieXRlIDM6IFRoZSBzbGF2ZSBhZGRyZXNzIG9mIHRoZSBjYXJkIHNhdmluZyB0aGUgcGFuaWMKK2J5dGUgNDogQSBzZXF1ZW5jZSBudW1iZXIgKHN0YXJ0aW5nIGF0IHplcm8pCitUaGUgcmVzdCBvZiB0aGUgYnl0ZXMgKDExIGJ5dGVzKSBhcmUgdGhlIHBhbmljIHN0cmluZy4gIElmIHRoZSBwYW5pYyBzdHJpbmcKK2lzIGxvbmdlciB0aGFuIDExIGJ5dGVzLCBtdWx0aXBsZSBtZXNzYWdlcyB3aWxsIGJlIHNlbnQgd2l0aCBpbmNyZWFzaW5nCitzZXF1ZW5jZSBudW1iZXJzLgorCitCZWNhdXNlIHlvdSBjYW5ub3Qgc2VuZCBPRU0gZXZlbnRzIHVzaW5nIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UsIHRoaXMKK2Z1bmN0aW9uIHdpbGwgYXR0ZW1wdCB0byBmaW5kIGFuIFNFTCBhbmQgYWRkIHRoZSBldmVudHMgdGhlcmUuICBJdAord2lsbCBmaXJzdCBxdWVyeSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBsb2NhbCBtYW5hZ2VtZW50IGNvbnRyb2xsZXIuCitJZiBpdCBoYXMgYW4gU0VMLCB0aGVuIHRoZXkgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIFNFTCBvZiB0aGUgbG9jYWwKK21hbmFnZW1lbnQgY29udHJvbGxlci4gIElmIG5vdCwgYW5kIHRoZSBsb2NhbCBtYW5hZ2VtZW50IGNvbnRyb2xsZXIgaXMKK2FuIGV2ZW50IGdlbmVyYXRvciwgdGhlIGV2ZW50IHJlY2VpdmVyIGZyb20gdGhlIGxvY2FsIG1hbmFnZW1lbnQKK2NvbnRyb2xsZXIgd2lsbCBiZSBxdWVyaWVkIGFuZCB0aGUgZXZlbnRzIHNlbnQgdG8gdGhlIFNFTCBvbiB0aGF0CitkZXZpY2UuICBPdGhlcndpc2UsIHRoZSBldmVudHMgZ28gbm93aGVyZSBzaW5jZSB0aGVyZSBpcyBub3doZXJlIHRvCitzZW5kIHRoZW0uCisKKworUG93ZXJvZmYKKy0tLS0tLS0tCisKK0lmIHRoZSBwb3dlcm9mZiBjYXBhYmlsaXR5IGlzIHNlbGVjdGVkLCB0aGUgSVBNSSBkcml2ZXIgd2lsbCBpbnN0YWxsCithIHNodXRkb3duIGZ1bmN0aW9uIGludG8gdGhlIHN0YW5kYXJkIHBvd2Vyb2ZmIGZ1bmN0aW9uIHBvaW50ZXIuICBUaGlzCitpcyBpbiB0aGUgaXBtaV9wb3dlcm9mZiBtb2R1bGUuICBXaGVuIHRoZSBzeXN0ZW0gcmVxdWVzdHMgYSBwb3dlcmRvd24sCitpdCB3aWxsIHNlbmQgdGhlIHByb3BlciBJUE1JIGNvbW1hbmRzIHRvIGRvIHRoaXMuICBUaGlzIGlzIHN1cHBvcnRlZCBvbgorc2V2ZXJhbCBwbGF0Zm9ybXMuCisKK1RoZXJlIGlzIGEgbW9kdWxlIHBhcmFtZXRlciBuYW1lZCAicG93ZXJvZmZfY29udHJvbCIgdGhhdCBtYXkgZWl0aGVyIGJlIHplcm8KKyhkbyBhIHBvd2VyIGRvd24pIG9yIDIgKGRvIGEgcG93ZXIgY3ljbGUsIHBvd2VyIHRoZSBzeXN0ZW0gb2ZmLCB0aGVuIHBvd2VyCitpdCBvbiBpbiBhIGZldyBzZWNvbmRzKS4gIFNldHRpbmcgaXBtaV9wb3dlcm9mZi5wb3dlcm9mZl9jb250cm9sPXggd2lsbCBkbwordGhlIHNhbWUgdGhpbmcgb24gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuICBUaGUgcGFyYW1ldGVyIGlzIGFsc28gYXZhaWxhYmxlCit2aWEgdGhlIHByb2MgZmlsZXN5c3RlbSBpbiAvcHJvYy9pcG1pL3Bvd2Vyb2ZmX2NvbnRyb2wuICBOb3RlIHRoYXQgaWYgdGhlCitzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBwb3dlciBjeWNsaW5nLCBpdCB3aWxsIGFsd2F5cyB0byB0aGUgcG93ZXIgb2ZmLgorCitOb3RlIHRoYXQgaWYgeW91IGhhdmUgQUNQSSBlbmFibGVkLCB0aGUgc3lzdGVtIHdpbGwgcHJlZmVyIHVzaW5nIEFDUEkgdG8KK3Bvd2VyIG9mZi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCmluZGV4IGRlM2IyNTIuLmMzY2NhOTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycwpAQCAtMTMsMTMgKzEzLDE0IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIE1ham9yIGFuZCBtaW5vciBudW1iZXJzIGZvciBibG9jayBhbmQgY2hhcmFjdGVyIGRldmljZXMgYXJlIGFsbG9jYXRlZAotYnkgdGhlIExpbnV4IGFzc2lnbmVkIG5hbWUgYW5kIG51bWJlciBhdXRob3JpdHkgKGN1cnJlbnRseSBiZXR0ZXIKLWtub3duIGFzIEggUGV0ZXIgQW52aW4pLiBUaGUgc2l0ZSBpcyBodHRwOi8vd3d3LmxhbmFuYS5vcmcvLiBUaGlzCitieSB0aGUgTGludXggYXNzaWduZWQgbmFtZSBhbmQgbnVtYmVyIGF1dGhvcml0eSAoY3VycmVudGx5IHRoaXMgaXMKK1RvcmJlbiBNYXRoaWFzZW4pLiBUaGUgc2l0ZSBpcyBodHRwOi8vd3d3LmxhbmFuYS5vcmcvLiBUaGlzCiBhbHNvIGRlYWxzIHdpdGggYWxsb2NhdGluZyBudW1iZXJzIGZvciBkZXZpY2VzIHRoYXQgYXJlIG5vdCBnb2luZyB0bwogYmUgc3VibWl0dGVkIHRvIHRoZSBtYWluc3RyZWFtIGtlcm5lbC4KK1NlZSBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMuCiAKLUlmIHlvdSBkb24ndCB1c2UgYXNzaWduZWQgbnVtYmVycyB0aGVuIHdoZW4geW91IGRldmljZSBpcyBzdWJtaXR0ZWQgaXQgd2lsbAotZ2V0IGdpdmVuIGFuIGFzc2lnbmVkIG51bWJlciBldmVuIGlmIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdmFsdWVzIHlvdSBtYXkKK0lmIHlvdSBkb24ndCB1c2UgYXNzaWduZWQgbnVtYmVycyB0aGVuIHdoZW4geW91ciBkZXZpY2UgaXMgc3VibWl0dGVkIGl0IHdpbGwKK2JlIGdpdmVuIGFuIGFzc2lnbmVkIG51bWJlciBldmVuIGlmIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdmFsdWVzIHlvdSBtYXkKIGhhdmUgc2hpcHBlZCB0byBjdXN0b21lcnMgYmVmb3JlLgogCiBXaG8gVG8gU3VibWl0IERyaXZlcnMgVG8KQEAgLTMyLDcgKzMzLDggQEAKIAlJZiB0aGUgY29kZSBhcmVhIGhhcyBhIGdlbmVyYWwgbWFpbnRhaW5lciB0aGVuIHBsZWFzZSBzdWJtaXQgaXQgdG8KIAl0aGUgbWFpbnRhaW5lciBsaXN0ZWQgaW4gTUFJTlRBSU5FUlMgaW4gdGhlIGtlcm5lbCBmaWxlLiBJZiB0aGUKIAltYWludGFpbmVyIGRvZXMgbm90IHJlc3BvbmQgb3IgeW91IGNhbm5vdCBmaW5kIHRoZSBhcHByb3ByaWF0ZQotCW1haW50YWluZXIgdGhlbiBwbGVhc2UgY29udGFjdCBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPgorCW1haW50YWluZXIgdGhlbiBwbGVhc2UgY29udGFjdCB0aGUgMi4yIGtlcm5lbCBtYWludGFpbmVyOgorCU1hcmMtQ2hyaXN0aWFuIFBldGVyc2VuIDxtLmMucEB3b2xrLXByb2plY3QuZGU+LgogCiBMaW51eCAyLjQ6CiAJVGhlIHNhbWUgcnVsZXMgYXBwbHkgYXMgMi4yLiBUaGUgZmluYWwgY29udGFjdCBwb2ludCBmb3IgTGludXggMi40CkBAIC00OCw3ICs1MCw3IEBACiAKIExpY2Vuc2luZzoJVGhlIGNvZGUgbXVzdCBiZSByZWxlYXNlZCB0byB1cyB1bmRlciB0aGUKIAkJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFdlIGRvbid0IGluc2lzdCBvbiBhbnkga2luZAotCQlvZiBleGNsdXNpdmVseSBHUEwgbGljZW5zaW5nLCBhbmQgaWYgeW91IHdpc2ggdGhlIGRyaXZlcgorCQlvZiBleGNsdXNpdmUgR1BMIGxpY2Vuc2luZywgYW5kIGlmIHlvdSB3aXNoIHRoZSBkcml2ZXIKIAkJdG8gYmUgdXNlZnVsIHRvIG90aGVyIGNvbW11bml0aWVzIHN1Y2ggYXMgQlNEIHlvdSBtYXkgd2VsbAogCQl3aXNoIHRvIHJlbGVhc2UgdW5kZXIgbXVsdGlwbGUgbGljZW5zZXMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCmluZGV4IDRkMzU1NjIuLjY3NjFhN2IgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwpAQCAtMzUsNyArMzUsNyBAQAogCiBUbyBjcmVhdGUgYSBwYXRjaCBmb3IgYSBzaW5nbGUgZmlsZSwgaXQgaXMgb2Z0ZW4gc3VmZmljaWVudCB0byBkbzoKIAotCVNSQ1RSRUU9IGxpbnV4LTIuNAorCVNSQ1RSRUU9IGxpbnV4LTIuNgogCU1ZRklMRT0gIGRyaXZlcnMvbmV0L215ZHJpdmVyLmMKIAogCWNkICRTUkNUUkVFCkBAIC00OCwxNyArNDgsMTggQEAKIG9yIHVubW9kaWZpZWQga2VybmVsIHNvdXJjZSB0cmVlLCBhbmQgZ2VuZXJhdGUgYSBkaWZmIGFnYWluc3QgeW91cgogb3duIHNvdXJjZSB0cmVlLiAgRm9yIGV4YW1wbGU6CiAKLQlNWVNSQz0gL2RldmVsL2xpbnV4LTIuNAorCU1ZU1JDPSAvZGV2ZWwvbGludXgtMi42CiAKLQl0YXIgeHZmeiBsaW51eC0yLjQuMC10ZXN0MTEudGFyLmd6Ci0JbXYgbGludXggbGludXgtdmFuaWxsYQotCXdnZXQgaHR0cDovL3d3dy5tb3Nlcy51a2xpbnV4Lm5ldC9wYXRjaGVzL2RvbnRkaWZmCi0JZGlmZiAtdXByTiAtWCBkb250ZGlmZiBsaW51eC12YW5pbGxhICRNWVNSQyA+IC90bXAvcGF0Y2gKLQlybSAtZiBkb250ZGlmZgorCXRhciB4dmZ6IGxpbnV4LTIuNi4xMi50YXIuZ3oKKwltdiBsaW51eC0yLjYuMTIgbGludXgtMi42LjEyLXZhbmlsbGEKKwlkaWZmIC11cHJOIC1YIGxpbnV4LTIuNi4xMi12YW5pbGxhL0RvY3VtZW50YXRpb24vZG9udGRpZmYgXAorCQlsaW51eC0yLjYuMTItdmFuaWxsYSAkTVlTUkMgPiAvdG1wL3BhdGNoCiAKICJkb250ZGlmZiIgaXMgYSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBkdXJpbmcKIHRoZSBidWlsZCBwcm9jZXNzLCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gYW55IGRpZmYoMSktZ2VuZXJhdGVkCi1wYXRjaC4gIGRvbnRkaWZmIGlzIG1haW50YWluZWQgYnkgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CitwYXRjaC4gIFRoZSAiZG9udGRpZmYiIGZpbGUgaXMgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCB0cmVlIGluCisyLjYuMTIgYW5kIGxhdGVyLiAgRm9yIGVhcmxpZXIga2VybmVsIHZlcnNpb25zLCB5b3UgY2FuIGdldCBpdAorZnJvbSA8aHR0cDovL3d3dy54ZW5vdGltZS5uZXQvbGludXgvZG9jL2RvbnRkaWZmPi4KIAogTWFrZSBzdXJlIHlvdXIgcGF0Y2ggZG9lcyBub3QgaW5jbHVkZSBhbnkgZXh0cmEgZmlsZXMgd2hpY2ggZG8gbm90CiBiZWxvbmcgaW4gYSBwYXRjaCBzdWJtaXNzaW9uLiAgTWFrZSBzdXJlIHRvIHJldmlldyB5b3VyIHBhdGNoIC1hZnRlci0KQEAgLTY2LDE4ICs2NywyMCBAQAogCiBJZiB5b3VyIGNoYW5nZXMgcHJvZHVjZSBhIGxvdCBvZiBkZWx0YXMsIHlvdSBtYXkgd2FudCB0byBsb29rIGludG8KIHNwbGl0dGluZyB0aGVtIGludG8gaW5kaXZpZHVhbCBwYXRjaGVzIHdoaWNoIG1vZGlmeSB0aGluZ3MgaW4KLWxvZ2ljYWwgc3RhZ2VzLCB0aGlzIHdpbGwgZmFjaWxpdGF0ZSBlYXNpZXIgcmV2aWV3aW5nIGJ5IG90aGVyCitsb2dpY2FsIHN0YWdlcy4gIFRoaXMgd2lsbCBmYWNpbGl0YXRlIGVhc2llciByZXZpZXdpbmcgYnkgb3RoZXIKIGtlcm5lbCBkZXZlbG9wZXJzLCB2ZXJ5IGltcG9ydGFudCBpZiB5b3Ugd2FudCB5b3VyIHBhdGNoIGFjY2VwdGVkLgotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHNjcmlwdHMgd2hpY2ggY2FuIGFpZCBpbiB0aGlzOworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHNjcmlwdHMgd2hpY2ggY2FuIGFpZCBpbiB0aGlzOgogCiBRdWlsdDoKIGh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0CiAKIFJhbmR5IER1bmxhcCdzIHBhdGNoIHNjcmlwdHM6Ci1odHRwOi8vZGV2ZWxvcGVyLm9zZGwub3JnL3JkZHVubGFwL3NjcmlwdHMvcGF0Y2hpbmctc2NyaXB0cy50Z3oKK2h0dHA6Ly93d3cueGVub3RpbWUubmV0L2xpbnV4L3NjcmlwdHMvcGF0Y2hpbmctc2NyaXB0cy0wMDIudGFyLmd6CiAKIEFuZHJldyBNb3J0b24ncyBwYXRjaCBzY3JpcHRzOgotaHR0cDovL3d3dy56aXAuY29tLmF1L35ha3BtL2xpbnV4L3BhdGNoZXMvcGF0Y2gtc2NyaXB0cy0wLjE2CitodHRwOi8vd3d3LnppcC5jb20uYXUvfmFrcG0vbGludXgvcGF0Y2hlcy9wYXRjaC1zY3JpcHRzLTAuMjAKKworCiAKIDIpIERlc2NyaWJlIHlvdXIgY2hhbmdlcy4KIApAQCAtMTMyLDIxICsxMzUsNiBAQAogdXN1YWxseSBiZSBzZW50IGZpcnN0IHRvIGxpbnV4LWtlcm5lbC4gIE9ubHkgYWZ0ZXIgdGhlIHBhdGNoIGlzCiBkaXNjdXNzZWQgc2hvdWxkIHRoZSBwYXRjaCB0aGVuIGJlIHN1Ym1pdHRlZCB0byBMaW51cy4KIAotRm9yIHNtYWxsIHBhdGNoZXMgeW91IG1heSB3YW50IHRvIENDIHRoZSBUcml2aWFsIFBhdGNoIE1vbmtleQotdHJpdmlhbEBydXN0Y29ycC5jb20uYXUgc2V0IHVwIGJ5IFJ1c3R5IFJ1c3NlbGw7IHdoaWNoIGNvbGxlY3RzICJ0cml2aWFsIgotcGF0Y2hlcy4gVHJpdmlhbCBwYXRjaGVzIG11c3QgcXVhbGlmeSBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gU3BlbGxpbmcgZml4ZXMgaW4gZG9jdW1lbnRhdGlvbgotIFNwZWxsaW5nIGZpeGVzIHdoaWNoIGNvdWxkIGJyZWFrIGdyZXAoMSkuCi0gV2FybmluZyBmaXhlcyAoY2x1dHRlcmluZyB3aXRoIHVzZWxlc3Mgd2FybmluZ3MgaXMgYmFkKQotIENvbXBpbGF0aW9uIGZpeGVzIChvbmx5IGlmIHRoZXkgYXJlIGFjdHVhbGx5IGNvcnJlY3QpCi0gUnVudGltZSBmaXhlcyAob25seSBpZiB0aGV5IGFjdHVhbGx5IGZpeCB0aGluZ3MpCi0gUmVtb3ZpbmcgdXNlIG9mIGRlcHJlY2F0ZWQgZnVuY3Rpb25zL21hY3JvcyAoZWcuIGNoZWNrX3JlZ2lvbikuCi0gQ29udGFjdCBkZXRhaWwgYW5kIGRvY3VtZW50YXRpb24gZml4ZXMKLSBOb24tcG9ydGFibGUgY29kZSByZXBsYWNlZCBieSBwb3J0YWJsZSBjb2RlIChldmVuIGluIGFyY2gtc3BlY2lmaWMsCi0gc2luY2UgcGVvcGxlIGNvcHksIGFzIGxvbmcgYXMgaXQncyB0cml2aWFsKQotIEFueSBmaXggYnkgdGhlIGF1dGhvci9tYWludGFpbmVyIG9mIHRoZSBmaWxlLiAoaWUuIHBhdGNoIG1vbmtleQotIGluIHJlLXRyYW5zbWlzc2lvbiBtb2RlKQotCiAKIAogNSkgU2VsZWN0IHlvdXIgQ0MgKGUtbWFpbCBjYXJib24gY29weSkgbGlzdC4KQEAgLTE3OCw2ICsxNjYsOCBAQAogIHNpbmNlIHBlb3BsZSBjb3B5LCBhcyBsb25nIGFzIGl0J3MgdHJpdmlhbCkKICBBbnkgZml4IGJ5IHRoZSBhdXRob3IvbWFpbnRhaW5lciBvZiB0aGUgZmlsZS4gKGllLiBwYXRjaCBtb25rZXkKICBpbiByZS10cmFuc21pc3Npb24gbW9kZSkKK1VSTDogPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ydXN0eS90cml2aWFsLz4KKwogCiAKIApAQCAtMjk5LDEzICsyODksMjQgQEAKIAogdGhlbiB5b3UganVzdCBhZGQgYSBsaW5lIHNheWluZwogCi0JU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLm9yZz4KKwlTaWduZWQtb2ZmLWJ5OiBSYW5kb20gSiBEZXZlbG9wZXIgPHJhbmRvbUBkZXZlbG9wZXIuZXhhbXBsZS5vcmc+CiAKIFNvbWUgcGVvcGxlIGFsc28gcHV0IGV4dHJhIHRhZ3MgYXQgdGhlIGVuZC4gIFRoZXknbGwganVzdCBiZSBpZ25vcmVkIGZvcgogbm93LCBidXQgeW91IGNhbiBkbyB0aGlzIHRvIG1hcmsgaW50ZXJuYWwgY29tcGFueSBwcm9jZWR1cmVzIG9yIGp1c3QKIHBvaW50IG91dCBzb21lIHNwZWNpYWwgZGV0YWlsIGFib3V0IHRoZSBzaWduLW9mZi4gCiAKIAorCisxMikgTW9yZSByZWZlcmVuY2VzIGZvciBzdWJtaXR0aW5nIHBhdGNoZXMKKworQW5kcmV3IE1vcnRvbiwgIlRoZSBwZXJmZWN0IHBhdGNoIiAodHBwKS4KKyAgPGh0dHA6Ly93d3cuemlwLmNvbS5hdS9+YWtwbS9saW51eC9wYXRjaGVzL3N0dWZmL3RwcC50eHQ+CisKK0plZmYgR2FyemlrLCAiTGludXgga2VybmVsIHBhdGNoIHN1Ym1pc3Npb24gZm9ybWF0LiIKKyAgPGh0dHA6Ly9saW51eC55eXoudXMvcGF0Y2gtZm9ybWF0Lmh0bWw+CisKKworCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU0VDVElPTiAyIC0gSElOVFMsIFRJUFMsIEFORCBUUklDS1MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNzQsNyArMzc1LDUgQEAKIDQpIERvbid0IG92ZXItZGVzaWduLgogCiBEb24ndCB0cnkgdG8gYW50aWNpcGF0ZSBuZWJ1bG91cyBmdXR1cmUgY2FzZXMgd2hpY2ggbWF5IG9yIG1heSBub3QKLWJlIHVzZWZ1bDogICJNYWtlIGl0IGFzIHNpbXBsZSBhcyB5b3UgY2FuLCBhbmQgbm8gc2ltcGxlciIKLQotCitiZSB1c2VmdWw6ICAiTWFrZSBpdCBhcyBzaW1wbGUgYXMgeW91IGNhbiwgYW5kIG5vIHNpbXBsZXIuIgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGktaG90a2V5LnR4dCBiL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTE1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2FjcGktaG90a2V5LnR4dApAQCAtMCwwICsxLDM1IEBACitkcml2ZXIvYWNwaS9ob3RrZXkuYyBpbXBsZW1lbnQ6CisxLiAvcHJvYy9hY3BpL2hvdGtleS9ldmVudF9jb25maWcgCisoZXZlbnQgYmFzZWQgaG90a2V5IG9yIGV2ZW50IGNvbmZpZyBpbnRlcmZhY2UpOgorYS4gYWRkIGEgIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCkgOiAKK2VjaG8gIjA6YnVzOjphY3Rpb246bWV0aG9kOm51bTpudW0iID4gZXZlbnRfY29uZmlnCisKK2IuIGRlbGV0ZSBhIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCk6IAorZWNobyAiMTo6Ojo6bnVtOm51bSIgPiBldmVudF9jb25maWcKKworYy4gIG1vZGlmeSBhIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCk6ICAgIAorZWNobyAiMjpidXM6OmFjdGlvbjptZXRob2Q6bnVtOm51bSIgPiBldmVudF9jb25maWcKKworMi4gL3Byb2MvYWNwaS9ob3RrZXkvcG9sbF9jb25maWcgCisocG9sbGluZyBiYXNlZCBob3RrZXkgb3IgZXZlbnQgY29uZmlnIGludGVyZmFjZSk6CithLmFkZCBhIHBvbGxpbmcgYmFzZWQgaG90a2V5KGV2ZW50KSA6IAkKK2VjaG8gIjA6YnVzOm1ldGhvZDphY3Rpb246bWV0aG9kOm51bSIgPiBwb2xsX2NvbmZpZwordGhpcyBhZGRpbmcgY29tbWFuZCB3aWxsIGNyZWF0ZSBhIHByb2MgZmlsZSAKKy9wcm9jL2FjcGkvaG90a2V5L21ldGhvZCwgd2hpY2ggaXMgdXNlZCB0byBnZXQgCityZXN1bHQgb2YgcG9sbGluZy4KKworYi5kZWxldGUgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCk6IAkKK2VjaG8gIjE6Ojo6Om51bSIgPiBldmVudF9jb25maWcKKworYy5tb2RpZnkgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCk6ICAgIAorZWNobyAiMjpidXM6bWV0aG9kOmFjdGlvbjptZXRob2Q6bnVtIiA+IHBvbGxfY29uZmlnCisKKzMuL3Byb2MvYWNwaS9ob3RrZXkvYWN0aW9uIAorKGludGVyZmFjZSB0byBjYWxsIGFtbCBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIGEgCitzcGVjaWZpYyBob3RrZXkoZXZlbnQpKQorZWNobyAiZXZlbnRfbnVtOmV2ZW50X3R5cGU6ZXZlbnRfYXJndW1lbnQiID4gCisJL3Byb2MvYWNwaS9ob3RrZXkvYWN0aW9uLgorVGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgYW1sIG1ldGhvZCBpcyAKK2F0dGFjaGVkIHRvIC9wcm9jL2FjcGkvaG90a2V5L3BvbGxfbWV0aG9kLCB3aGljaCBpcyBkbnlhbWljYWxseQorY3JlYXRlZC4gIFBsZWFzZSB1c2UgY29tbWFuZCAiY2F0IC9wcm9jL2FjcGkvaG90a2V5L3BvbGxpbmdfbWV0aG9kIiAKK3RvIHJldHJpZXZlIGl0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9iYXNpY19wcm9maWxpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9iYXNpY19wcm9maWxpbmcudHh0CmluZGV4IDY1ZTNkYzIuLjg3NjRlOWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmFzaWNfcHJvZmlsaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jhc2ljX3Byb2ZpbGluZy50eHQKQEAgLTI3LDkgKzI3LDEzIEBACiAKIE9wcm9maWxlCiAtLS0tLS0tLQotR2V0IHRoZSBzb3VyY2UgKEkgdXNlIDAuOCkgZnJvbSBodHRwOi8vb3Byb2ZpbGUuc291cmNlZm9yZ2UubmV0LwotYW5kIGFkZCAiaWRsZT1wb2xsIiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorCitHZXQgdGhlIHNvdXJjZSAoc2VlIENoYW5nZXMgZm9yIHJlcXVpcmVkIHZlcnNpb24pIGZyb20KK2h0dHA6Ly9vcHJvZmlsZS5zb3VyY2Vmb3JnZS5uZXQvIGFuZCBhZGQgImlkbGU9cG9sbCIgdG8gdGhlIGtlcm5lbCBjb21tYW5kCitsaW5lLgorCiBDb25maWd1cmUgd2l0aCBDT05GSUdfUFJPRklMSU5HPXkgYW5kIENPTkZJR19PUFJPRklMRT15ICYgcmVib290IG9uIG5ldyBrZXJuZWwKKwogLi9jb25maWd1cmUgLS13aXRoLWtlcm5lbC1zdXBwb3J0CiBtYWtlIGluc3RhbGwKIApAQCAtNDYsNyArNTAsNyBAQAogc3RvcAkJb3Bjb250cm9sIC0tc3RvcAogZHVtcCBvdXRwdXQJb3ByZXBvcnQgPiAgb3V0cHV0X2ZpbGUKIAotVG8gb25seSByZXBvcnQgb24gdGhlIGtlcm5lbCwgcnVuIG9wcmVwb3J0IC9ib290L3ZtbGludXggPiBvdXRwdXRfZmlsZQorVG8gb25seSByZXBvcnQgb24gdGhlIGtlcm5lbCwgcnVuIG9wcmVwb3J0IC1sIC9ib290L3ZtbGludXggPiBvdXRwdXRfZmlsZQogCiBBIHJlc2V0IGlzIG5lZWRlZCB0byBjbGVhciBvbGQgc3RhdGlzdGljcywgd2hpY2ggc3Vydml2ZSBhIHJlYm9vdC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9pb3ByaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9jay9pb3ByaW8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Y2NmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2lvcHJpby50eHQKQEAgLTAsMCArMSwxNzYgQEAKK0Jsb2NrIGlvIHByaW9yaXRpZXMKKz09PT09PT09PT09PT09PT09PT0KKworCitJbnRybworLS0tLS0KKworV2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIGNmcSB2MyAoYWthIGNmcS10cyBvciB0aW1lIHNsaWNlZCBjZnEpLCBiYXNpYyBpbworcHJpb3JpdGllcyBpcyBzdXBwb3J0ZWQgZm9yIHJlYWRzIG9uIGZpbGVzLiBUaGlzIGVuYWJsZXMgdXNlcnMgdG8gaW8gbmljZQorcHJvY2Vzc2VzIG9yIHByb2Nlc3MgZ3JvdXBzLCBzaW1pbGFyIHRvIHdoYXQgaGFzIGJlZW4gcG9zc2libGUgdG8gY3B1CitzY2hlZHVsaW5nIGZvciBhZ2VzLiBUaGlzIGRvY3VtZW50IG1haW5seSBkZXRhaWxzIHRoZSBjdXJyZW50IHBvc3NpYmlsaXRlcword2l0aCBjZnEsIG90aGVyIGlvIHNjaGVkdWxlcnMgZG8gbm90IHN1cHBvcnQgaW8gcHJpb3JpdGllcyBzbyBmYXIuCisKK1NjaGVkdWxpbmcgY2xhc3NlcworLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NGUSBpbXBsZW1lbnRzIHRocmVlIGdlbmVyaWMgc2NoZWR1bGluZyBjbGFzc2VzIHRoYXQgZGV0ZXJtaW5lIGhvdyBpbyBpcworc2VydmVkIGZvciBhIHByb2Nlc3MuCisKK0lPUFJJT19DTEFTU19SVDogVGhpcyBpcyB0aGUgcmVhbHRpbWUgaW8gY2xhc3MuIFRoaXMgc2NoZWR1bGluZyBjbGFzcyBpcyBnaXZlbgoraGlnaGVyIHByaW9yaXR5IHRoYW4gYW55IG90aGVyIGluIHRoZSBzeXN0ZW0sIHByb2Nlc3NlcyBmcm9tIHRoaXMgY2xhc3MgYXJlCitnaXZlbiBmaXJzdCBhY2Nlc3MgdG8gdGhlIGRpc2sgZXZlcnkgdGltZS4gVGh1cyBpdCBuZWVkcyB0byBiZSB1c2VkIHdpdGggc29tZQorY2FyZSwgb25lIGlvIFJUIHByb2Nlc3MgY2FuIHN0YXJ2ZSB0aGUgZW50aXJlIHN5c3RlbS4gV2l0aGluIHRoZSBSVCBjbGFzcywKK3RoZXJlIGFyZSA4IGxldmVscyBvZiBjbGFzcyBkYXRhIHRoYXQgZGV0ZXJtaW5lIGV4YWN0bHkgaG93IG11Y2ggdGltZSB0aGlzCitwcm9jZXNzIG5lZWRzIHRoZSBkaXNrIGZvciBvbiBlYWNoIHNlcnZpY2UuIEluIHRoZSBmdXR1cmUgdGhpcyBtaWdodCBjaGFuZ2UKK3RvIGJlIG1vcmUgZGlyZWN0bHkgbWFwcGFibGUgdG8gcGVyZm9ybWFuY2UsIGJ5IHBhc3NpbmcgaW4gYSB3YW50ZWQgZGF0YQorcmF0ZSBpbnN0ZWFkLgorCitJT1BSSU9fQ0xBU1NfQkU6IFRoaXMgaXMgdGhlIGJlc3QtZWZmb3J0IHNjaGVkdWxpbmcgY2xhc3MsIHdoaWNoIGlzIHRoZSBkZWZhdWx0Citmb3IgYW55IHByb2Nlc3MgdGhhdCBoYXNuJ3Qgc2V0IGEgc3BlY2lmaWMgaW8gcHJpb3JpdHkuIFRoZSBjbGFzcyBkYXRhCitkZXRlcm1pbmVzIGhvdyBtdWNoIGlvIGJhbmR3aWR0aCB0aGUgcHJvY2VzcyB3aWxsIGdldCwgaXQncyBkaXJlY3RseSBtYXBwYWJsZQordG8gdGhlIGNwdSBuaWNlIGxldmVscyBqdXN0IG1vcmUgY29hcnNlbHkgaW1wbGVtZW50ZWQuIDAgaXMgdGhlIGhpZ2hlc3QKK0JFIHByaW8gbGV2ZWwsIDcgaXMgdGhlIGxvd2VzdC4gVGhlIG1hcHBpbmcgYmV0d2VlbiBjcHUgbmljZSBsZXZlbCBhbmQgaW8KK25pY2UgbGV2ZWwgaXMgZGV0ZXJtaW5lZCBhczogaW9fbmljZSA9IChjcHVfbmljZSArIDIwKSAvIDUuCisKK0lPUFJJT19DTEFTU19JRExFOiBUaGlzIGlzIHRoZSBpZGxlIHNjaGVkdWxpbmcgY2xhc3MsIHByb2Nlc3NlcyBydW5uaW5nIGF0IHRoaXMKK2xldmVsIG9ubHkgZ2V0IGlvIHRpbWUgd2hlbiBubyBvbmUgZWxzZSBuZWVkcyB0aGUgZGlzay4gVGhlIGlkbGUgY2xhc3MgaGFzIG5vCitjbGFzcyBkYXRhLCBzaW5jZSBpdCBkb2Vzbid0IHJlYWxseSBhcHBseSBoZXJlLgorCitUb29scworLS0tLS0KKworU2VlIGJlbG93IGZvciBhIHNhbXBsZSBpb25pY2UgdG9vbC4gVXNhZ2U6CisKKyMgaW9uaWNlIC1jPGNsYXNzPiAtbjxsZXZlbD4gLXA8cGlkPgorCitJZiBwaWQgaXNuJ3QgZ2l2ZW4sIHRoZSBjdXJyZW50IHByb2Nlc3MgaXMgYXNzdW1lZC4gSU8gcHJpb3JpdHkgc2V0dGluZ3MKK2FyZSBpbmhlcml0ZWQgb24gZm9yaywgc28geW91IGNhbiB1c2UgaW9uaWNlIHRvIHN0YXJ0IHRoZSBwcm9jZXNzIGF0IGEgZ2l2ZW4KK2xldmVsOgorCisjIGlvbmljZSAtYzIgLW4wIC9iaW4vbHMKKword2lsbCBydW4gbHMgYXQgdGhlIGJlc3QtZWZmb3J0IHNjaGVkdWxpbmcgY2xhc3MgYXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCitGb3IgYSBydW5uaW5nIHByb2Nlc3MsIHlvdSBjYW4gZ2l2ZSB0aGUgcGlkIGluc3RlYWQ6CisKKyMgaW9uaWNlIC1jMSAtbjIgLXAxMDAKKword2lsbCBjaGFuZ2UgcGlkIDEwMCB0byBydW4gYXQgdGhlIHJlYWx0aW1lIHNjaGVkdWxpbmcgY2xhc3MsIGF0IHByaW9yaXR5IDIuCisKKy0tLT4gc25pcCBpb25pY2UuYyB0b29sIDwtLS0KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitleHRlcm4gaW50IHN5c19pb3ByaW9fc2V0KGludCwgaW50LCBpbnQpOworZXh0ZXJuIGludCBzeXNfaW9wcmlvX2dldChpbnQsIGludCk7CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI4OQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI5MAorI2VsaWYgZGVmaW5lZChfX3BwY19fKQorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI3MworI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI3NAorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI1MQorI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI1MgorI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkxMjc0CisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMTI3NQorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgYXJjaCIKKyNlbmRpZgorCitfc3lzY2FsbDMoaW50LCBpb3ByaW9fc2V0LCBpbnQsIHdoaWNoLCBpbnQsIHdobywgaW50LCBpb3ByaW8pOworX3N5c2NhbGwyKGludCwgaW9wcmlvX2dldCwgaW50LCB3aGljaCwgaW50LCB3aG8pOworCitlbnVtIHsKKwlJT1BSSU9fQ0xBU1NfTk9ORSwKKwlJT1BSSU9fQ0xBU1NfUlQsCisJSU9QUklPX0NMQVNTX0JFLAorCUlPUFJJT19DTEFTU19JRExFLAorfTsKKworZW51bSB7CisJSU9QUklPX1dIT19QUk9DRVNTID0gMSwKKwlJT1BSSU9fV0hPX1BHUlAsCisJSU9QUklPX1dIT19VU0VSLAorfTsKKworI2RlZmluZSBJT1BSSU9fQ0xBU1NfU0hJRlQJMTMKKworY29uc3QgY2hhciAqdG9fcHJpb1tdID0geyAibm9uZSIsICJyZWFsdGltZSIsICJiZXN0LWVmZm9ydCIsICJpZGxlIiwgfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaW9wcmlvID0gNCwgc2V0ID0gMCwgaW9wcmlvX2NsYXNzID0gSU9QUklPX0NMQVNTX0JFOworCWludCBjLCBwaWQgPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIrbjpjOnA6IikpICE9IEVPRikgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnbic6CisJCQlpb3ByaW8gPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7CisJCQlzZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJaW9wcmlvX2NsYXNzID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOworCQkJc2V0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXBpZCA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJc3dpdGNoIChpb3ByaW9fY2xhc3MpIHsKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfTk9ORToKKwkJCWlvcHJpb19jbGFzcyA9IElPUFJJT19DTEFTU19CRTsKKwkJCWJyZWFrOworCQljYXNlIElPUFJJT19DTEFTU19SVDoKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfQkU6CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfSURMRToKKwkJCWlvcHJpbyA9IDc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiYmFkIHByaW8gY2xhc3MgJWRcbiIsIGlvcHJpb19jbGFzcyk7CisJCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIXNldCkgeworCQlpZiAoIXBpZCAmJiBhcmd2W29wdGluZF0pCisJCQlwaWQgPSBzdHJ0b2woYXJndltvcHRpbmRdLCBOVUxMLCAxMCk7CisKKwkJaW9wcmlvID0gaW9wcmlvX2dldChJT1BSSU9fV0hPX1BST0NFU1MsIHBpZCk7CisKKwkJcHJpbnRmKCJwaWQ9JWQsICVkXG4iLCBwaWQsIGlvcHJpbyk7CisKKwkJaWYgKGlvcHJpbyA9PSAtMSkKKwkJCXBlcnJvcigiaW9wcmlvX2dldCIpOworCQllbHNlIHsKKwkJCWlvcHJpb19jbGFzcyA9IGlvcHJpbyA+PiBJT1BSSU9fQ0xBU1NfU0hJRlQ7CisJCQlpb3ByaW8gPSBpb3ByaW8gJiAweGZmOworCQkJcHJpbnRmKCIlczogcHJpbyAlZFxuIiwgdG9fcHJpb1tpb3ByaW9fY2xhc3NdLCBpb3ByaW8pOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGlvcHJpb19zZXQoSU9QUklPX1dIT19QUk9DRVNTLCBwaWQsIGlvcHJpbyB8IGlvcHJpb19jbGFzcyA8PCBJT1BSSU9fQ0xBU1NfU0hJRlQpID09IC0xKSB7CisJCQlwZXJyb3IoImlvcHJpb19zZXQiKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKGFyZ3Zbb3B0aW5kXSkKKwkJCWV4ZWN2cChhcmd2W29wdGluZF0sICZhcmd2W29wdGluZF0pOworCX0KKworCXJldHVybiAwOworfQorCistLS0+IHNuaXAgaW9uaWNlLmMgdG9vbCA8LS0tCisKKworTWFyY2ggMTEgMjAwNSwgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY2Npc3MudHh0IGIvRG9jdW1lbnRhdGlvbi9jY2lzcy50eHQKaW5kZXggZDU5OWJlYi4uYzhmOWE3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jY2lzcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jY2lzcy50eHQKQEAgLTE3LDYgKzE3LDcgQEAKIAkqIFNBIFA2MDAKIAkqIFNBIFA4MDAKIAkqIFNBIEU0MDAKKwkqIFNBIEUzMDAKIAogSWYgbm9kZXMgYXJlIG5vdCBhbHJlYWR5IGNyZWF0ZWQgaW4gdGhlIC9kZXYvY2Npc3MgZGlyZWN0b3J5LCBydW4gYXMgcm9vdDoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zYnBjZCBiL0RvY3VtZW50YXRpb24vY2Ryb20vc2JwY2QKaW5kZXggZDE4MjVkZi4uYjNiYTYzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZHJvbS9zYnBjZAorKysgYi9Eb2N1bWVudGF0aW9uL2Nkcm9tL3NicGNkCkBAIC00MTksNiArNDE5LDcgQEAKICAqLwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KIAogc3RhdGljIHN0cnVjdCBjZHJvbV90b2NoZHIgaGRyOwpAQCAtNDI5LDcgKzQzMCw3IEBACiBzdGF0aWMgaW50IGksIGosIGxpbWl0LCB0cmFjaywgZXJyOwogc3RhdGljIGNoYXIgZmlsZW5hbWVbMzJdOwogCi1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogLyoKICAqIG9wZW4gL2Rldi9jZHJvbQpAQCAtNTE2LDYgKzUxNyw3IEBACiAJfQogICAgICAgYXJnLmFkZHIubGJhKys7CiAgICAgfQorICAgIHJldHVybiAwOwogfQogLyo9PT09PT09PT09PT09PT09PT09PT0gZW5kIHByb2dyYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKQEAgLTU2NCwxNSArNTY2LDE2IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYWxsb2MuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgogCiAjaWZkZWYgQVpUX1BSSVZBVEVfSU9DVExTCiAjaW5jbHVkZSA8bGludXgvLi4vLi4vZHJpdmVycy9jZHJvbS9henRjZC5oPgotI2VuZGlmIEFaVF9QUklWQVRFX0lPQ1RMUworI2VuZGlmIC8qIEFaVF9QUklWQVRFX0lPQ1RMUyAqLwogI2lmZGVmIFNCUF9QUklWQVRFX0lPQ1RMUwogI2luY2x1ZGUgPGxpbnV4Ly4uLy4uL2RyaXZlcnMvY2Ryb20vc2JwY2QuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2VuZGlmIFNCUF9QUklWQVRFX0lPQ1RMUworI2VuZGlmIC8qIFNCUF9QUklWQVRFX0lPQ1RMUyAqLwogCiBzdHJ1Y3QgY2Ryb21fdG9jaGRyIGhkcjsKIHN0cnVjdCBjZHJvbV90b2NoZHIgdG9jSGRyOwpAQCAtNTkwLDcgKzU5Myw3IEBACiAJc3RydWN0IGNkcm9tX21zZiBtc2Y7CiAJdW5zaWduZWQgY2hhciBidWZbQ0RfRlJBTUVTSVpFX1JBV107CiB9IGF6dDsKLSNlbmRpZiBBWlRfUFJJVkFURV9JT0NUTFMKKyNlbmRpZiAvKiBBWlRfUFJJVkFURV9JT0NUTFMgKi8KIGludCBpLCBpMSwgaTIsIGkzLCBqLCBrOwogdW5zaWduZWQgY2hhciBzZXF1ZW5jZT0wOwogdW5zaWduZWQgY2hhciBjb21tYW5kWzgwXTsKQEAgLTczOCw3ICs3NDEsNyBAQAogCX0gCiB9IAogCi1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewogCXByaW50ZigiXG5UZXN0aW5nIHRvb2wgZm9yIGEgQ0RST00gZHJpdmVyJ3MgYXVkaW8gZnVuY3Rpb25zIFYwLjFcbiIpOwogCXByaW50ZigiKEMpIDE5OTUgRWJlcmhhcmQgTW9lbmtlYmVyZyA8ZW1vZW5rZUBnd2RnLmRlPlxuIik7CkBAIC0xMDQ2LDEyICsxMDQ5LDEzIEBACiAJCQlyYz1pb2N0bChkcml2ZSxDRFJPTUFVRElPQlVGU0laLGopOwogCQkJcHJpbnRmKCIlZCBmcmFtZXMgZ3JhbnRlZC5cbiIscmMpOwogCQkJYnJlYWs7Ci0jZW5kaWYgU0JQX1BSSVZBVEVfSU9DVExTCisjZW5kaWYgLyogU0JQX1BSSVZBVEVfSU9DVExTICovCiAJCWRlZmF1bHQ6CiAJCQlwcmludGYoInVua25vd24gY29tbWFuZDogXCIlc1wiLlxuIixjb21tYW5kKTsKIAkJCWJyZWFrOwogCQl9CiAJfQorCXJldHVybiAwOwogfQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dCBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvZ292ZXJub3JzLnR4dAppbmRleCBiODU0ODFhLi45MzNmYWU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2dvdmVybm9ycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9nb3Zlcm5vcnMudHh0CkBAIC05LDYgKzksNyBAQAogCiAKIAkJICAgIERvbWluaWsgQnJvZG93c2tpICA8bGludXhAYnJvZG8uZGU+CisgICAgICAgICAgICBzb21lIGFkZGl0aW9ucyBhbmQgY29ycmVjdGlvbnMgYnkgTmljbyBHb2xkZSA8bmljb0BuZ29sZGUuZGU+CiAKIAogCkBAIC0yNSw2ICsyNiw3IEBACiAyLjEgIFBlcmZvcm1hbmNlCiAyLjIgIFBvd2Vyc2F2ZQogMi4zICBVc2Vyc3BhY2UKKzIuNCAgT25kZW1hbmQKIAogMy4gICBUaGUgR292ZXJub3IgSW50ZXJmYWNlIGluIHRoZSBDUFVmcmVxIENvcmUKIApAQCAtODYsNyArODgsNyBAQAogc2NhbGluZ19tYXhfZnJlcS4KIAogCi0yLjEgUG93ZXJzYXZlCisyLjIgUG93ZXJzYXZlCiAtLS0tLS0tLS0tLS0tCiAKIFRoZSBDUFVmcmVxIGdvdmVybm9yICJwb3dlcnNhdmUiIHNldHMgdGhlIENQVSBzdGF0aWNhbGx5IHRvIHRoZQpAQCAtOTQsNyArOTYsNyBAQAogc2NhbGluZ19tYXhfZnJlcS4KIAogCi0yLjIgVXNlcnNwYWNlCisyLjMgVXNlcnNwYWNlCiAtLS0tLS0tLS0tLS0tCiAKIFRoZSBDUFVmcmVxIGdvdmVybm9yICJ1c2Vyc3BhY2UiIGFsbG93cyB0aGUgdXNlciwgb3IgYW55IHVzZXJzcGFjZQpAQCAtMTAzLDYgKzEwNSwxNCBAQAogZGlyZWN0b3J5LgogCiAKKzIuNCBPbmRlbWFuZAorLS0tLS0tLS0tLS0tCisKK1RoZSBDUFVmcmVxIGdvdmVub3IgIm9uZGVtYW5kIiBzZXRzIHRoZSBDUFUgZGVwZW5kaW5nIG9uIHRoZQorY3VycmVudCB1c2FnZS4gVG8gZG8gdGhpcyB0aGUgQ1BVIG11c3QgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0bworc3dpdGNoIHRoZSBmcmVxdWVuY3kgdmVyeSBmYXN0LgorCisKIAogMy4gVGhlIEdvdmVybm9yIEludGVyZmFjZSBpbiB0aGUgQ1BVZnJlcSBDb3JlCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2NwdXNldHMudHh0CmluZGV4IDJmOGYyNGUuLmFkOTQ0YzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY3B1c2V0cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jcHVzZXRzLnR4dApAQCAtNTEsNiArNTEsMTQgQEAKIAogSWYgYSBjcHVzZXQgaXMgY3B1IG9yIG1lbSBleGNsdXNpdmUsIG5vIG90aGVyIGNwdXNldCwgb3RoZXIgdGhhbiBhIGRpcmVjdAogYW5jZXN0b3Igb3IgZGVzY2VuZGVudCwgbWF5IHNoYXJlIGFueSBvZiB0aGUgc2FtZSBDUFVzIG9yIE1lbW9yeSBOb2Rlcy4KK0EgY3B1c2V0IHRoYXQgaXMgY3B1IGV4Y2x1c2l2ZSBoYXMgYSBzY2hlZCBkb21haW4gYXNzb2NpYXRlZCB3aXRoIGl0LgorVGhlIHNjaGVkIGRvbWFpbiBjb25zaXN0cyBvZiBhbGwgY3B1cyBpbiB0aGUgY3VycmVudCBjcHVzZXQgdGhhdCBhcmUgbm90CitwYXJ0IG9mIGFueSBleGNsdXNpdmUgY2hpbGQgY3B1c2V0cy4KK1RoaXMgZW5zdXJlcyB0aGF0IHRoZSBzY2hlZHVsZXIgbG9hZCBiYWxhY2luZyBjb2RlIG9ubHkgYmFsYW5jZXMKK2FnYWluc3QgdGhlIGNwdXMgdGhhdCBhcmUgaW4gdGhlIHNjaGVkIGRvbWFpbiBhcyBkZWZpbmVkIGFib3ZlIGFuZCBub3QKK2FsbCBvZiB0aGUgY3B1cyBpbiB0aGUgc3lzdGVtLiBUaGlzIHJlbW92ZXMgYW55IG92ZXJoZWFkIGR1ZSB0bworbG9hZCBiYWxhbmNpbmcgY29kZSB0cnlpbmcgdG8gcHVsbCB0YXNrcyBvdXRzaWRlIG9mIHRoZSBjcHUgZXhjbHVzaXZlCitjcHVzZXQgb25seSB0byBiZSBwcmV2ZW50ZWQgYnkgdGhlIHRhc2tzJyBjcHVzX2FsbG93ZWQgbWFzay4KIAogVXNlciBsZXZlbCBjb2RlIG1heSBjcmVhdGUgYW5kIGRlc3Ryb3kgY3B1c2V0cyBieSBuYW1lIGluIHRoZSBjcHVzZXQKIHZpcnR1YWwgZmlsZSBzeXN0ZW0sIG1hbmFnZSB0aGUgYXR0cmlidXRlcyBhbmQgcGVybWlzc2lvbnMgb2YgdGhlc2UKQEAgLTg0LDYgKzkyLDkgQEAKICAgICAgIGFuZCBhIGRhdGFiYXNlKSwgb3IKICAgICAqIE5VTUEgc3lzdGVtcyBydW5uaW5nIGxhcmdlIEhQQyBhcHBsaWNhdGlvbnMgd2l0aCBkZW1hbmRpbmcKICAgICAgIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy4KKyAgICAqIEFsc28gY3B1X2V4Y2x1c2l2ZSBjcHVzZXRzIGFyZSB1c2VmdWwgZm9yIHNlcnZlcnMgcnVubmluZyBvcnRob2dvbmFsCisgICAgICB3b3JrbG9hZHMgc3VjaCBhcyBSVCBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIGxvdyBsYXRlbmN5IGFuZCBIUEMKKyAgICAgIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0aHJvdWdocHV0IHNlbnNpdGl2ZQogCiBUaGVzZSBzdWJzZXRzLCBvciAic29mdCBwYXJ0aXRpb25zIiBtdXN0IGJlIGFibGUgdG8gYmUgZHluYW1pY2FsbHkKIGFkanVzdGVkLCBhcyB0aGUgam9iIG1peCBjaGFuZ2VzLCB3aXRob3V0IGltcGFjdGluZyBvdGhlciBjb25jdXJyZW50bHkKQEAgLTEyNSw2ICsxMzYsOCBAQAogIC0gQSBjcHVzZXQgbWF5IGJlIG1hcmtlZCBleGNsdXNpdmUsIHdoaWNoIGVuc3VyZXMgdGhhdCBubyBvdGhlcgogICAgY3B1c2V0IChleGNlcHQgZGlyZWN0IGFuY2VzdG9ycyBhbmQgZGVzY2VuZGVudHMpIG1heSBjb250YWluCiAgICBhbnkgb3ZlcmxhcHBpbmcgQ1BVcyBvciBNZW1vcnkgTm9kZXMuCisgICBBbHNvIGEgY3B1X2V4Y2x1c2l2ZSBjcHVzZXQgd291bGQgYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2NoZWQKKyAgIGRvbWFpbi4KICAtIFlvdSBjYW4gbGlzdCBhbGwgdGhlIHRhc2tzIChieSBwaWQpIGF0dGFjaGVkIHRvIGFueSBjcHVzZXQuCiAKIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjcHVzZXRzIHJlcXVpcmVzIGEgZmV3LCBzaW1wbGUgaG9va3MKQEAgLTEzNiw2ICsxNDksOSBAQAogICAgYWxsb3dlZCBpbiB0aGF0IHRhc2tzIGNwdXNldC4KICAtIGluIHNjaGVkLmMgbWlncmF0ZV9hbGxfdGFza3MoKSwgdG8ga2VlcCBtaWdyYXRpbmcgdGFza3Mgd2l0aGluCiAgICB0aGUgQ1BVcyBhbGxvd2VkIGJ5IHRoZWlyIGNwdXNldCwgaWYgcG9zc2libGUuCisgLSBpbiBzY2hlZC5jLCBhIG5ldyBBUEkgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMgZm9yIGhhbmRsaW5nCisgICBzY2hlZCBkb21haW4gY2hhbmdlcyBhc3NvY2lhdGVkIHdpdGggY3B1X2V4Y2x1c2l2ZSBjcHVzZXRzCisgICBhbmQgcmVsYXRlZCBjaGFuZ2VzIGluIGJvdGggc2NoZWQuYyBhbmQgYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYwogIC0gaW4gdGhlIG1iaW5kIGFuZCBzZXRfbWVtcG9saWN5IHN5c3RlbSBjYWxscywgdG8gbWFzayB0aGUgcmVxdWVzdGVkCiAgICBNZW1vcnkgTm9kZXMgYnkgd2hhdCdzIGFsbG93ZWQgaW4gdGhhdCB0YXNrcyBjcHVzZXQuCiAgLSBpbiBwYWdlX2FsbG9jLCB0byByZXN0cmljdCBtZW1vcnkgdG8gYWxsb3dlZCBub2Rlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CmluZGV4IGJiNjdjZjIuLjBmNTE1MTcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dApAQCAtOTQsNiArOTQsNyBAQAogCQkgIDkgPSAvZGV2L3VyYW5kb20JRmFzdGVyLCBsZXNzIHNlY3VyZSByYW5kb20gbnVtYmVyIGdlbi4KIAkJIDEwID0gL2Rldi9haW8JCUFzeW5jcm9ub3VzIEkvTyBub3RpZmljYXRpb24gaW50ZXJmYWNlCiAJCSAxMSA9IC9kZXYva21zZwkJV3JpdGVzIHRvIHRoaXMgY29tZSBvdXQgYXMgcHJpbnRrJ3MKKwkJIDEyID0gL2Rldi9vbGRtZW0JQWNjZXNzIHRvIGNyYXNoIGR1bXAgZnJvbSBrZXhlYyBrZXJuZWwKICAgMSBibG9jawlSQU0gZGlzawogCQkgIDAgPSAvZGV2L3JhbTAJCUZpcnN0IFJBTSBkaXNrCiAJCSAgMSA9IC9kZXYvcmFtMQkJU2Vjb25kIFJBTSBkaXNrCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZGlidXNiIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmRpYnVzYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5ZTk1OC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZGlidXNiCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLURvY3VtZW50YXRpb24gZm9yIGRpYjMwMDAqIGZyb250ZW5kIGRyaXZlcnMgYW5kIGRpYnVzYiBkZXZpY2UgZHJpdmVyCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSksCi0KLWRpYnVzYiBhbmQgZGliMzAwMG1iL21jIGRyaXZlcnMgYmFzZWQgb24gR1BMIGNvZGUsIHdoaWNoIGhhcwotCi1Db3B5cmlnaHQgKEMpIDIwMDQgQW1hdXJ5IERlbW9sIGZvciBEaUJjb20gKGFkZW1vbEBkaWJjb20uZnIpCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgotCi0KLVN1cHBvcnRlZCBkZXZpY2VzIFVTQjEuMQotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVByb2R1Y2VkIGFuZCByZXNlbGxlZCBieSBUd2luaGFuOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIFR3aW5oYW5EVFYgVVNCLVRlciBEVkItVCBEZXZpY2UgKFZQNzA0MSkKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfMy5hc3AKLQotLSBUd2luaGFuRFRWIE1hZ2ljIEJveCAoVlA3MDQxZSkKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfNC5hc3AKLQotLSBIQU1BIERWQi1UIFVTQiBkZXZpY2UKLQlodHRwOi8vd3d3LmhhbWEuZGUvcG9ydGFsL2FydGljbGVJZCoxMTA2MjAvYWN0aW9uKjI1OTgKLQotLSBDVFMgUG9ydGFibGUgKENoaW5lc2UgVGVsZXZpc2lvbiBTeXN0ZW0pICgyKQotCWh0dHA6Ly93d3cuMmN0cy50di9jdHNwb3J0YWJsZS8KLQotLSBVbmtub3duIFVTQiBEVkItVCBkZXZpY2Ugd2l0aCB2ZW5kb3IgSUQgSHlwZXItUGFsdGVrCi0KLQotUHJvZHVjZWQgYW5kIHJlc2VsbGVkIGJ5IEtXb3JsZDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIEtXb3JsZCBWLVN0cmVhbSBYUEVSVCBEVFYgRFZCLVQgVVNCCi0JaHR0cDovL3d3dy5rd29ybGQuY29tLnR3L2VuL3Byb2R1Y3QvRFZCVC1VU0IvRFZCVC1VU0IuaHRtbAotCi0tIEpldFdheSBEVFYgRFZCLVQgVVNCCi0JaHR0cDovL3d3dy5qZXR3YXkuY29tLnR3L2V2aXNuL3Byb2R1Y3QvbGNkLXR2L0RWVC1VU0IvZHR2LXVzYi5odG0KLQotLSBBRFNUZWNoIEluc3RhbnQgVFYgRFZCLVQgVVNCCi0JaHR0cDovL3d3dy5hZHN0ZWNoLmNvbS9wcm9kdWN0cy9QVFYtMzMzL2ludHJvL1BUVi0zMzNfaW50cm8uYXNwP3BpZD1QVFYtMzMzCi0KLQotT3RoZXJzOgotLS0tLS0tLQotLSBVbHRpbWEgRWxlY3Ryb25pYy9BcnRlYyBUMSBVU0IgVFZCT1ggKEFOMjEzNSwgQU4yMjM1LCBBTjIyMzUgd2l0aCBQYW5hc29uaWMgVHVuZXIpCi0JaHR0cDovLzgyLjE2MS4yNDYuMjQ5L3Byb2R1Y3RzLXR2Ym94Lmh0bWwKLQotLSBDb21wcm8gVmlkZW9tYXRlIERWQi1VMjAwMCAtIERWQi1UIFVTQiAoMikKLQlodHRwOi8vd3d3LmNvbXByb3VzYS5jb20vcHJvZHVjdHMvdm11MjAwMC5odG0KLQotLSBHcmFuZHRlYyBVU0IgRFZCLVQKLQlodHRwOi8vd3d3LmdyYW5kLmNvbS50dy8KLQotLSBBdmVybWVkaWEgQXZlclRWIERWQlQgVVNCICgyKQotCWh0dHA6Ly93d3cuYXZlcm1lZGlhLmNvbS8KLQotLSBEaUJjb20gVVNCIERWQi1UIHJlZmVyZW5jZSBkZXZpY2UgKG5vbi1wdWJsaWMpCi0KLQotU3VwcG9ydGVkIGRldmljZXMgVVNCMi4wCi09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gVHdpbmhhbiBNYWdpY0JveCBJSSAoMikKLQlodHRwOi8vd3d3LnR3aW5oYW4uY29tL3Byb2R1Y3RfdGVycmVzdHJpYWxfNy5hc3AKLQotLSBIYW5mdGVrIFVNVC0wMTAgKDEpCi0JaHR0cDovL3d3dy5nbG9iYWxzb3VyY2VzLmNvbS9zaS82MDA4ODE5NzU3MDgyL1Byb2R1Y3REZXRhaWwvRGlnaXRhbC1UVi9wcm9kdWN0X2lkLTEwMDA0NjUyOQotCi0tIFR5cGhvb24vWWFrdW1vL0hBTUEgRFZCLVQgbW9iaWxlIFVTQjIuMCAoMSkKLQlodHRwOi8vd3d3Lnlha3Vtby5kZS9wcm9kdWt0ZS9pbmRleC5waHA/cGlkPTEmYWc9RFZCLVQKLQotLSBBcnRlYyBUMSBVU0IgVFZCT1ggKEZYMikgKDIpCi0KLS0gSGF1cHBhdWdlIFdpblRWIE5PVkEtVCBVU0IyCi0JaHR0cDovL3d3dy5oYXVwcGF1Z2UuY29tLwotCi0tIEtXb3JsZC9BRFNUZWNoIEluc3RhbnQgRFZCLVQgVVNCMi4wIChEaUIzMDAwTS1CKQotCi0tIERpQmNvbSBVU0IyLjAgRFZCLVQgcmVmZXJlbmNlIGRldmljZSAobm9uLXB1YmxpYykKLQotMSkgSXQgaXMgd29ya2luZyBhbG1vc3QuCi0yKSBObyB0ZXN0IHJlcG9ydHMgcmVjZWl2ZWQgeWV0LgotCi0KLTAuIE5FV1M6Ci0gIDIwMDUtMDItMTEgLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgS1dvcmxkL0FEU1RlY2ggSW5zdGFudCBEVkItVCBVU0IyLjAuIFRoYW5rcyBhIGxvdCB0byBKb2FjaGltIHZvbiBDYXJvbgotICAyMDA1LTAyLTAyIC0gYWRkZWQgc3VwcG9ydCBmb3IgdGhlIEhhdXBwYXVnZSBXaW4tVFYgTm92YS1UIFVTQjIKLSAgMjAwNS0wMS0zMSAtIGRpc3RvcnRlZCBzdHJlYW1pbmcgaXMgZmluYWxseSBnb25lIGZvciBVU0IxLjEgZGV2aWNlcwotICAyMDA1LTAxLTEzIC0gbW92ZWQgdGhlIG1pcnJvcmVkIHBpZF9maWx0ZXJfdGFibGUgYmFjayB0byBkdmItZGlidXNiCi0gICAgICAgICAgICAgLSBmaXJzdCBhbG1vc3Qgd29ya2luZyB2ZXJzaW9uIGZvciBIYW5mVGVrIFVNVC0wMTAKLSAgICAgICAgICAgICAtIGZvdW5kIG91dCwgdGhhdCBZYWt1bW8vSEFNQS9UeXBob29uIGFyZSBwcmVkZXNzb3JzIG9mIHRoZSBIYW5mVGVrIFVNVC0wMTAKLSAgMjAwNS0wMS0xMCAtIHJlZmFjdG9yaW5nIGNvbXBsZXRlZCwgbm93IGV2ZXJ5dGhpbmcgaXMgdmVyeSBkZWxpZ2h0ZnVsCi0gICAgICAgICAgICAgLSB0dW5lciBxdWlya3MgZm9yIHNvbWUgd2VpcmQgZGV2aWNlcyAoQXJ0ZWMgVDEgQU4yMjM1IGRldmljZSBoYXMgc29tZXRpbWVzIGEKLSAgICAgICAgICAgICAgIFBhbmFzb25pYyBUdW5lciBhc3NlbWJsZWQpLiBUdW5lcnByb2JpbmcgaW1wbGVtZW50ZWQuIFRoYW5rcyBhIGxvdCB0byBHdW5uYXIgV2l0dGljaC4KLSAgMjAwNC0xMi0yOSAtIGFmdGVyIHNldmVyYWwgZGF5cyBvZiBzdHJ1Z2dsaW5nIGFyb3VuZCBidWcgb2Ygbm8gcmV0dXJuaW5nIFVSQnMgZml4ZWQuCi0gIDIwMDQtMTItMjYgLSByZWZhY3RvcmVkIHRoZSBkaWJ1c2ItZHJpdmVyLCBzcGxpdHRlZCBpbnRvIHNlcGFyYXRlIGZpbGVzCi0gICAgICAgICAgICAgLSBpMmMtcHJvYmluZyBlbmFibGVkCi0gIDIwMDQtMTItMDYgLSBwb3NzaWJpbGl0eSBmb3IgZGVtb2QgaTJjLWFkZHJlc3MgcHJvYmluZwotICAgICAgICAgICAgIC0gbmV3IHVzYiBJRHMgKENvbXBybyxBcnRlYykKLSAgMjAwNC0xMS0yMyAtIG1lcmdlZCBjaGFuZ2VzIGZyb20gRGlCMzAwME1DX3ZlcjIuMQotICAgICAgICAgICAgIC0gcmV2aXNlZCB0aGUgZGVidWdnaW5nCi0gICAgICAgICAgICAgLSBwb3NzaWJpbGl0eSB0byBkZWxpdmVyIHRoZSBjb21wbGV0ZSBUUyBmb3IgVVNCMi4wCi0gIDIwMDQtMTEtMjEgLSBmaXJzdCB3b3JraW5nIHZlcnNpb24gb2YgdGhlIGRpYjMwMDBtYy9wIGZyb250ZW5kIGRyaXZlci4KLSAgMjAwNC0xMS0xMiAtIGFkZGVkIGFkZGl0aW9uYWwgcmVtb3RlIGNvbnRyb2wga2V5cy4gVGhhbmtzIHRvIFV3ZSBIYW5rZS4KLSAgMjAwNC0xMS0wNyAtIGFkZGVkIHJlbW90ZSBjb250cm9sIHN1cHBvcnQuIFRoYW5rcyB0byBEYXZpZCBNYXR0aGV3cy4KLSAgMjAwNC0xMS0wNSAtIGFkZGVkIHN1cHBvcnQgZm9yIGEgbmV3IGRldmljZXMgKEdyYW5kdGVjL0F2ZXJtZWRpYS9BcnRlYykKLSAgICAgICAgICAgICAtIG1lcmdlZCBteSBjaGFuZ2VzIChmb3IgZGliMzAwMG1iL2RpYnVzYikgdG8gdGhlIEZFX1JFRkFDVE9SSU5HLCBiZWNhdXNlIGl0IGJlY2FtZSBIRUFECi0gICAgICAgICAgICAgLSBtb3ZlZCB0cmFuc2ZlciBjb250cm9sIChwaWQgZmlsdGVyLCBmaWZvIGNvbnRyb2wpIGZyb20gdXNiIGRyaXZlciB0byBmcm9udGVuZCwgaXQgc2VlbXMKLSAgICAgICAgICAgICAgIGJldHRlciBzZXR0bGVkIHRoZXJlIChhZGRlZCB4ZmVyX29wcy1zdHJ1Y3QpCi0gICAgICAgICAgICAgLSBjcmVhdGVkIGEgY29tbW9uIGZpbGVzIGZvciBmcm9udGVuZHMgKG1jL3AvbWIpCi0gIDIwMDQtMDktMjggLSBhZGRlZCBzdXBwb3J0IGZvciBhIG5ldyBkZXZpY2UgKFVua293biwgdmVuZG9yIElEIGlzIEh5cGVyLVBhbHRlaykKLSAgMjAwNC0wOS0yMCAtIGFkZGVkIHN1cHBvcnQgZm9yIGEgbmV3IGRldmljZSAoQ29tcHJvIERWQi1VMjAwMCksIHRoYW5rcwotICAgICAgICAgICAgICAgdG8gQW1hdXJ5IERlbW9sIGZvciByZXBvcnRpbmcKLSAgICAgICAgICAgICAtIGNoYW5nZWQgdXNiIFRTIHRyYW5zZmVyIG1ldGhvZCAoc2V2ZXJhbCB1cmJzLCBzdG9wcGluZyB0cmFuc2ZlcgotICAgICAgICAgICAgICAgYmVmb3JlIHNldHRpbmcgYSBuZXcgcGlkKQotICAyMDA0LTA5LTEzIC0gYWRkZWQgc3VwcG9ydCBmb3IgYSBuZXcgZGV2aWNlIChBcnRlYyBUMSBVU0IgVFZCT1gpLCB0aGFua3MKLSAgICAgICAgICAgICAgIHRvIENocmlzdGlhbiBNb3RzY2hrZSBmb3IgcmVwb3J0aW5nCi0gIDIwMDQtMDktMDUgLSByZWxlYXNlZCB0aGUgZGlidXNiIGRldmljZSBhbmQgZGliMzAwMG1iLWZyb250ZW5kIGRyaXZlcgotCi0gIChvbGQgbmV3cyBmb3IgdnA3MDQxLmMpCi0gIDIwMDQtMDctMTUgLSBmb3VuZCBvdXQsIGJ5IGFjY2lkZW50LCB0aGF0IHRoZSBkZXZpY2UgaGFzIGEgVFVBNjAxMFhTIGZvcgotICAgICAgICAgICAgICAgUExMCi0gIDIwMDQtMDctMTIgLSBmaWd1cmVkIG91dCwgdGhhdCB0aGUgZHJpdmVyIHNob3VsZCBhbHNvIHdvcmsgd2l0aCB0aGUKLSAgICAgICAgICAgICAgIENUUyBQb3J0YWJsZSAoQ2hpbmVzZSBUZWxldmlzaW9uIFN5c3RlbSkKLSAgMjAwNC0wNy0wOCAtIGZpcm13YXJlLWV4dHJhY3Rpb24tMi40MjItcHJvYmxlbSBzb2x2ZWQsIGRyaXZlciBpcyBub3cgd29ya2luZwotICAgICAgICAgICAgICAgcHJvcGVybHkgd2l0aCBmaXJtd2FyZSBleHRyYWN0ZWQgZnJvbSAyLjQyMgotCQkJIC0gI2lmIGZvciAyLjYuNCAoZHZiKSwgY29tcGlsZSBpc3N1ZQotCQkJIC0gY2hhbmdlZCBmaXJtd2FyZSBoYW5kbGluZywgc2VlIHZwNzA0MS50eHQgc2VjIDEuMQotICAyMDA0LTA3LTAyIC0gc29tZSB0dW5lciBtb2RpZmljYXRpb25zLCB2MC4xLCBjbGVhbnVwcywgZmlyc3QgcHVibGljCi0gIDIwMDQtMDYtMjggLSBub3cgdXNpbmcgdGhlIGR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cywgZXZlcnl0aGluZwotICAgICAgICAgICAgICAgcnVucyBmaW5lIG5vdwotICAyMDA0LTA2LTI3IC0gYWJsZSB0byB3YXRjaCBhbmQgc3dpdGNoaW5nIGNoYW5uZWxzIChwcmUtYWxwaGEpCi0gICAgICAgICAgICAgLSBubyBzZWN0aW9uIGZpbHRlcmluZyB5ZXQKLSAgMjAwNC0wNi0wNiAtIGZpcnN0IFRTIHJlY2VpdmVkLCBidXQga2VybmVsIG9vcHMgOi8KLSAgMjAwNC0wNS0xNCAtIGZpcm13YXJlIGxvYWRlciBpcyB3b3JraW5nCi0gIDIwMDQtMDUtMTEgLSBzdGFydCB3cml0aW5nIHRoZSBkcml2ZXIKLQotMS4gSG93IHRvIHVzZT8KLU5PVEU6IFRoaXMgZHJpdmVyIHdhcyBkZXZlbG9wZWQgdXNpbmcgTGludXggMi42LjYuLAotaXQgaXMgd29ya2luZyB3aXRoIDIuNi43IGFuZCBhYm92ZS4KLQotTGludXggMi40Lnggc3VwcG9ydCBpcyBub3QgcGxhbm5lZCwgYnV0IHBhdGNoZXMgYXJlIHZlcnkgd2VsY29tZS4KLQotTk9URTogSSdtIHVzaW5nIERlYmlhbiB0ZXN0aW5nLCBzbyB0aGUgZm9sbG93aW5nIGV4cGxhaW5hdGlvbiAoZXNwZWNpYWxseQotdGhlIGhvdHBsdWctcGF0aCkgbmVlZG4ndCBtYXRjaCB5b3VyIHN5c3RlbSwgYnV0IHByb2JhYmx5IGl0IHdpbGwgOikuCi0KLVRoZSBkcml2ZXIgaXMgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCBzaW5jZSBMaW51eCAyLjYuMTAuCi0KLTEuMS4gRmlybXdhcmUKLQotVGhlIFVTQiBkcml2ZXIgbmVlZHMgdG8gZG93bmxvYWQgYSBmaXJtd2FyZSB0byBzdGFydCB3b3JraW5nLgotCi1Zb3UgY2FuIGVpdGhlciB1c2UgImdldF9kdmJfZmlybXdhcmUgZGlidXNiIiB0byBkb3dubG9hZCB0aGUgZmlybXdhcmUgb3IgeW91Ci1jYW4gZ2V0IGl0IGRpcmVjdGx5IHZpYQotCi1mb3IgVVNCMS4xIChBTjIxMzUpCi1odHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2Fkcy9maXJtd2FyZS9kdmItZGlidXNiLTUuMC4wLjExLmZ3Ci0KLWZvciBVU0IxLjEgKEFOMjIzNSkgKGEgZmV3IEFydGVjIFQxIGRldmljZXMpCi1odHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2Fkcy9maXJtd2FyZS9kdmItZGlidXNiLWFuMjIzNS0xLmZ3Ci0KLWZvciBVU0IyLjAgKEZYMikgSGF1cHBhdWdlLCBEaUJjb20KLWh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL2Zpcm13YXJlL2R2Yi1kaWJ1c2ItNi4wLjAuNS5mdwotCi1mb3IgVVNCMi4wIEFEU1RlY2gvS3dvcmxkIFVTQjIuMAotaHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZHMvZmlybXdhcmUvZHZiLWRpYnVzYi1hZHN0ZWNoLXVzYjItMS5mdwotCi1mb3IgVVNCMi4wIEhhbmZUZWsKLWh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL2Zpcm13YXJlL2R2Yi1kaWJ1c2ItYW4yMjM1LTEuZncKLQotCi0xLjIuIENvbXBpbGluZwotCi1TaW5jZSB0aGUgZHJpdmVyIGlzIGluIHRoZSBsaW51eCBrZXJuZWwsIGFjdGl2YXRpbmcgdGhlIGRyaXZlciBpbgoteW91ciBmYXZvcml0ZSBjb25maWctZW52aXJvbm1lbnQgc2hvdWxkIHN1ZmZpY2llbnQuIEkgcmVjb21tZW5kCi10byBjb21waWxlIHRoZSBkcml2ZXIgYXMgbW9kdWxlLiBIb3RwbHVnIGRvZXMgdGhlIHJlc3QuCi0KLTEuMy4gTG9hZGluZyB0aGUgZHJpdmVycwotCi1Ib3RwbHVnIGlzIGFibGUgdG8gbG9hZCB0aGUgZHJpdmVyLCB3aGVuIGl0IGlzIG5lZWRlZCAoYmVjYXVzZSB5b3UgcGx1Z2dlZAotaW4gdGhlIGRldmljZSkuCi0KLUlmIHlvdSB3YW50IHRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQsIHlvdSBoYXZlIHRvIGxvYWQgdGhlIGRyaXZlciBtYW51YWxseSBhbmQKLWZyb20gd2l0aGluZyB0aGUgZHZiLWtlcm5lbCBjdnMgcmVwb3NpdG9yeS4KLQotZmlyc3QgaGF2ZSBhIGxvb2ssIHdoaWNoIGRlYnVnIGxldmVsIGFyZSBhdmFpbGFibGU6Ci0KLW1vZGluZm8gZGliMzAwMG1iCi1tb2RpbmZvIGRpYjMwMDAtY29tbW9uCi1tb2RpbmZvIGRpYjMwMDBtYwotbW9kaW5mbyBkdmItZGlidXNiCi0KLW1vZHByb2JlIGRpYjMwMDAtY29tbW9uIGRlYnVnPTxsZXZlbD4KLW1vZHByb2JlIGRpYjMwMDBtYiBkZWJ1Zz08bGV2ZWw+Ci1tb2Rwcm9iZSBkaWIzMDAwbWMgZGVidWc9PGxldmVsPgotbW9kcHJvYmUgZHZiLWRpYnVzYiBkZWJ1Zz08bGV2ZWw+Ci0KLXNob3VsZCBkbyB0aGUgdHJpY2suCi0KLVdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgZmlybXdhcmUgZmlsZSB3YXMgaW4KLXRoZSByaWdodCBwbGFjZSBhbmQgdGhlIGRldmljZSBpcyBjb25uZWN0ZWQsIHRoZSAiUG93ZXIiLUxFRCBzaG91bGQgYmUKLXR1cm5lZCBvbi4KLQotQXQgdGhpcyBwb2ludCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc3RhcnQgYSBkdmItY2FwYWJsZSBhcHBsaWNhdGlvbi4gRm9yIG15c2VsZgotSSB1c2VkIG1wbGF5ZXIsIGR2YnNjYW4sIHR6YXAgYW5kIGtheHR2LCB0aGV5IGFyZSB3b3JraW5nLiBVc2luZyB0aGUgZGV2aWNlCi1pbiB2ZHIgaXMgd29ya2luZyBub3cgYWxzby4KLQotMi4gS25vd24gcHJvYmxlbXMgYW5kIGJ1Z3MKLQotLSBEb24ndCByZW1vdmUgdGhlIFVTQiBkZXZpY2Ugd2hpbGUgcnVubmluZyBhbiBEVkIgYXBwbGljYXRpb24sIHlvdXIgc3lzdGVtIHdpbGwgZGllLgotCi0yLjEuIEFkZGluZyBzdXBwb3J0IGZvciBkZXZpY2VzCi0KLUl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIHJhbmdlIG9mIGRldmljZXMgYmFzZWQgb24gdGhlIERpQmNvbQotcmVmZXJlbmNlIGRlc2lnbnMuIFRoaXMgaXMgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGRlc2lnbiBvZiBEaUJjb20gY2FuIGJlIHNvbGQKLXRvIHRoaXJkcywgd2l0aG91dCB0ZWxsaW5nIERpQmNvbSAoc28gZG9uZSB3aXRoIHRoZSBUd2luaGFuIFZQNzA0MSBhbmQKLXRoZSBIQU1BIGRldmljZSkuCi0KLVdoZW4geW91IHRoaW5rIHlvdSBoYXZlIGEgZGV2aWNlIGxpa2UgdGhpcyBhbmQgdGhlIGRyaXZlciBkb2VzIG5vdCByZWNvZ25pemVzIGl0LAotcGxlYXNlIHNlbmQgdGhlICoqKipsb2FkKi5pbmYgYW5kIHRoZSAqKioqY2FwKi5pbmYgb2YgdGhlIFdpbmRvd3MgZHJpdmVyIHRvIG1lLgotCi1Tb21ldGltZXMgdGhlIFZlbmRvciBvciBQcm9kdWN0IElEIGlzIGlkZW50aWNhbCB0byB0aGUgb25lcyBvZiBUd2luaGFuLCBldmVuCi10aG91Z2ggaXQgaXMgbm90IGEgVHdpbmhhbiBkZXZpY2UgKGUuZy4gSEFNQSksIHRoZW4gcGxlYXNlIHNlbmQgbWUgdGhlIG5hbWUKLW9mIHRoZSBkZXZpY2UuIEkgd2lsbCBhZGQgaXQgdG8gdGhpcyBsaXN0IGluIG9yZGVyIHRvIG1ha2UgdGhpcyBjbGVhciB0bwotb3RoZXJzLgotCi1JZiB5b3UgYXJlIGZhbWlsYXIgd2l0aCBDIHlvdSBjYW4gYWxzbyBhZGQgdGhlIFZJRCBhbmQgUElEIG9mIHRoZSBkZXZpY2UgdG8KLXRoZSBkdmItZGlidXNiLWNvcmUuYy1maWxlIGFuZCBjcmVhdGUgYSBwYXRjaCBhbmQgc2VuZCBpdCBvdmVyIHRvIG1lIG9yIHRvCi10aGUgbGludXgtZHZiIG1haWxpbmcgbGlzdCwgX2FmdGVyXyB5b3UgaGF2ZSB0cmllZCBjb21waWxpbmcgYW5kIG1vZHByb2JpbmcKLWl0LgotCi0yLjIuIFVTQjEuMSBCYW5kd2lkdGggbGltaXRhdGlvbgotCi1Nb3N0IG9mIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGRldmljZXMgYXJlIFVTQjEuMSBhbmQgdGh1cyB0aGV5IGhhdmUgYQotbWF4aW11bSBiYW5kd2lkdGggb2YgYWJvdXQgNS02IE1CaXQvcyB3aGVuIGNvbm5lY3RlZCB0byBhIFVTQjIuMCBodWIuCi1UaGlzIGlzIG5vdCBlbm91Z2ggZm9yIHJlY2VpdmluZyB0aGUgY29tcGxldGUgdHJhbnNwb3J0IHN0cmVhbSBvZiBhCi1EVkItVCBjaGFubmVsICh3aGljaCBjYW4gYmUgYWJvdXQgMTYgTUJpdC9zKS4gTm9ybWFsbHkgdGhpcyBpcyBub3QgYQotcHJvYmxlbSwgaWYgeW91IG9ubHkgd2FudCB0byB3YXRjaCBUViAodGhpcyBkb2VzIG5vdCBhcHBseSBmb3IgSERUViksCi1idXQgd2F0Y2hpbmcgYSBjaGFubmVsIHdoaWxlIHJlY29yZGluZyBhbm90aGVyIGNoYW5uZWwgb24gdGhlIHNhbWUKLWZyZXF1ZW5jeSBzaW1wbHkgZG9lcyBub3Qgd29yayB2ZXJ5IHdlbGwuIFRoaXMgYXBwbGllcyB0byBhbGwgVVNCMS4xCi1EVkItVCBkZXZpY2VzLCBub3QganVzdCBkaWJ1c2IpCi0KLVVwZGF0ZTogRm9yIHRoZSBVU0IxLjEgYW5kIFZEUiBzb21lIHdvcmsgaGFzIGJlZW4gZG9uZSAocGF0Y2hlcyBhbmQgY29tbWVudHMKLWFyZSBzdGlsbCB2ZXJ5IHdlbGNvbWUpLiBNYXliZSB0aGUgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gdGhlIG1lYW50aW1lIGJlY2F1c2UgSQotbm93IHVzZSB0aGUgZG14X3N3X2ZpbHRlciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGRteF9zd19maWx0ZXJfcGFja2V0LiBJIGhvcGUgdGhlCi1saW51eC1kdmIgc29mdHdhcmUgZmlsdGVyIGlzIGFibGUgdG8gZ2V0IHRoZSBiZXN0IG9mIHRoZSBnYXJibGVkIFRTLgotCi1UaGUgYnVnLCB3aGVyZSB0aGUgVFMgaXMgZGlzdG9ydGVkIGJ5IGEgaGVhdnkgdXNhZ2Ugb2YgdGhlIGRldmljZSBpcyBnb25lCi1kZWZpbml0ZWx5LiBBbGwgZGlidXNiLWRldmljZXMgSSB3YXMgdXNpbmcgKFR3aW5oYW4sIEt3b3JsZCwgRGlCY29tKSBhcmUKLXdvcmtpbmcgbGlrZSBjaGFybSBub3cgd2l0aCBWRFIuIFNvbWV0aW1lcyBJIGV2ZW4gd2FzIGFibGUgdG8gcmVjb3JkIGEgY2hhbm5lbAotYW5kIHdhdGNoIGFub3RoZXIgb25lLgotCi0yLjMuIENvbW1lbnRzCi0KLVBhdGNoZXMsIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucyBhcmUgdmVyeSB2ZXJ5IHdlbGNvbWUuCi0KLTMuIEFja25vd2xlZGdlbWVudHMKLQlBbWF1cnkgRGVtb2wgKGFkZW1vbEBkaWJjb20uZnIpIGFuZCBGcmFuY29pcyBLYW5vdW5uaWtvZmYgZnJvbSBEaUJjb20gZm9yCi0gICAgcHJvdmlkaW5nIHNwZWNzLCBjb2RlIGFuZCBoZWxwLCBvbiB3aGljaCB0aGUgZHZiLWRpYnVzYiwgZGliMzAwMG1iIGFuZAotICAgIGRpYjMwMDBtYyBhcmUgYmFzZWQuCi0KLSAgIERhdmlkIE1hdHRoZXdzIGZvciBpZGVudGlmeWluZyBhIG5ldyBkZXZpY2UgdHlwZSAoQXJ0ZWMgVDEgd2l0aCBBTjIyMzUpCi0gICAgYW5kIGZvciBleHRlbmRpbmcgZGlidXNiIHdpdGggcmVtb3RlIGNvbnRyb2wgZXZlbnQgaGFuZGxpbmcuIFRoYW5rIHlvdS4KLQotICAgQWxleCBXb29kcyBmb3IgZnJlcXVlbnRseSBhbnN3ZXJpbmcgcXVlc3Rpb24gYWJvdXQgdXNiIGFuZCBkdmIKLSAgICBzdHVmZiwgYSBiaWcgdGhhbmsgeW91LgotCi0gICBCZXJuZCBXYWduZXIgZm9yIGhlbHBpbmcgd2l0aCBodWdlIGJ1ZyByZXBvcnRzIGFuZCBkaXNjdXNzaW9ucy4KLQotICAgR3VubmFyIFdpdHRpY2ggYW5kIEpvYWNoaW0gdm9uIENhcm9uIGZvciB0aGVpciB0cnVzdCBmb3IgZ2l2aW5nIG1lCi0gICAgcm9vdC1zaGVsbHMgb24gdGhlaXIgbWFjaGluZXMgdG8gaW1wbGVtZW50IHN1cHBvcnQgZm9yIG5ldyBkZXZpY2VzLgotCi0gICBTb21lIGd1eXMgb24gdGhlIGxpbnV4LWR2YiBtYWlsaW5nIGxpc3QgZm9yIGVuY291cmFnaW5nIG1lCi0KLSAgIFBldGVyIFNjaGlsZG1hbm4gPnBldGVyLnNjaGlsZG1hbm4tbm9zcGFtLWF0LXdlYi5kZTwgZm9yIGhpcwotICAgIHVzZXItbGV2ZWwgZmlybXdhcmUgbG9hZGVyLCB3aGljaCBzYXZlcyBhIGxvdCBvZiB0aW1lCi0gICAgKHdoZW4gd3JpdGluZyB0aGUgdnA3MDQxIGRyaXZlcikKLQotICAgVWxmIEhlcm1lbmF1IGZvciBoZWxwaW5nIG1lIG91dCB3aXRoIHRyYWRpdGlvbmFsIGNoaW5lc2UuCi0KLSAgIEFuZHLpIFNtb2t0dW4gYW5kIENocmlzdGlhbiBGcvZtbWVsIGZvciBzdXBwb3J0aW5nIG1lIHdpdGgKLSAgICBoYXJkd2FyZSBhbmQgbGlzdGVuaW5nIHRvIG15IHByb2JsZW1zIHZlcnkgcGF0aWVudApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgYi9Eb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA3OTdlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IKQEAgLTAsMCArMSwyMzIgQEAKK0RvY3VtZW50YXRpb24gZm9yIGR2Yi11c2ItZnJhbWV3b3JrIG1vZHVsZSBhbmQgaXRzIGRldmljZXMKKworSWRlYSBiZWhpbmQgdGhlIGR2Yi11c2ItZnJhbWV3b3JrCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW4gTWFyY2ggMjAwNSBJIGdvdCB0aGUgbmV3IFR3aW5oYW4gVVNCMi4wIERWQi1UIGRldmljZS4gVGhleSBwcm92aWRlZCBzcGVjcyBhbmQgYSBmaXJtd2FyZS4KKworUXVpdGUga2VlbiBJIHdhbnRlZCB0byBwdXQgdGhlIGRyaXZlciAod2l0aCBzb21lIHF1aXJrcyBvZiBjb3Vyc2UpIGludG8gZGlidXNiLgorQWZ0ZXIgcmVhZGluZyBzb21lIHNwZWNzIGFuZCBkb2luZyBzb21lIFVTQiBzbm9vcGluZywgaXQgcmVhbGl6ZWQsIHRoYXQgdGhlCitkaWJ1c2ItZHJpdmVyIHdvdWxkIGJlIGEgY29tcGxldGUgbWVzcyBhZnRlcndhcmRzLiBTbyBJIGRlY2lkZWQgdG8gZG8gaXQgaW4gYQorZGlmZmVyZW50IHdheTogV2l0aCB0aGUgaGVscCBvZiBhIGR2Yi11c2ItZnJhbWV3b3JrLgorCitUaGUgZnJhbWV3b3JrIHByb3ZpZGVzIGdlbmVyaWMgZnVuY3Rpb25zIChtb3N0bHkga2VybmVsIEFQSSBjYWxscyksIHN1Y2ggYXM6CisKKy0gVHJhbnNwb3J0IFN0cmVhbSBVUkIgaGFuZGxpbmcgaW4gY29uanVuY3Rpb24gd2l0aCBkdmItZGVtdXgtZmVlZC1jb250cm9sCisgIChidWxrIGFuZCBpc29jIGFyZSBzdXBwb3J0ZWQpCistIHJlZ2lzdGVyaW5nIHRoZSBkZXZpY2UgZm9yIHRoZSBEVkItQVBJCistIHJlZ2lzdGVyaW5nIGFuIEkyQy1hZGFwdGVyIGlmIGFwcGxpY2FibGUKKy0gcmVtb3RlLWNvbnRyb2wvaW5wdXQtZGV2aWNlIGhhbmRsaW5nCistIGZpcm13YXJlIHJlcXVlc3RpbmcgYW5kIGxvYWRpbmcgKGN1cnJlbnRseSBqdXN0IGZvciB0aGUgQ3lwcmVzcyBVU0IKKyAgY29udHJvbGxlcnMpCistIG90aGVyIGZ1bmN0aW9ucy9tZXRob2RzIHdoaWNoIGNhbiBiZSBzaGFyZWQgYnkgc2V2ZXJhbCBkcml2ZXJzIChzdWNoIGFzCisgIGZ1bmN0aW9ucyBmb3IgYnVsay1jb250cm9sLWNvbW1hbmRzKQorLSBUT0RPOiBhIEkyQy1jaHVua2VyLiBJdCBjcmVhdGVzIGRldmljZS1zcGVjaWZpYyBjaHVua3Mgb2YgcmVnaXN0ZXItYWNjZXNzZXMKKyAgZGVwZW5kaW5nIG9uIGxlbmd0aCBvZiBhIHJlZ2lzdGVyIGFuZCB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IGNhbiBiZQorICBtdWx0aS13cml0dGVuIGFuZCBtdWx0aS1yZWFkLgorCitUaGUgc291cmNlIGNvZGUgb2YgdGhlIHBhcnRpY3VsYXIgRFZCIFVTQiBkZXZpY2VzIGRvZXMganVzdCB0aGUgY29tbXVuaWNhdGlvbgord2l0aCB0aGUgZGV2aWNlIHZpYSB0aGUgYnVzLiBUaGUgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBEVkItQVBJLWZ1bmN0aW9uYWxpdHkKK2lzIGRvbmUgdmlhIGNhbGxiYWNrcywgYXNzaWduZWQgaW4gYSBzdGF0aWMgZGV2aWNlLWRlc2NyaXB0aW9uIChzdHJ1Y3QKK2R2Yl91c2JfZGV2aWNlKSBlYWNoIGRldmljZS1kcml2ZXIgaGFzIHRvIGhhdmUuCisKK0ZvciBhbiBleGFtcGxlIGhhdmUgYSBsb29rIGluIGRyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1Ki4KKworT2JqZWN0aXZlIGlzIHRvIG1pZ3JhdGUgYWxsIHRoZSB1c2ItZGV2aWNlcyAoZGlidXNiLCBjaW5lcmd5VDIsIG1heWJlIHRoZQordHR1c2I7IGZsZXhjb3AtdXNiIGFscmVhZHkgYmVuZWZpdHMgZnJvbSB0aGUgZ2VuZXJpYyBmbGV4Y29wLWRldmljZSkgdG8gdXNlCit0aGUgZHZiLXVzYi1saWIuCisKK1RPRE86IGR5bmFtaWMgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBvZiB0aGUgcGlkLWZpbHRlciBpbiByZWdhcmQgdG8gbnVtYmVyIG9mCitmZWVkcyByZXF1ZXN0ZWQuCisKK1N1cHBvcnRlZCBkZXZpY2VzCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworU2VlIHRoZSBMaW51eFRWIERWQiBXaWtpIGF0IHd3dy5saW51eHR2Lm9yZyBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mCitjYXJkcy9kcml2ZXJzL2Zpcm13YXJlczoKKworaHR0cDovL3d3dy5saW51eHR2Lm9yZy93aWtpL2luZGV4LnBocC9EVkJfVVNCCisKKzAuIEhpc3RvcnkgJiBOZXdzOgorICAyMDA1LTA2LTMwIC0gYWRkZWQgc3VwcG9ydCBmb3IgV2lkZVZpZXcgV1QtMjIwVSAoVGhhbmtzIHRvIFN0ZXZlIENoYW5nKQorICAyMDA1LTA1LTMwIC0gYWRkZWQgYmFzaWMgaXNvY2hyb25vdXMgc3VwcG9ydCB0byB0aGUgZHZiLXVzYi1mcmFtZXdvcmsKKyAgICAgICAgICAgICAgIGFkZGVkIHN1cHBvcnQgZm9yIENvbmV4YW50IEh5YnJpZCByZWZlcmVuY2UgZGVzaWduIGFuZCBOZWJ1bGEgRGlnaVRWIFVTQgorICAyMDA1LTA0LTE3IC0gYWxsIGRpYnVzYiBkZXZpY2VzIHBvcnRlZCB0byBtYWtlIHVzZSBvZiB0aGUgZHZiLXVzYi1mcmFtZXdvcmsKKyAgMjAwNS0wNC0wMiAtIHJlLWVuYWJsZWQgYW5kIGltcHJvdmVkIHJlbW90ZSBjb250cm9sIGNvZGUuCisgIDIwMDUtMDMtMzEgLSBwb3J0ZWQgdGhlIFlha3Vtby9IYW1hL1R5cGhvb24gRFZCLVQgVVNCMi4wIGRldmljZSB0byBkdmItdXNiLgorICAyMDA1LTAzLTMwIC0gZmlyc3QgY29tbWl0IG9mIHRoZSBkdmItdXNiLW1vZHVsZSBiYXNlZCBvbiB0aGUgZGlidXNiLXNvdXJjZS4gRmlyc3QgZGV2aWNlIGlzIGEgbmV3IGRyaXZlciBmb3IgdGhlCisgICAgICAgICAgICAgICBUd2luaGFuRFRWIEFscGhhIC8gTWFnaWNCb3ggSUkgVVNCMi4wLW9ubHkgRFZCLVQgZGV2aWNlLgorCisgIChjaGFuZ2UgZnJvbSBkdmItZGlidXNiIHRvIGR2Yi11c2IpCisgIDIwMDUtMDMtMjggLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgQVZlck1lZGlhIEF2ZXJUViBEVkItVCBVU0IyLjAgZGV2aWNlIChUaGFua3MgdG8gR2xlbiBIYXJyaXMgYW5kIEppdW4tS3VlaSBKdW5nLCBBVmVyTWVkaWEpCisgIDIwMDUtMDMtMTQgLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgVHlwaG9vbi9ZYWt1bW8vSEFNQSBEVkItVCBtb2JpbGUgVVNCMi4wCisgIDIwMDUtMDItMTEgLSBhZGRlZCBzdXBwb3J0IGZvciB0aGUgS1dvcmxkL0FEU1RlY2ggSW5zdGFudCBEVkItVCBVU0IyLjAuIFRoYW5rcyBhIGxvdCB0byBKb2FjaGltIHZvbiBDYXJvbgorICAyMDA1LTAyLTAyIC0gYWRkZWQgc3VwcG9ydCBmb3IgdGhlIEhhdXBwYXVnZSBXaW4tVFYgTm92YS1UIFVTQjIKKyAgMjAwNS0wMS0zMSAtIGRpc3RvcnRlZCBzdHJlYW1pbmcgaXMgZ29uZSBmb3IgVVNCMS4xIGRldmljZXMKKyAgMjAwNS0wMS0xMyAtIG1vdmVkIHRoZSBtaXJyb3JlZCBwaWRfZmlsdGVyX3RhYmxlIGJhY2sgdG8gZHZiLWRpYnVzYgorICAgICAgICAgICAgIC0gZmlyc3QgYWxtb3N0IHdvcmtpbmcgdmVyc2lvbiBmb3IgSGFuZlRlayBVTVQtMDEwCisgICAgICAgICAgICAgLSBmb3VuZCBvdXQsIHRoYXQgWWFrdW1vL0hBTUEvVHlwaG9vbiBhcmUgcHJlZGVjZXNzb3JzIG9mIHRoZSBIYW5mVGVrIFVNVC0wMTAKKyAgMjAwNS0wMS0xMCAtIHJlZmFjdG9yaW5nIGNvbXBsZXRlZCwgbm93IGV2ZXJ5dGhpbmcgaXMgdmVyeSBkZWxpZ2h0ZnVsCisgICAgICAgICAgICAgLSB0dW5lciBxdWlya3MgZm9yIHNvbWUgd2VpcmQgZGV2aWNlcyAoQXJ0ZWMgVDEgQU4yMjM1IGRldmljZSBoYXMgc29tZXRpbWVzIGEKKyAgICAgICAgICAgICAgIFBhbmFzb25pYyBUdW5lciBhc3NlbWJsZWQpLiBUdW5lcnByb2JpbmcgaW1wbGVtZW50ZWQuIFRoYW5rcyBhIGxvdCB0byBHdW5uYXIgV2l0dGljaC4KKyAgMjAwNC0xMi0yOSAtIGFmdGVyIHNldmVyYWwgZGF5cyBvZiBzdHJ1Z2dsaW5nIGFyb3VuZCBidWcgb2Ygbm8gcmV0dXJuaW5nIFVSQnMgZml4ZWQuCisgIDIwMDQtMTItMjYgLSByZWZhY3RvcmVkIHRoZSBkaWJ1c2ItZHJpdmVyLCBzcGxpdHRlZCBpbnRvIHNlcGFyYXRlIGZpbGVzCisgICAgICAgICAgICAgLSBpMmMtcHJvYmluZyBlbmFibGVkCisgIDIwMDQtMTItMDYgLSBwb3NzaWJpbGl0eSBmb3IgZGVtb2QgaTJjLWFkZHJlc3MgcHJvYmluZworICAgICAgICAgICAgIC0gbmV3IHVzYiBJRHMgKENvbXBybywgQXJ0ZWMpCisgIDIwMDQtMTEtMjMgLSBtZXJnZWQgY2hhbmdlcyBmcm9tIERpQjMwMDBNQ192ZXIyLjEKKyAgICAgICAgICAgICAtIHJldmlzZWQgdGhlIGRlYnVnZ2luZworICAgICAgICAgICAgIC0gcG9zc2liaWxpdHkgdG8gZGVsaXZlciB0aGUgY29tcGxldGUgVFMgZm9yIFVTQjIuMAorICAyMDA0LTExLTIxIC0gZmlyc3Qgd29ya2luZyB2ZXJzaW9uIG9mIHRoZSBkaWIzMDAwbWMvcCBmcm9udGVuZCBkcml2ZXIuCisgIDIwMDQtMTEtMTIgLSBhZGRlZCBhZGRpdGlvbmFsIHJlbW90ZSBjb250cm9sIGtleXMuIFRoYW5rcyB0byBVd2UgSGFua2UuCisgIDIwMDQtMTEtMDcgLSBhZGRlZCByZW1vdGUgY29udHJvbCBzdXBwb3J0LiBUaGFua3MgdG8gRGF2aWQgTWF0dGhld3MuCisgIDIwMDQtMTEtMDUgLSBhZGRlZCBzdXBwb3J0IGZvciBhIG5ldyBkZXZpY2VzIChHcmFuZHRlYy9BdmVybWVkaWEvQXJ0ZWMpCisgICAgICAgICAgICAgLSBtZXJnZWQgbXkgY2hhbmdlcyAoZm9yIGRpYjMwMDBtYi9kaWJ1c2IpIHRvIHRoZSBGRV9SRUZBQ1RPUklORywgYmVjYXVzZSBpdCBiZWNhbWUgSEVBRAorICAgICAgICAgICAgIC0gbW92ZWQgdHJhbnNmZXIgY29udHJvbCAocGlkIGZpbHRlciwgZmlmbyBjb250cm9sKSBmcm9tIHVzYiBkcml2ZXIgdG8gZnJvbnRlbmQsIGl0IHNlZW1zCisgICAgICAgICAgICAgICBiZXR0ZXIgc2V0dGxlZCB0aGVyZSAoYWRkZWQgeGZlcl9vcHMtc3RydWN0KQorICAgICAgICAgICAgIC0gY3JlYXRlZCBhIGNvbW1vbiBmaWxlcyBmb3IgZnJvbnRlbmRzIChtYy9wL21iKQorICAyMDA0LTA5LTI4IC0gYWRkZWQgc3VwcG9ydCBmb3IgYSBuZXcgZGV2aWNlIChVbmtvd24sIHZlbmRvciBJRCBpcyBIeXBlci1QYWx0ZWspCisgIDIwMDQtMDktMjAgLSBhZGRlZCBzdXBwb3J0IGZvciBhIG5ldyBkZXZpY2UgKENvbXBybyBEVkItVTIwMDApLCB0aGFua3MKKyAgICAgICAgICAgICAgIHRvIEFtYXVyeSBEZW1vbCBmb3IgcmVwb3J0aW5nCisgICAgICAgICAgICAgLSBjaGFuZ2VkIHVzYiBUUyB0cmFuc2ZlciBtZXRob2QgKHNldmVyYWwgdXJicywgc3RvcHBpbmcgdHJhbnNmZXIKKyAgICAgICAgICAgICAgIGJlZm9yZSBzZXR0aW5nIGEgbmV3IHBpZCkKKyAgMjAwNC0wOS0xMyAtIGFkZGVkIHN1cHBvcnQgZm9yIGEgbmV3IGRldmljZSAoQXJ0ZWMgVDEgVVNCIFRWQk9YKSwgdGhhbmtzCisgICAgICAgICAgICAgICB0byBDaHJpc3RpYW4gTW90c2Noa2UgZm9yIHJlcG9ydGluZworICAyMDA0LTA5LTA1IC0gcmVsZWFzZWQgdGhlIGRpYnVzYiBkZXZpY2UgYW5kIGRpYjMwMDBtYi1mcm9udGVuZCBkcml2ZXIKKworICAob2xkIG5ld3MgZm9yIHZwNzA0MS5jKQorICAyMDA0LTA3LTE1IC0gZm91bmQgb3V0LCBieSBhY2NpZGVudCwgdGhhdCB0aGUgZGV2aWNlIGhhcyBhIFRVQTYwMTBYUyBmb3IKKyAgICAgICAgICAgICAgIFBMTAorICAyMDA0LTA3LTEyIC0gZmlndXJlZCBvdXQsIHRoYXQgdGhlIGRyaXZlciBzaG91bGQgYWxzbyB3b3JrIHdpdGggdGhlCisgICAgICAgICAgICAgICBDVFMgUG9ydGFibGUgKENoaW5lc2UgVGVsZXZpc2lvbiBTeXN0ZW0pCisgIDIwMDQtMDctMDggLSBmaXJtd2FyZS1leHRyYWN0aW9uLTIuNDIyLXByb2JsZW0gc29sdmVkLCBkcml2ZXIgaXMgbm93IHdvcmtpbmcKKyAgICAgICAgICAgICAgIHByb3Blcmx5IHdpdGggZmlybXdhcmUgZXh0cmFjdGVkIGZyb20gMi40MjIKKyAgICAgICAgICAgICAtICNpZiBmb3IgMi42LjQgKGR2YiksIGNvbXBpbGUgaXNzdWUKKyAgICAgICAgICAgICAtIGNoYW5nZWQgZmlybXdhcmUgaGFuZGxpbmcsIHNlZSB2cDcwNDEudHh0IHNlYyAxLjEKKyAgMjAwNC0wNy0wMiAtIHNvbWUgdHVuZXIgbW9kaWZpY2F0aW9ucywgdjAuMSwgY2xlYW51cHMsIGZpcnN0IHB1YmxpYworICAyMDA0LTA2LTI4IC0gbm93IHVzaW5nIHRoZSBkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMsIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgICAgIHJ1bnMgZmluZSBub3cKKyAgMjAwNC0wNi0yNyAtIGFibGUgdG8gd2F0Y2ggYW5kIHN3aXRjaGluZyBjaGFubmVscyAocHJlLWFscGhhKQorICAgICAgICAgICAgIC0gbm8gc2VjdGlvbiBmaWx0ZXJpbmcgeWV0CisgIDIwMDQtMDYtMDYgLSBmaXJzdCBUUyByZWNlaXZlZCwgYnV0IGtlcm5lbCBvb3BzIDovCisgIDIwMDQtMDUtMTQgLSBmaXJtd2FyZSBsb2FkZXIgaXMgd29ya2luZworICAyMDA0LTA1LTExIC0gc3RhcnQgd3JpdGluZyB0aGUgZHJpdmVyCisKKzEuIEhvdyB0byB1c2U/CisxLjEuIEZpcm13YXJlCisKK01vc3Qgb2YgdGhlIFVTQiBkcml2ZXJzIG5lZWQgdG8gZG93bmxvYWQgYSBmaXJtd2FyZSB0byB0aGUgZGV2aWNlIGJlZm9yZSBzdGFydAord29ya2luZy4KKworSGF2ZSBhIGxvb2sgYXQgdGhlIFdpa2lwYWdlIGZvciB0aGUgRFZCLVVTQi1kcml2ZXJzIHRvIGZpbmQgb3V0LCB3aGljaCBmaXJtd2FyZQoreW91IG5lZWQgZm9yIHlvdXIgZGV2aWNlOgorCitodHRwOi8vd3d3LmxpbnV4dHYub3JnL3dpa2kvaW5kZXgucGhwL0RWQl9VU0IKKworMS4yLiBDb21waWxpbmcKKworU2luY2UgdGhlIGRyaXZlciBpcyBpbiB0aGUgbGludXgga2VybmVsLCBhY3RpdmF0aW5nIHRoZSBkcml2ZXIgaW4KK3lvdXIgZmF2b3JpdGUgY29uZmlnLWVudmlyb25tZW50IHNob3VsZCBzdWZmaWNpZW50LiBJIHJlY29tbWVuZAordG8gY29tcGlsZSB0aGUgZHJpdmVyIGFzIG1vZHVsZS4gSG90cGx1ZyBkb2VzIHRoZSByZXN0LgorCitJZiB5b3UgdXNlIGR2Yi1rZXJuZWwgZW50ZXIgdGhlIGJ1aWxkLTIuNiBkaXJlY3RvcnkgcnVuICdtYWtlJyBhbmQgJ2luc21vZC5zaAorbG9hZCcgYWZ0ZXJ3YXJkcy4KKworMS4zLiBMb2FkaW5nIHRoZSBkcml2ZXJzCisKK0hvdHBsdWcgaXMgYWJsZSB0byBsb2FkIHRoZSBkcml2ZXIsIHdoZW4gaXQgaXMgbmVlZGVkIChiZWNhdXNlIHlvdSBwbHVnZ2VkCitpbiB0aGUgZGV2aWNlKS4KKworSWYgeW91IHdhbnQgdG8gZW5hYmxlIGRlYnVnIG91dHB1dCwgeW91IGhhdmUgdG8gbG9hZCB0aGUgZHJpdmVyIG1hbnVhbGx5IGFuZAorZnJvbSB3aXRoaW5nIHRoZSBkdmIta2VybmVsIGN2cyByZXBvc2l0b3J5LgorCitmaXJzdCBoYXZlIGEgbG9vaywgd2hpY2ggZGVidWcgbGV2ZWwgYXJlIGF2YWlsYWJsZToKKworbW9kaW5mbyBkdmItdXNiCittb2RpbmZvIGR2Yi11c2ItdnA3MDQ1CitldGMuCisKK21vZHByb2JlIGR2Yi11c2IgZGVidWc9PGxldmVsPgorbW9kcHJvYmUgZHZiLXVzYi12cDcwNDUgZGVidWc9PGxldmVsPgorZXRjLgorCitzaG91bGQgZG8gdGhlIHRyaWNrLgorCitXaGVuIHRoZSBkcml2ZXIgaXMgbG9hZGVkIHN1Y2Nlc3NmdWxseSwgdGhlIGZpcm13YXJlIGZpbGUgd2FzIGluCit0aGUgcmlnaHQgcGxhY2UgYW5kIHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkLCB0aGUgIlBvd2VyIi1MRUQgc2hvdWxkIGJlCit0dXJuZWQgb24uCisKK0F0IHRoaXMgcG9pbnQgeW91IHNob3VsZCBiZSBhYmxlIHRvIHN0YXJ0IGEgZHZiLWNhcGFibGUgYXBwbGljYXRpb24uIEknbSB1c2UKKyh0fHMpemFwLCBtcGxheWVyIGFuZCBkdmJzY2FuIHRvIHRlc3QgdGhlIGJhc2ljcy4gVkRSLXhpbmUgcHJvdmlkZXMgdGhlCitsb25nLXRlcm0gdGVzdCBzY2VuYXJpby4KKworMi4gS25vd24gcHJvYmxlbXMgYW5kIGJ1Z3MKKworLSBEb24ndCByZW1vdmUgdGhlIFVTQiBkZXZpY2Ugd2hpbGUgcnVubmluZyBhbiBEVkIgYXBwbGljYXRpb24sIHlvdXIgc3lzdGVtCisgIHdpbGwgZ28gY3Jhenkgb3IgZGllIG1vc3QgbGlrZWx5LgorCisyLjEuIEFkZGluZyBzdXBwb3J0IGZvciBkZXZpY2VzCisKK1RPRE8KKworMi4yLiBVU0IxLjEgQmFuZHdpZHRoIGxpbWl0YXRpb24KKworQSBsb3Qgb2YgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgZGV2aWNlcyBhcmUgVVNCMS4xIGFuZCB0aHVzIHRoZXkgaGF2ZSBhCittYXhpbXVtIGJhbmR3aWR0aCBvZiBhYm91dCA1LTYgTUJpdC9zIHdoZW4gY29ubmVjdGVkIHRvIGEgVVNCMi4wIGh1Yi4KK1RoaXMgaXMgbm90IGVub3VnaCBmb3IgcmVjZWl2aW5nIHRoZSBjb21wbGV0ZSB0cmFuc3BvcnQgc3RyZWFtIG9mIGEKK0RWQi1UIGNoYW5uZWwgKHdoaWNoIGlzIGFib3V0IDE2IE1CaXQvcykuIE5vcm1hbGx5IHRoaXMgaXMgbm90IGEKK3Byb2JsZW0sIGlmIHlvdSBvbmx5IHdhbnQgdG8gd2F0Y2ggVFYgKHRoaXMgZG9lcyBub3QgYXBwbHkgZm9yIEhEVFYpLAorYnV0IHdhdGNoaW5nIGEgY2hhbm5lbCB3aGlsZSByZWNvcmRpbmcgYW5vdGhlciBjaGFubmVsIG9uIHRoZSBzYW1lCitmcmVxdWVuY3kgc2ltcGx5IGRvZXMgbm90IHdvcmsgdmVyeSB3ZWxsLiBUaGlzIGFwcGxpZXMgdG8gYWxsIFVTQjEuMQorRFZCLVQgZGV2aWNlcywgbm90IGp1c3QgdGhlIGR2Yi11c2ItZGV2aWNlcykKKworVGhlIGJ1Zywgd2hlcmUgdGhlIFRTIGlzIGRpc3RvcnRlZCBieSBhIGhlYXZ5IHVzYWdlIG9mIHRoZSBkZXZpY2UgaXMgZ29uZQorZGVmaW5pdGVseS4gQWxsIGR2Yi11c2ItZGV2aWNlcyBJIHdhcyB1c2luZyAoVHdpbmhhbiwgS3dvcmxkLCBEaUJjb20pIGFyZQord29ya2luZyBsaWtlIGNoYXJtIG5vdyB3aXRoIFZEUi4gU29tZXRpbWVzIEkgZXZlbiB3YXMgYWJsZSB0byByZWNvcmQgYSBjaGFubmVsCithbmQgd2F0Y2ggYW5vdGhlciBvbmUuCisKKzIuMy4gQ29tbWVudHMKKworUGF0Y2hlcywgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zIGFyZSB2ZXJ5IHZlcnkgd2VsY29tZS4KKworMy4gQWNrbm93bGVkZ2VtZW50cworICAgQW1hdXJ5IERlbW9sIChhZGVtb2xAZGliY29tLmZyKSBhbmQgRnJhbmNvaXMgS2Fub3Vubmlrb2ZmIGZyb20gRGlCY29tIGZvcgorICAgIHByb3ZpZGluZyBzcGVjcywgY29kZSBhbmQgaGVscCwgb24gd2hpY2ggdGhlIGR2Yi1kaWJ1c2IsIGRpYjMwMDBtYiBhbmQKKyAgICBkaWIzMDAwbWMgYXJlIGJhc2VkLgorCisgICBEYXZpZCBNYXR0aGV3cyBmb3IgaWRlbnRpZnlpbmcgYSBuZXcgZGV2aWNlIHR5cGUgKEFydGVjIFQxIHdpdGggQU4yMjM1KQorICAgIGFuZCBmb3IgZXh0ZW5kaW5nIGRpYnVzYiB3aXRoIHJlbW90ZSBjb250cm9sIGV2ZW50IGhhbmRsaW5nLiBUaGFuayB5b3UuCisKKyAgIEFsZXggV29vZHMgZm9yIGZyZXF1ZW50bHkgYW5zd2VyaW5nIHF1ZXN0aW9uIGFib3V0IHVzYiBhbmQgZHZiCisgICAgc3R1ZmYsIGEgYmlnIHRoYW5rIHlvdS4KKworICAgQmVybmQgV2FnbmVyIGZvciBoZWxwaW5nIHdpdGggaHVnZSBidWcgcmVwb3J0cyBhbmQgZGlzY3Vzc2lvbnMuCisKKyAgIEd1bm5hciBXaXR0aWNoIGFuZCBKb2FjaGltIHZvbiBDYXJvbiBmb3IgdGhlaXIgdHJ1c3QgZm9yIHByb3ZpZGluZworICAgIHJvb3Qtc2hlbGxzIG9uIHRoZWlyIG1hY2hpbmVzIHRvIGltcGxlbWVudCBzdXBwb3J0IGZvciBuZXcgZGV2aWNlcy4KKworICAgQWxsYW4gVGhpcmQgYW5kIE1pY2hhZWwgSHV0Y2hpbnNvbiBmb3IgdGhlaXIgaGVscCB0byB3cml0ZSB0aGUgTmVidWxhCisgICAgZGlnaXR2LWRyaXZlci4KKworICAgR2xlbiBIYXJyaXMgZm9yIGJyaW5naW5nIHVwLCB0aGF0IHRoZXJlIGlzIGEgbmV3IGRpYnVzYi1kZXZpY2UgYW5kIEppdW4tS3VlaQorICAgIEp1bmcgZnJvbSBBVmVyTWVkaWEgd2hvIGtpbmRseSBwcm92aWRlZCBhIHNwZWNpYWwgZmlybXdhcmUgdG8gZ2V0IHRoZSBkZXZpY2UKKyAgICB1cCBhbmQgcnVubmluZyBpbiBMaW51eC4KKworICAgSmVubmlmZXIgQ2hlbiwgSmVmZiBhbmQgSmFjayBmcm9tIFR3aW5oYW4gZm9yIGtpbmRseSBzdXBwb3J0aW5nIGJ5CisJd3JpdGluZyB0aGUgdnA3MDQ1LWRyaXZlci4KKworICAgU3RldmUgQ2hhbmcgZnJvbSBXaWRlVmlldyBmb3IgcHJvdmlkaW5nIGluZm9ybWF0aW9uIGZvciBuZXcgZGV2aWNlcyBhbmQKKwlmaXJtd2FyZSBmaWxlcy4KKworICAgTWljaGFlbCBQYXh0b24gZm9yIHN1Ym1pdHRpbmcgcmVtb3RlIGNvbnRyb2wga2V5bWFwcy4KKworICAgU29tZSBndXlzIG9uIHRoZSBsaW51eC1kdmIgbWFpbGluZyBsaXN0IGZvciBlbmNvdXJhZ2luZyBtZS4KKworICAgUGV0ZXIgU2NoaWxkbWFubiA+cGV0ZXIuc2NoaWxkbWFubi1ub3NwYW0tYXQtd2ViLmRlPCBmb3IgaGlzCisgICAgdXNlci1sZXZlbCBmaXJtd2FyZSBsb2FkZXIsIHdoaWNoIHNhdmVzIGEgbG90IG9mIHRpbWUKKyAgICAod2hlbiB3cml0aW5nIHRoZSB2cDcwNDEgZHJpdmVyKQorCisgICBVbGYgSGVybWVuYXUgZm9yIGhlbHBpbmcgbWUgb3V0IHdpdGggdHJhZGl0aW9uYWwgY2hpbmVzZS4KKworICAgQW5kcukgU21va3R1biBhbmQgQ2hyaXN0aWFuIEZy9m1tZWwgZm9yIHN1cHBvcnRpbmcgbWUgd2l0aAorICAgIGhhcmR3YXJlIGFuZCBsaXN0ZW5pbmcgdG8gbXkgcHJvYmxlbXMgdmVyeSBwYXRpZW50bHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQgYi9Eb2N1bWVudGF0aW9uL2R2Yi9idDh4eC50eHQKaW5kZXggZDY0NDMwYi4uZTZiOGQwNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvYnQ4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2J0OHh4LnR4dApAQCAtMSw2OSArMSw1NSBAQAotSG93IHRvIGdldCB0aGUgTmVidWxhLCBQQ1RWIGFuZCBUd2luaGFuIERTVCBjYXJkcyB3b3JraW5nCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0hvdyB0byBnZXQgdGhlIE5lYnVsYSBFbGVjdHJvbmljcyBEaWdpVFYsIFBpbm5hY2xlIFBDVFYgU2F0LCBUd2luaGFuIERTVCArIGNsb25lcyB3b3JraW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1UaGlzIGNsYXNzIG9mIGNhcmRzIGhhcyBhIGJ0ODc4YSBhcyB0aGUgUENJIGludGVyZmFjZSwgYW5kCi1yZXF1aXJlIHRoZSBidHR2IGRyaXZlci4KKzEpIEdlbmVyYWwgaW5mb3JtYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT0KIAotUGxlYXNlIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHdhcm5pbmcgYWJvdXQgdGhlIGJ0dHYgbW9kdWxlCi1vcHRpb25zIGJlbG93IGZvciB0aGUgRFNUIGNhcmQuCitUaGlzIGNsYXNzIG9mIGNhcmRzIGhhcyBhIGJ0ODc4YSBjaGlwIGFzIHRoZSBQQ0kgaW50ZXJmYWNlLgorVGhlIGRpZmZlcmVudCBjYXJkIGRyaXZlcnMgcmVxdWlyZSB0aGUgYnR0diBkcml2ZXIgdG8gcHJvdmlkZSB0aGUgbWVhbnMKK3RvIGFjY2VzcyB0aGUgaTJjIGJ1cyBhbmQgdGhlIGdwaW8gcGlucyBvZiB0aGUgYnQ4eHggY2hpcHNldC4KIAotMSkgR2VuZXJhbCBpbmZvcm1hdGlvbnMKLT09PT09PT09PT09PT09PT09PT09PT09CisyKSBDb21waWxhdGlvbiBydWxlcyBmb3IgS2VybmVsID49IDIuNi4xMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlc2UgZHJpdmVycyByZXF1aXJlIHRoZSBidHR2IGRyaXZlciB0byBwcm92aWRlIHRoZSBtZWFucyB0byBhY2Nlc3MKLXRoZSBpMmMgYnVzIGFuZCB0aGUgZ3BpbyBwaW5zIG9mIHRoZSBidDh4eCBjaGlwc2V0LgorRW5hYmxlIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKIAotQmVjYXVzZSBvZiB0aGlzLCB5b3UgbmVlZCB0byBlbmFibGUKICJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIKLSAgPT4gIlZpZGVvIEZvciBMaW51eCIgPT4gIkJUODQ4IFZpZGVvIEZvciBMaW51eCIKLQotRnVydGhlcm1vcmUgeW91IG5lZWQgdG8gZW5hYmxlCisgPT4gIlZpZGVvIEZvciBMaW51eCIgPT4gIkJUODQ4IFZpZGVvIEZvciBMaW51eCIKICJEZXZpY2UgZHJpdmVycyIgPT4gIk11bHRpbWVkaWEgZGV2aWNlcyIgPT4gIkRpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMiCi0gID0+ICJEVkIgZm9yIExpbnV4IiAiRFZCIENvcmUgU3VwcG9ydCIgIk5lYnVsYS9QaW5uYWNsZSBQQ1RWL1R3aW5IYW4gUENJIENhcmRzIgorID0+ICJEVkIgZm9yIExpbnV4IiAiRFZCIENvcmUgU3VwcG9ydCIgIk5lYnVsYS9QaW5uYWNsZSBQQ1RWL1R3aW5IYW4gUENJIENhcmRzIgogCi0yKSBMb2FkaW5nIE1vZHVsZXMKLT09PT09PT09PT09PT09PT09PQorMykgTG9hZGluZyBNb2R1bGVzLCBkZXNjcmliZWQgYnkgdHdvIGFwcHJvYWNoZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEluIGdlbmVyYWwgeW91IG5lZWQgdG8gbG9hZCB0aGUgYnR0diBkcml2ZXIsIHdoaWNoIHdpbGwgaGFuZGxlIHRoZSBncGlvIGFuZAotaTJjIGNvbW11bmljYXRpb24gZm9yIHVzLCBwbHVzIHRoZSBjb21tb24gZHZiLWJ0OHh4IGRldmljZSBkcml2ZXIuCi1UaGUgZnJvbnRlbmRzIGZvciBOZWJ1bGEgKG54dDYwMDApLCBQaW5uYWNsZSBQQ1RWIChjeDI0MTEwKSBhbmQKLVR3aW5IYW4gKGRzdCkgYXJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBkdmItYnQ4eHggZGV2aWNlIGRyaXZlci4KK2kyYyBjb21tdW5pY2F0aW9uIGZvciB1cywgcGx1cyB0aGUgY29tbW9uIGR2Yi1idDh4eCBkZXZpY2UgZHJpdmVyLAord2hpY2ggaXMgY2FsbGVkIHRoZSBiYWNrZW5kLgorVGhlIGZyb250ZW5kcyBmb3IgTmVidWxhIERpZ2lUViAobnh0NjAwMCksIFBpbm5hY2xlIFBDVFYgU2F0IChjeDI0MTEwKSwKK1R3aW5IYW4gRFNUICsgY2xvbmVzIChkc3QgYW5kIGRzdC1jYSkgYXJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBiYWNrZW5kLgorRm9yIGZ1cnRoZXIgZGV0YWlscyBhYm91dCBUd2luSGFuIERTVCArIGNsb25lcyBzZWUgL0RvY3VtZW50YXRpb24vZHZiL2NpLnR4dC4KIAotM2EpIE5lYnVsYSAvIFBpbm5hY2xlIFBDVFYKKzNhKSBUaGUgbWFudWFsIGFwcHJvYWNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb2FkaW5nIG1vZHVsZXM6Cittb2Rwcm9iZSBidHR2Cittb2Rwcm9iZSBkdmItYnQ4eHgKKworVW5sb2FkaW5nIG1vZHVsZXM6Cittb2Rwcm9iZSAtciBkdmItYnQ4eHgKK21vZHByb2JlIC1yIGJ0dHYKKworM2IpIFRoZSBhdXRvbWF0aWMgYXBwcm9hY2gKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICQgbW9kcHJvYmUgYnR0diAobm9ybWFsbHkgYnR0diBpcyBiZWluZyBsb2FkZWQgYXV0b21hdGljYWxseSBieSBrbW9kKQotICAgJCBtb2Rwcm9iZSBkdmItYnQ4eHggKG9yIGp1c3QgcGxhY2UgZHZiLWJ0OHh4IGluIC9ldGMvbW9kdWxlcyBmb3IgYXV0b21hdGljIGxvYWRpbmcpCitJZiBub3QgYWxyZWFkeSBkb25lIGJ5IGluc3RhbGxhdGlvbiwgcGxhY2UgYSBsaW5lIGVpdGhlciBpbgorL2V0Yy9tb2R1bGVzLmNvbmYgb3IgaW4gL2V0Yy9tb2Rwcm9iZS5jb25mIGNvbnRhaW5pbmcgdGhpcyB0ZXh0OgorYWxpYXMgY2hhci1tYWpvci04MQlidHR2CiAKK1RoZW4gcGxhY2UgYSBsaW5lIGluIC9ldGMvbW9kdWxlcyBjb250YWluaW5nIHRoaXMgdGV4dDoKK2R2Yi1idDh4eAogCi0zYikgVHdpbkhhbiBhbmQgQ2xvbmVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAkIG1vZHByb2JlIGJ0dHYgaTJjX2h3PTEgY2FyZD0weDcxCi0gICAkIG1vZHByb2JlIGR2Yi1idDh4eAotICAgJCBtb2Rwcm9iZSBkc3QKLQotVGhlIHZhbHVlIDB4NzEgd2lsbCBvdmVycmlkZSB0aGUgUENJIHR5cGUgZGV0ZWN0aW9uIGZvciBkdmItYnQ4eHgsCi13aGljaCAgaXMgbmVjZXNzYXJ5IGZvciBUd2luSGFuIGNhcmRzLgotCi1JZiB5b3UncmUgaGF2aW5nIGFuIG9sZGVyIGNhcmQgKGJsdWUgY29sb3IgY2lyY3VpdCkgYW5kIGNhcmQ9MHg3MSBsb2NrcwoteW91ciBtYWNoaW5lLCB0cnkgdXNpbmcgMHg2OCwgdG9vLiBJZiB0aGF0IGRvZXMgbm90IHdvcmssIGFzayBvbiB0aGUKLW1haWxpbmcgbGlzdC4KLQotVGhlIERTVCBtb2R1bGUgdGFrZXMgYSBjb3VwbGUgb2YgdXNlZnVsIHBhcmFtZXRlcnMuCi0KLXZlcmJvc2UgdGFrZXMgdmFsdWVzIDAgdG8gNS4gVGhlc2UgdmFsdWVzIGNvbnRyb2wgdGhlIHZlcmJvc2l0eSBsZXZlbC4KLQotZGVidWcgdGFrZXMgdmFsdWVzIDAgYW5kIDEuIFlvdSBjYW4gZWl0aGVyIGRpc2FibGUgb3IgZW5hYmxlIGRlYnVnZ2luZy4KLQotZHN0X2FkZG9ucyB0YWtlcyB2YWx1ZXMgMCBhbmQgMHgyMC4gQSB2YWx1ZSBvZiAwIG1lYW5zIGl0IGlzIGEgRlRBIGNhcmQuCi0weDIwIG1lYW5zIGl0IGhhcyBhIENvbmRpdGlvbmFsIEFjY2VzcyBzbG90LgotCi1UaGUgYXV0b2RlY3RlZCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnl0aGUgY2FyZHMgJ3Jlc3BvbnNlCi1zdHJpbmcnIHdoaWNoIHlvdSBjYW4gc2VlIGluIHlvdXIgbG9ncyBlLmcuCi0KLWRzdF9nZXRfZGV2aWNlX2lkOiBSZWNvZ25pc2UgW0RTVE1DSV0KLQorUmVib290IHlvdXIgc3lzdGVtIGFuZCBoYXZlIGZ1biEKIAogLS0KLUF1dGhvcnM6IFJpY2hhcmQgV2Fsa2VyLCBKYW1pZSBIb25hbiwgTWljaGFlbCBIdW5vbGQsIE1hbnUgQWJyYWhhbQorQXV0aG9yczogUmljaGFyZCBXYWxrZXIsIEphbWllIEhvbmFuLCBNaWNoYWVsIEh1bm9sZCwgTWFudSBBYnJhaGFtLCBVd2UgQnVnbGEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCA3NzUxMWFmLi4xMmRkZTQzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC00Myw2ICs0MywxNCBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorV2hhdDoJUkFXIGRyaXZlciAoQ09ORklHX1JBV19EUklWRVIpCitXaGVuOglEZWNlbWJlciAyMDA1CitXaHk6CWRlY2xhcmVkIG9ic29sZXRlIHNpbmNlIGtlcm5lbCAyLjYuMworCU9fRElSRUNUIGNhbiBiZSB1c2VkIGluc3RlYWQKK1dobzoJQWRyaWFuIEJ1bmsgPGJ1bmtAc3R1c3RhLmRlPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJcmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKCkgLyB1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbigpCiBXaGVuOglBcHJpbCAyMDA1CiBXaHk6CVJlcGxhY2VkIGJ5IC0+Y29tcGF0X2lvY3RsIGluIGZpbGVfb3BlcmF0aW9ucyBhbmQgb3RoZXIgbWV0aG9kCkBAIC0xMTEsMyArMTE5LDE5IEBACiAJd2lsbCBiZSBhdmFpbGFibGUgdW50aWwgcmVtb3ZhbCBvZiBvbGQgbmFtZXMuCiBXaG86CUdyYW50IENvYWR5IDxnY29hZHlAZ21haWwuY29tPgogCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJUENNQ0lBIGNvbnRyb2wgaW9jdGwgKG5lZWRlZCBmb3IgcGNtY2lhLWNzIFtjYXJkbWdyLCBjYXJkY3RsXSkKK1doZW46CU5vdmVtYmVyIDIwMDUKK0ZpbGVzOglkcml2ZXJzL3BjbWNpYS86IHBjbWNpYV9pb2N0bC5jCitXaHk6CVdpdGggdGhlIDE2LWJpdCBQQ01DSUEgc3Vic3lzdGVtIG5vdyBiZWhhdmluZyAoYWxtb3N0KSBsaWtlIGEKKwlub3JtYWwgaG90cGx1Z2dhYmxlIGJ1cywgYW5kIHdpdGggaXQgdXNpbmcgdGhlIGRlZmF1bHQga2VybmVsCisJaW5mcmFzdHJ1Y3R1cmUgKGhvdHBsdWcsIGRyaXZlciBjb3JlLCBzeXNmcykga2VlcGluZyB0aGUgUENNQ0lBCisJY29udHJvbCBpb2N0bCBuZWVkZWQgYnkgY2FyZG1nciBhbmQgY2FyZGN0bCBmcm9tIHBjbWNpYS1jcyBpcworCXVubmVjZXNzYXJ5LCBhbmQgbWFrZXMgZnVydGhlciBjbGVhbnVwcyBhbmQgaW50ZWdyYXRpb24gb2YgdGhlCisJUENNQ0lBIHN1YnN5c3RlbSBpbnRvIHRoZSBMaW51eCBrZXJuZWwgZGV2aWNlIGRyaXZlciBtb2RlbCBtb3JlCisJZGlmZmljdWx0LiBUaGUgZmVhdHVyZXMgcHJvdmlkZWQgYnkgY2FyZG1nciBhbmQgY2FyZGN0bCBhcmUgZWl0aGVyCisJaGFuZGxlZCBieSB0aGUga2VybmVsIGl0c2VsZiBub3cgb3IgYXJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3CisJcGNtY2lhdXRpbHMgcGFja2FnZSBhdmFpbGFibGUgYXQKKwlodHRwOi8va2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL3BjbWNpYS8KK1dobzoJRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQyLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0Mi50eHQKaW5kZXggYjVjYjkxMS4uZDE2MzM0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9leHQyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2V4dDIudHh0CkBAIC01OCw2ICs1OCw4IEBACiAKIG5vYmgJCQkJRG8gbm90IGF0dGFjaCBidWZmZXJfaGVhZHMgdG8gZmlsZSBwYWdlY2FjaGUuCiAKK3hpcAkJCQlVc2UgZXhlY3V0ZSBpbiBwbGFjZSAobm8gY2FjaGluZykgaWYgcG9zc2libGUKKwogZ3JwcXVvdGEsbm9xdW90YSxxdW90YSx1c3JxdW90YQlRdW90YSBvcHRpb25zIGFyZSBzaWxlbnRseSBpZ25vcmVkIGJ5IGV4dDIuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9pbm90aWZ5LnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3MTYwNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQKQEAgLTAsMCArMSwxMzggQEAKKwkJCQkgICAgaW5vdGlmeQorCSAgICAgYSBwb3dlcmZ1bCB5ZXQgc2ltcGxlIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0KKworCisKK0RvY3VtZW50IHN0YXJ0ZWQgMTUgTWFyIDIwMDUgYnkgUm9iZXJ0IExvdmUgPHJtbEBub3ZlbGwuY29tPgorCisoaSkgVXNlciBJbnRlcmZhY2UKKworSW5vdGlmeSBpcyBjb250cm9sbGVkIGJ5IGEgc2V0IG9mIHRocmVlIHN5cyBjYWxscyAKKworRmlyc3Qgc3RlcCBpbiB1c2luZyBpbm90aWZ5IGlzIHRvIGluaXRpYWxpc2UgYW4gaW5vdGlmeSBpbnN0YW5jZQorCisJaW50IGZkID0gaW5vdGlmeV9pbml0ICgpOworCitDaGFuZ2UgZXZlbnRzIGFyZSBtYW5hZ2VkIGJ5ICJ3YXRjaGVzIi4gIEEgd2F0Y2ggaXMgYW4gKG9iamVjdCxtYXNrKSBwYWlyIHdoZXJlCit0aGUgb2JqZWN0IGlzIGEgZmlsZSBvciBkaXJlY3RvcnkgYW5kIHRoZSBtYXNrIGlzIGEgYml0IG1hc2sgb2Ygb25lIG9yIG1vcmUKK2lub3RpZnkgZXZlbnRzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpc2hlcyB0byByZWNlaXZlLiAgU2VlIDxsaW51eC9pbm90aWZ5Lmg+Citmb3IgdmFsaWQgZXZlbnRzLiAgQSB3YXRjaCBpcyByZWZlcmVuY2VkIGJ5IGEgd2F0Y2ggZGVzY3JpcHRvciwgb3Igd2QuCisKK1dhdGNoZXMgYXJlIGFkZGVkIHZpYSBhIHBhdGggdG8gdGhlIGZpbGUuCisKK1dhdGNoZXMgb24gYSBkaXJlY3Rvcnkgd2lsbCByZXR1cm4gZXZlbnRzIG9uIGFueSBmaWxlcyBpbnNpZGUgb2YgdGhlIGRpcmVjdG9yeS4KKworQWRkaW5nIGEgd2F0Y2ggaXMgc2ltcGxlLAorCisJaW50IHdkID0gaW5vdGlmeV9hZGRfd2F0Y2ggKGZkLCBwYXRoLCBtYXNrKTsKKworWW91IGNhbiBhZGQgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdmlhIHNvbWV0aGluZyBsaWtlCisKKwlmb3IgZWFjaCBmaWxlIHRvIHdhdGNoIHsKKwkJaW50IHdkID0gaW5vdGlmeV9hZGRfd2F0Y2ggKGZkLCBmaWxlLCBtYXNrKTsKKwl9CisKK1lvdSBjYW4gdXBkYXRlIGFuIGV4aXN0aW5nIHdhdGNoIGluIHRoZSBzYW1lIG1hbm5lciwgYnkgcGFzc2luZyBpbiBhIG5ldyBtYXNrLgorCitBbiBleGlzdGluZyB3YXRjaCBpcyByZW1vdmVkIHZpYSB0aGUgSU5PVElGWV9JR05PUkUgaW9jdGwsIGZvciBleGFtcGxlCisKKwlpbm90aWZ5X3JtX3dhdGNoIChmZCwgd2QpOworCitFdmVudHMgYXJlIHByb3ZpZGVkIGluIHRoZSBmb3JtIG9mIGFuIGlub3RpZnlfZXZlbnQgc3RydWN0dXJlIHRoYXQgaXMgcmVhZCgyKQorZnJvbSBhIGlub3RpZnkgaW5zdGFuY2UgZmQuICBUaGUgZmlsZW5hbWUgaXMgb2YgZHluYW1pYyBsZW5ndGggYW5kIGZvbGxvd3MgdGhlIAorc3RydWN0LiBJdCBpcyBvZiBzaXplIGxlbi4gIFRoZSBmaWxlbmFtZSBpcyBwYWRkZWQgd2l0aCBudWxsIGJ5dGVzIHRvIGVuc3VyZSAKK3Byb3BlciBhbGlnbm1lbnQuICBUaGlzIHBhZGRpbmcgaXMgcmVmbGVjdGVkIGluIGxlbi4KKworWW91IGNhbiBzbHVycCBtdWx0aXBsZSBldmVudHMgYnkgcGFzc2luZyBhIGxhcmdlIGJ1ZmZlciwgZm9yIGV4YW1wbGUKKworCXNpemVfdCBsZW4gPSByZWFkIChmZCwgYnVmLCBCVUZfTEVOKTsKKworV2lsbCByZXR1cm4gYXMgbWFueSBldmVudHMgYXMgYXJlIGF2YWlsYWJsZSBhbmQgZml0IGluIEJVRl9MRU4uCisKK2VhY2ggaW5vdGlmeSBpbnN0YW5jZSBmZCBpcyBhbHNvIHNlbGVjdCgpLSBhbmQgcG9sbCgpLWFibGUuCisKK1lvdSBjYW4gZmluZCB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBldmVudCBxdWV1ZSB2aWEgdGhlIEZJT05SRUFEIGlvY3RsLgorCitBbGwgd2F0Y2hlcyBhcmUgZGVzdHJveWVkIGFuZCBjbGVhbmVkIHVwIG9uIGNsb3NlLgorCisKKyhpaSkgSW50ZXJuYWwgS2VybmVsIEltcGxlbWVudGF0aW9uCisKK0VhY2ggb3BlbiBpbm90aWZ5IGluc3RhbmNlIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbm90aWZ5X2RldmljZSBzdHJ1Y3R1cmUuCisKK0VhY2ggd2F0Y2ggaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGlub3RpZnlfd2F0Y2ggc3RydWN0dXJlLiAgV2F0Y2hlcyBhcmUgY2hhaW5lZAorb2ZmIG9mIGVhY2ggYXNzb2NpYXRlZCBkZXZpY2UgYW5kIGVhY2ggYXNzb2NpYXRlZCBpbm9kZS4KKworU2VlIGZzL2lub3RpZnkuYyBmb3IgdGhlIGxvY2tpbmcgYW5kIGxpZmV0aW1lIHJ1bGVzLgorCisKKyhpaWkpIFJhdGlvbmFsZQorCitROiBXaGF0IGlzIHRoZSBkZXNpZ24gZGVjaXNpb24gYmVoaW5kIG5vdCB0eWluZyB0aGUgd2F0Y2ggdG8gdGhlIG9wZW4gZmQgb2YKKyAgIHRoZSB3YXRjaGVkIG9iamVjdD8KKworQTogV2F0Y2hlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIG9wZW4gaW5vdGlmeSBkZXZpY2UsIG5vdCBhbiBvcGVuIGZpbGUuCisgICBUaGlzIHNvbHZlcyB0aGUgcHJpbWFyeSBwcm9ibGVtIHdpdGggZG5vdGlmeToga2VlcGluZyB0aGUgZmlsZSBvcGVuIHBpbnMKKyAgIHRoZSBmaWxlIGFuZCB0aHVzLCB3b3JzZSwgcGlucyB0aGUgbW91bnQuICBEbm90aWZ5IGlzIHRoZXJlZm9yZSBpbmZlYXNpYmxlCisgICBmb3IgdXNlIG9uIGEgZGVza3RvcCBzeXN0ZW0gd2l0aCByZW1vdmFibGUgbWVkaWEgYXMgdGhlIG1lZGlhIGNhbm5vdCBiZQorICAgdW5tb3VudGVkLgorCitROiBXaGF0IGlzIHRoZSBkZXNpZ24gZGVjaXNpb24gYmVoaW5kIHVzaW5nIGFuLWZkLXBlci1kZXZpY2UgYXMgb3Bwb3NlZCB0bworICAgYW4gZmQtcGVyLXdhdGNoPworCitBOiBBbiBmZC1wZXItd2F0Y2ggcXVpY2tseSBjb25zdW1lcyBtb3JlIGZpbGUgZGVzY3JpcHRvcnMgdGhhbiBhcmUgYWxsb3dlZCwKKyAgIG1vcmUgZmQncyB0aGFuIGFyZSBmZWFzaWJsZSB0byBtYW5hZ2UsIGFuZCBtb3JlIGZkJ3MgdGhhbiBhcmUgb3B0aW1hbGx5CisgICBzZWxlY3QoKS1hYmxlLiAgWWVzLCByb290IGNhbiBidW1wIHRoZSBwZXItcHJvY2VzcyBmZCBsaW1pdCBhbmQgeWVzLCB1c2VycworICAgY2FuIHVzZSBlcG9sbCwgYnV0IHJlcXVpcmluZyBib3RoIGlzIGEgc2lsbHkgYW5kIGV4dHJhbmVvdXMgcmVxdWlyZW1lbnQuCisgICBBIHdhdGNoIGNvbnN1bWVzIGxlc3MgbWVtb3J5IHRoYW4gYW4gb3BlbiBmaWxlLCBzZXBhcmF0aW5nIHRoZSBudW1iZXIKKyAgIHNwYWNlcyBpcyB0aHVzIHNlbnNpYmxlLiAgVGhlIGN1cnJlbnQgZGVzaWduIGlzIHdoYXQgdXNlci1zcGFjZSBkZXZlbG9wZXJzCisgICB3YW50OiBVc2VycyBpbml0aWFsaXplIGlub3RpZnksIG9uY2UsIGFuZCBhZGQgbiB3YXRjaGVzLCByZXF1aXJpbmcgYnV0IG9uZSBmZAorICAgYW5kIG5vIHR3aWRkbGluZyB3aXRoIGZkIGxpbWl0cy4gIEluaXRpYWxpemluZyBhbiBpbm90aWZ5IGluc3RhbmNlIHR3bworICAgdGhvdXNhbmQgdGltZXMgaXMgc2lsbHkuICBJZiB3ZSBjYW4gaW1wbGVtZW50IHVzZXItc3BhY2UncyBwcmVmZXJlbmNlcyAKKyAgIGNsZWFubHktLWFuZCB3ZSBjYW4sIHRoZSBpZHIgbGF5ZXIgbWFrZXMgc3R1ZmYgbGlrZSB0aGlzIHRyaXZpYWwtLXRoZW4gd2UgCisgICBzaG91bGQuCisKKyAgIFRoZXJlIGFyZSBvdGhlciBnb29kIGFyZ3VtZW50cy4gIFdpdGggYSBzaW5nbGUgZmQsIHRoZXJlIGlzIGEgc2luZ2xlCisgICBpdGVtIHRvIGJsb2NrIG9uLCB3aGljaCBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgcXVldWUgb2YgZXZlbnRzLiAgVGhlIHNpbmdsZQorICAgZmQgcmV0dXJucyBhbGwgd2F0Y2ggZXZlbnRzIGFuZCBhbHNvIGFueSBwb3RlbnRpYWwgb3V0LW9mLWJhbmQgZGF0YS4gIElmCisgICBldmVyeSBmZCB3YXMgYSBzZXBhcmF0ZSB3YXRjaCwKKworICAgLSBUaGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gZ2V0IGV2ZW50IG9yZGVyaW5nLiAgRXZlbnRzIG9uIGZpbGUgZm9vIGFuZAorICAgICBmaWxlIGJhciB3b3VsZCBwb3AgcG9sbCgpIG9uIGJvdGggZmQncywgYnV0IHRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byB0ZWxsCisgICAgIHdoaWNoIGhhcHBlbmVkIGZpcnN0LiAgQSBzaW5nbGUgcXVldWUgdHJpdmlhbGx5IGdpdmVzIHlvdSBvcmRlcmluZy4gIFN1Y2gKKyAgICAgb3JkZXJpbmcgaXMgY3J1Y2lhbCB0byBleGlzdGluZyBhcHBsaWNhdGlvbnMgc3VjaCBhcyBCZWFnbGUuICBJbWFnaW5lCisgICAgICJtdiBhIGIgOyBtdiBiIGEiIGV2ZW50cyB3aXRob3V0IG9yZGVyaW5nLgorCisgICAtIFdlJ2QgaGF2ZSB0byBtYWludGFpbiBuIGZkJ3MgYW5kIG4gaW50ZXJuYWwgcXVldWVzIHdpdGggc3RhdGUsCisgICAgIHZlcnN1cyBqdXN0IG9uZS4gIEl0IGlzIGEgbG90IG1lc3NpZXIgaW4gdGhlIGtlcm5lbC4gIEEgc2luZ2xlLCBsaW5lYXIKKyAgICAgcXVldWUgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgbWFrZXMgc2Vuc2UuCisKKyAgIC0gVXNlci1zcGFjZSBkZXZlbG9wZXJzIHByZWZlciB0aGUgY3VycmVudCBBUEkuICBUaGUgQmVhZ2xlIGd1eXMsIGZvcgorICAgICBleGFtcGxlLCBsb3ZlIGl0LiAgVHJ1c3QgbWUsIEkgYXNrZWQuICBJdCBpcyBub3QgYSBzdXJwcmlzZTogV2hvJ2Qgd2FudAorICAgICB0byBtYW5hZ2UgYW5kIGJsb2NrIG9uIDEwMDAgZmQncyB2aWEgc2VsZWN0PworCisgICAtIFlvdSdkIGhhdmUgdG8gbWFuYWdlIHRoZSBmZCdzLCBhcyBhbiBleGFtcGxlOiBDYWxsIGNsb3NlKCkgd2hlbiB5b3UKKyAgICAgcmVjZWl2ZWQgYSBkZWxldGUgZXZlbnQuCisKKyAgIC0gTm8gd2F5IHRvIGdldCBvdXQgb2YgYmFuZCBkYXRhLgorCisgICAtIDEwMjQgaXMgc3RpbGwgdG9vIGxvdy4gIDstKQorCisgICBXaGVuIHlvdSB0YWxrIGFib3V0IGRlc2lnbmluZyBhIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gdGhhdAorICAgc2NhbGVzIHRvIDEwMDBzIG9mIGRpcmVjdG9yaWVzLCBqdWdnbGluZyAxMDAwcyBvZiBmZCdzIGp1c3QgZG9lcyBub3Qgc2VlbQorICAgdGhlIHJpZ2h0IGludGVyZmFjZS4gIEl0IGlzIHRvbyBoZWF2eS4KKworUTogV2h5IHRoZSBzeXN0ZW0gY2FsbCBhcHByb2FjaD8KKworQTogVGhlIHBvb3IgdXNlci1zcGFjZSBpbnRlcmZhY2UgaXMgdGhlIHNlY29uZCBiaWdnZXN0IHByb2JsZW0gd2l0aCBkbm90aWZ5LgorICAgU2lnbmFscyBhcmUgYSB0ZXJyaWJsZSwgdGVycmlibGUgaW50ZXJmYWNlIGZvciBmaWxlIG5vdGlmaWNhdGlvbi4gIE9yIGZvcgorICAgYW55dGhpbmcsIGZvciB0aGF0IG1hdHRlci4gIFRoZSBpZGVhbCBzb2x1dGlvbiwgZnJvbSBhbGwgcGVyc3BlY3RpdmVzLCBpcyBhCisgICBmaWxlIGRlc2NyaXB0b3ItYmFzZWQgb25lIHRoYXQgYWxsb3dzIGJhc2ljIGZpbGUgSS9PIGFuZCBwb2xsL3NlbGVjdC4KKyAgIE9idGFpbmluZyB0aGUgZmQgYW5kIG1hbmFnaW5nIHRoZSB3YXRjaGVzIGNvdWxkIGhhdmUgYmVlbiBkb25lIGVpdGhlciB2aWEgYQorICAgZGV2aWNlIGZpbGUgb3IgYSBmYW1pbHkgb2YgbmV3IHN5c3RlbSBjYWxscy4gIFdlIGRlY2lkZWQgdG8gaW1wbGVtZW50IGEKKyAgIGZhbWlseSBvZiBzeXN0ZW0gY2FsbHMgYmVjYXVzZSB0aGF0IGlzIHRoZSBwcmVmZmVyZWQgYXBwcm9hY2ggZm9yIG5ldyBrZXJuZWwKKyAgIGZlYXR1cmVzIGFuZCBpdCBtZWFucyBvdXIgdXNlciBpbnRlcmZhY2UgcmVxdWlyZW1lbnRzLgorCisgICBBZGRpdGlvbmFsbHksIGl0IF9pc18gcG9zc2libGUgdG8gIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgIGFuZAorICAganVnZ2xlIG1vcmUgdGhhbiBvbmUgcXVldWUgYW5kIHRodXMgbW9yZSB0aGFuIG9uZSBhc3NvY2lhdGVkIGZkLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hpcC50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hpcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwY2VmMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGlwLnR4dApAQCAtMCwwICsxLDY3IEBACitFeGVjdXRlLWluLXBsYWNlIGZvciBmaWxlIG1hcHBpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01vdGl2YXRpb24KKy0tLS0tLS0tLS0KK0ZpbGUgbWFwcGluZ3MgYXJlIHBlcmZvcm1lZCBieSBtYXBwaW5nIHBhZ2UgY2FjaGUgcGFnZXMgdG8gdXNlcnNwYWNlLiBJbgorYWRkaXRpb24sIHJlYWQmd3JpdGUgdHlwZSBmaWxlIG9wZXJhdGlvbnMgYWxzbyB0cmFuc2ZlciBkYXRhIGZyb20vdG8gdGhlIHBhZ2UKK2NhY2hlLgorCitGb3IgbWVtb3J5IGJhY2tlZCBzdG9yYWdlIGRldmljZXMgdGhhdCB1c2UgdGhlIGJsb2NrIGRldmljZSBpbnRlcmZhY2UsIHRoZSBwYWdlCitjYWNoZSBwYWdlcyBhcmUgaW4gZmFjdCBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHN0b3JhZ2UuIFZhcmlvdXMgYXBwcm9hY2hlcworZXhpc3QgdG8gd29yayBhcm91bmQgdGhlIG5lZWQgZm9yIGFuIGV4dHJhIGNvcHkuIFRoZSByYW1kaXNrIGRyaXZlciBmb3IgZXhhbXBsZQorZG9lcyByZWFkIHRoZSBkYXRhIGludG8gdGhlIHBhZ2UgY2FjaGUsIGtlZXBzIGEgcmVmZXJlbmNlLCBhbmQgZGlzY2FyZHMgdGhlCitvcmlnaW5hbCBkYXRhIGJlaGluZCBsYXRlciBvbi4KKworRXhlY3V0ZS1pbi1wbGFjZSBzb2x2ZXMgdGhpcyBpc3N1ZSB0aGUgb3RoZXIgd2F5IGFyb3VuZDogaW5zdGVhZCBvZiBrZWVwaW5nCitkYXRhIGluIHRoZSBwYWdlIGNhY2hlLCB0aGUgbmVlZCB0byBoYXZlIGEgcGFnZSBjYWNoZSBjb3B5IGlzIGVsaW1pbmF0ZWQKK2NvbXBsZXRlbHkuIFdpdGggZXhlY3V0ZS1pbi1wbGFjZSwgcmVhZCZ3cml0ZSB0eXBlIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZAorZGlyZWN0bHkgZnJvbS90byB0aGUgbWVtb3J5IGJhY2tlZCBzdG9yYWdlIGRldmljZS4gRm9yIGZpbGUgbWFwcGluZ3MsIHRoZQorc3RvcmFnZSBkZXZpY2UgaXRzZWxmIGlzIG1hcHBlZCBkaXJlY3RseSBpbnRvIHVzZXJzcGFjZS4KKworVGhpcyBpbXBsZW1lbnRhdGlvbiB3YXMgaW5pdGlhbHkgd3JpdHRlbiBmb3Igc2hhcmVkIG1lbW9yeSBzZWdtZW50cyBiZXR3ZWVuCitkaWZmZXJlbnQgdmlydHVhbCBtYWNoaW5lcyBvbiBzMzkwIGhhcmR3YXJlIHRvIGFsbG93IG11bHRpcGxlIG1hY2hpbmVzIHRvCitzaGFyZSB0aGUgc2FtZSBiaW5hcmllcyBhbmQgbGlicmFyaWVzLgorCitJbXBsZW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KK0V4ZWN1dGUtaW4tcGxhY2UgaXMgaW1wbGVtZW50ZWQgaW4gdGhyZWUgc3RlcHM6IGJsb2NrIGRldmljZSBvcGVyYXRpb24sCithZGRyZXNzIHNwYWNlIG9wZXJhdGlvbiwgYW5kIGZpbGUgb3BlcmF0aW9ucy4KKworQSBibG9jayBkZXZpY2Ugb3BlcmF0aW9uIG5hbWVkIGRpcmVjdF9hY2Nlc3MgaXMgdXNlZCB0byByZXRyaWV2ZSBhCityZWZlcmVuY2UgKHBvaW50ZXIpIHRvIGEgYmxvY2sgb24tZGlzay4gVGhlIHJlZmVyZW5jZSBpcyBzdXBwb3NlZCB0byBiZQorY3B1LWFkZHJlc3NhYmxlLCBwaHlzaWNhbCBhZGRyZXNzIGFuZCByZW1haW4gdmFsaWQgdW50aWwgdGhlIHJlbGVhc2Ugb3BlcmF0aW9uCitpcyBwZXJmb3JtZWQuIEEgc3RydWN0IGJsb2NrX2RldmljZSByZWZlcmVuY2UgaXMgdXNlZCB0byBhZGRyZXNzIHRoZSBkZXZpY2UsCithbmQgYSBzZWN0b3JfdCBhcmd1bWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBpbmRpdmlkdWFsIGJsb2NrLiBBcyBhbgorYWx0ZXJuYXRpdmUsIG1lbW9yeSB0ZWNobm9sb2d5IGRldmljZXMgY2FuIGJlIHVzZWQgZm9yIHRoaXMuCisKK1RoZSBibG9jayBkZXZpY2Ugb3BlcmF0aW9uIGlzIG9wdGlvbmFsLCB0aGVzZSBibG9jayBkZXZpY2VzIHN1cHBvcnQgaXQgYXMgb2YKK3RvZGF5OgorLSBkY3NzYmxrOiBzMzkwIGRjc3MgYmxvY2sgZGV2aWNlIGRyaXZlcgorCitBbiBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbiBuYW1lZCBnZXRfeGlwX3BhZ2UgaXMgdXNlZCB0byByZXRyaWV2ZSByZWZlcmVuY2UKK3RvIGEgc3RydWN0IHBhZ2UuIFRvIGFkZHJlc3MgdGhlIHRhcmdldCBwYWdlLCBhIHJlZmVyZW5jZSB0byBhbiBhZGRyZXNzX3NwYWNlLAorYW5kIGEgc2VjdG9yIG51bWJlciBpcyBwcm92aWRlZC4gQSAzcmQgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlCitmdW5jdGlvbiBzaG91bGQgYWxsb2NhdGUgYmxvY2tzIGlmIG5lZWRlZC4KKworVGhpcyBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbiBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCByZWFkcGFnZSZ3cml0ZXBhZ2UgdGhhdAorZG8gcGFnZSBjYWNoZSByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCitUaGUgZm9sbG93aW5nIGZpbGVzeXN0ZW1zIHN1cHBvcnQgaXQgYXMgb2YgdG9kYXk6CistIGV4dDI6IHRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZXN5c3RlbSwgc2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZXh0Mi50eHQKKworQSBzZXQgb2YgZmlsZSBvcGVyYXRpb25zIHRoYXQgZG8gdXRpbGl6ZSBnZXRfeGlwX3BhZ2UgY2FuIGJlIGZvdW5kIGluCittbS9maWxlbWFwX3hpcC5jIC4gVGhlIGZvbGxvd2luZyBmaWxlIG9wZXJhdGlvbiBpbXBsZW1lbnRhdGlvbnMgYXJlIHByb3ZpZGVkOgorLSBhaW9fcmVhZC9haW9fd3JpdGUKKy0gcmVhZHYvd3JpdGV2CistIHNlbmRmaWxlCisKK1RoZSBnZW5lcmljIGZpbGUgb3BlcmF0aW9ucyBkb19zeW5jX3JlYWQvZG9fc3luY193cml0ZSBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKK2NsYXNzaWMgc3luY2hyb25vdXMgSU8gY2FsbHMuCisKK1Nob3J0Y29taW5ncworLS0tLS0tLS0tLS0tCitUaGlzIGltcGxlbWVudGF0aW9uIGlzIGxpbWl0ZWQgdG8gc3RvcmFnZSBkZXZpY2VzIHRoYXQgYXJlIGNwdSBhZGRyZXNzYWJsZSBhdAorYWxsIHRpbWVzIChubyBoaWdobWVtIG9yIHN1Y2gpLiBJdCB3b3JrcyB3ZWxsIG9uIHJvbS9yYW0sIGJ1dCBlbmhhbmNlbWVudHMgYXJlCituZWVkZWQgdG8gbWFrZSBpdCB3b3JrIHdpdGggZmxhc2ggaW4gcmVhZCt3cml0ZSBtb2RlLgorUHV0dGluZyB0aGUgTGludXgga2VybmVsIGFuZC9vciBpdHMgbW9kdWxlcyBvbiBhIHhpcCBmaWxlc3lzdGVtIGRvZXMgbm90IG1lYW4KK3RoZXkgYXJlIG5vdCBjb3BpZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDIxIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDIxCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDIxCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTEwMjUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMjUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTEwMjUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAyNiBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTAyNgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYWRtMTAyNgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDI2CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDMxIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMDMxCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9hZG0xMDMxCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEwMzEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTkyNDAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTkyNDAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FkbTkyNDAKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vYWRtOTI0MApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvYXNiMTAwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hc2IxMDAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2FzYjEwMApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9hc2IxMDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2RzMTYyMSBiL0RvY3VtZW50YXRpb24vaHdtb24vZHMxNjIxCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9kczE2MjEKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vZHMxNjIxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9mc2NoZXIgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2ZzY2hlcgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZnNjaGVyCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2ZzY2hlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZ2w1MThzbSBiL0RvY3VtZW50YXRpb24vaHdtb24vZ2w1MThzbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvZ2w1MThzbQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9nbDUxOHNtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9pdDg3IGIvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9pdDg3CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNjMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNjMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNjMKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG02MwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG03NSBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03NQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG03NQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTc1CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTc3IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTc3CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTc3CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtNzcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNzggYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtNzgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtNzgKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG03OApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04MApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04MApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTgwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTgzIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTgzCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtODMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtODUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG04NQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04NyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG04NwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbG04NwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9sbTg3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTkwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9sbTkwCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL2xtOTAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtOTIgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL2xtOTIKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vbG05MgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4MTYxOSBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MTYxOQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4MTYxOQpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjE5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9wYzg3MzYwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9wYzg3MzYwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9wYzg3MzYwCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3BjODczNjAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3NpczU1OTUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3NpczU1OTUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3NpczU1OTUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vc2lzNTU5NQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvc21zYzQ3YjM5NyBiL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3YjM5NwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvc21zYzQ3YjM5NwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdiMzk3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9zbXNjNDdtMSBiL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3Ntc2M0N20xCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3Ntc2M0N20xCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9zeXNmcy1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvc3lzZnMtaW50ZXJmYWNlCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvdXNlcnNwYWNlLXRvb2xzIGIvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL3VzZXJzcGFjZS10b29scwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL3ZpYTY4NmEgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3ZpYTY4NmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaTJjL2NoaXBzL3ZpYTY4NmEKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vaHdtb24vdmlhNjg2YQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzNjI3aGYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4MzYyN2hmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2kyYy9jaGlwcy93ODM2MjdoZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi93ODM2MjdoZgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzNzgxZCBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzgxZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzNzgxZApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9od21vbi93ODM3ODFkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy93ODNsNzg1dHMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4M2w3ODV0cwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvdzgzbDc4NXRzCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3c4M2w3ODV0cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NSBiL0RvY3VtZW50YXRpb24vaTJjL2NoaXBzL21heDY4NzUKaW5kZXggYjRmYjQ5Yi4uYjAyMDAyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvY2hpcHMvbWF4Njg3NQorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9jaGlwcy9tYXg2ODc1CkBAIC0yLDEwICsyLDEwIEBACiA9PT09PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgotICAqIE1heGltIG1heDY4NzQsIG1heDY4NzUKLSAgICBQcmVmaXhlczogJ21heDY4NzUnCisgICogTWF4aW0gTUFYNjg3NCwgTUFYNjg3NQorICAgIFByZWZpeDogJ21heDY4NzUnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IDB4NTAsIDB4NTIKLSAgICBEYXRhc2hlZXRzOgorICAgIERhdGFzaGVldDoKICAgICAgICAgaHR0cDovL3BkZnNlcnYubWF4aW0taWMuY29tL2VuL2RzL01BWDY4NzQtTUFYNjg3NS5wZGYKIAogQXV0aG9yOiBCZW4gR2FyZG5lciA8YmdhcmRuZXJAd2FidGVjLmNvbT4KQEAgLTIzLDE0ICsyMywyNiBAQAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCiAKLVRoZSBNQVhJTSBtYXg2ODc1IGlzIGEgRUVQUk9NLXByb2dyYW1tYWJsZSBwb3dlci1zdXBwbHkgc2VxdWVuY2VyL3N1cGVydmlzb3IuCitUaGUgTWF4aW0gTUFYNjg3NSBpcyBhbiBFRVBST00tcHJvZ3JhbW1hYmxlIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIvc3VwZXJ2aXNvci4KIEl0IHByb3ZpZGVzIHRpbWVkIG91dHB1dHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHdhdGNoZG9nLCBpZiBwcm9wZXJseSB3aXJlZC4KIEl0IGFsc28gcHJvdmlkZXMgNTEyIGJ5dGVzIG9mIHVzZXIgRUVQUk9NLgogCi1BdCByZXNldCwgdGhlIG1heDY4NzUgcmVhZHMgdGhlIGNvbmZpZ3VyYXRpb24gZWVwcm9tIGludG8gaXRzIGNvbmZpZ3VyYXRpb24KK0F0IHJlc2V0LCB0aGUgTUFYNjg3NSByZWFkcyB0aGUgY29uZmlndXJhdGlvbiBFRVBST00gaW50byBpdHMgY29uZmlndXJhdGlvbgogcmVnaXN0ZXJzLiAgVGhlIGNoaXAgdGhlbiBiZWdpbnMgdG8gb3BlcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlcyBpbiB0aGUKIHJlZ2lzdGVycy4KIAorVGhlIE1heGltIE1BWDY4NzQgaXMgYSBzaW1pbGFyLCBtb3N0bHkgY29tcGF0aWJsZSBkZXZpY2UsIHdpdGggbW9yZSBpbnRwdXRzCithbmQgb3V0cHV0czoKKworICAgICAgICAgICAgIHZpbiAgICAgZ3BpICAgIHZvdXQKK01BWDY4NzQgICAgICAgIDYgICAgICAgNCAgICAgICA4CitNQVg2ODc1ICAgICAgICA0ICAgICAgIDMgICAgICAgNQorCitNQVg2ODc0IGNoaXBzIGNhbiBoYXZlIGZvdXIgZGlmZmVyZW50IGFkZHJlc3NlcyAoYXMgb3Bwb3NlZCB0byBvbmx5IHR3byBmb3IKK3RoZSBNQVg2ODc1KS4gVGhlIGFkZGl0aW9uYWwgYWRkcmVzc2VzICgweDU0IGFuZCAweDU2KSBhcmUgbm90IHByb2JlZCBieQordGhpcyBkcml2ZXIgYnkgZGVmYXVsdCwgYnV0IHRoZSBwcm9iZSBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIGlmCituZWVkZWQuCisKIFNlZSB0aGUgZGF0YXNoZWV0IGZvciBkZXRhaWxzIG9uIGhvdyB0byBwcm9ncmFtIHRoZSBFRVBST00uCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZSBiL0RvY3VtZW50YXRpb24vaTJjL2Rldi1pbnRlcmZhY2UKaW5kZXggMDlkNmNkYS4uYjg0OWFkNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9kZXYtaW50ZXJmYWNlCkBAIC0xNCw5ICsxNCwxMiBAQAogPT09PT09PT09CiAKIFNvIGxldCdzIHNheSB5b3Ugd2FudCB0byBhY2Nlc3MgYW4gaTJjIGFkYXB0ZXIgZnJvbSBhIEMgcHJvZ3JhbS4gVGhlCi1maXJzdCB0aGluZyB0byBkbyBpcyBgI2luY2x1ZGUgPGxpbnV4L2kyYy5oPiIgYW5kICIjaW5jbHVkZSA8bGludXgvaTJjLWRldi5oPi4gCi1ZZXMsIEkga25vdywgeW91IHNob3VsZCBuZXZlciBpbmNsdWRlIGtlcm5lbCBoZWFkZXIgZmlsZXMsIGJ1dCB1bnRpbCBnbGliYyAKLWtub3dzIGFib3V0IGkyYywgdGhlcmUgaXMgbm90IG11Y2ggY2hvaWNlLgorZmlyc3QgdGhpbmcgdG8gZG8gaXMgIiNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+Ii4gUGxlYXNlIG5vdGUgdGhhdAordGhlcmUgYXJlIHR3byBmaWxlcyBuYW1lZCAiaTJjLWRldi5oIiBvdXQgdGhlcmUsIG9uZSBpcyBkaXN0cmlidXRlZAord2l0aCB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtZWFudCB0byBiZSBpbmNsdWRlZCBmcm9tIGtlcm5lbAorZHJpdmVyIGNvZGUsIHRoZSBvdGhlciBvbmUgaXMgZGlzdHJpYnV0ZWQgd2l0aCBsbV9zZW5zb3JzIGFuZCBpcworbWVhbnQgdG8gYmUgaW5jbHVkZWQgZnJvbSB1c2VyLXNwYWNlIHByb2dyYW1zLiBZb3Ugb2J2aW91c2x5IHdhbnQKK3RoZSBzZWNvbmQgb25lIGhlcmUuCiAKIE5vdywgeW91IGhhdmUgdG8gZGVjaWRlIHdoaWNoIGFkYXB0ZXIgeW91IHdhbnQgdG8gYWNjZXNzLiBZb3Ugc2hvdWxkCiBpbnNwZWN0IC9zeXMvY2xhc3MvaTJjLWRldi8gdG8gZGVjaWRlIHRoaXMuIEFkYXB0ZXIgbnVtYmVycyBhcmUgYXNzaWduZWQKQEAgLTc4LDcgKzgxLDcgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoZSBmb2xsb3dpbmcgSU9DVExzIGFyZSBkZWZpbmVkIGFuZCBmdWxseSBzdXBwb3J0ZWQgCi0oc2VlIGFsc28gaTJjLWRldi5oIGFuZCBpMmMuaCk6Cisoc2VlIGFsc28gaTJjLWRldi5oKToKIAogaW9jdGwoZmlsZSxJMkNfU0xBVkUsbG9uZyBhZGRyKQogICBDaGFuZ2Ugc2xhdmUgYWRkcmVzcy4gVGhlIGFkZHJlc3MgaXMgcGFzc2VkIGluIHRoZSA3IGxvd2VyIGJpdHMgb2YgdGhlCkBAIC05NywxMCArMTAwLDEwIEBACiBpb2N0bChmaWxlLEkyQ19GVU5DUyx1bnNpZ25lZCBsb25nICpmdW5jcykKICAgR2V0cyB0aGUgYWRhcHRlciBmdW5jdGlvbmFsaXR5IGFuZCBwdXRzIGl0IGluICpmdW5jcy4KIAotaW9jdGwoZmlsZSxJMkNfUkRXUixzdHJ1Y3QgaTJjX2lvY3RsX3Jkd3JfZGF0YSAqbXNnc2V0KQoraW9jdGwoZmlsZSxJMkNfUkRXUixzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YSAqbXNnc2V0KQogCiAgIERvIGNvbWJpbmVkIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24gd2l0aG91dCBzdG9wIGluIGJldHdlZW4uCi0gIFRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgaTJjX2lvY3RsX3Jkd3JfZGF0YSB7CisgIFRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3QgaTJjX3Jkd3JfaW9jdGxfZGF0YSB7CiAKICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2dzOyAgLyogcHRyIHRvIGFycmF5IG9mIHNpbXBsZSBtZXNzYWdlcyAqLwogICAgICAgaW50IG5tc2dzOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbWVzc2FnZXMgdG8gZXhjaGFuZ2UgKi8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cyBiL0RvY3VtZW50YXRpb24vaTJjL3dyaXRpbmctY2xpZW50cwppbmRleCBmNDgyZGFlLi45MTY2NGJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCkBAIC0yNyw3ICsyNyw2IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZm9vX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gIkZvbyB2ZXJzaW9uIDIuMyBkcml2ZXIiLAotCS5pZAkJPSBJMkNfRFJJVkVSSURfRk9PLCAvKiBmcm9tIGkyYy1pZC5oLCBvcHRpb25hbCAqLwogCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAogCS5hdHRhY2hfYWRhcHRlcgk9ICZmb29fYXR0YWNoX2FkYXB0ZXIsCiAJLmRldGFjaF9jbGllbnQJPSAmZm9vX2RldGFjaF9jbGllbnQsCkBAIC0zNywxMiArMzYsNiBAQAogVGhlIG5hbWUgY2FuIGJlIGNob3NlbiBmcmVlbHksIGFuZCBtYXkgYmUgdXB0byA0MCBjaGFyYWN0ZXJzIGxvbmcuIFBsZWFzZQogdXNlIHNvbWV0aGluZyBkZXNjcmlwdGl2ZSBoZXJlLgogCi1JZiB1c2VkLCB0aGUgaWQgc2hvdWxkIGJlIGEgdW5pcXVlIElELiBUaGUgcmFuZ2UgMHhmMDAwIHRvIDB4ZmZmZiBpcwotcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSwgYW5kIHlvdSBjYW4gdXNlIG9uZSBvZiB0aG9zZSB1bnRpbCB5b3Ugc3RhcnQKLWRpc3RyaWJ1dGluZyB0aGUgZHJpdmVyLCBhdCB3aGljaCB0aW1lIHlvdSBzaG91bGQgY29udGFjdCB0aGUgaTJjIGF1dGhvcnMKLXRvIGdldCB5b3VyIG93biBJRChzKS4gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIHRpbWUgeW91IGRvbid0IG5lZWQgYW4gSUQKLWF0IGFsbCBzbyB5b3UgY2FuIGp1c3Qgb21pdCBpdC4KLQogRG9uJ3Qgd29ycnkgYWJvdXQgdGhlIGZsYWdzIGZpZWxkOyBqdXN0IHB1dCBJMkNfREZfTk9USUZZIGludG8gaXQuIFRoaXMKIG1lYW5zIHRoYXQgeW91ciBkcml2ZXIgd2lsbCBiZSBub3RpZmllZCB3aGVuIG5ldyBhZGFwdGVycyBhcmUgZm91bmQuCiBUaGlzIGlzIGFsbW9zdCBhbHdheXMgd2hhdCB5b3Ugd2FudC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnR4dCBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC91c2VyX3ZlcmJzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQ3NTAxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3VzZXJfdmVyYnMudHh0CkBAIC0wLDAgKzEsNjkgQEAKK1VTRVJTUEFDRSBWRVJCUyBBQ0NFU1MKKworICBUaGUgaWJfdXZlcmJzIG1vZHVsZSwgYnVpbHQgYnkgZW5hYmxpbmcgQ09ORklHX0lORklOSUJBTkRfVVNFUl9WRVJCUywKKyAgZW5hYmxlcyBkaXJlY3QgdXNlcnNwYWNlIGFjY2VzcyB0byBJQiBoYXJkd2FyZSB2aWEgInZlcmJzLCIgYXMKKyAgZGVzY3JpYmVkIGluIGNoYXB0ZXIgMTEgb2YgdGhlIEluZmluaUJhbmQgQXJjaGl0ZWN0dXJlIFNwZWNpZmljYXRpb24uCisKKyAgVG8gdXNlIHRoZSB2ZXJicywgdGhlIGxpYmlidmVyYnMgbGlicmFyeSwgYXZhaWxhYmxlIGZyb20KKyAgPGh0dHA6Ly9vcGVuaWIub3JnLz4sIGlzIHJlcXVpcmVkLiAgbGliaWJ2ZXJicyBjb250YWlucyBhCisgIGRldmljZS1pbmRlcGVuZGVudCBBUEkgZm9yIHVzaW5nIHRoZSBpYl91dmVyYnMgaW50ZXJmYWNlLgorICBsaWJpYnZlcmJzIGFsc28gcmVxdWlyZXMgYXBwcm9wcmlhdGUgZGV2aWNlLWRlcGVuZGVudCBrZXJuZWwgYW5kCisgIHVzZXJzcGFjZSBkcml2ZXIgZm9yIHlvdXIgSW5maW5pQmFuZCBoYXJkd2FyZS4gIEZvciBleGFtcGxlLCB0byB1c2UKKyAgYSBNZWxsYW5veCBIQ0EsIHlvdSB3aWxsIG5lZWQgdGhlIGliX210aGNhIGtlcm5lbCBtb2R1bGUgYW5kIHRoZQorICBsaWJtdGhjYSB1c2Vyc3BhY2UgZHJpdmVyIGJlIGluc3RhbGxlZC4KKworVXNlci1rZXJuZWwgY29tbXVuaWNhdGlvbgorCisgIFVzZXJzcGFjZSBjb21tdW5pY2F0ZXMgd2l0aCB0aGUga2VybmVsIGZvciBzbG93IHBhdGgsIHJlc291cmNlCisgIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyB2aWEgdGhlIC9kZXYvaW5maW5pYmFuZC91dmVyYnNOIGNoYXJhY3RlcgorICBkZXZpY2VzLiAgRmFzdCBwYXRoIG9wZXJhdGlvbnMgYXJlIHR5cGljYWxseSBwZXJmb3JtZWQgYnkgd3JpdGluZworICBkaXJlY3RseSB0byBoYXJkd2FyZSByZWdpc3RlcnMgbW1hcCgpZWQgaW50byB1c2Vyc3BhY2UsIHdpdGggbm8KKyAgc3lzdGVtIGNhbGwgb3IgY29udGV4dCBzd2l0Y2ggaW50byB0aGUga2VybmVsLgorCisgIENvbW1hbmRzIGFyZSBzZW50IHRvIHRoZSBrZXJuZWwgdmlhIHdyaXRlKClzIG9uIHRoZXNlIGRldmljZSBmaWxlcy4KKyAgVGhlIEFCSSBpcyBkZWZpbmVkIGluIGRyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3VzZXJfdmVyYnMuaC4KKyAgVGhlIHN0cnVjdHMgZm9yIGNvbW1hbmRzIHRoYXQgcmVxdWlyZSBhIHJlc3BvbnNlIGZyb20gdGhlIGtlcm5lbAorICBjb250YWluIGEgNjQtYml0IGZpZWxkIHVzZWQgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYW4gb3V0cHV0IGJ1ZmZlci4KKyAgU3RhdHVzIGlzIHJldHVybmVkIHRvIHVzZXJzcGFjZSBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSB3cml0ZSgpCisgIHN5c3RlbSBjYWxsLgorCitSZXNvdXJjZSBtYW5hZ2VtZW50CisKKyAgU2luY2UgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIGFsbCBJQiByZXNvdXJjZXMgaXMgZG9uZSBieQorICBjb21tYW5kcyBwYXNzZWQgdGhyb3VnaCBhIGZpbGUgZGVzY3JpcHRvciwgdGhlIGtlcm5lbCBjYW4ga2VlcCB0cmFjaworICBvZiB3aGljaCByZXNvdXJjZXMgYXJlIGF0dGFjaGVkIHRvIGEgZ2l2ZW4gdXNlcnNwYWNlIGNvbnRleHQuICBUaGUKKyAgaWJfdXZlcmJzIG1vZHVsZSBtYWludGFpbnMgaWRyIHRhYmxlcyB0aGF0IGFyZSB1c2VkIHRvIHRyYW5zbGF0ZQorICBiZXR3ZWVuIGtlcm5lbCBwb2ludGVycyBhbmQgb3BhcXVlIHVzZXJzcGFjZSBoYW5kbGVzLCBzbyB0aGF0IGtlcm5lbAorICBwb2ludGVycyBhcmUgbmV2ZXIgZXhwb3NlZCB0byB1c2Vyc3BhY2UgYW5kIHVzZXJzcGFjZSBjYW5ub3QgdHJpY2sKKyAgdGhlIGtlcm5lbCBpbnRvIGZvbGxvd2luZyBhIGJvZ3VzIHBvaW50ZXIuCisKKyAgVGhpcyBhbHNvIGFsbG93cyB0aGUga2VybmVsIHRvIGNsZWFuIHVwIHdoZW4gYSBwcm9jZXNzIGV4aXRzIGFuZAorICBwcmV2ZW50IG9uZSBwcm9jZXNzIGZyb20gdG91Y2hpbmcgYW5vdGhlciBwcm9jZXNzJ3MgcmVzb3VyY2VzLgorCitNZW1vcnkgcGlubmluZworCisgIERpcmVjdCB1c2Vyc3BhY2UgSS9PIHJlcXVpcmVzIHRoYXQgbWVtb3J5IHJlZ2lvbnMgdGhhdCBhcmUgcG90ZW50aWFsCisgIEkvTyB0YXJnZXRzIGJlIGtlcHQgcmVzaWRlbnQgYXQgdGhlIHNhbWUgcGh5c2ljYWwgYWRkcmVzcy4gIFRoZQorICBpYl91dmVyYnMgbW9kdWxlIG1hbmFnZXMgcGlubmluZyBhbmQgdW5waW5uaW5nIG1lbW9yeSByZWdpb25zIHZpYQorICBnZXRfdXNlcl9wYWdlcygpIGFuZCBwdXRfcGFnZSgpIGNhbGxzLiAgSXQgYWxzbyBhY2NvdW50cyBmb3IgdGhlCisgIGFtb3VudCBvZiBtZW1vcnkgcGlubmVkIGluIHRoZSBwcm9jZXNzJ3MgbG9ja2VkX3ZtLCBhbmQgY2hlY2tzIHRoYXQKKyAgdW5wcml2aWxlZ2VkIHByb2Nlc3NlcyBkbyBub3QgZXhjZWVkIHRoZWlyIFJMSU1JVF9NRU1MT0NLIGxpbWl0LgorCisgIFBhZ2VzIHRoYXQgYXJlIHBpbm5lZCBtdWx0aXBsZSB0aW1lcyBhcmUgY291bnRlZCBlYWNoIHRpbWUgdGhleSBhcmUKKyAgcGlubmVkLCBzbyB0aGUgdmFsdWUgb2YgbG9ja2VkX3ZtIG1heSBiZSBhbiBvdmVyZXN0aW1hdGUgb2YgdGhlCisgIG51bWJlciBvZiBwYWdlcyBwaW5uZWQgYnkgYSBwcm9jZXNzLgorCisvZGV2IGZpbGVzCisKKyAgVG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjaGFyYWN0ZXIgZGV2aWNlIGZpbGVzIGF1dG9tYXRpY2FsbHkgd2l0aAorICB1ZGV2LCBhIHJ1bGUgbGlrZQorCisgICAgS0VSTkVMPSJ1dmVyYnMqIiwgTkFNRT0iaW5maW5pYmFuZC8layIKKworICBjYW4gYmUgdXNlZC4gIFRoaXMgd2lsbCBjcmVhdGUgZGV2aWNlIG5vZGVzIG5hbWVkCisKKyAgICAvZGV2L2luZmluaWJhbmQvdXZlcmJzMAorCisgIGFuZCBzbyBvbi4gIFNpbmNlIHRoZSBJbmZpbmlCYW5kIHVzZXJzcGFjZSB2ZXJicyBzaG91bGQgYmUgc2FmZSBmb3IKKyAgdXNlIGJ5IG5vbi1wcml2aWxlZ2VkIHByb2Nlc3NlcywgaXQgbWF5IGJlIHVzZWZ1bCB0byBhZGQgYW4KKyAgYXBwcm9wcmlhdGUgTU9ERSBvciBHUk9VUCB0byB0aGUgdWRldiBydWxlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9nZGJtYWNyb3MudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9nZGJtYWNyb3MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMWI5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL2dkYm1hY3Jvcy50eHQKQEAgLTAsMCArMSwxNzkgQEAKKyMKKyMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmV3IGdkYiBtYWNyb3MgKHVzZXIgZGVmaW5lZCBjb21tYW5kcykgdG8gZXh0cmFjdAorIyB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBrZXJuZWwgY3Jhc2hkdW1wIChrZHVtcCkgbGlrZSBzdGFjayB0cmFjZXMgb2YKKyMgYWxsIHRoZSBwcm9jZXNzZXMgb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3MgYW5kIHRyYXBpbmZvLgorIworIyBUaGVzZSBtYWNyb3MgY2FuIGJlIHVzZWQgYnkgY29weWluZyB0aGlzIGZpbGUgaW4gLmdkYmluaXQgKHB1dCBpbiBob21lCisjIGRpcmVjdG9yeSBvciBjdXJyZW50IGRpcmVjdG9yeSkgb3IgYnkgaW52b2tpbmcgZ2RiIGNvbW1hbmQgd2l0aAorIyAtLWNvbW1hbmQ9PGNvbW1hbmQtZmlsZS1uYW1lPiBvcHRpb24KKyMKKyMgQ3JlZGl0czoKKyMgQWxleGFuZGVyIE55YmVyZyA8YWxleG5AdGVsaWEuY29tPgorIyBWIFNyaXZhdHNhIDx2YXRzYUBpbi5pYm0uY29tPgorIyBNYW5lZXNoIFNvbmkgPG1hbmVlc2hAaW4uaWJtLmNvbT4KKyMKKworZGVmaW5lIGJ0dG5vYnAKKwlzZXQgJHRhc2tzX29mZj0oKHNpemVfdCkmKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikwKS0+dGFza3MpCisJc2V0ICRwaWRfb2ZmPSgoc2l6ZV90KSYoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTApLT5waWRzWzFdLnBpZF9saXN0Lm5leHQpCisJc2V0ICRpbml0X3Q9JmluaXRfdGFzaworCXNldCAkbmV4dF90PSgoKGNoYXIgKikoJGluaXRfdC0+dGFza3MpLm5leHQpIC0gJHRhc2tzX29mZikKKwl3aGlsZSAoJG5leHRfdCAhPSAkaW5pdF90KQorCQlzZXQgJG5leHRfdD0oc3RydWN0IHRhc2tfc3RydWN0ICopJG5leHRfdAorCQlwcmludGYgIlxucGlkICVkOyBjb21tICVzOlxuIiwgJG5leHRfdC5waWQsICRuZXh0X3QuY29tbQorCQlwcmludGYgIj09PT09PT09PT09PT09PT09PT1cbiIKKwkJc2V0IHZhciAkc3RhY2twID0gJG5leHRfdC50aHJlYWQuZXNwCisJCXNldCB2YXIgJHN0YWNrX3RvcCA9ICgkc3RhY2twICYgfjQwOTUpICsgNDA5NgorCisJCXdoaWxlICgkc3RhY2twIDwgJHN0YWNrX3RvcCkKKwkJCWlmICgqKCRzdGFja3ApID4gX3N0ZXh0ICYmICooJHN0YWNrcCkgPCBfc2luaXR0ZXh0KQorCQkJCWluZm8gc3ltYm9sICooJHN0YWNrcCkKKwkJCWVuZAorCQkJc2V0ICRzdGFja3AgKz0gNAorCQllbmQKKwkJc2V0ICRuZXh0X3RoPSgoKGNoYXIgKikkbmV4dF90LT5waWRzWzFdLnBpZF9saXN0Lm5leHQpIC0gJHBpZF9vZmYpCisJCXdoaWxlICgkbmV4dF90aCAhPSAkbmV4dF90KQorCQkJc2V0ICRuZXh0X3RoPShzdHJ1Y3QgdGFza19zdHJ1Y3QgKikkbmV4dF90aAorCQkJcHJpbnRmICJcbnBpZCAlZDsgY29tbSAlczpcbiIsICRuZXh0X3QucGlkLCAkbmV4dF90LmNvbW0KKwkJCXByaW50ZiAiPT09PT09PT09PT09PT09PT09PVxuIgorCQkJc2V0IHZhciAkc3RhY2twID0gJG5leHRfdC50aHJlYWQuZXNwCisJCQlzZXQgdmFyICRzdGFja190b3AgPSAoJHN0YWNrcCAmIH40MDk1KSArIDQwOTYKKworCQkJd2hpbGUgKCRzdGFja3AgPCAkc3RhY2tfdG9wKQorCQkJCWlmICgqKCRzdGFja3ApID4gX3N0ZXh0ICYmICooJHN0YWNrcCkgPCBfc2luaXR0ZXh0KQorCQkJCQlpbmZvIHN5bWJvbCAqKCRzdGFja3ApCisJCQkJZW5kCisJCQkJc2V0ICRzdGFja3AgKz0gNAorCQkJZW5kCisJCQlzZXQgJG5leHRfdGg9KCgoY2hhciAqKSRuZXh0X3RoLT5waWRzWzFdLnBpZF9saXN0Lm5leHQpIC0gJHBpZF9vZmYpCisJCWVuZAorCQlzZXQgJG5leHRfdD0oY2hhciAqKSgkbmV4dF90LT50YXNrcy5uZXh0KSAtICR0YXNrc19vZmYKKwllbmQKK2VuZAorZG9jdW1lbnQgYnR0bm9icAorCWR1bXAgYWxsIHRocmVhZCBzdGFjayB0cmFjZXMgb24gYSBrZXJuZWwgY29tcGlsZWQgd2l0aCAhQ09ORklHX0ZSQU1FX1BPSU5URVIKK2VuZAorCitkZWZpbmUgYnR0CisJc2V0ICR0YXNrc19vZmY9KChzaXplX3QpJigoc3RydWN0IHRhc2tfc3RydWN0ICopMCktPnRhc2tzKQorCXNldCAkcGlkX29mZj0oKHNpemVfdCkmKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikwKS0+cGlkc1sxXS5waWRfbGlzdC5uZXh0KQorCXNldCAkaW5pdF90PSZpbml0X3Rhc2sKKwlzZXQgJG5leHRfdD0oKChjaGFyICopKCRpbml0X3QtPnRhc2tzKS5uZXh0KSAtICR0YXNrc19vZmYpCisJd2hpbGUgKCRuZXh0X3QgIT0gJGluaXRfdCkKKwkJc2V0ICRuZXh0X3Q9KHN0cnVjdCB0YXNrX3N0cnVjdCAqKSRuZXh0X3QKKwkJcHJpbnRmICJcbnBpZCAlZDsgY29tbSAlczpcbiIsICRuZXh0X3QucGlkLCAkbmV4dF90LmNvbW0KKwkJcHJpbnRmICI9PT09PT09PT09PT09PT09PT09XG4iCisJCXNldCB2YXIgJHN0YWNrcCA9ICRuZXh0X3QudGhyZWFkLmVzcAorCQlzZXQgdmFyICRzdGFja190b3AgPSAoJHN0YWNrcCAmIH40MDk1KSArIDQwOTYKKwkJc2V0IHZhciAkc3RhY2tfYm90ID0gKCRzdGFja3AgJiB+NDA5NSkKKworCQlzZXQgJHN0YWNrcCA9ICooJHN0YWNrcCkKKwkJd2hpbGUgKCgkc3RhY2twIDwgJHN0YWNrX3RvcCkgJiYgKCRzdGFja3AgPiAkc3RhY2tfYm90KSkKKwkJCXNldCB2YXIgJGFkZHIgPSAqKCRzdGFja3AgKyA0KQorCQkJaW5mbyBzeW1ib2wgJGFkZHIKKwkJCXNldCAkc3RhY2twID0gKigkc3RhY2twKQorCQllbmQKKworCQlzZXQgJG5leHRfdGg9KCgoY2hhciAqKSRuZXh0X3QtPnBpZHNbMV0ucGlkX2xpc3QubmV4dCkgLSAkcGlkX29mZikKKwkJd2hpbGUgKCRuZXh0X3RoICE9ICRuZXh0X3QpCisJCQlzZXQgJG5leHRfdGg9KHN0cnVjdCB0YXNrX3N0cnVjdCAqKSRuZXh0X3RoCisJCQlwcmludGYgIlxucGlkICVkOyBjb21tICVzOlxuIiwgJG5leHRfdC5waWQsICRuZXh0X3QuY29tbQorCQkJcHJpbnRmICI9PT09PT09PT09PT09PT09PT09XG4iCisJCQlzZXQgdmFyICRzdGFja3AgPSAkbmV4dF90LnRocmVhZC5lc3AKKwkJCXNldCB2YXIgJHN0YWNrX3RvcCA9ICgkc3RhY2twICYgfjQwOTUpICsgNDA5NgorCQkJc2V0IHZhciAkc3RhY2tfYm90ID0gKCRzdGFja3AgJiB+NDA5NSkKKworCQkJc2V0ICRzdGFja3AgPSAqKCRzdGFja3ApCisJCQl3aGlsZSAoKCRzdGFja3AgPCAkc3RhY2tfdG9wKSAmJiAoJHN0YWNrcCA+ICRzdGFja19ib3QpKQorCQkJCXNldCB2YXIgJGFkZHIgPSAqKCRzdGFja3AgKyA0KQorCQkJCWluZm8gc3ltYm9sICRhZGRyCisJCQkJc2V0ICRzdGFja3AgPSAqKCRzdGFja3ApCisJCQllbmQKKwkJCXNldCAkbmV4dF90aD0oKChjaGFyICopJG5leHRfdGgtPnBpZHNbMV0ucGlkX2xpc3QubmV4dCkgLSAkcGlkX29mZikKKwkJZW5kCisJCXNldCAkbmV4dF90PShjaGFyICopKCRuZXh0X3QtPnRhc2tzLm5leHQpIC0gJHRhc2tzX29mZgorCWVuZAorZW5kCitkb2N1bWVudCBidHQKKwlkdW1wIGFsbCB0aHJlYWQgc3RhY2sgdHJhY2VzIG9uIGEga2VybmVsIGNvbXBpbGVkIHdpdGggQ09ORklHX0ZSQU1FX1BPSU5URVIKK2VuZAorCitkZWZpbmUgYnRwaWQKKwlzZXQgdmFyICRwaWQgPSAkYXJnMAorCXNldCAkdGFza3Nfb2ZmPSgoc2l6ZV90KSYoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTApLT50YXNrcykKKwlzZXQgJHBpZF9vZmY9KChzaXplX3QpJigoc3RydWN0IHRhc2tfc3RydWN0ICopMCktPnBpZHNbMV0ucGlkX2xpc3QubmV4dCkKKwlzZXQgJGluaXRfdD0maW5pdF90YXNrCisJc2V0ICRuZXh0X3Q9KCgoY2hhciAqKSgkaW5pdF90LT50YXNrcykubmV4dCkgLSAkdGFza3Nfb2ZmKQorCXNldCB2YXIgJHBpZF90YXNrID0gMAorCisJd2hpbGUgKCRuZXh0X3QgIT0gJGluaXRfdCkKKwkJc2V0ICRuZXh0X3Q9KHN0cnVjdCB0YXNrX3N0cnVjdCAqKSRuZXh0X3QKKworCQlpZiAoJG5leHRfdC5waWQgPT0gJHBpZCkKKwkJCXNldCAkcGlkX3Rhc2sgPSAkbmV4dF90CisJCWVuZAorCisJCXNldCAkbmV4dF90aD0oKChjaGFyICopJG5leHRfdC0+cGlkc1sxXS5waWRfbGlzdC5uZXh0KSAtICRwaWRfb2ZmKQorCQl3aGlsZSAoJG5leHRfdGggIT0gJG5leHRfdCkKKwkJCXNldCAkbmV4dF90aD0oc3RydWN0IHRhc2tfc3RydWN0ICopJG5leHRfdGgKKwkJCWlmICgkbmV4dF90aC5waWQgPT0gJHBpZCkKKwkJCQlzZXQgJHBpZF90YXNrID0gJG5leHRfdGgKKwkJCWVuZAorCQkJc2V0ICRuZXh0X3RoPSgoKGNoYXIgKikkbmV4dF90aC0+cGlkc1sxXS5waWRfbGlzdC5uZXh0KSAtICRwaWRfb2ZmKQorCQllbmQKKwkJc2V0ICRuZXh0X3Q9KGNoYXIgKikoJG5leHRfdC0+dGFza3MubmV4dCkgLSAkdGFza3Nfb2ZmCisJZW5kCisKKwlwcmludGYgIlxucGlkICVkOyBjb21tICVzOlxuIiwgJHBpZF90YXNrLnBpZCwgJHBpZF90YXNrLmNvbW0KKwlwcmludGYgIj09PT09PT09PT09PT09PT09PT1cbiIKKwlzZXQgdmFyICRzdGFja3AgPSAkcGlkX3Rhc2sudGhyZWFkLmVzcAorCXNldCB2YXIgJHN0YWNrX3RvcCA9ICgkc3RhY2twICYgfjQwOTUpICsgNDA5NgorCXNldCB2YXIgJHN0YWNrX2JvdCA9ICgkc3RhY2twICYgfjQwOTUpCisKKwlzZXQgJHN0YWNrcCA9ICooJHN0YWNrcCkKKwl3aGlsZSAoKCRzdGFja3AgPCAkc3RhY2tfdG9wKSAmJiAoJHN0YWNrcCA+ICRzdGFja19ib3QpKQorCQlzZXQgdmFyICRhZGRyID0gKigkc3RhY2twICsgNCkKKwkJaW5mbyBzeW1ib2wgJGFkZHIKKwkJc2V0ICRzdGFja3AgPSAqKCRzdGFja3ApCisJZW5kCitlbmQKK2RvY3VtZW50IGJ0cGlkCisJYmFja3RyYWNlIG9mIHBpZAorZW5kCisKKworZGVmaW5lIHRyYXBpbmZvCisJc2V0IHZhciAkcGlkID0gJGFyZzAKKwlzZXQgJHRhc2tzX29mZj0oKHNpemVfdCkmKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKikwKS0+dGFza3MpCisJc2V0ICRwaWRfb2ZmPSgoc2l6ZV90KSYoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTApLT5waWRzWzFdLnBpZF9saXN0Lm5leHQpCisJc2V0ICRpbml0X3Q9JmluaXRfdGFzaworCXNldCAkbmV4dF90PSgoKGNoYXIgKikoJGluaXRfdC0+dGFza3MpLm5leHQpIC0gJHRhc2tzX29mZikKKwlzZXQgdmFyICRwaWRfdGFzayA9IDAKKworCXdoaWxlICgkbmV4dF90ICE9ICRpbml0X3QpCisJCXNldCAkbmV4dF90PShzdHJ1Y3QgdGFza19zdHJ1Y3QgKikkbmV4dF90CisKKwkJaWYgKCRuZXh0X3QucGlkID09ICRwaWQpCisJCQlzZXQgJHBpZF90YXNrID0gJG5leHRfdAorCQllbmQKKworCQlzZXQgJG5leHRfdGg9KCgoY2hhciAqKSRuZXh0X3QtPnBpZHNbMV0ucGlkX2xpc3QubmV4dCkgLSAkcGlkX29mZikKKwkJd2hpbGUgKCRuZXh0X3RoICE9ICRuZXh0X3QpCisJCQlzZXQgJG5leHRfdGg9KHN0cnVjdCB0YXNrX3N0cnVjdCAqKSRuZXh0X3RoCisJCQlpZiAoJG5leHRfdGgucGlkID09ICRwaWQpCisJCQkJc2V0ICRwaWRfdGFzayA9ICRuZXh0X3RoCisJCQllbmQKKwkJCXNldCAkbmV4dF90aD0oKChjaGFyICopJG5leHRfdGgtPnBpZHNbMV0ucGlkX2xpc3QubmV4dCkgLSAkcGlkX29mZikKKwkJZW5kCisJCXNldCAkbmV4dF90PShjaGFyICopKCRuZXh0X3QtPnRhc2tzLm5leHQpIC0gJHRhc2tzX29mZgorCWVuZAorCisJcHJpbnRmICJUcmFwbm8gJWxkLCBjcjIgMHglbHgsIGVycm9yX2NvZGUgJWxkXG4iLCAkcGlkX3Rhc2sudGhyZWFkLnRyYXBfbm8sIFwKKwkJCQkkcGlkX3Rhc2sudGhyZWFkLmNyMiwgJHBpZF90YXNrLnRocmVhZC5lcnJvcl9jb2RlCisKK2VuZAorZG9jdW1lbnQgdHJhcGluZm8KKwlSdW4gaW5mbyB0aHJlYWRzIGFuZCBsb29rdXAgcGlkIG9mIHRocmVhZCAjMQorCSd0cmFwaW5mbyA8cGlkPicgd2lsbCB0ZWxsIHlvdSBieSB3aGljaCB0cmFwICYgcG9zc2libHkKKwlhZGRyZXN0aGUga2VybmVsIHBhbmljZWQuCitlbmQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGIvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMjEzZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0CkBAIC0wLDAgKzEsMTQxIEBACitEb2N1bWVudGF0aW9uIGZvciBrZHVtcCAtIHRoZSBrZXhlYy1iYXNlZCBjcmFzaCBkdW1waW5nIHNvbHV0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RFU0lHTgorPT09PT09CisKK0tkdW1wIHVzZXMga2V4ZWMgdG8gcmVib290IHRvIGEgc2Vjb25kIGtlcm5lbCB3aGVuZXZlciBhIGR1bXAgbmVlZHMgdG8gYmUgdGFrZW4uCitUaGlzIHNlY29uZCBrZXJuZWwgaXMgYm9vdGVkIHdpdGggdmVyeSBsaXR0bGUgbWVtb3J5LiBUaGUgZmlyc3Qga2VybmVsIHJlc2VydmVzCit0aGUgc2VjdGlvbiBvZiBtZW1vcnkgdGhhdCB0aGUgc2Vjb25kIGtlcm5lbCB1c2VzLiBUaGlzIGVuc3VyZXMgdGhhdCBvbi1nb2luZworRE1BIGZyb20gdGhlIGZpcnN0IGtlcm5lbCBkb2VzIG5vdCBjb3JydXB0IHRoZSBzZWNvbmQga2VybmVsLgorCitBbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBDb3JlIGltYWdlIGlzIGVuY29kZWQgaW4gRUxGIGZvcm1hdCBhbmQKK3N0b3JlZCBpbiByZXNlcnZlZCBhcmVhIG9mIG1lbW9yeSBiZWZvcmUgY3Jhc2guIFBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3RhcnQgb2YKK0VMRiBoZWFkZXIgaXMgcGFzc2VkIHRvIG5ldyBrZXJuZWwgdGhyb3VnaCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGVsZmNvcmVoZHI9LgorCitPbiBpMzg2LCB0aGUgZmlyc3QgNjQwIEtCIG9mIHBoeXNpY2FsIG1lbW9yeSBpcyBuZWVkZWQgdG8gYm9vdCwgaXJyZXNwZWN0aXZlCitvZiB3aGVyZSB0aGUga2VybmVsIGxvYWRzLiBIZW5jZSwgdGhpcyByZWdpb24gaXMgYmFja2VkIHVwIGJ5IGtleGVjIGp1c3QgYmVmb3JlCityZWJvb3RpbmcgaW50byB0aGUgbmV3IGtlcm5lbC4KKworSW4gdGhlIHNlY29uZCBrZXJuZWwsICJvbGQgbWVtb3J5IiBjYW4gYmUgYWNjZXNzZWQgaW4gdHdvIHdheXMuCisKKy0gVGhlIGZpcnN0IG9uZSBpcyB0aHJvdWdoIGEgL2Rldi9vbGRtZW0gZGV2aWNlIGludGVyZmFjZS4gQSBjYXB0dXJlIHV0aWxpdHkKKyAgY2FuIHJlYWQgdGhlIGRldmljZSBmaWxlIGFuZCB3cml0ZSBvdXQgdGhlIG1lbW9yeSBpbiByYXcgZm9ybWF0LiBUaGlzIGlzIHJhdworICBkdW1wIG9mIG1lbW9yeSBhbmQgYW5hbHlzaXMvY2FwdHVyZSB0b29sIHNob3VsZCBiZSBpbnRlbGxpZ2VudCBlbm91Z2ggdG8KKyAgZGV0ZXJtaW5lIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSByaWdodCBpbmZvcm1hdGlvbi4gRUxGIGhlYWRlcnMgKGVsZmNvcmVoZHI9KQorICBjYW4gYmVjb21lIGhhbmR5IGhlcmUuCisKKy0gVGhlIHNlY29uZCBpbnRlcmZhY2UgaXMgdGhyb3VnaCAvcHJvYy92bWNvcmUuIFRoaXMgZXhwb3J0cyB0aGUgZHVtcCBhcyBhbiBFTEYKKyAgZm9ybWF0IGZpbGUgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gb3V0IHVzaW5nIGFueSBmaWxlIGNvcHkgY29tbWFuZAorICAoY3AsIHNjcCwgZXRjKS4gRnVydGhlciwgZ2RiIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gbGltaXRlZCBkZWJ1Z2dpbmcgb24KKyAgdGhlIGR1bXAgZmlsZS4gVGhpcyBtZXRob2QgZW5zdXJlcyBtZXRob2RzIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGNvcnJlY3QKKyAgb3JkZXJpbmcgb2YgdGhlIGR1bXAgcGFnZXMgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IDY0MCBLQiB0aGF0IGhhcyBiZWVuCisgIHJlbG9jYXRlZCkuCisKK1NFVFVQCis9PT09PQorCisxKSBEb3dubG9hZCBodHRwOi8vd3d3LnhtaXNzaW9uLmNvbS9+ZWJpZWRlcm0vZmlsZXMva2V4ZWMva2V4ZWMtdG9vbHMtMS4xMDEudGFyLmd6CisgICBhbmQgYXBwbHkgaHR0cDovL2xzZS5zb3VyY2Vmb3JnZS5uZXQva2R1bXAvcGF0Y2hlcy9rZXhlYy10b29scy0xLjEwMS1rZHVtcC5wYXRjaAorICAgYW5kIGFmdGVyIHRoYXQgYnVpbGQgdGhlIHNvdXJjZS4KKworMikgRG93bmxvYWQgYW5kIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSAobGF0ZXN0KSBrZXhlYy9rZHVtcCAoLW1tKSBrZXJuZWwKKyAgIHBhdGNoc2V0IGFuZCBhcHBseSBpdCB0byB0aGUgdmFuaWxsYSBrZXJuZWwgdHJlZS4KKworICAgVHdvIGtlcm5lbHMgbmVlZCB0byBiZSBidWlsdCBpbiBvcmRlciB0byBnZXQgdGhpcyBmZWF0dXJlIHdvcmtpbmcuCisKKyAgQSkgRmlyc3Qga2VybmVsOgorICAgYSkgRW5hYmxlICJrZXhlYyBzeXN0ZW0gY2FsbCIgZmVhdHVyZSAoaW4gUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzKS4KKwlDT05GSUdfS0VYRUM9eQorICAgYikgVGhpcyBrZXJuZWwncyBwaHlzaWNhbCBsb2FkIGFkZHJlc3Mgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIG9mCisgICAgICAweDEwMDAwMCAoMHgxMDAwMDAsIDEgTUIpIChpbiBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMpLgorCUNPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMAorICAgYykgRW5hYmxlICJzeXNmcyBmaWxlIHN5c3RlbSBzdXBwb3J0IiAoaW4gUHNldWRvIGZpbGVzeXN0ZW1zKS4KKwlDT05GSUdfU1lTRlM9eQorICAgZCkgQm9vdCBpbnRvIGZpcnN0IGtlcm5lbCB3aXRoIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyICJjcmFzaGtlcm5lbD1ZQFgiLgorICAgICAgVXNlIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgWCBhbmQgWS4gWSBkZW5vdGVzIGhvdyBtdWNoIG1lbW9yeSB0byByZXNlcnZlCisgICAgICBmb3IgdGhlIHNlY29uZCBrZXJuZWwsIGFuZCBYIGRlbm90ZXMgYXQgd2hhdCBwaHlzaWNhbCBhZGRyZXNzIHRoZSByZXNlcnZlZAorICAgICAgbWVtb3J5IHNlY3Rpb24gc3RhcnRzLiBGb3IgZXhhbXBsZTogImNyYXNoa2VybmVsPTY0TUAxNk0iLgorCisgIEIpIFNlY29uZCBrZXJuZWw6CisgICBhKSBFbmFibGUgImtlcm5lbCBjcmFzaCBkdW1wcyIgZmVhdHVyZSAoaW4gUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzKS4KKwlDT05GSUdfQ1JBU0hfRFVNUD15CisgICBiKSBTcGVjaWZ5IGEgc3VpdGFibGUgdmFsdWUgZm9yICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMKKyAgICAgIGxvYWRlZCIgKGluIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcykuIFR5cGljYWxseSB0aGlzIHZhbHVlCisgICAgICBzaG91bGQgYmUgc2FtZSBhcyBYIChTZWUgb3B0aW9uIGQpIGFib3ZlLCBlLmcuLCAxNiBNQiBvciAweDEwMDAwMDAuCisJQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MTAwMDAwMAorICAgYykgRW5hYmxlICIvcHJvYy92bWNvcmUgc3VwcG9ydCIgKE9wdGlvbmFsLCBpbiBQc2V1ZG8gZmlsZXN5c3RlbXMpLgorCUNPTkZJR19QUk9DX1ZNQ09SRT15CisgICBkKSBEaXNhYmxlIFNNUCBzdXBwb3J0IGFuZCBidWlsZCBhIFVQIGtlcm5lbCAoVW50aWwgaXQgaXMgZml4ZWQpLgorICAgCUNPTkZJR19TTVA9bgorICAgZSkgRW5hYmxlICJMb2NhbCBBUElDIHN1cHBvcnQgb24gdW5pcHJvY2Vzc29ycyIuCisgICAJQ09ORklHX1g4Nl9VUF9BUElDPXkKKyAgIGYpIEVuYWJsZSAiSU8tQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCisgICAJQ09ORklHX1g4Nl9VUF9JT0FQSUM9eQorCisgIE5vdGU6ICAgaSkgT3B0aW9ucyBhKSBhbmQgYikgZGVwZW5kIHVwb24gIkNvbmZpZ3VyZSBzdGFuZGFyZCBrZXJuZWwgZmVhdHVyZXMKKwkgICAgIChmb3Igc21hbGwgc3lzdGVtcykiICh1bmRlciBHZW5lcmFsIHNldHVwKS4KKwkgaWkpIE9wdGlvbiBhKSBhbHNvIGRlcGVuZHMgb24gQ09ORklHX0hJR0hNRU0gKHVuZGVyIFByb2Nlc3NvcgorCQl0eXBlIGFuZCBmZWF0dXJlcykuCisJaWlpKSBCb3RoIG9wdGlvbiBhKSBhbmQgYikgYXJlIHVuZGVyICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiLgorCiszKSBCb290IGludG8gdGhlIGZpcnN0IGtlcm5lbC4gWW91IGFyZSBub3cgcmVhZHkgdG8gdHJ5IG91dCBrZXhlYy1iYXNlZCBjcmFzaAorICAgZHVtcHMuCisKKzQpIExvYWQgdGhlIHNlY29uZCBrZXJuZWwgdG8gYmUgYm9vdGVkIHVzaW5nOgorCisgICBrZXhlYyAtcCA8c2Vjb25kLWtlcm5lbD4gLS1jcmFzaC1kdW1wIC0tYXJncy1saW51eCAtLWFwcGVuZD0icm9vdD08cm9vdC1kZXY+CisgICBpbml0IDEgaXJxcG9sbCIKKworICAgTm90ZTogaSkgPHNlY29uZC1rZXJuZWw+IGhhcyB0byBiZSBhIHZtbGludXggaW1hZ2UuIGJ6SW1hZ2Ugd2lsbCBub3Qgd29yaywKKwkgICAgYXMgb2Ygbm93LgorCWlpKSBCeSBkZWZhdWx0IEVMRiBoZWFkZXJzIGFyZSBzdG9yZWQgaW4gRUxGMzIgZm9ybWF0IChmb3IgaTM4NikuIFRoaXMKKwkgICAgaXMgc3VmZmljaWVudCB0byByZXByZXNlbnQgdGhlIHBoeXNpY2FsIG1lbW9yeSB1cCB0byA0R0IuIFRvIHN0b3JlCisJICAgIGhlYWRlcnMgaW4gRUxGNjQgZm9ybWF0LCBzcGVjaWZpeSAiLS1lbGY2NC1jb3JlLWhlYWRlcnMiIG9uIHRoZQorCSAgICBrZXhlYyBjb21tYW5kIGxpbmUgYWRkaXRpb25hbGx5LgorICAgICAgIGlpaSkgU3BlY2lmeSAiaXJxcG9sbCIgYXMgY29tbWFuZCBsaW5lIHBhcmFtZXRlci4gVGhpcyByZWR1Y2VzIGRyaXZlcgorICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gZmFpbHVyZXMgaW4gc2Vjb25kIGtlcm5lbCBkdWUgdG8gc2hhcmVkIGludGVycnVwdHMuCisKKzUpIFN5c3RlbSByZWJvb3RzIGludG8gdGhlIHNlY29uZCBrZXJuZWwgd2hlbiBhIHBhbmljIG9jY3Vycy4gQSBtb2R1bGUgY2FuIGJlCisgICB3cml0dGVuIHRvIGZvcmNlIHRoZSBwYW5pYyBvciAiQUxULVN5c1JxLWMiIGNhbiBiZSB1c2VkIGluaXRpYXRlIGEgY3Jhc2gKKyAgIGR1bXAgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisKKzYpIFdyaXRlIG91dCB0aGUgZHVtcCBmaWxlIHVzaW5nCisKKyAgIGNwIC9wcm9jL3ZtY29yZSA8ZHVtcC1maWxlPgorCisgICBEdW1wIG1lbW9yeSBjYW4gYWxzbyBiZSBhY2Nlc3NlZCBhcyBhIC9kZXYvb2xkbWVtIGRldmljZSBmb3IgYSBsaW5lYXIvcmF3CisgICB2aWV3LiAgVG8gY3JlYXRlIHRoZSBkZXZpY2UsIHR5cGU6CisKKyAgIG1rbm9kIC9kZXYvb2xkbWVtIGMgMSAxMgorCisgICBVc2UgImRkIiB3aXRoIHN1aXRhYmxlIG9wdGlvbnMgZm9yIGNvdW50LCBicyBhbmQgc2tpcCB0byBhY2Nlc3Mgc3BlY2lmaWMKKyAgIHBvcnRpb25zIG9mIHRoZSBkdW1wLgorCisgICBFbnRpcmUgbWVtb3J5OiAgZGQgaWY9L2Rldi9vbGRtZW0gb2Y9b2xkbWVtLjAwMQorCitBTkFMWVNJUworPT09PT09PT0KKworTGltaXRlZCBhbmFseXNpcyBjYW4gYmUgZG9uZSB1c2luZyBnZGIgb24gdGhlIGR1bXAgZmlsZSBjb3BpZWQgb3V0IG9mCisvcHJvYy92bWNvcmUuIFVzZSB2bWxpbnV4IGJ1aWx0IHdpdGggLWcgYW5kIHJ1bgorCisgIGdkYiB2bWxpbnV4IDxkdW1wLWZpbGU+CisKK1N0YWNrIHRyYWNlIGZvciB0aGUgdGFzayBvbiBwcm9jZXNzb3IgMCwgcmVnaXN0ZXIgZGlzcGxheSwgbWVtb3J5IGRpc3BsYXkKK3dvcmsgZmluZS4KKworTm90ZTogZ2RiIGNhbm5vdCBhbmFseXNlIGNvcmUgZmlsZXMgZ2VuZXJhdGVkIGluIEVMRjY0IGZvcm1hdCBmb3IgaTM4Ni4KKworVE9ETworPT09PQorCisxKSBQcm92aWRlIGEga2VybmVsIHBhZ2VzIGZpbHRlcmluZyBtZWNoYW5pc20gc28gdGhhdCBjb3JlIGZpbGUgc2l6ZSBpcyBub3QKKyAgIGluc2FuZSBvbiBzeXN0ZW1zIGhhdmluZyBodWdlIG1lbW9yeSBiYW5rcy4KKzIpIE1vZGlmeSAiY3Jhc2giIHRvb2wgdG8gbWFrZSBpdCByZWNvZ25pemUgdGhpcyBkdW1wLgorCitDT05UQUNUCis9PT09PT09CisKK1ZpdmVrIEdveWFsICh2Z295YWxAaW4uaWJtLmNvbSkKK01hbmVlc2ggU29uaSAobWFuZWVzaEBpbi5pYm0uY29tKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA0OTI0ZDM4Ny4uYTk5OGE4YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTM3LDcgKzM3LDcgQEAKIAlJQS0zMglJQS0zMiBha2EgaTM4NiBhcmNoaXRlY3R1cmUgaXMgZW5hYmxlZC4KIAlJQS02NAlJQS02NCBhcmNoaXRlY3R1cmUgaXMgZW5hYmxlZC4KIAlJT1NDSEVECU1vcmUgdGhhbiBvbmUgSS9PIHNjaGVkdWxlciBpcyBlbmFibGVkLgotCUlQX1BOUAlJUCBEQ0hQLCBCT09UUCwgb3IgUkFSUCBpcyBlbmFibGVkLgorCUlQX1BOUAlJUCBESENQLCBCT09UUCwgb3IgUkFSUCBpcyBlbmFibGVkLgogCUlTQVBOUAlJU0EgUG5QIGNvZGUgaXMgZW5hYmxlZC4KIAlJU0ROCUFwcHJvcHJpYXRlIElTRE4gc3VwcG9ydCBpcyBlbmFibGVkLgogCUpPWQlBcHByb3ByaWF0ZSBqb3lzdGljayBzdXBwb3J0IGlzIGVuYWJsZWQuCkBAIC0zNTgsNiArMzU4LDEwIEBACiAJY3BpYV9wcD0JW0hXLFBQVF0KIAkJCUZvcm1hdDogeyBwYXJwb3J0PG5yPiB8IGF1dG8gfCBub25lIH0KIAorCWNyYXNoa2VybmVsPW5uW0tNR11Ac3NbS01HXQorCQkJW0tOTF0gUmVzZXJ2ZSBhIGNodW5rIG9mIHBoeXNpY2FsIG1lbW9yeSB0bworCQkJaG9sZCBhIGtlcm5lbCB0byBzd2l0Y2ggdG8gd2l0aCBrZXhlYyBvbiBwYW5pYy4KKwogCWNzNDIzMj0JCVtIVyxPU1NdCiAJCQlGb3JtYXQ6IDxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4KIApAQCAtNDQ3LDYgKzQ1MSwxMCBAQAogCQkJRm9ybWF0OiB7ImFzInwiY2ZxInwiZGVhZGxpbmUifCJub29wIn0KIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrL2FzLWlvc2NoZWQudHh0CiAJCQlhbmQgRG9jdW1lbnRhdGlvbi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLnR4dCBmb3IgZGV0YWlscy4KKwllbGZjb3JlaGRyPQlbSUEtMzJdCisJCQlTcGVjaWZpZXMgcGh5c2ljYWwgYWRkcmVzcyBvZiBzdGFydCBvZiBrZXJuZWwgY29yZSBpbWFnZQorCQkJZWxmIGhlYWRlci4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL2tkdW1wLnR4dCBmb3IgZGV0YWlscy4KIAogCWVuZm9yY2luZwlbU0VMSU5VWF0gU2V0IGluaXRpYWwgZW5mb3JjaW5nIHN0YXR1cy4KIAkJCUZvcm1hdDogeyIwIiB8ICIxIn0KQEAgLTU0OCw2ICs1NTYsOSBAQAogCiAJaTgxMD0JCVtIVyxEUk1dCiAKKwlpOGsuaWdub3JlX2RtaQlbSFddIENvbnRpbnVlIHByb2JpbmcgaGFyZHdhcmUgZXZlbiBpZiBETUkgZGF0YQorCQkJaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBpcyBydW5uaW5nIG9uIHVuc3VwcG9ydGVkCisJCQloYXJkd2FyZS4KIAlpOGsuZm9yY2UJW0hXXSBBY3RpdmF0ZSBpOGsgZHJpdmVyIGV2ZW4gaWYgU01NIEJJT1Mgc2lnbmF0dXJlCiAJCQlkb2VzIG5vdCBtYXRjaCBsaXN0IG9mIHN1cHBvcnRlZCBtb2RlbHMuCiAJaThrLnBvd2VyX3N0YXR1cwpAQCAtNjExLDYgKzYyMiwxNyBAQAogCWlwcz0JCVtIVyxTQ1NJXSBBZGFwdGVjIC8gSUJNIFNlcnZlUkFJRCBjb250cm9sbGVyCiAJCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS9pcHMuYy4KIAorCWlycWZpeHVwCVtIV10KKwkJCVdoZW4gYW4gaW50ZXJydXB0IGlzIG5vdCBoYW5kbGVkIHNlYXJjaCBhbGwgaGFuZGxlcnMKKwkJCWZvciBpdC4gSW50ZW5kZWQgdG8gZ2V0IHN5c3RlbXMgd2l0aCBiYWRseSBicm9rZW4KKwkJCWZpcm13YXJlIHJ1bm5pbmcuCisKKwlpcnFwb2xsCQlbSFddCisJCQlXaGVuIGFuIGludGVycnVwdCBpcyBub3QgaGFuZGxlZCBzZWFyY2ggYWxsIGhhbmRsZXJzCisJCQlmb3IgaXQuIEFsc28gY2hlY2sgYWxsIGhhbmRsZXJzIGVhY2ggdGltZXIKKwkJCWludGVycnVwdC4gSW50ZW5kZWQgdG8gZ2V0IHN5c3RlbXMgd2l0aCBiYWRseSBicm9rZW4KKwkJCWZpcm13YXJlIHJ1bm5pbmcuCisKIAlpc2FwbnA9CQlbSVNBUE5QXQogCQkJRm9ybWF0OiA8UkRQPiwgPHJlc2V0PiwgPHBjaV9zY2FuPiwgPHZlcmJvc2l0eT4KIApAQCAtNzM2LDYgKzc1OCw5IEBACiAJbWF4Y3B1cz0JW1NNUF0gTWF4aW11bSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0aGF0CWFuIFNNUCBrZXJuZWwKIAkJCXNob3VsZCBtYWtlIHVzZSBvZgogCisJbWF4X2FkZHI9W0tNR10JW0tOTCxCT09ULGlhNjRdIEFsbCBwaHlzaWNhbCBtZW1vcnkgZ3JlYXRlciB0aGFuIG9yCisJCQllcXVhbCB0byB0aGlzIHBoeXNpY2FsIGFkZHJlc3MgaXMgaWdub3JlZC4KKwogCW1heF9sdW5zPQlbU0NTSV0gTWF4aW11bSBudW1iZXIgb2YgTFVOcyB0byBwcm9iZQogCQkJU2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMl4zMi0xLgogCkBAIC0xMDE5LDYgKzEwNDQsMTAgQEAKIAkJaXJxbWFzaz0weE1NTU0JCVtJQS0zMl0gU2V0IGEgYml0IG1hc2sgb2YgSVJRcyBhbGxvd2VkIHRvIGJlIGFzc2lnbmVkCiAJCQkJCWF1dG9tYXRpY2FsbHkgdG8gUENJIGRldmljZXMuIFlvdSBjYW4gbWFrZSB0aGUga2VybmVsCiAJCQkJCWV4Y2x1ZGUgSVJRcyBvZiB5b3VyIElTQSBjYXJkcyB0aGlzIHdheS4KKwkJcGlycWFkZHI9MHhBQUFBQQlbSUEtMzJdIFNwZWNpZnkgdGhlIHBoeXNpY2FsIGFkZHJlc3MKKwkJCQkJb2YgdGhlIFBJUlEgdGFibGUgKG5vcm1hbGx5IGdlbmVyYXRlZAorCQkJCQlieSB0aGUgQklPUykgaWYgaXQgaXMgb3V0c2lkZSB0aGUKKwkJCQkJRjAwMDBoLTEwMDAwMGggcmFuZ2UuCiAJCWxhc3RidXM9TgkJW0lBLTMyXSBTY2FuIGFsbCBidXNlcyB0aWxsIGJ1cyAjTi4gQ2FuIGJlIHVzZWZ1bAogCQkJCQlpZiB0aGUga2VybmVsIGlzIHVuYWJsZSB0byBmaW5kIHlvdXIgc2Vjb25kYXJ5IGJ1c2VzCiAJCQkJCWFuZCB5b3Ugd2FudCB0byB0ZWxsIGl0IGV4cGxpY2l0bHkgd2hpY2ggb25lcyB0aGV5IGFyZS4KQEAgLTExMDQsNyArMTEzMyw3IEBACiAJCQlTZWUgRG9jdW1lbnRhdGlvbi9yYW1kaXNrLnR4dC4KIAogCXBzbW91c2UucHJvdG89ICBbSFcsTU9VU0VdIEhpZ2hlc3QgUFMyIG1vdXNlIHByb3RvY29sIGV4dGVuc2lvbiB0bwotCQkJcHJvYmUgZm9yIChiYXJlfGltcHN8ZXhwcykuCisJCQlwcm9iZSBmb3IgKGJhcmV8aW1wc3xleHBzfGxpZmVib29rfGFueSkuCiAJcHNtb3VzZS5yYXRlPQlbSFcsTU9VU0VdIFNldCBkZXNpcmVkIG1vdXNlIHJlcG9ydCByYXRlLCBpbiByZXBvcnRzCiAJCQlwZXIgc2Vjb25kLgogCXBzbW91c2UucmVzZXRhZnRlcj0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2V5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2tleXMudHh0CmluZGV4IDM2ZDgwYWUuLjAzMjFkZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dApAQCAtMjIsNiArMjIsNyBAQAogCS0gTmV3IHByb2NmcyBmaWxlcwogCS0gVXNlcnNwYWNlIHN5c3RlbSBjYWxsIGludGVyZmFjZQogCS0gS2VybmVsIHNlcnZpY2VzCisJLSBOb3RlcyBvbiBhY2Nlc3NpbmcgcGF5bG9hZCBjb250ZW50cwogCS0gRGVmaW5pbmcgYSBrZXkgdHlwZQogCS0gUmVxdWVzdC1rZXkgY2FsbGJhY2sgc2VydmljZQogCS0gS2V5IGFjY2VzcyBmaWxlc3lzdGVtCkBAIC00NSwyNyArNDYsMjYgQEAKIAktIFN0YXRlLgogCiAKLSAoKikgRWFjaCBrZXkgaXMgaXNzdWVkIGEgc2VyaWFsIG51bWJlciBvZiB0eXBlIGtleV9zZXJpYWxfdCB0aGF0IGlzIHVuaXF1ZQotICAgICBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoYXQga2V5LiBBbGwgc2VyaWFsIG51bWJlcnMgYXJlIHBvc2l0aXZlIG5vbi16ZXJvCi0gICAgIDMyLWJpdCBpbnRlZ2Vycy4KKyAoKikgRWFjaCBrZXkgaXMgaXNzdWVkIGEgc2VyaWFsIG51bWJlciBvZiB0eXBlIGtleV9zZXJpYWxfdCB0aGF0IGlzIHVuaXF1ZSBmb3IKKyAgICAgdGhlIGxpZmV0aW1lIG9mIHRoYXQga2V5LiBBbGwgc2VyaWFsIG51bWJlcnMgYXJlIHBvc2l0aXZlIG5vbi16ZXJvIDMyLWJpdAorICAgICBpbnRlZ2Vycy4KIAogICAgICBVc2Vyc3BhY2UgcHJvZ3JhbXMgY2FuIHVzZSBhIGtleSdzIHNlcmlhbCBudW1iZXJzIGFzIGEgd2F5IHRvIGdhaW4gYWNjZXNzCiAgICAgIHRvIGl0LCBzdWJqZWN0IHRvIHBlcm1pc3Npb24gY2hlY2tpbmcuCiAKICAoKikgRWFjaCBrZXkgaXMgb2YgYSBkZWZpbmVkICJ0eXBlIi4gVHlwZXMgbXVzdCBiZSByZWdpc3RlcmVkIGluc2lkZSB0aGUKLSAgICAga2VybmVsIGJ5IGEga2VybmVsIHNlcnZpY2UgKHN1Y2ggYXMgYSBmaWxlc3lzdGVtKSBiZWZvcmUga2V5cyBvZiB0aGF0Ci0gICAgIHR5cGUgY2FuIGJlIGFkZGVkIG9yIHVzZWQuIFVzZXJzcGFjZSBwcm9ncmFtcyBjYW5ub3QgZGVmaW5lIG5ldyB0eXBlcwotICAgICBkaXJlY3RseS4KKyAgICAga2VybmVsIGJ5IGEga2VybmVsIHNlcnZpY2UgKHN1Y2ggYXMgYSBmaWxlc3lzdGVtKSBiZWZvcmUga2V5cyBvZiB0aGF0IHR5cGUKKyAgICAgY2FuIGJlIGFkZGVkIG9yIHVzZWQuIFVzZXJzcGFjZSBwcm9ncmFtcyBjYW5ub3QgZGVmaW5lIG5ldyB0eXBlcyBkaXJlY3RseS4KIAotICAgICBLZXkgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBrZXJuZWwgYnkgc3RydWN0IGtleV90eXBlLiBUaGlzIGRlZmluZXMKLSAgICAgYSBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gYSBrZXkgb2YgdGhhdCB0eXBlLgorICAgICBLZXkgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGluIHRoZSBrZXJuZWwgYnkgc3RydWN0IGtleV90eXBlLiBUaGlzIGRlZmluZXMgYQorICAgICBudW1iZXIgb2Ygb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gYSBrZXkgb2YgdGhhdCB0eXBlLgogCiAgICAgIFNob3VsZCBhIHR5cGUgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0sIGFsbCB0aGUga2V5cyBvZiB0aGF0IHR5cGUgd2lsbAogICAgICBiZSBpbnZhbGlkYXRlZC4KIAogICgqKSBFYWNoIGtleSBoYXMgYSBkZXNjcmlwdGlvbi4gVGhpcyBzaG91bGQgYmUgYSBwcmludGFibGUgc3RyaW5nLiBUaGUga2V5Ci0gICAgIHR5cGUgcHJvdmlkZXMgYW4gb3BlcmF0aW9uIHRvIHBlcmZvcm0gYSBtYXRjaCBiZXR3ZWVuIHRoZSBkZXNjcmlwdGlvbiBvbgotICAgICBhIGtleSBhbmQgYSBjcml0ZXJpb24gc3RyaW5nLgorICAgICB0eXBlIHByb3ZpZGVzIGFuIG9wZXJhdGlvbiB0byBwZXJmb3JtIGEgbWF0Y2ggYmV0d2VlbiB0aGUgZGVzY3JpcHRpb24gb24gYQorICAgICBrZXkgYW5kIGEgY3JpdGVyaW9uIHN0cmluZy4KIAogICgqKSBFYWNoIGtleSBoYXMgYW4gb3duZXIgdXNlciBJRCwgYSBncm91cCBJRCBhbmQgYSBwZXJtaXNzaW9ucyBtYXNrLiBUaGVzZQogICAgICBhcmUgdXNlZCB0byBjb250cm9sIHdoYXQgYSBwcm9jZXNzIG1heSBkbyB0byBhIGtleSBmcm9tIHVzZXJzcGFjZSwgYW5kCkBAIC03NCwxMCArNzQsMTAgQEAKICAoKikgRWFjaCBrZXkgY2FuIGJlIHNldCB0byBleHBpcmUgYXQgYSBzcGVjaWZpYyB0aW1lIGJ5IHRoZSBrZXkgdHlwZSdzCiAgICAgIGluc3RhbnRpYXRpb24gZnVuY3Rpb24uIEtleXMgY2FuIGFsc28gYmUgaW1tb3J0YWwuCiAKLSAoKikgRWFjaCBrZXkgY2FuIGhhdmUgYSBwYXlsb2FkLiBUaGlzIGlzIGEgcXVhbnRpdHkgb2YgZGF0YSB0aGF0IHJlcHJlc2VudAotICAgICB0aGUgYWN0dWFsICJrZXkiLiBJbiB0aGUgY2FzZSBvZiBhIGtleXJpbmcsIHRoaXMgaXMgYSBsaXN0IG9mIGtleXMgdG8KLSAgICAgd2hpY2ggdGhlIGtleXJpbmcgbGlua3M7IGluIHRoZSBjYXNlIG9mIGEgdXNlci1kZWZpbmVkIGtleSwgaXQncyBhbgotICAgICBhcmJpdHJhcnkgYmxvYiBvZiBkYXRhLgorICgqKSBFYWNoIGtleSBjYW4gaGF2ZSBhIHBheWxvYWQuIFRoaXMgaXMgYSBxdWFudGl0eSBvZiBkYXRhIHRoYXQgcmVwcmVzZW50IHRoZQorICAgICBhY3R1YWwgImtleSIuIEluIHRoZSBjYXNlIG9mIGEga2V5cmluZywgdGhpcyBpcyBhIGxpc3Qgb2Yga2V5cyB0byB3aGljaAorICAgICB0aGUga2V5cmluZyBsaW5rczsgaW4gdGhlIGNhc2Ugb2YgYSB1c2VyLWRlZmluZWQga2V5LCBpdCdzIGFuIGFyYml0cmFyeQorICAgICBibG9iIG9mIGRhdGEuCiAKICAgICAgSGF2aW5nIGEgcGF5bG9hZCBpcyBub3QgcmVxdWlyZWQ7IGFuZCB0aGUgcGF5bG9hZCBjYW4sIGluIGZhY3QsIGp1c3QgYmUgYQogICAgICB2YWx1ZSBzdG9yZWQgaW4gdGhlIHN0cnVjdCBrZXkgaXRzZWxmLgpAQCAtOTIsOCArOTIsOCBAQAogCiAgKCopIEVhY2gga2V5IGNhbiBiZSBpbiBvbmUgb2YgYSBudW1iZXIgb2YgYmFzaWMgc3RhdGVzOgogCi0gICAgICgqKSBVbmluc3RhbnRpYXRlZC4gVGhlIGtleSBleGlzdHMsIGJ1dCBkb2VzIG5vdCBoYXZlIGFueSBkYXRhCi0JIGF0dGFjaGVkLiBLZXlzIGJlaW5nIHJlcXVlc3RlZCBmcm9tIHVzZXJzcGFjZSB3aWxsIGJlIGluIHRoaXMgc3RhdGUuCisgICAgICgqKSBVbmluc3RhbnRpYXRlZC4gVGhlIGtleSBleGlzdHMsIGJ1dCBkb2VzIG5vdCBoYXZlIGFueSBkYXRhIGF0dGFjaGVkLgorICAgICAJIEtleXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdXNlcnNwYWNlIHdpbGwgYmUgaW4gdGhpcyBzdGF0ZS4KIAogICAgICAoKikgSW5zdGFudGlhdGVkLiBUaGlzIGlzIHRoZSBub3JtYWwgc3RhdGUuIFRoZSBrZXkgaXMgZnVsbHkgZm9ybWVkLCBhbmQKIAkgaGFzIGRhdGEgYXR0YWNoZWQuCkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogICAgICBjbG9uZSwgZm9yaywgdmZvcmsgb3IgZXhlY3ZlIG9jY3Vycy4gQSBuZXcga2V5cmluZyBpcyBjcmVhdGVkIG9ubHkgd2hlbgogICAgICByZXF1aXJlZC4KIAotICAgICBUaGUgcHJvY2Vzcy1zcGVjaWZpYyBrZXlyaW5nIGlzIHJlcGxhY2VkIHdpdGggYW4gZW1wdHkgb25lIGluIHRoZSBjaGlsZAotICAgICBvbiBjbG9uZSwgZm9yaywgdmZvcmsgdW5sZXNzIENMT05FX1RIUkVBRCBpcyBzdXBwbGllZCwgaW4gd2hpY2ggY2FzZSBpdAotICAgICBpcyBzaGFyZWQuIGV4ZWN2ZSBhbHNvIGRpc2NhcmRzIHRoZSBwcm9jZXNzJ3MgcHJvY2VzcyBrZXlyaW5nIGFuZCBjcmVhdGVzCi0gICAgIGEgbmV3IG9uZS4KKyAgICAgVGhlIHByb2Nlc3Mtc3BlY2lmaWMga2V5cmluZyBpcyByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IG9uZSBpbiB0aGUgY2hpbGQgb24KKyAgICAgY2xvbmUsIGZvcmssIHZmb3JrIHVubGVzcyBDTE9ORV9USFJFQUQgaXMgc3VwcGxpZWQsIGluIHdoaWNoIGNhc2UgaXQgaXMKKyAgICAgc2hhcmVkLiBleGVjdmUgYWxzbyBkaXNjYXJkcyB0aGUgcHJvY2VzcydzIHByb2Nlc3Mga2V5cmluZyBhbmQgY3JlYXRlcyBhCisgICAgIG5ldyBvbmUuCiAKICAgICAgVGhlIHNlc3Npb24tc3BlY2lmaWMga2V5cmluZyBpcyBwZXJzaXN0ZW50IGFjcm9zcyBjbG9uZSwgZm9yaywgdmZvcmsgYW5kCiAgICAgIGV4ZWN2ZSwgZXZlbiB3aGVuIHRoZSBsYXR0ZXIgZXhlY3V0ZXMgYSBzZXQtVUlEIG9yIHNldC1HSUQgYmluYXJ5LiBBCkBAIC0xNzcsMTEgKzE3NywxMSBAQAogICAgICBJZiBhIHN5c3RlbSBjYWxsIHRoYXQgbW9kaWZpZXMgYSBrZXkgb3Iga2V5cmluZyBpbiBzb21lIHdheSB3b3VsZCBwdXQgdGhlCiAgICAgIHVzZXIgb3ZlciBxdW90YSwgdGhlIG9wZXJhdGlvbiBpcyByZWZ1c2VkIGFuZCBlcnJvciBFRFFVT1QgaXMgcmV0dXJuZWQuCiAKLSAoKikgVGhlcmUncyBhIHN5c3RlbSBjYWxsIGludGVyZmFjZSBieSB3aGljaCB1c2Vyc3BhY2UgcHJvZ3JhbXMgY2FuIGNyZWF0ZQotICAgICBhbmQgbWFuaXB1bGF0ZSBrZXlzIGFuZCBrZXlyaW5ncy4KKyAoKikgVGhlcmUncyBhIHN5c3RlbSBjYWxsIGludGVyZmFjZSBieSB3aGljaCB1c2Vyc3BhY2UgcHJvZ3JhbXMgY2FuIGNyZWF0ZSBhbmQKKyAgICAgbWFuaXB1bGF0ZSBrZXlzIGFuZCBrZXlyaW5ncy4KIAotICgqKSBUaGVyZSdzIGEga2VybmVsIGludGVyZmFjZSBieSB3aGljaCBzZXJ2aWNlcyBjYW4gcmVnaXN0ZXIgdHlwZXMgYW5kCi0gICAgIHNlYXJjaCBmb3Iga2V5cy4KKyAoKikgVGhlcmUncyBhIGtlcm5lbCBpbnRlcmZhY2UgYnkgd2hpY2ggc2VydmljZXMgY2FuIHJlZ2lzdGVyIHR5cGVzIGFuZCBzZWFyY2gKKyAgICAgZm9yIGtleXMuCiAKICAoKikgVGhlcmUncyBhIHdheSBmb3IgdGhlIGEgc2VhcmNoIGRvbmUgZnJvbSB0aGUga2VybmVsIHRvIGNhbGwgYmFjayB0bwogICAgICB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBhIGtleSB0aGF0IGNhbid0IGJlIGZvdW5kIGluIGEgcHJvY2VzcydzIGtleXJpbmdzLgpAQCAtMTk0LDkgKzE5NCw5IEBACiBLRVkgQUNDRVNTIFBFUk1JU1NJT05TCiA9PT09PT09PT09PT09PT09PT09PT09CiAKLUtleXMgaGF2ZSBhbiBvd25lciB1c2VyIElELCBhIGdyb3VwIGFjY2VzcyBJRCwgYW5kIGEgcGVybWlzc2lvbnMgbWFzay4gVGhlCi1tYXNrIGhhcyB1cCB0byBlaWdodCBiaXRzIGVhY2ggZm9yIHVzZXIsIGdyb3VwIGFuZCBvdGhlciBhY2Nlc3MuIE9ubHkgZml2ZSBvZgotZWFjaCBzZXQgb2YgZWlnaHQgYml0cyBhcmUgZGVmaW5lZC4gVGhlc2UgcGVybWlzc2lvbnMgZ3JhbnRlZCBhcmU6CitLZXlzIGhhdmUgYW4gb3duZXIgdXNlciBJRCwgYSBncm91cCBhY2Nlc3MgSUQsIGFuZCBhIHBlcm1pc3Npb25zIG1hc2suIFRoZSBtYXNrCitoYXMgdXAgdG8gZWlnaHQgYml0cyBlYWNoIGZvciB1c2VyLCBncm91cCBhbmQgb3RoZXIgYWNjZXNzLiBPbmx5IGZpdmUgb2YgZWFjaAorc2V0IG9mIGVpZ2h0IGJpdHMgYXJlIGRlZmluZWQuIFRoZXNlIHBlcm1pc3Npb25zIGdyYW50ZWQgYXJlOgogCiAgKCopIFZpZXcKIApAQCAtMjEwLDggKzIxMCw4IEBACiAKICAoKikgV3JpdGUKIAotICAgICBUaGlzIHBlcm1pdHMgYSBrZXkncyBwYXlsb2FkIHRvIGJlIGluc3RhbnRpYXRlZCBvciB1cGRhdGVkLCBvciBpdCBhbGxvd3MKLSAgICAgYSBsaW5rIHRvIGJlIGFkZGVkIHRvIG9yIHJlbW92ZWQgZnJvbSBhIGtleXJpbmcuCisgICAgIFRoaXMgcGVybWl0cyBhIGtleSdzIHBheWxvYWQgdG8gYmUgaW5zdGFudGlhdGVkIG9yIHVwZGF0ZWQsIG9yIGl0IGFsbG93cyBhCisgICAgIGxpbmsgdG8gYmUgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIGEga2V5cmluZy4KIAogICgqKSBTZWFyY2gKIApAQCAtMjM4LDggKzIzOCw4IEBACiAgKCopIC9wcm9jL2tleXMKIAogICAgICBUaGlzIGxpc3RzIGFsbCB0aGUga2V5cyBvbiB0aGUgc3lzdGVtLCBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIKLSAgICAgdHlwZSwgZGVzY3JpcHRpb24gYW5kIHBlcm1pc3Npb25zLiBUaGUgcGF5bG9hZCBvZiB0aGUga2V5IGlzIG5vdAotICAgICBhdmFpbGFibGUgdGhpcyB3YXk6CisgICAgIHR5cGUsIGRlc2NyaXB0aW9uIGFuZCBwZXJtaXNzaW9ucy4gVGhlIHBheWxvYWQgb2YgdGhlIGtleSBpcyBub3QgYXZhaWxhYmxlCisgICAgIHRoaXMgd2F5OgogCiAJU0VSSUFMICAgRkxBR1MgIFVTQUdFIEVYUFkgUEVSTSAgIFVJRCAgIEdJRCAgIFRZUEUgICAgICBERVNDUklQVElPTjogU1VNTUFSWQogCTAwMDAwMDAxIEktLS0tLSAgICAzOSBwZXJtIDFmMDAwMCAgICAgMCAgICAgMCBrZXlyaW5nICAgX3VpZF9zZXMuMDogMS80CkBAIC0zMTgsMjEgKzMxOCwyMSBAQAogICAgICBJZiBhIGtleSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBkZXNjcmlwdGlvbiBhcyB0aGF0IHByb3Bvc2VkIGFscmVhZHkgZXhpc3RzCiAgICAgIGluIHRoZSBrZXlyaW5nLCB0aGlzIHdpbGwgdHJ5IHRvIHVwZGF0ZSBpdCB3aXRoIHRoZSBnaXZlbiBwYXlsb2FkLCBvciBpdAogICAgICB3aWxsIHJldHVybiBlcnJvciBFRVhJU1QgaWYgdGhhdCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXkKLSAgICAgdHlwZS4gVGhlIHByb2Nlc3MgbXVzdCBhbHNvIGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSB0byB0aGUga2V5IHRvIGJlCi0gICAgIGFibGUgdG8gdXBkYXRlIGl0LiBUaGUgbmV3IGtleSB3aWxsIGhhdmUgYWxsIHVzZXIgcGVybWlzc2lvbnMgZ3JhbnRlZCBhbmQKLSAgICAgbm8gZ3JvdXAgb3IgdGhpcmQgcGFydHkgcGVybWlzc2lvbnMuCisgICAgIHR5cGUuIFRoZSBwcm9jZXNzIG11c3QgYWxzbyBoYXZlIHBlcm1pc3Npb24gdG8gd3JpdGUgdG8gdGhlIGtleSB0byBiZSBhYmxlCisgICAgIHRvIHVwZGF0ZSBpdC4gVGhlIG5ldyBrZXkgd2lsbCBoYXZlIGFsbCB1c2VyIHBlcm1pc3Npb25zIGdyYW50ZWQgYW5kIG5vCisgICAgIGdyb3VwIG9yIHRoaXJkIHBhcnR5IHBlcm1pc3Npb25zLgogCi0gICAgIE90aGVyd2lzZSwgdGhpcyB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlIGEgbmV3IGtleSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLSAgICAgYW5kIGRlc2NyaXB0aW9uLCBhbmQgdG8gaW5zdGFudGlhdGUgaXQgd2l0aCB0aGUgc3VwcGxpZWQgcGF5bG9hZCBhbmQKLSAgICAgYXR0YWNoIGl0IHRvIHRoZSBrZXlyaW5nLiBJbiB0aGlzIGNhc2UsIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIHRoZQotICAgICBwcm9jZXNzIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSB0byB0aGUga2V5cmluZy4KKyAgICAgT3RoZXJ3aXNlLCB0aGlzIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcga2V5IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQKKyAgICAgZGVzY3JpcHRpb24sIGFuZCB0byBpbnN0YW50aWF0ZSBpdCB3aXRoIHRoZSBzdXBwbGllZCBwYXlsb2FkIGFuZCBhdHRhY2ggaXQKKyAgICAgdG8gdGhlIGtleXJpbmcuIEluIHRoaXMgY2FzZSwgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaWYgdGhlIHByb2Nlc3MKKyAgICAgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIHRvIHRoZSBrZXlyaW5nLgogCiAgICAgIFRoZSBwYXlsb2FkIGlzIG9wdGlvbmFsLCBhbmQgdGhlIHBvaW50ZXIgY2FuIGJlIE5VTEwgaWYgbm90IHJlcXVpcmVkIGJ5CiAgICAgIHRoZSB0eXBlLiBUaGUgcGF5bG9hZCBpcyBwbGVuIGluIHNpemUsIGFuZCBwbGVuIGNhbiBiZSB6ZXJvIGZvciBhbiBlbXB0eQogICAgICBwYXlsb2FkLgogCi0gICAgIEEgbmV3IGtleXJpbmcgY2FuIGJlIGdlbmVyYXRlZCBieSBzZXR0aW5nIHR5cGUgImtleXJpbmciLCB0aGUga2V5cmluZwotICAgICBuYW1lIGFzIHRoZSBkZXNjcmlwdGlvbiAob3IgTlVMTCkgYW5kIHNldHRpbmcgdGhlIHBheWxvYWQgdG8gTlVMTC4KKyAgICAgQSBuZXcga2V5cmluZyBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHNldHRpbmcgdHlwZSAia2V5cmluZyIsIHRoZSBrZXlyaW5nIG5hbWUKKyAgICAgYXMgdGhlIGRlc2NyaXB0aW9uIChvciBOVUxMKSBhbmQgc2V0dGluZyB0aGUgcGF5bG9hZCB0byBOVUxMLgogCiAgICAgIFVzZXIgZGVmaW5lZCBrZXlzIGNhbiBiZSBjcmVhdGVkIGJ5IHNwZWNpZnlpbmcgdHlwZSAidXNlciIuIEl0IGlzCiAgICAgIHJlY29tbWVuZGVkIHRoYXQgYSB1c2VyIGRlZmluZWQga2V5J3MgZGVzY3JpcHRpb24gYnkgcHJlZml4ZWQgd2l0aCBhIHR5cGUKQEAgLTM2OSw5ICszNjksOSBAQAogCWtleV9zZXJpYWxfdCBrZXljdGwoS0VZQ1RMX0dFVF9LRVlSSU5HX0lELCBrZXlfc2VyaWFsX3QgaWQsCiAJCQkgICAgaW50IGNyZWF0ZSk7CiAKLSAgICAgVGhlIHNwZWNpYWwga2V5IHNwZWNpZmllZCBieSAiaWQiIGlzIGxvb2tlZCB1cCAod2l0aCB0aGUga2V5IGJlaW5nCi0gICAgIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5KSBhbmQgdGhlIElEIG9mIHRoZSBrZXkgb3Iga2V5cmluZyB0aHVzIGZvdW5kIGlzCi0gICAgIHJldHVybmVkIGlmIGl0IGV4aXN0cy4KKyAgICAgVGhlIHNwZWNpYWwga2V5IHNwZWNpZmllZCBieSAiaWQiIGlzIGxvb2tlZCB1cCAod2l0aCB0aGUga2V5IGJlaW5nIGNyZWF0ZWQKKyAgICAgaWYgbmVjZXNzYXJ5KSBhbmQgdGhlIElEIG9mIHRoZSBrZXkgb3Iga2V5cmluZyB0aHVzIGZvdW5kIGlzIHJldHVybmVkIGlmCisgICAgIGl0IGV4aXN0cy4KIAogICAgICBJZiB0aGUga2V5IGRvZXMgbm90IHlldCBleGlzdCwgdGhlIGtleSB3aWxsIGJlIGNyZWF0ZWQgaWYgImNyZWF0ZSIgaXMKICAgICAgbm9uLXplcm87IGFuZCB0aGUgZXJyb3IgRU5PS0VZIHdpbGwgYmUgcmV0dXJuZWQgaWYgImNyZWF0ZSIgaXMgemVyby4KQEAgLTQwMiw4ICs0MDIsOCBAQAogCiAgICAgIFRoaXMgd2lsbCB0cnkgdG8gdXBkYXRlIHRoZSBzcGVjaWZpZWQga2V5IHdpdGggdGhlIGdpdmVuIHBheWxvYWQsIG9yIGl0CiAgICAgIHdpbGwgcmV0dXJuIGVycm9yIEVPUE5PVFNVUFAgaWYgdGhhdCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXkKLSAgICAgdHlwZS4gVGhlIHByb2Nlc3MgbXVzdCBhbHNvIGhhdmUgcGVybWlzc2lvbiB0byB3cml0ZSB0byB0aGUga2V5IHRvIGJlCi0gICAgIGFibGUgdG8gdXBkYXRlIGl0LgorICAgICB0eXBlLiBUaGUgcHJvY2VzcyBtdXN0IGFsc28gaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIHRvIHRoZSBrZXkgdG8gYmUgYWJsZQorICAgICB0byB1cGRhdGUgaXQuCiAKICAgICAgVGhlIHBheWxvYWQgaXMgb2YgbGVuZ3RoIHBsZW4sIGFuZCBtYXkgYmUgYWJzZW50IG9yIGVtcHR5IGFzIGZvcgogICAgICBhZGRfa2V5KCkuCkBAIC00MjIsOCArNDIyLDggQEAKIAogCWxvbmcga2V5Y3RsKEtFWUNUTF9DSE9XTiwga2V5X3NlcmlhbF90IGtleSwgdWlkX3QgdWlkLCBnaWRfdCBnaWQpOwogCi0gICAgIFRoaXMgZnVuY3Rpb24gcGVybWl0cyBhIGtleSdzIG93bmVyIGFuZCBncm91cCBJRCB0byBiZSBjaGFuZ2VkLiBFaXRoZXIKLSAgICAgb25lIG9mIHVpZCBvciBnaWQgY2FuIGJlIHNldCB0byAtMSB0byBzdXBwcmVzcyB0aGF0IGNoYW5nZS4KKyAgICAgVGhpcyBmdW5jdGlvbiBwZXJtaXRzIGEga2V5J3Mgb3duZXIgYW5kIGdyb3VwIElEIHRvIGJlIGNoYW5nZWQuIEVpdGhlciBvbmUKKyAgICAgb2YgdWlkIG9yIGdpZCBjYW4gYmUgc2V0IHRvIC0xIHRvIHN1cHByZXNzIHRoYXQgY2hhbmdlLgogCiAgICAgIE9ubHkgdGhlIHN1cGVydXNlciBjYW4gY2hhbmdlIGEga2V5J3Mgb3duZXIgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCiAgICAgIGtleSdzIGN1cnJlbnQgb3duZXIuIFNpbWlsYXJseSwgb25seSB0aGUgc3VwZXJ1c2VyIGNhbiBjaGFuZ2UgYSBrZXkncwpAQCAtNDg0LDEyICs0ODQsMTIgQEAKIAogCWxvbmcga2V5Y3RsKEtFWUNUTF9MSU5LLCBrZXlfc2VyaWFsX3Qga2V5cmluZywga2V5X3NlcmlhbF90IGtleSk7CiAKLSAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbGluayBmcm9tIHRoZSBrZXlyaW5nIHRvIHRoZSBrZXkuIFRoZSBwcm9jZXNzCi0gICAgIG11c3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIG9uIHRoZSBrZXlyaW5nIGFuZCBtdXN0IGhhdmUgbGluayBwZXJtaXNzaW9uCi0gICAgIG9uIHRoZSBrZXkuCisgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGxpbmsgZnJvbSB0aGUga2V5cmluZyB0byB0aGUga2V5LiBUaGUgcHJvY2VzcyBtdXN0CisgICAgIGhhdmUgd3JpdGUgcGVybWlzc2lvbiBvbiB0aGUga2V5cmluZyBhbmQgbXVzdCBoYXZlIGxpbmsgcGVybWlzc2lvbiBvbiB0aGUKKyAgICAga2V5LgogCi0gICAgIFNob3VsZCB0aGUga2V5cmluZyBub3QgYmUgYSBrZXlyaW5nLCBlcnJvciBFTk9URElSIHdpbGwgcmVzdWx0OyBhbmQgaWYKLSAgICAgdGhlIGtleXJpbmcgaXMgZnVsbCwgZXJyb3IgRU5GSUxFIHdpbGwgcmVzdWx0LgorICAgICBTaG91bGQgdGhlIGtleXJpbmcgbm90IGJlIGEga2V5cmluZywgZXJyb3IgRU5PVERJUiB3aWxsIHJlc3VsdDsgYW5kIGlmIHRoZQorICAgICBrZXlyaW5nIGlzIGZ1bGwsIGVycm9yIEVORklMRSB3aWxsIHJlc3VsdC4KIAogICAgICBUaGUgbGluayBwcm9jZWR1cmUgY2hlY2tzIHRoZSBuZXN0aW5nIG9mIHRoZSBrZXlyaW5ncywgcmV0dXJuaW5nIEVMT09QIGlmCiAgICAgIGl0IGFwcGVhcnMgdG8gZGVlcCBvciBFREVBRExLIGlmIHRoZSBsaW5rIHdvdWxkIGludHJvZHVjZSBhIGN5Y2xlLgpAQCAtNTAzLDggKzUwMyw4IEBACiAgICAgIHNwZWNpZmllZCBrZXksIGFuZCByZW1vdmVzIGl0IGlmIGZvdW5kLiBTdWJzZXF1ZW50IGxpbmtzIHRvIHRoYXQga2V5IGFyZQogICAgICBpZ25vcmVkLiBUaGUgcHJvY2VzcyBtdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBvbiB0aGUga2V5cmluZy4KIAotICAgICBJZiB0aGUga2V5cmluZyBpcyBub3QgYSBrZXlyaW5nLCBlcnJvciBFTk9URElSIHdpbGwgcmVzdWx0OyBhbmQgaWYgdGhlCi0gICAgIGtleSBpcyBub3QgcHJlc2VudCwgZXJyb3IgRU5PRU5UIHdpbGwgYmUgdGhlIHJlc3VsdC4KKyAgICAgSWYgdGhlIGtleXJpbmcgaXMgbm90IGEga2V5cmluZywgZXJyb3IgRU5PVERJUiB3aWxsIHJlc3VsdDsgYW5kIGlmIHRoZSBrZXkKKyAgICAgaXMgbm90IHByZXNlbnQsIGVycm9yIEVOT0VOVCB3aWxsIGJlIHRoZSByZXN1bHQuCiAKIAogICgqKSBTZWFyY2ggYSBrZXlyaW5nIHRyZWUgZm9yIGEga2V5OgpAQCAtNTEzLDkgKzUxMyw5IEBACiAJCQkgICAgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCiAJCQkgICAga2V5X3NlcmlhbF90IGRlc3Rfa2V5cmluZyk7CiAKLSAgICAgVGhpcyBzZWFyY2hlcyB0aGUga2V5cmluZyB0cmVlIGhlYWRlZCBieSB0aGUgc3BlY2lmaWVkIGtleXJpbmcgdW50aWwgYQotICAgICBrZXkgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSB0eXBlIGFuZCBkZXNjcmlwdGlvbiBjcml0ZXJpYS4gRWFjaCBrZXlyaW5nCi0gICAgIGlzIGNoZWNrZWQgZm9yIGtleXMgYmVmb3JlIHJlY3Vyc2lvbiBpbnRvIGl0cyBjaGlsZHJlbiBvY2N1cnMuCisgICAgIFRoaXMgc2VhcmNoZXMgdGhlIGtleXJpbmcgdHJlZSBoZWFkZWQgYnkgdGhlIHNwZWNpZmllZCBrZXlyaW5nIHVudGlsIGEga2V5CisgICAgIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgdHlwZSBhbmQgZGVzY3JpcHRpb24gY3JpdGVyaWEuIEVhY2gga2V5cmluZyBpcworICAgICBjaGVja2VkIGZvciBrZXlzIGJlZm9yZSByZWN1cnNpb24gaW50byBpdHMgY2hpbGRyZW4gb2NjdXJzLgogCiAgICAgIFRoZSBwcm9jZXNzIG11c3QgaGF2ZSBzZWFyY2ggcGVybWlzc2lvbiBvbiB0aGUgdG9wIGxldmVsIGtleXJpbmcsIG9yIGVsc2UKICAgICAgZXJyb3IgRUFDQ0VTIHdpbGwgcmVzdWx0LiBPbmx5IGtleXJpbmdzIHRoYXQgdGhlIHByb2Nlc3MgaGFzIHNlYXJjaApAQCAtNTQ5LDggKzU0OSw4IEBACiAgICAgIEFzIG11Y2ggb2YgdGhlIGRhdGEgYXMgY2FuIGJlIGZpdHRlZCBpbnRvIHRoZSBidWZmZXIgd2lsbCBiZSBjb3BpZWQgdG8KICAgICAgdXNlcnNwYWNlIGlmIHRoZSBidWZmZXIgcG9pbnRlciBpcyBub3QgTlVMTC4KIAotICAgICBPbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBhbW91bnQgb2YKLSAgICAgZGF0YSBhdmFpbGFibGUgcmF0aGVyIHRoYW4gdGhlIGFtb3VudCBjb3BpZWQuCisgICAgIE9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhCisgICAgIGF2YWlsYWJsZSByYXRoZXIgdGhhbiB0aGUgYW1vdW50IGNvcGllZC4KIAogCiAgKCopIEluc3RhbnRpYXRlIGEgcGFydGlhbGx5IGNvbnN0cnVjdGVkIGtleS4KQEAgLTU2OCw4ICs1NjgsOCBAQAogICAgICBpdCwgYW5kIHRoZSBrZXkgbXVzdCBiZSB1bmluc3RhbnRpYXRlZC4KIAogICAgICBJZiBhIGtleXJpbmcgaXMgc3BlY2lmaWVkIChub24temVybyksIHRoZSBrZXkgd2lsbCBhbHNvIGJlIGxpbmtlZCBpbnRvCi0gICAgIHRoYXQga2V5cmluZywgaG93ZXZlciBhbGwgdGhlIGNvbnN0cmFpbnRzIGFwcGx5aW5nIGluIEtFWUNUTF9MSU5LIGFwcGx5Ci0gICAgIGluIHRoaXMgY2FzZSB0b28uCisgICAgIHRoYXQga2V5cmluZywgaG93ZXZlciBhbGwgdGhlIGNvbnN0cmFpbnRzIGFwcGx5aW5nIGluIEtFWUNUTF9MSU5LIGFwcGx5IGluCisgICAgIHRoaXMgY2FzZSB0b28uCiAKICAgICAgVGhlIHBheWxvYWQgYW5kIHBsZW4gYXJndW1lbnRzIGRlc2NyaWJlIHRoZSBwYXlsb2FkIGRhdGEgYXMgZm9yIGFkZF9rZXkoKS4KIApAQCAtNTg3LDggKzU4NywzOSBAQAogICAgICBpdCwgYW5kIHRoZSBrZXkgbXVzdCBiZSB1bmluc3RhbnRpYXRlZC4KIAogICAgICBJZiBhIGtleXJpbmcgaXMgc3BlY2lmaWVkIChub24temVybyksIHRoZSBrZXkgd2lsbCBhbHNvIGJlIGxpbmtlZCBpbnRvCi0gICAgIHRoYXQga2V5cmluZywgaG93ZXZlciBhbGwgdGhlIGNvbnN0cmFpbnRzIGFwcGx5aW5nIGluIEtFWUNUTF9MSU5LIGFwcGx5Ci0gICAgIGluIHRoaXMgY2FzZSB0b28uCisgICAgIHRoYXQga2V5cmluZywgaG93ZXZlciBhbGwgdGhlIGNvbnN0cmFpbnRzIGFwcGx5aW5nIGluIEtFWUNUTF9MSU5LIGFwcGx5IGluCisgICAgIHRoaXMgY2FzZSB0b28uCisKKworICgqKSBTZXQgdGhlIGRlZmF1bHQgcmVxdWVzdC1rZXkgZGVzdGluYXRpb24ga2V5cmluZy4KKworCWxvbmcga2V5Y3RsKEtFWUNUTF9TRVRfUkVRS0VZX0tFWVJJTkcsIGludCByZXFrZXlfZGVmbCk7CisKKyAgICAgVGhpcyBzZXRzIHRoZSBkZWZhdWx0IGtleXJpbmcgdG8gd2hpY2ggaW1wbGljaXRseSByZXF1ZXN0ZWQga2V5cyB3aWxsIGJlCisgICAgIGF0dGFjaGVkIGZvciB0aGlzIHRocmVhZC4gcmVxa2V5X2RlZmwgc2hvdWxkIGJlIG9uZSBvZiB0aGVzZSBjb25zdGFudHM6CisKKwlDT05TVEFOVAkJCQlWQUxVRQlORVcgREVGQVVMVCBLRVlSSU5HCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJS0VZX1JFUUtFWV9ERUZMX05PX0NIQU5HRQkJLTEJTm8gY2hhbmdlCisJS0VZX1JFUUtFWV9ERUZMX0RFRkFVTFQJCQkwCURlZmF1bHRbMV0KKwlLRVlfUkVRS0VZX0RFRkxfVEhSRUFEX0tFWVJJTkcJCTEJVGhyZWFkIGtleXJpbmcKKwlLRVlfUkVRS0VZX0RFRkxfUFJPQ0VTU19LRVlSSU5HCQkyCVByb2Nlc3Mga2V5cmluZworCUtFWV9SRVFLRVlfREVGTF9TRVNTSU9OX0tFWVJJTkcJCTMJU2Vzc2lvbiBrZXlyaW5nCisJS0VZX1JFUUtFWV9ERUZMX1VTRVJfS0VZUklORwkJNAlVc2VyIGtleXJpbmcKKwlLRVlfUkVRS0VZX0RFRkxfVVNFUl9TRVNTSU9OX0tFWVJJTkcJNQlVc2VyIHNlc3Npb24ga2V5cmluZworCUtFWV9SRVFLRVlfREVGTF9HUk9VUF9LRVlSSU5HCQk2CUdyb3VwIGtleXJpbmcKKworICAgICBUaGUgb2xkIGRlZmF1bHQgd2lsbCBiZSByZXR1cm5lZCBpZiBzdWNjZXNzZnVsIGFuZCBlcnJvciBFSU5WQUwgd2lsbCBiZQorICAgICByZXR1cm5lZCBpZiByZXFrZXlfZGVmbCBpcyBub3Qgb25lIG9mIHRoZSBhYm92ZSB2YWx1ZXMuCisKKyAgICAgVGhlIGRlZmF1bHQga2V5cmluZyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUga2V5cmluZyBpbmRpY2F0ZWQgdG8gdGhlCisgICAgIHJlcXVlc3Rfa2V5KCkgc3lzdGVtIGNhbGwuCisKKyAgICAgTm90ZSB0aGF0IHRoaXMgc2V0dGluZyBpcyBpbmhlcml0ZWQgYWNyb3NzIGZvcmsvZXhlYy4KKworICAgICBbMV0gVGhlIGRlZmF1bHQgZGVmYXVsdCBpczogdGhlIHRocmVhZCBrZXlyaW5nIGlmIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlCisgICAgIHRoZSBwcm9jZXNzIGtleXJpbmcgaWYgdGhlcmUgaXMgb25lLCBvdGhlcndpc2UgdGhlIHNlc3Npb24ga2V5cmluZyBpZgorICAgICB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSB0aGUgdXNlciBkZWZhdWx0IHNlc3Npb24ga2V5cmluZy4KIAogCiA9PT09PT09PT09PT09PT0KQEAgLTYwMSwxNyArNjMyLDE0IEBACiBEZWFsaW5nIHdpdGgga2V5cyBpcyBmYWlybHkgc3RyYWlnaHRmb3J3YXJkLiBGaXJzdGx5LCB0aGUga2VybmVsIHNlcnZpY2UKIHJlZ2lzdGVycyBpdHMgdHlwZSwgdGhlbiBpdCBzZWFyY2hlcyBmb3IgYSBrZXkgb2YgdGhhdCB0eXBlLiBJdCBzaG91bGQgcmV0YWluCiB0aGUga2V5IGFzIGxvbmcgYXMgaXQgaGFzIG5lZWQgb2YgaXQsIGFuZCB0aGVuIGl0IHNob3VsZCByZWxlYXNlIGl0LiBGb3IgYQotZmlsZXN5c3RlbSBvciBkZXZpY2UgZmlsZSwgYSBzZWFyY2ggd291bGQgcHJvYmFibHkgYmUgcGVyZm9ybWVkIGR1cmluZyB0aGUKLW9wZW4gY2FsbCwgYW5kIHRoZSBrZXkgcmVsZWFzZWQgdXBvbiBjbG9zZS4gSG93IHRvIGRlYWwgd2l0aCBjb25mbGljdGluZyBrZXlzCi1kdWUgdG8gdHdvIGRpZmZlcmVudCB1c2VycyBvcGVuaW5nIHRoZSBzYW1lIGZpbGUgaXMgbGVmdCB0byB0aGUgZmlsZXN5c3RlbQotYXV0aG9yIHRvIHNvbHZlLgorZmlsZXN5c3RlbSBvciBkZXZpY2UgZmlsZSwgYSBzZWFyY2ggd291bGQgcHJvYmFibHkgYmUgcGVyZm9ybWVkIGR1cmluZyB0aGUgb3BlbgorY2FsbCwgYW5kIHRoZSBrZXkgcmVsZWFzZWQgdXBvbiBjbG9zZS4gSG93IHRvIGRlYWwgd2l0aCBjb25mbGljdGluZyBrZXlzIGR1ZSB0bwordHdvIGRpZmZlcmVudCB1c2VycyBvcGVuaW5nIHRoZSBzYW1lIGZpbGUgaXMgbGVmdCB0byB0aGUgZmlsZXN5c3RlbSBhdXRob3IgdG8KK3NvbHZlLgogCi1XaGVuIGFjY2Vzc2luZyBhIGtleSdzIHBheWxvYWQgZGF0YSwga2V5LT5sb2NrIHNob3VsZCBiZSBhdCBsZWFzdCByZWFkIGxvY2tlZCwKLW9yIGVsc2UgdGhlIGRhdGEgbWF5IGJlIGNoYW5nZWQgYnkgYW4gdXBkYXRlIGJlaW5nIHBlcmZvcm1lZCBmcm9tIHVzZXJzcGFjZQotd2hpbHN0IHRoZSBkcml2ZXIgb3IgZmlsZXN5c3RlbSBpcyB0cnlpbmcgdG8gYWNjZXNzIGl0LiBJZiBubyB1cGRhdGUgbWV0aG9kIGlzCi1zdXBwbGllZCwgdGhlbiB0aGUga2V5J3MgcGF5bG9hZCBtYXkgYmUgYWNjZXNzZWQgd2l0aG91dCBob2xkaW5nIGEgbG9jayBhcwotdGhlcmUgaXMgbm8gd2F5IHRvIGNoYW5nZSBpdCwgcHJvdmlkZWQgaXQgY2FuIGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUga2V5J3MKLXR5cGUgZGVmaW5pdGlvbiB3b24ndCBnbyBhd2F5LgorV2hlbiBhY2Nlc3NpbmcgYSBrZXkncyBwYXlsb2FkIGNvbnRlbnRzLCBjZXJ0YWluIHByZWNhdXRpb25zIG11c3QgYmUgdGFrZW4gdG8KK3ByZXZlbnQgYWNjZXNzIHZzIG1vZGlmaWNhdGlvbiByYWNlcy4gU2VlIHRoZSBzZWN0aW9uICJOb3RlcyBvbiBhY2Nlc3NpbmcKK3BheWxvYWQgY29udGVudHMiIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCiAoKikgVG8gc2VhcmNoIGZvciBhIGtleSwgY2FsbDoKIApAQCAtNjI5LDYgKzY1Nyw5IEBACiAgICAgU2hvdWxkIHRoZSBmdW5jdGlvbiBmYWlsIGVycm9yIEVOT0tFWSwgRUtFWUVYUElSRUQgb3IgRUtFWVJFVk9LRUQgd2lsbCBiZQogICAgIHJldHVybmVkLgogCisgICAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGtleSB3aWxsIGhhdmUgYmVlbiBhdHRhY2hlZCB0byB0aGUgZGVmYXVsdCBrZXlyaW5nIGZvcgorICAgIGltcGxpY2l0bHkgb2J0YWluZWQgcmVxdWVzdC1rZXkga2V5cywgYXMgc2V0IGJ5IEtFWUNUTF9TRVRfUkVRS0VZX0tFWVJJTkcuCisKIAogKCopIFdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLCB0aGUga2V5IHNob3VsZCBiZSByZWxlYXNlZCB1c2luZzoKIApAQCAtNjkwLDYgKzcyMSw1NCBAQAogCXZvaWQgdW5yZWdpc3Rlcl9rZXlfdHlwZShzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUpOwogCiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitOT1RFUyBPTiBBQ0NFU1NJTkcgUEFZTE9BRCBDT05URU5UUworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNpbXBsZXN0IHBheWxvYWQgaXMganVzdCBhIG51bWJlciBpbiBrZXktPnBheWxvYWQudmFsdWUuIEluIHRoaXMgY2FzZSwKK3RoZXJlJ3Mgbm8gbmVlZCB0byBpbmR1bGdlIGluIFJDVSBvciBsb2NraW5nIHdoZW4gYWNjZXNzaW5nIHRoZSBwYXlsb2FkLgorCitNb3JlIGNvbXBsZXggcGF5bG9hZCBjb250ZW50cyBtdXN0IGJlIGFsbG9jYXRlZCBhbmQgYSBwb2ludGVyIHRvIHRoZW0gc2V0IGluCitrZXktPnBheWxvYWQuZGF0YS4gT25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5cyBtdXN0IGJlIHNlbGVjdGVkIHRvIGFjY2VzcyB0aGUKK2RhdGE6CisKKyAoMSkgVW5tb2RpZnlhYmxlIGtleSB0eXBlLgorCisgICAgIElmIHRoZSBrZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGEgbW9kaWZ5IG1ldGhvZCwgdGhlbiB0aGUga2V5J3MgcGF5bG9hZCBjYW4KKyAgICAgYmUgYWNjZXNzZWQgd2l0aG91dCBhbnkgZm9ybSBvZiBsb2NraW5nLCBwcm92aWRlZCB0aGF0IGl0J3Mga25vd24gdG8gYmUKKyAgICAgaW5zdGFudGlhdGVkICh1bmluc3RhbnRpYXRlZCBrZXlzIGNhbm5vdCBiZSAiZm91bmQiKS4KKworICgyKSBUaGUga2V5J3Mgc2VtYXBob3JlLgorCisgICAgIFRoZSBzZW1hcGhvcmUgY291bGQgYmUgdXNlZCB0byBnb3Zlcm4gYWNjZXNzIHRvIHRoZSBwYXlsb2FkIGFuZCB0byBjb250cm9sCisgICAgIHRoZSBwYXlsb2FkIHBvaW50ZXIuIEl0IG11c3QgYmUgd3JpdGUtbG9ja2VkIGZvciBtb2RpZmljYXRpb25zIGFuZCB3b3VsZAorICAgICBoYXZlIHRvIGJlIHJlYWQtbG9ja2VkIGZvciBnZW5lcmFsIGFjY2Vzcy4gVGhlIGRpc2FkdmFudGFnZSBvZiBkb2luZyB0aGlzCisgICAgIGlzIHRoYXQgdGhlIGFjY2Vzc29yIG1heSBiZSByZXF1aXJlZCB0byBzbGVlcC4KKworICgzKSBSQ1UuCisKKyAgICAgUkNVIG11c3QgYmUgdXNlZCB3aGVuIHRoZSBzZW1hcGhvcmUgaXNuJ3QgYWxyZWFkeSBoZWxkOyBpZiB0aGUgc2VtYXBob3JlCisgICAgIGlzIGhlbGQgdGhlbiB0aGUgY29udGVudHMgY2FuJ3QgY2hhbmdlIHVuZGVyIHlvdSB1bmV4cGVjdGVkbHkgYXMgdGhlCisgICAgIHNlbWFwaG9yZSBtdXN0IHN0aWxsIGJlIHVzZWQgdG8gc2VyaWFsaXNlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGtleS4gVGhlCisgICAgIGtleSBtYW5hZ2VtZW50IGNvZGUgdGFrZXMgY2FyZSBvZiB0aGlzIGZvciB0aGUga2V5IHR5cGUuCisKKyAgICAgSG93ZXZlciwgdGhpcyBtZWFucyB1c2luZzoKKworCXJjdV9yZWFkX2xvY2soKSAuLi4gcmN1X2RlcmVmZXJlbmNlKCkgLi4uIHJjdV9yZWFkX3VubG9jaygpCisKKyAgICAgdG8gcmVhZCB0aGUgcG9pbnRlciwgYW5kOgorCisJcmN1X2RlcmVmZXJlbmNlKCkgLi4uIHJjdV9hc3NpZ25fcG9pbnRlcigpIC4uLiBjYWxsX3JjdSgpCisKKyAgICAgdG8gc2V0IHRoZSBwb2ludGVyIGFuZCBkaXNwb3NlIG9mIHRoZSBvbGQgY29udGVudHMgYWZ0ZXIgYSBncmFjZSBwZXJpb2QuCisgICAgIE5vdGUgdGhhdCBvbmx5IHRoZSBrZXkgdHlwZSBzaG91bGQgZXZlciBtb2RpZnkgYSBrZXkncyBwYXlsb2FkLgorCisgICAgIEZ1cnRoZXJtb3JlLCBhbiBSQ1UgY29udHJvbGxlZCBwYXlsb2FkIG11c3QgaG9sZCBhIHN0cnVjdCByY3VfaGVhZCBmb3IgdGhlCisgICAgIHVzZSBvZiBjYWxsX3JjdSgpIGFuZCwgaWYgdGhlIHBheWxvYWQgaXMgb2YgdmFyaWFibGUgc2l6ZSwgdGhlIGxlbmd0aCBvZgorICAgICB0aGUgcGF5bG9hZC4ga2V5LT5kYXRhbGVuIGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlCisgICAgIHBheWxvYWQganVzdCBkZXJlZmVyZW5jZWQgaWYgdGhlIGtleSdzIHNlbWFwaG9yZSBpcyBub3QgaGVsZC4KKworCiA9PT09PT09PT09PT09PT09PT09CiBERUZJTklORyBBIEtFWSBUWVBFCiA9PT09PT09PT09PT09PT09PT09CkBAIC03MTcsMTUgKzc5NiwxNSBAQAogCiAJaW50IGtleV9wYXlsb2FkX3Jlc2VydmUoc3RydWN0IGtleSAqa2V5LCBzaXplX3QgZGF0YWxlbik7CiAKLSAgICAgV2l0aCB0aGUgcmV2aXNlZCBkYXRhIGxlbmd0aC4gRXJyb3IgRURRVU9UIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhpcyBpcwotICAgICBub3QgdmlhYmxlLgorICAgICBXaXRoIHRoZSByZXZpc2VkIGRhdGEgbGVuZ3RoLiBFcnJvciBFRFFVT1Qgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGlzIGlzIG5vdAorICAgICB2aWFibGUuCiAKIAogICgqKSBpbnQgKCppbnN0YW50aWF0ZSkoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbik7CiAKICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRvIGF0dGFjaCBhIHBheWxvYWQgdG8gYSBrZXkgZHVyaW5nIGNvbnN0cnVjdGlvbi4KLSAgICAgVGhlIHBheWxvYWQgYXR0YWNoZWQgbmVlZCBub3QgYmVhciBhbnkgcmVsYXRpb24gdG8gdGhlIGRhdGEgcGFzc2VkIHRvCi0gICAgIHRoaXMgZnVuY3Rpb24uCisgICAgIFRoZSBwYXlsb2FkIGF0dGFjaGVkIG5lZWQgbm90IGJlYXIgYW55IHJlbGF0aW9uIHRvIHRoZSBkYXRhIHBhc3NlZCB0byB0aGlzCisgICAgIGZ1bmN0aW9uLgogCiAgICAgIElmIHRoZSBhbW91bnQgb2YgZGF0YSBhdHRhY2hlZCB0byB0aGUga2V5IGRpZmZlcnMgZnJvbSB0aGUgc2l6ZSBpbgogICAgICBrZXl0eXBlLT5kZWZfZGF0YWxlbiwgdGhlbiBrZXlfcGF5bG9hZF9yZXNlcnZlKCkgc2hvdWxkIGJlIGNhbGxlZC4KQEAgLTczNCwzOCArODEzLDQ3IEBACiAgICAgIFRoZSBmYWN0IHRoYXQgS0VZX0ZMQUdfSU5TVEFOVElBVEVEIGlzIG5vdCBzZXQgaW4ga2V5LT5mbGFncyBwcmV2ZW50cwogICAgICBhbnl0aGluZyBlbHNlIGZyb20gZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIGtleS4KIAotICAgICBUaGlzIG1ldGhvZCBtYXkgc2xlZXAgaWYgaXQgd2lzaGVzLgorICAgICBJdCBpcyBzYWZlIHRvIHNsZWVwIGluIHRoaXMgbWV0aG9kLgogCiAKICAoKikgaW50ICgqZHVwbGljYXRlKShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHN0cnVjdCBrZXkgKnNvdXJjZSk7CiAKICAgICAgSWYgdGhpcyB0eXBlIG9mIGtleSBjYW4gYmUgZHVwbGljYXRlZCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUKLSAgICAgcHJvdmlkZWQuIEl0IGlzIGNhbGxlZCB0byBjb3B5IHRoZSBwYXlsb2FkIGF0dGFjaGVkIHRvIHRoZSBzb3VyY2UgaW50bwotICAgICB0aGUgbmV3IGtleS4gVGhlIGRhdGEgbGVuZ3RoIG9uIHRoZSBuZXcga2V5IHdpbGwgaGF2ZSBiZWVuIHVwZGF0ZWQgYW5kCi0gICAgIHRoZSBxdW90YSBhZGp1c3RlZCBhbHJlYWR5LgorICAgICBwcm92aWRlZC4gSXQgaXMgY2FsbGVkIHRvIGNvcHkgdGhlIHBheWxvYWQgYXR0YWNoZWQgdG8gdGhlIHNvdXJjZSBpbnRvIHRoZQorICAgICBuZXcga2V5LiBUaGUgZGF0YSBsZW5ndGggb24gdGhlIG5ldyBrZXkgd2lsbCBoYXZlIGJlZW4gdXBkYXRlZCBhbmQgdGhlCisgICAgIHF1b3RhIGFkanVzdGVkIGFscmVhZHkuCiAKICAgICAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc291cmNlIGtleSdzIHNlbWFwaG9yZSByZWFkLWxvY2tlZCB0bwotICAgICBwcmV2ZW50IGl0cyBwYXlsb2FkIGZyb20gYmVpbmcgY2hhbmdlZC4gSXQgaXMgc2FmZSB0byBzbGVlcCBoZXJlLgorICAgICBwcmV2ZW50IGl0cyBwYXlsb2FkIGZyb20gYmVpbmcgY2hhbmdlZCwgdGh1cyBSQ1UgY29uc3RyYWludHMgbmVlZCBub3QgYmUKKyAgICAgYXBwbGllZCB0byB0aGUgc291cmNlIGtleS4KKworICAgICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGxvY2sgdGhlIGRlc3RpbmF0aW9uIGtleSBpbiBvcmRlciB0byBhdHRhY2ggYQorICAgICBwYXlsb2FkLiBUaGUgZmFjdCB0aGF0IEtFWV9GTEFHX0lOU1RBTlRJQVRFRCBpcyBub3Qgc2V0IGluIGtleS0+ZmxhZ3MKKyAgICAgcHJldmVudHMgYW55dGhpbmcgZWxzZSBmcm9tIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSBrZXkuCisKKyAgICAgSXQgaXMgc2FmZSB0byBzbGVlcCBpbiB0aGlzIG1ldGhvZC4KIAogCiAgKCopIGludCAoKnVwZGF0ZSkoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbik7CiAKLSAgICAgSWYgdGhpcyB0eXBlIG9mIGtleSBjYW4gYmUgdXBkYXRlZCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUKLSAgICAgcHJvdmlkZWQuIEl0IGlzIGNhbGxlZCB0byB1cGRhdGUgYSBrZXkncyBwYXlsb2FkIGZyb20gdGhlIGJsb2Igb2YgZGF0YQotICAgICBwcm92aWRlZC4KKyAgICAgSWYgdGhpcyB0eXBlIG9mIGtleSBjYW4gYmUgdXBkYXRlZCwgdGhlbiB0aGlzIG1ldGhvZCBzaG91bGQgYmUgcHJvdmlkZWQuCisgICAgIEl0IGlzIGNhbGxlZCB0byB1cGRhdGUgYSBrZXkncyBwYXlsb2FkIGZyb20gdGhlIGJsb2Igb2YgZGF0YSBwcm92aWRlZC4KIAogICAgICBrZXlfcGF5bG9hZF9yZXNlcnZlKCkgc2hvdWxkIGJlIGNhbGxlZCBpZiB0aGUgZGF0YSBsZW5ndGggbWlnaHQgY2hhbmdlCi0gICAgIGJlZm9yZSBhbnkgY2hhbmdlcyBhcmUgYWN0dWFsbHkgbWFkZS4gTm90ZSB0aGF0IGlmIHRoaXMgc3VjY2VlZHMsIHRoZQotICAgICB0eXBlIGlzIGNvbW1pdHRlZCB0byBjaGFuZ2luZyB0aGUga2V5IGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gYWx0ZXJlZCwKLSAgICAgc28gYWxsIG1lbW9yeSBhbGxvY2F0aW9uIG11c3QgYmUgZG9uZSBmaXJzdC4KKyAgICAgYmVmb3JlIGFueSBjaGFuZ2VzIGFyZSBhY3R1YWxseSBtYWRlLiBOb3RlIHRoYXQgaWYgdGhpcyBzdWNjZWVkcywgdGhlIHR5cGUKKyAgICAgaXMgY29tbWl0dGVkIHRvIGNoYW5naW5nIHRoZSBrZXkgYmVjYXVzZSBpdCdzIGFscmVhZHkgYmVlbiBhbHRlcmVkLCBzbyBhbGwKKyAgICAgbWVtb3J5IGFsbG9jYXRpb24gbXVzdCBiZSBkb25lIGZpcnN0LgogCi0gICAgIGtleV9wYXlsb2FkX3Jlc2VydmUoKSBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGtleS0+bG9jayB3cml0ZSBsb2NrZWQsCi0gICAgIGFuZCB0aGUgY2hhbmdlcyB0byB0aGUga2V5J3MgYXR0YWNoZWQgcGF5bG9hZCBzaG91bGQgYmUgbWFkZSBiZWZvcmUgdGhlCi0gICAgIGtleSBpcyBsb2NrZWQuCisgICAgIFRoZSBrZXkgd2lsbCBoYXZlIGl0cyBzZW1hcGhvcmUgd3JpdGUtbG9ja2VkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsCisgICAgIGJ1dCB0aGlzIG9ubHkgZGV0ZXJzIG90aGVyIHdyaXRlcnM7IGFueSBjaGFuZ2VzIHRvIHRoZSBrZXkncyBwYXlsb2FkIG11c3QKKyAgICAgYmUgbWFkZSB1bmRlciBSQ1UgY29uZGl0aW9ucywgYW5kIGNhbGxfcmN1KCkgbXVzdCBiZSB1c2VkIHRvIGRpc3Bvc2Ugb2YKKyAgICAgdGhlIG9sZCBwYXlsb2FkLgogCi0gICAgIFRoZSBrZXkgd2lsbCBoYXZlIGl0cyBzZW1hcGhvcmUgd3JpdGUtbG9ja2VkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcwotICAgICBjYWxsZWQuIEFueSBjaGFuZ2VzIHRvIHRoZSBrZXkgc2hvdWxkIGJlIG1hZGUgd2l0aCB0aGUga2V5J3Mgcndsb2NrCi0gICAgIHdyaXRlLWxvY2tlZCBhbHNvLiBJdCBpcyBzYWZlIHRvIHNsZWVwIGhlcmUuCisgICAgIGtleV9wYXlsb2FkX3Jlc2VydmUoKSBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2hhbmdlcyBhcmUgbWFkZSwgYnV0CisgICAgIGFmdGVyIGFsbCBhbGxvY2F0aW9ucyBhbmQgb3RoZXIgcG90ZW50aWFsbHkgZmFpbGluZyBmdW5jdGlvbiBjYWxscyBhcmUKKyAgICAgbWFkZS4KKworICAgICBJdCBpcyBzYWZlIHRvIHNsZWVwIGluIHRoaXMgbWV0aG9kLgogCiAKICAoKikgaW50ICgqbWF0Y2gpKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGVzYyk7CkBAIC03ODIsMTIgKzg3MCwxMiBAQAogCiAgKCopIHZvaWQgKCpkZXN0cm95KShzdHJ1Y3Qga2V5ICprZXkpOwogCi0gICAgIFRoaXMgbWV0aG9kIGlzIG9wdGlvbmFsLiBJdCBpcyBjYWxsZWQgdG8gZGlzY2FyZCB0aGUgcGF5bG9hZCBkYXRhIG9uIGEKLSAgICAga2V5IHdoZW4gaXQgaXMgYmVpbmcgZGVzdHJveWVkLgorICAgICBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbC4gSXQgaXMgY2FsbGVkIHRvIGRpc2NhcmQgdGhlIHBheWxvYWQgZGF0YSBvbiBhIGtleQorICAgICB3aGVuIGl0IGlzIGJlaW5nIGRlc3Ryb3llZC4KIAotICAgICBUaGlzIG1ldGhvZCBkb2VzIG5vdCBuZWVkIHRvIGxvY2sgdGhlIGtleTsgaXQgY2FuIGNvbnNpZGVyIHRoZSBrZXkgYXMKLSAgICAgYmVpbmcgaW5hY2Nlc3NpYmxlLiBOb3RlIHRoYXQgdGhlIGtleSdzIHR5cGUgbWF5IGhhdmUgY2hhbmdlZCBiZWZvcmUgdGhpcwotICAgICBmdW5jdGlvbiBpcyBjYWxsZWQuCisgICAgIFRoaXMgbWV0aG9kIGRvZXMgbm90IG5lZWQgdG8gbG9jayB0aGUga2V5IHRvIGFjY2VzcyB0aGUgcGF5bG9hZDsgaXQgY2FuCisgICAgIGNvbnNpZGVyIHRoZSBrZXkgYXMgYmVpbmcgaW5hY2Nlc3NpYmxlIGF0IHRoaXMgdGltZS4gTm90ZSB0aGF0IHRoZSBrZXkncworICAgICB0eXBlIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAKICAgICAgSXQgaXMgbm90IHNhZmUgdG8gc2xlZXAgaW4gdGhpcyBtZXRob2Q7IHRoZSBjYWxsZXIgbWF5IGhvbGQgc3BpbmxvY2tzLgogCkBAIC03OTcsMjYgKzg4NSwzMSBAQAogICAgICBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbC4gSXQgaXMgY2FsbGVkIGR1cmluZyAvcHJvYy9rZXlzIHJlYWRpbmcgdG8KICAgICAgc3VtbWFyaXNlIGEga2V5J3MgZGVzY3JpcHRpb24gYW5kIHBheWxvYWQgaW4gdGV4dCBmb3JtLgogCi0gICAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGtleSdzIHJ3bG9jayByZWFkLWxvY2tlZC4gVGhpcyB3aWxsCi0gICAgIHByZXZlbnQgdGhlIGtleSdzIHBheWxvYWQgYW5kIHN0YXRlIGNoYW5naW5nOyBhbHNvIHRoZSBkZXNjcmlwdGlvbiBzaG91bGQKLSAgICAgbm90IGNoYW5nZS4gVGhpcyBhbHNvIG1lYW5zIGl0IGlzIG5vdCBzYWZlIHRvIHNsZWVwIGluIHRoaXMgbWV0aG9kLgorICAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBSQ1UgcmVhZCBsb2NrIGhlbGQuIHJjdV9kZXJlZmVyZW5jZSgpCisgICAgIHNob3VsZCBiZSB1c2VkIHRvIHJlYWQgdGhlIHBheWxvYWQgcG9pbnRlciBpZiB0aGUgcGF5bG9hZCBpcyB0byBiZQorICAgICBhY2Nlc3NlZC4ga2V5LT5kYXRhbGVuIGNhbm5vdCBiZSB0cnVzdGVkIHRvIHN0YXkgY29uc2lzdGVudCB3aXRoIHRoZQorICAgICBjb250ZW50cyBvZiB0aGUgcGF5bG9hZC4KKworICAgICBUaGUgZGVzY3JpcHRpb24gd2lsbCBub3QgY2hhbmdlLCB0aG91Z2ggdGhlIGtleSdzIHN0YXRlIG1heS4KKworICAgICBJdCBpcyBub3Qgc2FmZSB0byBzbGVlcCBpbiB0aGlzIG1ldGhvZDsgdGhlIFJDVSByZWFkIGxvY2sgaXMgaGVsZCBieSB0aGUKKyAgICAgY2FsbGVyLgogCiAKICAoKikgbG9uZyAoKnJlYWQpKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ1Zmxlbik7CiAKICAgICAgVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuIEl0IGlzIGNhbGxlZCBieSBLRVlDVExfUkVBRCB0byB0cmFuc2xhdGUgdGhlCi0gICAgIGtleSdzIHBheWxvYWQgaW50byBzb21ldGhpbmcgYSBibG9iIG9mIGRhdGEgZm9yIHVzZXJzcGFjZSB0byBkZWFsCi0gICAgIHdpdGguIElkZWFsbHksIHRoZSBibG9iIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhhdCBwYXNzZWQgaW4gdG8KLSAgICAgdGhlIGluc3RhbnRpYXRlIGFuZCB1cGRhdGUgbWV0aG9kcy4KKyAgICAga2V5J3MgcGF5bG9hZCBpbnRvIHNvbWV0aGluZyBhIGJsb2Igb2YgZGF0YSBmb3IgdXNlcnNwYWNlIHRvIGRlYWwgd2l0aC4KKyAgICAgSWRlYWxseSwgdGhlIGJsb2Igc2hvdWxkIGJlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGF0IHBhc3NlZCBpbiB0byB0aGUKKyAgICAgaW5zdGFudGlhdGUgYW5kIHVwZGF0ZSBtZXRob2RzLgogCiAgICAgIElmIHN1Y2Nlc3NmdWwsIHRoZSBibG9iIHNpemUgdGhhdCBjb3VsZCBiZSBwcm9kdWNlZCBzaG91bGQgYmUgcmV0dXJuZWQKICAgICAgcmF0aGVyIHRoYW4gdGhlIHNpemUgY29waWVkLgogCi0gICAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGtleSdzIHNlbWFwaG9yZSByZWFkLWxvY2tlZC4gVGhpcwotICAgICB3aWxsIHByZXZlbnQgdGhlIGtleSdzIHBheWxvYWQgY2hhbmdpbmcuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gYWxzbwotICAgICByZWFkLWxvY2sga2V5LT5sb2NrIHdoZW4gYWNjZXNzaW5nIHRoZSBrZXkncyBwYXlsb2FkLiBJdCBpcyBzYWZlIHRvIHNsZWVwCi0gICAgIGluIHRoaXMgbWV0aG9kLCBzdWNoIGFzIG1pZ2h0IGhhcHBlbiB3aGVuIHRoZSB1c2Vyc3BhY2UgYnVmZmVyIGlzCi0gICAgIGFjY2Vzc2VkLgorICAgICBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBrZXkncyBzZW1hcGhvcmUgcmVhZC1sb2NrZWQuIFRoaXMgd2lsbAorICAgICBwcmV2ZW50IHRoZSBrZXkncyBwYXlsb2FkIGNoYW5naW5nLiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSBSQ1UgbG9ja2luZworICAgICB3aGVuIGFjY2Vzc2luZyB0aGUga2V5J3MgcGF5bG9hZC4gSXQgaXMgc2FmZSB0byBzbGVlcCBpbiB0aGlzIG1ldGhvZCwgc3VjaAorICAgICBhcyBtaWdodCBoYXBwZW4gd2hlbiB0aGUgdXNlcnNwYWNlIGJ1ZmZlciBpcyBhY2Nlc3NlZC4KIAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC04NTMsOCArOTQ2LDggQEAKIGJlIG1hcmtlZCBhcyBiZWluZyBuZWdhdGl2ZSwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBhbmQgYW4KIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIGtleSByZXF1ZXN0b3IuCiAKLVN1cHBsZW1lbnRhcnkgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIGZyb20gd2hvZXZlciBvciB3aGF0ZXZlciBpbnZva2VkCi10aGlzIHNlcnZpY2UuIFRoaXMgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIDxjYWxsb3V0X2luZm8+IHBhcmFtZXRlci4gSWYgbm8gc3VjaAorU3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvbiBtYXkgYmUgcHJvdmlkZWQgZnJvbSB3aG9ldmVyIG9yIHdoYXRldmVyIGludm9rZWQgdGhpcworc2VydmljZS4gVGhpcyB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgPGNhbGxvdXRfaW5mbz4gcGFyYW1ldGVyLiBJZiBubyBzdWNoCiBpbmZvcm1hdGlvbiB3YXMgbWFkZSBhdmFpbGFibGUsIHRoZW4gIi0iIHdpbGwgYmUgcGFzc2VkIGFzIHRoaXMgcGFyYW1ldGVyCiBpbnN0ZWFkLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVggYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVgKaW5kZXggODM0OTkzZC4uNWIwMWQ1YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWApAQCAtMTE0LDkgKzExNCw3IEBACiB2b3J0ZXgudHh0CiAJLSBpbmZvIG9uIHVzaW5nIDNDb20gVm9ydGV4ICgzYzU5MCwgM2M1OTIsIDNjNTk1LCAzYzU5NykgRXRoZXJuZXQgY2FyZHMuCiB3YW4tcm91dGVyLnR4dAotCS0gV2FuIHJvdXRlciBkb2N1bWVudGF0aW9uCi13YW5waXBlLnR4dAotCS0gV0FOUElQRSh0bSkgTXVsdGlwcm90b2NvbCBXQU4gRHJpdmVyIGZvciBMaW51eCBXQU4gUm91dGVyCisJLSBXQU4gcm91dGVyIGRvY3VtZW50YXRpb24KIHdhdmVsYW4udHh0CiAJLSBBVCZUIEdJUyAobmVlIE5DUikgV2F2ZUxBTiBjYXJkOiBBbiBFdGhlcm5ldC1saWtlIHJhZGlvIHRyYW5zY2VpdmVyCiB4MjUudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZG1mZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZG1mZS50eHQKaW5kZXggYzBlODM5OC4uMDQ2MzYzNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RtZmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kbWZlLnR4dApAQCAtMSw1OSArMSw2NSBAQAotICBkbWZlLmM6IFZlcnNpb24gMS4yOCAgICAgICAgMDEvMTgvMjAwMAorRGF2aWNvbSBETTkxMDIoQSkvRE05MTMyL0RNOTgwMSBmYXN0IGV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCiAKLSAgICAgICAgQSBEYXZpY29tIERNOTEwMihBKS9ETTkxMzIvRE05ODAxIGZhc3QgZXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4gCi0gICAgICAgIENvcHlyaWdodCAoQykgMTk5NyAgU3RlbiBXYW5nCitUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgIFB1YmxpYyBMaWNlbnNlCithcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAKLSAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgotICAgICAgICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIAogCi0gIEEuIENvbXBpbGVyIGNvbW1hbmQ6CitUaGlzIGRyaXZlciBwcm92aWRlcyBrZXJuZWwgc3VwcG9ydCBmb3IgRGF2aWNvbSBETTkxMDIoQSkvRE05MTMyL0RNOTgwMSBldGhlcm5ldCBjYXJkcyAoIENORVQKKzEwLzEwMCBldGhlcm5ldCBjYXJkcyB1c2VzIERhdmljb20gY2hpcHNldCB0b28sIHNvIHRoaXMgZHJpdmVyIHN1cHBvcnRzIENORVQgY2FyZHMgdG9vICkuSWYgeW91CitkaWRuJ3QgY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxvYWQgaXRzZWxmIG9uIGJvb3QgYW5kIHByaW50IGEKK2xpbmUgc2ltaWxhciB0byA6CiAKLSAgICAgQS0xOiBGb3Igbm9ybWFsIHNpbmdsZSBvciBtdWx0aXBsZSBwcm9jZXNzb3Iga2VybmVsCi0gICAgICAgICAgImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLUkvdXNyL3NyYy9saW51eC9uZXQvaW5ldCAtV2FsbCAKLSAgICAgICAgICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1jIGRtZmUuYyIKKwlkbWZlOiBEYXZpY29tIERNOXh4eCBuZXQgZHJpdmVyLCB2ZXJzaW9uIDEuMzYuNCAoMjAwMi0wMS0xNykKIAotICAgICBBLTI6IEZvciBzaW5nbGUgb3IgbXVsdGlwbGUgcHJvY2Vzc29yIHdpdGgga2VybmVsIG1vZHVsZSB2ZXJzaW9uIGZ1bmN0aW9uCi0gICAgICAgICAgImdjYyAtRE1PRFVMRSAtRE1PRFZFUlNJT05TIC1EX19LRVJORUxfXyAtSS91c3Ivc3JjL2xpbnV4L25ldC9pbmV0IAotICAgICAgICAgICAgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWMgZG1mZS5jIgorSWYgeW91IGNvbXBpbGVkIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCB5b3UgaGF2ZSB0byBsb2FkIGl0IG9uIGJvb3QuWW91IGNhbiBsb2FkIGl0IHdpdGggY29tbWFuZCA6CisKKwlpbnNtb2QgZG1mZQorCitUaGlzIHdheSBpdCB3aWxsIGF1dG9kZXRlY3QgdGhlIGRldmljZSBtb2RlLlRoaXMgaXMgdGhlIHN1Z2dlc3RlZCB3YXkgdG8gbG9hZCB0aGUgbW9kdWxlLk9yIHlvdSBjYW4gcGFzcworYSBtb2RlPSBzZXR0aW5nIHRvIG1vZHVsZSB3aGlsZSBsb2FkaW5nLCBsaWtlIDoKKworCWluc21vZCBkbWZlIG1vZGU9MCAjIEZvcmNlIDEwTSBIYWxmIER1cGxleAorCWluc21vZCBkbWZlIG1vZGU9MSAjIEZvcmNlIDEwME0gSGFsZiBEdXBsZXgKKwlpbnNtb2QgZG1mZSBtb2RlPTQgIyBGb3JjZSAxME0gRnVsbCBEdXBsZXgKKwlpbnNtb2QgZG1mZSBtb2RlPTUgIyBGb3JjZSAxMDBNIEZ1bGwgRHVwbGV4CisKK05leHQgeW91IHNob3VsZCBjb25maWd1cmUgeW91ciBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGEgY29tbWFuZCBzaW1pbGFyIHRvIDoKKworCWlmY29uZmlnIGV0aDAgMTcyLjIyLjMuMTgKKyAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXgorCQkgICAgIFlvdXIgSVAgQWRyZXNzCisKK1RoZW4geW91IG1heSBoYXZlIHRvIG1vZGlmeSB0aGUgZGVmYXVsdCByb3V0aW5nIHRhYmxlIHdpdGggY29tbWFuZCA6CisKKwlyb3V0ZSBhZGQgZGVmYXVsdCBldGgwCiAKIAotICBCLiBUaGUgZm9sbG93aW5nIHN0ZXBzIHRlYWNoIHlvdSBob3cgdG8gYWN0aXZhdGUgYSBETTkxMDIgYm9hcmQ6Ci0KLSAgICAgICAgMS4gVXNlZCB0aGUgdXBwZXIgY29tcGlsZXIgY29tbWFuZCB0byBjb21waWxlIGRtZmUuYwotCi0gICAgICAgIDIuIEluc2VydCBkbWZlIG1vZHVsZSBpbnRvIGtlcm5lbAotICAgICAgICAgICAiaW5zbW9kIGRtZmUiICAgICAgICA7O0F1dG8gRGV0ZWN0aW9uIE1vZGUgKFN1Z2dlc3QpCi0gICAgICAgICAgICJpbnNtb2QgZG1mZSBtb2RlPTAiIDs7Rm9yY2UgMTBNIEhhbGYgRHVwbGV4Ci0gICAgICAgICAgICJpbnNtb2QgZG1mZSBtb2RlPTEiIDs7Rm9yY2UgMTAwTSBIYWxmIER1cGxleAotICAgICAgICAgICAiaW5zbW9kIGRtZmUgbW9kZT00IiA7O0ZvcmNlIDEwTSBGdWxsIER1cGxleAotICAgICAgICAgICAiaW5zbW9kIGRtZmUgbW9kZT01IiA7O0ZvcmNlIDEwME0gRnVsbCBEdXBsZXgKLQotICAgICAgICAzLiBDb25maWcgYSBkbTkxMDIgbmV0d29yayBpbnRlcmZhY2UKLSAgICAgICAgICAgImlmY29uZmlnIGV0aDAgMTcyLjIyLjMuMTgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eIFlvdXIgSVAgYWRkcmVzcwotCi0gICAgICAgIDQuIEFjdGl2YXRlIHRoZSBJUCByb3V0aW5nIHRhYmxlLiBGb3Igc29tZSBkaXN0cmlidXRpb25zLCBpdCBpcyBub3QKLSAgICAgICAgICAgbmVjZXNzYXJ5LiBZb3UgY2FuIHR5cGUgInJvdXRlIiB0byBjaGVjay4KLQotICAgICAgICAgICAicm91dGUgYWRkIGRlZmF1bHQgZXRoMCIKK05vdyB5b3VyIGV0aGVybmV0IGNhcmQgc2hvdWxkIGJlIHVwIGFuZCBydW5uaW5nLgogCiAKLSAgICAgICAgNS4gV2VsbCBkb25lLiBZb3VyIERNOTEwMiBhZGFwdGVyIGlzIG5vdyBhY3RpdmF0ZWQuCitUT0RPOgorCitJbXBsZW1lbnQgcGNpX2RyaXZlcjo6c3VzcGVuZCgpIGFuZCBwY2lfZHJpdmVyOjpyZXN1bWUoKSBwb3dlciBtYW5hZ2VtZW50IG1ldGhvZHMuCitDaGVjayBvbiA2NCBiaXQgYm94ZXMuCitDaGVjayBhbmQgZml4IG9uIGJpZyBlbmRpYW4gYm94ZXMuCitUZXN0IGFuZCBtYWtlIHN1cmUgUENJIGxhdGVuY3kgaXMgbm93IGNvcnJlY3QgZm9yIGFsbCBjYXNlcy4KIAogCi0gICBDLiBPYmplY3QgZmlsZXMgZGVzY3JpcHRpb246Ci0gICAgICAgIDEuIGRtZmVfcmg2MS5vOiAgICAgICAJRm9yIFJlZGhhdCA2LjEKK0F1dGhvcnM6CiAKLSAgICAgICAgSWYgeW91IGNhbiBtYWtlIHN1cmUgeW91ciBrZXJuZWwgdmVyc2lvbiwgeW91IGNhbiByZW5hbWUKLSAgICAgICAgdG8gZG1mZS5vIGFuZCBkaXJlY3RseSB1c2UgaXQgd2l0aG91dCByZS1jb21waWxpbmcuCitTdGVuIFdhbmcgPHN0ZW5fd2FuZ0BkYXZpY29tLmNvbS50dyA+ICAgOiBPcmlnaW5hbCBBdXRob3IKK1RvYmlhcyBSaW5nc3Ryb20gPHRvcmlAdW5oYXBweS5taW5lLm51PiA6IEN1cnJlbnQgTWFpbnRhaW5lcgogCitDb250cmlidXRvcnM6CiAKLSAgQXV0aG9yOiBTdGVuIFdhbmcsIDg4Ni0zLTU3OTg3OTctODUxNywgRS1tYWlsOiBzdGVuX3dhbmdAZGF2aWNvbS5jb20udHcKK01hcmNlbG8gVG9zYXR0aSA8bWFyY2Vsb0Bjb25lY3RpdmEuY29tLmJyPgorQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KK0plZmYgR2FyemlrIDxqZ2FyemlrQHBvYm94LmNvbT4KK1ZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmliX3RyaWUudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZpYl90cmllLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBkMGM2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZpYl90cmllLnR4dApAQCAtMCwwICsxLDE0NSBAQAorCQkJTEMtdHJpZSBpbXBsZW1lbnRhdGlvbiBub3Rlcy4KKworTm9kZSB0eXBlcworLS0tLS0tLS0tLQorbGVhZiAKKwlBbiBlbmQgbm9kZSB3aXRoIGRhdGEuIFRoaXMgaGFzIGEgY29weSBvZiB0aGUgcmVsZXZhbnQga2V5LCBhbG9uZworCXdpdGggJ2hsaXN0JyB3aXRoIHJvdXRpbmcgdGFibGUgZW50cmllcyBzb3J0ZWQgYnkgcHJlZml4IGxlbmd0aC4KKwlTZWUgc3RydWN0IGxlYWYgYW5kIHN0cnVjdCBsZWFmX2luZm8uCisKK3RyaWUgbm9kZSBvciB0bm9kZQorCUFuIGludGVybmFsIG5vZGUsIGhvbGRpbmcgYW4gYXJyYXkgb2YgY2hpbGQgKGxlYWYgb3IgdG5vZGUpIHBvaW50ZXJzLAorCWluZGV4ZWQJdGhyb3VnaCBhIHN1YnNldCBvZiB0aGUga2V5LiBTZWUgTGV2ZWwgQ29tcHJlc3Npb24uCisKK0EgZmV3IGNvbmNlcHRzIGV4cGxhaW5lZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCaXRzICh0bm9kZSkgCisJVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBrZXkgc2VnbWVudCB1c2VkIGZvciBpbmRleGluZyBpbnRvIHRoZQorCWNoaWxkIGFycmF5IC0gdGhlICJjaGlsZCBpbmRleCIuIFNlZSBMZXZlbCBDb21wcmVzc2lvbi4KKworUG9zICh0bm9kZSkKKwlUaGUgcG9zaXRpb24gKGluIHRoZSBrZXkpIG9mIHRoZSBrZXkgc2VnbWVudCB1c2VkIGZvciBpbmRleGluZyBpbnRvCisJdGhlIGNoaWxkIGFycmF5LiBTZWUgUGF0aCBDb21wcmVzc2lvbi4KKworUGF0aCBDb21wcmVzc2lvbiAvIHNraXBwZWQgYml0cworCUFueSBnaXZlbiB0bm9kZSBpcyBsaW5rZWQgdG8gZnJvbSB0aGUgY2hpbGQgYXJyYXkgb2YgaXRzIHBhcmVudCwgdXNpbmcKKwlhIHNlZ21lbnQgb2YgdGhlIGtleSBzcGVjaWZpZWQgYnkgdGhlIHBhcmVudCdzICJwb3MiIGFuZCAiYml0cyIgCisJSW4gY2VydGFpbiBjYXNlcywgdGhpcyB0bm9kZSdzIG93biAicG9zIiB3aWxsIG5vdCBiZSBpbW1lZGlhdGVseQorCWFkamFjZW50IHRvIHRoZSBwYXJlbnQgKHBvcytiaXRzKSwgYnV0IHRoZXJlIHdpbGwgYmUgc29tZSBiaXRzCisJaW4gdGhlIGtleSBza2lwcGVkIG92ZXIgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCBhIHNpbmdsZSBwYXRoIHdpdGggbm8KKwlkZXZpYXRpb25zLiBUaGVzZSAic2tpcHBlZCBiaXRzIiBjb25zdGl0dXRlIFBhdGggQ29tcHJlc3Npb24uCisJTm90ZSB0aGF0IHRoZSBzZWFyY2ggYWxnb3JpdGhtIHdpbGwgc2ltcGx5IHNraXAgb3ZlciB0aGVzZSBiaXRzIHdoZW4KKwlzZWFyY2hpbmcsIG1ha2luZyBpdCBuZWNlc3NhcnkgdG8gc2F2ZSB0aGUga2V5cyBpbiB0aGUgbGVhdmVzIHRvCisJdmVyaWZ5IHRoYXQgdGhleSBhY3R1YWxseSBkbyBtYXRjaCB0aGUga2V5IHdlIGFyZSBzZWFyY2hpbmcgZm9yLgorCitMZXZlbCBDb21wcmVzc2lvbiAvIGNoaWxkIGFycmF5cworCXRoZSB0cmllIGlzIGtlcHQgbGV2ZWwgYmFsYW5jZWQgbW92aW5nLCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoZQorCWNoaWxkcmVuIG9mIGEgZnVsbCBjaGlsZCAoc2VlICJmdWxsX2NoaWxkcmVuIikgdXAgb25lIGxldmVsLCBzbyB0aGF0CisJaW5zdGVhZCBvZiBhIHB1cmUgYmluYXJ5IHRyZWUsIGVhY2ggaW50ZXJuYWwgbm9kZSAoInRub2RlIikgbWF5CisJY29udGFpbiBhbiBhcmJpdHJhcmlseSBsYXJnZSBhcnJheSBvZiBsaW5rcyB0byBzZXZlcmFsIGNoaWxkcmVuLgorCUNvbnZlcnNlbHksIGEgdG5vZGUgd2l0aCBhIG1vc3RseSBlbXB0eQljaGlsZCBhcnJheSAoc2VlIGVtcHR5X2NoaWxkcmVuKQorCW1heSBiZSAiaGFsdmVkIiwgaGF2aW5nIHNvbWUgb2YgaXRzIGNoaWxkcmVuIG1vdmVkIGRvd253YXJkcyBvbmUgbGV2ZWwsCisJaW4gb3JkZXIgdG8gYXZvaWQgZXZlci1pbmNyZWFzaW5nIGNoaWxkIGFycmF5cy4KKworZW1wdHlfY2hpbGRyZW4KKwl0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucyBpbiB0aGUgY2hpbGQgYXJyYXkgb2YgYSBnaXZlbiB0bm9kZSB0aGF0IGFyZQorCU5VTEwuCisKK2Z1bGxfY2hpbGRyZW4KKwl0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIGEgZ2l2ZW4gdG5vZGUgdGhhdCBhcmVuJ3QgcGF0aCBjb21wcmVzc2VkLgorCShpbiBvdGhlciB3b3JkcywgdGhleSBhcmVuJ3QgTlVMTCBvciBsZWF2ZXMgYW5kIHRoZWlyICJwb3MiIGlzIGVxdWFsCisJdG8gdGhpcwl0bm9kZSdzICJwb3MiKyJiaXRzIikuCisKKwkoVGhlIHdvcmQgImZ1bGwiIGhlcmUgaXMgdXNlZCBtb3JlIGluIHRoZSBzZW5zZSBvZiAiY29tcGxldGUiIHRoYW4KKwlhcyB0aGUgb3Bwb3NpdGUgb2YgImVtcHR5Iiwgd2hpY2ggbWlnaHQgYmUgYSB0YWQgY29uZnVzaW5nLikKKworQ29tbWVudHMKKy0tLS0tLS0tLQorCitXZSBoYXZlIHRyaWVkIHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBhcyBjbG9zZSB0byBmaWJfaGFzaCBhcyAKK3Bvc3NpYmxlIHRvIGFsbG93IHZlcmlmaWNhdGlvbiBhbmQgaGVscCB1cCByZXZpZXdpbmcuIAorCitmaWJfZmluZF9ub2RlKCkKKwlBIGdvb2Qgc3RhcnQgZm9yIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlLiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgYQorCXN0cmFpZ2h0Zm9yd2FyZCB0cmllIGxvb2t1cC4KKworZmliX2luc2VydF9ub2RlKCkKKwlJbnNlcnRzIGEgbmV3IGxlYWYgbm9kZSBpbiB0aGUgdHJpZS4gVGhpcyBpcyBiaXQgbW9yZSBjb21wbGljYXRlZCB0aGFuCisJZmliX2ZpbmRfbm9kZSgpLiBJbnNlcnRpbmcgYSBuZXcgbm9kZSBtZWFucyB3ZSBtaWdodCBoYXZlIHRvIHJ1biB0aGUKKwlsZXZlbCBjb21wcmVzc2lvbiBhbGdvcml0aG0gb24gcGFydCBvZiB0aGUgdHJpZS4KKwordHJpZV9sZWFmX3JlbW92ZSgpCisJTG9va3MgdXAgYSBrZXksIGRlbGV0ZXMgaXQgYW5kIHJ1bnMgdGhlIGxldmVsIGNvbXByZXNzaW9uIGFsZ29yaXRobS4KKwordHJpZV9yZWJhbGFuY2UoKQorCVRoZSBrZXkgZnVuY3Rpb24gZm9yIHRoZSBkeW5hbWljIHRyaWUgYWZ0ZXIgYW55IGNoYW5nZSBpbiB0aGUgdHJpZQorCWl0IGlzIHJ1biB0byBvcHRpbWl6ZSBhbmQgcmVvcmdhbml6ZS4gVHQgd2lsbCB3YWxrIHRoZSB0cmllIHVwd2FyZHMgCisJdG93YXJkcyB0aGUgcm9vdCBmcm9tIGEgZ2l2ZW4gdG5vZGUsIGRvaW5nIGEgcmVzaXplKCkgYXQgZWFjaCBzdGVwIAorCXRvIGltcGxlbWVudCBsZXZlbCBjb21wcmVzc2lvbi4KKworcmVzaXplKCkKKwlBbmFseXplcyBhIHRub2RlIGFuZCBvcHRpbWl6ZXMgdGhlIGNoaWxkIGFycmF5IHNpemUgYnkgZWl0aGVyIGluZmxhdGluZworCW9yIHNocmlua2luZyBpdCByZXBlYXRlZGx5IHVudGlsIGl0IGZ1bGxmaWxscyB0aGUgY3JpdGVyaWEgZm9yIG9wdGltYWwKKwlsZXZlbCBjb21wcmVzc2lvbi4gVGhpcyBwYXJ0IGZvbGxvd3MgdGhlIG9yaWdpbmFsIHBhcGVyIHByZXR0eSBjbG9zZWx5CisJYW5kIHRoZXJlIG1heSBiZSBzb21lIHJvb20gZm9yIGV4cGVyaW1lbnRhdGlvbiBoZXJlLgorCitpbmZsYXRlKCkKKwlEb3VibGVzIHRoZSBzaXplIG9mIHRoZSBjaGlsZCBhcnJheSB3aXRoaW4gYSB0bm9kZS4gVXNlZCBieSByZXNpemUoKS4KKworaGFsdmUoKQorCUhhbHZlcyB0aGUgc2l6ZSBvZiB0aGUgY2hpbGQgYXJyYXkgd2l0aGluIGEgdG5vZGUgLSB0aGUgaW52ZXJzZSBvZgorCWluZmxhdGUoKS4gVXNlZCBieSByZXNpemUoKTsKKworZm5fdHJpZV9pbnNlcnQoKSwgZm5fdHJpZV9kZWxldGUoKSwgZm5fdHJpZV9zZWxlY3RfZGVmYXVsdCgpCisJVGhlIHJvdXRlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuIFNob3VsZCBjb25mb3JtIHByZXR0eSBjbG9zZWx5IHRvIHRoZQorCWNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGluIGZpYl9oYXNoLgorCitmbl90cmllX2ZsdXNoKCkKKwlUaGlzIHdhbGtzIHRoZSBmdWxsIHRyaWUgKHVzaW5nIG5leHRsZWFmKCkpIGFuZCBzZWFyY2hlcyBmb3IgZW1wdHkKKwlsZWF2ZXMgd2hpY2ggaGF2ZSB0byBiZSByZW1vdmVkLgorCitmbl90cmllX2R1bXAoKQorCUR1bXBzIHRoZSByb3V0aW5nIHRhYmxlIG9yZGVyZWQgYnkgcHJlZml4IGxlbmd0aC4gVGhpcyBpcyBzb21ld2hhdAorCXNsb3dlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGZpYl9oYXNoIGZ1bmN0aW9uLCBhcyB3ZSBoYXZlIHRvIHdhbGsgdGhlCisJZW50aXJlIHRyaWUgZm9yIGVhY2ggcHJlZml4IGxlbmd0aC4gSW4gY29tcGFyaXNvbiwgZmliX2hhc2ggaXMgb3JnYW5pemVkCisJYXMgb25lICJ6b25lIi9oYXNoIHBlciBwcmVmaXggbGVuZ3RoLgorCitMb2NraW5nCistLS0tLS0tCisKK2ZpYl9sb2NrIGlzIHVzZWQgZm9yIGFuIFJXLWxvY2sgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhpcyBpcyBkb25lIGluIGZpYl9oYXNoLgorSG93ZXZlciwgdGhlIGZ1bmN0aW9ucyBhcmUgc29tZXdoYXQgc2VwYXJhdGVkIGZvciBvdGhlciBwb3NzaWJsZSBsb2NraW5nCitzY2VuYXJpb3MuIEl0IG1pZ2h0IGNvbmNlaXZhYmx5IGJlIHBvc3NpYmxlIHRvIHJ1biB0cmllX3JlYmFsYW5jZSB2aWEgUkNVCit0byBhdm9pZCByZWFkX2xvY2sgaW4gdGhlIGZuX3RyaWVfbG9va3VwKCkgZnVuY3Rpb24uCisKK01haW4gbG9va3VwIG1lY2hhbmlzbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmbl90cmllX2xvb2t1cCgpIGlzIHRoZSBtYWluIGxvb2t1cCBmdW5jdGlvbi4KKworVGhlIGxvb2t1cCBpcyBpbiBpdHMgc2ltcGxlc3QgZm9ybSBqdXN0IGxpa2UgZmliX2ZpbmRfbm9kZSgpLiBXZSBkZXNjZW5kIHRoZQordHJpZSwga2V5IHNlZ21lbnQgYnkga2V5IHNlZ21lbnQsIHVudGlsIHdlIGZpbmQgYSBsZWFmLiBjaGVja19sZWFmKCkgZG9lcwordGhlIGZpYl9zZW1hbnRpY19tYXRjaCBpbiB0aGUgbGVhZidzIHNvcnRlZCBwcmVmaXggaGxpc3QuCisKK0lmIHdlIGZpbmQgYSBtYXRjaCwgd2UgYXJlIGRvbmUuCisKK0lmIHdlIGRvbid0IGZpbmQgYSBtYXRjaCwgd2UgZW50ZXIgcHJlZml4IG1hdGNoaW5nIG1vZGUuIFRoZSBwcmVmaXggbGVuZ3RoLAorc3RhcnRpbmcgb3V0IGF0IHRoZSBzYW1lIGFzIHRoZSBrZXkgbGVuZ3RoLCBpcyByZWR1Y2VkIG9uZSBzdGVwIGF0IGEgdGltZSwKK2FuZCB3ZSBiYWNrdHJhY2sgdXB3YXJkcyB0aHJvdWdoIHRoZSB0cmllIHRyeWluZyB0byBmaW5kIGEgbG9uZ2VzdCBtYXRjaGluZworcHJlZml4LiBUaGUgZ29hbCBpcyBhbHdheXMgdG8gcmVhY2ggYSBsZWFmIGFuZCBnZXQgYSBwb3NpdGl2ZSByZXN1bHQgZnJvbSB0aGUKK2ZpYl9zZW1hbnRpY19tYXRjaCBtZWNoYW5pc20uCisKK0luc2lkZSBlYWNoIHRub2RlLCB0aGUgc2VhcmNoIGZvciBsb25nZXN0IG1hdGNoaW5nIHByZWZpeCBjb25zaXN0cyBvZiBzZWFyY2hpbmcKK3Rocm91Z2ggdGhlIGNoaWxkIGFycmF5LCBjaG9wcGluZyBvZmYgKHplcm9pbmcpIHRoZSBsZWFzdCBzaWduaWZpY2FudCAiMSIgb2YKK3RoZSBjaGlsZCBpbmRleCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2ggb3IgdGhlIGNoaWxkIGluZGV4IGNvbnNpc3RzIG9mIG5vdGhpbmcgYnV0Cit6ZXJvcy4KKworQXQgdGhpcyBwb2ludCB3ZSBiYWNrdHJhY2sgKHQtPnN0YXRzLmJhY2t0cmFjaysrKSB1cCB0aGUgdHJpZSwgY29udGludWluZyB0bworY2hvcCBvZmYgcGFydCBvZiB0aGUga2V5IGluIG9yZGVyIHRvIGZpbmQgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgcHJlZml4LgorCitBdCB0aGlzIHBvaW50IHdlIHdpbGwgcmVwZWF0ZWRseSBkZXNjZW5kIHN1YnRyaWVzIHRvIGxvb2sgZm9yIGEgbWF0Y2gsIGFuZCB0aGVyZQorYXJlIHNvbWUgb3B0aW1pemF0aW9ucyBhdmFpbGFibGUgdGhhdCBjYW4gcHJvdmlkZSB1cyB3aXRoICJzaG9ydGN1dHMiIHRvIGF2b2lkCitkZXNjZW5kaW5nIGludG8gZGVhZCBlbmRzLiBMb29rIGZvciAiSExfT1BUSU1JWkUiIHNlY3Rpb25zIGluIHRoZSBjb2RlLgorCitUbyBhbGxldmlhdGUgYW55IGRvdWJ0cyBhYm91dCB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHJvdXRlIHNlbGVjdGlvbiBwcm9jZXNzLAorYSBuZXcgbmV0bGluayBvcGVyYXRpb24gaGFzIGJlZW4gYWRkZWQuIExvb2sgZm9yIE5FVExJTktfRklCX0xPT0tVUCwgd2hpY2gKK2dpdmVzIHVzZXJsYW5kIGFjY2VzcyB0byBmaWJfbG9va3VwKCkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IGEyYzg5M2E3Li5hYjY1NzE0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dApAQCAtMzA0LDU3ICszMDQsNiBAQAogCWNoYW5nZWQgd291bGQgYmUgYSBCZW93dWxmIGNvbXB1dGUgY2x1c3Rlci4KIAlEZWZhdWx0OiAwCiAKLXRjcF93ZXN0d29vZCAtIEJPT0xFQU4KLSAgICAgICAgRW5hYmxlIFRDUCBXZXN0d29vZCsgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobS4KLQlUQ1AgV2VzdHdvb2QrIGlzIGEgc2VuZGVyLXNpZGUgb25seSBtb2RpZmljYXRpb24gb2YgdGhlIFRDUCBSZW5vIAotCXByb3RvY29sIHN0YWNrIHRoYXQgb3B0aW1pemVzIHRoZSBwZXJmb3JtYW5jZSBvZiBUQ1AgY29uZ2VzdGlvbiAKLQljb250cm9sLiBJdCBpcyBiYXNlZCBvbiBlbmQtdG8tZW5kIGJhbmR3aWR0aCBlc3RpbWF0aW9uIHRvIHNldCAKLQljb25nZXN0aW9uIHdpbmRvdyBhbmQgc2xvdyBzdGFydCB0aHJlc2hvbGQgYWZ0ZXIgYSBjb25nZXN0aW9uIAotCWVwaXNvZGUuIFVzaW5nIHRoaXMgZXN0aW1hdGlvbiwgVENQIFdlc3R3b29kKyBhZGFwdGl2ZWx5IHNldHMgYSAKLQlzbG93IHN0YXJ0IHRocmVzaG9sZCBhbmQgYSBjb25nZXN0aW9uIHdpbmRvdyB3aGljaCB0YWtlcyBpbnRvIAotCWFjY291bnQgdGhlIGJhbmR3aWR0aCB1c2VkICBhdCB0aGUgdGltZSBjb25nZXN0aW9uIGlzIGV4cGVyaWVuY2VkLiAKLQlUQ1AgV2VzdHdvb2QrIHNpZ25pZmljYW50bHkgaW5jcmVhc2VzIGZhaXJuZXNzIHdydCBUQ1AgUmVubyBpbiAKLQl3aXJlZCBuZXR3b3JrcyBhbmQgdGhyb3VnaHB1dCBvdmVyIHdpcmVsZXNzIGxpbmtzLiAgIAotICAgICAgICBEZWZhdWx0OiAwCi0KLXRjcF92ZWdhc19jb25nX2F2b2lkIC0gQk9PTEVBTgotCUVuYWJsZSBUQ1AgVmVnYXMgY29uZ2VzdGlvbiBhdm9pZGFuY2UgYWxnb3JpdGhtLgotCVRDUCBWZWdhcyBpcyBhIHNlbmRlci1zaWRlIG9ubHkgY2hhbmdlIHRvIFRDUCB0aGF0IGFudGljaXBhdGVzCi0JdGhlIG9uc2V0IG9mIGNvbmdlc3Rpb24gYnkgZXN0aW1hdGluZyB0aGUgYmFuZHdpZHRoLiBUQ1AgVmVnYXMKLQlhZGp1c3RzIHRoZSBzZW5kaW5nIHJhdGUgYnkgbW9kaWZ5aW5nIHRoZSBjb25nZXN0aW9uCi0Jd2luZG93LiBUQ1AgVmVnYXMgc2hvdWxkIHByb3ZpZGUgbGVzcyBwYWNrZXQgbG9zcywgYnV0IGl0IGlzCi0Jbm90IGFzIGFnZ3Jlc3NpdmUgYXMgVENQIFJlbm8uCi0JRGVmYXVsdDowCi0KLXRjcF9iaWMgLSBCT09MRUFOCi0JRW5hYmxlIEJJQyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobS4KLQlCSUMtVENQIGlzIGEgc2VuZGVyLXNpZGUgb25seSBjaGFuZ2UgdGhhdCBlbnN1cmVzIGEgbGluZWFyIFJUVAotCWZhaXJuZXNzIHVuZGVyIGxhcmdlIHdpbmRvd3Mgd2hpbGUgb2ZmZXJpbmcgYm90aCBzY2FsYWJpbGl0eSBhbmQKLQlib3VuZGVkIFRDUC1mcmllbmRsaW5lc3MuIFRoZSBwcm90b2NvbCBjb21iaW5lcyB0d28gc2NoZW1lcwotCWNhbGxlZCBhZGRpdGl2ZSBpbmNyZWFzZSBhbmQgYmluYXJ5IHNlYXJjaCBpbmNyZWFzZS4gV2hlbiB0aGUKLQljb25nZXN0aW9uIHdpbmRvdyBpcyBsYXJnZSwgYWRkaXRpdmUgaW5jcmVhc2Ugd2l0aCBhIGxhcmdlCi0JaW5jcmVtZW50IGVuc3VyZXMgbGluZWFyIFJUVCBmYWlybmVzcyBhcyB3ZWxsIGFzIGdvb2QKLQlzY2FsYWJpbGl0eS4gVW5kZXIgc21hbGwgY29uZ2VzdGlvbiB3aW5kb3dzLCBiaW5hcnkgc2VhcmNoCi0JaW5jcmVhc2UgcHJvdmlkZXMgVENQIGZyaWVuZGxpbmVzcy4KLQlEZWZhdWx0OiAwCi0KLXRjcF9iaWNfbG93X3dpbmRvdyAtIElOVEVHRVIKLQlTZXRzIHRoZSB0aHJlc2hvbGQgd2luZG93IChpbiBwYWNrZXRzKSB3aGVyZSBCSUMgVENQIHN0YXJ0cyB0bwotCWFkanVzdCB0aGUgY29uZ2VzdGlvbiB3aW5kb3cuIEJlbG93IHRoaXMgdGhyZXNob2xkIEJJQyBUQ1AgYmVoYXZlcwotCXRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IFRDUCBSZW5vLiAKLQlEZWZhdWx0OiAxNAotCi10Y3BfYmljX2Zhc3RfY29udmVyZ2VuY2UgLSBCT09MRUFOCi0JRm9yY2VzIEJJQyBUQ1AgdG8gbW9yZSBxdWlja2x5IHJlc3BvbmQgdG8gY2hhbmdlcyBpbiBjb25nZXN0aW9uCi0Jd2luZG93LiBBbGxvd3MgdHdvIGZsb3dzIHNoYXJpbmcgdGhlIHNhbWUgY29ubmVjdGlvbiB0byBjb252ZXJnZQotCW1vcmUgcmFwaWRseS4KLQlEZWZhdWx0OiAxCi0KLXRjcF9kZWZhdWx0X3dpbl9zY2FsZSAtIElOVEVHRVIKLQlTZXRzIHRoZSBtaW5pbXVtIHdpbmRvdyBzY2FsZSBUQ1Agd2lsbCBuZWdvdGlhdGUgZm9yIG9uIGFsbAotCWNvbmVjdGlvbnMuCi0JRGVmYXVsdDogNwotCiB0Y3BfdHNvX3dpbl9kaXZpc29yIC0gSU5URUdFUgogICAgICAgIFRoaXMgYWxsb3dzIGNvbnRyb2wgb3ZlciB3aGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGNvbmdlc3Rpb24gd2luZG93CiAgICAgICAgY2FuIGJlIGNvbnN1bWVkIGJ5IGEgc2luZ2xlIFRTTyBmcmFtZS4KQEAgLTM2OCw2ICszMTcsMTEgQEAKIAl3aGVyZSBwYWNrZXQgbG9zcyBpcyB0eXBpY2FsbHkgZHVlIHRvIHJhbmRvbSByYWRpbyBpbnRlcmZlcmVuY2UKIAlyYXRoZXIgdGhhbiBpbnRlcm1lZGlhdGUgcm91dGVyIGNvbmdlc3Rpb24uCiAKK3RjcF9jb25nZXN0aW9uX2NvbnRyb2wgLSBTVFJJTkcKKwlTZXQgdGhlIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gdG8gYmUgdXNlZCBmb3IgbmV3CisJY29ubmVjdGlvbnMuIFRoZSBhbGdvcml0aG0gInJlbm8iIGlzIGFsd2F5cyBhdmFpbGFibGUsIGJ1dAorCWFkZGl0aW9uYWwgY2hvaWNlcyBtYXkgYmUgYXZhaWxhYmxlIGJhc2VkIG9uIGtlcm5lbCBjb25maWd1cmF0aW9uLgorCiBzb21heGNvbm4gLSBJTlRFR0VSCiAJTGltaXQgb2Ygc29ja2V0IGxpc3RlbigpIGJhY2tsb2csIGtub3duIGluIHVzZXJzcGFjZSBhcyBTT01BWENPTk4uCiAJRGVmYXVsdHMgdG8gMTI4LiAgU2VlIGFsc28gdGNwX21heF9zeW5fYmFja2xvZyBmb3IgYWRkaXRpb25hbCB0dW5pbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90Y3AudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RjcC50eHQKaW5kZXggNzE3NDkwMC4uMGZhMzAwNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RjcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RjcC50eHQKQEAgLTEsNSArMSw3MiBAQAotSG93IHRoZSBuZXcgVENQIG91dHB1dCBtYWNoaW5lIFtueWldIHdvcmtzLgorVENQIHByb3RvY29sCis9PT09PT09PT09PT0KIAorTGFzdCB1cGRhdGVkOiAyMSBKdW5lIDIwMDUKKworQ29udGVudHMKKz09PT09PT09CisKKy0gQ29uZ2VzdGlvbiBjb250cm9sCistIEhvdyB0aGUgbmV3IFRDUCBvdXRwdXQgbWFjaGluZSBbbnlpXSB3b3JrcworCitDb25nZXN0aW9uIGNvbnRyb2wKKz09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgdXNlZCBpbiB0aGUgdGNwX3NvY2sgZm9yIGNvbmdlc3Rpb24gY29udHJvbDoKK3NuZF9jd25kCQlUaGUgc2l6ZSBvZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cKK3NuZF9zc3RocmVzaAkJU2xvdyBzdGFydCB0aHJlc2hvbGQuIFdlIGFyZSBpbiBzbG93IHN0YXJ0IGlmCisJCQlzbmRfY3duZCBpcyBsZXNzIHRoYW4gdGhpcy4KK3NuZF9jd25kX2NudAkJQSBjb3VudGVyIHVzZWQgdG8gc2xvdyBkb3duIHRoZSByYXRlIG9mIGluY3JlYXNlCisJCQlvbmNlIHdlIGV4Y2VlZCBzbG93IHN0YXJ0IHRocmVzaG9sZC4KK3NuZF9jd25kX2NsYW1wCQlUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgdGhhdCBzbmRfY3duZCBjYW4gZ3JvdyB0by4KK3NuZF9jd25kX3N0YW1wCQlUaW1lc3RhbXAgZm9yIHdoZW4gY29uZ2VzdGlvbiB3aW5kb3cgbGFzdCB2YWxpZGF0ZWQuCitzbmRfY3duZF91c2VkCQlVc2VkIGFzIGEgaGlnaHdhdGVyIG1hcmsgZm9yIGhvdyBtdWNoIG9mIHRoZQorCQkJY29uZ2VzdGlvbiB3aW5kb3cgaXMgaW4gdXNlLiBJdCBpcyB1c2VkIHRvIGFkanVzdAorCQkJc25kX2N3bmQgZG93biB3aGVuIHRoZSBsaW5rIGlzIGxpbWl0ZWQgYnkgdGhlCisJCQlhcHBsaWNhdGlvbiByYXRoZXIgdGhhbiB0aGUgbmV0d29yay4KKworQXMgb2YgMi42LjEzLCBMaW51eCBzdXBwb3J0cyBwbHVnZ2FibGUgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobXMuCitBIGNvbmdlc3Rpb24gY29udHJvbCBtZWNoYW5pc20gY2FuIGJlIHJlZ2lzdGVyZWQgdGhyb3VnaCBmdW5jdGlvbnMgaW4KK3RjcF9jb25nLmMuIFRoZSBmdW5jdGlvbnMgdXNlZCBieSB0aGUgY29uZ2VzdGlvbiBjb250cm9sIG1lY2hhbmlzbSBhcmUKK3JlZ2lzdGVyZWQgdmlhIHBhc3NpbmcgYSB0Y3BfY29uZ2VzdGlvbl9vcHMgc3RydWN0IHRvCit0Y3BfcmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sLiBBcyBhIG1pbmltdW0gbmFtZSwgc3N0aHJlc2gsCitjb25nX2F2b2lkLCBtaW5fY3duZCBtdXN0IGJlIHZhbGlkLgorCitQcml2YXRlIGRhdGEgZm9yIGEgY29uZ2VzdGlvbiBjb250cm9sIG1lY2hhbmlzbSBpcyBzdG9yZWQgaW4gdHAtPmNhX3ByaXYuCit0Y3BfY2EodHApIHJldHVybnMgYSBwb2ludGVyIHRvIHRoaXMgc3BhY2UuICBUaGlzIGlzIHByZWFsbG9jYXRlZCBzcGFjZSAtIGl0CitpcyBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHNpemUgb2YgeW91ciBwcml2YXRlIGRhdGEgd2lsbCBmaXQgdGhpcyBzcGFjZSwgb3IKK2FsdGVybmF0aXZlbHkgc3BhY2UgY291bGQgYmUgYWxsb2NhdGVkIGVsc2V3aGVyZSBhbmQgYSBwb2ludGVyIHRvIGl0IGNvdWxkCitiZSBzdG9yZWQgaGVyZS4KKworVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG1zIGN1cnJlbnRseTogVGhlCitzaW1wbGVzdCBvbmVzIGFyZSBkZXJpdmVkIGZyb20gVENQIHJlbm8gKGhpZ2hzcGVlZCwgc2NhbGFibGUpIGFuZCBqdXN0Citwcm92aWRlIGFuIGFsdGVybmF0aXZlIHRoZSBjb25nZXN0aW9uIHdpbmRvdyBjYWxjdWxhdGlvbi4gTW9yZSBjb21wbGV4CitvbmVzIGxpa2UgQklDIHRyeSB0byBsb29rIGF0IG90aGVyIGV2ZW50cyB0byBwcm92aWRlIGJldHRlcgoraGV1cmlzdGljcy4gIFRoZXJlIGFyZSBhbHNvIHJvdW5kIHRyaXAgdGltZSBiYXNlZCBhbGdvcml0aG1zIGxpa2UKK1ZlZ2FzIGFuZCBXZXN0d29vZCsuCisKK0dvb2QgVENQIGNvbmdlc3Rpb24gY29udHJvbCBpcyBhIGNvbXBsZXggcHJvYmxlbSBiZWNhdXNlIHRoZSBhbGdvcml0aG0KK25lZWRzIHRvIG1haW50YWluIGZhaXJuZXNzIGFuZCBwZXJmb3JtYW5jZS4gUGxlYXNlIHJldmlldyBjdXJyZW50CityZXNlYXJjaCBhbmQgUkZDJ3MgYmVmb3JlIGRldmVsb3BpbmcgbmV3IG1vZHVsZXMuCisKK1RoZSBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBjb25nZXN0aW9uIGNvbnRyb2wgbWVjaGFuaXNtIGlzCitkZXRlcm1pbmVkIGJ5IHRoZSBzZXR0aW5nIG9mIHRoZSBzeXNjdGwgbmV0LmlwdjQudGNwX2Nvbmdlc3Rpb25fY29udHJvbC4KK1RoZSBkZWZhdWx0IGNvbmdlc3Rpb24gY29udHJvbCB3aWxsIGJlIHRoZSBsYXN0IG9uZSByZWdpc3RlcmVkIChMSUZPKTsKK3NvIGlmIHlvdSBidWlsdCBldmVyeXRoaW5nIGFzIG1vZHVsZXMuIHRoZSBkZWZhdWx0IHdpbGwgYmUgcmVuby4gSWYgeW91CitidWlsZCB3aXRoIHRoZSBkZWZhdWx0J3MgZnJvbSBLY29uZmlnLCB0aGVuIEJJQyB3aWxsIGJlIGJ1aWx0aW4gKG5vdCBhIG1vZHVsZSkKK2FuZCBpdCB3aWxsIGVuZCB1cCB0aGUgZGVmYXVsdC4KKworSWYgeW91IHJlYWxseSB3YW50IGEgcGFydGljdWxhciBkZWZhdWx0IHZhbHVlIHRoZW4geW91IHdpbGwgbmVlZAordG8gc2V0IGl0IHdpdGggdGhlIHN5c2N0bC4gIElmIHlvdSB1c2UgYSBzeXNjdGwsIHRoZSBtb2R1bGUgd2lsbCBiZSBhdXRvbG9hZGVkCitpZiBuZWVkZWQgYW5kIHlvdSB3aWxsIGdldCB0aGUgZXhwZWN0ZWQgcHJvdG9jb2wuIElmIHlvdSBhc2sgZm9yIGFuCit1bmtub3duIGNvbmdlc3Rpb24gbWV0aG9kLCB0aGVuIHRoZSBzeXNjdGwgYXR0ZW1wdCB3aWxsIGZhaWwuCisKK0lmIHlvdSByZW1vdmUgYSB0Y3AgY29uZ2VzdGlvbiBjb250cm9sIG1vZHVsZSwgdGhlbiB5b3Ugd2lsbCBnZXQgdGhlIG5leHQKK2F2YWlsYWJsZSBvbmUuIFNpbmNlIHJlbm8gY2FuIG5vdCBiZSBidWlsdCBhcyBhIG1vZHVsZSwgYW5kIGNhbiBub3QgYmUKK2RlbGV0ZWQsIGl0IHdpbGwgYWx3YXlzIGJlIGF2YWlsYWJsZS4KKworSG93IHRoZSBuZXcgVENQIG91dHB1dCBtYWNoaW5lIFtueWldIHdvcmtzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBEYXRhIGlzIGtlcHQgb24gYSBzaW5nbGUgcXVldWUuIFRoZSBza2ItPnVzZXJzIGZsYWcgdGVsbHMgdXMgaWYgdGhlIGZyYW1lIGlzCiBvbmUgdGhhdCBoYXMgYmVlbiBxdWV1ZWQgYWxyZWFkeS4gVG8gYWRkIGEgZnJhbWUgd2UgdGhyb3cgaXQgb24gdGhlIGVuZC4gQWNrCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FucGlwZS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FucGlwZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTIwY2QuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3dhbnBpcGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNjIyICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTGludXggV0FOIFJvdXRlciBVdGlsaXRpZXMgUGFja2FnZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1WZXJzaW9uIDIuMi4xIAotTWFyIDI4LCAyMDAxCi1BdXRob3I6IE5lbmFkIENvcmJpYyA8bmNvcmJpY0BzYW5nb21hLmNvbT4KLUNvcHlyaWdodCAoYykgMTk5NS0yMDAxIFNhbmdvbWEgVGVjaG5vbG9naWVzIEluYy4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JTlRST0RVQ1RJT04KLQotV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKSBhcmUgdXNlZCB0byBpbnRlcmNvbm5lY3QgTG9jYWwgQXJlYSBOZXR3b3JrcyAoTEFOcykKLWFuZC9vciBzdGFuZC1hbG9uZSBob3N0cyBvdmVyIHZhc3QgZGlzdGFuY2VzIHdpdGggZGF0YSB0cmFuc2ZlciByYXRlcwotc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aG9zZSBhY2hpZXZhYmxlIHdpdGggY29tbW9ubHkgdXNlZCBkaWFsLXVwCi1jb25uZWN0aW9ucy4KLQotVXN1YWxseSBhbiBleHRlcm5hbCBkZXZpY2UgY2FsbGVkIGBXQU4gcm91dGVyJyBzaXR0aW5nIG9uIHlvdXIgbG9jYWwgbmV0d29yawotb3IgY29ubmVjdGVkIHRvIHlvdXIgbWFjaGluZSdzIHNlcmlhbCBwb3J0IHByb3ZpZGVzIHBoeXNpY2FsIGNvbm5lY3Rpb24gdG8KLVdBTi4gIEFsdGhvdWdoIHJvdXRlcidzIGpvYiBtYXkgYmUgYXMgc2ltcGxlIGFzIHRha2luZyB5b3VyIGxvY2FsIG5ldHdvcmsKLXRyYWZmaWMsIGNvbnZlcnRpbmcgaXQgdG8gV0FOIGZvcm1hdCBhbmQgcGlwaW5nIGl0IHRocm91Z2ggdGhlIFdBTiBsaW5rLCB0aGVzZQotZGV2aWNlcyBhcmUgbm90b3Jpb3VzbHkgZXhwZW5zaXZlLCB3aXRoIHByaWNlcyBhcyBtdWNoIGFzIDIgLSA1IHRpbWVzIGhpZ2hlcgotdGhlbiB0aGUgcHJpY2Ugb2YgYSB0eXBpY2FsIFBDIGJveC4KLQotQWx0ZXJuYXRpdmVseSwgY29uc2lkZXJpbmcgcm9idXN0bmVzcyBhbmQgbXVsdGl0YXNraW5nIGNhcGFiaWxpdGllcyBvZiBMaW51eCwKLWFuIGludGVybmFsIHJvdXRlciBjYW4gYmUgYnVpbHQgKG1vc3Qgcm91dGVycyB1c2Ugc29tZSBzb3J0IG9mIHN0cmlwcGVkIGRvd24KLVVuaXgtbGlrZSBvcGVyYXRpbmcgc3lzdGVtIGFueXdheSkuIFdpdGggYSBudW1iZXIgb2YgcmVsYXRpdmVseSBpbmV4cGVuc2l2ZSBXQU4KLWludGVyZmFjZSBjYXJkcyBhdmFpbGFibGUgb24gdGhlIG1hcmtldCwgYSBwZXJmZWN0bHkgdXNhYmxlIHJvdXRlciBjYW4gYmUKLWJ1aWx0IGZvciBsZXNzIHRoYW4gaGFsZiBhIHByaWNlIG9mIGFuIGV4dGVybmFsIHJvdXRlci4gIFlldCBhIExpbnV4IGJveAotYWN0aW5nIGFzIGEgcm91dGVyIGNhbiBzdGlsbCBiZSB1c2VkIGZvciBvdGhlciBwdXJwb3Nlcywgc3VjaCBhcyBmaXJlLXdhbGxpbmcsCi1ydW5uaW5nIEZUUCwgV1dXIG9yIEROUyBzZXJ2ZXIsIGV0Yy4KLQotVGhpcyBrZXJuZWwgbW9kdWxlIGludHJvZHVjZXMgdGhlIG5vdGlvbiBvZiBhIFdBTiBMaW5rIERyaXZlciAoV0xEKSB0byBMaW51eAotb3BlcmF0aW5nIHN5c3RlbSBhbmQgcHJvdmlkZXMgZ2VuZXJpYyBoYXJkd2FyZS1pbmRlcGVuZGVudCBzZXJ2aWNlcyBmb3Igc3VjaAotZHJpdmVycy4gIFdoeSBjYW4gZXhpc3RpbmcgTGludXggbmV0d29yayBkZXZpY2UgaW50ZXJmYWNlIG5vdCBiZSB1c2VkIGZvcgotdGhpcyBwdXJwb3NlPyAgV2VsbCwgaXQgY2FuLiAgSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3IGtleSBkaWZmZXJlbmNlcyBiZXR3ZWVuCi1hIHR5cGljYWwgbmV0d29yayBpbnRlcmZhY2UgKGUuZy4gRXRoZXJuZXQpIGFuZCBhIFdBTiBsaW5rLgotCi1NYW55IFdBTiBwcm90b2NvbHMsIHN1Y2ggYXMgWC4yNSBhbmQgZnJhbWUgcmVsYXksIGFsbG93IGZvciBtdWx0aXBsZSBsb2dpY2FsCi1jb25uZWN0aW9ucyAoa25vd24gYXMgYHZpcnR1YWwgY2lyY3VpdHMnIGluIFguMjUgdGVybWlub2xvZ3kpIG92ZXIgYSBzaW5nbGUKLXBoeXNpY2FsIGxpbmsuICBFYWNoIHN1Y2ggdmlydHVhbCBjaXJjdWl0IG1heSAoYW5kIGFsbW9zdCBhbHdheXMgZG9lcykgbGVhZAotdG8gYSBkaWZmZXJlbnQgZ2VvZ3JhcGhpY2FsIGxvY2F0aW9uIGFuZCwgdGhlcmVmb3JlLCBkaWZmZXJlbnQgbmV0d29yay4gIEFzIGEKLXJlc3VsdCwgaXQgaXMgdGhlIHZpcnR1YWwgY2lyY3VpdCwgbm90IHRoZSBwaHlzaWNhbCBsaW5rLCB0aGF0IHJlcHJlc2VudHMgYQotcm91dGUgYW5kLCB0aGVyZWZvcmUsIGEgbmV0d29yayBpbnRlcmZhY2UgaW4gTGludXggdGVybXMuCi0KLVRvIGZ1cnRoZXIgY29tcGxpY2F0ZSB0aGluZ3MsIHZpcnR1YWwgY2lyY3VpdHMgYXJlIHVzdWFsbHkgdm9sYXRpbGUgaW4gbmF0dXJlCi0oZXhjbHVkaW5nIHNvIGNhbGxlZCBgcGVybWFuZW50JyB2aXJ0dWFsIGNpcmN1aXRzIG9yIFBWQ3MpLiAgV2l0aCBhbG1vc3Qgbm8KLXRpbWUgcmVxdWlyZWQgdG8gc2V0IHVwIGFuZCB0ZWFyIGRvd24gYSB2aXJ0dWFsIGNpcmN1aXQsIGl0IGlzIGhpZ2hseSBkZXNpcmFibGUKLXRvIGltcGxlbWVudCBvbi1kZW1hbmQgY29ubmVjdGlvbnMgaW4gb3JkZXIgdG8gbWluaW1pemUgbmV0d29yayBjaGFyZ2VzLiAgU28KLXVubGlrZSBhIHR5cGljYWwgbmV0d29yayBkcml2ZXIsIHRoZSBXQU4gZHJpdmVyIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgbXVsdGlwbGUKLW5ldHdvcmsgaW50ZXJmYWNlcyBhbmQgY29wZSBhcyBtdWx0aXBsZSB2aXJ0dWFsIGNpcmN1aXRzIGNvbWUgaW50byBleGlzdGVuY2UKLWFuZCBnbyBhd2F5IGR5bmFtaWNhbGx5LgotIAotTGFzdCwgYnV0IG5vdCBsZWFzdCwgV0FOIGNvbmZpZ3VyYXRpb24gaXMgbXVjaCBtb3JlIGNvbXBsZXggdGhhbiB0aGF0IG9mIHNheQotRXRoZXJuZXQgYW5kIG1heSB3ZWxsIGFtb3VudCB0byBzZXZlcmFsIGRvemVucyBvZiBwYXJhbWV0ZXJzLiAgU29tZSBvZiB0aGVtCi1hcmUgImxpbmstd2lkZSIgIHdoaWxlIG90aGVycyBhcmUgdmlydHVhbCBjaXJjdWl0LXNwZWNpZmljLiAgVGhlIHNhbWUgaG9sZHMKLXRydWUgZm9yIFdBTiBzdGF0aXN0aWNzIHdoaWNoIGlzIGJ5IGZhciBtb3JlIGV4dGVuc2l2ZSBhbmQgZXh0cmVtZWx5IHVzZWZ1bAotd2hlbiB0cm91Ymxlc2hvb3RpbmcgV0FOIGNvbm5lY3Rpb25zLiAgRXh0ZW5kaW5nIHRoZSBpZmNvbmZpZyB1dGlsaXR5IHRvIHN1aXQKLXRoZXNlIG5lZWRzIG1heSBiZSBwb3NzaWJsZSwgYnV0IGRvZXMgbm90IHNlZW0gcXVpdGUgcmVhc29uYWJsZS4gIFRoZXJlZm9yZSwgYQotV0FOIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSBhbmQgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBwcm9ncmFtbWVyJ3MgaW50ZXJmYWNlCi1pcyBuZWVkZWQgZm9yIHRoaXMgcHVycG9zZS4KLQotTW9zdCBvZiB0aGVzZSBwcm9ibGVtcyBhcmUgdGFrZW4gY2FyZSBvZiBieSB0aGlzIG1vZHVsZS4gIEl0cyBnb2FsIGlzIHRvCi1wcm92aWRlIGEgdXNlciB3aXRoIG1vcmUtb3ItbGVzcyBzdGFuZGFyZCBsb29rIGFuZCBmZWVsIGZvciBhbGwgV0FOIGRldmljZXMgYW5kCi1hc3Npc3QgYSBXQU4gZGV2aWNlIGRyaXZlciB3cml0ZXIgYnkgcHJvdmlkaW5nIGNvbW1vbiBzZXJ2aWNlcywgc3VjaCBhczoKLQotIG8gVXNlci1sZXZlbCBpbnRlcmZhY2UgdmlhIC9wcm9jIGZpbGUgc3lzdGVtCi0gbyBDZW50cmFsaXplZCBjb25maWd1cmF0aW9uCi0gbyBEZXZpY2UgbWFuYWdlbWVudCAoc2V0dXAsIHNodXRkb3duLCBldGMuKQotIG8gTmV0d29yayBpbnRlcmZhY2UgbWFuYWdlbWVudCAoZHluYW1pYyBjcmVhdGlvbi9kZXN0cnVjdGlvbikKLSBvIFByb3RvY29sIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbgotCi1UbyBiYSBhYmxlIHRvIHVzZSB0aGUgTGludXggV0FOIFJvdXRlciB5b3Ugd2lsbCBhbHNvIG5lZWQgYSBXQU4gVG9vbHMgcGFja2FnZQotYXZhaWxhYmxlIGZyb20KLQotCWZ0cC5zYW5nb21hLmNvbS9wdWIvbGludXgvY3VycmVudF93YW5waXBlL3dhbnBpcGUtWC5ZLloudGd6Ci0KLXdoZXJlIHZYLlkuWiByZXByZXNlbnQgdGhlIHdhbnBpcGUgdmVyc2lvbiBudW1iZXIuCi0KLUZvciB0ZWNobmljYWwgcXVlc3Rpb25zIGFuZC9vciBjb21tZW50cyBwbGVhc2UgZS1tYWlsIHRvIG5jb3JiaWNAc2FuZ29tYS5jb20uCi1Gb3IgZ2VuZXJhbCBpbnF1aXJpZXMgcGxlYXNlIGNvbnRhY3QgU2FuZ29tYSBUZWNobm9sb2dpZXMgSW5jLiBieQotCi0JSG90bGluZToJMS04MDAtMzg4LTI0NzUJKFVTQSBhbmQgQ2FuYWRhLCB0b2xsIGZyZWUpCi0JUGhvbmU6CQkoOTA1KSA0NzQtMTk5MCAgZXh0OiAxMDYKLQlGYXg6CQkoOTA1KSA0NzQtOTIyMwotCUUtbWFpbDoJCWRtQHNhbmdvbWEuY29tCShEYXZpZCBNYW5kZWxzdGFtKQotCVdXVzoJCWh0dHA6Ly93d3cuc2FuZ29tYS5jb20KLQotCi1JTlNUQUxMQVRJT04KLQotUGxlYXNlIHJlYWQgdGhlIFdhbnBpcGVGb3JMaW51eC5wZGYgbWFudWFsIG9uIGhvdyB0byAKLWluc3RhbGwgdGhlIFdBTlBJUEUgdG9vbHMgYW5kIGRyaXZlcnMgcHJvcGVybHkuIAotCi0KLUFmdGVyIGluc3RhbGxpbmcgd2FucGlwZSBwYWNrYWdlOiAvdXNyL2xvY2FsL3dhbnJvdXRlci9kb2MuIAotT24gdGhlIGZ0cC5zYW5nb21hLmNvbSA6IC9saW51eC9jdXJyZW50X3dhbnBpcGUvZG9jCi0KLQotQ09QWVJJR0hUIEFORCBMSUNFTlNJTkcgSU5GT1JNQVRJT04KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLUFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCi1GT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzCi1BdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotCi0KLUFDS05PV0xFREdFTUVOVFMKLQotVGhpcyBwcm9kdWN0IGlzIGJhc2VkIG9uIHRoZSBXQU5QSVBFKHRtKSBNdWx0aXByb3RvY29sIFdBTiBSb3V0ZXIgZGV2ZWxvcGVkCi1ieSBTYW5nb21hIFRlY2hub2xvZ2llcyBJbmMuIGZvciBMaW51eCAyLjAueCBhbmQgMi4yLnguICBTdWNjZXNzIG9mIHRoZSBXQU5QSVBFCi10b2dldGhlciB3aXRoIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Ugb2YgTGludXgga2VybmVsIGluIHN1bW1lciAxOTk2IGNvbW1hbmRlZAotYWRlcXVhdGUgY2hhbmdlcyB0byB0aGUgV0FOUElQRSBjb2RlIHRvIHRha2UgZnVsbCBhZHZhbnRhZ2Ugb2YgbmV3IExpbnV4Ci1mZWF0dXJlcy4KLQotSW5zdGVhZCBvZiBjb250aW51aW5nIGRldmVsb3BpbmcgcHJvcHJpZXRhcnkgaW50ZXJmYWNlIHRpZWQgdG8gU2FuZ29tYSBXQU4KLWNhcmRzLCB3ZSBkZWNpZGVkIHRvIHNlcGFyYXRlIGFsbCBoYXJkd2FyZS1pbmRlcGVuZGVudCBjb2RlIGludG8gYSBzZXBhcmF0ZQotbW9kdWxlIGFuZCBkZWZpbmVkIHR3byBsZXZlbHMgb2YgaW50ZXJmYWNlcyAtIG9uZSBmb3IgdXNlci1sZXZlbCBhcHBsaWNhdGlvbnMKLWFuZCBhbm90aGVyIGZvciBrZXJuZWwtbGV2ZWwgV0FOIGRyaXZlcnMuICBXQU5QSVBFIGlzIG5vdyBpbXBsZW1lbnRlZCBhcyBhCi1XQU4gZHJpdmVyIGNvbXBsaWFudCB3aXRoIHRoZSBXQU4gTGluayBEcml2ZXIgaW50ZXJmYWNlLiAgQWxzbyBhIGdlbmVyYWwKLXB1cnBvc2UgV0FOIGNvbmZpZ3VyYXRpb24gdXRpbGl0eSBhbmQgYSBzZXQgb2Ygc2hlbGwgc2NyaXB0cyB3YXMgZGV2ZWxvcGVkIHRvIAotc3VwcG9ydCBXQU4gcm91dGVyIGF0IHRoZSB1c2VyIGxldmVsLgotCi1NYW55IHVzZWZ1bCBpZGVhcyBjb25jZXJuaW5nIGhhcmR3YXJlLWluZGVwZW5kZW50IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgotd2VyZSBnaXZlbiBieSBNaWtlIE1jTGFnYW4gPG1pa2UubWNsYWdhbkBsaW51eC5vcmc+IGFuZCBoaXMgaW1wbGVtZW50YXRpb24KLW9mIHRoZSBGcmFtZSBSZWxheSByb3V0ZXIgYW5kIGRyaXZlcnMgZm9yIFNhbmdvbWEgY2FyZHMgKGRsY2kvc2RsYSkuCi0KLVdpdGggdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJcyBiZWluZyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgV0FOUElQRSwKLWEgc3BlY2lhbCB0aGFuayBnb2VzIHRvIEFsYW4gQ294IGluIHByb3ZpZGluZyBpbnNpZ2h0IGludG8gQlNEIHNvY2tldHMuCi0KLVNwZWNpYWwgdGhhbmtzIHRvIGFsbCB0aGUgV0FOUElQRSB1c2VycyB3aG8gcGVyZm9ybWVkIGZpZWxkLXRlc3RpbmcsIHJlcG9ydGVkCi1idWdzIGFuZCBtYWRlIHZhbHVhYmxlIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucyB0aGF0IGhlbHAgdXMgdG8gaW1wcm92ZSB0aGlzCi1wcm9kdWN0LgotCi0KLQotTkVXIElOIFRISVMgUkVMRUFTRQotCi0JbyBVcGRhdGVkIHRoZSBXQU5DRkcgdXRpbGl0eQotCQlDYWxscyB0aGUgcHBwY29uZmlnIHRvIGNvbmZpZ3VyZSB0aGUgUFBQRAotCQlmb3IgYXN5bmMgY29ubmVjdGlvbnMuCi0KLQlvIEFkZGVkIHRoZSBQUFBDT05GSUcgdXRpbGl0eQotCQlVc2VkIHRvIGNvbmZpZ3VyZSB0aGUgUFBQRCBkYW1lb24gZm9yIHRoZQotCQlXQU5QSVBFIEFzeW5jIFBQUCBhbmQgc3RhbmRhcmQgc2VyaWFsIHBvcnQuCi0JCVRoZSB3YW5jZmcgY2FsbHMgdGhlIHBwcGNvbmZpZyB0byBjb25maWd1cmUKLQkJdGhlIHBwcGQuCi0KLQlvIEZpeGVkIHRoZSBQQ0kgYXV0b2RldGVjdCBmZWF0dXJlLiAgCi0JCVRoZSBTTE9UIDAgd2FzIHVzZWQgYXMgYW4gYXV0b2RldGVjdCBvcHRpb24KLQkJaG93ZXZlciwgc29tZSBoaWdoIGVuZCBQQydzIHNsb3QgbnVtYmVycyBzdGFydAotCQlmcm9tIDAuIAotCi0JbyBUaGlzIHJlbGVhc2UgaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlIG5ldyBiYWNrdXBkCi0JICBkYWVtb24gcmVsZWFzZS4KLQkKLQotUFJPRFVDVCBDT01QT05FTlRTIEFORCBSRUxBVEVEIEZJTEVTCi0KLS9ldGM6IChvciB1c2VyIGRlZmluZWQpCi0Jd2FucGlwZTEuY29uZglkZWZhdWx0IHJvdXRlciBjb25maWd1cmF0aW9uIGZpbGUKLQotL2xpYi9tb2R1bGVzL1guWS5aL21pc2M6Ci0Jd2Fucm91dGVyLm8Jcm91dGVyIGtlcm5lbCBsb2FkYWJsZSBtb2R1bGUKLQlhZl93YW5waXBlLm8Jd2FucGlwZSBhcGkgc29ja2V0IG1vZHVsZQotCi0vbGliL21vZHVsZXMvWC5ZLlovbmV0OgotCXNkbGFkcnYubwlTYW5nb21hIFNETEEgc3VwcG9ydCBtb2R1bGUKLQl3YW5waXBlLm8JU2FuZ29tYSBXQU5QSVBFKHRtKSBkcml2ZXIgbW9kdWxlCi0KLS9wcm9jL25ldC93YW5yb3V0ZXIKLQlDb25maWcJCXJlYWRzIGN1cnJlbnQgcm91dGVyIGNvbmZpZ3VyYXRpb24KLQlTdGF0dXMJCXJlYWRzIGN1cnJlbnQgcm91dGVyIHN0YXR1cwotCXtuYW1lfQkJcmVhZHMgV0FOIGRyaXZlciBzdGF0aXN0aWNzCi0KLS91c3Ivc2JpbjoKLQl3YW5yb3V0ZXIJd2Fucm91dGVyIHN0YXJ0LXVwIHNjcmlwdAotCXdhbmNvbmZpZwl3YW5yb3V0ZXIgY29uZmlndXJhdGlvbiB1dGlsaXR5Ci0Jc2RsYWR1bXAJV0FOUElQRSBhZGFwdGVyIG1lbW9yeSBkdW1wIHV0aWxpdHkKLSAgICAgICAgZnBpcGVtb24gICAgICAgIE1vbml0b3IgZm9yIEZyYW1lIFJlbGF5Ci0gICAgICAgIGNwaXBlbW9uICAgICAgICBNb25pdG9yIGZvciBDaXNjbyBIRExDCi0JcHBpcGVtb24gCU1vbml0b3IgZm9yIFBQUAotCXhwaXBlbW9uIAlNb25pdG9yIGZvciBYMjUKLQl3cGtiZG1vbiAgICAgICAgV0FOUElQRSBrZXlib2FyZCBsZWQgbW9uaXRvci9kZWJ1Z2dlcgotCi0vdXNyL2xvY2FsL3dhbnJvdXRlcjoKLQlSRUFETUUJCXRoaXMgZmlsZQotCUNPUFlJTkcJCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0JU2V0dXAJCWluc3RhbGxhdGlvbiBzY3JpcHQKLQlGaWxlbGlzdAlkaXN0cmlidXRpb24gZGVmaW5pdGlvbiBmaWxlCi0Jd2Fucm91dGVyLnJjCW1ldGEtY29uZmlndXJhdGlvbiBmaWxlIAotCQkJKHVzZWQgYnkgdGhlIFNldHVwIGFuZCB3YW5yb3V0ZXIgc2NyaXB0KQotCi0vdXNyL2xvY2FsL3dhbnJvdXRlci9kb2M6Ci0Jd2FucGlwZUZvckxpbnV4LnBkZiAJV0FOIFJvdXRlciBVc2VyJ3MgTWFudWFsCi0KLS91c3IvbG9jYWwvd2Fucm91dGVyL3BhdGNoZXM6Ci0Jd2Fucm91dGVyLXYyMjEzLmd6ICAJcGF0Y2ggZm9yIExpbnV4IGtlcm5lbHMgMi4yLjExIHVwIHRvIDIuMi4xMy4KLQl3YW5yb3V0ZXItdjIyMTQuZ3oJcGF0Y2ggZm9yIExpbnV4IGtlcm5lbCAyLjIuMTQuIAotCXdhbnJvdXRlci12MjIxNS5neglwYXRjaCBmb3IgTGludXgga2VybmVscyAyLjIuMTUgdG8gMi4yLjE3LgotCXdhbnJvdXRlci12MjIxOC5neglwYXRjaCBmb3IgTGludXgga2VybmVscyAyLjIuMTggYW5kIHVwLgotCXdhbnJvdXRlci12MjQwLmd6CXBhdGNoIGZvciBMaW51eCBrZXJuZWwgMi40LjAuICAKLQl3YW5yb3V0ZXItdjI0Mi5neglwYXRjaCBmb3IgTGludXgga2VybmVsIDIuNC4yIGFuZCB1cC4KLQl3YW5yb3V0ZXItdjIwMzQuZ3oJcGF0Y2ggZm9yIExpbnV4IGtlcm5lbCAyLjAuMzQKLQl3YW5yb3V0ZXItdjIwMzYuZ3ogCXBhdGNoIGZvciBMaW51eCBrZXJuZWwgMi4wLjM2IGFuZCB1cC4gCi0KLS91c3IvbG9jYWwvd2Fucm91dGVyL3BhdGNoZXMva2RyaXZlcnM6Ci0JU291cmNlcyBvZiB0aGUgbGF0ZXN0IFdBTlBJUEUgZGV2aWNlIGRyaXZlcnMuCi0JVGhlc2UgYXJlIHVzZWQgdG8gVVBHUkFERSB0aGUgbGludXgga2VybmVsIHRvIHRoZSBuZXdlc3QKLQl2ZXJzaW9uIGlmIHRoZSBrZXJuZWwgc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gcGF0aGNlZCB3aXRoCi0JV0FOUElQRSBkcml2ZXJzLgotCi0vdXNyL2xvY2FsL3dhbnJvdXRlci9zYW1wbGVzOgotCWludGVyZmFjZQlzYW1wbGUgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gZmlsZQotCXdhbnBpcGUxLmNwcmkgCUNIRExDIHByaW1hcnkgcG9ydAotICAgICAJd2FucGlwZTIuY3NlYyAJQ0hETEMgc2Vjb25kYXJ5IHBvcnQKLSAgICAgCXdhbnBpcGUxLmZyICAgCUZyYW1lIFJlbGF5IHByb3RvY29sCi0gICAgIAl3YW5waXBlMS5wcHAgIAlQUFAgcHJvdG9jb2wgKSAKLQl3YW5waXBlMS5hc3kJQ0hETEMgQVNZTkMgcHJvdG9jb2wKLQl3YW5waXBlMS54MjUJWDI1IHByb3RvY29sCi0Jd2FucGlwZTEuc3R0eQlTeW5jIFRUWSBkcml2ZXIgKFVzZWQgYnkgS2VybmVsIFBQUEQgZGFlbW9uKQotCXdhbnBpcGUxLmF0dHkJQXN5bmMgVFRZIGRyaXZlciAoVXNlZCBieSBLZXJuZWwgUFBQRCBkYWVtb24pCi0Jd2Fucm91dGVyLnJjCXNhbXBsZSBtZXRhLWNvbmZpZ3VyYXRpb24gZmlsZQotCi0vdXNyL2xvY2FsL3dhbnJvdXRlci91dGlsOgotCSoJCXdhbi10b29scyB1dGlsaXRpZXMgc291cmNlIGNvZGUKLQotL3Vzci9sb2NhbC93YW5yb3V0ZXIvYXBpL3gyNToKLQkqCQl4MjUgYXBpIHNhbXBsZSBwcm9ncmFtcy4KLS91c3IvbG9jYWwvd2Fucm91dGVyL2FwaS9jaGRsYzoKLQkqCQljaGRsYyBhcGkgc2FtcGxlIHByb2dyYW1zLgotL3Vzci9sb2NhbC93YW5yb3V0ZXIvYXBpL2ZyOgotCSoJCWZyIGFwaSBzYW1wbGUgcHJvZ3JhbXMuCi0vdXNyL2xvY2FsL3dhbnJvdXRlci9jb25maWcvd2FuY2ZnOgotCXdhbmNmZwkJV0FOUElQRSBHVUkgY29uZmlndXJhdGlvbiBwcm9ncmFtLgotICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlcyB3YW5waXBlIy5jb25mIGZpbGVzLiAKLS91c3IvbG9jYWwvd2Fucm91dGVyL2NvbmZpZy9jZmdmdDE6Ci0JY2ZnZnQxCQlHVUkgQ1NVL0RTVSBjb25maWd1cmF0aW9uIHByb2dyYW0uCi0KLS91c3IvaW5jbHVkZS9saW51eDoKLQl3YW5yb3V0ZXIuaAlyb3V0ZXIgQVBJIGRlZmluaXRpb25zCi0Jd2FucGlwZS5oCVdBTlBJUEUgQVBJIGRlZmluaXRpb25zCi0Jc2RsYWRydi5oCVNETEEgc3VwcG9ydCBtb2R1bGUgQVBJIGRlZmluaXRpb25zCi0Jc2RsYXNmbS5oCVNETEEgZmlybXdhcmUgbW9kdWxlIGRlZmluaXRpb25zCi0JaWZfd2FucGlwZS5oCVdBTlBJUEUgU29ja2V0IGRlZmluaXRpb25zCi0JaWZfd2FucGlwZV9jb21tb24uaAlXQU5QSVBFIFNvY2tldC9Ecml2ZXIgY29tbW9uIGRlZmluaXRpb25zLgotCXNkbGFwY2kuaAlXQU5QSVBFIFBDSSBkZWZpbml0aW9ucwotCQotCi0vdXNyL3NyYy9saW51eC9uZXQvd2Fucm91dGVyOgotCSoJCXdhbnJvdXRlciBzb3VyY2UgY29kZQotCi0vdmFyL2xvZzoKLQl3YW5yb3V0ZXIJd2Fucm91dGVyIHN0YXJ0LXVwIGxvZyAoY3JlYXRlZCBieSB0aGUgU2V0dXAgc2NyaXB0KQotCi0vdmFyL2xvY2s6ICAob3IgL3Zhci9sb2NrL3N1YnN5cyBmb3IgUmVkSGF0KQotCXdhbnJvdXRlcgl3YW5yb3V0ZXIgbG9jayBmaWxlIChjcmVhdGVkIGJ5IHRoZSBTZXR1cCBzY3JpcHQpCi0KLS91c3IvbG9jYWwvd2Fucm91dGVyL2Zpcm13YXJlOgotCWZyNTE0LnNmbQlGcmFtZSByZWxheSBmaXJtd2FyZSBmb3IgU2FuZ29tYSBTNTA4L1M1MTQgY2FyZAotCWNkdWFsNTE0LnNmbQlEdWFsIFBvcnQgQ2lzY28gSERMQyBmaXJtd2FyZSBmb3IgU2FuZ29tYSBTNTA4L1M1MTQgY2FyZAotCXBwcDUxNC5zZm0gICAgICBQUFAgRmlybXdhcmUgZm9yIFNhbmdvbWEgUzUwOCBhbmQgUzUxNCBjYXJkcwotCXgyNV81MDguc2ZtCVgyNSBGaXJtd2FyZSBmb3IgU2FuZ29tYSBTNTA4IGNhcmQuCi0KLQotUkVWSVNJT04gSElTVE9SWQotCi0xLjAuMAlEZWNlbWJlciAzMSwgMTk5NglJbml0aWFsIHZlcnNpb24KLQotMS4wLjEJSmFudWFyeSAzMCwgMTk5NwlTdGF0dXMgYW5kIHN0YXRpc3RpY3MgY2FuIGJlIHJlYWQgdmlhIC9wcm9jCi0JCQkJZmlsZXN5c3RlbSBlbnRyaWVzLgotCi0xLjAuMiAgIEFwcmlsIDMwLCAxOTk3ICAgICAgICAgIEFkZGVkIFVEUCBtYW5hZ2VtZW50IHZpYSBtb25pdG9ycy4KLQotMS4wLjMJSnVuZSAzLCAxOTk3CQlVRFAgbWFuYWdlbWVudCBmb3IgbXVsdGlwbGUgYm9hcmRzIHVzaW5nIEZyYW1lCi0JCQkJUmVsYXkgYW5kIFBQUAotCQkJCUVuYWJsZWQgY29udGludW91cyB0cmFuc21pc3Npb24gb2YgQ29uZmlndXJlIAotCQkJCVJlcXVlc3QgUGFja2V0IGZvciBQUFAgKGZvciA1MDggb25seSkKLQkJCQlDb25uZWN0aW9uIFRpbWVvdXQgZm9yIFBQUCBjaGFuZ2VkIGZyb20gOTAwIHRvIDAKLQkJCQlGbG93IENvbnRyb2wgUHJvYmxlbSBmaXhlZCBmb3IgRnJhbWUgUmVsYXkKLQotMS4wLjQJSnVseSAxMCwgMTk5NwkJUzUwOC9GVDEgbW9uaXRvcmluZyBjYXBhYmlsaXR5IGluIGZwaXBlbW9uIGFuZAotCQkJCXBwaXBlbW9uIHV0aWxpdGllcy4KLQkJCQlDb25maWd1cmFibGUgVFRMIGZvciBVRFAgcGFja2V0cy4KLQkJCQlNdWx0aWNhc3QgYW5kIEJyb2FkY2FzdCBJUCBzb3VyY2UgYWRkcmVzc2VzIGFyZQotCQkJCXNpbGVudGx5IGRpc2NhcmRlZC4KLQotMS4wLjUJSnVseSAyOCwgMTk5NwkJQ29uZmlndXJhYmxlIFQzOTEsVDM5MixOMzkxLE4zOTIsTjM5MyBmb3IgRnJhbWUKLQkJCQlSZWxheSBpbiByb3V0ZXIuY29uZi4KLQkJCQlDb25maWd1cmFibGUgTWVtb3J5IEFkZHJlc3MgdGhyb3VnaCByb3V0ZXIuY29uZiAKLQkJCQlmb3IgRnJhbWUgUmVsYXksIFBQUCBhbmQgWC4yNS4gKGNvbW1lbnRpbmcgdGhpcwotIAkJCQlvdXQgZW5hYmxlcyBhdXRvLWRldGVjdGlvbikuCi0JCQkJRml4ZWQgZnJlZWluZyB1cCByZWNlaXZlZCBidWZmZXJzIHVzaW5nIGtmcmVlKCkKLSAJCQkJZm9yIEZyYW1lIFJlbGF5IGFuZCBYLjI1LgotCQkJCVByb3RlY3Qgc2RsYV9wZWVrKCkgYnkgY2FsbGluZyBzYXZlX2ZsYWdzKCksCi0JCQkJY2xpKCkgYW5kIHJlc3RvcmVfZmxhZ3MoKS4KLQkJCQlDaGFuZ2VkIG51bWJlciBvZiBUcmFjZSBlbGVtZW50cyBmcm9tIDMyIHRvIDIwCi0JCQkJQWRkZWQgRExDSSBzcGVjaWZpYyBkYXRhIG1vbml0b3JpbmcgaW4gRlBJUEVNT04uIAotMi4wLjAJTm92IDA3LCAxOTk3CQlJbXBsZW1lbnRlZCBwcm90ZWN0aW9uIG9mIFJBQ0UgY29uZGl0aW9ucyBieSAKLQkJCQljcml0aWNhbCBmbGFncyBmb3IgRlJBTUUgUkVMQVkgYW5kIFBQUC4KLQkJCQlETENJIExpc3QgaW50ZXJydXB0IG1vZGUgaW1wbGVtZW50ZWQuCi0JCQkJSVBYIHN1cHBvcnQgaW4gRlJBTUUgUkVMQVkgYW5kIFBQUC4KLQkJCQlJUFggU2VydmVyIFN1cHBvcnQgKE1BUlMpCi0JCQkJTW9yZSBkcml2ZXIgc3BlY2lmaWMgc3RhdHMgaW5jbHVkZWQgaW4gRlBJUEVNT04KLQkJCQlhbmQgUElQRU1PTi4KLQotMi4wLjEJTm92IDI4LCAxOTk3CQlCdWcgRml4ZXMgZm9yIHZlcnNpb24gMi4wLjAuCi0JCQkJUHJvdGVjdGlvbiBvZiAiZW5hYmxlX2lycSgpIiB3aGlsZSAKLQkJCQkiZGlzYWJsZV9pcnEoKSIgaGFzIGJlZW4gZW5hYmxlZCBmcm9tIGFueSBvdGhlcgotCQkJCXJvdXRpbmUgKGZvciBGcmFtZSBSZWxheSwgUFBQIGFuZCBYMjUpLgotCQkJCUFkZGVkIGFkZGl0aW9uYWwgU3RhdHMgZm9yIEZwaXBlbW9uIGFuZCBQcGlwZW1vbgotCQkJCUltcHJvdmVkIExvYWQgU2hhcmluZyBmb3IgbXVsdGlwbGUgYm9hcmRzCi0KLTIuMC4yCURlYyAwOSwgMTk5NwkJU3VwcG9ydCBmb3IgUEFQIGFuZCBDSEFQIGZvciBwcHAgaGFzIGJlZW4KLQkJCQlpbXBsZW1lbnRlZC4KLQotMi4wLjMJQXVnIDE1LCAxOTk4CQlOZXcgcmVsZWFzZSBzdXBwb3J0aW5nIENpc2NvIEhETEMsIENJUiBmb3IgRnJhbWUKLQkJCQlyZWxheSwgRHluYW1pYyBJUCBhc3NpZ25tZW50IGZvciBQUFAgYW5kIEludmVyc2UKLQkJCQlBcnAgc3VwcG9ydCBmb3IgRnJhbWUtcmVsYXkuICBNYW4gUGFnZXMgYXJlIAotCQkJCWluY2x1ZGVkIGZvciBiZXR0ZXIgc3VwcG9ydCBhbmQgYSBuZXcgdXRpbGl0eQotCQkJCWZvciBjb25maWd1cmluZyBGVDEgY2FyZHMuCi0KLTIuMC40CURlYyAwOSwgMTk5OAkgICAgICAgIER1YWwgUG9ydCBzdXBwb3J0IGZvciBDaXNjbyBIRExDLgotCQkJCVN1cHBvcnQgZm9yIEhETEMgKExBUEIpIEFQSS4KLQkJCQlTdXBwb3J0cyBCaVN5bmMgU3RyZWFtaW5nIGNvZGUgZm9yIFM1MDJFIAotCQkJCWFuZCBTNTAzIGNhcmRzLgotCQkJCVN1cHBvcnQgZm9yIFN0cmVhbWluZyBIRExDIEFQSS4KLQkJCQlQcm92aWRlcyBhIEJTRCBzb2NrZXQgaW50ZXJmYWNlIGZvciAKLQkJCQljcmVhdGluZyBhcHBsaWNhdGlvbnMgdXNpbmcgQmlTeW5jCi0gICAJCQkJc3RyZWFtaW5nLiAgICAgICAgCi0KLTIuMC41ICAgQXVnIDA0LCAxOTk5IAkJQ0hETEMgaW5pdGlhbGl6YXRpbiBidWcgZml4LgotCQkJCVBQUCBpbnRlcnJ1cHQgZHJpdmVuIGRyaXZlcjogCi0gIAkJCQlGaXggdG8gdGhlIFBQUCBsaW5lIGhhbmd1cCBwcm9ibGVtLgotCQkJCU5ldyBQUFAgZmlybXdhcmUKLQkJCQlBZGRlZCBjb21tZW50cyB0byB0aGUgc3RhcnR1cCBTWVNURU0gRVJST1IgbWVzc2FnZXMKLQkJCQlYcGlwZW1vbiBkZWJ1Z2dpbmcgYXBwbGljYXRpb24gZm9yIHRoZSBYMjUgcHJvdG9jb2wKLQkJCQlOZXcgVVNFUl9NQU5VQUwudHh0Ci0JCQkJRml4ZWQgdGhlIG9kZCBib3VuZGFyeSA0Ynl0ZSB3cml0ZXMgdG8gdGhlIGJvYXJkLgotCQkJCUJpU3luYyBTdHJlYW1pbmcgY29kZSBoYXMgYmVlbiB0YWtlbiBvdXQuICAKLQkJCQkgQXZhaWxhYmxlIGFzIGEgcGF0Y2guCi0JCQkJU3RyZWFtaW5nIEhETEMgQVBJIGhhcyBiZWVuIHRha2VuIG91dC4gIAotCQkJCSBBdmFpbGFibGUgYXMgYSBwYXRjaC4gICAgICAgICAgICAgICAgIAotCi0yLjAuNiAgIEF1ZyAxNywgMTk5OQkJSW5jcmVhc2VkIGRlYnVnZ2luZyBpbiBzdGF0dXAgc2NyaXB0cwotCQkJCUZpeGVkIGluc2FsbGF0aW9uIGJ1Z3MgZnJvbSAyLjAuNQotCQkJCUtlcm5lbCBwYXRjaCB3b3JrcyBmb3IgYm90aCAyLjIuMTAgYW5kIDIuMi4xMSBrZXJuZWxzLgotCQkJCVRoZXJlIGlzIG5vIGZ1bmN0aW9uYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgICAgICAgICAKLQotMi4wLjcgICBBdWcgMjYsIDE5OTkJCW8gIE1lcmdlZCBYMjVBUEkgY29kZSBpbnRvIFdBTlBJUEUuCi0JCQkJbyAgRml4ZWQgYSBtZW1lb3J5IGxlYWsgZm9yIFgyNUFQSQotCQkJCW8gIFVwZGF0ZWQgdGhlIFgyNUFQSSBjb2RlIGZvciAyLjIuWCBrZXJuZWxzLgotCQkJCW8gIEltcHJvdmVkIE5FTSBoYW5kbGluZy4gICAKLQotMi4xLjAJT2N0IDI1LCAxOTk5CQlvIE5ldyBjb2RlIGZvciBTNTE0IFBDSSBDYXJkCi0JCQkJbyBOZXcgQ0hETEMgYW5kIEZyYW1lIFJlbGF5IGRyaXZlcnMKLQkJCQlvIFBQUCBhbmQgWDI1IGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcmVsZWFzZSAgICAKLQotMi4xLjEJTm92IDMwLCAxOTk5CQlvIFBQUCBzdXBwb3J0IGZvciBTNTE0IFBDSSBDYXJkcwotCi0yLjEuMyAgIEFwciAwNiwgMjAwMAkJbyBTb2NrZXQgYmFzZWQgeDI1YXBpIAotCQkJCW8gU29ja2V0IGJhc2VkIGNoZGxjIGFwaQotCQkJCW8gU29ja2V0IGJhc2VkIGZyIGFwaQotCQkJCW8gRHVhbCBQb3J0IFJlY2VpdmUgb25seSBDSERMQyBzdXBwb3J0LgotCQkJCW8gQXN5bmNocm9ub3VzIENIRExDIHN1cHBvcnQgKFNlY29uZGFyeSBQb3J0KQotCQkJCW8gY2ZnZnQxIEdVSSBjc3UvZHN1IGNvbmZpZ3VyYXRvcgotCQkJCW8gd2FuY2ZnIEdVSSBjb25maWd1cmF0aW9uIGZpbGUgCi0JCQkJICBjb25maWd1cmF0b3IuCi0JCQkJbyBBcmNoaXRlY3R1YWwgZGlyZWN0b3J5IGNoYW5nZXMuCi0KLWJldGEtMi4xLjQgSnVsIDIwMDAJCW8gRHluYW1pYyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbjoKLQkJCQkJTmV0d29yayBpbnRlcmZhY2VzIHJlZmxlY3QgdGhlIHN0YXRlCi0JCQkJCW9mIHByb3RvY29sIGxheWVyLiAgSWYgdGhlIHByb3RvY29sIGJlY29tZXMKLQkJCQkJZGlzY29ubmVjdGVkLCBkcml2ZXIgd2lsbCBicmluZyBkb3duCi0JCQkJCXRoZSBpbnRlcmZhY2UuICBPbmNlIHRoZSBwcm90b2NvbCByZWNvbm5lY3RzCi0JCQkJCXRoZSBpbnRlcmZhY2Ugd2lsbCBiZSBicm91Z2h0IHVwLiAKLQkJCQkJCi0JCQkJCU5vdGU6IFRoaXMgb3B0aW9uIGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4KLQotCQkJCW8gRHluYW1pYyB3YW5yb3V0ZXIgc2V0dXAgdXNpbmcgJ3dhbmNvbmZpZyc6Ci0JCQkJCXdhbmNvbmZpZyB1dGlsaXR5IGNhbiBiZSB1c2VkIHRvCi0JCQkJCXNodXRkb3duLHJlc3RhcnQsc3RhcnQgb3IgcmVjb25maWd1cmUgCi0JCQkJCWEgdmlydHVhbCBjaXJjdWl0IGR5bmFtaWNhbGx5LgotCQkJCSAgICAgCi0JCQkJCUZyYW1lIFJlbGF5OiAgRWFjaCBETENJIGNhbiBiZTogCi0JCQkJCQkgICAgICBjcmVhdGVkLHN0b3BwZWQscmVzdGFydGVkIGFuZCByZWNvbmZpZ3VyZWQKLQkJCQkJCSAgICAgIGR5bmFtaWNhbGx5IHVzaW5nIHdhbmNvbmZpZy4KLQkJCQkJCi0JCQkJCQkgICAgICBleDogd2FuY29uZmlnIGNhcmQgd2FucGlwZTEgZGV2IHdwMV9mcjE2IHVwCi0JCQkJICAKLQkJCQlvIFdhbnJvdXRlciBzdGFydHVwIHZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnRzOgotCQkJCQl3YW5jb25maWcgYWxzbyBzdXBwb3J0cyB3YW5yb3V0ZXIgc3RhcnR1cCB2aWEgY29tbWFuZCBsaW5lCi0JCQkJCWFyZ3VtZW50cy4gIFRodXMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY3JlYXRlIGEgd2FucGlwZSMuY29uZgotCQkJCQljb25maWd1cmF0aW9uIGZpbGUuICAKLQotCQkJCW8gU29ja2V0IGJhc2VkIHgyNWFwaSB1cGRhdGUvYnVnIGZpeGVzLgotCQkJCQlBZGRlZCBzdXBwb3J0IGZvciBMQ04gbnVtYmVycyBncmVhdGVyIHRoYW4gMjU1LgotCQkJCQlPcHRpb24gdG8gcGFzcyB1cCBtb2RlbSBtZXNzYWdlcy4KLQkJCQkJUHJvdmlkZWQgYSBQQ0kgSVJRIGNoZWNrLCBzbyBhIHNpbmdsZSBTNTE0Ci0JCQkJCWNhcmQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgbm9uLXNoYXJpbmcgaW50ZXJydXB0LgotCi0JCQkJbyBGaXhlcyB0byB0aGUgd2FuY2ZnIHV0aWxpdHkuCi0JCQkJbyBOZXcgRlQxIGRlYnVnZ2luZyBzdXBwb3J0IHZpYSAqcGlwZW1vbiB1dGlsaXRpZXMuCi0JCQkJbyBGcmFtZSBSZWxheSBBUlAgc3VwcG9ydCBFbmFibGVkLgotCi1iZXRhMy0yLjEuNCBKdWwgMjAwMAkJbyBYMjUgTV9CSVQgUHJvYmxlbSBmaXguCi0JCQkJbyBBZGRlZCB0aGUgTXVsdGktUG9ydCBQUFAKLQkJCQkgIFVwZGF0ZWQgdXRpbGl0ZXMgZm9yIHRoZSBNdWx0aS1Qb3J0IFBQUC4KLQotMi4xLjQJQXV0IDIwMDAKLQkJCQlvIEluIFgyNUFQSToKLQkJCQkJTWF4aW11bSBwYWNrZXQgYW4gYXBwbGljYXRpb24gY2FuIHNlbmQKLQkJCQkJdG8gdGhlIGRyaXZlciBoYXMgYmVlbiBleHRlbmRlZCB0byA0MDk2IGJ5dGVzLgotCi0JCQkJCUZpeGVkIHRoZSB4MjUgc3RhcnR1cCBidWcuIEVuYWJsZSAKLQkJCQkJY29tbXVuaWNhdGlvbnMgb25seSBhZnRlciBhbGwgaW50ZXJmYWNlcwotCQkJCQljb21lIHVwLiAgSElHSCBTVkMvUFZDIGlzIHVzZWQgdG8gY2FsY3VsYXRlCi0JCQkJCXRoZSBudW1iZXIgb2YgY2hhbm5lbHMuCi0JCQkJCUVuYWJsZSBwcm90b2NvbCBvbmx5IGFmdGVyIGFsbCBpbnRlcmZhY2VzCi0JCQkJCWFyZSBlbmFibGVkLgotCi0JCQkJbyBBZGRlZCBhbiBleHRyYSBzdGF0ZSB0byB0aGUgRlQxIGNvbmZpZywga2VybmVsIG1vZHVsZS4KLQkJCQlvIFVwZGF0ZWQgdGhlIHBpcGVtb24gZGVidWdnZXJzLgotCi0JCQkJbyBCbG9ja2VkIHRoZSBNdWx0aS1Qb3J0IFBQUCBmcm9tIHJ1bm5pbmcgb24ga2VybmVscwotCQkJCSAgMi4yLjE2IG9yIGdyZWF0ZXIsIGR1ZSB0byBzeW5jcHBwIGtlcm5lbCBtb2R1bGUKLQkJCQkgIGNoYW5nZS4gCi0JICAKLWJldGExLTIuMS41IAlOb3YgMTUgMjAwMAotCQkJCW8gRml4ZWQgdGhlIE11bGl0UG9ydCBQUFAgU3VwcG9ydCBmb3Iga2VybmVscyAyLjIuMTYgYW5kIGFib3ZlLgotCQkJCSAgMi4yLlgga2VybmVscyBvbmx5Ci0KLQkJCQlvIFNlY3VyZWQgdGhlIGRyaXZlciBVRFAgZGVidWdnaW5nIGNhbGxzCi0JCQkJCS0gQWxsIGlsbGVnYWwgbmV0b3dyayBkZWJ1Z2dpbmcgY2FsbHMgYXJlIHJlcG9ydGVkIHRvCi0JCQkJCSAgdGhlIGxvZy4KLQkJCQkJLSBEZWZpbmVkIGEgc2V0IG9mIGFsbG93ZWQgY29tbWFuZHMsIGFsbCBvdGhlciBkZW5pZWQuCi0JCQkJCQotCQkJCW8gQ3BpcGVtb24KLQkJCQkJLSBBZGRlZCBzZXQgRlQxIGNvbW1hbmRzIHRvIHRoZSBjcGlwZW1vbi4gVGh1cyBDU1UvRFNVCi0JCQkJCSAgY29uZmlndXJhaXRvbiBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIGNwaXBlbW9uLgotCQkJCQkgIEFsbCBzeXN0ZW1zIHRoYXQgY2Fubm90IHJ1biBjZmdmdDEgR1VJIHV0aWxpdHkgc2hvdWxkCi0JCQkJCSAgdXNlIGNwaXBlbW9uIHRvIGNvbmZpZ3VyZSB0aGUgb24gYm9hcmQgQ1NVL0RTVS4KLQotCi0JCQkJbyBLZXlib2FyZCBMZWQgTW9uaXRvci9EZWJ1Z2dlcgotCQkJCQktIEEgbmV3IHV0aWx0eSAvdXNyL3NiaW4vd3BrYmRtb24gdXNlcyBrZXlib2FyZCBsZWRzCi0JCQkJCSAgdG8gY29udmV5IG9wZXJhdGluYWwgc3RhdGlzdGljIGluZm9ybWF0aW9uIG9mIHRoZSAKLQkJCQkJICBTYW5nb21hIFdBTlBJUEUgY2FyZHMuCi0JCQkJCU5VTV9MT0NLICAgID0gTGluZSBTdGF0ZSAgKE9uPWNvbm5lY3RlZCwgICAgT2ZmPWRpc2Nvbm5lY3RlZCkKLQkJCQkJQ0FQU19MT0NLICAgPSBUeCBkYXRhICAgICAoT249dHJhbnNtaXR0aW5nLCBPZmY9bm8gdHggZGF0YSkKLQkJCQkJU0NST0xMX0xPQ0sgPSBSeCBkYXRhICAgICAoT249cmVjZWl2aW5nLCAgICBPZmY9bm8gcnggZGF0YQotCQkJCQkKLQkJCQlvIEhhcmR3YXJlIHByb2JlIG9uIG1vZHVsZSBsb2FkIGFuZCBkeW5hbWljIGRldmljZSBhbGxvY2F0aW9uCi0JCQkJCS0gRHVyaW5nIFdBTlBJUEUgbW9kdWxlIGxvYWQsIGFsbCBTYW5nb21hIGNhcmRzIGFyZSBwcm9iZWQKLQkJCQkJICBhbmQgZm91bmQgaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBpbiB0aGUgL3Zhci9sb2cvbWVzc2FnZXMuCi0JCQkJCS0gSWYgbm8gY2FyZHMgYXJlIGZvdW5kLCB0aGUgbW9kdWxlIGxvYWQgZmFpbHMuCi0JCQkJCS0gQXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRldmljZXMgYXJlIGR5bmFtaWNhbGx5IGxvYWRlZCAKLQkJCQkJICBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIFNhbmdvbWEgY2FyZHMgZm91bmQuCi0KLQkJCQkJICBOb3RlOiBUaGUga2VybmVsIGNvbmZpZ3VyYWl0b24gb3B0aW9uIAotCQkJCQkJQ09ORklHX1dBTlBJUEVfQ0FSRFMgaGFzIGJlZW4gdGFrZW4gb3V0LgotCQkJCQkKLQkJCQlvIEZpeGVkIHRoZSBGcmFtZSBSZWxheSBhbmQgQ2hkbGMgbmV0d29yayBpbnRlcmZhY2VzIHNvIHRoZXkgYXJlCi0JCQkJICBjb21wYXRpYmxlIHdpdGggbGlicGNhcCBsaWJyYXJpZXMuICBNZWFuaW5nLCB0Y3BkdW1wLCBzbm9ydCwKLQkJCQkgIGV0aGVyZWFsLCBhbmQgYWxsIG90aGVyIHBhY2tldCBzbmlmZmVycyBhbmQgZGVidWdnZXJzIHdvcmsgb24KLQkJCQkgIGFsbCBXQU5QSVBFIG5ldG93cmsgaW50ZXJmYWNlcy4KLQkJCQkJLSBTZXQgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGVuY29kaW5nIHR5cGUgdG8gQVJQSFJEX1BQUC4KLQkJCQkJICBUaGlzIHRlbGwgdGhlIHNuaWZmZXJzIHRoYXQgZGF0YSBvYnRhaW5lZCBmcm9tIHRoZQotCQkJCQkgIG5ldHdvcmsgaW50ZXJmYWNlIGlzIGluIHB1cmUgSVAgZm9ybWF0LgotCQkJCSAgRml4IGZvciAyLjIuWCBrZXJuZWxzIG9ubHkuCi0JCQkJCi0JCQkJbyBUcnVlIGludGVyZmFjZSBlbmNvZGluZyBvcHRpb24gZm9yIEZyYW1lIFJlbGF5IGFuZCBDSERMQwotCQkJCQktIFRoZSBhYm92ZSBmaXggc2V0cyB0aGUgbmV0d29yayBpbnRlcmZhY2UgZW5jb2RpbmcKLQkJCQkJICB0eXBlIHRvIEFSUEhSRF9QUFAsIGhvd2V2ZXIgc29tZSBjdXN0b21lcnMgdXNlCi0JCQkJCSAgdGhlIGVuY29kaW5nIGludGVyZmFjZSB0eXBlIHRvIGRldGVybWluZSB0aGUKLQkJCQkJICBwcm90b2NvbCBydW5uaW5nLiAgVGhlcmVmb3JlLCB0aGUgVFVSRSBFTkNPRElORwotCQkJCQkgIG9wdGlvbiB3aWxsIHNldCB0aGUgaW50ZXJmYWNlIHR5cGUgYmFjayB0byB0aGUKLQkJCQkJICBvcmlnaW5hbCB2YWx1ZS4gIAotCi0JCQkJCSAgTk9URTogSWYgdGhpcyBvcHRpb24gaXMgdXNlZCB3aXRoIEZyYW1lIFJlbGF5IGFuZCBDSERMQwotCQkJCQkJbGlicGNhcCBsaWJyYXJ5IHN1cHBvcnQgd2lsbCBiZSBicm9rZW4uICAKLQkJCQkJCWkuZS4gdGNwZHVtcCB3aWxsIG5vdCB3b3JrLgotCQkJCQlGaXggZm9yIDIuMi54IEtlcm5lbHMgb25seS4KLQkJCQkJCQotCQkJCW8gRXRoZXJuZXQgQnJpZGdpbmQgb3ZlciBGcmFtZSBSZWxheQotCQkJCQktIFRoZSBGcmFtZSBSZWxheSBicmlkZ2luZyBoYXMgYmVlbiBkZXZlbG9wZWQgYnkgCi0JCQkJCSAgS3Jpc3RpYW4gSG9mZm1hbm4gYW5kIE1hcmsgV2VsbHMuICAKLQkJCQkJLSBUaGUgTGludXgga2VybmVsIGJyaWRnZSBpcyB1c2VkIHRvIHNlbmQgZXRoZXJuZXQgCi0JCQkJCSAgZGF0YSBvdmVyIHRoZSBmcmFtZSByZWxheSBsaW5rcy4KLQkJCQkJRm9yIDIuMi5YIEtlcm5lbHMgb25seS4KLQotCQkJCW8gQWRkZWQgZXh0ZW5zaXZlIDIuMC5YIHN1cHBvcnQuIE1vc3QgbmV3IGZlYXR1cmVzIG9mCi0JCQkJICAyLjEuNSBmb3IgcHJvdG9jb2xzIEZyYW1lIFJlbGF5LCBQUFAgYW5kIENIRExDIGFyZQotCQkJCSAgc3VwcG9ydGVkIHVuZGVyIDIuMC5YIGtlcm5lbHMuIAotCi1iZXRhMS0yLjIuMCAJRGVjIDMwIDIwMDAKLQkJCQlvIFVwZGF0ZWQgZHJpdmVycyBmb3IgMi40Llgga2VybmVscy4KLQkJCQlvIFVwZGF0ZWQgZHJpdmVycyBmb3IgU01QIHN1cHBvcnQuCi0JCQkJbyBYMjVBUEkgaXMgbm93IGFibGUgdG8gc2hhcmUgUENJIGludGVycnVwdHMuCi0JCQkJbyBUb29rIG91dCBhIGdlbmVyYWwgcG9sbGluZyByb3V0aW5lIHRoYXQgd2FzIHVzZWQKLQkJCQkgIG9ubHkgYnkgWDI1QVBJLiAKLQkJCQlvIEFkZGVkIGFwcHJvcHJpYXRlIGxvY2tzIHRvIHRoZSBkeW5hbWljIHJlY29uZmlndXJhdGlvbgotCQkJCSAgY29kZS4KLQkJCQlvIEZpeGVkIGEgYnVnIGluIHRoZSBrZXlib2FyZCBkZWJ1ZyBtb25pdG9yLgotCi1iZXRhMi0yLjIuMAlKYW4gOCAyMDAxCi0JCQkJbyBQYXRjaGVzIGZvciAyLjQuMCBrZXJuZWwKLQkJCQlvIFBhdGNoZXMgZm9yIDIuMi4xOCBrZXJuZWwKLQkJCQlvIE1pbm9yIHVwZGF0ZXMgdG8gUFBQIGFuZCBDSExEQyBkcml2ZXJzLgotCQkJCSAgTm90ZTogTm8gZnVuY3RpbmFsIGRpZmZlcmVuY2UuIAotCi1iZXRhMy0yLjIuOQlKYW4gMTAgMjAwMQotCQkJCW8gSSBtaXNzZWQgdGhlIDIuMi4xOCBrZXJuZWwgcGF0Y2hlcyBpbiBiZXRhMi0yLjIuMAotCQkJCSAgcmVsZWFzZS4gIFRoZXkgYXJlIGluY2x1ZGVkIGluIHRoaXMgcmVsZWFzZS4KLQotU3RhYmxlIFJlbGVhc2UKLTIuMi4wCQlGZWIgMDEgMjAwMQotCQkJCW8gQnVnIGZpeCBpbiB3YW5jZmcgR1VJIGNvbmZpZ3VyYXRvci4KLQkJCQkJVGhlIGVkaXQgZnVuY3Rpb24gZGlkbid0IHdvcmsgcHJvcGVybHkuCi0KLQotYmF0YTEtMi4yLjEJRmViIDA5IDIwMDEKLQkJCW8gV0FOUElQRSBUVFkgRHJpdmVyIGVtdWxhdGlvbi4gCi0JCQkgIFR3byBtb2RlcyBvZiBvcGVyYXRpb24gU3luYyBhbmQgQXN5bmMuCi0JCQkJU3luYzogVXNpbmcgdGhlIFBQUEQgZGFlbW9uLCBrZXJuZWwgU3luY1BQUCBsYXllcgotCQkJCSAgICAgIGFuZCB0aGUgV2FucGlwZSBzeW5jIFRUWSBkcml2ZXI6IGEgUFBQIHByb3RvY29sIAotCQkJCSAgICAgIGNvbm5lY3Rpb24gY2FuIGJlIGVzdGFibGlzaGVkIHZpYSBTYW5nb21hIGFkYXB0ZXIsIG92ZXIKLQkJCQkgICAgICBhIFQxIGxlYXNlZCBsaW5lLgotCQkJCi0JCQkJICAgICAgVGhlIDIuNC4wIGtlcm5lbCBQUFAgbGF5ZXIgc3VwcG9ydHMgTVVMVElMSU5LCi0JCQkJICAgICAgcHJvdG9jb2wsIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVuZGxlIGFueSBudW1iZXIgb2YgU2FuZ29tYQotCQkJCSAgICAgIGFkYXB0ZXJzIChUMSBsaW5lcykgaW50byBvbmUsIHVuZGVyIGEgc2luZ2xlIElQIGFkZHJlc3MuCi0JCQkJICAgICAgVGh1cywgZWZmaWNpZW50bHkgb2J0YWluaW5nIG11bHRpcGxlIFQxIHRocm91Z2hwdXQuIAotCi0JCQkJICAgICAgTk9URTogVGhlIHJlbW90ZSBzaWRlIG11c3QgYWxzbyBpbXBsZW1lbnQgTVVMVElMSU5LIFBQUAotCQkJCQkgICAgcHJvdG9jb2wuCi0KLQkJCQlBc3luYzpVc2luZyB0aGUgUFBQRCBkYWVtb24sIGtlcm5lbCBBc3luY1BQUCBsYXllcgotCQkJCSAgICAgIGFuZCB0aGUgV0FOUElQRSBhc3luYyBUVFkgZHJpdmVyOiBhIFBQUCBwcm90b2NvbAotCQkJCSAgICAgIGNvbm5lY3Rpb24gY2FuIGJlIGVzdGFibGlzaGVkIHZpYSBTYW5nb21hIGFkYXB0ZXIgYW5kCi0JCQkJICAgICAgYSBtb2RlbSwgb3ZlciBhIHRlbGVwaG9uZSBsaW5lLgotCi0JCQkJICAgICAgVGh1cywgdGhlIFdBTlBJUEUgYXN5bmMgVFRZIGRyaXZlciBzaW11bGF0ZXMgYSBzZXJpYWwKLQkJCQkgICAgICBUVFkgZHJpdmVyIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgdXNlZCB0byBpbnRlcmZhY2UgdGhlIAotCQkJCSAgICAgIE1PREVNIHRvIHRoZSBsaW51eCBrZXJuZWwuCi0JCQkJCi0JCQlvIFdBTlBJUEUgUFBQIEJhY2t1cCBVdGlsaXR5Ci0JCQkJVGhpcyB1dGlsaXR5IHdpbGwgbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlIFBQUCBUMSBsaW5lLgotCQkJCUluIGNhc2Ugb2YgZmFpbHVyZSwgYSBkaWFsIHVwIGNvbm5lY3Rpb24gd2lsbCBiZSBlc3RhYmxpc2hlZAotCQkJCXZpYSBwcHBkIGRhZW1vbiwgZXRoZXIgdmlhIGEgc2VyaWFsIHR0eSBkcml2ZXIgKHNlcmlhbCBwb3J0KSwgCi0JCQkJb3IgYSBXQU5QSVBFIGFzeW5jIFRUWSBkcml2ZXIgKGluIGNhc2Ugc2VyaWFsIHBvcnQgaXMgdW5hdmFpbGFibGUpLgotCQkJCQotCQkJCUZ1cnRoZXJtb3JlLCB3aGlsZSBpbiBkaWFsIHVwIG1vZGUsIHRoZSBwcmltYXJ5IFBQUCBUMSBsaW5rCi0JCQkJd2lsbCBiZSBtb25pdG9yZWQgZm9yIHNpZ25zIG9mIGxpZmUuICAKLQotCQkJCUlmIHRoZSBQUFAgVDEgbGluayBjb21lcyBiYWNrIHRvIGxpZmUsIHRoZSBkaWFsIHVwIGNvbm5lY3Rpb24KLQkJCQl3aWxsIGJlIHNodXRkb3duIGFuZCBUMSBsaW5lIHJlLWVzdGFibGlzaGVkLgotCQkJCi0KLQkJCW8gTmV3IFNldHVwIGluc3RhbGxhdGlvbiBzY3JpcHQuCi0JCQkJT3B0aW9uIHRvIFVQR1JBREUgZGV2aWNlIGRyaXZlcnMgaWYgdGhlIGtlcm5lbCBzb3VyY2UgaGFzCi0JCQkJYWxyZWFkeSBiZWVuIHBhdGNoZWQgd2l0aCBXQU5QSVBFLgotCi0JCQkJT3B0aW9uIHRvIENPTVBJTEUgV0FOUElQRSBtb2R1bGVzIGFnYWluc3QgdGhlIGN1cnJlbnRseSAKLQkJCQlydW5uaW5nIGtlcm5lbCwgdGh1cyBubyBuZWVkIGZvciBtYW51YWwga2VybmVsIGFuZCBtb2R1bGUKLQkJCQlyZS1jb21waWxhdGluLgotCQkJCi0JCQlvIFVwZGF0ZXMgYW5kIEJ1ZyBGaXhlcyB0byB3YW5jZmcgdXRpbGl0eS4KLQotYmF0YTItMi4yLjEJRmViIDIwIDIwMDEKLQotCQkJbyBCdWcgZml4ZXMgdG8gdGhlIENIRExDIGRldmljZSBkcml2ZXJzLgotCQkJCVRoZSBkcml2ZXIgaGFkIGNvbXBpbGF0aW9uIHByb2JsZW1zIHVuZGVyIGtlcm5lbHMKLQkJCQkyLjIuMTQgb3IgbG93ZXIuCi0KLQkJCW8gQnVnIGZpeGVzIHRvIHRoZSBTZXR1cCBpbnN0YWxsYXRpb24gc2NyaXB0LgotCQkJCVRoZSBkZXZpY2UgZHJpdmVycyBjb21waWxhdGlvbiBvcHRpb25zIGRpZG4ndCB3b3JrCi0JCQkJcHJvcGVybHkuCi0KLQkJCW8gVXBkYXRlIHRvIHRoZSB3cGJhY2t1cGQgZGFlbW9uLiAgCi0JCQkJT3B0aW1pemVkIHRoZSBjcm9zcy1vdmVyIHRpbWVzLCBiZXR3ZWVuIHRoZSBwcmltYXJ5Ci0JCQkJbGluayBhbmQgdGhlIGJhY2t1cCBkaWFsdXAuCi0KLWJldGEzLTIuMi4xCU1hciAwMiAyMDAxCi0JCQlvIFBhdGNoZXMgZm9yIDIuNC4yIGtlcm5lbC4KLQotCQkJbyBCdWcgZml4ZXMgdG8gdXRpbC8gbWFrZSBmaWxlcy4KLQkJCW8gQnVnIGZpeGVzIHRvIHRoZSBTZXR1cCBpbnN0YWxsYXRpb24gc2NyaXB0LgotCi0JCQlvIFRvb2sgb3V0IHRoZSBiYWNrdXBkIHN1cHBvcnQgYW5kIG1hZGUgaXQgaW50bwotCQkJICBhcyBzZXBhcmF0ZSBwYWNrYWdlLgotCQkJICAKLWJldGE0LTIuMi4xICAgICBNYXIgMTIgMjAwMQotCi0JCW8gRml4IHRvIHRoZSBGcmFtZSBSZWxheSBEZXZpY2UgZHJpdmVyLgotCQkJSVBTQUMgc2VuZHMgYSBwYWNrZXQgb2YgemVybyBsZW5ndGgKLQkJCWhlYWRlciB0byB0aGUgZnJhbWUgcmVsYXkgZHJpdmVyLiAgVGhlCi0JCQlkcml2ZXIgdHJpZXMgdG8gcHVzaCBpdHMgb3duIDIgYnl0ZSBoZWFkZXIKLQkJCWludG8gdGhlIHBhY2tldCwgd2hpY2ggY2F1c2VzIHRoZSBkcml2ZXIgdG8KLQkJCWNyYXNoLgotCi0JCW8gRml4IHRoZSBXQU5QSVBFIHJlLWNvbmZpZ3VyYXRpb24gY29kZS4KLQkJCUJ1ZyB3YXMgZm91bmQgYnkgdHJ5aW5nIHRvIHJ1biAgdGhlIGNmZ2Z0MSB3aGlsZSB0aGUKLQkJCWludGVyZmFjZSB3YXMgYWxyZWFkeSBydW5uaW5nLiAgCi0KLQkJbyBVcGRhdGVzIHRvIGNmZ2Z0MS4KLQkJCVdyaXRlcyBhIHdhbnBpcGUjLmNmZ2Z0MSBjb25maWd1cmF0aW9uIGZpbGUKLQkJCW9uY2UgdGhlIENTVS9EU1UgaXMgY29uZmlndXJlZC4gVGhpcyBmaWxlIGNhbgotCQkJaG9sZHMgdGhlIGN1cnJlbnQgQ1NVL0RTVSBjb25maWd1cmF0aW9uLgotCi0KLQotPj4+Pj4+IEVORCBPRiBSRUFETUUgPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8Ci0KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0IGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNTFjMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0CkBAIC0wLDAgKzEsNjMgQEAKK01hdGNoaW5nIG9mIFBDTUNJQSBkZXZpY2VzIHRvIGRyaXZlcnMgaXMgZG9uZSB1c2luZyBvbmUgb3IgbW9yZSBvZiB0aGUKK2ZvbGxvd2luZyBjcml0ZXJpYToKKworLSBtYW51ZmFjdG9yIElECistIGNhcmQgSUQKKy0gcHJvZHVjdCBJRCBzdHJpbmdzIF9hbmRfIGhhc2hlcyBvZiB0aGVzZSBzdHJpbmdzCistIGZ1bmN0aW9uIElECistIGRldmljZSBmdW5jdGlvbiAoYWN0dWFsIGFuZCBwc2V1ZG8pCisKK1lvdSBzaG91bGQgdXNlIHRoZSBoZWxwZXJzIGluIGluY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oIGZvciBnZW5lcmF0aW5nIHRoZQorc3RydWN0IHBjbWNpYV9kZXZpY2VfaWRbXSBlbnRyaWVzIHdoaWNoIG1hdGNoIGRldmljZXMgdG8gZHJpdmVycy4KKworSWYgeW91IHdhbnQgdG8gbWF0Y2ggcHJvZHVjdCBJRCBzdHJpbmdzLCB5b3UgYWxzbyBuZWVkIHRvIHBhc3MgdGhlIGNyYzMyCitoYXNoZXMgb2YgdGhlIHN0cmluZyB0byB0aGUgbWFjcm8sIGUuZy4gaWYgeW91IHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3QgSUQKK3N0cmluZyAxLCB5b3UgbmVlZCB0byB1c2UKKworUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgic29tZV9zdHJpbmciLCAweChoYXNoX29mX3NvbWVfc3RyaW5nKSksCisKK0lmIHRoZSBoYXNoIGlzIGluY29ycmVjdCwgdGhlIGtlcm5lbCB3aWxsIGluZm9ybSB5b3UgYWJvdXQgdGhpcyBpbiAiZG1lc2ciCit1cG9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiwgYW5kIHRlbGwgeW91IG9mIHRoZSBjb3JyZWN0IGhhc2guCisKK1lvdSBjYW4gZGV0ZXJtaW5lIHRoZSBoYXNoIG9mIHRoZSBwcm9kdWN0IElEIHN0cmluZ3MgYnkgY2F0dGluZyB0aGUgZmlsZQorIm1vZGFsaWFzIiBpbiB0aGUgc3lzZnMgZGlyZWN0b3J5IG9mIHRoZSBQQ01DSUEgZGV2aWNlLiBJdCBnZW5lcmF0ZXMgYSBzdHJpbmcKK2luIHRoZSBmb2xsb3dpbmcgZm9ybToKK3BjbWNpYTptMDE0OWNDMUFCZjA2cGZuMDBmbjAwcGE3MjVCODQyRHBiRjFFRkVFODRwYzA4NzdCNjI3cGQwMDAwMDAwMAorCitUaGUgaGV4IHZhbHVlIGFmdGVyICJwYSIgaXMgdGhlIGhhc2ggb2YgcHJvZHVjdCBJRCBzdHJpbmcgMSwgYWZ0ZXIgInBiIiBmb3IKK3N0cmluZyAyIGFuZCBzbyBvbi4KKworQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhpcyBzbWFsbCB0b29sIHRvIGRldGVybWluZSB0aGUgY3JjMzIgaGFzaC4KK3NpbXBseSBwYXNzIHRoZSBzdHJpbmcgeW91IHdhbnQgdG8gZXZhbHVhdGUgYXMgYXJndW1lbnQgdG8gdGhpcyBwcm9ncmFtLAorZS5nLgorJCAuL2NyYzMyaGFzaCAiRHVhbCBTcGVlZCIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogY3JjMzJoYXNoLmMgLSBkZXJpdmVkIGZyb20gbGludXgvbGliL2NyYzMyLmMsIEdOVSBHUEwgdjIgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3Vuc2lnbmVkIGludCBjcmMzMih1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBjcmMgPSAwOworCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKzsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWNyYyA9IChjcmMgPj4gMSkgXiAoKGNyYyAmIDEpID8gMHhlZGI4ODMyMCA6IDApOworCX0KKwlyZXR1cm4gY3JjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCWlmIChhcmdjICE9IDIpIHsKKwkJcHJpbnRmKCJubyBzdHJpbmcgcGFzc2VkIGFzIGFyZ3VtZW50XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXN1bHQgPSBjcmMzMihhcmd2WzFdLCBzdHJsZW4oYXJndlsxXSkpOworCXByaW50ZigiMHgleFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dCBiL0RvY3VtZW50YXRpb24vcGNtY2lhL2RyaXZlci1jaGFuZ2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNjYzYzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9wY21jaWEvZHJpdmVyLWNoYW5nZXMudHh0CkBAIC0wLDAgKzEsNTggQEAKK1RoaXMgZmlsZSBkZXRhaWxzIGNoYW5nZXMgaW4gMi42IHdoaWNoIGFmZmVjdCBQQ01DSUEgY2FyZCBkcml2ZXIgYXV0aG9yczoKKworKiBldmVudCBoYW5kbGVyIGluaXRpYWxpemF0aW9uIGluIHN0cnVjdCBwY21jaWFfZHJpdmVyIChhcyBvZiAyLjYuMTMpCisgICBUaGUgZXZlbnQgaGFuZGxlciBpcyBub3RpZmllZCBvZiBhbGwgZXZlbnRzLCBhbmQgbXVzdCBiZSBpbml0aWFsaXplZAorICAgYXMgdGhlIGV2ZW50KCkgY2FsbGJhY2sgaW4gdGhlIGRyaXZlcidzIHN0cnVjdCBwY21jaWFfZHJpdmVyLgorCisqIHBjbWNpYS92ZXJzaW9uLmggc2hvdWxkIG5vdCBiZSB1c2VkIChhcyBvZiAyLjYuMTMpCisgICBUaGlzIGZpbGUgd2lsbCBiZSByZW1vdmVkIGV2ZW50dWFsbHkuCisKKyogaW4ta2VybmVsIGRldmljZTwtPmRyaXZlciBtYXRjaGluZyAoYXMgb2YgMi42LjEzKQorICAgUENNQ0lBIGRldmljZXMgYW5kIHRoZWlyIGNvcnJlY3QgZHJpdmVycyBjYW4gbm93IGJlIG1hdGNoZWQgaW4KKyAgIGtlcm5lbHNwYWNlLiBTZWUgJ2RldmljZXRhYmxlLnR4dCcgZm9yIGRldGFpbHMuCisKKyogRGV2aWNlIG1vZGVsIGludGVncmF0aW9uIChhcyBvZiAyLjYuMTEpCisgICBBIHN0cnVjdCBwY21jaWFfZGV2aWNlIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZGV2aWNlIG1vZGVsIGNvcmUsCisgICBhbmQgY2FuIGJlIHVzZWQgKGUuZy4gZm9yIFNFVF9ORVRERVZfREVWKSBieSB1c2luZworICAgaGFuZGxlX3RvX2RldihjbGllbnRfaGFuZGxlX3QgKiBoYW5kbGUpLgorCisqIENvbnZlcnQgaW50ZXJuYWwgSS9PIHBvcnQgYWRkcmVzc2VzIHRvIHVuc2lnbmVkIGxvbmcgKGFzIG9mIDIuNi4xMSkKKyAgIGlvYWRkcl90IHNob3VsZCBiZSByZXBsYWNlZCBieSBraW9fYWRkcl90IGluIFBDTUNJQSBjYXJkIGRyaXZlcnMuCisKKyogaXJxX21hc2sgYW5kIGlycV9saXN0IHBhcmFtZXRlcnMgKGFzIG9mIDIuNi4xMSkKKyAgIFRoZSBpcnFfbWFzayBhbmQgaXJxX2xpc3QgcGFyYW1ldGVycyBzaG91bGQgbm8gbG9uZ2VyIGJlIHVzZWQgaW4KKyAgIFBDTUNJQSBjYXJkIGRyaXZlcnMuIEluc3RlYWQsIGl0IGlzIHRoZSBqb2Igb2YgdGhlIFBDTUNJQSBjb3JlIHRvCisgICBkZXRlcm1pbmUgd2hpY2ggSVJRIHNob3VsZCBiZSB1c2VkLiBUaGVyZWZvcmUsIGxpbmstPmlycS5JUlFJbmZvMgorICAgaXMgaWdub3JlZC4KKworKiBjbGllbnQtPlBlbmRpbmdFdmVudHMgaXMgZ29uZSAoYXMgb2YgMi42LjExKQorICAgY2xpZW50LT5QZW5kaW5nRXZlbnRzIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuCisKKyogY2xpZW50LT5BdHRyaWJ1dGVzIGFyZSBnb25lIChhcyBvZiAyLjYuMTEpCisgICBjbGllbnQtPkF0dHJpYnV0ZXMgaXMgdW51c2VkLCB0aGVyZWZvcmUgaXQgaXMgcmVtb3ZlZCBmcm9tIGFsbAorICAgUENNQ0lBIGNhcmQgZHJpdmVycworCisqIGNvcmUgZnVuY3Rpb25zIG5vIGxvbmdlciBhdmFpbGFibGUgKGFzIG9mIDIuNi4xMSkKKyAgIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCBzb3VyY2UKKyAgIGJlY2F1c2UgdGhleSBhcmUgdW51c2VkIGJ5IGFsbCBpbi1rZXJuZWwgZHJpdmVycywgYW5kIG5vIGV4dGVybmFsCisgICBkcml2ZXIgd2FzIHJlcG9ydGVkIHRvIHJlbHkgb24gdGhlbToKKwlwY21jaWFfZ2V0X2ZpcnN0X3JlZ2lvbigpCisJcGNtY2lhX2dldF9uZXh0X3JlZ2lvbigpCisJcGNtY2lhX21vZGlmeV93aW5kb3coKQorCXBjbWNpYV9zZXRfZXZlbnRfbWFzaygpCisJcGNtY2lhX2dldF9maXJzdF93aW5kb3coKQorCXBjbWNpYV9nZXRfbmV4dF93aW5kb3coKQorCisqIGRldmljZSBsaXN0IGl0ZXJhdGlvbiB1cG9uIG1vZHVsZSByZW1vdmFsIChhcyBvZiAyLjYuMTApCisgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGl0ZXJhdGUgb24gdGhlIGRyaXZlcidzIGludGVybmFsCisgICBjbGllbnQgbGlzdCBhbmQgY2FsbCB0aGUgLT5kZXRhY2goKSBmdW5jdGlvbiB1cG9uIG1vZHVsZSByZW1vdmFsLgorCisqIFJlc291cmNlIG1hbmFnZW1lbnQuIChhcyBvZiAyLjYuOCkKKyAgIEFsdGhvdWdoIHRoZSBQQ01DSUEgc3Vic3lzdGVtIHdpbGwgYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBjYXJkcywKKyAgIGl0IG5vIGxvbmdlciBtYXJrcyB0aGVzZSByZXNvdXJjZXMgYnVzeS4gVGhpcyBtZWFucyB0aGF0IGRyaXZlcgorICAgYXV0aG9ycyBhcmUgbm93IHJlc3BvbnNpYmxlIGZvciBjbGFpbWluZyB5b3VyIHJlc291cmNlcyBhcyBwZXIKKyAgIG90aGVyIGRyaXZlcnMgaW4gTGludXguIFlvdSBzaG91bGQgdXNlIHJlcXVlc3RfcmVnaW9uKCkgdG8gbWFyaworICAgeW91ciBJTyByZWdpb25zIGluLXVzZSwgYW5kIHJlcXVlc3RfbWVtX3JlZ2lvbigpIHRvIG1hcmsgeW91cgorICAgbWVtb3J5IHJlZ2lvbnMgaW4tdXNlLiBUaGUgbmFtZSBhcmd1bWVudCBzaG91bGQgYmUgYSBwb2ludGVyIHRvCisgICB5b3VyIGRyaXZlciBuYW1lLiBFZywgZm9yIHBjbmV0X2NzLCBuYW1lIHNob3VsZCBwb2ludCB0byB0aGUKKyAgIHN0cmluZyAicGNuZXRfY3MiLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9rZXJuZWxfdGhyZWFkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dAppbmRleCA2MGI1NDgxLi5mYjU3Nzg0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2tlcm5lbF90aHJlYWRzLnR4dApAQCAtMTIsOCArMTIsNyBAQAogCWRvIHsKIAkJaHViX2V2ZW50cygpOwogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoa2h1YmRfd2FpdCwgIWxpc3RfZW1wdHkoJmh1Yl9ldmVudF9saXN0KSk7Ci0JCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJfSB3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKTsKIAogZnJvbSBkcml2ZXJzL3VzYi9jb3JlL2h1Yi5jOjpodWJfdGhyZWFkKCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvcGNpLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcGNpLnR4dAppbmRleCAzNWIxYTdkLi42ZmM5ZDUxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3BjaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9wY2kudHh0CkBAIC0yOTEsNiArMjkxLDQ0IEBACiBwY2lfZW5hYmxlX3dha2UgKG9uZSBmb3IgYm90aCBEM2hvdCBhbmQgRDNjb2xkKS4KIAogCitBIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLnN1c3BlbmQoKQoreworCS8qIGRyaXZlciBzcGVjaWZpYyBvcGVyYXRpb25zICovCisKKwkvKiBEaXNhYmxlIElSUSAqLworCWZyZWVfaXJxKCk7CisJLyogSWYgdXNpbmcgTVNJICovCisJcGNpX2Rpc2FibGVfbXNpKCk7CisKKwlwY2lfc2F2ZV9zdGF0ZSgpOworCXBjaV9lbmFibGVfd2FrZSgpOworCS8qIERpc2FibGUgSU8vYnVzIG1hc3Rlci9pcnEgcm91dGVyICovCisJcGNpX2Rpc2FibGVfZGV2aWNlKCk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2lfY2hvb3NlX3N0YXRlKCkpOworfQorCisucmVzdW1lKCkKK3sKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUoKTsKKwkvKiBkZXZpY2UncyBpcnEgcG9zc2libHkgaXMgY2hhbmdlZCwgZHJpdmVyIHNob3VsZCB0YWtlIGNhcmUgKi8KKwlwY2lfZW5hYmxlX2RldmljZSgpOworCXBjaV9zZXRfbWFzdGVyKCk7CisKKwkvKiBpZiB1c2luZyBNU0ksIGRldmljZSdzIHZlY3RvciBwb3NzaWJseSBpcyBjaGFuZ2VkICovCisJcGNpX2VuYWJsZV9tc2koKTsKKworCXJlcXVlc3RfaXJxKCk7CisJLyogZHJpdmVyIHNwZWNpZmljIG9wZXJhdGlvbnM7ICovCit9CisKK1RoaXMgaXMgYSB0eXBpY2FsIGltcGxlbWVudGF0aW9uLiBEcml2ZXJzIGNhbiBzbGlnaHRseSBjaGFuZ2UgdGhlIG9yZGVyCitvZiB0aGUgb3BlcmF0aW9ucyBpbiB0aGUgaW1wbGVtZW50YXRpb24sIGlnbm9yZSBzb21lIG9wZXJhdGlvbnMgb3IgYWRkCittb3JlIGRlcml2ZXIgc3BlY2lmaWMgb3BlcmF0aW9ucyBpbiBpdCwgYnV0IGRyaXZlcnMgc2hvdWxkIGRvIHNvbWV0aGluZyBsaWtlCit0aGlzIG9uIHRoZSB3aG9sZS4KKwogNS4gUmVzb3VyY2VzCiB+fn5+fn5+fn5+fn4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CmluZGV4IGM3YzM0NTkuLjdhNmI3ODkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKQEAgLTE2NCwxMSArMTY0LDExIEBACiBzaG91bGQgYmUgaGVsZCBhdCB0aGF0IHBvaW50IGFuZCBpdCBtdXN0IGJlIHNhZmUgdG8gc2xlZXAgdGhlcmUpLCBhbmQKIGFkZDoKIAotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQotICAgICAgICAgICAgICAgICAgICByZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKyAgICAgICB0cnlfdG9fZnJlZXplKCk7CiAKIElmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCi1pbnN0ZWFkIHNldCB0aGUgUEZfTk9GUkVFWkUgcHJvY2VzcyBmbGFnIHdoZW4gY3JlYXRpbmcgdGhlIHRocmVhZC4KK2luc3RlYWQgc2V0IHRoZSBQRl9OT0ZSRUVaRSBwcm9jZXNzIGZsYWcgd2hlbiBjcmVhdGluZyB0aGUgdGhyZWFkIChhbmQKK2JlIHZlcnkgY2FyZWZ1bGwpLgogCiAKIFE6IFdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiZXR3ZWVuICJwbGF0Zm9ybSIsICJzaHV0ZG93biIgYW5kCkBAIC0yMzMsMyArMjMzLDgxIEBACiBjYXQgYGNhdCAvcHJvYy9bMC05XSovbWFwcyB8IGdyZXAgLyB8IHNlZCAnczouKiAvOi86JyB8IHNvcnQgLXVgID4gL2Rldi9udWxsCiAKIGFmdGVyIHJlc3VtZS4gc3dhcG9mZiAtYTsgc3dhcG9uIC1hIG1heSBhbHNvIGJlIHVzZWZ1bGwuCisKK1E6IFdoYXQgaGFwcGVucyB0byBkZXZpY2VzIGR1cmluZyBzd3N1c3A/IFRoZXkgc2VlbSB0byBiZSByZXN1bWVkCitkdXJpbmcgc3lzdGVtIHN1c3BlbmQ/CisKK0E6IFRoYXQncyBjb3JyZWN0LiBXZSBuZWVkIHRvIHJlc3VtZSB0aGVtIGlmIHdlIHdhbnQgdG8gd3JpdGUgaW1hZ2UgdG8KK2Rpc2suIFdob2xlIHNlcXVlbmNlIGdvZXMgbGlrZQorCisgICAgICBTdXNwZW5kIHBhcnQKKyAgICAgIH5+fn5+fn5+fn5+fgorICAgICAgcnVubmluZyBzeXN0ZW0sIHVzZXIgYXNrcyBmb3Igc3VzcGVuZC10by1kaXNrCisKKyAgICAgIHVzZXIgcHJvY2Vzc2VzIGFyZSBzdG9wcGVkCisKKyAgICAgIHN1c3BlbmQoUE1TR19GUkVFWkUpOiBkZXZpY2VzIGFyZSBmcm96ZW4gc28gdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZQorICAgICAgCQkgICAgICB3aXRoIHN0YXRlIHNuYXBzaG90CisKKyAgICAgIHN0YXRlIHNuYXBzaG90OiBjb3B5IG9mIHdob2xlIHVzZWQgbWVtb3J5IGlzIHRha2VuIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorCisgICAgICByZXN1bWUoKTogZGV2aWNlcyBhcmUgd29rZW4gdXAgc28gdGhhdCB3ZSBjYW4gd3JpdGUgaW1hZ2UgdG8gc3dhcAorCisgICAgICB3cml0ZSBpbWFnZSB0byBzd2FwCisKKyAgICAgIHN1c3BlbmQoUE1TR19TVVNQRU5EKTogc3VzcGVuZCBkZXZpY2VzIHNvIHRoYXQgd2UgY2FuIHBvd2VyIG9mZgorCisgICAgICB0dXJuIHRoZSBwb3dlciBvZmYKKworICAgICAgUmVzdW1lIHBhcnQKKyAgICAgIH5+fn5+fn5+fn5+CisgICAgICAoaXMgYWN0dWFsbHkgcHJldHR5IHNpbWlsYXIpCisKKyAgICAgIHJ1bm5pbmcgc3lzdGVtLCB1c2VyIGFza3MgZm9yIHN1c3BlbmQtdG8tZGlzaworCisgICAgICB1c2VyIHByb2Nlc3NlcyBhcmUgc3RvcHBlZCAoaW4gY29tbW9uIGNhc2UgdGhlcmUgYXJlIG5vbmUsIGJ1dCB3aXRoIHJlc3VtZS1mcm9tLWluaXRyZCwgbm9vbmUga25vd3MpCisKKyAgICAgIHJlYWQgaW1hZ2UgZnJvbSBkaXNrCisKKyAgICAgIHN1c3BlbmQoUE1TR19GUkVFWkUpOiBkZXZpY2VzIGFyZSBmcm96ZW4gc28gdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZQorICAgICAgCQkgICAgICB3aXRoIGltYWdlIHJlc3RvcmF0aW9uCisKKyAgICAgIGltYWdlIHJlc3RvcmF0aW9uOiByZXdyaXRlIG1lbW9yeSB3aXRoIGltYWdlCisKKyAgICAgIHJlc3VtZSgpOiBkZXZpY2VzIGFyZSB3b2tlbiB1cCBzbyB0aGF0IHN5c3RlbSBjYW4gY29udGludWUKKworICAgICAgdGhhdyBhbGwgdXNlciBwcm9jZXNzZXMKKworUTogV2hhdCBpcyB0aGlzICdFbmNyeXB0IHN1c3BlbmQgaW1hZ2UnIGZvcj8KKworQTogRmlyc3Qgb2YgYWxsOiBpdCBpcyBub3QgYSByZXBsYWNlbWVudCBmb3IgZG0tY3J5cHQgZW5jcnlwdGVkIHN3YXAuCitJdCBjYW5ub3QgcHJvdGVjdCB5b3VyIGNvbXB1dGVyIHdoaWxlIGl0IGlzIHN1c3BlbmRlZC4gSW5zdGVhZCBpdCBkb2VzCitwcm90ZWN0IGZyb20gbGVha2luZyBzZW5zaXRpdmUgZGF0YSBhZnRlciByZXN1bWUgZnJvbSBzdXNwZW5kLgorCitUaGluayBvZiB0aGUgZm9sbG93aW5nOiB5b3Ugc3VzcGVuZCB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nCit0aGF0IGtlZXBzIHNlbnNpdGl2ZSBkYXRhIGluIG1lbW9yeS4gVGhlIGFwcGxpY2F0aW9uIGl0c2VsZiBwcmV2ZW50cwordGhlIGRhdGEgZnJvbSBiZWluZyBzd2FwcGVkIG91dC4gU3VzcGVuZCwgaG93ZXZlciwgbXVzdCB3cml0ZSB0aGVzZQorZGF0YSB0byBzd2FwIHRvIGJlIGFibGUgdG8gcmVzdW1lIGxhdGVyIG9uLiBXaXRob3V0IHN1c3BlbmQgZW5jcnlwdGlvbgoreW91ciBzZW5zaXRpdmUgZGF0YSBhcmUgdGhlbiBzdG9yZWQgaW4gcGxhaW50ZXh0IG9uIGRpc2suICBUaGlzIG1lYW5zCit0aGF0IGFmdGVyIHJlc3VtZSB5b3VyIHNlbnNpdGl2ZSBkYXRhIGFyZSBhY2Nlc3NpYmxlIHRvIGFsbAorYXBwbGljYXRpb25zIGhhdmluZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzd2FwIGRldmljZSB3aGljaCB3YXMgdXNlZAorZm9yIHN1c3BlbmQuIElmIHlvdSBkb24ndCBuZWVkIHN3YXAgYWZ0ZXIgcmVzdW1lIHRoZXNlIGRhdGEgY2FuIHJlbWFpbgorb24gZGlzayB2aXJ0dWFsbHkgZm9yZXZlci4gVGh1cyBpdCBjYW4gaGFwcGVuIHRoYXQgeW91ciBzeXN0ZW0gZ2V0cworYnJva2VuIGluIHdlZWtzIGxhdGVyIGFuZCBzZW5zaXRpdmUgZGF0YSB3aGljaCB5b3UgdGhvdWdodCB3ZXJlCitlbmNyeXB0ZWQgYW5kIHByb3RlY3RlZCBhcmUgcmV0cmlldmVkIGFuZCBzdG9sZW4gZnJvbSB0aGUgc3dhcCBkZXZpY2UuCitUbyBwcmV2ZW50IHRoaXMgc2l0dWF0aW9uIHlvdSBzaG91bGQgdXNlICdFbmNyeXB0IHN1c3BlbmQgaW1hZ2UnLgorCitEdXJpbmcgc3VzcGVuZCBhIHRlbXBvcmFyeSBrZXkgaXMgY3JlYXRlZCBhbmQgdGhpcyBrZXkgaXMgdXNlZCB0bworZW5jcnlwdCB0aGUgZGF0YSB3cml0dGVuIHRvIGRpc2suIFdoZW4sIGR1cmluZyByZXN1bWUsIHRoZSBkYXRhIHdhcworcmVhZCBiYWNrIGludG8gbWVtb3J5IHRoZSB0ZW1wb3Jhcnkga2V5IGlzIGRlc3Ryb3llZCB3aGljaCBzaW1wbHkKK21lYW5zIHRoYXQgYWxsIGRhdGEgd3JpdHRlbiB0byBkaXNrIGR1cmluZyBzdXNwZW5kIGFyZSB0aGVuCitpbmFjY2Vzc2libGUgc28gdGhleSBjYW4ndCBiZSBzdG9sZW4gbGF0ZXIgb24uICBUaGUgb25seSB0aGluZyB0aGF0Cit5b3UgbXVzdCB0aGVuIHRha2UgY2FyZSBvZiBpcyB0aGF0IHlvdSBjYWxsICdta3N3YXAnIGZvciB0aGUgc3dhcAorcGFydGl0aW9uIHVzZWQgZm9yIHN1c3BlbmQgYXMgZWFybHkgYXMgcG9zc2libGUgZHVyaW5nIHJlZ3VsYXIKK2Jvb3QuIFRoaXMgYXNzZXJ0cyB0aGF0IGFueSB0ZW1wb3Jhcnkga2V5IGZyb20gYW4gb29wc2VkIHN1c3BlbmQgb3IKK2Zyb20gYSBmYWlsZWQgb3IgYWJvcnRlZCByZXN1bWUgaXMgZXJhc2VkIGZyb20gdGhlIHN3YXAgZGV2aWNlLgorCitBcyBhIHJ1bGUgb2YgdGh1bWIgdXNlIGVuY3J5cHRlZCBzd2FwIHRvIHByb3RlY3QgeW91ciBkYXRhIHdoaWxlIHlvdXIKK3N5c3RlbSBpcyBzaHV0IGRvd24gb3Igc3VzcGVuZGVkLiBBZGRpdGlvbmFsbHkgdXNlIHRoZSBlbmNyeXB0ZWQKK3N1c3BlbmQgaW1hZ2UgdG8gcHJldmVudCBzZW5zaXRpdmUgZGF0YSBmcm9tIGJlaW5nIHN0b2xlbiBhZnRlcgorcmVzdW1lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAppbmRleCA2ODczNDM1Li43YTRhNTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvLnR4dApAQCAtODMsOCArODMsMTAgQEAKIENvbXBhcSBFdm8gTjYyMGMJCXZnYT1ub3JtYWwsIHMzX2Jpb3MgKDIpCiBEZWxsIDYwMG0sIEFUSSBSMjUwIExmCQlub25lICgxKSwgYnV0IG5lZWRzIHhvcmcteDExLTYuOC4xLjkwMi0xCiBEZWxsIEQ2MDAsIEFUSSBSVjI1MCAgICAgICAgICAgIHZnYT1ub3JtYWwgYW5kIFgsIG9yIHRyeSB2YmVzdGF0ZSAoNikKK0RlbGwgRDYxMAkJCXZnYT1ub3JtYWwgYW5kIFggKHBvc3NpYmx5IHZiZXN0YXRlICg2KSB0b28sIGJ1dCBub3QgdGVzdGVkKQogRGVsbCBJbnNwaXJvbiA0MDAwCQk/Pz8gKCopCiBEZWxsIEluc3Bpcm9uIDUwMG0JCT8/PyAoKikKK0RlbGwgSW5zcGlyb24gNTEwbQkJPz8/CiBEZWxsIEluc3Bpcm9uIDYwMG0JCT8/PyAoKikKIERlbGwgSW5zcGlyb24gODIwMAkJPz8/ICgqKQogRGVsbCBJbnNwaXJvbiA4NTAwCQk/Pz8gKCopCkBAIC0xMTUsNiArMTE3LDcgQEAKIE1lZGlvbiBNRDQyMjAJCQk/Pz8gKCopCiBTYW1zdW5nIFAzNQkJCXZiZXRvb2wgbmVlZGVkICg2KQogU2hhcnAgUEMtQVIxMCAoQVRJIHJhZ2UpCW5vbmUgKDEpCitTb255IFZhaW8gUENHLUMxVlJYL0sJCXMzX2Jpb3MgKDIpCiBTb255IFZhaW8gUENHLUY0MDMJCT8/PyAoKikKIFNvbnkgVmFpbyBQQ0ctTjUwNVNOCQk/Pz8gKCopCiBTb255IFZhaW8gdmduLXMyNjAJCVggb3IgYm9vdC1yYWRlb24gY2FuIGluaXQgaXQgKDUpCkBAIC0xMjMsNiArMTI2LDcgQEAKIFRvc2hpYmEgU2F0ZWxsaXRlIDQwODBYQ0RUICAgICAgczNfbW9kZSAoMykKIFRvc2hpYmEgU2F0ZWxsaXRlIDQwOTBYQ0RUICAgICAgPz8/ICgqKQogVG9zaGliYSBTYXRlbGxpdGUgUDEwLTU1NCAgICAgICBzM19iaW9zLHMzX21vZGUgKDQpKCoqKiopCitUb3NoaWJhIE0zMCAgICAgICAgICAgICAgICAgICAgICgyKSB4b3IgWCB3aXRoIG52aWRpYSBkcml2ZXIgdXNpbmcgaW50ZXJuYWwgQUdQCiBVbml3aWxsIDI0NElJTwkJCT8/PyAoKikKIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvX2V4dGVuc2lvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL3ZpZGVvX2V4dGVuc2lvbi50eHQKaW5kZXggOGUzM2Q3Yy4uYjJmOWIxNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlb19leHRlbnNpb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW9fZXh0ZW5zaW9uLnR4dApAQCAtMSwxMyArMSwxNiBAQAotVGhpcyBkcml2ZXIgaW1wbGVtZW50IHRoZSBBQ1BJIEV4dGVuc2lvbnMgRm9yIERpc3BsYXkgQWRhcHRlcnMKLWZvciBpbnRlZ3JhdGVkIGdyYXBoaWNzIGRldmljZXMgb24gbW90aGVyYm9hcmQsIGFzIHNwZWNpZmllZCBpbgotQUNQSSAyLjAgU3BlY2lmaWNhdGlvbiwgQXBwZW5kaXggQiwgYWxsb3dpbmcgdG8gcGVyZm9ybSBzb21lIGJhc2ljCi1jb250cm9sIGxpa2UgZGVmaW5pbmcgdGhlIHZpZGVvIFBPU1QgZGV2aWNlLCByZXRyaWV2aW5nIEVESUQgaW5mb3JtYXRpb24KLW9yIHRvIHNldHVwIGEgdmlkZW8gb3V0cHV0LCBldGMuICBOb3RlIHRoYXQgdGhpcyBpcyBhbiByZWYuIGltcGxlbWVudGF0aW9uIG9ubHkuCi1JdCBtYXkgb3IgbWF5IG5vdCB3b3JrIGZvciB5b3VyIGludGVncmF0ZWQgdmlkZW8gZGV2aWNlLgorQUNQSSB2aWRlbyBleHRlbnNpb25zCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhpcyBkcml2ZXIgaW1wbGVtZW50IHRoZSBBQ1BJIEV4dGVuc2lvbnMgRm9yIERpc3BsYXkgQWRhcHRlcnMgZm9yCitpbnRlZ3JhdGVkIGdyYXBoaWNzIGRldmljZXMgb24gbW90aGVyYm9hcmQsIGFzIHNwZWNpZmllZCBpbiBBQ1BJIDIuMAorU3BlY2lmaWNhdGlvbiwgQXBwZW5kaXggQiwgYWxsb3dpbmcgdG8gcGVyZm9ybSBzb21lIGJhc2ljIGNvbnRyb2wgbGlrZQorZGVmaW5pbmcgdGhlIHZpZGVvIFBPU1QgZGV2aWNlLCByZXRyaWV2aW5nIEVESUQgaW5mb3JtYXRpb24gb3IgdG8KK3NldHVwIGEgdmlkZW8gb3V0cHV0LCBldGMuICBOb3RlIHRoYXQgdGhpcyBpcyBhbiByZWYuIGltcGxlbWVudGF0aW9uCitvbmx5LiAgSXQgbWF5IG9yIG1heSBub3Qgd29yayBmb3IgeW91ciBpbnRlZ3JhdGVkIHZpZGVvIGRldmljZS4KIAogSW50ZXJmYWNlcyBleHBvc2VkIHRvIHVzZXJsYW5kIHRocm91Z2ggL3Byb2MvYWNwaS92aWRlbzoKIAotVkdBL2luZm8gOiBkaXNwbGF5IHRoZSBzdXBwb3J0ZWQgdmlkZW8gYnVzIGRldmljZSBjYXBhYmlsaXR5IGxpa2UgLFZpZGVvIFJPTSwgQ1JUL0xDRC9UVi4KK1ZHQS9pbmZvIDogZGlzcGxheSB0aGUgc3VwcG9ydGVkIHZpZGVvIGJ1cyBkZXZpY2UgY2FwYWJpbGl0eSBsaWtlIFZpZGVvIFJPTSwgQ1JUL0xDRC9UVi4KIFZHQS9ST00gOiAgVXNlZCB0byBnZXQgYSBjb3B5IG9mIHRoZSBkaXNwbGF5IGRldmljZXMnIFJPTSBkYXRhICh1cCB0byA0aykuCiBWR0EvUE9TVF9pbmZvIDogVXNlZCB0byBkZXRlcm1pbmUgd2hhdCBvcHRpb25zIGFyZSBpbXBsZW1lbnRlZC4KIFZHQS9QT1NUIDogVXNlZCB0byBnZXQvc2V0IFBPU1QgZGV2aWNlLgpAQCAtMTUsNyArMTgsNyBAQAogCVBsZWFzZSByZWZlciBBQ1BJIHNwZWMgQi40LjEgX0RPUwogVkdBL0NSVCA6IENSVCBvdXRwdXQKIFZHQS9MQ0QgOiBMQ0Qgb3V0cHV0Ci1WR0EvVFYgOiBUViBvdXRwdXQgCitWR0EvVFZPIDogVFYgb3V0cHV0CiBWR0EvKi9icmlnaHRuZXNzIDogVXNlZCB0byBnZXQvc2V0IGJyaWdodG5lc3Mgb2Ygb3V0cHV0IGRldmljZQogCiBOb3RpZnkgZXZlbnQgdGhyb3VnaCAvcHJvYy9hY3BpL2V2ZW50OgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0IGIvRG9jdW1lbnRhdGlvbi9zMzkwL3MzOTBkYmYudHh0CmluZGV4IDJkMWNkOTMuLmUyNGZkZWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vczM5MC9zMzkwZGJmLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3MzOTAvczM5MGRiZi50eHQKQEAgLTEyLDggKzEyLDggQEAKIE9uZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gaW5zcGVjdCB0aGUgZGVidWcgbG9ncyBhZnRlciBhIHByb2R1Y3Rpb24gc3lzdGVtIGNyYXNoCiBpbiBvcmRlciB0byBhbmFseXplIHRoZSByZWFzb24gZm9yIHRoZSBjcmFzaC4KIElmIHRoZSBzeXN0ZW0gc3RpbGwgcnVucyBidXQgb25seSBhIHN1YmNvbXBvbmVudCB3aGljaCB1c2VzIGRiZiBmYWlsZXMsCi1pdCBpcyBwb3NzaWJsZSB0byBsb29rIGF0IHRoZSBkZWJ1ZyBsb2dzIG9uIGEgbGl2ZSBzeXN0ZW0gdmlhIHRoZSBMaW51eCBwcm9jCi1maWxlc3lzdGVtLgoraXQgaXMgcG9zc2libGUgdG8gbG9vayBhdCB0aGUgZGVidWcgbG9ncyBvbiBhIGxpdmUgc3lzdGVtIHZpYSB0aGUgTGludXgKK2RlYnVnZnMgZmlsZXN5c3RlbS4KIFRoZSBkZWJ1ZyBmZWF0dXJlIG1heSBhbHNvIHZlcnkgdXNlZnVsIGZvciBrZXJuZWwgYW5kIGRyaXZlciBkZXZlbG9wbWVudC4KIAogRGVzaWduOgpAQCAtNTIsMTYgKzUyLDE4IEBACiAtIEZsYWcsIGlmIGVudHJ5IGlzIGFuIGV4Y2VwdGlvbiBvciBub3QKIAogVGhlIGRlYnVnIGxvZ3MgY2FuIGJlIGluc3BlY3RlZCBpbiBhIGxpdmUgc3lzdGVtIHRocm91Z2ggZW50cmllcyBpbgotdGhlIHByb2MtZmlsZXN5c3RlbS4gVW5kZXIgdGhlIHBhdGggL3Byb2MvczM5MGRiZiB0aGVyZSBpcyAKK3RoZSBkZWJ1Z2ZzLWZpbGVzeXN0ZW0uIFVuZGVyIHRoZSB0b3BsZXZlbCBkaXJlY3RvcnkgInMzOTBkYmYiIHRoZXJlIGlzCiBhIGRpcmVjdG9yeSBmb3IgZWFjaCByZWdpc3RlcmVkIGNvbXBvbmVudCwgd2hpY2ggaXMgbmFtZWQgbGlrZSB0aGUKLWNvcnJlc3BvbmRpbmcgY29tcG9uZW50LgorY29ycmVzcG9uZGluZyBjb21wb25lbnQuIFRoZSBkZWJ1Z2ZzIG5vcm1hbGx5IHNob3VsZCBiZSBtb3VudGVkIHRvCisvc3lzL2tlcm5lbC9kZWJ1ZyB0aGVyZWZvcmUgdGhlIGRlYnVnIGZlYXR1cmUgY2FuIGJlIGFjY2Vzc2VkIHVudGVyCisvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmLgogCiBUaGUgY29udGVudCBvZiB0aGUgZGlyZWN0b3JpZXMgYXJlIGZpbGVzIHdoaWNoIHJlcHJlc2VudCBkaWZmZXJlbnQgdmlld3MKIHRvIHRoZSBkZWJ1ZyBsb2cuIEVhY2ggY29tcG9uZW50IGNhbiBkZWNpZGUgd2hpY2ggdmlld3Mgc2hvdWxkIGJlCiB1c2VkIHRocm91Z2ggcmVnaXN0ZXJpbmcgdGhlbSB3aXRoIHRoZSBmdW5jdGlvbiBkZWJ1Z19yZWdpc3Rlcl92aWV3KCkuCiBQcmVkZWZpbmVkIHZpZXdzIGZvciBoZXgvYXNjaWksIHNwcmludGYgYW5kIHJhdyBiaW5hcnkgZGF0YSBhcmUgcHJvdmlkZWQuCiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRlZmluZSBvdGhlciB2aWV3cy4gVGhlIGNvbnRlbnQgb2YKLWEgdmlldyBjYW4gYmUgaW5zcGVjdGVkIHNpbXBseSBieSByZWFkaW5nIHRoZSBjb3JyZXNwb25kaW5nIHByb2MgZmlsZS4KK2EgdmlldyBjYW4gYmUgaW5zcGVjdGVkIHNpbXBseSBieSByZWFkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGRlYnVnZnMgZmlsZS4KIAogQWxsIGRlYnVnIGxvZ3MgaGF2ZSBhbiBhbiBhY3R1YWwgZGVidWcgbGV2ZWwgKHJhbmdlIGZyb20gMCB0byA2KS4KIFRoZSBkZWZhdWx0IGxldmVsIGlzIDMuIEV2ZW50IGFuZCBFeGNlcHRpb24gZnVuY3Rpb25zIGhhdmUgYSAnbGV2ZWwnCkBAIC02OSwxNCArNzEsMTQgQEAKIHRoYW4gdGhlIGFjdHVhbCBsZXZlbCBhcmUgd3JpdHRlbiB0byB0aGUgbG9nLiBUaGlzIG1lYW5zLCB3aGVuCiB3cml0aW5nIGV2ZW50cywgaGlnaCBwcmlvcml0eSBsb2cgZW50cmllcyBzaG91bGQgaGF2ZSBhIGxvdyBsZXZlbAogdmFsdWUgd2hlcmVhcyBsb3cgcHJpb3JpdHkgZW50cmllcyBzaG91bGQgaGF2ZSBhIGhpZ2ggb25lLgotVGhlIGFjdHVhbCBkZWJ1ZyBsZXZlbCBjYW4gYmUgY2hhbmdlZCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBwcm9jLWZpbGVzeXN0ZW0gCi10aHJvdWdoIHdyaXRpbmcgYSBudW1iZXIgc3RyaW5nICJ4IiB0byB0aGUgJ2xldmVsJyBwcm9jIGZpbGUgd2hpY2ggaXMKK1RoZSBhY3R1YWwgZGVidWcgbGV2ZWwgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUgZGVidWdmcy1maWxlc3lzdGVtCit0aHJvdWdoIHdyaXRpbmcgYSBudW1iZXIgc3RyaW5nICJ4IiB0byB0aGUgJ2xldmVsJyBkZWJ1Z2ZzIGZpbGUgd2hpY2ggaXMKIHByb3ZpZGVkIGZvciBldmVyeSBkZWJ1ZyBsb2cuIERlYnVnZ2luZyBjYW4gYmUgc3dpdGNoZWQgb2ZmIGNvbXBsZXRlbHkKLWJ5IHVzaW5nICItIiBvbiB0aGUgJ2xldmVsJyBwcm9jIGZpbGUuCitieSB1c2luZyAiLSIgb24gdGhlICdsZXZlbCcgZGVidWdmcyBmaWxlLgogCiBFeGFtcGxlOgogCi0+IGVjaG8gIi0iID4gL3Byb2MvczM5MGRiZi9kYXNkL2xldmVsCis+IGVjaG8gIi0iID4gL3N5cy9rZXJuZWwvZGVidWcvczM5MGRiZi9kYXNkL2xldmVsCiAKIEl0IGlzIGFsc28gcG9zc2libGUgdG8gZGVhY3RpdmF0ZSB0aGUgZGVidWcgZmVhdHVyZSBnbG9iYWxseSBmb3IgZXZlcnkKIGRlYnVnIGxvZy4gWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIHVzaW5nICAyIHN5c2N0bCBwYXJhbWV0ZXJzIGluCkBAIC05OSwxMSArMTAxLDExIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotZGVidWdfaW5mb190ICpkZWJ1Z19yZWdpc3RlcihjaGFyICpuYW1lLCBpbnQgcGFnZXNfaW5kZXgsIGludCBucl9hcmVhcywKK2RlYnVnX2luZm9fdCAqZGVidWdfcmVnaXN0ZXIoY2hhciAqbmFtZSwgaW50IHBhZ2VzLCBpbnQgbnJfYXJlYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSk7CiAKLVBhcmFtZXRlcjogICAgbmFtZTogICAgICAgIE5hbWUgb2YgZGVidWcgbG9nIChlLmcuIHVzZWQgZm9yIHByb2MgZW50cnkpIAotICAgICAgICAgICAgICBwYWdlc19pbmRleDogMl5wYWdlc19pbmRleCBwYWdlcyB3aWxsIGJlIGFsbG9jYXRlZCBwZXIgYXJlYQorUGFyYW1ldGVyOiAgICBuYW1lOiAgICAgICAgTmFtZSBvZiBkZWJ1ZyBsb2cgKGUuZy4gdXNlZCBmb3IgZGVidWdmcyBlbnRyeSkKKyAgICAgICAgICAgICAgcGFnZXM6ICAgICAgIG51bWJlciBvZiBwYWdlcywgd2hpY2ggd2lsbCBiZSBhbGxvY2F0ZWQgcGVyIGFyZWEKICAgICAgICAgICAgICAgbnJfYXJlYXM6ICAgIG51bWJlciBvZiBkZWJ1ZyBhcmVhcwogICAgICAgICAgICAgICBidWZfc2l6ZTogICAgc2l6ZSBvZiBkYXRhIGFyZWEgaW4gZWFjaCBkZWJ1ZyBlbnRyeQogCkBAIC0xMzQsNyArMTM2LDcgQEAKIERlc2NyaXB0aW9uOiAgIFNldHMgbmV3IGFjdHVhbCBkZWJ1ZyBsZXZlbCBpZiBuZXdfbGV2ZWwgaXMgdmFsaWQuIAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSt2b2lkIGRlYnVnX3N0b3BfYWxsKHZvaWQpOwordm9pZCBkZWJ1Z19zdG9wX2FsbCh2b2lkKTsKIAogUGFyYW1ldGVyOiAgICAgbm9uZQogCkBAIC0yNzAsNyArMjcyLDcgQEAKIFJldHVybiBWYWx1ZTogIDAgIDogb2sgCiAgICAgICAgICAgICAgICA8IDA6IEVycm9yIAogCi1EZXNjcmlwdGlvbjogICByZWdpc3RlcnMgbmV3IGRlYnVnIHZpZXcgYW5kIGNyZWF0ZXMgcHJvYyBkaXIgZW50cnkgCitEZXNjcmlwdGlvbjogICByZWdpc3RlcnMgbmV3IGRlYnVnIHZpZXcgYW5kIGNyZWF0ZXMgZGVidWdmcyBkaXIgZW50cnkKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgZGVidWdfdW5yZWdpc3Rlcl92aWV3IChkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcpOyAKQEAgLTI4MSw3ICsyODMsNyBAQAogUmV0dXJuIFZhbHVlOiAgMCAgOiBvayAKICAgICAgICAgICAgICAgIDwgMDogRXJyb3IgCiAKLURlc2NyaXB0aW9uOiAgIHVucmVnaXN0ZXJzIGRlYnVnIHZpZXcgYW5kIHJlbW92ZXMgcHJvYyBkaXIgZW50cnkgCitEZXNjcmlwdGlvbjogICB1bnJlZ2lzdGVycyBkZWJ1ZyB2aWV3IGFuZCByZW1vdmVzIGRlYnVnZnMgZGlyIGVudHJ5CiAKIAogCkBAIC0zMDgsNyArMzEwLDcgQEAKIHsKICAgICAvKiByZWdpc3RlciA0IGRlYnVnIGFyZWFzIHdpdGggb25lIHBhZ2UgZWFjaCBhbmQgNCBieXRlIGRhdGEgZmllbGQgKi8KIAotICAgIGRlYnVnX2luZm8gPSBkZWJ1Z19yZWdpc3RlciAoInRlc3QiLCAwLCA0LCA0ICk7CisgICAgZGVidWdfaW5mbyA9IGRlYnVnX3JlZ2lzdGVyICgidGVzdCIsIDEsIDQsIDQgKTsKICAgICBkZWJ1Z19yZWdpc3Rlcl92aWV3KGRlYnVnX2luZm8sJmRlYnVnX2hleF9hc2NpaV92aWV3KTsKICAgICBkZWJ1Z19yZWdpc3Rlcl92aWV3KGRlYnVnX2luZm8sJmRlYnVnX3Jhd192aWV3KTsKIApAQCAtMzQzLDcgKzM0NSw3IEBACiAgICAgLyogcmVnaXN0ZXIgNCBkZWJ1ZyBhcmVhcyB3aXRoIG9uZSBwYWdlIGVhY2ggYW5kIGRhdGEgZmllbGQgZm9yICovCiAgICAgLyogZm9ybWF0IHN0cmluZyBwb2ludGVyICsgMiB2YXJhcmdzICg9IDMgKiBzaXplb2YobG9uZykpICAgICAgICovCiAKLSAgICBkZWJ1Z19pbmZvID0gZGVidWdfcmVnaXN0ZXIgKCJ0ZXN0IiwgMCwgNCwgc2l6ZW9mKGxvbmcpICogMyk7CisgICAgZGVidWdfaW5mbyA9IGRlYnVnX3JlZ2lzdGVyICgidGVzdCIsIDEsIDQsIHNpemVvZihsb25nKSAqIDMpOwogICAgIGRlYnVnX3JlZ2lzdGVyX3ZpZXcoZGVidWdfaW5mbywmZGVidWdfc3ByaW50Zl92aWV3KTsKIAogICAgIGRlYnVnX3NwcmludGZfZXZlbnQoZGVidWdfaW5mbywgMiAsICJmaXJzdCBldmVudCBpbiAlczolaVxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7CkBAIC0zNjIsMTYgKzM2NCwxNiBAQAogCiAKIAotUHJvY0ZTIEludGVyZmFjZQorRGVidWdmcyBJbnRlcmZhY2UKIC0tLS0tLS0tLS0tLS0tLS0KIFZpZXdzIHRvIHRoZSBkZWJ1ZyBsb2dzIGNhbiBiZSBpbnZlc3RpZ2F0ZWQgdGhyb3VnaCByZWFkaW5nIHRoZSBjb3JyZXNwb25kaW5nIAotcHJvYy1maWxlczoKK2RlYnVnZnMtZmlsZXM6CiAKIEV4YW1wbGU6CiAKLT4gbHMgL3Byb2MvczM5MGRiZi9kYXNkCi1mbHVzaCAgaGV4X2FzY2lpICBsZXZlbCAgICAgIHJhdyAKLT4gY2F0IC9wcm9jL3MzOTBkYmYvZGFzZC9oZXhfYXNjaWkgfCBzb3J0ICsxCis+IGxzIC9zeXMva2VybmVsL2RlYnVnL3MzOTBkYmYvZGFzZAorZmx1c2ggIGhleF9hc2NpaSAgbGV2ZWwgcGFnZXMgcmF3Cis+IGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmL2Rhc2QvaGV4X2FzY2lpIHwgc29ydCArMQogMDAgMDA5NzQ3MzMyNzI6NjgwMDk5IDIgLSAwMiAwMDA2YWQ3ZSAgMDcgZWEgNGEgOTAgfCAuLi4uCiAwMCAwMDk3NDczMzI3Mjo2ODIyMTAgMiAtIDAyIDAwMDZhZGU2ICA0NiA1MiA0NSA0NSB8IEZSRUUKIDAwIDAwOTc0NzMzMjcyOjY4MjIxMyAyIC0gMDIgMDAwNmFkZjYgIDA3IGVhIDRhIDkwIHwgLi4uLgpAQCAtMzkxLDI1ICszOTMsMzYgQEAKIEV4YW1wbGU6CiAKIAotPiBjYXQgL3Byb2MvczM5MGRiZi9kYXNkL2xldmVsCis+IGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmL2Rhc2QvbGV2ZWwKIDMKLT4gZWNobyAiNSIgPiAvcHJvYy9zMzkwZGJmL2Rhc2QvbGV2ZWwKLT4gY2F0IC9wcm9jL3MzOTBkYmYvZGFzZC9sZXZlbAorPiBlY2hvICI1IiA+IC9zeXMva2VybmVsL2RlYnVnL3MzOTBkYmYvZGFzZC9sZXZlbAorPiBjYXQgL3N5cy9rZXJuZWwvZGVidWcvczM5MGRiZi9kYXNkL2xldmVsCiA1CiAKIEZsdXNoaW5nIGRlYnVnIGFyZWFzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogRGVidWcgYXJlYXMgY2FuIGJlIGZsdXNoZWQgd2l0aCBwaXBpbmcgdGhlIG51bWJlciBvZiB0aGUgZGVzaXJlZAotYXJlYSAoMC4uLm4pIHRvIHRoZSBwcm9jIGZpbGUgImZsdXNoIi4gV2hlbiB1c2luZyAiLSIgYWxsIGRlYnVnIGFyZWFzCithcmVhICgwLi4ubikgdG8gdGhlIGRlYnVnZnMgZmlsZSAiZmx1c2giLiBXaGVuIHVzaW5nICItIiBhbGwgZGVidWcgYXJlYXMKIGFyZSBmbHVzaGVkLgogCiBFeGFtcGxlczoKIAogMS4gRmx1c2ggZGVidWcgYXJlYSAwOgotPiBlY2hvICIwIiA+IC9wcm9jL3MzOTBkYmYvZGFzZC9mbHVzaCAgCis+IGVjaG8gIjAiID4gL3N5cy9rZXJuZWwvZGVidWcvczM5MGRiZi9kYXNkL2ZsdXNoCiAKIDIuIEZsdXNoIGFsbCBkZWJ1ZyBhcmVhczoKLT4gZWNobyAiLSIgPiAvcHJvYy9zMzkwZGJmL2Rhc2QvZmx1c2gKKz4gZWNobyAiLSIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmL2Rhc2QvZmx1c2gKKworQ2hhbmdpbmcgdGhlIHNpemUgb2YgZGVidWcgYXJlYXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSXQgaXMgcG9zc2libGUgdGhlIGNoYW5nZSB0aGUgc2l6ZSBvZiBkZWJ1ZyBhcmVhcyB0aHJvdWdoIHBpcGluZwordGhlIG51bWJlciBvZiBwYWdlcyB0byB0aGUgZGVidWdmcyBmaWxlICJwYWdlcyIuIFRoZSByZXNpemUgcmVxdWVzdCB3aWxsCithbHNvIGZsdXNoIHRoZSBkZWJ1ZyBhcmVhcy4KKworRXhhbXBsZToKKworRGVmaW5lIDQgcGFnZXMgZm9yIHRoZSBkZWJ1ZyBhcmVhcyBvZiBkZWJ1ZyBmZWF0dXJlICJkYXNkIjoKKz4gZWNobyAiNCIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmL2Rhc2QvcGFnZXMKIAogU3Rvb3BpbmcgdGhlIGRlYnVnIGZlYXR1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OTEsNyArNTA0LDcgQEAKIC0tLS0tLS0tLS0tLS0tCiAKIFZpZXdzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgJ2RlYnVnX3ZpZXcnIHN0cnVjdHVyZS4gVGhlcmUgYXJlIGRlZmluZWQKLWNhbGxiYWNrIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgcHJvYyBmaWxlczoKK2NhbGxiYWNrIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgZGVidWdmcyBmaWxlczoKIAogc3RydWN0IGRlYnVnX3ZpZXcgewogICAgICAgICBjaGFyIG5hbWVbREVCVUdfTUFYX1BST0NGX0xFTl07ICAKQEAgLTUyNSw3ICs1MzgsNyBAQAogVGhlICJwcml2YXRlX2RhdGEiIG1lbWJlciBjYW4gYmUgdXNlZCBhcyBwb2ludGVyIHRvIHZpZXcgc3BlY2lmaWMgZGF0YS4KIEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBkZWJ1ZyBmZWF0dXJlIGl0c2VsZi4KIAotVGhlIG91dHB1dCB3aGVuIHJlYWRpbmcgYSBkZWJ1Zy1wcm9jIGZpbGUgaXMgc3RydWN0dXJlZCBsaWtlIHRoaXM6CitUaGUgb3V0cHV0IHdoZW4gcmVhZGluZyBhIGRlYnVnZnMgZmlsZSBpcyBzdHJ1Y3R1cmVkIGxpa2UgdGhpczoKIAogInByb2xvZ19wcm9jIG91dHB1dCIKIApAQCAtNTM0LDEzICs1NDcsMTMgQEAKICJoZWFkZXJfcHJvYyBvdXRwdXQgMyIgICJmb3JtYXRfcHJvYyBvdXRwdXQgMyIKIC4uLgogCi1XaGVuIGEgdmlldyBpcyByZWFkIGZyb20gdGhlIHByb2MgZnMsIHRoZSBEZWJ1ZyBGZWF0dXJlIGNhbGxzIHRoZSAKK1doZW4gYSB2aWV3IGlzIHJlYWQgZnJvbSB0aGUgZGVidWdmcywgdGhlIERlYnVnIEZlYXR1cmUgY2FsbHMgdGhlCiAncHJvbG9nX3Byb2MnIG9uY2UgZm9yIHdyaXRpbmcgdGhlIHByb2xvZy4KIFRoZW4gJ2hlYWRlcl9wcm9jJyBhbmQgJ2Zvcm1hdF9wcm9jJyBhcmUgY2FsbGVkIGZvciBlYWNoIAogZXhpc3RpbmcgZGVidWcgZW50cnkuCiAKIFRoZSBpbnB1dF9wcm9jIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBmdW5jdGlvbmFsaXR5IHdoZW4gaXQgaXMgd3JpdHRlbiB0byAKLXRoZSB2aWV3IChlLmcuIGxpa2Ugd2l0aCAnZWNobyAiMCIgPiAvcHJvYy9zMzkwZGJmL2Rhc2QvbGV2ZWwpLgordGhlIHZpZXcgKGUuZy4gbGlrZSB3aXRoICdlY2hvICIwIiA+IC9zeXMva2VybmVsL2RlYnVnL3MzOTBkYmYvZGFzZC9sZXZlbCkuCiAKIEZvciBoZWFkZXJfcHJvYyB0aGVyZSBjYW4gYmUgdXNlZCB0aGUgZGVmYXVsdCBmdW5jdGlvbgogZGVidWdfZGZsdF9oZWFkZXJfZm4oKSB3aGljaCBpcyBkZWZpbmVkIGluIGluIGRlYnVnLmguCkBAIC02MDIsNyArNjE1LDcgQEAKIGRlYnVnX3JlZ2lzdGVyX3ZpZXcoZGVidWdfaW5mbywgJmRlYnVnX3Rlc3Rfdmlldyk7CiBmb3IoaSA9IDA7IGkgPCAxMDsgaSArKykgZGVidWdfaW50X2V2ZW50KGRlYnVnX2luZm8sIDEsIGkpOwogCi0+IGNhdCAvcHJvYy9zMzkwZGJmL3Rlc3QvbXl2aWV3Cis+IGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9zMzkwZGJmL3Rlc3QvbXl2aWV3CiAwMCAwMDk2NDQxOTczNDo2MTE0MDIgMSAtIDAwIDg4MDQyY2EgICBUaGlzIGVycm9yLi4uLi4uLi4uLi4KIDAwIDAwOTY0NDE5NzM0OjYxMTQwNSAxIC0gMDAgODgwNDJjYSAgIFRoYXQgZXJyb3IuLi4uLi4uLi4uLgogMDAgMDA5NjQ0MTk3MzQ6NjExNDA4IDEgLSAwMCA4ODA0MmNhICAgUHJvYmxlbS4uLi4uLi4uLi4uLi4uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC9kcml2ZXIgYi9Eb2N1bWVudGF0aW9uL3NlcmlhbC9kcml2ZXIKaW5kZXggZTljMDE3OC4uYWM3ZWFiYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zZXJpYWwvZHJpdmVyCisrKyBiL0RvY3VtZW50YXRpb24vc2VyaWFsL2RyaXZlcgpAQCAtMTA3LDggKzEwNyw4IEBACiAJaW5kaWNhdGUgdGhhdCB0aGUgc2lnbmFsIGlzIHBlcm1hbmVudGx5IGFjdGl2ZS4gIElmIFJJIGlzCiAJbm90IGF2YWlsYWJsZSwgdGhlIHNpZ25hbCBzaG91bGQgbm90IGJlIGluZGljYXRlZCBhcyBhY3RpdmUuCiAKLQlMb2NraW5nOiBub25lLgotCUludGVycnVwdHM6IGNhbGxlciBkZXBlbmRlbnQuCisJTG9ja2luZzogcG9ydC0+bG9jayB0YWtlbi4KKwlJbnRlcnJ1cHRzOiBsb2NhbGx5IGRpc2FibGVkLgogCVRoaXMgY2FsbCBtdXN0IG5vdCBzbGVlcAogCiAgIHN0b3BfdHgocG9ydCx0dHlfc3RvcCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzcnEudHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKaW5kZXggZjk4YzJlMy4uMTM2ZDgxNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQKQEAgLTcyLDYgKzcyLDggQEAKICdiJyAgICAgLSBXaWxsIGltbWVkaWF0ZWx5IHJlYm9vdCB0aGUgc3lzdGVtIHdpdGhvdXQgc3luY2luZyBvciB1bm1vdW50aW5nCiAgICAgICAgICAgeW91ciBkaXNrcy4KIAorJ2MnCS0gV2lsbCBwZXJmb3JtIGEga2V4ZWMgcmVib290IGluIG9yZGVyIHRvIHRha2UgYSBjcmFzaGR1bXAuCisKICdvJyAgICAgLSBXaWxsIHNodXQgeW91ciBzeXN0ZW0gb2ZmIChpZiBjb25maWd1cmVkIGFuZCBzdXBwb3J0ZWQpLgogCiAncycgICAgIC0gV2lsbCBhdHRlbXB0IHRvIHN5bmMgYWxsIG1vdW50ZWQgZmlsZXN5c3RlbXMuCkBAIC0xMjIsNiArMTI0LDkgQEAKIHJlJ0Inb290IGlzIGdvb2Qgd2hlbiB5b3UncmUgdW5hYmxlIHRvIHNodXQgZG93bi4gQnV0IHlvdSBzaG91bGQgYWxzbyAnUyd5bmMKIGFuZCAnVSdtb3VudCBmaXJzdC4KIAorJ0MncmFzaGR1bXAgY2FuIGJlIHVzZWQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGNyYXNoZHVtcCB3aGVuIHRoZSBzeXN0ZW0gaXMgaHVuZy4KK1RoZSBrZXJuZWwgbmVlZHMgdG8gaGF2ZSBiZWVuIGJ1aWx0IHdpdGggQ09ORklHX0tFWEVDIGVuYWJsZWQuCisKICdTJ3luYyBpcyBncmVhdCB3aGVuIHlvdXIgc3lzdGVtIGlzIGxvY2tlZCB1cCwgaXQgYWxsb3dzIHlvdSB0byBzeW5jIHlvdXIKIGRpc2tzIGFuZCB3aWxsIGNlcnRhaW5seSBsZXNzZW4gdGhlIGNoYW5jZSBvZiBkYXRhIGxvc3MgYW5kIGZzY2tpbmcuIE5vdGUKIHRoYXQgdGhlIHN5bmMgaGFzbid0IHRha2VuIHBsYWNlIHVudGlsIHlvdSBzZWUgdGhlICJPSyIgYW5kICJEb25lIiBhcHBlYXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3NuOWMxMDIudHh0IGIvRG9jdW1lbnRhdGlvbi91c2Ivc245YzEwMi50eHQKaW5kZXggY2Y5YTExOC4uM2Y4YTExOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2Ivc245YzEwMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2Ivc245YzEwMi50eHQKQEAgLTI5Nyw2ICsyOTcsNyBAQAogMHgwYzQ1ICAgICAweDYwMmEKIDB4MGM0NSAgICAgMHg2MDJiCiAweDBjNDUgICAgIDB4NjAyYworMHgwYzQ1ICAgICAweDYwMmQKIDB4MGM0NSAgICAgMHg2MDMwCiAweDBjNDUgICAgIDB4NjA4MAogMHgwYzQ1ICAgICAweDYwODIKQEAgLTMzMyw2ICszMzQsNyBAQAogLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tCiBIVjcxMzFEICAgICBIeW5peCBTZW1pY29uZHVjdG9yLCBJbmMuCiBNSS0wMzQzICAgICBNaWNyb24gVGVjaG5vbG9neSwgSW5jLgorT1Y3NjMwICAgICAgT21uaVZpc2lvbiBUZWNobm9sb2dpZXMsIEluYy4KIFBBUzEwNkIgICAgIFBpeEFydCBJbWFnaW5nLCBJbmMuCiBQQVMyMDJCQ0IgICBQaXhBcnQgSW1hZ2luZywgSW5jLgogVEFTNTExMEMxQiAgVGFpd2FuIEFkdmFuY2VkIFNlbnNvciBDb3Jwb3JhdGlvbgpAQCAtNDcwLDkgKzQ3MiwxMSBAQAogLSBMdWNhIENhcGVsbG8gZm9yIHRoZSBkb25hdGlvbiBvZiBhIHdlYmNhbTsKIC0gSm9hbyBSb2RyaWdvIEZ1emFybywgSm9hbyBMaW1pcmlvLCBDbGF1ZGlvIEZpbGhvIGFuZCBDYWlvIEJlZ290dGkgZm9yIHRoZQogICBkb25hdGlvbiBvZiBhIHdlYmNhbTsKKy0gSm9uIEhvbGxzdHJvbSBmb3IgdGhlIGRvbmF0aW9uIG9mIGEgd2ViY2FtOwogLSBDYXJsb3MgRWR1YXJkbyBNZWRhZ2xpYSBEeW9uaXNpbywgd2hvIGFkZGVkIHRoZSBzdXBwb3J0IGZvciB0aGUgUEFTMjAyQkNCCiAgIGltYWdlIHNlbnNvcjsKIC0gU3RlZmFubyBNb3p6aSwgd2hvIGRvbmF0ZWQgNDUgRVU7CistIEFuZHJldyBQZWFyY2UgZm9yIHRoZSBkb25hdGlvbiBvZiBhIHdlYmNhbTsKIC0gQmVydHJpayBTaWtrZW4sIHdobyByZXZlcnNlLWVuZ2luZWVyZWQgYW5kIGRvY3VtZW50ZWQgdGhlIEh1ZmZtYW4gY29tcHJlc3Npb24KICAgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIFNOOUMxMHggY29udHJvbGxlcnMgYW5kIGltcGxlbWVudGVkIHRoZSBmaXJzdCBkZWNvZGVyOwogLSBNaXp1bm8gVGFrYWZ1bWkgZm9yIHRoZSBkb25hdGlvbiBvZiBhIHdlYmNhbTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0CmluZGV4IDJmODQzMWYuLmYxODk2ZWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvdXNibW9uLnR4dApAQCAtMTAxLDYgKzEwMSwxMyBAQAogICBvciAzIGFuZCAyIHBvc2l0aW9ucywgY29ycmVzcG9uZGluZ2x5LgogLSBVUkIgU3RhdHVzLiBUaGlzIGZpZWxkIG1ha2VzIG5vIHNlbnNlIGZvciBzdWJtaXNzaW9ucywgYnV0IGlzIHByZXNlbnQKICAgdG8gaGVscCBzY3JpcHRzIHdpdGggcGFyc2luZy4gSW4gZXJyb3IgY2FzZSwgaXQgY29udGFpbnMgdGhlIGVycm9yIGNvZGUuCisgIEluIGNhc2Ugb2YgYSBzZXR1cCBwYWNrZXQsIGl0IGNvbnRhaW5zIGEgU2V0dXAgVGFnLiBJZiBzY3JpcHRzIHJlYWQgYSBudW1iZXIKKyAgaW4gdGhpcyBmaWVsZCwgdGhlIHByb2NlZWQgdG8gcmVhZCBEYXRhIExlbmd0aC4gT3RoZXJ3aXNlLCB0aGV5IHJlYWQKKyAgdGhlIHNldHVwIHBhY2tldCBiZWZvcmUgcmVhZGluZyB0aGUgRGF0YSBMZW5ndGguCistIFNldHVwIHBhY2tldCwgaWYgcHJlc2VudCwgY29uc2lzdHMgb2YgNSB3b3Jkczogb25lIG9mIGVhY2ggZm9yIGJtUmVxdWVzdFR5cGUsCisgIGJSZXF1ZXN0LCB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBVU0IgU3BlY2lmaWNhdGlvbiAyLjAuCisgIFRoZXNlIHdvcmRzIGFyZSBzYWZlIHRvIGRlY29kZSBpZiBTZXR1cCBUYWcgd2FzICdzJy4gT3RoZXJ3aXNlLCB0aGUgc2V0dXAKKyAgcGFja2V0IHdhcyBwcmVzZW50LCBidXQgbm90IGNhcHR1cmVkLCBhbmQgdGhlIGZpZWxkcyBjb250YWluIGZpbGxlci4KIC0gRGF0YSBMZW5ndGguIFRoaXMgaXMgdGhlIGFjdHVhbCBsZW5ndGggaW4gdGhlIFVSQi4KIC0gRGF0YSB0YWcuIFRoZSB1c2Jtb24gbWF5IG5vdCBhbHdheXMgY2FwdHVyZSBkYXRhLCBldmVuIGlmIGxlbmd0aCBpcyBub256ZXJvLgogICBPbmx5IGlmIHRhZyBpcyAnPScsIHRoZSBkYXRhIHdvcmRzIGFyZSBwcmVzZW50LgpAQCAtMTI1LDI1ICsxMzIsMzEgQEAKIAkJCVN0cmluZyBkYXRhX3N0ciA9IHN0Lm5leHRUb2tlbigpOwogCQkJaW50IGxlbiA9IGRhdGFfc3RyLmxlbmd0aCgpIC8gMjsKIAkJCWludCBpOworCQkJaW50IGI7CS8vIGJ5dGUgaXMgc2lnbmVkLCBhcHBhcmVudGx5PyEgWFhYCiAJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlkYXRhW2RhdGFfbGVuXSA9IEJ5dGUucGFyc2VCeXRlKAotCQkJCSAgICBkYXRhX3N0ci5zdWJzdHJpbmcoaSoyLCBpKjIgKyAyKSwKLQkJCQkgICAgMTYpOworCQkJCS8vIGRhdGFbZGF0YV9sZW5dID0gQnl0ZS5wYXJzZUJ5dGUoCisJCQkJLy8gICAgIGRhdGFfc3RyLnN1YnN0cmluZyhpKjIsIGkqMiArIDIpLAorCQkJCS8vICAgICAxNik7CisJCQkJYiA9IEludGVnZXIucGFyc2VJbnQoCisJCQkJICAgICBkYXRhX3N0ci5zdWJzdHJpbmcoaSoyLCBpKjIgKyAyKSwKKwkJCQkgICAgIDE2KTsKKwkJCQlpZiAoYiA+PSAxMjgpCisJCQkJCWIgKj0gLTE7CisJCQkJZGF0YVtkYXRhX2xlbl0gPSAoYnl0ZSkgYjsKIAkJCQlkYXRhX2xlbisrOwogCQkJfQogCQl9CiAJfQogfQogCi1UaGlzIGZvcm1hdCBpcyBvYnZpb3VzbHkgZGVmaWNpZW50LiBGb3IgZXhhbXBsZSwgdGhlIHNldHVwIHBhY2tldCBmb3IgY29udHJvbAotdHJhbnNmZXJzIGlzIG5vdCBkZWxpdmVyZWQuIFRoaXMgd2lsbCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KK1RoaXMgZm9ybWF0IG1heSBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuCiAKIEV4YW1wbGVzOgogCi1BbiBpbnB1dCBjb250cm9sIHRyYW5zZmVyIHRvIGdldCBhIHBvcnQgc3RhdHVzOgorQW4gaW5wdXQgY29udHJvbCB0cmFuc2ZlciB0byBnZXQgYSBwb3J0IHN0YXR1cy4KIAotZDc0ZmY5YTAgMjY0MDI4ODE5NiBTIENpOjAwMTowMCAtMTE1IDQgPAotZDc0ZmY5YTAgMjY0MDI4ODIwMiBDIENpOjAwMTowMCAwIDQgPSAwMTAxMDEwMAorZDVlYTg5YTAgMzU3NTkxNDU1NSBTIENpOjAwMTowMCBzIGEzIDAwIDAwMDAgMDAwMyAwMDA0IDQgPAorZDVlYTg5YTAgMzU3NTkxNDU2MCBDIENpOjAwMTowMCAwIDQgPSAwMTA1MDAwMAogCiBBbiBvdXRwdXQgYnVsayB0cmFuc2ZlciB0byBzZW5kIGEgU0NTSSBjb21tYW5kIDB4NUUgaW4gYSAzMS1ieXRlIEJ1bGsgd3JhcHBlcgogdG8gYSBzdG9yYWdlIGRldmljZSBhdCBhZGRyZXNzIDU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbAppbmRleCA0YjNkOGY2Li40NDE0MDdiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKQEAgLTEsMzk5ICsxLDE2IEBACi08SFRNTD48SEVBRD4KLTxUSVRMRT5WaWRlbzRMaW51eCBLZXJuZWwgQVBJIFJlZmVyZW5jZSB2MC4xOjE5OTkwNDMwPC9USVRMRT4KLTwvSEVBRD4KLTwhIFJldmlzaW9uIEhpc3Rvcnk6ID4KLTwhICAgNC8zMC8xOTk5IC0gRnJlZCBHbGVhc29uIChmcmVkZ0B3YXZhLmNvbSk+Ci08ISBEb2N1bWVudGVkIGV4dGVuc2lvbnMgZm9yIHRoZSBSYWRpbyBEYXRhIFN5c3RlbSAoUkRTKSBleHRlbnNpb25zID4KLTxCT0RZIGJnY29sb3I9IiNmZmZmZmYiPgotPEgzPkRldmljZXM8L0gzPgotVmlkZW80TGludXggcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBzZXRzIG9mIGRldmljZSBmaWxlcy4gVGhlc2UgbGl2ZSBvbiB0aGUKLWNoYXJhY3RlciBkZXZpY2UgZm9ybWVybHkga25vd24gYXMgIi9kZXYvYnR0diIuIC9kZXYvYnR0diBzaG91bGQgYmUgYQotc3ltbGluayB0byAvZGV2L3ZpZGVvMCBmb3IgbW9zdCBwZW9wbGUuIAotPFA+Ci08VEFCTEU+Ci08VFI+PFRIPkRldmljZSBOYW1lPC9USD48VEg+TWlub3IgUmFuZ2U8L1RIPjxUSD5GdW5jdGlvbjwvVEg+Ci08VFI+PFREPi9kZXYvdmlkZW88L1REPjxURD4wLTYzPC9URD48VEQ+VmlkZW8gQ2FwdHVyZSBJbnRlcmZhY2U8L1REPgotPFRSPjxURD4vZGV2L3JhZGlvPC9URD48VEQ+NjQtMTI3PC9URD48VEQ+QU0vRk0gUmFkaW8gRGV2aWNlczwvVEQ+Ci08VFI+PFREPi9kZXYvdnR4PC9URD48VEQ+MTkyLTIyMzwvVEQ+PFREPlRlbGV0ZXh0IEludGVyZmFjZSBDaGlwczwvVEQ+Ci08VFI+PFREPi9kZXYvdmJpPC9URD48VEQ+MjI0LTIzOTwvVEQ+PFREPlJhdyBWQkkgRGF0YSAoSW50ZXJjYXN0L3RlbGV0ZXh0KTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1WaWRlbzRMaW51eCBwcm9ncmFtcyBvcGVuIGFuZCBzY2FuIHRoZSBkZXZpY2VzIHRvIGZpbmQgd2hhdCB0aGV5IGFyZSBsb29raW5nCi1mb3IuIENhcGFiaWxpdHkgcXVlcmllcyBkZWZpbmUgd2hhdCBlYWNoIGludGVyZmFjZSBzdXBwb3J0cy4gVGhlIAotZGVzY3JpYmVkIEFQSSBpcyBvbmx5IGRlZmluZWQgZm9yIHZpZGVvIGNhcHR1cmUgY2FyZHMuIFRoZSByZWxldmFudCBzdWJzZXQKLWFwcGxpZXMgdG8gcmFkaW8gY2FyZHMuIFRlbGV0ZXh0IGludGVyZmFjZXMgdGFsayB0aGUgZXhpc3RpbmcgVlRYIEFQSS4KLTxQPgotPEgzPkNhcGFiaWxpdHkgUXVlcnkgSW9jdGw8L0gzPgotVGhlIDxCPlZJRElPQ0dDQVA8L0I+IGlvY3RsIGNhbGwgaXMgdXNlZCB0byBvYnRhaW4gdGhlIGNhcGFiaWxpdHkKLWluZm9ybWF0aW9uIGZvciBhIHZpZGVvIGRldmljZS4gVGhlIDxiPnN0cnVjdCB2aWRlb19jYXBhYmlsaXR5PC9iPiBvYmplY3QKLXBhc3NlZCB0byB0aGUgaW9jdGwgaXMgY29tcGxldGVkIGFuZCByZXR1cm5lZC4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZwotaW5mb3JtYXRpb24KLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5uYW1lWzMyXTwvYj48VEQ+Q2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgaW50ZXJmYWNlPC9URD4KLTxUUj48VEQ+PGI+dHlwZTwvYj48VEQ+VHlwZSBvZiBpbnRlcmZhY2U8L1REPgotPFRSPjxURD48Yj5jaGFubmVsczwvYj48VEQ+TnVtYmVyIG9mIHJhZGlvL3R2IGNoYW5uZWxzIGlmIGFwcHJvcHJpYXRlPC9URD4KLTxUUj48VEQ+PGI+YXVkaW9zPC9iPjxURD5OdW1iZXIgb2YgYXVkaW8gZGV2aWNlcyBpZiBhcHByb3ByaWF0ZTwvVEQ+Ci08VFI+PFREPjxiPm1heHdpZHRoPC9iPjxURD5NYXhpbXVtIGNhcHR1cmUgd2lkdGggaW4gcGl4ZWxzPC9URD4KLTxUUj48VEQ+PGI+bWF4aGVpZ2h0PC9iPjxURD5NYXhpbXVtIGNhcHR1cmUgaGVpZ2h0IGluIHBpeGVsczwvVEQ+Ci08VFI+PFREPjxiPm1pbndpZHRoPC9iPjxURD5NaW5pbXVtIGNhcHR1cmUgd2lkdGggaW4gcGl4ZWxzPC9URD4KLTxUUj48VEQ+PGI+bWluaGVpZ2h0PC9iPjxURD5NaW5pbXVtIGNhcHR1cmUgaGVpZ2h0IGluIHBpeGVsczwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgdHlwZSBmaWVsZCBsaXN0cyB0aGUgY2FwYWJpbGl0eSBmbGFncyBmb3IgdGhlIGRldmljZS4gVGhlc2UgYXJlCi1hcyBmb2xsb3dzCi08UD4KLTxUQUJMRT4KLTxUUj48VEg+TmFtZTwvVEg+PFRIPkRlc2NyaXB0aW9uPC9USD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfQ0FQVFVSRTwvYj48VEQ+Q2FuIGNhcHR1cmUgdG8gbWVtb3J5PC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfVFVORVI8L2I+PFREPkhhcyBhIHR1bmVyIG9mIHNvbWUgZm9ybTwvVEQ+Ci08VFI+PFREPjxiPlZJRF9UWVBFX1RFTEVURVhUPC9iPjxURD5IYXMgdGVsZXRleHQgY2FwYWJpbGl0eTwvVEQ+Ci08VFI+PFREPjxiPlZJRF9UWVBFX09WRVJMQVk8L2I+PFREPkNhbiBvdmVybGF5IGl0cyBpbWFnZSBvbnRvIHRoZSBmcmFtZSBidWZmZXI8L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9DSFJPTUFLRVk8L2I+PFREPk92ZXJsYXkgaXMgQ2hyb21ha2V5ZWQ8L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9DTElQUElORzwvYj48VEQ+T3ZlcmxheSBjbGlwcGluZyBpcyBzdXBwb3J0ZWQ8L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9GUkFNRVJBTTwvYj48VEQ+T3ZlcmxheSBvdmVyd3JpdGVzIGZyYW1lIGJ1ZmZlciBtZW1vcnk8L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9TQ0FMRVM8L2I+PFREPlRoZSBoYXJkd2FyZSBzdXBwb3J0cyBpbWFnZSBzY2FsaW5nPC9URD4KLTxUUj48VEQ+PGI+VklEX1RZUEVfTU9OT0NIUk9NRTwvYj48VEQ+SW1hZ2UgY2FwdHVyZSBpcyBncmV5IHNjYWxlIG9ubHk8L1REPgotPFRSPjxURD48Yj5WSURfVFlQRV9TVUJDQVBUVVJFPC9iPjxURD5DYXB0dXJlIGNhbiBiZSBvZiBvbmx5IHBhcnQgb2YgdGhlIGltYWdlPC9URD4KLTwvVEFCTEU+Ci08UD4KLVRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHNpemVzIGxpc3RlZCBmb3IgYSBjYXB0dXJlIGRldmljZSBkbyBub3QgaW1wbHkgYWxsCi10aGF0IGFsbCBoZWlnaHQvd2lkdGggcmF0aW9zIG9yIHNpemVzIHdpdGhpbiB0aGUgcmFuZ2UgYXJlIHBvc3NpYmxlLiBBCi1yZXF1ZXN0IHRvIHNldCBhIHNpemUgd2lsbCBiZSBob25vdXJlZCBieSB0aGUgbGFyZ2VzdCBhdmFpbGFibGUgY2FwdHVyZQotc2l6ZSB3aG9zZSBjYXB0dXJlIGlzIG5vIGxhcmdlIHRoYW4gdGhlIHJlcXVlc3RlZCByZWN0YW5nbGUgaW4gZWl0aGVyCi1kaXJlY3Rpb24uIEZvciBleGFtcGxlIHRoZSBxdWlja2NhbSBoYXMgMyBmaXhlZCBzZXR0aW5ncy4gCi08UD4KLTxIMz5GcmFtZSBCdWZmZXI8L0gzPgotQ2FwdHVyZSBjYXJkcyB0aGF0IGRyb3AgZGF0YSBkaXJlY3RseSBvbnRvIHRoZSBmcmFtZSBidWZmZXIgbXVzdCBiZSB0b2xkIHRoZQotYmFzZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBidWZmZXIsIGl0cyBzaXplIGFuZCBvcmdhbmlzYXRpb24uIFRoaXMgaXMgYSAKLXByaXZpbGVnZWQgaW9jdGwgYW5kIG9uZSB0aGF0IGV2ZW50dWFsbHkgWCBpdHNlbGYgc2hvdWxkIHNldC4KLTxQPgotVGhlIDxiPlZJRElPQ1NGQlVGPC9iPiBpb2N0bCBzZXRzIHRoZSBmcmFtZSBidWZmZXIgcGFyYW1ldGVycyBmb3IgYSBjYXB0dXJlCi1jYXJkLiBJZiB0aGUgY2FyZCBkb2VzIG5vdCBkbyBkaXJlY3Qgd3JpdGVzIHRvIHRoZSBmcmFtZSBidWZmZXIgdGhlbiB0aGlzCi1pb2N0bCB3aWxsIGJlIHVuc3VwcG9ydGVkLiBUaGUgPGI+VklESU9DR0ZCVUY8L2I+IGlvY3RsIHJldHVybnMgdGhlCi1jdXJyZW50bHkgdXNlZCBwYXJhbWV0ZXJzLiBUaGUgc3RydWN0dXJlIHVzZWQgaW4gYm90aCBjYXNlcyBpcyBhIAotPGI+c3RydWN0IHZpZGVvX2J1ZmZlcjwvYj4uCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+dm9pZCAqYmFzZTwvYj48L1REPjxURD5CYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcjwvVEQ+Ci08VFI+PFREPjxiPmludCBoZWlnaHQ8L2I+PC9URD48VEQ+SGVpZ2h0IG9mIHRoZSBmcmFtZSBidWZmZXI8L1REPgotPFRSPjxURD48Yj5pbnQgd2lkdGg8L2I+PC9URD48VEQ+V2lkdGggb2YgdGhlIGZyYW1lIGJ1ZmZlcjwvVEQ+Ci08VFI+PFREPjxiPmludCBkZXB0aDwvYj48L1REPjxURD5EZXB0aCBvZiB0aGUgZnJhbWUgYnVmZmVyPC9URD4KLTxUUj48VEQ+PGI+aW50IGJ5dGVzcGVybGluZTwvYj48L1REPjxURD5OdW1iZXIgb2YgYnl0ZXMgb2YgbWVtb3J5IGJldHdlZW4gdGhlIHN0YXJ0IG9mIHR3byBhZGphY2VudCBsaW5lczwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1Ob3RlIHRoYXQgdGhlc2UgdmFsdWVzIHJlZmxlY3QgdGhlIHBoeXNpY2FsIGxheW91dCBvZiB0aGUgZnJhbWUgYnVmZmVyLiAKLVRoZSB2aXNpYmxlIGFyZWEgbWF5IGJlIHNtYWxsZXIuIEluIGZhY3QgdW5kZXIgWEZyZWU4NiB0aGlzIGlzIGNvbW1vbmx5IHRoZQotY2FzZS4gWEZyZWU4NiBER0EgY2FuIHByb3ZpZGUgdGhlIHBhcmFtZXRlcnMgcmVxdWlyZWQgdG8gc2V0IHVwIHRoaXMgaW9jdGwuCi1TZXR0aW5nIHRoZSBiYXNlIGFkZHJlc3MgdG8gTlVMTCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm8gcGh5c2ljYWwgZnJhbWUgYnVmZmVyCi1hY2Nlc3MuCi08UD4KLTxIMz5DYXB0dXJlIFdpbmRvd3M8L0gzPgotVGhlIGNhcHR1cmUgYXJlYSBpcyBkZXNjcmliZWQgYnkgYSA8Yj5zdHJ1Y3QgdmlkZW9fd2luZG93PC9iPi4gVGhpcyBkZWZpbmVzCi1hIGNhcHR1cmUgYXJlYSBhbmQgdGhlIGNsaXBwaW5nIGluZm9ybWF0aW9uIGlmIHJlbGV2YW50LiBUaGUgCi08Yj5WSURJT0NHV0lOPC9iPiBpb2N0bCByZWNvdmVycyB0aGUgY3VycmVudCBzZXR0aW5ncyBhbmQgdGhlIAotPGI+VklESU9DU1dJTjwvYj4gc2V0cyBuZXcgdmFsdWVzLiBBIHN1Y2Nlc3NmdWwgY2FsbCB0byA8Yj5WSURJT0NTV0lOPC9iPiAKLWluZGljYXRlcyB0aGF0IGEgc3VpdGFibGUgc2V0IG9mIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNob3Nlbi4gVGhleSBkbyBub3QKLWluZGljYXRlIHRoYXQgZXhhY3RseSB3aGF0IHdhcyByZXF1ZXN0ZWQgd2FzIGdyYW50ZWQuIFRoZSBwcm9ncmFtIHNob3VsZAotY2FsbCA8Yj5WSURJT0NHV0lOPC9iPiB0byBjaGVjayBpZiB0aGUgbmVhcmVzdCBtYXRjaCB3YXMgc3VpdGFibGUuIFRoZQotPGI+c3RydWN0IHZpZGVvX3dpbmRvdzwvYj4gY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHMuCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+eDwvYj48VEQ+VGhlIFggY28tb3JkaW5hdGUgc3BlY2lmaWVkIGluIFggd2luZG93cyBmb3JtYXQuPC9URD4KLTxUUj48VEQ+PGI+eTwvYj48VEQ+VGhlIFkgY28tb3JkaW5hdGUgc3BlY2lmaWVkIGluIFggd2luZG93cyBmb3JtYXQuPC9URD4KLTxUUj48VEQ+PGI+d2lkdGg8L2I+PFREPlRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UgY2FwdHVyZS48L1REPgotPFRSPjxURD48Yj5oZWlnaHQ8L2I+PFREPlRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGNhcHR1cmUuPC9URD4KLTxUUj48VEQ+PGI+Y2hyb21ha2V5PC9iPjxURD5BIGhvc3Qgb3JkZXIgUkdCMzIgdmFsdWUgZm9yIHRoZSBjaHJvbWEga2V5LjwvVEQ+Ci08VFI+PFREPjxiPmZsYWdzPC9iPjxURD5BZGRpdGlvbmFsIGNhcHR1cmUgZmxhZ3MuPC9URD4KLTxUUj48VEQ+PGI+Y2xpcHM8L2I+PFREPkEgbGlzdCBvZiBjbGlwcGluZyByZWN0YW5nbGVzLiA8ZW0+KFNldCBvbmx5KTwvZW0+PC9URD4KLTxUUj48VEQ+PGI+Y2xpcGNvdW50PC9iPjxURD5UaGUgbnVtYmVyIG9mIGNsaXBwaW5nIHJlY3RhbmdsZXMuIDxlbT4oU2V0IG9ubHkpPC9lbT48L1REPgotPC9UQUJMRT4KLTxQPgotQ2xpcHBpbmcgcmVjdGFuZ2xlcyBhcmUgcGFzc2VkIGFzIGFuIGFycmF5LiBFYWNoIGNsaXAgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZwotZmllbGRzIGF2YWlsYWJsZSB0byB0aGUgdXNlci4KLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj54PC9iPjwvVEQ+PFREPlggY28tb3JkaW5hdGUgb2YgcmVjdGFuZ2xlIHRvIHNraXA8L1REPgotPFRSPjxURD48Yj55PC9iPjwvVEQ+PFREPlkgY28tb3JkaW5hdGUgb2YgcmVjdGFuZ2xlIHRvIHNraXA8L1REPgotPFRSPjxURD48Yj53aWR0aDwvYj48L1REPjxURD5XaWR0aCBvZiByZWN0YW5nbGUgdG8gc2tpcDwvVEQ+Ci08VFI+PFREPjxiPmhlaWdodDwvYj48L1REPjxURD5IZWlnaHQgb2YgcmVjdGFuZ2xlIHRvIHNraXA8L1REPgotPC9UQUJMRT4KLTxQPgotTWVyZWx5IHNldHRpbmcgdGhlIHdpbmRvdyBkb2VzIG5vdCBlbmFibGUgY2FwdHVyaW5nLiBPdmVybGF5IGNhcHR1cmluZwotKGkuZS4gUENJLVBDSSB0cmFuc2ZlciB0byB0aGUgZnJhbWUgYnVmZmVyIG9mIHRoZSB2aWRlbyBjYXJkKQotaXMgYWN0aXZhdGVkIGJ5IHBhc3NpbmcgdGhlIDxiPlZJRElPQ0NBUFRVUkU8L2I+IGlvY3RsIGEgdmFsdWUgb2YgMSwgYW5kCi1kaXNhYmxlZCBieSBwYXNzaW5nIGl0IGEgdmFsdWUgb2YgMC4gCi08UD4KLVNvbWUgY2FwdHVyZSBkZXZpY2VzIGNhbiBjYXB0dXJlIGEgc3ViZmllbGQgb2YgdGhlIGltYWdlIHRoZXkgYWN0dWFsbHkgc2VlLgotVGhpcyBpcyBpbmRpY2F0ZWQgd2hlbiBWSURFT19UWVBFX1NVQkNBUFRVUkUgaXMgZGVmaW5lZC4KLVRoZSB2aWRlb19jYXB0dXJlIGRlc2NyaWJlcyB0aGUgdGltZSBhbmQgc3BlY2lhbCBzdWJmaWVsZHMgdG8gY2FwdHVyZS4KLVRoZSB2aWRlb19jYXB0dXJlIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkcy4KLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj54PC9iPjwvVEQ+PFREPlggY28tb3JkaW5hdGUgb2Ygc291cmNlIHJlY3RhbmdsZSB0byBncmFiPC9URD4KLTxUUj48VEQ+PGI+eTwvYj48L1REPjxURD5ZIGNvLW9yZGluYXRlIG9mIHNvdXJjZSByZWN0YW5nbGUgdG8gZ3JhYjwvVEQ+Ci08VFI+PFREPjxiPndpZHRoPC9iPjwvVEQ+PFREPldpZHRoIG9mIHNvdXJjZSByZWN0YW5nbGUgdG8gZ3JhYjwvVEQ+Ci08VFI+PFREPjxiPmhlaWdodDwvYj48L1REPjxURD5IZWlnaHQgb2Ygc291cmNlIHJlY3RhbmdsZSB0byBncmFiPC9URD4KLTxUUj48VEQ+PGI+ZGVjaW1hdGlvbjwvYj48L1REPjxURD5EZWNpbWF0aW9uIHRvIGFwcGx5PC9URD4KLTxUUj48VEQ+PGI+ZmxhZ3M8L2I+PC9URD48VEQ+RmxhZyBzZXR0aW5ncyBmb3IgZ3JhYmJpbmc8L1REPgotPC9UQUJMRT4KLVRoZSBhdmFpbGFibGUgZmxhZ3MgYXJlCi08UD4KLTxUQUJMRT4KLTxUUj48VEg+TmFtZTwvVEg+PFRIPkRlc2NyaXB0aW9uPC9USD4KLTxUUj48VEQ+PGI+VklERU9fQ0FQVFVSRV9PREQ8L2I+PFREPkNhcHR1cmUgb25seSBvZGQgZnJhbWVzPC9URD4KLTxUUj48VEQ+PGI+VklERU9fQ0FQVFVSRV9FVkVOPC9iPjxURD5DYXB0dXJlIG9ubHkgZXZlbiBmcmFtZXM8L1REPgotPC9UQUJMRT4KLTxQPgotPEgzPlZpZGVvIFNvdXJjZXM8L0gzPgotRWFjaCB2aWRlbzRsaW51eCB2aWRlbyBvciBhdWRpbyBkZXZpY2UgY2FwdHVyZXMgZnJvbSBvbmUgb3IgbW9yZSAKLXNvdXJjZSA8Yj5jaGFubmVsczwvYj4uIEVhY2ggY2hhbm5lbCBjYW4gYmUgcXVlcmllcyB3aXRoIHRoZSAKLTxiPlZESU9DR0NIQU48L2I+IGlvY3RsIGNhbGwuIEJlZm9yZSBpbnZva2luZyB0aGlzIGZ1bmN0aW9uIHRoZSBjYWxsZXIKLW11c3Qgc2V0IHRoZSBjaGFubmVsIGZpZWxkIHRvIHRoZSBjaGFubmVsIHRoYXQgaXMgYmVpbmcgcXVlcmllZC4gT24gcmV0dXJuCi10aGUgPGI+c3RydWN0IHZpZGVvX2NoYW5uZWw8L2I+IGlzIGZpbGxlZCBpbiB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZQotbmF0dXJlIG9mIHRoZSBjaGFubmVsIGl0c2VsZi4KLTxQPgotVGhlIDxiPlZJRElPQ1NDSEFOPC9iPiBpb2N0bCB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50IGFuZCBzd2l0Y2hlcyB0aGUKLWNhcHR1cmUgdG8gdGhpcyBpbnB1dC4gSXQgaXMgbm90IGRlZmluZWQgd2hldGhlciBwYXJhbWV0ZXJzIHN1Y2ggYXMgY29sb3VyCi1zZXR0aW5ncyBvciB0dW5pbmcgYXJlIG1haW50YWluZWQgYWNyb3NzIGEgY2hhbm5lbCBzd2l0Y2guIFRoZSBjYWxsZXIgc2hvdWxkCi1tYWludGFpbiBzZXR0aW5ncyBhcyBkZXNpcmVkIGZvciBlYWNoIGNoYW5uZWwuIChUaGlzIGlzIHJlYXNvbmFibGUgYXMgCi1kaWZmZXJlbnQgdmlkZW8gaW5wdXRzIG1heSBoYXZlIGRpZmZlcmVudCBwcm9wZXJ0aWVzKS4KLTxQPgotVGhlIDxiPnN0cnVjdCB2aWRlb19jaGFubmVsPC9iPiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+Y2hhbm5lbDwvYj48L1REPjxURD5UaGUgY2hhbm5lbCBudW1iZXI8L1REPgotPFRSPjxURD48Yj5uYW1lPC9iPjwvVEQ+PFREPlRoZSBpbnB1dCBuYW1lIC0gcHJlZmVyYWJseSByZWZsZWN0aW5nIHRoZSBsYWJlbAotb24gdGhlIGNhcmQgaW5wdXQgaXRzZWxmPC9URD4KLTxUUj48VEQ+PGI+dHVuZXJzPC9iPjwvVEQ+PFREPk51bWJlciBvZiB0dW5lcnMgZm9yIHRoaXMgaW5wdXQ8L1REPgotPFRSPjxURD48Yj5mbGFnczwvYj48L1REPjxURD5Qcm9wZXJ0aWVzIHRoZSB0dW5lciBoYXM8L1REPgotPFRSPjxURD48Yj50eXBlPC9iPjwvVEQ+PFREPklucHV0IHR5cGUgKGlmIGtub3duKTwvVEQ+Ci08VFI+PFREPjxiPm5vcm08L2I+PFREPlRoZSBub3JtIGZvciB0aGlzIGNoYW5uZWw8L1REPgotPC9UQUJMRT4KLTxQPgotVGhlIGZsYWdzIGRlZmluZWQgYXJlCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+VklERU9fVkNfVFVORVI8L2I+PFREPkNoYW5uZWwgaGFzIHR1bmVycy48L1REPgotPFRSPjxURD48Yj5WSURFT19WQ19BVURJTzwvYj48VEQ+Q2hhbm5lbCBoYXMgYXVkaW8uPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVkNfTk9STTwvYj48VEQ+Q2hhbm5lbCBoYXMgbm9ybSBzZXR0aW5nLjwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgdHlwZXMgZGVmaW5lZCBhcmUKLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5WSURFT19UWVBFX1RWPC9iPjxURD5UaGUgaW5wdXQgaXMgYSBUViBpbnB1dC48L1REPgotPFRSPjxURD48Yj5WSURFT19UWVBFX0NBTUVSQTwvYj48VEQ+VGhlIGlucHV0IGlzIGEgY2FtZXJhLjwvVEQ+Ci08L1RBQkxFPgotPFA+Ci08SDM+SW1hZ2UgUHJvcGVydGllczwvSDM+Ci1UaGUgaW1hZ2UgcHJvcGVydGllcyBvZiB0aGUgcGljdHVyZSBjYW4gYmUgcXVlcmllZCB3aXRoIHRoZSA8Yj5WSURJT0NHUElDVDwvYj4KLWlvY3RsIHdoaWNoIGZpbGxzIGluIGEgPGI+c3RydWN0IHZpZGVvX3BpY3R1cmU8L2I+LiBUaGUgPGI+VklESU9DU1BJQ1Q8L2I+IAotaW9jdGwgYWxsb3dzIHZhbHVlcyB0byBiZSBjaGFuZ2VkLiBBbGwgdmFsdWVzIGV4Y2VwdCBmb3IgdGhlIHBhbGV0dGUgdHlwZQotYXJlIHNjYWxlZCBiZXR3ZWVuIDAtNjU1MzUuIAotPFA+Ci1UaGUgPGI+c3RydWN0IHZpZGVvX3BpY3R1cmU8L2I+IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+YnJpZ2h0bmVzczwvYj48VEQ+UGljdHVyZSBicmlnaHRuZXNzPC9URD4KLTxUUj48VEQ+PGI+aHVlPC9iPjxURD5QaWN0dXJlIGh1ZSAoY29sb3VyIG9ubHkpPC9URD4KLTxUUj48VEQ+PGI+Y29sb3VyPC9iPjxURD5QaWN0dXJlIGNvbG91ciAoY29sb3VyIG9ubHkpPC9URD4KLTxUUj48VEQ+PGI+Y29udHJhc3Q8L2I+PFREPlBpY3R1cmUgY29udHJhc3Q8L1REPgotPFRSPjxURD48Yj53aGl0ZW5lc3M8L2I+PFREPlRoZSB3aGl0ZW5lc3MgKGdyZXlzY2FsZSBvbmx5KTwvVEQ+Ci08VFI+PFREPjxiPmRlcHRoPC9iPjxURD5UaGUgY2FwdHVyZSBkZXB0aCAobWF5IG5lZWQgdG8gbWF0Y2ggdGhlIGZyYW1lIGJ1ZmZlciBkZXB0aCk8L1REPgotPFRSPjxURD48Yj5wYWxldHRlPC9iPjxURD5SZXBvcnRzIHRoZSBwYWxldHRlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgaW1hZ2U8L1REPgotPC9UQUJMRT4KLTxQPgotVGhlIGZvbGxvd2luZyBwYWxldHRlcyBhcmUgZGVmaW5lZAotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfR1JFWTwvYj48VEQ+TGluZWFyIGludGVuc2l0eSBncmV5IHNjYWxlICgyNTUgaXMgYnJpZ2h0ZXN0KS48L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX0hJMjQwPC9iPjxURD5UaGUgQlQ4NDggOGJpdCBjb2xvdXIgY3ViZS48L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1JHQjU2NTwvYj48VEQ+UkdCNTY1IHBhY2tlZCBpbnRvIDE2IGJpdCB3b3Jkcy48L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1JHQjU1NTwvYj48VEQ+UkdWNTU1IHBhY2tlZCBpbnRvIDE2IGJpdCB3b3JkcywgdG9wIGJpdCB1bmRlZmluZWQuPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9SR0IyNDwvYj48VEQ+UkdCODg4IHBhY2tlZCBpbnRvIDI0Yml0IHdvcmRzLjwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfUkdCMzI8L2I+PFREPlJHQjg4OCBwYWNrZWQgaW50byB0aGUgbG93IDMgYnl0ZXMgb2YgMzJiaXQgd29yZHMuIFRoZSB0b3AgOGJpdHMgYXJlIHVuZGVmaW5lZC48L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1lVVjQyMjwvYj48VEQ+VmlkZW8gc3R5bGUgWVVWNDIyIC0gOGJpdHMgcGFja2VkIDRiaXRzIFkgMmJpdHMgVSAyYml0cyBWPC9URD4KLTxUUj48VEQ+PGI+VklERU9fUEFMRVRURV9ZVVlWPC9iPjxURD5EZXNjcmliZSBtZTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfVVlWWTwvYj48VEQ+RGVzY3JpYmUgbWU8L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1lVVjQyMDwvYj48VEQ+WVVWNDIwIGNhcHR1cmU8L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1lVVjQxMTwvYj48VEQ+WVVWNDExIGNhcHR1cmU8L1REPgotPFRSPjxURD48Yj5WSURFT19QQUxFVFRFX1JBVzwvYj48VEQ+UkFXIGNhcHR1cmUgKEJUODQ4KTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfWVVWNDIyUDwvYj48VEQ+WVVWIDQ6MjoyIFBsYW5hcjwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1BBTEVUVEVfWVVWNDExUDwvYj48VEQ+WVVWIDQ6MToxIFBsYW5hcjwvVEQ+Ci08L1RBQkxFPgotPFA+Ci08SDM+VHVuaW5nPC9IMz4KLUVhY2ggdmlkZW8gaW5wdXQgY2hhbm5lbCBjYW4gaGF2ZSBvbmUgb3IgbW9yZSB0dW5lcnMgYXNzb2NpYXRlZCB3aXRoIGl0LiBNYW55Ci1kZXZpY2VzIHdpbGwgbm90IGhhdmUgdHVuZXJzLiBUViBjYXJkcyBhbmQgcmFkaW8gY2FyZHMgd2lsbCBoYXZlIG9uZSBvciBtb3JlCi10dW5lcnMgYXR0YWNoZWQuCi08UD4KLVR1bmVycyBhcmUgZGVzY3JpYmVkIGJ5IGEgPGI+c3RydWN0IHZpZGVvX3R1bmVyPC9iPiB3aGljaCBjYW4gYmUgb2J0YWluZWQgYnkKLXRoZSA8Yj5WSURJT0NHVFVORVI8L2I+IGlvY3RsLiBGaWxsIGluIHRoZSB0dW5lciBudW1iZXIgaW4gdGhlIHN0cnVjdHVyZQotdGhlbiBwYXNzIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIGlvY3RsIHRvIGhhdmUgdGhlIGRhdGEgZmlsbGVkIGluLiBUaGUgCi10dW5lciBjYW4gYmUgc3dpdGNoZWQgdXNpbmcgPGI+VklESU9DU1RVTkVSPC9iPiB3aGljaCB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50Ci1naXZpbmcgdGhlIHR1bmVyIHRvIHVzZS4gQSBzdHJ1Y3QgdHVuZXIgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+dHVuZXI8L2I+PFREPk51bWJlciBvZiB0aGUgdHVuZXI8L1REPgotPFRSPjxURD48Yj5uYW1lPC9iPjxURD5DYW5vbmljYWwgbmFtZSBmb3IgdGhpcyB0dW5lciAoZWcgRk0vQU0vVFYpPC9URD4KLTxUUj48VEQ+PGI+cmFuZ2Vsb3c8L2I+PFREPkxvd2VzdCB0dW5hYmxlIGZyZXF1ZW5jeTwvVEQ+Ci08VFI+PFREPjxiPnJhbmdlaGlnaDwvYj48VEQ+SGlnaGVzdCB0dW5hYmxlIGZyZXF1ZW5jeTwvVEQ+Ci08VFI+PFREPjxiPmZsYWdzPC9iPjxURD5GbGFncyBkZXNjcmliaW5nIHRoZSB0dW5lcjwvVEQ+Ci08VFI+PFREPjxiPm1vZGU8L2I+PFREPlRoZSB2aWRlbyBzaWduYWwgbW9kZSBpZiByZWxldmFudDwvVEQ+Ci08VFI+PFREPjxiPnNpZ25hbDwvYj48VEQ+U2lnbmFsIHN0cmVuZ3RoIGlmIGtub3duIC0gYmV0d2VlbiAwLTY1NTM1PC9URD4KLTwvVEFCTEU+Ci08UD4KLVRoZSBmb2xsb3dpbmcgZmxhZ3MgZXhpc3QKLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5WSURFT19UVU5FUl9QQUw8L2I+PFREPlBBTCB0dW5pbmcgaXMgc3VwcG9ydGVkPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfTlRTQzwvYj48VEQ+TlRTQyB0dW5pbmcgaXMgc3VwcG9ydGVkPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfU0VDQU08L2I+PFREPlNFQ0FNIHR1bmluZyBpcyBzdXBwb3J0ZWQ8L1REPgotPFRSPjxURD48Yj5WSURFT19UVU5FUl9MT1c8L2I+PFREPkZyZXF1ZW5jeSBpcyBpbiBhIGxvd2VyIHJhbmdlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfTk9STTwvYj48VEQ+VGhlIG5vcm0gZm9yIHRoaXMgdHVuZXIgaXMgc2V0dGFibGU8L1REPgotPFRSPjxURD48Yj5WSURFT19UVU5FUl9TVEVSRU9fT048L2I+PFREPlRoZSB0dW5lciBpcyBzZWVpbmcgc3RlcmVvIGF1ZGlvPC9URD4KLTxUUj48VEQ+PGI+VklERU9fVFVORVJfUkRTX09OPC9iPjxURD5UaGUgdHVuZXIgaXMgc2VlaW5nIGEgUkRTIGRhdGFzdHJlYW08L1REPgotPFRSPjxURD48Yj5WSURFT19UVU5FUl9NQlNfT048L2I+PFREPlRoZSB0dW5lciBpcyBzZWVpbmcgYSBNQlMgZGF0YXN0cmVhbTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgZm9sbG93aW5nIG1vZGVzIGFyZSBkZWZpbmVkCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+VklERU9fTU9ERV9QQUw8L2I+PFREPlRoZSB0dW5lciBpcyBpbiBQQUwgbW9kZTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX01PREVfTlRTQzwvYj48VEQ+VGhlIHR1bmVyIGlzIGluIE5UU0MgbW9kZTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX01PREVfU0VDQU08L2I+PFREPlRoZSB0dW5lciBpcyBpbiBTRUNBTSBtb2RlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fTU9ERV9BVVRPPC9iPjxURD5UaGUgdHVuZXIgYXV0byBzd2l0Y2hlcywgb3IgbW9kZSBkb2VzIG5vdCBhcHBseTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UdW5pbmcgZnJlcXVlbmNpZXMgYXJlIGFuIHVuc2lnbmVkIDMyYml0IHZhbHVlIGluIDEvMTZ0aCBNSHogb3IgaWYgdGhlCi08Yj5WSURFT19UVU5FUl9MT1c8L2I+IGZsYWcgaXMgc2V0IHRoZXkgYXJlIGluIDEvMTZ0aCBLSHouIFRoZSBjdXJyZW50Ci1mcmVxdWVuY3kgaXMgb2J0YWluZWQgYXMgYW4gdW5zaWduZWQgbG9uZyB2aWEgdGhlIDxiPlZJRElPQ0dGUkVRPC9iPiBpb2N0bCBhbmQKLXNldCBieSB0aGUgPGI+VklESU9DU0ZSRVE8L2I+IGlvY3RsLgotPFA+Ci08SDM+QXVkaW88L0gzPgotVFYgYW5kIFJhZGlvIGRldmljZXMgaGF2ZSBvbmUgb3IgbW9yZSBhdWRpbyBpbnB1dHMgdGhhdCBtYXkgYmUgc2VsZWN0ZWQuIAotVGhlIGF1ZGlvIHByb3BlcnRpZXMgYXJlIHF1ZXJpZWQgYnkgcGFzc2luZyBhIDxiPnN0cnVjdCB2aWRlb19hdWRpbzwvYj4gdG8gPGI+VklESU9DR0FVRElPPC9iPiBpb2N0bC4gVGhlCi08Yj5WSURJT0NTQVVESU88L2I+IGlvY3RsIHNldHMgYXVkaW8gcHJvcGVydGllcy4KLTxQPgotVGhlIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkcwotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPmF1ZGlvPC9iPjxURD5UaGUgY2hhbm5lbCBudW1iZXI8L1REPgotPFRSPjxURD48Yj52b2x1bWU8L2I+PFREPlRoZSB2b2x1bWUgbGV2ZWw8L1REPgotPFRSPjxURD48Yj5iYXNzPC9iPjxURD5UaGUgYmFzcyBsZXZlbDwvVEQ+Ci08VFI+PFREPjxiPnRyZWJsZTwvYj48VEQ+VGhlIHRyZWJsZSBsZXZlbDwvVEQ+Ci08VFI+PFREPjxiPmZsYWdzPC9iPjxURD5GbGFncyBkZXNjcmliaW5nIHRoZSBhdWRpbyBjaGFubmVsPC9URD4KLTxUUj48VEQ+PGI+bmFtZTwvYj48VEQ+Q2Fub25pY2FsIG5hbWUgZm9yIHRoZSBhdWRpbyBpbnB1dDwvVEQ+Ci08VFI+PFREPjxiPm1vZGU8L2I+PFREPlRoZSBtb2RlIHRoZSBhdWRpbyBpbnB1dCBpcyBpbjwvVEQ+Ci08VFI+PFREPjxiPmJhbGFuY2U8L2I+PFREPlRoZSBsZWZ0L3JpZ2h0IGJhbGFuY2U8L1REPgotPFRSPjxURD48Yj5zdGVwPC9iPjxURD5BY3R1YWwgc3RlcCB1c2VkIGJ5IHRoZSBoYXJkd2FyZTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1UaGUgZm9sbG93aW5nIGZsYWdzIGFyZSBkZWZpbmVkCi08UD4KLTxUQUJMRT4KLTxUUj48VEQ+PGI+VklERU9fQVVESU9fTVVURTwvYj48VEQ+VGhlIGF1ZGlvIGlzIG11dGVkPC9URD4KLTxUUj48VEQ+PGI+VklERU9fQVVESU9fTVVUQUJMRTwvYj48VEQ+QXVkaW8gbXV0aW5nIGlzIHN1cHBvcnRlZDwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX0FVRElPX1ZPTFVNRTwvYj48VEQ+VGhlIHZvbHVtZSBpcyBjb250cm9sbGFibGU8L1REPgotPFRSPjxURD48Yj5WSURFT19BVURJT19CQVNTPC9iPjxURD5UaGUgYmFzcyBpcyBjb250cm9sbGFibGU8L1REPgotPFRSPjxURD48Yj5WSURFT19BVURJT19UUkVCTEU8L2I+PFREPlRoZSB0cmVibGUgaXMgY29udHJvbGxhYmxlPC9URD4KLTxUUj48VEQ+PGI+VklERU9fQVVESU9fQkFMQU5DRTwvYj48VEQ+VGhlIGJhbGFuY2UgaXMgY29udHJvbGxhYmxlPC9URD4KLTwvVEFCTEU+Ci08UD4KLVRoZSBmb2xsb3dpbmcgZGVjb2RpbmcgbW9kZXMgYXJlIGRlZmluZWQKLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj5WSURFT19TT1VORF9NT05PPC9iPjxURD5Nb25vIHNpZ25hbDwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1NPVU5EX1NURVJFTzwvYj48VEQ+U3RlcmVvIHNpZ25hbCAoTklDQU0gZm9yIFRWKTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1NPVU5EX0xBTkcxPC9iPjxURD5FdXJvcGVhbiBUViBhbHRlcm5hdGUgbGFuZ3VhZ2UgMTwvVEQ+Ci08VFI+PFREPjxiPlZJREVPX1NPVU5EX0xBTkcyPC9iPjxURD5FdXJvcGVhbiBUViBhbHRlcm5hdGUgbGFuZ3VhZ2UgMjwvVEQ+Ci08L1RBQkxFPgotPFA+Ci08SDM+UmVhZGluZyBJbWFnZXM8L0gzPgotRWFjaCBjYWxsIHRvIHRoZSA8Yj5yZWFkPC9iPiBzeXNjYWxsIHJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGltYWdlCi1mcm9tIHRoZSBkZXZpY2UuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2V0IGZvcm1hdCBhbmQgc2l6ZSAodXNpbmcKLXRoZSBWSURJT0NTUElDVCBhbmQgVklESU9DU1dJTiBpb2N0bHMpIGFuZCB0aGVuIHRvIHBhc3MgYSBzdWl0YWJsZQotc2l6ZSBidWZmZXIgYW5kIGxlbmd0aCB0byB0aGUgZnVuY3Rpb24uIE5vdCBhbGwgZGV2aWNlcyB3aWxsIHN1cHBvcnQKLXJlYWQgb3BlcmF0aW9ucy4KLTxQPgotQSBzZWNvbmQgd2F5IHRvIGhhbmRsZSBpbWFnZSBjYXB0dXJlIGlzIHZpYSB0aGUgbW1hcCBpbnRlcmZhY2UgaWYgc3VwcG9ydGVkLgotVG8gdXNlIHRoZSBtbWFwIGludGVyZmFjZSBhIHVzZXIgZmlyc3Qgc2V0cyB0aGUgZGVzaXJlZCBpbWFnZSBzaXplIGFuZCBkZXB0aAotcHJvcGVydGllcy4gTmV4dCB0aGUgVklESU9DR01CVUYgaW9jdGwgaXMgaXNzdWVkLiBUaGlzIHJlcG9ydHMgdGhlIHNpemUKLW9mIGJ1ZmZlciB0byBtbWFwIGFuZCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnVmZmVyIGZvciBlYWNoIGZyYW1lLiBUaGUKLW51bWJlciBvZiBmcmFtZXMgc3VwcG9ydGVkIGlzIGRldmljZSBkZXBlbmRlbnQgYW5kIG1heSBvbmx5IGJlIG9uZS4gCi08UD4KLVRoZSB2aWRlb19tYnVmIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkcwotPFA+Ci08VEFCTEU+Ci08VFI+PFREPjxiPnNpemU8L2I+PFREPlRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gbWFwPC9URD4KLTxUUj48VEQ+PGI+ZnJhbWVzPC9iPjxURD5UaGUgbnVtYmVyIG9mIGZyYW1lczwvVEQ+Ci08VFI+PFREPjxiPm9mZnNldHM8L2I+PFREPlRoZSBvZmZzZXQgb2YgZWFjaCBmcmFtZTwvVEQ+Ci08L1RBQkxFPgotPFA+Ci1PbmNlIHRoZSBtbWFwIGhhcyBiZWVuIG1hZGUgdGhlIFZJRElPQ01DQVBUVVJFIGlvY3RsIHN0YXJ0cyB0aGUKLWNhcHR1cmUgdG8gYSBmcmFtZSB1c2luZyB0aGUgZm9ybWF0IGFuZCBpbWFnZSBzaXplIHNwZWNpZmllZCBpbiB0aGUKLXZpZGVvX21tYXAgKHdoaWNoIHNob3VsZCBtYXRjaCBvciBiZSBiZWxvdyB0aGUgaW5pdGlhbCBxdWVyeSBzaXplKS4KLVdoZW4gdGhlIFZJRElPQ01DQVBUVVJFIGlvY3RsIHJldHVybnMgdGhlIGZyYW1lIGlzIDxlbT5ub3Q8L2VtPgotY2FwdHVyZWQgeWV0LCB0aGUgZHJpdmVyIGp1c3QgaW5zdHJ1Y3RlZCB0aGUgaGFyZHdhcmUgdG8gc3RhcnQgdGhlCi1jYXB0dXJlLiAgVGhlIGFwcGxpY2F0aW9uIGhhcyB0byB1c2UgdGhlIFZJRElPQ1NZTkMgaW9jdGwgdG8gd2FpdAotdW50aWwgdGhlIGNhcHR1cmUgb2YgYSBmcmFtZSBpcyBmaW5pc2hlZC4gIFZJRElPQ1NZTkMgdGFrZXMgdGhlIGZyYW1lCi1udW1iZXIgeW91IHdhbnQgdG8gd2FpdCBmb3IgYXMgYXJndW1lbnQuCi08cD4KLUl0IGlzIGFsbG93ZWQgdG8gY2FsbCBWSURJT0NNQ0FQVFVSRSBtdWx0aXBsZSB0aW1lcyAod2l0aCBkaWZmZXJlbnQKLWZyYW1lIG51bWJlcnMgaW4gdmlkZW9fbW1hcC0+ZnJhbWUgb2YgY291cnNlKSBhbmQgdGh1cyBoYXZlIG11bHRpcGxlCi1vdXRzdGFuZGluZyBjYXB0dXJlIHJlcXVlc3RzLiAgQSBzaW1wbGUgd2F5IGRvIHRvIGRvdWJsZS1idWZmZXJpbmcKLXVzaW5nIHRoaXMgZmVhdHVyZSBsb29rcyBsaWtlIHRoaXM6Ci08cHJlPgotLyogc2V0dXAgZXZlcnl0aGluZyAqLwotVklESU9DTUNBUFRVUkUoMCkKLXdoaWxlICh3aGF0ZXZlcikgewotICAgVklESU9DTUNBUFRVUkUoMSkKLSAgIFZJRElPQ1NZTkMoMCkKLSAgIC8qIHByb2Nlc3MgZnJhbWUgMCB3aGlsZSB0aGUgaGFyZHdhcmUgY2FwdHVyZXMgZnJhbWUgMSAqLwotICAgVklESU9DTUNBUFRVUkUoMCkKLSAgIFZJRElPQ1NZTkMoMSkKLSAgIC8qIHByb2Nlc3MgZnJhbWUgMSB3aGlsZSB0aGUgaGFyZHdhcmUgY2FwdHVyZXMgZnJhbWUgMCAqLwotfQotPC9wcmU+Ci1Ob3RlIHRoYXQgeW91IGFyZSA8ZW0+bm90PC9lbT4gbGltaXRlZCB0byBvbmx5IHR3byBmcmFtZXMuICBUaGUgQVBJCi1hbGxvd3MgdXAgdG8gMzIgZnJhbWVzLCB0aGUgVklESU9DR01CVUYgaW9jdGwgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi1mcmFtZXMgdGhlIGRyaXZlciBncmFudGVkLiAgVGh1cyBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBkZWVwZXIgcXVldWVzCi10byBhdm9pZCBsb29zaW5nIGZyYW1lcyBvbiBsb2FkIHBlYWtzLgotPHA+Ci1XaGlsZSBjYXB0dXJpbmcgdG8gbWVtb3J5IHRoZSBkcml2ZXIgd2lsbCBtYWtlIGEgImJlc3QgZWZmb3J0IiBhdHRlbXB0Ci10byBjYXB0dXJlIHRvIHNjcmVlbiBhcyB3ZWxsIGlmIHJlcXVlc3RlZC4gVGhpcyBub3JtYWxseSBtZWFucyBhbGwKLWZyYW1lcyB0aGF0ICJtaXNzIiBtZW1vcnkgbWFwcGVkIGNhcHR1cmUgd2lsbCBnbyB0byB0aGUgZGlzcGxheS4KLTxQPgotQSBmaW5hbCBpb2N0bCBleGlzdHMgdG8gYWxsb3cgYSBkZXZpY2UgdG8gb2J0YWluIHJlbGF0ZWQgZGV2aWNlcyBpZiBhCi1kcml2ZXIgaGFzIG11bHRpcGxlIGNvbXBvbmVudHMgKGZvciBleGFtcGxlIHZpZGVvMCBtYXkgbm90IGJlIGFzc29jaWF0ZWQKLXdpdGggdmJpMCB3aGljaCB3b3VsZCBjYXVzZSBhbiBpbnRlcmNhc3QgZGlzcGxheSBwcm9ncmFtIHRvIG1ha2UgYSBiYWQKLW1pc3Rha2UpLiBUaGUgVklESU9DR1VOSVQgaW9jdGwgcmVwb3J0cyB0aGUgdW5pdCBudW1iZXJzIG9mIHRoZSBhc3NvY2lhdGVkCi1kZXZpY2VzIGlmIGFueSBleGlzdC4gVGhlIHZpZGVvX3VuaXQgc3RydWN0dXJlIGhhcyB0aGUgZm9sbG93aW5nIGZpZWxkcy4KLTxQPgotPFRBQkxFPgotPFRSPjxURD48Yj52aWRlbzwvYj48VEQ+VmlkZW8gY2FwdHVyZSBkZXZpY2U8L1REPgotPFRSPjxURD48Yj52Ymk8L2I+PFREPlZCSSBjYXB0dXJlIGRldmljZTwvVEQ+Ci08VFI+PFREPjxiPnJhZGlvPC9iPjxURD5SYWRpbyBkZXZpY2U8L1REPgotPFRSPjxURD48Yj5hdWRpbzwvYj48VEQ+QXVkaW8gbWl4ZXI8L1REPgotPFRSPjxURD48Yj50ZWxldGV4dDwvYj48VEQ+VGVsZXRleHQgZGV2aWNlPC9URD4KLTwvVEFCTEU+Ci08UD4KLTxIMz5SRFMgRGF0YXN0cmVhbXM8L0gzPgotRm9yIHJhZGlvIGRldmljZXMgdGhhdCBzdXBwb3J0IGl0LCBpdCBpcyBwb3NzaWJsZSB0byByZWNlaXZlIFJhZGlvIERhdGEKLVN5c3RlbSAoUkRTKSBkYXRhIGJ5IG1lYW5zIG9mIGEgcmVhZCgpIG9uIHRoZSBkZXZpY2UuICBUaGUgZGF0YSBpcyBwYWNrZWQgaW4KLWdyb3VwcyBvZiB0aHJlZSwgYXMgZm9sbG93czoKLTxUQUJMRT4KLTxUUj48VEQ+Rmlyc3QgT2N0ZXQ8L1REPjxURD5MZWFzdCBTaWduaWZpY2FudCBCeXRlIG9mIFJEUyBCbG9jazwvVEQ+PC9UUj4KLTxUUj48VEQ+U2Vjb25kIE9jdGV0PC9URD48VEQ+TW9zdCBTaWduaWZpY2FudCBCeXRlIG9mIFJEUyBCbG9jawotPFRSPjxURD5UaGlyZCBPY3RldDwvVEQ+PFREPkJpdCA3OjwvVEQ+PFREPkVycm9yIGJpdC4gIEluZGljYXRlcyB0aGF0Ci1hbiB1bmNvcnJlY3RhYmxlIGVycm9yIG9jY3VycmVkIGR1cmluZyByZWNlcHRpb24gb2YgdGhpcyBibG9jay48L1REPjwvVFI+Ci08VFI+PFREPiZuYnNwOzwvVEQ+PFREPkJpdCA2OjwvVEQ+PFREPkNvcnJlY3RlZCBiaXQuICBJbmRpY2F0ZXMgdGhhdCAgCi1hbiBlcnJvciB3YXMgY29ycmVjdGVkIGZvciB0aGlzIGRhdGEgYmxvY2suPC9URD48L1RSPgotPFRSPjxURD4mbmJzcDs8L1REPjxURD5CaXRzIDUtMzo8L1REPjxURD5SZWNlaXZlZCBPZmZzZXQuICBJbmRpY2F0ZXMgdGhlICAKLW9mZnNldCByZWNlaXZlZCBieSB0aGUgc3luYyBzeXN0ZW0uPC9URD48L1RSPgotPFRSPjxURD4mbmJzcDs8L1REPjxURD5CaXRzIDItMDo8L1REPjxURD5PZmZzZXQgTmFtZS4gIEluZGljYXRlcyB0aGUgIAotb2Zmc2V0IGFwcGxpZWQgdG8gdGhpcyBkYXRhLjwvVEQ+PC9UUj4KLTwvVEFCTEU+Ci08L0JPRFk+Ci08L0hUTUw+Cis8VElUTEU+VjRMIEFQSTwvVElUTEU+Cis8SDE+VmlkZW8gRm9yIExpbnV4IEFQSXM8L0gxPgorPHRhYmxlIGJvcmRlcj0wPgorPHRyPgorPHRkPgorPEEgSFJFRj1odHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2Fkcy92aWRlbzRsaW51eC9BUEkvVjRMMV9BUEkuaHRtbD4KK1Y0TCBvcmlnaW5hbCBBUEk8L2E+Cis8L3RkPjx0ZD4KK09ic29sZXRlZCBieSBWNEwyIEFQSQorPC90ZD48L3RyPjx0cj48dGQ+Cis8QSBIUkVGPWh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL3ZpZGVvNGxpbnV4L0FQSS9WNEwyX0FQSS5odG1sPgorVjRMMiBBUEk8L2E+Cis8L3RkPjx0ZD4KK1Nob3VsZCBiZSB1c2VkIGZvciBuZXcgcHJvamVjdHMKKzwvdGQ+PC90cj4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKaW5kZXggZTQ2NzYxYy4uNjJhMTJhMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgpAQCAtMSw0ICsxLDQgQEAKLWNhcmQ9MCAtICAqKiogVU5LTk9XTi9HRU5FUklDICoqKiAKK2NhcmQ9MCAtICAqKiogVU5LTk9XTi9HRU5FUklDICoqKgogY2FyZD0xIC0gTUlSTyBQQ1RWCiBjYXJkPTIgLSBIYXVwcGF1Z2UgKGJ0ODQ4KQogY2FyZD0zIC0gU1RCLCBHYXRld2F5IFAvTiA2MDAwNjk5IChidDg0OCkKQEAgLTExOSwzICsxMTksMTcgQEAKIGNhcmQ9MTE4IC0gTE1MQlQ0CiBjYXJkPTExOSAtIFRla3JhbSBNMjA1IFBSTwogY2FyZD0xMjAgLSBDb25jZXB0cm9uaWMgQ09OVFZGTWkKK2NhcmQ9MTIxIC0gRXVyZXN5cyBQaWNvbG8gVGV0cmEKK2NhcmQ9MTIyIC0gU3Bpcml0IFRWIFR1bmVyCitjYXJkPTEyMyAtIEFWZXJNZWRpYSBBVmVyVFYgRFZCLVQgNzcxCitjYXJkPTEyNCAtIEF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxCitjYXJkPTEyNSAtIE1BVFJJWCBWaXNpb24gU2lnbWEtU1EKK2NhcmQ9MTI2IC0gTUFUUklYIFZpc2lvbiBTaWdtYS1TTEMKK2NhcmQ9MTI3IC0gQVBBQyBWaWV3Y29tcCA4NzgoQU1BWCkKK2NhcmQ9MTI4IC0gRFZJQ08gRnVzaW9uSERUViBEVkItVCBMaXRlCitjYXJkPTEyOSAtIFYtR2VhciBNeVZDRAorY2FyZD0xMzAgLSBTdXBlciBUViBUdW5lcgorY2FyZD0xMzEgLSBUaWJldCBTeXN0ZW1zICdQcm9ncmVzcyBEVlInIENTMTYKK2NhcmQ9MTMyIC0gS29kaWNvbSA0NDAwUiAobWFzdGVyKQorY2FyZD0xMzMgLSBLb2RpY29tIDQ0MDBSIChzbGF2ZSkKK2NhcmQ9MTM0IC0gQWRsaW5rIFJUVjI0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0NDk1OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OApAQCAtMCwwICsxLDMxIEBACitjYXJkPTAgLSBVTktOT1dOL0dFTkVSSUMKK2NhcmQ9MSAtIEhhdXBwYXVnZSBXaW5UViAzNHh4eCBtb2RlbHMKK2NhcmQ9MiAtIEdESSBCbGFjayBHb2xkCitjYXJkPTMgLSBQaXhlbFZpZXcKK2NhcmQ9NCAtIEFUSSBUViBXb25kZXIgUHJvCitjYXJkPTUgLSBMZWFkdGVrIFdpbmZhc3QgMjAwMFhQIEV4cGVydAorY2FyZD02IC0gQXZlclRWIFN0dWRpbyAzMDMgKE0xMjYpCitjYXJkPTcgLSBNU0kgVFYtQG55d2hlcmUgTWFzdGVyCitjYXJkPTggLSBMZWFkdGVrIFdpbmZhc3QgRFYyMDAwCitjYXJkPTkgLSBMZWFkdGVrIFBWUiAyMDAwCitjYXJkPTEwIC0gSU9EQVRBIEdWLVZDUDMvUENJCitjYXJkPTExIC0gUHJvbGluayBQbGF5VFYgUFZSCitjYXJkPTEyIC0gQVNVUyBQVlItNDE2CitjYXJkPTEzIC0gTVNJIFRWLUBueXdoZXJlCitjYXJkPTE0IC0gS1dvcmxkL1ZTdHJlYW0gWFBlcnQgRFZCLVQKK2NhcmQ9MTUgLSBEVmlDTyBGdXNpb25IRFRWIERWQi1UMQorY2FyZD0xNiAtIEtXb3JsZCBMVFY4ODNSRgorY2FyZD0xNyAtIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEKK2NhcmQ9MTggLSBIYXVwcGF1Z2UgTm92YS1UIERWQi1UCitjYXJkPTE5IC0gQ29uZXhhbnQgRFZCLVQgcmVmZXJlbmNlIGRlc2lnbgorY2FyZD0yMCAtIFByb3ZpZGVvIFBWMjU5CitjYXJkPTIxIC0gRFZpQ08gRnVzaW9uSERUViBEVkItVCBQbHVzCitjYXJkPTIyIC0gZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UCitjYXJkPTIzIC0gcGNIRFRWIEhEMzAwMCBIRFRWCitjYXJkPTI0IC0gSGF1cHBhdWdlIFdpblRWIDI4eHh4IChSb3NseW4pIG1vZGVscworY2FyZD0yNSAtIERpZ2l0YWwtTG9naWMgTUlDUk9TUEFDRSBFbnRlcnRhaW5tZW50IENlbnRlciAoTUVDKQorY2FyZD0yNiAtIElPREFUQSBHVi9CQ1RWN0UKK2NhcmQ9MjcgLSBQaXhlbFZpZXcgUGxheVRWIFVsdHJhIFBybyAoU3RlcmVvKQorY2FyZD0yOCAtIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVQKK2NhcmQ9MjkgLSBBRFMgVGVjaCBJbnN0YW50IFRWIERWQi1UIFBDSQorY2FyZD0zMCAtIFRlcnJhVGVjIENpbmVyZ3kgMTQwMCBEVkItVApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CmluZGV4IGE2YzgyZmEuLjFiNWEzYTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKQEAgLTEsMTAgKzEsMTAgQEAKLSAgMCAtPiBVTktOT1dOL0dFTkVSSUMgICAgICAgICAgICAgICAgICAgICAgICAgCisgIDAgLT4gVU5LTk9XTi9HRU5FUklDCiAgIDEgLT4gUHJvdGV1cyBQcm8gW3BoaWxpcHMgcmVmZXJlbmNlIGRlc2lnbl0gICBbMTEzMToyMDAxLDExMzE6MjAwMV0KICAgMiAtPiBMaWZlVmlldyBGbHlWSURFTzMwMDAgICAgICAgICAgICAgICAgICAgIFs1MTY4OjAxMzgsNGU0MjowMTM4XQogICAzIC0+IExpZmVWaWV3IEZseVZJREVPMjAwMCAgICAgICAgICAgICAgICAgICAgWzUxNjg6MDEzOF0KICAgNCAtPiBFTVBSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMTMxOjY3NTJdCiAgIDUgLT4gU0tOZXQgTW9uc3RlciBUViAgICAgICAgICAgICAgICAgICAgICAgICBbMTEzMTo0ZTg1XQotICA2IC0+IFRldmlvbiBNRCA5NzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgNiAtPiBUZXZpb24gTUQgOTcxNwogICA3IC0+IEtOQyBPbmUgVFYtU3RhdGlvbiBSRFMgLyBUeXBob29uIFRWIFR1bmVyIFJEUyBbMTEzMTpmZTAxLDE4OTQ6ZmUwMV0KICAgOCAtPiBUZXJyYXRlYyBDaW5lcmd5IDQwMCBUViAgICAgICAgICAgICAgICAgIFsxNTNCOjExNDJdCiAgIDkgLT4gTWVkaW9uIDUwNDQKQEAgLTIwLDE2ICsyMCw0NSBAQAogIDE5IC0+IENvbXBybyBWaWRlb01hdGUgVFYgICAgICAgICAgICAgICAgICAgICAgWzE4NWI6YzEwMF0KICAyMCAtPiBNYXRyb3ggQ3Jvbm9zUGx1cyAgICAgICAgICAgICAgICAgICAgICAgIFsxMDJCOjQ4ZDBdCiAgMjEgLT4gMTBNT09OUyBQQ0kgVFYgQ0FQVFVSRSBDQVJEICAgICAgICAgICAgICBbMTEzMToyMDAxXQotIDIyIC0+IE1lZGlvbiAyODE5LyBBdmVyTWVkaWEgTTE1NiAgICAgICAgICAgICAgWzE0NjE6YTcwYiwxNDYxOjIxMTVdCisgMjIgLT4gQXZlck1lZGlhIE0xNTYgLyBNZWRpb24gMjgxOSAgICAgICAgICAgICBbMTQ2MTphNzBiXQogIDIzIC0+IEJNSyBNUEVYIFR1bmVyCiAgMjQgLT4gS05DIE9uZSBUVi1TdGF0aW9uIERWUiAgICAgICAgICAgICAgICAgICBbMTg5NDphMDA2XQogIDI1IC0+IEFTVVMgVFYtRk0gNzEzMyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwNDM6NDg0M10KICAyNiAtPiBQaW5uYWNsZSBQQ1RWIFN0ZXJlbyAoc2FhNzEzNCkgICAgICAgICAgIFsxMWJkOjAwMmJdCi0gMjcgLT4gTWFubGkgTXVjaFRWIE0tVFYwMDIKLSAyOCAtPiBNYW5saSBNdWNoVFYgTS1UVjAwMQorIDI3IC0+IE1hbmxpIE11Y2hUViBNLVRWMDAyL0JlaG9sZCBUViA0MDMgRk0KKyAyOCAtPiBNYW5saSBNdWNoVFYgTS1UVjAwMS9CZWhvbGQgVFYgNDAxCiAgMjkgLT4gTmFnYXNlIFNhbmd5byBUcmFuc0dlYXIgMzAwMFRWICAgICAgICAgICBbMTQ2MTowNTBjXQogIDMwIC0+IEVsaXRlZ3JvdXAgRUNTIFRWUDNYUCBGTTEyMTYgVHVuZXIgQ2FyZChQQUwtQkcsRk0pICBbMTAxOTo0Y2I0XQogIDMxIC0+IEVsaXRlZ3JvdXAgRUNTIFRWUDNYUCBGTTEyMzYgVHVuZXIgQ2FyZCAoTlRTQyxGTSkgWzEwMTk6NGNiNV0KICAzMiAtPiBBVkFDUyBTbWFydFRWCiAgMzMgLT4gQVZlck1lZGlhIERWRCBFWk1ha2VyICAgICAgICAgICAgICAgICAgICBbMTQ2MToxMGZmXQotIDM0IC0+IExpZmVWaWV3IEZseVRWIFBsYXRpbnVtMzMgbWluaSAgICAgICAgICAgWzUxNjg6MDIxMl0KKyAzNCAtPiBOb3ZhbCBQcmltZSBUViA3MTMzCisgMzUgLT4gQXZlck1lZGlhIEF2ZXJUViBTdHVkaW8gMzA1ICAgICAgICAgICAgICBbMTQ2MToyMTE1XQorIDM2IC0+IFVQTU9TVCBQVVJQTEUgVFYgICAgICAgICAgICAgICAgICAgICAgICAgWzEyYWI6MDgwMF0KKyAzNyAtPiBJdGVtcyBNdWNoVFYgUGx1cyAvIElULTAwNQorIDM4IC0+IFRlcnJhdGVjIENpbmVyZ3kgMjAwIFRWICAgICAgICAgICAgICAgICAgWzE1M0I6MTE1Ml0KKyAzOSAtPiBMaWZlVmlldyBGbHlUViBQbGF0aW51bSBNaW5pICAgICAgICAgICAgIFs1MTY4OjAyMTJdCisgNDAgLT4gQ29tcHJvIFZpZGVvTWF0ZSBUViBQVlIvRk0gICAgICAgICAgICAgICBbMTg1YjpjMTAwXQorIDQxIC0+IENvbXBybyBWaWRlb01hdGUgVFYgR29sZCsgICAgICAgICAgICAgICAgWzE4NWI6YzEwMF0KKyA0MiAtPiBTYWJyZW50IFNCVC1UVkZNIChzYWE3MTMwKQorIDQzIC0+IDpab2xpZCBYcGVydCBUVjcxMzQKKyA0NCAtPiBFbXBpcmUgUENJIFRWLVJhZGlvIExFCisgNDUgLT4gQXZlcm1lZGlhIEFWZXJUViBTdHVkaW8gMzA3ICAgICAgICAgICAgICBbMTQ2MTo5NzE1XQorIDQ2IC0+IEFWZXJNZWRpYSBDYXJkYnVzIFRWL1JhZGlvIChFNTAwKSAgICAgICAgWzE0NjE6ZDZlZV0KKyA0NyAtPiBUZXJyYXRlYyBDaW5lcmd5IDQwMCBtb2JpbGUgICAgICAgICAgICAgIFsxNTNiOjExNjJdCisgNDggLT4gVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYgTUszICAgICAgICAgICAgICBbMTUzQjoxMTU4XQorIDQ5IC0+IENvbXBybyBWaWRlb01hdGUgR29sZCsgUGFsICAgICAgICAgICAgICAgWzE4NWI6YzIwMF0KKyA1MCAtPiBQaW5uYWNsZSBQQ1RWIDMwMGkgRFZCLVQgKyBQQUwgICAgICAgICAgIFsxMWJkOjAwMmRdCisgNTEgLT4gUHJvVmlkZW8gUFY5NTIgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTU0MDo5NTI0XQorIDUyIC0+IEF2ZXJNZWRpYSBBdmVyVFYvMzA1ICAgICAgICAgICAgICAgICAgICAgWzE0NjE6MjEwOF0KKyA1MyAtPiBBU1VTIFRWLUZNIDcxMzUgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDQzOjQ4NDVdCisgNTQgLT4gTGlmZVZpZXcgRmx5VFYgUGxhdGludW0gRk0gICAgICAgICAgICAgICBbNTE2ODowMjE0LDE0ODk6MDIxNF0KKyA1NSAtPiBMaWZlVmlldyBGbHlEVkItVCBEVU8gICAgICAgICAgICAgICAgICAgIFs1MTY4OjA1MDIsNTE2ODowMzA2XQorIDU2IC0+IEF2ZXJtZWRpYSBBVmVyVFYgMzA3ICAgICAgICAgICAgICAgICAgICAgWzE0NjE6YTcwYV0KKyA1NyAtPiBBdmVybWVkaWEgQVZlclRWIEdPIDAwNyBGTSAgICAgICAgICAgICAgIFsxNDYxOmYzMWZdCisgNTggLT4gQURTIFRlY2ggSW5zdGFudCBUViAoc2FhNzEzNSkgICAgICAgICAgICBbMTQyMTowMzUwLDE0MjE6MDM3MF0KKyA1OSAtPiBLd29ybGQvVGV2aW9uIFYtU3RyZWFtIFhwZXJ0IFRWIFBWUjcxMzQKKyA2MCAtPiBUeXBob29uIERWQi1UIER1byBEaWdpdGFsL0FuYWxvZyBDYXJkYnVzIFs0ZTQyOjA1MDJdCisgNjEgLT4gUGhpbGlwcyBUT1VHSCBEVkItVCByZWZlcmVuY2UgZGVzaWduICAgICBbMTEzMToyMDA0XQorIDYyIC0+IENvbXBybyBWaWRlb01hdGUgVFYgR29sZCtJSQorIDYzIC0+IEt3b3JsZCBYcGVydCBUViBQVlI3MTM0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgppbmRleCBmN2JhZmU4Li5kMWI5ZDIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKQEAgLTQ0LDMgKzQ0LDIxIEBACiB0dW5lcj00MyAtIFBoaWxpcHMgTlRTQyBNSzMgKEZNMTIzNk1LMyBvciBGTTEyMzYvRikKIHR1bmVyPTQ0IC0gUGhpbGlwcyA0IGluIDEgKEFUSSBUViBXb25kZXIgUHJvL0NvbmV4YW50KQogdHVuZXI9NDUgLSBNaWNyb3R1bmUgNDA0OSBGTTUKK3R1bmVyPTQ2IC0gUGFuYXNvbmljIFZQMjdzL0VOR0U0MzI0RAordHVuZXI9NDcgLSBMRyBOVFNDIChUQVBFIHNlcmllcykKK3R1bmVyPTQ4IC0gVGVubmEgVE5GIDg4MzEgQkdGRikKK3R1bmVyPTQ5IC0gTWljcm90dW5lIDQwNDIgRkk1IEFUU0MvTlRTQyBkdWFsIGluCit0dW5lcj01MCAtIFRDTCAyMDAyTgordHVuZXI9NTEgLSBQaGlsaXBzIFBBTC9TRUNBTV9EIChGTSAxMjU2IEktSDMpCit0dW5lcj01MiAtIFRob21zb24gRERUIDc2MTAgKEFUU0MvTlRTQykKK3R1bmVyPTUzIC0gUGhpbGlwcyBGUTEyODYKK3R1bmVyPTU0IC0gdGRhODI5MCs3NQordHVuZXI9NTUgLSBMRyBQQUwgKFRBUEUgc2VyaWVzKQordHVuZXI9NTYgLSBQaGlsaXBzIFBBTC9TRUNBTSBtdWx0aSAoRlExMjE2QU1FIE1LNCkKK3R1bmVyPTU3IC0gUGhpbGlwcyBGUTEyMzZBIE1LNAordHVuZXI9NTggLSBZbWVjIFRWaXNpb24gVFZGLTg1MzFNRi84ODMxTUYvODczMU1GCit0dW5lcj01OSAtIFltZWMgVFZpc2lvbiBUVkYtNTUzM01GCit0dW5lcj02MCAtIFRob21zb24gRERUIDc2MTEgKEFUU0MvTlRTQykKK3R1bmVyPTYxIC0gVGVuYSBUTkY5NTMzLUQvSUYvVE5GOTUzMy1CL0RGCit0dW5lcj02MiAtIFBoaWxpcHMgVEVBNTc2N0hOIEZNIFJhZGlvCit0dW5lcj02MyAtIFBoaWxpcHMgRk1EMTIxNk1FIE1LMyBIeWJyaWQgVHVuZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLnNhYTcxMzQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5zYWE3MTM0CmluZGV4IDFhNDQ2YzYuLjFmNzg4ZTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuc2FhNzEzNApAQCAtNTcsNiArNTcsMTUgQEAKICAtIDI0LjU3Nk1IeiAtPiAuYXVkaW9fY2xvY2s9MHgyMDAwMDAKICh4dGFsICogLmF1ZGlvX2Nsb2NrID0gNTE1Mzk2MDApCiAKK1NvbWUgZGV0YWlscyBhYm91dCAzMC8zNC8zNToKKworIC0gc2FhNzEzMCAtIGxvdy1wcmljZSBjaGlwLCBkb2Vzbid0IGhhdmUgbXV0ZSwgdGhhdCBpcyB3aHkgYWxsIHRob3NlCisgY2FyZHMgc2hvdWxkIGhhdmUgLm11dGUgZmllbGQgZGVmaW5lZCBpbiB0aGVpciB0dW5lciBzdHJ1Y3R1cmUuCisKKyAtIHNhYTcxMzQgLSB1c3VhbCBjaGlwCisKKyAtIHNhYTcxMzMvMzUgLSBzYWE3MTM1IGlzIHByb2JhYmx5IGEgbWFya2V0aW5nIGRlY2lzaW9uLCBzaW5jZSBhbGwgdGhvc2UKKyBjaGlwcyBpZGVudGlmaWVzIGl0c2VsZiBhcyAzMyBvbiBwY2kuCiAKIENyZWRpdHMKID09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DYXJkcyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DYXJkcwppbmRleCA3ZjhjN2ViLi44ZjE5NDFlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ2FyZHMKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NhcmRzCkBAIC0yMCw3ICsyMCw3IEBACiBkZWNvZGVycywgRUVQUk9NcywgdGVsZXRleHQgZGVjb2RlcnMgLi4uCiAKIAotVW5zdXBwb3J0ZWQgQ2FyZHM6IAorVW5zdXBwb3J0ZWQgQ2FyZHM6CiAtLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2FyZHMgd2l0aCBab3JhbiAoWlIpIG9yIFBoaWxpcHMgKFNBQSkgb3IgSVNBIGFyZSBub3Qgc3VwcG9ydGVkIGJ5CkBAIC01MCwxMSArNTAsMTEgQEAKIE1pcm8vUGlubmFjbGUgUENUVgogLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS0gQnQ4NDggCi0gIHNvbWUgKGFsbD8/KSBjb21lIHdpdGggMiBjcnlzdGFscyBmb3IgUEFML1NFQ0FNIGFuZCBOVFNDIAorLSBCdDg0OAorICBzb21lIChhbGw/PykgY29tZSB3aXRoIDIgY3J5c3RhbHMgZm9yIFBBTC9TRUNBTSBhbmQgTlRTQwogLSBQQUwsIFNFQ0FNIG9yIE5UU0MgVFYgdHVuZXIgKFBoaWxpcHMgb3IgVEVNSUMpCiAtIE1TUDM0eHggc291bmQgZGVjb2RlciBvbiBhZGQgb24gYm9hcmQKLSAgZGVjb2RlciBpcyBzdXBwb3J0ZWQgYnV0IEFGQUlLIGRvZXMgbm90IHlldCB3b3JrIAorICBkZWNvZGVyIGlzIHN1cHBvcnRlZCBidXQgQUZBSUsgZG9lcyBub3QgeWV0IHdvcmsKICAgKG90aGVyIHNvdW5kIE1VWCBzZXR0aW5nIGluIEdQSU8gcG9ydCBuZWVkZWQ/Pz8gc29tZWJvZHkgd2hvIGZpeGVkIHRoaXM/Pz8pCiAtIDEgdHVuZXIsIDEgY29tcG9zaXRlIGFuZCAxIFMtVkhTIGlucHV0CiAtIHR1bmVyIHR5cGUgaXMgYXV0b2RldGVjdGVkCkBAIC03MCw3ICs3MCw3IEBACiBIYXVwcGF1Z2UgV2luL1RWIHBjaQogLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBIYXVwcGF1Z2UgY2FyZHMgd2l0aCBkaWZmZXJlbnQgCitUaGVyZSBhcmUgbWFueSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIEhhdXBwYXVnZSBjYXJkcyB3aXRoIGRpZmZlcmVudAogdHVuZXJzIChUVitSYWRpbyAuLi4pLCB0ZWxldGV4dCBkZWNvZGVycy4KIE5vdGUgdGhhdCBldmVuIGNhcmRzIHdpdGggc2FtZSBtb2RlbCBudW1iZXJzIGhhdmUgKGRlcGVuZGluZyBvbiB0aGUgcmV2aXNpb24pCiBkaWZmZXJlbnQgY2hpcHMgb24gaXQuCkBAIC04MCwyMiArODAsMjIgQEAKIC0gUEFMLCBTRUNBTSwgTlRTQyBvciB0dW5lciB3aXRoIG9yIHdpdGhvdXQgUmFkaW8gc3VwcG9ydAogCiBlLmcuOgotICBQQUw6IAorICBQQUw6CiAgIFREQTU3Mzc6IFZIRiwgaHlwZXJiYW5kIGFuZCBVSEYgbWl4ZXIvb3NjaWxsYXRvciBmb3IgVFYgYW5kIFZDUiAzLWJhbmQgdHVuZXJzCiAgIFRTQTU1MjI6IDEuNCBHSHogSTJDLWJ1cyBjb250cm9sbGVkIHN5bnRoZXNpemVyLCBJMkMgMHhjMi0weGMzCi0gIAorCiAgIE5UU0M6CiAgIFREQTU3MzE6IFZIRiwgaHlwZXJiYW5kIGFuZCBVSEYgbWl4ZXIvb3NjaWxsYXRvciBmb3IgVFYgYW5kIFZDUiAzLWJhbmQgdHVuZXJzCiAgIFRTQTU1MTg6IG5vIGRhdGFzaGVldCBhdmFpbGFibGUgb24gUGhpbGlwcyBzaXRlCi0tIFBoaWxpcHMgU0FBNTI0NiBvciBTQUE1Mjg0ICggb3Igbm8pIFRlbGV0ZXh0IGRlY29kZXIgY2hpcAkKKy0gUGhpbGlwcyBTQUE1MjQ2IG9yIFNBQTUyODQgKCBvciBubykgVGVsZXRleHQgZGVjb2RlciBjaGlwCiAgIHdpdGggYnVmZmVyIFJBTSAoZS5nLiBXaW5ib25kIFcyNDI1N0FTLTM1OiAzMkt4OCBDTU9TIHN0YXRpYyBSQU0pCiAgIFNBQTUyNDYgKEkyQyAweDIyKSBpcyBzdXBwb3J0ZWQKLS0gMjU2IGJ5dGVzIEVFUFJPTTogTWljcm9jaGlwIDI0TEMwMkIgb3IgUGhpbGlwcyA4NTgyRTJZIAorLSAyNTYgYnl0ZXMgRUVQUk9NOiBNaWNyb2NoaXAgMjRMQzAyQiBvciBQaGlsaXBzIDg1ODJFMlkKICAgd2l0aCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCiAgIEkyQyBhZGRyZXNzIDB4YTAgKDI0TEMwMkIgYWxzbyByZXNwb25kcyB0byAweGEyLTB4YWYpCiAtIDEgdHVuZXIsIDEgY29tcG9zaXRlIGFuZCAoZGVwZW5kaW5nIG9uIG1vZGVsKSAxIFMtVkhTIGlucHV0CiAtIDE0MDUyQjogbXV4IGZvciBzZWxlY3Rpb24gb2Ygc291bmQgc291cmNlCi0tIHNvdW5kIGRlY29kZXI6IFREQTk4MDAsIE1TUDM0eHggKHN0ZXJlbyBjYXJkcykgCistIHNvdW5kIGRlY29kZXI6IFREQTk4MDAsIE1TUDM0eHggKHN0ZXJlbyBjYXJkcykKIAogCiBBc2tleSBDUEgtU2VyaWVzCkBAIC0xMDgsMTcgKzEwOCwxNyBAQAogICAgIENQSDA1eDogQlQ4Nzggd2l0aCBGTQogICAgIENQSDA2eDogQlQ4NzggKHcvbyBGTSkKICAgICBDUEgwN3g6IEJUODc4IGNhcHR1cmUgb25seQotIAorCiAgIFRWIHN0YW5kYXJkczoKICAgICAgQ1BIMHgwOiBOVFNDLU0vTQogICAgICBDUEgweDE6IFBBTC1CL0cKICAgICAgQ1BIMHgyOiBQQUwtSS9JCiAgICAgIENQSDB4MzogUEFMLUQvSwotICAgICBDUEgweDQ6IFNFQ0FNLUwvTCAKLSAgICAgQ1BIMHg1OiBTRUNBTS1CL0cgCi0gICAgIENQSDB4NjogU0VDQU0tRC9LIAotICAgICBDUEgweDc6IFBBTC1OL04gCi0gICAgIENQSDB4ODogUEFMLUIvSCAKKyAgICAgQ1BIMHg0OiBTRUNBTS1ML0wKKyAgICAgQ1BIMHg1OiBTRUNBTS1CL0cKKyAgICAgQ1BIMHg2OiBTRUNBTS1EL0sKKyAgICAgQ1BIMHg3OiBQQUwtTi9OCisgICAgIENQSDB4ODogUEFMLUIvSAogICAgICBDUEgweDk6IFBBTC1NL00KIAogICBDUEgwM3ggd2FzIG9mdGVuIHNvbGQgYXMgIlRWIGNhcHR1cmVyIi4KQEAgLTE3NCw3ICsxNzQsNyBAQAogICAgICAgIlRoZSBGbHlWaWRlbzIwMDAgYW5kIEZseVZpZGVvMjAwMHMgcHJvZHVjdCBuYW1lIGhhdmUgcmVuYW1lZCB0byBGbHlWaWRlbzk4LiIKICAgICAgIFRoZWlyIEJ0OHg4IGNhcmRzIGFyZSBsaXN0ZWQgYXMgZGlzY29udGludWVkLgogICAgICAgRmx5dmlkZW8gMjAwMFMgd2FzIHByb2JhYmx5IHNvbGQgYXMgRmx5dmlkZW8gMzAwMCBpbiBzb21lIGNvbnRyaWVzKEV1cm9wZT8pLgotICAgICAgVGhlIG5ldyBGbHl2aWRlbyAyMDAwLzMwMDAgYXJlIFNBQTcxMzAvU0FBNzEzNCBiYXNlZC4gCisgICAgICBUaGUgbmV3IEZseXZpZGVvIDIwMDAvMzAwMCBhcmUgU0FBNzEzMC9TQUE3MTM0IGJhc2VkLgogCiAgICJGbHl2aWRlbyBJSSIgaGFkIGJlZW4gdGhlIG5hbWUgZm9yIHRoZSA4NDggY2FyZHMsIG5vd2FkYXlzIChpbiBHZXJtYW55KQogICB0aGlzIG5hbWUgaXMgcmUtdXNlZCBmb3IgTFI1MCBSZXYuVy4KQEAgLTIzNSwxMiArMjM1LDEyIEBACiAgICBNdWx0aW1lZGlhIFRWIHBhY2thZ2VzIChjYXJkICsgc29mdHdhcmUgcGFjayk6CiAgICBQaXhlbFZpZXcgUGxheSBUViBUaGVhdGVyIC0gKE1vZGVsOiBQVi1NNDIwMCkgPSAgUGl4ZWxWaWV3IFBsYXkgVFYgcHJvICsgU29mdHdhcmUKICAgIFBpeGVsVmlldyBQbGF5IFRWIFBBSyAtICAgICAoTW9kZWw6IFBWLUJUODc4UCsgUkVWIDRFKQotICAgUGl4ZWxWaWV3IFBsYXkgVFYvVkNSIC0gICAgIChNb2RlbDogUFYtTTMyMDAgUkVWIDRDIC8gOEQgLyAxMEEgKSAKKyAgIFBpeGVsVmlldyBQbGF5IFRWL1ZDUiAtICAgICAoTW9kZWw6IFBWLU0zMjAwIFJFViA0QyAvIDhEIC8gMTBBICkKICAgIFBpeGVsVmlldyBTdHVkaW8gUEFLIC0gICAgICAoTW9kZWw6ICAgIE0yMjAwIFJFViA0QyAvIDhEIC8gMTBBICkKICAgIFBpeGVsVmlldyBQb3dlclN0dWRpbyBQQUsgLSAoTW9kZWw6IFBWLU0zNjAwIFJFViA0RSkKICAgIFBpeGVsVmlldyBEaWdpdGFsVkNSIFBBSyAtICAoTW9kZWw6IFBWLU0yNDAwIFJFViA0QyAvIDhEIC8gMTBBICkKIAotICAgUGl4ZWxWaWV3IFBsYXlUViBQQUsgSUkgKFRWL0ZNIGNhcmQgKyB1c2IgY2FtZXJhKSAgUFYtTTM4MDAgCisgICBQaXhlbFZpZXcgUGxheVRWIFBBSyBJSSAoVFYvRk0gY2FyZCArIHVzYiBjYW1lcmEpICBQVi1NMzgwMAogICAgUGl4ZWxWaWV3IFBsYXlUViBYUCBQVi1NNDcwMCxQVi1NNDcwMCh3L0ZNKQogICAgUGl4ZWxWaWV3IFBsYXlUViBEVlIgUFYtTTQ2MDAgIHBhY2thZ2UgY29udGVudHM6UGl4ZWxWaWV3IFBsYXlUViBwcm8sIHdpbmR2ciAmIHZpZGVvTWFpbCBzL3cKIApAQCAtMjU0LDcgKzI1NCw3IEBACiAKICAgIERUVjMwMDAgUFYtRFRWMzAwMFArIERWQi1TIENJID0gVHdpbmhhbiBWUC0xMDMwCiAgICBEVFYyMDAwIERWQi1TID0gVHdpbmhhbiBWUC0xMDIwCi0gICAKKwogICAgVmlkZW8gQ29uZmVyZW5jaW5nOgogICAgUGl4ZWxWaWV3IE1lZXRpbmcgUEFLIC0gKE1vZGVsOiBQVi1CVDg3OFApCiAgICBQaXhlbFZpZXcgTWVldGluZyBQQUsgTGl0ZSAtIChNb2RlbDogUFYtQlQ4NzhQKQpAQCAtMzA4LDcgKzMwOCw3IEBACiAKICAgIG5ld2VyIENhcmRzIGhhdmUgc2FhNzEzNCwgYnV0IG1vZGVsIG5hbWUgc3RheWVkIHRoZSBzYW1lPwogCi1Qcm92aWRlbyAKK1Byb3ZpZGVvCiAtLS0tLS0tLQogICBQVjk1MSBvciBQVi05NTEgKGFsc28gYXJlIHNvbGQgYXM6CiAgICBCb2VkZXIgVFYtRk0gVmlkZW8gQ2FwdHVyZSBDYXJkCkBAIC0zNTMsNyArMzUzLDcgQEAKICAgIEFWZXJUVgogICAgQVZlclRWIFN0ZXJlbwogICAgQVZlclRWIFN0dWRpbyAody9GTSkKLSAgIEFWZXJNZWRpYSBUVjk4IHdpdGggUmVtb3RlIAorICAgQVZlck1lZGlhIFRWOTggd2l0aCBSZW1vdGUKICAgIEFWZXJNZWRpYSBUVi9GTTk4IFN0ZXJlbwogICAgQVZlck1lZGlhIFRWQ0FNOTgKICAgIFRWQ2FwdHVyZSAoQnQ4NDgpCkBAIC0zNzMsNyArMzczLDcgQEAKICAgICgxKSBEYXVnaHRlcmJvYXJkIE1CNjgtQSB3aXRoIFREQTk4MjBUIGFuZCBUREE5ODQwVAogICAgKDIpIFNvbnkgTkU0MVMgc29sZGVyZWQgKHN0ZXJlbyBzb3VuZD8pCiAgICAoMykgRGF1Z2h0ZXJib2FyZCBNMTE4LUEgdy8gcGljIDE2YzU0IGFuZCA0IE1IeiBxdWFydHoKLSAKKwogICAgVVMgc2l0ZSBoYXMgZGlmZmVyZW50IGRyaXZlcnMgZm9yIChhcyBvZiAwOS8yMDAyKToKICAgIEVaIENhcHR1cmUvSW50ZXJDYW0gUENJIChCVC04NDggY2hpcCkKICAgIEVaIENhcHR1cmUvSW50ZXJDYW0gUENJIChCVC04NzggY2hpcCkKQEAgLTQzNyw3ICs0MzcsNyBAQAogICAgVGVycmEgVFZhbHVlUmFkaW8sICAgICAgICAgICAgICJMUjEwMiBSZXYuQyIgcHJpbnRlZCBvbiB0aGUgUENCCiAgICBUZXJyYSBUVi9SYWRpbysgVmVyc2lvbiAxLjAsICAgIjgwLUNQMjgzMDEwMC0wIiBUVFRWMyBwcmludGVkIG9uIHRoZSBQQ0IsCiAJCQkJICAgICAiQ1BIMDEwLUU4MyIgb24gdGhlIGJhY2ssIFNBQTY1ODhULCBUREE5ODczSAotICAgVGVycmEgVFZhbHVlIFZlcnNpb24gQlQ4NzgsICAgICI4MC1DUDI4MzAxMTAtMCBUVFRWNCIgcHJpbnRlZCBvbiB0aGUgUENCLCAKKyAgIFRlcnJhIFRWYWx1ZSBWZXJzaW9uIEJUODc4LCAgICAiODAtQ1AyODMwMTEwLTAgVFRUVjQiIHByaW50ZWQgb24gdGhlIFBDQiwKIAkJCQkgICAgICJDUEgwMTEtRDgzIiBvbiBiYWNrCiAgICBUZXJyYSBUVmFsdWUgVmVyc2lvbiAxLjAgICAgICAgImNlYjEwNS5QQ0IiIChyZWFsbHkgaWRlbnRpY2FsIHRvIFRlcnJhIFRWKyBWZXJzaW9uIDEuMCkKICAgIFRlcnJhIFRWYWx1ZSBOZXcgUmV2aXNpb24JICAiTFIxMDIgUmVjLkMiCkBAIC01MjgsNyArNTI4LDcgQEAKICAgIEtXLTYwNlJTRgogICAgS1ctNjA3QSAoY2FwdHVyZSBvbmx5KQogICAgS1ctNjA4IChab3JhbiBjYXB0dXJlIG9ubHkpCi0gCisKIElPREFUQSAoanApCiAtLS0tLS0KICAgIEdWLUJDVFYvUENJCkBAIC01NDIsMTUgKzU0MiwxNSBAQAogLS0tLS0tLQogICAgV2luRFZSCT0gS3dvcmxkICJLVy1UVkw4NzhSRiIKIAotd3d3LnNpZ21hY29tLmNvLmtyIAord3d3LnNpZ21hY29tLmNvLmtyCiAtLS0tLS0tLS0tLS0tLS0tLS0KLSAgIFNpZ21hIEN5YmVyIFRWIElJIAorICAgU2lnbWEgQ3liZXIgVFYgSUkKIAogd3d3LnNhc2VtLmNvLmtyCiAtLS0tLS0tLS0tLS0tLS0KICAgIExpdHRlIE9uQWlyIFRWCiAKLWhhbWEgCitoYW1hCiAtLS0tCiAgICBUVi9SYWRpby1UdW5lciBDYXJkLCBQQ0kgKE1vZGVsIDQ0Njc3KSA9IENQSDA1MQogCkBAIC02MzgsNyArNjM4LDcgQEAKIAogSmV0d2F5ICh3d3cuamV0d2F5LmNvbS50dykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBKVy1UViA4NzhNIAorICAgSlctVFYgODc4TQogICAgSlctVFYgODc4ICA9IEtXb3JsZCBLVy1UVjg3OFJGCiAKIEdhbGF4aXMKQEAgLTcxNSw3ICs3MTUsNyBAQAogICA4MDkgTXlWaWRlbwogICA4NzIgTXlUVjJHbyBGTQogCi0gCisKICAgNTQ2IFdpblRWIE5vdmEtUyBDSQogICA1NDMgV2luVFYgTm92YQogICA5MDcgTm92YS1TIFVTQgpAQCAtNzM5LDcgKzczOSw3IEBACiAgIDgzMiBNeVRWMkdvCiAgIDg2OSBNeVRWMkdvLUZNCiAgIDgwNSBNeVZpZGVvIChVU0IpCi0gIAorCiAKIE1hdHJpeC1WaXNpb24KIC0tLS0tLS0tLS0tLS0KQEAgLTc2NCw3ICs3NjQsNyBAQAogICAgSW50ZXJ2aXNpb24gSVYtNTUwIChidDh4OCkKICAgIEludGVydmlzaW9uIElWLTEwMCAoem9yYW4pCiAgICBJbnRlcnZpc2lvbiBJVi0xMDAwIChidDh4OCkKLSAgIAorCiBBc29uaWMgKHd3dy5hc29uaWMuY29tLmNuKSAod2Vic2l0ZSBkb3duKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNreUV5ZSB0diA4NzgKQEAgLTgwNCwxMSArODA0LDExIEBACiAKIEpUVC8gSnVzdHkgQ29ycC5odHRwOi8vd3d3Lmp1c3R5LmNvLmpwLyAod3d3Lmp0dC5jb20uanAgd2Vic2l0ZSBkb3duKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICBKVFQtMDIgKEpUVCBUVikgIlRWIHdhdGNobWF0ZSBwcm8iIChidDg0OCkgCisgICBKVFQtMDIgKEpUVCBUVikgIlRWIHdhdGNobWF0ZSBwcm8iIChidDg0OCkKIAogQURTIHd3dy5hZHN0ZWNoLmNvbQogLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgQ2hhbm5lbCBTdXJmZXIgVFYgKCBDSFgtOTUwICkgCisgICBDaGFubmVsIFN1cmZlciBUViAoIENIWC05NTAgKQogICAgQ2hhbm5lbCBTdXJmZXIgVFYrRk0gKCBDSFgtOTYwRk0gKQogCiBBVkVDIHd3dy5wcm9jaGlwcy5jb20KQEAgLTg3NCw3ICs4NzQsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBGYWxjb24gU2VyaWVzIChjYXB0dXJlIG9ubHkpCiAgSW4gVVNBOiBodHRwOi8vd3d3LnRoZWltYWdpbmdzb3VyY2UuY29tLwotICAgREZHL0xDMQkKKyAgIERGRy9MQzEKIAogd3d3LnNrbmV0LXdlYi5jby5qcAogLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODkwLDcgKzg5MCw3IEBACiAgICBDeWJlck1haWwgWHRyZW1lCiAgIFRoZXNlIGFyZSBGbHl2aWRlbwogCi1WQ1IgKGh0dHA6Ly93d3cudmNyaW5jLmNvbS8pIAorVkNSIChodHRwOi8vd3d3LnZjcmluYy5jb20vKQogLS0tCiAgIFZpZGVvIENhdGNoZXIgMTYKIApAQCAtOTIwLDcgKzkyMCw3IEBACiAgICAgU0RJIFNpbGsgMjAwIFNESSBJbnB1dCBDYXJkCiAKIHd3dy5ldXJlc3lzLmNvbQotICAgIFBJQ09MTyBzZXJpZXMgCisgICAgUElDT0xPIHNlcmllcwogCiBQTUMvUGFjZQogd3d3LnBhY2Vjb20uY28udWsgd2Vic2l0ZSBjbG9zZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvaGF1cHBhdWdlLXdpbnR2LWN4ODgtaXIudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9oYXVwcGF1Z2Utd2ludHYtY3g4OC1pci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmZWMzMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvaGF1cHBhdWdlLXdpbnR2LWN4ODgtaXIudHh0CkBAIC0wLDAgKzEsNTQgQEAKK1RoZSBjb250cm9scyBmb3IgdGhlIG11eCBhcmUgR1BJTyBbMCwxXSBmb3Igc291cmNlLCBhbmQgR1BJTyAyIGZvciBtdXRpbmcuCisKK0dQSU8wICBHUElPMQorICAwICAgICAgICAwICAgIFRWIEF1ZGlvCisgIDEgICAgICAgIDAgICAgRk0gcmFkaW8KKyAgMCAgICAgICAgMSAgICBMaW5lLUluCisgIDEgICAgICAgIDEgICAgTW9ubyB0dW5lciBieXBhc3Mgb3IgQ0QgcGFzc3RocnUgKHR1bmVyIHNwZWNpZmljKQorCitHUElPIDE2KGkgYmVsaWV2ZSkgaXMgdGllZCB0byB0aGUgSVIgcG9ydCAoaWYgcHJlc2VudCkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis+RnJvbSB0aGUgZGF0YSBzaGVldDoKKyBSZWdpc3RlciAyNCdoMjAwMDQgIFBDSSBJbnRlcnJ1cHQgU3RhdHVzCisgIGJpdCBbMThdICBJUl9TTVBfSU5UIFNldCB3aGVuIDMyIGlucHV0IHNhbXBsZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZCBvdmVyCisgIGdwaW9bMTZdIHBpbiBpbnRvIEdQX1NBTVBMRSByZWdpc3Rlci4KKworV2hhdCdzIG1pc3NpbmcgZnJvbSB0aGUgZGF0YSBzaGVldDoKKworU2V0dXAgNEtIeiBzYW1wbGluZyByYXRlIChyb3VnaGx5IDJ4IG92ZXJzYW1wbGVkOyBnb29kIGVub3VnaCBmb3Igb3VyIFJDNQorY29tcGF0IHJlbW90ZSkKK3NldCByZWdpc3RlciAweDM1QzA1MCB0byAgMHhhODBhODAKKworZW5hYmxlIHNhbXBsaW5nCitzZXQgcmVnaXN0ZXIgMHgzNUMwNTQgdG8gMHg1CisKK09mIGNvdXJzZSwgZW5hYmxlIHRoZSBJUlEgYml0IDE4IGluIHRoZSBpbnRlcnJ1cHQgbWFzayByZWdpc3RlciAuKGFuZAorcHJvdmlkZSBmb3IgYSBoYW5kbGVyKQorCitHUF9TQU1QTEUgcmVnaXN0ZXIgaXMgYXQgMHgzNUMwNTgKKworQml0cyBhcmUgdGhlbiByaWdodCBzaGlmdGVkIGludG8gdGhlIEdQX1NBTVBMRSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkCityYXRlOyB5b3UgZ2V0IGFuIGludGVycnVwdCB3aGVuIGEgZnVsbCBEV09SRCBpcyByZWNpZXZlZC4KK1lvdSBuZWVkIHRvIHJlY292ZXIgdGhlIGFjdHVhbCBSQzUgYml0cyBvdXQgb2YgdGhlIChvdmVyc2FtcGxlZCkgSVIgc2Vuc29yCitiaXRzLiAoSGludDogbG9vayBmb3IgdGhlIDAvMWFuZCAxLzAgY3Jvc3NpbmdzIG9mIHRoZSBSQzUgYmktcGhhc2UgZGF0YSkgIEFuCithY3R1YWwgcmF3IFJDNSBjb2RlIHdpbGwgc3BhbiAyLTMgRFdPUkRTLCBkZXBlbmRpbmcgb24gdGhlIGFjdHVhbCBhbGlnbm1lbnQuCisKK0knbSBwcmV0dHkgc3VyZSB3aGVuIG5vIElSIHNpZ25hbCBpcyBwcmVzZW50IHRoZSByZWNlaXZlciBpcyBhbHdheXMgaW4gYQorbWFya2luZyBzdGF0ZSgxKTsgYnV0IHN0cmF5IGxpZ2h0LCBldGMgY2FuIGNhdXNlIGludGVybWl0dGVudCBub2lzZSB2YWx1ZXMKK2FzIHdlbGwuICBSZW1lbWJlciwgdGhpcyBpcyBhIGZyZWUgcnVubmluZyBzYW1wbGUgb2YgdGhlIElSIHJlY2VpdmVyIHN0YXRlCitvdmVyIHRpbWUsIHNvIGRvbid0IGFzc3VtZSBhbnkgc2FtcGxlIHN0YXJ0cyBhdCBhbnkgcGFydGljdWxhciBwbGFjZS4KKworaHR0cDovL3d3dy5hdG1lbC5jb20vZHluL3Jlc291cmNlcy9wcm9kX2RvY3VtZW50cy9kb2MyODE3LnBkZgorVGhpcyBkYXRhIHNoZWV0IChnb29nbGUgc2VhcmNoKSBzZWVtcyB0byBoYXZlIGEgbG92ZWx5IGRlc2NyaXB0aW9uIG9mIHRoZQorUkM1IGJhc2ljcworCitodHRwOi8vdXNlcnMucGFuZG9yYS5iZS9uZW55YS9lbGVjdHJvbmljcy9yYzUvICBhbmQgbW9yZSBkYXRhCisKK2h0dHA6Ly93d3cuZWUud2FzaGluZ3Rvbi5lZHUvY2lyY3VpdF9hcmNoaXZlL3RleHQvaXJfZGVjb2RlLnR4dAorYW5kIGV2ZW4gYSByZWZlcmVuY2UgdG8gaG93IHRvIGRlY29kZSBhIGJpLXBoYXNlIGRhdGEgc3RyZWFtLgorCitodHRwOi8vd3d3LnhzNGFsbC5ubC9+c2JwL2tub3dsZWRnZS9pci9yYzUuaHRtCitzdGlsbCBtb3JlIGluZm8KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9saWZldmlldy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2xpZmV2aWV3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDdlYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9saWZldmlldy50eHQKQEAgLTAsMCArMSw0MiBAQAorY29sbGVjdGluZyBkYXRhIGFib3V0IHRoZSBsaWZldmlldyBtb2RlbHMgYW5kIHRoZSBjb25maWcgY29kaW5nIG9uCitncGlvIHBpbnMgMC05IC4uLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2J0ODc4OgorIExSNTAgcmV2LiBRICgiUEFSVFM6IDcwMzE1MDUxMTYpLCBUdW5lciB3dXJkZSBhbHMgTnIuIDUgZXJrYW5udCwgRWluZ8OkbmdlCisgU1ZpZGVvLCBUViwgQ29tcG9zaXRlLCBBdWRpbywgUmVtb3RlLiBDUDkuLjE9MTAwMDAxMDAxICgxOiAwLU9obS1XaWRlcnN0YW5kCisgZ2VnZW4gR05EIHVuYmVzdMO8Y2t0OyAwOiBiZXN0w7xja3QpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzYWE3MTM0OgorICAgICAgICAgICAgICAgIC8qIExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIEZNIChMUjIxNFdGKSAqLworICAgICAgICAgICAgICAgIC8qICJQZXRlciBNaXNzZWwgPHBldGVyLm1pc3NlbEBvbmxpbmVob21lLmRlPiAqLworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlUViBQbGF0aW51bSBGTSIsCisgICAgICAgICAgICAgICAgLyogICAgICBHUDI3ICAgIE1EVDIwMDUgUEI0IHBpbiAxMCAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AyNiAgICBNRFQyMDA1IFBCMyBwaW4gOSAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AyNSAgICBNRFQyMDA1IFBCMiBwaW4gOCAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AyMyAgICBNRFQyMDA1IFBCMSBwaW4gNyAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AyMiAgICBNRFQyMDA1IFBCMCBwaW4gNiAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AyMSAgICBNRFQyMDA1IFBCNSBwaW4gMTEgKi8KKyAgICAgICAgICAgICAgICAvKiAgICAgIEdQMjAgICAgTURUMjAwNSBQQjYgcGluIDEyICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDE5ICAgIE1EVDIwMDUgUEI3IHBpbiAxMyAqLworICAgICAgICAgICAgICAgIC8qICAgICAgbmMgICAgICBNRFQyMDA1IFBBMyBwaW4gMiAqLworICAgICAgICAgICAgICAgIC8qICAgICAgUmVtb3RlICBNRFQyMDA1IFBBMiBwaW4gMSAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AxOCAgICBNRFQyMDA1IFBBMSBwaW4gMTggKi8KKyAgICAgICAgICAgICAgICAvKiAgICAgIG5jICAgICAgTURUMjAwNSBQQTAgcGluIDE3IHN0cmFwIGxvdyAqLworCisgICAgICAgICAgICAgICAgLyogICAgICBHUDE3ICAgIFN0cmFwICJHUDciPUhpZ2ggKi8KKyAgICAgICAgICAgICAgICAvKiAgICAgIEdQMTYgICAgU3RyYXAgIkdQNiI9SGlnaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPVJhZGlvIDE9VFYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVzIFNBNjMwRCBFTkNIMSBhbmQgSEVGNDA1MiBBMSBwaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGRvIEZNIHJhZGlvIHRocm91Z2ggU0lGIGlucHV0ICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDE1ICAgIG5jICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDE0ICAgIG5jICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDEzICAgIG5jICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDEyICAgIFN0cmFwICJHUDUiID0gSGlnaCAqLworICAgICAgICAgICAgICAgIC8qICAgICAgR1AxMSAgICBTdHJhcCAiR1A0IiA9IEhpZ2ggKi8KKyAgICAgICAgICAgICAgICAvKiAgICAgIEdQMTAgICAgU3RyYXAgIkdQMyIgPSBIaWdoICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDA5ICAgIFN0cmFwICJHUDIiID0gTG93ICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDA4ICAgIFN0cmFwICJHUDEiID0gTG93ICovCisgICAgICAgICAgICAgICAgLyogICAgICBHUDA3LjAwIG5jICovCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L25vdC1pbi1jeDIzODh4LWRhdGFzaGVldC50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L25vdC1pbi1jeDIzODh4LWRhdGFzaGVldC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiZmU3NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvbm90LWluLWN4MjM4OHgtZGF0YXNoZWV0LnR4dApAQCAtMCwwICsxLDQxIEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01PX09VVFBVVF9GT1JNQVQgKDB4MzEwMTY0KQorCisgIFByZXZpb3VzIGRlZmF1bHQgZnJvbSBEU2NhbGVyOiAweDFjMWYwMDA4CisgIERpZ2l0IDg6IDMxLTI4CisgIDI4OiBQUkVWUkVNT0QgPSAxCisKKyAgRGlnaXQgNzogMjctMjQgKDB4YyA9IDEyID0gYjExMDAgKQorICAyNzogQ09NQkFMVCA9IDEKKyAgMjY6IFBBTF9JTlZfUEhBU0UKKyAgICAoRFNjYWxlciBhcHBhcmVudGx5IHNldCB0aGlzIHRvIDEsIHJlc3VsdGVkIGluIHN1Y2t5IHBpY3R1cmUpCisKKyAgRGlnaXRzIDYsNTogMjMtMTYKKyAgMjUtMTY6IENPTUJfUkFOR0UgPSAweDFmIFtkZWZhdWx0XSAoOSBiaXRzIC0+IG1heCA1MTIpCisKKyAgRGlnaXQgNDogMTUtMTIKKyAgMTU6IERJU0lGWCA9IDAKKyAgMTQ6IElOVkNCRiA9IDAKKyAgMTM6IERJU0FEQVBUID0gMAorICAxMjogTkFSUk9XQURBUFQgPSAwCisKKyAgRGlnaXQgMzogMTEtOAorICAxMTogRk9SQ0UySAorICAxMDogRk9SQ0VSRU1ECisgIDk6IE5DSFJPTUFFTgorICA4OiBOUkVNT0RFTgorCisgIERpZ2l0IDI6IDctNAorICA3LTY6IFlDT1JFCisgIDUtNDogQ0NPUkUKKworICBEaWdpdCAxOiAzLTAKKyAgMzogUkFOR0UgPSAxCisgIDI6IEhBQ1RFWFQKKyAgMTogSFNGTVQKKworMHg0NyBpcyB0aGUgc3luYyBieXRlIGZvciBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSBwYWNrZXRzLgorRGF0YXNoZWV0IGluY29ycmVjdGx5IHN0YXRlcyB0byB1c2UgNDcgZGVjaW1hbC4gMTg4IGlzIHRoZSBsZW5ndGguCitBbGwgRFZCIGNvbXBsaWFudCBmcm9udGVuZHMgb3V0cHV0IHBhY2tldHMgd2l0aCB0aGlzIHN0YXJ0IGNvZGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCA2NTFhZjUwLi41ZDAxNDcyIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMzcwLDYgKzM3MCwxMCBAQAogVzoJaHR0cDovL2F0bWVsd2xhbmRyaXZlci5zb3VyY2Vmb3JnZS5uZXQvCiBTOglNYWludGFpbmVkCiAKK0FVRElUIFNVQlNZU1RFTQorTDoJbGludXgtYXVkaXRAcmVkaGF0LmNvbSAoc3Vic2NyaWJlcnMtb25seSkKK1M6CU1haW50YWluZWQKKwogQVguMjUgTkVUV09SSyBMQVlFUgogUDoJUmFsZiBCYWVjaGxlCiBNOglyYWxmQGxpbnV4LW1pcHMub3JnCkBAIC01MTIsMTEgKzUxNiwxMSBAQAogUzoJU3VwcG9ydGVkCiAKIEJUVFYgVklERU80TElOVVggRFJJVkVSCi1QOglHZXJkIEtub3JyCi1NOglrcmF4ZWxAYnl0ZXNleC5vcmcKK1A6CU1hdXJvIENhcnZhbGhvIENoZWhhYgorTToJbWNoZWhhYkBicnR1cmJvLmNvbS5icgogTDoJdmlkZW80bGludXgtbGlzdEByZWRoYXQuY29tCi1XOglodHRwOi8vYnl0ZXNleC5vcmcvYnR0di8KLVM6CU9ycGhhbgorVzoJaHR0cDovL2xpbnV4dHYub3JnCitTOglNYWludGFpbmVkCiAKIEJVU0xPR0lDIFNDU0kgRFJJVkVSCiBQOglMZW9uYXJkIE4uIFp1YmtvZmYKQEAgLTU3NiwxMCArNTgwLDkgQEAKIAogQ09NUFVUT05FIElOVEVMTElQT1JUIE1VTFRJUE9SVCBDQVJECiBQOglNaWNoYWVsIEguIFdhcmZpZWxkCi1NOglNaWNoYWVsIEguIFdhcmZpZWxkIDxtaHdAd2l0dHNlbmQuY29tPgorTToJbWh3QHdpdHRzZW5kLmNvbQogVzoJaHR0cDovL3d3dy53aXR0c2VuZC5jb20vY29tcHV0b25lLmh0bWwKLUw6CWxpbnV4LWNvbXB1dG9uZUBsYXp1bGkud2l0dHNlbmQuY29tCi1TOglPcnBoYW5lZAorUzoJTWFpbnRhaW5lZAogCiBDT1NBL1NSUCBTWU5DIFNFUklBTCBEUklWRVIKIFA6CUphbiAiWWVueWEiIEthc3ByemFrCkBAIC0xMTUwLDcgKzExNTMsNyBAQAogCiBJTkZJTklCQU5EIFNVQlNZU1RFTQogUDoJUm9sYW5kIERyZWllcgotTToJcm9sYW5kQHRvcHNwaW4uY29tCitNOglyb2xhbmRkQGNpc2NvLmNvbQogUDoJU2VhbiBIZWZ0eQogTToJbXNoZWZ0eUBpY2hpcHMuaW50ZWwuY29tCiBQOglIYWwgUm9zZW5zdG9jawpAQCAtMTIzNyw3ICsxMjQwLDcgQEAKIAogSVJEQSBTVUJTWVNURU0KIFA6CUplYW4gVG91cnJpbGhlcwotTDoJaXJkYS11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK0w6CWlyZGEtdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0IChzdWJzY3JpYmVycy1vbmx5KQogVzoJaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LwogUzoJTWFpbnRhaW5lZAogCkBAIC0xMzMwLDYgKzEzMzMsMTYgQEAKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIAorS0VYRUMKK1A6CUVyaWMgQmllZGVybWFuCitQOglSYW5keSBEdW5sYXAKK006CWViaWVkZXJtQHhtaXNzaW9uLmNvbQorTToJcmRkdW5sYXBAb3NkbC5vcmcKK1c6CWh0dHA6Ly93d3cueG1pc3Npb24uY29tL35lYmllZGVybS9maWxlcy9rZXhlYy8KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK0w6CWZhc3Rib290QG9zZGwub3JnCitTOglNYWludGFpbmVkCisKIExBTk1FRElBIFdBTiBDQVJEIERSSVZFUgogUDoJQW5kcmV3IFN0YW5sZXktSm9uZXMKIE06CWFzakBsYW5tZWRpYS5jb20KQEAgLTE3OTQsOCArMTgwNyw5IEBACiBTOglNYWludGFpbmVkCiAKIFBDTUNJQSBTVUJTWVNURU0KK1A6CUxpbnV4IFBDTUNJQSBUZWFtCiBMOglodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBjbWNpYQotUzoJVW5tYWludGFpbmVkCitTOglNYWludGFpbmVkCiAKIFBDTkVUMzIgTkVUV09SSyBEUklWRVIKIFA6CVRob21hcyBCb2dlbmT2cmZlcgpAQCAtMjExNSw5ICsyMTI5LDcgQEAKIFNPRlRXQVJFIFNVU1BFTkQ6CiBQOglQYXZlbCBNYWNoZWsKIE06CXBhdmVsQHN1c2UuY3oKLU06CXBhdmVsQHVjdy5jegotTDoJaHR0cDovL2xpc3Rlci5mb3JuYXguaHUvbWFpbG1hbi9saXN0aW5mby9zd3N1c3AKLVc6CWh0dHA6Ly9zd3N1c3Auc2YubmV0LworTDoJbGludXgtcG1Ab3NkbC5vcmcKIFM6CU1haW50YWluZWQKIAogU09OSUMgTkVUV09SSyBEUklWRVIKQEAgLTIxNDUsMTEgKzIxNTcsMTYgQEAKIEw6CXRwbWRkLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogCitURU5TSUxJQ0EgWFRFTlNBIFBPUlQgKHh0ZW5zYSk6CitQOglDaHJpcyBaYW5rZWwKK006CWNocmlzQHphbmtlbC5uZXQKK1M6CU1haW50YWluZWQKKwogVWx0cmFTUEFSQyAoc3BhcmM2NCk6CiBQOglEYXZpZCBTLiBNaWxsZXIKIE06CWRhdmVtQGRhdmVtbG9mdC5uZXQKIFA6CUVkZGllIEMuIERvc3QKLU06CWVjZEBza3luZXQuYmUKK006CWVjZEBicmFpbmFpZC5kZQogUDoJSmFrdWIgSmVsaW5lawogTToJampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jegogUDoJQW50b24gQmxhbmNoYXJkCkBAIC0yNTg5LDcgKzI2MDYsNyBAQAogUDoJRC4gSmVmZiBEaW9ubmUgKGNyZWF0ZWQgZmlyc3QgdUNsaW51eCBwb3J0KQogTToJamVmZkB1Y2xpbnV4Lm9yZwogVzoJaHR0cDovL3d3dy51Y2xpbnV4Lm9yZy8KLUw6CXVjbGludXgtZGV2QHVjbGludXgub3JnCitMOgl1Y2xpbnV4LWRldkB1Y2xpbnV4Lm9yZyAgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglNYWludGFpbmVkCiAKIFVDTElOVVggRk9SIE5FQyBWODUwCkBAIC0yNjEzLDEwICsyNjMwLDExIEBACiBTOglNYWludGFpbmVkCiAKIFZJREVPIEZPUiBMSU5VWAotUDoJR2VyZCBLbm9ycgotTToJa3JheGVsQGJ5dGVzZXgub3JnCitQOglNYXVybyBDYXJ2YWxobyBDaGVoYWIKK006CW1jaGVoYWJAYnJ0dXJiby5jb20uYnIKIEw6CXZpZGVvNGxpbnV4LWxpc3RAcmVkaGF0LmNvbQotUzoJT3JwaGFuCitXOglodHRwOi8vbGludXh0di5vcmcKK1M6CU1haW50YWluZWQKIAogVzEgREFMTEFTJ1MgMS1XSVJFIEJVUwogUDoJRXZnZW5peSBQb2x5YWtvdgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBmYWQzNDk3Li5jZjM0YTZiIDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSAyCiBQQVRDSExFVkVMID0gNgotU1VCTEVWRUwgPSAxMgotRVhUUkFWRVJTSU9OID0KK1NVQkxFVkVMID0gMTMKK0VYVFJBVkVSU0lPTiA9LXJjMwogTkFNRT1Xb296eSBOdW1iYXQKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTI4MSw3ICsyODEsNyBAQAogIyBTZWUgZG9jdW1lbnRhdGlvbiBpbiBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CiAKICMgY2Mtb3B0aW9uCi0jIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgZ2NjLW9wdGlvbiwgLW1hcmNoPXdpbmNoaXAtYzYsIC1tYXJjaD1pNTg2KQorIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwgLW1hcmNoPXdpbmNoaXAtYzYsIC1tYXJjaD1pNTg2KQogCiBjYy1vcHRpb24gPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAkKDEpIC1TIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsIFwKICAgICAgICAgICAgICA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQpAQCAtNzkyLDYgKzc5Miw5IEBACiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChARCkgJEAKICUubzogJS5jIHNjcmlwdHMgRk9SQ0UKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKEBEKSAkQAorJS5rbzogc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgJChidWlsZCk9JChARCkgJChAOi5rbz0ubykKKwkkKFEpJChNQUtFKSAtclIgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKICUvOiAgICAgIHNjcmlwdHMgcHJlcGFyZSBGT1JDRQogCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgJChidWlsZCk9JChARCkKICUubHN0OiAlLmMgc2NyaXB0cyBGT1JDRQpAQCAtMTAzMyw2ICsxMDM2LDcgQEAKIAlAZWNobyAgJyAgbW9kdWxlc19pbnN0YWxsIC0gSW5zdGFsbCBhbGwgbW9kdWxlcycKIAlAZWNobyAgJyAgZGlyLyAgICAgICAgICAgIC0gQnVpbGQgYWxsIGZpbGVzIGluIGRpciBhbmQgYmVsb3cnCiAJQGVjaG8gICcgIGRpci9maWxlLltvaXNdICAtIEJ1aWxkIHNwZWNpZmllZCB0YXJnZXQgb25seScKKwlAZWNobyAgJyAgZGlyL2ZpbGUua28gICAgIC0gQnVpbGQgbW9kdWxlIGluY2x1ZGluZyBmaW5hbCBsaW5rJwogCUBlY2hvICAnICBycG0JCSAgLSBCdWlsZCBhIGtlcm5lbCBhcyBhbiBSUE0gcGFja2FnZScKIAlAZWNobyAgJyAgdGFncy9UQUdTCSAgLSBHZW5lcmF0ZSB0YWdzIGZpbGUgZm9yIGVkaXRvcnMnCiAJQGVjaG8gICcgIGNzY29wZQkgIC0gR2VuZXJhdGUgY3Njb3BlIGluZGV4JwpAQCAtMTE0OSw3ICsxMTUzLDcgQEAKICMod2hpY2ggaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UgSU1ITykgdG8gYXZvaWQgdW5uZWVkZWQgY2x1dHRlciBpbiB0aGUgYmlnIHRhZ3MgZmlsZS4KICNBZGRpbmcgJChzcmN0cmVlKSBhZGRzIGFib3V0IDIwTSBvbiBpMzg2IHRvIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgZmlsZSEKIAotaWZlcSAoJChLQlVJTERfT1VUUFVUKSwpCitpZmVxICgkKHNyYyksJChvYmopKQogX19zcmN0cmVlID0KIGVsc2UKIF9fc3JjdHJlZSA9ICQoc3JjdHJlZSkvCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL0tjb25maWcgYi9hcmNoL2FscGhhL0tjb25maWcKaW5kZXggYzU3MzlkNi4uMDgzYzVkZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9LY29uZmlnCisrKyBiL2FyY2gvYWxwaGEvS2NvbmZpZwpAQCAtNTk2LDYgKzU5Niw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2lycV9hbHBoYS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMKaW5kZXggZTZkZWQzMy4uOWQzNGNlMiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvaXJxX2FscGhhLmMKQEAgLTU1LDYgKzU1LDggQEAKICNpZmRlZiBDT05GSUdfU01QCiAJICB7CiAJCWxvbmcgY3B1OworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCXNtcF9wZXJjcHVfdGltZXJfaW50ZXJydXB0KHJlZ3MpOwogCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJCWlmIChjcHUgIT0gYm9vdF9jcHVpZCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3RyYXBzLmMKaW5kZXggZmQ3YmQxNy4uNmY1MDlhNiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC90cmFwcy5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbm8sIGNvZGU7CiAKLQlpZiAocmVncy0+cHMgPT0gMCkgeworCWlmICgocmVncy0+cHMgJiB+SVBMX01BWCkgPT0gMCkgewogCQlpZiAodHlwZSA9PSAxKSB7CiAJCQljb25zdCB1bnNpZ25lZCBpbnQgKmRhdGEKIAkJCSAgPSAoY29uc3QgdW5zaWduZWQgaW50ICopIHJlZ3MtPnBjOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggMDdiYTc3Yy4uN2JjNGE1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xNTcsNyArMTU3LDcgQEAKIGNvbmZpZyBBUkNIX1NBMTEwMAogCWJvb2wgIlNBMTEwMC1iYXNlZCIKIAlzZWxlY3QgSVNBCi0Jc2VsZWN0IERJU0NPTlRJR01FTQorCXNlbGVjdCBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAogY29uZmlnIEFSQ0hfUzNDMjQxMAogCWJvb2wgIlNhbXN1bmcgUzNDMjQxMCIKQEAgLTIyMyw3ICsyMjMsOSBAQAogCiBzb3VyY2UgImFyY2gvYXJtL21hY2gtc2ExMTAwL0tjb25maWciCiAKLXNvdXJjZSAiYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWciCitzb3VyY2UgImFyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIgorCitzb3VyY2UgImFyY2gvYXJtL21hY2gtb21hcDEvS2NvbmZpZyIKIAogc291cmNlICJhcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZyIKIApAQCAtMzQ2LDYgKzM0OCwyNiBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3AsIGVtYmVkZGVkCiAJICBvciByZWFsLXRpbWUgc3lzdGVtLiAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCiAKK2NvbmZpZyBOT19JRExFX0haCisJYm9vbCAiRHluYW1pYyB0aWNrIHRpbWVyIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGNvbnRpbnVvdXMgdGltZXIgdGlja3MKKwkgIGFuZCBoYXZlIHRoZW0gcHJvZ3JhbW1lZCB0byBvY2N1ciBhcyByZXF1aXJlZC4gVGhpcyBvcHRpb24gc2F2ZXMKKwkgIHBvd2VyIGFzIHRoZSBzeXN0ZW0gY2FuIHJlbWFpbiBpbiBpZGxlIHN0YXRlIGZvciBsb25nZXIuCisKKwkgIEJ5IGRlZmF1bHQgZHluYW1pYyB0aWNrIGlzIGRpc2FibGVkIGR1cmluZyB0aGUgYm9vdCwgYW5kIGNhbiBiZQorCSAgbWFudWFsbHkgZW5hYmxlZCB3aXRoOgorCisJICAgIGVjaG8gMSA+IC9zeXMvZGV2aWNlcy9zeXN0ZW0vdGltZXIvdGltZXIwL2R5bl90aWNrCisKKwkgIEFsdGVybmF0aXZlbHksIGlmIHlvdSB3YW50IGR5bmFtaWMgdGljayBhdXRvbWF0aWNhbGx5IGVuYWJsZWQKKwkgIGR1cmluZyBib290LCBwYXNzICJkeW50aWNrPWVuYWJsZSIgdmlhIHRoZSBrZXJuZWwgY29tbWFuZCBzdHJpbmcuCisKKwkgIFBsZWFzZSBub3RlIHRoYXQgZHluYW1pYyB0aWNrIG1heSBhZmZlY3QgdGhlIGFjY3VyYWN5IG9mCisJICB0aW1la2VlcGluZyBvbiBzb21lIHBsYXRmb3JtcyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgorCSAgQ3VycmVudGx5IGF0IGxlYXN0IE9NQVAgcGxhdGZvcm0gaXMga25vd24gdG8gaGF2ZSBhY2N1cmF0ZQorCSAgdGltZWtlZXBpbmcgd2l0aCBkeW5hbWljIHRpY2suCisKIGNvbmZpZyBBUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUKIAlib29sCiAJZGVmYXVsdCAoQVJDSF9MSDdBNDBYICYmICFMSDdBNDBYX0NPTlRJR01FTSkKQEAgLTQ5NCw3ICs1MTYsNyBAQAogCiBlbmRtZW51CiAKLWlmIChBUkNIX1NBMTEwMCB8fCBBUkNIX0lOVEVHUkFUT1IpCitpZiAoQVJDSF9TQTExMDAgfHwgQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfT01BUDEpCiAKIG1lbnUgIkNQVSBGcmVxdWVuY3kgc2NhbGluZyIKIApAQCAtNjc4LDYgKzcwMCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogbWVudSAiRGV2aWNlIERyaXZlcnMiCiAKIHNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCkBAIC03MTAsNyArNzM0LDcgQEAKIAogc291cmNlICJkcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL0tjb25maWciCiAKQEAgLTcyMiw2ICs3NDYsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvaTJjL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgorCiAjc291cmNlICJkcml2ZXJzL2wzL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9taXNjL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDgzMzA0OTUuLjY3ZjE0NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC01Niw3ICs1Niw3IEBACiB0dW5lLSQoQ09ORklHX0NQVV9WNikJCTo9LW10dW5lPXN0cm9uZ2FybQogCiAjIE5lZWQgLVVhcm0gZm9yIGdjYyA8IDMueAotQ0ZMQUdTX0FCSQk6PSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KQorQ0ZMQUdTX0FCSQk6PSQoY2FsbCBjYy1vcHRpb24sLW1hcGNzLTMyLC1tYWJpPWFwY3MtZ251KSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tdGh1bWItaW50ZXJ3b3JrLCkKIENGTEFHUwkJKz0kKENGTEFHU19BQkkpICQoYXJjaC15KSAkKHR1bmUteSkgJChjYWxsIGNjLW9wdGlvbiwtbXNob3J0LWxvYWQtYnl0ZXMsJChjYWxsIGNjLW9wdGlvbiwtbWFsaWdubWVudC10cmFwcywpKSAtbXNvZnQtZmxvYXQgLVVhcm0KIEFGTEFHUwkJKz0kKENGTEFHU19BQkkpICQoYXJjaC15KSAkKHR1bmUteSkgLW1zb2Z0LWZsb2F0CiAKQEAgLTkxLDcgKzkxLDggQEAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSU9QM1hYKQkgICA6PSBpb3AzeHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSVhQNFhYKQkgICA6PSBpeHA0eHgKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfSVhQMjAwMCkgICAgOj0gaXhwMjAwMAotIG1hY2hpbmUtJChDT05GSUdfQVJDSF9PTUFQKQkgICA6PSBvbWFwCisgbWFjaGluZS0kKENPTkZJR19BUkNIX09NQVAxKQkgICA6PSBvbWFwMQorICBpbmNkaXItJChDT05GSUdfQVJDSF9PTUFQKQkgICA6PSBvbWFwCiAgbWFjaGluZS0kKENPTkZJR19BUkNIX1MzQzI0MTApCSAgIDo9IHMzYzI0MTAKICBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfTEg3QTQwWCkJICAgOj0gbGg3YTQweAogIG1hY2hpbmUtJChDT05GSUdfQVJDSF9WRVJTQVRJTEUpICA6PSB2ZXJzYXRpbGUKQEAgLTE0Miw2ICsxNDMsOSBAQAogY29yZS0kKENPTkZJR19GUEVfRkFTVEZQRSkJKz0gJChGQVNURlBFX09CSikKIGNvcmUtJChDT05GSUdfVkZQKQkJKz0gYXJjaC9hcm0vdmZwLwogCisjIElmIHdlIGhhdmUgYSBjb21tb24gcGxhdGZvcm0gZGlyZWN0b3J5LCB0aGVuIGluY2x1ZGUgaXQgaW4gdGhlIGJ1aWxkLgorY29yZS0kKENPTkZJR19BUkNIX09NQVApCSs9IGFyY2gvYXJtL3BsYXQtb21hcC8KKwogZHJpdmVycy0kKENPTkZJR19PUFJPRklMRSkgICAgICArPSBhcmNoL2FybS9vcHJvZmlsZS8KIGRyaXZlcnMtJChDT05GSUdfQVJDSF9DTFBTNzUwMCkJKz0gZHJpdmVycy9hY29ybi9jaGFyLwogZHJpdmVycy0kKENPTkZJR19BUkNIX0w3MjAwKQkrPSBkcml2ZXJzL2Fjb3JuL2NoYXIvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2VucDI2MTFfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9lbnAyNjExX2RlZmNvbmZpZwppbmRleCAwNmZhZTRiLi5mNjdjYTAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2VucDI2MTFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvZW5wMjYxMV9kZWZjb25maWcKQEAgLTEsMTQgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMjI6MDg6MjQgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQxOjIxIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE2LDYgKzE1LDcgQEAKIENPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX0NMRUFOX0NPTVBJTEU9eQogQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM1LDYgKzM1LDggQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgyLDYgKzg0LDcgQEAKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOPXkKIAogIwpAQCAtOTYsNiArOTksNyBAQAogIyBDT05GSUdfQVJDSF9JWERQMjgwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lYRFAyNDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSVhEUDI4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSVhQMjAwMF9TVVBQT1JUX0JST0tFTl9QQ0lfSU8gaXMgbm90IHNldAogCiAjCiAjIFByb2Nlc3NvciBUeXBlCkBAIC0xMDYsNyArMTEwLDYgQEAKIENPTkZJR19DUFVfQUJSVF9FVjVUPXkKIENPTkZJR19DUFVfQ0FDSEVfVklWVD15CiBDT05GSUdfQ1BVX1RMQl9WNFdCST15Ci1DT05GSUdfQ1BVX01JTklDQUNIRT15CiAKICMKICMgUHJvY2Vzc29yIEZlYXR1cmVzCkBAIC0xMTgsOSArMTIxLDExIEBACiAjCiAjIEJ1cyBzdXBwb3J0CiAjCitDT05GSUdfSVNBX0RNQV9BUEk9eQogQ09ORklHX1BDST15CiBDT05GSUdfUENJX0xFR0FDWV9QUk9DPXkKIENPTkZJR19QQ0lfTkFNRVM9eQorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0xMzAsNyArMTM1LDE2IEBACiAjCiAjIEtlcm5lbCBGZWF0dXJlcwogIworIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQogQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKIAogIwpAQCAtMjY5LDcgKzI4Myw2IEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldApAQCAtMzA4LDYgKzMyMSw3IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMzI5LDEyICszNDMsMTIgQEAKICMKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQogIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15CiBDT05GSUdfSVBfUE5QX0RIQ1A9eQogQ09ORklHX0lQX1BOUF9CT09UUD15CkBAIC0zNDksNiArMzYzLDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC00MDQsNiArNDIwLDcgQEAKICMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CiAKICMKICMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKQEAgLTQ0MCw5ICs0NTcsMTEgQEAKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKICMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQpAQCAtNDY0LDYgKzQ4Myw3IEBACiAjIFdhbiBpbnRlcmZhY2VzCiAjCiBDT05GSUdfV0FOPXkKKyMgQ09ORklHX0RTQ0M0IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBTk1FRElBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTkNMSU5LX1NZTkNQUFAgaXMgbm90IHNldAogQ09ORklHX0hETEM9eQpAQCAtNTI2LDcgKzU0Niw2IEBACiAjCiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQogCiAjCiAjIENoYXJhY3RlciBkZXZpY2VzCkBAIC01NDcsNiArNTY2LDcgQEAKICMKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CkBAIC02MTMsMTcgKzYzMywxOCBAQAogIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0lYUDIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAogIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKQEAgLTYzNyw3ICs2NTgsOSBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldApAQCAtNjUzLDYgKzY3Niw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldApAQCAtNjYyLDE0ICs2ODYsMTkgQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKIAogIwogIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CiAjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiBDT05GSUdfU0VOU09SU19FRVBST009eQogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKQEAgLTcyMyw2ICs3NTIsNyBAQAogQ09ORklHX0VYVDJfRlNfWEFUVFI9eQogQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKQEAgLTc2Myw3ICs3OTMsNiBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldApAQCAtODAxLDEyICs4MzAsMTQgQEAKICMKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX0xPQ0tEPXkKIENPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI0MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMF9kZWZjb25maWcKaW5kZXggODEwYTQ1MC4uNWM2YzkyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMF9kZWZjb25maWcKQEAgLTEsMTQgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMjE6MTM6MzggMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQ5OjAxIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE2LDYgKzE1LDcgQEAKIENPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX0NMRUFOX0NPTVBJTEU9eQogQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM1LDYgKzM1LDggQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgyLDYgKzg0LDcgQEAKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOPXkKIAogIwpAQCAtOTcsNiArMTAwLDcgQEAKIENPTkZJR19BUkNIX0lYRFAyWDAwPXkKICMgQ09ORklHX0FSQ0hfSVhEUDI0MDEgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JWERQMjgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWFAyMDAwX1NVUFBPUlRfQlJPS0VOX1BDSV9JTyBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEwNyw3ICsxMTEsNiBAQAogQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKLUNPTkZJR19DUFVfTUlOSUNBQ0hFPXkKIAogIwogIyBQcm9jZXNzb3IgRmVhdHVyZXMKQEAgLTExOSw5ICsxMjIsMTEgQEAKICMKICMgQnVzIHN1cHBvcnQKICMKK0NPTkZJR19JU0FfRE1BX0FQST15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQogQ09ORklHX1BDSV9OQU1FUz15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTEzMSw3ICsxMzYsMTYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogCiAjCkBAIC0yNzAsNyArMjg0LDYgQEAKICMKICMgQmxvY2sgZGV2aWNlcwogIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CkBAIC0zMDksNiArMzIyLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0zMzAsMTIgKzM0NCwxMiBAQAogIwogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM1MCw2ICszNjQsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTQwNSw2ICs0MjEsNyBAQAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKIAogIwogIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydApAQCAtNDQxLDkgKzQ1OCwxMSBAQAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAogIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC00NjUsNiArNDg0LDcgQEAKICMgV2FuIGludGVyZmFjZXMKICMKIENPTkZJR19XQU49eQorIyBDT05GSUdfRFNDQzQgaXMgbm90IHNldAogIyBDT05GSUdfTEFOTUVESUEgaXMgbm90IHNldAogIyBDT05GSUdfU1lOQ0xJTktfU1lOQ1BQUCBpcyBub3Qgc2V0CiBDT05GSUdfSERMQz15CkBAIC01MjcsNyArNTQ3LDYgQEAKICMKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15CiAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKQEAgLTU0OCw2ICs1NjcsNyBAQAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTYxNCwxNyArNjM0LDE4IEBACiAjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSVhQMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldApAQCAtNjM4LDcgKzY1OSw5IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CkBAIC02NTQsNiArNjc3LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CkBAIC02NjMsMTQgKzY4NywxOSBAQAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogCiAjCiAjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKICMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKIENPTkZJR19TRU5TT1JTX0VFUFJPTT15CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldApAQCAtNzI0LDYgKzc1Myw3IEBACiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQpAQCAtNzY0LDcgKzc5NCw2IEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19UTVBGUz15CiAjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CkBAIC04MDIsMTIgKzgzMSwxNCBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjQwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZwppbmRleCA3MmUxYjk0Li42ZGM0MGY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyNDAxX2RlZmNvbmZpZwpAQCAtMSwxNCArMSwxMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAyMTo1Mzo1NSAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtcmMyCisjIFRodSBKdWwgIDcgMTY6NDk6MDggMjAwNQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfTU1VPXkKIENPTkZJR19VSUQxNj15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtMTYsNiArMTUsNyBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzUsNiArMzUsOCBAQAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQpAQCAtODIsNiArODQsNyBAQAogIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NVUFBPUlRTX0JJR19FTkRJQU49eQogCiAjCkBAIC05Nyw2ICsxMDAsNyBAQAogQ09ORklHX0FSQ0hfSVhEUDI0MDE9eQogIyBDT05GSUdfQVJDSF9JWERQMjgwMSBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9JWERQMlgwMT15CisjIENPTkZJR19JWFAyMDAwX1NVUFBPUlRfQlJPS0VOX1BDSV9JTyBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEwNyw3ICsxMTEsNiBAQAogQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKLUNPTkZJR19DUFVfTUlOSUNBQ0hFPXkKIAogIwogIyBQcm9jZXNzb3IgRmVhdHVyZXMKQEAgLTExOSw5ICsxMjIsMTEgQEAKICMKICMgQnVzIHN1cHBvcnQKICMKK0NPTkZJR19JU0FfRE1BX0FQST15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQogQ09ORklHX1BDSV9OQU1FUz15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTEzMSw3ICsxMzYsMTYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogCiAjCkBAIC0yNzAsNyArMjg0LDYgQEAKICMKICMgQmxvY2sgZGV2aWNlcwogIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CkBAIC0zMDksNiArMzIyLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0zMzAsMTIgKzM0NCwxMiBAQAogIwogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM1MCw2ICszNjQsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lQX1RDUERJQUc9eQogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC00MDUsNiArNDIxLDcgQEAKICMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAogIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNOTAwMCBpcyBub3Qgc2V0CiAKICMKICMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKQEAgLTQ0Miw5ICs0NTksMTEgQEAKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKICMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAogIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQpAQCAtNDY2LDYgKzQ4NSw3IEBACiAjIFdhbiBpbnRlcmZhY2VzCiAjCiBDT05GSUdfV0FOPXkKKyMgQ09ORklHX0RTQ0M0IGlzIG5vdCBzZXQKICMgQ09ORklHX0xBTk1FRElBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTkNMSU5LX1NZTkNQUFAgaXMgbm90IHNldAogQ09ORklHX0hETEM9eQpAQCAtNTI4LDcgKzU0OCw2IEBACiAjCiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQogCiAjCiAjIENoYXJhY3RlciBkZXZpY2VzCkBAIC01NDksNiArNTY4LDcgQEAKICMKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CkBAIC02MTUsMTcgKzYzNSwxOCBAQAogIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JU0EgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0lYUDIwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAogIyBDT05GSUdfU0N4MjAwX0FDQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0lTNjMwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM5NlggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1ZJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVklBUFJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WT09ET08zIGlzIG5vdCBzZXQKQEAgLTYzOSw3ICs2NjAsOSBAQAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMzEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE05MjQwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldApAQCAtNjU1LDYgKzY3OCw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldApAQCAtNjY0LDE0ICs2ODgsMTkgQEAKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKIAogIwogIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CiAjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiBDT05GSUdfU0VOU09SU19FRVBST009eQogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKQEAgLTcyNSw2ICs3NTQsNyBAQAogQ09ORklHX0VYVDJfRlNfWEFUVFI9eQogQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKQEAgLTc2NSw3ICs3OTUsNiBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldApAQCAtODAzLDEyICs4MzIsMTQgQEAKICMKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CiBDT05GSUdfUk9PVF9ORlM9eQogQ09ORklHX0xPQ0tEPXkKIENPTkZJR19MT0NLRF9WND15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKICMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaXhkcDI4MDBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKaW5kZXggMTU5MmU0NS4uZDJiYjBiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMF9kZWZjb25maWcKQEAgLTEsMTQgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMjI6MTU6MjMgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBUaHUgSnVsICA3IDE2OjQ5OjIwIDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE2LDYgKzE1LDcgQEAKIENPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX0NMRUFOX0NPTVBJTEU9eQogQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM1LDYgKzM1LDggQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgyLDYgKzg0LDcgQEAKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOPXkKIAogIwpAQCAtOTcsNiArMTAwLDcgQEAKIENPTkZJR19BUkNIX0lYRFAyWDAwPXkKICMgQ09ORklHX0FSQ0hfSVhEUDI0MDEgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JWERQMjgwMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWFAyMDAwX1NVUFBPUlRfQlJPS0VOX1BDSV9JTyBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEwNyw3ICsxMTEsNiBAQAogQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKLUNPTkZJR19DUFVfTUlOSUNBQ0hFPXkKIAogIwogIyBQcm9jZXNzb3IgRmVhdHVyZXMKQEAgLTExOSw5ICsxMjIsMTEgQEAKICMKICMgQnVzIHN1cHBvcnQKICMKK0NPTkZJR19JU0FfRE1BX0FQST15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQogQ09ORklHX1BDSV9OQU1FUz15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTEzMSw3ICsxMzYsMTYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogCiAjCkBAIC0yNzAsNyArMjg0LDYgQEAKICMKICMgQmxvY2sgZGV2aWNlcwogIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CkBAIC0zMDksNiArMzIyLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0zMzAsMTIgKzM0NCwxMiBAQAogIwogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM1MCw2ICszNjQsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTQwNSw2ICs0MjEsNyBAQAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKIAogIwogIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydApAQCAtNDQxLDkgKzQ1OCwxMSBAQAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAogIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC00NjUsNiArNDg0LDcgQEAKICMgV2FuIGludGVyZmFjZXMKICMKIENPTkZJR19XQU49eQorIyBDT05GSUdfRFNDQzQgaXMgbm90IHNldAogIyBDT05GSUdfTEFOTUVESUEgaXMgbm90IHNldAogIyBDT05GSUdfU1lOQ0xJTktfU1lOQ1BQUCBpcyBub3Qgc2V0CiBDT05GSUdfSERMQz15CkBAIC01MjcsNyArNTQ3LDYgQEAKICMKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15CiAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKQEAgLTU0OCw2ICs1NjcsNyBAQAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTYxNCwxNyArNjM0LDE4IEBACiAjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSVhQMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldApAQCAtNjM4LDcgKzY1OSw5IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CkBAIC02NTQsNiArNjc3LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CkBAIC02NjMsMTQgKzY4NywxOSBAQAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogCiAjCiAjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKICMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKIENPTkZJR19TRU5TT1JTX0VFUFJPTT15CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldApAQCAtNzI0LDYgKzc1Myw3IEBACiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQpAQCAtNzY0LDcgKzc5NCw2IEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19UTVBGUz15CiAjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CkBAIC04MDIsMTIgKzgzMSwxNCBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9peGRwMjgwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZwppbmRleCBmMWFmZTNkLi4yZDZmOTYwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2l4ZHAyODAxX2RlZmNvbmZpZwpAQCAtMSwxNCArMSwxMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAyMjozOToxOSAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTMtcmMyCisjIFRodSBKdWwgIDcgMTY6NDk6MTMgMjAwNQogIwogQ09ORklHX0FSTT15CiBDT05GSUdfTU1VPXkKIENPTkZJR19VSUQxNj15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX0dFTkVSSUNfSU9NQVA9eQogCiAjCiAjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwpAQCAtMTYsNiArMTUsNyBAQAogQ09ORklHX0VYUEVSSU1FTlRBTD15CiBDT05GSUdfQ0xFQU5fQ09NUElMRT15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzUsNiArMzUsOCBAQAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQpAQCAtODIsNiArODQsNyBAQAogIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FBRUMyMDAwIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NVUFBPUlRTX0JJR19FTkRJQU49eQogCiAjCkBAIC05Nyw2ICsxMDAsNyBAQAogIyBDT05GSUdfQVJDSF9JWERQMjQwMSBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9JWERQMjgwMT15CiBDT05GSUdfQVJDSF9JWERQMlgwMT15CisjIENPTkZJR19JWFAyMDAwX1NVUFBPUlRfQlJPS0VOX1BDSV9JTyBpcyBub3Qgc2V0CiAKICMKICMgUHJvY2Vzc29yIFR5cGUKQEAgLTEwNyw3ICsxMTEsNiBAQAogQ09ORklHX0NQVV9BQlJUX0VWNVQ9eQogQ09ORklHX0NQVV9DQUNIRV9WSVZUPXkKIENPTkZJR19DUFVfVExCX1Y0V0JJPXkKLUNPTkZJR19DUFVfTUlOSUNBQ0hFPXkKIAogIwogIyBQcm9jZXNzb3IgRmVhdHVyZXMKQEAgLTExOSw5ICsxMjIsMTEgQEAKICMKICMgQnVzIHN1cHBvcnQKICMKK0NPTkZJR19JU0FfRE1BX0FQST15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQogQ09ORklHX1BDSV9OQU1FUz15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTEzMSw3ICsxMzYsMTYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19OT19JRExFX0haIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRElTQ09OVElHTUVNX0VOQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiBDT05GSUdfQUxJR05NRU5UX1RSQVA9eQogCiAjCkBAIC0yNzAsNyArMjg0LDYgQEAKICMKICMgQmxvY2sgZGV2aWNlcwogIwotIyBDT05GSUdfQkxLX0RFVl9GRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CkBAIC0zMDksNiArMzIyLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0zMzAsMTIgKzM0NCwxMiBAQAogIwogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiBDT05GSUdfSVBfUE5QPXkKIENPTkZJR19JUF9QTlBfREhDUD15CiBDT05GSUdfSVBfUE5QX0JPT1RQPXkKQEAgLTM1MCw2ICszNjQsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTQwNSw2ICs0MjEsNyBAQAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKIAogIwogIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydApAQCAtNDQyLDkgKzQ1OSwxMSBAQAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAogIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC00NjYsNiArNDg1LDcgQEAKICMgV2FuIGludGVyZmFjZXMKICMKIENPTkZJR19XQU49eQorIyBDT05GSUdfRFNDQzQgaXMgbm90IHNldAogIyBDT05GSUdfTEFOTUVESUEgaXMgbm90IHNldAogIyBDT05GSUdfU1lOQ0xJTktfU1lOQ1BQUCBpcyBub3Qgc2V0CiBDT05GSUdfSERMQz15CkBAIC01MjgsNyArNTQ4LDYgQEAKICMKICMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKLUNPTkZJR19TT1VORF9HQU1FUE9SVD15CiAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKQEAgLTU0OSw2ICs1NjgsNyBAQAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTYxNSwxNyArNjM1LDE4IEBACiAjIENPTkZJR19JMkNfQU1EODExMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSTgxMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX0lTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSVhQMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUElJWDQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldApAQCAtNjM5LDcgKzY2MCw5IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CkBAIC02NTUsNiArNjc4LDcgQEAKICMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CkBAIC02NjQsMTQgKzY4OCwxOSBAQAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzTDc4NVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM2MjdFSEYgaXMgbm90IHNldAogCiAjCiAjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKICMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKIENPTkZJR19TRU5TT1JTX0VFUFJPTT15CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldApAQCAtNzI1LDYgKzc1NCw3IEBACiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfRVhUMl9GU19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQpAQCAtNzY1LDcgKzc5NSw2IEBACiAjCiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19UTVBGUz15CiAjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CkBAIC04MDMsMTIgKzgzMiwxNCBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9vbWFwX2gyXzE2MTBfZGVmY29uZmlnCmluZGV4IDRlNThkOTMuLjI0OTU1MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21hcF9oMl8xNjEwX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXBfaDJfMTYxMF9kZWZjb25maWcKQEAgLTEsMTQgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMTc6NTI6NDEgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMgorIyBGcmkgSnVsICA4IDA0OjQ5OjM0IDIwMDUKICMKIENPTkZJR19BUk09eQogQ09ORklHX01NVT15CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKLUNPTkZJR19HRU5FUklDX0lPTUFQPXkKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKQEAgLTE3LDYgKzE2LDcgQEAKIENPTkZJR19DTEVBTl9DT01QSUxFPXkKIENPTkZJR19CUk9LRU5fT05fU01QPXkKIENPTkZJR19MT0NLX0tFUk5FTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiAKICMKICMgR2VuZXJhbCBzZXR1cApAQCAtMzMsOCArMzMsOSBAQAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQpAQCAtODIsMTAgKzgzLDI4IEBACiAjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQUFFQzIwMDAgaXMgbm90IHNldAogCiAjCiAjIFRJIE9NQVAgSW1wbGVtZW50YXRpb25zCiAjCitDT05GSUdfQVJDSF9PTUFQX09URz15CitDT05GSUdfQVJDSF9PTUFQMT15CisjIENPTkZJR19BUkNIX09NQVAyIGlzIG5vdCBzZXQKKworIworIyBPTUFQIEZlYXR1cmUgU2VsZWN0aW9ucworIworIyBDT05GSUdfT01BUF9SRVNFVF9DTE9DS1MgaXMgbm90IHNldAorQ09ORklHX09NQVBfTVVYPXkKKyMgQ09ORklHX09NQVBfTVVYX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19PTUFQX01VWF9XQVJOSU5HUz15CisjIENPTkZJR19PTUFQX01QVV9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfT01BUF8zMktfVElNRVI9eQorQ09ORklHX09NQVBfMzJLX1RJTUVSX0haPTEyOAorQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDE9eQorIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMiBpcyBub3Qgc2V0CisjIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzIGlzIG5vdCBzZXQKIAogIwogIyBPTUFQIENvcmUgVHlwZQpAQCAtOTMsNyArMTEyLDYgQEAKICMgQ09ORklHX0FSQ0hfT01BUDczMCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX09NQVAxNTEwIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX09NQVAxNlhYPXkKLUNPTkZJR19BUkNIX09NQVBfT1RHPXkKIAogIwogIyBPTUFQIEJvYXJkIFR5cGUKQEAgLTEwMSwyMSArMTE5LDE0IEBACiAjIENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19NQUNIX09NQVBfSDI9eQogIyBDT05GSUdfTUFDSF9PTUFQX0gzIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfT01BUF9INCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX09NQVBfT1NLIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfT01BUF9HRU5FUklDIGlzIG5vdCBzZXQKIAogIwotIyBPTUFQIEZlYXR1cmUgU2VsZWN0aW9ucworIyBPTUFQIENQVSBTcGVlZAogIwotQ09ORklHX09NQVBfTVVYPXkKLSMgQ09ORklHX09NQVBfTVVYX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19PTUFQX01VWF9XQVJOSU5HUz15Ci1DT05GSUdfT01BUF9NUFVfVElNRVI9eQotIyBDT05GSUdfT01BUF8zMktfVElNRVIgaXMgbm90IHNldAotQ09ORklHX09NQVBfTExfREVCVUdfVUFSVDE9eQotIyBDT05GSUdfT01BUF9MTF9ERUJVR19VQVJUMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19PTUFQX0xMX0RFQlVHX1VBUlQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfQ0xPQ0tTX1NFVF9CWV9CT09UTE9BREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NQVBfQVJNXzIxNk1IWiBpcyBub3Qgc2V0CiBDT05GSUdfT01BUF9BUk1fMTkyTUhaPXkKICMgQ09ORklHX09NQVBfQVJNXzE2OE1IWiBpcyBub3Qgc2V0CiAjIENPTkZJR19PTUFQX0FSTV8xMjBNSFogaXMgbm90IHNldApAQCAtMTQ1LDYgKzE1Niw3IEBACiAjCiAjIEJ1cyBzdXBwb3J0CiAjCitDT05GSUdfSVNBX0RNQV9BUEk9eQogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTE1NCw3ICsxNjYsMTYgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX05PX0lETEVfSFo9eQorIyBDT05GSUdfQVJDSF9ESVNDT05USUdNRU1fRU5BQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKICMgQ09ORklHX0xFRFMgaXMgbm90IHNldAogQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKIApAQCAtMTY3LDYgKzE4OCwyMiBAQAogIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CiAKICMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9QRVJGT1JNQU5DRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKKworIwogIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KICMKIApAQCAtMjAyLDcgKzIzOSw2IEBACiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CiAjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0RSSVZFUj15CiAKICMKICMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQpAQCAtMjkyLDcgKzMyOCw2IEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0xPT1A9eQogIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKQEAgLTMyNyw2ICszNjIsNyBAQAogIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAogIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CiAKICMKICMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCkBAIC0zNTYsNiArMzkyLDcgQEAKICMKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKIAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CkBAIC0zNzUsMTIgKzQxMiwxMiBAQAogIwogQ09ORklHX1BBQ0tFVD15CiAjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWD15CiAjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKIENPTkZJR19JUF9QTlA9eQogQ09ORklHX0lQX1BOUF9ESENQPXkKIENPTkZJR19JUF9QTlBfQk9PVFA9eQpAQCAtMzk1LDYgKzQzMiw4IEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSVBfVENQRElBRz15CiAjIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKQEAgLTQ0Miw2ICs0ODEsNyBAQAogQ09ORklHX05FVF9FVEhFUk5FVD15CiBDT05GSUdfTUlJPXkKIENPTkZJR19TTUM5MVg9eQorIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQpAQCAtNTE4LDcgKzU1OCw2IEBACiBDT05GSUdfU0VSSU9fU0VSUE9SVD15CiAjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAogIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKIAogIwogIyBDaGFyYWN0ZXIgZGV2aWNlcwpAQCAtNTY3LDEzICs2MDYsMTEgQEAKICMKICMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCiAjCi0jIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKICMKICMgVFBNIGRldmljZXMKICMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC02MDQsNyArNjQxLDkgQEAKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDMxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNOTI0MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FTQjEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRlNDSEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRlNDUE9TIGlzIG5vdCBzZXQKQEAgLTYyMCw2ICs2NTksNyBAQAogIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKQEAgLTYyNywxNSArNjY3LDIxIEBACiAjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRiBpcyBub3Qgc2V0CiAKICMKICMgT3RoZXIgSTJDIENoaXAgc3VwcG9ydAogIworIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKIENPTkZJR19JU1AxMzAxX09NQVA9eQorQ09ORklHX1RQUzY1MDEwPXkKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKQEAgLTY2Myw4ICs3MDksMTAgQEAKICMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NPRlRfQ1VSU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKIENPTkZJR19GQl9NT0RFX0hFTFBFUlM9eQogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAogCiAjCkBAIC02NzcsMTEgKzcyNSwxMyBAQAogQ09ORklHX0ZPTlRfOHg4PXkKIENPTkZJR19GT05UXzh4MTY9eQogIyBDT05GSUdfRk9OVF82eDExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfN3gxNCBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UX1BFQVJMXzh4OCBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UX0FDT1JOXzh4OCBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UX01JTklfNHg2IGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfU1VOOHgxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRfMTB4MTggaXMgbm90IHNldAogCiAjCiAjIExvZ28gY29uZmlndXJhdGlvbgpAQCAtNzI5LDE0ICs3NzksMTQgQEAKICMKIENPTkZJR19VU0JfR0FER0VUPXkKICMgQ09ORklHX1VTQl9HQURHRVRfREVCVUdfRklMRVMgaXMgbm90IHNldAorQ09ORklHX1VTQl9HQURHRVRfU0VMRUNURUQ9eQogIyBDT05GSUdfVVNCX0dBREdFVF9ORVQyMjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfUFhBMlhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9HQURHRVRfR09LVSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR0FER0VUX1NBMTEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfR0FER0VUX0xIN0E0MFggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9HQURHRVRfT01BUD15CiBDT05GSUdfVVNCX09NQVA9eQorIyBDT05GSUdfVVNCX0dBREdFVF9EVU1NWV9IQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1pFUk8gaXMgbm90IHNldAogQ09ORklHX1VTQl9FVEg9eQpAQCAtNzU1LDYgKzgwNSw3IEBACiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKQEAgLTc5MSw3ICs4NDIsNiBAQAogIwogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldApAQCAtODI4LDEyICs4NzgsMTQgQEAKICMKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKIENPTkZJR19ORlNfVjQ9eQogIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldAogQ09ORklHX1JPT1RfTkZTPXkKIENPTkZJR19MT0NLRD15CiBDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiBDT05GSUdfU1VOUlBDX0dTUz15CiBDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKQEAgLTkwMywyNCArOTU1LDExIEBACiAjIEtlcm5lbCBoYWNraW5nCiAjCiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfREVCVUdfS0VSTkVMPXkKLSMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAotIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKLUNPTkZJR19ERUJVR19QUkVFTVBUPXkKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQotQ09ORklHX0RFQlVHX0lORk89eQotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogQ09ORklHX0ZSQU1FX1BPSU5URVI9eQotQ09ORklHX0RFQlVHX1VTRVI9eQotIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX0VSUk9SUz15Ci1DT05GSUdfREVCVUdfTEw9eQotIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3Mvb21uaW1ldGVyX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mvb21uaW1ldGVyX2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmZGI0YS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tbmltZXRlcl9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw4MDMgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjMS1iazIKLSMgU3VuIE1hciAyNyAyMTozMTo0NSAyMDA1Ci0jCi1DT05GSUdfQVJNPXkKLUNPTkZJR19NTVU9eQotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15Ci0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi1DT05GSUdfRVhQRVJJTUVOVEFMPXkKLUNPTkZJR19DTEVBTl9DT01QSUxFPXkKLUNPTkZJR19CUk9LRU5fT05fU01QPXkKLQotIwotIyBHZW5lcmFsIHNldHVwCi0jCi1DT05GSUdfTE9DQUxWRVJTSU9OPSIiCi1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKLSMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19IT1RQTFVHPXkKLUNPTkZJR19LT0JKRUNUX1VFVkVOVD15Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfQkFTRV9GVUxMPXkKLUNPTkZJR19GVVRFWD15Ci1DT05GSUdfRVBPTEw9eQotQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKLUNPTkZJR19TSE1FTT15Ci1DT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKLUNPTkZJR19DQ19BTElHTl9MQUJFTFM9MAotQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKLUNPTkZJR19DQ19BTElHTl9KVU1QUz0wCi0jIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19CQVNFX1NNQUxMPTAKLQotIwotIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAotIwotQ09ORklHX01PRFVMRVM9eQotIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0Ci1DT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15Ci0jIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAotQ09ORklHX0tNT0Q9eQotCi0jCi0jIFN5c3RlbSBUeXBlCi0jCi0jIENPTkZJR19BUkNIX0NMUFM3NTAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfQ0xQUzcxMVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DTzI4NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9DQU1FTE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JT1AzWFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFA0WFggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9SUEMgaXMgbm90IHNldAotQ09ORklHX0FSQ0hfU0ExMTAwPXkKLSMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX1NIQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSQ0hfTEg3QTQwWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9JTVggaXMgbm90IHNldAotIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0ExMXgwIEltcGxlbWVudGF0aW9ucwotIwotIyBDT05GSUdfU0ExMTAwX0FTU0FCRVQgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0NFUkYgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0NPTExJRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfSDMxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX0gzNjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9IMzgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQTExMDBfQkFER0U0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9KT1JOQURBNzIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9IQUNLS0lUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9MQVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9QTEVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9TSEFOTk9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NBMTEwMF9TSU1QQUQgaXMgbm90IHNldAotIyBDT05GSUdfU0ExMTAwX1NTUCBpcyBub3Qgc2V0Ci0KLSMKLSMgUHJvY2Vzc29yIFR5cGUKLSMKLUNPTkZJR19DUFVfMzI9eQotQ09ORklHX0NQVV9TQTExMDA9eQotQ09ORklHX0NQVV8zMnY0PXkKLUNPTkZJR19DUFVfQUJSVF9FVjQ9eQotQ09ORklHX0NQVV9DQUNIRV9WNFdCPXkKLUNPTkZJR19DUFVfQ0FDSEVfVklWVD15Ci1DT05GSUdfQ1BVX1RMQl9WNFdCPXkKLUNPTkZJR19DUFVfTUlOSUNBQ0hFPXkKLQotIwotIyBQcm9jZXNzb3IgRmVhdHVyZXMKLSMKLQotIwotIyBCdXMgc3VwcG9ydAotIwotQ09ORklHX0lTQT15Ci0KLSMKLSMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAotIwotQ09ORklHX1BDQ0FSRD15Ci0jIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAotQ09ORklHX1BDTUNJQT15Ci0KLSMKLSMgUEMtY2FyZCBicmlkZ2VzCi0jCi1DT05GSUdfSTgyMzY1PXkKLSMgQ09ORklHX1RDSUMgaXMgbm90IHNldAotQ09ORklHX1BDTUNJQV9TQTExMDA9eQotQ09ORklHX1BDQ0FSRF9OT05TVEFUSUM9eQotCi0jCi0jIEtlcm5lbCBGZWF0dXJlcwotIwotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfRElTQ09OVElHTUVNPXkKLSMgQ09ORklHX0xFRFMgaXMgbm90IHNldAotQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKLQotIwotIyBCb290IG9wdGlvbnMKLSMKLUNPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKLUNPTkZJR19aQk9PVF9ST01fQlNTPTB4MAotQ09ORklHX0NNRExJTkU9ImtlZXBpbml0cmQgbWVtPTE2TSByb290PS9kZXYvcmFtIHJhbWRpc2s9ODE5MiBpbml0cmQ9MHhkMDAwMDAwMCw0TSIKLSMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAotCi0jCi0jIENQVSBGcmVxdWVuY3kgc2NhbGluZwotIwotIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAotCi0jCi0jIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgotIwotCi0jCi0jIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAotIwotIyBDT05GSUdfRlBFX05XRlBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZQRV9GQVNURlBFIGlzIG5vdCBzZXQKLQotIwotIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKLSMKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19CSU5GTVRfQU9VVD15Ci0jIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUlRIVVIgaXMgbm90IHNldAotCi0jCi0jIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwotIwotIyBDT05GSUdfUE0gaXMgbm90IHNldAotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKLQotIwotIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCi0jCi0jIENPTkZJR19NVEQgaXMgbm90IHNldAotCi0jCi0jIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAotIwotIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QTlAgaXMgbm90IHNldAotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9YRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTE9PUD1tCi0jIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfTkJEPW0KLSMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKLSMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAotCi0jCi0jIElPIFNjaGVkdWxlcnMKLSMKLUNPTkZJR19JT1NDSEVEX05PT1A9eQotQ09ORklHX0lPU0NIRURfQVM9eQotQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQotQ09ORklHX0lPU0NIRURfQ0ZRPXkKLSMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0Ci0KLSMKLSMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAotIwotQ09ORklHX0lERT15Ci1DT05GSUdfQkxLX0RFVl9JREU9eQotCi0jCi0jIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcwotIwotIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0Ci1DT05GSUdfQkxLX0RFVl9JREVESVNLPXkKLSMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERUNTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFQ0QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVUQVBFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRkxPUFBZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKLQotIwotIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCi0jCi1DT05GSUdfSURFX0dFTkVSSUM9eQotIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVETUEgaXMgbm90IHNldAotIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NTSSBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAotIwotCi0jCi0jIEkyTyBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCi0jIE5ldHdvcmtpbmcgc3VwcG9ydAotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi1DT05GSUdfUEFDS0VUPXkKLUNPTkZJR19QQUNLRVRfTU1BUD15Ci0jIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0Ci1DT05GSUdfVU5JWD15Ci0jIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19JUF9NVUxUSUNBU1Q9eQotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfVENQRElBRz15Ci0jIENPTkZJR19JUF9UQ1BESUFHX0lQVjYgaXMgbm90IHNldAotCi0jCi0jIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVI9eQotIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJUDogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9JUFRBQkxFUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9BUlBUQUJMRVMgaXMgbm90IHNldAotCi0jCi0jIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE0gaXMgbm90IHNldAotIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAotIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xMQzIgaXMgbm90IHNldAotIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1gyNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAotIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgdGVzdGluZwotIwotIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUREVWSUNFUz15Ci0jIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UVU4gaXMgbm90IHNldAotCi0jCi0jIEFSQ25ldCBkZXZpY2VzCi0jCi0jIENPTkZJR19BUkNORVQgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci0jIENPTkZJR19NSUkgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBTkNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9WRU5ET1JfU01DIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SX1JBQ0FMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FUMTcwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERVBDQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfSVNBIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPQ0tFVCBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLQotIwotIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKLSMKLQotIwotIyBUb2tlbiBSaW5nIGRldmljZXMKLSMKLSMgQ09ORklHX1RSIGlzIG5vdCBzZXQKLQotIwotIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKLSMKLUNPTkZJR19ORVRfUkFESU89eQotCi0jCi0jIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCi0jCi0jIENPTkZJR19TVFJJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQVZFTEFOIGlzIG5vdCBzZXQKLUNPTkZJR19QQ01DSUFfV0FWRUxBTj15Ci0jIENPTkZJR19QQ01DSUFfTkVUV0FWRSBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExIEZyZXF1ZW5jeSBIb3BwaW5nIGNhcmRzIHN1cHBvcnQKLSMKLSMgQ09ORklHX1BDTUNJQV9SQVlDUyBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBJU0EvUENJIGNhcmRzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0hFUk1FUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgODAyLjExYiBQY21jaWEvQ2FyZGJ1cyBjYXJkcyBzdXBwb3J0Ci0jCi1DT05GSUdfQUlST19DUz15Ci1DT05GSUdfUENNQ0lBX1dMMzUwMT15Ci1DT05GSUdfTkVUX1dJUkVMRVNTPXkKLQotIwotIyBQQ01DSUEgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX05FVF9QQ01DSUE9eQotQ09ORklHX1BDTUNJQV8zQzU4OT15Ci0jIENPTkZJR19QQ01DSUFfM0M1NzQgaXMgbm90IHNldAotIyBDT05GSUdfUENNQ0lBX0ZNVkoxOFggaXMgbm90IHNldAotQ09ORklHX1BDTUNJQV9QQ05FVD15Ci0jIENPTkZJR19QQ01DSUFfTk1DTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDTUNJQV9TTUM5MUM5MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ01DSUFfWElSQzJQUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ01DSUFfQVhORVQgaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NMSVAgaXMgbm90IHNldAotIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX0lOUFVUPXkKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi1DT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQotQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKLSMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAotQ09ORklHX0lOUFVUX01PVVNFPXkKLUNPTkZJR19NT1VTRV9QUzI9eQotIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PVVNFX0lOUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT1VTRV9MT0dJQk0gaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfUEMxMTBQQUQgaXMgbm90IHNldAotIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBJL08gcG9ydHMKLSMKLUNPTkZJR19TRVJJTz15Ci1DT05GSUdfU0VSSU9fU0VSUE9SVD15Ci1DT05GSUdfU0VSSU9fTElCUFMyPXkKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgZHJpdmVycwotIwotIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAotCi0jCi0jIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKLSMKLUNPTkZJR19TRVJJQUxfU0ExMTAwPXkKLUNPTkZJR19TRVJJQUxfU0ExMTAwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLUNPTkZJR19VTklYOThfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWVM9eQotQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2Ci0KLSMKLSMgSVBNSQotIwotIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKLQotIwotIyBXYXRjaGRvZyBDYXJkcwotIwotIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAotIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAotCi0jCi0jIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgotIwotIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKLQotIwotIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKLSMKLSMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotCi0jCi0jIFRQTSBkZXZpY2VzCi0jCi0jIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjIGRldmljZXMKLSMKLQotIwotIyBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0Ci0KLSMKLSMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwotIwotIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLQotIwotIyBHcmFwaGljcyBzdXBwb3J0Ci0jCi1DT05GSUdfRkI9eQotQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15Ci1DT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKLUNPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKLUNPTkZJR19GQl9TT0ZUX0NVUlNPUj15Ci0jIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9TQTExMDA9eQotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0Ci0jCi0jIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0Ci1DT05GSUdfRFVNTVlfQ09OU09MRT15Ci1DT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15Ci1DT05GSUdfRk9OVFM9eQotQ09ORklHX0ZPTlRfOHg4PXkKLSMgQ09ORklHX0ZPTlRfOHgxNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UXzZ4MTEgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9QRUFSTF84eDggaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9BQ09STl84eDggaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9NSU5JXzR4NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UX1NVTjh4MTYgaXMgbm90IHNldAotIyBDT05GSUdfRk9OVF9TVU4xMngyMiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgU291bmQKLSMKLSMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKLQotIwotIyBVU0Igc3VwcG9ydAotIwotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgRmlsZSBzeXN0ZW1zCi0jCi1DT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgWEZTIHN1cHBvcnQKLSMKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15Ci0jIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLUNPTkZJR19GQVRfRlM9eQotQ09ORklHX01TRE9TX0ZTPXkKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNwotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0QgaXMgbm90IHNldAotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKLSMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQYXJ0aXRpb24gVHlwZXMKLSMKLSMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0Ci1DT05GSUdfTVNET1NfUEFSVElUSU9OPXkKLQotIwotIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAotIwotQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKLSMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV8xIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzIgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV80IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfSVNPODg1OV83IGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19JU084ODU5XzkgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTMgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTQgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0lTTzg4NTlfMTUgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0tPSThfUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OTFNfS09JOF9VIGlzIG5vdCBzZXQKLSMgQ09ORklHX05MU19VVEY4IGlzIG5vdCBzZXQKLQotIwotIyBQcm9maWxpbmcgc3VwcG9ydAotIwotIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKLQotIwotIyBLZXJuZWwgaGFja2luZwotIwotIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE0Ci1DT05GSUdfREVCVUdfQlVHVkVSQk9TRT15Ci1DT05GSUdfRlJBTUVfUE9JTlRFUj15Ci0jIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi0jIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLSMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwotIyBMaWJyYXJ5IHJvdXRpbmVzCi0jCi0jIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAotQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9zM2MyNDEwX2RlZmNvbmZpZwppbmRleCAyYTYzZmIyLi45OGI3MmZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL3MzYzI0MTBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvczNjMjQxMF9kZWZjb25maWcKQEAgLTEsMTQgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzEtYmsyCi0jIFN1biBNYXIgMjcgMTc6NDc6NDUgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLWdpdDQKKyMgV2VkIEp1biAyMiAxNTo1Njo0MiAyMDA1CiAjCiBDT05GSUdfQVJNPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1VJRDE2PXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19JT01BUD15CiAKICMKICMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCkBAIC0xNyw2ICsxNiw3IEBACiAjIENPTkZJR19DTEVBTl9DT01QSUxFIGlzIG5vdCBzZXQKIENPTkZJR19CUk9LRU49eQogQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTM1LDYgKzM1LDggQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKQEAgLTgxLDYgKzgzLDcgQEAKICMgQ09ORklHX0FSQ0hfVkVSU0FUSUxFIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfSDcyMFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CiAKICMKICMgUzNDMjRYWCBJbXBsZW1lbnRhdGlvbnMKQEAgLTEzNCw2ICsxMzcsNyBAQAogIwogIyBCdXMgc3VwcG9ydAogIworQ09ORklHX0lTQV9ETUFfQVBJPXkKIAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CkBAIC0xNDMsNyArMTQ3LDkgQEAKICMKICMgS2VybmVsIEZlYXR1cmVzCiAjCisjIENPTkZJR19TTVAgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNDT05USUdNRU0gaXMgbm90IHNldAogQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKIAogIwpAQCAtMjk3LDcgKzMwMyw2IEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAogIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKQEAgLTM1OSw2ICszNjQsNyBAQAogIwogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKQEAgLTM3OCwxMCArMzg0LDExIEBACiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwogIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVExJTktfREVWIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKICMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAogQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAogQ09ORklHX0lQX1BOUD15CkBAIC00NDMsOCArNDUwLDkgQEAKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKLSMgQ09ORklHX01JSSBpcyBub3Qgc2V0CitDT05GSUdfTUlJPW0KICMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CitDT05GSUdfRE05MDAwPW0KIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQpAQCAtNTIxLDcgKzUyOSw2IEBACiBDT05GSUdfU0VSSU9fTElCUFMyPXkKICMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CiAjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQogCiAjCiAjIENoYXJhY3RlciBkZXZpY2VzCkBAIC02MDUsNyArNjEyLDYgQEAKICMKICMgVFBNIGRldmljZXMKICMKLSMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC02NTQsNiArNjYwLDcgQEAKIENPTkZJR19TRU5TT1JTX0xNODU9bQogIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldApAQCAtNjY1LDYgKzY3Miw3IEBACiAjCiAjIE90aGVyIEkyQyBDaGlwIHN1cHBvcnQKICMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKIENPTkZJR19TRU5TT1JTX0VFUFJPTT1tCiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKQEAgLTY5Niw4ICs3MDQsMTAgQEAKICMgQ09ORklHX0ZCX0NGQl9DT1BZQVJFQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9DRkJfSU1BR0VCTElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1NPRlRfQ1VSU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKIENPTkZJR19GQl9NT0RFX0hFTFBFUlM9eQogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAogCiAjCkBAIC03ODIsNyArNzkyLDYgQEAKICMKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19ERVZGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERVZQVFNfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9hcm1rc3ltcy5jIGIvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKaW5kZXggNGMzOGJkOC4uODM1ZDQ1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2FybWtzeW1zLmMKQEAgLTMwLDkgKzMwLDYgQEAKIGV4dGVybiB2b2lkIF9fbW9kc2kzKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19tdWxkaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3VjbXBkaTIodm9pZCk7Ci1leHRlcm4gdm9pZCBfX3VkaXZkaTModm9pZCk7Ci1leHRlcm4gdm9pZCBfX3Vtb2RkaTModm9pZCk7Ci1leHRlcm4gdm9pZCBfX3VkaXZtb2RkaTQodm9pZCk7CiBleHRlcm4gdm9pZCBfX3VkaXZzaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3Vtb2RzaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX2RvX2RpdjY0KHZvaWQpOwpAQCAtNDQsNyArNDEsMTAgQEAKICAqIFRoaXMgaGFzIGEgc3BlY2lhbCBjYWxsaW5nIGNvbnZlbnRpb247IGl0IGRvZXNuJ3QKICAqIG1vZGlmeSBhbnkgb2YgdGhlIHVzdWFsIHJlZ2lzdGVycywgZXhjZXB0IGZvciBMUi4KICAqLworI2RlZmluZSBFWFBPUlRfQ1JDX0FMSUFTKHN5bSkgX19DUkNfU1lNQk9MKHN5bSwgIiIpCisKICNkZWZpbmUgRVhQT1JUX1NZTUJPTF9BTElBUyhzeW0sb3JpZykJCVwKKyBFWFBPUlRfQ1JDX0FMSUFTKHN5bSkJCQkJXAogIGNvbnN0IHN0cnVjdCBrZXJuZWxfc3ltYm9sIF9fa3N5bXRhYl8jI3N5bQlcCiAgIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fa3N5bXRhYiIpKSkgPQlcCiAgICAgeyAodW5zaWduZWQgbG9uZykmb3JpZywgI3N5bSB9OwpAQCAtMTM0LDkgKzEzNCw2IEBACiBFWFBPUlRfU1lNQk9MKF9fbW9kc2kzKTsKIEVYUE9SVF9TWU1CT0woX19tdWxkaTMpOwogRVhQT1JUX1NZTUJPTChfX3VjbXBkaTIpOwotRVhQT1JUX1NZTUJPTChfX3VkaXZkaTMpOwotRVhQT1JUX1NZTUJPTChfX3Vtb2RkaTMpOwotRVhQT1JUX1NZTUJPTChfX3VkaXZtb2RkaTQpOwogRVhQT1JUX1NZTUJPTChfX3VkaXZzaTMpOwogRVhQT1JUX1NZTUJPTChfX3Vtb2RzaTMpOwogRVhQT1JUX1NZTUJPTChfX2RvX2RpdjY0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCmluZGV4IGJkNDgyM2MuLjExNTVjZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwpAQCAtMzQ0LDkgKzM0NCw5IEBACiAJc3RyCXI2LCBbcjBdCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19ERUJVR19MTAogCWJpYwlyNywgcjcsICMweDBjCQkJQCB0dXJuIG9mZiBjYWNoZWFibGUKIAkJCQkJCUAgYW5kIGJ1ZmZlcmFibGUgYml0cwotI2lmZGVmIENPTkZJR19ERUJVR19MTAogCS8qCiAJICogTWFwIGluIElPIHNwYWNlIGZvciBzZXJpYWwgZGVidWdnaW5nLgogCSAqIFRoaXMgYWxsb3dzIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIG91dHB1dApAQCAtMzcyLDI4ICszNzIsMjQgQEAKIAl0ZXEJcjEsICNNQUNIX1RZUEVfTkVUV0lOREVSCiAJdGVxbmUJcjEsICNNQUNIX1RZUEVfQ0FUUwogCWJuZQkxZgotCWFkZAlyMCwgcjQsICMweDNmYzAJCQlAIGZmMDAwMDAwCi0JbW92CXIzLCAjMHg3YzAwMDAwMAotCW9ycglyMywgcjMsIHI3Ci0Jc3RyCXIzLCBbcjBdLCAjNAotCWFkZAlyMywgcjMsICMxIDw8IDIwCi0Jc3RyCXIzLCBbcjBdLCAjNAorCWFkZAlyMCwgcjQsICMweGZmMDAwMDAwID4+IDE4CisJb3JyCXIzLCByNywgIzB4N2MwMDAwMDAKKwlzdHIJcjMsIFtyMF0KIDE6CiAjZW5kaWYKLSNlbmRpZgogI2lmZGVmIENPTkZJR19BUkNIX1JQQwogCS8qCiAJICogTWFwIGluIHNjcmVlbiBhdCAweDAyMDAwMDAwICYgU0NSRUVOMl9CQVNFCiAJICogU2ltaWxhciByZWFzb25zIGhlcmUgLSBmb3IgZGVidWcuICBUaGlzIGlzCiAJICogb25seSBmb3IgQWNvcm4gUmlzY1BDIGFyY2hpdGVjdHVyZXMuCiAJICovCi0JYWRkCXIwLCByNCwgIzB4ODAJCQlAIDAyMDAwMDAwCi0JbW92CXIzLCAjMHgwMjAwMDAwMAotCW9ycglyMywgcjMsIHI3CisJYWRkCXIwLCByNCwgIzB4MDIwMDAwMDAgPj4gMTgKKwlvcnIJcjMsIHI3LCAjMHgwMjAwMDAwMAogCXN0cglyMywgW3IwXQotCWFkZAlyMCwgcjQsICMweDM2MDAJCQlAIGQ4MDAwMDAwCisJYWRkCXIwLCByNCwgIzB4ZDgwMDAwMDAgPj4gMTgKIAlzdHIJcjMsIFtyMF0KICNlbmRpZgorI2VuZGlmCiAJbW92CXBjLCBscgogCS5sdG9yZwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKaW5kZXggZmYxODdmNC4uMzk1MTM3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwpAQCAtNCw2ICs0LDEwIEBACiAgKiAgQ29weXJpZ2h0IChDKSAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgTW9kaWZpY2F0aW9ucyBmb3IgQVJNIHByb2Nlc3NvciBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBSdXNzZWxsIEtpbmcuCiAgKgorICogIFN1cHBvcnQgZm9yIER5bmFtaWMgVGljayBUaW1lciBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbi4KKyAqICBEeW5hbWljIFRpY2sgVGltZXIgd3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPiBhbmQKKyAqICBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4uCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTM3LDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIAogLyoKICAqIE1heGltdW0gSVJRIGNvdW50LiAgQ3VycmVudGx5LCB0aGlzIGlzIGFyYml0YXJ5LiAgSG93ZXZlciwgaXQgc2hvdWxkCkBAIC0zMjksNiArMzM0LDE1IEBACiAKIAlzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CiAKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgorCWlmICghKGFjdGlvbi0+ZmxhZ3MgJiBTQV9USU1FUikgJiYgc3lzdGVtX3RpbWVyLT5keW5fdGljayAhPSBOVUxMKSB7CisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCQlpZiAoc3lzdGVtX3RpbWVyLT5keW5fdGljay0+c3RhdGUgJiBEWU5fVElDS19FTkFCTEVEKQorCQkJc3lzdGVtX3RpbWVyLT5keW5fdGljay0+aGFuZGxlcihpcnEsIDAsIHJlZ3MpOworCQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOworCX0KKyNlbmRpZgorCiAJaWYgKCEoYWN0aW9uLT5mbGFncyAmIFNBX0lOVEVSUlVQVCkpCiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOGYxNDZhNC4uYmJlYTYzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CiAKIGV4dGVybiBjb25zdCBjaGFyICpwcm9jZXNzb3JfbW9kZXNbXTsKIGV4dGVybiB2b2lkIHNldHVwX21tX2Zvcl9yZWJvb3QoY2hhciBtb2RlKTsKQEAgLTg1LDggKzg2LDEwIEBACiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQogewogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaGx0X2NvdW50ZXIpCisJaWYgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaGx0X2NvdW50ZXIpIHsKKwkJdGltZXJfZHluX3JlcHJvZ3JhbSgpOwogCQlhcmNoX2lkbGUoKTsKKwl9CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IDhjZjczM2QuLmM5YjY5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0zNTksNyArMzU5LDggQEAKIAkgICAgICAiSSIgKG9mZnNldG9mKHN0cnVjdCBzdGFjaywgYWJ0WzBdKSksCiAJICAgICAgIkkiIChQU1JfRl9CSVQgfCBQU1JfSV9CSVQgfCBVTkRfTU9ERSksCiAJICAgICAgIkkiIChvZmZzZXRvZihzdHJ1Y3Qgc3RhY2ssIHVuZFswXSkpLAotCSAgICAgICJJIiAoUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgU1ZDX01PREUpKTsKKwkgICAgICAiSSIgKFBTUl9GX0JJVCB8IFBTUl9JX0JJVCB8IFNWQ19NT0RFKQorCSAgICA6ICJyMTQiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtYWNoaW5lX2Rlc2MgKiBfX2luaXQgc2V0dXBfbWFjaGluZSh1bnNpZ25lZCBpbnQgbnIpCkBAIC03MzYsOCArNzM3LDggQEAKIAlpZiAobWRlc2MtPnNvZnRfcmVib290KQogCQlyZWJvb3Rfc2V0dXAoInMiKTsKIAotCWlmIChtZGVzYy0+cGFyYW1fb2Zmc2V0KQotCQl0YWdzID0gcGh5c190b192aXJ0KG1kZXNjLT5wYXJhbV9vZmZzZXQpOworCWlmIChtZGVzYy0+Ym9vdF9wYXJhbXMpCisJCXRhZ3MgPSBwaHlzX3RvX3ZpcnQobWRlc2MtPmJvb3RfcGFyYW1zKTsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSB0aGUgb2xkIHN0eWxlIHBhcmFtZXRlcnMsIGNvbnZlcnQgdGhlbSB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCmluZGV4IDA3ZGRlZWQ2MS4uNWU0MzVlNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXJldHVybiAwOwogCi0JaWYgKHRyeV90b19mcmVlemUoMCkpCisJaWYgKHRyeV90b19mcmVlemUoKSkKIAkJZ290byBub19zaWduYWw7CiAKIAlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfU0lOR0xFU1RFUCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwppbmRleCAzNDg5Mjc1Li5hOTMxNDA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCkBAIC01MDIsMyArNTAyLDEyNiBAQAogewogCXJldHVybiAtRUlOVkFMOwogfQorCitzdGF0aWMgaW50Citvbl9lYWNoX2NwdV9tYXNrKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICppbmZvLCBpbnQgcmV0cnksIGludCB3YWl0LAorCQkgY3B1bWFza190IG1hc2spCit7CisJaW50IHJldCA9IDA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCXJldCA9IHNtcF9jYWxsX2Z1bmN0aW9uX29uX2NwdShmdW5jLCBpbmZvLCByZXRyeSwgd2FpdCwgbWFzayk7CisJaWYgKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIG1hc2spKQorCQlmdW5jKGluZm8pOworCisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVExCIG9wZXJhdGlvbnMKKyAqLworc3RydWN0IHRsYl9hcmdzIHsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnRhX3ZtYTsKKwl1bnNpZ25lZCBsb25nIHRhX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgdGFfZW5kOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGlwaV9mbHVzaF90bGJfYWxsKHZvaWQgKmlnbm9yZWQpCit7CisJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXBpX2ZsdXNoX3RsYl9tbSh2b2lkICphcmcpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSAoc3RydWN0IG1tX3N0cnVjdCAqKWFyZzsKKworCWxvY2FsX2ZsdXNoX3RsYl9tbShtbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlfZmx1c2hfdGxiX3BhZ2Uodm9pZCAqYXJnKQoreworCXN0cnVjdCB0bGJfYXJncyAqdGEgPSAoc3RydWN0IHRsYl9hcmdzICopYXJnOworCisJbG9jYWxfZmx1c2hfdGxiX3BhZ2UodGEtPnRhX3ZtYSwgdGEtPnRhX3N0YXJ0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwaV9mbHVzaF90bGJfa2VybmVsX3BhZ2Uodm9pZCAqYXJnKQoreworCXN0cnVjdCB0bGJfYXJncyAqdGEgPSAoc3RydWN0IHRsYl9hcmdzICopYXJnOworCisJbG9jYWxfZmx1c2hfdGxiX2tlcm5lbF9wYWdlKHRhLT50YV9zdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcGlfZmx1c2hfdGxiX3JhbmdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGxiX2FyZ3MgKnRhID0gKHN0cnVjdCB0bGJfYXJncyAqKWFyZzsKKworCWxvY2FsX2ZsdXNoX3RsYl9yYW5nZSh0YS0+dGFfdm1hLCB0YS0+dGFfc3RhcnQsIHRhLT50YV9lbmQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXBpX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uodm9pZCAqYXJnKQoreworCXN0cnVjdCB0bGJfYXJncyAqdGEgPSAoc3RydWN0IHRsYl9hcmdzICopYXJnOworCisJbG9jYWxfZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh0YS0+dGFfc3RhcnQsIHRhLT50YV9lbmQpOworfQorCit2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCkKK3sKKwlvbl9lYWNoX2NwdShpcGlfZmx1c2hfdGxiX2FsbCwgTlVMTCwgMSwgMSk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWNwdW1hc2tfdCBtYXNrID0gbW0tPmNwdV92bV9tYXNrOworCisJb25fZWFjaF9jcHVfbWFzayhpcGlfZmx1c2hfdGxiX21tLCBtbSwgMSwgMSwgbWFzayk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdWFkZHIpCit7CisJY3B1bWFza190IG1hc2sgPSB2bWEtPnZtX21tLT5jcHVfdm1fbWFzazsKKwlzdHJ1Y3QgdGxiX2FyZ3MgdGE7CisKKwl0YS50YV92bWEgPSB2bWE7CisJdGEudGFfc3RhcnQgPSB1YWRkcjsKKworCW9uX2VhY2hfY3B1X21hc2soaXBpX2ZsdXNoX3RsYl9wYWdlLCAmdGEsIDEsIDEsIG1hc2spOworfQorCit2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKQoreworCXN0cnVjdCB0bGJfYXJncyB0YTsKKworCXRhLnRhX3N0YXJ0ID0ga2FkZHI7CisKKwlvbl9lYWNoX2NwdShpcGlfZmx1c2hfdGxiX2tlcm5lbF9wYWdlLCAmdGEsIDEsIDEpOworfQorCit2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCWNwdW1hc2tfdCBtYXNrID0gdm1hLT52bV9tbS0+Y3B1X3ZtX21hc2s7CisJc3RydWN0IHRsYl9hcmdzIHRhOworCisJdGEudGFfdm1hID0gdm1hOworCXRhLnRhX3N0YXJ0ID0gc3RhcnQ7CisJdGEudGFfZW5kID0gZW5kOworCisJb25fZWFjaF9jcHVfbWFzayhpcGlfZmx1c2hfdGxiX3JhbmdlLCAmdGEsIDEsIDEsIG1hc2spOworfQorCit2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IHRsYl9hcmdzIHRhOworCisJdGEudGFfc3RhcnQgPSBzdGFydDsKKwl0YS50YV9lbmQgPSBlbmQ7CisKKwlvbl9lYWNoX2NwdShpcGlfZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSwgJnRhLCAxLCAxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IGMyMzJmMjQuLjFiN2ZjZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtMzgxLDYgKzM4MSw5OSBAQAogCS5yZXN1bWUJCT0gdGltZXJfcmVzdW1lLAogfTsKIAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCitzdGF0aWMgaW50IHRpbWVyX2R5bl90aWNrX2VuYWJsZSh2b2lkKQoreworCXN0cnVjdCBkeW5fdGlja190aW1lciAqZHluX3RpY2sgPSBzeXN0ZW1fdGltZXItPmR5bl90aWNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAoZHluX3RpY2spIHsKKwkJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCXJldCA9IDA7CisJCWlmICghKGR5bl90aWNrLT5zdGF0ZSAmIERZTl9USUNLX0VOQUJMRUQpKSB7CisJCQlyZXQgPSBkeW5fdGljay0+ZW5hYmxlKCk7CisKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlkeW5fdGljay0+c3RhdGUgfD0gRFlOX1RJQ0tfRU5BQkxFRDsKKwkJfQorCQl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGltZXJfZHluX3RpY2tfZGlzYWJsZSh2b2lkKQoreworCXN0cnVjdCBkeW5fdGlja190aW1lciAqZHluX3RpY2sgPSBzeXN0ZW1fdGltZXItPmR5bl90aWNrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlpZiAoZHluX3RpY2spIHsKKwkJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJCXJldCA9IDA7CisJCWlmIChkeW5fdGljay0+c3RhdGUgJiBEWU5fVElDS19FTkFCTEVEKSB7CisJCQlyZXQgPSBkeW5fdGljay0+ZGlzYWJsZSgpOworCisJCQlpZiAocmV0ID09IDApCisJCQkJZHluX3RpY2stPnN0YXRlICY9IH5EWU5fVElDS19FTkFCTEVEOworCQl9CisJCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlcHJvZ3JhbSB0aGUgc3lzdGVtIHRpbWVyIGZvciBhdCBsZWFzdCB0aGUgY2FsY3VsYXRlZCB0aW1lIGludGVydmFsLgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGlkbGUgdGhyZWFkIHdpdGggSVJRcyBkaXNhYmxlZCwKKyAqIGltbWVkaWF0ZWx5IGJlZm9yZSBzbGVlcGluZy4KKyAqLwordm9pZCB0aW1lcl9keW5fcmVwcm9ncmFtKHZvaWQpCit7CisJc3RydWN0IGR5bl90aWNrX3RpbWVyICpkeW5fdGljayA9IHN5c3RlbV90aW1lci0+ZHluX3RpY2s7CisKKwl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKKwlpZiAoZHluX3RpY2stPnN0YXRlICYgRFlOX1RJQ0tfRU5BQkxFRCkKKwkJZHluX3RpY2stPnJlcHJvZ3JhbShuZXh0X3RpbWVyX2ludGVycnVwdCgpIC0gamlmZmllcyk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKK30KKworc3RhdGljIHNzaXplX3QgdGltZXJfc2hvd19keW5fdGljayhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsCisJCSAgICAgICAoc3lzdGVtX3RpbWVyLT5keW5fdGljay0+c3RhdGUgJiBEWU5fVElDS19FTkFCTEVEKSA+PiAxKTsKK30KKworc3RhdGljIHNzaXplX3QgdGltZXJfc2V0X2R5bl90aWNrKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgZW5hYmxlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAyKTsKKworCWlmIChlbmFibGUpCisJCXRpbWVyX2R5bl90aWNrX2VuYWJsZSgpOworCWVsc2UKKwkJdGltZXJfZHluX3RpY2tfZGlzYWJsZSgpOworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIFNZU0RFVl9BVFRSKGR5bl90aWNrLCAwNjQ0LCB0aW1lcl9zaG93X2R5bl90aWNrLCB0aW1lcl9zZXRfZHluX3RpY2spOworCisvKgorICogZHludGljaz1lbmFibGV8ZGlzYWJsZQorICovCitzdGF0aWMgY2hhciBkeW50aWNrX3N0cls0XSBfX2luaXRkYXRhID0gIiI7CisKK3N0YXRpYyBpbnQgX19pbml0IGR5bnRpY2tfc2V0dXAoY2hhciAqc3RyKQoreworCWlmIChzdHIpCisJCXN0cmxjcHkoZHludGlja19zdHIsIHN0ciwgc2l6ZW9mKGR5bnRpY2tfc3RyKSk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImR5bnRpY2s9IiwgZHludGlja19zZXR1cCk7CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgdGltZXJfaW5pdF9zeXNmcyh2b2lkKQogewogCWludCByZXQgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJnRpbWVyX3N5c2NsYXNzKTsKQEAgLTM4OCw2ICs0ODEsMjAgQEAKIAkJc3lzdGVtX3RpbWVyLT5kZXYuY2xzID0gJnRpbWVyX3N5c2NsYXNzOwogCQlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJnN5c3RlbV90aW1lci0+ZGV2KTsKIAl9CisKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgorCWlmIChyZXQgPT0gMCAmJiBzeXN0ZW1fdGltZXItPmR5bl90aWNrKSB7CisJCXJldCA9IHN5c2Rldl9jcmVhdGVfZmlsZSgmc3lzdGVtX3RpbWVyLT5kZXYsICZhdHRyX2R5bl90aWNrKTsKKworCQkvKgorCQkgKiBUdXJuIG9uIGR5bmFtaWMgdGljayBhZnRlciBjYWxpYnJhdGUgZGVsYXkKKwkJICogZm9yIGNvcnJlY3QgYm9nb21pcHMKKwkJICovCisJCWlmIChyZXQgPT0gMCAmJiBkeW50aWNrX3N0clswXSA9PSAnZScpCisJCQlyZXQgPSB0aW1lcl9keW5fdGlja19lbmFibGUoKTsKKwl9CisjZW5kaWYKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggMmZiMGE0Yy4uZGYyY2IwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTIzMCwxNiArMjMwLDggQEAKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCi12b2lkIGRpZV9pZl9rZXJuZWwoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGVycikKLXsKLQlpZiAodXNlcl9tb2RlKHJlZ3MpKQotICAgIAkJcmV0dXJuOwotCi0gICAgCWRpZShzdHIsIHJlZ3MsIGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vdGlmeV9kaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnaW5mb190ICppbmZvLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBlcnIsIHVuc2lnbmVkIGxvbmcgdHJhcCkKK3ZvaWQgbm90aWZ5X2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywKKwkJdW5zaWduZWQgbG9uZyBlcnIsIHVuc2lnbmVkIGxvbmcgdHJhcCkKIHsKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWN1cnJlbnQtPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL01ha2VmaWxlIGIvYXJjaC9hcm0vbGliL01ha2VmaWxlCmluZGV4IGMwZTY1ODMuLjg3MjVkNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9saWIvTWFrZWZpbGUKQEAgLTExLDcgKzExLDcgQEAKIAkJICAgc3Rybmxlbl91c2VyLm8gc3RyY2hyLm8gc3RycmNoci5vIHRlc3RjaGFuZ2ViaXQubyAgXAogCQkgICB0ZXN0Y2xlYXJiaXQubyB0ZXN0c2V0Yml0Lm8gdWFjY2Vzcy5vIGdldHVzZXIubyAgICBcCiAJCSAgIHB1dHVzZXIubyBhc2hsZGkzLm8gYXNocmRpMy5vIGxzaHJkaTMubyBtdWxkaTMubyAgIFwKLQkJICAgdWNtcGRpMi5vIHVkaXZkaTMubyBsaWIxZnVuY3MubyBkaXY2NC5vCSAgICAgIFwKKwkJICAgdWNtcGRpMi5vIGxpYjFmdW5jcy5vIGRpdjY0Lm8JICAgICAgICAgICAgICBcCiAJCSAgIGlvLXJlYWRzYi5vIGlvLXdyaXRlc2IubyBpby1yZWFkc2wubyBpby13cml0ZXNsLm8KIAogaWZlcSAoJChDT05GSUdfQ1BVXzMydjMpLHkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvbG9uZ2xvbmcuaCBiL2FyY2gvYXJtL2xpYi9sb25nbG9uZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGFlNjQ3ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9saWIvbG9uZ2xvbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKiBsb25nbG9uZy5oIC0tIGJhc2VkIG9uIGNvZGUgZnJvbSBnY2MtMi45NS4zCi0KLSAgIGRlZmluaXRpb25zIGZvciBtaXhlZCBzaXplIDMyLzY0IGJpdCBhcml0aG1ldGljLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBkZWZpbml0aW9uIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKLSAgIGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIGRlZmluaXRpb24gZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLSAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEJvcnJvd2VkIGZyb20gR0NDIDIuOTUuMywgSSBNb2x0b24gMjkvMDcvMDEgKi8KLQotI2lmbmRlZiBTSV9UWVBFX1NJWkUKLSNkZWZpbmUgU0lfVFlQRV9TSVpFIDMyCi0jZW5kaWYKLQotI2RlZmluZSBfX0JJVFM0IChTSV9UWVBFX1NJWkUgLyA0KQotI2RlZmluZSBfX2xsX0IgKDFMIDw8IChTSV9UWVBFX1NJWkUgLyAyKSkKLSNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgodTMyKSAodCkgJSBfX2xsX0IpCi0jZGVmaW5lIF9fbGxfaGlnaHBhcnQodCkgKCh1MzIpICh0KSAvIF9fbGxfQikKLQotLyogRGVmaW5lIGF1eGlsaWFyeSBhc20gbWFjcm9zLgotCi0gICAxKSB1bXVsX3BwbW0oaGlnaF9wcm9kLCBsb3dfcHJvZCwgbXVsdGlwbGVyLCBtdWx0aXBsaWNhbmQpCi0gICBtdWx0aXBsaWVzIHR3byB1MzIgaW50ZWdlcnMgTVVMVElQTEVSIGFuZCBNVUxUSVBMSUNBTkQsCi0gICBhbmQgZ2VuZXJhdGVzIGEgdHdvLXBhcnQgdTMyIHByb2R1Y3QgaW4gSElHSF9QUk9EIGFuZAotICAgTE9XX1BST0QuCi0KLSAgIDIpIF9fdW11bHNpZGkzKGEsYikgbXVsdGlwbGllcyB0d28gdTMyIGludGVnZXJzIEEgYW5kIEIsCi0gICBhbmQgcmV0dXJucyBhIHU2NCBwcm9kdWN0LiAgVGhpcyBpcyBqdXN0IGEgdmFyaWFudCBvZiB1bXVsX3BwbW0uCi0KLSAgIDMpIHVkaXZfcXJubmQocXVvdGllbnQsIHJlbWFpbmRlciwgaGlnaF9udW1lcmF0b3IsIGxvd19udW1lcmF0b3IsCi0gICBkZW5vbWluYXRvcikgZGl2aWRlcyBhIHR3by13b3JkIHVuc2lnbmVkIGludGVnZXIsIGNvbXBvc2VkIGJ5IHRoZQotICAgaW50ZWdlcnMgSElHSF9OVU1FUkFUT1IgYW5kIExPV19OVU1FUkFUT1IsIGJ5IERFTk9NSU5BVE9SIGFuZAotICAgcGxhY2VzIHRoZSBxdW90aWVudCBpbiBRVU9USUVOVCBhbmQgdGhlIHJlbWFpbmRlciBpbiBSRU1BSU5ERVIuCi0gICBISUdIX05VTUVSQVRPUiBtdXN0IGJlIGxlc3MgdGhhbiBERU5PTUlOQVRPUiBmb3IgY29ycmVjdCBvcGVyYXRpb24uCi0gICBJZiwgaW4gYWRkaXRpb24sIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsCi0gICB0aGVuIHRoZSBwcmUtcHJvY2Vzc29yIHN5bWJvbCBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgotCi0gICA0KSBzZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAotICAgZGVub21pbmF0b3IpLiAgTGlrZSB1ZGl2X3Fybm5kIGJ1dCB0aGUgbnVtYmVycyBhcmUgc2lnbmVkLiAgVGhlCi0gICBxdW90aWVudCBpcyByb3VuZGVkIHRvd2FyZHMgMC4KLQotICAgNSkgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgY291bnRzIHRoZSBudW1iZXIgb2YgemVyby1iaXRzIGZyb20KLSAgIHRoZSBtc2IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiBzdGVwcyBYCi0gICBuZWVkcyB0byBiZSBzaGlmdGVkIGxlZnQgdG8gc2V0IHRoZSBtc2IuICBVbmRlZmluZWQgZm9yIFggPT0gMC4KLQotICAgNikgYWRkX3NzYWFhYShoaWdoX3N1bSwgbG93X3N1bSwgaGlnaF9hZGRlbmRfMSwgbG93X2FkZGVuZF8xLAotICAgaGlnaF9hZGRlbmRfMiwgbG93X2FkZGVuZF8yKSBhZGRzIHR3byB0d28td29yZCB1bnNpZ25lZCBpbnRlZ2VycywKLSAgIGNvbXBvc2VkIGJ5IEhJR0hfQURERU5EXzEgYW5kIExPV19BRERFTkRfMSwgYW5kIEhJR0hfQURERU5EXzIgYW5kCi0gICBMT1dfQURERU5EXzIgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9TVU0gYW5kCi0gICBMT1dfU1VNLiAgT3ZlcmZsb3cgKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgaXMKLSAgIGxvc3QuCi0KLSAgIDcpIHN1Yl9kZG1tc3MoaGlnaF9kaWZmZXJlbmNlLCBsb3dfZGlmZmVyZW5jZSwgaGlnaF9taW51ZW5kLAotICAgbG93X21pbnVlbmQsIGhpZ2hfc3VidHJhaGVuZCwgbG93X3N1YnRyYWhlbmQpIHN1YnRyYWN0cyB0d28KLSAgIHR3by13b3JkIHVuc2lnbmVkIGludGVnZXJzLCBjb21wb3NlZCBieSBISUdIX01JTlVFTkRfMSBhbmQKLSAgIExPV19NSU5VRU5EXzEsIGFuZCBISUdIX1NVQlRSQUhFTkRfMiBhbmQgTE9XX1NVQlRSQUhFTkRfMgotICAgcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9ESUZGRVJFTkNFIGFuZAotICAgTE9XX0RJRkZFUkVOQ0UuICBPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsCi0gICBhbmQgaXMgbG9zdC4KLQotICAgSWYgYW55IG9mIHRoZXNlIG1hY3JvcyBhcmUgbGVmdCB1bmRlZmluZWQgZm9yIGEgcGFydGljdWxhciBDUFUsCi0gICBDIG1hY3JvcyBhcmUgdXNlZC4gICovCi0KLSNpZiBkZWZpbmVkIChfX2FybV9fKQotI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKLSAgX19hc21fXyAoImFkZHMJJTEsICU0LCAlNQkJCQkJXG5cCi0JYWRjCSUwLCAlMiwgJTMiCQkJCQkJXAotCSAgIDogIj1yIiAoKHUzMikgKHNoKSksCQkJCQlcCi0JICAgICAiPSZyIiAoKHUzMikgKHNsKSkJCQkJCVwKLQkgICA6ICIlciIgKCh1MzIpIChhaCkpLAkJCQkJXAotCSAgICAgInJJIiAoKHUzMikgKGJoKSksCQkJCQlcCi0JICAgICAiJXIiICgodTMyKSAoYWwpKSwJCQkJCVwKLQkgICAgICJySSIgKCh1MzIpIChibCkpKQotI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKLSAgX19hc21fXyAoInN1YnMJJTEsICU0LCAlNQkJCQkJXG5cCi0Jc2JjCSUwLCAlMiwgJTMiCQkJCQkJXAotCSAgIDogIj1yIiAoKHUzMikgKHNoKSksCQkJCQlcCi0JICAgICAiPSZyIiAoKHUzMikgKHNsKSkJCQkJCVwKLQkgICA6ICJyIiAoKHUzMikgKGFoKSksCQkJCQlcCi0JICAgICAickkiICgodTMyKSAoYmgpKSwJCQkJCVwKLQkgICAgICJyIiAoKHUzMikgKGFsKSksCQkJCQlcCi0JICAgICAickkiICgodTMyKSAoYmwpKSkKLSNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAote3JlZ2lzdGVyIHUzMiBfX3QwLCBfX3QxLCBfX3QyOwkJCQkJXAotICBfX2FzbV9fICgiJUAgSW5saW5lZCB1bXVsX3BwbW0JCQkJCVxuXAotCW1vdgklMiwgJTUsIGxzciAjMTYJCQkJCQlcblwKLQltb3YJJTAsICU2LCBsc3IgIzE2CQkJCQkJXG5cCi0JYmljCSUzLCAlNSwgJTIsIGxzbCAjMTYJCQkJCVxuXAotCWJpYwklNCwgJTYsICUwLCBsc2wgIzE2CQkJCQlcblwKLQltdWwJJTEsICUzLCAlNAkJCQkJCVxuXAotCW11bAklNCwgJTIsICU0CQkJCQkJXG5cCi0JbXVsCSUzLCAlMCwgJTMJCQkJCQlcblwKLQltdWwJJTAsICUyLCAlMAkJCQkJCVxuXAotCWFkZHMJJTMsICU0LCAlMwkJCQkJCVxuXAotCWFkZGNzCSUwLCAlMCwgIzY1NTM2CQkJCQkJXG5cCi0JYWRkcwklMSwgJTEsICUzLCBsc2wgIzE2CQkJCQlcblwKLQlhZGMJJTAsICUwLCAlMywgbHNyICMxNiIJCQkJCVwKLQkgICA6ICI9JnIiICgodTMyKSAoeGgpKSwJCQkJCVwKLQkgICAgICI9ciIgKCh1MzIpICh4bCkpLAkJCQkJXAotCSAgICAgIj0mciIgKF9fdDApLCAiPSZyIiAoX190MSksICI9ciIgKF9fdDIpCQkJXAotCSAgIDogInIiICgodTMyKSAoYSkpLAkJCQkJXAotCSAgICAgInIiICgodTMyKSAoYikpKTt9Ci0jZGVmaW5lIFVNVUxfVElNRSAyMAotI2RlZmluZSBVRElWX1RJTUUgMTAwCi0jZW5kaWYJCQkJLyogX19hcm1fXyAqLwotCi0jZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKLSAgKHtESXVuaW9uIF9fdzsJCQkJCQkJXAotICAgIHVtdWxfcHBtbSAoX193LnMuaGlnaCwgX193LnMubG93LCB1LCB2KTsJCQkJXAotICAgIF9fdy5sbDsgfSkKLQotI2RlZmluZSBfX3VkaXZfcXJubmRfYyhxLCByLCBuMSwgbjAsIGQpIFwKLSAgZG8gewkJCQkJCQkJCVwKLSAgICB1MzIgX19kMSwgX19kMCwgX19xMSwgX19xMDsJCQkJCVwKLSAgICB1MzIgX19yMSwgX19yMCwgX19tOwkJCQkJCVwKLSAgICBfX2QxID0gX19sbF9oaWdocGFydCAoZCk7CQkJCQkJXAotICAgIF9fZDAgPSBfX2xsX2xvd3BhcnQgKGQpOwkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICBfX3IxID0gKG4xKSAlIF9fZDE7CQkJCQkJCVwKLSAgICBfX3ExID0gKG4xKSAvIF9fZDE7CQkJCQkJCVwKLSAgICBfX20gPSAodTMyKSBfX3ExICogX19kMDsJCQkJCVwKLSAgICBfX3IxID0gX19yMSAqIF9fbGxfQiB8IF9fbGxfaGlnaHBhcnQgKG4wKTsJCQkJXAotICAgIGlmIChfX3IxIDwgX19tKQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQkJXAotCWlmIChfX3IxID49IChkKSkgLyogaS5lLiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5IHdoZW4gYWRkaW5nIHRvIF9fcjEgKi9cCi0JICBpZiAoX19yMSA8IF9fbSkJCQkJCQlcCi0JICAgIF9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIF9fcjEgLT0gX19tOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgX19yMCA9IF9fcjEgJSBfX2QxOwkJCQkJCQlcCi0gICAgX19xMCA9IF9fcjEgLyBfX2QxOwkJCQkJCQlcCi0gICAgX19tID0gKHUzMikgX19xMCAqIF9fZDA7CQkJCQlcCi0gICAgX19yMCA9IF9fcjAgKiBfX2xsX0IgfCBfX2xsX2xvd3BhcnQgKG4wKTsJCQkJXAotICAgIGlmIChfX3IwIDwgX19tKQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQkJXAotCWlmIChfX3IwID49IChkKSkJCQkJCQlcCi0JICBpZiAoX19yMCA8IF9fbSkJCQkJCQlcCi0JICAgIF9fcTAtLSwgX19yMCArPSAoZCk7CQkJCQlcCi0gICAgICB9CQkJCQkJCQkJXAotICAgIF9fcjAgLT0gX19tOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgKHEpID0gKHUzMikgX19xMSAqIF9fbGxfQiB8IF9fcTA7CQkJCVwKLSAgICAocikgPSBfX3IwOwkJCQkJCQkJXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAxCi0jZGVmaW5lIHVkaXZfcXJubmQgX191ZGl2X3Fybm5kX2MKLQotI2RlZmluZSBjb3VudF9sZWFkaW5nX3plcm9zKGNvdW50LCB4KSBcCi0gIGRvIHsJCQkJCQkJCQlcCi0gICAgdTMyIF9feHIgPSAoeCk7CQkJCQkJCVwKLSAgICB1MzIgX19hOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0gICAgaWYgKFNJX1RZUEVfU0laRSA8PSAzMikJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCV9fYSA9IF9feHIgPCAoKHUzMikxPDwyKl9fQklUUzQpCQkJCVwKLQkgID8gKF9feHIgPCAoKHUzMikxPDxfX0JJVFM0KSA/IDAgOiBfX0JJVFM0KQkJXAotCSAgOiAoX194ciA8ICgodTMyKTE8PDMqX19CSVRTNCkgPyAgMipfX0JJVFM0IDogMypfX0JJVFM0KTsJXAotICAgICAgfQkJCQkJCQkJCVwKLSAgICBlbHNlCQkJCQkJCQlcCi0gICAgICB7CQkJCQkJCQkJXAotCWZvciAoX19hID0gU0lfVFlQRV9TSVpFIC0gODsgX19hID4gMDsgX19hIC09IDgpCQkJXAotCSAgaWYgKCgoX194ciA+PiBfX2EpICYgMHhmZikgIT0gMCkJCQkJXAotCSAgICBicmVhazsJCQkJCQkJXAotICAgICAgfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLSAgICAoY291bnQpID0gU0lfVFlQRV9TSVpFIC0gKF9fY2x6X3RhYltfX3hyID4+IF9fYV0gKyBfX2EpOwkJXAotICB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL3VkaXZkaTMuYyBiL2FyY2gvYXJtL2xpYi91ZGl2ZGkzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDNiZTQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbGliL3VkaXZkaTMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKiBNb3JlIHN1YnJvdXRpbmVzIG5lZWRlZCBieSBHQ0Mgb3V0cHV0IGNvZGUgb24gc29tZSBtYWNoaW5lcy4gICovCi0vKiBDb21waWxlIHRoaXMgb25lIHdpdGggZ2NjLiAgKi8KLS8qIENvcHlyaWdodCAoQykgMTk4OSwgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLQotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggb3RoZXIgZmlsZXMsCi0gICBzb21lIG9mIHdoaWNoIGFyZSBjb21waWxlZCB3aXRoIEdDQywgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLAotICAgdGhpcyBsaWJyYXJ5IGRvZXMgbm90IGJ5IGl0c2VsZiBjYXVzZSB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUKLSAgIHRvIGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotICAgVGhpcyBleGNlcHRpb24gZG9lcyBub3QgaG93ZXZlciBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeQotICAgdGhlIGV4ZWN1dGFibGUgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLSAqLwotLyogc3VwcG9ydCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGtlcm5lbC4gYmFzZWQgb24gY29kZSBmcm9tIGdjYy0yLjk1LjMgKi8KLS8qIEkgTW9sdG9uICAgICAyOS8wNy8wMSAqLwotCi0jaW5jbHVkZSAiZ2NjbGliLmgiCi0jaW5jbHVkZSAibG9uZ2xvbmcuaCIKLQotc3RhdGljIGNvbnN0IHU4IF9fY2x6X3RhYltdID0gewotCTAsIDEsIDIsIDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCi0JICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCi0JNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKLQkgICAgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKLQk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAotCSAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAotCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCi0JICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCi0JOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLQkgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLQk4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAotCSAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAotCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCi0JICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCi0JOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLQkgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKLX07Ci0KLXU2NCBfX3VkaXZtb2RkaTQodTY0IG4sIHU2NCBkLCB1NjQgKiBycCkKLXsKLQlESXVuaW9uIHd3OwotCURJdW5pb24gbm4sIGRkOwotCURJdW5pb24gcnI7Ci0JdTMyIGQwLCBkMSwgbjAsIG4xLCBuMjsKLQl1MzIgcTAsIHExOwotCXUzMiBiLCBibTsKLQotCW5uLmxsID0gbjsKLQlkZC5sbCA9IGQ7Ci0KLQlkMCA9IGRkLnMubG93OwotCWQxID0gZGQucy5oaWdoOwotCW4wID0gbm4ucy5sb3c7Ci0JbjEgPSBubi5zLmhpZ2g7Ci0KLQlpZiAoZDEgPT0gMCkgewotCQlpZiAoZDAgPiBuMSkgewotCQkJLyogMHEgPSBubiAvIDBEICovCi0KLQkJCWNvdW50X2xlYWRpbmdfemVyb3MoYm0sIGQwKTsKLQotCQkJaWYgKGJtICE9IDApIHsKLQkJCQkvKiBOb3JtYWxpemUsIGkuZS4gbWFrZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlCi0JCQkJICAgZGVub21pbmF0b3Igc2V0LiAgKi8KLQotCQkJCWQwID0gZDAgPDwgYm07Ci0JCQkJbjEgPSAobjEgPDwgYm0pIHwgKG4wID4+IChTSV9UWVBFX1NJWkUgLSBibSkpOwotCQkJCW4wID0gbjAgPDwgYm07Ci0JCQl9Ci0KLQkJCXVkaXZfcXJubmQocTAsIG4wLCBuMSwgbjAsIGQwKTsKLQkJCXExID0gMDsKLQotCQkJLyogUmVtYWluZGVyIGluIG4wID4+IGJtLiAgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIHFxID0gTk4gLyAwZCAqLwotCi0JCQlpZiAoZDAgPT0gMCkKLQkJCQlkMCA9IDEgLyBkMDsJLyogRGl2aWRlIGludGVudGlvbmFsbHkgYnkgemVyby4gICovCi0KLQkJCWNvdW50X2xlYWRpbmdfemVyb3MoYm0sIGQwKTsKLQotCQkJaWYgKGJtID09IDApIHsKLQkJCQkvKiBGcm9tIChuMSA+PSBkMCkgL1wgKHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBkMCBpcyBzZXQpLAotCQkJCSAgIGNvbmNsdWRlICh0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgbjEgaXMgc2V0KSAvXCAodGhlCi0JCQkJICAgbGVhZGluZyBxdW90aWVudCBkaWdpdCBxMSA9IDEpLgotCi0JCQkJICAgVGhpcyBzcGVjaWFsIGNhc2UgaXMgbmVjZXNzYXJ5LCBub3QgYW4gb3B0aW1pemF0aW9uLgotCQkJCSAgIChTaGlmdHMgY291bnRzIG9mIFNJX1RZUEVfU0laRSBhcmUgdW5kZWZpbmVkLikgICovCi0KLQkJCQluMSAtPSBkMDsKLQkJCQlxMSA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCS8qIE5vcm1hbGl6ZS4gICovCi0KLQkJCQliID0gU0lfVFlQRV9TSVpFIC0gYm07Ci0KLQkJCQlkMCA9IGQwIDw8IGJtOwotCQkJCW4yID0gbjEgPj4gYjsKLQkJCQluMSA9IChuMSA8PCBibSkgfCAobjAgPj4gYik7Ci0JCQkJbjAgPSBuMCA8PCBibTsKLQotCQkJCXVkaXZfcXJubmQocTEsIG4xLCBuMiwgbjEsIGQwKTsKLQkJCX0KLQotCQkJLyogbjEgIT0gZDAuLi4gICovCi0KLQkJCXVkaXZfcXJubmQocTAsIG4wLCBuMSwgbjAsIGQwKTsKLQotCQkJLyogUmVtYWluZGVyIGluIG4wID4+IGJtLiAgKi8KLQkJfQotCi0JCWlmIChycCAhPSAwKSB7Ci0JCQlyci5zLmxvdyA9IG4wID4+IGJtOwotCQkJcnIucy5oaWdoID0gMDsKLQkJCSpycCA9IHJyLmxsOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGQxID4gbjEpIHsKLQkJCS8qIDAwID0gbm4gLyBERCAqLwotCi0JCQlxMCA9IDA7Ci0JCQlxMSA9IDA7Ci0KLQkJCS8qIFJlbWFpbmRlciBpbiBuMW4wLiAgKi8KLQkJCWlmIChycCAhPSAwKSB7Ci0JCQkJcnIucy5sb3cgPSBuMDsKLQkJCQlyci5zLmhpZ2ggPSBuMTsKLQkJCQkqcnAgPSByci5sbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIDBxID0gTk4gLyBkZCAqLwotCi0JCQljb3VudF9sZWFkaW5nX3plcm9zKGJtLCBkMSk7Ci0JCQlpZiAoYm0gPT0gMCkgewotCQkJCS8qIEZyb20gKG4xID49IGQxKSAvXCAodGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGQxIGlzIHNldCksCi0JCQkJICAgY29uY2x1ZGUgKHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBuMSBpcyBzZXQpIC9cICh0aGUKLQkJCQkgICBxdW90aWVudCBkaWdpdCBxMCA9IDAgb3IgMSkuCi0KLQkJCQkgICBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWNlc3NhcnksIG5vdCBhbiBvcHRpbWl6YXRpb24uICAqLwotCi0JCQkJLyogVGhlIGNvbmRpdGlvbiBvbiB0aGUgbmV4dCBsaW5lIHRha2VzIGFkdmFudGFnZSBvZiB0aGF0Ci0JCQkJICAgbjEgPj0gZDEgKHRydWUgZHVlIHRvIHByb2dyYW0gZmxvdykuICAqLwotCQkJCWlmIChuMSA+IGQxIHx8IG4wID49IGQwKSB7Ci0JCQkJCXEwID0gMTsKLQkJCQkJc3ViX2RkbW1zcyhuMSwgbjAsIG4xLCBuMCwgZDEsIGQwKTsKLQkJCQl9IGVsc2UKLQkJCQkJcTAgPSAwOwotCi0JCQkJcTEgPSAwOwotCi0JCQkJaWYgKHJwICE9IDApIHsKLQkJCQkJcnIucy5sb3cgPSBuMDsKLQkJCQkJcnIucy5oaWdoID0gbjE7Ci0JCQkJCSpycCA9IHJyLmxsOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdTMyIG0xLCBtMDsKLQkJCQkvKiBOb3JtYWxpemUuICAqLwotCi0JCQkJYiA9IFNJX1RZUEVfU0laRSAtIGJtOwotCi0JCQkJZDEgPSAoZDEgPDwgYm0pIHwgKGQwID4+IGIpOwotCQkJCWQwID0gZDAgPDwgYm07Ci0JCQkJbjIgPSBuMSA+PiBiOwotCQkJCW4xID0gKG4xIDw8IGJtKSB8IChuMCA+PiBiKTsKLQkJCQluMCA9IG4wIDw8IGJtOwotCi0JCQkJdWRpdl9xcm5uZChxMCwgbjEsIG4yLCBuMSwgZDEpOwotCQkJCXVtdWxfcHBtbShtMSwgbTAsIHEwLCBkMCk7Ci0KLQkJCQlpZiAobTEgPiBuMSB8fCAobTEgPT0gbjEgJiYgbTAgPiBuMCkpIHsKLQkJCQkJcTAtLTsKLQkJCQkJc3ViX2RkbW1zcyhtMSwgbTAsIG0xLCBtMCwgZDEsIGQwKTsKLQkJCQl9Ci0KLQkJCQlxMSA9IDA7Ci0KLQkJCQkvKiBSZW1haW5kZXIgaW4gKG4xbjAgLSBtMW0wKSA+PiBibS4gICovCi0JCQkJaWYgKHJwICE9IDApIHsKLQkJCQkJc3ViX2RkbW1zcyhuMSwgbjAsIG4xLCBuMCwgbTEsIG0wKTsKLQkJCQkJcnIucy5sb3cgPSAobjEgPDwgYikgfCAobjAgPj4gYm0pOwotCQkJCQlyci5zLmhpZ2ggPSBuMSA+PiBibTsKLQkJCQkJKnJwID0gcnIubGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0Jd3cucy5sb3cgPSBxMDsKLQl3dy5zLmhpZ2ggPSBxMTsKLQlyZXR1cm4gd3cubGw7Ci19Ci0KLXU2NCBfX3VkaXZkaTModTY0IG4sIHU2NCBkKQotewotCXJldHVybiBfX3VkaXZtb2RkaTQobiwgZCwgKHU2NCAqKSAwKTsKLX0KLQotdTY0IF9fdW1vZGRpMyh1NjQgdSwgdTY0IHYpCi17Ci0JdTY0IHc7Ci0KLQkodm9pZClfX3VkaXZtb2RkaTQodSwgdiwgJncpOwotCi0JcmV0dXJuIHc7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1YThiNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxIEBACisJenJlbGFkZHIteSA6PSAweGYwMDA4MDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2FhZWQyMDAwLmMgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2FhZWQyMDAwLmMKaW5kZXggNTQxN2NhMy4uYzlkODk5OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9hYWVkMjAwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYWFlYzIwMDAvYWFlZDIwMDAuYwpAQCAtNDAsOSArNDAsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChBQUVEMjAwMCwgIkFnaWxlbnQgQUFFRC0yMDAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EiKQotCUJPT1RfTUVNKDB4ZjAwMDAwMDAsIFBJT19CQVNFLCBWSU9fQkFTRSkKLQlNQVBJTyhhYWVkMjAwMF9tYXBfaW8pCi0JSU5JVElSUShhYWVkMjAwMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBOaWNvbGFzIEJlbGxpZG8gWSBPcnRlZ2EgKi8KKwkucGh5c19yYW0JPSAweGYwMDAwMDAwLAorCS5waHlzX2lvCT0gUElPX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChWSU9fQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gYWFlZDIwMDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGFhZWQyMDAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmYWFlYzIwMDBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hYWVjMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwppbmRleCBmYzE0NWIzLi5hZWNlMGNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWFhZWMyMDAwL2NvcmUuYwpAQCAtMTI4LDggKzEyOCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGFhZWMyMDAwX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiQUFFQy0yMDAwIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBhYWVjMjAwMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBhYWVjMjAwMF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgYWFlYzIwMDBfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9LY29uZmlnCmluZGV4IDQ1YzkzMGMuLjA3OTNkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L0tjb25maWcKQEAgLTI4LDcgKzI4LDcgQEAKIGNvbmZpZyBBUkNIX0VEQjcyMTEKIAlib29sICJFREI3MjExIgogCXNlbGVjdCBJU0EKLQlzZWxlY3QgRElTQ09OVElHTUVNCisJc2VsZWN0IEFSQ0hfRElTQ09OVElHTUVNX0VOQUJMRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgb24gYSBDaXJydXMgTG9naWMgRURCLTcyMTEKIAkgIGV2YWx1YXRpb24gYm9hcmQuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKaW5kZXggYzEwNjcwNC4uZGM3M2ZlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9hdXRjcHUxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYXV0Y3B1MTIuYwpAQCAtNTksMTEgKzU5LDEzIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQVVUQ1BVMTIsICJhdXRyb25peCBhdXRjcHUxMiIpCi0JTUFJTlRBSU5FUigiVGhvbWFzIEdsZWl4bmVyIikKLSAgICAgICAgQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmZjAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDIwMDAwKQotCU1BUElPKGF1dGNwdTEyX21hcF9pbykKLQlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFRob21hcyBHbGVpeG5lciAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMjAwMDAsCisJLm1hcF9pbwkJPSBhdXRjcHUxMl9tYXBfaW8sCisJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2RiODk3MTIuYwppbmRleCA3NjY0ZjljLi5hNDZjODJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NkYjg5NzEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCkBAIC00OSwxMCArNDksMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChDREI4OTcxMiwgIkNpcnJ1cy1DREI4OTcxMiIpCi0JTUFJTlRBSU5FUigiUmF5IExlaHRpbmllbWkiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhjZGI4OTcxMl9tYXBfaW8pCi0JSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBSYXkgTGVodGluaWVtaSAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBjZGI4OTcxMl9tYXBfaW8sCisJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NlaXZhLmMKaW5kZXggZTQwOTNiZS4uNzgwZDkxOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZWl2YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2VpdmEuYwpAQCAtNTMsMTAgKzUzLDEyIEBACiAKIAogTUFDSElORV9TVEFSVChDRUlWQSwgIkNFSVZBL1BvbGFyb2lkIFBob3RvIE1BWCBEaWdpdGFsIFBpY3R1cmUgRnJhbWUiKQotCU1BSU5UQUlORVIoIlJvYiBTY290dCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmZjAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKGNlaXZhX21hcF9pbykKLQlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFJvYiBTY290dCAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBjZWl2YV9tYXBfaW8sCisJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NsZXA3MzEyLmMKaW5kZXggOWNhMjFjYi4uYzgzZjNmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jbGVwNzMxMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYwpAQCAtMzcsMTIgKzM3LDE0IEBACiAKIAogTUFDSElORV9TVEFSVChDTEVQNzIxMiwgIkNpcnJ1cyBMb2dpYyA3MjEyLzczMTIiKQotCU1BSU5UQUlORVIoIk5vYm9keSIpCi0gICAgICAgIEJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZmYwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlGSVhVUChmaXh1cF9jbGVwNzMxMikKLQlNQVBJTyhjbHBzNzExeF9tYXBfaW8pCi0JSU5JVElSUShjbHBzNzExeF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBOb2JvZHkgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmYwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5maXh1cAkJPSBmaXh1cF9jbGVwNzMxMiwKKwkubWFwX2lvCQk9IGNscHM3MTF4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKIAkudGltZXIJCT0gJmNscHM3MTF4X3RpbWVyLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZWRiNzIxMS1hcmNoLmMKaW5kZXggYzZjNDYzMi4uMjU1Yzk4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9lZGI3MjExLWFyY2guYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2VkYjcyMTEtYXJjaC5jCkBAIC01MSwxMSArNTEsMTMgQEAKIH0KIAogTUFDSElORV9TVEFSVChFREI3MjExLCAiQ0wtRURCNzIxMSAoRVA3MjExIGV2YWwgYm9hcmQpIikKLQlNQUlOVEFJTkVSKCJKb24gTWNDbGludG9jayIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmZjAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDIwMTAwKQkvKiAweGMwMDAwMDAwIC0gMHhjMDAxZmZmZiBjYW4gYmUgdmlkZW8gUkFNICovCi0JRklYVVAoZml4dXBfZWRiNzIxMSkKLQlNQVBJTyhlZGI3MjExX21hcF9pbykKLQlJTklUSVJRKGNscHM3MTF4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEpvbiBNY0NsaW50b2NrICovCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZmMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAyMDEwMCwJLyogMHhjMDAwMDAwMCAtIDB4YzAwMWZmZmYgY2FuIGJlIHZpZGVvIFJBTSAqLworCS5maXh1cAkJPSBmaXh1cF9lZGI3MjExLAorCS5tYXBfaW8JCT0gZWRiNzIxMV9tYXBfaW8sCisJLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjbHBzNzExeF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2ZvcnR1bmV0LmMKaW5kZXggYzFjNWI4ZS4uZjgzYTU5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9mb3J0dW5ldC5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvZm9ydHVuZXQuYwpAQCAtNzUsMTEgKzc1LDEzIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoRk9SVFVORVQsICJBUk0tRm9ydHVOZXQiKQotCU1BSU5UQUlORVIoIkZvcnR1TmV0IEluYy4iKQotICAgICAgICBCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGYwMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAwMDApCi0JRklYVVAoZm9ydHVuZXRfZml4dXApCi0JTUFQSU8oY2xwczcxMXhfbWFwX2lvKQotCUlOSVRJUlEoY2xwczcxMXhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogRm9ydHVOZXQgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAwMDAsCisJLmZpeHVwCQk9IGZvcnR1bmV0X2ZpeHVwLAorCS5tYXBfaW8JCT0gY2xwczcxMXhfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9wNzIwdC5jCmluZGV4IDI5MjY5ZGYuLjViZGI5MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3A3MjB0LmMKQEAgLTc5LDEyICs3OSwxNCBAQAogfQogCiBNQUNISU5FX1NUQVJUKFA3MjBULCAiQVJNLVByb3NwZWN0b3I3MjBUIikKLQlNQUlOVEFJTkVSKCJBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGZmMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JRklYVVAoZml4dXBfcDcyMHQpCi0JTUFQSU8ocDcyMHRfbWFwX2lvKQotCUlOSVRJUlEoY2xwczcxMXhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZjAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmZpeHVwCQk9IGZpeHVwX3A3MjB0LAorCS5tYXBfaW8JCT0gcDcyMHRfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmY2xwczcxMXhfdGltZXIsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvdGltZS5jCmluZGV4IDM4M2Q0ZTAuLjFhMjNmMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvdGltZS5jCkBAIC01Nyw4ICs1Nyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNscHM3MTF4X3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiQ0xQUzcxMXggVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IHA3MjB0X3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IHA3MjB0X3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzExeF90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtY2xwczc1MDAvY29yZS5jCmluZGV4IDBiYzdkYTQuLjExMmYxZDY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLWNscHM3NTAwL2NvcmUuYwpAQCAtMjk4LDggKzI5OCw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNscHM3NTAwX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiQ0xQUzc1MDAgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IGNscHM3NTAwX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IGNscHM3NTAwX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIC8qCkBAIC0zNjYsMTEgKzM2NiwxMyBAQAogfQogCiBNQUNISU5FX1NUQVJUKENMUFM3NTAwLCAiQ0wtUFM3NTAwIikKLQlNQUlOVEFJTkVSKCJQaGlsaXAgQmx1bmRlbGwiKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4ZTAwMDAwMDApCi0JTUFQSU8oY2xwczc1MDBfbWFwX2lvKQotCUlOSVRJUlEoY2xwczc1MDBfaW5pdF9pcnEpCi0JCS5pbml0X21hY2hpbmUJPSBjbHBzNzUwMF9pbml0LAotCQkudGltZXIJCT0gJmNscHM3NTAwX3RpbWVyLAorCS8qIE1haW50YWluZXI6IFBoaWxpcCBCbHVuZGVsbCAqLworCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDAzMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhlMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gY2xwczc1MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGNscHM3NTAwX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBjbHBzNzUwMF9pbml0LAorCS50aW1lcgkJPSAmY2xwczc1MDBfdGltZXIsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1lYnNhMTEwL2NvcmUuYwppbmRleCBlZjM2MmQ0Li4yM2M0ZGExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVic2ExMTAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZWJzYTExMC9jb3JlLmMKQEAgLTE3Myw4ICsxNzMsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBlYnNhMTEwX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiRUJTQTExMCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gZWJzYTExMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBlYnNhMTEwX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIC8qCkBAIC0yMzMsMTMgKzIzMywxNSBAQAogYXJjaF9pbml0Y2FsbChlYnNhMTEwX2luaXQpOwogCiBNQUNISU5FX1NUQVJUKEVCU0ExMTAsICJFQlNBMTEwIikKLQlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmciKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIDB4ZTAwMDAwMDAsIDB4ZTAwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDQwMCkKLQlESVNBQkxFX1BBUlBPUlQoMCkKLQlESVNBQkxFX1BBUlBPUlQoMikKLQlTT0ZUX1JFQk9PVAotCU1BUElPKGVic2ExMTBfbWFwX2lvKQotCUlOSVRJUlEoZWJzYTExMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBSdXNzZWxsIEtpbmcgKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhlMDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwNDAwLAorCS5yZXNlcnZlX2xwMAk9IDEsCisJLnJlc2VydmVfbHAyCT0gMSwKKwkuc29mdF9yZWJvb3QJPSAxLAorCS5tYXBfaW8JCT0gZWJzYTExMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gZWJzYTExMF9pbml0X2lycSwKIAkudGltZXIJCT0gJmVic2ExMTBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi9hcmNoLmMgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwppbmRleCAxYjQwMzQwLi43ZGFhMDIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYworKysgYi9hcmNoL2FybS9tYWNoLWVweGExMGRiL2FyY2guYwpAQCAtNjMsMTAgKzYzLDEyIEBACiBleHRlcm4gc3RydWN0IHN5c190aW1lciBlcHhhMTBkYl90aW1lcjsKIAogTUFDSElORV9TVEFSVChDQU1FTE9ULCAiQWx0ZXJhIEVweGExMGRiIikKLQlNQUlOVEFJTkVSKCJBbHRlcmEgQ29ycG9yYXRpb24iKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIDB4N2ZmZmMwMDAsIDB4ZmZmZmMwMDApCi0JTUFQSU8oZXB4YTEwZGJfbWFwX2lvKQotCUlOSVRJUlEoZXB4YTEwZGJfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQWx0ZXJhIENvcnBvcmF0aW9uICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4N2ZmZmMwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZmZmZjMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBlcHhhMTBkYl9tYXBfaW8sCisJLmluaXRfaXJxCT0gZXB4YTEwZGJfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlcHhhMTBkYl90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXB4YTEwZGIvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKaW5kZXggMWI5OTFmMy4uNGIxMDg0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcHhhMTBkYi90aW1lLmMKQEAgLTU2LDggKzU2LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZXB4YTEwZGJfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJFeGNhbGlidXIgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IGVweGExMGRiX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IGVweGExMGRiX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtaHcuYwppbmRleCBkMWNlZDg2Li40OWI4OThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1ody5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLWh3LmMKQEAgLTg0LDEyICs4NCwxNCBAQAogfQogCiBNQUNISU5FX1NUQVJUKENBVFMsICJDaGFsaWNlLUNBVFMiKQotCU1BSU5UQUlORVIoIlBoaWxpcCBCbHVuZGVsbCIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgREMyMTI4NV9BUk1DU1JfQkFTRSwgMHhmZTAwMDAwMCkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCVNPRlRfUkVCT09UCi0JRklYVVAoZml4dXBfY2F0cykKLQlNQVBJTyhmb290YnJpZGdlX21hcF9pbykKLQlJTklUSVJRKGZvb3RicmlkZ2VfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogUGhpbGlwIEJsdW5kZWxsICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IERDMjEyODVfQVJNQ1NSX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkuc29mdF9yZWJvb3QJPSAxLAorCS5maXh1cAkJPSBmaXh1cF9jYXRzLAorCS5tYXBfaW8JCT0gZm9vdGJyaWRnZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gZm9vdGJyaWRnZV9pbml0X2lycSwKIAkudGltZXIJCT0gJmlzYV90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY28yODUuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCmluZGV4IGUxNTQxOTEuLjU0OGE3OTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jbzI4NS5jCkBAIC0yOCwxMSArMjgsMTMgQEAKIH0KIAogTUFDSElORV9TVEFSVChDTzI4NSwgImNvLUVCU0EyODUiKQotCU1BSU5UQUlORVIoIk1hcmsgdmFuIERvZXNidXJnIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweDdjZjAwMDAwKQotCUZJWFVQKGZpeHVwX2NvZWJzYTI4NSkKLQlNQVBJTyhmb290YnJpZGdlX21hcF9pbykKLQlJTklUSVJRKGZvb3RicmlkZ2VfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTWFyayB2YW4gRG9lc2J1cmcgKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gREMyMTI4NV9BUk1DU1JfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4N2NmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuZml4dXAJCT0gZml4dXBfY29lYnNhMjg1LAorCS5tYXBfaW8JCT0gZm9vdGJyaWRnZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gZm9vdGJyaWRnZV9pbml0X2lycSwKIAkudGltZXIJCT0gJmZvb3RicmlkZ2VfdGltZXIsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2RjMjEyODUtdGltZXIuYwppbmRleCBkYTViOWI3Li4xNGE2MmQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZGMyMTI4NS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9kYzIxMjg1LXRpbWVyLmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGZvb3RicmlkZ2VfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJUaW1lcjEgdGltZXIgdGljayIsCiAJLmhhbmRsZXIJPSB0aW1lcjFfaW50ZXJydXB0LAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCmluZGV4IGQwOTMxZjVhLi4xYzM3NjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LmMKQEAgLTEzLDEyICsxMywxNSBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBNQUNISU5FX1NUQVJUKEVCU0EyODUsICJFQlNBMjg1IikKLQlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmciKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIERDMjEyODVfQVJNQ1NSX0JBU0UsIDB4ZmUwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlWSURFTygweDAwMGEwMDAwLCAweDAwMGJmZmZmKQotCU1BUElPKGZvb3RicmlkZ2VfbWFwX2lvKQotCUlOSVRJUlEoZm9vdGJyaWRnZV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBSdXNzZWxsIEtpbmcgKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gREMyMTI4NV9BUk1DU1JfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmUwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS52aWRlb19zdGFydAk9IDB4MDAwYTAwMDAsCisJLnZpZGVvX2VuZAk9IDB4MDAwYmZmZmYsCisJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmZm9vdGJyaWRnZV90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwppbmRleCBhNGZlZmEwLi5jMWQ3NGY3YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2lzYS10aW1lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pc2EtdGltZXIuYwpAQCAtNzIsNyArNzIsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXNhX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiSVNBIHRpbWVyIHRpY2siLAogCS5oYW5kbGVyCT0gaXNhX3RpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1ody5jCmluZGV4IDFlMWRmZDcuLjc3NWY4NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItaHcuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLWh3LmMKQEAgLTY0NywxNCArNjQ3LDE3IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTkVUV0lOREVSLCAiUmViZWwtTmV0V2luZGVyIikKLQlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmcvUmViZWwuY29tIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweGZlMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JVklERU8oMHgwMDBhMDAwMCwgMHgwMDBiZmZmZikKLQlESVNBQkxFX1BBUlBPUlQoMCkKLQlESVNBQkxFX1BBUlBPUlQoMikKLQlGSVhVUChmaXh1cF9uZXR3aW5kZXIpCi0JTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCi0JSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZy9SZWJlbC5jb20gKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gREMyMTI4NV9BUk1DU1JfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmUwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS52aWRlb19zdGFydAk9IDB4MDAwYTAwMDAsCisJLnZpZGVvX2VuZAk9IDB4MDAwYmZmZmYsCisJLnJlc2VydmVfbHAwCT0gMSwKKwkucmVzZXJ2ZV9scDIJPSAxLAorCS5maXh1cAkJPSBmaXh1cF9uZXR3aW5kZXIsCisJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXNhX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKaW5kZXggNDE1MDg2ZC4uMDE0NmI4YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLmMKQEAgLTEzLDExICsxMywxMyBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBNQUNISU5FX1NUQVJUKFBFUlNPTkFMX1NFUlZFUiwgIkNvbXBhcS1QZXJzb25hbFNlcnZlciIpCi0JTUFJTlRBSU5FUigiSmFtZXkgSGlja3MgLyBHZW9yZ2UgRnJhbmNlIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBEQzIxMjg1X0FSTUNTUl9CQVNFLCAweGZlMDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oZm9vdGJyaWRnZV9tYXBfaW8pCi0JSU5JVElSUShmb290YnJpZGdlX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEphbWV5IEhpY2tzIC8gR2VvcmdlIEZyYW5jZSAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBEQzIxMjg1X0FSTUNTUl9CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZTAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBmb290YnJpZGdlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBmb290YnJpZGdlX2luaXRfaXJxLAogCS50aW1lcgkJPSAmZm9vdGJyaWRnZV90aW1lciwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAxLmMgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMS5jCmluZGV4IDc0MzY1NjguLmFmOWU0YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDEuYwpAQCAtNDEsOCArNDEsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBoNzIwMV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gImg3MjAxIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBoNzIwMV90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBoNzIwMV90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYyBiL2FyY2gvYXJtL21hY2gtaDcyMHgvY3B1LWg3MjAyLmMKaW5kZXggMjFiOGZiNi4uNTkzYjZhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9jcHUtaDcyMDIuYworKysgYi9hcmNoL2FybS9tYWNoLWg3MjB4L2NwdS1oNzIwMi5jCkBAIC0xNzEsOCArMTcxLDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaDcyMDJfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJoNzIwMiBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gaDcyMDJfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaDcyMDJfdGltZXJfaW50ZXJydXB0LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDEtZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKaW5kZXggOWIyNGI5Yi4uZmE1OWU5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMS1ldmFsLmMKQEAgLTMwLDEwICszMCwxMiBAQAogI2luY2x1ZGUgImNvbW1vbi5oIgogCiBNQUNISU5FX1NUQVJUKEg3MjAxLCAiSHluaXggR01TMzBDNzIwMSIpCi0JTUFJTlRBSU5FUigiUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCIpCi0JQk9PVF9NRU0oMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmMDAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAxMDAwKQotCU1BUElPKGg3MjB4X21hcF9pbykKLQlJTklUSVJRKGg3MjB4X2luaXRfaXJxKQotCS50aW1lciA9ICZoNzIwMV90aW1lciwKKwkvKiBNYWludGFpbmVyOiBSb2JlcnQgU2Nod2ViZWwsIFBlbmd1dHJvbml4ICovCisJLnBoeXNfcmFtCT0gMHg0MDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGYwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMTAwMCwKKwkubWFwX2lvCQk9IGg3MjB4X21hcF9pbywKKwkuaW5pdF9pcnEJPSBoNzIweF9pbml0X2lycSwKKwkudGltZXIJCT0gJmg3MjAxX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaDcyMHgvaDcyMDItZXZhbC5jIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKaW5kZXggMzQ1NmEwMC4uZGI5MDc4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1oNzIweC9oNzIwMi1ldmFsLmMKQEAgLTcxLDExICs3MSwxMyBAQAogfQogCiBNQUNISU5FX1NUQVJUKEg3MjAyLCAiSHluaXggSE1TMzBDNzIwMiIpCi0JTUFJTlRBSU5FUigiUm9iZXJ0IFNjaHdlYmVsLCBQZW5ndXRyb25peCIpCi0JQk9PVF9NRU0oMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmMDAwMDAwMCkKLQlCT09UX1BBUkFNUygweDQwMDAwMTAwKQotCU1BUElPKGg3MjB4X21hcF9pbykKLQlJTklUSVJRKGg3MjAyX2luaXRfaXJxKQotCS50aW1lciA9ICZoNzIwMl90aW1lciwKLQlJTklUX01BQ0hJTkUoaW5pdF9ldmFsX2g3MjAyKQorCS8qIE1haW50YWluZXI6IFJvYmVydCBTY2h3ZWJlbCwgUGVuZ3V0cm9uaXggKi8KKwkucGh5c19yYW0JPSAweDQwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjAwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDQwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDcyMHhfbWFwX2lvLAorCS5pbml0X2lycQk9IGg3MjAyX2luaXRfaXJxLAorCS50aW1lcgkJPSAmaDcyMDJfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IGluaXRfZXZhbF9oNzIwMiwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9teDFhZHMuYyBiL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCmluZGV4IDYyNWRkMDEuLjVkMjU0MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L214MWFkcy5jCkBAIC03OCwxMSArNzgsMTMgQEAKIH0KIAogTUFDSElORV9TVEFSVChNWDFBRFMsICJNb3Rvcm9sYSBNWDFBRFMiKQotCU1BSU5UQUlORVIoIlNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgiKQotCUJPT1RfTUVNKDB4MDgwMDAwMDAsIDB4MDAyMDAwMDAsIDB4ZTAyMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwODAwMDEwMCkKLQlNQVBJTyhteDFhZHNfbWFwX2lvKQotCUlOSVRJUlEoaW14X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXggKi8KKwkucGh5c19yYW0JPSAweDA4MDAwMDAwLAorCS5waHlzX2lvCT0gMHgwMDIwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZTAyMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDA4MDAwMTAwLAorCS5tYXBfaW8JCT0gbXgxYWRzX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpbXhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpbXhfdGltZXIsCi0JSU5JVF9NQUNISU5FKG14MWFkc19pbml0KQorCS5pbml0X21hY2hpbmUJPSBteDFhZHNfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKaW5kZXggMTFmMWU1Ni4uZWE4MDViZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3RpbWUuYwpAQCAtNzIsOCArNzIsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpbXhfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJpLk1YIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBpbXhfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaW14X3RpbWVyX2ludGVycnVwdCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2NvcmUuYwppbmRleCBiZDFlNWUzLi5kYWNiZjUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9jb3JlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2FtYmEuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvY20uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2xlZHMuaD4KQEAgLTE1NiwxNiArMTU3LDYgQEAKICNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKCh4KSAvIFRJQ0tTX1BFUl91U0VDKQogI2VuZGlmCiAKLS8qCi0gKiBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwotICovCi10eXBlZGVmIHN0cnVjdCBUaW1lclN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBUaW1lckxvYWQ7Ci0JdW5zaWduZWQgbG9uZyBUaW1lclZhbHVlOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDb250cm9sOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDbGVhcjsKLX0gVGltZXJTdHJ1Y3RfdDsKLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfcmVsb2FkOwogCiAvKgpAQCAtMTc0LDcgKzE2NSw2IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgaW50ZWdyYXRvcl9nZXR0aW1lb2Zmc2V0KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKIAl1bnNpZ25lZCBsb25nIHRpY2tzMSwgdGlja3MyLCBzdGF0dXM7CiAKIAkvKgpAQCAtMTgzLDExICsxNzMsMTEgQEAKIAkgKiBhbiBpbnRlcnJ1cHQuICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgZW5zdXJpbmcgdGhhdCB0aGUKIAkgKiBjb3VudGVyIGhhcyBub3QgcmVsb2FkZWQgYmV0d2VlbiBvdXIgdHdvIHJlYWRzLgogCSAqLwotCXRpY2tzMiA9IHRpbWVyMS0+VGltZXJWYWx1ZSAmIDB4ZmZmZjsKKwl0aWNrczIgPSByZWFkbChUSU1FUjFfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKSAmIDB4ZmZmZjsKIAlkbyB7CiAJCXRpY2tzMSA9IHRpY2tzMjsKIAkJc3RhdHVzID0gX19yYXdfcmVhZGwoVkFfSUNfQkFTRSArIElSUV9SQVdfU1RBVFVTKTsKLQkJdGlja3MyID0gdGltZXIxLT5UaW1lclZhbHVlICYgMHhmZmZmOworCQl0aWNrczIgPSByZWFkbChUSU1FUjFfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKSAmIDB4ZmZmZjsKIAl9IHdoaWxlICh0aWNrczIgPiB0aWNrczEpOwogCiAJLyoKQEAgLTIxMywxNCArMjAzLDEyIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QKIGludGVncmF0b3JfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKLQogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCiAJLyoKIAkgKiBjbGVhciB0aGUgaW50ZXJydXB0CiAJICovCi0JdGltZXIxLT5UaW1lckNsZWFyID0gMTsKKwl3cml0ZWwoMSwgVElNRVIxX1ZBX0JBU0UgKyBUSU1FUl9JTlRDTFIpOwogCiAJLyoKIAkgKiB0aGUgY2xvY2sgdGljayByb3V0aW5lcyBhcmUgb25seSBwcm9jZXNzZWQgb24gdGhlCkBAIC0yNDcsOCArMjM1LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaW50ZWdyYXRvcl90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIkludGVncmF0b3IgVGltZXIgVGljayIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IGludGVncmF0b3JfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaW50ZWdyYXRvcl90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpAQCAtMjU2LDMyICsyNDQsMjkgQEAKICAqLwogdm9pZCBfX2luaXQgaW50ZWdyYXRvcl90aW1lX2luaXQodW5zaWduZWQgbG9uZyByZWxvYWQsIHVuc2lnbmVkIGludCBjdHJsKQogewotCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMCA9ICh2b2xhdGlsZSBUaW1lclN0cnVjdF90ICopVElNRVIwX1ZBX0JBU0U7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIxID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjFfVkFfQkFTRTsKLQl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjIgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMl9WQV9CQVNFOwotCXVuc2lnbmVkIGludCB0aW1lcl9jdHJsID0gMHg4MCB8IDB4NDA7CS8qIHBlcmlvZGljICovCisJdW5zaWduZWQgaW50IHRpbWVyX2N0cmwgPSBUSU1FUl9DVFJMX0VOQUJMRSB8IFRJTUVSX0NUUkxfUEVSSU9ESUM7CiAKIAl0aW1lcl9yZWxvYWQgPSByZWxvYWQ7CiAJdGltZXJfY3RybCB8PSBjdHJsOwogCiAJaWYgKHRpbWVyX3JlbG9hZCA+IDB4MTAwMDAwKSB7CiAJCXRpbWVyX3JlbG9hZCA+Pj0gODsKLQkJdGltZXJfY3RybCB8PSAweDA4OyAvKiAvMjU2ICovCisJCXRpbWVyX2N0cmwgfD0gVElNRVJfQ1RSTF9ESVYyNTY7CiAJfSBlbHNlIGlmICh0aW1lcl9yZWxvYWQgPiAweDAxMDAwMCkgewogCQl0aW1lcl9yZWxvYWQgPj49IDQ7Ci0JCXRpbWVyX2N0cmwgfD0gMHgwNDsgLyogLzE2ICovCisJCXRpbWVyX2N0cmwgfD0gVElNRVJfQ1RSTF9ESVYxNjsKIAl9CiAKIAkvKgogCSAqIEluaXRpYWxpc2UgdG8gYSBrbm93biBzdGF0ZSAoYWxsIHRpbWVycyBvZmYpCiAJICovCi0JdGltZXIwLT5UaW1lckNvbnRyb2wgPSAwOwotCXRpbWVyMS0+VGltZXJDb250cm9sID0gMDsKLQl0aW1lcjItPlRpbWVyQ29udHJvbCA9IDA7CisJd3JpdGVsKDAsIFRJTUVSMF9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CisJd3JpdGVsKDAsIFRJTUVSMV9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CisJd3JpdGVsKDAsIFRJTUVSMl9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CiAKLQl0aW1lcjEtPlRpbWVyTG9hZCAgICA9IHRpbWVyX3JlbG9hZDsKLQl0aW1lcjEtPlRpbWVyVmFsdWUgICA9IHRpbWVyX3JlbG9hZDsKLQl0aW1lcjEtPlRpbWVyQ29udHJvbCA9IHRpbWVyX2N0cmw7CisJd3JpdGVsKHRpbWVyX3JlbG9hZCwgVElNRVIxX1ZBX0JBU0UgKyBUSU1FUl9MT0FEKTsKKwl3cml0ZWwodGltZXJfcmVsb2FkLCBUSU1FUjFfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKTsKKwl3cml0ZWwodGltZXJfY3RybCwgVElNRVIxX1ZBX0JBU0UgKyBUSU1FUl9DVFJMKTsKIAogCS8qCiAJICogTWFrZSBpcnFzIGhhcHBlbiBmb3IgdGhlIHN5c3RlbSB0aW1lcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2FwLmMKaW5kZXggOTFiYTlmZC4uMzZlMmI2ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfYXAuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9hcC5jCkBAIC0yOTIsMTEgKzI5MiwxMyBAQAogfTsKIAogTUFDSElORV9TVEFSVChJTlRFR1JBVE9SLCAiQVJNLUludGVncmF0b3IiKQotCU1BSU5UQUlORVIoIkFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQiKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIDB4MTYwMDAwMDAsIDB4ZjE2MDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlNQVBJTyhhcF9tYXBfaW8pCi0JSU5JVElSUShhcF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4MTYwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGYxNjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkubWFwX2lvCQk9IGFwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBhcF9pbml0X2lycSwKIAkudGltZXIJCT0gJmFwX3RpbWVyLAotCUlOSVRfTUFDSElORShhcF9pbml0KQorCS5pbml0X21hY2hpbmUJPSBhcF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvaW50ZWdyYXRvcl9jcC5jCmluZGV4IGUwYTAxZWUuLjU2OWYzMjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9pbnRlZ3JhdG9yX2NwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL2ludGVncmF0b3JfY3AuYwpAQCAtNTMyLDExICs1MzIsMTMgQEAKIH07CiAKIE1BQ0hJTkVfU1RBUlQoQ0lOVEVHUkFUT1IsICJBUk0tSW50ZWdyYXRvckNQIikKLQlNQUlOVEFJTkVSKCJBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCAweDE2MDAwMDAwLCAweGYxNjAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oaW50Y3BfbWFwX2lvKQotCUlOSVRJUlEoaW50Y3BfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDE2MDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMTYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBpbnRjcF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaW50Y3BfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZjcF90aW1lciwKLQlJTklUX01BQ0hJTkUoaW50Y3BfaW5pdCkKKwkuaW5pdF9tYWNoaW5lCT0gaW50Y3BfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jCmluZGV4IGJmMjNlMGYuLjBmOTIxYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS1zZXR1cC5jCkBAIC0xNDYsMjMgKzE0NiwyNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JUTgwMzIxKQogTUFDSElORV9TVEFSVChJUTgwMzIxLCAiSW50ZWwgSVE4MDMyMSIpCi0JTUFJTlRBSU5FUigiSW50ZWwgQ29ycG9yYXRpb24iKQotCUJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJUTgwMzIxX1VBUlQsIElRODAzMjFfVUFSVCkKLQlNQVBJTyhpcTgwMzIxX21hcF9pbykKLQlJTklUSVJRKGlvcDMyMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3Jwb3JhdGlvbiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVE4MDMyMV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoSVE4MDMyMV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpcTgwMzIxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpb3AzMjFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpb3AzMjFfdGltZXIsCi0gICAgQk9PVF9QQVJBTVMoMHhhMDAwMDEwMCkKLQlJTklUX01BQ0hJTkUoaW9wMzJ4X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaW9wMzJ4X2luaXQsCiBNQUNISU5FX0VORAogI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JUTMxMjQ0KQogTUFDSElORV9TVEFSVChJUTMxMjQ0LCAiSW50ZWwgSVEzMTI0NCIpCi0gICAgTUFJTlRBSU5FUigiSW50ZWwgQ29ycC4iKQotICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJUTMxMjQ0X1VBUlQsIElRMzEyNDRfVUFSVCkKLSAgICBNQVBJTyhpcTMxMjQ0X21hcF9pbykKLSAgICBJTklUSVJRKGlvcDMyMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVEzMTI0NF9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoSVEzMTI0NF9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpcTMxMjQ0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpb3AzMjFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpb3AzMjFfdGltZXIsCi0gICAgQk9PVF9QQVJBTVMoMHhhMDAwMDEwMCkKLQlJTklUX01BQ0hJTkUoaW9wMzJ4X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHhhMDAwMDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaW9wMzJ4X2luaXQsCiBNQUNISU5FX0VORAogI2Vsc2UKICNlcnJvciBObyBtYWNoaW5lIGRlc2NyaXB0b3IgZGVmaW5lZCBmb3IgdGhpcyBJT1AzWFggaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMjEtdGltZS5jCmluZGV4IDliN2RkNjQuLmQ1M2FmMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMyMS10aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzIxLXRpbWUuYwpAQCAtODYsNyArODYsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaW9wMzIxX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiSU9QMzIxIFRpbWVyIFRpY2siLAogCS5oYW5kbGVyCT0gaW9wMzIxX3RpbWVyX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGlvcDMyMV90aW1lcl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS1zZXR1cC5jCmluZGV4IDYyMmU3OTE0Li5mYzc0YjcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtc2V0dXAuYwpAQCAtMTQ4LDI2ICsxNDgsMjggQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVE4MDMzMSkKIE1BQ0hJTkVfU1RBUlQoSVE4MDMzMSwgIkludGVsIElRODAzMzEiKQotICAgIE1BSU5UQUlORVIoIkludGVsIENvcnAuIikKLSAgICBCT09UX01FTShQSFlTX09GRlNFVCwgMHhmZWZmZjAwMCwgMHhmZmZmZjAwMCkgLy8gdmlydHVhbCwgcGh5c2ljYWwKLSAgICAvL0JPT1RfTUVNKFBIWVNfT0ZGU0VULCBJT1AzMzFfVUFSVDBfVklSVCwgSU9QMzMxX1VBUlQwX1BIWVMpCi0gICAgTUFQSU8oaXE4MDMzMV9tYXBfaW8pCi0gICAgSU5JVElSUShpb3AzMzFfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogSW50ZWwgQ29ycC4gKi8KKwkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKKwkucGh5c19pbwk9IDB4ZmVmZmYwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZmZmZmMDAwKSA+PiAxOCkgJiAweGZmZmMsIC8vIHZpcnR1YWwsIHBoeXNpY2FsCisJLm1hcF9pbwkJPSBpcTgwMzMxX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpb3AzMzFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpb3AzMzFfdGltZXIsCi0gICAgQk9PVF9QQVJBTVMoMHgwMTAwKQotCUlOSVRfTUFDSElORShpb3AzM3hfaW5pdCkKKwkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmluaXRfbWFjaGluZQk9IGlvcDMzeF9pbml0LAogTUFDSElORV9FTkQKIAogI2VsaWYgZGVmaW5lZChDT05GSUdfTUFDSF9JUTgwMzMyKQogTUFDSElORV9TVEFSVChJUTgwMzMyLCAiSW50ZWwgSVE4MDMzMiIpCi0gICAgTUFJTlRBSU5FUigiSW50ZWwgQ29ycC4iKQotICAgIEJPT1RfTUVNKFBIWVNfT0ZGU0VULCAweGZlZmZmMDAwLCAweGZmZmZmMDAwKSAvLyB2aXJ0dWFsLCBwaHlzaWNhbAotICAgIC8vQk9PVF9NRU0oUEhZU19PRkZTRVQsIElPUDMzMV9VQVJUMF9WSVJULCBJT1AzMzFfVUFSVDBfUEhZUykKLSAgICBNQVBJTyhpcTgwMzMyX21hcF9pbykKLSAgICBJTklUSVJRKGlvcDMzMV9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBJbnRlbCBDb3JwLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gMHhmZWZmZjAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmZmZmYwMDApID4+IDE4KSAmIDB4ZmZmYywgLy8gdmlydHVhbCwgcGh5c2ljYWwKKwkubWFwX2lvCQk9IGlxODAzMzJfbWFwX2lvLAorCS5pbml0X2lycQk9IGlvcDMzMV9pbml0X2lycSwKIAkudGltZXIJCT0gJmlvcDMzMV90aW1lciwKLSAgICBCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGlvcDMzeF9pbml0KQorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaW9wMzN4X2luaXQsCiBNQUNISU5FX0VORAogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYyBiL2FyY2gvYXJtL21hY2gtaW9wM3h4L2lvcDMzMS10aW1lLmMKaW5kZXggZTAxNjk2Ny4uMWE2ZDlkNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzeHgvaW9wMzMxLXRpbWUuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDN4eC9pb3AzMzEtdGltZS5jCkBAIC04Myw3ICs4Myw3IEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpb3AzMzFfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJJT1AzMzEgVGltZXIgVGljayIsCiAJLmhhbmRsZXIJPSBpb3AzMzFfdGltZXJfaW50ZXJydXB0LAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgaW9wMzMxX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL0tjb25maWcKaW5kZXggOTM2MWUwNS4uZWNiNThkOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL0tjb25maWcKQEAgLTU0LDYgKzU0LDE0IEBACiAJZGVwZW5kcyBvbiBBUkNIX0lYRFAyNDAxIHx8IEFSQ0hfSVhEUDI4MDEKIAlkZWZhdWx0IHkJCiAKK2NvbmZpZyBJWFAyMDAwX1NVUFBPUlRfQlJPS0VOX1BDSV9JTworCWJvb2wgIlN1cHBvcnQgYnJva2VuIFBDSSBJL08gb24gb2xkZXIgSVhQMjAwMHMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5ICdOJyBoZXJlIGlmIHlvdSBvbmx5IGludGVuZCB0byBydW4geW91ciBrZXJuZWwgb24gYW4KKwkgIElYUDIwMDAgQjAgb3IgbGF0ZXIgbW9kZWwgYW5kIGRvIG5vdCBuZWVkIHRoZSBQQ0kgSS9PCisJICBieXRlc3dhcCB3b3JrYXJvdW5kLiAgU2F5ICdZJyBvdGhlcndpc2UuCisKIGVuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCmluZGV4IGZjMDU1NTUuLjQ1YjE4NjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CkBAIC00MCw2ICs0MCw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGl4cDIwMDBfc2xvd3BvcnRfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpeHAyMDAwX3Nsb3dwb3J0X2lycV9mbGFnczsKIApAQCAtMTAxLDYgKzEwMywxMSBAQAogCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0NTUl9TSVpFLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UKIAl9LCB7CisJCS52aXJ0dWFsCT0gSVhQMjAwMF9NU0ZfVklSVF9CQVNFLAorCQkucGh5c2ljYWwJPSBJWFAyMDAwX01TRl9QSFlTX0JBU0UsCisJCS5sZW5ndGgJCT0gSVhQMjAwMF9NU0ZfU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCisJfSwgewogCQkudmlydHVhbAk9IElYUDIwMDBfUENJX0lPX1ZJUlRfQkFTRSwKIAkJLnBoeXNpY2FsCT0gSVhQMjAwMF9QQ0lfSU9fUEhZU19CQVNFLAogCQkubGVuZ3RoCQk9IElYUDIwMDBfUENJX0lPX1NJWkUsCkBAIC0xMTgsMTkgKzEyNSw2IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgaXhwMjAwMF9zZXJpYWxfcG9ydCA9IHsKLQkubWVtYmFzZQk9IChjaGFyICopKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UgKyAzKSwKLQkubWFwYmFzZQk9IElYUDIwMDBfVUFSVF9QSFlTX0JBU0UgKyAzLAotCS5pcnEJCT0gSVJRX0lYUDIwMDBfVUFSVCwKLQkuZmxhZ3MJCT0gVVBGX1NLSVBfVEVTVCwKLQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCS5yZWdzaGlmdAk9IDIsCi0JLnVhcnRjbGsJPSA1MDAwMDAwMCwKLQkubGluZQkJPSAwLAotCS50eXBlCQk9IFBPUlRfWFNDQUxFLAotCS5maWZvc2l6ZQk9IDE2Ci19OwotCiB2b2lkIF9faW5pdCBpeHAyMDAwX21hcF9pbyh2b2lkKQogewogCWV4dGVybiB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yX2lkOwpAQCAtMTUwLDEyICsxNDQsNTAgQEAKIAl9CiAKIAlpb3RhYmxlX2luaXQoaXhwMjAwMF9pb19kZXNjLCBBUlJBWV9TSVpFKGl4cDIwMDBfaW9fZGVzYykpOwotCWVhcmx5X3NlcmlhbF9zZXR1cCgmaXhwMjAwMF9zZXJpYWxfcG9ydCk7CiAKIAkvKiBTZXQgc2xvd3BvcnQgdG8gOC1iaXQgbW9kZS4gICovCiAJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9TTE9XUE9SVF9GUk0sIDEpOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTZXJpYWwgcG9ydCBzdXBwb3J0IGZvciBJWFAyMDAwCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgaXhwMjAwMF9zZXJpYWxfcG9ydFtdID0geworCXsKKwkJLm1hcGJhc2UJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCQkubWVtYmFzZQk9IChjaGFyICopKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UgKyAzKSwKKwkJLmlycQkJPSBJUlFfSVhQMjAwMF9VQVJULAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9IDUwMDAwMDAwLAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpeHAyMDAwX3VhcnRfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsCisJLmVuZAkJPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFICsgMHhmZmZmLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4cDIwMDBfc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9IGl4cDIwMDBfc2VyaWFsX3BvcnQsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJml4cDIwMDBfdWFydF9yZXNvdXJjZSwKK307CisKK3ZvaWQgX19pbml0IGl4cDIwMDBfdWFydF9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZpeHAyMDAwX3NlcmlhbF9kZXZpY2UpOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUaW1lci10aWNrIGZ1bmN0aW9ucyBmb3IgSVhQMjAwMAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzksNyArMjExLDcgQEAKIAogCS8qIGNsZWFyIHRpbWVyIDEgKi8KIAlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX1QxX0NMUiwgMSk7Ci0JCisKIAl3aGlsZSAoKG5leHRfamlmZnlfdGltZSAtICptaXNzaW5nX2ppZmZ5X3RpbWVyX2NzcikgPiB0aWNrc19wZXJfamlmZnkpIHsKIAkJdGltZXJfdGljayhyZWdzKTsKIAkJbmV4dF9qaWZmeV90aW1lIC09IHRpY2tzX3Blcl9qaWZmeTsKQEAgLTE5Miw4ICsyMjQsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpeHAyMDAwX3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiSVhQMjAwMCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gaXhwMjAwMF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBpeHAyMDAwX3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHZvaWQgX19pbml0IGl4cDIwMDBfaW5pdF90aW1lKHVuc2lnbmVkIGxvbmcgdGlja19yYXRlKQpAQCAtMjM4LDM1ICsyNzAsNDAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBHUElPIGhlbHBlcnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgR1BJT19JUlFfcmlzaW5nX2VkZ2U7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBHUElPX0lSUV9mYWxsaW5nX2VkZ2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBHUElPX0lSUV9yaXNpbmdfZWRnZTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIEdQSU9fSVJRX2xldmVsX2xvdzsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIEdQSU9fSVJRX2xldmVsX2hpZ2g7CiAKLXZvaWQgZ3Bpb19saW5lX2NvbmZpZyhpbnQgbGluZSwgaW50IHN0eWxlKQorc3RhdGljIHZvaWQgdXBkYXRlX2dwaW9faW50X2NzcnModm9pZCkKK3sKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fRkVEUiwgR1BJT19JUlFfZmFsbGluZ19lZGdlKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUkVEUiwgR1BJT19JUlFfcmlzaW5nX2VkZ2UpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19MU0xSLCBHUElPX0lSUV9sZXZlbF9sb3cpOworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19MU0hSLCBHUElPX0lSUV9sZXZlbF9oaWdoKTsKK30KKwordm9pZCBncGlvX2xpbmVfY29uZmlnKGludCBsaW5lLCBpbnQgZGlyZWN0aW9uKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGRpcmVjdGlvbiA9PSBHUElPX09VVCkgeworCQlpcnFfZGVzY1tsaW5lICsgSVJRX0lYUDIwMDBfR1BJTzBdLnZhbGlkID0gMDsKIAotCWlmKHN0eWxlID09IEdQSU9fT1VUKSB7CiAJCS8qIGlmIGl0J3MgYW4gb3V0cHV0LCBpdCBhaW4ndCBhbiBpbnRlcnJ1cHQgYW55bW9yZSAqLwotCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUERTUiwgKDEgPDwgbGluZSkpOwogCQlHUElPX0lSUV9mYWxsaW5nX2VkZ2UgJj0gfigxIDw8IGxpbmUpOwogCQlHUElPX0lSUV9yaXNpbmdfZWRnZSAmPSB+KDEgPDwgbGluZSk7CiAJCUdQSU9fSVJRX2xldmVsX2xvdyAmPSB+KDEgPDwgbGluZSk7CiAJCUdQSU9fSVJRX2xldmVsX2hpZ2ggJj0gfigxIDw8IGxpbmUpOwotCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fRkVEUiwgR1BJT19JUlFfZmFsbGluZ19lZGdlKTsKLQkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1JFRFIsIEdQSU9fSVJRX3Jpc2luZ19lZGdlKTsKLQkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX0xTSFIsIEdQSU9fSVJRX2xldmVsX2hpZ2gpOwotCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fTFNMUiwgR1BJT19JUlFfbGV2ZWxfbG93KTsKLQkJaXJxX2Rlc2NbbGluZStJUlFfSVhQMjAwMF9HUElPMF0udmFsaWQgPSAwOwotCX0gZWxzZSBpZihzdHlsZSA9PSBHUElPX0lOKSB7Ci0JCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QRENSLCAoMSA8PCBsaW5lKSk7CisJCXVwZGF0ZV9ncGlvX2ludF9jc3JzKCk7CisKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BEU1IsIDEgPDwgbGluZSk7CisJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gR1BJT19JTikgeworCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUERDUiwgMSA8PCBsaW5lKTsKIAl9Ci0JCQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0JCit9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4NSw5ICszMjIsNTAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaXhwMjAwMF9HUElPX2lycV90eXBlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCWludCBsaW5lID0gaXJxIC0gSVJRX0lYUDIwMDBfR1BJTzA7CisKKwkvKgorCSAqIEZpcnN0LCBjb25maWd1cmUgdGhpcyBHUElPIGxpbmUgYXMgYW4gaW5wdXQuCisJICovCisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BEQ1IsIDEgPDwgbGluZSk7CisKKwkvKgorCSAqIFRoZW4sIHNldCB0aGUgcHJvcGVyIHRyaWdnZXIgdHlwZS4KKwkgKi8KKwlpZiAodHlwZSAmIElSUVRfRkFMTElORykKKwkJR1BJT19JUlFfZmFsbGluZ19lZGdlIHw9IDEgPDwgbGluZTsKKwllbHNlCisJCUdQSU9fSVJRX2ZhbGxpbmdfZWRnZSAmPSB+KDEgPDwgbGluZSk7CisJaWYgKHR5cGUgJiBJUlFUX1JJU0lORykKKwkJR1BJT19JUlFfcmlzaW5nX2VkZ2UgfD0gMSA8PCBsaW5lOworCWVsc2UKKwkJR1BJT19JUlFfcmlzaW5nX2VkZ2UgJj0gfigxIDw8IGxpbmUpOworCWlmICh0eXBlICYgSVJRVF9MT1cpCisJCUdQSU9fSVJRX2xldmVsX2xvdyB8PSAxIDw8IGxpbmU7CisJZWxzZQorCQlHUElPX0lSUV9sZXZlbF9sb3cgJj0gfigxIDw8IGxpbmUpOworCWlmICh0eXBlICYgSVJRVF9ISUdIKQorCQlHUElPX0lSUV9sZXZlbF9oaWdoIHw9IDEgPDwgbGluZTsKKwllbHNlCisJCUdQSU9fSVJRX2xldmVsX2hpZ2ggJj0gfigxIDw8IGxpbmUpOworCXVwZGF0ZV9ncGlvX2ludF9jc3JzKCk7CisKKwkvKgorCSAqIEZpbmFsbHksIG1hcmsgdGhlIGNvcnJlc3BvbmRpbmcgSVJRIGFzIHZhbGlkLgorCSAqLworCWlycV9kZXNjW2lycV0udmFsaWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGl4cDIwMDBfR1BJT19pcnFfbWFza19hY2sodW5zaWduZWQgaW50IGlycSkKIHsKIAlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fSU5DUiwgKDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0dQSU8wKSkpOworCisJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX0VEU1IsICgxIDw8IChpcnEgLSBJUlFfSVhQMjAwMF9HUElPMCkpKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fTERTUiwgKDEgPDwgKGlycSAtIElSUV9JWFAyMDAwX0dQSU8wKSkpOwogCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19JTlNULCAoMSA8PCAoaXJxIC0gSVJRX0lYUDIwMDBfR1BJTzApKSk7CiB9CiAKQEAgLTMwMiw2ICszODAsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycWNoaXAgaXhwMjAwMF9HUElPX2lycV9jaGlwID0geworCS50eXBlCT0gaXhwMjAwMF9HUElPX2lycV90eXBlLAogCS5hY2sJPSBpeHAyMDAwX0dQSU9faXJxX21hc2tfYWNrLAogCS5tYXNrCT0gaXhwMjAwMF9HUElPX2lycV9tYXNrLAogCS51bm1hc2sJPSBpeHAyMDAwX0dQSU9faXJxX3VubWFzawpAQCAtMzM4LDcgKzQxNyw3IEBACiAKIHN0YXRpYyB2b2lkIGl4cDIwMDBfaXJxX3VubWFzayh1bnNpZ25lZCBpbnQgaXJxKQogewotCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfSVJRX0VOQUJMRV9TRVQsICAoMSA8PCBpcnEpKTsKKwlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0lSUV9FTkFCTEVfU0VULCAoMSA8PCBpcnEpKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFjaGlwIGl4cDIwMDBfaXJxX2NoaXAgPSB7CkBAIC0zNzUsMTYgKzQ1NCwxNiBAQAogCSAqIG91ciBtYXNrL3VubWFzayBjb2RlIG11Y2ggc2ltcGxlci4KIAkgKi8KIAlmb3IgKGlycSA9IElSUV9JWFAyMDAwX1NPRlRfSU5UOyBpcnEgPD0gSVJRX0lYUDIwMDBfVEhEQjM7IGlycSsrKSB7Ci0JCWlmKCgxIDw8IGlycSkgJiBJWFAyMDAwX1ZBTElEX0lSUV9NQVNLKSB7CisJCWlmICgoMSA8PCBpcnEpICYgSVhQMjAwMF9WQUxJRF9JUlFfTUFTSykgewogCQkJc2V0X2lycV9jaGlwKGlycSwgJml4cDIwMDBfaXJxX2NoaXApOwogCQkJc2V0X2lycV9oYW5kbGVyKGlycSwgZG9fbGV2ZWxfSVJRKTsKIAkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKIAkJfSBlbHNlIHNldF9pcnFfZmxhZ3MoaXJxLCAwKTsKIAl9Ci0JCisKIAkvKgogCSAqIEdQSU8gSVJRcyBhcmUgaW52YWxpZCB1bnRpbCBzb21lb25lIHNldHMgdGhlIGludGVycnVwdCBtb2RlCi0JICogYnkgY2FsbGluZyBncGlvX2xpbmVfc2V0KCk7CisJICogYnkgY2FsbGluZyBzZXRfaXJxX3R5cGUoKS4KIAkgKi8KIAlmb3IgKGlycSA9IElSUV9JWFAyMDAwX0dQSU8wOyBpcnEgPD0gSVJRX0lYUDIwMDBfR1BJTzc7IGlycSsrKSB7CiAJCXNldF9pcnFfY2hpcChpcnEsICZpeHAyMDAwX0dQSU9faXJxX2NoaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKaW5kZXggMDRiMzhiYy4uOWFhNTRkZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwpAQCAtMTk3LDI0ICsxOTcsNDIgQEAKIAkucmVzb3VyY2UJPSAmZW5wMjYxMV9mbGFzaF9yZXNvdXJjZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXhwMjAwMF9pMmNfcGlucyBlbnAyNjExX2kyY19ncGlvX3BpbnMgPSB7CisJLnNkYV9waW4JPSBFTlAyNjExX0dQSU9fU0RBLAorCS5zY2xfcGluCT0gRU5QMjYxMV9HUElPX1NDTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVucDI2MTFfaTJjX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gIklYUDIwMDAtSTJDIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZW5wMjYxMV9pMmNfZ3Bpb19waW5zCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDAKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICplbnAyNjExX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZlbnAyNjExX2ZsYXNoCisJJmVucDI2MTFfZmxhc2gsCisJJmVucDI2MTFfaTJjX2NvbnRyb2xsZXIKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlbnAyNjExX2luaXRfbWFjaGluZSh2b2lkKQogewogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGVucDI2MTFfZGV2aWNlcywgQVJSQVlfU0laRShlbnAyNjExX2RldmljZXMpKTsKKwlpeHAyMDAwX3VhcnRfaW5pdCgpOwogfQogCiAKIE1BQ0hJTkVfU1RBUlQoRU5QMjYxMSwgIlJhZGlzeXMgRU5QLTI2MTEgUENJIG5ldHdvcmsgcHJvY2Vzc29yIGJvYXJkIikKLQlNQUlOVEFJTkVSKCJMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4iKQotCUJPT1RfTUVNKDB4MDAwMDAwMDAsIElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsIElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpCi0JQk9PVF9QQVJBTVMoMHgwMDAwMDEwMCkKLQlNQVBJTyhpeHAyMDAwX21hcF9pbykKLQlJTklUSVJRKGl4cDIwMDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCisJLnBoeXNfcmFtCT0gMHgwMDAwMDAwMCwKKwkucGh5c19pbwk9IElYUDIwMDBfVUFSVF9QSFlTX0JBU0UsCisJLmlvX3BnX29mZnN0CT0gKChJWFAyMDAwX1VBUlRfVklSVF9CQVNFKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwMDAwMDEwMCwKKwkubWFwX2lvCQk9IGl4cDIwMDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDIwMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZlbnAyNjExX3RpbWVyLAotCUlOSVRfTUFDSElORShlbnAyNjExX2luaXRfbWFjaGluZSkKKwkuaW5pdF9tYWNoaW5lCT0gZW5wMjYxMV9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKaW5kZXggZGYzZmYyNi4uZmQyODBhOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKQEAgLTE2OCwxMiArMTY4LDE0IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSVhEUDI0MDAsICJJbnRlbCBJWERQMjQwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCi0JTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwgSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKGl4ZHAyeDAwX21hcF9pbykKLQlJTklUSVJRKGl4ZHAyNDAwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5tYXBfaW8JCT0gaXhkcDJ4MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4ZHAyNDAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDI0MDBfdGltZXIsCi0JSU5JVF9NQUNISU5FKGl4ZHAyeDAwX2luaXRfbWFjaGluZSkKKwkuaW5pdF9tYWNoaW5lCT0gaXhkcDJ4MDBfaW5pdF9tYWNoaW5lLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYwppbmRleCBhZWMxM2M3Li5mOTA3M2FhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYwpAQCAtNDIsMTIgKzQyLDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAotCi12b2lkIGl4ZHAyNDAwX2luaXRfaXJxKHZvaWQpCi17Ci0JaXhkcDJ4MDBfaW5pdF9pcnEoSVhEUDI4MDBfQ1BMRF9JTlRfU1RBVCwgSVhEUDI4MDBfQ1BMRF9JTlRfTUFTSywgSVhEUDI0MDBfTlJfSVJRUyk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJWERQMjgwMCB0aW1lciB0aWNrCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI5MCwxMiArMjg0LDE0IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSVhEUDI4MDAsICJJbnRlbCBJWERQMjgwMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSIpCi0JTUFJTlRBSU5FUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwgSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKGl4ZHAyeDAwX21hcF9pbykKLQlJTklUSVJRKGl4ZHAyODAwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KKwkucGh5c19yYW0JPSAweDAwMDAwMDAwLAorCS5waHlzX2lvCT0gSVhQMjAwMF9VQVJUX1BIWVNfQkFTRSwKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDIwMDBfVUFSVF9WSVJUX0JBU0UpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDAwMDAwMTAwLAorCS5tYXBfaW8JCT0gaXhkcDJ4MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4ZHAyODAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhkcDI4MDBfdGltZXIsCi0JSU5JVF9NQUNISU5FKGl4ZHAyeDAwX2luaXRfbWFjaGluZSkKKwkuaW5pdF9tYWNoaW5lCT0gaXhkcDJ4MDBfaW5pdF9tYWNoaW5lLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYwppbmRleCAyMWM0MWZlLi5hNDMzNjlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDAuYwpAQCAtNDIsNiArNDIsOSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJWERQMngwMCBJUlEgSW5pdGlhbGl6YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzAwLDUgKzMwMyw2IEBACiAJZ3Bpb19saW5lX2NvbmZpZyhJWERQMlgwMF9HUElPX0kyQ19FTkFCTEUsIEdQSU9fT1VUKTsKIAogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGl4ZHAyeDAwX2RldmljZXMsIEFSUkFZX1NJWkUoaXhkcDJ4MDBfZGV2aWNlcykpOworCWl4cDIwMDBfdWFydF9pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKaW5kZXggZTk0ZGFjZS4uNDM0NDdkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKQEAgLTM3MCwzMCArMzcwLDM1IEBACiAJCSgoKklYRFAyWDAxX0NQTERfRkxBU0hfUkVHICYgSVhEUDJYMDFfQ1BMRF9GTEFTSF9CQU5LX01BU0spICsgMSk7CiAKIAlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpeGRwMngwMV9kZXZpY2VzLCBBUlJBWV9TSVpFKGl4ZHAyeDAxX2RldmljZXMpKTsKKwlpeHAyMDAwX3VhcnRfaW5pdCgpOwogfQogCiAKICNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjQwMQogTUFDSElORV9TVEFSVChJWERQMjQwMSwgIkludGVsIElYRFAyNDAxIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLCBJWFAyMDAwX1VBUlRfVklSVF9CQVNFKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oaXhkcDJ4MDFfbWFwX2lvKQotCUlOSVRJUlEoaXhkcDJ4MDFfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBpeGRwMngwMV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhkcDJ4MDFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeGRwMngwMV90aW1lciwKLQlJTklUX01BQ0hJTkUoaXhkcDJ4MDFfaW5pdF9tYWNoaW5lKQorCS5pbml0X21hY2hpbmUJPSBpeGRwMngwMV9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9JWERQMjgwMQogTUFDSElORV9TVEFSVChJWERQMjgwMSwgIkludGVsIElYRFAyODAxIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTSgweDAwMDAwMDAwLCBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLCBJWFAyMDAwX1VBUlRfVklSVF9CQVNFKQotCUJPT1RfUEFSQU1TKDB4MDAwMDAxMDApCi0JTUFQSU8oaXhkcDJ4MDFfbWFwX2lvKQotCUlOSVRJUlEoaXhkcDJ4MDFfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSBJWFAyMDAwX1VBUlRfUEhZU19CQVNFLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQMjAwMF9VQVJUX1ZJUlRfQkFTRSkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSBpeGRwMngwMV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhkcDJ4MDFfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeGRwMngwMV90aW1lciwKLQlJTklUX01BQ0hJTkUoaXhkcDJ4MDFfaW5pdF9tYWNoaW5lKQorCS5pbml0X21hY2hpbmUJPSBpeGRwMngwMV9pbml0X21hY2hpbmUsCiBNQUNISU5FX0VORAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9wY2kuYwppbmRleCA1ZmYyZjI3Li4wNzg4ZmIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL3BjaS5jCkBAIC0xOTgsNiArMTk4LDE5IEBACiB2b2lkIF9faW5pdAogaXhwMjAwMF9wY2lfcHJlaW5pdCh2b2lkKQogeworI2lmbmRlZiBDT05GSUdfSVhQMjAwMF9TVVBQT1JUX0JST0tFTl9QQ0lfSU8KKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgUENJIHVuaXQgdG8gcHJvcGVybHkgYnl0ZXN3YXAgSS9PIHRyYW5zYWN0aW9ucywKKwkgKiBhbmQgdmVyaWZ5IHRoYXQgaXQgd29ya2VkLgorCSAqLworCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfUENJX0NPTlRST0wsCisJCQkgICgqSVhQMjAwMF9QQ0lfQ09OVFJPTCB8IFBDSV9DT05UUk9MX0lFRSkpOworCisJaWYgKCgqSVhQMjAwMF9QQ0lfQ09OVFJPTCAmIFBDSV9DT05UUk9MX0lFRSkgPT0gMCkKKwkJcGFuaWMoIklYUDIwMDA6IFBDSSBJL08gaXMgYnJva2VuIG9uIHRoaXMgaXhwIG1vZGVsLCBhbmQgIgorCQkJInRoZSBuZWVkZWQgd29ya2Fyb3VuZCBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBpbiIpOworI2VuZGlmCisKIAlob29rX2ZhdWx0X2NvZGUoMTYrNiwgaXhwMjAwMF9wY2lfYWJvcnRfaGFuZGxlciwgU0lHQlVTLAogCQkJCSJQQ0kgY29uZmlnIGN5Y2xlIHRvIG5vbi1leGlzdGVudCBkZXZpY2UiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi1wY2kuYwppbmRleCBhYTkyZTM3Li4yYjU0NDM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24tcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLXBjaS5jCkBAIC00NTMsOCArNDUzLDggQEAKIAlsb2NhbF93cml0ZV9jb25maWcoUENJX0NPTU1BTkQsIDIsIFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWSk7CiAKIAlyZXNbMF0ubmFtZSA9ICJQQ0kgSS9PIFNwYWNlIjsKLQlyZXNbMF0uc3RhcnQgPSAweDAwMDAxMDAwOwotCXJlc1swXS5lbmQgPSAweGZmZmYwMDAwOworCXJlc1swXS5zdGFydCA9IDB4MDAwMDAwMDA7CisJcmVzWzBdLmVuZCA9IDB4MDAwMGZmZmY7CiAJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKIAogCXJlc1sxXS5uYW1lID0gIlBDSSBNZW1vcnkgU3BhY2UiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwppbmRleCAyNjdiYTAyLi4wNDQ5MGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYwpAQCAtMTQxLDcgKzE0MSwxNSBAQAogCQkucGh5c2ljYWwJPSBJWFA0WFhfUENJX0NGR19CQVNFX1BIWVMsCiAJCS5sZW5ndGgJCT0gSVhQNFhYX1BDSV9DRkdfUkVHSU9OX1NJWkUsCiAJCS50eXBlCQk9IE1UX0RFVklDRQorCX0sCisjaWZkZWYgQ09ORklHX0RFQlVHX0xMCisJewkvKiBEZWJ1ZyBVQVJUIG1hcHBpbmcgKi8KKwkJLnZpcnR1YWwJPSBJWFA0WFhfREVCVUdfVUFSVF9CQVNFX1ZJUlQsCisJCS5waHlzaWNhbAk9IElYUDRYWF9ERUJVR19VQVJUX0JBU0VfUEhZUywKKwkJLmxlbmd0aAkJPSBJWFA0WFhfREVCVUdfVUFSVF9SRUdJT05fU0laRSwKKwkJLnR5cGUJCT0gTVRfREVWSUNFCiAJfQorI2VuZGlmCiB9OwogCiB2b2lkIF9faW5pdCBpeHA0eHhfbWFwX2lvKHZvaWQpCkBAIC0yOTAsOCArMjk4LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gaXhwNHh4X3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiSVhQNHh4IFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBpeHA0eHhfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gaXhwNHh4X3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpeHA0eHhfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwppbmRleCA4YTA1YTEyLi40ZmY0MzkzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtc2V0dXAuYwpAQCAtNTYsMjEgKzU2LDI0IEBACiAJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNveW90ZV91YXJ0X2RhdGEgPSB7Ci0JLm1hcGJhc2UJPSBJWFA0WFhfVUFSVDJfQkFTRV9QSFlTLAotCS5tZW1iYXNlCT0gKGNoYXIgKilJWFA0WFhfVUFSVDJfQkFTRV9WSVJUICsgUkVHX09GRlNFVCwKLQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDIsCi0JLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JLnJlZ3NoaWZ0CT0gMiwKLQkudWFydGNsawk9IElYUDRYWF9VQVJUX1hUQUwsCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNveW90ZV91YXJ0X2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKKwkJLm1lbWJhc2UJPSAoY2hhciAqKUlYUDRYWF9VQVJUMl9CQVNFX1ZJUlQgKyBSRUdfT0ZGU0VULAorCQkuaXJxCQk9IElSUV9JWFA0WFhfVUFSVDIsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAorCX0sCisJeyB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY295b3RlX3VhcnQgPSB7CiAJLm5hbWUJCT0gInNlcmlhbDgyNTAiLAogCS5pZAkJPSAwLAogCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmY295b3RlX3VhcnRfZGF0YSwKKwkJLnBsYXRmb3JtX2RhdGEJPSBjb3lvdGVfdWFydF9kYXRhLAogCX0sCiAJLm51bV9yZXNvdXJjZXMJPSAxLAogCS5yZXNvdXJjZQk9ICZjb3lvdGVfdWFydF9yZXNvdXJjZSwKQEAgLTg3LDEwICs5MCwxMCBAQAogCSpJWFA0WFhfRVhQX0NTMSA9ICpJWFA0WFhfRVhQX0NTMDsKIAogCWlmIChtYWNoaW5lX2lzX2l4ZHBnNDI1KCkpIHsKLQkJY295b3RlX3VhcnRfZGF0YS5tZW1iYXNlID0KKwkJY295b3RlX3VhcnRfZGF0YVswXS5tZW1iYXNlID0KIAkJCShjaGFyKikoSVhQNFhYX1VBUlQxX0JBU0VfVklSVCArIFJFR19PRkZTRVQpOwotCQljb3lvdGVfdWFydF9kYXRhLm1hcGJhc2UgPSBJWFA0WFhfVUFSVDFfQkFTRV9QSFlTOwotCQljb3lvdGVfdWFydF9kYXRhLmlycSA9IElSUV9JWFA0WFhfVUFSVDE7CisJCWNveW90ZV91YXJ0X2RhdGFbMF0ubWFwYmFzZSA9IElYUDRYWF9VQVJUMV9CQVNFX1BIWVM7CisJCWNveW90ZV91YXJ0X2RhdGFbMF0uaXJxID0gSVJRX0lYUDRYWF9VQVJUMTsKIAl9CiAKIApAQCAtMTAwLDE0ICsxMDMsMTUgQEAKIAogI2lmZGVmIENPTkZJR19BUkNIX0FESV9DT1lPVEUKIE1BQ0hJTkVfU1RBUlQoQURJX0NPWU9URSwgIkFESSBFbmdpbmVlcmluZyBDb3lvdGUiKQotICAgICAgICBNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLSAgICAgICAgQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKLSAgICAgICAgICAgICAgICBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCi0gICAgICAgIE1BUElPKGNveW90ZV9tYXBfaW8pCi0gICAgICAgIElOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KKwkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKKwkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gY295b3RlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0gICAgICAgIEJPT1RfUEFSQU1TKDB4MDEwMCkKLQlJTklUX01BQ0hJTkUoY295b3RlX2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5pbml0X21hY2hpbmUJPSBjb3lvdGVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApAQCAtMTE3LDE0ICsxMjEsMTUgQEAKICAqLwogI2lmZGVmIENPTkZJR19NQUNIX0lYRFBHNDI1CiBNQUNISU5FX1NUQVJUKElYRFBHNDI1LCAiSW50ZWwgSVhEUEc0MjUiKQotICAgICAgICBNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLSAgICAgICAgQk9PVF9NRU0oUEhZU19PRkZTRVQsIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKLSAgICAgICAgICAgICAgICBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCi0gICAgICAgIE1BUElPKGNveW90ZV9tYXBfaW8pCi0gICAgICAgIElOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKi8KKwkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKKwkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gY295b3RlX21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0gICAgICAgIEJPT1RfUEFSQU1TKDB4MDEwMCkKLQlJTklUX01BQ0hJTkUoY295b3RlX2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5pbml0X21hY2hpbmUJPSBjb3lvdGVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXNldHVwLmMKaW5kZXggZTc3Yzg2ZS4uOGJhMWNkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1zZXR1cC5jCkBAIC0xNDAsMTQgKzE0MCwxNSBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoR1RXWDU3MTUsICJHZW10ZWsgR1RXWDU3MTUgKExpbmtzeXMgV1JWNTRHKSIpCi0gICAgICAgIE1BSU5UQUlORVIoIkdlb3JnZSBKb3NlcGgiKQotICAgICAgICBCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1VBUlQyX0JBU0VfUEhZUywKLSAgICAgICAgICAgICAgICBJWFA0WFhfVUFSVDJfQkFTRV9WSVJUKQotICAgICAgICBNQVBJTyhndHd4NTcxNV9tYXBfaW8pCi0gICAgICAgIElOSVRJUlEoaXhwNHh4X2luaXRfaXJxKQotCQkgIC50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotICAgICAgICBCT09UX1BBUkFNUygweDAxMDApCi0gICAgICAgIElOSVRfTUFDSElORShndHd4NTcxNV9pbml0KQorCS8qIE1haW50YWluZXI6IEdlb3JnZSBKb3NlcGggKi8KKwkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKKwkucGh5c19pbwk9IElYUDRYWF9VQVJUMl9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfVUFSVDJfQkFTRV9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBndHd4NTcxNV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAorCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gZ3R3eDU3MTVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1zZXR1cC5jCmluZGV4IDc3MzQ2YzEuLmMyYmE3NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXNldHVwLmMKQEAgLTk1LDcgKzk1LDggQEAKIAkJLmlvdHlwZQkJPSBVUElPX01FTSwKIAkJLnJlZ3NoaWZ0CT0gMiwKIAkJLnVhcnRjbGsJPSBJWFA0WFhfVUFSVF9YVEFMLAotCX0KKwl9LAorCXsgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHA0MjVfdWFydCA9IHsKQEAgLTEyOCwzNiArMTI5LDM5IEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSVhEUDQyNSwgIkludGVsIElYRFA0MjUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQotCUJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCi0JCUlYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkKLQlNQVBJTyhpeGRwNDI1X21hcF9pbykKLQlJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQlCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGl4ZHA0MjVfaW5pdCkKKwkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmluaXRfbWFjaGluZQk9IGl4ZHA0MjVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoSVhEUDQ2NSwgIkludGVsIElYRFA0NjUgRGV2ZWxvcG1lbnQgUGxhdGZvcm0iKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQotCUJPT1RfTUVNKFBIWVNfT0ZGU0VULCBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCi0JCUlYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkKLQlNQVBJTyhpeGRwNDI1X21hcF9pbykKLQlJTklUSVJRKGl4cDR4eF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICovCisJLnBoeXNfcmFtCT0gUEhZU19PRkZTRVQsCisJLnBoeXNfaW8JPSBJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1BIWVMsCisJLmlvX3BnX29mZnN0CT0gKChJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IGl4ZHA0MjVfbWFwX2lvLAorCS5pbml0X2lycQk9IGl4cDR4eF9pbml0X2lycSwKIAkudGltZXIJCT0gJml4cDR4eF90aW1lciwKLQlCT09UX1BBUkFNUygweDAxMDApCi0JSU5JVF9NQUNISU5FKGl4ZHA0MjVfaW5pdCkKKwkuYm9vdF9wYXJhbXMJPSAweDAxMDAsCisJLmluaXRfbWFjaGluZQk9IGl4ZHA0MjVfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoSVhDRFAxMTAwLCAiSW50ZWwgSVhDRFAxMTAwIERldmVsb3BtZW50IFBsYXRmb3JtIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIikKLQlCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAotCQlJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCi0JTUFQSU8oaXhkcDQyNV9tYXBfaW8pCi0JSU5JVElSUShpeHA0eHhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IFBIWVNfT0ZGU0VULAorCS5waHlzX2lvCT0gSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAorCS5pb19wZ19vZmZzdAk9ICgoSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9WSVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpeGRwNDI1X21hcF9pbywKKwkuaW5pdF9pcnEJPSBpeHA0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpeHA0eHhfdGltZXIsCi0JQk9PVF9QQVJBTVMoMHgwMTAwKQotCUlOSVRfTUFDSElORShpeGRwNDI1X2luaXQpCisJLmJvb3RfcGFyYW1zCT0gMHgwMTAwLAorCS5pbml0X21hY2hpbmUJPSBpeGRwNDI1X2luaXQsCiBNQUNISU5FX0VORAogCiAvKgpAQCAtMTY4LDE0ICsxNzIsMTUgQEAKICAqLwogI2lmZGVmIENPTkZJR19BUkNIX0FWSUxBCiBNQUNISU5FX1NUQVJUKEFWSUxBLCAiR2F0ZXdvcmtzIEF2aWxhIE5ldHdvcmsgUGxhdGZvcm0iKQotCU1BSU5UQUlORVIoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQ+IikKLQlCT09UX01FTShQSFlTX09GRlNFVCwgSVhQNFhYX1BFUklQSEVSQUxfQkFTRV9QSFlTLAotCQlJWFA0WFhfUEVSSVBIRVJBTF9CQVNFX1ZJUlQpCi0JTUFQSU8oaXhkcDQyNV9tYXBfaW8pCi0JSU5JVElSUShpeHA0eHhfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4gKi8KKwkucGh5c19yYW0JPSBQSFlTX09GRlNFVCwKKwkucGh5c19pbwk9IElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfUEhZUywKKwkuaW9fcGdfb2Zmc3QJPSAoKElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gaXhkcDQyNV9tYXBfaW8sCisJLmluaXRfaXJxCT0gaXhwNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmaXhwNHh4X3RpbWVyLAotCUJPT1RfUEFSQU1TKDB4MDEwMCkKLQlJTklUX01BQ0hJTkUoaXhkcDQyNV9pbml0KQorCS5ib290X3BhcmFtcwk9IDB4MDEwMCwKKwkuaW5pdF9tYWNoaW5lCT0gaXhkcDQyNV9pbml0LAogTUFDSElORV9FTkQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWw3MjAwL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCmluZGV4IDYwNmNhOTUuLjJhN2ZlZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbDcyMDAvY29yZS5jCkBAIC04MSw5ICs4MSwxMSBAQAogfQogCiBNQUNISU5FX1NUQVJUKEw3MjAwLCAiTGlua1VwIFN5c3RlbXMgTDcyMDAiKQotCU1BSU5UQUlORVIoIlN0ZXZlIEhpbGwgLyBTY290dCBNY0Nvbm5lbGwiKQotCUJPT1RfTUVNKDB4ZjAwMDAwMDAsIDB4ODAwNDAwMDAsIDB4ZDAwMDAwMDApCi0JTUFQSU8obDcyMDBfbWFwX2lvKQotCUlOSVRJUlEobDcyMDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogU3RldmUgSGlsbCAvIFNjb3R0IE1jQ29ubmVsbCAqLworCS5waHlzX3JhbQk9IDB4ZjAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDQwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhkMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gbDcyMDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGw3MjAwX2luaXRfaXJxLAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYyBiL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWtldjdhNDAwLmMKaW5kZXggYmU1ZDE3Zi4uY2IzZGNkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gta2V2N2E0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1rZXY3YTQwMC5jCkBAIC0xMDIsMTAgKzEwMiwxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUIChLRVY3QTQwMCwgIlNoYXJwIEtFVjdhNDAwIikKLQlNQUlOVEFJTkVSICgiTWFyYyBTaW5nZXIiKQotCUJPT1RfTUVNICgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCBpb19wMnYgKDB4ODAwMDAwMDApKQotCUJPT1RfUEFSQU1TICgweGMwMDAwMTAwKQotCU1BUElPIChrZXY3YTQwMF9tYXBfaW8pCi0JSU5JVElSUSAobGg3YTQwMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBNYXJjIFNpbmdlciAqLworCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoaW9fcDJ2ICgweDgwMDAwMDAwKSk+PjE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0ga2V2N2E0MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGxoN2E0MDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZsaDdhNDB4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvYXJjaC1scGQ3YTQweC5jCmluZGV4IGM4MjM0NDcuLjZlYjYxYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC9hcmNoLWxwZDdhNDB4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L2FyY2gtbHBkN2E0MHguYwpAQCAtMjYwLDEzICsyNjAsMTUgQEAKICNpZmRlZiBDT05GSUdfTUFDSF9MUEQ3QTQwMAogCiBNQUNISU5FX1NUQVJUIChMUEQ3QTQwMCwgIkxvZ2ljIFByb2R1Y3QgRGV2ZWxvcG1lbnQgTFBEN0E0MDAtMTAiKQotCU1BSU5UQUlORVIgKCJNYXJjIFNpbmdlciIpCi0JQk9PVF9NRU0gKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIGlvX3AydiAoMHg4MDAwMDAwMCkpCi0JQk9PVF9QQVJBTVMgKDB4YzAwMDAxMDApCi0JTUFQSU8gKGxwZDdhNDAwX21hcF9pbykKLQlJTklUSVJRIChsaDdhNDAwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IE1hcmMgU2luZ2VyICovCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKChpb19wMnYgKDB4ODAwMDAwMDApKT4+MTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBscGQ3YTQwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gbGg3YTQwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJmxoN2E0MHhfdGltZXIsCi0JSU5JVF9NQUNISU5FIChscGQ3YTQweF9pbml0KQorCS5pbml0X21hY2hpbmUJPSBscGQ3YTQweF9pbml0LAogTUFDSElORV9FTkQKIAogI2VuZGlmCkBAIC0yNzQsMTMgKzI3NiwxNSBAQAogI2lmZGVmIENPTkZJR19NQUNIX0xQRDdBNDA0CiAKIE1BQ0hJTkVfU1RBUlQgKExQRDdBNDA0LCAiTG9naWMgUHJvZHVjdCBEZXZlbG9wbWVudCBMUEQ3QTQwNC0xMCIpCi0JTUFJTlRBSU5FUiAoIk1hcmMgU2luZ2VyIikKLQlCT09UX01FTSAoMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgaW9fcDJ2ICgweDgwMDAwMDAwKSkKLQlCT09UX1BBUkFNUyAoMHhjMDAwMDEwMCkKLQlNQVBJTyAobHBkN2E0MDBfbWFwX2lvKQotCUlOSVRJUlEgKGxoN2E0MDRfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTWFyYyBTaW5nZXIgKi8KKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKGlvX3AydiAoMHg4MDAwMDAwMCkpPj4xOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IGxwZDdhNDAwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBsaDdhNDA0X2luaXRfaXJxLAogCS50aW1lcgkJPSAmbGg3YTQweF90aW1lciwKLQlJTklUX01BQ0hJTkUgKGxwZDdhNDB4X2luaXQpCisJLmluaXRfbWFjaGluZQk9IGxwZDdhNDB4X2luaXQsCiBNQUNISU5FX0VORAogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWxoN2E0MHgvdGltZS5jCmluZGV4IDUxZTFjODEuLmJlMzc3ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbGg3YTQweC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1saDdhNDB4L3RpbWUuYwpAQCAtNTMsOCArNTMsOCBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBsaDdhNDB4X3RpbWVyX2lycSA9IHsKIAkubmFtZQkJPSAiTEhBNzQweCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gbGg3YTQweF90aW1lcl9pbnRlcnJ1cHQKKwkuZmxhZ3MJCT0gU0FfSU5URVJSVVBUIHwgU0FfVElNRVIsCisJLmhhbmRsZXIJPSBsaDdhNDB4X3RpbWVyX2ludGVycnVwdCwKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBsaDdhNDB4X3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDJlZmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotaWYgQVJDSF9PTUFQCi0KLW1lbnUgIlRJIE9NQVAgSW1wbGVtZW50YXRpb25zIgotCi1jb21tZW50ICJPTUFQIENvcmUgVHlwZSIKLQotY29uZmlnIEFSQ0hfT01BUDczMAotCWRlcGVuZHMgb24gQVJDSF9PTUFQCi0JYm9vbCAiT01BUDczMCBCYXNlZCBTeXN0ZW0iCi0Jc2VsZWN0IEFSQ0hfT01BUF9PVEcKLQotY29uZmlnIEFSQ0hfT01BUDE1MTAKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUAotCWRlZmF1bHQgeQotCWJvb2wgIk9NQVAxNTEwIEJhc2VkIFN5c3RlbSIKLQotY29uZmlnIEFSQ0hfT01BUDE2WFgKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUAotCWJvb2wgIk9NQVAxNlhYIEJhc2VkIFN5c3RlbSIKLQlzZWxlY3QgQVJDSF9PTUFQX09URwotCi1jb25maWcgQVJDSF9PTUFQX09URwotCWJvb2wKLQotY29tbWVudCAiT01BUCBCb2FyZCBUeXBlIgotCi1jb25maWcgTUFDSF9PTUFQX0lOTk9WQVRPUgotCWJvb2wgIlRJIElubm92YXRvciIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWAotCWhlbHAKLSAgICAgICAgICBUSSBPTUFQIDE1MTAgb3IgMTYxMCBJbm5vdmF0b3IgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UKLSAgICAgICAgICBoYXZlIHN1Y2ggYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9IMgotCWJvb2wgIlRJIEgyIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCi0gICAgCWhlbHAKLQkgIFRJIE9NQVAgMTYxMC8xNjExQiBIMiBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKLQkgIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX09NQVBfSDMKLQlib29sICJUSSBIMyBTdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAotICAgIAloZWxwCi0JICBUSSBPTUFQIDE3MTAgSDMgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCi0JICBhIGJvYXJkLgotCi1jb25maWcgTUFDSF9PTUFQX0g0Ci0JYm9vbCAiVEkgSDQgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKLSAgICAJaGVscAotCSAgVEkgT01BUCAxNjEwIEg0IGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaAotCSAgYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9PU0sKLQlib29sICJUSSBPU0sgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE2WFgKLSAgICAJaGVscAotCSAgVEkgT01BUCA1OTEyIE9TSyAoT01BUCBTdGFydGVyIEtpdCkgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZQotICAgICAgICAgIGlmIHlvdSBoYXZlIHN1Y2ggYSBib2FyZC4KLQotY29uZmlnIE1BQ0hfT01BUF9QRVJTRVVTMgotCWJvb2wgIlRJIFBlcnNldXMyIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQNzMwCi0gICAgCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFRJIE9NQVAgNzMwIFBlcnNldXMyIGJvYXJkLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKLQkgIGEgYm9hcmQuCi0KLWNvbmZpZyBNQUNIX1ZPSUNFQkxVRQotCWJvb2wgIlZvaWNlYmx1ZSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAKLQloZWxwCi0JICBTdXBwb3J0IGZvciBWb2ljZWJsdWUgR1NNL1ZvSVAgZ2F0ZXdheS4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCi0JICBib2FyZC4KLQotY29uZmlnIE1BQ0hfTkVUU1RBUgotCWJvb2wgIk5ldFN0YXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgTmV0U3RhciBQQlguIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgotCi1jb25maWcgTUFDSF9PTUFQX0dFTkVSSUMKLQlib29sICJHZW5lcmljIE9NQVAgYm9hcmQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFgKLQloZWxwCi0gICAgICAgICAgU3VwcG9ydCBmb3IgZ2VuZXJpYyBPTUFQLTE1MTAsIDE2MTAgb3IgMTcxMCBib2FyZCB3aXRoCi0gICAgICAgICAgbm8gRlBHQS4gQ2FuIGJlIHVzZWQgYXMgdGVtcGxhdGUgZm9yIHBvcnRpbmcgTGludXggdG8KLSAgICAgICAgICBjdXN0b20gT01BUCBib2FyZHMuIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjdXN0b20KLSAgICAgICAgICBib2FyZC4KLQotY29tbWVudCAiT01BUCBGZWF0dXJlIFNlbGVjdGlvbnMiCi0KLSNjb25maWcgT01BUF9CT09UX1RBRwotIwlib29sICJPTUFQIGJvb3Rsb2FkZXIgaW5mb3JtYXRpb24gcGFzc2luZyIKLSMgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCi0jICAgICAgICBkZWZhdWx0IG4KLSMgICAgICAgIGhlbHAKLSMgICAgICAgICAgU2F5IFksIGlmIHlvdSBoYXZlIGEgYm9vdGxvYWRlciB3aGljaCBwYXNzZXMgaW5mb3JtYXRpb24KLSMgICAgICAgICAgYWJvdXQgeW91ciBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWwgY29uZmlndXJhdGlvbi4KLQotY29uZmlnIE9NQVBfTVVYCi0JYm9vbCAiT01BUCBtdWx0aXBsZXhpbmcgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlkZWZhdWx0IHkKLSAgICAgICAgaGVscAotICAgICAgICAgIFBpbiBtdWx0aXBsZXhpbmcgc3VwcG9ydCBmb3IgT01BUCBib2FyZHMuIElmIHlvdXIgYm9vdGxvYWRlcgotICAgICAgICAgIHNldHMgdGhlIG11bHRpcGxleGluZyBjb3JyZWN0bHksIHNheSBOLiBPdGhlcndpc2UsIG9yIGlmIHVuc3VyZSwKLSAgICAgICAgICBzYXkgWS4KLQotY29uZmlnIE9NQVBfTVVYX0RFQlVHCi0JYm9vbCAiTXVsdGlwbGV4aW5nIGRlYnVnIG91dHB1dCIKLSAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgaGVscAotICAgICAgICAgIE1ha2VzIHRoZSBtdWx0aXBsZXhpbmcgZnVuY3Rpb25zIHByaW50IG91dCBhIGxvdCBvZiBkZWJ1ZyBpbmZvLgotICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGZpbmQgb3V0IHRoZSBjb3JyZWN0IHZhbHVlcyBvZiB0aGUKLSAgICAgICAgICBtdWx0aXBsZXhpbmcgcmVnaXN0ZXJzLgotCi1jb25maWcgT01BUF9NVVhfV0FSTklOR1MKLQlib29sICJXYXJuIGFib3V0IHBpbnMgdGhlIGJvb3Rsb2FkZXIgZGlkbid0IHNldCB1cCIKLSAgICAgICAgZGVwZW5kcyBvbiBPTUFQX01VWAotICAgICAgICBkZWZhdWx0IHkKLSAgICAgICAgaGVscAotCSAgQ2hvb3NlIFkgaGVyZSB0byB3YXJuIHdoZW5ldmVyIGRyaXZlciBpbml0aWFsaXphdGlvbiBsb2dpYyBuZWVkcwotCSAgdG8gY2hhbmdlIHRoZSBwaW4gbXVsdGlwbGV4aW5nIHNldHVwLiAgV2hlbiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKLQkgIHByaW50ZWQsIGl0J3Mgc2FmZSB0byBkZXNlbGVjdCBPTUFQX01VWCBmb3IgeW91ciBwcm9kdWN0LgotCi1jaG9pY2UKLSAgICAgICAgcHJvbXB0ICJTeXN0ZW0gdGltZXIiCi0JZGVmYXVsdCBPTUFQX01QVV9USU1FUgotCi1jb25maWcgT01BUF9NUFVfVElNRVIKLQlib29sICJVc2UgbXB1IHRpbWVyIgotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIE9NQVAgbXB1IHRpbWVyLiBUaGlzCi0JICB0aW1lciBwcm92aWRlcyBtb3JlIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIHRoZSAzMktIeiB0aW1lciwKLQkgIGJ1dCBjb25zdW1lcyBtb3JlIHBvd2VyLgotCi1jb25maWcgT01BUF8zMktfVElNRVIKLQlib29sICJVc2UgMzJLSHogdGltZXIiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNlhYCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGUgT01BUCAzMktIeiB0aW1lci4KLQkgIFRoaXMgdGltZXIgc2F2ZXMgcG93ZXIgY29tcGFyZWQgdG8gdGhlIE9NQVBfTVBVX1RJTUVSLCBhbmQgaGFzCi0JICBzdXBwb3J0IGZvciBubyB0aWNrIGR1cmluZyBpZGxlLiBUaGUgMzJLSHogdGltZXIgcHJvdmlkZXMgbGVzcwotCSAgaW50cmEtdGljayByZXNvbHV0aW9uIHRoYW4gT01BUF9NUFVfVElNRVIuIFRoZSAzMktIeiB0aW1lciBpcwotCSAgY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBPTUFQLTE2eHguCi0KLWVuZGNob2ljZQotCi1jb25maWcgT01BUF8zMktfVElNRVJfSFoKLSAgICAgICBpbnQgIktlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgZm9yIDMyS0h6IHRpbWVyIgotICAgICAgIHJhbmdlIDMyIDEwMjQKLSAgICAgICBkZXBlbmRzIG9uIE9NQVBfMzJLX1RJTUVSCi0gICAgICAgZGVmYXVsdCAiMTI4IgotICAgICAgIGhlbHAKLQkgIEtlcm5lbCBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgc2hvdWxkIGJlIGEgZGl2aXNvciBvZiAzMjc2OCwKLQkgIHN1Y2ggYXMgNjQgb3IgMTI4LgotCi1jaG9pY2UKLQlwcm9tcHQgIkxvdy1sZXZlbCBkZWJ1ZyBjb25zb2xlIFVBUlQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAKLQlkZWZhdWx0IE9NQVBfTExfREVCVUdfVUFSVDEKLQotY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDEKLQlib29sICJVQVJUMSIKLQotY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDIKLQlib29sICJVQVJUMiIKLQotY29uZmlnIE9NQVBfTExfREVCVUdfVUFSVDMKLQlib29sICJVQVJUMyIKLQotZW5kY2hvaWNlCi0KLWNvbmZpZyBPTUFQX0FSTV8xOTVNSFoKLQlib29sICJPTUFQIEFSTSAxOTUgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDczMAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTk1TUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzE5Mk1IWgotCWJvb2wgIk9NQVAgQVJNIDE5MiBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAotCWhlbHAKLSAgICAgICAgICBFbmFibGUgMTkyTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE9NQVBfQVJNXzE4Mk1IWgotCWJvb2wgIk9NQVAgQVJNIDE4MiBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAxODJNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgT01BUF9BUk1fMTY4TUhaCi0JYm9vbCAiT01BUCBBUk0gMTY4IE1IeiBDUFUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAxNjhNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgT01BUF9BUk1fMTIwTUhaCi0JYm9vbCAiT01BUCBBUk0gMTIwIE1IeiBDUFUiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwCi0JaGVscAotICAgICAgICAgIEVuYWJsZSAxMjBNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgT01BUF9BUk1fNjBNSFoKLQlib29sICJPTUFQIEFSTSA2MCBNSHogQ1BVIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMAotICAgICAgICBkZWZhdWx0IHkKLQloZWxwCi0gICAgICAgICAgRW5hYmxlIDYwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIE9NQVBfQVJNXzMwTUhaCi0JYm9vbCAiT01BUCBBUk0gMzAgTUh6IENQVSIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzAKLQloZWxwCi0gICAgICAgICAgRW5hYmxlIDMwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotZW5kbWVudQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FmYjExLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCi0jCi0KLSMgQ29tbW9uIHN1cHBvcnQKLW9iai15IDo9IGNvbW1vbi5vIHRpbWUubyBpcnEubyBkbWEubyBjbG9jay5vIG11eC5vIGdwaW8ubyBtY2JzcC5vIHVzYi5vCi1vYmotbSA6PQotb2JqLW4gOj0KLW9iai0gIDo9Ci1sZWQteSA6PSBsZWRzLm8KLQotIyBTcGVjaWZpYyBib2FyZCBzdXBwb3J0Ci1vYmotJChDT05GSUdfTUFDSF9PTUFQX0gyKSArPSBib2FyZC1oMi5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gYm9hcmQtaW5ub3ZhdG9yLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfR0VORVJJQykgKz0gYm9hcmQtZ2VuZXJpYy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKSArPSBib2FyZC1wZXJzZXVzMi5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX09TSykgKz0gYm9hcmQtb3NrLm8KLW9iai0kKENPTkZJR19NQUNIX09NQVBfSDMpICs9IGJvYXJkLWgzLm8KLW9iai0kKENPTkZJR19NQUNIX1ZPSUNFQkxVRSkgKz0gYm9hcmQtdm9pY2VibHVlLm8KLW9iai0kKENPTkZJR19NQUNIX05FVFNUQVIpICs9IGJvYXJkLW5ldHN0YXIubwotCi0jIE9DUEkgaW50ZXJjb25uZWN0IHN1cHBvcnQgZm9yIDE3MTAsIDE2MTAgYW5kIDU5MTIKLW9iai0kKENPTkZJR19BUkNIX09NQVAxNlhYKSArPSBvY3BpLm8KLQotIyBMRURzIHN1cHBvcnQKLWxlZC0kKENPTkZJR19NQUNIX09NQVBfSDIpICs9IGxlZHMtaDJwMi1kZWJ1Zy5vCi1sZWQtJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikgKz0gbGVkcy1pbm5vdmF0b3IubwotbGVkLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikgKz0gbGVkcy1oMnAyLWRlYnVnLm8KLW9iai0kKENPTkZJR19MRURTKSArPSAkKGxlZC15KQotCi0jIFBvd2VyIE1hbmFnZW1lbnQKLW9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCi0KLWlmZXEgKCQoQ09ORklHX0FSQ0hfT01BUDE1MTApLHkpCi0jIElubm92YXRvci0xNTEwIEZQR0EKLW9iai0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKSArPSBmcGdhLm8KLWVuZGlmCi0KLSMga2dkYiBzdXBwb3J0Ci1vYmotJChDT05GSUdfS0dEQl9TRVJJQUwpCSs9IGtnZGItc2VyaWFsLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTFhNmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL01ha2VmaWxlLmJvb3QKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSAgIHpyZWxhZGRyLXkJCTo9IDB4MTAwMDgwMDAKLXBhcmFtc19waHlzLXkJCTo9IDB4MTAwMDAxMDAKLWluaXRyZF9waHlzLXkJCTo9IDB4MTA4MDAwMDAKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWdlbmVyaWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDJhMmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWdlbmVyaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtZ2VuZXJpYy5jCi0gKgotICogTW9kaWZpZWQgZnJvbSBib2FyZC1pbm5vdmF0b3IxNTEwLmMKLSAqCi0gKiBDb2RlIGZvciBnZW5lcmljIE9NQVAgYm9hcmQuIFNob3VsZCB3b3JrIG9uIG1hbnkgT01BUCBzeXN0ZW1zIHdoZXJlCi0gKiB0aGUgZGV2aWNlIGRyaXZlcnMgdGFrZSBjYXJlIG9mIGFsbCB0aGUgbmVjZXNzYXJ5IGhhcmR3YXJlIGluaXRpYWxpemF0aW9uLgotICogRG8gbm90IHB1dCBhbnkgYm9hcmQgc3BlY2lmaWMgY29kZSB0byB0aGlzIGZpbGU7IGNyZWF0ZSBhIG5ldyBtYWNoaW5lCi0gKiB0eXBlIGlmIHlvdSBuZWVkIGN1c3RvbSBsb3ctbGV2ZWwgaW5pdGlhbGl6YXRpb25zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLQotc3RhdGljIGludCBfX2luaXRkYXRhIGdlbmVyaWNfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0X2lycSh2b2lkKQotewotCW9tYXBfaW5pdF9pcnEoKTsKLX0KLQotLyogYXNzdW1lIG5vIE1pbmktQUIgcG9ydCAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGdlbmVyaWMxNTEwX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkucmVnaXN0ZXJfaG9zdAk9IDEsCi0JLnJlZ2lzdGVyX2Rldgk9IDEsCi0JLmhtY19tb2RlCT0gMTYsCi0JLnBpbnNbMF0JPSAzLAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLXN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGdlbmVyaWMxNjEwX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkucmVnaXN0ZXJfaG9zdAk9IDEsCi0JLnJlZ2lzdGVyX2Rldgk9IDEsCi0JLmhtY19tb2RlCT0gMTYsCi0JLnBpbnNbMF0JPSA2LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCBnZW5lcmljX2NvbmZpZ1tdID0gewotCXsgT01BUF9UQUdfVVNCLCAgICAgICAgICAgTlVMTCB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfZ2VuZXJpY19pbml0KHZvaWQpCi17Ci0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIHNlcmlhbCBwb3J0cyBhcmUgbXV4ZWQgb24gYXQgdGhpcyBwb2ludC4KLQkgKiBZb3UgaGF2ZSB0byBtdXggdGhlbSBvZmYgaW4gZGV2aWNlIGRyaXZlcnMgbGF0ZXIgb24KLQkgKiBpZiBub3QgbmVlZGVkLgotCSAqLwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWdlbmVyaWNfY29uZmlnWzBdLmRhdGEgPSAmZ2VuZXJpYzE1MTBfdXNiX2NvbmZpZzsKLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJZ2VuZXJpY19jb25maWdbMF0uZGF0YSA9ICZnZW5lcmljMTYxMF91c2JfY29uZmlnOwotCX0KLSNlbmRpZgotCW9tYXBfYm9hcmRfY29uZmlnID0gZ2VuZXJpY19jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoZ2VuZXJpY19jb25maWcpOwotCW9tYXBfc2VyaWFsX2luaXQoZ2VuZXJpY19zZXJpYWxfcG9ydHMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX21hcF9pbyh2b2lkKQotewotCW9tYXBfbWFwX2lvKCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoT01BUF9HRU5FUklDLCAiR2VuZXJpYyBPTUFQMTUxMC8xNjEwLzE3MTAiKQotCU1BSU5UQUlORVIoIlRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+IikKLQlCT09UX01FTSgweDEwMDAwMDAwLCAweGZmZjAwMDAwLCAweGZlZjAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MTAwMDAxMDApCi0JTUFQSU8ob21hcF9nZW5lcmljX21hcF9pbykKLQlJTklUSVJRKG9tYXBfZ2VuZXJpY19pbml0X2lycSkKLQlJTklUX01BQ0hJTkUob21hcF9nZW5lcmljX2luaXQpCi0JLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDY3ODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1oMi5jCi0gKgotICogQm9hcmQgc3BlY2lmaWMgaW5pdHMgZm9yIE9NQVAtMTYxMCBIMgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBSaWRnZVJ1biwgSW5jLgotICogQXV0aG9yOiBHcmVnIExvbm5vbiA8Z2xvbm5vbkByaWRnZXJ1bi5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBTZXBhcmF0ZWQgRlBHQSBpbnRlcnJ1cHRzIGZyb20gaW5ub3ZhdG9yMTUxMC5jIGFuZCBjbGVhbmVkIHVwIGZvciAyLjYKLSAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbiBieSBUb255IExpbmRyZ2VuIDx0b255QGF0b21pZGUuY29tPgotICoKLSAqIEgyIHNwZWNpZmljIGNoYW5nZXMgYW5kIGNsZWFudXAKLSAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbiBieSBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLQotZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsKLQotc3RhdGljIGludCBfX2luaXRkYXRhIGgyX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBoMl9wYXJ0aXRpb25zW10gPSB7Ci0JLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLwotCXsKLQkgICAgICAubmFtZQkJPSAiYm9vdGxvYWRlciIsCi0JICAgICAgLm9mZnNldAkJPSAwLAotCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCi0JICAgICAgLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KLQl9LAotCS8qIGJvb3Rsb2FkZXIgcGFyYW1zIGluIHRoZSBuZXh0IHNlY3RvciAqLwotCXsKLQkgICAgICAubmFtZQkJPSAicGFyYW1zIiwKLQkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAotCSAgICAgIC5tYXNrX2ZsYWdzCT0gMCwKLQl9LAotCS8qIGtlcm5lbCAqLwotCXsKLQkgICAgICAubmFtZQkJPSAia2VybmVsIiwKLQkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkgICAgICAuc2l6ZQkJPSBTWl8yTSwKLQkgICAgICAubWFza19mbGFncwk9IDAKLQl9LAotCS8qIGZpbGUgc3lzdGVtICovCi0JewotCSAgICAgIC5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKLQkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkgICAgICAuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAotCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBoMl9mbGFzaF9kYXRhID0gewotCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAotCS53aWR0aAkJPSAyLAotCS5wYXJ0cwkJPSBoMl9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoaDJfcGFydGl0aW9ucyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGgyX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJPSBPTUFQX0NTMkJfUEhZUywKLQkuZW5kCQk9IE9NQVBfQ1MyQl9QSFlTICsgT01BUF9DUzJCX1NJWkUgLSAxLAotCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGgyX2ZsYXNoX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcGZsYXNoIiwKLQkuaWQJCT0gMCwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmaDJfZmxhc2hfZGF0YSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gMSwKLQkucmVzb3VyY2UJPSAmaDJfZmxhc2hfcmVzb3VyY2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGgyX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IE9NQVAxNjEwX0VUSFJfU1RBUlQsCQkvKiBQaHlzaWNhbCAqLwotCQkuZW5kCT0gT01BUDE2MTBfRVRIUl9TVEFSVCArIDB4ZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IE9NQVBfR1BJT19JUlEoMCksCi0JCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDApLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDJfc21jOTF4X2RldmljZSA9IHsKLQkubmFtZQkJPSAic21jOTF4IiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaDJfc21jOTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gaDJfc21jOTF4X3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpoMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmaDJfZmxhc2hfZGV2aWNlLAotCSZoMl9zbWM5MXhfZGV2aWNlLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGgyX2luaXRfc21jOTF4KHZvaWQpCi17Ci0JaWYgKChvbWFwX3JlcXVlc3RfZ3BpbygwKSkgPCAwKSB7Ci0JCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDAgZm9yIHNtYzkxeCBpcnFcbiIpOwotCQlyZXR1cm47Ci0JfQotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDAsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOwotfQotCi12b2lkIGgyX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcF9pbml0X2lycSgpOwotCW9tYXBfZ3Bpb19pbml0KCk7Ci0JaDJfaW5pdF9zbWM5MXgoKTsKLX0KLQotc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaDJfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS8qIHVzYjEgaGFzIGEgTWluaS1BQiBwb3J0IGFuZCBleHRlcm5hbCBpc3AxMzAxIHRyYW5zY2VpdmVyICovCi0JLm90ZwkJPSAyLAotCi0jaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAotCS5obWNfbW9kZQk9IDE5LAkvLyAwOmhvc3Qob2ZmKSAxOmRldnxvdGcgMjpkaXNhYmxlZAotCS8vIC5obWNfbW9kZQk9IDIxLAkvLyAwOmhvc3Qob2ZmKSAxOmRldihsb29wYmFjaykgMjpob3N0KGxvb3BiYWNrKQotI2VsaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQotCS8qIG5lZWRzIE9URyBjYWJsZSwgb3IgTk9OU1RBTkRBUkQgKEItdG8tTWluaUIpICovCi0JLmhtY19tb2RlCT0gMjAsCS8vIDE6ZGV2fG90ZyhvZmYpIDE6aG9zdCAyOmRpc2FibGVkCi0jZW5kaWYKLQotCS5waW5zWzFdCT0gMywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfY29uZmlnIGgyX21tY19jb25maWcgX19pbml0ZGF0YSA9IHsKLQkubW1jX2Jsb2NrcwkJPSAxLAotCS5tbWMxX3Bvd2VyX3BpbgkJPSAtMSwJLyogdHBzNjUwMTAgZ3BpbzMgKi8KLQkubW1jMV9zd2l0Y2hfcGluCT0gT01BUF9NUFVJTygxKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGgyX2NvbmZpZ1tdID0gewotCXsgT01BUF9UQUdfVVNCLCAgICAgICAgICAgJmgyX3VzYl9jb25maWcgfSwKLQl7IE9NQVBfVEFHX01NQywgICAgICAgICAgICZoMl9tbWNfY29uZmlnIH0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdCh2b2lkKQotewotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGgyX2RldmljZXMsIEFSUkFZX1NJWkUoaDJfZGV2aWNlcykpOwotCW9tYXBfYm9hcmRfY29uZmlnID0gaDJfY29uZmlnOwotCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGgyX2NvbmZpZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBoMl9tYXBfaW8odm9pZCkKLXsKLQlvbWFwX21hcF9pbygpOwotCW9tYXBfc2VyaWFsX2luaXQoaDJfc2VyaWFsX3BvcnRzKTsKLX0KLQotTUFDSElORV9TVEFSVChPTUFQX0gyLCAiVEktSDIiKQotCU1BSU5UQUlORVIoIkltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyhoMl9tYXBfaW8pCi0JSU5JVElSUShoMl9pbml0X2lycSkKLQlJTklUX01BQ0hJTkUoaDJfaW5pdCkKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2YTVhMC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWgzLmMKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgT01BUDE3MTAgSDMgc3BlY2lmaWMgY29kZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4KLSAqIEF1dGhvcjogUmlkZ2VSdW4sIEluYy4KLSAqICAgICAgICAgR3JlZyBMb25ub24gKGdsb25ub25AcmlkZ2VydW4uY29tKSBvciBpbmZvQHJpZGdlcnVuLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1leHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOwotCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgaDNfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGgzX3BhcnRpdGlvbnNbXSA9IHsKLQkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCi0JewotCSAgICAgIC5uYW1lCQk9ICJib290bG9hZGVyIiwKLQkgICAgICAub2Zmc2V0CQk9IDAsCi0JICAgICAgLnNpemUJCT0gU1pfMTI4SywKLQkgICAgICAubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLwotCX0sCi0JLyogYm9vdGxvYWRlciBwYXJhbXMgaW4gdGhlIG5leHQgc2VjdG9yICovCi0JewotCSAgICAgIC5uYW1lCQk9ICJwYXJhbXMiLAotCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAotCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCi0JICAgICAgLm1hc2tfZmxhZ3MJPSAwLAotCX0sCi0JLyoga2VybmVsICovCi0JewotCSAgICAgIC5uYW1lCQk9ICJrZXJuZWwiLAotCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAotCSAgICAgIC5zaXplCQk9IFNaXzJNLAotCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAotCX0sCi0JLyogZmlsZSBzeXN0ZW0gKi8KLQl7Ci0JICAgICAgLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAotCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAotCSAgICAgIC5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCi0JICAgICAgLm1hc2tfZmxhZ3MJPSAwCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGgzX2ZsYXNoX2RhdGEgPSB7Ci0JLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCi0JLndpZHRoCQk9IDIsCi0JLnBhcnRzCQk9IGgzX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShoM19wYXJ0aXRpb25zKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDNfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IE9NQVBfQ1MyQl9QSFlTLAotCS5lbmQJCT0gT01BUF9DUzJCX1BIWVMgKyBPTUFQX0NTMkJfU0laRSAtIDEsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZmxhc2hfZGV2aWNlID0gewotCS5uYW1lCQk9ICJvbWFwZmxhc2giLAotCS5pZAkJPSAwLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZoM19mbGFzaF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZoM19mbGFzaF9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gT01BUDE3MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCi0JCS5lbmQJPSBPTUFQMTcxMF9FVEhSX1NUQVJUICsgMHhmLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSg0MCksCi0JCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDQwKSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNtYzkxeCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCi19OwotCi0jZGVmaW5lIEdQVElNRVJfQkFTRQkJMHhGRkZCMTQwMAotI2RlZmluZSBHUFRJTUVSX1JFR1MoeCkJKDB4RkZGQjE0MDAgKyAoeCAqIDB4ODAwKSkKLSNkZWZpbmUgR1BUSU1FUl9SRUdTX1NJWkUJMHg0NgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGludGxhdF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydCAgPSBHUFRJTUVSX1JFR1MoMCksCSAgICAgIC8qIFBoeXNpY2FsICovCi0JCS5lbmQgICAgPSBHUFRJTUVSX1JFR1MoMCkgKyBHUFRJTUVSX1JFR1NfU0laRSwKLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgID0gSU5UXzE2MTBfR1BUSU1FUjEsCi0JCS5lbmQgICAgPSBJTlRfMTYxMF9HUFRJTUVSMSwKLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbnRsYXRfZGV2aWNlID0gewotCS5uYW1lCSAgID0gIm9tYXBfaW50bGF0IiwKLQkuaWQJICAgICA9IDAsCi0JLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShpbnRsYXRfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UgICAgICAgPSBpbnRsYXRfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZmbGFzaF9kZXZpY2UsCi0gICAgICAgICZzbWM5MXhfZGV2aWNlLAotCSZpbnRsYXRfZGV2aWNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaDNfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS8qIHVzYjEgaGFzIGEgTWluaS1BQiBwb3J0IGFuZCBleHRlcm5hbCBpc3AxMzAxIHRyYW5zY2VpdmVyICovCi0JLm90ZwkgICAgPSAyLAotCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfT01BUAotCS5obWNfbW9kZSAgICAgICA9IDE5LCAgIC8qIDA6aG9zdChvZmYpIDE6ZGV2fG90ZyAyOmRpc2FibGVkICovCi0jZWxpZiAgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQotCS8qIE5PTlNUQU5EQVJEIENBQkxFIE5FRURFRCAoQi10by1NaW5pLUIpICovCi0JLmhtY19tb2RlICAgICAgID0gMjAsICAgLyogMTpkZXZ8b3RnKG9mZikgMTpob3N0IDI6ZGlzYWJsZWQgKi8KLSNlbmRpZgotCi0JLnBpbnNbMV0JPSAzLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDNfY29uZmlnW10gPSB7Ci0JeyBPTUFQX1RBR19VU0IsCSAmaDNfdXNiX2NvbmZpZyB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGgzX2luaXQodm9pZCkKLXsKLQkodm9pZCkgcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0X3NtYzkxeCh2b2lkKQotewotCW9tYXBfY2ZnX3JlZyhXMTVfMTcxMF9HUElPNDApOwotCWlmIChvbWFwX3JlcXVlc3RfZ3Bpbyg0MCkgPCAwKSB7Ci0JCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDQwIGZvciBzbWM5MXggaXJxXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg0MCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Ci19Ci0KLXZvaWQgaDNfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwX2luaXRfaXJxKCk7Ci0Jb21hcF9ncGlvX2luaXQoKTsKLQloM19pbml0X3NtYzkxeCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaDNfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcF9tYXBfaW8oKTsKLQlvbWFwX3NlcmlhbF9pbml0KGgzX3NlcmlhbF9wb3J0cyk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoT01BUF9IMywgIlRJIE9NQVAxNzEwIEgzIGJvYXJkIikKLQlNQUlOVEFJTkVSKCJUZXhhcyBJbnN0cnVtZW50cywgSW5jLiIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCU1BUElPKGgzX21hcF9pbykKLQlJTklUSVJRKGgzX2luaXRfaXJxKQotCUlOSVRfTUFDSElORShoM19pbml0KQotCS50aW1lcgkJPSAmb21hcF90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Y2Y0ZGEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLWlubm92YXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtaW5ub3ZhdG9yLmMKLSAqCi0gKiBCb2FyZCBzcGVjaWZpYyBpbml0cyBmb3IgT01BUC0xNTEwIGFuZCBPTUFQLTE2MTAgSW5ub3ZhdG9yCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCi0gKiBBdXRob3I6IEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICoKLSAqIFNlcGFyYXRlZCBGUEdBIGludGVycnVwdHMgZnJvbSBpbm5vdmF0b3IxNTEwLmMgYW5kIGNsZWFuZWQgdXAgZm9yIDIuNgotICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIGJ5IFRvbnkgTGluZHJnZW4gPHRvbnlAYXRvbWlkZS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpbm5vdmF0b3Jfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGlubm92YXRvcl9wYXJ0aXRpb25zW10gPSB7Ci0JLyogYm9vdGxvYWRlciAoVS1Cb290LCBldGMpIGluIGZpcnN0IHNlY3RvciAqLwotCXsKLQkgICAgICAubmFtZQkJPSAiYm9vdGxvYWRlciIsCi0JICAgICAgLm9mZnNldAkJPSAwLAotCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCi0JICAgICAgLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLCAvKiBmb3JjZSByZWFkLW9ubHkgKi8KLQl9LAotCS8qIGJvb3Rsb2FkZXIgcGFyYW1zIGluIHRoZSBuZXh0IHNlY3RvciAqLwotCXsKLQkgICAgICAubmFtZQkJPSAicGFyYW1zIiwKLQkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAotCSAgICAgIC5tYXNrX2ZsYWdzCT0gMCwKLQl9LAotCS8qIGtlcm5lbCAqLwotCXsKLQkgICAgICAubmFtZQkJPSAia2VybmVsIiwKLQkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkgICAgICAuc2l6ZQkJPSBTWl8yTSwKLQkgICAgICAubWFza19mbGFncwk9IDAKLQl9LAotCS8qIHJlc3Qgb2YgZmxhc2gxIGlzIGEgZmlsZSBzeXN0ZW0gKi8KLQl7Ci0JICAgICAgLm5hbWUJCT0gInJvb3RmcyIsCi0JICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCi0JICAgICAgLnNpemUJCT0gU1pfMTZNIC0gU1pfMk0gLSAyICogU1pfMTI4SywKLQkgICAgICAubWFza19mbGFncwk9IDAKLQl9LAotCS8qIGZpbGUgc3lzdGVtICovCi0JewotCSAgICAgIC5uYW1lCQk9ICJmaWxlc3lzdGVtIiwKLQkgICAgICAub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkgICAgICAuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAotCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBpbm5vdmF0b3JfZmxhc2hfZGF0YSA9IHsKLQkubWFwX25hbWUJPSAiY2ZpX3Byb2JlIiwKLQkud2lkdGgJCT0gMiwKLQkucGFydHMJCT0gaW5ub3ZhdG9yX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShpbm5vdmF0b3JfcGFydGl0aW9ucyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGlubm92YXRvcl9mbGFzaF9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gT01BUF9DUzBfUEhZUywKLQkuZW5kCQk9IE9NQVBfQ1MwX1BIWVMgKyBTWl8zMk0gLSAxLAotCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlubm92YXRvcl9mbGFzaF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm9tYXBmbGFzaCIsCi0JLmlkCQk9IDAsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmlubm92YXRvcl9mbGFzaF9kYXRhLAotCX0sCi0JLm51bV9yZXNvdXJjZXMJPSAxLAotCS5yZXNvdXJjZQk9ICZpbm5vdmF0b3JfZmxhc2hfcmVzb3VyY2UsCi19OwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLQotLyogT25seSBGUEdBIG5lZWRzIHRvIGJlIG1hcHBlZCBoZXJlLiBBbGwgb3RoZXJzIGFyZSBkb25lIHdpdGggaW9yZW1hcCAqLwotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBpbm5vdmF0b3IxNTEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewoteyBPTUFQMTUxMF9GUEdBX0JBU0UsIE9NQVAxNTEwX0ZQR0FfU1RBUlQsIE9NQVAxNTEwX0ZQR0FfU0laRSwKLQlNVF9ERVZJQ0UgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW5ub3ZhdG9yMTUxMF9zbWM5MXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBPTUFQMTUxMF9GUEdBX0VUSFJfU1RBUlQsCS8qIFBoeXNpY2FsICovCi0JCS5lbmQJPSBPTUFQMTUxMF9GUEdBX0VUSFJfU1RBUlQgKyAweGYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBPTUFQMTUxMF9JTlRfRVRIRVIsCi0JCS5lbmQJPSBPTUFQMTUxMF9JTlRfRVRIRVIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbm5vdmF0b3IxNTEwX3NtYzkxeF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNtYzkxeCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGlubm92YXRvcjE1MTBfc21jOTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gaW5ub3ZhdG9yMTUxMF9zbWM5MXhfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlubm92YXRvcjE1MTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJmlubm92YXRvcl9mbGFzaF9kZXZpY2UsCi0JJmlubm92YXRvcjE1MTBfc21jOTF4X2RldmljZSwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMTUxMCAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbm5vdmF0b3IxNjEwX3NtYzkxeF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IElOTk9WQVRPUjE2MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCi0JCS5lbmQJPSBJTk5PVkFUT1IxNjEwX0VUSFJfU1RBUlQgKyAweGYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBPTUFQX0dQSU9fSVJRKDApLAotCQkuZW5kCT0gT01BUF9HUElPX0lSUSgwKSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGlubm92YXRvcjE2MTBfc21jOTF4X2RldmljZSA9IHsKLQkubmFtZQkJPSAic21jOTF4IiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTYxMF9zbWM5MXhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBpbm5vdmF0b3IxNjEwX3NtYzkxeF9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW5ub3ZhdG9yMTYxMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmaW5ub3ZhdG9yX2ZsYXNoX2RldmljZSwKLQkmaW5ub3ZhdG9yMTYxMF9zbWM5MXhfZGV2aWNlLAotfTsKLQotI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNlhYICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdF9zbWM5MXgodm9pZCkKLXsKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJZnBnYV93cml0ZShmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SU1QpICYgfjEsCi0JCQkgICBPTUFQMTUxMF9GUEdBX1JTVCk7Ci0JCXVkZWxheSg3NTApOwotCX0gZWxzZSB7Ci0JCWlmICgob21hcF9yZXF1ZXN0X2dwaW8oMCkpIDwgMCkgewotCQkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKLQl9Ci19Ci0KLXZvaWQgaW5ub3ZhdG9yX2luaXRfaXJxKHZvaWQpCi17Ci0Jb21hcF9pbml0X2lycSgpOwotCW9tYXBfZ3Bpb19pbml0KCk7Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJb21hcDE1MTBfZnBnYV9pbml0X2lycSgpOwotCX0KLSNlbmRpZgotCWlubm92YXRvcl9pbml0X3NtYzkxeCgpOwotfQotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLXN0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGlubm92YXRvcjE1MTBfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS8qIGZvciBidW5kbGVkIG5vbi1zdGFuZGFyZCBob3N0IGFuZCBwZXJpcGhlcmFsIGNhYmxlcyAqLwotCS5obWNfbW9kZQk9IDQsCi0KLQkucmVnaXN0ZXJfaG9zdAk9IDEsCi0JLnBpbnNbMV0JPSA2LAotCS5waW5zWzJdCT0gNiwJCS8qIENvbmZsaWN0cyB3aXRoIFVBUlQyICovCi0KLQkucmVnaXN0ZXJfZGV2CT0gMSwKLQkucGluc1swXQk9IDIsCi19OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaDJfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS8qIHVzYjEgaGFzIGEgTWluaS1BQiBwb3J0IGFuZCBleHRlcm5hbCBpc3AxMzAxIHRyYW5zY2VpdmVyICovCi0JLm90ZwkJPSAyLAotCi0jaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAotCS5obWNfbW9kZQk9IDE5LAkvLyAwOmhvc3Qob2ZmKSAxOmRldnxvdGcgMjpkaXNhYmxlZAotCS8vIC5obWNfbW9kZQk9IDIxLAkvLyAwOmhvc3Qob2ZmKSAxOmRldihsb29wYmFjaykgMjpob3N0KGxvb3BiYWNrKQotI2VsaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQotCS8qIE5PTlNUQU5EQVJEIENBQkxFIE5FRURFRCAoQi10by1NaW5pLUIpICovCi0JLmhtY19tb2RlCT0gMjAsCS8vIDE6ZGV2fG90ZyhvZmYpIDE6aG9zdCAyOmRpc2FibGVkCi0jZW5kaWYKLQotCS5waW5zWzFdCT0gMywKLX07Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaW5ub3ZhdG9yX2NvbmZpZ1tdID0gewotCXsgT01BUF9UQUdfVVNCLCAgICAgICAgIE5VTEwgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfaW5pdCh2b2lkKQotewotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGlubm92YXRvcjE1MTBfZGV2aWNlcywgQVJSQVlfU0laRShpbm5vdmF0b3IxNTEwX2RldmljZXMpKTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJcGxhdGZvcm1fYWRkX2RldmljZXMoaW5ub3ZhdG9yMTYxMF9kZXZpY2VzLCBBUlJBWV9TSVpFKGlubm92YXRvcjE2MTBfZGV2aWNlcykpOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCi0JCWlubm92YXRvcl9jb25maWdbMF0uZGF0YSA9ICZpbm5vdmF0b3IxNTEwX3VzYl9jb25maWc7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAotCWlmIChjcHVfaXNfb21hcDE2MTAoKSkKLQkJaW5ub3ZhdG9yX2NvbmZpZ1swXS5kYXRhID0gJmgyX3VzYl9jb25maWc7Ci0jZW5kaWYKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IGlubm92YXRvcl9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoaW5ub3ZhdG9yX2NvbmZpZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbm5vdmF0b3JfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcF9tYXBfaW8oKTsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWlvdGFibGVfaW5pdChpbm5vdmF0b3IxNTEwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTUxMF9pb19kZXNjKSk7Ci0JCXVkZWxheSgxMCk7CS8qIERlbGF5IG5lZWRlZCBmb3IgRlBHQSAqLwotCi0JCS8qIER1bXAgdGhlIElubm92YXRvciBGUEdBIHJldiBlYXJseSAtIHVzZWZ1bCBpbmZvIGZvciBzdXBwb3J0LiAqLwotCQlwcmludGsoIklubm92YXRvciBGUEdBIFJldiAlZC4lZCBCb2FyZCBSZXYgJWRcbiIsCi0JCSAgICAgICBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfSElHSCksCi0JCSAgICAgICBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9SRVZfTE9XKSwKLQkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX0JPQVJEX1JFVikpOwotCX0KLSNlbmRpZgotCW9tYXBfc2VyaWFsX2luaXQoaW5ub3ZhdG9yX3NlcmlhbF9wb3J0cyk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoT01BUF9JTk5PVkFUT1IsICJUSS1Jbm5vdmF0b3IiKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyhpbm5vdmF0b3JfbWFwX2lvKQotCUlOSVRJUlEoaW5ub3ZhdG9yX2luaXRfaXJxKQotCUlOSVRfTUFDSElORShpbm5vdmF0b3JfaW5pdCkKLQkudGltZXIJCT0gJm9tYXBfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW5ldHN0YXIuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1uZXRzdGFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWNiZDIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW5ldHN0YXIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogTW9kaWZpZWQgZnJvbSBib2FyZC1nZW5lcmljLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgMk4gVGVsZWtvbXVuaWthY2UsIExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KLSAqCi0gKiBDb2RlIGZvciBOZXRzdGFyIE9NQVAgYm9hcmQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLWV4dGVybiB2b2lkIF9faW5pdCBvbWFwX2luaXRfdGltZSh2b2lkKTsKLWV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbmV0c3Rhcl9zbWM5MXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBPTUFQX0NTMV9QSFlTICsgMHgzMDAsCi0JCS5lbmQJPSBPTUFQX0NTMV9QSFlTICsgMHgzMDAgKyAxNiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IE9NQVBfR1BJT19JUlEoOCksCi0JCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDgpLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmV0c3Rhcl9zbWM5MXhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzbWM5MXgiLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShuZXRzdGFyX3NtYzkxeF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IG5ldHN0YXJfc21jOTF4X3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuZXRzdGFyX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZuZXRzdGFyX3NtYzkxeF9kZXZpY2UsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbmV0c3Rhcl9pbml0X2lycSh2b2lkKQotewotCW9tYXBfaW5pdF9pcnEoKTsKLQlvbWFwX2dwaW9faW5pdCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbmV0c3Rhcl9pbml0KHZvaWQpCi17Ci0JLyogZ3JlZW4gTEVEICovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oNCk7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNCwgMCk7Ci0JLyogc21jOTF4IHJlc2V0ICovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oNyk7Ci0Jb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oNywgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDcsIDEpOwotCXVkZWxheSgyKTsJLyogd2FpdCBhdCBsZWFzdCAxMDBucyAqLwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg3LCAwKTsKLQltZGVsYXkoNTApOwkvKiA1MG1zIHVudGlsIFBIWSByZWFkeSAqLwotCS8qIHNtYzkxeCBpbnRlcnJ1cHQgcGluICovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oOCk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoOCwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKLQotCW9tYXBfcmVxdWVzdF9ncGlvKDEyKTsKLQlvbWFwX3JlcXVlc3RfZ3BpbygxMyk7Ci0Jb21hcF9yZXF1ZXN0X2dwaW8oMTQpOwotCW9tYXBfcmVxdWVzdF9ncGlvKDE1KTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxMiwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTMsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE0LCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKLQlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxNSwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Ci0KLQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhuZXRzdGFyX2RldmljZXMsIEFSUkFZX1NJWkUobmV0c3Rhcl9kZXZpY2VzKSk7Ci0KLQkvKiBTd2l0Y2ggb24gZ3JlZW4gTEVEICovCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDQsIDApOwotCS8qIFN3aXRjaCBvZmYgcmVkIExFRCAqLwotCW9tYXBfd3JpdGViKDB4MDAsIE9NQVBfTFBHMV9QTVIpOwkvKiBEaXNhYmxlIGNsb2NrICovCi0Jb21hcF93cml0ZWIoMHg4MCwgT01BUF9MUEcxX0xDUik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBvbWFwX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBuZXRzdGFyX21hcF9pbyh2b2lkKQotewotCW9tYXBfbWFwX2lvKCk7Ci0Jb21hcF9zZXJpYWxfaW5pdChvbWFwX3NlcmlhbF9wb3J0cyk7Ci19Ci0KLSNkZWZpbmUgTUFDSElORV9QQU5JQ0VECQkxCi0jZGVmaW5lIE1BQ0hJTkVfUkVCT09USU5HCTIKLSNkZWZpbmUgTUFDSElORV9SRUJPT1QJCTQKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1hY2hpbmVfc3RhdGU7Ci0KLXN0YXRpYyBpbnQgcGFuaWNfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAotCSB2b2lkICpwdHIpCi17Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoTUFDSElORV9QQU5JQ0VELCAmbWFjaGluZV9zdGF0ZSkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCS8qIFN3aXRjaCBvZmYgZ3JlZW4gTEVEICovCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDQsIDEpOwotCS8qIEZsYXNoIHJlZCBMRUQgKi8KLQlvbWFwX3dyaXRlYigweDc4LCBPTUFQX0xQRzFfTENSKTsKLQlvbWFwX3dyaXRlYigweDAxLCBPTUFQX0xQRzFfUE1SKTsJLyogRW5hYmxlIGNsb2NrICovCi0KLQlyZXR1cm4gTk9USUZZX0RPTkU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuaWNfYmxvY2sgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBwYW5pY19ldmVudCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5ldHN0YXJfbGF0ZV9pbml0KHZvaWQpCi17Ci0JLyogVE9ETzogU2V0dXAgZnJvbnQgcGFuZWwgc3dpdGNoIGhlcmUgKi8KLQotCS8qIFNldHVwIHBhbmljIG5vdGlmaWVyICovCi0Jbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwYW5pY19ibG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwobmV0c3Rhcl9sYXRlX2luaXQpOwotCi1NQUNISU5FX1NUQVJUKE5FVFNUQVIsICJOZXRTdGFyIE9NQVA1OTEwIikKLQlNQUlOVEFJTkVSKCJMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+IikKLQlCT09UX01FTSgweDEwMDAwMDAwLCAweGZmZjAwMDAwLCAweGZlZjAwMDAwKQotCUJPT1RfUEFSQU1TKDB4MTAwMDAxMDApCi0JTUFQSU8obmV0c3Rhcl9tYXBfaW8pCi0JSU5JVElSUShuZXRzdGFyX2luaXRfaXJxKQotCUlOSVRfTUFDSElORShuZXRzdGFyX2luaXQpCi0JLnRpbWVyID0gJm9tYXBfdGltZXIsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTUxZmM4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1vc2suYworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLW9zay5jCi0gKgotICogQm9hcmQgc3BlY2lmaWMgaW5pdCBmb3IgT01BUDU5MTIgT1NLCi0gKgotICogV3JpdHRlbiBieSBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KLSAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb3NrNTkxMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLXsgT01BUF9PU0tfTk9SX0ZMQVNIX0JBU0UsIE9NQVBfT1NLX05PUl9GTEFTSF9TVEFSVCwgT01BUF9PU0tfTk9SX0ZMQVNIX1NJWkUsCi0JTVRfREVWSUNFIH0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgb3NrX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMCwgMH07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3NrNTkxMl9zbWM5MXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBPTUFQX09TS19FVEhSX1NUQVJULAkJLyogUGh5c2ljYWwgKi8KLQkJLmVuZAk9IE9NQVBfT1NLX0VUSFJfU1RBUlQgKyAweGYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJPSBPTUFQX0dQSU9fSVJRKDApLAotCQkuZW5kCT0gT01BUF9HUElPX0lSUSgwKSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfc21jOTF4X2RldmljZSA9IHsKLQkubmFtZQkJPSAic21jOTF4IiwKLQkuaWQJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG9zazU5MTJfc21jOTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gb3NrNTkxMl9zbWM5MXhfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvc2s1OTEyX2NmX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSg2MiksCi0JCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDYyKSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfY2ZfZGV2aWNlID0gewotCS5uYW1lCQk9ICJvbWFwX2NmIiwKLQkuaWQJCT0gLTEsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAodm9pZCAqKSAyIC8qIENTMiAqLywKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvc2s1OTEyX2NmX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gb3NrNTkxMl9jZl9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3NrNTkxMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmb3NrNTkxMl9zbWM5MXhfZGV2aWNlLAotCSZvc2s1OTEyX2NmX2RldmljZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvc2tfaW5pdF9zbWM5MXgodm9pZCkKLXsKLQlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDApKSA8IDApIHsKLQkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7Ci0JCXJldHVybjsKLQl9Ci0Jb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKLQotCS8qIENoZWNrIEVNSUZTIHdhaXQgc3RhdGVzIHRvIGZpeCBlcnJvcnMgd2l0aCBTTUNfR0VUX1BLVF9IRFIgKi8KLQlFTUlGU19DQ1MoMSkgfD0gMHgyOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfY2Yodm9pZCkKLXsKLQlvbWFwX2NmZ19yZWcoTTdfMTYxMF9HUElPNjIpOwotCWlmICgob21hcF9yZXF1ZXN0X2dwaW8oNjIpKSA8IDApIHsKLQkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gNjIgZm9yIENGIGlycVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JLyogaXQncyByZWFsbHkgYWN0aXZlLWxvdyAqLwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDYyLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKLX0KLQotdm9pZCBvc2tfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwX2luaXRfaXJxKCk7Ci0Jb21hcF9ncGlvX2luaXQoKTsKLQlvc2tfaW5pdF9zbWM5MXgoKTsKLQlvc2tfaW5pdF9jZigpOwotfQotCi1zdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBvc2tfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0gewotCS8qIGhhcyB1c2IgaG9zdCBjb25uZWN0b3IgKEEpIC4uLiBmb3IgZGV2ZWxvcG1lbnQgaXQgY2FuIGFsc28KLQkgKiBiZSB1c2VkLCB3aXRoIGEgTk9OU1RBTkRBUkQgZ2VuZGVyLWJlbmRpbmcgY2FibGUvZG9uZ2xlLCBhcwotCSAqIGEgcGVyaXBoZXJhbC4KLQkgKi8KLSNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCi0JLnJlZ2lzdGVyX2Rldgk9IDEsCi0JLmhtY19tb2RlCT0gMCwKLSNlbHNlCi0JLnJlZ2lzdGVyX2hvc3QJPSAxLAotCS5obWNfbW9kZQk9IDE2LAotCS5yd2MJCT0gMSwKLSNlbmRpZgotCS5waW5zWzBdCT0gMiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9za19jb25maWdbXSA9IHsKLQl7IE9NQVBfVEFHX1VTQiwgICAgICAgICAgICZvc2tfdXNiX2NvbmZpZyB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9za19pbml0KHZvaWQpCi17Ci0JcGxhdGZvcm1fYWRkX2RldmljZXMob3NrNTkxMl9kZXZpY2VzLCBBUlJBWV9TSVpFKG9zazU5MTJfZGV2aWNlcykpOwotCW9tYXBfYm9hcmRfY29uZmlnID0gb3NrX2NvbmZpZzsKLQlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShvc2tfY29uZmlnKTsKLQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgfD0gKDMgPDwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcF9tYXBfaW8oKTsKLQlpb3RhYmxlX2luaXQob3NrNTkxMl9pb19kZXNjLCBBUlJBWV9TSVpFKG9zazU5MTJfaW9fZGVzYykpOwotCW9tYXBfc2VyaWFsX2luaXQob3NrX3NlcmlhbF9wb3J0cyk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoT01BUF9PU0ssICJUSS1PU0siKQotCU1BSU5UQUlORVIoIkRpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPiIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCU1BUElPKG9za19tYXBfaW8pCi0JSU5JVElSUShvc2tfaW5pdF9pcnEpCi0JSU5JVF9NQUNISU5FKG9za19pbml0KQotCS50aW1lcgkJPSAmb21hcF90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtcGVyc2V1czIuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDUxNWFlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9ib2FyZC1wZXJzZXVzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtcGVyc2V1czIuYwotICoKLSAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCi0gKgotICogT3JpZ2luYWwgT01BUDczMCBzdXBwb3J0IGJ5IEplYW4gUGloZXQgPGotcGloZXRAdGkuY29tPgotICogVXBkYXRlZCBmb3IgMi42IGJ5IEtldmluIEhpbG1hbiA8a2poQGhpbG1hbi5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAk9IEgyUDJfREJHX0ZQR0FfRVRIUl9TVEFSVCwJLyogUGh5c2ljYWwgKi8KLQkJLmVuZAk9IEgyUDJfREJHX0ZQR0FfRVRIUl9TVEFSVCArIDB4ZiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IElOVF83MzBfTVBVX0VYVF9OSVJRLAotCQkuZW5kCT0gMCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBwMl9zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDEsIDB9OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcDJfcGFydGl0aW9uc1tdID0gewotCS8qIGJvb3Rsb2FkZXIgKFUtQm9vdCwgZXRjKSBpbiBmaXJzdCBzZWN0b3IgKi8KLQl7Ci0JICAgICAgLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAotCSAgICAgIC5vZmZzZXQJCT0gMCwKLQkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAotCSAgICAgIC5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwgLyogZm9yY2UgcmVhZC1vbmx5ICovCi0JfSwKLQkvKiBib290bG9hZGVyIHBhcmFtcyBpbiB0aGUgbmV4dCBzZWN0b3IgKi8KLQl7Ci0JICAgICAgLm5hbWUJCT0gInBhcmFtcyIsCi0JICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCi0JICAgICAgLnNpemUJCT0gU1pfMTI4SywKLQkgICAgICAubWFza19mbGFncwk9IDAsCi0JfSwKLQkvKiBrZXJuZWwgKi8KLQl7Ci0JICAgICAgLm5hbWUJCT0gImtlcm5lbCIsCi0JICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCi0JICAgICAgLnNpemUJCT0gU1pfMk0sCi0JICAgICAgLm1hc2tfZmxhZ3MJPSAwCi0JfSwKLQkvKiByZXN0IG9mIGZsYXNoIGlzIGEgZmlsZSBzeXN0ZW0gKi8KLQl7Ci0JICAgICAgLm5hbWUJCT0gInJvb3RmcyIsCi0JICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCi0JICAgICAgLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKLQkgICAgICAubWFza19mbGFncwk9IDAKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIHAyX2ZsYXNoX2RhdGEgPSB7Ci0JLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCi0JLndpZHRoCQk9IDIsCi0JLnBhcnRzCQk9IHAyX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShwMl9wYXJ0aXRpb25zKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcDJfZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IE9NQVBfRkxBU0hfMF9TVEFSVCwKLQkuZW5kCQk9IE9NQVBfRkxBU0hfMF9TVEFSVCArIE9NQVBfRkxBU0hfMF9TSVpFIC0gMSwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwMl9mbGFzaF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm9tYXBmbGFzaCIsCi0JLmlkCQk9IDAsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJnAyX2ZsYXNoX2RhdGEsCi0JfSwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJnAyX2ZsYXNoX3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKLQkubmFtZQkJPSAic21jOTF4IiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gc21jOTF4X3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmcDJfZmxhc2hfZGV2aWNlLAotCSZzbWM5MXhfZGV2aWNlLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGVyc2V1czJfaW5pdCh2b2lkKQotewotCSh2b2lkKSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhkZXZpY2VzLCBBUlJBWV9TSVpFKGRldmljZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHBlcnNldXMyX2luaXRfc21jOTF4KHZvaWQpCi17Ci0JZnBnYV93cml0ZSgxLCBIMlAyX0RCR19GUEdBX0xBTl9SRVNFVCk7Ci0JbWRlbGF5KDUwKTsKLQlmcGdhX3dyaXRlKGZwZ2FfcmVhZChIMlAyX0RCR19GUEdBX0xBTl9SRVNFVCkgJiB+MSwKLQkJICAgSDJQMl9EQkdfRlBHQV9MQU5fUkVTRVQpOwotCW1kZWxheSg1MCk7Ci19Ci0KLXZvaWQgb21hcF9wZXJzZXVzMl9pbml0X2lycSh2b2lkKQotewotCW9tYXBfaW5pdF9pcnEoKTsKLQlvbWFwX2dwaW9faW5pdCgpOwotCXBlcnNldXMyX2luaXRfc21jOTF4KCk7Ci19Ci0KLS8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcF9wZXJzZXVzMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7SDJQMl9EQkdfRlBHQV9CQVNFLCBIMlAyX0RCR19GUEdBX1NUQVJULCBIMlAyX0RCR19GUEdBX1NJWkUsCi0JIE1UX0RFVklDRX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9wZXJzZXVzMl9tYXBfaW8odm9pZCkKLXsKLQlvbWFwX21hcF9pbygpOwotCWlvdGFibGVfaW5pdChvbWFwX3BlcnNldXMyX2lvX2Rlc2MsCi0JCSAgICAgQVJSQVlfU0laRShvbWFwX3BlcnNldXMyX2lvX2Rlc2MpKTsKLQotCS8qIEVhcmx5LCBib2FyZC1kZXBlbmRlbnQgaW5pdCAqLwotCi0JLyoKLQkgKiBIb2xkIEdTTSBSZXNldCB1bnRpbCBuZWVkZWQKLQkgKi8KLQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KE9NQVA3MzBfRFNQX01fQ1RMKSAmIH4xLCBPTUFQNzMwX0RTUF9NX0NUTCk7Ci0KLQkvKgotCSAqIFVBUlRzIC0+IGRvbmUgYXV0b21hZ2ljYWxseSBieSA4MjUwIGRyaXZlcgotCSAqLwotCi0JLyoKLQkgKiBDU3ggdGltaW5ncywgR1BJTyBNdXggLi4uIHNldHVwCi0JICovCi0KLQkvKiBGbGFzaDogQ1MwIHRpbWluZ3Mgc2V0dXAgKi8KLQlvbWFwX3dyaXRlbCgweDAwMDBmZmYzLCBPTUFQNzMwX0ZMQVNIX0NGR18wKTsKLQlvbWFwX3dyaXRlbCgweDAwMDAwMDg4LCBPTUFQNzMwX0ZMQVNIX0FDRkdfMCk7Ci0KLQkvKgotCSAqIEV0aGVybmV0IHN1cHBvcnQgdHJvdWdoIHRoZSBkZWJ1ZyBib2FyZAotCSAqIENTMSB0aW1pbmdzIHNldHVwCi0JICovCi0Jb21hcF93cml0ZWwoMHgwMDAwZmZmMywgT01BUDczMF9GTEFTSF9DRkdfMSk7Ci0Jb21hcF93cml0ZWwoMHgwMDAwMDAwMCwgT01BUDczMF9GTEFTSF9BQ0ZHXzEpOwotCi0JLyoKLQkgKiBDb25maWd1cmUgTVBVX0VYVF9OSVJRIElPIGluIElPX0NPTkY5IHJlZ2lzdGVyLAotCSAqIEl0IGlzIHVzZWQgYXMgdGhlIEV0aGVybmV0IGNvbnRyb2xsZXIgaW50ZXJydXB0Ci0JICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChPTUFQNzMwX0lPX0NPTkZfOSkgJiAweDFGRkZGRkZGLCBPTUFQNzMwX0lPX0NPTkZfOSk7Ci0Jb21hcF9zZXJpYWxfaW5pdChwMl9zZXJpYWxfcG9ydHMpOwotfQotCi1NQUNISU5FX1NUQVJUKE9NQVBfUEVSU0VVUzIsICJPTUFQNzMwIFBlcnNldXMyIikKLQlNQUlOVEFJTkVSKCJLZXZpbiBIaWxtYW4gPGtqaEBoaWxtYW4ub3JnPiIpCi0JQk9PVF9NRU0oMHgxMDAwMDAwMCwgMHhmZmYwMDAwMCwgMHhmZWYwMDAwMCkKLQlCT09UX1BBUkFNUygweDEwMDAwMTAwKQotCU1BUElPKG9tYXBfcGVyc2V1czJfbWFwX2lvKQotCUlOSVRJUlEob21hcF9wZXJzZXVzMl9pbml0X2lycSkKLQlJTklUX01BQ0hJTkUob21hcF9wZXJzZXVzMl9pbml0KQotCS50aW1lcgkJPSAmb21hcF90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYTViZmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2JvYXJkLXZvaWNlYmx1ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvYm9hcmQtdm9pY2VibHVlLmMKLSAqCi0gKiBNb2RpZmllZCBmcm9tIGJvYXJkLWdlbmVyaWMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCAyTiBUZWxla29tdW5pa2FjZSwgTGFkaXNsYXYgTWljaGwgPG1pY2hsQDJuLmN6PgotICoKLSAqIENvZGUgZm9yIE9NQVA1OTEwIGJhc2VkIFZvaWNlQmx1ZSBib2FyZCAoVm9JUCB0byBHU00gZ2F0ZXdheSkuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLQotZXh0ZXJuIHZvaWQgb21hcF9pbml0X3RpbWUodm9pZCk7Ci1leHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHZvaWNlYmx1ZV9wb3J0c1tdID0gewotCXsKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZykoT01BUF9DUzFfUEhZUyArIDB4NDAwMDApLAotCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTIpLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCwKLQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMSwKLQkJLnVhcnRjbGsJPSAzNjg2NDAwLAotCX0sCi0JewotCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKShPTUFQX0NTMV9QSFlTICsgMHg1MDAwMCksCi0JCS5pcnEJCT0gT01BUF9HUElPX0lSUSgxMyksCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAotCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkucmVnc2hpZnQJPSAxLAotCQkudWFydGNsawk9IDM2ODY0MDAsCi0JfSwKLQl7Ci0JCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpKE9NQVBfQ1MxX1BIWVMgKyAweDYwMDAwKSwKLQkJLmlycQkJPSBPTUFQX0dQSU9fSVJRKDE0KSwKLQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDEsCi0JCS51YXJ0Y2xrCT0gMzY4NjQwMCwKLQl9LAotCXsKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZykoT01BUF9DUzFfUEhZUyArIDB4NzAwMDApLAotCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTUpLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCwKLQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJLnJlZ3NoaWZ0CT0gMSwKLQkJLnVhcnRjbGsJPSAzNjg2NDAwLAotCX0sCi0JeyB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKLQkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAotCS5pZAkJCT0gMSwKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gdm9pY2VibHVlX3BvcnRzLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBleHRfdWFydF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7Ci19Ci1hcmNoX2luaXRjYWxsKGV4dF91YXJ0X2luaXQpOwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJPSBPTUFQX0NTMl9QSFlTICsgMHgzMDAsCi0JCS5lbmQJPSBPTUFQX0NTMl9QSFlTICsgMHgzMDAgKyAxNiwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAk9IE9NQVBfR1BJT19JUlEoOCksCi0JCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDgpLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdm9pY2VibHVlX3NtYzkxeF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInNtYzkxeCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSB2b2ljZWJsdWVfc21jOTF4X3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp2b2ljZWJsdWVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJnZvaWNlYmx1ZV9zbWM5MXhfZGV2aWNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgdm9pY2VibHVlX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKLQkuaG1jX21vZGUJPSAzLAotCS5yZWdpc3Rlcl9ob3N0CT0gMSwKLQkucmVnaXN0ZXJfZGV2ICAgPSAxLAotCS5waW5zWzBdCT0gMiwKLQkucGluc1sxXQk9IDYsCi0JLnBpbnNbMl0JPSA2LAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgdm9pY2VibHVlX2NvbmZpZ1tdID0gewotCXsgT01BUF9UQUdfVVNCLCAmdm9pY2VibHVlX3VzYl9jb25maWcgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfaW5pdF9pcnEodm9pZCkKLXsKLQlvbWFwX2luaXRfaXJxKCk7Ci0Jb21hcF9ncGlvX2luaXQoKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0KHZvaWQpCi17Ci0JLyogVGhlcmUgaXMgYSBnb29kIGNoYW5jZSBib2FyZCBpcyBnb2luZyB1cCwgc28gZW5hYmxlIFBvd2VyIExFRAotCSAqIChpdCBpcyBjb25uZWN0ZWQgdGhyb3VnaCBpbnZlcnRvcikgKi8KLQlvbWFwX3dyaXRlYigweDAwLCBPTUFQX0xQRzFfTENSKTsKLQkvKiBXYXRjaGRvZyAqLwotCW9tYXBfcmVxdWVzdF9ncGlvKDApOwotCS8qIHNtYzkxeCByZXNldCAqLwotCW9tYXBfcmVxdWVzdF9ncGlvKDcpOwotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDcsIDApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg3LCAxKTsKLQl1ZGVsYXkoMik7CS8qIHdhaXQgYXQgbGVhc3QgMTAwbnMgKi8KLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNywgMCk7Ci0JbWRlbGF5KDUwKTsJLyogNTBtcyB1bnRpbCBQSFkgcmVhZHkgKi8KLQkvKiBzbWM5MXggaW50ZXJydXB0IHBpbiAqLwotCW9tYXBfcmVxdWVzdF9ncGlvKDgpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDgsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7Ci0JLyogMTZDNTU0IHJlc2V0Ki8KLQlvbWFwX3JlcXVlc3RfZ3Bpbyg2KTsKLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig2LCAwKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNiwgMCk7Ci0JLyogMTZDNTU0IGludGVycnVwdCBwaW5zICovCi0Jb21hcF9yZXF1ZXN0X2dwaW8oMTIpOwotCW9tYXBfcmVxdWVzdF9ncGlvKDEzKTsKLQlvbWFwX3JlcXVlc3RfZ3BpbygxNCk7Ci0Jb21hcF9yZXF1ZXN0X2dwaW8oMTUpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEyLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEzLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE0LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE1LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOwotCi0JcGxhdGZvcm1fYWRkX2RldmljZXModm9pY2VibHVlX2RldmljZXMsIEFSUkFZX1NJWkUodm9pY2VibHVlX2RldmljZXMpKTsKLQlvbWFwX2JvYXJkX2NvbmZpZyA9IHZvaWNlYmx1ZV9jb25maWc7Ci0Jb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUodm9pY2VibHVlX2NvbmZpZyk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBvbWFwX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfbWFwX2lvKHZvaWQpCi17Ci0Jb21hcF9tYXBfaW8oKTsKLQlvbWFwX3NlcmlhbF9pbml0KG9tYXBfc2VyaWFsX3BvcnRzKTsKLX0KLQotI2RlZmluZSBNQUNISU5FX1BBTklDRUQJCTEKLSNkZWZpbmUgTUFDSElORV9SRUJPT1RJTkcJMgotI2RlZmluZSBNQUNISU5FX1JFQk9PVAkJNAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFjaGluZV9zdGF0ZTsKLQotc3RhdGljIGludCBwYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCi0JIHZvaWQgKnB0cikKLXsKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChNQUNISU5FX1BBTklDRUQsICZtYWNoaW5lX3N0YXRlKSkKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JLyogRmxhc2ggUG93ZXIgTEVECi0JICogKFRPRE86IEVuYWJsZSBjbG9jayByaWdodCB3YXkgKGVuYWJsZWQgaW4gYm9vdGxvYWRlciBhbHJlYWR5KSkgKi8KLQlvbWFwX3dyaXRlYigweDc4LCBPTUFQX0xQRzFfTENSKTsKLQotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ibG9jayA9IHsKLQkubm90aWZpZXJfY2FsbAk9IHBhbmljX2V2ZW50LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc2V0dXBfbm90aWZpZXIodm9pZCkKLXsKLQkvKiBTZXR1cCBwYW5pYyBub3RpZmllciAqLwotCW5vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmcGFuaWNfYmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKHNldHVwX25vdGlmaWVyKTsKLQotc3RhdGljIGludCB3ZHRfZ3Bpb19zdGF0ZTsKLQotdm9pZCB2b2ljZWJsdWVfd2R0X2VuYWJsZSh2b2lkKQotewotCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDAsIDApOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAwKTsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMSk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDApOwotCXdkdF9ncGlvX3N0YXRlID0gMDsKLX0KLQotdm9pZCB2b2ljZWJsdWVfd2R0X2Rpc2FibGUodm9pZCkKLXsKLQlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMCk7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDEpOwotCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAwKTsKLQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigwLCAxKTsKLX0KLQotdm9pZCB2b2ljZWJsdWVfd2R0X3Bpbmcodm9pZCkKLXsKLQlpZiAodGVzdF9iaXQoTUFDSElORV9SRUJPT1QsICZtYWNoaW5lX3N0YXRlKSkKLQkJcmV0dXJuOwotCi0Jd2R0X2dwaW9fc3RhdGUgPSAhd2R0X2dwaW9fc3RhdGU7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIHdkdF9ncGlvX3N0YXRlKTsKLX0KLQotdm9pZCB2b2ljZWJsdWVfcmVzZXQodm9pZCkKLXsKLQlzZXRfYml0KE1BQ0hJTkVfUkVCT09ULCAmbWFjaGluZV9zdGF0ZSk7Ci0Jdm9pY2VibHVlX3dkdF9lbmFibGUoKTsKLQl3aGlsZSAoMSkgOwotfQotCi1FWFBPUlRfU1lNQk9MKHZvaWNlYmx1ZV93ZHRfZW5hYmxlKTsKLUVYUE9SVF9TWU1CT0wodm9pY2VibHVlX3dkdF9kaXNhYmxlKTsKLUVYUE9SVF9TWU1CT0wodm9pY2VibHVlX3dkdF9waW5nKTsKLQotTUFDSElORV9TVEFSVChWT0lDRUJMVUUsICJWb2ljZUJsdWUgT01BUDU5MTAiKQotCU1BSU5UQUlORVIoIkxhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4iKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4ZmZmMDAwMDAsIDB4ZmVmMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlNQVBJTyh2b2ljZWJsdWVfbWFwX2lvKQotCUlOSVRJUlEodm9pY2VibHVlX2luaXRfaXJxKQotCUlOSVRfTUFDSElORSh2b2ljZWJsdWVfaW5pdCkKLQkudGltZXIgPSAmb21hcF90aW1lciwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTExODZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NiArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBjb3Jwb3JhdGlvbgotICogIFdyaXR0ZW4gYnkgVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotCi0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0KLSNpbmNsdWRlICJjbG9jay5oIgotCi1zdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tmd19sb2NrKTsKLXN0YXRpYyB2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrKTsKLS8qIEV4dGVybmFsIGNsb2NrIChNQ0xLICYgQkNMSykgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHNldF9leHRfY2xrX3JhdGUoc3RydWN0IGNsayAqICBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgbG9uZyByb3VuZF9leHRfY2xrX3JhdGUoc3RydWN0IGNsayAqICBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7Ci1zdGF0aWMgdm9pZCBpbml0X2V4dF9jbGsoc3RydWN0IGNsayAqICBjbGspOwotLyogTVBVIHZpcnR1YWwgY2xvY2sgZnVuY3Rpb25zICovCi1zdGF0aWMgaW50IHNlbGVjdF90YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwotc3RhdGljIGxvbmcgcm91bmRfdG9fdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKLXZvaWQgY2xrX3NldGRwbGwoX191MTYsIF9fdTE2KTsKLQotc3RydWN0IG1wdV9yYXRlIHJhdGVfdGFibGVbXSA9IHsKLQkvKiBNUFUgTUh6LCB4dGFsIE1IeiwgZHBsbDEgTUh6LCBDS0NUTCwgRFBMTF9DVEwKLQkgKiBhcm1kaXYsIGRzcGRpdiwgZHNwbW11LCB0Y2RpdiwgcGVyZGl2LCBsY2RkaXYKLQkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8yMTZNSFopCi0JeyAyMTYwMDAwMDAsIDEyMDAwMDAwLCAyMTYwMDAwMDAsIDB4MDUwZCwgMHgyOTEwIH0sIC8qIDEvMS8yLzIvMi84ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xOTVNSFopCi0JeyAxOTUwMDAwMDAsIDEzMDAwMDAwLCAxOTUwMDAwMDAsIDB4MDUwZSwgMHgyNzkwIH0sIC8qIDEvMS8yLzIvNC84ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xOTJNSFopCi0JeyAxOTIwMDAwMDAsIDE5MjAwMDAwLCAxOTIwMDAwMDAsIDB4MDUwZiwgMHgyNTEwIH0sIC8qIDEvMS8yLzIvOC84ICovCi0JeyAxOTIwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MDUwZiwgMHgyODEwIH0sIC8qIDEvMS8yLzIvOC84ICovCi0JeyAgOTYwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MDU1ZiwgMHgyODEwIH0sIC8qIDIvMi8yLzIvOC84ICovCi0JeyAgNDgwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MGNjZiwgMHgyODEwIH0sIC8qIDQvNC80LzQvOC84ICovCi0JeyAgMjQwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MGZmZiwgMHgyODEwIH0sIC8qIDgvOC84LzgvOC84ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xODJNSFopCi0JeyAxODIwMDAwMDAsIDEzMDAwMDAwLCAxODIwMDAwMDAsIDB4MDUwZSwgMHgyNzEwIH0sIC8qIDEvMS8yLzIvNC84ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xNjhNSFopCi0JeyAxNjgwMDAwMDAsIDEyMDAwMDAwLCAxNjgwMDAwMDAsIDB4MDEwZiwgMHgyNzEwIH0sIC8qIDEvMS8xLzIvOC84ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xNTBNSFopCi0JeyAxNTAwMDAwMDAsIDEyMDAwMDAwLCAxNTAwMDAwMDAsIDB4MTUwYSwgMHgyY2IwIH0sIC8qIDAvMC8xLzEvMi8yICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xMjBNSFopCi0JeyAxMjAwMDAwMDAsIDEyMDAwMDAwLCAxMjAwMDAwMDAsIDB4MDEwYSwgMHgyNTEwIH0sIC8qIDEvMS8xLzIvNC80ICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV85Nk1IWikKLQl7ICA5NjAwMDAwMCwgMTIwMDAwMDAsICA5NjAwMDAwMCwgMHgwMDA1LCAweDI0MTAgfSwgLyogMS8xLzEvMS8yLzIgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzYwTUhaKQotCXsgIDYwMDAwMDAwLCAxMjAwMDAwMCwgIDYwMDAwMDAwLCAweDAwMDUsIDB4MjI5MCB9LCAvKiAxLzEvMS8xLzIvMiAqLwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMzBNSFopCi0JeyAgMzAwMDAwMDAsIDEyMDAwMDAwLCAgNjAwMDAwMDAsIDB4MDU1NSwgMHgyMjkwIH0sIC8qIDIvMi8yLzIvMi8yICovCi0jZW5kaWYKLQl7IDAsIDAsIDAsIDAsIDAgfSwKLX07Ci0KLQotc3RhdGljIHZvaWQgY2tjdGxfcmVjYWxjKHN0cnVjdCBjbGsgKiAgY2xrKQotewotCWludCBkc29yOwotCi0JLyogQ2FsY3VsYXRlIGRpdmlzb3IgZW5jb2RlZCBhcyAyLWJpdCBleHBvbmVudCAqLwotCWRzb3IgPSAxIDw8ICgzICYgKG9tYXBfcmVhZHcoQVJNX0NLQ1RMKSA+PiBjbGstPnJhdGVfb2Zmc2V0KSk7Ci0JaWYgKHVubGlrZWx5KGNsay0+cmF0ZSA9PSBjbGstPnBhcmVudC0+cmF0ZSAvIGRzb3IpKQotCQlyZXR1cm47IC8qIE5vIGNoYW5nZSwgcXVpY2sgZXhpdCAqLwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcjsKLQotCWlmICh1bmxpa2VseShjbGstPmZsYWdzICYgUkFURV9QUk9QQUdBVEVTKSkKLQkJcHJvcGFnYXRlX3JhdGUoY2xrKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBmb2xsb3dwYXJlbnRfcmVjYWxjKHN0cnVjdCBjbGsgKiAgY2xrKQotewotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlOwotfQotCi0KLXN0YXRpYyB2b2lkIHdhdGNoZG9nX3JlY2FsYyhzdHJ1Y3QgY2xrICogIGNsaykKLXsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIDE0OwotfQotCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNrX3JlZiA9IHsKLQkubmFtZQkJPSAiY2tfcmVmIiwKLQkucmF0ZQkJPSAxMjAwMDAwMCwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIEFMV0FZU19FTkFCTEVELAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY2tfZHBsbDEgPSB7Ci0JLm5hbWUJCT0gImNrX2RwbGwxIiwKLQkucGFyZW50CQk9ICZja19yZWYsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAotCQkJICBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGNrX2RwbGwxb3V0ID0gewotCS5uYW1lCQk9ICJja19kcGxsMW91dCIsCi0JLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAotCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCi0JLmVuYWJsZV9iaXQJPSBFTl9DS09VVF9BUk0sCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGFybV9jayA9IHsKLQkubmFtZQkJPSAiYXJtX2NrIiwKLQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfQ0tDVEwgfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKLQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9BUk1ESVZfT0ZGU0VULAotCS5yZWNhbGMJCT0gJmNrY3RsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGFybXBlcl9jayA9IHsKLQkubmFtZQkJPSAiYXJtcGVyX2NrIiwKLQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfQ0tDVEwsCi0JLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKLQkuZW5hYmxlX2JpdAk9IEVOX1BFUkNLLAotCS5yYXRlX29mZnNldAk9IENLQ1RMX1BFUkRJVl9PRkZTRVQsCi0JLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJtX2dwaW9fY2sgPSB7Ci0JLm5hbWUJCT0gImFybV9ncGlvX2NrIiwKLQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAsCi0JLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKLQkuZW5hYmxlX2JpdAk9IEVOX0dQSU9DSywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJteG9yX2NrID0gewotCS5uYW1lCQk9ICJhcm14b3JfY2siLAotCS5wYXJlbnQJCT0gJmNrX3JlZiwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCwKLQkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAotCS5lbmFibGVfYml0CT0gRU5fWE9SUENLLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcm10aW1fY2sgPSB7Ci0JLm5hbWUJCT0gImFybXRpbV9jayIsCi0JLnBhcmVudAkJPSAmY2tfcmVmLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYLAotCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCi0JLmVuYWJsZV9iaXQJPSBFTl9USU1DSywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJtd2R0X2NrID0gewotCS5uYW1lCQk9ICJhcm13ZHRfY2siLAotCS5wYXJlbnQJCT0gJmNrX3JlZiwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCwKLQkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAotCS5lbmFibGVfYml0CT0gRU5fV0RUQ0ssCi0JLnJlY2FsYwkJPSAmd2F0Y2hkb2dfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgYXJtaW50aF9jazE2eHggPSB7Ci0JLm5hbWUJCT0gImFybWludGhfY2siLAotCS5wYXJlbnQJCT0gJmFybV9jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkvKiBOb3RlOiBPbiAxNnh4IHRoZSBmcmVxdWVuY3kgY2FuIGJlIGRpdmlkZWQgYnkgMiBieSBwcm9ncmFtbWluZwotCSAqIEFSTV9DS0NUTDpBUk1fSU5USENLX1NFTCgxNCkgdG8gMQotCSAqCi0JICogMTUxMCB2ZXJzaW9uIGlzIGluIFRDIGNsb2Nrcy4KLQkgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzcF9jayA9IHsKLQkubmFtZQkJPSAiZHNwX2NrIiwKLQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfQ0tDVEwsCi0JLmVuYWJsZV9yZWcJPSBBUk1fQ0tDVEwsCi0JLmVuYWJsZV9iaXQJPSBFTl9EU1BDSywKLQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9EU1BESVZfT0ZGU0VULAotCS5yZWNhbGMJCT0gJmNrY3RsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRzcG1tdV9jayA9IHsKLQkubmFtZQkJPSAiZHNwbW11X2NrIiwKLQkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfQ0tDVEwgfCBBTFdBWVNfRU5BQkxFRCwKLQkucmF0ZV9vZmZzZXQJPSBDS0NUTF9EU1BNTVVESVZfT0ZGU0VULAotCS5yZWNhbGMJCT0gJmNrY3RsX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHRjX2NrID0gewotCS5uYW1lCQk9ICJ0Y19jayIsCi0JLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfCBDTE9DS19JTl9PTUFQNzMwIHwKLQkJCSAgUkFURV9DS0NUTCB8IFJBVEVfUFJPUEFHQVRFUyB8IEFMV0FZU19FTkFCTEVELAotCS5yYXRlX29mZnNldAk9IENLQ1RMX1RDRElWX09GRlNFVCwKLQkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcm1pbnRoX2NrMTUxMCA9IHsKLQkubmFtZQkJPSAiYXJtaW50aF9jayIsCi0JLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi0JLyogTm90ZTogT24gMTUxMCB0aGUgZnJlcXVlbmN5IGZvbGxvd3MgVENfQ0sKLQkgKgotCSAqIDE2eHggdmVyc2lvbiBpcyBpbiBNUFUgY2xvY2tzLgotCSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdGlwYl9jayA9IHsKLQkubmFtZQkJPSAidGlicF9jayIsCi0JLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBsM19vY3BpX2NrID0gewotCS5uYW1lCQk9ICJsM19vY3BpX2NrIiwKLQkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCi0JLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMywKLQkuZW5hYmxlX2JpdAk9IEVOX09DUElfQ0ssCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHRjMV9jayA9IHsKLQkubmFtZQkJPSAidGMxX2NrIiwKLQkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCi0JLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMywKLQkuZW5hYmxlX2JpdAk9IEVOX1RDMV9DSywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdGMyX2NrID0gewotCS5uYW1lCQk9ICJ0YzJfY2siLAotCS5wYXJlbnQJCT0gJnRjX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKLQkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QzLAotCS5lbmFibGVfYml0CT0gRU5fVEMyX0NLLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBkbWFfY2sgPSB7Ci0JLm5hbWUJCT0gImRtYV9jayIsCi0JLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIGRtYV9sY2RmcmVlX2NrID0gewotCS5uYW1lCQk9ICJkbWFfbGNkZnJlZV9jayIsCi0JLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBhcGlfY2sgPSB7Ci0JLm5hbWUJCT0gImFwaV9jayIsCi0JLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCi0JLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKLQkuZW5hYmxlX2JpdAk9IEVOX0FQSUNLLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBsYl9jayA9IHsKLQkubmFtZQkJPSAibGJfY2siLAotCS5wYXJlbnQJCT0gJnRjX2NrLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCwKLQkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAotCS5lbmFibGVfYml0CT0gRU5fTEJDSywKLQkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgcmhlYTFfY2sgPSB7Ci0JLm5hbWUJCT0gInJoZWExX2NrIiwKLQkucGFyZW50CQk9ICZ0Y19jaywKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFgsCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHJoZWEyX2NrID0gewotCS5uYW1lCQk9ICJyaGVhMl9jayIsCi0JLnBhcmVudAkJPSAmdGNfY2ssCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAotCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBsY2RfY2sgPSB7Ci0JLm5hbWUJCT0gImxjZF9jayIsCi0JLnBhcmVudAkJPSAmY2tfZHBsbDEsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfCBDTE9DS19JTl9PTUFQNzMwIHwKLQkJCSAgUkFURV9DS0NUTCwKLQkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAotCS5lbmFibGVfYml0CT0gRU5fTENEQ0ssCi0JLnJhdGVfb2Zmc2V0CT0gQ0tDVExfTENERElWX09GRlNFVCwKLQkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1YXJ0MV9jayA9IHsKLQkubmFtZQkJPSAidWFydDFfY2siLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwotCS5yYXRlCQk9IDQ4MDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKLQkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCi0JLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCi0JLmVuYWJsZV9iaXQJPSAyOSwKLQkvKiAoT25seSBvbiAxNTEwKQotCSAqIFRoZSAiZW5hYmxlIGJpdCIgYWN0dWFsbHkgY2hvb3NlcyBiZXR3ZWVuIDQ4TUh6IGFuZCAxMk1Iei4KLQkgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQyX2NrID0gewotCS5uYW1lCQk9ICJ1YXJ0Ml9jayIsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCi0JLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAotCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKLQkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKLQkuZW5hYmxlX2JpdAk9IDMwLAotCS8qIChmb3IgYm90aCAxNTEwIGFuZCAxNnh4KQotCSAqIFRoZSAiZW5hYmxlIGJpdCIgYWN0dWFsbHkgY2hvb3NlcyBiZXR3ZWVuIDQ4TUh6IGFuZCAxMk1Iei8zMmtIei4KLQkgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQzX2NrID0gewotCS5uYW1lCQk9ICJ1YXJ0M19jayIsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCi0JLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAotCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKLQkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKLQkuZW5hYmxlX2JpdAk9IDMxLAotCS8qIChPbmx5IG9uIDE1MTApCi0JICogVGhlICJlbmFibGUgYml0IiBhY3R1YWxseSBjaG9vc2VzIGJldHdlZW4gNDhNSHogYW5kIDEyTUh6LgotCSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiX2Nsa28gPSB7CS8qIDYgTUh6IG91dHB1dCBvbiBXNF9VU0JfQ0xLTyAqLwotCS5uYW1lCQk9ICJ1c2JfY2xrbyIsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCi0JLnJhdGUJCT0gNjAwMDAwMCwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAotCS5lbmFibGVfcmVnCT0gVUxQRF9DTE9DS19DVFJMLAotCS5lbmFibGVfYml0CT0gVVNCX01DTEtfRU5fQklULAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgdXNiX2hoY19jazE1MTAgPSB7Ci0JLm5hbWUJCT0gInVzYl9oaGNfY2siLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwotCS5yYXRlCQk9IDQ4MDAwMDAwLCAvKiBBY3R1YWxseSAyIGNsb2NrcywgMTJNSHogYW5kIDQ4TUh6ICovCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwKLQkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCi0JLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCi0JLmVuYWJsZV9iaXQJPSBVU0JfSE9TVF9ISENfVUhPU1RfRU4sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB1c2JfaGhjX2NrMTZ4eCA9IHsKLQkubmFtZQkJPSAidXNiX2hoY19jayIsCi0JLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCi0JLnJhdGUJCT0gNDgwMDAwMDAsCi0JLyogT1RHX1NZU0NPTl8yLk9UR19QQURFTiA9PSAwIChub3QgMTUxMC1jb21wYXRpYmxlKSAqLwotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAotCS5lbmFibGVfcmVnCT0gT1RHX0JBU0UgKyAweDA4IC8qIE9UR19TWVNDT05fMiAqLywKLQkuZW5hYmxlX2JpdAk9IDggLyogVUhPU1RfRU4gKi8sCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2xrXzE1MTAgPSB7Ci0JLm5hbWUJCT0gIm1jbGsiLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwotCS5yYXRlCQk9IDEyMDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IFJBVEVfRklYRUQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtY2xrXzE2eHggPSB7Ci0JLm5hbWUJCT0gIm1jbGsiLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKLQkuZW5hYmxlX3JlZwk9IENPTV9DTEtfRElWX0NUUkxfU0VMLAotCS5lbmFibGVfYml0CT0gQ09NX1VMUERfUExMX0NMS19SRVEsCi0JLnNldF9yYXRlCT0gJnNldF9leHRfY2xrX3JhdGUsCi0JLnJvdW5kX3JhdGUJPSAmcm91bmRfZXh0X2Nsa19yYXRlLAotCS5pbml0CQk9ICZpbml0X2V4dF9jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBiY2xrXzE1MTAgPSB7Ci0JLm5hbWUJCT0gImJjbGsiLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwotCS5yYXRlCQk9IDEyMDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IFJBVEVfRklYRUQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBiY2xrXzE2eHggPSB7Ci0JLm5hbWUJCT0gImJjbGsiLAotCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudC4gTWF5IGJlIGVuYWJsZWQgYnkgZXh0IGhhcmR3YXJlLiAqLwotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKLQkuZW5hYmxlX3JlZwk9IFNXRF9DTEtfRElWX0NUUkxfU0VMLAotCS5lbmFibGVfYml0CT0gU1dEX1VMUERfUExMX0NMS19SRVEsCi0JLnNldF9yYXRlCT0gJnNldF9leHRfY2xrX3JhdGUsCi0JLnJvdW5kX3JhdGUJPSAmcm91bmRfZXh0X2Nsa19yYXRlLAotCS5pbml0CQk9ICZpbml0X2V4dF9jbGssCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBtbWMxX2NrID0gewotCS5uYW1lCQk9ICJtbWMxX2NrIiwKLQkvKiBGdW5jdGlvbmFsIGNsb2NrIGlzIGRpcmVjdCBmcm9tIFVMUEQsIGludGVyZmFjZSBjbG9jayBpcyBBUk1QRVIgKi8KLQkucGFyZW50CQk9ICZhcm1wZXJfY2ssCi0JLnJhdGUJCT0gNDgwMDAwMDAsCi0JLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAotCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKLQkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKLQkuZW5hYmxlX2JpdAk9IDIzLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbW1jMl9jayA9IHsKLQkubmFtZQkJPSAibW1jMl9jayIsCi0JLyogRnVuY3Rpb25hbCBjbG9jayBpcyBkaXJlY3QgZnJvbSBVTFBELCBpbnRlcmZhY2UgY2xvY2sgaXMgQVJNUEVSICovCi0JLnBhcmVudAkJPSAmYXJtcGVyX2NrLAotCS5yYXRlCQk9IDQ4MDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAotCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAotCS5lbmFibGVfYml0CT0gMjAsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB2aXJ0dWFsX2NrX21wdSA9IHsKLQkubmFtZQkJPSAibXB1IiwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8Ci0JCQkgIFZJUlRVQUxfQ0xPQ0sgfCBBTFdBWVNfRU5BQkxFRCwKLQkucGFyZW50CQk9ICZhcm1fY2ssIC8qIElzIHNtYXJ0ZXIgYWxpYXMgZm9yICovCi0JLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKLQkuc2V0X3JhdGUJPSAmc2VsZWN0X3RhYmxlX3JhdGUsCi0JLnJvdW5kX3JhdGUJPSAmcm91bmRfdG9fdGFibGVfcmF0ZSwKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBjbGsgKiAgb25jaGlwX2Nsa3NbXSA9IHsKLQkvKiBub24tVUxQRCBjbG9ja3MgKi8KLQkmY2tfcmVmLAotCSZja19kcGxsMSwKLQkvKiBDS19HRU4xIGNsb2NrcyAqLwotCSZja19kcGxsMW91dCwKLQkmYXJtX2NrLAotCSZhcm1wZXJfY2ssCi0JJmFybV9ncGlvX2NrLAotCSZhcm14b3JfY2ssCi0JJmFybXRpbV9jaywKLQkmYXJtd2R0X2NrLAotCSZhcm1pbnRoX2NrMTUxMCwgICZhcm1pbnRoX2NrMTZ4eCwKLQkvKiBDS19HRU4yIGNsb2NrcyAqLwotCSZkc3BfY2ssCi0JJmRzcG1tdV9jaywKLQkvKiBDS19HRU4zIGNsb2NrcyAqLwotCSZ0Y19jaywKLQkmdGlwYl9jaywKLQkmbDNfb2NwaV9jaywKLQkmdGMxX2NrLAotCSZ0YzJfY2ssCi0JJmRtYV9jaywKLQkmZG1hX2xjZGZyZWVfY2ssCi0JJmFwaV9jaywKLQkmbGJfY2ssCi0JJnJoZWExX2NrLAotCSZyaGVhMl9jaywKLQkmbGNkX2NrLAotCS8qIFVMUEQgY2xvY2tzICovCi0JJnVhcnQxX2NrLAotCSZ1YXJ0Ml9jaywKLQkmdWFydDNfY2ssCi0JJnVzYl9jbGtvLAotCSZ1c2JfaGhjX2NrMTUxMCwgJnVzYl9oaGNfY2sxNnh4LAotCSZtY2xrXzE1MTAsICAmbWNsa18xNnh4LAotCSZiY2xrXzE1MTAsICAmYmNsa18xNnh4LAotCSZtbWMxX2NrLAotCSZtbWMyX2NrLAotCS8qIFZpcnR1YWwgY2xvY2tzICovCi0JJnZpcnR1YWxfY2tfbXB1LAotfTsKLQotc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQotewotCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOwotCi0JZG93bigmY2xvY2tzX3NlbSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7Ci0JCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7Ci0JCQljbGsgPSBwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JdXAoJmNsb2Nrc19zZW0pOwotCi0JcmV0dXJuIGNsazsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldCk7Ci0KLQotdm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpZiAoY2xrICYmICFJU19FUlIoY2xrKSkKLQkJbW9kdWxlX3B1dChjbGstPm93bmVyKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3B1dCk7Ci0KLQotaW50IF9fY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JX191MTYgcmVndmFsMTY7Ci0JX191MzIgcmVndmFsMzI7Ci0KLQlpZiAoY2xrLT5mbGFncyAmIEFMV0FZU19FTkFCTEVEKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseShjbGstPmVuYWJsZV9yZWcgPT0gMCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjbG9jay5jOiBFbmFibGUgZm9yICVzIHdpdGhvdXQgZW5hYmxlIGNvZGVcbiIsCi0JCSAgICAgICBjbGstPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoY2xrLT5mbGFncyAmIEVOQUJMRV9SRUdfMzJCSVQpIHsKLQkJcmVndmFsMzIgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXJlZ3ZhbDMyIHw9ICgxIDw8IGNsay0+ZW5hYmxlX2JpdCk7Ci0JCW9tYXBfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOwotCX0gZWxzZSB7Ci0JCXJlZ3ZhbDE2ID0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpOwotCQlyZWd2YWwxNiB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOwotCQlvbWFwX3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi12b2lkIF9fY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQotewotCV9fdTE2IHJlZ3ZhbDE2OwotCV9fdTMyIHJlZ3ZhbDMyOwotCi0JaWYgKGNsay0+ZW5hYmxlX3JlZyA9PSAwKQotCQlyZXR1cm47Ci0KLQlpZiAoY2xrLT5mbGFncyAmIEVOQUJMRV9SRUdfMzJCSVQpIHsKLQkJcmVndmFsMzIgPSBvbWFwX3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7Ci0JCXJlZ3ZhbDMyICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOwotCQlvbWFwX3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKLQl9IGVsc2UgewotCQlyZWd2YWwxNiA9IG9tYXBfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKLQkJcmVndmFsMTYgJj0gfigxIDw8IGNsay0+ZW5hYmxlX2JpdCk7Ci0JCW9tYXBfd3JpdGV3KHJlZ3ZhbDE2LCBjbGstPmVuYWJsZV9yZWcpOwotCX0KLX0KLQotCi12b2lkIF9fY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpZiAoY2xrLT51c2Vjb3VudCA+IDAgJiYgISgtLWNsay0+dXNlY291bnQpKSB7Ci0JCV9fY2xrX2Rpc2FibGUoY2xrKTsKLQkJaWYgKGxpa2VseShjbGstPnBhcmVudCkpCi0JCQlfX2Nsa191bnVzZShjbGstPnBhcmVudCk7Ci0JfQotfQotCi0KLWludCBfX2Nsa191c2Uoc3RydWN0IGNsayAqY2xrKQotewotCWludCByZXQgPSAwOwotCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCkgewotCQlpZiAobGlrZWx5KGNsay0+cGFyZW50KSkKLQkJCXJldCA9IF9fY2xrX3VzZShjbGstPnBhcmVudCk7Ci0KLQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQkJY2xrLT51c2Vjb3VudC0tOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCXJldCA9IF9fY2xrX2VuYWJsZShjbGspOwotCi0JCWlmICh1bmxpa2VseShyZXQgIT0gMCkgJiYgY2xrLT5wYXJlbnQpIHsKLQkJCV9fY2xrX3VudXNlKGNsay0+cGFyZW50KTsKLQkJCWNsay0+dXNlY291bnQtLTsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLQotaW50IGNsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKLQlyZXQgPSBfX2Nsa19lbmFibGUoY2xrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKLQotCi12b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCV9fY2xrX2Rpc2FibGUoY2xrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOwotCi0KLWludCBjbGtfdXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCXJldCA9IF9fY2xrX3VzZShjbGspOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191c2UpOwotCi0KLXZvaWQgY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCV9fY2xrX3VudXNlKGNsayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa191bnVzZSk7Ci0KLQotaW50IGNsa19nZXRfdXNlY291bnQoc3RydWN0IGNsayAqY2xrKQotewotICAgICAgICByZXR1cm4gY2xrLT51c2Vjb3VudDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX2dldF91c2Vjb3VudCk7Ci0KLQotdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCXJldHVybiBjbGstPnJhdGU7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19nZXRfcmF0ZSk7Ci0KLQotc3RhdGljIF9fdTE2IHZlcmlmeV9ja2N0bF92YWx1ZShfX3UxNiBuZXd2YWwpCi17Ci0JLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBzZXQKLQkgKiBieSB0aGUgaGFyZHdhcmUgKGFsbCBjb25kaXRpb25zIG11c3QgYmUgdHJ1ZSk6Ci0JICogRFNQTU1VX0NLID09IERTUF9DSyAgb3IgIERTUE1NVV9DSyA9PSBEU1BfQ0svMgotCSAqIEFSTV9DSyA+PSBUQ19DSwotCSAqIERTUF9DSyA+PSBUQ19DSwotCSAqIERTUE1NVV9DSyA+PSBUQ19DSwotCSAqCi0JICogSW4gYWRkaXRpb24gZm9sbG93aW5nIHJ1bGVzIGFyZSBlbmZvcmNlZDoKLQkgKiBMQ0RfQ0sgPD0gVENfQ0sKLQkgKiBBUk1QRVJfQ0sgPD0gVENfQ0sKLQkgKgotCSAqIEhvd2V2ZXIsIG1heGltdW0gZnJlcXVlbmNpZXMgYXJlIG5vdCBjaGVja2VkIGZvciEKLQkgKi8KLQlfX3U4IHBlcl9leHA7Ci0JX191OCBsY2RfZXhwOwotCV9fdTggYXJtX2V4cDsKLQlfX3U4IGRzcF9leHA7Ci0JX191OCB0Y19leHA7Ci0JX191OCBkc3BtbXVfZXhwOwotCi0JcGVyX2V4cCA9IChuZXd2YWwgPj4gQ0tDVExfUEVSRElWX09GRlNFVCkgJiAzOwotCWxjZF9leHAgPSAobmV3dmFsID4+IENLQ1RMX0xDRERJVl9PRkZTRVQpICYgMzsKLQlhcm1fZXhwID0gKG5ld3ZhbCA+PiBDS0NUTF9BUk1ESVZfT0ZGU0VUKSAmIDM7Ci0JZHNwX2V4cCA9IChuZXd2YWwgPj4gQ0tDVExfRFNQRElWX09GRlNFVCkgJiAzOwotCXRjX2V4cCA9IChuZXd2YWwgPj4gQ0tDVExfVENESVZfT0ZGU0VUKSAmIDM7Ci0JZHNwbW11X2V4cCA9IChuZXd2YWwgPj4gQ0tDVExfRFNQTU1VRElWX09GRlNFVCkgJiAzOwotCi0JaWYgKGRzcG1tdV9leHAgPCBkc3BfZXhwKQotCQlkc3BtbXVfZXhwID0gZHNwX2V4cDsKLQlpZiAoZHNwbW11X2V4cCA+IGRzcF9leHArMSkKLQkJZHNwbW11X2V4cCA9IGRzcF9leHArMTsKLQlpZiAodGNfZXhwIDwgYXJtX2V4cCkKLQkJdGNfZXhwID0gYXJtX2V4cDsKLQlpZiAodGNfZXhwIDwgZHNwbW11X2V4cCkKLQkJdGNfZXhwID0gZHNwbW11X2V4cDsKLQlpZiAodGNfZXhwID4gbGNkX2V4cCkKLQkJbGNkX2V4cCA9IHRjX2V4cDsKLQlpZiAodGNfZXhwID4gcGVyX2V4cCkKLQkJcGVyX2V4cCA9IHRjX2V4cDsKLQotCW5ld3ZhbCAmPSAweGYwMDA7Ci0JbmV3dmFsIHw9IHBlcl9leHAgPDwgQ0tDVExfUEVSRElWX09GRlNFVDsKLQluZXd2YWwgfD0gbGNkX2V4cCA8PCBDS0NUTF9MQ0RESVZfT0ZGU0VUOwotCW5ld3ZhbCB8PSBhcm1fZXhwIDw8IENLQ1RMX0FSTURJVl9PRkZTRVQ7Ci0JbmV3dmFsIHw9IGRzcF9leHAgPDwgQ0tDVExfRFNQRElWX09GRlNFVDsKLQluZXd2YWwgfD0gdGNfZXhwIDw8IENLQ1RMX1RDRElWX09GRlNFVDsKLQluZXd2YWwgfD0gZHNwbW11X2V4cCA8PCBDS0NUTF9EU1BNTVVESVZfT0ZGU0VUOwotCi0JcmV0dXJuIG5ld3ZhbDsKLX0KLQotCi1zdGF0aWMgaW50IGNhbGNfZHNvcl9leHAoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JLyogTm90ZTogSWYgdGFyZ2V0IGZyZXF1ZW5jeSBpcyB0b28gbG93LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIDQsCi0JICogd2hpY2ggaXMgaW52YWxpZCB2YWx1ZS4gQ2FsbGVyIG11c3QgY2hlY2sgZm9yIHRoaXMgdmFsdWUgYW5kIGFjdAotCSAqIGFjY29yZGluZ2x5LgotCSAqCi0JICogTm90ZTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayBmb3IgZm9sbG93aW5nIGxpbWl0YXRpb25zIHNldAotCSAqIGJ5IHRoZSBoYXJkd2FyZSAoYWxsIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlKToKLQkgKiBEU1BNTVVfQ0sgPT0gRFNQX0NLICBvciAgRFNQTU1VX0NLID09IERTUF9DSy8yCi0JICogQVJNX0NLID49IFRDX0NLCi0JICogRFNQX0NLID49IFRDX0NLCi0JICogRFNQTU1VX0NLID49IFRDX0NLCi0JICovCi0JdW5zaWduZWQgbG9uZyByZWFscmF0ZTsKLQlzdHJ1Y3QgY2xrICogIHBhcmVudDsKLQl1bnNpZ25lZCAgZHNvcl9leHA7Ci0KLQlpZiAodW5saWtlbHkoIShjbGstPmZsYWdzICYgUkFURV9DS0NUTCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmVudCA9IGNsay0+cGFyZW50OwotCWlmICh1bmxpa2VseShwYXJlbnQgPT0gMCkpCi0JCXJldHVybiAtRUlPOwotCi0JcmVhbHJhdGUgPSBwYXJlbnQtPnJhdGU7Ci0JZm9yIChkc29yX2V4cD0wOyBkc29yX2V4cDw0OyBkc29yX2V4cCsrKSB7Ci0JCWlmIChyZWFscmF0ZSA8PSByYXRlKQotCQkJYnJlYWs7Ci0KLQkJcmVhbHJhdGUgLz0gMjsKLQl9Ci0KLQlyZXR1cm4gZHNvcl9leHA7Ci19Ci0KLWxvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JaW50IGRzb3JfZXhwOwotCi0JaWYgKGNsay0+ZmxhZ3MgJiBSQVRFX0ZJWEVEKQotCQlyZXR1cm4gY2xrLT5yYXRlOwotCi0JaWYgKGNsay0+ZmxhZ3MgJiBSQVRFX0NLQ1RMKSB7Ci0JCWRzb3JfZXhwID0gY2FsY19kc29yX2V4cChjbGssIHJhdGUpOwotCQlpZiAoZHNvcl9leHAgPCAwKQotCQkJcmV0dXJuIGRzb3JfZXhwOwotCQlpZiAoZHNvcl9leHAgPiAzKQotCQkJZHNvcl9leHAgPSAzOwotCQlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyAoMSA8PCBkc29yX2V4cCk7Ci0JfQotCi0JaWYoY2xrLT5yb3VuZF9yYXRlICE9IDApCi0JCXJldHVybiBjbGstPnJvdW5kX3JhdGUoY2xrLCByYXRlKTsKLQotCXJldHVybiBjbGstPnJhdGU7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKLQotCi1zdGF0aWMgdm9pZCBwcm9wYWdhdGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaykKLXsKLQlzdHJ1Y3QgY2xrICoqICBjbGtwOwotCi0JZm9yIChjbGtwID0gb25jaGlwX2Nsa3M7IGNsa3AgPCBvbmNoaXBfY2xrcytBUlJBWV9TSVpFKG9uY2hpcF9jbGtzKTsgY2xrcCsrKSB7Ci0JCWlmIChsaWtlbHkoKCpjbGtwKS0+cGFyZW50ICE9IGNsaykpIGNvbnRpbnVlOwotCQlpZiAobGlrZWx5KCgqY2xrcCktPnJlY2FsYykpCi0JCQkoKmNsa3ApLT5yZWNhbGMoKmNsa3ApOwotCX0KLX0KLQotCi1zdGF0aWMgaW50IHNlbGVjdF90YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JLyogRmluZCB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZnJlcXVlbmN5IDw9IHJhdGUgYW5kIHN3aXRjaCB0byBpdCAqLwotCXN0cnVjdCBtcHVfcmF0ZSAqICBwdHI7Ci0KLQlpZiAoY2xrICE9ICZ2aXJ0dWFsX2NrX21wdSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKHB0ciA9IHJhdGVfdGFibGU7IHB0ci0+cmF0ZTsgcHRyKyspIHsKLQkJaWYgKHB0ci0+eHRhbCAhPSBja19yZWYucmF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIERQTEwxIGNhbm5vdCBiZSByZXByb2dyYW1tZWQgd2l0aG91dCByaXNraW5nIHN5c3RlbSBjcmFzaCAqLwotCQlpZiAobGlrZWx5KGNrX2RwbGwxLnJhdGUhPTApICYmIHB0ci0+cGxsX3JhdGUgIT0gY2tfZHBsbDEucmF0ZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIENhbiBjaGVjayBvbmx5IGFmdGVyIHh0YWwgZnJlcXVlbmN5IGNoZWNrICovCi0JCWlmIChwdHItPnJhdGUgPD0gcmF0ZSkKLQkJCWJyZWFrOwotCX0KLQotCWlmICghcHRyLT5yYXRlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh1bmxpa2VseShja19kcGxsMS5yYXRlID09IDApKSB7Ci0JCW9tYXBfd3JpdGV3KHB0ci0+ZHBsbGN0bF92YWwsIERQTExfQ1RMKTsKLQkJY2tfZHBsbDEucmF0ZSA9IHB0ci0+cGxsX3JhdGU7Ci0JfQotCW9tYXBfd3JpdGV3KHB0ci0+Y2tjdGxfdmFsLCBBUk1fQ0tDVEwpOwotCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGxvbmcgcm91bmRfdG9fdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCS8qIEZpbmQgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGZyZXF1ZW5jeSA8PSByYXRlICovCi0Jc3RydWN0IG1wdV9yYXRlICogIHB0cjsKLQlsb25nICBoaWdoZXN0X3JhdGU7Ci0KLQlpZiAoY2xrICE9ICZ2aXJ0dWFsX2NrX21wdSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQloaWdoZXN0X3JhdGUgPSAtRUlOVkFMOwotCi0JZm9yIChwdHIgPSByYXRlX3RhYmxlOyBwdHItPnJhdGU7IHB0cisrKSB7Ci0JCWlmIChwdHItPnh0YWwgIT0gY2tfcmVmLnJhdGUpCi0JCQljb250aW51ZTsKLQotCQloaWdoZXN0X3JhdGUgPSBwdHItPnJhdGU7Ci0KLQkJLyogQ2FuIGNoZWNrIG9ubHkgYWZ0ZXIgeHRhbCBmcmVxdWVuY3kgY2hlY2sgKi8KLQkJaWYgKHB0ci0+cmF0ZSA8PSByYXRlKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGhpZ2hlc3RfcmF0ZTsKLX0KLQotCi1pbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQotewotCWludCAgcmV0ID0gLUVJTlZBTDsKLQlpbnQgIGRzb3JfZXhwOwotCV9fdTE2ICByZWd2YWw7Ci0JdW5zaWduZWQgbG9uZyAgZmxhZ3M7Ci0KLQlpZiAoY2xrLT5mbGFncyAmIFJBVEVfQ0tDVEwpIHsKLQkJZHNvcl9leHAgPSBjYWxjX2Rzb3JfZXhwKGNsaywgcmF0ZSk7Ci0JCWlmIChkc29yX2V4cCA+IDMpCi0JCQlkc29yX2V4cCA9IC1FSU5WQUw7Ci0JCWlmIChkc29yX2V4cCA8IDApCi0JCQlyZXR1cm4gZHNvcl9leHA7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOwotCQlyZWd2YWwgPSBvbWFwX3JlYWR3KEFSTV9DS0NUTCk7Ci0JCXJlZ3ZhbCAmPSB+KDMgPDwgY2xrLT5yYXRlX29mZnNldCk7Ci0JCXJlZ3ZhbCB8PSBkc29yX2V4cCA8PCBjbGstPnJhdGVfb2Zmc2V0OwotCQlyZWd2YWwgPSB2ZXJpZnlfY2tjdGxfdmFsdWUocmVndmFsKTsKLQkJb21hcF93cml0ZXcocmVndmFsLCBBUk1fQ0tDVEwpOwotCQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvICgxIDw8IGRzb3JfZXhwKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIGlmKGNsay0+c2V0X3JhdGUgIT0gMCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNsay0+c2V0X3JhdGUoY2xrLCByYXRlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHJldCA9PSAwICYmIChjbGstPmZsYWdzICYgUkFURV9QUk9QQUdBVEVTKSkpCi0JCXByb3BhZ2F0ZV9yYXRlKGNsayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChjbGtfc2V0X3JhdGUpOwotCi0KLXN0YXRpYyB1bnNpZ25lZCBjYWxjX2V4dF9kc29yKHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBkc29yOwotCi0JLyogTUNMSyBhbmQgQkNMSyBkaXZpc29yIHNlbGVjdGlvbiBpcyBub3QgbGluZWFyOgotCSAqIGZyZXEgPSA5Nk1IeiAvIGRzb3IKLQkgKgotCSAqIFJBVElPX1NFTCByYW5nZTogZHNvciA8LT4gUkFUSU9fU0VMCi0JICogMC4uNjogKFJBVElPX1NFTCsyKSA8LT4gKGRzb3ItMikKLQkgKiA2Li40ODogICg4KyhSQVRJT19TRUwtNikqMikgPC0+ICgoZHNvci04KS8yKzYpCi0JICogTWluaW11bSBkc29yIGlzIDIgYW5kIG1heGltdW0gaXMgOTYuIE9kZCBkaXZpc29ycyBzdGFydGluZyBmcm9tIDkKLQkgKiBjYW4gbm90IGJlIHVzZWQuCi0JICovCi0JZm9yIChkc29yID0gMjsgZHNvciA8IDk2OyArK2Rzb3IpIHsKLQkJaWYgKChkc29yICYgMSkgJiYgZHNvciA+IDgpCi0JCSAgCWNvbnRpbnVlOwotCQlpZiAocmF0ZSA+PSA5NjAwMDAwMCAvIGRzb3IpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIGRzb3I7Ci19Ci0KLQotc3RhdGljIGludCBzZXRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JdW5zaWduZWQgZHNvcjsKLQlfX3UxNiByYXRpb19iaXRzOwotCi0JZHNvciA9IGNhbGNfZXh0X2Rzb3IocmF0ZSk7Ci0JY2xrLT5yYXRlID0gOTYwMDAwMDAgLyBkc29yOwotCWlmIChkc29yID4gOCkKLQkJcmF0aW9fYml0cyA9ICgoZHNvciAtIDgpIC8gMiArIDYpIDw8IDI7Ci0JZWxzZQotCQlyYXRpb19iaXRzID0gKGRzb3IgLSAyKSA8PCAyOwotCi0JcmF0aW9fYml0cyB8PSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZykgJiB+MHhmZDsKLQlvbWFwX3dyaXRldyhyYXRpb19iaXRzLCBjbGstPmVuYWJsZV9yZWcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGxvbmcgcm91bmRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCi17Ci0JcmV0dXJuIDk2MDAwMDAwIC8gY2FsY19leHRfZHNvcihyYXRlKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbml0X2V4dF9jbGsoc3RydWN0IGNsayAqICBjbGspCi17Ci0JdW5zaWduZWQgZHNvcjsKLQlfX3UxNiByYXRpb19iaXRzOwotCi0JLyogRGV0ZXJtaW5lIGN1cnJlbnQgcmF0ZSBhbmQgZW5zdXJlIGNsb2NrIGlzIGJhc2VkIG9uIDk2TUh6IEFQTEwgKi8KLQlyYXRpb19iaXRzID0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpICYgfjE7Ci0Jb21hcF93cml0ZXcocmF0aW9fYml0cywgY2xrLT5lbmFibGVfcmVnKTsKLQotCXJhdGlvX2JpdHMgPSAocmF0aW9fYml0cyAmIDB4ZmMpID4+IDI7Ci0JaWYgKHJhdGlvX2JpdHMgPiA2KQotCQlkc29yID0gKHJhdGlvX2JpdHMgLSA2KSAqIDIgKyA4OwotCWVsc2UKLQkJZHNvciA9IHJhdGlvX2JpdHMgKyAyOwotCi0JY2xrLT4gcmF0ZSA9IDk2MDAwMDAwIC8gZHNvcjsKLX0KLQotCi1pbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlkb3duKCZjbG9ja3Nfc2VtKTsKLQlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tzKTsKLQlpZiAoY2xrLT5pbml0KQotCQljbGstPmluaXQoY2xrKTsKLQl1cCgmY2xvY2tzX3NlbSk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7Ci0KLXZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQotewotCWRvd24oJmNsb2Nrc19zZW0pOwotCWxpc3RfZGVsKCZjbGstPm5vZGUpOwotCXVwKCZjbG9ja3Nfc2VtKTsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOwotCi0KLQotaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQotewotCXN0cnVjdCBjbGsgKiogIGNsa3A7Ci0JY29uc3Qgc3RydWN0IG9tYXBfY2xvY2tfY29uZmlnICppbmZvOwotCWludCBjcnlzdGFsX3R5cGUgPSAwOyAvKiBEZWZhdWx0IDEyIE1IeiAqLwotCi0JZm9yIChjbGtwID0gb25jaGlwX2Nsa3M7IGNsa3AgPCBvbmNoaXBfY2xrcytBUlJBWV9TSVpFKG9uY2hpcF9jbGtzKTsgY2xrcCsrKSB7Ci0JCWlmICgoKCpjbGtwKS0+ZmxhZ3MgJkNMT0NLX0lOX09NQVAxNTEwKSAmJiBjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJY2xrX3JlZ2lzdGVyKCpjbGtwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCgoKmNsa3ApLT5mbGFncyAmQ0xPQ0tfSU5fT01BUDE2WFgpICYmIGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCQljbGtfcmVnaXN0ZXIoKmNsa3ApOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKCgqY2xrcCktPmZsYWdzICZDTE9DS19JTl9PTUFQNzMwKSAmJiBjcHVfaXNfb21hcDczMCgpKSB7Ci0JCQljbGtfcmVnaXN0ZXIoKmNsa3ApOwotCQkJY29udGludWU7Ci0JCX0KLQl9Ci0KLQlpbmZvID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX0NMT0NLLCBzdHJ1Y3Qgb21hcF9jbG9ja19jb25maWcpOwotCWlmIChpbmZvICE9IE5VTEwpIHsKLQkJaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkKLQkJCWNyeXN0YWxfdHlwZSA9IGluZm8tPnN5c3RlbV9jbG9ja190eXBlOwotCX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDczMCkKLQlja19yZWYucmF0ZSA9IDEzMDAwMDAwOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3J5c3RhbF90eXBlID09IDIpCi0JCWNrX3JlZi5yYXRlID0gMTkyMDAwMDA7Ci0jZW5kaWYKLQotCS8qIFdlIHdhbnQgdG8gYmUgaW4gc3luY3Jvbm91cyBzY2FsYWJsZSBtb2RlICovCi0Jb21hcF93cml0ZXcoMHgxMDAwLCBBUk1fU1lTU1QpOwotCi0JLyogRmluZCB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZnJlcXVlbmN5IGFuZCBlbmFibGUgaXQgKi8KLQlpZiAoc2VsZWN0X3RhYmxlX3JhdGUoJnZpcnR1YWxfY2tfbXB1LCB+MCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTeXN0ZW0gZnJlcXVlbmNpZXMgbm90IHNldC4gQ2hlY2sgeW91ciBjb25maWcuXG4iKTsKLQkJLyogR3Vlc3Mgc2FuZSB2YWx1ZXMgKDYwTUh6KSAqLwotCQlvbWFwX3dyaXRldygweDIyOTAsIERQTExfQ1RMKTsKLQkJb21hcF93cml0ZXcoMHgxMDA1LCBBUk1fQ0tDVEwpOwotCQlja19kcGxsMS5yYXRlID0gNjAwMDAwMDA7Ci0JCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7Ci0JCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogJWxkLyVsZC8lbGRcbiIsCi0JCSAgICAgICBja19yZWYucmF0ZSwgY2tfZHBsbDEucmF0ZSwgYXJtX2NrLnJhdGUpOwotCX0KLQotCS8qIENhY2hlIHJhdGVzIGZvciBjbG9ja3MgY29ubmVjdGVkIHRvIGNrX3JlZiAobm90IGRwbGwxKSAqLwotCXByb3BhZ2F0ZV9yYXRlKCZja19yZWYpOwotCi0jaWZkZWYgQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMgotCS8qIFNlbGVjdCBzbGljZXIgb3V0cHV0IGFzIE9NQVAgaW5wdXQgY2xvY2sgKi8KLQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KE9NQVA3MzBfUENDX1VQTERfQ1RSTCkgJiB+MHgxLCBPTUFQNzMwX1BDQ19VUExEX0NUUkwpOwotI2VuZGlmCi0KLQkvKiBUdXJuIG9mZiBEU1AgYW5kIEFSTV9USU1YTy4gTWFrZSBzdXJlIEFSTV9JTlRIQ0sgaXMgbm90IGRpdmlkZWQgKi8KLQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KEFSTV9DS0NUTCkgJiAweDBmZmYsIEFSTV9DS0NUTCk7Ci0KLQkvKiBQdXQgRFNQL01QVUkgaW50byByZXNldCB1bnRpbCBuZWVkZWQgKi8KLQlvbWFwX3dyaXRldygwLCBBUk1fUlNUQ1QxKTsKLQlvbWFwX3dyaXRldygxLCBBUk1fUlNUQ1QyKTsKLQlvbWFwX3dyaXRldygweDQwMCwgQVJNX0lETEVDVDEpOwotCi0JLyoKLQkgKiBBY2NvcmRpbmcgdG8gT01BUDU5MTAgRXJyYXR1bSBTWVNfRE1BXzEsIGJpdCBETUFDS19SRVEgKGJpdCA4KQotCSAqIG9mIHRoZSBBUk1fSURMRUNUMiByZWdpc3RlciBtdXN0IGJlIHNldCB0byB6ZXJvLiBUaGUgcG93ZXItb24KLQkgKiBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYml0IGlzIG9uZS4KLQkgKi8KLQlvbWFwX3dyaXRldygweDAwMDAsIEFSTV9JRExFQ1QyKTsJLyogVHVybiBMQ0QgY2xvY2sgb2ZmIGFsc28gKi8KLQotCS8qCi0JICogT25seSBlbmFibGUgdGhvc2UgY2xvY2tzIHdlIHdpbGwgbmVlZCwgbGV0IHRoZSBkcml2ZXJzCi0JICogZW5hYmxlIG90aGVyIGNsb2NrcyBhcyBuZWNlc3NhcnkKLQkgKi8KLQljbGtfdXNlKCZhcm1wZXJfY2spOwotCWNsa191c2UoJmFybXhvcl9jayk7Ci0JY2xrX3VzZSgmYXJtdGltX2NrKTsKLQotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKLQkJY2xrX2VuYWJsZSgmYXJtX2dwaW9fY2spOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvY2xvY2suaCBiL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGMwZGRkLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9jbG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2Nsb2NrLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIGNvcnBvcmF0aW9uCi0gKiAgV3JpdHRlbiBieSBUdXVra2EgVGlra2FuZW4gPHR1dWtrYS50aWtrYW5lbkBlbGVrdHJvYml0LmNvbT4KLSAqICBCYXNlZCBvbiBjbG9ja3MuaCBieSBUb255IExpbmRncmVuLCBHb3Jkb24gTWNOdXR0IGFuZCBSaWRnZVJ1biwgSW5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVJDSF9BUk1fT01BUF9DTE9DS19ICi0jZGVmaW5lIF9fQVJDSF9BUk1fT01BUF9DTE9DS19ICi0KLXN0cnVjdCBtb2R1bGU7Ci0KLXN0cnVjdCBjbGsgewotCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKLQlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7Ci0JY29uc3QgY2hhcgkJKm5hbWU7Ci0Jc3RydWN0IGNsawkJKnBhcmVudDsKLQl1bnNpZ25lZCBsb25nCQlyYXRlOwotCV9fczgJCQl1c2Vjb3VudDsKLQlfX3UxNgkJCWZsYWdzOwotCV9fdTMyCQkJZW5hYmxlX3JlZzsKLQlfX3U4CQkJZW5hYmxlX2JpdDsKLQlfX3U4CQkJcmF0ZV9vZmZzZXQ7Ci0Jdm9pZAkJCSgqcmVjYWxjKShzdHJ1Y3QgY2xrICopOwotCWludAkJCSgqc2V0X3JhdGUpKHN0cnVjdCBjbGsgKiwgdW5zaWduZWQgbG9uZyk7Ci0JbG9uZwkJCSgqcm91bmRfcmF0ZSkoc3RydWN0IGNsayAqLCB1bnNpZ25lZCBsb25nKTsKLQl2b2lkCQkJKCppbml0KShzdHJ1Y3QgY2xrICopOwotfTsKLQotCi1zdHJ1Y3QgbXB1X3JhdGUgewotCXVuc2lnbmVkIGxvbmcJCXJhdGU7Ci0JdW5zaWduZWQgbG9uZwkJeHRhbDsKLQl1bnNpZ25lZCBsb25nCQlwbGxfcmF0ZTsKLQlfX3UxNgkJCWNrY3RsX3ZhbDsKLQlfX3UxNgkJCWRwbGxjdGxfdmFsOwotfTsKLQotCi0vKiBDbG9jayBmbGFncyAqLwotI2RlZmluZSBSQVRFX0NLQ1RMCQkxCi0jZGVmaW5lIFJBVEVfRklYRUQJCTIKLSNkZWZpbmUgUkFURV9QUk9QQUdBVEVTCQk0Ci0jZGVmaW5lIFZJUlRVQUxfQ0xPQ0sJCTgKLSNkZWZpbmUgQUxXQVlTX0VOQUJMRUQJCTE2Ci0jZGVmaW5lIEVOQUJMRV9SRUdfMzJCSVQJMzIKLSNkZWZpbmUgQ0xPQ0tfSU5fT01BUDE2WFgJNjQKLSNkZWZpbmUgQ0xPQ0tfSU5fT01BUDE1MTAJMTI4Ci0jZGVmaW5lIENMT0NLX0lOX09NQVA3MzAJMjU2Ci0KLS8qIEFSTV9DS0NUTCBiaXQgc2hpZnRzICovCi0jZGVmaW5lIENLQ1RMX1BFUkRJVl9PRkZTRVQJMAotI2RlZmluZSBDS0NUTF9MQ0RESVZfT0ZGU0VUCTIKLSNkZWZpbmUgQ0tDVExfQVJNRElWX09GRlNFVAk0Ci0jZGVmaW5lIENLQ1RMX0RTUERJVl9PRkZTRVQJNgotI2RlZmluZSBDS0NUTF9UQ0RJVl9PRkZTRVQJOAotI2RlZmluZSBDS0NUTF9EU1BNTVVESVZfT0ZGU0VUCTEwCi0vKiNkZWZpbmUgQVJNX1RJTVhPCQkxMiovCi0jZGVmaW5lIEVOX0RTUENLCQkxMwotLyojZGVmaW5lIEFSTV9JTlRIQ0tfU0VMCTE0Ki8gLyogRGl2aWRlLWJ5LTIgZm9yIG1wdSBpbnRoX2NrICovCi0KLS8qIEFSTV9JRExFQ1QxIGJpdCBzaGlmdHMgKi8KLS8qI2RlZmluZSBJRExXRFRfQVJNCTAqLwotLyojZGVmaW5lIElETFhPUlBfQVJNCTEqLwotLyojZGVmaW5lIElETFBFUl9BUk0JMiovCi0vKiNkZWZpbmUgSURMTENEX0FSTQkzKi8KLS8qI2RlZmluZSBJRExMQl9BUk0JNCovCi0vKiNkZWZpbmUgSURMSFNBQl9BUk0JNSovCi0vKiNkZWZpbmUgSURMSUZfQVJNCTYqLwotLyojZGVmaW5lIElETERQTExfQVJNCTcqLwotLyojZGVmaW5lIElETEFQSV9BUk0JOCovCi0vKiNkZWZpbmUgSURMVElNX0FSTQk5Ki8KLS8qI2RlZmluZSBTRVRBUk1fSURMRQkxMSovCi0KLS8qIEFSTV9JRExFQ1QyIGJpdCBzaGlmdHMgKi8KLSNkZWZpbmUgRU5fV0RUQ0sJMAotI2RlZmluZSBFTl9YT1JQQ0sJMQotI2RlZmluZSBFTl9QRVJDSwkyCi0jZGVmaW5lIEVOX0xDRENLCTMKLSNkZWZpbmUgRU5fTEJDSwkJNCAvKiBOb3Qgb24gMTYxMC8xNzEwICovCi0vKiNkZWZpbmUgRU5fSFNBQkNLCTUqLwotI2RlZmluZSBFTl9BUElDSwk2Ci0jZGVmaW5lIEVOX1RJTUNLCTcKLSNkZWZpbmUgRE1BQ0tfUkVRCTgKLSNkZWZpbmUgRU5fR1BJT0NLCTkgLyogTm90IG9uIDE2MTAvMTcxMCAqLwotLyojZGVmaW5lIEVOX0xCRlJFRUNLCTEwKi8KLSNkZWZpbmUgRU5fQ0tPVVRfQVJNCTExCi0KLS8qIEFSTV9JRExFQ1QzIGJpdCBzaGlmdHMgKi8KLSNkZWZpbmUgRU5fT0NQSV9DSwkwCi0jZGVmaW5lIEVOX1RDMV9DSwkyCi0jZGVmaW5lIEVOX1RDMl9DSwk0Ci0KLS8qIFZhcmlvdXMgcmVnaXN0ZXIgZGVmaW5lcyBmb3IgY2xvY2sgY29udHJvbHMgc2NhdHRlcmVkIGFyb3VuZCBPTUFQIGNoaXAgKi8KLSNkZWZpbmUgVVNCX01DTEtfRU5fQklUCQk0CS8qIEluIFVMUERfQ0xLQ19DVFJMICovCi0jZGVmaW5lIFVTQl9IT1NUX0hIQ19VSE9TVF9FTgk5CS8qIEluIE1PRF9DT05GX0NUUkxfMCAqLwotI2RlZmluZSBTV0RfVUxQRF9QTExfQ0xLX1JFUQkxCS8qIEluIFNXRF9DTEtfRElWX0NUUkxfU0VMICovCi0jZGVmaW5lIENPTV9VTFBEX1BMTF9DTEtfUkVRCTEJLyogSW4gQ09NX0NMS19ESVZfQ1RSTF9TRUwgKi8KLSNkZWZpbmUgU1dEX0NMS19ESVZfQ1RSTF9TRUwJMHhmZmZlMDg3NAotI2RlZmluZSBDT01fQ0xLX0RJVl9DVFJMX1NFTAkweGZmZmUwODc4Ci0KLQotaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwotdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspOwotaW50IGNsa19pbml0KHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1Y2RlNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uYwotICoKLSAqIENvZGUgY29tbW9uIHRvIGFsbCBPTUFQIG1hY2hpbmVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KLQotI2luY2x1ZGUgImNsb2NrLmgiCi0KLSNkZWZpbmUgREVCVUcgMQotCi1zdHJ1Y3Qgb21hcF9pZCB7Ci0JdTE2CWp0YWdfaWQ7CS8qIFVzZWQgdG8gZGV0ZXJtaW5lIE9NQVAgdHlwZSAqLwotCXU4CWRpZV9yZXY7CS8qIFByb2Nlc3NvciByZXZpc2lvbiAqLwotCXUzMglvbWFwX2lkOwkvKiBPTUFQIHJldmlzaW9uICovCi0JdTMyCXR5cGU7CQkvKiBDcHUgaWQgYml0cyBbMzE6MDhdLCBjcHUgY2xhc3MgYml0cyBbMDc6MDBdICovCi19OwotCi0vKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAuanRhZ19pZCA9IDB4MzU1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDA3MzAwMTAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MDczMDAzMDB9LAotCXsgLmp0YWdfaWQgPSAweGI0NzAsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMTAxMDAsIC50eXBlID0gMHgxNTEwMDAwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDE2MTAwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMTAwMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjEwMGMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTAwZDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNjEzLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMzAwLCAudHlwZSA9IDB4MTYxMGVmMDB9LAotCXsgLmp0YWdfaWQgPSAweGI2MTMsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAzMDAsIC50eXBlID0gMHgxNjEwZWYwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTEwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNThjLCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMTBiMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1OGMsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjExMGMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDQwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwNDAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAotCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA1MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCi0JeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMzMDAwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKLQl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzMwMTAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAotCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMzAxMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCi19OwotCi0vKgotICogR2V0IE9NQVAgdHlwZSBmcm9tIFBST0RfSUQuCi0gKiAxNzEwIGhhcyB0aGUgUFJPRF9JRCBpbiBiaXRzIDE1OjAwLCBub3QgaW4gMTY6MDEgYXMgZG9jdW1lbnRlZCBpbiBUUk0uCi0gKiAxNTEwIFBST0RfSUQgaXMgZW1wdHksIGFuZCAxNjEwIFBST0RfSUQgZG9lcyBub3QgbWFrZSBzZW5zZS4KLSAqIFVuZG9jdW1lbnRlZCByZWdpc3RlciBpbiBURVNUIEJMT0NLIGlzIHVzZWQgYXMgZmFsbGJhY2s7IFRoaXMgc2VlbXMgdG8KLSAqIHdvcmsgb24gMTUxMCwgMTYxMCAmIDE3MTAuIFRoZSBvZmZpY2lhbCB3YXkgaG9wZWZ1bGx5IHdpbGwgd29yayBpbiBmdXR1cmUKLSAqIHByb2Nlc3NvcnMuCi0gKi8KLXN0YXRpYyB1MTYgX19pbml0IG9tYXBfZ2V0X2p0YWdfaWQodm9pZCkKLXsKLQl1MzIgcHJvZF9pZCwgb21hcF9pZDsKLQotCXByb2RfaWQgPSBvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKTsKLQlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMSk7Ci0KLQkvKiBDaGVjayBmb3IgdW51c2FibGUgT01BUF9QUk9EVUNUSU9OX0lEXzEgb24gMTYxMUIvNTkxMiBhbmQgNzMwICovCi0JaWYgKCgocHJvZF9pZCA+PiAyMCkgPT0gMCkgfHwgKHByb2RfaWQgPT0gb21hcF9pZCkpCi0JCXByb2RfaWQgPSAwOwotCWVsc2UKLQkJcHJvZF9pZCAmPSAweGZmZmY7Ci0KLQlpZiAocHJvZF9pZCkKLQkJcmV0dXJuIHByb2RfaWQ7Ci0KLQkvKiBVc2UgT01BUDMyX0lEXzEgYXMgZmFsbGJhY2sgKi8KLQlwcm9kX2lkID0gKChvbWFwX2lkID4+IDEyKSAmIDB4ZmZmZik7Ci0KLQlyZXR1cm4gcHJvZF9pZDsKLX0KLQotLyoKLSAqIEdldCBPTUFQIHJldmlzaW9uIGZyb20gRElFX1JFVi4KLSAqIEVhcmx5IDE3MTAgcHJvY2Vzc29ycyBtYXkgaGF2ZSBicm9rZW4gT01BUF9ESUVfSUQsIGl0IGNvbnRhaW5zIFBST0RfSUQuCi0gKiBVbmRvY3VtZW50ZWQgcmVnaXN0ZXIgaW4gdGhlIFRFU1QgQkxPQ0sgaXMgdXNlZCBhcyBmYWxsYmFjay4KLSAqIFJFVklTSVQ6IFRoaXMgZG9lcyBub3Qgc2VlbSB0byB3b3JrIG9uIDE1MTAKLSAqLwotc3RhdGljIHU4IF9faW5pdCBvbWFwX2dldF9kaWVfcmV2KHZvaWQpCi17Ci0JdTMyIGRpZV9yZXY7Ci0KLQlkaWVfcmV2ID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKTsKLQotCS8qIENoZWNrIGZvciBicm9rZW4gT01BUF9ESUVfSUQgb24gZWFybHkgMTcxMCAqLwotCWlmICgoKGRpZV9yZXYgPj4gMTIpICYgMHhmZmZmKSA9PSBvbWFwX2dldF9qdGFnX2lkKCkpCi0JCWRpZV9yZXYgPSAwOwotCi0JZGllX3JldiA9IChkaWVfcmV2ID4+IDE3KSAmIDB4ZjsKLQlpZiAoZGllX3JldikKLQkJcmV0dXJuIGRpZV9yZXY7Ci0KLQlkaWVfcmV2ID0gKG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpID4+IDI4KSAmIDB4ZjsKLQotCXJldHVybiBkaWVfcmV2OwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKQotewotCWludCBpOwotCXUxNiBqdGFnX2lkOwotCXU4IGRpZV9yZXY7Ci0JdTMyIG9tYXBfaWQ7Ci0JdTggY3B1X3R5cGU7Ci0KLQlqdGFnX2lkID0gb21hcF9nZXRfanRhZ19pZCgpOwotCWRpZV9yZXYgPSBvbWFwX2dldF9kaWVfcmV2KCk7Ci0Jb21hcF9pZCA9IG9tYXBfcmVhZGwoT01BUDMyX0lEXzApOwotCi0jaWZkZWYgREVCVUcKLQlwcmludGsoIk9NQVBfRElFX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKSk7Ci0JcHJpbnRrKCJPTUFQX0RJRV9JRF8xOiAweCUwOHggRElFX1JFVjogJWlcbiIsCi0JCW9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSksCi0JICAgICAgIChvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpID4+IDE3KSAmIDB4Zik7Ci0JcHJpbnRrKCJPTUFQX1BST0RVQ1RJT05fSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8wKSk7Ci0JcHJpbnRrKCJPTUFQX1BST0RVQ1RJT05fSURfMTogMHglMDh4IEpUQUdfSUQ6IDB4JTA0eFxuIiwKLQkJb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSksCi0JCW9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzEpICYgMHhmZmZmKTsKLQlwcmludGsoIk9NQVAzMl9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUDMyX0lEXzApKTsKLQlwcmludGsoIk9NQVAzMl9JRF8xOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpKTsKLQlwcmludGsoIkpUQUdfSUQ6IDB4JTA0eCBESUVfUkVWOiAlaVxuIiwganRhZ19pZCwgZGllX3Jldik7Ci0jZW5kaWYKLQotCXN5c3RlbV9zZXJpYWxfaGlnaCA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMCk7Ci0Jc3lzdGVtX3NlcmlhbF9sb3cgPSBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzEpOwotCi0JLyogRmlyc3QgY2hlY2sgb25seSB0aGUgbWFqb3IgdmVyc2lvbiBpbiBhIHNhZmUgd2F5ICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKLQkJaWYgKGp0YWdfaWQgPT0gKG9tYXBfaWRzW2ldLmp0YWdfaWQpKSB7Ci0JCQlzeXN0ZW1fcmV2ID0gb21hcF9pZHNbaV0udHlwZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgaWYgd2UgY2FuIGZpbmQgdGhlIGRpZSByZXZpc2lvbiAqLwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9tYXBfaWRzKTsgaSsrKSB7Ci0JCWlmIChqdGFnX2lkID09IG9tYXBfaWRzW2ldLmp0YWdfaWQgJiYgZGllX3JldiA9PSBvbWFwX2lkc1tpXS5kaWVfcmV2KSB7Ci0JCQlzeXN0ZW1fcmV2ID0gb21hcF9pZHNbaV0udHlwZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogRmluYWxseSBjaGVjayBhbHNvIHRoZSBvbWFwX2lkICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKLQkJaWYgKGp0YWdfaWQgPT0gb21hcF9pZHNbaV0uanRhZ19pZAotCQkgICAgJiYgZGllX3JldiA9PSBvbWFwX2lkc1tpXS5kaWVfcmV2Ci0JCSAgICAmJiBvbWFwX2lkID09IG9tYXBfaWRzW2ldLm9tYXBfaWQpIHsKLQkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiBBZGQgdGhlIGNwdSBjbGFzcyBpbmZvICg3eHgsIDE1eHgsIDE2eHgsIDI0eHgpICovCi0JY3B1X3R5cGUgPSBzeXN0ZW1fcmV2ID4+IDI0OwotCi0Jc3dpdGNoIChjcHVfdHlwZSkgewotCWNhc2UgMHgwNzoKLQkJc3lzdGVtX3JldiB8PSAweDA3OwotCQlicmVhazsKLQljYXNlIDB4MTU6Ci0JCXN5c3RlbV9yZXYgfD0gMHgxNTsKLQkJYnJlYWs7Ci0JY2FzZSAweDE2OgotCWNhc2UgMHgxNzoKLQkJc3lzdGVtX3JldiB8PSAweDE2OwotCQlicmVhazsKLQljYXNlIDB4MjQ6Ci0JCXN5c3RlbV9yZXYgfD0gMHgyNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIE9NQVAgY3B1IHR5cGU6IDB4JTAyeFxuIiwgY3B1X3R5cGUpOwotCX0KLQotCXByaW50aygiT01BUCUwNHgiLCBzeXN0ZW1fcmV2ID4+IDE2KTsKLQlpZiAoKHN5c3RlbV9yZXYgPj4gOCkgJiAweGZmKQotCQlwcmludGsoIiV4IiwgKHN5c3RlbV9yZXYgPj4gOCkgJiAweGZmKTsKLQlwcmludGsoIiByZXZpc2lvbiAlaSBoYW5kbGVkIGFzICUwMnh4eCBpZDogJTA4eCUwOHhcbiIsCi0JICAgICAgIGRpZV9yZXYsIHN5c3RlbV9yZXYgJiAweGZmLCBzeXN0ZW1fc2VyaWFsX2xvdywKLQkgICAgICAgc3lzdGVtX3NlcmlhbF9oaWdoKTsKLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE9NQVAgSS9PIG1hcHBpbmcKLSAqCi0gKiBUaGUgbWFjaGluZSBzcGVjaWZpYyBjb2RlIG1heSBwcm92aWRlIHRoZSBleHRyYSBtYXBwaW5nIGJlc2lkZXMgdGhlCi0gKiBkZWZhdWx0IG1hcHBpbmcgcHJvdmlkZWQgaGVyZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0geyBJT19WSVJULCAgICAgIAlJT19QSFlTLCAgICAgICAgICAgICBJT19TSVpFLCAgICAgICAgCSAgIE1UX0RFVklDRSB9LAotfTsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDczMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLSB7IE9NQVA3MzBfRFNQX0JBU0UsICAgIE9NQVA3MzBfRFNQX1NUQVJULCAgICBPTUFQNzMwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKLSB7IE9NQVA3MzBfRFNQUkVHX0JBU0UsIE9NQVA3MzBfRFNQUkVHX1NUQVJULCBPTUFQNzMwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKLSB7IE9NQVA3MzBfU1JBTV9CQVNFLCAgIE9NQVA3MzBfU1JBTV9TVEFSVCwgICBPTUFQNzMwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQotfTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE1MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0geyBPTUFQMTUxMF9EU1BfQkFTRSwgICAgT01BUDE1MTBfRFNQX1NUQVJULCAgICBPTUFQMTUxMF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCi0geyBPTUFQMTUxMF9EU1BSRUdfQkFTRSwgT01BUDE1MTBfRFNQUkVHX1NUQVJULCBPTUFQMTUxMF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCi0geyBPTUFQMTUxMF9TUkFNX0JBU0UsICAgT01BUDE1MTBfU1JBTV9TVEFSVCwgICBPTUFQMTUxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNjEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDE2MTBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXA1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAotIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAotLyoKLSAqIFRoZSBPTUFQNTkxMiBoYXMgMjUwa0J5dGUgaW50ZXJuYWwgU1JBTS4gQmVjYXVzZSB0aGUgbWFwcGluZyBpcyBiYXNlZWQgb24gcGFnZQotICogc2l6ZSAoNGtCeXRlKSwgaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCAya0J5dGUgKD0weDgwMCkgb2YgdGhlIDI1MGtCeXRlIGFyZSBub3QgbWFwcGVkLgotICogQWRkIGFkZGl0aW9uYWwgMmtCeXRlICgweDgwMCkgc28gdGhhdCB0aGUgbGFzdCBwYWdlIGlzIG1hcHBlZCBhbmQgdGhlIGxhc3QgMmtCeXRlCi0gKiBjYW4gYmUgdXNlZC4KLSAqLwotIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDU5MTJfU1JBTV9TSVpFICsgMHg4MDAsICAgTVRfREVWSUNFIH0KLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBfb21hcF9tYXBfaW8odm9pZCkKLXsKLQlpbml0aWFsaXplZCA9IDE7Ci0KLQkvKiBXZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIElPIHNwYWNlIG1hcHBpbmcgYmVmb3JlIHdlIGNhbiBydW4KLQkgKiBjcHVfaXNfb21hcHh4eCgpIG1hY3Jvcy4gKi8KLQlpb3RhYmxlX2luaXQob21hcF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfaW9fZGVzYykpOwotCW9tYXBfY2hlY2tfcmV2aXNpb24oKTsKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKLQlpZiAoY3B1X2lzX29tYXA3MzAoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDczMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA3MzBfaW9fZGVzYykpOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWlvdGFibGVfaW5pdChvbWFwMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNTEwX2lvX2Rlc2MpKTsKLQl9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDE2MTBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTYxMF9pb19kZXNjKSk7Ci0JfQotCWlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQlpb3RhYmxlX2luaXQob21hcDU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwNTkxMl9pb19kZXNjKSk7Ci0JfQotI2VuZGlmCi0KLQkvKiBSRVZJU0lUOiBSZWZlciB0byBPTUFQNTkxMCBFcnJhdGEsIEFkdmlzb3J5IFNZU18xOiAiVGltZW91dCBBYm9ydAotCSAqIG9uIGEgUG9zdGVkIFdyaXRlIGluIHRoZSBUSVBCIEJyaWRnZSIuCi0JICovCi0Jb21hcF93cml0ZXcoMHgwLCBNUFVfUFVCTElDX1RJUEJfQ05UTCk7Ci0Jb21hcF93cml0ZXcoMHgwLCBNUFVfUFJJVkFURV9USVBCX0NOVEwpOwotCi0JLyogTXVzdCBpbml0IGNsb2NrcyBlYXJseSB0byBhc3N1cmUgdGhhdCB0aW1lciBpbnRlcnJ1cHQgd29ya3MKLQkgKi8KLQljbGtfaW5pdCgpOwotfQotCi0vKgotICogVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAotICovCi12b2lkIG9tYXBfbWFwX2lvKHZvaWQpCi17Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJX29tYXBfbWFwX2lvKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG9tYXBfc2VyaWFsX2luKHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqdXAsCi0JCQkJCSAgaW50IG9mZnNldCkKLXsKLQlvZmZzZXQgPDw9IHVwLT5yZWdzaGlmdDsKLQlyZXR1cm4gKHVuc2lnbmVkIGludClfX3Jhd19yZWFkYih1cC0+bWVtYmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX3NlcmlhbF9vdXRwKHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcCwgaW50IG9mZnNldCwKLQkJCQkgICAgaW50IHZhbHVlKQotewotCW9mZnNldCA8PD0gcC0+cmVnc2hpZnQ7Ci0JX19yYXdfd3JpdGViKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0KTsKLX0KLQotLyoKLSAqIEludGVybmFsIFVBUlRzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgZm9yIHRoZSA4MjUwIGF1dG9jb25maWcgdG8gd29yawotICogcHJvcGVybHkuIE5vdGUgdGhhdCB0aGUgVFggd2F0ZXJtYXJrIGluaXRpYWxpemF0aW9uIG1heSBub3QgYmUgbmVlZGVkCi0gKiBvbmNlIHRoZSA4MjUwLmMgd2F0ZXJtYXJrIGhhbmRsaW5nIGNvZGUgaXMgbWVyZ2VkLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF9zZXJpYWxfcmVzZXQoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwKQotewotCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX01EUjEsIDB4MDcpOwkvKiBkaXNhYmxlIFVBUlQgKi8KLQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9TQ1IsIDB4MDgpOwkvKiBUWCB3YXRlcm1hcmsgKi8KLQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9NRFIxLCAweDAwKTsJLyogZW5hYmxlIFVBUlQgKi8KLQotCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfU1lTQywgMHgwMSk7Ci0JCXdoaWxlICghKG9tYXBfc2VyaWFsX2luKHAsIFVBUlRfT01BUF9TWVNDKSAmIDB4MDEpKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgc2VyaWFsX3BsYXRmb3JtX2RhdGFbXSA9IHsKLQl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUMV9CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQxX0JBU0UsCi0JCS5pcnEJCT0gSU5UX1VBUlQxLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCi0JfSwKLQl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUMl9CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQyX0JBU0UsCi0JCS5pcnEJCT0gSU5UX1VBUlQyLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCi0JfSwKLQl7Ci0JCS5tZW1iYXNlCT0gKGNoYXIqKUlPX0FERFJFU1MoT01BUF9VQVJUM19CQVNFKSwKLQkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZylPTUFQX1VBUlQzX0JBU0UsCi0JCS5pcnEJCT0gSU5UX1VBUlQzLAotCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5yZWdzaGlmdAk9IDIsCi0JCS51YXJ0Y2xrCT0gT01BUDE2WFhfQkFTRV9CQVVEICogMTYsCi0JfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZXJpYWxfZGV2aWNlID0gewotCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCi0JLmlkCQkJPSAwLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSBzZXJpYWxfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotLyoKLSAqIE5vdGUgdGhhdCBvbiBJbm5vdmF0b3ItMTUxMCBVQVJUMiBwaW5zIGNvbmZsaWN0IHdpdGggVVNCMi4KLSAqIEJ5IGRlZmF1bHQgVUFSVDIgZG9lcyBub3Qgd29yayBvbiBJbm5vdmF0b3ItMTUxMCBpZiB5b3UgaGF2ZQotICogVVNCIE9IQ0kgZW5hYmxlZC4gVG8gdXNlIFVBUlQyLCB5b3UgbXVzdCBkaXNhYmxlIFVTQjIgZmlyc3QuCi0gKi8KLXZvaWQgX19pbml0IG9tYXBfc2VyaWFsX2luaXQoaW50IHBvcnRzW09NQVBfTUFYX05SX1BPUlRTXSkKLXsKLQlpbnQgaTsKLQotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLnJlZ3NoaWZ0ID0gMDsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0ucmVnc2hpZnQgPSAwOwotCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS5pcnEgPSBJTlRfNzMwX1VBUlRfTU9ERU1fMTsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMV0uaXJxID0gSU5UXzczMF9VQVJUX01PREVNX0lSREFfMjsKLQl9Ci0KLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OwotCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7Ci0JCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzJdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT01BUF9NQVhfTlJfUE9SVFM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyIHJlZzsKLQotCQlpZiAocG9ydHNbaV0gPT0gMCkgewotCQkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0ubWVtYmFzZSA9IDA7Ci0JCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXS5tYXBiYXNlID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3dpdGNoIChpKSB7Ci0JCWNhc2UgMDoKLQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMV9UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQxX1JUUyk7Ci0JCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgewotCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00xX0VOOwotCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMl9UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQyX1JUUyk7Ci0JCQkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSkgewotCQkJCQlyZWcgPSBmcGdhX3JlYWQoT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXJlZyB8PSBPTUFQMTUxMF9GUEdBX1BDUl9DT00yX0VOOwotCQkJCQlmcGdhX3dyaXRlKHJlZywgT01BUDE1MTBfRlBHQV9QT1dFUik7Ci0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkJCW9tYXBfY2ZnX3JlZyhVQVJUM19UWCk7Ci0JCQkJb21hcF9jZmdfcmVnKFVBUlQzX1JYKTsKLQkJCX0KLQkJCWlmIChjcHVfaXNfb21hcDE3MTAoKSkgewotCQkJCWNsa19lbmFibGUoY2xrX2dldCgwLCAidWFydDNfY2siKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlvbWFwX3NlcmlhbF9yZXNldCgmc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0pOwotCX0KLX0KLQotc3RhdGljIGludCBfX2luaXQgb21hcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7Ci19Ci1hcmNoX2luaXRjYWxsKG9tYXBfaW5pdCk7Ci0KLSNkZWZpbmUgTk9fTEVOR1RIX0NIRUNLIDB4ZmZmZmZmZmYKLQotZXh0ZXJuIGludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKLWV4dGVybiB1OCBvbWFwX2Jvb3Rsb2FkZXJfdGFnW107Ci0KLXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKm9tYXBfYm9hcmRfY29uZmlnOwotaW50IG9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSAwOwotCi1zdGF0aWMgY29uc3Qgdm9pZCAqZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgc2tpcCwgc2l6ZV90ICpsZW5fb3V0KQotewotCXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgKmtpbmZvID0gTlVMTDsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19PTUFQX0JPT1RfVEFHCi0Jc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICppbmZvID0gTlVMTDsKLQotCWlmIChvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbiA+IDQpCi0JCWluZm8gPSAoc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICopIG9tYXBfYm9vdGxvYWRlcl90YWc7Ci0Jd2hpbGUgKGluZm8gIT0gTlVMTCkgewotCQl1OCAqbmV4dDsKLQotCQlpZiAoaW5mby0+dGFnID09IHRhZykgewotCQkJaWYgKHNraXAgPT0gMCkKLQkJCQlicmVhazsKLQkJCXNraXAtLTsKLQkJfQotCi0JCWlmICgoaW5mby0+bGVuICYgMHgwMykgIT0gMCkgewotCQkJLyogV2UgYmFpbCBvdXQgdG8gYXZvaWQgYW4gYWxpZ25tZW50IGZhdWx0ICovCi0JCQlwcmludGsoS0VSTl9FUlIgIk9NQVAgcGVyaXBoZXJhbCBjb25maWc6IExlbmd0aCAoJWQpIG5vdCB3b3JkLWFsaWduZWQgKHRhZyAlMDR4KVxuIiwKLQkJCSAgICAgICBpbmZvLT5sZW4sIGluZm8tPnRhZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQluZXh0ID0gKHU4ICopIGluZm8gKyBzaXplb2YoKmluZm8pICsgaW5mby0+bGVuOwotCQlpZiAobmV4dCA+PSBvbWFwX2Jvb3Rsb2FkZXJfdGFnICsgb21hcF9ib290bG9hZGVyX3RhZ19sZW4pCi0JCQlpbmZvID0gTlVMTDsKLQkJZWxzZQotCQkJaW5mbyA9IChzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgKikgbmV4dDsKLQl9Ci0JaWYgKGluZm8gIT0gTlVMTCkgewotCQkvKiBDaGVjayB0aGUgbGVuZ3RoIGFzIGEgbGFtZSBhdHRlbXB0IHRvIGNoZWNrIGZvcgotCQkgKiBiaW5hcnkgaW5jb25zaXN0YW5jeS4gKi8KLQkJaWYgKGxlbiAhPSBOT19MRU5HVEhfQ0hFQ0spIHsKLQkJCS8qIFdvcmQtYWxpZ24gbGVuICovCi0JCQlpZiAobGVuICYgMHgwMykKLQkJCQlsZW4gPSAobGVuICsgMykgJiB+MHgwMzsKLQkJCWlmIChpbmZvLT5sZW4gIT0gbGVuKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIHBlcmlwaGVyYWwgY29uZmlnOiBMZW5ndGggbWlzbWF0Y2ggd2l0aCB0YWcgJXggKHdhbnQgJWQsIGdvdCAlZClcbiIsCi0JCQkJICAgICAgIHRhZywgbGVuLCBpbmZvLT5sZW4pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCWlmIChsZW5fb3V0ICE9IE5VTEwpCi0JCQkqbGVuX291dCA9IGluZm8tPmxlbjsKLQkJcmV0dXJuIGluZm8tPmRhdGE7Ci0JfQotI2VuZGlmCi0JLyogVHJ5IHRvIGZpbmQgdGhlIGNvbmZpZyBmcm9tIHRoZSBib2FyZC1zcGVjaWZpYyBzdHJ1Y3R1cmVzCi0JICogaW4gdGhlIGtlcm5lbC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgb21hcF9ib2FyZF9jb25maWdfc2l6ZTsgaSsrKSB7Ci0JCWlmIChvbWFwX2JvYXJkX2NvbmZpZ1tpXS50YWcgPT0gdGFnKSB7Ci0JCQlraW5mbyA9ICZvbWFwX2JvYXJkX2NvbmZpZ1tpXTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChraW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4ga2luZm8tPmRhdGE7Ci19Ci0KLWNvbnN0IHZvaWQgKl9fb21hcF9nZXRfY29uZmlnKHUxNiB0YWcsIHNpemVfdCBsZW4sIGludCBucikKLXsKLSAgICAgICAgcmV0dXJuIGdldF9jb25maWcodGFnLCBsZW4sIG5yLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0woX19vbWFwX2dldF9jb25maWcpOwotCi1jb25zdCB2b2lkICpvbWFwX2dldF92YXJfY29uZmlnKHUxNiB0YWcsIHNpemVfdCAqbGVuKQotewotICAgICAgICByZXR1cm4gZ2V0X2NvbmZpZyh0YWcsIE5PX0xFTkdUSF9DSEVDSywgMCwgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0wob21hcF9nZXRfdmFyX2NvbmZpZyk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfYWRkX3NlcmlhbF9jb25zb2xlKHZvaWQpCi17Ci0JY29uc3Qgc3RydWN0IG9tYXBfdWFydF9jb25maWcgKmluZm87Ci0KLQlpbmZvID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX1VBUlQsIHN0cnVjdCBvbWFwX3VhcnRfY29uZmlnKTsKLQlpZiAoaW5mbyAhPSBOVUxMICYmIGluZm8tPmNvbnNvbGVfdWFydCkgewotCQlzdGF0aWMgY2hhciBzcGVlZFsxMV0sICpvcHQgPSBOVUxMOwotCi0JCWlmIChpbmZvLT5jb25zb2xlX3NwZWVkKSB7Ci0JCQlzbnByaW50ZihzcGVlZCwgc2l6ZW9mKHNwZWVkKSwgIiV1IiwgaW5mby0+Y29uc29sZV9zcGVlZCk7Ci0JCQlvcHQgPSBzcGVlZDsKLQkJfQotCQlyZXR1cm4gYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlTIiwgaW5mby0+Y29uc29sZV91YXJ0IC0gMSwgb3B0KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1jb25zb2xlX2luaXRjYWxsKG9tYXBfYWRkX3NlcmlhbF9jb25zb2xlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtb21hcC9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2Mjg1OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2NvbW1vbi5oCi0gKgotICogSGVhZGVyIGZvciBjb2RlIGNvbW1vbiB0byBhbGwgT01BUCBtYWNoaW5lcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KLSAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX09NQVBfQ09NTU9OX0gKLSNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX09NQVBfQ09NTU9OX0gKLQotc3RydWN0IHN5c190aW1lcjsKLQotZXh0ZXJuIHZvaWQgb21hcF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gc3RydWN0IHN5c190aW1lciBvbWFwX3RpbWVyOwotZXh0ZXJuIHZvaWQgb21hcF9zZXJpYWxfaW5pdChpbnQgcG9ydHNbXSk7Ci0KLSNlbmRpZiAvKiBfX0FSQ0hfQVJNX01BQ0hfT01BUF9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL2RtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTllYmU4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC9kbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDEwODYgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL29tYXAvZG1hLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KLSAqIEF1dGhvcjogSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KLSAqIERNQSBjaGFubmVsIGxpbmtpbmcgZm9yIDE2MTAgYnkgU2FtdWVsIE9ydGl6IDxzYW11ZWwub3J0aXpAbm9raWEuY29tPgotICogR3JhcGhpY3MgRE1BIGFuZCBMQ0QgRE1BIGdyYXBoaWNzIHRyYW5mb3JtYXRpb25zCi0gKiBieSBJbXJlIERlYWsgPGltcmUuZGVha0Bub2tpYS5jb20+Ci0gKiBTb21lIGZ1bmN0aW9ucyBiYXNlZCBvbiBlYXJsaWVyIGRtYS1vbWFwLmMgQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCi0gKgotICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBPTUFQIGludGVybmFsIERNQSBjaGFubmVscy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgotCi0jZGVmaW5lIE9NQVBfRE1BX0FDVElWRQkJMHgwMQotCi0jZGVmaW5lIE9NQVBfRE1BX0NDUl9FTgkJKDEgPDwgNykKLQotI2RlZmluZSBPTUFQX0ZVTkNfTVVYX0FSTV9CQVNFCSgweGZmZmUxMDAwICsgMHhlYykKLQotc3RhdGljIGludCBlbmFibGVfMTUxMF9tb2RlID0gMDsKLQotc3RydWN0IG9tYXBfZG1hX2xjaCB7Ci0JaW50IG5leHRfbGNoOwotCWludCBkZXZfaWQ7Ci0JdTE2IHNhdmVkX2NzcjsKLQl1MTYgZW5hYmxlZF9pcnFzOwotCWNvbnN0IGNoYXIgKmRldl9uYW1lOwotCXZvaWQgKCogY2FsbGJhY2spKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpOwotCXZvaWQgKmRhdGE7Ci0JbG9uZyBmbGFnczsKLX07Ci0KLXN0YXRpYyBpbnQgZG1hX2NoYW5fY291bnQ7Ci0KLXN0YXRpYyBzcGlubG9ja190IGRtYV9jaGFuX2xvY2s7Ci1zdGF0aWMgc3RydWN0IG9tYXBfZG1hX2xjaCBkbWFfY2hhbltPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKLQotY29uc3Qgc3RhdGljIHU4IGRtYV9pcnFbT01BUF9MT0dJQ0FMX0RNQV9DSF9DT1VOVF0gPSB7Ci0JSU5UX0RNQV9DSDBfNiwgSU5UX0RNQV9DSDFfNywgSU5UX0RNQV9DSDJfOCwgSU5UX0RNQV9DSDMsCi0JSU5UX0RNQV9DSDQsIElOVF9ETUFfQ0g1LCBJTlRfMTYxMF9ETUFfQ0g2LCBJTlRfMTYxMF9ETUFfQ0g3LAotCUlOVF8xNjEwX0RNQV9DSDgsIElOVF8xNjEwX0RNQV9DSDksIElOVF8xNjEwX0RNQV9DSDEwLAotCUlOVF8xNjEwX0RNQV9DSDExLCBJTlRfMTYxMF9ETUFfQ0gxMiwgSU5UXzE2MTBfRE1BX0NIMTMsCi0JSU5UXzE2MTBfRE1BX0NIMTQsIElOVF8xNjEwX0RNQV9DSDE1LCBJTlRfRE1BX0xDRAotfTsKLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X2dkbWFfZGV2KGludCByZXEpCi17Ci0JdTMyIHJlZyA9IE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UgKyAoKHJlcSAtIDEpIC8gNSkgKiA0OwotCWludCBzaGlmdCA9ICgocmVxIC0gMSkgJSA1KSAqIDY7Ci0KLQlyZXR1cm4gKChvbWFwX3JlYWRsKHJlZykgPj4gc2hpZnQpICYgMHgzZikgKyAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2dkbWFfZGV2KGludCByZXEsIGludCBkZXYpCi17Ci0JdTMyIHJlZyA9IE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UgKyAoKHJlcSAtIDEpIC8gNSkgKiA0OwotCWludCBzaGlmdCA9ICgocmVxIC0gMSkgJSA1KSAqIDY7Ci0JdTMyIGw7Ci0KLQlsID0gb21hcF9yZWFkbChyZWcpOwotCWwgJj0gfigweDNmIDw8IHNoaWZ0KTsKLQlsIHw9IChkZXYgLSAxKSA8PCBzaGlmdDsKLQlvbWFwX3dyaXRlbChsLCByZWcpOwotfQotCi1zdGF0aWMgdm9pZCBjbGVhcl9sY2hfcmVncyhpbnQgbGNoKQotewotCWludCBpOwotCXUzMiBsY2hfYmFzZSA9IE9NQVBfRE1BX0JBU0UgKyBsY2ggKiAweDQwOwotCi0JZm9yIChpID0gMDsgaSA8IDB4MmM7IGkgKz0gMikKLQkJb21hcF93cml0ZXcoMCwgbGNoX2Jhc2UgKyBpKTsKLX0KLQotdm9pZCBvbWFwX3NldF9kbWFfcHJpb3JpdHkoaW50IGRzdF9wb3J0LCBpbnQgcHJpb3JpdHkpCi17Ci0JdW5zaWduZWQgbG9uZyByZWc7Ci0JdTMyIGw7Ci0KLQlzd2l0Y2ggKGRzdF9wb3J0KSB7Ci0JY2FzZSBPTUFQX0RNQV9QT1JUX09DUF9UMToJLyogRkZGRUNDMDAgKi8KLQkJcmVnID0gT01BUF9UQ19PQ1BUMV9QUklPUjsKLQkJYnJlYWs7Ci0JY2FzZSBPTUFQX0RNQV9QT1JUX09DUF9UMjoJLyogRkZGRUNDRDAgKi8KLQkJcmVnID0gT01BUF9UQ19PQ1BUMl9QUklPUjsKLQkJYnJlYWs7Ci0JY2FzZSBPTUFQX0RNQV9QT1JUX0VNSUZGOgkvKiBGRkZFQ0MwOCAqLwotCQlyZWcgPSBPTUFQX1RDX0VNSUZGX1BSSU9SOwotCQlicmVhazsKLQljYXNlIE9NQVBfRE1BX1BPUlRfRU1JRlM6CS8qIEZGRkVDQzA0ICovCi0JCXJlZyA9IE9NQVBfVENfRU1JRlNfUFJJT1I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCWwgPSBvbWFwX3JlYWRsKHJlZyk7Ci0JbCAmPSB+KDB4ZiA8PCA4KTsKLQlsIHw9IChwcmlvcml0eSAmIDB4ZikgPDwgODsKLQlvbWFwX3dyaXRlbChsLCByZWcpOwotfQotCi12b2lkIG9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMoaW50IGxjaCwgaW50IGRhdGFfdHlwZSwgaW50IGVsZW1fY291bnQsCi0JCQkJICBpbnQgZnJhbWVfY291bnQsIGludCBzeW5jX21vZGUpCi17Ci0JdTE2IHc7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpOwotCXcgJj0gfjB4MDM7Ci0JdyB8PSBkYXRhX3R5cGU7Ci0Jb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKLQl3ICY9IH4oMSA8PCA1KTsKLQlpZiAoc3luY19tb2RlID09IE9NQVBfRE1BX1NZTkNfRlJBTUUpCi0JCXcgfD0gMSA8PCA1OwotCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUihsY2gpKTsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUjIobGNoKSk7Ci0JdyAmPSB+KDEgPDwgMik7Ci0JaWYgKHN5bmNfbW9kZSA9PSBPTUFQX0RNQV9TWU5DX0JMT0NLKQotCQl3IHw9IDEgPDwgMjsKLQlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IyKGxjaCkpOwotCi0Jb21hcF93cml0ZXcoZWxlbV9jb3VudCwgT01BUF9ETUFfQ0VOKGxjaCkpOwotCW9tYXBfd3JpdGV3KGZyYW1lX2NvdW50LCBPTUFQX0RNQV9DRk4obGNoKSk7Ci0KLX0KLXZvaWQgb21hcF9zZXRfZG1hX2NvbG9yX21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9jb2xvcl9tb2RlIG1vZGUsIHUzMiBjb2xvcikKLXsKLQl1MTYgdzsKLQotCUJVR19PTihvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSk7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DQ1IyKGxjaCkpICYgfjB4MDM7Ci0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBPTUFQX0RNQV9DT05TVEFOVF9GSUxMOgotCQl3IHw9IDB4MDE7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9ETUFfVFJBTlNQQVJFTlRfQ09QWToKLQkJdyB8PSAweDAyOwotCQlicmVhazsKLQljYXNlIE9NQVBfRE1BX0NPTE9SX0RJUzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUjIobGNoKSk7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9MQ0hfQ1RSTChsY2gpKSAmIH4weDBmOwotCS8qIERlZmF1bHQgaXMgY2hhbm5lbCB0eXBlIDJEICovCi0JaWYgKG1vZGUpIHsKLQkJb21hcF93cml0ZXcoKHUxNiljb2xvciwgT01BUF9ETUFfQ09MT1JfTChsY2gpKTsKLQkJb21hcF93cml0ZXcoKHUxNikoY29sb3IgPj4gMTYpLCBPTUFQX0RNQV9DT0xPUl9VKGxjaCkpOwotCQl3IHw9IDE7CQkvKiBDaGFubmVsIHR5cGUgRyAqLwotCX0KLQlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9MQ0hfQ1RSTChsY2gpKTsKLX0KLQotCi12b2lkIG9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKGludCBsY2gsIGludCBzcmNfcG9ydCwgaW50IHNyY19hbW9kZSwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBzcmNfc3RhcnQpCi17Ci0JdTE2IHc7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpOwotCXcgJj0gfigweDFmIDw8IDIpOwotCXcgfD0gc3JjX3BvcnQgPDwgMjsKLQlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOwotCi0JdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpOwotCXcgJj0gfigweDAzIDw8IDEyKTsKLQl3IHw9IHNyY19hbW9kZSA8PCAxMjsKLQlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IobGNoKSk7Ci0KLQlvbWFwX3dyaXRldyhzcmNfc3RhcnQgPj4gMTYsIE9NQVBfRE1BX0NTU0FfVShsY2gpKTsKLQlvbWFwX3dyaXRldyhzcmNfc3RhcnQsIE9NQVBfRE1BX0NTU0FfTChsY2gpKTsKLX0KLQotdm9pZCBvbWFwX3NldF9kbWFfc3JjX2luZGV4KGludCBsY2gsIGludCBlaWR4LCBpbnQgZmlkeCkKLXsKLQlvbWFwX3dyaXRldyhlaWR4LCBPTUFQX0RNQV9DU0VJKGxjaCkpOwotCW9tYXBfd3JpdGV3KGZpZHgsIE9NQVBfRE1BX0NTRkkobGNoKSk7Ci19Ci0KLXZvaWQgb21hcF9zZXRfZG1hX3NyY19kYXRhX3BhY2soaW50IGxjaCwgaW50IGVuYWJsZSkKLXsKLQl1MTYgdzsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSkgJiB+KDEgPDwgNik7Ci0JdyB8PSBlbmFibGUgPyAoMSA8PCA2KSA6IDA7Ci0Jb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKLX0KLQotdm9pZCBvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9idXJzdF9tb2RlIGJ1cnN0X21vZGUpCi17Ci0JdTE2IHc7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpICYgfigweDAzIDw8IDcpOwotCXN3aXRjaCAoYnVyc3RfbW9kZSkgewotCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF9ESVM6Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF80OgotCQl3IHw9ICgweDAxIDw8IDcpOwotCQlicmVhazsKLQljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfODoKLQkJLyogbm90IHN1cHBvcnRlZCBieSBjdXJyZW50IGhhcmR3YXJlCi0JCSAqIHcgfD0gKDB4MDMgPDwgNyk7Ci0JCSAqIGZhbGwgdGhyb3VnaAotCQkgKi8KLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0Jb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKLX0KLQotdm9pZCBvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMoaW50IGxjaCwgaW50IGRlc3RfcG9ydCwgaW50IGRlc3RfYW1vZGUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGRlc3Rfc3RhcnQpCi17Ci0JdTE2IHc7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpOwotCXcgJj0gfigweDFmIDw8IDkpOwotCXcgfD0gZGVzdF9wb3J0IDw8IDk7Ci0Jb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKLQl3ICY9IH4oMHgwMyA8PCAxNCk7Ci0JdyB8PSBkZXN0X2Ftb2RlIDw8IDE0OwotCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUihsY2gpKTsKLQotCW9tYXBfd3JpdGV3KGRlc3Rfc3RhcnQgPj4gMTYsIE9NQVBfRE1BX0NEU0FfVShsY2gpKTsKLQlvbWFwX3dyaXRldyhkZXN0X3N0YXJ0LCBPTUFQX0RNQV9DRFNBX0wobGNoKSk7Ci19Ci0KLXZvaWQgb21hcF9zZXRfZG1hX2Rlc3RfaW5kZXgoaW50IGxjaCwgaW50IGVpZHgsIGludCBmaWR4KQotewotCW9tYXBfd3JpdGV3KGVpZHgsIE9NQVBfRE1BX0NERUkobGNoKSk7Ci0Jb21hcF93cml0ZXcoZmlkeCwgT01BUF9ETUFfQ0RGSShsY2gpKTsKLX0KLQotdm9pZCBvbWFwX3NldF9kbWFfZGVzdF9kYXRhX3BhY2soaW50IGxjaCwgaW50IGVuYWJsZSkKLXsKLQl1MTYgdzsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSkgJiB+KDEgPDwgMTMpOwotCXcgfD0gZW5hYmxlID8gKDEgPDwgMTMpIDogMDsKLQlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOwotfQotCi12b2lkIG9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUoaW50IGxjaCwgZW51bSBvbWFwX2RtYV9idXJzdF9tb2RlIGJ1cnN0X21vZGUpCi17Ci0JdTE2IHc7Ci0KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0RQKGxjaCkpICYgfigweDAzIDw8IDE0KTsKLQlzd2l0Y2ggKGJ1cnN0X21vZGUpIHsKLQljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfRElTOgotCQlicmVhazsKLQljYXNlIE9NQVBfRE1BX0RBVEFfQlVSU1RfNDoKLQkJdyB8PSAoMHgwMSA8PCAxNCk7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF84OgotCQl3IHw9ICgweDAzIDw8IDE0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIERNQSBidXJzdCBtb2RlXG4iKTsKLQkJQlVHKCk7Ci0JCXJldHVybjsKLQl9Ci0Jb21hcF93cml0ZXcodywgT01BUF9ETUFfQ1NEUChsY2gpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGluaXRfaW50cihpbnQgbGNoKQotewotCXUxNiB3OwotCi0JLyogUmVhZCBDU1IgdG8gbWFrZSBzdXJlIGl0J3MgY2xlYXJlZC4gKi8KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU1IobGNoKSk7Ci0JLyogRW5hYmxlIHNvbWUgbmljZSBpbnRlcnJ1cHRzLiAqLwotCW9tYXBfd3JpdGV3KGRtYV9jaGFuW2xjaF0uZW5hYmxlZF9pcnFzLCBPTUFQX0RNQV9DSUNSKGxjaCkpOwotCWRtYV9jaGFuW2xjaF0uZmxhZ3MgfD0gT01BUF9ETUFfQUNUSVZFOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2xuayhpbnQgbGNoKQotewotCXUxNiB3OwotCi0JLyogQ2xlYXIgdGhlIFNUT1BfTE5LIGJpdHMgKi8KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DTE5LX0NUUkwobGNoKSk7Ci0JdyAmPSB+KDEgPDwgMTQpOwotCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKLQotCS8qIEFuZCBzZXQgdGhlIEVOQUJMRV9MTksgYml0cyAqLwotCWlmIChkbWFfY2hhbltsY2hdLm5leHRfbGNoICE9IC0xKQotCQlvbWFwX3dyaXRldyhkbWFfY2hhbltsY2hdLm5leHRfbGNoIHwgKDEgPDwgMTUpLAotCQkJICAgIE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfbG5rKGludCBsY2gpCi17Ci0JdTE2IHc7Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQlvbWFwX3dyaXRldygwLCBPTUFQX0RNQV9DSUNSKGxjaCkpOwotCi0JLyogU2V0IHRoZSBTVE9QX0xOSyBiaXQgKi8KLQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DTE5LX0NUUkwobGNoKSk7Ci0JdyB8PSAoMSA8PCAxNCk7Ci0JdyA9IG9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKLQotCWRtYV9jaGFuW2xjaF0uZmxhZ3MgJj0gfk9NQVBfRE1BX0FDVElWRTsKLX0KLQotdm9pZCBvbWFwX3N0YXJ0X2RtYShpbnQgbGNoKQotewotCXUxNiB3OwotCi0JaWYgKCFvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJiBkbWFfY2hhbltsY2hdLm5leHRfbGNoICE9IC0xKSB7Ci0JCWludCBuZXh0X2xjaCwgY3VyX2xjaDsKLQkJY2hhciBkbWFfY2hhbl9saW5rX21hcFtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKLQotCQlkbWFfY2hhbl9saW5rX21hcFtsY2hdID0gMTsKLQkJLyogU2V0IHRoZSBsaW5rIHJlZ2lzdGVyIG9mIHRoZSBmaXJzdCBjaGFubmVsICovCi0JCWVuYWJsZV9sbmsobGNoKTsKLQotCQltZW1zZXQoZG1hX2NoYW5fbGlua19tYXAsIDAsIHNpemVvZihkbWFfY2hhbl9saW5rX21hcCkpOwotCQljdXJfbGNoID0gZG1hX2NoYW5bbGNoXS5uZXh0X2xjaDsKLQkJZG8gewotCQkJbmV4dF9sY2ggPSBkbWFfY2hhbltjdXJfbGNoXS5uZXh0X2xjaDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGxvb3AgY2FzZTogd2UndmUgYmVlbiBoZXJlIGFscmVhZHkgKi8KLQkJCWlmIChkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSkKLQkJCQlicmVhazsKLQkJCS8qIE1hcmsgdGhlIGN1cnJlbnQgY2hhbm5lbCAqLwotCQkJZG1hX2NoYW5fbGlua19tYXBbY3VyX2xjaF0gPSAxOwotCi0JCQllbmFibGVfbG5rKGN1cl9sY2gpOwotCQkJaW5pdF9pbnRyKGN1cl9sY2gpOwotCi0JCQljdXJfbGNoID0gbmV4dF9sY2g7Ci0JCX0gd2hpbGUgKG5leHRfbGNoICE9IC0xKTsKLQl9Ci0KLQlpbml0X2ludHIobGNoKTsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKLQl3IHw9IE9NQVBfRE1BX0NDUl9FTjsKLQlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IobGNoKSk7Ci0JZG1hX2NoYW5bbGNoXS5mbGFncyB8PSBPTUFQX0RNQV9BQ1RJVkU7Ci19Ci0KLXZvaWQgb21hcF9zdG9wX2RtYShpbnQgbGNoKQotewotCXUxNiB3OwotCi0JaWYgKCFvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJiBkbWFfY2hhbltsY2hdLm5leHRfbGNoICE9IC0xKSB7Ci0JCWludCBuZXh0X2xjaCwgY3VyX2xjaCA9IGxjaDsKLQkJY2hhciBkbWFfY2hhbl9saW5rX21hcFtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXTsKLQotCQltZW1zZXQoZG1hX2NoYW5fbGlua19tYXAsIDAsIHNpemVvZihkbWFfY2hhbl9saW5rX21hcCkpOwotCQlkbyB7Ci0JCQkvKiBUaGUgbG9vcCBjYXNlOiB3ZSd2ZSBiZWVuIGhlcmUgYWxyZWFkeSAqLwotCQkJaWYgKGRtYV9jaGFuX2xpbmtfbWFwW2N1cl9sY2hdKQotCQkJCWJyZWFrOwotCQkJLyogTWFyayB0aGUgY3VycmVudCBjaGFubmVsICovCi0JCQlkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSA9IDE7Ci0KLQkJCWRpc2FibGVfbG5rKGN1cl9sY2gpOwotCi0JCQluZXh0X2xjaCA9IGRtYV9jaGFuW2N1cl9sY2hdLm5leHRfbGNoOwotCQkJY3VyX2xjaCA9IG5leHRfbGNoOwotCQl9IHdoaWxlIChuZXh0X2xjaCAhPSAtMSk7Ci0KLQkJcmV0dXJuOwotCX0KLQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIG9uIHRoZSBjaGFubmVsICovCi0Jb21hcF93cml0ZXcoMCwgT01BUF9ETUFfQ0lDUihsY2gpKTsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUihsY2gpKTsKLQl3ICY9IH5PTUFQX0RNQV9DQ1JfRU47Ci0Jb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0NSKGxjaCkpOwotCWRtYV9jaGFuW2xjaF0uZmxhZ3MgJj0gfk9NQVBfRE1BX0FDVElWRTsKLX0KLQotdm9pZCBvbWFwX2VuYWJsZV9kbWFfaXJxKGludCBsY2gsIHUxNiBiaXRzKQotewotCWRtYV9jaGFuW2xjaF0uZW5hYmxlZF9pcnFzIHw9IGJpdHM7Ci19Ci0KLXZvaWQgb21hcF9kaXNhYmxlX2RtYV9pcnEoaW50IGxjaCwgdTE2IGJpdHMpCi17Ci0JZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXMgJj0gfmJpdHM7Ci19Ci0KLXN0YXRpYyBpbnQgZG1hX2hhbmRsZV9jaChpbnQgY2gpCi17Ci0JdTE2IGNzcjsKLQotCWlmIChlbmFibGVfMTUxMF9tb2RlICYmIGNoID49IDYpIHsKLQkJY3NyID0gZG1hX2NoYW5bY2hdLnNhdmVkX2NzcjsKLQkJZG1hX2NoYW5bY2hdLnNhdmVkX2NzciA9IDA7Ci0JfSBlbHNlCi0JCWNzciA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NSKGNoKSk7Ci0JaWYgKGVuYWJsZV8xNTEwX21vZGUgJiYgY2ggPD0gMiAmJiAoY3NyID4+IDcpICE9IDApIHsKLQkJZG1hX2NoYW5bY2ggKyA2XS5zYXZlZF9jc3IgPSBjc3IgPj4gNzsKLQkJY3NyICY9IDB4N2Y7Ci0JfQotCWlmICghY3NyKQotCQlyZXR1cm4gMDsKLQlpZiAodW5saWtlbHkoZG1hX2NoYW5bY2hdLmRldl9pZCA9PSAtMSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgaW50ZXJydXB0IGZyb20gRE1BIGNoYW5uZWwgJWQgKENTUiAlMDR4KVxuIiwKLQkJICAgICAgIGNoLCBjc3IpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHVubGlrZWx5KGNzciAmIE9NQVBfRE1BX1RPVVRfSVJRKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRE1BIHRpbWVvdXQgd2l0aCBkZXZpY2UgJWRcbiIsIGRtYV9jaGFuW2NoXS5kZXZfaWQpOwotCWlmICh1bmxpa2VseShjc3IgJiBPTUFQX0RNQV9EUk9QX0lSUSkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkRNQSBzeW5jaHJvbml6YXRpb24gZXZlbnQgZHJvcCBvY2N1cnJlZCB3aXRoIGRldmljZSAlZFxuIiwKLQkJICAgICAgIGRtYV9jaGFuW2NoXS5kZXZfaWQpOwotCWlmIChsaWtlbHkoY3NyICYgT01BUF9ETUFfQkxPQ0tfSVJRKSkKLQkJZG1hX2NoYW5bY2hdLmZsYWdzICY9IH5PTUFQX0RNQV9BQ1RJVkU7Ci0JaWYgKGxpa2VseShkbWFfY2hhbltjaF0uY2FsbGJhY2sgIT0gTlVMTCkpCi0JCWRtYV9jaGFuW2NoXS5jYWxsYmFjayhjaCwgY3NyLCBkbWFfY2hhbltjaF0uZGF0YSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgY2ggPSAoKGludCkgZGV2X2lkKSAtIDE7Ci0JaW50IGhhbmRsZWQgPSAwOwotCi0JZm9yICg7OykgewotCQlpbnQgaGFuZGxlZF9ub3cgPSAwOwotCi0JCWhhbmRsZWRfbm93ICs9IGRtYV9oYW5kbGVfY2goY2gpOwotCQlpZiAoZW5hYmxlXzE1MTBfbW9kZSAmJiBkbWFfY2hhbltjaCArIDZdLnNhdmVkX2NzcikKLQkJCWhhbmRsZWRfbm93ICs9IGRtYV9oYW5kbGVfY2goY2ggKyA2KTsKLQkJaWYgKCFoYW5kbGVkX25vdykKLQkJCWJyZWFrOwotCQloYW5kbGVkICs9IGhhbmRsZWRfbm93OwotCX0KLQotCXJldHVybiBoYW5kbGVkID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKLX0KLQotaW50IG9tYXBfcmVxdWVzdF9kbWEoaW50IGRldl9pZCwgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCSAgICAgdm9pZCAoKiBjYWxsYmFjaykoaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSksCi0JCSAgICAgdm9pZCAqZGF0YSwgaW50ICpkbWFfY2hfb3V0KQotewotCWludCBjaCwgZnJlZV9jaCA9IC0xOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG9tYXBfZG1hX2xjaCAqY2hhbjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7Ci0JZm9yIChjaCA9IDA7IGNoIDwgZG1hX2NoYW5fY291bnQ7IGNoKyspIHsKLQkJaWYgKGZyZWVfY2ggPT0gLTEgJiYgZG1hX2NoYW5bY2hdLmRldl9pZCA9PSAtMSkgewotCQkJZnJlZV9jaCA9IGNoOwotCQkJaWYgKGRldl9pZCA9PSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChmcmVlX2NoID09IC0xKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0JY2hhbiA9IGRtYV9jaGFuICsgZnJlZV9jaDsKLQljaGFuLT5kZXZfaWQgPSBkZXZfaWQ7Ci0JY2xlYXJfbGNoX3JlZ3MoZnJlZV9jaCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOwotCi0JY2hhbi0+ZGV2X2lkID0gZGV2X2lkOwotCWNoYW4tPmRldl9uYW1lID0gZGV2X25hbWU7Ci0JY2hhbi0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKLQljaGFuLT5kYXRhID0gZGF0YTsKLQljaGFuLT5lbmFibGVkX2lycXMgPSBPTUFQX0RNQV9UT1VUX0lSUSB8IE9NQVBfRE1BX0RST1BfSVJRIHwgT01BUF9ETUFfQkxPQ0tfSVJROwotCi0JaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCS8qIElmIHRoZSBzeW5jIGRldmljZSBpcyBzZXQsIGNvbmZpZ3VyZSBpdCBkeW5hbWljYWxseS4gKi8KLQkJaWYgKGRldl9pZCAhPSAwKSB7Ci0JCQlzZXRfZ2RtYV9kZXYoZnJlZV9jaCArIDEsIGRldl9pZCk7Ci0JCQlkZXZfaWQgPSBmcmVlX2NoICsgMTsKLQkJfQotCQkvKiBEaXNhYmxlIHRoZSAxNTEwIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgc2V0IHRoZSBzeW5jIGRldmljZQotCQkgKiBpZC4gKi8KLQkJb21hcF93cml0ZXcoZGV2X2lkIHwgKDEgPDwgMTApLCBPTUFQX0RNQV9DQ1IoZnJlZV9jaCkpOwotCX0gZWxzZSB7Ci0JCW9tYXBfd3JpdGV3KGRldl9pZCwgT01BUF9ETUFfQ0NSKGZyZWVfY2gpKTsKLQl9Ci0JKmRtYV9jaF9vdXQgPSBmcmVlX2NoOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgb21hcF9mcmVlX2RtYShpbnQgY2gpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7Ci0JaWYgKGRtYV9jaGFuW2NoXS5kZXZfaWQgPT0gLTEpIHsKLQkJcHJpbnRrKCJvbWFwX2RtYTogdHJ5aW5nIHRvIGZyZWUgbm9uYWxsb2NhdGVkIERNQSBjaGFubmVsICVkXG4iLCBjaCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlkbWFfY2hhbltjaF0uZGV2X2lkID0gLTE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOwotCi0JLyogRGlzYWJsZSBhbGwgRE1BIGludGVycnVwdHMgZm9yIHRoZSBjaGFubmVsLiAqLwotCW9tYXBfd3JpdGV3KDAsIE9NQVBfRE1BX0NJQ1IoY2gpKTsKLQkvKiBNYWtlIHN1cmUgdGhlIERNQSB0cmFuc2ZlciBpcyBzdG9wcGVkLiAqLwotCW9tYXBfd3JpdGV3KDAsIE9NQVBfRE1BX0NDUihjaCkpOwotfQotCi1pbnQgb21hcF9kbWFfaW5fMTUxMF9tb2RlKHZvaWQpCi17Ci0JcmV0dXJuIGVuYWJsZV8xNTEwX21vZGU7Ci19Ci0KLS8qCi0gKiBsY2hfcXVldWUgRE1BIHdpbGwgc3RhcnQgcmlnaHQgYWZ0ZXIgbGNoX2hlYWQgb25lIGlzIGZpbmlzaGVkLgotICogRm9yIHRoaXMgRE1BIGxpbmsgdG8gc3RhcnQsIHlvdSBzdGlsbCBuZWVkIHRvIHN0YXJ0IChzZWUgb21hcF9zdGFydF9kbWEpCi0gKiB0aGUgZmlyc3Qgb25lLiBUaGF0IHdpbGwgZmlyZSB1cCB0aGUgZW50aXJlIHF1ZXVlLgotICovCi12b2lkIG9tYXBfZG1hX2xpbmtfbGNoIChpbnQgbGNoX2hlYWQsIGludCBsY2hfcXVldWUpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIGxpbmtpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiAxNTEwIG1vZGVcbiIpOwotCQlCVUcoKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoZG1hX2NoYW5bbGNoX2hlYWRdLmRldl9pZCA9PSAtMSkgfHwKLQkgICAgKGRtYV9jaGFuW2xjaF9xdWV1ZV0uZGV2X2lkID09IC0xKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm9tYXBfZG1hOiB0cnlpbmcgdG8gbGluayBub24gcmVxdWVzdGVkIGNoYW5uZWxzXG4iKTsKLQkJZHVtcF9zdGFjaygpOwotCX0KLQotCWRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCA9IGxjaF9xdWV1ZTsKLX0KLQotLyoKLSAqIE9uY2UgdGhlIERNQSBxdWV1ZSBpcyBzdG9wcGVkLCB3ZSBjYW4gZGVzdHJveSBpdC4KLSAqLwotdm9pZCBvbWFwX2RtYV91bmxpbmtfbGNoIChpbnQgbGNoX2hlYWQsIGludCBsY2hfcXVldWUpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIGxpbmtpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiAxNTEwIG1vZGVcbiIpOwotCQlCVUcoKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChkbWFfY2hhbltsY2hfaGVhZF0ubmV4dF9sY2ggIT0gbGNoX3F1ZXVlIHx8Ci0JICAgIGRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCA9PSAtMSkgewotCQlwcmludGsoS0VSTl9FUlIgIm9tYXBfZG1hOiB0cnlpbmcgdG8gdW5saW5rIG5vbiBsaW5rZWQgY2hhbm5lbHNcbiIpOwotCQlkdW1wX3N0YWNrKCk7Ci0JfQotCi0KLQlpZiAoKGRtYV9jaGFuW2xjaF9oZWFkXS5mbGFncyAmIE9NQVBfRE1BX0FDVElWRSkgfHwKLQkgICAgKGRtYV9jaGFuW2xjaF9oZWFkXS5mbGFncyAmIE9NQVBfRE1BX0FDVElWRSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvbWFwX2RtYTogWW91IG5lZWQgdG8gc3RvcCB0aGUgRE1BIGNoYW5uZWxzIGJlZm9yZSB1bmxpbmtpbmdcbiIpOwotCQlkdW1wX3N0YWNrKCk7Ci0JfQotCi0JZG1hX2NoYW5bbGNoX2hlYWRdLm5leHRfbGNoID0gLTE7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBsY2RfZG1hX2luZm8gewotCXNwaW5sb2NrX3QgbG9jazsKLQlpbnQgcmVzZXJ2ZWQ7Ci0Jdm9pZCAoKiBjYWxsYmFjaykodTE2IHN0YXR1cywgdm9pZCAqZGF0YSk7Ci0Jdm9pZCAqY2JfZGF0YTsKLQotCWludCBhY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOwotCWludCByb3RhdGUsIGRhdGFfdHlwZSwgeHJlcywgeXJlczsKLQlpbnQgdnhyZXM7Ci0JaW50IG1pcnJvcjsKLQlpbnQgeHNjYWxlLCB5c2NhbGU7Ci0JaW50IGV4dF9jdHJsOwotCWludCBzcmNfcG9ydDsKLQlpbnQgc2luZ2xlX3RyYW5zZmVyOwotfSBsY2RfZG1hOwotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjEodW5zaWduZWQgbG9uZyBhZGRyLCB1MTYgZmJfeHJlcywgdTE2IGZiX3lyZXMsCi0JCQkgaW50IGRhdGFfdHlwZSkKLXsKLQlsY2RfZG1hLmFkZHIgPSBhZGRyOwotCWxjZF9kbWEuZGF0YV90eXBlID0gZGF0YV90eXBlOwotCWxjZF9kbWEueHJlcyA9IGZiX3hyZXM7Ci0JbGNkX2RtYS55cmVzID0gZmJfeXJlczsKLX0KLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX3NyY19wb3J0KGludCBwb3J0KQotewotCWxjZF9kbWEuc3JjX3BvcnQgPSBwb3J0OwotfQotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIoaW50IGV4dGVybmFsKQotewotCWxjZF9kbWEuZXh0X2N0cmwgPSBleHRlcm5hbDsKLX0KLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2ZlcihpbnQgc2luZ2xlKQotewotCWxjZF9kbWEuc2luZ2xlX3RyYW5zZmVyID0gc2luZ2xlOwotfQotCi0KLXZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9yb3RhdGlvbihpbnQgcm90YXRlKQotewotCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkRNQSByb3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCWxjZF9kbWEucm90YXRlID0gcm90YXRlOwotfQotCi12b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKGludCBtaXJyb3IpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIG1pcnJvciBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7Ci0JCUJVRygpOwotCX0KLQlsY2RfZG1hLm1pcnJvciA9IG1pcnJvcjsKLX0KLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKHVuc2lnbmVkIGxvbmcgdnhyZXMpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIHZpcnR1YWwgcmVzdWxvdGlvbiBpcyBub3Qgc3VwcG9ydGVkICIKLQkJCQkiaW4gMTUxMCBtb2RlXG4iKTsKLQkJQlVHKCk7Ci0JfQotCWxjZF9kbWEudnhyZXMgPSB2eHJlczsKLX0KLQotdm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3NjYWxlKHVuc2lnbmVkIGludCB4c2NhbGUsIHVuc2lnbmVkIGludCB5c2NhbGUpCi17Ci0JaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BIHNjYWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKLQkJQlVHKCk7Ci0JfQotCWxjZF9kbWEueHNjYWxlID0geHNjYWxlOwotCWxjZF9kbWEueXNjYWxlID0geXNjYWxlOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfYjFfcmVncyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdG9wLCBib3R0b207Ci0JaW50IGVzOwotCXUxNiB3OwotCXVuc2lnbmVkIGxvbmcgZW4sIGZuOwotCWxvbmcgZWksIGZpOwotCXVuc2lnbmVkIGxvbmcgdnhyZXM7Ci0JdW5zaWduZWQgaW50IHhzY2FsZSwgeXNjYWxlOwotCi0Jc3dpdGNoIChsY2RfZG1hLmRhdGFfdHlwZSkgewotCWNhc2UgT01BUF9ETUFfREFUQV9UWVBFX1M4OgotCQllcyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9ETUFfREFUQV9UWVBFX1MxNjoKLQkJZXMgPSAyOwotCQlicmVhazsKLQljYXNlIE9NQVBfRE1BX0RBVEFfVFlQRV9TMzI6Ci0JCWVzID0gNDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2eHJlcyA9IGxjZF9kbWEudnhyZXMgPyBsY2RfZG1hLnZ4cmVzIDogbGNkX2RtYS54cmVzOwotCXhzY2FsZSA9IGxjZF9kbWEueHNjYWxlID8gbGNkX2RtYS54c2NhbGUgOiAxOwotCXlzY2FsZSA9IGxjZF9kbWEueXNjYWxlID8gbGNkX2RtYS55c2NhbGUgOiAxOwotCUJVR19PTih2eHJlcyA8IGxjZF9kbWEueHJlcyk7Ci0jZGVmaW5lIFBJWEFERFIoeCx5KSAobGNkX2RtYS5hZGRyICsgKCh5KSAqIHZ4cmVzICogeXNjYWxlICsgKHgpICogeHNjYWxlKSAqIGVzKQotI2RlZmluZSBQSVhTVEVQKHN4LCBzeSwgZHgsIGR5KSAoUElYQUREUihkeCwgZHkpIC0gUElYQUREUihzeCwgc3kpIC0gZXMgKyAxKQotCXN3aXRjaCAobGNkX2RtYS5yb3RhdGUpIHsKLQljYXNlIDA6Ci0JCWlmICghbGNkX2RtYS5taXJyb3IpIHsKLQkJCXRvcCA9IFBJWEFERFIoMCwgMCk7Ci0JCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOwotCQkJLyogMTUxMCBETUEgcmVxdWlyZXMgdGhlIGJvdHRvbSBhZGRyZXNzIHRvIGJlIDIgbW9yZQotCQkJICogdGhhbiB0aGUgYWN0dWFsIGxhc3QgbWVtb3J5IGFjY2VzcyBsb2NhdGlvbi4gKi8KLQkJCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSAmJgotCQkJICAgIGxjZF9kbWEuZGF0YV90eXBlID09IE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIpCi0JCQkJYm90dG9tICs9IDI7Ci0JCQllaSA9IFBJWFNURVAoMCwgMCwgMSwgMCk7Ci0JCQlmaSA9IFBJWFNURVAobGNkX2RtYS54cmVzIC0gMSwgMCwgMCwgMSk7Ci0JCX0gZWxzZSB7Ci0JCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOwotCQkJYm90dG9tID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJCWVpID0gUElYU1RFUCgxLCAwLCAwLCAwKTsKLQkJCWZpID0gUElYU1RFUCgwLCAwLCBsY2RfZG1hLnhyZXMgLSAxLCAxKTsKLQkJfQotCQllbiA9IGxjZF9kbWEueHJlczsKLQkJZm4gPSBsY2RfZG1hLnlyZXM7Ci0JCWJyZWFrOwotCWNhc2UgOTA6Ci0JCWlmICghbGNkX2RtYS5taXJyb3IpIHsKLQkJCXRvcCA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7Ci0JCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOwotCQkJZWkgPSBQSVhTVEVQKDAsIDEsIDAsIDApOwotCQkJZmkgPSBQSVhTVEVQKDAsIDAsIDEsIGxjZF9kbWEueXJlcyAtIDEpOwotCQl9IGVsc2UgewotCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJCWJvdHRvbSA9IFBJWEFERFIoMCwgMCk7Ci0JCQllaSA9IFBJWFNURVAoMCwgMSwgMCwgMCk7Ci0JCQlmaSA9IFBJWFNURVAoMSwgMCwgMCwgbGNkX2RtYS55cmVzIC0gMSk7Ci0JCX0KLQkJZW4gPSBsY2RfZG1hLnlyZXM7Ci0JCWZuID0gbGNkX2RtYS54cmVzOwotCQlicmVhazsKLQljYXNlIDE4MDoKLQkJaWYgKCFsY2RfZG1hLm1pcnJvcikgewotCQkJdG9wID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJCWJvdHRvbSA9IFBJWEFERFIoMCwgMCk7Ci0JCQllaSA9IFBJWFNURVAoMSwgMCwgMCwgMCk7Ci0JCQlmaSA9IFBJWFNURVAoMCwgMSwgbGNkX2RtYS54cmVzIC0gMSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0b3AgPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOwotCQkJYm90dG9tID0gUElYQUREUihsY2RfZG1hLnhyZXMgLSAxLCAwKTsKLQkJCWVpID0gUElYU1RFUCgwLCAwLCAxLCAwKTsKLQkJCWZpID0gUElYU1RFUChsY2RfZG1hLnhyZXMgLSAxLCAxLCAwLCAwKTsKLQkJfQotCQllbiA9IGxjZF9kbWEueHJlczsKLQkJZm4gPSBsY2RfZG1hLnlyZXM7Ci0JCWJyZWFrOwotCWNhc2UgMjcwOgotCQlpZiAoIWxjZF9kbWEubWlycm9yKSB7Ci0JCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOwotCQkJYm90dG9tID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKLQkJCWVpID0gUElYU1RFUCgwLCAwLCAwLCAxKTsKLQkJCWZpID0gUElYU1RFUCgxLCBsY2RfZG1hLnlyZXMgLSAxLCAwLCAwKTsKLQkJfSBlbHNlIHsKLQkJCXRvcCA9IFBJWEFERFIoMCwgMCk7Ci0JCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOwotCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDAsIDEpOwotCQkJZmkgPSBQSVhTVEVQKDAsIGxjZF9kbWEueXJlcyAtIDEsIDEsIDApOwotCQl9Ci0JCWVuID0gbGNkX2RtYS55cmVzOwotCQlmbiA9IGxjZF9kbWEueHJlczsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybjsJLyogU3VwcmVzcyB3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFycyAqLwotCX0KLQotCWlmIChvbWFwX2RtYV9pbl8xNTEwX21vZGUoKSkgewotCQlvbWFwX3dyaXRldyh0b3AgPj4gMTYsIE9NQVAxNTEwX0RNQV9MQ0RfVE9QX0YxX1UpOwotCQlvbWFwX3dyaXRldyh0b3AsIE9NQVAxNTEwX0RNQV9MQ0RfVE9QX0YxX0wpOwotCQlvbWFwX3dyaXRldyhib3R0b20gPj4gMTYsIE9NQVAxNTEwX0RNQV9MQ0RfQk9UX0YxX1UpOwotCQlvbWFwX3dyaXRldyhib3R0b20sIE9NQVAxNTEwX0RNQV9MQ0RfQk9UX0YxX0wpOwotCi0JCXJldHVybjsKLQl9Ci0KLQkvKiAxNjEwIHJlZ3MgKi8KLQlvbWFwX3dyaXRldyh0b3AgPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfVE9QX0IxX1UpOwotCW9tYXBfd3JpdGV3KHRvcCwgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfTCk7Ci0Jb21hcF93cml0ZXcoYm90dG9tID4+IDE2LCBPTUFQMTYxMF9ETUFfTENEX0JPVF9CMV9VKTsKLQlvbWFwX3dyaXRldyhib3R0b20sIE9NQVAxNjEwX0RNQV9MQ0RfQk9UX0IxX0wpOwotCi0Jb21hcF93cml0ZXcoZW4sIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0VOX0IxKTsKLQlvbWFwX3dyaXRldyhmbiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRk5fQjEpOwotCi0JdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DU0RQKTsKLQl3ICY9IH4weDAzOwotCXcgfD0gbGNkX2RtYS5kYXRhX3R5cGU7Ci0Jb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DU0RQKTsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7Ci0JLyogQWx3YXlzIHNldCB0aGUgc291cmNlIHBvcnQgYXMgU0RSQU0gZm9yIG5vdyovCi0JdyAmPSB+KDB4MDMgPDwgNik7Ci0JaWYgKGxjZF9kbWEuZXh0X2N0cmwpCi0JCXcgfD0gMSA8PCA4OwotCWVsc2UKLQkJdyAmPSB+KDEgPDwgOCk7Ci0JaWYgKGxjZF9kbWEuY2FsbGJhY2sgIT0gTlVMTCkKLQkJdyB8PSAxIDw8IDE7ICAgICAgICAgICAgLyogQmxvY2sgaW50ZXJydXB0IGVuYWJsZSAqLwotCWVsc2UKLQkJdyAmPSB+KDEgPDwgMSk7Ci0Jb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKLQotCWlmICghKGxjZF9kbWEucm90YXRlIHx8IGxjZF9kbWEubWlycm9yIHx8Ci0JICAgICAgbGNkX2RtYS52eHJlcyB8fCBsY2RfZG1hLnhzY2FsZSB8fCBsY2RfZG1hLnlzY2FsZSkpCi0JCXJldHVybjsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKLQkvKiBTZXQgdGhlIGRvdWJsZS1pbmRleGVkIGFkZHJlc3NpbmcgbW9kZSAqLwotCXcgfD0gKDB4MDMgPDwgMTIpOwotCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKLQotCW9tYXBfd3JpdGV3KGVpLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19FSV9CMSk7Ci0Jb21hcF93cml0ZXcoZmkgPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0ZJX0IxX1UpOwotCW9tYXBfd3JpdGV3KGZpLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GSV9CMV9MKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGxjZF9kbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1MTYgdzsKLQotCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7Ci0JaWYgKHVubGlrZWx5KCEodyAmICgxIDw8IDMpKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU3B1cmlvdXMgTENEIERNQSBJUlFcbiIpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCS8qIEFjayB0aGUgSVJRICovCi0JdyB8PSAoMSA8PCAzKTsKLQlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOwotCWxjZF9kbWEuYWN0aXZlID0gMDsKLQlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQotCQlsY2RfZG1hLmNhbGxiYWNrKHcsIGxjZF9kbWEuY2JfZGF0YSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLWludCBvbWFwX3JlcXVlc3RfbGNkX2RtYSh2b2lkICgqIGNhbGxiYWNrKSh1MTYgc3RhdHVzLCB2b2lkICpkYXRhKSwKLQkJCSB2b2lkICpkYXRhKQotewotCXNwaW5fbG9ja19pcnEoJmxjZF9kbWEubG9jayk7Ci0JaWYgKGxjZF9kbWEucmVzZXJ2ZWQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZsY2RfZG1hLmxvY2spOwotCQlwcmludGsoS0VSTl9FUlIgIkxDRCBETUEgY2hhbm5lbCBhbHJlYWR5IHJlc2VydmVkXG4iKTsKLQkJQlVHKCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWxjZF9kbWEucmVzZXJ2ZWQgPSAxOwotCXNwaW5fdW5sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKLQlsY2RfZG1hLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0JbGNkX2RtYS5jYl9kYXRhID0gZGF0YTsKLQlsY2RfZG1hLmFjdGl2ZSA9IDA7Ci0JbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIgPSAwOwotCWxjZF9kbWEucm90YXRlID0gMDsKLQlsY2RfZG1hLnZ4cmVzID0gMDsKLQlsY2RfZG1hLm1pcnJvciA9IDA7Ci0JbGNkX2RtYS54c2NhbGUgPSAwOwotCWxjZF9kbWEueXNjYWxlID0gMDsKLQlsY2RfZG1hLmV4dF9jdHJsID0gMDsKLQlsY2RfZG1hLnNyY19wb3J0ID0gMDsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG9tYXBfZnJlZV9sY2RfZG1hKHZvaWQpCi17Ci0Jc3Bpbl9sb2NrKCZsY2RfZG1hLmxvY2spOwotCWlmICghbGNkX2RtYS5yZXNlcnZlZCkgewotCQlzcGluX3VubG9jaygmbGNkX2RtYS5sb2NrKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJMQ0QgRE1BIGlzIG5vdCByZXNlcnZlZFxuIik7Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCWlmICghZW5hYmxlXzE1MTBfbW9kZSkKLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiB+MSwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCWxjZF9kbWEucmVzZXJ2ZWQgPSAwOwotCXNwaW5fdW5sb2NrKCZsY2RfZG1hLmxvY2spOwotfQotCi12b2lkIG9tYXBfZW5hYmxlX2xjZF9kbWEodm9pZCkKLXsKLQl1MTYgdzsKLQotCS8qIFNldCB0aGUgRW5hYmxlIGJpdCBvbmx5IGlmIGFuIGV4dGVybmFsIGNvbnRyb2xsZXIgaXMKLQkgKiBjb25uZWN0ZWQuIE90aGVyd2lzZSB0aGUgT01BUCBpbnRlcm5hbCBjb250cm9sbGVyIHdpbGwKLQkgKiBzdGFydCB0aGUgdHJhbnNmZXIgd2hlbiBpdCBnZXRzIGVuYWJsZWQuCi0JICovCi0JaWYgKGVuYWJsZV8xNTEwX21vZGUgfHwgIWxjZF9kbWEuZXh0X2N0cmwpCi0JCXJldHVybjsKLQl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7Ci0JdyB8PSAxIDw8IDc7Ci0Jb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCWxjZF9kbWEuYWN0aXZlID0gMTsKLX0KLQotdm9pZCBvbWFwX3NldHVwX2xjZF9kbWEodm9pZCkKLXsKLQlCVUdfT04obGNkX2RtYS5hY3RpdmUpOwotCWlmICghZW5hYmxlXzE1MTBfbW9kZSkgewotCQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzICovCi0JCW9tYXBfd3JpdGV3KDB4NTQ0MCwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCQlvbWFwX3dyaXRldygweDkxMDIsIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUCk7Ci0JCW9tYXBfd3JpdGV3KDB4MDAwNCwgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTCk7Ci0JfQotCXNldF9iMV9yZWdzKCk7Ci0JaWYgKCFlbmFibGVfMTUxMF9tb2RlKSB7Ci0JCXUxNiB3OwotCi0JCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKLQkJLyogSWYgRE1BIHdhcyBhbHJlYWR5IGFjdGl2ZSBzZXQgdGhlIGVuZF9wcm9nIGJpdCB0byBoYXZlCi0JCSAqIHRoZSBwcm9ncmFtbWVkIHJlZ2lzdGVyIHNldCBsb2FkZWQgaW50byB0aGUgYWN0aXZlCi0JCSAqIHJlZ2lzdGVyIHNldC4KLQkJICovCi0JCXcgfD0gMSA8PCAxMTsJCS8qIEVuZF9wcm9nICovCi0JCWlmICghbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIpCi0JICAgICAgICAJdyB8PSAoMyA8PCA4KTsJLyogQXV0b19pbml0LCByZXBlYXQgKi8KLQkJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCX0KLX0KLQotdm9pZCBvbWFwX3N0b3BfbGNkX2RtYSh2b2lkKQotewotCWxjZF9kbWEuYWN0aXZlID0gMDsKLQlpZiAoIWVuYWJsZV8xNTEwX21vZGUgJiYgbGNkX2RtYS5leHRfY3RybCkKLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUikgJiB+KDEgPDwgNyksCi0JCQkgICAgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotfQotCi0vKgotICogQ2xlYXJzIGFueSBETUEgc3RhdGUgc28gdGhlIERNQSBlbmdpbmUgaXMgcmVhZHkgdG8gcmVzdGFydCB3aXRoIG5ldyBidWZmZXJzCi0gKiB0aHJvdWdoIG9tYXBfc3RhcnRfZG1hKCkuIEFueSBidWZmZXJzIGluIGZsaWdodCBhcmUgZGlzY2FyZGVkLgotICovCi12b2lkIG9tYXBfY2xlYXJfZG1hKGludCBsY2gpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc3RhdHVzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpICYgfk9NQVBfRE1BX0NDUl9FTiwKLQkJICAgIE9NQVBfRE1BX0NDUihsY2gpKTsKLQlzdGF0dXMgPSBPTUFQX0RNQV9DU1IobGNoKTsJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwuCi0gKiBJZiB0aGUgY2hhbm5lbCBpcyBydW5uaW5nIHRoZSBjYWxsZXIgbXVzdCBkaXNhYmxlIGludGVycnVwdHMgcHJpb3IgY2FsbGluZwotICogdGhpcyBmdW5jdGlvbiBhbmQgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgYmVmb3JlIHJlLWVuYWJsaW5nIGludGVycnVwdCB0bwotICogcHJldmVudCByYWNlcyB3aXRoIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gTm90ZSB0aGF0IGluIGNvbnRpbnVvdXMgbW9kZSB0aGVyZQotICogaXMgYSBjaGFuY2UgZm9yIENTU0FfTCByZWdpc3RlciBvdmVyZmxvdyBpbmJldHdlZW4gdGhlIHR3byByZWFkcyByZXN1bHRpbmcKLSAqIGluIGluY29ycmVjdCByZXR1cm4gdmFsdWUuCi0gKi8KLWRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCkKLXsKLQlyZXR1cm4gKGRtYV9hZGRyX3QpIChPTUFQX0RNQV9DU1NBX0wobGNoKSB8Ci0JCQkgICAgIChPTUFQX0RNQV9DU1NBX1UobGNoKSA8PCAxNikpOwotfQotCi0vKgotICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4KLSAqIElmIHRoZSBjaGFubmVsIGlzIHJ1bm5pbmcgdGhlIGNhbGxlciBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciBjYWxsaW5nCi0gKiB0aGlzIGZ1bmN0aW9uIGFuZCBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSBiZWZvcmUgcmUtZW5hYmxpbmcgaW50ZXJydXB0IHRvCi0gKiBwcmV2ZW50IHJhY2VzIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVyLiBOb3RlIHRoYXQgaW4gY29udGludW91cyBtb2RlIHRoZXJlCi0gKiBpcyBhIGNoYW5jZSBmb3IgQ0RTQV9MIHJlZ2lzdGVyIG92ZXJmbG93IGluYmV0d2VlbiB0aGUgdHdvIHJlYWRzIHJlc3VsdGluZwotICogaW4gaW5jb3JyZWN0IHJldHVybiB2YWx1ZS4KLSAqLwotZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKQotewotCXJldHVybiAoZG1hX2FkZHJfdCkgKE9NQVBfRE1BX0NEU0FfTChsY2gpIHwKLQkJCSAgICAgKE9NQVBfRE1BX0NEU0FfVShsY2gpIDw8IDE2KSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfaW5pdF9kbWEodm9pZCkKLXsKLQlpbnQgY2gsIHI7Ci0KLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIHN1cHBvcnQgZm9yIE9NQVAxNTEwIGluaXRpYWxpemVkXG4iKTsKLQkJZG1hX2NoYW5fY291bnQgPSA5OwotCQllbmFibGVfMTUxMF9tb2RlID0gMTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwNzMwKCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBETUEgaGFyZHdhcmUgdmVyc2lvbiAlZFxuIiwKLQkJICAgICAgIG9tYXBfcmVhZHcoT01BUF9ETUFfSFdfSUQpKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIGNhcGFiaWxpdGllczogJTA4eDolMDh4OiUwNHg6JTA0eDolMDR4XG4iLAotCQkgICAgICAgKG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18wX1UpIDw8IDE2KSB8IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18wX0wpLAotCQkgICAgICAgKG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18xX1UpIDw8IDE2KSB8IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18xX0wpLAotCQkgICAgICAgb21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzIpLCBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMyksCi0JCSAgICAgICBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfNCkpOwotCQlpZiAoIWVuYWJsZV8xNTEwX21vZGUpIHsKLQkJCXUxNiB3OwotCi0JCQkvKiBEaXNhYmxlIE9NQVAgMy4wLzMuMSBjb21wYXRpYmlsaXR5IG1vZGUuICovCi0JCQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9HU0NSKTsKLQkJCXcgfD0gMSA8PCAzOwotCQkJb21hcF93cml0ZXcodywgT01BUF9ETUFfR1NDUik7Ci0JCQlkbWFfY2hhbl9jb3VudCA9IDE2OwotCQl9IGVsc2UKLQkJCWRtYV9jaGFuX2NvdW50ID0gOTsKLQl9IGVsc2UgewotCQlkbWFfY2hhbl9jb3VudCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQotCW1lbXNldCgmbGNkX2RtYSwgMCwgc2l6ZW9mKGxjZF9kbWEpKTsKLQlzcGluX2xvY2tfaW5pdCgmbGNkX2RtYS5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZG1hX2NoYW5fbG9jayk7Ci0JbWVtc2V0KCZkbWFfY2hhbiwgMCwgc2l6ZW9mKGRtYV9jaGFuKSk7Ci0KLQlmb3IgKGNoID0gMDsgY2ggPCBkbWFfY2hhbl9jb3VudDsgY2grKykgewotCQlkbWFfY2hhbltjaF0uZGV2X2lkID0gLTE7Ci0JCWRtYV9jaGFuW2NoXS5uZXh0X2xjaCA9IC0xOwotCi0JCWlmIChjaCA+PSA2ICYmIGVuYWJsZV8xNTEwX21vZGUpCi0JCQljb250aW51ZTsKLQotCQkvKiByZXF1ZXN0X2lycSgpIGRvZXNuJ3QgbGlrZSBkZXZfaWQgKGllLiBjaCkgYmVpbmcgemVybywKLQkJICogc28gd2UgaGF2ZSB0byBrbHVkZ2UgYXJvdW5kIHRoaXMuICovCi0JCXIgPSByZXF1ZXN0X2lycShkbWFfaXJxW2NoXSwgZG1hX2lycV9oYW5kbGVyLCAwLCAiRE1BIiwKLQkJCQkodm9pZCAqKSAoY2ggKyAxKSk7Ci0JCWlmIChyICE9IDApIHsKLQkJCWludCBpOwotCi0JCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSAlZCBmb3IgRE1BIChlcnJvciAlZClcbiIsCi0JCQkgICAgICAgZG1hX2lycVtjaF0sIHIpOwotCQkJZm9yIChpID0gMDsgaSA8IGNoOyBpKyspCi0JCQkJZnJlZV9pcnEoZG1hX2lycVtpXSwgKHZvaWQgKikgKGkgKyAxKSk7Ci0JCQlyZXR1cm4gcjsKLQkJfQotCX0KLQlyID0gcmVxdWVzdF9pcnEoSU5UX0RNQV9MQ0QsIGxjZF9kbWFfaXJxX2hhbmRsZXIsIDAsICJMQ0QgRE1BIiwgTlVMTCk7Ci0JaWYgKHIgIT0gMCkgewotCQlpbnQgaTsKLQotCQlwcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byByZXF1ZXN0IElSUSBmb3IgTENEIERNQSAoZXJyb3IgJWQpXG4iLCByKTsKLQkJZm9yIChpID0gMDsgaSA8IGRtYV9jaGFuX2NvdW50OyBpKyspCi0JCQlmcmVlX2lycShkbWFfaXJxW2ldLCAodm9pZCAqKSAoaSArIDEpKTsKLQkJcmV0dXJuIHI7Ci0JfQotCXJldHVybiAwOwotfQotCi1hcmNoX2luaXRjYWxsKG9tYXBfaW5pdF9kbWEpOwotCi0KLUVYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX3NyY19wb3MpOwotRVhQT1JUX1NZTUJPTChvbWFwX2dldF9kbWFfZHN0X3Bvcyk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfY2xlYXJfZG1hKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3ByaW9yaXR5KTsKLUVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9kbWEpOwotRVhQT1JUX1NZTUJPTChvbWFwX3N0YXJ0X2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc3RvcF9kbWEpOwotRVhQT1JUX1NZTUJPTChvbWFwX2VuYWJsZV9kbWFfaXJxKTsKLUVYUE9SVF9TWU1CT0wob21hcF9kaXNhYmxlX2RtYV9pcnEpOwotCi1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMpOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfY29sb3JfbW9kZSk7Ci0KLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19wYXJhbXMpOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfc3JjX2luZGV4KTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19kYXRhX3BhY2spOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUpOwotCi1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X2luZGV4KTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2Rlc3RfZGF0YV9wYWNrKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZSk7Ci0KLUVYUE9SVF9TWU1CT0wob21hcF9kbWFfbGlua19sY2gpOwotRVhQT1JUX1NZTUJPTChvbWFwX2RtYV91bmxpbmtfbGNoKTsKLQotRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfbGNkX2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9sY2RfZG1hKTsKLUVYUE9SVF9TWU1CT0wob21hcF9lbmFibGVfbGNkX2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0dXBfbGNkX2RtYSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc3RvcF9sY2RfZG1hKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcik7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfcm90YXRpb24pOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3Z4cmVzKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV9zY2FsZSk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfbWlycm9yKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2dwaW8uYyBiL2FyY2gvYXJtL21hY2gtb21hcC9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDVkZmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDc2MiArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9ncGlvLmMKLSAqCi0gKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgT01BUCBHUElPCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAzIE5va2lhIENvcnBvcmF0aW9uCi0gKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0vKgotICogT01BUDE1MTAgR1BJTyByZWdpc3RlcnMKLSAqLwotI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCTB4ZmZmY2UwMDAKLSNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX0lOUFVUCTB4MDAKLSNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVAkweDA0Ci0jZGVmaW5lIE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0wJMHgwOAotI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9DT05UUk9MCTB4MGMKLSNkZWZpbmUgT01BUDE1MTBfR1BJT19JTlRfTUFTSwkJMHgxMAotI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9TVEFUVVMJMHgxNAotI2RlZmluZSBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MCTB4MTgKLQotI2RlZmluZSBPTUFQMTUxMF9JSF9HUElPX0JBU0UJCTY0Ci0KLS8qCi0gKiBPTUFQMTYxMCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycwotICovCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU8xX0JBU0UJCTB4ZmZmYmU0MDAKLSNkZWZpbmUgT01BUDE2MTBfR1BJTzJfQkFTRQkJMHhmZmZiZWMwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPM19CQVNFCQkweGZmZmJiNDAwCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU80X0JBU0UJCTB4ZmZmYmJjMDAKLSNkZWZpbmUgT01BUDE2MTBfR1BJT19SRVZJU0lPTgkJMHgwMDAwCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU9fU1lTQ09ORklHCQkweDAwMTAKLSNkZWZpbmUgT01BUDE2MTBfR1BJT19TWVNTVEFUVVMJCTB4MDAxNAotI2RlZmluZSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEJMHgwMDE4Ci0jZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMQkweDAwMWMKLSNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBSU4JCTB4MDAyYwotI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFPVVQJCTB4MDAzMAotI2RlZmluZSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTgkJMHgwMDM0Ci0jZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMQkweDAwMzgKLSNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwyCTB4MDAzYwotI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTEJMHgwMDljCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfREFUQU9VVAkweDAwYjAKLSNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMQkweDAwZGMKLSNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfREFUQU9VVAkweDAwZjAKLQotLyoKLSAqIE9NQVA3MzAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKLSAqLwotI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCTB4ZmZmYmMwMDAKLSNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkweGZmZmJjODAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJMHhmZmZiZDAwMAotI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCTB4ZmZmYmQ4MDAKLSNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkweGZmZmJlMDAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJMHhmZmZiZTgwMAotI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAotI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAotI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOAotI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX0NPTlRST0wJMHgwYwotI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX01BU0sJCTB4MTAKLSNkZWZpbmUgT01BUDczMF9HUElPX0lOVF9TVEFUVVMJCTB4MTQKLQotI2RlZmluZSBPTUFQX01QVUlPX01BU0sJCSh+T01BUF9NQVhfR1BJT19MSU5FUyAmIDB4ZmYpCi0KLXN0cnVjdCBncGlvX2JhbmsgewotCXUzMiBiYXNlOwotCXUxNiBpcnE7Ci0JdTE2IHZpcnR1YWxfaXJxX3N0YXJ0OwotCXU4IG1ldGhvZDsKLQl1MzIgcmVzZXJ2ZWRfbWFwOwotCXNwaW5sb2NrX3QgbG9jazsKLX07Ci0KLSNkZWZpbmUgTUVUSE9EX01QVUlPCQkwCi0jZGVmaW5lIE1FVEhPRF9HUElPXzE1MTAJMQotI2RlZmluZSBNRVRIT0RfR1BJT18xNjEwCTIKLSNkZWZpbmUgTUVUSE9EX0dQSU9fNzMwCQkzCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQotc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7Ci0JeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKLQl7IE9NQVAxNjEwX0dQSU8xX0JBU0UsIElOVF9HUElPX0JBTksxLAkgICAgSUhfR1BJT19CQVNFLCAgICAgIE1FVEhPRF9HUElPXzE2MTAgfSwKLQl7IE9NQVAxNjEwX0dQSU8yX0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzIsIElIX0dQSU9fQkFTRSArIDE2LCBNRVRIT0RfR1BJT18xNjEwIH0sCi0JeyBPTUFQMTYxMF9HUElPM19CQVNFLCBJTlRfMTYxMF9HUElPX0JBTkszLCBJSF9HUElPX0JBU0UgKyAzMiwgTUVUSE9EX0dQSU9fMTYxMCB9LAotCXsgT01BUDE2MTBfR1BJTzRfQkFTRSwgSU5UXzE2MTBfR1BJT19CQU5LNCwgSUhfR1BJT19CQVNFICsgNDgsIE1FVEhPRF9HUElPXzE2MTAgfSwKLX07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi1zdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMTUxMFsyXSA9IHsKLQl7IE9NQVBfTVBVSU9fQkFTRSwgICAgSU5UX01QVUlPLCAgICAgIElIX01QVUlPX0JBU0UsIE1FVEhPRF9NUFVJTyB9LAotCXsgT01BUDE1MTBfR1BJT19CQVNFLCBJTlRfR1BJT19CQU5LMSwgSUhfR1BJT19CQVNFLCAgTUVUSE9EX0dQSU9fMTUxMCB9Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi1zdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfNzMwWzddID0gewotCXsgT01BUF9NUFVJT19CQVNFLCAgICAgSU5UXzczMF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsCU1FVEhPRF9NUFVJTyB9LAotCXsgT01BUDczMF9HUElPMV9CQVNFLCAgSU5UXzczMF9HUElPX0JBTksxLCAgSUhfR1BJT19CQVNFLAlNRVRIT0RfR1BJT183MzAgfSwKLQl7IE9NQVA3MzBfR1BJTzJfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMiwgIElIX0dQSU9fQkFTRSArIDMyLAlNRVRIT0RfR1BJT183MzAgfSwKLQl7IE9NQVA3MzBfR1BJTzNfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMywgIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT183MzAgfSwKLQl7IE9NQVA3MzBfR1BJTzRfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNCwgIElIX0dQSU9fQkFTRSArIDk2LAlNRVRIT0RfR1BJT183MzAgfSwKLQl7IE9NQVA3MzBfR1BJTzVfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNSwgIElIX0dQSU9fQkFTRSArIDEyOCwgTUVUSE9EX0dQSU9fNzMwIH0sCi0JeyBPTUFQNzMwX0dQSU82X0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzYsICBJSF9HUElPX0JBU0UgKyAxNjAsIE1FVEhPRF9HUElPXzczMCB9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IGdwaW9fYmFuayAqZ3Bpb19iYW5rOwotc3RhdGljIGludCBncGlvX2JhbmtfY291bnQ7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fYmFuayAqZ2V0X2dwaW9fYmFuayhpbnQgZ3BpbykKLXsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQotCQkJcmV0dXJuICZncGlvX2JhbmtbMF07Ci0JCXJldHVybiAmZ3Bpb19iYW5rWzFdOwotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0JaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpCi0JCQlyZXR1cm4gJmdwaW9fYmFua1swXTsKLQkJcmV0dXJuICZncGlvX2JhbmtbMSArIChncGlvID4+IDQpXTsKLQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi0JaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKLQkJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkKLQkJCXJldHVybiAmZ3Bpb19iYW5rWzBdOwotCQlyZXR1cm4gJmdwaW9fYmFua1sxICsgKGdwaW8gPj4gNSldOwotCX0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRfZ3Bpb19pbmRleChpbnQgZ3BpbykKLXsKLQlpZiAoY3B1X2lzX29tYXA3MzAoKSkKLQkJcmV0dXJuIGdwaW8gJiAweDFmOwotCWVsc2UKLQkJcmV0dXJuIGdwaW8gJiAweDBmOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQotewotCWlmIChncGlvIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpIHsKLQkJaWYgKChncGlvICYgT01BUF9NUFVJT19NQVNLKSA+IDE2KQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKLQl9Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkgJiYgZ3BpbyA8IDE2KQotCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0JaWYgKChjcHVfaXNfb21hcDE2eHgoKSkgJiYgZ3BpbyA8IDY0KQotCQlyZXR1cm4gMDsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKLQlpZiAoY3B1X2lzX29tYXA3MzAoKSAmJiBncGlvIDwgMTkyKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBjaGVja19ncGlvKGludCBncGlvKQotewotCWlmICh1bmxpa2VseShncGlvX3ZhbGlkKGdwaW8pKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IGludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpbyk7Ci0JCWR1bXBfc3RhY2soKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX3NldF9ncGlvX2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGlzX2lucHV0KQotewotCXUzMiByZWcgPSBiYW5rLT5iYXNlOwotCXUzMiBsOwotCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJcmVnICs9IE9NQVBfTVBVSU9fSU9fQ05UTDsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIT0RfR1BJT18xNTEwOgotCQlyZWcgKz0gT01BUDE1MTBfR1BJT19ESVJfQ09OVFJPTDsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIT0RfR1BJT18xNjEwOgotCQlyZWcgKz0gT01BUDE2MTBfR1BJT19ESVJFQ1RJT047Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgotCQlyZWcgKz0gT01BUDczMF9HUElPX0RJUl9DT05UUk9MOwotCQlicmVhazsKLQl9Ci0JbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JaWYgKGlzX2lucHV0KQotCQlsIHw9IDEgPDwgZ3BpbzsKLQllbHNlCi0JCWwgJj0gfigxIDw8IGdwaW8pOwotCV9fcmF3X3dyaXRlbChsLCByZWcpOwotfQotCi12b2lkIG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpCi17Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuazsKLQotCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKLQkJcmV0dXJuOwotCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwotCXNwaW5fbG9jaygmYmFuay0+bG9jayk7Ci0JX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgaXNfaW5wdXQpOwotCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlbmFibGUpCi17Ci0JdTMyIHJlZyA9IGJhbmstPmJhc2U7Ci0JdTMyIGwgPSAwOwotCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJcmVnICs9IE9NQVBfTVBVSU9fT1VUUFVUOwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCi0JCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIT0RfR1BJT18xNTEwOgotCQlyZWcgKz0gT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVDsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlbmFibGUpCi0JCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQotCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9EQVRBT1VUOwotCQllbHNlCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VUOwotCQlsID0gMSA8PCBncGlvOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzczMDoKLQkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX09VVFBVVDsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlbmFibGUpCi0JCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQotCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCV9fcmF3X3dyaXRlbChsLCByZWcpOwotfQotCi12b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSkKLXsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwotCi0JaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQotCQlyZXR1cm47Ci0JYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7Ci0Jc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKLQlfc2V0X2dwaW9fZGF0YW91dChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgZW5hYmxlKTsKLQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Ci19Ci0KLWludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3BpbykKLXsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwotCXUzMiByZWc7Ci0KLQlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCi0JCXJldHVybiAtMTsKLQliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKLQlyZWcgPSBiYW5rLT5iYXNlOwotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCXJlZyArPSBPTUFQX01QVUlPX0lOUFVUX0xBVENIOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfSU5QVVQ7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fREFUQUlOOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzczMDoKLQkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpICE9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19lZGdlX2N0cmwoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlZGdlKQotewotCXUzMiByZWcgPSBiYW5rLT5iYXNlOwotCXUzMiBsOwotCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRTsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKLQkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCi0JCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJX19yYXdfd3JpdGVsKGwsIHJlZyk7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKLQkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0w7Ci0JCWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCQlpZiAoZWRnZSA9PSBPTUFQX0dQSU9fUklTSU5HX0VER0UpCi0JCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQotCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7Ci0JCV9fcmF3X3dyaXRlbChsLCByZWcpOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCWVkZ2UgJj0gMHgwMzsKLQkJaWYgKGdwaW8gJiAweDA4KQotCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMjsKLQkJZWxzZQotCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMTsKLQkJZ3BpbyAmPSAweDA3OwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJbCAmPSB+KDMgPDwgKGdwaW8gPDwgMSkpOwotCQlsIHw9IGVkZ2UgPDwgKGdwaW8gPDwgMSk7Ci0JCV9fcmF3X3dyaXRlbChsLCByZWcpOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzczMDoKLQkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKLQkJCWwgfD0gMSA8PCBncGlvOwotCQllbHNlCi0JCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJX19yYXdfd3JpdGVsKGwsIHJlZyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotfQotCi12b2lkIG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKGludCBncGlvLCBpbnQgZWRnZSkKLXsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwotCi0JaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQotCQlyZXR1cm47Ci0JYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7Ci0Jc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKLQlfc2V0X2dwaW9fZWRnZV9jdHJsKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlZGdlKTsKLQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Ci19Ci0KLQotc3RhdGljIGludCBfZ2V0X2dwaW9fZWRnZV9jdHJsKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvKQotewotCXUzMiByZWcgPSBiYW5rLT5iYXNlLCBsOwotCi0Jc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKLQljYXNlIE1FVEhPRF9NUFVJTzoKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRSk7Ci0JCXJldHVybiAobCAmICgxIDw8IGdwaW8pKSA/Ci0JCQlPTUFQX0dQSU9fUklTSU5HX0VER0UgOiBPTUFQX0dQSU9fRkFMTElOR19FREdFOwotCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0wpOwotCQlyZXR1cm4gKGwgJiAoMSA8PCBncGlvKSkgPwotCQkJT01BUF9HUElPX1JJU0lOR19FREdFIDogT01BUF9HUElPX0ZBTExJTkdfRURHRTsKLQljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCWlmIChncGlvICYgMHgwOCkKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDI7Ci0JCWVsc2UKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDE7Ci0JCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSA+PiAoKGdwaW8gJiAweDA3KSA8PCAxKSkgJiAweDAzOwotCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgotCQlsID0gX19yYXdfcmVhZGwocmVnICsgT01BUDczMF9HUElPX0lOVF9DT05UUk9MKTsKLQkJcmV0dXJuIChsICYgKDEgPDwgZ3BpbykpID8KLQkJCU9NQVBfR1BJT19SSVNJTkdfRURHRSA6IE9NQVBfR1BJT19GQUxMSU5HX0VER0U7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9jbGVhcl9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKLXsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKLQotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCS8qIE1QVUlPIGlycXN0YXR1cyBpcyByZXNldCBieSByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIsCi0JCSAqIHNvIGRvIG5vdGhpbmcgaGVyZSAqLwotCQlyZXR1cm47Ci0JY2FzZSBNRVRIT0RfR1BJT18xNTEwOgotCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCXJlZyArPSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgotCQlyZWcgKz0gT01BUDczMF9HUElPX0lOVF9TVEFUVVM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCV9fcmF3X3dyaXRlbChncGlvX21hc2ssIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfY2xlYXJfZ3Bpb19pcnFzdGF0dXMoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCi17Ci0JX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKLX0KLQotc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKLXsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKLQl1MzIgbDsKLQotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCXJlZyArPSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUOwotCQlsID0gX19yYXdfcmVhZGwocmVnKTsKLQkJaWYgKGVuYWJsZSkKLQkJCWwgJj0gfihncGlvX21hc2spOwotCQllbHNlCi0JCQlsIHw9IGdwaW9fbWFzazsKLQkJYnJlYWs7Ci0JY2FzZSBNRVRIT0RfR1BJT18xNTEwOgotCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfTUFTSzsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlbmFibGUpCi0JCQlsICY9IH4oZ3Bpb19tYXNrKTsKLQkJZWxzZQotCQkJbCB8PSBncGlvX21hc2s7Ci0JCWJyZWFrOwotCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKLQkJaWYgKGVuYWJsZSkKLQkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9JUlFFTkFCTEUxOwotCQllbHNlCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9JUlFFTkFCTEUxOwotCQlsID0gZ3Bpb19tYXNrOwotCQlicmVhazsKLQljYXNlIE1FVEhPRF9HUElPXzczMDoKLQkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfTUFTSzsKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlbmFibGUpCi0JCQlsICY9IH4oZ3Bpb19tYXNrKTsKLQkJZWxzZQotCQkJbCB8PSBncGlvX21hc2s7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm47Ci0JfQotCV9fcmF3X3dyaXRlbChsLCByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3NldF9ncGlvX2lycWVuYWJsZShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKLXsKLQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOwotfQotCi1pbnQgb21hcF9yZXF1ZXN0X2dwaW8oaW50IGdwaW8pCi17Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuazsKLQotCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKLQlzcGluX2xvY2soJmJhbmstPmxvY2spOwotCWlmICh1bmxpa2VseShiYW5rLT5yZXNlcnZlZF9tYXAgJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQhXG4iLCBncGlvKTsKLQkJZHVtcF9zdGFjaygpOwotCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYmFuay0+cmVzZXJ2ZWRfbWFwIHw9ICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAotCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkgewotCQl1MzIgcmVnOwotCi0JCS8qIENsYWltIHRoZSBwaW4gZm9yIHRoZSBBUk0gKi8KLQkJcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0w7Ci0JCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChyZWcpIHwgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpLCByZWcpOwotCX0KLSNlbmRpZgotCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG9tYXBfZnJlZV9ncGlvKGludCBncGlvKQotewotCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7Ci0KLQlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCi0JCXJldHVybjsKLQliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKLQlzcGluX2xvY2soJmJhbmstPmxvY2spOwotCWlmICh1bmxpa2VseSghKGJhbmstPnJlc2VydmVkX21hcCAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIHdhc24ndCByZXNlcnZlZCFcbiIsIGdwaW8pOwotCQlkdW1wX3N0YWNrKCk7Ci0JCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQliYW5rLT5yZXNlcnZlZF9tYXAgJj0gfigxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKLQlfc2V0X2dwaW9fZGlyZWN0aW9uKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCAxKTsKLQlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOwotCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKLQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Ci19Ci0KLS8qCi0gKiBXZSBuZWVkIHRvIHVubWFzayB0aGUgR1BJTyBiYW5rIGludGVycnVwdCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvCi0gKiBhdm9pZCBtaXNzaW5nIEdQSU8gaW50ZXJydXB0cyBmb3Igb3RoZXIgbGluZXMgaW4gdGhlIGJhbmsuCi0gKiBUaGVuIHdlIG5lZWQgdG8gbWFzay1yZWFkLWNsZWFyLXVubWFzayB0aGUgdHJpZ2dlcmVkIEdQSU8gbGluZXMKLSAqIGluIHRoZSBiYW5rIHRvIGF2b2lkIG1pc3NpbmcgbmVzdGVkIGludGVycnVwdHMgZm9yIGEgR1BJTyBsaW5lLgotICogSWYgd2Ugd2FpdCB0byB1bm1hc2sgaW5kaXZpZHVhbCBHUElPIGxpbmVzIGluIHRoZSBiYW5rIGFmdGVyIHRoZQotICogbGluZSdzIGludGVycnVwdCBoYW5kbGVyIGhhcyBiZWVuIHJ1biwgd2UgbWF5IG1pc3Mgc29tZSBuZXN0ZWQKLSAqIGludGVycnVwdHMuCi0gKi8KLXN0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCi0JCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXUzMiBpc3JfcmVnID0gMDsKLQl1MzIgaXNyOwotCXVuc2lnbmVkIGludCBncGlvX2lycTsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwotCi0JZGVzYy0+Y2hpcC0+YWNrKGlycSk7Ci0KLQliYW5rID0gKHN0cnVjdCBncGlvX2JhbmsgKikgZGVzYy0+ZGF0YTsKLQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKLQkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQX01QVUlPX0dQSU9fSU5UOwotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKQotCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX1NUQVRVUzsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0JaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKQotCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKLQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzczMCkKLQkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKLSNlbmRpZgotCi0JaXNyID0gX19yYXdfcmVhZGwoaXNyX3JlZyk7Ci0JX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKLQlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcik7Ci0JX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAxKTsKLQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKLQotCWlmICh1bmxpa2VseSghaXNyKSkKLQkJcmV0dXJuOwotCi0JZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKLQlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgewotCQlzdHJ1Y3QgaXJxZGVzYyAqZDsKLQkJaWYgKCEoaXNyICYgMSkpCi0JCQljb250aW51ZTsKLQkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7Ci0JCWQtPmhhbmRsZShncGlvX2lycSwgZCwgcmVncyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBpbnQgZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKLQotCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKLX0KLQotc3RhdGljIHZvaWQgZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOwotCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwotCi0JX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7Ci0KLQlpZiAoX2dldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSkgPT0gT01BUF9HUElPX05PX0VER0UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIEdQSU8gJWQ6IHRyeWluZyB0byBlbmFibGUgR1BJTyBJUlEgd2hpbGUgbm8gZWRnZSBpcyBzZXRcbiIsCi0JCSAgICAgICBncGlvKTsKLQkJX3NldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKLQl9Ci0JX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAxKTsKLX0KLQotc3RhdGljIHZvaWQgbXB1aW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCS8qIFRoZSBJU1IgaXMgcmVzZXQgYXV0b21hdGljYWxseSwgc28gZG8gbm90aGluZyBoZXJlLiAqLwotfQotCi1zdGF0aWMgdm9pZCBtcHVpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGludCBncGlvID0gT01BUF9NUFVJTyhpcnEgLSBJSF9NUFVJT19CQVNFKTsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKLQotCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1wdWlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBpbnQgZ3BpbyA9IE9NQVBfTVBVSU8oaXJxIC0gSUhfTVBVSU9fQkFTRSk7Ci0Jc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7Ci0KLQlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDEpOwotfQotCi1zdGF0aWMgc3RydWN0IGlycWNoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKLQkuYWNrCT0gZ3Bpb19hY2tfaXJxLAotCS5tYXNrCT0gZ3Bpb19tYXNrX2lycSwKLQkudW5tYXNrID0gZ3Bpb191bm1hc2tfaXJxLAotfTsKLQotc3RhdGljIHN0cnVjdCBpcnFjaGlwIG1wdWlvX2lycV9jaGlwID0gewotCS5hY2sJPSBtcHVpb19hY2tfaXJxLAotCS5tYXNrCT0gbXB1aW9fbWFza19pcnEsCi0JLnVubWFzayA9IG1wdWlvX3VubWFza19pcnEKLX07Ci0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgaW50IF9faW5pdCBfb21hcF9ncGlvX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwotCi0JaW5pdGlhbGl6ZWQgPSAxOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDE1MTAgR1BJTyBoYXJkd2FyZVxuIik7Ci0JCWdwaW9fYmFua19jb3VudCA9IDI7Ci0JCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNTEwOwotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi0JaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCWludCByZXY7Ci0KLQkJZ3Bpb19iYW5rX2NvdW50ID0gNTsKLQkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzE2MTA7Ci0JCXJldiA9IG9tYXBfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCi0JCSAgICAgICAocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIk9NQVA3MzAgR1BJTyBoYXJkd2FyZVxuIik7Ci0JCWdwaW9fYmFua19jb3VudCA9IDc7Ci0JCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7Ci0JfQotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7Ci0JCWludCBqLCBncGlvX2NvdW50ID0gMTY7Ci0KLQkJYmFuayA9ICZncGlvX2JhbmtbaV07Ci0JCWJhbmstPnJlc2VydmVkX21hcCA9IDA7Ci0JCWJhbmstPmJhc2UgPSBJT19BRERSRVNTKGJhbmstPmJhc2UpOwotCQlzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7Ci0JCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKSB7Ci0JCQlvbWFwX3dyaXRldygweEZGRkYsIE9NQVBfTVBVSU9fQkFTRSArIE9NQVBfTVBVSU9fR1BJT19NQVNLSVQpOwotCQl9Ci0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLQkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKSB7Ci0JCQlfX3Jhd193cml0ZXcoMHhmZmZmLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfTUFTSyk7Ci0JCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTKTsKLQkJfQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7Ci0JCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxKTsKLQkJCV9fcmF3X3dyaXRldygweGZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEpOwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi0JCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fNzMwKSB7Ci0JCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfTUFTSyk7Ci0JCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTKTsKLQotCQkJZ3Bpb19jb3VudCA9IDMyOyAvKiA3MzAgaGFzIDMyLWJpdCBHUElPcyAqLwotCQl9Ci0jZW5kaWYKLQkJZm9yIChqID0gYmFuay0+dmlydHVhbF9pcnFfc3RhcnQ7Ci0JCSAgICAgaiA8IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0ICsgZ3Bpb19jb3VudDsgaisrKSB7Ci0JCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKLQkJCQlzZXRfaXJxX2NoaXAoaiwgJm1wdWlvX2lycV9jaGlwKTsKLQkJCWVsc2UKLQkJCQlzZXRfaXJxX2NoaXAoaiwgJmdwaW9faXJxX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGosIGRvX3NpbXBsZV9JUlEpOwotCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKLQkJfQotCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihiYW5rLT5pcnEsIGdwaW9faXJxX2hhbmRsZXIpOwotCQlzZXRfaXJxX2RhdGEoYmFuay0+aXJxLCBiYW5rKTsKLQl9Ci0KLQkvKiBFbmFibGUgc3lzdGVtIGNsb2NrIGZvciBHUElPIG1vZHVsZS4KLQkgKiBUaGUgQ0FNX0NMS19DVFJMICppcyogcmVhbGx5IHRoZSByaWdodCBwbGFjZS4gKi8KLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpCi0JCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoVUxQRF9DQU1fQ0xLX0NUUkwpIHwgMHgwNCwgVUxQRF9DQU1fQ0xLX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAotICovCi1pbnQgb21hcF9ncGlvX2luaXQodm9pZCkKLXsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlyZXR1cm4gX29tYXBfZ3Bpb19pbml0KCk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfZ3Bpbyk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9ncGlvKTsKLUVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24pOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2RhdGFvdXQpOwotRVhQT1JUX1NZTUJPTChvbWFwX2dldF9ncGlvX2RhdGFpbik7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKTsKLQotYXJjaF9pbml0Y2FsbChvbWFwX2dwaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWM5OTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKLSAqCi0gKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgYWxsIE9NQVAgYm9hcmRzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCi0gKiBXcml0dGVuIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+Ci0gKiBNYWpvciBjbGVhbnVwcyBieSBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgotICoKLSAqIENvbXBsZXRlbHkgcmUtd3JpdHRlbiB0byBzdXBwb3J0IHZhcmlvdXMgT01BUCBjaGlwcyB3aXRoIGJhbmsgc3BlY2lmaWMKLSAqIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBTb21lIHNuaXBwZXRzIG9mIHRoZSBjb2RlIHRha2VuIGZyb20gdGhlIG9sZGVyIE9NQVAgaW50ZXJydXB0IGhhbmRsZXIKLSAqIENvcHlyaWdodCAoQykgMjAwMSBSaWRnZVJ1biwgSW5jLiBHcmVnIExvbm5vbiA8Z2xvbm5vbkByaWRnZXJ1bi5jb20+Ci0gKgotICogR1BJTyBpbnRlcnJ1cHQgaGFuZGxlciBtb3ZlZCB0byBncGlvLmMgYnkgSnVoYSBZcmpvbGEKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KLSAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLQotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2RlZmluZSBJUlFfQkFOSyhpcnEpICgoaXJxKSA+PiA1KQotI2RlZmluZSBJUlFfQklUKGlycSkgICgoaXJxKSAmIDB4MWYpCi0KLXN0cnVjdCBvbWFwX2lycV9iYW5rIHsKLQl1bnNpZ25lZCBsb25nIGJhc2VfcmVnOwotCXVuc2lnbmVkIGxvbmcgdHJpZ2dlcl9tYXA7Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGlycV9iYW5rX2NvdW50ID0gMDsKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayAqaXJxX2JhbmtzOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcnFfYmFua19yZWFkbChpbnQgYmFuaywgaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gb21hcF9yZWFkbChpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXJxX2Jhbmtfd3JpdGVsKHVuc2lnbmVkIGxvbmcgdmFsdWUsIGludCBiYW5rLCBpbnQgb2Zmc2V0KQotewotCW9tYXBfd3JpdGVsKHZhbHVlLCBpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBvbWFwX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpZiAoaXJxID4gMzEpCi0JCW9tYXBfd3JpdGVsKDB4MSwgT01BUF9JSDJfQkFTRSArIElSUV9DT05UUk9MX1JFR19PRkZTRVQpOwotCi0Jb21hcF93cml0ZWwoMHgxLCBPTUFQX0lIMV9CQVNFICsgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXBfbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlpbnQgYmFuayA9IElSUV9CQU5LKGlycSk7Ci0JdTMyIGw7Ci0KLQlsID0gb21hcF9yZWFkbChpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBJUlFfTUlSX1JFR19PRkZTRVQpOwotCWwgfD0gMSA8PCBJUlFfQklUKGlycSk7Ci0Jb21hcF93cml0ZWwobCwgaXJxX2JhbmtzW2JhbmtdLmJhc2VfcmVnICsgSVJRX01JUl9SRUdfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHZvaWQgb21hcF91bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaW50IGJhbmsgPSBJUlFfQkFOSyhpcnEpOwotCXUzMiBsOwotCi0JbCA9IG9tYXBfcmVhZGwoaXJxX2JhbmtzW2JhbmtdLmJhc2VfcmVnICsgSVJRX01JUl9SRUdfT0ZGU0VUKTsKLQlsICY9IH4oMSA8PCBJUlFfQklUKGlycSkpOwotCW9tYXBfd3JpdGVsKGwsIGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIElSUV9NSVJfUkVHX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXBfbWFza19hY2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jb21hcF9tYXNrX2lycShpcnEpOwotCW9tYXBfYWNrX2lycShpcnEpOwotfQotCi0vKgotICogQWxsb3dzIHR1bmluZyB0aGUgSVJRIHR5cGUgYW5kIHByaW9yaXR5Ci0gKgotICogTk9URTogVGhlcmUgaXMgY3VycmVudGx5IG5vIE9NQVAgZmlxIGhhbmRsZXIgZm9yIExpbnV4LiBSZWFkIHRoZQotICoJIG1haWxpbmcgbGlzdCB0aHJlYWRzIG9uIEZJUSBoYW5kbGVycyBpZiB5b3UgYXJlIHBsYW5uaW5nIHRvCi0gKgkgYWRkIGEgRklRIGhhbmRsZXIgZm9yIE9NQVAuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfaXJxX3NldF9jZmcoaW50IGlycSwgaW50IGZpcSwgaW50IHByaW9yaXR5LCBpbnQgdHJpZ2dlcikKLXsKLQlzaWduZWQgaW50IGJhbms7Ci0JdW5zaWduZWQgbG9uZyB2YWwsIG9mZnNldDsKLQotCWJhbmsgPSBJUlFfQkFOSyhpcnEpOwotCS8qIEZJUSBpcyBvbmx5IGF2YWlsYWJsZSBvbiBiYW5rIDAgaW50ZXJydXB0cyAqLwotCWZpcSA9IGJhbmsgPyAwIDogKGZpcSAmIDB4MSk7Ci0JdmFsID0gZmlxIHwgKChwcmlvcml0eSAmIDB4MWYpIDw8IDIpIHwgKCh0cmlnZ2VyICYgMHgxKSA8PCAxKTsKLQlvZmZzZXQgPSBJUlFfSUxSMF9SRUdfT0ZGU0VUICsgSVJRX0JJVChpcnEpICogMHg0OwotCWlycV9iYW5rX3dyaXRlbCh2YWwsIGJhbmssIG9mZnNldCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi1zdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDczMF9pcnFfYmFua3NbXSA9IHsKLQl7IC5iYXNlX3JlZyA9IE9NQVBfSUgxX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhiM2Y4ZTIyZiB9LAotCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGZkYjljMWYyIH0sCi0JeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFICsgMHgxMDAsCS50cmlnZ2VyX21hcCA9IDB4ODAwMDQwZjMgfSwKLX07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi1zdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDE1MTBfaXJxX2JhbmtzW10gPSB7Ci0JeyAuYmFzZV9yZWcgPSBPTUFQX0lIMV9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4YjNmZWJmZmYgfSwKLQl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhmZmJmZmZlZCB9LAotfTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQotc3RhdGljIHN0cnVjdCBvbWFwX2lycV9iYW5rIG9tYXAxNjEwX2lycV9iYW5rc1tdID0gewotCXsgLmJhc2VfcmVnID0gT01BUF9JSDFfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGIzZmVmZThmIH0sCi0JeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4ZmRiN2MxZmQgfSwKLQl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UgKyAweDEwMCwJLnRyaWdnZXJfbWFwID0gMHhmZmZmZjdmZiB9LAotCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSArIDB4MjAwLAkudHJpZ2dlcl9tYXAgPSAweGZmZmZmZmZmIH0sCi19OwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBvbWFwX2lycV9jaGlwID0gewotCS5hY2sgICAgPSBvbWFwX21hc2tfYWNrX2lycSwKLQkubWFzayAgID0gb21hcF9tYXNrX2lycSwKLQkudW5tYXNrID0gb21hcF91bm1hc2tfaXJxLAotfTsKLQotdm9pZCBfX2luaXQgb21hcF9pbml0X2lycSh2b2lkKQotewotCWludCBpLCBqOwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCWlycV9iYW5rcyA9IG9tYXA3MzBfaXJxX2JhbmtzOwotCQlpcnFfYmFua19jb3VudCA9IEFSUkFZX1NJWkUob21hcDczMF9pcnFfYmFua3MpOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWlycV9iYW5rcyA9IG9tYXAxNTEwX2lycV9iYW5rczsKLQkJaXJxX2JhbmtfY291bnQgPSBBUlJBWV9TSVpFKG9tYXAxNTEwX2lycV9iYW5rcyk7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJaXJxX2JhbmtzID0gb21hcDE2MTBfaXJxX2JhbmtzOwotCQlpcnFfYmFua19jb3VudCA9IEFSUkFZX1NJWkUob21hcDE2MTBfaXJxX2JhbmtzKTsKLQl9Ci0jZW5kaWYKLQlwcmludGsoIlRvdGFsIG9mICVpIGludGVycnVwdHMgaW4gJWkgaW50ZXJydXB0IGJhbmtzXG4iLAotCSAgICAgICBpcnFfYmFua19jb3VudCAqIDMyLCBpcnFfYmFua19jb3VudCk7Ci0KLQkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBpcnFfYmFua19jb3VudDsgaSsrKSB7Ci0JCWlycV9iYW5rX3dyaXRlbCh+MHgwLCBpLCBJUlFfTUlSX1JFR19PRkZTRVQpOwotCQlpcnFfYmFua193cml0ZWwoMHgwLCBpLCBJUlFfSVRSX1JFR19PRkZTRVQpOwotCX0KLQotCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KLQlpcnFfYmFua193cml0ZWwoMHgwMywgMCwgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7Ci0JaXJxX2Jhbmtfd3JpdGVsKDB4MDMsIDEsIElSUV9DT05UUk9MX1JFR19PRkZTRVQpOwotCi0JLyogRW5hYmxlIGludGVycnVwdHMgaW4gZ2xvYmFsIG1hc2sgKi8KLQlpZiAoY3B1X2lzX29tYXA3MzAoKSkgewotCQlpcnFfYmFua193cml0ZWwoMHgwLCAwLCBJUlFfR01SX1JFR19PRkZTRVQpOwotCX0KLQotCS8qIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVycyBmb3IgZWFjaCBiYW5rICovCi0JZm9yIChpID0gMDsgaSA8IGlycV9iYW5rX2NvdW50OyBpKyspIHsKLQkJZm9yIChqID0gaSAqIDMyOyBqIDwgKGkgKyAxKSAqIDMyOyBqKyspIHsKLQkJCWludCBpcnFfdHJpZ2dlcjsKLQotCQkJaXJxX3RyaWdnZXIgPSBpcnFfYmFua3NbaV0udHJpZ2dlcl9tYXAgPj4gSVJRX0JJVChqKTsKLQkJCW9tYXBfaXJxX3NldF9jZmcoaiwgMCwgMCwgaXJxX3RyaWdnZXIpOwotCi0JCQlzZXRfaXJxX2NoaXAoaiwgJm9tYXBfaXJxX2NoaXApOwotCQkJc2V0X2lycV9oYW5kbGVyKGosIGRvX2xldmVsX0lSUSk7Ci0JCQlzZXRfaXJxX2ZsYWdzKGosIElSUUZfVkFMSUQpOwotCQl9Ci0JfQotCi0JLyogVW5tYXNrIGxldmVsIDIgaGFuZGxlciAqLwotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCW9tYXBfdW5tYXNrX2lycShJTlRfNzMwX0lIMl9JUlEpOwotCX0gZWxzZSB7Ci0JCW9tYXBfdW5tYXNrX2lycShJTlRfSUgyX0lSUSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtb3NrLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNzdmNC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtb3NrLmMKLSAqCi0gKiBMRUQgZHJpdmVyIGZvciBPU0ssIGFuZCBvcHRpb25hbGx5IE1pc3RyYWwgUVZHQSwgYm9hcmRzCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbGVkcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KLSNpbmNsdWRlIDxhc20vYXJjaC90cHM2NTAxMC5oPgotCi0jaW5jbHVkZSAibGVkcy5oIgotCi0KLSNkZWZpbmUgTEVEX1NUQVRFX0VOQUJMRUQJKDEgPDwgMCkKLSNkZWZpbmUgTEVEX1NUQVRFX0NMQUlNRUQJKDEgPDwgMSkKLXN0YXRpYyB1OCBsZWRfc3RhdGU7Ci0KLSNkZWZpbmUJR1JFRU5fTEVECQkoMSA8PCAwKQkvKiBUUFM2NTAxMCBMRUQxICovCi0jZGVmaW5lCUFNQkVSX0xFRAkJKDEgPDwgMSkJLyogVFBTNjUwMTAgTEVEMiAqLwotI2RlZmluZQlSRURfTEVECQkJKDEgPDwgMikJLyogVFBTNjUwMTAgR1BJTzIgKi8KLSNkZWZpbmUJVElNRVJfTEVECQkoMSA8PCAzKQkvKiBNaXN0cmFsIGJvYXJkICovCi0jZGVmaW5lCUlETEVfTEVECQkoMSA8PCA0KQkvKiBNaXN0cmFsIGJvYXJkICovCi1zdGF0aWMgdTggaHdfbGVkX3N0YXRlOwotCi0KLS8qIFRQUzY1MDEwIGxlZHMgYXJlIGNoYW5nZWQgdXNpbmcgaTJjIC0tIGZyb20gYSB0YXNrIGNvbnRleHQuCi0gKiBVc2luZyBvbmUgb2YgdGhlc2UgZm9yIHRoZSAiaWRsZSIgTEVEIHdvdWxkIGJlIGltcHJhY3RpY2FsLi4uCi0gKi8KLSNkZWZpbmUJVFBTX0xFRFMJKEdSRUVOX0xFRCB8IFJFRF9MRUQgfCBBTUJFUl9MRUQpCi0KLXN0YXRpYyB1OCB0cHNfbGVkc19jaGFuZ2U7Ci0KLXN0YXRpYyB2b2lkIHRwc193b3JrKHZvaWQgKnVudXNlZCkKLXsKLQlmb3IgKDs7KSB7Ci0JCXU4CWxlZHM7Ci0KLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbGVkcyA9IHRwc19sZWRzX2NoYW5nZTsKLQkJdHBzX2xlZHNfY2hhbmdlID0gMDsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCi0JCWlmICghbGVkcykKLQkJCWJyZWFrOwotCi0JCS8qIGNhcmVmdWw6ICB0aGUgc2V0X2xlZCgpIHZhbHVlIGlzIG9uL29mZi9ibGluayAqLwotCQlpZiAobGVkcyAmIEdSRUVOX0xFRCkKLQkJCXRwczY1MDEwX3NldF9sZWQoTEVEMSwgISEoaHdfbGVkX3N0YXRlICYgR1JFRU5fTEVEKSk7Ci0JCWlmIChsZWRzICYgQU1CRVJfTEVEKQotCQkJdHBzNjUwMTBfc2V0X2xlZChMRUQyLCAhIShod19sZWRfc3RhdGUgJiBBTUJFUl9MRUQpKTsKLQotCQkvKiB0aGUgZ3BpbyBsZWQgZG9lc24ndCBoYXZlIHRoYXQgaXNzdWUgKi8KLQkJaWYgKGxlZHMgJiBSRURfTEVEKQotCQkJdHBzNjUwMTBfc2V0X2dwaW9fb3V0X3ZhbHVlKEdQSU8yLAotCQkJCQkhKGh3X2xlZF9zdGF0ZSAmIFJFRF9MRUQpKTsKLQl9Ci19Ci0KLXN0YXRpYyBERUNMQVJFX1dPUksod29yaywgdHBzX3dvcmssIE5VTEwpOwotCi0jaWZkZWYJQ09ORklHX0ZCX09NQVAKLQotLyogRm9yIG5vdywgYWxsIHN5c3RlbSBpbmRpY2F0b3JzIHJlcXVpcmUgdGhlIE1pc3RyYWwgYm9hcmQsIHNpbmNlIHRoYXQKLSAqIExFRCBjYW4gYmUgbWFuaXB1bGF0ZWQgd2l0aG91dCBhIHRhc2sgY29udGV4dC4gIFRoaXMgTEVEIGlzIGVpdGhlciByZWQsCi0gKiBvciBncmVlbiwgYnV0IG5vdCBib3RoOyBpdCBjYW4ndCBnaXZlIHRoZSBmdWxsICJkaXNjbyBsZWQiIGVmZmVjdC4KLSAqLwotCi0jZGVmaW5lIEdQSU9fTEVEX1JFRAkJMwotI2RlZmluZSBHUElPX0xFRF9HUkVFTgkJT01BUF9NUFVJTyg0KQotCi1zdGF0aWMgdm9pZCBtaXN0cmFsX3NldGxlZCh2b2lkKQotewotCWludAlyZWQgPSAwOwotCWludAlncmVlbiA9IDA7Ci0KLQlpZiAoaHdfbGVkX3N0YXRlICYgVElNRVJfTEVEKQotCQlyZWQgPSAxOwotCWVsc2UgaWYgKGh3X2xlZF9zdGF0ZSAmIElETEVfTEVEKQotCQlncmVlbiA9IDE7Ci0JLy8gZWxzZSBib3RoIHNpZGVzIGFyZSBkaXNhYmxlZAotCi0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fTEVEX0dSRUVOLCBncmVlbik7Ci0Jb21hcF9zZXRfZ3Bpb19kYXRhb3V0KEdQSU9fTEVEX1JFRCwgcmVkKTsKLX0KLQotI2VuZGlmCi0KLXZvaWQgb3NrX2xlZHNfZXZlbnQobGVkX2V2ZW50X3QgZXZ0KQotewotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JdTE2CQlsZWRzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JaWYgKCEobGVkX3N0YXRlICYgTEVEX1NUQVRFX0VOQUJMRUQpICYmIGV2dCAhPSBsZWRfc3RhcnQpCi0JCWdvdG8gZG9uZTsKLQotCWxlZHMgPSBod19sZWRfc3RhdGU7Ci0Jc3dpdGNoIChldnQpIHsKLQljYXNlIGxlZF9zdGFydDoKLQkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9FTkFCTEVEOwotCQlod19sZWRfc3RhdGUgPSAwOwotCQlsZWRzID0gfjA7Ci0JCWJyZWFrOwotCi0JY2FzZSBsZWRfaGFsdGVkOgotCWNhc2UgbGVkX3N0b3A6Ci0JCWxlZF9zdGF0ZSAmPSB+TEVEX1NUQVRFX0VOQUJMRUQ7Ci0JCWh3X2xlZF9zdGF0ZSA9IDA7Ci0JCS8vIE5PVEU6ICB3b3JrIG1heSBzdGlsbCBiZSBwZW5kaW5nISEKLQkJYnJlYWs7Ci0KLQljYXNlIGxlZF9jbGFpbToKLQkJbGVkX3N0YXRlIHw9IExFRF9TVEFURV9DTEFJTUVEOwotCQlod19sZWRfc3RhdGUgPSAwOwotCQlsZWRzID0gfjA7Ci0JCWJyZWFrOwotCi0JY2FzZSBsZWRfcmVsZWFzZToKLQkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfQ0xBSU1FRDsKLQkJaHdfbGVkX3N0YXRlID0gMDsKLQkJYnJlYWs7Ci0KLSNpZmRlZglDT05GSUdfRkJfT01BUAotCi0jaWZkZWYgQ09ORklHX0xFRFNfVElNRVIKLQljYXNlIGxlZF90aW1lcjoKLQkJaHdfbGVkX3N0YXRlIF49IFRJTUVSX0xFRDsKLQkJbWlzdHJhbF9zZXRsZWQoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19MRURTX0NQVQotCWNhc2UgbGVkX2lkbGVfc3RhcnQ6Ci0JCWh3X2xlZF9zdGF0ZSB8PSBJRExFX0xFRDsKLQkJbWlzdHJhbF9zZXRsZWQoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIGxlZF9pZGxlX2VuZDoKLQkJaHdfbGVkX3N0YXRlICY9IH5JRExFX0xFRDsKLQkJbWlzdHJhbF9zZXRsZWQoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQotI2VuZGlmCS8qIENPTkZJR19GQl9PTUFQICovCi0KLQkvKiAiZ3JlZW4iID09IHRwcyBMRUQxIChsZWZ0bW9zdCwgbm9ybWFsbHkgcG93ZXItZ29vZCkKLQkgKiB3b3JrcyBvbmx5IHdpdGggREMgYWRhcHRlciwgbm90IG9uIGJhdHRlcnkgcG93ZXIhCi0JICovCi0JY2FzZSBsZWRfZ3JlZW5fb246Ci0JCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKLQkJCWh3X2xlZF9zdGF0ZSB8PSBHUkVFTl9MRUQ7Ci0JCWJyZWFrOwotCWNhc2UgbGVkX2dyZWVuX29mZjoKLQkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQotCQkJaHdfbGVkX3N0YXRlICY9IH5HUkVFTl9MRUQ7Ci0JCWJyZWFrOwotCi0JLyogImFtYmVyIiA9PSB0cHMgTEVEMiAobWlkZGxlKSAqLwotCWNhc2UgbGVkX2FtYmVyX29uOgotCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCi0JCQlod19sZWRfc3RhdGUgfD0gQU1CRVJfTEVEOwotCQlicmVhazsKLQljYXNlIGxlZF9hbWJlcl9vZmY6Ci0JCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKLQkJCWh3X2xlZF9zdGF0ZSAmPSB+QU1CRVJfTEVEOwotCQlicmVhazsKLQotCS8qICJyZWQiID09IExFRCBvbiB0cHMgZ3BpbzMgKHJpZ2h0bW9zdCkgKi8KLQljYXNlIGxlZF9yZWRfb246Ci0JCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKLQkJCWh3X2xlZF9zdGF0ZSB8PSBSRURfTEVEOwotCQlicmVhazsKLQljYXNlIGxlZF9yZWRfb2ZmOgotCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCi0JCQlod19sZWRfc3RhdGUgJj0gflJFRF9MRUQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JbGVkcyBePSBod19sZWRfc3RhdGU7Ci0JbGVkcyAmPSBUUFNfTEVEUzsKLQlpZiAobGVkcyAmJiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpKSB7Ci0JCXRwc19sZWRzX2NoYW5nZSB8PSBsZWRzOwotCQlzY2hlZHVsZV93b3JrKCZ3b3JrKTsKLQl9Ci0KLWRvbmU6Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvbWNic3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0YWQ3Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvbWNic3AuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vb21hcC9tY2JzcC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCi0gKiBBdXRob3I6IFNhbXVlbCBPcnRpeiA8c2FtdWVsLm9ydGl6QG5va2lhLmNvbT4KLSAqCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBNdWx0aWNoYW5uZWwgbW9kZSBub3Qgc3VwcG9ydGVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLQotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9tY2JzcC5oPgotCi0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+Ci0KLSNpZmRlZiBDT05GSUdfTUNCU1BfREVCVUcKLSNkZWZpbmUgREJHKHguLi4pCXByaW50ayh4KQotI2Vsc2UKLSNkZWZpbmUgREJHKHguLi4pCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi1zdHJ1Y3Qgb21hcF9tY2JzcCB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICBpb19iYXNlOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggICAgICAgcnhfd29yZF9sZW5ndGg7Ci0Jb21hcF9tY2JzcF93b3JkX2xlbmd0aCAgICAgICB0eF93b3JkX2xlbmd0aDsKLQotCS8qIElSUSBiYXNlZCBUWC9SWCAqLwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfaXJxOwotCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfaXJxOwotCi0JLyogRE1BIHN0dWZmICovCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfcnhfc3luYzsKLQlzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9yeF9sY2g7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfdHhfc3luYzsKLQlzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIGRtYV90eF9sY2g7Ci0KLQkvKiBDb21wbGV0aW9uIHF1ZXVlcyAqLwotCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgdHhfaXJxX2NvbXBsZXRpb247Ci0Jc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICByeF9pcnFfY29tcGxldGlvbjsKLQlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgIHR4X2RtYV9jb21wbGV0aW9uOwotCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgcnhfZG1hX2NvbXBsZXRpb247Ci0KLQlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgIGxvY2s7Ci19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfbWNic3AgbWNic3BbT01BUF9NQVhfTUNCU1BfQ09VTlRdOwotc3RhdGljIHN0cnVjdCBjbGsgKm1jYnNwX2RzcF9jayA9IDA7Ci1zdGF0aWMgc3RydWN0IGNsayAqbWNic3BfYXBpX2NrID0gMDsKLQotCi1zdGF0aWMgdm9pZCBvbWFwX21jYnNwX2R1bXBfcmVnKHU4IGlkKQotewotCURCRygiKioqKiBNQ0JTUCVkIHJlZ3MgKioqKlxuIiwgbWNic3BbaWRdLmlkKTsKLQlEQkcoIkRSUjI6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgRFJSMikpOwotCURCRygiRFJSMTogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBEUlIxKSk7Ci0JREJHKCJEWFIyOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIERYUjIpKTsKLQlEQkcoIkRYUjE6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgRFhSMSkpOwotCURCRygiU1BDUjI6IDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBTUENSMikpOwotCURCRygiU1BDUjE6IDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBTUENSMSkpOwotCURCRygiUkNSMjogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBSQ1IyKSk7Ci0JREJHKCJSQ1IxOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFJDUjEpKTsKLQlEQkcoIlhDUjI6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgWENSMikpOwotCURCRygiWENSMTogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBYQ1IxKSk7Ci0JREJHKCJTUkdSMjogMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNSR1IyKSk7Ci0JREJHKCJTUkdSMTogMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNSR1IxKSk7Ci0JREJHKCJQQ1IwOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFBDUjApKTsKLQlEQkcoIioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLX0KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tY2JzcF90eF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBvbWFwX21jYnNwICogbWNic3BfdHggPSAoc3RydWN0IG9tYXBfbWNic3AgKikoZGV2X2lkKTsKLQotCURCRygiVFggSVJRIGNhbGxiYWNrIDogMHgleFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwX3R4LT5pb19iYXNlLCBTUENSMikpOwotCi0JY29tcGxldGUoJm1jYnNwX3R4LT50eF9pcnFfY29tcGxldGlvbik7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tY2JzcF9yeF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBvbWFwX21jYnNwICogbWNic3BfcnggPSAoc3RydWN0IG9tYXBfbWNic3AgKikoZGV2X2lkKTsKLQotCURCRygiUlggSVJRIGNhbGxiYWNrIDogMHgleFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwX3J4LT5pb19iYXNlLCBTUENSMikpOwotCi0JY29tcGxldGUoJm1jYnNwX3J4LT5yeF9pcnFfY29tcGxldGlvbik7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0KLXN0YXRpYyB2b2lkIG9tYXBfbWNic3BfdHhfZG1hX2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKiBtY2JzcF9kbWFfdHggPSAoc3RydWN0IG9tYXBfbWNic3AgKikoZGF0YSk7Ci0KLQlEQkcoIlRYIERNQSBjYWxsYmFjayA6IDB4JXhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcF9kbWFfdHgtPmlvX2Jhc2UsIFNQQ1IyKSk7Ci0KLQkvKiBXZSBjYW4gZnJlZSB0aGUgY2hhbm5lbHMgKi8KLQlvbWFwX2ZyZWVfZG1hKG1jYnNwX2RtYV90eC0+ZG1hX3R4X2xjaCk7Ci0JbWNic3BfZG1hX3R4LT5kbWFfdHhfbGNoID0gLTE7Ci0KLQljb21wbGV0ZSgmbWNic3BfZG1hX3R4LT50eF9kbWFfY29tcGxldGlvbik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9tYXBfbWNic3BfcnhfZG1hX2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9tYXBfbWNic3AgKiBtY2JzcF9kbWFfcnggPSAoc3RydWN0IG9tYXBfbWNic3AgKikoZGF0YSk7Ci0KLQlEQkcoIlJYIERNQSBjYWxsYmFjayA6IDB4JXhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcF9kbWFfcngtPmlvX2Jhc2UsIFNQQ1IyKSk7Ci0KLQkvKiBXZSBjYW4gZnJlZSB0aGUgY2hhbm5lbHMgKi8KLQlvbWFwX2ZyZWVfZG1hKG1jYnNwX2RtYV9yeC0+ZG1hX3J4X2xjaCk7Ci0JbWNic3BfZG1hX3J4LT5kbWFfcnhfbGNoID0gLTE7Ci0KLQljb21wbGV0ZSgmbWNic3BfZG1hX3J4LT5yeF9kbWFfY29tcGxldGlvbik7Ci19Ci0KLQotLyoKLSAqIG9tYXBfbWNic3BfY29uZmlnIHNpbXBseSB3cml0ZSBhIGNvbmZpZyB0byB0aGUKLSAqIGFwcHJvcHJpYXRlIE1jQlNQLgotICogWW91IGVpdGhlciBjYWxsIHRoaXMgZnVuY3Rpb24gb3Igc2V0IHRoZSBNY0JTUCByZWdpc3RlcnMKLSAqIGJ5IHlvdXJzZWxmIGJlZm9yZSBjYWxsaW5nIG9tYXBfbWNic3Bfc3RhcnQoKS4KLSAqLwotCi12b2lkIG9tYXBfbWNic3BfY29uZmlnKHVuc2lnbmVkIGludCBpZCwgY29uc3Qgc3RydWN0IG9tYXBfbWNic3BfcmVnX2NmZyAqIGNvbmZpZykKLXsKLQl1MzIgaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOwotCi0JREJHKCJPTUFQLU1jQlNQOiBNY0JTUCVkICBpb19iYXNlOiAweCU4eFxuIiwgaWQrMSwgaW9fYmFzZSk7Ci0KLQkvKiBXZSB3cml0ZSB0aGUgZ2l2ZW4gY29uZmlnICovCi0JT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMiwgY29uZmlnLT5zcGNyMik7Ci0JT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUENSMSwgY29uZmlnLT5zcGNyMSk7Ci0JT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBSQ1IyLCBjb25maWctPnJjcjIpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgUkNSMSwgY29uZmlnLT5yY3IxKTsKLQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFhDUjIsIGNvbmZpZy0+eGNyMik7Ci0JT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBYQ1IxLCBjb25maWctPnhjcjEpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1JHUjIsIGNvbmZpZy0+c3JncjIpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1JHUjEsIGNvbmZpZy0+c3JncjEpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgTUNSMiwgY29uZmlnLT5tY3IyKTsKLQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIE1DUjEsIGNvbmZpZy0+bWNyMSk7Ci0JT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBQQ1IwLCBjb25maWctPnBjcjApOwotfQotCi0KLQotc3RhdGljIGludCBvbWFwX21jYnNwX2NoZWNrKHVuc2lnbmVkIGludCBpZCkKLXsKLQlpZiAoY3B1X2lzX29tYXA3MzAoKSkgewotCQlpZiAoaWQgPiBPTUFQX01BWF9NQ0JTUF9DT1VOVCAtIDEpIHsKLQkJICAgICAgIHByaW50ayhLRVJOX0VSUiAiT01BUC1NY0JTUDogTWNCU1AlZCBkb2Vzbid0IGV4aXN0XG4iLCBpZCArIDEpOwotCQkgICAgICAgcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQlpZiAoaWQgPiBPTUFQX01BWF9NQ0JTUF9DT1VOVCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIGRvZXNuJ3QgZXhpc3RcbiIsIGlkICsgMSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi0jZGVmaW5lIEVOX1hPUlBDSwkJMQotI2RlZmluZSBEU1BfUlNUQ1QyICAgICAgICAgICAgICAweGUxMDA4MDE0Ci0KLXN0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHNwX3JlcXVlc3Qodm9pZCkKLXsKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJb21hcF93cml0ZXcoKG9tYXBfcmVhZHcoQVJNX1JTVENUMSkgfCAoMSA8PCAxKSB8ICgxIDw8IDIpKSwKLQkJCSAgICBBUk1fUlNUQ1QxKTsKLQkJY2xrX2VuYWJsZShtY2JzcF9kc3BfY2spOwotCQljbGtfZW5hYmxlKG1jYnNwX2FwaV9jayk7Ci0KLQkJLyogZW5hYmxlIDEyTUh6IGNsb2NrIHRvIG1jYnNwIDEgJiAzICovCi0JCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhEU1BfSURMRUNUMikgfCAoMSA8PCBFTl9YT1JQQ0spLAotCQkJICAgICBEU1BfSURMRUNUMik7Ci0JCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhEU1BfUlNUQ1QyKSB8IDEgfCAxIDw8IDEsCi0JCQkgICAgIERTUF9SU1RDVDIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgb21hcF9tY2JzcF9kc3BfZnJlZSh2b2lkKQotewotCS8qIFVzZWxlc3MgZm9yIG5vdyAqLwotfQotCi0KLWludCBvbWFwX21jYnNwX3JlcXVlc3QodW5zaWduZWQgaW50IGlkKQotewotCWludCBlcnI7Ci0KLQlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogT24gMTUxMCwgMTYxMCBhbmQgMTcxMCwgTWNCU1AxIGFuZCBNY0JTUDMKLQkgKiBhcmUgRFNQIHB1YmxpYyBwZXJpcGhlcmFscy4KLQkgKi8KLQlpZiAoaWQgPT0gT01BUF9NQ0JTUDEgfHwgaWQgPT0gT01BUF9NQ0JTUDMpCi0JCW9tYXBfbWNic3BfZHNwX3JlcXVlc3QoKTsKLQotCXNwaW5fbG9jaygmbWNic3BbaWRdLmxvY2spOwotCWlmICghbWNic3BbaWRdLmZyZWUpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiT01BUC1NY0JTUDogTWNCU1AlZCBpcyBjdXJyZW50bHkgaW4gdXNlXG4iLCBpZCArIDEpOwotCQlzcGluX3VubG9jaygmbWNic3BbaWRdLmxvY2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JbWNic3BbaWRdLmZyZWUgPSAwOwotCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7Ci0KLQkvKiBXZSBuZWVkIHRvIGdldCBJUlFzIGhlcmUgKi8KLQllcnIgPSByZXF1ZXN0X2lycShtY2JzcFtpZF0udHhfaXJxLCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyLCAwLAotCQkJICAiTWNCU1AiLAotCQkJICAodm9pZCAqKSAoJm1jYnNwW2lkXSkpOwotCWlmIChlcnIgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIk9NQVAtTWNCU1A6IFVuYWJsZSB0byByZXF1ZXN0IFRYIElSUSAlZCBmb3IgTWNCU1AlZFxuIiwKLQkJICAgICAgIG1jYnNwW2lkXS50eF9pcnEsIG1jYnNwW2lkXS5pZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JaW5pdF9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2lycV9jb21wbGV0aW9uKSk7Ci0KLQotCWVyciA9IHJlcXVlc3RfaXJxKG1jYnNwW2lkXS5yeF9pcnEsIG9tYXBfbWNic3BfcnhfaXJxX2hhbmRsZXIsIDAsCi0JCQkgICJNY0JTUCIsCi0JCQkgICh2b2lkICopICgmbWNic3BbaWRdKSk7Ci0JaWYgKGVyciAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiT01BUC1NY0JTUDogVW5hYmxlIHRvIHJlcXVlc3QgUlggSVJRICVkIGZvciBNY0JTUCVkXG4iLAotCQkgICAgICAgbWNic3BbaWRdLnJ4X2lycSwgbWNic3BbaWRdLmlkKTsKLQkJZnJlZV9pcnEobWNic3BbaWRdLnR4X2lycSwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpbml0X2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfaXJxX2NvbXBsZXRpb24pKTsKLQlyZXR1cm4gMDsKLQotfQotCi12b2lkIG9tYXBfbWNic3BfZnJlZSh1bnNpZ25lZCBpbnQgaWQpCi17Ci0JaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKLQkJcmV0dXJuOwotCi0JaWYgKGlkID09IE9NQVBfTUNCU1AxIHx8IGlkID09IE9NQVBfTUNCU1AzKQotCQlvbWFwX21jYnNwX2RzcF9mcmVlKCk7Ci0KLQlzcGluX2xvY2soJm1jYnNwW2lkXS5sb2NrKTsKLQlpZiAobWNic3BbaWRdLmZyZWUpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiT01BUC1NY0JTUDogTWNCU1AlZCB3YXMgbm90IHJlc2VydmVkXG4iLCBpZCArIDEpOwotCQlzcGluX3VubG9jaygmbWNic3BbaWRdLmxvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JbWNic3BbaWRdLmZyZWUgPSAxOwotCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7Ci0KLQkvKiBGcmVlIElSUXMgKi8KLQlmcmVlX2lycShtY2JzcFtpZF0ucnhfaXJxLCAodm9pZCAqKSAoJm1jYnNwW2lkXSkpOwotCWZyZWVfaXJxKG1jYnNwW2lkXS50eF9pcnEsICh2b2lkICopICgmbWNic3BbaWRdKSk7Ci19Ci0KLS8qCi0gKiBIZXJlIHdlIHN0YXJ0IHRoZSBNY0JTUCwgYnkgZW5hYmxpbmcgdGhlIHNhbXBsZQotICogZ2VuZXJhdG9yLCBib3RoIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcnMsCi0gKiBhbmQgdGhlIGZyYW1lIHN5bmMuCi0gKi8KLXZvaWQgb21hcF9tY2JzcF9zdGFydCh1bnNpZ25lZCBpbnQgaWQpCi17Ci0JdTMyIGlvX2Jhc2U7Ci0JdTE2IHc7Ci0KLQlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQotCQlyZXR1cm47Ci0KLQlpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7Ci0KLQltY2JzcFtpZF0ucnhfd29yZF9sZW5ndGggPSAoKE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBSQ1IxKSA+PiA1KSAmIDB4Nyk7Ci0JbWNic3BbaWRdLnR4X3dvcmRfbGVuZ3RoID0gKChPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgWENSMSkgPj4gNSkgJiAweDcpOwotCi0JLyogU3RhcnQgdGhlIHNhbXBsZSBnZW5lcmF0b3IgKi8KLQl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKLQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCB3IHwgKDEgPDwgNikpOwotCi0JLyogRW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciAqLwotCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgfCAxKTsKLQotCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjEpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjEsIHcgfCAxKTsKLQotCXVkZWxheSgxMDApOwotCi0JLyogU3RhcnQgZnJhbWUgc3luYyAqLwotCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgfCAoMSA8PCA3KSk7Ci0KLQkvKiBEdW1wIE1jQlNQIFJlZ3MgKi8KLQlvbWFwX21jYnNwX2R1bXBfcmVnKGlkKTsKLQotfQotCi12b2lkIG9tYXBfbWNic3Bfc3RvcCh1bnNpZ25lZCBpbnQgaWQpCi17Ci0JdTMyIGlvX2Jhc2U7Ci0JdTE2IHc7Ci0KLQlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQotCQlyZXR1cm47Ci0KLQlpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7Ci0KLSAgICAgICAgLyogUmVzZXQgdHJhbnNtaXR0ZXIgKi8KLQl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKLQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCB3ICYgfigxKSk7Ci0KLQkvKiBSZXNldCByZWNlaXZlciAqLwotCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjEpOwotCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjEsIHcgJiB+KDEpKTsKLQotCS8qIFJlc2V0IHRoZSBzYW1wbGUgcmF0ZSBnZW5lcmF0b3IgKi8KLQl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKLQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCB3ICYgfigxIDw8IDYpKTsKLX0KLQotCi0vKgotICogSVJRIGJhc2VkIHdvcmQgdHJhbnNtaXNzaW9uLgotICovCi12b2lkIG9tYXBfbWNic3BfeG1pdF93b3JkKHVuc2lnbmVkIGludCBpZCwgdTMyIHdvcmQpCi17Ci0JdTMyIGlvX2Jhc2U7Ci0Jb21hcF9tY2JzcF93b3JkX2xlbmd0aCB3b3JkX2xlbmd0aCA9IG1jYnNwW2lkXS50eF93b3JkX2xlbmd0aDsKLQotCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCi0JCXJldHVybjsKLQotCWlvX2Jhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0udHhfaXJxX2NvbXBsZXRpb24pKTsKLQotCWlmICh3b3JkX2xlbmd0aCA+IE9NQVBfTUNCU1BfV09SRF8xNikKLQkJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBEWFIyLCB3b3JkID4+IDE2KTsKLQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIERYUjEsIHdvcmQgJiAweGZmZmYpOwotfQotCi11MzIgb21hcF9tY2JzcF9yZWN2X3dvcmQodW5zaWduZWQgaW50IGlkKQotewotCXUzMiBpb19iYXNlOwotCXUxNiB3b3JkX2xzYiwgd29yZF9tc2IgPSAwOwotCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggd29yZF9sZW5ndGggPSBtY2JzcFtpZF0ucnhfd29yZF9sZW5ndGg7Ci0KLQlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlvX2Jhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfaXJxX2NvbXBsZXRpb24pKTsKLQotCWlmICh3b3JkX2xlbmd0aCA+IE9NQVBfTUNCU1BfV09SRF8xNikKLQkJd29yZF9tc2IgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgRFJSMik7Ci0Jd29yZF9sc2IgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgRFJSMSk7Ci0KLQlyZXR1cm4gKHdvcmRfbHNiIHwgKHdvcmRfbXNiIDw8IDE2KSk7Ci19Ci0KLQotLyoKLSAqIFNpbXBsZSBETUEgYmFzZWQgYnVmZmVyIHJ4L3R4IHJvdXRpbmVzLgotICogTm90aGluZyBmYW5jeSwganVzdCBhIHNpbmdsZSBidWZmZXIgdHgvcnggdGhyb3VnaCBETUEuCi0gKiBUaGUgRE1BIHJlc291cmNlcyBhcmUgcmVsZWFzZWQgb25jZSB0aGUgdHJhbnNmZXIgaXMgZG9uZS4KLSAqIEZvciBhbnl0aGluZyBmYW5jaWVyLCB5b3Ugc2hvdWxkIHVzZSB5b3VyIG93biBjdXN0b21pemVkIERNQQotICogcm91dGluZXMgYW5kIGNhbGxiYWNrcy4KLSAqLwotaW50IG9tYXBfbWNic3BfeG1pdF9idWZmZXIodW5zaWduZWQgaW50IGlkLCBkbWFfYWRkcl90IGJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbmd0aCkKLXsKLQlpbnQgZG1hX3R4X2NoOwotCi0JaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAob21hcF9yZXF1ZXN0X2RtYShtY2JzcFtpZF0uZG1hX3R4X3N5bmMsICJNY0JTUCBUWCIsIG9tYXBfbWNic3BfdHhfZG1hX2NhbGxiYWNrLAotCQkJICAgICAmbWNic3BbaWRdLAotCQkJICAgICAmZG1hX3R4X2NoKSkgewotCQlwcmludGsoIk9NQVAtTWNCU1A6IFVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsIGZvciBNY0JTUCVkIFRYLiBUcnlpbmcgSVJRIGJhc2VkIFRYXG4iLCBpZCsxKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCW1jYnNwW2lkXS5kbWFfdHhfbGNoID0gZG1hX3R4X2NoOwotCi0JREJHKCJUWCBETUEgb24gY2hhbm5lbCAlZFxuIiwgZG1hX3R4X2NoKTsKLQotCWluaXRfY29tcGxldGlvbigmKG1jYnNwW2lkXS50eF9kbWFfY29tcGxldGlvbikpOwotCi0Jb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3R4X2xjaCwKLQkJCQkgICAgIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCi0JCQkJICAgICBsZW5ndGggPj4gMSwgMSwKLQkJCQkgICAgIE9NQVBfRE1BX1NZTkNfRUxFTUVOVCk7Ci0KLQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNic3BbaWRdLmRtYV90eF9sY2gsCi0JCQkJIE9NQVBfRE1BX1BPUlRfVElQQiwKLQkJCQkgT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCi0JCQkJIG1jYnNwW2lkXS5pb19iYXNlICsgT01BUF9NQ0JTUF9SRUdfRFhSMSk7Ci0KLQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3R4X2xjaCwKLQkJCQlPTUFQX0RNQV9QT1JUX0VNSUZGLAotCQkJCU9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAotCQkJCWJ1ZmZlcik7Ci0KLQlvbWFwX3N0YXJ0X2RtYShtY2JzcFtpZF0uZG1hX3R4X2xjaCk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS50eF9kbWFfY29tcGxldGlvbikpOwotCXJldHVybiAwOwotfQotCi0KLWludCBvbWFwX21jYnNwX3JlY3ZfYnVmZmVyKHVuc2lnbmVkIGludCBpZCwgZG1hX2FkZHJfdCBidWZmZXIsIHVuc2lnbmVkIGludCBsZW5ndGgpCi17Ci0JaW50IGRtYV9yeF9jaDsKLQotCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKG9tYXBfcmVxdWVzdF9kbWEobWNic3BbaWRdLmRtYV9yeF9zeW5jLCAiTWNCU1AgUlgiLCBvbWFwX21jYnNwX3J4X2RtYV9jYWxsYmFjaywKLQkJCSAgICAgJm1jYnNwW2lkXSwKLQkJCSAgICAgJmRtYV9yeF9jaCkpIHsKLQkJcHJpbnRrKCJVbmFibGUgdG8gcmVxdWVzdCBETUEgY2hhbm5lbCBmb3IgTWNCU1AlZCBSWC4gVHJ5aW5nIElSUSBiYXNlZCBSWFxuIiwgaWQrMSk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQltY2JzcFtpZF0uZG1hX3J4X2xjaCA9IGRtYV9yeF9jaDsKLQotCURCRygiUlggRE1BIG9uIGNoYW5uZWwgJWRcbiIsIGRtYV9yeF9jaCk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfZG1hX2NvbXBsZXRpb24pKTsKLQotCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMobWNic3BbaWRdLmRtYV9yeF9sY2gsCi0JCQkJICAgICBPTUFQX0RNQV9EQVRBX1RZUEVfUzE2LAotCQkJCSAgICAgbGVuZ3RoID4+IDEsIDEsCi0JCQkJICAgICBPTUFQX0RNQV9TWU5DX0VMRU1FTlQpOwotCi0Jb21hcF9zZXRfZG1hX3NyY19wYXJhbXMobWNic3BbaWRdLmRtYV9yeF9sY2gsCi0JCQkJT01BUF9ETUFfUE9SVF9USVBCLAotCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULAotCQkJCW1jYnNwW2lkXS5pb19iYXNlICsgT01BUF9NQ0JTUF9SRUdfRFJSMSk7Ci0KLQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMobWNic3BbaWRdLmRtYV9yeF9sY2gsCi0JCQkJIE9NQVBfRE1BX1BPUlRfRU1JRkYsCi0JCQkJIE9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAotCQkJCSBidWZmZXIpOwotCi0Jb21hcF9zdGFydF9kbWEobWNic3BbaWRdLmRtYV9yeF9sY2gpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfZG1hX2NvbXBsZXRpb24pKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogU1BJIHdyYXBwZXIuCi0gKiBTaW5jZSBTUEkgc2V0dXAgaXMgbXVjaCBzaW1wbGVyIHRoYW4gdGhlIGdlbmVyaWMgTWNCU1Agb25lLAotICogdGhpcyB3cmFwcGVyIGp1c3QgbmVlZCBhbiBvbWFwX21jYnNwX3NwaV9jZmcgc3RydWN0dXJlIGFzIGFuIGlucHV0LgotICogT25jZSB0aGlzIGlzIGRvbmUsIHlvdSBjYW4gY2FsbCBvbWFwX21jYnNwX3N0YXJ0KCkuCi0gKi8KLXZvaWQgb21hcF9tY2JzcF9zZXRfc3BpX21vZGUodW5zaWduZWQgaW50IGlkLCBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9zcGlfY2ZnICogc3BpX2NmZykKLXsKLQlzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnIG1jYnNwX2NmZzsKLQotCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCi0JCXJldHVybjsKLQotCW1lbXNldCgmbWNic3BfY2ZnLCAwLCBzaXplb2Yoc3RydWN0IG9tYXBfbWNic3BfcmVnX2NmZykpOwotCi0JLyogU1BJIGhhcyBvbmx5IG9uZSBmcmFtZSAqLwotCW1jYnNwX2NmZy5yY3IxIHw9IChSV0RMRU4xKHNwaV9jZmctPndvcmRfbGVuZ3RoKSB8IFJGUkxFTjEoMCkpOwotCW1jYnNwX2NmZy54Y3IxIHw9IChYV0RMRU4xKHNwaV9jZmctPndvcmRfbGVuZ3RoKSB8IFhGUkxFTjEoMCkpOwotCi0gICAgICAgIC8qIENsb2NrIHN0b3AgbW9kZSAqLwotCWlmIChzcGlfY2ZnLT5jbGtfc3RwX21vZGUgPT0gT01BUF9NQ0JTUF9DTEtfU1RQX01PREVfTk9fREVMQVkpCi0JCW1jYnNwX2NmZy5zcGNyMSB8PSAoMSA8PCAxMik7Ci0JZWxzZQotCQltY2JzcF9jZmcuc3BjcjEgfD0gKDMgPDwgMTEpOwotCi0JLyogU2V0IGNsb2NrIHBhcml0aWVzICovCi0JaWYgKHNwaV9jZmctPnJ4X2Nsb2NrX3BvbGFyaXR5ID09IE9NQVBfTUNCU1BfQ0xLX1JJU0lORykKLQkJbWNic3BfY2ZnLnBjcjAgfD0gQ0xLUlA7Ci0JZWxzZQotCQltY2JzcF9jZmcucGNyMCAmPSB+Q0xLUlA7Ci0KLQlpZiAoc3BpX2NmZy0+dHhfY2xvY2tfcG9sYXJpdHkgPT0gT01BUF9NQ0JTUF9DTEtfUklTSU5HKQotCQltY2JzcF9jZmcucGNyMCAmPSB+Q0xLWFA7Ci0JZWxzZQotCQltY2JzcF9jZmcucGNyMCB8PSBDTEtYUDsKLQotCS8qIFNldCBTQ0xLTUUgdG8gMCBhbmQgQ0xLU00gdG8gMSAqLwotCW1jYnNwX2NmZy5wY3IwICY9IH5TQ0xLTUU7Ci0JbWNic3BfY2ZnLnNyZ3IyIHw9IENMS1NNOwotCi0JLyogU2V0IEZTWFAgKi8KLQlpZiAoc3BpX2NmZy0+ZnN4X3BvbGFyaXR5ID09IE9NQVBfTUNCU1BfRlNfQUNUSVZFX0hJR0gpCi0JCW1jYnNwX2NmZy5wY3IwICY9IH5GU1hQOwotCWVsc2UKLQkJbWNic3BfY2ZnLnBjcjAgfD0gRlNYUDsKLQotCWlmIChzcGlfY2ZnLT5zcGlfbW9kZSA9PSBPTUFQX01DQlNQX1NQSV9NQVNURVIpIHsKLQkJbWNic3BfY2ZnLnBjcjAgfD0gQ0xLWE07Ci0JCW1jYnNwX2NmZy5zcmdyMSB8PSBDTEtHRFYoc3BpX2NmZy0+Y2xrX2RpdiAtMSk7Ci0JCW1jYnNwX2NmZy5wY3IwIHw9IEZTWE07Ci0JCW1jYnNwX2NmZy5zcmdyMiAmPSB+RlNHTTsKLQkJbWNic3BfY2ZnLnhjcjIgfD0gWERBVERMWSgxKTsKLQkJbWNic3BfY2ZnLnJjcjIgfD0gUkRBVERMWSgxKTsKLQl9Ci0JZWxzZSB7Ci0JCW1jYnNwX2NmZy5wY3IwICY9IH5DTEtYTTsKLQkJbWNic3BfY2ZnLnNyZ3IxIHw9IENMS0dEVigxKTsKLQkJbWNic3BfY2ZnLnBjcjAgJj0gfkZTWE07Ci0JCW1jYnNwX2NmZy54Y3IyICY9IH5YREFURExZKDMpOwotCQltY2JzcF9jZmcucmNyMiAmPSB+UkRBVERMWSgzKTsKLQl9Ci0KLQltY2JzcF9jZmcueGNyMiAmPSB+WFBIQVNFOwotCW1jYnNwX2NmZy5yY3IyICY9IH5SUEhBU0U7Ci0KLQlvbWFwX21jYnNwX2NvbmZpZyhpZCwgJm1jYnNwX2NmZyk7Ci19Ci0KLQotLyoKLSAqIE1jQlNQMSBhbmQgTWNCU1AzIGFyZSBkaXJlY3RseSBtYXBwZWQgb24gMTYxMCBhbmQgMTUxMC4KLSAqIDczMCBoYXMgb25seSAyIE1jQlNQLCBhbmQgYm90aCBvZiB0aGVtIGFyZSBNUFUgcGVyaXBoZXJhbHMuCi0gKi8KLXN0cnVjdCBvbWFwX21jYnNwX2luZm8gewotCXUzMiB2aXJ0X2Jhc2U7Ci0JdTggZG1hX3J4X3N5bmMsIGRtYV90eF9zeW5jOwotCXUxNiByeF9pcnEsIHR4X2lycTsKLX07Ci0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfbWNic3BfaW5mbyBtY2JzcF83MzBbXSA9IHsKLQlbMF0gPSB7IC52aXJ0X2Jhc2UgPSBpb19wMnYoT01BUDczMF9NQ0JTUDFfQkFTRSksCi0JCS5kbWFfcnhfc3luYyA9IE9NQVBfRE1BX01DQlNQMV9SWCwKLQkJLmRtYV90eF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1RYLAotCQkucnhfaXJxID0gSU5UXzczMF9NY0JTUDFSWCwKLQkJLnR4X2lycSA9IElOVF83MzBfTWNCU1AxVFggfSwKLQlbMV0gPSB7IC52aXJ0X2Jhc2UgPSBpb19wMnYoT01BUDczMF9NQ0JTUDJfQkFTRSksCi0JCS5kbWFfcnhfc3luYyA9IE9NQVBfRE1BX01DQlNQM19SWCwKLQkJLmRtYV90eF9zeW5jID0gT01BUF9ETUFfTUNCU1AzX1RYLAotCQkucnhfaXJxID0gSU5UXzczMF9NY0JTUDJSWCwKLQkJLnR4X2lycSA9IElOVF83MzBfTWNCU1AyVFggfSwKLX07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfbWNic3BfaW5mbyBtY2JzcF8xNTEwW10gPSB7Ci0JWzBdID0geyAudmlydF9iYXNlID0gT01BUDE1MTBfTUNCU1AxX0JBU0UsCi0JCS5kbWFfcnhfc3luYyA9IE9NQVBfRE1BX01DQlNQMV9SWCwKLQkJLmRtYV90eF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1RYLAotCQkucnhfaXJxID0gSU5UX01jQlNQMVJYLAotCQkudHhfaXJxID0gSU5UX01jQlNQMVRYIH0sCi0JWzFdID0geyAudmlydF9iYXNlID0gaW9fcDJ2KE9NQVAxNTEwX01DQlNQMl9CQVNFKSwKLQkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AyX1JYLAotCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDJfVFgsCi0JCS5yeF9pcnEgPSBJTlRfMTUxMF9TUElfUlgsCi0JCS50eF9pcnEgPSBJTlRfMTUxMF9TUElfVFggfSwKLQlbMl0gPSB7IC52aXJ0X2Jhc2UgPSBPTUFQMTUxMF9NQ0JTUDNfQkFTRSwKLQkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AzX1JYLAotCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfVFgsCi0JCS5yeF9pcnEgPSBJTlRfTWNCU1AzUlgsCi0JCS50eF9pcnEgPSBJTlRfTWNCU1AzVFggfSwKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfbWNic3BfaW5mbyBtY2JzcF8xNjEwW10gPSB7Ci0JWzBdID0geyAudmlydF9iYXNlID0gT01BUDE2MTBfTUNCU1AxX0JBU0UsCi0JCS5kbWFfcnhfc3luYyA9IE9NQVBfRE1BX01DQlNQMV9SWCwKLQkJLmRtYV90eF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1RYLAotCQkucnhfaXJxID0gSU5UX01jQlNQMVJYLAotCQkudHhfaXJxID0gSU5UX01jQlNQMVRYIH0sCi0JWzFdID0geyAudmlydF9iYXNlID0gaW9fcDJ2KE9NQVAxNjEwX01DQlNQMl9CQVNFKSwKLQkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AyX1JYLAotCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDJfVFgsCi0JCS5yeF9pcnEgPSBJTlRfMTYxMF9NY0JTUDJfUlgsCi0JCS50eF9pcnEgPSBJTlRfMTYxMF9NY0JTUDJfVFggfSwKLQlbMl0gPSB7IC52aXJ0X2Jhc2UgPSBPTUFQMTYxMF9NQ0JTUDNfQkFTRSwKLQkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AzX1JYLAotCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfVFgsCi0JCS5yeF9pcnEgPSBJTlRfTWNCU1AzUlgsCi0JCS50eF9pcnEgPSBJTlRfTWNCU1AzVFggfSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgb21hcF9tY2JzcF9pbml0KHZvaWQpCi17Ci0JaW50IG1jYnNwX2NvdW50ID0gMCwgaTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfbWNic3BfaW5mbyAqbWNic3BfaW5mbzsKLQotCXByaW50aygiSW5pdGlhbGl6aW5nIE9NQVAgTWNCU1Agc3lzdGVtXG4iKTsKLQotCW1jYnNwX2RzcF9jayA9IGNsa19nZXQoMCwgImRzcF9jayIpOwotCWlmIChJU19FUlIobWNic3BfZHNwX2NrKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1jYnNwOiBjb3VsZCBub3QgYWNxdWlyZSBkc3BfY2sgaGFuZGxlLlxuIik7Ci0JCXJldHVybiBQVFJfRVJSKG1jYnNwX2RzcF9jayk7Ci0JfQotCW1jYnNwX2FwaV9jayA9IGNsa19nZXQoMCwgImFwaV9jayIpOwotCWlmIChJU19FUlIobWNic3BfZHNwX2NrKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1jYnNwOiBjb3VsZCBub3QgYWNxdWlyZSBhcGlfY2sgaGFuZGxlLlxuIik7Ci0JCXJldHVybiBQVFJfRVJSKG1jYnNwX2FwaV9jayk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAotCWlmIChjcHVfaXNfb21hcDczMCgpKSB7Ci0JCW1jYnNwX2luZm8gPSBtY2JzcF83MzA7Ci0JCW1jYnNwX2NvdW50ID0gQVJSQVlfU0laRShtY2JzcF83MzApOwotCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCW1jYnNwX2luZm8gPSBtY2JzcF8xNTEwOwotCQltY2JzcF9jb3VudCA9IEFSUkFZX1NJWkUobWNic3BfMTUxMCk7Ci0JfQotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJbWNic3BfaW5mbyA9IG1jYnNwXzE2MTA7Ci0JCW1jYnNwX2NvdW50ID0gQVJSQVlfU0laRShtY2JzcF8xNjEwKTsKLQl9Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgT01BUF9NQVhfTUNCU1BfQ09VTlQgOyBpKyspIHsKLQkJaWYgKGkgPj0gbWNic3BfY291bnQpIHsKLQkJCW1jYnNwW2ldLmlvX2Jhc2UgPSAwOwotCQkJbWNic3BbaV0uZnJlZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQkJfQotCQltY2JzcFtpXS5pZCA9IGkgKyAxOwotCQltY2JzcFtpXS5mcmVlID0gMTsKLQkJbWNic3BbaV0uZG1hX3R4X2xjaCA9IC0xOwotCQltY2JzcFtpXS5kbWFfcnhfbGNoID0gLTE7Ci0KLQkJbWNic3BbaV0uaW9fYmFzZSA9IG1jYnNwX2luZm9baV0udmlydF9iYXNlOwotCQltY2JzcFtpXS50eF9pcnEgPSBtY2JzcF9pbmZvW2ldLnR4X2lycTsKLQkJbWNic3BbaV0ucnhfaXJxID0gbWNic3BfaW5mb1tpXS5yeF9pcnE7Ci0JCW1jYnNwW2ldLmRtYV9yeF9zeW5jID0gbWNic3BfaW5mb1tpXS5kbWFfcnhfc3luYzsKLQkJbWNic3BbaV0uZG1hX3R4X3N5bmMgPSBtY2JzcF9pbmZvW2ldLmRtYV90eF9zeW5jOwotCQlzcGluX2xvY2tfaW5pdCgmbWNic3BbaV0ubG9jayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotYXJjaF9pbml0Y2FsbChvbWFwX21jYnNwX2luaXQpOwotCi1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfY29uZmlnKTsKLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9yZXF1ZXN0KTsKLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9mcmVlKTsKLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zdGFydCk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3Bfc3RvcCk7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfeG1pdF93b3JkKTsKLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9yZWN2X3dvcmQpOwotRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3htaXRfYnVmZmVyKTsKLUVYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9yZWN2X2J1ZmZlcik7Ci1FWFBPUlRfU1lNQk9MKG9tYXBfbWNic3Bfc2V0X3NwaV9tb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9tdXguYyBiL2FyY2gvYXJtL21hY2gtb21hcC9tdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmM2M2ZS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAvbXV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9tdXguYwotICoKLSAqIFV0aWxpdHkgdG8gc2V0IHRoZSBPbWFwIE1VWCBhbmQgUFVMTF9EV04gcmVnaXN0ZXJzIGZyb20gYSB0YWJsZSBpbiBtdXguaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueS5saW5kZ3JlbkBub2tpYS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2RlZmluZSBfX01VWF9DX18KLSNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KLQotI2lmZGVmIENPTkZJR19PTUFQX01VWAotCi0vKgotICogU2V0cyB0aGUgT21hcCBNVVggYW5kIFBVTExfRFdOIHJlZ2lzdGVycyBiYXNlZCBvbiB0aGUgdGFibGUKLSAqLwotaW50IF9faW5pdF9vcl9tb2R1bGUKLW9tYXBfY2ZnX3JlZyhjb25zdCByZWdfY2ZnX3QgcmVnX2NmZykKLXsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG11eF9zcGluX2xvY2spOwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlyZWdfY2ZnX3NldCAqY2ZnOwotCXVuc2lnbmVkIGludCByZWdfb3JpZyA9IDAsIHJlZyA9IDAsIHB1X3BkX29yaWcgPSAwLCBwdV9wZCA9IDAsCi0JCXB1bGxfb3JpZyA9IDAsIHB1bGwgPSAwOwotCXVuc2lnbmVkIGludCBtYXNrLCB3YXJuID0gMDsKLQotCWlmIChyZWdfY2ZnID4gQVJSQVlfU0laRShyZWdfY2ZnX3RhYmxlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIk1VWDogcmVnX2NmZyAlZFxuIiwgcmVnX2NmZyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNmZyA9ICZyZWdfY2ZnX3RhYmxlW3JlZ19jZmddOwotCi0JLyoKLQkgKiBXZSBkbyBhIHByZXR0eSBsb25nIHNlY3Rpb24gaGVyZSB3aXRoIGxvY2sgb24sIGJ1dCBwaW4gbXV4aW5nCi0JICogc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGRyaXZlciBpbml0IGZvciBlYWNoIGRyaXZlciwgc28gaXQncyBub3QgdGltZQotCSAqIGNyaXRpY2FsLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7Ci0KLQkvKiBDaGVjayB0aGUgbXV4IHJlZ2lzdGVyIGluIHF1ZXN0aW9uICovCi0JaWYgKGNmZy0+bXV4X3JlZykgewotCQl1bnNpZ25lZAl0bXAxLCB0bXAyOwotCi0JCXJlZ19vcmlnID0gb21hcF9yZWFkbChjZmctPm11eF9yZWcpOwotCi0JCS8qIFRoZSBtdXggcmVnaXN0ZXJzIGFsd2F5cyBzZWVtIHRvIGJlIDMgYml0cyBsb25nICovCi0JCW1hc2sgPSAoMHg3IDw8IGNmZy0+bWFza19vZmZzZXQpOwotCQl0bXAxID0gcmVnX29yaWcgJiBtYXNrOwotCQlyZWcgPSByZWdfb3JpZyAmIH5tYXNrOwotCi0JCXRtcDIgPSAoY2ZnLT5tYXNrIDw8IGNmZy0+bWFza19vZmZzZXQpOwotCQlyZWcgfD0gdG1wMjsKLQotCQlpZiAodG1wMSAhPSB0bXAyKQotCQkJd2FybiA9IDE7Ci0KLQkJb21hcF93cml0ZWwocmVnLCBjZmctPm11eF9yZWcpOwotCX0KLQotCS8qIENoZWNrIGZvciBwdWxsIHVwIG9yIHB1bGwgZG93biBzZWxlY3Rpb24gb24gMTYxMCAqLwotCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJaWYgKGNmZy0+cHVfcGRfcmVnICYmIGNmZy0+cHVsbF92YWwpIHsKLQkJCXB1X3BkX29yaWcgPSBvbWFwX3JlYWRsKGNmZy0+cHVfcGRfcmVnKTsKLQkJCW1hc2sgPSAxIDw8IGNmZy0+cHVsbF9iaXQ7Ci0KLQkJCWlmIChjZmctPnB1X3BkX3ZhbCkgewotCQkJCWlmICghKHB1X3BkX29yaWcgJiBtYXNrKSkKLQkJCQkJd2FybiA9IDE7Ci0JCQkJLyogVXNlIHB1bGwgdXAgKi8KLQkJCQlwdV9wZCA9IHB1X3BkX29yaWcgfCBtYXNrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocHVfcGRfb3JpZyAmIG1hc2spCi0JCQkJCXdhcm4gPSAxOwotCQkJCS8qIFVzZSBwdWxsIGRvd24gKi8KLQkJCQlwdV9wZCA9IHB1X3BkX29yaWcgJiB+bWFzazsKLQkJCX0KLQkJCW9tYXBfd3JpdGVsKHB1X3BkLCBjZmctPnB1X3BkX3JlZyk7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBmb3IgYW4gYXNzb2NpYXRlZCBwdWxsIGRvd24gcmVnaXN0ZXIgKi8KLQlpZiAoY2ZnLT5wdWxsX3JlZykgewotCQlwdWxsX29yaWcgPSBvbWFwX3JlYWRsKGNmZy0+cHVsbF9yZWcpOwotCQltYXNrID0gMSA8PCBjZmctPnB1bGxfYml0OwotCi0JCWlmIChjZmctPnB1bGxfdmFsKSB7Ci0JCQlpZiAocHVsbF9vcmlnICYgbWFzaykKLQkJCQl3YXJuID0gMTsKLQkJCS8qIExvdyBiaXQgPSBwdWxsIGVuYWJsZWQgKi8KLQkJCXB1bGwgPSBwdWxsX29yaWcgJiB+bWFzazsKLQkJfSBlbHNlIHsKLQkJCWlmICghKHB1bGxfb3JpZyAmIG1hc2spKQotCQkJCXdhcm4gPSAxOwotCQkJLyogSGlnaCBiaXQgPSBwdWxsIGRpc2FibGVkICovCi0JCQlwdWxsID0gcHVsbF9vcmlnIHwgbWFzazsKLQkJfQotCi0JCW9tYXBfd3JpdGVsKHB1bGwsIGNmZy0+cHVsbF9yZWcpOwotCX0KLQotCWlmICh3YXJuKSB7Ci0jaWZkZWYgQ09ORklHX09NQVBfTVVYX1dBUk5JTkdTCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1VWDogaW5pdGlhbGl6ZWQgJXNcbiIsIGNmZy0+bmFtZSk7Ci0jZW5kaWYKLQl9Ci0KLSNpZmRlZiBDT05GSUdfT01BUF9NVVhfREVCVUcKLQlpZiAoY2ZnLT5kZWJ1ZyB8fCB3YXJuKSB7Ci0JCXByaW50aygiTVVYOiBTZXR0aW5nIHJlZ2lzdGVyICVzXG4iLCBjZmctPm5hbWUpOwotCQlwcmludGsoIiAgICAgICVzICgweCUwOHgpID0gMHglMDh4IC0+IDB4JTA4eFxuIiwKLQkJICAgICAgIGNmZy0+bXV4X3JlZ19uYW1lLCBjZmctPm11eF9yZWcsIHJlZ19vcmlnLCByZWcpOwotCi0JCWlmICghY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJCWlmIChjZmctPnB1X3BkX3JlZyAmJiBjZmctPnB1bGxfdmFsKSB7Ci0JCQkJcHJpbnRrKCIgICAgICAlcyAoMHglMDh4KSA9IDB4JTA4eCAtPiAweCUwOHhcbiIsCi0JCQkJICAgICAgIGNmZy0+cHVfcGRfbmFtZSwgY2ZnLT5wdV9wZF9yZWcsCi0JCQkJICAgICAgIHB1X3BkX29yaWcsIHB1X3BkKTsKLQkJCX0KLQkJfQotCi0JCWlmIChjZmctPnB1bGxfcmVnKQotCQkJcHJpbnRrKCIgICAgICAlcyAoMHglMDh4KSA9IDB4JTA4eCAtPiAweCUwOHhcbiIsCi0JCQkgICAgICAgY2ZnLT5wdWxsX25hbWUsIGNmZy0+cHVsbF9yZWcsIHB1bGxfb3JpZywgcHVsbCk7Ci0JfQotI2VuZGlmCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfT01BUF9NVVhfRVJST1JTCi0JcmV0dXJuIHdhcm4gPyAtRVRYVEJTWSA6IDA7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KLUVYUE9SVF9TWU1CT0wob21hcF9jZmdfcmVnKTsKLQotI2VuZGlmCS8qIENPTkZJR19PTUFQX01VWCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYyBiL2FyY2gvYXJtL21hY2gtb21hcC9vY3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Y2VkMTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwL29jcGkuYwotICoKLSAqIE1pbmltYWwgT0NQIGJ1cyBzdXBwb3J0IGZvciBvbWFwMTZ4eAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KLSAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KLSAqCi0gKiBNb2RpZmllZCBmb3IgY2xvY2sgZnJhbWV3b3JrIGJ5IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgotCi0jZGVmaW5lIE9DUElfQkFTRQkJMHhmZmZlYzMyMAotI2RlZmluZSBPQ1BJX0ZBVUxUCQkoT0NQSV9CQVNFICsgMHgwMCkKLSNkZWZpbmUgT0NQSV9DTURfRkFVTFQJCShPQ1BJX0JBU0UgKyAweDA0KQotI2RlZmluZSBPQ1BJX1NJTlQwCQkoT0NQSV9CQVNFICsgMHgwOCkKLSNkZWZpbmUgT0NQSV9UQUJPUlQJCShPQ1BJX0JBU0UgKyAweDBjKQotI2RlZmluZSBPQ1BJX1NJTlQxCQkoT0NQSV9CQVNFICsgMHgxMCkKLSNkZWZpbmUgT0NQSV9QUk9UCQkoT0NQSV9CQVNFICsgMHgxNCkKLSNkZWZpbmUgT0NQSV9TRUMJCShPQ1BJX0JBU0UgKyAweDE4KQotCi0vKiBVU0IgT0hDSSBPQ1BJIGFjY2VzcyBlcnJvciByZWdpc3RlcnMgKi8KLSNkZWZpbmUgSE9TVFVFQUREUgkweGZmZmJhMGUwCi0jZGVmaW5lIEhPU1RVRVNUQVRVUwkweGZmZmJhMGU0Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpvY3BpX2NrOwotCi0vKgotICogRW5hYmxlcyBkZXZpY2UgYWNjZXNzIHRvIE9NQVAgYnVzZXMgdmlhIHRoZSBPQ1BJIGJyaWRnZQotICogRklYTUU6IEFkZCBsb2NraW5nCi0gKi8KLWludCBvY3BpX2VuYWJsZSh2b2lkKQotewotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGNsb2NrIGZvciBPQ1BJICovCi0JY2xrX2VuYWJsZShvY3BpX2NrKTsKLQotCS8qIEVuYWJsZSBhY2Nlc3MgZm9yIE9IQ0kgaW4gT0NQSSAqLwotCXZhbCA9IG9tYXBfcmVhZGwoT0NQSV9QUk9UKTsKLQl2YWwgJj0gfjB4ZmY7Ci0JLy92YWwgJj0gKDEgPDwgMCk7CS8qIEFsbG93IGFjY2VzcyBvbmx5IHRvIEVNSUZTICovCi0Jb21hcF93cml0ZWwodmFsLCBPQ1BJX1BST1QpOwotCi0JdmFsID0gb21hcF9yZWFkbChPQ1BJX1NFQyk7Ci0JdmFsICY9IH4weGZmOwotCW9tYXBfd3JpdGVsKHZhbCwgT0NQSV9TRUMpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG9jcGlfZW5hYmxlKTsKLQotc3RhdGljIGludCBfX2luaXQgb21hcF9vY3BpX2luaXQodm9pZCkKLXsKLQlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9jcGlfY2sgPSBjbGtfZ2V0KE5VTEwsICJsM19vY3BpX2NrIik7Ci0JaWYgKElTX0VSUihvY3BpX2NrKSkKLQkJcmV0dXJuIFBUUl9FUlIob2NwaV9jayk7Ci0KLQljbGtfdXNlKG9jcGlfY2spOwotCW9jcGlfZW5hYmxlKCk7Ci0JcHJpbnRrKCJPTUFQIE9DUEkgaW50ZXJjb25uZWN0IGRyaXZlciBsb2FkZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX29jcGlfZXhpdCh2b2lkKQotewotCS8qIFJFVklTSVQ6IERpc2FibGUgT0NQSSAqLwotCi0JaWYgKCFjcHVfaXNfb21hcDE2eHgoKSkKLQkJcmV0dXJuOwotCi0JY2xrX3VudXNlKG9jcGlfY2spOwotCWNsa19wdXQob2NwaV9jayk7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgT0NQSSBidXMgY29udHJvbGxlciBtb2R1bGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLW1vZHVsZV9pbml0KG9tYXBfb2NwaV9pbml0KTsKLW1vZHVsZV9leGl0KG9tYXBfb2NwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9wbS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3BtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZmFjMTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9wbS5jCi0gKgotICogT01BUCBQb3dlciBNYW5hZ2VtZW50IFJvdXRpbmVzCi0gKgotICogT3JpZ2luYWwgY29kZSBmb3IgdGhlIFNBMTF4MDoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4KLSAqCi0gKiBNb2RpZmllZCBmb3IgdGhlIFBYQTI1MCBieSBOaWNvbGFzIFBpdHJlOgotICogQ29weXJpZ2h0IChjKSAyMDAyIE1vbnRhIFZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKgotICogTW9kaWZpZWQgZm9yIHRoZSBPTUFQMTUxMCBieSBEYXZpZCBTaW5nbGV0b246Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgTW9udGEgVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBDbGVhbnVwIDIwMDQgZm9yIE9NQVAxNTEwLzE2MTAgYnkgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCi0gKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcG0uaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvb21hcDE2eHguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9wbS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdHBzNjUwMTAuaD4KLQotI2luY2x1ZGUgImNsb2NrLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfU0laRV07Ci1zdGF0aWMgdW5zaWduZWQgc2hvcnQgdWxwZF9zbGVlcF9zYXZlW1VMUERfU0xFRVBfU0FWRV9TSVpFXTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbXB1aTE1MTBfc2xlZXBfc2F2ZVtNUFVJMTUxMF9TTEVFUF9TQVZFX1NJWkVdOwotc3RhdGljIHVuc2lnbmVkIGludCBtcHVpMTYxMF9zbGVlcF9zYXZlW01QVUkxNjEwX1NMRUVQX1NBVkVfU0laRV07Ci0KLS8qCi0gKiBMZXQncyBwb3dlciBkb3duIG9uIGlkbGUsIGJ1dCBvbmx5IGlmIHdlIGFyZSByZWFsbHkKLSAqIGlkbGUsIGJlY2F1c2Ugb25jZSB3ZSBzdGFydCBkb3duIHRoZSBwYXRoIG9mCi0gKiBnb2luZyBpZGxlIHdlIGNvbnRpbnVlIHRvIGRvIGlkbGUgZXZlbiBpZiB3ZSBnZXQKLSAqIGEgY2xvY2sgdGljayBpbnRlcnJ1cHQgLiAuCi0gKi8KLXZvaWQgb21hcF9wbV9pZGxlKHZvaWQpCi17Ci0JaW50ICgqZnVuY19wdHIpKHZvaWQpID0gMDsKLQl1bnNpZ25lZCBpbnQgbWFzazMyID0gMDsKLQotCS8qCi0JICogSWYgdGhlIERTUCBpcyBiZWluZyB1c2VkIGxldCdzIGp1c3QgaWRsZSB0aGUgQ1BVLCB0aGUgb3ZlcmhlYWQKLQkgKiB0byB3YWtlIHVwIGZyb20gQmlnIFNsZWVwIGlzIGJpZywgbWlsbGlzZWNvbmRzIHZlcnN1cyBtaWNybwotCSAqIHNlY29uZHMgZm9yIHdhaXQgZm9yIGludGVycnVwdC4KLQkgKi8KLQotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JbG9jYWxfZmlxX2Rpc2FibGUoKTsKLQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKLQkJbG9jYWxfZmlxX2VuYWJsZSgpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXJldHVybjsKLQl9Ci0JbWFzazMyID0gb21hcF9yZWFkbChBUk1fU1lTU1QpOwotCWxvY2FsX2ZpcV9lbmFibGUoKTsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19PTUFQXzMyS19USU1FUikgJiYgZGVmaW5lZChDT05GSUdfTk9fSURMRV9IWikKLQkvKiBPdmVycmlkZSB0aW1lciB0byB1c2UgVlNUIGZvciB0aGUgbmV4dCBjeWNsZSAqLwotCW9tYXBfMzJrX3RpbWVyX25leHRfdnN0X2ludGVycnVwdCgpOwotI2VuZGlmCi0KLQlpZiAoKG1hc2szMiAmIERTUF9JRExFKSA9PSAwKSB7Ci0JCV9fYXNtX18gdm9sYXRpbGUgKCJtY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0Iik7Ci0JfSBlbHNlIHsKLQotCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQpOwotCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7Ci0JCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5EKTsKLQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCk7Ci0JCX0KLQotCQlmdW5jX3B0cigpOwotCX0KLX0KLQotLyoKLSAqIENvbmZpZ3VyYXRpb24gb2YgdGhlIHdha2V1cCBldmVudCBpcyBib2FyZCBzcGVjaWZpYy4gRm9yIHRoZQotICogbW9tZW50IHdlIHB1dCBpdCBpbnRvIHRoaXMgaGVscGVyIGZ1bmN0aW9uLiBMYXRlciBpdCBtYXkgbW92ZQotICogdG8gYm9hcmQgc3BlY2lmaWMgZmlsZXMuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfcG1fd2FrZXVwX3NldHVwKHZvaWQpCi17Ci0JLyoKLQkgKiBFbmFibGUgQVJNIFhPUiBjbG9jayBhbmQgcmVsZWFzZSBwZXJpcGhlcmFsIGZyb20gcmVzZXQgYnkKLQkgKiB3cml0aW5nIDEgdG8gUEVSX0VOIGJpdCBpbiBBUk1fUlNUQ1QyLCB0aGlzIGlzIHJlcXVpcmVkCi0JICogZm9yIFVBUlQgY29uZmlndXJhdGlvbiB0byB1c2UgVUFSVDIgdG8gd2FrZSB1cC4KLQkgKi8KLQotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgRU5BQkxFX1hPUkNMSywgQVJNX0lETEVDVDIpOwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX1JTVENUMikgfCBQRVJfRU4sIEFSTV9SU1RDVDIpOwotCW9tYXBfd3JpdGV3KE1PREVNXzMyS19FTiwgVUxQRF9DTE9DS19DVFJMKTsKLQotCS8qCi0JICogVHVybiBvZmYgYWxsIGludGVycnVwdHMgZXhjZXB0IEwxLTJuZCBsZXZlbCBjYXNjYWRlLAotCSAqIGFuZCB0aGUgTDIgd2FrZXVwIGludGVycnVwdHM6IGtleXBhZCBhbmQgVUFSVDIuCi0JICovCi0KLQlvbWFwX3dyaXRlbCh+SVJRX0xFVkVMMiwgT01BUF9JSDFfTUlSKTsKLQotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlvbWFwX3dyaXRlbCh+KElSUV9VQVJUMiB8IElSUV9LRVlCT0FSRCksICBPTUFQX0lIMl9NSVIpOwotCX0KLQotCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlvbWFwX3dyaXRlbCh+KElSUV9VQVJUMiB8IElSUV9LRVlCT0FSRCksIE9NQVBfSUgyXzBfTUlSKTsKLQotCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8xX01JUik7Ci0JCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzJfTUlSKTsKLQkJb21hcF93cml0ZWwofjB4MCwgT01BUF9JSDJfM19NSVIpOwotCX0KLQotCS8qICBOZXcgSVJRIGFncmVlbWVudCAqLwotIAlvbWFwX3dyaXRlbCgxLCBPTUFQX0lIMV9DT05UUk9MKTsKLQotCS8qIGV4dGVybmFsIFBVTEwgdG8gZG93biwgYml0IDIyID0gMCAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoUFVMTF9EV05fQ1RSTF8yKSAmIH4oMTw8MjIpLCBQVUxMX0RXTl9DVFJMXzIpOwotfQotCi12b2lkIG9tYXBfcG1fc3VzcGVuZCh2b2lkKQotewotCXVuc2lnbmVkIGludCBtYXNrMzIgPSAwOwotCXVuc2lnbmVkIGxvbmcgYXJnMCA9IDAsIGFyZzEgPSAwOwotCWludCAoKmZ1bmNfcHRyKSh1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgc2hvcnQpID0gMDsKLQl1bnNpZ25lZCBzaG9ydCBzYXZlX2RzcF9pZGxlY3QyOwotCi0JcHJpbnRrKCJQTTogT01BUCV4IGlzIGVudGVyaW5nIGRlZXAgc2xlZXAgbm93IC4uLlxuIiwgc3lzdGVtX3Jldik7Ci0KLQlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7Ci0JCS8qIFN0b3AgTEVEMSAoRDkpIGJsaW5rICovCi0JCXRwczY1MDEwX3NldF9sZWQoTEVEMSwgT0ZGKTsKLQl9Ci0KLQkvKgotCSAqIFN0ZXAgMTogdHVybiBvZmYgaW50ZXJydXB0cwotCSAqLwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlsb2NhbF9maXFfZGlzYWJsZSgpOwotCi0JLyoKLQkgKiBTdGVwIDI6IHNhdmUgcmVnaXN0ZXJzCi0JICoKLQkgKiBUaGUgb21hcCBpcyBhIHN0cmFuZ2UvYmVhdXRpZnVsIGRldmljZS4gVGhlIGNhY2hlcywgbWVtb3J5Ci0JICogYW5kIHJlZ2lzdGVyIHN0YXRlIGFyZSBwcmVzZXJ2ZWQgYWNyb3NzIHBvd2VyIHNhdmVzLgotCSAqIFdlIGhhdmUgdG8gc2F2ZSBhbmQgcmVzdG9yZSB2ZXJ5IGxpdHRsZSByZWdpc3RlciBzdGF0ZSB0bwotCSAqIGlkbGUgdGhlIG9tYXAuCi0gICAgICAgICAqCi0gCSAqIFNhdmUgaW50ZXJydXB0LCBNUFVJLCBBUk0gYW5kIFVQTEQgY29udHJvbCByZWdpc3RlcnMuCi0JICovCi0KLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJTVBVSTE1MTBfU0FWRShPTUFQX0lIMV9NSVIpOwotCQlNUFVJMTUxMF9TQVZFKE9NQVBfSUgyX01JUik7Ci0JCU1QVUkxNTEwX1NBVkUoTVBVSV9DVFJMKTsKLQkJTVBVSTE1MTBfU0FWRShNUFVJX0RTUF9CT09UX0NPTkZJRyk7Ci0JCU1QVUkxNTEwX1NBVkUoTVBVSV9EU1BfQVBJX0NPTkZJRyk7Ci0JCU1QVUkxNTEwX1NBVkUoRU1JRlNfQ09ORklHKTsKLQkJTVBVSTE1MTBfU0FWRShFTUlGRl9TRFJBTV9DT05GSUcpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKLQkJTVBVSTE2MTBfU0FWRShPTUFQX0lIMV9NSVIpOwotCQlNUFVJMTYxMF9TQVZFKE9NQVBfSUgyXzBfTUlSKTsKLQkJTVBVSTE2MTBfU0FWRShPTUFQX0lIMl8xX01JUik7Ci0JCU1QVUkxNjEwX1NBVkUoT01BUF9JSDJfMl9NSVIpOwotCQlNUFVJMTYxMF9TQVZFKE9NQVBfSUgyXzNfTUlSKTsKLQkJTVBVSTE2MTBfU0FWRShNUFVJX0NUUkwpOwotCQlNUFVJMTYxMF9TQVZFKE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKLQkJTVBVSTE2MTBfU0FWRShNUFVJX0RTUF9BUElfQ09ORklHKTsKLQkJTVBVSTE2MTBfU0FWRShFTUlGU19DT05GSUcpOwotCQlNUFVJMTYxMF9TQVZFKEVNSUZGX1NEUkFNX0NPTkZJRyk7Ci0JfQotCi0JQVJNX1NBVkUoQVJNX0NLQ1RMKTsKLQlBUk1fU0FWRShBUk1fSURMRUNUMSk7Ci0JQVJNX1NBVkUoQVJNX0lETEVDVDIpOwotCUFSTV9TQVZFKEFSTV9FV1VQQ1QpOwotCUFSTV9TQVZFKEFSTV9SU1RDVDEpOwotCUFSTV9TQVZFKEFSTV9SU1RDVDIpOwotCUFSTV9TQVZFKEFSTV9TWVNTVCk7Ci0JVUxQRF9TQVZFKFVMUERfQ0xPQ0tfQ1RSTCk7Ci0JVUxQRF9TQVZFKFVMUERfU1RBVFVTX1JFUSk7Ci0KLQkvKgotCSAqIFN0ZXAgMzogTE9XX1BXUiBzaWduYWwgZW5hYmxpbmcKLQkgKgotCSAqIEFsbG93IHRoZSBMT1dfUFdSIHNpZ25hbCB0byBiZSB2aXNpYmxlIG9uIE1QVUlPNSBiYWxsLgotCSAqLwotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkvKiBQT1dFUl9DVFJMX1JFRyA9IDB4MSAoTE9XX1BPV0VSIGlzIGF2YWlsYWJsZSkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpIHwKLQkJCSAgICBPTUFQMTUxMF9VTFBEX0xPV19QT1dFUl9SRVEsIFVMUERfUE9XRVJfQ1RSTCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQkvKiBQT1dFUl9DVFJMX1JFRyA9IDB4MSAoTE9XX1BPV0VSIGlzIGF2YWlsYWJsZSkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpIHwKLQkJCSAgICBPTUFQMTYxMF9VTFBEX0xPV19QT1dFUl9SRVEsIFVMUERfUE9XRVJfQ1RSTCk7Ci0JfQotCi0JLyogY29uZmlndXJlIExPV19QV1IgcGluICovCi0Jb21hcF9jZmdfcmVnKFQyMF8xNjEwX0xPV19QV1IpOwotCi0JLyoKLQkgKiBTdGVwIDQ6IE9NQVAgRFNQIFNodXRkb3duCi0JICovCi0KLQkvKiBTZXQgRFNQX1JTVCA9IDEgYW5kIERTUF9FTiA9IDAsIHB1dCBEU1AgYmxvY2sgaW50byByZXNldCAqLwotCW9tYXBfd3JpdGVsKChvbWFwX3JlYWRsKEFSTV9SU1RDVDEpIHwgRFNQX1JTVCkgJiB+RFNQX0VOQUJMRSwKLQkJICAgIEFSTV9SU1RDVDEpOwotCi0JLyogU2V0IERTUCBib290IG1vZGUgdG8gRFNQLUlETEUsIERTUF9CT09UX01PREUgPSAweDIgKi8KLSAgICAgICAgb21hcF93cml0ZWwoRFNQX0lETEVfTU9ERSwgTVBVSV9EU1BfQk9PVF9DT05GSUcpOwotCi0JLyogU2V0IEVOX0RTUENLID0gMCwgc3RvcCBEU1AgYmxvY2sgY2xvY2sgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKEFSTV9DS0NUTCkgJiB+RFNQX0NMT0NLX0VOQUJMRSwgQVJNX0NLQ1RMKTsKLQotCS8qIFN0b3AgYW55IERTUCBkb21haW4gY2xvY2tzICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCAoMTw8RU5fQVBJQ0spLCBBUk1fSURMRUNUMik7Ci0Jc2F2ZV9kc3BfaWRsZWN0MiA9IF9fcmF3X3JlYWR3KERTUF9JRExFQ1QyKTsKLQlfX3Jhd193cml0ZXcoMCwgRFNQX0lETEVDVDIpOwotCi0JLyoKLQkgKiBTdGVwIDU6IFdha2V1cCBFdmVudCBTZXR1cAotCSAqLwotCi0Jb21hcF9wbV93YWtldXBfc2V0dXAoKTsKLQotCS8qCi0JICogU3RlcCA2YTogQVJNIGFuZCBUcmFmZmljIGNvbnRyb2xsZXIgc2h1dGRvd24KLQkgKgotCSAqIFN0ZXAgNiBzdGFydHMgaGVyZSB3aXRoIGNsb2NrIGFuZCB3YXRjaGRvZyBkaXNhYmxlCi0JICovCi0KLQkvKiBzdG9wIGNsb2NrcyAqLwotCW1hc2szMiA9IG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpOwotCW1hc2szMiAmPSB+KDE8PEVOX1dEVENLKTsgIC8qIGJpdCAwIC0+IDAgKFdEVCBjbG9jaykgKi8KLQltYXNrMzIgfD0gICgxPDxFTl9YT1JQQ0spOyAvKiBiaXQgMSAtPiAxIChYT1JQQ0sgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fUEVSQ0spOyAgLyogYml0IDIgLT4gMCAoTVBVUEVSX0NLIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX0xDRENLKTsgIC8qIGJpdCAzIC0+IDAgKExDREMgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fTEJDSyk7ICAgLyogYml0IDQgLT4gMCAobG9jYWwgYnVzIGNsb2NrKSAqLwotCW1hc2szMiB8PSAgKDE8PEVOX0FQSUNLKTsgIC8qIGJpdCA2IC0+IDEgKE1QVUkgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fVElNQ0spOyAgLyogYml0IDcgLT4gMCAoTVBVIHRpbWVyIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PERNQUNLX1JFUSk7IC8qIGJpdCA4IC0+IDAgKERNQUMgY2xvY2spICovCi0JbWFzazMyICY9IH4oMTw8RU5fR1BJT0NLKTsgLyogYml0IDkgLT4gMCAoR1BJTyBjbG9jaykgKi8KLQlvbWFwX3dyaXRlbChtYXNrMzIsIEFSTV9JRExFQ1QyKTsKLQotCS8qIGRpc2FibGUgQVJNIHdhdGNoZG9nICovCi0Jb21hcF93cml0ZWwoMHgwMEY1LCBPTUFQX1dEVF9USU1FUl9NT0RFKTsKLQlvbWFwX3dyaXRlbCgweDAwQTAsIE9NQVBfV0RUX1RJTUVSX01PREUpOwotCi0JLyoKLQkgKiBTdGVwIDZiOiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgotCSAqCi0JICogU3RlcCA2IGNvbnRpbnVlcyBoZXJlLiBQcmVwYXJlIGp1bXAgdG8gcG93ZXIgbWFuYWdlbWVudAotCSAqIGFzc2VtYmx5IGNvZGUgaW4gaW50ZXJuYWwgU1JBTS4KLQkgKgotCSAqIFNpbmNlIHRoZSBvbWFwX2NwdV9zdXNwZW5kIHJvdXRpbmUgaGFzIGJlZW4gY29waWVkIHRvCi0JICogU1JBTSwgd2UnbGwgZG8gYW4gaW5kaXJlY3QgcHJvY2VkdXJlIGNhbGwgdG8gaXQgYW5kIHBhc3MgdGhlCi0JICogY29udGVudHMgb2YgYXJtX2lkbGVjdDEgYW5kIGFybV9pZGxlY3QyIHNvIGl0IGNhbiByZXN0b3JlCi0JICogdGhlbSB3aGVuIGl0IHdha2VzIHVwIGFuZCBpdCB3aWxsIHJldHVybi4KLQkgKi8KLQotCWFyZzAgPSBhcm1fc2xlZXBfc2F2ZVtBUk1fU0xFRVBfU0FWRV9BUk1fSURMRUNUMV07Ci0JYXJnMSA9IGFybV9zbGVlcF9zYXZlW0FSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QyXTsKLQotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNTEwX1NSQU1fQVBJX1NVU1BFTkQpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQMTYxMF9TUkFNX0FQSV9TVVNQRU5EKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7Ci0JCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDU5MTJfU1JBTV9BUElfU1VTUEVORCk7Ci0JfQotCi0JLyoKLQkgKiBTdGVwIDZjOiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgotCSAqCi0JICogSnVtcCB0byBhc3NlbWJseSBjb2RlLiBUaGUgcHJvY2Vzc29yIHdpbGwgc3RheSB0aGVyZQotIAkgKiB1bnRpbCB3YWtlIHVwLgotCSAqLwotCi0gICAgICAgIGZ1bmNfcHRyKGFyZzAsIGFyZzEpOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgaGVyZSwgcHJvY2Vzc29yIGlzIHdva2VuIHVwIQotCSAqLwotCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgwIChMT1dfUE9XRVIgaXMgZGlzYWJsZWQpICovCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCi0JCQkgICAgfk9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgwIChMT1dfUE9XRVIgaXMgZGlzYWJsZWQpICovCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCi0JCQkgICAgfk9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9Ci0KLQotCS8qIFJlc3RvcmUgRFNQIGNsb2NrcyAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgKDE8PEVOX0FQSUNLKSwgQVJNX0lETEVDVDIpOwotCV9fcmF3X3dyaXRldyhzYXZlX2RzcF9pZGxlY3QyLCBEU1BfSURMRUNUMik7Ci0JQVJNX1JFU1RPUkUoQVJNX0lETEVDVDIpOwotCi0JLyoKLQkgKiBSZXN0b3JlIEFSTSBzdGF0ZSwgZXhjZXB0IEFSTV9JRExFQ1QxLzIgd2hpY2ggb21hcF9jcHVfc3VzcGVuZCBkaWQKLQkgKi8KLQotCUFSTV9SRVNUT1JFKEFSTV9DS0NUTCk7Ci0JQVJNX1JFU1RPUkUoQVJNX0VXVVBDVCk7Ci0JQVJNX1JFU1RPUkUoQVJNX1JTVENUMSk7Ci0JQVJNX1JFU1RPUkUoQVJNX1JTVENUMik7Ci0JQVJNX1JFU1RPUkUoQVJNX1NZU1NUKTsKLQlVTFBEX1JFU1RPUkUoVUxQRF9DTE9DS19DVFJMKTsKLQlVTFBEX1JFU1RPUkUoVUxQRF9TVEFUVVNfUkVRKTsKLQotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQlNUFVJMTUxMF9SRVNUT1JFKE1QVUlfQ1RSTCk7Ci0JCU1QVUkxNTEwX1JFU1RPUkUoTVBVSV9EU1BfQk9PVF9DT05GSUcpOwotCQlNUFVJMTUxMF9SRVNUT1JFKE1QVUlfRFNQX0FQSV9DT05GSUcpOwotCQlNUFVJMTUxMF9SRVNUT1JFKEVNSUZTX0NPTkZJRyk7Ci0JCU1QVUkxNTEwX1JFU1RPUkUoRU1JRkZfU0RSQU1fQ09ORklHKTsKLQkJTVBVSTE1MTBfUkVTVE9SRShPTUFQX0lIMV9NSVIpOwotCQlNUFVJMTUxMF9SRVNUT1JFKE9NQVBfSUgyX01JUik7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlNUFVJMTYxMF9SRVNUT1JFKE1QVUlfQ1RSTCk7Ci0JCU1QVUkxNjEwX1JFU1RPUkUoTVBVSV9EU1BfQk9PVF9DT05GSUcpOwotCQlNUFVJMTYxMF9SRVNUT1JFKE1QVUlfRFNQX0FQSV9DT05GSUcpOwotCQlNUFVJMTYxMF9SRVNUT1JFKEVNSUZTX0NPTkZJRyk7Ci0JCU1QVUkxNjEwX1JFU1RPUkUoRU1JRkZfU0RSQU1fQ09ORklHKTsKLQotCQlNUFVJMTYxMF9SRVNUT1JFKE9NQVBfSUgxX01JUik7Ci0JCU1QVUkxNjEwX1JFU1RPUkUoT01BUF9JSDJfMF9NSVIpOwotCQlNUFVJMTYxMF9SRVNUT1JFKE9NQVBfSUgyXzFfTUlSKTsKLQkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8yX01JUik7Ci0JCU1QVUkxNjEwX1JFU1RPUkUoT01BUF9JSDJfM19NSVIpOwotCX0KLQotCS8qCi0JICogUmVlbmFibGUgaW50ZXJydXB0cwotCSAqLwotCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwotCWxvY2FsX2ZpcV9lbmFibGUoKTsKLQotCXByaW50aygiUE06IE9NQVAleCBpcyByZS1zdGFydGluZyBmcm9tIGRlZXAgc2xlZXAuLi5cbiIsIHN5c3RlbV9yZXYpOwotCi0JaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkgewotCQkvKiBMZXQgTEVEMSAoRDkpIGJsaW5rIGFnYWluICovCi0JCXRwczY1MDEwX3NldF9sZWQoTEVEMSwgQkxJTkspOwotCX0KLX0KLQotI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCi1zdGF0aWMgaW50IGdfcmVhZF9jb21wbGV0ZWQ7Ci0KLS8qCi0gKiBSZWFkIHN5c3RlbSBQTSByZWdpc3RlcnMgZm9yIGRlYnVnZ2luZwotICovCi1zdGF0aWMgaW50IG9tYXBfcG1fcmVhZF9wcm9jKAotCWNoYXIgKnBhZ2VfYnVmZmVyLAotCWNoYXIgKipteV9maXJzdF9ieXRlLAotCW9mZl90IHZpcnR1YWxfc3RhcnQsCi0JaW50IGxlbmd0aCwKLQlpbnQgKmVvZiwKLQl2b2lkICpkYXRhKQotewotCWludCBteV9idWZmZXJfb2Zmc2V0ID0gMDsKLQljaGFyICogY29uc3QgbXlfYmFzZSA9IHBhZ2VfYnVmZmVyOwotCi0JQVJNX1NBVkUoQVJNX0NLQ1RMKTsKLQlBUk1fU0FWRShBUk1fSURMRUNUMSk7Ci0JQVJNX1NBVkUoQVJNX0lETEVDVDIpOwotCUFSTV9TQVZFKEFSTV9FV1VQQ1QpOwotCUFSTV9TQVZFKEFSTV9SU1RDVDEpOwotCUFSTV9TQVZFKEFSTV9SU1RDVDIpOwotCUFSTV9TQVZFKEFSTV9TWVNTVCk7Ci0KLQlVTFBEX1NBVkUoVUxQRF9JVF9TVEFUVVMpOwotCVVMUERfU0FWRShVTFBEX0NMT0NLX0NUUkwpOwotCVVMUERfU0FWRShVTFBEX1NPRlRfUkVRKTsKLQlVTFBEX1NBVkUoVUxQRF9TVEFUVVNfUkVRKTsKLQlVTFBEX1NBVkUoVUxQRF9EUExMX0NUUkwpOwotCVVMUERfU0FWRShVTFBEX1BPV0VSX0NUUkwpOwotCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCU1QVUkxNTEwX1NBVkUoTVBVSV9DVFJMKTsKLQkJTVBVSTE1MTBfU0FWRShNUFVJX0RTUF9TVEFUVVMpOwotCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKLQkJTVBVSTE1MTBfU0FWRShNUFVJX0RTUF9BUElfQ09ORklHKTsKLQkJTVBVSTE1MTBfU0FWRShFTUlGRl9TRFJBTV9DT05GSUcpOwotCQlNUFVJMTUxMF9TQVZFKEVNSUZTX0NPTkZJRyk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlNUFVJMTYxMF9TQVZFKE1QVUlfQ1RSTCk7Ci0JCU1QVUkxNjEwX1NBVkUoTVBVSV9EU1BfU1RBVFVTKTsKLQkJTVBVSTE2MTBfU0FWRShNUFVJX0RTUF9CT09UX0NPTkZJRyk7Ci0JCU1QVUkxNjEwX1NBVkUoTVBVSV9EU1BfQVBJX0NPTkZJRyk7Ci0JCU1QVUkxNjEwX1NBVkUoRU1JRkZfU0RSQU1fQ09ORklHKTsKLQkJTVBVSTE2MTBfU0FWRShFTUlGU19DT05GSUcpOwotCX0KLQotCWlmICh2aXJ0dWFsX3N0YXJ0ID09IDApIHsKLQkJZ19yZWFkX2NvbXBsZXRlZCA9IDA7Ci0KLQkJbXlfYnVmZmVyX29mZnNldCArPSBzcHJpbnRmKG15X2Jhc2UgKyBteV9idWZmZXJfb2Zmc2V0LAotCQkgICAiQVJNX0NLQ1RMX1JFRzogICAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiQVJNX0lETEVDVDFfUkVHOiAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiQVJNX0lETEVDVDJfUkVHOiAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiQVJNX0VXVVBDVF9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiQVJNX1JTVENUMV9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiQVJNX1JTVENUMl9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiQVJNX1NZU1NUX1JFRzogICAgICAgICAgICAweCUtOHggICAgIFxuIgotCQkgICAiVUxQRF9JVF9TVEFUVVNfUkVHOiAgICAgICAweCUtNHggICAgIFxuIgotCQkgICAiVUxQRF9DTE9DS19DVFJMX1JFRzogICAgICAweCUtNHggICAgIFxuIgotCQkgICAiVUxQRF9TT0ZUX1JFUV9SRUc6ICAgICAgICAweCUtNHggICAgIFxuIgotCQkgICAiVUxQRF9EUExMX0NUUkxfUkVHOiAgICAgICAweCUtNHggICAgIFxuIgotCQkgICAiVUxQRF9TVEFUVVNfUkVRX1JFRzogICAgICAweCUtNHggICAgIFxuIgotCQkgICAiVUxQRF9QT1dFUl9DVFJMX1JFRzogICAgICAweCUtNHggICAgIFxuIiwKLQkJICAgQVJNX1NIT1coQVJNX0NLQ1RMKSwKLQkJICAgQVJNX1NIT1coQVJNX0lETEVDVDEpLAotCQkgICBBUk1fU0hPVyhBUk1fSURMRUNUMiksCi0JCSAgIEFSTV9TSE9XKEFSTV9FV1VQQ1QpLAotCQkgICBBUk1fU0hPVyhBUk1fUlNUQ1QxKSwKLQkJICAgQVJNX1NIT1coQVJNX1JTVENUMiksCi0JCSAgIEFSTV9TSE9XKEFSTV9TWVNTVCksCi0JCSAgIFVMUERfU0hPVyhVTFBEX0lUX1NUQVRVUyksCi0JCSAgIFVMUERfU0hPVyhVTFBEX0NMT0NLX0NUUkwpLAotCQkgICBVTFBEX1NIT1coVUxQRF9TT0ZUX1JFUSksCi0JCSAgIFVMUERfU0hPVyhVTFBEX0RQTExfQ1RSTCksCi0JCSAgIFVMUERfU0hPVyhVTFBEX1NUQVRVU19SRVEpLAotCQkgICBVTFBEX1NIT1coVUxQRF9QT1dFUl9DVFJMKSk7Ci0KLQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCQlteV9idWZmZXJfb2Zmc2V0ICs9IHNwcmludGYobXlfYmFzZSArIG15X2J1ZmZlcl9vZmZzZXQsCi0JCQkgICAiTVBVSTE1MTBfQ1RSTF9SRUcgICAgICAgICAgICAgMHglLTh4IFxuIgotCQkJICAgIk1QVUkxNTEwX0RTUF9TVEFUVVNfUkVHOiAgICAgIDB4JS04eCBcbiIKLQkJCSAgICJNUFVJMTUxMF9EU1BfQk9PVF9DT05GSUdfUkVHOiAweCUtOHggXG4iCi0JCSAgIAkgICAiTVBVSTE1MTBfRFNQX0FQSV9DT05GSUdfUkVHOiAgMHglLTh4IFxuIgotCQkgICAJICAgIk1QVUkxNTEwX1NEUkFNX0NPTkZJR19SRUc6ICAgIDB4JS04eCBcbiIKLQkJICAgCSAgICJNUFVJMTUxMF9FTUlGU19DT05GSUdfUkVHOiAgICAweCUtOHggXG4iLAotCQkgICAJICAgTVBVSTE1MTBfU0hPVyhNUFVJX0NUUkwpLAotCQkgICAJICAgTVBVSTE1MTBfU0hPVyhNUFVJX0RTUF9TVEFUVVMpLAotCQkgICAJICAgTVBVSTE1MTBfU0hPVyhNUFVJX0RTUF9CT09UX0NPTkZJRyksCi0JCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfRFNQX0FQSV9DT05GSUcpLAotCQkgICAJICAgTVBVSTE1MTBfU0hPVyhFTUlGRl9TRFJBTV9DT05GSUcpLAotCQkgICAJICAgTVBVSTE1MTBfU0hPVyhFTUlGU19DT05GSUcpKTsKLQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQkJbXlfYnVmZmVyX29mZnNldCArPSBzcHJpbnRmKG15X2Jhc2UgKyBteV9idWZmZXJfb2Zmc2V0LAotCQkJICAgIk1QVUkxNjEwX0NUUkxfUkVHICAgICAgICAgICAgIDB4JS04eCBcbiIKLQkJCSAgICJNUFVJMTYxMF9EU1BfU1RBVFVTX1JFRzogICAgICAweCUtOHggXG4iCi0JCQkgICAiTVBVSTE2MTBfRFNQX0JPT1RfQ09ORklHX1JFRzogMHglLTh4IFxuIgotCQkgICAJICAgIk1QVUkxNjEwX0RTUF9BUElfQ09ORklHX1JFRzogIDB4JS04eCBcbiIKLQkJICAgCSAgICJNUFVJMTYxMF9TRFJBTV9DT05GSUdfUkVHOiAgICAweCUtOHggXG4iCi0JCSAgIAkgICAiTVBVSTE2MTBfRU1JRlNfQ09ORklHX1JFRzogICAgMHglLTh4IFxuIiwKLQkJICAgCSAgIE1QVUkxNjEwX1NIT1coTVBVSV9DVFJMKSwKLQkJICAgCSAgIE1QVUkxNjEwX1NIT1coTVBVSV9EU1BfU1RBVFVTKSwKLQkJICAgCSAgIE1QVUkxNjEwX1NIT1coTVBVSV9EU1BfQk9PVF9DT05GSUcpLAotCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0RTUF9BUElfQ09ORklHKSwKLQkJICAgCSAgIE1QVUkxNjEwX1NIT1coRU1JRkZfU0RSQU1fQ09ORklHKSwKLQkJICAgCSAgIE1QVUkxNjEwX1NIT1coRU1JRlNfQ09ORklHKSk7Ci0JCX0KLQotCQlnX3JlYWRfY29tcGxldGVkKys7Ci0JfSBlbHNlIGlmIChnX3JlYWRfY29tcGxldGVkID49IDEpIHsKLQkJICplb2YgPSAxOwotCQkgcmV0dXJuIDA7Ci0JfQotCWdfcmVhZF9jb21wbGV0ZWQrKzsKLQotCSpteV9maXJzdF9ieXRlID0gcGFnZV9idWZmZXI7Ci0JcmV0dXJuICBteV9idWZmZXJfb2Zmc2V0OwotfQotCi1zdGF0aWMgdm9pZCBvbWFwX3BtX2luaXRfcHJvYyh2b2lkKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlci9vbWFwX3BtIiwKLQkJCQkgICAgICAgU19JV1VTUiB8IFNfSVJVR08sIE5VTEwsCi0JCQkJICAgICAgIG9tYXBfcG1fcmVhZF9wcm9jLCAwKTsKLX0KLQotI2VuZGlmIC8qIERFQlVHICYmIENPTkZJR19QUk9DX0ZTICovCi0KLS8qCi0gKglvbWFwX3BtX3ByZXBhcmUgLSBEbyBwcmVsaW1pbmFyeSBzdXNwZW5kIHdvcmsuCi0gKglAc3RhdGU6CQlzdXNwZW5kIHN0YXRlIHdlJ3JlIGVudGVyaW5nLgotICoKLSAqLwotLy8jaW5jbHVkZSA8YXNtL2FyY2gvaGFyZHdhcmUuaD4KLQotc3RhdGljIGludCBvbWFwX3BtX3ByZXBhcmUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQotewotCWludCBlcnJvciA9IDA7Ci0KLQlzd2l0Y2ggKHN0YXRlKQotCXsKLQljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKLQljYXNlIFBNX1NVU1BFTkRfTUVNOgotCQlicmVhazsKLQotCWNhc2UgUE1fU1VTUEVORF9ESVNLOgotCQlyZXR1cm4gLUVOT1RTVVBQOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIGVycm9yOwotfQotCi0KLS8qCi0gKglvbWFwX3BtX2VudGVyIC0gQWN0dWFsbHkgZW50ZXIgYSBzbGVlcCBzdGF0ZS4KLSAqCUBzdGF0ZToJCVN0YXRlIHdlJ3JlIGVudGVyaW5nLgotICoKLSAqLwotCi1zdGF0aWMgaW50IG9tYXBfcG1fZW50ZXIoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQotewotCXN3aXRjaCAoc3RhdGUpCi0JewotCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgotCWNhc2UgUE1fU1VTUEVORF9NRU06Ci0JCW9tYXBfcG1fc3VzcGVuZCgpOwotCQlicmVhazsKLQotCWNhc2UgUE1fU1VTUEVORF9ESVNLOgotCQlyZXR1cm4gLUVOT1RTVVBQOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqCi0gKglvbWFwX3BtX2ZpbmlzaCAtIEZpbmlzaCB1cCBzdXNwZW5kIHNlcXVlbmNlLgotICoJQHN0YXRlOgkJU3RhdGUgd2UncmUgY29taW5nIG91dCBvZi4KLSAqCi0gKglUaGlzIGlzIGNhbGxlZCBhZnRlciB3ZSB3YWtlIGJhY2sgdXAgKG9yIGlmIGVudGVyaW5nIHRoZSBzbGVlcCBzdGF0ZQotICoJZmFpbGVkKS4KLSAqLwotCi1zdGF0aWMgaW50IG9tYXBfcG1fZmluaXNoKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdHJ1Y3QgcG1fb3BzIG9tYXBfcG1fb3BzID17Ci0JLnBtX2Rpc2tfbW9kZSA9IDAsCi0gICAgICAgIC5wcmVwYXJlICAgICAgICA9IG9tYXBfcG1fcHJlcGFyZSwKLSAgICAgICAgLmVudGVyICAgICAgICAgID0gb21hcF9wbV9lbnRlciwKLSAgICAgICAgLmZpbmlzaCAgICAgICAgID0gb21hcF9wbV9maW5pc2gsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBvbWFwX3BtX2luaXQodm9pZCkKLXsKLQlwcmludGsoIlBvd2VyIE1hbmFnZW1lbnQgZm9yIFRJIE9NQVAuXG4iKTsKLQlwbV9pZGxlID0gb21hcF9wbV9pZGxlOwotCS8qCi0JICogV2UgY29weSB0aGUgYXNzZW1ibGVyIHNsZWVwL3dha2V1cCByb3V0aW5lcyB0byBTUkFNLgotCSAqIFRoZXNlIHJvdXRpbmVzIG5lZWQgdG8gYmUgaW4gU1JBTSBhcyB0aGF0J3MgdGhlIG9ubHkKLQkgKiBtZW1vcnkgdGhlIE1QVSBjYW4gc2VlIHdoZW4gaXQgd2FrZXMgdXAuCi0JICovCi0KLSNpZmRlZglDT05GSUdfQVJDSF9PTUFQMTUxMAotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQltZW1jcHkoKHZvaWQgKilPTUFQMTUxMF9TUkFNX0lETEVfU1VTUEVORCwKLQkJICAgICAgIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kLAotCQkgICAgICAgb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOwotCQltZW1jcHkoKHZvaWQgKilPTUFQMTUxMF9TUkFNX0FQSV9TVVNQRU5ELCBvbWFwMTUxMF9jcHVfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KTsKLQl9IGVsc2UKLSNlbmRpZgotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQltZW1jcHkoKHZvaWQgKilPTUFQMTYxMF9TUkFNX0lETEVfU1VTUEVORCwKLQkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kLAotCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOwotCQltZW1jcHkoKHZvaWQgKilPTUFQMTYxMF9TUkFNX0FQSV9TVVNQRU5ELCBvbWFwMTYxMF9jcHVfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNTkxMigpKSB7Ci0JCW1lbWNweSgodm9pZCAqKU9NQVA1OTEyX1NSQU1fSURMRV9TVVNQRU5ELAotCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQsCi0JCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7Ci0JCW1lbWNweSgodm9pZCAqKU9NQVA1OTEyX1NSQU1fQVBJX1NVU1BFTkQsIG9tYXAxNjEwX2NwdV9zdXNwZW5kLAotCQkgICAgICAgb21hcDE2MTBfY3B1X3N1c3BlbmRfc3opOwotCX0KLQotCXBtX3NldF9vcHMoJm9tYXBfcG1fb3BzKTsKLQotI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCi0Jb21hcF9wbV9pbml0X3Byb2MoKTsKLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci1fX2luaXRjYWxsKG9tYXBfcG1faW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3NsZWVwLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDI2ZDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwL3NsZWVwLlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC9zbGVlcC5TCi0gKgotICogTG93LWxldmVsIE9NQVAxNTEwLzE2MTAgc2xlZXAvd2FrZVVwIHN1cHBvcnQKLSAqCi0gKiBJbml0aWFsIFNBMTExMCBjb2RlOgotICogQ29weXJpZ2h0IChjKSAyMDAxIENsaWZmIEJyYWtlIDxjYnJha2VAYWNjZWxlbnQuY29tPgotICoKLSAqIEFkYXB0ZWQgZm9yIFBYQSBieSBOaWNvbGFzIFBpdHJlOgotICogQ29weXJpZ2h0IChjKSAyMDAyIE1vbnRhIFZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKgotICogU3VwcG9ydCBmb3IgT01BUDE1MTAvMTYxMCBieSBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KLSAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9pby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL3BtLmg+Ci0KLQkJLnRleHQKLQotLyoKLSAqIEZvcmNlcyBPTUFQIGludG8gaWRsZSBzdGF0ZQotICoKLSAqIG9tYXBYWFhYX2lkbGVfbG9vcF9zdXNwZW5kKCkKLSAqCi0gKiBOb3RlOiBUaGlzIGNvZGUgZ2V0J3MgY29waWVkIHRvIGludGVybmFsIFNSQU0gYXQgYm9vdC4gV2hlbiB0aGUgT01BUAotICoJIHdha2VzIHVwIGl0IGNvbnRpbnVlcyBleGVjdXRpb24gYXQgdGhlIHBvaW50IGl0IHdlbnQgdG8gc2xlZXAuCi0gKgotICogTm90ZTogQmVjYXVzZSBvZiBzbGlnaHRseSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiB2YWx1ZXMgd2UgaGF2ZQotICogICAgICAgcHJvY2Vzc29yIHNwZWNpZmljIGZ1bmN0aW9ucyBoZXJlLgotICovCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAotRU5UUlkob21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQpCi0KLQlzdG1mZAlzcCEsIHtyMCAtIHIxMiwgbHJ9CQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0KLQlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMgotCW1vdglyNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweGZmMDAwMDAwCi0Jb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwZmYwMDAwCi0Jb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwMDBmZjAwCi0KLQlAIHR1cm4gb2ZmIGNsb2NrIGRvbWFpbnMKLQlAIGdldCBBUk1fSURMRUNUMiBpbnRvIHIyCi0JbGRyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0JbW92CXI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKLQlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgcmVxdWVzdCBBUk0gaWRsZQotCUAgZ2V0IEFSTV9JRExFQ1QxIGludG8gcjEKLQlsZHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KLQlvcnIJcjMsIHIxLCAjT01BUDE1MTBfSURMRV9MT09QX1JFUVVFU1QgJiAweGZmZmYKLQlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KLQotCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCi1sXzE1MTA6CXN1YnMJcjUsIHI1LCAjMQotCWJuZQlsXzE1MTAKLS8qCi0gKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCBjbG9jayB0aWNrIHRvIHdha2UgdXMgdXAuCi0gKi8KLQltb3YJcjAsICMwCi0JbWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNAkJQCB3YWl0IGZvciBpbnRlcnJ1cHQKLS8qCi0gKiBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCgpJ3MgcmVzdW1lIHBvaW50LgotICoKLSAqIEl0IHdpbGwganVzdCBzdGFydCBleGVjdXRpbmcgaGVyZSwgc28gd2UnbGwgcmVzdG9yZSBzdHVmZiBmcm9tIHRoZQotICogc3RhY2ssIHJlc2V0IHRoZSBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIuCi0gKi8KLQotCUAgcmVzdG9yZSBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIgYW5kIHJldHVybgotCUAgcjEgaGFzIEFSTV9JRExFQ1QxIGFuZCByMiBzdGlsbCBoYXMgQVJNX0lETEVDVDIKLQlzdHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KLQotCWxkbWZkICAgc3AhLCB7cjAgLSByMTIsIHBjfSAgICAgQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgotCi1FTlRSWShvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeikKLQkud29yZAkuIC0gb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMTUxMCAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKLUVOVFJZKG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kKQotCi0Jc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQkJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCi0JQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIKLQltb3YJcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHhmZjAwMDAwMAotCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMGZmMDAwMAotCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMDAwZmYwMAotCi0JQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCi0JQCBnZXQgQVJNX0lETEVDVDIgaW50byByMgotCWxkcmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQotCW1vdglyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKLSAJb3JyCXI1LHI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCi0Jc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0KLQlAIHJlcXVlc3QgQVJNIGlkbGUKLQlAIGdldCBBUk1fSURMRUNUMSBpbnRvIHIxCi0JbGRyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCi0Jb3JyCXIzLCByMSwgI09NQVAxNjEwX0lETEVfTE9PUF9SRVFVRVNUICYgMHhmZmZmCi0Jc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCi0KLQltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgotCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAotbF8xNjEwOglzdWJzCXI1LCByNSwgIzEKLQlibmUJbF8xNjEwCi0vKgotICogTGV0J3Mgd2FpdCBmb3IgdGhlIG5leHQgY2xvY2sgdGljayB0byB3YWtlIHVzIHVwLgotICovCi0JbW92CXIwLCAjMAotCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0Ci0vKgotICogb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KLSAqCi0gKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKLSAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgotICovCi0KLQlAIHJlc3RvcmUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyIGFuZCByZXR1cm4KLQlAIHIxIGhhcyBBUk1fSURMRUNUMSBhbmQgcjIgc3RpbGwgaGFzIEFSTV9JRExFQ1QyCi0Jc3RyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0Jc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCi0KLQlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30gICAgIEAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KLQotRU5UUlkob21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCi0JLndvcmQJLiAtIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kCi0jZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDE2WFggKi8KLQotLyoKLSAqIEZvcmNlcyBPTUFQIGludG8gZGVlcCBzbGVlcCBzdGF0ZQotICoKLSAqIG9tYXBYWFhYX2NwdV9zdXNwZW5kKCkKLSAqCi0gKiBUaGUgdmFsdWVzIG9mIHRoZSByZWdpc3RlcnMgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyIGFyZSBwYXNzZWQKLSAqIGFzIGFyZzAgYW5kIGFyZzEgZnJvbSBjYWxsZXIuIGFyZzAgaXMgc3RvcmVkIGluIHJlZ2lzdGVyIHIwIGFuZCBhcmcxCi0gKiBpbiByZWdpc3RlciByMS4KLSAqCi0gKiBOb3RlOiBUaGlzIGNvZGUgZ2V0J3MgY29waWVkIHRvIGludGVybmFsIFNSQU0gYXQgYm9vdC4gV2hlbiB0aGUgT01BUAotICoJIHdha2VzIHVwIGl0IGNvbnRpbnVlcyBleGVjdXRpb24gYXQgdGhlIHBvaW50IGl0IHdlbnQgdG8gc2xlZXAuCi0gKgotICogTm90ZTogQmVjYXVzZSBvZiBlcnJhdGEgd29yayBhcm91bmRzIHdlIGhhdmUgcHJvY2Vzc29yIHNwZWNpZmljIGZ1bmN0aW9ucwotICogICAgICAgaGVyZS4gVGhleSBhcmUgbW9zdGx5IHRoZSBzYW1lLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50LgotICoKLSAqLwotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLUVOVFJZKG9tYXAxNTEwX2NwdV9zdXNwZW5kKQotCi0JQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawotCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0KLQotCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgVHJhZmZpYyBDb250cm9sbGVyCi0JbW92CXI0LCAjVENNSUZfQVNNX0JBU0UgJiAweGZmMDAwMDAwCi0Jb3JyCXI0LCByNCwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMGZmMDAwMAotCW9ycglyNCwgcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4MDAwMGZmMDAKLQotCUAgd29yayBhcm91bmQgZXJyYXRhIG9mIE9NQVAxNTEwIFBERSBiaXQgZm9yIFRDIHNodXQgZG93bgotCUAgY2xlYXIgUERFIGJpdAotCWxkcglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCWJpYwlyNSwgcjUsICNQREVfQklUICYgMHhmZgotCXN0cglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCi0JQCBzZXQgUFdEX0VOIGJpdAotCWFuZAlyNSwgcjUsICNQV0RfRU5fQklUICYgMHhmZgotCXN0cglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCi0JQCBwcmVwYXJlIHRvIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaCBtYW51YWxseQotCWxkcglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4ZmYwMDAwMDAKLQlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweDAwMDAwMGZmCi0Jc3RyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCi0KLQlAIHByZXBhcmUgdG8gcHV0IEVNSUZTIHRvIFNsZWVwCi0JbGRyCXI1LCBbcjQsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCi0Jb3JyCXI1LCByNSwgI0lETEVfRU1JRlNfUkVRVUVTVCAmIDB4ZmYKLQlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyCi0JbW92CXI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4ZmYwMDAwMDAKLQlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDBmZjAwMDAKLQlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDAwMGZmMDAKLQotCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucwotCW1vdglyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKLSAJb3JyCXI1LHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCi0Jc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0KLQlAIHJlcXVlc3QgQVJNIGlkbGUKLQltb3YJcjMsICNPTUFQMTUxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmCi0Jb3JyCXIzLCByMywgI09NQVAxNTEwX0RFRVBfU0xFRVBfUkVRVUVTVCAmIDB4ZmYwMAotCXN0cmgJcjMsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQotCi0JbW92CXI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYKLQlvcnIgICAgIHI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKLWxfMTUxMF8yOgotCXN1YnMJcjUsIHI1LCAjMQotCWJuZQlsXzE1MTBfMgotLyoKLSAqIExldCdzIHdhaXQgZm9yIHRoZSBuZXh0IHdha2UgdXAgZXZlbnQgdG8gd2FrZSB1cyB1cC4gcjAgY2FuJ3QgYmUKLSAqIHVzZWQgaGVyZSBiZWNhdXNlIHIwIGhvbGRzIEFSTV9JRExFQ1QxCi0gKi8KLQltb3YJcjIsICMwCi0JbWNyCXAxNSwgMCwgcjIsIGM3LCBjMCwgNAkJQCB3YWl0IGZvciBpbnRlcnJ1cHQKLS8qCi0gKiBvbWFwMTUxMF9jcHVfc3VzcGVuZCgpJ3MgcmVzdW1lIHBvaW50LgotICoKLSAqIEl0IHdpbGwganVzdCBzdGFydCBleGVjdXRpbmcgaGVyZSwgc28gd2UnbGwgcmVzdG9yZSBzdHVmZiBmcm9tIHRoZQotICogc3RhY2ssIHJlc2V0IHRoZSBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIuCi0gKi8KLQlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQlzdHJoCXIwLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KLQlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30KLQotRU5UUlkob21hcDE1MTBfY3B1X3N1c3BlbmRfc3opCi0JLndvcmQJLiAtIG9tYXAxNTEwX2NwdV9zdXNwZW5kCi0jZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDE1MTAgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCi1FTlRSWShvbWFwMTYxMF9jcHVfc3VzcGVuZCkKLQotCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQlzdG1mZAlzcCEsIHtyMCAtIHIxMiwgbHJ9Ci0KLQlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIFRyYWZmaWMgQ29udHJvbGxlcgotCW1vdglyNCwgI1RDTUlGX0FTTV9CQVNFICYgMHhmZjAwMDAwMAotCW9ycglyNCwgcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4MDBmZjAwMDAKLQlvcnIJcjQsIHI0LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwMDBmZjAwCi0KLQlAIHByZXBhcmUgdG8gcHV0IFNEUkFNIGludG8gc2VsZi1yZWZyZXNoIG1hbnVhbGx5Ci0JbGRyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCi0Jb3JyCXI1LCByNSwgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHhmZjAwMDAwMAotCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4MDAwMDAwZmYKLQlzdHIJcjUsIFtyNCwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgcHJlcGFyZSB0byBwdXQgRU1JRlMgdG8gU2xlZXAKLQlsZHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KLQlvcnIJcjUsIHI1LCAjSURMRV9FTUlGU19SRVFVRVNUICYgMHhmZgotCXN0cglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCi0JQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIKLQltb3YJcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHhmZjAwMDAwMAotCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMGZmMDAwMAotCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMDAwZmYwMAotCi0JQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCi0JbW92CXI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKLQlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgd29yayBhcm91bmQgZXJyYXRhIG9mIE9NQVAxNjEwLzU5MTIuIEVuYWJsZSAoISkgcGVyaXBoZXJhbAotCUAgY2xvY2sgdG8gbGV0IHRoZSBjaGlwIGdvIGludG8gZGVlcCBzbGVlcAotCWxkcmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQotIAlvcnIJcjUscjUsICNFTl9QRVJDS19CSVQgJiAweGZmCi0Jc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0KLQlAIHJlcXVlc3QgQVJNIGlkbGUKLQltb3YJcjMsICNPTUFQMTYxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmCi0Jb3JyCXIzLCByMywgI09NQVAxNjEwX0RFRVBfU0xFRVBfUkVRVUVTVCAmIDB4ZmYwMAotCXN0cmgJcjMsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQotCi0JbW92CXI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYKLQlvcnIgICAgIHI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKLWxfMTYxMF8yOgotCXN1YnMJcjUsIHI1LCAjMQotCWJuZQlsXzE2MTBfMgotLyoKLSAqIExldCdzIHdhaXQgZm9yIHRoZSBuZXh0IHdha2UgdXAgZXZlbnQgdG8gd2FrZSB1cyB1cC4gcjAgY2FuJ3QgYmUKLSAqIHVzZWQgaGVyZSBiZWNhdXNlIHIwIGhvbGRzIEFSTV9JRExFQ1QxCi0gKi8KLQltb3YJcjIsICMwCi0JbWNyCXAxNSwgMCwgcjIsIGM3LCBjMCwgNAkJQCB3YWl0IGZvciBpbnRlcnJ1cHQKLS8qCi0gKiBvbWFwMTYxMF9jcHVfc3VzcGVuZCgpJ3MgcmVzdW1lIHBvaW50LgotICoKLSAqIEl0IHdpbGwganVzdCBzdGFydCBleGVjdXRpbmcgaGVyZSwgc28gd2UnbGwgcmVzdG9yZSBzdHVmZiBmcm9tIHRoZQotICogc3RhY2ssIHJlc2V0IHRoZSBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIuCi0gKi8KLQlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQlzdHJoCXIwLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KLQlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30KLQotRU5UUlkob21hcDE2MTBfY3B1X3N1c3BlbmRfc3opCi0JLndvcmQJLiAtIG9tYXAxNjEwX2NwdV9zdXNwZW5kCi0jZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDE2WFggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAvdGltZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjA1ZmRjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC90aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcC90aW1lLmMKLSAqCi0gKiBPTUFQIFRpbWVycwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgotICogUGFydGlhbCB0aW1lciByZXdyaXRlIGFuZCBhZGRpdGlvbmFsIFZTVCB0aW1lciBzdXBwb3J0IGJ5Ci0gKiBUb255IExpbmRnZW4gPHRvbnlAYXRvbWlkZS5jb20+IGFuZAotICogVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+Ci0gKgotICogTVBVIHRpbWVyIGNvZGUgYmFzZWQgb24gdGhlIG9sZGVyIE1QVSB0aW1lciBjb2RlIGZvciBPTUFQCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgUmlkZ2VSdW4sIEluYy4KLSAqIEF1dGhvcjogR3JlZyBMb25ub24gPGdsb25ub25AcmlkZ2VydW4uY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTgotICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAotICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbGVkcy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLXN0cnVjdCBzeXNfdGltZXIgb21hcF90aW1lcjsKLQotI2lmZGVmIENPTkZJR19PTUFQX01QVV9USU1FUgotCi0vKgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBNUFUgdGltZXIKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jZGVmaW5lIE9NQVBfTVBVX1RJTUVSMV9CQVNFCQkoMHhmZmZlYzUwMCkKLSNkZWZpbmUgT01BUF9NUFVfVElNRVIyX0JBU0UJCSgweGZmZmVjNjAwKQotI2RlZmluZSBPTUFQX01QVV9USU1FUjNfQkFTRQkJKDB4ZmZmZWM3MDApCi0jZGVmaW5lIE9NQVBfTVBVX1RJTUVSX0JBU0UJCU9NQVBfTVBVX1RJTUVSMV9CQVNFCi0jZGVmaW5lIE9NQVBfTVBVX1RJTUVSX09GRlNFVAkJMHgxMDAKLQotI2RlZmluZSBNUFVfVElNRVJfRlJFRQkJCSgxIDw8IDYpCi0jZGVmaW5lIE1QVV9USU1FUl9DTE9DS19FTkFCTEUJCSgxIDw8IDUpCi0jZGVmaW5lIE1QVV9USU1FUl9BUgkJCSgxIDw8IDEpCi0jZGVmaW5lIE1QVV9USU1FUl9TVAkJCSgxIDw8IDApCi0KLS8qIGN5Y2xlcyB0byBuc2VjIGNvbnZlcnNpb25zIHRha2VuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMsCi0gKiBjb252ZXJ0ZWQgdG8gdXNlIGtIeiBieSBLZXZpbiBIaWxtYW4gKi8KLS8qIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQotICogIGJhc2ljIGVxdWF0aW9uOgotICoJCW5zID0gY3ljbGVzIC8gKGZyZXEgLyBuc19wZXJfc2VjKQotICoJCW5zID0gY3ljbGVzICogKG5zX3Blcl9zZWMgLyBmcmVxKQotICoJCW5zID0gY3ljbGVzICogKDEwXjkgLyAoY3B1X2toeiAqIDEwXjMpKQotICoJCW5zID0gY3ljbGVzICogKDEwXjYgLyBjcHVfa2h6KQotICoKLSAqCVRoZW4gd2UgdXNlIHNjYWxpbmcgbWF0aCAoc3VnZ2VzdGVkIGJ5IGdlb3JnZSBhdCBtdmlzdGEuY29tKSB0byBnZXQ6Ci0gKgkJbnMgPSBjeWNsZXMgKiAoMTBeNiAqIFNDIC8gY3B1X2toeiAvIFNDCi0gKgkJbnMgPSBjeWNsZXMgKiBjeWMybnNfc2NhbGUgLyBTQwotICoKLSAqCUFuZCBzaW5jZSBTQyBpcyBhIGNvbnN0YW50IHBvd2VyIG9mIHR3bywgd2UgY2FuIGNvbnZlcnQgdGhlIGRpdgotICogIGludG8gYSBzaGlmdC4KLSAqCQkJLWpvaG5zdHVsIGF0IHVzLmlibS5jb20gIm1hdGggaXMgaGFyZCwgbGV0cyBnbyBzaG9wcGluZyEiCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGN5YzJuc19zY2FsZTsKLSNkZWZpbmUgQ1lDMk5TX1NDQUxFX0ZBQ1RPUiAxMCAvKiAyXjEwLCBjYXJlZnVsbHkgY2hvc2VuICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3ljMm5zX3NjYWxlKHVuc2lnbmVkIGxvbmcgY3B1X2toeikKLXsKLQljeWMybnNfc2NhbGUgPSAoMTAwMDAwMCA8PCBDWUMyTlNfU0NBTEVfRkFDVE9SKS9jcHVfa2h6OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKQotewotCXJldHVybiAoY3ljICogY3ljMm5zX3NjYWxlKSA+PiBDWUMyTlNfU0NBTEVfRkFDVE9SOwotfQotCi0vKgotICogTVBVX1RJQ0tTX1BFUl9TRUMgbXVzdCBiZSBhbiBldmVuIG51bWJlciwgb3RoZXJ3aXNlIG1hY2hpbmVjeWNsZXNfdG9fdXNlY3MKLSAqIHdpbGwgYnJlYWsuIE9uIFAyLCB0aGUgdGltZXIgY291bnQgcmF0ZSBpcyA2LjUgTUh6IGFmdGVyIHByb2dyYW1taW5nIFBUVgotICogd2l0aCAwLiBUaGlzIGRpdmlkZXMgdGhlIDEzTUh6IGlucHV0IGJ5IDIsIGFuZCBpcyB1bmRvY3VtZW50ZWQuCi0gKi8KLSNpZmRlZiBDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyCi0vKiBSRVZJU0lUOiBUaGlzIGlmZGVmIGNvbnN0cnVjdCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBxdWVyeSB0byBjbG9jawotICogZnJhbWV3b3JrIHRvIHNlZSBpZiB0aW1lciBiYXNlIGZyZXF1ZW5jeSBpcyAxMi4wLCAxMy4wIG9yIDE5LjIgTUh6LgotICovCi0jZGVmaW5lIE1QVV9USUNLU19QRVJfU0VDCQkoMTMwMDAwMDAgLyAyKQotI2Vsc2UKLSNkZWZpbmUgTVBVX1RJQ0tTX1BFUl9TRUMJCSgxMjAwMDAwMCAvIDIpCi0jZW5kaWYKLQotI2RlZmluZSBNUFVfVElNRVJfVElDS19QRVJJT0QJCSgoTVBVX1RJQ0tTX1BFUl9TRUMgLyBIWikgLSAxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdTMyIGNudGw7CQkJLyogQ05UTF9USU1FUiwgUi9XICovCi0JdTMyIGxvYWRfdGltOwkJCS8qIExPQURfVElNLCAgIFcgKi8KLQl1MzIgcmVhZF90aW07CQkJLyogUkVBRF9USU0sICAgUiAqLwotfSBvbWFwX21wdV90aW1lcl9yZWdzX3Q7Ci0KLSNkZWZpbmUgb21hcF9tcHVfdGltZXJfYmFzZShuKQkJCQkJCVwKLSgodm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KilJT19BRERSRVNTKE9NQVBfTVBVX1RJTUVSX0JBU0UgKwlcCi0JCQkJIChuKSpPTUFQX01QVV9USU1FUl9PRkZTRVQpKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgb21hcF9tcHVfdGltZXJfcmVhZChpbnQgbnIpCi17Ci0Jdm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KiB0aW1lciA9IG9tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOwotCXJldHVybiB0aW1lci0+cmVhZF90aW07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX21wdV90aW1lcl9zdGFydChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgbG9hZF92YWwpCi17Ci0Jdm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KiB0aW1lciA9IG9tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOwotCi0JdGltZXItPmNudGwgPSBNUFVfVElNRVJfQ0xPQ0tfRU5BQkxFOwotCXVkZWxheSgxKTsKLQl0aW1lci0+bG9hZF90aW0gPSBsb2FkX3ZhbDsKLSAgICAgICAgdWRlbGF5KDEpOwotCXRpbWVyLT5jbnRsID0gKE1QVV9USU1FUl9DTE9DS19FTkFCTEUgfCBNUFVfVElNRVJfQVIgfCBNUFVfVElNRVJfU1QpOwotfQotCi11bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyX3RpY2tzX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgbnJfdGlja3MpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIG5zZWM7Ci0KLQluc2VjID0gY3ljbGVzXzJfbnMoKHVuc2lnbmVkIGxvbmcgbG9uZylucl90aWNrcyk7Ci0JcmV0dXJuICh1bnNpZ25lZCBsb25nKW5zZWMgLyAxMDAwOwotfQotCi0vKgotICogTGFzdCBwcm9jZXNzZWQgc3lzdGVtIHRpbWVyIGludGVycnVwdAotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX21wdV90aW1lcl9sYXN0ID0gMDsKLQotLyoKLSAqIFJldHVybnMgZWxhcHNlZCB1c2VjcyBzaW5jZSBsYXN0IHN5c3RlbSB0aW1lciBpbnRlcnJ1cHQKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9tcHVfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbm93ID0gMCAtIG9tYXBfbXB1X3RpbWVyX3JlYWQoMCk7Ci0JdW5zaWduZWQgbG9uZyBlbGFwc2VkID0gbm93IC0gb21hcF9tcHVfdGltZXJfbGFzdDsKLQotCXJldHVybiBvbWFwX21wdV90aW1lcl90aWNrc190b191c2VjcyhlbGFwc2VkKTsKLX0KLQotLyoKLSAqIEVsYXBzZWQgdGltZSBiZXR3ZWVuIGludGVycnVwdHMgaXMgY2FsY3VsYXRlZCB1c2luZyB0aW1lcjAuCi0gKiBMYXRlbmN5IGR1cmluZyB0aGUgaW50ZXJydXB0IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIxLgotICogQm90aCB0aW1lcjAgYW5kIHRpbWVyMSBhcmUgY291bnRpbmcgYXQgNk1IeiAoUDIgNi41TUh6KS4KLSAqLwotc3RhdGljIGlycXJldHVybl90IG9tYXBfbXB1X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0JCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVuc2lnbmVkIGxvbmcgbm93LCBsYXRlbmN5OwotCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0Jbm93ID0gMCAtIG9tYXBfbXB1X3RpbWVyX3JlYWQoMCk7Ci0JbGF0ZW5jeSA9IE1QVV9USUNLU19QRVJfU0VDIC8gSFogLSBvbWFwX21wdV90aW1lcl9yZWFkKDEpOwotCW9tYXBfbXB1X3RpbWVyX2xhc3QgPSBub3cgLSBsYXRlbmN5OwotCXRpbWVyX3RpY2socmVncyk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF9tcHVfdGltZXJfaXJxID0gewotCS5uYW1lCQk9ICJtcHUgdGltZXIiLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBvbWFwX21wdV90aW1lcl9pbnRlcnJ1cHQKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyMV9vdmVyZmxvd3M7Ci1zdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tcHVfdGltZXIxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCi0JCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jb21hcF9tcHVfdGltZXIxX292ZXJmbG93cysrOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF9tcHVfdGltZXIxX2lycSA9IHsKLQkubmFtZQkJPSAibXB1IHRpbWVyMSBvdmVyZmxvdyIsCi0JLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKLQkuaGFuZGxlcgk9IG9tYXBfbXB1X3RpbWVyMV9pbnRlcnJ1cHQKLX07Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBvbWFwX2luaXRfbXB1X3RpbWVyKHZvaWQpCi17Ci0Jc2V0X2N5YzJuc19zY2FsZShNUFVfVElDS1NfUEVSX1NFQyAvIDEwMDApOwotCW9tYXBfdGltZXIub2Zmc2V0ID0gb21hcF9tcHVfdGltZXJfZ2V0dGltZW9mZnNldDsKLQlzZXR1cF9pcnEoSU5UX1RJTUVSMSwgJm9tYXBfbXB1X3RpbWVyMV9pcnEpOwotCXNldHVwX2lycShJTlRfVElNRVIyLCAmb21hcF9tcHVfdGltZXJfaXJxKTsKLQlvbWFwX21wdV90aW1lcl9zdGFydCgwLCAweGZmZmZmZmZmKTsKLQlvbWFwX21wdV90aW1lcl9zdGFydCgxLCBNUFVfVElNRVJfVElDS19QRVJJT0QpOwotfQotCi0vKgotICogU2NoZWR1bGVyIGNsb2NrIC0gcmV0dXJucyBjdXJyZW50IHRpbWUgaW4gbmFub3NlYyB1bml0cy4KLSAqLwotdW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0aWNrcyA9IDAgLSBvbWFwX21wdV90aW1lcl9yZWFkKDApOwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0aWNrczY0OwotCi0JdGlja3M2NCA9IG9tYXBfbXB1X3RpbWVyMV9vdmVyZmxvd3M7Ci0JdGlja3M2NCA8PD0gMzI7Ci0JdGlja3M2NCB8PSB0aWNrczsKLQotCXJldHVybiBjeWNsZXNfMl9ucyh0aWNrczY0KTsKLX0KLSNlbmRpZgkvKiBDT05GSUdfT01BUF9NUFVfVElNRVIgKi8KLQotI2lmZGVmIENPTkZJR19PTUFQXzMyS19USU1FUgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKLSNlcnJvciBPTUFQIDMyS0h6IHRpbWVyIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIG9uIDE1MTAhCi0jZW5kaWYKLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMzJLSHogT1MgdGltZXIKLSAqCi0gKiBUaGlzIGN1cnJlbnRseSB3b3JrcyBvbmx5IG9uIDE2eHgsIGFzIDE1MTAgZG9lcyBub3QgaGF2ZSB0aGUgY29udGludW91cwotICogMzJLSHogc3luY2hyb25vdXMgdGltZXIuIFRoZSAzMktIeiBzeW5jaHJvbm91cyB0aW1lciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sKLSAqIG9mIHRpbWUgaW4gYWRkaXRpb24gdG8gdGhlIDMyS0h6IE9TIHRpbWVyLiBVc2luZyBvbmx5IHRoZSAzMktIeiBPUyB0aW1lcgotICogb24gMTUxMCB3b3VsZCBiZSBwb3NzaWJsZSwgYnV0IHRoZSB0aW1lciB3b3VsZCBub3QgYmUgYXMgYWNjdXJhdGUgYXMKLSAqIHdpdGggdGhlIDMyS0h6IHN5bmNocm9uaXplZCB0aW1lci4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0jZGVmaW5lIE9NQVBfMzJLX1RJTUVSX0JBU0UJCTB4ZmZmYjkwMDAKLSNkZWZpbmUgT01BUF8zMktfVElNRVJfQ1IJCTB4MDgKLSNkZWZpbmUgT01BUF8zMktfVElNRVJfVFZSCQkweDAwCi0jZGVmaW5lIE9NQVBfMzJLX1RJTUVSX1RDUgkJMHgwNAotCi0jZGVmaW5lIE9NQVBfMzJLX1RJQ0tTX1BFUl9IWgkJKDMyNzY4IC8gSFopCi0KLS8qCi0gKiBUUk0gc2F5cyAxIC8gSFogPSAoIFRWUiArIDEpIC8gMzI3NjgsIHNvIFRSViA9ICgzMjc2OCAvIEhaKSAtIDEKLSAqIHNvIHdpdGggSFogPSAxMDAsIFRWUiA9IDMyNy42OC4KLSAqLwotI2RlZmluZSBPTUFQXzMyS19USU1FUl9USUNLX1BFUklPRAkoKDMyNzY4IC8gSFopIC0gMSkKLSNkZWZpbmUgTUFYX1NLSVBfSklGRklFUwkJMjUKLSNkZWZpbmUgVElNRVJfMzJLX1NZTkNIUk9OSVpFRAkJMHhmZmZiYzQxMAotCi0jZGVmaW5lIEpJRkZJRVNfVE9fSFdfVElDS1MobnJfamlmZmllcywgY2xvY2tfcmF0ZSkJCQlcCi0JCQkJKCgobnJfamlmZmllcykgKiAoY2xvY2tfcmF0ZSkpIC8gSFopCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwXzMya190aW1lcl93cml0ZShpbnQgdmFsLCBpbnQgcmVnKQotewotCW9tYXBfd3JpdGV3KHZhbCwgcmVnICsgT01BUF8zMktfVElNRVJfQkFTRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aW1lcl9yZWFkKGludCByZWcpCi17Ci0JcmV0dXJuIG9tYXBfcmVhZGwocmVnICsgT01BUF8zMktfVElNRVJfQkFTRSkgJiAweGZmZmZmZjsKLX0KLQotLyoKLSAqIFRoZSAzMktIeiBzeW5jaHJvbml6ZWQgdGltZXIgaXMgYW4gYWRkaXRpb25hbCB0aW1lciBvbiAxNnh4LgotICogSXQgaXMgYWx3YXlzIHJ1bm5pbmcuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQodm9pZCkKLXsKLQlyZXR1cm4gb21hcF9yZWFkbChUSU1FUl8zMktfU1lOQ0hST05JWkVEKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfMzJrX3RpbWVyX3N0YXJ0KHVuc2lnbmVkIGxvbmcgbG9hZF92YWwpCi17Ci0Jb21hcF8zMmtfdGltZXJfd3JpdGUobG9hZF92YWwsIE9NQVBfMzJLX1RJTUVSX1RWUik7Ci0Jb21hcF8zMmtfdGltZXJfd3JpdGUoMHgwZiwgT01BUF8zMktfVElNRVJfQ1IpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgb21hcF8zMmtfdGltZXJfc3RvcCh2b2lkKQotewotCW9tYXBfMzJrX3RpbWVyX3dyaXRlKDB4MCwgT01BUF8zMktfVElNRVJfQ1IpOwotfQotCi0vKgotICogUm91bmRzIGRvd24gdG8gbmVhcmVzdCB1c2VjCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aWNrc190b191c2Vjcyh1bnNpZ25lZCBsb25nIHRpY2tzXzMyaykKLXsKLQlyZXR1cm4gKHRpY2tzXzMyayAqIDUqNSo1KjUqNSo1KSA+PiA5OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwXzMya19sYXN0X3RpY2sgPSAwOwotCi0vKgotICogUmV0dXJucyBlbGFwc2VkIHVzZWNzIHNpbmNlIGxhc3QgMzJrIHRpbWVyIGludGVycnVwdAotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwXzMya190aW1lcl9nZXR0aW1lb2Zmc2V0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKLQlyZXR1cm4gb21hcF8zMmtfdGlja3NfdG9fdXNlY3Mobm93IC0gb21hcF8zMmtfbGFzdF90aWNrKTsKLX0KLQotLyoKLSAqIFRpbWVyIGludGVycnVwdCBmb3IgMzJLSHogdGltZXIuIFdoZW4gZHluYW1pYyB0aWNrIGlzIGVuYWJsZWQsIHRoaXMKLSAqIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkIGZyb20gb3RoZXIgaW50ZXJydXB0cyB0byByZW1vdmUgbGF0ZW5jeQotICogaXNzdWVzIHdpdGggZHluYW1pYyB0aWNrLiBJbiB0aGUgZHluYW1pYyB0aWNrIGNhc2UsIHdlIG5lZWQgdG8gbG9jawotICogd2l0aCBpcnFzYXZlLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF8zMmtfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKLQkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBub3c7Ci0KLQl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQlub3cgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKLQotCXdoaWxlIChub3cgLSBvbWFwXzMya19sYXN0X3RpY2sgPj0gT01BUF8zMktfVElDS1NfUEVSX0haKSB7Ci0JCW9tYXBfMzJrX2xhc3RfdGljayArPSBPTUFQXzMyS19USUNLU19QRVJfSFo7Ci0JCXRpbWVyX3RpY2socmVncyk7Ci0JfQotCi0JLyogUmVzdGFydCB0aW1lciBzbyB3ZSBkb24ndCBkcmlmdCBvZmYgZHVlIHRvIG1vZHVsbyBvciBkeW5hbWljIHRpY2suCi0JICogQnkgZGVmYXVsdCB3ZSBwcm9ncmFtIHRoZSBuZXh0IHRpbWVyIHRvIGJlIGNvbnRpbnVvdXMgdG8gYXZvaWQKLQkgKiBsYXRlbmNpZXMgZHVyaW5nIGhpZ2ggc3lzdGVtIGxvYWQuIER1cmluZyBkeW5hbWljIHRpY2sgb3BlcmF0aW9uIHRoZQotCSAqIGNvbnRpbnVvdXMgdGltZXIgY2FuIGJlIG92ZXJyaWRkZW4gZnJvbSBwbV9pZGxlIHRvIGJlIGxvbmdlci4KLQkgKi8KLQlvbWFwXzMya190aW1lcl9zdGFydChvbWFwXzMya19sYXN0X3RpY2sgKyBPTUFQXzMyS19USUNLU19QRVJfSFogLSBub3cpOwotCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXBfMzJrX3RpbWVyX2lycSA9IHsKLQkubmFtZQkJPSAiMzJLSHogdGltZXIiLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBvbWFwXzMya190aW1lcl9pbnRlcnJ1cHQKLX07Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBvbWFwX2luaXRfMzJrX3RpbWVyKHZvaWQpCi17Ci0Jc2V0dXBfaXJxKElOVF9PU19USU1FUiwgJm9tYXBfMzJrX3RpbWVyX2lycSk7Ci0Jb21hcF90aW1lci5vZmZzZXQgID0gb21hcF8zMmtfdGltZXJfZ2V0dGltZW9mZnNldDsKLQlvbWFwXzMya19sYXN0X3RpY2sgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKLQlvbWFwXzMya190aW1lcl9zdGFydChPTUFQXzMyS19USU1FUl9USUNLX1BFUklPRCk7Ci19Ci0jZW5kaWYJLyogQ09ORklHX09NQVBfMzJLX1RJTUVSICovCi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRpbWVyIGluaXRpYWxpemF0aW9uCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotdm9pZCBfX2luaXQgb21hcF90aW1lcl9pbml0KHZvaWQpCi17Ci0jaWYgZGVmaW5lZChDT05GSUdfT01BUF9NUFVfVElNRVIpCi0Jb21hcF9pbml0X21wdV90aW1lcigpOwotI2VsaWYgZGVmaW5lZChDT05GSUdfT01BUF8zMktfVElNRVIpCi0Jb21hcF9pbml0XzMya190aW1lcigpOwotI2Vsc2UKLSNlcnJvciBObyBzeXN0ZW0gdGltZXIgc2VsZWN0ZWQgaW4gS2NvbmZpZyEKLSNlbmRpZgotfQotCi1zdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXIgPSB7Ci0JLmluaXQJCT0gb21hcF90aW1lcl9pbml0LAotCS5vZmZzZXQJCT0gTlVMTCwJCS8qIEluaXRpYWxpemVkIGxhdGVyICovCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTgwNWQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcC91c2IuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKgotICogYXJjaC9hcm0vbWFjaC1vbWFwL3VzYi5jIC0tIHBsYXRmb3JtIGxldmVsIFVTQiBpbml0aWFsaXphdGlvbgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jdW5kZWYJREVCVUcKLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiX290Zy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotCi0jaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+Ci0jaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KLQotLyogVGhlc2Ugcm91dGluZXMgc2hvdWxkIGhhbmRsZSB0aGUgc3RhbmRhcmQgY2hpcC1zcGVjaWZpYyBtb2RlcwotICogZm9yIHVzYjAvMS8yIHBvcnRzLCBjb3ZlcmluZyBiYXNpYyBtdXggYW5kIHRyYW5zY2VpdmVyIHNldHVwLgotICogQ2FsbCBvbWFwX3VzYl9pbml0KCkgb25jZSwgZnJvbSBJTklUX01BQ0hJTkUoKS4KLSAqCi0gKiBTb21lIGJvYXJkLSouYyBmaWxlcyB3aWxsIG5lZWQgdG8gc2V0IHVwIGFkZGl0aW9uYWwgbXV4IG9wdGlvbnMsCi0gKiBsaWtlIGZvciBzdXNwZW5kIGhhbmRsaW5nLCB2YnVzIHNlbnNpbmcsIEdQSU9zLCBhbmQgdGhlIEQrIHB1bGx1cC4KLSAqLwotCi0vKiBURVNURUQgT046Ci0gKiAgLSAxNjExQiBIMiAod2l0aCB1c2IxIG1pbmktQUIpIHVzaW5nIHN0YW5kYXJkIE1pbmktQiBvciBPVEcgY2FibGVzCi0gKiAgLSA1OTEyIE9TSyBPSENJICh3aXRoIHVzYjAgc3RhbmRhcmQtQSksIHN0YW5kYXJkIEEtdG8tQiBjYWJsZXMKLSAqICAtIDU5MTIgT1NLIFVEQywgd2l0aCAqbm9uc3RhbmRhcmQqIEEtdG8tQSBjYWJsZQotICogIC0gMTUxMCBJbm5vdmF0b3IgVURDIHdpdGggYnVuZGxlZCB1c2IwIGNhYmxlCi0gKiAgLSAxNTEwIElubm92YXRvciBPSENJIHdpdGggYnVuZGxlZCB1c2IxL3VzYjIgY2FibGUKLSAqICAtIDE1MTAgSW5ub3ZhdG9yIE9IQ0kgd2l0aCBjdXN0b20gdXNiMCBjYWJsZSwgZmVlZGluZyA1ViBWQlVTCi0gKiAgLSAxNzEwIGN1c3RvbSBkZXZlbG9wbWVudCBib2FyZCB1c2luZyBhbHRlcm5hdGUgcGluIGdyb3VwCi0gKiAgLSAxNzEwIEgzICh3aXRoIHVzYjEgbWluaS1BQikgdXNpbmcgc3RhbmRhcmQgTWluaS1CIG9yIE9URyBjYWJsZXMKLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYJQ09ORklHX0FSQ0hfT01BUF9PVEcKLQotc3RhdGljIHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKnhjZWl2OwotCi0vKioKLSAqIG90Z19nZXRfdHJhbnNjZWl2ZXIgLSBmaW5kIHRoZSAoc2luZ2xlKSBPVEcgdHJhbnNjZWl2ZXIgZHJpdmVyCi0gKgotICogUmV0dXJucyB0aGUgdHJhbnNjZWl2ZXIgZHJpdmVyLCBhZnRlciBnZXR0aW5nIGEgcmVmY291bnQgdG8gaXQ7IG9yCi0gKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdHJhbnNjZWl2ZXIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotICogcmVsZWFzaW5nIHRoYXQgY291bnQuCi0gKi8KLXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z19nZXRfdHJhbnNjZWl2ZXIodm9pZCkKLXsKLQlpZiAoeGNlaXYpCi0JCWdldF9kZXZpY2UoeGNlaXYtPmRldik7Ci0JcmV0dXJuIHhjZWl2OwotfQotRVhQT1JUX1NZTUJPTChvdGdfZ2V0X3RyYW5zY2VpdmVyKTsKLQotaW50IG90Z19zZXRfdHJhbnNjZWl2ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCkKLXsKLQlpZiAoeGNlaXYgJiYgeCkKLQkJcmV0dXJuIC1FQlVTWTsKLQl4Y2VpdiA9IHg7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKG90Z19zZXRfdHJhbnNjZWl2ZXIpOwotCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHUzMiBfX2luaXQgb21hcF91c2IwX2luaXQodW5zaWduZWQgbndpcmVzLCB1bnNpZ25lZCBpc19kZXZpY2UpCi17Ci0JdTMyCXN5c2NvbjEgPSAwOwotCi0JaWYgKG53aXJlcyA9PSAwKSB7Ci0JCWlmICghY3B1X2lzX29tYXAxNXh4KCkpIHsKLQkJCS8qIHB1bGxkb3duIEQrL0QtICovCi0JCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgJj0gfigzIDw8IDEpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChpc19kZXZpY2UpCi0JCW9tYXBfY2ZnX3JlZyhXNF9VU0JfUFVFTik7Ci0KLQkvKiBpbnRlcm5hbCB0cmFuc2NlaXZlciAqLwotCWlmIChud2lyZXMgPT0gMikgewotCQkvLyBvbWFwX2NmZ19yZWcoUDlfVVNCX0RQKTsKLQkJLy8gb21hcF9jZmdfcmVnKFI4X1VTQl9ETSk7Ci0KLQkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7Ci0JCQkvKiBUaGlzIHdvcmtzIG9uIDE1MTAtSW5ub3ZhdG9yICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIE5PVEVTOgotCQkgKiAgLSBwZXJpcGhlcmFsIHNob3VsZCBjb25maWd1cmUgVkJVUyBkZXRlY3Rpb24hCi0JCSAqICAtIG9ubHkgcGVyaXBoZXJhbHMgbWF5IHVzZSB0aGUgaW50ZXJuYWwgRCsvRC0gcHVsbGRvd25zCi0JCSAqICAtIE9URyBzdXBwb3J0IG9uIHRoaXMgcG9ydCBub3QgeWV0IHdyaXR0ZW4KLQkJICovCi0KLQkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHICY9IH4oNyA8PCA0KTsKLQkJaWYgKCFpc19kZXZpY2UpCi0JCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgfD0gKDMgPDwgMSk7Ci0KLQkJcmV0dXJuIDMgPDwgMTY7Ci0JfQotCi0JLyogYWx0ZXJuYXRlIHBpbiBjb25maWcsIGV4dGVybmFsIHRyYW5zY2VpdmVyICovCi0JaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibm8gdXNiMCBhbHQgcGluIGNvbmZpZyBvbiAxNXh4XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jb21hcF9jZmdfcmVnKFY2X1VTQjBfVFhEKTsKLQlvbWFwX2NmZ19yZWcoVzlfVVNCMF9UWEVOKTsKLQlvbWFwX2NmZ19yZWcoVzVfVVNCMF9TRTApOwotCi0JLyogTk9URTogIFNQRUVEIGFuZCBTVVNQIGFyZW4ndCBjb25maWd1cmVkIGhlcmUgKi8KLQotCWlmIChud2lyZXMgIT0gMykKLQkJb21hcF9jZmdfcmVnKFk1X1VTQjBfUkNWKTsKLQlpZiAobndpcmVzICE9IDYpCi0JCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyAmPSB+Q09ORl9VU0IyX1VOSV9SOwotCi0Jc3dpdGNoIChud2lyZXMpIHsKLQljYXNlIDM6Ci0JCXN5c2NvbjEgPSAyOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXN5c2NvbjEgPSAxOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXN5c2NvbjEgPSAzOwotCQlvbWFwX2NmZ19yZWcoQUE5X1VTQjBfVlApOwotCQlvbWFwX2NmZ19yZWcoUjlfVVNCMF9WTSk7Ci0JCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyB8PSBDT05GX1VTQjJfVU5JX1I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiaWxsZWdhbCB1c2IlZCAlZC13aXJlIHRyYW5zY2VpdmVyXG4iLAotCQkJMCwgbndpcmVzKTsKLQl9Ci0JcmV0dXJuIHN5c2NvbjEgPDwgMTY7Ci19Ci0KLXN0YXRpYyB1MzIgX19pbml0IG9tYXBfdXNiMV9pbml0KHVuc2lnbmVkIG53aXJlcykKLXsKLQl1MzIJc3lzY29uMSA9IDA7Ci0KLQlpZiAobndpcmVzICE9IDYgJiYgIWNwdV9pc19vbWFwMTV4eCgpKQotCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgJj0gfkNPTkZfVVNCMV9VTklfUjsKLQlpZiAobndpcmVzID09IDApCi0JCXJldHVybiAwOwotCi0JLyogZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KLQlvbWFwX2NmZ19yZWcoVVNCMV9UWEQpOwotCW9tYXBfY2ZnX3JlZyhVU0IxX1RYRU4pOwotCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgewotCQlvbWFwX2NmZ19yZWcoVVNCMV9TRU8pOwotCQlvbWFwX2NmZ19yZWcoVVNCMV9TUEVFRCk7Ci0JCS8vIFNVU1AKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwNTkxMigpKSB7Ci0JCW9tYXBfY2ZnX3JlZyhXMTNfMTYxMF9VU0IxX1NFMCk7Ci0JCW9tYXBfY2ZnX3JlZyhSMTNfMTYxMF9VU0IxX1NQRUVEKTsKLQkJLy8gU1VTUAotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJb21hcF9jZmdfcmVnKFIxM18xNzEwX1VTQjFfU0UwKTsKLQkJLy8gU1VTUAotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJ1c2IgdW5yZWNvZ25pemVkXG4iKTsKLQl9Ci0JaWYgKG53aXJlcyAhPSAzKQotCQlvbWFwX2NmZ19yZWcoVVNCMV9SQ1YpOwotCi0Jc3dpdGNoIChud2lyZXMpIHsKLQljYXNlIDM6Ci0JCXN5c2NvbjEgPSAyOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXN5c2NvbjEgPSAxOwotCQlicmVhazsKLQljYXNlIDY6Ci0JCXN5c2NvbjEgPSAzOwotCQlvbWFwX2NmZ19yZWcoVVNCMV9WUCk7Ci0JCW9tYXBfY2ZnX3JlZyhVU0IxX1ZNKTsKLQkJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkKLQkJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyB8PSBDT05GX1VTQjFfVU5JX1I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX0VSUiAiaWxsZWdhbCB1c2IlZCAlZC13aXJlIHRyYW5zY2VpdmVyXG4iLAotCQkJMSwgbndpcmVzKTsKLQl9Ci0JcmV0dXJuIHN5c2NvbjEgPDwgMjA7Ci19Ci0KLXN0YXRpYyB1MzIgX19pbml0IG9tYXBfdXNiMl9pbml0KHVuc2lnbmVkIG53aXJlcywgdW5zaWduZWQgYWx0X3Bpbmdyb3VwKQotewotCXUzMglzeXNjb24xID0gMDsKLQotCS8qIE5PVEUgZXJyYXR1bTogbXVzdCBsZWF2ZSBVU0IyX1VOSV9SIHNldCBpZiB1c2IwIGluIHVzZSAqLwotCWlmIChhbHRfcGluZ3JvdXAgfHwgbndpcmVzID09IDApCi0JCXJldHVybiAwOwotCWlmIChud2lyZXMgIT0gNiAmJiAhY3B1X2lzX29tYXAxNXh4KCkpCi0JCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyAmPSB+Q09ORl9VU0IyX1VOSV9SOwotCi0JLyogZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KLQlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKLQkJb21hcF9jZmdfcmVnKFVTQjJfVFhEKTsKLQkJb21hcF9jZmdfcmVnKFVTQjJfVFhFTik7Ci0JCW9tYXBfY2ZnX3JlZyhVU0IyX1NFTyk7Ci0JCWlmIChud2lyZXMgIT0gMykKLQkJCW9tYXBfY2ZnX3JlZyhVU0IyX1JDVik7Ci0JCS8qIHRoZXJlIGlzIG5vIFVTQjJfU1BFRUQgKi8KLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCW9tYXBfY2ZnX3JlZyhWNl9VU0IyX1RYRCk7Ci0JCW9tYXBfY2ZnX3JlZyhXOV9VU0IyX1RYRU4pOwotCQlvbWFwX2NmZ19yZWcoVzVfVVNCMl9TRTApOwotCQlpZiAobndpcmVzICE9IDMpCi0JCQlvbWFwX2NmZ19yZWcoWTVfVVNCMl9SQ1YpOwotCQkvLyBGSVhNRSBvbWFwX2NmZ19yZWcoVVNCMl9TUEVFRCk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoInVzYiB1bnJlY29nbml6ZWRcbiIpOwotCX0KLQkvLyBvbWFwX2NmZ19yZWcoVVNCMl9TVVNQKTsKLQotCXN3aXRjaCAobndpcmVzKSB7Ci0JY2FzZSAzOgotCQlzeXNjb24xID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlzeXNjb24xID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQlzeXNjb24xID0gMzsKLQkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7Ci0JCQlvbWFwX2NmZ19yZWcoVVNCMl9WUCk7Ci0JCQlvbWFwX2NmZ19yZWcoVVNCMl9WTSk7Ci0JCX0gZWxzZSB7Ci0JCQlvbWFwX2NmZ19yZWcoQUE5X1VTQjJfVlApOwotCQkJb21hcF9jZmdfcmVnKFI5X1VTQjJfVk0pOwotCQkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHIHw9IENPTkZfVVNCMl9VTklfUjsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgImlsbGVnYWwgdXNiJWQgJWQtd2lyZSB0cmFuc2NlaXZlclxuIiwKLQkJCTIsIG53aXJlcyk7Ci0JfQotCXJldHVybiBzeXNjb24xIDw8IDI0OwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9PTUFQKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKSB8fCBcCi0JKGRlZmluZWQoQ09ORklHX1VTQl9PVEcpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpKQotc3RhdGljIHZvaWQgdXNiX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qIG5vcm1hbGx5IG5vdCBmcmVlZCAqLwotfQotI2VuZGlmCi0KLSNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWRjX3Jlc291cmNlc1tdID0gewotCS8qIG9yZGVyIGlzIHNpZ25pZmljYW50ISAqLwotCXsJCS8qIHJlZ2lzdGVycyAqLwotCQkuc3RhcnQJCT0gSU9fQUREUkVTUyhVRENfQkFTRSksCi0JCS5lbmQJCT0gSU9fQUREUkVTUyhVRENfQkFTRSArIDB4ZmYpLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewkJLyogZ2VuZXJhbCBJUlEgKi8KLQkJLnN0YXJ0CQk9IElIMl9CQVNFICsgMjAsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LCB7CQkvKiBQSU8gSVJRICovCi0JCS5zdGFydAkJPSBJSDJfQkFTRSArIDMwLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwgewkJLyogU09GIElSUSAqLwotCQkuc3RhcnQJCT0gSUgyX0JBU0UgKyAyOSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgdTY0IHVkY19kbWFtYXNrID0gfih1MzIpMDsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWRjX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcF91ZGMiLAotCS5pZAkJPSAtMSwKLQkuZGV2ID0gewotCQkucmVsZWFzZQkJPSB1c2JfcmVsZWFzZSwKLQkJLmRtYV9tYXNrCQk9ICZ1ZGNfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1ZGNfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSB1ZGNfcmVzb3VyY2VzLAotfTsKLQotI2VuZGlmCi0KLSNpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCi0KLS8qIFRoZSBkbWFtYXNrIG11c3QgYmUgc2V0IGZvciBPSENJIHRvIHdvcmsgKi8KLXN0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gfih1MzIpMDsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvaGNpX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gT01BUF9PSENJX0JBU0UsCi0JCS5lbmQJPSBPTUFQX09IQ0lfQkFTRSArIDQwOTYsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JewotCQkuc3RhcnQJPSBJTlRfVVNCX0hIQ18xLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb2hjaV9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJvaGNpIiwKLQkuaWQJCQk9IC0xLAotCS5kZXYgPSB7Ci0JCS5yZWxlYXNlCQk9IHVzYl9yZWxlYXNlLAotCQkuZG1hX21hc2sJCT0gJm9oY2lfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvaGNpX3Jlc291cmNlcyksCi0JLnJlc291cmNlCQk9IG9oY2lfcmVzb3VyY2VzLAotfTsKLQotI2VuZGlmCi0KLSNpZglkZWZpbmVkKENPTkZJR19VU0JfT1RHKSAmJiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVBfT1RHKQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG90Z19yZXNvdXJjZXNbXSA9IHsKLQkvKiBvcmRlciBpcyBzaWduaWZpY2FudCEgKi8KLQl7Ci0JCS5zdGFydAkJPSBJT19BRERSRVNTKE9UR19CQVNFKSwKLQkJLmVuZAkJPSBJT19BRERSRVNTKE9UR19CQVNFICsgMHhmZiksCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS5zdGFydAkJPSBJSDJfQkFTRSArIDgsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb3RnX2RldmljZSA9IHsKLQkubmFtZQkJPSAib21hcF9vdGciLAotCS5pZAkJPSAtMSwKLQkuZGV2ID0gewotCQkucmVsZWFzZQkJPSB1c2JfcmVsZWFzZSwKLQl9LAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvdGdfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBvdGdfcmVzb3VyY2VzLAotfTsKLQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgVUxQRF9DTE9DS19DVFJMX1JFRwlfX1JFRzE2KFVMUERfQ0xPQ0tfQ1RSTCkKLSNkZWZpbmUgVUxQRF9TT0ZUX1JFUV9SRUcJX19SRUcxNihVTFBEX1NPRlRfUkVRKQotCi0KLS8vIEZJWE1FIGNvcnJlY3QgYW5zd2VyIGRlcGVuZHMgb24gaG1jX21vZGUsCi0vLyBhcyBkb2VzIGFueSBub256ZXJvIHZhbHVlIGZvciBjb25maWctPm90ZyBwb3J0IG51bWJlcgotI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX09NQVAKLSNkZWZpbmUJaXNfdXNiMF9kZXZpY2UoY29uZmlnKQkxCi0jZWxzZQotI2RlZmluZQlpc191c2IwX2RldmljZShjb25maWcpCTAKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYJQ09ORklHX0FSQ0hfT01BUF9PVEcKLQotdm9pZCBfX2luaXQKLW9tYXBfb3RnX2luaXQoc3RydWN0IG9tYXBfdXNiX2NvbmZpZyAqY29uZmlnKQotewotCXUzMgkJc3lzY29uID0gT1RHX1NZU0NPTl8xX1JFRyAmIDB4ZmZmZjsKLQlpbnQJCXN0YXR1czsKLQlpbnQJCWFsdF9waW5ncm91cCA9IDA7Ci0KLQkvKiBOT1RFOiAgbm8gYnVzIG9yIGNsb2NrIHNldHVwICh5ZXQ/KSAqLwotCi0Jc3lzY29uID0gT1RHX1NZU0NPTl8xX1JFRyAmIDB4ZmZmZjsKLQlpZiAoIShzeXNjb24gJiBPVEdfUkVTRVRfRE9ORSkpCi0JCXByX2RlYnVnKCJVU0IgcmVzZXRzIG5vdCBjb21wbGV0ZT9cbiIpOwotCi0JLy8gT1RHX0lSUV9FTl9SRUcgPSAwOwotCi0JLyogcGluIG11eGluZyBhbmQgdHJhbnNjZWl2ZXIgcGlub3V0cyAqLwotCWlmIChjb25maWctPnBpbnNbMF0gPiAyKQkvKiBhbHQgcGluZ3JvdXAgMiAqLwotCQlhbHRfcGluZ3JvdXAgPSAxOwotCXN5c2NvbiB8PSBvbWFwX3VzYjBfaW5pdChjb25maWctPnBpbnNbMF0sIGlzX3VzYjBfZGV2aWNlKGNvbmZpZykpOwotCXN5c2NvbiB8PSBvbWFwX3VzYjFfaW5pdChjb25maWctPnBpbnNbMV0pOwotCXN5c2NvbiB8PSBvbWFwX3VzYjJfaW5pdChjb25maWctPnBpbnNbMl0sIGFsdF9waW5ncm91cCk7Ci0JcHJfZGVidWcoIk9UR19TWVNDT05fMV9SRUcgPSAlMDh4XG4iLCBzeXNjb24pOwotCU9UR19TWVNDT05fMV9SRUcgPSBzeXNjb247Ci0KLQlzeXNjb24gPSBjb25maWctPmhtY19tb2RlOwotCXN5c2NvbiB8PSBVU0JYX1NZTkNIUk8gfCAoNCA8PCAxNikgLyogQl9BU0UwX0JSU1QgKi87Ci0jaWZkZWYJQ09ORklHX1VTQl9PVEcKLQlpZiAoY29uZmlnLT5vdGcpCi0JCXN5c2NvbiB8PSBPVEdfRU47Ci0jZW5kaWYKLQlwcl9kZWJ1ZygiVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHID0gJTAzeFxuIiwgVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHKTsKLQlwcl9kZWJ1ZygiT1RHX1NZU0NPTl8yX1JFRyA9ICUwOHhcbiIsIHN5c2Nvbik7Ci0JT1RHX1NZU0NPTl8yX1JFRyA9IHN5c2NvbjsKLQotCXByaW50aygiVVNCOiBobWMgJWQiLCBjb25maWctPmhtY19tb2RlKTsKLQlpZiAoYWx0X3Bpbmdyb3VwKQotCQlwcmludGsoIiwgdXNiMiBhbHQgJWQgd2lyZXMiLCBjb25maWctPnBpbnNbMl0pOwotCWVsc2UgaWYgKGNvbmZpZy0+cGluc1swXSkKLQkJcHJpbnRrKCIsIHVzYjAgJWQgd2lyZXMlcyIsIGNvbmZpZy0+cGluc1swXSwKLQkJCWlzX3VzYjBfZGV2aWNlKGNvbmZpZykgPyAiIChkZXYpIiA6ICIiKTsKLQlpZiAoY29uZmlnLT5waW5zWzFdKQotCQlwcmludGsoIiwgdXNiMSAlZCB3aXJlcyIsIGNvbmZpZy0+cGluc1sxXSk7Ci0JaWYgKCFhbHRfcGluZ3JvdXAgJiYgY29uZmlnLT5waW5zWzJdKQotCQlwcmludGsoIiwgdXNiMiAlZCB3aXJlcyIsIGNvbmZpZy0+cGluc1syXSk7Ci0JaWYgKGNvbmZpZy0+b3RnKQotCQlwcmludGsoIiwgTWluaS1BQiBvbiB1c2IlZCIsIGNvbmZpZy0+b3RnIC0gMSk7Ci0JcHJpbnRrKCJcbiIpOwotCi0JLyogbGVhdmUgVVNCIGNsb2Nrcy9jb250cm9sbGVycyBvZmYgdW50aWwgbmVlZGVkICovCi0JVUxQRF9TT0ZUX1JFUV9SRUcgJj0gflNPRlRfVVNCX0NMS19SRVE7Ci0JVUxQRF9DTE9DS19DVFJMX1JFRyAmPSB+VVNCX01DTEtfRU47Ci0JVUxQRF9DTE9DS19DVFJMX1JFRyB8PSBESVNfVVNCX1BWQ0lfQ0xLOwotCXN5c2NvbiA9IE9UR19TWVNDT05fMV9SRUc7Ci0Jc3lzY29uIHw9IEhTVF9JRExFX0VOfERFVl9JRExFX0VOfE9UR19JRExFX0VOOwotCi0jaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAotCWlmIChjb25maWctPm90ZyB8fCBjb25maWctPnJlZ2lzdGVyX2RldikgewotCQlzeXNjb24gJj0gfkRFVl9JRExFX0VOOwotCQl1ZGNfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gY29uZmlnOwotCQkvKiBGSVhNRSBwYXRjaCBJUlEgbnVtYmVycyBmb3Igb21hcDczMCAqLwotCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnVkY19kZXZpY2UpOwotCQlpZiAoc3RhdHVzKQotCQkJcHJfZGVidWcoImNhbid0IHJlZ2lzdGVyIFVEQyBkZXZpY2UsICVkXG4iLCBzdGF0dXMpOwotCX0KLSNlbmRpZgotCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQotCWlmIChjb25maWctPm90ZyB8fCBjb25maWctPnJlZ2lzdGVyX2hvc3QpIHsKLQkJc3lzY29uICY9IH5IU1RfSURMRV9FTjsKLQkJb2hjaV9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBjb25maWc7Ci0JCWlmIChjcHVfaXNfb21hcDczMCgpKQotCQkJb2hjaV9yZXNvdXJjZXNbMV0uc3RhcnQgPSBJTlRfNzMwX1VTQl9ISENfMTsKLQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvaGNpX2RldmljZSk7Ci0JCWlmIChzdGF0dXMpCi0JCQlwcl9kZWJ1ZygiY2FuJ3QgcmVnaXN0ZXIgT0hDSSBkZXZpY2UsICVkXG4iLCBzdGF0dXMpOwotCX0KLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX1VTQl9PVEcKLQlpZiAoY29uZmlnLT5vdGcpIHsKLQkJc3lzY29uICY9IH5PVEdfSURMRV9FTjsKLQkJb3RnX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGNvbmZpZzsKLQkJaWYgKGNwdV9pc19vbWFwNzMwKCkpCi0JCQlvdGdfcmVzb3VyY2VzWzFdLnN0YXJ0ID0gSU5UXzczMF9VU0JfT1RHOwotCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm90Z19kZXZpY2UpOwotCQlpZiAoc3RhdHVzKQotCQkJcHJfZGVidWcoImNhbid0IHJlZ2lzdGVyIE9URyBkZXZpY2UsICVkXG4iLCBzdGF0dXMpOwotCX0KLSNlbmRpZgotCXByX2RlYnVnKCJPVEdfU1lTQ09OXzFfUkVHID0gJTA4eFxuIiwgc3lzY29uKTsKLQlPVEdfU1lTQ09OXzFfUkVHID0gc3lzY29uOwotCi0Jc3RhdHVzID0gMDsKLX0KLQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX290Z19pbml0KHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZykge30KLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaWZkZWYJQ09ORklHX0FSQ0hfT01BUDE1MTAKLQotI2RlZmluZSBVTFBEX0RQTExfQ1RSTF9SRUcJX19SRUcxNihVTFBEX0RQTExfQ1RSTCkKLSNkZWZpbmUgRFBMTF9JT0IJCSgxIDw8IDEzKQotI2RlZmluZSBEUExMX1BMTF9FTkFCTEUJCSgxIDw8IDQpCi0jZGVmaW5lIERQTExfTE9DSwkJKDEgPDwgMCkKLQotI2RlZmluZSBVTFBEX0FQTExfQ1RSTF9SRUcJX19SRUcxNihVTFBEX0FQTExfQ1RSTCkKLSNkZWZpbmUgQVBMTF9ORFBMTF9TV0lUQ0gJKDEgPDwgMCkKLQotCi1zdGF0aWMgdm9pZCBfX2luaXQgb21hcF8xNTEwX3VzYl9pbml0KHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZykKLXsKLQlpbnQgc3RhdHVzOwotCXVuc2lnbmVkIGludCB2YWw7Ci0KLQlvbWFwX3VzYjBfaW5pdChjb25maWctPnBpbnNbMF0sIGlzX3VzYjBfZGV2aWNlKGNvbmZpZykpOwotCW9tYXBfdXNiMV9pbml0KGNvbmZpZy0+cGluc1sxXSk7Ci0Jb21hcF91c2IyX2luaXQoY29uZmlnLT5waW5zWzJdLCAwKTsKLQotCXZhbCA9IG9tYXBfcmVhZGwoTU9EX0NPTkZfQ1RSTF8wKSAmIH4oMHgzZiA8PCAxKTsKLQl2YWwgfD0gKGNvbmZpZy0+aG1jX21vZGUgPDwgMSk7Ci0Jb21hcF93cml0ZWwodmFsLCBNT0RfQ09ORl9DVFJMXzApOwotCi0JcHJpbnRrKCJVU0I6IGhtYyAlZCIsIGNvbmZpZy0+aG1jX21vZGUpOwotCWlmIChjb25maWctPnBpbnNbMF0pCi0JCXByaW50aygiLCB1c2IwICVkIHdpcmVzJXMiLCBjb25maWctPnBpbnNbMF0sCi0JCQlpc191c2IwX2RldmljZShjb25maWcpID8gIiAoZGV2KSIgOiAiIik7Ci0JaWYgKGNvbmZpZy0+cGluc1sxXSkKLQkJcHJpbnRrKCIsIHVzYjEgJWQgd2lyZXMiLCBjb25maWctPnBpbnNbMV0pOwotCWlmIChjb25maWctPnBpbnNbMl0pCi0JCXByaW50aygiLCB1c2IyICVkIHdpcmVzIiwgY29uZmlnLT5waW5zWzJdKTsKLQlwcmludGsoIlxuIik7Ci0KLQkvKiB1c2UgRFBMTCBmb3IgNDggTUh6IGZ1bmN0aW9uIGNsb2NrICovCi0JcHJfZGVidWcoIkFQTEwgJTA0eCBEUExMICUwNHggUkVRICUwNHhcbiIsIFVMUERfQVBMTF9DVFJMX1JFRywKLQkJCVVMUERfRFBMTF9DVFJMX1JFRywgVUxQRF9TT0ZUX1JFUV9SRUcpOwotCVVMUERfQVBMTF9DVFJMX1JFRyAmPSB+QVBMTF9ORFBMTF9TV0lUQ0g7Ci0JVUxQRF9EUExMX0NUUkxfUkVHIHw9IERQTExfSU9CIHwgRFBMTF9QTExfRU5BQkxFOwotCVVMUERfU09GVF9SRVFfUkVHIHw9IFNPRlRfVURDX1JFUSB8IFNPRlRfRFBMTF9SRVE7Ci0Jd2hpbGUgKCEoVUxQRF9EUExMX0NUUkxfUkVHICYgRFBMTF9MT0NLKSkKLQkJY3B1X3JlbGF4KCk7Ci0KLSNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCi0JaWYgKGNvbmZpZy0+cmVnaXN0ZXJfZGV2KSB7Ci0JCXVkY19kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBjb25maWc7Ci0JCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdWRjX2RldmljZSk7Ci0JCWlmIChzdGF0dXMpCi0JCQlwcl9kZWJ1ZygiY2FuJ3QgcmVnaXN0ZXIgVURDIGRldmljZSwgJWRcbiIsIHN0YXR1cyk7Ci0JCS8qIHVkYyBkcml2ZXIgZ2F0ZXMgNDhNSHogYnkgRCsgcHVsbHVwICovCi0JfQotI2VuZGlmCi0KLSNpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCi0JaWYgKGNvbmZpZy0+cmVnaXN0ZXJfaG9zdCkgewotCQlvaGNpX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGNvbmZpZzsKLQkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvaGNpX2RldmljZSk7Ci0JCWlmIChzdGF0dXMpCi0JCQlwcl9kZWJ1ZygiY2FuJ3QgcmVnaXN0ZXIgT0hDSSBkZXZpY2UsICVkXG4iLCBzdGF0dXMpOwotCQkvKiBoY2QgZXhwbGljaXRseSBnYXRlcyA0OE1IeiAqLwotCX0KLSNlbmRpZgotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIG9tYXBfMTUxMF91c2JfaW5pdChzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpjb25maWcpIHt9Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgcGxhdGZvcm1fZGF0YTsKLQotc3RhdGljIGludCBfX2luaXQKLW9tYXBfdXNiX2luaXQodm9pZCkKLXsKLQljb25zdCBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpjb25maWc7Ci0KLQljb25maWcgPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfVVNCLCBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnKTsKLQlpZiAoY29uZmlnID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVU0I6IE5vIGJvYXJkLXNwZWNpZmljICIKLQkJCQkicGxhdGZvcm0gY29uZmlnIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXBsYXRmb3JtX2RhdGEgPSAqY29uZmlnOwotCi0JaWYgKGNwdV9pc19vbWFwNzMwKCkgfHwgY3B1X2lzX29tYXAxNnh4KCkpCi0JCW9tYXBfb3RnX2luaXQoJnBsYXRmb3JtX2RhdGEpOwotCWVsc2UgaWYgKGNwdV9pc19vbWFwMTV4eCgpKQotCQlvbWFwXzE1MTBfdXNiX2luaXQoJnBsYXRmb3JtX2RhdGEpOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgIlVTQjogTm8gaW5pdCBmb3IgeW91ciBjaGlwIHlldFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3Vic3lzX2luaXRjYWxsKG9tYXBfdXNiX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDhhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL0tjb25maWcKQEAgLTAsMCArMSwxNDQgQEAKK2NvbW1lbnQgIk9NQVAgQ29yZSBUeXBlIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCitjb25maWcgQVJDSF9PTUFQNzMwCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisJYm9vbCAiT01BUDczMCBCYXNlZCBTeXN0ZW0iCisJc2VsZWN0IEFSQ0hfT01BUF9PVEcKKworY29uZmlnIEFSQ0hfT01BUDE1MTAKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKwlkZWZhdWx0IHkKKwlib29sICJPTUFQMTUxMCBCYXNlZCBTeXN0ZW0iCisKK2NvbmZpZyBBUkNIX09NQVAxNlhYCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxCisJYm9vbCAiT01BUDE2eHggQmFzZWQgU3lzdGVtIgorCXNlbGVjdCBBUkNIX09NQVBfT1RHCisKK2NvbW1lbnQgIk9NQVAgQm9hcmQgVHlwZSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKworY29uZmlnIE1BQ0hfT01BUF9JTk5PVkFUT1IKKwlib29sICJUSSBJbm5vdmF0b3IiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIChBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFgpCisJaGVscAorICAgICAgICAgIFRJIE9NQVAgMTUxMCBvciAxNjEwIElubm92YXRvciBib2FyZCBzdXBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdQorICAgICAgICAgIGhhdmUgc3VjaCBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX0gyCisJYm9vbCAiVEkgSDIgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTZYWAorICAgIAloZWxwCisJICBUSSBPTUFQIDE2MTAvMTYxMUIgSDIgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCisJICBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX0gzCisJYm9vbCAiVEkgSDMgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTZYWAorICAgIAloZWxwCisJICBUSSBPTUFQIDE3MTAgSDMgYm9hcmQgc3VwcG9ydC4gU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBzdWNoCisJICBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX09TSworCWJvb2wgIlRJIE9TSyBTdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNlhYCisgICAgCWhlbHAKKwkgIFRJIE9NQVAgNTkxMiBPU0sgKE9NQVAgU3RhcnRlciBLaXQpIGJvYXJkIHN1cHBvcnQuIFNheSBZIGhlcmUKKyAgICAgICAgICBpZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX09NQVBfUEVSU0VVUzIKKwlib29sICJUSSBQZXJzZXVzMiIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQNzMwCisgICAgCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFRJIE9NQVAgNzMwIFBlcnNldXMyIGJvYXJkLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2gKKwkgIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX1ZPSUNFQkxVRQorCWJvb2wgIlZvaWNlYmx1ZSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTUxMAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFZvaWNlYmx1ZSBHU00vVm9JUCBnYXRld2F5LiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlCisJICBzdWNoIGEgYm9hcmQuCisKK2NvbmZpZyBNQUNIX05FVFNUQVIKKwlib29sICJOZXRTdGFyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVAxNTEwCisJaGVscAorCSAgU3VwcG9ydCBmb3IgTmV0U3RhciBQQlguIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgc3VjaCBhIGJvYXJkLgorCitjb25maWcgTUFDSF9PTUFQX0dFTkVSSUMKKwlib29sICJHZW5lcmljIE9NQVAgYm9hcmQiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIChBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFgpCisJaGVscAorICAgICAgICAgIFN1cHBvcnQgZm9yIGdlbmVyaWMgT01BUC0xNTEwLCAxNjEwIG9yIDE3MTAgYm9hcmQgd2l0aAorICAgICAgICAgIG5vIEZQR0EuIENhbiBiZSB1c2VkIGFzIHRlbXBsYXRlIGZvciBwb3J0aW5nIExpbnV4IHRvCisgICAgICAgICAgY3VzdG9tIE9NQVAgYm9hcmRzLiBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgY3VzdG9tCisgICAgICAgICAgYm9hcmQuCisKK2NvbW1lbnQgIk9NQVAgQ1BVIFNwZWVkIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMQorCitjb25maWcgT01BUF9DTE9DS1NfU0VUX0JZX0JPT1RMT0FERVIKKwlib29sICJPTUFQIGNsb2NrcyBzZXQgYnkgYm9vdGxvYWRlciIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEKKwloZWxwCisJICBFbmFibGUgdGhpcyBvcHRpb24gdG8gcHJldmVudCB0aGUga2VybmVsIGZyb20gb3ZlcnJpZGluZyB0aGUgY2xvY2sKKwkgIGZyZXF1ZW5jaWVzIHByb2dyYW1tZWQgYnkgYm9vdGxvYWRlciBmb3IgTVBVLCBEU1AsIE1NVXMsIFRDLAorCSAgaW50ZXJuYWwgTENEIGNvbnRyb2xsZXIgYW5kIE1QVSBwZXJpcGhlcmFscy4KKworY29uZmlnIE9NQVBfQVJNXzIxNk1IWgorCWJvb2wgIk9NQVAgQVJNIDIxNiBNSHogQ1BVICgxNzEwIG9ubHkpIgorICAgICAgICBkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTZYWAorICAgICAgICBoZWxwCisgICAgICAgICAgRW5hYmxlIDIxNiBNSHogY2xvY2sgZm9yIE9NQVAxNzEwIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE5NU1IWgorCWJvb2wgIk9NQVAgQVJNIDE5NSBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVA3MzAKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDE5NU1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV8xOTJNSFoKKwlib29sICJPTUFQIEFSTSAxOTIgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgQVJDSF9PTUFQMTZYWAorCWhlbHAKKyAgICAgICAgICBFbmFibGUgMTkyTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzE4Mk1IWgorCWJvb2wgIk9NQVAgQVJNIDE4MiBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiBBUkNIX09NQVA3MzAKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDE4Mk1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV8xNjhNSFoKKwlib29sICJPTUFQIEFSTSAxNjggTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgKEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzApCisJaGVscAorICAgICAgICAgIEVuYWJsZSAxNjhNSHogY2xvY2sgZm9yIE9NQVAgQ1BVLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgT01BUF9BUk1fMTUwTUhaCisJYm9vbCAiT01BUCBBUk0gMTUwIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIEFSQ0hfT01BUDE1MTAKKwloZWxwCisJICBFbmFibGUgMTUwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE9NQVBfQVJNXzEyME1IWgorCWJvb2wgIk9NQVAgQVJNIDEyMCBNSHogQ1BVIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMSAmJiAoQVJDSF9PTUFQMTUxMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfT01BUDczMCkKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDEyME1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPTUFQX0FSTV82ME1IWgorCWJvb2wgIk9NQVAgQVJNIDYwIE1IeiBDUFUiCisJZGVwZW5kcyBvbiBBUkNIX09NQVAxICYmIChBUkNIX09NQVAxNTEwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9PTUFQNzMwKQorICAgICAgICBkZWZhdWx0IHkKKwloZWxwCisgICAgICAgICAgRW5hYmxlIDYwTUh6IGNsb2NrIGZvciBPTUFQIENQVS4gSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE9NQVBfQVJNXzMwTUhaCisJYm9vbCAiT01BUCBBUk0gMzAgTUh6IENQVSIKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUDEgJiYgKEFSQ0hfT01BUDE1MTAgfHwgQVJDSF9PTUFQMTZYWCB8fCBBUkNIX09NQVA3MzApCisJaGVscAorICAgICAgICAgIEVuYWJsZSAzME1IeiBjbG9jayBmb3IgT01BUCBDUFUuIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODZmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKKyMgQ29tbW9uIHN1cHBvcnQKK29iai15IDo9IGlvLm8gaWQubyBpcnEubyB0aW1lLm8gc2VyaWFsLm8KK2xlZC15IDo9IGxlZHMubworCisjIFNwZWNpZmljIGJvYXJkIHN1cHBvcnQKK29iai0kKENPTkZJR19NQUNIX09NQVBfSDIpCQkrPSBib2FyZC1oMi5vCitvYmotJChDT05GSUdfTUFDSF9PTUFQX0lOTk9WQVRPUikJKz0gYm9hcmQtaW5ub3ZhdG9yLm8KK29iai0kKENPTkZJR19NQUNIX09NQVBfR0VORVJJQykJCSs9IGJvYXJkLWdlbmVyaWMubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9QRVJTRVVTMikJKz0gYm9hcmQtcGVyc2V1czIubworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9PU0spCQkrPSBib2FyZC1vc2subworb2JqLSQoQ09ORklHX01BQ0hfT01BUF9IMykJCSs9IGJvYXJkLWgzLm8KK29iai0kKENPTkZJR19NQUNIX1ZPSUNFQkxVRSkJCSs9IGJvYXJkLXZvaWNlYmx1ZS5vCitvYmotJChDT05GSUdfTUFDSF9ORVRTVEFSKQkJKz0gYm9hcmQtbmV0c3Rhci5vCisKK2lmZXEgKCQoQ09ORklHX0FSQ0hfT01BUDE1MTApLHkpCisjIElubm92YXRvci0xNTEwIEZQR0EKK29iai0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKQkrPSBmcGdhLm8KK2VuZGlmCisKKyMgTEVEcyBzdXBwb3J0CitsZWQtJChDT05GSUdfTUFDSF9PTUFQX0gyKQkJKz0gbGVkcy1oMnAyLWRlYnVnLm8KK2xlZC0kKENPTkZJR19NQUNIX09NQVBfSU5OT1ZBVE9SKQkrPSBsZWRzLWlubm92YXRvci5vCitsZWQtJChDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyKQkrPSBsZWRzLWgycDItZGVidWcubworbGVkLSQoQ09ORklHX01BQ0hfT01BUF9PU0spCQkrPSBsZWRzLW9zay5vCitvYmotJChDT05GSUdfTEVEUykJCQkrPSAkKGxlZC15KQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLW9tYXAxL01ha2VmaWxlLmJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyZDU2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvTWFrZWZpbGUuYm9vdApAQCAtMCwwICsxLDMgQEAKKyAgIHpyZWxhZGRyLXkJCTo9IDB4MTAwMDgwMDAKK3BhcmFtc19waHlzLXkJCTo9IDB4MTAwMDAxMDAKK2luaXRyZF9waHlzLXkJCTo9IDB4MTA4MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyNzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtZ2VuZXJpYy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWdlbmVyaWMuYworICoKKyAqIE1vZGlmaWVkIGZyb20gYm9hcmQtaW5ub3ZhdG9yMTUxMC5jCisgKgorICogQ29kZSBmb3IgZ2VuZXJpYyBPTUFQIGJvYXJkLiBTaG91bGQgd29yayBvbiBtYW55IE9NQVAgc3lzdGVtcyB3aGVyZQorICogdGhlIGRldmljZSBkcml2ZXJzIHRha2UgY2FyZSBvZiBhbGwgdGhlIG5lY2Vzc2FyeSBoYXJkd2FyZSBpbml0aWFsaXphdGlvbi4KKyAqIERvIG5vdCBwdXQgYW55IGJvYXJkIHNwZWNpZmljIGNvZGUgdG8gdGhpcyBmaWxlOyBjcmVhdGUgYSBuZXcgbWFjaGluZQorICogdHlwZSBpZiB5b3UgbmVlZCBjdXN0b20gbG93LWxldmVsIGluaXRpYWxpemF0aW9ucy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgZ2VuZXJpY19zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDEsIDF9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX2luaXRfaXJxKHZvaWQpCit7CisJb21hcF9pbml0X2lycSgpOworfQorCisvKiBhc3N1bWUgbm8gTWluaS1BQiBwb3J0ICovCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgZ2VuZXJpYzE1MTBfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5yZWdpc3Rlcl9ob3N0CT0gMSwKKwkucmVnaXN0ZXJfZGV2CT0gMSwKKwkuaG1jX21vZGUJPSAxNiwKKwkucGluc1swXQk9IDMsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgZ2VuZXJpYzE2MTBfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5yZWdpc3Rlcl9ob3N0CT0gMSwKKwkucmVnaXN0ZXJfZGV2CT0gMSwKKwkuaG1jX21vZGUJPSAxNiwKKwkucGluc1swXQk9IDYsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGdlbmVyaWNfY29uZmlnW10gPSB7CisJeyBPTUFQX1RBR19VU0IsICAgICAgICAgICBOVUxMIH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF9nZW5lcmljX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgc2VyaWFsIHBvcnRzIGFyZSBtdXhlZCBvbiBhdCB0aGlzIHBvaW50LgorCSAqIFlvdSBoYXZlIHRvIG11eCB0aGVtIG9mZiBpbiBkZXZpY2UgZHJpdmVycyBsYXRlciBvbgorCSAqIGlmIG5vdCBuZWVkZWQuCisJICovCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJZ2VuZXJpY19jb25maWdbMF0uZGF0YSA9ICZnZW5lcmljMTUxMF91c2JfY29uZmlnOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkgeworCQlnZW5lcmljX2NvbmZpZ1swXS5kYXRhID0gJmdlbmVyaWMxNjEwX3VzYl9jb25maWc7CisJfQorI2VuZGlmCisJb21hcF9ib2FyZF9jb25maWcgPSBnZW5lcmljX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShnZW5lcmljX2NvbmZpZyk7CisJb21hcF9zZXJpYWxfaW5pdChnZW5lcmljX3NlcmlhbF9wb3J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX2dlbmVyaWNfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfY29tbW9uX2lvKCkKK30KKworTUFDSElORV9TVEFSVChPTUFQX0dFTkVSSUMsICJHZW5lcmljIE9NQVAxNTEwLzE2MTAvMTcxMCIpCisJLyogTWFpbnRhaW5lcjogVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5tYXBfaW8JCT0gb21hcF9nZW5lcmljX21hcF9pbywKKwkuaW5pdF9pcnEJPSBvbWFwX2dlbmVyaWNfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9tYXBfZ2VuZXJpY19pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5ODNlZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYworICoKKyAqIEJvYXJkIHNwZWNpZmljIGluaXRzIGZvciBPTUFQLTE2MTAgSDIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4KKyAqIEF1dGhvcjogR3JlZyBMb25ub24gPGdsb25ub25AcmlkZ2VydW4uY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogU2VwYXJhdGVkIEZQR0EgaW50ZXJydXB0cyBmcm9tIGlubm92YXRvcjE1MTAuYyBhbmQgY2xlYW5lZCB1cCBmb3IgMi42CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24gYnkgVG9ueSBMaW5kcmdlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCisgKiBIMiBzcGVjaWZpYyBjaGFuZ2VzIGFuZCBjbGVhbnVwCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24gYnkgSW1yZSBEZWFrIDxpbXJlLmRlYWtAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgorCitleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaDJfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGgyX3BhcnRpdGlvbnNbXSA9IHsKKwkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkgICAgICAub2Zmc2V0CQk9IDAsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJLyogYm9vdGxvYWRlciBwYXJhbXMgaW4gdGhlIG5leHQgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJwYXJhbXMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwLAorCX0sCisJLyoga2VybmVsICovCisJeworCSAgICAgIC5uYW1lCQk9ICJrZXJuZWwiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzJNLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0sCisJLyogZmlsZSBzeXN0ZW0gKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGgyX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDIsCisJLnBhcnRzCQk9IGgyX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShoMl9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDJfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IE9NQVBfQ1MyQl9QSFlTLAorCS5lbmQJCT0gT01BUF9DUzJCX1BIWVMgKyBPTUFQX0NTMkJfU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaDJfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZoMl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZoMl9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDJfc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUDE2MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBPTUFQMTYxMF9FVEhSX1NUQVJUICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSgwKSwKKwkJLmVuZAk9IE9NQVBfR1BJT19JUlEoMCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoMl9zbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoMl9zbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoMl9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmgyX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZoMl9mbGFzaF9kZXZpY2UsCisJJmgyX3NtYzkxeF9kZXZpY2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaDJfaW5pdF9zbWM5MXgodm9pZCkKK3sKKwlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDApKSA8IDApIHsKKwkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CisJCXJldHVybjsKKwl9CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Cit9CisKK3ZvaWQgaDJfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKKwloMl9pbml0X3NtYzkxeCgpOworfQorCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBoMl91c2JfY29uZmlnIF9faW5pdGRhdGEgPSB7CisJLyogdXNiMSBoYXMgYSBNaW5pLUFCIHBvcnQgYW5kIGV4dGVybmFsIGlzcDEzMDEgdHJhbnNjZWl2ZXIgKi8KKwkub3RnCQk9IDIsCisKKyNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCisJLmhtY19tb2RlCT0gMTksCS8vIDA6aG9zdChvZmYpIDE6ZGV2fG90ZyAyOmRpc2FibGVkCisJLy8gLmhtY19tb2RlCT0gMjEsCS8vIDA6aG9zdChvZmYpIDE6ZGV2KGxvb3BiYWNrKSAyOmhvc3QobG9vcGJhY2spCisjZWxpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisJLyogbmVlZHMgT1RHIGNhYmxlLCBvciBOT05TVEFOREFSRCAoQi10by1NaW5pQikgKi8KKwkuaG1jX21vZGUJPSAyMCwJLy8gMTpkZXZ8b3RnKG9mZikgMTpob3N0IDI6ZGlzYWJsZWQKKyNlbmRpZgorCisJLnBpbnNbMV0JPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX21tY19jb25maWcgaDJfbW1jX2NvbmZpZyBfX2luaXRkYXRhID0geworCS5tbWNfYmxvY2tzCQk9IDEsCisJLm1tYzFfcG93ZXJfcGluCQk9IC0xLAkvKiB0cHM2NTAxMCBncGlvMyAqLworCS5tbWMxX3N3aXRjaF9waW4JPSBPTUFQX01QVUlPKDEpLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDJfY29uZmlnW10gPSB7CisJeyBPTUFQX1RBR19VU0IsICAgICAgICAgICAmaDJfdXNiX2NvbmZpZyB9LAorCXsgT01BUF9UQUdfTU1DLCAgICAgICAgICAgJmgyX21tY19jb25maWcgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoMl9pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXMoaDJfZGV2aWNlcywgQVJSQVlfU0laRShoMl9kZXZpY2VzKSk7CisJb21hcF9ib2FyZF9jb25maWcgPSBoMl9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUoaDJfY29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGgyX21hcF9pbyh2b2lkKQoreworCW9tYXBfbWFwX2NvbW1vbl9pbygpOworCW9tYXBfc2VyaWFsX2luaXQoaDJfc2VyaWFsX3BvcnRzKTsKK30KKworTUFDSElORV9TVEFSVChPTUFQX0gyLCAiVEktSDIiKQorCS8qIE1haW50YWluZXI6IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4gKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDJfbWFwX2lvLAorCS5pbml0X2lycQk9IGgyX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBoMl9pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkNDE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBPTUFQMTcxMCBIMyBzcGVjaWZpYyBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBSaWRnZVJ1biwgSW5jLgorICogQXV0aG9yOiBSaWRnZVJ1biwgSW5jLgorICogICAgICAgICBHcmVnIExvbm5vbiAoZ2xvbm5vbkByaWRnZXJ1bi5jb20pIG9yIGluZm9AcmlkZ2VydW4uY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgorCitleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaDNfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAxfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGgzX3BhcnRpdGlvbnNbXSA9IHsKKwkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkgICAgICAub2Zmc2V0CQk9IDAsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJLyogYm9vdGxvYWRlciBwYXJhbXMgaW4gdGhlIG5leHQgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJwYXJhbXMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwLAorCX0sCisJLyoga2VybmVsICovCisJeworCSAgICAgIC5uYW1lCQk9ICJrZXJuZWwiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzJNLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0sCisJLyogZmlsZSBzeXN0ZW0gKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImZpbGVzeXN0ZW0iLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGgzX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDIsCisJLnBhcnRzCQk9IGgzX3BhcnRpdGlvbnMsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShoM19wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaDNfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IE9NQVBfQ1MyQl9QSFlTLAorCS5lbmQJCT0gT01BUF9DUzJCX1BIWVMgKyBPTUFQX0NTMkJfU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZoM19mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZoM19mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUDE3MTBfRVRIUl9TVEFSVCwJCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBPTUFQMTcxMF9FVEhSX1NUQVJUICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSg0MCksCisJCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDQwKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCisjZGVmaW5lIEdQVElNRVJfQkFTRQkJMHhGRkZCMTQwMAorI2RlZmluZSBHUFRJTUVSX1JFR1MoeCkJKDB4RkZGQjE0MDAgKyAoeCAqIDB4ODAwKSkKKyNkZWZpbmUgR1BUSU1FUl9SRUdTX1NJWkUJMHg0NgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGludGxhdF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCAgPSBHUFRJTUVSX1JFR1MoMCksCSAgICAgIC8qIFBoeXNpY2FsICovCisJCS5lbmQgICAgPSBHUFRJTUVSX1JFR1MoMCkgKyBHUFRJTUVSX1JFR1NfU0laRSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gSU5UXzE2MTBfR1BUSU1FUjEsCisJCS5lbmQgICAgPSBJTlRfMTYxMF9HUFRJTUVSMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbnRsYXRfZGV2aWNlID0geworCS5uYW1lCSAgID0gIm9tYXBfaW50bGF0IiwKKwkuaWQJICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShpbnRsYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBpbnRsYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbXSBfX2luaXRkYXRhID0geworCSZmbGFzaF9kZXZpY2UsCisgICAgICAgICZzbWM5MXhfZGV2aWNlLAorCSZpbnRsYXRfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgaDNfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS8qIHVzYjEgaGFzIGEgTWluaS1BQiBwb3J0IGFuZCBleHRlcm5hbCBpc3AxMzAxIHRyYW5zY2VpdmVyICovCisJLm90ZwkgICAgPSAyLAorCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfT01BUAorCS5obWNfbW9kZSAgICAgICA9IDE5LCAgIC8qIDA6aG9zdChvZmYpIDE6ZGV2fG90ZyAyOmRpc2FibGVkICovCisjZWxpZiAgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorCS8qIE5PTlNUQU5EQVJEIENBQkxFIE5FRURFRCAoQi10by1NaW5pLUIpICovCisJLmhtY19tb2RlICAgICAgID0gMjAsICAgLyogMTpkZXZ8b3RnKG9mZikgMTpob3N0IDI6ZGlzYWJsZWQgKi8KKyNlbmRpZgorCisJLnBpbnNbMV0JPSAzLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgaDNfY29uZmlnW10gPSB7CisJeyBPTUFQX1RBR19VU0IsCSAmaDNfdXNiX2NvbmZpZyB9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGgzX2luaXQodm9pZCkKK3sKKwkodm9pZCkgcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBoM19pbml0X3NtYzkxeCh2b2lkKQoreworCW9tYXBfY2ZnX3JlZyhXMTVfMTcxMF9HUElPNDApOworCWlmIChvbWFwX3JlcXVlc3RfZ3Bpbyg0MCkgPCAwKSB7CisJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDQwIGZvciBzbWM5MXggaXJxXG4iKTsKKwkJcmV0dXJuOworCX0KKwlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCg0MCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7Cit9CisKK3ZvaWQgaDNfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKKwloM19pbml0X3NtYzkxeCgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaDNfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CisJb21hcF9zZXJpYWxfaW5pdChoM19zZXJpYWxfcG9ydHMpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfSDMsICJUSSBPTUFQMTcxMCBIMyBib2FyZCIpCisJLyogTWFpbnRhaW5lcjogVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4gKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDNfbWFwX2lvLAorCS5pbml0X2lycQk9IGgzX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBoM19pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWRlNjBhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYwpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKKyAqCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0cyBmb3IgT01BUC0xNTEwIGFuZCBPTUFQLTE2MTAgSW5ub3ZhdG9yCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIFJpZGdlUnVuLCBJbmMuCisgKiBBdXRob3I6IEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFNlcGFyYXRlZCBGUEdBIGludGVycnVwdHMgZnJvbSBpbm5vdmF0b3IxNTEwLmMgYW5kIGNsZWFuZWQgdXAgZm9yIDIuNgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uIGJ5IFRvbnkgTGluZHJnZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZnBnYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW5ub3ZhdG9yX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBpbm5vdmF0b3JfcGFydGl0aW9uc1tdID0geworCS8qIGJvb3Rsb2FkZXIgKFUtQm9vdCwgZXRjKSBpbiBmaXJzdCBzZWN0b3IgKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImJvb3Rsb2FkZXIiLAorCSAgICAgIC5vZmZzZXQJCT0gMCwKKwkgICAgICAuc2l6ZQkJPSBTWl8xMjhLLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwgLyogZm9yY2UgcmVhZC1vbmx5ICovCisJfSwKKwkvKiBib290bG9hZGVyIHBhcmFtcyBpbiB0aGUgbmV4dCBzZWN0b3IgKi8KKwl7CisJICAgICAgLm5hbWUJCT0gInBhcmFtcyIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IDAsCisJfSwKKwkvKiBrZXJuZWwgKi8KKwl7CisJICAgICAgLm5hbWUJCT0gImtlcm5lbCIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gU1pfMk0sCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfSwKKwkvKiByZXN0IG9mIGZsYXNoMSBpcyBhIGZpbGUgc3lzdGVtICovCisJeworCSAgICAgIC5uYW1lCQk9ICJyb290ZnMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzE2TSAtIFNaXzJNIC0gMiAqIFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfSwKKwkvKiBmaWxlIHN5c3RlbSAqLworCXsKKwkgICAgICAubmFtZQkJPSAiZmlsZXN5c3RlbSIsCisJICAgICAgLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsCisJICAgICAgLnNpemUJCT0gTVREUEFSVF9TSVpfRlVMTCwKKwkgICAgICAubWFza19mbGFncwk9IDAKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgaW5ub3ZhdG9yX2ZsYXNoX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCQk9IDIsCisJLnBhcnRzCQk9IGlubm92YXRvcl9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoaW5ub3ZhdG9yX3BhcnRpdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbm5vdmF0b3JfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IE9NQVBfQ1MwX1BIWVMsCisJLmVuZAkJPSBPTUFQX0NTMF9QSFlTICsgU1pfMzJNIC0gMSwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbm5vdmF0b3JfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZpbm5vdmF0b3JfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmaW5ub3ZhdG9yX2ZsYXNoX3Jlc291cmNlLAorfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisKKy8qIE9ubHkgRlBHQSBuZWVkcyB0byBiZSBtYXBwZWQgaGVyZS4gQWxsIG90aGVycyBhcmUgZG9uZSB3aXRoIGlvcmVtYXAgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgaW5ub3ZhdG9yMTUxMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKK3sgT01BUDE1MTBfRlBHQV9CQVNFLCBPTUFQMTUxMF9GUEdBX1NUQVJULCBPTUFQMTUxMF9GUEdBX1NJWkUsCisJTVRfREVWSUNFIH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlubm92YXRvcjE1MTBfc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUDE1MTBfRlBHQV9FVEhSX1NUQVJULAkvKiBQaHlzaWNhbCAqLworCQkuZW5kCT0gT01BUDE1MTBfRlBHQV9FVEhSX1NUQVJUICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUDE1MTBfSU5UX0VUSEVSLAorCQkuZW5kCT0gT01BUDE1MTBfSU5UX0VUSEVSLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaW5ub3ZhdG9yMTUxMF9zbWM5MXhfZGV2aWNlID0geworCS5uYW1lCQk9ICJzbWM5MXgiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShpbm5vdmF0b3IxNTEwX3NtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGlubm92YXRvcjE1MTBfc21jOTF4X3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbm5vdmF0b3IxNTEwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZpbm5vdmF0b3JfZmxhc2hfZGV2aWNlLAorCSZpbm5vdmF0b3IxNTEwX3NtYzkxeF9kZXZpY2UsCit9OworCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDE1MTAgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaW5ub3ZhdG9yMTYxMF9zbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBJTk5PVkFUT1IxNjEwX0VUSFJfU1RBUlQsCQkvKiBQaHlzaWNhbCAqLworCQkuZW5kCT0gSU5OT1ZBVE9SMTYxMF9FVEhSX1NUQVJUICsgMHhmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSgwKSwKKwkJLmVuZAk9IE9NQVBfR1BJT19JUlEoMCksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpbm5vdmF0b3IxNjEwX3NtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGlubm92YXRvcjE2MTBfc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gaW5ub3ZhdG9yMTYxMF9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlubm92YXRvcjE2MTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmlubm92YXRvcl9mbGFzaF9kZXZpY2UsCisJJmlubm92YXRvcjE2MTBfc21jOTF4X2RldmljZSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQMTZYWCAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5ub3ZhdG9yX2luaXRfc21jOTF4KHZvaWQpCit7CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWZwZ2Ffd3JpdGUoZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUlNUKSAmIH4xLAorCQkJICAgT01BUDE1MTBfRlBHQV9SU1QpOworCQl1ZGVsYXkoNzUwKTsKKwl9IGVsc2UgeworCQlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDApKSA8IDApIHsKKwkJCXByaW50aygiRXJyb3IgcmVxdWVzdGluZyBncGlvIDAgZm9yIHNtYzkxeCBpcnFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDAsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisJfQorfQorCit2b2lkIGlubm92YXRvcl9pbml0X2lycSh2b2lkKQoreworCW9tYXBfaW5pdF9pcnEoKTsKKwlvbWFwX2dwaW9faW5pdCgpOworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW9tYXAxNTEwX2ZwZ2FfaW5pdF9pcnEoKTsKKwl9CisjZW5kaWYKKwlpbm5vdmF0b3JfaW5pdF9zbWM5MXgoKTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBpbm5vdmF0b3IxNTEwX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkvKiBmb3IgYnVuZGxlZCBub24tc3RhbmRhcmQgaG9zdCBhbmQgcGVyaXBoZXJhbCBjYWJsZXMgKi8KKwkuaG1jX21vZGUJPSA0LAorCisJLnJlZ2lzdGVyX2hvc3QJPSAxLAorCS5waW5zWzFdCT0gNiwKKwkucGluc1syXQk9IDYsCQkvKiBDb25mbGljdHMgd2l0aCBVQVJUMiAqLworCisJLnJlZ2lzdGVyX2Rldgk9IDEsCisJLnBpbnNbMF0JPSAyLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIGgyX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkvKiB1c2IxIGhhcyBhIE1pbmktQUIgcG9ydCBhbmQgZXh0ZXJuYWwgaXNwMTMwMSB0cmFuc2NlaXZlciAqLworCS5vdGcJCT0gMiwKKworI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX09NQVAKKwkuaG1jX21vZGUJPSAxOSwJLy8gMDpob3N0KG9mZikgMTpkZXZ8b3RnIDI6ZGlzYWJsZWQKKwkvLyAuaG1jX21vZGUJPSAyMSwJLy8gMDpob3N0KG9mZikgMTpkZXYobG9vcGJhY2spIDI6aG9zdChsb29wYmFjaykKKyNlbGlmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKwkvKiBOT05TVEFOREFSRCBDQUJMRSBORUVERUQgKEItdG8tTWluaS1CKSAqLworCS5obWNfbW9kZQk9IDIwLAkvLyAxOmRldnxvdGcob2ZmKSAxOmhvc3QgMjpkaXNhYmxlZAorI2VuZGlmCisKKwkucGluc1sxXQk9IDMsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIGlubm92YXRvcl9jb25maWdbXSA9IHsKKwl7IE9NQVBfVEFHX1VTQiwgICAgICAgICBOVUxMIH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgaW5ub3ZhdG9yX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhpbm5vdmF0b3IxNTEwX2RldmljZXMsIEFSUkFZX1NJWkUoaW5ub3ZhdG9yMTUxMF9kZXZpY2VzKSk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKKwlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGlubm92YXRvcjE2MTBfZGV2aWNlcywgQVJSQVlfU0laRShpbm5vdmF0b3IxNjEwX2RldmljZXMpKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQlpbm5vdmF0b3JfY29uZmlnWzBdLmRhdGEgPSAmaW5ub3ZhdG9yMTUxMF91c2JfY29uZmlnOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKKwlpZiAoY3B1X2lzX29tYXAxNjEwKCkpCisJCWlubm92YXRvcl9jb25maWdbMF0uZGF0YSA9ICZoMl91c2JfY29uZmlnOworI2VuZGlmCisJb21hcF9ib2FyZF9jb25maWcgPSBpbm5vdmF0b3JfY29uZmlnOworCW9tYXBfYm9hcmRfY29uZmlnX3NpemUgPSBBUlJBWV9TSVpFKGlubm92YXRvcl9jb25maWcpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgaW5ub3ZhdG9yX21hcF9pbyh2b2lkKQoreworCW9tYXBfbWFwX2NvbW1vbl9pbygpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJaW90YWJsZV9pbml0KGlubm92YXRvcjE1MTBfaW9fZGVzYywgQVJSQVlfU0laRShpbm5vdmF0b3IxNTEwX2lvX2Rlc2MpKTsKKwkJdWRlbGF5KDEwKTsJLyogRGVsYXkgbmVlZGVkIGZvciBGUEdBICovCisKKwkJLyogRHVtcCB0aGUgSW5ub3ZhdG9yIEZQR0EgcmV2IGVhcmx5IC0gdXNlZnVsIGluZm8gZm9yIHN1cHBvcnQuICovCisJCXByaW50aygiSW5ub3ZhdG9yIEZQR0EgUmV2ICVkLiVkIEJvYXJkIFJldiAlZFxuIiwKKwkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1JFVl9ISUdIKSwKKwkJICAgICAgIGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1JFVl9MT1cpLAorCQkgICAgICAgZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfQk9BUkRfUkVWKSk7CisJfQorI2VuZGlmCisJb21hcF9zZXJpYWxfaW5pdChpbm5vdmF0b3Jfc2VyaWFsX3BvcnRzKTsKK30KKworTUFDSElORV9TVEFSVChPTUFQX0lOTk9WQVRPUiwgIlRJLUlubm92YXRvciIpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAqLworCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCisJLnBoeXNfaW8JPSAweGZmZjAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmZWYwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLm1hcF9pbwkJPSBpbm5vdmF0b3JfbWFwX2lvLAorCS5pbml0X2lycQk9IGlubm92YXRvcl9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gaW5ub3ZhdG9yX2luaXQsCisJLnRpbWVyCQk9ICZvbWFwX3RpbWVyLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbmV0c3Rhci5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1uZXRzdGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1MGIyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbmV0c3Rhci5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogTW9kaWZpZWQgZnJvbSBib2FyZC1nZW5lcmljLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgMk4gVGVsZWtvbXVuaWthY2UsIExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4KKyAqCisgKiBDb2RlIGZvciBOZXRzdGFyIE9NQVAgYm9hcmQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NvbW1vbi5oPgorCitleHRlcm4gdm9pZCBfX2luaXQgb21hcF9pbml0X3RpbWUodm9pZCk7CitleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG5ldHN0YXJfc21jOTF4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9DUzFfUEhZUyArIDB4MzAwLAorCQkuZW5kCT0gT01BUF9DUzFfUEhZUyArIDB4MzAwICsgMTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBPTUFQX0dQSU9fSVJRKDgpLAorCQkuZW5kCT0gT01BUF9HUElPX0lSUSg4KSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG5ldHN0YXJfc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobmV0c3Rhcl9zbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBuZXRzdGFyX3NtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbmV0c3Rhcl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbmV0c3Rhcl9zbWM5MXhfZGV2aWNlLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG5ldHN0YXJfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IG5ldHN0YXJfaW5pdCh2b2lkKQoreworCS8qIGdyZWVuIExFRCAqLworCW9tYXBfcmVxdWVzdF9ncGlvKDQpOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDQsIDApOworCS8qIHNtYzkxeCByZXNldCAqLworCW9tYXBfcmVxdWVzdF9ncGlvKDcpOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDcsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg3LCAxKTsKKwl1ZGVsYXkoMik7CS8qIHdhaXQgYXQgbGVhc3QgMTAwbnMgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNywgMCk7CisJbWRlbGF5KDUwKTsJLyogNTBtcyB1bnRpbCBQSFkgcmVhZHkgKi8KKwkvKiBzbWM5MXggaW50ZXJydXB0IHBpbiAqLworCW9tYXBfcmVxdWVzdF9ncGlvKDgpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDgsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisKKwlvbWFwX3JlcXVlc3RfZ3BpbygxMik7CisJb21hcF9yZXF1ZXN0X2dwaW8oMTMpOworCW9tYXBfcmVxdWVzdF9ncGlvKDE0KTsKKwlvbWFwX3JlcXVlc3RfZ3BpbygxNSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTIsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEzLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKKwlvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCgxNCwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMTUsIE9NQVBfR1BJT19GQUxMSU5HX0VER0UpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMobmV0c3Rhcl9kZXZpY2VzLCBBUlJBWV9TSVpFKG5ldHN0YXJfZGV2aWNlcykpOworCisJLyogU3dpdGNoIG9uIGdyZWVuIExFRCAqLworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg0LCAwKTsKKwkvKiBTd2l0Y2ggb2ZmIHJlZCBMRUQgKi8KKwlvbWFwX3dyaXRlYigweDAwLCBPTUFQX0xQRzFfUE1SKTsJLyogRGlzYWJsZSBjbG9jayAqLworCW9tYXBfd3JpdGViKDB4ODAsIE9NQVBfTFBHMV9MQ1IpOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgb21hcF9zZXJpYWxfcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdID0gezEsIDEsIDF9OworCitzdGF0aWMgdm9pZCBfX2luaXQgbmV0c3Rhcl9tYXBfaW8odm9pZCkKK3sKKwlvbWFwX21hcF9jb21tb25faW8oKTsKKwlvbWFwX3NlcmlhbF9pbml0KG9tYXBfc2VyaWFsX3BvcnRzKTsKK30KKworI2RlZmluZSBNQUNISU5FX1BBTklDRUQJCTEKKyNkZWZpbmUgTUFDSElORV9SRUJPT1RJTkcJMgorI2RlZmluZSBNQUNISU5FX1JFQk9PVAkJNAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFjaGluZV9zdGF0ZTsKKworc3RhdGljIGludCBwYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJIHZvaWQgKnB0cikKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChNQUNISU5FX1BBTklDRUQsICZtYWNoaW5lX3N0YXRlKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyogU3dpdGNoIG9mZiBncmVlbiBMRUQgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNCwgMSk7CisJLyogRmxhc2ggcmVkIExFRCAqLworCW9tYXBfd3JpdGViKDB4NzgsIE9NQVBfTFBHMV9MQ1IpOworCW9tYXBfd3JpdGViKDB4MDEsIE9NQVBfTFBHMV9QTVIpOwkvKiBFbmFibGUgY2xvY2sgKi8KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwYW5pY19ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbAk9IHBhbmljX2V2ZW50LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmV0c3Rhcl9sYXRlX2luaXQodm9pZCkKK3sKKwkvKiBUT0RPOiBTZXR1cCBmcm9udCBwYW5lbCBzd2l0Y2ggaGVyZSAqLworCisJLyogU2V0dXAgcGFuaWMgbm90aWZpZXIgKi8KKwlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChuZXRzdGFyX2xhdGVfaW5pdCk7CisKK01BQ0hJTkVfU1RBUlQoTkVUU1RBUiwgIk5ldFN0YXIgT01BUDU5MTAiKQorCS8qIE1haW50YWluZXI6IExhZGlzbGF2IE1pY2hsIDxtaWNobEAybi5jej4gKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5tYXBfaW8JCT0gbmV0c3Rhcl9tYXBfaW8sCisJLmluaXRfaXJxCT0gbmV0c3Rhcl9pbml0X2lycSwKKwkuaW5pdF9tYWNoaW5lCT0gbmV0c3Rhcl9pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ0ZTUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1vc2suYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtb3NrLmMKKyAqCisgKiBCb2FyZCBzcGVjaWZpYyBpbml0IGZvciBPTUFQNTkxMiBPU0sKKyAqCisgKiBXcml0dGVuIGJ5IERpcmsgQmVobWUgPGRpcmsuYmVobWVAZGUuYm9zY2guY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTgorICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY29tbW9uLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb3NrNTkxMl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKK3sgT01BUF9PU0tfTk9SX0ZMQVNIX0JBU0UsIE9NQVBfT1NLX05PUl9GTEFTSF9TVEFSVCwgT01BUF9PU0tfTk9SX0ZMQVNIX1NJWkUsCisJTVRfREVWSUNFIH0sCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgb3NrX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMCwgMH07CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb3NrNTkxMl9zbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBPTUFQX09TS19FVEhSX1NUQVJULAkJLyogUGh5c2ljYWwgKi8KKwkJLmVuZAk9IE9NQVBfT1NLX0VUSFJfU1RBUlQgKyAweGYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBPTUFQX0dQSU9fSVJRKDApLAorCQkuZW5kCT0gT01BUF9HUElPX0lSUSgwKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfc21jOTF4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic21jOTF4IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG9zazU5MTJfc21jOTF4X3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gb3NrNTkxMl9zbWM5MXhfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvc2s1OTEyX2NmX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gT01BUF9HUElPX0lSUSg2MiksCisJCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDYyKSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9zazU5MTJfY2ZfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwX2NmIiwKKwkuaWQJCT0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAodm9pZCAqKSAyIC8qIENTMiAqLywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShvc2s1OTEyX2NmX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gb3NrNTkxMl9jZl9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb3NrNTkxMl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmb3NrNTkxMl9zbWM5MXhfZGV2aWNlLAorCSZvc2s1OTEyX2NmX2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvc2tfaW5pdF9zbWM5MXgodm9pZCkKK3sKKwlpZiAoKG9tYXBfcmVxdWVzdF9ncGlvKDApKSA8IDApIHsKKwkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gMCBmb3Igc21jOTF4IGlycVxuIik7CisJCXJldHVybjsKKwl9CisJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoMCwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKworCS8qIENoZWNrIEVNSUZTIHdhaXQgc3RhdGVzIHRvIGZpeCBlcnJvcnMgd2l0aCBTTUNfR0VUX1BLVF9IRFIgKi8KKwlFTUlGU19DQ1MoMSkgfD0gMHgyOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgb3NrX2luaXRfY2Yodm9pZCkKK3sKKwlvbWFwX2NmZ19yZWcoTTdfMTYxMF9HUElPNjIpOworCWlmICgob21hcF9yZXF1ZXN0X2dwaW8oNjIpKSA8IDApIHsKKwkJcHJpbnRrKCJFcnJvciByZXF1ZXN0aW5nIGdwaW8gNjIgZm9yIENGIGlycVxuIik7CisJCXJldHVybjsKKwl9CisJLyogaXQncyByZWFsbHkgYWN0aXZlLWxvdyAqLworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDYyLCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKK30KKwordm9pZCBvc2tfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKKwlvc2tfaW5pdF9zbWM5MXgoKTsKKwlvc2tfaW5pdF9jZigpOworfQorCitzdGF0aWMgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyBvc2tfdXNiX2NvbmZpZyBfX2luaXRkYXRhID0geworCS8qIGhhcyB1c2IgaG9zdCBjb25uZWN0b3IgKEEpIC4uLiBmb3IgZGV2ZWxvcG1lbnQgaXQgY2FuIGFsc28KKwkgKiBiZSB1c2VkLCB3aXRoIGEgTk9OU1RBTkRBUkQgZ2VuZGVyLWJlbmRpbmcgY2FibGUvZG9uZ2xlLCBhcworCSAqIGEgcGVyaXBoZXJhbC4KKwkgKi8KKyNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCisJLnJlZ2lzdGVyX2Rldgk9IDEsCisJLmhtY19tb2RlCT0gMCwKKyNlbHNlCisJLnJlZ2lzdGVyX2hvc3QJPSAxLAorCS5obWNfbW9kZQk9IDE2LAorCS5yd2MJCT0gMSwKKyNlbmRpZgorCS5waW5zWzBdCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsIG9za19jb25maWdbXSA9IHsKKwl7IE9NQVBfVEFHX1VTQiwgICAgICAgICAgICZvc2tfdXNiX2NvbmZpZyB9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9za19pbml0KHZvaWQpCit7CisJcGxhdGZvcm1fYWRkX2RldmljZXMob3NrNTkxMl9kZXZpY2VzLCBBUlJBWV9TSVpFKG9zazU5MTJfZGV2aWNlcykpOworCW9tYXBfYm9hcmRfY29uZmlnID0gb3NrX2NvbmZpZzsKKwlvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gQVJSQVlfU0laRShvc2tfY29uZmlnKTsKKwlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgfD0gKDMgPDwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvc2tfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CisJaW90YWJsZV9pbml0KG9zazU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvc2s1OTEyX2lvX2Rlc2MpKTsKKwlvbWFwX3NlcmlhbF9pbml0KG9za19zZXJpYWxfcG9ydHMpOworfQorCitNQUNISU5FX1NUQVJUKE9NQVBfT1NLLCAiVEktT1NLIikKKwkvKiBNYWludGFpbmVyOiBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4gKi8KKwkucGh5c19yYW0JPSAweDEwMDAwMDAwLAorCS5waHlzX2lvCT0gMHhmZmYwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZmVmMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweDEwMDAwMTAwLAorCS5tYXBfaW8JCT0gb3NrX21hcF9pbywKKwkuaW5pdF9pcnEJPSBvc2tfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9za19pbml0LAorCS50aW1lcgkJPSAmb21hcF90aW1lciwKK01BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXBlcnNldXMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMzE3MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtcGVyc2V1czIuYworICoKKyAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCisgKgorICogT3JpZ2luYWwgT01BUDczMCBzdXBwb3J0IGJ5IEplYW4gUGloZXQgPGotcGloZXRAdGkuY29tPgorICogVXBkYXRlZCBmb3IgMi42IGJ5IEtldmluIEhpbG1hbiA8a2poQGhpbG1hbi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZwZ2EuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBIMlAyX0RCR19GUEdBX0VUSFJfU1RBUlQsCS8qIFBoeXNpY2FsICovCisJCS5lbmQJPSBIMlAyX0RCR19GUEdBX0VUSFJfU1RBUlQgKyAweGYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJTlRfNzMwX01QVV9FWFRfTklSUSwKKwkJLmVuZAk9IDAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgcDJfc2VyaWFsX3BvcnRzW09NQVBfTUFYX05SX1BPUlRTXSA9IHsxLCAxLCAwfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHAyX3BhcnRpdGlvbnNbXSA9IHsKKwkvKiBib290bG9hZGVyIChVLUJvb3QsIGV0YykgaW4gZmlyc3Qgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJib290bG9hZGVyIiwKKwkgICAgICAub2Zmc2V0CQk9IDAsCisJICAgICAgLnNpemUJCT0gU1pfMTI4SywKKwkgICAgICAubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0sCisJLyogYm9vdGxvYWRlciBwYXJhbXMgaW4gdGhlIG5leHQgc2VjdG9yICovCisJeworCSAgICAgIC5uYW1lCQk9ICJwYXJhbXMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzEyOEssCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwLAorCX0sCisJLyoga2VybmVsICovCisJeworCSAgICAgIC5uYW1lCQk9ICJrZXJuZWwiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IFNaXzJNLAorCSAgICAgIC5tYXNrX2ZsYWdzCT0gMAorCX0sCisJLyogcmVzdCBvZiBmbGFzaCBpcyBhIGZpbGUgc3lzdGVtICovCisJeworCSAgICAgIC5uYW1lCQk9ICJyb290ZnMiLAorCSAgICAgIC5vZmZzZXQJCT0gTVREUEFSVF9PRlNfQVBQRU5ELAorCSAgICAgIC5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCisJICAgICAgLm1hc2tfZmxhZ3MJPSAwCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSBwMl9mbGFzaF9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAkJPSAyLAorCS5wYXJ0cwkJPSBwMl9wYXJ0aXRpb25zLAorCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUocDJfcGFydGl0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHAyX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSBPTUFQX0ZMQVNIXzBfU1RBUlQsCisJLmVuZAkJPSBPTUFQX0ZMQVNIXzBfU1RBUlQgKyBPTUFQX0ZMQVNIXzBfU0laRSAtIDEsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcDJfZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJvbWFwZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZwMl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZwMl9mbGFzaF9yZXNvdXJjZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnAyX2ZsYXNoX2RldmljZSwKKwkmc21jOTF4X2RldmljZSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3BlcnNldXMyX2luaXQodm9pZCkKK3sKKwkodm9pZCkgcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwZXJzZXVzMl9pbml0X3NtYzkxeCh2b2lkKQoreworCWZwZ2Ffd3JpdGUoMSwgSDJQMl9EQkdfRlBHQV9MQU5fUkVTRVQpOworCW1kZWxheSg1MCk7CisJZnBnYV93cml0ZShmcGdhX3JlYWQoSDJQMl9EQkdfRlBHQV9MQU5fUkVTRVQpICYgfjEsCisJCSAgIEgyUDJfREJHX0ZQR0FfTEFOX1JFU0VUKTsKKwltZGVsYXkoNTApOworfQorCit2b2lkIG9tYXBfcGVyc2V1czJfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKKwlwZXJzZXVzMl9pbml0X3NtYzkxeCgpOworfQorCisvKiBPbmx5IEZQR0EgbmVlZHMgdG8gYmUgbWFwcGVkIGhlcmUuIEFsbCBvdGhlcnMgYXJlIGRvbmUgd2l0aCBpb3JlbWFwICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfcGVyc2V1czJfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJe0gyUDJfREJHX0ZQR0FfQkFTRSwgSDJQMl9EQkdfRlBHQV9TVEFSVCwgSDJQMl9EQkdfRlBHQV9TSVpFLAorCSBNVF9ERVZJQ0V9LAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfcGVyc2V1czJfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CisJaW90YWJsZV9pbml0KG9tYXBfcGVyc2V1czJfaW9fZGVzYywKKwkJICAgICBBUlJBWV9TSVpFKG9tYXBfcGVyc2V1czJfaW9fZGVzYykpOworCisJLyogRWFybHksIGJvYXJkLWRlcGVuZGVudCBpbml0ICovCisKKwkvKgorCSAqIEhvbGQgR1NNIFJlc2V0IHVudGlsIG5lZWRlZAorCSAqLworCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUDczMF9EU1BfTV9DVEwpICYgfjEsIE9NQVA3MzBfRFNQX01fQ1RMKTsKKworCS8qCisJICogVUFSVHMgLT4gZG9uZSBhdXRvbWFnaWNhbGx5IGJ5IDgyNTAgZHJpdmVyCisJICovCisKKwkvKgorCSAqIENTeCB0aW1pbmdzLCBHUElPIE11eCAuLi4gc2V0dXAKKwkgKi8KKworCS8qIEZsYXNoOiBDUzAgdGltaW5ncyBzZXR1cCAqLworCW9tYXBfd3JpdGVsKDB4MDAwMGZmZjMsIE9NQVA3MzBfRkxBU0hfQ0ZHXzApOworCW9tYXBfd3JpdGVsKDB4MDAwMDAwODgsIE9NQVA3MzBfRkxBU0hfQUNGR18wKTsKKworCS8qCisJICogRXRoZXJuZXQgc3VwcG9ydCB0cm91Z2ggdGhlIGRlYnVnIGJvYXJkCisJICogQ1MxIHRpbWluZ3Mgc2V0dXAKKwkgKi8KKwlvbWFwX3dyaXRlbCgweDAwMDBmZmYzLCBPTUFQNzMwX0ZMQVNIX0NGR18xKTsKKwlvbWFwX3dyaXRlbCgweDAwMDAwMDAwLCBPTUFQNzMwX0ZMQVNIX0FDRkdfMSk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSBNUFVfRVhUX05JUlEgSU8gaW4gSU9fQ09ORjkgcmVnaXN0ZXIsCisJICogSXQgaXMgdXNlZCBhcyB0aGUgRXRoZXJuZXQgY29udHJvbGxlciBpbnRlcnJ1cHQKKwkgKi8KKwlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKE9NQVA3MzBfSU9fQ09ORl85KSAmIDB4MUZGRkZGRkYsIE9NQVA3MzBfSU9fQ09ORl85KTsKKwlvbWFwX3NlcmlhbF9pbml0KHAyX3NlcmlhbF9wb3J0cyk7Cit9CisKK01BQ0hJTkVfU1RBUlQoT01BUF9QRVJTRVVTMiwgIk9NQVA3MzAgUGVyc2V1czIiKQorCS8qIE1haW50YWluZXI6IEtldmluIEhpbG1hbiA8a2poQGhpbG1hbi5vcmc+ICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkubWFwX2lvCQk9IG9tYXBfcGVyc2V1czJfbWFwX2lvLAorCS5pbml0X2lycQk9IG9tYXBfcGVyc2V1czJfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IG9tYXBfcGVyc2V1czJfaW5pdCwKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtdm9pY2VibHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyMjgxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLXZvaWNlYmx1ZS5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC12b2ljZWJsdWUuYworICoKKyAqIE1vZGlmaWVkIGZyb20gYm9hcmQtZ2VuZXJpYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IDJOIFRlbGVrb211bmlrYWNlLCBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+CisgKgorICogQ29kZSBmb3IgT01BUDU5MTAgYmFzZWQgVm9pY2VCbHVlIGJvYXJkIChWb0lQIHRvIEdTTSBnYXRld2F5KS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC91c2IuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9jb21tb24uaD4KKworZXh0ZXJuIHZvaWQgb21hcF9pbml0X3RpbWUodm9pZCk7CitleHRlcm4gaW50IG9tYXBfZ3Bpb19pbml0KHZvaWQpOworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IHZvaWNlYmx1ZV9wb3J0c1tdID0geworCXsKKwkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZykoT01BUF9DUzFfUEhZUyArIDB4NDAwMDApLAorCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTIpLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMSwKKwkJLnVhcnRjbGsJPSAzNjg2NDAwLAorCX0sCisJeworCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKShPTUFQX0NTMV9QSFlTICsgMHg1MDAwMCksCisJCS5pcnEJCT0gT01BUF9HUElPX0lSUSgxMyksCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkucmVnc2hpZnQJPSAxLAorCQkudWFydGNsawk9IDM2ODY0MDAsCisJfSwKKwl7CisJCS5tYXBiYXNlCT0gKHVuc2lnbmVkIGxvbmcpKE9NQVBfQ1MxX1BIWVMgKyAweDYwMDAwKSwKKwkJLmlycQkJPSBPTUFQX0dQSU9fSVJRKDE0KSwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5yZWdzaGlmdAk9IDEsCisJCS51YXJ0Y2xrCT0gMzY4NjQwMCwKKwl9LAorCXsKKwkJLm1hcGJhc2UJPSAodW5zaWduZWQgbG9uZykoT01BUF9DUzFfUEhZUyArIDB4NzAwMDApLAorCQkuaXJxCQk9IE9NQVBfR1BJT19JUlEoMTUpLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfSU9SRU1BUCwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMSwKKwkJLnVhcnRjbGsJPSAzNjg2NDAwLAorCX0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2VyaWFsX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gMSwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gdm9pY2VibHVlX3BvcnRzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBleHRfdWFydF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7Cit9CithcmNoX2luaXRjYWxsKGV4dF91YXJ0X2luaXQpOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBPTUFQX0NTMl9QSFlTICsgMHgzMDAsCisJCS5lbmQJPSBPTUFQX0NTMl9QSFlTICsgMHgzMDAgKyAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IE9NQVBfR1BJT19JUlEoOCksCisJCS5lbmQJPSBPTUFQX0dQSU9fSVJRKDgpLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdm9pY2VibHVlX3NtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHZvaWNlYmx1ZV9zbWM5MXhfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB2b2ljZWJsdWVfc21jOTF4X3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp2b2ljZWJsdWVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnZvaWNlYmx1ZV9zbWM5MXhfZGV2aWNlLAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX3VzYl9jb25maWcgdm9pY2VibHVlX3VzYl9jb25maWcgX19pbml0ZGF0YSA9IHsKKwkuaG1jX21vZGUJPSAzLAorCS5yZWdpc3Rlcl9ob3N0CT0gMSwKKwkucmVnaXN0ZXJfZGV2ICAgPSAxLAorCS5waW5zWzBdCT0gMiwKKwkucGluc1sxXQk9IDYsCisJLnBpbnNbMl0JPSA2LAorfTsKKworc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19rZXJuZWwgdm9pY2VibHVlX2NvbmZpZ1tdID0geworCXsgT01BUF9UQUdfVVNCLCAmdm9pY2VibHVlX3VzYl9jb25maWcgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfaW5pdF9pcnEodm9pZCkKK3sKKwlvbWFwX2luaXRfaXJxKCk7CisJb21hcF9ncGlvX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHZvaWNlYmx1ZV9pbml0KHZvaWQpCit7CisJLyogVGhlcmUgaXMgYSBnb29kIGNoYW5jZSBib2FyZCBpcyBnb2luZyB1cCwgc28gZW5hYmxlIFBvd2VyIExFRAorCSAqIChpdCBpcyBjb25uZWN0ZWQgdGhyb3VnaCBpbnZlcnRvcikgKi8KKwlvbWFwX3dyaXRlYigweDAwLCBPTUFQX0xQRzFfTENSKTsKKwkvKiBXYXRjaGRvZyAqLworCW9tYXBfcmVxdWVzdF9ncGlvKDApOworCS8qIHNtYzkxeCByZXNldCAqLworCW9tYXBfcmVxdWVzdF9ncGlvKDcpOworCW9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKDcsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCg3LCAxKTsKKwl1ZGVsYXkoMik7CS8qIHdhaXQgYXQgbGVhc3QgMTAwbnMgKi8KKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNywgMCk7CisJbWRlbGF5KDUwKTsJLyogNTBtcyB1bnRpbCBQSFkgcmVhZHkgKi8KKwkvKiBzbWM5MXggaW50ZXJydXB0IHBpbiAqLworCW9tYXBfcmVxdWVzdF9ncGlvKDgpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDgsIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7CisJLyogMTZDNTU0IHJlc2V0Ki8KKwlvbWFwX3JlcXVlc3RfZ3Bpbyg2KTsKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig2LCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoNiwgMCk7CisJLyogMTZDNTU0IGludGVycnVwdCBwaW5zICovCisJb21hcF9yZXF1ZXN0X2dwaW8oMTIpOworCW9tYXBfcmVxdWVzdF9ncGlvKDEzKTsKKwlvbWFwX3JlcXVlc3RfZ3BpbygxNCk7CisJb21hcF9yZXF1ZXN0X2dwaW8oMTUpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEyLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDEzLCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE0LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDE1LCBPTUFQX0dQSU9fUklTSU5HX0VER0UpOworCisJcGxhdGZvcm1fYWRkX2RldmljZXModm9pY2VibHVlX2RldmljZXMsIEFSUkFZX1NJWkUodm9pY2VibHVlX2RldmljZXMpKTsKKwlvbWFwX2JvYXJkX2NvbmZpZyA9IHZvaWNlYmx1ZV9jb25maWc7CisJb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IEFSUkFZX1NJWkUodm9pY2VibHVlX2NvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBvbWFwX3NlcmlhbF9wb3J0c1tPTUFQX01BWF9OUl9QT1JUU10gPSB7MSwgMSwgMX07CisKK3N0YXRpYyB2b2lkIF9faW5pdCB2b2ljZWJsdWVfbWFwX2lvKHZvaWQpCit7CisJb21hcF9tYXBfY29tbW9uX2lvKCk7CisJb21hcF9zZXJpYWxfaW5pdChvbWFwX3NlcmlhbF9wb3J0cyk7Cit9CisKKyNkZWZpbmUgTUFDSElORV9QQU5JQ0VECQkxCisjZGVmaW5lIE1BQ0hJTkVfUkVCT09USU5HCTIKKyNkZWZpbmUgTUFDSElORV9SRUJPT1QJCTQKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1hY2hpbmVfc3RhdGU7CisKK3N0YXRpYyBpbnQgcGFuaWNfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LAorCSB2b2lkICpwdHIpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoTUFDSElORV9QQU5JQ0VELCAmbWFjaGluZV9zdGF0ZSkpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIEZsYXNoIFBvd2VyIExFRAorCSAqIChUT0RPOiBFbmFibGUgY2xvY2sgcmlnaHQgd2F5IChlbmFibGVkIGluIGJvb3Rsb2FkZXIgYWxyZWFkeSkpICovCisJb21hcF93cml0ZWIoMHg3OCwgT01BUF9MUEcxX0xDUik7CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuaWNfYmxvY2sgPSB7CisJLm5vdGlmaWVyX2NhbGwJPSBwYW5pY19ldmVudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX25vdGlmaWVyKHZvaWQpCit7CisJLyogU2V0dXAgcGFuaWMgbm90aWZpZXIgKi8KKwlub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnBhbmljX2Jsb2NrKTsKKworCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChzZXR1cF9ub3RpZmllcik7CisKK3N0YXRpYyBpbnQgd2R0X2dwaW9fc3RhdGU7CisKK3ZvaWQgdm9pY2VibHVlX3dkdF9lbmFibGUodm9pZCkKK3sKKwlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbigwLCAwKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDEpOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAwKTsKKwl3ZHRfZ3Bpb19zdGF0ZSA9IDA7Cit9CisKK3ZvaWQgdm9pY2VibHVlX3dkdF9kaXNhYmxlKHZvaWQpCit7CisJb21hcF9zZXRfZ3Bpb19kYXRhb3V0KDAsIDApOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCAxKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoMCwgMCk7CisJb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oMCwgMSk7Cit9CisKK3ZvaWQgdm9pY2VibHVlX3dkdF9waW5nKHZvaWQpCit7CisJaWYgKHRlc3RfYml0KE1BQ0hJTkVfUkVCT09ULCAmbWFjaGluZV9zdGF0ZSkpCisJCXJldHVybjsKKworCXdkdF9ncGlvX3N0YXRlID0gIXdkdF9ncGlvX3N0YXRlOworCW9tYXBfc2V0X2dwaW9fZGF0YW91dCgwLCB3ZHRfZ3Bpb19zdGF0ZSk7Cit9CisKK3ZvaWQgdm9pY2VibHVlX3Jlc2V0KHZvaWQpCit7CisJc2V0X2JpdChNQUNISU5FX1JFQk9PVCwgJm1hY2hpbmVfc3RhdGUpOworCXZvaWNlYmx1ZV93ZHRfZW5hYmxlKCk7CisJd2hpbGUgKDEpIDsKK30KKworRVhQT1JUX1NZTUJPTCh2b2ljZWJsdWVfd2R0X2VuYWJsZSk7CitFWFBPUlRfU1lNQk9MKHZvaWNlYmx1ZV93ZHRfZGlzYWJsZSk7CitFWFBPUlRfU1lNQk9MKHZvaWNlYmx1ZV93ZHRfcGluZyk7CisKK01BQ0hJTkVfU1RBUlQoVk9JQ0VCTFVFLCAiVm9pY2VCbHVlIE9NQVA1OTEwIikKKwkvKiBNYWludGFpbmVyOiBMYWRpc2xhdiBNaWNobCA8bWljaGxAMm4uY3o+ICovCisJLnBoeXNfcmFtCT0gMHgxMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ZmZmMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGZlZjAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgxMDAwMDEwMCwKKwkubWFwX2lvCQk9IHZvaWNlYmx1ZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gdm9pY2VibHVlX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSB2b2ljZWJsdWVfaW5pdCwKKwkudGltZXIJCT0gJm9tYXBfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2ZwZ2EuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZnBnYS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW9tYXAvZnBnYS5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2ZwZ2EuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NmMzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAxL2lkLmMKKyAqCisgKiBPTUFQMSBDUFUgaWRlbnRpZmljYXRpb24gY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBDb3Jwb3JhdGlvbgorICogV3JpdHRlbiBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3Qgb21hcF9pZCB7CisJdTE2CWp0YWdfaWQ7CS8qIFVzZWQgdG8gZGV0ZXJtaW5lIE9NQVAgdHlwZSAqLworCXU4CWRpZV9yZXY7CS8qIFByb2Nlc3NvciByZXZpc2lvbiAqLworCXUzMglvbWFwX2lkOwkvKiBPTUFQIHJldmlzaW9uICovCisJdTMyCXR5cGU7CQkvKiBDcHUgaWQgYml0cyBbMzE6MDhdLCBjcHUgY2xhc3MgYml0cyBbMDc6MDBdICovCit9OworCisvKiBSZWdpc3RlciB2YWx1ZXMgdG8gZGV0ZWN0IHRoZSBPTUFQIHZlcnNpb24gKi8KK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pZCBvbWFwX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeyAuanRhZ19pZCA9IDB4MzU1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDA3MzAwMTAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTVmLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMDAwLCAudHlwZSA9IDB4MDczMDAzMDB9LAorCXsgLmp0YWdfaWQgPSAweGI0NzAsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMTAxMDAsIC50eXBlID0gMHgxNTEwMDAwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDAwMCwgLnR5cGUgPSAweDE2MTAwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNTc2LCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMTAwLCAudHlwZSA9IDB4MTYxMTAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1NzYsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAxMDAsIC50eXBlID0gMHgxNjEwMGMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDIwMCwgLnR5cGUgPSAweDE2MTAwZDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNjEzLCAuZGllX3JldiA9IDB4MCwgLm9tYXBfaWQgPSAweDAzMzIwMzAwLCAudHlwZSA9IDB4MTYxMGVmMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2MTMsIC5kaWVfcmV2ID0gMHgwLCAub21hcF9pZCA9IDB4MDMzMjAzMDAsIC50eXBlID0gMHgxNjEwZWYwMH0sCisJeyAuanRhZ19pZCA9IDB4YjU3NiwgLmRpZV9yZXYgPSAweDEsIC5vbWFwX2lkID0gMHgwMzMyMDEwMCwgLnR5cGUgPSAweDE2MTEwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNThjLCAuZGllX3JldiA9IDB4MiwgLm9tYXBfaWQgPSAweDAzMzIwMjAwLCAudHlwZSA9IDB4MTYxMTBiMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1OGMsIC5kaWVfcmV2ID0gMHgzLCAub21hcF9pZCA9IDB4MDMzMjAyMDAsIC50eXBlID0gMHgxNjExMGMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjY1ZiwgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMyMDQwMCwgLnR5cGUgPSAweDE2MjEyMzAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNjVmLCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzIwNDAwLCAudHlwZSA9IDB4MTYyMTIzMDB9LAorCXsgLmp0YWdfaWQgPSAweGI2NWYsIC5kaWVfcmV2ID0gMHgxLCAub21hcF9pZCA9IDB4MDMzMjA1MDAsIC50eXBlID0gMHgxNjIxMjMwMH0sCisJeyAuanRhZ19pZCA9IDB4YjVmNywgLmRpZV9yZXYgPSAweDAsIC5vbWFwX2lkID0gMHgwMzMzMDAwMCwgLnR5cGUgPSAweDE3MTAwMDAwfSwKKwl7IC5qdGFnX2lkID0gMHhiNWY3LCAuZGllX3JldiA9IDB4MSwgLm9tYXBfaWQgPSAweDAzMzMwMTAwLCAudHlwZSA9IDB4MTcxMDAwMDB9LAorCXsgLmp0YWdfaWQgPSAweGI1ZjcsIC5kaWVfcmV2ID0gMHgyLCAub21hcF9pZCA9IDB4MDMzMzAxMDAsIC50eXBlID0gMHgxNzEwMDAwMH0sCit9OworCisvKgorICogR2V0IE9NQVAgdHlwZSBmcm9tIFBST0RfSUQuCisgKiAxNzEwIGhhcyB0aGUgUFJPRF9JRCBpbiBiaXRzIDE1OjAwLCBub3QgaW4gMTY6MDEgYXMgZG9jdW1lbnRlZCBpbiBUUk0uCisgKiAxNTEwIFBST0RfSUQgaXMgZW1wdHksIGFuZCAxNjEwIFBST0RfSUQgZG9lcyBub3QgbWFrZSBzZW5zZS4KKyAqIFVuZG9jdW1lbnRlZCByZWdpc3RlciBpbiBURVNUIEJMT0NLIGlzIHVzZWQgYXMgZmFsbGJhY2s7IFRoaXMgc2VlbXMgdG8KKyAqIHdvcmsgb24gMTUxMCwgMTYxMCAmIDE3MTAuIFRoZSBvZmZpY2lhbCB3YXkgaG9wZWZ1bGx5IHdpbGwgd29yayBpbiBmdXR1cmUKKyAqIHByb2Nlc3NvcnMuCisgKi8KK3N0YXRpYyB1MTYgX19pbml0IG9tYXBfZ2V0X2p0YWdfaWQodm9pZCkKK3sKKwl1MzIgcHJvZF9pZCwgb21hcF9pZDsKKworCXByb2RfaWQgPSBvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKTsKKwlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMSk7CisKKwkvKiBDaGVjayBmb3IgdW51c2FibGUgT01BUF9QUk9EVUNUSU9OX0lEXzEgb24gMTYxMUIvNTkxMiBhbmQgNzMwICovCisJaWYgKCgocHJvZF9pZCA+PiAyMCkgPT0gMCkgfHwgKHByb2RfaWQgPT0gb21hcF9pZCkpCisJCXByb2RfaWQgPSAwOworCWVsc2UKKwkJcHJvZF9pZCAmPSAweGZmZmY7CisKKwlpZiAocHJvZF9pZCkKKwkJcmV0dXJuIHByb2RfaWQ7CisKKwkvKiBVc2UgT01BUDMyX0lEXzEgYXMgZmFsbGJhY2sgKi8KKwlwcm9kX2lkID0gKChvbWFwX2lkID4+IDEyKSAmIDB4ZmZmZik7CisKKwlyZXR1cm4gcHJvZF9pZDsKK30KKworLyoKKyAqIEdldCBPTUFQIHJldmlzaW9uIGZyb20gRElFX1JFVi4KKyAqIEVhcmx5IDE3MTAgcHJvY2Vzc29ycyBtYXkgaGF2ZSBicm9rZW4gT01BUF9ESUVfSUQsIGl0IGNvbnRhaW5zIFBST0RfSUQuCisgKiBVbmRvY3VtZW50ZWQgcmVnaXN0ZXIgaW4gdGhlIFRFU1QgQkxPQ0sgaXMgdXNlZCBhcyBmYWxsYmFjay4KKyAqIFJFVklTSVQ6IFRoaXMgZG9lcyBub3Qgc2VlbSB0byB3b3JrIG9uIDE1MTAKKyAqLworc3RhdGljIHU4IF9faW5pdCBvbWFwX2dldF9kaWVfcmV2KHZvaWQpCit7CisJdTMyIGRpZV9yZXY7CisKKwlkaWVfcmV2ID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKTsKKworCS8qIENoZWNrIGZvciBicm9rZW4gT01BUF9ESUVfSUQgb24gZWFybHkgMTcxMCAqLworCWlmICgoKGRpZV9yZXYgPj4gMTIpICYgMHhmZmZmKSA9PSBvbWFwX2dldF9qdGFnX2lkKCkpCisJCWRpZV9yZXYgPSAwOworCisJZGllX3JldiA9IChkaWVfcmV2ID4+IDE3KSAmIDB4ZjsKKwlpZiAoZGllX3JldikKKwkJcmV0dXJuIGRpZV9yZXY7CisKKwlkaWVfcmV2ID0gKG9tYXBfcmVhZGwoT01BUDMyX0lEXzEpID4+IDI4KSAmIDB4ZjsKKworCXJldHVybiBkaWVfcmV2OworfQorCit2b2lkIF9faW5pdCBvbWFwX2NoZWNrX3JldmlzaW9uKHZvaWQpCit7CisJaW50IGk7CisJdTE2IGp0YWdfaWQ7CisJdTggZGllX3JldjsKKwl1MzIgb21hcF9pZDsKKwl1OCBjcHVfdHlwZTsKKworCWp0YWdfaWQgPSBvbWFwX2dldF9qdGFnX2lkKCk7CisJZGllX3JldiA9IG9tYXBfZ2V0X2RpZV9yZXYoKTsKKwlvbWFwX2lkID0gb21hcF9yZWFkbChPTUFQMzJfSURfMCk7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiT01BUF9ESUVfSURfMDogMHglMDh4XG4iLCBvbWFwX3JlYWRsKE9NQVBfRElFX0lEXzApKTsKKwlwcmludGsoIk9NQVBfRElFX0lEXzE6IDB4JTA4eCBESUVfUkVWOiAlaVxuIiwKKwkJb21hcF9yZWFkbChPTUFQX0RJRV9JRF8xKSwKKwkgICAgICAgKG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSkgPj4gMTcpICYgMHhmKTsKKwlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8wOiAweCUwOHhcbiIsIG9tYXBfcmVhZGwoT01BUF9QUk9EVUNUSU9OX0lEXzApKTsKKwlwcmludGsoIk9NQVBfUFJPRFVDVElPTl9JRF8xOiAweCUwOHggSlRBR19JRDogMHglMDR4XG4iLAorCQlvbWFwX3JlYWRsKE9NQVBfUFJPRFVDVElPTl9JRF8xKSwKKwkJb21hcF9yZWFkbChPTUFQX1BST0RVQ1RJT05fSURfMSkgJiAweGZmZmYpOworCXByaW50aygiT01BUDMyX0lEXzA6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMCkpOworCXByaW50aygiT01BUDMyX0lEXzE6IDB4JTA4eFxuIiwgb21hcF9yZWFkbChPTUFQMzJfSURfMSkpOworCXByaW50aygiSlRBR19JRDogMHglMDR4IERJRV9SRVY6ICVpXG4iLCBqdGFnX2lkLCBkaWVfcmV2KTsKKyNlbmRpZgorCisJc3lzdGVtX3NlcmlhbF9oaWdoID0gb21hcF9yZWFkbChPTUFQX0RJRV9JRF8wKTsKKwlzeXN0ZW1fc2VyaWFsX2xvdyA9IG9tYXBfcmVhZGwoT01BUF9ESUVfSURfMSk7CisKKwkvKiBGaXJzdCBjaGVjayBvbmx5IHRoZSBtYWpvciB2ZXJzaW9uIGluIGEgc2FmZSB3YXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSAob21hcF9pZHNbaV0uanRhZ19pZCkpIHsKKwkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBjYW4gZmluZCB0aGUgZGllIHJldmlzaW9uICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob21hcF9pZHMpOyBpKyspIHsKKwkJaWYgKGp0YWdfaWQgPT0gb21hcF9pZHNbaV0uanRhZ19pZCAmJiBkaWVfcmV2ID09IG9tYXBfaWRzW2ldLmRpZV9yZXYpIHsKKwkJCXN5c3RlbV9yZXYgPSBvbWFwX2lkc1tpXS50eXBlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGaW5hbGx5IGNoZWNrIGFsc28gdGhlIG9tYXBfaWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbWFwX2lkcyk7IGkrKykgeworCQlpZiAoanRhZ19pZCA9PSBvbWFwX2lkc1tpXS5qdGFnX2lkCisJCSAgICAmJiBkaWVfcmV2ID09IG9tYXBfaWRzW2ldLmRpZV9yZXYKKwkJICAgICYmIG9tYXBfaWQgPT0gb21hcF9pZHNbaV0ub21hcF9pZCkgeworCQkJc3lzdGVtX3JldiA9IG9tYXBfaWRzW2ldLnR5cGU7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIEFkZCB0aGUgY3B1IGNsYXNzIGluZm8gKDd4eCwgMTV4eCwgMTZ4eCwgMjR4eCkgKi8KKwljcHVfdHlwZSA9IHN5c3RlbV9yZXYgPj4gMjQ7CisKKwlzd2l0Y2ggKGNwdV90eXBlKSB7CisJY2FzZSAweDA3OgorCQlzeXN0ZW1fcmV2IHw9IDB4MDc7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJc3lzdGVtX3JldiB8PSAweDE1OworCQlicmVhazsKKwljYXNlIDB4MTY6CisJY2FzZSAweDE3OgorCQlzeXN0ZW1fcmV2IHw9IDB4MTY7CisJCWJyZWFrOworCWNhc2UgMHgyNDoKKwkJc3lzdGVtX3JldiB8PSAweDI0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIlVua25vd24gT01BUCBjcHUgdHlwZTogMHglMDJ4XG4iLCBjcHVfdHlwZSk7CisJfQorCisJcHJpbnRrKCJPTUFQJTA0eCIsIHN5c3RlbV9yZXYgPj4gMTYpOworCWlmICgoc3lzdGVtX3JldiA+PiA4KSAmIDB4ZmYpCisJCXByaW50aygiJXgiLCAoc3lzdGVtX3JldiA+PiA4KSAmIDB4ZmYpOworCXByaW50aygiIHJldmlzaW9uICVpIGhhbmRsZWQgYXMgJTAyeHh4IGlkOiAlMDh4JTA4eFxuIiwKKwkgICAgICAgZGllX3Jldiwgc3lzdGVtX3JldiAmIDB4ZmYsIHN5c3RlbV9zZXJpYWxfbG93LAorCSAgICAgICBzeXN0ZW1fc2VyaWFsX2hpZ2gpOworfQorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3ZGYwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvaW8uYworICoKKyAqIE9NQVAxIEkvTyBtYXBwaW5nIGNvZGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgorCitleHRlcm4gaW50IGNsa19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgb21hcF9jaGVja19yZXZpc2lvbih2b2lkKTsKKworLyoKKyAqIFRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgbWF5IHByb3ZpZGUgdGhlIGV4dHJhIG1hcHBpbmcgYmVzaWRlcyB0aGUKKyAqIGRlZmF1bHQgbWFwcGluZyBwcm92aWRlZCBoZXJlLgorICovCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBJT19WSVJULCAgICAgIAlJT19QSFlTLCAgICAgICAgICAgICBJT19TSVpFLCAgICAgICAgCSAgIE1UX0RFVklDRSB9LAorfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDczMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKKyB7IE9NQVA3MzBfRFNQX0JBU0UsICAgIE9NQVA3MzBfRFNQX1NUQVJULCAgICBPTUFQNzMwX0RTUF9TSVpFLCAgICBNVF9ERVZJQ0UgfSwKKyB7IE9NQVA3MzBfRFNQUkVHX0JBU0UsIE9NQVA3MzBfRFNQUkVHX1NUQVJULCBPTUFQNzMwX0RTUFJFR19TSVpFLCBNVF9ERVZJQ0UgfSwKKyB7IE9NQVA3MzBfU1JBTV9CQVNFLCAgIE9NQVA3MzBfU1JBTV9TVEFSVCwgICBPTUFQNzMwX1NSQU1fU0laRSwgICBNVF9ERVZJQ0UgfQorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgb21hcDE1MTBfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisgeyBPTUFQMTUxMF9EU1BfQkFTRSwgICAgT01BUDE1MTBfRFNQX1NUQVJULCAgICBPTUFQMTUxMF9EU1BfU0laRSwgICAgTVRfREVWSUNFIH0sCisgeyBPTUFQMTUxMF9EU1BSRUdfQkFTRSwgT01BUDE1MTBfRFNQUkVHX1NUQVJULCBPTUFQMTUxMF9EU1BSRUdfU0laRSwgTVRfREVWSUNFIH0sCisgeyBPTUFQMTUxMF9TUkFNX0JBU0UsICAgT01BUDE1MTBfU1JBTV9TVEFSVCwgICBPTUFQMTUxMF9TUkFNX1NJWkUsICAgTVRfREVWSUNFIH0KK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXAxNjEwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAorIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAorIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDE2MTBfU1JBTV9TSVpFLCAgIE1UX0RFVklDRSB9Cit9OworCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIG9tYXA1OTEyX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0geworIHsgT01BUDE2WFhfRFNQX0JBU0UsICAgIE9NQVAxNlhYX0RTUF9TVEFSVCwgICAgT01BUDE2WFhfRFNQX1NJWkUsICAgIE1UX0RFVklDRSB9LAorIHsgT01BUDE2WFhfRFNQUkVHX0JBU0UsIE9NQVAxNlhYX0RTUFJFR19TVEFSVCwgT01BUDE2WFhfRFNQUkVHX1NJWkUsIE1UX0RFVklDRSB9LAorLyoKKyAqIFRoZSBPTUFQNTkxMiBoYXMgMjUwa0J5dGUgaW50ZXJuYWwgU1JBTS4gQmVjYXVzZSB0aGUgbWFwcGluZyBpcyBiYXNlZWQgb24gcGFnZQorICogc2l6ZSAoNGtCeXRlKSwgaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCAya0J5dGUgKD0weDgwMCkgb2YgdGhlIDI1MGtCeXRlIGFyZSBub3QgbWFwcGVkLgorICogQWRkIGFkZGl0aW9uYWwgMmtCeXRlICgweDgwMCkgc28gdGhhdCB0aGUgbGFzdCBwYWdlIGlzIG1hcHBlZCBhbmQgdGhlIGxhc3QgMmtCeXRlCisgKiBjYW4gYmUgdXNlZC4KKyAqLworIHsgT01BUDE2WFhfU1JBTV9CQVNFLCAgIE9NQVAxNlhYX1NSQU1fU1RBUlQsICAgT01BUDU5MTJfU1JBTV9TSVpFICsgMHg4MDAsICAgTVRfREVWSUNFIH0KK307CisjZW5kaWYKKworc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfb21hcF9tYXBfaW8odm9pZCkKK3sKKwlpbml0aWFsaXplZCA9IDE7CisKKwkvKiBXZSBoYXZlIHRvIGluaXRpYWxpemUgdGhlIElPIHNwYWNlIG1hcHBpbmcgYmVmb3JlIHdlIGNhbiBydW4KKwkgKiBjcHVfaXNfb21hcHh4eCgpIG1hY3Jvcy4gKi8KKwlpb3RhYmxlX2luaXQob21hcF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXBfaW9fZGVzYykpOworCW9tYXBfY2hlY2tfcmV2aXNpb24oKTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDczMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXA3MzBfaW9fZGVzYykpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWlvdGFibGVfaW5pdChvbWFwMTUxMF9pb19kZXNjLCBBUlJBWV9TSVpFKG9tYXAxNTEwX2lvX2Rlc2MpKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDE2MTBfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwMTYxMF9pb19kZXNjKSk7CisJfQorCWlmIChjcHVfaXNfb21hcDU5MTIoKSkgeworCQlpb3RhYmxlX2luaXQob21hcDU5MTJfaW9fZGVzYywgQVJSQVlfU0laRShvbWFwNTkxMl9pb19kZXNjKSk7CisJfQorI2VuZGlmCisKKwkvKiBSRVZJU0lUOiBSZWZlciB0byBPTUFQNTkxMCBFcnJhdGEsIEFkdmlzb3J5IFNZU18xOiAiVGltZW91dCBBYm9ydAorCSAqIG9uIGEgUG9zdGVkIFdyaXRlIGluIHRoZSBUSVBCIEJyaWRnZSIuCisJICovCisJb21hcF93cml0ZXcoMHgwLCBNUFVfUFVCTElDX1RJUEJfQ05UTCk7CisJb21hcF93cml0ZXcoMHgwLCBNUFVfUFJJVkFURV9USVBCX0NOVEwpOworCisJLyogTXVzdCBpbml0IGNsb2NrcyBlYXJseSB0byBhc3N1cmUgdGhhdCB0aW1lciBpbnRlcnJ1cHQgd29ya3MKKwkgKi8KKwljbGtfaW5pdCgpOworfQorCisvKgorICogVGhpcyBzaG91bGQgb25seSBnZXQgY2FsbGVkIGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAorICovCit2b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKQoreworCWlmICghaW5pdGlhbGl6ZWQpCisJCV9vbWFwX21hcF9pbygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pcnEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTExYjZkOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvaXJxLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvaXJxLmMKKyAqCisgKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgYWxsIE9NQVAgYm9hcmRzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBXcml0dGVuIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKiBNYWpvciBjbGVhbnVwcyBieSBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICoKKyAqIENvbXBsZXRlbHkgcmUtd3JpdHRlbiB0byBzdXBwb3J0IHZhcmlvdXMgT01BUCBjaGlwcyB3aXRoIGJhbmsgc3BlY2lmaWMKKyAqIGludGVycnVwdCBoYW5kbGVycy4KKyAqCisgKiBTb21lIHNuaXBwZXRzIG9mIHRoZSBjb2RlIHRha2VuIGZyb20gdGhlIG9sZGVyIE9NQVAgaW50ZXJydXB0IGhhbmRsZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMSBSaWRnZVJ1biwgSW5jLiBHcmVnIExvbm5vbiA8Z2xvbm5vbkByaWRnZXJ1bi5jb20+CisgKgorICogR1BJTyBpbnRlcnJ1cHQgaGFuZGxlciBtb3ZlZCB0byBncGlvLmMgYnkgSnVoYSBZcmpvbGEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBJUlFfQkFOSyhpcnEpICgoaXJxKSA+PiA1KQorI2RlZmluZSBJUlFfQklUKGlycSkgICgoaXJxKSAmIDB4MWYpCisKK3N0cnVjdCBvbWFwX2lycV9iYW5rIHsKKwl1bnNpZ25lZCBsb25nIGJhc2VfcmVnOworCXVuc2lnbmVkIGxvbmcgdHJpZ2dlcl9tYXA7CisJdW5zaWduZWQgbG9uZyB3YWtlX2VuYWJsZTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2JhbmtfY291bnQgPSAwOworc3RhdGljIHN0cnVjdCBvbWFwX2lycV9iYW5rICppcnFfYmFua3M7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlycV9iYW5rX3JlYWRsKGludCBiYW5rLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBvbWFwX3JlYWRsKGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfYmFua193cml0ZWwodW5zaWduZWQgbG9uZyB2YWx1ZSwgaW50IGJhbmssIGludCBvZmZzZXQpCit7CisJb21hcF93cml0ZWwodmFsdWUsIGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPiAzMSkKKwkJb21hcF93cml0ZWwoMHgxLCBPTUFQX0lIMl9CQVNFICsgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7CisKKwlvbWFwX3dyaXRlbCgweDEsIE9NQVBfSUgxX0JBU0UgKyBJUlFfQ09OVFJPTF9SRUdfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBiYW5rID0gSVJRX0JBTksoaXJxKTsKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKGlycV9iYW5rc1tiYW5rXS5iYXNlX3JlZyArIElSUV9NSVJfUkVHX09GRlNFVCk7CisJbCB8PSAxIDw8IElSUV9CSVQoaXJxKTsKKwlvbWFwX3dyaXRlbChsLCBpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBJUlFfTUlSX1JFR19PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgYmFuayA9IElSUV9CQU5LKGlycSk7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChpcnFfYmFua3NbYmFua10uYmFzZV9yZWcgKyBJUlFfTUlSX1JFR19PRkZTRVQpOworCWwgJj0gfigxIDw8IElSUV9CSVQoaXJxKSk7CisJb21hcF93cml0ZWwobCwgaXJxX2JhbmtzW2JhbmtdLmJhc2VfcmVnICsgSVJRX01JUl9SRUdfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9tYXNrX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlvbWFwX21hc2tfaXJxKGlycSk7CisJb21hcF9hY2tfaXJxKGlycSk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF93YWtlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCWludCBiYW5rID0gSVJRX0JBTksoaXJxKTsKKworCWlmIChlbmFibGUpCisJCWlycV9iYW5rc1tiYW5rXS53YWtlX2VuYWJsZSB8PSBJUlFfQklUKGlycSk7CisJZWxzZQorCQlpcnFfYmFua3NbYmFua10ud2FrZV9lbmFibGUgJj0gfklSUV9CSVQoaXJxKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBBbGxvd3MgdHVuaW5nIHRoZSBJUlEgdHlwZSBhbmQgcHJpb3JpdHkKKyAqCisgKiBOT1RFOiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gT01BUCBmaXEgaGFuZGxlciBmb3IgTGludXguIFJlYWQgdGhlCisgKgkgbWFpbGluZyBsaXN0IHRocmVhZHMgb24gRklRIGhhbmRsZXJzIGlmIHlvdSBhcmUgcGxhbm5pbmcgdG8KKyAqCSBhZGQgYSBGSVEgaGFuZGxlciBmb3IgT01BUC4KKyAqLworc3RhdGljIHZvaWQgb21hcF9pcnFfc2V0X2NmZyhpbnQgaXJxLCBpbnQgZmlxLCBpbnQgcHJpb3JpdHksIGludCB0cmlnZ2VyKQoreworCXNpZ25lZCBpbnQgYmFuazsKKwl1bnNpZ25lZCBsb25nIHZhbCwgb2Zmc2V0OworCisJYmFuayA9IElSUV9CQU5LKGlycSk7CisJLyogRklRIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGJhbmsgMCBpbnRlcnJ1cHRzICovCisJZmlxID0gYmFuayA/IDAgOiAoZmlxICYgMHgxKTsKKwl2YWwgPSBmaXEgfCAoKHByaW9yaXR5ICYgMHgxZikgPDwgMikgfCAoKHRyaWdnZXIgJiAweDEpIDw8IDEpOworCW9mZnNldCA9IElSUV9JTFIwX1JFR19PRkZTRVQgKyBJUlFfQklUKGlycSkgKiAweDQ7CisJaXJxX2Jhbmtfd3JpdGVsKHZhbCwgYmFuaywgb2Zmc2V0KTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayBvbWFwNzMwX2lycV9iYW5rc1tdID0geworCXsgLmJhc2VfcmVnID0gT01BUF9JSDFfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGIzZjhlMjJmIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4ZmRiOWMxZjIgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UgKyAweDEwMCwJLnRyaWdnZXJfbWFwID0gMHg4MDAwNDBmMyB9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9pcnFfYmFuayBvbWFwMTUxMF9pcnFfYmFua3NbXSA9IHsKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgxX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhiM2ZlYmZmZiB9LAorCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSwgCQkudHJpZ2dlcl9tYXAgPSAweGZmYmZmZmVkIH0sCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCitzdGF0aWMgc3RydWN0IG9tYXBfaXJxX2Jhbmsgb21hcDE2MTBfaXJxX2JhbmtzW10gPSB7CisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMV9CQVNFLCAJCS50cmlnZ2VyX21hcCA9IDB4YjNmZWZlOGYgfSwKKwl7IC5iYXNlX3JlZyA9IE9NQVBfSUgyX0JBU0UsIAkJLnRyaWdnZXJfbWFwID0gMHhmZGI3YzFmZCB9LAorCXsgLmJhc2VfcmVnID0gT01BUF9JSDJfQkFTRSArIDB4MTAwLAkudHJpZ2dlcl9tYXAgPSAweGZmZmZiN2ZmIH0sCisJeyAuYmFzZV9yZWcgPSBPTUFQX0lIMl9CQVNFICsgMHgyMDAsCS50cmlnZ2VyX21hcCA9IDB4ZmZmZmZmZmYgfSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIG9tYXBfaXJxX2NoaXAgPSB7CisJLmFjayAgICA9IG9tYXBfbWFza19hY2tfaXJxLAorCS5tYXNrICAgPSBvbWFwX21hc2tfaXJxLAorCS51bm1hc2sgPSBvbWFwX3VubWFza19pcnEsCisJLndha2UJPSBvbWFwX3dha2VfaXJxLAorfTsKKwordm9pZCBfX2luaXQgb21hcF9pbml0X2lycSh2b2lkKQoreworCWludCBpLCBqOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCWlycV9iYW5rcyA9IG9tYXA3MzBfaXJxX2JhbmtzOworCQlpcnFfYmFua19jb3VudCA9IEFSUkFZX1NJWkUob21hcDczMF9pcnFfYmFua3MpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWlycV9iYW5rcyA9IG9tYXAxNTEwX2lycV9iYW5rczsKKwkJaXJxX2JhbmtfY291bnQgPSBBUlJBWV9TSVpFKG9tYXAxNTEwX2lycV9iYW5rcyk7CisJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJaXJxX2JhbmtzID0gb21hcDE2MTBfaXJxX2JhbmtzOworCQlpcnFfYmFua19jb3VudCA9IEFSUkFZX1NJWkUob21hcDE2MTBfaXJxX2JhbmtzKTsKKwl9CisjZW5kaWYKKwlwcmludGsoIlRvdGFsIG9mICVpIGludGVycnVwdHMgaW4gJWkgaW50ZXJydXB0IGJhbmtzXG4iLAorCSAgICAgICBpcnFfYmFua19jb3VudCAqIDMyLCBpcnFfYmFua19jb3VudCk7CisKKwkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCBpcnFfYmFua19jb3VudDsgaSsrKSB7CisJCWlycV9iYW5rX3dyaXRlbCh+MHgwLCBpLCBJUlFfTUlSX1JFR19PRkZTRVQpOworCQlpcnFfYmFua193cml0ZWwoMHgwLCBpLCBJUlFfSVRSX1JFR19PRkZTRVQpOworCX0KKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlpcnFfYmFua193cml0ZWwoMHgwMywgMCwgSVJRX0NPTlRST0xfUkVHX09GRlNFVCk7CisJaXJxX2Jhbmtfd3JpdGVsKDB4MDMsIDEsIElSUV9DT05UUk9MX1JFR19PRkZTRVQpOworCisJLyogRW5hYmxlIGludGVycnVwdHMgaW4gZ2xvYmFsIG1hc2sgKi8KKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkgeworCQlpcnFfYmFua193cml0ZWwoMHgwLCAwLCBJUlFfR01SX1JFR19PRkZTRVQpOworCX0KKworCS8qIEluc3RhbGwgdGhlIGludGVycnVwdCBoYW5kbGVycyBmb3IgZWFjaCBiYW5rICovCisJZm9yIChpID0gMDsgaSA8IGlycV9iYW5rX2NvdW50OyBpKyspIHsKKwkJZm9yIChqID0gaSAqIDMyOyBqIDwgKGkgKyAxKSAqIDMyOyBqKyspIHsKKwkJCWludCBpcnFfdHJpZ2dlcjsKKworCQkJaXJxX3RyaWdnZXIgPSBpcnFfYmFua3NbaV0udHJpZ2dlcl9tYXAgPj4gSVJRX0JJVChqKTsKKwkJCW9tYXBfaXJxX3NldF9jZmcoaiwgMCwgMCwgaXJxX3RyaWdnZXIpOworCisJCQlzZXRfaXJxX2NoaXAoaiwgJm9tYXBfaXJxX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGosIGRvX2xldmVsX0lSUSk7CisJCQlzZXRfaXJxX2ZsYWdzKGosIElSUUZfVkFMSUQpOworCQl9CisJfQorCisJLyogVW5tYXNrIGxldmVsIDIgaGFuZGxlciAqLworCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCW9tYXBfdW5tYXNrX2lycShJTlRfNzMwX0lIMl9JUlEpOworCX0gZWxzZSB7CisJCW9tYXBfdW5tYXNrX2lycShJTlRfSUgyX0lSUSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaDJwMi1kZWJ1Zy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLWgycDItZGVidWcuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaDJwMi1kZWJ1Zy5jCnJlbmFtZSB0byBhcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtaDJwMi1kZWJ1Zy5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1vbWFwL2xlZHMtaW5ub3ZhdG9yLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvbGVkcy1pbm5vdmF0b3IuYwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLW9zay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGU4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2xlZHMtb3NrLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy1vc2suYworICoKKyAqIExFRCBkcml2ZXIgZm9yIE9TSywgYW5kIG9wdGlvbmFsbHkgTWlzdHJhbCBRVkdBLCBib2FyZHMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9sZWRzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CisKKyNpbmNsdWRlICJsZWRzLmgiCisKKworI2RlZmluZSBMRURfU1RBVEVfRU5BQkxFRAkoMSA8PCAwKQorI2RlZmluZSBMRURfU1RBVEVfQ0xBSU1FRAkoMSA8PCAxKQorc3RhdGljIHU4IGxlZF9zdGF0ZTsKKworI2RlZmluZQlHUkVFTl9MRUQJCSgxIDw8IDApCS8qIFRQUzY1MDEwIExFRDEgKi8KKyNkZWZpbmUJQU1CRVJfTEVECQkoMSA8PCAxKQkvKiBUUFM2NTAxMCBMRUQyICovCisjZGVmaW5lCVJFRF9MRUQJCQkoMSA8PCAyKQkvKiBUUFM2NTAxMCBHUElPMiAqLworI2RlZmluZQlUSU1FUl9MRUQJCSgxIDw8IDMpCS8qIE1pc3RyYWwgYm9hcmQgKi8KKyNkZWZpbmUJSURMRV9MRUQJCSgxIDw8IDQpCS8qIE1pc3RyYWwgYm9hcmQgKi8KK3N0YXRpYyB1OCBod19sZWRfc3RhdGU7CisKKworLyogVFBTNjUwMTAgbGVkcyBhcmUgY2hhbmdlZCB1c2luZyBpMmMgLS0gZnJvbSBhIHRhc2sgY29udGV4dC4KKyAqIFVzaW5nIG9uZSBvZiB0aGVzZSBmb3IgdGhlICJpZGxlIiBMRUQgd291bGQgYmUgaW1wcmFjdGljYWwuLi4KKyAqLworI2RlZmluZQlUUFNfTEVEUwkoR1JFRU5fTEVEIHwgUkVEX0xFRCB8IEFNQkVSX0xFRCkKKworc3RhdGljIHU4IHRwc19sZWRzX2NoYW5nZTsKKworc3RhdGljIHZvaWQgdHBzX3dvcmsodm9pZCAqdW51c2VkKQoreworCWZvciAoOzspIHsKKwkJdTgJbGVkczsKKworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlsZWRzID0gdHBzX2xlZHNfY2hhbmdlOworCQl0cHNfbGVkc19jaGFuZ2UgPSAwOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJaWYgKCFsZWRzKQorCQkJYnJlYWs7CisKKwkJLyogY2FyZWZ1bDogIHRoZSBzZXRfbGVkKCkgdmFsdWUgaXMgb24vb2ZmL2JsaW5rICovCisJCWlmIChsZWRzICYgR1JFRU5fTEVEKQorCQkJdHBzNjUwMTBfc2V0X2xlZChMRUQxLCAhIShod19sZWRfc3RhdGUgJiBHUkVFTl9MRUQpKTsKKwkJaWYgKGxlZHMgJiBBTUJFUl9MRUQpCisJCQl0cHM2NTAxMF9zZXRfbGVkKExFRDIsICEhKGh3X2xlZF9zdGF0ZSAmIEFNQkVSX0xFRCkpOworCisJCS8qIHRoZSBncGlvIGxlZCBkb2Vzbid0IGhhdmUgdGhhdCBpc3N1ZSAqLworCQlpZiAobGVkcyAmIFJFRF9MRUQpCisJCQl0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzIsCisJCQkJCSEoaHdfbGVkX3N0YXRlICYgUkVEX0xFRCkpOworCX0KK30KKworc3RhdGljIERFQ0xBUkVfV09SSyh3b3JrLCB0cHNfd29yaywgTlVMTCk7CisKKyNpZmRlZglDT05GSUdfRkJfT01BUAorCisvKiBGb3Igbm93LCBhbGwgc3lzdGVtIGluZGljYXRvcnMgcmVxdWlyZSB0aGUgTWlzdHJhbCBib2FyZCwgc2luY2UgdGhhdAorICogTEVEIGNhbiBiZSBtYW5pcHVsYXRlZCB3aXRob3V0IGEgdGFzayBjb250ZXh0LiAgVGhpcyBMRUQgaXMgZWl0aGVyIHJlZCwKKyAqIG9yIGdyZWVuLCBidXQgbm90IGJvdGg7IGl0IGNhbid0IGdpdmUgdGhlIGZ1bGwgImRpc2NvIGxlZCIgZWZmZWN0LgorICovCisKKyNkZWZpbmUgR1BJT19MRURfUkVECQkzCisjZGVmaW5lIEdQSU9fTEVEX0dSRUVOCQlPTUFQX01QVUlPKDQpCisKK3N0YXRpYyB2b2lkIG1pc3RyYWxfc2V0bGVkKHZvaWQpCit7CisJaW50CXJlZCA9IDA7CisJaW50CWdyZWVuID0gMDsKKworCWlmIChod19sZWRfc3RhdGUgJiBUSU1FUl9MRUQpCisJCXJlZCA9IDE7CisJZWxzZSBpZiAoaHdfbGVkX3N0YXRlICYgSURMRV9MRUQpCisJCWdyZWVuID0gMTsKKwkvLyBlbHNlIGJvdGggc2lkZXMgYXJlIGRpc2FibGVkCisKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoR1BJT19MRURfR1JFRU4sIGdyZWVuKTsKKwlvbWFwX3NldF9ncGlvX2RhdGFvdXQoR1BJT19MRURfUkVELCByZWQpOworfQorCisjZW5kaWYKKwordm9pZCBvc2tfbGVkc19ldmVudChsZWRfZXZlbnRfdCBldnQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1MTYJCWxlZHM7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAoIShsZWRfc3RhdGUgJiBMRURfU1RBVEVfRU5BQkxFRCkgJiYgZXZ0ICE9IGxlZF9zdGFydCkKKwkJZ290byBkb25lOworCisJbGVkcyA9IGh3X2xlZF9zdGF0ZTsKKwlzd2l0Y2ggKGV2dCkgeworCWNhc2UgbGVkX3N0YXJ0OgorCQlsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0VOQUJMRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWxlZHMgPSB+MDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9oYWx0ZWQ6CisJY2FzZSBsZWRfc3RvcDoKKwkJbGVkX3N0YXRlICY9IH5MRURfU1RBVEVfRU5BQkxFRDsKKwkJaHdfbGVkX3N0YXRlID0gMDsKKwkJLy8gTk9URTogIHdvcmsgbWF5IHN0aWxsIGJlIHBlbmRpbmchIQorCQlicmVhazsKKworCWNhc2UgbGVkX2NsYWltOgorCQlsZWRfc3RhdGUgfD0gTEVEX1NUQVRFX0NMQUlNRUQ7CisJCWh3X2xlZF9zdGF0ZSA9IDA7CisJCWxlZHMgPSB+MDsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9yZWxlYXNlOgorCQlsZWRfc3RhdGUgJj0gfkxFRF9TVEFURV9DTEFJTUVEOworCQlod19sZWRfc3RhdGUgPSAwOworCQlicmVhazsKKworI2lmZGVmCUNPTkZJR19GQl9PTUFQCisKKwljYXNlIGxlZF90aW1lcjoKKwkJaHdfbGVkX3N0YXRlIF49IFRJTUVSX0xFRDsKKwkJbWlzdHJhbF9zZXRsZWQoKTsKKwkJYnJlYWs7CisKKwljYXNlIGxlZF9pZGxlX3N0YXJ0OgorCQlod19sZWRfc3RhdGUgfD0gSURMRV9MRUQ7CisJCW1pc3RyYWxfc2V0bGVkKCk7CisJCWJyZWFrOworCisJY2FzZSBsZWRfaWRsZV9lbmQ6CisJCWh3X2xlZF9zdGF0ZSAmPSB+SURMRV9MRUQ7CisJCW1pc3RyYWxfc2V0bGVkKCk7CisJCWJyZWFrOworCisjZW5kaWYJLyogQ09ORklHX0ZCX09NQVAgKi8KKworCS8qICJncmVlbiIgPT0gdHBzIExFRDEgKGxlZnRtb3N0LCBub3JtYWxseSBwb3dlci1nb29kKQorCSAqIHdvcmtzIG9ubHkgd2l0aCBEQyBhZGFwdGVyLCBub3Qgb24gYmF0dGVyeSBwb3dlciEKKwkgKi8KKwljYXNlIGxlZF9ncmVlbl9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IEdSRUVOX0xFRDsKKwkJYnJlYWs7CisJY2FzZSBsZWRfZ3JlZW5fb2ZmOgorCQlpZiAobGVkX3N0YXRlICYgTEVEX1NUQVRFX0NMQUlNRUQpCisJCQlod19sZWRfc3RhdGUgJj0gfkdSRUVOX0xFRDsKKwkJYnJlYWs7CisKKwkvKiAiYW1iZXIiID09IHRwcyBMRUQyIChtaWRkbGUpICovCisJY2FzZSBsZWRfYW1iZXJfb246CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSB8PSBBTUJFUl9MRUQ7CisJCWJyZWFrOworCWNhc2UgbGVkX2FtYmVyX29mZjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlICY9IH5BTUJFUl9MRUQ7CisJCWJyZWFrOworCisJLyogInJlZCIgPT0gTEVEIG9uIHRwcyBncGlvMyAocmlnaHRtb3N0KSAqLworCWNhc2UgbGVkX3JlZF9vbjoKKwkJaWYgKGxlZF9zdGF0ZSAmIExFRF9TVEFURV9DTEFJTUVEKQorCQkJaHdfbGVkX3N0YXRlIHw9IFJFRF9MRUQ7CisJCWJyZWFrOworCWNhc2UgbGVkX3JlZF9vZmY6CisJCWlmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkKKwkJCWh3X2xlZF9zdGF0ZSAmPSB+UkVEX0xFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlsZWRzIF49IGh3X2xlZF9zdGF0ZTsKKwlsZWRzICY9IFRQU19MRURTOworCWlmIChsZWRzICYmIChsZWRfc3RhdGUgJiBMRURfU1RBVEVfQ0xBSU1FRCkpIHsKKwkJdHBzX2xlZHNfY2hhbmdlIHw9IGxlZHM7CisJCXNjaGVkdWxlX3dvcmsoJndvcmspOworCX0KKworZG9uZToKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9sZWRzLmMKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5jCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAvbGVkcy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9sZWRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtb21hcC9sZWRzLmgKcmVuYW1lIHRvIGFyY2gvYXJtL21hY2gtb21hcDEvbGVkcy5oCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3NlcmlhbC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRlNWQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9zZXJpYWwuYwpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvaWQuYworICoKKyAqIE9NQVAxIENQVSBpZGVudGlmaWNhdGlvbiBjb2RlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICogdWFydDFfY2sgPSBOVUxMOworc3RhdGljIHN0cnVjdCBjbGsgKiB1YXJ0Ml9jayA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGNsayAqIHVhcnQzX2NrID0gTlVMTDsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb21hcF9zZXJpYWxfaW4oc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICp1cCwKKwkJCQkJICBpbnQgb2Zmc2V0KQoreworCW9mZnNldCA8PD0gdXAtPnJlZ3NoaWZ0OworCXJldHVybiAodW5zaWduZWQgaW50KV9fcmF3X3JlYWRiKHVwLT5tZW1iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfc2VyaWFsX291dHAoc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0ICpwLCBpbnQgb2Zmc2V0LAorCQkJCSAgICBpbnQgdmFsdWUpCit7CisJb2Zmc2V0IDw8PSBwLT5yZWdzaGlmdDsKKwlfX3Jhd193cml0ZWIodmFsdWUsIHAtPm1lbWJhc2UgKyBvZmZzZXQpOworfQorCisvKgorICogSW50ZXJuYWwgVUFSVHMgbmVlZCB0byBiZSBpbml0aWFsaXplZCBmb3IgdGhlIDgyNTAgYXV0b2NvbmZpZyB0byB3b3JrCisgKiBwcm9wZXJseS4gTm90ZSB0aGF0IHRoZSBUWCB3YXRlcm1hcmsgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBuZWVkZWQKKyAqIG9uY2UgdGhlIDgyNTAuYyB3YXRlcm1hcmsgaGFuZGxpbmcgY29kZSBpcyBtZXJnZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBvbWFwX3NlcmlhbF9yZXNldChzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnApCit7CisJb21hcF9zZXJpYWxfb3V0cChwLCBVQVJUX09NQVBfTURSMSwgMHgwNyk7CS8qIGRpc2FibGUgVUFSVCAqLworCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX1NDUiwgMHgwOCk7CS8qIFRYIHdhdGVybWFyayAqLworCW9tYXBfc2VyaWFsX291dHAocCwgVUFSVF9PTUFQX01EUjEsIDB4MDApOwkvKiBlbmFibGUgVUFSVCAqLworCisJaWYgKCFjcHVfaXNfb21hcDE1MTAoKSkgeworCQlvbWFwX3NlcmlhbF9vdXRwKHAsIFVBUlRfT01BUF9TWVNDLCAweDAxKTsKKwkJd2hpbGUgKCEob21hcF9zZXJpYWxfaW4ocCwgVUFSVF9PTUFQX1NZU0MpICYgMHgwMSkpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBzZXJpYWxfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQxX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDFfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVDEsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBPTUFQMTZYWF9CQVNFX0JBVUQgKiAxNiwKKwl9LAorCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQyX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDJfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVDIsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBPTUFQMTZYWF9CQVNFX0JBVUQgKiAxNiwKKwl9LAorCXsKKwkJLm1lbWJhc2UJPSAoY2hhciopSU9fQUREUkVTUyhPTUFQX1VBUlQzX0JBU0UpLAorCQkubWFwYmFzZQk9ICh1bnNpZ25lZCBsb25nKU9NQVBfVUFSVDNfQkFTRSwKKwkJLmlycQkJPSBJTlRfVUFSVDMsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLmlvdHlwZQkJPSBVUElPX01FTSwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSBPTUFQMTZYWF9CQVNFX0JBVUQgKiAxNiwKKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNlcmlhbF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDAsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNlcmlhbF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCisvKgorICogTm90ZSB0aGF0IG9uIElubm92YXRvci0xNTEwIFVBUlQyIHBpbnMgY29uZmxpY3Qgd2l0aCBVU0IyLgorICogQnkgZGVmYXVsdCBVQVJUMiBkb2VzIG5vdCB3b3JrIG9uIElubm92YXRvci0xNTEwIGlmIHlvdSBoYXZlCisgKiBVU0IgT0hDSSBlbmFibGVkLiBUbyB1c2UgVUFSVDIsIHlvdSBtdXN0IGRpc2FibGUgVVNCMiBmaXJzdC4KKyAqLwordm9pZCBfX2luaXQgb21hcF9zZXJpYWxfaW5pdChpbnQgcG9ydHNbT01BUF9NQVhfTlJfUE9SVFNdKQoreworCWludCBpOworCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMF0ucmVnc2hpZnQgPSAwOworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS5yZWdzaGlmdCA9IDA7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzBdLmlycSA9IElOVF83MzBfVUFSVF9NT0RFTV8xOworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVsxXS5pcnEgPSBJTlRfNzMwX1VBUlRfTU9ERU1fSVJEQV8yOworCX0KKworCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVswXS51YXJ0Y2xrID0gT01BUDE1MTBfQkFTRV9CQVVEICogMTY7CisJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhWzFdLnVhcnRjbGsgPSBPTUFQMTUxMF9CQVNFX0JBVUQgKiAxNjsKKwkJc2VyaWFsX3BsYXRmb3JtX2RhdGFbMl0udWFydGNsayA9IE9NQVAxNTEwX0JBU0VfQkFVRCAqIDE2OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBPTUFQX01BWF9OUl9QT1JUUzsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgcmVnOworCisJCWlmIChwb3J0c1tpXSA9PSAwKSB7CisJCQlzZXJpYWxfcGxhdGZvcm1fZGF0YVtpXS5tZW1iYXNlID0gTlVMTDsKKwkJCXNlcmlhbF9wbGF0Zm9ybV9kYXRhW2ldLm1hcGJhc2UgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJdWFydDFfY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0MV9jayIpOworCQkJaWYgKElTX0VSUih1YXJ0MV9jaykpCisJCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQxX2NrXG4iKTsKKwkJCWVsc2UgeworCQkJCWNsa191c2UodWFydDFfY2spOworCQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJCQkJY2xrX3NldF9yYXRlKHVhcnQxX2NrLCAxMjAwMDAwMCk7CisJCQl9CisJCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDFfVFgpOworCQkJCW9tYXBfY2ZnX3JlZyhVQVJUMV9SVFMpOworCQkJCWlmIChtYWNoaW5lX2lzX29tYXBfaW5ub3ZhdG9yKCkpIHsKKwkJCQkJcmVnID0gZnBnYV9yZWFkKE9NQVAxNTEwX0ZQR0FfUE9XRVIpOworCQkJCQlyZWcgfD0gT01BUDE1MTBfRlBHQV9QQ1JfQ09NMV9FTjsKKwkJCQkJZnBnYV93cml0ZShyZWcsIE9NQVAxNTEwX0ZQR0FfUE9XRVIpOworCQkJCQl1ZGVsYXkoMTApOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl1YXJ0Ml9jayA9IGNsa19nZXQoTlVMTCwgInVhcnQyX2NrIik7CisJCQlpZiAoSVNfRVJSKHVhcnQyX2NrKSkKKwkJCQlwcmludGsoIkNvdWxkIG5vdCBnZXQgdWFydDJfY2tcbiIpOworCQkJZWxzZSB7CisJCQkJY2xrX3VzZSh1YXJ0Ml9jayk7CisJCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQkJCQljbGtfc2V0X3JhdGUodWFydDJfY2ssIDEyMDAwMDAwKTsKKwkJCQllbHNlCisJCQkJCWNsa19zZXRfcmF0ZSh1YXJ0Ml9jaywgNDgwMDAwMDApOworCQkJfQorCQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQkJb21hcF9jZmdfcmVnKFVBUlQyX1RYKTsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDJfUlRTKTsKKwkJCQlpZiAobWFjaGluZV9pc19vbWFwX2lubm92YXRvcigpKSB7CisJCQkJCXJlZyA9IGZwZ2FfcmVhZChPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJcmVnIHw9IE9NQVAxNTEwX0ZQR0FfUENSX0NPTTJfRU47CisJCQkJCWZwZ2Ffd3JpdGUocmVnLCBPTUFQMTUxMF9GUEdBX1BPV0VSKTsKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdWFydDNfY2sgPSBjbGtfZ2V0KE5VTEwsICJ1YXJ0M19jayIpOworCQkJaWYgKElTX0VSUih1YXJ0M19jaykpCisJCQkJcHJpbnRrKCJDb3VsZCBub3QgZ2V0IHVhcnQzX2NrXG4iKTsKKwkJCWVsc2UgeworCQkJCWNsa191c2UodWFydDNfY2spOworCQkJCWlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJCQkJY2xrX3NldF9yYXRlKHVhcnQzX2NrLCAxMjAwMDAwMCk7CisJCQl9CisJCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCQlvbWFwX2NmZ19yZWcoVUFSVDNfVFgpOworCQkJCW9tYXBfY2ZnX3JlZyhVQVJUM19SWCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlvbWFwX3NlcmlhbF9yZXNldCgmc2VyaWFsX3BsYXRmb3JtX2RhdGFbaV0pOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgb21hcF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc2VyaWFsX2RldmljZSk7Cit9CithcmNoX2luaXRjYWxsKG9tYXBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDA1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL3RpbWUuYwpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDEvdGltZS5jCisgKgorICogT01BUCBUaW1lcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24KKyAqIFBhcnRpYWwgdGltZXIgcmV3cml0ZSBhbmQgYWRkaXRpb25hbCBkeW5hbWljIHRpY2sgdGltZXIgc3VwcG9ydCBieQorICogVG9ueSBMaW5kZ2VuIDx0b255QGF0b21pZGUuY29tPiBhbmQKKyAqIFR1dWtrYSBUaWtrYW5lbiA8dHV1a2thLnRpa2thbmVuQGVsZWt0cm9iaXQuY29tPgorICoKKyAqIE1QVSB0aW1lciBjb2RlIGJhc2VkIG9uIHRoZSBvbGRlciBNUFUgdGltZXIgY29kZSBmb3IgT01BUAorICogQ29weXJpZ2h0IChDKSAyMDAwIFJpZGdlUnVuLCBJbmMuCisgKiBBdXRob3I6IEdyZWcgTG9ubm9uIDxnbG9ubm9uQHJpZGdlcnVuLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2xlZHMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorCitzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXI7CisKKyNpZmRlZiBDT05GSUdfT01BUF9NUFVfVElNRVIKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTVBVIHRpbWVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBPTUFQX01QVV9USU1FUl9CQVNFCQlPTUFQX01QVV9USU1FUjFfQkFTRQorI2RlZmluZSBPTUFQX01QVV9USU1FUl9PRkZTRVQJCTB4MTAwCisKKy8qIGN5Y2xlcyB0byBuc2VjIGNvbnZlcnNpb25zIHRha2VuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfdHNjLmMsCisgKiBjb252ZXJ0ZWQgdG8gdXNlIGtIeiBieSBLZXZpbiBIaWxtYW4gKi8KKy8qIGNvbnZlcnQgZnJvbSBjeWNsZXMoNjRiaXRzKSA9PiBuYW5vc2Vjb25kcyAoNjRiaXRzKQorICogIGJhc2ljIGVxdWF0aW9uOgorICoJCW5zID0gY3ljbGVzIC8gKGZyZXEgLyBuc19wZXJfc2VjKQorICoJCW5zID0gY3ljbGVzICogKG5zX3Blcl9zZWMgLyBmcmVxKQorICoJCW5zID0gY3ljbGVzICogKDEwXjkgLyAoY3B1X2toeiAqIDEwXjMpKQorICoJCW5zID0gY3ljbGVzICogKDEwXjYgLyBjcHVfa2h6KQorICoKKyAqCVRoZW4gd2UgdXNlIHNjYWxpbmcgbWF0aCAoc3VnZ2VzdGVkIGJ5IGdlb3JnZSBhdCBtdmlzdGEuY29tKSB0byBnZXQ6CisgKgkJbnMgPSBjeWNsZXMgKiAoMTBeNiAqIFNDIC8gY3B1X2toeiAvIFNDCisgKgkJbnMgPSBjeWNsZXMgKiBjeWMybnNfc2NhbGUgLyBTQworICoKKyAqCUFuZCBzaW5jZSBTQyBpcyBhIGNvbnN0YW50IHBvd2VyIG9mIHR3bywgd2UgY2FuIGNvbnZlcnQgdGhlIGRpdgorICogIGludG8gYSBzaGlmdC4KKyAqCQkJLWpvaG5zdHVsIGF0IHVzLmlibS5jb20gIm1hdGggaXMgaGFyZCwgbGV0cyBnbyBzaG9wcGluZyEiCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGN5YzJuc19zY2FsZTsKKyNkZWZpbmUgQ1lDMk5TX1NDQUxFX0ZBQ1RPUiAxMCAvKiAyXjEwLCBjYXJlZnVsbHkgY2hvc2VuICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3ljMm5zX3NjYWxlKHVuc2lnbmVkIGxvbmcgY3B1X2toeikKK3sKKwljeWMybnNfc2NhbGUgPSAoMTAwMDAwMCA8PCBDWUMyTlNfU0NBTEVfRkFDVE9SKS9jcHVfa2h6OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKQoreworCXJldHVybiAoY3ljICogY3ljMm5zX3NjYWxlKSA+PiBDWUMyTlNfU0NBTEVfRkFDVE9SOworfQorCisvKgorICogTVBVX1RJQ0tTX1BFUl9TRUMgbXVzdCBiZSBhbiBldmVuIG51bWJlciwgb3RoZXJ3aXNlIG1hY2hpbmVjeWNsZXNfdG9fdXNlY3MKKyAqIHdpbGwgYnJlYWsuIE9uIFAyLCB0aGUgdGltZXIgY291bnQgcmF0ZSBpcyA2LjUgTUh6IGFmdGVyIHByb2dyYW1taW5nIFBUVgorICogd2l0aCAwLiBUaGlzIGRpdmlkZXMgdGhlIDEzTUh6IGlucHV0IGJ5IDIsIGFuZCBpcyB1bmRvY3VtZW50ZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfTUFDSF9PTUFQX1BFUlNFVVMyCisvKiBSRVZJU0lUOiBUaGlzIGlmZGVmIGNvbnN0cnVjdCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBxdWVyeSB0byBjbG9jaworICogZnJhbWV3b3JrIHRvIHNlZSBpZiB0aW1lciBiYXNlIGZyZXF1ZW5jeSBpcyAxMi4wLCAxMy4wIG9yIDE5LjIgTUh6LgorICovCisjZGVmaW5lIE1QVV9USUNLU19QRVJfU0VDCQkoMTMwMDAwMDAgLyAyKQorI2Vsc2UKKyNkZWZpbmUgTVBVX1RJQ0tTX1BFUl9TRUMJCSgxMjAwMDAwMCAvIDIpCisjZW5kaWYKKworI2RlZmluZSBNUFVfVElNRVJfVElDS19QRVJJT0QJCSgoTVBVX1RJQ0tTX1BFUl9TRUMgLyBIWikgLSAxKQorCit0eXBlZGVmIHN0cnVjdCB7CisJdTMyIGNudGw7CQkJLyogQ05UTF9USU1FUiwgUi9XICovCisJdTMyIGxvYWRfdGltOwkJCS8qIExPQURfVElNLCAgIFcgKi8KKwl1MzIgcmVhZF90aW07CQkJLyogUkVBRF9USU0sICAgUiAqLworfSBvbWFwX21wdV90aW1lcl9yZWdzX3Q7CisKKyNkZWZpbmUgb21hcF9tcHVfdGltZXJfYmFzZShuKQkJCQkJCVwKKygodm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KilJT19BRERSRVNTKE9NQVBfTVBVX1RJTUVSX0JBU0UgKwlcCisJCQkJIChuKSpPTUFQX01QVV9USU1FUl9PRkZTRVQpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgb21hcF9tcHVfdGltZXJfcmVhZChpbnQgbnIpCit7CisJdm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KiB0aW1lciA9IG9tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOworCXJldHVybiB0aW1lci0+cmVhZF90aW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX21wdV90aW1lcl9zdGFydChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgbG9hZF92YWwpCit7CisJdm9sYXRpbGUgb21hcF9tcHVfdGltZXJfcmVnc190KiB0aW1lciA9IG9tYXBfbXB1X3RpbWVyX2Jhc2UobnIpOworCisJdGltZXItPmNudGwgPSBNUFVfVElNRVJfQ0xPQ0tfRU5BQkxFOworCXVkZWxheSgxKTsKKwl0aW1lci0+bG9hZF90aW0gPSBsb2FkX3ZhbDsKKyAgICAgICAgdWRlbGF5KDEpOworCXRpbWVyLT5jbnRsID0gKE1QVV9USU1FUl9DTE9DS19FTkFCTEUgfCBNUFVfVElNRVJfQVIgfCBNUFVfVElNRVJfU1QpOworfQorCit1bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyX3RpY2tzX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgbnJfdGlja3MpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5zZWM7CisKKwluc2VjID0gY3ljbGVzXzJfbnMoKHVuc2lnbmVkIGxvbmcgbG9uZylucl90aWNrcyk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKW5zZWMgLyAxMDAwOworfQorCisvKgorICogTGFzdCBwcm9jZXNzZWQgc3lzdGVtIHRpbWVyIGludGVycnVwdAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX21wdV90aW1lcl9sYXN0ID0gMDsKKworLyoKKyAqIFJldHVybnMgZWxhcHNlZCB1c2VjcyBzaW5jZSBsYXN0IHN5c3RlbSB0aW1lciBpbnRlcnJ1cHQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9tcHVfdGltZXJfZ2V0dGltZW9mZnNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbm93ID0gMCAtIG9tYXBfbXB1X3RpbWVyX3JlYWQoMCk7CisJdW5zaWduZWQgbG9uZyBlbGFwc2VkID0gbm93IC0gb21hcF9tcHVfdGltZXJfbGFzdDsKKworCXJldHVybiBvbWFwX21wdV90aW1lcl90aWNrc190b191c2VjcyhlbGFwc2VkKTsKK30KKworLyoKKyAqIEVsYXBzZWQgdGltZSBiZXR3ZWVuIGludGVycnVwdHMgaXMgY2FsY3VsYXRlZCB1c2luZyB0aW1lcjAuCisgKiBMYXRlbmN5IGR1cmluZyB0aGUgaW50ZXJydXB0IGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGltZXIxLgorICogQm90aCB0aW1lcjAgYW5kIHRpbWVyMSBhcmUgY291bnRpbmcgYXQgNk1IeiAoUDIgNi41TUh6KS4KKyAqLworc3RhdGljIGlycXJldHVybl90IG9tYXBfbXB1X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgbm93LCBsYXRlbmN5OworCisJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CisJbm93ID0gMCAtIG9tYXBfbXB1X3RpbWVyX3JlYWQoMCk7CisJbGF0ZW5jeSA9IE1QVV9USUNLU19QRVJfU0VDIC8gSFogLSBvbWFwX21wdV90aW1lcl9yZWFkKDEpOworCW9tYXBfbXB1X3RpbWVyX2xhc3QgPSBub3cgLSBsYXRlbmN5OworCXRpbWVyX3RpY2socmVncyk7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF9tcHVfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICJtcHUgdGltZXIiLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IG9tYXBfbXB1X3RpbWVyX2ludGVycnVwdCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfbXB1X3RpbWVyMV9vdmVyZmxvd3M7CitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9tcHVfdGltZXIxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJb21hcF9tcHVfdGltZXIxX292ZXJmbG93cysrOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF9tcHVfdGltZXIxX2lycSA9IHsKKwkubmFtZQkJPSAibXB1IHRpbWVyMSBvdmVyZmxvdyIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKKwkuaGFuZGxlcgk9IG9tYXBfbXB1X3RpbWVyMV9pbnRlcnJ1cHQsCit9OworCitzdGF0aWMgX19pbml0IHZvaWQgb21hcF9pbml0X21wdV90aW1lcih2b2lkKQoreworCXNldF9jeWMybnNfc2NhbGUoTVBVX1RJQ0tTX1BFUl9TRUMgLyAxMDAwKTsKKwlvbWFwX3RpbWVyLm9mZnNldCA9IG9tYXBfbXB1X3RpbWVyX2dldHRpbWVvZmZzZXQ7CisJc2V0dXBfaXJxKElOVF9USU1FUjEsICZvbWFwX21wdV90aW1lcjFfaXJxKTsKKwlzZXR1cF9pcnEoSU5UX1RJTUVSMiwgJm9tYXBfbXB1X3RpbWVyX2lycSk7CisJb21hcF9tcHVfdGltZXJfc3RhcnQoMCwgMHhmZmZmZmZmZik7CisJb21hcF9tcHVfdGltZXJfc3RhcnQoMSwgTVBVX1RJTUVSX1RJQ0tfUEVSSU9EKTsKK30KKworLyoKKyAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdGlja3MgPSAwIC0gb21hcF9tcHVfdGltZXJfcmVhZCgwKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGlja3M2NDsKKworCXRpY2tzNjQgPSBvbWFwX21wdV90aW1lcjFfb3ZlcmZsb3dzOworCXRpY2tzNjQgPDw9IDMyOworCXRpY2tzNjQgfD0gdGlja3M7CisKKwlyZXR1cm4gY3ljbGVzXzJfbnModGlja3M2NCk7Cit9CisjZW5kaWYJLyogQ09ORklHX09NQVBfTVBVX1RJTUVSICovCisKKyNpZmRlZiBDT05GSUdfT01BUF8zMktfVElNRVIKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisjZXJyb3IgT01BUCAzMktIeiB0aW1lciBkb2VzIG5vdCBjdXJyZW50bHkgd29yayBvbiAxNTEwIQorI2VuZGlmCisKKy8qCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDMyS0h6IE9TIHRpbWVyCisgKgorICogVGhpcyBjdXJyZW50bHkgd29ya3Mgb25seSBvbiAxNnh4LCBhcyAxNTEwIGRvZXMgbm90IGhhdmUgdGhlIGNvbnRpbnVvdXMKKyAqIDMyS0h6IHN5bmNocm9ub3VzIHRpbWVyLiBUaGUgMzJLSHogc3luY2hyb25vdXMgdGltZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrCisgKiBvZiB0aW1lIGluIGFkZGl0aW9uIHRvIHRoZSAzMktIeiBPUyB0aW1lci4gVXNpbmcgb25seSB0aGUgMzJLSHogT1MgdGltZXIKKyAqIG9uIDE1MTAgd291bGQgYmUgcG9zc2libGUsIGJ1dCB0aGUgdGltZXIgd291bGQgbm90IGJlIGFzIGFjY3VyYXRlIGFzCisgKiB3aXRoIHRoZSAzMktIeiBzeW5jaHJvbml6ZWQgdGltZXIuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBPTUFQXzMyS19USU1FUl9CQVNFCQkweGZmZmI5MDAwCisjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX0NSCQkweDA4CisjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX1RWUgkJMHgwMAorI2RlZmluZSBPTUFQXzMyS19USU1FUl9UQ1IJCTB4MDQKKworI2RlZmluZSBPTUFQXzMyS19USUNLU19QRVJfSFoJCSgzMjc2OCAvIEhaKQorI2lmICgzMjc2OCAlIEhaKSAhPSAwCisvKiBXZSBjYW5ub3QgaWdub3JlIG1vZHVsby4KKyAqIFBvdGVudGlhbCBlcnJvciBjYW4gYmUgYXMgaGlnaCBhcyBzZXZlcmFsIHBlcmNlbnQuCisgKi8KKyNkZWZpbmUgT01BUF8zMktfVElDS19NT0RVTE8JCSgzMjc2OCAlIEhaKQorc3RhdGljIHVuc2lnbmVkIG1vZHVsb19jb3VudCA9IDA7IC8qIENvdW50cyAxL0haIHVuaXRzICovCisjZW5kaWYKKworLyoKKyAqIFRSTSBzYXlzIDEgLyBIWiA9ICggVFZSICsgMSkgLyAzMjc2OCwgc28gVFJWID0gKDMyNzY4IC8gSFopIC0gMQorICogc28gd2l0aCBIWiA9IDEwMCwgVFZSID0gMzI3LjY4LgorICovCisjZGVmaW5lIE9NQVBfMzJLX1RJTUVSX1RJQ0tfUEVSSU9ECSgoMzI3NjggLyBIWikgLSAxKQorI2RlZmluZSBUSU1FUl8zMktfU1lOQ0hST05JWkVECQkweGZmZmJjNDEwCisKKyNkZWZpbmUgSklGRklFU19UT19IV19USUNLUyhucl9qaWZmaWVzLCBjbG9ja19yYXRlKQkJCVwKKwkJCQkoKChucl9qaWZmaWVzKSAqIChjbG9ja19yYXRlKSkgLyBIWikKKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfMzJrX3RpbWVyX3dyaXRlKGludCB2YWwsIGludCByZWcpCit7CisJb21hcF93cml0ZXcodmFsLCByZWcgKyBPTUFQXzMyS19USU1FUl9CQVNFKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX3RpbWVyX3JlYWQoaW50IHJlZykKK3sKKwlyZXR1cm4gb21hcF9yZWFkbChyZWcgKyBPTUFQXzMyS19USU1FUl9CQVNFKSAmIDB4ZmZmZmZmOworfQorCisvKgorICogVGhlIDMyS0h6IHN5bmNocm9uaXplZCB0aW1lciBpcyBhbiBhZGRpdGlvbmFsIHRpbWVyIG9uIDE2eHguCisgKiBJdCBpcyBhbHdheXMgcnVubmluZy4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX3N5bmNfdGltZXJfcmVhZCh2b2lkKQoreworCXJldHVybiBvbWFwX3JlYWRsKFRJTUVSXzMyS19TWU5DSFJPTklaRUQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF8zMmtfdGltZXJfc3RhcnQodW5zaWduZWQgbG9uZyBsb2FkX3ZhbCkKK3sKKwlvbWFwXzMya190aW1lcl93cml0ZShsb2FkX3ZhbCwgT01BUF8zMktfVElNRVJfVFZSKTsKKwlvbWFwXzMya190aW1lcl93cml0ZSgweDBmLCBPTUFQXzMyS19USU1FUl9DUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwXzMya190aW1lcl9zdG9wKHZvaWQpCit7CisJb21hcF8zMmtfdGltZXJfd3JpdGUoMHgwLCBPTUFQXzMyS19USU1FUl9DUik7Cit9CisKKy8qCisgKiBSb3VuZHMgZG93biB0byBuZWFyZXN0IHVzZWMKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX3RpY2tzX3RvX3VzZWNzKHVuc2lnbmVkIGxvbmcgdGlja3NfMzJrKQoreworCXJldHVybiAodGlja3NfMzJrICogNSo1KjUqNSo1KjUpID4+IDk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX2xhc3RfdGljayA9IDA7CisKKy8qCisgKiBSZXR1cm5zIGVsYXBzZWQgdXNlY3Mgc2luY2UgbGFzdCAzMmsgdGltZXIgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfMzJrX3RpbWVyX2dldHRpbWVvZmZzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdyA9IG9tYXBfMzJrX3N5bmNfdGltZXJfcmVhZCgpOworCXJldHVybiBvbWFwXzMya190aWNrc190b191c2Vjcyhub3cgLSBvbWFwXzMya19sYXN0X3RpY2spOworfQorCisvKgorICogVGltZXIgaW50ZXJydXB0IGZvciAzMktIeiB0aW1lci4gV2hlbiBkeW5hbWljIHRpY2sgaXMgZW5hYmxlZCwgdGhpcworICogZnVuY3Rpb24gaXMgYWxzbyBjYWxsZWQgZnJvbSBvdGhlciBpbnRlcnJ1cHRzIHRvIHJlbW92ZSBsYXRlbmN5CisgKiBpc3N1ZXMgd2l0aCBkeW5hbWljIHRpY2suIEluIHRoZSBkeW5hbWljIHRpY2sgY2FzZSwgd2UgbmVlZCB0byBsb2NrCisgKiB3aXRoIGlycXNhdmUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwXzMya190aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCW5vdyA9IG9tYXBfMzJrX3N5bmNfdGltZXJfcmVhZCgpOworCisJd2hpbGUgKG5vdyAtIG9tYXBfMzJrX2xhc3RfdGljayA+PSBPTUFQXzMyS19USUNLU19QRVJfSFopIHsKKyNpZmRlZiBPTUFQXzMyS19USUNLX01PRFVMTworCQkvKiBNb2R1bG8gYWRkaXRpb24gbWF5IHB1dCBvbWFwXzMya19sYXN0X3RpY2sgYWhlYWQgb2Ygbm93CisJCSAqIGFuZCBjYXVzZSB1bndhbnRlZCByZXBldGl0aW9uIG9mIHRoZSB3aGlsZSBsb29wLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KG5vdyAtIG9tYXBfMzJrX2xhc3RfdGljayA9PSB+MCkpCisJCQlicmVhazsKKworCQltb2R1bG9fY291bnQgKz0gT01BUF8zMktfVElDS19NT0RVTE87CisJCWlmIChtb2R1bG9fY291bnQgPiBIWikgeworCQkJKytvbWFwXzMya19sYXN0X3RpY2s7CisJCQltb2R1bG9fY291bnQgLT0gSFo7CisJCX0KKyNlbmRpZgorCQlvbWFwXzMya19sYXN0X3RpY2sgKz0gT01BUF8zMktfVElDS1NfUEVSX0haOworCQl0aW1lcl90aWNrKHJlZ3MpOworCX0KKworCS8qIFJlc3RhcnQgdGltZXIgc28gd2UgZG9uJ3QgZHJpZnQgb2ZmIGR1ZSB0byBtb2R1bG8gb3IgZHluYW1pYyB0aWNrLgorCSAqIEJ5IGRlZmF1bHQgd2UgcHJvZ3JhbSB0aGUgbmV4dCB0aW1lciB0byBiZSBjb250aW51b3VzIHRvIGF2b2lkCisJICogbGF0ZW5jaWVzIGR1cmluZyBoaWdoIHN5c3RlbSBsb2FkLiBEdXJpbmcgZHluYW1pYyB0aWNrIG9wZXJhdGlvbiB0aGUKKwkgKiBjb250aW51b3VzIHRpbWVyIGNhbiBiZSBvdmVycmlkZGVuIGZyb20gcG1faWRsZSB0byBiZSBsb25nZXIuCisJICovCisJb21hcF8zMmtfdGltZXJfc3RhcnQob21hcF8zMmtfbGFzdF90aWNrICsgT01BUF8zMktfVElDS1NfUEVSX0haIC0gbm93KTsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKy8qCisgKiBQcm9ncmFtcyB0aGUgbmV4dCB0aW1lciBpbnRlcnJ1cHQgbmVlZGVkLiBDYWxsZWQgd2hlbiBkeW5hbWljIHRpY2sgaXMKKyAqIGVuYWJsZWQsIGFuZCB0byByZXByb2dyYW0gdGhlIHRpY2tzIHRvIHNraXAgZnJvbSBwbV9pZGxlLiBOb3RlIHRoYXQKKyAqIHdlIGNhbiBrZWVwIHRoZSB0aW1lciBjb250aW51b3VzLCBhbmQgZG9uJ3QgbmVlZCB0byBzZXQgaXQgdG8gcnVuIGluCisgKiBvbmUtc2hvdCBtb2RlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIHdpbGwgZ2V0IHJlcHJvZ3JhbW1lZCBhZ2FpbgorICogYWZ0ZXIgbmV4dCBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgb21hcF8zMmtfdGltZXJfcmVwcm9ncmFtKHVuc2lnbmVkIGxvbmcgbmV4dF90aWNrKQoreworCW9tYXBfMzJrX3RpbWVyX3N0YXJ0KEpJRkZJRVNfVE9fSFdfVElDS1MobmV4dF90aWNrLCAzMjc2OCkgKyAxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF8zMmtfdGltZXJfaXJxOworZXh0ZXJuIHN0cnVjdCB0aW1lcl91cGRhdGVfaGFuZGxlciB0aW1lcl91cGRhdGU7CisKK3N0YXRpYyBpbnQgb21hcF8zMmtfdGltZXJfZW5hYmxlX2R5bl90aWNrKHZvaWQpCit7CisJLyogTm8gbmVlZCB0byByZXByb2dyYW0gdGltZXIsIGp1c3QgdXNlIHRoZSBuZXh0IGludGVycnVwdCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfMzJrX3RpbWVyX2Rpc2FibGVfZHluX3RpY2sodm9pZCkKK3sKKwlvbWFwXzMya190aW1lcl9zdGFydChPTUFQXzMyS19USU1FUl9USUNLX1BFUklPRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHluX3RpY2tfdGltZXIgb21hcF9keW5fdGlja190aW1lciA9IHsKKwkuZW5hYmxlCQk9IG9tYXBfMzJrX3RpbWVyX2VuYWJsZV9keW5fdGljaywKKwkuZGlzYWJsZQk9IG9tYXBfMzJrX3RpbWVyX2Rpc2FibGVfZHluX3RpY2ssCisJLnJlcHJvZ3JhbQk9IG9tYXBfMzJrX3RpbWVyX3JlcHJvZ3JhbSwKKwkuaGFuZGxlcgk9IG9tYXBfMzJrX3RpbWVyX2ludGVycnVwdCwKK307CisjZW5kaWYJLyogQ09ORklHX05PX0lETEVfSFogKi8KKworc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gb21hcF8zMmtfdGltZXJfaXJxID0geworCS5uYW1lCQk9ICIzMktIeiB0aW1lciIsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gb21hcF8zMmtfdGltZXJfaW50ZXJydXB0LAorfTsKKworc3RhdGljIF9faW5pdCB2b2lkIG9tYXBfaW5pdF8zMmtfdGltZXIodm9pZCkKK3sKKworI2lmZGVmIENPTkZJR19OT19JRExFX0haCisJb21hcF90aW1lci5keW5fdGljayA9ICZvbWFwX2R5bl90aWNrX3RpbWVyOworI2VuZGlmCisKKwlzZXR1cF9pcnEoSU5UX09TX1RJTUVSLCAmb21hcF8zMmtfdGltZXJfaXJxKTsKKwlvbWFwX3RpbWVyLm9mZnNldCAgPSBvbWFwXzMya190aW1lcl9nZXR0aW1lb2Zmc2V0OworCW9tYXBfMzJrX2xhc3RfdGljayA9IG9tYXBfMzJrX3N5bmNfdGltZXJfcmVhZCgpOworCW9tYXBfMzJrX3RpbWVyX3N0YXJ0KE9NQVBfMzJLX1RJTUVSX1RJQ0tfUEVSSU9EKTsKK30KKyNlbmRpZgkvKiBDT05GSUdfT01BUF8zMktfVElNRVIgKi8KKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGltZXIgaW5pdGlhbGl6YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgb21hcF90aW1lcl9pbml0KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9NUFVfVElNRVIpCisJb21hcF9pbml0X21wdV90aW1lcigpOworI2VsaWYgZGVmaW5lZChDT05GSUdfT01BUF8zMktfVElNRVIpCisJb21hcF9pbml0XzMya190aW1lcigpOworI2Vsc2UKKyNlcnJvciBObyBzeXN0ZW0gdGltZXIgc2VsZWN0ZWQgaW4gS2NvbmZpZyEKKyNlbmRpZgorfQorCitzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXIgPSB7CisJLmluaXQJCT0gb21hcF90aW1lcl9pbml0LAorCS5vZmZzZXQJCT0gTlVMTCwJCS8qIEluaXRpYWxpemVkIGxhdGVyICovCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQppbmRleCBjNGU2ZDI1Li5lZmMyZjY1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXB4YS9NYWtlZmlsZQpAQCAtMjQsMyArMjQsNyBAQAogCiAjIE1pc2MgZmVhdHVyZXMKIG9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCisKK2lmZXEgKCQoQ09ORklHX1BYQTI3eCkseSkKK29iai0kKENPTkZJR19QTSkgKz0gc3RhbmRieS5vCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKaW5kZXggZjY5MWNmNy4uODZiODYyZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCkBAIC0yODcsMzQgKzI4Nyw0MCBAQAogCiAjaWZkZWYgQ09ORklHX01BQ0hfQ09SR0kKIE1BQ0hJTkVfU1RBUlQoQ09SR0ksICJTSEFSUCBDb3JnaSIpCi0JQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQotCUZJWFVQKGZpeHVwX2NvcmdpKQotCU1BUElPKGNvcmdpX21hcF9pbykKLQlJTklUSVJRKGNvcmdpX2luaXRfaXJxKQotCS5pbml0X21hY2hpbmUgPSBjb3JnaV9pbml0LAotCS50aW1lciA9ICZweGFfdGltZXIsCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmZpeHVwCQk9IGZpeHVwX2NvcmdpLAorCS5tYXBfaW8JCT0gY29yZ2lfbWFwX2lvLAorCS5pbml0X2lycQk9IGNvcmdpX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBjb3JnaV9pbml0LAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAogTUFDSElORV9FTkQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01BQ0hfU0hFUEhFUkQKIE1BQ0hJTkVfU1RBUlQoU0hFUEhFUkQsICJTSEFSUCBTaGVwaGVyZCIpCi0JQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQotCUZJWFVQKGZpeHVwX2NvcmdpKQotCU1BUElPKGNvcmdpX21hcF9pbykKLQlJTklUSVJRKGNvcmdpX2luaXRfaXJxKQotCS5pbml0X21hY2hpbmUgPSBjb3JnaV9pbml0LAotCS50aW1lciA9ICZweGFfdGltZXIsCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmZpeHVwCQk9IGZpeHVwX2NvcmdpLAorCS5tYXBfaW8JCT0gY29yZ2lfbWFwX2lvLAorCS5pbml0X2lycQk9IGNvcmdpX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBjb3JnaV9pbml0LAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAogTUFDSElORV9FTkQKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01BQ0hfSFVTS1kKIE1BQ0hJTkVfU1RBUlQoSFVTS1ksICJTSEFSUCBIdXNreSIpCi0JQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQotCUZJWFVQKGZpeHVwX2NvcmdpKQotCU1BUElPKGNvcmdpX21hcF9pbykKLQlJTklUSVJRKGNvcmdpX2luaXRfaXJxKQotCS5pbml0X21hY2hpbmUgPSBjb3JnaV9pbml0LAotCS50aW1lciA9ICZweGFfdGltZXIsCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmZpeHVwCQk9IGZpeHVwX2NvcmdpLAorCS5tYXBfaW8JCT0gY29yZ2lfbWFwX2lvLAorCS5pbml0X2lycQk9IGNvcmdpX2luaXRfaXJxLAorCS5pbml0X21hY2hpbmUJPSBjb3JnaV9pbml0LAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAogTUFDSElORV9FTkQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCmluZGV4IGM1YTY2YmYuLjM4NmUxMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCkBAIC0xODEsMTAgKzE4MSwxMiBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoUFhBX0lEUCwgIlZpYnJlbiBQWEEyNTUgSURQIikKLQlNQUlOVEFJTkVSKCJWaWJyZW4gVGVjaG5vbG9naWVzIikKLQlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCi0JTUFQSU8oaWRwX21hcF9pbykKLQlJTklUSVJRKGlkcF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBWaWJyZW4gVGVjaG5vbG9naWVzICovCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBpZHBfbWFwX2lvLAorCS5pbml0X2lycQk9IGlkcF9pbml0X2lycSwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKLQlJTklUX01BQ0hJTkUoaWRwX2luaXQpCisJLmluaXRfbWFjaGluZQk9IGlkcF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYyBiL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYwppbmRleCBmMmM5ZTBkLi42MzA5ODUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCkBAIC0yNjgsMTAgKzI2OCwxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUKExVQkJPQ0ssICJJbnRlbCBEQlBYQTI1MCBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoYWthIEx1YmJvY2spIikKLQlNQUlOVEFJTkVSKCJNb250YVZpc3RhIFNvZnR3YXJlIEluYy4iKQotCUJPT1RfTUVNKDB4YTAwMDAwMDAsIDB4NDAwMDAwMDAsIGlvX3AydigweDQwMDAwMDAwKSkKLQlNQVBJTyhsdWJib2NrX21hcF9pbykKLQlJTklUSVJRKGx1YmJvY2tfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuICovCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBsdWJib2NrX21hcF9pbywKKwkuaW5pdF9pcnEJPSBsdWJib2NrX2luaXRfaXJxLAogCS50aW1lcgkJPSAmcHhhX3RpbWVyLAotCUlOSVRfTUFDSElORShsdWJib2NrX2luaXQpCisJLmluaXRfbWFjaGluZQk9IGx1YmJvY2tfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9tYWluc3RvbmUuYyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCmluZGV4IDk4OTZhZmMuLjgyN2I3YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL21haW5zdG9uZS5jCkBAIC0zNDUsMTAgKzM0NSwxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUKE1BSU5TVE9ORSwgIkludGVsIEhDRERCQlZBMCBEZXZlbG9wbWVudCBQbGF0Zm9ybSAoYWthIE1haW5zdG9uZSkiKQotCU1BSU5UQUlORVIoIk1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLiIpCi0JQk9PVF9NRU0oMHhhMDAwMDAwMCwgMHg0MDAwMDAwMCwgaW9fcDJ2KDB4NDAwMDAwMDApKQotCU1BUElPKG1haW5zdG9uZV9tYXBfaW8pCi0JSU5JVElSUShtYWluc3RvbmVfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuICovCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBtYWluc3RvbmVfbWFwX2lvLAorCS5pbml0X2lycQk9IG1haW5zdG9uZV9pbml0X2lycSwKIAkudGltZXIJCT0gJnB4YV90aW1lciwKLQlJTklUX01BQ0hJTkUobWFpbnN0b25lX2luaXQpCisJLmluaXRfbWFjaGluZQk9IG1haW5zdG9uZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3Bvb2RsZS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKaW5kZXggYjZjNzQ2ZS4uMGU0ZjZmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvcG9vZGxlLmMKQEAgLTE4MCwxMCArMTgwLDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoUE9PRExFLCAiU0hBUlAgUG9vZGxlIikKLQlCT09UX01FTSgweGEwMDAwMDAwLCAweDQwMDAwMDAwLCBpb19wMnYoMHg0MDAwMDAwMCkpCi0JRklYVVAoZml4dXBfcG9vZGxlKQotCU1BUElPKHBvb2RsZV9tYXBfaW8pCi0JSU5JVElSUShweGFfaW5pdF9pcnEpCi0JLnRpbWVyID0gJnB4YV90aW1lciwKLQkuaW5pdF9tYWNoaW5lID0gcG9vZGxlX2luaXQsCisJLnBoeXNfcmFtCT0gMHhhMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKGlvX3AydigweDQwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmZpeHVwCQk9IGZpeHVwX3Bvb2RsZSwKKwkubWFwX2lvCQk9IHBvb2RsZV9tYXBfaW8sCisJLmluaXRfaXJxCT0gcHhhX2luaXRfaXJxLAorCS50aW1lcgkJPSAmcHhhX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBwb29kbGVfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9weGEyN3guYyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCmluZGV4IDg5Mzk2NGYuLjlhNzkxYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3B4YTI3eC5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIHsKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBQTV9TVVNQRU5EX01FTToKKwljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKIAkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzgsNyArMTM5LDEwIEBACiAJZXh0ZXJuIHZvaWQgcHhhX2NwdV9zdXNwZW5kKHVuc2lnbmVkIGludCk7CiAJZXh0ZXJuIHZvaWQgcHhhX2NwdV9yZXN1bWUodm9pZCk7CiAKLQlDS0VOID0gQ0tFTjIyX01FTUMgfCBDS0VOOV9PU1RJTUVSOworCWlmIChzdGF0ZSA9PSBQTV9TVVNQRU5EX1NUQU5EQlkpCisJCUNLRU4gPSBDS0VOMjJfTUVNQyB8IENLRU45X09TVElNRVIgfCBDS0VOMTZfTENEIHxDS0VOMF9QV00wOworCWVsc2UKKwkJQ0tFTiA9IENLRU4yMl9NRU1DIHwgQ0tFTjlfT1NUSU1FUjsKIAogCS8qIGVuc3VyZSB2b2x0YWdlLWNoYW5nZSBzZXF1ZW5jZXIgbm90IGluaXRpYXRlZCwgd2hpY2ggaGFuZ3MgKi8KIAlQQ0ZSICY9IH5QQ0ZSX0ZWQzsKQEAgLTE0Nyw2ICsxNTEsOSBAQAogCVBFRFIgPSAweERGMTJGRTFCOwogCiAJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCQlweGFfY3B1X3N0YW5kYnkoKTsKKwkJYnJlYWs7CiAJY2FzZSBQTV9TVVNQRU5EX01FTToKIAkJLyogc2V0IHJlc3VtZSByZXR1cm4gYWRkcmVzcyAqLwogCQlQU1BSID0gdmlydF90b19waHlzKHB4YV9jcHVfcmVzdW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3N0YW5kYnkuUyBiL2FyY2gvYXJtL21hY2gtcHhhL3N0YW5kYnkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTNmMjdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvc3RhbmRieS5TCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBQWEEyN3ggc3RhbmRieSBtb2RlCisgKgorICogQXV0aG9yOiBEYXZpZCBCdXJyYWdlCisgKgorICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3B4YS1yZWdzLmg+CisKKwkJLnRleHQKKworRU5UUlkocHhhX2NwdV9zdGFuZGJ5KQorCWxkcglyMCwgPVBTU1IKKwltb3YJcjEsICMoUFNTUl9QSCB8IFBTU1JfU1RTKQorCW1vdglyMiwgIzIKKwltb3YJcjMsICNVTkNBQ0hFRF9QSFlTXzAJQCBSZWFkIG1lbSBjb250ZXh0IGluLgorCWxkcglpcCwgW3IzXQorCWIJMWYKKworCS5hbGlnbgk1CisxOgltY3IJcDE0LCAwLCByMiwgYzcsIGMwLCAwCUAgcHV0IHRoZSBzeXN0ZW0gaW50byBTdGFuZGJ5CisJc3RyCXIxLCBbcjBdCQlAIG1ha2Ugc3VyZSBQU1NSX1BIL1NUUyBhcmUgY2xlYXIKKwltb3YJcGMsIGxyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKaW5kZXggNDczZmI2MS4uNmU1MjAyMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwpAQCAtMTA1LDggKzEwNSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHB4YV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIlBYQSBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gcHhhX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IHB4YV90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHhhX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcnBjL3Jpc2NwYy5jIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKaW5kZXggNDM3MTA2OC4uYTEwMjY4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1ycGMvcmlzY3BjLmMKQEAgLTE2MywxMiArMTYzLDE0IEBACiBleHRlcm4gc3RydWN0IHN5c190aW1lciBpb2NfdGltZXI7CiAKIE1BQ0hJTkVfU1RBUlQoUklTQ1BDLCAiQWNvcm4tUmlzY1BDIikKLQlNQUlOVEFJTkVSKCJSdXNzZWxsIEtpbmciKQotCUJPT1RfTUVNKDB4MTAwMDAwMDAsIDB4MDMwMDAwMDAsIDB4ZTAwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgxMDAwMDEwMCkKLQlESVNBQkxFX1BBUlBPUlQoMCkKLQlESVNBQkxFX1BBUlBPUlQoMSkKLQlNQVBJTyhycGNfbWFwX2lvKQotCUlOSVRJUlEocnBjX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IFJ1c3NlbGwgS2luZyAqLworCS5waHlzX3JhbQk9IDB4MTAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDAzMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhlMDAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MTAwMDAxMDAsCisJLnJlc2VydmVfbHAwCT0gMSwKKwkucmVzZXJ2ZV9scDEJPSAxLAorCS5tYXBfaW8JCT0gcnBjX21hcF9pbywKKwkuaW5pdF9pcnEJPSBycGNfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZpb2NfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwppbmRleCA1MzRkZjBjLi5kNGQwM2QwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvS2NvbmZpZwpAQCAtMTU0LDYgKzE1NCwxMSBAQAogCSAgdGhlIENSQyBkYXRhIGJsb2NrIHdpbGwgdGFrZSBtb3JlIG1lbW9yeSwgYnV0IHdpbCBpZGVudGlmeSBhbnkKIAkgIGZhdWx0cyB3aXRoIGJldHRlciBwcmVjaXNpb24uCiAKK2NvbmZpZyBQTV9TSU1URUMKKwlib29sCisJZGVwZW5kcyBvbiBQTSAmJiAoQVJDSF9CQVNUIHx8IE1BQ0hfVlIxMDAwKQorCWRlZmF1bHQgeQorCiBjb25maWcgUzNDMjQxMF9MT1dMRVZFTF9VQVJUX1BPUlQKIAlpbnQgIlMzQzI0MTAgVUFSVCB0byB1c2UgZm9yIGxvdy1sZXZlbCBtZXNzYWdlcyIKIAlkZWZhdWx0IDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQppbmRleCA3YzM3OWFhLi5mOTliNjg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCkBAIC0xOCw2ICsxOCw3IEBACiAjIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydAogCiBvYmotJChDT05GSUdfUE0pCSAgICs9IHBtLm8gc2xlZXAubworb2JqLSQoQ09ORklHX1BNX1NJTVRFQykJICAgKz0gcG0tc2ltdGVjLm8KIAogIyBTM0MyNDQwIHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9kZXZzLmMKaW5kZXggNjQ3OTJmNi4uNDY2NGJkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2RldnMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvZGV2cy5jCkBAIC05Niw4ICs5Niw4IEBACiAJLm51bV9yZXNvdXJjZXMJICA9IEFSUkFZX1NJWkUoczNjX2xjZF9yZXNvdXJjZSksCiAJLnJlc291cmNlCSAgPSBzM2NfbGNkX3Jlc291cmNlLAogCS5kZXYgICAgICAgICAgICAgID0gewotCQkuZG1hX21hc2sgPSAmczNjX2RldmljZV9sY2RfZG1hbWFzaywKLQkJLmNvaGVyZW50X2RtYV9tYXNrID0gMHhmZmZmZmZmZlVMCisJCS5kbWFfbWFzawkJPSAmczNjX2RldmljZV9sY2RfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZlVMCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCmluZGV4IGI2NjhjNDguLmNmOWY0NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKQEAgLTQwLDggKzQwLDExIEBACiAgKiAgIDA0LU5vdi0yMDA0ICBCZW4gRG9va3MKICAqCQkgIEZpeCBzdGFuZGFyZCBJUlEgd2FrZSBmb3IgRUlOVDAuLjQgYW5kIFJUQwogICoKLSAqICAgMjItRmViLTIwMDQgIEJlbiBEb29rcworICogICAyMi1GZWItMjAwNSAgQmVuIERvb2tzCiAgKgkJICBGaXhlZCBlZGdlLXRyaWdnZXJpbmcgb24gQURDIElSUQorICoKKyAqICAgMjgtSnVuLTIwMDUgIEJlbiBEb29rcworICoJCSAgTWFyayBJUlFfTENEIHZhbGlkCiAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzY2LDcgKzM2OSw2IEBACiAjZGVmaW5lIElOVE1TS19VQVJUMQkgKDFVTCA8PCAoSVJRX1VBUlQxIC0gSVJRX0VJTlQwKSkKICNkZWZpbmUgSU5UTVNLX1VBUlQyCSAoMVVMIDw8IChJUlFfVUFSVDIgLSBJUlFfRUlOVDApKQogI2RlZmluZSBJTlRNU0tfQURDUEFSRU5UICgxVUwgPDwgKElSUV9BRENQQVJFTlQgLSBJUlFfRUlOVDApKQotI2RlZmluZSBJTlRNU0tfTENECSAoMVVMIDw8IChJUlFfTENEIC0gSVJRX0VJTlQwKSkKIAogc3RhdGljIGlubGluZSB2b2lkCiBzM2NfaXJxc3ViX21hc2sodW5zaWduZWQgaW50IGlycW5vLCB1bnNpZ25lZCBpbnQgcGFyZW50Yml0LApAQCAtNzE2LDcgKzcxOCw2IEBACiAJCWNhc2UgSVJRX1VBUlQwOgogCQljYXNlIElSUV9VQVJUMToKIAkJY2FzZSBJUlFfVUFSVDI6Ci0JCWNhc2UgSVJRX0xDRDoKIAkJY2FzZSBJUlFfQURDUEFSRU5UOgogCQkJc2V0X2lycV9jaGlwKGlycW5vLCAmczNjX2lycV9sZXZlbF9jaGlwKTsKIAkJCXNldF9pcnFfaGFuZGxlcihpcnFubywgZG9fbGV2ZWxfSVJRKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWJhc3QuYwppbmRleCAzYmI5N2ViLi5jY2I2YmNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1iYXN0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtYmFzdC5jCkBAIC0yNiw2ICsyNiw4IEBACiAgKiAgICAgMDMtTWFyLTIwMDUgQkpEICBFbnN1cmVkIHRoYXQgYmFzdC1jcGxkLmggaXMgaW5jbHVkZWQKICAqICAgICAxMC1NYXItMjAwNSBMQ1ZSIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCiAgKiAgICAgMTQtTWFyLTIwMDYgQkpEICBVcGRhdGVkIGZvciBfX2lvbWVtIGNoYW5nZXMKKyAqICAgICAyMi1KdW4tMjAwNiBCSkQgIEFkZGVkIERNOTAwMCBwbGF0Zm9ybSBpbmZvcm1hdGlvbgorICogICAgIDI4LUp1bi0yMDA2IEJKRCAgTW92ZWQgcG0gZnVuY3Rpb25hbGl0eSBvdXQgdG8gY29tbW9uIGNvZGUKICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM1LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbTkwMDAuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KQEAgLTUzLDYgKzU2LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtbWVtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1sY2QuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9uYW5kLmg+CiAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CkBAIC02NCw3ICs2OCw2IEBACiAjaW5jbHVkZSAiZGV2cy5oIgogI2luY2x1ZGUgImNwdS5oIgogI2luY2x1ZGUgInVzYi1zaW10ZWMuaCIKLSNpbmNsdWRlICJwbS5oIgogCiAjZGVmaW5lIENPUFlSSUdIVCAiLCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcyIKIApAQCAtMTEyLDcgKzExNSw2IEBACiAgIHsgVkFfQzIoQkFTVF9WQV9JU0FNRU0pLCAgUEFfQ1MyKEJBU1RfUEFfSVNBTUVNKSwgICBTWl8xNk0sIE1UX0RFVklDRSB9LAogICB7IFZBX0MyKEJBU1RfVkFfQVNJWE5FVCksIFBBX0NTMyhCQVNUX1BBX0FTSVhORVQpLCAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMihCQVNUX1ZBX1NVUEVSSU8pLCBQQV9DUzIoQkFTVF9QQV9TVVBFUklPKSwgIFNaXzFNLCAgTVRfREVWSUNFIH0sCi0gIHsgVkFfQzIoQkFTVF9WQV9ETTkwMDApLCAgUEFfQ1MyKEJBU1RfUEFfRE05MDAwKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0MyKEJBU1RfVkFfSURFUFJJKSwgIFBBX0NTMyhCQVNUX1BBX0lERVBSSSksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMihCQVNUX1ZBX0lERVNFQyksICBQQV9DUzMoQkFTVF9QQV9JREVTRUMpLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzIoQkFTVF9WQV9JREVQUklBVVgpLCBQQV9DUzMoQkFTVF9QQV9JREVQUklBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCkBAIC0xMjMsNyArMTI1LDYgQEAKICAgeyBWQV9DMyhCQVNUX1ZBX0lTQU1FTSksICBQQV9DUzMoQkFTVF9QQV9JU0FNRU0pLCAgIFNaXzE2TSwgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzMoQkFTVF9WQV9BU0lYTkVUKSwgUEFfQ1MzKEJBU1RfUEFfQVNJWE5FVCksICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0MzKEJBU1RfVkFfU1VQRVJJTyksIFBBX0NTMyhCQVNUX1BBX1NVUEVSSU8pLCAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKLSAgeyBWQV9DMyhCQVNUX1ZBX0RNOTAwMCksICBQQV9DUzMoQkFTVF9QQV9ETTkwMDApLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzMoQkFTVF9WQV9JREVQUkkpLCAgUEFfQ1MzKEJBU1RfUEFfSURFUFJJKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0MzKEJBU1RfVkFfSURFU0VDKSwgIFBBX0NTMyhCQVNUX1BBX0lERVNFQyksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMyhCQVNUX1ZBX0lERVBSSUFVWCksIFBBX0NTMyhCQVNUX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKQEAgLTEzNCw3ICsxMzUsNiBAQAogICB7IFZBX0M0KEJBU1RfVkFfSVNBTUVNKSwgIFBBX0NTNChCQVNUX1BBX0lTQU1FTSksICAgU1pfMTZNLCBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNChCQVNUX1ZBX0FTSVhORVQpLCBQQV9DUzUoQkFTVF9QQV9BU0lYTkVUKSwgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzQoQkFTVF9WQV9TVVBFUklPKSwgUEFfQ1M0KEJBU1RfUEFfU1VQRVJJTyksICBTWl8xTSwgIE1UX0RFVklDRSB9LAotICB7IFZBX0M0KEJBU1RfVkFfRE05MDAwKSwgIFBBX0NTNChCQVNUX1BBX0RNOTAwMCksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNChCQVNUX1ZBX0lERVBSSSksICBQQV9DUzUoQkFTVF9QQV9JREVQUkkpLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzQoQkFTVF9WQV9JREVTRUMpLCAgUEFfQ1M1KEJBU1RfUEFfSURFU0VDKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0M0KEJBU1RfVkFfSURFUFJJQVVYKSwgUEFfQ1M1KEJBU1RfUEFfSURFUFJJQVVYKSwgU1pfMU0sIE1UX0RFVklDRSB9LApAQCAtMTQ1LDcgKzE0NSw2IEBACiAgIHsgVkFfQzUoQkFTVF9WQV9JU0FNRU0pLCAgUEFfQ1M1KEJBU1RfUEFfSVNBTUVNKSwgICBTWl8xNk0sIE1UX0RFVklDRSB9LAogICB7IFZBX0M1KEJBU1RfVkFfQVNJWE5FVCksIFBBX0NTNShCQVNUX1BBX0FTSVhORVQpLCAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNShCQVNUX1ZBX1NVUEVSSU8pLCBQQV9DUzUoQkFTVF9QQV9TVVBFUklPKSwgIFNaXzFNLCAgTVRfREVWSUNFIH0sCi0gIHsgVkFfQzUoQkFTVF9WQV9ETTkwMDApLCAgUEFfQ1M1KEJBU1RfUEFfRE05MDAwKSwgICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0M1KEJBU1RfVkFfSURFUFJJKSwgIFBBX0NTNShCQVNUX1BBX0lERVBSSSksICAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNShCQVNUX1ZBX0lERVNFQyksICBQQV9DUzUoQkFTVF9QQV9JREVTRUMpLCAgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzUoQkFTVF9WQV9JREVQUklBVVgpLCBQQV9DUzUoQkFTVF9QQV9JREVQUklBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCkBAIC0zMTMsNiArMzEyLDQ1IEBACiAJLnNlbGVjdF9jaGlwCT0gYmFzdF9uYW5kX3NlbGVjdCwKIH07CiAKKy8qIERNOTAwMCAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGJhc3RfZG05a19yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9DUzUgKyBCQVNUX1BBX0RNOTAwMCwKKwkJLmVuZCAgID0gUzNDMjQxMF9DUzUgKyBCQVNUX1BBX0RNOTAwMCArIDMsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfQ1M1ICsgQkFTVF9QQV9ETTkwMDAgKyAweDQwLAorCQkuZW5kICAgPSBTM0MyNDEwX0NTNSArIEJBU1RfUEFfRE05MDAwICsgMHg0MCArIDB4M2YsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNCisJfSwKKwlbMl0gPSB7CisJCS5zdGFydCA9IElSUV9ETTkwMDAsCisJCS5lbmQgICA9IElSUV9ETTkwMDAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorCit9OworCisvKiBmb3IgdGhlIG1vbWVudCB3ZSBsaW1pdCBvdXJzZWx2ZXMgdG8gMTZiaXQgSU8gdW50aWwgc29tZQorICogYmV0dGVyIElPIHJvdXRpbmVzIGNhbiBiZSB3cml0dGVuIGFuZCB0ZXN0ZWQKKyovCisKK3N0cnVjdCBkbTkwMDBfcGxhdF9kYXRhIGJhc3RfZG05a19wbGF0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYmFzdF9kZXZpY2VfZG05ayA9IHsKKwkubmFtZQkJPSAiZG05MDAwIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYmFzdF9kbTlrX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSBiYXN0X2RtOWtfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmJhc3RfZG05a19wbGF0ZGF0YSwKKwl9Cit9OworCiAKIC8qIFN0YW5kYXJkIEJBU1QgZGV2aWNlcyAqLwogCkBAIC0zMjQsNyArMzYyLDggQEAKIAkmczNjX2RldmljZV9paXMsCiAgCSZzM2NfZGV2aWNlX3J0YywKIAkmczNjX2RldmljZV9uYW5kLAotCSZiYXN0X2RldmljZV9ub3IKKwkmYmFzdF9kZXZpY2Vfbm9yLAorCSZiYXN0X2RldmljZV9kbTlrLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmJhc3RfY2xvY2tzW10gPSB7CkBAIC0zNjYsNDQgKzQwNSwxNCBAQAogCXVzYl9zaW10ZWNfaW5pdCgpOwogfQogCi12b2lkIF9faW5pdCBiYXN0X2luaXRfaXJxKHZvaWQpCi17Ci0JczNjMjR4eF9pbml0X2lycSgpOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi0KLS8qIGJhc3RfaW5pdF9tYWNoaW5lCi0gKgotICogZW5hYmxlIHRoZSBwb3dlciBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3IgdGhlIEVCMjQxMElUWAotKi8KLQotc3RhdGljIF9faW5pdCB2b2lkIGJhc3RfaW5pdF9tYWNoaW5lKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBnc3RhdHVzNDsKLQotCXByaW50ayhLRVJOX0lORk8gIkJBU1QgUG93ZXIgTWFuYW5nZW1lbnQiIENPUFlSSUdIVCAiXG4iKTsKLQotCWdzdGF0dXM0ICA9IChfX3Jhd19yZWFkbChTM0MyNDEwX0JBTktDT043KSAmIDB4MykgPDwgMzA7Ci0JZ3N0YXR1czQgfD0gKF9fcmF3X3JlYWRsKFMzQzI0MTBfQkFOS0NPTjYpICYgMHgzKSA8PCAyODsKLQlnc3RhdHVzNCB8PSAoX19yYXdfcmVhZGwoUzNDMjQxMF9CQU5LU0laRSkgJiBTM0MyNDEwX0JBTktTSVpFX01BU0spOwotCi0JX19yYXdfd3JpdGVsKGdzdGF0dXM0LCBTM0MyNDEwX0dTVEFUVVM0KTsKLQotCXMzYzI0MTBfcG1faW5pdCgpOwotfQotCi0jZWxzZQotI2RlZmluZSBiYXN0X2luaXRfbWFjaGluZSBOVUxMCi0jZW5kaWYKLQogCiBNQUNISU5FX1NUQVJUKEJBU1QsICJTaW10ZWMtQkFTVCIpCi0gICAgIE1BSU5UQUlORVIoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCi0gICAgIE1BUElPKGJhc3RfbWFwX2lvKQotICAgICBJTklUSVJRKGJhc3RfaW5pdF9pcnEpCi0JLmluaXRfbWFjaGluZQk9IGJhc3RfaW5pdF9tYWNoaW5lLAorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLm1hcF9pbwkJPSBiYXN0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtaDE5NDAuYwppbmRleCAyOTI0YWZjLi5lYTRmYjFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1oMTk0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLWgxOTQwLmMKQEAgLTExNywxMCArMTE3LDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSDE5NDAsICJJUEFRLUgxOTQwIikKLSAgICAgTUFJTlRBSU5FUigiQmVuIERvb2tzIDxiZW5AZmx1ZmYub3JnPiIpCi0gICAgIEJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0gICAgIEJPT1RfUEFSQU1TKFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkKLSAgICAgTUFQSU8oaDE5NDBfbWFwX2lvKQotICAgICBJTklUSVJRKGgxOTQwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLm1hcF9pbwkJPSBoMTk0MF9tYXBfaW8sCisJLmluaXRfaXJxCT0gaDE5NDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW4zMC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKaW5kZXggYmQxNTk5OC4uNzkwNDRkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbjMwLmMKQEAgLTEzNywxMCArMTM3LDExIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoTjMwLCAiQWNlci1OMzAiKQotICAgICBNQUlOVEFJTkVSKCJDaHJpc3RlciBXZWluaWdlbCA8Y2hyaXN0ZXJAd2VpbmlnZWwuc2U+LCBCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+IikKLSAgICAgQk9PVF9NRU0oUzNDMjQxMF9TRFJBTV9QQSwgUzNDMjQxMF9QQV9VQVJULCAodTMyKVMzQzI0WFhfVkFfVUFSVCkKLSAgICAgQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQotCisJLyogTWFpbnRhaW5lcjogQ2hyaXN0ZXIgV2VpbmlnZWwgPGNocmlzdGVyQHdlaW5pZ2VsLnNlPiwgQmVuIERvb2tzIDxiZW4tbGludXhAZmx1ZmYub3JnPiAqLworCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKIAkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IG4zMF9pbml0LAogCS5pbml0X2lycQk9IG4zMF9pbml0X2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW5leGNvZGVyLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1uZXhjb2Rlci5jCmluZGV4IDcwNDg3YmYuLmQyNGMyNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW5leGNvZGVyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtbmV4Y29kZXIuYwpAQCAtMTQ3LDkgKzE0NywxMSBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoTkVYQ09ERVJfMjQ0MCwgIk5leFZpc2lvbiAtIE5leGNvZGVyIDI0NDAiKQotICAgICBNQUlOVEFJTkVSKCJHdWlsbGF1bWUgR09VUkFUIDxndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dj4iKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCisJLyogTWFpbnRhaW5lcjogR3VpbGxhdW1lIEdPVVJBVCA8Z3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHY+ICovCisJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAogCS5tYXBfaW8JCT0gbmV4Y29kZXJfbWFwX2lvLAogCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtb3RvbS5jCmluZGV4IDY3ZDhjZTguLmQ5MDFlZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLW90b20uYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1vdG9tLmMKQEAgLTExNSw5ICsxMTUsMTEgQEAKIAogCiBNQUNISU5FX1NUQVJUKE9UT00sICJOZXggVmlzaW9uIC0gT3RvbSAxLjEiKQotICAgICBNQUlOVEFJTkVSKCJHdWlsbGF1bWUgR09VUkFUIDxndWlsbGF1bWUuZ291cmF0QG5leHZpc2lvbi50dj4iKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCisJLyogTWFpbnRhaW5lcjogR3VpbGxhdW1lIEdPVVJBVCA8Z3VpbGxhdW1lLmdvdXJhdEBuZXh2aXNpb24udHY+ICovCisJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAogCS5tYXBfaW8JCT0gb3RvbTExX21hcF9pbywKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS50aW1lcgkJPSAmczNjMjR4eF90aW1lciwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXJ4MzcxNS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKaW5kZXggZjhkM2E5Ny4uYTczZDYxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtcngzNzE1LmMKQEAgLTEzMSwxMSArMTMxLDEzIEBACiAjZW5kaWYKIAogTUFDSElORV9TVEFSVChSWDM3MTUsICJJUEFRLVJYMzcxNSIpCi0gICAgIE1BSU5UQUlORVIoIkJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4iKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCi0gICAgIE1BUElPKHJ4MzcxNV9tYXBfaW8pCi0gICAgIElOSVRJUlEocngzNzE1X2luaXRfaXJxKQotICAgICBJTklUX01BQ0hJTkUocngzNzE1X2luaXRfbWFjaGluZSkKKwkvKiBNYWludGFpbmVyOiBCZW4gRG9va3MgPGJlbkBmbHVmZi5vcmc+ICovCisJLnBoeXNfcmFtCT0gUzNDMjQxMF9TRFJBTV9QQSwKKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCS5tYXBfaW8JCT0gcngzNzE1X21hcF9pbywKKwkuaW5pdF9pcnEJPSByeDM3MTVfaW5pdF9pcnEsCisJLmluaXRfbWFjaGluZQk9IHJ4MzcxNV9pbml0X21hY2hpbmUsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQxMC5jCmluZGV4IGMxYTRhMTQuLjY3ZTkwM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTAuYwpAQCAtMTEyLDExICsxMTIsMTMgQEAKIAogTUFDSElORV9TVEFSVChTTURLMjQxMCwgIlNNREsyNDEwIikgLyogQFRPRE86IHJlcXVlc3QgYSBuZXcgaWRlbnRpZmllciBhbmQgc3dpdGNoCiAJCQkJICAgICogdG8gU01ESzI0MTAgKi8KLSAgICAgTUFJTlRBSU5FUigiSm9uYXMgRGlldHNjaGUiKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCi0gICAgIE1BUElPKHNtZGsyNDEwX21hcF9pbykKLSAgICAgSU5JVElSUShzbWRrMjQxMF9pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBKb25hcyBEaWV0c2NoZSAqLworCS5waHlzX3JhbQk9IFMzQzI0MTBfU0RSQU1fUEEsCisJLnBoeXNfaW8JPSBTM0MyNDEwX1BBX1VBUlQsCisJLmlvX3BnX29mZnN0CT0gKCgodTMyKVMzQzI0WFhfVkFfVUFSVCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCwKKwkubWFwX2lvCQk9IHNtZGsyNDEwX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzbWRrMjQxMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0NDAuYwppbmRleCA3ODU3MTc2Li4zNTc1MjIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC1zbWRrMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDQwLmMKQEAgLTEyNCw5ICsxMjQsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChTM0MyNDQwLCAiU01ESzI0NDAiKQotCU1BSU5UQUlORVIoIkJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4iKQotCUJPT1RfTUVNKFMzQzI0MTBfU0RSQU1fUEEsIFMzQzI0MTBfUEFfVUFSVCwgKHUzMilTM0MyNFhYX1ZBX1VBUlQpCi0JQk9PVF9QQVJBTVMoUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCiAKIAkuaW5pdF9pcnEJPSBzM2MyNHh4X2luaXRfaXJxLAogCS5tYXBfaW8JCT0gc21kazI0NDBfbWFwX2lvLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtdnIxMDAwLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwppbmRleCA1NTEyMTQ2Li45MjRlODQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvbWFjaC12cjEwMDAuYwpAQCAtMjcsNiArMjcsNyBAQAogICogICAgIDEwLUZlYi0yMDA1IEJKRCAgQWRkZWQgcG93ZXItb2ZmIGNhcGFiaWxpdHkKICAqICAgICAxMC1NYXItMjAwNSBMQ1ZSIENoYW5nZWQgUzNDMjQxMF9WQSB0byBTM0MyNFhYX1ZBCiAgKiAgICAgMTQtTWFyLTIwMDYgQkpEICB2b2lkIF9faW9tZW0gZml4ZXMKKyAqICAgICAyMi1KdW4tMjAwNiBCSkQgIEFkZGVkIERNOTAwMCBwbGF0Zm9ybSBpbmZvcm1hdGlvbgogKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzUsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbTkwMDAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgpAQCAtOTgsMjggKzEwMCwyNCBAQAogICAgKiBhcmUgb25seSA4Yml0ICovCiAKICAgLyogc2xvdywgYnl0ZSAqLwotICB7IFZBX0MyKFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1MyKFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzIoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMihWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTMyhWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0MyKFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMihWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1MzKFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCiAKICAgLyogc2xvdywgd29yZCAqLwotICB7IFZBX0MzKFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1MzKFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzMoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMyhWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTMyhWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0MzKFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzMoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DMyhWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1MzKFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCiAKICAgLyogZmFzdCwgYnl0ZSAqLwotICB7IFZBX0M0KFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1M0KFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzQoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNChWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTNShWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0M0KFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNChWUjEwMDBfVkFfSURFU0VDQVVYKSwgUEFfQ1M1KFZSMTAwMF9QQV9JREVTRUNBVVgpLCBTWl8xTSwgTVRfREVWSUNFIH0sCiAKICAgLyogZmFzdCwgd29yZCAqLwotICB7IFZBX0M1KFZSMTAwMF9WQV9ETTkwMDApLCAgUEFfQ1M1KFZSMTAwMF9QQV9ETTkwMDApLAkgIFNaXzFNLCAgTVRfREVWSUNFIH0sCiAgIHsgVkFfQzUoVlIxMDAwX1ZBX0lERVBSSSksICBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSSksCSAgU1pfMU0sICBNVF9ERVZJQ0UgfSwKICAgeyBWQV9DNShWUjEwMDBfVkFfSURFU0VDKSwgIFBBX0NTNShWUjEwMDBfUEFfSURFU0VDKSwJICBTWl8xTSwgIE1UX0RFVklDRSB9LAogICB7IFZBX0M1KFZSMTAwMF9WQV9JREVQUklBVVgpLCBQQV9DUzUoVlIxMDAwX1BBX0lERVBSSUFVWCksIFNaXzFNLCBNVF9ERVZJQ0UgfSwKQEAgLTI0Niw2ICsyNDQsNzQgQEAKIAkucmVzb3VyY2UJPSB2cjEwMDBfbm9yX3Jlc291cmNlLAogfTsKIAorLyogRE05MDAwIGV0aGVybmV0IGRldmljZXMgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2cjEwMDBfZG05azBfcmVzb3VyY2VbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCA9IFMzQzI0MTBfQ1M1ICsgVlIxMDAwX1BBX0RNOTAwMCwKKwkJLmVuZCAgID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMHg0MCwKKwkJLmVuZCAgID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMHg3ZiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1ZSMTAwMF9ETTkwMDBBLAorCQkuZW5kICAgPSBJUlFfVlIxMDAwX0RNOTAwMEEsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHZyMTAwMF9kbTlrMV9yZXNvdXJjZVtdID0geworCVswXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMHg4MCwKKwkJLmVuZCAgID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMHg4MywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMHhDMCwKKwkJLmVuZCAgID0gUzNDMjQxMF9DUzUgKyBWUjEwMDBfUEFfRE05MDAwICsgMHhGRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KKwl9LAorCVsyXSA9IHsKKwkJLnN0YXJ0ID0gSVJRX1ZSMTAwMF9ETTkwMDBOLAorCQkuZW5kICAgPSBJUlFfVlIxMDAwX0RNOTAwME4sCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworLyogZm9yIHRoZSBtb21lbnQgd2UgbGltaXQgb3Vyc2VsdmVzIHRvIDE2Yml0IElPIHVudGlsIHNvbWUKKyAqIGJldHRlciBJTyByb3V0aW5lcyBjYW4gYmUgd3JpdHRlbiBhbmQgdGVzdGVkCisqLworCitzdHJ1Y3QgZG05MDAwX3BsYXRfZGF0YSB2cjEwMDBfZG05a19wbGF0ZGF0YSA9IHsKKwkuZmxhZ3MJCT0gRE05MDAwX1BMQVRGXzE2QklUT05MWSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZyMTAwMF9kbTlrMCA9IHsKKwkubmFtZQkJPSAiZG05MDAwIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodnIxMDAwX2RtOWswX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSB2cjEwMDBfZG05azBfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnZyMTAwMF9kbTlrX3BsYXRkYXRhLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZyMTAwMF9kbTlrMSA9IHsKKwkubmFtZQkJPSAiZG05MDAwIiwKKwkuaWQJCT0gMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodnIxMDAwX2RtOWsxX3Jlc291cmNlKSwKKwkucmVzb3VyY2UJPSB2cjEwMDBfZG05azFfcmVzb3VyY2UsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJnZyMTAwMF9kbTlrX3BsYXRkYXRhLAorCX0KK307CisKKy8qIGRldmljZXMgZm9yIHRoaXMgYm9hcmQgKi8KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnZyMTAwMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmczNjX2RldmljZV91c2IsCkBAIC0yNTMsOCArMzE5LDExIEBACiAJJnMzY19kZXZpY2Vfd2R0LAogCSZzM2NfZGV2aWNlX2kyYywKIAkmczNjX2RldmljZV9paXMsCisJJnMzY19kZXZpY2VfYWRjLAogCSZzZXJpYWxfZGV2aWNlLAogCSZ2cjEwMDBfbm9yLAorCSZ2cjEwMDBfZG05azAsCisJJnZyMTAwMF9kbTlrMQogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKnZyMTAwMF9jbG9ja3NbXSA9IHsKQEAgLTMwMiwxNiArMzcxLDE0IEBACiAJdXNiX3NpbXRlY19pbml0KCk7CiB9CiAKLXZvaWQgX19pbml0IHZyMTAwMF9pbml0X2lycSh2b2lkKQotewotCXMzYzI0eHhfaW5pdF9pcnEoKTsKLX0KIAogTUFDSElORV9TVEFSVChWUjEwMDAsICJUaG9yY29tLVZSMTAwMCIpCi0gICAgIE1BSU5UQUlORVIoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKQotICAgICBCT09UX01FTShTM0MyNDEwX1NEUkFNX1BBLCBTM0MyNDEwX1BBX1VBUlQsICh1MzIpUzNDMjRYWF9WQV9VQVJUKQotICAgICBCT09UX1BBUkFNUyhTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDApCi0gICAgIE1BUElPKHZyMTAwMF9tYXBfaW8pCi0gICAgIElOSVRJUlEodnIxMDAwX2luaXRfaXJxKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4gKi8KKwkucGh5c19yYW0JPSBTM0MyNDEwX1NEUkFNX1BBLAorCS5waHlzX2lvCT0gUzNDMjQxMF9QQV9VQVJULAorCS5pb19wZ19vZmZzdAk9ICgoKHUzMilTM0MyNFhYX1ZBX1VBUlQpID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSBTM0MyNDEwX1NEUkFNX1BBICsgMHgxMDAsCisJLm1hcF9pbwkJPSB2cjEwMDBfbWFwX2lvLAorCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzM2MyNHh4X3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I3OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLXNpbXRlYy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLworICoKKyAqIFBvd2VyIE1hbmFnZW1lbnQgaGVscGVycyBmb3IgU2ltdGVjIFMzQzI0WFggaW1wbGVtZW50YXRpb25zCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvbWFwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLW1lbS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgInBtLmgiCisKKyNkZWZpbmUgQ09QWVJJR0hUICIsIChjKSAyMDA1IFNpbXRlYyBFbGVjdHJvbmljcyIKKworLyogcG1fc2ltdGVjX2luaXQKKyAqCisgKiBlbmFibGUgdGhlIHBvd2VyIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisqLworCitzdGF0aWMgX19pbml0IGludCBwbV9zaW10ZWNfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ3N0YXR1czQ7CisKKwkvKiBjaGVjayB3aGljaCBtYWNoaW5lIHdlIGFyZSBydW5uaW5nIG9uICovCisKKwlpZiAoIW1hY2hpbmVfaXNfYmFzdCgpICYmICFtYWNoaW5lX2lzX3ZyMTAwMCgpKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX0lORk8gIlNpbXRlYyBCb2FyZCBQb3dlciBNYW5hbmdlbWVudCIgQ09QWVJJR0hUICJcbiIpOworCisJZ3N0YXR1czQgID0gKF9fcmF3X3JlYWRsKFMzQzI0MTBfQkFOS0NPTjcpICYgMHgzKSA8PCAzMDsKKwlnc3RhdHVzNCB8PSAoX19yYXdfcmVhZGwoUzNDMjQxMF9CQU5LQ09ONikgJiAweDMpIDw8IDI4OworCWdzdGF0dXM0IHw9IChfX3Jhd19yZWFkbChTM0MyNDEwX0JBTktTSVpFKSAmIFMzQzI0MTBfQkFOS1NJWkVfTUFTSyk7CisKKwlfX3Jhd193cml0ZWwoZ3N0YXR1czQsIFMzQzI0MTBfR1NUQVRVUzQpOworCisJcmV0dXJuIHMzYzI0MTBfcG1faW5pdCgpOworfQorCithcmNoX2luaXRjYWxsKHBtX3NpbXRlY19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvdGltZS5jCmluZGV4IDE3OWYwZTAuLjc2NWEzYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3RpbWUuYwpAQCAtMTM3LDggKzEzNyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHMzYzI0MTBfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJTM0MyNDEwIFRpbWVyIFRpY2siLAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCi0JLmhhbmRsZXIJPSBzM2MyNDEwX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IHMzYzI0MTBfdGltZXJfaW50ZXJydXB0LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Fzc2FiZXQuYwppbmRleCBiZWRmODhmLi40ZDRkMzAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9hc3NhYmV0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvYXNzYWJldC5jCkBAIC00MzEsMTEgKzQzMSwxMyBAQAogCiAKIE1BQ0hJTkVfU1RBUlQoQVNTQUJFVCwgIkludGVsLUFzc2FiZXQiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlGSVhVUChmaXh1cF9hc3NhYmV0KQotCU1BUElPKGFzc2FiZXRfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLmZpeHVwCQk9IGZpeHVwX2Fzc2FiZXQsCisJLm1hcF9pbwkJPSBhc3NhYmV0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGFzc2FiZXRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9iYWRnZTQuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jCmluZGV4IDZhNjBiNDkuLmI2MTY5Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2JhZGdlNC5jCkBAIC0yODUsOSArMjg1LDExIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQkFER0U0LCAiSGV3bGV0dC1QYWNrYXJkIExhYm9yYXRvcmllcyBCYWRnZVBBRCA0IikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oYmFkZ2U0X21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gYmFkZ2U0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2VyZi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2VyZi5jCmluZGV4IGY4ZWRkZTUuLjBhYTkxOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NlcmYuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jZXJmLmMKQEAgLTEyMywxMCArMTIzLDEyIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoQ0VSRiwgIkludHJpbnN5YyBDZXJmQm9hcmQvQ2VyZkN1YmUiKQotCU1BSU5UQUlORVIoInN1cHBvcnRAaW50cmluc3ljLmNvbSIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlNQVBJTyhjZXJmX21hcF9pbykKLQlJTklUSVJRKGNlcmZfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogc3VwcG9ydEBpbnRyaW5zeWMuY29tICovCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLm1hcF9pbwkJPSBjZXJmX21hcF9pbywKKwkuaW5pdF9pcnEJPSBjZXJmX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBjZXJmX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvY29sbGllLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwppbmRleCA5OTI4Nzg5Li44Y2I2OTExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9jb2xsaWUuYwpAQCAtMTg0LDkgKzE4NCwxMSBAQAogfQogCiBNQUNISU5FX1NUQVJUKENPTExJRSwgIlNoYXJwLUNvbGxpZSIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlNQVBJTyhjb2xsaWVfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5tYXBfaW8JCT0gY29sbGllX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiAJLmluaXRfbWFjaGluZQk9IGNvbGxpZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2NwdS1zYTExMTAuYwppbmRleCA4ZDJhODlhLi4wNGM5NGFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jcHUtc2ExMTEwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY3B1LXNhMTExMC5jCkBAIC0yNzEsOCArMjcxLDcgQEAKIAkgKi8KIAlzZHJhbV9zZXRfcmVmcmVzaCgyKTsKIAlpZiAoIWlycXNfZGlzYWJsZWQoKSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMjAgKiBIWiAvIDEwMDApOworCQltc2xlZXAoMjApOwogCX0gZWxzZSB7CiAJCW1kZWxheSgyMCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKaW5kZXggODRjODY1NC4uZTdhYTI2ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzNjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDM2MDAuYwpAQCAtMzgwLDEwICszODAsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChIMzEwMCwgIkNvbXBhcSBpUEFRIEgzMTAwIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oaDMxMDBfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBoMzEwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBoM3h4eF9tYWNoX2luaXQsCiBNQUNISU5FX0VORApAQCAtNDk2LDEwICs0OTgsMTIgQEAKIH0KIAogTUFDSElORV9TVEFSVChIMzYwMCwgIkNvbXBhcSBpUEFRIEgzNjAwIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oaDM2MDBfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBoMzYwMF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBoM3h4eF9tYWNoX2luaXQsCiBNQUNISU5FX0VORApAQCAtNzI3LDcgKzczMSw3IEBACiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBoMzgwMF9pcnEgPSB7CiAJLm5hbWUJCT0gImgzODAwX2FzaWMiLAogCS5oYW5kbGVyCT0gaDM4MDBfSVJRX2RlbXV4LAotCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAogfTsKIAogdTMyIGtwaW9faW50X3NoYWRvdyA9IDA7CkBAIC04ODEsMTAgKzg4NSwxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUKEgzODAwLCAiQ29tcGFxIGlQQVEgSDM4MDAiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhoMzgwMF9tYXBfaW8pCi0JSU5JVElSUShoMzgwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gaDM4MDBfbWFwX2lvLAorCS5pbml0X2lycQk9IGgzODAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBoM3h4eF9tYWNoX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvaGFja2tpdC5jCmluZGV4IDU3MDg0MTcuLjUwMmQ2NWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2hhY2traXQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oYWNra2l0LmMKQEAgLTE5MSwxMCArMTkxLDEyIEBACiAgKi8KIAogTUFDSElORV9TVEFSVChIQUNLS0lULCAiSGFja0tpdCBDcHUgQm9hcmQiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhoYWNra2l0X21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gaGFja2tpdF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBoYWNra2l0X2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCmluZGV4IDZiZTc4MjkuLmVlZTNjYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKQEAgLTk3LDkgKzk3LDExIEBACiB9CiAKIE1BQ0hJTkVfU1RBUlQoSk9STkFEQTcyMCwgIkhQIEpvcm5hZGEgNzIwIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotCUJPT1RfUEFSQU1TKDB4YzAwMDAxMDApCi0JTUFQSU8oam9ybmFkYTcyMF9tYXBfaW8pCi0JSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IGpvcm5hZGE3MjBfbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9sYXJ0LmMKaW5kZXggNTFjMDhjYy4uODcwYjQ4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvbGFydC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2xhcnQuYwpAQCAtNDEsOSArNDEsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChMQVJULCAiTEFSVCIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKGxhcnRfbWFwX2lvKQotCUlOSVRJUlEoc2ExMTAwX2luaXRfaXJxKQorCS5waHlzX3JhbQk9IDB4YzAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDgwMDAwMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmODAwMDAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4YzAwMDAxMDAsCisJLm1hcF9pbwkJPSBsYXJ0X21hcF9pbywKKwkuaW5pdF9pcnEJPSBzYTExMDBfaW5pdF9pcnEsCiAJLnRpbWVyCQk9ICZzYTExMDBfdGltZXIsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCmluZGV4IDU2MDZiZDcuLmUxN2I1OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKQEAgLTE0Niw5ICsxNDYsMTEgQEAKIH0KIAogTUFDSElORV9TVEFSVChQTEVCLCAiUExFQiIpCi0JQk9PVF9NRU0oMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHhmODAwMDAwMCkKLQlNQVBJTyhwbGViX21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkubWFwX2lvCQk9IHBsZWJfbWFwX2lvLAorCS5pbml0X2lycQk9IHNhMTEwMF9pbml0X2lycSwKIAkudGltZXIJCT0gJnNhMTEwMF90aW1lciwKIAkuaW5pdF9tYWNoaW5lICAgPSBwbGViX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2hhbm5vbi5jCmluZGV4IGVkZGRkNTUuLjQzYTAwMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3NoYW5ub24uYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaGFubm9uLmMKQEAgLTc2LDEwICs3NiwxMiBAQAogfQogCiBNQUNISU5FX1NUQVJUKFNIQU5OT04sICJTaGFubm9uIChBS0E6IFR1eHNjcmVlbikiKQotCUJPT1RfTUVNKDB4YzAwMDAwMDAsIDB4ODAwMDAwMDAsIDB4ZjgwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHhjMDAwMDEwMCkKLQlNQVBJTyhzaGFubm9uX21hcF9pbykKLQlJTklUSVJRKHNhMTEwMF9pbml0X2lycSkKKwkucGh5c19yYW0JPSAweGMwMDAwMDAwLAorCS5waHlzX2lvCT0gMHg4MDAwMDAwMCwKKwkuaW9fcGdfb2Zmc3QJPSAoKDB4ZjgwMDAwMDApID4+IDE4KSAmIDB4ZmZmYywKKwkuYm9vdF9wYXJhbXMJPSAweGMwMDAwMTAwLAorCS5tYXBfaW8JCT0gc2hhbm5vbl9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogCS5pbml0X21hY2hpbmUJPSBzaGFubm9uX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvc2ltcGFkLmMgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwppbmRleCA4ZDExM2Q2Li43Nzk3ODU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9zaW1wYWQuYwpAQCAtMjE1LDEwICsyMTUsMTIgQEAKIAogCiBNQUNISU5FX1NUQVJUKFNJTVBBRCwgIlNpbXBhZCIpCi0JTUFJTlRBSU5FUigiSG9sZ2VyIEZyZXl0aGVyIikKLQlCT09UX01FTSgweGMwMDAwMDAwLCAweDgwMDAwMDAwLCAweGY4MDAwMDAwKQotICAgICAgICBCT09UX1BBUkFNUygweGMwMDAwMTAwKQotCU1BUElPKHNpbXBhZF9tYXBfaW8pCi0JSU5JVElSUShzYTExMDBfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogSG9sZ2VyIEZyZXl0aGVyICovCisJLnBoeXNfcmFtCT0gMHhjMDAwMDAwMCwKKwkucGh5c19pbwk9IDB4ODAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGY4MDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHhjMDAwMDEwMCwKKwkubWFwX2lvCQk9IHNpbXBhZF9tYXBfaW8sCisJLmluaXRfaXJxCT0gc2ExMTAwX2luaXRfaXJxLAogCS50aW1lcgkJPSAmc2ExMTAwX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3RpbWUuYwppbmRleCAxOWIwYzBmLi4wZWViMzYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC90aW1lLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvdGltZS5jCkBAIC05OSw4ICs5OSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHNhMTEwMF90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIlNBMTF4eCBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gc2ExMTAwX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IHNhMTEwMF90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2ExMTAwX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKaW5kZXggYTliYzVkMC4uNzI2NDQ1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9jb3JlLmMKQEAgLTg0LDggKzg0LDggQEAKIAogc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gc2hhcmtfdGltZXJfaXJxID0gewogCS5uYW1lCQk9ICJTaGFyayBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gc2hhcmtfdGltZXJfaW50ZXJydXB0CisJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCB8IFNBX1RJTUVSLAorCS5oYW5kbGVyCT0gc2hhcmtfdGltZXJfaW50ZXJydXB0LAogfTsKIAogLyoKQEAgLTEwNSwxMCArMTA1LDEyIEBACiB9OwogCiBNQUNISU5FX1NUQVJUKFNIQVJLLCAiU2hhcmsiKQotCU1BSU5UQUlORVIoIkFsZXhhbmRlciBTY2h1bHoiKQotCUJPT1RfTUVNKDB4MDgwMDAwMDAsIDB4NDAwMDAwMDAsIDB4ZTAwMDAwMDApCi0JQk9PVF9QQVJBTVMoMHgwODAwMzAwMCkKLQlNQVBJTyhzaGFya19tYXBfaW8pCi0JSU5JVElSUShzaGFya19pbml0X2lycSkKKwkvKiBNYWludGFpbmVyOiBBbGV4YW5kZXIgU2NodWx6ICovCisJLnBoeXNfcmFtCT0gMHgwODAwMDAwMCwKKwkucGh5c19pbwk9IDB4NDAwMDAwMDAsCisJLmlvX3BnX29mZnN0CT0gKCgweGUwMDAwMDAwKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gMHgwODAwMzAwMCwKKwkubWFwX2lvCQk9IHNoYXJrX21hcF9pbywKKwkuaW5pdF9pcnEJPSBzaGFya19pbml0X2lycSwKIAkudGltZXIJCT0gJnNoYXJrX3RpbWVyLAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCA2YTdjYmVhLi5mMDFjMGY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYW1iYS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9hbWJhX2NsY2QuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvYXJtX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2ljc3QzMDcuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTc4OCwzOCArNzg5LDI1IEBACiAgKi8KICNkZWZpbmUgVElNRVJfSU5URVJWQUwJKFRJQ0tTX1BFUl91U0VDICogbVNFQ18xMCkKICNpZiBUSU1FUl9JTlRFUlZBTCA+PSAweDEwMDAwMAotI2RlZmluZSBUSU1FUl9SRUxPQUQJKFRJTUVSX0lOVEVSVkFMID4+IDgpCQkvKiBEaXZpZGUgYnkgMjU2ICovCi0jZGVmaW5lIFRJTUVSX0NUUkwJMHg4OAkJCQkvKiBFbmFibGUsIENsb2NrIC8gMjU2ICovCisjZGVmaW5lIFRJTUVSX1JFTE9BRAkoVElNRVJfSU5URVJWQUwgPj4gOCkKKyNkZWZpbmUgVElNRVJfRElWSVNPUgkoVElNRVJfQ1RSTF9ESVYyNTYpCiAjZGVmaW5lIFRJQ0tTMlVTRUNTKHgpCSgyNTYgKiAoeCkgLyBUSUNLU19QRVJfdVNFQykKICNlbGlmIFRJTUVSX0lOVEVSVkFMID49IDB4MTAwMDAKICNkZWZpbmUgVElNRVJfUkVMT0FECShUSU1FUl9JTlRFUlZBTCA+PiA0KQkJLyogRGl2aWRlIGJ5IDE2ICovCi0jZGVmaW5lIFRJTUVSX0NUUkwJMHg4NAkJCQkvKiBFbmFibGUsIENsb2NrIC8gMTYgKi8KKyNkZWZpbmUgVElNRVJfRElWSVNPUgkoVElNRVJfQ1RSTF9ESVYxNikKICNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKDE2ICogKHgpIC8gVElDS1NfUEVSX3VTRUMpCiAjZWxzZQogI2RlZmluZSBUSU1FUl9SRUxPQUQJKFRJTUVSX0lOVEVSVkFMKQotI2RlZmluZSBUSU1FUl9DVFJMCTB4ODAJCQkJLyogRW5hYmxlICovCisjZGVmaW5lIFRJTUVSX0RJVklTT1IJKFRJTUVSX0NUUkxfRElWMSkKICNkZWZpbmUgVElDS1MyVVNFQ1MoeCkJKCh4KSAvIFRJQ0tTX1BFUl91U0VDKQogI2VuZGlmCiAKLSNkZWZpbmUgVElNRVJfQ1RSTF9JRQkoMSA8PCA1KQkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCi0KLS8qCi0gKiBXaGF0IGRvZXMgaXQgbG9vayBsaWtlPwotICovCi10eXBlZGVmIHN0cnVjdCBUaW1lclN0cnVjdCB7Ci0JdW5zaWduZWQgbG9uZyBUaW1lckxvYWQ7Ci0JdW5zaWduZWQgbG9uZyBUaW1lclZhbHVlOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDb250cm9sOwotCXVuc2lnbmVkIGxvbmcgVGltZXJDbGVhcjsKLX0gVGltZXJTdHJ1Y3RfdDsKLQogLyoKICAqIFJldHVybnMgbnVtYmVyIG9mIG1zIHNpbmNlIGxhc3QgY2xvY2sgaW50ZXJydXB0LiAgTm90ZSB0aGF0IGludGVycnVwdHMKICAqIHdpbGwgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IGRvX2dldHRpbWVvZmZzZXQoKQogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZXJzYXRpbGVfZ2V0dGltZW9mZnNldCh2b2lkKQogewotCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMCA9IChUaW1lclN0cnVjdF90ICopVElNRVIwX1ZBX0JBU0U7CiAJdW5zaWduZWQgbG9uZyB0aWNrczEsIHRpY2tzMiwgc3RhdHVzOwogCiAJLyoKQEAgLTgyOCwxMSArODE2LDExIEBACiAJICogYW4gaW50ZXJydXB0LiAgV2UgZ2V0IGFyb3VuZCB0aGlzIGJ5IGVuc3VyaW5nIHRoYXQgdGhlCiAJICogY291bnRlciBoYXMgbm90IHJlbG9hZGVkIGJldHdlZW4gb3VyIHR3byByZWFkcy4KIAkgKi8KLQl0aWNrczIgPSB0aW1lcjAtPlRpbWVyVmFsdWUgJiAweGZmZmY7CisJdGlja3MyID0gcmVhZGwoVElNRVIwX1ZBX0JBU0UgKyBUSU1FUl9WQUxVRSkgJiAweGZmZmY7CiAJZG8gewogCQl0aWNrczEgPSB0aWNrczI7CiAJCXN0YXR1cyA9IF9fcmF3X3JlYWRsKFZBX0lDX0JBU0UgKyBWSUNfSVJRX1JBV19TVEFUVVMpOwotCQl0aWNrczIgPSB0aW1lcjAtPlRpbWVyVmFsdWUgJiAweGZmZmY7CisJCXRpY2tzMiA9IHJlYWRsKFRJTUVSMF9WQV9CQVNFICsgVElNRVJfVkFMVUUpICYgMHhmZmZmOwogCX0gd2hpbGUgKHRpY2tzMiA+IHRpY2tzMSk7CiAKIAkvKgpAQCAtODU5LDEyICs4NDcsMTAgQEAKICAqLwogc3RhdGljIGlycXJldHVybl90IHZlcnNhdGlsZV90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjAgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMF9WQV9CQVNFOwotCiAJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CiAKIAkvLyAuLi5jbGVhciB0aGUgaW50ZXJydXB0Ci0JdGltZXIwLT5UaW1lckNsZWFyID0gMTsKKwl3cml0ZWwoMSwgVElNRVIwX1ZBX0JBU0UgKyBUSU1FUl9JTlRDTFIpOwogCiAJdGltZXJfdGljayhyZWdzKTsKIApAQCAtODc1LDggKzg2MSw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHZlcnNhdGlsZV90aW1lcl9pcnEgPSB7CiAJLm5hbWUJCT0gIlZlcnNhdGlsZSBUaW1lciBUaWNrIiwKLQkuZmxhZ3MJCT0gU0FfSU5URVJSVVBULAotCS5oYW5kbGVyCT0gdmVyc2F0aWxlX3RpbWVyX2ludGVycnVwdAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQgfCBTQV9USU1FUiwKKwkuaGFuZGxlcgk9IHZlcnNhdGlsZV90aW1lcl9pbnRlcnJ1cHQsCiB9OwogCiAvKgpAQCAtODg0LDMxICs4NzAsMzIgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHZlcnNhdGlsZV90aW1lcl9pbml0KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIwID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjBfVkFfQkFTRTsKLQl2b2xhdGlsZSBUaW1lclN0cnVjdF90ICp0aW1lcjEgPSAodm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqKVRJTUVSMV9WQV9CQVNFOwotCXZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKnRpbWVyMiA9ICh2b2xhdGlsZSBUaW1lclN0cnVjdF90ICopVElNRVIyX1ZBX0JBU0U7Ci0Jdm9sYXRpbGUgVGltZXJTdHJ1Y3RfdCAqdGltZXIzID0gKHZvbGF0aWxlIFRpbWVyU3RydWN0X3QgKilUSU1FUjNfVkFfQkFTRTsKKwl1MzIgdmFsOwogCiAJLyogCiAJICogc2V0IGNsb2NrIGZyZXF1ZW5jeTogCiAJICoJVkVSU0FUSUxFX1JFRkNMSyBpcyAzMktIegogCSAqCVZFUlNBVElMRV9USU1DTEsgaXMgMU1IegogCSAqLwotCSoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSB8PSAKLQkgICgoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVIxX0VuU2VsKSB8IChWRVJTQVRJTEVfVElNQ0xLIDw8IFZFUlNBVElMRV9USU1FUjJfRW5TZWwpIHwgCi0JICAgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSM19FblNlbCkgfCAoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVI0X0VuU2VsKSk7CisJdmFsID0gcmVhZGwoSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSk7CisJd3JpdGVsKChWRVJTQVRJTEVfVElNQ0xLIDw8IFZFUlNBVElMRV9USU1FUjFfRW5TZWwpIHwKKwkgICAgICAgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSMl9FblNlbCkgfCAKKwkgICAgICAgKFZFUlNBVElMRV9USU1DTEsgPDwgVkVSU0FUSUxFX1RJTUVSM19FblNlbCkgfAorCSAgICAgICAoVkVSU0FUSUxFX1RJTUNMSyA8PCBWRVJTQVRJTEVfVElNRVI0X0VuU2VsKSB8IHZhbCwKKwkgICAgICAgSU9fQUREUkVTUyhWRVJTQVRJTEVfU0NUTF9CQVNFKSk7CiAKIAkvKgogCSAqIEluaXRpYWxpc2UgdG8gYSBrbm93biBzdGF0ZSAoYWxsIHRpbWVycyBvZmYpCiAJICovCi0JdGltZXIwLT5UaW1lckNvbnRyb2wgPSAwOwotCXRpbWVyMS0+VGltZXJDb250cm9sID0gMDsKLQl0aW1lcjItPlRpbWVyQ29udHJvbCA9IDA7Ci0JdGltZXIzLT5UaW1lckNvbnRyb2wgPSAwOworCXdyaXRlbCgwLCBUSU1FUjBfVkFfQkFTRSArIFRJTUVSX0NUUkwpOworCXdyaXRlbCgwLCBUSU1FUjFfVkFfQkFTRSArIFRJTUVSX0NUUkwpOworCXdyaXRlbCgwLCBUSU1FUjJfVkFfQkFTRSArIFRJTUVSX0NUUkwpOworCXdyaXRlbCgwLCBUSU1FUjNfVkFfQkFTRSArIFRJTUVSX0NUUkwpOwogCi0JdGltZXIwLT5UaW1lckxvYWQgICAgPSBUSU1FUl9SRUxPQUQ7Ci0JdGltZXIwLT5UaW1lclZhbHVlICAgPSBUSU1FUl9SRUxPQUQ7Ci0JdGltZXIwLT5UaW1lckNvbnRyb2wgPSBUSU1FUl9DVFJMIHwgMHg0MCB8IFRJTUVSX0NUUkxfSUU7ICAvKiBwZXJpb2RpYyArIElFICovCisJd3JpdGVsKFRJTUVSX1JFTE9BRCwgVElNRVIwX1ZBX0JBU0UgKyBUSU1FUl9MT0FEKTsKKwl3cml0ZWwoVElNRVJfUkVMT0FELCBUSU1FUjBfVkFfQkFTRSArIFRJTUVSX1ZBTFVFKTsKKwl3cml0ZWwoVElNRVJfRElWSVNPUiB8IFRJTUVSX0NUUkxfRU5BQkxFIHwgVElNRVJfQ1RSTF9QRVJJT0RJQyB8CisJICAgICAgIFRJTUVSX0NUUkxfSUUsIFRJTUVSMF9WQV9CQVNFICsgVElNRVJfQ1RSTCk7CiAKIAkvKiAKIAkgKiBNYWtlIGlycXMgaGFwcGVuIGZvciB0aGUgc3lzdGVtIHRpbWVyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfYWIuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCmluZGV4IGQzMzIwODQuLjhiMGIzYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9hYi5jCkBAIC0zNSwxMSArMzUsMTMgQEAKICNpbmNsdWRlICJjb3JlLmgiCiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX0FCLCAiQVJNLVZlcnNhdGlsZSBBQiIpCi0JTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHgxMDFmMTAwMCwgMHhmMTFmMTAwMCkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKHZlcnNhdGlsZV9tYXBfaW8pCi0JSU5JVElSUSh2ZXJzYXRpbGVfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDEwMWYxMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMTFmMTAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAorCS5pbml0X2lycQk9IHZlcnNhdGlsZV9pbml0X2lycSwKIAkudGltZXIJCT0gJnZlcnNhdGlsZV90aW1lciwKLQlJTklUX01BQ0hJTkUodmVyc2F0aWxlX2luaXQpCisJLmluaXRfbWFjaGluZQk9IHZlcnNhdGlsZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9wYi5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKaW5kZXggMjcwMjA5OS4uN2MzMDc4YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX3BiLmMKQEAgLTk5LDExICs5OSwxMyBAQAogYXJjaF9pbml0Y2FsbCh2ZXJzYXRpbGVfcGJfaW5pdCk7CiAKIE1BQ0hJTkVfU1RBUlQoVkVSU0FUSUxFX1BCLCAiQVJNLVZlcnNhdGlsZSBQQiIpCi0JTUFJTlRBSU5FUigiQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCIpCi0JQk9PVF9NRU0oMHgwMDAwMDAwMCwgMHgxMDFmMTAwMCwgMHhmMTFmMTAwMCkKLQlCT09UX1BBUkFNUygweDAwMDAwMTAwKQotCU1BUElPKHZlcnNhdGlsZV9tYXBfaW8pCi0JSU5JVElSUSh2ZXJzYXRpbGVfaW5pdF9pcnEpCisJLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLworCS5waHlzX3JhbQk9IDB4MDAwMDAwMDAsCisJLnBoeXNfaW8JPSAweDEwMWYxMDAwLAorCS5pb19wZ19vZmZzdAk9ICgoMHhmMTFmMTAwMCkgPj4gMTgpICYgMHhmZmZjLAorCS5ib290X3BhcmFtcwk9IDB4MDAwMDAxMDAsCisJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAorCS5pbml0X2lycQk9IHZlcnNhdGlsZV9pbml0X2lycSwKIAkudGltZXIJCT0gJnZlcnNhdGlsZV90aW1lciwKLQlJTklUX01BQ0hJTkUodmVyc2F0aWxlX2luaXQpCisJLmluaXRfbWFjaGluZQk9IHZlcnNhdGlsZV9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDk1NjA2YjQuLmFmYmJlYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtMTAxLDcgKzEwMSw3IEBACiAKICMgQVJNOTI1VAogY29uZmlnIENQVV9BUk05MjVUCi0gCWJvb2wgIlN1cHBvcnQgQVJNOTI1VCBwcm9jZXNzb3IiIGlmIEFSQ0hfT01BUAorIAlib29sICJTdXBwb3J0IEFSTTkyNVQgcHJvY2Vzc29yIiBpZiBBUkNIX09NQVAxCiAgCWRlcGVuZHMgb24gQVJDSF9PTUFQMTUxMAogIAlkZWZhdWx0IHkgaWYgQVJDSF9PTUFQMTUxMAogCXNlbGVjdCBDUFVfMzJ2NApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYmxvY2tvcHMuYyBiL2FyY2gvYXJtL21tL2Jsb2Nrb3BzLmMKaW5kZXggODA2YzZlZS4uNGY1ZWUyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vYmxvY2tvcHMuYworKysgYi9hcmNoL2FybS9tbS9ibG9ja29wcy5jCkBAIC0yNSwxMyArMjUsMTQgQEAKIHsKIAlhc20oCiAJImFkZAlyMSwgcjAsICUwCQkJCQkJCVxuXAorCXN1YglyMSwgcjEsICUxCQkJCQkJCVxuXAogMToJLndvcmQJMHhlYzQwMWYwZQlAIG1jcnIJcDE1LCAwLCByMCwgcjEsIGMxNCwgMAlAIGJsb2NraW5nCVxuXAogCW1vdglyMCwgIzAJCQkJCQkJCVxuXAogCW1jcglwMTUsIDAsIHIwLCBjNywgYzUsIDAJCQkJCQlcblwKIAltY3IJcDE1LCAwLCByMCwgYzcsIGMxMCwgNAkJCQkJCVxuXAogCW1vdglwYywgbHIiCiAJOgotCTogIkkiIChQQUdFX1NJWkUpKTsKKwk6ICJJIiAoUEFHRV9TSVpFKSwgIkkiIChMMV9DQUNIRV9CWVRFUykpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggZTI1YjRmZC4uNjViZmU4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC0zNzIsNDkgKzM3Miw1MCBAQAogc3RhdGljIHN0cnVjdCBmc3JfaW5mbyB7CiAJaW50CSgqZm4pKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IGZzciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCWludAlzaWc7CisJaW50CWNvZGU7CiAJY29uc3QgY2hhciAqbmFtZTsKIH0gZnNyX2luZm9bXSA9IHsKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBzdGFuZGFyZCBBUk12MyBhbmQgQVJNdjQgYWJvcnRzLiAgQVJNdjUKIAkgKiBkZWZpbmVzIHRoZXNlIHRvIGJlICJwcmVjaXNlIiBhYm9ydHMuCiAJICovCi0JeyBkb19iYWQsCQlTSUdTRUdWLCAidmVjdG9yIGV4Y2VwdGlvbiIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdJTEwsCSAiYWxpZ25tZW50IGV4Y2VwdGlvbiIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdLSUxMLCAidGVybWluYWwgZXhjZXB0aW9uIgkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0lMTCwJICJhbGlnbm1lbnQgZXhjZXB0aW9uIgkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywJICJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCi0JeyBkb190cmFuc2xhdGlvbl9mYXVsdCwJU0lHU0VHViwgInNlY3Rpb24gdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gbGluZWZldGNoIgkgICB9LAotCXsgZG9fcGFnZV9mYXVsdCwJU0lHU0VHViwgInBhZ2UgdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIgfSwKLQl7IGRvX2JhZCwJCVNJR1NFR1YsICJzZWN0aW9uIGRvbWFpbiBmYXVsdCIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gbm9uLWxpbmVmZXRjaCIgfSwKLQl7IGRvX2JhZCwJCVNJR1NFR1YsICJwYWdlIGRvbWFpbiBmYXVsdCIJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gdHJhbnNsYXRpb24iICAgfSwKLQl7IGRvX3NlY3RfZmF1bHQsCVNJR1NFR1YsICJzZWN0aW9uIHBlcm1pc3Npb24gZmF1bHQiCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsCSAiZXh0ZXJuYWwgYWJvcnQgb24gdHJhbnNsYXRpb24iICAgfSwKLQl7IGRvX3BhZ2VfZmF1bHQsCVNJR1NFR1YsICJwYWdlIHBlcm1pc3Npb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdTRUdWLCAwLAkJInZlY3RvciBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHSUxMLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHS0lMTCwgMCwJCSJ0ZXJtaW5hbCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHSUxMLAkgQlVTX0FEUkFMTiwJImFsaWdubWVudCBleGNlcHRpb24iCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCisJeyBkb190cmFuc2xhdGlvbl9mYXVsdCwJU0lHU0VHViwgU0VHVl9NQVBFUlIsCSJzZWN0aW9uIHRyYW5zbGF0aW9uIGZhdWx0IgkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLAkgMCwJCSJleHRlcm5hbCBhYm9ydCBvbiBsaW5lZmV0Y2giCSAgIH0sCisJeyBkb19wYWdlX2ZhdWx0LAlTSUdTRUdWLCBTRUdWX01BUEVSUiwJInBhZ2UgdHJhbnNsYXRpb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giICB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJzZWN0aW9uIGRvbWFpbiBmYXVsdCIJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIG5vbi1saW5lZmV0Y2giICB9LAorCXsgZG9fYmFkLAkJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJwYWdlIGRvbWFpbiBmYXVsdCIJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIHRyYW5zbGF0aW9uIgkgICB9LAorCXsgZG9fc2VjdF9mYXVsdCwJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJzZWN0aW9uIHBlcm1pc3Npb24gZmF1bHQiCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsCSAwLAkJImV4dGVybmFsIGFib3J0IG9uIHRyYW5zbGF0aW9uIgkgICB9LAorCXsgZG9fcGFnZV9mYXVsdCwJU0lHU0VHViwgU0VHVl9BQ0NFUlIsCSJwYWdlIHBlcm1pc3Npb24gZmF1bHQiCQkgICB9LAogCS8qCiAJICogVGhlIGZvbGxvd2luZyBhcmUgImltcHJlY2lzZSIgYWJvcnRzLCB3aGljaCBhcmUgc2lnbmFsbGVkIGJ5IGJpdAogCSAqIDEwIG9mIHRoZSBGU1IsIGFuZCBtYXkgbm90IGJlIHJlY292ZXJhYmxlLiAgVGhlc2UgYXJlIG9ubHkKIAkgKiBzdXBwb3J0ZWQgaWYgdGhlIENQVSBhYm9ydCBoYW5kbGVyIHN1cHBvcnRzIGJpdCAxMC4KIAkgKi8KLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDE2IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAxNyIJCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMTgiCQkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDE5IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAibG9jayBhYm9ydCIJCQkgICB9LCAvKiB4c2NhbGUgKi8KLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDIxIgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAiaW1wcmVjaXNlIGV4dGVybmFsIGFib3J0IgkgICB9LCAvKiB4c2NhbGUgKi8KLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDIzIgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAiZGNhY2hlIHBhcml0eSBlcnJvciIJCSAgIH0sIC8qIHhzY2FsZSAqLwotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMjUiCQkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDI2IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAyNyIJCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMjgiCQkJICAgfSwKLQl7IGRvX2JhZCwJCVNJR0JVUywgICJ1bmtub3duIDI5IgkJCSAgIH0sCi0JeyBkb19iYWQsCQlTSUdCVVMsICAidW5rbm93biAzMCIJCQkgICB9LAotCXsgZG9fYmFkLAkJU0lHQlVTLCAgInVua25vd24gMzEiCQkJICAgfQorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDE2IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMTciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAxOCIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDE5IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJImxvY2sgYWJvcnQiCQkJICAgfSwgLyogeHNjYWxlICovCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjEiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIEJVU19PQkpFUlIsCSJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiCSAgIH0sIC8qIHhzY2FsZSAqLworCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDIzIgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJImRjYWNoZSBwYXJpdHkgZXJyb3IiCQkgICB9LCAvKiB4c2NhbGUgKi8KKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyNSIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDI2IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMjciCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAyOCIJCQkgICB9LAorCXsgZG9fYmFkLAkJU0lHQlVTLCAgMCwJCSJ1bmtub3duIDI5IgkJCSAgIH0sCisJeyBkb19iYWQsCQlTSUdCVVMsICAwLAkJInVua25vd24gMzAiCQkJICAgfSwKKwl7IGRvX2JhZCwJCVNJR0JVUywgIDAsCQkidW5rbm93biAzMSIJCQkgICB9CiB9OwogCiB2b2lkIF9faW5pdApAQCAtNDM1LDE1ICs0MzYsMTkgQEAKIGRvX0RhdGFBYm9ydCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWNvbnN0IHN0cnVjdCBmc3JfaW5mbyAqaW5mID0gZnNyX2luZm8gKyAoZnNyICYgMTUpICsgKChmc3IgJiAoMSA8PCAxMCkpID4+IDYpOworCXN0cnVjdCBzaWdpbmZvIGluZm87CiAKIAlpZiAoIWluZi0+Zm4oYWRkciwgZnNyLCByZWdzKSkKIAkJcmV0dXJuOwogCiAJcHJpbnRrKEtFUk5fQUxFUlQgIlVuaGFuZGxlZCBmYXVsdDogJXMgKDB4JTAzeCkgYXQgMHglMDhseFxuIiwKIAkJaW5mLT5uYW1lLCBmc3IsIGFkZHIpOwotCWZvcmNlX3NpZyhpbmYtPnNpZywgY3VycmVudCk7Ci0Jc2hvd19wdGUoY3VycmVudC0+bW0sIGFkZHIpOwotCWRpZV9pZl9rZXJuZWwoIk9vcHMiLCByZWdzLCAwKTsKKworCWluZm8uc2lfc2lnbm8gPSBpbmYtPnNpZzsKKwlpbmZvLnNpX2Vycm5vID0gMDsKKwlpbmZvLnNpX2NvZGUgID0gaW5mLT5jb2RlOworCWluZm8uc2lfYWRkciAgPSAodm9pZCBfX3VzZXIgKilhZGRyOworCW5vdGlmeV9kaWUoIiIsIHJlZ3MsICZpbmZvLCBmc3IsIDApOwogfQogCiBhc21saW5rYWdlIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCBjMDg3MTBiLi5lZGZmYTQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAltZW10YWJsZV9pbml0KG1pKTsKIAlpZiAobWRlc2MtPm1hcF9pbykKIAkJbWRlc2MtPm1hcF9pbygpOwotCWZsdXNoX3RsYl9hbGwoKTsKKwlsb2NhbF9mbHVzaF90bGJfYWxsKCk7CiAKIAkvKgogCSAqIGluaXRpYWxpc2UgdGhlIHpvbmVzIHdpdGhpbiBlYWNoIG5vZGUKQEAgLTUyMiw2ICs1MjIsNjkgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyAlcyBtZW1vcnk6ICVkS1xuIiwgcywgc2l6ZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnJlZV9tZW1tYXAoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJc3RydWN0IHBhZ2UgKnN0YXJ0X3BnLCAqZW5kX3BnOworCXVuc2lnbmVkIGxvbmcgcGcsIHBnZW5kOworCisJLyoKKwkgKiBDb252ZXJ0IHN0YXJ0X3Bmbi9lbmRfcGZuIHRvIGEgc3RydWN0IHBhZ2UgcG9pbnRlci4KKwkgKi8KKwlzdGFydF9wZyA9IHBmbl90b19wYWdlKHN0YXJ0X3Bmbik7CisJZW5kX3BnID0gcGZuX3RvX3BhZ2UoZW5kX3Bmbik7CisKKwkvKgorCSAqIENvbnZlcnQgdG8gcGh5c2ljYWwgYWRkcmVzc2VzLCBhbmQKKwkgKiByb3VuZCBzdGFydCB1cHdhcmRzIGFuZCBlbmQgZG93bndhcmRzLgorCSAqLworCXBnID0gUEFHRV9BTElHTihfX3BhKHN0YXJ0X3BnKSk7CisJcGdlbmQgPSBfX3BhKGVuZF9wZykgJiBQQUdFX01BU0s7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBmcmVlIHBhZ2VzIGJldHdlZW4gdGhlc2UsCisJICogZnJlZSB0aGUgc2VjdGlvbiBvZiB0aGUgbWVtbWFwIGFycmF5LgorCSAqLworCWlmIChwZyA8IHBnZW5kKQorCQlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksIHBnLCBwZ2VuZCAtIHBnKTsKK30KKworLyoKKyAqIFRoZSBtZW1fbWFwIGFycmF5IGNhbiBnZXQgdmVyeSBiaWcuICBGcmVlIHRoZSB1bnVzZWQgYXJlYSBvZiB0aGUgbWVtb3J5IG1hcC4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IGZyZWVfdW51c2VkX21lbW1hcF9ub2RlKGludCBub2RlLCBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJdW5zaWduZWQgbG9uZyBiYW5rX3N0YXJ0LCBwcmV2X2JhbmtfZW5kID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qCisJICogW0ZJWE1FXSBUaGlzIHJlbGllcyBvbiBlYWNoIGJhbmsgYmVpbmcgaW4gYWRkcmVzcyBvcmRlci4gIFRoaXMKKwkgKiBtYXkgbm90IGJlIHRoZSBjYXNlLCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGhhcyBwcm92aWRlZCB0aGUKKwkgKiBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykgeworCQlpZiAobWktPmJhbmtbaV0uc2l6ZSA9PSAwIHx8IG1pLT5iYW5rW2ldLm5vZGUgIT0gbm9kZSkKKwkJCWNvbnRpbnVlOworCisJCWJhbmtfc3RhcnQgPSBtaS0+YmFua1tpXS5zdGFydCA+PiBQQUdFX1NISUZUOworCQlpZiAoYmFua19zdGFydCA8IHByZXZfYmFua19lbmQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTUVNOiB1bm9yZGVyZWQgbWVtb3J5IGJhbmtzLiAgIgorCQkJCSJOb3QgZnJlZWluZyBtZW1tYXAuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UgaGFkIGEgcHJldmlvdXMgYmFuaywgYW5kIHRoZXJlIGlzIGEgc3BhY2UKKwkJICogYmV0d2VlbiB0aGUgY3VycmVudCBiYW5rIGFuZCB0aGUgcHJldmlvdXMsIGZyZWUgaXQuCisJCSAqLworCQlpZiAocHJldl9iYW5rX2VuZCAmJiBwcmV2X2JhbmtfZW5kICE9IGJhbmtfc3RhcnQpCisJCQlmcmVlX21lbW1hcChub2RlLCBwcmV2X2JhbmtfZW5kLCBiYW5rX3N0YXJ0KTsKKworCQlwcmV2X2JhbmtfZW5kID0gKG1pLT5iYW5rW2ldLnN0YXJ0ICsKKwkJCQkgbWktPmJhbmtbaV0uc2l6ZSkgPj4gUEFHRV9TSElGVDsKKwl9Cit9CisKIC8qCiAgKiBtZW1faW5pdCgpIG1hcmtzIHRoZSBmcmVlIGFyZWFzIGluIHRoZSBtZW1fbWFwIGFuZCB0ZWxscyB1cyBob3cgbXVjaAogICogbWVtb3J5IGlzIGZyZWUuICBUaGlzIGlzIGRvbmUgYWZ0ZXIgdmFyaW91cyBwYXJ0cyBvZiB0aGUgc3lzdGVtIGhhdmUKQEAgLTU0MCwxNiArNjAzLDEyIEBACiAJbWF4X21hcG5yICAgPSB2aXJ0X3RvX3BhZ2UoaGlnaF9tZW1vcnkpIC0gbWVtX21hcDsKICNlbmRpZgogCi0JLyoKLQkgKiBXZSBtYXkgaGF2ZSBub24tY29udGlndW91cyBtZW1vcnkuCi0JICovCi0JaWYgKG1lbWluZm8ubnJfYmFua3MgIT0gMSkKLQkJY3JlYXRlX21lbW1hcF9ob2xlcygmbWVtaW5mbyk7Ci0KIAkvKiB0aGlzIHdpbGwgcHV0IGFsbCB1bnVzZWQgbG93IG1lbW9yeSBvbnRvIHRoZSBmcmVlbGlzdHMgKi8KIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CiAJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7CiAKKwkJZnJlZV91bnVzZWRfbWVtbWFwX25vZGUobm9kZSwgJm1lbWluZm8pOworCiAJCWlmIChwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzICE9IDApCiAJCQl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtX25vZGUocGdkYXQpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL21tLWFybXYuYyBiL2FyY2gvYXJtL21tL21tLWFybXYuYwppbmRleCAyYzJiOTNkLi5iMTlmMDBlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9tbS1hcm12LmMKKysrIGIvYXJjaC9hcm0vbW0vbW0tYXJtdi5jCkBAIC0xNjksNyArMTY5LDE0IEBACiAKIAltZW16ZXJvKG5ld19wZ2QsIEZJUlNUX0tFUk5FTF9QR0RfTlIgKiBzaXplb2YocGdkX3QpKTsKIAorCS8qCisJICogQ29weSBvdmVyIHRoZSBrZXJuZWwgYW5kIElPIFBHRCBlbnRyaWVzCisJICovCiAJaW5pdF9wZ2QgPSBwZ2Rfb2Zmc2V0X2soMCk7CisJbWVtY3B5KG5ld19wZ2QgKyBGSVJTVF9LRVJORUxfUEdEX05SLCBpbml0X3BnZCArIEZJUlNUX0tFUk5FTF9QR0RfTlIsCisJCSAgICAgICAoUFRSU19QRVJfUEdEIC0gRklSU1RfS0VSTkVMX1BHRF9OUikgKiBzaXplb2YocGdkX3QpKTsKKworCWNsZWFuX2RjYWNoZV9hcmVhKG5ld19wZ2QsIFBUUlNfUEVSX1BHRCAqIHNpemVvZihwZ2RfdCkpOwogCiAJaWYgKCF2ZWN0b3JzX2hpZ2goKSkgewogCQkvKgpAQCAtMTk4LDE0ICsyMDUsNiBAQAogCQlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CiAJfQogCi0JLyoKLQkgKiBDb3B5IG92ZXIgdGhlIGtlcm5lbCBhbmQgSU8gUEdEIGVudHJpZXMKLQkgKi8KLQltZW1jcHkobmV3X3BnZCArIEZJUlNUX0tFUk5FTF9QR0RfTlIsIGluaXRfcGdkICsgRklSU1RfS0VSTkVMX1BHRF9OUiwKLQkJICAgICAgIChQVFJTX1BFUl9QR0QgLSBGSVJTVF9LRVJORUxfUEdEX05SKSAqIHNpemVvZihwZ2RfdCkpOwotCi0JY2xlYW5fZGNhY2hlX2FyZWEobmV3X3BnZCwgUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7Ci0KIAlyZXR1cm4gbmV3X3BnZDsKIAogbm9fcHRlOgpAQCAtNDAwLDcgKzM5OSw3IEBACiAJCWVjY19tYXNrID0gMDsKIAl9CiAKLQlpZiAoY3B1X2FyY2ggPD0gQ1BVX0FSQ0hfQVJNdjUpIHsKKwlpZiAoY3B1X2FyY2ggPD0gQ1BVX0FSQ0hfQVJNdjVURUopIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX3R5cGVzKTsgaSsrKSB7CiAJCQlpZiAobWVtX3R5cGVzW2ldLnByb3RfbDEpCiAJCQkJbWVtX3R5cGVzW2ldLnByb3RfbDEgfD0gUE1EX0JJVDQ7CkBAIC01ODUsNyArNTg0LDcgQEAKIAkJcG1kdmFsID0gKGkgPDwgUEdESVJfU0hJRlQpIHwKIAkJCSBQTURfU0VDVF9BUF9XUklURSB8IFBNRF9TRUNUX0FQX1JFQUQgfAogCQkJIFBNRF9UWVBFX1NFQ1Q7Ci0JCWlmIChjcHVfYXJjaCA8PSBDUFVfQVJDSF9BUk12NSkKKwkJaWYgKGNwdV9hcmNoIDw9IENQVV9BUkNIX0FSTXY1VEVKKQogCQkJcG1kdmFsIHw9IFBNRF9CSVQ0OwogCQlwbWQgPSBwbWRfb2ZmKHBnZCwgaSA8PCBQR0RJUl9TSElGVCk7CiAJCXBtZFswXSA9IF9fcG1kKHBtZHZhbCk7CkBAIC02ODMsNyArNjgyLDcgQEAKIAl9CiAKIAlmbHVzaF9jYWNoZV9hbGwoKTsKLQlmbHVzaF90bGJfYWxsKCk7CisJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCiAJdG9wX3BtZCA9IHBtZF9vZmZfaygweGZmZmYwMDAwKTsKIH0KQEAgLTY5OCw3NSArNjk3LDMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykKIAkJY3JlYXRlX21hcHBpbmcoaW9fZGVzYyArIGkpOwogfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWZyZWVfbWVtbWFwKGludCBub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQotewotCXN0cnVjdCBwYWdlICpzdGFydF9wZywgKmVuZF9wZzsKLQl1bnNpZ25lZCBsb25nIHBnLCBwZ2VuZDsKLQotCS8qCi0JICogQ29udmVydCBzdGFydF9wZm4vZW5kX3BmbiB0byBhIHN0cnVjdCBwYWdlIHBvaW50ZXIuCi0JICovCi0Jc3RhcnRfcGcgPSBwZm5fdG9fcGFnZShzdGFydF9wZm4pOwotCWVuZF9wZyA9IHBmbl90b19wYWdlKGVuZF9wZm4pOwotCi0JLyoKLQkgKiBDb252ZXJ0IHRvIHBoeXNpY2FsIGFkZHJlc3NlcywgYW5kCi0JICogcm91bmQgc3RhcnQgdXB3YXJkcyBhbmQgZW5kIGRvd253YXJkcy4KLQkgKi8KLQlwZyA9IFBBR0VfQUxJR04oX19wYShzdGFydF9wZykpOwotCXBnZW5kID0gX19wYShlbmRfcGcpICYgUEFHRV9NQVNLOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBhcmUgZnJlZSBwYWdlcyBiZXR3ZWVuIHRoZXNlLAotCSAqIGZyZWUgdGhlIHNlY3Rpb24gb2YgdGhlIG1lbW1hcCBhcnJheS4KLQkgKi8KLQlpZiAocGcgPCBwZ2VuZCkKLQkJZnJlZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLCBwZywgcGdlbmQgLSBwZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3VudXNlZF9tZW1tYXBfbm9kZShpbnQgbm9kZSwgc3RydWN0IG1lbWluZm8gKm1pKQotewotCXVuc2lnbmVkIGxvbmcgYmFua19zdGFydCwgcHJldl9iYW5rX2VuZCA9IDA7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQkvKgotCSAqIFtGSVhNRV0gVGhpcyByZWxpZXMgb24gZWFjaCBiYW5rIGJlaW5nIGluIGFkZHJlc3Mgb3JkZXIuICBUaGlzCi0JICogbWF5IG5vdCBiZSB0aGUgY2FzZSwgZXNwZWNpYWxseSBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQgdGhlCi0JICogaW5mb3JtYXRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspIHsKLQkJaWYgKG1pLT5iYW5rW2ldLnNpemUgPT0gMCB8fCBtaS0+YmFua1tpXS5ub2RlICE9IG5vZGUpCi0JCQljb250aW51ZTsKLQotCQliYW5rX3N0YXJ0ID0gbWktPmJhbmtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVDsKLQkJaWYgKGJhbmtfc3RhcnQgPCBwcmV2X2JhbmtfZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIk1FTTogdW5vcmRlcmVkIG1lbW9yeSBiYW5rcy4gICIKLQkJCQkiTm90IGZyZWVpbmcgbWVtbWFwLlxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCi0JCSAqIElmIHdlIGhhZCBhIHByZXZpb3VzIGJhbmssIGFuZCB0aGVyZSBpcyBhIHNwYWNlCi0JCSAqIGJldHdlZW4gdGhlIGN1cnJlbnQgYmFuayBhbmQgdGhlIHByZXZpb3VzLCBmcmVlIGl0LgotCQkgKi8KLQkJaWYgKHByZXZfYmFua19lbmQgJiYgcHJldl9iYW5rX2VuZCAhPSBiYW5rX3N0YXJ0KQotCQkJZnJlZV9tZW1tYXAobm9kZSwgcHJldl9iYW5rX2VuZCwgYmFua19zdGFydCk7Ci0KLQkJcHJldl9iYW5rX2VuZCA9IFBBR0VfQUxJR04obWktPmJhbmtbaV0uc3RhcnQgKwotCQkJCQkgICBtaS0+YmFua1tpXS5zaXplKSA+PiBQQUdFX1NISUZUOwotCX0KLX0KLQotLyoKLSAqIFRoZSBtZW1fbWFwIGFycmF5IGNhbiBnZXQgdmVyeSBiaWcuICBGcmVlCi0gKiB0aGUgdW51c2VkIGFyZWEgb2YgdGhlIG1lbW9yeSBtYXAuCi0gKi8KLXZvaWQgX19pbml0IGNyZWF0ZV9tZW1tYXBfaG9sZXMoc3RydWN0IG1lbWluZm8gKm1pKQotewotCWludCBub2RlOwotCi0JZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKLQkJZnJlZV91bnVzZWRfbWVtbWFwX25vZGUobm9kZSwgbWkpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwppbmRleCAxZjMyNTIzLi41YzBhZTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwpAQCAtNDQ1LDE0ICs0NDUsMTQgQEAKIAkvKgogCSAqICBSCiAJICogLlJWSSBaRlJTIEJMRFAgV0NBTQotCSAqIC4wLjEgMTAwMSAuLjExIDAxMDEJLyogRklYTUU6IHdoeSBubyBWIGJpdD8gKi8KKwkgKiAuMDExIDEwMDEgLi4xMSAwMTAxCiAJICovCiAJLnR5cGUJYXJtMTAyMF9jcjFfY2xlYXIsICNvYmplY3QKIAkudHlwZQlhcm0xMDIwX2NyMV9zZXQsICNvYmplY3QKIGFybTEwMjBfY3IxX2NsZWFyOgogCS53b3JkCTB4NTkzZgogYXJtMTAyMF9jcjFfc2V0OgotCS53b3JkCTB4MTkzNQorCS53b3JkCTB4MzkzNQogCiAJX19JTklUREFUQQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKaW5kZXggMTQyYTJjMi4uZDY5Mzg5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUwpAQCAtNDI3LDE0ICs0MjcsMTQgQEAKIAkvKgogCSAqICBSCiAJICogLlJWSSBaRlJTIEJMRFAgV0NBTQotCSAqIC4wLjEgMTAwMSAuLjExIDAxMDEJLyogRklYTUU6IHdoeSBubyBWIGJpdD8gKi8KKwkgKiAuMDExIDEwMDEgLi4xMSAwMTAxCiAJICovCiAJLnR5cGUJYXJtMTAyMGVfY3IxX2NsZWFyLCAjb2JqZWN0CiAJLnR5cGUJYXJtMTAyMGVfY3IxX3NldCwgI29iamVjdAogYXJtMTAyMGVfY3IxX2NsZWFyOgogCS53b3JkCTB4NWYzZgogYXJtMTAyMGVfY3IxX3NldDoKLQkud29yZAkweDE5MzUKKwkud29yZAkweDM5MzUKIAogCV9fSU5JVERBVEEKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCmluZGV4IDBhYTczZDQuLjM1MmRiOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjYuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKQEAgLTEzMiw4ICsxMzIsOCBAQAogICoJICAxMDB4ICAgMSAgIDAgICAxCXIvbwlubyBhY2MKICAqCSAgMTB4MCAgIDEgICAwICAgMQlyL28Jbm8gYWNjCiAgKgkgIDEwMTEgICAwICAgMCAgIDEJci93CW5vIGFjYwotICoJICAxMTB4ICAgMSAgIDEgICAwCXIvbwlyL28KLSAqCSAgMTF4MCAgIDEgICAxICAgMAlyL28Jci9vCisgKgkgIDExMHggICAwICAgMSAgIDAJci93CXIvbworICoJICAxMXgwICAgMCAgIDEgICAwCXIvdwlyL28KICAqCSAgMTExMSAgIDAgICAxICAgMQlyL3cJci93CiAgKi8KIEVOVFJZKGNwdV92Nl9zZXRfcHRlKQpAQCAtMTUwLDcgKzE1MCw3IEBACiAJdHN0CXIxLCAjTF9QVEVfVVNFUgogCW9ycm5lCXIyLCByMiwgI0FQMSB8IG5HCiAJdHN0bmUJcjIsICNBUFgKLQllb3JuZQlyMiwgcjIsICNBUDAKKwliaWNuZQlyMiwgcjIsICNBUFggfCBBUDAKIAogCXRzdAlyMSwgI0xfUFRFX1lPVU5HCiAJYmljZXEJcjIsIHIyLCAjQVBYIHwgQVAxIHwgQVAwCkBAIC0yMDAsNyArMjAwLDcgQEAKIAltY3IJcDE1LCAwLCByNCwgYzIsIGMwLCAxCQlAIGxvYWQgVFRCMQogI2lmZGVmIENPTkZJR19WRlAKIAltcmMJcDE1LCAwLCByMCwgYzEsIGMwLCAyCi0Jb3JyCXIwLCByMCwgIygzIDw8IDIwKQorCW9ycglyMCwgcjAsICMoMHhmIDw8IDIwKQogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDIJCUAgRW5hYmxlIGZ1bGwgYWNjZXNzIHRvIFZGUAogI2VuZGlmCiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCByZWFkIGNvbnRyb2wgcmVnaXN0ZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL3NvZnRmbG9hdC1tYWNyb3MgYi9hcmNoL2FybS9ud2ZwZS9zb2Z0ZmxvYXQtbWFjcm9zCmluZGV4IDU0Njk5ODkuLjVhMDYwZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL253ZnBlL3NvZnRmbG9hdC1tYWNyb3MKKysrIGIvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LW1hY3JvcwpAQCAtNTYzLDggKzU2MywxNCBAQAogICAgIGJpdHM2NCByZW0wLCByZW0xLCB0ZXJtMCwgdGVybTE7CiAgICAgYml0czY0IHo7CiAgICAgaWYgKCBiIDw9IGEwICkgcmV0dXJuIExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKTsKLSAgICBiMCA9IGI+PjMyOwotICAgIHogPSAoIGIwPDwzMiA8PSBhMCApID8gTElUNjQoIDB4RkZGRkZGRkYwMDAwMDAwMCApIDogKCBhMCAvIGIwICk8PDMyOworICAgIGIwID0gYj4+MzI7ICAvKiBoZW5jZSBiMCBpcyAzMiBiaXRzIHdpZGUgbm93ICovCisgICAgaWYgKCBiMDw8MzIgPD0gYTAgKSB7CisgICAgICAgIHogPSBMSVQ2NCggMHhGRkZGRkZGRjAwMDAwMDAwICk7CisgICAgfSAgZWxzZSB7CisgICAgICAgIHogPSBhMDsKKyAgICAgICAgZG9fZGl2KCB6LCBiMCApOworICAgICAgICB6IDw8PSAzMjsKKyAgICB9CiAgICAgbXVsNjRUbzEyOCggYiwgeiwgJnRlcm0wLCAmdGVybTEgKTsKICAgICBzdWIxMjgoIGEwLCBhMSwgdGVybTAsIHRlcm0xLCAmcmVtMCwgJnJlbTEgKTsKICAgICB3aGlsZSAoICggKHNiaXRzNjQpIHJlbTAgKSA8IDAgKSB7CkBAIC01NzMsNyArNTc5LDEyIEBACiAgICAgICAgIGFkZDEyOCggcmVtMCwgcmVtMSwgYjAsIGIxLCAmcmVtMCwgJnJlbTEgKTsKICAgICB9CiAgICAgcmVtMCA9ICggcmVtMDw8MzIgKSB8ICggcmVtMT4+MzIgKTsKLSAgICB6IHw9ICggYjA8PDMyIDw9IHJlbTAgKSA/IDB4RkZGRkZGRkYgOiByZW0wIC8gYjA7CisgICAgaWYgKCBiMDw8MzIgPD0gcmVtMCApIHsKKyAgICAgICAgeiB8PSAweEZGRkZGRkZGOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvX2RpdiggcmVtMCwgYjAgKTsKKyAgICAgICAgeiB8PSByZW0wOworICAgIH0KICAgICByZXR1cm4gejsKIAogfQpAQCAtNjAxLDYgKzYxMiw3IEBACiAgICAgfTsKICAgICBpbnQ4IGluZGV4OwogICAgIGJpdHMzMiB6OworICAgIGJpdHM2NCBBOwogCiAgICAgaW5kZXggPSAoIGE+PjI3ICkgJiAxNTsKICAgICBpZiAoIGFFeHAgJiAxICkgewpAQCAtNjE0LDcgKzYyNiw5IEBACiAgICAgICAgIHogPSAoIDB4MjAwMDAgPD0geiApID8gMHhGRkZGODAwMCA6ICggejw8MTUgKTsKICAgICAgICAgaWYgKCB6IDw9IGEgKSByZXR1cm4gKGJpdHMzMikgKCAoIChzYml0czMyKSBhICk+PjEgKTsKICAgICB9Ci0gICAgcmV0dXJuICggKGJpdHMzMikgKCAoICggKGJpdHM2NCkgYSApPDwzMSApIC8geiApICkgKyAoIHo+PjEgKTsKKyAgICBBID0gKCAoYml0czY0KSBhICk8PDMxOworICAgIGRvX2RpdiggQSwgeiApOworICAgIHJldHVybiAoIChiaXRzMzIpIEEgKSArICggej4+MSApOwogCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL3NvZnRmbG9hdC5jIGIvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LmMKaW5kZXggOWQ3NDNhZS4uZTAzOGRkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LmMKKysrIGIvYXJjaC9hcm0vbndmcGUvc29mdGZsb2F0LmMKQEAgLTI4LDYgKzI4LDggQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKwogI2luY2x1ZGUgImZwYTExLmgiCiAvLyNpbmNsdWRlICJtaWxpZXUuaCIKIC8vI2luY2x1ZGUgInNvZnRmbG9hdC5oIgpAQCAtMTMzMSw3ICsxMzMzLDExIEBACiAgICAgICAgIGFTaWcgPj49IDE7CiAgICAgICAgICsrekV4cDsKICAgICB9Ci0gICAgelNpZyA9ICggKCAoYml0czY0KSBhU2lnICk8PDMyICkgLyBiU2lnOworICAgIHsKKyAgICAgICAgYml0czY0IHRtcCA9ICggKGJpdHM2NCkgYVNpZyApPDwzMjsKKyAgICAgICAgZG9fZGl2KCB0bXAsIGJTaWcgKTsKKyAgICAgICAgelNpZyA9IHRtcDsKKyAgICB9CiAgICAgaWYgKCAoIHpTaWcgJiAweDNGICkgPT0gMCApIHsKICAgICAgICAgelNpZyB8PSAoICggKGJpdHM2NCkgYlNpZyApICogelNpZyAhPSAoIChiaXRzNjQpIGFTaWcgKTw8MzIgKTsKICAgICB9CkBAIC0xMzk3LDcgKzE0MDMsOSBAQAogICAgICAgICBxID0gKCBiU2lnIDw9IGFTaWcgKTsKICAgICAgICAgaWYgKCBxICkgYVNpZyAtPSBiU2lnOwogICAgICAgICBpZiAoIDAgPCBleHBEaWZmICkgewotICAgICAgICAgICAgcSA9ICggKCAoYml0czY0KSBhU2lnICk8PDMyICkgLyBiU2lnOworICAgICAgICAgICAgYml0czY0IHRtcCA9ICggKGJpdHM2NCkgYVNpZyApPDwzMjsKKyAgICAgICAgICAgIGRvX2RpdiggdG1wLCBiU2lnICk7CisgICAgICAgICAgICBxID0gdG1wOwogICAgICAgICAgICAgcSA+Pj0gMzIgLSBleHBEaWZmOwogICAgICAgICAgICAgYlNpZyA+Pj0gMjsKICAgICAgICAgICAgIGFTaWcgPSAoICggYVNpZz4+MSApPDwoIGV4cERpZmYgLSAxICkgKSAtIGJTaWcgKiBxOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCBiYTFhNmU5Li44ZmZiNTIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtNiw2ICs2LDYgQEAKIAkJb3Byb2ZpbGVmcy5vIG9wcm9maWxlX3N0YXRzLm8gXAogCQl0aW1lcl9pbnQubyApCiAKLW9wcm9maWxlLXkJCQkJOj0gJChEUklWRVJfT0JKUykgaW5pdC5vCitvcHJvZmlsZS15CQkJCTo9ICQoRFJJVkVSX09CSlMpIGluaXQubyBiYWNrdHJhY2Uubwogb3Byb2ZpbGUtJChDT05GSUdfQ1BVX1hTQ0FMRSkJCSs9IGNvbW1vbi5vIG9wX21vZGVsX3hzY2FsZS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL2JhY2t0cmFjZS5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvYmFja3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1OGQzZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQXJtIHNwZWNpZmljIGJhY2t0cmFjaW5nIGNvZGUgZm9yIG9wcm9maWxlCisgKgorICogQ29weXJpZ2h0IDIwMDUgT3BlbmVkaGFuZCBMdGQuCisgKgorICogQXV0aG9yOiBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBvcGVuZWRoYW5kLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBpMzg2IG9wcm9maWxlIGJhY2t0cmFjZSBjb2RlIGJ5IEpvaG4gTGV2b24sIERhdmlkIFNtaXRoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKKy8qCisgKiBUaGUgcmVnaXN0ZXJzIHdlJ3JlIGludGVyZXN0ZWQgaW4gYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHZhcmlhYmxlCisgKiBsZW5ndGggc2F2ZWQgcmVnaXN0ZXIgc3RydWN0dXJlLiBUaGUgZnAgcG9pbnRzIGF0IHRoZSBlbmQgb2YgdGhpcworICogc3RydWN0dXJlIHNvIHRoZSBhZGRyZXNzIG9mIHRoaXMgc3RydWN0IGlzOgorICogKHN0cnVjdCBmcmFtZV90YWlsICopKHh4eC0+ZnApLTEKKyAqLworc3RydWN0IGZyYW1lX3RhaWwgeworCXN0cnVjdCBmcmFtZV90YWlsICpmcDsKKwl1bnNpZ25lZCBsb25nIHNwOworCXVuc2lnbmVkIGxvbmcgbHI7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorc3RhdGljIHN0cnVjdCBmcmFtZV90YWlsKiBrZXJuZWxfYmFja3RyYWNlKHN0cnVjdCBmcmFtZV90YWlsICp0YWlsKQoreworCW9wcm9maWxlX2FkZF90cmFjZSh0YWlsLT5scik7CisKKwkvKiBmcmFtZSBwb2ludGVycyBzaG91bGQgc3RyaWN0bHkgcHJvZ3Jlc3MgYmFjayB1cCB0aGUgc3RhY2sKKwkgKiAodG93YXJkcyBoaWdoZXIgYWRkcmVzc2VzKSAqLworCWlmICh0YWlsID49IHRhaWwtPmZwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB0YWlsLT5mcC0xOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZnJhbWVfdGFpbCogdXNlcl9iYWNrdHJhY2Uoc3RydWN0IGZyYW1lX3RhaWwgKnRhaWwpCit7CisJc3RydWN0IGZyYW1lX3RhaWwgYnVmdGFpbDsKKworCS8qIGhhcmR3YXJlIHB0ZSBtaWdodCBub3QgYmUgdmFsaWQgZHVlIHRvIGRpcnR5L2FjY2Vzc2VkIGJpdCBlbXVsYXRpb24KKwkgKiBzbyB3ZSB1c2UgY29weV9mcm9tX3VzZXIgYW5kIGJlbmVmaXQgZnJvbSBleGNlcHRpb24gZml4dXBzICovCisJaWYgKGNvcHlfZnJvbV91c2VyKCZidWZ0YWlsLCB0YWlsLCBzaXplb2Yoc3RydWN0IGZyYW1lX3RhaWwpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlvcHJvZmlsZV9hZGRfdHJhY2UoYnVmdGFpbC5scik7CisKKwkvKiBmcmFtZSBwb2ludGVycyBzaG91bGQgc3RyaWN0bHkgcHJvZ3Jlc3MgYmFjayB1cCB0aGUgc3RhY2sKKwkgKiAodG93YXJkcyBoaWdoZXIgYWRkcmVzc2VzKSAqLworCWlmICh0YWlsID49IGJ1ZnRhaWwuZnApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGJ1ZnRhaWwuZnAtMTsKK30KKworLyogQ29tcGFyZSB0d28gYWRkcmVzc2VzIGFuZCBzZWUgaWYgdGhleSdyZSBvbiB0aGUgc2FtZSBwYWdlICovCisjZGVmaW5lIENNUF9BRERSX0VRVUFMKHgseSxvZmZzZXQpICgoKCh1bnNpZ25lZCBsb25nKSB4KSA+PiBQQUdFX1NISUZUKSBcCisJPT0gKCgoKHVuc2lnbmVkIGxvbmcpIHkpICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZUKSkKKworLyogY2hlY2sgdGhhdCB0aGUgcGFnZShzKSBjb250YWluaW5nIHRoZSBmcmFtZSB0YWlsIGFyZSBwcmVzZW50ICovCitzdGF0aWMgaW50IHBhZ2VzX3ByZXNlbnQoc3RydWN0IGZyYW1lX3RhaWwgKnRhaWwpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gY3VycmVudC0+bW07CisKKwlpZiAoIWNoZWNrX3VzZXJfcGFnZV9yZWFkYWJsZShtbSwgKHVuc2lnbmVkIGxvbmcpdGFpbCkpCisJCXJldHVybiAwOworCisJaWYgKENNUF9BRERSX0VRVUFMKHRhaWwsIHRhaWwsIDgpKQorCQlyZXR1cm4gMTsKKworCWlmICghY2hlY2tfdXNlcl9wYWdlX3JlYWRhYmxlKG1tLCAoKHVuc2lnbmVkIGxvbmcpdGFpbCkgKyA4KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHwgICAgICAgICAgICAgfCAvXCBIaWdoZXIgYWRkcmVzc2VzCisgKiB8ICAgICAgICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLSBzdGFjayBiYXNlIChhZGRyZXNzIG9mIGN1cnJlbnRfdGhyZWFkX2luZm8pCisgKiB8IHRocmVhZCBpbmZvIHwKKyAqIC4gICAgICAgICAgICAgLgorICogfCAgICBzdGFjayAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gc2F2ZWQgcmVncy0+QVJNX2ZwIHZhbHVlIGlmIHZhbGlkIChmcmFtZV90YWlsIGFkZHJlc3MpCisgKiAuICAgICAgICAgICAgIC4KKyAqIC0tLS0tLS0tLS0tLS0tLSBzdHJ1Y3QgcHRfcmVncyBzdG9yZWQgb24gc3RhY2sgKHN0cnVjdCBwdF9yZWdzICopCisgKiB8ICAgICAgICAgICAgIHwKKyAqIC4gICAgICAgICAgICAgLgorICogfCAgICAgICAgICAgICB8CisgKiAtLS0tLS0tLS0tLS0tLS0gJWVzcAorICogfCAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgIHwgXC8gTG93ZXIgYWRkcmVzc2VzCisgKgorICogVGh1cywgJnB0X3JlZ3MgPC0+IHN0YWNrIGJhc2UgcmVzdHJpY3RzIHRoZSB2YWxpZChpc2gpIGZwIHZhbHVlcworICovCitzdGF0aWMgaW50IHZhbGlkX2tlcm5lbF9zdGFjayhzdHJ1Y3QgZnJhbWVfdGFpbCAqdGFpbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyB0YWlsYWRkciA9ICh1bnNpZ25lZCBsb25nKXRhaWw7CisJdW5zaWduZWQgbG9uZyBzdGFjayA9ICh1bnNpZ25lZCBsb25nKXJlZ3M7CisJdW5zaWduZWQgbG9uZyBzdGFja19iYXNlID0gKHN0YWNrICYgfihUSFJFQURfU0laRSAtIDEpKSArIFRIUkVBRF9TSVpFOworCisJcmV0dXJuICh0YWlsYWRkciA+IHN0YWNrKSAmJiAodGFpbGFkZHIgPCBzdGFja19iYXNlKTsKK30KKwordm9pZCBhcm1fYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzIGNvbnN0ICpyZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJc3RydWN0IGZyYW1lX3RhaWwgKnRhaWw7CisJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHJlc3MgPSAwOworCisJdGFpbCA9ICgoc3RydWN0IGZyYW1lX3RhaWwgKikgcmVncy0+QVJNX2ZwKSAtIDE7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKwkJd2hpbGUgKGRlcHRoLS0gJiYgdGFpbCAmJiB2YWxpZF9rZXJuZWxfc3RhY2sodGFpbCwgcmVncykpIHsKKwkJCXRhaWwgPSBrZXJuZWxfYmFja3RyYWNlKHRhaWwpOworCQl9CisjZW5kaWYKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChkZXB0aC0tICYmIHRhaWwgJiYgISgodW5zaWduZWQgbG9uZykgdGFpbCAmIDMpKSB7CisJCWlmICgoIUNNUF9BRERSX0VRVUFMKGxhc3RfYWRkcmVzcywgdGFpbCwgMCkKKwkJCXx8ICFDTVBfQUREUl9FUVVBTChsYXN0X2FkZHJlc3MsIHRhaWwsIDgpKQorCQkJCSYmICFwYWdlc19wcmVzZW50KHRhaWwpKQorCQkJcmV0dXJuOworCQlsYXN0X2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgdGFpbDsKKwkJdGFpbCA9IHVzZXJfYmFja3RyYWNlKHRhaWwpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvaW5pdC5jCmluZGV4IGNjZTNkMzAuLmQzMTVhM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL29wcm9maWxlL2luaXQuYworKysgYi9hcmNoL2FybS9vcHJvZmlsZS9pbml0LmMKQEAgLTIwLDYgKzIwLDggQEAKIAlyZXQgPSBwbXVfaW5pdChvcHMsICZvcF94c2NhbGVfc3BlYyk7CiAjZW5kaWYKIAorCW9wcy0+YmFja3RyYWNlID0gYXJtX2JhY2t0cmFjZTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL29wX2FybV9tb2RlbC5oIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKaW5kZXggMmQ0Y2FmNC4uMjE0OGQwNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvb3BfYXJtX21vZGVsLmgKQEAgLTI0LDYgKzI0LDggQEAKIGV4dGVybiBzdHJ1Y3Qgb3BfYXJtX21vZGVsX3NwZWMgb3BfeHNjYWxlX3NwZWM7CiAjZW5kaWYKIAorZXh0ZXJuIHZvaWQgYXJtX2JhY2t0cmFjZShzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CisKIGV4dGVybiBpbnQgX19pbml0IHBtdV9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMsIHN0cnVjdCBvcF9hcm1fbW9kZWxfc3BlYyAqc3BlYyk7CiBleHRlcm4gdm9pZCBwbXVfZXhpdCh2b2lkKTsKICNlbmRpZiAvKiBPUF9BUk1fTU9ERUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcgYi9hcmNoL2FybS9wbGF0LW9tYXAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUzNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKK2lmIEFSQ0hfT01BUAorCittZW51ICJUSSBPTUFQIEltcGxlbWVudGF0aW9ucyIKKworY29uZmlnIEFSQ0hfT01BUF9PVEcKKwlib29sCisKK2Nob2ljZQorCXByb21wdCAiT01BUCBTeXN0ZW0gVHlwZSIKKwlkZWZhdWx0IEFSQ0hfT01BUDEKKworY29uZmlnIEFSQ0hfT01BUDEKKwlib29sICJUSSBPTUFQMSIKKworY29uZmlnIEFSQ0hfT01BUDIKKwlib29sICJUSSBPTUFQMiIKKworZW5kY2hvaWNlCisKK2NvbW1lbnQgIk9NQVAgRmVhdHVyZSBTZWxlY3Rpb25zIgorCitjb25maWcgT01BUF9SRVNFVF9DTE9DS1MKKwlib29sICJSZXNldCB1bnVzZWQgY2xvY2tzIGR1cmluZyBib290IgorCWRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gcmVzZXQgdW51c2VkIGNsb2NrcyBkdXJpbmcgYm9vdC4KKwkgIFRoaXMgb3B0aW9uIHNhdmVzIHBvd2VyLCBidXQgYXNzdW1lcyBhbGwgZHJpdmVycyBhcmUKKwkgIHVzaW5nIHRoZSBjbG9jayBmcmFtZXdvcmsuIEJyb2tlbiBkcml2ZXJzIHRoYXQgZG8gbm90CisJICB5ZXQgdXNlIGNsb2NrIGZyYW1ld29yayBtYXkgbm90IHdvcmsgd2l0aCB0aGlzIG9wdGlvbi4KKwkgIElmIHlvdSBhcmUgYm9vdGluZyBmcm9tIGFub3RoZXIgb3BlcmF0aW5nIHN5c3RlbSwgeW91CisJICBwcm9iYWJseSBkbyBub3Qgd2FudCB0aGlzIG9wdGlvbiBlbmFibGVkIHVudGlsIHlvdXIKKwkgIGRldmljZSBkcml2ZXJzIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBPTUFQX01VWAorCWJvb2wgIk9NQVAgbXVsdGlwbGV4aW5nIHN1cHBvcnQiCisgICAgICAgIGRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVmYXVsdCB5CisgICAgICAgIGhlbHAKKyAgICAgICAgICBQaW4gbXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIE9NQVAgYm9hcmRzLiBJZiB5b3VyIGJvb3Rsb2FkZXIKKyAgICAgICAgICBzZXRzIHRoZSBtdWx0aXBsZXhpbmcgY29ycmVjdGx5LCBzYXkgTi4gT3RoZXJ3aXNlLCBvciBpZiB1bnN1cmUsCisgICAgICAgICAgc2F5IFkuCisKK2NvbmZpZyBPTUFQX01VWF9ERUJVRworCWJvb2wgIk11bHRpcGxleGluZyBkZWJ1ZyBvdXRwdXQiCisgICAgICAgIGRlcGVuZHMgb24gT01BUF9NVVgKKyAgICAgICAgZGVmYXVsdCBuCisgICAgICAgIGhlbHAKKyAgICAgICAgICBNYWtlcyB0aGUgbXVsdGlwbGV4aW5nIGZ1bmN0aW9ucyBwcmludCBvdXQgYSBsb3Qgb2YgZGVidWcgaW5mby4KKyAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBmaW5kIG91dCB0aGUgY29ycmVjdCB2YWx1ZXMgb2YgdGhlCisgICAgICAgICAgbXVsdGlwbGV4aW5nIHJlZ2lzdGVycy4KKworY29uZmlnIE9NQVBfTVVYX1dBUk5JTkdTCisJYm9vbCAiV2FybiBhYm91dCBwaW5zIHRoZSBib290bG9hZGVyIGRpZG4ndCBzZXQgdXAiCisgICAgICAgIGRlcGVuZHMgb24gT01BUF9NVVgKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIGhlbHAKKwkgIENob29zZSBZIGhlcmUgdG8gd2FybiB3aGVuZXZlciBkcml2ZXIgaW5pdGlhbGl6YXRpb24gbG9naWMgbmVlZHMKKwkgIHRvIGNoYW5nZSB0aGUgcGluIG11bHRpcGxleGluZyBzZXR1cC4gIFdoZW4gdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisJICBwcmludGVkLCBpdCdzIHNhZmUgdG8gZGVzZWxlY3QgT01BUF9NVVggZm9yIHlvdXIgcHJvZHVjdC4KKworY2hvaWNlCisgICAgICAgIHByb21wdCAiU3lzdGVtIHRpbWVyIgorCWRlZmF1bHQgT01BUF9NUFVfVElNRVIKKworY29uZmlnIE9NQVBfTVBVX1RJTUVSCisJYm9vbCAiVXNlIG1wdSB0aW1lciIKKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBPTUFQIG1wdSB0aW1lci4gVGhpcworCSAgdGltZXIgcHJvdmlkZXMgbW9yZSBpbnRyYS10aWNrIHJlc29sdXRpb24gdGhhbiB0aGUgMzJLSHogdGltZXIsCisJICBidXQgY29uc3VtZXMgbW9yZSBwb3dlci4KKworY29uZmlnIE9NQVBfMzJLX1RJTUVSCisJYm9vbCAiVXNlIDMyS0h6IHRpbWVyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIE9NQVAgMzJLSHogdGltZXIuCisJICBUaGlzIHRpbWVyIHNhdmVzIHBvd2VyIGNvbXBhcmVkIHRvIHRoZSBPTUFQX01QVV9USU1FUiwgYW5kIGhhcworCSAgc3VwcG9ydCBmb3Igbm8gdGljayBkdXJpbmcgaWRsZS4gVGhlIDMyS0h6IHRpbWVyIHByb3ZpZGVzIGxlc3MKKwkgIGludHJhLXRpY2sgcmVzb2x1dGlvbiB0aGFuIE9NQVBfTVBVX1RJTUVSLiBUaGUgMzJLSHogdGltZXIgaXMKKwkgIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBmb3IgT01BUC0xNnh4LgorCitlbmRjaG9pY2UKKworY29uZmlnIE9NQVBfMzJLX1RJTUVSX0haCisgICAgICAgaW50ICJLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IGZvciAzMktIeiB0aW1lciIKKyAgICAgICByYW5nZSAzMiAxMDI0CisgICAgICAgZGVwZW5kcyBvbiBPTUFQXzMyS19USU1FUgorICAgICAgIGRlZmF1bHQgIjEyOCIKKyAgICAgICBoZWxwCisJICBLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IHNob3VsZCBiZSBhIGRpdmlzb3Igb2YgMzI3NjgsCisJICBzdWNoIGFzIDY0IG9yIDEyOC4KKworY2hvaWNlCisJcHJvbXB0ICJMb3ctbGV2ZWwgZGVidWcgY29uc29sZSBVQVJUIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQCisJZGVmYXVsdCBPTUFQX0xMX0RFQlVHX1VBUlQxCisKK2NvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQxCisJYm9vbCAiVUFSVDEiCisKK2NvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQyCisJYm9vbCAiVUFSVDIiCisKK2NvbmZpZyBPTUFQX0xMX0RFQlVHX1VBUlQzCisJYm9vbCAiVUFSVDMiCisKK2VuZGNob2ljZQorCitlbmRtZW51CisKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxZTExYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgorIworCisjIENvbW1vbiBzdXBwb3J0CitvYmoteSA6PSBjb21tb24ubyBkbWEubyBjbG9jay5vIG11eC5vIGdwaW8ubyBtY2JzcC5vIHVzYi5vCitvYmotbSA6PQorb2JqLW4gOj0KK29iai0gIDo9CisKKyMgT0NQSSBpbnRlcmNvbm5lY3Qgc3VwcG9ydCBmb3IgMTcxMCwgMTYxMCBhbmQgNTkxMgorb2JqLSQoQ09ORklHX0FSQ0hfT01BUDE2WFgpICs9IG9jcGkubworCisjIFBvd2VyIE1hbmFnZW1lbnQKK29iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCisKK29iai0kKENPTkZJR19DUFVfRlJFUSkgKz0gY3B1LW9tYXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ5MWIzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmMKQEAgLTAsMCArMSwxMzIzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBjb3Jwb3JhdGlvbgorICogIFdyaXR0ZW4gYnkgVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorCitzdGF0aWMgTElTVF9IRUFEKGNsb2Nrcyk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChjbG9ja3Nfc2VtKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tmd19sb2NrKTsKK3N0YXRpYyB2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrKTsKKy8qIFVBUlQgY2xvY2sgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgc2V0X3VhcnRfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOworLyogRXh0ZXJuYWwgY2xvY2sgKE1DTEsgJiBCQ0xLKSBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2V0X2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK3N0YXRpYyBsb25nIHJvdW5kX2V4dF9jbGtfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKTsKK3N0YXRpYyB2b2lkIGluaXRfZXh0X2NsayhzdHJ1Y3QgY2xrICogIGNsayk7CisvKiBNUFUgdmlydHVhbCBjbG9jayBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X3RhYmxlX3JhdGUoc3RydWN0IGNsayAqICBjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CitzdGF0aWMgbG9uZyByb3VuZF90b190YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpOwordm9pZCBjbGtfc2V0ZHBsbChfX3UxNiwgX191MTYpOworCitzdGF0aWMgc3RydWN0IG1wdV9yYXRlIHJhdGVfdGFibGVbXSA9IHsKKwkvKiBNUFUgTUh6LCB4dGFsIE1IeiwgZHBsbDEgTUh6LCBDS0NUTCwgRFBMTF9DVEwKKwkgKiBhcm1kaXYsIGRzcGRpdiwgZHNwbW11LCB0Y2RpdiwgcGVyZGl2LCBsY2RkaXYKKwkgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8yMTZNSFopCisJeyAyMTYwMDAwMDAsIDEyMDAwMDAwLCAyMTYwMDAwMDAsIDB4MDUwZCwgMHgyOTEwIH0sIC8qIDEvMS8yLzIvMi84ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xOTVNSFopCisJeyAxOTUwMDAwMDAsIDEzMDAwMDAwLCAxOTUwMDAwMDAsIDB4MDUwZSwgMHgyNzkwIH0sIC8qIDEvMS8yLzIvNC84ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xOTJNSFopCisJeyAxOTIwMDAwMDAsIDE5MjAwMDAwLCAxOTIwMDAwMDAsIDB4MDUwZiwgMHgyNTEwIH0sIC8qIDEvMS8yLzIvOC84ICovCisJeyAxOTIwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MDUwZiwgMHgyODEwIH0sIC8qIDEvMS8yLzIvOC84ICovCisJeyAgOTYwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MDU1ZiwgMHgyODEwIH0sIC8qIDIvMi8yLzIvOC84ICovCisJeyAgNDgwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MGJhZiwgMHgyODEwIH0sIC8qIDQvOC80LzQvOC84ICovCisJeyAgMjQwMDAwMDAsIDEyMDAwMDAwLCAxOTIwMDAwMDAsIDB4MGZmZiwgMHgyODEwIH0sIC8qIDgvOC84LzgvOC84ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xODJNSFopCisJeyAxODIwMDAwMDAsIDEzMDAwMDAwLCAxODIwMDAwMDAsIDB4MDUwZSwgMHgyNzEwIH0sIC8qIDEvMS8yLzIvNC84ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xNjhNSFopCisJeyAxNjgwMDAwMDAsIDEyMDAwMDAwLCAxNjgwMDAwMDAsIDB4MDEwZiwgMHgyNzEwIH0sIC8qIDEvMS8xLzIvOC84ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xNTBNSFopCisJeyAxNTAwMDAwMDAsIDEyMDAwMDAwLCAxNTAwMDAwMDAsIDB4MDEwYSwgMHgyY2IwIH0sIC8qIDEvMS8xLzIvNC80ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV8xMjBNSFopCisJeyAxMjAwMDAwMDAsIDEyMDAwMDAwLCAxMjAwMDAwMDAsIDB4MDEwYSwgMHgyNTEwIH0sIC8qIDEvMS8xLzIvNC80ICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19PTUFQX0FSTV85Nk1IWikKKwl7ICA5NjAwMDAwMCwgMTIwMDAwMDAsICA5NjAwMDAwMCwgMHgwMDA1LCAweDI0MTAgfSwgLyogMS8xLzEvMS8yLzIgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX09NQVBfQVJNXzYwTUhaKQorCXsgIDYwMDAwMDAwLCAxMjAwMDAwMCwgIDYwMDAwMDAwLCAweDAwMDUsIDB4MjI5MCB9LCAvKiAxLzEvMS8xLzIvMiAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfT01BUF9BUk1fMzBNSFopCisJeyAgMzAwMDAwMDAsIDEyMDAwMDAwLCAgNjAwMDAwMDAsIDB4MDU1NSwgMHgyMjkwIH0sIC8qIDIvMi8yLzIvMi8yICovCisjZW5kaWYKKwl7IDAsIDAsIDAsIDAsIDAgfSwKK307CisKKworc3RhdGljIHZvaWQgY2tjdGxfcmVjYWxjKHN0cnVjdCBjbGsgKiAgY2xrKTsKK2ludCBfX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKTsKK3ZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspOwordm9pZCBfX2Nsa191bnVzZShzdHJ1Y3QgY2xrICpjbGspOworaW50IF9fY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspOworCisKK3N0YXRpYyB2b2lkIGZvbGxvd3BhcmVudF9yZWNhbGMoc3RydWN0IGNsayAqICBjbGspCit7CisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGU7Cit9CisKKworc3RhdGljIHZvaWQgd2F0Y2hkb2dfcmVjYWxjKHN0cnVjdCBjbGsgKiAgY2xrKQoreworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gMTQ7Cit9CisKK3N0YXRpYyB2b2lkIHVhcnRfcmVjYWxjKHN0cnVjdCBjbGsgKiBjbGspCit7CisJdW5zaWduZWQgaW50IHZhbCA9IG9tYXBfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwlpZiAodmFsICYgY2xrLT5lbmFibGVfYml0KQorCQljbGstPnJhdGUgPSA0ODAwMDAwMDsKKwllbHNlCisJCWNsay0+cmF0ZSA9IDEyMDAwMDAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBja19yZWYgPSB7CisJLm5hbWUJCT0gImNrX3JlZiIsCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBBTFdBWVNfRU5BQkxFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNrX2RwbGwxID0geworCS5uYW1lCQk9ICJja19kcGxsMSIsCisJLnBhcmVudAkJPSAmY2tfcmVmLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBja19kcGxsMW91dCA9IHsKKwkubmFtZQkJPSAiY2tfZHBsbDFvdXQiLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fQ0tPVVRfQVJNLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1fY2sgPSB7CisJLm5hbWUJCT0gImFybV9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMIHwgUkFURV9QUk9QQUdBVEVTIHwgQUxXQVlTX0VOQUJMRUQsCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfQVJNRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1wZXJfY2sgPSB7CisJLm5hbWUJCT0gImFybXBlcl9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVA3MzAgfCBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9DS0NUTCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfUEVSRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1fZ3Bpb19jayA9IHsKKwkubmFtZQkJPSAiYXJtX2dwaW9fY2siLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fR1BJT0NLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm14b3JfY2sgPSB7CisJLm5hbWUJCT0gImFybXhvcl9jayIsCisJLnBhcmVudAkJPSAmY2tfcmVmLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9YT1JQQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGFybXRpbV9jayA9IHsKKwkubmFtZQkJPSAiYXJtdGltX2NrIiwKKwkucGFyZW50CQk9ICZja19yZWYsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1RJTUNLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm13ZHRfY2sgPSB7CisJLm5hbWUJCT0gImFybXdkdF9jayIsCisJLnBhcmVudAkJPSAmY2tfcmVmLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDIsCisJLmVuYWJsZV9iaXQJPSBFTl9XRFRDSywKKwkucmVjYWxjCQk9ICZ3YXRjaGRvZ19yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1pbnRoX2NrMTZ4eCA9IHsKKwkubmFtZQkJPSAiYXJtaW50aF9jayIsCisJLnBhcmVudAkJPSAmYXJtX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IEFMV0FZU19FTkFCTEVELAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLyogTm90ZTogT24gMTZ4eCB0aGUgZnJlcXVlbmN5IGNhbiBiZSBkaXZpZGVkIGJ5IDIgYnkgcHJvZ3JhbW1pbmcKKwkgKiBBUk1fQ0tDVEw6QVJNX0lOVEhDS19TRUwoMTQpIHRvIDEKKwkgKgorCSAqIDE1MTAgdmVyc2lvbiBpcyBpbiBUQyBjbG9ja3MuCisJICovCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BfY2sgPSB7CisJLm5hbWUJCT0gImRzcF9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMLAorCS5lbmFibGVfcmVnCT0gQVJNX0NLQ1RMLAorCS5lbmFibGVfYml0CT0gRU5fRFNQQ0ssCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfRFNQRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BtbXVfY2sgPSB7CisJLm5hbWUJCT0gImRzcG1tdV9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMIHwgQUxXQVlTX0VOQUJMRUQsCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfRFNQTU1VRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZja2N0bF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkc3BwZXJfY2sgPSB7CisJLm5hbWUJCT0gImRzcHBlcl9jayIsCisJLnBhcmVudAkJPSAmY2tfZHBsbDEsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCQkJICBSQVRFX0NLQ1RMIHwgRFNQX0RPTUFJTl9DTE9DSyB8IFZJUlRVQUxfSU9fQUREUkVTUywKKwkuZW5hYmxlX3JlZwk9IERTUF9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCisJLnJhdGVfb2Zmc2V0CT0gQ0tDVExfUEVSRElWX09GRlNFVCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS8vLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNweG9yX2NrID0geworCS5uYW1lCQk9ICJkc3B4b3JfY2siLAorCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIERTUF9ET01BSU5fQ0xPQ0sgfCBWSVJUVUFMX0lPX0FERFJFU1MsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX1hPUlBDSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZHNwdGltX2NrID0geworCS5uYW1lCQk9ICJkc3B0aW1fY2siLAorCS5wYXJlbnQJCT0gJmNrX3JlZiwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIERTUF9ET01BSU5fQ0xPQ0sgfCBWSVJUVUFMX0lPX0FERFJFU1MsCisJLmVuYWJsZV9yZWcJPSBEU1BfSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0RTUFRJTUNLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0Y19jayA9IHsKKwkubmFtZQkJPSAidGNfY2siLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgQ0xPQ0tfSU5fT01BUDczMCB8CisJCQkgIFJBVEVfQ0tDVEwgfCBSQVRFX1BST1BBR0FURVMgfCBBTFdBWVNfRU5BQkxFRCwKKwkucmF0ZV9vZmZzZXQJPSBDS0NUTF9UQ0RJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYXJtaW50aF9jazE1MTAgPSB7CisJLm5hbWUJCT0gImFybWludGhfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEFMV0FZU19FTkFCTEVELAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCisJLyogTm90ZTogT24gMTUxMCB0aGUgZnJlcXVlbmN5IGZvbGxvd3MgVENfQ0sKKwkgKgorCSAqIDE2eHggdmVyc2lvbiBpcyBpbiBNUFUgY2xvY2tzLgorCSAqLworfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdGlwYl9jayA9IHsKKwkubmFtZQkJPSAidGlicF9jayIsCisJLnBhcmVudAkJPSAmdGNfY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQUxXQVlTX0VOQUJMRUQsCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGwzX29jcGlfY2sgPSB7CisJLm5hbWUJCT0gImwzX29jcGlfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QzLAorCS5lbmFibGVfYml0CT0gRU5fT0NQSV9DSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdGMxX2NrID0geworCS5uYW1lCQk9ICJ0YzFfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QzLAorCS5lbmFibGVfYml0CT0gRU5fVEMxX0NLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB0YzJfY2sgPSB7CisJLm5hbWUJCT0gInRjMl9jayIsCisJLnBhcmVudAkJPSAmdGNfY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQVJNX0lETEVDVDMsCisJLmVuYWJsZV9iaXQJPSBFTl9UQzJfQ0ssCisJLnJlY2FsYwkJPSAmZm9sbG93cGFyZW50X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRtYV9jayA9IHsKKwkubmFtZQkJPSAiZG1hX2NrIiwKKwkucGFyZW50CQk9ICZ0Y19jaywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIEFMV0FZU19FTkFCTEVELAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkbWFfbGNkZnJlZV9jayA9IHsKKwkubmFtZQkJPSAiZG1hX2xjZGZyZWVfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IEFMV0FZU19FTkFCTEVELAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcGlfY2sgPSB7CisJLm5hbWUJCT0gImFwaV9jayIsCisJLnBhcmVudAkJPSAmdGNfY2ssCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFgsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0FQSUNLLAorCS5yZWNhbGMJCT0gJmZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBsYl9jayA9IHsKKwkubmFtZQkJPSAibGJfY2siLAorCS5wYXJlbnQJCT0gJnRjX2NrLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCwKKwkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAorCS5lbmFibGVfYml0CT0gRU5fTEJDSywKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcmhlYTFfY2sgPSB7CisJLm5hbWUJCT0gInJoZWExX2NrIiwKKwkucGFyZW50CQk9ICZ0Y19jaywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcmhlYTJfY2sgPSB7CisJLm5hbWUJCT0gInJoZWEyX2NrIiwKKwkucGFyZW50CQk9ICZ0Y19jaywKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE2WFggfCBBTFdBWVNfRU5BQkxFRCwKKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbGNkX2NrID0geworCS5uYW1lCQk9ICJsY2RfY2siLAorCS5wYXJlbnQJCT0gJmNrX2RwbGwxLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgQ0xPQ0tfSU5fT01BUDczMCB8CisJCQkgIFJBVEVfQ0tDVEwsCisJLmVuYWJsZV9yZWcJPSBBUk1fSURMRUNUMiwKKwkuZW5hYmxlX2JpdAk9IEVOX0xDRENLLAorCS5yYXRlX29mZnNldAk9IENLQ1RMX0xDRERJVl9PRkZTRVQsCisJLnJlY2FsYwkJPSAmY2tjdGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDFfMTUxMCA9IHsKKwkubmFtZQkJPSAidWFydDFfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDEyMDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IEVOQUJMRV9SRUdfMzJCSVQgfCBBTFdBWVNfRU5BQkxFRCwKKwkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKKwkuZW5hYmxlX2JpdAk9IDI5LAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCisJLnNldF9yYXRlCT0gJnNldF91YXJ0X3JhdGUsCisJLnJlY2FsYwkJPSAmdWFydF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1YXJ0MV8xNnh4ID0geworCS5uYW1lCQk9ICJ1YXJ0MV9jayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gNDgwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAyOSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQyX2NrID0geworCS5uYW1lCQk9ICJ1YXJ0Ml9jayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfCBFTkFCTEVfUkVHXzMyQklULAorCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAorCS5lbmFibGVfYml0CT0gMzAsCS8qIENob29zZXMgYmV0d2VlbiAxMk1IeiBhbmQgNDhNSHogKi8KKwkuc2V0X3JhdGUJPSAmc2V0X3VhcnRfcmF0ZSwKKwkucmVjYWxjCQk9ICZ1YXJ0X3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVhcnQzXzE1MTAgPSB7CisJLm5hbWUJCT0gInVhcnQzX2NrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSAxMjAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBFTkFCTEVfUkVHXzMyQklUIHwgQUxXQVlTX0VOQUJMRUQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAzMSwJLyogQ2hvb3NlcyBiZXR3ZWVuIDEyTUh6IGFuZCA0OE1IeiAqLworCS5zZXRfcmF0ZQk9ICZzZXRfdWFydF9yYXRlLAorCS5yZWNhbGMJCT0gJnVhcnRfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydDNfMTZ4eCA9IHsKKwkubmFtZQkJPSAidWFydDNfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAorCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAorCS5lbmFibGVfYml0CT0gMzEsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JfY2xrbyA9IHsJLyogNiBNSHogb3V0cHV0IG9uIFc0X1VTQl9DTEtPICovCisJLm5hbWUJCT0gInVzYl9jbGtvIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSA2MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBVTFBEX0NMT0NLX0NUUkwsCisJLmVuYWJsZV9iaXQJPSBVU0JfTUNMS19FTl9CSVQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayB1c2JfaGhjX2NrMTUxMCA9IHsKKwkubmFtZQkJPSAidXNiX2hoY19jayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50ICovCisJLnJhdGUJCT0gNDgwMDAwMDAsIC8qIEFjdHVhbGx5IDIgY2xvY2tzLCAxMk1IeiBhbmQgNDhNSHogKi8KKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfAorCQkJICBSQVRFX0ZJWEVEIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKKwkuZW5hYmxlX2JpdAk9IFVTQl9IT1NUX0hIQ19VSE9TVF9FTiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYl9oaGNfY2sxNnh4ID0geworCS5uYW1lCQk9ICJ1c2JfaGhjX2NrIiwKKwkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQgKi8KKwkucmF0ZQkJPSA0ODAwMDAwMCwKKwkvKiBPVEdfU1lTQ09OXzIuT1RHX1BBREVOID09IDAgKG5vdCAxNTEwLWNvbXBhdGlibGUpICovCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBPVEdfQkFTRSArIDB4MDggLyogT1RHX1NZU0NPTl8yICovLAorCS5lbmFibGVfYml0CT0gOCAvKiBVSE9TVF9FTiAqLywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jbGtfMTUxMCA9IHsKKwkubmFtZQkJPSAibWNsayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgUkFURV9GSVhFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1jbGtfMTZ4eCA9IHsKKwkubmFtZQkJPSAibWNsayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gQ09NX0NMS19ESVZfQ1RSTF9TRUwsCisJLmVuYWJsZV9iaXQJPSBDT01fVUxQRF9QTExfQ0xLX1JFUSwKKwkuc2V0X3JhdGUJPSAmc2V0X2V4dF9jbGtfcmF0ZSwKKwkucm91bmRfcmF0ZQk9ICZyb3VuZF9leHRfY2xrX3JhdGUsCisJLmluaXQJCT0gJmluaXRfZXh0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGJjbGtfMTUxMCA9IHsKKwkubmFtZQkJPSAiYmNsayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCisJLnJhdGUJCT0gMTIwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNTEwIHwgUkFURV9GSVhFRCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGJjbGtfMTZ4eCA9IHsKKwkubmFtZQkJPSAiYmNsayIsCisJLyogRGlyZWN0IGZyb20gVUxQRCwgbm8gcGFyZW50LiBNYXkgYmUgZW5hYmxlZCBieSBleHQgaGFyZHdhcmUuICovCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYLAorCS5lbmFibGVfcmVnCT0gU1dEX0NMS19ESVZfQ1RSTF9TRUwsCisJLmVuYWJsZV9iaXQJPSBTV0RfVUxQRF9QTExfQ0xLX1JFUSwKKwkuc2V0X3JhdGUJPSAmc2V0X2V4dF9jbGtfcmF0ZSwKKwkucm91bmRfcmF0ZQk9ICZyb3VuZF9leHRfY2xrX3JhdGUsCisJLmluaXQJCT0gJmluaXRfZXh0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1tYzFfY2sgPSB7CisJLm5hbWUJCT0gIm1tYzFfY2siLAorCS8qIEZ1bmN0aW9uYWwgY2xvY2sgaXMgZGlyZWN0IGZyb20gVUxQRCwgaW50ZXJmYWNlIGNsb2NrIGlzIEFSTVBFUiAqLworCS5wYXJlbnQJCT0gJmFybXBlcl9jaywKKwkucmF0ZQkJPSA0ODAwMDAwMCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8CisJCQkgIFJBVEVfRklYRUQgfCBFTkFCTEVfUkVHXzMyQklULAorCS5lbmFibGVfcmVnCT0gTU9EX0NPTkZfQ1RSTF8wLAorCS5lbmFibGVfYml0CT0gMjMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBtbWMyX2NrID0geworCS5uYW1lCQk9ICJtbWMyX2NrIiwKKwkvKiBGdW5jdGlvbmFsIGNsb2NrIGlzIGRpcmVjdCBmcm9tIFVMUEQsIGludGVyZmFjZSBjbG9jayBpcyBBUk1QRVIgKi8KKwkucGFyZW50CQk9ICZhcm1wZXJfY2ssCisJLnJhdGUJCT0gNDgwMDAwMDAsCisJLmZsYWdzCQk9IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgUkFURV9GSVhFRCB8IEVOQUJMRV9SRUdfMzJCSVQsCisJLmVuYWJsZV9yZWcJPSBNT0RfQ09ORl9DVFJMXzAsCisJLmVuYWJsZV9iaXQJPSAyMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHZpcnR1YWxfY2tfbXB1ID0geworCS5uYW1lCQk9ICJtcHUiLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKKwkJCSAgVklSVFVBTF9DTE9DSyB8IEFMV0FZU19FTkFCTEVELAorCS5wYXJlbnQJCT0gJmFybV9jaywgLyogSXMgc21hcnRlciBhbGlhcyBmb3IgKi8KKwkucmVjYWxjCQk9ICZmb2xsb3dwYXJlbnRfcmVjYWxjLAorCS5zZXRfcmF0ZQk9ICZzZWxlY3RfdGFibGVfcmF0ZSwKKwkucm91bmRfcmF0ZQk9ICZyb3VuZF90b190YWJsZV9yYXRlLAorfTsKKworCitzdGF0aWMgc3RydWN0IGNsayAqICBvbmNoaXBfY2xrc1tdID0geworCS8qIG5vbi1VTFBEIGNsb2NrcyAqLworCSZja19yZWYsCisJJmNrX2RwbGwxLAorCS8qIENLX0dFTjEgY2xvY2tzICovCisJJmNrX2RwbGwxb3V0LAorCSZhcm1fY2ssCisJJmFybXBlcl9jaywKKwkmYXJtX2dwaW9fY2ssCisJJmFybXhvcl9jaywKKwkmYXJtdGltX2NrLAorCSZhcm13ZHRfY2ssCisJJmFybWludGhfY2sxNTEwLCAgJmFybWludGhfY2sxNnh4LAorCS8qIENLX0dFTjIgY2xvY2tzICovCisJJmRzcF9jaywKKwkmZHNwbW11X2NrLAorCSZkc3BwZXJfY2ssCisJJmRzcHhvcl9jaywKKwkmZHNwdGltX2NrLAorCS8qIENLX0dFTjMgY2xvY2tzICovCisJJnRjX2NrLAorCSZ0aXBiX2NrLAorCSZsM19vY3BpX2NrLAorCSZ0YzFfY2ssCisJJnRjMl9jaywKKwkmZG1hX2NrLAorCSZkbWFfbGNkZnJlZV9jaywKKwkmYXBpX2NrLAorCSZsYl9jaywKKwkmcmhlYTFfY2ssCisJJnJoZWEyX2NrLAorCSZsY2RfY2ssCisJLyogVUxQRCBjbG9ja3MgKi8KKwkmdWFydDFfMTUxMCwKKwkmdWFydDFfMTZ4eCwKKwkmdWFydDJfY2ssCisJJnVhcnQzXzE1MTAsCisJJnVhcnQzXzE2eHgsCisJJnVzYl9jbGtvLAorCSZ1c2JfaGhjX2NrMTUxMCwgJnVzYl9oaGNfY2sxNnh4LAorCSZtY2xrXzE1MTAsICAmbWNsa18xNnh4LAorCSZiY2xrXzE1MTAsICAmYmNsa18xNnh4LAorCSZtbWMxX2NrLAorCSZtbWMyX2NrLAorCS8qIFZpcnR1YWwgY2xvY2tzICovCisJJnZpcnR1YWxfY2tfbXB1LAorfTsKKworc3RydWN0IGNsayAqY2xrX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmlkKQoreworCXN0cnVjdCBjbGsgKnAsICpjbGsgPSBFUlJfUFRSKC1FTk9FTlQpOworCisJZG93bigmY2xvY2tzX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CisJCWlmIChzdHJjbXAoaWQsIHAtPm5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQocC0+b3duZXIpKSB7CisJCQljbGsgPSBwOworCQkJYnJlYWs7CisJCX0KKwl9CisJdXAoJmNsb2Nrc19zZW0pOworCisJcmV0dXJuIGNsazsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldCk7CisKKwordm9pZCBjbGtfcHV0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoY2xrICYmICFJU19FUlIoY2xrKSkKKwkJbW9kdWxlX3B1dChjbGstPm93bmVyKTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3B1dCk7CisKKworaW50IF9fY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJX191MTYgcmVndmFsMTY7CisJX191MzIgcmVndmFsMzI7CisKKwlpZiAoY2xrLT5mbGFncyAmIEFMV0FZU19FTkFCTEVEKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShjbGstPmVuYWJsZV9yZWcgPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjbG9jay5jOiBFbmFibGUgZm9yICVzIHdpdGhvdXQgZW5hYmxlIGNvZGVcbiIsCisJCSAgICAgICBjbGstPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2xrLT5mbGFncyAmIERTUF9ET01BSU5fQ0xPQ0spIHsKKwkJX19jbGtfdXNlKCZhcGlfY2spOworCX0KKworCWlmIChjbGstPmZsYWdzICYgRU5BQkxFX1JFR18zMkJJVCkgeworCQlpZiAoY2xrLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykgeworCQkJcmVndmFsMzIgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMzIgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCV9fcmF3X3dyaXRlbChyZWd2YWwzMiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMzIgfD0gKDEgPDwgY2xrLT5lbmFibGVfYml0KTsKKwkJCW9tYXBfd3JpdGVsKHJlZ3ZhbDMyLCBjbGstPmVuYWJsZV9yZWcpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNsay0+ZmxhZ3MgJiBWSVJUVUFMX0lPX0FERFJFU1MpIHsKKwkJCXJlZ3ZhbDE2ID0gX19yYXdfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJlZ3ZhbDE2IHw9ICgxIDw8IGNsay0+ZW5hYmxlX2JpdCk7CisJCQlfX3Jhd193cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0gZWxzZSB7CisJCQlyZWd2YWwxNiA9IG9tYXBfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJlZ3ZhbDE2IHw9ICgxIDw8IGNsay0+ZW5hYmxlX2JpdCk7CisJCQlvbWFwX3dyaXRldyhyZWd2YWwxNiwgY2xrLT5lbmFibGVfcmVnKTsKKwkJfQorCX0KKworCWlmIChjbGstPmZsYWdzICYgRFNQX0RPTUFJTl9DTE9DSykgeworCQlfX2Nsa191bnVzZSgmYXBpX2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIF9fY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCV9fdTE2IHJlZ3ZhbDE2OworCV9fdTMyIHJlZ3ZhbDMyOworCisJaWYgKGNsay0+ZW5hYmxlX3JlZyA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoY2xrLT5mbGFncyAmIERTUF9ET01BSU5fQ0xPQ0spIHsKKwkJX19jbGtfdXNlKCZhcGlfY2spOworCX0KKworCWlmIChjbGstPmZsYWdzICYgRU5BQkxFX1JFR18zMkJJVCkgeworCQlpZiAoY2xrLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykgeworCQkJcmVndmFsMzIgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMzIgJj0gfigxIDw8IGNsay0+ZW5hYmxlX2JpdCk7CisJCQlfX3Jhd193cml0ZWwocmVndmFsMzIsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0gZWxzZSB7CisJCQlyZWd2YWwzMiA9IG9tYXBfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJlZ3ZhbDMyICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJb21hcF93cml0ZWwocmVndmFsMzIsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY2xrLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykgeworCQkJcmVndmFsMTYgPSBfX3Jhd19yZWFkdyhjbGstPmVuYWJsZV9yZWcpOworCQkJcmVndmFsMTYgJj0gfigxIDw8IGNsay0+ZW5hYmxlX2JpdCk7CisJCQlfX3Jhd193cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0gZWxzZSB7CisJCQlyZWd2YWwxNiA9IG9tYXBfcmVhZHcoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJlZ3ZhbDE2ICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCQkJb21hcF93cml0ZXcocmVndmFsMTYsIGNsay0+ZW5hYmxlX3JlZyk7CisJCX0KKwl9CisKKwlpZiAoY2xrLT5mbGFncyAmIERTUF9ET01BSU5fQ0xPQ0spIHsKKwkJX19jbGtfdW51c2UoJmFwaV9jayk7CisJfQorfQorCisKK3ZvaWQgX19jbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQoreworCWlmIChjbGstPnVzZWNvdW50ID4gMCAmJiAhKC0tY2xrLT51c2Vjb3VudCkpIHsKKwkJX19jbGtfZGlzYWJsZShjbGspOworCQlpZiAobGlrZWx5KGNsay0+cGFyZW50KSkKKwkJCV9fY2xrX3VudXNlKGNsay0+cGFyZW50KTsKKwl9Cit9CisKKworaW50IF9fY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHJldCA9IDA7CisJaWYgKGNsay0+dXNlY291bnQrKyA9PSAwKSB7CisJCWlmIChsaWtlbHkoY2xrLT5wYXJlbnQpKQorCQkJcmV0ID0gX19jbGtfdXNlKGNsay0+cGFyZW50KTsKKworCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7CisJCQljbGstPnVzZWNvdW50LS07CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gX19jbGtfZW5hYmxlKGNsayk7CisKKwkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSAmJiBjbGstPnBhcmVudCkgeworCQkJX19jbGtfdW51c2UoY2xrLT5wYXJlbnQpOworCQkJY2xrLT51c2Vjb3VudC0tOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitpbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCXJldCA9IF9fY2xrX2VuYWJsZShjbGspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19lbmFibGUpOworCisKK3ZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJX19jbGtfZGlzYWJsZShjbGspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CisKKworaW50IGNsa191c2Uoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJcmV0ID0gX19jbGtfdXNlKGNsayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3VzZSk7CisKKwordm9pZCBjbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJX19jbGtfdW51c2UoY2xrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja2Z3X2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3VudXNlKTsKKworCitpbnQgY2xrX2dldF91c2Vjb3VudChzdHJ1Y3QgY2xrICpjbGspCit7CisgICAgICAgIHJldHVybiBjbGstPnVzZWNvdW50OworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3VzZWNvdW50KTsKKworCit1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cmF0ZTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX2dldF9yYXRlKTsKKworCitzdGF0aWMgX191MTYgdmVyaWZ5X2NrY3RsX3ZhbHVlKF9fdTE2IG5ld3ZhbCkKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgZm9sbG93aW5nIGxpbWl0YXRpb25zIHNldAorCSAqIGJ5IHRoZSBoYXJkd2FyZSAoYWxsIGNvbmRpdGlvbnMgbXVzdCBiZSB0cnVlKToKKwkgKiBEU1BNTVVfQ0sgPT0gRFNQX0NLICBvciAgRFNQTU1VX0NLID09IERTUF9DSy8yCisJICogQVJNX0NLID49IFRDX0NLCisJICogRFNQX0NLID49IFRDX0NLCisJICogRFNQTU1VX0NLID49IFRDX0NLCisJICoKKwkgKiBJbiBhZGRpdGlvbiBmb2xsb3dpbmcgcnVsZXMgYXJlIGVuZm9yY2VkOgorCSAqIExDRF9DSyA8PSBUQ19DSworCSAqIEFSTVBFUl9DSyA8PSBUQ19DSworCSAqCisJICogSG93ZXZlciwgbWF4aW11bSBmcmVxdWVuY2llcyBhcmUgbm90IGNoZWNrZWQgZm9yIQorCSAqLworCV9fdTggcGVyX2V4cDsKKwlfX3U4IGxjZF9leHA7CisJX191OCBhcm1fZXhwOworCV9fdTggZHNwX2V4cDsKKwlfX3U4IHRjX2V4cDsKKwlfX3U4IGRzcG1tdV9leHA7CisKKwlwZXJfZXhwID0gKG5ld3ZhbCA+PiBDS0NUTF9QRVJESVZfT0ZGU0VUKSAmIDM7CisJbGNkX2V4cCA9IChuZXd2YWwgPj4gQ0tDVExfTENERElWX09GRlNFVCkgJiAzOworCWFybV9leHAgPSAobmV3dmFsID4+IENLQ1RMX0FSTURJVl9PRkZTRVQpICYgMzsKKwlkc3BfZXhwID0gKG5ld3ZhbCA+PiBDS0NUTF9EU1BESVZfT0ZGU0VUKSAmIDM7CisJdGNfZXhwID0gKG5ld3ZhbCA+PiBDS0NUTF9UQ0RJVl9PRkZTRVQpICYgMzsKKwlkc3BtbXVfZXhwID0gKG5ld3ZhbCA+PiBDS0NUTF9EU1BNTVVESVZfT0ZGU0VUKSAmIDM7CisKKwlpZiAoZHNwbW11X2V4cCA8IGRzcF9leHApCisJCWRzcG1tdV9leHAgPSBkc3BfZXhwOworCWlmIChkc3BtbXVfZXhwID4gZHNwX2V4cCsxKQorCQlkc3BtbXVfZXhwID0gZHNwX2V4cCsxOworCWlmICh0Y19leHAgPCBhcm1fZXhwKQorCQl0Y19leHAgPSBhcm1fZXhwOworCWlmICh0Y19leHAgPCBkc3BtbXVfZXhwKQorCQl0Y19leHAgPSBkc3BtbXVfZXhwOworCWlmICh0Y19leHAgPiBsY2RfZXhwKQorCQlsY2RfZXhwID0gdGNfZXhwOworCWlmICh0Y19leHAgPiBwZXJfZXhwKQorCQlwZXJfZXhwID0gdGNfZXhwOworCisJbmV3dmFsICY9IDB4ZjAwMDsKKwluZXd2YWwgfD0gcGVyX2V4cCA8PCBDS0NUTF9QRVJESVZfT0ZGU0VUOworCW5ld3ZhbCB8PSBsY2RfZXhwIDw8IENLQ1RMX0xDRERJVl9PRkZTRVQ7CisJbmV3dmFsIHw9IGFybV9leHAgPDwgQ0tDVExfQVJNRElWX09GRlNFVDsKKwluZXd2YWwgfD0gZHNwX2V4cCA8PCBDS0NUTF9EU1BESVZfT0ZGU0VUOworCW5ld3ZhbCB8PSB0Y19leHAgPDwgQ0tDVExfVENESVZfT0ZGU0VUOworCW5ld3ZhbCB8PSBkc3BtbXVfZXhwIDw8IENLQ1RMX0RTUE1NVURJVl9PRkZTRVQ7CisKKwlyZXR1cm4gbmV3dmFsOworfQorCisKK3N0YXRpYyBpbnQgY2FsY19kc29yX2V4cChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwkvKiBOb3RlOiBJZiB0YXJnZXQgZnJlcXVlbmN5IGlzIHRvbyBsb3csIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gNCwKKwkgKiB3aGljaCBpcyBpbnZhbGlkIHZhbHVlLiBDYWxsZXIgbXVzdCBjaGVjayBmb3IgdGhpcyB2YWx1ZSBhbmQgYWN0CisJICogYWNjb3JkaW5nbHkuCisJICoKKwkgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIGZvciBmb2xsb3dpbmcgbGltaXRhdGlvbnMgc2V0CisJICogYnkgdGhlIGhhcmR3YXJlIChhbGwgY29uZGl0aW9ucyBtdXN0IGJlIHRydWUpOgorCSAqIERTUE1NVV9DSyA9PSBEU1BfQ0sgIG9yICBEU1BNTVVfQ0sgPT0gRFNQX0NLLzIKKwkgKiBBUk1fQ0sgPj0gVENfQ0sKKwkgKiBEU1BfQ0sgPj0gVENfQ0sKKwkgKiBEU1BNTVVfQ0sgPj0gVENfQ0sKKwkgKi8KKwl1bnNpZ25lZCBsb25nIHJlYWxyYXRlOworCXN0cnVjdCBjbGsgKiAgcGFyZW50OworCXVuc2lnbmVkICBkc29yX2V4cDsKKworCWlmICh1bmxpa2VseSghKGNsay0+ZmxhZ3MgJiBSQVRFX0NLQ1RMKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGFyZW50ID0gY2xrLT5wYXJlbnQ7CisJaWYgKHVubGlrZWx5KHBhcmVudCA9PSAwKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZWFscmF0ZSA9IHBhcmVudC0+cmF0ZTsKKwlmb3IgKGRzb3JfZXhwPTA7IGRzb3JfZXhwPDQ7IGRzb3JfZXhwKyspIHsKKwkJaWYgKHJlYWxyYXRlIDw9IHJhdGUpCisJCQlicmVhazsKKworCQlyZWFscmF0ZSAvPSAyOworCX0KKworCXJldHVybiBkc29yX2V4cDsKK30KKworCitzdGF0aWMgdm9pZCBja2N0bF9yZWNhbGMoc3RydWN0IGNsayAqICBjbGspCit7CisJaW50IGRzb3I7CisKKwkvKiBDYWxjdWxhdGUgZGl2aXNvciBlbmNvZGVkIGFzIDItYml0IGV4cG9uZW50ICovCisJaWYgKGNsay0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKSB7CisJCS8qIFRoZSBjbG9jayBjb250cm9sIGJpdHMgYXJlIGluIERTUCBkb21haW4sCisJCSAqIHNvIGFwaV9jayBpcyBuZWVkZWQgZm9yIGFjY2Vzcy4KKwkJICogTm90ZSB0aGF0IERTUF9DS0NUTCB2aXJ0IGFkZHIgPSBwaHlzIGFkZHIsIHNvCisJCSAqIHdlIG11c3QgdXNlIF9fcmF3X3JlYWR3KCkgaW5zdGVhZCBvZiBvbWFwX3JlYWR3KCkuCisJCSAqLworCQlfX2Nsa191c2UoJmFwaV9jayk7CisJCWRzb3IgPSAxIDw8ICgzICYgKF9fcmF3X3JlYWR3KERTUF9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOworCQlfX2Nsa191bnVzZSgmYXBpX2NrKTsKKwl9IGVsc2UgeworCQlkc29yID0gMSA8PCAoMyAmIChvbWFwX3JlYWR3KEFSTV9DS0NUTCkgPj4gY2xrLT5yYXRlX29mZnNldCkpOworCX0KKwlpZiAodW5saWtlbHkoY2xrLT5yYXRlID09IGNsay0+cGFyZW50LT5yYXRlIC8gZHNvcikpCisJCXJldHVybjsgLyogTm8gY2hhbmdlLCBxdWljayBleGl0ICovCisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkc29yOworCisJaWYgKHVubGlrZWx5KGNsay0+ZmxhZ3MgJiBSQVRFX1BST1BBR0FURVMpKQorCQlwcm9wYWdhdGVfcmF0ZShjbGspOworfQorCisKK2xvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJaW50IGRzb3JfZXhwOworCisJaWYgKGNsay0+ZmxhZ3MgJiBSQVRFX0ZJWEVEKQorCQlyZXR1cm4gY2xrLT5yYXRlOworCisJaWYgKGNsay0+ZmxhZ3MgJiBSQVRFX0NLQ1RMKSB7CisJCWRzb3JfZXhwID0gY2FsY19kc29yX2V4cChjbGssIHJhdGUpOworCQlpZiAoZHNvcl9leHAgPCAwKQorCQkJcmV0dXJuIGRzb3JfZXhwOworCQlpZiAoZHNvcl9leHAgPiAzKQorCQkJZHNvcl9leHAgPSAzOworCQlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyAoMSA8PCBkc29yX2V4cCk7CisJfQorCisJaWYoY2xrLT5yb3VuZF9yYXRlICE9IDApCisJCXJldHVybiBjbGstPnJvdW5kX3JhdGUoY2xrLCByYXRlKTsKKworCXJldHVybiBjbGstPnJhdGU7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19yb3VuZF9yYXRlKTsKKworCitzdGF0aWMgdm9pZCBwcm9wYWdhdGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaykKK3sKKwlzdHJ1Y3QgY2xrICoqICBjbGtwOworCisJZm9yIChjbGtwID0gb25jaGlwX2Nsa3M7IGNsa3AgPCBvbmNoaXBfY2xrcytBUlJBWV9TSVpFKG9uY2hpcF9jbGtzKTsgY2xrcCsrKSB7CisJCWlmIChsaWtlbHkoKCpjbGtwKS0+cGFyZW50ICE9IGNsaykpIGNvbnRpbnVlOworCQlpZiAobGlrZWx5KCgqY2xrcCktPnJlY2FsYykpCisJCQkoKmNsa3ApLT5yZWNhbGMoKmNsa3ApOworCX0KK30KKworCitzdGF0aWMgaW50IHNlbGVjdF90YWJsZV9yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJLyogRmluZCB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZnJlcXVlbmN5IDw9IHJhdGUgYW5kIHN3aXRjaCB0byBpdCAqLworCXN0cnVjdCBtcHVfcmF0ZSAqICBwdHI7CisKKwlpZiAoY2xrICE9ICZ2aXJ0dWFsX2NrX21wdSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKHB0ciA9IHJhdGVfdGFibGU7IHB0ci0+cmF0ZTsgcHRyKyspIHsKKwkJaWYgKHB0ci0+eHRhbCAhPSBja19yZWYucmF0ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIERQTEwxIGNhbm5vdCBiZSByZXByb2dyYW1tZWQgd2l0aG91dCByaXNraW5nIHN5c3RlbSBjcmFzaCAqLworCQlpZiAobGlrZWx5KGNrX2RwbGwxLnJhdGUhPTApICYmIHB0ci0+cGxsX3JhdGUgIT0gY2tfZHBsbDEucmF0ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENhbiBjaGVjayBvbmx5IGFmdGVyIHh0YWwgZnJlcXVlbmN5IGNoZWNrICovCisJCWlmIChwdHItPnJhdGUgPD0gcmF0ZSkKKwkJCWJyZWFrOworCX0KKworCWlmICghcHRyLT5yYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcHRyLT5yYXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseShja19kcGxsMS5yYXRlID09IDApKSB7CisJCW9tYXBfd3JpdGV3KHB0ci0+ZHBsbGN0bF92YWwsIERQTExfQ1RMKTsKKwkJY2tfZHBsbDEucmF0ZSA9IHB0ci0+cGxsX3JhdGU7CisJfQorCW9tYXBfd3JpdGV3KHB0ci0+Y2tjdGxfdmFsLCBBUk1fQ0tDVEwpOworCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGxvbmcgcm91bmRfdG9fdGFibGVfcmF0ZShzdHJ1Y3QgY2xrICogIGNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCS8qIEZpbmQgdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGZyZXF1ZW5jeSA8PSByYXRlICovCisJc3RydWN0IG1wdV9yYXRlICogIHB0cjsKKwlsb25nICBoaWdoZXN0X3JhdGU7CisKKwlpZiAoY2xrICE9ICZ2aXJ0dWFsX2NrX21wdSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloaWdoZXN0X3JhdGUgPSAtRUlOVkFMOworCisJZm9yIChwdHIgPSByYXRlX3RhYmxlOyBwdHItPnJhdGU7IHB0cisrKSB7CisJCWlmIChwdHItPnh0YWwgIT0gY2tfcmVmLnJhdGUpCisJCQljb250aW51ZTsKKworCQloaWdoZXN0X3JhdGUgPSBwdHItPnJhdGU7CisKKwkJLyogQ2FuIGNoZWNrIG9ubHkgYWZ0ZXIgeHRhbCBmcmVxdWVuY3kgY2hlY2sgKi8KKwkJaWYgKHB0ci0+cmF0ZSA8PSByYXRlKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhpZ2hlc3RfcmF0ZTsKK30KKworCitpbnQgY2xrX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCAgcmV0ID0gLUVJTlZBTDsKKwlpbnQgIGRzb3JfZXhwOworCV9fdTE2ICByZWd2YWw7CisJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CisKKwlpZiAoY2xrLT5mbGFncyAmIFJBVEVfQ0tDVEwpIHsKKwkJZHNvcl9leHAgPSBjYWxjX2Rzb3JfZXhwKGNsaywgcmF0ZSk7CisJCWlmIChkc29yX2V4cCA+IDMpCisJCQlkc29yX2V4cCA9IC1FSU5WQUw7CisJCWlmIChkc29yX2V4cCA8IDApCisJCQlyZXR1cm4gZHNvcl9leHA7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrZndfbG9jaywgZmxhZ3MpOworCQlyZWd2YWwgPSBvbWFwX3JlYWR3KEFSTV9DS0NUTCk7CisJCXJlZ3ZhbCAmPSB+KDMgPDwgY2xrLT5yYXRlX29mZnNldCk7CisJCXJlZ3ZhbCB8PSBkc29yX2V4cCA8PCBjbGstPnJhdGVfb2Zmc2V0OworCQlyZWd2YWwgPSB2ZXJpZnlfY2tjdGxfdmFsdWUocmVndmFsKTsKKwkJb21hcF93cml0ZXcocmVndmFsLCBBUk1fQ0tDVEwpOworCQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvICgxIDw8IGRzb3JfZXhwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJCXJldCA9IDA7CisJfSBlbHNlIGlmKGNsay0+c2V0X3JhdGUgIT0gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJCXJldCA9IGNsay0+c2V0X3JhdGUoY2xrLCByYXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tmd19sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKHVubGlrZWx5KHJldCA9PSAwICYmIChjbGstPmZsYWdzICYgUkFURV9QUk9QQUdBVEVTKSkpCisJCXByb3BhZ2F0ZV9yYXRlKGNsayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjbGtfc2V0X3JhdGUpOworCisKK3N0YXRpYyB1bnNpZ25lZCBjYWxjX2V4dF9kc29yKHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBkc29yOworCisJLyogTUNMSyBhbmQgQkNMSyBkaXZpc29yIHNlbGVjdGlvbiBpcyBub3QgbGluZWFyOgorCSAqIGZyZXEgPSA5Nk1IeiAvIGRzb3IKKwkgKgorCSAqIFJBVElPX1NFTCByYW5nZTogZHNvciA8LT4gUkFUSU9fU0VMCisJICogMC4uNjogKFJBVElPX1NFTCsyKSA8LT4gKGRzb3ItMikKKwkgKiA2Li40ODogICg4KyhSQVRJT19TRUwtNikqMikgPC0+ICgoZHNvci04KS8yKzYpCisJICogTWluaW11bSBkc29yIGlzIDIgYW5kIG1heGltdW0gaXMgOTYuIE9kZCBkaXZpc29ycyBzdGFydGluZyBmcm9tIDkKKwkgKiBjYW4gbm90IGJlIHVzZWQuCisJICovCisJZm9yIChkc29yID0gMjsgZHNvciA8IDk2OyArK2Rzb3IpIHsKKwkJaWYgKChkc29yICYgMSkgJiYgZHNvciA+IDgpCisJCSAgCWNvbnRpbnVlOworCQlpZiAocmF0ZSA+PSA5NjAwMDAwMCAvIGRzb3IpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGRzb3I7Cit9CisKKy8qIE9ubHkgbmVlZGVkIG9uIDE1MTAgKi8KK3N0YXRpYyBpbnQgc2V0X3VhcnRfcmF0ZShzdHJ1Y3QgY2xrICogY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IG9tYXBfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwlpZiAocmF0ZSA9PSAxMjAwMDAwMCkKKwkJdmFsICY9IH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDAwMDApCisJCXZhbCB8PSAoMSA8PCBjbGstPmVuYWJsZV9iaXQpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJb21hcF93cml0ZWwodmFsLCBjbGstPmVuYWJsZV9yZWcpOworCWNsay0+cmF0ZSA9IHJhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgZHNvcjsKKwlfX3UxNiByYXRpb19iaXRzOworCisJZHNvciA9IGNhbGNfZXh0X2Rzb3IocmF0ZSk7CisJY2xrLT5yYXRlID0gOTYwMDAwMDAgLyBkc29yOworCWlmIChkc29yID4gOCkKKwkJcmF0aW9fYml0cyA9ICgoZHNvciAtIDgpIC8gMiArIDYpIDw8IDI7CisJZWxzZQorCQlyYXRpb19iaXRzID0gKGRzb3IgLSAyKSA8PCAyOworCisJcmF0aW9fYml0cyB8PSBvbWFwX3JlYWR3KGNsay0+ZW5hYmxlX3JlZykgJiB+MHhmZDsKKwlvbWFwX3dyaXRldyhyYXRpb19iaXRzLCBjbGstPmVuYWJsZV9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGxvbmcgcm91bmRfZXh0X2Nsa19yYXRlKHN0cnVjdCBjbGsgKiAgY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJcmV0dXJuIDk2MDAwMDAwIC8gY2FsY19leHRfZHNvcihyYXRlKTsKK30KKworCitzdGF0aWMgdm9pZCBpbml0X2V4dF9jbGsoc3RydWN0IGNsayAqICBjbGspCit7CisJdW5zaWduZWQgZHNvcjsKKwlfX3UxNiByYXRpb19iaXRzOworCisJLyogRGV0ZXJtaW5lIGN1cnJlbnQgcmF0ZSBhbmQgZW5zdXJlIGNsb2NrIGlzIGJhc2VkIG9uIDk2TUh6IEFQTEwgKi8KKwlyYXRpb19iaXRzID0gb21hcF9yZWFkdyhjbGstPmVuYWJsZV9yZWcpICYgfjE7CisJb21hcF93cml0ZXcocmF0aW9fYml0cywgY2xrLT5lbmFibGVfcmVnKTsKKworCXJhdGlvX2JpdHMgPSAocmF0aW9fYml0cyAmIDB4ZmMpID4+IDI7CisJaWYgKHJhdGlvX2JpdHMgPiA2KQorCQlkc29yID0gKHJhdGlvX2JpdHMgLSA2KSAqIDIgKyA4OworCWVsc2UKKwkJZHNvciA9IHJhdGlvX2JpdHMgKyAyOworCisJY2xrLT4gcmF0ZSA9IDk2MDAwMDAwIC8gZHNvcjsKK30KKworCitpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlkb3duKCZjbG9ja3Nfc2VtKTsKKwlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tzKTsKKwlpZiAoY2xrLT5pbml0KQorCQljbGstPmluaXQoY2xrKTsKKwl1cCgmY2xvY2tzX3NlbSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19yZWdpc3Rlcik7CisKK3ZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQoreworCWRvd24oJmNsb2Nrc19zZW0pOworCWxpc3RfZGVsKCZjbGstPm5vZGUpOworCXVwKCZjbG9ja3Nfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3VucmVnaXN0ZXIpOworCisjaWZkZWYgQ09ORklHX09NQVBfUkVTRVRfQ0xPQ0tTCisvKgorICogUmVzZXRzIHNvbWUgY2xvY2tzIHRoYXQgbWF5IGJlIGxlZnQgb24gZnJvbSBib290bG9hZGVyLAorICogYnV0IGxlYXZlcyBzZXJpYWwgY2xvY2tzIG9uLiBTZWUgYWxzbyBvbWFwX2xhdGVfY2xrX3Jlc2V0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2Vhcmx5X2Nsa19yZXNldCh2b2lkKQoreworCS8vb21hcF93cml0ZWwoMHgzIDw8IDI5LCBNT0RfQ09ORl9DVFJMXzApOworfQorI2Vsc2UKKyNkZWZpbmUgb21hcF9lYXJseV9jbGtfcmVzZXQoKQl7fQorI2VuZGlmCisKK2ludCBfX2luaXQgY2xrX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICoqICBjbGtwOworCWNvbnN0IHN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyAqaW5mbzsKKwlpbnQgY3J5c3RhbF90eXBlID0gMDsgLyogRGVmYXVsdCAxMiBNSHogKi8KKworCW9tYXBfZWFybHlfY2xrX3Jlc2V0KCk7CisKKwlmb3IgKGNsa3AgPSBvbmNoaXBfY2xrczsgY2xrcCA8IG9uY2hpcF9jbGtzK0FSUkFZX1NJWkUob25jaGlwX2Nsa3MpOyBjbGtwKyspIHsKKwkJaWYgKCgoKmNsa3ApLT5mbGFncyAmQ0xPQ0tfSU5fT01BUDE1MTApICYmIGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQljbGtfcmVnaXN0ZXIoKmNsa3ApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKCgqY2xrcCktPmZsYWdzICZDTE9DS19JTl9PTUFQMTZYWCkgJiYgY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJCWNsa19yZWdpc3RlcigqY2xrcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoKCpjbGtwKS0+ZmxhZ3MgJkNMT0NLX0lOX09NQVA3MzApICYmIGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJCWNsa19yZWdpc3RlcigqY2xrcCk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCWluZm8gPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfQ0xPQ0ssIHN0cnVjdCBvbWFwX2Nsb2NrX2NvbmZpZyk7CisJaWYgKGluZm8gIT0gTlVMTCkgeworCQlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKQorCQkJY3J5c3RhbF90eXBlID0gaW5mby0+c3lzdGVtX2Nsb2NrX3R5cGU7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQNzMwKQorCWNrX3JlZi5yYXRlID0gMTMwMDAwMDA7CisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmIChjcnlzdGFsX3R5cGUgPT0gMikKKwkJY2tfcmVmLnJhdGUgPSAxOTIwMDAwMDsKKyNlbmRpZgorCisJcHJpbnRrKCJDbG9ja3M6IEFSTV9TWVNTVDogMHglMDR4IERQTExfQ1RMOiAweCUwNHggQVJNX0NLQ1RMOiAweCUwNHhcbiIsCisJICAgICAgIG9tYXBfcmVhZHcoQVJNX1NZU1NUKSwgb21hcF9yZWFkdyhEUExMX0NUTCksCisJICAgICAgIG9tYXBfcmVhZHcoQVJNX0NLQ1RMKSk7CisKKwkvKiBXZSB3YW50IHRvIGJlIGluIHN5bmNyb25vdXMgc2NhbGFibGUgbW9kZSAqLworCW9tYXBfd3JpdGV3KDB4MTAwMCwgQVJNX1NZU1NUKTsKKworI2lmZGVmIENPTkZJR19PTUFQX0NMT0NLU19TRVRfQllfQk9PVExPQURFUgorCS8qIFVzZSB2YWx1ZXMgc2V0IGJ5IGJvb3Rsb2FkZXIuIERldGVybWluZSBQTEwgcmF0ZSBhbmQgcmVjYWxjdWxhdGUKKwkgKiBkZXBlbmRlbnQgY2xvY2tzIGFzIGlmIGtlcm5lbCBoYWQgY2hhbmdlZCBQTEwgb3IgZGl2aXNvcnMuCisJICovCisJeworCQl1bnNpZ25lZCBwbGxfY3RsX3ZhbCA9IG9tYXBfcmVhZHcoRFBMTF9DVEwpOworCisJCWNrX2RwbGwxLnJhdGUgPSBja19yZWYucmF0ZTsgLyogQmFzZSB4dGFsIHJhdGUgKi8KKwkJaWYgKHBsbF9jdGxfdmFsICYgMHgxMCkgeworCQkJLyogUExMIGVuYWJsZWQsIGFwcGx5IG11bHRpcGxpZXIgYW5kIGRpdmlzb3IgKi8KKwkJCWlmIChwbGxfY3RsX3ZhbCAmIDB4ZjgwKQorCQkJCWNrX2RwbGwxLnJhdGUgKj0gKHBsbF9jdGxfdmFsICYgMHhmODApID4+IDc7CisJCQlja19kcGxsMS5yYXRlIC89ICgocGxsX2N0bF92YWwgJiAweDYwKSA+PiA1KSArIDE7CisJCX0gZWxzZSB7CisJCQkvKiBQTEwgZGlzYWJsZWQsIGFwcGx5IGJ5cGFzcyBkaXZpc29yICovCisJCQlzd2l0Y2ggKHBsbF9jdGxfdmFsICYgMHhjKSB7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDoKKwkJCQlja19kcGxsMS5yYXRlIC89IDI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNrX2RwbGwxLnJhdGUgLz0gNDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlwcm9wYWdhdGVfcmF0ZSgmY2tfZHBsbDEpOworI2Vsc2UKKwkvKiBGaW5kIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBmcmVxdWVuY3kgYW5kIGVuYWJsZSBpdCAqLworCWlmIChzZWxlY3RfdGFibGVfcmF0ZSgmdmlydHVhbF9ja19tcHUsIH4wKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlN5c3RlbSBmcmVxdWVuY2llcyBub3Qgc2V0LiBDaGVjayB5b3VyIGNvbmZpZy5cbiIpOworCQkvKiBHdWVzcyBzYW5lIHZhbHVlcyAoNjBNSHopICovCisJCW9tYXBfd3JpdGV3KDB4MjI5MCwgRFBMTF9DVEwpOworCQlvbWFwX3dyaXRldygweDEwMDUsIEFSTV9DS0NUTCk7CisJCWNrX2RwbGwxLnJhdGUgPSA2MDAwMDAwMDsKKwkJcHJvcGFnYXRlX3JhdGUoJmNrX2RwbGwxKTsKKwl9CisjZW5kaWYKKwkvKiBDYWNoZSByYXRlcyBmb3IgY2xvY2tzIGNvbm5lY3RlZCB0byBja19yZWYgKG5vdCBkcGxsMSkgKi8KKwlwcm9wYWdhdGVfcmF0ZSgmY2tfcmVmKTsKKwlwcmludGsoS0VSTl9JTkZPICJDbG9ja2luZyByYXRlICh4dGFsL0RQTEwxL01QVSk6ICVsZC4lMDFsZC8lbGQvJWxkIE1IelxuIiwKKwkgICAgICAgY2tfcmVmLnJhdGUgLyAxMDAwMDAwLCAoY2tfcmVmLnJhdGUgLyAxMDAwMDApICUgMTAsCisJICAgICAgIGNrX2RwbGwxLnJhdGUsIGFybV9jay5yYXRlKTsKKworI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIKKwkvKiBTZWxlY3Qgc2xpY2VyIG91dHB1dCBhcyBPTUFQIGlucHV0IGNsb2NrICovCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhPTUFQNzMwX1BDQ19VUExEX0NUUkwpICYgfjB4MSwgT01BUDczMF9QQ0NfVVBMRF9DVFJMKTsKKyNlbmRpZgorCisJLyogVHVybiBvZmYgRFNQIGFuZCBBUk1fVElNWE8uIE1ha2Ugc3VyZSBBUk1fSU5USENLIGlzIG5vdCBkaXZpZGVkICovCisJb21hcF93cml0ZXcob21hcF9yZWFkdyhBUk1fQ0tDVEwpICYgMHgwZmZmLCBBUk1fQ0tDVEwpOworCisJLyogUHV0IERTUC9NUFVJIGludG8gcmVzZXQgdW50aWwgbmVlZGVkICovCisJb21hcF93cml0ZXcoMCwgQVJNX1JTVENUMSk7CisJb21hcF93cml0ZXcoMSwgQVJNX1JTVENUMik7CisJb21hcF93cml0ZXcoMHg0MDAsIEFSTV9JRExFQ1QxKTsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIE9NQVA1OTEwIEVycmF0dW0gU1lTX0RNQV8xLCBiaXQgRE1BQ0tfUkVRIChiaXQgOCkKKwkgKiBvZiB0aGUgQVJNX0lETEVDVDIgcmVnaXN0ZXIgbXVzdCBiZSBzZXQgdG8gemVyby4gVGhlIHBvd2VyLW9uCisJICogZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGJpdCBpcyBvbmUuCisJICovCisJb21hcF93cml0ZXcoMHgwMDAwLCBBUk1fSURMRUNUMik7CS8qIFR1cm4gTENEIGNsb2NrIG9mZiBhbHNvICovCisKKwkvKgorCSAqIE9ubHkgZW5hYmxlIHRob3NlIGNsb2NrcyB3ZSB3aWxsIG5lZWQsIGxldCB0aGUgZHJpdmVycworCSAqIGVuYWJsZSBvdGhlciBjbG9ja3MgYXMgbmVjZXNzYXJ5CisJICovCisJY2xrX3VzZSgmYXJtcGVyX2NrKTsKKwljbGtfdXNlKCZhcm14b3JfY2spOworCWNsa191c2UoJmFybXRpbV9jayk7CisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpCisJCWNsa19lbmFibGUoJmFybV9ncGlvX2NrKTsKKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBDT05GSUdfT01BUF9SRVNFVF9DTE9DS1MKKworc3RhdGljIGludCBfX2luaXQgb21hcF9sYXRlX2Nsa19yZXNldCh2b2lkKQoreworCS8qIFR1cm4gb2ZmIGFsbCB1bnVzZWQgY2xvY2tzICovCisJc3RydWN0IGNsayAqcDsKKwlfX3UzMiByZWd2YWwzMjsKKworCW9tYXBfd3JpdGV3KDAsIFNPRlRfUkVRX1JFRyk7CisJb21hcF93cml0ZXcoMCwgU09GVF9SRVFfUkVHMik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja3MsIG5vZGUpIHsKKwkJaWYgKHAtPnVzZWNvdW50ID4gMCB8fCAocC0+ZmxhZ3MgJiBBTFdBWVNfRU5BQkxFRCkgfHwKKwkJCXAtPmVuYWJsZV9yZWcgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFzc3VtZSBubyBEU1AgY2xvY2tzIGhhdmUgYmVlbiBhY3RpdmF0ZWQgYnkgYm9vdGxvYWRlciAqLworCQlpZiAocC0+ZmxhZ3MgJiBEU1BfRE9NQUlOX0NMT0NLKQorCQkJY29udGludWU7CisKKwkJLyogSXMgdGhlIGNsb2NrIGFscmVhZHkgZGlzYWJsZWQ/ICovCisJCWlmIChwLT5mbGFncyAmIEVOQUJMRV9SRUdfMzJCSVQpIHsKKwkJCWlmIChwLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykKKwkJCQlyZWd2YWwzMiA9IF9fcmF3X3JlYWRsKHAtPmVuYWJsZV9yZWcpOworCQkJZWxzZQorCQkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkbChwLT5lbmFibGVfcmVnKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwLT5mbGFncyAmIFZJUlRVQUxfSU9fQUREUkVTUykKKwkJCQlyZWd2YWwzMiA9IF9fcmF3X3JlYWR3KHAtPmVuYWJsZV9yZWcpOworCQkJZWxzZQorCQkJCXJlZ3ZhbDMyID0gb21hcF9yZWFkdyhwLT5lbmFibGVfcmVnKTsKKwkJfQorCisJCWlmICgocmVndmFsMzIgJiAoMSA8PCBwLT5lbmFibGVfYml0KSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZJWE1FOiBUaGlzIGNsb2NrIHNlZW1zIHRvIGJlIG5lY2Vzc2FyeSBidXQgbm8tb25lCisJCSAqIGhhcyBhc2tlZCBmb3IgaXRzIGFjdGl2YXRpb24uICovCisJCWlmIChwID09ICZ0YzJfY2sgICAgICAgICAvLyBGSVg6IHBtLmMgKFNSQU0pLCBDQ1AsIENhbWVyYQorCQkgICAgfHwgcCA9PSAmY2tfZHBsbDFvdXQgLy8gRklYOiBTb1NTSSwgU1NSCisJCSAgICB8fCBwID09ICZhcm1fZ3Bpb19jayAvLyBGSVg6IEdQSU8gY29kZSBmb3IgMTUxMAorCQkgICAgKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJGSVhNRTogQ2xvY2sgXCIlc1wiIHNlZW1zIHVudXNlZFxuIiwKKwkJCSAgICAgICBwLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIHVudXNlZCBjbG9jayBcIiVzXCIuLi4gIiwgcC0+bmFtZSk7CisJCV9fY2xrX2Rpc2FibGUocCk7CisJCXByaW50aygiIGRvbmVcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKG9tYXBfbGF0ZV9jbGtfcmVzZXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2Nsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5ZTFlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCBOb2tpYSBjb3Jwb3JhdGlvbgorICogIFdyaXR0ZW4gYnkgVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+CisgKiAgQmFzZWQgb24gY2xvY2tzLmggYnkgVG9ueSBMaW5kZ3JlbiwgR29yZG9uIE1jTnV0dCBhbmQgUmlkZ2VSdW4sIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0FSQ0hfQVJNX09NQVBfQ0xPQ0tfSAorI2RlZmluZSBfX0FSQ0hfQVJNX09NQVBfQ0xPQ0tfSAorCitzdHJ1Y3QgbW9kdWxlOworCitzdHJ1Y3QgY2xrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IG1vZHVsZQkJKm93bmVyOworCWNvbnN0IGNoYXIJCSpuYW1lOworCXN0cnVjdCBjbGsJCSpwYXJlbnQ7CisJdW5zaWduZWQgbG9uZwkJcmF0ZTsKKwlfX3M4CQkJdXNlY291bnQ7CisJX191MTYJCQlmbGFnczsKKwlfX3UzMgkJCWVuYWJsZV9yZWc7CisJX191OAkJCWVuYWJsZV9iaXQ7CisJX191OAkJCXJhdGVfb2Zmc2V0OworCXZvaWQJCQkoKnJlY2FsYykoc3RydWN0IGNsayAqKTsKKwlpbnQJCQkoKnNldF9yYXRlKShzdHJ1Y3QgY2xrICosIHVuc2lnbmVkIGxvbmcpOworCWxvbmcJCQkoKnJvdW5kX3JhdGUpKHN0cnVjdCBjbGsgKiwgdW5zaWduZWQgbG9uZyk7CisJdm9pZAkJCSgqaW5pdCkoc3RydWN0IGNsayAqKTsKK307CisKKworc3RydWN0IG1wdV9yYXRlIHsKKwl1bnNpZ25lZCBsb25nCQlyYXRlOworCXVuc2lnbmVkIGxvbmcJCXh0YWw7CisJdW5zaWduZWQgbG9uZwkJcGxsX3JhdGU7CisJX191MTYJCQlja2N0bF92YWw7CisJX191MTYJCQlkcGxsY3RsX3ZhbDsKK307CisKKworLyogQ2xvY2sgZmxhZ3MgKi8KKyNkZWZpbmUgUkFURV9DS0NUTAkJMQorI2RlZmluZSBSQVRFX0ZJWEVECQkyCisjZGVmaW5lIFJBVEVfUFJPUEFHQVRFUwkJNAorI2RlZmluZSBWSVJUVUFMX0NMT0NLCQk4CisjZGVmaW5lIEFMV0FZU19FTkFCTEVECQkxNgorI2RlZmluZSBFTkFCTEVfUkVHXzMyQklUCTMyCisjZGVmaW5lIENMT0NLX0lOX09NQVAxNlhYCTY0CisjZGVmaW5lIENMT0NLX0lOX09NQVAxNTEwCTEyOAorI2RlZmluZSBDTE9DS19JTl9PTUFQNzMwCTI1NgorI2RlZmluZSBEU1BfRE9NQUlOX0NMT0NLCTUxMgorI2RlZmluZSBWSVJUVUFMX0lPX0FERFJFU1MJMTAyNAorCisvKiBBUk1fQ0tDVEwgYml0IHNoaWZ0cyAqLworI2RlZmluZSBDS0NUTF9QRVJESVZfT0ZGU0VUCTAKKyNkZWZpbmUgQ0tDVExfTENERElWX09GRlNFVAkyCisjZGVmaW5lIENLQ1RMX0FSTURJVl9PRkZTRVQJNAorI2RlZmluZSBDS0NUTF9EU1BESVZfT0ZGU0VUCTYKKyNkZWZpbmUgQ0tDVExfVENESVZfT0ZGU0VUCTgKKyNkZWZpbmUgQ0tDVExfRFNQTU1VRElWX09GRlNFVAkxMAorLyojZGVmaW5lIEFSTV9USU1YTwkJMTIqLworI2RlZmluZSBFTl9EU1BDSwkJMTMKKy8qI2RlZmluZSBBUk1fSU5USENLX1NFTAkxNCovIC8qIERpdmlkZS1ieS0yIGZvciBtcHUgaW50aF9jayAqLworLyogRFNQX0NLQ1RMIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgQ0tDVExfRFNQUEVSRElWX09GRlNFVAkwCisKKy8qIEFSTV9JRExFQ1QxIGJpdCBzaGlmdHMgKi8KKy8qI2RlZmluZSBJRExXRFRfQVJNCTAqLworLyojZGVmaW5lIElETFhPUlBfQVJNCTEqLworLyojZGVmaW5lIElETFBFUl9BUk0JMiovCisvKiNkZWZpbmUgSURMTENEX0FSTQkzKi8KKy8qI2RlZmluZSBJRExMQl9BUk0JNCovCisvKiNkZWZpbmUgSURMSFNBQl9BUk0JNSovCisvKiNkZWZpbmUgSURMSUZfQVJNCTYqLworLyojZGVmaW5lIElETERQTExfQVJNCTcqLworLyojZGVmaW5lIElETEFQSV9BUk0JOCovCisvKiNkZWZpbmUgSURMVElNX0FSTQk5Ki8KKy8qI2RlZmluZSBTRVRBUk1fSURMRQkxMSovCisKKy8qIEFSTV9JRExFQ1QyIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fV0RUQ0sJMAorI2RlZmluZSBFTl9YT1JQQ0sJMQorI2RlZmluZSBFTl9QRVJDSwkyCisjZGVmaW5lIEVOX0xDRENLCTMKKyNkZWZpbmUgRU5fTEJDSwkJNCAvKiBOb3Qgb24gMTYxMC8xNzEwICovCisvKiNkZWZpbmUgRU5fSFNBQkNLCTUqLworI2RlZmluZSBFTl9BUElDSwk2CisjZGVmaW5lIEVOX1RJTUNLCTcKKyNkZWZpbmUgRE1BQ0tfUkVRCTgKKyNkZWZpbmUgRU5fR1BJT0NLCTkgLyogTm90IG9uIDE2MTAvMTcxMCAqLworLyojZGVmaW5lIEVOX0xCRlJFRUNLCTEwKi8KKyNkZWZpbmUgRU5fQ0tPVVRfQVJNCTExCisKKy8qIEFSTV9JRExFQ1QzIGJpdCBzaGlmdHMgKi8KKyNkZWZpbmUgRU5fT0NQSV9DSwkwCisjZGVmaW5lIEVOX1RDMV9DSwkyCisjZGVmaW5lIEVOX1RDMl9DSwk0CisKKy8qIERTUF9JRExFQ1QyIGJpdCBzaGlmdHMgKDAsMSwyIGFyZSBzYW1lIGFzIGZvciBBUk1fSURMRUNUMikgKi8KKyNkZWZpbmUgRU5fRFNQVElNQ0sJNQorCisvKiBWYXJpb3VzIHJlZ2lzdGVyIGRlZmluZXMgZm9yIGNsb2NrIGNvbnRyb2xzIHNjYXR0ZXJlZCBhcm91bmQgT01BUCBjaGlwICovCisjZGVmaW5lIFVTQl9NQ0xLX0VOX0JJVAkJNAkvKiBJbiBVTFBEX0NMS0NfQ1RSTCAqLworI2RlZmluZSBVU0JfSE9TVF9ISENfVUhPU1RfRU4JOQkvKiBJbiBNT0RfQ09ORl9DVFJMXzAgKi8KKyNkZWZpbmUgU1dEX1VMUERfUExMX0NMS19SRVEJMQkvKiBJbiBTV0RfQ0xLX0RJVl9DVFJMX1NFTCAqLworI2RlZmluZSBDT01fVUxQRF9QTExfQ0xLX1JFUQkxCS8qIEluIENPTV9DTEtfRElWX0NUUkxfU0VMICovCisjZGVmaW5lIFNXRF9DTEtfRElWX0NUUkxfU0VMCTB4ZmZmZTA4NzQKKyNkZWZpbmUgQ09NX0NMS19ESVZfQ1RSTF9TRUwJMHhmZmZlMDg3OAorI2RlZmluZSBTT0ZUX1JFUV9SRUcJCTB4ZmZmZTA4MzQKKyNkZWZpbmUgU09GVF9SRVFfUkVHMgkJMHhmZmZlMDg4MAorCitpbnQgY2xrX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7Cit2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsayk7CitpbnQgY2xrX2luaXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTY3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKKyAqCisgKiBDb2RlIGNvbW1vbiB0byBhbGwgT01BUCBtYWNoaW5lcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvYm9hcmQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9mcGdhLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorCisjZGVmaW5lIE5PX0xFTkdUSF9DSEVDSyAweGZmZmZmZmZmCisKK2V4dGVybiBpbnQgb21hcF9ib290bG9hZGVyX3RhZ19sZW47CitleHRlcm4gdTggb21hcF9ib290bG9hZGVyX3RhZ1tdOworCitzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpvbWFwX2JvYXJkX2NvbmZpZzsKK2ludCBvbWFwX2JvYXJkX2NvbmZpZ19zaXplID0gMDsKKworc3RhdGljIGNvbnN0IHZvaWQgKmdldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IHNraXAsIHNpemVfdCAqbGVuX291dCkKK3sKKwlzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfa2VybmVsICpraW5mbyA9IE5VTEw7CisJaW50IGk7CisKKyNpZmRlZiBDT05GSUdfT01BUF9CT09UX1RBRworCXN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSAqaW5mbyA9IE5VTEw7CisKKwlpZiAob21hcF9ib290bG9hZGVyX3RhZ19sZW4gPiA0KQorCQlpbmZvID0gKHN0cnVjdCBvbWFwX2JvYXJkX2NvbmZpZ19lbnRyeSAqKSBvbWFwX2Jvb3Rsb2FkZXJfdGFnOworCXdoaWxlIChpbmZvICE9IE5VTEwpIHsKKwkJdTggKm5leHQ7CisKKwkJaWYgKGluZm8tPnRhZyA9PSB0YWcpIHsKKwkJCWlmIChza2lwID09IDApCisJCQkJYnJlYWs7CisJCQlza2lwLS07CisJCX0KKworCQlpZiAoKGluZm8tPmxlbiAmIDB4MDMpICE9IDApIHsKKwkJCS8qIFdlIGJhaWwgb3V0IHRvIGF2b2lkIGFuIGFsaWdubWVudCBmYXVsdCAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIHBlcmlwaGVyYWwgY29uZmlnOiBMZW5ndGggKCVkKSBub3Qgd29yZC1hbGlnbmVkICh0YWcgJTA0eClcbiIsCisJCQkgICAgICAgaW5mby0+bGVuLCBpbmZvLT50YWcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbmV4dCA9ICh1OCAqKSBpbmZvICsgc2l6ZW9mKCppbmZvKSArIGluZm8tPmxlbjsKKwkJaWYgKG5leHQgPj0gb21hcF9ib290bG9hZGVyX3RhZyArIG9tYXBfYm9vdGxvYWRlcl90YWdfbGVuKQorCQkJaW5mbyA9IE5VTEw7CisJCWVsc2UKKwkJCWluZm8gPSAoc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2VudHJ5ICopIG5leHQ7CisJfQorCWlmIChpbmZvICE9IE5VTEwpIHsKKwkJLyogQ2hlY2sgdGhlIGxlbmd0aCBhcyBhIGxhbWUgYXR0ZW1wdCB0byBjaGVjayBmb3IKKwkJICogYmluYXJ5IGluY29uc2lzdGFuY3kuICovCisJCWlmIChsZW4gIT0gTk9fTEVOR1RIX0NIRUNLKSB7CisJCQkvKiBXb3JkLWFsaWduIGxlbiAqLworCQkJaWYgKGxlbiAmIDB4MDMpCisJCQkJbGVuID0gKGxlbiArIDMpICYgfjB4MDM7CisJCQlpZiAoaW5mby0+bGVuICE9IGxlbikgeworCQkJCXByaW50ayhLRVJOX0VSUiAiT01BUCBwZXJpcGhlcmFsIGNvbmZpZzogTGVuZ3RoIG1pc21hdGNoIHdpdGggdGFnICV4ICh3YW50ICVkLCBnb3QgJWQpXG4iLAorCQkJCSAgICAgICB0YWcsIGxlbiwgaW5mby0+bGVuKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAobGVuX291dCAhPSBOVUxMKQorCQkJKmxlbl9vdXQgPSBpbmZvLT5sZW47CisJCXJldHVybiBpbmZvLT5kYXRhOworCX0KKyNlbmRpZgorCS8qIFRyeSB0byBmaW5kIHRoZSBjb25maWcgZnJvbSB0aGUgYm9hcmQtc3BlY2lmaWMgc3RydWN0dXJlcworCSAqIGluIHRoZSBrZXJuZWwuICovCisJZm9yIChpID0gMDsgaSA8IG9tYXBfYm9hcmRfY29uZmlnX3NpemU7IGkrKykgeworCQlpZiAob21hcF9ib2FyZF9jb25maWdbaV0udGFnID09IHRhZykgeworCQkJa2luZm8gPSAmb21hcF9ib2FyZF9jb25maWdbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoa2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGtpbmZvLT5kYXRhOworfQorCitjb25zdCB2b2lkICpfX29tYXBfZ2V0X2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgbGVuLCBpbnQgbnIpCit7CisgICAgICAgIHJldHVybiBnZXRfY29uZmlnKHRhZywgbGVuLCBuciwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fb21hcF9nZXRfY29uZmlnKTsKKworY29uc3Qgdm9pZCAqb21hcF9nZXRfdmFyX2NvbmZpZyh1MTYgdGFnLCBzaXplX3QgKmxlbikKK3sKKyAgICAgICAgcmV0dXJuIGdldF9jb25maWcodGFnLCBOT19MRU5HVEhfQ0hFQ0ssIDAsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X3Zhcl9jb25maWcpOworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2FkZF9zZXJpYWxfY29uc29sZSh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBvbWFwX3NlcmlhbF9jb25zb2xlX2NvbmZpZyAqaW5mbzsKKworCWluZm8gPSBvbWFwX2dldF9jb25maWcoT01BUF9UQUdfU0VSSUFMX0NPTlNPTEUsCisJCQkgICAgICAgc3RydWN0IG9tYXBfc2VyaWFsX2NvbnNvbGVfY29uZmlnKTsKKwlpZiAoaW5mbyAhPSBOVUxMICYmIGluZm8tPmNvbnNvbGVfdWFydCkgeworCQlzdGF0aWMgY2hhciBzcGVlZFsxMV0sICpvcHQgPSBOVUxMOworCisJCWlmIChpbmZvLT5jb25zb2xlX3NwZWVkKSB7CisJCQlzbnByaW50ZihzcGVlZCwgc2l6ZW9mKHNwZWVkKSwgIiV1IiwgaW5mby0+Y29uc29sZV9zcGVlZCk7CisJCQlvcHQgPSBzcGVlZDsKKwkJfQorCQlyZXR1cm4gYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ0dHlTIiwgaW5mby0+Y29uc29sZV91YXJ0IC0gMSwgb3B0KTsKKwl9CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKG9tYXBfYWRkX3NlcmlhbF9jb25zb2xlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NwdS1vbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5YWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9jcHUtb21hcC5jCisgKgorICogIENQVSBmcmVxdWVuY3kgc2NhbGluZyBmb3IgT01BUAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqICBXcml0dGVuIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+CisgKgorICogIEJhc2VkIG9uIGNwdS1zYTExMTAuYywgQ29weXJpZ2h0IChDKSAyMDAxIFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKworLyogVE9ETzogQWRkIHN1cHBvcnQgZm9yIFNEUkFNIHRpbWluZyBjaGFuZ2VzICovCisKK2ludCBvbWFwX3ZlcmlmeV9zcGVlZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgY2xrICogbXB1X2NsazsKKworCWlmIChwb2xpY3ktPmNwdSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljcHVmcmVxX3ZlcmlmeV93aXRoaW5fbGltaXRzKHBvbGljeSwgcG9saWN5LT5jcHVpbmZvLm1pbl9mcmVxLAorCQkJCSAgICAgcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxKTsKKwltcHVfY2xrID0gY2xrX2dldChOVUxMLCAibXB1Iik7CisJaWYgKElTX0VSUihtcHVfY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIobXB1X2Nsayk7CisJcG9saWN5LT5taW4gPSBjbGtfcm91bmRfcmF0ZShtcHVfY2xrLCBwb2xpY3ktPm1pbiAqIDEwMDApIC8gMTAwMDsKKwlwb2xpY3ktPm1heCA9IGNsa19yb3VuZF9yYXRlKG1wdV9jbGssIHBvbGljeS0+bWF4ICogMTAwMCkgLyAxMDAwOworCWNwdWZyZXFfdmVyaWZ5X3dpdGhpbl9saW1pdHMocG9saWN5LCBwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEsCisJCQkJICAgICBwb2xpY3ktPmNwdWluZm8ubWF4X2ZyZXEpOworCWNsa19wdXQobXB1X2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgaW50IG9tYXBfZ2V0c3BlZWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY2xrICogbXB1X2NsazsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisKKwlpZiAoY3B1KQorCQlyZXR1cm4gMDsKKworCW1wdV9jbGsgPSBjbGtfZ2V0KE5VTEwsICJtcHUiKTsKKwlpZiAoSVNfRVJSKG1wdV9jbGspKQorCQlyZXR1cm4gMDsKKwlyYXRlID0gY2xrX2dldF9yYXRlKG1wdV9jbGspIC8gMTAwMDsKKwljbGtfcHV0KG1wdV9jbGspOworCisJcmV0dXJuIHJhdGU7Cit9CisKK3N0YXRpYyBpbnQgb21hcF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2ZyZXEsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGNsayAqIG1wdV9jbGs7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgZnJlcXM7CisJaW50IHJldCA9IDA7CisKKwltcHVfY2xrID0gY2xrX2dldChOVUxMLCAibXB1Iik7CisJaWYgKElTX0VSUihtcHVfY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIobXB1X2Nsayk7CisKKwlmcmVxcy5vbGQgPSBvbWFwX2dldHNwZWVkKDApOworCWZyZXFzLm5ldyA9IGNsa19yb3VuZF9yYXRlKG1wdV9jbGssIHRhcmdldF9mcmVxICogMTAwMCkgLyAxMDAwOworCWZyZXFzLmNwdSA9IDA7CisKKwljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCXJldCA9IGNsa19zZXRfcmF0ZShtcHVfY2xrLCB0YXJnZXRfZnJlcSAqIDEwMDApOworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCWNsa19wdXQobXB1X2Nsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBjbGsgKiBtcHVfY2xrOworCisJbXB1X2NsayA9IGNsa19nZXQoTlVMTCwgIm1wdSIpOworCWlmIChJU19FUlIobXB1X2NsaykpCisJCXJldHVybiBQVFJfRVJSKG1wdV9jbGspOworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXBvbGljeS0+Y3VyID0gcG9saWN5LT5taW4gPSBwb2xpY3ktPm1heCA9IG9tYXBfZ2V0c3BlZWQoMCk7CisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKwlwb2xpY3ktPmNwdWluZm8ubWluX2ZyZXEgPSBjbGtfcm91bmRfcmF0ZShtcHVfY2xrLCAwKSAvIDEwMDA7CisJcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxID0gY2xrX3JvdW5kX3JhdGUobXB1X2NsaywgMjE2MDAwMDAwKSAvIDEwMDA7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IENQVUZSRVFfRVRFUk5BTDsKKwljbGtfcHV0KG1wdV9jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9kcml2ZXIgb21hcF9kcml2ZXIgPSB7CisJLmZsYWdzCQk9IENQVUZSRVFfU1RJQ0tZLAorCS52ZXJpZnkJCT0gb21hcF92ZXJpZnlfc3BlZWQsCisJLnRhcmdldAkJPSBvbWFwX3RhcmdldCwKKwkuZ2V0CQk9IG9tYXBfZ2V0c3BlZWQsCisJLmluaXQJCT0gb21hcF9jcHVfaW5pdCwKKwkubmFtZQkJPSAib21hcCIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2NwdWZyZXFfaW5pdCh2b2lkKQoreworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmb21hcF9kcml2ZXIpOworfQorCithcmNoX2luaXRjYWxsKG9tYXBfY3B1ZnJlcV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGE1YzJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCkBAIC0wLDAgKzEsMTExNiBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgorICogRE1BIGNoYW5uZWwgbGlua2luZyBmb3IgMTYxMCBieSBTYW11ZWwgT3J0aXogPHNhbXVlbC5vcnRpekBub2tpYS5jb20+CisgKiBHcmFwaGljcyBETUEgYW5kIExDRCBETUEgZ3JhcGhpY3MgdHJhbmZvcm1hdGlvbnMKKyAqIGJ5IEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIFNvbWUgZnVuY3Rpb25zIGJhc2VkIG9uIGVhcmxpZXIgZG1hLW9tYXAuYyBDb3B5cmlnaHQgKEMpIDIwMDEgUmlkZ2VSdW4sIEluYy4KKyAqCisgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIE9NQVAgaW50ZXJuYWwgRE1BIGNoYW5uZWxzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CisKKyNkZWZpbmUgT01BUF9ETUFfQUNUSVZFCQkweDAxCisKKyNkZWZpbmUgT01BUF9ETUFfQ0NSX0VOCQkoMSA8PCA3KQorCisjZGVmaW5lIE9NQVBfRlVOQ19NVVhfQVJNX0JBU0UJKDB4ZmZmZTEwMDAgKyAweGVjKQorCitzdGF0aWMgaW50IGVuYWJsZV8xNTEwX21vZGUgPSAwOworCitzdHJ1Y3Qgb21hcF9kbWFfbGNoIHsKKwlpbnQgbmV4dF9sY2g7CisJaW50IGRldl9pZDsKKwl1MTYgc2F2ZWRfY3NyOworCXUxNiBlbmFibGVkX2lycXM7CisJY29uc3QgY2hhciAqZGV2X25hbWU7CisJdm9pZCAoKiBjYWxsYmFjaykoaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSk7CisJdm9pZCAqZGF0YTsKKwlsb25nIGZsYWdzOworfTsKKworc3RhdGljIGludCBkbWFfY2hhbl9jb3VudDsKKworc3RhdGljIHNwaW5sb2NrX3QgZG1hX2NoYW5fbG9jazsKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9kbWFfbGNoIGRtYV9jaGFuW09NQVBfTE9HSUNBTF9ETUFfQ0hfQ09VTlRdOworCitjb25zdCBzdGF0aWMgdTggZG1hX2lycVtPTUFQX0xPR0lDQUxfRE1BX0NIX0NPVU5UXSA9IHsKKwlJTlRfRE1BX0NIMF82LCBJTlRfRE1BX0NIMV83LCBJTlRfRE1BX0NIMl84LCBJTlRfRE1BX0NIMywKKwlJTlRfRE1BX0NINCwgSU5UX0RNQV9DSDUsIElOVF8xNjEwX0RNQV9DSDYsIElOVF8xNjEwX0RNQV9DSDcsCisJSU5UXzE2MTBfRE1BX0NIOCwgSU5UXzE2MTBfRE1BX0NIOSwgSU5UXzE2MTBfRE1BX0NIMTAsCisJSU5UXzE2MTBfRE1BX0NIMTEsIElOVF8xNjEwX0RNQV9DSDEyLCBJTlRfMTYxMF9ETUFfQ0gxMywKKwlJTlRfMTYxMF9ETUFfQ0gxNCwgSU5UXzE2MTBfRE1BX0NIMTUsIElOVF9ETUFfTENECit9OworCitzdGF0aWMgaW5saW5lIGludCBnZXRfZ2RtYV9kZXYoaW50IHJlcSkKK3sKKwl1MzIgcmVnID0gT01BUF9GVU5DX01VWF9BUk1fQkFTRSArICgocmVxIC0gMSkgLyA1KSAqIDQ7CisJaW50IHNoaWZ0ID0gKChyZXEgLSAxKSAlIDUpICogNjsKKworCXJldHVybiAoKG9tYXBfcmVhZGwocmVnKSA+PiBzaGlmdCkgJiAweDNmKSArIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZ2RtYV9kZXYoaW50IHJlcSwgaW50IGRldikKK3sKKwl1MzIgcmVnID0gT01BUF9GVU5DX01VWF9BUk1fQkFTRSArICgocmVxIC0gMSkgLyA1KSAqIDQ7CisJaW50IHNoaWZ0ID0gKChyZXEgLSAxKSAlIDUpICogNjsKKwl1MzIgbDsKKworCWwgPSBvbWFwX3JlYWRsKHJlZyk7CisJbCAmPSB+KDB4M2YgPDwgc2hpZnQpOworCWwgfD0gKGRldiAtIDEpIDw8IHNoaWZ0OworCW9tYXBfd3JpdGVsKGwsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2xjaF9yZWdzKGludCBsY2gpCit7CisJaW50IGk7CisJdTMyIGxjaF9iYXNlID0gT01BUF9ETUFfQkFTRSArIGxjaCAqIDB4NDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMHgyYzsgaSArPSAyKQorCQlvbWFwX3dyaXRldygwLCBsY2hfYmFzZSArIGkpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV9wcmlvcml0eShpbnQgZHN0X3BvcnQsIGludCBwcmlvcml0eSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZzsKKwl1MzIgbDsKKworCXN3aXRjaCAoZHN0X3BvcnQpIHsKKwljYXNlIE9NQVBfRE1BX1BPUlRfT0NQX1QxOgkvKiBGRkZFQ0MwMCAqLworCQlyZWcgPSBPTUFQX1RDX09DUFQxX1BSSU9SOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX1BPUlRfT0NQX1QyOgkvKiBGRkZFQ0NEMCAqLworCQlyZWcgPSBPTUFQX1RDX09DUFQyX1BSSU9SOworCQlicmVhazsKKwljYXNlIE9NQVBfRE1BX1BPUlRfRU1JRkY6CS8qIEZGRkVDQzA4ICovCisJCXJlZyA9IE9NQVBfVENfRU1JRkZfUFJJT1I7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfUE9SVF9FTUlGUzoJLyogRkZGRUNDMDQgKi8KKwkJcmVnID0gT01BUF9UQ19FTUlGU19QUklPUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJbCA9IG9tYXBfcmVhZGwocmVnKTsKKwlsICY9IH4oMHhmIDw8IDgpOworCWwgfD0gKHByaW9yaXR5ICYgMHhmKSA8PCA4OworCW9tYXBfd3JpdGVsKGwsIHJlZyk7Cit9CisKK3ZvaWQgb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhpbnQgbGNoLCBpbnQgZGF0YV90eXBlLCBpbnQgZWxlbV9jb3VudCwKKwkJCQkgIGludCBmcmFtZV9jb3VudCwgaW50IHN5bmNfbW9kZSkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSk7CisJdyAmPSB+MHgwMzsKKwl3IHw9IGRhdGFfdHlwZTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpOworCXcgJj0gfigxIDw8IDUpOworCWlmIChzeW5jX21vZGUgPT0gT01BUF9ETUFfU1lOQ19GUkFNRSkKKwkJdyB8PSAxIDw8IDU7CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0NSKGxjaCkpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSMihsY2gpKTsKKwl3ICY9IH4oMSA8PCAyKTsKKwlpZiAoc3luY19tb2RlID09IE9NQVBfRE1BX1NZTkNfQkxPQ0spCisJCXcgfD0gMSA8PCAyOworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUjIobGNoKSk7CisKKwlvbWFwX3dyaXRldyhlbGVtX2NvdW50LCBPTUFQX0RNQV9DRU4obGNoKSk7CisJb21hcF93cml0ZXcoZnJhbWVfY291bnQsIE9NQVBfRE1BX0NGTihsY2gpKTsKKworfQordm9pZCBvbWFwX3NldF9kbWFfY29sb3JfbW9kZShpbnQgbGNoLCBlbnVtIG9tYXBfZG1hX2NvbG9yX21vZGUgbW9kZSwgdTMyIGNvbG9yKQoreworCXUxNiB3OworCisJQlVHX09OKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NDUjIobGNoKSkgJiB+MHgwMzsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBfRE1BX0NPTlNUQU5UX0ZJTEw6CisJCXcgfD0gMHgwMTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9UUkFOU1BBUkVOVF9DT1BZOgorCQl3IHw9IDB4MDI7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfQ09MT1JfRElTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0NSMihsY2gpKTsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0xDSF9DVFJMKGxjaCkpICYgfjB4MGY7CisJLyogRGVmYXVsdCBpcyBjaGFubmVsIHR5cGUgMkQgKi8KKwlpZiAobW9kZSkgeworCQlvbWFwX3dyaXRldygodTE2KWNvbG9yLCBPTUFQX0RNQV9DT0xPUl9MKGxjaCkpOworCQlvbWFwX3dyaXRldygodTE2KShjb2xvciA+PiAxNiksIE9NQVBfRE1BX0NPTE9SX1UobGNoKSk7CisJCXcgfD0gMTsJCS8qIENoYW5uZWwgdHlwZSBHICovCisJfQorCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0xDSF9DVFJMKGxjaCkpOworfQorCisKK3ZvaWQgb21hcF9zZXRfZG1hX3NyY19wYXJhbXMoaW50IGxjaCwgaW50IHNyY19wb3J0LCBpbnQgc3JjX2Ftb2RlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHNyY19zdGFydCkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSk7CisJdyAmPSB+KDB4MWYgPDwgMik7CisJdyB8PSBzcmNfcG9ydCA8PCAyOworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NTRFAobGNoKSk7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DQ1IobGNoKSk7CisJdyAmPSB+KDB4MDMgPDwgMTIpOworCXcgfD0gc3JjX2Ftb2RlIDw8IDEyOworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUihsY2gpKTsKKworCW9tYXBfd3JpdGV3KHNyY19zdGFydCA+PiAxNiwgT01BUF9ETUFfQ1NTQV9VKGxjaCkpOworCW9tYXBfd3JpdGV3KHNyY19zdGFydCwgT01BUF9ETUFfQ1NTQV9MKGxjaCkpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV9zcmNfaW5kZXgoaW50IGxjaCwgaW50IGVpZHgsIGludCBmaWR4KQoreworCW9tYXBfd3JpdGV3KGVpZHgsIE9NQVBfRE1BX0NTRUkobGNoKSk7CisJb21hcF93cml0ZXcoZmlkeCwgT01BUF9ETUFfQ1NGSShsY2gpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfc3JjX2RhdGFfcGFjayhpbnQgbGNoLCBpbnQgZW5hYmxlKQoreworCXUxNiB3OworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NEUChsY2gpKSAmIH4oMSA8PCA2KTsKKwl3IHw9IGVuYWJsZSA/ICgxIDw8IDYpIDogMDsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV9zcmNfYnVyc3RfbW9kZShpbnQgbGNoLCBlbnVtIG9tYXBfZG1hX2J1cnN0X21vZGUgYnVyc3RfbW9kZSkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSkgJiB+KDB4MDMgPDwgNyk7CisJc3dpdGNoIChidXJzdF9tb2RlKSB7CisJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUX0RJUzoKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUXzQ6CisJCXcgfD0gKDB4MDEgPDwgNyk7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF84OgorCQkvKiBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgaGFyZHdhcmUKKwkJICogdyB8PSAoMHgwMyA8PCA3KTsKKwkJICogZmFsbCB0aHJvdWdoCisJCSAqLworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhpbnQgbGNoLCBpbnQgZGVzdF9wb3J0LCBpbnQgZGVzdF9hbW9kZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZGVzdF9zdGFydCkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSk7CisJdyAmPSB+KDB4MWYgPDwgOSk7CisJdyB8PSBkZXN0X3BvcnQgPDwgOTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpOworCXcgJj0gfigweDAzIDw8IDE0KTsKKwl3IHw9IGRlc3RfYW1vZGUgPDwgMTQ7CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0NSKGxjaCkpOworCisJb21hcF93cml0ZXcoZGVzdF9zdGFydCA+PiAxNiwgT01BUF9ETUFfQ0RTQV9VKGxjaCkpOworCW9tYXBfd3JpdGV3KGRlc3Rfc3RhcnQsIE9NQVBfRE1BX0NEU0FfTChsY2gpKTsKK30KKwordm9pZCBvbWFwX3NldF9kbWFfZGVzdF9pbmRleChpbnQgbGNoLCBpbnQgZWlkeCwgaW50IGZpZHgpCit7CisJb21hcF93cml0ZXcoZWlkeCwgT01BUF9ETUFfQ0RFSShsY2gpKTsKKwlvbWFwX3dyaXRldyhmaWR4LCBPTUFQX0RNQV9DREZJKGxjaCkpOworfQorCit2b2lkIG9tYXBfc2V0X2RtYV9kZXN0X2RhdGFfcGFjayhpbnQgbGNoLCBpbnQgZW5hYmxlKQoreworCXUxNiB3OworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NEUChsY2gpKSAmIH4oMSA8PCAxMyk7CisJdyB8PSBlbmFibGUgPyAoMSA8PCAxMykgOiAwOworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NTRFAobGNoKSk7Cit9CisKK3ZvaWQgb21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZShpbnQgbGNoLCBlbnVtIG9tYXBfZG1hX2J1cnN0X21vZGUgYnVyc3RfbW9kZSkKK3sKKwl1MTYgdzsKKworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTRFAobGNoKSkgJiB+KDB4MDMgPDwgMTQpOworCXN3aXRjaCAoYnVyc3RfbW9kZSkgeworCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF9ESVM6CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfREFUQV9CVVJTVF80OgorCQl3IHw9ICgweDAxIDw8IDE0KTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9EQVRBX0JVUlNUXzg6CisJCXcgfD0gKDB4MDMgPDwgMTQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgRE1BIGJ1cnN0IG1vZGVcbiIpOworCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DU0RQKGxjaCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9pbnRyKGludCBsY2gpCit7CisJdTE2IHc7CisKKwkvKiBSZWFkIENTUiB0byBtYWtlIHN1cmUgaXQncyBjbGVhcmVkLiAqLworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NTUihsY2gpKTsKKwkvKiBFbmFibGUgc29tZSBuaWNlIGludGVycnVwdHMuICovCisJb21hcF93cml0ZXcoZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXMsIE9NQVBfRE1BX0NJQ1IobGNoKSk7CisJZG1hX2NoYW5bbGNoXS5mbGFncyB8PSBPTUFQX0RNQV9BQ1RJVkU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfbG5rKGludCBsY2gpCit7CisJdTE2IHc7CisKKwkvKiBDbGVhciB0aGUgU1RPUF9MTksgYml0cyAqLworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKKwl3ICY9IH4oMSA8PCAxNCk7CisJb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0xOS19DVFJMKGxjaCkpOworCisJLyogQW5kIHNldCB0aGUgRU5BQkxFX0xOSyBiaXRzICovCisJaWYgKGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggIT0gLTEpCisJCW9tYXBfd3JpdGV3KGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggfCAoMSA8PCAxNSksCisJCQkgICAgT01BUF9ETUFfQ0xOS19DVFJMKGxjaCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9sbmsoaW50IGxjaCkKK3sKKwl1MTYgdzsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCW9tYXBfd3JpdGV3KDAsIE9NQVBfRE1BX0NJQ1IobGNoKSk7CisKKwkvKiBTZXQgdGhlIFNUT1BfTE5LIGJpdCAqLworCXcgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NMTktfQ1RSTChsY2gpKTsKKwl3IHw9ICgxIDw8IDE0KTsKKwl3ID0gb21hcF93cml0ZXcodywgT01BUF9ETUFfQ0xOS19DVFJMKGxjaCkpOworCisJZG1hX2NoYW5bbGNoXS5mbGFncyAmPSB+T01BUF9ETUFfQUNUSVZFOworfQorCit2b2lkIG9tYXBfc3RhcnRfZG1hKGludCBsY2gpCit7CisJdTE2IHc7CisKKwlpZiAoIW9tYXBfZG1hX2luXzE1MTBfbW9kZSgpICYmIGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggIT0gLTEpIHsKKwkJaW50IG5leHRfbGNoLCBjdXJfbGNoOworCQljaGFyIGRtYV9jaGFuX2xpbmtfbWFwW09NQVBfTE9HSUNBTF9ETUFfQ0hfQ09VTlRdOworCisJCWRtYV9jaGFuX2xpbmtfbWFwW2xjaF0gPSAxOworCQkvKiBTZXQgdGhlIGxpbmsgcmVnaXN0ZXIgb2YgdGhlIGZpcnN0IGNoYW5uZWwgKi8KKwkJZW5hYmxlX2xuayhsY2gpOworCisJCW1lbXNldChkbWFfY2hhbl9saW5rX21hcCwgMCwgc2l6ZW9mKGRtYV9jaGFuX2xpbmtfbWFwKSk7CisJCWN1cl9sY2ggPSBkbWFfY2hhbltsY2hdLm5leHRfbGNoOworCQlkbyB7CisJCQluZXh0X2xjaCA9IGRtYV9jaGFuW2N1cl9sY2hdLm5leHRfbGNoOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbG9vcCBjYXNlOiB3ZSd2ZSBiZWVuIGhlcmUgYWxyZWFkeSAqLworCQkJaWYgKGRtYV9jaGFuX2xpbmtfbWFwW2N1cl9sY2hdKQorCQkJCWJyZWFrOworCQkJLyogTWFyayB0aGUgY3VycmVudCBjaGFubmVsICovCisJCQlkbWFfY2hhbl9saW5rX21hcFtjdXJfbGNoXSA9IDE7CisKKwkJCWVuYWJsZV9sbmsoY3VyX2xjaCk7CisJCQlpbml0X2ludHIoY3VyX2xjaCk7CisKKwkJCWN1cl9sY2ggPSBuZXh0X2xjaDsKKwkJfSB3aGlsZSAobmV4dF9sY2ggIT0gLTEpOworCX0KKworCWluaXRfaW50cihsY2gpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpOworCXcgfD0gT01BUF9ETUFfQ0NSX0VOOworCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0NDUihsY2gpKTsKKwlkbWFfY2hhbltsY2hdLmZsYWdzIHw9IE9NQVBfRE1BX0FDVElWRTsKK30KKwordm9pZCBvbWFwX3N0b3BfZG1hKGludCBsY2gpCit7CisJdTE2IHc7CisKKwlpZiAoIW9tYXBfZG1hX2luXzE1MTBfbW9kZSgpICYmIGRtYV9jaGFuW2xjaF0ubmV4dF9sY2ggIT0gLTEpIHsKKwkJaW50IG5leHRfbGNoLCBjdXJfbGNoID0gbGNoOworCQljaGFyIGRtYV9jaGFuX2xpbmtfbWFwW09NQVBfTE9HSUNBTF9ETUFfQ0hfQ09VTlRdOworCisJCW1lbXNldChkbWFfY2hhbl9saW5rX21hcCwgMCwgc2l6ZW9mKGRtYV9jaGFuX2xpbmtfbWFwKSk7CisJCWRvIHsKKwkJCS8qIFRoZSBsb29wIGNhc2U6IHdlJ3ZlIGJlZW4gaGVyZSBhbHJlYWR5ICovCisJCQlpZiAoZG1hX2NoYW5fbGlua19tYXBbY3VyX2xjaF0pCisJCQkJYnJlYWs7CisJCQkvKiBNYXJrIHRoZSBjdXJyZW50IGNoYW5uZWwgKi8KKwkJCWRtYV9jaGFuX2xpbmtfbWFwW2N1cl9sY2hdID0gMTsKKworCQkJZGlzYWJsZV9sbmsoY3VyX2xjaCk7CisKKwkJCW5leHRfbGNoID0gZG1hX2NoYW5bY3VyX2xjaF0ubmV4dF9sY2g7CisJCQljdXJfbGNoID0gbmV4dF9sY2g7CisJCX0gd2hpbGUgKG5leHRfbGNoICE9IC0xKTsKKworCQlyZXR1cm47CisJfQorCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgb24gdGhlIGNoYW5uZWwgKi8KKwlvbWFwX3dyaXRldygwLCBPTUFQX0RNQV9DSUNSKGxjaCkpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpOworCXcgJj0gfk9NQVBfRE1BX0NDUl9FTjsKKwlvbWFwX3dyaXRldyh3LCBPTUFQX0RNQV9DQ1IobGNoKSk7CisJZG1hX2NoYW5bbGNoXS5mbGFncyAmPSB+T01BUF9ETUFfQUNUSVZFOworfQorCit2b2lkIG9tYXBfZW5hYmxlX2RtYV9pcnEoaW50IGxjaCwgdTE2IGJpdHMpCit7CisJZG1hX2NoYW5bbGNoXS5lbmFibGVkX2lycXMgfD0gYml0czsKK30KKwordm9pZCBvbWFwX2Rpc2FibGVfZG1hX2lycShpbnQgbGNoLCB1MTYgYml0cykKK3sKKwlkbWFfY2hhbltsY2hdLmVuYWJsZWRfaXJxcyAmPSB+Yml0czsKK30KKworc3RhdGljIGludCBkbWFfaGFuZGxlX2NoKGludCBjaCkKK3sKKwl1MTYgY3NyOworCisJaWYgKGVuYWJsZV8xNTEwX21vZGUgJiYgY2ggPj0gNikgeworCQljc3IgPSBkbWFfY2hhbltjaF0uc2F2ZWRfY3NyOworCQlkbWFfY2hhbltjaF0uc2F2ZWRfY3NyID0gMDsKKwl9IGVsc2UKKwkJY3NyID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU1IoY2gpKTsKKwlpZiAoZW5hYmxlXzE1MTBfbW9kZSAmJiBjaCA8PSAyICYmIChjc3IgPj4gNykgIT0gMCkgeworCQlkbWFfY2hhbltjaCArIDZdLnNhdmVkX2NzciA9IGNzciA+PiA3OworCQljc3IgJj0gMHg3ZjsKKwl9CisJaWYgKCFjc3IpCisJCXJldHVybiAwOworCWlmICh1bmxpa2VseShkbWFfY2hhbltjaF0uZGV2X2lkID09IC0xKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTcHVyaW91cyBpbnRlcnJ1cHQgZnJvbSBETUEgY2hhbm5lbCAlZCAoQ1NSICUwNHgpXG4iLAorCQkgICAgICAgY2gsIGNzcik7CisJCXJldHVybiAwOworCX0KKwlpZiAodW5saWtlbHkoY3NyICYgT01BUF9ETUFfVE9VVF9JUlEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJETUEgdGltZW91dCB3aXRoIGRldmljZSAlZFxuIiwgZG1hX2NoYW5bY2hdLmRldl9pZCk7CisJaWYgKHVubGlrZWx5KGNzciAmIE9NQVBfRE1BX0RST1BfSVJRKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRE1BIHN5bmNocm9uaXphdGlvbiBldmVudCBkcm9wIG9jY3VycmVkIHdpdGggZGV2aWNlICVkXG4iLAorCQkgICAgICAgZG1hX2NoYW5bY2hdLmRldl9pZCk7CisJaWYgKGxpa2VseShjc3IgJiBPTUFQX0RNQV9CTE9DS19JUlEpKQorCQlkbWFfY2hhbltjaF0uZmxhZ3MgJj0gfk9NQVBfRE1BX0FDVElWRTsKKwlpZiAobGlrZWx5KGRtYV9jaGFuW2NoXS5jYWxsYmFjayAhPSBOVUxMKSkKKwkJZG1hX2NoYW5bY2hdLmNhbGxiYWNrKGNoLCBjc3IsIGRtYV9jaGFuW2NoXS5kYXRhKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlycXJldHVybl90IGRtYV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjaCA9ICgoaW50KSBkZXZfaWQpIC0gMTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWludCBoYW5kbGVkX25vdyA9IDA7CisKKwkJaGFuZGxlZF9ub3cgKz0gZG1hX2hhbmRsZV9jaChjaCk7CisJCWlmIChlbmFibGVfMTUxMF9tb2RlICYmIGRtYV9jaGFuW2NoICsgNl0uc2F2ZWRfY3NyKQorCQkJaGFuZGxlZF9ub3cgKz0gZG1hX2hhbmRsZV9jaChjaCArIDYpOworCQlpZiAoIWhhbmRsZWRfbm93KQorCQkJYnJlYWs7CisJCWhhbmRsZWQgKz0gaGFuZGxlZF9ub3c7CisJfQorCisJcmV0dXJuIGhhbmRsZWQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCitpbnQgb21hcF9yZXF1ZXN0X2RtYShpbnQgZGV2X2lkLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJICAgICB2b2lkICgqIGNhbGxiYWNrKShpbnQgbGNoLCB1MTYgY2hfc3RhdHVzLCB2b2lkICpkYXRhKSwKKwkJICAgICB2b2lkICpkYXRhLCBpbnQgKmRtYV9jaF9vdXQpCit7CisJaW50IGNoLCBmcmVlX2NoID0gLTE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgb21hcF9kbWFfbGNoICpjaGFuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGNoID0gMDsgY2ggPCBkbWFfY2hhbl9jb3VudDsgY2grKykgeworCQlpZiAoZnJlZV9jaCA9PSAtMSAmJiBkbWFfY2hhbltjaF0uZGV2X2lkID09IC0xKSB7CisJCQlmcmVlX2NoID0gY2g7CisJCQlpZiAoZGV2X2lkID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGZyZWVfY2ggPT0gLTEpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljaGFuID0gZG1hX2NoYW4gKyBmcmVlX2NoOworCWNoYW4tPmRldl9pZCA9IGRldl9pZDsKKwljbGVhcl9sY2hfcmVncyhmcmVlX2NoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7CisKKwljaGFuLT5kZXZfaWQgPSBkZXZfaWQ7CisJY2hhbi0+ZGV2X25hbWUgPSBkZXZfbmFtZTsKKwljaGFuLT5jYWxsYmFjayA9IGNhbGxiYWNrOworCWNoYW4tPmRhdGEgPSBkYXRhOworCWNoYW4tPmVuYWJsZWRfaXJxcyA9IE9NQVBfRE1BX1RPVVRfSVJRIHwgT01BUF9ETUFfRFJPUF9JUlEgfCBPTUFQX0RNQV9CTE9DS19JUlE7CisKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJLyogSWYgdGhlIHN5bmMgZGV2aWNlIGlzIHNldCwgY29uZmlndXJlIGl0IGR5bmFtaWNhbGx5LiAqLworCQlpZiAoZGV2X2lkICE9IDApIHsKKwkJCXNldF9nZG1hX2RldihmcmVlX2NoICsgMSwgZGV2X2lkKTsKKwkJCWRldl9pZCA9IGZyZWVfY2ggKyAxOworCQl9CisJCS8qIERpc2FibGUgdGhlIDE1MTAgY29tcGF0aWJpbGl0eSBtb2RlIGFuZCBzZXQgdGhlIHN5bmMgZGV2aWNlCisJCSAqIGlkLiAqLworCQlvbWFwX3dyaXRldyhkZXZfaWQgfCAoMSA8PCAxMCksIE9NQVBfRE1BX0NDUihmcmVlX2NoKSk7CisJfSBlbHNlIHsKKwkJb21hcF93cml0ZXcoZGV2X2lkLCBPTUFQX0RNQV9DQ1IoZnJlZV9jaCkpOworCX0KKwkqZG1hX2NoX291dCA9IGZyZWVfY2g7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbWFwX2ZyZWVfZG1hKGludCBjaCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9jaGFuX2xvY2ssIGZsYWdzKTsKKwlpZiAoZG1hX2NoYW5bY2hdLmRldl9pZCA9PSAtMSkgeworCQlwcmludGsoIm9tYXBfZG1hOiB0cnlpbmcgdG8gZnJlZSBub25hbGxvY2F0ZWQgRE1BIGNoYW5uZWwgJWRcbiIsIGNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hX2NoYW5fbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWRtYV9jaGFuW2NoXS5kZXZfaWQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFfY2hhbl9sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGFsbCBETUEgaW50ZXJydXB0cyBmb3IgdGhlIGNoYW5uZWwuICovCisJb21hcF93cml0ZXcoMCwgT01BUF9ETUFfQ0lDUihjaCkpOworCS8qIE1ha2Ugc3VyZSB0aGUgRE1BIHRyYW5zZmVyIGlzIHN0b3BwZWQuICovCisJb21hcF93cml0ZXcoMCwgT01BUF9ETUFfQ0NSKGNoKSk7Cit9CisKK2ludCBvbWFwX2RtYV9pbl8xNTEwX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gZW5hYmxlXzE1MTBfbW9kZTsKK30KKworLyoKKyAqIGxjaF9xdWV1ZSBETUEgd2lsbCBzdGFydCByaWdodCBhZnRlciBsY2hfaGVhZCBvbmUgaXMgZmluaXNoZWQuCisgKiBGb3IgdGhpcyBETUEgbGluayB0byBzdGFydCwgeW91IHN0aWxsIG5lZWQgdG8gc3RhcnQgKHNlZSBvbWFwX3N0YXJ0X2RtYSkKKyAqIHRoZSBmaXJzdCBvbmUuIFRoYXQgd2lsbCBmaXJlIHVwIHRoZSBlbnRpcmUgcXVldWUuCisgKi8KK3ZvaWQgb21hcF9kbWFfbGlua19sY2ggKGludCBsY2hfaGVhZCwgaW50IGxjaF9xdWV1ZSkKK3sKKwlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJETUEgbGlua2luZyBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJaWYgKChkbWFfY2hhbltsY2hfaGVhZF0uZGV2X2lkID09IC0xKSB8fAorCSAgICAoZG1hX2NoYW5bbGNoX3F1ZXVlXS5kZXZfaWQgPT0gLTEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib21hcF9kbWE6IHRyeWluZyB0byBsaW5rIG5vbiByZXF1ZXN0ZWQgY2hhbm5lbHNcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJfQorCisJZG1hX2NoYW5bbGNoX2hlYWRdLm5leHRfbGNoID0gbGNoX3F1ZXVlOworfQorCisvKgorICogT25jZSB0aGUgRE1BIHF1ZXVlIGlzIHN0b3BwZWQsIHdlIGNhbiBkZXN0cm95IGl0LgorICovCit2b2lkIG9tYXBfZG1hX3VubGlua19sY2ggKGludCBsY2hfaGVhZCwgaW50IGxjaF9xdWV1ZSkKK3sKKwlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJETUEgbGlua2luZyBpcyBub3Qgc3VwcG9ydGVkIGluIDE1MTAgbW9kZVxuIik7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRtYV9jaGFuW2xjaF9oZWFkXS5uZXh0X2xjaCAhPSBsY2hfcXVldWUgfHwKKwkgICAgZG1hX2NoYW5bbGNoX2hlYWRdLm5leHRfbGNoID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAib21hcF9kbWE6IHRyeWluZyB0byB1bmxpbmsgbm9uIGxpbmtlZCBjaGFubmVsc1xuIik7CisJCWR1bXBfc3RhY2soKTsKKwl9CisKKworCWlmICgoZG1hX2NoYW5bbGNoX2hlYWRdLmZsYWdzICYgT01BUF9ETUFfQUNUSVZFKSB8fAorCSAgICAoZG1hX2NoYW5bbGNoX2hlYWRdLmZsYWdzICYgT01BUF9ETUFfQUNUSVZFKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm9tYXBfZG1hOiBZb3UgbmVlZCB0byBzdG9wIHRoZSBETUEgY2hhbm5lbHMgYmVmb3JlIHVubGlua2luZ1xuIik7CisJCWR1bXBfc3RhY2soKTsKKwl9CisKKwlkbWFfY2hhbltsY2hfaGVhZF0ubmV4dF9sY2ggPSAtMTsKK30KKworCitzdGF0aWMgc3RydWN0IGxjZF9kbWFfaW5mbyB7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCByZXNlcnZlZDsKKwl2b2lkICgqIGNhbGxiYWNrKSh1MTYgc3RhdHVzLCB2b2lkICpkYXRhKTsKKwl2b2lkICpjYl9kYXRhOworCisJaW50IGFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHIsIHNpemU7CisJaW50IHJvdGF0ZSwgZGF0YV90eXBlLCB4cmVzLCB5cmVzOworCWludCB2eHJlczsKKwlpbnQgbWlycm9yOworCWludCB4c2NhbGUsIHlzY2FsZTsKKwlpbnQgZXh0X2N0cmw7CisJaW50IHNyY19wb3J0OworCWludCBzaW5nbGVfdHJhbnNmZXI7Cit9IGxjZF9kbWE7CisKK3ZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMSh1bnNpZ25lZCBsb25nIGFkZHIsIHUxNiBmYl94cmVzLCB1MTYgZmJfeXJlcywKKwkJCSBpbnQgZGF0YV90eXBlKQoreworCWxjZF9kbWEuYWRkciA9IGFkZHI7CisJbGNkX2RtYS5kYXRhX3R5cGUgPSBkYXRhX3R5cGU7CisJbGNkX2RtYS54cmVzID0gZmJfeHJlczsKKwlsY2RfZG1hLnlyZXMgPSBmYl95cmVzOworfQorCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfc3JjX3BvcnQoaW50IHBvcnQpCit7CisJbGNkX2RtYS5zcmNfcG9ydCA9IHBvcnQ7Cit9CisKK3ZvaWQgb21hcF9zZXRfbGNkX2RtYV9leHRfY29udHJvbGxlcihpbnQgZXh0ZXJuYWwpCit7CisJbGNkX2RtYS5leHRfY3RybCA9IGV4dGVybmFsOworfQorCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfc2luZ2xlX3RyYW5zZmVyKGludCBzaW5nbGUpCit7CisJbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIgPSBzaW5nbGU7Cit9CisKKwordm9pZCBvbWFwX3NldF9sY2RfZG1hX2IxX3JvdGF0aW9uKGludCByb3RhdGUpCit7CisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BIHJvdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJbGNkX2RtYS5yb3RhdGUgPSByb3RhdGU7Cit9CisKK3ZvaWQgb21hcF9zZXRfbGNkX2RtYV9iMV9taXJyb3IoaW50IG1pcnJvcikKK3sKKwlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJETUEgbWlycm9yIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMTUxMCBtb2RlXG4iKTsKKwkJQlVHKCk7CisJfQorCWxjZF9kbWEubWlycm9yID0gbWlycm9yOworfQorCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfdnhyZXModW5zaWduZWQgbG9uZyB2eHJlcykKK3sKKwlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJETUEgdmlydHVhbCByZXN1bG90aW9uIGlzIG5vdCBzdXBwb3J0ZWQgIgorCQkJCSJpbiAxNTEwIG1vZGVcbiIpOworCQlCVUcoKTsKKwl9CisJbGNkX2RtYS52eHJlcyA9IHZ4cmVzOworfQorCit2b2lkIG9tYXBfc2V0X2xjZF9kbWFfYjFfc2NhbGUodW5zaWduZWQgaW50IHhzY2FsZSwgdW5zaWduZWQgaW50IHlzY2FsZSkKK3sKKwlpZiAob21hcF9kbWFfaW5fMTUxMF9tb2RlKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJETUEgc2NhbGUgaXMgbm90IHN1cHBvcnRlZCBpbiAxNTEwIG1vZGVcbiIpOworCQlCVUcoKTsKKwl9CisJbGNkX2RtYS54c2NhbGUgPSB4c2NhbGU7CisJbGNkX2RtYS55c2NhbGUgPSB5c2NhbGU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9iMV9yZWdzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0b3AsIGJvdHRvbTsKKwlpbnQgZXM7CisJdTE2IHc7CisJdW5zaWduZWQgbG9uZyBlbiwgZm47CisJbG9uZyBlaSwgZmk7CisJdW5zaWduZWQgbG9uZyB2eHJlczsKKwl1bnNpZ25lZCBpbnQgeHNjYWxlLCB5c2NhbGU7CisKKwlzd2l0Y2ggKGxjZF9kbWEuZGF0YV90eXBlKSB7CisJY2FzZSBPTUFQX0RNQV9EQVRBX1RZUEVfUzg6CisJCWVzID0gMTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQX0RNQV9EQVRBX1RZUEVfUzE2OgorCQllcyA9IDI7CisJCWJyZWFrOworCWNhc2UgT01BUF9ETUFfREFUQV9UWVBFX1MzMjoKKwkJZXMgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOworCX0KKworCXZ4cmVzID0gbGNkX2RtYS52eHJlcyA/IGxjZF9kbWEudnhyZXMgOiBsY2RfZG1hLnhyZXM7CisJeHNjYWxlID0gbGNkX2RtYS54c2NhbGUgPyBsY2RfZG1hLnhzY2FsZSA6IDE7CisJeXNjYWxlID0gbGNkX2RtYS55c2NhbGUgPyBsY2RfZG1hLnlzY2FsZSA6IDE7CisJQlVHX09OKHZ4cmVzIDwgbGNkX2RtYS54cmVzKTsKKyNkZWZpbmUgUElYQUREUih4LHkpIChsY2RfZG1hLmFkZHIgKyAoKHkpICogdnhyZXMgKiB5c2NhbGUgKyAoeCkgKiB4c2NhbGUpICogZXMpCisjZGVmaW5lIFBJWFNURVAoc3gsIHN5LCBkeCwgZHkpIChQSVhBRERSKGR4LCBkeSkgLSBQSVhBRERSKHN4LCBzeSkgLSBlcyArIDEpCisJc3dpdGNoIChsY2RfZG1hLnJvdGF0ZSkgeworCWNhc2UgMDoKKwkJaWYgKCFsY2RfZG1hLm1pcnJvcikgeworCQkJdG9wID0gUElYQUREUigwLCAwKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQkvKiAxNTEwIERNQSByZXF1aXJlcyB0aGUgYm90dG9tIGFkZHJlc3MgdG8gYmUgMiBtb3JlCisJCQkgKiB0aGFuIHRoZSBhY3R1YWwgbGFzdCBtZW1vcnkgYWNjZXNzIGxvY2F0aW9uLiAqLworCQkJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpICYmCisJCQkgICAgbGNkX2RtYS5kYXRhX3R5cGUgPT0gT01BUF9ETUFfREFUQV9UWVBFX1MzMikKKwkJCQlib3R0b20gKz0gMjsKKwkJCWVpID0gUElYU1RFUCgwLCAwLCAxLCAwKTsKKwkJCWZpID0gUElYU1RFUChsY2RfZG1hLnhyZXMgLSAxLCAwLCAwLCAxKTsKKwkJfSBlbHNlIHsKKwkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgMCk7CisJCQlib3R0b20gPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJZWkgPSBQSVhTVEVQKDEsIDAsIDAsIDApOworCQkJZmkgPSBQSVhTVEVQKDAsIDAsIGxjZF9kbWEueHJlcyAtIDEsIDEpOworCQl9CisJCWVuID0gbGNkX2RtYS54cmVzOworCQlmbiA9IGxjZF9kbWEueXJlczsKKwkJYnJlYWs7CisJY2FzZSA5MDoKKwkJaWYgKCFsY2RfZG1hLm1pcnJvcikgeworCQkJdG9wID0gUElYQUREUigwLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgMCk7CisJCQllaSA9IFBJWFNURVAoMCwgMSwgMCwgMCk7CisJCQlmaSA9IFBJWFNURVAoMCwgMCwgMSwgbGNkX2RtYS55cmVzIC0gMSk7CisJCX0gZWxzZSB7CisJCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJYm90dG9tID0gUElYQUREUigwLCAwKTsKKwkJCWVpID0gUElYU1RFUCgwLCAxLCAwLCAwKTsKKwkJCWZpID0gUElYU1RFUCgxLCAwLCAwLCBsY2RfZG1hLnlyZXMgLSAxKTsKKwkJfQorCQllbiA9IGxjZF9kbWEueXJlczsKKwkJZm4gPSBsY2RfZG1hLnhyZXM7CisJCWJyZWFrOworCWNhc2UgMTgwOgorCQlpZiAoIWxjZF9kbWEubWlycm9yKSB7CisJCQl0b3AgPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJYm90dG9tID0gUElYQUREUigwLCAwKTsKKwkJCWVpID0gUElYU1RFUCgxLCAwLCAwLCAwKTsKKwkJCWZpID0gUElYU1RFUCgwLCAxLCBsY2RfZG1hLnhyZXMgLSAxLCAwKTsKKwkJfSBlbHNlIHsKKwkJCXRvcCA9IFBJWEFERFIoMCwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQlib3R0b20gPSBQSVhBRERSKGxjZF9kbWEueHJlcyAtIDEsIDApOworCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDEsIDApOworCQkJZmkgPSBQSVhTVEVQKGxjZF9kbWEueHJlcyAtIDEsIDEsIDAsIDApOworCQl9CisJCWVuID0gbGNkX2RtYS54cmVzOworCQlmbiA9IGxjZF9kbWEueXJlczsKKwkJYnJlYWs7CisJY2FzZSAyNzA6CisJCWlmICghbGNkX2RtYS5taXJyb3IpIHsKKwkJCXRvcCA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgMCk7CisJCQlib3R0b20gPSBQSVhBRERSKDAsIGxjZF9kbWEueXJlcyAtIDEpOworCQkJZWkgPSBQSVhTVEVQKDAsIDAsIDAsIDEpOworCQkJZmkgPSBQSVhTVEVQKDEsIGxjZF9kbWEueXJlcyAtIDEsIDAsIDApOworCQl9IGVsc2UgeworCQkJdG9wID0gUElYQUREUigwLCAwKTsKKwkJCWJvdHRvbSA9IFBJWEFERFIobGNkX2RtYS54cmVzIC0gMSwgbGNkX2RtYS55cmVzIC0gMSk7CisJCQllaSA9IFBJWFNURVAoMCwgMCwgMCwgMSk7CisJCQlmaSA9IFBJWFNURVAoMCwgbGNkX2RtYS55cmVzIC0gMSwgMSwgMCk7CisJCX0KKwkJZW4gPSBsY2RfZG1hLnlyZXM7CisJCWZuID0gbGNkX2RtYS54cmVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuOwkvKiBTdXByZXNzIHdhcm5pbmcgYWJvdXQgdW5pbml0aWFsaXplZCB2YXJzICovCisJfQorCisJaWYgKG9tYXBfZG1hX2luXzE1MTBfbW9kZSgpKSB7CisJCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfVSk7CisJCW9tYXBfd3JpdGV3KHRvcCwgT01BUDE1MTBfRE1BX0xDRF9UT1BfRjFfTCk7CisJCW9tYXBfd3JpdGV3KGJvdHRvbSA+PiAxNiwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfVSk7CisJCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE1MTBfRE1BX0xDRF9CT1RfRjFfTCk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIDE2MTAgcmVncyAqLworCW9tYXBfd3JpdGV3KHRvcCA+PiAxNiwgT01BUDE2MTBfRE1BX0xDRF9UT1BfQjFfVSk7CisJb21hcF93cml0ZXcodG9wLCBPTUFQMTYxMF9ETUFfTENEX1RPUF9CMV9MKTsKKwlvbWFwX3dyaXRldyhib3R0b20gPj4gMTYsIE9NQVAxNjEwX0RNQV9MQ0RfQk9UX0IxX1UpOworCW9tYXBfd3JpdGV3KGJvdHRvbSwgT01BUDE2MTBfRE1BX0xDRF9CT1RfQjFfTCk7CisKKwlvbWFwX3dyaXRldyhlbiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRU5fQjEpOworCW9tYXBfd3JpdGV3KGZuLCBPTUFQMTYxMF9ETUFfTENEX1NSQ19GTl9CMSk7CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NTRFApOworCXcgJj0gfjB4MDM7CisJdyB8PSBsY2RfZG1hLmRhdGFfdHlwZTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NTRFApOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwkvKiBBbHdheXMgc2V0IHRoZSBzb3VyY2UgcG9ydCBhcyBTRFJBTSBmb3Igbm93Ki8KKwl3ICY9IH4oMHgwMyA8PCA2KTsKKwlpZiAobGNkX2RtYS5jYWxsYmFjayAhPSBOVUxMKQorCQl3IHw9IDEgPDwgMTsgICAgICAgICAgICAvKiBCbG9jayBpbnRlcnJ1cHQgZW5hYmxlICovCisJZWxzZQorCQl3ICY9IH4oMSA8PCAxKTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworCisJaWYgKCEobGNkX2RtYS5yb3RhdGUgfHwgbGNkX2RtYS5taXJyb3IgfHwKKwkgICAgICBsY2RfZG1hLnZ4cmVzIHx8IGxjZF9kbWEueHNjYWxlIHx8IGxjZF9kbWEueXNjYWxlKSkKKwkJcmV0dXJuOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCS8qIFNldCB0aGUgZG91YmxlLWluZGV4ZWQgYWRkcmVzc2luZyBtb2RlICovCisJdyB8PSAoMHgwMyA8PCAxMik7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCisJb21hcF93cml0ZXcoZWksIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0VJX0IxKTsKKwlvbWFwX3dyaXRldyhmaSA+PiAxNiwgT01BUDE2MTBfRE1BX0xDRF9TUkNfRklfQjFfVSk7CisJb21hcF93cml0ZXcoZmksIE9NQVAxNjEwX0RNQV9MQ0RfU1JDX0ZJX0IxX0wpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbGNkX2RtYV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUxNiB3OworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwlpZiAodW5saWtlbHkoISh3ICYgKDEgPDwgMykpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTcHVyaW91cyBMQ0QgRE1BIElSUVxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisJLyogQWNrIHRoZSBJUlEgKi8KKwl3IHw9ICgxIDw8IDMpOworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CisJbGNkX2RtYS5hY3RpdmUgPSAwOworCWlmIChsY2RfZG1hLmNhbGxiYWNrICE9IE5VTEwpCisJCWxjZF9kbWEuY2FsbGJhY2sodywgbGNkX2RtYS5jYl9kYXRhKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IG9tYXBfcmVxdWVzdF9sY2RfZG1hKHZvaWQgKCogY2FsbGJhY2spKHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpLAorCQkJIHZvaWQgKmRhdGEpCit7CisJc3Bpbl9sb2NrX2lycSgmbGNkX2RtYS5sb2NrKTsKKwlpZiAobGNkX2RtYS5yZXNlcnZlZCkgeworCQlzcGluX3VubG9ja19pcnEoJmxjZF9kbWEubG9jayk7CisJCXByaW50ayhLRVJOX0VSUiAiTENEIERNQSBjaGFubmVsIGFscmVhZHkgcmVzZXJ2ZWRcbiIpOworCQlCVUcoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJbGNkX2RtYS5yZXNlcnZlZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZsY2RfZG1hLmxvY2spOworCWxjZF9kbWEuY2FsbGJhY2sgPSBjYWxsYmFjazsKKwlsY2RfZG1hLmNiX2RhdGEgPSBkYXRhOworCWxjZF9kbWEuYWN0aXZlID0gMDsKKwlsY2RfZG1hLnNpbmdsZV90cmFuc2ZlciA9IDA7CisJbGNkX2RtYS5yb3RhdGUgPSAwOworCWxjZF9kbWEudnhyZXMgPSAwOworCWxjZF9kbWEubWlycm9yID0gMDsKKwlsY2RfZG1hLnhzY2FsZSA9IDA7CisJbGNkX2RtYS55c2NhbGUgPSAwOworCWxjZF9kbWEuZXh0X2N0cmwgPSAwOworCWxjZF9kbWEuc3JjX3BvcnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21hcF9mcmVlX2xjZF9kbWEodm9pZCkKK3sKKwlzcGluX2xvY2soJmxjZF9kbWEubG9jayk7CisJaWYgKCFsY2RfZG1hLnJlc2VydmVkKSB7CisJCXNwaW5fdW5sb2NrKCZsY2RfZG1hLmxvY2spOworCQlwcmludGsoS0VSTl9FUlIgIkxDRCBETUEgaXMgbm90IHJlc2VydmVkXG4iKTsKKwkJQlVHKCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFlbmFibGVfMTUxMF9tb2RlKQorCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKSAmIH4xLCBPTUFQMTYxMF9ETUFfTENEX0NDUik7CisJbGNkX2RtYS5yZXNlcnZlZCA9IDA7CisJc3Bpbl91bmxvY2soJmxjZF9kbWEubG9jayk7Cit9CisKK3ZvaWQgb21hcF9lbmFibGVfbGNkX2RtYSh2b2lkKQoreworCXUxNiB3OworCisJLyogU2V0IHRoZSBFbmFibGUgYml0IG9ubHkgaWYgYW4gZXh0ZXJuYWwgY29udHJvbGxlciBpcworCSAqIGNvbm5lY3RlZC4gT3RoZXJ3aXNlIHRoZSBPTUFQIGludGVybmFsIGNvbnRyb2xsZXIgd2lsbAorCSAqIHN0YXJ0IHRoZSB0cmFuc2ZlciB3aGVuIGl0IGdldHMgZW5hYmxlZC4KKwkgKi8KKwlpZiAoZW5hYmxlXzE1MTBfbW9kZSB8fCAhbGNkX2RtYS5leHRfY3RybCkKKwkJcmV0dXJuOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwl3IHw9IDEgPDwgODsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCXcgfD0gMSA8PCA3OworCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKworCWxjZF9kbWEuYWN0aXZlID0gMTsKK30KKwordm9pZCBvbWFwX3NldHVwX2xjZF9kbWEodm9pZCkKK3sKKwlCVUdfT04obGNkX2RtYS5hY3RpdmUpOworCWlmICghZW5hYmxlXzE1MTBfbW9kZSkgeworCQkvKiBTZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzICovCisJCW9tYXBfd3JpdGV3KDB4NTQ0MCwgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCQlvbWFwX3dyaXRldygweDkxMDIsIE9NQVAxNjEwX0RNQV9MQ0RfQ1NEUCk7CisJCW9tYXBfd3JpdGV3KDB4MDAwNCwgT01BUDE2MTBfRE1BX0xDRF9MQ0hfQ1RSTCk7CisJfQorCXNldF9iMV9yZWdzKCk7CisJaWYgKCFlbmFibGVfMTUxMF9tb2RlKSB7CisJCXUxNiB3OworCisJCXcgPSBvbWFwX3JlYWR3KE9NQVAxNjEwX0RNQV9MQ0RfQ0NSKTsKKwkJLyogSWYgRE1BIHdhcyBhbHJlYWR5IGFjdGl2ZSBzZXQgdGhlIGVuZF9wcm9nIGJpdCB0byBoYXZlCisJCSAqIHRoZSBwcm9ncmFtbWVkIHJlZ2lzdGVyIHNldCBsb2FkZWQgaW50byB0aGUgYWN0aXZlCisJCSAqIHJlZ2lzdGVyIHNldC4KKwkJICovCisJCXcgfD0gMSA8PCAxMTsJCS8qIEVuZF9wcm9nICovCisJCWlmICghbGNkX2RtYS5zaW5nbGVfdHJhbnNmZXIpCisJICAgICAgICAJdyB8PSAoMyA8PCA4KTsJLyogQXV0b19pbml0LCByZXBlYXQgKi8KKwkJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCX0KK30KKwordm9pZCBvbWFwX3N0b3BfbGNkX2RtYSh2b2lkKQoreworCXUxNiB3OworCisJbGNkX2RtYS5hY3RpdmUgPSAwOworCWlmIChlbmFibGVfMTUxMF9tb2RlIHx8ICFsY2RfZG1hLmV4dF9jdHJsKQorCQlyZXR1cm47CisKKwl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CisJdyAmPSB+KDEgPDwgNyk7CisJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOworCisJdyA9IG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DVFJMKTsKKwl3ICY9IH4oMSA8PCA4KTsKKwlvbWFwX3dyaXRldyh3LCBPTUFQMTYxMF9ETUFfTENEX0NUUkwpOworfQorCisvKgorICogQ2xlYXJzIGFueSBETUEgc3RhdGUgc28gdGhlIERNQSBlbmdpbmUgaXMgcmVhZHkgdG8gcmVzdGFydCB3aXRoIG5ldyBidWZmZXJzCisgKiB0aHJvdWdoIG9tYXBfc3RhcnRfZG1hKCkuIEFueSBidWZmZXJzIGluIGZsaWdodCBhcmUgZGlzY2FyZGVkLgorICovCit2b2lkIG9tYXBfY2xlYXJfZG1hKGludCBsY2gpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoT01BUF9ETUFfQ0NSKGxjaCkpICYgfk9NQVBfRE1BX0NDUl9FTiwKKwkJICAgIE9NQVBfRE1BX0NDUihsY2gpKTsKKwlzdGF0dXMgPSBPTUFQX0RNQV9DU1IobGNoKTsJLyogY2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gRE1BIGNoYW5uZWwuCisgKiBJZiB0aGUgY2hhbm5lbCBpcyBydW5uaW5nIHRoZSBjYWxsZXIgbXVzdCBkaXNhYmxlIGludGVycnVwdHMgcHJpb3IgY2FsbGluZworICogdGhpcyBmdW5jdGlvbiBhbmQgcHJvY2VzcyB0aGUgcmV0dXJuZWQgdmFsdWUgYmVmb3JlIHJlLWVuYWJsaW5nIGludGVycnVwdCB0bworICogcHJldmVudCByYWNlcyB3aXRoIHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4gTm90ZSB0aGF0IGluIGNvbnRpbnVvdXMgbW9kZSB0aGVyZQorICogaXMgYSBjaGFuY2UgZm9yIENTU0FfTCByZWdpc3RlciBvdmVyZmxvdyBpbmJldHdlZW4gdGhlIHR3byByZWFkcyByZXN1bHRpbmcKKyAqIGluIGluY29ycmVjdCByZXR1cm4gdmFsdWUuCisgKi8KK2RtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCkKK3sKKwlyZXR1cm4gKGRtYV9hZGRyX3QpIChPTUFQX0RNQV9DU1NBX0wobGNoKSB8CisJCQkgICAgIChPTUFQX0RNQV9DU1NBX1UobGNoKSA8PCAxNikpOworfQorCisvKgorICogUmV0dXJucyBjdXJyZW50IHBoeXNpY2FsIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBETUEgY2hhbm5lbC4KKyAqIElmIHRoZSBjaGFubmVsIGlzIHJ1bm5pbmcgdGhlIGNhbGxlciBtdXN0IGRpc2FibGUgaW50ZXJydXB0cyBwcmlvciBjYWxsaW5nCisgKiB0aGlzIGZ1bmN0aW9uIGFuZCBwcm9jZXNzIHRoZSByZXR1cm5lZCB2YWx1ZSBiZWZvcmUgcmUtZW5hYmxpbmcgaW50ZXJydXB0IHRvCisgKiBwcmV2ZW50IHJhY2VzIHdpdGggdGhlIGludGVycnVwdCBoYW5kbGVyLiBOb3RlIHRoYXQgaW4gY29udGludW91cyBtb2RlIHRoZXJlCisgKiBpcyBhIGNoYW5jZSBmb3IgQ0RTQV9MIHJlZ2lzdGVyIG92ZXJmbG93IGluYmV0d2VlbiB0aGUgdHdvIHJlYWRzIHJlc3VsdGluZworICogaW4gaW5jb3JyZWN0IHJldHVybiB2YWx1ZS4KKyAqLworZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKQoreworCXJldHVybiAoZG1hX2FkZHJfdCkgKE9NQVBfRE1BX0NEU0FfTChsY2gpIHwKKwkJCSAgICAgKE9NQVBfRE1BX0NEU0FfVShsY2gpIDw8IDE2KSk7Cit9CisKK2ludCBvbWFwX2RtYV9ydW5uaW5nKHZvaWQpCit7CisJaW50IGxjaDsKKworCS8qIENoZWNrIGlmIExDRCBETUEgaXMgcnVubmluZyAqLworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJaWYgKG9tYXBfcmVhZHcoT01BUDE2MTBfRE1BX0xDRF9DQ1IpICYgT01BUF9ETUFfQ0NSX0VOKQorCQkJcmV0dXJuIDE7CisKKwlmb3IgKGxjaCA9IDA7IGxjaCA8IGRtYV9jaGFuX2NvdW50OyBsY2grKykgeworCQl1MTYgdzsKKworCQl3ID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DQ1IobGNoKSk7CisJCWlmICh3ICYgT01BUF9ETUFfQ0NSX0VOKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX2luaXRfZG1hKHZvaWQpCit7CisJaW50IGNoLCByOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkRNQSBzdXBwb3J0IGZvciBPTUFQMTUxMCBpbml0aWFsaXplZFxuIik7CisJCWRtYV9jaGFuX2NvdW50ID0gOTsKKwkJZW5hYmxlXzE1MTBfbW9kZSA9IDE7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSB8fCBjcHVfaXNfb21hcDczMCgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk9NQVAgRE1BIGhhcmR3YXJlIHZlcnNpb24gJWRcbiIsCisJCSAgICAgICBvbWFwX3JlYWR3KE9NQVBfRE1BX0hXX0lEKSk7CisJCXByaW50ayhLRVJOX0lORk8gIkRNQSBjYXBhYmlsaXRpZXM6ICUwOHg6JTA4eDolMDR4OiUwNHg6JTA0eFxuIiwKKwkJICAgICAgIChvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMF9VKSA8PCAxNikgfCBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMF9MKSwKKwkJICAgICAgIChvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMV9VKSA8PCAxNikgfCBvbWFwX3JlYWR3KE9NQVBfRE1BX0NBUFNfMV9MKSwKKwkJICAgICAgIG9tYXBfcmVhZHcoT01BUF9ETUFfQ0FQU18yKSwgb21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzMpLAorCQkgICAgICAgb21hcF9yZWFkdyhPTUFQX0RNQV9DQVBTXzQpKTsKKwkJaWYgKCFlbmFibGVfMTUxMF9tb2RlKSB7CisJCQl1MTYgdzsKKworCQkJLyogRGlzYWJsZSBPTUFQIDMuMC8zLjEgY29tcGF0aWJpbGl0eSBtb2RlLiAqLworCQkJdyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfR1NDUik7CisJCQl3IHw9IDEgPDwgMzsKKwkJCW9tYXBfd3JpdGV3KHcsIE9NQVBfRE1BX0dTQ1IpOworCQkJZG1hX2NoYW5fY291bnQgPSAxNjsKKwkJfSBlbHNlCisJCQlkbWFfY2hhbl9jb3VudCA9IDk7CisJfSBlbHNlIHsKKwkJZG1hX2NoYW5fY291bnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoJmxjZF9kbWEsIDAsIHNpemVvZihsY2RfZG1hKSk7CisJc3Bpbl9sb2NrX2luaXQoJmxjZF9kbWEubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRtYV9jaGFuX2xvY2spOworCW1lbXNldCgmZG1hX2NoYW4sIDAsIHNpemVvZihkbWFfY2hhbikpOworCisJZm9yIChjaCA9IDA7IGNoIDwgZG1hX2NoYW5fY291bnQ7IGNoKyspIHsKKwkJZG1hX2NoYW5bY2hdLmRldl9pZCA9IC0xOworCQlkbWFfY2hhbltjaF0ubmV4dF9sY2ggPSAtMTsKKworCQlpZiAoY2ggPj0gNiAmJiBlbmFibGVfMTUxMF9tb2RlKQorCQkJY29udGludWU7CisKKwkJLyogcmVxdWVzdF9pcnEoKSBkb2Vzbid0IGxpa2UgZGV2X2lkIChpZS4gY2gpIGJlaW5nIHplcm8sCisJCSAqIHNvIHdlIGhhdmUgdG8ga2x1ZGdlIGFyb3VuZCB0aGlzLiAqLworCQlyID0gcmVxdWVzdF9pcnEoZG1hX2lycVtjaF0sIGRtYV9pcnFfaGFuZGxlciwgMCwgIkRNQSIsCisJCQkJKHZvaWQgKikgKGNoICsgMSkpOworCQlpZiAociAhPSAwKSB7CisJCQlpbnQgaTsKKworCQkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgJWQgZm9yIERNQSAoZXJyb3IgJWQpXG4iLAorCQkJICAgICAgIGRtYV9pcnFbY2hdLCByKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjaDsgaSsrKQorCQkJCWZyZWVfaXJxKGRtYV9pcnFbaV0sICh2b2lkICopIChpICsgMSkpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9CisJciA9IHJlcXVlc3RfaXJxKElOVF9ETUFfTENELCBsY2RfZG1hX2lycV9oYW5kbGVyLCAwLCAiTENEIERNQSIsIE5VTEwpOworCWlmIChyICE9IDApIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVxdWVzdCBJUlEgZm9yIExDRCBETUEgKGVycm9yICVkKVxuIiwgcik7CisJCWZvciAoaSA9IDA7IGkgPCBkbWFfY2hhbl9jb3VudDsgaSsrKQorCQkJZnJlZV9pcnEoZG1hX2lycVtpXSwgKHZvaWQgKikgKGkgKyAxKSk7CisJCXJldHVybiByOworCX0KKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChvbWFwX2luaXRfZG1hKTsKKworCitFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X2RtYV9zcmNfcG9zKTsKK0VYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX2RzdF9wb3MpOworRVhQT1JUX1NZTUJPTChvbWFwX2NsZWFyX2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9wcmlvcml0eSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfcmVxdWVzdF9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfZG1hKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zdGFydF9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX3N0b3BfZG1hKTsKK0VYUE9SVF9TWU1CT0wob21hcF9lbmFibGVfZG1hX2lycSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfZGlzYWJsZV9kbWFfaXJxKTsKKworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX2NvbG9yX21vZGUpOworCitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19pbmRleCk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9zcmNfZGF0YV9wYWNrKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZG1hX3NyY19idXJzdF9tb2RlKTsKKworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXMpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9kbWFfZGVzdF9pbmRleCk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X2RhdGFfcGFjayk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUpOworCitFWFBPUlRfU1lNQk9MKG9tYXBfZG1hX2xpbmtfbGNoKTsKK0VYUE9SVF9TWU1CT0wob21hcF9kbWFfdW5saW5rX2xjaCk7CisKK0VYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2xjZF9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfbGNkX2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfZW5hYmxlX2xjZF9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldHVwX2xjZF9kbWEpOworRVhQT1JUX1NZTUJPTChvbWFwX3N0b3BfbGNkX2RtYSk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjEpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX3NpbmdsZV90cmFuc2Zlcik7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfZXh0X2NvbnRyb2xsZXIpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX3JvdGF0aW9uKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfbGNkX2RtYV9iMV92eHJlcyk7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2xjZF9kbWFfYjFfc2NhbGUpOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9sY2RfZG1hX2IxX21pcnJvcik7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODViNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCkBAIC0wLDAgKzEsNzYyIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKKyAqCisgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgT01BUCBHUElPCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIE5va2lhIENvcnBvcmF0aW9uCisgKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKgorICogT01BUDE1MTAgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCTB4ZmZmY2UwMDAKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX0lOUFVUCTB4MDAKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVAkweDA0CisjZGVmaW5lIE9NQVAxNTEwX0dQSU9fRElSX0NPTlRST0wJMHgwOAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9DT05UUk9MCTB4MGMKKyNkZWZpbmUgT01BUDE1MTBfR1BJT19JTlRfTUFTSwkJMHgxMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0lOVF9TVEFUVVMJMHgxNAorI2RlZmluZSBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MCTB4MTgKKworI2RlZmluZSBPTUFQMTUxMF9JSF9HUElPX0JBU0UJCTY0CisKKy8qCisgKiBPTUFQMTYxMCBzcGVjaWZpYyBHUElPIHJlZ2lzdGVycworICovCisjZGVmaW5lIE9NQVAxNjEwX0dQSU8xX0JBU0UJCTB4ZmZmYmU0MDAKKyNkZWZpbmUgT01BUDE2MTBfR1BJTzJfQkFTRQkJMHhmZmZiZWMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPM19CQVNFCQkweGZmZmJiNDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU80X0JBU0UJCTB4ZmZmYmJjMDAKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19SRVZJU0lPTgkJMHgwMDAwCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU1lTQ09ORklHCQkweDAwMTAKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TWVNTVEFUVVMJCTB4MDAxNAorI2RlZmluZSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEJMHgwMDE4CisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRRU5BQkxFMQkweDAwMWMKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBSU4JCTB4MDAyYworI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFPVVQJCTB4MDAzMAorI2RlZmluZSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTgkJMHgwMDM0CisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMQkweDAwMzgKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwyCTB4MDAzYworI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTEJMHgwMDljCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfREFUQU9VVAkweDAwYjAKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfSVJRRU5BQkxFMQkweDAwZGMKKyNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfREFUQU9VVAkweDAwZjAKKworLyoKKyAqIE9NQVA3MzAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCTB4ZmZmYmMwMDAKKyNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkweGZmZmJjODAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJMHhmZmZiZDAwMAorI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCTB4ZmZmYmQ4MDAKKyNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkweGZmZmJlMDAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJMHhmZmZiZTgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAorI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOAorI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX0NPTlRST0wJMHgwYworI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX01BU0sJCTB4MTAKKyNkZWZpbmUgT01BUDczMF9HUElPX0lOVF9TVEFUVVMJCTB4MTQKKworI2RlZmluZSBPTUFQX01QVUlPX01BU0sJCSh+T01BUF9NQVhfR1BJT19MSU5FUyAmIDB4ZmYpCisKK3N0cnVjdCBncGlvX2JhbmsgeworCXUzMiBiYXNlOworCXUxNiBpcnE7CisJdTE2IHZpcnR1YWxfaXJxX3N0YXJ0OworCXU4IG1ldGhvZDsKKwl1MzIgcmVzZXJ2ZWRfbWFwOworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKyNkZWZpbmUgTUVUSE9EX01QVUlPCQkwCisjZGVmaW5lIE1FVEhPRF9HUElPXzE1MTAJMQorI2RlZmluZSBNRVRIT0RfR1BJT18xNjEwCTIKKyNkZWZpbmUgTUVUSE9EX0dQSU9fNzMwCQkzCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7CisJeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKKwl7IE9NQVAxNjEwX0dQSU8xX0JBU0UsIElOVF9HUElPX0JBTksxLAkgICAgSUhfR1BJT19CQVNFLCAgICAgIE1FVEhPRF9HUElPXzE2MTAgfSwKKwl7IE9NQVAxNjEwX0dQSU8yX0JBU0UsIElOVF8xNjEwX0dQSU9fQkFOSzIsIElIX0dQSU9fQkFTRSArIDE2LCBNRVRIT0RfR1BJT18xNjEwIH0sCisJeyBPTUFQMTYxMF9HUElPM19CQVNFLCBJTlRfMTYxMF9HUElPX0JBTkszLCBJSF9HUElPX0JBU0UgKyAzMiwgTUVUSE9EX0dQSU9fMTYxMCB9LAorCXsgT01BUDE2MTBfR1BJTzRfQkFTRSwgSU5UXzE2MTBfR1BJT19CQU5LNCwgSUhfR1BJT19CQVNFICsgNDgsIE1FVEhPRF9HUElPXzE2MTAgfSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMTUxMFsyXSA9IHsKKwl7IE9NQVBfTVBVSU9fQkFTRSwgICAgSU5UX01QVUlPLCAgICAgIElIX01QVUlPX0JBU0UsIE1FVEhPRF9NUFVJTyB9LAorCXsgT01BUDE1MTBfR1BJT19CQVNFLCBJTlRfR1BJT19CQU5LMSwgSUhfR1BJT19CQVNFLCAgTUVUSE9EX0dQSU9fMTUxMCB9Cit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfNzMwWzddID0geworCXsgT01BUF9NUFVJT19CQVNFLCAgICAgSU5UXzczMF9NUFVJTywJICAgIElIX01QVUlPX0JBU0UsCU1FVEhPRF9NUFVJTyB9LAorCXsgT01BUDczMF9HUElPMV9CQVNFLCAgSU5UXzczMF9HUElPX0JBTksxLCAgSUhfR1BJT19CQVNFLAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzJfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMiwgIElIX0dQSU9fQkFTRSArIDMyLAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzNfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LMywgIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzRfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNCwgIElIX0dQSU9fQkFTRSArIDk2LAlNRVRIT0RfR1BJT183MzAgfSwKKwl7IE9NQVA3MzBfR1BJTzVfQkFTRSwgIElOVF83MzBfR1BJT19CQU5LNSwgIElIX0dQSU9fQkFTRSArIDEyOCwgTUVUSE9EX0dQSU9fNzMwIH0sCisJeyBPTUFQNzMwX0dQSU82X0JBU0UsICBJTlRfNzMwX0dQSU9fQkFOSzYsICBJSF9HUElPX0JBU0UgKyAxNjAsIE1FVEhPRF9HUElPXzczMCB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayAqZ3Bpb19iYW5rOworc3RhdGljIGludCBncGlvX2JhbmtfY291bnQ7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fYmFuayAqZ2V0X2dwaW9fYmFuayhpbnQgZ3BpbykKK3sKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlpZiAoT01BUF9HUElPX0lTX01QVUlPKGdwaW8pKQorCQkJcmV0dXJuICZncGlvX2JhbmtbMF07CisJCXJldHVybiAmZ3Bpb19iYW5rWzFdOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpCisJCQlyZXR1cm4gJmdwaW9fYmFua1swXTsKKwkJcmV0dXJuICZncGlvX2JhbmtbMSArIChncGlvID4+IDQpXTsKKwl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJaWYgKE9NQVBfR1BJT19JU19NUFVJTyhncGlvKSkKKwkJCXJldHVybiAmZ3Bpb19iYW5rWzBdOworCQlyZXR1cm4gJmdwaW9fYmFua1sxICsgKGdwaW8gPj4gNSldOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfZ3Bpb19pbmRleChpbnQgZ3BpbykKK3sKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJcmV0dXJuIGdwaW8gJiAweDFmOworCWVsc2UKKwkJcmV0dXJuIGdwaW8gJiAweDBmOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQoreworCWlmIChncGlvIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChPTUFQX0dQSU9fSVNfTVBVSU8oZ3BpbykpIHsKKwkJaWYgKChncGlvICYgT01BUF9NUFVJT19NQVNLKSA+IDE2KQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKKwl9CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgJiYgZ3BpbyA8IDE2KQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKChjcHVfaXNfb21hcDE2eHgoKSkgJiYgZ3BpbyA8IDY0KQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoY3B1X2lzX29tYXA3MzAoKSAmJiBncGlvIDwgMTkyKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBjaGVja19ncGlvKGludCBncGlvKQoreworCWlmICh1bmxpa2VseShncGlvX3ZhbGlkKGdwaW8pKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJvbWFwLWdwaW86IGludmFsaWQgR1BJTyAlZFxuIiwgZ3Bpbyk7CisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX3NldF9ncGlvX2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGlzX2lucHV0KQoreworCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXUzMiBsOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJcmVnICs9IE9NQVBfTVBVSU9fSU9fQ05UTDsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19ESVJfQ09OVFJPTDsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCQlyZWcgKz0gT01BUDE2MTBfR1BJT19ESVJFQ1RJT047CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgorCQlyZWcgKz0gT01BUDczMF9HUElPX0RJUl9DT05UUk9MOworCQlicmVhazsKKwl9CisJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJaWYgKGlzX2lucHV0KQorCQlsIHw9IDEgPDwgZ3BpbzsKKwllbHNlCisJCWwgJj0gfigxIDw8IGdwaW8pOworCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCit2b2lkIG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKGludCBncGlvLCBpbnQgaXNfaW5wdXQpCit7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuOworCWJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOworCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CisJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgaXNfaW5wdXQpOworCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX3NldF9ncGlvX2RhdGFvdXQoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlbmFibGUpCit7CisJdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdTMyIGwgPSAwOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJcmVnICs9IE9NQVBfTVBVSU9fT1VUUFVUOworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWwgfD0gMSA8PCBncGlvOworCQllbHNlCisJCQlsICY9IH4oMSA8PCBncGlvKTsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19EQVRBX09VVFBVVDsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsIHw9IDEgPDwgZ3BpbzsKKwkJZWxzZQorCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9EQVRBT1VUOworCQllbHNlCisJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9EQVRBT1VUOworCQlsID0gMSA8PCBncGlvOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX09VVFBVVDsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsIHw9IDEgPDwgZ3BpbzsKKwkJZWxzZQorCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCit2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm47CisJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwlfc2V0X2dwaW9fZGF0YW91dChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgZW5hYmxlKTsKKwlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cit9CisKK2ludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3BpbykKK3sKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCXUzMiByZWc7CisKKwlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCisJCXJldHVybiAtMTsKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlyZWcgPSBiYW5rLT5iYXNlOworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfTVBVSU86CisJCXJlZyArPSBPTUFQX01QVUlPX0lOUFVUX0xBVENIOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzE1MTA6CisJCXJlZyArPSBPTUFQMTUxMF9HUElPX0RBVEFfSU5QVVQ7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwkJcmVnICs9IE9NQVAxNjEwX0dQSU9fREFUQUlOOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19EQVRBX0lOUFVUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9zZXRfZ3Bpb19lZGdlX2N0cmwoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8sIGludCBlZGdlKQoreworCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXUzMiBsOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRTsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJCWwgfD0gMSA8PCBncGlvOworCQllbHNlCisJCQlsICY9IH4oMSA8PCBncGlvKTsKKwkJX19yYXdfd3JpdGVsKGwsIHJlZyk7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKKwkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0w7CisJCWwgPSBfX3Jhd19yZWFkbChyZWcpOworCQlpZiAoZWRnZSA9PSBPTUFQX0dQSU9fUklTSU5HX0VER0UpCisJCQlsIHw9IDEgPDwgZ3BpbzsKKwkJZWxzZQorCQkJbCAmPSB+KDEgPDwgZ3Bpbyk7CisJCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCWVkZ2UgJj0gMHgwMzsKKwkJaWYgKGdwaW8gJiAweDA4KQorCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMjsKKwkJZWxzZQorCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMTsKKwkJZ3BpbyAmPSAweDA3OworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJbCAmPSB+KDMgPDwgKGdwaW8gPDwgMSkpOworCQlsIHw9IGVkZ2UgPDwgKGdwaW8gPDwgMSk7CisJCV9fcmF3X3dyaXRlbChsLCByZWcpOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJCWwgfD0gMSA8PCBncGlvOworCQllbHNlCisJCQlsICY9IH4oMSA8PCBncGlvKTsKKwkJX19yYXdfd3JpdGVsKGwsIHJlZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorfQorCit2b2lkIG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKGludCBncGlvLCBpbnQgZWRnZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQorCQlyZXR1cm47CisJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwlfc2V0X2dwaW9fZWRnZV9jdHJsKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlZGdlKTsKKwlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cit9CisKKworc3RhdGljIGludCBfZ2V0X2dwaW9fZWRnZV9jdHJsKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvKQoreworCXUzMiByZWcgPSBiYW5rLT5iYXNlLCBsOworCisJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwljYXNlIE1FVEhPRF9NUFVJTzoKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRSk7CisJCXJldHVybiAobCAmICgxIDw8IGdwaW8pKSA/CisJCQlPTUFQX0dQSU9fUklTSU5HX0VER0UgOiBPTUFQX0dQSU9fRkFMTElOR19FREdFOworCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0wpOworCQlyZXR1cm4gKGwgJiAoMSA8PCBncGlvKSkgPworCQkJT01BUF9HUElPX1JJU0lOR19FREdFIDogT01BUF9HUElPX0ZBTExJTkdfRURHRTsKKwljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCWlmIChncGlvICYgMHgwOCkKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDI7CisJCWVsc2UKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX0VER0VfQ1RSTDE7CisJCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSA+PiAoKGdwaW8gJiAweDA3KSA8PCAxKSkgJiAweDAzOworCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgorCQlsID0gX19yYXdfcmVhZGwocmVnICsgT01BUDczMF9HUElPX0lOVF9DT05UUk9MKTsKKwkJcmV0dXJuIChsICYgKDEgPDwgZ3BpbykpID8KKwkJCU9NQVBfR1BJT19SSVNJTkdfRURHRSA6IE9NQVBfR1BJT19GQUxMSU5HX0VER0U7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9jbGVhcl9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKK3sKKwl1MzIgcmVnID0gYmFuay0+YmFzZTsKKworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfTVBVSU86CisJCS8qIE1QVUlPIGlycXN0YXR1cyBpcyByZXNldCBieSByZWFkaW5nIHRoZSBzdGF0dXMgcmVnaXN0ZXIsCisJCSAqIHNvIGRvIG5vdGhpbmcgaGVyZSAqLworCQlyZXR1cm47CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzE2MTA6CisJCXJlZyArPSBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzE7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgorCQlyZWcgKz0gT01BUDczMF9HUElPX0lOVF9TVEFUVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCV9fcmF3X3dyaXRlbChncGlvX21hc2ssIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfY2xlYXJfZ3Bpb19pcnFzdGF0dXMoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW8pCit7CisJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKK30KKworc3RhdGljIHZvaWQgX2VuYWJsZV9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaywgaW50IGVuYWJsZSkKK3sKKwl1MzIgcmVnID0gYmFuay0+YmFzZTsKKwl1MzIgbDsKKworCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7CisJY2FzZSBNRVRIT0RfTVBVSU86CisJCXJlZyArPSBPTUFQX01QVUlPX0dQSU9fTUFTS0lUOworCQlsID0gX19yYXdfcmVhZGwocmVnKTsKKwkJaWYgKGVuYWJsZSkKKwkJCWwgJj0gfihncGlvX21hc2spOworCQllbHNlCisJCQlsIHw9IGdwaW9fbWFzazsKKwkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18xNTEwOgorCQlyZWcgKz0gT01BUDE1MTBfR1BJT19JTlRfTUFTSzsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsICY9IH4oZ3Bpb19tYXNrKTsKKwkJZWxzZQorCQkJbCB8PSBncGlvX21hc2s7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZyArPSBPTUFQMTYxMF9HUElPX1NFVF9JUlFFTkFCTEUxOworCQllbHNlCisJCQlyZWcgKz0gT01BUDE2MTBfR1BJT19DTEVBUl9JUlFFTkFCTEUxOworCQlsID0gZ3Bpb19tYXNrOworCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzczMDoKKwkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfTUFTSzsKKwkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CisJCWlmIChlbmFibGUpCisJCQlsICY9IH4oZ3Bpb19tYXNrKTsKKwkJZWxzZQorCQkJbCB8PSBncGlvX21hc2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCV9fcmF3X3dyaXRlbChsLCByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3NldF9ncGlvX2lycWVuYWJsZShzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOworfQorCitpbnQgb21hcF9yZXF1ZXN0X2dwaW8oaW50IGdwaW8pCit7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlzcGluX2xvY2soJmJhbmstPmxvY2spOworCWlmICh1bmxpa2VseShiYW5rLT5yZXNlcnZlZF9tYXAgJiAoMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIGlzIGFscmVhZHkgcmVzZXJ2ZWQhXG4iLCBncGlvKTsKKwkJZHVtcF9zdGFjaygpOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJYmFuay0+cmVzZXJ2ZWRfbWFwIHw9ICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTUxMAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTUxMCkgeworCQl1MzIgcmVnOworCisJCS8qIENsYWltIHRoZSBwaW4gZm9yIHRoZSBBUk0gKi8KKwkJcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fUElOX0NPTlRST0w7CisJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChyZWcpIHwgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpLCByZWcpOworCX0KKyNlbmRpZgorCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG9tYXBfZnJlZV9ncGlvKGludCBncGlvKQoreworCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CisKKwlpZiAoY2hlY2tfZ3BpbyhncGlvKSA8IDApCisJCXJldHVybjsKKwliYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKwlzcGluX2xvY2soJmJhbmstPmxvY2spOworCWlmICh1bmxpa2VseSghKGJhbmstPnJlc2VydmVkX21hcCAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAib21hcC1ncGlvOiBHUElPICVkIHdhc24ndCByZXNlcnZlZCFcbiIsIGdwaW8pOworCQlkdW1wX3N0YWNrKCk7CisJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwliYW5rLT5yZXNlcnZlZF9tYXAgJj0gfigxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKTsKKwlfc2V0X2dwaW9fZGlyZWN0aW9uKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCAxKTsKKwlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDApOworCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKKwlzcGluX3VubG9jaygmYmFuay0+bG9jayk7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIHVubWFzayB0aGUgR1BJTyBiYW5rIGludGVycnVwdCBhcyBzb29uIGFzIHBvc3NpYmxlIHRvCisgKiBhdm9pZCBtaXNzaW5nIEdQSU8gaW50ZXJydXB0cyBmb3Igb3RoZXIgbGluZXMgaW4gdGhlIGJhbmsuCisgKiBUaGVuIHdlIG5lZWQgdG8gbWFzay1yZWFkLWNsZWFyLXVubWFzayB0aGUgdHJpZ2dlcmVkIEdQSU8gbGluZXMKKyAqIGluIHRoZSBiYW5rIHRvIGF2b2lkIG1pc3NpbmcgbmVzdGVkIGludGVycnVwdHMgZm9yIGEgR1BJTyBsaW5lLgorICogSWYgd2Ugd2FpdCB0byB1bm1hc2sgaW5kaXZpZHVhbCBHUElPIGxpbmVzIGluIHRoZSBiYW5rIGFmdGVyIHRoZQorICogbGluZSdzIGludGVycnVwdCBoYW5kbGVyIGhhcyBiZWVuIHJ1biwgd2UgbWF5IG1pc3Mgc29tZSBuZXN0ZWQKKyAqIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyB2b2lkIGdwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsCisJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBpc3JfcmVnID0gMDsKKwl1MzIgaXNyOworCXVuc2lnbmVkIGludCBncGlvX2lycTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJZGVzYy0+Y2hpcC0+YWNrKGlycSk7CisKKwliYW5rID0gKHN0cnVjdCBncGlvX2JhbmsgKikgZGVzYy0+ZGF0YTsKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKKwkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQX01QVUlPX0dQSU9fSU5UOworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKQorCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNTEwX0dQSU9fSU5UX1NUQVRVUzsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKQorCQlpc3JfcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzczMCkKKwkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKKyNlbmRpZgorCisJaXNyID0gX19yYXdfcmVhZGwoaXNyX3JlZyk7CisJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKKwlfY2xlYXJfZ3Bpb19pcnFiYW5rKGJhbmssIGlzcik7CisJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAxKTsKKwlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKKworCWlmICh1bmxpa2VseSghaXNyKSkKKwkJcmV0dXJuOworCisJZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKKwlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgeworCQlzdHJ1Y3QgaXJxZGVzYyAqZDsKKwkJaWYgKCEoaXNyICYgMSkpCisJCQljb250aW51ZTsKKwkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7CisJCWQtPmhhbmRsZShncGlvX2lycSwgZCwgcmVncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBncGlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKworCV9jbGVhcl9ncGlvX2lycXN0YXR1cyhiYW5rLCBncGlvKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOworCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOworCisJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKK30KKworc3RhdGljIHZvaWQgZ3Bpb191bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgaW50IGdwaW8gPSBpcnEgLSBJSF9HUElPX0JBU0U7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisKKwlpZiAoX2dldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSkgPT0gT01BUF9HUElPX05PX0VER0UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJPTUFQIEdQSU8gJWQ6IHRyeWluZyB0byBlbmFibGUgR1BJTyBJUlEgd2hpbGUgbm8gZWRnZSBpcyBzZXRcbiIsCisJCSAgICAgICBncGlvKTsKKwkJX3NldF9ncGlvX2VkZ2VfY3RybChiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgT01BUF9HUElPX1JJU0lOR19FREdFKTsKKwl9CisJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAxKTsKK30KKworc3RhdGljIHZvaWQgbXB1aW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIFRoZSBJU1IgaXMgcmVzZXQgYXV0b21hdGljYWxseSwgc28gZG8gbm90aGluZyBoZXJlLiAqLworfQorCitzdGF0aWMgdm9pZCBtcHVpb19tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGludCBncGlvID0gT01BUF9NUFVJTyhpcnEgLSBJSF9NUFVJT19CQVNFKTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rID0gZ2V0X2dwaW9fYmFuayhncGlvKTsKKworCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1wdWlvX3VubWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBpbnQgZ3BpbyA9IE9NQVBfTVBVSU8oaXJxIC0gSUhfTVBVSU9fQkFTRSk7CisJc3RydWN0IGdwaW9fYmFuayAqYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisKKwlfc2V0X2dwaW9faXJxZW5hYmxlKGJhbmssIGdwaW8sIDEpOworfQorCitzdGF0aWMgc3RydWN0IGlycWNoaXAgZ3Bpb19pcnFfY2hpcCA9IHsKKwkuYWNrCT0gZ3Bpb19hY2tfaXJxLAorCS5tYXNrCT0gZ3Bpb19tYXNrX2lycSwKKwkudW5tYXNrID0gZ3Bpb191bm1hc2tfaXJxLAorfTsKKworc3RhdGljIHN0cnVjdCBpcnFjaGlwIG1wdWlvX2lycV9jaGlwID0geworCS5hY2sJPSBtcHVpb19hY2tfaXJxLAorCS5tYXNrCT0gbXB1aW9fbWFza19pcnEsCisJLnVubWFzayA9IG1wdWlvX3VubWFza19pcnEKK307CisKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCitzdGF0aWMgaW50IF9faW5pdCBfb21hcF9ncGlvX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOworCisJaW5pdGlhbGl6ZWQgPSAxOworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDE1MTAgR1BJTyBoYXJkd2FyZVxuIik7CisJCWdwaW9fYmFua19jb3VudCA9IDI7CisJCWdwaW9fYmFuayA9IGdwaW9fYmFua18xNTEwOworCX0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWludCByZXY7CisKKwkJZ3Bpb19iYW5rX2NvdW50ID0gNTsKKwkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzE2MTA7CisJCXJldiA9IG9tYXBfcmVhZHcoZ3Bpb19iYW5rWzFdLmJhc2UgKyBPTUFQMTYxMF9HUElPX1JFVklTSU9OKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCisJCSAgICAgICAocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAorCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk9NQVA3MzAgR1BJTyBoYXJkd2FyZVxuIik7CisJCWdwaW9fYmFua19jb3VudCA9IDc7CisJCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7CisJfQorI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CisJCWludCBqLCBncGlvX2NvdW50ID0gMTY7CisKKwkJYmFuayA9ICZncGlvX2JhbmtbaV07CisJCWJhbmstPnJlc2VydmVkX21hcCA9IDA7CisJCWJhbmstPmJhc2UgPSBJT19BRERSRVNTKGJhbmstPmJhc2UpOworCQlzcGluX2xvY2tfaW5pdCgmYmFuay0+bG9jayk7CisJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKSB7CisJCQlvbWFwX3dyaXRldygweEZGRkYsIE9NQVBfTVBVSU9fQkFTRSArIE9NQVBfTVBVSU9fR1BJT19NQVNLSVQpOworCQl9CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKSB7CisJCQlfX3Jhd193cml0ZXcoMHhmZmZmLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfTUFTSyk7CisJCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE1MTBfR1BJT19JTlRfU1RBVFVTKTsKKwkJfQorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKwkJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNjEwKSB7CisJCQlfX3Jhd193cml0ZXcoMHgwMDAwLCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxKTsKKwkJCV9fcmF3X3dyaXRldygweGZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUVNUQVRVUzEpOworCQl9CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fNzMwKSB7CisJCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfTUFTSyk7CisJCQlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgYmFuay0+YmFzZSArIE9NQVA3MzBfR1BJT19JTlRfU1RBVFVTKTsKKworCQkJZ3Bpb19jb3VudCA9IDMyOyAvKiA3MzAgaGFzIDMyLWJpdCBHUElPcyAqLworCQl9CisjZW5kaWYKKwkJZm9yIChqID0gYmFuay0+dmlydHVhbF9pcnFfc3RhcnQ7CisJCSAgICAgaiA8IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0ICsgZ3Bpb19jb3VudDsgaisrKSB7CisJCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9NUFVJTykKKwkJCQlzZXRfaXJxX2NoaXAoaiwgJm1wdWlvX2lycV9jaGlwKTsKKwkJCWVsc2UKKwkJCQlzZXRfaXJxX2NoaXAoaiwgJmdwaW9faXJxX2NoaXApOworCQkJc2V0X2lycV9oYW5kbGVyKGosIGRvX3NpbXBsZV9JUlEpOworCQkJc2V0X2lycV9mbGFncyhqLCBJUlFGX1ZBTElEKTsKKwkJfQorCQlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihiYW5rLT5pcnEsIGdwaW9faXJxX2hhbmRsZXIpOworCQlzZXRfaXJxX2RhdGEoYmFuay0+aXJxLCBiYW5rKTsKKwl9CisKKwkvKiBFbmFibGUgc3lzdGVtIGNsb2NrIGZvciBHUElPIG1vZHVsZS4KKwkgKiBUaGUgQ0FNX0NMS19DVFJMICppcyogcmVhbGx5IHRoZSByaWdodCBwbGFjZS4gKi8KKwlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpCisJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoVUxQRF9DQU1fQ0xLX0NUUkwpIHwgMHgwNCwgVUxQRF9DQU1fQ0xLX0NUUkwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAorICovCitpbnQgb21hcF9ncGlvX2luaXQodm9pZCkKK3sKKwlpZiAoIWluaXRpYWxpemVkKQorCQlyZXR1cm4gX29tYXBfZ3Bpb19pbml0KCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChvbWFwX3JlcXVlc3RfZ3Bpbyk7CitFWFBPUlRfU1lNQk9MKG9tYXBfZnJlZV9ncGlvKTsKK0VYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24pOworRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2RhdGFvdXQpOworRVhQT1JUX1NZTUJPTChvbWFwX2dldF9ncGlvX2RhdGFpbik7CitFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKTsKKworYXJjaF9pbml0Y2FsbChvbWFwX2dwaW9faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNTY3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYwpAQCAtMCwwICsxLDc1OCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFNhbXVlbCBPcnRpeiA8c2FtdWVsLm9ydGl6QG5va2lhLmNvbT4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBNdWx0aWNoYW5uZWwgbW9kZSBub3Qgc3VwcG9ydGVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tY2JzcC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CisKKyNpZmRlZiBDT05GSUdfTUNCU1BfREVCVUcKKyNkZWZpbmUgREJHKHguLi4pCXByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgREJHKHguLi4pCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCitzdHJ1Y3Qgb21hcF9tY2JzcCB7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICBpb19iYXNlOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOworCW9tYXBfbWNic3Bfd29yZF9sZW5ndGggICAgICAgcnhfd29yZF9sZW5ndGg7CisJb21hcF9tY2JzcF93b3JkX2xlbmd0aCAgICAgICB0eF93b3JkX2xlbmd0aDsKKworCS8qIElSUSBiYXNlZCBUWC9SWCAqLworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgcnhfaXJxOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgdHhfaXJxOworCisJLyogRE1BIHN0dWZmICovCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfcnhfc3luYzsKKwlzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9yeF9sY2g7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICBkbWFfdHhfc3luYzsKKwlzaG9ydCAgICAgICAgICAgICAgICAgICAgICAgIGRtYV90eF9sY2g7CisKKwkvKiBDb21wbGV0aW9uIHF1ZXVlcyAqLworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgdHhfaXJxX2NvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24gICAgICAgICAgICByeF9pcnFfY29tcGxldGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgIHR4X2RtYV9jb21wbGV0aW9uOworCXN0cnVjdCBjb21wbGV0aW9uICAgICAgICAgICAgcnhfZG1hX2NvbXBsZXRpb247CisKKwlzcGlubG9ja190ICAgICAgICAgICAgICAgICAgIGxvY2s7Cit9OworCitzdGF0aWMgc3RydWN0IG9tYXBfbWNic3AgbWNic3BbT01BUF9NQVhfTUNCU1BfQ09VTlRdOworc3RhdGljIHN0cnVjdCBjbGsgKm1jYnNwX2RzcF9jayA9IDA7CitzdGF0aWMgc3RydWN0IGNsayAqbWNic3BfYXBpX2NrID0gMDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICptY2JzcF9kc3B4b3JfY2sgPSAwOworCisKK3N0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHVtcF9yZWcodTggaWQpCit7CisJREJHKCIqKioqIE1DQlNQJWQgcmVncyAqKioqXG4iLCBtY2JzcFtpZF0uaWQpOworCURCRygiRFJSMjogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBEUlIyKSk7CisJREJHKCJEUlIxOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIERSUjEpKTsKKwlEQkcoIkRYUjI6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgRFhSMikpOworCURCRygiRFhSMTogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBEWFIxKSk7CisJREJHKCJTUENSMjogMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNQQ1IyKSk7CisJREJHKCJTUENSMTogMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFNQQ1IxKSk7CisJREJHKCJSQ1IyOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFJDUjIpKTsKKwlEQkcoIlJDUjE6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgUkNSMSkpOworCURCRygiWENSMjogIDB4JTA0eFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwW2lkXS5pb19iYXNlLCBYQ1IyKSk7CisJREJHKCJYQ1IxOiAgMHglMDR4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BbaWRdLmlvX2Jhc2UsIFhDUjEpKTsKKwlEQkcoIlNSR1IyOiAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgU1JHUjIpKTsKKwlEQkcoIlNSR1IxOiAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgU1JHUjEpKTsKKwlEQkcoIlBDUjA6ICAweCUwNHhcbiIsIE9NQVBfTUNCU1BfUkVBRChtY2JzcFtpZF0uaW9fYmFzZSwgUENSMCkpOworCURCRygiKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG9tYXBfbWNic3AgKiBtY2JzcF90eCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkZXZfaWQpOworCisJREJHKCJUWCBJUlEgY2FsbGJhY2sgOiAweCV4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BfdHgtPmlvX2Jhc2UsIFNQQ1IyKSk7CisKKwljb21wbGV0ZSgmbWNic3BfdHgtPnR4X2lycV9jb21wbGV0aW9uKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX21jYnNwX3J4X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG9tYXBfbWNic3AgKiBtY2JzcF9yeCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkZXZfaWQpOworCisJREJHKCJSWCBJUlEgY2FsbGJhY2sgOiAweCV4XG4iLCBPTUFQX01DQlNQX1JFQUQobWNic3BfcngtPmlvX2Jhc2UsIFNQQ1IyKSk7CisKKwljb21wbGV0ZSgmbWNic3BfcngtPnJ4X2lycV9jb21wbGV0aW9uKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworc3RhdGljIHZvaWQgb21hcF9tY2JzcF90eF9kbWFfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9tY2JzcCAqIG1jYnNwX2RtYV90eCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkYXRhKTsKKworCURCRygiVFggRE1BIGNhbGxiYWNrIDogMHgleFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwX2RtYV90eC0+aW9fYmFzZSwgU1BDUjIpKTsKKworCS8qIFdlIGNhbiBmcmVlIHRoZSBjaGFubmVscyAqLworCW9tYXBfZnJlZV9kbWEobWNic3BfZG1hX3R4LT5kbWFfdHhfbGNoKTsKKwltY2JzcF9kbWFfdHgtPmRtYV90eF9sY2ggPSAtMTsKKworCWNvbXBsZXRlKCZtY2JzcF9kbWFfdHgtPnR4X2RtYV9jb21wbGV0aW9uKTsKK30KKworc3RhdGljIHZvaWQgb21hcF9tY2JzcF9yeF9kbWFfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb21hcF9tY2JzcCAqIG1jYnNwX2RtYV9yeCA9IChzdHJ1Y3Qgb21hcF9tY2JzcCAqKShkYXRhKTsKKworCURCRygiUlggRE1BIGNhbGxiYWNrIDogMHgleFxuIiwgT01BUF9NQ0JTUF9SRUFEKG1jYnNwX2RtYV9yeC0+aW9fYmFzZSwgU1BDUjIpKTsKKworCS8qIFdlIGNhbiBmcmVlIHRoZSBjaGFubmVscyAqLworCW9tYXBfZnJlZV9kbWEobWNic3BfZG1hX3J4LT5kbWFfcnhfbGNoKTsKKwltY2JzcF9kbWFfcngtPmRtYV9yeF9sY2ggPSAtMTsKKworCWNvbXBsZXRlKCZtY2JzcF9kbWFfcngtPnJ4X2RtYV9jb21wbGV0aW9uKTsKK30KKworCisvKgorICogb21hcF9tY2JzcF9jb25maWcgc2ltcGx5IHdyaXRlIGEgY29uZmlnIHRvIHRoZQorICogYXBwcm9wcmlhdGUgTWNCU1AuCisgKiBZb3UgZWl0aGVyIGNhbGwgdGhpcyBmdW5jdGlvbiBvciBzZXQgdGhlIE1jQlNQIHJlZ2lzdGVycworICogYnkgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcgb21hcF9tY2JzcF9zdGFydCgpLgorICovCisKK3ZvaWQgb21hcF9tY2JzcF9jb25maWcodW5zaWduZWQgaW50IGlkLCBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnICogY29uZmlnKQoreworCXUzMiBpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisKKwlEQkcoIk9NQVAtTWNCU1A6IE1jQlNQJWQgIGlvX2Jhc2U6IDB4JTh4XG4iLCBpZCsxLCBpb19iYXNlKTsKKworCS8qIFdlIHdyaXRlIHRoZSBnaXZlbiBjb25maWcgKi8KKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCBjb25maWctPnNwY3IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IxLCBjb25maWctPnNwY3IxKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFJDUjIsIGNvbmZpZy0+cmNyMik7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBSQ1IxLCBjb25maWctPnJjcjEpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgWENSMiwgY29uZmlnLT54Y3IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFhDUjEsIGNvbmZpZy0+eGNyMSk7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUkdSMiwgY29uZmlnLT5zcmdyMik7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBTUkdSMSwgY29uZmlnLT5zcmdyMSk7CisJT01BUF9NQ0JTUF9XUklURShpb19iYXNlLCBNQ1IyLCBjb25maWctPm1jcjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgTUNSMSwgY29uZmlnLT5tY3IxKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFBDUjAsIGNvbmZpZy0+cGNyMCk7Cit9CisKKworCitzdGF0aWMgaW50IG9tYXBfbWNic3BfY2hlY2sodW5zaWduZWQgaW50IGlkKQoreworCWlmIChjcHVfaXNfb21hcDczMCgpKSB7CisJCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UIC0gMSkgeworCQkgICAgICAgcHJpbnRrKEtFUk5fRVJSICJPTUFQLU1jQlNQOiBNY0JTUCVkIGRvZXNuJ3QgZXhpc3RcbiIsIGlkICsgMSk7CisJCSAgICAgICByZXR1cm4gLTE7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpIHx8IGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCWlmIChpZCA+IE9NQVBfTUFYX01DQlNQX0NPVU5UKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk9NQVAtTWNCU1A6IE1jQlNQJWQgZG9lc24ndCBleGlzdFxuIiwgaWQgKyAxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgRU5fWE9SUENLCQkxCisjZGVmaW5lIERTUF9SU1RDVDIgICAgICAgICAgICAgIDB4ZTEwMDgwMTQKKworc3RhdGljIHZvaWQgb21hcF9tY2JzcF9kc3BfcmVxdWVzdCh2b2lkKQoreworCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgeworCQljbGtfdXNlKG1jYnNwX2RzcF9jayk7CisJCWNsa191c2UobWNic3BfYXBpX2NrKTsKKworCQkvKiBlbmFibGUgMTJNSHogY2xvY2sgdG8gbWNic3AgMSAmIDMgKi8KKwkJY2xrX3VzZShtY2JzcF9kc3B4b3JfY2spOworCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoRFNQX1JTVENUMikgfCAxIHwgMSA8PCAxLAorCQkJICAgICBEU1BfUlNUQ1QyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfbWNic3BfZHNwX2ZyZWUodm9pZCkKK3sKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJY2xrX3VudXNlKG1jYnNwX2RzcHhvcl9jayk7CisJCWNsa191bnVzZShtY2JzcF9kc3BfY2spOworCQljbGtfdW51c2UobWNic3BfYXBpX2NrKTsKKwl9Cit9CisKK2ludCBvbWFwX21jYnNwX3JlcXVlc3QodW5zaWduZWQgaW50IGlkKQoreworCWludCBlcnI7CisKKwlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogT24gMTUxMCwgMTYxMCBhbmQgMTcxMCwgTWNCU1AxIGFuZCBNY0JTUDMKKwkgKiBhcmUgRFNQIHB1YmxpYyBwZXJpcGhlcmFscy4KKwkgKi8KKwlpZiAoaWQgPT0gT01BUF9NQ0JTUDEgfHwgaWQgPT0gT01BUF9NQ0JTUDMpCisJCW9tYXBfbWNic3BfZHNwX3JlcXVlc3QoKTsKKworCXNwaW5fbG9jaygmbWNic3BbaWRdLmxvY2spOworCWlmICghbWNic3BbaWRdLmZyZWUpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiT01BUC1NY0JTUDogTWNCU1AlZCBpcyBjdXJyZW50bHkgaW4gdXNlXG4iLCBpZCArIDEpOworCQlzcGluX3VubG9jaygmbWNic3BbaWRdLmxvY2spOworCQlyZXR1cm4gLTE7CisJfQorCisJbWNic3BbaWRdLmZyZWUgPSAwOworCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisKKwkvKiBXZSBuZWVkIHRvIGdldCBJUlFzIGhlcmUgKi8KKwllcnIgPSByZXF1ZXN0X2lycShtY2JzcFtpZF0udHhfaXJxLCBvbWFwX21jYnNwX3R4X2lycV9oYW5kbGVyLCAwLAorCQkJICAiTWNCU1AiLAorCQkJICAodm9pZCAqKSAoJm1jYnNwW2lkXSkpOworCWlmIChlcnIgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIk9NQVAtTWNCU1A6IFVuYWJsZSB0byByZXF1ZXN0IFRYIElSUSAlZCBmb3IgTWNCU1AlZFxuIiwKKwkJICAgICAgIG1jYnNwW2lkXS50eF9pcnEsIG1jYnNwW2lkXS5pZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaW5pdF9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2lycV9jb21wbGV0aW9uKSk7CisKKworCWVyciA9IHJlcXVlc3RfaXJxKG1jYnNwW2lkXS5yeF9pcnEsIG9tYXBfbWNic3BfcnhfaXJxX2hhbmRsZXIsIDAsCisJCQkgICJNY0JTUCIsCisJCQkgICh2b2lkICopICgmbWNic3BbaWRdKSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiT01BUC1NY0JTUDogVW5hYmxlIHRvIHJlcXVlc3QgUlggSVJRICVkIGZvciBNY0JTUCVkXG4iLAorCQkgICAgICAgbWNic3BbaWRdLnJ4X2lycSwgbWNic3BbaWRdLmlkKTsKKwkJZnJlZV9pcnEobWNic3BbaWRdLnR4X2lycSwgKHZvaWQgKikgKCZtY2JzcFtpZF0pKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpbml0X2NvbXBsZXRpb24oJihtY2JzcFtpZF0ucnhfaXJxX2NvbXBsZXRpb24pKTsKKwlyZXR1cm4gMDsKKworfQorCit2b2lkIG9tYXBfbWNic3BfZnJlZSh1bnNpZ25lZCBpbnQgaWQpCit7CisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGlkID09IE9NQVBfTUNCU1AxIHx8IGlkID09IE9NQVBfTUNCU1AzKQorCQlvbWFwX21jYnNwX2RzcF9mcmVlKCk7CisKKwlzcGluX2xvY2soJm1jYnNwW2lkXS5sb2NrKTsKKwlpZiAobWNic3BbaWRdLmZyZWUpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiT01BUC1NY0JTUDogTWNCU1AlZCB3YXMgbm90IHJlc2VydmVkXG4iLCBpZCArIDEpOworCQlzcGluX3VubG9jaygmbWNic3BbaWRdLmxvY2spOworCQlyZXR1cm47CisJfQorCisJbWNic3BbaWRdLmZyZWUgPSAxOworCXNwaW5fdW5sb2NrKCZtY2JzcFtpZF0ubG9jayk7CisKKwkvKiBGcmVlIElSUXMgKi8KKwlmcmVlX2lycShtY2JzcFtpZF0ucnhfaXJxLCAodm9pZCAqKSAoJm1jYnNwW2lkXSkpOworCWZyZWVfaXJxKG1jYnNwW2lkXS50eF9pcnEsICh2b2lkICopICgmbWNic3BbaWRdKSk7Cit9CisKKy8qCisgKiBIZXJlIHdlIHN0YXJ0IHRoZSBNY0JTUCwgYnkgZW5hYmxpbmcgdGhlIHNhbXBsZQorICogZ2VuZXJhdG9yLCBib3RoIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlcnMsCisgKiBhbmQgdGhlIGZyYW1lIHN5bmMuCisgKi8KK3ZvaWQgb21hcF9tY2JzcF9zdGFydCh1bnNpZ25lZCBpbnQgaWQpCit7CisJdTMyIGlvX2Jhc2U7CisJdTE2IHc7CisKKwlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQorCQlyZXR1cm47CisKKwlpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisKKwltY2JzcFtpZF0ucnhfd29yZF9sZW5ndGggPSAoKE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBSQ1IxKSA+PiA1KSAmIDB4Nyk7CisJbWNic3BbaWRdLnR4X3dvcmRfbGVuZ3RoID0gKChPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgWENSMSkgPj4gNSkgJiAweDcpOworCisJLyogU3RhcnQgdGhlIHNhbXBsZSBnZW5lcmF0b3IgKi8KKwl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCB3IHwgKDEgPDwgNikpOworCisJLyogRW5hYmxlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZlciAqLworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgfCAxKTsKKworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjEpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjEsIHcgfCAxKTsKKworCXVkZWxheSgxMDApOworCisJLyogU3RhcnQgZnJhbWUgc3luYyAqLworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjIpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjIsIHcgfCAoMSA8PCA3KSk7CisKKwkvKiBEdW1wIE1jQlNQIFJlZ3MgKi8KKwlvbWFwX21jYnNwX2R1bXBfcmVnKGlkKTsKKworfQorCit2b2lkIG9tYXBfbWNic3Bfc3RvcCh1bnNpZ25lZCBpbnQgaWQpCit7CisJdTMyIGlvX2Jhc2U7CisJdTE2IHc7CisKKwlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQorCQlyZXR1cm47CisKKwlpb19iYXNlID0gbWNic3BbaWRdLmlvX2Jhc2U7CisKKyAgICAgICAgLyogUmVzZXQgdHJhbnNtaXR0ZXIgKi8KKwl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCB3ICYgfigxKSk7CisKKwkvKiBSZXNldCByZWNlaXZlciAqLworCXcgPSBPTUFQX01DQlNQX1JFQUQoaW9fYmFzZSwgU1BDUjEpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgU1BDUjEsIHcgJiB+KDEpKTsKKworCS8qIFJlc2V0IHRoZSBzYW1wbGUgcmF0ZSBnZW5lcmF0b3IgKi8KKwl3ID0gT01BUF9NQ0JTUF9SRUFEKGlvX2Jhc2UsIFNQQ1IyKTsKKwlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIFNQQ1IyLCB3ICYgfigxIDw8IDYpKTsKK30KKworCisvKiBwb2xsZWQgbWNic3AgaS9vIG9wZXJhdGlvbnMgKi8KK2ludCBvbWFwX21jYnNwX3BvbGx3cml0ZSh1bnNpZ25lZCBpbnQgaWQsIHUxNiBidWYpCit7CisJdTMyIGJhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKwl3cml0ZXcoYnVmLCBiYXNlICsgT01BUF9NQ0JTUF9SRUdfRFhSMSk7CisJLyogaWYgZnJhbWUgc3luYyBlcnJvciAtIGNsZWFyIHRoZSBlcnJvciAqLworCWlmIChyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgWFNZTkNfRVJSKSB7CisJCS8qIGNsZWFyIGVycm9yICovCisJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgKH5YU1lOQ19FUlIpLAorCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IyKTsKKwkJLyogcmVzZW5kICovCisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQkvKiB3YWl0IGZvciB0cmFuc21pdCBjb25maXJtYXRpb24gKi8KKwkJaW50IGF0dGVtcHMgPSAwOworCQl3aGlsZSAoIShyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpICYgWFJEWSkpIHsKKwkJCWlmIChhdHRlbXBzKysgPiAxMDAwKSB7CisJCQkJd3JpdGV3KHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMikgJgorCQkJCSAgICAgICAoflhSU1QpLAorCQkJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjIpOworCQkJCXVkZWxheSgxMCk7CisJCQkJd3JpdGV3KHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMikgfAorCQkJCSAgICAgICAoWFJTVCksCisJCQkJICAgICAgIGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMik7CisJCQkJdWRlbGF5KDEwKTsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgIiBDb3VsZCBub3Qgd3JpdGUgdG8gTWNCU1AgUmVnaXN0ZXJcbiIpOworCQkJCXJldHVybiAtMjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG9tYXBfbWNic3BfcG9sbHJlYWQodW5zaWduZWQgaW50IGlkLCB1MTYgKiBidWYpCit7CisJdTMyIGJhc2UgPSBtY2JzcFtpZF0uaW9fYmFzZTsKKwkvKiBpZiBmcmFtZSBzeW5jIGVycm9yIC0gY2xlYXIgdGhlIGVycm9yICovCisJaWYgKHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMSkgJiBSU1lOQ19FUlIpIHsKKwkJLyogY2xlYXIgZXJyb3IgKi8KKwkJd3JpdGV3KHJlYWR3KGJhc2UgKyBPTUFQX01DQlNQX1JFR19TUENSMSkgJiAoflJTWU5DX0VSUiksCisJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpOworCQkvKiByZXNlbmQgKi8KKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCS8qIHdhaXQgZm9yIHJlY2lldmUgY29uZmlybWF0aW9uICovCisJCWludCBhdHRlbXBzID0gMDsKKwkJd2hpbGUgKCEocmVhZHcoYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKSAmIFJSRFkpKSB7CisJCQlpZiAoYXR0ZW1wcysrID4gMTAwMCkgeworCQkJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpICYKKwkJCQkgICAgICAgKH5SUlNUKSwKKwkJCQkgICAgICAgYmFzZSArIE9NQVBfTUNCU1BfUkVHX1NQQ1IxKTsKKwkJCQl1ZGVsYXkoMTApOworCQkJCXdyaXRldyhyZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpIHwKKwkJCQkgICAgICAgKFJSU1QpLAorCQkJCSAgICAgICBiYXNlICsgT01BUF9NQ0JTUF9SRUdfU1BDUjEpOworCQkJCXVkZWxheSgxMCk7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICIgQ291bGQgbm90IHJlYWQgZnJvbSBNY0JTUCBSZWdpc3RlclxuIik7CisJCQkJcmV0dXJuIC0yOworCQkJfQorCQl9CisJfQorCSpidWYgPSByZWFkdyhiYXNlICsgT01BUF9NQ0JTUF9SRUdfRFJSMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJUlEgYmFzZWQgd29yZCB0cmFuc21pc3Npb24uCisgKi8KK3ZvaWQgb21hcF9tY2JzcF94bWl0X3dvcmQodW5zaWduZWQgaW50IGlkLCB1MzIgd29yZCkKK3sKKwl1MzIgaW9fYmFzZTsKKwlvbWFwX21jYnNwX3dvcmRfbGVuZ3RoIHdvcmRfbGVuZ3RoID0gbWNic3BbaWRdLnR4X3dvcmRfbGVuZ3RoOworCisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuOworCisJaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS50eF9pcnFfY29tcGxldGlvbikpOworCisJaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQorCQlPTUFQX01DQlNQX1dSSVRFKGlvX2Jhc2UsIERYUjIsIHdvcmQgPj4gMTYpOworCU9NQVBfTUNCU1BfV1JJVEUoaW9fYmFzZSwgRFhSMSwgd29yZCAmIDB4ZmZmZik7Cit9CisKK3UzMiBvbWFwX21jYnNwX3JlY3Zfd29yZCh1bnNpZ25lZCBpbnQgaWQpCit7CisJdTMyIGlvX2Jhc2U7CisJdTE2IHdvcmRfbHNiLCB3b3JkX21zYiA9IDA7CisJb21hcF9tY2JzcF93b3JkX2xlbmd0aCB3b3JkX2xlbmd0aCA9IG1jYnNwW2lkXS5yeF93b3JkX2xlbmd0aDsKKworCWlmIChvbWFwX21jYnNwX2NoZWNrKGlkKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaW9fYmFzZSA9IG1jYnNwW2lkXS5pb19iYXNlOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9pcnFfY29tcGxldGlvbikpOworCisJaWYgKHdvcmRfbGVuZ3RoID4gT01BUF9NQ0JTUF9XT1JEXzE2KQorCQl3b3JkX21zYiA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBEUlIyKTsKKwl3b3JkX2xzYiA9IE9NQVBfTUNCU1BfUkVBRChpb19iYXNlLCBEUlIxKTsKKworCXJldHVybiAod29yZF9sc2IgfCAod29yZF9tc2IgPDwgMTYpKTsKK30KKworCisvKgorICogU2ltcGxlIERNQSBiYXNlZCBidWZmZXIgcngvdHggcm91dGluZXMuCisgKiBOb3RoaW5nIGZhbmN5LCBqdXN0IGEgc2luZ2xlIGJ1ZmZlciB0eC9yeCB0aHJvdWdoIERNQS4KKyAqIFRoZSBETUEgcmVzb3VyY2VzIGFyZSByZWxlYXNlZCBvbmNlIHRoZSB0cmFuc2ZlciBpcyBkb25lLgorICogRm9yIGFueXRoaW5nIGZhbmNpZXIsIHlvdSBzaG91bGQgdXNlIHlvdXIgb3duIGN1c3RvbWl6ZWQgRE1BCisgKiByb3V0aW5lcyBhbmQgY2FsbGJhY2tzLgorICovCitpbnQgb21hcF9tY2JzcF94bWl0X2J1ZmZlcih1bnNpZ25lZCBpbnQgaWQsIGRtYV9hZGRyX3QgYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCWludCBkbWFfdHhfY2g7CisKKwlpZiAob21hcF9tY2JzcF9jaGVjayhpZCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvbWFwX3JlcXVlc3RfZG1hKG1jYnNwW2lkXS5kbWFfdHhfc3luYywgIk1jQlNQIFRYIiwgb21hcF9tY2JzcF90eF9kbWFfY2FsbGJhY2ssCisJCQkgICAgICZtY2JzcFtpZF0sCisJCQkgICAgICZkbWFfdHhfY2gpKSB7CisJCXByaW50aygiT01BUC1NY0JTUDogVW5hYmxlIHRvIHJlcXVlc3QgRE1BIGNoYW5uZWwgZm9yIE1jQlNQJWQgVFguIFRyeWluZyBJUlEgYmFzZWQgVFhcbiIsIGlkKzEpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJbWNic3BbaWRdLmRtYV90eF9sY2ggPSBkbWFfdHhfY2g7CisKKwlEQkcoIlRYIERNQSBvbiBjaGFubmVsICVkXG4iLCBkbWFfdHhfY2gpOworCisJaW5pdF9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2RtYV9jb21wbGV0aW9uKSk7CisKKwlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKG1jYnNwW2lkXS5kbWFfdHhfbGNoLAorCQkJCSAgICAgT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkJCQkgICAgIGxlbmd0aCA+PiAxLCAxLAorCQkJCSAgICAgT01BUF9ETUFfU1lOQ19FTEVNRU5UKTsKKworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY2JzcFtpZF0uZG1hX3R4X2xjaCwKKwkJCQkgT01BUF9ETUFfUE9SVF9USVBCLAorCQkJCSBPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKKwkJCQkgbWNic3BbaWRdLmlvX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EWFIxKTsKKworCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKG1jYnNwW2lkXS5kbWFfdHhfbGNoLAorCQkJCU9NQVBfRE1BX1BPUlRfRU1JRkYsCisJCQkJT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJYnVmZmVyKTsKKworCW9tYXBfc3RhcnRfZG1hKG1jYnNwW2lkXS5kbWFfdHhfbGNoKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCYobWNic3BbaWRdLnR4X2RtYV9jb21wbGV0aW9uKSk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IG9tYXBfbWNic3BfcmVjdl9idWZmZXIodW5zaWduZWQgaW50IGlkLCBkbWFfYWRkcl90IGJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlpbnQgZG1hX3J4X2NoOworCisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob21hcF9yZXF1ZXN0X2RtYShtY2JzcFtpZF0uZG1hX3J4X3N5bmMsICJNY0JTUCBSWCIsIG9tYXBfbWNic3BfcnhfZG1hX2NhbGxiYWNrLAorCQkJICAgICAmbWNic3BbaWRdLAorCQkJICAgICAmZG1hX3J4X2NoKSkgeworCQlwcmludGsoIlVuYWJsZSB0byByZXF1ZXN0IERNQSBjaGFubmVsIGZvciBNY0JTUCVkIFJYLiBUcnlpbmcgSVJRIGJhc2VkIFJYXG4iLCBpZCsxKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCW1jYnNwW2lkXS5kbWFfcnhfbGNoID0gZG1hX3J4X2NoOworCisJREJHKCJSWCBETUEgb24gY2hhbm5lbCAlZFxuIiwgZG1hX3J4X2NoKTsKKworCWluaXRfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9kbWFfY29tcGxldGlvbikpOworCisJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwkJCQkgICAgIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJCQkJICAgICBsZW5ndGggPj4gMSwgMSwKKwkJCQkgICAgIE9NQVBfRE1BX1NZTkNfRUxFTUVOVCk7CisKKwlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwkJCQlPTUFQX0RNQV9QT1JUX1RJUEIsCisJCQkJT01BUF9ETUFfQU1PREVfQ09OU1RBTlQsCisJCQkJbWNic3BbaWRdLmlvX2Jhc2UgKyBPTUFQX01DQlNQX1JFR19EUlIxKTsKKworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyhtY2JzcFtpZF0uZG1hX3J4X2xjaCwKKwkJCQkgT01BUF9ETUFfUE9SVF9FTUlGRiwKKwkJCQkgT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQkJIGJ1ZmZlcik7CisKKwlvbWFwX3N0YXJ0X2RtYShtY2JzcFtpZF0uZG1hX3J4X2xjaCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmKG1jYnNwW2lkXS5yeF9kbWFfY29tcGxldGlvbikpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBTUEkgd3JhcHBlci4KKyAqIFNpbmNlIFNQSSBzZXR1cCBpcyBtdWNoIHNpbXBsZXIgdGhhbiB0aGUgZ2VuZXJpYyBNY0JTUCBvbmUsCisgKiB0aGlzIHdyYXBwZXIganVzdCBuZWVkIGFuIG9tYXBfbWNic3Bfc3BpX2NmZyBzdHJ1Y3R1cmUgYXMgYW4gaW5wdXQuCisgKiBPbmNlIHRoaXMgaXMgZG9uZSwgeW91IGNhbiBjYWxsIG9tYXBfbWNic3Bfc3RhcnQoKS4KKyAqLwordm9pZCBvbWFwX21jYnNwX3NldF9zcGlfbW9kZSh1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IHN0cnVjdCBvbWFwX21jYnNwX3NwaV9jZmcgKiBzcGlfY2ZnKQoreworCXN0cnVjdCBvbWFwX21jYnNwX3JlZ19jZmcgbWNic3BfY2ZnOworCisJaWYgKG9tYXBfbWNic3BfY2hlY2soaWQpIDwgMCkKKwkJcmV0dXJuOworCisJbWVtc2V0KCZtY2JzcF9jZmcsIDAsIHNpemVvZihzdHJ1Y3Qgb21hcF9tY2JzcF9yZWdfY2ZnKSk7CisKKwkvKiBTUEkgaGFzIG9ubHkgb25lIGZyYW1lICovCisJbWNic3BfY2ZnLnJjcjEgfD0gKFJXRExFTjEoc3BpX2NmZy0+d29yZF9sZW5ndGgpIHwgUkZSTEVOMSgwKSk7CisJbWNic3BfY2ZnLnhjcjEgfD0gKFhXRExFTjEoc3BpX2NmZy0+d29yZF9sZW5ndGgpIHwgWEZSTEVOMSgwKSk7CisKKyAgICAgICAgLyogQ2xvY2sgc3RvcCBtb2RlICovCisJaWYgKHNwaV9jZmctPmNsa19zdHBfbW9kZSA9PSBPTUFQX01DQlNQX0NMS19TVFBfTU9ERV9OT19ERUxBWSkKKwkJbWNic3BfY2ZnLnNwY3IxIHw9ICgxIDw8IDEyKTsKKwllbHNlCisJCW1jYnNwX2NmZy5zcGNyMSB8PSAoMyA8PCAxMSk7CisKKwkvKiBTZXQgY2xvY2sgcGFyaXRpZXMgKi8KKwlpZiAoc3BpX2NmZy0+cnhfY2xvY2tfcG9sYXJpdHkgPT0gT01BUF9NQ0JTUF9DTEtfUklTSU5HKQorCQltY2JzcF9jZmcucGNyMCB8PSBDTEtSUDsKKwllbHNlCisJCW1jYnNwX2NmZy5wY3IwICY9IH5DTEtSUDsKKworCWlmIChzcGlfY2ZnLT50eF9jbG9ja19wb2xhcml0eSA9PSBPTUFQX01DQlNQX0NMS19SSVNJTkcpCisJCW1jYnNwX2NmZy5wY3IwICY9IH5DTEtYUDsKKwllbHNlCisJCW1jYnNwX2NmZy5wY3IwIHw9IENMS1hQOworCisJLyogU2V0IFNDTEtNRSB0byAwIGFuZCBDTEtTTSB0byAxICovCisJbWNic3BfY2ZnLnBjcjAgJj0gflNDTEtNRTsKKwltY2JzcF9jZmcuc3JncjIgfD0gQ0xLU007CisKKwkvKiBTZXQgRlNYUCAqLworCWlmIChzcGlfY2ZnLT5mc3hfcG9sYXJpdHkgPT0gT01BUF9NQ0JTUF9GU19BQ1RJVkVfSElHSCkKKwkJbWNic3BfY2ZnLnBjcjAgJj0gfkZTWFA7CisJZWxzZQorCQltY2JzcF9jZmcucGNyMCB8PSBGU1hQOworCisJaWYgKHNwaV9jZmctPnNwaV9tb2RlID09IE9NQVBfTUNCU1BfU1BJX01BU1RFUikgeworCQltY2JzcF9jZmcucGNyMCB8PSBDTEtYTTsKKwkJbWNic3BfY2ZnLnNyZ3IxIHw9IENMS0dEVihzcGlfY2ZnLT5jbGtfZGl2IC0xKTsKKwkJbWNic3BfY2ZnLnBjcjAgfD0gRlNYTTsKKwkJbWNic3BfY2ZnLnNyZ3IyICY9IH5GU0dNOworCQltY2JzcF9jZmcueGNyMiB8PSBYREFURExZKDEpOworCQltY2JzcF9jZmcucmNyMiB8PSBSREFURExZKDEpOworCX0KKwllbHNlIHsKKwkJbWNic3BfY2ZnLnBjcjAgJj0gfkNMS1hNOworCQltY2JzcF9jZmcuc3JncjEgfD0gQ0xLR0RWKDEpOworCQltY2JzcF9jZmcucGNyMCAmPSB+RlNYTTsKKwkJbWNic3BfY2ZnLnhjcjIgJj0gflhEQVRETFkoMyk7CisJCW1jYnNwX2NmZy5yY3IyICY9IH5SREFURExZKDMpOworCX0KKworCW1jYnNwX2NmZy54Y3IyICY9IH5YUEhBU0U7CisJbWNic3BfY2ZnLnJjcjIgJj0gflJQSEFTRTsKKworCW9tYXBfbWNic3BfY29uZmlnKGlkLCAmbWNic3BfY2ZnKTsKK30KKworCisvKgorICogTWNCU1AxIGFuZCBNY0JTUDMgYXJlIGRpcmVjdGx5IG1hcHBlZCBvbiAxNjEwIGFuZCAxNTEwLgorICogNzMwIGhhcyBvbmx5IDIgTWNCU1AsIGFuZCBib3RoIG9mIHRoZW0gYXJlIE1QVSBwZXJpcGhlcmFscy4KKyAqLworc3RydWN0IG9tYXBfbWNic3BfaW5mbyB7CisJdTMyIHZpcnRfYmFzZTsKKwl1OCBkbWFfcnhfc3luYywgZG1hX3R4X3N5bmM7CisJdTE2IHJ4X2lycSwgdHhfaXJxOworfTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVA3MzAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvIG1jYnNwXzczMFtdID0geworCVswXSA9IHsgLnZpcnRfYmFzZSA9IGlvX3AydihPTUFQNzMwX01DQlNQMV9CQVNFKSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDFfVFgsCisJCS5yeF9pcnEgPSBJTlRfNzMwX01jQlNQMVJYLAorCQkudHhfaXJxID0gSU5UXzczMF9NY0JTUDFUWCB9LAorCVsxXSA9IHsgLnZpcnRfYmFzZSA9IGlvX3AydihPTUFQNzMwX01DQlNQMl9CQVNFKSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AzX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfVFgsCisJCS5yeF9pcnEgPSBJTlRfNzMwX01jQlNQMlJYLAorCQkudHhfaXJxID0gSU5UXzczMF9NY0JTUDJUWCB9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvIG1jYnNwXzE1MTBbXSA9IHsKKwlbMF0gPSB7IC52aXJ0X2Jhc2UgPSBPTUFQMTUxMF9NQ0JTUDFfQkFTRSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDFfVFgsCisJCS5yeF9pcnEgPSBJTlRfTWNCU1AxUlgsCisJCS50eF9pcnEgPSBJTlRfTWNCU1AxVFggfSwKKwlbMV0gPSB7IC52aXJ0X2Jhc2UgPSBpb19wMnYoT01BUDE1MTBfTUNCU1AyX0JBU0UpLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDJfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQMl9UWCwKKwkJLnJ4X2lycSA9IElOVF8xNTEwX1NQSV9SWCwKKwkJLnR4X2lycSA9IElOVF8xNTEwX1NQSV9UWCB9LAorCVsyXSA9IHsgLnZpcnRfYmFzZSA9IE9NQVAxNTEwX01DQlNQM19CQVNFLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQM19UWCwKKwkJLnJ4X2lycSA9IElOVF9NY0JTUDNSWCwKKwkJLnR4X2lycSA9IElOVF9NY0JTUDNUWCB9LAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvIG1jYnNwXzE2MTBbXSA9IHsKKwlbMF0gPSB7IC52aXJ0X2Jhc2UgPSBPTUFQMTYxMF9NQ0JTUDFfQkFTRSwKKwkJLmRtYV9yeF9zeW5jID0gT01BUF9ETUFfTUNCU1AxX1JYLAorCQkuZG1hX3R4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDFfVFgsCisJCS5yeF9pcnEgPSBJTlRfTWNCU1AxUlgsCisJCS50eF9pcnEgPSBJTlRfTWNCU1AxVFggfSwKKwlbMV0gPSB7IC52aXJ0X2Jhc2UgPSBpb19wMnYoT01BUDE2MTBfTUNCU1AyX0JBU0UpLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDJfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQMl9UWCwKKwkJLnJ4X2lycSA9IElOVF8xNjEwX01jQlNQMl9SWCwKKwkJLnR4X2lycSA9IElOVF8xNjEwX01jQlNQMl9UWCB9LAorCVsyXSA9IHsgLnZpcnRfYmFzZSA9IE9NQVAxNjEwX01DQlNQM19CQVNFLAorCQkuZG1hX3J4X3N5bmMgPSBPTUFQX0RNQV9NQ0JTUDNfUlgsCisJCS5kbWFfdHhfc3luYyA9IE9NQVBfRE1BX01DQlNQM19UWCwKKwkJLnJ4X2lycSA9IElOVF9NY0JTUDNSWCwKKwkJLnR4X2lycSA9IElOVF9NY0JTUDNUWCB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBvbWFwX21jYnNwX2luaXQodm9pZCkKK3sKKwlpbnQgbWNic3BfY291bnQgPSAwLCBpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb21hcF9tY2JzcF9pbmZvICptY2JzcF9pbmZvOworCisJcHJpbnRrKCJJbml0aWFsaXppbmcgT01BUCBNY0JTUCBzeXN0ZW1cbiIpOworCisJbWNic3BfZHNwX2NrID0gY2xrX2dldCgwLCAiZHNwX2NrIik7CisJaWYgKElTX0VSUihtY2JzcF9kc3BfY2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWNic3A6IGNvdWxkIG5vdCBhY3F1aXJlIGRzcF9jayBoYW5kbGUuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobWNic3BfZHNwX2NrKTsKKwl9CisJbWNic3BfYXBpX2NrID0gY2xrX2dldCgwLCAiYXBpX2NrIik7CisJaWYgKElTX0VSUihtY2JzcF9hcGlfY2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWNic3A6IGNvdWxkIG5vdCBhY3F1aXJlIGFwaV9jayBoYW5kbGUuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobWNic3BfYXBpX2NrKTsKKwl9CisJbWNic3BfZHNweG9yX2NrID0gY2xrX2dldCgwLCAiZHNweG9yX2NrIik7CisJaWYgKElTX0VSUihtY2JzcF9kc3B4b3JfY2spKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWNic3A6IGNvdWxkIG5vdCBhY3F1aXJlIGRzcHhvcl9jayBoYW5kbGUuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobWNic3BfZHNweG9yX2NrKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpIHsKKwkJbWNic3BfaW5mbyA9IG1jYnNwXzczMDsKKwkJbWNic3BfY291bnQgPSBBUlJBWV9TSVpFKG1jYnNwXzczMCk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJbWNic3BfaW5mbyA9IG1jYnNwXzE1MTA7CisJCW1jYnNwX2NvdW50ID0gQVJSQVlfU0laRShtY2JzcF8xNTEwKTsKKwl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgeworCQltY2JzcF9pbmZvID0gbWNic3BfMTYxMDsKKwkJbWNic3BfY291bnQgPSBBUlJBWV9TSVpFKG1jYnNwXzE2MTApOworCX0KKyNlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBPTUFQX01BWF9NQ0JTUF9DT1VOVCA7IGkrKykgeworCQlpZiAoaSA+PSBtY2JzcF9jb3VudCkgeworCQkJbWNic3BbaV0uaW9fYmFzZSA9IDA7CisJCQltY2JzcFtpXS5mcmVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCQl9CisJCW1jYnNwW2ldLmlkID0gaSArIDE7CisJCW1jYnNwW2ldLmZyZWUgPSAxOworCQltY2JzcFtpXS5kbWFfdHhfbGNoID0gLTE7CisJCW1jYnNwW2ldLmRtYV9yeF9sY2ggPSAtMTsKKworCQltY2JzcFtpXS5pb19iYXNlID0gbWNic3BfaW5mb1tpXS52aXJ0X2Jhc2U7CisJCW1jYnNwW2ldLnR4X2lycSA9IG1jYnNwX2luZm9baV0udHhfaXJxOworCQltY2JzcFtpXS5yeF9pcnEgPSBtY2JzcF9pbmZvW2ldLnJ4X2lycTsKKwkJbWNic3BbaV0uZG1hX3J4X3N5bmMgPSBtY2JzcF9pbmZvW2ldLmRtYV9yeF9zeW5jOworCQltY2JzcFtpXS5kbWFfdHhfc3luYyA9IG1jYnNwX2luZm9baV0uZG1hX3R4X3N5bmM7CisJCXNwaW5fbG9ja19pbml0KCZtY2JzcFtpXS5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCithcmNoX2luaXRjYWxsKG9tYXBfbWNic3BfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9jb25maWcpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3JlcXVlc3QpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX2ZyZWUpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zdG9wKTsKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF94bWl0X3dvcmQpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3JlY3Zfd29yZCk7CitFWFBPUlRfU1lNQk9MKG9tYXBfbWNic3BfeG1pdF9idWZmZXIpOworRVhQT1JUX1NZTUJPTChvbWFwX21jYnNwX3JlY3ZfYnVmZmVyKTsKK0VYUE9SVF9TWU1CT0wob21hcF9tY2JzcF9zZXRfc3BpX21vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhN2I5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKKyAqCisgKiBVdGlsaXR5IHRvIHNldCB0aGUgT21hcCBNVVggYW5kIFBVTExfRFdOIHJlZ2lzdGVycyBmcm9tIGEgdGFibGUgaW4gbXV4LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBXcml0dGVuIGJ5IFRvbnkgTGluZGdyZW4gPHRvbnkubGluZGdyZW5Abm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgX19NVVhfQ19fCisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisKKyNpZmRlZiBDT05GSUdfT01BUF9NVVgKKworLyoKKyAqIFNldHMgdGhlIE9tYXAgTVVYIGFuZCBQVUxMX0RXTiByZWdpc3RlcnMgYmFzZWQgb24gdGhlIHRhYmxlCisgKi8KK2ludCBfX2luaXRfb3JfbW9kdWxlCitvbWFwX2NmZ19yZWcoY29uc3QgcmVnX2NmZ190IHJlZ19jZmcpCit7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhtdXhfc3Bpbl9sb2NrKTsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJcmVnX2NmZ19zZXQgKmNmZzsKKwl1bnNpZ25lZCBpbnQgcmVnX29yaWcgPSAwLCByZWcgPSAwLCBwdV9wZF9vcmlnID0gMCwgcHVfcGQgPSAwLAorCQlwdWxsX29yaWcgPSAwLCBwdWxsID0gMDsKKwl1bnNpZ25lZCBpbnQgbWFzaywgd2FybiA9IDA7CisKKwlpZiAocmVnX2NmZyA+IEFSUkFZX1NJWkUocmVnX2NmZ190YWJsZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNVVg6IHJlZ19jZmcgJWRcbiIsIHJlZ19jZmcpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZmcgPSAocmVnX2NmZ19zZXQgKikmcmVnX2NmZ190YWJsZVtyZWdfY2ZnXTsKKworCS8qIENoZWNrIHRoZSBtdXggcmVnaXN0ZXIgaW4gcXVlc3Rpb24gKi8KKwlpZiAoY2ZnLT5tdXhfcmVnKSB7CisJCXVuc2lnbmVkCXRtcDEsIHRtcDI7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKKwkJcmVnX29yaWcgPSBvbWFwX3JlYWRsKGNmZy0+bXV4X3JlZyk7CisKKwkJLyogVGhlIG11eCByZWdpc3RlcnMgYWx3YXlzIHNlZW0gdG8gYmUgMyBiaXRzIGxvbmcgKi8KKwkJbWFzayA9ICgweDcgPDwgY2ZnLT5tYXNrX29mZnNldCk7CisJCXRtcDEgPSByZWdfb3JpZyAmIG1hc2s7CisJCXJlZyA9IHJlZ19vcmlnICYgfm1hc2s7CisKKwkJdG1wMiA9IChjZmctPm1hc2sgPDwgY2ZnLT5tYXNrX29mZnNldCk7CisJCXJlZyB8PSB0bXAyOworCisJCWlmICh0bXAxICE9IHRtcDIpCisJCQl3YXJuID0gMTsKKworCQlvbWFwX3dyaXRlbChyZWcsIGNmZy0+bXV4X3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKKwl9CisKKwkvKiBDaGVjayBmb3IgcHVsbCB1cCBvciBwdWxsIGRvd24gc2VsZWN0aW9uIG9uIDE2MTAgKi8KKwlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWlmIChjZmctPnB1X3BkX3JlZyAmJiBjZmctPnB1bGxfdmFsKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXV4X3NwaW5fbG9jaywgZmxhZ3MpOworCQkJcHVfcGRfb3JpZyA9IG9tYXBfcmVhZGwoY2ZnLT5wdV9wZF9yZWcpOworCQkJbWFzayA9IDEgPDwgY2ZnLT5wdWxsX2JpdDsKKworCQkJaWYgKGNmZy0+cHVfcGRfdmFsKSB7CisJCQkJaWYgKCEocHVfcGRfb3JpZyAmIG1hc2spKQorCQkJCQl3YXJuID0gMTsKKwkJCQkvKiBVc2UgcHVsbCB1cCAqLworCQkJCXB1X3BkID0gcHVfcGRfb3JpZyB8IG1hc2s7CisJCQl9IGVsc2UgeworCQkJCWlmIChwdV9wZF9vcmlnICYgbWFzaykKKwkJCQkJd2FybiA9IDE7CisJCQkJLyogVXNlIHB1bGwgZG93biAqLworCQkJCXB1X3BkID0gcHVfcGRfb3JpZyAmIH5tYXNrOworCQkJfQorCQkJb21hcF93cml0ZWwocHVfcGQsIGNmZy0+cHVfcGRfcmVnKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKKwkJfQorCX0KKworCS8qIENoZWNrIGZvciBhbiBhc3NvY2lhdGVkIHB1bGwgZG93biByZWdpc3RlciAqLworCWlmIChjZmctPnB1bGxfcmVnKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZtdXhfc3Bpbl9sb2NrLCBmbGFncyk7CisJCXB1bGxfb3JpZyA9IG9tYXBfcmVhZGwoY2ZnLT5wdWxsX3JlZyk7CisJCW1hc2sgPSAxIDw8IGNmZy0+cHVsbF9iaXQ7CisKKwkJaWYgKGNmZy0+cHVsbF92YWwpIHsKKwkJCWlmIChwdWxsX29yaWcgJiBtYXNrKQorCQkJCXdhcm4gPSAxOworCQkJLyogTG93IGJpdCA9IHB1bGwgZW5hYmxlZCAqLworCQkJcHVsbCA9IHB1bGxfb3JpZyAmIH5tYXNrOworCQl9IGVsc2UgeworCQkJaWYgKCEocHVsbF9vcmlnICYgbWFzaykpCisJCQkJd2FybiA9IDE7CisJCQkvKiBIaWdoIGJpdCA9IHB1bGwgZGlzYWJsZWQgKi8KKwkJCXB1bGwgPSBwdWxsX29yaWcgfCBtYXNrOworCQl9CisKKwkJb21hcF93cml0ZWwocHVsbCwgY2ZnLT5wdWxsX3JlZyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11eF9zcGluX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAod2FybikgeworI2lmZGVmIENPTkZJR19PTUFQX01VWF9XQVJOSU5HUworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNVVg6IGluaXRpYWxpemVkICVzXG4iLCBjZmctPm5hbWUpOworI2VuZGlmCisJfQorCisjaWZkZWYgQ09ORklHX09NQVBfTVVYX0RFQlVHCisJaWYgKGNmZy0+ZGVidWcgfHwgd2FybikgeworCQlwcmludGsoIk1VWDogU2V0dGluZyByZWdpc3RlciAlc1xuIiwgY2ZnLT5uYW1lKTsKKwkJcHJpbnRrKCIgICAgICAlcyAoMHglMDh4KSA9IDB4JTA4eCAtPiAweCUwOHhcbiIsCisJCSAgICAgICBjZmctPm11eF9yZWdfbmFtZSwgY2ZnLT5tdXhfcmVnLCByZWdfb3JpZywgcmVnKTsKKworCQlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKSB7CisJCQlpZiAoY2ZnLT5wdV9wZF9yZWcgJiYgY2ZnLT5wdWxsX3ZhbCkgeworCQkJCXByaW50aygiICAgICAgJXMgKDB4JTA4eCkgPSAweCUwOHggLT4gMHglMDh4XG4iLAorCQkJCSAgICAgICBjZmctPnB1X3BkX25hbWUsIGNmZy0+cHVfcGRfcmVnLAorCQkJCSAgICAgICBwdV9wZF9vcmlnLCBwdV9wZCk7CisJCQl9CisJCX0KKworCQlpZiAoY2ZnLT5wdWxsX3JlZykKKwkJCXByaW50aygiICAgICAgJXMgKDB4JTA4eCkgPSAweCUwOHggLT4gMHglMDh4XG4iLAorCQkJICAgICAgIGNmZy0+cHVsbF9uYW1lLCBjZmctPnB1bGxfcmVnLCBwdWxsX29yaWcsIHB1bGwpOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09NQVBfTVVYX0VSUk9SUworCXJldHVybiB3YXJuID8gLUVUWFRCU1kgOiAwOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MKG9tYXBfY2ZnX3JlZyk7CisKKyNlbmRpZgkvKiBDT05GSUdfT01BUF9NVVggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjE2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYworICoKKyAqIE1pbmltYWwgT0NQIGJ1cyBzdXBwb3J0IGZvciBvbWFwMTZ4eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCisgKiBNb2RpZmllZCBmb3IgY2xvY2sgZnJhbWV3b3JrIGJ5IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisjZGVmaW5lIE9DUElfQkFTRQkJMHhmZmZlYzMyMAorI2RlZmluZSBPQ1BJX0ZBVUxUCQkoT0NQSV9CQVNFICsgMHgwMCkKKyNkZWZpbmUgT0NQSV9DTURfRkFVTFQJCShPQ1BJX0JBU0UgKyAweDA0KQorI2RlZmluZSBPQ1BJX1NJTlQwCQkoT0NQSV9CQVNFICsgMHgwOCkKKyNkZWZpbmUgT0NQSV9UQUJPUlQJCShPQ1BJX0JBU0UgKyAweDBjKQorI2RlZmluZSBPQ1BJX1NJTlQxCQkoT0NQSV9CQVNFICsgMHgxMCkKKyNkZWZpbmUgT0NQSV9QUk9UCQkoT0NQSV9CQVNFICsgMHgxNCkKKyNkZWZpbmUgT0NQSV9TRUMJCShPQ1BJX0JBU0UgKyAweDE4KQorCisvKiBVU0IgT0hDSSBPQ1BJIGFjY2VzcyBlcnJvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSE9TVFVFQUREUgkweGZmZmJhMGUwCisjZGVmaW5lIEhPU1RVRVNUQVRVUwkweGZmZmJhMGU0CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpvY3BpX2NrOworCisvKgorICogRW5hYmxlcyBkZXZpY2UgYWNjZXNzIHRvIE9NQVAgYnVzZXMgdmlhIHRoZSBPQ1BJIGJyaWRnZQorICogRklYTUU6IEFkZCBsb2NraW5nCisgKi8KK2ludCBvY3BpX2VuYWJsZSh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGNsb2NrIGZvciBPQ1BJICovCisJY2xrX2VuYWJsZShvY3BpX2NrKTsKKworCS8qIEVuYWJsZSBhY2Nlc3MgZm9yIE9IQ0kgaW4gT0NQSSAqLworCXZhbCA9IG9tYXBfcmVhZGwoT0NQSV9QUk9UKTsKKwl2YWwgJj0gfjB4ZmY7CisJLy92YWwgJj0gKDEgPDwgMCk7CS8qIEFsbG93IGFjY2VzcyBvbmx5IHRvIEVNSUZTICovCisJb21hcF93cml0ZWwodmFsLCBPQ1BJX1BST1QpOworCisJdmFsID0gb21hcF9yZWFkbChPQ1BJX1NFQyk7CisJdmFsICY9IH4weGZmOworCW9tYXBfd3JpdGVsKHZhbCwgT0NQSV9TRUMpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG9jcGlfZW5hYmxlKTsKKworc3RhdGljIGludCBfX2luaXQgb21hcF9vY3BpX2luaXQodm9pZCkKK3sKKwlpZiAoIWNwdV9pc19vbWFwMTZ4eCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9jcGlfY2sgPSBjbGtfZ2V0KE5VTEwsICJsM19vY3BpX2NrIik7CisJaWYgKElTX0VSUihvY3BpX2NrKSkKKwkJcmV0dXJuIFBUUl9FUlIob2NwaV9jayk7CisKKwljbGtfdXNlKG9jcGlfY2spOworCW9jcGlfZW5hYmxlKCk7CisJcHJpbnRrKCJPTUFQIE9DUEkgaW50ZXJjb25uZWN0IGRyaXZlciBsb2FkZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvbWFwX29jcGlfZXhpdCh2b2lkKQoreworCS8qIFJFVklTSVQ6IERpc2FibGUgT0NQSSAqLworCisJaWYgKCFjcHVfaXNfb21hcDE2eHgoKSkKKwkJcmV0dXJuOworCisJY2xrX3VudXNlKG9jcGlfY2spOworCWNsa19wdXQob2NwaV9jayk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlRvbnkgTGluZGdyZW4gPHRvbnlAYXRvbWlkZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgT0NQSSBidXMgY29udHJvbGxlciBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KG9tYXBfb2NwaV9pbml0KTsKK21vZHVsZV9leGl0KG9tYXBfb2NwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9wbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1MzZiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9wbS5jCkBAIC0wLDAgKzEsNjMyIEBACisvKgorICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKKyAqCisgKiBPTUFQIFBvd2VyIE1hbmFnZW1lbnQgUm91dGluZXMKKyAqCisgKiBPcmlnaW5hbCBjb2RlIGZvciB0aGUgU0ExMXgwOgorICogQ29weXJpZ2h0IChjKSAyMDAxIENsaWZmIEJyYWtlIDxjYnJha2VAYWNjZWxlbnQuY29tPgorICoKKyAqIE1vZGlmaWVkIGZvciB0aGUgUFhBMjUwIGJ5IE5pY29sYXMgUGl0cmU6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTW9udGEgVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBNb2RpZmllZCBmb3IgdGhlIE9NQVAxNTEwIGJ5IERhdmlkIFNpbmdsZXRvbjoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIENsZWFudXAgMjAwNCBmb3IgT01BUDE1MTAvMTYxMCBieSBEaXJrIEJlaG1lIDxkaXJrLmJlaG1lQGRlLmJvc2NoLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMTZ4eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3BtLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC90cHM2NTAxMC5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKworc3RhdGljIHVuc2lnbmVkIGludCBhcm1fc2xlZXBfc2F2ZVtBUk1fU0xFRVBfU0FWRV9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB1bHBkX3NsZWVwX3NhdmVbVUxQRF9TTEVFUF9TQVZFX1NJWkVdOworc3RhdGljIHVuc2lnbmVkIGludCBtcHVpMTUxMF9zbGVlcF9zYXZlW01QVUkxNTEwX1NMRUVQX1NBVkVfU0laRV07CitzdGF0aWMgdW5zaWduZWQgaW50IG1wdWkxNjEwX3NsZWVwX3NhdmVbTVBVSTE2MTBfU0xFRVBfU0FWRV9TSVpFXTsKKworLyoKKyAqIExldCdzIHBvd2VyIGRvd24gb24gaWRsZSwgYnV0IG9ubHkgaWYgd2UgYXJlIHJlYWxseQorICogaWRsZSwgYmVjYXVzZSBvbmNlIHdlIHN0YXJ0IGRvd24gdGhlIHBhdGggb2YKKyAqIGdvaW5nIGlkbGUgd2UgY29udGludWUgdG8gZG8gaWRsZSBldmVuIGlmIHdlIGdldAorICogYSBjbG9jayB0aWNrIGludGVycnVwdCAuIC4KKyAqLwordm9pZCBvbWFwX3BtX2lkbGUodm9pZCkKK3sKKwlpbnQgKCpmdW5jX3B0cikodm9pZCkgPSAwOworCXVuc2lnbmVkIGludCBtYXNrMzIgPSAwOworCisJLyoKKwkgKiBJZiB0aGUgRFNQIGlzIGJlaW5nIHVzZWQgbGV0J3MganVzdCBpZGxlIHRoZSBDUFUsIHRoZSBvdmVyaGVhZAorCSAqIHRvIHdha2UgdXAgZnJvbSBCaWcgU2xlZXAgaXMgYmlnLCBtaWxsaXNlY29uZHMgdmVyc3VzIG1pY3JvCisJICogc2Vjb25kcyBmb3Igd2FpdCBmb3IgaW50ZXJydXB0LgorCSAqLworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsb2NhbF9maXFfZGlzYWJsZSgpOworCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQlsb2NhbF9maXFfZW5hYmxlKCk7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcmV0dXJuOworCX0KKwltYXNrMzIgPSBvbWFwX3JlYWRsKEFSTV9TWVNTVCk7CisKKwkvKgorCSAqIFNpbmNlIGFuIGludGVycnVwdCBtYXkgc2V0IHVwIGEgdGltZXIsIHdlIGRvbid0IHdhbnQgdG8KKwkgKiByZXByb2dyYW0gdGhlIGhhcmR3YXJlIHRpbWVyIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgorCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gaWRsZS4KKwkgKi8KKwl0aW1lcl9keW5fcmVwcm9ncmFtKCk7CisKKwlpZiAoKG1hc2szMiAmIERTUF9JRExFKSA9PSAwKSB7CisJCV9fYXNtX18gdm9sYXRpbGUgKCJtY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0Iik7CisJfSBlbHNlIHsKKworCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQpOworCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5EKTsKKwkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDU5MTIoKSkgeworCQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCk7CisJCX0KKworCQlmdW5jX3B0cigpOworCX0KKwlsb2NhbF9maXFfZW5hYmxlKCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCisvKgorICogQ29uZmlndXJhdGlvbiBvZiB0aGUgd2FrZXVwIGV2ZW50IGlzIGJvYXJkIHNwZWNpZmljLiBGb3IgdGhlCisgKiBtb21lbnQgd2UgcHV0IGl0IGludG8gdGhpcyBoZWxwZXIgZnVuY3Rpb24uIExhdGVyIGl0IG1heSBtb3ZlCisgKiB0byBib2FyZCBzcGVjaWZpYyBmaWxlcy4KKyAqLworc3RhdGljIHZvaWQgb21hcF9wbV93YWtldXBfc2V0dXAodm9pZCkKK3sKKwkvKgorCSAqIEVuYWJsZSBBUk0gWE9SIGNsb2NrIGFuZCByZWxlYXNlIHBlcmlwaGVyYWwgZnJvbSByZXNldCBieQorCSAqIHdyaXRpbmcgMSB0byBQRVJfRU4gYml0IGluIEFSTV9SU1RDVDIsIHRoaXMgaXMgcmVxdWlyZWQKKwkgKiBmb3IgVUFSVCBjb25maWd1cmF0aW9uIHRvIHVzZSBVQVJUMiB0byB3YWtlIHVwLgorCSAqLworCisJb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCBFTkFCTEVfWE9SQ0xLLCBBUk1fSURMRUNUMik7CisJb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fUlNUQ1QyKSB8IFBFUl9FTiwgQVJNX1JTVENUMik7CisJb21hcF93cml0ZXcoTU9ERU1fMzJLX0VOLCBVTFBEX0NMT0NLX0NUUkwpOworCisJLyoKKwkgKiBUdXJuIG9mZiBhbGwgaW50ZXJydXB0cyBleGNlcHQgTDEtMm5kIGxldmVsIGNhc2NhZGUsCisJICogYW5kIHRoZSBMMiB3YWtldXAgaW50ZXJydXB0czoga2V5cGFkIGFuZCBVQVJUMi4KKwkgKi8KKworCW9tYXBfd3JpdGVsKH5JUlFfTEVWRUwyLCBPTUFQX0lIMV9NSVIpOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW9tYXBfd3JpdGVsKH4oSVJRX1VBUlQyIHwgSVJRX0tFWUJPQVJEKSwgIE9NQVBfSUgyX01JUik7CisJfQorCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCW9tYXBfd3JpdGVsKH4oSVJRX1VBUlQyIHwgSVJRX0tFWUJPQVJEKSwgT01BUF9JSDJfMF9NSVIpOworCisJCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzFfTUlSKTsKKwkJb21hcF93cml0ZWwofjB4MCwgT01BUF9JSDJfMl9NSVIpOworCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8zX01JUik7CisJfQorCisJLyogIE5ldyBJUlEgYWdyZWVtZW50ICovCisgCW9tYXBfd3JpdGVsKDEsIE9NQVBfSUgxX0NPTlRST0wpOworCisJLyogZXh0ZXJuYWwgUFVMTCB0byBkb3duLCBiaXQgMjIgPSAwICovCisJb21hcF93cml0ZWwob21hcF9yZWFkbChQVUxMX0RXTl9DVFJMXzIpICYgfigxPDwyMiksIFBVTExfRFdOX0NUUkxfMik7Cit9CisKK3ZvaWQgb21hcF9wbV9zdXNwZW5kKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG1hc2szMiA9IDA7CisJdW5zaWduZWQgbG9uZyBhcmcwID0gMCwgYXJnMSA9IDA7CisJaW50ICgqZnVuY19wdHIpKHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCkgPSAwOworCXVuc2lnbmVkIHNob3J0IHNhdmVfZHNwX2lkbGVjdDI7CisKKwlwcmludGsoIlBNOiBPTUFQJXggaXMgZW50ZXJpbmcgZGVlcCBzbGVlcCBub3cgLi4uXG4iLCBzeXN0ZW1fcmV2KTsKKworCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKKwkJLyogU3RvcCBMRUQxIChEOSkgYmxpbmsgKi8KKwkJdHBzNjUwMTBfc2V0X2xlZChMRUQxLCBPRkYpOworCX0KKworCS8qCisJICogU3RlcCAxOiB0dXJuIG9mZiBpbnRlcnJ1cHRzCisJICovCisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxvY2FsX2ZpcV9kaXNhYmxlKCk7CisKKwkvKgorCSAqIFN0ZXAgMjogc2F2ZSByZWdpc3RlcnMKKwkgKgorCSAqIFRoZSBvbWFwIGlzIGEgc3RyYW5nZS9iZWF1dGlmdWwgZGV2aWNlLiBUaGUgY2FjaGVzLCBtZW1vcnkKKwkgKiBhbmQgcmVnaXN0ZXIgc3RhdGUgYXJlIHByZXNlcnZlZCBhY3Jvc3MgcG93ZXIgc2F2ZXMuCisJICogV2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHZlcnkgbGl0dGxlIHJlZ2lzdGVyIHN0YXRlIHRvCisJICogaWRsZSB0aGUgb21hcC4KKyAgICAgICAgICoKKyAJICogU2F2ZSBpbnRlcnJ1cHQsIE1QVUksIEFSTSBhbmQgVVBMRCBjb250cm9sIHJlZ2lzdGVycy4KKwkgKi8KKworCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlNUFVJMTUxMF9TQVZFKE9NQVBfSUgxX01JUik7CisJCU1QVUkxNTEwX1NBVkUoT01BUF9JSDJfTUlSKTsKKwkJTVBVSTE1MTBfU0FWRShNUFVJX0NUUkwpOworCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKKwkJTVBVSTE1MTBfU0FWRShNUFVJX0RTUF9BUElfQ09ORklHKTsKKwkJTVBVSTE1MTBfU0FWRShFTUlGU19DT05GSUcpOworCQlNUFVJMTUxMF9TQVZFKEVNSUZGX1NEUkFNX0NPTkZJRyk7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgeworCQlNUFVJMTYxMF9TQVZFKE9NQVBfSUgxX01JUik7CisJCU1QVUkxNjEwX1NBVkUoT01BUF9JSDJfMF9NSVIpOworCQlNUFVJMTYxMF9TQVZFKE9NQVBfSUgyXzFfTUlSKTsKKwkJTVBVSTE2MTBfU0FWRShPTUFQX0lIMl8yX01JUik7CisJCU1QVUkxNjEwX1NBVkUoT01BUF9JSDJfM19NSVIpOworCQlNUFVJMTYxMF9TQVZFKE1QVUlfQ1RSTCk7CisJCU1QVUkxNjEwX1NBVkUoTVBVSV9EU1BfQk9PVF9DT05GSUcpOworCQlNUFVJMTYxMF9TQVZFKE1QVUlfRFNQX0FQSV9DT05GSUcpOworCQlNUFVJMTYxMF9TQVZFKEVNSUZTX0NPTkZJRyk7CisJCU1QVUkxNjEwX1NBVkUoRU1JRkZfU0RSQU1fQ09ORklHKTsKKwl9CisKKwlBUk1fU0FWRShBUk1fQ0tDVEwpOworCUFSTV9TQVZFKEFSTV9JRExFQ1QxKTsKKwlBUk1fU0FWRShBUk1fSURMRUNUMik7CisJQVJNX1NBVkUoQVJNX0VXVVBDVCk7CisJQVJNX1NBVkUoQVJNX1JTVENUMSk7CisJQVJNX1NBVkUoQVJNX1JTVENUMik7CisJQVJNX1NBVkUoQVJNX1NZU1NUKTsKKwlVTFBEX1NBVkUoVUxQRF9DTE9DS19DVFJMKTsKKwlVTFBEX1NBVkUoVUxQRF9TVEFUVVNfUkVRKTsKKworCS8qCisJICogU3RlcCAzOiBMT1dfUFdSIHNpZ25hbCBlbmFibGluZworCSAqCisJICogQWxsb3cgdGhlIExPV19QV1Igc2lnbmFsIHRvIGJlIHZpc2libGUgb24gTVBVSU81IGJhbGwuCisJICovCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgxIChMT1dfUE9XRVIgaXMgYXZhaWxhYmxlKSAqLworCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KFVMUERfUE9XRVJfQ1RSTCkgfAorCQkJICAgIE9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgxIChMT1dfUE9XRVIgaXMgYXZhaWxhYmxlKSAqLworCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KFVMUERfUE9XRVJfQ1RSTCkgfAorCQkJICAgIE9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKKwl9CisKKwkvKiBjb25maWd1cmUgTE9XX1BXUiBwaW4gKi8KKwlvbWFwX2NmZ19yZWcoVDIwXzE2MTBfTE9XX1BXUik7CisKKwkvKgorCSAqIFN0ZXAgNDogT01BUCBEU1AgU2h1dGRvd24KKwkgKi8KKworCS8qIFNldCBEU1BfUlNUID0gMSBhbmQgRFNQX0VOID0gMCwgcHV0IERTUCBibG9jayBpbnRvIHJlc2V0ICovCisJb21hcF93cml0ZWwoKG9tYXBfcmVhZGwoQVJNX1JTVENUMSkgfCBEU1BfUlNUKSAmIH5EU1BfRU5BQkxFLAorCQkgICAgQVJNX1JTVENUMSk7CisKKwkvKiBTZXQgRFNQIGJvb3QgbW9kZSB0byBEU1AtSURMRSwgRFNQX0JPT1RfTU9ERSA9IDB4MiAqLworICAgICAgICBvbWFwX3dyaXRlbChEU1BfSURMRV9NT0RFLCBNUFVJX0RTUF9CT09UX0NPTkZJRyk7CisKKwkvKiBTZXQgRU5fRFNQQ0sgPSAwLCBzdG9wIERTUCBibG9jayBjbG9jayAqLworCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0NLQ1RMKSAmIH5EU1BfQ0xPQ0tfRU5BQkxFLCBBUk1fQ0tDVEwpOworCisJLyogU3RvcCBhbnkgRFNQIGRvbWFpbiBjbG9ja3MgKi8KKwlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKSB8ICgxPDxFTl9BUElDSyksIEFSTV9JRExFQ1QyKTsKKwlzYXZlX2RzcF9pZGxlY3QyID0gX19yYXdfcmVhZHcoRFNQX0lETEVDVDIpOworCV9fcmF3X3dyaXRldygwLCBEU1BfSURMRUNUMik7CisKKwkvKgorCSAqIFN0ZXAgNTogV2FrZXVwIEV2ZW50IFNldHVwCisJICovCisKKwlvbWFwX3BtX3dha2V1cF9zZXR1cCgpOworCisJLyoKKwkgKiBTdGVwIDZhOiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgorCSAqCisJICogU3RlcCA2IHN0YXJ0cyBoZXJlIHdpdGggY2xvY2sgYW5kIHdhdGNoZG9nIGRpc2FibGUKKwkgKi8KKworCS8qIHN0b3AgY2xvY2tzICovCisJbWFzazMyID0gb21hcF9yZWFkbChBUk1fSURMRUNUMik7CisJbWFzazMyICY9IH4oMTw8RU5fV0RUQ0spOyAgLyogYml0IDAgLT4gMCAoV0RUIGNsb2NrKSAqLworCW1hc2szMiB8PSAgKDE8PEVOX1hPUlBDSyk7IC8qIGJpdCAxIC0+IDEgKFhPUlBDSyBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9QRVJDSyk7ICAvKiBiaXQgMiAtPiAwIChNUFVQRVJfQ0sgY2xvY2spICovCisJbWFzazMyICY9IH4oMTw8RU5fTENEQ0spOyAgLyogYml0IDMgLT4gMCAoTENEQyBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9MQkNLKTsgICAvKiBiaXQgNCAtPiAwIChsb2NhbCBidXMgY2xvY2spICovCisJbWFzazMyIHw9ICAoMTw8RU5fQVBJQ0spOyAgLyogYml0IDYgLT4gMSAoTVBVSSBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9USU1DSyk7ICAvKiBiaXQgNyAtPiAwIChNUFUgdGltZXIgY2xvY2spICovCisJbWFzazMyICY9IH4oMTw8RE1BQ0tfUkVRKTsgLyogYml0IDggLT4gMCAoRE1BQyBjbG9jaykgKi8KKwltYXNrMzIgJj0gfigxPDxFTl9HUElPQ0spOyAvKiBiaXQgOSAtPiAwIChHUElPIGNsb2NrKSAqLworCW9tYXBfd3JpdGVsKG1hc2szMiwgQVJNX0lETEVDVDIpOworCisJLyogZGlzYWJsZSBBUk0gd2F0Y2hkb2cgKi8KKwlvbWFwX3dyaXRlbCgweDAwRjUsIE9NQVBfV0RUX1RJTUVSX01PREUpOworCW9tYXBfd3JpdGVsKDB4MDBBMCwgT01BUF9XRFRfVElNRVJfTU9ERSk7CisKKwkvKgorCSAqIFN0ZXAgNmI6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCisJICoKKwkgKiBTdGVwIDYgY29udGludWVzIGhlcmUuIFByZXBhcmUganVtcCB0byBwb3dlciBtYW5hZ2VtZW50CisJICogYXNzZW1ibHkgY29kZSBpbiBpbnRlcm5hbCBTUkFNLgorCSAqCisJICogU2luY2UgdGhlIG9tYXBfY3B1X3N1c3BlbmQgcm91dGluZSBoYXMgYmVlbiBjb3BpZWQgdG8KKwkgKiBTUkFNLCB3ZSdsbCBkbyBhbiBpbmRpcmVjdCBwcm9jZWR1cmUgY2FsbCB0byBpdCBhbmQgcGFzcyB0aGUKKwkgKiBjb250ZW50cyBvZiBhcm1faWRsZWN0MSBhbmQgYXJtX2lkbGVjdDIgc28gaXQgY2FuIHJlc3RvcmUKKwkgKiB0aGVtIHdoZW4gaXQgd2FrZXMgdXAgYW5kIGl0IHdpbGwgcmV0dXJuLgorCSAqLworCisJYXJnMCA9IGFybV9zbGVlcF9zYXZlW0FSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QxXTsKKwlhcmcxID0gYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfQVJNX0lETEVDVDJdOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCk7CisJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgeworCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQpOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKKwkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5EKTsKKwl9CisKKwkvKgorCSAqIFN0ZXAgNmM6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCisJICoKKwkgKiBKdW1wIHRvIGFzc2VtYmx5IGNvZGUuIFRoZSBwcm9jZXNzb3Igd2lsbCBzdGF5IHRoZXJlCisgCSAqIHVudGlsIHdha2UgdXAuCisJICovCisKKyAgICAgICAgZnVuY19wdHIoYXJnMCwgYXJnMSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBoZXJlLCBwcm9jZXNzb3IgaXMgd29rZW4gdXAhCisJICovCisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJLyogUE9XRVJfQ1RSTF9SRUcgPSAweDAgKExPV19QT1dFUiBpcyBkaXNhYmxlZCkgKi8KKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKKwkJCSAgICB+T01BUDE1MTBfVUxQRF9MT1dfUE9XRVJfUkVRLCBVTFBEX1BPV0VSX0NUUkwpOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNnh4KCkpIHsKKwkJLyogUE9XRVJfQ1RSTF9SRUcgPSAweDAgKExPV19QT1dFUiBpcyBkaXNhYmxlZCkgKi8KKwkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpICYKKwkJCSAgICB+T01BUDE2MTBfVUxQRF9MT1dfUE9XRVJfUkVRLCBVTFBEX1BPV0VSX0NUUkwpOworCX0KKworCisJLyogUmVzdG9yZSBEU1AgY2xvY2tzICovCisJb21hcF93cml0ZWwob21hcF9yZWFkbChBUk1fSURMRUNUMikgfCAoMTw8RU5fQVBJQ0spLCBBUk1fSURMRUNUMik7CisJX19yYXdfd3JpdGV3KHNhdmVfZHNwX2lkbGVjdDIsIERTUF9JRExFQ1QyKTsKKwlBUk1fUkVTVE9SRShBUk1fSURMRUNUMik7CisKKwkvKgorCSAqIFJlc3RvcmUgQVJNIHN0YXRlLCBleGNlcHQgQVJNX0lETEVDVDEvMiB3aGljaCBvbWFwX2NwdV9zdXNwZW5kIGRpZAorCSAqLworCisJQVJNX1JFU1RPUkUoQVJNX0NLQ1RMKTsKKwlBUk1fUkVTVE9SRShBUk1fRVdVUENUKTsKKwlBUk1fUkVTVE9SRShBUk1fUlNUQ1QxKTsKKwlBUk1fUkVTVE9SRShBUk1fUlNUQ1QyKTsKKwlBUk1fUkVTVE9SRShBUk1fU1lTU1QpOworCVVMUERfUkVTVE9SRShVTFBEX0NMT0NLX0NUUkwpOworCVVMUERfUkVTVE9SRShVTFBEX1NUQVRVU19SRVEpOworCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCU1QVUkxNTEwX1JFU1RPUkUoTVBVSV9DVFJMKTsKKwkJTVBVSTE1MTBfUkVTVE9SRShNUFVJX0RTUF9CT09UX0NPTkZJRyk7CisJCU1QVUkxNTEwX1JFU1RPUkUoTVBVSV9EU1BfQVBJX0NPTkZJRyk7CisJCU1QVUkxNTEwX1JFU1RPUkUoRU1JRlNfQ09ORklHKTsKKwkJTVBVSTE1MTBfUkVTVE9SRShFTUlGRl9TRFJBTV9DT05GSUcpOworCQlNUFVJMTUxMF9SRVNUT1JFKE9NQVBfSUgxX01JUik7CisJCU1QVUkxNTEwX1JFU1RPUkUoT01BUF9JSDJfTUlSKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCU1QVUkxNjEwX1JFU1RPUkUoTVBVSV9DVFJMKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShNUFVJX0RTUF9CT09UX0NPTkZJRyk7CisJCU1QVUkxNjEwX1JFU1RPUkUoTVBVSV9EU1BfQVBJX0NPTkZJRyk7CisJCU1QVUkxNjEwX1JFU1RPUkUoRU1JRlNfQ09ORklHKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShFTUlGRl9TRFJBTV9DT05GSUcpOworCisJCU1QVUkxNjEwX1JFU1RPUkUoT01BUF9JSDFfTUlSKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8wX01JUik7CisJCU1QVUkxNjEwX1JFU1RPUkUoT01BUF9JSDJfMV9NSVIpOworCQlNUFVJMTYxMF9SRVNUT1JFKE9NQVBfSUgyXzJfTUlSKTsKKwkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8zX01JUik7CisJfQorCisJLyoKKwkgKiBSZWVuYWJsZSBpbnRlcnJ1cHRzCisJICovCisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbG9jYWxfZmlxX2VuYWJsZSgpOworCisJcHJpbnRrKCJQTTogT01BUCV4IGlzIHJlLXN0YXJ0aW5nIGZyb20gZGVlcCBzbGVlcC4uLlxuIiwgc3lzdGVtX3Jldik7CisKKwlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CisJCS8qIExldCBMRUQxIChEOSkgYmxpbmsgYWdhaW4gKi8KKwkJdHBzNjUwMTBfc2V0X2xlZChMRUQxLCBCTElOSyk7CisJfQorfQorCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKK3N0YXRpYyBpbnQgZ19yZWFkX2NvbXBsZXRlZDsKKworLyoKKyAqIFJlYWQgc3lzdGVtIFBNIHJlZ2lzdGVycyBmb3IgZGVidWdnaW5nCisgKi8KK3N0YXRpYyBpbnQgb21hcF9wbV9yZWFkX3Byb2MoCisJY2hhciAqcGFnZV9idWZmZXIsCisJY2hhciAqKm15X2ZpcnN0X2J5dGUsCisJb2ZmX3QgdmlydHVhbF9zdGFydCwKKwlpbnQgbGVuZ3RoLAorCWludCAqZW9mLAorCXZvaWQgKmRhdGEpCit7CisJaW50IG15X2J1ZmZlcl9vZmZzZXQgPSAwOworCWNoYXIgKiBjb25zdCBteV9iYXNlID0gcGFnZV9idWZmZXI7CisKKwlBUk1fU0FWRShBUk1fQ0tDVEwpOworCUFSTV9TQVZFKEFSTV9JRExFQ1QxKTsKKwlBUk1fU0FWRShBUk1fSURMRUNUMik7CisJQVJNX1NBVkUoQVJNX0VXVVBDVCk7CisJQVJNX1NBVkUoQVJNX1JTVENUMSk7CisJQVJNX1NBVkUoQVJNX1JTVENUMik7CisJQVJNX1NBVkUoQVJNX1NZU1NUKTsKKworCVVMUERfU0FWRShVTFBEX0lUX1NUQVRVUyk7CisJVUxQRF9TQVZFKFVMUERfQ0xPQ0tfQ1RSTCk7CisJVUxQRF9TQVZFKFVMUERfU09GVF9SRVEpOworCVVMUERfU0FWRShVTFBEX1NUQVRVU19SRVEpOworCVVMUERfU0FWRShVTFBEX0RQTExfQ1RSTCk7CisJVUxQRF9TQVZFKFVMUERfUE9XRVJfQ1RSTCk7CisKKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJTVBVSTE1MTBfU0FWRShNUFVJX0NUUkwpOworCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX1NUQVRVUyk7CisJCU1QVUkxNTEwX1NBVkUoTVBVSV9EU1BfQk9PVF9DT05GSUcpOworCQlNUFVJMTUxMF9TQVZFKE1QVUlfRFNQX0FQSV9DT05GSUcpOworCQlNUFVJMTUxMF9TQVZFKEVNSUZGX1NEUkFNX0NPTkZJRyk7CisJCU1QVUkxNTEwX1NBVkUoRU1JRlNfQ09ORklHKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCU1QVUkxNjEwX1NBVkUoTVBVSV9DVFJMKTsKKwkJTVBVSTE2MTBfU0FWRShNUFVJX0RTUF9TVEFUVVMpOworCQlNUFVJMTYxMF9TQVZFKE1QVUlfRFNQX0JPT1RfQ09ORklHKTsKKwkJTVBVSTE2MTBfU0FWRShNUFVJX0RTUF9BUElfQ09ORklHKTsKKwkJTVBVSTE2MTBfU0FWRShFTUlGRl9TRFJBTV9DT05GSUcpOworCQlNUFVJMTYxMF9TQVZFKEVNSUZTX0NPTkZJRyk7CisJfQorCisJaWYgKHZpcnR1YWxfc3RhcnQgPT0gMCkgeworCQlnX3JlYWRfY29tcGxldGVkID0gMDsKKworCQlteV9idWZmZXJfb2Zmc2V0ICs9IHNwcmludGYobXlfYmFzZSArIG15X2J1ZmZlcl9vZmZzZXQsCisJCSAgICJBUk1fQ0tDVExfUkVHOiAgICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fSURMRUNUMV9SRUc6ICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fSURMRUNUMl9SRUc6ICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fRVdVUENUX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fUlNUQ1QxX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fUlNUQ1QyX1JFRzogICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJBUk1fU1lTU1RfUkVHOiAgICAgICAgICAgIDB4JS04eCAgICAgXG4iCisJCSAgICJVTFBEX0lUX1NUQVRVU19SRUc6ICAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX0NMT0NLX0NUUkxfUkVHOiAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX1NPRlRfUkVRX1JFRzogICAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX0RQTExfQ1RSTF9SRUc6ICAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX1NUQVRVU19SRVFfUkVHOiAgICAgIDB4JS00eCAgICAgXG4iCisJCSAgICJVTFBEX1BPV0VSX0NUUkxfUkVHOiAgICAgIDB4JS00eCAgICAgXG4iLAorCQkgICBBUk1fU0hPVyhBUk1fQ0tDVEwpLAorCQkgICBBUk1fU0hPVyhBUk1fSURMRUNUMSksCisJCSAgIEFSTV9TSE9XKEFSTV9JRExFQ1QyKSwKKwkJICAgQVJNX1NIT1coQVJNX0VXVVBDVCksCisJCSAgIEFSTV9TSE9XKEFSTV9SU1RDVDEpLAorCQkgICBBUk1fU0hPVyhBUk1fUlNUQ1QyKSwKKwkJICAgQVJNX1NIT1coQVJNX1NZU1NUKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfSVRfU1RBVFVTKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfQ0xPQ0tfQ1RSTCksCisJCSAgIFVMUERfU0hPVyhVTFBEX1NPRlRfUkVRKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfRFBMTF9DVFJMKSwKKwkJICAgVUxQRF9TSE9XKFVMUERfU1RBVFVTX1JFUSksCisJCSAgIFVMUERfU0hPVyhVTFBEX1BPV0VSX0NUUkwpKTsKKworCQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKKwkJCW15X2J1ZmZlcl9vZmZzZXQgKz0gc3ByaW50ZihteV9iYXNlICsgbXlfYnVmZmVyX29mZnNldCwKKwkJCSAgICJNUFVJMTUxMF9DVFJMX1JFRyAgICAgICAgICAgICAweCUtOHggXG4iCisJCQkgICAiTVBVSTE1MTBfRFNQX1NUQVRVU19SRUc6ICAgICAgMHglLTh4IFxuIgorCQkJICAgIk1QVUkxNTEwX0RTUF9CT09UX0NPTkZJR19SRUc6IDB4JS04eCBcbiIKKwkJICAgCSAgICJNUFVJMTUxMF9EU1BfQVBJX0NPTkZJR19SRUc6ICAweCUtOHggXG4iCisJCSAgIAkgICAiTVBVSTE1MTBfU0RSQU1fQ09ORklHX1JFRzogICAgMHglLTh4IFxuIgorCQkgICAJICAgIk1QVUkxNTEwX0VNSUZTX0NPTkZJR19SRUc6ICAgIDB4JS04eCBcbiIsCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfQ1RSTCksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfRFNQX1NUQVRVUyksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKE1QVUlfRFNQX0JPT1RfQ09ORklHKSwKKwkJICAgCSAgIE1QVUkxNTEwX1NIT1coTVBVSV9EU1BfQVBJX0NPTkZJRyksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKEVNSUZGX1NEUkFNX0NPTkZJRyksCisJCSAgIAkgICBNUFVJMTUxMF9TSE9XKEVNSUZTX0NPTkZJRykpOworCQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCQlteV9idWZmZXJfb2Zmc2V0ICs9IHNwcmludGYobXlfYmFzZSArIG15X2J1ZmZlcl9vZmZzZXQsCisJCQkgICAiTVBVSTE2MTBfQ1RSTF9SRUcgICAgICAgICAgICAgMHglLTh4IFxuIgorCQkJICAgIk1QVUkxNjEwX0RTUF9TVEFUVVNfUkVHOiAgICAgIDB4JS04eCBcbiIKKwkJCSAgICJNUFVJMTYxMF9EU1BfQk9PVF9DT05GSUdfUkVHOiAweCUtOHggXG4iCisJCSAgIAkgICAiTVBVSTE2MTBfRFNQX0FQSV9DT05GSUdfUkVHOiAgMHglLTh4IFxuIgorCQkgICAJICAgIk1QVUkxNjEwX1NEUkFNX0NPTkZJR19SRUc6ICAgIDB4JS04eCBcbiIKKwkJICAgCSAgICJNUFVJMTYxMF9FTUlGU19DT05GSUdfUkVHOiAgICAweCUtOHggXG4iLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0NUUkwpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0RTUF9TVEFUVVMpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhNUFVJX0RTUF9CT09UX0NPTkZJRyksCisJCSAgIAkgICBNUFVJMTYxMF9TSE9XKE1QVUlfRFNQX0FQSV9DT05GSUcpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhFTUlGRl9TRFJBTV9DT05GSUcpLAorCQkgICAJICAgTVBVSTE2MTBfU0hPVyhFTUlGU19DT05GSUcpKTsKKwkJfQorCisJCWdfcmVhZF9jb21wbGV0ZWQrKzsKKwl9IGVsc2UgaWYgKGdfcmVhZF9jb21wbGV0ZWQgPj0gMSkgeworCQkgKmVvZiA9IDE7CisJCSByZXR1cm4gMDsKKwl9CisJZ19yZWFkX2NvbXBsZXRlZCsrOworCisJKm15X2ZpcnN0X2J5dGUgPSBwYWdlX2J1ZmZlcjsKKwlyZXR1cm4gIG15X2J1ZmZlcl9vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG9tYXBfcG1faW5pdF9wcm9jKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL29tYXBfcG0iLAorCQkJCSAgICAgICBTX0lXVVNSIHwgU19JUlVHTywgTlVMTCwKKwkJCQkgICAgICAgb21hcF9wbV9yZWFkX3Byb2MsIDApOworfQorCisjZW5kaWYgLyogREVCVUcgJiYgQ09ORklHX1BST0NfRlMgKi8KKworLyoKKyAqCW9tYXBfcG1fcHJlcGFyZSAtIERvIHByZWxpbWluYXJ5IHN1c3BlbmQgd29yay4KKyAqCUBzdGF0ZToJCXN1c3BlbmQgc3RhdGUgd2UncmUgZW50ZXJpbmcuCisgKgorICovCisvLyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCitzdGF0aWMgaW50IG9tYXBfcG1fcHJlcGFyZShzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJaW50IGVycm9yID0gMDsKKworCXN3aXRjaCAoc3RhdGUpCisJeworCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCWNhc2UgUE1fU1VTUEVORF9NRU06CisJCWJyZWFrOworCisJY2FzZSBQTV9TVVNQRU5EX0RJU0s6CisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqCW9tYXBfcG1fZW50ZXIgLSBBY3R1YWxseSBlbnRlciBhIHNsZWVwIHN0YXRlLgorICoJQHN0YXRlOgkJU3RhdGUgd2UncmUgZW50ZXJpbmcuCisgKgorICovCisKK3N0YXRpYyBpbnQgb21hcF9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkKKwl7CisJY2FzZSBQTV9TVVNQRU5EX1NUQU5EQlk6CisJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJb21hcF9wbV9zdXNwZW5kKCk7CisJCWJyZWFrOworCisJY2FzZSBQTV9TVVNQRU5EX0RJU0s6CisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCW9tYXBfcG1fZmluaXNoIC0gRmluaXNoIHVwIHN1c3BlbmQgc2VxdWVuY2UuCisgKglAc3RhdGU6CQlTdGF0ZSB3ZSdyZSBjb21pbmcgb3V0IG9mLgorICoKKyAqCVRoaXMgaXMgY2FsbGVkIGFmdGVyIHdlIHdha2UgYmFjayB1cCAob3IgaWYgZW50ZXJpbmcgdGhlIHNsZWVwIHN0YXRlCisgKglmYWlsZWQpLgorICovCisKK3N0YXRpYyBpbnQgb21hcF9wbV9maW5pc2goc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorCisKK3N0cnVjdCBwbV9vcHMgb21hcF9wbV9vcHMgPXsKKwkucG1fZGlza19tb2RlID0gMCwKKyAgICAgICAgLnByZXBhcmUgICAgICAgID0gb21hcF9wbV9wcmVwYXJlLAorICAgICAgICAuZW50ZXIgICAgICAgICAgPSBvbWFwX3BtX2VudGVyLAorICAgICAgICAuZmluaXNoICAgICAgICAgPSBvbWFwX3BtX2ZpbmlzaCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfcG1faW5pdCh2b2lkKQoreworCXByaW50aygiUG93ZXIgTWFuYWdlbWVudCBmb3IgVEkgT01BUC5cbiIpOworCXBtX2lkbGUgPSBvbWFwX3BtX2lkbGU7CisJLyoKKwkgKiBXZSBjb3B5IHRoZSBhc3NlbWJsZXIgc2xlZXAvd2FrZXVwIHJvdXRpbmVzIHRvIFNSQU0uCisJICogVGhlc2Ugcm91dGluZXMgbmVlZCB0byBiZSBpbiBTUkFNIGFzIHRoYXQncyB0aGUgb25seQorCSAqIG1lbW9yeSB0aGUgTVBVIGNhbiBzZWUgd2hlbiBpdCB3YWtlcyB1cC4KKwkgKi8KKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAxNTEwCisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNTEwX1NSQU1fSURMRV9TVVNQRU5ELAorCQkgICAgICAgb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQsCisJCSAgICAgICBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNTEwX1NSQU1fQVBJX1NVU1BFTkQsIG9tYXAxNTEwX2NwdV9zdXNwZW5kLAorCQkgICAgICAgb21hcDE1MTBfY3B1X3N1c3BlbmRfc3opOworCX0gZWxzZQorI2VuZGlmCisJaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKSB7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNjEwX1NSQU1fSURMRV9TVVNQRU5ELAorCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQsCisJCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7CisJCW1lbWNweSgodm9pZCAqKU9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQsIG9tYXAxNjEwX2NwdV9zdXNwZW5kLAorCQkgICAgICAgb21hcDE2MTBfY3B1X3N1c3BlbmRfc3opOworCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKKwkJbWVtY3B5KCh2b2lkICopT01BUDU5MTJfU1JBTV9JRExFX1NVU1BFTkQsCisJCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKKwkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKKwkJbWVtY3B5KCh2b2lkICopT01BUDU5MTJfU1JBTV9BUElfU1VTUEVORCwgb21hcDE2MTBfY3B1X3N1c3BlbmQsCisJCSAgICAgICBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeik7CisJfQorCisJcG1fc2V0X29wcygmb21hcF9wbV9vcHMpOworCisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKKwlvbWFwX3BtX2luaXRfcHJvYygpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KK19faW5pdGNhbGwob21hcF9wbV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk0OTBjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc2xlZXAuUworICoKKyAqIExvdy1sZXZlbCBPTUFQMTUxMC8xNjEwIHNsZWVwL3dha2VVcCBzdXBwb3J0CisgKgorICogSW5pdGlhbCBTQTExMTAgY29kZToKKyAqIENvcHlyaWdodCAoYykgMjAwMSBDbGlmZiBCcmFrZSA8Y2JyYWtlQGFjY2VsZW50LmNvbT4KKyAqCisgKiBBZGFwdGVkIGZvciBQWEEgYnkgTmljb2xhcyBQaXRyZToKKyAqIENvcHlyaWdodCAoYykgMjAwMiBNb250YSBWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFN1cHBvcnQgZm9yIE9NQVAxNTEwLzE2MTAgYnkgRGlyayBCZWhtZSA8ZGlyay5iZWhtZUBkZS5ib3NjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9wbS5oPgorCisJCS50ZXh0CisKKy8qCisgKiBGb3JjZXMgT01BUCBpbnRvIGlkbGUgc3RhdGUKKyAqCisgKiBvbWFwWFhYWF9pZGxlX2xvb3Bfc3VzcGVuZCgpCisgKgorICogTm90ZTogVGhpcyBjb2RlIGdldCdzIGNvcGllZCB0byBpbnRlcm5hbCBTUkFNIGF0IGJvb3QuIFdoZW4gdGhlIE9NQVAKKyAqCSB3YWtlcyB1cCBpdCBjb250aW51ZXMgZXhlY3V0aW9uIGF0IHRoZSBwb2ludCBpdCB3ZW50IHRvIHNsZWVwLgorICoKKyAqIE5vdGU6IEJlY2F1c2Ugb2Ygc2xpZ2h0bHkgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gdmFsdWVzIHdlIGhhdmUKKyAqICAgICAgIHByb2Nlc3NvciBzcGVjaWZpYyBmdW5jdGlvbnMgaGVyZS4KKyAqLworCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKK0VOVFJZKG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kKQorCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQkJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjaworCisJQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBBUk1fSURMRUNUMSBhbmQgQVJNX0lETEVDVDIKKwltb3YJcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHhmZjAwMDAwMAorCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMGZmMDAwMAorCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMDAwZmYwMAorCisJQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCisJQCBnZXQgQVJNX0lETEVDVDIgaW50byByMgorCWxkcmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCW1vdglyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKKyAJb3JyCXI1LHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCisJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHJlcXVlc3QgQVJNIGlkbGUKKwlAIGdldCBBUk1fSURMRUNUMSBpbnRvIHIxCisJbGRyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXIzLCByMSwgI09NQVAxNTEwX0lETEVfTE9PUF9SRVFVRVNUICYgMHhmZmZmCisJc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgorCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAorbF8xNTEwOglzdWJzCXI1LCByNSwgIzEKKwlibmUJbF8xNTEwCisvKgorICogTGV0J3Mgd2FpdCBmb3IgdGhlIG5leHQgY2xvY2sgdGljayB0byB3YWtlIHVzIHVwLgorICovCisJbW92CXIwLCAjMAorCW1jcglwMTUsIDAsIHIwLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CisvKgorICogb21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KKyAqCisgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKKyAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICovCisKKwlAIHJlc3RvcmUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyIGFuZCByZXR1cm4KKwlAIHIxIGhhcyBBUk1fSURMRUNUMSBhbmQgcjIgc3RpbGwgaGFzIEFSTV9JRExFQ1QyCisJc3RyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlsZG1mZCAgIHNwISwge3IwIC0gcjEyLCBwY30gICAgIEAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KKworRU5UUlkob21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCisJLndvcmQJLiAtIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfT01BUDE1MTAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCitFTlRSWShvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCkKKworCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKworCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyCisJbW92CXI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDAwMGZmMDAKKworCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucworCUAgZ2V0IEFSTV9JRExFQ1QyIGludG8gcjIKKwlsZHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KKwltb3YJcjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCisgCW9ycglyNSxyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAorCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCByZXF1ZXN0IEFSTSBpZGxlCisJQCBnZXQgQVJNX0lETEVDVDEgaW50byByMQorCWxkcmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyMywgcjEsICNPTUFQMTYxMF9JRExFX0xPT1BfUkVRVUVTVCAmIDB4ZmZmZgorCXN0cmgJcjMsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQorCisJbW92CXI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYKKwlvcnIgICAgIHI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKK2xfMTYxMDoJc3VicwlyNSwgcjUsICMxCisJYm5lCWxfMTYxMAorLyoKKyAqIExldCdzIHdhaXQgZm9yIHRoZSBuZXh0IGNsb2NrIHRpY2sgdG8gd2FrZSB1cyB1cC4KKyAqLworCW1vdglyMCwgIzAKKwltY3IJcDE1LCAwLCByMCwgYzcsIGMwLCA0CQlAIHdhaXQgZm9yIGludGVycnVwdAorLyoKKyAqIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kKCkncyByZXN1bWUgcG9pbnQuCisgKgorICogSXQgd2lsbCBqdXN0IHN0YXJ0IGV4ZWN1dGluZyBoZXJlLCBzbyB3ZSdsbCByZXN0b3JlIHN0dWZmIGZyb20gdGhlCisgKiBzdGFjaywgcmVzZXQgdGhlIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMi4KKyAqLworCisJQCByZXN0b3JlIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMiBhbmQgcmV0dXJuCisJQCByMSBoYXMgQVJNX0lETEVDVDEgYW5kIHIyIHN0aWxsIGhhcyBBUk1fSURMRUNUMgorCXN0cmgJcjIsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCXN0cmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQorCisJbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9ICAgICBAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisKK0VOVFJZKG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZAorI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNlhYICovCisKKy8qCisgKiBGb3JjZXMgT01BUCBpbnRvIGRlZXAgc2xlZXAgc3RhdGUKKyAqCisgKiBvbWFwWFhYWF9jcHVfc3VzcGVuZCgpCisgKgorICogVGhlIHZhbHVlcyBvZiB0aGUgcmVnaXN0ZXJzIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMiBhcmUgcGFzc2VkCisgKiBhcyBhcmcwIGFuZCBhcmcxIGZyb20gY2FsbGVyLiBhcmcwIGlzIHN0b3JlZCBpbiByZWdpc3RlciByMCBhbmQgYXJnMQorICogaW4gcmVnaXN0ZXIgcjEuCisgKgorICogTm90ZTogVGhpcyBjb2RlIGdldCdzIGNvcGllZCB0byBpbnRlcm5hbCBTUkFNIGF0IGJvb3QuIFdoZW4gdGhlIE9NQVAKKyAqCSB3YWtlcyB1cCBpdCBjb250aW51ZXMgZXhlY3V0aW9uIGF0IHRoZSBwb2ludCBpdCB3ZW50IHRvIHNsZWVwLgorICoKKyAqIE5vdGU6IEJlY2F1c2Ugb2YgZXJyYXRhIHdvcmsgYXJvdW5kcyB3ZSBoYXZlIHByb2Nlc3NvciBzcGVjaWZpYyBmdW5jdGlvbnMKKyAqICAgICAgIGhlcmUuIFRoZXkgYXJlIG1vc3RseSB0aGUgc2FtZSwgYnV0IHNsaWdodGx5IGRpZmZlcmVudC4KKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCitFTlRSWShvbWFwMTUxMF9jcHVfc3VzcGVuZCkKKworCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKwlzdG1mZAlzcCEsIHtyMCAtIHIxMiwgbHJ9CisKKwlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIFRyYWZmaWMgQ29udHJvbGxlcgorCW1vdglyNCwgI1RDTUlGX0FTTV9CQVNFICYgMHhmZjAwMDAwMAorCW9ycglyNCwgcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjQsIHI0LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwMDBmZjAwCisKKwlAIHdvcmsgYXJvdW5kIGVycmF0YSBvZiBPTUFQMTUxMCBQREUgYml0IGZvciBUQyBzaHV0IGRvd24KKwlAIGNsZWFyIFBERSBiaXQKKwlsZHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwliaWMJcjUsIHI1LCAjUERFX0JJVCAmIDB4ZmYKKwlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKworCUAgc2V0IFBXRF9FTiBiaXQKKwlhbmQJcjUsIHI1LCAjUFdEX0VOX0JJVCAmIDB4ZmYKKwlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKworCUAgcHJlcGFyZSB0byBwdXQgU0RSQU0gaW50byBzZWxmLXJlZnJlc2ggbWFudWFsbHkKKwlsZHIJcjUsIFtyNCwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKwlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweGZmMDAwMDAwCisJb3JyCXI1LCByNSwgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHgwMDAwMDBmZgorCXN0cglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCBwcmVwYXJlIHRvIHB1dCBFTUlGUyB0byBTbGVlcAorCWxkcglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyNSwgcjUsICNJRExFX0VNSUZTX1JFUVVFU1QgJiAweGZmCisJc3RyCXI1LCBbcjQsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMgorCW1vdglyNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweGZmMDAwMDAwCisJb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwZmYwMDAwCisJb3JyCXI0LCByNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweDAwMDBmZjAwCisKKwlAIHR1cm4gb2ZmIGNsb2NrIGRvbWFpbnMKKwltb3YJcjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmCisgCW9ycglyNSxyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAorCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCByZXF1ZXN0IEFSTSBpZGxlCisJbW92CXIzLCAjT01BUDE1MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZgorCW9ycglyMywgcjMsICNPTUFQMTUxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmMDAKKwlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KKworCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCisJb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCitsXzE1MTBfMjoKKwlzdWJzCXI1LCByNSwgIzEKKwlibmUJbF8xNTEwXzIKKy8qCisgKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCB3YWtlIHVwIGV2ZW50IHRvIHdha2UgdXMgdXAuIHIwIGNhbid0IGJlCisgKiB1c2VkIGhlcmUgYmVjYXVzZSByMCBob2xkcyBBUk1fSURMRUNUMQorICovCisJbW92CXIyLCAjMAorCW1jcglwMTUsIDAsIHIyLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CisvKgorICogb21hcDE1MTBfY3B1X3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KKyAqCisgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKKyAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICovCisJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisKK0VOVFJZKG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMTUxMF9jcHVfc3VzcGVuZAorI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNTEwICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAxNlhYKQorRU5UUlkob21hcDE2MTBfY3B1X3N1c3BlbmQpCisKKwlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCisJc3RtZmQJc3AhLCB7cjAgLSByMTIsIGxyfQorCisJQCBsb2FkIGJhc2UgYWRkcmVzcyBvZiBUcmFmZmljIENvbnRyb2xsZXIKKwltb3YJcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjQsIHI0LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwZmYwMDAwCisJb3JyCXI0LCByNCwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMDAwZmYwMAorCisJQCBwcmVwYXJlIHRvIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaCBtYW51YWxseQorCWxkcglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweDAwMDAwMGZmCisJc3RyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHByZXBhcmUgdG8gcHV0IEVNSUZTIHRvIFNsZWVwCisJbGRyCXI1LCBbcjQsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXI1LCByNSwgI0lETEVfRU1JRlNfUkVRVUVTVCAmIDB4ZmYKKwlzdHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KKworCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyCisJbW92CXI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDBmZjAwMDAKKwlvcnIJcjQsIHI0LCAjQ0xLR0VOX1JFR19BU01fQkFTRSAmIDB4MDAwMGZmMDAKKworCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucworCW1vdglyNSwgI09NQVAxNjEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKKyAJb3JyCXI1LHI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCisJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHdvcmsgYXJvdW5kIGVycmF0YSBvZiBPTUFQMTYxMC81OTEyLiBFbmFibGUgKCEpIHBlcmlwaGVyYWwKKwlAIGNsb2NrIHRvIGxldCB0aGUgY2hpcCBnbyBpbnRvIGRlZXAgc2xlZXAKKwlsZHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KKyAJb3JyCXI1LHI1LCAjRU5fUEVSQ0tfQklUICYgMHhmZgorCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQorCisJQCByZXF1ZXN0IEFSTSBpZGxlCisJbW92CXIzLCAjT01BUDE2MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZgorCW9ycglyMywgcjMsICNPTUFQMTYxMF9ERUVQX1NMRUVQX1JFUVVFU1QgJiAweGZmMDAKKwlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KKworCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCisJb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCitsXzE2MTBfMjoKKwlzdWJzCXI1LCByNSwgIzEKKwlibmUJbF8xNjEwXzIKKy8qCisgKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCB3YWtlIHVwIGV2ZW50IHRvIHdha2UgdXMgdXAuIHIwIGNhbid0IGJlCisgKiB1c2VkIGhlcmUgYmVjYXVzZSByMCBob2xkcyBBUk1fSURMRUNUMQorICovCisJbW92CXIyLCAjMAorCW1jcglwMTUsIDAsIHIyLCBjNywgYzAsIDQJCUAgd2FpdCBmb3IgaW50ZXJydXB0CisvKgorICogb21hcDE2MTBfY3B1X3N1c3BlbmQoKSdzIHJlc3VtZSBwb2ludC4KKyAqCisgKiBJdCB3aWxsIGp1c3Qgc3RhcnQgZXhlY3V0aW5nIGhlcmUsIHNvIHdlJ2xsIHJlc3RvcmUgc3R1ZmYgZnJvbSB0aGUKKyAqIHN0YWNrLCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgorICovCisJc3RyaAlyMSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCisKKwlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCisJbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisKK0VOVFJZKG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KQorCS53b3JkCS4gLSBvbWFwMTYxMF9jcHVfc3VzcGVuZAorI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAxNlhYICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViYzRhOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYwpAQCAtMCwwICsxLDU5MyBAQAorLyoKKyAqIGFyY2gvYXJtL3BsYXQtb21hcC91c2IuYyAtLSBwbGF0Zm9ybSBsZXZlbCBVU0IgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI3VuZGVmCURFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9vdGcuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisKKy8qIFRoZXNlIHJvdXRpbmVzIHNob3VsZCBoYW5kbGUgdGhlIHN0YW5kYXJkIGNoaXAtc3BlY2lmaWMgbW9kZXMKKyAqIGZvciB1c2IwLzEvMiBwb3J0cywgY292ZXJpbmcgYmFzaWMgbXV4IGFuZCB0cmFuc2NlaXZlciBzZXR1cC4KKyAqCisgKiBTb21lIGJvYXJkLSouYyBmaWxlcyB3aWxsIG5lZWQgdG8gc2V0IHVwIGFkZGl0aW9uYWwgbXV4IG9wdGlvbnMsCisgKiBsaWtlIGZvciBzdXNwZW5kIGhhbmRsaW5nLCB2YnVzIHNlbnNpbmcsIEdQSU9zLCBhbmQgdGhlIEQrIHB1bGx1cC4KKyAqLworCisvKiBURVNURUQgT046CisgKiAgLSAxNjExQiBIMiAod2l0aCB1c2IxIG1pbmktQUIpIHVzaW5nIHN0YW5kYXJkIE1pbmktQiBvciBPVEcgY2FibGVzCisgKiAgLSA1OTEyIE9TSyBPSENJICh3aXRoIHVzYjAgc3RhbmRhcmQtQSksIHN0YW5kYXJkIEEtdG8tQiBjYWJsZXMKKyAqICAtIDU5MTIgT1NLIFVEQywgd2l0aCAqbm9uc3RhbmRhcmQqIEEtdG8tQSBjYWJsZQorICogIC0gMTUxMCBJbm5vdmF0b3IgVURDIHdpdGggYnVuZGxlZCB1c2IwIGNhYmxlCisgKiAgLSAxNTEwIElubm92YXRvciBPSENJIHdpdGggYnVuZGxlZCB1c2IxL3VzYjIgY2FibGUKKyAqICAtIDE1MTAgSW5ub3ZhdG9yIE9IQ0kgd2l0aCBjdXN0b20gdXNiMCBjYWJsZSwgZmVlZGluZyA1ViBWQlVTCisgKiAgLSAxNzEwIGN1c3RvbSBkZXZlbG9wbWVudCBib2FyZCB1c2luZyBhbHRlcm5hdGUgcGluIGdyb3VwCisgKiAgLSAxNzEwIEgzICh3aXRoIHVzYjEgbWluaS1BQikgdXNpbmcgc3RhbmRhcmQgTWluaS1CIG9yIE9URyBjYWJsZXMKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYJQ09ORklHX0FSQ0hfT01BUF9PVEcKKworc3RhdGljIHN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKnhjZWl2OworCisvKioKKyAqIG90Z19nZXRfdHJhbnNjZWl2ZXIgLSBmaW5kIHRoZSAoc2luZ2xlKSBPVEcgdHJhbnNjZWl2ZXIgZHJpdmVyCisgKgorICogUmV0dXJucyB0aGUgdHJhbnNjZWl2ZXIgZHJpdmVyLCBhZnRlciBnZXR0aW5nIGEgcmVmY291bnQgdG8gaXQ7IG9yCisgKiBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggdHJhbnNjZWl2ZXIuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogcmVsZWFzaW5nIHRoYXQgY291bnQuCisgKi8KK3N0cnVjdCBvdGdfdHJhbnNjZWl2ZXIgKm90Z19nZXRfdHJhbnNjZWl2ZXIodm9pZCkKK3sKKwlpZiAoeGNlaXYpCisJCWdldF9kZXZpY2UoeGNlaXYtPmRldik7CisJcmV0dXJuIHhjZWl2OworfQorRVhQT1JUX1NZTUJPTChvdGdfZ2V0X3RyYW5zY2VpdmVyKTsKKworaW50IG90Z19zZXRfdHJhbnNjZWl2ZXIoc3RydWN0IG90Z190cmFuc2NlaXZlciAqeCkKK3sKKwlpZiAoeGNlaXYgJiYgeCkKKwkJcmV0dXJuIC1FQlVTWTsKKwl4Y2VpdiA9IHg7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG90Z19zZXRfdHJhbnNjZWl2ZXIpOworCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHUzMiBfX2luaXQgb21hcF91c2IwX2luaXQodW5zaWduZWQgbndpcmVzLCB1bnNpZ25lZCBpc19kZXZpY2UpCit7CisJdTMyCXN5c2NvbjEgPSAwOworCisJaWYgKG53aXJlcyA9PSAwKSB7CisJCWlmICghY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJCS8qIHB1bGxkb3duIEQrL0QtICovCisJCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgJj0gfigzIDw8IDEpOworCQl9CisJCXJldHVybiAwOworCX0KKworCWlmIChpc19kZXZpY2UpCisJCW9tYXBfY2ZnX3JlZyhXNF9VU0JfUFVFTik7CisKKwkvKiBpbnRlcm5hbCB0cmFuc2NlaXZlciAqLworCWlmIChud2lyZXMgPT0gMikgeworCQkvLyBvbWFwX2NmZ19yZWcoUDlfVVNCX0RQKTsKKwkJLy8gb21hcF9jZmdfcmVnKFI4X1VTQl9ETSk7CisKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQkvKiBUaGlzIHdvcmtzIG9uIDE1MTAtSW5ub3ZhdG9yICovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIE5PVEVTOgorCQkgKiAgLSBwZXJpcGhlcmFsIHNob3VsZCBjb25maWd1cmUgVkJVUyBkZXRlY3Rpb24hCisJCSAqICAtIG9ubHkgcGVyaXBoZXJhbHMgbWF5IHVzZSB0aGUgaW50ZXJuYWwgRCsvRC0gcHVsbGRvd25zCisJCSAqICAtIE9URyBzdXBwb3J0IG9uIHRoaXMgcG9ydCBub3QgeWV0IHdyaXR0ZW4KKwkJICovCisKKwkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHICY9IH4oNyA8PCA0KTsKKwkJaWYgKCFpc19kZXZpY2UpCisJCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgfD0gKDMgPDwgMSk7CisKKwkJcmV0dXJuIDMgPDwgMTY7CisJfQorCisJLyogYWx0ZXJuYXRlIHBpbiBjb25maWcsIGV4dGVybmFsIHRyYW5zY2VpdmVyICovCisJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibm8gdXNiMCBhbHQgcGluIGNvbmZpZyBvbiAxNXh4XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb21hcF9jZmdfcmVnKFY2X1VTQjBfVFhEKTsKKwlvbWFwX2NmZ19yZWcoVzlfVVNCMF9UWEVOKTsKKwlvbWFwX2NmZ19yZWcoVzVfVVNCMF9TRTApOworCisJLyogTk9URTogIFNQRUVEIGFuZCBTVVNQIGFyZW4ndCBjb25maWd1cmVkIGhlcmUgKi8KKworCWlmIChud2lyZXMgIT0gMykKKwkJb21hcF9jZmdfcmVnKFk1X1VTQjBfUkNWKTsKKwlpZiAobndpcmVzICE9IDYpCisJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyAmPSB+Q09ORl9VU0IyX1VOSV9SOworCisJc3dpdGNoIChud2lyZXMpIHsKKwljYXNlIDM6CisJCXN5c2NvbjEgPSAyOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN5c2NvbjEgPSAxOworCQlicmVhazsKKwljYXNlIDY6CisJCXN5c2NvbjEgPSAzOworCQlvbWFwX2NmZ19yZWcoQUE5X1VTQjBfVlApOworCQlvbWFwX2NmZ19yZWcoUjlfVVNCMF9WTSk7CisJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyB8PSBDT05GX1VTQjJfVU5JX1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiaWxsZWdhbCB1c2IlZCAlZC13aXJlIHRyYW5zY2VpdmVyXG4iLAorCQkJMCwgbndpcmVzKTsKKwl9CisJcmV0dXJuIHN5c2NvbjEgPDwgMTY7Cit9CisKK3N0YXRpYyB1MzIgX19pbml0IG9tYXBfdXNiMV9pbml0KHVuc2lnbmVkIG53aXJlcykKK3sKKwl1MzIJc3lzY29uMSA9IDA7CisKKwlpZiAobndpcmVzICE9IDYgJiYgIWNwdV9pc19vbWFwMTV4eCgpKQorCQlVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUcgJj0gfkNPTkZfVVNCMV9VTklfUjsKKwlpZiAobndpcmVzID09IDApCisJCXJldHVybiAwOworCisJLyogZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKwlvbWFwX2NmZ19yZWcoVVNCMV9UWEQpOworCW9tYXBfY2ZnX3JlZyhVU0IxX1RYRU4pOworCWlmIChjcHVfaXNfb21hcDE1eHgoKSkgeworCQlvbWFwX2NmZ19yZWcoVVNCMV9TRU8pOworCQlvbWFwX2NmZ19yZWcoVVNCMV9TUEVFRCk7CisJCS8vIFNVU1AKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwNTkxMigpKSB7CisJCW9tYXBfY2ZnX3JlZyhXMTNfMTYxMF9VU0IxX1NFMCk7CisJCW9tYXBfY2ZnX3JlZyhSMTNfMTYxMF9VU0IxX1NQRUVEKTsKKwkJLy8gU1VTUAorCX0gZWxzZSBpZiAoY3B1X2lzX29tYXAxNzEwKCkpIHsKKwkJb21hcF9jZmdfcmVnKFIxM18xNzEwX1VTQjFfU0UwKTsKKwkJLy8gU1VTUAorCX0gZWxzZSB7CisJCXByX2RlYnVnKCJ1c2IgdW5yZWNvZ25pemVkXG4iKTsKKwl9CisJaWYgKG53aXJlcyAhPSAzKQorCQlvbWFwX2NmZ19yZWcoVVNCMV9SQ1YpOworCisJc3dpdGNoIChud2lyZXMpIHsKKwljYXNlIDM6CisJCXN5c2NvbjEgPSAyOworCQlicmVhazsKKwljYXNlIDQ6CisJCXN5c2NvbjEgPSAxOworCQlicmVhazsKKwljYXNlIDY6CisJCXN5c2NvbjEgPSAzOworCQlvbWFwX2NmZ19yZWcoVVNCMV9WUCk7CisJCW9tYXBfY2ZnX3JlZyhVU0IxX1ZNKTsKKwkJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkKKwkJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyB8PSBDT05GX1VTQjFfVU5JX1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiaWxsZWdhbCB1c2IlZCAlZC13aXJlIHRyYW5zY2VpdmVyXG4iLAorCQkJMSwgbndpcmVzKTsKKwl9CisJcmV0dXJuIHN5c2NvbjEgPDwgMjA7Cit9CisKK3N0YXRpYyB1MzIgX19pbml0IG9tYXBfdXNiMl9pbml0KHVuc2lnbmVkIG53aXJlcywgdW5zaWduZWQgYWx0X3Bpbmdyb3VwKQoreworCXUzMglzeXNjb24xID0gMDsKKworCS8qIE5PVEUgZXJyYXR1bTogbXVzdCBsZWF2ZSBVU0IyX1VOSV9SIHNldCBpZiB1c2IwIGluIHVzZSAqLworCWlmIChhbHRfcGluZ3JvdXAgfHwgbndpcmVzID09IDApCisJCXJldHVybiAwOworCWlmIChud2lyZXMgIT0gNiAmJiAhY3B1X2lzX29tYXAxNXh4KCkpCisJCVVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyAmPSB+Q09ORl9VU0IyX1VOSV9SOworCisJLyogZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKi8KKwlpZiAoY3B1X2lzX29tYXAxNXh4KCkpIHsKKwkJb21hcF9jZmdfcmVnKFVTQjJfVFhEKTsKKwkJb21hcF9jZmdfcmVnKFVTQjJfVFhFTik7CisJCW9tYXBfY2ZnX3JlZyhVU0IyX1NFTyk7CisJCWlmIChud2lyZXMgIT0gMykKKwkJCW9tYXBfY2ZnX3JlZyhVU0IyX1JDVik7CisJCS8qIHRoZXJlIGlzIG5vIFVTQjJfU1BFRUQgKi8KKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCW9tYXBfY2ZnX3JlZyhWNl9VU0IyX1RYRCk7CisJCW9tYXBfY2ZnX3JlZyhXOV9VU0IyX1RYRU4pOworCQlvbWFwX2NmZ19yZWcoVzVfVVNCMl9TRTApOworCQlpZiAobndpcmVzICE9IDMpCisJCQlvbWFwX2NmZ19yZWcoWTVfVVNCMl9SQ1YpOworCQkvLyBGSVhNRSBvbWFwX2NmZ19yZWcoVVNCMl9TUEVFRCk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoInVzYiB1bnJlY29nbml6ZWRcbiIpOworCX0KKwkvLyBvbWFwX2NmZ19yZWcoVVNCMl9TVVNQKTsKKworCXN3aXRjaCAobndpcmVzKSB7CisJY2FzZSAzOgorCQlzeXNjb24xID0gMjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzeXNjb24xID0gMTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzeXNjb24xID0gMzsKKwkJaWYgKGNwdV9pc19vbWFwMTV4eCgpKSB7CisJCQlvbWFwX2NmZ19yZWcoVVNCMl9WUCk7CisJCQlvbWFwX2NmZ19yZWcoVVNCMl9WTSk7CisJCX0gZWxzZSB7CisJCQlvbWFwX2NmZ19yZWcoQUE5X1VTQjJfVlApOworCQkJb21hcF9jZmdfcmVnKFI5X1VTQjJfVk0pOworCQkJVVNCX1RSQU5TQ0VJVkVSX0NUUkxfUkVHIHw9IENPTkZfVVNCMl9VTklfUjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImlsbGVnYWwgdXNiJWQgJWQtd2lyZSB0cmFuc2NlaXZlclxuIiwKKwkJCTIsIG53aXJlcyk7CisJfQorCXJldHVybiBzeXNjb24xIDw8IDI0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYJZGVmaW5lZChDT05GSUdfVVNCX0dBREdFVF9PTUFQKSB8fCBcCisJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKSB8fCBcCisJKGRlZmluZWQoQ09ORklHX1VTQl9PVEcpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUF9PVEcpKQorc3RhdGljIHZvaWQgdXNiX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCS8qIG5vcm1hbGx5IG5vdCBmcmVlZCAqLworfQorI2VuZGlmCisKKyNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWRjX3Jlc291cmNlc1tdID0geworCS8qIG9yZGVyIGlzIHNpZ25pZmljYW50ISAqLworCXsJCS8qIHJlZ2lzdGVycyAqLworCQkuc3RhcnQJCT0gVURDX0JBU0UsCisJCS5lbmQJCT0gVURDX0JBU0UgKyAweGZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgewkJLyogZ2VuZXJhbCBJUlEgKi8KKwkJLnN0YXJ0CQk9IElIMl9CQVNFICsgMjAsCisJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKKwl9LCB7CQkvKiBQSU8gSVJRICovCisJCS5zdGFydAkJPSBJSDJfQkFTRSArIDMwLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwgewkJLyogU09GIElSUSAqLworCQkuc3RhcnQJCT0gSUgyX0JBU0UgKyAyOSwKKwkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgdTY0IHVkY19kbWFtYXNrID0gfih1MzIpMDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdWRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAib21hcF91ZGMiLAorCS5pZAkJPSAtMSwKKwkuZGV2ID0geworCQkucmVsZWFzZQkJPSB1c2JfcmVsZWFzZSwKKwkJLmRtYV9tYXNrCQk9ICZ1ZGNfZG1hbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrCT0gMHhmZmZmZmZmZiwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh1ZGNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB1ZGNfcmVzb3VyY2VzLAorfTsKKworI2VuZGlmCisKKyNpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisKKy8qIFRoZSBkbWFtYXNrIG11c3QgYmUgc2V0IGZvciBPSENJIHRvIHdvcmsgKi8KK3N0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gfih1MzIpMDsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvaGNpX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gT01BUF9PSENJX0JBU0UsCisJCS5lbmQJPSBPTUFQX09IQ0lfQkFTRSArIDQwOTYgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gSU5UX1VTQl9ISENfMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG9oY2lfZGV2aWNlID0geworCS5uYW1lCQkJPSAib2hjaSIsCisJLmlkCQkJPSAtMSwKKwkuZGV2ID0geworCQkucmVsZWFzZQkJPSB1c2JfcmVsZWFzZSwKKwkJLmRtYV9tYXNrCQk9ICZvaGNpX2RtYW1hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob2hjaV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQkJPSBvaGNpX3Jlc291cmNlcywKK307CisKKyNlbmRpZgorCisjaWYJZGVmaW5lZChDT05GSUdfVVNCX09URykgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQX09URykKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvdGdfcmVzb3VyY2VzW10gPSB7CisJLyogb3JkZXIgaXMgc2lnbmlmaWNhbnQhICovCisJeworCQkuc3RhcnQJCT0gT1RHX0JBU0UsCisJCS5lbmQJCT0gT1RHX0JBU0UgKyAweGZmLAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwgeworCQkuc3RhcnQJCT0gSUgyX0JBU0UgKyA4LAorCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG90Z19kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm9tYXBfb3RnIiwKKwkuaWQJCT0gLTEsCisJLmRldiA9IHsKKwkJLnJlbGVhc2UJCT0gdXNiX3JlbGVhc2UsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUob3RnX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gb3RnX3Jlc291cmNlcywKK307CisKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFVMUERfQ0xPQ0tfQ1RSTF9SRUcJX19SRUcxNihVTFBEX0NMT0NLX0NUUkwpCisjZGVmaW5lIFVMUERfU09GVF9SRVFfUkVHCV9fUkVHMTYoVUxQRF9TT0ZUX1JFUSkKKworCisvLyBGSVhNRSBjb3JyZWN0IGFuc3dlciBkZXBlbmRzIG9uIGhtY19tb2RlLAorLy8gYXMgZG9lcyBhbnkgbm9uemVybyB2YWx1ZSBmb3IgY29uZmlnLT5vdGcgcG9ydCBudW1iZXIKKyNpZmRlZglDT05GSUdfVVNCX0dBREdFVF9PTUFQCisjZGVmaW5lCWlzX3VzYjBfZGV2aWNlKGNvbmZpZykJMQorI2Vsc2UKKyNkZWZpbmUJaXNfdXNiMF9kZXZpY2UoY29uZmlnKQkwCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVBfT1RHCisKK3ZvaWQgX19pbml0CitvbWFwX290Z19pbml0KHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZykKK3sKKwl1MzIJCXN5c2NvbiA9IE9UR19TWVNDT05fMV9SRUcgJiAweGZmZmY7CisJaW50CQlzdGF0dXM7CisJaW50CQlhbHRfcGluZ3JvdXAgPSAwOworCisJLyogTk9URTogIG5vIGJ1cyBvciBjbG9jayBzZXR1cCAoeWV0PykgKi8KKworCXN5c2NvbiA9IE9UR19TWVNDT05fMV9SRUcgJiAweGZmZmY7CisJaWYgKCEoc3lzY29uICYgT1RHX1JFU0VUX0RPTkUpKQorCQlwcl9kZWJ1ZygiVVNCIHJlc2V0cyBub3QgY29tcGxldGU/XG4iKTsKKworCS8vIE9UR19JUlFfRU5fUkVHID0gMDsKKworCS8qIHBpbiBtdXhpbmcgYW5kIHRyYW5zY2VpdmVyIHBpbm91dHMgKi8KKwlpZiAoY29uZmlnLT5waW5zWzBdID4gMikJLyogYWx0IHBpbmdyb3VwIDIgKi8KKwkJYWx0X3Bpbmdyb3VwID0gMTsKKwlzeXNjb24gfD0gb21hcF91c2IwX2luaXQoY29uZmlnLT5waW5zWzBdLCBpc191c2IwX2RldmljZShjb25maWcpKTsKKwlzeXNjb24gfD0gb21hcF91c2IxX2luaXQoY29uZmlnLT5waW5zWzFdKTsKKwlzeXNjb24gfD0gb21hcF91c2IyX2luaXQoY29uZmlnLT5waW5zWzJdLCBhbHRfcGluZ3JvdXApOworCXByX2RlYnVnKCJPVEdfU1lTQ09OXzFfUkVHID0gJTA4eFxuIiwgc3lzY29uKTsKKwlPVEdfU1lTQ09OXzFfUkVHID0gc3lzY29uOworCisJc3lzY29uID0gY29uZmlnLT5obWNfbW9kZTsKKwlzeXNjb24gfD0gVVNCWF9TWU5DSFJPIHwgKDQgPDwgMTYpIC8qIEJfQVNFMF9CUlNUICovOworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJaWYgKGNvbmZpZy0+b3RnKQorCQlzeXNjb24gfD0gT1RHX0VOOworI2VuZGlmCisJcHJfZGVidWcoIlVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyA9ICUwM3hcbiIsIFVTQl9UUkFOU0NFSVZFUl9DVFJMX1JFRyk7CisJcHJfZGVidWcoIk9UR19TWVNDT05fMl9SRUcgPSAlMDh4XG4iLCBzeXNjb24pOworCU9UR19TWVNDT05fMl9SRUcgPSBzeXNjb247CisKKwlwcmludGsoIlVTQjogaG1jICVkIiwgY29uZmlnLT5obWNfbW9kZSk7CisJaWYgKGFsdF9waW5ncm91cCkKKwkJcHJpbnRrKCIsIHVzYjIgYWx0ICVkIHdpcmVzIiwgY29uZmlnLT5waW5zWzJdKTsKKwllbHNlIGlmIChjb25maWctPnBpbnNbMF0pCisJCXByaW50aygiLCB1c2IwICVkIHdpcmVzJXMiLCBjb25maWctPnBpbnNbMF0sCisJCQlpc191c2IwX2RldmljZShjb25maWcpID8gIiAoZGV2KSIgOiAiIik7CisJaWYgKGNvbmZpZy0+cGluc1sxXSkKKwkJcHJpbnRrKCIsIHVzYjEgJWQgd2lyZXMiLCBjb25maWctPnBpbnNbMV0pOworCWlmICghYWx0X3Bpbmdyb3VwICYmIGNvbmZpZy0+cGluc1syXSkKKwkJcHJpbnRrKCIsIHVzYjIgJWQgd2lyZXMiLCBjb25maWctPnBpbnNbMl0pOworCWlmIChjb25maWctPm90ZykKKwkJcHJpbnRrKCIsIE1pbmktQUIgb24gdXNiJWQiLCBjb25maWctPm90ZyAtIDEpOworCXByaW50aygiXG4iKTsKKworCS8qIGxlYXZlIFVTQiBjbG9ja3MvY29udHJvbGxlcnMgb2ZmIHVudGlsIG5lZWRlZCAqLworCVVMUERfU09GVF9SRVFfUkVHICY9IH5TT0ZUX1VTQl9DTEtfUkVROworCVVMUERfQ0xPQ0tfQ1RSTF9SRUcgJj0gflVTQl9NQ0xLX0VOOworCVVMUERfQ0xPQ0tfQ1RSTF9SRUcgfD0gRElTX1VTQl9QVkNJX0NMSzsKKwlzeXNjb24gPSBPVEdfU1lTQ09OXzFfUkVHOworCXN5c2NvbiB8PSBIU1RfSURMRV9FTnxERVZfSURMRV9FTnxPVEdfSURMRV9FTjsKKworI2lmZGVmCUNPTkZJR19VU0JfR0FER0VUX09NQVAKKwlpZiAoY29uZmlnLT5vdGcgfHwgY29uZmlnLT5yZWdpc3Rlcl9kZXYpIHsKKwkJc3lzY29uICY9IH5ERVZfSURMRV9FTjsKKwkJdWRjX2RldmljZS5kZXYucGxhdGZvcm1fZGF0YSA9IGNvbmZpZzsKKwkJLyogRklYTUUgcGF0Y2ggSVJRIG51bWJlcnMgZm9yIG9tYXA3MzAgKi8KKwkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ1ZGNfZGV2aWNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2RlYnVnKCJjYW4ndCByZWdpc3RlciBVREMgZGV2aWNlLCAlZFxuIiwgc3RhdHVzKTsKKwl9CisjZW5kaWYKKworI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKwlpZiAoY29uZmlnLT5vdGcgfHwgY29uZmlnLT5yZWdpc3Rlcl9ob3N0KSB7CisJCXN5c2NvbiAmPSB+SFNUX0lETEVfRU47CisJCW9oY2lfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gY29uZmlnOworCQlpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJCW9oY2lfcmVzb3VyY2VzWzFdLnN0YXJ0ID0gSU5UXzczMF9VU0JfSEhDXzE7CisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb2hjaV9kZXZpY2UpOworCQlpZiAoc3RhdHVzKQorCQkJcHJfZGVidWcoImNhbid0IHJlZ2lzdGVyIE9IQ0kgZGV2aWNlLCAlZFxuIiwgc3RhdHVzKTsKKwl9CisjZW5kaWYKKworI2lmZGVmCUNPTkZJR19VU0JfT1RHCisJaWYgKGNvbmZpZy0+b3RnKSB7CisJCXN5c2NvbiAmPSB+T1RHX0lETEVfRU47CisJCW90Z19kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBjb25maWc7CisJCWlmIChjcHVfaXNfb21hcDczMCgpKQorCQkJb3RnX3Jlc291cmNlc1sxXS5zdGFydCA9IElOVF83MzBfVVNCX09URzsKKwkJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZvdGdfZGV2aWNlKTsKKwkJaWYgKHN0YXR1cykKKwkJCXByX2RlYnVnKCJjYW4ndCByZWdpc3RlciBPVEcgZGV2aWNlLCAlZFxuIiwgc3RhdHVzKTsKKwl9CisjZW5kaWYKKwlwcl9kZWJ1ZygiT1RHX1NZU0NPTl8xX1JFRyA9ICUwOHhcbiIsIHN5c2Nvbik7CisJT1RHX1NZU0NPTl8xX1JFRyA9IHN5c2NvbjsKKworCXN0YXR1cyA9IDA7Cit9CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9vdGdfaW5pdChzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpjb25maWcpIHt9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmCUNPTkZJR19BUkNIX09NQVAxNTEwCisKKyNkZWZpbmUgVUxQRF9EUExMX0NUUkxfUkVHCV9fUkVHMTYoVUxQRF9EUExMX0NUUkwpCisjZGVmaW5lIERQTExfSU9CCQkoMSA8PCAxMykKKyNkZWZpbmUgRFBMTF9QTExfRU5BQkxFCQkoMSA8PCA0KQorI2RlZmluZSBEUExMX0xPQ0sJCSgxIDw8IDApCisKKyNkZWZpbmUgVUxQRF9BUExMX0NUUkxfUkVHCV9fUkVHMTYoVUxQRF9BUExMX0NUUkwpCisjZGVmaW5lIEFQTExfTkRQTExfU1dJVENICSgxIDw8IDApCisKKworc3RhdGljIHZvaWQgX19pbml0IG9tYXBfMTUxMF91c2JfaW5pdChzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpjb25maWcpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJb21hcF91c2IwX2luaXQoY29uZmlnLT5waW5zWzBdLCBpc191c2IwX2RldmljZShjb25maWcpKTsKKwlvbWFwX3VzYjFfaW5pdChjb25maWctPnBpbnNbMV0pOworCW9tYXBfdXNiMl9pbml0KGNvbmZpZy0+cGluc1syXSwgMCk7CisKKwl2YWwgPSBvbWFwX3JlYWRsKE1PRF9DT05GX0NUUkxfMCkgJiB+KDB4M2YgPDwgMSk7CisJdmFsIHw9IChjb25maWctPmhtY19tb2RlIDw8IDEpOworCW9tYXBfd3JpdGVsKHZhbCwgTU9EX0NPTkZfQ1RSTF8wKTsKKworCXByaW50aygiVVNCOiBobWMgJWQiLCBjb25maWctPmhtY19tb2RlKTsKKwlpZiAoY29uZmlnLT5waW5zWzBdKQorCQlwcmludGsoIiwgdXNiMCAlZCB3aXJlcyVzIiwgY29uZmlnLT5waW5zWzBdLAorCQkJaXNfdXNiMF9kZXZpY2UoY29uZmlnKSA/ICIgKGRldikiIDogIiIpOworCWlmIChjb25maWctPnBpbnNbMV0pCisJCXByaW50aygiLCB1c2IxICVkIHdpcmVzIiwgY29uZmlnLT5waW5zWzFdKTsKKwlpZiAoY29uZmlnLT5waW5zWzJdKQorCQlwcmludGsoIiwgdXNiMiAlZCB3aXJlcyIsIGNvbmZpZy0+cGluc1syXSk7CisJcHJpbnRrKCJcbiIpOworCisJLyogdXNlIERQTEwgZm9yIDQ4IE1IeiBmdW5jdGlvbiBjbG9jayAqLworCXByX2RlYnVnKCJBUExMICUwNHggRFBMTCAlMDR4IFJFUSAlMDR4XG4iLCBVTFBEX0FQTExfQ1RSTF9SRUcsCisJCQlVTFBEX0RQTExfQ1RSTF9SRUcsIFVMUERfU09GVF9SRVFfUkVHKTsKKwlVTFBEX0FQTExfQ1RSTF9SRUcgJj0gfkFQTExfTkRQTExfU1dJVENIOworCVVMUERfRFBMTF9DVFJMX1JFRyB8PSBEUExMX0lPQiB8IERQTExfUExMX0VOQUJMRTsKKwlVTFBEX1NPRlRfUkVRX1JFRyB8PSBTT0ZUX1VEQ19SRVEgfCBTT0ZUX0RQTExfUkVROworCXdoaWxlICghKFVMUERfRFBMTF9DVFJMX1JFRyAmIERQTExfTE9DSykpCisJCWNwdV9yZWxheCgpOworCisjaWZkZWYJQ09ORklHX1VTQl9HQURHRVRfT01BUAorCWlmIChjb25maWctPnJlZ2lzdGVyX2RldikgeworCQl1ZGNfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gY29uZmlnOworCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnVkY19kZXZpY2UpOworCQlpZiAoc3RhdHVzKQorCQkJcHJfZGVidWcoImNhbid0IHJlZ2lzdGVyIFVEQyBkZXZpY2UsICVkXG4iLCBzdGF0dXMpOworCQkvKiB1ZGMgZHJpdmVyIGdhdGVzIDQ4TUh6IGJ5IEQrIHB1bGx1cCAqLworCX0KKyNlbmRpZgorCisjaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorCWlmIChjb25maWctPnJlZ2lzdGVyX2hvc3QpIHsKKwkJb2hjaV9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSBjb25maWc7CisJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmb2hjaV9kZXZpY2UpOworCQlpZiAoc3RhdHVzKQorCQkJcHJfZGVidWcoImNhbid0IHJlZ2lzdGVyIE9IQ0kgZGV2aWNlLCAlZFxuIiwgc3RhdHVzKTsKKwkJLyogaGNkIGV4cGxpY2l0bHkgZ2F0ZXMgNDhNSHogKi8KKwl9CisjZW5kaWYKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBvbWFwXzE1MTBfdXNiX2luaXQoc3RydWN0IG9tYXBfdXNiX2NvbmZpZyAqY29uZmlnKSB7fQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3Qgb21hcF91c2JfY29uZmlnIHBsYXRmb3JtX2RhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0CitvbWFwX3VzYl9pbml0KHZvaWQpCit7CisJY29uc3Qgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyAqY29uZmlnOworCisJY29uZmlnID0gb21hcF9nZXRfY29uZmlnKE9NQVBfVEFHX1VTQiwgc3RydWN0IG9tYXBfdXNiX2NvbmZpZyk7CisJaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVVNCOiBObyBib2FyZC1zcGVjaWZpYyAiCisJCQkJInBsYXRmb3JtIGNvbmZpZyBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwbGF0Zm9ybV9kYXRhID0gKmNvbmZpZzsKKworCWlmIChjcHVfaXNfb21hcDczMCgpIHx8IGNwdV9pc19vbWFwMTZ4eCgpKQorCQlvbWFwX290Z19pbml0KCZwbGF0Zm9ybV9kYXRhKTsKKwllbHNlIGlmIChjcHVfaXNfb21hcDE1eHgoKSkKKwkJb21hcF8xNTEwX3VzYl9pbml0KCZwbGF0Zm9ybV9kYXRhKTsKKwllbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVU0I6IE5vIGluaXQgZm9yIHlvdXIgY2hpcCB5ZXRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChvbWFwX3VzYl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCmluZGV4IDMwYzFkZmIuLjZkM2E3OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKKysrIGIvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcwpAQCAtNiw3ICs2LDcgQEAKICMgVG8gYWRkIGFuIGVudHJ5IGludG8gdGhpcyBkYXRhYmFzZSwgcGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2FybS9SRUFETUUsCiAjIG9yIGNvbnRhY3Qgcm1rQGFybS5saW51eC5vcmcudWsKICMKLSMgTGFzdCB1cGRhdGU6IFRodSBNYXIgMjQgMTQ6MzQ6NTAgMjAwNQorIyBMYXN0IHVwZGF0ZTogVGh1IEp1biAyMyAyMDoxOTozMyAyMDA1CiAjCiAjIG1hY2hpbmVfaXNfeHh4CUNPTkZJR194eHh4CQlNQUNIX1RZUEVfeHh4CQludW1iZXIKICMKQEAgLTI0Myw3ICsyNDMsNyBAQAogamFzcGVyCQkJQVJDSF9KQVNQRVIJCUpBU1BFUgkJCTIzMgogZHNjMjUJCQlBUkNIX0RTQzI1CQlEU0MyNQkJCTIzMwogb21hcF9pbm5vdmF0b3IJCU1BQ0hfT01BUF9JTk5PVkFUT1IJT01BUF9JTk5PVkFUT1IJCTIzNAotcmFtc2VzCQkJQVJDSF9SQU1TRVMJCVJBTVNFUwkJCTIzNQorbW5jaQkJCUFSQ0hfUkFNU0VTCQlSQU1TRVMJCQkyMzUKIHMyOHgJCQlBUkNIX1MyOFgJCVMyOFgJCQkyMzYKIG1wb3J0MwkJCUFSQ0hfTVBPUlQzCQlNUE9SVDMJCQkyMzcKIHB4YV9lYWdsZTI1MAkJQVJDSF9QWEFfRUFHTEUyNTAJUFhBX0VBR0xFMjUwCQkyMzgKQEAgLTMyMyw3ICszMjMsNyBAQAogbmltYnJhMjEwCQlBUkNIX05JTUJSQTIxMAkJTklNQlJBMjEwCQkzMTIKIGhocF9kOTV4eAkJQVJDSF9ISFBfRDk1WFgJCUhIUF9EOTVYWAkJMzEzCiBsYWJhcm0JCQlBUkNIX0xBQkFSTQkJTEFCQVJNCQkJMzE0Ci1tODI1eHgJCQlBUkNIX004MjVYWAkJTTgyNVhYCQkJMzE1Citjb21jZXJ0bwkJQVJDSF9NODI1WFgJCU04MjVYWAkJCTMxNQogbTcxMDAJCQlTQTExMDBfTTcxMDAJCU03MTAwCQkJMzE2CiBuaXBjMgkJCUFSQ0hfTklQQzIJCU5JUEMyCQkJMzE3CiBmdTcyMDIJCQlBUkNIX0ZVNzIwMgkJRlU3MjAyCQkJMzE4CkBAIC03MjQsMyArNzI0LDY2IEBACiBvbWFwX2NvbWV0MwkJTUFDSF9DT01FVDMJCUNPTUVUMwkJCTcxNgogb21hcF9jb21ldDQJCU1BQ0hfQ09NRVQ0CQlDT01FVDQJCQk3MTcKIGNzYjYyNQkJCU1BQ0hfQ1NCNjI1CQlDU0I2MjUJCQk3MTgKK2ZvcnR1bmV0MgkJTUFDSF9GT1JUVU5FVDIJCUZPUlRVTkVUMgkJNzE5CitzNWgyMjAwCQkJTUFDSF9TNUgyMjAwCQlTNUgyMjAwCQkJNzIwCitvcHRvcm05MjAJCU1BQ0hfT1BUT1JNOTIwCQlPUFRPUk05MjAJCTcyMQorYWRzYml0c3l4YgkJTUFDSF9BRFNCSVRTWVhCCQlBRFNCSVRTWVhCCQk3MjIKK2Fkc3NwaGVyZQkJTUFDSF9BRFNTUEhFUkUJCUFEU1NQSEVSRQkJNzIzCithZHNwb3J0YWwJCU1BQ0hfQURTUE9SVEFMCQlBRFNQT1JUQUwJCTcyNAorbG4yNDEwc2JjCQlNQUNIX0xOMjQxMFNCQwkJTE4yNDEwU0JDCQk3MjUKK2NiM3J1ZmMJCQlNQUNIX0NCM1JVRkMJCUNCM1JVRkMJCQk3MjYKK21wMnVzYgkJCU1BQ0hfTVAyVVNCCQlNUDJVU0IJCQk3MjcKK250bnA0MjVjCQlNQUNIX05UTlA0MjVDCQlOVE5QNDI1QwkJNzI4Citjb2xpYnJpCQkJTUFDSF9DT0xJQlJJCQlDT0xJQlJJCQkJNzI5CitwY203MjIwCQkJTUFDSF9QQ003MjIwCQlQQ003MjIwCQkJNzMwCitnYXRld2F5NzAwMQkJTUFDSF9HQVRFV0FZNzAwMQlHQVRFV0FZNzAwMQkJNzMxCitwY20wMjcJCQlNQUNIX1BDTTAyNwkJUENNMDI3CQkJNzMyCitjbXB4YQkJCU1BQ0hfQ01QWEEJCUNNUFhBCQkJNzMzCithbnViaXMJCQlNQUNIX0FOVUJJUwkJQU5VQklTCQkJNzM0CitpdGU4MTUyCQkJTUFDSF9JVEU4MTUyCQlJVEU4MTUyCQkJNzM1CitscGMzeHh4CQkJTUFDSF9MUEMzWFhYCQlMUEMzWFhYCQkJNzM2CitwdXBwZXRlZXIJCU1BQ0hfUFVQUEVURUVSCQlQVVBQRVRFRVIJCTczNwordnQwMDEJCQlNQUNIX01BQ0hfVkFEQVRFQ0gJTUFDSF9WQURBVEVDSAkJNzM4CitlNTcwCQkJTUFDSF9FNTcwCQlFNTcwCQkJNzM5Cit4NTAJCQlNQUNIX1g1MAkJWDUwCQkJNzQwCityZWNvbgkJCU1BQ0hfUkVDT04JCVJFQ09OCQkJNzQxCit4Ym9hcmRncDgJCU1BQ0hfWEJPQVJER1A4CQlYQk9BUkRHUDgJCTc0MgorZnBpYzIJCQlNQUNIX0ZQSUMyCQlGUElDMgkJCTc0MworYWtpdGEJCQlNQUNIX0FLSVRBCQlBS0lUQQkJCTc0NAorYTgxCQkJTUFDSF9BODEJCUE4MQkJCTc0NQorc3ZtX3NjMjV4CQlNQUNIX1NWTV9TQzI1WAkJU1ZNX1NDMjVYCQk3NDYKK3Z0MDIwCQkJTUFDSF9WQURBVEVDSDAyMAlWQURBVEVDSDAyMAkJNzQ3Cit0bGkJCQlNQUNIX1RMSQkJVExJCQkJNzQ4CitlZGI5MzE1bGMJCU1BQ0hfRURCOTMxNUxDCQlFREI5MzE1TEMJCTc0OQorcGFzc2VjCQkJTUFDSF9QQVNTRUMJCVBBU1NFQwkJCTc1MAorZHNfdGlnZXIJCU1BQ0hfRFNfVElHRVIJCURTX1RJR0VSCQk3NTEKK2UzMTAJCQlNQUNIX0UzMTAJCUUzMTAJCQk3NTIKK2UzMzAJCQlNQUNIX0UzMzAJCUUzMzAJCQk3NTMKK3J0MzAwMAkJCU1BQ0hfUlQzMDAwCQlSVDMwMDAJCQk3NTQKK25va2lhNzcwCQlNQUNIX05PS0lBNzcwCQlOT0tJQTc3MAkJNzU1CitwbngwMTA2CQkJTUFDSF9QTlgwMTA2CQlQTlgwMTA2CQkJNzU2CitoeDIxeHgJCQlNQUNIX0hYMjFYWAkJSFgyMVhYCQkJNzU3CitmYXJhZGF5CQkJTUFDSF9GQVJBREFZCQlGQVJBREFZCQkJNzU4CitzYmM5MzEyCQkJTUFDSF9TQkM5MzEyCQlTQkM5MzEyCQkJNzU5CitiYXRtYW4JCQlNQUNIX0JBVE1BTgkJQkFUTUFOCQkJNzYwCitqcGQyMDEJCQlNQUNIX0pQRDIwMQkJSlBEMjAxCQkJNzYxCittaXBzYQkJCU1BQ0hfTUlQU0EJCU1JUFNBCQkJNzYyCitrYWNvbQkJCU1BQ0hfS0FDT00JCUtBQ09NCQkJNzYzCitzd2FyY29jcHUJCU1BQ0hfU1dBUkNPQ1BVCQlTV0FSQ09DUFUJCTc2NAorc3dhcmNvZHNsCQlNQUNIX1NXQVJDT0RTTAkJU1dBUkNPRFNMCQk3NjUKK2JsdWVhbmdlbAkJTUFDSF9CTFVFQU5HRUwJCUJMVUVBTkdFTAkJNzY2CitoYWlyeWdyYW1hCQlNQUNIX0hBSVJZR1JBTUEJCUhBSVJZR1JBTUEJCTc2NworYmFuZmYJCQlNQUNIX0JBTkZGCQlCQU5GRgkJCTc2OAorY2FybWV2YQkJCU1BQ0hfQ0FSTUVWQQkJQ0FSTUVWQQkJCTc2OQorc2FtMjU1CQkJTUFDSF9TQU0yNTUJCVNBTTI1NQkJCTc3MAorcHBtMTAJCQlNQUNIX1BQTTEwCQlQUE0xMAkJCTc3MQorZWRiOTMxNWEJCU1BQ0hfRURCOTMxNUEJCUVEQjkzMTVBCQk3NzIKK3N1bnNldAkJCU1BQ0hfU1VOU0VUCQlTVU5TRVQJCQk3NzMKK3N0YXJnYXRlMgkJTUFDSF9TVEFSR0FURTIJCVNUQVJHQVRFMgkJNzc0CitpbnRlbG1vdGUyCQlNQUNIX0lOVEVMTU9URTIJCUlOVEVMTU9URTIJCTc3NQordHJpemVwczQJCU1BQ0hfVFJJWkVQUzQJCVRSSVpFUFM0CQk3NzYKK21haW5zdG9uZTIJCU1BQ0hfTUFJTlNUT05FMgkJTUFJTlNUT05FMgkJNzc3Citlel9peHA0MngJCU1BQ0hfRVpfSVhQNDJYCQlFWl9JWFA0MlgJCTc3OAordGFwd2F2ZV96b2RpYWMJCU1BQ0hfVEFQV0FWRV9aT0RJQUMJVEFQV0FWRV9aT0RJQUMJCTc3OQordW5pdmVyc2FsbWV0ZXIJCU1BQ0hfVU5JVkVSU0FMTUVURVIJVU5JVkVSU0FMTUVURVIJCTc4MAoraGljb2FybTkJCU1BQ0hfSElDT0FSTTkJCUhJQ09BUk05CQk3ODEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnAuaCBiL2FyY2gvYXJtL3ZmcC92ZnAuaAppbmRleCA1NWEwMmJjLi40Yjk3OTUwIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwLmgKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcC5oCkBAIC0xMTcsNyArMTE3LDEzIEBACiAJaWYgKG5oID49IG0pCiAJCXJldHVybiB+MFVMTDsKIAltaCA9IG0gPj4gMzI7Ci0JeiA9IChtaCA8PCAzMiA8PSBuaCkgPyAweGZmZmZmZmZmMDAwMDAwMDBVTEwgOiAobmggLyBtaCkgPDwgMzI7CisJaWYgKG1oIDw8IDMyIDw9IG5oKSB7CisJCXogPSAweGZmZmZmZmZmMDAwMDAwMDBVTEw7CisJfSBlbHNlIHsKKwkJeiA9IG5oOworCQlkb19kaXYoeiwgbWgpOworCQl6IDw8PSAzMjsKKwl9CiAJbXVsNjR0bzEyOCgmdGVybWgsICZ0ZXJtbCwgbSwgeik7CiAJc3ViMTI4KCZyZW1oLCAmcmVtbCwgbmgsIG5sLCB0ZXJtaCwgdGVybWwpOwogCW1sID0gbSA8PCAzMjsKQEAgLTEyNiw3ICsxMzIsMTIgQEAKIAkJYWRkMTI4KCZyZW1oLCAmcmVtbCwgcmVtaCwgcmVtbCwgbWgsIG1sKTsKIAl9CiAJcmVtaCA9IChyZW1oIDw8IDMyKSB8IChyZW1sID4+IDMyKTsKLQl6IHw9IChtaCA8PCAzMiA8PSByZW1oKSA/IDB4ZmZmZmZmZmYgOiByZW1oIC8gbWg7CisJaWYgKG1oIDw8IDMyIDw9IHJlbWgpIHsKKwkJeiB8PSAweGZmZmZmZmZmOworCX0gZWxzZSB7CisJCWRvX2RpdihyZW1oLCBtaCk7CisJCXogfD0gcmVtaDsKKwl9CiAJcmV0dXJuIHo7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBkb3VibGUuYwppbmRleCBmYTMwNTNlLi5iODAxY2Q2IDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwZG91YmxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGRvdWJsZS5jCkBAIC0zMiw2ICszMiw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdmZwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYyBiL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYwppbmRleCAzYWVlZGQyLi4yMmYzZGE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCkBAIC04OSw3ICs4OSw3IEBACiAJY3VycmVudC0+dGhyZWFkLmVycm9yX2NvZGUgPSAwOwogCWN1cnJlbnQtPnRocmVhZC50cmFwX25vID0gNjsKIAotCWZvcmNlX3NpZ19pbmZvKFNJR0ZQRSwgJmluZm8sIGN1cnJlbnQpOworCXNlbmRfc2lnX2luZm8oU0lHRlBFLCAmaW5mbywgY3VycmVudCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZmcF9wYW5pYyhjaGFyICpyZWFzb24pCmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZnAvdmZwc2luZ2xlLmMgYi9hcmNoL2FybS92ZnAvdmZwc2luZ2xlLmMKaW5kZXggNjg0OWZlMy4uMTRkZDY5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL3ZmcHNpbmdsZS5jCisrKyBiL2FyY2gvYXJtL3ZmcC92ZnBzaW5nbGUuYwpAQCAtMzIsNiArMzIsOCBAQAogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3ZmcC5oPgogCkBAIC0zMDMsNyArMzA1LDExIEBACiAJCWlmICh6IDw9IGEpCiAJCQlyZXR1cm4gKHMzMilhID4+IDE7CiAJfQotCXJldHVybiAodTMyKSgoKHU2NClhIDw8IDMxKSAvIHopICsgKHogPj4gMSk7CisJeworCQl1NjQgdiA9ICh1NjQpYSA8PCAzMTsKKwkJZG9fZGl2KHYsIHopOworCQlyZXR1cm4gdiArICh6ID4+IDEpOworCX0KIH0KIAogc3RhdGljIHUzMiB2ZnBfc2luZ2xlX2ZzcXJ0KGludCBzZCwgaW50IHVudXNlZCwgczMyIG0sIHUzMiBmcHNjcikKQEAgLTExMDcsNyArMTExMywxMSBAQAogCQl2c24uc2lnbmlmaWNhbmQgPj49IDE7CiAJCXZzZC5leHBvbmVudCsrOwogCX0KLQl2c2Quc2lnbmlmaWNhbmQgPSAoKHU2NCl2c24uc2lnbmlmaWNhbmQgPDwgMzIpIC8gdnNtLnNpZ25pZmljYW5kOworCXsKKwkJdTY0IHNpZ25pZmljYW5kID0gKHU2NCl2c24uc2lnbmlmaWNhbmQgPDwgMzI7CisJCWRvX2RpdihzaWduaWZpY2FuZCwgdnNtLnNpZ25pZmljYW5kKTsKKwkJdnNkLnNpZ25pZmljYW5kID0gc2lnbmlmaWNhbmQ7CisJfQogCWlmICgodnNkLnNpZ25pZmljYW5kICYgMHgzZikgPT0gMCkKIAkJdnNkLnNpZ25pZmljYW5kIHw9ICgodTY0KXZzbS5zaWduaWZpY2FuZCAqIHZzZC5zaWduaWZpY2FuZCAhPSAodTY0KXZzbi5zaWduaWZpY2FuZCA8PCAzMik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtMjYvS2NvbmZpZyBiL2FyY2gvYXJtMjYvS2NvbmZpZwppbmRleCBkYzBjMTkzLi4xZjAzNzMyIDEwMDY0NAotLS0gYS9hcmNoL2FybTI2L0tjb25maWcKKysrIGIvYXJjaC9hcm0yNi9LY29uZmlnCkBAIC0xODMsNiArMTgzLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcGFycG9ydC9LY29uZmlnIgpAQCAtMTkzLDcgKzE5NSw3IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaWRlL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9LY29uZmlnIGIvYXJjaC9jcmlzL0tjb25maWcKaW5kZXggZjg0OGUzNy4uZTU5NzlkNiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL0tjb25maWcKKysrIGIvYXJjaC9jcmlzL0tjb25maWcKQEAgLTEyMiw2ICsxMjIsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKICMgYnJpbmcgaW4gRVRSQVggYnVpbHQtaW4gZHJpdmVycwogbWVudSAiRHJpdmVycyBmb3IgYnVpbHQtaW4gaW50ZXJmYWNlcyIKIHNvdXJjZSBhcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9LY29uZmlnCkBAIC0xNDksNyArMTUxLDcgQEAKIAogc291cmNlICJkcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9pc2RuL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L0tjb25maWcgYi9hcmNoL2Zydi9LY29uZmlnCmluZGV4IGM5M2Y5NTEuLmVjODVjMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L0tjb25maWcKKysrIGIvYXJjaC9mcnYvS2NvbmZpZwpAQCAtMzQ2LDYgKzM0Niw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2RlZmNvbmZpZyBiL2FyY2gvZnJ2L2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmU0Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9mcnYvZGVmY29uZmlnCkBAIC0wLDAgKzEsNjI3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEuOAorIyBGcmkgTWF5IDEzIDE3OjE2OjAzIDIwMDUKKyMKK0NPTkZJR19GUlY9eQorQ09ORklHX1VJRDE2PXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorIyBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfR0VORVJJQ19IQVJESVJRUyBpcyBub3Qgc2V0CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tPQkpFQ1RfVUVWRU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU0hNRU09eQorQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCitDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKK0NPTkZJR19DQ19BTElHTl9MT09QUz0wCitDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIEZ1aml0c3UgRlItViBzeXN0ZW0gc2V0dXAKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX0ZSVl9PVVRPRkxJTkVfQVRPTUlDX09QUz15CitDT05GSUdfSElHSE1FTT15CitDT05GSUdfSElHSFBURT15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19GUlZfREVGTF9DQUNIRV9XQkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19GUlZfREVGTF9DQUNIRV9XQkVISU5EIGlzIG5vdCBzZXQKK0NPTkZJR19GUlZfREVGTF9DQUNIRV9XVEhSVT15CisjIENPTkZJR19GUlZfREVGTF9DQUNIRV9ESVNBQkxFRCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIGNvcmUgc3VwcG9ydAorIworQ09ORklHX0NQVV9GUjQ1MT15CitDT05GSUdfQ1BVX0ZSNDUxX0NPTVBJTEU9eQorQ09ORklHX0ZSVl9MMV9DQUNIRV9TSElGVD01CitDT05GSUdfTUI5MzA5MV9WREs9eQorIyBDT05GSUdfTUI5MzA5M19QREsgaXMgbm90IHNldAorQ09ORklHX01COTMwOTBfTUIwMD15CisjIENPTkZJR19NQjkzMDkxX05PX01CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQUkVMX0RBVEFfOCBpcyBub3Qgc2V0CitDT05GSUdfR1BSRUxfREFUQV80PXkKKyMgQ09ORklHX0dQUkVMX0RBVEFfTk9ORSBpcyBub3Qgc2V0CitDT05GSUdfUENJPXkKKyMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfTkFNRVMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDTUNJQSBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmb3JtYXRzCisjCisjIENPTkZJR19CSU5GTVRfRUxGIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGX0ZEUElDPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfRk9SS19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CisjIENPTkZJR19JUF9QTlBfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREJPRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTExfUlggaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9UUkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorQ09ORklHX05FMktfUENJPXkKKyMgQ09ORklHXzgxMzlDUCBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUyBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTBfTVVMVElQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KQkQgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfVE1QRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19SRUxBWUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9QUklOVEsgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dEQlNUVUIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKaW5kZXggZWY2ODY1Zi4uNzY3ZWJiNSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKQEAgLTc5MCwxMiArNzkwLDEwIEBACiAjaWZuZGVmIENPTkZJR19HREJTVFVCX1VBUlQwCiAJX19yZWcoVUFSVDBfQkFTRSArIFVBUlRfSUVSICogOCkgPSAwOwogCWVhcmx5X3NlcmlhbF9zZXR1cCgmX19mcnZfdWFydDApOwotLy8JcmVnaXN0ZXJfc2VyaWFsKCZfX2Zydl91YXJ0MCk7CiAjZW5kaWYKICNpZm5kZWYgQ09ORklHX0dEQlNUVUJfVUFSVDEKIAlfX3JlZyhVQVJUMV9CQVNFICsgVUFSVF9JRVIgKiA4KSA9IDA7CiAJZWFybHlfc2VyaWFsX3NldHVwKCZfX2Zydl91YXJ0MSk7Ci0vLwlyZWdpc3Rlcl9zZXJpYWwoJl9fZnJ2X3VhcnQxKTsKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfQ0hSX0RFVl9GTEFTSCkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9GTEFTSCkKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYwppbmRleCBkOGQ4ZjNkLi4zNmEyZGZmIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCkBAIC01MzYsMTAgKzUzNiw4IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXJldHVybiAxOwogCi0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7Ci0JCXJlZnJpZ2VyYXRvcigwKTsKKwlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQlnb3RvIG5vX3NpZ25hbDsKLQl9CiAKIAlpZiAoIW9sZHNldCkKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYwppbmRleCAyNDYyMmQ4Li5hZjk4MWJkIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaXJxLmMKQEAgLTYwLDcgKzYwLDcgQEAKIAl9CiB9CiAKLXZvaWQgX19pbml0IHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQordm9pZCBfX2luaXQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvS2NvbmZpZyBiL2FyY2gvaDgzMDAvS2NvbmZpZwppbmRleCA2MmE4OWU4Li4yNjY5OGE0IDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL0tjb25maWcKKysrIGIvYXJjaC9oODMwMC9LY29uZmlnCkBAIC01NSw2ICs1NSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL210ZC9LY29uZmlnIgpAQCAtNjUsNyArNjcsNyBAQAogCiBzb3VyY2UgImFyY2gvaDgzMDAvS2NvbmZpZy5pZGUiCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKICMKICMgaW5wdXQgLSBpbnB1dC9qb3lzdGljayBkZXBlbmRzIG9uIGl0LiBBcyBkb2VzIFVTQi4KQEAgLTE3OSw2ICsxODEsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvaTJjL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9od21vbi9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvdXNiL0tjb25maWciCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYTQ3OTlkNi4uNWFhYjg3ZSAxMDA2NDQKLS0tIGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTUxNywxMCArNTE3LDggQEAKIAlpZiAoKHJlZ3MtPmNjciAmIDB4MTApKQogCQlyZXR1cm4gMTsKIAotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkgewotCQlyZWZyaWdlcmF0b3IoMCk7CisJaWYgKHRyeV90b19mcmVlemUoKSkKIAkJZ290byBub19zaWduYWw7Ci0JfQogCiAJY3VycmVudC0+dGhyZWFkLmVzcDAgPSAodW5zaWduZWQgbG9uZykgcmVnczsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCBkNGFlNWY5Li5hODAxZDlkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtNTEwLDI4ICs1MTAsNyBAQAogCSAgY29zdCBvZiBzbGlnaHRseSBpbmNyZWFzZWQgb3ZlcmhlYWQgaW4gc29tZSBwbGFjZXMuIElmIHVuc3VyZSBzYXkKIAkgIE4gaGVyZS4KIAotY29uZmlnIFBSRUVNUFQKLQlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gcmVkdWNlcyB0aGUgbGF0ZW5jeSBvZiB0aGUga2VybmVsIHdoZW4gcmVhY3RpbmcgdG8KLQkgIHJlYWwtdGltZSBvciBpbnRlcmFjdGl2ZSBldmVudHMgYnkgYWxsb3dpbmcgYSBsb3cgcHJpb3JpdHkgcHJvY2VzcyB0bwotCSAgYmUgcHJlZW1wdGVkIGV2ZW4gaWYgaXQgaXMgaW4ga2VybmVsIG1vZGUgZXhlY3V0aW5nIGEgc3lzdGVtIGNhbGwuCi0JICBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcnVuIG1vcmUgcmVsaWFibHkgZXZlbiB3aGVuIHRoZSBzeXN0ZW0gaXMKLQkgIHVuZGVyIGxvYWQuCi0KLQkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBkZXNrdG9wLCBlbWJlZGRlZAotCSAgb3IgcmVhbC10aW1lIHN5c3RlbS4gIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgotCi1jb25maWcgUFJFRU1QVF9CS0wKLQlib29sICJQcmVlbXB0IFRoZSBCaWcgS2VybmVsIExvY2siCi0JZGVwZW5kcyBvbiBQUkVFTVBUCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gcmVkdWNlcyB0aGUgbGF0ZW5jeSBvZiB0aGUga2VybmVsIGJ5IG1ha2luZyB0aGUKLQkgIGJpZyBrZXJuZWwgbG9jayBwcmVlbXB0aWJsZS4KLQotCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhIGRlc2t0b3Agc3lzdGVtLgotCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCitzb3VyY2UgImtlcm5lbC9LY29uZmlnLnByZWVtcHQiCiAKIGNvbmZpZyBYODZfVVBfQVBJQwogCWJvb2wgIkxvY2FsIEFQSUMgc3VwcG9ydCBvbiB1bmlwcm9jZXNzb3JzIgpAQCAtOTYzLDYgKzk0Miw0MSBAQAogCiBzb3VyY2Uga2VybmVsL0tjb25maWcuaHoKIAorY29uZmlnIFBIWVNJQ0FMX1NUQVJUCisJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkIiBpZiBFTUJFRERFRAorCWRlZmF1bHQgIjB4MTAwMDAwIgorCWhlbHAKKwkgIFRoaXMgZ2l2ZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQuCisJICBQcmltYXJpbHkgdXNlZCBpbiB0aGUgY2FzZSBvZiBrZXhlYyBvbiBwYW5pYyB3aGVyZSB0aGUKKwkgIGZhaWwgc2FmZSBrZXJuZWwgbmVlZHMgdG8gcnVuIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MgdGhhbgorCSAgdGhlIHBhbmljLWVkIGtlcm5lbC4KKworCSAgRG9uJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKworY29uZmlnIEtFWEVDCisJYm9vbCAia2V4ZWMgc3lzdGVtIGNhbGwgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBrZXhlYyBpcyBhIHN5c3RlbSBjYWxsIHRoYXQgaW1wbGVtZW50cyB0aGUgYWJpbGl0eSB0byBzaHV0ZG93biB5b3VyCisJICBjdXJyZW50IGtlcm5lbCwgYW5kIHRvIHN0YXJ0IGFub3RoZXIga2VybmVsLiAgSXQgaXMgbGlrZSBhIHJlYm9vdAorCSAgYnV0IGl0IGlzIGluZGVwZWRlbnQgb2YgdGhlIHN5c3RlbSBmaXJtd2FyZS4gICBBbmQgbGlrZSBhIHJlYm9vdAorCSAgeW91IGNhbiBzdGFydCBhbnkga2VybmVsIHdpdGggaXQsIG5vdCBqdXN0IExpbnV4LgorCisJICBUaGUgbmFtZSBjb21lcyBmcm9tIHRoZSBzaW1pbGlhcml0eSB0byB0aGUgZXhlYyBzeXN0ZW0gY2FsbC4KKworCSAgSXQgaXMgYW4gb25nb2luZyBwcm9jZXNzIHRvIGJlIGNlcnRhaW4gdGhlIGhhcmR3YXJlIGluIGEgbWFjaGluZQorCSAgaXMgcHJvcGVybHkgc2h1dGRvd24sIHNvIGRvIG5vdCBiZSBzdXJwcmlzZWQgaWYgdGhpcyBjb2RlIGRvZXMgbm90CisJICBpbml0aWFsbHkgd29yayBmb3IgeW91LiAgSXQgbWF5IGhlbHAgdG8gZW5hYmxlIGRldmljZSBob3RwbHVnZ2luZworCSAgc3VwcG9ydC4gIEFzIG9mIHRoaXMgd3JpdGluZyB0aGUgZXhhY3QgaGFyZHdhcmUgaW50ZXJmYWNlIGlzCisJICBzdHJvbmdseSBpbiBmbHV4LCBzbyBubyBnb29kIHJlY29tbWVuZGF0aW9uIGNhbiBiZSBtYWRlLgorCitjb25maWcgQ1JBU0hfRFVNUAorCWJvb2wgImtlcm5lbCBjcmFzaCBkdW1wcyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVNQkVEREVECisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIEhJR0hNRU0KKwloZWxwCisJICBHZW5lcmF0ZSBjcmFzaCBkdW1wIGFmdGVyIGJlaW5nIHN0YXJ0ZWQgYnkga2V4ZWMuCiBlbmRtZW51CiAKIApAQCAtMTI1MCw2ICsxMjY0LDE1IEBACiAJICBUaGlzIHN1cHBvcnQgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUuICBJZiBjb21waWxlZCBhcyBhCiAJICBtb2R1bGUsIGl0IHdpbGwgYmUgY2FsbGVkIHNjeDIwMC4KIAorY29uZmlnIEhPVFBMVUdfQ1BVCisJYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBDUFVzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU01QICYmIEhPVFBMVUcgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBleHBlcmltZW50IHdpdGggdHVybmluZyBDUFVzIG9mZiBhbmQgb24uICBDUFVzCisJICBjYW4gYmUgY29udHJvbGxlZCB0aHJvdWdoIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1LgorCisJICBTYXkgTi4KKwogc291cmNlICJkcml2ZXJzL3BjbWNpYS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZyIKQEAgLTEyNjIsNiArMTI4NSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L01ha2VmaWxlIGIvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKaW5kZXggNDNjZDYyMi4uMWU3MTM4MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2Jvb3QvTWFrZWZpbGUKQEAgLTI1LDggKzI1LDggQEAKIAogI1JBTURJU0sgOj0gLURSQU1ESVNLPTUxMgogCi10YXJnZXRzCQk6PSB2bWxpbnV4LmJpbiBib290c2VjdCBib290c2VjdC5vIHNldHVwIHNldHVwLm8gXAotCQkgICB6SW1hZ2UgYnpJbWFnZQordGFyZ2V0cwkJOj0gdm1saW51eC5iaW4gYm9vdHNlY3QgYm9vdHNlY3QubyBcCisJCSAgIHNldHVwIHNldHVwLm8gekltYWdlIGJ6SW1hZ2UKIHN1YmRpci0gCTo9IGNvbXByZXNzZWQKIAogaG9zdHByb2dzLXkJOj0gdG9vbHMvYnVpbGQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKaW5kZXggYzVlODBiNi4uYjU4OTNlNCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9pMzg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIAkuZ2xvYmwgc3RhcnR1cF8zMgogCQpAQCAtNzQsNyArNzUsNyBAQAogCXBvcGwgJWVzaQkjIGRpc2NhcmQgYWRkcmVzcwogCXBvcGwgJWVzaQkjIHJlYWwgbW9kZSBwb2ludGVyCiAJeG9ybCAlZWJ4LCVlYngKLQlsam1wICQoX19CT09UX0NTKSwgJDB4MTAwMDAwCisJbGptcCAkKF9fQk9PVF9DUyksICRfX1BIWVNJQ0FMX1NUQVJUCiAKIC8qCiAgKiBXZSBjb21lIGhlcmUsIGlmIHdlIHdlcmUgbG9hZGVkIGhpZ2guCkBAIC05OSw3ICsxMDAsNyBAQAogCXBvcGwgJWVjeAkjIGxjb3VudAogCXBvcGwgJWVkeAkjIGhpZ2hfYnVmZmVyX3N0YXJ0CiAJcG9wbCAlZWF4CSMgaGNvdW50Ci0JbW92bCAkMHgxMDAwMDAsJWVkaQorCW1vdmwgJF9fUEhZU0lDQUxfU1RBUlQsJWVkaQogCWNsaQkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IGludGVycnVwdGVkCiAJbGptcCAkKF9fQk9PVF9DUyksICQweDEwMDAgIyBhbmQganVtcCB0byB0aGUgbW92ZSByb3V0aW5lCiAKQEAgLTEyNCw1ICsxMjUsNSBAQAogCW1vdnNsCiAJbW92bCAlZWJ4LCVlc2kJIyBSZXN0b3JlIHNldHVwIHBvaW50ZXIKIAl4b3JsICVlYngsJWVieAotCWxqbXAgJChfX0JPT1RfQ1MpLCAkMHgxMDAwMDAKKwlsam1wICQoX19CT09UX0NTKSwgJF9fUEhZU0lDQUxfU1RBUlQKIG1vdmVfcm91dGluZV9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IGNlZGM1NWMuLjgyYTgwN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gvaTM4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qCiAgKiBnemlwIGRlY2xhcmF0aW9ucwpAQCAtMzA4LDcgKzMwOSw3IEBACiAjZWxzZQogCWlmICgoUk1fQUxUX01FTV9LID4gUk1fRVhUX01FTV9LID8gUk1fQUxUX01FTV9LIDogUk1fRVhUX01FTV9LKSA8IDEwMjQpIGVycm9yKCJMZXNzIHRoYW4gMk1CIG9mIG1lbW9yeSIpOwogI2VuZGlmCi0Jb3V0cHV0X2RhdGEgPSAoY2hhciAqKTB4MTAwMDAwOyAvKiBQb2ludHMgdG8gMU0gKi8KKwlvdXRwdXRfZGF0YSA9IChjaGFyICopX19QSFlTSUNBTF9TVEFSVDsgLyogTm9ybWFsbHkgUG9pbnRzIHRvIDFNICovCiAJZnJlZV9tZW1fZW5kX3B0ciA9IChsb25nKXJlYWxfbW9kZTsKIH0KIApAQCAtMzMzLDggKzMzNCw4IEBACiAJbG93X2J1ZmZlcl9zaXplID0gbG93X2J1ZmZlcl9lbmQgLSBMT1dfQlVGRkVSX1NUQVJUOwogCWhpZ2hfbG9hZGVkID0gMTsKIAlmcmVlX21lbV9lbmRfcHRyID0gKGxvbmcpaGlnaF9idWZmZXJfc3RhcnQ7Ci0JaWYgKCAoMHgxMDAwMDAgKyBsb3dfYnVmZmVyX3NpemUpID4gKCh1bGcpaGlnaF9idWZmZXJfc3RhcnQpKSB7Ci0JCWhpZ2hfYnVmZmVyX3N0YXJ0ID0gKHVjaCAqKSgweDEwMDAwMCArIGxvd19idWZmZXJfc2l6ZSk7CisJaWYgKCAoX19QSFlTSUNBTF9TVEFSVCArIGxvd19idWZmZXJfc2l6ZSkgPiAoKHVsZyloaWdoX2J1ZmZlcl9zdGFydCkpIHsKKwkJaGlnaF9idWZmZXJfc3RhcnQgPSAodWNoICopKF9fUEhZU0lDQUxfU1RBUlQgKyBsb3dfYnVmZmVyX3NpemUpOwogCQltdi0+aGNvdW50ID0gMDsgLyogc2F5OiB3ZSBuZWVkIG5vdCB0byBtb3ZlIGhpZ2hfYnVmZmVyICovCiAJfQogCWVsc2UgbXYtPmhjb3VudCA9IC0xOwpAQCAtMzUzLDcgKzM1NCw2IEBACiAJfQogfQogCi0KIGFzbWxpbmthZ2UgaW50IGRlY29tcHJlc3Nfa2VybmVsKHN0cnVjdCBtb3ZlcGFyYW1zICptdiwgdm9pZCAqcm1vZGUpCiB7CiAJcmVhbF9tb2RlID0gcm1vZGU7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9lZGQuUyBiL2FyY2gvaTM4Ni9ib290L2VkZC5TCmluZGV4IDAyN2Q2YjMuLmQ4ZDY5ZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2VkZC5TCisrKyBiL2FyY2gvaTM4Ni9ib290L2VkZC5TCkBAIC02LDcgKzYsNyBAQAogICogICBwcm9qZWN0cyAxNTcyRCwgMTQ4NEQsIDEzODZELCAxMjI2RFQKICAqIGRpc2sgc2lnbmF0dXJlIHJlYWQgYnkgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgogICoJYW5kIEFuZHJldyBXaWxrcyA8QW5kcmV3X1dpbGtzQGRlbGwuY29tPiBTZXB0ZW1iZXIgMjAwMywgSnVuZSAyMDA0Ci0gKiBsZWdhY3kgQ0hTIHJldHJlaXZhbCBieSBQYXRyaWNrIEouIExvUHJlc3RpIDxwYXRsQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqIGxlZ2FjeSBDSFMgcmV0cmlldmFsIGJ5IFBhdHJpY2sgSi4gTG9QcmVzdGkgPHBhdGxAdXNlcnMuc291cmNlZm9yZ2UubmV0PgogICogICAgICBNYXJjaCAyMDA0CiAgKiBDb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNpbmcsIE1hdHQgRG9tc2NoLCBOb3ZlbWJlciAyMDA0CiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9ib290L3NldHVwLlMgYi9hcmNoL2kzODYvYm9vdC9zZXR1cC5TCmluZGV4IGNhYTFmZGUuLjhjYjQyMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L3NldHVwLlMKKysrIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwpAQCAtMzMsNyArMzMsNyBAQAogICogVHJhbnNjcmliZWQgZnJvbSBJbnRlbCAoYXM4NikgLT4gQVQmVCAoZ2FzKSBieSBDaHJpcyBOb2UsIE1heSAxOTk5LgogICogPHN0aWtlckBub3J0aGxpbmsuY29tPgogICoKLSAqIEZpeCB0byB3b3JrIGFyb3VuZCBidWdneSBCSU9TZXMgd2hpY2ggZG9udCB1c2UgY2FycnkgYml0IGNvcnJlY3RseQorICogRml4IHRvIHdvcmsgYXJvdW5kIGJ1Z2d5IEJJT1NlcyB3aGljaCBkb24ndCB1c2UgY2FycnkgYml0IGNvcnJlY3RseQogICogYW5kL29yIHJlcG9ydCBleHRlbmRlZCBtZW1vcnkgaW4gQ1gvRFggZm9yIGU4MDFoIG1lbW9yeSBzaXplIGRldGVjdGlvbiAKICAqIGNhbGwuICBBcyBhIHJlc3VsdCB0aGUga2VybmVsIGdvdCB3cm9uZyBmaWd1cmVzLiAgVGhlIGludDE1L2U4MDFoIGRvY3MKICAqIGZyb20gUmFsZiBCcm93biBpbnRlcnJ1cHQgbGlzdCBzZWVtIHRvIGluZGljYXRlIEFYL0JYIHNob3VsZCBiZSB1c2VkCkBAIC0zNTcsNyArMzU3LDcgQEAKIAogbWVtZTgwMToKIAlzdGMJCQkJCSMgZml4IHRvIHdvcmsgYXJvdW5kIGJ1Z2d5Ci0JeG9ydwklY3gsJWN4CQkJCSMgQklPU2VzIHdoaWNoIGRvbnQgY2xlYXIvc2V0CisJeG9ydwklY3gsJWN4CQkJCSMgQklPU2VzIHdoaWNoIGRvbid0IGNsZWFyL3NldAogCXhvcncJJWR4LCVkeAkJCQkjIGNhcnJ5IG9uIHBhc3MvZXJyb3Igb2YKIAkJCQkJCSMgZTgwMWggbWVtb3J5IHNpemUgY2FsbAogCQkJCQkJIyBvciBtZXJlbHkgcGFzcyBjeCxkeCB0aG91Z2gKQEAgLTg0Nyw3ICs4NDcsNyBAQAogIwogIwlidXQgd2UgeWV0IGhhdmVuJ3QgcmVsb2FkZWQgdGhlIENTIHJlZ2lzdGVyLCBzbyB0aGUgZGVmYXVsdCBzaXplIAogIwlvZiB0aGUgdGFyZ2V0IG9mZnNldCBzdGlsbCBpcyAxNiBiaXQuCi0jICAgICAgIEhvd2V2ZXIsIHVzaW5nIGFuIG9wZXJhbmQgcHJlZml4ICgweDY2KSwgdGhlIENQVSB3aWxsIHByb3Blcmx5CisjCUhvd2V2ZXIsIHVzaW5nIGFuIG9wZXJhbmQgcHJlZml4ICgweDY2KSwgdGhlIENQVSB3aWxsIHByb3Blcmx5CiAjCXRha2Ugb3VyIDQ4IGJpdCBmYXIgcG9pbnRlci4gKElOVGVMIDgwMzg2IFByb2dyYW1tZXIncyBSZWZlcmVuY2UKICMJTWFudWFsLCBNaXhpbmcgMTYtYml0IGFuZCAzMi1iaXQgY29kZSwgcGFnZSAxNi02KQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jIGIvYXJjaC9pMzg2L2Jvb3QvdG9vbHMvYnVpbGQuYwppbmRleCAyNjUwOWI4Li42ODM1ZjZkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvYm9vdC90b29scy9idWlsZC5jCisrKyBiL2FyY2gvaTM4Ni9ib290L3Rvb2xzL2J1aWxkLmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogICRJZDogYnVpbGQuYyx2IDEuNSAxOTk3LzA1LzE5IDEyOjI5OjU4IG1qIEV4cCAkCi0gKgogICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKICAqICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFydGluIE1hcmVzCiAgKi8KQEAgLTgsNyArNiw4IEBACiAvKgogICogVGhpcyBmaWxlIGJ1aWxkcyBhIGRpc2staW1hZ2UgZnJvbSB0aHJlZSBkaWZmZXJlbnQgZmlsZXM6CiAgKgotICogLSBib290c2VjdDogZXhhY3RseSA1MTIgYnl0ZXMgb2YgODA4NiBtYWNoaW5lIGNvZGUsIGxvYWRzIHRoZSByZXN0CisgKiAtIGJvb3RzZWN0OiBjb21wYXRpYmlsaXR5IG1iciB3aGljaCBwcmludHMgYW4gZXJyb3IgbWVzc2FnZSBpZgorICogICAgICAgICAgICAgc29tZW9uZSB0cmllcyB0byBib290IHRoZSBrZXJuZWwgZGlyZWN0bHkuCiAgKiAtIHNldHVwOiA4MDg2IG1hY2hpbmUgY29kZSwgc2V0cyB1cCBzeXN0ZW0gcGFybQogICogLSBzeXN0ZW06IDgwMzg2IGNvZGUgZm9yIGFjdHVhbCBzeXN0ZW0KICAqCkBAIC03MSw3ICs3MCw4IEBACiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCiB7Ci0JdW5zaWduZWQgaW50IGksIGMsIHN6LCBzZXR1cF9zZWN0b3JzOworCXVuc2lnbmVkIGludCBpLCBzeiwgc2V0dXBfc2VjdG9yczsKKwlpbnQgYzsKIAl1MzIgc3lzX3NpemU7CiAJYnl0ZSBtYWpvcl9yb290LCBtaW5vcl9yb290OwogCXN0cnVjdCBzdGF0IHNiOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2NyeXB0by9hZXMuYyBiL2FyY2gvaTM4Ni9jcnlwdG8vYWVzLmMKaW5kZXggMTAxOTQzMC4uODhlZTg1YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2NyeXB0by9hZXMuYworKysgYi9hcmNoL2kzODYvY3J5cHRvL2Flcy5jCkBAIC01OSw3ICs1OSw3IEBACiB9OwogCiAjZGVmaW5lIFdQT0xZIDB4MDExYgotI2RlZmluZSB1MzJfaW4oeCkgbGUzMl90b19jcHUoKihjb25zdCB1MzIgKikoeCkpCisjZGVmaW5lIHUzMl9pbih4KSBsZTMyX3RvX2NwdXAoKGNvbnN0IF9fbGUzMiAqKSh4KSkKICNkZWZpbmUgYnl0ZXMyd29yZChiMCwgYjEsIGIyLCBiMykgIFwKIAkoKCh1MzIpKGIzKSA8PCAyNCkgfCAoKHUzMikoYjIpIDw8IDE2KSB8ICgodTMyKShiMSkgPDwgOCkgfCAoYjApKQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvZGVmY29uZmlnIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwppbmRleCAyOGU2MjAzLi5jYTA3Yjk1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvZGVmY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTEyNiw3ICsxMjYsNiBAQAogIwogQ09ORklHX1BNPXkKIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EPXkKLSMgQ09ORklHX1BNX0RJU0sgaXMgbm90IHNldAogCiAjCiAjIEFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNTFlY2Q1MS4uNGNjODNiMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw3IEBACiBvYmotJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCSs9IGFwaWMubyBubWkubwogb2JqLSQoQ09ORklHX1g4Nl9JT19BUElDKQkrPSBpb19hcGljLm8KIG9iai0kKENPTkZJR19YODZfUkVCT09URklYVVBTKQkrPSByZWJvb3RfZml4dXBzLm8KK29iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubyBjcmFzaC5vCiBvYmotJChDT05GSUdfWDg2X05VTUFRKQkJKz0gbnVtYXEubwogb2JqLSQoQ09ORklHX1g4Nl9TVU1NSVRfTlVNQSkJKz0gc3VtbWl0Lm8KIG9iai0kKENPTkZJR19LUFJPQkVTKQkJKz0ga3Byb2Jlcy5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKaW5kZXggZWU3NWNiMi4uNWUyOTFhMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMiwzICsyLDcgQEAKIG9iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gZWFybHlxdWlyay5vCiBvYmotJChDT05GSUdfQUNQSV9TTEVFUCkJKz0gc2xlZXAubyB3YWtldXAubwogCitpZm5lcSAoJChDT05GSUdfQUNQSV9QUk9DRVNTT1IpLCkKK29iai15CQkJCSs9IGNzdGF0ZS5vCitlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCA4NDhiYjk3Li5iNzgwOGE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KQEAgLTE1OCw5ICsxNTksMTUgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRwotc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9tY2ZnKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCisvKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUuICBTZXQgZnJvbSBBQ1BJIHRhYmxlcy4gKi8KK3N0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpwY2lfbW1jZmdfY29uZmlnOworaW50IHBjaV9tbWNmZ19jb25maWdfbnVtOworCitpbnQgX19pbml0IGFjcGlfcGFyc2VfbWNmZyh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX21jZmcgKm1jZmc7CisJdW5zaWduZWQgbG9uZyBpOworCWludCBjb25maWdfc2l6ZTsKIAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE3MSwxOCArMTc4LDM4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChtY2ZnLT5iYXNlX3Jlc2VydmVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk1NQ09ORklHIG5vdCBpbiBsb3cgNEdCIG9mIG1lbW9yeVxuIik7CisJLyogaG93IG1hbnkgY29uZmlnIHN0cnVjdHVyZXMgZG8gd2UgaGF2ZSAqLworCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKKwlpID0gc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9tY2ZnKTsKKwl3aGlsZSAoaSA+PSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcpKSB7CisJCSsrcGNpX21tY2ZnX2NvbmZpZ19udW07CisJCWkgLT0gc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnKTsKKwl9OworCWlmIChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIk1NQ09ORklHIGhhcyBubyBlbnRyaWVzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcGNpX21tY2ZnX2Jhc2VfYWRkciA9IG1jZmctPmJhc2VfYWRkcmVzczsKKwljb25maWdfc2l6ZSA9IHBjaV9tbWNmZ19jb25maWdfbnVtICogc2l6ZW9mKCpwY2lfbW1jZmdfY29uZmlnKTsKKwlwY2lfbW1jZmdfY29uZmlnID0ga21hbGxvYyhjb25maWdfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2lfbW1jZmdfY29uZmlnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYCisJCSAgICAgICAiTm8gbWVtb3J5IGZvciBNQ0ZHIGNvbmZpZyB0YWJsZXNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkocGNpX21tY2ZnX2NvbmZpZywgJm1jZmctPmNvbmZpZywgY29uZmlnX3NpemUpOworCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7CisJCWlmIChtY2ZnLT5jb25maWdbaV0uYmFzZV9yZXNlcnZlZCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWAorCQkJICAgICAgICJNTUNPTkZJRyBub3QgaW4gbG93IDRHQiBvZiBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CiAKIAlyZXR1cm4gMDsKIH0KLSNlbHNlCi0jZGVmaW5lCWFjcGlfcGFyc2VfbWNmZyBOVUxMCi0jZW5kaWYgLyogIUNPTkZJR19QQ0lfTU1DT05GSUcgKi8KKyNlbmRpZiAvKiBDT05GSUdfUENJX01NQ09ORklHICovCiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIHN0YXRpYyBpbnQgX19pbml0CkBAIC01MDYsNiArNTMzLDIyIEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdW5tYXBfbHNhcGljKTsKICNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwogCitpbnQKK2FjcGlfcmVnaXN0ZXJfaW9hcGljKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTY0IHBoeXNfYWRkciwgdTMyIGdzaV9iYXNlKQoreworCS8qIFRCRCAqLworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChhY3BpX3JlZ2lzdGVyX2lvYXBpYyk7CisKK2ludAorYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSkKK3sKKwkvKiBUQkQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woYWNwaV91bnJlZ2lzdGVyX2lvYXBpYyk7CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdAogYWNwaV9zY2FuX3JzZHAgKAogCXVuc2lnbmVkIGxvbmcJCXN0YXJ0LApAQCAtODE1LDYgKzg1OCwyMTkgQEAKIAlyZXR1cm47CiB9CiAKK2V4dGVybiBpbnQgYWNwaV9mb3JjZTsKKworI2lmZGVmIF9faTM4Nl9fCisKKyNpZmRlZglDT05GSUdfQUNQSV9QQ0kKK3N0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfYWNwaV9pcnEoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKCFhY3BpX2ZvcmNlKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPW5vaXJxXG4iLAorCQkgICAgICAgZC0+aWRlbnQpOworCQlhY3BpX25vaXJxX3NldCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgZGlzYWJsZV9hY3BpX3BjaShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoIWFjcGlfZm9yY2UpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogZm9yY2UgdXNlIG9mIHBjaT1ub2FjcGlcbiIsCisJCSAgICAgICBkLT5pZGVudCk7CisJCWFjcGlfZGlzYWJsZV9wY2koKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZG1pX2Rpc2FibGVfYWNwaShzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKK3sKKwlpZiAoIWFjcGlfZm9yY2UpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogYWNwaSBvZmZcbiIsZC0+aWRlbnQpOworCQlkaXNhYmxlX2FjcGkoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJICAgICAgICJXYXJuaW5nOiBETUkgYmxhY2tsaXN0IHNheXMgYnJva2VuLCBidXQgYWNwaSBmb3JjZWRcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExpbWl0IEFDUEkgdG8gQ1BVIGVudW1lcmF0aW9uIGZvciBIVAorICovCitzdGF0aWMgaW50IF9faW5pdCBmb3JjZV9hY3BpX2h0KHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmICghYWNwaV9mb3JjZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzIGRldGVjdGVkOiBmb3JjZSB1c2Ugb2YgYWNwaT1odFxuIiwgZC0+aWRlbnQpOworCQlkaXNhYmxlX2FjcGkoKTsKKwkJYWNwaV9odCA9IDE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCSAgICAgICAiV2FybmluZzogYWNwaT1mb3JjZSBvdmVycnVsZXMgRE1JIGJsYWNrbGlzdDogYWNwaT1odFxuIik7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogSWYgeW91ciBzeXN0ZW0gaXMgYmxhY2tsaXN0ZWQgaGVyZSwgYnV0IHlvdSBmaW5kIHRoYXQgYWNwaT1mb3JjZQorICogd29ya3MgZm9yIHlvdSwgcGxlYXNlIGNvbnRhY3QgYWNwaS1kZXZlbEBzb3VyY2Vmb3JnZS5uZXQKKyAqLworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGRhdGEgYWNwaV9kbWlfdGFibGVbXSA9IHsKKwkvKgorCSAqIEJveGVzIHRoYXQgbmVlZCBBQ1BJIGRpc2FibGVkCisJICovCisJeworCQkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9hY3BpLAorCQkuaWRlbnQgPSAiSUJNIFRoaW5rcGFkIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiMjYyOUgxRyIpLAorCQl9LAorCX0sCisKKwkvKgorCSAqIEJveGVzIHRoYXQgbmVlZCBhY3BpPWh0CisJICovCisJeworCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCQkuaWRlbnQgPSAiRlNDIFByaW1lcmd5IFQ4NTAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkZVSklUU1UgU0lFTUVOUyIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQUklNRVJHWSBUODUwIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJCS5pZGVudCA9ICJERUxMIEdYMjQwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIgQ29ycG9yYXRpb24iKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIk9wdGlQbGV4IEdYMjQwIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJCS5pZGVudCA9ICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIFZJU1VBTElaRSBOVCBXb3Jrc3RhdGlvbiIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCQkuaWRlbnQgPSAiQ29tcGFxIFdvcmtzdGF0aW9uIFc4MDAwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJDb21wYXEiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiV29ya3N0YXRpb24gVzgwMDAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkJLmlkZW50ID0gIkFTVVMgUDRCMjY2IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRCMjY2IiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJCS5pZGVudCA9ICJBU1VTIFAyQi1EUyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlAyQi1EUyIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCQkuaWRlbnQgPSAiQVNVUyBDVVItRExTIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQ1VSLURMUyIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCQkuaWRlbnQgPSAiQUJJVCBpNDQwQlgtVzgzOTc3IiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFCSVQgPGh0dHA6Ly93d3cuYWJpdC5jb20+IiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJpNDQwQlgtVzgzOTc3IChCUDYpIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJCS5pZGVudCA9ICJJQk0gQmxhZGVjZW50ZXIiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJJQk0gZVNlcnZlciBCbGFkZUNlbnRlciBIUzIwIiksCisJCX0sCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGZvcmNlX2FjcGlfaHQsCisJCS5pZGVudCA9ICJJQk0gZVNlcnZlciB4U2VyaWVzIDM2MCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgImVTZXJ2ZXIgeFNlcmllcyAzNjAiKSwKKwkJfSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gZm9yY2VfYWNwaV9odCwKKwkJLmlkZW50ID0gIklCTSBlc2VydmVyIHhTZXJpZXMgMzMwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDMzMCIpLAorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBmb3JjZV9hY3BpX2h0LAorCQkuaWRlbnQgPSAiSUJNIGVzZXJ2ZXIgeFNlcmllcyA0NDAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgImVzZXJ2ZXIgeFNlcmllcyA0NDAiKSwKKwkJfSwKKwl9LAorCisjaWZkZWYJQ09ORklHX0FDUElfUENJCisJLyoKKwkgKiBCb3hlcyB0aGF0IG5lZWQgQUNQSSBQQ0kgSVJRIHJvdXRpbmcgZGlzYWJsZWQKKwkgKi8KKwl7CisJCS5jYWxsYmFjayA9IGRpc2FibGVfYWNwaV9pcnEsCisJCS5pZGVudCA9ICJBU1VTIEE3ViIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQyIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiPEE3Vj4iKSwKKwkJCS8qIG5ld2VyIEJJT1MsIFJldmlzaW9uIDEwMTEsIGRvZXMgd29yayAqLworCQkJRE1JX01BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIEE3ViBBQ1BJIEJJT1MgUmV2aXNpb24gMTAwNyIpLAorCQl9LAorCX0sCisKKwkvKgorCSAqIEJveGVzIHRoYXQgbmVlZCBBQ1BJIFBDSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gZGlzYWJsZWQKKwkgKi8KKwl7CS8qIF9CQk4gMCBidWcgKi8KKwkJLmNhbGxiYWNrID0gZGlzYWJsZV9hY3BpX3BjaSwKKwkJLmlkZW50ID0gIkFTVVMgUFItRExTIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiUFItRExTIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfVkVSU0lPTiwgIkFTVVMgUFItRExTIEFDUEkgQklPUyBSZXZpc2lvbiAxMDEwIiksCisJCQlETUlfTUFUQ0goRE1JX0JJT1NfREFURSwgIjAzLzIxLzIwMDMiKQorCQl9LAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBkaXNhYmxlX2FjcGlfcGNpLAorCQkuaWRlbnQgPSAiQWNlciBUcmF2ZWxNYXRlIDM2eCBMYXB0b3AiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKKyAJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlRyYXZlbE1hdGUgMzYwIiksCisJCX0sCisJfSwKKyNlbmRpZgorCXsgfQorfTsKKworI2VuZGlmCS8qIF9faTM4Nl9fICovCisKIC8qCiAgKiBhY3BpX2Jvb3RfdGFibGVfaW5pdCgpIGFuZCBhY3BpX2Jvb3RfaW5pdCgpCiAgKiAgY2FsbGVkIGZyb20gc2V0dXBfYXJjaCgpLCBhbHdheXMuCkBAIC04NDMsNiArMTA5OSwxMCBAQAogewogCWludCBlcnJvcjsKIAorI2lmZGVmIF9faTM4Nl9fCisJZG1pX2NoZWNrX3N5c3RlbShhY3BpX2RtaV90YWJsZSk7CisjZW5kaWYKKwogCS8qCiAJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKIAkgKiBPbmUgZXhjZXB0aW9uOiBhY3BpPWh0IGNvbnRpbnVlcyBmYXIgZW5vdWdoIHRvIGVudW1lcmF0ZSBMQVBJQ3MKQEAgLTg3MCw4ICsxMTMwLDYgQEAKIAkgKi8KIAllcnJvciA9IGFjcGlfYmxhY2tsaXN0ZWQoKTsKIAlpZiAoZXJyb3IpIHsKLQkJZXh0ZXJuIGludCBhY3BpX2ZvcmNlOwotCiAJCWlmIChhY3BpX2ZvcmNlKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiYWNwaT1mb3JjZSBvdmVycmlkZVxuIik7CiAJCX0gZWxzZSB7CkBAIC05MDcsNyArMTE2NSw2IEBACiAJYWNwaV9wcm9jZXNzX21hZHQoKTsKIAogCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9IUEVULCBhY3BpX3BhcnNlX2hwZXQpOwotCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9NQ0ZHLCBhY3BpX3BhcnNlX21jZmcpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvY3N0YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzMDM2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIGFyY2gvaTM4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbgorICogCVZlbmthdGVzaCBQYWxsaXBhZGkgPHZlbmthdGVzaC5wYWxsaXBhZGlAaW50ZWwuY29tPgorICogCS0gQWRkZWQgX1BEQyBmb3IgU01QIEMtc3RhdGVzIG9uIEludGVsIENQVXMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2FjcGkuaD4KKworc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9pbnRlbF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyCisJCQkJCQkqcG93KQoreworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpvYmpfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXUzMiAqYnVmOworCisJLyogYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgcGRjLiBJdCB3aWxsIGJlIHVzZWQgbGF0ZXIuICovCisJb2JqX2xpc3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghb2JqX2xpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCXJldHVybjsKKwl9CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX29iamVjdCksIEdGUF9LRVJORUwpOworCWlmICghb2JqKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQlrZnJlZShvYmpfbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwlidWYgPSBrbWFsbG9jKDEyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJa2ZyZWUob2JqKTsKKwkJa2ZyZWUob2JqX2xpc3QpOworCQlyZXR1cm47CisJfQorCisJYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7CisJYnVmWzFdID0gMTsKKwlidWZbMl0gPSBBQ1BJX1BEQ19DX0NBUEFCSUxJVFlfU01QOworCisJb2JqLT50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKKwlvYmotPmJ1ZmZlci5sZW5ndGggPSAxMjsKKwlvYmotPmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGJ1ZjsKKwlvYmpfbGlzdC0+Y291bnQgPSAxOworCW9ial9saXN0LT5wb2ludGVyID0gb2JqOworCXBvdy0+cGRjID0gb2JqX2xpc3Q7CisKKwlyZXR1cm47Cit9CisKKy8qIEluaXRpYWxpemUgX1BEQyBkYXRhIGJhc2VkIG9uIHRoZSBDUFUgdmVuZG9yICovCit2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlciAqcG93LAorCQkJCSAgIHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisKKwlwb3ctPnBkYyA9IE5VTEw7CisJaWYgKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9pbnRlbF9wZGMocG93KTsKKworCXJldHVybjsKK30KKworRVhQT1JUX1NZTUJPTChhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYyk7CisKKy8qCisgKiBJbml0aWFsaXplIGJtX2ZsYWdzIGJhc2VkIG9uIHRoZSBDUFUgY2FjaGUgcHJvcGVydGllcworICogT24gU01QIGl0IGRlcGVuZHMgb24gY2FjaGUgY29uZmlndXJhdGlvbgorICogLSBXaGVuIGNhY2hlIGlzIG5vdCBzaGFyZWQgYW1vbmcgYWxsIENQVXMsIHdlIGZsdXNoIGNhY2hlCisgKiAgIGJlZm9yZSBlbnRlcmluZyBDMy4KKyAqIC0gV2hlbiBjYWNoZSBpcyBzaGFyZWQgYW1vbmcgYWxsIENQVXMsIHdlIHVzZSBibV9jaGVjaworICogICBtZWNoYW5pc20gYXMgaW4gVVAgY2FzZQorICoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgb25seSBhZnRlciBhbGwgdGhlIENQVXMgYXJlIG9ubGluZQorICovCit2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywKKwkJCQkJdW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YSArIGNwdTsKKworCWZsYWdzLT5ibV9jaGVjayA9IDA7CisJaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpCisJCWZsYWdzLT5ibV9jaGVjayA9IDE7CisJZWxzZSBpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSB7CisJCS8qCisJCSAqIFRvZGF5IGFsbCBDUFVzIHRoYXQgc3VwcG9ydCBDMyBzaGFyZSBjYWNoZS4KKwkJICogVEJEOiBUaGlzIG5lZWRzIHRvIGxvb2sgYXQgY2FjaGUgc2hhcmVkIG1hcCwgb25jZQorCQkgKiBtdWx0aS1jb3JlIGRldGVjdGlvbiBwYXRjaCBtYWtlcyB0byB0aGUgYmFzZS4KKwkJICovCisJCWZsYWdzLT5ibV9jaGVjayA9IDE7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3NsZWVwLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCAyOGJiMDUxLi5jMWFmOTMwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtNyw2ICs3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCkBAIC05MSwzICs5MiwyOSBAQAogCiAKIF9fc2V0dXAoImFjcGlfc2xlZXA9IiwgYWNwaV9zbGVlcF9zZXR1cCk7CisKKworc3RhdGljIF9faW5pdCBpbnQgcmVzZXRfdmlkZW9tb2RlX2FmdGVyX3MzKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWFjcGlfdmlkZW9fZmxhZ3MgfD0gMjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9zeXN0ZW1faWQgYWNwaXNsZWVwX2RtaV90YWJsZVtdID0geworCXsJLyogUmVzZXQgdmlkZW8gbW9kZSBhZnRlciByZXR1cm5pbmcgZnJvbSBBQ1BJIFMzIHNsZWVwICovCisJCS5jYWxsYmFjayA9IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMywKKwkJLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIDQwMzBjZHQiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzQwMzBDRFQvNC4zIiksCisJCX0sCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlzbGVlcF9kbWlfaW5pdCh2b2lkKQoreworCWRtaV9jaGVja19zeXN0ZW0oYWNwaXNsZWVwX2RtaV90YWJsZSk7CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwoYWNwaXNsZWVwX2RtaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwppbmRleCAzOWQzMjQ4NC4uNDRkODg2YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtNzQsOCArNzQsOSBAQAogCW1vdncJJWF4LCVmcwogCW1vdncJJDB4MGUwMCArICdpJywgJWZzOigweDEyKQogCQotCSMgbmVlZCBhIGdkdAotCWxnZHQJcmVhbF9zYXZlX2dkdCAtIHdha2V1cF9jb2RlCisJIyBuZWVkIGEgZ2R0IC0tIHVzZSBsZ2R0bCB0byBmb3JjZSAzMi1iaXQgb3BlcmFuZHMsIGluIGNhc2UKKwkjIHRoZSBHRFQgaXMgbG9jYXRlZCBwYXN0IDE2IG1lZ2FieXRlcy4KKwlsZ2R0bAlyZWFsX3NhdmVfZ2R0IC0gd2FrZXVwX2NvZGUKIAogCW1vdmwJcmVhbF9zYXZlX2NyMCAtIHdha2V1cF9jb2RlLCAlZWF4CiAJbW92bAklZWF4LCAlY3IwCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCmluZGV4IDhkOTkzZmEuLmJkMWRiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTM0LDEyICszNSwxOCBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgogCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CiAKICNpbmNsdWRlICJpb19wb3J0cy5oIgogCiAvKgorICogS25vYiB0byBjb250cm9sIG91ciB3aWxsaW5nbmVzcyB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMuCisgKi8KK2ludCBlbmFibGVfbG9jYWxfYXBpYyBfX2luaXRkYXRhID0gMDsgLyogLTE9Zm9yY2UtZGlzYWJsZSwgKzE9Zm9yY2UtZW5hYmxlICovCisKKy8qCiAgKiBEZWJ1ZyBsZXZlbAogICovCiBpbnQgYXBpY192ZXJib3NpdHk7CkBAIC0yMDUsNyArMjEyLDcgQEAKIAllbmFibGVfYXBpY19tb2RlKCk7CiB9CiAKLXZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyh2b2lkKQordm9pZCBkaXNjb25uZWN0X2JzcF9BUElDKGludCB2aXJ0X3dpcmVfc2V0dXApCiB7CiAJaWYgKHBpY19tb2RlKSB7CiAJCS8qCkBAIC0yMTksNiArMjI2LDQyIEBACiAJCW91dGIoMHg3MCwgMHgyMik7CiAJCW91dGIoMHgwMCwgMHgyMyk7CiAJfQorCWVsc2UgeworCQkvKiBHbyBiYWNrIHRvIFZpcnR1YWwgV2lyZSBjb21wYXRpYmlsaXR5IG1vZGUgKi8KKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCQkvKiBGb3IgdGhlIHNwdXJpb3VzIGludGVycnVwdCB1c2UgdmVjdG9yIEYsIGFuZCBlbmFibGUgaXQgKi8KKwkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19TUElWKTsKKwkJdmFsdWUgJj0gfkFQSUNfVkVDVE9SX01BU0s7CisJCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7CisJCXZhbHVlIHw9IDB4ZjsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19TUElWLCB2YWx1ZSk7CisKKwkJaWYgKCF2aXJ0X3dpcmVfc2V0dXApIHsKKwkJCS8qIEZvciBMVlQwIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBleHRlcm5hbCBhbmQgZW5hYmxlZCAqLworCQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQwKTsKKwkJCXZhbHVlICY9IH4oQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CisJCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAorCQkJCUFQSUNfTFZUX0xFVkVMX1RSSUdHRVIgfCBBUElDX0xWVF9NQVNLRUQgKTsKKwkJCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKKwkJCXZhbHVlID0gU0VUX0FQSUNfREVMSVZFUllfTU9ERSh2YWx1ZSwgQVBJQ19NT0RFX0VYVElOVCk7CisJCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIHZhbHVlKTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIERpc2FibGUgTFZUMCAqLworCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQpOworCQl9CisKKwkJLyogRm9yIExWVDEgbWFrZSBpdCBlZGdlIHRyaWdnZXJlZCwgYWN0aXZlIGhpZ2gsIG5taSBhbmQgZW5hYmxlZCAqLworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCQl2YWx1ZSAmPSB+KAorCQkJQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CisJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9OTUkpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKwl9CiB9CiAKIHZvaWQgZGlzYWJsZV9sb2NhbF9BUElDKHZvaWQpCkBAIC0zNjMsNyArNDA2LDcgQEAKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKIH0KIAotdm9pZCBfX2luaXQgc2V0dXBfbG9jYWxfQVBJQyAodm9pZCkKK3ZvaWQgX19kZXZpbml0IHNldHVwX2xvY2FsX0FQSUModm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIG9sZHZhbHVlLCB2YWx1ZSwgdmVyLCBtYXhsdnQ7CiAKQEAgLTYzNCw3ICs2NzcsNyBAQAogCS5jbHMJPSAmbGFwaWNfc3lzY2xhc3MsCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGFwaWNfcG1fYWN0aXZhdGUodm9pZCkKIHsKIAlhcGljX3BtX3N0YXRlLmFjdGl2ZSA9IDE7CiB9CkBAIC02NjUsMjYgKzcwOCw2IEBACiAgKiBPcmlnaW5hbCBjb2RlIHdyaXR0ZW4gYnkgS2VpciBGcmFzZXIuCiAgKi8KIAotLyoKLSAqIEtub2IgdG8gY29udHJvbCBvdXIgd2lsbGluZ25lc3MgdG8gZW5hYmxlIHRoZSBsb2NhbCBBUElDLgotICovCi1pbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBsYXBpY19kaXNhYmxlKGNoYXIgKnN0cikKLXsKLQllbmFibGVfbG9jYWxfYXBpYyA9IC0xOwotCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQlyZXR1cm4gMDsKLX0KLV9fc2V0dXAoIm5vbGFwaWMiLCBsYXBpY19kaXNhYmxlKTsKLQotc3RhdGljIGludCBfX2luaXQgbGFwaWNfZW5hYmxlKGNoYXIgKnN0cikKLXsKLQllbmFibGVfbG9jYWxfYXBpYyA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci1fX3NldHVwKCJsYXBpYyIsIGxhcGljX2VuYWJsZSk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IGFwaWNfc2V0X3ZlcmJvc2l0eShjaGFyICpzdHIpCiB7CiAJaWYgKHN0cmNtcCgiZGVidWciLCBzdHIpID09IDApCkBAIC04NTUsOSArODc4LDggQEAKICAqIGJ1dCB3ZSBkbyBub3QgYWNjZXB0IHRpbWVyIGludGVycnVwdHMgeWV0LiBXZSBvbmx5IGFsbG93IHRoZSBCUAogICogdG8gY2FsaWJyYXRlLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBnZXRfODI1NF90aW1lcl9jb3VudCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgZ2V0XzgyNTRfdGltZXJfY291bnQodm9pZCkKIHsKLQlleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl1bnNpZ25lZCBpbnQgY291bnQ7CkBAIC04NzQsNyArODk2LDcgQEAKIH0KIAogLyogbmV4dCB0aWNrIGluIDgyNTQgY2FuIGJlIGNhdWdodCBieSBjYXRjaGluZyB0aW1lciB3cmFwYXJvdW5kICovCi1zdGF0aWMgdm9pZCBfX2luaXQgd2FpdF84MjU0X3dyYXBhcm91bmQodm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB3YWl0XzgyNTRfd3JhcGFyb3VuZCh2b2lkKQogewogCXVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBwcmV2X2NvdW50OwogCkBAIC04OTQsNyArOTE2LDcgQEAKICAqIERlZmF1bHQgaW5pdGlhbGl6YXRpb24gZm9yIDgyNTQgdGltZXJzLiBJZiB3ZSB1c2Ugb3RoZXIgdGltZXJzIGxpa2UgSFBFVCwKICAqIHdlIG92ZXJyaWRlIHRoaXMgbGF0ZXIKICAqLwotdm9pZCAoKndhaXRfdGltZXJfdGljaykodm9pZCkgX19pbml0ZGF0YSA9IHdhaXRfODI1NF93cmFwYXJvdW5kOwordm9pZCAoKndhaXRfdGltZXJfdGljaykodm9pZCkgX19kZXZpbml0ZGF0YSA9IHdhaXRfODI1NF93cmFwYXJvdW5kOwogCiAvKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyLCB3aXRoIGEgdGltZW91dCBvZgpAQCAtOTMwLDcgKzk1Miw3IEBACiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgY2xvY2tzL0FQSUNfRElWSVNPUik7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9BUElDX3RpbWVyKHVuc2lnbmVkIGludCBjbG9ja3MpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2V0dXBfQVBJQ190aW1lcih1bnNpZ25lZCBpbnQgY2xvY2tzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEwNDMsMTIgKzEwNjUsMTIgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKHZvaWQpCit2b2lkIF9fZGV2aW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQogewogCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKIH0KIAotdm9pZCBfX2luaXQgZGlzYWJsZV9BUElDX3RpbWVyKHZvaWQpCit2b2lkIF9fZGV2aW5pdCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCkKIHsKIAlpZiAodXNpbmdfYXBpY190aW1lcikgewogCQl1bnNpZ25lZCBsb25nIHY7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwbS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwppbmRleCAwZmY2NWFiLi4wNjQyMTFkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwbS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKQEAgLTIyOCwxMCArMjI4LDEwIEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KIAogI2luY2x1ZGUgImlvX3BvcnRzLmgiCiAKLWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfY21vc190aW1lKHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFjaGluZV9yZWFsX3Jlc3RhcnQodW5zaWduZWQgY2hhciAqLCBpbnQpOwogCkBAIC0zNDYsMTAgKzM0NiwxMCBAQAogc3RydWN0IGFwbV91c2VyIHsKIAlpbnQJCW1hZ2ljOwogCXN0cnVjdCBhcG1fdXNlciAqCW5leHQ7Ci0JaW50CQlzdXNlcjogMTsKLQlpbnQJCXdyaXRlcjogMTsKLQlpbnQJCXJlYWRlcjogMTsKLQlpbnQJCXN1c3BlbmRfd2FpdDogMTsKKwl1bnNpZ25lZCBpbnQJc3VzZXI6IDE7CisJdW5zaWduZWQgaW50CXdyaXRlcjogMTsKKwl1bnNpZ25lZCBpbnQJcmVhZGVyOiAxOworCXVuc2lnbmVkIGludAlzdXNwZW5kX3dhaXQ6IDE7CiAJaW50CQlzdXNwZW5kX3Jlc3VsdDsKIAlpbnQJCXN1c3BlbmRzX3BlbmRpbmc7CiAJaW50CQlzdGFuZGJ5c19wZW5kaW5nOwpAQCAtMTE2OCw4ICsxMTY4LDcgQEAKIHN0YXRpYyB2b2lkIHJlaW5pdF90aW1lcih2b2lkKQogewogI2lmZGVmIElOSVRfVElNRVJfQUZURVJfU1VTUEVORAotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKIAkvKiBzZXQgdGhlIGNsb2NrIHRvIDEwMCBIeiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCBiOTk1NDI0Li40NTUzZmZkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMjQsOSArMjQsOSBAQAogREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhciwgY3B1XzE2Yml0X3N0YWNrW0NQVV8xNkJJVF9TVEFDS19TSVpFXSk7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woY3B1XzE2Yml0X3N0YWNrKTsKIAotc3RhdGljIGludCBjYWNoZXNpemVfb3ZlcnJpZGUgX19pbml0ZGF0YSA9IC0xOwotc3RhdGljIGludCBkaXNhYmxlX3g4Nl9meHNyIF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCBkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgX19pbml0ZGF0YSA9IDE7CitzdGF0aWMgaW50IGNhY2hlc2l6ZV9vdmVycmlkZSBfX2RldmluaXRkYXRhID0gLTE7CitzdGF0aWMgaW50IGRpc2FibGVfeDg2X2Z4c3IgX19kZXZpbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGRpc2FibGVfeDg2X3NlcmlhbF9uciBfX2RldmluaXRkYXRhID0gMTsKIAogc3RydWN0IGNwdV9kZXYgKiBjcHVfZGV2c1tYODZfVkVORE9SX05VTV0gPSB7fTsKIApAQCAtNTksNyArNTksNyBAQAogfQogX19zZXR1cCgiY2FjaGVzaXplPSIsIGNhY2hlc2l6ZV9zZXR1cCk7CiAKLWludCBfX2luaXQgZ2V0X21vZGVsX25hbWUoc3RydWN0IGNwdWluZm9feDg2ICpjKQoraW50IF9fZGV2aW5pdCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdW5zaWduZWQgaW50ICp2OwogCWNoYXIgKnAsICpxOwpAQCAtODksNyArODksNyBAQAogfQogCiAKLXZvaWQgX19pbml0IGRpc3BsYXlfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IGRpc3BsYXlfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBpbnQgbiwgZHVtbXksIGVjeCwgZWR4LCBsMnNpemU7CiAKQEAgLTEzMCw3ICsxMzAsNyBAQAogLyogaW4gcGFydGljdWxhciwgaWYgQ1BVSUQgbGV2ZWxzIDB4ODAwMDAwMDIuLjQgYXJlIHN1cHBvcnRlZCwgdGhpcyBpc24ndCB1c2VkICovCiAKIC8qIExvb2sgdXAgQ1BVIG5hbWVzIGJ5IHRhYmxlIGxvb2t1cC4gKi8KLXN0YXRpYyBjaGFyIF9faW5pdCAqdGFibGVfbG9va3VwX21vZGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyBjaGFyIF9fZGV2aW5pdCAqdGFibGVfbG9va3VwX21vZGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAlzdHJ1Y3QgY3B1X21vZGVsX2luZm8gKmluZm87CiAKQEAgLTE1MSw3ICsxNTEsNyBAQAogfQogCiAKLXZvaWQgX19pbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgaW50IGVhcmx5KQordm9pZCBfX2RldmluaXQgZ2V0X2NwdV92ZW5kb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjLCBpbnQgZWFybHkpCiB7CiAJY2hhciAqdiA9IGMtPng4Nl92ZW5kb3JfaWQ7CiAJaW50IGk7CkBAIC0yMDIsNyArMjAyLDcgQEAKIAogCiAvKiBQcm9iZSBmb3IgdGhlIENQVUlEIGluc3RydWN0aW9uICovCi1zdGF0aWMgaW50IF9faW5pdCBoYXZlX2NwdWlkX3Aodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhhdmVfY3B1aWRfcCh2b2lkKQogewogCXJldHVybiBmbGFnX2lzX2NoYW5nZWFibGVfcChYODZfRUZMQUdTX0lEKTsKIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogI2VuZGlmCiB9CiAKLXZvaWQgX19pbml0IGdlbmVyaWNfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3ZvaWQgX19kZXZpbml0IGdlbmVyaWNfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKIHsKIAl1MzIgdGZtcywgeGx2bDsKIAlpbnQganVuazsKQEAgLTI5Niw3ICsyOTYsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNxdWFzaF90aGVfc3R1cGlkX3NlcmlhbF9udW1iZXIoc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHNxdWFzaF90aGVfc3R1cGlkX3NlcmlhbF9udW1iZXIoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX1BOKSAmJiBkaXNhYmxlX3g4Nl9zZXJpYWxfbnIgKSB7CiAJCS8qIERpc2FibGUgcHJvY2Vzc29yIHNlcmlhbCBudW1iZXIgKi8KQEAgLTMyNCw3ICszMjQsNyBAQAogLyoKICAqIFRoaXMgZG9lcyB0aGUgaGFyZCB3b3JrIG9mIGFjdHVhbGx5IHBpY2tpbmcgYXBhcnQgdGhlIENQVSBzdHVmZi4uLgogICovCi12b2lkIF9faW5pdCBpZGVudGlmeV9jcHUoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2RldmluaXQgaWRlbnRpZnlfY3B1KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAlpbnQgaTsKIApAQCAtNDMyLDEwICs0MzIsMTggQEAKICNpZmRlZiBDT05GSUdfWDg2X01DRQogCW1jaGVja19pbml0KGMpOwogI2VuZGlmCisJaWYgKGMgPT0gJmJvb3RfY3B1X2RhdGEpCisJCXN5c2VudGVyX3NldHVwKCk7CisJZW5hYmxlX3NlcF9jcHUoKTsKKworCWlmIChjID09ICZib290X2NwdV9kYXRhKQorCQltdHJyX2JwX2luaXQoKTsKKwllbHNlCisJCW10cnJfYXBfaW5pdCgpOwogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9IVAotdm9pZCBfX2luaXQgZGV0ZWN0X2h0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IGRldGVjdF9odChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTMyIAllYXgsIGVieCwgZWN4LCBlZHg7CiAJaW50IAlpbmRleF9tc2IsIHRtcDsKQEAgLTQ5MCw3ICs0OTgsNyBAQAogfQogI2VuZGlmCiAKLXZvaWQgX19pbml0IHByaW50X2NwdV9pbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IHByaW50X2NwdV9pbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAljaGFyICp2ZW5kb3IgPSBOVUxMOwogCkBAIC01MTMsNyArNTIxLDcgQEAKIAkJcHJpbnRrKCJcbiIpOwogfQogCi1jcHVtYXNrX3QgY3B1X2luaXRpYWxpemVkIF9faW5pdGRhdGEgPSBDUFVfTUFTS19OT05FOworY3B1bWFza190IGNwdV9pbml0aWFsaXplZCBfX2RldmluaXRkYXRhID0gQ1BVX01BU0tfTk9ORTsKIAogLyogVGhpcyBpcyBoYWNreS4gOikKICAqIFdlJ3JlIGVtdWxhdGluZyBmdXR1cmUgYmVoYXZpb3IuCkBAIC01NjAsNyArNTY4LDcgQEAKICAqIGFuZCBJRFQuIFdlIHJlbG9hZCB0aGVtIG5ldmVydGhlbGVzcywgdGhpcyBmdW5jdGlvbiBhY3RzIGFzIGEKICAqICdDUFUgc3RhdGUgYmFycmllcicsIG5vdGhpbmcgc2hvdWxkIGdldCBhY3Jvc3MuCiAgKi8KLXZvaWQgX19pbml0IGNwdV9pbml0ICh2b2lkKQordm9pZCBfX2RldmluaXQgY3B1X2luaXQodm9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCB0c3Nfc3RydWN0ICogdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOwpAQCAtNjQ4LDMgKzY1NiwxNSBAQAogCWNsZWFyX3VzZWRfbWF0aCgpOwogCW14Y3NyX2ZlYXR1cmVfbWFza19pbml0KCk7CiB9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3ZvaWQgX19kZXZpbml0IGNwdV91bmluaXQodm9pZCkKK3sKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpOworCisJLyogbGF6eSBUTEIgc3RhdGUgKi8KKwlwZXJfY3B1KGNwdV90bGJzdGF0ZSwgY3B1KS5zdGF0ZSA9IDA7CisJcGVyX2NwdShjcHVfdGxic3RhdGUsIGNwdSkuYWN0aXZlX21tID0gJmluaXRfbW07Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvZ3gtc3VzcG1vZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKaW5kZXggMWE0OWFkYi4uZTg2ZWE0OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9neC1zdXNwbW9kLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCiAJLyogZGV0ZWN0IHdoaWNoIGNvbXBhbmlvbiBjaGlwIGlzIHVzZWQgKi8KIAl3aGlsZSAoKGd4X3BjaSA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGd4X3BjaSkpICE9IE5VTEwpIHsKLQkJaWYgKChwY2lfbWF0Y2hfZGV2aWNlIChneF9jaGlwc2V0X3RibCwgZ3hfcGNpKSkgIT0gTlVMTCkgeworCQlpZiAoKHBjaV9tYXRjaF9pZChneF9jaGlwc2V0X3RibCwgZ3hfcGNpKSkgIT0gTlVMTCkgewogCQkJcmV0dXJuIGd4X3BjaTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazcuYwppbmRleCA1YzUzMDA2Li43M2E1ZGM1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs3LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rNy5jCkBAIC02NDgsOSArNjQ4LDcgQEAKIAl9CiAjZW5kaWYKIAotCWlmIChwb3dlcm5vd190YWJsZSkKLQkJa2ZyZWUocG93ZXJub3dfdGFibGUpOwotCisJa2ZyZWUocG93ZXJub3dfdGFibGUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYwppbmRleCA3ZGNiZjcwLi4zMjdhNTVkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCWFyZzAuYnVmZmVyLnBvaW50ZXIgPSAodTggKikgYXJnMF9idWY7CiAJYXJnMF9idWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKIAlhcmcwX2J1ZlsxXSA9IDE7Ci0JYXJnMF9idWZbMl0gPSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVAgfCBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9NU1I7CisJYXJnMF9idWZbMl0gPSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TTVBfTVNSOwogCiAJcC5wZGMgPSAmYXJnX2xpc3Q7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCmluZGV4IDEyMWFhMjEuLmEyYzMzYzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwpAQCAtMjUsMTAgKzI1LDEwIEBACiAvKgogICogQWxpZ25tZW50IGF0IHdoaWNoIG1vdnNsIGlzIHByZWZlcnJlZCBmb3IgYnVsayBtZW1vcnkgY29waWVzLgogICovCi1zdHJ1Y3QgbW92c2xfbWFzayBtb3ZzbF9tYXNrOworc3RydWN0IG1vdnNsX21hc2sgbW92c2xfbWFzayBfX3JlYWRfbW9zdGx5OwogI2VuZGlmCiAKLXZvaWQgX19pbml0IGVhcmx5X2ludGVsX3dvcmthcm91bmQoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2RldmluaXQgZWFybHlfaW50ZWxfd29ya2Fyb3VuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJaWYgKGMtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKIAkJcmV0dXJuOwpAQCAtNDMsNyArNDMsNyBAQAogICoJVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHdlIGRvIGNwdSBpZGVudCB3b3JrCiAgKi8KICAKLWludCBfX2luaXQgcHByb193aXRoX3JhbV9idWcodm9pZCkKK2ludCBfX2RldmluaXQgcHByb193aXRoX3JhbV9idWcodm9pZCkKIHsKIAkvKiBVc2VzIGRhdGEgZnJvbSBlYXJseV9jcHVfZGV0ZWN0IG5vdyAqLwogCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCAmJgpAQCAtNjEsNyArNjEsNyBAQAogICogUDQgWGVvbiBlcnJhdGEgMDM3IHdvcmthcm91bmQuCiAgKiBIYXJkd2FyZSBwcmVmZXRjaGVyIG1heSBjYXVzZSBzdGFsZSBkYXRhIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBjYWNoZS4KICAqLwotc3RhdGljIHZvaWQgX19pbml0IEludGVsX2VycmF0YV93b3JrYXJvdW5kcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgSW50ZWxfZXJyYXRhX3dvcmthcm91bmRzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBsb25nIGxvLCBoaTsKIApAQCAtODAsNyArODAsNyBAQAogLyoKICAqIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIG9uIHRoZSBkaWUKICAqLwotc3RhdGljIGludCBfX2luaXQgbnVtX2NwdV9jb3JlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudW1fY3B1X2NvcmVzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCkBAIC05OCw3ICs5OCw3IEBACiAJCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdW5zaWduZWQgaW50IGwyID0gMDsKIAljaGFyICpwID0gTlVMTDsKQEAgLTIwNCw3ICsyMDQsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgaW50ZWxfY3B1X2RldiBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBjcHVfZGV2IGludGVsX2NwdV9kZXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY192ZW5kb3IJPSAiSW50ZWwiLAogCS5jX2lkZW50IAk9IHsgIkdlbnVpbmVJbnRlbCIgfSwKIAkuY19tb2RlbHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCmluZGV4IGE3MTBkYzQuLjFkNzY4YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCkBAIC0yOCw3ICsyOCw3IEBACiB9OwogCiAvKiBhbGwgdGhlIGNhY2hlIGRlc2NyaXB0b3IgdHlwZXMgd2UgY2FyZSBhYm91dCAobm8gVExCIG9yIHRyYWNlIGNhY2hlIGVudHJpZXMpICovCi1zdGF0aWMgc3RydWN0IF9jYWNoZV90YWJsZSBjYWNoZV90YWJsZVtdIF9faW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBfY2FjaGVfdGFibGUgY2FjaGVfdGFibGVbXSBfX2RldmluaXRkYXRhID0KIHsKIAl7IDB4MDYsIExWTF8xX0lOU1QsIDggfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLwogCXsgMHgwOCwgTFZMXzFfSU5TVCwgMTYgfSwJLyogNC13YXkgc2V0IGFzc29jLCAzMiBieXRlIGxpbmUgc2l6ZSAqLwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2ludGVsX2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfaW50ZWxfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBpbnQgdHJhY2UgPSAwLCBsMWkgPSAwLCBsMWQgPSAwLCBsMiA9IDAsIGwzID0gMDsgLyogQ2FjaGUgc2l6ZXMgKi8KIAl1bnNpZ25lZCBpbnQgbmV3X2wxZCA9IDAsIG5ld19sMWkgPSAwOyAvKiBDYWNoZSBzaXplcyBmcm9tIGNwdWlkKDQpICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svazcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jCmluZGV4IDhkZjUyZTguLmM0YWJlNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9rNy5jCkBAIC02OSw3ICs2OSw3IEBACiAKIAogLyogQU1EIEs3IG1hY2hpbmUgY2hlY2sgaXMgSW50ZWwgbGlrZSAqLwotdm9pZCBfX2luaXQgYW1kX21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IGFtZF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTMyIGwsIGg7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMKaW5kZXggYmY2ZDFhZS4uMmNmMjVkMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSAibWNlLmgiCiAKLWludCBtY2VfZGlzYWJsZWQgX19pbml0ZGF0YSA9IDA7CitpbnQgbWNlX2Rpc2FibGVkIF9fZGV2aW5pdGRhdGEgPSAwOwogaW50IG5yX21jZV9iYW5rczsKIAogRVhQT1JUX1NZTUJPTF9HUEwobnJfbWNlX2JhbmtzKTsJLyogbm9uLWZhdGFsLm8gKi8KQEAgLTMxLDcgKzMxLDcgQEAKIHZvaWQgZmFzdGNhbGwgKCptYWNoaW5lX2NoZWNrX3ZlY3Rvcikoc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyBlcnJvcl9jb2RlKSA9IHVuZXhwZWN0ZWRfbWFjaGluZV9jaGVjazsKIAogLyogVGhpcyBoYXMgdG8gYmUgcnVuIGZvciBlYWNoIHByb2Nlc3NvciAqLwotdm9pZCBfX2luaXQgbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2RldmluaXQgbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCWlmIChtY2VfZGlzYWJsZWQ9PTEpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKaW5kZXggOGIxNmNlYi4uMGFiY2NiNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKQEAgLTc4LDcgKzc4LDcgQEAKIH0KIAogLyogUDQvWGVvbiBUaGVybWFsIHJlZ3VsYXRpb24gZGV0ZWN0IGFuZCBpbml0ICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW50ZWxfaW5pdF90aGVybWFsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbnRlbF9pbml0X3RoZXJtYWwoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXUzMiBsLCBoOwogCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC0yMzIsNyArMjMyLDcgQEAKIH0KIAogCi12b2lkIF9faW5pdCBpbnRlbF9wNF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit2b2lkIF9fZGV2aW5pdCBpbnRlbF9wNF9tY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTMyIGwsIGg7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCmluZGV4IGM0NWExYjQuLmVjMDYxNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNS5jCkBAIC0yOSw3ICsyOSw3IEBACiB9CiAKIC8qIFNldCB1cCBtYWNoaW5lIGNoZWNrIHJlcG9ydGluZyBmb3IgcHJvY2Vzc29ycyB3aXRoIEludGVsIHN0eWxlIE1DRSAqLwotdm9pZCBfX2luaXQgaW50ZWxfcDVfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2RldmluaXQgaW50ZWxfcDVfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXUzMiBsLCBoOwogCQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A2LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYwppbmRleCA0NjY0MGY4Li5mMDFiNzNmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svcDYuYwpAQCAtODAsNyArODAsNyBAQAogfQogCiAvKiBTZXQgdXAgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgZm9yIHByb2Nlc3NvcnMgd2l0aCBJbnRlbCBzdHlsZSBNQ0UgKi8KLXZvaWQgX19pbml0IGludGVsX3A2X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IGludGVsX3A2X21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1MzIgbCwgaDsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svd2luY2hpcC5jCmluZGV4IDc1M2ZhN2EuLjdiYWU2OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay93aW5jaGlwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3dpbmNoaXAuYwpAQCAtMjMsNyArMjMsNyBAQAogfQogCiAvKiBTZXQgdXAgbWFjaGluZSBjaGVjayByZXBvcnRpbmcgb24gdGhlIFdpbmNoaXAgQzYgc2VyaWVzICovCi12b2lkIF9faW5pdCB3aW5jaGlwX21jaGVja19pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IHdpbmNoaXBfbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXUzMiBsbywgaGk7CiAJbWFjaGluZV9jaGVja192ZWN0b3IgPSB3aW5jaGlwX21hY2hpbmVfY2hlY2s7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCmluZGV4IGY0NjhhOTcuLjE2OWFjOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCkBAIC02NywxNCArNjcsNiBAQAogCW10cnJfc3RhdGUuZW5hYmxlZCA9IChsbyAmIDB4YzAwKSA+PiAxMDsKIH0KIAotLyogIEZyZWUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHN0cnVjdCBtdHJyX3N0YXRlICAqLwotdm9pZCBfX2luaXQgZmluYWxpemVfbXRycl9zdGF0ZSh2b2lkKQotewotCWlmIChtdHJyX3N0YXRlLnZhcl9yYW5nZXMpCi0JCWtmcmVlKG10cnJfc3RhdGUudmFyX3Jhbmdlcyk7Ci0JbXRycl9zdGF0ZS52YXJfcmFuZ2VzID0gTlVMTDsKLX0KLQogLyogIFNvbWUgQklPUydzIGFyZSBmdWNrZWQgYW5kIGRvbid0IHNldCBhbGwgTVRSUnMgdGhlIHNhbWUhICAqLwogdm9pZCBfX2luaXQgbXRycl9zdGF0ZV93YXJuKHZvaWQpCiB7CkBAIC0zMzUsNiArMzI3LDkgQEAKICovCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXRycl92YXJfcmFuZ2UgKnZyOworCisJdnIgPSAmbXRycl9zdGF0ZS52YXJfcmFuZ2VzW3JlZ107CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcHJlcGFyZV9zZXQoKTsKQEAgLTM0MywxMSArMzM4LDE1IEBACiAJCS8qIFRoZSBpbnZhbGlkIGJpdCBpcyBrZXB0IGluIHRoZSBtYXNrLCBzbyB3ZSBzaW1wbHkgY2xlYXIgdGhlCiAJCSAgIHJlbGV2YW50IG1hc2sgcmVnaXN0ZXIgdG8gZGlzYWJsZSBhIHJhbmdlLiAqLwogCQltdHJyX3dybXNyKE1UUlJwaHlzTWFza19NU1IocmVnKSwgMCwgMCk7CisJCW1lbXNldCh2ciwgMCwgc2l6ZW9mKHN0cnVjdCBtdHJyX3Zhcl9yYW5nZSkpOwogCX0gZWxzZSB7Ci0JCW10cnJfd3Jtc3IoTVRSUnBoeXNCYXNlX01TUihyZWcpLCBiYXNlIDw8IFBBR0VfU0hJRlQgfCB0eXBlLAotCQkgICAgICAoYmFzZSAmIHNpemVfYW5kX21hc2spID4+ICgzMiAtIFBBR0VfU0hJRlQpKTsKLQkJbXRycl93cm1zcihNVFJScGh5c01hc2tfTVNSKHJlZyksIC1zaXplIDw8IFBBR0VfU0hJRlQgfCAweDgwMCwKLQkJICAgICAgKC1zaXplICYgc2l6ZV9hbmRfbWFzaykgPj4gKDMyIC0gUEFHRV9TSElGVCkpOworCQl2ci0+YmFzZV9sbyA9IGJhc2UgPDwgUEFHRV9TSElGVCB8IHR5cGU7CisJCXZyLT5iYXNlX2hpID0gKGJhc2UgJiBzaXplX2FuZF9tYXNrKSA+PiAoMzIgLSBQQUdFX1NISUZUKTsKKwkJdnItPm1hc2tfbG8gPSAtc2l6ZSA8PCBQQUdFX1NISUZUIHwgMHg4MDA7CisJCXZyLT5tYXNrX2hpID0gKC1zaXplICYgc2l6ZV9hbmRfbWFzaykgPj4gKDMyIC0gUEFHRV9TSElGVCk7CisKKwkJbXRycl93cm1zcihNVFJScGh5c0Jhc2VfTVNSKHJlZyksIHZyLT5iYXNlX2xvLCB2ci0+YmFzZV9oaSk7CisJCW10cnJfd3Jtc3IoTVRSUnBoeXNNYXNrX01TUihyZWcpLCB2ci0+bWFza19sbywgdnItPm1hc2tfaGkpOwogCX0KIAogCXBvc3Rfc2V0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IGQ2NmIwOWUuLjc2NGNhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCkBAIC0zMzIsNiArMzMyLDggQEAKIAogCWVycm9yID0gLUVJTlZBTDsKIAorCS8qIE5vIENQVSBob3RwbHVnIHdoZW4gd2UgY2hhbmdlIE1UUlIgZW50cmllcyAqLworCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAkvKiAgU2VhcmNoIGZvciBleGlzdGluZyBNVFJSICAqLwogCWRvd24oJm1haW5fbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IG51bV92YXJfcmFuZ2VzOyArK2kpIHsKQEAgLTM3Miw2ICszNzQsNyBAQAogCWVycm9yID0gaTsKICBvdXQ6CiAJdXAoJm1haW5fbG9jayk7CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC00NjEsNiArNDY0LDggQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAogCW1heCA9IG51bV92YXJfcmFuZ2VzOworCS8qIE5vIENQVSBob3RwbHVnIHdoZW4gd2UgY2hhbmdlIE1UUlIgZW50cmllcyAqLworCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAlkb3duKCZtYWluX2xvY2spOwogCWlmIChyZWcgPCAwKSB7CiAJCS8qICBTZWFyY2ggZm9yIGV4aXN0aW5nIE1UUlIgICovCkBAIC01MDEsNiArNTA2LDcgQEAKIAllcnJvciA9IHJlZzsKICBvdXQ6CiAJdXAoJm1haW5fbG9jayk7CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAJcmV0dXJuIGVycm9yOwogfQogLyoqCkBAIC01NDQsMjEgKzU1MCw5IEBACiAJY2VudGF1cl9pbml0X210cnIoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfb3RoZXJfY3B1cyh2b2lkKQotewotCWlmICh1c2VfaW50ZWwoKSkKLQkJZ2V0X210cnJfc3RhdGUoKTsKLQotCS8qIGJyaW5nIHVwIHRoZSBvdGhlciBwcm9jZXNzb3JzICovCi0Jc2V0X210cnIofjBVLDAsMCwwKTsKLQotCWlmICh1c2VfaW50ZWwoKSkgewotCQlmaW5hbGl6ZV9tdHJyX3N0YXRlKCk7Ci0JCW10cnJfc3RhdGVfd2FybigpOwotCX0KLX0KLQotCisvKiBUaGUgc3VzcGVuZC9yZXN1bWUgbWV0aG9kcyBhcmUgb25seSBmb3IgQ1BVIHdpdGhvdXQgTVRSUi4gQ1BVIHVzaW5nIGdlbmVyaWMKKyAqIE1UUlIgZHJpdmVyIGRvZXNuJ3QgcmVxdWlyZSB0aGlzCisgKi8KIHN0cnVjdCBtdHJyX3ZhbHVlIHsKIAltdHJyX3R5cGUJbHR5cGU7CiAJdW5zaWduZWQgbG9uZwlsYmFzZTsKQEAgLTYxMSwxMyArNjA1LDEzIEBACiAKIAogLyoqCi0gKiBtdHJyX2luaXQgLSBpbml0aWFsaXplIG10cnJzIG9uIHRoZSBib290IENQVQorICogbXRycl9icF9pbml0IC0gaW5pdGlhbGl6ZSBtdHJycyBvbiB0aGUgYm9vdCBDUFUKICAqCiAgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBlYXJseTsgYmVmb3JlIGFueSBvZiB0aGUgb3RoZXIgQ1BVcyBhcmUgCiAgKiBpbml0aWFsaXplZCAoaS5lLiBiZWZvcmUgc21wX2luaXQoKSkuCiAgKiAKICAqLwotc3RhdGljIGludCBfX2luaXQgbXRycl9pbml0KHZvaWQpCit2b2lkIF9faW5pdCBtdHJyX2JwX2luaXQodm9pZCkKIHsKIAlpbml0X2lmcygpOwogCkBAIC02NzQsMTIgKzY2OCw0OCBAQAogCWlmIChtdHJyX2lmKSB7CiAJCXNldF9udW1fdmFyX3JhbmdlcygpOwogCQlpbml0X3RhYmxlKCk7Ci0JCWluaXRfb3RoZXJfY3B1cygpOwotCi0JCXJldHVybiBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLAotCQkJCQkgICAgICAmbXRycl9zeXNkZXZfZHJpdmVyKTsKKwkJaWYgKHVzZV9pbnRlbCgpKQorCQkJZ2V0X210cnJfc3RhdGUoKTsKIAl9Ci0JcmV0dXJuIC1FTlhJTzsKIH0KIAotc3Vic3lzX2luaXRjYWxsKG10cnJfaW5pdCk7Cit2b2lkIG10cnJfYXBfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIW10cnJfaWYgfHwgIXVzZV9pbnRlbCgpKQorCQlyZXR1cm47CisJLyoKKwkgKiBJZGVhbGx5IHdlIHNob3VsZCBob2xkIG1haW5fbG9jayBoZXJlIHRvIGF2b2lkIG10cnIgZW50cmllcyBjaGFuZ2VkLAorCSAqIGJ1dCB0aGlzIHJvdXRpbmUgd2lsbCBiZSBjYWxsZWQgaW4gY3B1IGJvb3QgdGltZSwgaG9sZGluZyB0aGUgbG9jaworCSAqIGJyZWFrcyBpdC4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpbiB0d28gY2FzZXM6IDEudmVyeSBlYXJpbHkgdGltZQorCSAqIG9mIHNvZnR3YXJlIHJlc3VtZSwgd2hlbiB0aGVyZSBhYnNvbHV0ZWx5IGlzbid0IG10cnIgZW50cnkgY2hhbmdlczsKKwkgKiAyLmNwdSBob3RhZGQgdGltZS4gV2UgbGV0IG10cnJfYWRkL2RlbF9wYWdlIGhvbGQgY3B1aG90cGx1ZyBsb2NrIHRvCisJICogcHJldmVudCBtdHJyIGVudHJ5IGNoYW5nZXMKKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwltdHJyX2lmLT5zZXRfYWxsKCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG10cnJfaW5pdF9maW5pYWxpemUodm9pZCkKK3sKKwlpZiAoIW10cnJfaWYpCisJCXJldHVybiAwOworCWlmICh1c2VfaW50ZWwoKSkKKwkJbXRycl9zdGF0ZV93YXJuKCk7CisJZWxzZSB7CisJCS8qIFRoZSBDUFVzIGhhdmVuJ3QgTVRSUiBhbmQgc2VlbWVzIG5vdCBzdXBwb3J0IFNNUC4gVGhleSBoYXZlCisJCSAqIHNwZWNpZmljIGRyaXZlcnMsIHdlIHVzZSBhIHRyaWNreSBtZXRob2QgdG8gc3VwcG9ydAorCQkgKiBzdXNwZW5kL3Jlc3VtZSBmb3IgdGhlbS4KKwkJICogVEJEOiBpcyB0aGVyZSBhbnkgc3lzdGVtIHdpdGggc3VjaCBDUFUgd2hpY2ggc3VwcG9ydHMKKwkJICogc3VzcGVuZC9yZXN1bWU/ICBpZiBubywgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29kZS4KKwkJICovCisJCXN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsCisJCQkmbXRycl9zeXNkZXZfZHJpdmVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CitzdWJzeXNfaW5pdGNhbGwobXRycl9pbml0X2ZpbmlhbGl6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCmluZGV4IGRlMTM1MTI0Li45OWM5ZjI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL210cnIuaApAQCAtOTEsNyArOTEsNiBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IG51bV92YXJfcmFuZ2VzOwogCi12b2lkIGZpbmFsaXplX210cnJfc3RhdGUodm9pZCk7CiB2b2lkIG10cnJfc3RhdGVfd2Fybih2b2lkKTsKIGNoYXIgKm10cnJfYXR0cmliX3RvX3N0cihpbnQgeCk7CiB2b2lkIG10cnJfd3Jtc3IodW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMgYi9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmYWIxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYwpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyAoaTM4NikgZnVuY3Rpb25zIGZvciBrZXhlYyBiYXNlZCBjcmFzaCBkdW1wcy4KKyAqCisgKiBDcmVhdGVkIGJ5OiBIYXJpcHJhc2FkIE5lbGxpdGhlZXJ0aGEgKGhhcmlAaW4uaWJtLmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9pcGkuaD4KKworCitub3RlX2J1Zl90IGNyYXNoX25vdGVzW05SX0NQVVNdOworLyogVGhpcyBrZWVwcyBhIHRyYWNrIG9mIHdoaWNoIG9uZSBpcyBjcmFzaGluZyBjcHUuICovCitzdGF0aWMgaW50IGNyYXNoaW5nX2NwdTsKKworc3RhdGljIHUzMiAqYXBwZW5kX2VsZl9ub3RlKHUzMiAqYnVmLCBjaGFyICpuYW1lLCB1bnNpZ25lZCB0eXBlLCB2b2lkICpkYXRhLAorCQkJCQkJCSAgICAgICBzaXplX3QgZGF0YV9sZW4pCit7CisJc3RydWN0IGVsZl9ub3RlIG5vdGU7CisKKwlub3RlLm5fbmFtZXN6ID0gc3RybGVuKG5hbWUpICsgMTsKKwlub3RlLm5fZGVzY3N6ID0gZGF0YV9sZW47CisJbm90ZS5uX3R5cGUgICA9IHR5cGU7CisJbWVtY3B5KGJ1ZiwgJm5vdGUsIHNpemVvZihub3RlKSk7CisJYnVmICs9IChzaXplb2Yobm90ZSkgKzMpLzQ7CisJbWVtY3B5KGJ1ZiwgbmFtZSwgbm90ZS5uX25hbWVzeik7CisJYnVmICs9IChub3RlLm5fbmFtZXN6ICsgMykvNDsKKwltZW1jcHkoYnVmLCBkYXRhLCBub3RlLm5fZGVzY3N6KTsKKwlidWYgKz0gKG5vdGUubl9kZXNjc3ogKyAzKS80OworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgZmluYWxfbm90ZSh1MzIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZWxmX25vdGUgbm90ZTsKKworCW5vdGUubl9uYW1lc3ogPSAwOworCW5vdGUubl9kZXNjc3ogPSAwOworCW5vdGUubl90eXBlICAgPSAwOworCW1lbWNweShidWYsICZub3RlLCBzaXplb2Yobm90ZSkpOworfQorCitzdGF0aWMgdm9pZCBjcmFzaF9zYXZlX3RoaXNfY3B1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQoreworCXN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXM7CisJdTMyICpidWY7CisKKwlpZiAoKGNwdSA8IDApIHx8IChjcHUgPj0gTlJfQ1BVUykpCisJCXJldHVybjsKKworCS8qIFVzaW5nIEVMRiBub3RlcyBoZXJlIGlzIG9wcG9ydHVuaXN0aWMuCisJICogSSBuZWVkIGEgd2VsbCBkZWZpbmVkIHN0cnVjdHVyZSBmb3JtYXQKKwkgKiBmb3IgdGhlIGRhdGEgSSBwYXNzLCBhbmQgSSBuZWVkIHRhZ3MKKwkgKiBvbiB0aGUgZGF0YSB0byBpbmRpY2F0ZSB3aGF0IGluZm9ybWF0aW9uIEkgaGF2ZQorCSAqIHNxdWlycmVsbGVkIGF3YXkuICBFTEYgbm90ZXMgaGFwcGVuIHRvIHByb3ZpZGUKKwkgKiBhbGwgb2YgdGhhdCB0aGF0IG5vIG5lZWQgdG8gaW52ZW50IHNvbWV0aGluZyBuZXcuCisJICovCisJYnVmID0gJmNyYXNoX25vdGVzW2NwdV1bMF07CisJbWVtc2V0KCZwcnN0YXR1cywgMCwgc2l6ZW9mKHByc3RhdHVzKSk7CisJcHJzdGF0dXMucHJfcGlkID0gY3VycmVudC0+cGlkOworCWVsZl9jb3JlX2NvcHlfcmVncygmcHJzdGF0dXMucHJfcmVnLCByZWdzKTsKKwlidWYgPSBhcHBlbmRfZWxmX25vdGUoYnVmLCAiQ09SRSIsIE5UX1BSU1RBVFVTLCAmcHJzdGF0dXMsCisJCQkJc2l6ZW9mKHByc3RhdHVzKSk7CisJZmluYWxfbm90ZShidWYpOworfQorCitzdGF0aWMgdm9pZCBjcmFzaF9nZXRfY3VycmVudF9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWJ4LCUwIiA6ICI9bSIocmVncy0+ZWJ4KSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlY3gsJTAiIDogIj1tIihyZWdzLT5lY3gpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVkeCwlMCIgOiAiPW0iKHJlZ3MtPmVkeCkpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZXNpLCUwIiA6ICI9bSIocmVncy0+ZXNpKSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlZGksJTAiIDogIj1tIihyZWdzLT5lZGkpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92bCAlJWVicCwlMCIgOiAiPW0iKHJlZ3MtPmVicCkpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZsICUlZWF4LCUwIiA6ICI9bSIocmVncy0+ZWF4KSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlc3AsJTAiIDogIj1tIihyZWdzLT5lc3ApKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92dyAlJXNzLCAlJWF4OyIgOiI9YSIocmVncy0+eHNzKSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdncgJSVjcywgJSVheDsiIDoiPWEiKHJlZ3MtPnhjcykpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3Z3ICUlZHMsICUlYXg7IiA6Ij1hIihyZWdzLT54ZHMpKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92dyAlJWVzLCAlJWF4OyIgOiI9YSIocmVncy0+eGVzKSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2hmbDsgcG9wbCAlMCIgOiI9bSIocmVncy0+ZWZsYWdzKSk7CisKKwlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZyljdXJyZW50X3RleHRfYWRkcigpOworfQorCisvKiBDUFUgZG9lcyBub3Qgc2F2ZSBzcyBhbmQgZXNwIG9uIHN0YWNrIGlmIGV4ZWN1dGlvbiBpcyBhbHJlYWR5CisgKiBydW5uaW5nIGluIGtlcm5lbCBtb2RlIGF0IHRoZSB0aW1lIG9mIE5NSSBvY2N1cnJlbmNlLiBUaGlzIGNvZGUKKyAqIGZpeGVzIGl0LgorICovCitzdGF0aWMgdm9pZCBjcmFzaF9zZXR1cF9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLCBzdHJ1Y3QgcHRfcmVncyAqb2xkcmVncykKK3sKKwltZW1jcHkobmV3cmVncywgb2xkcmVncywgc2l6ZW9mKCpuZXdyZWdzKSk7CisJbmV3cmVncy0+ZXNwID0gKHVuc2lnbmVkIGxvbmcpJihvbGRyZWdzLT5lc3ApOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJ4b3JsICVlYXgsICVlYXg7Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3Z3ICUlc3MsICUlYXg7IiA6Ij1hIihuZXdyZWdzLT54c3MpKTsKK30KKworLyogV2UgbWF5IGhhdmUgc2F2ZWRfcmVncyBmcm9tIHdoZXJlIHRoZSBlcnJvciBjYW1lIGZyb20KKyAqIG9yIGl0IGlzIE5VTEwgaWYgdmlhIGEgZGlyZWN0IHBhbmljKCkuCisgKi8KK3N0YXRpYyB2b2lkIGNyYXNoX3NhdmVfc2VsZihzdHJ1Y3QgcHRfcmVncyAqc2F2ZWRfcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworCWludCBjcHU7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKHNhdmVkX3JlZ3MpCisJCWNyYXNoX3NldHVwX3JlZ3MoJnJlZ3MsIHNhdmVkX3JlZ3MpOworCWVsc2UKKwkJY3Jhc2hfZ2V0X2N1cnJlbnRfcmVncygmcmVncyk7CisJY3Jhc2hfc2F2ZV90aGlzX2NwdSgmcmVncywgY3B1KTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBhdG9taWNfdCB3YWl0aW5nX2Zvcl9jcmFzaF9pcGk7CisKK3N0YXRpYyBpbnQgY3Jhc2hfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQoreworCXN0cnVjdCBwdF9yZWdzIGZpeGVkX3JlZ3M7CisKKwkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGhhbmRsZXIgaXMgaW52b2tlZCBvbiBjcmFzaGluZyBjcHUuCisJICogT3RoZXJ3aXNlLCBzeXN0ZW0gd2lsbCBjb21wbGV0ZWx5IGhhbmcuIENyYXNoaW5nIGNwdSBjYW4gZ2V0CisJICogYW4gTk1JIGlmIHN5c3RlbSB3YXMgaW5pdGlhbGx5IGJvb3RlZCB3aXRoIG5taV93YXRjaGRvZyBwYXJhbWV0ZXIuCisJICovCisJaWYgKGNwdSA9PSBjcmFzaGluZ19jcHUpCisJCXJldHVybiAxOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCQljcmFzaF9zZXR1cF9yZWdzKCZmaXhlZF9yZWdzLCByZWdzKTsKKwkJcmVncyA9ICZmaXhlZF9yZWdzOworCX0KKwljcmFzaF9zYXZlX3RoaXNfY3B1KHJlZ3MsIGNwdSk7CisJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJYXRvbWljX2RlYygmd2FpdGluZ19mb3JfY3Jhc2hfaXBpKTsKKwkvKiBBc3N1bWUgaGx0IHdvcmtzICovCisJX19hc21fXygiaGx0Iik7CisJZm9yKDs7KTsKKworCXJldHVybiAxOworfQorCisvKgorICogQnkgdXNpbmcgdGhlIE5NSSBjb2RlIGluc3RlYWQgb2YgYSB2ZWN0b3Igd2UganVzdCBzbmVhayB0aHJ1IHRoZQorICogd29yZCBnZW5lcmF0b3IgY29taW5nIG91dCB3aXRoIGp1c3Qgd2hhdCB3ZSB3YW50LiAgQU5EIGl0IGRvZXMKKyAqIG5vdCBtYXR0ZXIgaWYgY2x1c3RlcmVkX2FwaWNfbW9kZSBpcyBzZXQgb3Igbm90LgorICovCitzdGF0aWMgdm9pZCBzbXBfc2VuZF9ubWlfYWxsYnV0c2VsZih2b2lkKQoreworCXNlbmRfSVBJX2FsbGJ1dHNlbGYoQVBJQ19ETV9OTUkpOworfQorCitzdGF0aWMgdm9pZCBubWlfc2hvb3Rkb3duX2NwdXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1zZWNzOworCisJYXRvbWljX3NldCgmd2FpdGluZ19mb3JfY3Jhc2hfaXBpLCBudW1fb25saW5lX2NwdXMoKSAtIDEpOworCS8qIFdvdWxkIGl0IGJlIGJldHRlciB0byByZXBsYWNlIHRoZSB0cmFwIHZlY3RvciBoZXJlPyAqLworCXNldF9ubWlfY2FsbGJhY2soY3Jhc2hfbm1pX2NhbGxiYWNrKTsKKwkvKiBFbnN1cmUgdGhlIG5ldyBjYWxsYmFjayBmdW5jdGlvbiBpcyBzZXQgYmVmb3JlIHNlbmRpbmcKKwkgKiBvdXQgdGhlIE5NSQorCSAqLworCXdtYigpOworCisJc21wX3NlbmRfbm1pX2FsbGJ1dHNlbGYoKTsKKworCW1zZWNzID0gMTAwMDsgLyogV2FpdCBhdCBtb3N0IGEgc2Vjb25kIGZvciB0aGUgb3RoZXIgY3B1cyB0byBzdG9wICovCisJd2hpbGUgKChhdG9taWNfcmVhZCgmd2FpdGluZ19mb3JfY3Jhc2hfaXBpKSA+IDApICYmIG1zZWNzKSB7CisJCW1kZWxheSgxKTsKKwkJbXNlY3MtLTsKKwl9CisKKwkvKiBMZWF2ZSB0aGUgbm1pIGNhbGxiYWNrIHNldCAqLworCWRpc2FibGVfbG9jYWxfQVBJQygpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIG5taV9zaG9vdGRvd25fY3B1cyh2b2lkKQoreworCS8qIFRoZXJlIGFyZSBubyBjcHVzIHRvIHNob290ZG93biAqLworfQorI2VuZGlmCisKK3ZvaWQgbWFjaGluZV9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzeXN0ZW0KKwkgKiBoYXMgcGFuaWNlZCBvciBpcyBvdGhlcndpc2UgaW4gYSBjcml0aWNhbCBzdGF0ZS4KKwkgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29kZSB0byBhbGxvdyBhIGtleGVjJ2Qga2VybmVsCisJICogdG8gcnVuIHN1Y2Nlc3NmdWxseSBuZWVkcyB0byBoYXBwZW4gaGVyZS4KKwkgKgorCSAqIEluIHByYWN0aWNlIHRoaXMgbWVhbnMgc2hvb3RpbmcgZG93biB0aGUgb3RoZXIgY3B1cyBpbgorCSAqIGFuIFNNUCBzeXN0ZW0uCisJICovCisJLyogVGhlIGtlcm5lbCBpcyBicm9rZW4gc28gZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIE1ha2UgYSBub3RlIG9mIGNyYXNoaW5nIGNwdS4gV2lsbCBiZSB1c2VkIGluIE5NSSBjYWxsYmFjay4qLworCWNyYXNoaW5nX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlubWlfc2hvb3Rkb3duX2NwdXMoKTsKKwlsYXBpY19zaHV0ZG93bigpOworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKQorCWRpc2FibGVfSU9fQVBJQygpOworI2VuZGlmCisJY3Jhc2hfc2F2ZV9zZWxmKHJlZ3MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jCmluZGV4IDZlZDdlMjguLmEzY2RmODkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvZG1pX3NjYW4uYworKysgYi9hcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMKQEAgLTEsMjIgKzEsMTUgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogCi1zdHJ1Y3QgZG1pX2hlYWRlcgotewotCXU4CXR5cGU7Ci0JdTgJbGVuZ3RoOwotCXUxNgloYW5kbGU7CitzdHJ1Y3QgZG1pX2hlYWRlciB7CisJdTggdHlwZTsKKwl1OCBsZW5ndGg7CisJdTE2IGhhbmRsZTsKIH07CiAKICN1bmRlZiBETUlfREVCVUcKQEAgLTI5LDE1ICsyMiwxMyBAQAogCiBzdGF0aWMgY2hhciAqIF9faW5pdCBkbWlfc3RyaW5nKHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgdTggcykKIHsKLQl1OCAqYnA9KHU4ICopZG07Ci0JYnArPWRtLT5sZW5ndGg7Ci0JaWYoIXMpCisJdTggKmJwID0gKCh1OCAqKSBkbSkgKyBkbS0+bGVuZ3RoOworCisJaWYgKCFzKQogCQlyZXR1cm4gIiI7CiAJcy0tOwotCXdoaWxlKHM+MCAmJiAqYnApCi0JewotCQlicCs9c3RybGVuKGJwKTsKLQkJYnArKzsKKwl3aGlsZSAocyA+IDAgJiYgKmJwKSB7CisJCWJwICs9IHN0cmxlbihicCkgKyAxOwogCQlzLS07CiAJfQogCXJldHVybiBicDsKQEAgLTQ3LDE2ICszOCwxNCBAQAogICoJV2UgaGF2ZSB0byBiZSBjYXV0aW91cyBoZXJlLiBXZSBoYXZlIHNlZW4gQklPU2VzIHdpdGggRE1JIHBvaW50ZXJzCiAgKglwb2ludGluZyB0byBjb21wbGV0ZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3IgZXhhbXBsZQogICovCi0gCi1zdGF0aWMgaW50IF9faW5pdCBkbWlfdGFibGUodTMyIGJhc2UsIGludCBsZW4sIGludCBudW0sIHZvaWQgKCpkZWNvZGUpKHN0cnVjdCBkbWlfaGVhZGVyICopKQorc3RhdGljIGludCBfX2luaXQgZG1pX3RhYmxlKHUzMiBiYXNlLCBpbnQgbGVuLCBpbnQgbnVtLAorCQkJICAgIHZvaWQgKCpkZWNvZGUpKHN0cnVjdCBkbWlfaGVhZGVyICopKQogewotCXU4ICpidWY7Ci0Jc3RydWN0IGRtaV9oZWFkZXIgKmRtOwotCXU4ICpkYXRhOwotCWludCBpPTA7CisJdTggKmJ1ZiwgKmRhdGE7CisJaW50IGkgPSAwOwogCQkKIAlidWYgPSBidF9pb3JlbWFwKGJhc2UsIGxlbik7Ci0JaWYoYnVmPT1OVUxMKQorCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCiAJZGF0YSA9IGJ1ZjsKQEAgLTY1LDM2ICs1NCwzNCBAQAogIAkgKglTdG9wIHdoZW4gd2Ugc2VlIGFsbCB0aGUgaXRlbXMgdGhlIHRhYmxlIGNsYWltZWQgdG8gaGF2ZQogIAkgKglPUiB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlIChhbHNvIGhhcHBlbnMpCiAgCSAqLwotIAotCXdoaWxlKGk8bnVtICYmIGRhdGEtYnVmK3NpemVvZihzdHJ1Y3QgZG1pX2hlYWRlcik8PWxlbikKLQl7Ci0JCWRtPShzdHJ1Y3QgZG1pX2hlYWRlciAqKWRhdGE7CisJd2hpbGUgKChpIDwgbnVtKSAmJiAoZGF0YSAtIGJ1ZiArIHNpemVvZihzdHJ1Y3QgZG1pX2hlYWRlcikpIDw9IGxlbikgeworCQlzdHJ1Y3QgZG1pX2hlYWRlciAqZG0gPSAoc3RydWN0IGRtaV9oZWFkZXIgKilkYXRhOwogCQkvKgogCQkgKiAgV2Ugd2FudCB0byBrbm93IHRoZSB0b3RhbCBsZW5ndGggKGZvcm1hdGVkIGFyZWEgYW5kIHN0cmluZ3MpCiAJCSAqICBiZWZvcmUgZGVjb2RpbmcgdG8gbWFrZSBzdXJlIHdlIHdvbid0IHJ1biBvZmYgdGhlIHRhYmxlIGluCiAJCSAqICBkbWlfZGVjb2RlIG9yIGRtaV9zdHJpbmcKIAkJICovCi0JCWRhdGErPWRtLT5sZW5ndGg7Ci0JCXdoaWxlKGRhdGEtYnVmPGxlbi0xICYmIChkYXRhWzBdIHx8IGRhdGFbMV0pKQorCQlkYXRhICs9IGRtLT5sZW5ndGg7CisJCXdoaWxlICgoZGF0YSAtIGJ1ZiA8IGxlbiAtIDEpICYmIChkYXRhWzBdIHx8IGRhdGFbMV0pKQogCQkJZGF0YSsrOwotCQlpZihkYXRhLWJ1ZjxsZW4tMSkKKwkJaWYgKGRhdGEgLSBidWYgPCBsZW4gLSAxKQogCQkJZGVjb2RlKGRtKTsKLQkJZGF0YSs9MjsKKwkJZGF0YSArPSAyOwogCQlpKys7CiAJfQogCWJ0X2lvdW5tYXAoYnVmLCBsZW4pOwogCXJldHVybiAwOwogfQogCi0KLWlubGluZSBzdGF0aWMgaW50IF9faW5pdCBkbWlfY2hlY2tzdW0odTggKmJ1ZikKK3N0YXRpYyBpbnQgX19pbml0IGRtaV9jaGVja3N1bSh1OCAqYnVmKQogewotCXU4IHN1bT0wOworCXU4IHN1bSA9IDA7CiAJaW50IGE7CiAJCi0JZm9yKGE9MDsgYTwxNTsgYSsrKQotCQlzdW0rPWJ1ZlthXTsKLQlyZXR1cm4gKHN1bT09MCk7CisJZm9yIChhID0gMDsgYSA8IDE1OyBhKyspCisJCXN1bSArPSBidWZbYV07CisKKwlyZXR1cm4gc3VtID09IDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGRtaV9pdGVyYXRlKHZvaWQgKCpkZWNvZGUpKHN0cnVjdCBkbWlfaGVhZGVyICopKQpAQCAtMTEwLDI4ICs5NywzMCBAQAogCXAgPSBpb3JlbWFwKDB4RjAwMDAsIDB4MTAwMDApOwogCWlmIChwID09IE5VTEwpCiAJCXJldHVybiAtMTsKKwogCWZvciAocSA9IHA7IHEgPCBwICsgMHgxMDAwMDsgcSArPSAxNikgewogCQltZW1jcHlfZnJvbWlvKGJ1ZiwgcSwgMTUpOwotCQlpZihtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCAmJiBkbWlfY2hlY2tzdW0oYnVmKSkKLQkJewotCQkJdTE2IG51bT1idWZbMTNdPDw4fGJ1ZlsxMl07Ci0JCQl1MTYgbGVuPWJ1Zls3XTw8OHxidWZbNl07Ci0JCQl1MzIgYmFzZT1idWZbMTFdPDwyNHxidWZbMTBdPDwxNnxidWZbOV08PDh8YnVmWzhdOworCQlpZiAoKG1lbWNtcChidWYsICJfRE1JXyIsIDUpID09IDApICYmIGRtaV9jaGVja3N1bShidWYpKSB7CisJCQl1MTYgbnVtID0gKGJ1ZlsxM10gPDwgOCkgfCBidWZbMTJdOworCQkJdTE2IGxlbiA9IChidWZbN10gPDwgOCkgfCBidWZbNl07CisJCQl1MzIgYmFzZSA9IChidWZbMTFdIDw8IDI0KSB8IChidWZbMTBdIDw8IDE2KSB8CisJCQkJICAgKGJ1Zls5XSA8PCA4KSB8IGJ1Zls4XTsKIAogCQkJLyoKIAkJCSAqIERNSSB2ZXJzaW9uIDAuMCBtZWFucyB0aGF0IHRoZSByZWFsIHZlcnNpb24gaXMgdGFrZW4gZnJvbQogCQkJICogdGhlIFNNQklPUyB2ZXJzaW9uLCB3aGljaCB3ZSBkb24ndCBrbm93IGF0IHRoaXMgcG9pbnQuCiAJCQkgKi8KLQkJCWlmKGJ1ZlsxNF0hPTApCisJCQlpZiAoYnVmWzE0XSAhPSAwKQogCQkJCXByaW50ayhLRVJOX0lORk8gIkRNSSAlZC4lZCBwcmVzZW50LlxuIiwKLQkJCQkJYnVmWzE0XT4+NCwgYnVmWzE0XSYweDBGKTsKKwkJCQkJYnVmWzE0XSA+PiA0LCBidWZbMTRdICYgMHhGKTsKIAkJCWVsc2UKIAkJCQlwcmludGsoS0VSTl9JTkZPICJETUkgcHJlc2VudC5cbiIpOworCiAJCQlkbWlfcHJpbnRrKChLRVJOX0lORk8gIiVkIHN0cnVjdHVyZXMgb2NjdXB5aW5nICVkIGJ5dGVzLlxuIiwKIAkJCQludW0sIGxlbikpOwotCQkJZG1pX3ByaW50aygoS0VSTl9JTkZPICJETUkgdGFibGUgYXQgMHglMDhYLlxuIiwKLQkJCQliYXNlKSk7Ci0JCQlpZihkbWlfdGFibGUoYmFzZSxsZW4sIG51bSwgZGVjb2RlKT09MCkKKwkJCWRtaV9wcmludGsoKEtFUk5fSU5GTyAiRE1JIHRhYmxlIGF0IDB4JTA4WC5cbiIsIGJhc2UpKTsKKworCQkJaWYgKGRtaV90YWJsZShiYXNlLGxlbiwgbnVtLCBkZWNvZGUpID09IDApCiAJCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC0xNDMsMTYgKzEzMiwxNyBAQAogLyoKICAqCVNhdmUgYSBETUkgc3RyaW5nCiAgKi8KLSAKIHN0YXRpYyB2b2lkIF9faW5pdCBkbWlfc2F2ZV9pZGVudChzdHJ1Y3QgZG1pX2hlYWRlciAqZG0sIGludCBzbG90LCBpbnQgc3RyaW5nKQogewogCWNoYXIgKmQgPSAoY2hhciopZG07CiAJY2hhciAqcCA9IGRtaV9zdHJpbmcoZG0sIGRbc3RyaW5nXSk7Ci0JaWYocD09TlVMTCB8fCAqcCA9PSAwKQorCisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAwKQogCQlyZXR1cm47CiAJaWYgKGRtaV9pZGVudFtzbG90XSkKIAkJcmV0dXJuOwotCWRtaV9pZGVudFtzbG90XSA9IGFsbG9jX2Jvb3RtZW0oc3RybGVuKHApKzEpOworCisJZG1pX2lkZW50W3Nsb3RdID0gYWxsb2NfYm9vdG1lbShzdHJsZW4ocCkgKyAxKTsKIAlpZihkbWlfaWRlbnRbc2xvdF0pCiAJCXN0cmNweShkbWlfaWRlbnRbc2xvdF0sIHApOwogCWVsc2UKQEAgLTE2MCwyODEgKzE1MCw0NyBAQAogfQogCiAvKgotICogVWdseSBjb21wYXRpYmlsaXR5IGNyYXAuCi0gKi8KLSNkZWZpbmUgZG1pX2JsYWNrbGlzdAlkbWlfc3lzdGVtX2lkCi0jZGVmaW5lIE5PX01BVENICXsgRE1JX05PTkUsIE5VTEx9Ci0jZGVmaW5lIE1BVENICQlETUlfTUFUQ0gKLQotLyoKLSAqIFRvc2hpYmEga2V5Ym9hcmQgbGlrZXMgdG8gcmVwZWF0IGtleXMgd2hlbiB0aGV5IGFyZSBub3QgcmVwZWF0ZWQuCi0gKi8KLQotc3RhdGljIF9faW5pdCBpbnQgYnJva2VuX3Rvc2hpYmFfa2V5Ym9hcmQoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpCi17Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiVG9zaGliYSB3aXRoIGJyb2tlbiBrZXlib2FyZCBkZXRlY3RlZC4gSWYgeW91ciBrZXlib2FyZCBzb21ldGltZXMgZ2VuZXJhdGVzIDMga2V5cHJlc3NlcyBpbnN0ZWFkIG9mIG9uZSwgc2VlIGh0dHA6Ly9kYXZ5ZC51Y2MuYXNuLmF1L3Byb2plY3RzL3Rvc2hpYmEvUkVBRE1FXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0jaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKLXN0YXRpYyBfX2luaXQgaW50IHJlc2V0X3ZpZGVvbW9kZV9hZnRlcl9zMyhzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkKLXsKLQkvKiBTZWUgYWNwaV93YWtldXAuUyAqLwotCWV4dGVybiBsb25nIGFjcGlfdmlkZW9fZmxhZ3M7Ci0JYWNwaV92aWRlb19mbGFncyB8PSAyOwotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLQotI2lmZGVmCUNPTkZJR19BQ1BJX0JPT1QKLWV4dGVybiBpbnQgYWNwaV9mb3JjZTsKLQotc3RhdGljIF9faW5pdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBpbnQgZG1pX2Rpc2FibGVfYWNwaShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCi17IAotCWlmICghYWNwaV9mb3JjZSkgeyAKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBkZXRlY3RlZDogYWNwaSBvZmZcbiIsZC0+aWRlbnQpOyAKLQkJZGlzYWJsZV9hY3BpKCk7Ci0JfSBlbHNlIHsgCi0JCXByaW50ayhLRVJOX05PVElDRSAKLQkJICAgICAgICJXYXJuaW5nOiBETUkgYmxhY2tsaXN0IHNheXMgYnJva2VuLCBidXQgYWNwaSBmb3JjZWRcbiIpOyAKLQl9Ci0JcmV0dXJuIDA7Ci19IAotCi0vKgotICogTGltaXQgQUNQSSB0byBDUFUgZW51bWVyYXRpb24gZm9yIEhUCi0gKi8KLXN0YXRpYyBfX2luaXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW50IGZvcmNlX2FjcGlfaHQoc3RydWN0IGRtaV9ibGFja2xpc3QgKmQpIAoteyAKLQlpZiAoIWFjcGlfZm9yY2UpIHsgCi0JCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPWh0XG4iLCBkLT5pZGVudCk7IAotCQlkaXNhYmxlX2FjcGkoKTsKLQkJYWNwaV9odCA9IDE7IAotCX0gZWxzZSB7IAotCQlwcmludGsoS0VSTl9OT1RJQ0UgCi0JCSAgICAgICAiV2FybmluZzogYWNwaT1mb3JjZSBvdmVycnVsZXMgRE1JIGJsYWNrbGlzdDogYWNwaT1odFxuIik7IAotCX0KLQlyZXR1cm4gMDsKLX0gCi0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19BQ1BJX1BDSQotc3RhdGljIF9faW5pdCBpbnQgZGlzYWJsZV9hY3BpX2lycShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCi17Ci0JaWYgKCFhY3BpX2ZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBhY3BpPW5vaXJxXG4iLAotCQkgICAgICAgZC0+aWRlbnQpOyAJCi0JCWFjcGlfbm9pcnFfc2V0KCk7Ci0JfQotCXJldHVybiAwOwotfQotc3RhdGljIF9faW5pdCBpbnQgZGlzYWJsZV9hY3BpX3BjaShzdHJ1Y3QgZG1pX2JsYWNrbGlzdCAqZCkgCi17Ci0JaWYgKCFhY3BpX2ZvcmNlKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IGZvcmNlIHVzZSBvZiBwY2k9bm9hY3BpXG4iLAotCQkgICAgICAgZC0+aWRlbnQpOyAJCi0JCWFjcGlfZGlzYWJsZV9wY2koKTsKLQl9Ci0JcmV0dXJuIDA7Ci19ICAKLSNlbmRpZgotCi0vKgotICoJUHJvY2VzcyB0aGUgRE1JIGJsYWNrbGlzdHMKLSAqLwotIAotCi0vKgotICoJVGhpcyB3aWxsIGJlIGV4cGFuZGVkIG92ZXIgdGltZSB0byBmb3JjZSB0aGluZ3MgbGlrZSB0aGUgQVBNIAotICoJaW50ZXJydXB0IG1hc2sgc2V0dGluZ3MgYWNjb3JkaW5nIHRvIHRoZSBsYXB0b3AKLSAqLwotIAotc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IGRtaV9ibGFja2xpc3QgZG1pX2JsYWNrbGlzdFtdPXsKLQotCXsgYnJva2VuX3Rvc2hpYmFfa2V5Ym9hcmQsICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwgeyAvKiBLZXlib2FyZCBnZW5lcmF0ZXMgc3B1cmlvdXMgcmVwZWF0cyAqLwotCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLAotCQkJTk9fTUFUQ0gsIE5PX01BVENILCBOT19NQVRDSAotCQkJfSB9LAotI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCi0JeyByZXNldF92aWRlb21vZGVfYWZ0ZXJfczMsICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwgeyAvKiBSZXNldCB2aWRlbyBtb2RlIGFmdGVyIHJldHVybmluZyBmcm9tIEFDUEkgUzMgc2xlZXAgKi8KLQkJCU1BVENIKERNSV9QUk9EVUNUX05BTUUsICJTNDAzMENEVC80LjMiKSwKLQkJCU5PX01BVENILCBOT19NQVRDSCwgTk9fTUFUQ0gKLQkJCX0gfSwKLSNlbmRpZgotCi0jaWZkZWYJQ09ORklHX0FDUElfQk9PVAotCS8qCi0JICogSWYgeW91ciBzeXN0ZW0gaXMgYmxhY2tsaXN0ZWQgaGVyZSwgYnV0IHlvdSBmaW5kIHRoYXQgYWNwaT1mb3JjZQotCSAqIHdvcmtzIGZvciB5b3UsIHBsZWFzZSBjb250YWN0IGFjcGktZGV2ZWxAc291cmNlZm9yZ2UubmV0Ci0JICovCi0KLQkvKgotCSAqCUJveGVzIHRoYXQgbmVlZCBBQ1BJIGRpc2FibGVkCi0JICovCi0KLQl7IGRtaV9kaXNhYmxlX2FjcGksICJJQk0gVGhpbmtwYWQiLCB7Ci0JCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIjI2MjlIMUciKSwKLQkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKLQotCS8qCi0JICoJQm94ZXMgdGhhdCBuZWVkIGFjcGk9aHQgCi0JICovCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJGU0MgUHJpbWVyZ3kgVDg1MCIsIHsKLQkJCU1BVENIKERNSV9TWVNfVkVORE9SLCAiRlVKSVRTVSBTSUVNRU5TIiksCi0JCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUFJJTUVSR1kgVDg1MCIpLAotCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAotCi0JeyBmb3JjZV9hY3BpX2h0LCAiREVMTCBHWDI0MCIsIHsKLQkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJEZWxsIENvbXB1dGVyIENvcnBvcmF0aW9uIiksCi0JCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIk9wdGlQbGV4IEdYMjQwIiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJIUCBWSVNVQUxJWkUgTlQgV29ya3N0YXRpb24iLCB7Ci0JCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCi0JCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgVklTVUFMSVpFIE5UIFdvcmtzdGF0aW9uIiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJDb21wYXEgV29ya3N0YXRpb24gVzgwMDAiLCB7Ci0JCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkNvbXBhcSIpLAotCQkJTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIldvcmtzdGF0aW9uIFc4MDAwIiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIFA0QjI2NiIsIHsKLQkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKLQkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUDRCMjY2IiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIFAyQi1EUyIsIHsKLQkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKLQkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiUDJCLURTIiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJBU1VTIENVUi1ETFMiLCB7Ci0JCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCi0JCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIkNVUi1ETFMiKSwKLQkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKLQotCXsgZm9yY2VfYWNwaV9odCwgIkFCSVQgaTQ0MEJYLVc4Mzk3NyIsIHsKLQkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBQklUIDxodHRwOi8vd3d3LmFiaXQuY29tPiIpLAotCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJpNDQwQlgtVzgzOTc3IChCUDYpIiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJJQk0gQmxhZGVjZW50ZXIiLCB7Ci0JCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIklCTSBlU2VydmVyIEJsYWRlQ2VudGVyIEhTMjAiKSwKLQkJCU5PX01BVENILCBOT19NQVRDSCB9fSwKLQotCXsgZm9yY2VfYWNwaV9odCwgIklCTSBlU2VydmVyIHhTZXJpZXMgMzYwIiwgewotCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIklCTSIpLAotCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJlU2VydmVyIHhTZXJpZXMgMzYwIiksCi0JCQlOT19NQVRDSCwgTk9fTUFUQ0ggfX0sCi0KLQl7IGZvcmNlX2FjcGlfaHQsICJJQk0gZXNlcnZlciB4U2VyaWVzIDMzMCIsIHsKLQkJCU1BVENIKERNSV9CT0FSRF9WRU5ET1IsICJJQk0iKSwKLQkJCU1BVENIKERNSV9CT0FSRF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDMzMCIpLAotCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAotCi0JeyBmb3JjZV9hY3BpX2h0LCAiSUJNIGVzZXJ2ZXIgeFNlcmllcyA0NDAiLCB7Ci0JCQlNQVRDSChETUlfQk9BUkRfVkVORE9SLCAiSUJNIiksCi0JCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiZXNlcnZlciB4U2VyaWVzIDQ0MCIpLAotCQkJTk9fTUFUQ0gsIE5PX01BVENIIH19LAotCi0jZW5kaWYJLy8gQ09ORklHX0FDUElfQk9PVAotCi0jaWZkZWYJQ09ORklHX0FDUElfUENJCi0JLyoKLQkgKglCb3hlcyB0aGF0IG5lZWQgQUNQSSBQQ0kgSVJRIHJvdXRpbmcgZGlzYWJsZWQKLQkgKi8KLQotCXsgZGlzYWJsZV9hY3BpX2lycSwgIkFTVVMgQTdWIiwgewotCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DIiksCi0JCQlNQVRDSChETUlfQk9BUkRfTkFNRSwgIjxBN1Y+IiksCi0JCQkvKiBuZXdlciBCSU9TLCBSZXZpc2lvbiAxMDExLCBkb2VzIHdvcmsgKi8KLQkJCU1BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIEE3ViBBQ1BJIEJJT1MgUmV2aXNpb24gMTAwNyIpLAotCQkJTk9fTUFUQ0ggfX0sCi0KLQkvKgotCSAqCUJveGVzIHRoYXQgbmVlZCBBQ1BJIFBDSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gZGlzYWJsZWQKLQkgKi8KLQl7IGRpc2FibGVfYWNwaV9wY2ksICJBU1VTIFBSLURMUyIsIHsJLyogX0JCTiAwIGJ1ZyAqLwotCQkJTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAotCQkJTUFUQ0goRE1JX0JPQVJEX05BTUUsICJQUi1ETFMiKSwKLQkJCU1BVENIKERNSV9CSU9TX1ZFUlNJT04sICJBU1VTIFBSLURMUyBBQ1BJIEJJT1MgUmV2aXNpb24gMTAxMCIpLAotCQkJTUFUQ0goRE1JX0JJT1NfREFURSwgIjAzLzIxLzIwMDMiKSB9fSwKLQotIAl7IGRpc2FibGVfYWNwaV9wY2ksICJBY2VyIFRyYXZlbE1hdGUgMzZ4IExhcHRvcCIsIHsKLSAJCQlNQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFjZXIiKSwKLSAJCQlNQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVHJhdmVsTWF0ZSAzNjAiKSwKLSAJCQlOT19NQVRDSCwgTk9fTUFUQ0gKLSAJCQl9IH0sCi0KLSNlbmRpZgotCi0JeyBOVUxMLCB9Ci19OwotCi0vKgogICoJUHJvY2VzcyBhIERNSSB0YWJsZSBlbnRyeS4gUmlnaHQgbm93IGFsbCB3ZSBjYXJlIGFib3V0IGFyZSB0aGUgQklPUwogICoJYW5kIG1hY2hpbmUgZW50cmllcy4gRm9yIDIuNSB3ZSBzaG91bGQgcHVsbCB0aGUgc21idXMgY29udHJvbGxlciBpbmZvCiAgKglvdXQgb2YgaGVyZS4KICAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgZG1pX2RlY29kZShzdHJ1Y3QgZG1pX2hlYWRlciAqZG0pCiB7Ci0jaWZkZWYgRE1JX0RFQlVHCi0JdTggKmRhdGEgPSAodTggKilkbTsKLSNlbmRpZgorCXU4ICpkYXRhIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSA9ICh1OCAqKWRtOwogCQotCXN3aXRjaChkbS0+dHlwZSkKLQl7Ci0JCWNhc2UgIDA6Ci0JCQlkbWlfcHJpbnRrKCgiQklPUyBWZW5kb3I6ICVzXG4iLAotCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNF0pKSk7Ci0JCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfVkVORE9SLCA0KTsKLQkJCWRtaV9wcmludGsoKCJCSU9TIFZlcnNpb246ICVzXG4iLCAKLQkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOwotCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFUlNJT04sIDUpOwotCQkJZG1pX3ByaW50aygoIkJJT1MgUmVsZWFzZTogJXNcbiIsCi0JCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs4XSkpKTsKLQkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQklPU19EQVRFLCA4KTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQlkbWlfcHJpbnRrKCgiU3lzdGVtIFZlbmRvcjogJXNcbiIsCi0JCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKLQkJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfU1lTX1ZFTkRPUiwgNCk7Ci0JCQlkbWlfcHJpbnRrKCgiUHJvZHVjdCBOYW1lOiAlc1xuIiwKLQkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOwotCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX05BTUUsIDUpOwotCQkJZG1pX3ByaW50aygoIlZlcnNpb246ICVzXG4iLAotCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7Ci0JCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfVkVSU0lPTiwgNik7Ci0JCQlkbWlfcHJpbnRrKCgiU2VyaWFsIE51bWJlcjogJXNcbiIsCi0JCQkJZG1pX3N0cmluZyhkbSwgZGF0YVs3XSkpKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlkbWlfcHJpbnRrKCgiQm9hcmQgVmVuZG9yOiAlc1xuIiwKLQkJCQlkbWlfc3RyaW5nKGRtLCBkYXRhWzRdKSkpOwotCQkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRU5ET1IsIDQpOwotCQkJZG1pX3ByaW50aygoIkJvYXJkIE5hbWU6ICVzXG4iLAotCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNV0pKSk7Ci0JCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX05BTUUsIDUpOwotCQkJZG1pX3ByaW50aygoIkJvYXJkIFZlcnNpb246ICVzXG4iLAotCQkJCWRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7Ci0JCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JPQVJEX1ZFUlNJT04sIDYpOwotCQkJYnJlYWs7CisJc3dpdGNoKGRtLT50eXBlKSB7CisJY2FzZSAgMDoKKwkJZG1pX3ByaW50aygoIkJJT1MgVmVuZG9yOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CSU9TX1ZFTkRPUiwgNCk7CisJCWRtaV9wcmludGsoKCJCSU9TIFZlcnNpb246ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzVdKSkpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfVkVSU0lPTiwgNSk7CisJCWRtaV9wcmludGsoKCJCSU9TIFJlbGVhc2U6ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzhdKSkpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX0JJT1NfREFURSwgOCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJZG1pX3ByaW50aygoIlN5c3RlbSBWZW5kb3I6ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzRdKSkpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1NZU19WRU5ET1IsIDQpOworCQlkbWlfcHJpbnRrKCgiUHJvZHVjdCBOYW1lOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs1XSkpKTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9QUk9EVUNUX05BTUUsIDUpOworCQlkbWlfcHJpbnRrKCgiVmVyc2lvbjogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNl0pKSk7CisJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfUFJPRFVDVF9WRVJTSU9OLCA2KTsKKwkJZG1pX3ByaW50aygoIlNlcmlhbCBOdW1iZXI6ICVzXG4iLCBkbWlfc3RyaW5nKGRtLCBkYXRhWzddKSkpOworCQlkbWlfc2F2ZV9pZGVudChkbSwgRE1JX1BST0RVQ1RfU0VSSUFMLCA3KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkbWlfcHJpbnRrKCgiQm9hcmQgVmVuZG9yOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs0XSkpKTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRU5ET1IsIDQpOworCQlkbWlfcHJpbnRrKCgiQm9hcmQgTmFtZTogJXNcbiIsIGRtaV9zdHJpbmcoZG0sIGRhdGFbNV0pKSk7CisJCWRtaV9zYXZlX2lkZW50KGRtLCBETUlfQk9BUkRfTkFNRSwgNSk7CisJCWRtaV9wcmludGsoKCJCb2FyZCBWZXJzaW9uOiAlc1xuIiwgZG1pX3N0cmluZyhkbSwgZGF0YVs2XSkpKTsKKwkJZG1pX3NhdmVfaWRlbnQoZG0sIERNSV9CT0FSRF9WRVJTSU9OLCA2KTsKKwkJYnJlYWs7CiAJfQogfQogCiB2b2lkIF9faW5pdCBkbWlfc2Nhbl9tYWNoaW5lKHZvaWQpCiB7Ci0JaW50IGVyciA9IGRtaV9pdGVyYXRlKGRtaV9kZWNvZGUpOwotCWlmKGVyciA9PSAwKQotIAkJZG1pX2NoZWNrX3N5c3RlbShkbWlfYmxhY2tsaXN0KTsKLQllbHNlCisJaWYgKGRtaV9pdGVyYXRlKGRtaV9kZWNvZGUpKQogCQlwcmludGsoS0VSTl9JTkZPICJETUkgbm90IHByZXNlbnQuXG4iKTsKIH0KIApAQCAtNDcwLDcgKzIyNiw2IEBACiAKIAlyZXR1cm4gY291bnQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZG1pX2NoZWNrX3N5c3RlbSk7CiAKIC8qKgpAQCAtNDgwLDggKzIzNSw4IEBACiAgKglSZXR1cm5zIG9uZSBETUkgZGF0YSB2YWx1ZSwgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybQogICoJY29tcGxleCBETUkgZGF0YSBjaGVja3MuCiAgKi8KLWNoYXIgKiBkbWlfZ2V0X3N5c3RlbV9pbmZvKGludCBmaWVsZCkKK2NoYXIgKmRtaV9nZXRfc3lzdGVtX2luZm8oaW50IGZpZWxkKQogewogCXJldHVybiBkbWlfaWRlbnRbZmllbGRdOwogfQotCitFWFBPUlRfU1lNQk9MKGRtaV9nZXRfc3lzdGVtX2luZm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvZWZpLmMKaW5kZXggZjczMmY0Mi4uMzg1ODgzZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2kzODYva2VybmVsL2VmaS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNTk4LDYgKzU5OSw5IEBACiAJCWlmIChtZC0+dHlwZSA9PSBFRklfQ09OVkVOVElPTkFMX01FTU9SWSkgewogCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGNvZGVfcmVzb3VyY2UpOwogCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsIGRhdGFfcmVzb3VyY2UpOworI2lmZGVmIENPTkZJR19LRVhFQworCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsICZjcmFzaGtfcmVzKTsKKyNlbmRpZgogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwppbmRleCBlOTY2ZmM4Li40NDc3YmIxIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2kzODYva2VybmVsL2hlYWQuUwpAQCAtMjk5LDcgKzI5OSw2IEBACiAJbW92bCAlZWF4LCVjcjAKIAogCWNhbGwgY2hlY2tfeDg3Ci0JaW5jYiByZWFkeQogCWxnZHQgY3B1X2dkdF9kZXNjcgogCWxpZHQgaWR0X2Rlc2NyCiAJbGptcCAkKF9fS0VSTkVMX0NTKSwkMWYKQEAgLTMxNiw4ICszMTUsOSBAQAogCWxsZHQgJWF4CiAJY2xkCQkJIyBnY2MyIHdhbnRzIHRoZSBkaXJlY3Rpb24gZmxhZyBjbGVhcmVkIGF0IGFsbCB0aW1lcwogI2lmZGVmIENPTkZJR19TTVAKLQltb3ZiIHJlYWR5LCAlY2wJCi0JY21wYiAkMSwlY2wKKwltb3ZiIHJlYWR5LCAlY2wKKwltb3ZiICQxLCByZWFkeQorCWNtcGIgJDAsJWNsCiAJamUgMWYJCQkjIHRoZSBmaXJzdCBDUFUgY2FsbHMgc3RhcnRfa2VybmVsCiAJCQkJIyBhbGwgb3RoZXIgQ1BVcyBjYWxsIGluaXRpYWxpemVfc2Vjb25kYXJ5CiAJY2FsbCBpbml0aWFsaXplX3NlY29uZGFyeQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCmluZGV4IDJjNDgxM2IuLjE3OGY0ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKQEAgLTI2OCwxMCArMjY4LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaTgyNTlBX3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJLyogUHV0IHRoZSBpODI1OUEgaW50byBhIHF1aWVzY2VudCBzdGF0ZSB0aGF0CisJICogdGhlIGtlcm5lbCBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBnZXQgaXQKKwkgKiBvdXQgb2YuCisJICovCisJb3V0YigweGZmLCAweDIxKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMSAqLworCW91dGIoMHhmZiwgMHhBMSk7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgaTgyNTlfc3lzZGV2X2NsYXNzID0gewogCXNldF9rc2V0X25hbWUoImk4MjU5IiksCiAJLnN1c3BlbmQgPSBpODI1OUFfc3VzcGVuZCwKIAkucmVzdW1lID0gaTgyNTlBX3Jlc3VtZSwKKwkuc2h1dGRvd24gPSBpODI1OUFfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2k4MjU5QSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggMDg1NDBiYy4uNjU3OGY0MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KIAogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgogCkBAIC01NzMsMTIgKzU3NCwxNCBAQAogCWZvciAoIDsgOyApIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJdGltZV9yZW1haW5pbmcgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVfcmVtYWluaW5nKTsKLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCiAJCQkJcHJldl9iYWxhbmNlX3RpbWUrYmFsYW5jZWRfaXJxX2ludGVydmFsKSkgeworCQkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCQlkb19pcnFfYmFsYW5jZSgpOwogCQkJcHJldl9iYWxhbmNlX3RpbWUgPSBqaWZmaWVzOwogCQkJdGltZV9yZW1haW5pbmcgPSBiYWxhbmNlZF9pcnFfaW50ZXJ2YWw7CisJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNjMwLDEwICs2MzMsOCBAQAogCQlwcmludGsoS0VSTl9FUlIgImJhbGFuY2VkX2lycV9pbml0OiBmYWlsZWQgdG8gc3Bhd24gYmFsYW5jZWRfaXJxIik7CiBmYWlsZWQ6CiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZihpcnFfY3B1X2RhdGFbaV0uaXJxX2RlbHRhKQotCQkJa2ZyZWUoaXJxX2NwdV9kYXRhW2ldLmlycV9kZWx0YSk7Ci0JCWlmKGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSkKLQkJCWtmcmVlKGlycV9jcHVfZGF0YVtpXS5sYXN0X2lycSk7CisJCWtmcmVlKGlycV9jcHVfZGF0YVtpXS5pcnFfZGVsdGEpOworCQlrZnJlZShpcnFfY3B1X2RhdGFbaV0ubGFzdF9pcnEpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE1NjYsNyArMTU2Nyw2IEBACiAKIHZvaWQgLypfX2luaXQqLyBwcmludF9QSUModm9pZCkKIHsKLQlleHRlcm4gc3BpbmxvY2tfdCBpODI1OUFfbG9jazsKIAl1bnNpZ25lZCBpbnQgdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xNjM0LDEyICsxNjM0LDQzIEBACiAgKi8KIHZvaWQgZGlzYWJsZV9JT19BUElDKHZvaWQpCiB7CisJaW50IHBpbjsKIAkvKgogCSAqIENsZWFyIHRoZSBJTy1BUElDIGJlZm9yZSByZWJvb3Rpbmc6CiAJICovCiAJY2xlYXJfSU9fQVBJQygpOwogCi0JZGlzY29ubmVjdF9ic3BfQVBJQygpOworCS8qCisJICogSWYgdGhlIGk4MjU1OSBpcyByb3V0ZWQgdGhyb3VnaCBhbiBJT0FQSUMKKwkgKiBQdXQgdGhhdCBJT0FQSUMgaW4gdmlydHVhbCB3aXJlIG1vZGUKKwkgKiBzbyBsZWdhY3kgaW50ZXJydXBzIGNhbiBiZSBkZWxpdmVyZWQuCisJICovCisJcGluID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOworCWlmIChwaW4gIT0gLTEpIHsKKwkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CisJCWVudHJ5Lm1hc2sgICAgICAgICAgICA9IDA7IC8qIEVuYWJsZWQgKi8KKwkJZW50cnkudHJpZ2dlciAgICAgICAgID0gMDsgLyogRWRnZSAqLworCQllbnRyeS5pcnIgICAgICAgICAgICAgPSAwOworCQllbnRyeS5wb2xhcml0eSAgICAgICAgPSAwOyAvKiBIaWdoICovCisJCWVudHJ5LmRlbGl2ZXJ5X3N0YXR1cyA9IDA7CisJCWVudHJ5LmRlc3RfbW9kZSAgICAgICA9IDA7IC8qIFBoeXNpY2FsICovCisJCWVudHJ5LmRlbGl2ZXJ5X21vZGUgICA9IDc7IC8qIEV4dEludCAqLworCQllbnRyeS52ZWN0b3IgICAgICAgICAgPSAwOworCQllbnRyeS5kZXN0LnBoeXNpY2FsLnBoeXNpY2FsX2Rlc3QgPSAwOworCisKKwkJLyoKKwkJICogQWRkIGl0IHRvIHRoZSBJTy1BUElDIGlycS1yb3V0aW5nIHRhYmxlOgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvX2FwaWNfd3JpdGUoMCwgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOworCQlpb19hcGljX3dyaXRlKDAsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwl9CisJZGlzY29ubmVjdF9ic3BfQVBJQyhwaW4gIT0gLTEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKaW5kZXggNzM5NDVhMy4uY2U2NmRjYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0xNSw2ICsxNSw5IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogREVGSU5FX1BFUl9DUFUoaXJxX2NwdXN0YXRfdCwgaXJxX3N0YXQpIF9fX19jYWNoZWxpbmVfbWF4YWxpZ25lZF9pbl9zbXA7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woaXJxX3N0YXQpOwpAQCAtMTUzLDYgKzE1NiwxMSBAQAogCQljcHUsaGFyZGlycV9jdHhbY3B1XSxzb2Z0aXJxX2N0eFtjcHVdKTsKIH0KIAordm9pZCBpcnFfY3R4X2V4aXQoaW50IGNwdSkKK3sKKwloYXJkaXJxX2N0eFtjcHVdID0gTlVMTDsKK30KKwogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBfX2RvX3NvZnRpcnEodm9pZCk7CiAKIGFzbWxpbmthZ2Ugdm9pZCBkb19zb2Z0aXJxKHZvaWQpCkBAIC0yMTAsOSArMjE4LDggQEAKIAogCWlmIChpID09IDApIHsKIAkJc2VxX3ByaW50ZihwLCAiICAgICAgICAgICAiKTsKLQkJZm9yIChqPTA7IGo8TlJfQ1BVUzsgaisrKQotCQkJaWYgKGNwdV9vbmxpbmUoaikpCi0JCQkJc2VxX3ByaW50ZihwLCAiQ1BVJWQgICAgICAgIixqKTsKKwkJZm9yX2VhY2hfY3B1KGopCisJCQlzZXFfcHJpbnRmKHAsICJDUFUlZCAgICAgICAiLGopOwogCQlzZXFfcHV0YyhwLCAnXG4nKTsKIAl9CiAKQEAgLTIyNSw5ICsyMzIsOCBAQAogI2lmbmRlZiBDT05GSUdfU01QCiAJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxcyhpKSk7CiAjZWxzZQotCQlmb3IgKGogPSAwOyBqIDwgTlJfQ1BVUzsgaisrKQotCQkJaWYgKGNwdV9vbmxpbmUoaikpCi0JCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CisJCWZvcl9lYWNoX2NwdShqKQorCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9jcHUoaikuaXJxc1tpXSk7CiAjZW5kaWYKIAkJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBpcnFfZGVzY1tpXS5oYW5kbGVyLT50eXBlbmFtZSk7CiAJCXNlcV9wcmludGYocCwgIiAgJXMiLCBhY3Rpb24tPm5hbWUpOwpAQCAtMjQwLDE2ICsyNDYsMTQgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwogCX0gZWxzZSBpZiAoaSA9PSBOUl9JUlFTKSB7CiAJCXNlcV9wcmludGYocCwgIk5NSTogIik7Ci0JCWZvciAoaiA9IDA7IGogPCBOUl9DUFVTOyBqKyspCi0JCQlpZiAoY3B1X29ubGluZShqKSkKLQkJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIG5taV9jb3VudChqKSk7CisJCWZvcl9lYWNoX2NwdShqKQorCQkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBubWlfY291bnQoaikpOwogCQlzZXFfcHV0YyhwLCAnXG4nKTsKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkJc2VxX3ByaW50ZihwLCAiTE9DOiAiKTsKLQkJZm9yIChqID0gMDsgaiA8IE5SX0NQVVM7IGorKykKLQkJCWlmIChjcHVfb25saW5lKGopKQotCQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwKLQkJCQkJcGVyX2NwdShpcnFfc3RhdCxqKS5hcGljX3RpbWVyX2lycXMpOworCQlmb3JfZWFjaF9jcHUoaikKKwkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwKKwkJCQlwZXJfY3B1KGlycV9zdGF0LGopLmFwaWNfdGltZXJfaXJxcyk7CiAJCXNlcV9wdXRjKHAsICdcbicpOwogI2VuZGlmCiAJCXNlcV9wcmludGYocCwgIkVSUjogJTEwdVxuIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKQEAgLTI1OSwzICsyNjMsNDUgQEAKIAl9CiAJcmV0dXJuIDA7CiB9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKyNpbmNsdWRlIDxtYWNoX2FwaWMuaD4KKwordm9pZCBmaXh1cF9pcnFzKGNwdW1hc2tfdCBtYXApCit7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdGF0aWMgaW50IHdhcm5lZDsKKworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspIHsKKwkJY3B1bWFza190IG1hc2s7CisJCWlmIChpcnEgPT0gMikKKwkJCWNvbnRpbnVlOworCisJCWNwdXNfYW5kKG1hc2ssIGlycV9hZmZpbml0eVtpcnFdLCBtYXApOworCQlpZiAoYW55X29ubGluZV9jcHUobWFzaykgPT0gTlJfQ1BVUykgeworCQkJcHJpbnRrKCJCcmVha2luZyBhZmZpbml0eSBmb3IgaXJxICVpXG4iLCBpcnEpOworCQkJbWFzayA9IG1hcDsKKwkJfQorCQlpZiAoaXJxX2Rlc2NbaXJxXS5oYW5kbGVyLT5zZXRfYWZmaW5pdHkpCisJCQlpcnFfZGVzY1tpcnFdLmhhbmRsZXItPnNldF9hZmZpbml0eShpcnEsIG1hc2spOworCQllbHNlIGlmIChpcnFfZGVzY1tpcnFdLmFjdGlvbiAmJiAhKHdhcm5lZCsrKSkKKwkJCXByaW50aygiQ2Fubm90IHNldCBhZmZpbml0eSBmb3IgaXJxICVpXG4iLCBpcnEpOworCX0KKworI2lmIDAKKwliYXJyaWVyKCk7CisJLyogSW5nbyBNb2xuYXIgc2F5czogImFmdGVyIHRoZSBJTy1BUElDIG1hc2tzIGhhdmUgYmVlbiByZWRpcmVjdGVkCisJICAgW25vdGUgdGhlIG5vcCAtIHRoZSBpbnRlcnJ1cHQtZW5hYmxlIGJvdW5kYXJ5IG9uIHg4NiBpcyB0d28KKwkgICBpbnN0cnVjdGlvbnMgZnJvbSBzdGldIC0gdG8gZmx1c2ggb3V0IHBlbmRpbmcgaGFyZGlycXMgYW5kCisJICAgSVBJcy4gQWZ0ZXIgdGhpcyBwb2ludCBub3RoaW5nIGlzIHN1cHBvc2VkIHRvIHJlYWNoIHRoaXMgQ1BVLiIgKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3RpOyBub3A7IGNsaSIpOworCWJhcnJpZXIoKTsKKyNlbHNlCisJLyogVGhhdCBkb2Vzbid0IHNlZW0gc3VmZmljaWVudC4gIEdpdmUgaXQgMW1zLiAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKwltZGVsYXkoMSk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMzc2MmY2Yi4uYTZkOGM0NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTEyNyw0OCArMTI3LDIzIEBACiAJCXJlZ3MtPmVpcCA9ICh1bnNpZ25lZCBsb25nKSZwLT5haW5zbi5pbnNuOwogfQogCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgICphcmNoX2dldF9rcHJvYmVfdGFzayh2b2lkICpwdHIpCi17Ci0JcmV0dXJuICgoc3RydWN0IHRocmVhZF9pbmZvICopICgoKHVuc2lnbmVkIGxvbmcpIHB0cikgJgotCQkJCQkofihUSFJFQURfU0laRSAtMSkpKSktPnRhc2s7Ci19Ci0KIHZvaWQgYXJjaF9wcmVwYXJlX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyAqc2FyYSA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKLQlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKLQlzdGF0aWMgdm9pZCAqb3JpZ19yZXRfYWRkcjsKKyAgICAgICAgc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7CiAKLQkvKgotCSAqIFNhdmUgdGhlIHJldHVybiBhZGRyZXNzIHdoZW4gdGhlIHJldHVybiBwcm9iZSBoaXRzCi0JICogdGhlIGZpcnN0IHRpbWUsIGFuZCB1c2UgaXQgdG8gcG9wdWxhdGUgdGhlIChrcnByb2JlCi0JICogaW5zdGFuY2UpLT5yZXRfYWRkciBmb3Igc3Vic2VxdWVudCByZXR1cm4gcHJvYmVzIGF0Ci0JICogdGhlIHNhbWUgYWRkcnJlc3Mgc2luY2Ugc3RhY2sgYWRkcmVzcyB3b3VsZCBoYXZlCi0JICogdGhlIGtyZXRwcm9iZV90cmFtcG9saW5lIGJ5IHRoZW4uCi0JICovCi0JaWYgKCgodm9pZCopICpzYXJhKSAhPSBrcmV0cHJvYmVfdHJhbXBvbGluZSkKLQkJb3JpZ19yZXRfYWRkciA9ICh2b2lkKikgKnNhcmE7CisgICAgICAgIGlmICgocmkgPSBnZXRfZnJlZV9ycF9pbnN0KHJwKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJpLT5ycCA9IHJwOworICAgICAgICAgICAgICAgIHJpLT50YXNrID0gY3VycmVudDsKKwkJcmktPnJldF9hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKSAqc2FyYTsKIAotCWlmICgocmkgPSBnZXRfZnJlZV9ycF9pbnN0KHJwKSkgIT0gTlVMTCkgewotCQlyaS0+cnAgPSBycDsKLQkJcmktPnN0YWNrX2FkZHIgPSBzYXJhOwotCQlyaS0+cmV0X2FkZHIgPSBvcmlnX3JldF9hZGRyOwotCQlhZGRfcnBfaW5zdChyaSk7CiAJCS8qIFJlcGxhY2UgdGhlIHJldHVybiBhZGRyIHdpdGggdHJhbXBvbGluZSBhZGRyICovCiAJCSpzYXJhID0gKHVuc2lnbmVkIGxvbmcpICZrcmV0cHJvYmVfdHJhbXBvbGluZTsKLQl9IGVsc2UgewotCQlycC0+bm1pc3NlZCsrOwotCX0KLX0KIAotdm9pZCBhcmNoX2twcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspCi17Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0Jd2hpbGUgKChyaSA9IGdldF9ycF9pbnN0X3Rzayh0aykpICE9IE5VTEwpIHsKLQkJKigodW5zaWduZWQgbG9uZyAqKShyaS0+c3RhY2tfYWRkcikpID0KLQkJCQkJKHVuc2lnbmVkIGxvbmcpIHJpLT5yZXRfYWRkcjsKLQkJcmVjeWNsZV9ycF9pbnN0KHJpKTsKLQl9CisgICAgICAgICAgICAgICAgYWRkX3JwX2luc3QocmkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJwLT5ubWlzc2VkKys7CisgICAgICAgIH0KIH0KIAogLyoKQEAgLTI4NiwzNiArMjYxLDU5IEBACiAgKi8KIGludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0JdW5zaWduZWQgbG9uZyAqc2FyYSA9ICgodW5zaWduZWQgbG9uZyAqKSAmcmVncy0+ZXNwKSAtIDE7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKyAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisgICAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPSh1bnNpZ25lZCBsb25nKSZrcmV0cHJvYmVfdHJhbXBvbGluZTsKIAotCXRzayA9IGFyY2hfZ2V0X2twcm9iZV90YXNrKHNhcmEpOwotCWhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKHRzayk7CisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmksIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCWlmIChyaS0+c3RhY2tfYWRkciA9PSBzYXJhICYmIHJpLT5ycCkgewotCQkJaWYgKHJpLT5ycC0+aGFuZGxlcikKLQkJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQorCS8qCisJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKwkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KKwkgKgorCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgorCSAqICAgICAtIGluc3RhbmNlcyBhcmUgYWx3YXlzIGluc2VydGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CisJICogICAgIC0gd2hlbiBtdWx0aXBsZSByZXR1cm4gcHJvYmVzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZQorICAgICAgICAgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmktPnRhc2sgIT0gY3VycmVudCkKKwkJCS8qIGFub3RoZXIgdGFzayBpcyBzaGFyaW5nIG91ciBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLXZvaWQgdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCS8qIFJBIGFscmVhZHkgcG9wcGVkICovCi0JdW5zaWduZWQgbG9uZyAqc2FyYSA9ICgodW5zaWduZWQgbG9uZyAqKSZyZWdzLT5lc3ApIC0gMTsKKwkJaWYgKHJpLT5ycCAmJiByaS0+cnAtPmhhbmRsZXIpCisJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOwogCi0Jd2hpbGUgKChyaSA9IGdldF9ycF9pbnN0KHNhcmEpKSkgewotCQlyZWdzLT5laXAgPSAodW5zaWduZWQgbG9uZylyaS0+cmV0X2FkZHI7CisJCW9yaWdfcmV0X2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylyaS0+cmV0X2FkZHI7CiAJCXJlY3ljbGVfcnBfaW5zdChyaSk7CisKKwkJaWYgKG9yaWdfcmV0X2FkZHJlc3MgIT0gdHJhbXBvbGluZV9hZGRyZXNzKQorCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgcmV0dXJuIGFkZHJlc3MuIEFueSBvdGhlcgorCQkJICogaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sgYXJlIGZvcgorCQkJICogb3RoZXIgY2FsbHMgZGVlcGVyIG9uIHRoZSBjYWxsIHN0YWNrCisJCQkgKi8KKwkJCWJyZWFrOwogCX0KLQlyZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7CisKKwlCVUdfT04oIW9yaWdfcmV0X2FkZHJlc3MgfHwgKG9yaWdfcmV0X2FkZHJlc3MgPT0gdHJhbXBvbGluZV9hZGRyZXNzKSk7CisJcmVncy0+ZWlwID0gb3JpZ19yZXRfYWRkcmVzczsKKworCXVubG9ja19rcHJvYmVzKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJ5IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlLCB3ZSBhcmUgdGVsbGluZworICAgICAgICAgKiBrcHJvYmVfaGFuZGxlcigpIHRoYXQgd2UgaGF2ZSBoYW5kbGVkIHVubG9ja2luZworICAgICAgICAgKiBhbmQgcmUtZW5hYmxpbmcgcHJlZW1wdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOwogfQogCiAvKgpAQCAtNDAzLDggKzQwMSw3IEBACiAJCWN1cnJlbnRfa3Byb2JlLT5wb3N0X2hhbmRsZXIoY3VycmVudF9rcHJvYmUsIHJlZ3MsIDApOwogCX0KIAotCWlmIChjdXJyZW50X2twcm9iZS0+cG9zdF9oYW5kbGVyICE9IHRyYW1wb2xpbmVfcG9zdF9oYW5kbGVyKQotCQlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKKwlyZXN1bWVfZXhlY3V0aW9uKGN1cnJlbnRfa3Byb2JlLCByZWdzKTsKIAlyZWdzLT5lZmxhZ3MgfD0ga3Byb2JlX3NhdmVkX2VmbGFnczsKIAogCS8qUmVzdG9yZSBiYWNrIHRoZSBvcmlnaW5hbCBzYXZlZCBrcHJvYmVzIHZhcmlhYmxlcyBhbmQgY29udGludWUuICovCkBAIC01MzQsMyArNTMxLDEzIEBACiAJfQogCXJldHVybiAwOwogfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZSB0cmFtcG9saW5lX3AgPSB7CisJLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopICZrcmV0cHJvYmVfdHJhbXBvbGluZSwKKwkucHJlX2hhbmRsZXIgPSB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIKK307CisKK2ludCBfX2luaXQgYXJjaF9pbml0X2twcm9iZXModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZ0cmFtcG9saW5lX3ApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL2kzODYva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmVkMThkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBtYWNoaW5lX2tleGVjLmMgLSBoYW5kbGUgdHJhbnNpdGlvbiBvZiBMaW51eCBib290aW5nIGFub3RoZXIga2VybmVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBFcmljIEJpZWRlcm1hbiAgPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2NyMyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3IzOworCWFzbSB2b2xhdGlsZSgibW92bCAlJWNyMywlMCI6ICI9ciIoY3IzKSk7CisJcmV0dXJuIGNyMzsKK30KKworI2RlZmluZSBQQUdFX0FMSUdORUQgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKFBBR0VfU0laRSkpKQorCisjZGVmaW5lIEwwX0FUVFIgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkpCisjZGVmaW5lIEwxX0FUVFIgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkpCisjZGVmaW5lIEwyX0FUVFIgKF9QQUdFX1BSRVNFTlQpCisKKyNkZWZpbmUgTEVWRUwwX1NJWkUgKDFVTCA8PCAxMlVMKQorCisjaWZuZGVmIENPTkZJR19YODZfUEFFCisjZGVmaW5lIExFVkVMMV9TSVpFICgxVUwgPDwgMjJVTCkKK3N0YXRpYyB1MzIgcGd0YWJsZV9sZXZlbDFbMTAyNF0gUEFHRV9BTElHTkVEOworCitzdGF0aWMgdm9pZCBpZGVudGl0eV9tYXBfcGFnZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJdW5zaWduZWQgbG9uZyBsZXZlbDFfaW5kZXgsIGxldmVsMl9pbmRleDsKKwl1MzIgKnBndGFibGVfbGV2ZWwyOworCisJLyogRmluZCB0aGUgY3VycmVudCBwYWdlIHRhYmxlICovCisJcGd0YWJsZV9sZXZlbDIgPSBfX3ZhKHJlYWRfY3IzKCkpOworCisJLyogRmluZCB0aGUgaW5kZXhlcyBvZiB0aGUgcGh5c2ljYWwgYWRkcmVzcyB0byBpZGVudGl0eSBtYXAgKi8KKwlsZXZlbDFfaW5kZXggPSAoYWRkcmVzcyAlIExFVkVMMV9TSVpFKS9MRVZFTDBfU0laRTsKKwlsZXZlbDJfaW5kZXggPSBhZGRyZXNzIC8gTEVWRUwxX1NJWkU7CisKKwkvKiBJZGVudGl0eSBtYXAgdGhlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwlwZ3RhYmxlX2xldmVsMVtsZXZlbDFfaW5kZXhdID0gYWRkcmVzcyB8IEwwX0FUVFI7CisJcGd0YWJsZV9sZXZlbDJbbGV2ZWwyX2luZGV4XSA9IF9fcGEocGd0YWJsZV9sZXZlbDEpIHwgTDFfQVRUUjsKKworCS8qIEZsdXNoIHRoZSB0bGIgc28gdGhlIG5ldyBtYXBwaW5nIHRha2VzIGVmZmVjdC4KKwkgKiBHbG9iYWwgdGxiIGVudHJpZXMgYXJlIG5vdCBmbHVzaGVkIGJ1dCB0aGF0IGlzIG5vdCBhbiBpc3N1ZS4KKwkgKi8KKwlsb2FkX2NyMyhwZ3RhYmxlX2xldmVsMik7Cit9CisKKyNlbHNlCisjZGVmaW5lIExFVkVMMV9TSVpFICgxVUwgPDwgMjFVTCkKKyNkZWZpbmUgTEVWRUwyX1NJWkUgKDFVTCA8PCAzMFVMKQorc3RhdGljIHU2NCBwZ3RhYmxlX2xldmVsMVs1MTJdIFBBR0VfQUxJR05FRDsKK3N0YXRpYyB1NjQgcGd0YWJsZV9sZXZlbDJbNTEyXSBQQUdFX0FMSUdORUQ7CisKK3N0YXRpYyB2b2lkIGlkZW50aXR5X21hcF9wYWdlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBsb25nIGxldmVsMV9pbmRleCwgbGV2ZWwyX2luZGV4LCBsZXZlbDNfaW5kZXg7CisJdTY0ICpwZ3RhYmxlX2xldmVsMzsKKworCS8qIEZpbmQgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSAqLworCXBndGFibGVfbGV2ZWwzID0gX192YShyZWFkX2NyMygpKTsKKworCS8qIEZpbmQgdGhlIGluZGV4ZXMgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gaWRlbnRpdHkgbWFwICovCisJbGV2ZWwxX2luZGV4ID0gKGFkZHJlc3MgJSBMRVZFTDFfU0laRSkvTEVWRUwwX1NJWkU7CisJbGV2ZWwyX2luZGV4ID0gKGFkZHJlc3MgJSBMRVZFTDJfU0laRSkvTEVWRUwxX1NJWkU7CisJbGV2ZWwzX2luZGV4ID0gYWRkcmVzcyAvIExFVkVMMl9TSVpFOworCisJLyogSWRlbnRpdHkgbWFwIHRoZSBwYWdlIHRhYmxlIGVudHJ5ICovCisJcGd0YWJsZV9sZXZlbDFbbGV2ZWwxX2luZGV4XSA9IGFkZHJlc3MgfCBMMF9BVFRSOworCXBndGFibGVfbGV2ZWwyW2xldmVsMl9pbmRleF0gPSBfX3BhKHBndGFibGVfbGV2ZWwxKSB8IEwxX0FUVFI7CisJc2V0XzY0Yml0KCZwZ3RhYmxlX2xldmVsM1tsZXZlbDNfaW5kZXhdLAorCQkJCQkgICAgICAgX19wYShwZ3RhYmxlX2xldmVsMikgfCBMMl9BVFRSKTsKKworCS8qIEZsdXNoIHRoZSB0bGIgc28gdGhlIG5ldyBtYXBwaW5nIHRha2VzIGVmZmVjdC4KKwkgKiBHbG9iYWwgdGxiIGVudHJpZXMgYXJlIG5vdCBmbHVzaGVkIGJ1dCB0aGF0IGlzIG5vdCBhbiBpc3N1ZS4KKwkgKi8KKwlsb2FkX2NyMyhwZ3RhYmxlX2xldmVsMyk7Cit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZCBzZXRfaWR0KHZvaWQgKm5ld2lkdCwgX191MTYgbGltaXQpCit7CisJdW5zaWduZWQgY2hhciBjdXJpZHRbNl07CisKKwkvKiBpYTMyIHN1cHBvcnRzIHVuYWxpZ2VkIGxvYWRzICYgc3RvcmVzICovCisJKCooX191MTYgKikoY3VyaWR0KSkgPSBsaW1pdDsKKwkoKihfX3UzMiAqKShjdXJpZHQgKzIpKSA9ICh1bnNpZ25lZCBsb25nKShuZXdpZHQpOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkibGlkdCAlMFxuIgorCQk6ICI9bSIgKGN1cmlkdCkKKwkJKTsKK307CisKKworc3RhdGljIHZvaWQgc2V0X2dkdCh2b2lkICpuZXdnZHQsIF9fdTE2IGxpbWl0KQoreworCXVuc2lnbmVkIGNoYXIgY3VyZ2R0WzZdOworCisJLyogaWEzMiBzdXBwb3J0cyB1bmFsaWduZWQgbG9hZHMgJiBzdG9yZXMgKi8KKwkoKihfX3UxNiAqKShjdXJnZHQpKSA9IGxpbWl0OworCSgqKF9fdTMyICopKGN1cmdkdCArMikpID0gKHVuc2lnbmVkIGxvbmcpKG5ld2dkdCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJsZ2R0ICUwXG4iCisJCTogIj1tIiAoY3VyZ2R0KQorCQkpOworfTsKKworc3RhdGljIHZvaWQgbG9hZF9zZWdtZW50cyh2b2lkKQoreworI2RlZmluZSBfX1NUUihYKSAjWAorI2RlZmluZSBTVFIoWCkgX19TVFIoWCkKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIlx0bGptcCAkIlNUUihfX0tFUk5FTF9DUykiLCQxZlxuIgorCQkiXHQxOlxuIgorCQkiXHRtb3ZsICQiU1RSKF9fS0VSTkVMX0RTKSIsJWVheFxuIgorCQkiXHRtb3ZsICVlYXgsJWRzXG4iCisJCSJcdG1vdmwgJWVheCwlZXNcbiIKKwkJIlx0bW92bCAlZWF4LCVmc1xuIgorCQkiXHRtb3ZsICVlYXgsJWdzXG4iCisJCSJcdG1vdmwgJWVheCwlc3NcbiIKKwkJKTsKKyN1bmRlZiBTVFIKKyN1bmRlZiBfX1NUUgorfQorCit0eXBlZGVmIGFzbWxpbmthZ2UgTk9SRVRfVFlQRSB2b2lkICgqcmVsb2NhdGVfbmV3X2tlcm5lbF90KSgKKwkJCQkJdW5zaWduZWQgbG9uZyBpbmRpcmVjdGlvbl9wYWdlLAorCQkJCQl1bnNpZ25lZCBsb25nIHJlYm9vdF9jb2RlX2J1ZmZlciwKKwkJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLAorCQkJCQl1bnNpZ25lZCBpbnQgaGFzX3BhZSkgQVRUUklCX05PUkVUOworCitjb25zdCBleHRlcm4gdW5zaWduZWQgY2hhciByZWxvY2F0ZV9uZXdfa2VybmVsW107CitleHRlcm4gdm9pZCByZWxvY2F0ZV9uZXdfa2VybmVsX2VuZCh2b2lkKTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworCisvKgorICogQSBhcmNoaXRlY3R1cmUgaG9vayBjYWxsZWQgdG8gdmFsaWRhdGUgdGhlCisgKiBwcm9wb3NlZCBpbWFnZSBhbmQgcHJlcGFyZSB0aGUgY29udHJvbCBwYWdlcworICogYXMgbmVlZGVkLiAgVGhlIHBhZ2VzIGZvciBLRVhFQ19DT05UUk9MX0NPREVfU0laRQorICogaGF2ZSBiZWVuIGFsbG9jYXRlZCwgYnV0IHRoZSBzZWdtZW50cyBoYXZlIHlldAorICogYmVlbiBjb3BpZWQgaW50byB0aGUga2VybmVsLgorICoKKyAqIERvIHdoYXQgZXZlcnkgc2V0dXAgaXMgbmVlZGVkIG9uIGltYWdlIGFuZCB0aGUKKyAqIHJlYm9vdCBjb2RlIGJ1ZmZlciB0byBhbGxvdyB1cyB0byBhdm9pZCBhbGxvY2F0aW9ucworICogbGF0ZXIuCisgKgorICogQ3VycmVudGx5IG5vdGhpbmcuCisgKi8KK2ludCBtYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVbmRvIGFueXRoaW5nIGxlZnRvdmVyIGJ5IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZQorICogd2hlbiBhbiBpbWFnZSBpcyBmcmVlZC4KKyAqLwordm9pZCBtYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7Cit9CisKKy8qCisgKiBEbyBub3QgYWxsb2NhdGUgbWVtb3J5IChvciBmYWlsIGluIGFueSB3YXkpIGluIG1hY2hpbmVfa2V4ZWMoKS4KKyAqIFdlIGFyZSBwYXN0IHRoZSBwb2ludCBvZiBubyByZXR1cm4sIGNvbW1pdHRlZCB0byByZWJvb3Rpbmcgbm93LgorICovCitOT1JFVF9UWVBFIHZvaWQgbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhZ2VfbGlzdDsKKwl1bnNpZ25lZCBsb25nIHJlYm9vdF9jb2RlX2J1ZmZlcjsKKworCXJlbG9jYXRlX25ld19rZXJuZWxfdCBybms7CisKKwkvKiBJbnRlcnJ1cHRzIGFyZW4ndCBhY2NlcHRhYmxlIHdoaWxlIHdlIHJlYm9vdCAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBDb21wdXRlIHNvbWUgb2Zmc2V0cyAqLworCXJlYm9vdF9jb2RlX2J1ZmZlciA9IHBhZ2VfdG9fcGZuKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSkKKwkJCQkJCQkJPDwgUEFHRV9TSElGVDsKKwlwYWdlX2xpc3QgPSBpbWFnZS0+aGVhZDsKKworCS8qIFNldCB1cCBhbiBpZGVudGl0eSBtYXBwaW5nIGZvciB0aGUgcmVib290X2NvZGVfYnVmZmVyICovCisJaWRlbnRpdHlfbWFwX3BhZ2UocmVib290X2NvZGVfYnVmZmVyKTsKKworCS8qIGNvcHkgaXQgb3V0ICovCisJbWVtY3B5KCh2b2lkICopcmVib290X2NvZGVfYnVmZmVyLCByZWxvY2F0ZV9uZXdfa2VybmVsLAorCQkJCQkJcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplKTsKKworCS8qIFRoZSBzZWdtZW50IHJlZ2lzdGVycyBhcmUgZnVubnkgdGhpbmdzLCB0aGV5IGFyZQorCSAqIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGZyb20gYSB0YWJsZSwgaW4gbWVtb3J5IHdoZXJldmVyIHlvdQorCSAqIHNldCB0aGVtIHRvIGEgc3BlY2lmaWMgc2VsZWN0b3IsIGJ1dCB0aGlzIHRhYmxlIGlzIG5ldmVyCisJICogYWNjZXNzZWQgYWdhaW4geW91IHNldCB0aGUgc2VnbWVudCB0byBhIGRpZmZlcmVudCBzZWxlY3Rvci4KKwkgKgorCSAqIFRoZSBtb3JlIGNvbW1vbiBtb2RlbCBpcyBhcmUgY2FjaGVzIHdoZXJlIHRoZSBiZWhpZGUKKwkgKiB0aGUgc2NlbmVzIHdvcmsgaXMgZG9uZSwgYnV0IGlzIGFsc28gZHJvcHBlZCBhdCBhcmJpdHJhcnkKKwkgKiB0aW1lcy4KKwkgKgorCSAqIEkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBoZXJlIGJ5IGZvcmNlIGxvYWRpbmcgdGhlCisJICogc2VnbWVudHMsIGJlZm9yZSBJIHphcCB0aGUgZ2R0IHdpdGggYW4gaW52YWxpZCB2YWx1ZS4KKwkgKi8KKwlsb2FkX3NlZ21lbnRzKCk7CisJLyogVGhlIGdkdCAmIGlkdCBhcmUgbm93IGludmFsaWQuCisJICogSWYgeW91IHdhbnQgdG8gbG9hZCB0aGVtIHlvdSBtdXN0IHNldCB1cCB5b3VyIG93biBpZHQgJiBnZHQuCisJICovCisJc2V0X2dkdChwaHlzX3RvX3ZpcnQoMCksMCk7CisJc2V0X2lkdChwaHlzX3RvX3ZpcnQoMCksMCk7CisKKwkvKiBub3cgY2FsbCBpdCAqLworCXJuayA9IChyZWxvY2F0ZV9uZXdfa2VybmVsX3QpIHJlYm9vdF9jb2RlX2J1ZmZlcjsKKwkoKnJuaykocGFnZV9saXN0LCByZWJvb3RfY29kZV9idWZmZXIsIGltYWdlLT5zdGFydCwgY3B1X2hhc19wYWUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwppbmRleCAzODNhMTE2Li5hZjkxN2Y2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYworKysgYi9hcmNoL2kzODYva2VybmVsL21wcGFyc2UuYwpAQCAtNjcsNyArNjcsNiBAQAogCiAvKiBQcm9jZXNzb3IgdGhhdCBpcyBkb2luZyB0aGUgYm9vdCB1cCAqLwogdW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IC0xVTsKLXVuc2lnbmVkIGludCBib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IC0xVTsKIC8qIEludGVybmFsIHByb2Nlc3NvciBjb3VudCAqLwogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIG51bV9wcm9jZXNzb3JzOwogCkBAIC0xODAsNyArMTc5LDYgQEAKIAlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgewogCQlEcHJpbnRrKCIgICAgQm9vdHVwIENQVVxuIik7CiAJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG0tPm1wY19hcGljaWQ7Ci0JCWJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkID0gYXBpY2lkOwogCX0KIAogCWlmIChudW1fcHJvY2Vzc29ycyA+PSBOUl9DUFVTKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGFlYTJjZTEuLmJhMjQzYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KIAorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNTUsNiArNTYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgorCiBhc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKSBfX2FzbV9fKCJyZXRfZnJvbV9mb3JrIik7CiAKIHN0YXRpYyBpbnQgaGx0X2NvdW50ZXI7CkBAIC0xNDMsMTQgKzE0Nyw0MiBAQAogCX0KIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKy8qIFdlIGRvbid0IGFjdHVhbGx5IHRha2UgQ1BVIGRvd24sIGp1c3Qgc3BpbiB3aXRob3V0IGludGVycnVwdHMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGxheV9kZWFkKHZvaWQpCit7CisJLyogVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGRlYWQgQ1BVIGFjayAqLworCWNwdV9leGl0X2NsZWFyKCk7CisJd2JpbnZkKCk7CisJbWIoKTsKKwkvKiBBY2sgaXQgKi8KKwlfX2dldF9jcHVfdmFyKGNwdV9zdGF0ZSkgPSBDUFVfREVBRDsKKworCS8qCisJICogV2l0aCBwaHlzaWNhbCBDUFUgaG90cGx1Zywgd2Ugc2hvdWxkIGhhbHQgdGhlIGNwdQorCSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd2hpbGUgKDEpCisJCV9fYXNtX18gX192b2xhdGlsZV9fKCJobHQiOjo6Im1lbW9yeSIpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF5X2RlYWQodm9pZCkKK3sKKwlCVUcoKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwogLyoKICAqIFRoZSBpZGxlIHRocmVhZC4gVGhlcmUncyBubyB1c2VmdWwgd29yayB0byBiZQogICogZG9uZSwgc28ganVzdCB0cnkgdG8gY29uc2VydmUgcG93ZXIgYW5kIGhhdmUgYQogICogbG93IGV4aXQgbGF0ZW5jeSAoaWUgc2l0IGluIGEgbG9vcCB3YWl0aW5nIGZvcgogICogc29tZWJvZHkgdG8gc2F5IHRoYXQgdGhleSdkIGxpa2UgdG8gcmVzY2hlZHVsZSkKICAqLwotdm9pZCBjcHVfaWRsZSAodm9pZCkKK3ZvaWQgY3B1X2lkbGUodm9pZCkKIHsKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewpAQCAtMTY1LDYgKzE5Nyw5IEBACiAJCQlpZiAoIWlkbGUpCiAJCQkJaWRsZSA9IGRlZmF1bHRfaWRsZTsKIAorCQkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCisJCQkJcGxheV9kZWFkKCk7CisKIAkJCV9fZ2V0X2NwdV92YXIoaXJxX3N0YXQpLmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKIAkJCWlkbGUoKTsKIAkJfQpAQCAtMjIzLDcgKzI1OCw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBzZWxlY3RfaWRsZV9yb3V0aW5lKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19kZXZpbml0IHNlbGVjdF9pZGxlX3JvdXRpbmUoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01XQUlUKSkgewogCQlwcmludGsoIm1vbml0b3IvbXdhaXQgZmVhdHVyZSBwcmVzZW50LlxuIik7CkBAIC01ODIsNiArNjE3LDMzIEBACiB9CiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgdGhlIGNvbnRleHQgc3dpdGNoIGZyb20gcHJldiB0byBuZXh0CisgKiBoYXMgdG8gdHdlYWsgdGhlIFRTQyBkaXNhYmxlIGJpdCBpbiB0aGUgY3I0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV90c2Moc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCisJCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3ApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICpwcmV2LCAqbmV4dDsKKworCS8qCisJICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKKwkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgorCSAqLworCXByZXYgPSBwcmV2X3AtPnRocmVhZF9pbmZvOworCW5leHQgPSBuZXh0X3AtPnRocmVhZF9pbmZvOworCisJaWYgKGhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpIHx8IGhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CisJCS8qIHNsb3cgcGF0aCBoZXJlICovCisJCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgorCQkgICAgIWhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CisJCQl3cml0ZV9jcjQocmVhZF9jcjQoKSAmIH5YODZfQ1I0X1RTRCk7CisJCX0gZWxzZSBpZiAoIWhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpICYmCisJCQkgICBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkKKwkJCXdyaXRlX2NyNChyZWFkX2NyNCgpIHwgWDg2X0NSNF9UU0QpOworCX0KK30KKworLyoKICAqCXN3aXRjaF90byh4LHluKSBzaG91bGQgc3dpdGNoIHRhc2tzIGZyb20geCB0byB5LgogICoKICAqIFdlIGZzYXZlL2Z3YWl0IHNvIHRoYXQgYW4gZXhjZXB0aW9uIGdvZXMgb2ZmIGF0IHRoZSByaWdodCB0aW1lCkBAIC02NjAsNiArNzIyLDggQEAKIAlpZiAodW5saWtlbHkocHJldi0+aW9fYml0bWFwX3B0ciB8fCBuZXh0LT5pb19iaXRtYXBfcHRyKSkKIAkJaGFuZGxlX2lvX2JpdG1hcChuZXh0LCB0c3MpOwogCisJZGlzYWJsZV90c2MocHJldl9wLCBuZXh0X3ApOworCiAJcmV0dXJuIHByZXZfcDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggZGI5MTIyMC4uYjNlNTg0OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3JlYm9vdC5jCkBAIC0yNiw3ICsyNiw2IEBACiBzdGF0aWMgaW50IHJlYm9vdF90aHJ1X2Jpb3M7CiAKICNpZmRlZiBDT05GSUdfU01QCi1pbnQgcmVib290X3NtcCA9IDA7CiBzdGF0aWMgaW50IHJlYm9vdF9jcHUgPSAtMTsKIC8qIHNoYW1lbGVzc2x5IGdyYWJiZWQgZnJvbSBsaWIvdnNwcmludGYuYyBmb3IgcmVhZGFiaWxpdHkgKi8KICNkZWZpbmUgaXNfZGlnaXQoYykJKChjKSA+PSAnMCcgJiYgKGMpIDw9ICc5JykKQEAgLTQ5LDcgKzQ4LDYgQEAKIAkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19TTVAKIAkJY2FzZSAncyc6IC8qICJzbXAiIHJlYm9vdCBieSBleGVjdXRpbmcgcmVzZXQgb24gQlNQIG9yIG90aGVyIENQVSovCi0JCQlyZWJvb3Rfc21wID0gMTsKIAkJCWlmIChpc19kaWdpdCgqKHN0cisxKSkpIHsKIAkJCQlyZWJvb3RfY3B1ID0gKGludCkgKCooc3RyKzEpIC0gJzAnKTsKIAkJCQlpZiAoaXNfZGlnaXQoKihzdHIrMikpKSAKQEAgLTg4LDMzICs4Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBTb21lIG1hY2hpbmVzIHJlcXVpcmUgdGhlICJyZWJvb3Q9cyIgIGNvbW1hbmRsaW5lIG9wdGlvbiwgdGhpcyBxdWlyayBtYWtlcyB0aGF0IGF1dG9tYXRpYy4KLSAqLwotc3RhdGljIGludCBfX2luaXQgc2V0X3NtcF9yZWJvb3Qoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCWlmICghcmVib290X3NtcCkgewotCQlyZWJvb3Rfc21wID0gMTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgc2VyaWVzIGJvYXJkIGRldGVjdGVkLiBTZWxlY3RpbmcgU01QLW1ldGhvZCBmb3IgcmVib290cy5cbiIsIGQtPmlkZW50KTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNvbWUgbWFjaGluZXMgcmVxdWlyZSB0aGUgInJlYm9vdD1iLHMiICBjb21tYW5kbGluZSBvcHRpb24sIHRoaXMgcXVpcmsgbWFrZXMgdGhhdCBhdXRvbWF0aWMuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHNldF9zbXBfYmlvc19yZWJvb3Qoc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCi17Ci0Jc2V0X3NtcF9yZWJvb3QoZCk7Ci0Jc2V0X2Jpb3NfcmVib290KGQpOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSByZWJvb3RfZG1pX3RhYmxlW10gPSB7CiAJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCAxMzAwJ3MgKi8KLQkJLmNhbGxiYWNrID0gc2V0X3NtcF9iaW9zX3JlYm9vdCwKKwkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAogCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMTMwMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciBDb3Jwb3JhdGlvbiIpLApAQCAtMzAxLDQxICsyNzUsMzIgQEAKIEVYUE9SVF9TWU1CT0wobWFjaGluZV9yZWFsX3Jlc3RhcnQpOwogI2VuZGlmCiAKLXZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKiBfX3VudXNlZCkKK3ZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogewogI2lmZGVmIENPTkZJR19TTVAKLQlpbnQgY3B1aWQ7Ci0JCi0JY3B1aWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOworCWludCByZWJvb3RfY3B1X2lkOwogCi0JaWYgKHJlYm9vdF9zbXApIHsKKwkvKiBUaGUgYm9vdCBjcHUgaXMgYWx3YXlzIGxvZ2ljYWwgY3B1IDAgKi8KKwlyZWJvb3RfY3B1X2lkID0gMDsKIAotCQkvKiBjaGVjayB0byBzZWUgaWYgcmVib290X2NwdSBpcyB2YWxpZCAKLQkJICAgaWYgaXRzIG5vdCwgZGVmYXVsdCB0byB0aGUgQlNQICovCi0JCWlmICgocmVib290X2NwdSA9PSAtMSkgfHwgIAotCQkgICAgICAocmVib290X2NwdSA+IChOUl9DUFVTIC0xKSkgIHx8IAotCQkgICAgICAhcGh5c2lkX2lzc2V0KGNwdWlkLCBwaHlzX2NwdV9wcmVzZW50X21hcCkpCi0JCQlyZWJvb3RfY3B1ID0gYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkOwotCi0JCXJlYm9vdF9zbXAgPSAwOyAgLyogdXNlIHRoaXMgYXMgYSBmbGFnIHRvIG9ubHkgZ28gdGhyb3VnaCB0aGlzIG9uY2UqLwotCQkvKiByZS1ydW4gdGhpcyBmdW5jdGlvbiBvbiB0aGUgb3RoZXIgQ1BVcwotCQkgICBpdCB3aWxsIGZhbGwgdGhvdWdoIHRoaXMgc2VjdGlvbiBzaW5jZSB3ZSBoYXZlIAotCQkgICBjbGVhcmVkIHJlYm9vdF9zbXAsIGFuZCBkbyB0aGUgcmVib290IGlmIGl0IGlzIHRoZQotCQkgICBjb3JyZWN0IENQVSwgb3RoZXJ3aXNlIGl0IGhhbHRzLiAqLwotCQlpZiAocmVib290X2NwdSAhPSBjcHVpZCkKLQkJCXNtcF9jYWxsX2Z1bmN0aW9uKCh2b2lkICopbWFjaGluZV9yZXN0YXJ0ICwgTlVMTCwgMSwgMCk7CisJLyogU2VlIGlmIHRoZXJlIGhhcyBiZWVuIGdpdmVuIGEgY29tbWFuZCBsaW5lIG92ZXJyaWRlICovCisJaWYgKChyZWJvb3RfY3B1X2lkICE9IC0xKSAmJiAocmVib290X2NwdSA8IE5SX0NQVVMpICYmCisJCWNwdV9pc3NldChyZWJvb3RfY3B1LCBjcHVfb25saW5lX21hcCkpIHsKKwkJcmVib290X2NwdV9pZCA9IHJlYm9vdF9jcHU7CiAJfQogCi0JLyogaWYgcmVib290X2NwdSBpcyBzdGlsbCAtMSwgdGhlbiB3ZSB3YW50IGEgdHJhZGlvbmFsIHJlYm9vdCwgCi0JICAgYW5kIGlmIHdlIGFyZSBub3QgcnVubmluZyBvbiB0aGUgcmVib290X2NwdSwsIGhhbHQgKi8KLQlpZiAoKHJlYm9vdF9jcHUgIT0gLTEpICYmIChjcHVpZCAhPSByZWJvb3RfY3B1KSkgewotCQlmb3IgKDs7KQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImhsdCIpOworCS8qIE1ha2UgY2VydGFpbiB0aGUgY3B1IEknbSByZWJvb3Rpbmcgb24gaXMgb25saW5lICovCisJaWYgKCFjcHVfaXNzZXQocmVib290X2NwdV9pZCwgY3B1X29ubGluZV9tYXApKSB7CisJCXJlYm9vdF9jcHVfaWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJfQotCS8qCi0JICogU3RvcCBhbGwgQ1BVcyBhbmQgdHVybiBvZmYgbG9jYWwgQVBJQ3MgYW5kIHRoZSBJTy1BUElDLCBzbwotCSAqIG90aGVyIE9TcyBzZWUgYSBjbGVhbiBJUlEgc3RhdGUuCisKKwkvKiBNYWtlIGNlcnRhaW4gSSBvbmx5IHJ1biBvbiB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShyZWJvb3RfY3B1X2lkKSk7CisKKwkvKiBPLksuIE5vdyB0aGF0IEknbSBvbiB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLCBzdG9wCisJICogYWxsIG9mIHRoZSBvdGhlcnMsIGFuZCBkaXNhYmxlIHRoZWlyIGxvY2FsIEFQSUNzLgogCSAqLworCiAJc21wX3NlbmRfc3RvcCgpOwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMzQ0LDYgKzMwOSwxMSBAQAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCWRpc2FibGVfSU9fQVBJQygpOwogI2VuZGlmCit9CisKK3ZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKiBfX3VudXNlZCkKK3sKKwltYWNoaW5lX3NodXRkb3duKCk7CiAKIAlpZiAoIXJlYm9vdF90aHJ1X2Jpb3MpIHsKIAkJaWYgKGVmaV9lbmFibGVkKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzEyNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIHJlbG9jYXRlX2tlcm5lbC5TIC0gcHV0IHRoZSBrZXJuZWwgaW1hZ2UgaW4gcGxhY2UgdG8gYm9vdAorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgRXJpYyBCaWVkZXJtYW4gIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKwkvKgorCSAqIE11c3QgYmUgcmVsb2NhdGFibGUgUElDIGNvZGUgY2FsbGFibGUgYXMgYSBDIGZ1bmN0aW9uLCB0aGF0IG9uY2UKKwkgKiBpdCBzdGFydHMgY2FuIG5vdCB1c2UgdGhlIHByZXZpb3VzIHByb2Nlc3NlcyBzdGFjay4KKwkgKi8KKwkuZ2xvYmwgcmVsb2NhdGVfbmV3X2tlcm5lbAorcmVsb2NhdGVfbmV3X2tlcm5lbDoKKwkvKiByZWFkIHRoZSBhcmd1bWVudHMgYW5kIHNheSBnb29kYnllIHRvIHRoZSBzdGFjayAqLworCW1vdmwgIDQoJWVzcCksICVlYnggLyogcGFnZV9saXN0ICovCisJbW92bCAgOCglZXNwKSwgJWVicCAvKiByZWJvb3RfY29kZV9idWZmZXIgKi8KKwltb3ZsICAxMiglZXNwKSwgJWVkeCAvKiBzdGFydCBhZGRyZXNzICovCisJbW92bCAgMTYoJWVzcCksICVlY3ggLyogY3B1X2hhc19wYWUgKi8KKworCS8qIHplcm8gb3V0IGZsYWdzLCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJcHVzaGwgJDAKKwlwb3BmbAorCisJLyogc2V0IGEgbmV3IHN0YWNrIGF0IHRoZSBib3R0b20gb2Ygb3VyIHBhZ2UuLi4gKi8KKwlsZWEgICA0MDk2KCVlYnApLCAlZXNwCisKKwkvKiBzdG9yZSB0aGUgcGFyYW1ldGVycyBiYWNrIG9uIHRoZSBzdGFjayAqLworCXB1c2hsICAgJWVkeCAvKiBzdG9yZSB0aGUgc3RhcnQgYWRkcmVzcyAqLworCisJLyogU2V0IGNyMCB0byBhIGtub3duIHN0YXRlOgorCSAqIDMxIDAgPT0gUGFnaW5nIGRpc2FibGVkCisJICogMTggMCA9PSBBbGlnbm1lbnQgY2hlY2sgZGlzYWJsZWQKKwkgKiAxNiAwID09IFdyaXRlIHByb3RlY3QgZGlzYWJsZWQKKwkgKiAzICAwID09IE5vIHRhc2sgc3dpdGNoCisJICogMiAgMCA9PSBEb24ndCBkbyBGUCBzb2Z0d2FyZSBlbXVsYXRpb24uCisJICogMCAgMSA9PSBQcm9jdGVjdGVkIG1vZGUgZW5hYmxlZAorCSAqLworCW1vdmwJJWNyMCwgJWVheAorCWFuZGwJJH4oKDE8PDMxKXwoMTw8MTgpfCgxPDwxNil8KDE8PDMpfCgxPDwyKSksICVlYXgKKwlvcmwJJCgxPDwwKSwgJWVheAorCW1vdmwJJWVheCwgJWNyMAorCisJLyogY2xlYXIgY3I0IGlmIGFwcGxpY2FibGUgKi8KKwl0ZXN0bAklZWN4LCAlZWN4CisJanoJMWYKKwkvKiBTZXQgY3I0IHRvIGEga25vd24gc3RhdGU6CisJICogU2V0dGluZyBldmVyeXRoaW5nIHRvIHplcm8gc2VlbXMgc2FmZS4KKwkgKi8KKwltb3ZsCSVjcjQsICVlYXgKKwlhbmRsCSQwLCAlZWF4CisJbW92bAklZWF4LCAlY3I0CisKKwlqbXAgMWYKKzE6CisKKwkvKiBGbHVzaCB0aGUgVExCIChuZWVkZWQ/KSAqLworCXhvcmwJJWVheCwgJWVheAorCW1vdmwJJWVheCwgJWNyMworCisJLyogRG8gdGhlIGNvcGllcyAqLworCW1vdmwJJWVieCwgJWVjeAorCWptcAkxZgorCiswOgkvKiB0b3AsIHJlYWQgYW5vdGhlciB3b3JkIGZyb20gdGhlIGluZGlyZWN0aW9uIHBhZ2UgKi8KKwltb3ZsCSglZWJ4KSwgJWVjeAorCWFkZGwJJDQsICVlYngKKzE6CisJdGVzdGwJJDB4MSwgICAlZWN4ICAvKiBpcyBpdCBhIGRlc3RpbmF0aW9uIHBhZ2UgKi8KKwlqegkyZgorCW1vdmwJJWVjeCwJJWVkaQorCWFuZGwJJDB4ZmZmZmYwMDAsICVlZGkKKwlqbXAgICAgIDBiCisyOgorCXRlc3RsCSQweDIsCSVlY3ggIC8qIGlzIGl0IGFuIGluZGlyZWN0aW9uIHBhZ2UgKi8KKwlqegkyZgorCW1vdmwJJWVjeCwJJWVieAorCWFuZGwJJDB4ZmZmZmYwMDAsICVlYngKKwlqbXAgICAgIDBiCisyOgorCXRlc3RsICAgJDB4NCwgICAlZWN4IC8qIGlzIGl0IHRoZSBkb25lIGluZGljYXRvciAqLworCWp6ICAgICAgMmYKKwlqbXAgICAgIDNmCisyOgorCXRlc3RsICAgJDB4OCwgICAlZWN4IC8qIGlzIGl0IHRoZSBzb3VyY2UgaW5kaWNhdG9yICovCisJanogICAgICAwYgkgICAgIC8qIElnbm9yZSBpdCBvdGhlcndpc2UgKi8KKwltb3ZsICAgICVlY3gsICAgJWVzaSAvKiBGb3IgZXZlcnkgc291cmNlIHBhZ2UgZG8gYSBjb3B5ICovCisJYW5kbCAgICAkMHhmZmZmZjAwMCwgJWVzaQorCisJbW92bCAgICAkMTAyNCwgJWVjeAorCXJlcCA7IG1vdnNsCisJam1wICAgICAwYgorCiszOgorCisJLyogVG8gYmUgY2VydGFpbiBvZiBhdm9pZGluZyBwcm9ibGVtcyB3aXRoIHNlbGYtbW9kaWZ5aW5nIGNvZGUKKwkgKiBJIG5lZWQgdG8gZXhlY3V0ZSBhIHNlcmlhbGl6aW5nIGluc3RydWN0aW9uIGhlcmUuCisJICogU28gSSBmbHVzaCB0aGUgVExCLCBpdCdzIGhhbmR5LCBhbmQgbm90IHByb2Nlc3NvciBkZXBlbmRlbnQuCisJICovCisJeG9ybAklZWF4LCAlZWF4CisJbW92bAklZWF4LCAlY3IzCisKKwkvKiBzZXQgYWxsIG9mIHRoZSByZWdpc3RlcnMgdG8ga25vd24gdmFsdWVzICovCisJLyogbGVhdmUgJWVzcCBhbG9uZSAqLworCisJeG9ybAklZWF4LCAlZWF4CisJeG9ybAklZWJ4LCAlZWJ4CisJeG9ybCAgICAlZWN4LCAlZWN4CisJeG9ybCAgICAlZWR4LCAlZWR4CisJeG9ybCAgICAlZXNpLCAlZXNpCisJeG9ybCAgICAlZWRpLCAlZWRpCisJeG9ybCAgICAlZWJwLCAlZWJwCisJcmV0CityZWxvY2F0ZV9uZXdfa2VybmVsX2VuZDoKKworCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUKK3JlbG9jYXRlX25ld19rZXJuZWxfc2l6ZToKKwkubG9uZyByZWxvY2F0ZV9uZXdfa2VybmVsX2VuZCAtIHJlbG9jYXRlX25ld19rZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCAzMDQwNmZkLi43MzA2MzUzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCkBAIC00Myw3ICs0MywxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lZGQuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgorCiAjaW5jbHVkZSA8dmlkZW8vZWRpZC5oPgorCisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KQEAgLTU1LDEyICs2MCwxNSBAQAogI2luY2x1ZGUgInNldHVwX2FyY2hfcHJlLmgiCiAjaW5jbHVkZSA8Ymlvc19lYmRhLmg+CiAKKy8qIEZvcndhcmQgRGVjbGFyYXRpb24uICovCit2b2lkIF9faW5pdCBmaW5kX21heF9wZm4odm9pZCk7CisKIC8qIFRoaXMgdmFsdWUgaXMgc2V0IHVwIGJ5IHRoZSBlYXJseSBib290IGNvZGUgdG8gcG9pbnQgdG8gdGhlIHZhbHVlCiAgICBpbW1lZGlhdGVseSBhZnRlciB0aGUgYm9vdCB0aW1lIHBhZ2UgdGFibGVzLiAgSXQgY29udGFpbnMgYSAqcGh5c2ljYWwqCiAgICBhZGRyZXNzLCBhbmQgbXVzdCBub3QgYmUgaW4gdGhlIC5ic3Mgc2VnbWVudCEgKi8KIHVuc2lnbmVkIGxvbmcgaW5pdF9wZ190YWJsZXNfZW5kIF9faW5pdGRhdGEgPSB+MFVMOwogCi1pbnQgZGlzYWJsZV9wc2UgX19pbml0ZGF0YSA9IDA7CitpbnQgZGlzYWJsZV9wc2UgX19kZXZpbml0ZGF0YSA9IDA7CiAKIC8qCiAgKiBNYWNoaW5lIHNldHVwLi4KQEAgLTczMiw2ICs3NDAsMTUgQEAKIAkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCiAJCQkJdG8tLTsKIAkJCWlmICghbWVtY21wKGZyb20rNywgImV4YWN0bWFwIiwgOCkpIHsKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCQkJCS8qIElmIHdlIGFyZSBkb2luZyBhIGNyYXNoIGR1bXAsIHdlCisJCQkJICogc3RpbGwgbmVlZCB0byBrbm93IHRoZSByZWFsIG1lbQorCQkJCSAqIHNpemUgYmVmb3JlIG9yaWdpbmFsIG1lbW9yeSBtYXAgaXMKKwkJCQkgKiByZXNldC4KKwkJCQkgKi8KKwkJCQlmaW5kX21heF9wZm4oKTsKKwkJCQlzYXZlZF9tYXhfcGZuID0gbWF4X3BmbjsKKyNlbmRpZgogCQkJCWZyb20gKz0gOCs3OwogCQkJCWU4MjAubnJfbWFwID0gMDsKIAkJCQl1c2VyZGVmID0gMTsKQEAgLTgzNSw2ICs4NTIsNDQgQEAKICNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KICNlbmRpZiAvKiBDT05GSUdfQUNQSV9CT09UICovCiAKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwkJLyogZW5hYmxlIGxvY2FsIEFQSUMgKi8KKwkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibGFwaWMiLCA1KSkKKwkJCWxhcGljX2VuYWJsZSgpOworCisJCS8qIGRpc2FibGUgbG9jYWwgQVBJQyAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJub2xhcGljIiwgNikpCisJCQlsYXBpY19kaXNhYmxlKCk7CisjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCisKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwkJLyogY3Jhc2hrZXJuZWw9c2l6ZUBhZGRyIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gcmVzZXJ2ZSBmb3IKKwkJICogYSBjcmFzaCBrZXJuZWwuICBCeSByZXNlcnZpbmcgdGhpcyBtZW1vcnkgd2UgZ3VhcmFudGVlCisJCSAqIHRoYXQgbGludXggbmV2ZXIgc2V0J3MgaXQgdXAgYXMgYSBETUEgdGFyZ2V0LgorCQkgKiBVc2VmdWwgZm9yIGhvbGRpbmcgY29kZSB0byBkbyBzb21ldGhpbmcgYXBwcm9wcmlhdGUKKwkJICogYWZ0ZXIgYSBrZXJuZWwgcGFuaWMuCisJCSAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJjcmFzaGtlcm5lbD0iLCAxMikpIHsKKwkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgYmFzZTsKKwkJCXNpemUgPSBtZW1wYXJzZShmcm9tKzEyLCAmZnJvbSk7CisJCQlpZiAoKmZyb20gPT0gJ0AnKSB7CisJCQkJYmFzZSA9IG1lbXBhcnNlKGZyb20rMSwgJmZyb20pOworCQkJCS8qIEZJWE1FOiBEbyBJIHdhbnQgYSBzYW5pdHkgY2hlY2sKKwkJCQkgKiB0byB2YWxpZGF0ZSB0aGUgbWVtb3J5IHJhbmdlPworCQkJCSAqLworCQkJCWNyYXNoa19yZXMuc3RhcnQgPSBiYXNlOworCQkJCWNyYXNoa19yZXMuZW5kICAgPSBiYXNlICsgc2l6ZSAtIDE7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJCS8qIGVsZmNvcmVoZHI9IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgZWxmIGNvcmUgaGVhZGVyCisJCSAqIHN0b3JlZCBieSB0aGUgY3Jhc2hlZCBrZXJuZWwuCisJCSAqLworCQllbHNlIGlmICghbWVtY21wKGZyb20sICJlbGZjb3JlaGRyPSIsIDExKSkKKwkJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGZyb20rMTEsICZmcm9tKTsKKyNlbmRpZgorCiAJCS8qCiAJCSAqIGhpZ2htZW09c2l6ZSBmb3JjZXMgaGlnaG1lbSB0byBiZSBleGFjdGx5ICdzaXplJyBieXRlcy4KIAkJICogVGhpcyB3b3JrcyBldmVuIG9uIGJveGVzIHRoYXQgaGF2ZSBubyBoaWdobWVtIG90aGVyd2lzZS4KQEAgLTExMTMsOCArMTE2OCw4IEBACiAJICogdGhlICh2ZXJ5IHVubGlrZWx5KSBjYXNlIG9mIHVzIGFjY2lkZW50YWxseSBpbml0aWFsaXppbmcgdGhlCiAJICogYm9vdG1lbSBhbGxvY2F0b3Igd2l0aCBhbiBpbnZhbGlkIFJBTSBhcmVhLgogCSAqLwotCXJlc2VydmVfYm9vdG1lbShISUdIX01FTU9SWSwgKFBGTl9QSFlTKG1pbl9sb3dfcGZuKSArCi0JCQkgYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFLTEpIC0gKEhJR0hfTUVNT1JZKSk7CisJcmVzZXJ2ZV9ib290bWVtKF9fUEhZU0lDQUxfU1RBUlQsIChQRk5fUEhZUyhtaW5fbG93X3BmbikgKworCQkJIGJvb3RtYXBfc2l6ZSArIFBBR0VfU0laRS0xKSAtIChfX1BIWVNJQ0FMX1NUQVJUKSk7CiAKIAkvKgogCSAqIHJlc2VydmUgcGh5c2ljYWwgcGFnZSAwIC0gaXQncyBhIHNwZWNpYWwgQklPUyBwYWdlIG9uIG1hbnkgYm94ZXMsCkBAIC0xMTcwLDYgKzEyMjUsMTEgQEAKIAkJfQogCX0KICNlbmRpZgorI2lmZGVmIENPTkZJR19LRVhFQworCWlmIChjcmFzaGtfcmVzLnN0YXJ0ICE9IGNyYXNoa19yZXMuZW5kKQorCQlyZXNlcnZlX2Jvb3RtZW0oY3Jhc2hrX3Jlcy5zdGFydCwKKwkJCWNyYXNoa19yZXMuZW5kIC0gY3Jhc2hrX3Jlcy5zdGFydCArIDEpOworI2VuZGlmCiB9CiAKIC8qCkBAIC0xMjIzLDYgKzEyODMsOSBAQAogCQkJICovCiAJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgY29kZV9yZXNvdXJjZSk7CiAJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgZGF0YV9yZXNvdXJjZSk7CisjaWZkZWYgQ09ORklHX0tFWEVDCisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmNyYXNoa19yZXMpOworI2VuZGlmCiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zaWduYWwuYwppbmRleCBiOWI4ZjRlLi44OWVmN2FkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2lnbmFsLmMKQEAgLTYwOCwxMCArNjA4LDggQEAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIDE7CiAKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKLQkJcmVmcmlnZXJhdG9yKDApOworCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCWdvdG8gbm9fc2lnbmFsOwotCX0KIAogCWlmICghb2xkc2V0KQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCmluZGV4IDY4YmU3ZDBjLi5jZWM0YmRlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vbXRyci5oPgpAQCAtMTY0LDcgKzE2NSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJCisJV0FSTl9PTihtYXNrICYgfmNwdXNfYWRkcihjcHVfb25saW5lX21hcClbMF0pOwogCS8qCiAJICogV2FpdCBmb3IgaWRsZS4KIAkgKi8KQEAgLTM0NiwyMSArMzQ3LDIxIEBACiBzdGF0aWMgdm9pZCBmbHVzaF90bGJfb3RoZXJzKGNwdW1hc2tfdCBjcHVtYXNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgdmEpCiB7Ci0JY3B1bWFza190IHRtcDsKIAkvKgogCSAqIEEgY291cGxlIG9mICh0byBiZSByZW1vdmVkKSBzYW5pdHkgY2hlY2tzOgogCSAqCi0JICogLSB3ZSBkbyBub3Qgc2VuZCBJUElzIHRvIG5vdC15ZXQgYm9vdGVkIENQVXMuCiAJICogLSBjdXJyZW50IENQVSBtdXN0IG5vdCBiZSBpbiBtYXNrCiAJICogLSBtYXNrIG11c3QgZXhpc3QgOikKIAkgKi8KIAlCVUdfT04oY3B1c19lbXB0eShjcHVtYXNrKSk7Ci0KLQljcHVzX2FuZCh0bXAsIGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFwKTsKLQlCVUdfT04oIWNwdXNfZXF1YWwoY3B1bWFzaywgdG1wKSk7CiAJQlVHX09OKGNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdW1hc2spKTsKIAlCVUdfT04oIW1tKTsKIAorCS8qIElmIGEgQ1BVIHdoaWNoIHdlIHJhbiBvbiBoYXMgZ29uZSBkb3duLCBPSy4gKi8KKwljcHVzX2FuZChjcHVtYXNrLCBjcHVtYXNrLCBjcHVfb25saW5lX21hcCk7CisJaWYgKGNwdXNfZW1wdHkoY3B1bWFzaykpCisJCXJldHVybjsKKwogCS8qCiAJICogaSdtIG5vdCBoYXBweSBhYm91dCB0aGlzIGdsb2JhbCBzaGFyZWQgc3BpbmxvY2sgaW4gdGhlCiAJICogTU0gaG90IHBhdGgsIGJ1dCB3ZSdsbCBzZWUgaG93IGNvbnRlbmRlZCBpdCBpcy4KQEAgLTQ3Niw2ICs0NzcsNyBAQAogICovCiB2b2lkIHNtcF9zZW5kX3Jlc2NoZWR1bGUoaW50IGNwdSkKIHsKKwlXQVJOX09OKGNwdV9pc19vZmZsaW5lKGNwdSkpOwogCXNlbmRfSVBJX21hc2soY3B1bWFza19vZl9jcHUoY3B1KSwgUkVTQ0hFRFVMRV9WRUNUT1IpOwogfQogCkBAIC00OTMsNiArNDk1LDE2IEBACiAJaW50IHdhaXQ7CiB9OwogCit2b2lkIGxvY2tfaXBpX2NhbGxfbG9jayh2b2lkKQoreworCXNwaW5fbG9ja19pcnEoJmNhbGxfbG9jayk7Cit9CisKK3ZvaWQgdW5sb2NrX2lwaV9jYWxsX2xvY2sodm9pZCkKK3sKKwlzcGluX3VubG9ja19pcnEoJmNhbGxfbG9jayk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCAqIGNhbGxfZGF0YTsKIAogLyoKQEAgLTUxNiwxMCArNTI4LDE1IEBACiAgKi8KIHsKIAlzdHJ1Y3QgY2FsbF9kYXRhX3N0cnVjdCBkYXRhOwotCWludCBjcHVzID0gbnVtX29ubGluZV9jcHVzKCktMTsKKwlpbnQgY3B1czsKIAotCWlmICghY3B1cykKKwkvKiBIb2xkaW5nIGFueSBsb2NrIHN0b3BzIGNwdXMgZnJvbSBnb2luZyBkb3duLiAqLworCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKKwljcHVzID0gbnVtX29ubGluZV9jcHVzKCkgLSAxOworCWlmICghY3B1cykgeworCQlzcGluX3VubG9jaygmY2FsbF9sb2NrKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJLyogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLwogCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKQEAgLTUzMSw3ICs1NDgsNiBAQAogCWlmICh3YWl0KQogCQlhdG9taWNfc2V0KCZkYXRhLmZpbmlzaGVkLCAwKTsKIAotCXNwaW5fbG9jaygmY2FsbF9sb2NrKTsKIAljYWxsX2RhdGEgPSAmZGF0YTsKIAltYigpOwogCQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBjMjBkOTZkLi44YWM4ZTlmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpAQCAtNDQsNiArNDQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CkBAIC01NiwyMCArNTksMzAgQEAKICNpbmNsdWRlIDxzbXBib290X2hvb2tzLmg+CiAKIC8qIFNldCBpZiB3ZSBmaW5kIGEgQiBzdGVwcGluZyBDUFUgKi8KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKK3N0YXRpYyBpbnQgX19kZXZpbml0ZGF0YSBzbXBfYl9zdGVwcGluZzsKIAogLyogTnVtYmVyIG9mIHNpYmxpbmdzIHBlciBDUFUgcGFja2FnZSAqLwogaW50IHNtcF9udW1fc2libGluZ3MgPSAxOwogI2lmZGVmIENPTkZJR19YODZfSFQKIEVYUE9SVF9TWU1CT0woc21wX251bV9zaWJsaW5ncyk7CiAjZW5kaWYKLWludCBwaHlzX3Byb2NfaWRbTlJfQ1BVU107IC8qIFBhY2thZ2UgSUQgb2YgZWFjaCBsb2dpY2FsIENQVSAqLworCisvKiBQYWNrYWdlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KK2ludCBwaHlzX3Byb2NfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHtbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUR9OwogRVhQT1JUX1NZTUJPTChwaHlzX3Byb2NfaWQpOwotaW50IGNwdV9jb3JlX2lkW05SX0NQVVNdOyAvKiBDb3JlIElEIG9mIGVhY2ggbG9naWNhbCBDUFUgKi8KKworLyogQ29yZSBJRCBvZiBlYWNoIGxvZ2ljYWwgQ1BVICovCitpbnQgY3B1X2NvcmVfaWRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHtbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUR9OwogRVhQT1JUX1NZTUJPTChjcHVfY29yZV9pZCk7CiAKK2NwdW1hc2tfdCBjcHVfc2libGluZ19tYXBbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKK0VYUE9SVF9TWU1CT0woY3B1X3NpYmxpbmdfbWFwKTsKKworY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTChjcHVfY29yZV9tYXApOworCiAvKiBiaXRtYXAgb2Ygb25saW5lIGNwdXMgKi8KLWNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKK2NwdW1hc2tfdCBjcHVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTChjcHVfb25saW5lX21hcCk7CiAKIGNwdW1hc2tfdCBjcHVfY2FsbGluX21hcDsKQEAgLTc3LDExICs5MCwxNyBAQAogRVhQT1JUX1NZTUJPTChjcHVfY2FsbG91dF9tYXApOwogc3RhdGljIGNwdW1hc2tfdCBzbXBfY29tbWVuY2VkX21hc2s7CiAKKy8qIFRTQydzIHVwcGVyIDMyIGJpdHMgY2FuJ3QgYmUgd3JpdHRlbiBpbiBlYXJpbGVyIENQVSAoYmVmb3JlIHByZXNjb3R0KSwgdGhlcmUKKyAqIGlzIG5vIHdheSB0byByZXN5bmMgb25lIEFQIGFnYWluc3QgQlAuIFRCRDogZm9yIHByZXNjb3R0IGFuZCBhYm92ZSwgd2UKKyAqIHNob3VsZCB1c2UgSUE2NCdzIGFsZ29yaXRobQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgdHNjX3N5bmNfZGlzYWJsZWQ7CisKIC8qIFBlciBDUFUgYm9nb21pcHMgYW5kIG90aGVyIHBhcmFtZXRlcnMgKi8KIHN0cnVjdCBjcHVpbmZvX3g4NiBjcHVfZGF0YVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwogRVhQT1JUX1NZTUJPTChjcHVfZGF0YSk7CiAKLXU4IHg4Nl9jcHVfdG9fYXBpY2lkW05SX0NQVVNdID0KK3U4IHg4Nl9jcHVfdG9fYXBpY2lkW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPQogCQkJeyBbMCAuLi4gTlJfQ1BVUy0xXSA9IDB4ZmYgfTsKIEVYUE9SVF9TWU1CT0woeDg2X2NwdV90b19hcGljaWQpOwogCkBAIC05NiwxMyArMTE1LDE2IEBACiAKIHN0YXRpYyB2b2lkIG1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQodm9pZCk7CiAKKy8qIFN0YXRlIG9mIGVhY2ggQ1BVLiAqLworREVGSU5FX1BFUl9DUFUoaW50LCBjcHVfc3RhdGUpID0geyAwIH07CisKIC8qCiAgKiBDdXJyZW50bHkgdHJpdmlhbC4gV3JpdGUgdGhlIHJlYWwtPnByb3RlY3RlZCBtb2RlCiAgKiBib290c3RyYXAgaW50byB0aGUgcGFnZSBjb25jZXJuZWQuIFRoZSBjYWxsZXIKICAqIGhhcyBtYWRlIHN1cmUgaXQncyBzdWl0YWJseSBhbGlnbmVkLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBzZXR1cF90cmFtcG9saW5lKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2RldmluaXQgc2V0dXBfdHJhbXBvbGluZSh2b2lkKQogewogCW1lbWNweSh0cmFtcG9saW5lX2Jhc2UsIHRyYW1wb2xpbmVfZGF0YSwgdHJhbXBvbGluZV9lbmQgLSB0cmFtcG9saW5lX2RhdGEpOwogCXJldHVybiB2aXJ0X3RvX3BoeXModHJhbXBvbGluZV9iYXNlKTsKQEAgLTEzMiw3ICsxNTQsNyBAQAogICogYSBnaXZlbiBDUFUKICAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgc21wX3N0b3JlX2NwdV9pbmZvKGludCBpZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKQogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgaWQ7CiAKQEAgLTMyNiw3ICszNDgsNyBAQAogCiBzdGF0aWMgYXRvbWljX3QgaW5pdF9kZWFzc2VydGVkOwogCi1zdGF0aWMgdm9pZCBfX2luaXQgc21wX2NhbGxpbih2b2lkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHNtcF9jYWxsaW4odm9pZCkKIHsKIAlpbnQgY3B1aWQsIHBoeXNfaWQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwpAQCAtNDExLDE2ICs0MzMsNDggQEAKIAkvKgogCSAqICAgICAgU3luY2hyb25pemUgdGhlIFRTQyB3aXRoIHRoZSBCUAogCSAqLwotCWlmIChjcHVfaGFzX3RzYyAmJiBjcHVfa2h6KQorCWlmIChjcHVfaGFzX3RzYyAmJiBjcHVfa2h6ICYmICF0c2Nfc3luY19kaXNhYmxlZCkKIAkJc3luY2hyb25pemVfdHNjX2FwKCk7CiB9CiAKIHN0YXRpYyBpbnQgY3B1Y291bnQ7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X2NwdV9zaWJsaW5nX21hcChpbnQgY3B1KQoreworCWludCBpOworCisJaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJCWlmICghY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpCisJCQkJY29udGludWU7CisJCQlpZiAoY3B1X2NvcmVfaWRbY3B1XSA9PSBjcHVfY29yZV9pZFtpXSkgeworCQkJCWNwdV9zZXQoaSwgY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCQkJCWNwdV9zZXQoY3B1LCBjcHVfc2libGluZ19tYXBbaV0pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY3B1X3NldChjcHUsIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKwl9CisKKwlpZiAoY3VycmVudF9jcHVfZGF0YS54ODZfbnVtX2NvcmVzID4gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7CisJCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBoeXNfcHJvY19pZFtjcHVdID09IHBoeXNfcHJvY19pZFtpXSkgeworCQkJCWNwdV9zZXQoaSwgY3B1X2NvcmVfbWFwW2NwdV0pOworCQkJCWNwdV9zZXQoY3B1LCBjcHVfY29yZV9tYXBbaV0pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY3B1X2NvcmVfbWFwW2NwdV0gPSBjcHVfc2libGluZ19tYXBbY3B1XTsKKwl9Cit9CisKIC8qCiAgKiBBY3RpdmF0ZSBhIHNlY29uZGFyeSBwcm9jZXNzb3IuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzdGFydF9zZWNvbmRhcnkodm9pZCAqdW51c2VkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHN0YXJ0X3NlY29uZGFyeSh2b2lkICp1bnVzZWQpCiB7CiAJLyoKIAkgKiBEb250IHB1dCBhbnl0aGluZyBiZWZvcmUgc21wX2NhbGxpbigpLCBTTVAKQEAgLTQ0Myw3ICs0OTcsMjMgQEAKIAkgKiB0aGUgbG9jYWwgVExCcyB0b28uCiAJICovCiAJbG9jYWxfZmx1c2hfdGxiKCk7CisKKwkvKiBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgc2V0dGluZyBjcHVfb25saW5lX21hcCAqLworCXNldF9jcHVfc2libGluZ19tYXAocmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJd21iKCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gaG9sZCBjYWxsX2xvY2ssIHNvIHRoZXJlIGlzIG5vIGluY29uc2lzdGVuY3kKKwkgKiBiZXR3ZWVuIHRoZSB0aW1lIHNtcF9jYWxsX2Z1bmN0aW9uKCkgZGV0ZXJtaW5lcyBudW1iZXIgb2YKKwkgKiBJUEkgcmVjZWlwaWVudHMsIGFuZCB0aGUgdGltZSB3aGVuIHRoZSBkZXRlcm1pbmF0aW9uIGlzIG1hZGUKKwkgKiBmb3Igd2hpY2ggY3B1cyByZWNlaXZlIHRoZSBJUEkuIEhvbGRpbmcgdGhpcworCSAqIGxvY2sgaGVscHMgdXMgdG8gbm90IGluY2x1ZGUgdGhpcyBjcHUgaW4gYSBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MKKwkgKiBzbXBfY2FsbF9mdW5jdGlvbigpLgorCSAqLworCWxvY2tfaXBpX2NhbGxfbG9jaygpOwogCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CisJdW5sb2NrX2lwaV9jYWxsX2xvY2soKTsKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7CiAKIAkvKiBXZSBjYW4gdGFrZSBpbnRlcnJ1cHRzIG5vdzogd2UncmUgb2ZmaWNpYWxseSAidXAiLiAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKQEAgLTQ1OCw3ICs1MjgsNyBAQAogICogZnJvbSB0aGUgdGFzayBzdHJ1Y3R1cmUKICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgcmV0dXJuLgogICovCi12b2lkIF9faW5pdCBpbml0aWFsaXplX3NlY29uZGFyeSh2b2lkKQordm9pZCBfX2RldmluaXQgaW5pdGlhbGl6ZV9zZWNvbmRhcnkodm9pZCkKIHsKIAkvKgogCSAqIFdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gbG9hZCB0aGUgZnVsbCBUU1MsCkBAIC00ODAsMTAgKzU1MCwxMCBAQAogI2lmZGVmIENPTkZJR19OVU1BCiAKIC8qIHdoaWNoIGxvZ2ljYWwgQ1BVcyBhcmUgb24gd2hpY2ggbm9kZXMgKi8KLWNwdW1hc2tfdCBub2RlXzJfY3B1X21hc2tbTUFYX05VTU5PREVTXSA9CitjcHVtYXNrX3Qgbm9kZV8yX2NwdV9tYXNrW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseSA9CiAJCQkJeyBbMCAuLi4gTUFYX05VTU5PREVTLTFdID0gQ1BVX01BU0tfTk9ORSB9OwogLyogd2hpY2ggbm9kZSBlYWNoIGxvZ2ljYWwgQ1BVIGlzIG9uICovCi1pbnQgY3B1XzJfbm9kZVtOUl9DUFVTXSA9IHsgWzAgLi4uIE5SX0NQVVMtMV0gPSAwIH07CitpbnQgY3B1XzJfbm9kZVtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5ID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IDAgfTsKIEVYUE9SVF9TWU1CT0woY3B1XzJfbm9kZSk7CiAKIC8qIHNldCB1cCBhIG1hcHBpbmcgYmV0d2VlbiBjcHUgYW5kIG5vZGUuICovCkBAIC01MTEsNyArNTgxLDcgQEAKIAogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKLXU4IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUy0xXSA9IEJBRF9BUElDSUQgfTsKK3U4IGNwdV8yX2xvZ2ljYWxfYXBpY2lkW05SX0NQVVNdIF9fcmVhZF9tb3N0bHkgPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwogCiBzdGF0aWMgdm9pZCBtYXBfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKHZvaWQpCiB7CkBAIC01NzIsNyArNjQyLDcgQEAKICAqIElOSVQsIElOSVQsIFNUQVJUVVAgc2VxdWVuY2Ugd2lsbCByZXNldCB0aGUgY2hpcCBoYXJkIGZvciB1cywgYW5kIHRoaXMKICAqIHdvbid0IC4uLiByZW1lbWJlciB0byBjbGVhciBkb3duIHRoZSBBUElDLCBldGMgbGF0ZXIuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50IF9fZGV2aW5pdAogd2FrZXVwX3NlY29uZGFyeV9jcHUoaW50IGxvZ2ljYWxfYXBpY2lkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2VpcCkKIHsKIAl1bnNpZ25lZCBsb25nIHNlbmRfc3RhdHVzID0gMCwgYWNjZXB0X3N0YXR1cyA9IDA7CkBAIC02MTgsNyArNjg4LDcgQEAKICNlbmRpZgkvKiBXQUtFX1NFQ09OREFSWV9WSUFfTk1JICovCiAKICNpZmRlZiBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVAotc3RhdGljIGludCBfX2luaXQKK3N0YXRpYyBpbnQgX19kZXZpbml0CiB3YWtldXBfc2Vjb25kYXJ5X2NwdShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQogewogCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMgPSAwLCBhY2NlcHRfc3RhdHVzID0gMDsKQEAgLTc1Myw4ICs4MjMsNDMgQEAKICNlbmRpZgkvKiBXQUtFX1NFQ09OREFSWV9WSUFfSU5JVCAqLwogCiBleHRlcm4gY3B1bWFza190IGNwdV9pbml0aWFsaXplZDsKK3N0YXRpYyBpbmxpbmUgaW50IGFsbG9jX2NwdV9pZCh2b2lkKQoreworCWNwdW1hc2tfdAl0bXBfbWFwOworCWludCBjcHU7CisJY3B1c19jb21wbGVtZW50KHRtcF9tYXAsIGNwdV9wcmVzZW50X21hcCk7CisJY3B1ID0gZmlyc3RfY3B1KHRtcF9tYXApOworCWlmIChjcHUgPj0gTlJfQ1BVUykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGNwdTsKK30KIAotc3RhdGljIGludCBfX2luaXQgZG9fYm9vdF9jcHUoaW50IGFwaWNpZCkKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBfX2RldmluaXRkYXRhIGNwdV9pZGxlX3Rhc2tzW05SX0NQVVNdOworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBhbGxvY19pZGxlX3Rhc2soaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGU7CisKKwlpZiAoKGlkbGUgPSBjcHVfaWRsZV90YXNrc1tjcHVdKSAhPSBOVUxMKSB7CisJCS8qIGluaXRpYWxpemUgdGhyZWFkX3N0cnVjdC4gIHdlIHJlYWxseSB3YW50IHRvIGF2b2lkIGRlc3Ryb3kKKwkJICogaWRsZSB0cmVhZAorCQkgKi8KKwkJaWRsZS0+dGhyZWFkLmVzcCA9ICh1bnNpZ25lZCBsb25nKSgoKHN0cnVjdCBwdF9yZWdzICopCisJCQkoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgaWRsZS0+dGhyZWFkX2luZm8pKSAtIDEpOworCQlpbml0X2lkbGUoaWRsZSwgY3B1KTsKKwkJcmV0dXJuIGlkbGU7CisJfQorCWlkbGUgPSBmb3JrX2lkbGUoY3B1KTsKKworCWlmICghSVNfRVJSKGlkbGUpKQorCQljcHVfaWRsZV90YXNrc1tjcHVdID0gaWRsZTsKKwlyZXR1cm4gaWRsZTsKK30KKyNlbHNlCisjZGVmaW5lIGFsbG9jX2lkbGVfdGFzayhjcHUpIGZvcmtfaWRsZShjcHUpCisjZW5kaWYKKworc3RhdGljIGludCBfX2RldmluaXQgZG9fYm9vdF9jcHUoaW50IGFwaWNpZCwgaW50IGNwdSkKIC8qCiAgKiBOT1RFIC0gb24gbW9zdCBzeXN0ZW1zIHRoaXMgaXMgYSBQSFlTSUNBTCBhcGljIElELCBidXQgb24gbXVsdGlxdWFkCiAgKiAoaWUgY2x1c3RlcmVkIGFwaWMgYWRkcmVzc2luZyBtb2RlKSwgdGhpcyBpcyBhIExPR0lDQUwgYXBpYyBJRC4KQEAgLTc2MywxNiArODY4LDE3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOwogCXVuc2lnbmVkIGxvbmcgYm9vdF9lcnJvcjsKLQlpbnQgdGltZW91dCwgY3B1OworCWludCB0aW1lb3V0OwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwOwogCXVuc2lnbmVkIHNob3J0IG5taV9oaWdoID0gMCwgbm1pX2xvdyA9IDA7CiAKLQljcHUgPSArK2NwdWNvdW50OworCSsrY3B1Y291bnQ7CisKIAkvKgogCSAqIFdlIGNhbid0IHVzZSBrZXJuZWxfdGhyZWFkIHNpbmNlIHdlIG11c3QgYXZvaWQgdG8KIAkgKiByZXNjaGVkdWxlIHRoZSBjaGlsZC4KIAkgKi8KLQlpZGxlID0gZm9ya19pZGxlKGNwdSk7CisJaWRsZSA9IGFsbG9jX2lkbGVfdGFzayhjcHUpOwogCWlmIChJU19FUlIoaWRsZSkpCiAJCXBhbmljKCJmYWlsZWQgZm9yayBmb3IgQ1BVICVkIiwgY3B1KTsKIAlpZGxlLT50aHJlYWQuZWlwID0gKHVuc2lnbmVkIGxvbmcpIHN0YXJ0X3NlY29uZGFyeTsKQEAgLTgzOSwxMyArOTQ1LDE2IEBACiAJCQlpbnF1aXJlX3JlbW90ZV9hcGljKGFwaWNpZCk7CiAJCX0KIAl9Ci0JeDg2X2NwdV90b19hcGljaWRbY3B1XSA9IGFwaWNpZDsKKwogCWlmIChib290X2Vycm9yKSB7CiAJCS8qIFRyeSB0byBwdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB0aGV5IHdlcmUgYmVmb3JlIC4uLiAqLwogCQl1bm1hcF9jcHVfdG9fbG9naWNhbF9hcGljaWQoY3B1KTsKIAkJY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxvdXRfbWFwKTsgLyogd2FzIHNldCBoZXJlIChkb19ib290X2NwdSgpKSAqLwogCQljcHVfY2xlYXIoY3B1LCBjcHVfaW5pdGlhbGl6ZWQpOyAvKiB3YXMgc2V0IGJ5IGNwdV9pbml0KCkgKi8KIAkJY3B1Y291bnQtLTsKKwl9IGVsc2UgeworCQl4ODZfY3B1X3RvX2FwaWNpZFtjcHVdID0gYXBpY2lkOworCQljcHVfc2V0KGNwdSwgY3B1X3ByZXNlbnRfbWFwKTsKIAl9CiAKIAkvKiBtYXJrICJzdHVjayIgYXJlYSBhcyBub3Qgc3R1Y2sgKi8KQEAgLTg1NCw2ICs5NjMsNzUgQEAKIAlyZXR1cm4gYm9vdF9lcnJvcjsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQordm9pZCBjcHVfZXhpdF9jbGVhcih2b2lkKQoreworCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWRsZV90YXNrX2V4aXQoKTsKKworCWNwdWNvdW50IC0tOworCWNwdV91bmluaXQoKTsKKwlpcnFfY3R4X2V4aXQoY3B1KTsKKworCWNwdV9jbGVhcihjcHUsIGNwdV9jYWxsb3V0X21hcCk7CisJY3B1X2NsZWFyKGNwdSwgY3B1X2NhbGxpbl9tYXApOworCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CisKKwljcHVfY2xlYXIoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCXVubWFwX2NwdV90b19sb2dpY2FsX2FwaWNpZChjcHUpOworfQorCitzdHJ1Y3Qgd2FybV9ib290X2NwdV9pbmZvIHsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqY29tcGxldGU7CisJaW50IGFwaWNpZDsKKwlpbnQgY3B1OworfTsKKworc3RhdGljIHZvaWQgX19kZXZpbml0IGRvX3dhcm1fYm9vdF9jcHUodm9pZCAqcCkKK3sKKwlzdHJ1Y3Qgd2FybV9ib290X2NwdV9pbmZvICppbmZvID0gcDsKKwlkb19ib290X2NwdShpbmZvLT5hcGljaWQsIGluZm8tPmNwdSk7CisJY29tcGxldGUoaW5mby0+Y29tcGxldGUpOworfQorCitpbnQgX19kZXZpbml0IHNtcF9wcmVwYXJlX2NwdShpbnQgY3B1KQoreworCURFQ0xBUkVfQ09NUExFVElPTihkb25lKTsKKwlzdHJ1Y3Qgd2FybV9ib290X2NwdV9pbmZvIGluZm87CisJc3RydWN0IHdvcmtfc3RydWN0IHRhc2s7CisJaW50CWFwaWNpZCwgcmV0OworCisJbG9ja19jcHVfaG90cGx1ZygpOworCWFwaWNpZCA9IHg4Nl9jcHVfdG9fYXBpY2lkW2NwdV07CisJaWYgKGFwaWNpZCA9PSBCQURfQVBJQ0lEKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpbmZvLmNvbXBsZXRlID0gJmRvbmU7CisJaW5mby5hcGljaWQgPSBhcGljaWQ7CisJaW5mby5jcHUgPSBjcHU7CisJSU5JVF9XT1JLKCZ0YXNrLCBkb193YXJtX2Jvb3RfY3B1LCAmaW5mbyk7CisKKwl0c2Nfc3luY19kaXNhYmxlZCA9IDE7CisKKwkvKiBpbml0IGxvdyBtZW0gbWFwcGluZyAqLworCW1lbWNweShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BHRF9QVFJTLAorCQkJc2l6ZW9mKHN3YXBwZXJfcGdfZGlyWzBdKSAqIEtFUk5FTF9QR0RfUFRSUyk7CisJZmx1c2hfdGxiX2FsbCgpOworCXNjaGVkdWxlX3dvcmsoJnRhc2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmRvbmUpOworCisJdHNjX3N5bmNfZGlzYWJsZWQgPSAwOworCXphcF9sb3dfbWFwcGluZ3MoKTsKKwlyZXQgPSAwOworZXhpdDoKKwl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCisKIHN0YXRpYyB2b2lkIHNtcF90dW5lX3NjaGVkdWxpbmcgKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBjYWNoZXNpemU7ICAgICAgIC8qIGtCICAgKi8KQEAgLTg5NSwxMyArMTA3Myw2IEBACiBFWFBPUlRfU1lNQk9MKHhxdWFkX3BvcnRpbyk7CiAjZW5kaWYKIAotY3B1bWFza190IGNwdV9zaWJsaW5nX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwotI2lmZGVmIENPTkZJR19YODZfSFQKLUVYUE9SVF9TWU1CT0woY3B1X3NpYmxpbmdfbWFwKTsKLSNlbmRpZgotY3B1bWFza190IGNwdV9jb3JlX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwotRVhQT1JUX1NZTUJPTChjcHVfY29yZV9tYXApOwotCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX2Jvb3RfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CiAJaW50IGFwaWNpZCwgY3B1LCBiaXQsIGtpY2tlZDsKQEAgLTEwMTMsNyArMTE4NCw3IEBACiAJCWlmIChtYXhfY3B1cyA8PSBjcHVjb3VudCsxKQogCQkJY29udGludWU7CiAKLQkJaWYgKGRvX2Jvb3RfY3B1KGFwaWNpZCkpCisJCWlmICgoKGNwdSA9IGFsbG9jX2NwdV9pZCgpKSA8PSAwKSB8fCBkb19ib290X2NwdShhcGljaWQsIGNwdSkpCiAJCQlwcmludGsoIkNQVSAjJWQgbm90IHJlc3BvbmRpbmcgLSBjYW5ub3QgdXNlIGl0LlxuIiwKIAkJCQkJCQkJYXBpY2lkKTsKIAkJZWxzZQpAQCAtMTA2NSw0NCArMTIzNiw4IEBACiAJCWNwdXNfY2xlYXIoY3B1X2NvcmVfbWFwW2NwdV0pOwogCX0KIAotCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKLQkJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7Ci0JCWludCBzaWJsaW5ncyA9IDA7Ci0JCWludCBpOwotCQlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9jYWxsb3V0X21hcCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoc21wX251bV9zaWJsaW5ncyA+IDEpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY3B1X2NvcmVfaWRbY3B1XSA9PSBjcHVfY29yZV9pZFtpXSkgewotCQkJCQlzaWJsaW5ncysrOwotCQkJCQljcHVfc2V0KGksIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzaWJsaW5ncysrOwotCQkJY3B1X3NldChjcHUsIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKLQkJfQotCi0JCWlmIChzaWJsaW5ncyAhPSBzbXBfbnVtX3NpYmxpbmdzKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJXQVJOSU5HOiAlZCBzaWJsaW5ncyBmb3VuZCBmb3IgQ1BVJWQsIHNob3VsZCBiZSAlZFxuIiwgc2libGluZ3MsIGNwdSwgc21wX251bV9zaWJsaW5ncyk7Ci0JCQlzbXBfbnVtX3NpYmxpbmdzID0gc2libGluZ3M7Ci0JCX0KLQotCQlpZiAoYy0+eDg2X251bV9jb3JlcyA+IDEpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJCQlpZiAoIWNwdV9pc3NldChpLCBjcHVfY2FsbG91dF9tYXApKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocGh5c19wcm9jX2lkW2NwdV0gPT0gcGh5c19wcm9jX2lkW2ldKSB7Ci0JCQkJCWNwdV9zZXQoaSwgY3B1X2NvcmVfbWFwW2NwdV0pOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNwdV9jb3JlX21hcFtjcHVdID0gY3B1X3NpYmxpbmdfbWFwW2NwdV07Ci0JCX0KLQl9CisJY3B1X3NldCgwLCBjcHVfc2libGluZ19tYXBbMF0pOworCWNwdV9zZXQoMCwgY3B1X2NvcmVfbWFwWzBdKTsKIAogCXNtcGJvb3Rfc2V0dXBfaW9fYXBpYygpOwogCkBAIC0xMTE5LDYgKzEyNTQsOSBAQAogICAgd2hvIHVuZGVyc3RhbmRzIGFsbCB0aGlzIHN0dWZmIHNob3VsZCByZXdyaXRlIGl0IHByb3Blcmx5LiAtLVJSIDE1L0p1bC8wMiAqLwogdm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CisJc21wX2NvbW1lbmNlZF9tYXNrID0gY3B1bWFza19vZl9jcHUoMCk7CisJY3B1X2NhbGxpbl9tYXAgPSBjcHVtYXNrX29mX2NwdSgwKTsKKwltYigpOwogCXNtcF9ib290X2NwdXMobWF4X2NwdXMpOwogfQogCkBAIC0xMTI2LDIzICsxMjY0LDk4IEBACiB7CiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2NhbGxvdXRfbWFwKTsKKwljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X3ByZXNlbnRfbWFwKTsKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyB2b2lkCityZW1vdmVfc2libGluZ2luZm8oaW50IGNwdSkKK3sKKwlpbnQgc2libGluZzsKKworCWZvcl9lYWNoX2NwdV9tYXNrKHNpYmxpbmcsIGNwdV9zaWJsaW5nX21hcFtjcHVdKQorCQljcHVfY2xlYXIoY3B1LCBjcHVfc2libGluZ19tYXBbc2libGluZ10pOworCWZvcl9lYWNoX2NwdV9tYXNrKHNpYmxpbmcsIGNwdV9jb3JlX21hcFtjcHVdKQorCQljcHVfY2xlYXIoY3B1LCBjcHVfY29yZV9tYXBbc2libGluZ10pOworCWNwdXNfY2xlYXIoY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCWNwdXNfY2xlYXIoY3B1X2NvcmVfbWFwW2NwdV0pOworCXBoeXNfcHJvY19pZFtjcHVdID0gQkFEX0FQSUNJRDsKKwljcHVfY29yZV9pZFtjcHVdID0gQkFEX0FQSUNJRDsKK30KKworaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKK3sKKwljcHVtYXNrX3QgbWFwID0gY3B1X29ubGluZV9tYXA7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qCisJICogUGVyaGFwcyB1c2UgY3B1ZnJlcSB0byBkcm9wIGZyZXF1ZW5jeSwgYnV0IHRoYXQgY291bGQgZ28KKwkgKiBpbnRvIGdlbmVyaWMgY29kZS4KKyAJICoKKwkgKiBXZSB3b24ndCB0YWtlIGRvd24gdGhlIGJvb3QgcHJvY2Vzc29yIG9uIGkzODYgZHVlIHRvIHNvbWUKKwkgKiBpbnRlcnJ1cHRzIG9ubHkgYmVpbmcgYWJsZSB0byBiZSBzZXJ2aWNlZCBieSB0aGUgQlNQLgorCSAqIEVzcGVjaWFsbHkgc28gaWYgd2UncmUgbm90IHVzaW5nIGFuIElPQVBJQwktendhbmUKKwkgKi8KKwlpZiAoY3B1ID09IDApCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBXZSBlbmFibGUgdGhlIHRpbWVyIGFnYWluIG9uIHRoZSBleGl0IHBhdGggb2YgdGhlIGRlYXRoIGxvb3AgKi8KKwlkaXNhYmxlX0FQSUNfdGltZXIoKTsKKwkvKiBBbGxvdyBhbnkgcXVldWVkIHRpbWVyIGludGVycnVwdHMgdG8gZ2V0IHNlcnZpY2VkICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCW1kZWxheSgxKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJcmVtb3ZlX3NpYmxpbmdpbmZvKGNwdSk7CisKKwljcHVfY2xlYXIoY3B1LCBtYXApOworCWZpeHVwX2lycXMobWFwKTsKKwkvKiBJdCdzIG5vdyBzYWZlIHRvIHJlbW92ZSB0aGlzIHByb2Nlc3NvciBmcm9tIHRoZSBvbmxpbmUgbWFwICovCisJY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOworCXJldHVybiAwOworfQorCit2b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmU6IGlkbGUgdGFzayBpcyBmYWtpbmcgZGVhdGggaXRzZWxmLiAqLworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJLyogVGhleSBhY2sgdGhpcyBpbiBwbGF5X2RlYWQgYnkgc2V0dGluZyBDUFVfREVBRCAqLworCQlpZiAocGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPT0gQ1BVX0RFQUQpIHsKKwkJCXByaW50ayAoIkNQVSAlZCBpcyBub3cgb2ZmbGluZVxuIiwgY3B1KTsKKwkJCXJldHVybjsKKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwl9CisgCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7Cit9CisjZWxzZSAvKiAuLi4gIUNPTkZJR19IT1RQTFVHX0NQVSAqLworaW50IF9fY3B1X2Rpc2FibGUodm9pZCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwordm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKiBXZSBzYWlkICJubyIgaW4gX19jcHVfZGlzYWJsZSAqLworCUJVRygpOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCiBpbnQgX19kZXZpbml0IF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JLyogVGhpcyBvbmx5IHdvcmtzIGF0IGJvb3QgZm9yIHg4Ni4gIFNlZSAicmV3cml0ZSIgYWJvdmUuICovCi0JaWYgKGNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpIHsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlyZXR1cm4gLUVOT1NZUzsKLQl9Ci0KIAkvKiBJbiBjYXNlIG9uZSBkaWRuJ3QgY29tZSB1cCAqLwogCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJza2lwcGluZyBjcHUlZCwgZGlkbid0IGNvbWUgb25saW5lXG4iLCBjcHUpOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWxvY2FsX2lycV9lbmFibGUoKTsKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSA9IENQVV9VUF9QUkVQQVJFOwogCS8qIFVubGVhc2ggdGhlIENQVSEgKi8KIAljcHVfc2V0KGNwdSwgc21wX2NvbW1lbmNlZF9tYXNrKTsKIAl3aGlsZSAoIWNwdV9pc3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKSkKQEAgLTExNTYsMTAgKzEzNjksMTIgQEAKIAlzZXR1cF9pb2FwaWNfZGVzdCgpOwogI2VuZGlmCiAJemFwX2xvd19tYXBwaW5ncygpOworI2lmbmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAkvKgogCSAqIERpc2FibGUgZXhlY3V0YWJpbGl0eSBvZiB0aGUgU01QIHRyYW1wb2xpbmU6CiAJICovCiAJc2V0X2tlcm5lbF9leGVjKCh1bnNpZ25lZCBsb25nKXRyYW1wb2xpbmVfYmFzZSwgdHJhbXBvbGluZV9leGVjKTsKKyNlbmRpZgogfQogCiB2b2lkIF9faW5pdCBzbXBfaW50cl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IGQ0MDhhZmEuLjQ2ODUwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC0yODMsOSArMjgzLDE0IEBACiAJLmxvbmcgc3lzX21xX3RpbWVkcmVjZWl2ZQkvKiAyODAgKi8KIAkubG9uZyBzeXNfbXFfbm90aWZ5CiAJLmxvbmcgc3lzX21xX2dldHNldGF0dHIKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogcmVzZXJ2ZWQgZm9yIGtleGVjICovCisJLmxvbmcgc3lzX2tleGVjX2xvYWQKIAkubG9uZyBzeXNfd2FpdGlkCiAJLmxvbmcgc3lzX25pX3N5c2NhbGwJCS8qIDI4NSAqLyAvKiBhdmFpbGFibGUgKi8KIAkubG9uZyBzeXNfYWRkX2tleQogCS5sb25nIHN5c19yZXF1ZXN0X2tleQogCS5sb25nIHN5c19rZXljdGwKKwkubG9uZyBzeXNfaW9wcmlvX3NldAorCS5sb25nIHN5c19pb3ByaW9fZ2V0CQkvKiAyOTAgKi8KKwkubG9uZyBzeXNfaW5vdGlmeV9pbml0CisJLmxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoCisJLmxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2gKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3lzZW50ZXIuYwppbmRleCA5NjBkOGJkLi4wYmFkYTE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3N5c2VudGVyLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNlbnRlci5jCkBAIC0yMSwxMSArMjEsMTYgQEAKIAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzeXNlbnRlcl9lbnRyeSh2b2lkKTsKIAotdm9pZCBlbmFibGVfc2VwX2NwdSh2b2lkICppbmZvKQordm9pZCBlbmFibGVfc2VwX2NwdSh2b2lkKQogewogCWludCBjcHUgPSBnZXRfY3B1KCk7CiAJc3RydWN0IHRzc19zdHJ1Y3QgKnRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOwogCisJaWYgKCFib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfU0VQKSkgeworCQlwdXRfY3B1KCk7CisJCXJldHVybjsKKwl9CisKIAl0c3MtPnNzMSA9IF9fS0VSTkVMX0NTOwogCXRzcy0+ZXNwMSA9IHNpemVvZihzdHJ1Y3QgdHNzX3N0cnVjdCkgKyAodW5zaWduZWQgbG9uZykgdHNzOwogCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCBfX0tFUk5FTF9DUywgMCk7CkBAIC00MSw3ICs0Niw3IEBACiBleHRlcm4gY29uc3QgY2hhciB2c3lzY2FsbF9pbnQ4MF9zdGFydCwgdnN5c2NhbGxfaW50ODBfZW5kOwogZXh0ZXJuIGNvbnN0IGNoYXIgdnN5c2NhbGxfc3lzZW50ZXJfc3RhcnQsIHZzeXNjYWxsX3N5c2VudGVyX2VuZDsKIAotc3RhdGljIGludCBfX2luaXQgc3lzZW50ZXJfc2V0dXAodm9pZCkKK2ludCBfX2luaXQgc3lzZW50ZXJfc2V0dXAodm9pZCkKIHsKIAl2b2lkICpwYWdlID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CiAKQEAgLTU4LDggKzYzLDUgQEAKIAkgICAgICAgJnZzeXNjYWxsX3N5c2VudGVyX3N0YXJ0LAogCSAgICAgICAmdnN5c2NhbGxfc3lzZW50ZXJfZW5kIC0gJnZzeXNjYWxsX3N5c2VudGVyX3N0YXJ0KTsKIAotCW9uX2VhY2hfY3B1KGVuYWJsZV9zZXBfY3B1LCBOVUxMLCAxLCAxKTsKIAlyZXR1cm4gMDsKIH0KLQotX19pbml0Y2FsbChzeXNlbnRlcl9zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCmluZGV4IGU2OGQ5ZmQuLjBlZTlkZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC02OCw3ICs2OCw4IEBACiAKICNpbmNsdWRlICJpb19wb3J0cy5oIgogCi1leHRlcm4gc3BpbmxvY2tfdCBpODI1OUFfbG9jazsKKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KKwogaW50IHBpdF9sYXRjaF9idWdneTsgICAgICAgICAgICAgIC8qIGV4dGVybiAqLwogCiAjaW5jbHVkZSAiZG9fdGltZXIuaCIKQEAgLTg1LDEwICs4NiwxMiBAQAogREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKIEVYUE9SVF9TWU1CT0wocnRjX2xvY2spOwogCisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CisKIERFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKIEVYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CiAKLXN0cnVjdCB0aW1lcl9vcHRzICpjdXJfdGltZXIgPSAmdGltZXJfbm9uZTsKK3N0cnVjdCB0aW1lcl9vcHRzICpjdXJfdGltZXIgX19yZWFkX21vc3RseSA9ICZ0aW1lcl9ub25lOwogCiAvKgogICogVGhpcyBpcyBhIHNwZWNpYWwgbG9jayB0aGF0IGlzIG93bmVkIGJ5IHRoZSBDUFUgYW5kIGhvbGRzIHRoZSBpbmRleApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKaW5kZXggMTBhMGNiYi4uNjU4YzA2MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RpbWVfaHBldC5jCkBAIC01MCw3ICs1MCw3IEBACiAgKiBjb21wYXJhdG9yIHZhbHVlIGFuZCBjb250aW51ZS4gTmV4dCB0aWNrIGNhbiBiZSBjYXVnaHQgYnkgY2hlY2tpbmcKICAqIGZvciBhIGNoYW5nZSBpbiB0aGUgY29tcGFyYXRvciB2YWx1ZS4gVXNlZCBpbiBhcGljLmMuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB3YWl0X2hwZXRfdGljayh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHdhaXRfaHBldF90aWNrKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHN0YXJ0X2NtcF92YWwsIGVuZF9jbXBfdmFsOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy9jb21tb24uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jCmluZGV4IDM3MzUzYmQuLjgxNjNmZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL2NvbW1vbi5jCkBAIC04Niw3ICs4Niw3IEBACiAjZGVmaW5lIENBTElCUkFURV9DTlRfSFBFVCAJKDUgKiBocGV0X3RpY2spCiAjZGVmaW5lIENBTElCUkFURV9USU1FX0hQRVQgCSg1ICogS0VSTkVMX1RJQ0tfVVNFQykKIAotdW5zaWduZWQgbG9uZyBfX2luaXQgY2FsaWJyYXRlX3RzY19ocGV0KHVuc2lnbmVkIGxvbmcgKnRzY19ocGV0X3F1b3RpZW50X3B0cikKK3Vuc2lnbmVkIGxvbmcgX19kZXZpbml0IGNhbGlicmF0ZV90c2NfaHBldCh1bnNpZ25lZCBsb25nICp0c2NfaHBldF9xdW90aWVudF9wdHIpCiB7CiAJdW5zaWduZWQgbG9uZyB0c2Nfc3RhcnRsb3csIHRzY19zdGFydGhpZ2g7CiAJdW5zaWduZWQgbG9uZyB0c2NfZW5kbG93LCB0c2NfZW5kaGlnaDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2N5Y2xvbmUuYwppbmRleCBmNmYxMjA2Li4xMzg5MmE2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9jeWNsb25lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfY3ljbG9uZS5jCkBAIC0xNyw5ICsxNyw5IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSAiaW9fcG9ydHMuaCIKKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KIAotZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKKyNpbmNsdWRlICJpb19wb3J0cy5oIgogCiAvKiBOdW1iZXIgb2YgdXNlY3MgdGhhdCB0aGUgbGFzdCBpbnRlcnJ1cHQgd2FzIGRlbGF5ZWQgKi8KIHN0YXRpYyBpbnQgZGVsYXlfYXRfbGFzdF9pbnRlcnJ1cHQ7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMgYi9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl9ocGV0LmMKaW5kZXggZDc2NmUwOS4uZWY4ZGFjNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX2hwZXQuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgIm1hY2hfdGltZXIuaCIKICNpbmNsdWRlIDxhc20vaHBldC5oPgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3VzZWNfcXVvdGllbnQ7CS8qIGNvbnZlcnQgaHBldCBjbGtzIHRvIHVzZWMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgaHBldF91c2VjX3F1b3RpZW50OwkvKiBjb252ZXJ0IGhwZXQgY2xrcyB0byB1c2VjICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB0c2NfaHBldF9xdW90aWVudDsJCS8qIGNvbnZlcnQgdHNjIHRvIGhwZXQgY2xrcyAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9sYXN0OyAJLyogaHBldCBjb3VudGVyIHZhbHVlIGF0IGxhc3QgdGljayovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X3RzY19sb3c7CS8qIGxzYiAzMiBiaXRzIG9mIFRpbWUgU3RhbXAgQ291bnRlciAqLwpAQCAtMTgwLDcgKzE4MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiB0c2MgdGltZXJfb3B0cyBzdHJ1Y3QgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXJfb3B0cyB0aW1lcl9ocGV0ID0geworc3RhdGljIHN0cnVjdCB0aW1lcl9vcHRzIHRpbWVyX2hwZXQgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSA9IAkJImhwZXQiLAogCS5tYXJrX29mZnNldCA9CQltYXJrX29mZnNldF9ocGV0LAogCS5nZXRfb2Zmc2V0ID0JCWdldF9vZmZzZXRfaHBldCwKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcGl0LmMKaW5kZXggOTY3ZDU0NS4uMDZkZTAzNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BpdC5jCkBAIC0xNSw5ICsxNSw4IEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAKLWV4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOwotZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKICNpbmNsdWRlICJkb190aW1lci5oIgogI2luY2x1ZGUgImlvX3BvcnRzLmgiCiAKQEAgLTE2Niw3ICsxNjUsNiBAQAogCiB2b2lkIHNldHVwX3BpdF90aW1lcih2b2lkKQogewotCWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWVycy90aW1lcl90c2MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jCmluZGV4IDU0YzM2YjEuLjhmNGU0ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3RzYy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAibWFjaF90aW1lci5oIgogCiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KIAogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3VzZWNfcXVvdGllbnQ7CkBAIC0zMyw5ICszNCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpOwogCi1pbnQgdHNjX2Rpc2FibGUgX19pbml0ZGF0YSA9IDA7Ci0KLWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CitpbnQgdHNjX2Rpc2FibGUgX19kZXZpbml0ZGF0YSA9IDA7CiAKIHN0YXRpYyBpbnQgdXNlX3RzYzsKIC8qIE51bWJlciBvZiB1c2VjcyB0aGF0IHRoZSBsYXN0IGludGVycnVwdCB3YXMgZGVsYXllZCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCmluZGV4IGU0ZDRlMjEuLmE2MWYzM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKICNpZmRlZiBDT05GSUdfRUlTQQogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtMjM0LDIyICsyMzUsMjIgQEAKIAkgKiB0aW1lIG9mIHRoZSBmYXVsdC4uCiAJICovCiAJaWYgKGluX2tlcm5lbCkgewotCQl1OCAqZWlwOworCQl1OCBfX3VzZXIgKmVpcDsKIAogCQlwcmludGsoIlxuU3RhY2s6ICIpOwogCQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nKillc3ApOwogCiAJCXByaW50aygiQ29kZTogIik7CiAKLQkJZWlwID0gKHU4ICopcmVncy0+ZWlwIC0gNDM7CisJCWVpcCA9ICh1OCBfX3VzZXIgKilyZWdzLT5laXAgLSA0MzsKIAkJZm9yIChpID0gMDsgaSA8IDY0OyBpKyssIGVpcCsrKSB7CiAJCQl1bnNpZ25lZCBjaGFyIGM7CiAKLQkJCWlmIChlaXAgPCAodTggKilQQUdFX09GRlNFVCB8fCBfX2dldF91c2VyKGMsIGVpcCkpIHsKKwkJCWlmIChlaXAgPCAodTggX191c2VyICopUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBlaXApKSB7CiAJCQkJcHJpbnRrKCIgQmFkIEVJUCB2YWx1ZS4iKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChlaXAgPT0gKHU4ICopcmVncy0+ZWlwKQorCQkJaWYgKGVpcCA9PSAodTggX191c2VyICopcmVncy0+ZWlwKQogCQkJCXByaW50aygiPCUwMng+ICIsIGMpOwogCQkJZWxzZQogCQkJCXByaW50aygiJTAyeCAiLCBjKTsKQEAgLTI3MywxMyArMjc0LDEzIEBACiAKIAlpZiAoZWlwIDwgUEFHRV9PRkZTRVQpCiAJCWdvdG8gbm9fYnVnOwotCWlmIChfX2dldF91c2VyKHVkMiwgKHVuc2lnbmVkIHNob3J0ICopZWlwKSkKKwlpZiAoX19nZXRfdXNlcih1ZDIsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKillaXApKQogCQlnb3RvIG5vX2J1ZzsKIAlpZiAodWQyICE9IDB4MGIwZikKIAkJZ290byBub19idWc7Ci0JaWYgKF9fZ2V0X3VzZXIobGluZSwgKHVuc2lnbmVkIHNob3J0ICopKGVpcCArIDIpKSkKKwlpZiAoX19nZXRfdXNlcihsaW5lLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopKGVpcCArIDIpKSkKIAkJZ290byBidWc7Ci0JaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiopKGVpcCArIDQpKSB8fAorCWlmIChfX2dldF91c2VyKGZpbGUsIChjaGFyICogX191c2VyICopKGVpcCArIDQpKSB8fAogCQkodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKIAkJZmlsZSA9ICI8YmFkIGZpbGVuYW1lPiI7CiAKQEAgLTI5NCw2ICsyOTUsOSBAQAogCXByaW50aygiS2VybmVsIEJVR1xuIik7CiB9CiAKKy8qIFRoaXMgaXMgZ29uZSB0aHJvdWdoIHdoZW4gc29tZXRoaW5nIGluIHRoZSBrZXJuZWwKKyAqIGhhcyBkb25lIHNvbWV0aGluZyBiYWQgYW5kIGlzIGFib3V0IHRvIGJlIHRlcm1pbmF0ZWQuCisqLwogdm9pZCBkaWUoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycikKIHsKIAlzdGF0aWMgc3RydWN0IHsKQEAgLTM0MSw2ICszNDUsMTAgQEAKIAlidXN0X3NwaW5sb2NrcygwKTsKIAlkaWUubG9ja19vd25lciA9IC0xOwogCXNwaW5fdW5sb2NrX2lycSgmZGllLmxvY2spOworCisJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSkKKwkJY3Jhc2hfa2V4ZWMocmVncyk7CisKIAlpZiAoaW5faW50ZXJydXB0KCkpCiAJCXBhbmljKCJGYXRhbCBleGNlcHRpb24gaW4gaW50ZXJydXB0Iik7CiAKQEAgLTM2MSw2ICszNjksMTAgQEAKIHN0YXRpYyB2b2lkIGRvX3RyYXAoaW50IHRyYXBuciwgaW50IHNpZ25yLCBjaGFyICpzdHIsIGludCB2bTg2LAogCQkJICAgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUsIHNpZ2luZm9fdCAqaW5mbykKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IHRyYXBucjsKKwogCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKSB7CiAJCWlmICh2bTg2KQogCQkJZ290byB2bTg2X3RyYXA7CkBAIC0zNzEsOSArMzgzLDYgQEAKIAkJZ290byBrZXJuZWxfdHJhcDsKIAogCXRyYXBfc2lnbmFsOiB7Ci0JCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKLQkJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7Ci0JCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7CiAJCWlmIChpbmZvKQogCQkJZm9yY2Vfc2lnX2luZm8oc2lnbnIsIGluZm8sIHRzayk7CiAJCWVsc2UKQEAgLTQ4Niw2ICs0OTUsOSBAQAogCX0KIAlwdXRfY3B1KCk7CiAKKwljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAxMzsKKwogCWlmIChyZWdzLT5lZmxhZ3MgJiBWTV9NQVNLKQogCQlnb3RvIGdwX2luX3ZtODY7CiAKQEAgLTU3MCw2ICs1ODIsMTUgQEAKIAljb25zb2xlX3NpbGVudCgpOwogCXNwaW5fdW5sb2NrKCZubWlfcHJpbnRfbG9jayk7CiAJYnVzdF9zcGlubG9ja3MoMCk7CisKKwkvKiBJZiB3ZSBhcmUgaW4ga2VybmVsIHdlIGFyZSBwcm9iYWJseSBuZXN0ZWQgdXAgcHJldHR5IGJhZAorCSAqIGFuZCBtaWdodCBhc3dlbGwgZ2V0IG91dCBub3cgd2hpbGUgd2Ugc3RpbGwgY2FuLgorCSovCisJaWYgKCF1c2VyX21vZGUocmVncykpIHsKKwkJY3VycmVudC0+dGhyZWFkLnRyYXBfbm8gPSAyOworCQljcmFzaF9rZXhlYyhyZWdzKTsKKwl9CisKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCkBAIC02MjUsNiArNjQ2LDE0IEBACiAJbm1pX2VudGVyKCk7CiAKIAljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlpZiAoIWNwdV9vbmxpbmUoY3B1KSkgeworCQlubWlfZXhpdCgpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKIAkrK25taV9jb3VudChjcHUpOwogCiAJaWYgKCFubWlfY2FsbGJhY2socmVncywgY3B1KSkKQEAgLTg3Miw5ICs5MDEsOSBAQAogCQkJCQkgIGVycm9yX2NvZGUpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWRpZV9pZl9rZXJuZWwoImNhY2hlIGZsdXNoIGRlbmllZCIsIHJlZ3MsIGVycm9yX2NvZGUpOwogCQljdXJyZW50LT50aHJlYWQudHJhcF9ubyA9IDE5OwogCQljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJCWRpZV9pZl9rZXJuZWwoImNhY2hlIGZsdXNoIGRlbmllZCIsIHJlZ3MsIGVycm9yX2NvZGUpOwogCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGUwNTEyY2MuLjc2MTk3MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTIsMjAgKzIsMjMgQEAKICAqIFdyaXR0ZW4gYnkgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+OwogICovCiAKKyNkZWZpbmUgTE9BRF9PRkZTRVQgX19QQUdFX09GRlNFVAorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiBPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCiBPVVRQVVRfQVJDSChpMzg2KQotRU5UUlkoc3RhcnR1cF8zMikKK0VOVFJZKHBoeXNfc3RhcnR1cF8zMikKIGppZmZpZXMgPSBqaWZmaWVzXzY0OwogU0VDVElPTlMKIHsKLSAgLiA9IF9fUEFHRV9PRkZTRVQgKyAweDEwMDAwMDsKKyAgLiA9IF9fS0VSTkVMX1NUQVJUOworICBwaHlzX3N0YXJ0dXBfMzIgPSBzdGFydHVwXzMyIC0gTE9BRF9PRkZTRVQ7CiAgIC8qIHJlYWQtb25seSAqLwogICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KLSAgLnRleHQgOiB7CisgIC50ZXh0IDogQVQoQUREUigudGV4dCkgLSBMT0FEX09GRlNFVCkgewogCSooLnRleHQpCiAJU0NIRURfVEVYVAogCUxPQ0tfVEVYVApAQCAtMjcsNDkgKzMwLDU4IEBACiAKICAgLiA9IEFMSUdOKDE2KTsJCS8qIEV4Y2VwdGlvbiB0YWJsZSAqLwogICBfX3N0YXJ0X19fZXhfdGFibGUgPSAuOwotICBfX2V4X3RhYmxlIDogeyAqKF9fZXhfdGFibGUpIH0KKyAgX19leF90YWJsZSA6IEFUKEFERFIoX19leF90YWJsZSkgLSBMT0FEX09GRlNFVCkgeyAqKF9fZXhfdGFibGUpIH0KICAgX19zdG9wX19fZXhfdGFibGUgPSAuOwogCiAgIFJPREFUQQogCiAgIC8qIHdyaXRlYWJsZSAqLwotICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCisgIC5kYXRhIDogQVQoQUREUiguZGF0YSkgLSBMT0FEX09GRlNFVCkgewkvKiBEYXRhICovCiAJKiguZGF0YSkKIAlDT05TVFJVQ1RPUlMKIAl9CiAKICAgLiA9IEFMSUdOKDQwOTYpOwogICBfX25vc2F2ZV9iZWdpbiA9IC47Ci0gIC5kYXRhX25vc2F2ZSA6IHsgKiguZGF0YS5ub3NhdmUpIH0KKyAgLmRhdGFfbm9zYXZlIDogQVQoQUREUiguZGF0YV9ub3NhdmUpIC0gTE9BRF9PRkZTRVQpIHsgKiguZGF0YS5ub3NhdmUpIH0KICAgLiA9IEFMSUdOKDQwOTYpOwogICBfX25vc2F2ZV9lbmQgPSAuOwogCiAgIC4gPSBBTElHTig0MDk2KTsKLSAgLmRhdGEucGFnZV9hbGlnbmVkIDogeyAqKC5kYXRhLmlkdCkgfQorICAuZGF0YS5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgeworCSooLmRhdGEuaWR0KQorICB9CiAKICAgLiA9IEFMSUdOKDMyKTsKLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7ICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpIH0KKyAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKKyAgfQogCisgIC8qIHJhcmVseSBjaGFuZ2VkIGRhdGEgbGlrZSBjcHUgbWFwcyAqLworICAuID0gQUxJR04oMzIpOworICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsgKiguZGF0YS5yZWFkX21vc3RseSkgfQogICBfZWRhdGEgPSAuOwkJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIAogICAuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkvKiBpbml0X3Rhc2sgKi8KLSAgLmRhdGEuaW5pdF90YXNrIDogeyAqKC5kYXRhLmluaXRfdGFzaykgfQorICAuZGF0YS5pbml0X3Rhc2sgOiBBVChBRERSKC5kYXRhLmluaXRfdGFzaykgLSBMT0FEX09GRlNFVCkgeworCSooLmRhdGEuaW5pdF90YXNrKQorICB9CiAKICAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0ICovCiAgIC4gPSBBTElHTig0MDk2KTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwogICBfX2luaXRfYmVnaW4gPSAuOwotICAuaW5pdC50ZXh0IDogeyAKKyAgLmluaXQudGV4dCA6IEFUKEFERFIoLmluaXQudGV4dCkgLSBMT0FEX09GRlNFVCkgewogCV9zaW5pdHRleHQgPSAuOwogCSooLmluaXQudGV4dCkKIAlfZWluaXR0ZXh0ID0gLjsKICAgfQotICAuaW5pdC5kYXRhIDogeyAqKC5pbml0LmRhdGEpIH0KKyAgLmluaXQuZGF0YSA6IEFUKEFERFIoLmluaXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgeyAqKC5pbml0LmRhdGEpIH0KICAgLiA9IEFMSUdOKDE2KTsKICAgX19zZXR1cF9zdGFydCA9IC47Ci0gIC5pbml0LnNldHVwIDogeyAqKC5pbml0LnNldHVwKSB9CisgIC5pbml0LnNldHVwIDogQVQoQUREUiguaW5pdC5zZXR1cCkgLSBMT0FEX09GRlNFVCkgeyAqKC5pbml0LnNldHVwKSB9CiAgIF9fc2V0dXBfZW5kID0gLjsKICAgX19pbml0Y2FsbF9zdGFydCA9IC47Ci0gIC5pbml0Y2FsbC5pbml0IDogeworICAuaW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmluaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKIAkqKC5pbml0Y2FsbDEuaW5pdCkgCiAJKiguaW5pdGNhbGwyLmluaXQpIAogCSooLmluaXRjYWxsMy5pbml0KSAKQEAgLTgwLDMzICs5Miw0MSBAQAogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotICAuY29uX2luaXRjYWxsLmluaXQgOiB7ICooLmNvbl9pbml0Y2FsbC5pbml0KSB9CisgIC5jb25faW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmNvbl9pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7CisJKiguY29uX2luaXRjYWxsLmluaXQpCisgIH0KICAgX19jb25faW5pdGNhbGxfZW5kID0gLjsKICAgU0VDVVJJVFlfSU5JVAogICAuID0gQUxJR04oNCk7CiAgIF9fYWx0X2luc3RydWN0aW9ucyA9IC47Ci0gIC5hbHRpbnN0cnVjdGlvbnMgOiB7ICooLmFsdGluc3RydWN0aW9ucykgfSAKKyAgLmFsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLmFsdGluc3RydWN0aW9ucykgLSBMT0FEX09GRlNFVCkgeworCSooLmFsdGluc3RydWN0aW9ucykKKyAgfQogICBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsgCi0gLmFsdGluc3RyX3JlcGxhY2VtZW50IDogeyAqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgfSAKKyAgLmFsdGluc3RyX3JlcGxhY2VtZW50IDogQVQoQUREUiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpIC0gTE9BRF9PRkZTRVQpIHsKKwkqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkKKyAgfQogICAvKiAuZXhpdC50ZXh0IGlzIGRpc2NhcmQgYXQgcnVudGltZSwgbm90IGxpbmsgdGltZSwgdG8gZGVhbCB3aXRoIHJlZmVyZW5jZXMKICAgICAgZnJvbSAuYWx0aW5zdHJ1Y3Rpb25zIGFuZCAuZWhfZnJhbWUgKi8KLSAgLmV4aXQudGV4dCA6IHsgKiguZXhpdC50ZXh0KSB9Ci0gIC5leGl0LmRhdGEgOiB7ICooLmV4aXQuZGF0YSkgfQorICAuZXhpdC50ZXh0IDogQVQoQUREUiguZXhpdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC5kYXRhIDogQVQoQUREUiguZXhpdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7ICooLmV4aXQuZGF0YSkgfQogICAuID0gQUxJR04oNDA5Nik7CiAgIF9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLSAgLmluaXQucmFtZnMgOiB7ICooLmluaXQucmFtZnMpIH0KKyAgLmluaXQucmFtZnMgOiBBVChBRERSKC5pbml0LnJhbWZzKSAtIExPQURfT0ZGU0VUKSB7ICooLmluaXQucmFtZnMpIH0KICAgX19pbml0cmFtZnNfZW5kID0gLjsKICAgLiA9IEFMSUdOKDMyKTsKICAgX19wZXJfY3B1X3N0YXJ0ID0gLjsKLSAgLmRhdGEucGVyY3B1ICA6IHsgKiguZGF0YS5wZXJjcHUpIH0KKyAgLmRhdGEucGVyY3B1ICA6IEFUKEFERFIoLmRhdGEucGVyY3B1KSAtIExPQURfT0ZGU0VUKSB7ICooLmRhdGEucGVyY3B1KSB9CiAgIF9fcGVyX2NwdV9lbmQgPSAuOwogICAuID0gQUxJR04oNDA5Nik7CiAgIF9faW5pdF9lbmQgPSAuOwogICAvKiBmcmVlZCBhZnRlciBpbml0IGVuZHMgaGVyZSAqLwogCQogICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcyA6IHsKKyAgLmJzcy5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5ic3MucGFnZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguYnNzLnBhZ2VfYWxpZ25lZCkKKyAgfQorICAuYnNzIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguYnNzKQogICB9CiAgIC4gPSBBTElHTig0KTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwppbmRleCAwYWEwOGVhLi5lNWExYTgzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCkBAIC0xMCw2ICsxMCwxNCBAQAogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorI2RlZmluZSBERUZBVUxUX1NFTkRfSVBJCSgxKQorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9TRU5EX0lQSQkoMCkKKyNlbmRpZgorCitpbnQgbm9fYnJvYWRjYXN0PURFRkFVTFRfU0VORF9JUEk7CisKIC8qKgogICogcHJlX2ludHJfaW5pdF9ob29rIC0gaW5pdGlhbGlzYXRpb24gcHJpb3IgdG8gc2V0dGluZyB1cCBpbnRlcnJ1cHQgdmVjdG9ycwogICoKQEAgLTEwNCwzICsxMTIsMjIgQEAKIAlwcmludGsoIk5NSSBnZW5lcmF0ZWQgZnJvbSB1bmtub3duIHNvdXJjZSFcbiIpOwogfQogI2VuZGlmCisKK3N0YXRpYyBfX2luaXQgaW50IG5vX2lwaV9icm9hZGNhc3QoY2hhciAqc3RyKQoreworCWdldF9vcHRpb24oJnN0ciwgJm5vX2Jyb2FkY2FzdCk7CisJcHJpbnRrICgiVXNpbmcgJXMgbW9kZVxuIiwgbm9fYnJvYWRjYXN0ID8gIk5vIElQSSBCcm9hZGNhc3QiIDoKKwkJCQkJCQkJCQkJIklQSSBCcm9hZGNhc3QiKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm9faXBpX2Jyb2FkY2FzdCIsIG5vX2lwaV9icm9hZGNhc3QpOworCitzdGF0aWMgaW50IF9faW5pdCBwcmludF9pcGlfbW9kZSh2b2lkKQoreworCXByaW50ayAoIlVzaW5nIElQSSAlcyBtb2RlXG4iLCBub19icm9hZGNhc3QgPyAiTm8tU2hvcnRjdXQiIDoKKwkJCQkJCQkJCQkJIlNob3J0Y3V0Iik7CisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwocHJpbnRfaXBpX21vZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC90b3BvbG9neS5jIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC90b3BvbG9neS5jCmluZGV4IDViM2U4ODEuLjIzMzk1ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvdG9wb2xvZ3kuYworKysgYi9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3RvcG9sb2d5LmMKQEAgLTczLDEyICs3MywxMSBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7Ci0JCWlmIChub2RlX29ubGluZShpKSkKLQkJCWFyY2hfcmVnaXN0ZXJfbm9kZShpKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKLQkJaWYgKGNwdV9wb3NzaWJsZShpKSkgYXJjaF9yZWdpc3Rlcl9jcHUoaSk7CisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKKwkJYXJjaF9yZWdpc3Rlcl9ub2RlKGkpOworCisJZm9yX2VhY2hfY3B1KGkpCisJCWFyY2hfcmVnaXN0ZXJfY3B1KGkpOwogCXJldHVybiAwOwogfQogCkBAIC04OCw4ICs4Nyw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKQotCQlpZiAoY3B1X3Bvc3NpYmxlKGkpKSBhcmNoX3JlZ2lzdGVyX2NwdShpKTsKKwlmb3JfZWFjaF9jcHUoaSkKKwkJYXJjaF9yZWdpc3Rlcl9jcHUoaSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL21wcGFyc2UuYyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL21wcGFyc2UuYwppbmRleCA1YTIyMDgyLi41ZjNkN2U2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12aXN3cy9tcHBhcnNlLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtdmlzd3MvbXBwYXJzZS5jCkBAIC0yMyw3ICsyMyw2IEBACiAKIC8qIFByb2Nlc3NvciB0aGF0IGlzIGRvaW5nIHRoZSBib290IHVwICovCiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gLTFVOwotdW5zaWduZWQgaW50IGJvb3RfY3B1X2xvZ2ljYWxfYXBpY2lkID0gLTFVOwogCiAvKiBCaXRtYXNrIG9mIHBoeXNpY2FsbHkgZXhpc3RpbmcgQ1BVcyAqLwogcGh5c2lkX21hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcDsKQEAgLTUyLDEwICs1MSw4IEBACiAJCShtLT5tcGNfY3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKSA+PiA0LAogCQltLT5tcGNfYXBpY3Zlcik7CiAKLQlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgeworCWlmIChtLT5tcGNfY3B1ZmxhZyAmIENQVV9CT09UUFJPQ0VTU09SKQogCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBtLT5tcGNfYXBpY2lkOwotCQlib290X2NwdV9sb2dpY2FsX2FwaWNpZCA9IGxvZ2ljYWxfYXBpY2lkOwotCX0KIAogCXZlciA9IG0tPm1wY19hcGljdmVyOwogCWlmICgodmVyID49IDB4MTQgJiYgbS0+bXBjX2FwaWNpZCA+PSAweGZmKSB8fCBtLT5tcGNfYXBpY2lkID49IDB4ZikgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci92b3lhZ2VyX2Jhc2ljLmMgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYwppbmRleCA2MDJhZWEyLi4zZTQzOWNlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYworKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3ZveWFnZXJfYmFzaWMuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoX2hvb2tzLmg+CisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAKIC8qCiAgKiBQb3dlciBvZmYgZnVuY3Rpb24sIGlmIGFueQpAQCAtMTgyLDcgKzE4Myw2IEBACiAJCSAqIGFuZCBzd2lmdGx5IGludHJvZHVjZSBpdCB0byBzb21ldGhpbmcgc2hhcnAgYW5kCiAJCSAqIHBvaW50eS4gICovCiAJCV9fdTE2IHZhbDsKLQkJZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAogCQlzcGluX2xvY2soJmk4MjUzX2xvY2spOwogCQkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYyBiL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYwppbmRleCBmNDI5Yzg3Li5iMzU4ZjA3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKKysrIGIvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorCiAjaW5jbHVkZSA8YXNtL2U4MjAuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vbW16b25lLmg+CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZmF1bHQuYyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCmluZGV4IGE1MDkyMzcuLjhlOTAzMzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogCQlpZiAoaW5zdHIgPiBsaW1pdCkKIAkJCWJyZWFrOwotCQlpZiAoX19nZXRfdXNlcihvcGNvZGUsICh1bnNpZ25lZCBjaGFyICopIGluc3RyKSkKKwkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgaW5zdHIpKQogCQkJYnJlYWs7IAogCiAJCWluc3RyX2hpID0gb3Bjb2RlICYgMHhmMDsgCkBAIC0xNzMsNyArMTczLDcgQEAKIAkJCXNjYW5fbW9yZSA9IDA7CiAJCQlpZiAoaW5zdHIgPiBsaW1pdCkKIAkJCQlicmVhazsKLQkJCWlmIChfX2dldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGNoYXIgKikgaW5zdHIpKSAKKwkJCWlmIChfX2dldF91c2VyKG9wY29kZSwgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGluc3RyKSkKIAkJCQlicmVhazsKIAkJCXByZWZldGNoID0gKGluc3RyX2xvID09IDB4RikgJiYKIAkJCQkob3Bjb2RlID09IDB4MEQgfHwgb3Bjb2RlID09IDB4MTgpOwpAQCAtNDYzLDYgKzQ2Myw5IEBACiAJCXByaW50ayhLRVJOX0FMRVJUICIqcHRlID0gJTA4bHhcbiIsIHBhZ2UpOwogCX0KICNlbmRpZgorCXRzay0+dGhyZWFkLmNyMiA9IGFkZHJlc3M7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IDE0OworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwogCWRpZSgiT29wcyIsIHJlZ3MsIGVycm9yX2NvZGUpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCWRvX2V4aXQoU0lHS0lMTCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vaGlnaG1lbS5jIGIvYXJjaC9pMzg2L21tL2hpZ2htZW0uYwppbmRleCA0YjdhYWY5Li5iNmViNGRjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vaGlnaG1lbS5jCisrKyBiL2FyY2gvaTM4Ni9tbS9oaWdobWVtLmMKQEAgLTc1LDYgKzc1LDI0IEBACiAJcHJlZW1wdF9jaGVja19yZXNjaGVkKCk7CiB9CiAKKy8qIFRoaXMgaXMgdGhlIHNhbWUgYXMga21hcF9hdG9taWMoKSBidXQgY2FuIG1hcCBtZW1vcnkgdGhhdCBkb2Vzbid0CisgKiBoYXZlIGEgc3RydWN0IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIGl0LgorICovCit2b2lkICprbWFwX2F0b21pY19wZm4odW5zaWduZWQgbG9uZyBwZm4sIGVudW0ga21fdHlwZSB0eXBlKQoreworCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeDsKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCWlkeCA9IHR5cGUgKyBLTV9UWVBFX05SKnNtcF9wcm9jZXNzb3JfaWQoKTsKKwl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOworCXNldF9wdGUoa21hcF9wdGUtaWR4LCBwZm5fcHRlKHBmbiwga21hcF9wcm90KSk7CisJX19mbHVzaF90bGJfb25lKHZhZGRyKTsKKworCXJldHVybiAodm9pZCopIHZhZGRyOworfQorCiBzdHJ1Y3QgcGFnZSAqa21hcF9hdG9taWNfdG9fcGFnZSh2b2lkICpwdHIpCiB7CiAJdW5zaWduZWQgbG9uZyBpZHgsIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpcHRyOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKaW5kZXggMzY3MmUyZS4uMTIyMTZiNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2luaXQuYworKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC0zNTIsNyArMzUyLDcgQEAKICNlbmRpZgogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfUE1fRElTSykgfHwgZGVmaW5lZChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkKKyNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAogLyoKICAqIFN3YXAgc3VzcGVuZCAmIGZyaWVuZHMgbmVlZCB0aGlzIGZvciByZXN1bWUgYmVjYXVzZSB0aGluZ3MgbGlrZSB0aGUgaW50ZWwtYWdwCiAgKiBkcml2ZXIgbWlnaHQgaGF2ZSBzcGxpdCB1cCBhIGtlcm5lbCA0TUIgbWFwcGluZy4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMgYi9hcmNoL2kzODYvbW0vaW9yZW1hcC5jCmluZGV4IGQzOTNlZWYuLmYzNzliOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9pMzg2L21tL2lvcmVtYXAuYwpAQCAtMjI4LDcgKzIyOCw4IEBACiB2b2lkIGlvdW5tYXAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKnA7Ci0JaWYgKCh2b2lkIF9fZm9yY2UgKikgYWRkciA8PSBoaWdoX21lbW9yeSkgCisKKwlpZiAoKHZvaWQgX19mb3JjZSAqKWFkZHIgPD0gaGlnaF9tZW1vcnkpCiAJCXJldHVybjsKIAogCS8qCkBAIC0yNDEsOSArMjQyLDEwIEBACiAJCXJldHVybjsKIAogCXdyaXRlX2xvY2soJnZtbGlzdF9sb2NrKTsKLQlwID0gX19yZW1vdmVfdm1fYXJlYSgodm9pZCAqKSAoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSkgYWRkcikpOworCXAgPSBfX3JlbW92ZV92bV9hcmVhKCh2b2lkICopKFBBR0VfTUFTSyAmICh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcikpOwogCWlmICghcCkgeyAKLQkJcHJpbnRrKCJpb3VubWFwOiBiYWQgYWRkcmVzcyAlcFxuIiwgYWRkcik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImlvdW5tYXA6IGJhZCBhZGRyZXNzICVwXG4iLCBhZGRyKTsKKwkJZHVtcF9zdGFjaygpOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vcGd0YWJsZS5jIGIvYXJjaC9pMzg2L21tL3BndGFibGUuYwppbmRleCAyNzBjNTlmLi5iZDJmN2FmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKQEAgLTMyLDkgKzMyLDkgQEAKIAl1bnNpZ25lZCBsb25nIGk7CiAJc3RydWN0IHBhZ2Vfc3RhdGUgcHM7CiAKLQlwcmludGsoIk1lbS1pbmZvOlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtLWluZm86XG4iKTsKIAlzaG93X2ZyZWVfYXJlYXMoKTsKLQlwcmludGsoIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLCBucl9zd2FwX3BhZ2VzPDwoUEFHRV9TSElGVC0xMCkpOworCXByaW50ayhLRVJOX0lORk8gIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLCBucl9zd2FwX3BhZ2VzPDwoUEFHRV9TSElGVC0xMCkpOwogCWZvcl9lYWNoX3BnZGF0KHBnZGF0KSB7CiAJCWZvciAoaSA9IDA7IGkgPCBwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzOyArK2kpIHsKIAkJCXBhZ2UgPSBwZ2RhdF9wYWdlX25yKHBnZGF0LCBpKTsKQEAgLTQ5LDE4ICs0OSwxOCBAQAogCQkJCXNoYXJlZCArPSBwYWdlX2NvdW50KHBhZ2UpIC0gMTsKIAkJfQogCX0KLQlwcmludGsoIiVkIHBhZ2VzIG9mIFJBTVxuIiwgdG90YWwpOwotCXByaW50aygiJWQgcGFnZXMgb2YgSElHSE1FTVxuIixoaWdobWVtKTsKLQlwcmludGsoIiVkIHJlc2VydmVkIHBhZ2VzXG4iLHJlc2VydmVkKTsKLQlwcmludGsoIiVkIHBhZ2VzIHNoYXJlZFxuIixzaGFyZWQpOwotCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBvZiBISUdITUVNXG4iLCBoaWdobWVtKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCByZXNlcnZlZCBwYWdlc1xuIiwgcmVzZXJ2ZWQpOworCXByaW50ayhLRVJOX0lORk8gIiVkIHBhZ2VzIHNoYXJlZFxuIiwgc2hhcmVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKIAogCWdldF9wYWdlX3N0YXRlKCZwcyk7Ci0JcHJpbnRrKCIlbHUgcGFnZXMgZGlydHlcbiIsIHBzLm5yX2RpcnR5KTsKLQlwcmludGsoIiVsdSBwYWdlcyB3cml0ZWJhY2tcbiIsIHBzLm5yX3dyaXRlYmFjayk7Ci0JcHJpbnRrKCIlbHUgcGFnZXMgbWFwcGVkXG4iLCBwcy5ucl9tYXBwZWQpOwotCXByaW50aygiJWx1IHBhZ2VzIHNsYWJcbiIsIHBzLm5yX3NsYWIpOwotCXByaW50aygiJWx1IHBhZ2VzIHBhZ2V0YWJsZXNcbiIsIHBzLm5yX3BhZ2VfdGFibGVfcGFnZXMpOworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyBkaXJ0eVxuIiwgcHMubnJfZGlydHkpOworCXByaW50ayhLRVJOX0lORk8gIiVsdSBwYWdlcyB3cml0ZWJhY2tcbiIsIHBzLm5yX3dyaXRlYmFjayk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJWx1IHBhZ2VzIG1hcHBlZFxuIiwgcHMubnJfbWFwcGVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlbHUgcGFnZXMgc2xhYlxuIiwgcHMubnJfc2xhYik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJWx1IHBhZ2VzIHBhZ2V0YWJsZXNcbiIsIHBzLm5yX3BhZ2VfdGFibGVfcGFnZXMpOwogfQogCiAvKgpAQCAtMTEzLDE2ICsxMTMsMTYgQEAKIAlwbWRfdCAqcG1kOwogCiAJaWYgKHZhZGRyICYgKFBNRF9TSVpFLTEpKSB7CQkvKiB2YWRkciBpcyBtaXNhbGlnbmVkICovCi0JCXByaW50ayAoInNldF9wbWRfcGZuOiB2YWRkciBtaXNhbGlnbmVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2V0X3BtZF9wZm46IHZhZGRyIG1pc2FsaWduZWRcbiIpOwogCQlyZXR1cm47IC8qIEJVRygpOyAqLwogCX0KIAlpZiAocGZuICYgKFBUUlNfUEVSX1BURS0xKSkgewkJLyogcGZuIGlzIG1pc2FsaWduZWQgKi8KLQkJcHJpbnRrICgic2V0X3BtZF9wZm46IHBmbiBtaXNhbGlnbmVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAic2V0X3BtZF9wZm46IHBmbiBtaXNhbGlnbmVkXG4iKTsKIAkJcmV0dXJuOyAvKiBCVUcoKTsgKi8KIAl9CiAJcGdkID0gc3dhcHBlcl9wZ19kaXIgKyBwZ2RfaW5kZXgodmFkZHIpOwogCWlmIChwZ2Rfbm9uZSgqcGdkKSkgewotCQlwcmludGsgKCJzZXRfcG1kX3BmbjogcGdkX25vbmVcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZXRfcG1kX3BmbjogcGdkX25vbmVcbiIpOwogCQlyZXR1cm47IC8qIEJVRygpOyAqLwogCX0KIAlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgdmFkZHIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYyBiL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKaW5kZXggNzIwOTc1ZS4uNzBiY2Q1MyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCkBAIC0yNSw3ICsyNSw4IEBACiAKIGludCBwY2lfcm91dGVpcnE7CiBpbnQgcGNpYmlvc19sYXN0X2J1cyA9IC0xOwotc3RydWN0IHBjaV9idXMgKnBjaV9yb290X2J1cyA9IE5VTEw7Cit1bnNpZ25lZCBsb25nIHBpcnFfdGFibGVfYWRkcjsKK3N0cnVjdCBwY2lfYnVzICpwY2lfcm9vdF9idXM7CiBzdHJ1Y3QgcGNpX3Jhd19vcHMgKnJhd19wY2lfb3BzOwogCiBzdGF0aWMgaW50IHBjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWx1ZSkKQEAgLTEzMyw3ICsxMzQsNyBAQAogCiAJcHJpbnRrKCJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlIChidXMgJTAyeClcbiIsIGJ1c251bSk7CiAKLQlyZXR1cm4gcGNpX3NjYW5fYnVzKGJ1c251bSwgJnBjaV9yb290X29wcywgTlVMTCk7CisJcmV0dXJuIHBjaV9zY2FuX2J1c19wYXJlbnRlZChOVUxMLCBidXNudW0sICZwY2lfcm9vdF9vcHMsIE5VTEwpOwogfQogCiBleHRlcm4gdTggcGNpX2NhY2hlX2xpbmVfc2l6ZTsKQEAgLTE2NCw2ICsxNjUsNyBAQAogCWlmICgocGNpX3Byb2JlICYgUENJX0JJT1NfU09SVCkgJiYgIShwY2lfcHJvYmUgJiBQQ0lfTk9fU09SVCkpCiAJCXBjaWJpb3Nfc29ydCgpOwogI2VuZGlmCisJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwogCXJldHVybiAwOwogfQogCkBAIC0xODgsNiArMTkwLDkgQEAKIAl9IGVsc2UgaWYgKCFzdHJjbXAoc3RyLCAiYmlvc2lycSIpKSB7CiAJCXBjaV9wcm9iZSB8PSBQQ0lfQklPU19JUlFfU0NBTjsKIAkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJwaXJxYWRkcj0iLCA5KSkgeworCQlwaXJxX3RhYmxlX2FkZHIgPSBzaW1wbGVfc3RydG91bChzdHIrOSwgTlVMTCwgMCk7CisJCXJldHVybiBOVUxMOwogCX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19QQ0lfRElSRUNUCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2kzODYuYyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCmluZGV4IGMyMDVlYTcuLjkzYTM2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jCkBAIC0xMDYsMTEgKzEwNiwxNiBAQAogCQlpZiAoKGRldiA9IGJ1cy0+c2VsZikpIHsKIAkJCWZvciAoaWR4ID0gUENJX0JSSURHRV9SRVNPVVJDRVM7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgewogCQkJCXIgPSAmZGV2LT5yZXNvdXJjZVtpZHhdOwotCQkJCWlmICghci0+c3RhcnQpCisJCQkJaWYgKCFyLT5mbGFncykKIAkJCQkJY29udGludWU7CiAJCQkJcHIgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoZGV2LCByKTsKLQkJCQlpZiAoIXByIHx8IHJlcXVlc3RfcmVzb3VyY2UocHIsIHIpIDwgMCkKKwkJCQlpZiAoIXItPnN0YXJ0IHx8ICFwciB8fCByZXF1ZXN0X3Jlc291cmNlKHByLCByKSA8IDApIHsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IENhbm5vdCBhbGxvY2F0ZSByZXNvdXJjZSByZWdpb24gJWQgb2YgYnJpZGdlICVzXG4iLCBpZHgsIHBjaV9uYW1lKGRldikpOworCQkJCQkvKiBTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgcmVnaW9uLgorCQkJCQkgICBJbnZhbGlkYXRlIHRoZSByZXNvdXJjZSB0byBwcmV2ZW50IGNoaWxkCisJCQkJCSAgIHJlc291cmNlIGFsbG9jYXRpb25zIGluIHRoaXMgcmFuZ2UuICovCisJCQkJCXItPmZsYWdzID0gMDsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcGNpYmlvc19hbGxvY2F0ZV9idXNfcmVzb3VyY2VzKCZidXMtPmNoaWxkcmVuKTsKQEAgLTIyNyw3ICsyMzIsNyBAQAogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CiAJb2xkX2NtZCA9IGNtZDsKLQlmb3IoaWR4PTA7IGlkeDw2OyBpZHgrKykgeworCWZvcihpZHggPSAwOyBpZHggPCBQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIHJlcXVlc3RlZCBzdHVmZiAqLwogCQlpZiAoIShtYXNrICYgKDE8PGlkeCkpKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2lycS5jIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwppbmRleCA4MzQ1OGY4Li43NjZiMTA0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2lycS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvaXJxLmMKQEAgLTU4LDYgKzU4LDM1IEBACiBpbnQgKCpwY2liaW9zX2VuYWJsZV9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYpID0gTlVMTDsKIAogLyoKKyAqICBDaGVjayBwYXNzZWQgYWRkcmVzcyBmb3IgdGhlIFBDSSBJUlEgUm91dGluZyBUYWJsZSBzaWduYXR1cmUKKyAqICBhbmQgcGVyZm9ybSBjaGVja3N1bSB2ZXJpZmljYXRpb24uCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKiBwaXJxX2NoZWNrX3JvdXRpbmdfdGFibGUodTggKmFkZHIpCit7CisJc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICpydDsKKwlpbnQgaTsKKwl1OCBzdW07CisKKwlydCA9IChzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKikgYWRkcjsKKwlpZiAocnQtPnNpZ25hdHVyZSAhPSBQSVJRX1NJR05BVFVSRSB8fAorCSAgICBydC0+dmVyc2lvbiAhPSBQSVJRX1ZFUlNJT04gfHwKKwkgICAgcnQtPnNpemUgJSAxNiB8fAorCSAgICBydC0+c2l6ZSA8IHNpemVvZihzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUpKQorCQlyZXR1cm4gTlVMTDsKKwlzdW0gPSAwOworCWZvciAoaT0wOyBpIDwgcnQtPnNpemU7IGkrKykKKwkJc3VtICs9IGFkZHJbaV07CisJaWYgKCFzdW0pIHsKKwkJREJHKCJQQ0k6IEludGVycnVwdCBSb3V0aW5nIFRhYmxlIGZvdW5kIGF0IDB4JXBcbiIsIHJ0KTsKKwkJcmV0dXJuIHJ0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisKKy8qCiAgKiAgU2VhcmNoIDB4ZjAwMDAgLS0gMHhmZmZmZiBmb3IgdGhlIFBDSSBJUlEgUm91dGluZyBUYWJsZS4KICAqLwogCkBAIC02NSwyMyArOTQsMTcgQEAKIHsKIAl1OCAqYWRkcjsKIAlzdHJ1Y3QgaXJxX3JvdXRpbmdfdGFibGUgKnJ0OwotCWludCBpOwotCXU4IHN1bTsKIAotCWZvcihhZGRyID0gKHU4ICopIF9fdmEoMHhmMDAwMCk7IGFkZHIgPCAodTggKikgX192YSgweDEwMDAwMCk7IGFkZHIgKz0gMTYpIHsKLQkJcnQgPSAoc3RydWN0IGlycV9yb3V0aW5nX3RhYmxlICopIGFkZHI7Ci0JCWlmIChydC0+c2lnbmF0dXJlICE9IFBJUlFfU0lHTkFUVVJFIHx8Ci0JCSAgICBydC0+dmVyc2lvbiAhPSBQSVJRX1ZFUlNJT04gfHwKLQkJICAgIHJ0LT5zaXplICUgMTYgfHwKLQkJICAgIHJ0LT5zaXplIDwgc2l6ZW9mKHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSkpCi0JCQljb250aW51ZTsKLQkJc3VtID0gMDsKLQkJZm9yKGk9MDsgaTxydC0+c2l6ZTsgaSsrKQotCQkJc3VtICs9IGFkZHJbaV07Ci0JCWlmICghc3VtKSB7Ci0JCQlEQkcoIlBDSTogSW50ZXJydXB0IFJvdXRpbmcgVGFibGUgZm91bmQgYXQgMHglcFxuIiwgcnQpOworCWlmIChwaXJxX3RhYmxlX2FkZHIpIHsKKwkJcnQgPSBwaXJxX2NoZWNrX3JvdXRpbmdfdGFibGUoKHU4ICopIF9fdmEocGlycV90YWJsZV9hZGRyKSk7CisJCWlmIChydCkKIAkJCXJldHVybiBydDsKLQkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IFBJUlEgdGFibGUgTk9UIGZvdW5kIGF0IHBpcnFhZGRyXG4iKTsKKwl9CisJZm9yKGFkZHIgPSAodTggKikgX192YSgweGYwMDAwKTsgYWRkciA8ICh1OCAqKSBfX3ZhKDB4MTAwMDAwKTsgYWRkciArPSAxNikgeworCQlydCA9IHBpcnFfY2hlY2tfcm91dGluZ190YWJsZShhZGRyKTsKKwkJaWYgKHJ0KQorCQkJcmV0dXJuIHJ0OwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTEwMjgsMjQgKzEwNTEsMjggQEAKIHN1YnN5c19pbml0Y2FsbChwY2liaW9zX2lycV9pbml0KTsKIAogCi1zdGF0aWMgdm9pZCBwaXJxX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyB2b2lkIHBpcnFfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qCiAJICogIElmIGFueSBJU0FQblAgZGV2aWNlIHJlcG9ydHMgYW4gSVJRIGluIGl0cyBsaXN0IG9mIHBvc3NpYmxlCiAJICogIElSUSdzLCB3ZSB0cnkgdG8gYXZvaWQgYXNzaWduaW5nIGl0IHRvIFBDSSBkZXZpY2VzLgogCSAqLwotCWlmIChpcnEgPCAxNikKLQkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwOworCWlmIChpcnEgPCAxNikgeworCQlpZiAoYWN0aXZlKQorCQkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwMDsKKwkJZWxzZQorCQkJcGlycV9wZW5hbHR5W2lycV0gKz0gMTAwOworCX0KIH0KIAotdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3ZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAjaWZkZWYgQ09ORklHX0FDUElfUENJCiAJaWYgKCFhY3BpX25vaXJxKQotCQlhY3BpX3BlbmFsaXplX2lzYV9pcnEoaXJxKTsKKwkJYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGlycSwgYWN0aXZlKTsKIAllbHNlCiAjZW5kaWYKLQkJcGlycV9wZW5hbGl6ZV9pc2FfaXJxKGlycSk7CisJCXBpcnFfcGVuYWxpemVfaXNhX2lycShpcnEsIGFjdGl2ZSk7CiB9CiAKIHN0YXRpYyBpbnQgcGlycV9lbmFibGVfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2xlZ2FjeS5jIGIvYXJjaC9pMzg2L3BjaS9sZWdhY3kuYwppbmRleCAxNDkyZTM3Li4xNDlhOTU4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2xlZ2FjeS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvbGVnYWN5LmMKQEAgLTQ1LDYgKzQ1LDggQEAKIAogCXByaW50aygiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CiAJcGNpX3Jvb3RfYnVzID0gcGNpYmlvc19zY2FuX3Jvb3QoMCk7CisJaWYgKHBjaV9yb290X2J1cykKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhwY2lfcm9vdF9idXMpOwogCiAJcGNpYmlvc19maXh1cF9wZWVyX2JyaWRnZXMoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCmluZGV4IDAyMWE1MGEuLjYwZjBlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYworKysgYi9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKQEAgLTExLDExICsxMSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgInBjaS5oIgogCi0vKiBUaGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUuICBTZXQgZnJvbSBBQ1BJIHRhYmxlcy4gKi8KLXUzMiBwY2lfbW1jZmdfYmFzZV9hZGRyOwotCiAjZGVmaW5lIG1tY2ZnX3ZpcnRfYWRkciAoKHZvaWQgX19pb21lbSAqKSBmaXhfdG9fdmlydChGSVhfUENJRV9NQ0ZHKSkKIAogLyogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbGFzdCBNTUNPTkZJRyBkZXZpY2UgYWNjZXNzZWQgKi8KQEAgLTI0LDEwICsyMiwzMSBAQAogLyoKICAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggTU1DT05GSUcgYWNjZXNzZXMKICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2V4cF9zZXRfZGV2X2Jhc2UoaW50IGJ1cywgaW50IGRldmZuKQorc3RhdGljIHUzMiBnZXRfYmFzZV9hZGRyKHVuc2lnbmVkIGludCBzZWcsIGludCBidXMpCiB7Ci0JdTMyIGRldl9iYXNlID0gcGNpX21tY2ZnX2Jhc2VfYWRkciB8IChidXMgPDwgMjApIHwgKGRldmZuIDw8IDEyKTsKKwlpbnQgY2ZnX251bSA9IC0xOworCXN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpjZmc7CisKKwl3aGlsZSAoMSkgeworCQkrK2NmZ19udW07CisJCWlmIChjZmdfbnVtID49IHBjaV9tbWNmZ19jb25maWdfbnVtKSB7CisJCQkvKiBzb21ldGhpbmcgYmFkIGlzIGdvaW5nIG9uLCBubyBjZmcgdGFibGUgaXMgZm91bmQuICovCisJCQkvKiBzbyB3ZSBmYWxsIGJhY2sgdG8gdGhlIG9sZCB3YXkgd2UgdXNlZCB0byBkbyB0aGlzICovCisJCQkvKiBhbmQganVzdCByZWx5IG9uIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBjb3JyZWN0LiAqLworCQkJcmV0dXJuIHBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzOworCQl9CisJCWNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2NmZ19udW1dOworCQlpZiAoY2ZnLT5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIgIT0gc2VnKQorCQkJY29udGludWU7CisJCWlmICgoY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw9IGJ1cykgJiYKKwkJICAgIChjZmctPmVuZF9idXNfbnVtYmVyID49IGJ1cykpCisJCQlyZXR1cm4gY2ZnLT5iYXNlX2FkZHJlc3M7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2V4cF9zZXRfZGV2X2Jhc2UodW5zaWduZWQgaW50IHNlZywgaW50IGJ1cywgaW50IGRldmZuKQoreworCXUzMiBkZXZfYmFzZSA9IGdldF9iYXNlX2FkZHIoc2VnLCBidXMpIHwgKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpOwogCWlmIChkZXZfYmFzZSAhPSBtbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSkgewogCQltbWNmZ19sYXN0X2FjY2Vzc2VkX2RldmljZSA9IGRldl9iYXNlOwogCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX1BDSUVfTUNGRywgZGV2X2Jhc2UpOwpAQCAtNDQsNyArNjMsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwogCi0JcGNpX2V4cF9zZXRfZGV2X2Jhc2UoYnVzLCBkZXZmbik7CisJcGNpX2V4cF9zZXRfZGV2X2Jhc2Uoc2VnLCBidXMsIGRldmZuKTsKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgpAQCAtNzMsNyArOTIsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaV9jb25maWdfbG9jaywgZmxhZ3MpOwogCi0JcGNpX2V4cF9zZXRfZGV2X2Jhc2UoYnVzLCBkZXZmbik7CisJcGNpX2V4cF9zZXRfZGV2X2Jhc2Uoc2VnLCBidXMsIGRldmZuKTsKIAogCXN3aXRjaCAobGVuKSB7CiAJY2FzZSAxOgpAQCAtMTAxLDcgKzEyMCwxMSBAQAogewogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKIAkJZ290byBvdXQ7Ci0JaWYgKCFwY2lfbW1jZmdfYmFzZV9hZGRyKQorCisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX01DRkcsIGFjcGlfcGFyc2VfbWNmZyk7CisJaWYgKChwY2lfbW1jZmdfY29uZmlnX251bSA9PSAwKSB8fAorCSAgICAocGNpX21tY2ZnX2NvbmZpZyA9PSBOVUxMKSB8fAorCSAgICAocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MgPT0gMCkpCiAJCWdvdG8gb3V0OwogCiAJLyogS2x1ZGdlIGZvciBub3cuIERvbid0IHVzZSBtbWNvbmZpZyBvbiBBTUQgc3lzdGVtcyBiZWNhdXNlCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL251bWEuYyBiL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCmluZGV4IDllMzY5NTQuLmFkYmUxN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvbnVtYS5jCkBAIC0xMTUsNiArMTE1LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlwY2lfcm9vdF9idXMgPSBwY2liaW9zX3NjYW5fcm9vdCgwKTsKKwlpZiAocGNpX3Jvb3RfYnVzKQorCQlwY2lfYnVzX2FkZF9kZXZpY2VzKHBjaV9yb290X2J1cyk7CiAJaWYgKG51bV9vbmxpbmVfbm9kZXMoKSA+IDEpCiAJCWZvcl9lYWNoX29ubGluZV9ub2RlKHF1YWQpIHsKIAkJCWlmIChxdWFkID09IDApCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3BjaS5oIGIvYXJjaC9pMzg2L3BjaS9wY2kuaAppbmRleCBhOGZjODBjLi5hODBmMGY1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL3BjaS5oCisrKyBiL2FyY2gvaTM4Ni9wY2kvcGNpLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgUENJX0FTU0lHTl9BTExfQlVTU0VTCTB4NDAwMAogCiBleHRlcm4gdW5zaWduZWQgaW50IHBjaV9wcm9iZTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBpcnFfdGFibGVfYWRkcjsKIAogLyogcGNpLWkzODYuYyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3Zpc3dzLmMgYi9hcmNoL2kzODYvcGNpL3Zpc3dzLmMKaW5kZXggNmE5MjQ4Ny4uMzE0YzkzMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS92aXN3cy5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvdmlzd3MuYwpAQCAtMjEsNyArMjEsNyBAQAogCiBpbnQgKCpwY2liaW9zX2VuYWJsZV9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYpID0gJnBjaV92aXN3c19lbmFibGVfaXJxOwogCi12b2lkIF9faW5pdCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkge30KK3ZvaWQgX19pbml0IHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKSB7fQogCiAKIHVuc2lnbmVkIGludCBwY2lfYnVzMCwgcGNpX2J1czE7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcG93ZXIvY3B1LmMgYi9hcmNoL2kzODYvcG93ZXIvY3B1LmMKaW5kZXggNmY1MjFjZi4uYzU0N2MxYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCisrKyBiL2FyY2gvaTM4Ni9wb3dlci9jcHUuYwpAQCAtMjIsOSArMjIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogc3RhdGljIHN0cnVjdCBzYXZlZF9jb250ZXh0IHNhdmVkX2NvbnRleHQ7CiAKQEAgLTMzLDggKzM1LDYgQEAKIHVuc2lnbmVkIGxvbmcgc2F2ZWRfY29udGV4dF9lc2ksIHNhdmVkX2NvbnRleHRfZWRpOwogdW5zaWduZWQgbG9uZyBzYXZlZF9jb250ZXh0X2VmbGFnczsKIAotZXh0ZXJuIHZvaWQgZW5hYmxlX3NlcF9jcHUodm9pZCAqKTsKLQogdm9pZCBfX3NhdmVfcHJvY2Vzc29yX3N0YXRlKHN0cnVjdCBzYXZlZF9jb250ZXh0ICpjdHh0KQogewogCWtlcm5lbF9mcHVfYmVnaW4oKTsKQEAgLTQ0LDcgKzQ0LDYgQEAKIAkgKi8KIAlhc20gdm9sYXRpbGUgKCJzZ2R0ICUwIiA6ICI9bSIgKGN0eHQtPmdkdF9saW1pdCkpOwogCWFzbSB2b2xhdGlsZSAoInNpZHQgJTAiIDogIj1tIiAoY3R4dC0+aWR0X2xpbWl0KSk7Ci0JYXNtIHZvbGF0aWxlICgic2xkdCAlMCIgOiAiPW0iIChjdHh0LT5sZHQpKTsKIAlhc20gdm9sYXRpbGUgKCJzdHIgJTAiICA6ICI9bSIgKGN0eHQtPnRyKSk7CiAKIAkvKgpAQCAtMTA3LDcgKzEwNiw2IEBACiAKIHZvaWQgX19yZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZShzdHJ1Y3Qgc2F2ZWRfY29udGV4dCAqY3R4dCkKIHsKLQogCS8qCiAJICogY29udHJvbCByZWdpc3RlcnMKIAkgKi8KQEAgLTExNyw2ICsxMTUsMTMgQEAKIAlhc20gdm9sYXRpbGUgKCJtb3ZsICUwLCAlJWNyMCIgOjogInIiIChjdHh0LT5jcjApKTsKIAogCS8qCisJICogbm93IHJlc3RvcmUgdGhlIGRlc2NyaXB0b3IgdGFibGVzIHRvIHRoZWlyIHByb3BlciB2YWx1ZXMKKwkgKiBsdHIgaXMgZG9uZSBpIGZpeF9wcm9jZXNzb3JfY29udGV4dCgpLgorCSAqLworCWFzbSB2b2xhdGlsZSAoImxnZHQgJTAiIDo6ICJtIiAoY3R4dC0+Z2R0X2xpbWl0KSk7CisJYXNtIHZvbGF0aWxlICgibGlkdCAlMCIgOjogIm0iIChjdHh0LT5pZHRfbGltaXQpKTsKKworCS8qCiAJICogc2VnbWVudCByZWdpc3RlcnMKIAkgKi8KIAlhc20gdm9sYXRpbGUgKCJtb3Z3ICUwLCAlJWVzIiA6OiAiciIgKGN0eHQtPmVzKSk7CkBAIC0xMjUsMjEgKzEzMCwxNCBAQAogCWFzbSB2b2xhdGlsZSAoIm1vdncgJTAsICUlc3MiIDo6ICJyIiAoY3R4dC0+c3MpKTsKIAogCS8qCi0JICogbm93IHJlc3RvcmUgdGhlIGRlc2NyaXB0b3IgdGFibGVzIHRvIHRoZWlyIHByb3BlciB2YWx1ZXMKLQkgKiBsdHIgaXMgZG9uZSBpIGZpeF9wcm9jZXNzb3JfY29udGV4dCgpLgotCSAqLwotCWFzbSB2b2xhdGlsZSAoImxnZHQgJTAiIDo6ICJtIiAoY3R4dC0+Z2R0X2xpbWl0KSk7Ci0JYXNtIHZvbGF0aWxlICgibGlkdCAlMCIgOjogIm0iIChjdHh0LT5pZHRfbGltaXQpKTsKLQlhc20gdm9sYXRpbGUgKCJsbGR0ICUwIiA6OiAibSIgKGN0eHQtPmxkdCkpOwotCi0JLyoKIAkgKiBzeXNlbnRlciBNU1JzCiAJICovCiAJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TRVApKQotCQllbmFibGVfc2VwX2NwdShOVUxMKTsKKwkJZW5hYmxlX3NlcF9jcHUoKTsKIAogCWZpeF9wcm9jZXNzb3JfY29udGV4dCgpOwogCWRvX2ZwdV9lbmQoKTsKKwltdHJyX2FwX2luaXQoKTsKIH0KIAogdm9pZCByZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCAwMWI3OGU3Li4yZTA4OTQyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtNDIzLDYgKzQyMyw4IEBACiAKIGVuZGlmCiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnIGIvYXJjaC9pYTY0L2NvbmZpZ3Mvc24yX2RlZmNvbmZpZwppbmRleCA0ODdkMmUzLi5jMDU2MTM5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy9zbjJfZGVmY29uZmlnCisrKyBiL2FyY2gvaWE2NC9jb25maWdzL3NuMl9kZWZjb25maWcKQEAgLTk5LDcgKzk5LDcgQEAKICMgRmlybXdhcmUgRHJpdmVycwogIwogQ09ORklHX0VGSV9WQVJTPXkKLSMgQ09ORklHX0VGSV9QQ0RQIGlzIG5vdCBzZXQKK0NPTkZJR19FRklfUENEUD15CiBDT05GSUdfQklORk1UX0VMRj15CiAjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTY1MCw3ICs2NTAsNyBAQAogIwogIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKICMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19WR0FfQ09OU09MRT15CiBDT05GSUdfRFVNTVlfQ09OU09MRT15CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3RpZ2VyX2RlZmNvbmZpZwppbmRleCA0N2Y0NTM0Li43MzQ1NGVlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvY29uZmlncy90aWdlcl9kZWZjb25maWcKKysrIGIvYXJjaC9pYTY0L2NvbmZpZ3MvdGlnZXJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLTIwMDUwNjIxCi0jIFR1ZSBKdW4gMjEgMTQ6MDM6MjQgMjAwNQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMS0yMDA1MDYyOQorIyBXZWQgSnVuIDI5IDE1OjI4OjEyIDIwMDUKICMKIAogIwpAQCAtODAsMTggKzgwLDI5IEBACiAjIENPTkZJR19JQTY0X1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0I9eQogIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKIENPTkZJR19JQTY0X0wxX0NBQ0hFX1NISUZUPTcKICMgQ09ORklHX05VTUEgaXMgbm90IHNldAogQ09ORklHX1ZJUlRVQUxfTUVNX01BUD15CiBDT05GSUdfSE9MRVNfSU5fWk9ORT15CiBDT05GSUdfSUE2NF9DWUNMT05FPXkKIENPTkZJR19JT1NBUElDPXkKKyMgQ09ORklHX0lBNjRfU0dJX1NOX1hQIGlzIG5vdCBzZXQKIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTE4CiBDT05GSUdfU01QPXkKIENPTkZJR19OUl9DUFVTPTQKIENPTkZJR19IT1RQTFVHX0NQVT15CiAjIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CiBDT05GSUdfSEFWRV9ERUNfTE9DSz15CiBDT05GSUdfSUEzMl9TVVBQT1JUPXkKIENPTkZJR19DT01QQVQ9eQpAQCAtMjU3LDYgKzI2OCw3IEBACiAjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9QSUlYPXkKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CkBAIC0zOTUsNiArNDA3LDcgQEAKIENPTkZJR19JTkVUPXkKIENPTkZJR19JUF9NVUxUSUNBU1Q9eQogIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CiAjIENPTkZJR19JUF9QTlAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKQEAgLTQwNyw2ICs0MjAsOCBAQAogIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX0lQX1RDUERJQUc9eQogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC01OTgsOSArNjEzLDcgQEAKICMgQ09ORklHX0dBTUVQT1JUX05TNTU4IGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUX0w0IGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUX0VNVTEwSzEgaXMgbm90IHNldAotIyBDT05GSUdfR0FNRVBPUlRfVk9SVEVYIGlzIG5vdCBzZXQKICMgQ09ORklHX0dBTUVQT1JUX0ZNODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dBTUVQT1JUX0NTNDYxWCBpcyBub3Qgc2V0CiAKICMKICMgQ2hhcmFjdGVyIGRldmljZXMKQEAgLTYyOSw3ICs2NDIsNiBAQAogQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQogIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRVJJQUxfODI1MF9NVUxUSVBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMXzgyNTBfUlNBIGlzIG5vdCBzZXQKIAogIwpAQCAtNzQzLDYgKzc1NSw3IEBACiBDT05GSUdfVVNCX0VIQ0lfSENEPW0KICMgQ09ORklHX1VTQl9FSENJX1NQTElUX0lTTyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD1tCiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9MSVRUTEVfRU5ESUFOPXkKQEAgLTc3OSw5ICs3OTIsMTEgQEAKICMgQ09ORklHX1VTQl9ISURERVYgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKQEAgLTgzOCw3ICs4NTMsNyBAQAogIyBDT05GSUdfVVNCX1RFU1QgaXMgbm90IHNldAogCiAjCi0jIFVTQiBBVE0vRFNMIGRyaXZlcnMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CiAjCiAKICMKQEAgLTg1NywxMiArODcyLDE3IEBACiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIAogIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQogQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKQEAgLTkyMiw3ICs5NDIsNiBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX0RFVkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX1RNUEZTX1hBVFRSPXkKQEAgLTk1MywxNSArOTcyLDE4IEBACiAjCiBDT05GSUdfTkZTX0ZTPW0KIENPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CiBDT05GSUdfTkZTX1Y0PXkKIENPTkZJR19ORlNfRElSRUNUSU89eQogQ09ORklHX05GU0Q9bQogQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU0RfVjQ9eQogQ09ORklHX05GU0RfVENQPXkKIENPTkZJR19MT0NLRD1tCiBDT05GSUdfTE9DS0RfVjQ9eQogQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9bQogQ09ORklHX1NVTlJQQ19HU1M9bQogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT1tCkBAIC0xMDY5LDYgKzEwOTEsNyBAQAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0lBNjRfR1JBTlVMRV8xNk1CPXkKICMgQ09ORklHX0lBNjRfR1JBTlVMRV82NE1CIGlzIG5vdCBzZXQKICMgQ09ORklHX0lBNjRfUFJJTlRfSEFaQVJEUyBpcyBub3Qgc2V0CkBAIC0xMDkwLDcgKzExMTMsNyBAQAogIyBDT05GSUdfQ1JZUFRPX0hNQUMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JZUFRPX01ENT1tCitDT05GSUdfQ1JZUFRPX01ENT15CiAjIENPTkZJR19DUllQVE9fU0hBMSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZyBiL2FyY2gvaWE2NC9jb25maWdzL3p4MV9kZWZjb25maWcKaW5kZXggMjFkNmY5Yi4uYjc3NTVlNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2NvbmZpZ3MvengxX2RlZmNvbmZpZworKysgYi9hcmNoL2lhNjQvY29uZmlncy96eDFfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEwCi0jIFdlZCBEZWMgMjkgMDk6MDU6NDggMjAwNAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXJjMS0yMDA1MDYyOQorIyBXZWQgSnVuIDI5IDE1OjMxOjExIDIwMDUKICMKIAogIwpAQCAtMTIsNiArMTIsNyBAQAogQ09ORklHX0JST0tFTj15CiBDT05GSUdfQlJPS0VOX09OX1NNUD15CiBDT05GSUdfTE9DS19LRVJORUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogCiAjCiAjIEdlbmVyYWwgc2V0dXAKQEAgLTI0LDIzICsyNSwyNiBAQAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE3CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU0hNRU09eQogQ09ORklHX0NDX0FMSUdOX0ZVTkNUSU9OUz0wCiBDT05GSUdfQ0NfQUxJR05fTEFCRUxTPTAKIENPTkZJR19DQ19BTElHTl9MT09QUz0wCiBDT05GSUdfQ0NfQUxJR05fSlVNUFM9MAogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCiAKICMKICMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKQEAgLTU5LDEyICs2MywxNSBAQAogQ09ORklHXzY0QklUPXkKIENPTkZJR19NTVU9eQogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CiBDT05GSUdfVElNRV9JTlRFUlBPTEFUSU9OPXkKIENPTkZJR19FRkk9eQogQ09ORklHX0dFTkVSSUNfSU9NQVA9eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19JQTY0X0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfSUE2NF9ESUcgaXMgbm90IHNldAogQ09ORklHX0lBNjRfSFBfWlgxPXkKKyMgQ09ORklHX0lBNjRfSFBfWlgxX1NXSU9UTEIgaXMgbm90IHNldAogIyBDT05GSUdfSUE2NF9TR0lfU04yIGlzIG5vdCBzZXQKICMgQ09ORklHX0lBNjRfSFBfU0lNIGlzIG5vdCBzZXQKICMgQ09ORklHX0lUQU5JVU0gaXMgbm90IHNldApAQCAtNzMsMjIgKzgwLDM2IEBACiAjIENPTkZJR19JQTY0X1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogQ09ORklHX0lBNjRfUEFHRV9TSVpFXzE2S0I9eQogIyBDT05GSUdfSUE2NF9QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKIENPTkZJR19JQTY0X0wxX0NBQ0hFX1NISUZUPTcKICMgQ09ORklHX05VTUEgaXMgbm90IHNldAogQ09ORklHX1ZJUlRVQUxfTUVNX01BUD15CitDT05GSUdfSE9MRVNfSU5fWk9ORT15CiAjIENPTkZJR19JQTY0X0NZQ0xPTkUgaXMgbm90IHNldAogQ09ORklHX0lPU0FQSUM9eQorIyBDT05GSUdfSUE2NF9TR0lfU05fWFAgaXMgbm90IHNldAogQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTgKIENPTkZJR19TTVA9eQogQ09ORklHX05SX0NQVVM9MTYKICMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CiAjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKIENPTkZJR19IQVZFX0RFQ19MT0NLPXkKIENPTkZJR19JQTMyX1NVUFBPUlQ9eQogQ09ORklHX0NPTVBBVD15CiBDT05GSUdfSUE2NF9NQ0FfUkVDT1ZFUlk9eQogQ09ORklHX1BFUkZNT049eQogQ09ORklHX0lBNjRfUEFMSU5GTz15CitDT05GSUdfQUNQSV9ERUFMTE9DQVRFX0lSUT15CiAKICMKICMgRmlybXdhcmUgRHJpdmVycwpAQCAtMTIwLDYgKzE0MSw3IEBACiBDT05GSUdfQUNQSV9QT1dFUj15CiBDT05GSUdfQUNQSV9QQ0k9eQogQ09ORklHX0FDUElfU1lTVEVNPXkKKyMgQ09ORklHX0FDUElfQ09OVEFJTkVSIGlzIG5vdCBzZXQKIAogIwogIyBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEpCkBAIC0xMjksNiArMTUxLDcgQEAKICMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CiBDT05GSUdfUENJX05BTUVTPXkKKyMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgUENJIEhvdHBsdWcgU3VwcG9ydApAQCAtMTM4LDcgKzE2MSw2IEBACiBDT05GSUdfSE9UUExVR19QQ0lfQUNQST15CiAjIENPTkZJR19IT1RQTFVHX1BDSV9BQ1BJX0lCTSBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1RQTFVHX1BDSV9DUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hPVFBMVUdfUENJX1BDSUUgaXMgbm90IHNldAogIyBDT05GSUdfSE9UUExVR19QQ0lfU0hQQyBpcyBub3Qgc2V0CiAKICMKQEAgLTE0NywxMCArMTY5LDYgQEAKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CiAKICMKLSMgUEMtY2FyZCBicmlkZ2VzCi0jCi0KLSMKICMgRGV2aWNlIERyaXZlcnMKICMKIApAQCAtMTg0LDYgKzIwMiw3IEBACiAjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9MT09QPXkKICMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CkBAIC0yMDMsNiArMjIyLDcgQEAKIENPTkZJR19JT1NDSEVEX0FTPXkKIENPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKIENPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCiAjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKQEAgLTI0Niw2ICsyNjYsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CkBAIC0yNzUsNiArMjk2LDcgQEAKIENPTkZJR19CTEtfREVWX1NSPXkKIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15CiBDT05GSUdfQ0hSX0RFVl9TRz15CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CiAKICMKICMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCkBAIC0yODgsNiArMzEwLDcgQEAKICMKIENPTkZJR19TQ1NJX1NQSV9BVFRSUz15CiAjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKQEAgLTMwMywxMyArMzI2LDEwIEBACiAjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQ1BRRkNUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0VBVEFfUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKQEAgLTMxOSw4ICszMzksNiBAQAogQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1BDSTIwMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9QQ0kyMjIwSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ19JU1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAogQ09ORklHX1NDU0lfUUxPR0lDXzEyODA9eQpAQCAtMzMxLDcgKzM0OSw3IEBACiAjIENPTkZJR19TQ1NJX1FMQTIzMDAgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9RTEEyMzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBNjMxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMQTYzMjIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldApAQCAtMzQ0LDkgKzM2Miw5IEBACiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19GVVNJT049eQotQ09ORklHX0ZVU0lPTl9NQVhfU0dFPTQwCi0jIENPTkZJR19GVVNJT05fQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CiAKICMKICMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydApAQCAtMzY4LDEyICszODYsMTIgQEAKICMKIENPTkZJR19QQUNLRVQ9eQogIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAogQ09ORklHX1VOSVg9eQogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQogIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CkBAIC0zODYsNiArNDA0LDggQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAogIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQogCiAjCiAjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCkBAIC00MDUsOCArNDI1LDYgQEAKIENPTkZJR19JUF9ORl9BUlBUQUJMRVM9eQogIyBDT05GSUdfSVBfTkZfQVJQRklMVEVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX05GX0FSUF9NQU5HTEUgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfQ09NUEFUX0lQQ0hBSU5TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTVBBVF9JUEZXQURNIGlzIG5vdCBzZXQKIAogIwogIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKQEAgLTQ4Myw3ICs1MDEsNiBAQAogIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMD15Ci0jIENPTkZJR19FMTAwX05BUEkgaXMgbm90IHNldAogIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKICMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAogIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldApAQCAtNTA1LDkgKzUyMiwxMSBAQAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAogIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiBDT05GSUdfVElHT04zPXkKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQpAQCAtNTY1LDE4ICs1ODQsNiBAQAogIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAogCiAjCi0jIElucHV0IEkvTyBkcml2ZXJzCi0jCi0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci1DT05GSUdfU09VTkRfR0FNRVBPUlQ9eQotQ09ORklHX1NFUklPPXkKLSMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0Ci0KLSMKICMgSW5wdXQgRGV2aWNlIERyaXZlcnMKICMKICMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKQEAgLTU4Niw2ICs1OTMsMTYgQEAKICMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAogCiAjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKICMgQ2hhcmFjdGVyIGRldmljZXMKICMKIENPTkZJR19WVD15CkBAIC02MDMsNyArNjIwLDYgQEAKIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKICMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfTVVMVElQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklBTF84MjUwX1JTQSBpcyBub3Qgc2V0CiAKICMKQEAgLTYxMSw2ICs2MjcsNyBAQAogIwogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAogQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKQEAgLTY0NCw2ICs2NjEsMTIgQEAKICMgQ09ORklHX0RSTV9TSVMgaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IUEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAogCiAjCiAjIEkyQyBzdXBwb3J0CkBAIC02NjgsNiArNjkxLDcgQEAKICMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfSVNBIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKQEAgLTY5MSwxMCArNzE1LDE0IEBACiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSVQ4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNNjMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTc1IGlzIG5vdCBzZXQKQEAgLTcwNSwyMSArNzMzLDI5IEBACiAjIENPTkZJR19TRU5TT1JTX0xNODUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WSUE2ODZBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVzgzNzgxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKIAogIwogIyBPdGhlciBJMkMgQ2hpcCBzdXBwb3J0CiAjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1JUQzg1NjQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldApAQCAtNzQ2LDYgKzc4Miw3IEBACiAjCiAjIFZpZGVvIEFkYXB0ZXJzCiAjCisjIENPTkZJR19UVU5FUl9NVUxUSV9JMkMgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fQlQ4NDggaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fQ1BJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSURFT19TQUE1MjQ2QSBpcyBub3Qgc2V0CkBAIC03NzgsNiArODE1LDExIEBACiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKIENPTkZJR19GQj15CitDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQorQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorQ09ORklHX0ZCX1NPRlRfQ1VSU09SPXkKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKIENPTkZJR19GQl9NT0RFX0hFTFBFUlM9eQogIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0CkBAIC03ODUsNiArODI3LDcgQEAKICMgQ09ORklHX0ZCX0NZQkVSMjAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BU0lMSUFOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9JTVNUVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9OVklESUEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUklWQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQVRST1ggaXMgbm90IHNldAogIyBDT05GSUdfRkJfUkFERU9OX09MRCBpcyBub3Qgc2V0CkBAIC04MDEsNiArODQ0LDcgQEAKICMgQ09ORklHX0ZCX1ZPT0RPTzEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9QTTMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAKICMKQEAgLTgyMCw2ICs4NjQsNyBAQAogIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAogQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIFNvdW5kCkBAIC04NjksNiArOTE0LDggQEAKICMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAogIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0NBMDEwNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldApAQCAtODc2LDYgKzkyMyw3IEBACiAjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0hEU1AgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0hEU1BNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0FMUzQwMDAgaXMgbm90IHNldApAQCAtODkzLDEzICs5NDEsMTQgQEAKICMgQ09ORklHX1NORF9JTlRFTDhYME0gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NPTklDVklCRVMgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1ZJQTgyWFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9IREFfSU5URUwgaXMgbm90IHNldAogCiAjCiAjIFVTQiBkZXZpY2VzCiAjCiAjIENPTkZJR19TTkRfVVNCX0FVRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9VU0JfVVNYMlkgaXMgbm90IHNldAogCiAjCiAjIE9wZW4gU291bmQgU3lzdGVtCkBAIC05MDksNiArOTU4LDggQEAKICMKICMgVVNCIHN1cHBvcnQKICMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CiBDT05GSUdfVVNCPXkKICMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CiAKQEAgLTkyMCw4ICs5NzEsNiBAQAogIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVVNQRU5EIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAotQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQotQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKIAogIwogIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKQEAgLTkyOSw3ICs5NzgsMTAgQEAKIENPTkZJR19VU0JfRUhDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CiBDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX1VTQl9VSENJX0hDRD15CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIApAQCAtOTQ3LDEyICs5OTksMTEgQEAKICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfU1RPUkFHRV9SV19ERVRFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9EUENNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVE9SQUdFX0hQODIwMGUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CkBAIC05NjYsOSArMTAxNywxMSBAQAogQ09ORklHX1VTQl9ISURERVY9eQogIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKQEAgLTk3OCw3ICsxMDMxLDYgQEAKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9IUFVTQlNDU0kgaXMgbm90IHNldAogCiAjCiAjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKQEAgLTk5Miw2ICsxMDQ0LDcgQEAKICMgQ09ORklHX1VTQl9TRTQwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU045QzEwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RWNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QV0MgaXMgbm90IHNldAogCiAjCiAjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCkBAIC0xMDAxLDYgKzEwNTQsNyBAQAogIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CiAKICMKICMgVVNCIHBvcnQgZHJpdmVycwpAQCAtMTAxNiw3ICsxMDcwLDYgQEAKICMKICMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RJR0wgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldApAQCAtMTAyNSw5ICsxMDc4LDExIEBACiAjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogCiAjCi0jIFVTQiBBVE0vRFNMIGRyaXZlcnMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CiAjCiAKICMKQEAgLTEwNDEsMTIgKzEwOTYsMjIgQEAKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiBDT05GSUdfRVhUMl9GU19YQVRUUj15CiAjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKQEAgLTEwNTYsNiArMTEyMSwxMCBAQAogQ09ORklHX0ZTX01CQ0FDSEU9eQogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIwogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKQEAgLTEwODksNyArMTE1OCw2IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKIENPTkZJR19UTVBGUz15CiBDT05GSUdfVE1QRlNfWEFUVFI9eQpAQCAtMTEyMCwxNSArMTE4OCwxOCBAQAogIwogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAogQ09ORklHX05GU19WND15CiAjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAogQ09ORklHX05GU0Q9eQogQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CiBDT05GSUdfTE9DS0Q9eQogQ09ORklHX0xPQ0tEX1Y0PXkKIENPTkZJR19FWFBPUlRGUz15CitDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQpAQCAtMTIwOSw2ICsxMjgwLDggQEAKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiAKICMKICMgUHJvZmlsaW5nIHN1cHBvcnQKQEAgLTEyMTgsMTQgKzEyOTEsMTggQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX01BR0lDX1NZU1JRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19LUFJPQkVTPXkKIENPTkZJR19JQTY0X0dSQU5VTEVfMTZNQj15CiAjIENPTkZJR19JQTY0X0dSQU5VTEVfNjRNQiBpcyBub3Qgc2V0CiBDT05GSUdfSUE2NF9QUklOVF9IQVpBUkRTPXkKQEAgLTEyNTIsNiArMTMyOSw3IEBACiAjIENPTkZJR19DUllQVE9fU0hBMjU2IGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19TSEE1MTIgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX1dQNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UR1IxOTIgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19ERVM9eQogIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCmluZGV4IGI4ZGI2ZTMuLjExOTU3NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwpAQCAtMTU2LDEwICsxNTYsMTMgQEAKICovCiAjZGVmaW5lIERFTEFZRURfUkVTT1VSQ0VfQ05UCTY0CiAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9TWDIwMDBfSU9DCTB4MTJlYworCiAjZGVmaW5lIFpYMV9JT0NfSUQJKChQQ0lfREVWSUNFX0lEX0hQX1pYMV9JT0MgPDwgMTYpIHwgUENJX1ZFTkRPUl9JRF9IUCkKICNkZWZpbmUgWlgyX0lPQ19JRAkoKFBDSV9ERVZJQ0VfSURfSFBfWlgyX0lPQyA8PCAxNikgfCBQQ0lfVkVORE9SX0lEX0hQKQogI2RlZmluZSBSRU9fSU9DX0lECSgoUENJX0RFVklDRV9JRF9IUF9SRU9fSU9DIDw8IDE2KSB8IFBDSV9WRU5ET1JfSURfSFApCiAjZGVmaW5lIFNYMTAwMF9JT0NfSUQJKChQQ0lfREVWSUNFX0lEX0hQX1NYMTAwMF9JT0MgPDwgMTYpIHwgUENJX1ZFTkRPUl9JRF9IUCkKKyNkZWZpbmUgU1gyMDAwX0lPQ19JRAkoKFBDSV9ERVZJQ0VfSURfSFBfU1gyMDAwX0lPQyA8PCAxNikgfCBQQ0lfVkVORE9SX0lEX0hQKQogCiAjZGVmaW5lIFpYMV9JT0NfT0ZGU0VUCTB4MTAwMAkvKiBBQ1BJIHJlcG9ydHMgU0JBLCB3ZSB3YW50IElPQyAqLwogCkBAIC0xNzI2LDYgKzE3MjksNyBAQAogCXsgWlgxX0lPQ19JRCwgInp4MSIsIGlvY196eDFfaW5pdCB9LAogCXsgWlgyX0lPQ19JRCwgInp4MiIsIE5VTEwgfSwKIAl7IFNYMTAwMF9JT0NfSUQsICJzeDEwMDAiLCBOVUxMIH0sCisJeyBTWDIwMDBfSU9DX0lELCAic3gyMDAwIiwgTlVMTCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBpb2MgKiBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCmluZGV4IGFlODRhMTAxLi4wNjM5ZWMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaHAvc2ltL3NpbWV0aC5jCisrKyBiL2FyY2gvaWE2NC9ocC9zaW0vc2ltZXRoLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBzaW1ldGhfbG9jYWwgKmxvY2FsOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGZkLCBpLCBlcnI7CisJaW50IGZkLCBpLCBlcnIsIHJjOwogCiAJLyoKIAkgKiBYWFggRml4IG1lCkBAIC0yMjgsNyArMjI4LDkgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlkZXYtPmlycSA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwlpZiAoKHJjID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pKSA8IDApCisJCXBhbmljKCIlczogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzIVxuIiwgX19GVU5DVElPTl9fKTsKKwlkZXYtPmlycSA9IHJjOwogCiAJLyoKIAkgKiBhdHRhY2ggdGhlIGludGVycnVwdCBpbiB0aGUgc2ltdWxhdG9yLCB0aGlzIGRvZXMgZW5hYmxlIGludGVycnVwdHMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMgYi9hcmNoL2lhNjQvaHAvc2ltL3NpbXNlcmlhbC5jCmluZGV4IDc4NmU3MDcuLjdkY2I4NTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vc2ltc2VyaWFsLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9zaW1zZXJpYWwuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbFAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNycS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KQEAgLTE0OSwxMiArMTUwLDE3IEBACiAJCQkJc2Vlbl9lc2MgPSAyOwogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIGlmICggc2Vlbl9lc2MgPT0gMiApIHsKLQkJCQlpZiAoIGNoID09ICdQJyApIHNob3dfc3RhdGUoKTsJCS8qIEYxIGtleSAqLwotI2lmZGVmIENPTkZJR19LREIKLQkJCQlpZiAoIGNoID09ICdTJyApCi0JCQkJCWtkYihLREJfUkVBU09OX0tFWUJPQVJELCAwLCAoa2RiX2VmcmFtZV90KSByZWdzKTsKKwkJCQlpZiAoIGNoID09ICdQJyApIC8qIEYxICovCisJCQkJCXNob3dfc3RhdGUoKTsKKyNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKKwkJCQlpZiAoIGNoID09ICdTJyApIHsgLyogRjQgKi8KKwkJCQkJZG8KKwkJCQkJCWNoID0gaWE2NF9zc2MoMCwgMCwgMCwgMCwKKwkJCQkJCQkgICAgICBTU0NfR0VUQ0hBUik7CisJCQkJCXdoaWxlICghY2gpOworCQkJCQloYW5kbGVfc3lzcnEoY2gsIHJlZ3MsIE5VTEwpOworCQkJCX0KICNlbmRpZgotCiAJCQkJc2Vlbl9lc2MgPSAwOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtOTc2LDcgKzk4Miw3IEBACiBzdGF0aWMgaW50IF9faW5pdAogc2ltcnNfaW5pdCAodm9pZCkKIHsKLQlpbnQJCQlpOworCWludAkJCWksIHJjOwogCXN0cnVjdCBzZXJpYWxfc3RhdGUJKnN0YXRlOwogCiAJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJocHNpbSIpKQpAQCAtMTAxMSw3ICsxMDE3LDEwIEBACiAJCWlmIChzdGF0ZS0+dHlwZSA9PSBQT1JUX1VOS05PV04pIGNvbnRpbnVlOwogCiAJCWlmICghc3RhdGUtPmlycSkgewotCQkJc3RhdGUtPmlycSA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwkJCWlmICgocmMgPSBhc3NpZ25faXJxX3ZlY3RvcihBVVRPX0FTU0lHTikpIDwgMCkKKwkJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsCisJCQkJICAgICAgX19GVU5DVElPTl9fKTsKKwkJCXN0YXRlLT5pcnEgPSByYzsKIAkJCWlhNjRfc3NjX2Nvbm5lY3RfaXJxKEtFWUJPQVJEX0lOVFIsIHN0YXRlLT5pcnEpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGIyZTJmNjUuLmUxZmI2OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogb2JqLSQoQ09ORklHX0lPU0FQSUMpCQkrPSBpb3NhcGljLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBib290Lm8gZG9tYWluLm8KK29iai0kKENPTkZJR19OVU1BKQkJKz0gbnVtYS5vCiBvYmotJChDT05GSUdfUEVSRk1PTikJCSs9IHBlcmZtb25fZGVmYXVsdF9zbXBsLm8KIG9iai0kKENPTkZJR19JQTY0X0NZQ0xPTkUpCSs9IGN5Y2xvbmUubwogb2JqLSQoQ09ORklHX0lBNjRfTUNBX1JFQ09WRVJZKQkrPSBtY2FfcmVjb3ZlcnkubwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwppbmRleCA3MmRmZDllLi45NjA5ZjI0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FjcGkuYwpAQCAtMTEsNiArMTEsNyBAQAogICogIENvcHlyaWdodCAoQykgMjAwMSBKZW5uYSBIYWxsIDxqZW5uYS5zLmhhbGxAaW50ZWwuY29tPgogICogIENvcHlyaWdodCAoQykgMjAwMSBUYWtheW9zaGkgS29jaGkgPHQta29jaGlAYnEuanAubmVjLmNvbT4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgRXJpY2ggRm9jaHQgPGVmb2NodEBlc3MubmVjLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwNCBBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+CiAgKgogICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KICAqCkBAIC02Nyw2ICs2OCwxMSBAQAogdW5zaWduZWQgY2hhciBhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAxOwogdW5zaWduZWQgY2hhciBhY3BpX2xlZ2FjeV9kZXZpY2VzOwogCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdGRhdGEgYWNwaV9tYWR0X3JldjsKKwordW5zaWduZWQgaW50IGFjcGlfY3BlaV9vdmVycmlkZTsKK3Vuc2lnbmVkIGludCBhY3BpX2NwZWlfcGh5c19jcHVpZDsKKwogI2RlZmluZSBNQVhfU0FQSUNTIDI1NgogdTE2IGlhNjRfYWNwaWlkX3RvX3NhcGljaWRbTUFYX1NBUElDU10gPQogCXsgWzAgLi4uIE1BWF9TQVBJQ1MgLSAxXSA9IC0xIH07CkBAIC0yMzYsOSArMjQyLDcgQEAKIAlpZiAoQkFEX01BRFRfRU5UUlkoaW9zYXBpYywgZW5kKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpb3NhcGljX2luaXQoaW9zYXBpYy0+YWRkcmVzcywgaW9zYXBpYy0+Z2xvYmFsX2lycV9iYXNlKTsKLQotCXJldHVybiAwOworCXJldHVybiBpb3NhcGljX2luaXQoaW9zYXBpYy0+YWRkcmVzcywgaW9zYXBpYy0+Z2xvYmFsX2lycV9iYXNlKTsKIH0KIAogCkBAIC0yNjcsMTAgKzI3MSw1NiBAQAogCQkJCQkJKHBsaW50c3JjLT5mbGFncy50cmlnZ2VyID09IDEpID8gSU9TQVBJQ19FREdFIDogSU9TQVBJQ19MRVZFTCk7CiAKIAlwbGF0Zm9ybV9pbnRyX2xpc3RbcGxpbnRzcmMtPnR5cGVdID0gdmVjdG9yOworCWlmIChhY3BpX21hZHRfcmV2ID4gMSkgeworCQlhY3BpX2NwZWlfb3ZlcnJpZGUgPSBwbGludHNyYy0+cGxpbnRfZmxhZ3MuY3BlaV9vdmVycmlkZV9mbGFnOworCX0KKworCS8qCisJICogU2F2ZSB0aGUgcGh5c2ljYWwgaWQsIHNvIHdlIGNhbiBjaGVjayB3aGVuIGl0cyBiZWluZyByZW1vdmVkCisJICovCisJYWNwaV9jcGVpX3BoeXNfY3B1aWQgPSAoKHBsaW50c3JjLT5pZCA8PCA4KSB8IChwbGludHNyYy0+ZWlkKSkgJiAweGZmZmY7CisKIAlyZXR1cm4gMDsKIH0KIAogCit1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCkKK3sKKwlleHRlcm4gaW50IGNwZV92ZWN0b3I7CisKKwkvKgorCSAqIE9ubHkgaWYgQ1BFSSBpcyBzdXBwb3J0ZWQgYW5kIHRoZSBvdmVycmlkZSBmbGFnCisJICogaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGF0IGl0cyByZS10YXJnZXR0YWJsZQorCSAqIGlmIHdlIGFyZSBpbiBwb2xsaW5nIG1vZGUuCisJICovCisJaWYgKGNwZV92ZWN0b3IgPiAwICYmICFhY3BpX2NwZWlfb3ZlcnJpZGUpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGludCBpc19jcHVfY3BlaV90YXJnZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgbG9naWNhbF9pZDsKKworCWxvZ2ljYWxfaWQgPSBjcHVfbG9naWNhbF9pZChhY3BpX2NwZWlfcGh5c19jcHVpZCk7CisKKwlpZiAobG9naWNhbF9pZCA9PSBjcHUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2V0X2NwZWlfdGFyZ2V0X2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWFjcGlfY3BlaV9waHlzX2NwdWlkID0gY3B1X3BoeXNpY2FsX2lkKGNwdSk7Cit9CisKK3Vuc2lnbmVkIGludCBnZXRfY3BlaV90YXJnZXRfY3B1KHZvaWQpCit7CisJcmV0dXJuIGFjcGlfY3BlaV9waHlzX2NwdWlkOworfQorCiBzdGF0aWMgaW50IF9faW5pdAogYWNwaV9wYXJzZV9pbnRfc3JjX292ciAoCiAJYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCkBAIC0zMjgsNiArMzc4LDggQEAKIAogCWFjcGlfbWFkdCA9IChzdHJ1Y3QgYWNwaV90YWJsZV9tYWR0ICopIF9fdmEocGh5c19hZGRyKTsKIAorCWFjcGlfbWFkdF9yZXYgPSBhY3BpX21hZHQtPmhlYWRlci5yZXZpc2lvbjsKKwogCS8qIHJlbWVtYmVyIHRoZSB2YWx1ZSBmb3IgcmVmZXJlbmNlIGFmdGVyIGZyZWVfaW5pdG1lbSgpICovCiAjaWZkZWYgQ09ORklHX0lUQU5JVU0KIAloYXNfODI1OSA9IDE7IC8qIEZpcm13YXJlIG9uIG9sZCBJdGFuaXVtIHN5c3RlbXMgaXMgYnJva2VuICovCkBAIC02NDIsOSArNjk0LDExIEBACiAJCQlpZiAoc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdICE9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQkJCW5vZGVfY3B1aWRbaSsrXS5waHlzX2lkID0gc21wX2Jvb3RfZGF0YS5jcHVfcGh5c19pZFtjcHVdOwogCX0KLQlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKICMgZW5kaWYKICNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKKwlidWlsZF9jcHVfdG9fbm9kZV9tYXAoKTsKKyNlbmRpZgogCS8qIE1ha2UgYm9vdC11cCBsb29rIHByZXR0eSAqLwogCXByaW50ayhLRVJOX0lORk8gIiVkIENQVXMgYXZhaWxhYmxlLCAlZCBDUFVzIHRvdGFsXG4iLCBhdmFpbGFibGVfY3B1cywgdG90YWxfY3B1cyk7CiAJcmV0dXJuIDA7CkBAIC03NzIsNyArODI2LDcgQEAKICAKIAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLWFjcGlfc3RhdHVzIF9faW5pdAorYWNwaV9zdGF0dXMgX19kZXZpbml0CiBhY3BpX21hcF9pb3NhcGljIChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBkZXB0aCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKQEAgLTgyNSw0ICs4NzksMjggQEAKIAlyZXR1cm4gQUVfT0s7CiB9CiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KKworaW50CithY3BpX3JlZ2lzdGVyX2lvYXBpYyAoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gaW9zYXBpY19pbml0KHBoeXNfYWRkciwgZ3NpX2Jhc2UpKSkKKwkJcmV0dXJuIGVycjsKKworI2lmIENPTkZJR19BQ1BJX05VTUEKKwlhY3BpX21hcF9pb3NhcGljKGhhbmRsZSwgMCwgTlVMTCwgTlVMTCk7CisjZW5kaWYgLyogQ09ORklHX0FDUElfTlVNQSAqLworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfcmVnaXN0ZXJfaW9hcGljKTsKKworaW50CithY3BpX3VucmVnaXN0ZXJfaW9hcGljIChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBnc2lfYmFzZSkKK3sKKwlyZXR1cm4gaW9zYXBpY19yZW1vdmUoZ3NpX2Jhc2UpOworfQorRVhQT1JUX1NZTUJPTChhY3BpX3VucmVnaXN0ZXJfaW9hcGljKTsKKwogI2VuZGlmIC8qIENPTkZJR19BQ1BJX0JPT1QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMgYi9hcmNoL2lhNjQva2VybmVsL2RvbWFpbi5jCmluZGV4IGZlNTMyYzkuLmQ2NWU4N2IgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZG9tYWluLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9kb21haW4uYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KIAotI2RlZmluZSBTRF9OT0RFU19QRVJfRE9NQUlOIDYKKyNkZWZpbmUgU0RfTk9ERVNfUEVSX0RPTUFJTiAxNgogCiAjaWZkZWYgQ09ORklHX05VTUEKIC8qKgpAQCAtMjcsNyArMjcsNyBAQAogICoKICAqIFNob3VsZCB1c2Ugbm9kZW1hc2tfdC4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqdXNlZF9ub2RlcykKK3N0YXRpYyBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyAqdXNlZF9ub2RlcykKIHsKIAlpbnQgaSwgbiwgdmFsLCBtaW5fdmFsLCBiZXN0X25vZGUgPSAwOwogCkBAIC02Niw3ICs2Niw3IEBACiAgKiBzaG91bGQgYmUgb25lIHRoYXQgcHJldmVudHMgdW5uZWNlc3NhcnkgYmFsYW5jaW5nLCBidXQgYWxzbyBzcHJlYWRzIHRhc2tzCiAgKiBvdXQgb3B0aW1hbGx5LgogICovCi1zdGF0aWMgY3B1bWFza190IF9fZGV2aW5pdCBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGludCBub2RlKQorc3RhdGljIGNwdW1hc2tfdCBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGludCBub2RlKQogewogCWludCBpOwogCWNwdW1hc2tfdCBzcGFuLCBub2RlbWFzazsKQEAgLTk2LDcgKzk2LDcgQEAKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgY3B1X2RvbWFpbnMpOwogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9jcHVzW05SX0NQVVNdOwotc3RhdGljIGludCBfX2RldmluaXQgY3B1X3RvX2NwdV9ncm91cChpbnQgY3B1KQorc3RhdGljIGludCBjcHVfdG9fY3B1X2dyb3VwKGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdTsKIH0KQEAgLTEwNCw3ICsxMDQsNyBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgcGh5c19kb21haW5zKTsKIHN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfcGh5c1tOUl9DUFVTXTsKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNwdV90b19waHlzX2dyb3VwKGludCBjcHUpCitzdGF0aWMgaW50IGNwdV90b19waHlzX2dyb3VwKGludCBjcHUpCiB7CiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAogCXJldHVybiBmaXJzdF9jcHUoY3B1X3NpYmxpbmdfbWFwW2NwdV0pOwpAQCAtMTI1LDQ0ICsxMjUsMzYgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluLCBhbGxub2Rlc19kb21haW5zKTsKIHN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfYWxsbm9kZXNbTUFYX05VTU5PREVTXTsKIAotc3RhdGljIGludCBfX2RldmluaXQgY3B1X3RvX2FsbG5vZGVzX2dyb3VwKGludCBjcHUpCitzdGF0aWMgaW50IGNwdV90b19hbGxub2Rlc19ncm91cChpbnQgY3B1KQogewogCXJldHVybiBjcHVfdG9fbm9kZShjcHUpOwogfQogI2VuZGlmCiAKIC8qCi0gKiBTZXQgdXAgc2NoZWR1bGVyIGRvbWFpbnMgYW5kIGdyb3Vwcy4gIENhbGxlcnMgbXVzdCBob2xkIHRoZSBob3RwbHVnIGxvY2suCisgKiBCdWlsZCBzY2hlZCBkb21haW5zIGZvciBhIGdpdmVuIHNldCBvZiBjcHVzIGFuZCBhdHRhY2ggdGhlIHNjaGVkIGRvbWFpbnMKKyAqIHRvIHRoZSBpbmRpdmlkdWFsIGNwdXMKICAqLwotdm9pZCBfX2RldmluaXQgYXJjaF9pbml0X3NjaGVkX2RvbWFpbnModm9pZCkKK3ZvaWQgYnVpbGRfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCiB7CiAJaW50IGk7Ci0JY3B1bWFza190IGNwdV9kZWZhdWx0X21hcDsKIAogCS8qCi0JICogU2V0dXAgbWFzayBmb3IgY3B1cyB3aXRob3V0IHNwZWNpYWwgY2FzZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cy4KLQkgKiBGb3Igbm93IHRoaXMganVzdCBleGNsdWRlcyBpc29sYXRlZCBjcHVzLCBidXQgY291bGQgYmUgdXNlZCB0bwotCSAqIGV4Y2x1ZGUgb3RoZXIgc3BlY2lhbCBjYXNlcyBpbiB0aGUgZnV0dXJlLgorCSAqIFNldCB1cCBkb21haW5zIGZvciBjcHVzIHNwZWNpZmllZCBieSB0aGUgY3B1X21hcC4KIAkgKi8KLQljcHVzX2NvbXBsZW1lbnQoY3B1X2RlZmF1bHRfbWFwLCBjcHVfaXNvbGF0ZWRfbWFwKTsKLQljcHVzX2FuZChjcHVfZGVmYXVsdF9tYXAsIGNwdV9kZWZhdWx0X21hcCwgY3B1X29ubGluZV9tYXApOwotCi0JLyoKLQkgKiBTZXQgdXAgZG9tYWlucy4gSXNvbGF0ZWQgZG9tYWlucyBqdXN0IHN0YXkgb24gdGhlIGR1bW15IGRvbWFpbi4KLQkgKi8KLQlmb3JfZWFjaF9jcHVfbWFzayhpLCBjcHVfZGVmYXVsdF9tYXApIHsKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewogCQlpbnQgZ3JvdXA7CiAJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gTlVMTCwgKnA7CiAJCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhjcHVfdG9fbm9kZShpKSk7CiAKLQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJCWlmIChudW1fb25saW5lX2NwdXMoKQogCQkJCT4gU0RfTk9ERVNfUEVSX0RPTUFJTipjcHVzX3dlaWdodChub2RlbWFzaykpIHsKIAkJCXNkID0gJnBlcl9jcHUoYWxsbm9kZXNfZG9tYWlucywgaSk7CiAJCQkqc2QgPSBTRF9BTExOT0RFU19JTklUOwotCQkJc2QtPnNwYW4gPSBjcHVfZGVmYXVsdF9tYXA7CisJCQlzZC0+c3BhbiA9ICpjcHVfbWFwOwogCQkJZ3JvdXAgPSBjcHVfdG9fYWxsbm9kZXNfZ3JvdXAoaSk7CiAJCQlzZC0+Z3JvdXBzID0gJnNjaGVkX2dyb3VwX2FsbG5vZGVzW2dyb3VwXTsKIAkJCXAgPSBzZDsKQEAgLTE3Myw3ICsxNjUsNyBAQAogCQkqc2QgPSBTRF9OT0RFX0lOSVQ7CiAJCXNkLT5zcGFuID0gc2NoZWRfZG9tYWluX25vZGVfc3BhbihjcHVfdG9fbm9kZShpKSk7CiAJCXNkLT5wYXJlbnQgPSBwOwotCQljcHVzX2FuZChzZC0+c3Bhbiwgc2QtPnNwYW4sIGNwdV9kZWZhdWx0X21hcCk7CisJCWNwdXNfYW5kKHNkLT5zcGFuLCBzZC0+c3BhbiwgKmNwdV9tYXApOwogI2VuZGlmCiAKIAkJcCA9IHNkOwpAQCAtMTkwLDcgKzE4Miw3IEBACiAJCWdyb3VwID0gY3B1X3RvX2NwdV9ncm91cChpKTsKIAkJKnNkID0gU0RfU0lCTElOR19JTklUOwogCQlzZC0+c3BhbiA9IGNwdV9zaWJsaW5nX21hcFtpXTsKLQkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZChzZC0+c3Bhbiwgc2QtPnNwYW4sICpjcHVfbWFwKTsKIAkJc2QtPnBhcmVudCA9IHA7CiAJCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfY3B1c1tncm91cF07CiAjZW5kaWYKQEAgLTE5OCw5ICsxOTAsOSBAQAogCiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAogCS8qIFNldCB1cCBDUFUgKHNpYmxpbmcpIGdyb3VwcyAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGksIGNwdV9kZWZhdWx0X21hcCkgeworCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7CiAJCWNwdW1hc2tfdCB0aGlzX3NpYmxpbmdfbWFwID0gY3B1X3NpYmxpbmdfbWFwW2ldOwotCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCAqY3B1X21hcCk7CiAJCWlmIChpICE9IGZpcnN0X2NwdSh0aGlzX3NpYmxpbmdfbWFwKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yMTMsNyArMjA1LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKIAkJY3B1bWFza190IG5vZGVtYXNrID0gbm9kZV90b19jcHVtYXNrKGkpOwogCi0JCWNwdXNfYW5kKG5vZGVtYXNrLCBub2RlbWFzaywgY3B1X2RlZmF1bHRfbWFwKTsKKwkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7CiAJCWlmIChjcHVzX2VtcHR5KG5vZGVtYXNrKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yMjIsNyArMjE0LDcgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfTlVNQQotCWluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHNjaGVkX2dyb3VwX2FsbG5vZGVzLCBjcHVfZGVmYXVsdF9tYXAsCisJaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc2NoZWRfZ3JvdXBfYWxsbm9kZXMsICpjcHVfbWFwLAogCQkJCSZjcHVfdG9fYWxsbm9kZXNfZ3JvdXApOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CkBAIC0yMzMsMTIgKzIyNSwxMiBAQAogCQljcHVtYXNrX3QgY292ZXJlZCA9IENQVV9NQVNLX05PTkU7CiAJCWludCBqOwogCi0JCWNwdXNfYW5kKG5vZGVtYXNrLCBub2RlbWFzaywgY3B1X2RlZmF1bHRfbWFwKTsKKwkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7CiAJCWlmIChjcHVzX2VtcHR5KG5vZGVtYXNrKSkKIAkJCWNvbnRpbnVlOwogCiAJCWRvbWFpbnNwYW4gPSBzY2hlZF9kb21haW5fbm9kZV9zcGFuKGkpOwotCQljcHVzX2FuZChkb21haW5zcGFuLCBkb21haW5zcGFuLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZChkb21haW5zcGFuLCBkb21haW5zcGFuLCAqY3B1X21hcCk7CiAKIAkJc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXApLCBHRlBfS0VSTkVMKTsKIAkJc2NoZWRfZ3JvdXBfbm9kZXNbaV0gPSBzZzsKQEAgLTI2Niw3ICsyNTgsNyBAQAogCQkJaW50IG4gPSAoaSArIGopICUgTUFYX05VTU5PREVTOwogCiAJCQljcHVzX2NvbXBsZW1lbnQobm90Y292ZXJlZCwgY292ZXJlZCk7Ci0JCQljcHVzX2FuZCh0bXAsIG5vdGNvdmVyZWQsIGNwdV9kZWZhdWx0X21hcCk7CisJCQljcHVzX2FuZCh0bXAsIG5vdGNvdmVyZWQsICpjcHVfbWFwKTsKIAkJCWNwdXNfYW5kKHRtcCwgdG1wLCBkb21haW5zcGFuKTsKIAkJCWlmIChjcHVzX2VtcHR5KHRtcCkpCiAJCQkJYnJlYWs7CkBAIC0yOTMsNyArMjg1LDcgQEAKICNlbmRpZgogCiAJLyogQ2FsY3VsYXRlIENQVSBwb3dlciBmb3IgcGh5c2ljYWwgcGFja2FnZXMgYW5kIG5vZGVzICovCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X2RlZmF1bHRfbWFwKSB7CisJZm9yX2VhY2hfY3B1X21hc2soaSwgKmNwdV9tYXApIHsKIAkJaW50IHBvd2VyOwogCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCkBAIC0zNTksMTMgKzM1MSwzNSBAQAogCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgaSk7CiAJfQogfQorLyoKKyAqIFNldCB1cCBzY2hlZHVsZXIgZG9tYWlucyBhbmQgZ3JvdXBzLiAgQ2FsbGVycyBtdXN0IGhvbGQgdGhlIGhvdHBsdWcgbG9jay4KKyAqLwordm9pZCBhcmNoX2luaXRfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApCit7CisJY3B1bWFza190IGNwdV9kZWZhdWx0X21hcDsKIAotdm9pZCBfX2RldmluaXQgYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnModm9pZCkKKwkvKgorCSAqIFNldHVwIG1hc2sgZm9yIGNwdXMgd2l0aG91dCBzcGVjaWFsIGNhc2Ugc2NoZWR1bGluZyByZXF1aXJlbWVudHMuCisJICogRm9yIG5vdyB0aGlzIGp1c3QgZXhjbHVkZXMgaXNvbGF0ZWQgY3B1cywgYnV0IGNvdWxkIGJlIHVzZWQgdG8KKwkgKiBleGNsdWRlIG90aGVyIHNwZWNpYWwgY2FzZXMgaW4gdGhlIGZ1dHVyZS4KKwkgKi8KKwljcHVzX2FuZG5vdChjcHVfZGVmYXVsdF9tYXAsICpjcHVfbWFwLCBjcHVfaXNvbGF0ZWRfbWFwKTsKKworCWJ1aWxkX3NjaGVkX2RvbWFpbnMoJmNwdV9kZWZhdWx0X21hcCk7Cit9CisKK3ZvaWQgYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQogewogI2lmZGVmIENPTkZJR19OVU1BCiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKSB7CisJCWNwdW1hc2tfdCBub2RlbWFzayA9IG5vZGVfdG9fY3B1bWFzayhpKTsKIAkJc3RydWN0IHNjaGVkX2dyb3VwICpvbGRzZywgKnNnID0gc2NoZWRfZ3JvdXBfbm9kZXNbaV07CisKKwkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7CisJCWlmIChjcHVzX2VtcHR5KG5vZGVtYXNrKSkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChzZyA9PSBOVUxMKQogCQkJY29udGludWU7CiAJCXNnID0gc2ctPm5leHQ7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKaW5kZXggYjFkNWQzZC4uYmI5YTUwNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwpAQCAtNDcwLDE4ICs0NzAsNiBAQAogCWJyLmNvbmQuc3B0ay5tYW55IGI3CiBFTkQobG9hZF9zd2l0Y2hfc3RhY2spCiAKLUdMT0JBTF9FTlRSWShfX2lhNjRfc3lzY2FsbCkKLQkucmVnc3RrIDYsMCwwLDAKLQltb3YgcjE1PWluNQkJCQkvLyBwdXQgc3lzY2FsbCBudW1iZXIgaW4gcGxhY2UKLQlicmVhayBfX0JSRUFLX1NZU0NBTEwKLQltb3ZsIHIyPWVycm5vCi0JY21wLmVxIHA2LHA3PS0xLHIxMAotCTs7Ci0ocDYpCXN0NCBbcjJdPXI4Ci0ocDYpCW1vdiByOD0tMQotCWJyLnJldC5zcHRrLm1hbnkgcnAKLUVORChfX2lhNjRfc3lzY2FsbCkKLQogR0xPQkFMX0VOVFJZKGV4ZWN2ZSkKIAltb3YgcjE1PV9fTlJfZXhlY3ZlCQkJLy8gcHV0IHN5c2NhbGwgbnVtYmVyIGluIHBsYWNlCiAJYnJlYWsgX19CUkVBS19TWVNDQUxMCkBAIC02MzcsNyArNjI1LDcgQEAKICAqCSAgICAgIHI4LXIxMTogcmVzdG9yZWQgKHN5c2NhbGwgcmV0dXJuIHZhbHVlKHMpKQogICoJCSByMTI6IHJlc3RvcmVkICh1c2VyLWxldmVsIHN0YWNrIHBvaW50ZXIpCiAgKgkJIHIxMzogcmVzdG9yZWQgKHVzZXItbGV2ZWwgdGhyZWFkIHBvaW50ZXIpCi0gKgkJIHIxNDogY2xlYXJlZAorICoJCSByMTQ6IHNldCB0byBfX2tlcm5lbF9zeXNjYWxsX3ZpYV9lcGMKICAqCQkgcjE1OiByZXN0b3JlZCAoc3lzY2FsbCAjKQogICoJICAgICByMTYtcjE3OiBjbGVhcmVkCiAgKgkJIHIxODogdXNlci1sZXZlbCBiNgpAQCAtNjU4LDcgKzY0Niw3IEBACiAgKgkJICBwcjogcmVzdG9yZWQgKHVzZXItbGV2ZWwgcHIpCiAgKgkJICBiMDogcmVzdG9yZWQgKHVzZXItbGV2ZWwgcnApCiAgKgkgICAgICAgICAgYjY6IHJlc3RvcmVkCi0gKgkJICBiNzogY2xlYXJlZAorICoJCSAgYjc6IHNldCB0byBfX2tlcm5lbF9zeXNjYWxsX3ZpYV9lcGMKICAqCSAgICAgYXIudW5hdDogcmVzdG9yZWQgKHVzZXItbGV2ZWwgYXIudW5hdCkKICAqCSAgICAgIGFyLnBmczogcmVzdG9yZWQgKHVzZXItbGV2ZWwgYXIucGZzKQogICoJICAgICAgYXIucnNjOiByZXN0b3JlZCAodXNlci1sZXZlbCBhci5yc2MpCkBAIC03MDQsNzIgKzY5Miw3OSBAQAogCTs7CiAocDYpCWxkNCByMzE9W3IxOF0JCQkJLy8gbG9hZCBjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzCiAJbGQ4IHIxOT1bcjJdLFBUKEI2KS1QVChMT0FEUlMpCQkvLyBsb2FkIGFyLnJzYyB2YWx1ZSBmb3IgImxvYWRycyIKLQltb3YgYjc9cjAJCS8vIGNsZWFyIGI3CisJbm9wLmkgMAogCTs7Ci0JbGQ4IHIyMz1bcjNdLFBUKFIxMSktUFQoQVJfQlNQU1RPUkUpCS8vIGxvYWQgYXIuYnNwc3RvcmUgKG1heSBiZSBnYXJiYWdlKQorCW1vdiByMTY9YXIuYnNwCQkJCS8vIE0yICBnZXQgZXhpc3RpbmcgYmFja2luZyBzdG9yZSBwb2ludGVyCiAJbGQ4IHIxOD1bcjJdLFBUKFI5KS1QVChCNikJCS8vIGxvYWQgYjYKIChwNikJYW5kIHIxNT1USUZfV09SS19NQVNLLHIzMQkJLy8gYW55IHdvcmsgb3RoZXIgdGhhbiBUSUZfU1lTQ0FMTF9UUkFDRT8KIAk7OwotCW1vdiByMTY9YXIuYnNwCQkJCS8vIE0yICBnZXQgZXhpc3RpbmcgYmFja2luZyBzdG9yZSBwb2ludGVyCisJbGQ4IHIyMz1bcjNdLFBUKFIxMSktUFQoQVJfQlNQU1RPUkUpCS8vIGxvYWQgYXIuYnNwc3RvcmUgKG1heSBiZSBnYXJiYWdlKQogKHA2KQljbXA0Lm5lLnVuYyBwNixwMD1yMTUsIHIwCQkvLyBhbnkgc3BlY2lhbCB3b3JrIHBlbmRpbmc/CiAocDYpCWJyLmNvbmQuc3BudCAud29ya19wZW5kaW5nX3N5c2NhbGwKIAk7OwogCS8vIHN0YXJ0IHJlc3RvcmluZyB0aGUgc3RhdGUgc2F2ZWQgb24gdGhlIGtlcm5lbCBzdGFjayAoc3RydWN0IHB0X3JlZ3MpOgogCWxkOCByOT1bcjJdLFBUKENSX0lQU1IpLVBUKFI5KQogCWxkOCByMTE9W3IzXSxQVChDUl9JSVApLVBUKFIxMSkKLQltb3YgZjY9ZjAJCS8vIGNsZWFyIGY2CisocE5vblN5cykgYnJlYWsgMAkJLy8gICAgICBidWcgY2hlY2s6IHdlIHNob3VsZG4ndCBiZSBoZXJlIGlmIHBOb25TeXMgaXMgVFJVRSEKIAk7OwogCWludmFsYQkJCS8vIE0wfDEgaW52YWxpZGF0ZSBBTEFUCi0JcnNtIHBzci5pIHwgcHNyLmljCS8vIE0yIGluaXRpYXRlIHR1cm5pbmcgb2ZmIG9mIGludGVycnVwdCBhbmQgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24KLQltb3YgZjk9ZjAJCS8vIGNsZWFyIGY5CisJcnNtIHBzci5pIHwgcHNyLmljCS8vIE0yICAgdHVybiBvZmYgaW50ZXJydXB0cyBhbmQgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24KKwljbXAuZXEgcDkscDA9cjAscjAJLy8gQSAgICBzZXQgcDkgdG8gaW5kaWNhdGUgdGhhdCB3ZSBzaG91bGQgcmVzdG9yZSBjci5pZnMKIAotCWxkOCByMjk9W3IyXSwxNgkJLy8gbG9hZCBjci5pcHNyCi0JbGQ4IHIyOD1bcjNdLDE2CQkJLy8gbG9hZCBjci5paXAKLQltb3YgZjg9ZjAJCS8vIGNsZWFyIGY4CisJbGQ4IHIyOT1bcjJdLDE2CQkvLyBNMHwxIGxvYWQgY3IuaXBzcgorCWxkOCByMjg9W3IzXSwxNgkJLy8gTTB8MSBsb2FkIGNyLmlpcAorCW1vdiByMjI9cjAJCS8vIEEgICAgY2xlYXIgcjIyCiAJOzsKIAlsZDggcjMwPVtyMl0sMTYJCS8vIE0wfDEgbG9hZCBjci5pZnMKIAlsZDggcjI1PVtyM10sMTYJCS8vIE0wfDEgbG9hZCBhci51bmF0Ci0JY21wLmVxIHA5LHAwPXIwLHIwCS8vIHNldCBwOSB0byBpbmRpY2F0ZSB0aGF0IHdlIHNob3VsZCByZXN0b3JlIGNyLmlmcwotCTs7Ci0JbGQ4IHIyNj1bcjJdLFBUKEIwKS1QVChBUl9QRlMpCS8vIE0wfDEgbG9hZCBhci5wZnMKLShwS1N0aykJbW92IHIyMj1wc3IJCS8vIE0yIHJlYWQgUFNSIG5vdyB0aGF0IGludGVycnVwdHMgYXJlIGRpc2FibGVkCi0JbW92IGYxMD1mMAkJLy8gY2xlYXIgZjEwCi0JOzsKLQlsZDggcjIxPVtyMl0sUFQoQVJfUk5BVCktUFQoQjApIC8vIGxvYWQgYjAKLQlsZDggcjI3PVtyM10sUFQoUFIpLVBUKEFSX1JTQykJLy8gbG9hZCBhci5yc2MKLQltb3YgZjExPWYwCQkvLyBjbGVhciBmMTEKLQk7OwotCWxkOCByMjQ9W3IyXSxQVChBUl9GUFNSKS1QVChBUl9STkFUKQkvLyBsb2FkIGFyLnJuYXQgKG1heSBiZSBnYXJiYWdlKQotCWxkOCByMzE9W3IzXSxQVChSMSktUFQoUFIpCQkvLyBsb2FkIHByZWRpY2F0ZXMKIChwVVN0aykgYWRkIHIxND1JQTY0X1RBU0tfVEhSRUFEX09OX1VTVEFDS19PRkZTRVQscjEzCiAJOzsKLQlsZDggcjIwPVtyMl0sUFQoUjEyKS1QVChBUl9GUFNSKQkvLyBsb2FkIGFyLmZwc3IKLQlsZDguZmlsbCByMT1bcjNdLDE2CS8vIGxvYWQgcjEKLShwVVN0aykgbW92IHIxNz0xCisJbGQ4IHIyNj1bcjJdLFBUKEIwKS1QVChBUl9QRlMpCS8vIE0wfDEgbG9hZCBhci5wZnMKKyhwS1N0aykJbW92IHIyMj1wc3IJCQkvLyBNMiAgIHJlYWQgUFNSIG5vdyB0aGF0IGludGVycnVwdHMgYXJlIGRpc2FibGVkCisJbm9wIDAKIAk7OwotCXNybHouZAkJCS8vIE0wICBlbnN1cmUgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24gaXMgb2ZmCi0JbGQ4LmZpbGwgcjEzPVtyM10sMTYKLQltb3YgZjc9ZjAJCS8vIGNsZWFyIGY3CisJbGQ4IHIyMT1bcjJdLFBUKEFSX1JOQVQpLVBUKEIwKSAvLyBNMHwxIGxvYWQgYjAKKwlsZDggcjI3PVtyM10sUFQoUFIpLVBUKEFSX1JTQykJLy8gTTB8MSBsb2FkIGFyLnJzYworCW1vdiBmNj1mMAkJCS8vIEYgICAgY2xlYXIgZjYKIAk7OwotCWxkOC5maWxsIHIxMj1bcjJdCS8vIHJlc3RvcmUgcjEyIChzcCkKLQltb3YubSBhci5zc2Q9cjAJCS8vIE0yIGNsZWFyIGFyLnNzZAotCW1vdiByMjI9cjAJCS8vIGNsZWFyIHIyMgorCWxkOCByMjQ9W3IyXSxQVChBUl9GUFNSKS1QVChBUl9STkFUKQkvLyBNMHwxIGxvYWQgYXIucm5hdCAobWF5IGJlIGdhcmJhZ2UpCisJbGQ4IHIzMT1bcjNdLFBUKFIxKS1QVChQUikJCS8vIE0wfDEgbG9hZCBwcmVkaWNhdGVzCisJbW92IGY3PWYwCQkJCS8vIEYgICAgY2xlYXIgZjcKKwk7OworCWxkOCByMjA9W3IyXSxQVChSMTIpLVBUKEFSX0ZQU1IpCS8vIE0wfDEgbG9hZCBhci5mcHNyCisJbGQ4LmZpbGwgcjE9W3IzXSwxNgkJCS8vIE0wfDEgbG9hZCByMQorKHBVU3RrKSBtb3YgcjE3PTEJCQkJLy8gQQorCTs7CisocFVTdGspIHN0MSBbcjE0XT1yMTcJCQkJLy8gTTJ8MworCWxkOC5maWxsIHIxMz1bcjNdLDE2CQkJLy8gTTB8MQorCW1vdiBmOD1mMAkJCQkvLyBGICAgIGNsZWFyIGY4CisJOzsKKwlsZDguZmlsbCByMTI9W3IyXQkJCS8vIE0wfDEgcmVzdG9yZSByMTIgKHNwKQorCWxkOC5maWxsIHIxNT1bcjNdCQkJLy8gTTB8MSByZXN0b3JlIHIxNQorCW1vdiBiNj1yMTgJCQkJLy8gSTAgICByZXN0b3JlIGI2CiAKLQlsZDguZmlsbCByMTU9W3IzXQkvLyByZXN0b3JlIHIxNQotKHBVU3RrKSBzdDEgW3IxNF09cjE3Ci0JYWRkbCByMz1USElTX0NQVShpYTY0X3BoeXNfc3RhY2tlZF9zaXplX3A4KSxyMAotCTs7Ci0ocFVTdGspCWxkNCByMTc9W3IzXQkJLy8gcjE3ID0gY3B1X2RhdGEtPnBoeXNfc3RhY2tlZF9zaXplX3A4Ci0JbW92Lm0gYXIuY3NkPXIwCQkvLyBNMiBjbGVhciBhci5jc2QKLQltb3YgYjY9cjE4CQkvLyBJMCAgcmVzdG9yZSBiNgotCTs7Ci0JbW92IHIxND1yMAkJLy8gY2xlYXIgcjE0Ci0Jc2hyLnUgcjE4PXIxOSwxNgkvLyBJMHwxIGdldCBieXRlIHNpemUgb2YgZXhpc3RpbmcgImRpcnR5IiBwYXJ0aXRpb24KLShwS1N0aykgYnIuY29uZC5kcG50Lm1hbnkgc2tpcF9yYnNfc3dpdGNoCisJYWRkbCByMTc9VEhJU19DUFUoaWE2NF9waHlzX3N0YWNrZWRfc2l6ZV9wOCkscjAgLy8gQQorCW1vdiBmOT1mMAkJCQkJLy8gRiAgICBjbGVhciBmOQorKHBLU3RrKSBici5jb25kLmRwbnQubWFueSBza2lwX3Jic19zd2l0Y2gJCS8vIEIKIAotCW1vdi5tIGFyLmNjdj1yMAkJLy8gY2xlYXIgYXIuY2N2Ci0ocE5vblN5cykgYnIuY29uZC5kcG50Lm1hbnkgZG9udF9wcmVzZXJ2ZV9jdXJyZW50X2ZyYW1lCi0JYnIuY29uZC5zcHRrLm1hbnkgcmJzX3N3aXRjaAorCXNybHouZAkJCQkvLyBNMCAgIGVuc3VyZSBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbiBpcyBvZmYgKGZvciBjb3ZlcikKKwlzaHIudSByMTg9cjE5LDE2CQkvLyBJMHwxIGdldCBieXRlIHNpemUgb2YgZXhpc3RpbmcgImRpcnR5IiBwYXJ0aXRpb24KKwljb3ZlcgkJCQkvLyBCICAgIGFkZCBjdXJyZW50IGZyYW1lIGludG8gZGlydHkgcGFydGl0aW9uICYgc2V0IGNyLmlmcworCTs7CisocFVTdGspIGxkNCByMTc9W3IxN10JCQkvLyBNMHwxIHIxNyA9IGNwdV9kYXRhLT5waHlzX3N0YWNrZWRfc2l6ZV9wOAorCW1vdiByMTk9YXIuYnNwCQkJLy8gTTIgICBnZXQgbmV3IGJhY2tpbmcgc3RvcmUgcG9pbnRlcgorCW1vdiBmMTA9ZjAJCQkvLyBGICAgIGNsZWFyIGYxMAorCisJbm9wLm0gMAorCW1vdmwgcjE0PV9fa2VybmVsX3N5c2NhbGxfdmlhX2VwYyAvLyBYCisJOzsKKwltb3YubSBhci5jc2Q9cjAJCQkvLyBNMiAgIGNsZWFyIGFyLmNzZAorCW1vdi5tIGFyLmNjdj1yMAkJCS8vIE0yICAgY2xlYXIgYXIuY2N2CisJbW92IGI3PXIxNAkJCS8vIEkwICAgY2xlYXIgYjcgKGhpbnQgd2l0aCBfX2tlcm5lbF9zeXNjYWxsX3ZpYV9lcGMpCisKKwltb3YubSBhci5zc2Q9cjAJCQkvLyBNMiAgIGNsZWFyIGFyLnNzZAorCW1vdiBmMTE9ZjAJCQkvLyBGICAgIGNsZWFyIGYxMQorCWJyLmNvbmQuc3B0ay5tYW55IHJic19zd2l0Y2gJLy8gQgogRU5EKGlhNjRfbGVhdmVfc3lzY2FsbCkKIAogI2lmZGVmIENPTkZJR19JQTMyX1NVUFBPUlQKQEAgLTg4NSw3ICs4ODAsNyBAQAogCWxkZi5maWxsIGY3PVtyMl0sUFQoRjExKS1QVChGNykKIAlsZGYuZmlsbCBmOD1bcjNdLDMyCiAJOzsKLQlzcmx6LmkJCQkvLyBlbnN1cmUgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24gaXMgb2ZmCisJc3Jsei5kCS8vIGVuc3VyZSB0aGF0IGludGVyLiBjb2xsZWN0aW9uIGlzIG9mZiAoVkhQVCBpcyBkb24ndCBjYXJlLCBzaW5jZSB0ZXh0IGlzIHBpbm5lZCkKIAltb3YgYXIuY2N2PXIxNQogCTs7CiAJbGRmLmZpbGwgZjExPVtyMl0KQEAgLTk0NSwxMSArOTQwLDEwIEBACiAJICogTk9URTogYWxsb2MsIGxvYWRycywgYW5kIGNvdmVyIGNhbid0IGJlIHByZWRpY2F0ZWQuCiAJICovCiAocE5vblN5cykgYnIuY29uZC5kcG50IGRvbnRfcHJlc2VydmVfY3VycmVudF9mcmFtZQotCi1yYnNfc3dpdGNoOgogCWNvdmVyCQkJCS8vIGFkZCBjdXJyZW50IGZyYW1lIGludG8gZGlydHkgcGFydGl0aW9uIGFuZCBzZXQgY3IuaWZzCiAJOzsKIAltb3YgcjE5PWFyLmJzcAkJCS8vIGdldCBuZXcgYmFja2luZyBzdG9yZSBwb2ludGVyCityYnNfc3dpdGNoOgogCXN1YiByMTY9cjE2LHIxOAkJCS8vIGtyYnMgPSBvbGQgYnNwIC0gc2l6ZSBvZiBkaXJ0eSBwYXJ0aXRpb24KIAljbXAubmUgcDkscDA9cjAscjAJCS8vIGNsZWFyIHA5IHRvIHNraXAgcmVzdG9yZSBvZiBjci5pZnMKIAk7OwpAQCAtMTAyNCwxNCArMTAxOCwxNCBAQAogCW1vdiBsb2M1PTAKIAltb3YgbG9jNj0wCiAJbW92IGxvYzc9MAotKHBSZWN1cnNlKSBici5jYWxsLnNwdGsuZmV3IGIwPXJzZV9jbGVhcl9pbnZhbGlkCisocFJlY3Vyc2UpIGJyLmNhbGwuZHB0ay5mZXcgYjA9cnNlX2NsZWFyX2ludmFsaWQKIAk7OwogCW1vdiBsb2M4PTAKIAltb3YgbG9jOT0wCiAJY21wLm5lIHBSZXR1cm4scDA9cjAsaW4xCS8vIGlmIHJlY3Vyc2lvbiBjb3VudCAhPSAwLCB3ZSBuZWVkIHRvIGRvIGEgYnIucmV0CiAJbW92IGxvYzEwPTAKIAltb3YgbG9jMTE9MAotKHBSZXR1cm4pIGJyLnJldC5zcHRrLm1hbnkgYjAKKyhwUmV0dXJuKSBici5yZXQuZHB0ay5tYW55IGIwCiAjZW5kaWYgLyogIUNPTkZJR19JVEFOSVVNICovCiAjCXVuZGVmIHBSZWN1cnNlCiAjCXVuZGVmIHBSZXR1cm4KQEAgLTEyNTUsNyArMTI0OSw3IEBACiAgCXN0Zi5zcGlsbCBbcjE3XT1mMTEKIAlhZGRzIG91dDA9MTYsc3AJCQkJLy8gb3V0MCA9ICZzaWdzY3JhdGNoCiAJYnIuY2FsbC5zcHRrLm1hbnkgcnA9aWE2NF9ydF9zaWdyZXR1cm4KLS5yZXQxOToJLnJlc3RvcmUgc3AgMAorLnJldDE5OgkucmVzdG9yZSBzcCwwCiAJYWRkcyBzcD0xNixzcAogCTs7CiAJbGQ4IHI5PVtzcF0JCQkJLy8gbG9hZCBuZXcgYXIudW5hdApAQCAtMTU3Nyw4ICsxNTcxLDggQEAKIAlkYXRhOCBzeXNfYWRkX2tleQogCWRhdGE4IHN5c19yZXF1ZXN0X2tleQogCWRhdGE4IHN5c19rZXljdGwKLQlkYXRhOCBzeXNfbmlfc3lzY2FsbAotCWRhdGE4IHN5c19uaV9zeXNjYWxsCQkJLy8gMTI3NQorCWRhdGE4IHN5c19pb3ByaW9fc2V0CisJZGF0YTggc3lzX2lvcHJpb19nZXQJCQkvLyAxMjc1CiAJZGF0YTggc3lzX3NldF96b25lX3JlY2xhaW0KIAlkYXRhOCBzeXNfbmlfc3lzY2FsbAogCWRhdGE4IHN5c19uaV9zeXNjYWxsCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2ZzeXMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCmluZGV4IDk2MmI2YzQuLjdkNzY4NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZnN5cy5TCkBAIC01MzEsOTMgKzUzMSwxMTQgQEAKIAkuYWx0cnAgYjYKIAkuYm9keQogCS8qCi0JICogV2UgZ2V0IGhlcmUgZm9yIHN5c2NhbGxzIHRoYXQgZG9uJ3QgaGF2ZSBhIGxpZ2h0d2VpZ2h0IGhhbmRsZXIuICBGb3IgdGhvc2UsIHdlCi0JICogbmVlZCB0byBidWJibGUgZG93biBpbnRvIHRoZSBrZXJuZWwgYW5kIHRoYXQgcmVxdWlyZXMgc2V0dGluZyB1cCBhIG1pbmltYWwKLQkgKiBwdF9yZWdzIHN0cnVjdHVyZSwgYW5kIGluaXRpYWxpemluZyB0aGUgQ1BVIHN0YXRlIG1vcmUgb3IgbGVzcyBhcyBpZiBhbgotCSAqIGludGVycnVwdGlvbiBoYWQgb2NjdXJyZWQuICBUbyBtYWtlIHN5c2NhbGwtcmVzdGFydHMgd29yaywgd2Ugc2V0dXAgcHRfcmVncwotCSAqIHN1Y2ggdGhhdCBjcl9paXAgcG9pbnRzIHRvIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gaW4gc3lzY2FsbF92aWFfYnJlYWsuCi0JICogRGVjcmVtZW50aW5nIHRoZSBJUCBoZW5jZSB3aWxsIHJlc3RhcnQgdGhlIHN5c2NhbGwgdmlhIGJyZWFrIGFuZCBub3QKLQkgKiBkZWNyZW1lbnRpbmcgSVAgd2lsbCByZXR1cm4gdXMgdG8gdGhlIGNhbGxlciwgYXMgdXN1YWwuICBOb3RlIHRoYXQgd2UgcHJlc2VydmUKLQkgKiB0aGUgdmFsdWUgb2YgcHNyLnBwIHJhdGhlciB0aGFuIGluaXRpYWxpemluZyBpdCBmcm9tIGRjci5wcC4gIFRoaXMgbWFrZXMgaXQKLQkgKiBwb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBmc3lzY2FsbCBleGVjdXRpb24gZnJvbSBvdGhlciBwcml2aWxlZ2VkIGV4ZWN1dGlvbi4KKwkgKiBXZSBnZXQgaGVyZSBmb3Igc3lzY2FsbHMgdGhhdCBkb24ndCBoYXZlIGEgbGlnaHR3ZWlnaHQKKwkgKiBoYW5kbGVyLiAgRm9yIHRob3NlLCB3ZSBuZWVkIHRvIGJ1YmJsZSBkb3duIGludG8gdGhlIGtlcm5lbAorCSAqIGFuZCB0aGF0IHJlcXVpcmVzIHNldHRpbmcgdXAgYSBtaW5pbWFsIHB0X3JlZ3Mgc3RydWN0dXJlLAorCSAqIGFuZCBpbml0aWFsaXppbmcgdGhlIENQVSBzdGF0ZSBtb3JlIG9yIGxlc3MgYXMgaWYgYW4KKwkgKiBpbnRlcnJ1cHRpb24gaGFkIG9jY3VycmVkLiAgVG8gbWFrZSBzeXNjYWxsLXJlc3RhcnRzIHdvcmssCisJICogd2Ugc2V0dXAgcHRfcmVncyBzdWNoIHRoYXQgY3JfaWlwIHBvaW50cyB0byB0aGUgc2Vjb25kCisJICogaW5zdHJ1Y3Rpb24gaW4gc3lzY2FsbF92aWFfYnJlYWsuICBEZWNyZW1lbnRpbmcgdGhlIElQCisJICogaGVuY2Ugd2lsbCByZXN0YXJ0IHRoZSBzeXNjYWxsIHZpYSBicmVhayBhbmQgbm90CisJICogZGVjcmVtZW50aW5nIElQIHdpbGwgcmV0dXJuIHVzIHRvIHRoZSBjYWxsZXIsIGFzIHVzdWFsLgorCSAqIE5vdGUgdGhhdCB3ZSBwcmVzZXJ2ZSB0aGUgdmFsdWUgb2YgcHNyLnBwIHJhdGhlciB0aGFuCisJICogaW5pdGlhbGl6aW5nIGl0IGZyb20gZGNyLnBwLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0bworCSAqIGRpc3Rpbmd1aXNoIGZzeXNjYWxsIGV4ZWN1dGlvbiBmcm9tIG90aGVyIHByaXZpbGVnZWQKKwkgKiBleGVjdXRpb24uCiAJICoKIAkgKiBPbiBlbnRyeToKLQkgKgktIG5vcm1hbCBmc3lzY2FsbCBoYW5kbGVyIHJlZ2lzdGVyIHVzYWdlLCBleGNlcHQgdGhhdCB3ZSBhbHNvIGhhdmU6CisJICoJLSBub3JtYWwgZnN5c2NhbGwgaGFuZGxlciByZWdpc3RlciB1c2FnZSwgZXhjZXB0CisJICoJICB0aGF0IHdlIGFsc28gaGF2ZToKIAkgKgktIHIxODogYWRkcmVzcyBvZiBzeXNjYWxsIGVudHJ5IHBvaW50CiAJICoJLSByMjE6IGFyLmZwc3IKIAkgKgktIHIyNjogYXIucGZzCiAJICoJLSByMjc6IGFyLnJzYwogCSAqCS0gcjI5OiBwc3IKKwkgKgorCSAqIFdlIHVzZWQgdG8gY2xlYXIgc29tZSBQU1IgYml0cyBoZXJlIGJ1dCB0aGF0IHJlcXVpcmVzIHNsb3cKKwkgKiBzZXJpYWxpemF0aW9uLiAgRm9ydHVudGVseSwgdGhhdCBpc24ndCByZWFsbHkgbmVjZXNzYXJ5LgorCSAqIFRoZSByYXRpb25hbGUgaXMgYXMgZm9sbG93czogd2UgdXNlZCB0byBjbGVhciBiaXRzCisJICogflBTUl9QUkVTRVJWRURfQklUUyBpbiBQU1IuTC4gIFNpbmNlCisJICogUFNSX1BSRVNFUlZFRF9CSVRTPT1QU1Iue1VQLE1GTCxNRkgsUEssRFQsUFAsU1AsUlQsSUN9LCB3ZQorCSAqIGVuZGVkIHVwIGNsZWFyaW5nIFBTUi57QkUsQUMsSSxERkwsREZILERJLERCLFNJLFRCfS4KKwkgKiBIb3dldmVyLAorCSAqCisJICogUFNSLkJFIDogYWxyZWFkeSBpcyB0dXJuZWQgb2ZmIGluIF9fa2VybmVsX3N5c2NhbGxfdmlhX2VwYygpCisJICogUFNSLkFDIDogZG9uJ3QgY2FyZSAoa2VybmVsIG5vcm1hbGx5IHR1cm5zIFBTUi5BQyBvbikKKwkgKiBQU1IuSSAgOiBhbHJlYWR5IHR1cm5lZCBvZmYgYnkgdGhlIHRpbWUgZnN5c19idWJibGVfZG93biBnZXRzCisJICoJICAgIGludm9rZWQKKwkgKiBQU1IuREZMOiBhbHdheXMgMCAoa2VybmVsIG5ldmVyIHR1cm5zIGl0IG9uKQorCSAqIFBTUi5ERkg6IGRvbid0IGNhcmUgLS0tIGtlcm5lbCBuZXZlciB0b3VjaGVzIGYzMi1mMTI3IG9uIGl0cyBvd24KKwkgKgkgICAgaW5pdGlhdGl2ZQorCSAqIFBTUi5ESSA6IGFsd2F5cyAwIChrZXJuZWwgbmV2ZXIgdHVybnMgaXQgb24pCisJICogUFNSLlNJIDogYWx3YXlzIDAgKGtlcm5lbCBuZXZlciB0dXJucyBpdCBvbikKKwkgKiBQU1IuREIgOiBkb24ndCBjYXJlIC0tLSBrZXJuZWwgbmV2ZXIgZW5hYmxlcyBrZXJuZWwtbGV2ZWwKKwkgKgkgICAgYnJlYWtwb2ludHMKKwkgKiBQU1IuVEIgOiBtdXN0IGJlIDAgYWxyZWFkeTsgaWYgaXQgd2Fzbid0IHplcm8gb24gZW50cnkgdG8KKwkgKiAgICAgICAgICBfX2tlcm5lbF9zeXNjYWxsX3ZpYV9lcGMsIHRoZSBicmFuY2ggdG8gZnN5c19idWJibGVfZG93bgorCSAqICAgICAgICAgIHdpbGwgdHJpZ2dlciBhIHRha2VuIGJyYW5jaDsgdGhlIHRha2VuLXRyYXAtaGFuZGxlciB0aGVuCisJICogICAgICAgICAgY29udmVydHMgdGhlIHN5c2NhbGwgaW50byBhIGJyZWFrLWJhc2VkIHN5c3RlbS1jYWxsLgogCSAqLwotIwlkZWZpbmUgUFNSX1BSRVNFUlZFRF9CSVRTCShJQTY0X1BTUl9VUCB8IElBNjRfUFNSX01GTCB8IElBNjRfUFNSX01GSCB8IElBNjRfUFNSX1BLIFwKLQkJCQkJIHwgSUE2NF9QU1JfRFQgfCBJQTY0X1BTUl9QUCB8IElBNjRfUFNSX1NQIHwgSUE2NF9QU1JfUlQgXAotCQkJCQkgfCBJQTY0X1BTUl9JQykKIAkvKgotCSAqIFJlYWRpbmcgcHNyLmwgZ2l2ZXMgdXMgb25seSBiaXRzIDAtMzEsIHBzci5pdCwgYW5kIHBzci5tYy4gIFRoZSByZXN0IHdlIGhhdmUKLQkgKiB0byBzeW50aGVzaXplLgorCSAqIFJlYWRpbmcgcHNyLmwgZ2l2ZXMgdXMgb25seSBiaXRzIDAtMzEsIHBzci5pdCwgYW5kIHBzci5tYy4KKwkgKiBUaGUgcmVzdCB3ZSBoYXZlIHRvIHN5bnRoZXNpemUuCiAJICovCi0jCWRlZmluZSBQU1JfT05FX0JJVFMJCSgoMyA8PCBJQTY0X1BTUl9DUEwwX0JJVCkgfCAoMHgxIDw8IElBNjRfUFNSX1JJX0JJVCkgXAorIwlkZWZpbmUgUFNSX09ORV9CSVRTCQkoKDMgPDwgSUE2NF9QU1JfQ1BMMF9CSVQpCVwKKwkJCQkJIHwgKDB4MSA8PCBJQTY0X1BTUl9SSV9CSVQpCVwKIAkJCQkJIHwgSUE2NF9QU1JfQk4gfCBJQTY0X1BTUl9JKQogCi0JaW52YWxhCi0JbW92bCByOD1QU1JfT05FX0JJVFMKKwlpbnZhbGEJCQkJCS8vIE0wfDEKKwltb3ZsIHIxND1pYTY0X3JldF9mcm9tX3N5c2NhbGwJCS8vIFgKIAotCW1vdiByMjU9YXIudW5hdAkJCS8vIHNhdmUgYXIudW5hdCAoNSBjeWMpCi0JbW92bCByOT1QU1JfUFJFU0VSVkVEX0JJVFMKKwlub3AubSAwCisJbW92bCByMjg9X19rZXJuZWxfc3lzY2FsbF92aWFfYnJlYWsJLy8gWAljcmVhdGUgY3IuaWlwCisJOzsKIAotCW1vdiBhci5yc2M9MAkJCS8vIHNldCBlbmZvcmNlZCBsYXp5IG1vZGUsIHBsIDAsIGxpdHRsZS1lbmRpYW4sIGxvYWRycz0wCi0JbW92bCByMjg9X19rZXJuZWxfc3lzY2FsbF92aWFfYnJlYWsKKwltb3YgcjI9cjE2CQkJCS8vIEEgICAgZ2V0IHRhc2sgYWRkciB0byBhZGRsLWFkZHJlc3NhYmxlIHJlZ2lzdGVyCisJYWRkcyByMTY9SUE2NF9UQVNLX1RIUkVBRF9PTl9VU1RBQ0tfT0ZGU0VULHIxNiAvLyBBCisJbW92IHIzMT1wcgkJCQkvLyBJMCAgIHNhdmUgcHIgKDIgY3ljKQogCTs7Ci0JbW92IHIyMz1hci5ic3BzdG9yZQkJLy8gc2F2ZSBhci5ic3BzdG9yZSAoMTIgY3ljKQotCW1vdiByMzE9cHIJCQkvLyBzYXZlIHByICgyIGN5YykKLQltb3YgcjIwPXIxCQkJLy8gc2F2ZSBjYWxsZXIncyBncCBpbiByMjAKKwlzdDEgW3IxNl09cjAJCQkJLy8gTTJ8MyBjbGVhciBjdXJyZW50LT50aHJlYWQub25fdXN0YWNrIGZsYWcKKwlhZGRsIHIyMj1JQTY0X1JCU19PRkZTRVQscjIJCS8vIEEgICAgY29tcHV0ZSBiYXNlIG9mIFJCUworCWFkZCByMz1USV9GTEFHUytJQTY0X1RBU0tfU0laRSxyMgkvLyBBCiAJOzsKLQltb3YgcjI9cjE2CQkJLy8gY29weSBjdXJyZW50IHRhc2sgYWRkciB0byBhZGRsLWFkZHJlc3NhYmxlIHJlZ2lzdGVyCi0JYW5kIHI5PXI5LHIyOQotCW1vdiByMTk9YjYJCQkvLyBzYXZlIGI2ICgyIGN5YykKKwlsZDQgcjM9W3IzXQkJCQkvLyBNMHwxIHIzID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncworCWxmZXRjaC5mYXVsdC5leGNsLm50MSBbcjIyXQkJLy8gTTB8MSBwcmVmZXRjaCByZWdpc3RlciBiYWNraW5nLXN0b3JlCisJbm9wLmkgMAogCTs7Ci0JbW92IHBzci5sPXI5CQkJLy8gc2xhbSB0aGUgZG9vciAoMTcgY3ljIHRvIHNybHouaSkKLQlvciByMjk9cjgscjI5CQkJLy8gY29uc3RydWN0IGNyLmlwc3IgdmFsdWUgdG8gc2F2ZQotCWFkZGwgcjIyPUlBNjRfUkJTX09GRlNFVCxyMgkvLyBjb21wdXRlIGJhc2Ugb2YgUkJTCisJbW92IGFyLnJzYz0wCQkJCS8vIE0yICAgc2V0IGVuZm9yY2VkIGxhenkgbW9kZSwgcGwgMCwgTEUsIGxvYWRycz0wCisJbm9wLm0gMAorCW5vcC5pIDAKIAk7OwotCS8vIEdBUyByZXBvcnRzIGEgc3B1cmlvdXMgUkFXIGhhemFyZCBvbiB0aGUgcmVhZCBvZiBhci5ybmF0IGJlY2F1c2UgaXQgdGhpbmtzCi0JLy8gd2UgbWF5IGJlIHJlYWRpbmcgYXIuaXRjIGFmdGVyIHdyaXRpbmcgdG8gcHNyLmwuICBBdm9pZCB0aGF0IG1lc3NhZ2Ugd2l0aAotCS8vIHRoaXMgZGlyZWN0aXZlOgotCWR2X3NlcmlhbGl6ZV9kYXRhCi0JbW92Lm0gcjI0PWFyLnJuYXQJCS8vIHJlYWQgYXIucm5hdCAoNSBjeWMgbGF0KQotCWxmZXRjaC5mYXVsdC5leGNsLm50MSBbcjIyXQotCWFkZHMgcjE2PUlBNjRfVEFTS19USFJFQURfT05fVVNUQUNLX09GRlNFVCxyMgorCW1vdiByMjM9YXIuYnNwc3RvcmUJCQkvLyBNMiAoMTIgY3ljKSBzYXZlIGFyLmJzcHN0b3JlCisJbW92Lm0gcjI0PWFyLnJuYXQJCQkvLyBNMiAoNSBjeWMpIHJlYWQgYXIucm5hdCAoZHVhbC1pc3N1ZXMhKQorCW5vcC5pIDAKKwk7OworCW1vdiBhci5ic3BzdG9yZT1yMjIJCQkvLyBNMiAoNiBjeWMpIHN3aXRjaCB0byBrZXJuZWwgUkJTCisJbW92bCByOD1QU1JfT05FX0JJVFMJCQkvLyBYCisJOzsKKwltb3YgcjI1PWFyLnVuYXQJCQkJLy8gTTIgKDUgY3ljKSBzYXZlIGFyLnVuYXQKKwltb3YgcjE5PWI2CQkJCS8vIEkwICAgc2F2ZSBiNiAoMiBjeWMpCisJbW92IHIyMD1yMQkJCQkvLyBBICAgIHNhdmUgY2FsbGVyJ3MgZ3AgaW4gcjIwCisJOzsKKwlvciByMjk9cjgscjI5CQkJCS8vIEEgICAgY29uc3RydWN0IGNyLmlwc3IgdmFsdWUgdG8gc2F2ZQorCW1vdiBiNj1yMTgJCQkJLy8gSTAgICBjb3B5IHN5c2NhbGwgZW50cnktcG9pbnQgdG8gYjYgKDcgY3ljKQorCWFkZGwgcjE9SUE2NF9TVEtfT0ZGU0VULUlBNjRfUFRfUkVHU19TSVpFLHIyIC8vIEEgY29tcHV0ZSBiYXNlIG9mIG1lbW9yeSBzdGFjawogCi0JLy8gZW5zdXJlIHByZXZpb3VzIGluc24gZ3JvdXAgaXMgaXNzdWVkIGJlZm9yZSB3ZSBzdGFsbCBmb3Igc3Jsei5pOgorCW1vdiByMTg9YXIuYnNwCQkJCS8vIE0yICAgc2F2ZSAoa2VybmVsKSBhci5ic3AgKDEyIGN5YykKKwljbXAubmUgcEtTdGsscFVTdGs9cjAscjAJCS8vIEEgICAgc2V0IHBLU3RrIDwtIDAsIHBVU3RrIDwtIDEKKwlici5jYWxsLnNwdGsubWFueSBiNz1pYTY0X3N5c2NhbGxfc2V0dXAJLy8gQgogCTs7Ci0Jc3Jsei5pCQkJCS8vIGVuc3VyZSBuZXcgcHNyLmwgaGFzIGJlZW4gZXN0YWJsaXNoZWQKLQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vLy8vLy8vLy8gZnJvbSB0aGlzIHBvaW50IG9uLCBleGVjdXRpb24gaXMgbm90IGludGVycnVwdGlibGUgYW55bW9yZQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JYWRkbCByMT1JQTY0X1NUS19PRkZTRVQtSUE2NF9QVF9SRUdTX1NJWkUscjIJLy8gY29tcHV0ZSBiYXNlIG9mIG1lbW9yeSBzdGFjawotCWNtcC5uZSBwS1N0ayxwVVN0az1yMCxyMAkvLyBzZXQgcEtTdGsgPC0gMCwgcFVTdGsgPC0gMQorCW1vdiBhci5yc2M9MHgzCQkJCS8vIE0yICAgc2V0IGVhZ2VyIG1vZGUsIHBsIDAsIExFLCBsb2FkcnM9MAorCW1vdiBycD1yMTQJCQkJLy8gSTAgICBzZXQgdGhlIHJlYWwgcmV0dXJuIGFkZHIKKwlhbmQgcjM9X1RJRl9TWVNDQUxMX1RSQUNFQVVESVQscjMJLy8gQQogCTs7Ci0Jc3QxIFtyMTZdPXIwCQkJLy8gY2xlYXIgY3VycmVudC0+dGhyZWFkLm9uX3VzdGFjayBmbGFnCi0JbW92IGFyLmJzcHN0b3JlPXIyMgkJLy8gc3dpdGNoIHRvIGtlcm5lbCBSQlMKLQltb3YgYjY9cjE4CQkJLy8gY29weSBzeXNjYWxsIGVudHJ5LXBvaW50IHRvIGI2ICg3IGN5YykKLQlhZGQgcjM9VElfRkxBR1MrSUE2NF9UQVNLX1NJWkUscjIKLQk7OwotCWxkNCByMz1bcjNdCQkJCS8vIHIyID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncwotCW1vdiByMTg9YXIuYnNwCQkJLy8gc2F2ZSAoa2VybmVsKSBhci5ic3AgKDEyIGN5YykKLQltb3YgYXIucnNjPTB4MwkJCS8vIHNldCBlYWdlciBtb2RlLCBwbCAwLCBsaXR0bGUtZW5kaWFuLCBsb2FkcnM9MAotCWJyLmNhbGwuc3B0ay5tYW55IGI3PWlhNjRfc3lzY2FsbF9zZXR1cAotCTs7Ci0Jc3NtIHBzci5pCi0JbW92bCByMj1pYTY0X3JldF9mcm9tX3N5c2NhbGwKLQk7OwotCW1vdiBycD1yMgkJCQkvLyBzZXQgdGhlIHJlYWwgcmV0dXJuIGFkZHIKLQlhbmQgcjM9X1RJRl9TWVNDQUxMX1RSQUNFQVVESVQscjMKLQk7OwotCWNtcC5lcSBwOCxwMD1yMyxyMAorCXNzbSBwc3IuaQkJCQkvLyBNMiAgIHdlJ3JlIG9uIGtlcm5lbCBzdGFja3Mgbm93LCByZWVuYWJsZSBpcnFzCisJY21wLmVxIHA4LHAwPXIzLHIwCQkJLy8gQQorKHAxMCkJYnIuY29uZC5zcG50Lm1hbnkgaWE2NF9yZXRfZnJvbV9zeXNjYWxsCS8vIEIgICAgcmV0dXJuIGlmIGJhZCBjYWxsLWZyYW1lIG9yIHIxNSBpcyBhIE5hVAogCi0ocDEwKQlici5jb25kLnNwbnQubWFueSBpYTY0X3JldF9mcm9tX3N5c2NhbGwJLy8gcDEwPT10cnVlIG1lYW5zIG91dCByZWdpc3RlcnMgYXJlIG1vcmUgdGhhbiA4Ci0ocDgpCWJyLmNhbGwuc3B0ay5tYW55IGI2PWI2CQkvLyBpZ25vcmUgdGhpcyByZXR1cm4gYWRkcgotCWJyLmNvbmQuc3B0ayBpYTY0X3RyYWNlX3N5c2NhbGwKKwlub3AubSAwCisocDgpCWJyLmNhbGwuc3B0ay5tYW55IGI2PWI2CQkJLy8gQiAgICAoaWdub3JlIHJldHVybiBhZGRyZXNzKQorCWJyLmNvbmQuc3BudCBpYTY0X3RyYWNlX3N5c2NhbGwJCS8vIEIKIEVORChmc3lzX2J1YmJsZV9kb3duKQogCiAJLnJvZGF0YQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9nYXRlLlMgYi9hcmNoL2lhNjQva2VybmVsL2dhdGUuUwppbmRleCBmYWNmNzVhLi44Njk0OGNlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2dhdGUuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2dhdGUuUwpAQCAtNzIsMzggKzcyLDQwIEBACiAJICogYnVuZGxlIGdldCBleGVjdXRlZC4gIFRoZSByZW1haW5pbmcgY29kZSBtdXN0IGJlIHNhZmUgZXZlbiBpZgogCSAqIHRoZXkgZG8gbm90IGdldCBleGVjdXRlZC4KIAkgKi8KLQlhZGRzIHIxNz0tMTAyNCxyMTUKLQltb3YgcjEwPTAJCQkJLy8gZGVmYXVsdCB0byBzdWNjZXNzZnVsIHN5c2NhbGwgZXhlY3V0aW9uCi0JZXBjCisJYWRkcyByMTc9LTEwMjQscjE1CQkJLy8gQQorCW1vdiByMTA9MAkJCQkvLyBBICAgIGRlZmF1bHQgdG8gc3VjY2Vzc2Z1bCBzeXNjYWxsIGV4ZWN1dGlvbgorCWVwYwkJCQkJLy8gQgljYXVzZXMgc3BsaXQtaXNzdWUKIH0KIAk7OwotCXJzbSBwc3IuYmUgLy8gbm90ZTogb24gTWNLaW5sZXkgInJzbSBwc3IuYmUvc3Jsei5kIiBpcyBzbGlnaHRseSBmYXN0ZXIgdGhhbiAicnVtIHBzci5iZSIKLQlMT0FEX0ZTWVNDQUxMX1RBQkxFKHIxNCkKKwlyc20gcHNyLmJlIHwgcHNyLmkJCQkvLyBNMiAoNSBjeWMgdG8gc3Jsei5kKQorCUxPQURfRlNZU0NBTExfVEFCTEUocjE0KQkJLy8gWAorCTs7CisJbW92IHIxNj1JQTY0X0tSKENVUlJFTlQpCQkvLyBNMiAoMTIgY3ljKQorCXNobGFkZCByMTg9cjE3LDMscjE0CQkJLy8gQQorCW1vdiByMTk9TlJfc3lzY2FsbHMtMQkJCS8vIEEKKwk7OworCWxmZXRjaCBbcjE4XQkJCQkvLyBNMHwxCisJbW92IHIyOT1wc3IJCQkJLy8gTTIgKDEyIGN5YykKKwkvLyBJZiByMTcgaXMgYSBOYVQsIHA2IHdpbGwgYmUgemVybworCWNtcC5nZXUgcDYscDc9cjE5LHIxNwkJCS8vIEEgICAgKHN5c25yID4gMCAmJiBzeXNuciA8IDEwMjQrTlJfc3lzY2FsbHMpPworCTs7CisJbW92IHIyMT1hci5mcHNyCQkJCS8vIE0yICgxMiBjeWMpCisJdG5hdC5ueiBwMTAscDk9cjE1CQkJLy8gSTAKKwltb3YuaSByMjY9YXIucGZzCQkJLy8gSTAgKHdvdWxkIHN0YWxsIGFueWhvdyBkdWUgdG8gc3Jsei5kLi4uKQorCTs7CisJc3Jsei5kCQkJCQkvLyBNMCAoZm9yY2VzIHNwbGl0LWlzc3VlKSBlbnN1cmUgUFNSLkJFPT0wCisocDYpCWxkOCByMTg9W3IxOF0JCQkJLy8gTTB8MQorCW5vcC5pIDAKKwk7OworCW5vcC5tIDAKKyhwNikJdGJpdC56LnVuYyBwOCxwMD1yMTgsMAkJCS8vIEkwIChkdWFsLWlzc3VlcyB3aXRoICJtb3YgYjc9cjE4IiEpCisJbm9wLmkgMAorCTs7CisocDgpCXNzbSBwc3IuaQorKHA2KQltb3YgYjc9cjE4CQkJCS8vIEkwCisocDgpCWJyLmRwdGsubWFueSBiNwkJCQkvLyBCCiAKLQltb3YgcjE2PUlBNjRfS1IoQ1VSUkVOVCkJCS8vIDEyIGN5Y2xlIHJlYWQgbGF0ZW5jeQotCXRuYXQubnogcDEwLHA5PXIxNQotCW1vdiByMTk9TlJfc3lzY2FsbHMtMQotCTs7Ci0Jc2hsYWRkIHIxOD1yMTcsMyxyMTQKLQotCXNybHouZAotCWNtcC5uZSBwOCxwMD1yMCxyMAkJCS8vIHA4IDwtIEZBTFNFCi0JLyogTm90ZTogaWYgcjE3IGlzIGEgTmFULCBwNiB3aWxsIGJlIHNldCB0byB6ZXJvLiAgKi8KLQljbXAuZ2V1IHA2LHA3PXIxOSxyMTcJCQkvLyAoc3lzY2FsbCA+IDAgJiYgc3lzY2FsbCA8IDEwMjQrTlJfc3lzY2FsbHMpPwotCTs7Ci0ocDYpCWxkOCByMTg9W3IxOF0KLQltb3YgcjIxPWFyLmZwc3IKLQlhZGQgcjE0PS04LHIxNAkJCQkvLyByMTQgPC0gYWRkciBvZiBmc3lzX2J1YmJsZV9kb3duIGVudHJ5Ci0JOzsKLShwNikJbW92IGI3PXIxOAotKHA2KQl0Yml0LnogcDgscDA9cjE4LDAKLShwOCkJYnIuZHB0ay5tYW55IGI3Ci0KLShwNikJcnNtIHBzci5pCi0JbW92IHIyNz1hci5yc2MKLQltb3YgcjI2PWFyLnBmcwotCTs7Ci0JbW92IHIyOT1wc3IJCQkJLy8gcmVhZCBwc3IgKDEyIGN5YyBsb2FkIGxhdGVuY3kpCisJbW92IHIyNz1hci5yc2MJCQkJLy8gTTIgKDEyIGN5YykKIC8qCiAgKiBicmwuY29uZCBkb2Vzbid0IHdvcmsgYXMgaW50ZW5kZWQgYmVjYXVzZSB0aGUgbGlua2VyIHdvdWxkIGNvbnZlcnQgdGhpcyBicmFuY2gKICAqIGludG8gYSBicmFuY2ggdG8gYSBQTFQuICBQZXJoYXBzIHRoZXJlIHdpbGwgYmUgYSB3YXkgdG8gYXZvaWQgdGhpcyB3aXRoIHNvbWUKQEAgLTExMSw2ICsxMTMsOCBAQAogICogaW5zdGVhZC4KICAqLwogI2lmZGVmIENPTkZJR19JVEFOSVVNCisocDYpCWFkZCByMTQ9LTgscjE0CQkJCS8vIHIxNCA8LSBhZGRyIG9mIGZzeXNfYnViYmxlX2Rvd24gZW50cnkKKwk7OwogKHA2KQlsZDggcjE0PVtyMTRdCQkJCS8vIHIxNCA8LSBmc3lzX2J1YmJsZV9kb3duCiAJOzsKIChwNikJbW92IGI3PXIxNApAQCAtMTE4LDcgKzEyMiw3IEBACiAjZWxzZQogCUJSTF9DT05EX0ZTWVNfQlVCQkxFX0RPV04ocDYpCiAjZW5kaWYKLQorCXNzbSBwc3IuaQogCW1vdiByMTA9LTEKIChwMTApCW1vdiByOD1FSU5WQUwKIChwOSkJbW92IHI4PUVOT1NZUwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMgYi9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYwppbmRleCA3YmJmMDE5Li4wMTU3MjgxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lhNjRfa3N5bXMuYwpAQCAtNTgsOSArNTgsNiBAQAogRVhQT1JUX1NZTUJPTChfX3N0cm5jcHlfZnJvbV91c2VyKTsKIEVYUE9SVF9TWU1CT0woX19zdHJubGVuX3VzZXIpOwogCi0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotRVhQT1JUX1NZTUJPTChfX2lhNjRfc3lzY2FsbCk7Ci0KIC8qIGZyb20gYXJjaC9pYTY0L2xpYiAqLwogZXh0ZXJuIHZvaWQgX19kaXZzaTModm9pZCk7CiBleHRlcm4gdm9pZCBfX3VkaXZzaTModm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lvc2FwaWMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCmluZGV4IDg4YjAxNDMuLjc5MzZiNjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jCkBAIC0xMjksMTQgKzEyOSwxMyBAQAogCWNoYXIgX19pb21lbQkqYWRkcjsJCS8qIGJhc2UgYWRkcmVzcyBvZiBJT1NBUElDICovCiAJdW5zaWduZWQgaW50IAlnc2lfYmFzZTsJLyogZmlyc3QgR1NJIGFzc2lnbmVkIHRvIHRoaXMgSU9TQVBJQyAqLwogCXVuc2lnbmVkIHNob3J0IAludW1fcnRlOwkvKiBudW1iZXIgb2YgUlRFIGluIHRoaXMgSU9TQVBJQyAqLworCWludAkJcnRlc19pbnVzZTsJLyogIyBvZiBSVEVzIGluIHVzZSBvbiB0aGlzIElPU0FQSUMgKi8KICNpZmRlZiBDT05GSUdfTlVNQQogCXVuc2lnbmVkIHNob3J0CW5vZGU7CQkvKiBudW1hIG5vZGUgYXNzb2NpYXRpb24gdmlhIHB4bSAqLwogI2VuZGlmCiB9IGlvc2FwaWNfbGlzdHNbTlJfSU9TQVBJQ1NdOwogCi1zdGF0aWMgaW50IG51bV9pb3NhcGljOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBwY2F0X2NvbXBhdCBfX2luaXRkYXRhOwkvKiA4MjU5IGNvbXBhdGliaWxpdHkgZmxhZyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGNhdF9jb21wYXQgX19kZXZpbml0ZGF0YTsJLyogODI1OSBjb21wYXRpYmlsaXR5IGZsYWcgKi8KIAogc3RhdGljIGludCBpb3NhcGljX2ttYWxsb2Nfb2s7CiBzdGF0aWMgTElTVF9IRUFEKGZyZWVfcnRlX2xpc3QpOwpAQCAtMTQ5LDcgKzE0OCw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2lvc2FwaWM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOUl9JT1NBUElDUzsgaSsrKSB7CiAJCWlmICgodW5zaWduZWQpIChnc2kgLSBpb3NhcGljX2xpc3RzW2ldLmdzaV9iYXNlKSA8IGlvc2FwaWNfbGlzdHNbaV0ubnVtX3J0ZSkKIAkJCXJldHVybiBpOwogCX0KQEAgLTQ5MCw4ICs0ODksNiBAQAogCQkJfQogCQl9CiAJfQotCWlmICh2ZWN0b3IgPCAwKQotCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsIF9fRlVOQ1RJT05fXyk7CiAKIAlyZXR1cm4gdmVjdG9yOwogfQpAQCAtNTA3LDYgKzUwNCw4IEBACiAKIAlpZiAoIWxpc3RfZW1wdHkoJmlvc2FwaWNfaW50cl9pbmZvW3ZlY3Rvcl0ucnRlcykpIHsKIAkJbmV3X3ZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwkJaWYgKG5ld192ZWN0b3IgPCAwKQorCQkJcGFuaWMoIiVzOiBvdXQgb2YgaW50ZXJydXB0IHZlY3RvcnMhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlwcmludGsoS0VSTl9JTkZPICJSZWFzc2lnbmluZyB2ZWN0b3IgJWQgdG8gJWRcbiIsIHZlY3RvciwgbmV3X3ZlY3Rvcik7CiAJCW1lbWNweSgmaW9zYXBpY19pbnRyX2luZm9bbmV3X3ZlY3Rvcl0sICZpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpb3NhcGljX2ludHJfaW5mbykpOwpAQCAtNTk4LDYgKzU5Nyw3IEBACiAJCXJ0ZS0+cmVmY250Kys7CiAJCWxpc3RfYWRkX3RhaWwoJnJ0ZS0+cnRlX2xpc3QsICZpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLnJ0ZXMpOwogCQlpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLmNvdW50Kys7CisJCWlvc2FwaWNfbGlzdHNbaW5kZXhdLnJ0ZXNfaW51c2UrKzsKIAl9CiAJZWxzZSBpZiAodmVjdG9yX2lzX3NoYXJlZCh2ZWN0b3IpKSB7CiAJCXN0cnVjdCBpb3NhcGljX2ludHJfaW5mbyAqaW5mbyA9ICZpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdOwpAQCAtNzM0LDkgKzczNCwxMiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOwogCiAJLyogSWYgdmVjdG9yIGlzIHJ1bm5pbmcgb3V0LCB3ZSB0cnkgdG8gZmluZCBhIHNoYXJhYmxlIHZlY3RvciAqLwotCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yX25vcGFuaWMoQVVUT19BU1NJR04pOwotCWlmICh2ZWN0b3IgPCAwKQorCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwlpZiAodmVjdG9yIDwgMCkgewogCQl2ZWN0b3IgPSBpb3NhcGljX2ZpbmRfc2hhcmFibGVfdmVjdG9yKHRyaWdnZXIsIHBvbGFyaXR5KTsKKwkJaWYgKHZlY3RvciA8IDApCisJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjcCh2ZWN0b3IpLT5sb2NrLCBmbGFncyk7CiAJc3Bpbl9sb2NrKCZpb3NhcGljX2xvY2spOwpAQCAtNzc4LDcgKzc4MSw3IEBACiBpb3NhcGljX3VucmVnaXN0ZXJfaW50ciAodW5zaWduZWQgaW50IGdzaSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpcnEsIHZlY3RvcjsKKwlpbnQgaXJxLCB2ZWN0b3IsIGluZGV4OwogCWlycV9kZXNjX3QgKmlkZXNjOwogCXUzMiBsb3czMjsKIAl1bnNpZ25lZCBsb25nIHRyaWdnZXIsIHBvbGFyaXR5OwpAQCAtODE5LDYgKzgyMiw5IEBACiAJCWxpc3RfZGVsKCZydGUtPnJ0ZV9saXN0KTsKIAkJaW9zYXBpY19pbnRyX2luZm9bdmVjdG9yXS5jb3VudC0tOwogCQlpb3NhcGljX2ZyZWVfcnRlKHJ0ZSk7CisJCWluZGV4ID0gZmluZF9pb3NhcGljKGdzaSk7CisJCWlvc2FwaWNfbGlzdHNbaW5kZXhdLnJ0ZXNfaW51c2UtLTsKKwkJV0FSTl9PTihpb3NhcGljX2xpc3RzW2luZGV4XS5ydGVzX2ludXNlIDwgMCk7CiAKIAkJdHJpZ2dlcgkgPSBpb3NhcGljX2ludHJfaW5mb1t2ZWN0b3JdLnRyaWdnZXI7CiAJCXBvbGFyaXR5ID0gaW9zYXBpY19pbnRyX2luZm9bdmVjdG9yXS5wb2xhcml0eTsKQEAgLTg4MSw2ICs4ODcsOCBAQAogCQlicmVhazsKIAkgICAgICBjYXNlIEFDUElfSU5URVJSVVBUX0lOSVQ6CiAJCXZlY3RvciA9IGFzc2lnbl9pcnFfdmVjdG9yKEFVVE9fQVNTSUdOKTsKKwkJaWYgKHZlY3RvciA8IDApCisJCQlwYW5pYygiJXM6IG91dCBvZiBpbnRlcnJ1cHQgdmVjdG9ycyFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWRlbGl2ZXJ5ID0gSU9TQVBJQ19JTklUOwogCQlicmVhazsKIAkgICAgICBjYXNlIEFDUElfSU5URVJSVVBUX0NQRUk6CkBAIC05NTIsMzAgKzk2MCw4NiBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQKK3N0YXRpYyBpbmxpbmUgaW50Citpb3NhcGljX2FsbG9jICh2b2lkKQoreworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5SX0lPU0FQSUNTOyBpbmRleCsrKQorCQlpZiAoIWlvc2FwaWNfbGlzdHNbaW5kZXhdLmFkZHIpCisJCQlyZXR1cm4gaW5kZXg7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGlvc2FwaWNcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lvc2FwaWNfZnJlZSAoaW50IGluZGV4KQoreworCW1lbXNldCgmaW9zYXBpY19saXN0c1tpbmRleF0sIDAsIHNpemVvZihpb3NhcGljX2xpc3RzWzBdKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpb3NhcGljX2NoZWNrX2dzaV9yYW5nZSAodW5zaWduZWQgaW50IGdzaV9iYXNlLCB1bnNpZ25lZCBpbnQgdmVyKQoreworCWludCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgZ3NpX2VuZCwgYmFzZSwgZW5kOworCisJLyogY2hlY2sgZ3NpIHJhbmdlICovCisJZ3NpX2VuZCA9IGdzaV9iYXNlICsgKCh2ZXIgPj4gMTYpICYgMHhmZik7CisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlJfSU9TQVBJQ1M7IGluZGV4KyspIHsKKwkJaWYgKCFpb3NhcGljX2xpc3RzW2luZGV4XS5hZGRyKQorCQkJY29udGludWU7CisKKwkJYmFzZSA9IGlvc2FwaWNfbGlzdHNbaW5kZXhdLmdzaV9iYXNlOworCQllbmQgID0gYmFzZSArIGlvc2FwaWNfbGlzdHNbaW5kZXhdLm51bV9ydGUgLSAxOworCisJCWlmIChnc2lfYmFzZSA8IGJhc2UgJiYgZ3NpX2VuZCA8IGJhc2UpCisJCQljb250aW51ZTsvKiBPSyAqLworCisJCWlmIChnc2lfYmFzZSA+IGVuZCAmJiBnc2lfZW5kID4gZW5kKQorCQkJY29udGludWU7IC8qIE9LICovCisKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2RldmluaXQKIGlvc2FwaWNfaW5pdCAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGludCBnc2lfYmFzZSkKIHsKLQlpbnQgbnVtX3J0ZTsKKwlpbnQgbnVtX3J0ZSwgZXJyLCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgaXNhX2lycSwgdmVyOwogCWNoYXIgX19pb21lbSAqYWRkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYWRkciA9IGlvcmVtYXAocGh5c19hZGRyLCAwKTsKLQl2ZXIgPSBpb3NhcGljX3ZlcnNpb24oYWRkcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOworCXsKKwkJYWRkciA9IGlvcmVtYXAocGh5c19hZGRyLCAwKTsKKwkJdmVyID0gaW9zYXBpY192ZXJzaW9uKGFkZHIpOwogCi0JLyoKLQkgKiBUaGUgTUFYX1JFRElSIHJlZ2lzdGVyIGhvbGRzIHRoZSBoaWdoZXN0IGlucHV0IHBpbgotCSAqIG51bWJlciAoc3RhcnRpbmcgZnJvbSAwKS4KLQkgKiBXZSBhZGQgMSBzbyB0aGF0IHdlIGNhbiB1c2UgaXQgZm9yIG51bWJlciBvZiBwaW5zICg9IFJURXMpCi0JICovCi0JbnVtX3J0ZSA9ICgodmVyID4+IDE2KSAmIDB4ZmYpICsgMTsKKwkJaWYgKChlcnIgPSBpb3NhcGljX2NoZWNrX2dzaV9yYW5nZShnc2lfYmFzZSwgdmVyKSkpIHsKKwkJCWlvdW5tYXAoYWRkcik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3NhcGljX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBlcnI7CisJCX0KIAotCWlvc2FwaWNfbGlzdHNbbnVtX2lvc2FwaWNdLmFkZHIgPSBhZGRyOwotCWlvc2FwaWNfbGlzdHNbbnVtX2lvc2FwaWNdLmdzaV9iYXNlID0gZ3NpX2Jhc2U7Ci0JaW9zYXBpY19saXN0c1tudW1faW9zYXBpY10ubnVtX3J0ZSA9IG51bV9ydGU7CisJCS8qCisJCSAqIFRoZSBNQVhfUkVESVIgcmVnaXN0ZXIgaG9sZHMgdGhlIGhpZ2hlc3QgaW5wdXQgcGluCisJCSAqIG51bWJlciAoc3RhcnRpbmcgZnJvbSAwKS4KKwkJICogV2UgYWRkIDEgc28gdGhhdCB3ZSBjYW4gdXNlIGl0IGZvciBudW1iZXIgb2YgcGlucyAoPSBSVEVzKQorCQkgKi8KKwkJbnVtX3J0ZSA9ICgodmVyID4+IDE2KSAmIDB4ZmYpICsgMTsKKworCQlpbmRleCA9IGlvc2FwaWNfYWxsb2MoKTsKKwkJaW9zYXBpY19saXN0c1tpbmRleF0uYWRkciA9IGFkZHI7CisJCWlvc2FwaWNfbGlzdHNbaW5kZXhdLmdzaV9iYXNlID0gZ3NpX2Jhc2U7CisJCWlvc2FwaWNfbGlzdHNbaW5kZXhdLm51bV9ydGUgPSBudW1fcnRlOwogI2lmZGVmIENPTkZJR19OVU1BCi0JaW9zYXBpY19saXN0c1tudW1faW9zYXBpY10ubm9kZSA9IE1BWF9OVU1OT0RFUzsKKwkJaW9zYXBpY19saXN0c1tpbmRleF0ubm9kZSA9IE1BWF9OVU1OT0RFUzsKICNlbmRpZgotCW51bV9pb3NhcGljKys7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOwogCiAJaWYgKChnc2lfYmFzZSA9PSAwKSAmJiBwY2F0X2NvbXBhdCkgewogCQkvKgpAQCAtOTg2LDEwICsxMDUwLDQzIEBACiAJCWZvciAoaXNhX2lycSA9IDA7IGlzYV9pcnEgPCAxNjsgKytpc2FfaXJxKQogCQkJaW9zYXBpY19vdmVycmlkZV9pc2FfaXJxKGlzYV9pcnEsIGlzYV9pcnEsIElPU0FQSUNfUE9MX0hJR0gsIElPU0FQSUNfRURHRSk7CiAJfQorCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKK2ludAoraW9zYXBpY19yZW1vdmUgKHVuc2lnbmVkIGludCBnc2lfYmFzZSkKK3sKKwlpbnQgaW5kZXgsIGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb3NhcGljX2xvY2ssIGZsYWdzKTsKKwl7CisJCWluZGV4ID0gZmluZF9pb3NhcGljKGdzaV9iYXNlKTsKKwkJaWYgKGluZGV4IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIElPU0FQSUMgZm9yIEdTSSBiYXNlICV1XG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZ3NpX2Jhc2UpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoaW9zYXBpY19saXN0c1tpbmRleF0ucnRlc19pbnVzZSkgeworCQkJZXJyID0gLUVCVVNZOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IElPU0FQSUMgZm9yIEdTSSBiYXNlICV1IGlzIGJ1c3lcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBnc2lfYmFzZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlvdW5tYXAoaW9zYXBpY19saXN0c1tpbmRleF0uYWRkcik7CisJCWlvc2FwaWNfZnJlZShpbmRleCk7CisJfQorIG91dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3NhcGljX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHICovCisKICNpZmRlZiBDT05GSUdfTlVNQQotdm9pZCBfX2luaXQKK3ZvaWQgX19kZXZpbml0CiBtYXBfaW9zYXBpY190b19ub2RlKHVuc2lnbmVkIGludCBnc2lfYmFzZSwgaW50IG5vZGUpCiB7CiAJaW50IGluZGV4OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCmluZGV4IDRmZTYwYzcuLjZjNGQ1OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKQEAgLTYzLDMwICs2MywxOSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaWE2NF92ZWN0b3JfbWFza1tCSVRTX1RPX0xPTkdTKElBNjRfTlVNX0RFVklDRV9WRUNUT1JTKV07CiAKIGludAotYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyAoaW50IGlycSkKK2Fzc2lnbl9pcnFfdmVjdG9yIChpbnQgaXJxKQogewogCWludCBwb3MsIHZlY3RvcjsKICBhZ2FpbjoKIAlwb3MgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGlhNjRfdmVjdG9yX21hc2ssIElBNjRfTlVNX0RFVklDRV9WRUNUT1JTKTsKIAl2ZWN0b3IgPSBJQTY0X0ZJUlNUX0RFVklDRV9WRUNUT1IgKyBwb3M7CiAJaWYgKHZlY3RvciA+IElBNjRfTEFTVF9ERVZJQ0VfVkVDVE9SKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PU1BDOwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KHBvcywgaWE2NF92ZWN0b3JfbWFzaykpCiAJCWdvdG8gYWdhaW47CiAJcmV0dXJuIHZlY3RvcjsKIH0KIAotaW50Ci1hc3NpZ25faXJxX3ZlY3RvciAoaW50IGlycSkKLXsKLQlpbnQgdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyhpcnEpOwotCi0JaWYgKHZlY3RvciA8IDApCi0JCXBhbmljKCJhc3NpZ25faXJxX3ZlY3Rvcjogb3V0IG9mIGludGVycnVwdCB2ZWN0b3JzISIpOwotCi0JcmV0dXJuIHZlY3RvcjsKLX0KLQogdm9pZAogZnJlZV9pcnFfdmVjdG9yIChpbnQgdmVjdG9yKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUyBiL2FyY2gvaWE2NC9rZXJuZWwvaXZ0LlMKaW5kZXggMmJjMDg1YS4uM2JiM2ExMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2l2dC5TCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGFyY2gvaWE2NC9rZXJuZWwvaXZ0LlMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSwgMjAwMyBIZXdsZXR0LVBhY2thcmQgQ28KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDAxLCAyMDAzLCAyMDA1IEhld2xldHQtUGFja2FyZCBDbwogICoJU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgogICoJRGF2aWQgTW9zYmVyZ2VyIDxkYXZpZG1AaHBsLmhwLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMi0yMDAzIEludGVsIENvCkBAIC02OTIsODIgKzY5MiwxMTggQEAKIAkgKiB0byBwcmV2ZW50IGxlYWtpbmcgYml0cyBmcm9tIGtlcm5lbCB0byB1c2VyIGxldmVsLgogCSAqLwogCURCR19GQVVMVCgxMSkKLQltb3YgcjE2PUlBNjRfS1IoQ1VSUkVOVCkJCS8vIHIxNiA9IGN1cnJlbnQgdGFzazsgMTIgY3ljbGUgcmVhZCBsYXQuCi0JbW92IHIxNz1jci5paW0KLQltb3YgcjE4PV9fSUE2NF9CUkVBS19TWVNDQUxMCi0JbW92IHIyMT1hci5mcHNyCi0JbW92IHIyOT1jci5pcHNyCi0JbW92IHIxOT1iNgotCW1vdiByMjU9YXIudW5hdAotCW1vdiByMjc9YXIucnNjCi0JbW92IHIyNj1hci5wZnMKLQltb3YgcjI4PWNyLmlpcAotCW1vdiByMzE9cHIJCQkJLy8gcHJlcGFyZSB0byBzYXZlIHByZWRpY2F0ZXMKLQltb3YgcjIwPXIxCisJbW92Lm0gcjE2PUlBNjRfS1IoQ1VSUkVOVCkJCS8vIE0yIHIxNiA8LSBjdXJyZW50IHRhc2sgKDEyIGN5YykKKwltb3YgcjI5PWNyLmlwc3IJCQkJLy8gTTIgKDEyIGN5YykKKwltb3YgcjMxPXByCQkJCS8vIEkwICgyIGN5YykKKworCW1vdiByMTc9Y3IuaWltCQkJCS8vIE0yICgyIGN5YykKKwltb3YubSByMjc9YXIucnNjCQkJLy8gTTIgKDEyIGN5YykKKwltb3YgcjE4PV9fSUE2NF9CUkVBS19TWVNDQUxMCQkvLyBBCisKKwltb3YubSBhci5yc2M9MAkJCQkvLyBNMgorCW1vdi5tIHIyMT1hci5mcHNyCQkJLy8gTTIgKDEyIGN5YykKKwltb3YgcjE5PWI2CQkJCS8vIEkwICgyIGN5YykKIAk7OworCW1vdi5tIHIyMz1hci5ic3BzdG9yZQkJCS8vIE0yICgxMiBjeWMpCisJbW92Lm0gcjI0PWFyLnJuYXQJCQkvLyBNMiAoNSBjeWMpCisJbW92LmkgcjI2PWFyLnBmcwkJCS8vIEkwICgyIGN5YykKKworCWludmFsYQkJCQkJLy8gTTB8MQorCW5vcC5tIDAJCQkJCS8vIE0KKwltb3YgcjIwPXIxCQkJCS8vIEEJCQlzYXZlIHIxCisKKwlub3AubSAwCisJbW92bCByMzA9c3lzX2NhbGxfdGFibGUJCQkvLyBYCisKKwltb3YgcjI4PWNyLmlpcAkJCQkvLyBNMiAoMiBjeWMpCisJY21wLmVxIHAwLHA3PXIxOCxyMTcJCQkvLyBJMCBpcyB0aGlzIGEgc3lzdGVtIGNhbGw/CisocDcpCWJyLmNvbmQuc3BudCBub25fc3lzY2FsbAkJLy8gQiAgbm8gLT4KKwkvLworCS8vIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgYXJlIGRlZmluaXRlbHkgb24gdGhlIHN5c2NhbGwtcGF0aAorCS8vIGFuZCB3ZSBjYW4gdXNlIChub24tYmFua2VkKSBzY3JhdGNoIHJlZ2lzdGVycy4KKwkvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwltb3YgcjE9cjE2CQkJCS8vIEEgICAgbW92ZSB0YXNrLXBvaW50ZXIgdG8gImFkZGwiLWFkZHJlc3NhYmxlIHJlZworCW1vdiByMj1yMTYJCQkJLy8gQSAgICBzZXR1cCByMiBmb3IgaWE2NF9zeXNjYWxsX3NldHVwCisJYWRkIHI5PVRJX0ZMQUdTK0lBNjRfVEFTS19TSVpFLHIxNgkvLyBBCXI5ID0gJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MKKwogCWFkZHMgcjE2PUlBNjRfVEFTS19USFJFQURfT05fVVNUQUNLX09GRlNFVCxyMTYKLQljbXAuZXEgcDAscDc9cjE4LHIxNwkJCS8vIGlzIHRoaXMgYSBzeXN0ZW0gY2FsbD8gKHA3IDwtIGZhbHNlLCBpZiBzbykKLShwNykJYnIuY29uZC5zcG50IG5vbl9zeXNjYWxsCi0JOzsKLQlsZDEgcjE3PVtyMTZdCQkJCS8vIGxvYWQgY3VycmVudC0+dGhyZWFkLm9uX3VzdGFjayBmbGFnCi0Jc3QxIFtyMTZdPXIwCQkJCS8vIGNsZWFyIGN1cnJlbnQtPnRocmVhZC5vbl91c3RhY2sgZmxhZwotCWFkZCByMT0tSUE2NF9UQVNLX1RIUkVBRF9PTl9VU1RBQ0tfT0ZGU0VULHIxNgkvLyBzZXQgcjEgZm9yIE1JTlNUQVRFX1NUQVJUX1NBVkVfTUlOX1ZJUlQKLQk7OwotCWludmFsYQotCi0JLyogYWRqdXN0IHJldHVybiBhZGRyZXNzIHNvIHdlIHNraXAgb3ZlciB0aGUgYnJlYWsgaW5zdHJ1Y3Rpb246ICovCi0KLQlleHRyLnUgcjg9cjI5LDQxLDIJCQkvLyBleHRyYWN0IGVpIGZpZWxkIGZyb20gY3IuaXBzcgotCTs7Ci0JY21wLmVxIHA2LHA3PTIscjgJCQkvLyBpc3IuZWk9PTI/Ci0JbW92IHIyPXIxCQkJCS8vIHNldHVwIHIyIGZvciBpYTY0X3N5c2NhbGxfc2V0dXAKLQk7OwotKHA2KQltb3Ygcjg9MAkJCQkvLyBjbGVhciBlaSB0byAwCi0ocDYpCWFkZHMgcjI4PTE2LHIyOAkJCQkvLyBzd2l0Y2ggY3IuaWlwIHRvIG5leHQgYnVuZGxlIGNyLmlwc3IuZWkgd3JhcHBlZAotKHA3KQlhZGRzIHI4PTEscjgJCQkJLy8gaW5jcmVtZW50IGVpIHRvIG5leHQgc2xvdAotCTs7Ci0JY21wLmVxIHBLU3RrLHBVU3RrPXIwLHIxNwkJLy8gYXJlIHdlIGluIGtlcm5lbCBtb2RlIGFscmVhZHk/Ci0JZGVwIHIyOT1yOCxyMjksNDEsMgkJCS8vIGluc2VydCBuZXcgZWkgaW50byBjci5pcHNyCi0JOzsKLQotCS8vIHN3aXRjaCBmcm9tIHVzZXIgdG8ga2VybmVsIFJCUzoKLQlNSU5TVEFURV9TVEFSVF9TQVZFX01JTl9WSVJUCi0JYnIuY2FsbC5zcHRrLm1hbnkgYjc9aWE2NF9zeXNjYWxsX3NldHVwCi0JOzsKLQlNSU5TVEFURV9FTkRfU0FWRV9NSU5fVklSVAkJLy8gc3dpdGNoIHRvIGJhbmsgMQotCXNzbSBwc3IuaWMgfCBQU1JfREVGQVVMVF9CSVRTCi0JOzsKLQlzcmx6LmkJCQkJCS8vIGd1YXJhbnRlZSB0aGF0IGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9uCisJYWRkcyByMTU9LTEwMjQscjE1CQkJLy8gQSAgICBzdWJ0cmFjdCAxMDI0IGZyb20gc3lzY2FsbCBudW1iZXIKIAltb3YgcjM9TlJfc3lzY2FsbHMgLSAxCiAJOzsKLShwMTUpCXNzbSBwc3IuaQkJCQkvLyByZXN0b3JlIHBzci5pCi0JLy8gcDEwPT10cnVlIG1lYW5zIG91dCByZWdpc3RlcnMgYXJlIG1vcmUgdGhhbiA4IG9yIHIxNSdzIE5hdCBpcyB0cnVlCi0ocDEwKQlici5jb25kLnNwbnQubWFueSBpYTY0X3JldF9mcm9tX3N5c2NhbGwKLQk7OwotCW1vdmwgcjE2PXN5c19jYWxsX3RhYmxlCisJbGQxLmJpYXMgcjE3PVtyMTZdCQkJLy8gTTB8MSByMTcgPSBjdXJyZW50LT50aHJlYWQub25fdXN0YWNrIGZsYWcKKwlsZDQgcjk9W3I5XQkJCQkvLyBNMHwxIHI5ID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncworCWV4dHIudSByOD1yMjksNDEsMgkJCS8vIEkwICAgZXh0cmFjdCBlaSBmaWVsZCBmcm9tIGNyLmlwc3IKIAotCWFkZHMgcjE1PS0xMDI0LHIxNQkJCS8vIHIxNSBjb250YWlucyB0aGUgc3lzY2FsbCBudW1iZXItLS1zdWJ0cmFjdCAxMDI0Ci0JbW92bCByMj1pYTY0X3JldF9mcm9tX3N5c2NhbGwKKwlzaGxhZGQgcjMwPXIxNSwzLHIzMAkJCS8vIEEgICAgcjMwID0gc3lzX2NhbGxfdGFibGUgKyA4KihzeXNjYWxsLTEwMjQpCisJYWRkbCByMjI9SUE2NF9SQlNfT0ZGU0VULHIxCQkvLyBBICAgIGNvbXB1dGUgYmFzZSBvZiBSQlMKKwljbXAubGV1IHA2LHA3PXIxNSxyMwkJCS8vIEEgICAgc3lzY2FsbCBudW1iZXIgaW4gcmFuZ2U/CiAJOzsKLQlzaGxhZGQgcjIwPXIxNSwzLHIxNgkJCS8vIHIyMCA9IHN5c19jYWxsX3RhYmxlICsgOCooc3lzY2FsbC0xMDI0KQotCWNtcC5sZXUgcDYscDc9cjE1LHIzCQkJLy8gKHN5c2NhbGwgPiAwICYmIHN5c2NhbGwgPCAxMDI0ICsgTlJfc3lzY2FsbHMpID8KLQltb3YgcnA9cjIJCQkJLy8gc2V0IHRoZSByZWFsIHJldHVybiBhZGRyCi0JOzsKLShwNikJbGQ4IHIyMD1bcjIwXQkJCQkvLyBsb2FkIGFkZHJlc3Mgb2Ygc3lzY2FsbCBlbnRyeSBwb2ludAotKHA3KQltb3ZsIHIyMD1zeXNfbmlfc3lzY2FsbAogCi0JYWRkIHIyPVRJX0ZMQUdTK0lBNjRfVEFTS19TSVpFLHIxMworCWxmZXRjaC5mYXVsdC5leGNsLm50MSBbcjIyXQkJLy8gTTB8MSBwcmVmZXRjaCBSQlMKKyhwNikJbGQ4IHIzMD1bcjMwXQkJCQkvLyBNMHwxIGxvYWQgYWRkcmVzcyBvZiBzeXNjYWxsIGVudHJ5IHBvaW50CisJdG5hdC5uei5vciBwNyxwMD1yMTUJCQkvLyBJMAlpcyBzeXNjYWxsIG5yIGEgTmFUPworCisJbW92Lm0gYXIuYnNwc3RvcmU9cjIyCQkJLy8gTTIgICBzd2l0Y2ggdG8ga2VybmVsIFJCUworCWNtcC5lcSBwOCxwOT0yLHI4CQkJLy8gQSAgICBpc3IuZWk9PTI/CiAJOzsKLQlsZDQgcjI9W3IyXQkJCQkvLyByMiA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MKKworKHA4KQltb3Ygcjg9MAkJCQkvLyBBICAgIGNsZWFyIGVpIHRvIDAKKyhwNykJbW92bCByMzA9c3lzX25pX3N5c2NhbGwJCQkvLyBYCisKKyhwOCkJYWRkcyByMjg9MTYscjI4CQkJCS8vIEEgICAgc3dpdGNoIGNyLmlpcCB0byBuZXh0IGJ1bmRsZQorKHA5KQlhZGRzIHI4PTEscjgJCQkJLy8gQSAgICBpbmNyZW1lbnQgZWkgdG8gbmV4dCBzbG90CisJbm9wLmkgMAogCTs7Ci0JYW5kIHIyPV9USUZfU1lTQ0FMTF9UUkFDRUFVRElULHIyCS8vIG1hc2sgdHJhY2Ugb3IgYXVkaXQKKworCW1vdi5tIHIyNT1hci51bmF0CQkJLy8gTTIgKDUgY3ljKQorCWRlcCByMjk9cjgscjI5LDQxLDIJCQkvLyBJMCAgIGluc2VydCBuZXcgZWkgaW50byBjci5pcHNyCisJYWRkcyByMTU9MTAyNCxyMTUJCQkvLyBBICAgIHJlc3RvcmUgb3JpZ2luYWwgc3lzY2FsbCBudW1iZXIKKwkvLworCS8vIElmIGFueSBvZiB0aGUgYWJvdmUgbG9hZHMgbWlzcyBpbiBMMUQsIHdlJ2xsIHN0YWxsIGhlcmUgdW50aWwKKwkvLyB0aGUgZGF0YSBhcnJpdmVzLgorCS8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCXN0MSBbcjE2XT1yMAkJCQkvLyBNMnwzIGNsZWFyIGN1cnJlbnQtPnRocmVhZC5vbl91c3RhY2sgZmxhZworCW1vdiBiNj1yMzAJCQkJLy8gSTAgICBzZXR1cCBzeXNjYWxsIGhhbmRsZXIgYnJhbmNoIHJlZyBlYXJseQorCWNtcC5lcSBwS1N0ayxwVVN0az1yMCxyMTcJCS8vIEEgICAgd2VyZSB3ZSBvbiBrZXJuZWwgc3RhY2tzIGFscmVhZHk/CisKKwlhbmQgcjk9X1RJRl9TWVNDQUxMX1RSQUNFQVVESVQscjkJLy8gQSAgICBtYXNrIHRyYWNlIG9yIGF1ZGl0CisJbW92IHIxOD1hci5ic3AJCQkJLy8gTTIgKDEyIGN5YykKKyhwS1N0aykJYnIuY29uZC5zcG50IC5icmVha19maXh1cAkJLy8gQgl3ZSdyZSBhbHJlYWR5IGluIGtlcm5lbC1tb2RlIC0tIGZpeCB1cCBSQlMKIAk7OwotCWNtcC5lcSBwOCxwMD1yMixyMAotCW1vdiBiNj1yMjAKKy5iYWNrX2Zyb21fYnJlYWtfZml4dXA6CisocFVTdGspCWFkZGwgcjE9SUE2NF9TVEtfT0ZGU0VULUlBNjRfUFRfUkVHU19TSVpFLHIxIC8vIEEgICAgY29tcHV0ZSBiYXNlIG9mIG1lbW9yeSBzdGFjaworCWNtcC5lcSBwMTQscDA9cjkscjAJCQkvLyBBICAgIGFyZSBzeXNjYWxscyBiZWluZyB0cmFjZWQvYXVkaXRlZD8KKwlici5jYWxsLnNwdGsubWFueSBiNz1pYTY0X3N5c2NhbGxfc2V0dXAJLy8gQgorMToKKwltb3YgYXIucnNjPTB4MwkJCQkvLyBNMiAgIHNldCBlYWdlciBtb2RlLCBwbCAwLCBMRSwgbG9hZHJzPTAKKwlub3AgMAorCWJzdy4xCQkJCQkvLyBCICg2IGN5YykgcmVncyBhcmUgc2F2ZWQsIHN3aXRjaCB0byBiYW5rIDEKIAk7OwotKHA4KQlici5jYWxsLnNwdGsubWFueSBiNj1iNgkJCS8vIGlnbm9yZSB0aGlzIHJldHVybiBhZGRyCi0JYnIuY29uZC5zcHRrIGlhNjRfdHJhY2Vfc3lzY2FsbAorCisJc3NtIHBzci5pYyB8IFBTUl9ERUZBVUxUX0JJVFMJCS8vIE0yCW5vdyBpdCdzIHNhZmUgdG8gcmUtZW5hYmxlIGludHIuLWNvbGxlY3Rpb24KKwltb3ZsIHIzPWlhNjRfcmV0X2Zyb21fc3lzY2FsbAkJLy8gWAorCTs7CisKKwlzcmx6LmkJCQkJCS8vIE0wICAgZW5zdXJlIGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9uCisJbW92IHJwPXIzCQkJCS8vIEkwICAgc2V0IHRoZSByZWFsIHJldHVybiBhZGRyCisocDEwKQlici5jb25kLnNwbnQubWFueSBpYTY0X3JldF9mcm9tX3N5c2NhbGwJLy8gQiAgICByZXR1cm4gaWYgYmFkIGNhbGwtZnJhbWUgb3IgcjE1IGlzIGEgTmFUCisKKyhwMTUpCXNzbSBwc3IuaQkJCQkvLyBNMiAgIHJlc3RvcmUgcHNyLmkKKyhwMTQpCWJyLmNhbGwuc3B0ay5tYW55IGI2PWI2CQkJLy8gQiAgICBpbnZva2Ugc3lzY2FsbC1oYW5ka2VyIChpZ25vcmUgcmV0dXJuIGFkZHIpCisJYnIuY29uZC5zcG50Lm1hbnkgaWE2NF90cmFjZV9zeXNjYWxsCS8vIEIJZG8gc3lzY2FsbC10cmFjaW5nIHRoaW5nYW1hZ2ljCiAJLy8gTk9UIFJFQUNIRUQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisJLy8gT24gZW50cnksIHdlIG9wdGltaXN0aWNhbGx5IGFzc3VtZWQgdGhhdCB3ZSdyZSBjb21pbmcgZnJvbSB1c2VyLXNwYWNlLgorCS8vIEZvciB0aGUgcmFyZSBjYXNlcyB3aGVyZSBhIHN5c3RlbS1jYWxsIGlzIGRvbmUgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbCwKKwkvLyB3ZSBmaXggdGhpbmdzIHVwIGF0IHRoaXMgcG9pbnQ6CisuYnJlYWtfZml4dXA6CisJYWRkIHIxPS1JQTY0X1BUX1JFR1NfU0laRSxzcAkJLy8gQSAgICBhbGxvY2F0ZSBzcGFjZSBmb3IgcHRfcmVncyBzdHJ1Y3R1cmUKKwltb3YgYXIucm5hdD1yMjQJCQkJLy8gTTIJcmVzdG9yZSBrZXJuZWwncyBBUi5STkFUCisJOzsKKwltb3YgYXIuYnNwc3RvcmU9cjIzCQkJLy8gTTIJcmVzdG9yZSBrZXJuZWwncyBBUi5CU1BTVE9SRQorCWJyLmNvbmQuc3B0ayAuYmFja19mcm9tX2JyZWFrX2ZpeHVwCiBFTkQoYnJlYWtfZmF1bHQpCiAKIAkub3JnIGlhNjRfaXZ0KzB4MzAwMApAQCAtODQyLDggKzg3OCw2IEBACiAJICoJLSByMzE6IHNhdmVkIHByCiAJICoJLSAgYjA6IG9yaWdpbmFsIGNvbnRlbnRzICh0byBiZSBzYXZlZCkKIAkgKiBPbiBleGl0OgotCSAqCS0gZXhlY3V0aW5nIG9uIGJhbmsgMSByZWdpc3RlcnMKLQkgKgktIHBzci5pYyBlbmFibGVkLCBpbnRlcnJ1cHRzIHJlc3RvcmVkCiAJICoJLSAgcDEwOiBUUlVFIGlmIHN5c2NhbGwgaXMgaW52b2tlZCB3aXRoIG1vcmUgdGhhbiA4IG91dAogCSAqCQlyZWdpc3RlcnMgb3IgcjE1J3MgTmF0IGlzIHRydWUKIAkgKgktICByMToga2VybmVsJ3MgZ3AKQEAgLTg1MSw4ICs4ODUsMTEgQEAKIAkgKgktICByODogLUVJTlZBTCBpZiBwMTAgaXMgdHJ1ZQogCSAqCS0gcjEyOiBwb2ludHMgdG8ga2VybmVsIHN0YWNrCiAJICoJLSByMTM6IHBvaW50cyB0byBjdXJyZW50IHRhc2sKKwkgKgktIHIxNDogcHJlc2VydmVkIChzYW1lIGFzIG9uIGVudHJ5KQorCSAqCS0gcDEzOiBwcmVzZXJ2ZWQKIAkgKgktIHAxNTogVFJVRSBpZiBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgcmUtZW5hYmxlZAogCSAqCS0gYXIuZnBzcjogc2V0IHRvIGtlcm5lbCBzZXR0aW5ncworCSAqCS0gIGI2OiBwcmVzZXJ2ZWQgKHNhbWUgYXMgb24gZW50cnkpCiAJICovCiBHTE9CQUxfRU5UUlkoaWE2NF9zeXNjYWxsX3NldHVwKQogI2lmIFBUKEI2KSAhPSAwCkBAIC05MjAsMTAgKzk1NywxMCBAQAogKHAxMykJbW92IGluNT0tMQogCTs7CiAJc3Q4IFtyMTZdPXIyMSxQVChSOCktUFQoQVJfRlBTUikJLy8gc2F2ZSBhci5mcHNyCi0JdG5hdC5ueiBwMTQscDA9aW42CisJdG5hdC5ueiBwMTMscDA9aW42CiAJY21wLmx0IHAxMCxwOT1yMTEscjgJLy8gZnJhbWUgc2l6ZSBjYW4ndCBiZSBtb3JlIHRoYW4gbG9jYWwrOAogCTs7Ci0Jc3RmOCBbcjE2XT1mMQkJLy8gZW5zdXJlIHB0X3JlZ3MucjggIT0gMCAoc2VlIGhhbmRsZV9zeXNjYWxsX2Vycm9yKQorCW1vdiByOD0xCiAocDkpCXRuYXQubnogcDEwLHAwPXIxNQogCWFkZHMgcjEyPS0xNixyMQkJLy8gc3dpdGNoIHRvIGtlcm5lbCBtZW1vcnkgc3RhY2sgKHdpdGggMTYgYnl0ZXMgb2Ygc2NyYXRjaCkKIApAQCAtOTM0LDkgKzk3MSw5IEBACiAJbW92IHIxMz1yMgkJCQkvLyBlc3RhYmxpc2ggYGN1cnJlbnQnCiAJbW92bCByMT1fX2dwCQkJCS8vIGVzdGFibGlzaCBrZXJuZWwgZ2xvYmFsIHBvaW50ZXIKIAk7OwotKHAxNCkJbW92IGluNj0tMQorCXN0OCBbcjE2XT1yOAkJLy8gZW5zdXJlIHB0X3JlZ3MucjggIT0gMCAoc2VlIGhhbmRsZV9zeXNjYWxsX2Vycm9yKQorKHAxMykJbW92IGluNj0tMQogKHA4KQltb3YgaW43PS0xCi0Jbm9wLmkgMAogCiAJY21wLmVxIHBTeXMscE5vblN5cz1yMCxyMAkJLy8gc2V0IHBTeXM9MSwgcE5vblN5cz0wCiAJbW92bCByMTc9RlBTUl9ERUZBVUxUCkBAIC0xMDA3LDYgKzEwNDQsOCBAQAogCUZBVUxUKDE3KQogCiBFTlRSWShub25fc3lzY2FsbCkKKwltb3YgYXIucnNjPXIyNwkJCS8vIHJlc3RvcmUgYXIucnNjIGJlZm9yZSBTQVZFX01JTl9XSVRIX0NPVkVSCisJOzsKIAlTQVZFX01JTl9XSVRIX0NPVkVSCiAKIAkvLyBUaGVyZSBpcyBubyBwYXJ0aWN1bGFyIHJlYXNvbiBmb3IgdGhpcyBjb2RlIHRvIGJlIGhlcmUsIG90aGVyIHRoYW4gdGhhdApAQCAtMTIwNCw2ICsxMjQzLDI1IEBACiAvLyAweDU2MDAgRW50cnkgMjYgKHNpemUgMTYgYnVuZGxlcykgTmF0IENvbnN1bXB0aW9uICgxMSwyMywzNyw1MCkKIEVOVFJZKG5hdF9jb25zdW1wdGlvbikKIAlEQkdfRkFVTFQoMjYpCisKKwltb3YgcjE2PWNyLmlwc3IKKwltb3YgcjE3PWNyLmlzcgorCW1vdiByMzE9cHIJCQkJLy8gc2F2ZSBQUgorCTs7CisJYW5kIHIxOD0weGYscjE3CQkJCS8vIHIxOCA9IGNyLmlwc3IuY29kZXszOjB9CisJdGJpdC56IHA2LHAwPXIxNyxJQTY0X0lTUl9OQV9CSVQKKwk7OworCWNtcC5uZS5vciBwNixwMD1JQTY0X0lTUl9DT0RFX0xGRVRDSCxyMTgKKwlkZXAgcjE2PS0xLHIxNixJQTY0X1BTUl9FRF9CSVQsMQorKHA2KQlici5jb25kLnNwbnQgMWYJCS8vIGJyYW5jaCBpZiAoY3IuaXNwci5uYSA9PSAwIHx8IGNyLmlwc3IuY29kZXszOjB9ICE9IExGRVRDSCkKKwk7OworCW1vdiBjci5pcHNyPXIxNgkJLy8gc2V0IGNyLmlwc3IubmEKKwltb3YgcHI9cjMxLC0xCisJOzsKKwlyZmkKKworMToJbW92IHByPXIzMSwtMQorCTs7CiAJRkFVTFQoMjYpCiBFTkQobmF0X2NvbnN1bXB0aW9uKQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDU5Nzg4MjMuLjg4NGY1Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0zNCw2ICszNCw3IEBACiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAogZXh0ZXJuIHZvaWQganByb2JlX2luc3RfcmV0dXJuKHZvaWQpOwogCkBAIC0yNjMsMTMgKzI2NCwzMyBAQAogCX0KIH0KIAorLyogUmV0dXJucyBub24temVybyBpZiB0aGUgYWRkciBpcyBpbiB0aGUgSW50ZXJydXB0IFZlY3RvciBUYWJsZSAqLworc3RhdGljIGlubGluZSBpbnQgaW5faXZ0X2Z1bmN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIChhZGRyID49ICh1bnNpZ25lZCBsb25nKV9fc3RhcnRfaXZ0X3RleHQKKwkJJiYgYWRkciA8ICh1bnNpZ25lZCBsb25nKV9fZW5kX2l2dF90ZXh0KTsKK30KKwogc3RhdGljIGludCB2YWxpZF9rcHJvYmVfYWRkcihpbnQgdGVtcGxhdGUsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaWYgKChzbG90ID4gMikgfHwgKChidW5kbGVfZW5jb2RpbmdbdGVtcGxhdGVdWzFdID09IEwpICYmIHNsb3QgPiAxKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdHRlbXB0aW5nIHRvIGluc2VydCB1bmFsaWduZWQga3Byb2JlIGF0IDB4JWx4XG4iLAotCQkJCWFkZHIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBdHRlbXB0aW5nIHRvIGluc2VydCB1bmFsaWduZWQga3Byb2JlICIKKwkJCQkiYXQgMHglbHhcbiIsIGFkZHIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKyAJaWYgKGluX2l2dF9mdW5jdGlvbnMoYWRkcikpIHsKKyAJCXByaW50ayhLRVJOX1dBUk5JTkcgIktwcm9iZXMgY2FuJ3QgYmUgaW5zZXJ0ZWQgaW5zaWRlICIKKwkJCQkiSVZUIGZ1bmN0aW9ucyBhdCAweCVseFxuIiwgYWRkcik7CisgCQlyZXR1cm4gLUVJTlZBTDsKKyAJfQorCisJaWYgKHNsb3QgPT0gMSAmJiBidW5kbGVfZW5jb2RpbmdbdGVtcGxhdGVdWzFdICE9IEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5zZXJ0aW5nIGtwcm9iZXMgb24gc2xvdCAjMSAiCisJCSAgICAgICAiaXMgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yOTAsNiArMzExLDk0IEBACiAJY3VycmVudF9rcHJvYmUgPSBwOwogfQogCitzdGF0aWMgdm9pZCBrcmV0cHJvYmVfdHJhbXBvbGluZSh2b2lkKQoreworfQorCisvKgorICogQXQgdGhpcyBwb2ludCB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGhhcyBiZWVuIHRyaWNrZWQgaW50bworICogcmV0dXJuaW5nIGludG8gb3VyIHRyYW1wb2xpbmUuICBMb29rdXAgdGhlIGFzc29jaWF0ZWQgaW5zdGFuY2UKKyAqIGFuZCB0aGVuOgorICogICAgLSBjYWxsIHRoZSBoYW5kbGVyIGZ1bmN0aW9uCisgKiAgICAtIGNsZWFudXAgYnkgbWFya2luZyB0aGUgaW5zdGFuY2UgYXMgdW51c2VkCisgKiAgICAtIGxvbmcganVtcCBiYWNrIHRvIHRoZSBvcmlnaW5hbCByZXR1cm4gYWRkcmVzcworICovCitpbnQgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKKwl1bnNpZ25lZCBsb25nIG9yaWdfcmV0X2FkZHJlc3MgPSAwOworCXVuc2lnbmVkIGxvbmcgdHJhbXBvbGluZV9hZGRyZXNzID0KKwkJKChzdHJ1Y3QgZm5wdHIgKilrcmV0cHJvYmVfdHJhbXBvbGluZSktPmlwOworCisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgorCSAqIHRhc2sgZWl0aGVyIGJlY2F1c2UgYW4gbXVsdGlwbGUgZnVuY3Rpb25zIGluIHRoZSBjYWxsIHBhdGgKKwkgKiBoYXZlIGEgcmV0dXJuIHByb2JlIGluc3RhbGxlZCBvbiB0aGVtLCBhbmQvb3IgbW9yZSB0aGVuIG9uZSByZXR1cm4KKwkgKiByZXR1cm4gcHJvYmUgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgdGFyZ2V0IGZ1bmN0aW9uLgorCSAqCisJICogV2UgY2FuIGhhbmRsZSB0aGlzIGJlY2F1c2U6CisJICogICAgIC0gaW5zdGFuY2VzIGFyZSBhbHdheXMgaW5zZXJ0ZWQgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QKKwkgKiAgICAgLSB3aGVuIG11bHRpcGxlIHJldHVybiBwcm9iZXMgYXJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBzYW1lCisJICogICAgICAgZnVuY3Rpb24sIHRoZSBmaXJzdCBpbnN0YW5jZSdzIHJldF9hZGRyIHdpbGwgcG9pbnQgdG8gdGhlCisJICogICAgICAgcmVhbCByZXR1cm4gYWRkcmVzcywgYW5kIGFsbCB0aGUgcmVzdCB3aWxsIHBvaW50IHRvCisJICogICAgICAga3JldHByb2JlX3RyYW1wb2xpbmUKKwkgKi8KKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJpLCBub2RlLCB0bXAsIGhlYWQsIGhsaXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHJpLT50YXNrICE9IGN1cnJlbnQpCisJCQkvKiBhbm90aGVyIHRhc2sgaXMgc2hhcmluZyBvdXIgaGFzaCBidWNrZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisJCWlmIChyaS0+cnAgJiYgcmktPnJwLT5oYW5kbGVyKQorCQkJcmktPnJwLT5oYW5kbGVyKHJpLCByZWdzKTsKKworCQlvcmlnX3JldF9hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpcmktPnJldF9hZGRyOworCQlyZWN5Y2xlX3JwX2luc3QocmkpOworCisJCWlmIChvcmlnX3JldF9hZGRyZXNzICE9IHRyYW1wb2xpbmVfYWRkcmVzcykKKwkJCS8qCisJCQkgKiBUaGlzIGlzIHRoZSByZWFsIHJldHVybiBhZGRyZXNzLiBBbnkgb3RoZXIKKwkJCSAqIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrIGFyZSBmb3IKKwkJCSAqIG90aGVyIGNhbGxzIGRlZXBlciBvbiB0aGUgY2FsbCBzdGFjaworCQkJICovCisJCQlicmVhazsKKwl9CisKKwlCVUdfT04oIW9yaWdfcmV0X2FkZHJlc3MgfHwgKG9yaWdfcmV0X2FkZHJlc3MgPT0gdHJhbXBvbGluZV9hZGRyZXNzKSk7CisJcmVncy0+Y3JfaWlwID0gb3JpZ19yZXRfYWRkcmVzczsKKworCXVubG9ja19rcHJvYmVzKCk7CisJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEJ5IHJldHVybmluZyBhIG5vbi16ZXJvIHZhbHVlLCB3ZSBhcmUgdGVsbGluZworICAgICAgICAgKiBrcHJvYmVfaGFuZGxlcigpIHRoYXQgd2UgaGF2ZSBoYW5kbGVkIHVubG9ja2luZworICAgICAgICAgKiBhbmQgcmUtZW5hYmxpbmcgcHJlZW1wdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworfQorCit2b2lkIGFyY2hfcHJlcGFyZV9rcmV0cHJvYmUoc3RydWN0IGtyZXRwcm9iZSAqcnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOworCisJaWYgKChyaSA9IGdldF9mcmVlX3JwX2luc3QocnApKSAhPSBOVUxMKSB7CisJCXJpLT5ycCA9IHJwOworCQlyaS0+dGFzayA9IGN1cnJlbnQ7CisJCXJpLT5yZXRfYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKilyZWdzLT5iMDsKKworCQkvKiBSZXBsYWNlIHRoZSByZXR1cm4gYWRkciB3aXRoIHRyYW1wb2xpbmUgYWRkciAqLworCQlyZWdzLT5iMCA9ICgoc3RydWN0IGZucHRyICopa3JldHByb2JlX3RyYW1wb2xpbmUpLT5pcDsKKworCQlhZGRfcnBfaW5zdChyaSk7CisJfSBlbHNlIHsKKwkJcnAtPm5taXNzZWQrKzsKKwl9Cit9CisKIGludCBhcmNoX3ByZXBhcmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHAtPmFkZHI7CkBAIC00OTIsOCArNjAxLDggQEAKIAlpZiAocC0+cHJlX2hhbmRsZXIgJiYgcC0+cHJlX2hhbmRsZXIocCwgcmVncykpCiAJCS8qCiAJCSAqIE91ciBwcmUtaGFuZGxlciBpcyBzcGVjaWZpY2FsbHkgcmVxdWVzdGluZyB0aGF0IHdlIGp1c3QKLQkJICogZG8gYSByZXR1cm4uICBUaGlzIGlzIGhhbmRsaW5nIHRoZSBjYXNlIHdoZXJlIHRoZQotCQkgKiBwcmUtaGFuZGxlciBpcyByZWFsbHkgb3VyIHNwZWNpYWwganByb2JlIHByZS1oYW5kbGVyLgorCQkgKiBkbyBhIHJldHVybi4gIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUganByb2JlIHByZS1oYW5kbGVyCisJCSAqIGFuZCB0aGUga3JldHByb2JlIHRyYW1wb2xpbmUKIAkJICovCiAJCXJldHVybiAxOwogCkBAIC01OTksMyArNzA4LDE0IEBACiAJKnJlZ3MgPSBqcHJvYmVfc2F2ZWRfcmVnczsKIAlyZXR1cm4gMTsKIH0KKworc3RhdGljIHN0cnVjdCBrcHJvYmUgdHJhbXBvbGluZV9wID0geworCS5wcmVfaGFuZGxlciA9IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcgorfTsKKworaW50IF9faW5pdCBhcmNoX2luaXRfa3Byb2Jlcyh2b2lkKQoreworCXRyYW1wb2xpbmVfcC5hZGRyID0KKwkJKGtwcm9iZV9vcGNvZGVfdCAqKSgoc3RydWN0IGZucHRyICopa3JldHByb2JlX3RyYW1wb2xpbmUpLT5pcDsKKwlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZ0cmFtcG9saW5lX3ApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKaW5kZXggNzM2ZTMyOC4uNGViYmYzOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIAogI2lmZGVmIENPTkZJR19BQ1BJCiAKLXN0YXRpYyBpbnQgY3BlX3ZlY3RvciA9IC0xOworaW50IGNwZV92ZWN0b3IgPSAtMTsKIAogc3RhdGljIGlycXJldHVybl90CiBpYTY0X21jYV9jcGVfaW50X2hhbmRsZXIgKGludCBjcGVfaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpwdHJlZ3MpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL251bWEuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbnVtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OGNlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva2VybmVsL251bWEuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBpYTY0IGtlcm5lbCBOVU1BIHNwZWNpZmljIHN0dWZmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEVyaWNoIEZvY2h0IDxlZm9jaHRAZXNzLm5lYy5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiAgIEplc3NlIEJhcm5lcyA8amJhcm5lc0BzZ2kuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3NtcC5oPgorCit1OCBjcHVfdG9fbm9kZV9tYXBbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKK0VYUE9SVF9TWU1CT0woY3B1X3RvX25vZGVfbWFwKTsKKworY3B1bWFza190IG5vZGVfdG9fY3B1X21hc2tbTUFYX05VTU5PREVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOworCisvKioKKyAqIGJ1aWxkX2NwdV90b19ub2RlX21hcCAtIHNldHVwIGNwdSB0byBub2RlIGFuZCBub2RlIHRvIGNwdW1hc2sgYXJyYXlzCisgKgorICogQnVpbGQgY3B1IHRvIG5vZGUgbWFwcGluZyBhbmQgaW5pdGlhbGl6ZSB0aGUgcGVyIG5vZGUgY3B1IG1hc2tzIHVzaW5nCisgKiBpbmZvIGZyb20gdGhlIG5vZGVfY3B1aWQgYXJyYXkgaGFuZGVkIHRvIHVzIGJ5IEFDUEkuCisgKi8KK3ZvaWQgX19pbml0IGJ1aWxkX2NwdV90b19ub2RlX21hcCh2b2lkKQoreworCWludCBjcHUsIGksIG5vZGU7CisKKwlmb3Iobm9kZT0wOyBub2RlIDwgTUFYX05VTU5PREVTOyBub2RlKyspCisJCWNwdXNfY2xlYXIobm9kZV90b19jcHVfbWFza1tub2RlXSk7CisKKwlmb3IoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgKytjcHUpIHsKKwkJbm9kZSA9IC0xOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgKytpKQorCQkJaWYgKGNwdV9waHlzaWNhbF9pZChjcHUpID09IG5vZGVfY3B1aWRbaV0ucGh5c19pZCkgeworCQkJCW5vZGUgPSBub2RlX2NwdWlkW2ldLm5pZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJY3B1X3RvX25vZGVfbWFwW2NwdV0gPSAobm9kZSA+PSAwKSA/IG5vZGUgOiAwOworCQlpZiAobm9kZSA+PSAwKQorCQkJY3B1X3NldChjcHUsIG5vZGVfdG9fY3B1X21hc2tbbm9kZV0pOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKaW5kZXggNjQwN2JmZi4uYjhlYmI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxhc20vZXJybm8uaD4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZWJiNzFmMy4uZTQ4NDkxMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KQEAgLTE5NSw2ICsxOTYsNyBAQAogdm9pZAogZGVmYXVsdF9pZGxlICh2b2lkKQogeworCWxvY2FsX2lycV9lbmFibGUoKTsKIAl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQogCQlpZiAoY2FuX2RvX3BhbF9oYWx0KQogCQkJc2FmZV9oYWx0KCk7CkBAIC03MDcsNiArNzA5LDEzIEBACiB2b2lkCiBmbHVzaF90aHJlYWQgKHZvaWQpCiB7CisJLyoKKwkgKiBSZW1vdmUgZnVuY3Rpb24tcmV0dXJuIHByb2JlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrCisJICogYW5kIHB1dCB0aGVtIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4gRG8gbm90IGluc2VydCBhbiBleGl0IHByb2JlIGZvcgorCSAqIHRoaXMgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZGlzYWJsZWQgYnkga3Byb2JlX2ZsdXNoX3Rhc2sgaWYgeW91IGRvLgorCSAqLworCWtwcm9iZV9mbHVzaF90YXNrKGN1cnJlbnQpOworCiAJLyogZHJvcCBmbG9hdGluZy1wb2ludCBhbmQgZGVidWctcmVnaXN0ZXIgc3RhdGUgaWYgaXQgZXhpc3RzOiAqLwogCWN1cnJlbnQtPnRocmVhZC5mbGFncyAmPSB+KElBNjRfVEhSRUFEX0ZQSF9WQUxJRCB8IElBNjRfVEhSRUFEX0RCR19WQUxJRCk7CiAJaWE2NF9kcm9wX2ZwdShjdXJyZW50KTsKQEAgLTcyMSw2ICs3MzAsMTQgQEAKIHZvaWQKIGV4aXRfdGhyZWFkICh2b2lkKQogeworCisJLyoKKwkgKiBSZW1vdmUgZnVuY3Rpb24tcmV0dXJuIHByb2JlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrCisJICogYW5kIHB1dCB0aGVtIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4gRG8gbm90IGluc2VydCBhbiBleGl0IHByb2JlIGZvcgorCSAqIHRoaXMgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZGlzYWJsZWQgYnkga3Byb2JlX2ZsdXNoX3Rhc2sgaWYgeW91IGRvLgorCSAqLworCWtwcm9iZV9mbHVzaF90YXNrKGN1cnJlbnQpOworCiAJaWE2NF9kcm9wX2ZwdShjdXJyZW50KTsKICNpZmRlZiBDT05GSUdfUEVSRk1PTgogICAgICAgIC8qIGlmIG5lZWRlZCwgc3RvcCBtb25pdG9yaW5nIGFuZCBmbHVzaCBzdGF0ZSB0byBwZXJmbW9uIGNvbnRleHQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL2lhNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDZkNTdhZWIuLmJiYjhiYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtNzI1LDEyICs3MjUsMzIgQEAKIAkJCWJyZWFrOwogCX0KIAorCS8qCisJICogTm90ZTogYXQgdGhlIHRpbWUgb2YgdGhpcyBjYWxsLCB0aGUgdGFyZ2V0IHRhc2sgaXMgYmxvY2tlZAorCSAqIGluIG5vdGlmeV9yZXN1bWVfdXNlcigpIGFuZCBieSBjbGVhcmxpbmcgUFJFRF9MRUFWRV9TWVNDQUxMCisJICogKGFrYSwgInBMdlN5cyIpIHdlIHJlZGlyZWN0IGV4ZWN1dGlvbiBmcm9tCisJICogLndvcmtfcGVuZGluZ19zeXNjYWxsX2VuZCB0byAud29ya19wcm9jZXNzZWRfa2VybmVsLgorCSAqLwogCXVud19nZXRfcHIoJnByZXZfaW5mbywgJnByKTsKLQlwciAmPSB+KDFVTCA8PCBQUkVEX1NZU0NBTEwpOworCXByICY9IH4oKDFVTCA8PCBQUkVEX1NZU0NBTEwpIHwgKDFVTCA8PCBQUkVEX0xFQVZFX1NZU0NBTEwpKTsKIAlwciB8PSAgKDFVTCA8PCBQUkVEX05PTl9TWVNDQUxMKTsKIAl1bndfc2V0X3ByKCZwcmV2X2luZm8sIHByKTsKIAogCXB0LT5jcl9pZnMgPSAoMVVMIDw8IDYzKSB8IGNmbTsKKwkvKgorCSAqIENsZWFyIHRoZSBtZW1vcnkgdGhhdCBpcyBOT1Qgd3JpdHRlbiBvbiBzeXNjYWxsLWVudHJ5IHRvCisJICogZW5zdXJlIHdlIGRvIG5vdCBsZWFrIGtlcm5lbC1zdGF0ZSB0byB1c2VyIHdoZW4gZXhlY3V0aW9uCisJICogcmVzdW1lcy4KKwkgKi8KKwlwdC0+cjIgPSAwOworCXB0LT5yMyA9IDA7CisJcHQtPnIxNCA9IDA7CisJbWVtc2V0KCZwdC0+cjE2LCAwLCAxNio4KTsJLyogY2xlYXIgcjE2LXIzMSAqLworCW1lbXNldCgmcHQtPmY2LCAwLCA2KjE2KTsJLyogY2xlYXIgZjYtZjExICovCisJcHQtPmI3ID0gMDsKKwlwdC0+YXJfY2N2ID0gMDsKKwlwdC0+YXJfY3NkID0gMDsKKwlwdC0+YXJfc3NkID0gMDsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGQxNDY5MmUuLjVjN2M5NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKQEAgLTQwLDYgKzQwLDggQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KIAogI2luY2x1ZGUgPGFzbS9pYTMyLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KQEAgLTcyLDYgKzc0LDggQEAKIHVuc2lnbmVkIGxvbmcgaWE2NF9jeWNsZXNfcGVyX3VzZWM7CiBzdHJ1Y3QgaWE2NF9ib290X3BhcmFtICppYTY0X2Jvb3RfcGFyYW07CiBzdHJ1Y3Qgc2NyZWVuX2luZm8gc2NyZWVuX2luZm87Cit1bnNpZ25lZCBsb25nIHZnYV9jb25zb2xlX2lvYmFzZTsKK3Vuc2lnbmVkIGxvbmcgdmdhX2NvbnNvbGVfbWVtYmFzZTsKIAogdW5zaWduZWQgbG9uZyBpYTY0X21heF9jYWNoZWxpbmVfc2l6ZTsKIHVuc2lnbmVkIGxvbmcgaWE2NF9pb2Jhc2U7CS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgSS9PIGFjY2Vzc2VzICovCkBAIC0yNzMsMjMgKzI3NywyNSBAQAogc3RhdGljIGlubGluZSBpbnQgX19pbml0CiBlYXJseV9jb25zb2xlX3NldHVwIChjaGFyICpjbWRsaW5lKQogeworCWludCBlYXJseWNvbnMgPSAwOworCiAjaWZkZWYgQ09ORklHX1NFUklBTF9TR0lfTDFfQ09OU09MRQogCXsKIAkJZXh0ZXJuIGludCBzbl9zZXJpYWxfY29uc29sZV9lYXJseV9zZXR1cCh2b2lkKTsKIAkJaWYgKCFzbl9zZXJpYWxfY29uc29sZV9lYXJseV9zZXR1cCgpKQotCQkJcmV0dXJuIDA7CisJCQllYXJseWNvbnMrKzsKIAl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRUZJX1BDRFAKIAlpZiAoIWVmaV9zZXR1cF9wY2RwX2NvbnNvbGUoY21kbGluZSkpCi0JCXJldHVybiAwOworCQllYXJseWNvbnMrKzsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCiAJaWYgKCFlYXJseV9zZXJpYWxfY29uc29sZV9pbml0KGNtZGxpbmUpKQotCQlyZXR1cm4gMDsKKwkJZWFybHljb25zKys7CiAjZW5kaWYKIAotCXJldHVybiAtMTsKKwlyZXR1cm4gKGVhcmx5Y29ucykgPyAwIDogLTE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNzc5LDYgKzc4NSw3IEBACiAJLyogc2l6ZSBvZiBwaHlzaWNhbCBzdGFja2VkIHJlZ2lzdGVyIHBhcnRpdGlvbiBwbHVzIDggYnl0ZXM6ICovCiAJX19nZXRfY3B1X3ZhcihpYTY0X3BoeXNfc3RhY2tlZF9zaXplX3A4KSA9IG51bV9waHlzX3N0YWNrZWQqOCArIDg7CiAJcGxhdGZvcm1fY3B1X2luaXQoKTsKKwlwbV9pZGxlID0gZGVmYXVsdF9pZGxlOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zaWduYWwuYwppbmRleCBlZGQ5ZjA3Li5iOGEwYTdkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2lnbmFsLmMKQEAgLTE0Myw2ICsxNDMsNyBAQAogCiAJCV9fY29weV9mcm9tX3VzZXIoY3VycmVudC0+dGhyZWFkLmZwaCwgJnNjLT5zY19mclszMl0sIDk2KjE2KTsKIAkJcHNyLT5tZmggPSAwOwkvKiBkcm9wIHNpZ25hbCBoYW5kbGVyJ3MgZnBoIGNvbnRlbnRzLi4uICovCisJCXByZWVtcHRfZGlzYWJsZSgpOwogCQlpZiAocHNyLT5kZmgpCiAJCQlpYTY0X2Ryb3BfZnB1KGN1cnJlbnQpOwogCQllbHNlIHsKQEAgLTE1MCw2ICsxNTEsNyBAQAogCQkJX19pYTY0X2xvYWRfZnB1KGN1cnJlbnQtPnRocmVhZC5mcGgpOwogCQkJaWE2NF9zZXRfbG9jYWxfZnB1X293bmVyKGN1cnJlbnQpOwogCQl9CisJCXByZWVtcHRfZW5hYmxlKCk7CiAJfQogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NtcC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXAuYwppbmRleCBiNDlkNGRkLi4wMTY2YTk4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wLmMKQEAgLTIzMSwxMyArMjMxLDE2IEBACiB2b2lkCiBzbXBfZmx1c2hfdGxiX21tIChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAkvKiB0aGlzIGhhcHBlbnMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZS10aHJlYWRlZCBmb3JrKCk6ICAqLwogCWlmIChsaWtlbHkobW0gPT0gY3VycmVudC0+YWN0aXZlX21tICYmIGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID09IDEpKQogCXsKIAkJbG9jYWxfZmluaXNoX2ZsdXNoX3RsYl9tbShtbSk7CisJCXByZWVtcHRfZW5hYmxlKCk7CiAJCXJldHVybjsKIAl9CiAKKwlwcmVlbXB0X2VuYWJsZSgpOwogCS8qCiAJICogV2UgY291bGQgb3B0aW1pemUgdGhpcyBmdXJ0aGVyIGJ5IHVzaW5nIG1tLT5jcHVfdm1fbWFzayB0byB0cmFjayB3aGljaCBDUFVzCiAJICogaGF2ZSBiZWVuIHJ1bm5pbmcgaW4gdGhlIGFkZHJlc3Mgc3BhY2UuICBJdCdzIG5vdCBjbGVhciB0aGF0IHRoaXMgaXMgd29ydGggdGhlCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDM4NjVmMDguLjdkNzJjMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jCkBAIC0zNDYsNiArMzQ2LDcgQEAKIAlsb2NrX2lwaV9jYWxsbG9jaygpOwogCWNwdV9zZXQoY3B1aWQsIGNwdV9vbmxpbmVfbWFwKTsKIAl1bmxvY2tfaXBpX2NhbGxsb2NrKCk7CisJcGVyX2NwdShjcHVfc3RhdGUsIGNwdWlkKSA9IENQVV9PTkxJTkU7CiAKIAlzbXBfc2V0dXBfcGVyY3B1X3RpbWVyKCk7CiAKQEAgLTUyNCw0NyArNTI1LDYgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfTlVNQQotCi0vKiBvbiB3aGljaCBub2RlIGlzIGVhY2ggbG9naWNhbCBDUFUgKG9uZSBjYWNoZWxpbmUgZXZlbiBmb3IgNjQgQ1BVcykgKi8KLXU4IGNwdV90b19ub2RlX21hcFtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwotRVhQT1JUX1NZTUJPTChjcHVfdG9fbm9kZV9tYXApOwotLyogd2hpY2ggbG9naWNhbCBDUFVzIGFyZSBvbiB3aGljaCBub2RlcyAqLwotY3B1bWFza190IG5vZGVfdG9fY3B1X21hc2tbTUFYX05VTU5PREVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOwotCi0vKgotICogQnVpbGQgY3B1IHRvIG5vZGUgbWFwcGluZyBhbmQgaW5pdGlhbGl6ZSB0aGUgcGVyIG5vZGUgY3B1IG1hc2tzLgotICovCi12b2lkIF9faW5pdAotYnVpbGRfY3B1X3RvX25vZGVfbWFwICh2b2lkKQotewotCWludCBjcHUsIGksIG5vZGU7Ci0KLQlmb3Iobm9kZT0wOyBub2RlPE1BWF9OVU1OT0RFUzsgbm9kZSsrKQotCQljcHVzX2NsZWFyKG5vZGVfdG9fY3B1X21hc2tbbm9kZV0pOwotCWZvcihjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyArK2NwdSkgewotCQkvKgotCQkgKiBBbGwgSXRhbml1bSBOVU1BIHBsYXRmb3JtcyBJIGtub3cgdXNlIEFDUEksIHNvIG1heWJlIHdlCi0JCSAqIGNhbiBkcm9wIHRoaXMgaWZkZWYgY29tcGxldGVseS4gICAgICAgICAgICAgICAgICAgIFtFRl0KLQkJICovCi0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCQlub2RlID0gLTE7Ci0JCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpCi0JCQlpZiAoY3B1X3BoeXNpY2FsX2lkKGNwdSkgPT0gbm9kZV9jcHVpZFtpXS5waHlzX2lkKSB7Ci0JCQkJbm9kZSA9IG5vZGVfY3B1aWRbaV0ubmlkOwotCQkJCWJyZWFrOwotCQkJfQotI2Vsc2UKLSMJCWVycm9yIEZpeG1lOiBEdW5ubyBob3cgdG8gYnVpbGQgQ1BVLXRvLW5vZGUgbWFwLgotI2VuZGlmCi0JCWNwdV90b19ub2RlX21hcFtjcHVdID0gKG5vZGUgPj0gMCkgPyBub2RlIDogMDsKLQkJaWYgKG5vZGUgPj0gMCkKLQkJCWNwdV9zZXQoY3B1LCBub2RlX3RvX2NwdV9tYXNrW25vZGVdKTsKLQl9Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwotCiAvKgogICogQ3ljbGUgdGhyb3VnaCB0aGUgQVBzIHNlbmRpbmcgV2FrZXVwIElQSXMgdG8gYm9vdCBlYWNoLgogICovCkBAIC02MTEsNiArNTcxLDcgQEAKIHsKIAljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X29ubGluZV9tYXApOwogCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfY2FsbGluX21hcCk7CisJcGVyX2NwdShjcHVfc3RhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBDUFVfT05MSU5FOwogfQogCiAvKgpAQCAtNjg4LDYgKzY0OSw3IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlyZW1vdmVfc2libGluZ2luZm8oY3B1KTsKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CiAJZml4dXBfaXJxcygpOwogCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKIAljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbGluX21hcCk7CkBAIC03NzQsNiArNzM2LDcgQEAKIAlpZiAoY3B1X2lzc2V0KGNwdSwgY3B1X2NhbGxpbl9tYXApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID0gQ1BVX1VQX1BSRVBBUkU7CiAJLyogUHJvY2Vzc29yIGdvZXMgdG8gc3RhcnRfc2Vjb25kYXJ5KCksIHNldHMgb25saW5lIGZsYWcgKi8KIAlyZXQgPSBkb19ib290X2NwdShzYXBpY2lkLCBjcHUpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCmluZGV4IGYxYWFmZDQuLmQ4MDMwZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKQEAgLTM2LDYgKzM2LDEzIEBACiAJcGFyZW50ID0gJnN5c2ZzX25vZGVzW2NwdV90b19ub2RlKG51bSldOwogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKKwkvKgorCSAqIElmIENQRUkgY2Fubm90IGJlIHJlLXRhcmdldHRlZCwgYW5kIHRoaXMgaXMKKwkgKiBDUEVJIHRhcmdldCwgdGhlbiBkb250IGNyZWF0ZSB0aGUgY29udHJvbCBmaWxlCisJICovCisJaWYgKCFjYW5fY3BlaV9yZXRhcmdldCgpICYmIGlzX2NwdV9jcGVpX3RhcmdldChudW0pKQorCQlzeXNmc19jcHVzW251bV0uY3B1Lm5vX2NvbnRyb2wgPSAxOworCiAJcmV0dXJuIHJlZ2lzdGVyX2NwdSgmc3lzZnNfY3B1c1tudW1dLmNwdSwgbnVtLCBwYXJlbnQpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMgYi9hcmNoL2lhNjQva2VybmVsL3RyYXBzLmMKaW5kZXggZTdlNTIwZC4uNDQ0MGM4MyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdHJhcHMuYwpAQCAtOTAsMTQgKzkwLDE2IEBACiAJCS5sb2NrX293bmVyX2RlcHRoID0JMAogCX07CiAJc3RhdGljIGludCBkaWVfY291bnRlcjsKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOwogCi0JaWYgKGRpZS5sb2NrX293bmVyICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCWlmIChkaWUubG9ja19vd25lciAhPSBjcHUpIHsKIAkJY29uc29sZV92ZXJib3NlKCk7CiAJCXNwaW5fbG9ja19pcnEoJmRpZS5sb2NrKTsKLQkJZGllLmxvY2tfb3duZXIgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCWRpZS5sb2NrX293bmVyID0gY3B1OwogCQlkaWUubG9ja19vd25lcl9kZXB0aCA9IDA7CiAJCWJ1c3Rfc3BpbmxvY2tzKDEpOwogCX0KKwlwdXRfY3B1KCk7CiAKIAlpZiAoKytkaWUubG9ja19vd25lcl9kZXB0aCA8IDMpIHsKIAkJcHJpbnRrKCIlc1slZF06ICVzICVsZCBbJWRdXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGI5ZjBkYjQuLmE2NzZlNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTgsNiArOCwxMSBAQAogI2RlZmluZSBMT0FEX09GRlNFVAkoS0VSTkVMX1NUQVJUIC0gS0VSTkVMX1RSX1BBR0VfU0laRSkKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgogCisjZGVmaW5lIElWVF9URVhUCQkJCQkJCVwKKwkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9pdnRfdGV4dCkgPSAuOwkJCVwKKwkJKigudGV4dC5pdnQpCQkJCQkJXAorCQlWTUxJTlVYX1NZTUJPTChfX2VuZF9pdnRfdGV4dCkgPSAuOworCiBPVVRQVVRfRk9STUFUKCJlbGY2NC1pYTY0LWxpdHRsZSIpCiBPVVRQVVRfQVJDSChpYTY0KQogRU5UUlkocGh5c19zdGFydCkKQEAgLTM5LDcgKzQ0LDcgQEAKIAogICAudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpCiAgICAgewotCSooLnRleHQuaXZ0KQorCUlWVF9URVhUCiAJKigudGV4dCkKIAlTQ0hFRF9URVhUCiAJTE9DS19URVhUCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKaW5kZXggZjNmZDUyOC4uYjVjOTBlNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwpAQCAtNDQsMTUwICs0NCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGVhcmx5X25vZGVfZGF0YSBtZW1fZGF0YVtNQVhfTlVNTk9ERVNdIF9faW5pdGRhdGE7Ci0KLS8qKgotICogcmVhc3NpZ25fY3B1X29ubHlfbm9kZXMgLSBjYWxsZWQgZnJvbSBmaW5kX21lbW9yeSB0byBtb3ZlIENQVS1vbmx5IG5vZGVzIHRvIGEgbWVtb3J5IG5vZGUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbW92ZSBub2RlcyB3aXRoIG9ubHkgQ1BVcyAobm8gbWVtb3J5KQotICogdG8gYSBub2RlIHdpdGggbWVtb3J5IHdoaWNoIGlzIGF0IHRoZSBtaW5pbXVtIG51bWFfc2xpdCBkaXN0YW5jZS4KLSAqIEFueSByZWFzc2lnbWVudHMgd2lsbCByZXN1bHQgaW4gdGhlIGNvbXByZXNzaW9uIG9mIHRoZSBub2RlcwotICogYW5kIHJlbnVtYmVyaW5nIHRoZSBuaWQgdmFsdWVzIHdoZXJlIGFwcHJvcHJpYXRlLgotICogVGhlIHN0YXRpYyBkZWNsYXJhdGlvbnMgYmVsb3cgYXJlIHRvIGF2b2lkIGxhcmdlIHN0YWNrIHNpemUgd2hpY2gKLSAqIG1ha2VzIHRoZSBjb2RlIG5vdCByZS1lbnRyYW50LgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhc3NpZ25fY3B1X29ubHlfbm9kZXModm9pZCkKLXsKLQlzdHJ1Y3Qgbm9kZV9tZW1ibGtfcyAqcDsKLQlpbnQgaSwgaiwgaywgbm5vZGUsIG5pZCwgY3B1LCBjcHVuaWQsIHB4bTsKLQl1OCBjc2xpdCwgc2xpdDsKLQlzdGF0aWMgREVDTEFSRV9CSVRNQVAobm9kZXNfd2l0aF9tZW0sIE1BWF9OVU1OT0RFUykgX19pbml0ZGF0YTsKLQlzdGF0aWMgdTggbnVtYV9zbGl0X2ZpeFtNQVhfTlVNTk9ERVMgKiBNQVhfTlVNTk9ERVNdIF9faW5pdGRhdGE7Ci0Jc3RhdGljIGludCBub2RlX2ZsaXBbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOwotCXN0YXRpYyBpbnQgb2xkX25pZF9tYXBbTlJfQ1BVU10gX19pbml0ZGF0YTsKLQotCWZvciAobm5vZGUgPSAwLCBwID0gJm5vZGVfbWVtYmxrWzBdOyBwIDwgJm5vZGVfbWVtYmxrW251bV9ub2RlX21lbWJsa3NdOyBwKyspCi0JCWlmICghdGVzdF9iaXQocC0+bmlkLCAodm9pZCAqKSBub2Rlc193aXRoX21lbSkpIHsKLQkJCXNldF9iaXQocC0+bmlkLCAodm9pZCAqKSBub2Rlc193aXRoX21lbSk7Ci0JCQlubm9kZSsrOwotCQl9Ci0KLQkvKgotCSAqIEFsbCBuaWRzIHdpdGggbWVtb3J5LgotCSAqLwotCWlmIChubm9kZSA9PSBudW1fb25saW5lX25vZGVzKCkpCi0JCXJldHVybjsKLQotCS8qCi0JICogQ2hhbmdlIG5pZHMgYW5kIGF0dGVtcHQgdG8gbWlncmF0ZSBDUFUtb25seSBub2RlcwotCSAqIHRvIHRoZSBiZXN0IG51bWFfc2xpdCAoY2xvc2VzdCBuZWlnaGJvcikgcG9zc2libGUuCi0JICogRm9yIHJlYXNzaWduZWQgQ1BVIG5vZGVzIGEgbmlkIGNhbid0IGJlIGFycml2ZWQgYXQKLQkgKiB1bnRpbCBhZnRlciB0aGlzIGxvb3AgYmVjYXVzZSB0aGUgdGFyZ2V0IG5pZCdzIG5ldwotCSAqIGlkZW50aXR5IG1pZ2h0IG5vdCBoYXZlIGJlZW4gZXN0YWJsaXNoZWQgeWV0LiBTbwotCSAqIG5ldyBuaWQgdmFsdWVzIGFyZSBmYWJyaWNhdGVkIGFib3ZlIG51bV9vbmxpbmVfbm9kZXMoKSBhbmQKLQkgKiBtYXBwZWQgYmFjayBsYXRlciB0byB0aGVpciB0cnVlIHZhbHVlLgotCSAqLwotCS8qIE1DRCAtIFRoaXMgY29kZSBpcyBhIGJpdCBjb21wbGljYXRlZCwgYnV0IG1heSBiZSB1bm5lY2Vzc2FyeSBub3cuCi0JICogV2UgY2FuIG5vdyBoYW5kbGUgbXVjaCBtb3JlIGludGVyZXN0aW5nIG5vZGUtbnVtYmVyaW5nLgotCSAqIFRoZSBvbGQgcmVxdWlyZW1lbnQgdGhhdCAwIDw9IG5pZCA8PSBudW1ub2RlcyA8PSBNQVhfTlVNTk9ERVMKLQkgKiBhbmQgdGhhdCB0aGVyZSBiZSBubyBob2xlcyBpbiB0aGUgbnVtYmVyaW5nIDAuLm51bW5vZGVzCi0JICogaGFzIGJlY29tZSBzaW1wbHkgMCA8PSBuaWQgPD0gTUFYX05VTU5PREVTLgotCSAqLwotCW5pZCA9IDA7Ci0JZm9yX2VhY2hfb25saW5lX25vZGUoaSkgIHsKLQkJaWYgKHRlc3RfYml0KGksICh2b2lkICopIG5vZGVzX3dpdGhfbWVtKSkgewotCQkJLyoKLQkJCSAqIFNhdmUgb3JpZ2luYWwgbmlkIHZhbHVlIGZvciBudW1hX3NsaXQKLQkJCSAqIGZpeHVwIGFuZCBub2RlX2NwdWlkIHJlYXNzaWdubWVudHMuCi0JCQkgKi8KLQkJCW5vZGVfZmxpcFtuaWRdID0gaTsKLQotCQkJaWYgKGkgPT0gbmlkKSB7Ci0JCQkJbmlkKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAocCA9ICZub2RlX21lbWJsa1swXTsgcCA8ICZub2RlX21lbWJsa1tudW1fbm9kZV9tZW1ibGtzXTsgcCsrKQotCQkJCWlmIChwLT5uaWQgPT0gaSkKLQkJCQkJcC0+bmlkID0gbmlkOwotCi0JCQljcHVuaWQgPSBuaWQ7Ci0JCQluaWQrKzsKLQkJfSBlbHNlCi0JCQljcHVuaWQgPSBNQVhfTlVNTk9ERVM7Ci0KLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykKLQkJCWlmIChub2RlX2NwdWlkW2NwdV0ubmlkID09IGkpIHsKLQkJCQkvKgotCQkJCSAqIEZvciBub2RlcyBub3QgYmVpbmcgcmVhc3NpZ25lZCBqdXN0Ci0JCQkJICogZml4IHRoZSBjcHUncyBuaWQgYW5kIHJldmVyc2UgcHhtIG1hcAotCQkJCSAqLwotCQkJCWlmIChjcHVuaWQgPCBNQVhfTlVNTk9ERVMpIHsKLQkJCQkJcHhtID0gbmlkX3RvX3B4bV9tYXBbaV07Ci0JCQkJCXB4bV90b19uaWRfbWFwW3B4bV0gPQotCQkJCQkgICAgICAgICAgbm9kZV9jcHVpZFtjcHVdLm5pZCA9IGNwdW5pZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBGb3Igbm9kZXMgYmVpbmcgcmVhc3NpZ25lZCwgZmluZCBiZXN0IG5vZGUgYnkKLQkJCQkgKiBudW1hX3NsaXQgaW5mb3JtYXRpb24gYW5kIHRoZW4gbWFrZSBhIHRlbXBvcmFyeQotCQkJCSAqIG5pZCB2YWx1ZSBiYXNlZCBvbiBjdXJyZW50IG5pZCBhbmQgbnVtX29ubGluZV9ub2RlcygpLgotCQkJCSAqLwotCQkJCXNsaXQgPSAweGZmOwotCQkJCWsgPSAyKm51bV9vbmxpbmVfbm9kZXMoKTsKLQkJCQlmb3JfZWFjaF9vbmxpbmVfbm9kZShqKSB7Ci0JCQkJCWlmIChpID09IGopCi0JCQkJCQljb250aW51ZTsKLQkJCQkJZWxzZSBpZiAodGVzdF9iaXQoaiwgKHZvaWQgKikgbm9kZXNfd2l0aF9tZW0pKSB7Ci0JCQkJCQljc2xpdCA9IG51bWFfc2xpdFtpICogbnVtX29ubGluZV9ub2RlcygpICsgal07Ci0JCQkJCQlpZiAoY3NsaXQgPCBzbGl0KSB7Ci0JCQkJCQkJayA9IG51bV9vbmxpbmVfbm9kZXMoKSArIGo7Ci0JCQkJCQkJc2xpdCA9IGNzbGl0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLyogc2F2ZSBvbGQgbmlkIG1hcCBzbyB3ZSBjYW4gdXBkYXRlIHRoZSBweG0gKi8KLQkJCQlvbGRfbmlkX21hcFtjcHVdID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKLQkJCQlub2RlX2NwdWlkW2NwdV0ubmlkID0gazsKLQkJCX0KLQl9Ci0KLQkvKgotCSAqIEZpeHVwIHRlbXBvcmFyeSBuaWQgdmFsdWVzIGZvciBDUFUtb25seSBub2Rlcy4KLQkgKi8KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQotCQlpZiAobm9kZV9jcHVpZFtjcHVdLm5pZCA9PSAoMipudW1fb25saW5lX25vZGVzKCkpKSB7Ci0JCQlweG0gPSBuaWRfdG9fcHhtX21hcFtvbGRfbmlkX21hcFtjcHVdXTsKLQkJCXB4bV90b19uaWRfbWFwW3B4bV0gPSBub2RlX2NwdWlkW2NwdV0ubmlkID0gbm5vZGUgLSAxOwotCQl9IGVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IG5ub2RlOyBpKyspIHsKLQkJCQlpZiAobm9kZV9mbGlwW2ldICE9IChub2RlX2NwdWlkW2NwdV0ubmlkIC0gbnVtX29ubGluZV9ub2RlcygpKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlweG0gPSBuaWRfdG9fcHhtX21hcFtvbGRfbmlkX21hcFtjcHVdXTsKLQkJCQlweG1fdG9fbmlkX21hcFtweG1dID0gbm9kZV9jcHVpZFtjcHVdLm5pZCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCS8qCi0JICogRml4IG51bWFfc2xpdCBieSBjb21wcmVzc2luZyBmcm9tIGxhcmdlcgotCSAqIG5pZCBhcnJheSB0byByZWR1Y2VkIG5pZCBhcnJheS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbm5vZGU7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IG5ub2RlOyBqKyspCi0JCQludW1hX3NsaXRfZml4W2kgKiBubm9kZSArIGpdID0KLQkJCQludW1hX3NsaXRbbm9kZV9mbGlwW2ldICogbnVtX29ubGluZV9ub2RlcygpICsgbm9kZV9mbGlwW2pdXTsKLQotCW1lbWNweShudW1hX3NsaXQsIG51bWFfc2xpdF9maXgsIHNpemVvZiAobnVtYV9zbGl0KSk7Ci0KLQlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOwotCWZvciAoaSA9IDA7IGkgPCBubm9kZTsgaSsrKQotCQlub2RlX3NldF9vbmxpbmUoaSk7Ci0KLQlyZXR1cm47Ci19CitzdGF0aWMgbm9kZW1hc2tfdCBtZW1vcnlfbGVzc19tYXNrIF9faW5pdGRhdGE7CiAKIC8qCiAgKiBUbyBwcmV2ZW50IGNhY2hlIGFsaWFzaW5nIGVmZmVjdHMsIGFsaWduIHBlci1ub2RlIHN0cnVjdHVyZXMgc28gdGhhdCB0aGV5CkBAIC0yMzMsMjggKzkwLDYgQEAKIH0KIAogLyoqCi0gKiBlYXJseV9ucl9waHlzX2NwdXNfbm9kZSAtIHJldHVybiBudW1iZXIgb2YgcGh5c2ljYWwgY3B1cyBvbiBhIGdpdmVuIG5vZGUKLSAqIEBub2RlOiBub2RlIHRvIGNoZWNrCi0gKgotICogQ291bnQgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjcHVzIG9uIEBub2RlLiAgVGhlc2UgYXJlIGNwdXMgdGhhdCBhY3R1YWxseQotICogZXhpc3QuICBXZSBjYW4ndCB1c2UgbnJfY3B1c19ub2RlKCkgeWV0IGJlY2F1c2UKLSAqIGFjcGlfYm9vdF9pbml0KCkgKHdoaWNoIGJ1aWxkcyB0aGUgbm9kZV90b19jcHVfbWFzayBhcnJheSkgaGFzbid0IGJlZW4KLSAqIGNhbGxlZCB5ZXQuCi0gKi8KLXN0YXRpYyBpbnQgZWFybHlfbnJfcGh5c19jcHVzX25vZGUoaW50IG5vZGUpCi17Ci0JaW50IGNwdSwgbiA9IDA7Ci0KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQotCQlpZiAobm9kZSA9PSBub2RlX2NwdWlkW2NwdV0ubmlkKQotCQkJaWYgKChjcHUgPT0gMCkgfHwgbm9kZV9jcHVpZFtjcHVdLnBoeXNfaWQpCi0JCQkJbisrOwotCi0JcmV0dXJuIG47Ci19Ci0KLQotLyoqCiAgKiBlYXJseV9ucl9jcHVzX25vZGUgLSByZXR1cm4gbnVtYmVyIG9mIGNwdXMgb24gYSBnaXZlbiBub2RlCiAgKiBAbm9kZTogbm9kZSB0byBjaGVjawogICoKQEAgLTI2Miw3ICs5Nyw3IEBACiAgKiBhY3BpX2Jvb3RfaW5pdCgpICh3aGljaCBidWlsZHMgdGhlIG5vZGVfdG9fY3B1X21hc2sgYXJyYXkpIGhhc24ndCBiZWVuCiAgKiBjYWxsZWQgeWV0LiAgTm90ZSB0aGF0IG5vZGUgMCB3aWxsIGFsc28gY291bnQgYWxsIG5vbi1leGlzdGVudCBjcHVzLgogICovCi1zdGF0aWMgaW50IGVhcmx5X25yX2NwdXNfbm9kZShpbnQgbm9kZSkKK3N0YXRpYyBpbnQgX19pbml0IGVhcmx5X25yX2NwdXNfbm9kZShpbnQgbm9kZSkKIHsKIAlpbnQgY3B1LCBuID0gMDsKIApAQCAtMjc0LDYgKzEwOSw4NSBAQAogfQogCiAvKioKKyAqIGNvbXB1dGVfcGVybm9kZXNpemUgLSBjb21wdXRlIHNpemUgb2YgcGVybm9kZSBkYXRhCisgKiBAbm9kZTogdGhlIG5vZGUgaWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBjb21wdXRlX3Blcm5vZGVzaXplKGludCBub2RlKQoreworCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemUgPSAwLCBjcHVzOworCisJY3B1cyA9IGVhcmx5X25yX2NwdXNfbm9kZShub2RlKTsKKwlwZXJub2Rlc2l6ZSArPSBQRVJDUFVfUEFHRV9TSVpFICogY3B1czsKKwlwZXJub2Rlc2l6ZSArPSBub2RlICogTDFfQ0FDSEVfQllURVM7CisJcGVybm9kZXNpemUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOworCXBlcm5vZGVzaXplICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWE2NF9ub2RlX2RhdGEpKTsKKwlwZXJub2Rlc2l6ZSA9IFBBR0VfQUxJR04ocGVybm9kZXNpemUpOworCXJldHVybiBwZXJub2Rlc2l6ZTsKK30KKworLyoqCisgKiBwZXJfY3B1X25vZGVfc2V0dXAgLSBzZXR1cCBwZXItY3B1IGFyZWFzIG9uIGVhY2ggbm9kZQorICogQGNwdV9kYXRhOiBwZXItY3B1IGFyZWEgb24gdGhpcyBub2RlCisgKiBAbm9kZTogbm9kZSB0byBzZXR1cAorICoKKyAqIENvcHkgdGhlIHN0YXRpYyBwZXItY3B1IGRhdGEgaW50byB0aGUgcmVnaW9uIHdlIGp1c3Qgc2V0IGFzaWRlIGFuZCB0aGVuCisgKiBzZXR1cCBfX3Blcl9jcHVfb2Zmc2V0IGZvciBlYWNoIENQVSBvbiB0aGlzIG5vZGUuICBSZXR1cm4gYSBwb2ludGVyIHRvCisgKiB0aGUgZW5kIG9mIHRoZSBhcmVhLgorICovCitzdGF0aWMgdm9pZCAqcGVyX2NwdV9ub2RlX3NldHVwKHZvaWQgKmNwdV9kYXRhLCBpbnQgbm9kZSkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJaW50IGNwdTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKKwkJaWYgKG5vZGUgPT0gbm9kZV9jcHVpZFtjcHVdLm5pZCkgeworCQkJbWVtY3B5KF9fdmEoY3B1X2RhdGEpLCBfX3BoeXNfcGVyX2NwdV9zdGFydCwKKwkJCSAgICAgICBfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0KTsKKwkJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IChjaGFyKilfX3ZhKGNwdV9kYXRhKSAtCisJCQkJX19wZXJfY3B1X3N0YXJ0OworCQkJY3B1X2RhdGEgKz0gUEVSQ1BVX1BBR0VfU0laRTsKKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBjcHVfZGF0YTsKK30KKworLyoqCisgKiBmaWxsX3Blcm5vZGUgLSBpbml0aWFsaXplIHBlcm5vZGUgZGF0YS4KKyAqIEBub2RlOiB0aGUgbm9kZSBpZC4KKyAqIEBwZXJub2RlOiBwaHlzaWNhbCBhZGRyZXNzIG9mIHBlcm5vZGUgZGF0YQorICogQHBlcm5vZGVzaXplOiBzaXplIG9mIHRoZSBwZXJub2RlIGRhdGEKKyAqLworc3RhdGljIHZvaWQgX19pbml0IGZpbGxfcGVybm9kZShpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyBwZXJub2RlLAorCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemUpCit7CisJdm9pZCAqY3B1X2RhdGE7CisJaW50IGNwdXMgPSBlYXJseV9ucl9jcHVzX25vZGUobm9kZSk7CisJc3RydWN0IGJvb3RtZW1fZGF0YSAqYmRwID0gJm1lbV9kYXRhW25vZGVdLmJvb3RtZW1fZGF0YTsKKworCW1lbV9kYXRhW25vZGVdLnBlcm5vZGVfYWRkciA9IHBlcm5vZGU7CisJbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9zaXplID0gcGVybm9kZXNpemU7CisJbWVtc2V0KF9fdmEocGVybm9kZSksIDAsIHBlcm5vZGVzaXplKTsKKworCWNwdV9kYXRhID0gKHZvaWQgKilwZXJub2RlOworCXBlcm5vZGUgKz0gUEVSQ1BVX1BBR0VfU0laRSAqIGNwdXM7CisJcGVybm9kZSArPSBub2RlICogTDFfQ0FDSEVfQllURVM7CisKKwltZW1fZGF0YVtub2RlXS5wZ2RhdCA9IF9fdmEocGVybm9kZSk7CisJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7CisKKwltZW1fZGF0YVtub2RlXS5ub2RlX2RhdGEgPSBfX3ZhKHBlcm5vZGUpOworCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHN0cnVjdCBpYTY0X25vZGVfZGF0YSkpOworCisJbWVtX2RhdGFbbm9kZV0ucGdkYXQtPmJkYXRhID0gYmRwOworCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOworCisJY3B1X2RhdGEgPSBwZXJfY3B1X25vZGVfc2V0dXAoY3B1X2RhdGEsIG5vZGUpOworCisJcmV0dXJuOworfQorCisvKioKICAqIGZpbmRfcGVybm9kZV9zcGFjZSAtIGFsbG9jYXRlIG1lbW9yeSBmb3IgbWVtb3J5IG1hcCBhbmQgcGVyLW5vZGUgc3RydWN0dXJlcwogICogQHN0YXJ0OiBwaHlzaWNhbCBzdGFydCBvZiByYW5nZQogICogQGxlbjogbGVuZ3RoIG9mIHJhbmdlCkBAIC0zMDQsOSArMjE4LDggQEAKIHN0YXRpYyBpbnQgX19pbml0IGZpbmRfcGVybm9kZV9zcGFjZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkgICAgIGludCBub2RlKQogewotCXVuc2lnbmVkIGxvbmcgZXBmbiwgY3B1LCBjcHVzLCBwaHlzX2NwdXM7CisJdW5zaWduZWQgbG9uZyBlcGZuOwogCXVuc2lnbmVkIGxvbmcgcGVybm9kZXNpemUgPSAwLCBwZXJub2RlLCBwYWdlcywgbWFwc2l6ZTsKLQl2b2lkICpjcHVfZGF0YTsKIAlzdHJ1Y3QgYm9vdG1lbV9kYXRhICpiZHAgPSAmbWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhOwogCiAJZXBmbiA9IChzdGFydCArIGxlbikgPj4gUEFHRV9TSElGVDsKQEAgLTMyOSw0OSArMjQyLDEyIEBACiAJICogQ2FsY3VsYXRlIHRvdGFsIHNpemUgbmVlZGVkLCBpbmNsLiB3aGF0J3MgbmVjZXNzYXJ5CiAJICogZm9yIGdvb2QgYWxpZ25tZW50IGFuZCBhbGlhcyBwcmV2ZW50aW9uLgogCSAqLwotCWNwdXMgPSBlYXJseV9ucl9jcHVzX25vZGUobm9kZSk7Ci0JcGh5c19jcHVzID0gZWFybHlfbnJfcGh5c19jcHVzX25vZGUobm9kZSk7Ci0JcGVybm9kZXNpemUgKz0gUEVSQ1BVX1BBR0VfU0laRSAqIGNwdXM7Ci0JcGVybm9kZXNpemUgKz0gbm9kZSAqIEwxX0NBQ0hFX0JZVEVTOwotCXBlcm5vZGVzaXplICs9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZihwZ19kYXRhX3QpKTsKLQlwZXJub2Rlc2l6ZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2Yoc3RydWN0IGlhNjRfbm9kZV9kYXRhKSk7Ci0JcGVybm9kZXNpemUgPSBQQUdFX0FMSUdOKHBlcm5vZGVzaXplKTsKKwlwZXJub2Rlc2l6ZSA9IGNvbXB1dGVfcGVybm9kZXNpemUobm9kZSk7CiAJcGVybm9kZSA9IE5PREVEQVRBX0FMSUdOKHN0YXJ0LCBub2RlKTsKIAogCS8qIElzIHRoaXMgcmFuZ2UgYmlnIGVub3VnaCBmb3Igd2hhdCB3ZSB3YW50IHRvIHN0b3JlIGhlcmU/ICovCi0JaWYgKHN0YXJ0ICsgbGVuID4gKHBlcm5vZGUgKyBwZXJub2Rlc2l6ZSArIG1hcHNpemUpKSB7Ci0JCW1lbV9kYXRhW25vZGVdLnBlcm5vZGVfYWRkciA9IHBlcm5vZGU7Ci0JCW1lbV9kYXRhW25vZGVdLnBlcm5vZGVfc2l6ZSA9IHBlcm5vZGVzaXplOwotCQltZW1zZXQoX192YShwZXJub2RlKSwgMCwgcGVybm9kZXNpemUpOwotCi0JCWNwdV9kYXRhID0gKHZvaWQgKilwZXJub2RlOwotCQlwZXJub2RlICs9IFBFUkNQVV9QQUdFX1NJWkUgKiBjcHVzOwotCQlwZXJub2RlICs9IG5vZGUgKiBMMV9DQUNIRV9CWVRFUzsKLQotCQltZW1fZGF0YVtub2RlXS5wZ2RhdCA9IF9fdmEocGVybm9kZSk7Ci0JCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHBnX2RhdGFfdCkpOwotCi0JCW1lbV9kYXRhW25vZGVdLm5vZGVfZGF0YSA9IF9fdmEocGVybm9kZSk7Ci0JCXBlcm5vZGUgKz0gTDFfQ0FDSEVfQUxJR04oc2l6ZW9mKHN0cnVjdCBpYTY0X25vZGVfZGF0YSkpOwotCi0JCW1lbV9kYXRhW25vZGVdLnBnZGF0LT5iZGF0YSA9IGJkcDsKLQkJcGVybm9kZSArPSBMMV9DQUNIRV9BTElHTihzaXplb2YocGdfZGF0YV90KSk7Ci0KLQkJLyoKLQkJICogQ29weSB0aGUgc3RhdGljIHBlci1jcHUgZGF0YSBpbnRvIHRoZSByZWdpb24gd2UKLQkJICoganVzdCBzZXQgYXNpZGUgYW5kIHRoZW4gc2V0dXAgX19wZXJfY3B1X29mZnNldAotCQkgKiBmb3IgZWFjaCBDUFUgb24gdGhpcyBub2RlLgotCQkgKi8KLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewotCQkJaWYgKG5vZGUgPT0gbm9kZV9jcHVpZFtjcHVdLm5pZCkgewotCQkJCW1lbWNweShfX3ZhKGNwdV9kYXRhKSwgX19waHlzX3Blcl9jcHVfc3RhcnQsCi0JCQkJICAgICAgIF9fcGVyX2NwdV9lbmQgLSBfX3Blcl9jcHVfc3RhcnQpOwotCQkJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IChjaGFyKilfX3ZhKGNwdV9kYXRhKSAtCi0JCQkJCV9fcGVyX2NwdV9zdGFydDsKLQkJCQljcHVfZGF0YSArPSBQRVJDUFVfUEFHRV9TSVpFOwotCQkJfQotCQl9Ci0JfQorCWlmIChzdGFydCArIGxlbiA+IChwZXJub2RlICsgcGVybm9kZXNpemUgKyBtYXBzaXplKSkKKwkJZmlsbF9wZXJub2RlKG5vZGUsIHBlcm5vZGUsIHBlcm5vZGVzaXplKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDExLDYgKzI4Nyw5IEBACiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewogCQlwZ19kYXRhX3QgKnBkcCA9IG1lbV9kYXRhW25vZGVdLnBnZGF0OwogCisJCWlmIChub2RlX2lzc2V0KG5vZGUsIG1lbW9yeV9sZXNzX21hc2spKQorCQkJY29udGludWU7CisKIAkJYmRwID0gcGRwLT5iZGF0YTsKIAogCQkvKiBGaXJzdCB0aGUgYm9vdG1lbV9tYXAgaXRzZWxmICovCkBAIC00MzYsOCArMzE1LDggQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IGluaXRpYWxpemVfcGVybm9kZV9kYXRhKHZvaWQpCiB7Ci0JaW50IGNwdSwgbm9kZTsKIAlwZ19kYXRhX3QgKnBnZGF0X2xpc3RbTUFYX05VTU5PREVTXTsKKwlpbnQgY3B1LCBub2RlOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKIAkJcGdkYXRfbGlzdFtub2RlXSA9IG1lbV9kYXRhW25vZGVdLnBnZGF0OwpAQCAtNDQ3LDEyICszMjYsOTkgQEAKIAkJbWVtY3B5KG1lbV9kYXRhW25vZGVdLm5vZGVfZGF0YS0+cGdfZGF0YV9wdHJzLCBwZ2RhdF9saXN0LAogCQkgICAgICAgc2l6ZW9mKHBnZGF0X2xpc3QpKTsKIAl9Ci0KKyNpZmRlZiBDT05GSUdfU01QCiAJLyogU2V0IHRoZSBub2RlX2RhdGEgcG9pbnRlciBmb3IgZWFjaCBwZXItY3B1IHN0cnVjdCAqLwogCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspIHsKIAkJbm9kZSA9IG5vZGVfY3B1aWRbY3B1XS5uaWQ7CiAJCXBlcl9jcHUoY3B1X2luZm8sIGNwdSkubm9kZV9kYXRhID0gbWVtX2RhdGFbbm9kZV0ubm9kZV9kYXRhOwogCX0KKyNlbHNlCisJeworCQlzdHJ1Y3QgY3B1aW5mb19pYTY0ICpjcHUwX2NwdV9pbmZvOworCQljcHUgPSAwOworCQlub2RlID0gbm9kZV9jcHVpZFtjcHVdLm5pZDsKKwkJY3B1MF9jcHVfaW5mbyA9IChzdHJ1Y3QgY3B1aW5mb19pYTY0ICopKF9fcGh5c19wZXJfY3B1X3N0YXJ0ICsKKwkJCSgoY2hhciAqKSZwZXJfY3B1X19jcHVfaW5mbyAtIF9fcGVyX2NwdV9zdGFydCkpOworCQljcHUwX2NwdV9pbmZvLT5ub2RlX2RhdGEgPSBtZW1fZGF0YVtub2RlXS5ub2RlX2RhdGE7CisJfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK30KKworLyoqCisgKiBtZW1vcnlfbGVzc19ub2RlX2FsbG9jIC0gKiBhdHRlbXB0IHRvIGFsbG9jYXRlIG1lbW9yeSBvbiB0aGUgYmVzdCBOVU1BIHNsaXQKKyAqIAlub2RlIGJ1dCBmYWxsIGJhY2sgdG8gYW55IG90aGVyIG5vZGUgd2hlbiBfX2FsbG9jX2Jvb3RtZW1fbm9kZSBmYWlscworICoJZm9yIGJlc3QuCisgKiBAbmlkOiBub2RlIGlkCisgKiBAcGVybm9kZXNpemU6IHNpemUgb2YgdGhpcyBub2RlJ3MgcGVybm9kZSBkYXRhCisgKiBAYWxpZ246IGFsaWdubWVudCB0byB1c2UgZm9yIHRoaXMgbm9kZSdzIHBlcm5vZGUgZGF0YQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgKm1lbW9yeV9sZXNzX25vZGVfYWxsb2MoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBwZXJub2Rlc2l6ZSwKKwl1bnNpZ25lZCBsb25nIGFsaWduKQoreworCXZvaWQgKnB0ciA9IE5VTEw7CisJdTggYmVzdCA9IDB4ZmY7CisJaW50IGJlc3Rub2RlID0gLTEsIG5vZGU7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CisJCWlmIChub2RlX2lzc2V0KG5vZGUsIG1lbW9yeV9sZXNzX21hc2spKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKG5vZGVfZGlzdGFuY2UobmlkLCBub2RlKSA8IGJlc3QpIHsKKwkJCWJlc3QgPSBub2RlX2Rpc3RhbmNlKG5pZCwgbm9kZSk7CisJCQliZXN0bm9kZSA9IG5vZGU7CisJCX0KKwl9CisKKwlwdHIgPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZShtZW1fZGF0YVtiZXN0bm9kZV0ucGdkYXQsCisJCXBlcm5vZGVzaXplLCBhbGlnbiwgX19wYShNQVhfRE1BX0FERFJFU1MpKTsKKworCWlmICghcHRyKQorCQlwYW5pYygiTk8gbWVtb3J5IGZvciBtZW1vcnkgbGVzcyBub2RlXG4iKTsKKwlyZXR1cm4gcHRyOworfQorCisvKioKKyAqIHBnZGF0X2luc2VydCAtIGluc2VydCB0aGUgcGdkYXQgaW50byBnbG9iYWwgcGdkYXRfbGlzdAorICogQHBnZGF0OiB0aGUgcGdkYXQgZm9yIGEgbm9kZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBnZGF0X2luc2VydChwZ19kYXRhX3QgKnBnZGF0KQoreworCXBnX2RhdGFfdCAqcHJldiA9IE5VTEwsICpuZXh0OworCisJZm9yX2VhY2hfcGdkYXQobmV4dCkKKwkJaWYgKHBnZGF0LT5ub2RlX2lkIDwgbmV4dC0+bm9kZV9pZCkKKwkJCWJyZWFrOworCQllbHNlCisJCQlwcmV2ID0gbmV4dDsKKworCWlmIChwcmV2KSB7CisJCXByZXYtPnBnZGF0X25leHQgPSBwZ2RhdDsKKwkJcGdkYXQtPnBnZGF0X25leHQgPSBuZXh0OworCX0gZWxzZSB7CisJCXBnZGF0LT5wZ2RhdF9uZXh0ID0gcGdkYXRfbGlzdDsKKwkJcGdkYXRfbGlzdCA9IHBnZGF0OworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBtZW1vcnlfbGVzc19ub2RlcyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIENQVSBvbmx5IG5vZGVzIHBlcm5vZGUKKyAqCWluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbWVtb3J5X2xlc3Nfbm9kZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBlcm5vZGVzaXplOworCXZvaWQgKnBlcm5vZGU7CisJaW50IG5vZGU7CisKKwlmb3JfZWFjaF9ub2RlX21hc2sobm9kZSwgbWVtb3J5X2xlc3NfbWFzaykgeworCQlwZXJub2Rlc2l6ZSA9IGNvbXB1dGVfcGVybm9kZXNpemUobm9kZSk7CisJCXBlcm5vZGUgPSBtZW1vcnlfbGVzc19ub2RlX2FsbG9jKG5vZGUsIHBlcm5vZGVzaXplLAorCQkJKG5vZGUpID8gKG5vZGUgKiBQRVJDUFVfUEFHRV9TSVpFKSA6ICgxMDI0KjEwMjQpKTsKKwkJZmlsbF9wZXJub2RlKG5vZGUsIF9fcGEocGVybm9kZSksIHBlcm5vZGVzaXplKTsKKwl9CisKKwlyZXR1cm47CiB9CiAKIC8qKgpAQCAtNDcyLDE2ICs0MzgsMTkgQEAKIAkJbm9kZV9zZXRfb25saW5lKDApOwogCX0KIAorCW5vZGVzX29yKG1lbW9yeV9sZXNzX21hc2ssIG1lbW9yeV9sZXNzX21hc2ssIG5vZGVfb25saW5lX21hcCk7CiAJbWluX2xvd19wZm4gPSAtMTsKIAltYXhfbG93X3BmbiA9IDA7CiAKLQlpZiAobnVtX29ubGluZV9ub2RlcygpID4gMSkKLQkJcmVhc3NpZ25fY3B1X29ubHlfbm9kZXMoKTsKLQogCS8qIFRoZXNlIGFjdHVhbGx5IGVuZCB1cCBnZXR0aW5nIGNhbGxlZCBieSBjYWxsX3Blcm5vZGVfbWVtb3J5KCkgKi8KIAllZmlfbWVtbWFwX3dhbGsoZmlsdGVyX3JzdmRfbWVtb3J5LCBidWlsZF9ub2RlX21hcHMpOwogCWVmaV9tZW1tYXBfd2FsayhmaWx0ZXJfcnN2ZF9tZW1vcnksIGZpbmRfcGVybm9kZV9zcGFjZSk7CiAKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKQorCQlpZiAobWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhLm5vZGVfbG93X3BmbikgeworCQkJbm9kZV9jbGVhcihub2RlLCBtZW1vcnlfbGVzc19tYXNrKTsKKwkJCW1lbV9kYXRhW25vZGVdLm1pbl9wZm4gPSB+MFVMOworCQl9CiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBib290IG1lbW9yeSBtYXBzIGluIHJldmVyc2Ugb3JkZXIgc2luY2UgdGhhdCdzCiAJICogd2hhdCB0aGUgYm9vdG1lbSBhbGxvY2F0b3IgZXhwZWN0cwpAQCAtNDkyLDE3ICs0NjEsMTQgQEAKIAogCQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKQogCQkJY29udGludWU7CisJCWVsc2UgaWYgKG5vZGVfaXNzZXQobm9kZSwgbWVtb3J5X2xlc3NfbWFzaykpCisJCQljb250aW51ZTsKIAogCQliZHAgPSAmbWVtX2RhdGFbbm9kZV0uYm9vdG1lbV9kYXRhOwogCQlwZXJub2RlID0gbWVtX2RhdGFbbm9kZV0ucGVybm9kZV9hZGRyOwogCQlwZXJub2Rlc2l6ZSA9IG1lbV9kYXRhW25vZGVdLnBlcm5vZGVfc2l6ZTsKIAkJbWFwID0gcGVybm9kZSArIHBlcm5vZGVzaXplOwogCi0JCS8qIFNhbml0eSBjaGVjay4uLiAqLwotCQlpZiAoIXBlcm5vZGUpCi0JCQlwYW5pYygicGVybm9kZSBzcGFjZSBmb3Igbm9kZSAlZCAiCi0JCQkgICAgICAiY291bGQgbm90IGJlIGFsbG9jYXRlZCEiLCBub2RlKTsKLQogCQlpbml0X2Jvb3RtZW1fbm9kZShtZW1fZGF0YVtub2RlXS5wZ2RhdCwKIAkJCQkgIG1hcD4+UEFHRV9TSElGVCwKIAkJCQkgIGJkcC0+bm9kZV9ib290X3N0YXJ0Pj5QQUdFX1NISUZULApAQCAtNTEyLDYgKzQ3OCw3IEBACiAJZWZpX21lbW1hcF93YWxrKGZpbHRlcl9yc3ZkX21lbW9yeSwgZnJlZV9ub2RlX2Jvb3RtZW0pOwogCiAJcmVzZXJ2ZV9wZXJub2RlX3NwYWNlKCk7CisJbWVtb3J5X2xlc3Nfbm9kZXMoKTsKIAlpbml0aWFsaXplX3Blcm5vZGVfZGF0YSgpOwogCiAJbWF4X3BmbiA9IG1heF9sb3dfcGZuOwpAQCAtNTE5LDYgKzQ4Niw3IEBACiAJZmluZF9pbml0cmQoKTsKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIC8qKgogICogcGVyX2NwdV9pbml0IC0gc2V0dXAgcGVyLWNwdSB2YXJpYWJsZXMKICAqCkBAIC01MjksMTUgKzQ5NywxNSBAQAogewogCWludCBjcHU7CiAKLQlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IDApIHsKLQkJZm9yIChjcHUgPSAwOyBjcHUgPCBOUl9DUFVTOyBjcHUrKykgewotCQkJcGVyX2NwdShsb2NhbF9wZXJfY3B1X29mZnNldCwgY3B1KSA9Ci0JCQkJX19wZXJfY3B1X29mZnNldFtjcHVdOwotCQl9Ci0JfQorCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkKKwkJcmV0dXJuIF9fcGVyX2NwdV9zdGFydCArIF9fcGVyX2NwdV9vZmZzZXRbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgTlJfQ1BVUzsgY3B1KyspCisJCXBlcl9jcHUobG9jYWxfcGVyX2NwdV9vZmZzZXQsIGNwdSkgPSBfX3Blcl9jcHVfb2Zmc2V0W2NwdV07CiAKIAlyZXR1cm4gX19wZXJfY3B1X3N0YXJ0ICsgX19wZXJfY3B1X29mZnNldFtzbXBfcHJvY2Vzc29yX2lkKCldOwogfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoqCiAgKiBzaG93X21lbSAtIGdpdmUgc2hvcnQgc3VtbWFyeSBvZiBtZW1vcnkgc3RhdHMKQEAgLTY4MCwxMiArNjQ4LDEzIEBACiAKIAltYXhfZG1hID0gdmlydF90b19waHlzKCh2b2lkICopIE1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKIAotCS8qIHNvIG1pbigpIHdpbGwgd29yayBpbiBjb3VudF9ub2RlX3BhZ2VzICovCi0JZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKLQkJbWVtX2RhdGFbbm9kZV0ubWluX3BmbiA9IH4wVUw7Ci0KIAllZmlfbWVtbWFwX3dhbGsoZmlsdGVyX3JzdmRfbWVtb3J5LCBjb3VudF9ub2RlX3BhZ2VzKTsKIAorCXZtYWxsb2NfZW5kIC09IFBBR0VfQUxJR04obWF4X2xvd19wZm4gKiBzaXplb2Yoc3RydWN0IHBhZ2UpKTsKKwl2bWVtX21hcCA9IChzdHJ1Y3QgcGFnZSAqKSB2bWFsbG9jX2VuZDsKKwllZmlfbWVtbWFwX3dhbGsoY3JlYXRlX21lbV9tYXBfcGFnZV90YWJsZSwgTlVMTCk7CisJcHJpbnRrKCJWaXJ0dWFsIG1lbV9tYXAgc3RhcnRzIGF0IDB4JXBcbiIsIHZtZW1fbWFwKTsKKwogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAkJbWVtc2V0KHpvbmVzX3NpemUsIDAsIHNpemVvZih6b25lc19zaXplKSk7CiAJCW1lbXNldCh6aG9sZXNfc2l6ZSwgMCwgc2l6ZW9mKHpob2xlc19zaXplKSk7CkBAIC03MTksMTUgKzY4OCw2IEBACiAJCQkJIG1lbV9kYXRhW25vZGVdLm51bV9kbWFfcGh5c3BhZ2VzKTsKIAkJfQogCi0JCWlmIChub2RlID09IDApIHsKLQkJCXZtYWxsb2NfZW5kIC09Ci0JCQkJUEFHRV9BTElHTihtYXhfbG93X3BmbiAqIHNpemVvZihzdHJ1Y3QgcGFnZSkpOwotCQkJdm1lbV9tYXAgPSAoc3RydWN0IHBhZ2UgKikgdm1hbGxvY19lbmQ7Ci0KLQkJCWVmaV9tZW1tYXBfd2FsayhjcmVhdGVfbWVtX21hcF9wYWdlX3RhYmxlLCBOVUxMKTsKLQkJCXByaW50aygiVmlydHVhbCBtZW1fbWFwIHN0YXJ0cyBhdCAweCVwXG4iLCB2bWVtX21hcCk7Ci0JCX0KLQogCQlwZm5fb2Zmc2V0ID0gbWVtX2RhdGFbbm9kZV0ubWluX3BmbjsKIAogCQlOT0RFX0RBVEEobm9kZSktPm5vZGVfbWVtX21hcCA9IHZtZW1fbWFwICsgcGZuX29mZnNldDsKQEAgLTczNSw1ICs2OTUsMTEgQEAKIAkJCQkgICAgcGZuX29mZnNldCwgemhvbGVzX3NpemUpOwogCX0KIAorCS8qCisJICogTWFrZSBtZW1vcnkgbGVzcyBub2RlcyBiZWNvbWUgYSBtZW1iZXIgb2YgdGhlIGtub3duIG5vZGVzLgorCSAqLworCWZvcl9lYWNoX25vZGVfbWFzayhub2RlLCBtZW1vcnlfbGVzc19tYXNrKQorCQlwZ2RhdF9pbnNlcnQobWVtX2RhdGFbbm9kZV0ucGdkYXQpOworCiAJemVyb19wYWdlX21lbW1hcF9wdHIgPSB2aXJ0X3RvX3BhZ2UoaWE2NF9pbXZhKGVtcHR5X3plcm9fcGFnZSkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2luaXQuYyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKaW5kZXggNGViMmY1Mi4uNjVmOTk1OCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2luaXQuYworKysgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCkBAIC01OTcsNyArNTk3LDggQEAKIAlrY2xpc3RfYWRkKCZrY29yZV9rZXJuZWwsIF9zdGV4dCwgX2VuZCAtIF9zdGV4dCk7CiAKIAlmb3JfZWFjaF9wZ2RhdChwZ2RhdCkKLQkJdG90YWxyYW1fcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbV9ub2RlKHBnZGF0KTsKKwkJaWYgKHBnZGF0LT5iZGF0YS0+bm9kZV9ib290bWVtX21hcCkKKwkJCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYWxsX2Jvb3RtZW1fbm9kZShwZ2RhdCk7CiAKIAlyZXNlcnZlZF9wYWdlcyA9IDA7CiAJZWZpX21lbW1hcF93YWxrKGNvdW50X3Jlc2VydmVkX3BhZ2VzLCAmcmVzZXJ2ZWRfcGFnZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3BjaS9wY2kuYyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKaW5kZXggZTNmYzRlZC4uNzIwYTg2MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3BjaS9wY2kuYworKysgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAlhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLCBhZGRfd2luZG93LAogCQkJJmluZm8pOwogCi0JcGJ1cyA9IHBjaV9zY2FuX2J1cyhidXMsICZwY2lfcm9vdF9vcHMsIGNvbnRyb2xsZXIpOworCXBidXMgPSBwY2lfc2Nhbl9idXNfcGFyZW50ZWQoTlVMTCwgYnVzLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKIAlpZiAocGJ1cykKIAkJcGNpYmlvc19zZXR1cF9yb290X3dpbmRvd3MocGJ1cywgY29udHJvbGxlcik7CiAKQEAgLTM3Myw2ICszNzMsMjUgQEAKIAlyZXMtPmVuZCA9IHJlZ2lvbi0+ZW5kICsgb2Zmc2V0OwogfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpc192YWxpZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGludCBpLCB0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU07CisJc3RydWN0IHJlc291cmNlICpkZXZyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKworCWlmICghZGV2LT5idXMpCisJCXJldHVybiAwOworCWZvciAoaT0wOyBpPFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqYnVzciA9IGRldi0+YnVzLT5yZXNvdXJjZVtpXTsKKworCQlpZiAoIWJ1c3IgfHwgKChidXNyLT5mbGFncyBeIGRldnItPmZsYWdzKSAmIHR5cGVfbWFzaykpCisJCQljb250aW51ZTsKKwkJaWYgKChkZXZyLT5zdGFydCkgJiYgKGRldnItPnN0YXJ0ID49IGJ1c3ItPnN0YXJ0KSAmJgorCQkJCShkZXZyLT5lbmQgPD0gYnVzci0+ZW5kKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgX19kZXZpbml0IHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiByZWdpb247CkBAIC0zODYsNyArNDA1LDggQEAKIAkJcmVnaW9uLnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKIAkJcmVnaW9uLmVuZCA9IGRldi0+cmVzb3VyY2VbaV0uZW5kOwogCQlwY2liaW9zX2J1c190b19yZXNvdXJjZShkZXYsICZkZXYtPnJlc291cmNlW2ldLCAmcmVnaW9uKTsKLQkJcGNpX2NsYWltX3Jlc291cmNlKGRldiwgaSk7CisJCWlmICgoaXNfdmFsaWRfcmVzb3VyY2UoZGV2LCBpKSkpCisJCQlwY2lfY2xhaW1fcmVzb3VyY2UoZGV2LCBpKTsKIAl9CiB9CiAKQEAgLTM5OCw2ICs0MTgsMTAgQEAKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCisJaWYgKGItPnNlbGYpIHsKKwkJcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKGIpOworCQlwY2liaW9zX2ZpeHVwX2RldmljZV9yZXNvdXJjZXMoYi0+c2VsZik7CisJfQogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYi0+ZGV2aWNlcywgYnVzX2xpc3QpCiAJCXBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhkZXYpOwogCkBAIC00MTgsMTggKzQ0MiwyNCBAQAogCXUxNiBjbWQsIG9sZF9jbWQ7CiAJaW50IGlkeDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJdW5zaWduZWQgbG9uZyB0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU07CiAKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmY21kKTsKIAlvbGRfY21kID0gY21kOwotCWZvciAoaWR4PTA7IGlkeDw2OyBpZHgrKykgeworCWZvciAoaWR4PTA7IGlkeDxQQ0lfTlVNX1JFU09VUkNFUzsgaWR4KyspIHsKIAkJLyogT25seSBzZXQgdXAgdGhlIGRlc2lyZWQgcmVzb3VyY2VzLiAgKi8KIAkJaWYgKCEobWFzayAmICgxIDw8IGlkeCkpKQogCQkJY29udGludWU7CiAKIAkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CisJCWlmICghKHItPmZsYWdzICYgdHlwZV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGlkeCA9PSBQQ0lfUk9NX1JFU09VUkNFKSAmJgorCQkJCSghKHItPmZsYWdzICYgSU9SRVNPVVJDRV9ST01fRU5BQkxFKSkpCisJCQljb250aW51ZTsKIAkJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKIAkJCXByaW50ayhLRVJOX0VSUgogCQkJICAgICAgICJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIGJlY2F1c2Ugb2YgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwKQEAgLTQ0MSw4ICs0NzEsNiBAQAogCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKIAkJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CiAJfQotCWlmIChkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLnN0YXJ0KQotCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwogCWlmIChjbWQgIT0gb2xkX2NtZCkgewogCQlwcmludGsoIlBDSTogRW5hYmxpbmcgZGV2aWNlICVzICglMDR4IC0+ICUwNHgpXG4iLCBwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS9wY2licl9wcm92aWRlci5oIGIvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BjaWJyX3Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDI5MWQuLjAwMDAwMDAKLS0tIGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BjaWJyX3Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLSNpZm5kZWYgX0FTTV9JQTY0X1NOX1BDSV9QQ0lCUl9QUk9WSURFUl9ICi0jZGVmaW5lIF9BU01fSUE2NF9TTl9QQ0lfUENJQlJfUFJPVklERVJfSAotCi0vKiBXb3JrYXJvdW5kcyAqLwotI2RlZmluZSBQVjkwNzUxNiAoMSA8PCAxKSAvKiBUSU9DUDogRG9uJ3Qgd3JpdGUgdGhlIHdyaXRlIGJ1ZmZlciBmbHVzaCByZWcgKi8KLQotI2RlZmluZSBCVVNUWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MQotCi0vKiBNYWNyb3MgZ2l2ZW4gYSBwY2lidXMgc3RydWN0dXJlICovCi0jZGVmaW5lIElTX1BDSVgocHMpICAgICAoKHBzKS0+cGJpX2JyaWRnZV9tb2RlICYgQlVTVFlQRV9NQVNLKQotI2RlZmluZSBJU19QQ0lfQlJJREdFX0FTSUMoYXNpYykgKGFzaWMgPT0gUENJSU9fQVNJQ19UWVBFX1BJQyB8fCBcCi0gICAgICAgICAgICAgICAgYXNpYyA9PSBQQ0lJT19BU0lDX1RZUEVfVElPQ1ApCi0jZGVmaW5lIElTX1BJQ19TT0ZUKHBzKSAgICAgKHBzLT5wYmlfYnJpZGdlX3R5cGUgPT0gUENJQlJfQlJJREdFVFlQRV9QSUMpCi0KLQotLyogCi0gKiBUaGUgZGlmZmVyZW50IFBDSSBCcmlkZ2UgdHlwZXMgc3VwcG9ydGVkIG9uIHRoZSBTR0kgQWx0aXggcGxhdGZvcm1zCi0gKi8KLSNkZWZpbmUgUENJQlJfQlJJREdFVFlQRV9VTktOT1dOICAgICAgIC0xCi0jZGVmaW5lIFBDSUJSX0JSSURHRVRZUEVfUElDICAgICAgICAgICAgMgotI2RlZmluZSBQQ0lCUl9CUklER0VUWVBFX1RJT0NQICAgICAgICAgIDMKLQotLyoKLSAqIEJyaWRnZSA2NGJpdCBEaXJlY3QgTWFwIEF0dHJpYnV0ZXMKLSAqLwotI2RlZmluZSBQQ0k2NF9BVFRSX1BSRUYgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU5KQotI2RlZmluZSBQQ0k2NF9BVFRSX1BSRUMgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU4KQotI2RlZmluZSBQQ0k2NF9BVFRSX1ZJUlRVQUwgICAgICAgICAgICAgICgxdWxsIDw8IDU3KQotI2RlZmluZSBQQ0k2NF9BVFRSX0JBUiAgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU2KQotI2RlZmluZSBQQ0k2NF9BVFRSX1NXQVAgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU1KQotI2RlZmluZSBQQ0k2NF9BVFRSX1ZJUlRVQUwxICAgICAgICAgICAgICgxdWxsIDw8IDU0KQotCi0jZGVmaW5lIFBDSTMyX0xPQ0FMX0JBU0UgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQQ0kzMl9NQVBQRURfQkFTRSAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgUENJMzJfRElSRUNUX0JBU0UgICAgICAgICAgICAgICAweDgwMDAwMDAwCi0KLSNkZWZpbmUgSVNfUENJMzJfTUFQUEVEKHgpICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSA8IFBDSTMyX0RJUkVDVF9CQVNFICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKLSNkZWZpbmUgSVNfUENJMzJfRElSRUNUKHgpICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKLQotCi0vKgotICogQnJpZGdlIFBNVSBBZGRyZXNzIFRyYW5zYWx0aW9uIEVudHJ5IEF0dGlidXRlcwotICovCi0jZGVmaW5lIFBDSTMyX0FURV9WICAgICAgICAgICAgICAgICAgICAgKDB4MSA8PCAwKQotI2RlZmluZSBQQ0kzMl9BVEVfQ08gICAgICAgICAgICAgICAgICAgICgweDEgPDwgMSkKLSNkZWZpbmUgUENJMzJfQVRFX1BSRUMgICAgICAgICAgICAgICAgICAoMHgxIDw8IDIpCi0jZGVmaW5lIFBDSTMyX0FURV9QUkVGICAgICAgICAgICAgICAgICAgKDB4MSA8PCAzKQotI2RlZmluZSBQQ0kzMl9BVEVfQkFSICAgICAgICAgICAgICAgICAgICgweDEgPDwgNCkKLSNkZWZpbmUgUENJMzJfQVRFX0FERFJfU0hGVCAgICAgICAgICAgICAxMgotCi0jZGVmaW5lIE1JTklNQUxfQVRFU19SRVFVSVJFRChhZGRyLCBzaXplKSBcCi0JKElPUEcoSU9QR09GRihhZGRyKSArIChzaXplKSAtIDEpID09IElPUEcoKHNpemUpIC0gMSkpCi0KLSNkZWZpbmUgTUlOSU1BTF9BVEVfRkxBRyhhZGRyLCBzaXplKSBcCi0JKE1JTklNQUxfQVRFU19SRVFVSVJFRCgodWludDY0X3QpYWRkciwgc2l6ZSkgPyAxIDogMCkKLQotLyogYml0IDI5IG9mIHRoZSBwY2kgYWRkcmVzcyBpcyB0aGUgU1dBUCBiaXQgKi8KLSNkZWZpbmUgQVRFX1NXQVBTSElGVCAgICAgICAgICAgICAgICAgICAyOQotI2RlZmluZSBBVEVfU1dBUF9PTih4KSAgICAgICAgICAgICAgICAgICgoeCkgfD0gKDEgPDwgQVRFX1NXQVBTSElGVCkpCi0jZGVmaW5lIEFURV9TV0FQX09GRih4KSAgICAgICAgICAgICAgICAgKCh4KSAmPSB+KDEgPDwgQVRFX1NXQVBTSElGVCkpCi0KLS8qCi0gKiBJL08gcGFnZSBzaXplCi0gKi8KLSNpZiBQQUdFX1NJWkUgPCAxNjM4NAotI2RlZmluZSBJT1BGTlNISUZUICAgICAgICAgICAgICAgICAgICAgIDEyICAgICAgLyogNEsgcGVyIG1hcHBlZCBwYWdlICovCi0jZWxzZQotI2RlZmluZSBJT1BGTlNISUZUICAgICAgICAgICAgICAgICAgICAgIDE0ICAgICAgLyogMTZLIHBlciBtYXBwZWQgcGFnZSAqLwotI2VuZGlmCi0KLSNkZWZpbmUgSU9QR1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBJT1BGTlNISUZUKQotI2RlZmluZSBJT1BHKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPj4gSU9QRk5TSElGVCkKLSNkZWZpbmUgSU9QR09GRih4KSAgICAgICAgICAgICAgICAgICAgICAoKHgpICYgKElPUEdTSVpFLTEpKQotCi0jZGVmaW5lIFBDSUJSX0RFVl9TV0FQX0RJUiAgICAgICAgICAgICAgKDF1bGwgPDwgMTkpCi0jZGVmaW5lIFBDSUJSX0NUUkxfUEFHRV9TSVpFICAgICAgICAgICAgKDB4MSA8PCAyMSkKLQotLyoKLSAqIFBNVSByZXNvdXJjZXMuCi0gKi8KLXN0cnVjdCBhdGVfcmVzb3VyY2V7Ci0JdWludDY0X3QgKmF0ZTsKLQl1aW50NjRfdCBudW1fYXRlOwotCXVpbnQ2NF90IGxvd2VzdF9mcmVlX2luZGV4OwotfTsKLQotc3RydWN0IHBjaWJ1c19pbmZvIHsKLQlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQJcGJpX2J1c2NvbW1vbjsgICAvKiBjb21tb24gaGVhZGVyICovCi0JdWludDMyX3QgICAgICAgICAgICAgICAgcGJpX21vZHVsZWlkOwotCXNob3J0ICAgICAgICAgICAgICAgICAgIHBiaV9icmlkZ2VfdHlwZTsKLQlzaG9ydCAgICAgICAgICAgICAgICAgICBwYmlfYnJpZGdlX21vZGU7Ci0KLQlzdHJ1Y3QgYXRlX3Jlc291cmNlICAgICBwYmlfaW50X2F0ZV9yZXNvdXJjZTsKLQl1aW50NjRfdCAgICAgICAgICAgICAgICBwYmlfaW50X2F0ZV9zaXplOwotCQotCXVpbnQ2NF90ICAgICAgICAgICAgICAgIHBiaV9kaXJfeGJhc2U7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgcGJpX2h1Yl94aWQ7Ci0KLQl1aW50NjRfdCAgICAgICAgICAgICAgICBwYmlfZGV2cmVnWzhdOwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIHBiaV9sb2NrOwotCi0JdWludDMyX3QJCXBiaV92YWxpZF9kZXZpY2VzOwotCXVpbnQzMl90CQlwYmlfZW5hYmxlZF9kZXZpY2VzOwotfTsKLQotLyoKLSAqIHBjaWJ1c19pbmZvIHN0cnVjdHVyZSBsb2NraW5nIG1hY3JvcwotICovCi1pbmxpbmUgc3RhdGljIHVuc2lnbmVkIGxvbmcKLXBjaWJyX2xvY2soc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWc7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjaWJ1c19pbmZvLT5wYmlfbG9jaywgZmxhZyk7Ci0JcmV0dXJuKGZsYWcpOwotfQotI2RlZmluZSBwY2licl91bmxvY2socGNpYnVzX2luZm8sIGZsYWcpICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2lidXNfaW5mby0+cGJpX2xvY2ssIGZsYWcpCi0KLWV4dGVybiBpbnQgIHBjaWJyX2luaXRfcHJvdmlkZXIodm9pZCk7Ci1leHRlcm4gdm9pZCAqcGNpYnJfYnVzX2ZpeHVwKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqKTsKLWV4dGVybiBkbWFfYWRkcl90IHBjaWJyX2RtYV9tYXAoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKLWV4dGVybiBkbWFfYWRkcl90IHBjaWJyX2RtYV9tYXBfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOwotZXh0ZXJuIHZvaWQgcGNpYnJfZG1hX3VubWFwKHN0cnVjdCBwY2lfZGV2ICosIGRtYV9hZGRyX3QsIGludCk7Ci0KLS8qCi0gKiBwcm90b3R5cGVzIGZvciB0aGUgYnJpZGdlIGFzaWMgcmVnaXN0ZXIgYWNjZXNzIHJvdXRpbmVzIGluIHBjaWJyX3JlZy5jCi0gKi8KLWV4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19jb250cm9sX2JpdF9jbHIoc3RydWN0IHBjaWJ1c19pbmZvICosIHVpbnQ2NF90KTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19jb250cm9sX2JpdF9zZXQoc3RydWN0IHBjaWJ1c19pbmZvICosIHVpbnQ2NF90KTsKLWV4dGVybiB1aW50NjRfdCAgICAgICAgIHBjaXJlZ190Zmx1c2hfZ2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqKTsKLWV4dGVybiB1aW50NjRfdCAgICAgICAgIHBjaXJlZ19pbnRyX3N0YXR1c19nZXQoc3RydWN0IHBjaWJ1c19pbmZvICopOwotZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2ludHJfZW5hYmxlX2JpdF9jbHIoc3RydWN0IHBjaWJ1c19pbmZvICosIHVpbnQ2NF90KTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19pbnRyX2VuYWJsZV9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7Ci1leHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfaW50cl9hZGRyX2FkZHJfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQsIHVpbnQ2NF90KTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19mb3JjZV9pbnRyX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKLWV4dGVybiB1aW50NjRfdCAgICAgICAgIHBjaXJlZ193cmJfZmx1c2hfZ2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2ludF9hdGVfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQsIHVpbnQ2NF90KTsKLWV4dGVybiB1aW50NjRfdCAqCXBjaXJlZ19pbnRfYXRlX2FkZHIoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7Ci1leHRlcm4gdm9pZCAJCXBjaWJyX2ZvcmNlX2ludGVycnVwdChzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKTsKLWV4dGVybiB2b2lkIAkJcGNpYnJfY2hhbmdlX2RldmljZXNfaXJxKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pOwotZXh0ZXJuIGludCAJCXBjaWJyX2F0ZV9hbGxvYyhzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKLWV4dGVybiB2b2lkIAkJcGNpYnJfYXRlX2ZyZWUoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7Ci1leHRlcm4gdm9pZCAJCWF0ZV93cml0ZShzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCBpbnQsIHVpbnQ2NF90KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BpYy5oIGIvYXJjaC9pYTY0L3NuL2luY2x1ZGUvcGNpL3BpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDE4YWNlLi4wMDAwMDAwCi0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS9waWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotI2lmbmRlZiBfQVNNX0lBNjRfU05fUENJX1BJQ19ICi0jZGVmaW5lIF9BU01fSUE2NF9TTl9QQ0lfUElDX0gKLQotLyoKLSAqIFBJQyBBUyBERVZJQ0UgWkVSTwotICogLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogUElDIGhhbmRsZXMgUENJL1ggYnVzc2VzLiAgUENJL1ggcmVxdWlyZXMgdGhhdCB0aGUgJ2JyaWRnZScgKGkuZS4gUElDKQotICogYmUgZGVzaWduYXRlZCBhcyAnZGV2aWNlIDAnLiAgIFRoYXQgaXMgYSBkZXBhcnR1cmUgZnJvbSBlYXJsaWVyIFNHSQotICogUENJIGJyaWRnZXMuICBCZWNhdXNlIG9mIHRoYXQgd2UgdXNlIGNvbmZpZyBzcGFjZSAxIHRvIGFjY2VzcyB0aGUKLSAqIGNvbmZpZyBzcGFjZSBvZiB0aGUgZmlyc3QgYWN0dWFsIFBDSSBkZXZpY2Ugb24gdGhlIGJ1cy4gCi0gKiBIZXJlJ3Mgd2hhdCB0aGUgUElDIG1hbnVhbCBzYXlzOgotICoKLSAqICAgICBUaGUgY3VycmVudCBQQ0ktWCBidXMgc3BlY2lmaWNhdGlvbiBub3cgZGVmaW5lcyB0aGF0IHRoZSBwYXJlbnQKLSAqICAgICBob3N0cyBidXMgYnJpZGdlIChQSUMgZm9yIGV4YW1wbGUpIG11c3QgYmUgZGV2aWNlIDAgb24gYnVzIDAuIFBJQwotICogICAgIHJlZHVjZWQgdGhlIHRvdGFsIG51bWJlciBvZiBkZXZpY2VzIGZyb20gOCB0byA0IGFuZCByZW1vdmVkIHRoZQotICogICAgIGRldmljZSByZWdpc3RlcnMgYW5kIHdpbmRvd3MsIG5vdyBvbmx5IHN1cHBvcnRpbmcgZGV2aWNlcyAwLDEsMiwgYW5kCi0gKiAgICAgMy4gUElDIGRpZCBsZWF2ZSBhbGwgOCBjb25maWd1cmF0aW9uIHNwYWNlIHdpbmRvd3MuIFRoZSByZWFzb24gd2FzCi0gKiAgICAgdGhlcmUgd2FzIG5vdGhpbmcgdG8gZ2FpbiBieSByZW1vdmluZyB0aGVtLiBIZXJlIGluIGxpZXMgdGhlIHByb2JsZW0uCi0gKiAgICAgVGhlIGRldmljZSBudW1iZXJpbmcgd2UgZG8gdXNpbmcgMCB0aHJvdWdoIDMgaXMgdW5yZWxhdGVkIHRvIHRoZSBkZXZpY2UKLSAqICAgICBudW1iZXJpbmcgd2hpY2ggUENJLVggcmVxdWlyZXMgaW4gY29uZmlndXJhdGlvbiBzcGFjZS4gSW4gdGhlIHBhc3Qgd2UKLSAqICAgICBjb3JyZWxhdGVkIENvbmZpZ3MgcGFjZSBhbmQgb3VyIGRldmljZSBzcGFjZSAwIDwtPiAwLCAxIDwtPiAxLCBldGMuCi0gKiAgICAgUENJLVggcmVxdWlyZXMgd2Ugc3RhcnQgYSAxLCBub3QgMCBhbmQgY3VycmVudGx5IHRoZSBQWCBicmljawotICogICAgIGRvZXMgYXNzb2NpYXRlIG91cjoKLSAqIAotICogICAgICAgICBkZXZpY2UgMCB3aXRoIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2luZG93IDEsCi0gKiAgICAgICAgIGRldmljZSAxIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgMiwgCi0gKiAgICAgICAgIGRldmljZSAyIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgMywKLSAqICAgICAgICAgZGV2aWNlIDMgd2l0aCBjb25maWd1cmF0aW9uIHNwYWNlIHdpbmRvdyA0LgotICoKLSAqIFRoZSBuZXQgZWZmZWN0IGlzIHRoYXQgYWxsIGNvbmZpZyBzcGFjZSBhY2Nlc3MgYXJlIG9mZi1ieS1vbmUgd2l0aCAKLSAqIHJlbGF0aW9uIHRvIG90aGVyIHBlci1zbG90IGFjY2Vzc2VzIG9uIHRoZSBQSUMuICAgCi0gKiBIZXJlIGlzIGEgdGFibGUgdGhhdCBzaG93cyBzb21lIG9mIHRoYXQ6Ci0gKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWwgU2xvdCMKLSAqICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgfCAgICAgMCAgICAgICAgIDEgICAgICAgIDIgICAgICAgICAzCi0gKiAtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogY29uZmlnICAgIHwgIDB4MjEwMDAgICAweDIyMDAwICAweDIzMDAwICAgMHgyNDAwMAotICogICAgICAgICAgIHwKLSAqIGV2ZW4gcnJiICB8ICAwWzBdICAgICAgbi9hICAgICAgMVswXSAgICAgIG4vYQlbXSA9PSBpbXBsaWVkIGV2ZW4vb2RkCi0gKiAgICAgICAgICAgfAotICogb2RkIHJyYiAgIHwgIG4vYSAgICAgICAwWzFdICAgICBuL2EgICAgICAgMVsxXQotICogICAgICAgICAgIHwKLSAqIGludCBkZXYgICB8ICAwMCAgICAgICAwMSAgICAgICAgMTAgICAgICAgIDExCi0gKiAgICAgICAgICAgfAotICogZXh0IHNsb3QjIHwgIDEgICAgICAgIDIgICAgICAgICAzICAgICAgICAgNAotICogLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jZGVmaW5lIFBJQ19BVEVfVEFSR0VUSURfU0hGVCAgICAgICAgICAgOAotI2RlZmluZSBQSUNfSE9TVF9JTlRSX0FERFIgICAgICAgICAgICAgIDB4MDAwMEZGRkZGRkZGRkZGRlVMCi0jZGVmaW5lIFBJQ19QQ0k2NF9BVFRSX1RBUkdfU0hGVCAgICAgICAgNjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKiBQSUMgTU1SIHN0cnVjdHVyZSBtYXBwaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBOT1RFOiBQSUMgV0FSLiBQViM4NTQ2OTcuICBQSUMgZG9lcyBub3QgYWxsb3cgd3JpdGVzIGp1c3QgdG8gWzMxOjBdCi0gKiBvZiBhIDY0LWJpdCByZWdpc3Rlci4gIFdoZW4gd3JpdGluZyBQSUMgcmVnaXN0ZXJzLCBhbHdheXMgd3JpdGUgdGhlIAotICogZW50aXJlIDY0IGJpdHMuCi0gKi8KLQotc3RydWN0IHBpYyB7Ci0KLSAgICAvKiAweDAwMDAwMC0weDAwRkZGRiAtLSBMb2NhbCBSZWdpc3RlcnMgKi8KLQotICAgIC8qIDB4MDAwMDAwLTB4MDAwMDU3IC0tIFN0YW5kYXJkIFdpZGdldCBDb25maWd1cmF0aW9uICovCi0gICAgdWludDY0X3QJCXBfd2lkX2lkOwkJCS8qIDB4MDAwMDAwICovCi0gICAgdWludDY0X3QJCXBfd2lkX3N0YXQ7CQkJLyogMHgwMDAwMDggKi8KLSAgICB1aW50NjRfdAkJcF93aWRfZXJyX3VwcGVyOwkJLyogMHgwMDAwMTAgKi8KLSAgICB1aW50NjRfdAkJcF93aWRfZXJyX2xvd2VyOwkJLyogMHgwMDAwMTggKi8KLSAgICAjZGVmaW5lIHBfd2lkX2VyciBwX3dpZF9lcnJfbG93ZXIKLSAgICB1aW50NjRfdAkJcF93aWRfY29udHJvbDsJCQkvKiAweDAwMDAyMCAqLwotICAgIHVpbnQ2NF90CQlwX3dpZF9yZXFfdGltZW91dDsJCS8qIDB4MDAwMDI4ICovCi0gICAgdWludDY0X3QJCXBfd2lkX2ludF91cHBlcjsJCS8qIDB4MDAwMDMwICovCi0gICAgdWludDY0X3QJCXBfd2lkX2ludF9sb3dlcjsJCS8qIDB4MDAwMDM4ICovCi0gICAgI2RlZmluZSBwX3dpZF9pbnQgcF93aWRfaW50X2xvd2VyCi0gICAgdWludDY0X3QJCXBfd2lkX2Vycl9jbWR3b3JkOwkJLyogMHgwMDAwNDAgKi8KLSAgICB1aW50NjRfdAkJcF93aWRfbGxwOwkJCS8qIDB4MDAwMDQ4ICovCi0gICAgdWludDY0X3QJCXBfd2lkX3RmbHVzaDsJCQkvKiAweDAwMDA1MCAqLwotCi0gICAgLyogMHgwMDAwNTgtMHgwMDAwN0YgLS0gQnJpZGdlLXNwZWNpZmljIFdpZGdldCBDb25maWd1cmF0aW9uICovCi0gICAgdWludDY0X3QJCXBfd2lkX2F1eF9lcnI7CQkJLyogMHgwMDAwNTggKi8KLSAgICB1aW50NjRfdAkJcF93aWRfcmVzcF91cHBlcjsJCS8qIDB4MDAwMDYwICovCi0gICAgdWludDY0X3QJCXBfd2lkX3Jlc3BfbG93ZXI7CQkvKiAweDAwMDA2OCAqLwotICAgICNkZWZpbmUgcF93aWRfcmVzcCBwX3dpZF9yZXNwX2xvd2VyCi0gICAgdWludDY0X3QJCXBfd2lkX3RzdF9waW5fY3RybDsJCS8qIDB4MDAwMDcwICovCi0gICAgdWludDY0X3QJCXBfd2lkX2FkZHJfbGtlcnI7CQkvKiAweDAwMDA3OCAqLwotCi0gICAgLyogMHgwMDAwODAtMHgwMDAwOEYgLS0gUE1VICYgTUFQICovCi0gICAgdWludDY0X3QJCXBfZGlyX21hcDsJCQkvKiAweDAwMDA4MCAqLwotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDA4ODsJCQkvKiAweDAwMDA4OCAqLwotCi0gICAgLyogMHgwMDAwOTAtMHgwMDAwOUYgLS0gU1NSQU0gKi8KLSAgICB1aW50NjRfdAkJcF9tYXBfZmF1bHQ7CQkJLyogMHgwMDAwOTAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwOTg7CQkJLyogMHgwMDAwOTggKi8KLQotICAgIC8qIDB4MDAwMEEwLTB4MDAwMEFGIC0tIEFyYml0cmF0aW9uICovCi0gICAgdWludDY0X3QJCXBfYXJiOwkJCQkvKiAweDAwMDBBMCAqLwotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDBBODsJCQkvKiAweDAwMDBBOCAqLwotCi0gICAgLyogMHgwMDAwQjAtMHgwMDAwQkYgLS0gTnVtYmVyIEluIEEgQ2FuIG9yIEFURSBQYXJpdHkgRXJyb3IgKi8KLSAgICB1aW50NjRfdAkJcF9hdGVfcGFyaXR5X2VycjsJCS8qIDB4MDAwMEIwICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMEI4OwkJCS8qIDB4MDAwMEI4ICovCi0KLSAgICAvKiAweDAwMDBDMC0weDAwMDBGRiAtLSBQQ0kvR0lPICovCi0gICAgdWludDY0X3QJCXBfYnVzX3RpbWVvdXQ7CQkJLyogMHgwMDAwQzAgKi8KLSAgICB1aW50NjRfdAkJcF9wY2lfY2ZnOwkJCS8qIDB4MDAwMEM4ICovCi0gICAgdWludDY0X3QJCXBfcGNpX2Vycl91cHBlcjsJCS8qIDB4MDAwMEQwICovCi0gICAgdWludDY0X3QJCXBfcGNpX2Vycl9sb3dlcjsJCS8qIDB4MDAwMEQ4ICovCi0gICAgI2RlZmluZSBwX3BjaV9lcnIgcF9wY2lfZXJyX2xvd2VyCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMEUwWzRdOwkJCS8qIDB4MDAwMHtFMC4uRjh9ICovCi0KLSAgICAvKiAweDAwMDEwMC0weDAwMDFGRiAtLSBJbnRlcnJ1cHQgKi8KLSAgICB1aW50NjRfdAkJcF9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMTAwICovCi0gICAgdWludDY0X3QJCXBfaW50X2VuYWJsZTsJCQkvKiAweDAwMDEwOCAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9yc3Rfc3RhdDsJCQkvKiAweDAwMDExMCAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9tb2RlOwkJCS8qIDB4MDAwMTE4ICovCi0gICAgdWludDY0X3QJCXBfaW50X2RldmljZTsJCQkvKiAweDAwMDEyMCAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9ob3N0X2VycjsJCQkvKiAweDAwMDEyOCAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9hZGRyWzhdOwkJCS8qIDB4MDAwMXszMCwsLDY4fSAqLwotICAgIHVpbnQ2NF90CQlwX2Vycl9pbnRfdmlldzsJCQkvKiAweDAwMDE3MCAqLwotICAgIHVpbnQ2NF90CQlwX211bHRfaW50OwkJCS8qIDB4MDAwMTc4ICovCi0gICAgdWludDY0X3QJCXBfZm9yY2VfYWx3YXlzWzhdOwkJLyogMHgwMDAxezgwLCwsQjh9ICovCi0gICAgdWludDY0X3QJCXBfZm9yY2VfcGluWzhdOwkJCS8qIDB4MDAwMXtDMCwsLEY4fSAqLwotCi0gICAgLyogMHgwMDAyMDAtMHgwMDAyOTggLS0gRGV2aWNlICovCi0gICAgdWludDY0X3QJCXBfZGV2aWNlWzRdOwkJCS8qIDB4MDAwMnswMCwsLDE4fSAqLwotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDIyMFs0XTsJCQkvKiAweDAwMDJ7MjAsLCwzOH0gKi8KLSAgICB1aW50NjRfdAkJcF93cl9yZXFfYnVmWzRdOwkJLyogMHgwMDAyezQwLCwsNTh9ICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMjYwWzRdOwkJCS8qIDB4MDAwMns2MCwsLDc4fSAqLwotICAgIHVpbnQ2NF90CQlwX3JyYl9tYXBbMl07CQkJLyogMHgwMDAyezgwLCwsODh9ICovCi0gICAgI2RlZmluZSBwX2V2ZW5fcmVzcCBwX3JyYl9tYXBbMF0JCQkvKiAweDAwMDI4MCAqLwotICAgICNkZWZpbmUgcF9vZGRfcmVzcCAgcF9ycmJfbWFwWzFdCQkJLyogMHgwMDAyODggKi8KLSAgICB1aW50NjRfdAkJcF9yZXNwX3N0YXR1czsJCQkvKiAweDAwMDI5MCAqLwotICAgIHVpbnQ2NF90CQlwX3Jlc3BfY2xlYXI7CQkJLyogMHgwMDAyOTggKi8KLQotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDJBMFsxMl07CQkvKiAweDAwMDJ7QTAuLkY4fSAqLwotCi0gICAgLyogMHgwMDAzMDAtMHgwMDAzRjggLS0gQnVmZmVyIEFkZHJlc3MgTWF0Y2ggUmVnaXN0ZXJzICovCi0gICAgc3RydWN0IHsKLQl1aW50NjRfdAl1cHBlcjsJCQkJLyogMHgwMDAzezAwLCwsRjB9ICovCi0JdWludDY0X3QJbG93ZXI7CQkJCS8qIDB4MDAwM3swOCwsLEY4fSAqLwotICAgIH0gcF9idWZfYWRkcl9tYXRjaFsxNl07Ci0KLSAgICAvKiAweDAwMDQwMC0weDAwMDVGRiAtLSBQZXJmb3JtYW5jZSBNb25pdG9yIFJlZ2lzdGVycyAoZXZlbiBvbmx5KSAqLwotICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJZmx1c2hfd190b3VjaDsJCQkvKiAweDAwMHs0MDAsLCw1QzB9ICovCi0JdWludDY0X3QJZmx1c2hfd29fdG91Y2g7CQkJLyogMHgwMDB7NDA4LCwsNUM4fSAqLwotCXVpbnQ2NF90CWluZmxpZ2h0OwkJCS8qIDB4MDAwezQxMCwsLDVEMH0gKi8KLQl1aW50NjRfdAlwcmVmZXRjaDsJCQkvKiAweDAwMHs0MTgsLCw1RDh9ICovCi0JdWludDY0X3QJdG90YWxfcGNpX3JldHJ5OwkJLyogMHgwMDB7NDIwLCwsNUUwfSAqLwotCXVpbnQ2NF90CW1heF9wY2lfcmV0cnk7CQkJLyogMHgwMDB7NDI4LCwsNUU4fSAqLwotCXVpbnQ2NF90CW1heF9sYXRlbmN5OwkJCS8qIDB4MDAwezQzMCwsLDVGMH0gKi8KLQl1aW50NjRfdAljbGVhcl9hbGw7CQkJLyogMHgwMDB7NDM4LCwsNUY4fSAqLwotICAgIH0gcF9idWZfY291bnRbOF07Ci0KLSAgICAKLSAgICAvKiAweDAwMDYwMC0weDAwMDlGRiAtLSBQQ0kvWCByZWdpc3RlcnMgKi8KLSAgICB1aW50NjRfdAkJcF9wY2l4X2J1c19lcnJfYWRkcjsJCS8qIDB4MDAwNjAwICovCi0gICAgdWludDY0X3QJCXBfcGNpeF9idXNfZXJyX2F0dHI7CQkvKiAweDAwMDYwOCAqLwotICAgIHVpbnQ2NF90CQlwX3BjaXhfYnVzX2Vycl9kYXRhOwkJLyogMHgwMDA2MTAgKi8KLSAgICB1aW50NjRfdAkJcF9wY2l4X3Bpb19zcGxpdF9hZGRyOwkJLyogMHgwMDA2MTggKi8KLSAgICB1aW50NjRfdAkJcF9wY2l4X3Bpb19zcGxpdF9hdHRyOwkJLyogMHgwMDA2MjAgKi8KLSAgICB1aW50NjRfdAkJcF9wY2l4X2RtYV9yZXFfZXJyX2F0dHI7CS8qIDB4MDAwNjI4ICovCi0gICAgdWludDY0X3QJCXBfcGNpeF9kbWFfcmVxX2Vycl9hZGRyOwkvKiAweDAwMDYzMCAqLwotICAgIHVpbnQ2NF90CQlwX3BjaXhfdGltZW91dDsJCQkvKiAweDAwMDYzOCAqLwotCi0gICAgdWludDY0X3QJCV9wYWRfMDAwNjQwWzEyMF07CQkvKiAweDAwMHs2NDAsLCw5Rjh9ICovCi0KLSAgICAvKiAweDAwMEEwMC0weDAwMEJGRiAtLSBQQ0kvWCBSZWFkJldyaXRlIEJ1ZmZlciAqLwotICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJcF9idWZfYWRkcjsJCQkvKiAweDAwMHtBMDAsLCxBRjB9ICovCi0JdWludDY0X3QJcF9idWZfYXR0cjsJCQkvKiAwWDAwMHtBMDgsLCxBRjh9ICovCi0gICAgfSBwX3BjaXhfcmVhZF9idWZfNjRbMTZdOwotCi0gICAgc3RydWN0IHsKLQl1aW50NjRfdAlwX2J1Zl9hZGRyOwkJCS8qIDB4MDAwe0IwMCwsLEJFMH0gKi8KLQl1aW50NjRfdAlwX2J1Zl9hdHRyOwkJCS8qIDB4MDAwe0IwOCwsLEJFOH0gKi8KLQl1aW50NjRfdAlwX2J1Zl92YWxpZDsJCQkvKiAweDAwMHtCMTAsLCxCRjB9ICovCi0JdWludDY0X3QJX19wYWQxOwkJCQkvKiAweDAwMHtCMTgsLCxCRjh9ICovCi0gICAgfSBwX3BjaXhfd3JpdGVfYnVmXzY0WzhdOwotCi0gICAgLyogRW5kIG9mIExvY2FsIFJlZ2lzdGVycyAtLSBTdGFydCBvZiBBZGRyZXNzIE1hcCBzcGFjZSAqLwotCi0gICAgY2hhcgkJX3BhZF8wMDBjMDBbMHgwMTAwMDAgLSAweDAwMGMwMF07Ci0KLSAgICAvKiAweDAxMDAwMC0weDAxMWZmZiAtLSBJbnRlcm5hbCBBVEUgUkFNIChBdXRvIFBhcml0eSBHZW5lcmF0aW9uKSAqLwotICAgIHVpbnQ2NF90CQlwX2ludF9hdGVfcmFtWzEwMjRdOwkJLyogMHgwMTAwMDAtMHgwMTFmZmYgKi8KLQotICAgIC8qIDB4MDEyMDAwLTB4MDEzZmZmIC0tIEludGVybmFsIEFURSBSQU0gKE1hbnVhbCBQYXJpdHkgR2VuZXJhdGlvbikgKi8KLSAgICB1aW50NjRfdAkJcF9pbnRfYXRlX3JhbV9tcFsxMDI0XTsJCS8qIDB4MDEyMDAwLTB4MDEzZmZmICovCi0KLSAgICBjaGFyCQlfcGFkXzAxNDAwMFsweDE4MDAwIC0gMHgwMTQwMDBdOwotCi0gICAgLyogMHgxODAwMC0weDE5N0Y4IC0tIFBJQyBXcml0ZSBSZXF1ZXN0IFJhbSAqLwotICAgIHVpbnQ2NF90CQlwX3dyX3JlcV9sb3dlclsyNTZdOwkJLyogMHgxODAwMCAtIDB4MTg3RjggKi8KLSAgICB1aW50NjRfdAkJcF93cl9yZXFfdXBwZXJbMjU2XTsJCS8qIDB4MTg4MDAgLSAweDE4RkY4ICovCi0gICAgdWludDY0X3QJCXBfd3JfcmVxX3Bhcml0eVsyNTZdOwkJLyogMHgxOTAwMCAtIDB4MTk3RjggKi8KLQotICAgIGNoYXIJCV9wYWRfMDE5ODAwWzB4MjAwMDAgLSAweDAxOTgwMF07Ci0KLSAgICAvKiAweDAyMDAwMC0weDAyN0ZGRiAtLSBQQ0kgRGV2aWNlIENvbmZpZ3VyYXRpb24gU3BhY2VzICovCi0gICAgdW5pb24gewotCXVpbnQ4X3QJCWNbMHgxMDAwIC8gMV07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KLQl1aW50MTZfdAlzWzB4MTAwMCAvIDJdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCi0JdWludDMyX3QJbFsweDEwMDAgLyA0XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLwotCXVpbnQ2NF90CWRbMHgxMDAwIC8gOF07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KLQl1bmlvbiB7Ci0JICAgIHVpbnQ4X3QJY1sweDEwMCAvIDFdOwotCSAgICB1aW50MTZfdAlzWzB4MTAwIC8gMl07Ci0JICAgIHVpbnQzMl90CWxbMHgxMDAgLyA0XTsKLQkgICAgdWludDY0X3QJZFsweDEwMCAvIDhdOwotCX0gZls4XTsKLSAgICB9IHBfdHlwZTBfY2ZnX2Rldls4XTsJCQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KLQotICAgIC8qIDB4MDI4MDAwLTB4MDI4RkZGIC0tIFBDSSBUeXBlIDEgQ29uZmlndXJhdGlvbiBTcGFjZSAqLwotICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzB4MTAwMCAvIDFdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0JdWludDE2X3QJc1sweDEwMDAgLyAyXTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLwotCXVpbnQzMl90CWxbMHgxMDAwIC8gNF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KLQl1aW50NjRfdAlkWzB4MTAwMCAvIDhdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0JdW5pb24gewotCSAgICB1aW50OF90CWNbMHgxMDAgLyAxXTsKLQkgICAgdWludDE2X3QJc1sweDEwMCAvIDJdOwotCSAgICB1aW50MzJfdAlsWzB4MTAwIC8gNF07Ci0JICAgIHVpbnQ2NF90CWRbMHgxMDAgLyA4XTsKLQl9IGZbOF07Ci0gICAgfSBwX3R5cGUxX2NmZzsJCQkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0KLSAgICBjaGFyCQlfcGFkXzAyOTAwMFsweDAzMDAwMC0weDAyOTAwMF07Ci0KLSAgICAvKiAweDAzMDAwMC0weDAzMDAwNyAtLSBQQ0kgSW50ZXJydXB0IEFja25vd2xlZGdlIEN5Y2xlICovCi0gICAgdW5pb24gewotCXVpbnQ4X3QJCWNbOCAvIDFdOwotCXVpbnQxNl90CXNbOCAvIDJdOwotCXVpbnQzMl90CWxbOCAvIDRdOwotCXVpbnQ2NF90CWRbOCAvIDhdOwotICAgIH0gcF9wY2lfaWFjazsJCQkJCS8qIDB4MDMwMDAwLTB4MDMwMDA3ICovCi0KLSAgICBjaGFyCQlfcGFkXzAzMDAwN1sweDA0MDAwMC0weDAzMDAwOF07Ci0KLSAgICAvKiAweDA0MDAwMC0weDAzMDAwNyAtLSBQQ0lYIFNwZWNpYWwgQ3ljbGUgKi8KLSAgICB1bmlvbiB7Ci0JdWludDhfdAkJY1s4IC8gMV07Ci0JdWludDE2X3QJc1s4IC8gMl07Ci0JdWludDMyX3QJbFs4IC8gNF07Ci0JdWludDY0X3QJZFs4IC8gOF07Ci0gICAgfSBwX3BjaXhfY3ljbGU7CQkJCQkvKiAweDA0MDAwMC0weDA0MDAwNyAqLwotfTsKLQotI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBfQVNNX0lBNjRfU05fUENJX1BJQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vaW5jbHVkZS9wY2kvdGlvY3AuaCBiL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS90aW9jcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDdjODNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvaWE2NC9zbi9pbmNsdWRlL3BjaS90aW9jcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKi8KLSNpZm5kZWYgX0FTTV9JQTY0X1NOX1BDSV9USU9DUF9ICi0jZGVmaW5lIF9BU01fSUE2NF9TTl9QQ0lfVElPQ1BfSAotCi0jZGVmaW5lIFRJT0NQX0hPU1RfSU5UUl9BRERSICAgICAgICAgICAgMHgwMDNGRkZGRkZGRkZGRkZGVUwKLSNkZWZpbmUgVElPQ1BfUENJNjRfQ01EVFlQRV9NRU0gICAgICAgICAoMHgxdWxsIDw8IDYwKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoqKioqKioqKioqKioqKioqKioqKioqIFRJT0NQIE1NUiBzdHJ1Y3R1cmUgbWFwcGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHRpb2NwewotCi0gICAgLyogMHgwMDAwMDAtMHgwMEZGRkYgLS0gTG9jYWwgUmVnaXN0ZXJzICovCi0KLSAgICAvKiAweDAwMDAwMC0weDAwMDA1NyAtLSAoTGVnYWN5IFdpZGdldCBTcGFjZSkgQ29uZmlndXJhdGlvbiAqLwotICAgIHVpbnQ2NF90CQljcF9pZDsJCQkJLyogMHgwMDAwMDAgKi8KLSAgICB1aW50NjRfdAkJY3Bfc3RhdDsJCQkvKiAweDAwMDAwOCAqLwotICAgIHVpbnQ2NF90CQljcF9lcnJfdXBwZXI7CQkJLyogMHgwMDAwMTAgKi8KLSAgICB1aW50NjRfdAkJY3BfZXJyX2xvd2VyOwkJCS8qIDB4MDAwMDE4ICovCi0gICAgI2RlZmluZSBjcF9lcnIgY3BfZXJyX2xvd2VyCi0gICAgdWludDY0X3QJCWNwX2NvbnRyb2w7CQkJLyogMHgwMDAwMjAgKi8KLSAgICB1aW50NjRfdAkJY3BfcmVxX3RpbWVvdXQ7CQkJLyogMHgwMDAwMjggKi8KLSAgICB1aW50NjRfdAkJY3BfaW50cl91cHBlcjsJCQkvKiAweDAwMDAzMCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRyX2xvd2VyOwkJCS8qIDB4MDAwMDM4ICovCi0gICAgI2RlZmluZSBjcF9pbnRyIGNwX2ludHJfbG93ZXIKLSAgICB1aW50NjRfdAkJY3BfZXJyX2NtZHdvcmQ7CQkJLyogMHgwMDAwNDAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwNDg7CQkJLyogMHgwMDAwNDggKi8KLSAgICB1aW50NjRfdAkJY3BfdGZsdXNoOwkJCS8qIDB4MDAwMDUwICovCi0KLSAgICAvKiAweDAwMDA1OC0weDAwMDA3RiAtLSBCcmlkZ2Utc3BlY2lmaWMgQ29uZmlndXJhdGlvbiAqLwotICAgIHVpbnQ2NF90CQljcF9hdXhfZXJyOwkJCS8qIDB4MDAwMDU4ICovCi0gICAgdWludDY0X3QJCWNwX3Jlc3BfdXBwZXI7CQkJLyogMHgwMDAwNjAgKi8KLSAgICB1aW50NjRfdAkJY3BfcmVzcF9sb3dlcjsJCQkvKiAweDAwMDA2OCAqLwotICAgICNkZWZpbmUgY3BfcmVzcCBjcF9yZXNwX2xvd2VyCi0gICAgdWludDY0X3QJCWNwX3RzdF9waW5fY3RybDsJCS8qIDB4MDAwMDcwICovCi0gICAgdWludDY0X3QJCWNwX2FkZHJfbGtlcnI7CQkJLyogMHgwMDAwNzggKi8KLQotICAgIC8qIDB4MDAwMDgwLTB4MDAwMDhGIC0tIFBNVSAmIE1BUCAqLwotICAgIHVpbnQ2NF90CQljcF9kaXJfbWFwOwkJCS8qIDB4MDAwMDgwICovCi0gICAgdWludDY0X3QJCV9wYWRfMDAwMDg4OwkJCS8qIDB4MDAwMDg4ICovCi0KLSAgICAvKiAweDAwMDA5MC0weDAwMDA5RiAtLSBTU1JBTSAqLwotICAgIHVpbnQ2NF90CQljcF9tYXBfZmF1bHQ7CQkJLyogMHgwMDAwOTAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwOTg7CQkJLyogMHgwMDAwOTggKi8KLQotICAgIC8qIDB4MDAwMEEwLTB4MDAwMEFGIC0tIEFyYml0cmF0aW9uICovCi0gICAgdWludDY0X3QJCWNwX2FyYjsJCQkJLyogMHgwMDAwQTAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwQTg7CQkJLyogMHgwMDAwQTggKi8KLQotICAgIC8qIDB4MDAwMEIwLTB4MDAwMEJGIC0tIE51bWJlciBJbiBBIENhbiBvciBBVEUgUGFyaXR5IEVycm9yICovCi0gICAgdWludDY0X3QJCWNwX2F0ZV9wYXJpdHlfZXJyOwkJLyogMHgwMDAwQjAgKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwQjg7CQkJLyogMHgwMDAwQjggKi8KLQotICAgIC8qIDB4MDAwMEMwLTB4MDAwMEZGIC0tIFBDSS9HSU8gKi8KLSAgICB1aW50NjRfdAkJY3BfYnVzX3RpbWVvdXQ7CQkJLyogMHgwMDAwQzAgKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpX2NmZzsJCQkvKiAweDAwMDBDOCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2lfZXJyX3VwcGVyOwkJLyogMHgwMDAwRDAgKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpX2Vycl9sb3dlcjsJCS8qIDB4MDAwMEQ4ICovCi0gICAgI2RlZmluZSBjcF9wY2lfZXJyIGNwX3BjaV9lcnJfbG93ZXIKLSAgICB1aW50NjRfdAkJX3BhZF8wMDAwRTBbNF07CQkJLyogMHgwMDAwe0UwLi5GOH0gKi8KLQotICAgIC8qIDB4MDAwMTAwLTB4MDAwMUZGIC0tIEludGVycnVwdCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMTAwICovCi0gICAgdWludDY0X3QJCWNwX2ludF9lbmFibGU7CQkJLyogMHgwMDAxMDggKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X3JzdF9zdGF0OwkJLyogMHgwMDAxMTAgKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X21vZGU7CQkJLyogMHgwMDAxMTggKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X2RldmljZTsJCQkvKiAweDAwMDEyMCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfaG9zdF9lcnI7CQkvKiAweDAwMDEyOCAqLwotICAgIHVpbnQ2NF90CQljcF9pbnRfYWRkcls4XTsJCQkvKiAweDAwMDF7MzAsLCw2OH0gKi8KLSAgICB1aW50NjRfdAkJY3BfZXJyX2ludF92aWV3OwkJLyogMHgwMDAxNzAgKi8KLSAgICB1aW50NjRfdAkJY3BfbXVsdF9pbnQ7CQkJLyogMHgwMDAxNzggKi8KLSAgICB1aW50NjRfdAkJY3BfZm9yY2VfYWx3YXlzWzhdOwkJLyogMHgwMDAxezgwLCwsQjh9ICovCi0gICAgdWludDY0X3QJCWNwX2ZvcmNlX3Bpbls4XTsJCS8qIDB4MDAwMXtDMCwsLEY4fSAqLwotCi0gICAgLyogMHgwMDAyMDAtMHgwMDAyOTggLS0gRGV2aWNlICovCi0gICAgdWludDY0X3QJCWNwX2RldmljZVs0XTsJCQkvKiAweDAwMDJ7MDAsLCwxOH0gKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAyMjBbNF07CQkJLyogMHgwMDAyezIwLCwsMzh9ICovCi0gICAgdWludDY0X3QJCWNwX3dyX3JlcV9idWZbNF07CQkvKiAweDAwMDJ7NDAsLCw1OH0gKi8KLSAgICB1aW50NjRfdAkJX3BhZF8wMDAyNjBbNF07CQkJLyogMHgwMDAyezYwLCwsNzh9ICovCi0gICAgdWludDY0X3QJCWNwX3JyYl9tYXBbMl07CQkJLyogMHgwMDAyezgwLCwsODh9ICovCi0gICAgI2RlZmluZSBjcF9ldmVuX3Jlc3AgY3BfcnJiX21hcFswXQkJCS8qIDB4MDAwMjgwICovCi0gICAgI2RlZmluZSBjcF9vZGRfcmVzcCAgY3BfcnJiX21hcFsxXQkJCS8qIDB4MDAwMjg4ICovCi0gICAgdWludDY0X3QJCWNwX3Jlc3Bfc3RhdHVzOwkJCS8qIDB4MDAwMjkwICovCi0gICAgdWludDY0X3QJCWNwX3Jlc3BfY2xlYXI7CQkJLyogMHgwMDAyOTggKi8KLQotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDJBMFsxMl07CQkvKiAweDAwMDJ7QTAuLkY4fSAqLwotCi0gICAgLyogMHgwMDAzMDAtMHgwMDAzRjggLS0gQnVmZmVyIEFkZHJlc3MgTWF0Y2ggUmVnaXN0ZXJzICovCi0gICAgc3RydWN0IHsKLQl1aW50NjRfdAl1cHBlcjsJCQkJLyogMHgwMDAzezAwLCwsRjB9ICovCi0JdWludDY0X3QJbG93ZXI7CQkJCS8qIDB4MDAwM3swOCwsLEY4fSAqLwotICAgIH0gY3BfYnVmX2FkZHJfbWF0Y2hbMTZdOwotCi0gICAgLyogMHgwMDA0MDAtMHgwMDA1RkYgLS0gUGVyZm9ybWFuY2UgTW9uaXRvciBSZWdpc3RlcnMgKGV2ZW4gb25seSkgKi8KLSAgICBzdHJ1Y3QgewotCXVpbnQ2NF90CWZsdXNoX3dfdG91Y2g7CQkJLyogMHgwMDB7NDAwLCwsNUMwfSAqLwotCXVpbnQ2NF90CWZsdXNoX3dvX3RvdWNoOwkJCS8qIDB4MDAwezQwOCwsLDVDOH0gKi8KLQl1aW50NjRfdAlpbmZsaWdodDsJCQkvKiAweDAwMHs0MTAsLCw1RDB9ICovCi0JdWludDY0X3QJcHJlZmV0Y2g7CQkJLyogMHgwMDB7NDE4LCwsNUQ4fSAqLwotCXVpbnQ2NF90CXRvdGFsX3BjaV9yZXRyeTsJCS8qIDB4MDAwezQyMCwsLDVFMH0gKi8KLQl1aW50NjRfdAltYXhfcGNpX3JldHJ5OwkJCS8qIDB4MDAwezQyOCwsLDVFOH0gKi8KLQl1aW50NjRfdAltYXhfbGF0ZW5jeTsJCQkvKiAweDAwMHs0MzAsLCw1RjB9ICovCi0JdWludDY0X3QJY2xlYXJfYWxsOwkJCS8qIDB4MDAwezQzOCwsLDVGOH0gKi8KLSAgICB9IGNwX2J1Zl9jb3VudFs4XTsKLQotICAgIAotICAgIC8qIDB4MDAwNjAwLTB4MDAwOUZGIC0tIFBDSS9YIHJlZ2lzdGVycyAqLwotICAgIHVpbnQ2NF90CQljcF9wY2l4X2J1c19lcnJfYWRkcjsJCS8qIDB4MDAwNjAwICovCi0gICAgdWludDY0X3QJCWNwX3BjaXhfYnVzX2Vycl9hdHRyOwkJLyogMHgwMDA2MDggKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpeF9idXNfZXJyX2RhdGE7CQkvKiAweDAwMDYxMCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2l4X3Bpb19zcGxpdF9hZGRyOwkJLyogMHgwMDA2MTggKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpeF9waW9fc3BsaXRfYXR0cjsJCS8qIDB4MDAwNjIwICovCi0gICAgdWludDY0X3QJCWNwX3BjaXhfZG1hX3JlcV9lcnJfYXR0cjsJLyogMHgwMDA2MjggKi8KLSAgICB1aW50NjRfdAkJY3BfcGNpeF9kbWFfcmVxX2Vycl9hZGRyOwkvKiAweDAwMDYzMCAqLwotICAgIHVpbnQ2NF90CQljcF9wY2l4X3RpbWVvdXQ7CQkvKiAweDAwMDYzOCAqLwotCi0gICAgdWludDY0X3QJCV9wYWRfMDAwNjQwWzI0XTsJCS8qIDB4MDAwezY0MCwsLDZGOH0gKi8KLQotICAgIC8qIDB4MDAwNzAwLTB4MDAwNzM3IC0tIERlYnVnIFJlZ2lzdGVycyAqLwotICAgIHVpbnQ2NF90CQljcF9jdF9kZWJ1Z19jdGw7CQkvKiAweDAwMDcwMCAqLwotICAgIHVpbnQ2NF90CQljcF9icl9kZWJ1Z19jdGw7CQkvKiAweDAwMDcwOCAqLwotICAgIHVpbnQ2NF90CQljcF9tdXgzX2RlYnVnX2N0bDsJCS8qIDB4MDAwNzEwICovCi0gICAgdWludDY0X3QJCWNwX211eDRfZGVidWdfY3RsOwkJLyogMHgwMDA3MTggKi8KLSAgICB1aW50NjRfdAkJY3BfbXV4NV9kZWJ1Z19jdGw7CQkvKiAweDAwMDcyMCAqLwotICAgIHVpbnQ2NF90CQljcF9tdXg2X2RlYnVnX2N0bDsJCS8qIDB4MDAwNzI4ICovCi0gICAgdWludDY0X3QJCWNwX211eDdfZGVidWdfY3RsOwkJLyogMHgwMDA3MzAgKi8KLQotICAgIHVpbnQ2NF90CQlfcGFkXzAwMDczOFs4OV07CQkvKiAweDAwMHs3MzgsLCw5Rjh9ICovCi0KLSAgICAvKiAweDAwMEEwMC0weDAwMEJGRiAtLSBQQ0kvWCBSZWFkJldyaXRlIEJ1ZmZlciAqLwotICAgIHN0cnVjdCB7Ci0JdWludDY0X3QJY3BfYnVmX2FkZHI7CQkJLyogMHgwMDB7QTAwLCwsQUYwfSAqLwotCXVpbnQ2NF90CWNwX2J1Zl9hdHRyOwkJCS8qIDBYMDAwe0EwOCwsLEFGOH0gKi8KLSAgICB9IGNwX3BjaXhfcmVhZF9idWZfNjRbMTZdOwotCi0gICAgc3RydWN0IHsKLQl1aW50NjRfdAljcF9idWZfYWRkcjsJCQkvKiAweDAwMHtCMDAsLCxCRTB9ICovCi0JdWludDY0X3QJY3BfYnVmX2F0dHI7CQkJLyogMHgwMDB7QjA4LCwsQkU4fSAqLwotCXVpbnQ2NF90CWNwX2J1Zl92YWxpZDsJCQkvKiAweDAwMHtCMTAsLCxCRjB9ICovCi0JdWludDY0X3QJX19wYWQxOwkJCQkvKiAweDAwMHtCMTgsLCxCRjh9ICovCi0gICAgfSBjcF9wY2l4X3dyaXRlX2J1Zl82NFs4XTsKLQotICAgIC8qIEVuZCBvZiBMb2NhbCBSZWdpc3RlcnMgLS0gU3RhcnQgb2YgQWRkcmVzcyBNYXAgc3BhY2UgKi8KLQotICAgIGNoYXIJCV9wYWRfMDAwYzAwWzB4MDEwMDAwIC0gMHgwMDBjMDBdOwotCi0gICAgLyogMHgwMTAwMDAtMHgwMTFGRjggLS0gSW50ZXJuYWwgQVRFIFJBTSAoQXV0byBQYXJpdHkgR2VuZXJhdGlvbikgKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X2F0ZV9yYW1bMTAyNF07CQkvKiAweDAxMDAwMC0weDAxMUZGOCAqLwotCi0gICAgY2hhcgkJX3BhZF8wMTIwMDBbMHgxNDAwMCAtIDB4MDEyMDAwXTsKLQotICAgIC8qIDB4MDE0MDAwLTB4MDE1RkY4IC0tIEludGVybmFsIEFURSBSQU0gKE1hbnVhbCBQYXJpdHkgR2VuZXJhdGlvbikgKi8KLSAgICB1aW50NjRfdAkJY3BfaW50X2F0ZV9yYW1fbXBbMTAyNF07CS8qIDB4MDE0MDAwLTB4MDE1RkY4ICovCi0KLSAgICBjaGFyCQlfcGFkXzAxNjAwMFsweDE4MDAwIC0gMHgwMTYwMDBdOwotCi0gICAgLyogMHgxODAwMC0weDE5N0Y4IC0tIFRJT0NQIFdyaXRlIFJlcXVlc3QgUmFtICovCi0gICAgdWludDY0X3QJCWNwX3dyX3JlcV9sb3dlclsyNTZdOwkJLyogMHgxODAwMCAtIDB4MTg3RjggKi8KLSAgICB1aW50NjRfdAkJY3Bfd3JfcmVxX3VwcGVyWzI1Nl07CQkvKiAweDE4ODAwIC0gMHgxOEZGOCAqLwotICAgIHVpbnQ2NF90CQljcF93cl9yZXFfcGFyaXR5WzI1Nl07CQkvKiAweDE5MDAwIC0gMHgxOTdGOCAqLwotCi0gICAgY2hhcgkJX3BhZF8wMTk4MDBbMHgxQzAwMCAtIDB4MDE5ODAwXTsKLQotICAgIC8qIDB4MUMwMDAtMHgxRUZGOCAtLSBUSU9DUCBSZWFkIFJlc3BvbnNlIFJhbSAqLwotICAgIHVpbnQ2NF90CQljcF9yZF9yZXNwX2xvd2VyWzUxMl07CQkvKiAweDFDMDAwIC0gMHgxQ0ZGOCAqLwotICAgIHVpbnQ2NF90CQljcF9yZF9yZXNwX3VwcGVyWzUxMl07CQkvKiAweDFEMDAwIC0gMHgxREZGOCAqLwotICAgIHVpbnQ2NF90CQljcF9yZF9yZXNwX3Bhcml0eVs1MTJdOwkJLyogMHgxRTAwMCAtIDB4MUVGRjggKi8KLQotICAgIGNoYXIJCV9wYWRfMDFGMDAwWzB4MjAwMDAgLSAweDAxRjAwMF07Ci0KLSAgICAvKiAweDAyMDAwMC0weDAyMUZGRiAtLSBIb3N0IERldmljZSAoQ1ApIENvbmZpZ3VyYXRpb24gU3BhY2UgKG5vdCB1c2VkKSAgKi8KLSAgICBjaGFyCQlfcGFkXzAyMDAwMFsweDAyMTAwMCAtIDB4MjAwMDBdOwotCi0gICAgLyogMHgwMjEwMDAtMHgwMjdGRkYgLS0gUENJIERldmljZSBDb25maWd1cmF0aW9uIFNwYWNlcyAqLwotICAgIHVuaW9uIHsKLQl1aW50OF90CQljWzB4MTAwMCAvIDFdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCi0JdWludDE2X3QJc1sweDEwMDAgLyAyXTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLwotCXVpbnQzMl90CWxbMHgxMDAwIC8gNF07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KLQl1aW50NjRfdAlkWzB4MTAwMCAvIDhdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCi0JdW5pb24gewotCSAgICB1aW50OF90CWNbMHgxMDAgLyAxXTsKLQkgICAgdWludDE2X3QJc1sweDEwMCAvIDJdOwotCSAgICB1aW50MzJfdAlsWzB4MTAwIC8gNF07Ci0JICAgIHVpbnQ2NF90CWRbMHgxMDAgLyA4XTsKLQl9IGZbOF07Ci0gICAgfSBjcF90eXBlMF9jZmdfZGV2WzddOwkJCQkvKiAweDAyezEwMDAsLCw3RkZGfSAqLwotCi0gICAgLyogMHgwMjgwMDAtMHgwMjhGRkYgLS0gUENJIFR5cGUgMSBDb25maWd1cmF0aW9uIFNwYWNlICovCi0gICAgdW5pb24gewotCXVpbnQ4X3QJCWNbMHgxMDAwIC8gMV07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KLQl1aW50MTZfdAlzWzB4MTAwMCAvIDJdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0JdWludDMyX3QJbFsweDEwMDAgLyA0XTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLwotCXVpbnQ2NF90CWRbMHgxMDAwIC8gOF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KLQl1bmlvbiB7Ci0JICAgIHVpbnQ4X3QJY1sweDEwMCAvIDFdOwotCSAgICB1aW50MTZfdAlzWzB4MTAwIC8gMl07Ci0JICAgIHVpbnQzMl90CWxbMHgxMDAgLyA0XTsKLQkgICAgdWludDY0X3QJZFsweDEwMCAvIDhdOwotCX0gZls4XTsKLSAgICB9IGNwX3R5cGUxX2NmZzsJCQkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCi0KLSAgICBjaGFyCQlfcGFkXzAyOTAwMFsweDAzMDAwMC0weDAyOTAwMF07Ci0KLSAgICAvKiAweDAzMDAwMC0weDAzMDAwNyAtLSBQQ0kgSW50ZXJydXB0IEFja25vd2xlZGdlIEN5Y2xlICovCi0gICAgdW5pb24gewotCXVpbnQ4X3QJCWNbOCAvIDFdOwotCXVpbnQxNl90CXNbOCAvIDJdOwotCXVpbnQzMl90CWxbOCAvIDRdOwotCXVpbnQ2NF90CWRbOCAvIDhdOwotICAgIH0gY3BfcGNpX2lhY2s7CQkJCQkvKiAweDAzMDAwMC0weDAzMDAwNyAqLwotCi0gICAgY2hhcgkJX3BhZF8wMzAwMDdbMHgwNDAwMDAtMHgwMzAwMDhdOwotCi0gICAgLyogMHgwNDAwMDAtMHgwNDAwMDcgLS0gUENJWCBTcGVjaWFsIEN5Y2xlICovCi0gICAgdW5pb24gewotCXVpbnQ4X3QJCWNbOCAvIDFdOwotCXVpbnQxNl90CXNbOCAvIDJdOwotCXVpbnQzMl90CWxbOCAvIDRdOwotCXVpbnQ2NF90CWRbOCAvIDhdOwotICAgIH0gY3BfcGNpeF9jeWNsZTsJCQkJCS8qIDB4MDQwMDAwLTB4MDQwMDA3ICovCi0KLSAgICBjaGFyCQlfcGFkXzA0MDAwN1sweDIwMDAwMC0weDA0MDAwOF07Ci0KLSAgICAvKiAweDIwMDAwMC0weDdGRkZGRiAtLSBQQ0kvR0lPIERldmljZSBTcGFjZXMgKi8KLSAgICB1bmlvbiB7Ci0JdWludDhfdAkJY1sweDEwMDAwMCAvIDFdOwotCXVpbnQxNl90CXNbMHgxMDAwMDAgLyAyXTsKLQl1aW50MzJfdAlsWzB4MTAwMDAwIC8gNF07Ci0JdWludDY0X3QJZFsweDEwMDAwMCAvIDhdOwotICAgIH0gY3BfZGV2aW9fcmF3WzZdOwkJCQkJLyogMHgyMDAwMDAtMHg3RkZGRkYgKi8KLQotICAgICNkZWZpbmUgY3BfZGV2aW8obikgIGNwX2RldmlvX3Jhd1soKG4pPDIpPyhuKjIpOihuKzIpXQotCi0gICAgY2hhcgkJX3BhZF84MDAwMDBbMHhBMDAwMDAtMHg4MDAwMDBdOwotCi0gICAgLyogMHhBMDAwMDAtMHhCRkZGRkYgLS0gUENJL0dJTyBEZXZpY2UgU3BhY2VzIHcvZmx1c2ggICovCi0gICAgdW5pb24gewotCXVpbnQ4X3QJCWNbMHgxMDAwMDAgLyAxXTsKLQl1aW50MTZfdAlzWzB4MTAwMDAwIC8gMl07Ci0JdWludDMyX3QJbFsweDEwMDAwMCAvIDRdOwotCXVpbnQ2NF90CWRbMHgxMDAwMDAgLyA4XTsKLSAgICB9IGNwX2RldmlvX3Jhd19mbHVzaFs2XTsJCQkJLyogMHhBMDAwMDAtMHhCRkZGRkYgKi8KLQotICAgICNkZWZpbmUgY3BfZGV2aW9fZmx1c2gobikgIGNwX2RldmlvX3Jhd19mbHVzaFsoKG4pPDIpPyhuKjIpOihuKzIpXQotCi19OwotCi0jZW5kaWYgCS8qIF9BU01fSUE2NF9TTl9QQ0lfVElPQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2luY2x1ZGUveHRhbGsvaHViZGV2LmggYi9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaAppbmRleCA4NjhlN2VjLi41ODBhMWMwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaAorKysgYi9hcmNoL2lhNjQvc24vaW5jbHVkZS94dGFsay9odWJkZXYuaApAQCAtOCw2ICs4LDggQEAKICNpZm5kZWYgX0FTTV9JQTY0X1NOX1hUQUxLX0hVQkRFVl9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9YVEFMS19IVUJERVZfSAogCisjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgorCiAjZGVmaW5lIEhVQl9XSURHRVRfSURfTUFYIDB4ZgogI2RlZmluZSBERVZfUEVSX1dJREdFVCAoMioyKjgpCiAjZGVmaW5lIElJT19JVFRFX1dJREdFVF9CSVRTICAgIDQgICAgICAgLyogc2l6ZSBvZiB3aWRnZXQgZmllbGQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9faW5pdC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKaW5kZXggOWUwN2Y1NC4uYTY3ZjM5ZSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMKQEAgLTksMjEgKzksMjggQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbm9kZW1hc2suaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CisjaW5jbHVkZSA8YXNtL3NuL2dlby5oPgorI2luY2x1ZGUgPGFzbS9zbi9pby5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCi0jaW5jbHVkZSA8YXNtL3NuL2dlby5oPgotI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgotI2luY2x1ZGUgPGFzbS9zbi9pby5oPgogI2luY2x1ZGUgPGFzbS9zbi9zaW11bGF0b3IuaD4KKyNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3Rpb2NhX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCisjaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgogCi1jaGFyIG1hc3Rlcl9iYXNlaW9fd2lkOwogbmFzaWRfdCBtYXN0ZXJfbmFzaWQgPSBJTlZBTElEX05BU0lEOwkvKiBQYXJ0aXRpb24gTWFzdGVyICovCiAKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHNuX3N5c2RhdGFfbGlzdDsKKworLyogc3lzZGF0YSBsaXN0IHN0cnVjdCAqLworc3RydWN0IHN5c2RhdGFfZWwgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdm9pZCAqc3lzZGF0YTsKK307CisKIHN0cnVjdCBzbGFiX2luZm8gewogCXN0cnVjdCBodWJkZXZfaW5mbyBodWJkZXY7CiB9OwpAQCAtMTM4LDIzICsxNDUsNiBAQAogfQogCiAvKgotICogc25fYWxsb2NfcGNpX3N5c2RhdGEoKSAtIFRoaXMgcm91dGluZSBhbGxvY2F0ZXMgYSBwY2kgY29udHJvbGxlcgotICoJd2hpY2ggaXMgZXhwZWN0ZWQgYXMgdGhlIHBjaV9kZXYgYW5kIHBjaV9idXMgc3lzZGF0YSBieSB0aGUgTGludXgKLSAqCVBDSSBpbmZyYXN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnNuX2FsbG9jX3BjaV9zeXNkYXRhKHZvaWQpCi17Ci0Jc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2lfc3lzZGF0YTsKLQotCXBjaV9zeXNkYXRhID0ga21hbGxvYyhzaXplb2YoKnBjaV9zeXNkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY2lfc3lzZGF0YSkKLQkJQlVHKCk7Ci0KLQltZW1zZXQocGNpX3N5c2RhdGEsIDAsIHNpemVvZigqcGNpX3N5c2RhdGEpKTsKLQlyZXR1cm4gcGNpX3N5c2RhdGE7Ci19Ci0KLS8qCiAgKiBzbl9maXh1cF9pb25vZGVzKCkgLSBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgdGhlIEhVQiBkYXRhIHN0cmN1dHVyZSBmb3IgCiAgKgllYWNoIG5vZGUgaW4gdGhlIHN5c3RlbS4KICAqLwpAQCAtMjIxLDIyICsyMTEsMzQgQEAKIAogfQogCit2b2lkIHNuX3BjaV91bmZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqaG9zdF9wY2lfZGV2ID0gU05fUENJREVWX0lORk8oZGV2KS0+aG9zdF9wY2lfZGV2OworCisJc25faXJxX3VuZml4dXAoZGV2KTsKKwlwY2lfZGV2X3B1dChob3N0X3BjaV9kZXYpOworCXBjaV9kZXZfcHV0KGRldik7Cit9CisKIC8qCiAgKiBzbl9wY2lfZml4dXBfc2xvdCgpIC0gVGhpcyByb3V0aW5lIHNldHMgdXAgYSBzbG90J3MgcmVzb3VyY2VzCiAgKiBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4gIFJlc291cmNlcyBhY3F1aXJlZAogICogZnJvbSBvdXIgUENJIHByb3ZpZGVyIGluY2x1ZGUgUElPIG1hcHMgdG8gQkFSIHNwYWNlIGFuZCBpbnRlcnJ1cHQKICAqIG9iamVjdHMuCiAgKi8KLXN0YXRpYyB2b2lkIHNuX3BjaV9maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit2b2lkIHNuX3BjaV9maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IGlkeDsKIAlpbnQgc2VnbWVudCA9IDA7Ci0JdWludDY0X3Qgc2l6ZTsKLQlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvOwotCXN0cnVjdCBwY2lfZGV2ICpob3N0X3BjaV9kZXY7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpiczsKKyAJc3RydWN0IHBjaV9idXMgKmhvc3RfcGNpX2J1czsKKyAJc3RydWN0IHBjaV9kZXYgKmhvc3RfcGNpX2RldjsKKyAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKyAJdW5zaWduZWQgbG9uZyBzaXplOworIAl1bnNpZ25lZCBpbnQgYnVzX25vLCBkZXZmbjsKIAorCXBjaV9kZXZfZ2V0KGRldik7IC8qIGZvciB0aGUgc3lzZGF0YSBwb2ludGVyICovCiAJZGV2LT5zeXNkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaWRldl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKFNOX1BDSURFVl9JTkZPKGRldikgPD0gMCkKIAkJQlVHKCk7CQkvKiBDYW5ub3QgYWZmb3JkIHRvIHJ1biBvdXQgb2YgbWVtb3J5ICovCkBAIC0yNTMsNyArMjU1LDcgQEAKIAkJCQkgICAgICh1NjQpIF9fcGEoU05fUENJREVWX0lORk8oZGV2KSksCiAJCQkJICAgICAodTY0KSBfX3BhKHNuX2lycV9pbmZvKSk7CiAJaWYgKHN0YXR1cykKLQkJQlVHKCk7CQkvKiBDYW5ub3QgZ2V0IHBsYXRmb3JtIHBjaSBkZXZpY2UgaW5mb3JtYXRpb24gaW5mb3JtYXRpb24gKi8KKwkJQlVHKCk7IC8qIENhbm5vdCBnZXQgcGxhdGZvcm0gcGNpIGRldmljZSBpbmZvcm1hdGlvbiAqLwogCiAJLyogQ29weSBvdmVyIFBJTyBNYXBwZWQgQWRkcmVzc2VzICovCiAJZm9yIChpZHggPSAwOyBpZHggPD0gUENJX1JPTV9SRVNPVVJDRTsgaWR4KyspIHsKQEAgLTI3NSwxNSArMjc3LDIxIEBACiAJCQlkZXYtPnJlc291cmNlW2lkeF0ucGFyZW50ID0gJmlvbWVtX3Jlc291cmNlOwogCX0KIAotCS8qIHNldCB1cCBob3N0IGJ1cyBsaW5rYWdlcyAqLwotCWJzID0gU05fUENJQlVTX0JVU1NPRlQoZGV2LT5idXMpOwotCWhvc3RfcGNpX2RldiA9Ci0JICAgIHBjaV9maW5kX3Nsb3QoU05fUENJREVWX0lORk8oZGV2KS0+cGRpX3Nsb3RfaG9zdF9oYW5kbGUgPj4gMzIsCi0JCQkgIFNOX1BDSURFVl9JTkZPKGRldiktPgotCQkJICBwZGlfc2xvdF9ob3N0X2hhbmRsZSAmIDB4ZmZmZmZmZmYpOworCS8qCisJICogVXNpbmcgdGhlIFBST01zIHZhbHVlcyBmb3IgdGhlIFBDSSBob3N0IGJ1cywgZ2V0IHRoZSBMaW51eAorIAkgKiBQQ0kgaG9zdF9wY2lfZGV2IHN0cnVjdCBhbmQgc2V0IHVwIGhvc3QgYnVzIGxpbmthZ2VzCisgCSAqLworCisgCWJ1c19ubyA9IFNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbG90X2hvc3RfaGFuZGxlID4+IDMyOworIAlkZXZmbiA9IFNOX1BDSURFVl9JTkZPKGRldiktPnBkaV9zbG90X2hvc3RfaGFuZGxlICYgMHhmZmZmZmZmZjsKKyAJaG9zdF9wY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoZGV2LT5idXMpLCBidXNfbm8pOworIAlob3N0X3BjaV9kZXYgPSBwY2lfZ2V0X3Nsb3QoaG9zdF9wY2lfYnVzLCBkZXZmbik7CisKKwlTTl9QQ0lERVZfSU5GTyhkZXYpLT5ob3N0X3BjaV9kZXYgPSBob3N0X3BjaV9kZXY7CiAJU05fUENJREVWX0lORk8oZGV2KS0+cGRpX2hvc3RfcGNpZGV2X2luZm8gPQotCSAgICBTTl9QQ0lERVZfSU5GTyhob3N0X3BjaV9kZXYpOworCSAgICAJCQkJCVNOX1BDSURFVl9JTkZPKGhvc3RfcGNpX2Rldik7CiAJU05fUENJREVWX0lORk8oZGV2KS0+cGRpX2xpbnV4X3BjaWRldiA9IGRldjsKKwlicyA9IFNOX1BDSUJVU19CVVNTT0ZUKGRldi0+YnVzKTsKIAlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfcGNpYnVzX2luZm8gPSBiczsKIAogCWlmIChicyAmJiBicy0+YnNfYXNpY190eXBlIDwgUENJSU9fQVNJQ19NQVhfVFlQRVMpIHsKQEAgLTI5Nyw2ICszMDUsOSBAQAogCQlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc25faXJxX2luZm8gPSBzbl9pcnFfaW5mbzsKIAkJZGV2LT5pcnEgPSBTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc25faXJxX2luZm8tPmlycV9pcnE7CiAJCXNuX2lycV9maXh1cChkZXYsIHNuX2lycV9pbmZvKTsKKwl9IGVsc2UgeworCQlTTl9QQ0lERVZfSU5GTyhkZXYpLT5wZGlfc25faXJxX2luZm8gPSBOVUxMOworCQlrZnJlZShzbl9pcnFfaW5mbyk7CiAJfQogfQogCkBAIC0zMDQsNTUgKzMxNSw1NyBAQAogICogc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoKSAtIFRoaXMgcm91dGluZSBzZXRzIHVwIGEgYnVzJ3MgcmVzb3VyY2VzCiAgKiBjb25zaXN0ZW50IHdpdGggdGhlIExpbnV4IFBDSSBhYnN0cmFjdGlvbiBsYXllci4KICAqLwotc3RhdGljIHZvaWQgc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoaW50IHNlZ21lbnQsIGludCBidXNudW0pCit2b2lkIHNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKGludCBzZWdtZW50LCBpbnQgYnVzbnVtLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCWludCBzdGF0dXMgPSAwOwogCWludCBuYXNpZCwgY25vZGU7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CiAJc3RydWN0IHBjaWJ1c19idXNzb2Z0ICpwcm9tX2J1c3NvZnRfcHRyOwogCXN0cnVjdCBodWJkZXZfaW5mbyAqaHViZGV2X2luZm87CiAJdm9pZCAqcHJvdmlkZXJfc29mdDsKIAlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKIAotCXN0YXR1cyA9Ci0JICAgIHNhbF9nZXRfcGNpYnVzX2luZm8oKHU2NCkgc2VnbWVudCwgKHU2NCkgYnVzbnVtLAotCQkJCSh1NjQpIGlhNjRfdHBhKCZwcm9tX2J1c3NvZnRfcHRyKSk7Ci0JaWYgKHN0YXR1cyA+IDApIHsKLQkJcmV0dXJuOwkJLyogYnVzICMgZG9lcyBub3QgZXhpc3QgKi8KLQl9Ci0KKyAJc3RhdHVzID0gc2FsX2dldF9wY2lidXNfaW5mbygodTY0KSBzZWdtZW50LCAodTY0KSBidXNudW0sCisgCQkJCSAgICAgKHU2NCkgaWE2NF90cGEoJnByb21fYnVzc29mdF9wdHIpKTsKKyAJaWYgKHN0YXR1cyA+IDApCisJCXJldHVybjsJCS8qYnVzICMgZG9lcyBub3QgZXhpc3QgKi8KIAlwcm9tX2J1c3NvZnRfcHRyID0gX192YShwcm9tX2J1c3NvZnRfcHRyKTsKLQljb250cm9sbGVyID0gc25fYWxsb2NfcGNpX3N5c2RhdGEoKTsKLQkvKiBjb250cm9sbGVyIG5vbi16ZXJvIGlzIEJVRydkIGluIHNuX2FsbG9jX3BjaV9zeXNkYXRhICovCiAKLQlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKKyAJY29udHJvbGxlciA9IGtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IHBjaV9jb250cm9sbGVyKSwgR0ZQX0tFUk5FTCk7CisgCWlmICghY29udHJvbGxlcikKKyAJCUJVRygpOworCiAJaWYgKGJ1cyA9PSBOVUxMKSB7Ci0JCXJldHVybjsJCS8qIGVycm9yLCBvciBidXMgYWxyZWFkeSBzY2FubmVkICovCisgCQlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbnVtLCAmcGNpX3Jvb3Rfb3BzLCBjb250cm9sbGVyKTsKKyAJCWlmIChidXMgPT0gTlVMTCkKKyAJCQlyZXR1cm47CS8qIGVycm9yLCBvciBidXMgYWxyZWFkeSBzY2FubmVkICovCisgCQlidXMtPnN5c2RhdGEgPSBOVUxMOwogCX0KIAorCWlmIChidXMtPnN5c2RhdGEpCisJCWdvdG8gZXJyb3JfcmV0dXJuOyAvKiBzeXNkYXRhIGFscmVhZHkgYWxsb2MnZCAqLworCiAJLyoKIAkgKiBQZXItcHJvdmlkZXIgZml4dXAuICBDb3BpZXMgdGhlIGNvbnRlbnRzIGZyb20gcHJvbSB0byBsb2NhbAogCSAqIGFyZWEgYW5kIGxpbmtzIFNOX1BDSUJVU19CVVNTT0ZUKCkuCiAJICovCiAKLQlpZiAocHJvbV9idXNzb2Z0X3B0ci0+YnNfYXNpY190eXBlID49IFBDSUlPX0FTSUNfTUFYX1RZUEVTKSB7CisJaWYgKHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSA+PSBQQ0lJT19BU0lDX01BWF9UWVBFUykKIAkJcmV0dXJuOwkJLyogdW5zdXBwb3J0ZWQgYXNpYyB0eXBlICovCi0JfQorCisJaWYgKHByb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZSA9PSBQQ0lJT19BU0lDX1RZUEVfUFBCKQorCQlnb3RvIGVycm9yX3JldHVybjsgLyogbm8gZnVydGhlciBmaXh1cCBuZWNlc3NhcnkgKi8KIAogCXByb3ZpZGVyID0gc25fcGNpX3Byb3ZpZGVyW3Byb21fYnVzc29mdF9wdHItPmJzX2FzaWNfdHlwZV07Ci0JaWYgKHByb3ZpZGVyID09IE5VTEwpIHsKKwlpZiAocHJvdmlkZXIgPT0gTlVMTCkKIAkJcmV0dXJuOwkJLyogbm8gcHJvdmlkZXIgcmVnaXN0ZXJkIGZvciB0aGlzIGFzaWMgKi8KLQl9CiAKIAlwcm92aWRlcl9zb2Z0ID0gTlVMTDsKLQlpZiAocHJvdmlkZXItPmJ1c19maXh1cCkgeworCWlmIChwcm92aWRlci0+YnVzX2ZpeHVwKQogCQlwcm92aWRlcl9zb2Z0ID0gKCpwcm92aWRlci0+YnVzX2ZpeHVwKSAocHJvbV9idXNzb2Z0X3B0cik7Ci0JfQogCi0JaWYgKHByb3ZpZGVyX3NvZnQgPT0gTlVMTCkgeworCWlmIChwcm92aWRlcl9zb2Z0ID09IE5VTEwpCiAJCXJldHVybjsJCS8qIGZpeHVwIGZhaWxlZCBvciBub3QgYXBwbGljYWJsZSAqLwotCX0KIAogCS8qCiAJICogR2VuZXJpYyBidXMgZml4dXAgZ29lcyBoZXJlLiAgRG9uJ3QgcmVmZXJlbmNlIHByb21fYnVzc29mdF9wdHIKQEAgLTM2MSwxMiArMzc0LDQ3IEBACiAKIAlidXMtPnN5c2RhdGEgPSBjb250cm9sbGVyOwogCVBDSV9DT05UUk9MTEVSKGJ1cyktPnBsYXRmb3JtX2RhdGEgPSBwcm92aWRlcl9zb2Z0OwotCiAJbmFzaWQgPSBOQVNJRF9HRVQoU05fUENJQlVTX0JVU1NPRlQoYnVzKS0+YnNfYmFzZSk7CiAJY25vZGUgPSBuYXNpZF90b19jbm9kZWlkKG5hc2lkKTsKIAlodWJkZXZfaW5mbyA9IChzdHJ1Y3QgaHViZGV2X2luZm8gKikoTk9ERVBEQShjbm9kZSktPnBkaW5mbyk7CiAJU05fUENJQlVTX0JVU1NPRlQoYnVzKS0+YnNfeHdpZGdldF9pbmZvID0KIAkgICAgJihodWJkZXZfaW5mby0+aGRpX3h3aWRnZXRfaW5mb1tTTl9QQ0lCVVNfQlVTU09GVChidXMpLT5ic194aWRdKTsKKworCXJldHVybjsKKworZXJyb3JfcmV0dXJuOgorCisJa2ZyZWUoY29udHJvbGxlcik7CisJcmV0dXJuOworfQorCit2b2lkIHNuX2J1c19zdG9yZV9zeXNkYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHN5c2RhdGFfZWwgKmVsZW1lbnQ7CisKKwllbGVtZW50ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHN5c2RhdGFfZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZW1lbnQpIHsKKwkJZGV2X2RiZyhkZXYsICIlczogb3V0IG9mIG1lbW9yeSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisJZWxlbWVudC0+c3lzZGF0YSA9IGRldi0+c3lzZGF0YTsKKwlsaXN0X2FkZCgmZWxlbWVudC0+ZW50cnksICZzbl9zeXNkYXRhX2xpc3QpOworfQorCit2b2lkIHNuX2J1c19mcmVlX3N5c2RhdGEodm9pZCkKK3sKKwlzdHJ1Y3Qgc3lzZGF0YV9lbCAqZWxlbWVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCitzbl9zeXNkYXRhX2ZyZWVfc3RhcnQ6CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmc25fc3lzZGF0YV9saXN0KSB7CisJCWVsZW1lbnQgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzeXNkYXRhX2VsLCBlbnRyeSk7CisJCWxpc3RfZGVsKCZlbGVtZW50LT5lbnRyeSk7CisJCWtmcmVlKGVsZW1lbnQtPnN5c2RhdGEpOworCQlrZnJlZShlbGVtZW50KTsKKwkJZ290byBzbl9zeXNkYXRhX2ZyZWVfc3RhcnQ7CisJfQorCXJldHVybjsKIH0KIAogLyoKQEAgLTM4NCw3ICs0MzIsNyBAQAogCWV4dGVybiB2b2lkIHJlZ2lzdGVyX3NuX3Byb2Nmcyh2b2lkKTsKICNlbmRpZgogCi0JaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSB8fCBJU19SVU5OSU5HX09OX1NJTVVMQVRPUigpKQorCWlmICghaWE2NF9wbGF0Zm9ybV9pcygic24yIikgfHwgSVNfUlVOTklOR19PTl9GQUtFX1BST00oKSkKIAkJcmV0dXJuIDA7CiAKIAkvKgpAQCAtNDAzLDIwICs0NTEsMTcgQEAKIAkgKi8KIAlpYTY0X21heF9pb21tdV9tZXJnZV9tYXNrID0gflBBR0VfTUFTSzsKIAlzbl9maXh1cF9pb25vZGVzKCk7Ci0Jc25faXJxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvICopICogTlJfSVJRUywgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNuX2lycSA8PSAwKQotCQlCVUcoKTsJCS8qIENhbm5vIGFmZm9yZCB0byBydW4gb3V0IG9mIG1lbW9yeS4gKi8KLQltZW1zZXQoc25faXJxLCAwLCBzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvICopICogTlJfSVJRUyk7Ci0KKwlzbl9pcnFfbGhfaW5pdCgpOworCUlOSVRfTElTVF9IRUFEKCZzbl9zeXNkYXRhX2xpc3QpOwogCXNuX2luaXRfY3BlaV90aW1lcigpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlyZWdpc3Rlcl9zbl9wcm9jZnMoKTsKICNlbmRpZgogCi0JZm9yIChpID0gMDsgaSA8IFBDSV9CVVNFU19UT19TQ0FOOyBpKyspIHsKLQkJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoMCwgaSk7Ci0JfQorCS8qIGJ1c3NlcyBhcmUgbm90IGtub3duIHlldCAuLi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgUENJX0JVU0VTX1RPX1NDQU47IGkrKykKKwkJc25fcGNpX2NvbnRyb2xsZXJfZml4dXAoMCwgaSwgTlVMTCk7CiAKIAkvKgogCSAqIEdlbmVyaWMgTGludXggUENJIExheWVyIGhhcyBjcmVhdGVkIHRoZSBwY2lfYnVzIGFuZCBwY2lfZGV2IApAQCAtNDI1LDkgKzQ3MCw4IEBACiAJICovCiAKIAl3aGlsZSAoKHBjaV9kZXYgPQotCQlwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpIHsKKwkJcGNpX2dldF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpCiAJCXNuX3BjaV9maXh1cF9zbG90KHBjaV9kZXYpOwotCX0KIAogCXNuX2lvaWZfaW5pdGVkID0gMTsJLyogc24gSS9PIGluZnJhc3RydWN0dXJlIG5vdyBpbml0aWFsaXplZCAqLwogCkBAIC00NjksMyArNTEzLDggQEAKIH0KIAogc3Vic3lzX2luaXRjYWxsKHNuX3BjaV9pbml0KTsKK0VYUE9SVF9TWU1CT0woc25fcGNpX2ZpeHVwX3Nsb3QpOworRVhQT1JUX1NZTUJPTChzbl9wY2lfdW5maXh1cF9zbG90KTsKK0VYUE9SVF9TWU1CT0woc25fcGNpX2NvbnRyb2xsZXJfZml4dXApOworRVhQT1JUX1NZTUJPTChzbl9idXNfc3RvcmVfc3lzZGF0YSk7CitFWFBPUlRfU1lNQk9MKHNuX2J1c19mcmVlX3N5c2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb212LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvbXYuYwppbmRleCBmZWM2ZDhiLi43Y2UzY2RhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvbXYuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvbXYuYwpAQCAtOSwxMiArOSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS92Z2EuaD4KICNpbmNsdWRlIDxhc20vc24vbm9kZXBkYS5oPgogI2luY2x1ZGUgPGFzbS9zbi9zaW11bGF0b3IuaD4KICNpbmNsdWRlIDxhc20vc24vcGRhLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NuX2NwdWlkLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CiAKKyNkZWZpbmUgSVNfTEVHQUNZX1ZHQV9JT1BPUlQocCkgXAorCSgoKHApID49IDB4M2IwICYmIChwKSA8PSAweDNiYikgfHwgKChwKSA+PSAweDNjMCAmJiAocCkgPD0gMHgzZGYpKQorCiAvKioKICAqIHNuX2lvX2FkZHIgLSBjb252ZXJ0IGFuIGluL291dCBwb3J0IHRvIGFuIGkvbyBhZGRyZXNzCiAgKiBAcG9ydDogcG9ydCB0byBjb252ZXJ0CkBAIC0yNiw2ICszMCw4IEBACiB2b2lkICpzbl9pb19hZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoIUlTX1JVTk5JTkdfT05fU0lNVUxBVE9SKCkpIHsKKwkJaWYgKElTX0xFR0FDWV9WR0FfSU9QT1JUKHBvcnQpKQorCQkJcG9ydCArPSB2Z2FfY29uc29sZV9pb2Jhc2U7CiAJCS8qIE9uIHNuMiwgbGVnYWN5IEkvTyBwb3J0cyBkb24ndCBwb2ludCBhdCBhbnl0aGluZyAqLwogCQlpZiAocG9ydCA8ICg2NCAqIDEwMjQpKQogCQkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwppbmRleCAwZjRlODEzOC4uODRkMjc2YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC05LDEzICs5LDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGFzbS9zbi9pbnRyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vYXJjaC5oPgotI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKKyNpbmNsdWRlIDxhc20vc24vaW50ci5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvcGNpYnJfcHJvdmlkZXIuaCIKICNpbmNsdWRlIDxhc20vc24vc2h1Yl9tbXIuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAKQEAgLTI1LDcgKzI1LDggQEAKIAogZXh0ZXJuIGludCBzbl9mb3JjZV9pbnRlcnJ1cHRfZmxhZzsKIGV4dGVybiBpbnQgc25faW9pZl9pbml0ZWQ7Ci1zdHJ1Y3Qgc25faXJxX2luZm8gKipzbl9pcnE7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqKnNuX2lycV9saDsKK3N0YXRpYyBzcGlubG9ja190IHNuX2lycV9pbmZvX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7IC8qIG5vbi1JUlEgbG9jayAqLwogCiBzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHNuX2ludHJfYWxsb2MobmFzaWRfdCBsb2NhbF9uYXNpZCwgaW50IGxvY2FsX3dpZGdldCwKIAkJCQkgICAgIHU2NCBzbl9pcnFfaW5mbywKQEAgLTEwMSw3ICsxMDIsNyBAQAogCQluYXNpZCA9IGdldF9uYXNpZCgpOwogCQlldmVudF9vY2N1cnJlZCA9IEhVQl9MKCh1aW50NjRfdCAqKSBHTE9CQUxfTU1SX0FERFIKIAkJCQkgICAgICAgKG5hc2lkLCBTSF9FVkVOVF9PQ0NVUlJFRCkpOwotCQkvKiBJZiB0aGUgVUFSVCBiaXQgaXMgc2V0IGhlcmUsIHdlIG1heSBoYXZlIHJlY2VpdmVkIGFuIAorCQkvKiBJZiB0aGUgVUFSVCBiaXQgaXMgc2V0IGhlcmUsIHdlIG1heSBoYXZlIHJlY2VpdmVkIGFuCiAJCSAqIGludGVycnVwdCBmcm9tIHRoZSBVQVJUIHRoYXQgdGhlIGRyaXZlciBtaXNzZWQuICBUbwogCQkgKiBtYWtlIHN1cmUsIHdlIElQSSBvdXJzZWx2ZXMgdG8gZm9yY2UgdXMgdG8gbG9vayBhZ2Fpbi4KIAkJICovCkBAIC0xMTUsODIgKzExNiw4NCBAQAogCQlmb3JjZV9pbnRlcnJ1cHQoaXJxKTsKIH0KIAorc3RhdGljIHZvaWQgc25faXJxX2luZm9fZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpOworCiBzdGF0aWMgdm9pZCBzbl9zZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQogewotCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8gPSBzbl9pcnFbaXJxXTsKLQlzdHJ1Y3Qgc25faXJxX2luZm8gKnRtcF9zbl9pcnFfaW5mbzsKKwlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvLCAqc25faXJxX2luZm9fc2FmZTsKIAlpbnQgY3B1aWQsIGNwdXBoeXM7Ci0JbmFzaWRfdCB0X25hc2lkOwkvKiBuYXNpZCB0byB0YXJnZXQgKi8KLQlpbnQgdF9zbGljZTsJCS8qIHNsaWNlIHRvIHRhcmdldCAqLwotCi0JLyogYWxsb2NhdGUgYSB0ZW1wIHNuX2lycV9pbmZvIHN0cnVjdCB0byBnZXQgbmV3IHRhcmdldCBpbmZvICovCi0JdG1wX3NuX2lycV9pbmZvID0ga21hbGxvYyhzaXplb2YoKnRtcF9zbl9pcnFfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghdG1wX3NuX2lycV9pbmZvKQotCQlyZXR1cm47CiAKIAljcHVpZCA9IGZpcnN0X2NwdShtYXNrKTsKIAljcHVwaHlzID0gY3B1X3BoeXNpY2FsX2lkKGNwdWlkKTsKLQl0X25hc2lkID0gY3B1aWRfdG9fbmFzaWQoY3B1aWQpOwotCXRfc2xpY2UgPSBjcHVpZF90b19zbGljZShjcHVpZCk7CiAKLQl3aGlsZSAoc25faXJxX2luZm8pIHsKLQkJaW50IHN0YXR1czsKLQkJaW50IGxvY2FsX3dpZGdldDsKLQkJdWludDY0X3QgYnJpZGdlID0gKHVpbnQ2NF90KSBzbl9pcnFfaW5mby0+aXJxX2JyaWRnZTsKLQkJbmFzaWRfdCBsb2NhbF9uYXNpZCA9IE5BU0lEX0dFVChicmlkZ2UpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbl9pcnFfaW5mbywgc25faXJxX2luZm9fc2FmZSwKKwkJCQkgc25faXJxX2xoW2lycV0sIGxpc3QpIHsKKwkJdWludDY0X3QgYnJpZGdlOworCQlpbnQgbG9jYWxfd2lkZ2V0LCBzdGF0dXM7CisJCW5hc2lkX3QgbG9jYWxfbmFzaWQ7CisJCXN0cnVjdCBzbl9pcnFfaW5mbyAqbmV3X2lycV9pbmZvOwogCi0JCWlmICghYnJpZGdlKQotCQkJYnJlYWs7CS8qIGlycSBpcyBub3QgYSBkZXZpY2UgaW50ZXJydXB0ICovCisJCW5ld19pcnFfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyksIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X2lycV9pbmZvID09IE5VTEwpCisJCQlicmVhazsKKwkJbWVtY3B5KG5ld19pcnFfaW5mbywgc25faXJxX2luZm8sIHNpemVvZihzdHJ1Y3Qgc25faXJxX2luZm8pKTsKKworCQlicmlkZ2UgPSAodWludDY0X3QpIG5ld19pcnFfaW5mby0+aXJxX2JyaWRnZTsKKwkJaWYgKCFicmlkZ2UpIHsKKwkJCWtmcmVlKG5ld19pcnFfaW5mbyk7CisJCQlicmVhazsgLyogaXJxIGlzIG5vdCBhIGRldmljZSBpbnRlcnJ1cHQgKi8KKwkJfQorCisJCWxvY2FsX25hc2lkID0gTkFTSURfR0VUKGJyaWRnZSk7CiAKIAkJaWYgKGxvY2FsX25hc2lkICYgMSkKIAkJCWxvY2FsX3dpZGdldCA9IFRJT19TV0lOX1dJREdFVE5VTShicmlkZ2UpOwogCQllbHNlCiAJCQlsb2NhbF93aWRnZXQgPSBTV0lOX1dJREdFVE5VTShicmlkZ2UpOwogCi0JCS8qIEZyZWUgdGhlIG9sZCBQUk9NIHNuX2lycV9pbmZvIHN0cnVjdHVyZSAqLwotCQlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgc25faXJxX2luZm8pOworCQkvKiBGcmVlIHRoZSBvbGQgUFJPTSBuZXdfaXJxX2luZm8gc3RydWN0dXJlICovCisJCXNuX2ludHJfZnJlZShsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LCBuZXdfaXJxX2luZm8pOworCQkvKiBVcGRhdGUga2VybmVscyBuZXdfaXJxX2luZm8gd2l0aCBuZXcgdGFyZ2V0IGluZm8gKi8KKwkJdW5yZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOwogCi0JCS8qIGFsbG9jYXRlIGEgbmV3IFBST00gc25faXJxX2luZm8gc3RydWN0ICovCisJCS8qIGFsbG9jYXRlIGEgbmV3IFBST00gbmV3X2lycV9pbmZvIHN0cnVjdCAqLwogCQlzdGF0dXMgPSBzbl9pbnRyX2FsbG9jKGxvY2FsX25hc2lkLCBsb2NhbF93aWRnZXQsCi0JCQkJICAgICAgIF9fcGEodG1wX3NuX2lycV9pbmZvKSwgaXJxLCB0X25hc2lkLAotCQkJCSAgICAgICB0X3NsaWNlKTsKKwkJCQkgICAgICAgX19wYShuZXdfaXJxX2luZm8pLCBpcnEsCisJCQkJICAgICAgIGNwdWlkX3RvX25hc2lkKGNwdWlkKSwKKwkJCQkgICAgICAgY3B1aWRfdG9fc2xpY2UoY3B1aWQpKTsKIAotCQlpZiAoc3RhdHVzID09IDApIHsKLQkJCS8qIFVwZGF0ZSBrZXJuZWxzIHNuX2lycV9pbmZvIHdpdGggbmV3IHRhcmdldCBpbmZvICovCi0JCQl1bnJlZ2lzdGVyX2ludHJfcGRhKHNuX2lycV9pbmZvKTsKLQkJCXNuX2lycV9pbmZvLT5pcnFfY3B1aWQgPSBjcHVpZDsKLQkJCXNuX2lycV9pbmZvLT5pcnFfbmFzaWQgPSB0X25hc2lkOwotCQkJc25faXJxX2luZm8tPmlycV9zbGljZSA9IHRfc2xpY2U7Ci0JCQlzbl9pcnFfaW5mby0+aXJxX3h0YWxrYWRkciA9Ci0JCQkgICAgdG1wX3NuX2lycV9pbmZvLT5pcnFfeHRhbGthZGRyOwotCQkJc25faXJxX2luZm8tPmlycV9jb29raWUgPSB0bXBfc25faXJxX2luZm8tPmlycV9jb29raWU7Ci0JCQlyZWdpc3Rlcl9pbnRyX3BkYShzbl9pcnFfaW5mbyk7CisJCS8qIFNBTCBjYWxsIGZhaWxlZCAqLworCQlpZiAoc3RhdHVzKSB7CisJCQlrZnJlZShuZXdfaXJxX2luZm8pOworCQkJYnJlYWs7CisJCX0KIAotCQkJaWYgKElTX1BDSV9CUklER0VfQVNJQyhzbl9pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlKSkgewotCQkJCXBjaWJyX2NoYW5nZV9kZXZpY2VzX2lycShzbl9pcnFfaW5mbyk7Ci0JCQl9CisJCW5ld19pcnFfaW5mby0+aXJxX2NwdWlkID0gY3B1aWQ7CisJCXJlZ2lzdGVyX2ludHJfcGRhKG5ld19pcnFfaW5mbyk7CiAKLQkJCXNuX2lycV9pbmZvID0gc25faXJxX2luZm8tPmlycV9uZXh0OworCQlpZiAoSVNfUENJX0JSSURHRV9BU0lDKG5ld19pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlKSkKKwkJCXBjaWJyX2NoYW5nZV9kZXZpY2VzX2lycShuZXdfaXJxX2luZm8pOworCisJCXNwaW5fbG9jaygmc25faXJxX2luZm9fbG9jayk7CisJCWxpc3RfcmVwbGFjZV9yY3UoJnNuX2lycV9pbmZvLT5saXN0LCAmbmV3X2lycV9pbmZvLT5saXN0KTsKKwkJc3Bpbl91bmxvY2soJnNuX2lycV9pbmZvX2xvY2spOworCQljYWxsX3JjdSgmc25faXJxX2luZm8tPnJjdSwgc25faXJxX2luZm9fZnJlZSk7CiAKICNpZmRlZiBDT05GSUdfU01QCi0JCQlzZXRfaXJxX2FmZmluaXR5X2luZm8oKGlycSAmIDB4ZmYpLCBjcHVwaHlzLCAwKTsKKwkJc2V0X2lycV9hZmZpbml0eV9pbmZvKChpcnEgJiAweGZmKSwgY3B1cGh5cywgMCk7CiAjZW5kaWYKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwkvKiBzbnBfYWZmaW5pdHkgZmFpbGVkIHRoZSBpbnRyX2FsbG9jICovCi0JCX0KIAl9Ci0Ja2ZyZWUodG1wX3NuX2lycV9pbmZvKTsKIH0KIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX3NuID0gewotCSJTTiBodWIiLAotCXNuX3N0YXJ0dXBfaXJxLAotCXNuX3NodXRkb3duX2lycSwKLQlzbl9lbmFibGVfaXJxLAotCXNuX2Rpc2FibGVfaXJxLAotCXNuX2Fja19pcnEsCi0Jc25fZW5kX2lycSwKLQlzbl9zZXRfYWZmaW5pdHlfaXJxCisJLnR5cGVuYW1lCT0gIlNOIGh1YiIsCisJLnN0YXJ0dXAJPSBzbl9zdGFydHVwX2lycSwKKwkuc2h1dGRvd24JPSBzbl9zaHV0ZG93bl9pcnEsCisJLmVuYWJsZQkJPSBzbl9lbmFibGVfaXJxLAorCS5kaXNhYmxlCT0gc25fZGlzYWJsZV9pcnEsCisJLmFjawkJPSBzbl9hY2tfaXJxLAorCS5lbmQJCT0gc25fZW5kX2lycSwKKwkuc2V0X2FmZmluaXR5CT0gc25fc2V0X2FmZmluaXR5X2lycQogfTsKIAogdW5zaWduZWQgaW50IHNuX2xvY2FsX3ZlY3Rvcl90b19pcnEodTggdmVjdG9yKQpAQCAtMjMxLDE5ICsyMzQsMTggQEAKIAlzdHJ1Y3Qgc25faXJxX2luZm8gKnRtcF9pcnFfaW5mbzsKIAlpbnQgaSwgZm91bmRtYXRjaDsKIAorCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAocGRhY3B1KGNwdSktPnNuX2xhc3RfaXJxID09IGlycSkgewogCQlmb3VuZG1hdGNoID0gMDsKLQkJZm9yIChpID0gcGRhY3B1KGNwdSktPnNuX2xhc3RfaXJxIC0gMTsgaTsgaS0tKSB7Ci0JCQl0bXBfaXJxX2luZm8gPSBzbl9pcnFbaV07Ci0JCQl3aGlsZSAodG1wX2lycV9pbmZvKSB7CisJCWZvciAoaSA9IHBkYWNwdShjcHUpLT5zbl9sYXN0X2lycSAtIDE7CisJCSAgICAgaSAmJiAhZm91bmRtYXRjaDsgaS0tKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0bXBfaXJxX2luZm8sCisJCQkJCQlzbl9pcnFfbGhbaV0sCisJCQkJCQlsaXN0KSB7CiAJCQkJaWYgKHRtcF9pcnFfaW5mby0+aXJxX2NwdWlkID09IGNwdSkgewotCQkJCQlmb3VuZG1hdGNoKys7CisJCQkJCWZvdW5kbWF0Y2ggPSAxOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJdG1wX2lycV9pbmZvID0gdG1wX2lycV9pbmZvLT5pcnFfbmV4dDsKLQkJCX0KLQkJCWlmIChmb3VuZG1hdGNoKSB7Ci0JCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJcGRhY3B1KGNwdSktPnNuX2xhc3RfaXJxID0gaTsKQEAgLTI1MSw2MCArMjUzLDI3IEBACiAKIAlpZiAocGRhY3B1KGNwdSktPnNuX2ZpcnN0X2lycSA9PSBpcnEpIHsKIAkJZm91bmRtYXRjaCA9IDA7Ci0JCWZvciAoaSA9IHBkYWNwdShjcHUpLT5zbl9maXJzdF9pcnEgKyAxOyBpIDwgTlJfSVJRUzsgaSsrKSB7Ci0JCQl0bXBfaXJxX2luZm8gPSBzbl9pcnFbaV07Ci0JCQl3aGlsZSAodG1wX2lycV9pbmZvKSB7CisJCWZvciAoaSA9IHBkYWNwdShjcHUpLT5zbl9maXJzdF9pcnEgKyAxOworCQkgICAgIGkgPCBOUl9JUlFTICYmICFmb3VuZG1hdGNoOyBpKyspIHsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRtcF9pcnFfaW5mbywKKwkJCQkJCXNuX2lycV9saFtpXSwKKwkJCQkJCWxpc3QpIHsKIAkJCQlpZiAodG1wX2lycV9pbmZvLT5pcnFfY3B1aWQgPT0gY3B1KSB7Ci0JCQkJCWZvdW5kbWF0Y2grKzsKKwkJCQkJZm91bmRtYXRjaCA9IDE7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQl0bXBfaXJxX2luZm8gPSB0bXBfaXJxX2luZm8tPmlycV9uZXh0OwotCQkJfQotCQkJaWYgKGZvdW5kbWF0Y2gpIHsKLQkJCQlicmVhazsKIAkJCX0KIAkJfQogCQlwZGFjcHUoY3B1KS0+c25fZmlyc3RfaXJxID0gKChpID09IE5SX0lSUVMpID8gMCA6IGkpOwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfYWxsb2MobmFzaWRfdCBsb2NhbF9uYXNpZCwgaW50IGxvY2FsX3dpZGdldCwgaW50IGlycSwKLQkJCQkgbmFzaWRfdCBuYXNpZCwgaW50IHNsaWNlKQorc3RhdGljIHZvaWQgc25faXJxX2luZm9fZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKLQlpbnQgc3RhdHVzOwogCi0Jc25faXJxX2luZm8gPSBrbWFsbG9jKHNpemVvZigqc25faXJxX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoc25faXJxX2luZm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1zZXQoc25faXJxX2luZm8sIDB4MCwgc2l6ZW9mKCpzbl9pcnFfaW5mbykpOwotCi0Jc3RhdHVzID0KLQkgICAgc25faW50cl9hbGxvYyhsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LCBfX3BhKHNuX2lycV9pbmZvKSwgaXJxLAotCQkJICBuYXNpZCwgc2xpY2UpOwotCi0JaWYgKHN0YXR1cykgewotCQlrZnJlZShzbl9pcnFfaW5mbyk7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCXJldHVybiBzbl9pcnFfaW5mbzsKLQl9Ci19Ci0KLXZvaWQgc25faXJxX2ZyZWUoc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbykKLXsKLQl1aW50NjRfdCBicmlkZ2UgPSAodWludDY0X3QpIHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlOwotCW5hc2lkX3QgbG9jYWxfbmFzaWQgPSBOQVNJRF9HRVQoYnJpZGdlKTsKLQlpbnQgbG9jYWxfd2lkZ2V0OwotCi0JaWYgKGxvY2FsX25hc2lkICYgMSkJLyogdGlvIGNoZWNrICovCi0JCWxvY2FsX3dpZGdldCA9IFRJT19TV0lOX1dJREdFVE5VTShicmlkZ2UpOwotCWVsc2UKLQkJbG9jYWxfd2lkZ2V0ID0gU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKLQotCXNuX2ludHJfZnJlZShsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LCBzbl9pcnFfaW5mbyk7Ci0KKwlzbl9pcnFfaW5mbyA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qgc25faXJxX2luZm8sIHJjdSk7CiAJa2ZyZWUoc25faXJxX2luZm8pOwogfQogCkBAIC0zMTQsMzAgKzI4Myw1NCBAQAogCWludCBzbGljZSA9IHNuX2lycV9pbmZvLT5pcnFfc2xpY2U7CiAJaW50IGNwdSA9IG5hc2lkX3NsaWNlX3RvX2NwdWlkKG5hc2lkLCBzbGljZSk7CiAKKwlwY2lfZGV2X2dldChwY2lfZGV2KTsKIAlzbl9pcnFfaW5mby0+aXJxX2NwdWlkID0gY3B1OwogCXNuX2lycV9pbmZvLT5pcnFfcGNpaW9pbmZvID0gU05fUENJREVWX0lORk8ocGNpX2Rldik7CiAKIAkvKiBsaW5rIGl0IGludG8gdGhlIHNuX2lycVtpcnFdIGxpc3QgKi8KLQlzbl9pcnFfaW5mby0+aXJxX25leHQgPSBzbl9pcnFbc25faXJxX2luZm8tPmlycV9pcnFdOwotCXNuX2lycVtzbl9pcnFfaW5mby0+aXJxX2lycV0gPSBzbl9pcnFfaW5mbzsKKwlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOworCWxpc3RfYWRkX3JjdSgmc25faXJxX2luZm8tPmxpc3QsIHNuX2lycV9saFtzbl9pcnFfaW5mby0+aXJxX2lycV0pOworCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKIAogCSh2b2lkKXJlZ2lzdGVyX2ludHJfcGRhKHNuX2lycV9pbmZvKTsKIH0KIAordm9pZCBzbl9pcnFfdW5maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvOworCisJLyogT25seSBjbGVhbnVwIElSUSBzdHVmZiBpZiB0aGlzIGRldmljZSBoYXMgYSBob3N0IGJ1cyBjb250ZXh0ICovCisJaWYgKCFTTl9QQ0lERVZfQlVTU09GVChwY2lfZGV2KSkKKwkJcmV0dXJuOworCisJc25faXJxX2luZm8gPSBTTl9QQ0lERVZfSU5GTyhwY2lfZGV2KS0+cGRpX3NuX2lycV9pbmZvOworCWlmICghc25faXJxX2luZm8gfHwgIXNuX2lycV9pbmZvLT5pcnFfaXJxKSB7CisJCWtmcmVlKHNuX2lycV9pbmZvKTsKKwkJcmV0dXJuOworCX0KKworCXVucmVnaXN0ZXJfaW50cl9wZGEoc25faXJxX2luZm8pOworCXNwaW5fbG9jaygmc25faXJxX2luZm9fbG9jayk7CisJbGlzdF9kZWxfcmN1KCZzbl9pcnFfaW5mby0+bGlzdCk7CisJc3Bpbl91bmxvY2soJnNuX2lycV9pbmZvX2xvY2spOworCWNhbGxfcmN1KCZzbl9pcnFfaW5mby0+cmN1LCBzbl9pcnFfaW5mb19mcmVlKTsKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKK30KKwogc3RhdGljIHZvaWQgZm9yY2VfaW50ZXJydXB0KGludCBpcnEpCiB7CiAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKIAogCWlmICghc25faW9pZl9pbml0ZWQpCiAJCXJldHVybjsKLQlzbl9pcnFfaW5mbyA9IHNuX2lycVtpcnFdOwotCXdoaWxlIChzbl9pcnFfaW5mbykgeworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNuX2lycV9pbmZvLCBzbl9pcnFfbGhbaXJxXSwgbGlzdCkgewogCQlpZiAoSVNfUENJX0JSSURHRV9BU0lDKHNuX2lycV9pbmZvLT5pcnFfYnJpZGdlX3R5cGUpICYmCi0JCSAgICAoc25faXJxX2luZm8tPmlycV9icmlkZ2UgIT0gTlVMTCkpIHsKKwkJICAgIChzbl9pcnFfaW5mby0+aXJxX2JyaWRnZSAhPSBOVUxMKSkKIAkJCXBjaWJyX2ZvcmNlX2ludGVycnVwdChzbl9pcnFfaW5mbyk7Ci0JCX0KLQkJc25faXJxX2luZm8gPSBzbl9pcnFfaW5mby0+aXJxX25leHQ7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKgpAQCAtNDAyLDE5ICszOTUsNDEgQEAKIAogdm9pZCBzbl9sYl9pbnRfd2FyX2NoZWNrKHZvaWQpCiB7CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKIAlpbnQgaTsKIAogCWlmICghc25faW9pZl9pbml0ZWQgfHwgcGRhLT5zbl9maXJzdF9pcnEgPT0gMCkKIAkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOwogCWZvciAoaSA9IHBkYS0+c25fZmlyc3RfaXJxOyBpIDw9IHBkYS0+c25fbGFzdF9pcnE7IGkrKykgewotCQlzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvID0gc25faXJxW2ldOwotCQl3aGlsZSAoc25faXJxX2luZm8pIHsKLQkJCS8qIE9ubHkgY2FsbCBmb3IgUENJIGJyaWRnZXMgdGhhdCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQuICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNuX2lycV9pbmZvLCBzbl9pcnFfbGhbaV0sIGxpc3QpIHsKKwkJCS8qCisJCQkgKiBPbmx5IGNhbGwgZm9yIFBDSSBicmlkZ2VzIHRoYXQgYXJlIGZ1bGx5CisJCQkgKiBpbml0aWFsaXplZC4KKwkJCSAqLwogCQkJaWYgKElTX1BDSV9CUklER0VfQVNJQyhzbl9pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlKSAmJgotCQkJICAgIChzbl9pcnFfaW5mby0+aXJxX2JyaWRnZSAhPSBOVUxMKSkgeworCQkJICAgIChzbl9pcnFfaW5mby0+aXJxX2JyaWRnZSAhPSBOVUxMKSkKIAkJCQlzbl9jaGVja19pbnRyKGksIHNuX2lycV9pbmZvKTsKLQkJCX0KLQkJCXNuX2lycV9pbmZvID0gc25faXJxX2luZm8tPmlycV9uZXh0OwogCQl9CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCit2b2lkIHNuX2lycV9saF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlzbl9pcnFfbGggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkICopICogTlJfSVJRUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbl9pcnFfbGgpCisJCXBhbmljKCJTTiBQQ0kgSU5JVDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUENJIGluaXRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgeworCQlzbl9pcnFfbGhbaV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc25faXJxX2xoW2ldKQorCQkJcGFuaWMoIlNOIFBDSSBJTklUOiBGYWlsZWQgSVJRIG1lbW9yeSBhbGxvY2F0aW9uXG4iKTsKKworCQlJTklUX0xJU1RfSEVBRChzbl9pcnFfbGhbaV0pOworCX0KKwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCmluZGV4IDQ0YmZjN2YuLjdjN2ZlNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3ZnYS5oPgogI2luY2x1ZGUgPGFzbS9zbi9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BkYS5oPgpAQCAtOTUsNiArOTYsNyBAQAogRVhQT1JUX1NZTUJPTChzbl9jb2hlcmVuY3lfaWQpOwogdTggc25fcmVnaW9uX3NpemU7CiBFWFBPUlRfU1lNQk9MKHNuX3JlZ2lvbl9zaXplKTsKK2ludCBzbl9wcm9tX3R5cGU7CS8qIDA9aGFyZHdhcmUsIDE9bWVkdXNhL3JlYWxwcm9tLCAyPW1lZHVzYS9mYWtlcHJvbSAqLwogCiBzaG9ydCBwaHlzaWNhbF9ub2RlX21hcFtNQVhfUEhZU05PREVfSURdOwogCkBAIC0yNjgsMTkgKzI3MCwyMiBAQAogewogCWxvbmcgc3RhdHVzLCB0aWNrc19wZXJfc2VjLCBkcmlmdDsKIAlpbnQgcHhtOwotCWludCBtYWpvciA9IHNuX3NhbF9yZXZfbWFqb3IoKSwgbWlub3IgPSBzbl9zYWxfcmV2X21pbm9yKCk7CisJdTMyIHZlcnNpb24gPSBzbl9zYWxfcmV2KCk7CiAJZXh0ZXJuIHZvaWQgc25fY3B1X2luaXQodm9pZCk7CiAKIAlpYTY0X3NuX3BsYXRfc2V0X2Vycm9yX2hhbmRsaW5nX2ZlYXR1cmVzKCk7CiAKLQkvKgotCSAqIElmIHRoZSBnZW5lcmljIGNvZGUgaGFzIGVuYWJsZWQgdmdhIGNvbnNvbGUgc3VwcG9ydCAtIGxldHMKLQkgKiBnZXQgcmlkIG9mIGl0IGFnYWluLiBUaGlzIGlzIGEga2x1ZGdlIGZvciB0aGUgZmFjdCB0aGF0IEFDUEkKLQkgKiBjdXJydGVudGx5IGhhcyBubyB3YXkgb2YgaW5mb3JtaW5nIHVzIGlmIGxlZ2FjeSBWR0EgaXMgYXZhaWxhYmxlCi0JICogb3Igbm90LgotCSAqLwogI2lmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19WR0FfQ09OU09MRSkKLQlpZiAoY29uc3dpdGNocCA9PSAmdmdhX2NvbikgeworCS8qCisJICogSWYgdGhlcmUgd2FzIGEgcHJpbWFyeSB2Z2EgYWRhcHRlciBpZGVudGlmaWVkIHRocm91Z2ggdGhlCisJICogRUZJIFBDRFAgdGFibGUsIG1ha2UgaXQgdGhlIHByZWZlcnJlZCBjb25zb2xlLiAgT3RoZXJ3aXNlCisJICogemVybyBvdXQgY29uc3dpdGNocC4KKwkgKi8KKworCWlmICh2Z2FfY29uc29sZV9tZW1iYXNlKSB7CisJCS8qIHVzYWJsZSB2Z2EgLi4uIG1ha2UgdHR5MCB0aGUgcHJlZmVycmVkIGRlZmF1bHQgY29uc29sZSAqLworCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eSIsIDAsIE5VTEwpOworCX0gZWxzZSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJTR0k6IERpc2FibGluZyBWR0EgY29uc29sZVxuIik7CiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAkJY29uc3dpdGNocCA9ICZkdW1teV9jb247CkBAIC0zMDMsMjIgKzMwOCwyMSBAQAogCSAqIHN1cHBvcnQgaGVyZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGxpc3RlbiB0byBmYWlsZWQga2V5Ym9hcmQgcHJvYmUKIAkgKiBtZXNzYWdlcy4KIAkgKi8KLQlpZiAoKG1ham9yIDwgMiB8fCAobWFqb3IgPT0gMiAmJiBtaW5vciA8PSA5KSkgJiYKLQkgICAgYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50KSB7CisJaWYgKHZlcnNpb24gPD0gMHgwMjA5ICYmIGFjcGlfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCkgewogCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxpbmcgbGVnYWN5IGtleWJvYXJkIHN1cHBvcnQgYXMgcHJvbSAiCiAJCSAgICAgICAiaXMgdG9vIG9sZCBhbmQgZG9lc24ndCBwcm92aWRlIEZBRFRcbiIpOwogCQlhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAwOwogCX0KIAotCXByaW50aygiU0dJIFNBTCB2ZXJzaW9uICV4LiUwMnhcbiIsIG1ham9yLCBtaW5vcik7CisJcHJpbnRrKCJTR0kgU0FMIHZlcnNpb24gJXguJTAyeFxuIiwgdmVyc2lvbiA+PiA4LCB2ZXJzaW9uICYgMHgwMEZGKTsKIAogCS8qCiAJICogQ29uZmlybSB0aGUgU0FMIHdlJ3JlIHJ1bm5pbmcgb24gaXMgcmVjZW50IGVub3VnaC4uLgogCSAqLwotCWlmICgobWFqb3IgPCBTTl9TQUxfTUlOX01BSk9SKSB8fCAobWFqb3IgPT0gU05fU0FMX01JTl9NQUpPUiAmJgotCQkJCQkgICBtaW5vciA8IFNOX1NBTF9NSU5fTUlOT1IpKSB7CisJaWYgKHZlcnNpb24gPCBTTl9TQUxfTUlOX1ZFUlNJT04pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJUaGlzIGtlcm5lbCBuZWVkcyBTR0kgU0FMIHZlcnNpb24gPj0gIgotCQkgICAgICAgIiV4LiUwMnhcbiIsIFNOX1NBTF9NSU5fTUFKT1IsIFNOX1NBTF9NSU5fTUlOT1IpOworCQkgICAgICAgIiV4LiUwMnhcbiIsIFNOX1NBTF9NSU5fVkVSU0lPTiA+PiA4LAorCQkgICAgICAgIFNOX1NBTF9NSU5fVkVSU0lPTiAmIDB4MDBGRik7CiAJCXBhbmljKCJQUk9NIHZlcnNpb24gdG9vIG9sZFxuIik7CiAJfQogCkBAIC0zNTAsNyArMzU0LDcgQEAKIAogCWlhNjRfbWFya19pZGxlID0gJnNuaWRsZTsKIAotCS8qIAorCS8qCiAJICogRm9yIHRoZSBib290Y3B1LCB3ZSBkbyB0aGlzIGhlcmUuIEFsbCBvdGhlciBjcHVzIHdpbGwgbWFrZSB0aGUKIAkgKiBjYWxsIGFzIHBhcnQgb2YgY3B1X2luaXQgaW4gc2xhdmUgY3B1IGluaXRpYWxpemF0aW9uLgogCSAqLwpAQCAtMzk3LDcgKzQwMSw3IEBACiAJCW5vZGVwZGFpbmRyW2Nub2RlXSA9CiAJCSAgICBhbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKGNub2RlKSwgc2l6ZW9mKG5vZGVwZGFfdCkpOwogCQltZW1zZXQobm9kZXBkYWluZHJbY25vZGVdLCAwLCBzaXplb2Yobm9kZXBkYV90KSk7Ci0JCW1lbXNldChub2RlcGRhaW5kcltjbm9kZV0tPnBoeXNfY3B1aWQsIC0xLCAKKwkJbWVtc2V0KG5vZGVwZGFpbmRyW2Nub2RlXS0+cGh5c19jcHVpZCwgLTEsCiAJCSAgICBzaXplb2Yobm9kZXBkYWluZHJbY25vZGVdLT5waHlzX2NwdWlkKSk7CiAJfQogCkBAIC00MjcsNyArNDMxLDcgQEAKIAl9CiAKIAkvKgotCSAqIEluaXRpYWxpemUgdGhlIHBlciBub2RlIGh1YmRldi4gIFRoaXMgaW5jbHVkZXMgSU8gTm9kZXMgYW5kIAorCSAqIEluaXRpYWxpemUgdGhlIHBlciBub2RlIGh1YmRldi4gIFRoaXMgaW5jbHVkZXMgSU8gTm9kZXMgYW5kCiAJICogaGVhZGxlc3MvbWVtbGVzcyBub2Rlcy4KIAkgKi8KIAlmb3IgKGNub2RlID0gMDsgY25vZGUgPCBudW1pb25vZGVzOyBjbm9kZSsrKSB7CkBAIC00NTUsNiArNDU5LDE0IEBACiAJaW50IGk7CiAJc3RhdGljIGludCB3YXJzX2hhdmVfYmVlbl9jaGVja2VkOwogCisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSA9PSAwICYmIElTX01FRFVTQSgpKSB7CisJCWlmIChpYTY0X3NuX2lzX2Zha2VfcHJvbSgpKQorCQkJc25fcHJvbV90eXBlID0gMjsKKwkJZWxzZQorCQkJc25fcHJvbV90eXBlID0gMTsKKwkJcHJpbnRrKCJSdW5uaW5nIG9uIG1lZHVzYSB3aXRoICVzIFBST01cbiIsIChzbl9wcm9tX3R5cGUgPT0gMSkgPyAicmVhbCIgOiAiZmFrZSIpOworCX0KKwogCW1lbXNldChwZGEsIDAsIHNpemVvZihwZGEpKTsKIAlpZiAoaWE2NF9zbl9nZXRfc25faW5mbygwLCAmc25faHViX2luZm8tPnNodWIyLCAmc25faHViX2luZm8tPm5hc2lkX2JpdG1hc2ssICZzbl9odWJfaW5mby0+bmFzaWRfc2hpZnQsCiAJCQkJJnNuX3N5c3RlbV9zaXplLCAmc25fc2hhcmluZ19kb21haW5fc2l6ZSwgJnNuX3BhcnRpdGlvbl9pZCwKQEAgLTUyMCw3ICs1MzIsNyBAQAogCSAqLwogCXsKIAkJdTY0IHBpbzFbXSA9IHtTSDFfUElPX1dSSVRFX1NUQVRVU18wLCAwLCBTSDFfUElPX1dSSVRFX1NUQVRVU18xLCAwfTsKLQkJdTY0IHBpbzJbXSA9IHtTSDJfUElPX1dSSVRFX1NUQVRVU18wLCBTSDJfUElPX1dSSVRFX1NUQVRVU18xLCAKKwkJdTY0IHBpbzJbXSA9IHtTSDJfUElPX1dSSVRFX1NUQVRVU18wLCBTSDJfUElPX1dSSVRFX1NUQVRVU18xLAogCQkJU0gyX1BJT19XUklURV9TVEFUVVNfMiwgU0gyX1BJT19XUklURV9TVEFUVVNfM307CiAJCXU2NCAqcGlvOwogCQlwaW8gPSBpc19zaHViMSgpID8gcGlvMSA6IHBpbzI7CkBAIC01NTIsNiArNTY0LDEwIEBACiAJaW50IG5hc2lkID0gMDsKIAlsYm9hcmRfdCAqYnJkOwogCisJLyogZmFrZXByb20gZG9lcyBub3Qgc3VwcG9ydCBrbGdyYXBoICovCisJaWYgKElTX1JVTk5JTkdfT05fRkFLRV9QUk9NKCkpCisJCXJldHVybjsKKwogCS8qIFNldHVwIGlvbm9kZXMgd2l0aCBtZW1vcnkgKi8KIAlmb3IgKG5hc2lkID0gMDsgbmFzaWQgPCBNQVhfUEhZU05PREVfSUQ7IG5hc2lkICs9IDIpIHsKIAkJY2hhciAqa2xncmFwaF9oZWFkZXI7CkBAIC01NjMsOCArNTc5LDYgQEAKIAkJY25vZGVpZCA9IC0xOwogCQlrbGdyYXBoX2hlYWRlciA9IF9fdmEoaWE2NF9zbl9nZXRfa2xjb25maWdfYWRkcihuYXNpZCkpOwogCQlpZiAoIWtsZ3JhcGhfaGVhZGVyKSB7Ci0JCQlpZiAoSVNfUlVOTklOR19PTl9TSU1VTEFUT1IoKSkKLQkJCQljb250aW51ZTsKIAkJCUJVRygpOwkvKiBBbGwgbm9kZXMgbXVzdCBoYXZlIGtsY29uZmlnIHRhYmxlcyEgKi8KIAkJfQogCQljbm9kZWlkID0gbmFzaWRfdG9fY25vZGVpZChuYXNpZCk7CkBAIC02MzAsOCArNjQ0LDggQEAKIG5hc2lkX3NsaWNlX3RvX2NwdWlkKGludCBuYXNpZCwgaW50IHNsaWNlKQogewogCWxvbmcgY3B1OwotCQotCWZvciAoY3B1PTA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSAKKworCWZvciAoY3B1PTA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKQogCQlpZiAoY3B1aWRfdG9fbmFzaWQoY3B1KSA9PSBuYXNpZCAmJgogCQkJCQljcHVpZF90b19zbGljZShjcHUpID09IHNsaWNlKQogCQkJcmV0dXJuIGNwdTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3B0Y19kZWFkbG9jay5TIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvcHRjX2RlYWRsb2NrLlMKaW5kZXggNzk0NzMxMi4uOTZjYjcxZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvcHRjX2RlYWRsb2NrLlMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvcHRjX2RlYWRsb2NrLlMKQEAgLTYsNiArNiw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9zaHViX21tci5oPgogCiAjZGVmaW5lIERFQURMT0NLQklUCVNIX1BJT19XUklURV9TVEFUVVNfV1JJVEVfREVBRExPQ0tfU0hGVApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC90aW9jeC5jCmluZGV4IGEwODdiMjcuLjI1NGZlMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvdGlvY3guYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3Rpb2N4LmMKQEAgLTgsMTIgKzgsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CiAjaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CkBAIC0yMDQsOCArMjA0LDggQEAKIAljeF9kZXYtPmRldi5wYXJlbnQgPSBOVUxMOwogCWN4X2Rldi0+ZGV2LmJ1cyA9ICZ0aW9jeF9idXNfdHlwZTsKIAljeF9kZXYtPmRldi5yZWxlYXNlID0gdGlvY3hfYnVzX3JlbGVhc2U7Ci0Jc25wcmludGYoY3hfZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVkLjB4JXgiLAotCQkgY3hfZGV2LT5jeF9pZC5uYXNpZCwgY3hfZGV2LT5jeF9pZC5wYXJ0X251bSk7CisJc25wcmludGYoY3hfZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVkIiwKKwkJIGN4X2Rldi0+Y3hfaWQubmFzaWQpOwogCWRldmljZV9yZWdpc3RlcigmY3hfZGV2LT5kZXYpOwogCWdldF9kZXZpY2UoJmN4X2Rldi0+ZGV2KTsKIApAQCAtMjM2LDcgKzIzNiw2IEBACiAgKi8KIHN0YXRpYyBpbnQgY3hfZGV2aWNlX3JlbG9hZChzdHJ1Y3QgY3hfZGV2ICpjeF9kZXYpCiB7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZjeF9kZXYtPmRldiwgJmRldl9hdHRyX2N4ZGV2X2NvbnRyb2wpOwogCWN4X2RldmljZV91bnJlZ2lzdGVyKGN4X2Rldik7CiAJcmV0dXJuIGN4X2RldmljZV9yZWdpc3RlcihjeF9kZXYtPmN4X2lkLm5hc2lkLCBjeF9kZXYtPmN4X2lkLnBhcnRfbnVtLAogCQkJCSAgY3hfZGV2LT5jeF9pZC5tZmdfbnVtLCBjeF9kZXYtPmh1YmRldik7CkBAIC0zODMsNiArMzgyLDcgQEAKIAlzd2l0Y2ggKHRpb2N4X2J0Y2hhcl9nZXQobmFzaWQpKSB7CiAJY2FzZSBMMV9CUklDS1RZUEVfU0E6CiAJY2FzZSBMMV9CUklDS1RZUEVfQVRIRU5BOgorCWNhc2UgTDFfQlJJQ0tUWVBFX0RBWVRPTkE6CiAJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQwOSw3ICs0MDksNyBAQAogCQl1aW50NjRfdCBjeF9pZDsKIAogCQljeF9pZCA9Ci0JCSAgICAqKHZvbGF0aWxlIGludDMyX3QgKikoVElPX1NXSU5fQkFTRShuYXNpZCwgVElPQ1hfQ09SRUxFVCkgKworCQkgICAgKih2b2xhdGlsZSB1aW50NjRfdCAqKShUSU9fU1dJTl9CQVNFKG5hc2lkLCBUSU9DWF9DT1JFTEVUKSArCiAJCQkJCSAgV0lER0VUX0lEKTsKIAkJcGFydF9udW0gPSBYV0lER0VUX1BBUlRfTlVNKGN4X2lkKTsKIAkJbWZnX251bSA9IFhXSURHRVRfTUZHX05VTShjeF9pZCk7CkBAIC00NTgsNiArNDU4LDEwIEBACiAKIAlzd2l0Y2ggKG4pIHsKIAljYXNlIDE6CisJCXRpb19jb3JlbGV0X3Jlc2V0KGN4X2Rldi0+Y3hfaWQubmFzaWQsIFRJT0NYX0NPUkVMRVQpOworCQl0aW9jeF9yZWxvYWQoY3hfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSAyOgogCQl0aW9jeF9yZWxvYWQoY3hfZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSAzOgpAQCAtNDc3LDYgKzQ4MSw5IEBACiAJY25vZGVpZF90IGNub2RlaWQ7CiAJaW50IGZvdW5kX3Rpb2N4X2RldmljZSA9IDA7CiAKKwlpZiAoIWlhNjRfcGxhdGZvcm1faXMoInNuMiIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCWJ1c19yZWdpc3RlcigmdGlvY3hfYnVzX3R5cGUpOwogCiAJZm9yIChjbm9kZWlkID0gMDsgY25vZGVpZCA8IE1BWF9DT01QQUNUX05PREVTOyBjbm9kZWlkKyspIHsKQEAgLTUzNyw3ICs1NDQsNyBAQAogCWJ1c191bnJlZ2lzdGVyKCZ0aW9jeF9idXNfdHlwZSk7CiB9CiAKLW1vZHVsZV9pbml0KHRpb2N4X2luaXQpOworc3Vic3lzX2luaXRjYWxsKHRpb2N4X2luaXQpOwogbW9kdWxlX2V4aXQodGlvY3hfZXhpdCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmggYi9hcmNoL2lhNjQvc24va2VybmVsL3hwYy5oCmluZGV4IDFhMGFlZDguLmQwZWU2MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjLmgKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGMuaApAQCAtODcsNyArODcsNyBAQAogCXU4IHBhcnRpZDsJCS8qIHBhcnRpdGlvbiBJRCBmcm9tIFNBTCAqLwogCXU4IHZlcnNpb247CiAJdTggcGFkWzZdOwkJLyogcGFkIHRvIHU2NCBhbGlnbiAqLwotCXU2NCB2YXJzX3BhOworCXZvbGF0aWxlIHU2NCB2YXJzX3BhOwogCXU2NCBwYXJ0X25hc2lkc1tYUF9OQVNJRF9NQVNLX1dPUkRTXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAJdTY0IG1hY2hfbmFzaWRzW1hQX05BU0lEX01BU0tfV09SRFNdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIH07CkBAIC0xMzgsNyArMTM4LDcgQEAKICAqIG9jY3VwaWVzIGhhbGYgYSBjYWNoZWxpbmUuCiAgKi8KIHN0cnVjdCB4cGNfdmFyc19wYXJ0IHsKLQl1NjQgbWFnaWM7CisJdm9sYXRpbGUgdTY0IG1hZ2ljOwogCiAJdTY0IG9wZW5jbG9zZV9hcmdzX3BhOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIG9wZW4gYW5kIGNsb3NlIGFyZ3MgKi8KIAl1NjQgR1BzX3BhOwkJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBHZXQvUHV0IHZhbHVlcyAqLwpAQCAtMTg1LDggKzE4NSw4IEBACiAgKiBEZWZpbmUgYSBHZXQvUHV0IHZhbHVlIHBhaXIgKHBvaW50ZXJzKSB1c2VkIHdpdGggYSBtZXNzYWdlIHF1ZXVlLgogICovCiBzdHJ1Y3QgeHBjX2dwIHsKLQlzNjQgZ2V0OwkvKiBHZXQgdmFsdWUgKi8KLQlzNjQgcHV0OwkvKiBQdXQgdmFsdWUgKi8KKwl2b2xhdGlsZSBzNjQgZ2V0OwkvKiBHZXQgdmFsdWUgKi8KKwl2b2xhdGlsZSBzNjQgcHV0OwkvKiBQdXQgdmFsdWUgKi8KIH07CiAKICNkZWZpbmUgWFBDX0dQX1NJWkUgXApAQCAtMjMxLDcgKzIzMSw3IEBACiAgKi8KIHN0cnVjdCB4cGNfbm90aWZ5IHsKIAlzdHJ1Y3Qgc2VtYXBob3JlIHNlbWE7CQkvKiBub3RpZnkgc2VtYXBob3JlICovCi0JdTggdHlwZTsJCQkvKiB0eXBlIG9mIG5vdGlmaWNhdGlvbiAqLworCXZvbGF0aWxlIHU4IHR5cGU7CQkJLyogdHlwZSBvZiBub3RpZmljYXRpb24gKi8KIAogCS8qIHRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBhcmUgb25seSB1c2VkIGlmIHR5cGUgPT0gWFBDX05fQ0FMTCAqLwogCXhwY19ub3RpZnlfZnVuYyBmdW5jOwkJLyogdXNlcidzIG5vdGlmeSBmdW5jdGlvbiAqLwpAQCAtNDM5LDcgKzQzOSw3IEBACiAKIAkvKiBYUEMgaW5mcmFzdHJ1Y3R1cmUgcmVmZXJlbmNpbmcgYW5kIHRlYXJkb3duIGNvbnRyb2wgKi8KIAotCXU4IHNldHVwX3N0YXRlOwkJCS8qIGluZnJhc3RydWN0dXJlIHNldHVwIHN0YXRlICovCisJdm9sYXRpbGUgdTggc2V0dXBfc3RhdGU7CQkJLyogaW5mcmFzdHJ1Y3R1cmUgc2V0dXAgc3RhdGUgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCB0ZWFyZG93bl93cTsJLyoga3RocmVhZCB3YWl0aW5nIHRvIHRlYXJkb3duIGluZnJhICovCiAJYXRvbWljX3QgcmVmZXJlbmNlczsJCS8qICNvZiByZWZlcmVuY2VzIHRvIGluZnJhc3RydWN0dXJlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX2NoYW5uZWwuYwppbmRleCAwYmY2ZmJjLi42ZDAyZGFjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19jaGFubmVsLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfY2hhbm5lbC5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAkgKiBXaXRoIHRoZSBzZXR0aW5nIG9mIHRoZSBwYXJ0aXRpb24gc2V0dXBfc3RhdGUgdG8gWFBDX1BfU0VUVVAsIHdlJ3JlCiAJICogZGVjbGFyaW5nIHRoYXQgdGhpcyBwYXJ0aXRpb24gaXMgcmVhZHkgdG8gZ28uCiAJICovCi0JKHZvbGF0aWxlIHU4KSBwYXJ0LT5zZXR1cF9zdGF0ZSA9IFhQQ19QX1NFVFVQOworCXBhcnQtPnNldHVwX3N0YXRlID0gWFBDX1BfU0VUVVA7CiAKIAogCS8qCkBAIC0yMjcsNyArMjI3LDcgQEAKIAl4cGNfdmFyc19wYXJ0W3BhcnRpZF0uSVBJX3BoeXNfY3B1aWQgPQogCQkJCQljcHVfcGh5c2ljYWxfaWQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAl4cGNfdmFyc19wYXJ0W3BhcnRpZF0ubmNoYW5uZWxzID0gcGFydC0+bmNoYW5uZWxzOwotCSh2b2xhdGlsZSB1NjQpIHhwY192YXJzX3BhcnRbcGFydGlkXS5tYWdpYyA9IFhQQ19WUF9NQUdJQzE7CisJeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLm1hZ2ljID0gWFBDX1ZQX01BR0lDMTsKIAogCXJldHVybiB4cGNTdWNjZXNzOwogfQpAQCAtMzU1LDcgKzM1NSw3IEBACiAKIAkJLyogbGV0IHRoZSBvdGhlciBzaWRlIGtub3cgdGhhdCB3ZSd2ZSBwdWxsZWQgdGhlaXIgdmFyaWFibGVzICovCiAKLQkJKHZvbGF0aWxlIHU2NCkgeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLm1hZ2ljID0gWFBDX1ZQX01BR0lDMjsKKwkJeHBjX3ZhcnNfcGFydFtwYXJ0aWRdLm1hZ2ljID0gWFBDX1ZQX01BR0lDMjsKIAl9CiAKIAlpZiAocHVsbGVkX2VudHJ5LT5tYWdpYyA9PSBYUENfVlBfTUFHSUMxKSB7CkBAIC0xMTgzLDcgKzExODMsNyBAQAogCQkgKi8KIAkJeHBjX2NsZWFyX2xvY2FsX21zZ3F1ZXVlX2ZsYWdzKGNoKTsKIAotCQkodm9sYXRpbGUgczY0KSBjaC0+d19yZW1vdGVfR1AuZ2V0ID0gY2gtPnJlbW90ZV9HUC5nZXQ7CisJCWNoLT53X3JlbW90ZV9HUC5nZXQgPSBjaC0+cmVtb3RlX0dQLmdldDsKIAogCQlkZXZfZGJnKHhwY19jaGFuLCAid19yZW1vdGVfR1AuZ2V0IGNoYW5nZWQgdG8gJWxkLCBwYXJ0aWQ9JWQsICIKIAkJCSJjaGFubmVsPSVkXG4iLCBjaC0+d19yZW1vdGVfR1AuZ2V0LCBjaC0+cGFydGlkLApAQCAtMTIxMSw3ICsxMjExLDcgQEAKIAkJICovCiAJCXhwY19jbGVhcl9yZW1vdGVfbXNncXVldWVfZmxhZ3MoY2gpOwogCi0JCSh2b2xhdGlsZSBzNjQpIGNoLT53X3JlbW90ZV9HUC5wdXQgPSBjaC0+cmVtb3RlX0dQLnB1dDsKKwkJY2gtPndfcmVtb3RlX0dQLnB1dCA9IGNoLT5yZW1vdGVfR1AucHV0OwogCiAJCWRldl9kYmcoeHBjX2NoYW4sICJ3X3JlbW90ZV9HUC5wdXQgY2hhbmdlZCB0byAlbGQsIHBhcnRpZD0lZCwgIgogCQkJImNoYW5uZWw9JWRcbiIsIGNoLT53X3JlbW90ZV9HUC5wdXQsIGNoLT5wYXJ0aWQsCkBAIC0xODc1LDcgKzE4NzUsNyBAQAogCQlub3RpZnkgPSAmY2gtPm5vdGlmeV9xdWV1ZVttc2dfbnVtYmVyICUgY2gtPmxvY2FsX25lbnRyaWVzXTsKIAkJbm90aWZ5LT5mdW5jID0gZnVuYzsKIAkJbm90aWZ5LT5rZXkgPSBrZXk7Ci0JCSh2b2xhdGlsZSB1OCkgbm90aWZ5LT50eXBlID0gbm90aWZ5X3R5cGU7CisJCW5vdGlmeS0+dHlwZSA9IG5vdGlmeV90eXBlOwogCiAJCS8vID4+PiBpcyBhIG1iKCkgbmVlZGVkIGhlcmU/CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX21haW4uYwppbmRleCAxNzdkZGI3Li5kNTgwYWRjIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19tYWluLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfbWFpbi5jCkBAIC01Myw2ICs1Myw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vc24vaW50ci5oPgogI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzA4LDggKzMwOSw3IEBACiAJCQkicGFydGl0aW9uICVkXG4iLCBYUENfUEFSVElEKHBhcnQpKTsKIAogCQkvKiB3YWl0IGEgMS80IG9mIGEgc2Vjb25kIG9yIHNvICovCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCSh2b2lkKSBzY2hlZHVsZV90aW1lb3V0KDAuMjUgKiBIWik7CisJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDI1MCk7CiAKIAkJaWYgKHBhcnQtPmFjdF9zdGF0ZSA9PSBYUENfUF9ERUFDVElWQVRJTkcpIHsKIAkJCXJldHVybiBwYXJ0LT5yZWFzb247CkBAIC04NDEsOSArODQxLDcgQEAKIAlkb3duKCZ4cGNfZGlzY292ZXJ5X2V4aXRlZCk7CiAKIAotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dCgwLjMgKiBIWik7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwltc2xlZXBfaW50ZXJydXB0aWJsZSgzMDApOwogCiAKIAkvKiB3YWl0IGZvciBhbGwgcGFydGl0aW9ucyB0byBiZWNvbWUgaW5hY3RpdmUgKi8KQEAgLTg2MCwxMiArODU4LDggQEAKIAkJCX0KIAkJfQogCi0JCWlmIChhY3RpdmVfcGFydF9jb3VudCkgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCXNjaGVkdWxlX3RpbWVvdXQoMC4zICogSFopOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJfQotCisJCWlmIChhY3RpdmVfcGFydF9jb3VudCkKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDMwMCk7CiAJfSB3aGlsZSAoYWN0aXZlX3BhcnRfY291bnQgPiAwKTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3hwY19wYXJ0aXRpb24uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jCmluZGV4IGNkN2VkNzMuLjU3ODI2NWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jCkBAIC0yNTMsNyArMjUzLDcgQEAKIAkgKiBUaGlzIHNpZ25pZmllcyB0byB0aGUgcmVtb3RlIHBhcnRpdGlvbiB0aGF0IG91ciByZXNlcnZlZAogCSAqIHBhZ2UgaXMgaW5pdGlhbGl6ZWQuCiAJICovCi0JKHZvbGF0aWxlIHU2NCkgcnAtPnZhcnNfcGEgPSBfX3BhKHhwY192YXJzKTsKKwlycC0+dmFyc19wYSA9IF9fcGEoeHBjX3ZhcnMpOwogCiAJcmV0dXJuIHJwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMgYi9hcmNoL2lhNjQvc24vcGNpL3BjaV9kbWEuYwppbmRleCA1ZGE5YmRiLi5hMmY3YTg4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaV9kbWEuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaV9kbWEuYwpAQCAtMTEsOSArMTEsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KIAogI2RlZmluZSBTR19FTlRfVklSVF9BRERSRVNTKHNnKQkocGFnZV9hZGRyZXNzKChzZyktPnBhZ2UpICsgKHNnKS0+b2Zmc2V0KQogI2RlZmluZSBTR19FTlRfUEhZU19BRERSRVNTKFNHKQl2aXJ0X3RvX3BoeXMoU0dfRU5UX1ZJUlRfQUREUkVTUyhTRykpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2F0ZS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9hdGUuYwppbmRleCAwZTQ3YmNlOC4uZDE2NDdiOCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9hdGUuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2F0ZS5jCkBAIC04LDkgKzgsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgotI2luY2x1ZGUgInBjaS9wY2licl9wcm92aWRlci5oIgogCiBpbnQgcGNpYnJfaW52YWxpZGF0ZV9hdGUgPSAwOwkvKiBieSBkZWZhdWx0IGRvbid0IGludmFsaWRhdGUgQVRFIG9uIGZyZWUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKaW5kZXggNjRhZjJiMi4uYjA1OGRjMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCkBAIC04LDE4ICs4LDE3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KICNpbmNsdWRlIDxhc20vc24vZ2VvLmg+Ci0jaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgotI2luY2x1ZGUgInh0YWxrL2h1YmRldi5oIgorI2luY2x1ZGUgPGFzbS9zbi9wY2licl9wcm92aWRlci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KLSNpbmNsdWRlICJwY2kvdGlvY3AuaCIKLSNpbmNsdWRlICJwY2kvcGljLmgiCi0jaW5jbHVkZSAicGNpL3BjaWJyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAicGNpL3Rpb2NwLmgiCisjaW5jbHVkZSA8YXNtL3NuL3BpYy5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vdGlvY3AuaD4KICNpbmNsdWRlICJ0aW8uaCIKLSNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlICJ4dGFsay94d2lkZ2V0ZGV2LmgiCisjaW5jbHVkZSAieHRhbGsvaHViZGV2LmgiCiAKIGV4dGVybiBpbnQgc25faW9pZl9pbml0ZWQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcHJvdmlkZXIuYwppbmRleCAzODkzOTk5Li45ODEzZGE1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9wcm92aWRlci5jCkBAIC02LDE4ICs2LDUxIEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+Ci0jaW5jbHVkZSAieHRhbGsveHdpZGdldGRldi5oIgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgogI2luY2x1ZGUgPGFzbS9zbi9nZW8uaD4KLSNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSAicGNpL3BjaWJyX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSA8YXNtL3NuL2FkZHJzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX3NhbC5oPgorI2luY2x1ZGUgInh0YWxrL3h3aWRnZXRkZXYuaCIKKyNpbmNsdWRlICJ4dGFsay9odWJkZXYuaCIKIAoraW50CitzYWxfcGNpYnJfc2xvdF9lbmFibGUoc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0LCBpbnQgZGV2aWNlLCB2b2lkICpyZXNwKQoreworCXN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgcmV0X3N0dWZmOworCXVpbnQ2NF90IGJ1c251bTsKKworCXJldF9zdHVmZi5zdGF0dXMgPSAwOworCXJldF9zdHVmZi52MCA9IDA7CisKKwlidXNudW0gPSBzb2Z0LT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtOworCVNBTF9DQUxMX05PTE9DSyhyZXRfc3R1ZmYsICh1NjQpIFNOX1NBTF9JT0lGX1NMT1RfRU5BQkxFLCAodTY0KSBidXNudW0sCisJCQkodTY0KSBkZXZpY2UsICh1NjQpIHJlc3AsIDAsIDAsIDAsIDApOworCisJcmV0dXJuIChpbnQpcmV0X3N0dWZmLnYwOworfQorCitpbnQKK3NhbF9wY2licl9zbG90X2Rpc2FibGUoc3RydWN0IHBjaWJ1c19pbmZvICpzb2Z0LCBpbnQgZGV2aWNlLCBpbnQgYWN0aW9uLAorCQkgICAgICAgdm9pZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJldF9zdHVmZjsKKwl1aW50NjRfdCBidXNudW07CisKKwlyZXRfc3R1ZmYuc3RhdHVzID0gMDsKKwlyZXRfc3R1ZmYudjAgPSAwOworCisJYnVzbnVtID0gc29mdC0+cGJpX2J1c2NvbW1vbi5ic19wZXJzaXN0X2J1c251bTsKKwlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCAodTY0KSBTTl9TQUxfSU9JRl9TTE9UX0RJU0FCTEUsCisJCQkodTY0KSBidXNudW0sICh1NjQpIGRldmljZSwgKHU2NCkgYWN0aW9uLAorCQkJKHU2NCkgcmVzcCwgMCwgMCwgMCk7CisKKwlyZXR1cm4gKGludClyZXRfc3R1ZmYudjA7Cit9CiAKIHN0YXRpYyBpbnQgc2FsX3BjaWJyX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQpCiB7CkBAIC0xODgsMyArMjIxLDYgQEAKIAogCXJldHVybiAwOwogfQorCitFWFBPUlRfU1lNQk9MX0dQTChzYWxfcGNpYnJfc2xvdF9lbmFibGUpOworRVhQT1JUX1NZTUJPTF9HUEwoc2FsX3BjaWJyX3Nsb3RfZGlzYWJsZSk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3JlZy5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9yZWcuYwppbmRleCA4NjVjMTFjLi4yMTQyNmQwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX3JlZy5jCisrKyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfcmVnLmMKQEAgLTYsMTMgKzYsMTMgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KICNpbmNsdWRlIDxhc20vc24vcGNpZGV2Lmg+Ci0jaW5jbHVkZSAicGNpL3Rpb2NwLmgiCi0jaW5jbHVkZSAicGNpL3BpYy5oIgotI2luY2x1ZGUgInBjaS9wY2licl9wcm92aWRlci5oIgorI2luY2x1ZGUgPGFzbS9zbi9waWMuaD4KKyNpbmNsdWRlIDxhc20vc24vdGlvY3AuaD4KIAogdW5pb24gYnJfcHRyIHsKIAlzdHJ1Y3QgdGlvY3AgdGlvOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCmluZGV4IDhkYWU5ZWIuLjUxY2M0ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCWlmICghY3RfYWRkcikKIAkJcmV0dXJuIDA7CiAKLQlidXNfYWRkciA9IChkbWFfYWRkcl90KSAoY3RfYWRkciAmIDB4ZmZmZmZmZmZmZmZmKTsKKwlidXNfYWRkciA9IChkbWFfYWRkcl90KSAoY3RfYWRkciAmIDB4ZmZmZmZmZmZmZmZmVUwpOwogCW5vZGVfdXBwZXIgPSBjdF9hZGRyID4+IDQ4OwogCiAJaWYgKG5vZGVfdXBwZXIgPiA2NCkgewpAQCAtNDY0LDcgKzQ2NCw3IEBACiAgKiBGb3IgbWFwcGluZ3MgY3JlYXRlZCB1c2luZyB0aGUgZGlyZWN0IG1vZGVzICg2NCBvciA0OCkgdGhlcmUgYXJlIG5vCiAgKiByZXNvdXJjZXMgdG8gcmVsZWFzZS4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIHRpb2NhX2RtYV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgZG1hX2FkZHJfdCBidXNfYWRkciwgaW50IGRpcikKIHsKIAlpbnQgaSwgZW50cnk7CkBAIC01MTQsNyArNTE0LDcgQEAKICAqIFRoZSBtYXBwaW5nIG1vZGUgdXNlZCBpcyBiYXNlZCBvbiB0aGUgZGV2aWNlcyBkbWFfbWFzay4gIEFzIGEgbGFzdCByZXNvcnQKICAqIHVzZSB0aGUgR0FSVCBtYXBwZWQgbW9kZS4KICAqLwotdWludDY0X3QKK3N0YXRpYyB1aW50NjRfdAogdGlvY2FfZG1hX21hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludDY0X3QgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50KQogewogCXVpbnQ2NF90IG1hcGFkZHI7CkBAIC01ODAsNyArNTgwLDcgQEAKICAqIE9uIHN1Y2Nlc3NmdWwgc2V0dXAsIHJldHVybnMgdGhlIGtlcm5lbCB2ZXJzaW9uIG9mIHRpb2NhX2NvbW1vbiBiYWNrIHRvCiAgKiB0aGUgY2FsbGVyLgogICovCi12b2lkICoKK3N0YXRpYyB2b2lkICoKIHRpb2NhX2J1c19maXh1cChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKnByb21fYnVzc29mdCkKIHsKIAlzdHJ1Y3QgdGlvY2FfY29tbW9uICp0aW9jYV9jb21tb247CkBAIC01ODksOCArNTg5LDcgQEAKIAogCS8qIHNhbml0eSBjaGVjayBwcm9tIHJldiAqLwogCi0JaWYgKHNuX3NhbF9yZXZfbWFqb3IoKSA8IDQgfHwKLQkgICAgKHNuX3NhbF9yZXZfbWFqb3IoKSA9PSA0ICYmIHNuX3NhbF9yZXZfbWlub3IoKSA8IDYpKSB7CisJaWYgKHNuX3NhbF9yZXYoKSA8IDB4MDQwNikgewogCQlwcmludGsKIAkJICAgIChLRVJOX0VSUiAiJXM6ICBTR0kgcHJvbSByZXYgNC4wNiBvciBncmVhdGVyIHJlcXVpcmVkICIKIAkJICAgICAiZm9yIHRpb2NhIHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvS2NvbmZpZyBiL2FyY2gvbTMyci9LY29uZmlnCmluZGV4IDQyY2E4YTMuLjc3NzI5NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9LY29uZmlnCisrKyBiL2FyY2gvbTMyci9LY29uZmlnCkBAIC0zNTksNiArMzU5LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tMzI3MDB1dC5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tMzI3MDB1dC5jCmluZGV4IGIwMTRlMmMuLmExNDZiMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbTMyNzAwdXQuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX20zMjcwMHV0LmMKQEAgLTMsOCArMyw4IEBACiAgKgogICogIFNldHVwIHJvdXRpbmVzIGZvciBSZW5lc2FzIE0zMjcwMFVUIEJvYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAwMiAJSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIFRha2VvIFRha2FoYXNoaQorICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA1ICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBUYWtlbyBUYWthaGFzaGkKICAqCiAgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAogICogIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJaWN1X2RhdGFbTTMyUl9JUlFfSU5UMl0uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTnxNMzJSX0lDVUNSX0lTTU9EMDE7CiAJZW5hYmxlX20zMjcwMHV0X2lycShNMzJSX0lSUV9JTlQyKTsKIAotLy8jaWYgZGVmaW5lZChDT05GSUdfVklERU9fTTMyUl9BUikKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT19NMzJSX0FSKQogCS8qCiAJICogSU5UMyMgaXMgdXNlZCBmb3IgQVIKIAkgKi8KQEAgLTQ0NSw5ICs0NDUsMTEgQEAKIAlpcnFfZGVzY1tNMzJSX0lSUV9JTlQzXS5kZXB0aCA9IDE7CiAJaWN1X2RhdGFbTTMyUl9JUlFfSU5UM10uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTnxNMzJSX0lDVUNSX0lTTU9EMTA7CiAJZGlzYWJsZV9tMzI3MDB1dF9pcnEoTTMyUl9JUlFfSU5UMyk7Ci0vLyNlbmRpZgkvKiBDT05GSUdfVklERU9fTTMyUl9BUiAqLworI2VuZGlmCS8qIENPTkZJR19WSURFT19NMzJSX0FSICovCiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCisKICNkZWZpbmUgTEFOX0lPU1RBUlQgICAgIDB4MzAwCiAjZGVmaW5lIExBTl9JT0VORCAgICAgICAweDMyMAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfcmVzb3VyY2VzW10gPSB7CkBAIC00NjksMTAgKzQ3MSw1NSBAQAogCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc21jOTF4X3Jlc291cmNlcyksCiAJLnJlc291cmNlICAgICAgID0gc21jOTF4X3Jlc291cmNlcywKIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCisjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgorI2luY2x1ZGUgPGFzbS9zMWQxMzgwNi5oPgorCitzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcGRhdGEgczFkMTN4eHhmYl9kYXRhID0geworCS5pbml0cmVncwkJPSBzMWQxM3h4eGZiX2luaXRyZWdzLAorCS5pbml0cmVnc3NpemUJCT0gQVJSQVlfU0laRShzMWQxM3h4eGZiX2luaXRyZWdzKSwKKwkucGxhdGZvcm1faW5pdF92aWRlbwk9IE5VTEwsCisjaWZkZWYgQ09ORklHX1BNCisJLnBsYXRmb3JtX3N1c3BlbmRfdmlkZW8JPSBOVUxMLAorCS5wbGF0Zm9ybV9yZXN1bWVfdmlkZW8JPSBOVUxMLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMxZDEzeHh4ZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgxMDYwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDczRkZGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAweDEwNDAwMDAwVUwsCisJCS5lbmQgICAgPSAweDEwNDAwMUZGVUwsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzMWQxM3h4eGZiX2RldmljZSA9IHsKKwkubmFtZQkJPSBTMURfREVWSUNFTkFNRSwKKwkuaWQJCT0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZzMWQxM3h4eGZiX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHMxZDEzeHh4ZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzMWQxM3h4eGZiX3Jlc291cmNlcywKK307CisjZW5kaWYKIAogc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1faW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUzFEMTNYWFgpCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzMWQxM3h4eGZiX2RldmljZSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwocGxhdGZvcm1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpLmMKaW5kZXggYWFmOGU1Ni4uNGU3MDk4MCAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaS5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkuYwpAQCAtMywxNCArMywxNSBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgUmVuZXNhcyBNQVBQSSBCb2FyZAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8KICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9tMzJyLmg+CkBAIC0xNTgsMyArMTU5LDQ5IEBACiAJZGlzYWJsZV9tYXBwaV9pcnEoTTMyUl9JUlFfSU5UMik7CiAjZW5kaWYgLyogQ09ORklHX00zMlJQQ0MgKi8KIH0KKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCisjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgorI2luY2x1ZGUgPGFzbS9zMWQxMzgwNi5oPgorCitzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcGRhdGEgczFkMTN4eHhmYl9kYXRhID0geworCS5pbml0cmVncwkJPSBzMWQxM3h4eGZiX2luaXRyZWdzLAorCS5pbml0cmVnc3NpemUJCT0gQVJSQVlfU0laRShzMWQxM3h4eGZiX2luaXRyZWdzKSwKKwkucGxhdGZvcm1faW5pdF92aWRlbwk9IE5VTEwsCisjaWZkZWYgQ09ORklHX1BNCisJLnBsYXRmb3JtX3N1c3BlbmRfdmlkZW8JPSBOVUxMLAorCS5wbGF0Zm9ybV9yZXN1bWVfdmlkZW8JPSBOVUxMLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMxZDEzeHh4ZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgxMDIwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxMDMzRkZGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAweDEwMDAwMDAwVUwsCisJCS5lbmQgICAgPSAweDEwMDAwMUZGVUwsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzMWQxM3h4eGZiX2RldmljZSA9IHsKKwkubmFtZQkJPSBTMURfREVWSUNFTkFNRSwKKwkuaWQJCT0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZzMWQxM3h4eGZiX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHMxZDEzeHh4ZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzMWQxM3h4eGZiX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnMxZDEzeHh4ZmJfZGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwocGxhdGZvcm1faW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkyLmMgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMi5jCmluZGV4IDM4ZDVlOWEuLmExZDgwMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkyLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTIuYwpAQCAtMyw4ICszLDggQEAKICAqCiAgKiAgU2V0dXAgcm91dGluZXMgZm9yIFJlbmVzYXMgTUFQUEktSUkoTTNBLVpBMzYpIEJvYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIE1hbW9ydSBTYWt1Z2F3YQorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1ICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBNYW1vcnUgU2FrdWdhd2EKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9tYXBwaTMuYwppbmRleCAzZDYwYTg1Li5hNzY0MTJlIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NldHVwX21hcHBpMy5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfbWFwcGkzLmMKQEAgLTMsOCArMyw4IEBACiAgKgogICogIFNldHVwIHJvdXRpbmVzIGZvciBSZW5lc2FzIE1BUFBJLUlJSShNM0EtMjE3MCkgQm9hcmQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgICBIaXJveXVraSBLb25kbywgSGlyb2thenUgVGFrYXRhLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgTWFtb3J1IFNha3VnYXdhCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIE1hbW9ydSBTYWt1Z2F3YQogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTE3OCw2ICsxNzgsOCBAQAogI2VuZGlmIC8qIENPTkZJR19NMzJSX0NGQyAqLwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKQorCiAjZGVmaW5lIExBTl9JT1NUQVJUICAgICAweDMwMAogI2RlZmluZSBMQU5fSU9FTkQgICAgICAgMHgzMjAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewpAQCAtMjAwLDkgKzIwMiw1NSBAQAogCS5yZXNvdXJjZSAgICAgICA9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OwogCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0ZCX1MxRDEzWFhYKQorCisjaW5jbHVkZSA8dmlkZW8vczFkMTN4eHhmYi5oPgorI2luY2x1ZGUgPGFzbS9zMWQxMzgwNi5oPgorCitzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcGRhdGEgczFkMTN4eHhmYl9kYXRhID0geworCS5pbml0cmVncwkJPSBzMWQxM3h4eGZiX2luaXRyZWdzLAorCS5pbml0cmVnc3NpemUJCT0gQVJSQVlfU0laRShzMWQxM3h4eGZiX2luaXRyZWdzKSwKKwkucGxhdGZvcm1faW5pdF92aWRlbwk9IE5VTEwsCisjaWZkZWYgQ09ORklHX1BNCisJLnBsYXRmb3JtX3N1c3BlbmRfdmlkZW8JPSBOVUxMLAorCS5wbGF0Zm9ybV9yZXN1bWVfdmlkZW8JPSBOVUxMLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHMxZDEzeHh4ZmJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gMHgxZDYwMDAwMFVMLAorCQkuZW5kICAgID0gMHgxZDczRkZGRlVMLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSAweDFkNDAwMDAwVUwsCisJCS5lbmQgICAgPSAweDFkNDAwMUZGVUwsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzMWQxM3h4eGZiX2RldmljZSA9IHsKKwkubmFtZQkJPSBTMURfREVWSUNFTkFNRSwKKwkuaWQJCT0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZzMWQxM3h4eGZiX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKHMxZDEzeHh4ZmJfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBzMWQxM3h4eGZiX3Jlc291cmNlcywKK307CisjZW5kaWYKKwogc3RhdGljIGludCBfX2luaXQgcGxhdGZvcm1faW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNtYzkxeF9kZXZpY2UpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUzFEMTNYWFgpCisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzMWQxM3h4eGZiX2RldmljZSk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGFyY2hfaW5pdGNhbGwocGxhdGZvcm1faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NldHVwX29ha3MzMnIuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb2FrczMyci5jCmluZGV4IGQ2NTY2NDAuLjQ1YWRkNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb2FrczMyci5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb2FrczMyci5jCkBAIC0zLDggKzMsOCBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgT0FLUzMyUiBCb2FyZAogICoKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCAgIEhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRvc2hpIFlhbWFtb3RvLCBNYW1vcnUgU2FrdWdhd2EKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNSAgSGlyb3l1a2kgS29uZG8sIEhpcm9rYXp1IFRha2F0YSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSGl0b3NoaSBZYW1hbW90bywgTWFtb3J1IFNha3VnYXdhCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgpAQCAtMTM5LDUgKzEzOSw0IEBACiAJaWN1X2RhdGFbTTMyUl9JUlFfU0lPMV9TXS5pY3VjciA9IDA7CiAJZGlzYWJsZV9vYWtzMzJyX2lycShNMzJSX0lSUV9TSU8xX1MpOwogI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfTTMyUl9TSU8gKi8KLQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vcHNwdXQuYyBiL2FyY2gvbTMyci9rZXJuZWwvc2V0dXBfb3BzcHV0LmMKaW5kZXggODZmNGNmMi4uZjAzMDFmNSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL2tlcm5lbC9zZXR1cF9vcHNwdXQuYworKysgYi9hcmNoL20zMnIva2VybmVsL3NldHVwX29wc3B1dC5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqICBTZXR1cCByb3V0aW5lcyBmb3IgUmVuZXNhcyBPUFNQVVQgQm9hcmQKICAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNQogICogCUhpcm95dWtpIEtvbmRvLCBIaXJva2F6dSBUYWthdGEsCiAgKiAgICAgIEhpdG9zaGkgWWFtYW1vdG8sIFRha2VvIFRha2FoYXNoaSwgTWFtb3J1IFNha3VnYXdhCiAgKgpAQCAtNDM5LDcgKzQzOSw3IEBACiAJaWN1X2RhdGFbTTMyUl9JUlFfSU5UMl0uaWN1Y3IgPSBNMzJSX0lDVUNSX0lFTnxNMzJSX0lDVUNSX0lTTU9EMDE7CiAJZW5hYmxlX29wc3B1dF9pcnEoTTMyUl9JUlFfSU5UMik7CiAKLS8vI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX00zMlJfQVIpCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9fTTMyUl9BUikKIAkvKgogCSAqIElOVDMjIGlzIHVzZWQgZm9yIEFSCiAJICovCkBAIC00NDksOSArNDQ5LDExIEBACiAJaXJxX2Rlc2NbTTMyUl9JUlFfSU5UM10uZGVwdGggPSAxOwogCWljdV9kYXRhW00zMlJfSVJRX0lOVDNdLmljdWNyID0gTTMyUl9JQ1VDUl9JRU58TTMyUl9JQ1VDUl9JU01PRDEwOwogCWRpc2FibGVfb3BzcHV0X2lycShNMzJSX0lSUV9JTlQzKTsKLS8vI2VuZGlmCS8qIENPTkZJR19WSURFT19NMzJSX0FSICovCisjZW5kaWYgLyogQ09ORklHX1ZJREVPX00zMlJfQVIgKi8KIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKKwogI2RlZmluZSBMQU5fSU9TVEFSVCAgICAgMHgzMDAKICNkZWZpbmUgTEFOX0lPRU5EICAgICAgIDB4MzIwCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTQ3MywxMCArNDc1LDU1IEBACiAJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShzbWM5MXhfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UgICAgICAgPSBzbWM5MXhfcmVzb3VyY2VzLAogfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfRkJfUzFEMTNYWFgpCisKKyNpbmNsdWRlIDx2aWRlby9zMWQxM3h4eGZiLmg+CisjaW5jbHVkZSA8YXNtL3MxZDEzODA2Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgczFkMTN4eHhmYl9wZGF0YSBzMWQxM3h4eGZiX2RhdGEgPSB7CisJLmluaXRyZWdzCQk9IHMxZDEzeHh4ZmJfaW5pdHJlZ3MsCisJLmluaXRyZWdzc2l6ZQkJPSBBUlJBWV9TSVpFKHMxZDEzeHh4ZmJfaW5pdHJlZ3MpLAorCS5wbGF0Zm9ybV9pbml0X3ZpZGVvCT0gTlVMTCwKKyNpZmRlZiBDT05GSUdfUE0KKwkucGxhdGZvcm1fc3VzcGVuZF92aWRlbwk9IE5VTEwsCisJLnBsYXRmb3JtX3Jlc3VtZV92aWRlbwk9IE5VTEwsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgczFkMTN4eHhmYl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCAgPSAweDEwNjAwMDAwVUwsCisJCS5lbmQgICAgPSAweDEwNzNGRkZGVUwsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IDB4MTA0MDAwMDBVTCwKKwkJLmVuZCAgICA9IDB4MTA0MDAxRkZVTCwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHMxZDEzeHh4ZmJfZGV2aWNlID0geworCS5uYW1lCQk9IFMxRF9ERVZJQ0VOQU1FLAorCS5pZAkJPSAwLAorCS5kZXYgICAgICAgICAgICA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJnMxZDEzeHh4ZmJfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoczFkMTN4eHhmYl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IHMxZDEzeHh4ZmJfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgogCiBzdGF0aWMgaW50IF9faW5pdCBwbGF0Zm9ybV9pbml0KHZvaWQpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKQogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTF4X2RldmljZSk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9TMUQxM1hYWCkKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnMxZDEzeHh4ZmJfZGV2aWNlKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbChwbGF0Zm9ybV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL20zMnIva2VybmVsL3NpZ25hbC5jCmluZGV4IDUwMzExZWIuLjVhZWY3ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9zaWduYWwuYwpAQCAtMzcxLDEwICszNzEsOCBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlyZXR1cm4gMTsKIAotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkgewotCQlyZWZyaWdlcmF0b3IoMCk7CisJaWYgKHRyeV90b19mcmVlemUoKSkgCiAJCWdvdG8gbm9fc2lnbmFsOwotCX0KIAogCWlmICghb2xkc2V0KQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggNjkxYTI0Ni4uMTc4YzRhMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTQ1MCw2ICs0NTAsOCBAQAogCiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBtZW51ICJDaGFyYWN0ZXIgZGV2aWNlcyIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4a25vbW11L0tjb25maWcgYi9hcmNoL202OGtub21tdS9LY29uZmlnCmluZGV4IGRiZmNkYzguLjExN2YxODMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4a25vbW11L0tjb25maWcKKysrIGIvYXJjaC9tNjhrbm9tbXUvS2NvbmZpZwpAQCAtNTc1LDYgKzU3NSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnIGIvYXJjaC9taXBzL0tjb25maWcKaW5kZXggOTRmNWE4ZS4uYjU3ODIzOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcKQEAgLTE0MTYsNiArMTQxNiwxMiBAQAogCWJvb2wgIkhpZ2ggTWVtb3J5IFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNSVBTMzIgJiYgKENQVV9SMzAwMCB8fCBDUFVfU0IxIHx8IENQVV9SNzAwMCB8fCBDUFVfUk05MDAwIHx8IENQVV9SMTAwMDApICYmICEoTUFDSF9ERUNTVEFUSU9OIHx8IE1PTUVOQ09fSkFHVUFSX0FUWCkKIAorY29uZmlnIEFSQ0hfRkxBVE1FTV9FTkFCTEUKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiAhTlVNQQorCitzb3VyY2UgIm1tL0tjb25maWciCisKIGNvbmZpZyBTTVAKIAlib29sICJNdWx0aS1Qcm9jZXNzaW5nIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBDUFVfUk05MDAwIHx8IChTSUJZVEVfU0IxMjUwICYmICFTSUJZVEVfU1RBTkRBTE9ORSkgfHwgU0dJX0lQMjcKQEAgLTE2MzQsNiArMTY0MCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwppbmRleCA2MDE4Y2EyLi4zYTI0MGUzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogCiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgpAQCAtMzU2LDYgKzM1Nyw4IEBACiAJfQogI2VuZGlmCiAKKwltZW1vcnlfcHJlc2VudCgwLCBmaXJzdF91c2FibGVfcGZuLCBtYXhfbG93X3Bmbik7CisKIAkvKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yIHdpdGggbG93IG1lbW9yeSBvbmx5LiAgKi8KIAlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0oZmlyc3RfdXNhYmxlX3BmbiwgbWF4X2xvd19wZm4pOwogCkBAIC01NTcsNiArNTYwLDcgQEAKIAogCXBhcnNlX2NtZGxpbmVfZWFybHkoKTsKIAlib290bWVtX2luaXQoKTsKKwlzcGFyc2VfaW5pdCgpOwogCXBhZ2luZ19pbml0KCk7CiAJcmVzb3VyY2VfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMKaW5kZXggNTA4MDI2YS4uNjVlZTE1MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jCkBAIC00NTcsNyArNDU3LDcgQEAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIDE7CiAKLQlpZiAodHJ5X3RvX2ZyZWV6ZSgwKSkKKwlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQlnb3RvIG5vX3NpZ25hbDsKIAogCWlmICghb2xkc2V0KQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2luaXQuYyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKaW5kZXggNzM4NDNjNS4uOWM5YTI3MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2luaXQuYworKysgYi9hcmNoL21pcHMvbW0vaW5pdC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfTUlQUzY0ICovCiAjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KIAotI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisjaWZuZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCiBleHRlcm4gdm9pZCBwYWdldGFibGVfaW5pdCh2b2lkKTsKIAogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKQEAgLTI1Myw3ICsyNTMsNyBAQAogCSAgICAgICBpbml0c2l6ZSA+PiAxMCwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpICh0b3RhbGhpZ2hfcGFnZXMgPDwgKFBBR0VfU0hJRlQtMTApKSk7CiB9Ci0jZW5kaWYgLyogIUNPTkZJR19ESVNDT05USUdNRU0gKi8KKyNlbmRpZiAvKiAhQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMgKi8KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogdm9pZCBmcmVlX2luaXRyZF9tZW0odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vcGd0YWJsZS5jIGIvYXJjaC9taXBzL21tL3BndGFibGUuYwppbmRleCAzYjg4ZmRlLi4zZmU5NDIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvbWlwcy9tbS9wZ3RhYmxlLmMKQEAgLTUsNyArNSw3IEBACiAKIHZvaWQgc2hvd19tZW0odm9pZCkKIHsKLSNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTSAgLyogWFhYKGhjaCk6IGxhdGVyLi4gKi8KKyNpZm5kZWYgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMgIC8qIFhYWChoY2gpOiBsYXRlci4uICovCiAJaW50IHBmbiwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDA7CiAJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDA7CiAJaW50IGhpZ2htZW0gPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvS2NvbmZpZyBiL2FyY2gvcGFyaXNjL0tjb25maWcKaW5kZXggY2UzMjdjNy4uMWMyZDg3NCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvS2NvbmZpZworKysgYi9hcmNoL3BhcmlzYy9LY29uZmlnCkBAIC0xOTAsNiArMTkwLDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy83MTJfZGVmY29uZmlnIGIvYXJjaC9wYXJpc2MvY29uZmlncy83MTJfZGVmY29uZmlnCmluZGV4IDg3MjA4NWQuLjZlZmFhOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvNzEyX2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzLzcxMl9kZWZjb25maWcKQEAgLTUwNiw3ICs1MDYsNyBAQAogIwogQ09ORklHX1NFUklBTF84MjUwPXkKIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz04CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MTcKIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYTUwMF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2E1MDBfZGVmY29uZmlnCmluZGV4IGQyOGViZmEuLjMwZmMwM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYTUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvY29uZmlncy9hNTAwX2RlZmNvbmZpZwpAQCAtNjYyLDcgKzY2Miw3IEBACiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQogQ09ORklHX1NFUklBTF84MjUwX0NTPW0KLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz04CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MTcKIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CiBDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CiBDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYjE4MF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2IxODBfZGVmY29uZmlnCmluZGV4IDE3MDBkN2EuLjQ2Yzk1MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYjE4MF9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvY29uZmlncy9iMTgwX2RlZmNvbmZpZwpAQCAtNTE0LDcgKzUxNCw3IEBACiAjCiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xMwogQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvY29uZmlncy9jMzAwMF9kZWZjb25maWcgYi9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZwppbmRleCBiMjc5ODAxLi42N2FjYTZjIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzL2MzMDAwX2RlZmNvbmZpZwpAQCAtNjYxLDcgKzY2MSw3IEBACiAjCiBDT05GSUdfU0VSSUFMXzgyNTA9eQogQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xMwogQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKIENPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvZGVmY29uZmlnIGIvYXJjaC9wYXJpc2MvZGVmY29uZmlnCmluZGV4IGViZDYzMDEuLmZkYWUyMWM1IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9kZWZjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvZGVmY29uZmlnCkBAIC01MTcsNyArNTE3LDcgQEAKICMKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTEzCiBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQogQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQogQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CmRpZmYgLS1naXQgYS9hcmNoL3BwYy84eHhfaW8vZW5ldC5jIGIvYXJjaC9wcGMvOHh4X2lvL2VuZXQuYwppbmRleCA0ZWE3MTU4Li5lY2U2YTlmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy84eHhfaW8vZW5ldC5jCisrKyBiL2FyY2gvcHBjLzh4eF9pby9lbmV0LmMKQEAgLTcxNCwxNyArNzE0LDI1IEBACiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNkYXQgJj0gflBDX0VORVRfTEJLOwkvKiBEaXNhYmxlIExvb3BiYWNrICovCiAjZW5kaWYJLyogUENfRU5FVF9MQksgKi8KIAorI2lmZGVmIFBFX0VORVRfVENMSworCS8qIENvbmZpZ3VyZSBwb3J0IEUgZm9yIFRDTEsgYW5kIFJDTEsuCisJKi8KKwljcC0+Y3BfcGVwYXIgfD0gIChQRV9FTkVUX1RDTEsgfCBQRV9FTkVUX1JDTEspOworCWNwLT5jcF9wZWRpciAmPSB+KFBFX0VORVRfVENMSyB8IFBFX0VORVRfUkNMSyk7CisJY3AtPmNwX3Blc28gICY9IH4oUEVfRU5FVF9UQ0xLIHwgUEVfRU5FVF9SQ0xLKTsKKyNlbHNlCisJLyogQ29uZmlndXJlIHBvcnQgQSBmb3IgVENMSyBhbmQgUkNMSy4KKwkqLworCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9ICAoUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKKwlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+KFBBX0VORVRfVENMSyB8IFBBX0VORVRfUkNMSyk7CisjZW5kaWYKKwogCS8qIENvbmZpZ3VyZSBwb3J0IEMgcGlucyB0byBlbmFibGUgQ0xTTiBhbmQgUkVOQS4KIAkqLwogCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BjcGFyICY9IH4oUENfRU5FVF9DTFNOIHwgUENfRU5FVF9SRU5BKTsKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciAmPSB+KFBDX0VORVRfQ0xTTiB8IFBDX0VORVRfUkVOQSk7CiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNzbyAgfD0gIChQQ19FTkVUX0NMU04gfCBQQ19FTkVUX1JFTkEpOwogCi0JLyogQ29uZmlndXJlIHBvcnQgQSBmb3IgVENMSyBhbmQgUkNMSy4KLQkqLwotCWltbWFwLT5pbV9pb3BvcnQuaW9wX3BhcGFyIHw9ICAoUEFfRU5FVF9UQ0xLIHwgUEFfRU5FVF9SQ0xLKTsKLQlpbW1hcC0+aW1faW9wb3J0LmlvcF9wYWRpciAmPSB+KFBBX0VORVRfVENMSyB8IFBBX0VORVRfUkNMSyk7Ci0KIAkvKiBDb25maWd1cmUgU2VyaWFsIEludGVyZmFjZSBjbG9jayByb3V0aW5nLgogCSAqIEZpcnN0LCBjbGVhciBhbGwgU0NDIGJpdHMgdG8gemVybywgdGhlbiBzZXQgdGhlIG9uZXMgd2Ugd2FudC4KIAkgKi8KQEAgLTg5NiwxNCArOTA0LDE4IEBACiAJLyogSXQgaXMgbm93IE9LIHRvIGVuYWJsZSB0aGUgRXRoZXJuZXQgdHJhbnNtaXR0ZXIuCiAJICogVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGJvYXJkIGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGhlcmUuCiAJICovCi0jaWYgICAoIWRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIGRlZmluZWQgKFBDX0VORVRfVEVOQSkpCisjaWYgICAoIWRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIGRlZmluZWQgKFBDX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBFX0VORVRfVEVOQSkpCiAJaW1tYXAtPmltX2lvcG9ydC5pb3BfcGNwYXIgfD0gIFBDX0VORVRfVEVOQTsKIAlpbW1hcC0+aW1faW9wb3J0LmlvcF9wY2RpciAmPSB+UENfRU5FVF9URU5BOwotI2VsaWYgKCBkZWZpbmVkIChQQl9FTkVUX1RFTkEpICYmICFkZWZpbmVkIChQQ19FTkVUX1RFTkEpKQorI2VsaWYgKCBkZWZpbmVkIChQQl9FTkVUX1RFTkEpICYmICFkZWZpbmVkIChQQ19FTkVUX1RFTkEpICYmICFkZWZpbmVkIChQRV9FTkVUX1RFTkEpKQogCWNwLT5jcF9wYnBhciB8PSBQQl9FTkVUX1RFTkE7CiAJY3AtPmNwX3BiZGlyIHw9IFBCX0VORVRfVEVOQTsKKyNlbGlmICggIWRlZmluZWQgKFBCX0VORVRfVEVOQSkgJiYgIWRlZmluZWQgKFBDX0VORVRfVEVOQSkgJiYgZGVmaW5lZCAoUEVfRU5FVF9URU5BKSkKKwljcC0+Y3BfcGVwYXIgfD0gIFBFX0VORVRfVEVOQTsKKwljcC0+Y3BfcGVkaXIgJj0gflBFX0VORVRfVEVOQTsKKwljcC0+Y3BfcGVzbyAgfD0gIFBFX0VORVRfVEVOQTsKICNlbHNlCi0jZXJyb3IgQ29uZmlndXJhdGlvbiBFcnJvcjogZGVmaW5lIGV4YWN0bHkgT05FIG9mIFBCX0VORVRfVEVOQSwgUENfRU5FVF9URU5BCisjZXJyb3IgQ29uZmlndXJhdGlvbiBFcnJvcjogZGVmaW5lIGV4YWN0bHkgT05FIG9mIFBCX0VORVRfVEVOQSwgUENfRU5FVF9URU5BLCBQRV9FTkVUX1RFTkEKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfUlBYTElURSkgfHwgZGVmaW5lZChDT05GSUdfUlBYQ0xBU1NJQykKQEAgLTkzNiw2ICs5NDgsMjkgQEAKIAkqKCh2b2xhdGlsZSB1aW50ICopQkNTUjEpICY9IH5CQ1NSMV9FVEhFTjsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01QQzg4NUFEUworCisJLyogRGVhc3NlcnQgUEhZIHJlc2V0IGFuZCBlbmFibGUgdGhlIFBIWS4KKwkgKi8KKwl7CisJCXZvbGF0aWxlIHVpbnQgX19pb21lbSAqYmNzciA9IGlvcmVtYXAoQkNTUl9BRERSLCBCQ1NSX1NJWkUpOworCQl1aW50IHRtcDsKKworCQl0bXAgPSBpbl9iZTMyKGJjc3IgKyAxIC8qIEJDU1IxICovKTsKKwkJdG1wIHw9IEJDU1IxX0VUSEVOOworCQlvdXRfYmUzMihiY3NyICsgMSwgdG1wKTsKKwkJdG1wID0gaW5fYmUzMihiY3NyICsgNCAvKiBCQ1NSNCAqLyk7CisJCXRtcCB8PSBCQ1NSNF9FVEgxMF9SU1Q7CisJCW91dF9iZTMyKGJjc3IgKyA0LCB0bXApOworCQlpb3VubWFwKGJjc3IpOworCX0KKworCS8qIE9uIE1QQzg4NUFEUyBTQ0MgZXRoZXJuZXQgUEhZIGRlZmF1bHRzIHRvIHRoZSBmdWxsIGR1cGxleCBtb2RlCisJICogdXBvbiByZXNldC4gU0NDIGlzIHNldCB0byBoYWxmIGR1cGxleCBieSBkZWZhdWx0LiBTbyB0aGlzCisJICogaW5jb25zaXN0ZW5jeSBzaG91bGQgYmUgYmV0dGVyIGZpeGVkIGJ5IHRoZSBzb2Z0d2FyZS4KKwkgKi8KKyNlbmRpZgorCiAJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyllcDsKICNpZiAwCiAJZGV2LT5uYW1lID0gIkNQTV9FTkVUIjsKQEAgLTk2OSwzICsxMDA0LDQgQEAKIH0KIAogbW9kdWxlX2luaXQoc2NjX2VuZXRfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL0tjb25maWcgYi9hcmNoL3BwYy9LY29uZmlnCmluZGV4IDg0OGY0MzkuLmI4MzNjYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL0tjb25maWcKKysrIGIvYXJjaC9wcGMvS2NvbmZpZwpAQCAtODgsNiArODgsOSBAQAogCWRlcGVuZHMgb24gQlJPS0VOCiAJYm9vbCAiOHh4IgogCitjb25maWcgRTIwMAorCWJvb2wgImUyMDAiCisKIGNvbmZpZyBFNTAwCiAJYm9vbCAiZTUwMCIKIApAQCAtOTgsMTIgKzEwMSwxMiBAQAogCiBjb25maWcgQk9PS0UKIAlib29sCi0JZGVwZW5kcyBvbiBFNTAwCisJZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKIAlkZWZhdWx0IHkKIAogY29uZmlnIEZTTF9CT09LRQogCWJvb2wKLQlkZXBlbmRzIG9uIEU1MDAKKwlkZXBlbmRzIG9uIEUyMDAgfHwgRTUwMAogCWRlZmF1bHQgeQogCiBjb25maWcgUFRFXzY0QklUCkBAIC0xNDEsMTYgKzE0NCwxNiBAQAogCiBjb25maWcgU1BFCiAJYm9vbCAiU1BFIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBFNTAwCisJZGVwZW5kcyBvbiBFMjAwIHx8IEU1MDAKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGtlcm5lbCBzdXBwb3J0IGZvciB0aGUgU2lnbmFsIFByb2Nlc3NpbmcKIAkgIEV4dGVuc2lvbnMgKFNQRSkgdG8gdGhlIFBvd2VyUEMgcHJvY2Vzc29yLiBUaGUga2VybmVsIGN1cnJlbnRseQogCSAgc3VwcG9ydHMgc2F2aW5nIGFuZCByZXN0b3JpbmcgU1BFIHJlZ2lzdGVycywgYW5kIHR1cm5pbmcgb24gdGhlCiAJICAnc3BlIGVuYWJsZScgYml0IHNvIHVzZXIgcHJvY2Vzc2VzIGNhbiBleGVjdXRlIFNQRSBpbnN0cnVjdGlvbnMuCiAKLQkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsbHkgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cworCSAgVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9jZXNzb3IgdGhhdCBzdXBwb3J0cwogCSAgU1BFIChlNTAwLCBvdGhlcndpc2Uga25vd24gYXMgODV4eCBzZXJpZXMpLCBidXQgZG9lcyBub3QgaGF2ZSBhbnkKLQkgIGFmZmVjdCBvbiBhIG5vbi1zcGUgY3B1IChpdCBkb2VzLCBob3dldmVyIGFkZCBjb2RlIHRvIHRoZSBrZXJuZWwpLgorCSAgZWZmZWN0IG9uIGEgbm9uLXNwZSBjcHUgKGl0IGRvZXMsIGhvd2V2ZXIgYWRkIGNvZGUgdG8gdGhlIGtlcm5lbCkuCiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgWSBoZXJlLgogCkBAIC0yMDAsNyArMjAzLDcgQEAKIAogY29uZmlnIE1BVEhfRU1VTEFUSU9OCiAJYm9vbCAiTWF0aCBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiA0eHggfHwgOHh4IHx8IEU1MDAKKwlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMCB8fCBFNTAwCiAJLS0taGVscC0tLQogCSAgU29tZSBQb3dlclBDIGNoaXBzIGRlc2lnbmVkIGZvciBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUKIAkgIGEgZmxvYXRpbmctcG9pbnQgdW5pdCBhbmQgdGhlcmVmb3JlIGRvIG5vdCBpbXBsZW1lbnQgdGhlCkBAIC0yMTQsNiArMjE3LDI2IEBACiAJICBoZXJlLiAgU2F5aW5nIFkgaGVyZSB3aWxsIG5vdCBodXJ0IHBlcmZvcm1hbmNlIChvbiBhbnkgbWFjaGluZSkgYnV0CiAJICB3aWxsIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBrZXJuZWwuCiAKK2NvbmZpZyBLRVhFQworCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgorCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKKwkgIGJ1dCBpdCBpcyBpbmRlcGVkZW50IG9mIHRoZSBzeXN0ZW0gZmlybXdhcmUuICAgQW5kIGxpa2UgYSByZWJvb3QKKwkgIHlvdSBjYW4gc3RhcnQgYW55IGtlcm5lbCB3aXRoIGl0LCBub3QganVzdCBMaW51eC4KKworCSAgVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgc2ltaWxpYXJpdHkgdG8gdGhlIGV4ZWMgc3lzdGVtIGNhbGwuCisKKwkgIEl0IGlzIGFuIG9uZ29pbmcgcHJvY2VzcyB0byBiZSBjZXJ0YWluIHRoZSBoYXJkd2FyZSBpbiBhIG1hY2hpbmUKKwkgIGlzIHByb3Blcmx5IHNodXRkb3duLCBzbyBkbyBub3QgYmUgc3VycHJpc2VkIGlmIHRoaXMgY29kZSBkb2VzIG5vdAorCSAgaW5pdGlhbGx5IHdvcmsgZm9yIHlvdS4gIEl0IG1heSBoZWxwIHRvIGVuYWJsZSBkZXZpY2UgaG90cGx1Z2dpbmcKKwkgIHN1cHBvcnQuICBBcyBvZiB0aGlzIHdyaXRpbmcgdGhlIGV4YWN0IGhhcmR3YXJlIGludGVyZmFjZSBpcworCSAgc3Ryb25nbHkgaW4gZmx1eCwgc28gbm8gZ29vZCByZWNvbW1lbmRhdGlvbiBjYW4gYmUgbWFkZS4KKworCSAgSW4gdGhlIEdhbWVDdWJlIGltcGxlbWVudGF0aW9uLCBrZXhlYyBhbGxvd3MgeW91IHRvIGxvYWQgYW5kCisJICBydW4gRE9MIGZpbGVzLCBpbmNsdWRpbmcga2VybmVsIGFuZCBob21lYnJldyBET0xzLgorCiBzb3VyY2UgImRyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIgogCiBjb25maWcgQ1BVX0ZSRVFfUE1BQwpAQCAtMjU0LDEzICsyNzcsMTYgQEAKIAogY29uZmlnIE5PVF9DT0hFUkVOVF9DQUNIRQogCWJvb2wKLQlkZXBlbmRzIG9uIDR4eCB8fCA4eHgKKwlkZXBlbmRzIG9uIDR4eCB8fCA4eHggfHwgRTIwMAogCWRlZmF1bHQgeQogCiBlbmRtZW51CiAKIG1lbnUgIlBsYXRmb3JtIG9wdGlvbnMiCiAKK2NvbmZpZyBGQURTCisJYm9vbAorCiBjaG9pY2UKIAlwcm9tcHQgIjh4eCBNYWNoaW5lIFR5cGUiCiAJZGVwZW5kcyBvbiA4eHgKQEAgLTM3Niw4ICs0MDIsMjUgQEAKIAkgIDI2TUIgRFJBTSwgNE1CIGZsYXNoLCBFdGhlcm5ldCwgYSAxNkstZ2F0ZSBGUEdBLCBVU0IsIGFuIExDRC92aWRlbwogCSAgY29udHJvbGxlciwgYW5kIHR3byBSUzIzMiBwb3J0cy4KIAotY29uZmlnIEZBRFMKK2NvbmZpZyBNUEM4WFhGQURTCiAJYm9vbCAiRkFEUyIKKwlzZWxlY3QgRkFEUworCitjb25maWcgTVBDODZYQURTCisJYm9vbCAiTVBDODZYQURTIgorCWhlbHAKKwkgIE1QQzg2eCBBcHBsaWNhdGlvbiBEZXZlbG9wbWVudCBTeXN0ZW0gYnkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IuCisJICBUaGUgTVBDODZ4QURTIGlzIG1lYW50IHRvIHNlcnZlIGFzIGEgcGxhdGZvcm0gZm9yIHMvdyBhbmQgaC93CisJICBkZXZlbG9wbWVudCBhcm91bmQgdGhlIE1QQzg2WCBwcm9jZXNzb3IgZmFtaWxpZXMuCisJc2VsZWN0IEZBRFMKKworY29uZmlnIE1QQzg4NUFEUworCWJvb2wgIk1QQzg4NUFEUyIKKwloZWxwCisJICBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBNUEM4ODUgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgU3lzdGVtIChBRFMpLgorCSAgQWxzbyBrbm93biBhcyBEVUVULgorCSAgVGhlIE1QQzg4NUFEUyBpcyBtZWFudCB0byBzZXJ2ZSBhcyBhIHBsYXRmb3JtIGZvciBzL3cgYW5kIGgvdworCSAgZGV2ZWxvcG1lbnQgYXJvdW5kIHRoZSBNUEM4ODUgcHJvY2Vzc29yIGZhbWlseS4KIAogY29uZmlnIFRRTTgyM0wKIAlib29sICJUUU04MjNMIgpAQCAtMTMxMiw2ICsxMzU1LDggQEAKIAlkZXBlbmRzIG9uIEFEVkFOQ0VEX09QVElPTlMgJiYgOHh4CiBlbmRtZW51CiAKK3NvdXJjZSAibmV0L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9LY29uZmlnIgogCiBzb3VyY2UgImZzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wcGMvS2NvbmZpZy5kZWJ1ZwppbmRleCBkMmUxZWVhLi5lMTZjNzcxIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvcHBjL0tjb25maWcuZGVidWcKQEAgLTY2LDcgKzY2LDcgQEAKIAogY29uZmlnIFBQQ19PQ1AKIAlib29sCi0JZGVwZW5kcyBvbiBJQk1fT0NQIHx8IEZTTF9PQ1AgfHwgWElMSU5YX09DUAorCWRlcGVuZHMgb24gSUJNX09DUCB8fCBYSUxJTlhfT0NQCiAJZGVmYXVsdCB5CiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL01ha2VmaWxlIGIvYXJjaC9wcGMvTWFrZWZpbGUKaW5kZXggMDQzMmEyNS4uZjliMGQ3NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMvTWFrZWZpbGUKQEAgLTI5LDcgKzI5LDcgQEAKIAogQ0hFQ0tGTEFHUwkrPSAtRF9fcG93ZXJwY19fCiAKLWlmbmRlZiBDT05GSUdfRTUwMAoraWZuZGVmIENPTkZJR19GU0xfQk9PS0UKIENGTEFHUwkJKz0gLW1zdHJpbmcKIGVuZGlmCiAKQEAgLTM4LDYgKzM4LDcgQEAKIGNwdS1hcy0kKENPTkZJR182eHgpCQkrPSAtV2EsLW1hbHRpdmVjCiBjcHUtYXMtJChDT05GSUdfUE9XRVI0KQkJKz0gLVdhLC1tYWx0aXZlYwogY3B1LWFzLSQoQ09ORklHX0U1MDApCQkrPSAtV2EsLW1lNTAwCitjcHUtYXMtJChDT05GSUdfRTIwMCkJCSs9IC1XYSwtbWUyMDAKIAogQUZMQUdTICs9ICQoY3B1LWFzLXkpCiBDRkxBR1MgKz0gJChjcHUtYXMteSkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvb3BlbmZpcm13YXJlL2NocnBtYWluLmMgYi9hcmNoL3BwYy9ib290L29wZW5maXJtd2FyZS9jaHJwbWFpbi5jCmluZGV4IDZmYjRmNzMuLmVmZmU0YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvb3BlbmZpcm13YXJlL2NocnBtYWluLmMKKysrIGIvYXJjaC9wcGMvYm9vdC9vcGVuZmlybXdhcmUvY2hycG1haW4uYwpAQCAtMzksNyArMzksNyBAQAogCiAjZGVmaW5lIFNDUkFUQ0hfU0laRQkoMTI4IDw8IDEwKQogCi1zdGF0aWMgY2hhciBzY3JhdGNoW1NDUkFUQ0hfU0laRV07CS8qIDFNQiBvZiBzY3JhdGNoIHNwYWNlIGZvciBndW56aXAgKi8KK3N0YXRpYyBjaGFyIHNjcmF0Y2hbU0NSQVRDSF9TSVpFXTsJLyogMTI4ayBvZiBzY3JhdGNoIHNwYWNlIGZvciBndW56aXAgKi8KIAogdHlwZWRlZiB2b2lkICgqa2VybmVsX3N0YXJ0X3QpKGludCwgaW50LCB2b2lkICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvY29uZmlncy9tcGM4NnhfYWRzX2RlZmNvbmZpZyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODZ4X2Fkc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzYzZmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODZ4X2Fkc19kZWZjb25maWcKQEAgLTAsMCArMSw2MzMgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMi1yYzQKKyMgVHVlIEp1biAxNCAxMzozNjozNSAyMDA1CisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0hBVkVfREVDX0xPQ0s9eQorQ09ORklHX1BQQz15CitDT05GSUdfUFBDMzI9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKKyMgQ09ORklHX0NMRUFOX0NPTVBJTEUgaXMgbm90IHNldAorQ09ORklHX0JST0tFTj15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorIyBDT05GSUdfQkFTRV9GVUxMIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0xCisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNT0QgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvcgorIworIyBDT05GSUdfNnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQweCBpcyBub3Qgc2V0CisjIENPTkZJR180NHggaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSNCBpcyBub3Qgc2V0CitDT05GSUdfOHh4PXkKKyMgQ09ORklHX0U1MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUFUSF9FTVVMQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEQk9PVD15CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CitDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFPXkKKworIworIyBQbGF0Zm9ybSBvcHRpb25zCisjCitDT05GSUdfRkFEUz15CisjIENPTkZJR19SUFhMSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQWENMQVNTSUMgaXMgbm90IHNldAorIyBDT05GSUdfQlNFSVAgaXMgbm90IHNldAorIyBDT05GSUdfTVBDOFhYRkFEUyBpcyBub3Qgc2V0CitDT05GSUdfTVBDODZYQURTPXkKKyMgQ09ORklHX1RRTTgyM0wgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODUwTCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NTVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg2MEwgaXMgbm90IHNldAorIyBDT05GSUdfRlBTODUwTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEQ4MjNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19JVk1TOCBpcyBub3Qgc2V0CisjIENPTkZJR19JVk1MMjQgaXMgbm90IHNldAorIyBDT05GSUdfU004NTAgaXMgbm90IHNldAorIyBDT05GSUdfSEVSTUVTX1BSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUDg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19MV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQ1VfRSBpcyBub3Qgc2V0CisjIENPTkZJR19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfTEFOVEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01CWCBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5DRVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNUCBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfRE9NQUlOUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfUVNQQU4gaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TVEFSVD0weGZmMTAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TSVpFPTB4MDAyMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDQwMDAwMAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9BUz15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lQX1RDUERJQUc9eQorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKK0NPTkZJR19JUFY2PW0KKyMgQ09ORklHX0lQVjZfUFJJVkFDWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisjIENPTkZJR19BVE0gaXMgbm90IHNldAorIyBDT05GSUdfQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUk9VVEUgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CisjIENPTkZJR19NSUkgaXMgbm90IHNldAorIyBDT05GSUdfT0FLTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CisjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorQ09ORklHX1NPVU5EX0dBTUVQT1JUPXkKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU01DMiBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorCisjCisjIFVTQiBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfQVJDSF9IQVNfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19PSENJIGlzIG5vdCBzZXQKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorCisjCisjIFhGUyBzdXBwb3J0CisjCisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKK0NPTkZJR19ORlNfVjQ9eQorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX1NVTlJQQz15CitDT05GSUdfU1VOUlBDX0dTUz15CitDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBNUEM4eHggQ1BNIE9wdGlvbnMKKyMKK0NPTkZJR19TQ0NfRU5FVD15CitDT05GSUdfU0NDMV9FTkVUPXkKKyMgQ09ORklHX1NDQzJfRU5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0MzX0VORVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVDX0VORVQgaXMgbm90IHNldAorIyBDT05GSUdfRU5FVF9CSUdfQlVGRkVSUyBpcyBub3Qgc2V0CisKKyMKKyMgR2VuZXJpYyBNUEM4eHggT3B0aW9ucworIworIyBDT05GSUdfOHh4X0NPUFlCQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eF9DUFU2IGlzIG5vdCBzZXQKK0NPTkZJR19OT19VQ09ERV9QQVRDSD15CisjIENPTkZJR19VU0JfU09GX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TUElfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9TTUMxX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgQ3J5cHRvZ3JhcGhpYyBvcHRpb25zCisjCitDT05GSUdfQ1JZUFRPPXkKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9jb25maWdzL21wYzg4NWFkc19kZWZjb25maWcgYi9hcmNoL3BwYy9jb25maWdzL21wYzg4NWFkc19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2Zjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2NvbmZpZ3MvbXBjODg1YWRzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDYyMiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEyLXJjNgorIyBUaHUgSnVuICA5IDIxOjE3OjI5IDIwMDUKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfSEFWRV9ERUNfTE9DSz15CitDT05GSUdfUFBDPXkKK0NPTkZJR19QUEMzMj15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorIyBDT05GSUdfQ0xFQU5fQ09NUElMRSBpcyBub3Qgc2V0CitDT05GSUdfQlJPS0VOPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IKKyMKKyMgQ09ORklHXzZ4eCBpcyBub3Qgc2V0CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSMyBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUjQgaXMgbm90IHNldAorQ09ORklHXzh4eD15CisjIENPTkZJR19FNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFREJPT1Q9eQorIyBDT05GSUdfUE0gaXMgbm90IHNldAorQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15CisKKyMKKyMgUGxhdGZvcm0gb3B0aW9ucworIworIyBDT05GSUdfUlBYTElURSBpcyBub3Qgc2V0CisjIENPTkZJR19SUFhDTEFTU0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRUlQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBRFMgaXMgbm90IHNldAorQ09ORklHX01QQzg4NUFEUz15CisjIENPTkZJR19UUU04MjNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RRTTg1MEwgaXMgbm90IHNldAorIyBDT05GSUdfVFFNODU1TCBpcyBub3Qgc2V0CisjIENPTkZJR19UUU04NjBMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZQUzg1MEwgaXMgbm90IHNldAorIyBDT05GSUdfU1BEODIzVFMgaXMgbm90IHNldAorIyBDT05GSUdfSVZNUzggaXMgbm90IHNldAorIyBDT05GSUdfSVZNTDI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNODUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFUk1FU19QUk8gaXMgbm90IHNldAorIyBDT05GSUdfSVA4NjAgaXMgbm90IHNldAorIyBDT05GSUdfTFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfUENVX0UgaXMgbm90IHNldAorIyBDT05GSUdfQ0NNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBTlRFQyBpcyBub3Qgc2V0CisjIENPTkZJR19NQlggaXMgbm90IHNldAorIyBDT05GSUdfV0lOQ0VQVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CitDT05GSUdfSVNBX0RNQV9BUEk9eQorCisjCisjIEJ1cyBvcHRpb25zCisjCisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorIyBDT05GSUdfUENJX1FTUEFOIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0NPTlNJU1RFTlRfU1RBUlQ9MHhmZjEwMDAwMAorQ09ORklHX0NPTlNJU1RFTlRfU0laRT0weDAwMjAwMDAwCitDT05GSUdfQk9PVF9MT0FEPTB4MDA0MDAwMDAKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9UQ1BESUFHPXkKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfT0FLTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKK0NPTkZJR19QUFA9eQorIyBDT05GSUdfUFBQX01VTFRJTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19QUFBfRklMVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUFBfQVNZTkM9eQorQ09ORklHX1BQUF9TWU5DX1RUWT15CitDT05GSUdfUFBQX0RFRkxBVEU9eQorIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NQTT15CitDT05GSUdfU0VSSUFMX0NQTV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQ1BNX1NDQzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0NQTV9TQ0MzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9DUE1fU0NDNCBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMX0NQTV9TTUMxPXkKK0NPTkZJR19TRVJJQUxfQ1BNX1NNQzI9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CisjIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBYRlMgc3VwcG9ydAorIworIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfREVWRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CisjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgTVBDOHh4IENQTSBPcHRpb25zCisjCitDT05GSUdfU0NDX0VORVQ9eQorIyBDT05GSUdfU0NDMV9FTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDQzJfRU5FVCBpcyBub3Qgc2V0CitDT05GSUdfU0NDM19FTkVUPXkKKyMgQ09ORklHX0ZFQ19FTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VORVRfQklHX0JVRkZFUlMgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgTVBDOHh4IE9wdGlvbnMKKyMKK0NPTkZJR184eHhfQ09QWUJBQ0s9eQorQ09ORklHXzh4eF9DUFU2PXkKK0NPTkZJR19OT19VQ09ERV9QQVRDSD15CisjIENPTkZJR19VU0JfU09GX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TUElfVUNPREVfUEFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NQSV9TTUMxX1VDT0RFX1BBVENIIGlzIG5vdCBzZXQKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQ1JDX0NDSVRUPXkKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcHBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiMjg0NDUxLi5iMTQ1N2E4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGMva2VybmVsL01ha2VmaWxlCkBAIC0yNiw3ICsyNiwxMCBAQAogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vIHNtcC10YnN5bmMubwogb2JqLSQoQ09ORklHX1RBVSkJCSs9IHRlbXAubwogb2JqLSQoQ09ORklHX0FMVElWRUMpCQkrPSB2ZWNlbXUubyB2ZWN0b3IubworaWZuZGVmIENPTkZJR19FMjAwCiBvYmotJChDT05GSUdfRlNMX0JPT0tFKQkJKz0gcGVyZm1vbl9mc2xfYm9va2UubworZW5kaWYKK29iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubwogCiBpZm5kZWYgQ09ORklHX01BVEhfRU1VTEFUSU9OCiBvYmotJChDT05GSUdfOHh4KQkJKz0gc29mdGVtdTh4eC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcHBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDAxYzIyNjAuLjUwOTM2Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC05MDMsNyArOTAzLDMwIEBACiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfNDR4ICovCi0jaWZkZWYgQ09ORklHX0U1MDAKKyNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCisJeyAJLyogZTIwMHo1ICovCisJCS5wdnJfbWFzawkJPSAweGZmZjAwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4ODEwMDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiZTIwMHo1IiwKKwkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9VU0VfVEIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSB8CisJCQlQUENfRkVBVFVSRV9VTklGSUVEX0NBQ0hFLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCX0sCisJeyAJLyogZTIwMHo2ICovCisJCS5wdnJfbWFzawkJPSAweGZmZjAwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4ODExMDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiZTIwMHo2IiwKKwkJLyogeHh4IC0gZ2FsYWs6IGFkZCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFICovCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9VU0VfVEIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9TUEVfQ09NUCB8CisJCQlQUENfRkVBVFVSRV9IQVNfRUZQX1NJTkdMRSB8CisJCQlQUENfRkVBVFVSRV9VTklGSUVEX0NBQ0hFLAorCQkuZGNhY2hlX2JzaXplCQk9IDMyLAorCX0sCiAJeyAJLyogZTUwMCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDgwMjAwMDAwLApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUwppbmRleCA4Mzc3YjZjLi5kNGRmNjg2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BwYy9rZXJuZWwvZW50cnkuUwpAQCAtNjAsNiArNjAsMTEgQEAKIAlUUkFOU0ZFUl9UT19IQU5ETEVSX0VYQ19MRVZFTChNQ0hFQ0spCiAJYgl0cmFuc2Zlcl90b19oYW5kbGVyX2Z1bGwKIAorCS5nbG9ibAlkZWJ1Z190cmFuc2Zlcl90b19oYW5kbGVyCitkZWJ1Z190cmFuc2Zlcl90b19oYW5kbGVyOgorCVRSQU5TRkVSX1RPX0hBTkRMRVJfRVhDX0xFVkVMKERFQlVHKQorCWIJdHJhbnNmZXJfdG9faGFuZGxlcl9mdWxsCisKIAkuZ2xvYmwJY3JpdF90cmFuc2Zlcl90b19oYW5kbGVyCiBjcml0X3RyYW5zZmVyX3RvX2hhbmRsZXI6CiAJVFJBTlNGRVJfVE9fSEFORExFUl9FWENfTEVWRUwoQ1JJVCkKQEAgLTgzNSw2ICs4NDAsMTAgQEAKIAlSRVRfRlJPTV9FWENfTEVWRUwoU1BSTl9DU1JSMCwgU1BSTl9DU1JSMSwgUkZDSSkKIAogI2lmZGVmIENPTkZJR19CT09LRQorCS5nbG9ibAlyZXRfZnJvbV9kZWJ1Z19leGMKK3JldF9mcm9tX2RlYnVnX2V4YzoKKwlSRVRfRlJPTV9FWENfTEVWRUwoU1BSTl9EU1JSMCwgU1BSTl9EU1JSMSwgUkZESSkKKwogCS5nbG9ibAlyZXRfZnJvbV9tY2hlY2tfZXhjCiByZXRfZnJvbV9tY2hlY2tfZXhjOgogCVJFVF9GUk9NX0VYQ19MRVZFTChTUFJOX01DU1JSMCwgU1BSTl9NQ1NSUjEsIFJGTUNJKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL2hlYWRfYm9va2UuaCBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkX2Jvb2tlLmgKaW5kZXggOWM1MGY5ZC4uOTM0MmFjZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL2hlYWRfYm9va2UuaAorKysgYi9hcmNoL3BwYy9rZXJuZWwvaGVhZF9ib29rZS5oCkBAIC00OSw2ICs0OSw3IEBACiAgKgogICogT24gNDB4IGNyaXRpY2FsIGlzIHRoZSBvbmx5IGFkZGl0aW9uYWwgbGV2ZWwKICAqIE9uIDQ0eC9lNTAwIHdlIGhhdmUgY3JpdGljYWwgYW5kIG1hY2hpbmUgY2hlY2sKKyAqIE9uIGUyMDAgd2UgaGF2ZSBjcml0aWNhbCBhbmQgZGVidWcgKG1hY2hpbmUgY2hlY2sgb2NjdXJzIHZpYSBjcml0aWNhbCkKICAqCiAgKiBBZGRpdGlvbmFsbHkgd2UgcmVzZXJ2ZSBhIFNQUkcgZm9yIGVhY2ggcHJpb3JpdHkgbGV2ZWwgc28gd2UgY2FuIGZyZWUgdXAgYQogICogR1BSIHRvIHVzZSBhcyB0aGUgYmFzZSBmb3IgaW5kaXJlY3QgYWNjZXNzIHRvIHRoZSBleGNlcHRpb24gc3RhY2tzLiAgVGhpcwpAQCAtNjAsMTIgKzYxLDE2IEBACiAKIC8qIENSSVRfU1BSRyBvbmx5IHVzZWQgaW4gY3JpdGljYWwgZXhjZXB0aW9uIGhhbmRsaW5nICovCiAjZGVmaW5lIENSSVRfU1BSRwlTUFJOX1NQUkcyCi0vKiBNQ0hFQ0tfU1BSRyBvbmx5IHVzZWQgaW4gY3JpdGljYWwgZXhjZXB0aW9uIGhhbmRsaW5nICovCisvKiBNQ0hFQ0tfU1BSRyBvbmx5IHVzZWQgaW4gbWFjaGluZSBjaGVjayBleGNlcHRpb24gaGFuZGxpbmcgKi8KICNkZWZpbmUgTUNIRUNLX1NQUkcJU1BSTl9TUFJHNlcKIAogI2RlZmluZSBNQ0hFQ0tfU1RBQ0tfVE9QCShleGNlcHRpb25fc3RhY2tfdG9wIC0gNDA5NikKICNkZWZpbmUgQ1JJVF9TVEFDS19UT1AJCShleGNlcHRpb25fc3RhY2tfdG9wKQogCisvKiBvbmx5IG9uIGUyMDAgZm9yIG5vdyAqLworI2RlZmluZSBERUJVR19TVEFDS19UT1AJCShleGNlcHRpb25fc3RhY2tfdG9wIC0gNDA5NikKKyNkZWZpbmUgREVCVUdfU1BSRwkJU1BSTl9TUFJHNlcKKwogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgQk9PS0VfTE9BRF9FWENfTEVWRUxfU1RBQ0sobGV2ZWwpCQlcCiAJbWZzcHIJcjgsU1BSTl9QSVI7CQkJCVwKQEAgLTEyNCw2ICsxMjksOCBAQAogCiAjZGVmaW5lIENSSVRJQ0FMX0VYQ0VQVElPTl9QUk9MT0cgXAogCQlFWENfTEVWRUxfRVhDRVBUSU9OX1BST0xPRyhDUklULCBTUFJOX0NTUlIwLCBTUFJOX0NTUlIxKQorI2RlZmluZSBERUJVR19FWENFUFRJT05fUFJPTE9HIFwKKwkJRVhDX0xFVkVMX0VYQ0VQVElPTl9QUk9MT0coREVCVUcsIFNQUk5fRFNSUjAsIFNQUk5fRFNSUjEpCiAjZGVmaW5lIE1DSEVDS19FWENFUFRJT05fUFJPTE9HIFwKIAkJRVhDX0xFVkVMX0VYQ0VQVElPTl9QUk9MT0coTUNIRUNLLCBTUFJOX01DU1JSMCwgU1BSTl9NQ1NSUjEpCiAKQEAgLTIwNSw2ICsyMTIsNjAgQEAKICAqIHNhdmUgKGFuZCBsYXRlciByZXN0b3JlKSB0aGUgTVNSIHZpYSBTUFJOX0NTUlIxLCB3aGljaCB3aWxsIHN0aWxsIGhhdmUKICAqIHRoZSBNU1JfREUgYml0IHNldC4KICAqLworI2lmZGVmIENPTkZJR19FMjAwCisjZGVmaW5lIERFQlVHX0VYQ0VQVElPTgkJCQkJCQkgICAgICBcCisJU1RBUlRfRVhDRVBUSU9OKERlYnVnKTsJCQkJCQkgICAgICBcCisJREVCVUdfRVhDRVBUSU9OX1BST0xPRzsJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJLyoJCQkJCQkJCSAgICAgIFwKKwkgKiBJZiB0aGVyZSBpcyBhIHNpbmdsZSBzdGVwIG9yIGJyYW5jaC10YWtlbiBleGNlcHRpb24gaW4gYW4JICAgICAgXAorCSAqIGV4Y2VwdGlvbiBlbnRyeSBzZXF1ZW5jZSwgaXQgd2FzIHByb2JhYmx5IG1lYW50IHRvIGFwcGx5IHRvCSAgICAgIFwKKwkgKiB0aGUgY29kZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIChzaW5jZSBleGNlcHRpb24gZW50cnkJICAgICAgXAorCSAqIGRvZXNuJ3QgdHVybiBvZmYgREUgYXV0b21hdGljYWxseSkuICBXZSBzaW11bGF0ZSB0aGUgZWZmZWN0CSAgICAgIFwKKwkgKiBvZiB0dXJuaW5nIG9mZiBERSBvbiBlbnRyeSB0byBhbiBleGNlcHRpb24gaGFuZGxlciBieSB0dXJuaW5nICAgICAgXAorCSAqIG9mZiBERSBpbiB0aGUgQ1NSUjEgdmFsdWUgYW5kIGNsZWFyaW5nIHRoZSBkZWJ1ZyBzdGF0dXMuCSAgICAgIFwKKwkgKi8JCQkJCQkJCSAgICAgIFwKKwltZnNwcglyMTAsU1BSTl9EQlNSOwkJLyogY2hlY2sgc2luZ2xlLXN0ZXAvYnJhbmNoIHRha2VuICovICBcCisJYW5kaXMuCXIxMCxyMTAsREJTUl9JQ0BoOwkJCQkJICAgICAgXAorCWJlcSsJMmY7CQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKwlsaXMJcjEwLEtFUk5FTEJBU0VAaDsJLyogY2hlY2sgaWYgZXhjZXB0aW9uIGluIHZlY3RvcnMgKi8gICBcCisJb3JpCXIxMCxyMTAsS0VSTkVMQkFTRUBsOwkJCQkJICAgICAgXAorCWNtcGx3CXIxMixyMTA7CQkJCQkJICAgICAgXAorCWJsdCsJMmY7CQkJLyogYWRkciBiZWxvdyBleGNlcHRpb24gdmVjdG9ycyAqLyAgICBcCisJCQkJCQkJCQkgICAgICBcCisJbGlzCXIxMCxEZWJ1Z0BoOwkJCQkJCSAgICAgIFwKKwlvcmkJcjEwLHIxMCxEZWJ1Z0BsOwkJCQkJICAgICAgXAorCWNtcGx3CXIxMixyMTA7CQkJCQkJICAgICAgXAorCWJndCsJMmY7CQkJLyogYWRkciBhYm92ZSBleGNlcHRpb24gdmVjdG9ycyAqLyAgICBcCisJCQkJCQkJCQkgICAgICBcCisJLyogaGVyZSBpdCBsb29rcyBsaWtlIHdlIGdvdCBhbiBpbmFwcHJvcHJpYXRlIGRlYnVnIGV4Y2VwdGlvbi4gKi8gICAgIFwKKzE6CXJsd2lubQlyOSxyOSwwLH5NU1JfREU7CS8qIGNsZWFyIERFIGluIHRoZSBDRFJSMSB2YWx1ZSAqLyAgICAgXAorCWxpcwlyMTAsREJTUl9JQ0BoOwkJLyogY2xlYXIgdGhlIElDIGV2ZW50ICovCSAgICAgIFwKKwltdHNwcglTUFJOX0RCU1IscjEwOwkJCQkJCSAgICAgIFwKKwkvKiByZXN0b3JlIHN0YXRlIGFuZCBnZXQgb3V0ICovCQkJCQkgICAgICBcCisJbHd6CXIxMCxfQ0NSKHIxMSk7CQkJCQkJICAgICAgXAorCWx3eglyMCxHUFIwKHIxMSk7CQkJCQkJICAgICAgXAorCWx3eglyMSxHUFIxKHIxMSk7CQkJCQkJICAgICAgXAorCW10Y3JmCTB4ODAscjEwOwkJCQkJCSAgICAgIFwKKwltdHNwcglTUFJOX0RTUlIwLHIxMjsJCQkJCQkgICAgICBcCisJbXRzcHIJU1BSTl9EU1JSMSxyOTsJCQkJCQkgICAgICBcCisJbHd6CXI5LEdQUjkocjExKTsJCQkJCQkgICAgICBcCisJbHd6CXIxMixHUFIxMihyMTEpOwkJCQkJCSAgICAgIFwKKwltdHNwcglERUJVR19TUFJHLHI4OwkJCQkJCSAgICAgIFwKKwlCT09LRV9MT0FEX0VYQ19MRVZFTF9TVEFDSyhERUJVRyk7IC8qIHI4IHBvaW50cyB0byB0aGUgZGVidWcgc3RhY2sgKi8gXAorCWx3eglyMTAsR1BSMTAtSU5UX0ZSQU1FX1NJWkUocjgpOwkJCQkgICAgICBcCisJbHd6CXIxMSxHUFIxMS1JTlRfRlJBTUVfU0laRShyOCk7CQkJCSAgICAgIFwKKwltZnNwcglyOCxERUJVR19TUFJHOwkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKwlSRkRJOwkJCQkJCQkJICAgICAgXAorCWIJLjsJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCS8qIGNvbnRpbnVlIG5vcm1hbCBoYW5kbGluZyBmb3IgYSBjcml0aWNhbCBleGNlcHRpb24uLi4gKi8JICAgICAgXAorMjoJbWZzcHIJcjQsU1BSTl9EQlNSOwkJCQkJCSAgICAgIFwKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFEOwkJCQkgICAgICBcCisJRVhDX1hGRVJfVEVNUExBVEUoRGVidWdFeGNlcHRpb24sIDB4MjAwMiwgKE1TUl9LRVJORUwgJiB+KE1TUl9NRXxNU1JfREV8TVNSX0NFKSksIE5PQ09QWSwgZGVidWdfdHJhbnNmZXJfdG9faGFuZGxlciwgcmV0X2Zyb21fZGVidWdfZXhjKQorI2Vsc2UKICNkZWZpbmUgREVCVUdfRVhDRVBUSU9OCQkJCQkJCSAgICAgIFwKIAlTVEFSVF9FWENFUFRJT04oRGVidWcpOwkJCQkJCSAgICAgIFwKIAlDUklUSUNBTF9FWENFUFRJT05fUFJPTE9HOwkJCQkJICAgICAgXApAQCAtMjU3LDYgKzMxOCw3IEBACiAyOgltZnNwcglyNCxTUFJOX0RCU1I7CQkJCQkJICAgICAgXAogCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQ7CQkJCSAgICAgIFwKIAlFWENfWEZFUl9URU1QTEFURShEZWJ1Z0V4Y2VwdGlvbiwgMHgyMDAyLCAoTVNSX0tFUk5FTCAmIH4oTVNSX01FfE1TUl9ERXxNU1JfQ0UpKSwgTk9DT1BZLCBjcml0X3RyYW5zZmVyX3RvX2hhbmRsZXIsIHJldF9mcm9tX2NyaXRfZXhjKQorI2VuZGlmCiAKICNkZWZpbmUgSU5TVFJVQ1RJT05fU1RPUkFHRV9FWENFUFRJT04JCQkJCSAgICAgIFwKIAlTVEFSVF9FWENFUFRJT04oSW5zdHJ1Y3Rpb25TdG9yYWdlKQkJCQkgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCmluZGV4IGNlMzZlODguLmViODA0YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCkBAIC0xMDIsNiArMTAyLDcgQEAKIAlvcglyNyxyNyxyNAogCW10c3ByCVNQUk5fTUFTNixyNwogCXRsYnN4CTAscjYJCQkJLyogc2VhcmNoIE1TUltJU10sIFNQSUQ9UElEMCAqLworI2lmbmRlZiBDT05GSUdfRTIwMAogCW1mc3ByCXI3LFNQUk5fTUFTMQogCWFuZGlzLglyNyxyNyxNQVMxX1ZBTElEQGgKIAlibmUJbWF0Y2hfVExCCkBAIC0xMTgsNiArMTE5LDcgQEAKIAlvcglyNyxyNyxyNAogCW10c3ByCVNQUk5fTUFTNixyNwogCXRsYnN4CTAscjYJCQkJLyogRmFsbCB0aHJvdWdoLCB3ZSBoYWQgdG8gbWF0Y2ggKi8KKyNlbmRpZgogbWF0Y2hfVExCOgogCW1mc3ByCXI3LFNQUk5fTUFTMAogCXJsd2lubQlyMyxyNywxNiwyMCwzMQkJCS8qIEV4dHJhY3QgTUFTMChFbnRyeSkgKi8KQEAgLTE5Niw4ICsxOTgsMTAgQEAKIC8qIDQuIENsZWFyIG91dCBQSURzICYgU2VhcmNoIGluZm8gKi8KIAlsaQlyNiwwCiAJbXRzcHIJU1BSTl9QSUQwLHI2CisjaWZuZGVmIENPTkZJR19FMjAwCiAJbXRzcHIJU1BSTl9QSUQxLHI2CiAJbXRzcHIJU1BSTl9QSUQyLHI2CisjZW5kaWYKIAltdHNwcglTUFJOX01BUzYscjYKIAogLyogNS4gSW52YWxpZGF0ZSBtYXBwaW5nIHdlIHN0YXJ0ZWQgaW4gKi8KQEAgLTI3Nyw3ICsyODEsOSBAQAogCVNFVF9JVk9SKDMyLCBTUEVVbmF2YWlsYWJsZSk7CiAJU0VUX0lWT1IoMzMsIFNQRUZsb2F0aW5nUG9pbnREYXRhKTsKIAlTRVRfSVZPUigzNCwgU1BFRmxvYXRpbmdQb2ludFJvdW5kKTsKKyNpZm5kZWYgQ09ORklHX0UyMDAKIAlTRVRfSVZPUigzNSwgUGVyZm9ybWFuY2VNb25pdG9yKTsKKyNlbmRpZgogCiAJLyogRXN0YWJsaXNoIHRoZSBpbnRlcnJ1cHQgdmVjdG9yIGJhc2UgKi8KIAlsaXMJcjQsaW50ZXJydXB0X2Jhc2VAaAkvKiBJVlBSIG9ubHkgdXNlcyB0aGUgaGlnaCAxNi1iaXRzICovCkBAIC0yODUsNiArMjkxLDkgQEAKIAogCS8qIFNldHVwIHRoZSBkZWZhdWx0cyBmb3IgVExCIGVudHJpZXMgKi8KIAlsaQlyMiwoTUFTNF9UU0laRUQoQk9PS0VfUEFHRVNaXzRLKSlAbAorI2lmZGVmIENPTkZJR19FMjAwCisJb3JpcwlyMixyMixNQVM0X1RMQlNFTEQoMSlAaAorI2VuZGlmCiAgICAJbXRzcHIJU1BSTl9NQVM0LCByMgogCiAjaWYgMApAQCAtMjkzLDYgKzMwMiwxMiBAQAogCW9yaXMJcjIscjIsSElEMF9ET1pFQGgKIAltdHNwcglTUFJOX0hJRDAsIHIyCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRTIwMAorCS8qIGVuYWJsZSBkZWRpY2F0ZWQgZGVidWcgZXhjZXB0aW9uIGhhbmRsaW5nIHJlc291cmNlcyAoRGVidWcgQVBVKSAqLworCW1mc3ByCXIyLFNQUk5fSElEMAorCW9yaSAJcjIscjIsSElEMF9EQVBVRU5AbAorCW10c3ByCVNQUk5fSElEMCxyMgorI2VuZGlmCiAKICNpZiAhZGVmaW5lZChDT05GSUdfQkRJX1NXSVRDSCkKIAkvKgpAQCAtNDE0LDcgKzQyOSwxMiBAQAogCUNSSVRJQ0FMX0VYQ0VQVElPTigweDAxMDAsIENyaXRpY2FsSW5wdXQsIFVua25vd25FeGNlcHRpb24pCiAKIAkvKiBNYWNoaW5lIENoZWNrIEludGVycnVwdCAqLworI2lmZGVmIENPTkZJR19FMjAwCisJLyogbm8gUkZNQ0ksIE1DU1JScyBvbiBFMjAwICovCisJQ1JJVElDQUxfRVhDRVBUSU9OKDB4MDIwMCwgTWFjaGluZUNoZWNrLCBNYWNoaW5lQ2hlY2tFeGNlcHRpb24pCisjZWxzZQogCU1DSEVDS19FWENFUFRJT04oMHgwMjAwLCBNYWNoaW5lQ2hlY2ssIE1hY2hpbmVDaGVja0V4Y2VwdGlvbikKKyNlbmRpZgogCiAJLyogRGF0YSBTdG9yYWdlIEludGVycnVwdCAqLwogCVNUQVJUX0VYQ0VQVElPTihEYXRhU3RvcmFnZSkKQEAgLTUyMCw4ICs1NDAsMTMgQEAKICNpZmRlZiBDT05GSUdfUFBDX0ZQVQogCUZQX1VOQVZBSUxBQkxFX0VYQ0VQVElPTgogI2Vsc2UKKyNpZmRlZiBDT05GSUdfRTIwMAorCS8qIEUyMDAgdHJlYXRzICdub3JtYWwnIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyBhcyBGUCBVbmF2YWlsIGV4Y2VwdGlvbiAqLworCUVYQ0VQVElPTigweDA4MDAsIEZsb2F0aW5nUG9pbnRVbmF2YWlsYWJsZSwgUHJvZ3JhbUNoZWNrRXhjZXB0aW9uLCBFWENfWEZFUl9FRSkKKyNlbHNlCiAJRVhDRVBUSU9OKDB4MDgwMCwgRmxvYXRpbmdQb2ludFVuYXZhaWxhYmxlLCBVbmtub3duRXhjZXB0aW9uLCBFWENfWEZFUl9FRSkKICNlbmRpZgorI2VuZGlmCiAKIAkvKiBTeXN0ZW0gQ2FsbCBJbnRlcnJ1cHQgKi8KIAlTVEFSVF9FWENFUFRJT04oU3lzdGVtQ2FsbCkKQEAgLTY5MSw2ICs3MTYsNyBAQAogLyoKICAqIExvY2FsIGZ1bmN0aW9ucwogICovCisKIAkvKgogCSAqIERhdGEgVExCIGV4Y2VwdGlvbnMgd2lsbCBiYWlsIG91dCB0byB0aGlzIHBvaW50CiAJICogaWYgdGhleSBjYW4ndCByZXNvbHZlIHRoZSBsaWdodHdlaWdodCBUTEIgZmF1bHQuCkBAIC03NjEsNiArNzg3LDMxIEBACiAyOglybHdpbWkJcjExLCByMTIsIDAsIDIwLCAzMQkvKiBFeHRyYWN0IFJQTiBmcm9tIFBURSBhbmQgbWVyZ2Ugd2l0aCBwZXJtcyAqLwogCW10c3ByCVNQUk5fTUFTMywgcjExCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRTIwMAorCS8qIFJvdW5kIHJvYmluIFRMQjEgZW50cmllcyBhc3NpZ25tZW50ICovCisJbWZzcHIJcjEyLCBTUFJOX01BUzAKKworCS8qIEV4dHJhY3QgVExCMUNGRyhORU5UUlkpICovCisJbWZzcHIJcjExLCBTUFJOX1RMQjFDRkcKKwlhbmRpLglyMTEsIHIxMSwgMHhmZmYKKworCS8qIEV4dHJhY3QgTUFTMChOVikgKi8KKwlhbmRpLglyMTMsIHIxMiwgMHhmZmYKKwlhZGRpCXIxMywgcjEzLCAxCisJY21wdwkwLCByMTMsIHIxMQorCWFkZGkJcjEyLCByMTIsIDEKKworCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gd3JhcCAqLworCWJsdAk3ZgorCisJLyogd3JhcCBiYWNrIHRvIGZpcnN0IGZyZWUgdGxiY2FtIGVudHJ5ICovCisJbGlzCXIxMywgdGxiY2FtX2luZGV4QGhhCisJbHd6CXIxMywgdGxiY2FtX2luZGV4QGwocjEzKQorCXJsd2ltaQlyMTIsIHIxMywgMCwgMjAsIDMxCis3OgorCW10c3ByICAgU1BSTl9NQVMwLHIxMgorI2VuZGlmIC8qIENPTkZJR19FMjAwICovCisKIAl0bGJ3ZQogCiAJLyogRG9uZS4uLnJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBnZXQgb3V0IG9mIGhlcmUuICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyNzg3NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBtYWNoaW5lX2tleGVjLmMgLSBoYW5kbGUgdHJhbnNpdGlvbiBvZiBMaW51eCBib290aW5nIGFub3RoZXIga2VybmVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBFcmljIEJpZWRlcm1hbiAgPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqCisgKiBHYW1lQ3ViZS9wcGMzMiBwb3J0IENvcHlyaWdodCAoQykgMjAwNCBBbGJlcnQgSGVycmFuegorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKK3R5cGVkZWYgTk9SRVRfVFlQRSB2b2lkICgqcmVsb2NhdGVfbmV3X2tlcm5lbF90KSgKKwkJCQl1bnNpZ25lZCBsb25nIGluZGlyZWN0aW9uX3BhZ2UsCisJCQkJdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXIsCisJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzKSBBVFRSSUJfTk9SRVQ7CisKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBpbnQgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOworCisvKgorICogUHJvdmlkZSBhIGR1bW15IGNyYXNoX25vdGVzIGRlZmluaXRpb24gd2hpbGUgY3Jhc2ggZHVtcCBhcnJpdmVzIHRvIHBwYy4KKyAqIFRoaXMgcHJldmVudHMgYnJlYWthZ2Ugb2YgY3Jhc2hfbm90ZXMgYXR0cmlidXRlIGluIGtlcm5lbC9rc3lzZnMuYy4KKyAqLwordm9pZCAqY3Jhc2hfbm90ZXMgPSBOVUxMOworCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3sKKwlpZiAocHBjX21kLm1hY2hpbmVfc2h1dGRvd24pCisJCXBwY19tZC5tYWNoaW5lX3NodXRkb3duKCk7Cit9CisKK3ZvaWQgbWFjaGluZV9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAocHBjX21kLm1hY2hpbmVfY3Jhc2hfc2h1dGRvd24pCisJCXBwY19tZC5tYWNoaW5lX2NyYXNoX3NodXRkb3duKCk7Cit9CisKKy8qCisgKiBEbyB3aGF0IGV2ZXJ5IHNldHVwIGlzIG5lZWRlZCBvbiBpbWFnZSBhbmQgdGhlCisgKiByZWJvb3QgY29kZSBidWZmZXIgdG8gYWxsb3cgdXMgdG8gYXZvaWQgYWxsb2NhdGlvbnMKKyAqIGxhdGVyLgorICovCitpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCWlmIChwcGNfbWQubWFjaGluZV9rZXhlY19wcmVwYXJlKQorCQlyZXR1cm4gcHBjX21kLm1hY2hpbmVfa2V4ZWNfcHJlcGFyZShpbWFnZSk7CisJLyoKKwkgKiBGYWlsIGlmIHBsYXRmb3JtIGRvZXNuJ3QgcHJvdmlkZSBpdHMgb3duIG1hY2hpbmVfa2V4ZWNfcHJlcGFyZQorCSAqIGltcGxlbWVudGF0aW9uLgorCSAqLworCXJldHVybiAtRU5PU1lTOworfQorCit2b2lkIG1hY2hpbmVfa2V4ZWNfY2xlYW51cChzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwlpZiAocHBjX21kLm1hY2hpbmVfa2V4ZWNfY2xlYW51cCkKKwkJcHBjX21kLm1hY2hpbmVfa2V4ZWNfY2xlYW51cChpbWFnZSk7Cit9CisKKy8qCisgKiBEbyBub3QgYWxsb2NhdGUgbWVtb3J5IChvciBmYWlsIGluIGFueSB3YXkpIGluIG1hY2hpbmVfa2V4ZWMoKS4KKyAqIFdlIGFyZSBwYXN0IHRoZSBwb2ludCBvZiBubyByZXR1cm4sIGNvbW1pdHRlZCB0byByZWJvb3Rpbmcgbm93LgorICovCitOT1JFVF9UWVBFIHZvaWQgbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwlpZiAocHBjX21kLm1hY2hpbmVfa2V4ZWMpCisJCXBwY19tZC5tYWNoaW5lX2tleGVjKGltYWdlKTsKKwllbHNlIHsKKwkJLyoKKwkJICogRmFsbCBiYWNrIHRvIG5vcm1hbCByZXN0YXJ0IGlmIHBsYXRmb3JtIGRvZXNuJ3QgcHJvdmlkZQorCQkgKiBpdHMgb3duIGtleGVjIGZ1bmN0aW9uLCBhbmQgdXNlciBpbnNpc3QgdG8ga2V4ZWMuLi4KKwkJICovCisJCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKKwl9CisJZm9yKDs7KTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIG1hY2hpbmVfa2V4ZWMgZnVuY3Rpb24gc3VpdGFibGUgYXQgbGVhc3QgZm9yCisgKiBub24tT3BlbkZpcm13YXJlIGVtYmVkZGVkIHBsYXRmb3Jtcy4KKyAqIEl0IG1lcmVseSBjb3BpZXMgdGhlIGltYWdlIHJlbG9jYXRpb24gY29kZSB0byB0aGUgY29udHJvbCBwYWdlIGFuZAorICoganVtcHMgdG8gaXQuCisgKiBBIHBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9uIG1heSBqdXN0IGNhbGwgdGhpcyBvbmUuCisgKi8KK3ZvaWQgbWFjaGluZV9rZXhlY19zaW1wbGUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJdW5zaWduZWQgbG9uZyBwYWdlX2xpc3Q7CisJdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXIsIHJlYm9vdF9jb2RlX2J1ZmZlcl9waHlzOworCXJlbG9jYXRlX25ld19rZXJuZWxfdCBybms7CisKKwkvKiBJbnRlcnJ1cHRzIGFyZW4ndCBhY2NlcHRhYmxlIHdoaWxlIHdlIHJlYm9vdCAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwlwYWdlX2xpc3QgPSBpbWFnZS0+aGVhZDsKKworCS8qIHdlIG5lZWQgYm90aCBlZmZlY3RpdmUgYW5kIHJlYWwgYWRkcmVzcyBoZXJlICovCisJcmVib290X2NvZGVfYnVmZmVyID0KKwkJCSh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOworCXJlYm9vdF9jb2RlX2J1ZmZlcl9waHlzID0gdmlydF90b19waHlzKCh2b2lkICopcmVib290X2NvZGVfYnVmZmVyKTsKKworCS8qIGNvcHkgb3VyIGtlcm5lbCByZWxvY2F0aW9uIGNvZGUgdG8gdGhlIGNvbnRyb2wgY29kZSBwYWdlICovCisJbWVtY3B5KCh2b2lkICopcmVib290X2NvZGVfYnVmZmVyLCByZWxvY2F0ZV9uZXdfa2VybmVsLAorCQkJCQkJcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplKTsKKworCWZsdXNoX2ljYWNoZV9yYW5nZShyZWJvb3RfY29kZV9idWZmZXIsCisJCQkJcmVib290X2NvZGVfYnVmZmVyICsgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUpOworCXByaW50ayhLRVJOX0lORk8gIkJ5ZSFcbiIpOworCisJLyogbm93IGNhbGwgaXQgKi8KKwlybmsgPSAocmVsb2NhdGVfbmV3X2tlcm5lbF90KSByZWJvb3RfY29kZV9idWZmZXI7CisJKCpybmspKHBhZ2VfbGlzdCwgcmVib290X2NvZGVfYnVmZmVyX3BoeXMsIGltYWdlLT5zdGFydCk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYy9rZXJuZWwvbWlzYy5TCmluZGV4IDczMjllZjEuLjE5MWE4ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9taXNjLlMKKysrIGIvYXJjaC9wcGMva2VybmVsL21pc2MuUwpAQCAtNTkzLDYgKzU5MywxNCBAQAogCWljY2NpCTAscjMKICNlbmRpZgogI2VsaWYgQ09ORklHX0ZTTF9CT09LRQorQkVHSU5fRlRSX1NFQ1RJT04KKwltZnNwciAgIHIzLFNQUk5fTDFDU1IwCisJb3JpICAgICByMyxyMyxMMUNTUjBfQ0ZJfEwxQ1NSMF9DTEZDCisJLyogbXN5bmM7IGlzeW5jIHJlY29tbWVuZGVkIGhlcmUgKi8KKwltdHNwciAgIFNQUk5fTDFDU1IwLHIzCisJaXN5bmMKKwlibHIKK0VORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX1NQTElUX0lEX0NBQ0hFKQogCW1mc3ByCXIzLFNQUk5fTDFDU1IxCiAJb3JpCXIzLHIzLEwxQ1NSMV9JQ0ZJfEwxQ1NSMV9JQ0xGUgogCW10c3ByCVNQUk5fTDFDU1IxLHIzCkBAIC0xNDM2LDggKzE0NDQsMTAgQEAKIAkubG9uZyBzeXNfbXFfdGltZWRyZWNlaXZlCS8qIDI2NSAqLwogCS5sb25nIHN5c19tcV9ub3RpZnkKIAkubG9uZyBzeXNfbXFfZ2V0c2V0YXR0cgotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiAyNjggcmVzZXJ2ZWQgZm9yIHN5c19rZXhlY19sb2FkICovCisJLmxvbmcgc3lzX2tleGVjX2xvYWQKIAkubG9uZyBzeXNfYWRkX2tleQogCS5sb25nIHN5c19yZXF1ZXN0X2tleQkJLyogMjcwICovCiAJLmxvbmcgc3lzX2tleWN0bAogCS5sb25nIHN5c193YWl0aWQKKwkubG9uZyBzeXNfaW9wcmlvX3NldAorCS5sb25nIHN5c19pb3ByaW9fZ2V0CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcGNpLmMgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKaW5kZXggNmQ3YjkyZC4uNzBjZmI2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wY2kuYwpAQCAtMTQ5NSw3ICsxNDk1LDcgQEAKIAkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKIAkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwogCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydDsKKwkJaW9fb2Zmc2V0ID0gaG9zZS0+aW9fYmFzZV92aXJ0IC0gX19fSU9fQkFTRTsKIAkJKm9mZnNldCArPSBpb19vZmZzZXQ7CiAJCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOwogCX0KQEAgLTE1MjIsNyArMTUyMiw3IEBACiAKIAkJLyogZm91bmQgaXQhIGNvbnN0cnVjdCB0aGUgZmluYWwgcGh5c2ljYWwgYWRkcmVzcyAqLwogCQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykKLQkJCSpvZmZzZXQgKz0gaG9zZS0+aW9fYmFzZV9waHlzIC0gX0lPX0JBU0U7CisJCQkqb2Zmc2V0ICs9IGhvc2UtPmlvX2Jhc2VfcGh5cyAtIGlvX29mZnNldDsKIAkJcmV0dXJuIHJwOwogCX0KIApAQCAtMTczOSw2ICsxNzM5LDIzIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAordm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAorCQkJICBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJzcmMsCisJCQkgIHU2NCAqc3RhcnQsIHU2NCAqZW5kKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zZShkZXYtPmJ1cy0+bnVtYmVyKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlvZmZzZXQgPSBfX19JT19CQVNFIC0gaG9zZS0+aW9fYmFzZV92aXJ0ICsgaG9zZS0+aW9fYmFzZV9waHlzOworCisJKnN0YXJ0ID0gcnNyYy0+c3RhcnQgKyBvZmZzZXQ7CisJKmVuZCA9IHJzcmMtPmVuZCArIG9mZnNldDsKK30KKwogdm9pZCBfX2luaXQKIHBjaV9pbml0X3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKIAkJICBpbnQgZmxhZ3MsIGNoYXIgKm5hbWUpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvcGVyZm1vbi5jIGIvYXJjaC9wcGMva2VybmVsL3BlcmZtb24uYwppbmRleCA5MThmNmIyLi5mYTFkYWQ5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9wZXJmbW9uLmMKQEAgLTM2LDcgKzM2LDcgQEAKIC8qIEEgbG9jayB0byByZWd1bGF0ZSBncmFiYmluZyB0aGUgaW50ZXJydXB0ICovCiBERUZJTkVfU1BJTkxPQ0socGVyZm1vbl9sb2NrKTsKIAotI2lmZGVmIENPTkZJR19GU0xfQk9PS0UKKyNpZiBkZWZpbmVkIChDT05GSUdfRlNMX0JPT0tFKSAmJiAhZGVmaW5lZCAoQ09ORklHX0UyMDApCiBzdGF0aWMgdm9pZCBkdW1teV9wZXJmKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGludCBwbWdjMCA9IG1mcG1yKFBNUk5fUE1HQzApOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9wcGMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMmFkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BwYy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiByZWxvY2F0ZV9rZXJuZWwuUyAtIHB1dCB0aGUga2VybmVsIGltYWdlIGluIHBsYWNlIHRvIGJvb3QKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIEVyaWMgQmllZGVybWFuICA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgorICoKKyAqIEdhbWVDdWJlL3BwYzMyIHBvcnQgQ29weXJpZ2h0IChDKSAyMDA0IEFsYmVydCBIZXJyYW56CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxhc20vcmVnLmg+CisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxhc20va2V4ZWMuaD4KKworI2RlZmluZSBQQUdFX1NJWkUgICAgICA0MDk2IC8qIG11c3QgYmUgc2FtZSB2YWx1ZSBhcyBpbiA8YXNtL3BhZ2UuaD4gKi8KKworCS8qCisJICogTXVzdCBiZSByZWxvY2F0YWJsZSBQSUMgY29kZSBjYWxsYWJsZSBhcyBhIEMgZnVuY3Rpb24uCisJICovCisJLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWwKK3JlbG9jYXRlX25ld19rZXJuZWw6CisJLyogcjMgPSBwYWdlX2xpc3QgICAqLworCS8qIHI0ID0gcmVib290X2NvZGVfYnVmZmVyICovCisJLyogcjUgPSBzdGFydF9hZGRyZXNzICAgICAgKi8KKworCWxpCXIwLCAwCisKKwkvKgorCSAqIFNldCBNYWNoaW5lIFN0YXR1cyBSZWdpc3RlciB0byBhIGtub3duIHN0YXR1cywKKwkgKiBzd2l0Y2ggdGhlIE1NVSBvZmYgYW5kIGp1bXAgdG8gMTogaW4gYSBzaW5nbGUgc3RlcC4KKwkgKi8KKworCW1yCXI4LCByMAorCW9yaSAgICAgcjgsIHI4LCBNU1JfUkl8TVNSX01FCisJbXRzcHIJU1BSTl9TUlIxLCByOAorCWFkZGkJcjgsIHI0LCAxZiAtIHJlbG9jYXRlX25ld19rZXJuZWwKKwltdHNwcglTUFJOX1NSUjAsIHI4CisJc3luYworCXJmaQorCisxOgorCS8qIGZyb20gdGhpcyBwb2ludCBhZGRyZXNzIHRyYW5zbGF0aW9uIGlzIHR1cm5lZCBvZmYgKi8KKwkvKiBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KKworCS8qIHNldCBhIG5ldyBzdGFjayBhdCB0aGUgYm90dG9tIG9mIG91ciBwYWdlLi4uICovCisJLyogKG5vdCByZWFsbHkgbmVlZGVkIG5vdykgKi8KKwlhZGRpCXIxLCByNCwgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUgLSA4IC8qIGZvciBMUiBTYXZlK0JhY2sgQ2hhaW4gKi8KKwlzdHcJcjAsIDAocjEpCisKKwkvKiBEbyB0aGUgY29waWVzICovCisJbGkJcjYsIDAgLyogY2hlY2tzdW0gKi8KKwltcglyMCwgcjMKKwliCTFmCisKKzA6CS8qIHRvcCwgcmVhZCBhbm90aGVyIHdvcmQgZm9yIHRoZSBpbmRpcmVjdGlvbiBwYWdlICovCisJbHd6dQlyMCwgNChyMykKKworMToKKwkvKiBpcyBpdCBhIGRlc3RpbmF0aW9uIHBhZ2U/IChyOCkgKi8KKwlybHdpbm0uCXI3LCByMCwgMCwgMzEsIDMxIC8qIElORF9ERVNUSU5BVElPTiAoMTw8MCkgKi8KKwliZXEJMmYKKworCXJsd2lubQlyOCwgcjAsIDAsIDAsIDE5IC8qIGNsZWFyIGtleGVjIGZsYWdzLCBwYWdlIGFsaWduICovCisJYgkwYgorCisyOgkvKiBpcyBpdCBhbiBpbmRpcmVjdGlvbiBwYWdlPyAocjMpICovCisJcmx3aW5tLglyNywgcjAsIDAsIDMwLCAzMCAvKiBJTkRfSU5ESVJFQ1RJT04gKDE8PDEpICovCisJYmVxCTJmCisKKwlybHdpbm0JcjMsIHIwLCAwLCAwLCAxOSAvKiBjbGVhciBrZXhlYyBmbGFncywgcGFnZSBhbGlnbiAqLworCXN1YmkJcjMsIHIzLCA0CisJYgkwYgorCisyOgkvKiBhcmUgd2UgZG9uZT8gKi8KKwlybHdpbm0uCXI3LCByMCwgMCwgMjksIDI5IC8qIElORF9ET05FICgxPDwyKSAqLworCWJlcQkyZgorCWIJM2YKKworMjoJLyogaXMgaXQgYSBzb3VyY2UgcGFnZT8gKHI5KSAqLworCXJsd2lubS4JcjcsIHIwLCAwLCAyOCwgMjggLyogSU5EX1NPVVJDRSAoMTw8MykgKi8KKwliZXEJMGIKKworCXJsd2lubQlyOSwgcjAsIDAsIDAsIDE5IC8qIGNsZWFyIGtleGVjIGZsYWdzLCBwYWdlIGFsaWduICovCisKKwlsaQlyNywgUEFHRV9TSVpFIC8gNAorCW10Y3RyICAgcjcKKwlzdWJpICAgIHI5LCByOSwgNAorCXN1YmkgICAgcjgsIHI4LCA0Cis5OgorCWx3enUgICAgcjAsIDQocjkpICAvKiBkbyB0aGUgY29weSAqLworCXhvcglyNiwgcjYsIHIwCisJc3R3dSAgICByMCwgNChyOCkKKwlkY2JzdAkwLCByOAorCXN5bmMKKwlpY2JpCTAsIHI4CisJYmRueiAgICA5YgorCisJYWRkaSAgICByOSwgcjksIDQKKwlhZGRpICAgIHI4LCByOCwgNAorCWIJMGIKKworMzoKKworCS8qIFRvIGJlIGNlcnRhaW4gb2YgYXZvaWRpbmcgcHJvYmxlbXMgd2l0aCBzZWxmLW1vZGlmeWluZyBjb2RlCisJICogZXhlY3V0ZSBhIHNlcmlhbGl6aW5nIGluc3RydWN0aW9uIGhlcmUuCisJICovCisJaXN5bmMKKwlzeW5jCisKKwkvKiBqdW1wIHRvIHRoZSBlbnRyeSBwb2ludCwgdXN1YWxseSB0aGUgc2V0dXAgcm91dGluZSAqLworCW10bHIJcjUKKwlibHJsCisKKzE6CWIJMWIKKworcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQ6CisKKwkuZ2xvYmwgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplCityZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU6CisJLmxvbmcgcmVsb2NhdGVfbmV3X2tlcm5lbF9lbmQgLSByZWxvY2F0ZV9uZXdfa2VybmVsCisKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvcHBjL2tlcm5lbC9zaWduYWwuYwppbmRleCA3Yzg0MzdkYS4uOGFhZWI2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC9zaWduYWwuYwpAQCAtNzA1LDggKzcwNSw3IEBACiAJdW5zaWduZWQgbG9uZyBmcmFtZSwgbmV3c3A7CiAJaW50IHNpZ25yLCByZXQ7CiAKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKLQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJaWYgKHRyeV90b19mcmVlemUoKSkgewogCQlzaWduciA9IDA7CiAJCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlnb3RvIG5vX3NpZ25hbDsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMgYi9hcmNoL3BwYy9rZXJuZWwvdGltZS5jCmluZGV4IDczNTg2NjUuLmJmNGRkY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGMva2VybmVsL3RpbWUuYwpAQCAtODksNiArODksOSBAQAogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB3YWxsX2ppZmZpZXM7CiAKKy8qIHVzZWQgZm9yIHRpbWV6b25lIG9mZnNldCAqLworc3RhdGljIGxvbmcgdGltZXpvbmVfb2Zmc2V0OworCiBERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOwogCiBFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKQEAgLTE3MCw3ICsxNzMsNyBAQAogCQkgICAgIHh0aW1lLnR2X3NlYyAtIGxhc3RfcnRjX3VwZGF0ZSA+PSA2NTkgJiYKIAkJICAgICBhYnMoKHh0aW1lLnR2X25zZWMgLyAxMDAwKSAtICgxMDAwMDAwLTEwMDAwMDAvSFopKSA8IDUwMDAwMC9IWiAmJgogCQkgICAgIGppZmZpZXMgLSB3YWxsX2ppZmZpZXMgPT0gMSkgewotCQkgIAlpZiAocHBjX21kLnNldF9ydGNfdGltZSh4dGltZS50dl9zZWMrMSArIHRpbWVfb2Zmc2V0KSA9PSAwKQorCQkgIAlpZiAocHBjX21kLnNldF9ydGNfdGltZSh4dGltZS50dl9zZWMrMSArIHRpbWV6b25lX29mZnNldCkgPT0gMCkKIAkJCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWMrMTsKIAkJCWVsc2UKIAkJCQkvKiBUcnkgYWdhaW4gb25lIG1pbnV0ZSBsYXRlciAqLwpAQCAtMjg2LDcgKzI4OSw3IEBACiAJdW5zaWduZWQgb2xkX3N0YW1wLCBzdGFtcCwgZWxhcHNlZDsKIAogICAgICAgICBpZiAocHBjX21kLnRpbWVfaW5pdCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHRpbWVfb2Zmc2V0ID0gcHBjX21kLnRpbWVfaW5pdCgpOworICAgICAgICAgICAgICAgIHRpbWV6b25lX29mZnNldCA9IHBwY19tZC50aW1lX2luaXQoKTsKIAogCWlmIChfX1VTRV9SVEMoKSkgewogCQkvKiA2MDEgcHJvY2Vzc29yOiBkZWMgY291bnRzIGRvd24gYnkgMTI4IGV2ZXJ5IDEyOG5zICovCkBAIC0zMzEsMTAgKzMzNCwxMCBAQAogCXNldF9kZWModGJfdGlja3NfcGVyX2ppZmZ5KTsKIAogCS8qIElmIHBsYXRmb3JtIHByb3ZpZGVkIGEgdGltZXpvbmUgKHBtYWMpLCB3ZSBjb3JyZWN0IHRoZSB0aW1lICovCi0gICAgICAgIGlmICh0aW1lX29mZnNldCkgewotCQlzeXNfdHoudHpfbWludXRlc3dlc3QgPSAtdGltZV9vZmZzZXQgLyA2MDsKKyAgICAgICAgaWYgKHRpbWV6b25lX29mZnNldCkgeworCQlzeXNfdHoudHpfbWludXRlc3dlc3QgPSAtdGltZXpvbmVfb2Zmc2V0IC8gNjA7CiAJCXN5c190ei50el9kc3R0aW1lID0gMDsKLQkJeHRpbWUudHZfc2VjIC09IHRpbWVfb2Zmc2V0OworCQl4dGltZS50dl9zZWMgLT0gdGltZXpvbmVfb2Zmc2V0OwogICAgICAgICB9CiAgICAgICAgIHNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3RyYXBzLmMgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwppbmRleCAyY2E4ZWNmLi45ZTZhZTU2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYwpAQCAtMTczLDEzICsxNzMsMTMgQEAKIC8qIE9uIDR4eCwgdGhlIHJlYXNvbiBmb3IgdGhlIG1hY2hpbmUgY2hlY2sgb3IgcHJvZ3JhbSBleGNlcHRpb24KICAgIGlzIGluIHRoZSBFU1IuICovCiAjZGVmaW5lIGdldF9yZWFzb24ocmVncykJKChyZWdzKS0+ZHNpc3IpCi0jaWZuZGVmIENPTkZJR19FNTAwCisjaWZuZGVmIENPTkZJR19GU0xfQk9PS0UKICNkZWZpbmUgZ2V0X21jX3JlYXNvbihyZWdzKQkoKHJlZ3MpLT5kc2lzcikKICNlbHNlCiAjZGVmaW5lIGdldF9tY19yZWFzb24ocmVncykJKG1mc3ByKFNQUk5fTUNTUikpCiAjZW5kaWYKICNkZWZpbmUgUkVBU09OX0ZQCQlFU1JfRlAKLSNkZWZpbmUgUkVBU09OX0lMTEVHQUwJCUVTUl9QSUwKKyNkZWZpbmUgUkVBU09OX0lMTEVHQUwJCShFU1JfUElMIHwgRVNSX1BVTykKICNkZWZpbmUgUkVBU09OX1BSSVZJTEVHRUQJRVNSX1BQUgogI2RlZmluZSBSRUFTT05fVFJBUAkJRVNSX1BUUgogCkBAIC0zMDIsNyArMzAyLDI1IEBACiAJCXByaW50aygiQnVzIC0gSW5zdHJ1Y3Rpb24gUGFyaXR5IEVycm9yXG4iKTsKIAlpZiAocmVhc29uICYgTUNTUl9CVVNfUlBFUlIpCiAJCXByaW50aygiQnVzIC0gUmVhZCBQYXJpdHkgRXJyb3JcbiIpOwotI2Vsc2UgLyogIUNPTkZJR180eHggJiYgIUNPTkZJR19FNTAwICovCisjZWxpZiBkZWZpbmVkIChDT05GSUdfRTIwMCkKKwlwcmludGsoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKKwlwcmludGsoIkNhdXNlZCBieSAoZnJvbSBNQ1NSPSVseCk6ICIsIHJlYXNvbik7CisKKwlpZiAocmVhc29uICYgTUNTUl9NQ1ApCisJCXByaW50aygiTWFjaGluZSBDaGVjayBTaWduYWxcbiIpOworCWlmIChyZWFzb24gJiBNQ1NSX0NQX1BFUlIpCisJCXByaW50aygiQ2FjaGUgUHVzaCBQYXJpdHkgRXJyb3JcbiIpOworCWlmIChyZWFzb24gJiBNQ1NSX0NQRVJSKQorCQlwcmludGsoIkNhY2hlIFBhcml0eSBFcnJvclxuIik7CisJaWYgKHJlYXNvbiAmIE1DU1JfRVhDUF9FUlIpCisJCXByaW50aygiSVNJLCBJVExCLCBvciBCdXMgRXJyb3Igb24gZmlyc3QgaW5zdHJ1Y3Rpb24gZmV0Y2ggZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyXG4iKTsKKwlpZiAocmVhc29uICYgTUNTUl9CVVNfSVJFUlIpCisJCXByaW50aygiQnVzIC0gUmVhZCBCdXMgRXJyb3Igb24gaW5zdHJ1Y3Rpb24gZmV0Y2hcbiIpOworCWlmIChyZWFzb24gJiBNQ1NSX0JVU19EUkVSUikKKwkJcHJpbnRrKCJCdXMgLSBSZWFkIEJ1cyBFcnJvciBvbiBkYXRhIGxvYWRcbiIpOworCWlmIChyZWFzb24gJiBNQ1NSX0JVU19XUkVSUikKKwkJcHJpbnRrKCJCdXMgLSBXcml0ZSBCdXMgRXJyb3Igb24gYnVmZmVyZWQgc3RvcmUgb3IgY2FjaGUgbGluZSBwdXNoXG4iKTsKKyNlbHNlIC8qICFDT05GSUdfNHh4ICYmICFDT05GSUdfRTUwMCAmJiAhQ09ORklHX0UyMDAgKi8KIAlwcmludGsoIk1hY2hpbmUgY2hlY2sgaW4ga2VybmVsIG1vZGUuXG4iKTsKIAlwcmludGsoIkNhdXNlZCBieSAoZnJvbSBTUlIxPSVseCk6ICIsIHJlYXNvbik7CiAJc3dpdGNoIChyZWFzb24gJiAweDYwMUYwMDAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS80NHhfbW11LmMgYi9hcmNoL3BwYy9tbS80NHhfbW11LmMKaW5kZXggNzJmN2MwZC4uM2Q3OWNlMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbW0vNDR4X21tdS5jCisrKyBiL2FyY2gvcHBjL21tLzQ0eF9tbXUuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tLzR4eF9tbXUuYyBiL2FyY2gvcHBjL21tLzR4eF9tbXUuYwppbmRleCBhN2Y2MTYxLi5iN2JjYmMyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS80eHhfbW11LmMKKysrIGIvYXJjaC9wcGMvbW0vNHh4X21tdS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vZnNsX2Jvb2tlX21tdS5jIGIvYXJjaC9wcGMvbW0vZnNsX2Jvb2tlX21tdS5jCmluZGV4IGUwNzk5MGUuLmFmOWNhMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL2ZzbF9ib29rZV9tbXUuYworKysgYi9hcmNoL3BwYy9tbS9mc2xfYm9va2VfbW11LmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KIAogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0xMjYsNyArMTI1LDcgQEAKIAkJZmxhZ3MgfD0gX1BBR0VfQ09IRVJFTlQ7CiAjZW5kaWYKIAotCVRMQkNBTVtpbmRleF0uTUFTMCA9IE1BUzBfVExCU0VMKDEpIHwgTUFTMF9FU0VMKGluZGV4KTsKKwlUTEJDQU1baW5kZXhdLk1BUzAgPSBNQVMwX1RMQlNFTCgxKSB8IE1BUzBfRVNFTChpbmRleCkgfCBNQVMwX05WKGluZGV4KzEpOwogCVRMQkNBTVtpbmRleF0uTUFTMSA9IE1BUzFfVkFMSUQgfCBNQVMxX0lQUk9UIHwgTUFTMV9UU0laRSh0c2l6ZSkgfCBNQVMxX1RJRChwaWQpOwogCVRMQkNBTVtpbmRleF0uTUFTMiA9IHZpcnQgJiBQQUdFX01BU0s7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL2luaXQuYyBiL2FyY2gvcHBjL21tL2luaXQuYwppbmRleCAzMzRlZjQxLi42MTY0YTJiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS9pbml0LmMKKysrIGIvYXJjaC9wcGMvbW0vaW5pdC5jCkBAIC02MDYsOSArNjA2LDE5IEBACiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKIAkJaWYgKCFQYWdlUmVzZXJ2ZWQocGFnZSkKIAkJICAgICYmICF0ZXN0X2JpdChQR19hcmNoXzEsICZwYWdlLT5mbGFncykpIHsKLQkJCWlmICh2bWEtPnZtX21tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkKKwkJCWlmICh2bWEtPnZtX21tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkgeworI2lmZGVmIENPTkZJR184eHgKKwkJCS8qIE9uIDh4eCwgY2FjaGUgY29udHJvbCBpbnN0cnVjdGlvbnMgKHBhcnRpY3VsYXJseSAKKwkJIAkgKiAiZGNic3QiIGZyb20gZmx1c2hfZGNhY2hlX2ljYWNoZSkgZmF1bHQgYXMgd3JpdGUgCisJCQkgKiBvcGVyYXRpb24gaWYgdGhlcmUgaXMgYW4gdW5wb3B1bGF0ZWQgVExCIGVudHJ5IAorCQkJICogZm9yIHRoZSBhZGRyZXNzIGluIHF1ZXN0aW9uLiBUbyB3b3JrYXJvdW5kIHRoYXQsIAorCQkJICogd2UgaW52YWxpZGF0ZSB0aGUgVExCIGhlcmUsIHRodXMgYXZvaWRpbmcgZGNic3QgCisJCQkgKiBtaXNiZWhhdmlvdXIuCisJCQkgKi8KKwkJCQlfdGxiaWUoYWRkcmVzcyk7CisjZW5kaWYKIAkJCQlfX2ZsdXNoX2RjYWNoZV9pY2FjaGUoKHZvaWQgKikgYWRkcmVzcyk7Ci0JCQllbHNlCisJCQl9IGVsc2UKIAkJCQlmbHVzaF9kY2FjaGVfaWNhY2hlX3BhZ2UocGFnZSk7CiAJCQlzZXRfYml0KFBHX2FyY2hfMSwgJnBhZ2UtPmZsYWdzKTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfc3lzLmMKaW5kZXggMzdlY2UxNS4uZGRkMDRkNCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzgzeHgvbXBjODM0eF9zeXMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X3N5cy5jCkBAIC05NCwyMCArOTQsMjQgQEAKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODN4eF9UU0VDMSk7Ci0JcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODN4eF9JUlFfRVhUMTsKLQlwZGF0YS0+cGh5aWQgPSAwOwotCS8qIGZpeHVwIHBoeSBhZGRyZXNzICovCi0JcGRhdGEtPnBoeV9yZWdfYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOwotCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CisJaWYgKHBkYXRhKSB7CisJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7CisJCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4M3h4X0lSUV9FWFQxOworCQlwZGF0YS0+cGh5aWQgPSAwOworCQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLworCQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CisJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CisJfQogCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4M3h4X1RTRUMyKTsKLQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4M3h4X0lSUV9FWFQyOwotCXBkYXRhLT5waHlpZCA9IDE7Ci0JLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KLQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7Ci0JbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXQxYWRkciwgNik7CisJaWYgKHBkYXRhKSB7CisJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7CisJCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4M3h4X0lSUV9FWFQyOworCQlwZGF0YS0+cGh5aWQgPSAxOworCQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLworCQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CisJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOworCX0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCWlmIChpbml0cmRfc3RhcnQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU0MF9hZHMuYwppbmRleCBhMmVkNjExLi5mNzYxZmRmIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTQwX2Fkcy5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NDBfYWRzLmMKQEAgLTkyLDI4ICs5MiwzNCBAQAogCiAJLyogc2V0dXAgdGhlIGJvYXJkIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbmV0IGNvbnRyb2xsZXJzICovCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMxKTsKLQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4NXh4X0lSUV9FWFQ1OwotCXBkYXRhLT5waHlpZCA9IDA7Ci0JLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KLQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7Ci0JbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKKwlpZiAocGRhdGEpIHsKKwkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKKwkJcGRhdGEtPmludGVycnVwdFBIWSA9IE1QQzg1eHhfSVJRX0VYVDU7CisJCXBkYXRhLT5waHlpZCA9IDA7CisJCS8qIGZpeHVwIHBoeSBhZGRyZXNzICovCisJCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKKwkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKKwl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzIpOwotCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JcGRhdGEtPmludGVycnVwdFBIWSA9IE1QQzg1eHhfSVJRX0VYVDU7Ci0JcGRhdGEtPnBoeWlkID0gMTsKLQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLwotCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKLQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKKwlpZiAocGRhdGEpIHsKKwkJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKKwkJcGRhdGEtPmludGVycnVwdFBIWSA9IE1QQzg1eHhfSVJRX0VYVDU7CisJCXBkYXRhLT5waHlpZCA9IDE7CisJCS8qIGZpeHVwIHBoeSBhZGRyZXNzICovCisJCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKKwkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXQxYWRkciwgNik7CisJfQogCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X0ZFQyk7Ci0JcGRhdGEtPmJvYXJkX2ZsYWdzID0gMDsKLQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNTsKLQlwZGF0YS0+cGh5aWQgPSAzOwotCS8qIGZpeHVwIHBoeSBhZGRyZXNzICovCi0JcGRhdGEtPnBoeV9yZWdfYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOwotCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MmFkZHIsIDYpOworCWlmIChwZGF0YSkgeworCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSAwOworCQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNTsKKwkJcGRhdGEtPnBoeWlkID0gMzsKKwkJLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KKwkJcGRhdGEtPnBoeV9yZWdfYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOworCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDJhZGRyLCA2KTsKKwl9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoaW5pdHJkX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmMKaW5kZXggZDg3ZGZkNS4uZTE4MzgwMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODU2MF9hZHMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTYwX2Fkcy5jCkBAIC05MCwyMCArOTAsMjQgQEAKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7Ci0JcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNTsKLQlwZGF0YS0+cGh5aWQgPSAwOwotCS8qIGZpeHVwIHBoeSBhZGRyZXNzICovCi0JcGRhdGEtPnBoeV9yZWdfYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOwotCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CisJaWYgKHBkYXRhKSB7CisJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7CisJCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4NXh4X0lSUV9FWFQ1OworCQlwZGF0YS0+cGh5aWQgPSAwOworCQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLworCQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CisJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CisJfQogCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMyKTsKLQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOwotCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4NXh4X0lSUV9FWFQ1OwotCXBkYXRhLT5waHlpZCA9IDE7Ci0JLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KLQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7Ci0JbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXQxYWRkciwgNik7CisJaWYgKHBkYXRhKSB7CisJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7CisJCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4NXh4X0lSUV9FWFQ1OworCQlwZGF0YS0+cGh5aWQgPSAxOworCQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLworCQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CisJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0MWFkZHIsIDYpOworCX0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCWlmIChpbml0cmRfc3RhcnQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKaW5kZXggM2RiZGQ3My4uMTY1ZGY5NCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwpAQCAtMTI5LDIwICsxMjksMjQgQEAKIAogCS8qIHNldHVwIHRoZSBib2FyZCByZWxhdGVkIGluZm9ybWF0aW9uIGZvciB0aGUgZW5ldCBjb250cm9sbGVycyAqLwogCXBkYXRhID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcHBjX3N5c19nZXRfcGRhdGEoTVBDODV4eF9UU0VDMSk7Ci0JcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsKLQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNjsKLQlwZGF0YS0+cGh5aWQgPSAyNTsKLQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLwotCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKLQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOworCWlmIChwZGF0YSkgeworCQlwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOworCQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNjsKKwkJcGRhdGEtPnBoeWlkID0gMjU7CisJCS8qIGZpeHVwIHBoeSBhZGRyZXNzICovCisJCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKKwkJbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXRhZGRyLCA2KTsKKwl9CiAKIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzIpOwotCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7Ci0JcGRhdGEtPmludGVycnVwdFBIWSA9IE1QQzg1eHhfSVJRX0VYVDc7Ci0JcGRhdGEtPnBoeWlkID0gMjY7Ci0JLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KLQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7Ci0JbWVtY3B5KHBkYXRhLT5tYWNfYWRkciwgYmluZm8tPmJpX2VuZXQxYWRkciwgNik7CisJaWYgKHBkYXRhKSB7CisJCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7CisJCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4NXh4X0lSUV9FWFQ3OworCQlwZGF0YS0+cGh5aWQgPSAyNjsKKwkJLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KKwkJcGRhdGEtPnBoeV9yZWdfYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOworCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKKwl9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoaW5pdHJkX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jCmluZGV4IDk0NTViYjYuLmJiNDEyNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMKQEAgLTEyMiwxOSArMTIyLDIzIEBACiAKIAkvKiBzZXR1cCB0aGUgYm9hcmQgcmVsYXRlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVuZXQgY29udHJvbGxlcnMgKi8KIAlwZGF0YSA9IChzdHJ1Y3QgZ2lhbmZhcl9wbGF0Zm9ybV9kYXRhICopIHBwY19zeXNfZ2V0X3BkYXRhKE1QQzg1eHhfVFNFQzEpOwotLyoJcGRhdGEtPmJvYXJkX2ZsYWdzID0gRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUjsgKi8KLQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNTsKLQlwZGF0YS0+cGh5aWQgPSAyOwotCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKLQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldGFkZHIsIDYpOworCWlmIChwZGF0YSkgeworCS8qCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7ICovCisJCXBkYXRhLT5pbnRlcnJ1cHRQSFkgPSBNUEM4NXh4X0lSUV9FWFQ1OworCQlwZGF0YS0+cGh5aWQgPSAyOworCQlwZGF0YS0+cGh5X3JlZ19hZGRyICs9IGJpbmZvLT5iaV9pbW1yX2Jhc2U7CisJCW1lbWNweShwZGF0YS0+bWFjX2FkZHIsIGJpbmZvLT5iaV9lbmV0YWRkciwgNik7CisJfQogCiAJcGRhdGEgPSAoc3RydWN0IGdpYW5mYXJfcGxhdGZvcm1fZGF0YSAqKSBwcGNfc3lzX2dldF9wZGF0YShNUEM4NXh4X1RTRUMyKTsKLS8qCXBkYXRhLT5ib2FyZF9mbGFncyA9IEZTTF9HSUFORkFSX0JSRF9IQVNfUEhZX0lOVFI7ICovCi0JcGRhdGEtPmludGVycnVwdFBIWSA9IE1QQzg1eHhfSVJRX0VYVDU7Ci0JcGRhdGEtPnBoeWlkID0gNDsKLQkvKiBmaXh1cCBwaHkgYWRkcmVzcyAqLwotCXBkYXRhLT5waHlfcmVnX2FkZHIgKz0gYmluZm8tPmJpX2ltbXJfYmFzZTsKLQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKKwlpZiAocGRhdGEpIHsKKwkvKglwZGF0YS0+Ym9hcmRfZmxhZ3MgPSBGU0xfR0lBTkZBUl9CUkRfSEFTX1BIWV9JTlRSOyAqLworCQlwZGF0YS0+aW50ZXJydXB0UEhZID0gTVBDODV4eF9JUlFfRVhUNTsKKwkJcGRhdGEtPnBoeWlkID0gNDsKKwkJLyogZml4dXAgcGh5IGFkZHJlc3MgKi8KKwkJcGRhdGEtPnBoeV9yZWdfYWRkciArPSBiaW5mby0+YmlfaW1tcl9iYXNlOworCQltZW1jcHkocGRhdGEtPm1hY19hZGRyLCBiaW5mby0+YmlfZW5ldDFhZGRyLCA2KTsKKwl9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoaW5pdHJkX3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL2NocnBfcGNpLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvY2hycF9wY2kuYwppbmRleCA3ZDBlZTMwLi43ZDNmYmI1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvY2hycF9wY2kuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvY2hycF9wY2kuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9mYWRzLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvZmFkcy5oCmluZGV4IDYzMmI4MTcuLmI2MGM1NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9mYWRzLmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2ZhZHMuaApAQCAtMyw3ICszLDE4IEBACiAgKiB0aGUgTW90b3JvbGEgODYwVCBGQURTIGJvYXJkLiAgQ29waWVkIGZyb20gdGhlIE1CWCBzdHVmZi4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTggRGFuIE1hbGVrIChkbWFsZWtAamxjLm5ldCkKKyAqCisgKiBBZGRlZCBNUEM4NlhBRFMgc3VwcG9ydC4KKyAqIFRoZSBNUEM4NnhBRFMgbWFudWFsIHNheXMgdGhlIGJvYXJkICJpcyBjb21wYXRpYmxlIHdpdGggdGhlIE1QQzh4eEZBRFMKKyAqIGZvciBTVyBwb2ludCBvZiB2aWV3Ii4gVGhpcyBpcyA5OSUgY29ycmVjdC4KKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqIDIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQKKyAqICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCisKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNNX0ZBRFNfSF9fCiAjZGVmaW5lIF9fQVNNX0ZBRFNfSF9fCkBAIC0xMiwxOCArMjMsNDUgQEAKIAogI2luY2x1ZGUgPGFzbS9wcGNib290Lmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19NUEM4NlhBRFMpCisKKy8qIFUtQm9vdCBtYXBzIEJDU1IgdG8gMHhmZjA4MDAwMCAqLworI2RlZmluZSBCQ1NSX0FERFIJCSgodWludCkweGZmMDgwMDAwKQorCisvKiBNUEM4NlhBRFMgaGFzIG9uZSBtb3JlIENQTEQgYW5kIGFuIGFkZGl0aW9uYWwgQkNTUi4KKyAqLworI2RlZmluZSBDRkdfUEhZREVWX0FERFIJCSgodWludCkweGZmMGEwMDAwKQorI2RlZmluZSBCQ1NSNQkJCSgodWludCkoQ0ZHX1BIWURFVl9BRERSICsgMHgzMDApKQorCisjZGVmaW5lIEJDU1I1X1QxX1JTVAkJMHgxMAorI2RlZmluZSBCQ1NSNV9BVE0xNTVfUlNUCTB4MDgKKyNkZWZpbmUgQkNTUjVfQVRNMjVfUlNUCQkweDA0CisjZGVmaW5lIEJDU1I1X01JSTFfRU4JCTB4MDIKKyNkZWZpbmUgQkNTUjVfTUlJMV9SU1QJCTB4MDEKKworLyogVGhlcmUgaXMgbm8gUEhZIGxpbmsgY2hhbmdlIGludGVycnVwdCAqLworI2RlZmluZSBQSFlfSU5URVJSVVBUCSgtMSkKKworI2Vsc2UgLyogRkFEUyAqLworCiAvKiBNZW1vcnkgbWFwIGlzIGNvbmZpZ3VyZWQgYnkgdGhlIFBST00gc3RhcnR1cC4KICAqIEkgdHJpZWQgdG8gZm9sbG93IHRoZSBGQURTIG1hbnVhbCwgYWx0aG91Z2ggdGhlIHN0YXJ0dXAgUFJPTQogICogZGljdGF0ZXMgdGhpcyBhbmQgd2Ugc2ltcGx5IGhhdmUgdG8gbW92ZSBzb21lIG9mIHRoZSBwaHlzaWNhbAogICogYWRkcmVzc2VzIGZvciBMaW51eC4KICAqLwogI2RlZmluZSBCQ1NSX0FERFIJCSgodWludCkweGZmMDEwMDAwKQorCisvKiBQSFkgbGluayBjaGFuZ2UgaW50ZXJydXB0ICovCisjZGVmaW5lIFBIWV9JTlRFUlJVUFQJU0lVX0lSUTIKKworI2VuZGlmIC8qIENPTkZJR19NUEM4NlhBRFMgKi8KKwogI2RlZmluZSBCQ1NSX1NJWkUJCSgodWludCkoNjQgKiAxMDI0KSkKLSNkZWZpbmUJQkNTUjAJCQkoKHVpbnQpMHhmZjAxMDAwMCkKLSNkZWZpbmUJQkNTUjEJCQkoKHVpbnQpMHhmZjAxMDAwNCkKLSNkZWZpbmUJQkNTUjIJCQkoKHVpbnQpMHhmZjAxMDAwOCkKLSNkZWZpbmUJQkNTUjMJCQkoKHVpbnQpMHhmZjAxMDAwYykKLSNkZWZpbmUJQkNTUjQJCQkoKHVpbnQpMHhmZjAxMDAxMCkKKyNkZWZpbmUgQkNTUjAJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MDApKQorI2RlZmluZSBCQ1NSMQkJCSgodWludCkoQkNTUl9BRERSICsgMHgwNCkpCisjZGVmaW5lIEJDU1IyCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDA4KSkKKyNkZWZpbmUgQkNTUjMJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MGMpKQorI2RlZmluZSBCQ1NSNAkJCSgodWludCkoQkNTUl9BRERSICsgMHgxMCkpCiAKICNkZWZpbmUgSU1BUF9BRERSCQkoKHVpbnQpMHhmZjAwMDAwMCkKICNkZWZpbmUgSU1BUF9TSVpFCQkoKHVpbnQpKDY0ICogMTAyNCkpCkBAIC0zNCw4ICs3MiwxNyBAQAogLyogQml0cyBvZiBpbnRlcmVzdCBpbiB0aGUgQkNTUnMuCiAgKi8KICNkZWZpbmUgQkNTUjFfRVRIRU4JCSgodWludCkweDIwMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9JUkRBRU4JCSgodWludCkweDEwMDAwMDAwKQogI2RlZmluZSBCQ1NSMV9SUzIzMkVOXzEJCSgodWludCkweDAxMDAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NFTgkJKCh1aW50KTB4MDA4MDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQzAJCSgodWludCkweDAwNDAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWUFAwCQkoKHVpbnQpMHgwMDIwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVlBQMQkJKCh1aW50KTB4MDAxMDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZQUF9NQVNLCShCQ1NSMV9QQ0NWUFAwIHwgQkNTUjFfUENDVlBQMSkKICNkZWZpbmUgQkNTUjFfUlMyMzJFTl8yCQkoKHVpbnQpMHgwMDA0MDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVkNDMQkJKCh1aW50KTB4MDAwMTAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZDQ19NQVNLCShCQ1NSMV9QQ0NWQ0MwIHwgQkNTUjFfUENDVkNDMSkKKwogI2RlZmluZSBCQ1NSNF9FVEhMT09QCQkoKHVpbnQpMHg4MDAwMDAwMCkJLyogRUVTVCBMb29wYmFjayAqLwogI2RlZmluZSBCQ1NSNF9FRUZEWAkJKCh1aW50KTB4NDAwMDAwMDApCS8qIEVFU1QgRkRYIGVuYWJsZSAqLwogI2RlZmluZSBCQ1NSNF9GRVRIX0VOCQkoKHVpbnQpMHgwODAwMDAwMCkJLyogUEhZIGVuYWJsZSAqLwpAQCAtNDQsMTQgKzkxLDY0IEBACiAjZGVmaW5lIEJDU1I0X0ZFVEhGREUJCSgodWludCkweDAyMDAwMDAwKQkvKiBQSFkgRkRYIGFkdmVydGlzZSAqLwogI2RlZmluZSBCQ1NSNF9GRVRIUlNUCQkoKHVpbnQpMHgwMDIwMDAwMCkJLyogUEhZIFJlc2V0ICovCiAKKy8qIElPX0JBU0UgZGVmaW5pdGlvbiBmb3IgcGNtY2lhLgorICovCisjZGVmaW5lIF9JT19CQVNFCTB4ODAwMDAwMDAKKyNkZWZpbmUgX0lPX0JBU0VfU0laRQkweDEwMDAKKworI2lmZGVmIENPTkZJR19JREUKKyNkZWZpbmUgTUFYX0hXSUZTIDEKKyNlbmRpZgorCiAvKiBJbnRlcnJ1cHQgbGV2ZWwgYXNzaWdubWVudHMuCiAgKi8KICNkZWZpbmUgRkVDX0lOVEVSUlVQVAlTSVVfTEVWRUwxCS8qIEZFQyBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgUEhZX0lOVEVSUlVQVAlTSVVfSVJRMgkvKiBQSFkgbGluayBjaGFuZ2UgaW50ZXJydXB0ICovCiAKIC8qIFdlIGRvbid0IHVzZSB0aGUgODI1OS4KICAqLwogI2RlZmluZSBOUl84MjU5X0lOVFMJMAogCisvKiBDUE0gRXRoZXJuZXQgdGhyb3VnaCBTQ0MxIG9yIFNDQzIgKi8KKworI2lmZGVmIENPTkZJR19TQ0MxX0VORVQJCS8qIFByb2JhYmx5IDg2MCB2YXJpYW50ICovCisvKiBCaXRzIGluIHBhcmFsbGVsIEkvTyBwb3J0IHJlZ2lzdGVycyB0aGF0IGhhdmUgdG8gYmUgc2V0L2NsZWFyZWQKKyAqIHRvIGNvbmZpZ3VyZSB0aGUgcGlucyBmb3IgU0NDMSB1c2UuCisgKiBUQ0xLIC0gQ0xLMSwgUkNMSyAtIENMSzIuCisgKi8KKyNkZWZpbmUgUEFfRU5FVF9SWEQJKCh1c2hvcnQpMHgwMDAxKQorI2RlZmluZSBQQV9FTkVUX1RYRAkoKHVzaG9ydCkweDAwMDIpCisjZGVmaW5lIFBBX0VORVRfVENMSwkoKHVzaG9ydCkweDAxMDApCisjZGVmaW5lIFBBX0VORVRfUkNMSwkoKHVzaG9ydCkweDAyMDApCisjZGVmaW5lIFBCX0VORVRfVEVOQQkoKHVpbnQpMHgwMDAwMTAwMCkKKyNkZWZpbmUgUENfRU5FVF9DTFNOCSgodXNob3J0KTB4MDAxMCkKKyNkZWZpbmUgUENfRU5FVF9SRU5BCSgodXNob3J0KTB4MDAyMCkKKworLyogQ29udHJvbCBiaXRzIGluIHRoZSBTSUNSIHRvIHJvdXRlIFRDTEsgKENMSzEpIGFuZCBSQ0xLIChDTEsyKSB0bworICogU0NDMS4gIEFsc28sIG1ha2Ugc3VyZSBHUjEgKGJpdCAyNCkgYW5kIFNDMSAoYml0IDI1KSBhcmUgemVyby4KKyAqLworI2RlZmluZSBTSUNSX0VORVRfTUFTSwkoKHVpbnQpMHgwMDAwMDBmZikKKyNkZWZpbmUgU0lDUl9FTkVUX0NMS1JUCSgodWludCkweDAwMDAwMDJjKQorI2VuZGlmIC8qIENPTkZJR19TQ0MxX0VORVQgKi8KKworI2lmZGVmIENPTkZJR19TQ0MyX0VORVQJCS8qIFByb2JhYmx5IDgyMy84NTAgdmFyaWFudCAqLworLyogQml0cyBpbiBwYXJhbGxlbCBJL08gcG9ydCByZWdpc3RlcnMgdGhhdCBoYXZlIHRvIGJlIHNldC9jbGVhcmVkCisgKiB0byBjb25maWd1cmUgdGhlIHBpbnMgZm9yIFNDQzEgdXNlLgorICogVENMSyAtIENMSzEsIFJDTEsgLSBDTEsyLgorICovCisjZGVmaW5lIFBBX0VORVRfUlhECSgodXNob3J0KTB4MDAwNCkKKyNkZWZpbmUgUEFfRU5FVF9UWEQJKCh1c2hvcnQpMHgwMDA4KQorI2RlZmluZSBQQV9FTkVUX1RDTEsJKCh1c2hvcnQpMHgwNDAwKQorI2RlZmluZSBQQV9FTkVUX1JDTEsJKCh1c2hvcnQpMHgwMjAwKQorI2RlZmluZSBQQl9FTkVUX1RFTkEJKCh1aW50KTB4MDAwMDIwMDApCisjZGVmaW5lIFBDX0VORVRfQ0xTTgkoKHVzaG9ydCkweDAwNDApCisjZGVmaW5lIFBDX0VORVRfUkVOQQkoKHVzaG9ydCkweDAwODApCisKKy8qIENvbnRyb2wgYml0cyBpbiB0aGUgU0lDUiB0byByb3V0ZSBUQ0xLIGFuZCBSQ0xLIHRvCisgKiBTQ0MyLiAgQWxzbywgbWFrZSBzdXJlIEdSMSAoYml0IDI0KSBhbmQgU0MxIChiaXQgMjUpIGFyZSB6ZXJvLgorICovCisjZGVmaW5lIFNJQ1JfRU5FVF9NQVNLCSgodWludCkweDAwMDBmZjAwKQorI2RlZmluZSBTSUNSX0VORVRfQ0xLUlQJKCh1aW50KTB4MDAwMDJlMDApCisjZW5kaWYgLyogQ09ORklHX1NDQzJfRU5FVCAqLworCiAjZW5kaWYgLyogX19BU01fRkFEU19IX18gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmMKaW5kZXggZWRhOTIyYS4uMTY5ZGJmNiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL2thdGFuYS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9rYXRhbmEuYwpAQCAtMjcsMTIgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXY2NDN4eC5oPgogI2lmZGVmIENPTkZJR19CT09USU1HCiAjaW5jbHVkZSA8bGludXgvYm9vdGltZy5oPgogI2VuZGlmCisjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4ODVhZHMuaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tcGM4ODVhZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjM4NjYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21wYzg4NWFkcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBBIGNvbGxlY3Rpb24gb2Ygc3RydWN0dXJlcywgYWRkcmVzc2VzLCBhbmQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aAorICogdGhlIEZyZWVzY2FsZSBNUEM4ODVBRFMgYm9hcmQuCisgKiBDb3BpZWQgZnJvbSB0aGUgRkFEUyBzdHVmZi4KKyAqCisgKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqICAgICAgICAgc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAyMDA1IChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkCisgKiAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaWZkZWYgX19LRVJORUxfXworI2lmbmRlZiBfX0FTTV9NUEM4ODVBRFNfSF9fCisjZGVmaW5lIF9fQVNNX01QQzg4NUFEU19IX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8YXNtL3BwY2Jvb3QuaD4KKworLyogVS1Cb290IG1hcHMgQkNTUiB0byAweGZmMDgwMDAwICovCisjZGVmaW5lIEJDU1JfQUREUgkJKCh1aW50KTB4ZmYwODAwMDApCisjZGVmaW5lIEJDU1JfU0laRQkJKCh1aW50KTMyKQorI2RlZmluZSBCQ1NSMAkJCSgodWludCkoQkNTUl9BRERSICsgMHgwMCkpCisjZGVmaW5lIEJDU1IxCQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDA0KSkKKyNkZWZpbmUgQkNTUjIJCQkoKHVpbnQpKEJDU1JfQUREUiArIDB4MDgpKQorI2RlZmluZSBCQ1NSMwkJCSgodWludCkoQkNTUl9BRERSICsgMHgwYykpCisjZGVmaW5lIEJDU1I0CQkJKCh1aW50KShCQ1NSX0FERFIgKyAweDEwKSkKKworI2RlZmluZSBDRkdfUEhZREVWX0FERFIJCSgodWludCkweGZmMGEwMDAwKQorI2RlZmluZSBCQ1NSNQkJCSgodWludCkoQ0ZHX1BIWURFVl9BRERSICsgMHgzMDApKQorCisjZGVmaW5lIElNQVBfQUREUgkJKCh1aW50KTB4ZmYwMDAwMDApCisjZGVmaW5lIElNQVBfU0laRQkJKCh1aW50KSg2NCAqIDEwMjQpKQorCisjZGVmaW5lIFBDTUNJQV9NRU1fQUREUgkJKCh1aW50KTB4ZmYwMjAwMDApCisjZGVmaW5lIFBDTUNJQV9NRU1fU0laRQkJKCh1aW50KSg2NCAqIDEwMjQpKQorCisvKiBCaXRzIG9mIGludGVyZXN0IGluIHRoZSBCQ1NScy4KKyAqLworI2RlZmluZSBCQ1NSMV9FVEhFTgkJKCh1aW50KTB4MjAwMDAwMDApCisjZGVmaW5lIEJDU1IxX0lSREFFTgkJKCh1aW50KTB4MTAwMDAwMDApCisjZGVmaW5lIEJDU1IxX1JTMjMyRU5fMQkJKCh1aW50KTB4MDEwMDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ0VOCQkoKHVpbnQpMHgwMDgwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVkNDMAkJKCh1aW50KTB4MDA0MDAwMDApCisjZGVmaW5lIEJDU1IxX1BDQ1ZQUDAJCSgodWludCkweDAwMjAwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWUFAxCQkoKHVpbnQpMHgwMDEwMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVlBQX01BU0sJKEJDU1IxX1BDQ1ZQUDAgfCBCQ1NSMV9QQ0NWUFAxKQorI2RlZmluZSBCQ1NSMV9SUzIzMkVOXzIJCSgodWludCkweDAwMDQwMDAwKQorI2RlZmluZSBCQ1NSMV9QQ0NWQ0MxCQkoKHVpbnQpMHgwMDAxMDAwMCkKKyNkZWZpbmUgQkNTUjFfUENDVkNDX01BU0sJKEJDU1IxX1BDQ1ZDQzAgfCBCQ1NSMV9QQ0NWQ0MxKQorCisjZGVmaW5lIEJDU1I0X0VUSDEwX1JTVAkJKCh1aW50KTB4ODAwMDAwMDApCS8qIDEwQmFzZS1UIFBIWSByZXNldCovCisjZGVmaW5lIEJDU1I0X1VTQl9MT19TUEQJKCh1aW50KTB4MDQwMDAwMDApCisjZGVmaW5lIEJDU1I0X1VTQl9WQ0MJCSgodWludCkweDAyMDAwMDAwKQorI2RlZmluZSBCQ1NSNF9VU0JfRlVMTF9TUEQJKCh1aW50KTB4MDAwNDAwMDApCisjZGVmaW5lIEJDU1I0X1VTQl9FTgkJKCh1aW50KTB4MDAwMjAwMDApCisKKyNkZWZpbmUgQkNTUjVfTUlJMl9FTgkJMHg0MAorI2RlZmluZSBCQ1NSNV9NSUkyX1JTVAkJMHgyMAorI2RlZmluZSBCQ1NSNV9UMV9SU1QJCTB4MTAKKyNkZWZpbmUgQkNTUjVfQVRNMTU1X1JTVAkweDA4CisjZGVmaW5lIEJDU1I1X0FUTTI1X1JTVAkJMHgwNAorI2RlZmluZSBCQ1NSNV9NSUkxX0VOCQkweDAyCisjZGVmaW5lIEJDU1I1X01JSTFfUlNUCQkweDAxCisKKy8qIEludGVycnVwdCBsZXZlbCBhc3NpZ25tZW50cyAqLworI2RlZmluZSBQSFlfSU5URVJSVVBUCVNJVV9JUlE3CS8qIFBIWSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0lVX0lOVF9GRUMxCVNJVV9MRVZFTDEJLyogRkVDMSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0lVX0lOVF9GRUMyCVNJVV9MRVZFTDMJLyogRkVDMiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRkVDX0lOVEVSUlVQVAlTSVVfSU5UX0ZFQzEJLyogRkVDIGludGVycnVwdCAqLworCisvKiBXZSBkb24ndCB1c2UgdGhlIDgyNTkgKi8KKyNkZWZpbmUgTlJfODI1OV9JTlRTCTAKKworLyogQ1BNIEV0aGVybmV0IHRocm91Z2ggU0NDMyAqLworI2RlZmluZSBQQV9FTkVUX1JYRAkoKHVzaG9ydCkweDAwNDApCisjZGVmaW5lIFBBX0VORVRfVFhECSgodXNob3J0KTB4MDA4MCkKKyNkZWZpbmUgUEVfRU5FVF9UQ0xLCSgodWludCkweDAwMDA0MDAwKQorI2RlZmluZSBQRV9FTkVUX1JDTEsJKCh1aW50KTB4MDAwMDgwMDApCisjZGVmaW5lIFBFX0VORVRfVEVOQQkoKHVpbnQpMHgwMDAwMDAxMCkKKyNkZWZpbmUgUENfRU5FVF9DTFNOCSgodXNob3J0KTB4MDQwMCkKKyNkZWZpbmUgUENfRU5FVF9SRU5BCSgodXNob3J0KTB4MDgwMCkKKworLyogQ29udHJvbCBiaXRzIGluIHRoZSBTSUNSIHRvIHJvdXRlIFRDTEsgKENMSzUpIGFuZCBSQ0xLIChDTEs2KSB0bworICogU0NDMy4gIEFsc28sIG1ha2Ugc3VyZSBHUjMgKGJpdCA4KSBhbmQgU0MzIChiaXQgOSkgYXJlIHplcm8gKi8KKyNkZWZpbmUgU0lDUl9FTkVUX01BU0sJKCh1aW50KTB4MDBmZjAwMDApCisjZGVmaW5lIFNJQ1JfRU5FVF9DTEtSVAkoKHVpbnQpMHgwMDJjMDAwMCkKKworI2VuZGlmIC8qIF9fQVNNX01QQzg4NUFEU19IX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jcHVmcmVxLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19jcHVmcmVxLmMKaW5kZXggNWZkZDRmNi4uYzA2MDUyNCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfY3B1ZnJlcS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX2NwdWZyZXEuYwpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJcmV0dXJuIG9mZnNldDsKIH0KIAotc3RhdGljIGludCBfX3BtYWMgcG1hY19jcHVmcmVxX3N1c3BlbmQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbnQgX19wbWFjIHBtYWNfY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZykKIHsKIAkvKiBPaywgdGhpcyBjb3VsZCBiZSBtYWRlIGEgYml0IHNtYXJ0ZXIsIGJ1dCBsZXQncyBiZSByb2J1c3QgZm9yIG5vdy4gV2UKIAkgKiBhbHdheXMgZm9yY2UgYSBzcGVlZCBjaGFuZ2UgdG8gaGlnaCBzcGVlZCBiZWZvcmUgc2xlZXAsIHRvIG1ha2Ugc3VyZQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfcGNpLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19wY2kuYwppbmRleCBmNmZmNTE5Li43MTlmYjQ5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19wY2kuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19wY2kuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc2xlZXAuUyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3NsZWVwLlMKaW5kZXggZjQ1OWFkZS4uMDE2YTc0NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfc2xlZXAuUworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY19zbGVlcC5TCkBAIC00Niw3ICs0Niw3IEBACiAJLnNlY3Rpb24gLnRleHQKIAkuYWxpZ24JNQogCi0jaWYgZGVmaW5lZChDT05GSUdfUE1BQ19QQk9PSykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfUE1BQykKKyNpZiBkZWZpbmVkKENPTkZJR19QTSkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVFfUE1BQykKIAogLyogVGhpcyBnZXRzIGNhbGxlZCBieSB2aWEtcG11LmMgbGF0ZSBkdXJpbmcgdGhlIHNsZWVwIHByb2Nlc3MuCiAgKiBUaGUgUE1VIHdhcyBhbHJlYWR5IHNlbmQgdGhlIHNsZWVwIGNvbW1hbmQgYW5kIHdpbGwgc2h1dCB1cyBkb3duCkBAIC0zODIsNyArMzgyLDcgQEAKIAlpc3luYwogCXJmaQogCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE1BQ19QQk9PSykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX0ZSRVEpICovCisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX0NQVV9GUkVRKSAqLwogCiAJLnNlY3Rpb24gLmRhdGEKIAkuYmFsaWduCUwxX0NBQ0hFX0xJTkVfU0laRQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfdGltZS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BtYWNfdGltZS5jCmluZGV4IGRlNjBjY2MuLjc3OGNlNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wbWFjX3RpbWUuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcG1hY190aW1lLmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogCXJldHVybiAxOwogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIC8qCiAgKiBSZXNldCB0aGUgdGltZSBhZnRlciBhIHNsZWVwLgogICovCkBAIC0yMzgsNyArMjM4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyIHRpbWVfc2xlZXBfbm90aWZpZXIgX19wbWFjZGF0YSA9IHsKIAl0aW1lX3NsZWVwX25vdGlmeSwgU0xFRVBfTEVWRUxfTUlTQywKIH07Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogLyoKICAqIFF1ZXJ5IHRoZSBPRiBhbmQgZ2V0IHRoZSBkZWNyIGZyZXF1ZW5jeS4KQEAgLTI1MSw5ICsyNTEsOSBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1OwogCXVuc2lnbmVkIGludCBmcmVxLCAqZnA7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogCXBtdV9yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcigmdGltZV9zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogCS8qIFdlIGFzc3VtZSBNYWNSSVNDMiBtYWNoaW5lcyBoYXZlIGNvcnJlY3QgZGV2aWNlLXRyZWUKIAkgKiBjYWxpYnJhdGlvbi4gVGhhdCdzIGJldHRlciBzaW5jZSB0aGUgVklBIGl0c2VsZiBzZWVtcwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3NhbmRwb2ludC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3NhbmRwb2ludC5jCmluZGV4IDcwZTU4ZjQuLjhiMTQ5YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9zYW5kcG9pbnQuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvc2FuZHBvaW50LmMKQEAgLTMyNCw2ICszMjQsNyBAQAogCQkJcGRhdGFbMV0uaXJxID0gMDsKIAkJCXBkYXRhWzFdLm1hcGJhc2UgPSAwOwogCQl9CisJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTW90b3JvbGEgU1BTIFNhbmRwb2ludCBUZXN0IFBsYXRmb3JtXG4iKTsKIAlwcmludGsoS0VSTl9JTkZPICJQb3J0IGJ5IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gKHNvdXJjZUBtdmlzdGEuY29tKVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvY3BtMl9jb21tb24uYyBiL2FyY2gvcHBjL3N5c2xpYi9jcG0yX2NvbW1vbi5jCmluZGV4IGVhNWU3NzAuLjRjMTlhNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9jcG0yX2NvbW1vbi5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9jcG0yX2NvbW1vbi5jCkBAIC0yMSw4ICsyMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9tcGM4MjYwLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYyBiL2FyY2gvcHBjL3N5c2xpYi9pbmRpcmVjdF9wY2kuYwppbmRleCBhNWE3NTI2Li5lNzE0ODg0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvaW5kaXJlY3RfcGNpLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL2luZGlyZWN0X3BjaS5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9pcGljLmMgYi9hcmNoL3BwYy9zeXNsaWIvaXBpYy5jCmluZGV4IDU4MGVkNjUuLjhmMDFlMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9pcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL2lwaWMuYwpAQCAtNzksNyArNzksNyBAQAogCQkucHJpb19tYXNrID0gNywKIAl9LAogCVsxN10gPSB7Ci0JCS5wZW5kCT0gSVBJQ19TSVBOUl9ILAorCQkucGVuZAk9IElQSUNfU0VQTlIsCiAJCS5tYXNrCT0gSVBJQ19TRU1TUiwKIAkJLnByaW8JPSBJUElDX1NNUFJSX0EsCiAJCS5mb3JjZQk9IElQSUNfU0VGQ1IsCkBAIC04Nyw3ICs4Nyw3IEBACiAJCS5wcmlvX21hc2sgPSA1LAogCX0sCiAJWzE4XSA9IHsKLQkJLnBlbmQJPSBJUElDX1NJUE5SX0gsCisJCS5wZW5kCT0gSVBJQ19TRVBOUiwKIAkJLm1hc2sJPSBJUElDX1NFTVNSLAogCQkucHJpbwk9IElQSUNfU01QUlJfQSwKIAkJLmZvcmNlCT0gSVBJQ19TRUZDUiwKQEAgLTk1LDcgKzk1LDcgQEAKIAkJLnByaW9fbWFzayA9IDYsCiAJfSwKIAlbMTldID0gewotCQkucGVuZAk9IElQSUNfU0lQTlJfSCwKKwkJLnBlbmQJPSBJUElDX1NFUE5SLAogCQkubWFzawk9IElQSUNfU0VNU1IsCiAJCS5wcmlvCT0gSVBJQ19TTVBSUl9BLAogCQkuZm9yY2UJPSBJUElDX1NFRkNSLApAQCAtMTAzLDcgKzEwMyw3IEBACiAJCS5wcmlvX21hc2sgPSA3LAogCX0sCiAJWzIwXSA9IHsKLQkJLnBlbmQJPSBJUElDX1NJUE5SX0gsCisJCS5wZW5kCT0gSVBJQ19TRVBOUiwKIAkJLm1hc2sJPSBJUElDX1NFTVNSLAogCQkucHJpbwk9IElQSUNfU01QUlJfQiwKIAkJLmZvcmNlCT0gSVBJQ19TRUZDUiwKQEAgLTExMSw3ICsxMTEsNyBAQAogCQkucHJpb19tYXNrID0gNCwKIAl9LAogCVsyMV0gPSB7Ci0JCS5wZW5kCT0gSVBJQ19TSVBOUl9ILAorCQkucGVuZAk9IElQSUNfU0VQTlIsCiAJCS5tYXNrCT0gSVBJQ19TRU1TUiwKIAkJLnByaW8JPSBJUElDX1NNUFJSX0IsCiAJCS5mb3JjZQk9IElQSUNfU0VGQ1IsCkBAIC0xMTksNyArMTE5LDcgQEAKIAkJLnByaW9fbWFzayA9IDUsCiAJfSwKIAlbMjJdID0gewotCQkucGVuZAk9IElQSUNfU0lQTlJfSCwKKwkJLnBlbmQJPSBJUElDX1NFUE5SLAogCQkubWFzawk9IElQSUNfU0VNU1IsCiAJCS5wcmlvCT0gSVBJQ19TTVBSUl9CLAogCQkuZm9yY2UJPSBJUElDX1NFRkNSLApAQCAtMTI3LDcgKzEyNyw3IEBACiAJCS5wcmlvX21hc2sgPSA2LAogCX0sCiAJWzIzXSA9IHsKLQkJLnBlbmQJPSBJUElDX1NJUE5SX0gsCisJCS5wZW5kCT0gSVBJQ19TRVBOUiwKIAkJLm1hc2sJPSBJUElDX1NFTVNSLAogCQkucHJpbwk9IElQSUNfU01QUlJfQiwKIAkJLmZvcmNlCT0gSVBJQ19TRUZDUiwKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXY2NHg2MC5jCmluZGV4IDdiMjQxZTcuLmNjNzcxNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL212NjR4NjAuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwX3dpbi5jIGIvYXJjaC9wcGMvc3lzbGliL212NjR4NjBfd2luLmMKaW5kZXggYjZmMGY1ZC4uNWI4MjdlMiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL212NjR4NjBfd2luLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL212NjR4NjBfd2luLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYyBiL2FyY2gvcHBjL3N5c2xpYi9vZl9kZXZpY2UuYwppbmRleCA0OWMwZTM0Li4xZWI0ZjcyIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvb2ZfZGV2aWNlLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29mX2RldmljZS5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAKQEAgLTE1LDIwICsxNiwyMCBAQAogICogVXNlZCBieSBhIGRyaXZlciB0byBjaGVjayB3aGV0aGVyIGFuIG9mX2RldmljZSBwcmVzZW50IGluIHRoZQogICogc3lzdGVtIGlzIGluIGl0cyBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLgogICovCi1jb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaGVzLAorY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAogCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCiB7CiAJaWYgKCFkZXYtPm5vZGUpCiAJCXJldHVybiBOVUxMOwotCXdoaWxlIChtYXRjaGVzLT5uYW1lIHx8IG1hdGNoZXMtPnR5cGUgfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZSkgeworCXdoaWxlIChtYXRjaGVzLT5uYW1lWzBdIHx8IG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkgewogCQlpbnQgbWF0Y2ggPSAxOwotCQlpZiAobWF0Y2hlcy0+bmFtZSAmJiBtYXRjaGVzLT5uYW1lICE9IE9GX0FOWV9NQVRDSCkKKwkJaWYgKG1hdGNoZXMtPm5hbWVbMF0pCiAJCQltYXRjaCAmPSBkZXYtPm5vZGUtPm5hbWUKIAkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPm5hbWUsIGRldi0+bm9kZS0+bmFtZSk7Ci0JCWlmIChtYXRjaGVzLT50eXBlICYmIG1hdGNoZXMtPnR5cGUgIT0gT0ZfQU5ZX01BVENIKQorCQlpZiAobWF0Y2hlcy0+dHlwZVswXSkKIAkJCW1hdGNoICY9IGRldi0+bm9kZS0+dHlwZQogCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgZGV2LT5ub2RlLT50eXBlKTsKLQkJaWYgKG1hdGNoZXMtPmNvbXBhdGlibGUgJiYgbWF0Y2hlcy0+Y29tcGF0aWJsZSAhPSBPRl9BTllfTUFUQ0gpCisJCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlWzBdKQogCQkJbWF0Y2ggJj0gZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5ub2RlLAogCQkJCW1hdGNoZXMtPmNvbXBhdGlibGUpOwogCQlpZiAobWF0Y2gpCkBAIC00Miw3ICs0Myw3IEBACiB7CiAJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwogCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBvZl9kcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KTsKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICogbWF0Y2hlcyA9IG9mX2Rydi0+bWF0Y2hfdGFibGU7CiAKIAlpZiAoIW1hdGNoZXMpCiAJCXJldHVybiAwOwpAQCAtNzUsNyArNzYsNyBAQAogCWludCBlcnJvciA9IC1FTk9ERVY7CiAJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2OwogCXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldjsKLQljb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9vcGVuX3BpYy5jIGIvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKaW5kZXggYjQ1ZDgyNi4uYWQzOWI4NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL29wZW5fcGljLmMKQEAgLTM3MCw4ICszNzAsOSBAQAogCS8qIEluaXRpYWxpemUgSVBJIGludGVycnVwdHMgKi8KIAlpZiAoIHBwY19tZC5wcm9ncmVzcyApIHBwY19tZC5wcm9ncmVzcygib3BlbnBpYzogaXBpIiwweDNiYik7CiAJZm9yIChpID0gMDsgaSA8IE9QRU5QSUNfTlVNX0lQSTsgaSsrKSB7Ci0JCS8qIERpc2FibGVkLCBQcmlvcml0eSAxMC4uMTMgKi8KLQkJb3BlbnBpY19pbml0aXBpKGksIDEwK2ksIE9QRU5QSUNfVkVDX0lQSStpK29mZnNldCk7CisJCS8qIERpc2FibGVkLCBpbmNyZWFzZWQgcHJpb3JpdGllcyAxMC4uMTMgKi8KKwkJb3BlbnBpY19pbml0aXBpKGksIE9QRU5QSUNfUFJJT1JJVFlfSVBJX0JBU0UraSwKKwkJCQlPUEVOUElDX1ZFQ19JUEkraStvZmZzZXQpOwogCQkvKiBJUElzIGFyZSBwZXItQ1BVICovCiAJCWlycV9kZXNjW09QRU5QSUNfVkVDX0lQSStpK29mZnNldF0uc3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogCQlpcnFfZGVzY1tPUEVOUElDX1ZFQ19JUEkraStvZmZzZXRdLmhhbmRsZXIgPSAmb3Blbl9waWNfaXBpOwpAQCAtMzk5LDggKzQwMCw5IEBACiAJCWlmIChzZW5zZSAmIElSUV9TRU5TRV9NQVNLKQogCQkJaXJxX2Rlc2NbaStvZmZzZXRdLnN0YXR1cyA9IElSUV9MRVZFTDsKIAotCQkvKiBFbmFibGVkLCBQcmlvcml0eSA4ICovCi0JCW9wZW5waWNfaW5pdGlycShpLCA4LCBpK29mZnNldCwgKHNlbnNlICYgSVJRX1BPTEFSSVRZX01BU0spLAorCQkvKiBFbmFibGVkLCBEZWZhdWx0IHByaW9yaXR5ICovCisJCW9wZW5waWNfaW5pdGlycShpLCBPUEVOUElDX1BSSU9SSVRZX0RFRkFVTFQsIGkrb2Zmc2V0LAorCQkJCShzZW5zZSAmIElSUV9QT0xBUklUWV9NQVNLKSwKIAkJCQkoc2Vuc2UgJiBJUlFfU0VOU0VfTUFTSykpOwogCQkvKiBQcm9jZXNzb3IgMCAqLwogCQlvcGVucGljX21hcGlycShpLCBDUFVfTUFTS19DUFUwLCBDUFVfTUFTS19OT05FKTsKQEAgLTY1Niw2ICs2NTgsMTggQEAKIH0KIAogLyoKKyAqIENoYW5nZSB0aGUgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0CisgKi8KK3ZvaWQgX19pbml0CitvcGVucGljX3NldF9pcnFfcHJpb3JpdHkodV9pbnQgaXJxLCB1X2ludCBwcmkpCit7CisJY2hlY2tfYXJnX2lycShpcnEpOworCW9wZW5waWNfc2FmZV93cml0ZWZpZWxkKCZJU1JbaXJxIC0gb3Blbl9waWNfaXJxX29mZnNldF0tPlZlY3Rvcl9Qcmlvcml0eSwKKwkJCQlPUEVOUElDX1BSSU9SSVRZX01BU0ssCisJCQkJcHJpIDw8IE9QRU5QSUNfUFJJT1JJVFlfU0hJRlQpOworfQorCisvKgogICogSW5pdGFsaXplIHRoZSBpbnRlcnJ1cHQgc291cmNlIHdoaWNoIHdpbGwgZ2VuZXJhdGUgYW4gTk1JLgogICogVGhpcyByYWlzZXMgdGhlIGludGVycnVwdCdzIHByaW9yaXR5IGZyb20gOCB0byA5LgogICoKQEAgLTY2NSw5ICs2NzksNyBAQAogb3BlbnBpY19pbml0X25taV9pcnEodV9pbnQgaXJxKQogewogCWNoZWNrX2FyZ19pcnEoaXJxKTsKLQlvcGVucGljX3NhZmVfd3JpdGVmaWVsZCgmSVNSW2lycSAtIG9wZW5fcGljX2lycV9vZmZzZXRdLT5WZWN0b3JfUHJpb3JpdHksCi0JCQkJT1BFTlBJQ19QUklPUklUWV9NQVNLLAotCQkJCTkgPDwgT1BFTlBJQ19QUklPUklUWV9TSElGVCk7CisJb3BlbnBpY19zZXRfaXJxX3ByaW9yaXR5KGlycSwgT1BFTlBJQ19QUklPUklUWV9OTUkpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfcGljLmMKaW5kZXggMDU2ODZmYS4uNDAwODYyMSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNHh4X3BpYy5jCkBAIC0xMTAsNiArMTEwLDEwIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwcGM0eHhfcGljX2ltcGxfaW5pdCh2b2lkKQogeworI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKQorCS8qIERpc2FibGUgNDQwR1AgY29tcGF0aWJpbGl0eSBtb2RlIGlmIGl0IHdhcyBlbmFibGVkIGluIGZpcm13YXJlICovCisJU0RSX1dSSVRFKERDUk5fU0RSX01GUiwgU0RSX1JFQUQoRENSTl9TRFJfTUZSKSAmIH5EQ1JOX1NEUl9NRlJfUENNKTsKKyNlbmRpZgogCS8qIENvbmZpZ3VyZSBCYXNlIFVJQyAqLwogCW10ZGNyKERDUk5fVUlDX0NSKFVJQ0IpLCAwKTsKIAltdGRjcihEQ1JOX1VJQ19UUihVSUNCKSwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L0tjb25maWcgYi9hcmNoL3BwYzY0L0tjb25maWcKaW5kZXggY2IyNzA2OC4uZmRkOGFmYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9LY29uZmlnCisrKyBiL2FyY2gvcHBjNjQvS2NvbmZpZwpAQCAtMTQyLDYgKzE0MiwyMyBAQAogCSAgcHJvY2Vzc29ycywgdGhhdCBpcywgd2hpY2ggc2hhcmUgcGh5c2ljYWwgcHJvY2Vzc29ycyBiZXR3ZWVuCiAJICB0d28gb3IgbW9yZSBwYXJ0aXRpb25zLgogCitjb25maWcgS0VYRUMKKwlib29sICJrZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIGtleGVjIGlzIGEgc3lzdGVtIGNhbGwgdGhhdCBpbXBsZW1lbnRzIHRoZSBhYmlsaXR5IHRvIHNodXRkb3duIHlvdXIKKwkgIGN1cnJlbnQga2VybmVsLCBhbmQgdG8gc3RhcnQgYW5vdGhlciBrZXJuZWwuICBJdCBpcyBsaWtlIGEgcmVib290CisJICBidXQgaXQgaXMgaW5kZXBlZGVudCBvZiB0aGUgc3lzdGVtIGZpcm13YXJlLiAgQW5kIGxpa2UgYSByZWJvb3QKKwkgIHlvdSBjYW4gc3RhcnQgYW55IGtlcm5lbCB3aXRoIGl0LCBub3QganVzdCBMaW51eC4KKworCSAgVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgc2ltaWxpYXJpdHkgdG8gdGhlIGV4ZWMgc3lzdGVtIGNhbGwuCisKKwkgIEl0IGlzIGFuIG9uZ29pbmcgcHJvY2VzcyB0byBiZSBjZXJ0YWluIHRoZSBoYXJkd2FyZSBpbiBhIG1hY2hpbmUKKwkgIGlzIHByb3Blcmx5IHNodXRkb3duLCBzbyBkbyBub3QgYmUgc3VycHJpc2VkIGlmIHRoaXMgY29kZSBkb2VzIG5vdAorCSAgaW5pdGlhbGx5IHdvcmsgZm9yIHlvdS4gIEl0IG1heSBoZWxwIHRvIGVuYWJsZSBkZXZpY2UgaG90cGx1Z2dpbmcKKwkgIHN1cHBvcnQuICBBcyBvZiB0aGlzIHdyaXRpbmcgdGhlIGV4YWN0IGhhcmR3YXJlIGludGVyZmFjZSBpcworCSAgc3Ryb25nbHkgaW4gZmx1eCwgc28gbm8gZ29vZCByZWNvbW1lbmRhdGlvbiBjYW4gYmUgbWFkZS4KKwogY29uZmlnIElCTVZJTwogCWRlcGVuZHMgb24gUFBDX1BTRVJJRVMgfHwgUFBDX0lTRVJJRVMKIAlib29sCkBAIC0yNzAsMjYgKzI4Nyw3IEBACiAJICB3aGVuIGRlYWxpbmcgd2l0aCBQT1dFUjUgY3B1cyBhdCBhIGNvc3Qgb2Ygc2xpZ2h0bHkgaW5jcmVhc2VkCiAJICBvdmVyaGVhZCBpbiBzb21lIHBsYWNlcy4gSWYgdW5zdXJlIHNheSBOIGhlcmUuCiAKLWNvbmZpZyBQUkVFTVBUCi0JYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCB3aGVuIHJlYWN0aW5nIHRvCi0JICByZWFsLXRpbWUgb3IgaW50ZXJhY3RpdmUgZXZlbnRzIGJ5IGFsbG93aW5nIGEgbG93IHByaW9yaXR5IHByb2Nlc3MgdG8KLQkgIGJlIHByZWVtcHRlZCBldmVuIGlmIGl0IGlzIGluIGtlcm5lbCBtb2RlIGV4ZWN1dGluZyBhIHN5c3RlbSBjYWxsLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCwgZW1iZWRkZWQKLQkgIG9yIHJlYWwtdGltZSBzeXN0ZW0uICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KLQotY29uZmlnIFBSRUVNUFRfQktMCi0JYm9vbCAiUHJlZW1wdCBUaGUgQmlnIEtlcm5lbCBMb2NrIgotCWRlcGVuZHMgb24gUFJFRU1QVAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCBieSBtYWtpbmcgdGhlCi0JICBiaWcga2VybmVsIGxvY2sgcHJlZW1wdGlibGUuCi0KLQkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBkZXNrdG9wIHN5c3RlbS4KLQkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgogCiBjb25maWcgRUVICiAJYm9vbCAiUENJIEV4dGVuZGVkIEVycm9yIEhhbmRsaW5nIChFRUgpIiBpZiBFTUJFRERFRApAQCAtNDMxLDYgKzQyOSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcHBjNjQvYm9vdC9NYWtlZmlsZQppbmRleCBkM2UxZDZhLi42ODNiMmQ0IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wcGM2NC9ib290L01ha2VmaWxlCkBAIC01Miw3ICs1Miw3IEBACiBzcmMtc2VjID0gJChmb3JlYWNoIHNlY3Rpb24sICQoMSksICQocGF0c3Vic3QgJSwkKG9iaikva2VybmVsLSUuYywgJChzZWN0aW9uKSkpCiBnei1zZWMgID0gJChmb3JlYWNoIHNlY3Rpb24sICQoMSksICQocGF0c3Vic3QgJSwkKG9iaikva2VybmVsLSUuZ3osICQoc2VjdGlvbikpKQogCi1ob3N0cHJvZ3MteQkJOj0gcGlnZ3kgYWRkbm90ZSBhZGRSYW1EaXNrCitob3N0cHJvZ3MteQkJOj0gYWRkbm90ZSBhZGRSYW1EaXNrCiB0YXJnZXRzIAkJKz0gekltYWdlIHpJbWFnZS5pbml0cmQgaW1hZ2VzaXplLmMgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgb2JqLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXAogCQkJICAgJChwYXRzdWJzdCAkKG9iaikvJSwlLCAkKGNhbGwgc3JjLXNlYywgJChyZXF1aXJlZCkgJChpbml0cmQpKSkgXApAQCAtNzgsOSArNzgsNiBAQAogcXVpZXRfY21kX2FkZG5vdGUgPSBBREROT1RFICRAIAogICAgICAgY21kX2FkZG5vdGUgPSAkKENST1NTMzJMRCkgJChCT09UTEZMQUdTKSAtbyAkQCAkKG9iai1ib290KSAmJiAkKG9iaikvYWRkbm90ZSAkQAogCi1xdWlldF9jbWRfcGlnZ3kgPSBQSUdHWSAgICRACi0gICAgICBjbWRfcGlnZ3kgPSAkKG9iaikvcGlnZ3liYWNrICQoQDoubz0pIDwgJDwgfCAkKENST1NTMzJBUykgLW8gJEAKLQogJChjYWxsIGd6LXNlYywgJChyZXF1aXJlZCkpOiAkKG9iaikva2VybmVsLSUuZ3o6ICUgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxnemlwKQogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2Jvb3QvbWFpbi5jIGIvYXJjaC9wcGM2NC9ib290L21haW4uYwppbmRleCBkYTEyZWEyLi4xOTlkOTgwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvbWFpbi5jCisrKyBiL2FyY2gvcHBjNjQvYm9vdC9tYWluLmMKQEAgLTE3LDcgKzE3LDYgQEAKIAogZXh0ZXJuIHZvaWQgKmZpbmRkZXZpY2UoY29uc3QgY2hhciAqKTsKIGV4dGVybiBpbnQgZ2V0cHJvcCh2b2lkICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgcHJpbnRrKGNoYXIgKmZtdCwgLi4uKTsKIGV4dGVybiB2b2lkIHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CiBleHRlcm4gaW50IHNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiB2b2lkIGd1bnppcCh2b2lkICosIGludCwgdW5zaWduZWQgY2hhciAqLCBpbnQgKik7CkBAIC0xNDcsMTAgKzE0NiwxMCBAQAogCQl9CiAJCWExID0gaW5pdHJkLmFkZHI7CiAJCWEyID0gaW5pdHJkLnNpemU7Ci0JCXByaW50ZigiaW5pdGlhbCByYW1kaXNrIG1vdmluZyAweCVseCA8LSAweCVseCAoJWx4IGJ5dGVzKVxuXHIiLAorCQlwcmludGYoImluaXRpYWwgcmFtZGlzayBtb3ZpbmcgMHglbHggPC0gMHglbHggKDB4JWx4IGJ5dGVzKVxuXHIiLAogCQkgICAgICAgaW5pdHJkLmFkZHIsICh1bnNpZ25lZCBsb25nKV9pbml0cmRfc3RhcnQsIGluaXRyZC5zaXplKTsKIAkJbWVtbW92ZSgodm9pZCAqKWluaXRyZC5hZGRyLCAodm9pZCAqKV9pbml0cmRfc3RhcnQsIGluaXRyZC5zaXplKTsKLQkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwgKigodTMyICopaW5pdHJkLmFkZHIpKTsKKwkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwgKigodW5zaWduZWQgbG9uZyAqKWluaXRyZC5hZGRyKSk7CiAJfQogCiAJLyogRXZlbnR1YWxseSBndW56aXAgdGhlIGtlcm5lbCAqLwpAQCAtMjAxLDkgKzIwMCw2IEBACiAKIAlmbHVzaF9jYWNoZSgodm9pZCAqKXZtbGludXguYWRkciwgdm1saW51eC5zaXplKTsKIAotCWlmIChhMSkKLQkJcHJpbnRmKCJpbml0cmQgaGVhZDogMHglbHhcblxyIiwgKigodTMyICopaW5pdHJkLmFkZHIpKTsKLQogCWtlcm5lbF9lbnRyeSA9IChrZXJuZWxfZW50cnlfdCl2bWxpbnV4LmFkZHI7CiAjaWZkZWYgREVCVUcKIAlwcmludGYoICJrZXJuZWw6XG5cciIKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvYm9vdC9ta25vdGUuYyBiL2FyY2gvcHBjNjQvYm9vdC9ta25vdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwY2MxZC4uMDAwMDAwMAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvbWtub3RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBDb3J0IERvdWdhbiAxOTk5LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogR2VuZXJhdGUgYSBub3RlIHNlY3Rpb24gYXMgcGVyIHRoZSBDSFJQIHNwZWNpZmljYXRpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIFBMKHgpIHByaW50ZigiJWMlYyVjJWMiLCAoKHgpPj4yNCkmMHhmZiwgKCh4KT4+MTYpJjB4ZmYsICgoeCk+PjgpJjB4ZmYsICh4KSYweGZmICk7Ci0KLWludCBtYWluKHZvaWQpCi17Ci0vKiBoZWFkZXIgKi8KLQkvKiBuYW1lc3ogKi8KLQlQTChzdHJsZW4oIlBvd2VyUEMiKSsxKTsKLQkvKiBkZXNjcnN6ICovCi0JUEwoNio0KTsKLQkvKiB0eXBlICovCi0JUEwoMHgxMjc1KTsKLQkvKiBuYW1lICovCi0JcHJpbnRmKCJQb3dlclBDIik7IHByaW50ZigiJWMiLCAwKTsKLQkKLS8qIGRlc2NyaXB0b3IgKi8KLQkvKiByZWFsLW1vZGUgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiByZWFsLWJhc2UgKi8KLQlQTCgweDAwYzAwMDAwKTsKLQkvKiByZWFsLXNpemUgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiB2aXJ0LWJhc2UgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiB2aXJ0LXNpemUgKi8KLQlQTCgweGZmZmZmZmZmKTsKLQkvKiBsb2FkLWJhc2UgKi8KLQlQTCgweDQwMDApOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9ib290L3BpZ2d5YmFjay5jIGIvYXJjaC9wcGM2NC9ib290L3BpZ2d5YmFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVjN2E4Li4wMDAwMDAwCi0tLSBhL2FyY2gvcHBjNjQvYm9vdC9waWdneWJhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMSBJQk0gQ29ycCAKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotZXh0ZXJuIGxvbmcgY2VfZXhlY19jb25maWdbXTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQgaSwgY250LCBwb3MsIGxlbjsKLQl1bnNpZ25lZCBpbnQgY2tzdW0sIHZhbDsKLQl1bnNpZ25lZCBjaGFyICpscDsKLQl1bnNpZ25lZCBjaGFyIGJ1Zls4MTkyXTsKLQljaGFyICp2YXJuYW1lOwotCWlmIChhcmdjICE9IDIpCi0JewotCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBuYW1lIDxpbi1maWxlID5vdXQtZmlsZVxuIiwKLQkJCWFyZ3ZbMF0pOwotCQlleGl0KDEpOwotCX0KLQotCXZhcm5hbWUgPSBzdHJyY2hyKGFyZ3ZbMV0sICcvJyk7Ci0JaWYgKHZhcm5hbWUpCi0JCXZhcm5hbWUrKzsKLQllbHNlCi0JCXZhcm5hbWUgPSBhcmd2WzFdOwotCi0JZnByaW50ZihzdGRvdXQsICIjXG4iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiMgTWlzY2VsbGFuZW91cyBkYXRhIHN0cnVjdHVyZXM6XG4iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiMgV0FSTklORyAtIHRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCFcbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiI1xuIik7Ci0JZnByaW50ZihzdGRvdXQsICJcbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiXHQuZGF0YVxuIik7Ci0JZnByaW50ZihzdGRvdXQsICJcdC5nbG9ibCAlc19kYXRhXG4iLCB2YXJuYW1lKTsKLQlmcHJpbnRmKHN0ZG91dCwgIiVzX2RhdGE6XG4iLCB2YXJuYW1lKTsKLQlwb3MgPSAwOwotCWNrc3VtID0gMDsKLQl3aGlsZSAoKGxlbiA9IHJlYWQoMCwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkKLQl7Ci0JCWNudCA9IDA7Ci0JCWxwID0gKHVuc2lnbmVkIGNoYXIgKilidWY7Ci0JCWxlbiA9IChsZW4gKyAzKSAmIH4zOyAgLyogUm91bmQgdXAgdG8gbG9uZ3dvcmRzICovCi0JCWZvciAoaSA9IDA7ICBpIDwgbGVuOyAgaSArPSA0KQotCQl7Ci0JCQlpZiAoY250ID09IDApCi0JCQl7Ci0JCQkJZnByaW50ZihzdGRvdXQsICJcdC5sb25nXHQiKTsKLQkJCX0KLQkJCWZwcmludGYoc3Rkb3V0LCAiMHglMDJYJTAyWCUwMlglMDJYIiwgbHBbMF0sIGxwWzFdLCBscFsyXSwgbHBbM10pOwotCQkJdmFsID0gKih1bnNpZ25lZCBsb25nICopbHA7Ci0JCQlja3N1bSBePSB2YWw7Ci0JCQlscCArPSA0OwotCQkJaWYgKCsrY250ID09IDQpCi0JCQl7Ci0JCQkJY250ID0gMDsKLQkJCQlmcHJpbnRmKHN0ZG91dCwgIiAjICV4IFxuIiwgcG9zK2ktMTIpOwotCQkJCWZmbHVzaChzdGRvdXQpOwotCQkJfSBlbHNlCi0JCQl7Ci0JCQkJZnByaW50ZihzdGRvdXQsICIsIik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNudCkKLQkJewotCQkJZnByaW50ZihzdGRvdXQsICIwXG4iKTsKLQkJfQotCQlwb3MgKz0gbGVuOwotCX0KLQlmcHJpbnRmKHN0ZG91dCwgIlx0Lmdsb2JsICVzX2xlblxuIiwgdmFybmFtZSk7Ci0JZnByaW50ZihzdGRvdXQsICIlc19sZW46XHQubG9uZ1x0MHgleFxuIiwgdmFybmFtZSwgcG9zKTsKLQlmZmx1c2goc3Rkb3V0KTsKLQlmY2xvc2Uoc3Rkb3V0KTsKLQlmcHJpbnRmKHN0ZGVyciwgImNrc3VtID0gJXhcbiIsIGNrc3VtKTsKLQlleGl0KDApOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2Jvb3QvcHJvbS5jIGIvYXJjaC9wcGM2NC9ib290L3Byb20uYwppbmRleCBkNTIxOGIxLi41ZTQ4YjgwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2Jvb3QvcHJvbS5jCisrKyBiL2FyY2gvcHBjNjQvYm9vdC9wcm9tLmMKQEAgLTQwLDcgKzQwLDcgQEAKIGludCBnZXRwcm9wKHZvaWQgKnBoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZiwgaW50IGJ1Zmxlbik7CiB2b2lkIGNocnBib290KGludCBhMSwgaW50IGEyLCB2b2lkICpwcm9tKTsJLyogaW4gbWFpbi5jICovCiAKLXZvaWQgcHJpbnRrKGNoYXIgKmZtdCwgLi4uKTsKK2ludCBwcmludGYoY2hhciAqZm10LCAuLi4pOwogCiAvKiB0aGVyZSBpcyBubyBjb252ZW5pZW50IGhlYWRlciB0byBnZXQgdGhpcyBmcm9tLi4uICAtLSBwYXVsdXMgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIHN0cmxlbihjb25zdCBjaGFyICopOwpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCWNhc2UgMToKIAkJCXJldHVybiBjaDsKIAkJY2FzZSAtMToKLQkJCXByaW50aygicmVhZChzdGRpbikgcmV0dXJuZWQgLTFcclxuIik7CisJCQlwcmludGYoInJlYWQoc3RkaW4pIHJldHVybmVkIC0xXHJcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtNjI3LDE4ICs2MjcsNiBAQAogCiBzdGF0aWMgY2hhciBzcHJpbnRfYnVmWzEwMjRdOwogCi12b2lkCi1wcmludGsoY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcmdzOwotCWludCBuOwotCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQluID0gdnNwcmludGYoc3ByaW50X2J1ZiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0Jd3JpdGUoc3Rkb3V0LCBzcHJpbnRfYnVmLCBuKTsKLX0KLQogaW50CiBwcmludGYoY2hhciAqZm10LCAuLi4pCiB7CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9JdExwUXVldWUuYyBiL2FyY2gvcHBjNjQva2VybmVsL0l0THBRdWV1ZS5jCmluZGV4IGNkZWEwMGQuLjQyMzE4NjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL0l0THBRdWV1ZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL0l0THBRdWV1ZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEl0THBRdWV1ZS5jCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWlrZSBDb3JyaWdhbiAgSUJNIENvcnBvcmF0aW9uCi0gKiAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0xMSwxNTYgKzExLDI1MiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcGFjYS5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0THBRdWV1ZS5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2THBFdmVudC5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0h2Q2FsbEV2ZW50Lmg+CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBzZXRfaW5Vc2UoIHN0cnVjdCBJdExwUXVldWUgKiBscFF1ZXVlICkKLXsKLQlpbnQgdDsKLQl1MzIgKiBpblVzZVAgPSAmKGxwUXVldWUtPnhJblVzZVdvcmQpOworLyoKKyAqIFRoZSBMcFF1ZXVlIGlzIHVzZWQgdG8gcGFzcyBldmVudCBkYXRhIGZyb20gdGhlIGh5cGVydmlzb3IgdG8KKyAqIHRoZSBwYXJ0aXRpb24uICBUaGlzIGlzIHdoZXJlIEkvTyBpbnRlcnJ1cHQgZXZlbnRzIGFyZSBjb21tdW5pY2F0ZWQuCisgKgorICogSXQgaXMgd3JpdHRlbiB0byBieSB0aGUgaHlwZXJ2aXNvciBzbyBjYW5ub3QgZW5kIHVwIGluIHRoZSBCU1MuCisgKi8KK3N0cnVjdCBodmxwZXZlbnRfcXVldWUgaHZscGV2ZW50X3F1ZXVlIF9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YSIpKSk7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiXG5cCi0xOglsd2FyeAklMCwwLCUyCQlcblwKLQljbXB3aQkwLCUwLDAJCVxuXAotCWxpCSUwLDAJCVxuXAotCWJuZS0JMmYJCVxuXAotCWFkZGkJJTAsJTAsMQkJXG5cCi0Jc3R3Y3guCSUwLDAsJTIJCVxuXAotCWJuZS0JMWIJCVxuXAotMjoJZWllaW8iCi0JOiAiPSZyIiAodCksICI9bSIgKGxwUXVldWUtPnhJblVzZVdvcmQpCi0JOiAiciIgKGluVXNlUCksICJtIiAobHBRdWV1ZS0+eEluVXNlV29yZCkKLQk6ICJjYyIpOworREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZ1tIdkxwRXZlbnRfVHlwZV9OdW1UeXBlc10sIGh2bHBldmVudF9jb3VudHMpOwogCi0JcmV0dXJuIHQ7Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgY2xlYXJfaW5Vc2UoIHN0cnVjdCBJdExwUXVldWUgKiBscFF1ZXVlICkKLXsKLQlscFF1ZXVlLT54SW5Vc2VXb3JkID0gMDsKLX0KK3N0YXRpYyBjaGFyICpldmVudF90eXBlc1tIdkxwRXZlbnRfVHlwZV9OdW1UeXBlc10gPSB7CisJIkh5cGVydmlzb3IiLAorCSJNYWNoaW5lIEZhY2lsaXRpZXMiLAorCSJTZXNzaW9uIE1hbmFnZXIiLAorCSJTUEQgSS9PIiwKKwkiVmlydHVhbCBCdXMiLAorCSJQQ0kgSS9PIiwKKwkiUklPIEkvTyIsCisJIlZpcnR1YWwgTGFuIiwKKwkiVmlydHVhbCBJL08iCit9OwogCiAvKiBBcnJheSBvZiBMcEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zICovCiBleHRlcm4gTHBFdmVudEhhbmRsZXIgbHBFdmVudEhhbmRsZXJbSHZMcEV2ZW50X1R5cGVfTnVtVHlwZXNdOwotdW5zaWduZWQgbG9uZyBJdExwUXVldWVJblByb2Nlc3MgPSAwOwogCi1zdHJ1Y3QgSHZMcEV2ZW50ICogSXRMcFF1ZXVlX2dldE5leHRMcEV2ZW50KCBzdHJ1Y3QgSXRMcFF1ZXVlICogbHBRdWV1ZSApCitzdGF0aWMgc3RydWN0IEh2THBFdmVudCAqIGdldF9uZXh0X2h2bHBldmVudCh2b2lkKQogewotCXN0cnVjdCBIdkxwRXZlbnQgKiBuZXh0THBFdmVudCA9IAotCQkoc3RydWN0IEh2THBFdmVudCAqKWxwUXVldWUtPnhTbGljQ3VyRXZlbnRQdHI7Ci0JaWYgKCBuZXh0THBFdmVudC0+eEZsYWdzLnhWYWxpZCApIHsKKwlzdHJ1Y3QgSHZMcEV2ZW50ICogZXZlbnQ7CisJZXZlbnQgPSAoc3RydWN0IEh2THBFdmVudCAqKWh2bHBldmVudF9xdWV1ZS54U2xpY0N1ckV2ZW50UHRyOworCisJaWYgKGV2ZW50LT54RmxhZ3MueFZhbGlkKSB7CiAJCS8qIHJtYigpIG5lZWRlZCBvbmx5IGZvciB3ZWFrbHkgY29uc2lzdGVudCBtYWNoaW5lcyAocmVnYXR0YSkgKi8KIAkJcm1iKCk7CiAJCS8qIFNldCBwb2ludGVyIHRvIG5leHQgcG90ZW50aWFsIGV2ZW50ICovCi0JCWxwUXVldWUtPnhTbGljQ3VyRXZlbnRQdHIgKz0gKChuZXh0THBFdmVudC0+eFNpemVNaW51czEgKwotCQkJCSAgICAgIExwRXZlbnRBbGlnbiApIC8KLQkJCQkgICAgICBMcEV2ZW50QWxpZ24gKSAqCi0JCQkJICAgICAgTHBFdmVudEFsaWduOworCQlodmxwZXZlbnRfcXVldWUueFNsaWNDdXJFdmVudFB0ciArPSAoKGV2ZW50LT54U2l6ZU1pbnVzMSArCisJCQkJTHBFdmVudEFsaWduKSAvIExwRXZlbnRBbGlnbikgKiBMcEV2ZW50QWxpZ247CisKIAkJLyogV3JhcCB0byBiZWdpbm5pbmcgaWYgbm8gcm9vbSBhdCBlbmQgKi8KLQkJaWYgKGxwUXVldWUtPnhTbGljQ3VyRXZlbnRQdHIgPiBscFF1ZXVlLT54U2xpY0xhc3RWYWxpZEV2ZW50UHRyKQotCQkJbHBRdWV1ZS0+eFNsaWNDdXJFdmVudFB0ciA9IGxwUXVldWUtPnhTbGljRXZlbnRTdGFja1B0cjsKKwkJaWYgKGh2bHBldmVudF9xdWV1ZS54U2xpY0N1ckV2ZW50UHRyID4KKwkJCQlodmxwZXZlbnRfcXVldWUueFNsaWNMYXN0VmFsaWRFdmVudFB0cikgeworCQkJaHZscGV2ZW50X3F1ZXVlLnhTbGljQ3VyRXZlbnRQdHIgPQorCQkJCWh2bHBldmVudF9xdWV1ZS54U2xpY0V2ZW50U3RhY2tQdHI7CisJCX0KKwl9IGVsc2UgeworCQlldmVudCA9IE5VTEw7CiAJfQotCWVsc2UgCi0JCW5leHRMcEV2ZW50ID0gTlVMTDsKIAotCXJldHVybiBuZXh0THBFdmVudDsKKwlyZXR1cm4gZXZlbnQ7CiB9CiAKLWludCBJdExwUXVldWVfaXNMcEludFBlbmRpbmcoIHN0cnVjdCBJdExwUXVldWUgKiBscFF1ZXVlICkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNwcmVhZF9scGV2ZW50cyA9IE5SX0NQVVM7CisKK2ludCBodmxwZXZlbnRfaXNfcGVuZGluZyh2b2lkKQogewotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCBIdkxwRXZlbnQgKiBuZXh0THBFdmVudDsKLQlpZiAoIGxwUXVldWUgKSB7Ci0JCW5leHRMcEV2ZW50ID0gKHN0cnVjdCBIdkxwRXZlbnQgKilscFF1ZXVlLT54U2xpY0N1ckV2ZW50UHRyOwotCQlyZXR2YWwgPSBuZXh0THBFdmVudC0+eEZsYWdzLnhWYWxpZCB8IGxwUXVldWUtPnhQbGljT3ZlcmZsb3dJbnRQZW5kaW5nOwotCX0KLQlyZXR1cm4gcmV0dmFsOworCXN0cnVjdCBIdkxwRXZlbnQgKm5leHRfZXZlbnQ7CisKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID49IHNwcmVhZF9scGV2ZW50cykKKwkJcmV0dXJuIDA7CisKKwluZXh0X2V2ZW50ID0gKHN0cnVjdCBIdkxwRXZlbnQgKilodmxwZXZlbnRfcXVldWUueFNsaWNDdXJFdmVudFB0cjsKKworCXJldHVybiBuZXh0X2V2ZW50LT54RmxhZ3MueFZhbGlkIHwKKwkJaHZscGV2ZW50X3F1ZXVlLnhQbGljT3ZlcmZsb3dJbnRQZW5kaW5nOwogfQogCi12b2lkIEl0THBRdWV1ZV9jbGVhclZhbGlkKCBzdHJ1Y3QgSHZMcEV2ZW50ICogZXZlbnQgKQorc3RhdGljIHZvaWQgaHZscGV2ZW50X2NsZWFyX3ZhbGlkKHN0cnVjdCBIdkxwRXZlbnQgKiBldmVudCkKIHsKLQkvKiBDbGVhciB0aGUgdmFsaWQgYml0IG9mIHRoZSBldmVudAotCSAqIEFsc28gY2xlYXIgYml0cyB3aXRoaW4gdGhpcyBldmVudCB0aGF0IG1pZ2h0Ci0JICogbG9vayBsaWtlIHZhbGlkIGJpdHMgKG9uIDY0LWJ5dGUgYm91bmRhcmllcykKLSAgIAkgKi8KLQl1bnNpZ25lZCBleHRyYSA9ICgoIGV2ZW50LT54U2l6ZU1pbnVzMSArIExwRXZlbnRBbGlnbiApIC8KLQkJCQkJCSBMcEV2ZW50QWxpZ24gKSAtIDE7Ci0Jc3dpdGNoICggZXh0cmEgKSB7Ci0JICBjYXNlIDM6Ci0JICAgKChzdHJ1Y3QgSHZMcEV2ZW50KikoKGNoYXIqKWV2ZW50KzMqTHBFdmVudEFsaWduKSktPnhGbGFncy54VmFsaWQ9MDsKLQkgIGNhc2UgMjoKLQkgICAoKHN0cnVjdCBIdkxwRXZlbnQqKSgoY2hhciopZXZlbnQrMipMcEV2ZW50QWxpZ24pKS0+eEZsYWdzLnhWYWxpZD0wOwotCSAgY2FzZSAxOgotCSAgICgoc3RydWN0IEh2THBFdmVudCopKChjaGFyKilldmVudCsxKkxwRXZlbnRBbGlnbikpLT54RmxhZ3MueFZhbGlkPTA7Ci0JICBjYXNlIDA6Ci0JICAgOwkKKwkvKiBUZWxsIHRoZSBIeXBlcnZpc29yIHRoYXQgd2UncmUgZG9uZSB3aXRoIHRoaXMgZXZlbnQuCisJICogQWxzbyBjbGVhciBiaXRzIHdpdGhpbiB0aGlzIGV2ZW50IHRoYXQgbWlnaHQgbG9vayBsaWtlIHZhbGlkIGJpdHMuCisJICogaWUuIG9uIDY0LWJ5dGUgYm91bmRhcmllcy4KKwkgKi8KKwlzdHJ1Y3QgSHZMcEV2ZW50ICp0bXA7CisJdW5zaWduZWQgZXh0cmEgPSAoKGV2ZW50LT54U2l6ZU1pbnVzMSArIExwRXZlbnRBbGlnbikgLworCQkJCQkJIExwRXZlbnRBbGlnbikgLSAxOworCisJc3dpdGNoIChleHRyYSkgeworCWNhc2UgMzoKKwkJdG1wID0gKHN0cnVjdCBIdkxwRXZlbnQqKSgoY2hhciopZXZlbnQgKyAzICogTHBFdmVudEFsaWduKTsKKwkJdG1wLT54RmxhZ3MueFZhbGlkID0gMDsKKwljYXNlIDI6CisJCXRtcCA9IChzdHJ1Y3QgSHZMcEV2ZW50KikoKGNoYXIqKWV2ZW50ICsgMiAqIExwRXZlbnRBbGlnbik7CisJCXRtcC0+eEZsYWdzLnhWYWxpZCA9IDA7CisJY2FzZSAxOgorCQl0bXAgPSAoc3RydWN0IEh2THBFdmVudCopKChjaGFyKilldmVudCArIDEgKiBMcEV2ZW50QWxpZ24pOworCQl0bXAtPnhGbGFncy54VmFsaWQgPSAwOwogCX0KKwogCW1iKCk7CisKIAlldmVudC0+eEZsYWdzLnhWYWxpZCA9IDA7CiB9CiAKLXVuc2lnbmVkIEl0THBRdWV1ZV9wcm9jZXNzKCBzdHJ1Y3QgSXRMcFF1ZXVlICogbHBRdWV1ZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKQordm9pZCBwcm9jZXNzX2h2bHBldmVudHMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgbnVtSW50c1Byb2Nlc3NlZCA9IDA7Ci0Jc3RydWN0IEh2THBFdmVudCAqIG5leHRMcEV2ZW50OworCXN0cnVjdCBIdkxwRXZlbnQgKiBldmVudDsKIAogCS8qIElmIHdlIGhhdmUgcmVjdXJzZWQsIGp1c3QgcmV0dXJuICovCi0JaWYgKCAhc2V0X2luVXNlKCBscFF1ZXVlICkgKQotCQlyZXR1cm4gMDsKLQkKLQlpZiAoSXRMcFF1ZXVlSW5Qcm9jZXNzID09IDApCi0JCUl0THBRdWV1ZUluUHJvY2VzcyA9IDE7Ci0JZWxzZQotCQlCVUcoKTsKKwlpZiAoIXNwaW5fdHJ5bG9jaygmaHZscGV2ZW50X3F1ZXVlLmxvY2spKQorCQlyZXR1cm47CiAKIAlmb3IgKDs7KSB7Ci0JCW5leHRMcEV2ZW50ID0gSXRMcFF1ZXVlX2dldE5leHRMcEV2ZW50KCBscFF1ZXVlICk7Ci0JCWlmICggbmV4dExwRXZlbnQgKSB7Ci0JCQkvKiBDb3VudCBldmVudHMgdG8gcmV0dXJuIHRvIGNhbGxlcgotCQkJICogYW5kIGNvdW50IHByb2Nlc3NlZCBldmVudHMgaW4gbHBRdWV1ZQotIAkJCSAqLwotCQkJKytudW1JbnRzUHJvY2Vzc2VkOwotCQkJbHBRdWV1ZS0+eExwSW50Q291bnQrKzsJCQotCQkJLyogQ2FsbCBhcHByb3ByaWF0ZSBoYW5kbGVyIGhlcmUsIHBhc3NpbmcgCisJCWV2ZW50ID0gZ2V0X25leHRfaHZscGV2ZW50KCk7CisJCWlmIChldmVudCkgeworCQkJLyogQ2FsbCBhcHByb3ByaWF0ZSBoYW5kbGVyIGhlcmUsIHBhc3NpbmcKIAkJCSAqIGEgcG9pbnRlciB0byB0aGUgTHBFdmVudC4gIFRoZSBoYW5kbGVyCiAJCQkgKiBtdXN0IG1ha2UgYSBjb3B5IG9mIHRoZSBMcEV2ZW50IGlmIGl0CiAJCQkgKiBuZWVkcyBpdCBpbiBhIGJvdHRvbSBoYWxmLiAocGVyaGFwcyBmb3IKIAkJCSAqIGFuIEFDSykKLQkJCSAqCQotCQkJICogIEhhbmRsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgQUNLIHByb2Nlc3NpbmcgCisJCQkgKgorCQkJICogIEhhbmRsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgQUNLIHByb2Nlc3NpbmcKIAkJCSAqCiAJCQkgKiBUaGUgSHlwZXJ2aXNvciBndWFyYW50ZWVzIHRoYXQgTHBFdmVudHMgd2lsbAogCQkJICogb25seSBiZSBkZWxpdmVyZWQgd2l0aCB0eXBlcyB0aGF0IHdlIGhhdmUKIAkJCSAqIHJlZ2lzdGVyZWQgZm9yLCBzbyBubyB0eXBlIGNoZWNrIGlzIG5lY2Vzc2FyeQogCQkJICogaGVyZSEKLSAgCQkJICovCi0JCQlpZiAoIG5leHRMcEV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzICkKLQkJCQlscFF1ZXVlLT54THBJbnRDb3VudEJ5VHlwZVtuZXh0THBFdmVudC0+eFR5cGVdKys7Ci0JCQlpZiAoIG5leHRMcEV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzICYmCi0JCQkgICAgIGxwRXZlbnRIYW5kbGVyW25leHRMcEV2ZW50LT54VHlwZV0gKSAKLQkJCQlscEV2ZW50SGFuZGxlcltuZXh0THBFdmVudC0+eFR5cGVdKG5leHRMcEV2ZW50LCByZWdzKTsKKwkJCSAqLworCQkJaWYgKGV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzKQorCQkJCV9fZ2V0X2NwdV92YXIoaHZscGV2ZW50X2NvdW50cylbZXZlbnQtPnhUeXBlXSsrOworCQkJaWYgKGV2ZW50LT54VHlwZSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzICYmCisJCQkJCWxwRXZlbnRIYW5kbGVyW2V2ZW50LT54VHlwZV0pCisJCQkJbHBFdmVudEhhbmRsZXJbZXZlbnQtPnhUeXBlXShldmVudCwgcmVncyk7CiAJCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5leHBlY3RlZCBMcCBFdmVudCB0eXBlPSVkXG4iLCBuZXh0THBFdmVudC0+eFR5cGUgKTsKLQkJCQotCQkJSXRMcFF1ZXVlX2NsZWFyVmFsaWQoIG5leHRMcEV2ZW50ICk7Ci0JCX0gZWxzZSBpZiAoIGxwUXVldWUtPnhQbGljT3ZlcmZsb3dJbnRQZW5kaW5nICkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJVbmV4cGVjdGVkIExwIEV2ZW50IHR5cGU9JWRcbiIsIGV2ZW50LT54VHlwZSApOworCisJCQlodmxwZXZlbnRfY2xlYXJfdmFsaWQoZXZlbnQpOworCQl9IGVsc2UgaWYgKGh2bHBldmVudF9xdWV1ZS54UGxpY092ZXJmbG93SW50UGVuZGluZykKIAkJCS8qCiAJCQkgKiBObyBtb3JlIHZhbGlkIGV2ZW50cy4gSWYgb3ZlcmZsb3cgZXZlbnRzIGFyZQogCQkJICogcGVuZGluZyBwcm9jZXNzIHRoZW0KIAkJCSAqLwotCQkJSHZDYWxsRXZlbnRfZ2V0T3ZlcmZsb3dMcEV2ZW50cyggbHBRdWV1ZS0+eEluZGV4KTsKKwkJCUh2Q2FsbEV2ZW50X2dldE92ZXJmbG93THBFdmVudHMoaHZscGV2ZW50X3F1ZXVlLnhJbmRleCk7CiAJCWVsc2UKIAkJCWJyZWFrOwogCX0KIAotCUl0THBRdWV1ZUluUHJvY2VzcyA9IDA7Ci0JbWIoKTsKLQljbGVhcl9pblVzZSggbHBRdWV1ZSApOwotCi0JZ2V0X3BhY2EoKS0+bHBldmVudF9jb3VudCArPSBudW1JbnRzUHJvY2Vzc2VkOwotCi0JcmV0dXJuIG51bUludHNQcm9jZXNzZWQ7CisJc3Bpbl91bmxvY2soJmh2bHBldmVudF9xdWV1ZS5sb2NrKTsKIH0KKworc3RhdGljIGludCBzZXRfc3ByZWFkX2xwZXZlbnRzKGNoYXIgKnN0cikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgTlVMTCwgMCk7CisKKwkvKgorCSAqIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIHRvIHNoYXJlIGluIHByb2Nlc3NpbmcKKwkgKiBscCBldmVudHMuCisJICovCisJaWYgKCggdmFsID4gMCkgJiYgKHZhbCA8PSBOUl9DUFVTKSkgeworCQlzcHJlYWRfbHBldmVudHMgPSB2YWw7CisJCXByaW50aygibHBldmVudCBwcm9jZXNzaW5nIHNwcmVhZCBvdmVyICVsZCBwcm9jZXNzb3JzXG4iLCB2YWwpOworCX0gZWxzZSB7CisJCXByaW50aygiaW52YWxpZCBzcHJlYWRfbHBldmVudHMgJWxkXG4iLCB2YWwpOworCX0KKworCXJldHVybiAxOworfQorX19zZXR1cCgic3ByZWFkX2xwZXZlbnRzPSIsIHNldF9zcHJlYWRfbHBldmVudHMpOworCit2b2lkIHNldHVwX2h2bHBldmVudF9xdWV1ZSh2b2lkKQoreworCXZvaWQgKmV2ZW50U3RhY2s7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgcGFnZSBmb3IgdGhlIEV2ZW50IFN0YWNrLiBUaGUgSHlwZXJ2aXNvciBuZWVkcyB0aGUKKwkgKiBhYnNvbHV0ZSByZWFsIGFkZHJlc3MsIHNvIHdlIHN1YnRyYWN0IG91dCB0aGUgS0VSTkVMQkFTRSBhbmQgYWRkCisJICogaW4gdGhlIGFic29sdXRlIHJlYWwgYWRkcmVzcyBvZiB0aGUga2VybmVsIGxvYWQgYXJlYS4KKwkgKi8KKwlldmVudFN0YWNrID0gYWxsb2NfYm9vdG1lbV9wYWdlcyhMcEV2ZW50U3RhY2tTaXplKTsKKwltZW1zZXQoZXZlbnRTdGFjaywgMCwgTHBFdmVudFN0YWNrU2l6ZSk7CisKKwkvKiBJbnZva2UgdGhlIGh5cGVydmlzb3IgdG8gaW5pdGlhbGl6ZSB0aGUgZXZlbnQgc3RhY2sgKi8KKwlIdkNhbGxFdmVudF9zZXRMcEV2ZW50U3RhY2soMCwgZXZlbnRTdGFjaywgTHBFdmVudFN0YWNrU2l6ZSk7CisKKwlodmxwZXZlbnRfcXVldWUueFNsaWNFdmVudFN0YWNrUHRyID0gKGNoYXIgKilldmVudFN0YWNrOworCWh2bHBldmVudF9xdWV1ZS54U2xpY0N1ckV2ZW50UHRyID0gKGNoYXIgKilldmVudFN0YWNrOworCWh2bHBldmVudF9xdWV1ZS54U2xpY0xhc3RWYWxpZEV2ZW50UHRyID0gKGNoYXIgKilldmVudFN0YWNrICsKKwkJCQkJKExwRXZlbnRTdGFja1NpemUgLSBMcEV2ZW50TWF4U2l6ZSk7CisJaHZscGV2ZW50X3F1ZXVlLnhJbmRleCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19scGV2ZW50c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpbnQgY3B1LCBpOworCXVuc2lnbmVkIGxvbmcgc3VtOworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV90b3RhbHNbTlJfQ1BVU107CisKKwkvKiBGSVhNRTogZG8gd2UgY2FyZSB0aGF0IHRoZXJlJ3Mgbm8gbG9ja2luZyBoZXJlPyAqLworCXN1bSA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJY3B1X3RvdGFsc1tjcHVdID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzOyBpKyspIHsKKwkJCWNwdV90b3RhbHNbY3B1XSArPSBwZXJfY3B1KGh2bHBldmVudF9jb3VudHMsIGNwdSlbaV07CisJCX0KKwkJc3VtICs9IGNwdV90b3RhbHNbY3B1XTsKKwl9CisKKwlzZXFfcHJpbnRmKG0sICJMcEV2ZW50UXVldWUgMFxuIik7CisJc2VxX3ByaW50ZihtLCAiICBldmVudHMgcHJvY2Vzc2VkOlx0JWx1XG4iLCBzdW0pOworCisJZm9yIChpID0gMDsgaSA8IEh2THBFdmVudF9UeXBlX051bVR5cGVzOyArK2kpIHsKKwkJc3VtID0gMDsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCXN1bSArPSBwZXJfY3B1KGh2bHBldmVudF9jb3VudHMsIGNwdSlbaV07CisJCX0KKworCQlzZXFfcHJpbnRmKG0sICIgICAgJS0yMHMgJTEwbHVcbiIsIGV2ZW50X3R5cGVzW2ldLCBzdW0pOworCX0KKworCXNlcV9wcmludGYobSwgIlxuICBldmVudHMgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NvcjpcbiIpOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc2VxX3ByaW50ZihtLCAiICAgIENQVSUwMmQgICUxMGx1XG4iLCBjcHUsIGNwdV90b3RhbHNbY3B1XSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19scGV2ZW50c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2xwZXZlbnRzX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2xwZXZlbnRzX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gcHJvY19scGV2ZW50c19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX2xwZXZlbnRzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmU7CisKKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImlTZXJpZXMvbHBldmVudHMiLCBTX0lGUkVHfFNfSVJVR08sIE5VTEwpOworCWlmIChlKQorCQllLT5wcm9jX2ZvcHMgPSAmcHJvY19scGV2ZW50c19vcGVyYXRpb25zOworCisJcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKHByb2NfbHBldmVudHNfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL0xwYXJEYXRhLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9McGFyRGF0YS5jCmluZGV4IGJhZGM1YTQuLjZmZmNmNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL0xwYXJEYXRhLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvTHBhckRhdGEuYwpAQCAtMjgsMTMgKzI4LDYgQEAKICNpbmNsdWRlIDxhc20vaVNlcmllcy9Jb0hyaVByb2Nlc3NvclZwZC5oPgogI2luY2x1ZGUgPGFzbS9pU2VyaWVzL0l0U3BDb21tQXJlYS5oPgogCi0vKiBUaGUgTHBRdWV1ZSBpcyB1c2VkIHRvIHBhc3MgZXZlbnQgZGF0YSBmcm9tIHRoZSBoeXBlcnZpc29yIHRvCi0gKiB0aGUgcGFydGl0aW9uLiAgVGhpcyBpcyB3aGVyZSBJL08gaW50ZXJydXB0IGV2ZW50cyBhcmUgY29tbXVuaWNhdGVkLgotICovCi0KLS8qIE1heSBiZSBmaWxsZWQgaW4gYnkgdGhlIGh5cGVydmlzb3Igc28gY2Fubm90IGVuZCB1cCBpbiB0aGUgQlNTICovCi1zdHJ1Y3QgSXRMcFF1ZXVlIHhJdExwUXVldWUgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKTsKLQogCiAvKiBUaGUgSHZSZWxlYXNlRGF0YSBpcyB0aGUgcm9vdCBvZiB0aGUgaW5mb3JtYXRpb24gc2hhcmVkIGJldHdlZW4gCiAgKiB0aGUgaHlwZXJ2aXNvciBhbmQgTGludXguICAKQEAgLTIwMCw3ICsxOTMsNyBAQAogCQkwLDAsMCwJCQkvKiAxMyAtIDE1ICovCiAJCXNpemVvZihzdHJ1Y3QgSW9IcmlQcm9jZXNzb3JWcGQpLC8qIDE2IGxlbmd0aCBvZiBQcm9jIFZwZCAqLwogCQkwLDAsMCwwLDAsMCwJCS8qIDE3IC0gMjIgICovCi0JCXNpemVvZihzdHJ1Y3QgSXRMcFF1ZXVlKSwvKiAgICAgMjMgbGVuZ3RoIG9mIExwIFF1ZXVlICovCisJCXNpemVvZihzdHJ1Y3QgaHZscGV2ZW50X3F1ZXVlKSwJLyogMjMgbGVuZ3RoIG9mIExwIFF1ZXVlICovCiAJCTAsMAkJCS8qIDI0IC0gMjUgKi8KIAkJfSwKIAkueFNsaWNWcGRBZHJzID0gewkJCS8qIFZQRCBhZGRyZXNzZXMgKi8KQEAgLTIxOCw3ICsyMTEsNyBAQAogCQkwLDAsMCwJCQkvKiAxMyAtIDE1ICovCiAJCSZ4SW9IcmlQcm9jZXNzb3JWcGQsCS8qICAgICAgMTYgUHJvYyBWcGQgKi8KIAkJMCwwLDAsMCwwLDAsCQkvKiAxNyAtIDIyICovCi0JCSZ4SXRMcFF1ZXVlLAkJLyogICAgICAyMyBMcCBRdWV1ZSAqLworCQkmaHZscGV2ZW50X3F1ZXVlLAkvKiAgICAgIDIzIExwIFF1ZXVlICovCiAJCTAsMAogCX0KIH07CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvcHBjNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGRmZmJmYjcuLmQ5YjI2NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL01ha2VmaWxlCkBAIC0zNiw2ICszNiw3IEBACiBvYmotJChDT05GSUdfUFBDX0JQQSkgKz0gYnBhX3NldHVwLm8gYnBhX2lvbW11Lm8gYnBhX252cmFtLm8gXAogCQkJIGJwYV9paWMubyBzcGlkZXItcGljLm8KIAorb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vCiBvYmotJChDT05GSUdfRUVIKQkJKz0gZWVoLm8KIG9iai0kKENPTkZJR19QUk9DX0ZTKQkJKz0gcHJvY19wcGM2NC5vCiBvYmotJChDT05GSUdfUlRBU19GTEFTSCkJKz0gcnRhc19mbGFzaC5vCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvY3B1dGFibGUuYwppbmRleCAxZDE2MmM3Li44ZDRjNDZmIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2NwdXRhYmxlLmMKQEAgLTQ5LDE2MCArNDksMjE5IEBACiAjZW5kaWYKIAogc3RydWN0IGNwdV9zcGVjCWNwdV9zcGVjc1tdID0gewotICAgIHsJLyogUG93ZXIzICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDA0MDAwMDAsICJQT1dFUjMgKDYzMCkiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QTUM4LAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyMywKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBvd2VyMysgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDQxMDAwMCwgIlBPV0VSMyAoNjMwKykiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QTUM4LAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyMywKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIE5vcnRoc3RhciAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzMwMDAwLCAiUlM2NC1JSSAobm9ydGhzdGFyKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyMywKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFB1bHNhciAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzQwMDAwLCAiUlM2NC1JSUkgKHB1bHNhcikiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9JQUJSIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKLQkgICAgQ09NTU9OX1VTRVJfUFBDNjQsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wb3dlcjMsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0sCi0gICAgewkvKiBJLXN0YXIgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDM2MDAwMCwgIlJTNjQtSUlJIChpY2VzdGFyKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX0lBQlIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyMywKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFMtc3RhciAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzcwMDAwLCAiUlM2NC1JViAoc3N0YXIpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXIzLAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogUG93ZXI0ICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzNTAwMDAsICJQT1dFUjQgKGdwKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyNCwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBvd2VyNCsgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDM4MDAwMCwgIlBPV0VSNCsgKGdxKSIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyNCwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBQQzk3MCAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwMzkwMDAwLCAiUFBDOTcwIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJICAgIENQVV9GVFJfQ0FOX05BUCB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3BwYzk3MCwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBQQzk3MEZYICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDAzYzAwMDAsICJQUEM5NzBGWCIsCi0JICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8Ci0JCSAgICBDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9wcGM5NzAsCi0JICAgIENPTU1PTl9QUEM2NF9GVwotICAgIH0sCi0gICAgewkvKiBQb3dlcjUgKi8KLQkgICAgMHhmZmZmMDAwMCwgMHgwMDNhMDAwMCwgIlBPV0VSNSAoZ3IpIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8Ci0JCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfAotCQkgICAgQ1BVX0ZUUl9NTUNSQV9TSUhWLAotCSAgICBDT01NT05fVVNFUl9QUEM2NCwKLQkgICAgMTI4LCAxMjgsCi0JICAgIF9fc2V0dXBfY3B1X3Bvd2VyNCwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIFBvd2VyNSAqLwotCSAgICAweGZmZmYwMDAwLCAweDAwM2IwMDAwLCAiUE9XRVI1IChncykiLAotCSAgICBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAotCQkgICAgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwKLQkJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8Ci0JCSAgICBDUFVfRlRSX01NQ1JBX1NJSFYsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9LAotICAgIHsJLyogQkUgREQxLnggICovCi0JICAgIDB4ZmZmZjAwMDAsIDB4MDA3MDAwMDAsICJCcm9hZGJhbmQgRW5naW5lIiwKLQkgICAgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKLQkJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwKLQkJICAgIENQVV9GVFJfU01ULAotCSAgICBDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCi0JICAgIDEyOCwgMTI4LAotCSAgICBfX3NldHVwX2NwdV9iZSwKLQkgICAgQ09NTU9OX1BQQzY0X0ZXCi0gICAgfSwKLSAgICB7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KLQkgICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgIlBPV0VSNCAoY29tcGF0aWJsZSkiLAotICAJICAgIENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8Ci0JCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIsCi0JICAgIENPTU1PTl9VU0VSX1BQQzY0LAotCSAgICAxMjgsIDEyOCwKLQkgICAgX19zZXR1cF9jcHVfcG93ZXI0LAotCSAgICBDT01NT05fUFBDNjRfRlcKLSAgICB9CisJewkvKiBQb3dlcjMgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDQwMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjMgKDYzMCkiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAorCQkJQ1BVX0ZUUl9QTUM4LAorCQkuY3B1X3VzZXJfZmVhdHVyZXMgPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQb3dlcjMrICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA0MTAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVIzICg2MzArKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIE5vcnRoc3RhciAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwMzMwMDAwLAorCQkuY3B1X25hbWUJCT0gIlJTNjQtSUkgKG5vcnRoc3RhcikiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAorCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUHVsc2FyICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzNDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUlM2NC1JSUkgKHB1bHNhcikiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIgfAorCQkJQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogSS1zdGFyICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzNjAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUlM2NC1JSUkgKGljZXN0YXIpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9JQUJSIHwKKwkJCUNQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX0NUUkwsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFMtc3RhciAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwMzcwMDAwLAorCQkuY3B1X25hbWUJCT0gIlJTNjQtSVYgKHNzdGFyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8CisJCQlDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9DVFJMLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQb3dlcjQgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDM1MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjQgKGdwKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQb3dlcjQrICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzODAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI0KyAoZ3EpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfUE1DOCB8IENQVV9GVFJfTU1DUkEsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBQQzk3MCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwMzkwMDAwLAorCQkuY3B1X25hbWUJCT0gIlBQQzk3MCIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8CisJCQlDUFVfRlRSX0NBTl9OQVAgfCBDUFVfRlRSX1BNQzggfCBDUFVfRlRSX01NQ1JBLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NCB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIFBQQzk3MEZYICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzYzAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUFBDOTcwRlgiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfAorCQkJQ1BVX0ZUUl9DQU5fTkFQIHwgQ1BVX0ZUUl9QTUM4IHwgQ1BVX0ZUUl9NTUNSQSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3BwYzk3MCwKKwkJLmZpcm13YXJlX2ZlYXR1cmVzCT0gQ09NTU9OX1BQQzY0X0ZXLAorCX0sCisJewkvKiBQb3dlcjUgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDNhMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjUgKGdyKSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfAorCQkJQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgfCBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFIHwKKwkJCUNQVV9GVFJfTU1DUkFfU0lIViwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9LAorCXsJLyogUG93ZXI1ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDAzYjAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI1IChncykiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfAorCQkJQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfAorCQkJQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwKKwkJCUNQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8CisJCQlDUFVfRlRSX01NQ1JBX1NJSFYsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIEJFIEREMS54ICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA3MDAwMDAsCisJCS5jcHVfbmFtZQkJPSAiQnJvYWRiYW5kIEVuZ2luZSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8CisJCQlDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8CisJCQlDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8CisJCQlDUFVfRlRSX1NNVCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X2JlLAorCQkuZmlybXdhcmVfZmVhdHVyZXMJPSBDT01NT05fUFBDNjRfRlcsCisJfSwKKwl7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KKwkJLnB2cl9tYXNrCQk9IDB4MDAwMDAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHgwMDAwMDAwMCwKKwkJLmNwdV9uYW1lCQk9ICJQT1dFUjQgKGNvbXBhdGlibGUpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwKKwkJCUNQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwKKwkJCUNQVV9GVFJfUFBDQVNfQVJDSF9WMiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCisJCS5maXJtd2FyZV9mZWF0dXJlcwk9IENPTU1PTl9QUEM2NF9GVywKKwl9CiB9OwogCiBmaXJtd2FyZV9mZWF0dXJlX3QgZmlybXdhcmVfZmVhdHVyZXNfdGFibGVbRklSTVdBUkVfTUFYX0ZFQVRVUkVTXSA9IHsKLSAgICB7RldfRkVBVFVSRV9QRlQsCQkiaGNhbGwtcGZ0In0sCi0gICAge0ZXX0ZFQVRVUkVfVENFLAkJImhjYWxsLXRjZSJ9LAotICAgIHtGV19GRUFUVVJFX1NQUkcwLAkJImhjYWxsLXNwcmcwIn0sCi0gICAge0ZXX0ZFQVRVUkVfREFCUiwJCSJoY2FsbC1kYWJyIn0sCi0gICAge0ZXX0ZFQVRVUkVfQ09QWSwJCSJoY2FsbC1jb3B5In0sCi0gICAge0ZXX0ZFQVRVUkVfQVNSLAkJImhjYWxsLWFzciJ9LAotICAgIHtGV19GRUFUVVJFX0RFQlVHLAkJImhjYWxsLWRlYnVnIn0sCi0gICAge0ZXX0ZFQVRVUkVfUEVSRiwJCSJoY2FsbC1wZXJmIn0sCi0gICAge0ZXX0ZFQVRVUkVfRFVNUCwJCSJoY2FsbC1kdW1wIn0sCi0gICAge0ZXX0ZFQVRVUkVfSU5URVJSVVBULAkiaGNhbGwtaW50ZXJydXB0In0sCi0gICAge0ZXX0ZFQVRVUkVfTUlHUkFURSwJImhjYWxsLW1pZ3JhdGUifSwKLSAgICB7RldfRkVBVFVSRV9QRVJGTU9OLAkiaGNhbGwtcGVyZm1vbiJ9LAotICAgIHtGV19GRUFUVVJFX0NSUSwgICAgCSJoY2FsbC1jcnEifSwKLSAgICB7RldfRkVBVFVSRV9WSU8sCSAgICAgICAgImhjYWxsLXZpbyJ9LAotICAgIHtGV19GRUFUVVJFX1JETUEsCSAgICAgICAgImhjYWxsLXJkbWEifSwKLSAgICB7RldfRkVBVFVSRV9MTEFOLAkgICAgICAgICJoY2FsbC1sTEFOIn0sCi0gICAge0ZXX0ZFQVRVUkVfQlVMSywgICAJImhjYWxsLWJ1bGsifSwKLSAgICB7RldfRkVBVFVSRV9YREFCUiwgIAkiaGNhbGwteGRhYnIifSwKLSAgICB7RldfRkVBVFVSRV9NVUxUSVRDRSwJImhjYWxsLW11bHRpLXRjZSJ9LAotICAgIHtGV19GRUFUVVJFX1NQTFBBUiwJICAgICAgICAiaGNhbGwtc3BscGFyIn0sCisJe0ZXX0ZFQVRVUkVfUEZULAkJImhjYWxsLXBmdCJ9LAorCXtGV19GRUFUVVJFX1RDRSwJCSJoY2FsbC10Y2UifSwKKwl7RldfRkVBVFVSRV9TUFJHMCwJCSJoY2FsbC1zcHJnMCJ9LAorCXtGV19GRUFUVVJFX0RBQlIsCQkiaGNhbGwtZGFiciJ9LAorCXtGV19GRUFUVVJFX0NPUFksCQkiaGNhbGwtY29weSJ9LAorCXtGV19GRUFUVVJFX0FTUiwJCSJoY2FsbC1hc3IifSwKKwl7RldfRkVBVFVSRV9ERUJVRywJCSJoY2FsbC1kZWJ1ZyJ9LAorCXtGV19GRUFUVVJFX1BFUkYsCQkiaGNhbGwtcGVyZiJ9LAorCXtGV19GRUFUVVJFX0RVTVAsCQkiaGNhbGwtZHVtcCJ9LAorCXtGV19GRUFUVVJFX0lOVEVSUlVQVCwJCSJoY2FsbC1pbnRlcnJ1cHQifSwKKwl7RldfRkVBVFVSRV9NSUdSQVRFLAkJImhjYWxsLW1pZ3JhdGUifSwKKwl7RldfRkVBVFVSRV9QRVJGTU9OLAkJImhjYWxsLXBlcmZtb24ifSwKKwl7RldfRkVBVFVSRV9DUlEsCQkiaGNhbGwtY3JxIn0sCisJe0ZXX0ZFQVRVUkVfVklPLAkJImhjYWxsLXZpbyJ9LAorCXtGV19GRUFUVVJFX1JETUEsCQkiaGNhbGwtcmRtYSJ9LAorCXtGV19GRUFUVVJFX0xMQU4sCQkiaGNhbGwtbExBTiJ9LAorCXtGV19GRUFUVVJFX0JVTEssCQkiaGNhbGwtYnVsayJ9LAorCXtGV19GRUFUVVJFX1hEQUJSLAkJImhjYWxsLXhkYWJyIn0sCisJe0ZXX0ZFQVRVUkVfTVVMVElUQ0UsCQkiaGNhbGwtbXVsdGktdGNlIn0sCisJe0ZXX0ZFQVRVUkVfU1BMUEFSLAkJImhjYWxsLXNwbHBhciJ9LAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwppbmRleCAwMmM4ZjRlLi45M2ViY2FjMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2hlYWQuUwpAQCAtMzA4LDYgKzMwOCw3IEBACiBsYWJlbCMjX3BTZXJpZXM6CQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCVwKIAltdHNwcglTUFJHMSxyMTM7CQkvKiBzYXZlIHIxMyAqLwlcCisJUlVOTEFUQ0hfT04ocjEzKTsJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbikKIAogI2RlZmluZSBTVERfRVhDRVBUSU9OX0lTRVJJRVMobiwgbGFiZWwsIGFyZWEpCQlcCkBAIC0zMTUsNiArMzE2LDcgQEAKIGxhYmVsIyNfaVNlcmllczoJCQkJCVwKIAlITVRfTUVESVVNOwkJCQkJXAogCW10c3ByCVNQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCVwKKwlSVU5MQVRDSF9PTihyMTMpOwkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzEoYXJlYSk7CQlcCiAJRVhDRVBUSU9OX1BST0xPR19JU0VSSUVTXzI7CQkJXAogCWIJbGFiZWwjI19jb21tb24KQEAgLTMyNCw2ICszMjYsNyBAQAogbGFiZWwjI19pU2VyaWVzOgkJCQkJCQlcCiAJSE1UX01FRElVTTsJCQkJCQkJXAogCW10c3ByCVNQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCQkJXAorCVJVTkxBVENIX09OKHIxMyk7CQkJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfSVNFUklFU18xKFBBQ0FfRVhHRU4pOwkJCQlcCiAJbGJ6CXIxMCxQQUNBUFJPQ0VOQUJMRUQocjEzKTsJCQkJXAogCWNtcHdpCTAscjEwLDA7CQkJCQkJXApAQCAtMzkzLDYgKzM5Niw3IEBACiBfbWFjaGluZV9jaGVja19wU2VyaWVzOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJHMSxyMTMJCS8qIHNhdmUgcjEzICovCisJUlVOTEFUQ0hfT04ocjEzKQogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYTUMsIG1hY2hpbmVfY2hlY2tfY29tbW9uKQogCiAJLiA9IDB4MzAwCkBAIC00MTksNiArNDIzLDcgQEAKIGRhdGFfYWNjZXNzX3NsYl9wU2VyaWVzOgogCUhNVF9NRURJVU0KIAltdHNwcglTUFJHMSxyMTMKKwlSVU5MQVRDSF9PTihyMTMpCiAJbWZzcHIJcjEzLFNQUkczCQkvKiBnZXQgcGFjYSBhZGRyZXNzIGludG8gcjEzICovCiAJc3RkCXI5LFBBQ0FfRVhTTEIrRVhfUjkocjEzKQkvKiBzYXZlIHI5IC0gcjEyICovCiAJc3RkCXIxMCxQQUNBX0VYU0xCK0VYX1IxMChyMTMpCkBAIC00MzksNiArNDQ0LDcgQEAKIGluc3RydWN0aW9uX2FjY2Vzc19zbGJfcFNlcmllczoKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCisJUlVOTEFUQ0hfT04ocjEzKQogCW1mc3ByCXIxMyxTUFJHMwkJLyogZ2V0IHBhY2EgYWRkcmVzcyBpbnRvIHIxMyAqLwogCXN0ZAlyOSxQQUNBX0VYU0xCK0VYX1I5KHIxMykJLyogc2F2ZSByOSAtIHIxMiAqLwogCXN0ZAlyMTAsUEFDQV9FWFNMQitFWF9SMTAocjEzKQpAQCAtNDY0LDYgKzQ3MCw3IEBACiAJLmdsb2JsCXN5c3RlbV9jYWxsX3BTZXJpZXMKIHN5c3RlbV9jYWxsX3BTZXJpZXM6CiAJSE1UX01FRElVTQorCVJVTkxBVENIX09OKHI5KQogCW1yCXI5LHIxMwogCW1mbXNyCXIxMAogCW1mc3ByCXIxMyxTUFJHMwpAQCAtNzA3LDExICs3MTQsMTMgQEAKIHN5c3RlbV9yZXNldF9md25taToKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCVJVTkxBVENIX09OKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgc3lzdGVtX3Jlc2V0X2NvbW1vbikKIAkuZ2xvYmwgbWFjaGluZV9jaGVja19md25taQogbWFjaGluZV9jaGVja19md25taToKIAlITVRfTUVESVVNCiAJbXRzcHIJU1BSRzEscjEzCQkvKiBzYXZlIHIxMyAqLworCVJVTkxBVENIX09OKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWE1DLCBtYWNoaW5lX2NoZWNrX2NvbW1vbikKIAogCS8qCkBAIC04NDgsNiArODU3LDcgQEAKIAkuYWxpZ24JNwogCS5nbG9ibCBkYXRhX2FjY2Vzc19jb21tb24KIGRhdGFfYWNjZXNzX2NvbW1vbjoKKwlSVU5MQVRDSF9PTihyMTApCQkvKiBJdCB3b250IGZpdCBpbiB0aGUgMHgzMDAgaGFuZGxlciAqLwogCW1mc3ByCXIxMCxEQVIKIAlzdGQJcjEwLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKIAltZnNwcglyMTAsRFNJU1IKQEAgLTExOTQsNyArMTIwNCw3IEBACiAJYmwJLl9fcmVzdG9yZV9jcHVfc2V0dXAKIAogCS8qIFNldCB1cCBhIHBhY2EgdmFsdWUgZm9yIHRoaXMgcHJvY2Vzc29yLiBTaW5jZSB3ZSBoYXZlIHRoZQotCSAqIHBoeXNpY2FsIGNwdSBpZCBpbiByMywgd2UgbmVlZCB0byBzZWFyY2ggdGhlIHBhY2FzIHRvIGZpbmQKKwkgKiBwaHlzaWNhbCBjcHUgaWQgaW4gcjI0LCB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgcGFjYXMgdG8gZmluZAogCSAqIHdoaWNoIGxvZ2ljYWwgaWQgbWFwcyB0byBvdXIgcGh5c2ljYWwgb25lLgogCSAqLwogCUxPQURBRERSKHIxMywgcGFjYSkgCQkvKiBHZXQgYmFzZSB2YWRkciBvZiBwYWNhIGFycmF5CSAqLwpAQCAtMTIwNyw4ICsxMjE3LDggQEAKIAljbXB3aQlyNSxOUl9DUFVTCiAJYmx0CTFiCiAKLTk5OglITVRfTE9XCQkJCS8qIENvdWxkbid0IGZpbmQgb3VyIENQVSBpZCAgICAgICovCi0JYgk5OWIKKwltcglyMyxyMjQJCQkvKiBub3QgZm91bmQsIGNvcHkgcGh5cyB0byByMwkgKi8KKwliCS5rZXhlY193YWl0CQkvKiBuZXh0IGtlcm5lbCBtaWdodCBkbyBiZXR0ZXIJICovCiAKIDI6CW10c3ByCVNQUkczLHIxMwkJLyogU2F2ZSB2YWRkciBvZiBwYWNhIGluIFNQUkczCSAqLwogCS8qIEZyb20gbm93IG9uLCByMjQgaXMgZXhwZWN0ZWQgdG8gYmUgbG9naWNhIGNwdWlkICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9odmNvbnNvbGUuYyBiL2FyY2gvcHBjNjQva2VybmVsL2h2Y29uc29sZS5jCmluZGV4IGM3MmZiOGYuLjEzOGUxMjggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2h2Y29uc29sZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2h2Y29uc29sZS5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2h2Y2FsbC5oPgogI2luY2x1ZGUgPGFzbS9odmNvbnNvbGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiAvKioKICAqIGh2Y19nZXRfY2hhcnMgLSByZXRyaWV2ZSBjaGFyYWN0ZXJzIGZyb20gZmlybXdhcmUgZm9yIGRlbm90ZWQgdnRlcm0gYWRhdHBlcgpAQCAtNDIsMjkgKzQxLDE0IEBACiAJdW5zaWduZWQgbG9uZyBnb3Q7CiAKIAlpZiAocGxwYXJfaGNhbGwoSF9HRVRfVEVSTV9DSEFSLCB2dGVybW5vLCAwLCAwLCAwLCAmZ290LAotCQkodW5zaWduZWQgbG9uZyAqKWJ1ZiwgKHVuc2lnbmVkIGxvbmcgKilidWYrMSkgPT0gSF9TdWNjZXNzKSB7Ci0JCS8qCi0JCSAqIFdvcmsgYXJvdW5kIGEgSFYgYnVnIHdoZXJlIGl0IGdpdmVzIHVzIGEgbnVsbAotCQkgKiBhZnRlciBldmVyeSBcci4gIC0tIHBhdWx1cwotCQkgKi8KLQkJaWYgKGdvdCA+IDApIHsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMTsgaSA8IGdvdDsgKytpKSB7Ci0JCQkJaWYgKGJ1ZltpXSA9PSAwICYmIGJ1ZltpLTFdID09ICdccicpIHsKLQkJCQkJLS1nb3Q7Ci0JCQkJCWlmIChpIDwgZ290KQotCQkJCQkJbWVtbW92ZSgmYnVmW2ldLCAmYnVmW2krMV0sCi0JCQkJCQkJZ290IC0gaSk7Ci0JCQkJfQotCQkJfQotCQl9CisJCSh1bnNpZ25lZCBsb25nICopYnVmLCAodW5zaWduZWQgbG9uZyAqKWJ1ZisxKSA9PSBIX1N1Y2Nlc3MpCiAJCXJldHVybiBnb3Q7Ci0JfQogCXJldHVybiAwOwogfQogCiBFWFBPUlRfU1lNQk9MKGh2Y19nZXRfY2hhcnMpOwogCisKIC8qKgogICogaHZjX3B1dF9jaGFyczogc2VuZCBjaGFyYWN0ZXJzIHRvIGZpcm13YXJlIGZvciBkZW5vdGVkIHZ0ZXJtIGFkYXB0ZXIKICAqIEB2dGVybW5vOiBUaGUgdnRlcm1ubyBvciB1bml0X2FkZHJlc3Mgb2YgdGhlIGFkYXB0ZXIgZnJvbSB3aGljaCB0aGUgZGF0YQpAQCAtODgsMzQgKzcyLDMgQEAKIH0KIAogRVhQT1JUX1NZTUJPTChodmNfcHV0X2NoYXJzKTsKLQotLyoKLSAqIFdlIGhvcGUvYXNzdW1lIHRoYXQgdGhlIGZpcnN0IHZ0eSBmb3VuZCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgY29uc29sZQotICogZGV2aWNlLgotICovCi1pbnQgaHZjX2ZpbmRfdnR5cyh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdnR5OwotCWludCBudW1fZm91bmQgPSAwOwotCi0JZm9yICh2dHkgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidnR5Iik7IHZ0eSAhPSBOVUxMOwotCQkJdnR5ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUodnR5LCAidnR5IikpIHsKLQkJdWludDMyX3QgKnZ0ZXJtbm87Ci0KLQkJLyogV2UgaGF2ZSBzdGF0aWNhbGx5IGRlZmluZWQgc3BhY2UgZm9yIG9ubHkgYSBjZXJ0YWluIG51bWJlciBvZgotCQkgKiBjb25zb2xlIGFkYXB0ZXJzLiAqLwotCQlpZiAobnVtX2ZvdW5kID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCi0JCQlicmVhazsKLQotCQl2dGVybW5vID0gKHVpbnQzMl90ICopZ2V0X3Byb3BlcnR5KHZ0eSwgInJlZyIsIE5VTEwpOwotCQlpZiAoIXZ0ZXJtbm8pCi0JCQljb250aW51ZTsKLQotCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUodnR5LCAiaHZ0ZXJtMSIpKSB7Ci0JCQlodmNfaW5zdGFudGlhdGUoKnZ0ZXJtbm8sIG51bV9mb3VuZCk7Ci0JCQkrK251bV9mb3VuZDsKLQkJfQotCX0KLQotCXJldHVybiBudW1fZm91bmQ7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX3Byb2MuYyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfcHJvYy5jCmluZGV4IDM1NmJkOTkuLjBmZTMxMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfcHJvYy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfcHJvYy5jCkBAIC00MCw1MCArNDAsNiBAQAogfQogY29yZV9pbml0Y2FsbChpc2VyaWVzX3Byb2NfY3JlYXRlKTsKIAotc3RhdGljIGNoYXIgKmV2ZW50X3R5cGVzWzldID0gewotCSJIeXBlcnZpc29yXHRcdCIsCi0JIk1hY2hpbmUgRmFjaWxpdGllc1x0IiwKLQkiU2Vzc2lvbiBNYW5hZ2VyXHQiLAotCSJTUEQgSS9PXHRcdCIsCi0JIlZpcnR1YWwgQnVzXHRcdCIsCi0JIlBDSSBJL09cdFx0IiwKLQkiUklPIEkvT1x0XHQiLAotCSJWaXJ0dWFsIExhblx0XHQiLAotCSJWaXJ0dWFsIEkvT1x0XHQiCi19OwotCi1zdGF0aWMgaW50IHByb2NfbHBldmVudHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlzZXFfcHJpbnRmKG0sICJMcEV2ZW50UXVldWUgMFxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiICBldmVudHMgcHJvY2Vzc2VkOlx0JWx1XG4iLAotCQkgICAodW5zaWduZWQgbG9uZyl4SXRMcFF1ZXVlLnhMcEludENvdW50KTsKLQotCWZvciAoaSA9IDA7IGkgPCA5OyArK2kpCi0JCXNlcV9wcmludGYobSwgIiAgICAlcyAlMTBsdVxuIiwgZXZlbnRfdHlwZXNbaV0sCi0JCQkgICAodW5zaWduZWQgbG9uZyl4SXRMcFF1ZXVlLnhMcEludENvdW50QnlUeXBlW2ldKTsKLQotCXNlcV9wcmludGYobSwgIlxuICBldmVudHMgcHJvY2Vzc2VkIGJ5IHByb2Nlc3NvcjpcbiIpOwotCi0JZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQlzZXFfcHJpbnRmKG0sICIgICAgQ1BVJTAyZCAgJTEwdVxuIiwgaSwgcGFjYVtpXS5scGV2ZW50X2NvdW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByb2NfbHBldmVudHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY19scGV2ZW50c19zaG93LCBOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19scGV2ZW50c19vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHByb2NfbHBldmVudHNfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RhcnRUaXRhbiA9IDA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzdGFydFRiID0gMDsKIApAQCAtMTQ4LDEwICsxMDQsNiBAQAogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKIAotCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiaVNlcmllcy9scGV2ZW50cyIsIFNfSUZSRUd8U19JUlVHTywgTlVMTCk7Ci0JaWYgKGUpCi0JCWUtPnByb2NfZm9wcyA9ICZwcm9jX2xwZXZlbnRzX29wZXJhdGlvbnM7Ci0KIAllID0gY3JlYXRlX3Byb2NfZW50cnkoImlTZXJpZXMvdGl0YW5Ub2QiLCBTX0lGUkVHfFNfSVJVR08sIE5VTEwpOwogCWlmIChlKQogCQllLT5wcm9jX2ZvcHMgPSAmcHJvY190aXRhbnRvZF9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaVNlcmllc19zZXR1cC5jCmluZGV4IDg2OTY2Y2UuLjA3N2M4MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lTZXJpZXNfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9pU2VyaWVzX3NldHVwLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgpAQCAtNjc2LDcgKzY3NSw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBpU2VyaWVzX3NldHVwX2FyY2godm9pZCkKIHsKLQl2b2lkICpldmVudFN0YWNrOwogCXVuc2lnbmVkIHByb2NJeCA9IGdldF9wYWNhKCktPmxwcGFjYS5keW5faHZfcGh5c19wcm9jX2luZGV4OwogCiAJLyogQWRkIGFuIGV5ZSBjYXRjaGVyIGFuZCB0aGUgc3lzdGVtY2ZnIGxheW91dCB2ZXJzaW9uIG51bWJlciAqLwpAQCAtNjg1LDI0ICs2ODMsNyBAQAogCXN5c3RlbWNmZy0+dmVyc2lvbi5taW5vciA9IFNZU1RFTUNGR19NSU5PUjsKIAogCS8qIFNldHVwIHRoZSBMcCBFdmVudCBRdWV1ZSAqLwotCi0JLyogQWxsb2NhdGUgYSBwYWdlIGZvciB0aGUgRXZlbnQgU3RhY2sKLQkgKiBUaGUgaHlwZXJ2aXNvciB3YW50cyB0aGUgYWJzb2x1dGUgcmVhbCBhZGRyZXNzLCBzbwotCSAqIHdlIHN1YnRyYWN0IG91dCB0aGUgS0VSTkVMQkFTRSBhbmQgYWRkIGluIHRoZQotCSAqIGFic29sdXRlIHJlYWwgYWRkcmVzcyBvZiB0aGUga2VybmVsIGxvYWQgYXJlYQotCSAqLwotCWV2ZW50U3RhY2sgPSBhbGxvY19ib290bWVtX3BhZ2VzKExwRXZlbnRTdGFja1NpemUpOwotCW1lbXNldChldmVudFN0YWNrLCAwLCBMcEV2ZW50U3RhY2tTaXplKTsKLQotCS8qIEludm9rZSB0aGUgaHlwZXJ2aXNvciB0byBpbml0aWFsaXplIHRoZSBldmVudCBzdGFjayAqLwotCUh2Q2FsbEV2ZW50X3NldExwRXZlbnRTdGFjaygwLCBldmVudFN0YWNrLCBMcEV2ZW50U3RhY2tTaXplKTsKLQotCS8qIEluaXRpYWxpemUgZmllbGRzIGluIG91ciBMcCBFdmVudCBRdWV1ZSAqLwotCXhJdExwUXVldWUueFNsaWNFdmVudFN0YWNrUHRyID0gKGNoYXIgKilldmVudFN0YWNrOwotCXhJdExwUXVldWUueFNsaWNDdXJFdmVudFB0ciA9IChjaGFyICopZXZlbnRTdGFjazsKLQl4SXRMcFF1ZXVlLnhTbGljTGFzdFZhbGlkRXZlbnRQdHIgPSAoY2hhciAqKWV2ZW50U3RhY2sgKwotCQkJCQkoTHBFdmVudFN0YWNrU2l6ZSAtIExwRXZlbnRNYXhTaXplKTsKLQl4SXRMcFF1ZXVlLnhJbmRleCA9IDA7CisJc2V0dXBfaHZscGV2ZW50X3F1ZXVlKCk7CiAKIAkvKiBDb21wdXRlIHByb2Nlc3NvciBmcmVxdWVuY3kgKi8KIAlwcm9jRnJlcUh6ID0gKCgxVUwgPDwgMzQpICogMTAwMDAwMCkgLwpAQCAtODUzLDI3ICs4MzQsOTEgQEAKIAogbGF0ZV9pbml0Y2FsbChpU2VyaWVzX3NyY19pbml0KTsKIAotc3RhdGljIGludCBzZXRfc3ByZWFkX2xwZXZlbnRzKGNoYXIgKnN0cikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpOwotCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKKwlhc20gdm9sYXRpbGUgKCJsaSAwLDB4NTU1NTsgc2MiIDogOiA6ICJyMCIsICJyMyIpOworfQorCitzdGF0aWMgdm9pZCB5aWVsZF9zaGFyZWRfcHJvY2Vzc29yKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0YjsKKworCUh2Q2FsbF9zZXRFbmFibGVkSW50ZXJydXB0cyhIdkNhbGxfTWFza0lQSSB8CisJCQkJICAgIEh2Q2FsbF9NYXNrTHBFdmVudCB8CisJCQkJICAgIEh2Q2FsbF9NYXNrTHBQcm9kIHwKKwkJCQkgICAgSHZDYWxsX01hc2tUaW1lb3V0KTsKKworCXRiID0gZ2V0X3RiKCk7CisJLyogQ29tcHV0ZSBmdXR1cmUgdGIgdmFsdWUgd2hlbiB5aWVsZCBzaG91bGQgZXhwaXJlICovCisJSHZDYWxsX3lpZWxkUHJvY2Vzc29yKEh2Q2FsbF9ZaWVsZFRpbWVkLCB0Yit0Yl90aWNrc19wZXJfamlmZnkpOwogCiAJLyoKLQkgKiBUaGUgcGFyYW1ldGVyIGlzIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyB0byBzaGFyZSBpbiBwcm9jZXNzaW5nCi0JICogbHAgZXZlbnRzLgorCSAqIFRoZSBkZWNyZW1lbnRlciBzdG9wcyBkdXJpbmcgdGhlIHlpZWxkLiAgRm9yY2UgYSBmYWtlIGRlY3JlbWVudGVyCisJICogaGVyZSBhbmQgbGV0IHRoZSB0aW1lcl9pbnRlcnJ1cHQgY29kZSBzb3J0IG91dCB0aGUgYWN0dWFsIHRpbWUuCiAJICovCi0JaWYgKCggdmFsID4gMCkgJiYgKHZhbCA8PSBOUl9DUFVTKSkgewotCQlmb3IgKGkgPSAxOyBpIDwgdmFsOyArK2kpCi0JCQlwYWNhW2ldLmxwcXVldWVfcHRyID0gcGFjYVswXS5scHF1ZXVlX3B0cjsKKwlnZXRfcGFjYSgpLT5scHBhY2EuaW50X2R3b3JkLmZpZWxkcy5kZWNyX2ludCA9IDE7CisJcHJvY2Vzc19pU2VyaWVzX2V2ZW50cygpOworfQogCi0JCXByaW50aygibHBldmVudCBwcm9jZXNzaW5nIHNwcmVhZCBvdmVyICVsZCBwcm9jZXNzb3JzXG4iLCB2YWwpOwotCX0gZWxzZSB7Ci0JCXByaW50aygiaW52YWxpZCBzcHJlYWRfbHBldmVudHMgJWxkXG4iLCB2YWwpOworc3RhdGljIGludCBpc2VyaWVzX3NoYXJlZF9pZGxlKHZvaWQpCit7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkgeworCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJCXBwYzY0X3J1bmxhdGNoX29mZigpOworCisJCQkvKiBSZWNoZWNrIHdpdGggaXJxcyBvZmYgKi8KKwkJCWlmICghbmVlZF9yZXNjaGVkKCkgJiYgIWh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCQkJeWllbGRfc2hhcmVkX3Byb2Nlc3NvcigpOworCisJCQlITVRfbWVkaXVtKCk7CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCX0KKworCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCisJCWlmIChodmxwZXZlbnRfaXNfcGVuZGluZygpKQorCQkJcHJvY2Vzc19pU2VyaWVzX2V2ZW50cygpOworCisJCXNjaGVkdWxlKCk7CiAJfQogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9Ci1fX3NldHVwKCJzcHJlYWRfbHBldmVudHM9Iiwgc2V0X3NwcmVhZF9scGV2ZW50cyk7CisKK3N0YXRpYyBpbnQgaXNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKQoreworCWxvbmcgb2xkdmFsOworCisJd2hpbGUgKDEpIHsKKwkJb2xkdmFsID0gdGVzdF9hbmRfY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCk7CisKKwkJaWYgKCFvbGR2YWwpIHsKKwkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCisJCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CisJCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisJCQkJSE1UX2xvdygpOworCisJCQkJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpIHsKKwkJCQkJSE1UX21lZGl1bSgpOworCQkJCQlwcGM2NF9ydW5sYXRjaF9vbigpOworCQkJCQlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7CisJCQkJfQorCQkJfQorCisJCQlITVRfbWVkaXVtKCk7CisJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCQl9IGVsc2UgeworCQkJc2V0X25lZWRfcmVzY2hlZCgpOworCQl9CisKKwkJcHBjNjRfcnVubGF0Y2hfb24oKTsKKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KIAogI2lmbmRlZiBDT05GSUdfUENJCiB2b2lkIF9faW5pdCBpU2VyaWVzX2luaXRfSVJRKHZvaWQpIHsgfQpAQCAtOTAwLDUgKzk0NSwxMyBAQAogCXBwY19tZC5nZXRfcnRjX3RpbWUgPSBpU2VyaWVzX2dldF9ydGNfdGltZTsKIAlwcGNfbWQuY2FsaWJyYXRlX2RlY3IgPSBpU2VyaWVzX2NhbGlicmF0ZV9kZWNyOwogCXBwY19tZC5wcm9ncmVzcyA9IGlTZXJpZXNfcHJvZ3Jlc3M7CisKKwlpZiAoZ2V0X3BhY2EoKS0+bHBwYWNhLnNoYXJlZF9wcm9jKSB7CisJCXBwY19tZC5pZGxlX2xvb3AgPSBpc2VyaWVzX3NoYXJlZF9pZGxlOworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7CisJfSBlbHNlIHsKKwkJcHBjX21kLmlkbGVfbG9vcCA9IGlzZXJpZXNfZGVkaWNhdGVkX2lkbGU7CisJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOworCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvaWRsZS5jCmluZGV4IGJkZjEzYjQuLjk1NDM5NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9pZGxlLmMKQEAgLTIwLDEwOSArMjAsMTggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2lTZXJpZXMvSHZDYWxsLmg+Ci0jaW5jbHVkZSA8YXNtL2lTZXJpZXMvSXRMcFF1ZXVlLmg+Ci0jaW5jbHVkZSA8YXNtL3BscGFyX3dyYXBwZXJzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbWNmZy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAKIGV4dGVybiB2b2lkIHBvd2VyNF9pZGxlKHZvaWQpOwogCi1zdGF0aWMgaW50ICgqaWRsZV9sb29wKSh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4WWllbGRUaW1lID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1pbllpZWxkVGltZSA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJvY2Vzc19pU2VyaWVzX2V2ZW50cyh2b2lkKQotewotCWFzbSB2b2xhdGlsZSAoImxpIDAsMHg1NTU1OyBzYyIgOiA6IDogInIwIiwgInIzIik7Ci19Ci0KLXN0YXRpYyB2b2lkIHlpZWxkX3NoYXJlZF9wcm9jZXNzb3Iodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRiOwotCXVuc2lnbmVkIGxvbmcgeWllbGRUaW1lOwotCi0JSHZDYWxsX3NldEVuYWJsZWRJbnRlcnJ1cHRzKEh2Q2FsbF9NYXNrSVBJIHwKLQkJCQkgICAgSHZDYWxsX01hc2tMcEV2ZW50IHwKLQkJCQkgICAgSHZDYWxsX01hc2tMcFByb2QgfAotCQkJCSAgICBIdkNhbGxfTWFza1RpbWVvdXQpOwotCi0JdGIgPSBnZXRfdGIoKTsKLQkvKiBDb21wdXRlIGZ1dHVyZSB0YiB2YWx1ZSB3aGVuIHlpZWxkIHNob3VsZCBleHBpcmUgKi8KLQlIdkNhbGxfeWllbGRQcm9jZXNzb3IoSHZDYWxsX1lpZWxkVGltZWQsIHRiK3RiX3RpY2tzX3Blcl9qaWZmeSk7Ci0KLQl5aWVsZFRpbWUgPSBnZXRfdGIoKSAtIHRiOwotCWlmICh5aWVsZFRpbWUgPiBtYXhZaWVsZFRpbWUpCi0JCW1heFlpZWxkVGltZSA9IHlpZWxkVGltZTsKLQotCWlmICh5aWVsZFRpbWUgPCBtaW5ZaWVsZFRpbWUpCi0JCW1pbllpZWxkVGltZSA9IHlpZWxkVGltZTsKLQkKLQkvKgotCSAqIFRoZSBkZWNyZW1lbnRlciBzdG9wcyBkdXJpbmcgdGhlIHlpZWxkLiAgRm9yY2UgYSBmYWtlIGRlY3JlbWVudGVyCi0JICogaGVyZSBhbmQgbGV0IHRoZSB0aW1lcl9pbnRlcnJ1cHQgY29kZSBzb3J0IG91dCB0aGUgYWN0dWFsIHRpbWUuCi0JICovCi0JZ2V0X3BhY2EoKS0+bHBwYWNhLmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAxOwotCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKLX0KLQotc3RhdGljIGludCBpU2VyaWVzX2lkbGUodm9pZCkKLXsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhOwotCWxvbmcgb2xkdmFsOwotCi0JLyogZW5zdXJlIGlTZXJpZXMgcnVuIGxpZ2h0IHdpbGwgYmUgb3V0IHdoZW4gaWRsZSAqLwotCXBwYzY0X3J1bmxhdGNoX29mZigpOwotCi0JbHBhY2EgPSBnZXRfcGFjYSgpOwotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKGxwYWNhLT5scHBhY2Euc2hhcmVkX3Byb2MpIHsKLQkJCWlmIChJdExwUXVldWVfaXNMcEludFBlbmRpbmcobHBhY2EtPmxwcXVldWVfcHRyKSkKLQkJCQlwcm9jZXNzX2lTZXJpZXNfZXZlbnRzKCk7Ci0JCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJCXlpZWxkX3NoYXJlZF9wcm9jZXNzb3IoKTsKLQkJfSBlbHNlIHsKLQkJCW9sZHZhbCA9IHRlc3RfYW5kX2NsZWFyX3RocmVhZF9mbGFnKFRJRl9ORUVEX1JFU0NIRUQpOwotCi0JCQlpZiAoIW9sZHZhbCkgewotCQkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCi0JCQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewotCQkJCQlITVRfbWVkaXVtKCk7Ci0JCQkJCWlmIChJdExwUXVldWVfaXNMcEludFBlbmRpbmcobHBhY2EtPmxwcXVldWVfcHRyKSkKLQkJCQkJCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKLQkJCQkJSE1UX2xvdygpOwotCQkJCX0KLQotCQkJCUhNVF9tZWRpdW0oKTsKLQkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRfbmVlZF9yZXNjaGVkKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcGM2NF9ydW5sYXRjaF9vbigpOwotCQlzY2hlZHVsZSgpOwotCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UKLQotc3RhdGljIGludCBkZWZhdWx0X2lkbGUodm9pZCkKK2ludCBkZWZhdWx0X2lkbGUodm9pZCkKIHsKIAlsb25nIG9sZHZhbDsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtMTM0LDcgKzQzLDggQEAKIAkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwogCiAJCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKSB7Ci0JCQkJYmFycmllcigpOworCQkJCXBwYzY0X3J1bmxhdGNoX29mZigpOworCiAJCQkJLyoKIAkJCQkgKiBHbyBpbnRvIGxvdyB0aHJlYWQgcHJpb3JpdHkgYW5kIHBvc3NpYmx5CiAJCQkJICogbG93IHBvd2VyIG1vZGUuCkBAIC0xNDksNiArNTksNyBAQAogCQkJc2V0X25lZWRfcmVzY2hlZCgpOwogCQl9CiAKKwkJcHBjNjRfcnVubGF0Y2hfb24oKTsKIAkJc2NoZWR1bGUoKTsKIAkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkgJiYgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQogCQkJY3B1X2RpZSgpOwpAQCAtMTU3LDEyNyArNjgsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwotCi1ERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgbG9uZywgc210X3Nub296ZV9kZWxheSk7Ci0KLWludCBkZWRpY2F0ZWRfaWRsZSh2b2lkKQoraW50IG5hdGl2ZV9pZGxlKHZvaWQpCiB7Ci0JbG9uZyBvbGR2YWw7Ci0Jc3RydWN0IHBhY2Ffc3RydWN0ICpscGFjYSA9IGdldF9wYWNhKCksICpwcGFjYTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3Nub296ZTsKLQl1bnNpZ25lZCBsb25nICpzbXRfc25vb3plX2RlbGF5ID0gJl9fZ2V0X2NwdV92YXIoc210X3Nub296ZV9kZWxheSk7Ci0JdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCXBwYWNhID0gJnBhY2FbY3B1IF4gMV07Ci0KIAl3aGlsZSAoMSkgewotCQkvKgotCQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCi0JCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KLQkJICovCi0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDE7CisJCXBwYzY0X3J1bmxhdGNoX29mZigpOwogCi0JCW9sZHZhbCA9IHRlc3RfYW5kX2NsZWFyX3RocmVhZF9mbGFnKFRJRl9ORUVEX1JFU0NIRUQpOwotCQlpZiAoIW9sZHZhbCkgewotCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCQlzdGFydF9zbm9vemUgPSBfX2dldF90YigpICsKLQkJCQkqc210X3Nub296ZV9kZWxheSAqIHRiX3RpY2tzX3Blcl91c2VjOwotCQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkgewotCQkJCS8qCi0JCQkJICogR28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5IGFuZCBwb3NzaWJseQotCQkJCSAqIGxvdyBwb3dlciBtb2RlLgotCQkJCSAqLwotCQkJCUhNVF9sb3coKTsKLQkJCQlITVRfdmVyeV9sb3coKTsKKwkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJCXBvd2VyNF9pZGxlKCk7CiAKLQkJCQlpZiAoKnNtdF9zbm9vemVfZGVsYXkgPT0gMCB8fAotCQkJCSAgICBfX2dldF90YigpIDwgc3RhcnRfc25vb3plKQotCQkJCQljb250aW51ZTsKLQotCQkJCUhNVF9tZWRpdW0oKTsKLQotCQkJCWlmICghKHBwYWNhLT5scHBhY2EuaWRsZSkpIHsKLQkJCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotCQkJCQkvKgotCQkJCQkgKiBXZSBhcmUgYWJvdXQgdG8gc2xlZXAgdGhlIHRocmVhZAotCQkJCQkgKiBhbmQgc28gd29udCBiZSBwb2xsaW5nIGFueQotCQkJCQkgKiBtb3JlLgotCQkJCQkgKi8KLQkJCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKLQotCQkJCQkvKgotCQkJCQkgKiBTTVQgZHluYW1pYyBtb2RlLiBDZWRlIHdpbGwgcmVzdWx0Ci0JCQkJCSAqIGluIHRoaXMgdGhyZWFkIGdvaW5nIGRvcm1hbnQsIGlmIHRoZQotCQkJCQkgKiBwYXJ0bmVyIHRocmVhZCBpcyBzdGlsbCBkb2luZyB3b3JrLgotCQkJCQkgKiBUaHJlYWQgd2FrZXMgdXAgaWYgcGFydG5lciBnb2VzIGlkbGUsCi0JCQkJCSAqIGFuIGludGVycnVwdCBpcyBwcmVzZW50ZWQsIG9yIGEgcHJvZAotCQkJCQkgKiBvY2N1cnMuICBSZXR1cm5pbmcgZnJvbSB0aGUgY2VkZQotCQkJCQkgKiBlbmFibGVzIGV4dGVybmFsIGludGVycnVwdHMuCi0JCQkJCSAqLwotCQkJCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJCQkJY2VkZV9wcm9jZXNzb3IoKTsKLQkJCQkJZWxzZQotCQkJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEdpdmUgdGhlIEhWIGFuIG9wcG9ydHVuaXR5IGF0IHRoZQotCQkJCQkgKiBwcm9jZXNzb3IsIHNpbmNlIHdlIGFyZSBub3QgZG9pbmcKLQkJCQkJICogYW55IHdvcmsuCi0JCQkJCSAqLwotCQkJCQlwb2xsX3BlbmRpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfbmVlZF9yZXNjaGVkKCk7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQkJcHBjNjRfcnVubGF0Y2hfb24oKTsKKwkJCXNjaGVkdWxlKCk7CiAJCX0KIAotCQlITVRfbWVkaXVtKCk7Ci0JCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKLQkJCWNwdV9kaWUoKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhcmVkX2lkbGUodm9pZCkKLXsKLQlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0Jd2hpbGUgKDEpIHsKLQkJLyoKLQkJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQotCQkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCi0JCSAqLwotCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAxOwotCi0JCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKLQkJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KLQkJCS8qCi0JCQkgKiBZaWVsZCB0aGUgcHJvY2Vzc29yIHRvIHRoZSBoeXBlcnZpc29yLiAgV2UgcmV0dXJuIGlmCi0JCQkgKiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgb2NjdXJzICh3aGljaCBhcmUgZHJpdmVuIHByaW9yCi0JCQkgKiB0byByZXR1cm5pbmcgaGVyZSkgb3IgaWYgYSBwcm9kIG9jY3VycyBmcm9tIGFub3RoZXIgCi0JCQkgKiBwcm9jZXNzb3IuIFdoZW4gcmV0dXJuaW5nIGhlcmUsIGV4dGVybmFsIGludGVycnVwdHMKLQkJCSAqIGFyZSBlbmFibGVkLgotCQkJICoKLQkJCSAqIENoZWNrIG5lZWRfcmVzY2hlZCgpIGFnYWluIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAotCQkJICogdG8gYXZvaWQgYSByYWNlLgotCQkJICovCi0JCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJCWNlZGVfcHJvY2Vzc29yKCk7Ci0JCQllbHNlCi0JCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQl9Ci0KLQkJSE1UX21lZGl1bSgpOwotCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAwOwotCQlzY2hlZHVsZSgpOwogCQlpZiAoY3B1X2lzX29mZmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSAmJgogCQkgICAgc3lzdGVtX3N0YXRlID09IFNZU1RFTV9SVU5OSU5HKQogCQkJY3B1X2RpZSgpOwpAQCAtMjg2LDI5ICs4OSwxMCBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCi0KLXN0YXRpYyBpbnQgbmF0aXZlX2lkbGUodm9pZCkKLXsKLQl3aGlsZSgxKSB7Ci0JCS8qIGNoZWNrIENQVSB0eXBlIGhlcmUgKi8KLQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJCXBvd2VyNF9pZGxlKCk7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkKLQkJCXNjaGVkdWxlKCk7Ci0KLQkJaWYgKGNwdV9pc19vZmZsaW5lKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpICYmCi0JCSAgICBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCi0JCQljcHVfZGllKCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX1BQQ19JU0VSSUVTICovCi0KIHZvaWQgY3B1X2lkbGUodm9pZCkKIHsKLQlpZGxlX2xvb3AoKTsKKwlCVUdfT04oTlVMTCA9PSBwcGNfbWQuaWRsZV9sb29wKTsKKwlwcGNfbWQuaWRsZV9sb29wKCk7CiB9CiAKIGludCBwb3dlcnNhdmVfbmFwOwpAQCAtMzQyLDQyICsxMjYsMyBAQAogfQogX19pbml0Y2FsbChyZWdpc3Rlcl9wb3dlcnNhdmVfbmFwX3N5c2N0bCk7CiAjZW5kaWYKLQotaW50IGlkbGVfc2V0dXAodm9pZCkKLXsKLQkvKgotCSAqIE1vdmUgdGhhdCBqdW5rIHRvIGVhY2ggcGxhdGZvcm0gc3BlY2lmaWMgZmlsZSwgZXZlbnR1YWxseSBkZWZpbmUKLQkgKiBhIHBTZXJpZXNfaWRsZSBmb3Igc2hhcmVkIHByb2Nlc3NvciBzdHVmZgotCSAqLwotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlkbGVfbG9vcCA9IGlTZXJpZXNfaWRsZTsKLQlyZXR1cm4gMTsKLSNlbHNlCi0JaWRsZV9sb29wID0gZGVmYXVsdF9pZGxlOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0JaWYgKHN5c3RlbWNmZy0+cGxhdGZvcm0gJiBQTEFURk9STV9QU0VSSUVTKSB7Ci0JCWlmIChjdXJfY3B1X3NwZWMtPmZpcm13YXJlX2ZlYXR1cmVzICYgRldfRkVBVFVSRV9TUExQQVIpIHsKLQkJCWlmIChnZXRfcGFjYSgpLT5scHBhY2Euc2hhcmVkX3Byb2MpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBzaGFyZWQgcHJvY2Vzc29yIGlkbGUgbG9vcFxuIik7Ci0JCQkJaWRsZV9sb29wID0gc2hhcmVkX2lkbGU7Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOwotCQkJCWlkbGVfbG9vcCA9IGRlZGljYXRlZF9pZGxlOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVmYXVsdCBpZGxlIGxvb3BcbiIpOwotCQkJaWRsZV9sb29wID0gZGVmYXVsdF9pZGxlOwotCQl9Ci0JfQotI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwotI2lmbmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlpZiAoc3lzdGVtY2ZnLT5wbGF0Zm9ybSA9PSBQTEFURk9STV9QT1dFUk1BQyB8fAotCSAgICBzeXN0ZW1jZmctPnBsYXRmb3JtID09IFBMQVRGT1JNX01BUExFKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIG5hdGl2ZS9OQVAgaWRsZSBsb29wXG4iKTsKLQkJaWRsZV9sb29wID0gbmF0aXZlX2lkbGU7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19QUENfSVNFUklFUyAqLwotCi0JcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvcHBjNjQva2VybmVsL2lycS5jCmluZGV4IDNkZWZjOGMuLmY0MWFmZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2lycS5jCkBAIC02Niw3ICs2Niw2IEBACiBpbnQgZGlzdHJpYnV0ZV9pcnFzID0gMTsKIGludCBfX2lycV9vZmZzZXRfdmFsdWU7CiBpbnQgcHBjX3NwdXJpb3VzX2ludGVycnVwdHM7Ci11bnNpZ25lZCBsb25nIGxwZXZlbnRfY291bnQ7CiB1NjQgcHBjNjRfaW50ZXJydXB0X2NvbnRyb2xsZXI7CiAKIGludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQpAQCAtMjQ1LDcgKzI0NCw3IEBACiAKIAkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKIAkJaWYgKCFub2lycWRlYnVnKQotCQkJbm90ZV9pbnRlcnJ1cHQoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKKwkJCW5vdGVfaW50ZXJydXB0KGlycSwgZGVzYywgYWN0aW9uX3JldCwgcmVncyk7CiAJCWlmIChsaWtlbHkoIShkZXNjLT5zdGF0dXMgJiBJUlFfUEVORElORykpKQogCQkJYnJlYWs7CiAJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1BFTkRJTkc7CkBAIC0yNjksNyArMjY4LDYgQEAKIHZvaWQgZG9fSVJRKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBwYWNhX3N0cnVjdCAqbHBhY2E7Ci0Jc3RydWN0IEl0THBRdWV1ZSAqbHBxOwogCiAJaXJxX2VudGVyKCk7CiAKQEAgLTI5NSw5ICsyOTMsOCBAQAogCQlpU2VyaWVzX3NtcF9tZXNzYWdlX3JlY3YocmVncyk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KLQlscHEgPSBscGFjYS0+bHBxdWV1ZV9wdHI7Ci0JaWYgKGxwcSAmJiBJdExwUXVldWVfaXNMcEludFBlbmRpbmcobHBxKSkKLQkJbHBldmVudF9jb3VudCArPSBJdExwUXVldWVfcHJvY2VzcyhscHEsIHJlZ3MpOworCWlmIChodmxwZXZlbnRfaXNfcGVuZGluZygpKQorCQlwcm9jZXNzX2h2bHBldmVudHMocmVncyk7CiAKIAlpcnFfZXhpdCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggNzgyY2UzZS4uYTNkNTE5NSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL2twcm9iZXMuYwpAQCAtMzYsNiArMzYsOCBAQAogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICNpbmNsdWRlIDxhc20vc3N0ZXAuaD4KIAorc3RhdGljIERFQ0xBUkVfTVVURVgoa3Byb2JlX211dGV4KTsKKwogc3RhdGljIHN0cnVjdCBrcHJvYmUgKmN1cnJlbnRfa3Byb2JlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1cywga3Byb2JlX3NhdmVkX21zcjsKIHN0YXRpYyBzdHJ1Y3Qga3Byb2JlICprcHJvYmVfcHJldjsKQEAgLTU0LDYgKzU2LDE1IEBACiAJCXByaW50aygiQ2Fubm90IHJlZ2lzdGVyIGEga3Byb2JlIG9uIHJmaWQgb3IgbXRtc3JkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAl9CisKKwkvKiBpbnNuIG11c3QgYmUgb24gYSBzcGVjaWFsIGV4ZWN1dGFibGUgcGFnZSBvbiBwcGM2NCAqLworCWlmICghcmV0KSB7CisJCXVwKCZrcHJvYmVfbXV0ZXgpOworCQlwLT5haW5zbi5pbnNuID0gZ2V0X2luc25fc2xvdCgpOworCQlkb3duKCZrcHJvYmVfbXV0ZXgpOworCQlpZiAoIXAtPmFpbnNuLmluc24pCisJCQlyZXQgPSAtRU5PTUVNOworCX0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC03OSwxNiArOTAsMjIgQEAKIAogdm9pZCBhcmNoX3JlbW92ZV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKKwl1cCgma3Byb2JlX211dGV4KTsKKwlmcmVlX2luc25fc2xvdChwLT5haW5zbi5pbnNuKTsKKwlkb3duKCZrcHJvYmVfbXV0ZXgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9zaW5nbGVzdGVwKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCWtwcm9iZV9vcGNvZGVfdCBpbnNuID0gKnAtPmFpbnNuLmluc247CisKIAlyZWdzLT5tc3IgfD0gTVNSX1NFOwotCS8qc2luZ2xlIHN0ZXAgaW5saW5lIGlmIGl0IGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbiovCi0JaWYgKHAtPm9wY29kZSA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKQorCisJLyogc2luZ2xlIHN0ZXAgaW5saW5lIGlmIGl0IGlzIGEgdHJhcCB2YXJpYW50ICovCisJaWYgKElTX1RXKGluc24pIHx8IElTX1REKGluc24pIHx8IElTX1RXSShpbnNuKSB8fCBJU19UREkoaW5zbikpCiAJCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHI7CiAJZWxzZQotCQlyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZykmcC0+YWluc24uaW5zbjsKKwkJcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpcC0+YWluc24uaW5zbjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcHJldmlvdXNfa3Byb2JlKHZvaWQpCkBAIC0xMDUsNiArMTIyLDIzIEBACiAJa3Byb2JlX3NhdmVkX21zciA9IGtwcm9iZV9zYXZlZF9tc3JfcHJldjsKIH0KIAordm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKKworCWlmICgocmkgPSBnZXRfZnJlZV9ycF9pbnN0KHJwKSkgIT0gTlVMTCkgeworCQlyaS0+cnAgPSBycDsKKwkJcmktPnRhc2sgPSBjdXJyZW50OworCQlyaS0+cmV0X2FkZHIgPSAoa3Byb2JlX29wY29kZV90ICopcmVncy0+bGluazsKKworCQkvKiBSZXBsYWNlIHRoZSByZXR1cm4gYWRkciB3aXRoIHRyYW1wb2xpbmUgYWRkciAqLworCQlyZWdzLT5saW5rID0gKHVuc2lnbmVkIGxvbmcpa3JldHByb2JlX3RyYW1wb2xpbmU7CisJCWFkZF9ycF9pbnN0KHJpKTsKKwl9IGVsc2UgeworCQlycC0+bm1pc3NlZCsrOworCX0KK30KKwogc3RhdGljIGlubGluZSBpbnQga3Byb2JlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGtwcm9iZSAqcDsKQEAgLTE5NSw2ICsyMjksNzggQEAKIH0KIAogLyoKKyAqIEZ1bmN0aW9uIHJldHVybiBwcm9iZSB0cmFtcG9saW5lOgorICogCS0gaW5pdF9rcHJvYmVzKCkgZXN0YWJsaXNoZXMgYSBwcm9iZXBvaW50IGhlcmUKKyAqIAktIFdoZW4gdGhlIHByb2JlZCBmdW5jdGlvbiByZXR1cm5zLCB0aGlzIHByb2JlCisgKiAJCWNhdXNlcyB0aGUgaGFuZGxlcnMgdG8gZmlyZQorICovCit2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lX2hvbGRlcih2b2lkKQoreworCWFzbSB2b2xhdGlsZSgiLmdsb2JhbCBrcmV0cHJvYmVfdHJhbXBvbGluZVxuIgorCQkJImtyZXRwcm9iZV90cmFtcG9saW5lOlxuIgorCQkJIm5vcFxuIik7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgcHJvYmUgYXQga3JldHByb2JlIHRyYW1wb2xpbmUgaXMgaGl0CisgKi8KK2ludCB0cmFtcG9saW5lX3Byb2JlX2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKyAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisgICAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPSh1bnNpZ25lZCBsb25nKSZrcmV0cHJvYmVfdHJhbXBvbGluZTsKKworICAgICAgICBoZWFkID0ga3JldHByb2JlX2luc3RfdGFibGVfaGVhZChjdXJyZW50KTsKKworCS8qCisJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKwkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KKwkgKgorCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgorCSAqICAgICAtIGluc3RhbmNlcyBhcmUgYWx3YXlzIGluc2VydGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CisJICogICAgIC0gd2hlbiBtdWx0aXBsZSByZXR1cm4gcHJvYmVzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZQorICAgICAgICAgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmktPnRhc2sgIT0gY3VycmVudCkKKwkJCS8qIGFub3RoZXIgdGFzayBpcyBzaGFyaW5nIG91ciBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKwkJaWYgKHJpLT5ycCAmJiByaS0+cnAtPmhhbmRsZXIpCisJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOworCisJCW9yaWdfcmV0X2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylyaS0+cmV0X2FkZHI7CisJCXJlY3ljbGVfcnBfaW5zdChyaSk7CisKKwkJaWYgKG9yaWdfcmV0X2FkZHJlc3MgIT0gdHJhbXBvbGluZV9hZGRyZXNzKQorCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIHJlYWwgcmV0dXJuIGFkZHJlc3MuIEFueSBvdGhlcgorCQkJICogaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sgYXJlIGZvcgorCQkJICogb3RoZXIgY2FsbHMgZGVlcGVyIG9uIHRoZSBjYWxsIHN0YWNrCisJCQkgKi8KKwkJCWJyZWFrOworCX0KKworCUJVR19PTighb3JpZ19yZXRfYWRkcmVzcyB8fCAob3JpZ19yZXRfYWRkcmVzcyA9PSB0cmFtcG9saW5lX2FkZHJlc3MpKTsKKwlyZWdzLT5uaXAgPSBvcmlnX3JldF9hZGRyZXNzOworCisJdW5sb2NrX2twcm9iZXMoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBCeSByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSwgd2UgYXJlIHRlbGxpbmcKKyAgICAgICAgICoga3Byb2JlX2hhbmRsZXIoKSB0aGF0IHdlIGhhdmUgaGFuZGxlZCB1bmxvY2tpbmcKKyAgICAgICAgICogYW5kIHJlLWVuYWJsaW5nIHByZWVtcHRpb24uCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gMTsKK30KKworLyoKICAqIENhbGxlZCBhZnRlciBzaW5nbGUtc3RlcHBpbmcuICBwLT5hZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQogICogaW5zdHJ1Y3Rpb24gd2hvc2UgZmlyc3QgYnl0ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgImJyZWFrcG9pbnQiCiAgKiBpbnN0cnVjdGlvbi4gIFRvIGF2b2lkIHRoZSBTTVAgcHJvYmxlbXMgdGhhdCBjYW4gb2NjdXIgd2hlbiB3ZQpAQCAtMjA1LDkgKzMxMSwxMCBAQAogc3RhdGljIHZvaWQgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpbnNuID0gKnAtPmFpbnNuLmluc247CiAKIAlyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOwotCXJldCA9IGVtdWxhdGVfc3RlcChyZWdzLCBwLT5haW5zbi5pbnNuWzBdKTsKKwlyZXQgPSBlbXVsYXRlX3N0ZXAocmVncywgaW5zbik7CiAJaWYgKHJldCA9PSAwKQogCQlyZWdzLT5uaXAgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyICsgNDsKIH0KQEAgLTMzMSwzICs0MzgsMTMgQEAKIAltZW1jcHkocmVncywgJmpwcm9iZV9zYXZlZF9yZWdzLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKIAlyZXR1cm4gMTsKIH0KKworc3RhdGljIHN0cnVjdCBrcHJvYmUgdHJhbXBvbGluZV9wID0geworCS5hZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKSAma3JldHByb2JlX3RyYW1wb2xpbmUsCisJLnByZV9oYW5kbGVyID0gdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyCit9OworCitpbnQgX19pbml0IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2twcm9iZSgmdHJhbXBvbGluZV9wKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL2xwYXJjZmcuYyBiL2FyY2gvcHBjNjQva2VybmVsL2xwYXJjZmcuYwppbmRleCAzODc5MjNmLi4wMmU5NjYyIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9scGFyY2ZnLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbHBhcmNmZy5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL2lTZXJpZXMvSXRFeHRWcGRQYW5lbC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKICNkZWZpbmUgTU9EVUxFX1ZFUlMgIjEuNiIKICNkZWZpbmUgTU9EVUxFX05BTUUgImxwYXJjZmciCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiMmZjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIG1hY2hpbmVfa2V4ZWMuYyAtIGhhbmRsZSB0cmFuc2l0aW9uIG9mIExpbnV4IGJvb3RpbmcgYW5vdGhlciBrZXJuZWwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSwgSUJNIENvcnAuCisgKgorICogQ3JlYXRlZCBieTogTWlsdG9uIEQgTWlsbGVyIElJCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CS8qIF9lbmQgKi8KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCisjZGVmaW5lIEhBU0hfR1JPVVBfU0laRSAweDgwCS8qIHNpemUgb2YgZWFjaCBoYXNoIGdyb3VwLCBhc20vbW11LmggKi8KKworLyogSGF2ZSB0aGlzIGFyb3VuZCB0aWxsIHdlIG1vdmUgaXQgaW50byBjcmFzaCBzcGVjaWZpYyBmaWxlICovCitub3RlX2J1Zl90IGNyYXNoX25vdGVzW05SX0NQVVNdOworCisvKiBEdW1teSBmb3Igbm93LiBOb3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGhhdmUgYSBjcmFzaCBzaHV0ZG93biBpbiBoZXJlCisgKiBhbmQgaWYgd2hhdCBpdCB3aWxsIGFjaGlldmUuIExldHRpbmcgaXQgYmUgbm93IHRvIGNvbXBpbGUgdGhlIGNvZGUKKyAqIGluIGdlbmVyaWMga2V4ZWMgZW52aXJvbm1lbnQKKyAqLwordm9pZCBtYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCS8qIGRvIG5vdGhpbmcgcmlnaHQgbm93ICovCisJLyogc21wX3JlbGFzZV9jcHVzKCkgaWYgd2Ugd2FudCBzbXAgb24gcGFuaWMga2VybmVsICovCisJLyogY3B1X2lycV9kb3duIHRvIGlzb2xhdGUgdXMgdW50aWwgd2UgYXJlIHJlYWR5ICovCit9CisKK2ludCBtYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBiZWdpbiwgZW5kOwkvKiBsaW1pdHMgb2Ygc2VnbWVudCAqLworCXVuc2lnbmVkIGxvbmcgbG93LCBoaWdoOwkvKiBsaW1pdHMgb2YgYmxvY2tlZCBtZW1vcnkgcmFuZ2UgKi8KKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgbG9uZyAqYmFzZXA7CisJdW5zaWduZWQgaW50ICpzaXplcDsKKworCWlmICghcHBjX21kLmhwdGVfY2xlYXJfYWxsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qCisJICogU2luY2Ugd2UgdXNlIHRoZSBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIHBhZ2luZyBjb2RlIHRvCisJICogaGFuZGxlIHRoZSB2aXJ0dWFsIG1vZGUsIHdlIG11c3QgbWFrZSBzdXJlIG5vIGRlc3RpbmF0aW9uCisJICogb3ZlcmxhcHMga2VybmVsIHN0YXRpYyBkYXRhIG9yIGJzcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm5yX3NlZ21lbnRzOyBpKyspCisJCWlmIChpbWFnZS0+c2VnbWVudFtpXS5tZW0gPCBfX3BhKF9lbmQpKQorCQkJcmV0dXJuIC1FVFhUQlNZOworCisJLyoKKwkgKiBGb3Igbm9uLUxQQVIsIHdlIGFic29sdXRlbHkgY2FuIG5vdCBvdmVyd3JpdGUgdGhlIG1tdSBoYXNoCisJICogdGFibGUsIHNpbmNlIHdlIGFyZSBzdGlsbCB1c2luZyB0aGUgYm9sdGVkIGVudHJpZXMgaW4gaXQgdG8KKwkgKiBkbyB0aGUgY29weS4gIENoZWNrIHRoYXQgaGVyZS4KKwkgKgorCSAqIEl0IGlzIHNhZmUgaWYgdGhlIGVuZCBpcyBiZWxvdyB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrZWQKKwkgKiByZWdpb24gKGVuZCA8PSBsb3cpLCBvciBpZiB0aGUgYmVnaW5uaW5nIGlzIGFmdGVyIHRoZQorCSAqIGVuZCBvZiB0aGUgYmxvY2tlZCByZWdpb24gKGJlZ2luID49IGhpZ2gpLiAgVXNlIHRoZQorCSAqIGJvb2xlYW4gaWRlbnRpdHkgIShhIHx8IGIpICA9PT0gKCFhICYmICFiKS4KKwkgKi8KKwlpZiAoaHRhYl9hZGRyZXNzKSB7CisJCWxvdyA9IF9fcGEoaHRhYl9hZGRyZXNzKTsKKwkJaGlnaCA9IGxvdyArIChodGFiX2hhc2hfbWFzayArIDEpICogSEFTSF9HUk9VUF9TSVpFOworCisJCWZvciAoaSA9IDA7IGkgPCBpbWFnZS0+bnJfc2VnbWVudHM7IGkrKykgeworCQkJYmVnaW4gPSBpbWFnZS0+c2VnbWVudFtpXS5tZW07CisJCQllbmQgPSBiZWdpbiArIGltYWdlLT5zZWdtZW50W2ldLm1lbXN6OworCisJCQlpZiAoKGJlZ2luIDwgaGlnaCkgJiYgKGVuZCA+IGxvdykpCisJCQkJcmV0dXJuIC1FVFhUQlNZOworCQl9CisJfQorCisJLyogV2UgYWxzbyBzaG91bGQgbm90IG92ZXJ3cml0ZSB0aGUgdGNlIHRhYmxlcyAqLworCWZvciAobm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJwY2kiKTsgbm9kZSAhPSBOVUxMOworCQkJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5vZGUsICJwY2kiKSkgeworCQliYXNlcCA9ICh1bnNpZ25lZCBsb25nICopZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCx0Y2UtYmFzZSIsCisJCQkJCQkJTlVMTCk7CisJCXNpemVwID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShub2RlLCAibGludXgsdGNlLXNpemUiLAorCQkJCQkJCU5VTEwpOworCQlpZiAoYmFzZXAgPT0gTlVMTCB8fCBzaXplcCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJbG93ID0gKmJhc2VwOworCQloaWdoID0gbG93ICsgKCpzaXplcCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGltYWdlLT5ucl9zZWdtZW50czsgaSsrKSB7CisJCQliZWdpbiA9IGltYWdlLT5zZWdtZW50W2ldLm1lbTsKKwkJCWVuZCA9IGJlZ2luICsgaW1hZ2UtPnNlZ21lbnRbaV0ubWVtc3o7CisKKwkJCWlmICgoYmVnaW4gPCBoaWdoKSAmJiAoZW5kID4gbG93KSkKKwkJCQlyZXR1cm4gLUVUWFRCU1k7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtYWNoaW5lX2tleGVjX2NsZWFudXAoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJLyogd2UgZG8gbm90aGluZyBpbiBwcmVwYXJlIHRoYXQgbmVlZHMgdG8gYmUgdW5kb25lICovCit9CisKKyNkZWZpbmUgSU5EX0ZMQUdTIChJTkRfREVTVElOQVRJT04gfCBJTkRfSU5ESVJFQ1RJT04gfCBJTkRfRE9ORSB8IElORF9TT1VSQ0UpCisKK3N0YXRpYyB2b2lkIGNvcHlfc2VnbWVudHModW5zaWduZWQgbG9uZyBpbmQpCit7CisJdW5zaWduZWQgbG9uZyBlbnRyeTsKKwl1bnNpZ25lZCBsb25nICpwdHI7CisJdm9pZCAqZGVzdDsKKwl2b2lkICphZGRyOworCisJLyoKKwkgKiBXZSByZWx5IG9uIGtleGVjX2xvYWQgdG8gY3JlYXRlIGEgbGlzdHMgdGhhdCBwcm9wZXJseQorCSAqIGluaXRpYWxpemVzIHRoZXNlIHBvaW50ZXJzIGJlZm9yZSB0aGV5IGFyZSB1c2VkLgorCSAqIFdlIHdpbGwgc3RpbGwgY3Jhc2ggaWYgdGhlIGxpc3QgaXMgd3JvbmcsIGJ1dCBhdCBsZWFzdAorCSAqIHRoZSBjb21waWxlciB3aWxsIGJlIHF1aWV0LgorCSAqLworCXB0ciA9IE5VTEw7CisJZGVzdCA9IE5VTEw7CisKKwlmb3IgKGVudHJ5ID0gaW5kOyAhKGVudHJ5ICYgSU5EX0RPTkUpOyBlbnRyeSA9ICpwdHIrKykgeworCQlhZGRyID0gX192YShlbnRyeSAmIFBBR0VfTUFTSyk7CisKKwkJc3dpdGNoIChlbnRyeSAmIElORF9GTEFHUykgeworCQljYXNlIElORF9ERVNUSU5BVElPTjoKKwkJCWRlc3QgPSBhZGRyOworCQkJYnJlYWs7CisJCWNhc2UgSU5EX0lORElSRUNUSU9OOgorCQkJcHRyID0gYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIElORF9TT1VSQ0U6CisJCQljb3B5X3BhZ2UoZGVzdCwgYWRkcik7CisJCQlkZXN0ICs9IFBBR0VfU0laRTsKKwkJfQorCX0KK30KKwordm9pZCBrZXhlY19jb3B5X2ZsdXNoKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCWxvbmcgaSwgbnJfc2VnbWVudHMgPSBpbWFnZS0+bnJfc2VnbWVudHM7CisJc3RydWN0ICBrZXhlY19zZWdtZW50IHJhbmdlc1tLRVhFQ19TRUdNRU5UX01BWF07CisKKwkvKiBzYXZlIHRoZSByYW5nZXMgb24gdGhlIHN0YWNrIHRvIGVmZmljaWVudGx5IGZsdXNoIHRoZSBpY2FjaGUgKi8KKwltZW1jcHkocmFuZ2VzLCBpbWFnZS0+c2VnbWVudCwgc2l6ZW9mKHJhbmdlcykpOworCisJLyoKKwkgKiBBZnRlciB0aGlzIGNhbGwgd2UgbWF5IG5vdCB1c2UgYW55dGhpbmcgYWxsb2NhdGVkIGluIGR5bmFtaWMKKwkgKiBtZW1vcnksIGluY2x1ZGluZyAqaW1hZ2UuCisJICoKKwkgKiBPbmx5IGdsb2JhbHMgYW5kIHRoZSBzdGFjayBhcmUgYWxsb3dlZC4KKwkgKi8KKwljb3B5X3NlZ21lbnRzKGltYWdlLT5oZWFkKTsKKworCS8qCisJICogd2UgbmVlZCB0byBjbGVhciB0aGUgaWNhY2hlIGZvciBhbGwgZGVzdCBwYWdlcyBzb21ldGltZSwKKwkgKiBpbmNsdWRpbmcgb25lcyB0aGF0IHdlcmUgaW4gcGxhY2Ugb24gdGhlIG9yaWdpbmFsIGNvcHkKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnbWVudHM7IGkrKykKKwkJZmx1c2hfaWNhY2hlX3JhbmdlKHJhbmdlc1tpXS5tZW0gKyBLRVJORUxCQVNFLAorCQkJCXJhbmdlc1tpXS5tZW0gKyBLRVJORUxCQVNFICsKKwkJCQlyYW5nZXNbaV0ubWVtc3opOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorCisvKiBGSVhNRTogd2Ugc2hvdWxkIHNjaGVkdWxlIHRoaXMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGFsbCBjcHVzIGJhc2VkCisgKiBvbiBjYWxsaW5nIHRoZSBpbnRlcnJ1cHRzLCBidXQgd2Ugd291bGQgbGlrZSB0byBjYWxsIGl0IG9mZiBpcnEgbGV2ZWwKKyAqIHNvIHRoYXQgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGlzIGNsZWFuLgorICovCit2b2lkIGtleGVjX3NtcF9kb3duKHZvaWQgKmFyZykKK3sKKwlpZiAocHBjX21kLmNwdV9pcnFfZG93bikKKwkJcHBjX21kLmNwdV9pcnFfZG93bigpOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlrZXhlY19zbXBfd2FpdCgpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQga2V4ZWNfcHJlcGFyZV9jcHVzKHZvaWQpCit7CisJaW50IG15X2NwdSwgaSwgbm90aWZpZWQ9LTE7CisKKwlzbXBfY2FsbF9mdW5jdGlvbihrZXhlY19zbXBfZG93biwgTlVMTCwgMCwgLyogd2FpdCAqLzApOworCW15X2NwdSA9IGdldF9jcHUoKTsKKworCS8qIGNoZWNrIHRoZSBvdGhlcnMgY3B1cyBhcmUgbm93IGRvd24gKHZpYSBwYWNhIGh3IGNwdSBpZCA9PSAtMSkgKi8KKwlmb3IgKGk9MDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAoaSA9PSBteV9jcHUpCisJCQljb250aW51ZTsKKworCQl3aGlsZSAocGFjYVtpXS5od19jcHVfaWQgIT0gLTEpIHsKKwkJCWlmICghY3B1X3Bvc3NpYmxlKGkpKSB7CisJCQkJcHJpbnRrKCJrZXhlYzogY3B1ICVkIGh3X2NwdV9pZCAlZCBpcyBub3QiCisJCQkJCQkiIHBvc3NpYmxlLCBpZ25vcmluZ1xuIiwKKwkJCQkJCWksIHBhY2FbaV0uaHdfY3B1X2lkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghY3B1X29ubGluZShpKSkgeworCQkJCS8qIEZpeG1lOiB0aGlzIGNhbiBiZSBzcGlubmluZyBpbgorCQkJCSAqIHBTZXJpZXNfc2Vjb25kYXJ5X3dhaXQgd2l0aCBhIHBhY2EKKwkJCQkgKiB3YWl0aW5nIGZvciBpdCB0byBnbyBvbmxpbmUuCisJCQkJICovCisJCQkJcHJpbnRrKCJrZXhlYzogY3B1ICVkIGh3X2NwdV9pZCAlZCBpcyBub3QiCisJCQkJCQkiIG9ubGluZSwgaWdub3JpbmdcbiIsCisJCQkJCQlpLCBwYWNhW2ldLmh3X2NwdV9pZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaSAhPSBub3RpZmllZCkgeworCQkJCXByaW50ayggImtleGVjOiB3YWl0aW5nIGZvciBjcHUgJWQgKHBoeXNpY2FsIgorCQkJCQkJIiAlZCkgdG8gZ28gZG93blxuIiwKKwkJCQkJCWksIHBhY2FbaV0uaHdfY3B1X2lkKTsKKwkJCQlub3RpZmllZCA9IGk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBhZnRlciB3ZSB0ZWxsIHRoZSBvdGhlcnMgdG8gZ28gZG93biAqLworCWlmIChwcGNfbWQuY3B1X2lycV9kb3duKQorCQlwcGNfbWQuY3B1X2lycV9kb3duKCk7CisKKwlwdXRfY3B1KCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworfQorCisjZWxzZSAvKiAhIFNNUCAqLworCitzdGF0aWMgdm9pZCBrZXhlY19wcmVwYXJlX2NwdXModm9pZCkKK3sKKwkvKgorCSAqIG1vdmUgdGhlIHNlY29uZGFyeXMgdG8gdXMgc28gdGhhdCB3ZSBjYW4gY29weQorCSAqIHRoZSBuZXcga2VybmVsIDAtMHgxMDAgc2FmZWx5CisJICoKKwkgKiBkbyB0aGlzIGlmIGtleGVjIGluIHNldHVwLmMgPworCSAqLworCXNtcF9yZWxhc2VfY3B1cygpOworCWlmIChwcGNfbWQuY3B1X2lycV9kb3duKQorCQlwcGNfbWQuY3B1X2lycV9kb3duKCk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKK30KKworI2VuZGlmIC8qIFNNUCAqLworCisvKgorICoga2V4ZWMgdGhyZWFkIHN0cnVjdHVyZSBhbmQgc3RhY2suCisgKgorICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIDE2Mzg0LWJ5dGUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuICBJdCBhbHNvIG11c3QgYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQKKyAqIG9yIGFsbG9jYXRlZCBhcyBwYXJ0IG9mIHRoZSBraW1hZ2UsIGJlY2F1c2UgZXZlcnl0aGluZyBlbHNlIG1heSBiZQorICogb3ZlcndyaXR0ZW4gd2hlbiB3ZSBjb3B5IHRoZSBrZXhlYyBpbWFnZS4gIFdlIHBpZ2d5YmFjayBvbiB0aGUKKyAqICJpbml0X3Rhc2siIGxpbmtlciBzZWN0aW9uIGhlcmUgdG8gc3RhdGljYWxseSBhbGxvY2F0ZSBhIHN0YWNrLgorICoKKyAqIFdlIGNvdWxkIHVzZSBhIHNtYWxsZXIgc3RhY2sgaWYgd2UgZG9uJ3QgY2FyZSBhYm91dCBhbnl0aGluZyB1c2luZworICogY3VycmVudCwgYnV0IHRoYXQgYXVkaXQgaGFzIG5vdCBiZWVuIHBlcmZvcm1lZC4KKyAqLwordW5pb24gdGhyZWFkX3VuaW9uIGtleGVjX3N0YWNrCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPSB7IH07CisKKy8qIE91ciBhc3NlbWJseSBoZWxwZXIsIGluIGtleGVjX3N0dWIuUyAqLworZXh0ZXJuIE5PUkVUX1RZUEUgdm9pZCBrZXhlY19zZXF1ZW5jZSh2b2lkICpuZXdzdGFjaywgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJdm9pZCAqaW1hZ2UsIHZvaWQgKmNvbnRyb2wsCisJCQkJCXZvaWQgKCpjbGVhcl9hbGwpKHZvaWQpKSBBVFRSSUJfTk9SRVQ7CisKKy8qIHRvbyBsYXRlIHRvIGZhaWwgaGVyZSAqLwordm9pZCBtYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCisJLyogcHJlcGFyZSBjb250cm9sIGNvZGUgaWYgYW55ICovCisKKwkvKiBzaHV0ZG93biBvdGhlciBjcHVzIGludG8gb3VyIHdhaXQgbG9vcCBhbmQgcXVpZXNjZSBpbnRlcnJ1cHRzICovCisJa2V4ZWNfcHJlcGFyZV9jcHVzKCk7CisKKwkvKiBzd2l0Y2ggdG8gYSBzdGF0aWNseSBhbGxvY2F0ZWQgc3RhY2suICBCYXNlZCBvbiBpcnEgc3RhY2sgY29kZS4KKwkgKiBYWFg6IHRoZSB0YXNrIHN0cnVjdCB3aWxsIGxpa2VseSBiZSBpbnZhbGlkIG9uY2Ugd2UgZG8gdGhlIGNvcHkhCisJICovCisJa2V4ZWNfc3RhY2sudGhyZWFkX2luZm8udGFzayA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+dGFzazsKKwlrZXhlY19zdGFjay50aHJlYWRfaW5mby5mbGFncyA9IDA7CisKKwkvKiBTb21lIHRoaW5ncyBhcmUgYmVzdCBkb25lIGluIGFzc2VtYmx5LiAgRmluZGluZyBnbG9iYWxzIHdpdGgKKwkgKiBhIHRvYyBpcyBlYXNpZXIgaW4gQywgc28gcGFzcyBpbiB3aGF0IHdlIGNhbi4KKwkgKi8KKwlrZXhlY19zZXF1ZW5jZSgma2V4ZWNfc3RhY2ssIGltYWdlLT5zdGFydCwgaW1hZ2UsCisJCQlwYWdlX2FkZHJlc3MoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKSwKKwkJCXBwY19tZC5ocHRlX2NsZWFyX2FsbCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfc2V0dXAuYyBiL2FyY2gvcHBjNjQva2VybmVsL21hcGxlX3NldHVwLmMKaW5kZXggZGE4OTAwYi4uYmI1NWI1YSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWFwbGVfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9tYXBsZV9zZXR1cC5jCkBAIC0xNzcsNiArMTc3LDggQEAKICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwogI2VuZGlmCisKKwlwcmludGsoS0VSTl9JTkZPICJVc2luZyBuYXRpdmUvTkFQIGlkbGUgbG9vcFxuIik7CiB9CiAKIC8qIApAQCAtMjk3LDQgKzI5OSw1IEBACiAgICAgICAgCS5nZXRfcnRjX3RpbWUJCT0gbWFwbGVfZ2V0X3J0Y190aW1lLAogICAgICAgCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAogCS5wcm9ncmVzcwkJPSBtYXBsZV9wcm9ncmVzcywKKwkuaWRsZV9sb29wCQk9IG5hdGl2ZV9pZGxlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL21mLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9tZi5jCmluZGV4IGQ5OGJlYmYuLmVmNGEzMzggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL21mLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbWYuYwpAQCAtODAxLDEwICs4MDEsOCBAQAogCQlyZXR1cm4gcmM7CiAJLyogV2UgbmVlZCB0byBwb2xsIGhlcmUgYXMgd2UgYXJlIG5vdCB5ZXQgdGFraW5nIGludGVycnVwdHMgKi8KIAl3aGlsZSAocnRjX2RhdGEuYnVzeSkgewotCQlleHRlcm4gdW5zaWduZWQgbG9uZyBscGV2ZW50X2NvdW50OwotCQlzdHJ1Y3QgSXRMcFF1ZXVlICpscHEgPSBnZXRfcGFjYSgpLT5scHF1ZXVlX3B0cjsKLQkJaWYgKGxwcSAmJiBJdExwUXVldWVfaXNMcEludFBlbmRpbmcobHBxKSkKLQkJCWxwZXZlbnRfY291bnQgKz0gSXRMcFF1ZXVlX3Byb2Nlc3MobHBxLCBOVUxMKTsKKwkJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCQlwcm9jZXNzX2h2bHBldmVudHMoTlVMTCk7CiAJfQogCXJldHVybiBydGNfc2V0X3RtKHJ0Y19kYXRhLnJjLCBydGNfZGF0YS5jZV9tc2cuY2VfbXNnLCB0bSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMgYi9hcmNoL3BwYzY0L2tlcm5lbC9taXNjLlMKaW5kZXggZTNjNzNiMy4uNTlmNGY5OSAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvbWlzYy5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL21pc2MuUwpAQCAtNjgwLDYgKzY4MCwxNzcgQEAKIAlsZAlyMzAsLTE2KHIxKQogCWJscgogCisvKiBrZXhlY193YWl0KHBoeXNfY3B1KQorICoKKyAqIHdhaXQgZm9yIHRoZSBmbGFnIHRvIGNoYW5nZSwgaW5kaWNhdGluZyB0aGlzIGtlcm5lbCBpcyBnb2luZyBhd2F5IGJ1dAorICogdGhlIHNsYXZlIGNvZGUgZm9yIHRoZSBuZXh0IG9uZSBpcyBhdCBhZGRyZXNzZXMgMCB0byAxMDAuCisgKgorICogVGhpcyBpcyB1c2VkIGJ5IGFsbCBzbGF2ZXMuCisgKgorICogUGh5c2ljYWwgKGhhcmR3YXJlKSBjcHUgaWQgc2hvdWxkIGJlIGluIHIzLgorICovCitfR0xPQkFMKGtleGVjX3dhaXQpCisJYmwJMWYKKzE6CW1mbHIJcjUKKwlhZGRpCXI1LHI1LGtleGVjX2ZsYWctMWIKKworOTk6CUhNVF9MT1cKKyNpZmRlZiBDT05GSUdfS0VYRUMJCS8qIHVzZSBubyBtZW1vcnkgd2l0aG91dCBrZXhlYyAqLworCWx3eglyNCwwKHI1KQorCWNtcHdpCTAscjQsMAorCWJuZWEJMHg2MAorI2VuZGlmCisJYgk5OWIKKworLyogdGhpcyBjYW4gYmUgaW4gdGV4dCBiZWNhdXNlIHdlIHdvbid0IGNoYW5nZSBpdCB1bnRpbCB3ZSBhcmUKKyAqIHJ1bm5pbmcgaW4gcmVhbCBhbnl3YXlzCisgKi8KK2tleGVjX2ZsYWc6CisJLmxvbmcJMAorCisKKyNpZmRlZiBDT05GSUdfS0VYRUMKKworLyoga2V4ZWNfc21wX3dhaXQodm9pZCkKKyAqCisgKiBjYWxsIHdpdGggaW50ZXJydXB0cyBvZmYKKyAqIG5vdGU6IHRoaXMgaXMgYSB0ZXJtaW5hbCByb3V0aW5lLCBpdCBkb2VzIG5vdCBzYXZlIGxyCisgKgorICogZ2V0IHBoeXMgaWQgZnJvbSBwYWNhCisgKiBzZXQgcGFjYSBpZCB0byAtMSB0byBzYXkgd2UgZ290IGhlcmUKKyAqIHN3aXRjaCB0byByZWFsIG1vZGUKKyAqIGpvaW4gb3RoZXIgY3B1cyBpbiBrZXhlY193YWl0KHBoeXNfaWQpCisgKi8KK19HTE9CQUwoa2V4ZWNfc21wX3dhaXQpCisJbGh6CXIzLFBBQ0FIV0NQVUlEKHIxMykKKwlsaQlyNCwtMQorCXN0aAlyNCxQQUNBSFdDUFVJRChyMTMpCS8qIGxldCBvdGhlcnMga25vdyB3ZSBsZWZ0ICovCisJYmwJcmVhbF9tb2RlCisJYgkua2V4ZWNfd2FpdAorCisvKgorICogc3dpdGNoIHRvIHJlYWwgbW9kZSAodHVybiBtbXUgb2ZmKQorICogd2UgdXNlIHRoZSBlYXJseSBrZXJuZWwgdHJpY2sgdGhhdCB0aGUgaGFyZHdhcmUgaWdub3JlcyBiaXRzCisgKiAwIGFuZCAxIChiaWcgZW5kaWFuKSBvZiB0aGUgZWZmZWN0aXZlIGFkZHJlc3MgaW4gcmVhbCBtb2RlCisgKgorICogZG9uJ3Qgb3ZlcndyaXRlIHIzIGhlcmUsIGl0IGlzIGxpdmUgZm9yIGtleGVjX3dhaXQgYWJvdmUuCisgKi8KK3JlYWxfbW9kZToJLyogYXNzdW1lIG5vcm1hbCBibHIgcmV0dXJuICovCisxOglsaQlyOSxNU1JfUkkKKwlsaQlyMTAsTVNSX0RSfE1TUl9JUgorCW1mbHIJcjExCQkvKiByZXR1cm4gYWRkcmVzcyB0byBTUlIwICovCisJbWZtc3IJcjEyCisJYW5kYwlyOSxyMTIscjkKKwlhbmRjCXIxMCxyMTIscjEwCisKKwltdG1zcmQJcjksMQorCW10c3ByCVNQUk5fU1JSMSxyMTAKKwltdHNwcglTUFJOX1NSUjAscjExCisJcmZpZAorCisKKy8qCisgKiBrZXhlY19zZXF1ZW5jZShuZXdzdGFjaywgc3RhcnQsIGltYWdlLCBjb250cm9sLCBjbGVhcl9hbGwoKSkKKyAqCisgKiBkb2VzIHRoZSBncnVuZ3kgd29yayB3aXRoIHN0YWNrIHN3aXRjaGluZyBhbmQgcmVhbCBtb2RlIHN3aXRjaGVzCisgKiBhbHNvIGRvZXMgc2ltcGxlIGNhbGxzIHRvIG90aGVyIGNvZGUKKyAqLworCitfR0xPQkFMKGtleGVjX3NlcXVlbmNlKQorCW1mbHIJcjAKKwlzdGQJcjAsMTYocjEpCisKKwkvKiBzd2l0Y2ggc3RhY2tzIHRvIG5ld3N0YWNrIC0tICZrZXhlY19zdGFjay5zdGFjayAqLworCXN0ZHUJcjEsVEhSRUFEX1NJWkUtMTEyKHIzKQorCW1yCXIxLHIzCisKKwlsaQlyMCwwCisJc3RkCXIwLDE2KHIxKQorCisJLyogc2F2ZSByZWdzIGZvciBsb2NhbCB2YXJzIG9uIG5ldyBzdGFjay4KKwkgKiB5ZXMsIHdlIHdvbid0IGdvIGJhY2ssIGJ1dCAuLi4KKwkgKi8KKwlzdGQJcjMxLC04KHIxKQorCXN0ZAlyMzAsLTE2KHIxKQorCXN0ZAlyMjksLTI0KHIxKQorCXN0ZAlyMjgsLTMyKHIxKQorCXN0ZAlyMjcsLTQwKHIxKQorCXN0ZAlyMjYsLTQ4KHIxKQorCXN0ZAlyMjUsLTU2KHIxKQorCisJc3RkdQlyMSwtMTEyLTY0KHIxKQorCisJLyogc2F2ZSBhcmdzIGludG8gcHJlc2VydmVkIHJlZ3MgKi8KKwltcglyMzEscjMJCQkvKiBuZXdzdGFjayAoYm90aCkgKi8KKwltcglyMzAscjQJCQkvKiBzdGFydCAocmVhbCkgKi8KKwltcglyMjkscjUJCQkvKiBpbWFnZSAodmlydCkgKi8KKwltcglyMjgscjYJCQkvKiBjb250cm9sLCB1bnVzZWQgKi8KKwltcglyMjcscjcJCQkvKiBjbGVhcl9hbGwoKSBmbiBkZXNjICovCisJbXIJcjI2LHI4CQkJLyogc3BhcmUgKi8KKwlsaHoJcjI1LFBBQ0FIV0NQVUlEKHIxMykJLyogZ2V0IG91ciBwaHlzIGNwdSBmcm9tIHBhY2EgKi8KKworCS8qIGRpc2FibGUgaW50ZXJydXB0cywgd2UgYXJlIG92ZXJ3cml0aW5nIGtlcm5lbCBkYXRhIG5leHQgKi8KKwltZm1zcglyMworCXJsd2lubQlyMyxyMywwLDE3LDE1CisJbXRtc3JkCXIzLDEKKworCS8qIGNvcHkgZGVzdCBwYWdlcywgZmx1c2ggd2hvbGUgZGVzdCBpbWFnZSAqLworCW1yCXIzLHIyOQorCWJsCS5rZXhlY19jb3B5X2ZsdXNoCS8qIChpbWFnZSkgKi8KKworCS8qIHR1cm4gb2ZmIG1tdSAqLworCWJsCXJlYWxfbW9kZQorCisJLyogY2xlYXIgb3V0IGhhcmR3YXJlIGhhc2ggcGFnZSB0YWJsZSBhbmQgdGxiICovCisJbGQJcjUsMChyMjcpCQkvKiBkZXJlZiBmdW5jdGlvbiBkZXNjcmlwdG9yICovCisJbXRjdHIJcjUKKwliY3RybAkJCQkvKiBwcGNfbWQuaGFzaF9jbGVhcl9hbGwodm9pZCk7ICovCisKKy8qCisgKiAgIGtleGVjIGltYWdlIGNhbGxpbmcgaXM6CisgKiAgICAgIHRoZSBmaXJzdCAweDEwMCBieXRlcyBvZiB0aGUgZW50cnkgcG9pbnQgYXJlIGNvcGllZCB0byAwCisgKgorICogICAgICBhbGwgc2xhdmVzIGJyYW5jaCB0byBzbGF2ZSA9IDB4NjAgKGFic29sdXRlKQorICogICAgICAgICAgICAgIHNsYXZlKHBoeXNfY3B1X2lkKTsKKyAqCisgKiAgICAgIG1hc3RlciBnb2VzIHRvIHN0YXJ0ID0gZW50cnkgcG9pbnQKKyAqICAgICAgICAgICAgICBzdGFydChwaHlzX2NwdV9pZCwgc3RhcnQsIDApOworICoKKyAqCisgKiAgIGEgd3JhcHBlciBpcyBuZWVkZWQgdG8gY2FsbCBleGlzdGluZyBrZXJuZWxzLCBoZXJlIGlzIGFuIGFwcHJveGltYXRlCisgKiAgIGRlc2NyaXB0aW9uIG9mIG9uZSBtZXRob2Q6CisgKgorICogdjI6ICgyLjYuMTApCisgKiAgIHN0YXJ0IHdpbGwgYmUgbmVhciB0aGUgYm9vdF9ibG9jayAobWF5YmUgMHgxMDAgYnl0ZXMgYmVmb3JlIGl0PykKKyAqICAgaXQgd2lsbCBoYXZlIGEgMHg2MCwgd2hpY2ggd2lsbCBiIHRvIGJvb3RfYmxvY2ssIHdoZXJlIGl0IHdpbGwgd2FpdAorICogICBhbmQgMCB3aWxsIHN0b3JlIHBoeXMgaW50byBzdHJ1Y3QgYm9vdC1ibG9jayBhbmQgbG9hZCByMyBmcm9tIHRoZXJlLAorICogICBjb3B5IGtlcm5lbCAwLTB4MTAwIGFuZCB0ZWxsIHNsYXZlcyB0byBiYWNrIGRvd24gdG8gMHg2MCBhZ2FpbgorICoKKyAqIHYxOiAoMi42LjkpCisgKiAgICBib290IGJsb2NrIHdpbGwgaGF2ZSBhbGwgY3B1cyBzY2FubmluZyBkZXZpY2UgdHJlZSB0byBzZWUgaWYgdGhleQorICogICAgYXJlIHRoZSBib290IGNwdSA/Pz8/PworICogICAgb3RoZXIgZGV2aWNlIHRyZWUgZGlmZmVyZW5jZXMgKHByb3Agc2l6ZXMsIHZhIHZzIHBhLCBldGMpLi4uCisgKi8KKworCS8qIGNvcHkgIDB4MTAwIGJ5dGVzIHN0YXJ0aW5nIGF0IHN0YXJ0IHRvIDAgKi8KKwlsaQlyMywwCisJbXIJcjQscjMwCisJbGkJcjUsMHgxMDAKKwlsaQlyNiwwCisJYmwJLmNvcHlfYW5kX2ZsdXNoCS8qIChkZXN0LCBzcmMsIGNvcHkgbGltaXQsIHN0YXJ0IG9mZnNldCkgKi8KKzE6CS8qIGFzc3VtZSBub3JtYWwgYmxyIHJldHVybiAqLworCisJLyogcmVsZWFzZSBvdGhlciBjcHVzIHRvIHRoZSBuZXcga2VybmVsIHNlY29uZGFyeSBzdGFydCBhdCAweDYwICovCisJbWZscglyNQorCWxpCXI2LDEKKwlzdHcJcjYsa2V4ZWNfZmxhZy0xYig1KQorCW1yCXIzLHIyNQkjIG15IHBoeXMgY3B1CisJbXIJcjQscjMwCSMgc3RhcnQsIGFrYSBwaHlzIG1lbSBvZmZzZXQKKwltdGxyCTQKKwlsaQlyNSwwCisJYmxyCS8qIGltYWdlLT5zdGFydChwaHlzaWQsIGltYWdlLT5zdGFydCwgMCk7ICovCisjZW5kaWYgLyogQ09ORklHX0tFWEVDICovCisKIC8qIFdoeSBpc24ndCB0aGlzIGEpIGF1dG9tYXRpYywgYikgd3JpdHRlbiBpbiAnQyc/ICovCQogCS5iYWxpZ24gOAogX0dMT0JBTChzeXNfY2FsbF90YWJsZTMyKQpAQCAtOTUxLDExICsxMTIyLDEzIEBACiAJLmxsb25nIC5jb21wYXRfc3lzX21xX3RpbWVkcmVjZWl2ZSAvKiAyNjUgKi8KIAkubGxvbmcgLmNvbXBhdF9zeXNfbXFfbm90aWZ5CiAJLmxsb25nIC5jb21wYXRfc3lzX21xX2dldHNldGF0dHIKLQkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiAyNjggcmVzZXJ2ZWQgZm9yIHN5c19rZXhlY19sb2FkICovCisJLmxsb25nIC5jb21wYXRfc3lzX2tleGVjX2xvYWQKIAkubGxvbmcgLnN5czMyX2FkZF9rZXkKLQkubGxvbmcgLnN5czMyX3JlcXVlc3Rfa2V5CisJLmxsb25nIC5zeXMzMl9yZXF1ZXN0X2tleQkvKiAyNzAgKi8KIAkubGxvbmcgLmNvbXBhdF9zeXNfa2V5Y3RsCiAJLmxsb25nIC5jb21wYXRfc3lzX3dhaXRpZAorCS5sbG9uZyAuc3lzMzJfaW9wcmlvX3NldAorCS5sbG9uZyAuc3lzMzJfaW9wcmlvX2dldAogCiAJLmJhbGlnbiA4CiBfR0xPQkFMKHN5c19jYWxsX3RhYmxlKQpAQCAtMTIyNyw4ICsxNDAwLDEwIEBACiAJLmxsb25nIC5zeXNfbXFfdGltZWRyZWNlaXZlCS8qIDI2NSAqLwogCS5sbG9uZyAuc3lzX21xX25vdGlmeQogCS5sbG9uZyAuc3lzX21xX2dldHNldGF0dHIKLQkubGxvbmcgLnN5c19uaV9zeXNjYWxsCQkvKiAyNjggcmVzZXJ2ZWQgZm9yIHN5c19rZXhlY19sb2FkICovCisJLmxsb25nIC5zeXNfa2V4ZWNfbG9hZAogCS5sbG9uZyAuc3lzX2FkZF9rZXkKIAkubGxvbmcgLnN5c19yZXF1ZXN0X2tleQkJLyogMjcwICovCiAJLmxsb25nIC5zeXNfa2V5Y3RsCiAJLmxsb25nIC5zeXNfd2FpdGlkCisJLmxsb25nIC5zeXNfaW9wcmlvX3NldAorCS5sbG9uZyAuc3lzX2lvcHJpb19nZXQKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL21waWMuYyBiL2FyY2gvcHBjNjQva2VybmVsL21waWMuYwppbmRleCA1OTNlYTViLi5lOGZiYWIxIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9tcGljLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbXBpYy5jCkBAIC03OTIsNiArNzkyLDM1IEBACiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogfQogCisvKgorICogWFhYOiBzb21lb25lIHdobyBrbm93cyBtcGljIHNob3VsZCBjaGVjayB0aGlzLgorICogZG8gd2UgbmVlZCB0byBlb2kgdGhlIGlwaSBoZXJlIChzZWUgeGljcyBjb21tZW50cyk/CisgKiBvciBjYW4gd2UgcmVzZXQgdGhlIG1waWMgaW4gdGhlIG5ldyBrZXJuZWw/CisgKi8KK3ZvaWQgbXBpY190ZWFyZG93bl90aGlzX2NwdSh2b2lkKQoreworCXN0cnVjdCBtcGljICptcGljID0gbXBpY19wcmltYXJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIG1zayA9IDEgPDwgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgaW50IGk7CisKKwlCVUdfT04obXBpYyA9PSBOVUxMKTsKKworCURCRygiJXM6IHRlYXJkb3duX3RoaXNfY3B1KCVkKVxuIiwgbXBpYy0+bmFtZSwgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtcGljX2xvY2ssIGZsYWdzKTsKKworCS8qIGxldCB0aGUgbXBpYyBrbm93IHdlIGRvbid0IHdhbnQgaW50cnMuICAqLworCWZvciAoaSA9IDA7IGkgPCBtcGljLT5udW1fc291cmNlcyA7IGkrKykKKwkJbXBpY19pcnFfd3JpdGUoaSwgTVBJQ19JUlFfREVTVElOQVRJT04sCisJCQltcGljX2lycV9yZWFkKGksIE1QSUNfSVJRX0RFU1RJTkFUSU9OKSAmIH5tc2spOworCisJLyogU2V0IGN1cnJlbnQgcHJvY2Vzc29yIHByaW9yaXR5IHRvIG1heCAqLworCW1waWNfY3B1X3dyaXRlKE1QSUNfQ1BVX0NVUlJFTlRfVEFTS19QUkksIDB4Zik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcGljX2xvY2ssIGZsYWdzKTsKK30KKworCiB2b2lkIG1waWNfc2VuZF9pcGkodW5zaWduZWQgaW50IGlwaV9ubywgdW5zaWduZWQgaW50IGNwdV9tYXNrKQogewogCXN0cnVjdCBtcGljICptcGljID0gbXBpY19wcmltYXJ5OwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvbXBpYy5oIGIvYXJjaC9wcGM2NC9rZXJuZWwvbXBpYy5oCmluZGV4IDYzZTE3NzEuLjk5ZmJiYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL21waWMuaAorKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9tcGljLmgKQEAgLTI1NSw2ICsyNTUsOSBAQAogLyogU2V0dXAgYSBub24tYm9vdCBDUFUgKi8KIGV4dGVybiB2b2lkIG1waWNfc2V0dXBfdGhpc19jcHUodm9pZCk7CiAKKy8qIENsZWFuIHVwIGZvciBrZXhlYyAob3IgY3B1IG9mZmxpbmUgb3IgLi4uKSAqLworZXh0ZXJuIHZvaWQgbXBpY190ZWFyZG93bl90aGlzX2NwdSh2b2lkKTsKKwogLyogUmVxdWVzdCBJUElzIG9uIHByaW1hcnkgbXBpYyAqLwogZXh0ZXJuIHZvaWQgbXBpY19yZXF1ZXN0X2lwaXModm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL252cmFtLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9udnJhbS5jCmluZGV4IDRlNzE3ODEuLjRmYjFhOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL252cmFtLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvbnZyYW0uYwpAQCAtMzM4LDkgKzMzOCw4IEBACiAgKi8KIHN0YXRpYyBpbnQgbnZyYW1fY3JlYXRlX29zX3BhcnRpdGlvbih2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKiBwOwotCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKnBhcnQgPSBOVUxMOwotCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKm5ld19wYXJ0ID0gTlVMTDsKKwlzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uICpwYXJ0OworCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKm5ld19wYXJ0OwogCXN0cnVjdCBudnJhbV9wYXJ0aXRpb24gKmZyZWVfcGFydCA9IE5VTEw7CiAJaW50IHNlcV9pbml0WzJdID0geyAwLCAwIH07CiAJbG9mZl90IHRtcF9pbmRleDsKQEAgLTM0OSw4ICszNDgsNyBAQAogCQogCS8qIEZpbmQgYSBmcmVlIHBhcnRpdGlvbiB0aGF0IHdpbGwgZ2l2ZSB1cyB0aGUgbWF4aW11bSBuZWVkZWQgc2l6ZSAKIAkgICBJZiBjYW4ndCBmaW5kIG9uZSB0aGF0IHdpbGwgZ2l2ZSB1cyB0aGUgbWluaW11bSBzaXplIG5lZWRlZCAqLwotCWxpc3RfZm9yX2VhY2gocCwgJm52cmFtX3BhcnQtPnBhcnRpdGlvbikgewotCQlwYXJ0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uLCBwYXJ0aXRpb24pOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFydCwgJm52cmFtX3BhcnQtPnBhcnRpdGlvbiwgcGFydGl0aW9uKSB7CiAJCWlmIChwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlICE9IE5WUkFNX1NJR19GUkVFKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKaW5kZXggNjZiZDVhYjcuLmI4MGU4MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL29mX2RldmljZS5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAKQEAgLTE1LDIwICsxNiwyMCBAQAogICogVXNlZCBieSBhIGRyaXZlciB0byBjaGVjayB3aGV0aGVyIGFuIG9mX2RldmljZSBwcmVzZW50IGluIHRoZQogICogc3lzdGVtIGlzIGluIGl0cyBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2VzLgogICovCi1jb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKiBvZl9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaGVzLAorY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCiAJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2UgKmRldikKIHsKIAlpZiAoIWRldi0+bm9kZSkKIAkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKG1hdGNoZXMtPm5hbWUgfHwgbWF0Y2hlcy0+dHlwZSB8fCBtYXRjaGVzLT5jb21wYXRpYmxlKSB7CisJd2hpbGUgKG1hdGNoZXMtPm5hbWVbMF0gfHwgbWF0Y2hlcy0+dHlwZVswXSB8fCBtYXRjaGVzLT5jb21wYXRpYmxlWzBdKSB7CiAJCWludCBtYXRjaCA9IDE7Ci0JCWlmIChtYXRjaGVzLT5uYW1lICYmIG1hdGNoZXMtPm5hbWUgIT0gT0ZfQU5ZX01BVENIKQorCQlpZiAobWF0Y2hlcy0+bmFtZVswXSkKIAkJCW1hdGNoICY9IGRldi0+bm9kZS0+bmFtZQogCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+bmFtZSwgZGV2LT5ub2RlLT5uYW1lKTsKLQkJaWYgKG1hdGNoZXMtPnR5cGUgJiYgbWF0Y2hlcy0+dHlwZSAhPSBPRl9BTllfTUFUQ0gpCisJCWlmIChtYXRjaGVzLT50eXBlWzBdKQogCQkJbWF0Y2ggJj0gZGV2LT5ub2RlLT50eXBlCiAJCQkJJiYgIXN0cmNtcChtYXRjaGVzLT50eXBlLCBkZXYtPm5vZGUtPnR5cGUpOwotCQlpZiAobWF0Y2hlcy0+Y29tcGF0aWJsZSAmJiBtYXRjaGVzLT5jb21wYXRpYmxlICE9IE9GX0FOWV9NQVRDSCkKKwkJaWYgKG1hdGNoZXMtPmNvbXBhdGlibGVbMF0pCiAJCQltYXRjaCAmPSBkZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPm5vZGUsCiAJCQkJbWF0Y2hlcy0+Y29tcGF0aWJsZSk7CiAJCWlmIChtYXRjaCkKQEAgLTQyLDcgKzQzLDcgQEAKIHsKIAlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CiAJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIG9mX2RydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpOwotCWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqIG1hdGNoZXMgPSBvZl9kcnYtPm1hdGNoX3RhYmxlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKIAogCWlmICghbWF0Y2hlcykKIAkJcmV0dXJuIDA7CkBAIC03NSw3ICs3Niw3IEBACiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnY7CiAJc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2OwotCWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAKIAlkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOwogCW9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zZXR1cC5jCmluZGV4IGYyYjQxMjQuLjViZWM5NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfc2V0dXAuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3NldHVwLmMKQEAgLTE5LDYgKzE5LDcgQEAKICN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtODIsNiArODMsOSBAQAogZXh0ZXJuIHZvaWQgcFNlcmllc19zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiBpbnQgcFNlcmllc19tYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKK3N0YXRpYyBpbnQgcHNlcmllc19zaGFyZWRfaWRsZSh2b2lkKTsKK3N0YXRpYyBpbnQgcHNlcmllc19kZWRpY2F0ZWRfaWRsZSh2b2lkKTsKKwogc3RhdGljIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqIGNocnBfaW50X2Fja19zcGVjaWFsOwogc3RydWN0IG1waWMgKnBTZXJpZXNfbXBpYzsKIApAQCAtMTg3LDE0ICsxOTEsMTYgQEAKIHsKIAkvKiBGaXh1cCBwcGNfbWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGludGVycnVwdCBjb250cm9sbGVyICovCiAJaWYgKHBwYzY0X2ludGVycnVwdF9jb250cm9sbGVyID09IElDX09QRU5fUElDKSB7Ci0JCXBwY19tZC5pbml0X0lSUSAgICAgICA9IHBTZXJpZXNfaW5pdF9tcGljOyAKKwkJcHBjX21kLmluaXRfSVJRICAgICAgID0gcFNlcmllc19pbml0X21waWM7CiAJCXBwY19tZC5nZXRfaXJxICAgICAgICA9IG1waWNfZ2V0X2lycTsKKwkgCXBwY19tZC5jcHVfaXJxX2Rvd24gICA9IG1waWNfdGVhcmRvd25fdGhpc19jcHU7CiAJCS8qIEFsbG9jYXRlIHRoZSBtcGljIG5vdywgc28gdGhhdCBmaW5kX2FuZF9pbml0X3BoYnMoKSBjYW4KIAkJICogZmlsbCB0aGUgSVNVcyAqLwogCQlwU2VyaWVzX3NldHVwX21waWMoKTsKIAl9IGVsc2UgewogCQlwcGNfbWQuaW5pdF9JUlEgICAgICAgPSB4aWNzX2luaXRfSVJROwogCQlwcGNfbWQuZ2V0X2lycSAgICAgICAgPSB4aWNzX2dldF9pcnE7CisJCXBwY19tZC5jcHVfaXJxX2Rvd24gICA9IHhpY3NfdGVhcmRvd25fY3B1OwogCX0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTIyNyw2ICsyMzMsMjAgQEAKIAogCWlmIChjdXJfY3B1X3NwZWMtPmZpcm13YXJlX2ZlYXR1cmVzICYgRldfRkVBVFVSRV9TUExQQVIpCiAJCXZwYV9pbml0KGJvb3RfY3B1aWQpOworCisJLyogQ2hvb3NlIGFuIGlkbGUgbG9vcCAqLworCWlmIChjdXJfY3B1X3NwZWMtPmZpcm13YXJlX2ZlYXR1cmVzICYgRldfRkVBVFVSRV9TUExQQVIpIHsKKwkJaWYgKGdldF9wYWNhKCktPmxwcGFjYS5zaGFyZWRfcHJvYykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgc2hhcmVkIHByb2Nlc3NvciBpZGxlIGxvb3BcbiIpOworCQkJcHBjX21kLmlkbGVfbG9vcCA9IHBzZXJpZXNfc2hhcmVkX2lkbGU7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWRpY2F0ZWQgaWRsZSBsb29wXG4iKTsKKwkJCXBwY19tZC5pZGxlX2xvb3AgPSBwc2VyaWVzX2RlZGljYXRlZF9pZGxlOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVmYXVsdCBpZGxlIGxvb3BcbiIpOworCQlwcGNfbWQuaWRsZV9sb29wID0gZGVmYXVsdF9pZGxlOworCX0KIH0KIAogc3RhdGljIGludCBfX2luaXQgcFNlcmllc19pbml0X3BhbmVsKHZvaWQpCkBAIC00MTYsNiArNDM2LDE0NCBAQAogCXJldHVybiAxOwogfQogCitERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgbG9uZywgc210X3Nub296ZV9kZWxheSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWRpY2F0ZWRfaWRsZV9zbGVlcCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBwYWNhX3N0cnVjdCAqcHBhY2EgPSAmcGFjYVtjcHUgXiAxXTsKKworCS8qIE9ubHkgc2xlZXAgaWYgdGhlIG90aGVyIHRocmVhZCBpcyBub3QgaWRsZSAqLworCWlmICghKHBwYWNhLT5scHBhY2EuaWRsZSkpIHsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCQkvKgorCQkgKiBXZSBhcmUgYWJvdXQgdG8gc2xlZXAgdGhlIHRocmVhZCBhbmQgc28gd29udCBiZSBwb2xsaW5nIGFueQorCQkgKiBtb3JlLgorCQkgKi8KKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKworCQkvKgorCQkgKiBTTVQgZHluYW1pYyBtb2RlLiBDZWRlIHdpbGwgcmVzdWx0IGluIHRoaXMgdGhyZWFkIGdvaW5nCisJCSAqIGRvcm1hbnQsIGlmIHRoZSBwYXJ0bmVyIHRocmVhZCBpcyBzdGlsbCBkb2luZyB3b3JrLiAgVGhyZWFkCisJCSAqIHdha2VzIHVwIGlmIHBhcnRuZXIgZ29lcyBpZGxlLCBhbiBpbnRlcnJ1cHQgaXMgcHJlc2VudGVkLCBvcgorCQkgKiBhIHByb2Qgb2NjdXJzLiAgUmV0dXJuaW5nIGZyb20gdGhlIGNlZGUgZW5hYmxlcyBleHRlcm5hbAorCQkgKiBpbnRlcnJ1cHRzLgorCQkgKi8KKwkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJCWNlZGVfcHJvY2Vzc29yKCk7CisJCWVsc2UKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBHaXZlIHRoZSBIViBhbiBvcHBvcnR1bml0eSBhdCB0aGUgcHJvY2Vzc29yLCBzaW5jZSB3ZSBhcmUKKwkJICogbm90IGRvaW5nIGFueSB3b3JrLgorCQkgKi8KKwkJcG9sbF9wZW5kaW5nKCk7CisJfQorfQorCitzdGF0aWMgaW50IHBzZXJpZXNfZGVkaWNhdGVkX2lkbGUodm9pZCkKK3sKKwlsb25nIG9sZHZhbDsKKwlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfc25vb3plOworCXVuc2lnbmVkIGxvbmcgKnNtdF9zbm9vemVfZGVsYXkgPSAmX19nZXRfY3B1X3ZhcihzbXRfc25vb3plX2RlbGF5KTsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKKwkJICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgorCQkgKi8KKwkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMTsKKworCQlvbGR2YWwgPSB0ZXN0X2FuZF9jbGVhcl90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKTsKKwkJaWYgKCFvbGR2YWwpIHsKKwkJCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOworCisJCQlzdGFydF9zbm9vemUgPSBfX2dldF90YigpICsKKwkJCQkqc210X3Nub296ZV9kZWxheSAqIHRiX3RpY2tzX3Blcl91c2VjOworCisJCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpICYmICFjcHVfaXNfb2ZmbGluZShjcHUpKSB7CisJCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisKKwkJCQkvKgorCQkJCSAqIEdvIGludG8gbG93IHRocmVhZCBwcmlvcml0eSBhbmQgcG9zc2libHkKKwkJCQkgKiBsb3cgcG93ZXIgbW9kZS4KKwkJCQkgKi8KKwkJCQlITVRfbG93KCk7CisJCQkJSE1UX3ZlcnlfbG93KCk7CisKKwkJCQlpZiAoKnNtdF9zbm9vemVfZGVsYXkgIT0gMCAmJgorCQkJCSAgICBfX2dldF90YigpID4gc3RhcnRfc25vb3plKSB7CisJCQkJCUhNVF9tZWRpdW0oKTsKKwkJCQkJZGVkaWNhdGVkX2lkbGVfc2xlZXAoY3B1KTsKKwkJCQl9CisKKwkJCX0KKworCQkJSE1UX21lZGl1bSgpOworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9uZWVkX3Jlc2NoZWQoKTsKKwkJfQorCisJCWxwYWNhLT5scHBhY2EuaWRsZSA9IDA7CisJCXBwYzY0X3J1bmxhdGNoX29uKCk7CisKKwkJc2NoZWR1bGUoKTsKKworCQlpZiAoY3B1X2lzX29mZmxpbmUoY3B1KSAmJiBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1JVTk5JTkcpCisJCQljcHVfZGllKCk7CisJfQorfQorCitzdGF0aWMgaW50IHBzZXJpZXNfc2hhcmVkX2lkbGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGFjYV9zdHJ1Y3QgKmxwYWNhID0gZ2V0X3BhY2EoKTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQorCQkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCisJCSAqLworCQlscGFjYS0+bHBwYWNhLmlkbGUgPSAxOworCisJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWNwdV9pc19vZmZsaW5lKGNwdSkpIHsKKwkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKKworCQkJLyoKKwkJCSAqIFlpZWxkIHRoZSBwcm9jZXNzb3IgdG8gdGhlIGh5cGVydmlzb3IuICBXZSByZXR1cm4gaWYKKwkJCSAqIGFuIGV4dGVybmFsIGludGVycnVwdCBvY2N1cnMgKHdoaWNoIGFyZSBkcml2ZW4gcHJpb3IKKwkJCSAqIHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlcgorCQkJICogcHJvY2Vzc29yLiBXaGVuIHJldHVybmluZyBoZXJlLCBleHRlcm5hbCBpbnRlcnJ1cHRzCisJCQkgKiBhcmUgZW5hYmxlZC4KKwkJCSAqCisJCQkgKiBDaGVjayBuZWVkX3Jlc2NoZWQoKSBhZ2FpbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKwkJCSAqIHRvIGF2b2lkIGEgcmFjZS4KKwkJCSAqLworCQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKKwkJCQljZWRlX3Byb2Nlc3NvcigpOworCQkJZWxzZQorCQkJCWxvY2FsX2lycV9lbmFibGUoKTsKKworCQkJSE1UX21lZGl1bSgpOworCQl9CisKKwkJbHBhY2EtPmxwcGFjYS5pZGxlID0gMDsKKwkJcHBjNjRfcnVubGF0Y2hfb24oKTsKKworCQlzY2hlZHVsZSgpOworCisJCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKKwkJCWNwdV9kaWUoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IG1hY2hkZXBfY2FsbHMgX19pbml0ZGF0YSBwU2VyaWVzX21kID0gewogCS5wcm9iZQkJCT0gcFNlcmllc19wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBwU2VyaWVzX3NldHVwX2FyY2gsCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3NtcC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcFNlcmllc19zbXAuYwppbmRleCAzMDE1NDE0Li42MmM1NWExIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wU2VyaWVzX3NtcC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BTZXJpZXNfc21wLmMKQEAgLTkzLDEwICs5MywxMyBAQAogCiBpbnQgcFNlcmllc19jcHVfZGlzYWJsZSh2b2lkKQogeworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfY2xlYXIoY3B1LCBjcHVfb25saW5lX21hcCk7CiAJc3lzdGVtY2ZnLT5wcm9jZXNzb3JDb3VudC0tOwogCiAJLypmaXggYm9vdF9jcHVpZCBoZXJlKi8KLQlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IGJvb3RfY3B1aWQpCisJaWYgKGNwdSA9PSBib290X2NwdWlkKQogCQlib290X2NwdWlkID0gYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApOwogCiAJLyogRklYTUU6IGFic3RyYWN0IHRoaXMgdG8gbm90IGJlIHBsYXRmb3JtIHNwZWNpZmljIGxhdGVyIG9uICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wYWNhRGF0YS5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcGFjYURhdGEuYwppbmRleCBhM2UwOTc1Yy4uNjMxNjE4OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcGFjYURhdGEuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9wYWNhRGF0YS5jCkBAIC00MiwyMSArNDIsNyBAQAogICogcHJvY2Vzc29ycy4gIFRoZSBwcm9jZXNzb3IgVlBEIGFycmF5IG5lZWRzIG9uZSBlbnRyeSBwZXIgcGh5c2ljYWwKICAqIHByb2Nlc3NvciAobm90IHRocmVhZCkuCiAgKi8KLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLSNkZWZpbmUgRVhUUkFfSU5JVFMobnVtYmVyLCBscHEpCQkJCQkgICAgXAotCS5scHBhY2FfcHRyID0gJnBhY2FbbnVtYmVyXS5scHBhY2EsCQkJCSAgICBcCi0JLmxwcXVldWVfcHRyID0gKGxwcSksCQkvKiAmeEl0THBRdWV1ZSwgKi8JCSAgICBcCi0JLnJlZ19zYXZlX3B0ciA9ICZwYWNhW251bWJlcl0ucmVnX3NhdmUsCQkJCSAgICBcCi0JLnJlZ19zYXZlID0gewkJCQkJCQkgICAgXAotCQkueERlc2MgPSAweGQzOTdkOWUyLAkvKiAiTHBSUyIgKi8JCQkgICAgXAotCQkueFNpemUgPSBzaXplb2Yoc3RydWN0IEl0THBSZWdTYXZlKQkJCSAgICBcCi0JfSwKLSNlbHNlCi0jZGVmaW5lIEVYVFJBX0lOSVRTKG51bWJlciwgbHBxKQotI2VuZGlmCi0KLSNkZWZpbmUgUEFDQUlOSVREQVRBKG51bWJlcixzdGFydCxscHEsYXNycixhc3J2KQkJCSAgICBcCi17CQkJCQkJCQkJICAgIFwKKyNkZWZpbmUgUEFDQV9JTklUX0NPTU1PTihudW1iZXIsIHN0YXJ0LCBhc3JyLCBhc3J2KQkJCSAgICBcCiAJLmxvY2tfdG9rZW4gPSAweDgwMDAsCQkJCQkJICAgIFwKIAkucGFjYV9pbmRleCA9IChudW1iZXIpLAkJLyogUGFjYSBJbmRleCAqLwkJICAgIFwKIAkuZGVmYXVsdF9kZWNyID0gMHgwMGZmMDAwMCwJLyogSW5pdGlhbCBEZWNyICovCQkgICAgXApAQCAtNzQsMTQ3ICs2MCw3OSBAQAogCQkuZW5kX29mX3F1YW50dW0gPSAweGZmZmZmZmZmZmZmZmZmZmZ1bCwJCQkgICAgXAogCQkuc2xiX2NvdW50ID0gNjQsCQkJCQkgICAgXAogCX0sCQkJCQkJCQkgICAgXAotCUVYVFJBX0lOSVRTKChudW1iZXIpLCAobHBxKSkJCQkJCSAgICBcCisKKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKKyNkZWZpbmUgUEFDQV9JTklUX0lTRVJJRVMobnVtYmVyKQkJCQkJICAgIFwKKwkubHBwYWNhX3B0ciA9ICZwYWNhW251bWJlcl0ubHBwYWNhLAkJCQkgICAgXAorCS5yZWdfc2F2ZV9wdHIgPSAmcGFjYVtudW1iZXJdLnJlZ19zYXZlLAkJCQkgICAgXAorCS5yZWdfc2F2ZSA9IHsJCQkJCQkJICAgIFwKKwkJLnhEZXNjID0gMHhkMzk3ZDllMiwJLyogIkxwUlMiICovCQkJICAgIFwKKwkJLnhTaXplID0gc2l6ZW9mKHN0cnVjdCBJdExwUmVnU2F2ZSkJCQkgICAgXAorCX0KKworI2RlZmluZSBQQUNBX0lOSVQobnVtYmVyKQkJCQkJCSAgICBcCit7CQkJCQkJCQkJICAgIFwKKwlQQUNBX0lOSVRfQ09NTU9OKG51bWJlciwgMCwgMCwgMCkJCQkJICAgIFwKKwlQQUNBX0lOSVRfSVNFUklFUyhudW1iZXIpCQkJCQkgICAgXAogfQogCi1zdHJ1Y3QgcGFjYV9zdHJ1Y3QgcGFjYVtdID0gewotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCVBBQ0FJTklUREFUQSggMCwgMSwgJnhJdExwUXVldWUsIDAsIFNUQUIwX1ZJUlRfQUREUiksCisjZGVmaW5lIEJPT1RDUFVfUEFDQV9JTklUKG51bWJlcikJCQkJCSAgICBcCit7CQkJCQkJCQkJICAgIFwKKwlQQUNBX0lOSVRfQ09NTU9OKG51bWJlciwgMSwgMCwgU1RBQjBfVklSVF9BRERSKQkJCSAgICBcCisJUEFDQV9JTklUX0lTRVJJRVMobnVtYmVyKQkJCQkJICAgIFwKK30KKwogI2Vsc2UKLQlQQUNBSU5JVERBVEEoIDAsIDEsIE5VTEwsIFNUQUIwX1BIWVNfQUREUiwgU1RBQjBfVklSVF9BRERSKSwKKyNkZWZpbmUgUEFDQV9JTklUKG51bWJlcikJCQkJCQkgICAgXAorewkJCQkJCQkJCSAgICBcCisJUEFDQV9JTklUX0NPTU1PTihudW1iZXIsIDAsIDAsIDApCQkJCSAgICBcCit9CisKKyNkZWZpbmUgQk9PVENQVV9QQUNBX0lOSVQobnVtYmVyKQkJCQkJICAgIFwKK3sJCQkJCQkJCQkgICAgXAorCVBBQ0FfSU5JVF9DT01NT04obnVtYmVyLCAxLCBTVEFCMF9QSFlTX0FERFIsIFNUQUIwX1ZJUlRfQUREUikJICAgIFwKK30KICNlbmRpZgorCitzdHJ1Y3QgcGFjYV9zdHJ1Y3QgcGFjYVtdID0geworCUJPT1RDUFVfUEFDQV9JTklUKDApLAogI2lmIE5SX0NQVVMgPiAxCi0JUEFDQUlOSVREQVRBKCAxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoIDIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSggMywgMCwgTlVMTCwgMCwgMCksCisJUEFDQV9JTklUKCAgMSksIFBBQ0FfSU5JVCggIDIpLCBQQUNBX0lOSVQoICAzKSwKICNpZiBOUl9DUFVTID4gNAotCVBBQ0FJTklUREFUQSggNCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKCA1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoIDYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSggNywgMCwgTlVMTCwgMCwgMCksCisJUEFDQV9JTklUKCAgNCksIFBBQ0FfSU5JVCggIDUpLCBQQUNBX0lOSVQoICA2KSwgUEFDQV9JTklUKCAgNyksCiAjaWYgTlJfQ1BVUyA+IDgKLQlQQUNBSU5JVERBVEEoIDgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSggOSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTEsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgxMiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTQsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgxNSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDE2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMTcsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgxOCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDE5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjAsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyMSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDIyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjMsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyNCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDI1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgyNywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDI4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMjksIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgzMCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDMxLCAwLCBOVUxMLCAwLCAwKSwKKwlQQUNBX0lOSVQoICA4KSwgUEFDQV9JTklUKCAgOSksIFBBQ0FfSU5JVCggMTApLCBQQUNBX0lOSVQoIDExKSwKKwlQQUNBX0lOSVQoIDEyKSwgUEFDQV9JTklUKCAxMyksIFBBQ0FfSU5JVCggMTQpLCBQQUNBX0lOSVQoIDE1KSwKKwlQQUNBX0lOSVQoIDE2KSwgUEFDQV9JTklUKCAxNyksIFBBQ0FfSU5JVCggMTgpLCBQQUNBX0lOSVQoIDE5KSwKKwlQQUNBX0lOSVQoIDIwKSwgUEFDQV9JTklUKCAyMSksIFBBQ0FfSU5JVCggMjIpLCBQQUNBX0lOSVQoIDIzKSwKKwlQQUNBX0lOSVQoIDI0KSwgUEFDQV9JTklUKCAyNSksIFBBQ0FfSU5JVCggMjYpLCBQQUNBX0lOSVQoIDI3KSwKKwlQQUNBX0lOSVQoIDI4KSwgUEFDQV9JTklUKCAyOSksIFBBQ0FfSU5JVCggMzApLCBQQUNBX0lOSVQoIDMxKSwKICNpZiBOUl9DUFVTID4gMzIKLQlQQUNBSU5JVERBVEEoMzIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgzMywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDM0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMzUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgzNiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDM3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoMzgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSgzOSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDEsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg0MiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQzLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDQsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg0NSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQ2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNDcsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg0OCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDQ5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTAsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1MSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDUyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTMsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1NCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDU1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg1NywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDU4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNTksIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2MCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDYxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNjIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2MywgMCwgTlVMTCwgMCwgMCksCisJUEFDQV9JTklUKCAzMiksIFBBQ0FfSU5JVCggMzMpLCBQQUNBX0lOSVQoIDM0KSwgUEFDQV9JTklUKCAzNSksCisJUEFDQV9JTklUKCAzNiksIFBBQ0FfSU5JVCggMzcpLCBQQUNBX0lOSVQoIDM4KSwgUEFDQV9JTklUKCAzOSksCisJUEFDQV9JTklUKCA0MCksIFBBQ0FfSU5JVCggNDEpLCBQQUNBX0lOSVQoIDQyKSwgUEFDQV9JTklUKCA0MyksCisJUEFDQV9JTklUKCA0NCksIFBBQ0FfSU5JVCggNDUpLCBQQUNBX0lOSVQoIDQ2KSwgUEFDQV9JTklUKCA0NyksCisJUEFDQV9JTklUKCA0OCksIFBBQ0FfSU5JVCggNDkpLCBQQUNBX0lOSVQoIDUwKSwgUEFDQV9JTklUKCA1MSksCisJUEFDQV9JTklUKCA1MiksIFBBQ0FfSU5JVCggNTMpLCBQQUNBX0lOSVQoIDU0KSwgUEFDQV9JTklUKCA1NSksCisJUEFDQV9JTklUKCA1NiksIFBBQ0FfSU5JVCggNTcpLCBQQUNBX0lOSVQoIDU4KSwgUEFDQV9JTklUKCA1OSksCisJUEFDQV9JTklUKCA2MCksIFBBQ0FfSU5JVCggNjEpLCBQQUNBX0lOSVQoIDYyKSwgUEFDQV9JTklUKCA2MyksCiAjaWYgTlJfQ1BVUyA+IDY0Ci0JUEFDQUlOSVREQVRBKDY0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNjUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2NiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDY3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNjgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg2OSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDcwLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzEsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg3MiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDczLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzQsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg3NSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDc2LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoNzcsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg3OCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDc5LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODAsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4MSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDgyLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODMsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4NCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDg1LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODYsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg4NywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDg4LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoODksIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5MCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDkxLCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoOTIsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5MywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDk0LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoOTUsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5NiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDk3LCAwLCBOVUxMLCAwLCAwKSwKLQlQQUNBSU5JVERBVEEoOTgsIDAsIE5VTEwsIDAsIDApLAotCVBBQ0FJTklUREFUQSg5OSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwMCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwMSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwMiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwMywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwNCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwNSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwNiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwNywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwOCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEwOSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExMCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExMSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExMiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExMywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExNCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExNSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExNiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExNywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExOCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDExOSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyMCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyMSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyMiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyMywgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyNCwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyNSwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyNiwgMCwgTlVMTCwgMCwgMCksCi0JUEFDQUlOSVREQVRBKDEyNywgMCwgTlVMTCwgMCwgMCksCisJUEFDQV9JTklUKCA2NCksIFBBQ0FfSU5JVCggNjUpLCBQQUNBX0lOSVQoIDY2KSwgUEFDQV9JTklUKCA2NyksCisJUEFDQV9JTklUKCA2OCksIFBBQ0FfSU5JVCggNjkpLCBQQUNBX0lOSVQoIDcwKSwgUEFDQV9JTklUKCA3MSksCisJUEFDQV9JTklUKCA3MiksIFBBQ0FfSU5JVCggNzMpLCBQQUNBX0lOSVQoIDc0KSwgUEFDQV9JTklUKCA3NSksCisJUEFDQV9JTklUKCA3NiksIFBBQ0FfSU5JVCggNzcpLCBQQUNBX0lOSVQoIDc4KSwgUEFDQV9JTklUKCA3OSksCisJUEFDQV9JTklUKCA4MCksIFBBQ0FfSU5JVCggODEpLCBQQUNBX0lOSVQoIDgyKSwgUEFDQV9JTklUKCA4MyksCisJUEFDQV9JTklUKCA4NCksIFBBQ0FfSU5JVCggODUpLCBQQUNBX0lOSVQoIDg2KSwgUEFDQV9JTklUKCA4NyksCisJUEFDQV9JTklUKCA4OCksIFBBQ0FfSU5JVCggODkpLCBQQUNBX0lOSVQoIDkwKSwgUEFDQV9JTklUKCA5MSksCisJUEFDQV9JTklUKCA5MiksIFBBQ0FfSU5JVCggOTMpLCBQQUNBX0lOSVQoIDk0KSwgUEFDQV9JTklUKCA5NSksCisJUEFDQV9JTklUKCA5NiksIFBBQ0FfSU5JVCggOTcpLCBQQUNBX0lOSVQoIDk4KSwgUEFDQV9JTklUKCA5OSksCisJUEFDQV9JTklUKDEwMCksIFBBQ0FfSU5JVCgxMDEpLCBQQUNBX0lOSVQoMTAyKSwgUEFDQV9JTklUKDEwMyksCisJUEFDQV9JTklUKDEwNCksIFBBQ0FfSU5JVCgxMDUpLCBQQUNBX0lOSVQoMTA2KSwgUEFDQV9JTklUKDEwNyksCisJUEFDQV9JTklUKDEwOCksIFBBQ0FfSU5JVCgxMDkpLCBQQUNBX0lOSVQoMTEwKSwgUEFDQV9JTklUKDExMSksCisJUEFDQV9JTklUKDExMiksIFBBQ0FfSU5JVCgxMTMpLCBQQUNBX0lOSVQoMTE0KSwgUEFDQV9JTklUKDExNSksCisJUEFDQV9JTklUKDExNiksIFBBQ0FfSU5JVCgxMTcpLCBQQUNBX0lOSVQoMTE4KSwgUEFDQV9JTklUKDExOSksCisJUEFDQV9JTklUKDEyMCksIFBBQ0FfSU5JVCgxMjEpLCBQQUNBX0lOSVQoMTIyKSwgUEFDQV9JTklUKDEyMyksCisJUEFDQV9JTklUKDEyNCksIFBBQ0FfSU5JVCgxMjUpLCBQQUNBX0lOSVQoMTI2KSwgUEFDQV9JTklUKDEyNyksCiAjZW5kaWYKICNlbmRpZgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wY2kuYyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jCmluZGV4IDU4MDY3NmYuLmFlNmY1NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BjaS5jCkBAIC0zNTEsNyArMzUxLDcgQEAKIAkJKm9mZnNldCArPSBob3NlLT5wY2lfbWVtX29mZnNldDsKIAkJcmVzX2JpdCA9IElPUkVTT1VSQ0VfTUVNOwogCX0gZWxzZSB7Ci0JCWlvX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydDsKKwkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpaG9zZS0+aW9fYmFzZV92aXJ0IC0gcGNpX2lvX2Jhc2U7CiAJCSpvZmZzZXQgKz0gaW9fb2Zmc2V0OwogCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9JTzsKIAl9CkBAIC0zNzgsNyArMzc4LDcgQEAKIAogCQkvKiBmb3VuZCBpdCEgY29uc3RydWN0IHRoZSBmaW5hbCBwaHlzaWNhbCBhZGRyZXNzICovCiAJCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQotCQkJKm9mZnNldCArPSBob3NlLT5pb19iYXNlX3BoeXMgLSBpb19vZmZzZXQ7CisJCSAgICAgICAJKm9mZnNldCArPSBob3NlLT5pb19iYXNlX3BoeXMgLSBpb19vZmZzZXQ7CiAJCXJldHVybiBycDsKIAl9CiAKQEAgLTk0NCw0ICs5NDQsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOwogCit2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCisJCQkgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKKwkJCSAgdTY0ICpzdGFydCwgdTY0ICplbmQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gcGNpX2J1c190b19ob3N0KGRldi0+YnVzKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisKKwlpZiAoaG9zZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAocnNyYy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlvZmZzZXQgPSBwY2lfaW9fYmFzZSAtICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCArCisJCQlob3NlLT5pb19iYXNlX3BoeXM7CisKKwkqc3RhcnQgPSByc3JjLT5zdGFydCArIG9mZnNldDsKKwkqZW5kID0gcnNyYy0+ZW5kICsgb2Zmc2V0OworfQorCiAjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NldHVwLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9wbWFjX3NldHVwLmMKaW5kZXggNmNmMDNkMy4uMzAxM2NkYiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcG1hY19zZXR1cC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3BtYWNfc2V0dXAuYwpAQCAtMTg2LDYgKzE4Niw4IEBACiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgorCisJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgbmF0aXZlL05BUCBpZGxlIGxvb3BcbiIpOwogfQogCiAjaWZkZWYgQ09ORklHX1NDU0kKQEAgLTUwNyw1ICs1MDksNiBAQAogICAgICAgCS5jYWxpYnJhdGVfZGVjcgkJPSBwbWFjX2NhbGlicmF0ZV9kZWNyLAogCS5mZWF0dXJlX2NhbGwJCT0gcG1hY19kb19mZWF0dXJlX2NhbGwsCiAJLnByb2dyZXNzCQk9IHBtYWNfcHJvZ3Jlc3MsCi0JLmNoZWNrX2xlZ2FjeV9pb3BvcnQJPSBwbWFjX2NoZWNrX2xlZ2FjeV9pb3BvcnQKKwkuY2hlY2tfbGVnYWN5X2lvcG9ydAk9IHBtYWNfY2hlY2tfbGVnYWN5X2lvcG9ydCwKKwkuaWRsZV9sb29wCQk9IG5hdGl2ZV9pZGxlLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3BwY19rc3ltcy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHBjX2tzeW1zLmMKaW5kZXggYjIzMGE2My4uNzA1NzQyZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGM2NC9rZXJuZWwvcHBjX2tzeW1zLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHBjX2tzeW1zLmMKQEAgLTc1LDYgKzc1LDcgQEAKIEVYUE9SVF9TWU1CT0woZ2l2ZXVwX2FsdGl2ZWMpOwogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKF9fZmx1c2hfaWNhY2hlX3JhbmdlKTsKK0VYUE9SVF9TWU1CT0woZmx1c2hfZGNhY2hlX3JhbmdlKTsKIAogI2lmZGVmIENPTkZJR19TTVAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcHBjNjQva2VybmVsL3Byb2Nlc3MuYwppbmRleCBhYmE4OTU1Li5mN2NhZTA1IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMzA3LDYgKzMwOCw4IEBACiAKIHZvaWQgZXhpdF90aHJlYWQodm9pZCkKIHsKKwlrcHJvYmVfZmx1c2hfdGFzayhjdXJyZW50KTsKKwogI2lmbmRlZiBDT05GSUdfU01QCiAJaWYgKGxhc3RfdGFza191c2VkX21hdGggPT0gY3VycmVudCkKIAkJbGFzdF90YXNrX3VzZWRfbWF0aCA9IE5VTEw7CkBAIC0zMjEsNiArMzI0LDcgQEAKIHsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CiAKKwlrcHJvYmVfZmx1c2hfdGFzayhjdXJyZW50KTsKIAlpZiAodC0+ZmxhZ3MgJiBfVElGX0FCSV9QRU5ESU5HKQogCQl0LT5mbGFncyBePSAoX1RJRl9BQklfUEVORElORyB8IF9USUZfMzJCSVQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcHBjNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDlmOGM2MDguLjI5OTNmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3B0cmFjZS5jCkBAIC0zMDUsNiArMzA1LDggQEAKIAogdm9pZCBkb19zeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXNlY3VyZV9jb21wdXRpbmcocmVncy0+Z3ByWzBdKTsKKwogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKQogCSAgICAmJiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCiAJCWRvX3N5c2NhbGxfdHJhY2UoKTsKQEAgLTMyMCw4ICszMjIsNiBAQAogCiB2b2lkIGRvX3N5c2NhbGxfdHJhY2VfbGVhdmUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc2VjdXJlX2NvbXB1dGluZyhyZWdzLT5ncHJbMF0pOwotCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQogCQlhdWRpdF9zeXNjYWxsX2V4aXQoY3VycmVudCwgCiAJCQkJICAgKHJlZ3MtPmNjciYweDEwMDApP0FVRElUU0NfRkFJTFVSRTpBVURJVFNDX1NVQ0NFU1MsCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvc2V0dXAuYwppbmRleCAwYTQ3YTVlLi5kMWIzM2YwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3NldHVwLmMKQEAgLTk2LDcgKzk2LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGtsaW1pdDsKIAogZXh0ZXJuIHZvaWQgbW1faW5pdF9wcGM2NCh2b2lkKTsKLWV4dGVybiBpbnQgIGlkbGVfc2V0dXAodm9pZCk7CiBleHRlcm4gdm9pZCBzdGFiX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBzdGFiKTsKIGV4dGVybiB2b2lkIGh0YWJfaW5pdGlhbGl6ZSh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZGV2dHJlZSh2b2lkICpmbGF0X2R0KTsKQEAgLTY3NywxMSArNjc2LDE2IEBACiAJREJHKCIgPC0gc2V0dXBfc3lzdGVtKClcbiIpOwogfQogCi0KLXZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKKy8qIGFsc28gdXNlZCBieSBrZXhlYyAqLwordm9pZCBtYWNoaW5lX3NodXRkb3duKHZvaWQpCiB7CiAJaWYgKHBwY19tZC5udnJhbV9zeW5jKQogCQlwcGNfbWQubnZyYW1fc3luYygpOworfQorCit2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCit7CisJbWFjaGluZV9zaHV0ZG93bigpOwogCXBwY19tZC5yZXN0YXJ0KGNtZCk7CiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9zZW5kX3N0b3AoKTsKQEAgLTY5MCwxMyArNjk0LDExIEBACiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAl3aGlsZSAoMSkgOwogfQotCiBFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcmVzdGFydCk7Ci0gIAorCiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JaWYgKHBwY19tZC5udnJhbV9zeW5jKQotCQlwcGNfbWQubnZyYW1fc3luYygpOworCW1hY2hpbmVfc2h1dGRvd24oKTsKIAlwcGNfbWQucG93ZXJfb2ZmKCk7CiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9zZW5kX3N0b3AoKTsKQEAgLTcwNSwxMyArNzA3LDExIEBACiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAl3aGlsZSAoMSkgOwogfQotCiBFWFBPUlRfU1lNQk9MKG1hY2hpbmVfcG93ZXJfb2ZmKTsKLSAgCisKIHZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCiB7Ci0JaWYgKHBwY19tZC5udnJhbV9zeW5jKQotCQlwcGNfbWQubnZyYW1fc3luYygpOworCW1hY2hpbmVfc2h1dGRvd24oKTsKIAlwcGNfbWQuaGFsdCgpOwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfc2VuZF9zdG9wKCk7CkBAIC03MjAsNyArNzIwLDYgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCXdoaWxlICgxKSA7CiB9Ci0KIEVYUE9SVF9TWU1CT0wobWFjaGluZV9oYWx0KTsKIAogc3RhdGljIGludCBwcGM2NF9wYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCkBAIC0xMDgxLDggKzEwODAsMTEgQEAKIAogCXBwY19tZC5zZXR1cF9hcmNoKCk7CiAKLQkvKiBTZWxlY3QgdGhlIGNvcnJlY3QgaWRsZSBsb29wIGZvciB0aGUgcGxhdGZvcm0uICovCi0JaWRsZV9zZXR1cCgpOworCS8qIFVzZSB0aGUgZGVmYXVsdCBpZGxlIGxvb3AgaWYgdGhlIHBsYXRmb3JtIGhhc24ndCBwcm92aWRlZCBvbmUuICovCisJaWYgKE5VTEwgPT0gcHBjX21kLmlkbGVfbG9vcCkgeworCQlwcGNfbWQuaWRsZV9sb29wID0gZGVmYXVsdF9pZGxlOworCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWZhdWx0IGlkbGUgbG9vcFxuIik7CisJfQogCiAJcGFnaW5nX2luaXQoKTsKIAlwcGM2NF9ib290X21zZygweDE1LCAiU2V0dXAgRG9uZSIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGM2NC9rZXJuZWwvc3lzX3BwYzMyLmMgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYwppbmRleCAxMTg0MzZlLi4yMDY2MTkwIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYworKysgYi9hcmNoL3BwYzY0L2tlcm5lbC9zeXNfcHBjMzIuYwpAQCAtMzAsNDcgKzMwLDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXNnLmg+CiAjaW5jbHVkZSA8bGludXgvc2htLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzZC94ZHIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogCi0jaW5jbHVkZSA8bmV0L3NjbS5oPgotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lwYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxhc20vcHBjZGVidWcuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW1jZmcuaD4KQEAgLTM1MCw4ICszMjksNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotLyogVGhlc2UgYXJlIGhlcmUganVzdCBpbiBjYXNlIHNvbWUgb2xkIHNwYXJjMzIgYmluYXJ5IGNhbGxzIGl0LiAqLwogYXNtbGlua2FnZSBsb25nIHN5czMyX3BhdXNlKHZvaWQpCiB7CiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CkBAIC0zNjAsOCArMzM3LDYgQEAKIAlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCi0KLQogc3RhdGljIGlubGluZSBsb25nIGdldF90czMyKHN0cnVjdCB0aW1lc3BlYyAqbywgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqaSkKIHsKIAlsb25nIHVzZWM7CkBAIC04NDcsMTYgKzgyMiw2IEBACiB9CiAKIAotLyogTm90ZTogaXQgaXMgbmVjZXNzYXJ5IHRvIHRyZWF0IHdoaWNoIGFuZCB3aG8gYXMgdW5zaWduZWQgaW50cywKLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIAotICogcHJvcGVyIGNvbnZlcnNpb24gKHNpZ24gZXh0ZW5zaW9uKSBiZXR3ZWVuIHRoZSByZWdpc3RlciByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25lZCBpbnQgKG1zciBpbiAzMi1iaXQgbW9kZSkKLSAqIGFuZCB0aGUgcmVnaXN0ZXIgcmVwcmVzZW50YXRpb24gb2YgYSBzaWduZWQgaW50IChtc3IgaW4gNjQtYml0IG1vZGUpIGlzIHBlcmZvcm1lZC4KLSAqLwotYXNtbGlua2FnZSBsb25nIHN5czMyX2dldHByaW9yaXR5KHUzMiB3aGljaCwgdTMyIHdobykKLXsKLQlyZXR1cm4gc3lzX2dldHByaW9yaXR5KChpbnQpd2hpY2gsIChpbnQpd2hvKTsKLX0KLQogCiAvKiBOb3RlOiBpdCBpcyBuZWNlc3NhcnkgdG8gdHJlYXQgcGlkIGFzIGFuIHVuc2lnbmVkIGludCwKICAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIApAQCAtMTA0OCw2ICsxMDEzLDExIEBACiAJcmV0dXJuIHN5c19zZXRwZ2lkKChpbnQpcGlkLCAoaW50KXBnaWQpOwogfQogCitsb25nIHN5czMyX2dldHByaW9yaXR5KHUzMiB3aGljaCwgdTMyIHdobykKK3sKKwkvKiBzaWduIGV4dGVuZCB3aGljaCBhbmQgd2hvICovCisJcmV0dXJuIHN5c19nZXRwcmlvcml0eSgoaW50KXdoaWNoLCAoaW50KXdobyk7Cit9CiAKIGxvbmcgc3lzMzJfc2V0cHJpb3JpdHkodTMyIHdoaWNoLCB1MzIgd2hvLCB1MzIgbmljZXZhbCkKIHsKQEAgLTEwNTUsNiArMTAyNSwxOCBAQAogCXJldHVybiBzeXNfc2V0cHJpb3JpdHkoKGludCl3aGljaCwgKGludCl3aG8sIChpbnQpbmljZXZhbCk7CiB9CiAKK2xvbmcgc3lzMzJfaW9wcmlvX2dldCh1MzIgd2hpY2gsIHUzMiB3aG8pCit7CisJLyogc2lnbiBleHRlbmQgd2hpY2ggYW5kIHdobyAqLworCXJldHVybiBzeXNfaW9wcmlvX2dldCgoaW50KXdoaWNoLCAoaW50KXdobyk7Cit9CisKK2xvbmcgc3lzMzJfaW9wcmlvX3NldCh1MzIgd2hpY2gsIHUzMiB3aG8sIHUzMiBpb3ByaW8pCit7CisJLyogc2lnbiBleHRlbmQgd2hpY2gsIHdobyBhbmQgaW9wcmlvICovCisJcmV0dXJuIHN5c19pb3ByaW9fc2V0KChpbnQpd2hpY2gsIChpbnQpd2hvLCAoaW50KWlvcHJpbyk7Cit9CisKIC8qIE5vdGU6IGl0IGlzIG5lY2Vzc2FyeSB0byB0cmVhdCBuZXdtYXNrIGFzIGFuIHVuc2lnbmVkIGludCwKICAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY2FzdCB0byBhIHNpZ25lZCBpbnQgdG8gaW5zdXJlIHRoYXQgdGhlIAogICogcHJvcGVyIGNvbnZlcnNpb24gKHNpZ24gZXh0ZW5zaW9uKSBiZXR3ZWVuIHRoZSByZWdpc3RlciByZXByZXNlbnRhdGlvbiBvZiBhIHNpZ25lZCBpbnQgKG1zciBpbiAzMi1iaXQgbW9kZSkKQEAgLTEyNzMsOCArMTI1NSw2IEBACiAJCQkgICAgICh1NjQpbGVuX2hpZ2ggPDwgMzIgfCBsZW5fbG93LCBhZHZpY2UpOwogfQogCi1leHRlcm4gYXNtbGlua2FnZSBsb25nIHN5c190aW1lcl9jcmVhdGUoY2xvY2tpZF90LCBzaWdldmVudF90IF9fdXNlciAqLCB0aW1lcl90IF9fdXNlciAqKTsKLQogbG9uZyBwcGMzMl90aW1lcl9jcmVhdGUoY2xvY2tpZF90IGNsb2NrLAogCQkJc3RydWN0IGNvbXBhdF9zaWdldmVudCBfX3VzZXIgKmV2MzIsCiAJCQl0aW1lcl90IF9fdXNlciAqdGltZXJfaWQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNmcy5jIGIvYXJjaC9wcGM2NC9rZXJuZWwvc3lzZnMuYwppbmRleCBjOGZhNjU2Li4wMmI4YWM0IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3N5c2ZzLmMKQEAgLTExMiw3ICsxMTIsNiBAQAogCXVuc2lnbmVkIGxvbmcgaGlkMDsKICNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKIAl1bnNpZ25lZCBsb25nIHNldCwgcmVzZXQ7Ci0JaW50IHJldDsKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BTRVJJRVMgKi8KIAogCS8qIE9ubHkgbmVlZCB0byBlbmFibGUgdGhlbSBvbmNlICovCkBAIC0xNDUsMTEgKzE0NCw3IEBACiAJY2FzZSBQTEFURk9STV9QU0VSSUVTX0xQQVI6CiAJCXNldCA9IDFVTCA8PCA2MzsKIAkJcmVzZXQgPSAwOwotCQlyZXQgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9QRVJGTU9OLCBzZXQsIHJlc2V0KTsKLQkJaWYgKHJldCkKLQkJCXByaW50ayhLRVJOX0VSUiAiSF9QRVJGTU9OIGNhbGwgb24gY3B1ICV1ICIKLQkJCSAgICAgICAicmV0dXJuZWQgJWRcbiIsCi0JCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCByZXQpOworCQlwbHBhcl9oY2FsbF9ub3JldHMoSF9QRVJGTU9OLCBzZXQsIHJlc2V0KTsKIAkJYnJlYWs7CiAjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCiAKQEAgLTE2MSwxMyArMTU2LDYgQEAKIAkvKiBpbnN0cnVjdCBoeXBlcnZpc29yIHRvIG1haW50YWluIFBNQ3MgKi8KIAlpZiAoY3VyX2NwdV9zcGVjLT5maXJtd2FyZV9mZWF0dXJlcyAmIEZXX0ZFQVRVUkVfU1BMUEFSKQogCQlnZXRfcGFjYSgpLT5scHBhY2EucG1jcmVnc19pbl91c2UgPSAxOwotCi0JLyoKLQkgKiBPbiBTTVQgbWFjaGluZXMgd2UgaGF2ZSB0byBzZXQgdGhlIHJ1biBsYXRjaCBpbiB0aGUgY3RybCByZWdpc3RlcgotCSAqIGluIG9yZGVyIHRvIG1ha2UgUE1DNiBzcGluLgotCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9TTVQpKQotCQlwcGM2NF9ydW5sYXRjaF9vbigpOwogI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwogfQogCkBAIC00MDAsNyArMzg4LDEyIEBACiAJCXN0cnVjdCBjcHUgKmMgPSAmcGVyX2NwdShjcHVfZGV2aWNlcywgY3B1KTsKIAogI2lmZGVmIENPTkZJR19OVU1BCi0JCXBhcmVudCA9ICZub2RlX2RldmljZXNbY3B1X3RvX25vZGUoY3B1KV07CisJCS8qIFRoZSBub2RlIHRvIHdoaWNoIGEgY3B1IGJlbG9uZ3MgY2FuJ3QgYmUga25vd24KKwkJICogdW50aWwgdGhlIGNwdSBpcyBtYWRlIHByZXNlbnQuCisJCSAqLworCQlwYXJlbnQgPSBOVUxMOworCQlpZiAoY3B1X3ByZXNlbnQoY3B1KSkKKwkJCXBhcmVudCA9ICZub2RlX2RldmljZXNbY3B1X3RvX25vZGUoY3B1KV07CiAjZW5kaWYKIAkJLyoKIAkJICogRm9yIG5vdywgd2UganVzdCBzZWUgaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBtYWtpbmcKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYyBiL2FyY2gvcHBjNjQva2VybmVsL3RpbWUuYwppbmRleCAyMzQ4YTc1Li45MDk0NjJlIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwvdGltZS5jCkBAIC05MSw2ICs5MSw3IEBACiB1bnNpZ25lZCAgICAgIHRiX3RvX3VzOwogdW5zaWduZWQgbG9uZyBwcm9jZXNzb3JfZnJlcTsKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CitFWFBPUlRfU1lNQk9MX0dQTChydGNfbG9jayk7CiAKIHVuc2lnbmVkIGxvbmcgdGJfdG9fbnNfc2NhbGU7CiB1bnNpZ25lZCBsb25nIHRiX3RvX25zX3NoaWZ0OwpAQCAtOTgsNyArOTksNiBAQAogc3RydWN0IGdldHRpbWVvZmRheV9zdHJ1Y3QgZG9fZ3RvZDsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbHBldmVudF9jb3VudDsKIGV4dGVybiBpbnQgc21wX3RiX3N5bmNocm9uaXplZDsKIAogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CkBAIC0zNjYsMTEgKzM2Niw4IEBACiAJc2V0X2RlYyhuZXh0X2RlYyk7CiAKICNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQl7Ci0JCXN0cnVjdCBJdExwUXVldWUgKmxwcSA9IGxwYWNhLT5scHF1ZXVlX3B0cjsKLQkJaWYgKGxwcSAmJiBJdExwUXVldWVfaXNMcEludFBlbmRpbmcobHBxKSkKLQkJCWxwZXZlbnRfY291bnQgKz0gSXRMcFF1ZXVlX3Byb2Nlc3MobHBxLCByZWdzKTsKLQl9CisJaWYgKGh2bHBldmVudF9pc19wZW5kaW5nKCkpCisJCXByb2Nlc3NfaHZscGV2ZW50cyhyZWdzKTsKICNlbmRpZgogCiAvKiBjb2xsZWN0IHB1cnIgcmVnaXN0ZXIgdmFsdWVzIG9mdGVuLCBmb3IgYWNjdXJhdGUgY2FsY3VsYXRpb25zICovCmRpZmYgLS1naXQgYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TIGIvYXJjaC9wcGM2NC9rZXJuZWwvdmRzbzMyL3Zkc28zMi5sZHMuUwppbmRleCAxMTI5MGM5Li42Zjg3YTkxIDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC92ZHNvMzIvdmRzbzMyLmxkcy5TCisrKyBiL2FyY2gvcHBjNjQva2VybmVsL3Zkc28zMi92ZHNvMzIubGRzLlMKQEAgLTQwLDkgKzQwLDkgQEAKICAgLmdjY19leGNlcHRfdGFibGUJOiB7ICooLmdjY19leGNlcHRfdGFibGUpIH0KICAgLmZpeHVwCQk6IHsgKiguZml4dXApIH0KIAotICAuZ290IEFMSUdOKDQpCQk6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0KICAgLmR5bmFtaWMJCTogeyAqKC5keW5hbWljKSB9CQk6dGV4dAk6ZHluYW1pYworICAuZ290IDogeyAqKC5nb3QpIH0KKyAgLnBsdCA6IHsgKigucGx0KSB9CiAKICAgX2VuZCA9IC47CiAgIF9fZW5kID0gLjsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQva2VybmVsL3hpY3MuYyBiL2FyY2gvcHBjNjQva2VybmVsL3hpY3MuYwppbmRleCA4NzlmMzliLi42NzdjNDQ1IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L2tlcm5lbC94aWNzLmMKKysrIGIvYXJjaC9wcGM2NC9rZXJuZWwveGljcy5jCkBAIC02NDcsNiArNjQ3LDMxIEBACiAJfQogfQogCit2b2lkIHhpY3NfdGVhcmRvd25fY3B1KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgc3RhdHVzOworCisJb3BzLT5jcHByX2luZm8oY3B1LCAweDAwKTsKKwlpb3N5bmMoKTsKKworCS8qCisJICogd2UgbmVlZCB0byBFT0kgdGhlIElQSSBpZiB3ZSBnb3QgaGVyZSBmcm9tIGtleGVjIGRvd24gSVBJCisJICoKKwkgKiB4aWNzIGRvZXNuJ3QgY2FyZSBpZiB3ZSBkdXBsaWNhdGUgYW4gRU9JIGFzIGxvbmcgYXMgd2UKKwkgKiBkb24ndCBFT0kgYW5kIHJhaXNlIHByaW9yaXR5LgorCSAqCisJICogcHJvYmFibHkgbmVlZCB0byBjaGVjayBhbGwgdGhlIG90aGVyIGludGVycnVwdHMgdG9vCisJICogc2hvdWxkIHdlIGJlIGZsYWdnaW5nIGlkbGUgbG9vcCBpbnN0ZWFkPworCSAqIG9yIGNyZWF0aW5nIHNvbWUgdGFzayB0byBiZSBzY2hlZHVsZWQ/CisJICovCisJb3BzLT54aXJyX2luZm9fc2V0KGNwdSwgWElDU19JUEkpOworCisJc3RhdHVzID0gcnRhc19zZXRfaW5kaWNhdG9yKEdMT0JBTF9JTlRFUlJVUFRfUVVFVUUsCisJCSgxVUwgPDwgaW50ZXJydXB0X3NlcnZlcl9zaXplKSAtIDEgLSBkZWZhdWx0X2Rpc3RyaWJfc2VydmVyLCAwKTsKKwlXQVJOX09OKHN0YXR1cyAhPSAwKTsKK30KKwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCiAvKiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjNjQvbW0vaGFzaF9uYXRpdmUuYyBiL2FyY2gvcHBjNjQvbW0vaGFzaF9uYXRpdmUuYwppbmRleCA1MmI2YjkzLi40ZmVjMDU4IDEwMDY0NAotLS0gYS9hcmNoL3BwYzY0L21tL2hhc2hfbmF0aXZlLmMKKysrIGIvYXJjaC9wcGM2NC9tbS9oYXNoX25hdGl2ZS5jCkBAIC0zMDQsNiArMzA0LDUwIEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCisvKgorICogY2xlYXIgYWxsIG1hcHBpbmdzIG9uIGtleGVjLiAgQWxsIGNwdXMgYXJlIGluIHJlYWwgbW9kZSAob3IgdGhleSB3aWxsCisgKiBiZSB3aGVuIHRoZXkgaXNpKSwgYW5kIHdlIGFyZSB0aGUgb25seSBvbmUgbGVmdC4gIFdlIHJlbHkgb24gb3VyIGtlcm5lbAorICogbWFwcGluZyBiZWluZyAweEMwJ3MgYW5kIHRoZSBoYXJkd2FyZSBpZ25vcmluZyB0aG9zZSB0d28gcmVhbCBiaXRzLgorICoKKyAqIFRPRE86IGFkZCBiYXRjaGluZyBzdXBwb3J0IHdoZW4gZW5hYmxlZC4gIHJlbWVtYmVyLCBubyBkeW5hbWljIG1lbW9yeSBoZXJlLAorICogYXRob3VnaCB0aGVyZSBpcyB0aGUgY29udHJvbCBwYWdlIGF2YWlsYWJsZS4uLgorICovCitzdGF0aWMgdm9pZCBuYXRpdmVfaHB0ZV9jbGVhcih2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2xvdCwgc2xvdHMsIGZsYWdzOworCUhQVEUgKmhwdGVwID0gaHRhYl9hZGRyZXNzOworCUhwdGVfZHdvcmQwIGR3MDsKKwl1bnNpZ25lZCBsb25nIHB0ZWdfY291bnQ7CisKKwlwdGVnX2NvdW50ID0gaHRhYl9oYXNoX21hc2sgKyAxOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJLyogd2UgdGFrZSB0aGUgdGxiaWUgbG9jayBhbmQgaG9sZCBpdC4gIFNvbWUgaGFyZHdhcmUgd2lsbAorCSAqIGRlYWRsb2NrIGlmIHdlIHRyeSB0byB0bGJpZSBmcm9tIHR3byBwcm9jZXNzb3JzIGF0IG9uY2UuCisJICovCisJc3Bpbl9sb2NrKCZuYXRpdmVfdGxiaWVfbG9jayk7CisKKwlzbG90cyA9IHB0ZWdfY291bnQgKiBIUFRFU19QRVJfR1JPVVA7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgc2xvdHM7IHNsb3QrKywgaHB0ZXArKykgeworCQkvKgorCQkgKiB3ZSBjb3VsZCBsb2NrIHRoZSBwdGUgaGVyZSwgYnV0IHdlIGFyZSB0aGUgb25seSBjcHUKKwkJICogcnVubmluZywgIHJpZ2h0PyAgYW5kIGZvciBjcmFzaCBkdW1wLCB3ZSBwcm9iYWJseQorCQkgKiBkb24ndCB3YW50IHRvIHdhaXQgZm9yIGEgbWF5YmUgYmFkIGNwdS4KKwkJICovCisJCWR3MCA9IGhwdGVwLT5kdzAuZHcwOworCisJCWlmIChkdzAudikgeworCQkJaHB0ZXAtPmR3MC5kd29yZDAgPSAwOworCQkJdGxiaWUoc2xvdDJ2YShkdzAuYXZwbiwgZHcwLmwsIGR3MC5oLCBzbG90KSwgZHcwLmwpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJm5hdGl2ZV90bGJpZV9sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIG5hdGl2ZV9mbHVzaF9oYXNoX3JhbmdlKHVuc2lnbmVkIGxvbmcgY29udGV4dCwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBudW1iZXIsIGludCBsb2NhbCkKIHsKQEAgLTQxNSw3ICs0NTksOCBAQAogCXBwY19tZC5ocHRlX3VwZGF0ZXBwCT0gbmF0aXZlX2hwdGVfdXBkYXRlcHA7CiAJcHBjX21kLmhwdGVfdXBkYXRlYm9sdGVkcHAgPSBuYXRpdmVfaHB0ZV91cGRhdGVib2x0ZWRwcDsKIAlwcGNfbWQuaHB0ZV9pbnNlcnQJPSBuYXRpdmVfaHB0ZV9pbnNlcnQ7Ci0JcHBjX21kLmhwdGVfcmVtb3ZlICAgICAJPSBuYXRpdmVfaHB0ZV9yZW1vdmU7CisJcHBjX21kLmhwdGVfcmVtb3ZlCT0gbmF0aXZlX2hwdGVfcmVtb3ZlOworCXBwY19tZC5ocHRlX2NsZWFyX2FsbAk9IG5hdGl2ZV9ocHRlX2NsZWFyOwogCWlmICh0bGJfYmF0Y2hpbmdfZW5hYmxlZCgpKQogCQlwcGNfbWQuZmx1c2hfaGFzaF9yYW5nZSA9IG5hdGl2ZV9mbHVzaF9oYXNoX3JhbmdlOwogCWh0YWJfZmluaXNoX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggMzI2OTZjMS4uNDc3YWMyNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTQ1NSw4ICs0NTUsMTggQEAKIAkgIFRoZSBIWiB0aW1lciBpcyBzd2l0Y2hlZCBvZmYgaW4gaWRsZSBieSBkZWZhdWx0LiBUaGF0IG1lYW5zIHRoZQogCSAgSFogdGltZXIgaXMgYWxyZWFkeSBkaXNhYmxlZCBhdCBib290IHRpbWUuCiAKK2NvbmZpZyBLRVhFQworCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgorCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKKwkgIGJ1dCBpcyBpbmRlcGVuZGVudCBvZiBoYXJkd2FyZS9taWNyb2NvZGUgc3VwcG9ydC4KKwogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBjb25maWcgUENNQ0lBCiAJYm9vbAogCWRlZmF1bHQgbgpAQCAtNDY3LDcgKzQ3Nyw3IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zMzkwL0tjb25maWciCiAKLXNvdXJjZSAibmV0L0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2RlZmNvbmZpZyBiL2FyY2gvczM5MC9kZWZjb25maWcKaW5kZXggMDdmZDA0MS4uODk4NTBiMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvZGVmY29uZmlnCkBAIC0yNDUsNiArMjQ1LDcgQEAKICMKIENPTkZJR19TMzkwX1RBUEVfMzRYWD1tCiAjIENPTkZJR19WTUxPR1JEUiBpcyBub3Qgc2V0CisjIENPTkZJR19WTUNQIGlzIG5vdCBzZXQKICMgQ09ORklHX01PTlJFQURFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19EQ1NTX1NITSBpcyBub3Qgc2V0CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCmluZGV4IGI0MWUwZTEuLmFiMWU0OWQyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDE2IEBACiAKIG9iai0kKENPTkZJR19WSVJUX1RJTUVSKQkrPSB2dGltZS5vCiAKKyMgS2V4ZWMgcGFydAorUzM5MF9LRVhFQ19PQkpTIDo9IG1hY2hpbmVfa2V4ZWMubyBjcmFzaC5vCitpZmVxICgkKENPTkZJR19BUkNIX1MzOTBYKSx5KQorUzM5MF9LRVhFQ19PQkpTICs9IHJlbG9jYXRlX2tlcm5lbDY0Lm8KK2Vsc2UKK1MzOTBfS0VYRUNfT0JKUyArPSByZWxvY2F0ZV9rZXJuZWwubworZW5kaWYKK29iai0kKENPTkZJR19LRVhFQykgKz0gJChTMzkwX0tFWEVDX09CSlMpCisKKwogIwogIyBUaGlzIGlzIGp1c3QgdG8gZ2V0IHRoZSBkZXBlbmRlbmNpZXMuLi4KICMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3dyYXBwZXIuUwppbmRleCA3YTYwN2IxLi5iZjUyOTczIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF93cmFwcGVyLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfd3JhcHBlci5TCkBAIC0xNDQxLDMgKzE0NDEsMTEgQEAKIAlsZ2ZyCSVyNSwlcjUJCQkjIGludAogCWxsZ3RyCSVyNiwlcjYJCQkjIHN0cnVjdCBydXNhZ2VfZW11MzEgKgogCWpnCWNvbXBhdF9zeXNfd2FpdGlkCisKKwkuZ2xvYmwJY29tcGF0X3N5c19rZXhlY19sb2FkX3dyYXBwZXIKK2NvbXBhdF9zeXNfa2V4ZWNfbG9hZF93cmFwcGVyOgorCWxsZ2ZyCSVyMiwlcjIJCQkjIHVuc2lnbmVkIGxvbmcKKwlsbGdmcgklcjMsJXIzCQkJIyB1bnNpZ25lZCBsb25nCisJbGxndHIJJXI0LCVyNAkJCSMgc3RydWN0IGtleGVjX3NlZ21lbnQgKgorCWxsZ2ZyCSVyNSwlcjUJCQkjIHVuc2lnbmVkIGxvbmcKKwlqZwljb21wYXRfc3lzX2tleGVjX2xvYWQKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY3BjbWQuYyBiL2FyY2gvczM5MC9rZXJuZWwvY3BjbWQuYwppbmRleCA0NGRmOGRjLi4yMDA2MjE0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NwY21kLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jCkBAIC0yLDcgKzIsNyBAQAogICogIGFyY2gvczM5MC9rZXJuZWwvY3BjbWQuYwogICoKICAqICBTMzkwIHZlcnNpb24KLSAqICAgIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KKyAqICAgIENvcHlyaWdodCAoQykgMTk5OSwyMDA1IElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILCBJQk0gQ29ycG9yYXRpb24KICAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSwKICAqICAgICAgICAgICAgICAgQ2hyaXN0aWFuIEJvcm50cmFlZ2VyIChjYm9ybnRyYUBkZS5pYm0uY29tKSwKICAqLwpAQCAtMTgsOTMgKzE4LDExNCBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogc3RhdGljIERFRklORV9TUElOTE9DSyhjcGNtZF9sb2NrKTsKLXN0YXRpYyBjaGFyIGNwY21kX2J1ZlsyNDBdOworc3RhdGljIGNoYXIgY3BjbWRfYnVmWzI0MV07CiAKIC8qCiAgKiB0aGUgY2FsbGVyIG9mIF9fY3BjbWQgaGFzIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNwb25zZSBidWZmZXIgaXMgYmVsb3cgMiBHQgogICovCi12b2lkIF9fY3BjbWQoY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4pCitpbnQgIF9fY3BjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4sIGludCAqcmVzcG9uc2VfY29kZSkKIHsKIAljb25zdCBpbnQgbWFzayA9IDB4NDAwMDAwMDBMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHVybl9jb2RlOworCWludCByZXR1cm5fbGVuOwogCWludCBjbWRsZW47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3BjbWRfbG9jaywgZmxhZ3MpOwogCWNtZGxlbiA9IHN0cmxlbihjbWQpOwogCUJVR19PTihjbWRsZW4gPiAyNDApOwotCXN0cmNweShjcGNtZF9idWYsIGNtZCk7CisJbWVtY3B5KGNwY21kX2J1ZiwgY21kLCBjbWRsZW4pOwogCUFTQ0VCQyhjcGNtZF9idWYsIGNtZGxlbik7CiAKIAlpZiAocmVzcG9uc2UgIT0gTlVMTCAmJiBybGVuID4gMCkgewogCQltZW1zZXQocmVzcG9uc2UsIDAsIHJsZW4pOwogI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAotCQlhc20gdm9sYXRpbGUgKCJMUkEgICAyLDAoJTApXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMUiAgICA0LCUxXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPICAgICA0LCU0XG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMUkEgICAzLDAoJTIpXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMUiAgICA1LCUzXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubG9uZyAweDgzMjQwMDA4ICMgRGlhZ25vc2UgWCcwOCdcblx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKiBubyBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImEiIChjcGNtZF9idWYpLCAiZCIgKGNtZGxlbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIiAocmVzcG9uc2UpLCAiZCIgKHJsZW4pLCAibSIgKG1hc2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJjYyIsICIyIiwgIjMiLCAiNCIsICI1IiApOworCQlhc20gdm9sYXRpbGUgKAkibHJhCTIsMCglMilcbiIKKwkJCQkibHIJNCwlM1xuIgorCQkJCSJvCTQsJTZcbiIKKwkJCQkibHJhCTMsMCglNClcbiIKKwkJCQkibHIJNSwlNVxuIgorCQkJCSJkaWFnCTIsNCwweDhcbiIKKwkJCQkiYnJjCTgsIC5MaXRmaXRzXG4iCisJCQkJImFyCTUsICU1XG4iCisJCQkJIi5MaXRmaXRzOiBcbiIKKwkJCQkibHIJJTAsNFxuIgorCQkJCSJscgklMSw1XG4iCisJCQkJOiAiPWQiIChyZXR1cm5fY29kZSksICI9ZCIgKHJldHVybl9sZW4pCisJCQkJOiAiYSIgKGNwY21kX2J1ZiksICJkIiAoY21kbGVuKSwKKwkJCQkiYSIgKHJlc3BvbnNlKSwgImQiIChybGVuKSwgIm0iIChtYXNrKQorCQkJCTogImNjIiwgIjIiLCAiMyIsICI0IiwgIjUiICk7CiAjZWxzZSAvKiBDT05GSUdfQVJDSF9TMzkwWCAqLwotICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoIiAgIGxyYWcgIDIsMCglMClcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBsZ3IgICA0LCUxXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgbyAgICAgNCwlNFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGxyYWcgIDMsMCglMilcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBsZ3IgICA1LCUzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgc2FtMzFcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAubG9uZyAweDgzMjQwMDA4ICMgRGlhZ25vc2UgWCcwOCdcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzYW02NCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLyogbm8gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJhIiAoY3BjbWRfYnVmKSwgImQiIChjbWRsZW4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIgKHJlc3BvbnNlKSwgImQiIChybGVuKSwgIm0iIChtYXNrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiY2MiLCAiMiIsICIzIiwgIjQiLCAiNSIgKTsKKyAgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAkibHJhZwkyLDAoJTIpXG4iCisJCQkJImxncgk0LCUzXG4iCisJCQkJIm8JNCwlNlxuIgorCQkJCSJscmFnCTMsMCglNClcbiIKKwkJCQkibGdyCTUsJTVcbiIKKwkJCQkic2FtMzFcbiIKKwkJCQkiZGlhZwkyLDQsMHg4XG4iCisJCQkJInNhbTY0XG4iCisJCQkJImJyYwk4LCAuTGl0Zml0c1xuIgorCQkJCSJhZ3IJNSwgJTVcbiIKKwkJCQkiLkxpdGZpdHM6IFxuIgorCQkJCSJsZ3IJJTAsNFxuIgorCQkJCSJsZ3IJJTEsNVxuIgorCQkJCTogIj1kIiAocmV0dXJuX2NvZGUpLCAiPWQiIChyZXR1cm5fbGVuKQorCQkJCTogImEiIChjcGNtZF9idWYpLCAiZCIgKGNtZGxlbiksCisJCQkJImEiIChyZXNwb25zZSksICJkIiAocmxlbiksICJtIiAobWFzaykKKwkJCQk6ICJjYyIsICIyIiwgIjMiLCAiNCIsICI1IiApOwogI2VuZGlmIC8qIENPTkZJR19BUkNIX1MzOTBYICovCiAgICAgICAgICAgICAgICAgRUJDQVNDKHJlc3BvbnNlLCBybGVuKTsKICAgICAgICAgfSBlbHNlIHsKKwkJcmV0dXJuX2xlbiA9IDA7CiAjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCi0gICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiTFJBICAgMiwwKCUwKVxuXHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTFIgICAgMywlMVxuXHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxvbmcgMHg4MzIzMDAwOCAjIERpYWdub3NlIFgnMDgnXG5cdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLyogbm8gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJhIiAoY3BjbWRfYnVmKSwgImQiIChjbWRsZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIyIiwgIjMiICApOworICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoCSJscmEJMiwwKCUxKVxuIgorCQkJCSJscgkzLCUyXG4iCisJCQkJImRpYWcJMiwzLDB4OFxuIgorCQkJCSJscgklMCwzXG4iCisJCQkJOiAiPWQiIChyZXR1cm5fY29kZSkKKwkJCQk6ICJhIiAoY3BjbWRfYnVmKSwgImQiIChjbWRsZW4pCisJCQkJOiAiMiIsICIzIiAgKTsKICNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCi0gICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgiICAgbHJhZyAgMiwwKCUwKVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGxnciAgIDMsJTFcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzYW0zMVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIC5sb25nIDB4ODMyMzAwMDggIyBEaWFnbm9zZSBYJzA4J1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHNhbTY0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAvKiBubyBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImEiIChjcGNtZF9idWYpLCAiZCIgKGNtZGxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjIiLCAiMyIgICk7CisgICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgJImxyYWcJMiwwKCUxKVxuIgorCQkJCSJsZ3IJMywlMlxuIgorCQkJCSJzYW0zMVxuIgorCQkJCSJkaWFnCTIsMywweDhcbiIKKwkJCQkic2FtNjRcbiIKKwkJCQkibGdyCSUwLDNcbiIKKwkJCQk6ICI9ZCIgKHJldHVybl9jb2RlKQorCQkJCTogImEiIChjcGNtZF9idWYpLCAiZCIgKGNtZGxlbikKKwkJCQk6ICIyIiwgIjMiICk7CiAjZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KICAgICAgICAgfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwY21kX2xvY2ssIGZsYWdzKTsKKwlpZiAocmVzcG9uc2VfY29kZSAhPSBOVUxMKQorCQkqcmVzcG9uc2VfY29kZSA9IHJldHVybl9jb2RlOworCXJldHVybiByZXR1cm5fbGVuOwogfQogCiBFWFBPUlRfU1lNQk9MKF9fY3BjbWQpOwogCiAjaWZkZWYgQ09ORklHX0FSQ0hfUzM5MFgKLXZvaWQgY3BjbWQoY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4pCitpbnQgY3BjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4sIGludCAqcmVzcG9uc2VfY29kZSkKIHsKIAljaGFyICpsb3didWY7CisJaW50IGxlbjsKKwogCWlmICgocmxlbiA9PSAwKSB8fCAocmVzcG9uc2UgPT0gTlVMTCkKIAkgICAgfHwgISgodW5zaWduZWQgbG9uZylyZXNwb25zZSA+PiAzMSkpCi0JCV9fY3BjbWQoY21kLCByZXNwb25zZSwgcmxlbik7CisJCWxlbiA9IF9fY3BjbWQoY21kLCByZXNwb25zZSwgcmxlbiwgcmVzcG9uc2VfY29kZSk7CiAJZWxzZSB7CiAJCWxvd2J1ZiA9IGttYWxsb2MocmxlbiwgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCQlpZiAoIWxvd2J1ZikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCSJjcGNtZDogY291bGQgbm90IGFsbG9jYXRlIHJlc3BvbnNlIGJ1ZmZlclxuIik7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlfX2NwY21kKGNtZCwgbG93YnVmLCBybGVuKTsKKwkJbGVuID0gX19jcGNtZChjbWQsIGxvd2J1ZiwgcmxlbiwgcmVzcG9uc2VfY29kZSk7CiAJCW1lbWNweShyZXNwb25zZSwgbG93YnVmLCBybGVuKTsKIAkJa2ZyZWUobG93YnVmKTsKIAl9CisJcmV0dXJuIGxlbjsKIH0KIAogRVhQT1JUX1NZTUJPTChjcGNtZCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NyYXNoLmMgYi9hcmNoL3MzOTAva2VybmVsL2NyYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkMTY5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2guYwpAQCAtMCwwICsxLDE3IEBACisvKgorICogYXJjaC9zMzkwL2tlcm5lbC9jcmFzaC5jCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIEF1dGhvcihzKTogSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKworbm90ZV9idWZfdCBjcmFzaF9ub3Rlc1tOUl9DUFVTXTsKKwordm9pZCBtYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCmluZGV4IDkxZjhjZTUuLjk2MGJhNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZGVidWcuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKQEAgLTE5LDIyICsxOSwyNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogCiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAKICNkZWZpbmUgREVCVUdfUFJPTE9HX0VOVFJZIC0xCiAKKyNkZWZpbmUgQUxMX0FSRUFTIDAgLyogY29weSBhbGwgZGVidWcgYXJlYXMgKi8KKyNkZWZpbmUgTk9fQVJFQVMgIDEgLyogY29weSBubyBkZWJ1ZyBhcmVhcyAqLworCiAvKiB0eXBlZGVmcyAqLwogCiB0eXBlZGVmIHN0cnVjdCBmaWxlX3ByaXZhdGVfaW5mbyB7CiAJbG9mZl90IG9mZnNldDsJCQkvKiBvZmZzZXQgb2YgbGFzdCByZWFkIGluIGZpbGUgKi8KIAlpbnQgICAgYWN0X2FyZWE7ICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsYXN0IGZvcm1hdGVkIGFyZWEgKi8KKwlpbnQgICAgYWN0X3BhZ2U7ICAgICAgICAgICAgICAgIC8qIGFjdCBwYWdlIGluIGdpdmVuIGFyZWEgKi8KIAlpbnQgICAgYWN0X2VudHJ5OyAgICAgICAgICAgICAgIC8qIGxhc3QgZm9ybWF0ZWQgZW50cnkgKG9mZnNldCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBsYXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9ybWF0ZWQgYXJlYSkgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9ybWF0ZWQgcGFnZSkgKi8KIAlzaXplX3QgYWN0X2VudHJ5X29mZnNldDsgICAgICAgIC8qIHVwIHRvIHRoaXMgb2Zmc2V0IHdlIGNvcGllZCAqLwogCQkJCQkvKiBpbiBsYXN0IHJlYWQgdGhlIGxhc3QgZm9ybWF0ZWQgKi8KIAkJCQkJLyogZW50cnkgdG8gdXNlcmxhbmQgKi8KQEAgLTUxLDggKzU2LDggQEAKIAkgKiBUaGlzIGFzc3VtZXMgdGhhdCBhbGwgYXJncyBhcmUgY29udmVydGVkIGludG8gbG9uZ3MgCiAJICogb24gTC8zOTAgdGhpcyBpcyB0aGUgY2FzZSBmb3IgYWxsIHR5cGVzIG9mIHBhcmFtZXRlciAKIAkgKiBleGNlcHQgb2YgZmxvYXRzLCBhbmQgbG9uZyBsb25nICgzMiBiaXQpIAotICAgICAgICAgKgotICAgICAgICAgKi8KKwkgKgorCSAqLwogCWxvbmcgYXJnc1swXTsKIH0gZGVidWdfc3ByaW50Zl9lbnRyeV90OwogCkBAIC02MywzMiArNjgsMzggQEAKIAogc3RhdGljIGludCBkZWJ1Z19pbml0KHZvaWQpOwogc3RhdGljIHNzaXplX3QgZGVidWdfb3V0cHV0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkgICAgc2l6ZV90IHVzZXJfbGVuLCBsb2ZmX3QgKiBvZmZzZXQpOworCQkJc2l6ZV90IHVzZXJfbGVuLCBsb2ZmX3QgKiBvZmZzZXQpOwogc3RhdGljIHNzaXplX3QgZGVidWdfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCSAgIHNpemVfdCB1c2VyX2xlbiwgbG9mZl90ICogb2Zmc2V0KTsKKwkJCXNpemVfdCB1c2VyX2xlbiwgbG9mZl90ICogb2Zmc2V0KTsKIHN0YXRpYyBpbnQgZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IGRlYnVnX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBkZWJ1Z19pbmZvX3QqICBkZWJ1Z19pbmZvX2NyZWF0ZShjaGFyICpuYW1lLCBpbnQgcGFnZV9vcmRlciwgaW50IG5yX2FyZWFzLCBpbnQgYnVmX3NpemUpOworc3RhdGljIGRlYnVnX2luZm9fdCogIGRlYnVnX2luZm9fY3JlYXRlKGNoYXIgKm5hbWUsIGludCBwYWdlc19wZXJfYXJlYSwKKwkJCWludCBucl9hcmVhcywgaW50IGJ1Zl9zaXplKTsKIHN0YXRpYyB2b2lkIGRlYnVnX2luZm9fZ2V0KGRlYnVnX2luZm9fdCAqKTsKIHN0YXRpYyB2b2lkIGRlYnVnX2luZm9fcHV0KGRlYnVnX2luZm9fdCAqKTsKIHN0YXRpYyBpbnQgZGVidWdfcHJvbG9nX2xldmVsX2ZuKGRlYnVnX2luZm9fdCAqIGlkLAotCQkJCSBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywgY2hhciAqb3V0X2J1Zik7CisJCQlzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywgY2hhciAqb3V0X2J1Zik7CiBzdGF0aWMgaW50IGRlYnVnX2lucHV0X2xldmVsX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKLQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCXNpemVfdCB1c2VyX2J1Zl9zaXplLCBsb2ZmX3QgKiBvZmZzZXQpOworCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCXNpemVfdCB1c2VyX2J1Zl9zaXplLCBsb2ZmX3QgKiBvZmZzZXQpOworc3RhdGljIGludCBkZWJ1Z19wcm9sb2dfcGFnZXNfZm4oZGVidWdfaW5mb190ICogaWQsCisJCQlzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywgY2hhciAqb3V0X2J1Zik7CitzdGF0aWMgaW50IGRlYnVnX2lucHV0X3BhZ2VzX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKKwkJCXN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQlzaXplX3QgdXNlcl9idWZfc2l6ZSwgbG9mZl90ICogb2Zmc2V0KTsKIHN0YXRpYyBpbnQgZGVidWdfaW5wdXRfZmx1c2hfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdXNlcl9idWZfc2l6ZSwgbG9mZl90ICogb2Zmc2V0KTsKKwkJCXN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQlzaXplX3QgdXNlcl9idWZfc2l6ZSwgbG9mZl90ICogb2Zmc2V0KTsKIHN0YXRpYyBpbnQgZGVidWdfaGV4X2FzY2lpX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm91dF9idWYsIGNvbnN0IGNoYXIgKmluX2J1Zik7CisJCQljaGFyICpvdXRfYnVmLCBjb25zdCBjaGFyICppbl9idWYpOwogc3RhdGljIGludCBkZWJ1Z19yYXdfZm9ybWF0X2ZuKGRlYnVnX2luZm9fdCAqIGlkLAotCQkJCSBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywgY2hhciAqb3V0X2J1ZiwKLQkJCQkgY29uc3QgY2hhciAqaW5fYnVmKTsKKwkJCXN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LCBjaGFyICpvdXRfYnVmLAorCQkJY29uc3QgY2hhciAqaW5fYnVmKTsKIHN0YXRpYyBpbnQgZGVidWdfcmF3X2hlYWRlcl9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZWEsIGRlYnVnX2VudHJ5X3QgKiBlbnRyeSwgY2hhciAqb3V0X2J1Zik7CisJCQlpbnQgYXJlYSwgZGVidWdfZW50cnlfdCAqIGVudHJ5LCBjaGFyICpvdXRfYnVmKTsKIAogc3RhdGljIGludCBkZWJ1Z19zcHJpbnRmX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCi0JCQkJICAgY2hhciAqb3V0X2J1ZiwgZGVidWdfc3ByaW50Zl9lbnRyeV90ICpjdXJyX2V2ZW50KTsKKwkJCWNoYXIgKm91dF9idWYsIGRlYnVnX3NwcmludGZfZW50cnlfdCAqY3Vycl9ldmVudCk7CiAKIC8qIGdsb2JhbHMgKi8KIApAQCAtMTE5LDYgKzEzMCwxNSBAQAogCU5VTEwKIH07CiAKK3N0cnVjdCBkZWJ1Z192aWV3IGRlYnVnX3BhZ2VzX3ZpZXcgPSB7CisJInBhZ2VzIiwKKwkmZGVidWdfcHJvbG9nX3BhZ2VzX2ZuLAorCU5VTEwsCisJTlVMTCwKKwkmZGVidWdfaW5wdXRfcGFnZXNfZm4sCisJTlVMTAorfTsKKwogc3RydWN0IGRlYnVnX3ZpZXcgZGVidWdfZmx1c2hfdmlldyA9IHsKICAgICAgICAgImZsdXNoIiwKICAgICAgICAgTlVMTCwKQEAgLTE0OSw5OCArMTY5LDE2MSBAQAogc3RhdGljIGludCBpbml0aWFsaXplZDsKIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfZmlsZV9vcHMgPSB7Ci0JLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5vd25lciAgID0gVEhJU19NT0RVTEUsCiAJLnJlYWQgICAgPSBkZWJ1Z19vdXRwdXQsCi0JLndyaXRlICAgPSBkZWJ1Z19pbnB1dCwJCisJLndyaXRlICAgPSBkZWJ1Z19pbnB1dCwKIAkub3BlbiAgICA9IGRlYnVnX29wZW4sCiAJLnJlbGVhc2UgPSBkZWJ1Z19jbG9zZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlYnVnX3Byb2Nfcm9vdF9lbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kZWJ1Z2ZzX3Jvb3RfZW50cnk7CiAKIC8qIGZ1bmN0aW9ucyAqLwogCiAvKgorICogZGVidWdfYXJlYXNfYWxsb2MKKyAqIC0gRGVidWcgYXJlYXMgYXJlIGltcGxlbWVudGVkIGFzIGEgdGhyZWVkaW1lbnNvbmFsIGFycmF5OgorICogICBhcmVhc1thcmVhbnVtYmVyXVtwYWdlbnVtYmVyXVtwYWdlb2Zmc2V0XQorICovCisKK3N0YXRpYyBkZWJ1Z19lbnRyeV90KioqCitkZWJ1Z19hcmVhc19hbGxvYyhpbnQgcGFnZXNfcGVyX2FyZWEsIGludCBucl9hcmVhcykKK3sKKwlkZWJ1Z19lbnRyeV90KioqIGFyZWFzOworCWludCBpLGo7CisKKwlhcmVhcyA9IChkZWJ1Z19lbnRyeV90ICoqKikga21hbGxvYyhucl9hcmVhcyAqCisJCQkJCXNpemVvZihkZWJ1Z19lbnRyeV90KiopLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWFyZWFzKQorCQlnb3RvIGZhaWxfbWFsbG9jX2FyZWFzOworCWZvciAoaSA9IDA7IGkgPCBucl9hcmVhczsgaSsrKSB7CisJCWFyZWFzW2ldID0gKGRlYnVnX2VudHJ5X3QqKikga21hbGxvYyhwYWdlc19wZXJfYXJlYSAqCisJCQkJc2l6ZW9mKGRlYnVnX2VudHJ5X3QqKSxHRlBfS0VSTkVMKTsKKwkJaWYgKCFhcmVhc1tpXSkgeworCQkJZ290byBmYWlsX21hbGxvY19hcmVhczI7CisJCX0KKwkJZm9yKGogPSAwOyBqIDwgcGFnZXNfcGVyX2FyZWE7IGorKykgeworCQkJYXJlYXNbaV1bal0gPSAoZGVidWdfZW50cnlfdCopa21hbGxvYyhQQUdFX1NJWkUsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmKCFhcmVhc1tpXVtqXSkgeworCQkJCWZvcihqLS07IGogPj0wIDsgai0tKSB7CisJCQkJCWtmcmVlKGFyZWFzW2ldW2pdKTsKKwkJCQl9CisJCQkJa2ZyZWUoYXJlYXNbaV0pOworCQkJCWdvdG8gZmFpbF9tYWxsb2NfYXJlYXMyOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQoYXJlYXNbaV1bal0sMCxQQUdFX1NJWkUpOworCQkJfQorCQl9CisJfQorCXJldHVybiBhcmVhczsKKworZmFpbF9tYWxsb2NfYXJlYXMyOgorCWZvcihpLS07IGkgPj0gMDsgaS0tKXsKKwkJZm9yKGo9MDsgaiA8IHBhZ2VzX3Blcl9hcmVhO2orKyl7CisJCQlrZnJlZShhcmVhc1tpXVtqXSk7CisJCX0KKwkJa2ZyZWUoYXJlYXNbaV0pOworCX0KKwlrZnJlZShhcmVhcyk7CitmYWlsX21hbGxvY19hcmVhczoKKwlyZXR1cm4gTlVMTDsKKworfQorCisKKy8qCiAgKiBkZWJ1Z19pbmZvX2FsbG9jCiAgKiAtIGFsbG9jIG5ldyBkZWJ1Zy1pbmZvCiAgKi8KIAotc3RhdGljIGRlYnVnX2luZm9fdCogIGRlYnVnX2luZm9fYWxsb2MoY2hhciAqbmFtZSwgaW50IHBhZ2Vfb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5yX2FyZWFzLCBpbnQgYnVmX3NpemUpCitzdGF0aWMgZGVidWdfaW5mb190KgorZGVidWdfaW5mb19hbGxvYyhjaGFyICpuYW1lLCBpbnQgcGFnZXNfcGVyX2FyZWEsIGludCBucl9hcmVhcywgaW50IGJ1Zl9zaXplLAorCQlpbnQgbGV2ZWwsIGludCBtb2RlKQogewogCWRlYnVnX2luZm9fdCogcmM7Ci0JaW50IGk7CiAKIAkvKiBhbGxvYyBldmVyeXRoaW5nICovCiAKLQlyYyA9IChkZWJ1Z19pbmZvX3QqKSBrbWFsbG9jKHNpemVvZihkZWJ1Z19pbmZvX3QpLCBHRlBfQVRPTUlDKTsKKwlyYyA9IChkZWJ1Z19pbmZvX3QqKSBrbWFsbG9jKHNpemVvZihkZWJ1Z19pbmZvX3QpLCBHRlBfS0VSTkVMKTsKIAlpZighcmMpCiAJCWdvdG8gZmFpbF9tYWxsb2NfcmM7Ci0JcmMtPmFjdGl2ZV9lbnRyeSA9IChpbnQqKWttYWxsb2MobnJfYXJlYXMgKiBzaXplb2YoaW50KSwgR0ZQX0FUT01JQyk7Ci0JaWYoIXJjLT5hY3RpdmVfZW50cnkpCi0JCWdvdG8gZmFpbF9tYWxsb2NfYWN0aXZlX2VudHJ5OwotCW1lbXNldChyYy0+YWN0aXZlX2VudHJ5LCAwLCBucl9hcmVhcyAqIHNpemVvZihpbnQpKTsKLQlyYy0+YXJlYXMgPSAoZGVidWdfZW50cnlfdCAqKikga21hbGxvYyhucl9hcmVhcyAqCi0JCQkJCQlzaXplb2YoZGVidWdfZW50cnlfdCAqKSwKLQkJCQkJCUdGUF9BVE9NSUMpOwotCWlmICghcmMtPmFyZWFzKQotCQlnb3RvIGZhaWxfbWFsbG9jX2FyZWFzOwotCWZvciAoaSA9IDA7IGkgPCBucl9hcmVhczsgaSsrKSB7Ci0JCXJjLT5hcmVhc1tpXSA9IChkZWJ1Z19lbnRyeV90ICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywKLQkJCQkJCQkJcGFnZV9vcmRlcik7Ci0JCWlmICghcmMtPmFyZWFzW2ldKSB7Ci0JCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSByYy0+YXJlYXNbaV0sCi0JCQkJCQlwYWdlX29yZGVyKTsKLQkJCX0KLQkJCWdvdG8gZmFpbF9tYWxsb2NfYXJlYXMyOwotCQl9IGVsc2UgewotCQkJbWVtc2V0KHJjLT5hcmVhc1tpXSwgMCwgUEFHRV9TSVpFIDw8IHBhZ2Vfb3JkZXIpOwotCQl9CisJcmMtPmFjdGl2ZV9lbnRyaWVzID0gKGludCopa21hbGxvYyhucl9hcmVhcyAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZighcmMtPmFjdGl2ZV9lbnRyaWVzKQorCQlnb3RvIGZhaWxfbWFsbG9jX2FjdGl2ZV9lbnRyaWVzOworCW1lbXNldChyYy0+YWN0aXZlX2VudHJpZXMsIDAsIG5yX2FyZWFzICogc2l6ZW9mKGludCkpOworCXJjLT5hY3RpdmVfcGFnZXMgPSAoaW50KilrbWFsbG9jKG5yX2FyZWFzICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOworCWlmKCFyYy0+YWN0aXZlX3BhZ2VzKQorCQlnb3RvIGZhaWxfbWFsbG9jX2FjdGl2ZV9wYWdlczsKKwltZW1zZXQocmMtPmFjdGl2ZV9wYWdlcywgMCwgbnJfYXJlYXMgKiBzaXplb2YoaW50KSk7CisJaWYoKG1vZGUgPT0gQUxMX0FSRUFTKSAmJiAocGFnZXNfcGVyX2FyZWEgIT0gMCkpeworCQlyYy0+YXJlYXMgPSBkZWJ1Z19hcmVhc19hbGxvYyhwYWdlc19wZXJfYXJlYSwgbnJfYXJlYXMpOworCQlpZighcmMtPmFyZWFzKQorCQkJZ290byBmYWlsX21hbGxvY19hcmVhczsKKwl9IGVsc2UgeworCQlyYy0+YXJlYXMgPSBOVUxMOwogCX0KIAogCS8qIGluaXRpYWxpemUgbWVtYmVycyAqLwogCiAJc3Bpbl9sb2NrX2luaXQoJnJjLT5sb2NrKTsKLQlyYy0+cGFnZV9vcmRlciAgPSBwYWdlX29yZGVyOwotCXJjLT5ucl9hcmVhcyAgICA9IG5yX2FyZWFzOwotCXJjLT5hY3RpdmVfYXJlYSA9IDA7Ci0JcmMtPmxldmVsICAgICAgID0gREVCVUdfREVGQVVMVF9MRVZFTDsKLQlyYy0+YnVmX3NpemUgICAgPSBidWZfc2l6ZTsKLQlyYy0+ZW50cnlfc2l6ZSAgPSBzaXplb2YoZGVidWdfZW50cnlfdCkgKyBidWZfc2l6ZTsKLQlzdHJsY3B5KHJjLT5uYW1lLCBuYW1lLCBzaXplb2YocmMtPm5hbWUpKTsKKwlyYy0+cGFnZXNfcGVyX2FyZWEgPSBwYWdlc19wZXJfYXJlYTsKKwlyYy0+bnJfYXJlYXMgICAgICAgPSBucl9hcmVhczsKKwlyYy0+YWN0aXZlX2FyZWEgICAgPSAwOworCXJjLT5sZXZlbCAgICAgICAgICA9IGxldmVsOworCXJjLT5idWZfc2l6ZSAgICAgICA9IGJ1Zl9zaXplOworCXJjLT5lbnRyeV9zaXplICAgICA9IHNpemVvZihkZWJ1Z19lbnRyeV90KSArIGJ1Zl9zaXplOworCXN0cmxjcHkocmMtPm5hbWUsIG5hbWUsIHNpemVvZihyYy0+bmFtZSktMSk7CiAJbWVtc2V0KHJjLT52aWV3cywgMCwgREVCVUdfTUFYX1ZJRVdTICogc2l6ZW9mKHN0cnVjdCBkZWJ1Z192aWV3ICopKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCW1lbXNldChyYy0+cHJvY19lbnRyaWVzLCAwICxERUJVR19NQVhfVklFV1MgKgotCQlzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5KikpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJbWVtc2V0KHJjLT5kZWJ1Z2ZzX2VudHJpZXMsIDAgLERFQlVHX01BWF9WSUVXUyAqCisJCXNpemVvZihzdHJ1Y3QgZGVudHJ5KikpOwogCWF0b21pY19zZXQoJihyYy0+cmVmX2NvdW50KSwgMCk7CiAKIAlyZXR1cm4gcmM7CiAKLWZhaWxfbWFsbG9jX2FyZWFzMjoKLQlrZnJlZShyYy0+YXJlYXMpOwogZmFpbF9tYWxsb2NfYXJlYXM6Ci0Ja2ZyZWUocmMtPmFjdGl2ZV9lbnRyeSk7Ci1mYWlsX21hbGxvY19hY3RpdmVfZW50cnk6CisJa2ZyZWUocmMtPmFjdGl2ZV9wYWdlcyk7CitmYWlsX21hbGxvY19hY3RpdmVfcGFnZXM6CisJa2ZyZWUocmMtPmFjdGl2ZV9lbnRyaWVzKTsKK2ZhaWxfbWFsbG9jX2FjdGl2ZV9lbnRyaWVzOgogCWtmcmVlKHJjKTsKIGZhaWxfbWFsbG9jX3JjOgogCXJldHVybiBOVUxMOwogfQogCiAvKgorICogZGVidWdfYXJlYXNfZnJlZQorICogLSBmcmVlIGFsbCBkZWJ1ZyBhcmVhcworICovCisKK3N0YXRpYyB2b2lkCitkZWJ1Z19hcmVhc19mcmVlKGRlYnVnX2luZm9fdCogZGJfaW5mbykKK3sKKwlpbnQgaSxqOworCisJaWYoIWRiX2luZm8tPmFyZWFzKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IGRiX2luZm8tPm5yX2FyZWFzOyBpKyspIHsKKwkJZm9yKGogPSAwOyBqIDwgZGJfaW5mby0+cGFnZXNfcGVyX2FyZWE7IGorKykgeworCQkJa2ZyZWUoZGJfaW5mby0+YXJlYXNbaV1bal0pOworCQl9CisJCWtmcmVlKGRiX2luZm8tPmFyZWFzW2ldKTsKKwl9CisJa2ZyZWUoZGJfaW5mby0+YXJlYXMpOworCWRiX2luZm8tPmFyZWFzID0gTlVMTDsKK30KKworLyoKICAqIGRlYnVnX2luZm9fZnJlZQogICogLSBmcmVlIG1lbW9yeSBkZWJ1Zy1pbmZvCiAgKi8KIAotc3RhdGljIHZvaWQgZGVidWdfaW5mb19mcmVlKGRlYnVnX2luZm9fdCogZGJfaW5mbyl7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IGRiX2luZm8tPm5yX2FyZWFzOyBpKyspIHsKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgZGJfaW5mby0+YXJlYXNbaV0sCi0JCWRiX2luZm8tPnBhZ2Vfb3JkZXIpOwotCX0KLQlrZnJlZShkYl9pbmZvLT5hcmVhcyk7Ci0Ja2ZyZWUoZGJfaW5mby0+YWN0aXZlX2VudHJ5KTsKK3N0YXRpYyB2b2lkCitkZWJ1Z19pbmZvX2ZyZWUoZGVidWdfaW5mb190KiBkYl9pbmZvKXsKKwlkZWJ1Z19hcmVhc19mcmVlKGRiX2luZm8pOworCWtmcmVlKGRiX2luZm8tPmFjdGl2ZV9lbnRyaWVzKTsKKwlrZnJlZShkYl9pbmZvLT5hY3RpdmVfcGFnZXMpOwogCWtmcmVlKGRiX2luZm8pOwogfQogCkBAIC0yNDksMjEgKzMzMiwyMiBAQAogICogLSBjcmVhdGUgbmV3IGRlYnVnLWluZm8KICAqLwogCi1zdGF0aWMgZGVidWdfaW5mb190KiAgZGVidWdfaW5mb19jcmVhdGUoY2hhciAqbmFtZSwgaW50IHBhZ2Vfb3JkZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucl9hcmVhcywgaW50IGJ1Zl9zaXplKQorc3RhdGljIGRlYnVnX2luZm9fdCoKK2RlYnVnX2luZm9fY3JlYXRlKGNoYXIgKm5hbWUsIGludCBwYWdlc19wZXJfYXJlYSwgaW50IG5yX2FyZWFzLCBpbnQgYnVmX3NpemUpCiB7CiAJZGVidWdfaW5mb190KiByYzsKIAotICAgICAgICByYyA9IGRlYnVnX2luZm9fYWxsb2MobmFtZSwgcGFnZV9vcmRlciwgbnJfYXJlYXMsIGJ1Zl9zaXplKTsKKyAgICAgICAgcmMgPSBkZWJ1Z19pbmZvX2FsbG9jKG5hbWUsIHBhZ2VzX3Blcl9hcmVhLCBucl9hcmVhcywgYnVmX3NpemUsCisJCQkJREVCVUdfREVGQVVMVF9MRVZFTCwgQUxMX0FSRUFTKTsKICAgICAgICAgaWYoIXJjKSAKIAkJZ290byBvdXQ7CiAKLQotCS8qIGNyZWF0ZSBwcm9jIHJvb2QgZGlyZWN0b3J5ICovCi0gICAgICAgIHJjLT5wcm9jX3Jvb3RfZW50cnkgPSBwcm9jX21rZGlyKHJjLT5uYW1lLCBkZWJ1Z19wcm9jX3Jvb3RfZW50cnkpOworCS8qIGNyZWF0ZSByb290IGRpcmVjdG9yeSAqLworICAgICAgICByYy0+ZGVidWdmc19yb290X2VudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKHJjLT5uYW1lLAorCQkJCQlkZWJ1Z19kZWJ1Z2ZzX3Jvb3RfZW50cnkpOwogCiAJLyogYXBwZW5kIG5ldyBlbGVtZW50IHRvIGxpbmtlZCBsaXN0ICovCi0gICAgICAgIGlmIChkZWJ1Z19hcmVhX2ZpcnN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFkZWJ1Z19hcmVhX2ZpcnN0KSB7CiAgICAgICAgICAgICAgICAgLyogZmlyc3QgZWxlbWVudCBpbiBsaXN0ICovCiAgICAgICAgICAgICAgICAgZGVidWdfYXJlYV9maXJzdCA9IHJjOwogICAgICAgICAgICAgICAgIHJjLT5wcmV2ID0gTlVMTDsKQEAgLTI4NSwxNyArMzY5LDIxIEBACiAgKiAtIGNvcHkgZGVidWctaW5mbwogICovCiAKLXN0YXRpYyBkZWJ1Z19pbmZvX3QqIGRlYnVnX2luZm9fY29weShkZWJ1Z19pbmZvX3QqIGluKQorc3RhdGljIGRlYnVnX2luZm9fdCoKK2RlYnVnX2luZm9fY29weShkZWJ1Z19pbmZvX3QqIGluLCBpbnQgbW9kZSkKIHsKLSAgICAgICAgaW50IGk7CisgICAgICAgIGludCBpLGo7CiAgICAgICAgIGRlYnVnX2luZm9fdCogcmM7Ci0gICAgICAgIHJjID0gZGVidWdfaW5mb19hbGxvYyhpbi0+bmFtZSwgaW4tPnBhZ2Vfb3JkZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+bnJfYXJlYXMsIGluLT5idWZfc2l6ZSk7Ci0gICAgICAgIGlmKCFyYykKKworICAgICAgICByYyA9IGRlYnVnX2luZm9fYWxsb2MoaW4tPm5hbWUsIGluLT5wYWdlc19wZXJfYXJlYSwgaW4tPm5yX2FyZWFzLAorCQkJCWluLT5idWZfc2l6ZSwgaW4tPmxldmVsLCBtb2RlKTsKKyAgICAgICAgaWYoIXJjIHx8IChtb2RlID09IE5PX0FSRUFTKSkKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKIAogICAgICAgICBmb3IoaSA9IDA7IGkgPCBpbi0+bnJfYXJlYXM7IGkrKyl7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHJjLT5hcmVhc1tpXSxpbi0+YXJlYXNbaV0sIFBBR0VfU0laRSA8PCBpbi0+cGFnZV9vcmRlcik7CisJCWZvcihqID0gMDsgaiA8IGluLT5wYWdlc19wZXJfYXJlYTsgaisrKSB7CisJCQltZW1jcHkocmMtPmFyZWFzW2ldW2pdLCBpbi0+YXJlYXNbaV1bal0sUEFHRV9TSVpFKTsKKwkJfQogICAgICAgICB9CiBvdXQ6CiAgICAgICAgIHJldHVybiByYzsKQEAgLTMwNiw3ICszOTQsOCBAQAogICogLSBpbmNyZW1lbnRzIHJlZmVyZW5jZSBjb3VudCBmb3IgZGVidWctaW5mbwogICovCiAKLXN0YXRpYyB2b2lkIGRlYnVnX2luZm9fZ2V0KGRlYnVnX2luZm9fdCAqIGRiX2luZm8pCitzdGF0aWMgdm9pZAorZGVidWdfaW5mb19nZXQoZGVidWdfaW5mb190ICogZGJfaW5mbykKIHsKIAlpZiAoZGJfaW5mbykKIAkJYXRvbWljX2luYygmZGJfaW5mby0+cmVmX2NvdW50KTsKQEAgLTMxNywyOSArNDA2LDIwIEBACiAgKiAtIGRlY3JlYXNlcyByZWZlcmVuY2UgY291bnQgZm9yIGRlYnVnLWluZm8gYW5kIGZyZWVzIGl0IGlmIG5lY2Vzc2FyeQogICovCiAKLXN0YXRpYyB2b2lkIGRlYnVnX2luZm9fcHV0KGRlYnVnX2luZm9fdCAqZGJfaW5mbykKK3N0YXRpYyB2b2lkCitkZWJ1Z19pbmZvX3B1dChkZWJ1Z19pbmZvX3QgKmRiX2luZm8pCiB7CiAJaW50IGk7CiAKIAlpZiAoIWRiX2luZm8pCiAJCXJldHVybjsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGJfaW5mby0+cmVmX2NvdW50KSkgewotI2lmZGVmIERFQlVHCi0JCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiBmcmVlaW5nIGRlYnVnIGFyZWEgJXAgKCVzKVxuIiwKLQkJICAgICAgIGRiX2luZm8sIGRiX2luZm8tPm5hbWUpOwotI2VuZGlmCiAJCWZvciAoaSA9IDA7IGkgPCBERUJVR19NQVhfVklFV1M7IGkrKykgewotCQkJaWYgKGRiX2luZm8tPnZpZXdzW2ldID09IE5VTEwpCisJCQlpZiAoIWRiX2luZm8tPnZpZXdzW2ldKQogCQkJCWNvbnRpbnVlOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JCQlyZW1vdmVfcHJvY19lbnRyeShkYl9pbmZvLT5wcm9jX2VudHJpZXNbaV0tPm5hbWUsCi0JCQkJCSAgZGJfaW5mby0+cHJvY19yb290X2VudHJ5KTsKLSNlbmRpZgorCQkJZGVidWdmc19yZW1vdmUoZGJfaW5mby0+ZGVidWdmc19lbnRyaWVzW2ldKTsKIAkJfQotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JCXJlbW92ZV9wcm9jX2VudHJ5KGRiX2luZm8tPnByb2Nfcm9vdF9lbnRyeS0+bmFtZSwKLQkJCQkgIGRlYnVnX3Byb2Nfcm9vdF9lbnRyeSk7Ci0jZW5kaWYKKwkJZGVidWdmc19yZW1vdmUoZGJfaW5mby0+ZGVidWdmc19yb290X2VudHJ5KTsKIAkJaWYoZGJfaW5mbyA9PSBkZWJ1Z19hcmVhX2ZpcnN0KQogCQkJZGVidWdfYXJlYV9maXJzdCA9IGRiX2luZm8tPm5leHQ7CiAJCWlmKGRiX2luZm8gPT0gZGVidWdfYXJlYV9sYXN0KQpAQCAtMzU1LDkgKzQzNSw5IEBACiAgKiAtIGZvcm1hdCBvbmUgZGVidWcgZW50cnkgYW5kIHJldHVybiBzaXplIG9mIGZvcm1hdGVkIGRhdGEKICAqLwogCi1zdGF0aWMgaW50IGRlYnVnX2Zvcm1hdF9lbnRyeShmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm8pCitzdGF0aWMgaW50CitkZWJ1Z19mb3JtYXRfZW50cnkoZmlsZV9wcml2YXRlX2luZm9fdCAqcF9pbmZvKQogewotCWRlYnVnX2luZm9fdCAqaWRfb3JnICAgID0gcF9pbmZvLT5kZWJ1Z19pbmZvX29yZzsKIAlkZWJ1Z19pbmZvX3QgKmlkX3NuYXAgICA9IHBfaW5mby0+ZGVidWdfaW5mb19zbmFwOwogCXN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3ID0gcF9pbmZvLT52aWV3OwogCWRlYnVnX2VudHJ5X3QgKmFjdF9lbnRyeTsKQEAgLTM2NSwyMiArNDQ1LDIzIEBACiAJaWYocF9pbmZvLT5hY3RfZW50cnkgPT0gREVCVUdfUFJPTE9HX0VOVFJZKXsKIAkJLyogcHJpbnQgcHJvbG9nICovCiAgICAgICAgIAlpZiAodmlldy0+cHJvbG9nX3Byb2MpCi0gICAgICAgICAgICAgICAgCWxlbiArPSB2aWV3LT5wcm9sb2dfcHJvYyhpZF9vcmcsIHZpZXcscF9pbmZvLT50ZW1wX2J1Zik7CisgICAgICAgICAgICAgICAgCWxlbiArPSB2aWV3LT5wcm9sb2dfcHJvYyhpZF9zbmFwLHZpZXcscF9pbmZvLT50ZW1wX2J1Zik7CiAJCWdvdG8gb3V0OwogCX0KLQotCWFjdF9lbnRyeSA9IChkZWJ1Z19lbnRyeV90ICopICgoY2hhciopaWRfc25hcC0+YXJlYXNbcF9pbmZvLT5hY3RfYXJlYV0gKwotCQkJCQlwX2luZm8tPmFjdF9lbnRyeSk7CisJaWYgKCFpZF9zbmFwLT5hcmVhcykgLyogdGhpcyBpcyB0cnVlLCBpZiB3ZSBoYXZlIGEgcHJvbG9nIG9ubHkgdmlldyAqLworCQlnb3RvIG91dDsgICAgLyogb3IgaWYgJ3BhZ2VzX3Blcl9hcmVhJyBpcyAwICovCisJYWN0X2VudHJ5ID0gKGRlYnVnX2VudHJ5X3QgKikgKChjaGFyKilpZF9zbmFwLT5hcmVhc1twX2luZm8tPmFjdF9hcmVhXQorCQkJCVtwX2luZm8tPmFjdF9wYWdlXSArIHBfaW5mby0+YWN0X2VudHJ5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIAogCWlmIChhY3RfZW50cnktPmlkLnN0Y2sgPT0gMExMKQogCQkJZ290byBvdXQ7ICAvKiBlbXB0eSBlbnRyeSAqLwogCWlmICh2aWV3LT5oZWFkZXJfcHJvYykKLQkJbGVuICs9IHZpZXctPmhlYWRlcl9wcm9jKGlkX29yZywgdmlldywgcF9pbmZvLT5hY3RfYXJlYSwgCisJCWxlbiArPSB2aWV3LT5oZWFkZXJfcHJvYyhpZF9zbmFwLCB2aWV3LCBwX2luZm8tPmFjdF9hcmVhLAogCQkJCQlhY3RfZW50cnksIHBfaW5mby0+dGVtcF9idWYgKyBsZW4pOwogCWlmICh2aWV3LT5mb3JtYXRfcHJvYykKLQkJbGVuICs9IHZpZXctPmZvcm1hdF9wcm9jKGlkX29yZywgdmlldywgcF9pbmZvLT50ZW1wX2J1ZiArIGxlbiwKKwkJbGVuICs9IHZpZXctPmZvcm1hdF9wcm9jKGlkX3NuYXAsIHZpZXcsIHBfaW5mby0+dGVtcF9idWYgKyBsZW4sCiAJCQkJCQlERUJVR19EQVRBKGFjdF9lbnRyeSkpOwotICAgICAgb3V0Ogorb3V0OgogICAgICAgICByZXR1cm4gbGVuOwogfQogCkBAIC0zODksMjAgKzQ3MCwzMCBAQAogICogLSBnb3RvIG5leHQgZW50cnkgaW4gcF9pbmZvCiAgKi8KIAotZXh0ZXJuIGlubGluZSBpbnQgZGVidWdfbmV4dF9lbnRyeShmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm8pCitleHRlcm4gaW5saW5lIGludAorZGVidWdfbmV4dF9lbnRyeShmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm8pCiB7Ci0JZGVidWdfaW5mb190ICppZCA9IHBfaW5mby0+ZGVidWdfaW5mb19zbmFwOworCWRlYnVnX2luZm9fdCAqaWQ7CisKKwlpZCA9IHBfaW5mby0+ZGVidWdfaW5mb19zbmFwOwogCWlmKHBfaW5mby0+YWN0X2VudHJ5ID09IERFQlVHX1BST0xPR19FTlRSWSl7CiAJCXBfaW5mby0+YWN0X2VudHJ5ID0gMDsKKwkJcF9pbmZvLT5hY3RfcGFnZSAgPSAwOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKChwX2luZm8tPmFjdF9lbnRyeSArPSBpZC0+ZW50cnlfc2l6ZSkKLQkJPiAoKFBBR0VfU0laRSA8PCAoaWQtPnBhZ2Vfb3JkZXIpKSAKLQkJLSBpZC0+ZW50cnlfc2l6ZSkpewotCi0JCS8qIG5leHQgYXJlYSAqLworCWlmKCFpZC0+YXJlYXMpCisJCXJldHVybiAxOworCXBfaW5mby0+YWN0X2VudHJ5ICs9IGlkLT5lbnRyeV9zaXplOworCS8qIHN3aXRjaCB0byBuZXh0IHBhZ2UsIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgcGFnZSAgKi8KKwlpZiAocF9pbmZvLT5hY3RfZW50cnkgPiAoUEFHRV9TSVpFIC0gaWQtPmVudHJ5X3NpemUpKXsKKwkJLyogbmV4dCBwYWdlICovCiAJCXBfaW5mby0+YWN0X2VudHJ5ID0gMDsKLSAgICAgICAgCXBfaW5mby0+YWN0X2FyZWErKzsKKwkJcF9pbmZvLT5hY3RfcGFnZSArPSAxOworCQlpZigocF9pbmZvLT5hY3RfcGFnZSAlIGlkLT5wYWdlc19wZXJfYXJlYSkgPT0gMCkgeworCQkJLyogbmV4dCBhcmVhICovCisgICAgICAgIAkJcF9pbmZvLT5hY3RfYXJlYSsrOworCQkJcF9pbmZvLT5hY3RfcGFnZT0wOworCQl9CiAgICAgICAgIAlpZihwX2luZm8tPmFjdF9hcmVhID49IGlkLT5ucl9hcmVhcykKIAkJCXJldHVybiAxOwogCX0KQEAgLTQxNiwxMyArNTA3LDE0IEBACiAgKiAtIGNvcGllcyBmb3JtYXRlZCBkZWJ1ZyBlbnRyaWVzIHRvIHRoZSB1c2VyIGJ1ZmZlcgogICovCiAKLXN0YXRpYyBzc2l6ZV90IGRlYnVnX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwJCS8qIGZpbGUgZGVzY3JpcHRvciAqLwotCQkJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwJLyogdXNlciBidWZmZXIgKi8KLQkJCSAgICBzaXplX3QgIGxlbiwJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KLQkJCSAgICBsb2ZmX3QgKm9mZnNldCkJICAgICAgLyogb2Zmc2V0IGluIHRoZSBmaWxlICovCitzdGF0aWMgc3NpemVfdAorZGVidWdfb3V0cHV0KHN0cnVjdCBmaWxlICpmaWxlLAkJLyogZmlsZSBkZXNjcmlwdG9yICovCisJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwJLyogdXNlciBidWZmZXIgKi8KKwkgICAgc2l6ZV90ICBsZW4sCQkvKiBsZW5ndGggb2YgYnVmZmVyICovCisJICAgIGxvZmZfdCAqb2Zmc2V0KQkJLyogb2Zmc2V0IGluIHRoZSBmaWxlICovCiB7CiAJc2l6ZV90IGNvdW50ID0gMDsKLQlzaXplX3QgZW50cnlfb2Zmc2V0LCBzaXplID0gMDsKKwlzaXplX3QgZW50cnlfb2Zmc2V0OwogCWZpbGVfcHJpdmF0ZV9pbmZvX3QgKnBfaW5mbzsKIAogCXBfaW5mbyA9ICgoZmlsZV9wcml2YXRlX2luZm9fdCAqKSBmaWxlLT5wcml2YXRlX2RhdGEpOwpAQCAtNDMwLDI3ICs1MjIsMzMgQEAKIAkJcmV0dXJuIC1FUElQRTsKIAlpZihwX2luZm8tPmFjdF9hcmVhID49IHBfaW5mby0+ZGVidWdfaW5mb19zbmFwLT5ucl9hcmVhcykKIAkJcmV0dXJuIDA7Ci0KIAllbnRyeV9vZmZzZXQgPSBwX2luZm8tPmFjdF9lbnRyeV9vZmZzZXQ7Ci0KIAl3aGlsZShjb3VudCA8IGxlbil7Ci0JCXNpemUgPSBkZWJ1Z19mb3JtYXRfZW50cnkocF9pbmZvKTsKLQkJc2l6ZSA9IG1pbigobGVuIC0gY291bnQpLCAoc2l6ZSAtIGVudHJ5X29mZnNldCkpOworCQlpbnQgZm9ybWF0dGVkX2xpbmVfc2l6ZTsKKwkJaW50IGZvcm1hdHRlZF9saW5lX3Jlc2lkdWU7CisJCWludCB1c2VyX2J1Zl9yZXNpZHVlOworCQlzaXplX3QgY29weV9zaXplOwogCi0JCWlmKHNpemUpewotCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2J1ZiArIGNvdW50LCAKLQkJCQkJcF9pbmZvLT50ZW1wX2J1ZiArIGVudHJ5X29mZnNldCwgc2l6ZSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJZm9ybWF0dGVkX2xpbmVfc2l6ZSA9IGRlYnVnX2Zvcm1hdF9lbnRyeShwX2luZm8pOworCQlmb3JtYXR0ZWRfbGluZV9yZXNpZHVlID0gZm9ybWF0dGVkX2xpbmVfc2l6ZSAtIGVudHJ5X29mZnNldDsKKwkJdXNlcl9idWZfcmVzaWR1ZSA9IGxlbi1jb3VudDsKKwkJY29weV9zaXplID0gbWluKHVzZXJfYnVmX3Jlc2lkdWUsIGZvcm1hdHRlZF9saW5lX3Jlc2lkdWUpOworCQlpZihjb3B5X3NpemUpeworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2J1ZiArIGNvdW50LCBwX2luZm8tPnRlbXBfYnVmCisJCQkJCSsgZW50cnlfb2Zmc2V0LCBjb3B5X3NpemUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY291bnQgKz0gY29weV9zaXplOworCQkJZW50cnlfb2Zmc2V0ICs9IGNvcHlfc2l6ZTsKIAkJfQotCQljb3VudCArPSBzaXplOwotCQllbnRyeV9vZmZzZXQgPSAwOwotCQlpZihjb3VudCAhPSBsZW4pCi0JCQlpZihkZWJ1Z19uZXh0X2VudHJ5KHBfaW5mbykpIAorCQlpZihjb3B5X3NpemUgPT0gZm9ybWF0dGVkX2xpbmVfcmVzaWR1ZSl7CisJCQllbnRyeV9vZmZzZXQgPSAwOworCQkJaWYoZGVidWdfbmV4dF9lbnRyeShwX2luZm8pKQogCQkJCWdvdG8gb3V0OworCQl9CiAJfQogb3V0OgogCXBfaW5mby0+b2Zmc2V0ICAgICAgICAgICA9ICpvZmZzZXQgKyBjb3VudDsKLQlwX2luZm8tPmFjdF9lbnRyeV9vZmZzZXQgPSBzaXplOwkKKwlwX2luZm8tPmFjdF9lbnRyeV9vZmZzZXQgPSBlbnRyeV9vZmZzZXQ7CiAJKm9mZnNldCA9IHBfaW5mby0+b2Zmc2V0OwogCXJldHVybiBjb3VudDsKIH0KQEAgLTQ2MSw5ICs1NTksOSBAQAogICogLSBjYWxscyBpbnB1dCBmdW5jdGlvbiBvZiB2aWV3CiAgKi8KIAotc3RhdGljIHNzaXplX3QgZGVidWdfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBsZW5ndGgsCi0JCQkgICBsb2ZmX3QgKm9mZnNldCkKK3N0YXRpYyBzc2l6ZV90CitkZWJ1Z19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgbGVuZ3RoLAorCQlsb2ZmX3QgKm9mZnNldCkKIHsKIAlpbnQgcmMgPSAwOwogCWZpbGVfcHJpdmF0ZV9pbmZvX3QgKnBfaW5mbzsKQEAgLTQ4NywyNiArNTg1LDIzIEBACiAgKiAgIGhhbmRsZQogICovCiAKLXN0YXRpYyBpbnQgZGVidWdfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyBpbnQKK2RlYnVnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJaW50IGkgPSAwLCByYyA9IDA7CiAJZmlsZV9wcml2YXRlX2luZm9fdCAqcF9pbmZvOwogCWRlYnVnX2luZm9fdCAqZGVidWdfaW5mbywgKmRlYnVnX2luZm9fc25hcHNob3Q7CiAKLSNpZmRlZiBERUJVRwotCXByaW50aygiZGVidWdfb3BlblxuIik7Ci0jZW5kaWYKIAlkb3duKCZkZWJ1Z19sb2NrKTsKIAogCS8qIGZpbmQgZGVidWcgbG9nIGFuZCB2aWV3ICovCi0KIAlkZWJ1Z19pbmZvID0gZGVidWdfYXJlYV9maXJzdDsKIAl3aGlsZShkZWJ1Z19pbmZvICE9IE5VTEwpewogCQlmb3IgKGkgPSAwOyBpIDwgREVCVUdfTUFYX1ZJRVdTOyBpKyspIHsKLQkJCWlmIChkZWJ1Z19pbmZvLT52aWV3c1tpXSA9PSBOVUxMKQorCQkJaWYgKCFkZWJ1Z19pbmZvLT52aWV3c1tpXSkKIAkJCQljb250aW51ZTsKLQkJCWVsc2UgaWYgKGRlYnVnX2luZm8tPnByb2NfZW50cmllc1tpXSA9PQotCQkJCSBQREUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKSB7CisJCQllbHNlIGlmIChkZWJ1Z19pbmZvLT5kZWJ1Z2ZzX2VudHJpZXNbaV0gPT0KKwkJCQkgZmlsZS0+Zl9kZW50cnkpIHsKIAkJCQlnb3RvIGZvdW5kOwkvKiBmb3VuZCB2aWV3ICEgKi8KIAkJCX0KIAkJfQpAQCAtNTE2LDQxICs2MTEsNDIgQEAKIAlyYyA9IC1FSU5WQUw7CiAJZ290byBvdXQ7CiAKLSAgICAgIGZvdW5kOgorZm91bmQ6CiAKLQkvKiBtYWtlIHNuYXBzaG90IG9mIGN1cnJlbnQgZGVidWcgYXJlYXMgdG8gZ2V0IGl0IGNvbnNpc3RlbnQgKi8KKwkvKiBNYWtlIHNuYXBzaG90IG9mIGN1cnJlbnQgZGVidWcgYXJlYXMgdG8gZ2V0IGl0IGNvbnNpc3RlbnQuICAgICAqLworCS8qIFRvIGNvcHkgYWxsIHRoZSBhcmVhcyBpcyBvbmx5IG5lZWRlZCwgaWYgd2UgaGF2ZSBhIHZpZXcgd2hpY2ggICovCisJLyogZm9ybWF0cyB0aGUgZGVidWcgYXJlYXMuICovCiAKLQlkZWJ1Z19pbmZvX3NuYXBzaG90ID0gZGVidWdfaW5mb19jb3B5KGRlYnVnX2luZm8pOworCWlmKCFkZWJ1Z19pbmZvLT52aWV3c1tpXS0+Zm9ybWF0X3Byb2MgJiYKKwkJIWRlYnVnX2luZm8tPnZpZXdzW2ldLT5oZWFkZXJfcHJvYyl7CisJCWRlYnVnX2luZm9fc25hcHNob3QgPSBkZWJ1Z19pbmZvX2NvcHkoZGVidWdfaW5mbywgTk9fQVJFQVMpOworCX0gZWxzZSB7CisJCWRlYnVnX2luZm9fc25hcHNob3QgPSBkZWJ1Z19pbmZvX2NvcHkoZGVidWdfaW5mbywgQUxMX0FSRUFTKTsKKwl9CiAKIAlpZighZGVidWdfaW5mb19zbmFwc2hvdCl7Ci0jaWZkZWYgREVCVUcKLQkJcHJpbnRrKEtFUk5fRVJSICJkZWJ1Z19vcGVuOiBkZWJ1Z19pbmZvX2NvcHkgZmFpbGVkIChvdXQgb2YgbWVtKVxuIik7Ci0jZW5kaWYKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0KLQlpZiAoKGZpbGUtPnByaXZhdGVfZGF0YSA9Ci0JICAgICBrbWFsbG9jKHNpemVvZihmaWxlX3ByaXZhdGVfaW5mb190KSwgR0ZQX0FUT01JQykpID09IDApIHsKLSNpZmRlZiBERUJVRwotCQlwcmludGsoS0VSTl9FUlIgImRlYnVnX29wZW46IGttYWxsb2MgZmFpbGVkXG4iKTsKLSNlbmRpZgotCQlkZWJ1Z19pbmZvX2ZyZWUoZGVidWdfaW5mb19zbmFwc2hvdCk7CQorCXBfaW5mbyA9IChmaWxlX3ByaXZhdGVfaW5mb190ICopIGttYWxsb2Moc2l6ZW9mKGZpbGVfcHJpdmF0ZV9pbmZvX3QpLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYoIXBfaW5mbyl7CisJCWlmKGRlYnVnX2luZm9fc25hcHNob3QpCisJCQlkZWJ1Z19pbmZvX2ZyZWUoZGVidWdfaW5mb19zbmFwc2hvdCk7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCXBfaW5mbyA9IChmaWxlX3ByaXZhdGVfaW5mb190ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKIAlwX2luZm8tPm9mZnNldCA9IDA7CiAJcF9pbmZvLT5kZWJ1Z19pbmZvX3NuYXAgPSBkZWJ1Z19pbmZvX3NuYXBzaG90OwogCXBfaW5mby0+ZGVidWdfaW5mb19vcmcgID0gZGVidWdfaW5mbzsKIAlwX2luZm8tPnZpZXcgPSBkZWJ1Z19pbmZvLT52aWV3c1tpXTsKIAlwX2luZm8tPmFjdF9hcmVhID0gMDsKKwlwX2luZm8tPmFjdF9wYWdlID0gMDsKIAlwX2luZm8tPmFjdF9lbnRyeSA9IERFQlVHX1BST0xPR19FTlRSWTsKIAlwX2luZm8tPmFjdF9lbnRyeV9vZmZzZXQgPSAwOwotCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcF9pbmZvOwogCWRlYnVnX2luZm9fZ2V0KGRlYnVnX2luZm8pOwotCi0gICAgICBvdXQ6CitvdXQ6CiAJdXAoJmRlYnVnX2xvY2spOwogCXJldHVybiByYzsKIH0KQEAgLTU2MSwxNCArNjU3LDEzIEBACiAgKiAtIGRlbGV0ZXMgIHByaXZhdGVfZGF0YSBhcmVhIG9mIHRoZSBmaWxlIGhhbmRsZQogICovCiAKLXN0YXRpYyBpbnQgZGVidWdfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50CitkZWJ1Z19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlmaWxlX3ByaXZhdGVfaW5mb190ICpwX2luZm87Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoImRlYnVnX2Nsb3NlXG4iKTsKLSNlbmRpZgogCXBfaW5mbyA9IChmaWxlX3ByaXZhdGVfaW5mb190ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLQlkZWJ1Z19pbmZvX2ZyZWUocF9pbmZvLT5kZWJ1Z19pbmZvX3NuYXApOworCWlmKHBfaW5mby0+ZGVidWdfaW5mb19zbmFwKQorCQlkZWJ1Z19pbmZvX2ZyZWUocF9pbmZvLT5kZWJ1Z19pbmZvX3NuYXApOwogCWRlYnVnX2luZm9fcHV0KHBfaW5mby0+ZGVidWdfaW5mb19vcmcpOwogCWtmcmVlKGZpbGUtPnByaXZhdGVfZGF0YSk7CiAJcmV0dXJuIDA7CQkvKiBzdWNjZXNzICovCkBAIC01ODAsOCArNjc1LDggQEAKICAqIC0gcmV0dXJucyBoYW5kbGUgZm9yIGRlYnVnIGFyZWEKICAqLwogCi1kZWJ1Z19pbmZvX3QgKmRlYnVnX3JlZ2lzdGVyCi0gICAgKGNoYXIgKm5hbWUsIGludCBwYWdlX29yZGVyLCBpbnQgbnJfYXJlYXMsIGludCBidWZfc2l6ZSkgCitkZWJ1Z19pbmZvX3QqCitkZWJ1Z19yZWdpc3RlciAoY2hhciAqbmFtZSwgaW50IHBhZ2VzX3Blcl9hcmVhLCBpbnQgbnJfYXJlYXMsIGludCBidWZfc2l6ZSkKIHsKIAlkZWJ1Z19pbmZvX3QgKnJjID0gTlVMTDsKIApAQCAtNTkxLDE4ICs2ODYsMTQgQEAKIAogICAgICAgICAvKiBjcmVhdGUgbmV3IGRlYnVnX2luZm8gKi8KIAotCXJjID0gZGVidWdfaW5mb19jcmVhdGUobmFtZSwgcGFnZV9vcmRlciwgbnJfYXJlYXMsIGJ1Zl9zaXplKTsKKwlyYyA9IGRlYnVnX2luZm9fY3JlYXRlKG5hbWUsIHBhZ2VzX3Blcl9hcmVhLCBucl9hcmVhcywgYnVmX3NpemUpOwogCWlmKCFyYykgCiAJCWdvdG8gb3V0OwogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcocmMsICZkZWJ1Z19sZXZlbF92aWV3KTsKICAgICAgICAgZGVidWdfcmVnaXN0ZXJfdmlldyhyYywgJmRlYnVnX2ZsdXNoX3ZpZXcpOwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAgICAiZGVidWc6IHJlc2VydmVkICVkIGFyZWFzIG9mICVkIHBhZ2VzIGZvciBkZWJ1Z2dpbmcgJXNcbiIsCi0JICAgICAgIG5yX2FyZWFzLCAxIDw8IHBhZ2Vfb3JkZXIsIHJjLT5uYW1lKTsKLSNlbmRpZgotICAgICAgb3V0OgotICAgICAgICBpZiAocmMgPT0gTlVMTCl7CisJZGVidWdfcmVnaXN0ZXJfdmlldyhyYywgJmRlYnVnX3BhZ2VzX3ZpZXcpOworb3V0OgorICAgICAgICBpZiAoIXJjKXsKIAkJcHJpbnRrKEtFUk5fRVJSICJkZWJ1ZzogZGVidWdfcmVnaXN0ZXIgZmFpbGVkIGZvciAlc1xuIixuYW1lKTsKICAgICAgICAgfQogCXVwKCZkZWJ1Z19sb2NrKTsKQEAgLTYxNCwyNyArNzA1LDY1IEBACiAgKiAtIGdpdmUgYmFjayBkZWJ1ZyBhcmVhCiAgKi8KIAotdm9pZCBkZWJ1Z191bnJlZ2lzdGVyKGRlYnVnX2luZm9fdCAqIGlkKQordm9pZAorZGVidWdfdW5yZWdpc3RlcihkZWJ1Z19pbmZvX3QgKiBpZCkKIHsKIAlpZiAoIWlkKQogCQlnb3RvIG91dDsKIAlkb3duKCZkZWJ1Z19sb2NrKTsKLSNpZmRlZiBERUJVRwotCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiB1bnJlZ2lzdGVyaW5nICVzXG4iLCBpZC0+bmFtZSk7Ci0jZW5kaWYKIAlkZWJ1Z19pbmZvX3B1dChpZCk7CiAJdXAoJmRlYnVnX2xvY2spOwogCi0gICAgICBvdXQ6CitvdXQ6CiAJcmV0dXJuOwogfQogCiAvKgorICogZGVidWdfc2V0X3NpemU6CisgKiAtIHNldCBhcmVhIHNpemUgKG51bWJlciBvZiBwYWdlcykgYW5kIG51bWJlciBvZiBhcmVhcworICovCitzdGF0aWMgaW50CitkZWJ1Z19zZXRfc2l6ZShkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgbnJfYXJlYXMsIGludCBwYWdlc19wZXJfYXJlYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWRlYnVnX2VudHJ5X3QgKioqIG5ld19hcmVhczsKKwlpbnQgcmM9MDsKKworCWlmKCFpZCB8fCAobnJfYXJlYXMgPD0gMCkgfHwgKHBhZ2VzX3Blcl9hcmVhIDwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmKHBhZ2VzX3Blcl9hcmVhID4gMCl7CisJCW5ld19hcmVhcyA9IGRlYnVnX2FyZWFzX2FsbG9jKHBhZ2VzX3Blcl9hcmVhLCBucl9hcmVhcyk7CisJCWlmKCFuZXdfYXJlYXMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImRlYnVnOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5ICJcCisJCQkJCSAiZm9yIHBhZ2VudW1iZXI6ICVpXG4iLHBhZ2VzX3Blcl9hcmVhKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJbmV3X2FyZWFzID0gTlVMTDsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLGZsYWdzKTsKKwlkZWJ1Z19hcmVhc19mcmVlKGlkKTsKKwlpZC0+YXJlYXMgPSBuZXdfYXJlYXM7CisJaWQtPm5yX2FyZWFzID0gbnJfYXJlYXM7CisJaWQtPnBhZ2VzX3Blcl9hcmVhID0gcGFnZXNfcGVyX2FyZWE7CisJaWQtPmFjdGl2ZV9hcmVhID0gMDsKKwltZW1zZXQoaWQtPmFjdGl2ZV9lbnRyaWVzLDAsc2l6ZW9mKGludCkqaWQtPm5yX2FyZWFzKTsKKwltZW1zZXQoaWQtPmFjdGl2ZV9wYWdlcywgMCwgc2l6ZW9mKGludCkqaWQtPm5yX2FyZWFzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZC0+bG9jayxmbGFncyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZGVidWc6ICVzOiBzZXQgbmV3IHNpemUgKCVpIHBhZ2VzKVxuIlwKKwkJCSAsaWQtPm5hbWUsIHBhZ2VzX3Blcl9hcmVhKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCiAgKiBkZWJ1Z19zZXRfbGV2ZWw6CiAgKiAtIHNldCBhY3R1YWwgZGVidWcgbGV2ZWwKICAqLwogCi12b2lkIGRlYnVnX3NldF9sZXZlbChkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgbmV3X2xldmVsKQordm9pZAorZGVidWdfc2V0X2xldmVsKGRlYnVnX2luZm9fdCogaWQsIGludCBuZXdfbGV2ZWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpZighaWQpCkBAIC02NDksMTAgKzc3OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+bmFtZSwgbmV3X2xldmVsLCAwLCBERUJVR19NQVhfTEVWRUwpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlkLT5sZXZlbCA9IG5ld19sZXZlbDsKLSNpZmRlZiBERUJVRwotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gCi0JCQkiZGVidWc6ICVzOiBuZXcgbGV2ZWwgJWlcbiIsaWQtPm5hbWUsaWQtPmxldmVsKTsKLSNlbmRpZgogICAgICAgICB9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWQtPmxvY2ssZmxhZ3MpOwogfQpAQCAtNjYzLDExICs3ODgsMTYgQEAKICAqIC0gc2V0IGFjdGl2ZSBlbnRyeSB0byBuZXh0IGluIHRoZSByaW5nIGJ1ZmZlcgogICovCiAKLWV4dGVybiBpbmxpbmUgdm9pZCBwcm9jZWVkX2FjdGl2ZV9lbnRyeShkZWJ1Z19pbmZvX3QgKiBpZCkKK2V4dGVybiBpbmxpbmUgdm9pZAorcHJvY2VlZF9hY3RpdmVfZW50cnkoZGVidWdfaW5mb190ICogaWQpCiB7Ci0JaWYgKChpZC0+YWN0aXZlX2VudHJ5W2lkLT5hY3RpdmVfYXJlYV0gKz0gaWQtPmVudHJ5X3NpemUpCi0JICAgID4gKChQQUdFX1NJWkUgPDwgKGlkLT5wYWdlX29yZGVyKSkgLSBpZC0+ZW50cnlfc2l6ZSkpCi0JCWlkLT5hY3RpdmVfZW50cnlbaWQtPmFjdGl2ZV9hcmVhXSA9IDA7CisJaWYgKChpZC0+YWN0aXZlX2VudHJpZXNbaWQtPmFjdGl2ZV9hcmVhXSArPSBpZC0+ZW50cnlfc2l6ZSkKKwkgICAgPiAoUEFHRV9TSVpFIC0gaWQtPmVudHJ5X3NpemUpKXsKKwkJaWQtPmFjdGl2ZV9lbnRyaWVzW2lkLT5hY3RpdmVfYXJlYV0gPSAwOworCQlpZC0+YWN0aXZlX3BhZ2VzW2lkLT5hY3RpdmVfYXJlYV0gPQorCQkJKGlkLT5hY3RpdmVfcGFnZXNbaWQtPmFjdGl2ZV9hcmVhXSArIDEpICUKKwkJCWlkLT5wYWdlc19wZXJfYXJlYTsKKwl9CiB9CiAKIC8qCkBAIC02NzUsNyArODA1LDggQEAKICAqIC0gc2V0IGFjdGl2ZSBhcmVhIHRvIG5leHQgaW4gdGhlIHJpbmcgYnVmZmVyCiAgKi8KIAotZXh0ZXJuIGlubGluZSB2b2lkIHByb2NlZWRfYWN0aXZlX2FyZWEoZGVidWdfaW5mb190ICogaWQpCitleHRlcm4gaW5saW5lIHZvaWQKK3Byb2NlZWRfYWN0aXZlX2FyZWEoZGVidWdfaW5mb190ICogaWQpCiB7CiAJaWQtPmFjdGl2ZV9hcmVhKys7CiAJaWQtPmFjdGl2ZV9hcmVhID0gaWQtPmFjdGl2ZV9hcmVhICUgaWQtPm5yX2FyZWFzOwpAQCAtNjg1LDEwICs4MTYsMTIgQEAKICAqIGdldF9hY3RpdmVfZW50cnk6CiAgKi8KIAotZXh0ZXJuIGlubGluZSBkZWJ1Z19lbnRyeV90ICpnZXRfYWN0aXZlX2VudHJ5KGRlYnVnX2luZm9fdCAqIGlkKQorZXh0ZXJuIGlubGluZSBkZWJ1Z19lbnRyeV90KgorZ2V0X2FjdGl2ZV9lbnRyeShkZWJ1Z19pbmZvX3QgKiBpZCkKIHsKLQlyZXR1cm4gKGRlYnVnX2VudHJ5X3QgKikgKChjaGFyICopIGlkLT5hcmVhc1tpZC0+YWN0aXZlX2FyZWFdICsKLQkJCQkgIGlkLT5hY3RpdmVfZW50cnlbaWQtPmFjdGl2ZV9hcmVhXSk7CisJcmV0dXJuIChkZWJ1Z19lbnRyeV90ICopICgoKGNoYXIgKikgaWQtPmFyZWFzW2lkLT5hY3RpdmVfYXJlYV0KKwkJCQkJW2lkLT5hY3RpdmVfcGFnZXNbaWQtPmFjdGl2ZV9hcmVhXV0pICsKKwkJCQkJaWQtPmFjdGl2ZV9lbnRyaWVzW2lkLT5hY3RpdmVfYXJlYV0pOwogfQogCiAvKgpAQCAtNjk2LDggKzgyOSw5IEBACiAgKiAtIHNldCB0aW1lc3RhbXAsIGNhbGxlciBhZGRyZXNzLCBjcHUgbnVtYmVyIGV0Yy4KICAqLwogCi1leHRlcm4gaW5saW5lIHZvaWQgZGVidWdfZmluaXNoX2VudHJ5KGRlYnVnX2luZm9fdCAqIGlkLCBkZWJ1Z19lbnRyeV90KiBhY3RpdmUsCi0JCWludCBsZXZlbCwgaW50IGV4Y2VwdGlvbikKK2V4dGVybiBpbmxpbmUgdm9pZAorZGVidWdfZmluaXNoX2VudHJ5KGRlYnVnX2luZm9fdCAqIGlkLCBkZWJ1Z19lbnRyeV90KiBhY3RpdmUsIGludCBsZXZlbCwKKwkJCWludCBleGNlcHRpb24pCiB7CiAJU1RDSyhhY3RpdmUtPmlkLnN0Y2spOwogCWFjdGl2ZS0+aWQuZmllbGRzLmNwdWlkID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpAQCAtNzIxLDcgKzg1NSw4IEBACiAgKiBhbHdheXMgYWxsb3cgcmVhZCwgYWxsb3cgd3JpdGUgb25seSBpZiBkZWJ1Z19zdG9wcGFibGUgaXMgc2V0IG9yCiAgKiBpZiBkZWJ1Z19hY3RpdmUgaXMgYWxyZWFkeSBvZmYKICAqLwotc3RhdGljIGludCBzMzkwZGJmX3Byb2NhY3RpdmUoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKK3N0YXRpYyBpbnQKK3MzOTBkYmZfcHJvY2FjdGl2ZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaWYgKCF3cml0ZSB8fCBkZWJ1Z19zdG9wcGFibGUgfHwgIWRlYnVnX2FjdGl2ZSkKQEAgLTc2Niw3ICs5MDEsOCBAQAogCiBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqczM5MGRiZl9zeXNjdGxfaGVhZGVyOwogCi12b2lkIGRlYnVnX3N0b3BfYWxsKHZvaWQpCit2b2lkCitkZWJ1Z19zdG9wX2FsbCh2b2lkKQogewogCWlmIChkZWJ1Z19zdG9wcGFibGUpCiAJCWRlYnVnX2FjdGl2ZSA9IDA7CkBAIC03NzgsMTMgKzkxNCwxMyBAQAogICogLSB3cml0ZSBkZWJ1ZyBlbnRyeSB3aXRoIGdpdmVuIHNpemUKICAqLwogCi1kZWJ1Z19lbnRyeV90ICpkZWJ1Z19ldmVudF9jb21tb24oZGVidWdfaW5mb190ICogaWQsIGludCBsZXZlbCwgY29uc3Qgdm9pZCAqYnVmLAotCQkJICAgICAgICAgIGludCBsZW4pCitkZWJ1Z19lbnRyeV90KgorZGVidWdfZXZlbnRfY29tbW9uKGRlYnVnX2luZm9fdCAqIGlkLCBpbnQgbGV2ZWwsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWRlYnVnX2VudHJ5X3QgKmFjdGl2ZTsKIAotCWlmICghZGVidWdfYWN0aXZlKQorCWlmICghZGVidWdfYWN0aXZlIHx8ICFpZC0+YXJlYXMpCiAJCXJldHVybiBOVUxMOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpZC0+bG9jaywgZmxhZ3MpOwogCWFjdGl2ZSA9IGdldF9hY3RpdmVfZW50cnkoaWQpOwpAQCAtODAxLDEzICs5MzcsMTMgQEAKICAqIC0gd3JpdGUgZGVidWcgZW50cnkgd2l0aCBnaXZlbiBzaXplIGFuZCBzd2l0Y2ggdG8gbmV4dCBkZWJ1ZyBhcmVhCiAgKi8KIAotZGVidWdfZW50cnlfdCAqZGVidWdfZXhjZXB0aW9uX2NvbW1vbihkZWJ1Z19pbmZvX3QgKiBpZCwgaW50IGxldmVsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQorZGVidWdfZW50cnlfdAorKmRlYnVnX2V4Y2VwdGlvbl9jb21tb24oZGVidWdfaW5mb190ICogaWQsIGludCBsZXZlbCwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZGVidWdfZW50cnlfdCAqYWN0aXZlOwogCi0JaWYgKCFkZWJ1Z19hY3RpdmUpCisJaWYgKCFkZWJ1Z19hY3RpdmUgfHwgIWlkLT5hcmVhcykKIAkJcmV0dXJuIE5VTEw7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLCBmbGFncyk7CiAJYWN0aXZlID0gZ2V0X2FjdGl2ZV9lbnRyeShpZCk7CkBAIC04MjMsNyArOTU5LDggQEAKICAqIGNvdW50cyBhcmd1bWVudHMgaW4gZm9ybWF0IHN0cmluZyBmb3Igc3ByaW50ZiB2aWV3CiAgKi8KIAotZXh0ZXJuIGlubGluZSBpbnQgZGVidWdfY291bnRfbnVtYXJncyhjaGFyICpzdHJpbmcpCitleHRlcm4gaW5saW5lIGludAorZGVidWdfY291bnRfbnVtYXJncyhjaGFyICpzdHJpbmcpCiB7CiAJaW50IG51bWFyZ3M9MDsKIApAQCAtODM4LDggKzk3NSw4IEBACiAgKiBkZWJ1Z19zcHJpbnRmX2V2ZW50OgogICovCiAKLWRlYnVnX2VudHJ5X3QgKmRlYnVnX3NwcmludGZfZXZlbnQoZGVidWdfaW5mb190KiBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLGNoYXIgKnN0cmluZywuLi4pCitkZWJ1Z19lbnRyeV90KgorZGVidWdfc3ByaW50Zl9ldmVudChkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgbGV2ZWwsY2hhciAqc3RyaW5nLC4uLikKIHsKIAl2YV9saXN0ICAgYXA7CiAJaW50IG51bWFyZ3MsaWR4OwpAQCAtODQ5LDcgKzk4Niw3IEBACiAKIAlpZigoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRlYnVnX2FjdGl2ZSkKKwlpZiAoIWRlYnVnX2FjdGl2ZSB8fCAhaWQtPmFyZWFzKQogCQlyZXR1cm4gTlVMTDsKIAludW1hcmdzPWRlYnVnX2NvdW50X251bWFyZ3Moc3RyaW5nKTsKIApAQCAtODcxLDggKzEwMDgsOCBAQAogICogZGVidWdfc3ByaW50Zl9leGNlcHRpb246CiAgKi8KIAotZGVidWdfZW50cnlfdCAqZGVidWdfc3ByaW50Zl9leGNlcHRpb24oZGVidWdfaW5mb190KiBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCxjaGFyICpzdHJpbmcsLi4uKQorZGVidWdfZW50cnlfdCoKK2RlYnVnX3NwcmludGZfZXhjZXB0aW9uKGRlYnVnX2luZm9fdCogaWQsIGludCBsZXZlbCxjaGFyICpzdHJpbmcsLi4uKQogewogCXZhX2xpc3QgICBhcDsKIAlpbnQgbnVtYXJncyxpZHg7CkBAIC04ODIsNyArMTAxOSw3IEBACiAKIAlpZigoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpKQogCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRlYnVnX2FjdGl2ZSkKKwlpZiAoIWRlYnVnX2FjdGl2ZSB8fCAhaWQtPmFyZWFzKQogCQlyZXR1cm4gTlVMTDsKIAogCW51bWFyZ3M9ZGVidWdfY291bnRfbnVtYXJncyhzdHJpbmcpOwpAQCAtOTA2LDE1ICsxMDQzLDE0IEBACiAgKiAtIGlzIGNhbGxlZCBleGFjdGx5IG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgZGVidWcgZmVhdHVyZQogICovCiAKLXN0YXRpYyBpbnQgX19pbml0IGRlYnVnX2luaXQodm9pZCkKK3N0YXRpYyBpbnQKK19faW5pdCBkZWJ1Z19pbml0KHZvaWQpCiB7CiAJaW50IHJjID0gMDsKIAogCXMzOTBkYmZfc3lzY3RsX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShzMzkwZGJmX2Rpcl90YWJsZSwgMSk7CiAJZG93bigmZGVidWdfbG9jayk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlkZWJ1Z19wcm9jX3Jvb3RfZW50cnkgPSBwcm9jX21rZGlyKERFQlVHX0RJUl9ST09ULCBOVUxMKTsKLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCWRlYnVnX2RlYnVnZnNfcm9vdF9lbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihERUJVR19ESVJfUk9PVCxOVUxMKTsKIAlwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogSW5pdGlhbGl6YXRpb24gY29tcGxldGVcbiIpOwogCWluaXRpYWxpemVkID0gMTsKIAl1cCgmZGVidWdfbG9jayk7CkBAIC05MjYsMTMgKzEwNjIsMTQgQEAKICAqIGRlYnVnX3JlZ2lzdGVyX3ZpZXc6CiAgKi8KIAotaW50IGRlYnVnX3JlZ2lzdGVyX3ZpZXcoZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3KQoraW50CitkZWJ1Z19yZWdpc3Rlcl92aWV3KGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldykKIHsKIAlpbnQgcmMgPSAwOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJbW9kZV90IG1vZGUgPSBTX0lGUkVHOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOworCXN0cnVjdCBkZW50cnkgKnBkZTsKIAogCWlmICghaWQpCiAJCWdvdG8gb3V0OwpAQCAtOTQwLDE2ICsxMDc3LDE3IEBACiAJCW1vZGUgfD0gU19JUlVTUjsKIAlpZiAodmlldy0+aW5wdXRfcHJvYykKIAkJbW9kZSB8PSBTX0lXVVNSOwotCXBkZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KHZpZXctPm5hbWUsIG1vZGUsIGlkLT5wcm9jX3Jvb3RfZW50cnkpOworCXBkZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUodmlldy0+bmFtZSwgbW9kZSwgaWQtPmRlYnVnZnNfcm9vdF9lbnRyeSwKKwkJCQlOVUxMLCAmZGVidWdfZmlsZV9vcHMpOwogCWlmICghcGRlKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGVidWc6IGNyZWF0ZV9wcm9jX2VudHJ5KCkgZmFpbGVkISBDYW5ub3QgcmVnaXN0ZXIgdmlldyAlcy8lc1xuIiwgaWQtPm5hbWUsdmlldy0+bmFtZSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImRlYnVnOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCkgZmFpbGVkISJcCisJCQkiIENhbm5vdCByZWdpc3RlciB2aWV3ICVzLyVzXG4iLCBpZC0+bmFtZSx2aWV3LT5uYW1lKTsKIAkJcmMgPSAtMTsKIAkJZ290byBvdXQ7CiAJfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IERFQlVHX01BWF9WSUVXUzsgaSsrKSB7Ci0JCWlmIChpZC0+dmlld3NbaV0gPT0gTlVMTCkKKwkJaWYgKCFpZC0+dmlld3NbaV0pCiAJCQlicmVhazsKIAl9CiAJaWYgKGkgPT0gREVCVUdfTUFYX1ZJRVdTKSB7CkBAIC05NTcsMTYgKzEwOTUsMTQgQEAKIAkJCWlkLT5uYW1lLHZpZXctPm5hbWUpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJImRlYnVnOiBtYXhpbXVtIG51bWJlciBvZiB2aWV3cyByZWFjaGVkICglaSkhXG4iLCBpKTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkocGRlLT5uYW1lLCBpZC0+cHJvY19yb290X2VudHJ5KTsKKwkJZGVidWdmc19yZW1vdmUocGRlKTsKIAkJcmMgPSAtMTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWQtPnZpZXdzW2ldID0gdmlldzsKLQkJcGRlLT5wcm9jX2ZvcHMgPSAmZGVidWdfZmlsZV9vcHM7Ci0JCWlkLT5wcm9jX2VudHJpZXNbaV0gPSBwZGU7CisJCWlkLT5kZWJ1Z2ZzX2VudHJpZXNbaV0gPSBwZGU7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkLT5sb2NrLCBmbGFncyk7Ci0gICAgICBvdXQ6CitvdXQ6CiAJcmV0dXJuIHJjOwogfQogCkBAIC05NzQsNyArMTExMCw4IEBACiAgKiBkZWJ1Z191bnJlZ2lzdGVyX3ZpZXc6CiAgKi8KIAotaW50IGRlYnVnX3VucmVnaXN0ZXJfdmlldyhkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcpCitpbnQKK2RlYnVnX3VucmVnaXN0ZXJfdmlldyhkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcpCiB7CiAJaW50IHJjID0gMDsKIAlpbnQgaTsKQEAgLTk5MCwxNSArMTEyNyw0NiBAQAogCWlmIChpID09IERFQlVHX01BWF9WSUVXUykKIAkJcmMgPSAtMTsKIAllbHNlIHsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCQlyZW1vdmVfcHJvY19lbnRyeShpZC0+cHJvY19lbnRyaWVzW2ldLT5uYW1lLAotCQkJCSAgaWQtPnByb2Nfcm9vdF9lbnRyeSk7Ci0jZW5kaWYKKwkJZGVidWdmc19yZW1vdmUoaWQtPmRlYnVnZnNfZW50cmllc1tpXSk7CiAJCWlkLT52aWV3c1tpXSA9IE5VTEw7CiAJCXJjID0gMDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWQtPmxvY2ssIGZsYWdzKTsKLSAgICAgIG91dDoKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitkZWJ1Z19nZXRfdXNlcl9zdHJpbmcoY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgdXNlcl9sZW4pCit7CisJY2hhciogYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYyh1c2VyX2xlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCB1c2VyX2J1ZiwgdXNlcl9sZW4pICE9IDApIHsKKwkJa2ZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisJfQorCS8qIGdvdCB0aGUgc3RyaW5nLCBub3cgc3RyaXAgbGluZWZlZWQuICovCisJaWYgKGJ1ZmZlclt1c2VyX2xlbiAtIDFdID09ICdcbicpCisJCWJ1ZmZlclt1c2VyX2xlbiAtIDFdID0gMDsKKwllbHNlCisJCWJ1ZmZlclt1c2VyX2xlbl0gPSAwOworICAgICAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgaW5saW5lIGludAorZGVidWdfZ2V0X3VpbnQoY2hhciAqYnVmKQoreworCWludCByYzsKKworCWZvcig7IGlzc3BhY2UoKmJ1Zik7IGJ1ZisrKTsKKwlyYyA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmJ1ZiwgMTApOworCWlmKCpidWYpeworCQlwcmludGsoImRlYnVnOiBubyBpbnRlZ2VyIHNwZWNpZmllZCFcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJfQogCXJldHVybiByYzsKIH0KIApAQCAtMTAxMSwxMyArMTE3OSw2OSBAQAogICogcHJpbnRzIG91dCBhY3R1YWwgZGVidWcgbGV2ZWwKICAqLwogCi1zdGF0aWMgaW50IGRlYnVnX3Byb2xvZ19sZXZlbF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwKK3N0YXRpYyBpbnQKK2RlYnVnX3Byb2xvZ19wYWdlc19mbihkZWJ1Z19pbmZvX3QgKiBpZCwKIAkJCQkgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsIGNoYXIgKm91dF9idWYpCiB7CisJcmV0dXJuIHNwcmludGYob3V0X2J1ZiwgIiVpXG4iLCBpZC0+cGFnZXNfcGVyX2FyZWEpOworfQorCisvKgorICogcmVhZHMgbmV3IHNpemUgKG51bWJlciBvZiBwYWdlcyBwZXIgZGVidWcgYXJlYSkKKyAqLworCitzdGF0aWMgaW50CitkZWJ1Z19pbnB1dF9wYWdlc19mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJc2l6ZV90IHVzZXJfbGVuLCBsb2ZmX3QgKiBvZmZzZXQpCit7CisJY2hhciAqc3RyOworCWludCByYyxuZXdfcGFnZXM7CisKKwlpZiAodXNlcl9sZW4gPiAweDEwMDAwKQorICAgICAgICAgICAgICAgIHVzZXJfbGVuID0gMHgxMDAwMDsKKwlpZiAoKm9mZnNldCAhPSAwKXsKKwkJcmMgPSAtRVBJUEU7CisJCWdvdG8gb3V0OworCX0KKwlzdHIgPSBkZWJ1Z19nZXRfdXNlcl9zdHJpbmcodXNlcl9idWYsdXNlcl9sZW4pOworCWlmKElTX0VSUihzdHIpKXsKKwkJcmMgPSBQVFJfRVJSKHN0cik7CisJCWdvdG8gb3V0OworCX0KKwluZXdfcGFnZXMgPSBkZWJ1Z19nZXRfdWludChzdHIpOworCWlmKG5ld19wYWdlcyA8IDApeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZnJlZV9zdHI7CisJfQorCXJjID0gZGVidWdfc2V0X3NpemUoaWQsaWQtPm5yX2FyZWFzLCBuZXdfcGFnZXMpOworCWlmKHJjICE9IDApeworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZnJlZV9zdHI7CisJfQorCXJjID0gdXNlcl9sZW47CitmcmVlX3N0cjoKKwlrZnJlZShzdHIpOworb3V0OgorCSpvZmZzZXQgKz0gdXNlcl9sZW47CisJcmV0dXJuIHJjOwkJLyogbnVtYmVyIG9mIGlucHV0IGNoYXJhY3RlcnMgKi8KK30KKworLyoKKyAqIHByaW50cyBvdXQgYWN0dWFsIGRlYnVnIGxldmVsCisgKi8KKworc3RhdGljIGludAorZGVidWdfcHJvbG9nX2xldmVsX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywgY2hhciAqb3V0X2J1ZikKK3sKIAlpbnQgcmMgPSAwOwogCi0JaWYoaWQtPmxldmVsID09IC0xKSByYyA9IHNwcmludGYob3V0X2J1ZiwiLVxuIik7Ci0JZWxzZSByYyA9IHNwcmludGYob3V0X2J1ZiwgIiVpXG4iLCBpZC0+bGV2ZWwpOworCWlmKGlkLT5sZXZlbCA9PSBERUJVR19PRkZfTEVWRUwpIHsKKwkJcmMgPSBzcHJpbnRmKG91dF9idWYsIi1cbiIpOworCX0KKwllbHNlIHsKKwkJcmMgPSBzcHJpbnRmKG91dF9idWYsICIlaVxuIiwgaWQtPmxldmVsKTsKKwl9CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMDI1LDMwICsxMjQ5LDQzIEBACiAgKiByZWFkcyBuZXcgZGVidWcgbGV2ZWwKICAqLwogCi1zdGF0aWMgaW50IGRlYnVnX2lucHV0X2xldmVsX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKLQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCXNpemVfdCBpbl9idWZfc2l6ZSwgbG9mZl90ICogb2Zmc2V0KQorc3RhdGljIGludAorZGVidWdfaW5wdXRfbGV2ZWxfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAorCQkJc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCXNpemVfdCB1c2VyX2xlbiwgbG9mZl90ICogb2Zmc2V0KQogewotCWNoYXIgaW5wdXRfYnVmWzFdOwotCWludCByYyA9IGluX2J1Zl9zaXplOworCWNoYXIgKnN0cjsKKwlpbnQgcmMsbmV3X2xldmVsOwogCi0JaWYgKCpvZmZzZXQgIT0gMCkKLQkJZ290byBvdXQ7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGlucHV0X2J1ZiwgdXNlcl9idWYsIDEpKXsKLQkJcmMgPSAtRUZBVUxUOworCWlmICh1c2VyX2xlbiA+IDB4MTAwMDApCisgICAgICAgICAgICAgICAgdXNlcl9sZW4gPSAweDEwMDAwOworCWlmICgqb2Zmc2V0ICE9IDApeworCQlyYyA9IC1FUElQRTsKIAkJZ290byBvdXQ7CiAJfQotCWlmIChpc2RpZ2l0KGlucHV0X2J1ZlswXSkpIHsKLQkJaW50IG5ld19sZXZlbCA9ICgoaW50KSBpbnB1dF9idWZbMF0gLSAoaW50KSAnMCcpOwotCQlkZWJ1Z19zZXRfbGV2ZWwoaWQsIG5ld19sZXZlbCk7Ci0JfSBlbHNlIGlmKGlucHV0X2J1ZlswXSA9PSAnLScpIHsKKwlzdHIgPSBkZWJ1Z19nZXRfdXNlcl9zdHJpbmcodXNlcl9idWYsdXNlcl9sZW4pOworCWlmKElTX0VSUihzdHIpKXsKKwkJcmMgPSBQVFJfRVJSKHN0cik7CisJCWdvdG8gb3V0OworCX0KKwlpZihzdHJbMF0gPT0gJy0nKXsKIAkJZGVidWdfc2V0X2xldmVsKGlkLCBERUJVR19PRkZfTEVWRUwpOworCQlyYyA9IHVzZXJfbGVuOworCQlnb3RvIGZyZWVfc3RyOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImRlYnVnOiBsZXZlbCBgJWNgIGlzIG5vdCB2YWxpZFxuIiwKLQkJICAgICAgIGlucHV0X2J1ZlswXSk7CisJCW5ld19sZXZlbCA9IGRlYnVnX2dldF91aW50KHN0cik7CiAJfQotICAgICAgb3V0OgotCSpvZmZzZXQgKz0gaW5fYnVmX3NpemU7CisJaWYobmV3X2xldmVsIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogbGV2ZWwgYCVzYCBpcyBub3QgdmFsaWRcbiIsIHN0cik7CisJCXJjID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlkZWJ1Z19zZXRfbGV2ZWwoaWQsIG5ld19sZXZlbCk7CisJCXJjID0gdXNlcl9sZW47CisJfQorZnJlZV9zdHI6CisJa2ZyZWUoc3RyKTsKK291dDoKKwkqb2Zmc2V0ICs9IHVzZXJfbGVuOwogCXJldHVybiByYzsJCS8qIG51bWJlciBvZiBpbnB1dCBjaGFyYWN0ZXJzICovCiB9CiAKQEAgLTEwNTcsMjkgKzEyOTQsMzYgQEAKICAqIGZsdXNoZXMgZGVidWcgYXJlYXMKICAqLwogIAotdm9pZCBkZWJ1Z19mbHVzaChkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgYXJlYSkKK3ZvaWQKK2RlYnVnX2ZsdXNoKGRlYnVnX2luZm9fdCogaWQsIGludCBhcmVhKQogewogICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGksajsKIAotICAgICAgICBpZighaWQpCisgICAgICAgIGlmKCFpZCB8fCAhaWQtPmFyZWFzKQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmlkLT5sb2NrLGZsYWdzKTsKICAgICAgICAgaWYoYXJlYSA9PSBERUJVR19GTFVTSF9BTEwpewogICAgICAgICAgICAgICAgIGlkLT5hY3RpdmVfYXJlYSA9IDA7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGlkLT5hY3RpdmVfZW50cnksIDAsIGlkLT5ucl9hcmVhcyAqIHNpemVvZihpbnQpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWQtPm5yX2FyZWFzOyBpKyspIAotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGlkLT5hcmVhc1tpXSwgMCwgUEFHRV9TSVpFIDw8IGlkLT5wYWdlX29yZGVyKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoaWQtPmFjdGl2ZV9lbnRyaWVzLCAwLCBpZC0+bnJfYXJlYXMgKiBzaXplb2YoaW50KSk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlkLT5ucl9hcmVhczsgaSsrKSB7CisJCQlpZC0+YWN0aXZlX3BhZ2VzW2ldID0gMDsKKwkJCWZvcihqID0gMDsgaiA8IGlkLT5wYWdlc19wZXJfYXJlYTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAJbWVtc2V0KGlkLT5hcmVhc1tpXVtqXSwgMCwgUEFHRV9TSVpFKTsKKwkJCX0KKwkJfQogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImRlYnVnOiAlczogYWxsIGFyZWFzIGZsdXNoZWRcbiIsaWQtPm5hbWUpOwogICAgICAgICB9IGVsc2UgaWYoYXJlYSA+PSAwICYmIGFyZWEgPCBpZC0+bnJfYXJlYXMpIHsKLSAgICAgICAgICAgICAgICBpZC0+YWN0aXZlX2VudHJ5W2FyZWFdID0gMDsKLSAgICAgICAgICAgICAgICBtZW1zZXQoaWQtPmFyZWFzW2FyZWFdLCAwLCBQQUdFX1NJWkUgPDwgaWQtPnBhZ2Vfb3JkZXIpOwotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KLSAgICAgICAgICAgICAgICAgICAgICAgICJkZWJ1ZzogJXM6IGFyZWEgJWkgaGFzIGJlZW4gZmx1c2hlZFxuIiwKKyAgICAgICAgICAgICAgICBpZC0+YWN0aXZlX2VudHJpZXNbYXJlYV0gPSAwOworCQlpZC0+YWN0aXZlX3BhZ2VzW2FyZWFdID0gMDsKKwkJZm9yKGkgPSAwOyBpIDwgaWQtPnBhZ2VzX3Blcl9hcmVhOyBpKyspIHsKKyAgICAgICAgICAgICAgICAJbWVtc2V0KGlkLT5hcmVhc1thcmVhXVtpXSwwLFBBR0VfU0laRSk7CisJCX0KKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJkZWJ1ZzogJXM6IGFyZWEgJWkgaGFzIGJlZW4gZmx1c2hlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlkLT5uYW1lLCBhcmVhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCi0gICAgICAgICAgICAgICAgICAgICAgICAiZGVidWc6ICVzOiBhcmVhICVpIGNhbm5vdCBiZSBmbHVzaGVkIChyYW5nZTogJWkgLSAlaSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgImRlYnVnOiAlczogYXJlYSAlaSBjYW5ub3QgYmUgZmx1c2hlZCAocmFuZ2U6ICVpIC0gJWkpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaWQtPm5hbWUsIGFyZWEsIDAsIGlkLT5ucl9hcmVhcy0xKTsKICAgICAgICAgfQogICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZC0+bG9jayxmbGFncyk7CkBAIC0xMDg5LDE1ICsxMzMzLDIwIEBACiAgKiB2aWV3IGZ1bmN0aW9uOiBmbHVzaGVzIGRlYnVnIGFyZWFzIAogICovCiAKLXN0YXRpYyBpbnQgZGVidWdfaW5wdXRfZmx1c2hfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5fYnVmX3NpemUsIGxvZmZfdCAqIG9mZnNldCkKK3N0YXRpYyBpbnQKK2RlYnVnX2lucHV0X2ZsdXNoX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKKwkJCXN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQlzaXplX3QgdXNlcl9sZW4sIGxvZmZfdCAqIG9mZnNldCkKIHsKICAgICAgICAgY2hhciBpbnB1dF9idWZbMV07Ci0gICAgICAgIGludCByYyA9IGluX2J1Zl9zaXplOwotIAotICAgICAgICBpZiAoKm9mZnNldCAhPSAwKQorICAgICAgICBpbnQgcmMgPSB1c2VyX2xlbjsKKworCWlmICh1c2VyX2xlbiA+IDB4MTAwMDApCisgICAgICAgICAgICAgICAgdXNlcl9sZW4gPSAweDEwMDAwOworICAgICAgICBpZiAoKm9mZnNldCAhPSAwKXsKKwkJcmMgPSAtRVBJUEU7CiAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJfQogICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoaW5wdXRfYnVmLCB1c2VyX2J1ZiwgMSkpewogICAgICAgICAgICAgICAgIHJjID0gLUVGQVVMVDsKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKQEAgLTExMTQsOCArMTM2Myw4IEBACiAKICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZGVidWc6IGFyZWEgYCVjYCBpcyBub3QgdmFsaWRcbiIsIGlucHV0X2J1ZlswXSk7CiAKLSAgICAgIG91dDoKLSAgICAgICAgKm9mZnNldCArPSBpbl9idWZfc2l6ZTsKK291dDoKKyAgICAgICAgKm9mZnNldCArPSB1c2VyX2xlbjsKICAgICAgICAgcmV0dXJuIHJjOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGlucHV0IGNoYXJhY3RlcnMgKi8KIH0KIApAQCAtMTEyMyw4ICsxMzcyLDkgQEAKICAqIHByaW50cyBkZWJ1ZyBoZWFkZXIgaW4gcmF3IGZvcm1hdAogICovCiAKLWludCBkZWJ1Z19yYXdfaGVhZGVyX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJlYSwgZGVidWdfZW50cnlfdCAqIGVudHJ5LCBjaGFyICpvdXRfYnVmKQorc3RhdGljIGludAorZGVidWdfcmF3X2hlYWRlcl9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJCQlpbnQgYXJlYSwgZGVidWdfZW50cnlfdCAqIGVudHJ5LCBjaGFyICpvdXRfYnVmKQogewogICAgICAgICBpbnQgcmM7CiAKQEAgLTExMzcsNyArMTM4Nyw4IEBACiAgKiBwcmludHMgZGVidWcgZGF0YSBpbiByYXcgZm9ybWF0CiAgKi8KIAotc3RhdGljIGludCBkZWJ1Z19yYXdfZm9ybWF0X2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKK3N0YXRpYyBpbnQKK2RlYnVnX3Jhd19mb3JtYXRfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAogCQkJICAgICAgIGNoYXIgKm91dF9idWYsIGNvbnN0IGNoYXIgKmluX2J1ZikKIHsKIAlpbnQgcmM7CkBAIC0xMTUxLDggKzE0MDIsOSBAQAogICogcHJpbnRzIGRlYnVnIGRhdGEgaW4gaGV4L2FzY2lpIGZvcm1hdAogICovCiAKLXN0YXRpYyBpbnQgZGVidWdfaGV4X2FzY2lpX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCi0JCSAgICAJCSAgY2hhciAqb3V0X2J1ZiwgY29uc3QgY2hhciAqaW5fYnVmKQorc3RhdGljIGludAorZGVidWdfaGV4X2FzY2lpX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisJICAgIAkJICBjaGFyICpvdXRfYnVmLCBjb25zdCBjaGFyICppbl9idWYpCiB7CiAJaW50IGksIHJjID0gMDsKIApAQCAtMTE3Niw3ICsxNDI4LDggQEAKICAqIHByaW50cyBoZWFkZXIgZm9yIGRlYnVnIGVudHJ5CiAgKi8KIAotaW50IGRlYnVnX2RmbHRfaGVhZGVyX2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKK2ludAorZGVidWdfZGZsdF9oZWFkZXJfZm4oZGVidWdfaW5mb190ICogaWQsIHN0cnVjdCBkZWJ1Z192aWV3ICp2aWV3LAogCQkJIGludCBhcmVhLCBkZWJ1Z19lbnRyeV90ICogZW50cnksIGNoYXIgKm91dF9idWYpCiB7CiAJc3RydWN0IHRpbWV2YWwgdGltZV92YWw7CkBAIC0xMjEwLDggKzE0NjMsOSBAQAogCiAjZGVmaW5lIERFQlVHX1NQUklOVEZfTUFYX0FSR1MgMTAKIAotaW50IGRlYnVnX3NwcmludGZfZm9ybWF0X2ZuKGRlYnVnX2luZm9fdCAqIGlkLCBzdHJ1Y3QgZGVidWdfdmlldyAqdmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpvdXRfYnVmLCBkZWJ1Z19zcHJpbnRmX2VudHJ5X3QgKmN1cnJfZXZlbnQpCitzdGF0aWMgaW50CitkZWJ1Z19zcHJpbnRmX2Zvcm1hdF9mbihkZWJ1Z19pbmZvX3QgKiBpZCwgc3RydWN0IGRlYnVnX3ZpZXcgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpvdXRfYnVmLCBkZWJ1Z19zcHJpbnRmX2VudHJ5X3QgKmN1cnJfZXZlbnQpCiB7CiAJaW50IG51bV9sb25ncywgbnVtX3VzZWRfYXJncyA9IDAsaSwgcmMgPSAwOwogCWludCBpbmRleFtERUJVR19TUFJJTlRGX01BWF9BUkdTXTsKQEAgLTEyNTEsMTQgKzE1MDUsMTAgQEAKIC8qCiAgKiBjbGVhbiB1cCBtb2R1bGUKICAqLwotdm9pZCBfX2V4aXQgZGVidWdfZXhpdCh2b2lkKQordm9pZAorX19leGl0IGRlYnVnX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBERUJVRwotCXByaW50aygiZGVidWdfY2xlYW51cF9tb2R1bGU6IFxuIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXJlbW92ZV9wcm9jX2VudHJ5KGRlYnVnX3Byb2Nfcm9vdF9lbnRyeS0+bmFtZSwgTlVMTCk7Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKwlkZWJ1Z2ZzX3JlbW92ZShkZWJ1Z19kZWJ1Z2ZzX3Jvb3RfZW50cnkpOwogCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHMzOTBkYmZfc3lzY3RsX2hlYWRlcik7CiAJcmV0dXJuOwogfQpAQCAtMTI2Niw3ICsxNTE2LDcgQEAKIC8qCiAgKiBtb2R1bGUgZGVmaW5pdGlvbnMKICAqLwotY29yZV9pbml0Y2FsbChkZWJ1Z19pbml0KTsKK3Bvc3Rjb3JlX2luaXRjYWxsKGRlYnVnX2luaXQpOwogbW9kdWxlX2V4aXQoZGVidWdfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwppbmRleCBjMGUwOWIzLi41YjI2MmI1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCkBAIC03LDYgKzcsNyBAQAogICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAogICogICAgICAgICAgICAgICBIYXJ0bXV0IFBlbm5lciAoaHBAZGUuaWJtLmNvbSksCiAgKiAgICAgICAgICAgICAgIERlbmlzIEpvc2VwaCBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSksCisgKgkJIEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgogICovCiAKICNpbmNsdWRlIDxsaW51eC9zeXMuaD4KQEAgLTQ5LDkgKzUwLDkgQEAKIFNQX1RSQVAgICAgICA9ICBTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfVFJBUAogU1BfU0laRSAgICAgID0gIFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFCiAKLV9USUZfV09SS19TVkMgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBcCitfVElGX1dPUktfU1ZDID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgX1RJRl9NQ0NLX1BFTkRJTkcgfCBcCiAJCSBfVElGX1JFU1RBUlRfU1ZDIHwgX1RJRl9TSU5HTEVfU1RFUCApCi1fVElGX1dPUktfSU5UID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEKQorX1RJRl9XT1JLX0lOVCA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfTUNDS19QRU5ESU5HKQogCiBTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKIFNUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVApAQCAtMTIxLDcgKzEyMiwxMSBAQAogCWJ6CUJBU0VEKHN0YWNrX292ZXJmbG93KQogMzoKICNlbmRpZgotMjoJcwklcjE1LEJBU0VEKC5MY19zcHNpemUpCSMgbWFrZSByb29tIGZvciByZWdpc3RlcnMgJiBwc3cKKzI6CisJLmVuZG0KKworCS5tYWNybyAgQ1JFQVRFX1NUQUNLX0ZSQU1FIHBzd29yZyxzYXZlYXJlYQorCXMJJXIxNSxCQVNFRCguTGNfc3BzaXplKQkjIG1ha2Ugcm9vbSBmb3IgcmVnaXN0ZXJzICYgcHN3CiAJbXZjCVNQX1BTVyg4LCVyMTUpLDAoJXIxMikJIyBtb3ZlIHVzZXIgUFNXIHRvIHN0YWNrCiAJbGEJJXIxMixccHN3b3JnCiAJc3QJJXIyLFNQX09SSUdfUjIoJXIxNSkJIyBzdG9yZSBvcmlnaW5hbCBjb250ZW50IG9mIGdwciAyCkBAIC0xNjEsNiArMTY2LDEzIEBACiAgICAgICAgIGJlICAgICAgX19zd2l0Y2hfdG9fbm9wZXItX19zd2l0Y2hfdG9fYmFzZSglcjEpCSMgd2UgZ290IGF3YXkgdy9vIGJhc2hpbmcgVExCJ3MKICAgICAgICAgbGN0bCAgICAlYzksJWMxMSxfX1RIUkVBRF9wZXIoJXIzKQkjIE5vcGUgd2UgZGlkbid0CiBfX3N3aXRjaF90b19ub3BlcjoKKwlsCSVyNCxfX1RIUkVBRF9pbmZvKCVyMikJCSMgZ2V0IHRocmVhZF9pbmZvIG9mIHByZXYKKwl0bQlfX1RJX2ZsYWdzKzMoJXI0KSxfVElGX01DQ0tfUEVORElORyAjIG1hY2hpbmUgY2hlY2sgcGVuZGluZz8KKwlieglfX3N3aXRjaF90b19ub19tY2NrLV9fc3dpdGNoX3RvX2Jhc2UoJXIxKQorCW5pCV9fVElfZmxhZ3MrMyglcjQpLDI1NS1fVElGX01DQ0tfUEVORElORyAjIGNsZWFyIGZsYWcgaW4gcHJldgorCWwJJXI0LF9fVEhSRUFEX2luZm8oJXIzKQkJIyBnZXQgdGhyZWFkX2luZm8gb2YgbmV4dAorCW9pCV9fVElfZmxhZ3MrMyglcjQpLF9USUZfTUNDS19QRU5ESU5HICMgc2V0IGl0IGluIG5leHQKK19fc3dpdGNoX3RvX25vX21jY2s6CiAgICAgICAgIHN0bSAgICAgJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpIyBzdG9yZSBfX3N3aXRjaF90byByZWdpc3RlcnMgb2YgcHJldiB0YXNrCiAJc3QJJXIxNSxfX1RIUkVBRF9rc3AoJXIyKQkjIHN0b3JlIGtlcm5lbCBzdGFjayB0byBwcmV2LT50c3Mua3NwCiAJbAklcjE1LF9fVEhSRUFEX2tzcCglcjMpCSMgbG9hZCBrZXJuZWwgc3RhY2sgZnJvbSBuZXh0LT50c3Mua3NwCkBAIC0xODUsNiArMTk3LDcgQEAKIHN5c2Nfc2F2ZWFsbDoKIAlTQVZFX0FMTF9CQVNFIF9fTENfU0FWRV9BUkVBCiAgICAgICAgIFNBVkVfQUxMIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAJbGgJJXI3LDB4OGEJICAjIGdldCBzdmMgbnVtYmVyIGZyb20gbG93Y29yZQogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCiBzeXNjX3Z0aW1lOgpAQCAtMjM0LDYgKzI0Nyw4IEBACiAjIE9uZSBvZiB0aGUgd29yayBiaXRzIGlzIG9uLiBGaW5kIG91dCB3aGljaCBvbmUuCiAjCiBzeXNjX3dvcms6CisJdG0JX19USV9mbGFncyszKCVyOSksX1RJRl9NQ0NLX1BFTkRJTkcKKwlibwlCQVNFRChzeXNjX21jY2tfcGVuZGluZykKIAl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX05FRURfUkVTQ0hFRAogCWJvCUJBU0VEKHN5c2NfcmVzY2hlZHVsZSkKIAl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJR1BFTkRJTkcKQEAgLTI1Myw2ICsyNjgsMTQgQEAKIAliciAgICAgICVyMQkJICAgICAgICMgY2FsbCBzY2hlZHVsZXIKIAogIworIyBfVElGX01DQ0tfUEVORElORyBpcyBzZXQsIGNhbGwgaGFuZGxlcgorIworc3lzY19tY2NrX3BlbmRpbmc6CisJbAklcjEsQkFTRUQoLkxzMzkwX2hhbmRsZV9tY2NrKQorCWxhCSVyMTQsQkFTRUQoc3lzY193b3JrX2xvb3ApCisJYnIJJXIxCQkJIyBUSUYgYml0IHdpbGwgYmUgY2xlYXJlZCBieSBoYW5kbGVyCisKKyMKICMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKICMKIHN5c2Nfc2lncGVuZGluZzogICAgIApAQCAtNDMwLDYgKzQ1Myw3IEBACiAgICAgICAgIHRtICAgICAgX19MQ19QR01fSU5UX0NPREUrMSwweDgwICMgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBwZXIgZXhjZXB0aW9uCiAgICAgICAgIGJueiAgICAgQkFTRUQocGdtX3BlcikgICAgICAgICAgICMgZ290IHBlciBleGNlcHRpb24gLT4gc3BlY2lhbCBjYXNlCiAJU0FWRV9BTEwgX19MQ19QR01fT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSwxCisJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KIAlieglCQVNFRChwZ21fbm9fdnRpbWUpCkBAIC00NjgsNiArNDkyLDcgQEAKICMKIHBnbV9wZXJfc3RkOgogCVNBVkVfQUxMIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1BHTV9PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJYnoJQkFTRUQocGdtX25vX3Z0aW1lMikKQEAgLTQ5Myw2ICs1MTgsNyBAQAogIwogcGdtX3N2Y3BlcjoKIAlTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKwlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCiAJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwogCWJ6CUJBU0VEKHBnbV9ub192dGltZTMpCkBAIC01MjEsNiArNTQ3LDcgQEAKIAlzdGNrCV9fTENfSU5UX0NMT0NLCiAJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQSsxNgogICAgICAgICBTQVZFX0FMTCBfX0xDX0lPX09MRF9QU1csX19MQ19TQVZFX0FSRUErMTYsMAorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX0lPX09MRF9QU1csX19MQ19TQVZFX0FSRUErMTYKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KIAlieglCQVNFRChpb19ub192dGltZSkKQEAgLTU3OCw5ICs2MDUsMTEgQEAKIAlscgklcjE1LCVyMQogIwogIyBPbmUgb2YgdGhlIHdvcmsgYml0cyBpcyBvbi4gRmluZCBvdXQgd2hpY2ggb25lLgotIyBDaGVja2VkIGFyZTogX1RJRl9TSUdQRU5ESU5HIGFuZCBfVElGX05FRURfUkVTQ0hFRAorIyBDaGVja2VkIGFyZTogX1RJRl9TSUdQRU5ESU5HLCBfVElGX05FRURfUkVTQ0hFRCBhbmQgX1RJRl9NQ0NLX1BFTkRJTkcKICMKIGlvX3dvcmtfbG9vcDoKKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX01DQ0tfUEVORElORworCWJvICAgICAgQkFTRUQoaW9fbWNja19wZW5kaW5nKQogCXRtCV9fVElfZmxhZ3MrMyglcjkpLF9USUZfTkVFRF9SRVNDSEVECiAJYm8JQkFTRUQoaW9fcmVzY2hlZHVsZSkKIAl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX1NJR1BFTkRJTkcKQEAgLTU4OCw2ICs2MTcsMTQgQEAKIAliCUJBU0VEKGlvX2xlYXZlKQogCiAjCisjIF9USUZfTUNDS19QRU5ESU5HIGlzIHNldCwgY2FsbCBoYW5kbGVyCisjCitpb19tY2NrX3BlbmRpbmc6CisJbAklcjEsQkFTRUQoLkxzMzkwX2hhbmRsZV9tY2NrKQorCWwJJXIxNCxCQVNFRChpb193b3JrX2xvb3ApCisJYnIJJXIxCQkgICAgICAgIyBUSUYgYml0IHdpbGwgYmUgY2xlYXJlZCBieSBoYW5kbGVyCisKKyMKICMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCiAjCQogaW9fcmVzY2hlZHVsZTogICAgICAgIApAQCAtNjIxLDYgKzY1OCw3IEBACiAJc3RjawlfX0xDX0lOVF9DTE9DSwogCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUErMTYKICAgICAgICAgU0FWRV9BTEwgX19MQ19FWFRfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSsxNiwwCisJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfRVhUX09MRF9QU1csX19MQ19TQVZFX0FSRUErMTYKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KIAlieglCQVNFRChleHRfbm9fdnRpbWUpCkBAIC02NDIsMTkgKzY4MCw2MiBAQAogCiAgICAgICAgIC5nbG9ibCBtY2NrX2ludF9oYW5kbGVyCiBtY2NrX2ludF9oYW5kbGVyOgotCVNUT1JFX1RJTUVSIF9fTENfQVNZTkNfRU5URVJfVElNRVIKKwlzcHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBCSMgcmV2YWxpZGF0ZSBjcHUgdGltZXIKKwlsbQklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEJIyByZXZhbGlkYXRlIGdwcnMKIAlTQVZFX0FMTF9CQVNFIF9fTENfU0FWRV9BUkVBKzMyCi0gICAgICAgIFNBVkVfQUxMIF9fTENfTUNLX09MRF9QU1csX19MQ19TQVZFX0FSRUErMzIsMAorCWxhCSVyMTIsX19MQ19NQ0tfT0xEX1BTVworCXRtCV9fTENfTUNDS19DT0RFLDB4ODAgICAgICMgc3lzdGVtIGRhbWFnZT8KKwlibwlCQVNFRChtY2NrX2ludF9tYWluKQkjIHllcyAtPiByZXN0IG9mIG1jY2sgY29kZSBpbnZhbGlkCisJdG0JX19MQ19NQ0NLX0NPREUrNSwweDAyICAgIyBzdG9yZWQgY3B1IHRpbWVyIHZhbHVlIHZhbGlkPworCWJvCUJBU0VEKDBmKQorCXNwdAlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSCSMgcmV2YWxpZGF0ZSBjcHUgdGltZXIKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwotCXRtCVNQX1BTVysxKCVyMTUpLDB4MDEJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19TWU5DX0VOVEVSX1RJTUVSCisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19FWElUX1RJTUVSCiswOgl0bQlfX0xDX01DQ0tfQ09ERSsyLDB4MDggICAjIG13cCBvZiBvbGQgcHN3IHZhbGlkPworCWJubwlCQVNFRChtY2NrX25vX3Z0aW1lKQkjIG5vIC0+IHNraXAgY2xlYW51cCBjcml0aWNhbAorCXRtCV9fTENfTUNLX09MRF9QU1crMSwweDAxICMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJYnoJQkFTRUQobWNja19ub192dGltZSkKIAlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfQVNZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCiAJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCiAJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgogbWNja19ub192dGltZToKICNlbmRpZgorMDoKKwl0bQlfX0xDX01DQ0tfQ09ERSsyLDB4MDkgICAjIG13cCArIGlhIG9mIG9sZCBwc3cgdmFsaWQ/CisJYm5vCUJBU0VEKG1jY2tfaW50X21haW4pCSMgbm8gLT4gc2tpcCBjbGVhbnVwIGNyaXRpY2FsCisJdG0JX19MQ19NQ0tfT0xEX1BTVysxLDB4MDEJIyB0ZXN0IHByb2JsZW0gc3RhdGUgYml0CisJYm56CUJBU0VEKG1jY2tfaW50X21haW4pCSMgZnJvbSB1c2VyIC0+IGxvYWQgYXN5bmMgc3RhY2sKKwljbGMJX19MQ19NQ0tfT0xEX1BTVys0KDQpLEJBU0VEKC5MY3JpdGljYWxfZW5kKQorCWJoZQlCQVNFRChtY2NrX2ludF9tYWluKQorCWNsYwlfX0xDX01DS19PTERfUFNXKzQoNCksQkFTRUQoLkxjcml0aWNhbF9zdGFydCkKKwlibAlCQVNFRChtY2NrX2ludF9tYWluKQorCWwJJXIxNCxCQVNFRCguTGNsZWFudXBfY3JpdGljYWwpCisJYmFzcgklcjE0LCVyMTQKK21jY2tfaW50X21haW46CisJbAklcjE0LF9fTENfUEFOSUNfU1RBQ0sJIyBhcmUgd2UgYWxyZWFkeSBvbiB0aGUgcGFuaWMgc3RhY2s/CisJc2xyCSVyMTQsJXIxNQorCXNyYQklcjE0LFBBR0VfU0hJRlQKKwliZQlCQVNFRCgwZikKKwlsCSVyMTUsX19MQ19QQU5JQ19TVEFDSwkjIGxvYWQgcGFuaWMgc3RhY2sKKzA6CUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX01DS19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzMyCisJbAklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCiAJbCAgICAgICAlcjEsQkFTRUQoLkxzMzkwX21jY2spCi0JYmFzciAgICAlcjE0LCVyMQkgICMgY2FsbCBtYWNoaW5lIGNoZWNrIGhhbmRsZXIKKwliYXNyICAgICVyMTQsJXIxCQkjIGNhbGwgbWFjaGluZSBjaGVjayBoYW5kbGVyCisJdG0gICAgICBTUF9QU1crMSglcjE1KSwweDAxCSMgcmV0dXJuaW5nIHRvIHVzZXIgPworCWJubwlCQVNFRChtY2NrX3JldHVybikKKwlsCSVyMSxfX0xDX0tFUk5FTF9TVEFDSyAgICMgc3dpdGNoIHRvIGtlcm5lbCBzdGFjaworCXMJJXIxLEJBU0VEKC5MY19zcHNpemUpCisJbXZjCVNQX1BUUkVHUyhfX1BUX1NJWkUsJXIxKSxTUF9QVFJFR1MoJXIxNSkKKwl4YyAgICAgIF9fU0ZfQkFDS0NIQUlOKDQsJXIxKSxfX1NGX0JBQ0tDSEFJTiglcjEpICMgY2xlYXIgYmFjayBjaGFpbgorCWxyCSVyMTUsJXIxCisJc3Rvc20JX19TRl9FTVBUWSglcjE1KSwweDA0CSMgdHVybiBkYXQgb24KKwl0bQlfX1RJX2ZsYWdzKzMoJXI5KSxfVElGX01DQ0tfUEVORElORworCWJubwlCQVNFRChtY2NrX3JldHVybikKKwlsCSVyMSxCQVNFRCguTHMzOTBfaGFuZGxlX21jY2spCisJYmFzcgklcjE0LCVyMQkJIyBjYWxsIG1hY2hpbmUgY2hlY2sgaGFuZGxlcgogbWNja19yZXR1cm46CiAgICAgICAgIFJFU1RPUkVfQUxMIDAKIApAQCAtNzQyLDcgKzgyMyw3IEBACiAJY2xjCTQoNCwlcjEyKSxCQVNFRChjbGVhbnVwX3RhYmxlX3N5c2Nfd29ya19sb29wKQogCWJsCUJBU0VEKDBmKQogCWNsYwk0KDQsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3dvcmtfbG9vcCs0KQotCWJsCUJBU0VEKGNsZWFudXBfc3lzY19sZWF2ZSkKKwlibAlCQVNFRChjbGVhbnVwX3N5c2NfcmV0dXJuKQogMDoKIAlicgklcjE0CiAKQEAgLTc2MCw2ICs4NDEsNyBAQAogCW12YwlfX0xDX1NBVkVfQVJFQSgxNiksX19MQ19TQVZFX0FSRUErMTYKIDA6CXN0CSVyMTMsX19MQ19TQVZFX0FSRUErMjAKIAlTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKwlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19TVkNfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQQogCXN0CSVyMTUsX19MQ19TQVZFX0FSRUErMjgKIAlsaAklcjcsMHg4YQogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCkBAIC04MzQsNiArOTE2LDggQEAKICAqIFN5bWJvbCBjb25zdGFudHMKICAqLwogLkxzMzkwX21jY2s6ICAgLmxvbmcgIHMzOTBfZG9fbWFjaGluZV9jaGVjaworLkxzMzkwX2hhbmRsZV9tY2NrOgorCSAgICAgICAubG9uZyAgczM5MF9oYW5kbGVfbWNjawogLkxkb19JUlE6ICAgICAgLmxvbmcgIGRvX0lSUQogLkxkb19leHRpbnQ6ICAgLmxvbmcgIGRvX2V4dGludAogLkxkb19zaWduYWw6ICAgLmxvbmcgIGRvX3NpZ25hbApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwppbmRleCA1MTUyN2FiLi41N2NhNzVkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwpAQCAtNyw2ICs3LDcgQEAKICAqICAgIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IChzY2h3aWRlZnNreUBkZS5pYm0uY29tKSwKICAqICAgICAgICAgICAgICAgSGFydG11dCBQZW5uZXIgKGhwQGRlLmlibS5jb20pLAogICogICAgICAgICAgICAgICBEZW5pcyBKb3NlcGggQmFycm93IChkamJhcnJvd0BkZS5pYm0uY29tLGJhcnJvd19kakB5YWhvby5jb20pLAorICoJCSBIZWlrbyBDYXJzdGVucyA8aGVpa28uY2Fyc3RlbnNAZGUuaWJtLmNvbT4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3lzLmg+CkBAIC01Miw5ICs1Myw5IEBACiBTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKIFNUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVAogCi1fVElGX1dPUktfU1ZDID0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAorX1RJRl9XT1JLX1NWQyA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCB8IF9USUZfTUNDS19QRU5ESU5HIHwgXAogCQkgX1RJRl9SRVNUQVJUX1NWQyB8IF9USUZfU0lOR0xFX1NURVAgKQotX1RJRl9XT1JLX0lOVCA9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05FRURfUkVTQ0hFRCkKK19USUZfV09SS19JTlQgPSAoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9ORUVEX1JFU0NIRUQgfCBfVElGX01DQ0tfUEVORElORykKIAogI2RlZmluZSBCQVNFRChuYW1lKSBuYW1lLXN5c3RlbV9jYWxsKCVyMTMpCiAKQEAgLTExNCw3ICsxMTUsMTEgQEAKIAlqeglzdGFja19vdmVyZmxvdwogMzoKICNlbmRpZgotMjoJYWdoaSAgICAlcjE1LC1TUF9TSVpFCQkjIG1ha2Ugcm9vbSBmb3IgcmVnaXN0ZXJzICYgcHN3CisyOgorCS5lbmRtCisKKwkubWFjcm8JQ1JFQVRFX1NUQUNLX0ZSQU1FIHBzd29yZyxzYXZlYXJlYQorCWFnaGkgICAgJXIxNSwtU1BfU0laRQkJIyBtYWtlIHJvb20gZm9yIHJlZ2lzdGVycyAmIHBzdwogCW12YyAgICAgU1BfUFNXKDE2LCVyMTUpLDAoJXIxMikJIyBtb3ZlIHVzZXIgUFNXIHRvIHN0YWNrCiAJbGEJJXIxMixccHN3b3JnCiAJc3RnCSVyMixTUF9PUklHX1IyKCVyMTUpCSMgc3RvcmUgb3JpZ2luYWwgY29udGVudCBvZiBncHIgMgpAQCAtMTUyLDYgKzE1NywxMyBAQAogICAgICAgICBqZSAgICAgIF9fc3dpdGNoX3RvX25vcGVyICAgICAgICAgICAgIyB3ZSBnb3QgYXdheSB3aXRob3V0IGJhc2hpbmcgVExCJ3MKICAgICAgICAgbGN0bGcgICAlYzksJWMxMSxfX1RIUkVBRF9wZXIoJXIzKQkjIE5vcGUgd2UgZGlkbid0CiBfX3N3aXRjaF90b19ub3BlcjoKKwlsZwklcjQsX19USFJFQURfaW5mbyglcjIpICAgICAgICAgICAgICAjIGdldCB0aHJlYWRfaW5mbyBvZiBwcmV2CisJdG0JX19USV9mbGFncys3KCVyNCksX1RJRl9NQ0NLX1BFTkRJTkcgIyBtYWNoaW5lIGNoZWNrIHBlbmRpbmc/CisJanoJX19zd2l0Y2hfdG9fbm9fbWNjaworCW5pCV9fVElfZmxhZ3MrNyglcjQpLDI1NS1fVElGX01DQ0tfUEVORElORyAjIGNsZWFyIGZsYWcgaW4gcHJldgorCWxnCSVyNCxfX1RIUkVBRF9pbmZvKCVyMykJCSAgICAjIGdldCB0aHJlYWRfaW5mbyBvZiBuZXh0CisJb2kJX19USV9mbGFncys3KCVyNCksX1RJRl9NQ0NLX1BFTkRJTkcgIyBzZXQgaXQgaW4gbmV4dAorX19zd2l0Y2hfdG9fbm9fbWNjazoKICAgICAgICAgc3RtZyAgICAlcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkjIHN0b3JlIF9fc3dpdGNoX3RvIHJlZ2lzdGVycyBvZiBwcmV2IHRhc2sKIAlzdGcJJXIxNSxfX1RIUkVBRF9rc3AoJXIyKQkjIHN0b3JlIGtlcm5lbCBzdGFjayB0byBwcmV2LT50c3Mua3NwCiAJbGcJJXIxNSxfX1RIUkVBRF9rc3AoJXIzKQkjIGxvYWQga2VybmVsIHN0YWNrIGZyb20gbmV4dC0+dHNzLmtzcApAQCAtMTc2LDYgKzE4OCw3IEBACiBzeXNjX3NhdmVhbGw6CiAJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQQogICAgICAgICBTQVZFX0FMTCBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBLDEKKyAgICAgICAgQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEKIAlsbGdoICAgICVyNyxfX0xDX1NWQ19JTlRfQ09ERSAjIGdldCBzdmMgbnVtYmVyIGZyb20gbG93Y29yZQogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCiBzeXNjX3Z0aW1lOgpAQCAtMjMyLDYgKzI0NSw4IEBACiAjIE9uZSBvZiB0aGUgd29yayBiaXRzIGlzIG9uLiBGaW5kIG91dCB3aGljaCBvbmUuCiAjCiBzeXNjX3dvcms6CisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9NQ0NLX1BFTkRJTkcKKwlqbwlzeXNjX21jY2tfcGVuZGluZwogCXRtCV9fVElfZmxhZ3MrNyglcjkpLF9USUZfTkVFRF9SRVNDSEVECiAJam8Jc3lzY19yZXNjaGVkdWxlCiAJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9TSUdQRU5ESU5HCkBAIC0yNTAsNiArMjY1LDEzIEBACiAgICAgICAgIGpnICAgICAgc2NoZWR1bGUgICAgICAgICAgICAjIHJldHVybiBwb2ludCBpcyBzeXNjX3JldHVybgogCiAjCisjIF9USUZfTUNDS19QRU5ESU5HIGlzIHNldCwgY2FsbCBoYW5kbGVyCisjCitzeXNjX21jY2tfcGVuZGluZzoKKwlsYXJsCSVyMTQsc3lzY193b3JrX2xvb3AKKwlqZwlzMzkwX2hhbmRsZV9tY2NrICAgICMgVElGIGJpdCB3aWxsIGJlIGNsZWFyZWQgYnkgaGFuZGxlcgorCisjCiAjIF9USUZfU0lHUEVORElORyBpcyBzZXQsIGNhbGwgZG9fc2lnbmFsCiAjCiBzeXNjX3NpZ3BlbmRpbmc6ICAgICAKQEAgLTQ3NCw2ICs0OTYsNyBAQAogICAgICAgICB0bSAgICAgIF9fTENfUEdNX0lOVF9DT0RFKzEsMHg4MCAjIGNoZWNrIHdoZXRoZXIgd2UgZ290IGEgcGVyIGV4Y2VwdGlvbgogICAgICAgICBqbnogICAgIHBnbV9wZXIgICAgICAgICAgICAgICAgICAjIGdvdCBwZXIgZXhjZXB0aW9uIC0+IHNwZWNpYWwgY2FzZQogCVNBVkVfQUxMIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1BHTV9PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJanoJcGdtX25vX3Z0aW1lCkBAIC01MTIsNiArNTM1LDcgQEAKICMKIHBnbV9wZXJfc3RkOgogCVNBVkVfQUxMIF9fTENfUEdNX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1BHTV9PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJanoJcGdtX25vX3Z0aW1lMgpAQCAtNTM3LDYgKzU2MSw3IEBACiAjCiBwZ21fc3ZjcGVyOgogCVNBVkVfQUxMIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJanoJcGdtX25vX3Z0aW1lMwpAQCAtNTY0LDYgKzU4OSw3IEBACiAJc3RjawlfX0xDX0lOVF9DTE9DSwogCVNBVkVfQUxMX0JBU0UgX19MQ19TQVZFX0FSRUErMzIKICAgICAgICAgU0FWRV9BTEwgX19MQ19JT19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzMyLDAKKwlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19JT19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzMyCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJanoJaW9fbm9fdnRpbWUKQEAgLTYyMSw5ICs2NDcsMTEgQEAKIAlsZ3IJJXIxNSwlcjEKICMKICMgT25lIG9mIHRoZSB3b3JrIGJpdHMgaXMgb24uIEZpbmQgb3V0IHdoaWNoIG9uZS4KLSMgQ2hlY2tlZCBhcmU6IF9USUZfU0lHUEVORElORyBhbmQgX1RJRl9ORUVEX1JFU0NIRUQKKyMgQ2hlY2tlZCBhcmU6IF9USUZfU0lHUEVORElORywgX1RJRl9ORUVEX1JFU0NIRUQgYW5kIF9USUZfTUNDS19QRU5ESU5HCiAjCiBpb193b3JrX2xvb3A6CisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9NQ0NLX1BFTkRJTkcKKwlqbwlpb19tY2NrX3BlbmRpbmcKIAl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX05FRURfUkVTQ0hFRAogCWpvCWlvX3Jlc2NoZWR1bGUKIAl0bQlfX1RJX2ZsYWdzKzcoJXI5KSxfVElGX1NJR1BFTkRJTkcKQEAgLTYzMSw2ICs2NTksMTMgQEAKIAlqCWlvX2xlYXZlCiAKICMKKyMgX1RJRl9NQ0NLX1BFTkRJTkcgaXMgc2V0LCBjYWxsIGhhbmRsZXIKKyMKK2lvX21jY2tfcGVuZGluZzoKKwlsYXJsCSVyMTQsaW9fd29ya19sb29wCisJamcJczM5MF9oYW5kbGVfbWNjawkjIFRJRiBiaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGhhbmRsZXIKKworIwogIyBfVElGX05FRURfUkVTQ0hFRCBpcyBzZXQsIGNhbGwgc2NoZWR1bGUKICMJCiBpb19yZXNjaGVkdWxlOiAgICAgICAgCkBAIC02NjEsNiArNjk2LDcgQEAKIAlzdGNrCV9fTENfSU5UX0NMT0NLCiAJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQSszMgogICAgICAgICBTQVZFX0FMTCBfX0xDX0VYVF9PTERfUFNXLF9fTENfU0FWRV9BUkVBKzMyLDAKKwlDUkVBVEVfU1RBQ0tfRlJBTUUgX19MQ19FWFRfT0xEX1BTVyxfX0xDX1NBVkVfQVJFQSszMgogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCiAJdG0JU1BfUFNXKzEoJXIxNSksMHgwMQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwogCWp6CWV4dF9ub192dGltZQpAQCAtNjgwLDE4ICs3MTYsNjAgQEAKICAqLwogICAgICAgICAuZ2xvYmwgbWNja19pbnRfaGFuZGxlcgogbWNja19pbnRfaGFuZGxlcjoKLQlTVE9SRV9USU1FUiBfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJbGEJJXIxLDQwOTUJCSMgcmV2YWxpZGF0ZSByMQorCXNwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEtNDA5NSglcjEpCSMgcmV2YWxpZGF0ZSBjcHUgdGltZXIKKyAgCWxtZyAgICAgJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLTQwOTUoJXIxKSMgcmV2YWxpZGF0ZSBncHJzCiAJU0FWRV9BTExfQkFTRSBfX0xDX1NBVkVfQVJFQSs2NAotICAgICAgICBTQVZFX0FMTCBfX0xDX01DS19PTERfUFNXLF9fTENfU0FWRV9BUkVBKzY0LDAKKwlsYQklcjEyLF9fTENfTUNLX09MRF9QU1cKKwl0bQlfX0xDX01DQ0tfQ09ERSwweDgwICAgICAjIHN5c3RlbSBkYW1hZ2U/CisJam8JbWNja19pbnRfbWFpbgkJIyB5ZXMgLT4gcmVzdCBvZiBtY2NrIGNvZGUgaW52YWxpZAorCXRtCV9fTENfTUNDS19DT0RFKzUsMHgwMiAgICMgc3RvcmVkIGNwdSB0aW1lciB2YWx1ZSB2YWxpZD8KKwlqbwkwZgorCXNwdAlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKLQl0bQlTUF9QU1crMSglcjE1KSwweDAxCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CisJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfRVhJVF9USU1FUgorMDoJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA4CSMgbXdwIG9mIG9sZCBwc3cgdmFsaWQ/CisJam5vCW1jY2tfbm9fdnRpbWUJCSMgbm8gLT4gbm8gdGltZXIgdXBkYXRlCisJdG0gICAgICBfX0xDX01DS19PTERfUFNXKzEsMHgwMSAjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwogCWp6CW1jY2tfbm9fdnRpbWUKIAlVUERBVEVfVlRJTUUgX19MQ19FWElUX1RJTUVSLF9fTENfQVNZTkNfRU5URVJfVElNRVIsX19MQ19VU0VSX1RJTUVSCiAJVVBEQVRFX1ZUSU1FIF9fTENfTEFTVF9VUERBVEVfVElNRVIsX19MQ19FWElUX1RJTUVSLF9fTENfU1lTVEVNX1RJTUVSCiAJbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksX19MQ19BU1lOQ19FTlRFUl9USU1FUgogbWNja19ub192dGltZToKICNlbmRpZgotCWJyYXNsICAgJXIxNCxzMzkwX2RvX21hY2hpbmVfY2hlY2sKKzA6CisJdG0JX19MQ19NQ0NLX0NPREUrMiwweDA5ICAgIyBtd3AgKyBpYSBvZiBvbGQgcHN3IHZhbGlkPworCWpubwltY2NrX2ludF9tYWluCQkjIG5vIC0+IHNraXAgY2xlYW51cCBjcml0aWNhbAorCXRtICAgICAgX19MQ19NQ0tfT0xEX1BTVysxLDB4MDEgIyB0ZXN0IHByb2JsZW0gc3RhdGUgYml0CisJam56CW1jY2tfaW50X21haW4JCSMgZnJvbSB1c2VyIC0+IGxvYWQga2VybmVsIHN0YWNrCisJY2xjCV9fTENfTUNLX09MRF9QU1crOCg4KSxCQVNFRCguTGNyaXRpY2FsX2VuZCkKKwlqaGUJbWNja19pbnRfbWFpbgorCWNsYyAgICAgX19MQ19NQ0tfT0xEX1BTVys4KDgpLEJBU0VEKC5MY3JpdGljYWxfc3RhcnQpCisJamwJbWNja19pbnRfbWFpbgorCWJyYXNsICAgJXIxNCxjbGVhbnVwX2NyaXRpY2FsCittY2NrX2ludF9tYWluOgorCWxnICAgICAgJXIxNCxfX0xDX1BBTklDX1NUQUNLICAgIyBhcmUgd2UgYWxyZWFkeSBvbiB0aGUgcGFuaWMgc3RhY2s/CisJc2xncgklcjE0LCVyMTUKKwlzcmFnCSVyMTQsJXIxNCxQQUdFX1NISUZUCisJanoJMGYKKwlsZyAgICAgICVyMTUsX19MQ19QQU5JQ19TVEFDSyAgICMgbG9hZCBwYW5pYyBzdGFjaworMDoJQ1JFQVRFX1NUQUNLX0ZSQU1FIF9fTENfTUNLX09MRF9QU1csX19MQ19TQVZFX0FSRUErNjQKKwlsZwklcjksX19MQ19USFJFQURfSU5GTwkjIGxvYWQgcG9pbnRlciB0byB0aHJlYWRfaW5mbyBzdHJ1Y3QKKwlsYQklcjIsU1BfUFRSRUdTKCVyMTUpCSMgbG9hZCBwdF9yZWdzCisJYnJhc2wJJXIxNCxzMzkwX2RvX21hY2hpbmVfY2hlY2sKKwl0bQlTUF9QU1crMSglcjE1KSwweDAxICAgICAjIHJldHVybmluZyB0byB1c2VyID8KKwlqbm8JbWNja19yZXR1cm4KKwlsZwklcjEsX19MQ19LRVJORUxfU1RBQ0sJIyBzd2l0Y2ggdG8ga2VybmVsIHN0YWNrCisJYWdoaQklcjEsLVNQX1NJWkUKKwltdmMJU1BfUFRSRUdTKF9fUFRfU0laRSwlcjEpLFNQX1BUUkVHUyglcjE1KQorCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxKSxfX1NGX0JBQ0tDSEFJTiglcjEpICMgY2xlYXIgYmFjayBjaGFpbgorCWxncgklcjE1LCVyMQorCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwNAkjIHR1cm4gZGF0IG9uCisJdG0JX19USV9mbGFncys3KCVyOSksX1RJRl9NQ0NLX1BFTkRJTkcKKwlqbm8JbWNja19yZXR1cm4KKwlicmFzbAklcjE0LHMzOTBfaGFuZGxlX21jY2sKIG1jY2tfcmV0dXJuOgogICAgICAgICBSRVNUT1JFX0FMTCAwCiAKQEAgLTc3NSw3ICs4NTMsNyBAQAogCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3dvcmtfbG9vcCkKIAlqbAkwZgogCWNsYwk4KDgsJXIxMiksQkFTRUQoY2xlYW51cF90YWJsZV9zeXNjX3dvcmtfbG9vcCs4KQotCWpsCWNsZWFudXBfc3lzY19sZWF2ZQorCWpsCWNsZWFudXBfc3lzY19yZXR1cm4KIDA6CiAJYnIJJXIxNAogCkBAIC03OTMsNiArODcxLDcgQEAKIAltdmMJX19MQ19TQVZFX0FSRUEoMzIpLF9fTENfU0FWRV9BUkVBKzMyCiAwOglzdGcJJXIxMyxfX0xDX1NBVkVfQVJFQSs0MAogCVNBVkVfQUxMIF9fTENfU1ZDX09MRF9QU1csX19MQ19TQVZFX0FSRUEsMQorCUNSRUFURV9TVEFDS19GUkFNRSBfX0xDX1NWQ19PTERfUFNXLF9fTENfU0FWRV9BUkVBCiAJc3RnCSVyMTUsX19MQ19TQVZFX0FSRUErNTYKIAlsbGdoCSVyNyxfX0xDX1NWQ19JTlRfQ09ERQogI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvczM5MC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjFjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMCwwICsxLDk4IEBACisvKgorICogYXJjaC9zMzkwL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA1CisgKgorICogQXV0aG9yKHMpOiBSb2xmIEFkZWxzYmVyZ2VyIDxhZGVsc2JlcmdlckBkZS5pYm0uY29tPgorICoKKyAqLworCisvKgorICogczM5MF9tYWNoaW5lX2tleGVjLmMgLSBoYW5kbGUgdGhlIHRyYW5zaXRpb24gb2YgTGludXggYm9vdGluZyBhbm90aGVyIGtlcm5lbAorICogb24gdGhlIFMzOTAgYXJjaGl0ZWN0dXJlLgorICovCisKKyNpbmNsdWRlIDxhc20vY2lvLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworc3RhdGljIHZvaWQga2V4ZWNfaGFsdF9hbGxfY3B1cyh2b2lkICopOworCit0eXBlZGVmIHZvaWQgKCpyZWxvY2F0ZV9rZXJuZWxfdCkgKGtpbWFnZV9lbnRyeV90ICosIHVuc2lnbmVkIGxvbmcpOworCitjb25zdCBleHRlcm4gdW5zaWduZWQgY2hhciByZWxvY2F0ZV9rZXJuZWxbXTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgcmVsb2NhdGVfa2VybmVsX2xlbjsKKworaW50CittYWNoaW5lX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJdW5zaWduZWQgbG9uZyByZWJvb3RfY29kZV9idWZmZXI7CisKKwkvKiBXZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIGJ1dCB0aGUgZGVmYXVsdCBpbWFnZSB0eXBlIGZvciBub3cuICovCisJaWYgKGltYWdlLT50eXBlICE9IEtFWEVDX1RZUEVfREVGQVVMVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSBhc3NlbWJsZXIgY29kZSBzaG91bGQgYmUgY29waWVkIHRvLiovCisJcmVib290X2NvZGVfYnVmZmVyID0gcGFnZV90b19wZm4oaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKTw8UEFHRV9TSElGVDsKKworCS8qIFRoZW4gY29weSBpdCAqLworCW1lbWNweSgodm9pZCAqKSByZWJvb3RfY29kZV9idWZmZXIsIHJlbG9jYXRlX2tlcm5lbCwKKwkgICAgICAgcmVsb2NhdGVfa2VybmVsX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK21hY2hpbmVfa2V4ZWNfY2xlYW51cChzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKK30KKwordm9pZAorbWFjaGluZV9zaHV0ZG93bih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImtleGVjOiBtYWNoaW5lX3NodXRkb3duIGNhbGxlZFxuIik7Cit9CisKK05PUkVUX1RZUEUgdm9pZAorbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwljbGVhcl9hbGxfc3ViY2hhbm5lbHMoKTsKKworCS8qIERpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCisJY3RsX2NsZWFyX2JpdCgwLDI4KTsKKworCW9uX2VhY2hfY3B1KGtleGVjX2hhbHRfYWxsX2NwdXMsIGltYWdlLCAwLCAwKTsKKwlmb3IgKDs7KTsKK30KKworc3RhdGljIHZvaWQKK2tleGVjX2hhbHRfYWxsX2NwdXModm9pZCAqa2VybmVsX2ltYWdlKQoreworCXN0YXRpYyBhdG9taWNfdCBjcHVpZCA9IEFUT01JQ19JTklUKC0xKTsKKwlpbnQgY3B1OworCXN0cnVjdCBraW1hZ2UgKmltYWdlOworCXJlbG9jYXRlX2tlcm5lbF90IGRhdGFfbW92ZXI7CisKKwlpZiAoYXRvbWljX2NvbXBhcmVfYW5kX3N3YXAoLTEsIHNtcF9wcm9jZXNzb3JfaWQoKSwgJmNwdWlkKSkKKwkJc2lnbmFsX3Byb2Nlc3NvcihzbXBfcHJvY2Vzc29yX2lkKCksIHNpZ3Bfc3RvcCk7CisKKwkvKiBXYWl0IGZvciBhbGwgb3RoZXIgY3B1cyB0byBlbnRlciBzdG9wcGVkIHN0YXRlICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQljb250aW51ZTsKKwkJd2hpbGUgKCFzbXBfY3B1X25vdF9ydW5uaW5nKGNwdSkpCisJCQljcHVfcmVsYXgoKTsKKwl9CisKKwlpbWFnZSA9IChzdHJ1Y3Qga2ltYWdlICopIGtlcm5lbF9pbWFnZTsKKwlkYXRhX21vdmVyID0gKHJlbG9jYXRlX2tlcm5lbF90KQorCQkocGFnZV90b19wZm4oaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKSA8PCBQQUdFX1NISUZUKTsKKworCS8qIENhbGwgdGhlIG1vdmluZyByb3V0aW5lICovCisJKCpkYXRhX21vdmVyKSAoJmltYWdlLT5oZWFkLCBpbWFnZS0+c3RhcnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCA3YWVhMjVkLi45ZjNkZmY2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtOTEsMTMgKzkxLDEyIEBACiAJCQkgICAgKHZvaWQgKikobG9uZykgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIH0KIAorZXh0ZXJuIHZvaWQgczM5MF9oYW5kbGVfbWNjayh2b2lkKTsKIC8qCiAgKiBUaGUgaWRsZSBsb29wIG9uIGEgUzM5MC4uLgogICovCiB2b2lkIGRlZmF1bHRfaWRsZSh2b2lkKQogewotCXBzd190IHdhaXRfcHN3OwotCXVuc2lnbmVkIGxvbmcgcmVnOwogCWludCBjcHUsIHJjOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTEyNSwzOCArMTI0LDE3IEBACiAJCWNwdV9kaWUoKTsKICNlbmRpZgogCi0JLyogCi0JICogV2FpdCBmb3IgZXh0ZXJuYWwsIEkvTyBvciBtYWNoaW5lIGNoZWNrIGludGVycnVwdCBhbmQKLQkgKiBzd2l0Y2ggb2ZmIG1hY2hpbmUgY2hlY2sgYml0IGFmdGVyIHRoZSB3YWl0IGhhcyBlbmRlZC4KLQkgKi8KLQl3YWl0X3Bzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTIHwgUFNXX01BU0tfTUNIRUNLIHwgUFNXX01BU0tfV0FJVCB8Ci0JCVBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUOwotI2lmbmRlZiBDT05GSUdfQVJDSF9TMzkwWAotCWFzbSB2b2xhdGlsZSAoCi0JCSIgICAgYmFzciAlMCwwXG4iCi0JCSIwOiAgbGEgICAlMCwxZi0wYiglMClcbiIKLQkJIiAgICBzdCAgICUwLDQoJTEpXG4iCi0JCSIgICAgb2kgICA0KCUxKSwweDgwXG4iCi0JCSIgICAgbHBzdyAwKCUxKVxuIgotCQkiMTogIGxhICAgJTAsMmYtMWIoJTApXG4iCi0JCSIgICAgc3QgICAlMCw0KCUxKVxuIgotCQkiICAgIG9pICAgNCglMSksMHg4MFxuIgotCQkiICAgIG5pICAgMSglMSksMHhmOVxuIgotCQkiICAgIGxwc3cgMCglMSlcbiIKLQkJIjI6IgotCQk6ICI9JmEiIChyZWcpIDogImEiICgmd2FpdF9wc3cpIDogIm1lbW9yeSIsICJjYyIgKTsKLSNlbHNlIC8qIENPTkZJR19BUkNIX1MzOTBYICovCi0JYXNtIHZvbGF0aWxlICgKLQkJIiAgICBsYXJsICAlMCwwZlxuIgotCQkiICAgIHN0ZyAgICUwLDgoJTEpXG4iCi0JCSIgICAgbHBzd2UgMCglMSlcbiIKLQkJIjA6ICBsYXJsICAlMCwxZlxuIgotCQkiICAgIHN0ZyAgICUwLDgoJTEpXG4iCi0JCSIgICAgbmkgICAgMSglMSksMHhmOVxuIgotCQkiICAgIGxwc3dlIDAoJTEpXG4iCi0JCSIxOiIKLQkJOiAiPSZhIiAocmVnKSA6ICJhIiAoJndhaXRfcHN3KSA6ICJtZW1vcnkiLCAiY2MiICk7Ci0jZW5kaWYgLyogQ09ORklHX0FSQ0hfUzM5MFggKi8KKwlsb2NhbF9tY2NrX2Rpc2FibGUoKTsKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfTUNDS19QRU5ESU5HKSkgeworCQlsb2NhbF9tY2NrX2VuYWJsZSgpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXMzOTBfaGFuZGxlX21jY2soKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdhaXQgZm9yIGV4dGVybmFsLCBJL08gb3IgbWFjaGluZSBjaGVjayBpbnRlcnJ1cHQuICovCisJX19sb2FkX3Bzd19tYXNrKFBTV19LRVJORUxfQklUUyB8IFBTV19NQVNLX1dBSVQgfAorCQkJUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQpOwogfQogCiB2b2lkIGNwdV9pZGxlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWU0YTYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpAQCAtMCwwICsxLDgxIEBACisvKgorICogYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUworICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUKKyAqCisgKiBBdXRob3Iocyk6IFJvbGYgQWRlbHNiZXJnZXIgPGFkZWxzYmVyZ2VyQGRlLmlibS5jb20+CisgKgorICovCisKKy8qCisgKiBtb3ZlcyB0aGUgbmV3IGtlcm5lbCB0byBpdHMgZGVzdGluYXRpb24uLi4KKyAqICVyMiA9IHBvaW50ZXIgdG8gZmlyc3Qga2ltYWdlX2VudHJ5X3QKKyAqICVyMyA9IHN0YXJ0IGFkZHJlc3MgLSB3aGVyZSB0byBqdW1wIHRvIGFmdGVyIHRoZSBqb2IgaXMgZG9uZS4uLgorICoKKyAqICVyNSB3aWxsIGJlIHVzZWQgYXMgdGVtcC4gc3RvcmFnZQorICogJXI2IGhvbGRzIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiAlcjcgPSBQQUdFX1NJWkUKKyAqICVyOCBob2xkcyB0aGUgc291cmNlIGFkZHJlc3MKKyAqICVyOSA9IFBBR0VfU0laRQorICogJXIxMCBpcyBhIHBhZ2UgbWFzaworICovCisKKwkudGV4dAorCS5nbG9ibAkJcmVsb2NhdGVfa2VybmVsCisJcmVsb2NhdGVfa2VybmVsOgorCQliYXNyCSVyMTMsMAkJI2Jhc2UgYWRkcmVzcworCS5iYXNlOgorCQlzcHgJemVybzY0LS5iYXNlKCVyMTMpCSNhYnNvbHV0ZSBhZGRyZXNzaW5nIG1vZGUKKwkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGY4CSNkaXNhYmxlIERBVCBhbmQgSVJRIChleHRlcm5hbCkKKwkJbGhpCSVyMTAsLTEJCSNwcmVwYXJpbmcgdGhlIG1hc2sKKwkJc2xsCSVyMTAsMTIJCSNzaGlmdCBpdCBzdWNoIHRoYXQgaXQgYmVjb21lcyAweGYwMDAKKwkudG9wOgorCQlsaGkJJXI3LDQwOTYJI2xvYWQgUEFHRV9TSVpFIGluIHI3CisJCWxoaQklcjksNDA5NgkjbG9hZCBQQUdFX1NJWkUgaW4gcjkKKwkJbAklcjUsMCglcjIpCSNyZWFkIGFub3RoZXIgd29yZCBmb3IgaW5kaXJlY3Rpb24gcGFnZQorCQlhaGkJJXIyLDQJCSNpbmNyZW1lbnQgcG9pbnRlcgorCQl0bWwJJXI1LDB4MQkJI2lzIGl0IGEgZGVzdGluYXRpb24gcGFnZT8KKwkJamUJLmluZGlyX2NoZWNrCSNOTywgZ290byAiaW5kaXJfY2hlY2siCisJCWxyCSVyNiwlcjUJCSNyNiA9IHI1CisJCW5yCSVyNiwlcjEwCSNtYXNrIGl0IG91dCBhbmQuLi4KKwkJagkudG9wCQkjLi4ubmV4dCBpdGVyYXRpb24KKwkuaW5kaXJfY2hlY2s6CisJCXRtbAklcjUsMHgyCQkjaXMgaXQgYSBpbmRpcmVjdGlvbiBwYWdlPworCQlqZQkuZG9uZV90ZXN0CSNOTywgZ290byAiZG9uZV90ZXN0IgorCQlucgklcjUsJXIxMAkjWUVTLCBtYXNrIG91dCwKKwkJbHIJJXIyLCVyNQkJI21vdmUgaXQgaW50byB0aGUgcmlnaHQgcmVnaXN0ZXIsCisJCWoJLnRvcAkJI2FuZCByZWFkIG5leHQuLi4KKwkuZG9uZV90ZXN0OgorCQl0bWwJJXI1LDB4NAkJI2lzIGl0IHRoZSBkb25lIGluZGljYXRvcj8KKwkJamUJLnNvdXJjZV90ZXN0CSNOTyEgV2VsbCwgdGhlbiBpdCBzaG91bGQgYmUgdGhlIHNvdXJjZSBpbmRpY2F0b3IuLi4KKwkJagkuZG9uZQkJI29rLCBsZXRzIGZpbmlzaCBpdCBoZXJlLi4uCisJLnNvdXJjZV90ZXN0OgorCQl0bWwJJXI1LDB4OAkJI2l0IHNob3VsZCBiZSBhIHNvdXJjZSBpbmRpY2F0b3IuLi4KKwkJamUJLnRvcAkJI05PLCBpZ25vcmUgaXQuLi4KKwkJbHIJJXI4LCVyNQkJI3I4ID0gcjUKKwkJbnIJJXI4LCVyMTAJI21hc2tpbmcKKwkwOgltdmNsZQklcjYsJXI4LDB4MAkjY29weSBQQUdFX1NJWkUgYnl0ZXMgZnJvbSByOCB0byByNiAtIHBhZCB3aXRoIDAKKwkJam8JMGIKKwkJagkudG9wCisJLmRvbmU6CisJCXNyCSVyMCwlcjAJCSNjbGVhciByZWdpc3RlciByMAorCQlsYQklcjQsbG9hZF9wc3ctLmJhc2UoJXIxMykJI2xvYWQgcHN3LWFkZHJlc3MgaW50byB0aGUgcmVnaXN0ZXIKKwkJbwklcjMsNCglcjQpCSNvciBsb2FkIGFkZHJlc3MgaW50byBwc3cKKwkJc3QJJXIzLDQoJXI0KQorCQltdmMJMCg4LCVyMCksMCglcjQpCSNjb3B5IHBzdyB0byBhYnNvbHV0ZSBhZGRyZXNzIDAKKwkJc3IJJXIxLCVyMQkJI2NsZWFyICVyMQorCQlzcgklcjIsJXIyCQkjY2xlYXIgJXIyCisJCXNpZ3AJJXIxLCVyMiwweDEyCSNzZXQgY3B1aWQgdG8gemVybworCQlscHN3CTAJCSNob3BlZnVsbHkgc3RhcnQgbmV3IGtlcm5lbC4uLgorCisJCS5hbGlnbgk4CisJemVybzY0OgorCQkucXVhZAkwCisJbG9hZF9wc3c6CisJCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMAorCXN5c19tc2s6CisJCS5xdWFkCTAKKwlyZWxvY2F0ZV9rZXJuZWxfZW5kOgorCS5nbG9ibAlyZWxvY2F0ZV9rZXJuZWxfbGVuCisJcmVsb2NhdGVfa2VybmVsX2xlbjoKKwkJLnF1YWQJcmVsb2NhdGVfa2VybmVsX2VuZCAtIHJlbG9jYXRlX2tlcm5lbApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWw2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWw2NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MjkwY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbDY0LlMKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIGFyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUworICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUKKyAqCisgKiBBdXRob3Iocyk6IFJvbGYgQWRlbHNiZXJnZXIgPGFkZWxzYmVyZ2VyQGRlLmlibS5jb20+CisgKgorICovCisKKy8qCisgKiBtb3ZlcyB0aGUgbmV3IGtlcm5lbCB0byBpdHMgZGVzdGluYXRpb24uLi4KKyAqICVyMiA9IHBvaW50ZXIgdG8gZmlyc3Qga2ltYWdlX2VudHJ5X3QKKyAqICVyMyA9IHN0YXJ0IGFkZHJlc3MgLSB3aGVyZSB0byBqdW1wIHRvIGFmdGVyIHRoZSBqb2IgaXMgZG9uZS4uLgorICoKKyAqICVyNSB3aWxsIGJlIHVzZWQgYXMgdGVtcC4gc3RvcmFnZQorICogJXI2IGhvbGRzIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiAlcjcgPSBQQUdFX1NJWkUKKyAqICVyOCBob2xkcyB0aGUgc291cmNlIGFkZHJlc3MKKyAqICVyOSA9IFBBR0VfU0laRQorICoKKyAqIDB4ZjAwMCBpcyBhIHBhZ2VfbWFzaworICovCisKKwkudGV4dAorCS5nbG9ibAkJcmVsb2NhdGVfa2VybmVsCisJcmVsb2NhdGVfa2VybmVsOgorCQliYXNyCSVyMTMsMAkJI2Jhc2UgYWRkcmVzcworCS5iYXNlOgorCQlzcHgJemVybzY0LS5iYXNlKCVyMTMpCSNhYnNvbHV0ZSBhZGRyZXNzaW5nIG1vZGUKKwkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGY4CSNkaXNhYmxlIERBVCBhbmQgSVJRIChleHRlcm5hbCkKKwkudG9wOgorCQlsZ2hpCSVyNyw0MDk2CSNsb2FkIFBBR0VfU0laRSBpbiByNworCQlsZ2hpCSVyOSw0MDk2CSNsb2FkIFBBR0VfU0laRSBpbiByOQorCQlsZwklcjUsMCglcjIpCSNyZWFkIGFub3RoZXIgd29yZCBmb3IgaW5kaXJlY3Rpb24gcGFnZQorCQlhZ2hpCSVyMiw4CQkjaW5jcmVtZW50IHBvaW50ZXIKKwkJdG1sCSVyNSwweDEJCSNpcyBpdCBhIGRlc3RpbmF0aW9uIHBhZ2U/CisJCWplCS5pbmRpcl9jaGVjawkjTk8sIGdvdG8gImluZGlyX2NoZWNrIgorCQlsZ3IJJXI2LCVyNQkJI3I2ID0gcjUKKwkJbmlsbAklcjYsMHhmMDAwCSNtYXNrIGl0IG91dCBhbmQuLi4KKwkJagkudG9wCQkjLi4ubmV4dCBpdGVyYXRpb24KKwkuaW5kaXJfY2hlY2s6CisJCXRtbCAgICAgJXI1LDB4MgkJI2lzIGl0IGEgaW5kaXJlY3Rpb24gcGFnZT8KKwkJamUgICAgICAuZG9uZV90ZXN0CSNOTywgZ290byAiZG9uZV90ZXN0IgorCQluaWxsICAgICVyNSwweGYwMDAJI1lFUywgbWFzayBvdXQsCisJCWxnciAgICAgJXIyLCVyNQkJI21vdmUgaXQgaW50byB0aGUgcmlnaHQgcmVnaXN0ZXIsCisJCWogICAgICAgLnRvcAkJI2FuZCByZWFkIG5leHQuLi4KKwkuZG9uZV90ZXN0OgorCQl0bWwgICAgICVyNSwweDQJCSNpcyBpdCB0aGUgZG9uZSBpbmRpY2F0b3I/CisJCWplICAgICAgLnNvdXJjZV90ZXN0CSNOTyEgV2VsbCwgdGhlbiBpdCBzaG91bGQgYmUgdGhlIHNvdXJjZSBpbmRpY2F0b3IuLi4KKwkJaiAgICAgICAuZG9uZQkJI29rLCBsZXRzIGZpbmlzaCBpdCBoZXJlLi4uCisJLnNvdXJjZV90ZXN0OgorCQl0bWwgICAgICVyNSwweDgJCSNpdCBzaG91bGQgYmUgYSBzb3VyY2UgaW5kaWNhdG9yLi4uCisJCWplICAgICAgLnRvcAkJI05PLCBpZ25vcmUgaXQuLi4KKwkJbGdyICAgICAlcjgsJXI1CQkjcjggPSByNQorCQluaWxsICAgICVyOCwweGYwMDAJI21hc2tpbmcKKwkwOgltdmNsZSAgICVyNiwlcjgsMHgwCSNjb3B5IFBBR0VfU0laRSBieXRlcyBmcm9tIHI4IHRvIHI2IC0gcGFkIHdpdGggMAorCQlqbwkwYgorCQlqICAgICAgIC50b3AKKwkuZG9uZToKKwkJc2dyICAgICAlcjAsJXIwCQkjY2xlYXIgcmVnaXN0ZXIgcjAKKwkJbGEgICAgICAlcjQsbG9hZF9wc3ctLmJhc2UoJXIxMykJI2xvYWQgcHN3LWFkZHJlc3MgaW50byB0aGUgcmVnaXN0ZXIKKwkJbwklcjMsNCglcjQpCSNvciBsb2FkIGFkZHJlc3MgaW50byBwc3cKKwkJc3QJJXIzLDQoJXI0KQorCQltdmMgICAgIDAoOCwlcjApLDAoJXI0KQkjY29weSBwc3cgdG8gYWJzb2x1dGUgYWRkcmVzcyAwCisJCXNhbTMxCQkJIzMxIGJpdCBtb2RlCisJCXNyICAgICAgJXIxLCVyMQkJI2VyYXNlIHJlZ2lzdGVyIHIxCisJCXNyICAgICAgJXIyLCVyMgkJI2VyYXNlIHJlZ2lzdGVyIHIyCisJCXNpZ3AgICAgJXIxLCVyMiwweDEyCSNzZXQgY3B1aWQgdG8gemVybworCQlscHN3ICAgIDAJCSNob3BlZnVsbHkgc3RhcnQgbmV3IGtlcm5lbC4uLgorCisJICAgICAgICAuYWxpZ24JOAorCXplcm82NDoKKwkJLnF1YWQJMAorCWxvYWRfcHN3OgorCQkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAKKwlzeXNfbXNrOgorCQkucXVhZAkwCisJcmVsb2NhdGVfa2VybmVsX2VuZDoKKwkuZ2xvYmwJcmVsb2NhdGVfa2VybmVsX2xlbgorCXJlbG9jYXRlX2tlcm5lbF9sZW46CisJCS5xdWFkCXJlbG9jYXRlX2tlcm5lbF9lbmQgLSByZWxvY2F0ZV9rZXJuZWwKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IGRmODMyMTUuLmI2ZDc0MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTE5OCwxMSArMTk4LDExIEBACiAJY2hhciAqcHRyOwogCiAgICAgICAgIGlmIChNQUNISU5FX0lTX1ZNKSB7Ci0JCV9fY3BjbWQoIlFVRVJZIENPTlNPTEUiLCBxdWVyeV9idWZmZXIsIDEwMjQpOworCQlfX2NwY21kKCJRVUVSWSBDT05TT0xFIiwgcXVlcnlfYnVmZmVyLCAxMDI0LCBOVUxMKTsKIAkJY29uc29sZV9kZXZubyA9IHNpbXBsZV9zdHJ0b3VsKHF1ZXJ5X2J1ZmZlciArIDUsIE5VTEwsIDE2KTsKIAkJcHRyID0gc3Ryc3RyKHF1ZXJ5X2J1ZmZlciwgIlNVQkNIQU5ORUwgPSIpOwogCQljb25zb2xlX2lycSA9IHNpbXBsZV9zdHJ0b3VsKHB0ciArIDEzLCBOVUxMLCAxNik7Ci0JCV9fY3BjbWQoIlFVRVJZIFRFUk0iLCBxdWVyeV9idWZmZXIsIDEwMjQpOworCQlfX2NwY21kKCJRVUVSWSBURVJNIiwgcXVlcnlfYnVmZmVyLCAxMDI0LCBOVUxMKTsKIAkJcHRyID0gc3Ryc3RyKHF1ZXJ5X2J1ZmZlciwgIkNPTk1PREUiKTsKIAkJLyoKIAkJICogU2V0IHRoZSBjb25tb2RlIHRvIDMyMTUgc28gdGhhdCB0aGUgZGV2aWNlIHJlY29nbml0aW9uIApAQCAtMjExLDcgKzIxMSw3IEBACiAJCSAqIDMyMTUgYW5kIHRoZSAzMjcwIGRyaXZlciB3aWxsIHRyeSB0byBhY2Nlc3MgdGhlIGNvbnNvbGUKIAkJICogZGV2aWNlICgzMjE1IGFzIGNvbnNvbGUgYW5kIDMyNzAgYXMgbm9ybWFsIHR0eSkuCiAJCSAqLwotCQlfX2NwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDApOworCQlfX2NwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDAsIE5VTEwpOwogCQlpZiAocHRyID09IE5VTEwpIHsKICNpZiBkZWZpbmVkKENPTkZJR19TQ0xQX0NPTlNPTEUpCiAJCQlTRVRfQ09OU09MRV9TQ0xQOwpAQCAtNDE0LDcgKzQxNCw4IEBACiAJbGMtPnByb2dyYW1fbmV3X3Bzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTOwogCWxjLT5wcm9ncmFtX25ld19wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpcGdtX2NoZWNrX2hhbmRsZXI7Ci0JbGMtPm1jY2tfbmV3X3Bzdy5tYXNrID0gUFNXX0tFUk5FTF9CSVRTOworCWxjLT5tY2NrX25ld19wc3cubWFzayA9CisJCVBTV19LRVJORUxfQklUUyAmIH5QU1dfTUFTS19NQ0hFQ0sgJiB+UFNXX01BU0tfREFUOwogCWxjLT5tY2NrX25ld19wc3cuYWRkciA9CiAJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIG1jY2tfaW50X2hhbmRsZXI7CiAJbGMtPmlvX25ld19wc3cubWFzayA9IFBTV19LRVJORUxfQklUUzsKQEAgLTQyNCwxMiArNDI1LDE4IEBACiAJbGMtPmtlcm5lbF9zdGFjayA9ICgodW5zaWduZWQgbG9uZykgJmluaXRfdGhyZWFkX3VuaW9uKSArIFRIUkVBRF9TSVpFOwogCWxjLT5hc3luY19zdGFjayA9ICh1bnNpZ25lZCBsb25nKQogCQlfX2FsbG9jX2Jvb3RtZW0oQVNZTkNfU0laRSwgQVNZTkNfU0laRSwgMCkgKyBBU1lOQ19TSVpFOwotI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSwogCWxjLT5wYW5pY19zdGFjayA9ICh1bnNpZ25lZCBsb25nKQogCQlfX2FsbG9jX2Jvb3RtZW0oUEFHRV9TSVpFLCBQQUdFX1NJWkUsIDApICsgUEFHRV9TSVpFOwotI2VuZGlmCiAJbGMtPmN1cnJlbnRfdGFzayA9ICh1bnNpZ25lZCBsb25nKSBpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mby50YXNrOwogCWxjLT50aHJlYWRfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmaW5pdF90aHJlYWRfdW5pb247CisjaWZuZGVmIENPTkZJR19BUkNIX1MzOTBYCisJaWYgKE1BQ0hJTkVfSEFTX0lFRUUpIHsKKwkJbGMtPmV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyID0gKF9fdTMyKQorCQkJX19hbGxvY19ib290bWVtKFBBR0VfU0laRSwgUEFHRV9TSVpFLCAwKTsKKwkJLyogZW5hYmxlIGV4dGVuZGVkIHNhdmUgYXJlYSAqLworCQljdGxfc2V0X2JpdCgxNCwgMjkpOworCX0KKyNlbmRpZgogI2lmZGVmIENPTkZJR19BUkNIX1MzOTBYCiAJaWYgKE1BQ0hJTkVfSEFTX0RJQUc0NCkKIAkJbGMtPmRpYWc0NF9vcGNvZGUgPSAweDgzMDAwMDQ0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggZmRmY2YwNC4uNjQyNTcyYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC0yODQsNyArMjg0LDcgQEAKIAkgKiBsb2NrcyBhcmUgYWx3YXlzIGhlbGQgZGlzYWJsZWQpLgogCSAqLwogCWlmIChNQUNISU5FX0lTX1ZNKQotCQljcGNtZCAoIklQTCIsIE5VTEwsIDApOworCQljcGNtZCAoIklQTCIsIE5VTEwsIDAsIE5VTEwpOwogCWVsc2UKIAkJcmVpcGwgKDB4MTAwMDAgfCBTMzkwX2xvd2NvcmUuaXBsX2RldmljZSk7CiB9CkBAIC0zMTMsNyArMzEzLDcgQEAKIAlpZiAoYXRvbWljX2NvbXBhcmVfYW5kX3N3YXAoLTEsIHNtcF9wcm9jZXNzb3JfaWQoKSwgJmNwdWlkKSA9PSAwKSB7CiAJCXNtcF9zZW5kX3N0b3AoKTsKIAkJaWYgKE1BQ0hJTkVfSVNfVk0gJiYgc3RybGVuKHZtaGFsdF9jbWQpID4gMCkKLQkJCWNwY21kKHZtaGFsdF9jbWQsIE5VTEwsIDApOworCQkJY3BjbWQodm1oYWx0X2NtZCwgTlVMTCwgMCwgTlVMTCk7CiAJCXNpZ25hbF9wcm9jZXNzb3Ioc21wX3Byb2Nlc3Nvcl9pZCgpLAogCQkJCSBzaWdwX3N0b3BfYW5kX3N0b3JlX3N0YXR1cyk7CiAJfQpAQCAtMzMyLDcgKzMzMiw3IEBACiAJaWYgKGF0b21pY19jb21wYXJlX2FuZF9zd2FwKC0xLCBzbXBfcHJvY2Vzc29yX2lkKCksICZjcHVpZCkgPT0gMCkgewogCQlzbXBfc2VuZF9zdG9wKCk7CiAJCWlmIChNQUNISU5FX0lTX1ZNICYmIHN0cmxlbih2bXBvZmZfY21kKSA+IDApCi0JCQljcGNtZCh2bXBvZmZfY21kLCBOVUxMLCAwKTsKKwkJCWNwY21kKHZtcG9mZl9jbWQsIE5VTEwsIDAsIE5VTEwpOwogCQlzaWduYWxfcHJvY2Vzc29yKHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkJCQkgc2lncF9zdG9wX2FuZF9zdG9yZV9zdGF0dXMpOwogCX0KQEAgLTY3OSwxMiArNjc5LDE0IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAllY19jcmVnX21hc2tfcGFybXMgY3JfcGFybXM7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzbXBfcmVzZXJ2ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKHNtcF9jcHVfcmVzZXJ2ZWRbc21wX3Byb2Nlc3Nvcl9pZCgpXSAhPSAwKSB7CisJaWYgKHNtcF9jcHVfcmVzZXJ2ZWRbY3B1XSAhPSAwKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNtcF9yZXNlcnZlX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CisJY3B1X2NsZWFyKGNwdSwgY3B1X29ubGluZV9tYXApOwogCiAjaWZkZWYgQ09ORklHX1BGQVVMVAogCS8qIERpc2FibGUgcGZhdWx0IHBzZXVkbyBwYWdlIGZhdWx0cyBvbiB0aGlzIGNwdS4gKi8KQEAgLTc3MSwxMyArNzczLDI0IEBACiAKIAkJKihsb3djb3JlX3B0cltpXSkgPSBTMzkwX2xvd2NvcmU7CiAJCWxvd2NvcmVfcHRyW2ldLT5hc3luY19zdGFjayA9IHN0YWNrICsgKEFTWU5DX1NJWkUpOwotI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSwogCQlzdGFjayA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwwKTsKIAkJaWYgKHN0YWNrID09IDBVTEwpCiAJCQlwYW5pYygic21wX2Jvb3RfY3B1cyBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKIAkJbG93Y29yZV9wdHJbaV0tPnBhbmljX3N0YWNrID0gc3RhY2sgKyAoUEFHRV9TSVpFKTsKKyNpZm5kZWYgX19zMzkweF9fCisJCWlmIChNQUNISU5FX0hBU19JRUVFKSB7CisJCQlsb3djb3JlX3B0cltpXS0+ZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIgPQorCQkJCShfX3UzMikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDApOworCQkJaWYgKGxvd2NvcmVfcHRyW2ldLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkciA9PSAwKQorCQkJCXBhbmljKCJzbXBfYm9vdF9jcHVzIGZhaWxlZCB0byAiCisJCQkJICAgICAgImFsbG9jYXRlIG1lbW9yeVxuIik7CisJCX0KICNlbmRpZgogCX0KKyNpZm5kZWYgX19zMzkweF9fCisJaWYgKE1BQ0hJTkVfSEFTX0lFRUUpCisJCWN0bF9zZXRfYml0KDE0LCAyOSk7IC8qIGVuYWJsZSBleHRlbmRlZCBzYXZlIGFyZWEgKi8KKyNlbmRpZgogCXNldF9wcmVmaXgoKHUzMikodW5zaWduZWQgbG9uZykgbG93Y29yZV9wdHJbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CiAKIAlmb3JfZWFjaF9jcHUoY3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IDUxNTkzODYuLmE4NjY4YWYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUworKysgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKQEAgLTI4NSw3ICsyODUsNyBAQAogU1lTQ0FMTChzeXNfbXFfdGltZWRyZWNlaXZlLHN5c19tcV90aW1lZHJlY2VpdmUsY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmVfd3JhcHBlcikKIFNZU0NBTEwoc3lzX21xX25vdGlmeSxzeXNfbXFfbm90aWZ5LGNvbXBhdF9zeXNfbXFfbm90aWZ5X3dyYXBwZXIpIC8qIDI3NSAqLwogU1lTQ0FMTChzeXNfbXFfZ2V0c2V0YXR0cixzeXNfbXFfZ2V0c2V0YXR0cixjb21wYXRfc3lzX21xX2dldHNldGF0dHJfd3JhcHBlcikKLU5JX1NZU0NBTEwJCQkJCQkJLyogcmVzZXJ2ZWQgZm9yIGtleGVjICovCitTWVNDQUxMKHN5c19rZXhlY19sb2FkLHN5c19rZXhlY19sb2FkLGNvbXBhdF9zeXNfa2V4ZWNfbG9hZF93cmFwcGVyKQogU1lTQ0FMTChzeXNfYWRkX2tleSxzeXNfYWRkX2tleSxjb21wYXRfc3lzX2FkZF9rZXlfd3JhcHBlcikKIFNZU0NBTEwoc3lzX3JlcXVlc3Rfa2V5LHN5c19yZXF1ZXN0X2tleSxjb21wYXRfc3lzX3JlcXVlc3Rfa2V5X3dyYXBwZXIpCiBTWVNDQUxMKHN5c19rZXljdGwsc3lzX2tleWN0bCxjb21wYXRfc3lzX2tleWN0bCkJCS8qIDI4MCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IGNhMzRiNmYuLmJjN2I3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTczNSw3ICs3MzUsNyBAQAogCQkJCQkJICAgICZleHRfaW50X3BmYXVsdCk7CiAjZW5kaWYKICNpZm5kZWYgQ09ORklHX0FSQ0hfUzM5MFgKLQkJY3BjbWQoIlNFVCBQQUdFWCBPTiIsIE5VTEwsIDApOworCQljcGNtZCgiU0VUIFBBR0VYIE9OIiwgTlVMTCwgMCwgTlVMTCk7CiAjZW5kaWYKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZXh0bWVtLmMgYi9hcmNoL3MzOTAvbW0vZXh0bWVtLmMKaW5kZXggNjQ4ZGVlZC4uYzUzNDgxMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2V4dG1lbS5jCisrKyBiL2FyY2gvczM5MC9tbS9leHRtZW0uYwpAQCAtNTc2LDggKzU3Niw4IEBACiAJCQlzZWd0eXBlX3N0cmluZ1tzZWctPnJhbmdlW2ldLnN0YXJ0ICYgMHhmZl0pOwogCX0KIAlzcHJpbnRmKGNtZDIsICJTQVZFU0VHICVzIiwgbmFtZSk7Ci0JY3BjbWQoY21kMSwgTlVMTCwgMCk7Ci0JY3BjbWQoY21kMiwgTlVMTCwgMCk7CisJY3BjbWQoY21kMSwgTlVMTCwgMCwgTlVMTCk7CisJY3BjbWQoY21kMiwgTlVMTCwgMCwgTlVMTCk7CiAJc3Bpbl91bmxvY2soJmRjc3NfbG9jayk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCBhN2M4YmZjLi5hZGM4MTA5ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtNzg0LDYgKzc4NCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKIHNvdXJjZSAiZnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9LY29uZmlnIGIvYXJjaC9zaDY0L0tjb25maWcKaW5kZXggNzA4ZTU5NzMuLjRjM2U1MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2g2NC9LY29uZmlnCisrKyBiL2FyY2gvc2g2NC9LY29uZmlnCkBAIC0yNjgsNiArMjY4LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnIGIvYXJjaC9zcGFyYy9LY29uZmlnCmluZGV4IDI2MmUxM2QuLmFjYTAyOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcKQEAgLTI2OCw2OCArMjY4LDE0IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL0tjb25maWciCiAKLWNvbmZpZyBQUklOVEVSCi0JdHJpc3RhdGUgIlBhcmFsbGVsIHByaW50ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBBUlBPUlQKLQktLS1oZWxwLS0tCi0JICBJZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIHByaW50ZXIgdG8gdGhlIHBhcmFsbGVsIHBvcnQgb2YgeW91ciBMaW51eAotCSAgYm94IChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgc2VyaWFsIHByaW50ZXI7IGlmIHRoZSBjb25uZWN0b3IgYXQgdGhlCi0JICBwcmludGVyIGhhcyA5IG9yIDI1IGhvbGVzIFsiZmVtYWxlIl0sIHRoZW4gaXQncyBzZXJpYWwpLCBzYXkgWS4KLQkgIEFsc28gcmVhZCB0aGUgUHJpbnRpbmctSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgotCi0JICBJdCBpcyBwb3NzaWJsZSB0byBzaGFyZSBvbmUgcGFyYWxsZWwgcG9ydCBhbW9uZyBzZXZlcmFsIGRldmljZXMKLQkgIChlLmcuIHByaW50ZXIgYW5kIFpJUCBkcml2ZSkgYW5kIGl0IGlzIHNhZmUgdG8gY29tcGlsZSB0aGUKLQkgIGNvcnJlc3BvbmRpbmcgZHJpdmVycyBpbnRvIHRoZSBrZXJuZWwuICBJZiB5b3Ugd2FudCB0byBjb21waWxlIHRoaXMKLQkgIGRyaXZlciBhcyBhIG1vZHVsZSBob3dldmVyLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL3BhcnBvcnQudHh0Pi4gIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbHAuCi0KLQkgIElmIHlvdSBoYXZlIHNldmVyYWwgcGFyYWxsZWwgcG9ydHMsIHlvdSBjYW4gc3BlY2lmeSB3aGljaCBwb3J0cyB0bwotCSAgdXNlIHdpdGggdGhlICJscCIga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24uICAoVHJ5ICJtYW4gYm9vdHBhcmFtIgotCSAgb3Igc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgYm9vdCBsb2FkZXIgKHNpbG8pIGFib3V0IGhvdyB0byBwYXNzCi0JICBvcHRpb25zIHRvIHRoZSBrZXJuZWwgYXQgYm9vdCB0aW1lLikgIFRoZSBzeW50YXggb2YgdGhlICJscCIgY29tbWFuZAotCSAgbGluZSBvcHRpb24gY2FuIGJlIGZvdW5kIGluIDxmaWxlOmRyaXZlcnMvY2hhci9scC5jPi4KLQotCSAgSWYgeW91IGhhdmUgbW9yZSB0aGFuIDggcHJpbnRlcnMsIHlvdSBuZWVkIHRvIGluY3JlYXNlIHRoZSBMUF9OTwotCSAgbWFjcm8gaW4gbHAuYyBhbmQgdGhlIFBBUlBPUlRfTUFYIG1hY3JvIGluIHBhcnBvcnQuaC4KLQotc291cmNlICJtbS9LY29uZmlnIgotCi1lbmRtZW51Ci0KLXNvdXJjZSAiZHJpdmVycy9iYXNlL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy92aWRlby9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvbXRkL0tjb25maWciCi0KLXNvdXJjZSAiZHJpdmVycy9zZXJpYWwvS2NvbmZpZyIKLQogaWYgIVNVTjQKIHNvdXJjZSAiZHJpdmVycy9zYnVzL2NoYXIvS2NvbmZpZyIKIGVuZGlmCiAKLXNvdXJjZSAiZHJpdmVycy9ibG9jay9LY29uZmlnIgotCi0jIERvbid0IGZyaWdodGVuIGEgY29tbW9uIFNCdXMgdXNlcgotaWYgUENJCi0KLXNvdXJjZSAiZHJpdmVycy9pZGUvS2NvbmZpZyIKLQotZW5kaWYKLQotc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL3Njc2kvS2NvbmZpZyIKLQotc291cmNlICJkcml2ZXJzL2ZjNC9LY29uZmlnIgotCi1zb3VyY2UgImRyaXZlcnMvbWQvS2NvbmZpZyIKLQotc291cmNlICJuZXQvS2NvbmZpZyIKLQogIyBUaGlzIG9uZSBtdXN0IGJlIGJlZm9yZSB0aGUgZmlsZXN5c3RlbSBjb25maWdzLiAtRGF2ZU0KIAogbWVudSAiVW5peDk4IFBUWSBzdXBwb3J0IgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCmluZGV4IDkyOGZmZWIuLjAyNWY0NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKQEAgLTU3LDExICs1NywxMSBAQAogLyoxODAqLwkubG9uZyBzeXNfZmxpc3R4YXR0ciwgc3lzX3JlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyLCBzeXNfc2lncGVuZGluZywgc3lzX25pX3N5c2NhbGwKIC8qMTg1Ki8JLmxvbmcgc3lzX3NldHBnaWQsIHN5c19mcmVtb3ZleGF0dHIsIHN5c190a2lsbCwgc3lzX2V4aXRfZ3JvdXAsIHN5c19uZXd1bmFtZQogLyoxOTAqLwkubG9uZyBzeXNfaW5pdF9tb2R1bGUsIHN5c19wZXJzb25hbGl0eSwgc3BhcmNfcmVtYXBfZmlsZV9wYWdlcywgc3lzX2Vwb2xsX2NyZWF0ZSwgc3lzX2Vwb2xsX2N0bAotLyoxOTUqLwkubG9uZyBzeXNfZXBvbGxfd2FpdCwgc3lzX25pc19zeXNjYWxsLCBzeXNfZ2V0cHBpZCwgc3BhcmNfc2lnYWN0aW9uLCBzeXNfc2dldG1hc2sKKy8qMTk1Ki8JLmxvbmcgc3lzX2Vwb2xsX3dhaXQsIHN5c19pb3ByaW9fc2V0LCBzeXNfZ2V0cHBpZCwgc3BhcmNfc2lnYWN0aW9uLCBzeXNfc2dldG1hc2sKIC8qMjAwKi8JLmxvbmcgc3lzX3NzZXRtYXNrLCBzeXNfc2lnc3VzcGVuZCwgc3lzX25ld2xzdGF0LCBzeXNfdXNlbGliLCBvbGRfcmVhZGRpcgogLyoyMDUqLwkubG9uZyBzeXNfcmVhZGFoZWFkLCBzeXNfc29ja2V0Y2FsbCwgc3lzX3N5c2xvZywgc3lzX2xvb2t1cF9kY29va2llLCBzeXNfZmFkdmlzZTY0CiAvKjIxMCovCS5sb25nIHN5c19mYWR2aXNlNjRfNjQsIHN5c190Z2tpbGwsIHN5c193YWl0cGlkLCBzeXNfc3dhcG9mZiwgc3lzX3N5c2luZm8KLS8qMjE1Ki8JLmxvbmcgc3lzX2lwYywgc3lzX3NpZ3JldHVybiwgc3lzX2Nsb25lLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19hZGp0aW1leAorLyoyMTUqLwkubG9uZyBzeXNfaXBjLCBzeXNfc2lncmV0dXJuLCBzeXNfY2xvbmUsIHN5c19pb3ByaW9fZ2V0LCBzeXNfYWRqdGltZXgKIC8qMjIwKi8JLmxvbmcgc3lzX3NpZ3Byb2NtYXNrLCBzeXNfbmlfc3lzY2FsbCwgc3lzX2RlbGV0ZV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsLCBzeXNfZ2V0cGdpZAogLyoyMjUqLwkubG9uZyBzeXNfYmRmbHVzaCwgc3lzX3N5c2ZzLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zZXRmc3VpZDE2LCBzeXNfc2V0ZnNnaWQxNgogLyoyMzAqLwkubG9uZyBzeXNfc2VsZWN0LCBzeXNfdGltZSwgc3lzX25pc19zeXNjYWxsLCBzeXNfc3RpbWUsIHN5c19zdGF0ZnM2NApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L0tjb25maWcgYi9hcmNoL3NwYXJjNjQvS2NvbmZpZwppbmRleCBlMmIwNTBlLi45YWZkMjhlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjNjQvS2NvbmZpZwpAQCAtNDMsNiArNDMsMjUgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBTRUNDT01QCisJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgorCWRlcGVuZHMgb24gUFJPQ19GUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMga2VybmVsIGZlYXR1cmUgaXMgdXNlZnVsIGZvciBudW1iZXIgY3J1bmNoaW5nIGFwcGxpY2F0aW9ucworCSAgdGhhdCBtYXkgbmVlZCB0byBjb21wdXRlIHVudHJ1c3RlZCBieXRlY29kZSBkdXJpbmcgdGhlaXIKKwkgIGV4ZWN1dGlvbi4gQnkgdXNpbmcgcGlwZXMgb3Igb3RoZXIgdHJhbnNwb3J0cyBtYWRlIGF2YWlsYWJsZSB0bworCSAgdGhlIHByb2Nlc3MgYXMgZmlsZSBkZXNjcmlwdG9ycyBzdXBwb3J0aW5nIHRoZSByZWFkL3dyaXRlCisJICBzeXNjYWxscywgaXQncyBwb3NzaWJsZSB0byBpc29sYXRlIHRob3NlIGFwcGxpY2F0aW9ucyBpbgorCSAgdGhlaXIgb3duIGFkZHJlc3Mgc3BhY2UgdXNpbmcgc2VjY29tcC4gT25jZSBzZWNjb21wIGlzCisJICBlbmFibGVkIHZpYSAvcHJvYy88cGlkPi9zZWNjb21wLCBpdCBjYW5ub3QgYmUgZGlzYWJsZWQKKwkgIGFuZCB0aGUgdGFzayBpcyBvbmx5IGFsbG93ZWQgdG8gZXhlY3V0ZSBhIGZldyBzYWZlIHN5c2NhbGxzCisJICBkZWZpbmVkIGJ5IGVhY2ggc2VjY29tcCBtb2RlLgorCisJICBJZiB1bnN1cmUsIHNheSBZLiBPbmx5IGVtYmVkZGVkIHNob3VsZCBzYXkgTiBoZXJlLgorCitzb3VyY2Uga2VybmVsL0tjb25maWcuaHoKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIGNvbmZpZyBTWVNWSVBDX0NPTVBBVApAQCAtNDQ0LDYgKzQ2MywyNCBAQAogCSAgSWYgeW91IGhhdmUgbW9yZSB0aGFuIDggcHJpbnRlcnMsIHlvdSBuZWVkIHRvIGluY3JlYXNlIHRoZSBMUF9OTwogCSAgbWFjcm8gaW4gbHAuYyBhbmQgdGhlIFBBUlBPUlRfTUFYIG1hY3JvIGluIHBhcnBvcnQuaC4KIAorY29uZmlnIFBQREVWCisJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHVzZXItc3BhY2UgcGFyYWxsZWwgcG9ydCBkZXZpY2UgZHJpdmVycyIKKwlkZXBlbmRzIG9uIFBBUlBPUlQKKwktLS1oZWxwLS0tCisJICBTYXlpbmcgWSB0byB0aGlzIGFkZHMgc3VwcG9ydCBmb3IgL2Rldi9wYXJwb3J0IGRldmljZSBub2Rlcy4gIFRoaXMKKwkgIGlzIG5lZWRlZCBmb3IgcHJvZ3JhbXMgdGhhdCB3YW50IHBvcnRhYmxlIGFjY2VzcyB0byB0aGUgcGFyYWxsZWwKKwkgIHBvcnQsIGZvciBpbnN0YW5jZSBkZXZpY2VpZCAod2hpY2ggZGlzcGxheXMgUGx1Zy1hbmQtUGxheSBkZXZpY2UKKwkgIElEcykuCisKKwkgIFRoaXMgaXMgdGhlIHBhcmFsbGVsIHBvcnQgZXF1aXZhbGVudCBvZiBTQ1NJIGdlbmVyaWMgc3VwcG9ydCAoc2cpLgorCSAgSXQgaXMgc2FmZSB0byBzYXkgTiB0byB0aGlzIC0tIGl0IGlzIG5vdCBuZWVkZWQgZm9yIG5vcm1hbCBwcmludGluZworCSAgb3IgcGFyYWxsZWwgcG9ydCBDRC1ST00vZGlzayBzdXBwb3J0LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwcGRldi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEVOVkNUUkwKIAl0cmlzdGF0ZSAiU1VOVywgZW52Y3RybCBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCkBAIC00ODgsNiArNTI1LDggQEAKIAogZW5kbWVudQogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvdmlkZW8vS2NvbmZpZyIKQEAgLTUxNCw3ICs1NTMsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKIApAQCAtNjEwLDYgKzY0OSw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9pMmMvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2h3bW9uL0tjb25maWciCisKIHNvdXJjZSAiZnMvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21lZGlhL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMKaW5kZXggYTA3MTZjYy4uODg1MmMyMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9hdXhpby5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9lYnVzLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CiAKLS8qIFRoaXMgY2Fubm90IGJlIHN0YXRpYywgYXMgaXQgaXMgcmVmZXJlbmNlZCBpbiBlbnRyeS5TICovCisvKiBUaGlzIGNhbm5vdCBiZSBzdGF0aWMsIGFzIGl0IGlzIHJlZmVyZW5jZWQgaW4gaXJxLmMgKi8KIHZvaWQgX19pb21lbSAqYXV4aW9fcmVnaXN0ZXIgPSBOVUxMOwogCiBlbnVtIGF1eGlvX3R5cGUgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9kdGxiX2JhY2tlbmQuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZHRsYl9iYWNrZW5kLlMKaW5kZXggYjczYTNjOC4uNTM4NTIyOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9kdGxiX2JhY2tlbmQuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2R0bGJfYmFja2VuZC5TCkBAIC0xNiw3ICsxNiw3IEBACiAjZWxpZiBQQUdFX1NISUZUID09IDE5CiAjZGVmaW5lIFNaX0JJVFMJCV9QQUdFX1NaNTEySwogI2VsaWYgUEFHRV9TSElGVCA9PSAyMgotI2RlZmluZSBTWl9CSVRTCQlfUEFHRV9TWjRNCisjZGVmaW5lIFNaX0JJVFMJCV9QQUdFX1NaNE1CCiAjZW5kaWYKIAogI2RlZmluZSBWQUxJRF9TWl9CSVRTCShfUEFHRV9WQUxJRCB8IFNaX0JJVFMpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VudHJ5LlMKaW5kZXggYTQ3ZjJkMC4uZDc4MWYxMCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZW50cnkuUwpAQCAtMjIsOCArMjIsNiBAQAogI2luY2x1ZGUgPGFzbS9lc3RhdGUuaD4KICNpbmNsdWRlIDxhc20vYXV4aW8uaD4KIAotLyogI2RlZmluZSBTWVNDQUxMX1RSQUNJTkcJMSAqLwotCiAjZGVmaW5lIGN1cnB0ciAgICAgIGc2CiAKICNkZWZpbmUgTlJfU1lTQ0FMTFMgMjg0ICAgICAgLyogRWFjaCBPUyBpcyBkaWZmZXJlbnQuLi4gKi8KQEAgLTI3MSw4ICsyNjksOSBAQAogCWZtdWxkCQklZjAsICVmMiwgJWYyNgogCWZhZGRkCQklZjAsICVmMiwgJWYyOAogCWZtdWxkCQklZjAsICVmMiwgJWYzMAorCW1lbWJhcgkJI1N5bmMKIAliLHB0CQkleGNjLCBmcGRpc19leGl0Ci0JIG1lbWJhcgkJI1N5bmMKKwkgbm9wCiAyOglhbmRjYwkJJWc1LCBGUFJTX0RVLCAlZzAKIAlibmUscHQJCSVpY2MsIDNmCiAJIGZ6ZXJvCQklZjMyCkBAIC0zMDEsOCArMzAwLDkgQEAKIAlmbXVsZAkJJWYzMiwgJWYzNCwgJWY1OAogCWZhZGRkCQklZjMyLCAlZjM0LCAlZjYwCiAJZm11bGQJCSVmMzIsICVmMzQsICVmNjIKKwltZW1iYXIJCSNTeW5jCiAJYmEscHQJCSV4Y2MsIGZwZGlzX2V4aXQKLQkgbWVtYmFyCQkjU3luYworCSBub3AKIDM6CW1vdgkJU0VDT05EQVJZX0NPTlRFWFQsICVnMwogCWFkZAkJJWc2LCBUSV9GUFJFR1MsICVnMQogCWxkeGEJCVslZzNdIEFTSV9ETU1VLCAlZzUKQEAgLTU1MSwxMyArNTUxLDExIEBACiAJc2xseAkJJWczLCA1LCAlZzMKIAlvcgkJJWcyLCAlbG8oaXZlY3Rvcl90YWJsZSksICVnMgogCWFkZAkJJWcyLCAlZzMsICVnMwotCWxkeAkJWyVnMyArIDB4MDhdLCAlZzIJLyogaXJxX2luZm8gKi8KIAlsZHViCQlbJWczICsgMHgwNF0sICVnNAkvKiBwaWwgKi8KLQlicnoscG4JCSVnMiwgZG9faXZlY19zcHVyaW91cwotCSBtb3YJCTEsICVnMgotCisJbW92CQkxLCAlZzIKIAlzbGx4CQklZzIsICVnNCwgJWcyCiAJc2xseAkJJWc0LCAyLCAlZzQKKwogCWxkdXcJCVslZzYgKyAlZzRdLCAlZzUJLyogZzUgPSBpcnFfd29yayhjcHUsIHBpbCkgKi8KIAlzdHcJCSVnNSwgWyVnMyArIDB4MDBdCS8qIGJ1Y2tldC0+aXJxX2NoYWluID0gZzUgKi8KIAlzdHcJCSVnMywgWyVnNiArICVnNF0JLyogaXJxX3dvcmsoY3B1LCBwaWwpID0gYnVja2V0ICovCkBAIC01NjUsOSArNTYzLDkgQEAKIAlyZXRyeQogZG9faXZlY194Y2FsbDoKIAltb3YJCTB4NTAsICVnMQotCiAJbGR4YQkJWyVnMSArICVnMF0gQVNJX0lOVFJfUiwgJWcxCiAJc3JsCQklZzMsIDAsICVnMworCiAJbW92CQkweDYwLCAlZzcKIAlsZHhhCQlbJWc3ICsgJWcwXSBBU0lfSU5UUl9SLCAlZzcKIAlzdHhhCQklZzAsIFslZzBdIEFTSV9JTlRSX1JFQ0VJVkUKQEAgLTU3OSwxOSArNTc3LDYgQEAKIDE6CWptcGwJCSVnMywgJWcwCiAJIG5vcAogCi1kb19pdmVjX3NwdXJpb3VzOgotCXN0dwkJJWczLCBbJWc2ICsgMHgwMF0JLyogaXJxX3dvcmsoY3B1LCAwKSA9IGJ1Y2tldCAqLwotCXJkcHIJCSVwc3RhdGUsICVnNQotCi0Jd3JwcgkJJWc1LCBQU1RBVEVfSUcgfCBQU1RBVEVfQUcsICVwc3RhdGUKLQlzZXRoaQkJJWhpKDEwOWYpLCAlZzcKLQliYSxwdAkJJXhjYywgZXRyYXAKLTEwOToJIG9yCQklZzcsICVsbygxMDliKSwgJWc3Ci0JY2FsbAkJY2F0Y2hfZGlzYWJsZWRfaXZlYwotCSBhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCi0JYmEscHQJCSV4Y2MsIHJ0cmFwCi0JIGNscgkJJWw2Ci0KIAkuZ2xvYmwJCXNhdmVfYWx0ZXJuYXRlX2dsb2JhbHMKIHNhdmVfYWx0ZXJuYXRlX2dsb2JhbHM6IC8qICVvMCA9IHNhdmVfYXJlYSAqLwogCXJkcHIJCSVwc3RhdGUsICVvNQpAQCAtNjk5LDExNiArNjg0LDYgQEAKIAliYSxwdAkJJXhjYywgcnRyYXAKIAkgY2xyCQklbDYKIAotI2lmZGVmIENPTkZJR19CTEtfREVWX0ZECi0JLmdsb2JsCQlmbG9wcHlfaGFyZGludAotZmxvcHB5X2hhcmRpbnQ6Ci0Jd3IJCSVnMCwgKDEgPDwgMTEpLCAlY2xlYXJfc29mdGludAotCXNldGhpCQklaGkoZG9pbmdfcGRtYSksICVnMQotCWxkCQlbJWcxICsgJWxvKGRvaW5nX3BkbWEpXSwgJWcyCi0JYnJ6LHBuCQklZzIsIGZsb3BweV9kb3NvZnRpbnQKLQkgc2V0aGkJCSVoaShmZGNfc3RhdHVzKSwgJWczCi0JbGR4CQlbJWczICsgJWxvKGZkY19zdGF0dXMpXSwgJWczCi0Jc2V0aGkJCSVoaShwZG1hX3ZhZGRyKSwgJWc1Ci0JbGR4CQlbJWc1ICsgJWxvKHBkbWFfdmFkZHIpXSwgJWc0Ci0Jc2V0aGkJCSVoaShwZG1hX3NpemUpLCAlZzUKLQlsZHgJCVslZzUgKyAlbG8ocGRtYV9zaXplKV0sICVnNQotCi1uZXh0X2J5dGU6Ci0JbGR1YmEJCVslZzNdIEFTSV9QSFlTX0JZUEFTU19FQ19FLCAlZzcKLQlhbmRjYwkJJWc3LCAweDgwLCAlZzAKLQliZSxwbgkJJWljYywgZmxvcHB5X2ZpZm9fZW1wdGllZAotCSBhbmRjYwkJJWc3LCAweDIwLCAlZzAKLQliZSxwbgkJJWljYywgZmxvcHB5X292ZXJydW4KLQkgYW5kY2MJCSVnNywgMHg0MCwgJWcwCi0JYmUscG4JCSVpY2MsIGZsb3BweV93cml0ZQotCSBzdWIJCSVnNSwgMSwgJWc1Ci0KLQlpbmMJCSVnMwotCWxkdWJhCQlbJWczXSBBU0lfUEhZU19CWVBBU1NfRUNfRSwgJWc3Ci0JZGVjCQklZzMKLQlvcmNjCQklZzAsICVnNSwgJWcwCi0Jc3RiCQklZzcsIFslZzRdCi0JYm5lLHBuCQkleGNjLCBuZXh0X2J5dGUKLQkgYWRkCQklZzQsIDEsICVnNAotCi0JYixwdAkJJXhjYywgZmxvcHB5X3Rkb25lCi0JIG5vcAotCi1mbG9wcHlfd3JpdGU6Ci0JbGR1YgkJWyVnNF0sICVnNwotCW9yY2MJCSVnMCwgJWc1LCAlZzAKLQlpbmMJCSVnMwotCXN0YmEJCSVnNywgWyVnM10gQVNJX1BIWVNfQllQQVNTX0VDX0UKLQlkZWMJCSVnMwotCWJuZSxwbgkJJXhjYywgbmV4dF9ieXRlCi0JIGFkZAkJJWc0LCAxLCAlZzQKLQotZmxvcHB5X3Rkb25lOgotCXNldGhpCQklaGkocGRtYV92YWRkciksICVnMQotCXN0eAkJJWc0LCBbJWcxICsgJWxvKHBkbWFfdmFkZHIpXQotCXNldGhpCQklaGkocGRtYV9zaXplKSwgJWcxCi0Jc3R4CQklZzUsIFslZzEgKyAlbG8ocGRtYV9zaXplKV0KLQlzZXRoaQkJJWhpKGF1eGlvX3JlZ2lzdGVyKSwgJWcxCi0JbGR4CQlbJWcxICsgJWxvKGF1eGlvX3JlZ2lzdGVyKV0sICVnNwotCWxkdWJhCQlbJWc3XSBBU0lfUEhZU19CWVBBU1NfRUNfRSwgJWc1Ci0Jb3IJCSVnNSwgQVVYSU9fQVVYMV9GVENOVCwgJWc1Ci0vKglhbmRuCQklZzUsIEFVWElPX0FVWDFfTUFTSywgJWc1ICovCi0Jc3RiYQkJJWc1LCBbJWc3XSBBU0lfUEhZU19CWVBBU1NfRUNfRQotCWFuZG4JCSVnNSwgQVVYSU9fQVVYMV9GVENOVCwgJWc1Ci0vKglhbmRuCQklZzUsIEFVWElPX0FVWDFfTUFTSywgJWc1ICovCi0KLQlub3A7IG5vcDsgIG5vcDsgbm9wOyAgbm9wOyBub3A7Ci0Jbm9wOyBub3A7ICBub3A7IG5vcDsgIG5vcDsgbm9wOwotCi0Jc3RiYQkJJWc1LCBbJWc3XSBBU0lfUEhZU19CWVBBU1NfRUNfRQotCXNldGhpCQklaGkoZG9pbmdfcGRtYSksICVnMQotCWIscHQJCSV4Y2MsIGZsb3BweV9kb3NvZnRpbnQKLQkgc3QJCSVnMCwgWyVnMSArICVsbyhkb2luZ19wZG1hKV0KLQotZmxvcHB5X2ZpZm9fZW1wdGllZDoKLQlzZXRoaQkJJWhpKHBkbWFfdmFkZHIpLCAlZzEKLQlzdHgJCSVnNCwgWyVnMSArICVsbyhwZG1hX3ZhZGRyKV0KLQlzZXRoaQkJJWhpKHBkbWFfc2l6ZSksICVnMQotCXN0eAkJJWc1LCBbJWcxICsgJWxvKHBkbWFfc2l6ZSldCi0Jc2V0aGkJCSVoaShpcnFfYWN0aW9uKSwgJWcxCi0Jb3IJCSVnMSwgJWxvKGlycV9hY3Rpb24pLCAlZzEKLQlsZHgJCVslZzEgKyAoMTEgPDwgMyldLCAlZzMJCSEgaXJxYWN0aW9uW2Zsb3BweV9pcnFdCi0JbGR4CQlbJWczICsgMHgwOF0sICVnNAkJISBhY3Rpb24tPmZsYWdzPj40OD09aW5vCi0Jc2V0aGkJCSVoaShpdmVjdG9yX3RhYmxlKSwgJWczCi0Jc3JseAkJJWc0LCA0OCwgJWc0Ci0Jb3IJCSVnMywgJWxvKGl2ZWN0b3JfdGFibGUpLCAlZzMKLQlzbGx4CQklZzQsIDUsICVnNAotCWxkeAkJWyVnMyArICVnNF0sICVnNAkJISAmaXZlY3Rvcl90YWJsZVtpbm9dCi0JbGR4CQlbJWc0ICsgMHgxMF0sICVnNAkJISBidWNrZXQtPmljbHIKLQlzdHdhCQklZzAsIFslZzRdIEFTSV9QSFlTX0JZUEFTU19FQ19FCSEgSUNMUl9JRExFCi0JbWVtYmFyCQkjU3luYwkJCQkhIHByb2JhYmx5IG5vdCBuZWVkZWQuLi4KLQlyZXRyeQotCi1mbG9wcHlfb3ZlcnJ1bjoKLQlzZXRoaQkJJWhpKHBkbWFfdmFkZHIpLCAlZzEKLQlzdHgJCSVnNCwgWyVnMSArICVsbyhwZG1hX3ZhZGRyKV0KLQlzZXRoaQkJJWhpKHBkbWFfc2l6ZSksICVnMQotCXN0eAkJJWc1LCBbJWcxICsgJWxvKHBkbWFfc2l6ZSldCi0Jc2V0aGkJCSVoaShkb2luZ19wZG1hKSwgJWcxCi0Jc3QJCSVnMCwgWyVnMSArICVsbyhkb2luZ19wZG1hKV0KLQotZmxvcHB5X2Rvc29mdGludDoKLQlyZHByCQklcGlsLCAlZzIKLQl3cnByCQklZzAsIDE1LCAlcGlsCi0Jc2V0aGkJCSVoaSgxMDlmKSwgJWc3Ci0JYixwdAkJJXhjYywgZXRyYXBfaXJxCi0xMDk6CSBvcgkJJWc3LCAlbG8oMTA5YiksICVnNwotCi0JbW92CQkxMSwgJW8wCi0JbW92CQkwLCAlbzEKLQljYWxsCQlzcGFyY19mbG9wcHlfaXJxCi0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzIKLQotCWIscHQJCSV4Y2MsIHJ0cmFwX2lycQotCSBub3AKLQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0ZEICovCi0KIAkvKiBYWFggSGVyZSBpcyBzdHVmZiB3ZSBzdGlsbCBuZWVkIHRvIHdyaXRlLi4uIC1EYXZlTSBYWFggKi8KIAkuZ2xvYmwJCW5ldGJzZF9zeXNjYWxsCiBuZXRic2Rfc3lzY2FsbDoKQEAgLTE2NzcsMTEgKzE1NTIsMTIgQEAKIAkJbm9wCiAJCS5hbGlnbgkJMzIKIDE6CQlsZHgJCVslY3VycHRyICsgVElfRkxBR1NdLCAlbDUKLQkJYW5kY2MJCSVsNSwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlZzAKKwkJYW5kY2MJCSVsNSwgKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NFQ0NPTVB8X1RJRl9TWVNDQUxMX0FVRElUKSwgJWcwCiAJCWJlLHB0CQklaWNjLCBydHJhcAogCQkgY2xyCQklbDYKKwkJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCQljYWxsCQlzeXNjYWxsX3RyYWNlCi0JCSBub3AKKwkJIG1vdgkJMSwgJW8xCiAKIAkJYmEscHQJCSV4Y2MsIHJ0cmFwCiAJCSBjbHIJCSVsNgpAQCAtMTc2NSwxOCArMTY0MSwyMCBAQAogCSBvcgkJJWw3LCAlbG8oc3lzX25pX3N5c2NhbGwpLCAlbDcKIAogbGludXhfc3lzY2FsbF90cmFjZTMyOgorCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAljYWxsCQlzeXNjYWxsX3RyYWNlCi0JIG5vcAorCSBjbHIJCSVvMQogCXNybAkJJWkwLCAwLCAlbzAKLQltb3YJCSVpNCwgJW80CisJc3JsCQklaTQsIDAsICVvNAogCXNybAkJJWkxLCAwLCAlbzEKIAlzcmwJCSVpMiwgMCwgJW8yCiAJYixwdAkJJXhjYywgMmYKIAkgc3JsCQklaTMsIDAsICVvMwogCiBsaW51eF9zeXNjYWxsX3RyYWNlOgorCWFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKIAljYWxsCQlzeXNjYWxsX3RyYWNlCi0JIG5vcAorCSBjbHIJCSVvMQogCW1vdgkJJWkwLCAlbzAKIAltb3YJCSVpMSwgJW8xCiAJbW92CQklaTIsICVvMgpAQCAtMTc5NCwxMSArMTY3Miw2IEBACiAJYmdldSxwbgkJJXhjYywgbGludXhfc3BhcmNfbmlfc3lzY2FsbAkJISBDVEkKIAkgc3JsCQklaTAsIDAsICVvMAkJCQkhIElFVTAKIAlzbGwJCSVnMSwgMiwgJWw0CQkJCSEgSUVVMAlHcm91cAotI2lmZGVmIFNZU0NBTExfVFJBQ0lORwotCWNhbGwJCXN5c2NhbGxfdHJhY2VfZW50cnkKLQkgYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAotCXNybAkJJWkwLCAwLCAlbzAKLSNlbmRpZgogCXNybAkJJWk0LCAwLCAlbzQJCQkJISBJRVUxCiAJbGR1dwkJWyVsNyArICVsNF0sICVsNwkJCSEgTG9hZAogCXNybAkJJWkxLCAwLCAlbzEJCQkJISBJRVUwCUdyb3VwCkBAIC0xODA2LDcgKzE2NzksNyBAQAogCiAJc3JsCQklaTUsIDAsICVvNQkJCQkhIElFVTEKIAlzcmwJCSVpMiwgMCwgJW8yCQkJCSEgSUVVMAlHcm91cAotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWcwCQkhIElFVTAJR3JvdXAKKwlhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAlibmUscG4JCSVpY2MsIGxpbnV4X3N5c2NhbGxfdHJhY2UzMgkJISBDVEkKIAkgbW92CQklaTAsICVsNQkJCQkhIElFVTEKIAljYWxsCQklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKQEAgLTE4MjIsMTEgKzE2OTUsNiBAQAogCWJnZXUscG4JCSV4Y2MsIGxpbnV4X3NwYXJjX25pX3N5c2NhbGwJCSEgQ1RJCiAJIG1vdgkJJWkwLCAlbzAJCQkJISBJRVUwCiAJc2xsCQklZzEsIDIsICVsNAkJCQkhIElFVTAJR3JvdXAKLSNpZmRlZiBTWVNDQUxMX1RSQUNJTkcKLQljYWxsCQlzeXNjYWxsX3RyYWNlX2VudHJ5Ci0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQltb3YJCSVpMCwgJW8wCi0jZW5kaWYKIAltb3YJCSVpMSwgJW8xCQkJCSEgSUVVMQogCWxkdXcJCVslbDcgKyAlbDRdLCAlbDcJCQkhIExvYWQKIDQ6CW1vdgkJJWkyLCAlbzIJCQkJISBJRVUwCUdyb3VwCkBAIC0xODM0LDcgKzE3MDIsNyBAQAogCiAJbW92CQklaTMsICVvMwkJCQkhIElFVTEKIAltb3YJCSVpNCwgJW80CQkJCSEgSUVVMAlHcm91cAotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWcwCQkhIElFVTEJR3JvdXArMSBidWJibGUKKwlhbmRjYwkJJWwwLCAoX1RJRl9TWVNDQUxMX1RSQUNFfF9USUZfU0VDQ09NUHxfVElGX1NZU0NBTExfQVVESVQpLCAlZzAKIAlibmUscG4JCSVpY2MsIGxpbnV4X3N5c2NhbGxfdHJhY2UJCSEgQ1RJCUdyb3VwCiAJIG1vdgkJJWkwLCAlbDUJCQkJISBJRVUwCiAyOgljYWxsCQklbDcJCQkJCSEgQ1RJCUdyb3VwIGJyayBmb3JjZWQKQEAgLTE4NDMsMTIgKzE3MTEsNiBAQAogCiAzOglzdHgJCSVvMCwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9JMF0KIHJldF9zeXNfY2FsbDoKLSNpZmRlZiBTWVNDQUxMX1RSQUNJTkcKLQltb3YJCSVvMCwgJW8xCi0JY2FsbAkJc3lzY2FsbF90cmFjZV9leGl0Ci0JIGFkZAkJJXNwLCBQVFJFR1NfT0ZGLCAlbzAKLQltb3YJCSVvMSwgJW8wCi0jZW5kaWYKIAlsZHgJCVslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVFNUQVRFXSwgJWczCiAJbGR4CQlbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdLCAlbDEgISBwYyA9IG5wYwogCXNyYQkJJW8wLCAwLCAlbzAKQEAgLTE4NjgsNyArMTczMCw3IEBACiAxOgogCWNtcAkJJW8wLCAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLCiAJYmdldSxwbgkJJXhjYywgMWYKLQkgYW5kY2MJCSVsMCwgX1RJRl9TWVNDQUxMX1RSQUNFLCAlbDYJCisJIGFuZGNjCQklbDAsIChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TRUNDT01QfF9USUZfU1lTQ0FMTF9BVURJVCksICVsNgogODA6CiAJLyogU3lzdGVtIGNhbGwgc3VjY2VzcywgY2xlYXIgQ2FycnkgY29uZGl0aW9uIGNvZGUuICovCiAJYW5kbgkJJWczLCAlZzIsICVnMwpAQCAtMTg4Myw3ICsxNzQ1LDcgQEAKIAkvKiBTeXN0ZW0gY2FsbCBmYWlsdXJlLCBzZXQgQ2FycnkgY29uZGl0aW9uIGNvZGUuCiAJICogQWxzbywgZ2V0IGFicyhlcnJubykgdG8gcmV0dXJuIHRvIHRoZSBwcm9jZXNzLgogCSAqLwotCWFuZGNjCQklbDAsIF9USUZfU1lTQ0FMTF9UUkFDRSwgJWw2CQorCWFuZGNjCQklbDAsIChfVElGX1NZU0NBTExfVFJBQ0V8X1RJRl9TRUNDT01QfF9USUZfU1lTQ0FMTF9BVURJVCksICVsNgkKIAlzdWIJCSVnMCwgJW8wLCAlbzAKIAlvcgkJJWczLCAlZzIsICVnMwogCXN0eAkJJW8wLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X0kwXQpAQCAtMTg5Niw4ICsxNzU4LDkgQEAKIAliLHB0CQkleGNjLCBydHJhcAogCSBzdHgJCSVsMiwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UTlBDXQogbGludXhfc3lzY2FsbF90cmFjZTI6CisJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJCXN5c2NhbGxfdHJhY2UKLQkgbm9wCisJIG1vdgkJMSwgJW8xCiAJc3R4CQklbDEsIFslc3AgKyBQVFJFR1NfT0ZGICsgUFRfVjlfVFBDXQogCWJhLHB0CQkleGNjLCBydHJhcAogCSBzdHgJCSVsMiwgWyVzcCArIFBUUkVHU19PRkYgKyBQVF9WOV9UTlBDXQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKaW5kZXggNGRjYjhhZi4uZGFhMmZiOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vY3B1ZGF0YS5oPgorI2luY2x1ZGUgPGFzbS9hdXhpby5oPgogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIHZvaWQgZGlzdHJpYnV0ZV9pcnFzKHZvaWQpOwpAQCAtNzAsMzEgKzcxLDcgQEAKIHN0cnVjdCBpcnFfd29ya19zdHJ1Y3QgX19pcnFfd29ya1tOUl9DUFVTXTsKICNkZWZpbmUgaXJxX3dvcmsoX19jcHUsIF9fcGlsKQkmKF9faXJxX3dvcmtbKF9fY3B1KV0uaXJxX3dvcmtsaXN0c1soX19waWwpXSkKIAotI2lmZGVmIENPTkZJR19QQ0kKLS8qIFRoaXMgaXMgYSB0YWJsZSBvZiBwaHlzaWNhbCBhZGRyZXNzZXMgdXNlZCB0byBkZWFsIHdpdGggSUJGX0RNQV9TWU5DLgotICogSXQgaXMgdXNlZCBmb3IgUENJIG9ubHkgdG8gc3luY2hyb25pemUgRE1BIHRyYW5zZmVycyB3aXRoIElSUSBkZWxpdmVyeQotICogZm9yIGRldmljZXMgYmVoaW5kIGJ1c3NlcyBvdGhlciB0aGFuIEFQQiBvbiBTYWJyZSBzeXN0ZW1zLgotICoKLSAqIEN1cnJlbnRseSB0aGVzZSBwaHlzaWNhbCBhZGRyZXNzZXMgYXJlIGp1c3QgY29uZmlnIHNwYWNlIGFjY2Vzc2VzCi0gKiB0byB0aGUgY29tbWFuZCByZWdpc3RlciBmb3IgdGhhdCBkZXZpY2UuCi0gKi8KLXVuc2lnbmVkIGxvbmcgcGNpX2RtYV93c3luYzsKLXVuc2lnbmVkIGxvbmcgZG1hX3N5bmNfcmVnX3RhYmxlWzI1Nl07Ci11bnNpZ25lZCBjaGFyIGRtYV9zeW5jX3JlZ190YWJsZV9lbnRyeSA9IDA7Ci0jZW5kaWYKLQotLyogVGhpcyBpcyBiYXNlZCB1cG9uIGNvZGUgaW4gdGhlIDMyLWJpdCBTcGFyYyBrZXJuZWwgd3JpdHRlbiBtb3N0bHkgYnkKLSAqIERhdmlkIFJlZG1hbiAoZGpockB0YWRwb2xlLmNvLnVrKS4KLSAqLwotI2RlZmluZSBNQVhfU1RBVElDX0FMTE9DCTQKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHN0YXRpY19pcnFhY3Rpb25bTUFYX1NUQVRJQ19BTExPQ107Ci1zdGF0aWMgaW50IHN0YXRpY19pcnFfY291bnQ7Ci0KLS8qIFRoaXMgaXMgZXhwb3J0ZWQgc28gdGhhdCBmYXN0IElSUSBoYW5kbGVycyBjYW4gZ2V0IGF0IGl0Li4uIC1EYXZlTSAqLwotc3RydWN0IGlycWFjdGlvbiAqaXJxX2FjdGlvbltOUl9JUlFTKzFdID0gewotCSAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCAsIE5VTEwsIE5VTEwsCi0JICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICwgTlVMTCwgTlVMTAotfTsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uICppcnFfYWN0aW9uW05SX0lSUVMrMV07CiAKIC8qIFRoaXMgb25seSBzeW5jaHJvbml6ZXMgZW50aXRpZXMgd2hpY2ggbW9kaWZ5IElSUSBoYW5kbGVyCiAgKiBzdGF0ZSBhbmQgc29tZSBzZWxlY3RlZCB1c2VyLWxldmVsIHNwb3RzIHRoYXQgd2FudCB0bwpAQCAtMjQwLDE3ICsyMTcsMjIgQEAKICAqIHRoZSBDUFUgJXRpY2sgcmVnaXN0ZXIgYW5kIG5vdCBieSBzb21lIG5vcm1hbCB2ZWN0b3JlZCBpbnRlcnJ1cHQKICAqIHNvdXJjZS4gIFRvIGhhbmRsZSB0aGlzIHNwZWNpYWwgY2FzZSwgd2UgdXNlIHRoaXMgZHVtbXkgSU5PIGJ1Y2tldC4KICAqLworc3RhdGljIHN0cnVjdCBpcnFfZGVzYyBwaWwwX2R1bW15X2Rlc2M7CiBzdGF0aWMgc3RydWN0IGlub19idWNrZXQgcGlsMF9kdW1teV9idWNrZXQgPSB7Ci0JMCwJLyogaXJxX2NoYWluICovCi0JMCwJLyogcGlsICovCi0JMCwJLyogcGVuZGluZyAqLwotCTAsCS8qIGZsYWdzICovCi0JMCwJLyogX191bnVzZWQgKi8KLQlOVUxMLAkvKiBpcnFfaW5mbyAqLwotCTBVTCwJLyogaWNsciAqLwotCTBVTCwJLyogaW1hcCAqLworCS5pcnFfaW5mbwk9CSZwaWwwX2R1bW15X2Rlc2MsCiB9OwogCitzdGF0aWMgdm9pZCBidWlsZF9pcnFfZXJyb3IoY29uc3QgY2hhciAqbXNnLCB1bnNpZ25lZCBpbnQgaW5vLCBpbnQgcGlsLCBpbnQgaW5vZml4dXAsCisJCQkgICAgdW5zaWduZWQgbG9uZyBpY2xyLCB1bnNpZ25lZCBsb25nIGltYXAsCisJCQkgICAgc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCkKK3sKKwlwcm9tX3ByaW50ZigiSVJROiBJTk8gJTA0eCAoJWQ6JTAxNmx4OiUwMTZseCkgLS0+ICIKKwkJICAgICIoJWQ6JWQ6JTAxNmx4OiUwMTZseCksIGhhbHRpbmcuLi5cbiIsCisJCSAgICBpbm8sIGJ1Y2tldC0+cGlsLCBidWNrZXQtPmljbHIsIGJ1Y2tldC0+aW1hcCwKKwkJICAgIHBpbCwgaW5vZml4dXAsIGljbHIsIGltYXApOworCXByb21faGFsdCgpOworfQorCiB1bnNpZ25lZCBpbnQgYnVpbGRfaXJxKGludCBwaWwsIGludCBpbm9maXh1cCwgdW5zaWduZWQgbG9uZyBpY2xyLCB1bnNpZ25lZCBsb25nIGltYXApCiB7CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldDsKQEAgLTI3OSwyOCArMjYxLDM1IEBACiAJCXByb21faGFsdCgpOwogCX0KIAorCWJ1Y2tldCA9ICZpdmVjdG9yX3RhYmxlW2lub107CisJaWYgKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfQUNUSVZFKQorCQlidWlsZF9pcnFfZXJyb3IoIklSUTogVHJ5aW5nIHRvIGJ1aWxkIGFjdGl2ZSBJTk8gYnVja2V0LlxuIiwKKwkJCQlpbm8sIHBpbCwgaW5vZml4dXAsIGljbHIsIGltYXAsIGJ1Y2tldCk7CisKKwlpZiAoYnVja2V0LT5pcnFfaW5mbykgeworCQlpZiAoYnVja2V0LT5pbWFwICE9IGltYXAgfHwgYnVja2V0LT5pY2xyICE9IGljbHIpCisJCQlidWlsZF9pcnFfZXJyb3IoIklSUTogVHJ5aW5nIHRvIHJlaW5pdCBJTk8gYnVja2V0LlxuIiwKKwkJCQkJaW5vLCBwaWwsIGlub2ZpeHVwLCBpY2xyLCBpbWFwLCBidWNrZXQpOworCisJCWdvdG8gb3V0OworCX0KKworCWJ1Y2tldC0+aXJxX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxX2Rlc2MpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1Y2tldC0+aXJxX2luZm8pIHsKKwkJcHJvbV9wcmludGYoIklSUTogRXJyb3IsIGttYWxsb2MoaXJxX2Rlc2MpIGZhaWxlZC5cbiIpOworCQlwcm9tX2hhbHQoKTsKKwl9CisJbWVtc2V0KGJ1Y2tldC0+aXJxX2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgaXJxX2Rlc2MpKTsKKwogCS8qIE9rLCBsb29rcyBnb29kLCBzZXQgaXQgdXAuICBEb24ndCB0b3VjaCB0aGUgaXJxX2NoYWluIG9yCiAJICogdGhlIHBlbmRpbmcgZmxhZy4KIAkgKi8KLQlidWNrZXQgPSAmaXZlY3Rvcl90YWJsZVtpbm9dOwotCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9BQ1RJVkUpIHx8Ci0JICAgIChidWNrZXQtPmlycV9pbmZvICE9IE5VTEwpKSB7Ci0JCS8qIFRoaXMgaXMgYSBncm9zcyBmYXRhbCBlcnJvciBpZiBpdCBoYXBwZW5zIGhlcmUuICovCi0JCXByb21fcHJpbnRmKCJJUlE6IFRyeWluZyB0byByZWluaXQgSU5PIGJ1Y2tldCwgZmF0YWwgZXJyb3IuXG4iKTsKLQkJcHJvbV9wcmludGYoIklSUTogUmVxdWVzdCBJTk8gJTA0eCAoJWQ6JWQ6JTAxNmx4OiUwMTZseClcbiIsCi0JCQkgICAgaW5vLCBwaWwsIGlub2ZpeHVwLCBpY2xyLCBpbWFwKTsKLQkJcHJvbV9wcmludGYoIklSUTogRXhpc3RpbmcgKCVkOiUwMTZseDolMDE2bHgpXG4iLAotCQkJICAgIGJ1Y2tldC0+cGlsLCBidWNrZXQtPmljbHIsIGJ1Y2tldC0+aW1hcCk7Ci0JCXByb21fcHJpbnRmKCJJUlE6IENhbm5vdCBjb250aW51ZSwgaGFsdGluZy4uLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KIAlidWNrZXQtPmltYXAgID0gaW1hcDsKIAlidWNrZXQtPmljbHIgID0gaWNscjsKIAlidWNrZXQtPnBpbCAgID0gcGlsOwogCWJ1Y2tldC0+ZmxhZ3MgPSAwOwogCi0JYnVja2V0LT5pcnFfaW5mbyA9IE5VTEw7Ci0KK291dDoKIAlyZXR1cm4gX19pcnEoYnVja2V0KTsKIH0KIApAQCAtMzE4LDI2ICszMDcsNjUgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3JwciAlMCwgMHgwLCAlJXBzdGF0ZSIgOiA6ICJyIiAocHN0YXRlKSk7CiB9CiAKK3N0YXRpYyBpbnQgY2hlY2tfaXJxX3NoYXJpbmcoaW50IHBpbCwgdW5zaWduZWQgbG9uZyBpcnFmbGFncykKK3sKKwlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24sICp0bXA7CisKKwlhY3Rpb24gPSAqKGlycV9hY3Rpb24gKyBwaWwpOworCWlmIChhY3Rpb24pIHsKKwkJaWYgKChhY3Rpb24tPmZsYWdzICYgU0FfU0hJUlEpICYmIChpcnFmbGFncyAmIFNBX1NISVJRKSkgeworCQkJZm9yICh0bXAgPSBhY3Rpb247IHRtcC0+bmV4dDsgdG1wID0gdG1wLT5uZXh0KQorCQkJCTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9pcnFfYWN0aW9uKGludCBwaWwsIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbikKK3sKKwlzdHJ1Y3QgaXJxYWN0aW9uICoqcHAgPSBpcnFfYWN0aW9uICsgcGlsOworCisJd2hpbGUgKCpwcCkKKwkJcHAgPSAmKCgqcHApLT5uZXh0KTsKKwkqcHAgPSBhY3Rpb247Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uICpnZXRfYWN0aW9uX3Nsb3Qoc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBidWNrZXQtPmlycV9pbmZvOworCWludCBtYXhfaXJxLCBpOworCisJbWF4X2lycSA9IDE7CisJaWYgKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfUENJKQorCQltYXhfaXJxID0gTUFYX0lSUV9ERVNDX0FDVElPTjsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2lycTsgaSsrKSB7CisJCXN0cnVjdCBpcnFhY3Rpb24gKnAgPSAmZGVzYy0+YWN0aW9uW2ldOworCQl1MzIgbWFzayA9ICgxIDw8IGkpOworCisJCWlmIChkZXNjLT5hY3Rpb25fYWN0aXZlX21hc2sgJiBtYXNrKQorCQkJY29udGludWU7CisKKwkJZGVzYy0+YWN0aW9uX2FjdGl2ZV9tYXNrIHw9IG1hc2s7CisJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwogaW50IHJlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAogCQl1bnNpZ25lZCBsb25nIGlycWZsYWdzLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uLCAqdG1wID0gTlVMTDsKKwlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247CiAJc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IF9fYnVja2V0KGlycSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcGVuZGluZyA9IDA7CiAKLQlpZiAoKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpICYmCi0JICAgIChidWNrZXQgPCAmaXZlY3Rvcl90YWJsZVswXSB8fAotCSAgICAgYnVja2V0ID49ICZpdmVjdG9yX3RhYmxlW05VTV9JVkVDU10pKSB7Ci0JCXVuc2lnbmVkIGludCAqY2FsbGVyOwotCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3YgJSVpNywgJTAiIDogIj1yIiAoY2FsbGVyKSk7Ci0JCXByaW50ayhLRVJOX0NSSVQgInJlcXVlc3RfaXJxOiBPbGQgc3R5bGUgSVJRIHJlZ2lzdHJ5IGF0dGVtcHQgIgotCQkgICAgICAgImZyb20gJXAsIGlycSAlMDh4LlxuIiwgY2FsbGVyLCBpcnEpOworCWlmICh1bmxpa2VseSghaGFuZGxlcikpCiAJCXJldHVybiAtRUlOVkFMOwotCX0JCi0JaWYgKCFoYW5kbGVyKQotCSAgICByZXR1cm4gLUVJTlZBTDsKKworCWlmICh1bmxpa2VseSghYnVja2V0LT5pcnFfaW5mbykpCisJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSAmJiAoaXJxZmxhZ3MgJiBTQV9TQU1QTEVfUkFORE9NKSkgewogCQkvKgpAQCAtMzU1LDkzICszODMsMjAgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAotCWFjdGlvbiA9ICooYnVja2V0LT5waWwgKyBpcnFfYWN0aW9uKTsKLQlpZiAoYWN0aW9uKSB7Ci0JCWlmICgoYWN0aW9uLT5mbGFncyAmIFNBX1NISVJRKSAmJiAoaXJxZmxhZ3MgJiBTQV9TSElSUSkpCi0JCQlmb3IgKHRtcCA9IGFjdGlvbjsgdG1wLT5uZXh0OyB0bXAgPSB0bXAtPm5leHQpCi0JCQkJOwotCQllbHNlIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCQlhY3Rpb24gPSBOVUxMOwkJLyogT3IgZWxzZSEgKi8KKwlpZiAoY2hlY2tfaXJxX3NoYXJpbmcoYnVja2V0LT5waWwsIGlycWZsYWdzKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQkvKiBJZiB0aGlzIGlzIGZsYWdnZWQgYXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdGhlbiB3ZSB1c2Ugb3VyCi0JICogcHJpdmF0ZSBzdHJ1Y3Qgd2hpY2ggaXMgbmV2ZXIgZnJlZWQuCi0JICovCi0JaWYgKGlycWZsYWdzICYgU0FfU1RBVElDX0FMTE9DKSB7Ci0JICAgIGlmIChzdGF0aWNfaXJxX2NvdW50IDwgTUFYX1NUQVRJQ19BTExPQykKLQkJYWN0aW9uID0gJnN0YXRpY19pcnFhY3Rpb25bc3RhdGljX2lycV9jb3VudCsrXTsKLQkgICAgZWxzZQotCQlwcmludGsoIlJlcXVlc3QgZm9yIElSUSVkICglcykgU0FfU1RBVElDX0FMTE9DIGZhaWxlZCAiCi0JCSAgICAgICAidXNpbmcga21hbGxvY1xuIiwgaXJxLCBuYW1lKTsKLQl9CQotCWlmIChhY3Rpb24gPT0gTlVMTCkKLQkgICAgYWN0aW9uID0gKHN0cnVjdCBpcnFhY3Rpb24gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJxYWN0aW9uKSwKLQkJCQkJCSBHRlBfQVRPTUlDKTsKLQkKKwlhY3Rpb24gPSBnZXRfYWN0aW9uX3Nsb3QoYnVja2V0KTsKIAlpZiAoIWFjdGlvbikgeyAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWlmIChidWNrZXQgPT0gJnBpbDBfZHVtbXlfYnVja2V0KSB7Ci0JCWJ1Y2tldC0+aXJxX2luZm8gPSBhY3Rpb247Ci0JCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX0FDVElWRTsKLQl9IGVsc2UgewotCQlpZiAoKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfQUNUSVZFKSAhPSAwKSB7Ci0JCQl2b2lkICpvcmlnID0gYnVja2V0LT5pcnFfaW5mbzsKLQkJCXZvaWQgKip2ZWN0b3IgPSBOVUxMOwotCi0JCQlpZiAoKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfUENJKSA9PSAwKSB7Ci0JCQkJcHJpbnRrKCJJUlE6IFRyeWluZyB0byBzaGFyZSBub24tUENJIGJ1Y2tldC5cbiIpOwotCQkJCWdvdG8gZnJlZV9hbmRfZWJ1c3k7Ci0JCQl9Ci0JCQlpZiAoKGJ1Y2tldC0+ZmxhZ3MgJiBJQkZfTVVMVEkpID09IDApIHsKLQkJCQl2ZWN0b3IgPSBrbWFsbG9jKHNpemVvZih2b2lkICopICogNCwgR0ZQX0FUT01JQyk7Ci0JCQkJaWYgKHZlY3RvciA9PSBOVUxMKQotCQkJCQlnb3RvIGZyZWVfYW5kX2Vub21lbTsKLQotCQkJCS8qIFdlIG1pZ2h0IGhhdmUgc2xlcHQuICovCi0JCQkJaWYgKChidWNrZXQtPmZsYWdzICYgSUJGX01VTFRJKSAhPSAwKSB7Ci0JCQkJCWludCBlbnQ7Ci0KLQkJCQkJa2ZyZWUodmVjdG9yKTsKLQkJCQkJdmVjdG9yID0gKHZvaWQgKiopYnVja2V0LT5pcnFfaW5mbzsKLQkJCQkJZm9yKGVudCA9IDA7IGVudCA8IDQ7IGVudCsrKSB7Ci0JCQkJCQlpZiAodmVjdG9yW2VudF0gPT0gTlVMTCkgewotCQkJCQkJCXZlY3RvcltlbnRdID0gYWN0aW9uOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChlbnQgPT0gNCkKLQkJCQkJCWdvdG8gZnJlZV9hbmRfZWJ1c3k7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmVjdG9yWzBdID0gb3JpZzsKLQkJCQkJdmVjdG9yWzFdID0gYWN0aW9uOwotCQkJCQl2ZWN0b3JbMl0gPSBOVUxMOwotCQkJCQl2ZWN0b3JbM10gPSBOVUxMOwotCQkJCQlidWNrZXQtPmlycV9pbmZvID0gdmVjdG9yOwotCQkJCQlidWNrZXQtPmZsYWdzIHw9IElCRl9NVUxUSTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWludCBlbnQ7Ci0KLQkJCQl2ZWN0b3IgPSAodm9pZCAqKilvcmlnOwotCQkJCWZvciAoZW50ID0gMDsgZW50IDwgNDsgZW50KyspIHsKLQkJCQkJaWYgKHZlY3RvcltlbnRdID09IE5VTEwpIHsKLQkJCQkJCXZlY3RvcltlbnRdID0gYWN0aW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVudCA9PSA0KQotCQkJCQlnb3RvIGZyZWVfYW5kX2VidXN5OwotCQkJfQotCQl9IGVsc2UgewotCQkJYnVja2V0LT5pcnFfaW5mbyA9IGFjdGlvbjsKLQkJCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX0FDVElWRTsKLQkJfQorCWJ1Y2tldC0+ZmxhZ3MgfD0gSUJGX0FDVElWRTsKKwlwZW5kaW5nID0gMDsKKwlpZiAoYnVja2V0ICE9ICZwaWwwX2R1bW15X2J1Y2tldCkgewogCQlwZW5kaW5nID0gYnVja2V0LT5wZW5kaW5nOwogCQlpZiAocGVuZGluZykKIAkJCWJ1Y2tldC0+cGVuZGluZyA9IDA7CkBAIC00NTUsMTAgKzQxMCw3IEBACiAJcHV0X2lub19pbl9pcnFhY3Rpb24oYWN0aW9uLCBpcnEpOwogCXB1dF9zbXBhZmZfaW5faXJxYWN0aW9uKGFjdGlvbiwgQ1BVX01BU0tfTk9ORSk7CiAKLQlpZiAodG1wKQotCQl0bXAtPm5leHQgPSBhY3Rpb247Ci0JZWxzZQotCQkqKGJ1Y2tldC0+cGlsICsgaXJxX2FjdGlvbikgPSBhY3Rpb247CisJYXBwZW5kX2lycV9hY3Rpb24oYnVja2V0LT5waWwsIGFjdGlvbik7CiAKIAllbmFibGVfaXJxKGlycSk7CiAKQEAgLTQ2NywxNDcgKzQxOSwxMDMgQEAKIAkJYXRvbWljX2J1Y2tldF9pbnNlcnQoYnVja2V0KTsKIAkJc2V0X3NvZnRpbnQoMSA8PCBidWNrZXQtPnBpbCk7CiAJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JaWYgKChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSAmJiAoIShpcnFmbGFncyAmIFNBX1NUQVRJQ19BTExPQykpKQorCisJaWYgKGJ1Y2tldCAhPSAmcGlsMF9kdW1teV9idWNrZXQpCiAJCXJlZ2lzdGVyX2lycV9wcm9jKF9faXJxX2lubyhpcnEpKTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAlkaXN0cmlidXRlX2lycXMoKTsKICNlbmRpZgogCXJldHVybiAwOwotCi1mcmVlX2FuZF9lYnVzeToKLQlrZnJlZShhY3Rpb24pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCXJldHVybiAtRUJVU1k7Ci0KLWZyZWVfYW5kX2Vub21lbToKLQlrZnJlZShhY3Rpb24pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCXJldHVybiAtRU5PTUVNOwogfQogCiBFWFBPUlRfU1lNQk9MKHJlcXVlc3RfaXJxKTsKIAorc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gKnVubGlua19pcnFfYWN0aW9uKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0ID0gX19idWNrZXQoaXJxKTsKKwlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24sICoqcHA7CisKKwlwcCA9IGlycV9hY3Rpb24gKyBidWNrZXQtPnBpbDsKKwlhY3Rpb24gPSAqcHA7CisJaWYgKHVubGlrZWx5KCFhY3Rpb24pKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh1bmxpa2VseSghYWN0aW9uLT5oYW5kbGVyKSkgeworCQlwcmludGsoIkZyZWVpbmcgZnJlZSBJUlEgJWRcbiIsIGJ1Y2tldC0+cGlsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJd2hpbGUgKGFjdGlvbiAmJiBhY3Rpb24tPmRldl9pZCAhPSBkZXZfaWQpIHsKKwkJcHAgPSAmYWN0aW9uLT5uZXh0OworCQlhY3Rpb24gPSAqcHA7CisJfQorCisJaWYgKGxpa2VseShhY3Rpb24pKQorCQkqcHAgPSBhY3Rpb24tPm5leHQ7CisKKwlyZXR1cm4gYWN0aW9uOworfQorCiB2b2lkIGZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb247Ci0Jc3RydWN0IGlycWFjdGlvbiAqdG1wID0gTlVMTDsKKwlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCA9IF9fYnVja2V0KGlycSksICpicDsKIAotCWlmICgoYnVja2V0ICE9ICZwaWwwX2R1bW15X2J1Y2tldCkgJiYKLQkgICAgKGJ1Y2tldCA8ICZpdmVjdG9yX3RhYmxlWzBdIHx8Ci0JICAgICBidWNrZXQgPj0gJml2ZWN0b3JfdGFibGVbTlVNX0lWRUNTXSkpIHsKLQkJdW5zaWduZWQgaW50ICpjYWxsZXI7Ci0KLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlJWk3LCAlMCIgOiAiPXIiIChjYWxsZXIpKTsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiZnJlZV9pcnE6IE9sZCBzdHlsZSBJUlEgcmVtb3ZhbCBhdHRlbXB0ICIKLQkJICAgICAgICJmcm9tICVwLCBpcnEgJTA4eC5cbiIsIGNhbGxlciwgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7CiAKLQlhY3Rpb24gPSAqKGJ1Y2tldC0+cGlsICsgaXJxX2FjdGlvbik7Ci0JaWYgKCFhY3Rpb24tPmhhbmRsZXIpIHsKLQkJcHJpbnRrKCJGcmVlaW5nIGZyZWUgSVJRICVkXG4iLCBidWNrZXQtPnBpbCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRldl9pZCkgewotCQlmb3IgKCA7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KSB7Ci0JCQlpZiAoYWN0aW9uLT5kZXZfaWQgPT0gZGV2X2lkKQotCQkJCWJyZWFrOwotCQkJdG1wID0gYWN0aW9uOwotCQl9Ci0JCWlmICghYWN0aW9uKSB7Ci0JCQlwcmludGsoIlRyeWluZyB0byBmcmVlIGZyZWUgc2hhcmVkIElSUSAlZFxuIiwgYnVja2V0LT5waWwpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9IGVsc2UgaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TSElSUSkgewotCQlwcmludGsoIlRyeWluZyB0byBmcmVlIHNoYXJlZCBJUlEgJWQgd2l0aCBOVUxMIGRldmljZSBJRFxuIiwgYnVja2V0LT5waWwpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChhY3Rpb24tPmZsYWdzICYgU0FfU1RBVElDX0FMTE9DKSB7Ci0JCXByaW50aygiQXR0ZW1wdCB0byBmcmVlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIElSUSAlZCAoJXMpXG4iLAotCQkgICAgICAgYnVja2V0LT5waWwsIGFjdGlvbi0+bmFtZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFjdGlvbiAmJiB0bXApCi0JCXRtcC0+bmV4dCA9IGFjdGlvbi0+bmV4dDsKLQllbHNlCi0JCSooYnVja2V0LT5waWwgKyBpcnFfYWN0aW9uKSA9IGFjdGlvbi0+bmV4dDsKKwlhY3Rpb24gPSB1bmxpbmtfaXJxX2FjdGlvbihpcnEsIGRldl9pZCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKIAorCWlmICh1bmxpa2VseSghYWN0aW9uKSkKKwkJcmV0dXJuOworCiAJc3luY2hyb25pemVfaXJxKGlycSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2FjdGlvbl9sb2NrLCBmbGFncyk7CiAKKwlidWNrZXQgPSBfX2J1Y2tldChpcnEpOwogCWlmIChidWNrZXQgIT0gJnBpbDBfZHVtbXlfYnVja2V0KSB7CisJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGJ1Y2tldC0+aXJxX2luZm87CiAJCXVuc2lnbmVkIGxvbmcgaW1hcCA9IGJ1Y2tldC0+aW1hcDsKLQkJdm9pZCAqKnZlY3RvciwgKm9yaWc7Ci0JCWludCBlbnQ7CisJCWludCBlbnQsIGk7CiAKLQkJb3JpZyA9IGJ1Y2tldC0+aXJxX2luZm87Ci0JCXZlY3RvciA9ICh2b2lkICoqKW9yaWc7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfSVJRX0RFU0NfQUNUSU9OOyBpKyspIHsKKwkJCXN0cnVjdCBpcnFhY3Rpb24gKnAgPSAmZGVzYy0+YWN0aW9uW2ldOwogCi0JCWlmICgoYnVja2V0LT5mbGFncyAmIElCRl9NVUxUSSkgIT0gMCkgewotCQkJaW50IG90aGVyID0gMDsKLQkJCXZvaWQgKm9ycGhhbiA9IE5VTEw7Ci0JCQlmb3IgKGVudCA9IDA7IGVudCA8IDQ7IGVudCsrKSB7Ci0JCQkJaWYgKHZlY3RvcltlbnRdID09IGFjdGlvbikKLQkJCQkJdmVjdG9yW2VudF0gPSBOVUxMOwotCQkJCWVsc2UgaWYgKHZlY3RvcltlbnRdICE9IE5VTEwpIHsKLQkJCQkJb3JwaGFuID0gdmVjdG9yW2VudF07Ci0JCQkJCW90aGVyKys7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBPbmx5IGZyZWUgd2hlbiBubyBvdGhlciBzaGFyZWQgaXJxCi0JCQkgKiB1c2VzIHRoaXMgYnVja2V0LgotCQkJICovCi0JCQlpZiAob3RoZXIpIHsKLQkJCQlpZiAob3RoZXIgPT0gMSkgewotCQkJCQkvKiBDb252ZXJ0IGJhY2sgdG8gbm9uLXNoYXJlZCBidWNrZXQuICovCi0JCQkJCWJ1Y2tldC0+aXJxX2luZm8gPSBvcnBoYW47Ci0JCQkJCWJ1Y2tldC0+ZmxhZ3MgJj0gfihJQkZfTVVMVEkpOwotCQkJCQlrZnJlZSh2ZWN0b3IpOwotCQkJCX0KLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ1Y2tldC0+aXJxX2luZm8gPSBOVUxMOwotCQl9Ci0KLQkJLyogVGhpcyB1bmlxdWUgaW50ZXJydXB0IHNvdXJjZSBpcyBub3cgaW5hY3RpdmUuICovCi0JCWJ1Y2tldC0+ZmxhZ3MgJj0gfklCRl9BQ1RJVkU7Ci0KLQkJLyogU2VlIGlmIGFueSBvdGhlciBidWNrZXRzIHNoYXJlIHRoaXMgYnVja2V0J3MgSU1BUAotCQkgKiBhbmQgYXJlIHN0aWxsIGFjdGl2ZS4KLQkJICovCi0JCWZvciAoZW50ID0gMDsgZW50IDwgTlVNX0lWRUNTOyBlbnQrKykgewotCQkJYnAgPSAmaXZlY3Rvcl90YWJsZVtlbnRdOwotCQkJaWYgKGJwICE9IGJ1Y2tldAkmJgotCQkJICAgIGJwLT5pbWFwID09IGltYXAJJiYKLQkJCSAgICAoYnAtPmZsYWdzICYgSUJGX0FDVElWRSkgIT0gMCkKKwkJCWlmIChwID09IGFjdGlvbikgeworCQkJCWRlc2MtPmFjdGlvbl9hY3RpdmVfbWFzayAmPSB+KDEgPDwgaSk7CiAJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAotCQkvKiBPbmx5IGRpc2FibGUgd2hlbiBubyBvdGhlciBzdWItaXJxIGxldmVscyBvZgotCQkgKiB0aGUgc2FtZSBJTUFQIGFyZSBhY3RpdmUuCi0JCSAqLwotCQlpZiAoZW50ID09IE5VTV9JVkVDUykKLQkJCWRpc2FibGVfaXJxKGlycSk7CisJCWlmICghZGVzYy0+YWN0aW9uX2FjdGl2ZV9tYXNrKSB7CisJCQkvKiBUaGlzIHVuaXF1ZSBpbnRlcnJ1cHQgc291cmNlIGlzIG5vdyBpbmFjdGl2ZS4gKi8KKwkJCWJ1Y2tldC0+ZmxhZ3MgJj0gfklCRl9BQ1RJVkU7CisKKwkJCS8qIFNlZSBpZiBhbnkgb3RoZXIgYnVja2V0cyBzaGFyZSB0aGlzIGJ1Y2tldCdzIElNQVAKKwkJCSAqIGFuZCBhcmUgc3RpbGwgYWN0aXZlLgorCQkJICovCisJCQlmb3IgKGVudCA9IDA7IGVudCA8IE5VTV9JVkVDUzsgZW50KyspIHsKKwkJCQlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAgPSAmaXZlY3Rvcl90YWJsZVtlbnRdOworCQkJCWlmIChicCAhPSBidWNrZXQJJiYKKwkJCQkgICAgYnAtPmltYXAgPT0gaW1hcAkmJgorCQkJCSAgICAoYnAtPmZsYWdzICYgSUJGX0FDVElWRSkgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIE9ubHkgZGlzYWJsZSB3aGVuIG5vIG90aGVyIHN1Yi1pcnEgbGV2ZWxzIG9mCisJCQkgKiB0aGUgc2FtZSBJTUFQIGFyZSBhY3RpdmUuCisJCQkgKi8KKwkJCWlmIChlbnQgPT0gTlVNX0lWRUNTKQorCQkJCWRpc2FibGVfaXJxKGlycSk7CisJCX0KIAl9CiAKLW91dDoKLQlrZnJlZShhY3Rpb24pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwogfQogCkBAIC02NDYsOTkgKzU1NCw1NSBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotdm9pZCBjYXRjaF9kaXNhYmxlZF9pdmVjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgcHJvY2Vzc19idWNrZXQoaW50IGlycSwgc3RydWN0IGlub19idWNrZXQgKmJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSBfX2J1Y2tldCgqaXJxX3dvcmsoY3B1LCAwKSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gYnAtPmlycV9pbmZvOworCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSBicC0+ZmxhZ3M7CisJdTMyIGFjdGlvbl9tYXNrLCBpOworCWludCByYW5kb207CiAKLQkvKiBXZSBjYW4gYWN0dWFsbHkgc2VlIHRoaXMgb24gVWx0cmEvUENJIFBDSSBjYXJkcywgd2hpY2ggYXJlIGJyaWRnZXMKLQkgKiB0byBvdGhlciBkZXZpY2VzLiAgSGVyZSBhIHNpbmdsZSBJTUFQIGVuYWJsZWQgcG90ZW50aWFsbHkgbXVsdGlwbGUKLQkgKiB1bmlxdWUgaW50ZXJydXB0IHNvdXJjZXMgKHdoaWNoIGVhY2ggZG8gaGF2ZSBhIHVuaXF1ZSBJQ0xSIHJlZ2lzdGVyLgotCSAqCi0JICogU28gd2hhdCB3ZSBkbyBpcyBqdXN0IHJlZ2lzdGVyIHRoYXQgdGhlIElWRUMgYXJyaXZlZCwgd2hlbiByZWdpc3RlcmVkCi0JICogZm9yIHJlYWwgdGhlIHJlcXVlc3RfaXJxKCkgY29kZSB3aWxsIGNoZWNrIHRoZSBiaXQgYW5kIHNpZ25hbAotCSAqIGEgbG9jYWwgQ1BVIGludGVycnVwdCBmb3IgaXQuCi0JICovCi0jaWYgMAotCXByaW50aygiSVZFQzogU3B1cmlvdXMgaW50ZXJydXB0IHZlY3RvciAoJXgpIHJlY2VpdmVkIGF0ICglMDE2bHgpXG4iLAotCSAgICAgICBidWNrZXQgLSAmaXZlY3Rvcl90YWJsZVswXSwgcmVncy0+dHBjKTsKLSNlbmRpZgotCSppcnFfd29yayhjcHUsIDApID0gMDsKLQlidWNrZXQtPnBlbmRpbmcgPSAxOwotfQorCWJwLT5mbGFncyB8PSBJQkZfSU5QUk9HUkVTUzsKIAotLyogVHVuZSB0aGlzLi4uICovCi0jZGVmaW5lIEZPUldBUkRfVk9MVU1FCQkxMgotCi0jaWZkZWYgQ09ORklHX1NNUAotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVkaXJlY3RfaW50cihpbnQgY3B1LCBzdHJ1Y3QgaW5vX2J1Y2tldCAqYnApCi17Ci0JLyogT2ssIGhlcmUgaXMgd2hhdCBpcyBnb2luZyBvbjoKLQkgKiAxKSBSZXRhcmdldGluZyBJUlFzIG9uIFN0YXJmaXJlIGlzIHZlcnkKLQkgKiAgICBleHBlbnNpdmUgc28ganVzdCBmb3JnZXQgYWJvdXQgaXQgb24gdGhlbS4KLQkgKiAyKSBNb3ZpbmcgYXJvdW5kIHZlcnkgaGlnaCBwcmlvcml0eSBpbnRlcnJ1cHRzCi0JICogICAgaXMgYSBsb3NpbmcgZ2FtZS4KLQkgKiAzKSBJZiB0aGUgY3VycmVudCBjcHUgaXMgaWRsZSwgaW50ZXJydXB0cyBhcmUKLQkgKiAgICB1c2VmdWwgd29yaywgc28ga2VlcCB0aGVtIGhlcmUuICBCdXQgZG8gbm90Ci0JICogICAgcGFzcyB0byBvdXIgbmVpZ2hib3VyIGlmIGhlIGlzIG5vdCB2ZXJ5IGlkbGUuCi0JICogNCkgSWYgc3lzYWRtaW4gZXhwbGljaXRseSBhc2tzIGZvciBkaXJlY3RlZCBpbnRycywKLQkgKiAgICBKdXN0IERvIEl0LgotCSAqLwotCXN0cnVjdCBpcnFhY3Rpb24gKmFwID0gYnAtPmlycV9pbmZvOwotCWNwdW1hc2tfdCBjcHVfbWFzazsKLQl1bnNpZ25lZCBpbnQgYnVkZHksIHRpY2tzOwotCi0JY3B1X21hc2sgPSBnZXRfc21wYWZmX2luX2lycWFjdGlvbihhcCk7Ci0JY3B1c19hbmQoY3B1X21hc2ssIGNwdV9tYXNrLCBjcHVfb25saW5lX21hcCk7Ci0JaWYgKGNwdXNfZW1wdHkoY3B1X21hc2spKQotCQljcHVfbWFzayA9IGNwdV9vbmxpbmVfbWFwOwotCi0JaWYgKHRoaXNfaXNfc3RhcmZpcmUgIT0gMCB8fAotCSAgICBicC0+cGlsID49IDEwIHx8IGN1cnJlbnQtPnBpZCA9PSAwKQorCWlmICh1bmxpa2VseSghKGZsYWdzICYgSUJGX0FDVElWRSkpKSB7CisJCWJwLT5wZW5kaW5nID0gMTsKIAkJZ290byBvdXQ7Ci0KLQkvKiAnY3B1JyBpcyB0aGUgTUlEIChpZS4gVVBBSUQpLCBjYWxjdWxhdGUgdGhlIE1JRAotCSAqIG9mIG91ciBidWRkeS4KLQkgKi8KLQlidWRkeSA9IGNwdSArIDE7Ci0JaWYgKGJ1ZGR5ID49IE5SX0NQVVMpCi0JCWJ1ZGR5ID0gMDsKLQotCXRpY2tzID0gMDsKLQl3aGlsZSAoIWNwdV9pc3NldChidWRkeSwgY3B1X21hc2spKSB7Ci0JCWlmICgrK2J1ZGR5ID49IE5SX0NQVVMpCi0JCQlidWRkeSA9IDA7Ci0JCWlmICgrK3RpY2tzID4gTlJfQ1BVUykgewotCQkJcHV0X3NtcGFmZl9pbl9pcnFhY3Rpb24oYXAsIENQVV9NQVNLX05PTkUpOwotCQkJZ290byBvdXQ7Ci0JCX0KIAl9CiAKLQlpZiAoYnVkZHkgPT0gY3B1KQotCQlnb3RvIG91dDsKKwlpZiAoZGVzYy0+cHJlX2hhbmRsZXIpCisJCWRlc2MtPnByZV9oYW5kbGVyKGJwLAorCQkJCSAgZGVzYy0+cHJlX2hhbmRsZXJfYXJnMSwKKwkJCQkgIGRlc2MtPnByZV9oYW5kbGVyX2FyZzIpOwogCi0JLyogVm9vLWRvbyBwcm9ncmFtbWluZy4gKi8KLQlpZiAoY3B1X2RhdGEoYnVkZHkpLmlkbGVfdm9sdW1lIDwgRk9SV0FSRF9WT0xVTUUpCi0JCWdvdG8gb3V0OworCWFjdGlvbl9tYXNrID0gZGVzYy0+YWN0aW9uX2FjdGl2ZV9tYXNrOworCXJhbmRvbSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JUlFfREVTQ19BQ1RJT047IGkrKykgeworCQlzdHJ1Y3QgaXJxYWN0aW9uICpwID0gJmRlc2MtPmFjdGlvbltpXTsKKwkJdTMyIG1hc2sgPSAoMSA8PCBpKTsKIAotCS8qIFRoaXMganVzdCBzbyBoYXBwZW5zIHRvIGJlIGNvcnJlY3Qgb24gQ2hlZXRhaAotCSAqIGF0IHRoZSBtb21lbnQuCi0JICovCi0JYnVkZHkgPDw9IDI2OworCQlpZiAoIShhY3Rpb25fbWFzayAmIG1hc2spKQorCQkJY29udGludWU7CiAKLQkvKiBQdXNoIGl0IHRvIG91ciBidWRkeS4gKi8KLQl1cGFfd3JpdGVsKGJ1ZGR5IHwgSU1BUF9WQUxJRCwgYnAtPmltYXApOworCQlhY3Rpb25fbWFzayAmPSB+bWFzazsKIAorCQlpZiAocC0+aGFuZGxlcihfX2lycShicCksIHAtPmRldl9pZCwgcmVncykgPT0gSVJRX0hBTkRMRUQpCisJCQlyYW5kb20gfD0gcC0+ZmxhZ3M7CisKKwkJaWYgKCFhY3Rpb25fbWFzaykKKwkJCWJyZWFrOworCX0KKwlpZiAoYnAtPnBpbCAhPSAwKSB7CisJCXVwYV93cml0ZWwoSUNMUl9JRExFLCBicC0+aWNscik7CisJCS8qIFRlc3QgYW5kIGFkZCBlbnRyb3B5ICovCisJCWlmIChyYW5kb20gJiBTQV9TQU1QTEVfUkFORE9NKQorCQkJYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGlycSk7CisJfQogb3V0OgotCXJldHVybjsKKwlicC0+ZmxhZ3MgJj0gfklCRl9JTlBST0dSRVNTOwogfQogCi0jZW5kaWYKLQogdm9pZCBoYW5kbGVyX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAsICpuYnA7CisJc3RydWN0IGlub19idWNrZXQgKmJwOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKICNpZm5kZWYgQ09ORklHX1NNUApAQCAtNzU2LDggKzYyMCw2IEBACiAJCWNsZWFyX3NvZnRpbnQoY2xyX21hc2spOwogCX0KICNlbHNlCi0JaW50IHNob3VsZF9mb3J3YXJkID0gMDsKLQogCWNsZWFyX3NvZnRpbnQoMSA8PCBpcnEpOwogI2VuZGlmCiAKQEAgLTc3MiwyMDAgKzYzNCw3NyBAQAogI2Vsc2UKIAlicCA9IF9fYnVja2V0KHhjaGczMihpcnFfd29yayhjcHUsIGlycSksIDApKTsKICNlbmRpZgotCWZvciAoIDsgYnAgIT0gTlVMTDsgYnAgPSBuYnApIHsKLQkJdW5zaWduZWQgY2hhciBmbGFncyA9IGJwLT5mbGFnczsKLQkJdW5zaWduZWQgY2hhciByYW5kb20gPSAwOworCXdoaWxlIChicCkgeworCQlzdHJ1Y3QgaW5vX2J1Y2tldCAqbmJwID0gX19idWNrZXQoYnAtPmlycV9jaGFpbik7CiAKLQkJbmJwID0gX19idWNrZXQoYnAtPmlycV9jaGFpbik7CiAJCWJwLT5pcnFfY2hhaW4gPSAwOwotCi0JCWJwLT5mbGFncyB8PSBJQkZfSU5QUk9HUkVTUzsKLQotCQlpZiAoKGZsYWdzICYgSUJGX0FDVElWRSkgIT0gMCkgewotI2lmZGVmIENPTkZJR19QQ0kKLQkJCWlmICgoZmxhZ3MgJiBJQkZfRE1BX1NZTkMpICE9IDApIHsKLQkJCQl1cGFfcmVhZGwoZG1hX3N5bmNfcmVnX3RhYmxlW2JwLT5zeW5jdGFiX2VudF0pOwotCQkJCXVwYV9yZWFkcShwY2lfZG1hX3dzeW5jKTsKLQkJCX0KLSNlbmRpZgotCQkJaWYgKChmbGFncyAmIElCRl9NVUxUSSkgPT0gMCkgewotCQkJCXN0cnVjdCBpcnFhY3Rpb24gKmFwID0gYnAtPmlycV9pbmZvOwotCQkJCWludCByZXQ7Ci0KLQkJCQlyZXQgPSBhcC0+aGFuZGxlcihfX2lycShicCksIGFwLT5kZXZfaWQsIHJlZ3MpOwotCQkJCWlmIChyZXQgPT0gSVJRX0hBTkRMRUQpCi0JCQkJCXJhbmRvbSB8PSBhcC0+ZmxhZ3M7Ci0JCQl9IGVsc2UgewotCQkJCXZvaWQgKip2ZWN0b3IgPSAodm9pZCAqKilicC0+aXJxX2luZm87Ci0JCQkJaW50IGVudDsKLQkJCQlmb3IgKGVudCA9IDA7IGVudCA8IDQ7IGVudCsrKSB7Ci0JCQkJCXN0cnVjdCBpcnFhY3Rpb24gKmFwID0gdmVjdG9yW2VudF07Ci0JCQkJCWlmIChhcCAhPSBOVUxMKSB7Ci0JCQkJCQlpbnQgcmV0OwotCi0JCQkJCQlyZXQgPSBhcC0+aGFuZGxlcihfX2lycShicCksCi0JCQkJCQkJCSAgYXAtPmRldl9pZCwKLQkJCQkJCQkJICByZWdzKTsKLQkJCQkJCWlmIChyZXQgPT0gSVJRX0hBTkRMRUQpCi0JCQkJCQkJcmFuZG9tIHw9IGFwLT5mbGFnczsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qIE9ubHkgdGhlIGR1bW15IGJ1Y2tldCBsYWNrcyBJTUFQL0lDTFIuICovCi0JCQlpZiAoYnAtPnBpbCAhPSAwKSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQkJCWlmIChzaG91bGRfZm9yd2FyZCkgewotCQkJCQlyZWRpcmVjdF9pbnRyKGNwdSwgYnApOwotCQkJCQlzaG91bGRfZm9yd2FyZCA9IDA7Ci0JCQkJfQotI2VuZGlmCi0JCQkJdXBhX3dyaXRlbChJQ0xSX0lETEUsIGJwLT5pY2xyKTsKLQotCQkJCS8qIFRlc3QgYW5kIGFkZCBlbnRyb3B5ICovCi0JCQkJaWYgKHJhbmRvbSAmIFNBX1NBTVBMRV9SQU5ET00pCi0JCQkJCWFkZF9pbnRlcnJ1cHRfcmFuZG9tbmVzcyhpcnEpOwotCQkJfQotCQl9IGVsc2UKLQkJCWJwLT5wZW5kaW5nID0gMTsKLQotCQlicC0+ZmxhZ3MgJj0gfklCRl9JTlBST0dSRVNTOworCQlwcm9jZXNzX2J1Y2tldChpcnEsIGJwLCByZWdzKTsKKwkJYnAgPSBuYnA7CiAJfQogCWlycV9leGl0KCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9GRAotZXh0ZXJuIHZvaWQgZmxvcHB5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfY29va2llLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gaXJxcmV0dXJuX3QgZmxvcHB5X2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7OwogCi12b2lkIHNwYXJjX2Zsb3BweV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2Nvb2tpZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisvKiBYWFggTm8gZWFzeSB3YXkgdG8gaW5jbHVkZSBhc20vZmxvcHB5LmggWFhYICovCitleHRlcm4gdW5zaWduZWQgY2hhciAqcGRtYV92YWRkcjsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBkbWFfc2l6ZTsKK2V4dGVybiB2b2xhdGlsZSBpbnQgZG9pbmdfcGRtYTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGZkY19zdGF0dXM7CisKK2lycXJldHVybl90IHNwYXJjX2Zsb3BweV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2Nvb2tpZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uID0gKihpcnEgKyBpcnFfYWN0aW9uKTsKLQlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnVja2V0OwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKGxpa2VseShkb2luZ19wZG1hKSkgeworCQl2b2lkIF9faW9tZW0gKnN0YXQgPSAodm9pZCBfX2lvbWVtICopIGZkY19zdGF0dXM7CisJCXVuc2lnbmVkIGNoYXIgKnZhZGRyID0gcGRtYV92YWRkcjsKKwkJdW5zaWduZWQgbG9uZyBzaXplID0gcGRtYV9zaXplOworCQl1OCB2YWw7CiAKLQlpcnFfZW50ZXIoKTsKLQlrc3RhdF90aGlzX2NwdS5pcnFzW2lycV0rKzsKKwkJd2hpbGUgKHNpemUpIHsKKwkJCXZhbCA9IHJlYWRiKHN0YXQpOworCQkJaWYgKHVubGlrZWx5KCEodmFsICYgMHg4MCkpKSB7CisJCQkJcGRtYV92YWRkciA9IHZhZGRyOworCQkJCXBkbWFfc2l6ZSA9IHNpemU7CisJCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJfQorCQkJaWYgKHVubGlrZWx5KCEodmFsICYgMHgyMCkpKSB7CisJCQkJcGRtYV92YWRkciA9IHZhZGRyOworCQkJCXBkbWFfc2l6ZSA9IHNpemU7CisJCQkJZG9pbmdfcGRtYSA9IDA7CisJCQkJZ290byBtYWluX2ludGVycnVwdDsKKwkJCX0KKwkJCWlmICh2YWwgJiAweDQwKSB7CisJCQkJLyogcmVhZCAqLworCQkJCSp2YWRkcisrID0gcmVhZGIoc3RhdCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGRhdGEgPSAqdmFkZHIrKzsKIAotCSooaXJxX3dvcmsoY3B1LCBpcnEpKSA9IDA7Ci0JYnVja2V0ID0gZ2V0X2lub19pbl9pcnFhY3Rpb24oYWN0aW9uKSArIGl2ZWN0b3JfdGFibGU7CisJCQkJLyogd3JpdGUgKi8KKwkJCQl3cml0ZWIoZGF0YSwgc3RhdCArIDEpOworCQkJfQorCQkJc2l6ZS0tOworCQl9CiAKLQlidWNrZXQtPmZsYWdzIHw9IElCRl9JTlBST0dSRVNTOworCQlwZG1hX3ZhZGRyID0gdmFkZHI7CisJCXBkbWFfc2l6ZSA9IHNpemU7CiAKLQlmbG9wcHlfaW50ZXJydXB0KGlycSwgZGV2X2Nvb2tpZSwgcmVncyk7Ci0JdXBhX3dyaXRlbChJQ0xSX0lETEUsIGJ1Y2tldC0+aWNscik7CisJCS8qIFNlbmQgVGVybWluYWwgQ291bnQgcHVsc2UgdG8gZmxvcHB5IGNvbnRyb2xsZXIuICovCisJCXZhbCA9IHJlYWRiKGF1eGlvX3JlZ2lzdGVyKTsKKwkJdmFsIHw9IEFVWElPX0FVWDFfRlRDTlQ7CisJCXdyaXRlYih2YWwsIGF1eGlvX3JlZ2lzdGVyKTsKKwkJdmFsICY9IEFVWElPX0FVWDFfRlRDTlQ7CisJCXdyaXRlYih2YWwsIGF1eGlvX3JlZ2lzdGVyKTsKIAotCWJ1Y2tldC0+ZmxhZ3MgJj0gfklCRl9JTlBST0dSRVNTOworCQlkb2luZ19wZG1hID0gMDsKKwl9CiAKLQlpcnFfZXhpdCgpOworbWFpbl9pbnRlcnJ1cHQ6CisJcmV0dXJuIGZsb3BweV9pbnRlcnJ1cHQoaXJxLCBkZXZfY29va2llLCByZWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woc3BhcmNfZmxvcHB5X2lycSk7CiAjZW5kaWYKIAotLyogVGhlIGZvbGxvd2luZyBhc3N1bWVzIHRoYXQgdGhlIGJyYW5jaCBsaWVzIGJlZm9yZSB0aGUgcGxhY2Ugd2UKLSAqIGFyZSBicmFuY2hpbmcgdG8uICBUaGlzIGlzIHRoZSBjYXNlIGZvciBhIHRyYXAgdmVjdG9yLi4uCi0gKiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KLSAqLwotI2RlZmluZSBTUEFSQ19CUkFOQ0goZGVzdF9hZGRyLCBpbnN0X2FkZHIpIFwKLSAgICAgICAgICAoMHgxMDgwMDAwMCB8ICgoKChkZXN0X2FkZHIpLShpbnN0X2FkZHIpKT4+MikmMHgzZmZmZmYpKQotCi0jZGVmaW5lIFNQQVJDX05PUCAoMHgwMTAwMDAwMCkKLQotc3RhdGljIHZvaWQgaW5zdGFsbF9mYXN0X2lycSh1bnNpZ25lZCBpbnQgY3B1X2lycSwKLQkJCSAgICAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCi17Ci0JZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3BhcmM2NF90dGFibGVfdGwwOwotCXVuc2lnbmVkIGxvbmcgdHRlbnQgPSAodW5zaWduZWQgbG9uZykgJnNwYXJjNjRfdHRhYmxlX3RsMDsKLQl1bnNpZ25lZCBpbnQgKmluc25zOwotCi0JdHRlbnQgKz0gMHg4MjA7Ci0JdHRlbnQgKz0gKGNwdV9pcnEgLSAxKSA8PCA1OwotCWluc25zID0gKHVuc2lnbmVkIGludCAqKSB0dGVudDsKLQlpbnNuc1swXSA9IFNQQVJDX0JSQU5DSCgoKHVuc2lnbmVkIGxvbmcpIGhhbmRsZXIpLAotCQkJCSgodW5zaWduZWQgbG9uZykmaW5zbnNbMF0pKTsKLQlpbnNuc1sxXSA9IFNQQVJDX05PUDsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibWVtYmFyICNTdG9yZVN0b3JlOyBmbHVzaCAlMCIgOiA6ICJyIiAodHRlbnQpKTsKLX0KLQotaW50IHJlcXVlc3RfZmFzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJICAgICBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLQkJICAgICB1bnNpZ25lZCBsb25nIGlycWZsYWdzLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOwotCXN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQgPSBfX2J1Y2tldChpcnEpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBObyBwaWwwIGR1bW15IGJ1Y2tldHMgYWxsb3dlZCBoZXJlLiAqLwotCWlmIChidWNrZXQgPCAmaXZlY3Rvcl90YWJsZVswXSB8fAotCSAgICBidWNrZXQgPj0gJml2ZWN0b3JfdGFibGVbTlVNX0lWRUNTXSkgewotCQl1bnNpZ25lZCBpbnQgKmNhbGxlcjsKLQotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUlaTcsICUwIiA6ICI9ciIgKGNhbGxlcikpOwotCQlwcmludGsoS0VSTl9DUklUICJyZXF1ZXN0X2Zhc3RfaXJxOiBPbGQgc3R5bGUgSVJRIHJlZ2lzdHJ5IGF0dGVtcHQgIgotCQkgICAgICAgImZyb20gJXAsIGlycSAlMDh4LlxuIiwgY2FsbGVyLCBpcnEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CQotCQotCWlmICghaGFuZGxlcikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKGJ1Y2tldC0+cGlsID09IDApIHx8IChidWNrZXQtPnBpbCA9PSAxNCkpIHsKLQkJcHJpbnRrKCJyZXF1ZXN0X2Zhc3RfaXJxOiBUcnlpbmcgdG8gcmVnaXN0ZXIgc2hhcmVkIElSUSAwIG9yIDE0LlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCi0JYWN0aW9uID0gKihidWNrZXQtPnBpbCArIGlycV9hY3Rpb24pOwotCWlmIChhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TSElSUSkKLQkJCXBhbmljKCJUcnlpbmcgdG8gcmVnaXN0ZXIgZmFzdCBpcnEgd2hlbiBhbHJlYWR5IHNoYXJlZC5cbiIpOwotCQlpZiAoaXJxZmxhZ3MgJiBTQV9TSElSUSkKLQkJCXBhbmljKCJUcnlpbmcgdG8gcmVnaXN0ZXIgZmFzdCBpcnEgYXMgc2hhcmVkLlxuIik7Ci0JCXByaW50aygicmVxdWVzdF9mYXN0X2lycTogVHJ5aW5nIHRvIHJlZ2lzdGVyIHlldCBhbHJlYWR5IG93bmVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qCi0JICogV2UgZG8gbm90IGNoZWNrIGZvciBTQV9TQU1QTEVfUkFORE9NIGluIHRoaXMgcGF0aC4gTmVpdGhlciBkbyB3ZQotCSAqIHN1cHBvcnQgc21wIGludHIgYWZmaW5pdHkgaW4gdGhpcyBwYXRoLgotCSAqLwotCWlmIChpcnFmbGFncyAmIFNBX1NUQVRJQ19BTExPQykgewotCQlpZiAoc3RhdGljX2lycV9jb3VudCA8IE1BWF9TVEFUSUNfQUxMT0MpCi0JCQlhY3Rpb24gPSAmc3RhdGljX2lycWFjdGlvbltzdGF0aWNfaXJxX2NvdW50KytdOwotCQllbHNlCi0JCQlwcmludGsoIlJlcXVlc3QgZm9yIElSUSVkICglcykgU0FfU1RBVElDX0FMTE9DIGZhaWxlZCAiCi0JCQkgICAgICAgInVzaW5nIGttYWxsb2NcbiIsIGJ1Y2tldC0+cGlsLCBuYW1lKTsKLQl9Ci0JaWYgKGFjdGlvbiA9PSBOVUxMKQotCQlhY3Rpb24gPSAoc3RydWN0IGlycWFjdGlvbiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnFhY3Rpb24pLAotCQkJCQkJICAgICBHRlBfQVRPTUlDKTsKLQlpZiAoIWFjdGlvbikgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfYWN0aW9uX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWluc3RhbGxfZmFzdF9pcnEoYnVja2V0LT5waWwsIGhhbmRsZXIpOwotCi0JYnVja2V0LT5pcnFfaW5mbyA9IGFjdGlvbjsKLQlidWNrZXQtPmZsYWdzIHw9IElCRl9BQ1RJVkU7Ci0KLQlhY3Rpb24tPmhhbmRsZXIgPSBoYW5kbGVyOwotCWFjdGlvbi0+ZmxhZ3MgPSBpcnFmbGFnczsKLQlhY3Rpb24tPmRldl9pZCA9IE5VTEw7Ci0JYWN0aW9uLT5uYW1lID0gbmFtZTsKLQlhY3Rpb24tPm5leHQgPSBOVUxMOwotCXB1dF9pbm9faW5faXJxYWN0aW9uKGFjdGlvbiwgaXJxKTsKLQlwdXRfc21wYWZmX2luX2lycWFjdGlvbihhY3Rpb24sIENQVV9NQVNLX05PTkUpOwotCi0JKihidWNrZXQtPnBpbCArIGlycV9hY3Rpb24pID0gYWN0aW9uOwotCWVuYWJsZV9pcnEoaXJxKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9hY3Rpb25fbG9jaywgZmxhZ3MpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCWRpc3RyaWJ1dGVfaXJxcygpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIFdlIHJlYWxseSBkb24ndCBuZWVkIHRoZXNlIGF0IGFsbCBvbiB0aGUgU3BhcmMuICBXZSBvbmx5IGhhdmUKICAqIHN0dWJzIGhlcmUgYmVjYXVzZSB0aGV5IGFyZSBleHBvcnRlZCB0byBtb2R1bGVzLgogICovCkBAIC0xMDMwLDcgKzc2OSwxMCBAQAogCSAqLwogCWZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IE5SX0lSUVM7IGxldmVsKyspIHsKIAkJc3RydWN0IGlycWFjdGlvbiAqcCA9IGlycV9hY3Rpb25bbGV2ZWxdOwotCQlpZiAobGV2ZWwgPT0gMTIpIGNvbnRpbnVlOworCisJCWlmIChsZXZlbCA9PSAxMikKKwkJCWNvbnRpbnVlOworCiAJCXdoaWxlKHApIHsKIAkJCWNwdSA9IHJldGFyZ2V0X29uZV9pcnEocCwgY3B1KTsKIAkJCXAgPSBwLT5uZXh0OwpAQCAtMTE3NSw3ICs5MTcsOCBAQAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAgPSBpdmVjdG9yX3RhYmxlICsgKGxvbmcpZGF0YTsKLQlzdHJ1Y3QgaXJxYWN0aW9uICphcCA9IGJwLT5pcnFfaW5mbzsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBicC0+aXJxX2luZm87CisJc3RydWN0IGlycWFjdGlvbiAqYXAgPSBkZXNjLT5hY3Rpb247CiAJY3B1bWFza190IG1hc2s7CiAJaW50IGxlbjsKIApAQCAtMTE5MywxMSArOTM2LDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ludHJfYWZmaW5pdHkoaW50IGlycSwgY3B1bWFza190IGh3X2FmZikKIHsKIAlzdHJ1Y3QgaW5vX2J1Y2tldCAqYnAgPSBpdmVjdG9yX3RhYmxlICsgaXJxOworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGJwLT5pcnFfaW5mbzsKKwlzdHJ1Y3QgaXJxYWN0aW9uICphcCA9IGRlc2MtPmFjdGlvbjsKIAogCS8qIFVzZXJzIHNwZWNpZnkgYWZmaW5pdHkgaW4gdGVybXMgb2YgaHcgY3B1IGlkcy4KIAkgKiBBcyBzb29uIGFzIHdlIGRvIHRoaXMsIGhhbmRsZXJfaXJxKCkgbWlnaHQgc2VlIGFuZCB0YWtlIGFjdGlvbi4KIAkgKi8KLQlwdXRfc21wYWZmX2luX2lycWFjdGlvbigoc3RydWN0IGlycWFjdGlvbiAqKWJwLT5pcnFfaW5mbywgaHdfYWZmKTsKKwlwdXRfc21wYWZmX2luX2lycWFjdGlvbihhcCwgaHdfYWZmKTsKIAogCS8qIE1pZ3JhdGlvbiBpcyBzaW1wbHkgZG9uZSBieSB0aGUgbmV4dCBjcHUgdG8gc2VydmljZSB0aGlzCiAJICogaW50ZXJydXB0LgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwppbmRleCBiZGFjNjMxLi5iYmYxMWY4IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2twcm9iZXMuYwpAQCAtNDMzLDMgKzQzMyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworaW50IGFyY2hfaW5pdF9rcHJvYmVzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCmluZGV4IDUzNDMyMGUuLjkxYWI0NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCkBAIC0xMzAzLDggKzEzMDMsNyBAQAogewogCXU2NCB0bXA7CiAKLQkvKiBQUk9NIHNldHMgdGhlIElSUSByZXRyeSB2YWx1ZSB0b28gbG93LCBpbmNyZWFzZSBpdC4gKi8KLQlwc3ljaG9fd3JpdGUocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX0lSUV9SRVRSWSwgMHhmZik7CisJcHN5Y2hvX3dyaXRlKHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyArIFBTWUNIT19JUlFfUkVUUlksIDUpOwogCiAJLyogRW5hYmxlIGFyYml0ZXIgZm9yIGFsbCBQQ0kgc2xvdHMuICovCiAJdG1wID0gcHN5Y2hvX3JlYWQocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgUFNZQ0hPX1BDSUFfQ1RSTCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwppbmRleCA1M2QzMzNiLi41MmJmMzQzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKQEAgLTU5NSw2ICs1OTUsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBXaGVuIGEgZGV2aWNlIGxpdmVzIGJlaGluZCBhIGJyaWRnZSBkZWVwZXIgaW4gdGhlIFBDSSBidXMgdG9wb2xvZ3kKKyAqIHRoYW4gQVBCLCBhIHNwZWNpYWwgc2VxdWVuY2UgbXVzdCBydW4gdG8gbWFrZSBzdXJlIGFsbCBwZW5kaW5nIERNQQorICogdHJhbnNmZXJzIGF0IHRoZSB0aW1lIG9mIElSUSBkZWxpdmVyeSBhcmUgdmlzaWJsZSBpbiB0aGUgY29oZXJlbmN5CisgKiBkb21haW4gYnkgdGhlIGNwdS4gIFRoaXMgc2VxdWVuY2UgaXMgdG8gcGVyZm9ybSBhIHJlYWQgb24gdGhlIGZhcgorICogc2lkZSBvZiB0aGUgbm9uLUFQQiBicmlkZ2UsIHRoZW4gcGVyZm9ybSBhIHJlYWQgb2YgU2FicmUncyBETUEKKyAqIHdyaXRlLXN5bmMgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHNhYnJlX3dzeW5jX2hhbmRsZXIoc3RydWN0IGlub19idWNrZXQgKmJ1Y2tldCwgdm9pZCAqX2FyZzEsIHZvaWQgKl9hcmcyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gX2FyZzE7CisJdW5zaWduZWQgbG9uZyBzeW5jX3JlZyA9ICh1bnNpZ25lZCBsb25nKSBfYXJnMjsKKwl1MTYgX3VudXNlZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9WRU5ET1JfSUQsICZfdW51c2VkKTsKKwlzYWJyZV9yZWFkKHN5bmNfcmVnKTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgc2FicmVfaXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKIAkJCQkJICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCSAgIHVuc2lnbmVkIGludCBpbm8pCkBAIC02MzksMjQgKzY1NiwxNCBAQAogCWlmIChwZGV2KSB7CiAJCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwZGV2LT5zeXNkYXRhOwogCi0JCS8qIFdoZW4gYSBkZXZpY2UgbGl2ZXMgYmVoaW5kIGEgYnJpZGdlIGRlZXBlciBpbiB0aGUKLQkJICogUENJIGJ1cyB0b3BvbG9neSB0aGFuIEFQQiwgYSBzcGVjaWFsIHNlcXVlbmNlIG11c3QKLQkJICogcnVuIHRvIG1ha2Ugc3VyZSBhbGwgcGVuZGluZyBETUEgdHJhbnNmZXJzIGF0IHRoZQotCQkgKiB0aW1lIG9mIElSUSBkZWxpdmVyeSBhcmUgdmlzaWJsZSBpbiB0aGUgY29oZXJlbmN5Ci0JCSAqIGRvbWFpbiBieSB0aGUgY3B1LiAgVGhpcyBzZXF1ZW5jZSBpcyB0byBwZXJmb3JtCi0JCSAqIGEgcmVhZCBvbiB0aGUgZmFyIHNpZGUgb2YgdGhlIG5vbi1BUEIgYnJpZGdlLCB0aGVuCi0JCSAqIHBlcmZvcm0gYSByZWFkIG9mIFNhYnJlJ3MgRE1BIHdyaXRlLXN5bmMgcmVnaXN0ZXIuCi0JCSAqCi0JCSAqIEN1cnJlbnRseSwgdGhlIFBDSV9DT05GSUcgcmVnaXN0ZXIgZm9yIHRoZSBkZXZpY2UKLQkJICogaXMgdXNlZCBmb3IgdGhpcyByZWFkIGZyb20gdGhlIGZhciBzaWRlIG9mIHRoZSBicmlkZ2UuCi0JCSAqLwogCQlpZiAocGRldi0+YnVzLT5udW1iZXIgIT0gcGNwLT5wYm0tPnBjaV9maXJzdF9idXNubykgewotCQkJYnVja2V0LT5mbGFncyB8PSBJQkZfRE1BX1NZTkM7Ci0JCQlidWNrZXQtPnN5bmN0YWJfZW50ID0gZG1hX3N5bmNfcmVnX3RhYmxlX2VudHJ5Kys7Ci0JCQlkbWFfc3luY19yZWdfdGFibGVbYnVja2V0LT5zeW5jdGFiX2VudF0gPQotCQkJCSh1bnNpZ25lZCBsb25nKSBzYWJyZV9wY2lfY29uZmlnX21rYWRkcigKLQkJCQkJcGNwLT5wYm0sCi0JCQkJCXBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbiwgUENJX0NPTU1BTkQpOworCQkJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAgPSBwY3AtPnBibS0+cGFyZW50OworCQkJc3RydWN0IGlycV9kZXNjICpkID0gYnVja2V0LT5pcnFfaW5mbzsKKworCQkJZC0+cHJlX2hhbmRsZXIgPSBzYWJyZV93c3luY19oYW5kbGVyOworCQkJZC0+cHJlX2hhbmRsZXJfYXJnMSA9IHBkZXY7CisJCQlkLT5wcmVfaGFuZGxlcl9hcmcyID0gKHZvaWQgKikKKwkJCQlwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgKyBTQUJSRV9XUlNZTkM7CiAJCX0KIAl9CiAJcmV0dXJuIF9faXJxKGJ1Y2tldCk7CkBAIC0xNjI2LDEwICsxNjMzLDkgQEAKIAkgKi8KIAlwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MgPSBwcl9yZWdzWzBdLnBoeXNfYWRkcjsKIAlwLT5wYm1fQi5jb250cm9sbGVyX3JlZ3MgPSBwcl9yZWdzWzBdLnBoeXNfYWRkcjsKLQlwY2lfZG1hX3dzeW5jID0gcC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgU0FCUkVfV1JTWU5DOwogCi0JcHJpbnRrKCJQQ0k6IEZvdW5kIFNBQlJFLCBtYWluIHJlZ3MgYXQgJTAxNmx4LCB3c3luYyBhdCAlMDE2bHhcbiIsCi0JICAgICAgIHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncywgcGNpX2RtYV93c3luYyk7CisJcHJpbnRrKCJQQ0k6IEZvdW5kIFNBQlJFLCBtYWluIHJlZ3MgYXQgJTAxNmx4XG4iLAorCSAgICAgICBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MpOwogCiAJLyogQ2xlYXIgaW50ZXJydXB0cyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IDU3NTMxNzUuLjZhMTgyYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91cGEuaD4KKyNpbmNsdWRlIDxhc20vcHN0YXRlLmg+CiAKICNpbmNsdWRlICJwY2lfaW1wbC5oIgogI2luY2x1ZGUgImlvbW11X2NvbW1vbi5oIgpAQCAtMzI2LDYgKzMyNyw0NCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHRvbWF0aWxsb193c3luY19oYW5kbGVyKHN0cnVjdCBpbm9fYnVja2V0ICpidWNrZXQsIHZvaWQgKl9hcmcxLCB2b2lkICpfYXJnMikKK3sKKwl1bnNpZ25lZCBsb25nIHN5bmNfcmVnID0gKHVuc2lnbmVkIGxvbmcpIF9hcmcyOworCXU2NCBtYXNrID0gMSA8PCAoX19pcnFfaW5vKF9faXJxKGJ1Y2tldCkpICYgSU1BUF9JTk8pOworCXU2NCB2YWw7CisJaW50IGxpbWl0OworCisJc2NoaXpvX3dyaXRlKHN5bmNfcmVnLCBtYXNrKTsKKworCWxpbWl0ID0gMTAwMDAwOworCXZhbCA9IDA7CisJd2hpbGUgKC0tbGltaXQpIHsKKwkJdmFsID0gc2NoaXpvX3JlYWQoc3luY19yZWcpOworCQlpZiAoISh2YWwgJiBtYXNrKSkKKwkJCWJyZWFrOworCX0KKwlpZiAobGltaXQgPD0gMCkgeworCQlwcmludGsoInRvbWF0aWxsb193c3luY19oYW5kbGVyOiBETUEgd29uJ3Qgc3luYyBbJWx4OiVseF1cbiIsCisJCSAgICAgICB2YWwsIG1hc2spOworCX0KKworCWlmIChfYXJnMSkgeworCQlzdGF0aWMgdW5zaWduZWQgY2hhciBjYWNoZWxpbmVbNjRdCisJCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNjQpKSk7CisKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkICUlZnBycywgJTBcblx0IgorCQkJCSAgICAgIm9yICUwLCAlNCwgJTFcblx0IgorCQkJCSAgICAgIndyICUxLCAweDAsICUlZnByc1xuXHQiCisJCQkJICAgICAic3RkYSAlJWYwLCBbJTVdICU2XG5cdCIKKwkJCQkgICAgICJ3ciAlMCwgMHgwLCAlJWZwcnNcblx0IgorCQkJCSAgICAgIm1lbWJhciAjU3luYyIKKwkJCQkgICAgIDogIj0mciIgKG1hc2spLCAiPSZyIiAodmFsKQorCQkJCSAgICAgOiAiMCIgKG1hc2spLCAiMSIgKHZhbCksCisJCQkJICAgICAiaSIgKEZQUlNfRkVGKSwgInIiICgmY2FjaGVsaW5lWzBdKSwKKwkJCQkgICAgICJpIiAoQVNJX0JMS19DT01NSVRfUCkpOworCX0KK30KKwogc3RhdGljIHVuc2lnbmVkIGludCBzY2hpem9faXJxX2J1aWxkKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKIAkJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCSAgICAgdW5zaWduZWQgaW50IGlubykKQEAgLTM2OSw2ICs0MDgsMTUgQEAKIAlidWNrZXQgPSBfX2J1Y2tldChidWlsZF9pcnEocGlsLCBpZ25fZml4dXAsIGljbHIsIGltYXApKTsKIAlidWNrZXQtPmZsYWdzIHw9IElCRl9QQ0k7CiAKKwlpZiAocGRldiAmJiBwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTykgeworCQlzdHJ1Y3QgaXJxX2Rlc2MgKnAgPSBidWNrZXQtPmlycV9pbmZvOworCisJCXAtPnByZV9oYW5kbGVyID0gdG9tYXRpbGxvX3dzeW5jX2hhbmRsZXI7CisJCXAtPnByZV9oYW5kbGVyX2FyZzEgPSAoKHBibS0+Y2hpcF92ZXJzaW9uIDw9IDQpID8KKwkJCQkgICAgICAgKHZvaWQgKikgMSA6ICh2b2lkICopIDApOworCQlwLT5wcmVfaGFuZGxlcl9hcmcyID0gKHZvaWQgKikgcGJtLT5zeW5jX3JlZzsKKwl9CisKIAlyZXR1cm4gX19pcnEoYnVja2V0KTsKIH0KIApAQCAtODg1LDYgKzkzMyw3IEBACiAKICNkZWZpbmUgU0NISVpPX1BDSV9DVFJMCQkoMHgyMDAwVUwpCiAjZGVmaW5lIFNDSElaT19QQ0lDVFJMX0JVU19VTlVTCSgxVUwgPDwgNjNVTCkgLyogU2FmYXJpICovCisjZGVmaW5lIFNDSElaT19QQ0lDVFJMX0RUT19JTlQJKDFVTCA8PCA2MVVMKSAvKiBUb21hdGlsbG8gKi8KICNkZWZpbmUgU0NISVpPX1BDSUNUUkxfQVJCX1BSSU8gKDB4MWZmIDw8IDUyVUwpIC8qIFRvbWF0aWxsbyAqLwogI2RlZmluZSBTQ0hJWk9fUENJQ1RSTF9FU0xDSwkoMVVMIDw8IDUxVUwpIC8qIFNhZmFyaSAqLwogI2RlZmluZSBTQ0hJWk9fUENJQ1RSTF9FUlJTTE9UCSg3VUwgPDwgNDhVTCkgLyogU2FmYXJpICovCkBAIC0xODg3LDM3ICsxOTM2LDI3IEBACiB7CiAJdTY0IHRtcDsKIAotCS8qIFNldCBJUlEgcmV0cnkgdG8gaW5maW5pdHkuICovCi0Jc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0lSUV9SRVRSWSwKLQkJICAgICBTQ0hJWk9fSVJRX1JFVFJZX0lORik7CisJc2NoaXpvX3dyaXRlKHBibS0+cGJtX3JlZ3MgKyBTQ0hJWk9fUENJX0lSUV9SRVRSWSwgNSk7CiAKLQkvKiBFbmFibGUgYXJiaXRlciBmb3IgYWxsIFBDSSBzbG90cy4gIEFsc28sIGRpc2FibGUgUENJIGludGVydmFsCi0JICogdGltZXIgc28gdGhhdCBEVE8gKERpc2NhcmQgVGltZU91dHMpIGFyZSBub3QgcmVwb3J0ZWQgYmVjYXVzZQotCSAqIHNvbWUgU2NoaXpvIHJldmlzaW9ucyByZXBvcnQgdGhlbSBlcnJvbmVvdXNseS4KLQkgKi8KIAl0bXAgPSBzY2hpem9fcmVhZChwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9DVFJMKTsKLQlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9TQ0hJWk9fUExVUyAmJgotCSAgICBwYm0tPmNoaXBfdmVyc2lvbiA9PSAweDUgJiYKLQkgICAgcGJtLT5jaGlwX3JldmlzaW9uID09IDB4MSkKLQkJdG1wIHw9IDB4MGY7Ci0JZWxzZQotCQl0bXAgfD0gMHhmZjsKIAotCXRtcCAmPSB+U0NISVpPX1BDSUNUUkxfUFRPOworCS8qIEVuYWJsZSBhcmJpdGVyIGZvciBhbGwgUENJIHNsb3RzLiAgKi8KKwl0bXAgfD0gMHhmZjsKKwogCWlmIChwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyAmJgogCSAgICBwYm0tPmNoaXBfdmVyc2lvbiA+PSAweDIpCiAJCXRtcCB8PSAweDNVTCA8PCBTQ0hJWk9fUENJQ1RSTF9QVE9fU0hJRlQ7Ci0JZWxzZQotCQl0bXAgfD0gMHgxVUwgPDwgU0NISVpPX1BDSUNUUkxfUFRPX1NISUZUOwogCiAJaWYgKCFwcm9tX2dldGJvb2wocGJtLT5wcm9tX25vZGUsICJuby1idXMtcGFya2luZyIpKQogCQl0bXAgfD0gU0NISVpPX1BDSUNUUkxfUEFSSzsKKwllbHNlCisJCXRtcCAmPSB+U0NISVpPX1BDSUNUUkxfUEFSSzsKIAogCWlmIChwYm0tPmNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyAmJgogCSAgICBwYm0tPmNoaXBfdmVyc2lvbiA8PSAweDEpCi0JCXRtcCB8PSAoMVVMIDw8IDYxKTsKKwkJdG1wIHw9IFNDSElaT19QQ0lDVFJMX0RUT19JTlQ7CiAJZWxzZQotCQl0bXAgJj0gfigxVUwgPDwgNjEpOworCQl0bXAgJj0gflNDSElaT19QQ0lDVFJMX0RUT19JTlQ7CiAKIAlpZiAocGJtLT5jaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pCiAJCXRtcCB8PSAoU0NISVpPX1BDSUNUUkxfTVJNX1BSRUYgfApAQCAtMjAxNSw2ICsyMDU0LDkgQEAKIAlwYm0tPnBibV9yZWdzID0gcHJfcmVnc1swXS5waHlzX2FkZHI7CiAJcGJtLT5jb250cm9sbGVyX3JlZ3MgPSBwcl9yZWdzWzFdLnBoeXNfYWRkciAtIDB4MTAwMDBVTDsKIAorCWlmIChjaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8pCisJCXBibS0+c3luY19yZWcgPSBwcl9yZWdzWzNdLnBoeXNfYWRkciArIDB4MWExOFVMOworCiAJc3ByaW50ZihwYm0tPm5hbWUsCiAJCShjaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8gPwogCQkgIlRPTUFUSUxMTyVkIFBCTSVjIiA6CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKaW5kZXggNTJmMTRlMy4uNTMzMTA0YyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYwpAQCAtNCw2ICs0LDggQEAKICAqIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCiAgKi8KIAorI2RlZmluZSBfX0tFUk5FTF9TWVNDQUxMU19fCisKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTE3LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxhc20vZWJ1cy5oPgogI2luY2x1ZGUgPGFzbS9hdXhpby5oPgogCi0jZGVmaW5lIF9fS0VSTkVMX1NZU0NBTExTX18KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3B0cmFjZS5jCmluZGV4IDgwYTc2ZTIuLjIzYWQ4MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KIAogI2luY2x1ZGUgPGFzbS9hc2kuaD4KQEAgLTYyOCwxNSArNjMwLDI3IEBACiAJdW5sb2NrX2tlcm5lbCgpOwogfQogCi1hc21saW5rYWdlIHZvaWQgc3lzY2FsbF90cmFjZSh2b2lkKQorYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBzeXNjYWxsX2V4aXRfcCkKIHsKLSNpZmRlZiBERUJVR19QVFJBQ0UKLQlwcmludGsoIiVzIFslZF06IHN5c2NhbGxfdHJhY2VcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7Ci0jZW5kaWYKLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQotCQlyZXR1cm47CisJLyogZG8gdGhlIHNlY3VyZSBjb21wdXRpbmcgY2hlY2sgZmlyc3QgKi8KKwlzZWN1cmVfY29tcHV0aW5nKHJlZ3MtPnVfcmVnc1tVUkVHX0cxXSk7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+YXVkaXRfY29udGV4dCkgJiYgc3lzY2FsbF9leGl0X3ApIHsKKwkJdW5zaWduZWQgbG9uZyB0c3RhdGUgPSByZWdzLT50c3RhdGU7CisJCWludCByZXN1bHQgPSBBVURJVFNDX1NVQ0NFU1M7CisKKwkJaWYgKHVubGlrZWx5KHRzdGF0ZSAmIChUU1RBVEVfWENBUlJZIHwgVFNUQVRFX0lDQVJSWSkpKQorCQkJcmVzdWx0ID0gQVVESVRTQ19GQUlMVVJFOworCisJCWF1ZGl0X3N5c2NhbGxfZXhpdChjdXJyZW50LCByZXN1bHQsIHJlZ3MtPnVfcmVnc1tVUkVHX0kwXSk7CisJfQorCiAJaWYgKCEoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CisKKwlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQorCQlnb3RvIG91dDsKKwogCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8ICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKQogCQkJCSA/IDB4ODAgOiAwKSk7CiAKQEAgLTY0NSwxMiArNjU5LDIwIEBACiAJICogZm9yIG5vcm1hbCB1c2UuICBzdHJhY2Ugb25seSBjb250aW51ZXMgd2l0aCBhIHNpZ25hbCBpZiB0aGUKIAkgKiBzdG9wcGluZyBzaWduYWwgaXMgbm90IFNJR1RSQVAuICAtYnJsCiAJICovCi0jaWZkZWYgREVCVUdfUFRSQUNFCi0JcHJpbnRrKCIlcyBbJWRdOiBzeXNjYWxsX3RyYWNlIGV4aXQ9ICV4XG4iLCBjdXJyZW50LT5jb21tLAotCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmV4aXRfY29kZSk7Ci0jZW5kaWYKIAlpZiAoY3VycmVudC0+ZXhpdF9jb2RlKSB7Ci0JCXNlbmRfc2lnIChjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOworCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOwogCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOwogCX0KKworb3V0OgorCWlmICh1bmxpa2VseShjdXJyZW50LT5hdWRpdF9jb250ZXh0KSAmJiAhc3lzY2FsbF9leGl0X3ApCisJCWF1ZGl0X3N5c2NhbGxfZW50cnkoY3VycmVudCwKKwkJCQkgICAgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSA/CisJCQkJICAgICBBVURJVF9BUkNIX1NQQVJDIDoKKwkJCQkgICAgIEFVRElUX0FSQ0hfU1BBUkM2NCksCisJCQkJICAgIHJlZ3MtPnVfcmVnc1tVUkVHX0cxXSwKKwkJCQkgICAgcmVncy0+dV9yZWdzW1VSRUdfSTBdLAorCQkJCSAgICByZWdzLT51X3JlZ3NbVVJFR19JMV0sCisJCQkJICAgIHJlZ3MtPnVfcmVnc1tVUkVHX0kyXSwKKwkJCQkgICAgcmVncy0+dV9yZWdzW1VSRUdfSTNdKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NlbWFwaG9yZS5jCmluZGV4IDYzNDk2YzQuLmE4MDllNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2VtYXBob3JlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZW1hcGhvcmUuYwpAQCAtMzIsOCArMzIsOSBAQAogIglhZGQJJTEsICU0LCAlMVxuIgogIgljYXMJWyUzXSwgJTAsICUxXG4iCiAiCWNtcAklMCwgJTFcbiIKKyIJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibmUscG4JJSVpY2MsIDFiXG4iCi0iCSBtZW1iYXIgI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCisiCSBub3BcbiIKIAk6ICI9JnIiIChvbGRfY291bnQpLCAiPSZyIiAodG1wKSwgIj1tIiAoc2VtLT5jb3VudCkKIAk6ICJyIiAoJnNlbS0+Y291bnQpLCAiciIgKGluY3IpLCAibSIgKHNlbS0+Y291bnQpCiAJOiAiY2MiKTsKQEAgLTcxLDggKzcyLDkgQEAKICIJY21wCSUlZzEsICUlZzdcbiIKICIJYm5lLHBuCSUlaWNjLCAxYlxuIgogIgkgYWRkY2MJJSVnNywgMSwgJSVnMFxuIgorIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJsZSxwbgklJWljYywgM2ZcbiIKLSIJIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJIG5vcFxuIgogIjI6XG4iCiAiCS5zdWJzZWN0aW9uIDJcbiIKICIzOgltb3YJJTAsICUlZzFcbiIKQEAgLTEyOCw4ICsxMzAsOSBAQAogIgljbXAJJSVnMSwgJSVnN1xuIgogIglibmUscG4JJSVpY2MsIDFiXG4iCiAiCSBjbXAJJSVnNywgMVxuIgorIgltZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJsLHBuCSUlaWNjLCAzZlxuIgotIgkgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgorIgkgbm9wXG4iCiAiMjpcbiIKICIJLnN1YnNlY3Rpb24gMlxuIgogIjM6CW1vdgklMCwgJSVnMVxuIgpAQCAtMjMzLDggKzIzNiw5IEBACiAiCWNtcAklJWcxLCAlJWc3XG4iCiAiCWJuZSxwbgklJWljYywgMWJcbiIKICIJIGNtcAklJWc3LCAxXG4iCisiCW1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJYmwscG4JJSVpY2MsIDNmXG4iCi0iCSBtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCisiCSBub3BcbiIKICIyOlxuIgogIgkuc3Vic2VjdGlvbiAyXG4iCiAiMzoJbW92CSUyLCAlJWcxXG4iCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwppbmRleCBlNWI5YzdhLi43ZThlMjkxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKQEAgLTQ1LDggKzQ1LDggQEAKIC8qIFBsZWFzZSBkb24ndCBtYWtlIHRoaXMgc3R1ZmYgaW5pdGRhdGEhISEgIC0tRGF2ZU0gKi8KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJvb3RfY3B1X2lkOwogCi1jcHVtYXNrX3QgY3B1X29ubGluZV9tYXAgPSBDUFVfTUFTS19OT05FOwotY3B1bWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gQ1BVX01BU0tfTk9ORTsKK2NwdW1hc2tfdCBjcHVfb25saW5lX21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKK2NwdW1hc2tfdCBwaHlzX2NwdV9wcmVzZW50X21hcCBfX3JlYWRfbW9zdGx5ID0gQ1BVX01BU0tfTk9ORTsKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwogc3RhdGljIGNwdW1hc2tfdCBjcHVfY2FsbG91dF9tYXA7CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogCXBhbmljKCJTTVAgYm9saXhlZFxuIik7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGlja19vZmZzZXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RpY2tfb2Zmc2V0IF9fcmVhZF9tb3N0bHk7CiAKIC8qIFRoaXMgdGljayByZWdpc3RlciBzeW5jaHJvbml6YXRpb24gc2NoZW1lIGlzIHRha2VuIGVudGlyZWx5IGZyb20KICAqIHRoZSBpYTY0IHBvcnQsIHNlZSBhcmNoL2lhNjQva2VybmVsL3NtcGJvb3QuYyBmb3IgZGV0YWlscyBhbmQgY3JlZGl0LgpAQCAtMTE5Myw4ICsxMTkzLDggQEAKIHsKIH0KIAotdW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfYmFzZTsKLXVuc2lnbmVkIGxvbmcgX19wZXJfY3B1X3NoaWZ0OwordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfYmFzZSBfX3JlYWRfbW9zdGx5OwordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfc2hpZnQgX19yZWFkX21vc3RseTsKIAogRVhQT1JUX1NZTUJPTChfX3Blcl9jcHVfYmFzZSk7CiBFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9zaGlmdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NwYXJjNjRfa3N5bXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCmluZGV4IGU3OGNjNTMuLjkyMDJkOTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3BhcmM2NF9rc3ltcy5jCkBAIC03OSw3ICs3OSw3IEBACiBleHRlcm4gdm9pZCBydHJhcCh2b2lkKTsKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkIHNvbGFyaXNfc3lzY2FsbCh2b2lkKTsKLWV4dGVybiB2b2lkIHN5c2NhbGxfdHJhY2Uodm9pZCk7CitleHRlcm4gdm9pZCBzeXNjYWxsX3RyYWNlKHN0cnVjdCBwdF9yZWdzICosIGludCk7CiBleHRlcm4gdTMyIHN1bm9zX3N5c190YWJsZVtdLCBzeXNfY2FsbF90YWJsZTMyW107CiBleHRlcm4gdm9pZCB0bDBfc29sYXJpcyh2b2lkKTsKIGV4dGVybiB2b2lkIHN5c19zaWdzdXNwZW5kKHZvaWQpOwpAQCAtMjI3LDcgKzIyNyw2IEBACiAKIEVYUE9SVF9TWU1CT0wobW9zdGVrX2xvY2spOwogRVhQT1JUX1NZTUJPTChtc3RrNDh0MDJfcmVncyk7Ci1FWFBPUlRfU1lNQk9MKHJlcXVlc3RfZmFzdF9pcnEpOwogI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KIEVYUE9SVF9TWU1CT0woYXV4aW9fc2V0X2xlZCk7CiBFWFBPUlRfU1lNQk9MKGF1eGlvX3NldF9sdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXMzMi5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXMzMi5TCmluZGV4IDVhOTVlOTguLjVmOWU0ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzMzIuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5czMyLlMKQEAgLTEzNSw2ICsxMzUsOCBAQAogU0lHTjMoc3lzMzJfc29ja2V0cGFpciwgc3lzX3NvY2tldHBhaXIsICVvMCwgJW8xLCAlbzIpCiBTSUdOMShzeXMzMl9nZXRwZWVybmFtZSwgc3lzX2dldHBlZXJuYW1lLCAlbzApCiBTSUdOMShzeXMzMl9nZXRzb2NrbmFtZSwgc3lzX2dldHNvY2tuYW1lLCAlbzApCitTSUdOMihzeXMzMl9pb3ByaW9fZ2V0LCBzeXNfaW9wcmlvX2dldCwgJW8wLCAlbzEpCitTSUdOMyhzeXMzMl9pb3ByaW9fc2V0LCBzeXNfaW9wcmlvX3NldCwgJW8wLCAlbzEsICVvMikKIAogCS5nbG9ibAkJc3lzMzJfbW1hcDIKIHN5czMyX21tYXAyOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXN0YmxzLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwppbmRleCBhNWUzNmE0Li5iY2ViOTFhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwpAQCAtNTksMTEgKzU5LDExIEBACiAvKjE4MCovCS53b3JkIHN5czMyX2ZsaXN0eGF0dHIsIHN5c19yZW1vdmV4YXR0ciwgc3lzX2xyZW1vdmV4YXR0ciwgY29tcGF0X3N5c19zaWdwZW5kaW5nLCBzeXNfbmlfc3lzY2FsbAogCS53b3JkIHN5czMyX3NldHBnaWQsIHN5czMyX2ZyZW1vdmV4YXR0ciwgc3lzMzJfdGtpbGwsIHN5czMyX2V4aXRfZ3JvdXAsIHNwYXJjNjRfbmV3dW5hbWUKIC8qMTkwKi8JLndvcmQgc3lzMzJfaW5pdF9tb2R1bGUsIHNwYXJjNjRfcGVyc29uYWxpdHksIHN5c19yZW1hcF9maWxlX3BhZ2VzLCBzeXMzMl9lcG9sbF9jcmVhdGUsIHN5czMyX2Vwb2xsX2N0bAotCS53b3JkIHN5czMyX2Vwb2xsX3dhaXQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2dldHBwaWQsIHN5czMyX3NpZ2FjdGlvbiwgc3lzX3NnZXRtYXNrCisJLndvcmQgc3lzMzJfZXBvbGxfd2FpdCwgc3lzMzJfaW9wcmlvX3NldCwgc3lzX2dldHBwaWQsIHN5czMyX3NpZ2FjdGlvbiwgc3lzX3NnZXRtYXNrCiAvKjIwMCovCS53b3JkIHN5czMyX3NzZXRtYXNrLCBzeXNfc2lnc3VzcGVuZCwgY29tcGF0X3N5c19uZXdsc3RhdCwgc3lzX3VzZWxpYiwgY29tcGF0X3N5c19vbGRfcmVhZGRpcgogCS53b3JkIHN5czMyX3JlYWRhaGVhZCwgc3lzMzJfc29ja2V0Y2FsbCwgc3lzMzJfc3lzbG9nLCBzeXMzMl9sb29rdXBfZGNvb2tpZSwgc3lzMzJfZmFkdmlzZTY0CiAvKjIxMCovCS53b3JkIHN5czMyX2ZhZHZpc2U2NF82NCwgc3lzMzJfdGdraWxsLCBzeXMzMl93YWl0cGlkLCBzeXNfc3dhcG9mZiwgc3lzMzJfc3lzaW5mbwotCS53b3JkIHN5czMyX2lwYywgc3lzMzJfc2lncmV0dXJuLCBzeXNfY2xvbmUsIHN5c19uaXNfc3lzY2FsbCwgc3lzMzJfYWRqdGltZXgKKwkud29yZCBzeXMzMl9pcGMsIHN5czMyX3NpZ3JldHVybiwgc3lzX2Nsb25lLCBzeXMzMl9pb3ByaW9fZ2V0LCBzeXMzMl9hZGp0aW1leAogLyoyMjAqLwkud29yZCBzeXMzMl9zaWdwcm9jbWFzaywgc3lzX25pX3N5c2NhbGwsIHN5czMyX2RlbGV0ZV9tb2R1bGUsIHN5c19uaV9zeXNjYWxsLCBzeXMzMl9nZXRwZ2lkCiAJLndvcmQgc3lzMzJfYmRmbHVzaCwgc3lzMzJfc3lzZnMsIHN5c19uaXNfc3lzY2FsbCwgc3lzMzJfc2V0ZnN1aWQxNiwgc3lzMzJfc2V0ZnNnaWQxNgogLyoyMzAqLwkud29yZCBzeXMzMl9zZWxlY3QsIGNvbXBhdF9zeXNfdGltZSwgc3lzX25pc19zeXNjYWxsLCBjb21wYXRfc3lzX3N0aW1lLCBjb21wYXRfc3lzX3N0YXRmczY0CkBAIC0xMjUsMTEgKzEyNSwxMSBAQAogLyoxODAqLwkud29yZCBzeXNfZmxpc3R4YXR0ciwgc3lzX3JlbW92ZXhhdHRyLCBzeXNfbHJlbW92ZXhhdHRyLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19uaV9zeXNjYWxsCiAJLndvcmQgc3lzX3NldHBnaWQsIHN5c19mcmVtb3ZleGF0dHIsIHN5c190a2lsbCwgc3lzX2V4aXRfZ3JvdXAsIHNwYXJjNjRfbmV3dW5hbWUKIC8qMTkwKi8JLndvcmQgc3lzX2luaXRfbW9kdWxlLCBzcGFyYzY0X3BlcnNvbmFsaXR5LCBzeXNfcmVtYXBfZmlsZV9wYWdlcywgc3lzX2Vwb2xsX2NyZWF0ZSwgc3lzX2Vwb2xsX2N0bAotCS53b3JkIHN5c19lcG9sbF93YWl0LCBzeXNfbmlzX3N5c2NhbGwsIHN5c19nZXRwcGlkLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zZ2V0bWFzaworCS53b3JkIHN5c19lcG9sbF93YWl0LCBzeXNfaW9wcmlvX3NldCwgc3lzX2dldHBwaWQsIHN5c19uaXNfc3lzY2FsbCwgc3lzX3NnZXRtYXNrCiAvKjIwMCovCS53b3JkIHN5c19zc2V0bWFzaywgc3lzX25pc19zeXNjYWxsLCBzeXNfbmV3bHN0YXQsIHN5c191c2VsaWIsIHN5c19uaXNfc3lzY2FsbAogCS53b3JkIHN5c19yZWFkYWhlYWQsIHN5c19zb2NrZXRjYWxsLCBzeXNfc3lzbG9nLCBzeXNfbG9va3VwX2Rjb29raWUsIHN5c19mYWR2aXNlNjQKIC8qMjEwKi8JLndvcmQgc3lzX2ZhZHZpc2U2NF82NCwgc3lzX3Rna2lsbCwgc3lzX3dhaXRwaWQsIHN5c19zd2Fwb2ZmLCBzeXNfc3lzaW5mbwotCS53b3JkIHN5c19pcGMsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2Nsb25lLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19hZGp0aW1leAorCS53b3JkIHN5c19pcGMsIHN5c19uaXNfc3lzY2FsbCwgc3lzX2Nsb25lLCBzeXNfaW9wcmlvX2dldCwgc3lzX2FkanRpbWV4CiAvKjIyMCovCS53b3JkIHN5c19uaXNfc3lzY2FsbCwgc3lzX25pX3N5c2NhbGwsIHN5c19kZWxldGVfbW9kdWxlLCBzeXNfbmlfc3lzY2FsbCwgc3lzX2dldHBnaWQKIAkud29yZCBzeXNfYmRmbHVzaCwgc3lzX3N5c2ZzLCBzeXNfbmlzX3N5c2NhbGwsIHN5c19zZXRmc3VpZCwgc3lzX3NldGZzZ2lkCiAvKjIzMCovCS53b3JkIHN5c19zZWxlY3QsIHN5c19uaXNfc3lzY2FsbCwgc3lzX25pc19zeXNjYWxsLCBzeXNfc3RpbWUsIHN5c19zdGF0ZnM2NApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwppbmRleCA3MWI0ZTM4Li4zNjJiOWMyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwpAQCAtNzMsNyArNzMsNyBAQAogCS5nZXRfdGljawk9IGR1bW15X2dldF90aWNrLAogfTsKIAotc3RydWN0IHNwYXJjNjRfdGlja19vcHMgKnRpY2tfb3BzID0gJmR1bW15X3RpY2tfb3BzOworc3RydWN0IHNwYXJjNjRfdGlja19vcHMgKnRpY2tfb3BzIF9fcmVhZF9tb3N0bHkgPSAmZHVtbXlfdGlja19vcHM7CiAKICNkZWZpbmUgVElDS19QUklWX0JJVAkoMVVMIDw8IDYzKQogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAlyZXR1cm4gbmV3X3RpY2s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BhcmM2NF90aWNrX29wcyB0aWNrX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgdGlja19vcGVyYXRpb25zIF9fcmVhZF9tb3N0bHkgPSB7CiAJLmluaXRfdGljawk9CXRpY2tfaW5pdF90aWNrLAogCS5nZXRfdGljawk9CXRpY2tfZ2V0X3RpY2ssCiAJLmdldF9jb21wYXJlCT0JdGlja19nZXRfY29tcGFyZSwKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXJldHVybiBuZXdfY29tcGFyZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzcGFyYzY0X3RpY2tfb3BzIHN0aWNrX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgc3RpY2tfb3BlcmF0aW9ucyBfX3JlYWRfbW9zdGx5ID0gewogCS5pbml0X3RpY2sJPQlzdGlja19pbml0X3RpY2ssCiAJLmdldF90aWNrCT0Jc3RpY2tfZ2V0X3RpY2ssCiAJLmdldF9jb21wYXJlCT0Jc3RpY2tfZ2V0X2NvbXBhcmUsCkBAIC00MjIsNyArNDIyLDcgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgaGJ0aWNrX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgc3RydWN0IHNwYXJjNjRfdGlja19vcHMgaGJ0aWNrX29wZXJhdGlvbnMgX19yZWFkX21vc3RseSA9IHsKIAkuaW5pdF90aWNrCT0JaGJ0aWNrX2luaXRfdGljaywKIAkuZ2V0X3RpY2sJPQloYnRpY2tfZ2V0X3RpY2ssCiAJLmdldF9jb21wYXJlCT0JaGJ0aWNrX2dldF9jb21wYXJlLApAQCAtNDM3LDEwICs0MzcsOSBAQAogICogTk9URTogT24gU1VONSBzeXN0ZW1zIHRoZSB0aWNrZXIgaW50ZXJydXB0IGNvbWVzIGluIHVzaW5nIDIKICAqICAgICAgIGludGVycnVwdHMsIG9uZSBhdCBsZXZlbDE0IGFuZCBvbmUgd2l0aCBzb2Z0aW50IGJpdCAwLgogICovCi11bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tfb2Zmc2V0OwotdW5zaWduZWQgbG9uZyB0aW1lcl90aWNrX2NvbXBhcmU7Cit1bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tfb2Zmc2V0IF9fcmVhZF9tb3N0bHk7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX3RpY2tzX3Blcl9uc2VjX3F1b3RpZW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfdGlja3NfcGVyX25zZWNfcXVvdGllbnQgX19yZWFkX21vc3RseTsKIAogI2RlZmluZSBUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCiAKQEAgLTQ2NCw3ICs0NjMsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQogewotCXVuc2lnbmVkIGxvbmcgdGlja3MsIHBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHRpY2tzLCBjb21wYXJlLCBwc3RhdGU7CiAKIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKIApAQCAtNDgzLDE0ICs0ODIsMTQgQEAKIAkJCQkgICAgIDogIj1yIiAocHN0YXRlKQogCQkJCSAgICAgOiAiaSIgKFBTVEFURV9JRSkpOwogCi0JCXRpbWVyX3RpY2tfY29tcGFyZSA9IHRpY2tfb3BzLT5hZGRfY29tcGFyZSh0aW1lcl90aWNrX29mZnNldCk7CisJCWNvbXBhcmUgPSB0aWNrX29wcy0+YWRkX2NvbXBhcmUodGltZXJfdGlja19vZmZzZXQpOwogCQl0aWNrcyA9IHRpY2tfb3BzLT5nZXRfdGljaygpOwogCiAJCS8qIFJlc3RvcmUgUFNUQVRFX0lFLiAqLwogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3JwcgklMCwgMHgwLCAlJXBzdGF0ZSIKIAkJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLwogCQkJCSAgICAgOiAiciIgKHBzdGF0ZSkpOwotCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEodGlja3MsIHRpbWVyX3RpY2tfY29tcGFyZSkpOworCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEodGlja3MsIGNvbXBhcmUpKTsKIAogCXRpbWVyX2NoZWNrX3J0YygpOwogCkBAIC01MDYsMTEgKzUwNSw2IEBACiAKIAlkb190aW1lcihyZWdzKTsKIAotCS8qCi0JICogT25seSBrZWVwIHRpbWVyX3RpY2tfb2Zmc2V0IHVwdG9kYXRlLCBidXQgZG9uJ3Qgc2V0IFRJQ0tfQ01QUi4KLQkgKi8KLQl0aW1lcl90aWNrX2NvbXBhcmUgPSB0aWNrX29wcy0+Z2V0X2NvbXBhcmUoKSArIHRpbWVyX3RpY2tfb2Zmc2V0OwotCiAJdGltZXJfY2hlY2tfcnRjKCk7CiAKIAl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwpAQCAtOTczLDcgKzk2Nyw3IEBACiAJaW50IGVycjsKIAogCS8qIFJlZ2lzdGVyIElSUSBoYW5kbGVyLiAqLwotCWVyciA9IHJlcXVlc3RfaXJxKGJ1aWxkX2lycSgwLCAwLCAwVUwsIDBVTCksIGNmdW5jLCBTQV9TVEFUSUNfQUxMT0MsCisJZXJyID0gcmVxdWVzdF9pcnEoYnVpbGRfaXJxKDAsIDAsIDBVTCwgMFVMKSwgY2Z1bmMsIDAsCiAJCQkgICJ0aW1lciIsIE5VTEwpOwogCiAJaWYgKGVycikgewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFtcG9saW5lLlMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYW1wb2xpbmUuUwppbmRleCAyYzhmOTM0Li4zYTE0NWZjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYW1wb2xpbmUuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RyYW1wb2xpbmUuUwpAQCAtOTgsOCArOTgsOSBAQAogCiAJc2V0aGkJCSVoaShwcm9tX2VudHJ5X2xvY2spLCAlZzIKIDE6CWxkc3R1YgkJWyVnMiArICVsbyhwcm9tX2VudHJ5X2xvY2spXSwgJWcxCisJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlicm56LHBuCQklZzEsIDFiCi0JIG1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCisJIG5vcAogCiAJc2V0aGkJCSVoaShwMTI3NWJ1ZiksICVnMgogCW9yCQklZzIsICVsbyhwMTI3NWJ1ZiksICVnMgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDM4MmZkNjcuLjk1MDQyM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTMyLDYgKzMyLDggQEAKICAgLmRhdGExICAgOiB7ICooLmRhdGExKSB9CiAgIC4gPSBBTElHTig2NCk7CiAgIC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkIDogeyAqKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSB9CisgIC4gPSBBTElHTig2NCk7CisgIC5kYXRhLnJlYWRfbW9zdGx5IDogeyAqKC5kYXRhLnJlYWRfbW9zdGx5KSB9CiAgIF9lZGF0YSAgPSAgLjsKICAgUFJPVklERSAoZWRhdGEgPSAuKTsKICAgLmZpeHVwICAgOiB7ICooLmZpeHVwKSB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL1UxbWVtY3B5LlMgYi9hcmNoL3NwYXJjNjQvbGliL1UxbWVtY3B5LlMKaW5kZXggZGE5YjUyMC4uYmFmZDJmYyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9VMW1lbWNweS5TCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvVTFtZW1jcHkuUwpAQCAtODcsMTQgKzg3LDE3IEBACiAjZGVmaW5lIExPT1BfQ0hVTkszKHNyYywgZGVzdCwgbGVuLCBicmFuY2hfZGVzdCkJCVwKIAlNQUlOX0xPT1BfQ0hVTksoc3JjLCBkZXN0LCBmMzIsIGY0OCwgbGVuLCBicmFuY2hfZGVzdCkKIAorI2RlZmluZSBET19TWU5DCQkJbWVtYmFyCSNTeW5jOwogI2RlZmluZSBTVE9SRV9TWU5DKGRlc3QsIGZzcmMpCQkJCVwKIAlFWF9TVChTVE9SRV9CTEsoJWZzcmMsICVkZXN0KSk7CQkJXAotCWFkZAkJCSVkZXN0LCAweDQwLCAlZGVzdDsKKwlhZGQJCQklZGVzdCwgMHg0MCwgJWRlc3Q7CVwKKwlET19TWU5DCiAKICNkZWZpbmUgU1RPUkVfSlVNUChkZXN0LCBmc3JjLCB0YXJnZXQpCQkJXAogCUVYX1NUKFNUT1JFX0JMSyglZnNyYywgJWRlc3QpKTsJCQlcCiAJYWRkCQkJJWRlc3QsIDB4NDAsICVkZXN0OwlcCi0JYmEscHQJCQkleGNjLCB0YXJnZXQ7CisJYmEscHQJCQkleGNjLCB0YXJnZXQ7CQlcCisJIG5vcDsKIAogI2RlZmluZSBGSU5JU0hfVklTQ0hVTksoZGVzdCwgZjAsIGYxLCBsZWZ0KQlcCiAJc3ViY2MJCQklbGVmdCwgOCwgJWxlZnQ7XApAQCAtMjM5LDE3ICsyNDIsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmMCwgJWYyLCAlZjQ4CiAxOglGUkVHX0ZST0IoZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzMixmMzQsZjM2LGYzOCxmNDAsZjQyLGY0NCxmNDYsZjApCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0MGYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDBmKQogMjoJRlJFR19GUk9CKGYzMixmMzQsZjM2LGYzOCxmNDAsZjQyLGY0NCxmNDYsZjApCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDhmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ4ZikKIDM6CUZSRUdfRlJPQihmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNikKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1NmYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTZmKQogCiAxOglGUkVHX0ZST0IoZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgpCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMjYwLDE3ICsyNjMsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmMiwgJWY0LCAlZjQ4CiAxOglGUkVHX0ZST0IoZjE4LGYyMCxmMjIsZjI0LGYyNixmMjgsZjMwLGYzMixmMzQpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0LGY0NixmMCwgZjIpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0MWYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDFmKQogMjoJRlJFR19GUk9CKGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0LGY0NixmMCwgZjIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYyLCBmNCwgZjYsIGY4LCBmMTAsZjEyLGYxNCxmMTYsZjE4KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDlmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ5ZikKIDM6CUZSRUdfRlJPQihmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjE4LGYyMCxmMjIsZjI0LGYyNixmMjgsZjMwLGYzMixmMzQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1N2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTdmKQogCiAxOglGUkVHX0ZST0IoZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCxmMjApCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMjgxLDE3ICsyODQsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmNCwgJWY2LCAlZjQ4CiAxOglGUkVHX0ZST0IoZjIwLGYyMixmMjQsZjI2LGYyOCxmMzAsZjMyLGYzNCxmMzYpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzNixmMzgsZjQwLGY0MixmNDQsZjQ2LGYwLCBmMiwgZjQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0MmYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDJmKQogMjoJRlJFR19GUk9CKGYzNixmMzgsZjQwLGY0MixmNDQsZjQ2LGYwLCBmMiwgZjQpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNTBmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDUwZikKIDM6CUZSRUdfRlJPQihmNCwgZjYsIGY4LCBmMTAsZjEyLGYxNCxmMTYsZjE4LGYyMCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjIwLGYyMixmMjQsZjI2LGYyOCxmMzAsZjMyLGYzNCxmMzYpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1OGYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNThmKQogCiAxOglGUkVHX0ZST0IoZjYsIGY4LCBmMTAsZjEyLGYxNCxmMTYsZjE4LGYyMCxmMjIpCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMzAyLDE3ICszMDUsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmNiwgJWY4LCAlZjQ4CiAxOglGUkVHX0ZST0IoZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzOCxmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0M2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDNmKQogMjoJRlJFR19GUk9CKGYzOCxmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGY2LCBmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNTFmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDUxZikKIDM6CUZSRUdfRlJPQihmNiwgZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMikKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjIyLGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1OWYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTlmKQogCiAxOglGUkVHX0ZST0IoZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQpCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMzIzLDE3ICszMjYsMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmOCwgJWYxMCwgJWY0OAogMToJRlJFR19GUk9CKGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwKQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYsIGY4KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDRmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ0ZikKIDI6CUZSRUdfRlJPQihmNDAsZjQyLGY0NCxmNDYsZjAsIGYyLCBmNCwgZjYsIGY4KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmOCwgZjEwLGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCkKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDUyZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA1MmYpCiAzOglGUkVHX0ZST0IoZjgsIGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYyNCxmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNjBmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDYwZikKIAogMToJRlJFR19GUk9CKGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2KQogCUxPT1BfQ0hVTksxKG8xLCBvMCwgR0xPQkFMX1NQQVJFLCAxZikKQEAgLTM0NCwxNyArMzQ3LDE3IEBACiAJYmEscHQJCSV4Y2MsIDFiKzQKIAkgZmFsaWduZGF0YQklZjEwLCAlZjEyLCAlZjQ4CiAxOglGUkVHX0ZST0IoZjI2LGYyOCxmMzAsZjMyLGYzNCxmMzYsZjM4LGY0MCxmNDIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGY0MixmNDQsZjQ2LGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwKQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNDVmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ1ZikKIDI6CUZSRUdfRlJPQihmNDIsZjQ0LGY0NixmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjEwLGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA1M2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNTNmKQogMzoJRlJFR19GUk9CKGYxMCxmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmMjYsZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwLGY0MikKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDYxZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA2MWYpCiAKIDE6CUZSRUdfRlJPQihmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCkKIAlMT09QX0NIVU5LMShvMSwgbzAsIEdMT0JBTF9TUEFSRSwgMWYpCkBAIC0zNjUsMTcgKzM2OCwxNyBAQAogCWJhLHB0CQkleGNjLCAxYis0CiAJIGZhbGlnbmRhdGEJJWYxMiwgJWYxNCwgJWY0OAogMToJRlJFR19GUk9CKGYyOCxmMzAsZjMyLGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmNDQsZjQ2LGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMikKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDQ2ZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA0NmYpCiAyOglGUkVHX0ZST0IoZjQ0LGY0NixmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIpCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYxMixmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNTRmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDU0ZikKIDM6CUZSRUdfRlJPQihmMTIsZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCkKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjI4LGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwLGY0MixmNDQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA2MmYpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNjJmKQogCiAxOglGUkVHX0ZST0IoZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCxmMzApCiAJTE9PUF9DSFVOSzEobzEsIG8wLCBHTE9CQUxfU1BBUkUsIDFmKQpAQCAtMzg2LDE3ICszODksMTcgQEAKIAliYSxwdAkJJXhjYywgMWIrNAogCSBmYWxpZ25kYXRhCSVmMTQsICVmMTYsICVmNDgKIDE6CUZSRUdfRlJPQihmMzAsZjMyLGYzNCxmMzYsZjM4LGY0MCxmNDIsZjQ0LGY0NikKLQlTVE9SRV9TWU5DKG8wLCBmNDgpIG1lbWJhciAjU3luYworCVNUT1JFX1NZTkMobzAsIGY0OCkKIAlGUkVHX0ZST0IoZjQ2LGYwLCBmMiwgZjQsIGY2LCBmOCwgZjEwLGYxMixmMTQpCi0JU1RPUkVfSlVNUChvMCwgZjQ4LCA0N2YpIG1lbWJhciAjU3luYworCVNUT1JFX0pVTVAobzAsIGY0OCwgNDdmKQogMjoJRlJFR19GUk9CKGY0NixmMCwgZjIsIGY0LCBmNiwgZjgsIGYxMCxmMTIsZjE0KQotCVNUT1JFX1NZTkMobzAsIGY0OCkgbWVtYmFyICNTeW5jCisJU1RPUkVfU1lOQyhvMCwgZjQ4KQogCUZSRUdfRlJPQihmMTQsZjE2LGYxOCxmMjAsZjIyLGYyNCxmMjYsZjI4LGYzMCkKLQlTVE9SRV9KVU1QKG8wLCBmNDgsIDU1ZikgbWVtYmFyICNTeW5jCisJU1RPUkVfSlVNUChvMCwgZjQ4LCA1NWYpCiAzOglGUkVHX0ZST0IoZjE0LGYxNixmMTgsZjIwLGYyMixmMjQsZjI2LGYyOCxmMzApCi0JU1RPUkVfU1lOQyhvMCwgZjQ4KSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9TWU5DKG8wLCBmNDgpCiAJRlJFR19GUk9CKGYzMCxmMzIsZjM0LGYzNixmMzgsZjQwLGY0MixmNDQsZjQ2KQotCVNUT1JFX0pVTVAobzAsIGY0OCwgNjNmKSBtZW1iYXIgI1N5bmMKKwlTVE9SRV9KVU1QKG8wLCBmNDgsIDYzZikKIAogNDA6CUZJTklTSF9WSVNDSFVOSyhvMCwgZjAsICBmMiwgIGczKQogNDE6CUZJTklTSF9WSVNDSFVOSyhvMCwgZjIsICBmNCwgIGczKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9WSVNzYXZlLlMgYi9hcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUwppbmRleCA2NWUzMjhkLi40ZTE4OTg5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUworKysgYi9hcmNoL3NwYXJjNjQvbGliL1ZJU3NhdmUuUwpAQCAtNzIsNyArNzIsMTEgQEAKIAogCXN0ZGEJCSVmNDgsIFslZzMgKyAlZzFdIEFTSV9CTEtfUAogNToJbWVtYmFyCQkjU3luYwotCWptcGwJCSVnNyArICVnMCwgJWcwCisJYmEscHQJCSV4Y2MsIDgwZgorCSBub3AKKworCS5hbGlnbgkJMzIKKzgwOglqbXBsCQklZzcgKyAlZzAsICVnMAogCSBub3AKIAogNjoJbGR1YgkJWyVnMyArIFRJX0ZQU0FWRURdLCAlbzUKQEAgLTg3LDggKzkxLDExIEBACiAJc3RkYQkJJWYzMiwgWyVnMiArICVnMV0gQVNJX0JMS19QCiAJc3RkYQkJJWY0OCwgWyVnMyArICVnMV0gQVNJX0JMS19QCiAJbWVtYmFyCQkjU3luYwotCWptcGwJCSVnNyArICVnMCwgJWcwCisJYmEscHQJCSV4Y2MsIDgwZgorCSBub3AKIAorCS5hbGlnbgkJMzIKKzgwOglqbXBsCQklZzcgKyAlZzAsICVnMAogCSBub3AKIAogCS5hbGlnbgkJMzIKQEAgLTEyNiw2ICsxMzMsMTAgQEAKIAlzdGRhCQklZjAsIFslZzIgKyAlZzFdIEFTSV9CTEtfUAogCXN0ZGEJCSVmMTYsIFslZzMgKyAlZzFdIEFTSV9CTEtfUAogCW1lbWJhcgkJI1N5bmMKKwliYSxwdAkJJXhjYywgNGYKKwkgbm9wCisKKwkuYWxpZ24JCTMyCiA0OglhbmQJCSVvNSwgRlBSU19EVSwgJW81CiAJam1wbAkJJWc3ICsgJWcwLCAlZzAKIAkgd3IJCSVvNSwgRlBSU19GRUYsICVmcHJzCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL2F0b21pYy5TIGIvYXJjaC9zcGFyYzY0L2xpYi9hdG9taWMuUwppbmRleCBlNTI4YjhkLi5mYWY4N2MzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2F0b21pYy5TCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvYXRvbWljLlMKQEAgLTcsMTggKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9hc2kuaD4KIAotCS8qIE9uIFNNUCB3ZSBuZWVkIHRvIHVzZSBtZW1vcnkgYmFycmllcnMgdG8gZW5zdXJlCi0JICogY29ycmVjdCBtZW1vcnkgb3BlcmF0aW9uIG9yZGVyaW5nLCBub3AgdGhlc2Ugb3V0Ci0JICogZm9yIHVuaXByb2Nlc3Nvci4KLQkgKi8KLSNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgltZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZAotI2RlZmluZSBBVE9NSUNfUE9TVF9CQVJSSUVSCW1lbWJhciAjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKLSNlbHNlCi0jZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUglub3AKLSNkZWZpbmUgQVRPTUlDX1BPU1RfQkFSUklFUglub3AKLSNlbmRpZgotCiAJLnRleHQKIAogCS8qIFR3byB2ZXJzaW9ucyBvZiB0aGUgYXRvbWljIHJvdXRpbmVzLCBvbmUgdGhhdApAQCAtNTIsNiArNDAsMjQgQEAKIAkgbm9wCiAJLnNpemUJYXRvbWljX3N1YiwgLi1hdG9taWNfc3ViCiAKKwkvKiBPbiBTTVAgd2UgbmVlZCB0byB1c2UgbWVtb3J5IGJhcnJpZXJzIHRvIGVuc3VyZQorCSAqIGNvcnJlY3QgbWVtb3J5IG9wZXJhdGlvbiBvcmRlcmluZywgbm9wIHRoZXNlIG91dAorCSAqIGZvciB1bmlwcm9jZXNzb3IuCisJICovCisjaWZkZWYgQ09ORklHX1NNUAorCisjZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgltZW1iYXIgI1N0b3JlTG9hZCB8ICNMb2FkTG9hZDsKKyNkZWZpbmUgQVRPTUlDX1BPU1RfQkFSUklFUglcCisJYmEscHQgJXhjYywgODBiOwlcCisJbWVtYmFyICNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCis4MDoJcmV0bAorCSBub3AKKyNlbHNlCisjZGVmaW5lIEFUT01JQ19QUkVfQkFSUklFUgorI2RlZmluZSBBVE9NSUNfUE9TVF9CQVJSSUVSCisjZW5kaWYKKwogCS5nbG9ibAlhdG9taWNfYWRkX3JldAogCS50eXBlCWF0b21pY19hZGRfcmV0LCNmdW5jdGlvbgogYXRvbWljX2FkZF9yZXQ6IC8qICVvMCA9IGluY3JlbWVudCwgJW8xID0gYXRvbWljX3B0ciAqLwpAQCAtNjIsOSArNjgsMTAgQEAKIAljbXAJJWcxLCAlZzcKIAlibmUscG4JJWljYywgMWIKIAkgYWRkCSVnNywgJW8wLCAlZzcKKwlzcmEJJWc3LCAwLCAlbzAKIAlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBzcmEJJWc3LCAwLCAlbzAKKwkgbm9wCiAJLnNpemUJYXRvbWljX2FkZF9yZXQsIC4tYXRvbWljX2FkZF9yZXQKIAogCS5nbG9ibAlhdG9taWNfc3ViX3JldApAQCAtNzcsOSArODQsMTAgQEAKIAljbXAJJWcxLCAlZzcKIAlibmUscG4JJWljYywgMWIKIAkgc3ViCSVnNywgJW8wLCAlZzcKKwlzcmEJJWc3LCAwLCAlbzAKIAlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBzcmEJJWc3LCAwLCAlbzAKKwkgbm9wCiAJLnNpemUJYXRvbWljX3N1Yl9yZXQsIC4tYXRvbWljX3N1Yl9yZXQKIAogCS5nbG9ibAlhdG9taWM2NF9hZGQKQEAgLTExOCw5ICsxMjYsMTAgQEAKIAljbXAJJWcxLCAlZzcKIAlibmUscG4JJXhjYywgMWIKIAkgYWRkCSVnNywgJW8wLCAlZzcKKwltb3YJJWc3LCAlbzAKIAlBVE9NSUNfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBtb3YJJWc3LCAlbzAKKwkgbm9wCiAJLnNpemUJYXRvbWljNjRfYWRkX3JldCwgLi1hdG9taWM2NF9hZGRfcmV0CiAKIAkuZ2xvYmwJYXRvbWljNjRfc3ViX3JldApAQCAtMTMzLDcgKzE0Miw4IEBACiAJY21wCSVnMSwgJWc3CiAJYm5lLHBuCSV4Y2MsIDFiCiAJIHN1YgklZzcsICVvMCwgJWc3CisJbW92CSVnNywgJW8wCiAJQVRPTUlDX1BPU1RfQkFSUklFUgogCXJldGwKLQkgbW92CSVnNywgJW8wCisJIG5vcAogCS5zaXplCWF0b21pYzY0X3N1Yl9yZXQsIC4tYXRvbWljNjRfc3ViX3JldApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9iaXRvcHMuUyBiL2FyY2gvc3BhcmM2NC9saWIvYml0b3BzLlMKaW5kZXggODg2ZGNkMi4uMzFhZmJmZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9iaXRvcHMuUworKysgYi9hcmNoL3NwYXJjNjQvbGliL2JpdG9wcy5TCkBAIC03LDE5ICs3LDI1IEBACiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL2FzaS5oPgogCisJLnRleHQKKwogCS8qIE9uIFNNUCB3ZSBuZWVkIHRvIHVzZSBtZW1vcnkgYmFycmllcnMgdG8gZW5zdXJlCiAJICogY29ycmVjdCBtZW1vcnkgb3BlcmF0aW9uIG9yZGVyaW5nLCBub3AgdGhlc2Ugb3V0CiAJICogZm9yIHVuaXByb2Nlc3Nvci4KIAkgKi8KKwogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgQklUT1BfUFJFX0JBUlJJRVIJbWVtYmFyICNTdG9yZUxvYWQgfCAjTG9hZExvYWQKLSNkZWZpbmUgQklUT1BfUE9TVF9CQVJSSUVSCW1lbWJhciAjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKLSNlbHNlCi0jZGVmaW5lIEJJVE9QX1BSRV9CQVJSSUVSCW5vcAotI2RlZmluZSBCSVRPUF9QT1NUX0JBUlJJRVIJbm9wCi0jZW5kaWYKKyNkZWZpbmUgQklUT1BfUE9TVF9CQVJSSUVSCVwKKwliYSxwdAkleGNjLCA4MGI7CVwKKwltZW1iYXIgI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCiAKLQkudGV4dAorODA6CXJldGwKKwkgbm9wCisjZWxzZQorI2RlZmluZSBCSVRPUF9QUkVfQkFSUklFUgorI2RlZmluZSBCSVRPUF9QT1NUX0JBUlJJRVIKKyNlbmRpZgogCiAJLmdsb2JsCXRlc3RfYW5kX3NldF9iaXQKIAkudHlwZQl0ZXN0X2FuZF9zZXRfYml0LCNmdW5jdGlvbgpAQCAtMzcsMTAgKzQzLDExIEBACiAJY21wCSVnNywgJWcxCiAJYm5lLHBuCSV4Y2MsIDFiCiAJIGFuZAklZzcsICVvMiwgJWcyCi0JQklUT1BfUE9TVF9CQVJSSUVSCiAJY2xyCSVvMAorCW1vdnJuZQklZzIsIDEsICVvMAorCUJJVE9QX1BPU1RfQkFSUklFUgogCXJldGwKLQkgbW92cm5lCSVnMiwgMSwgJW8wCisJIG5vcAogCS5zaXplCXRlc3RfYW5kX3NldF9iaXQsIC4tdGVzdF9hbmRfc2V0X2JpdAogCiAJLmdsb2JsCXRlc3RfYW5kX2NsZWFyX2JpdApAQCAtNTksMTAgKzY2LDExIEBACiAJY21wCSVnNywgJWcxCiAJYm5lLHBuCSV4Y2MsIDFiCiAJIGFuZAklZzcsICVvMiwgJWcyCi0JQklUT1BfUE9TVF9CQVJSSUVSCiAJY2xyCSVvMAorCW1vdnJuZQklZzIsIDEsICVvMAorCUJJVE9QX1BPU1RfQkFSUklFUgogCXJldGwKLQkgbW92cm5lCSVnMiwgMSwgJW8wCisJIG5vcAogCS5zaXplCXRlc3RfYW5kX2NsZWFyX2JpdCwgLi10ZXN0X2FuZF9jbGVhcl9iaXQKIAogCS5nbG9ibAl0ZXN0X2FuZF9jaGFuZ2VfYml0CkBAIC04MSwxMCArODksMTEgQEAKIAljbXAJJWc3LCAlZzEKIAlibmUscG4JJXhjYywgMWIKIAkgYW5kCSVnNywgJW8yLCAlZzIKLQlCSVRPUF9QT1NUX0JBUlJJRVIKIAljbHIJJW8wCisJbW92cm5lCSVnMiwgMSwgJW8wCisJQklUT1BfUE9TVF9CQVJSSUVSCiAJcmV0bAotCSBtb3ZybmUJJWcyLCAxLCAlbzAKKwkgbm9wCiAJLnNpemUJdGVzdF9hbmRfY2hhbmdlX2JpdCwgLi10ZXN0X2FuZF9jaGFuZ2VfYml0CiAKIAkuZ2xvYmwJc2V0X2JpdApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2xpYi9kZWJ1Z2xvY2tzLmMgYi9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYwppbmRleCBjNDIxZTBjLi5mMDMzNDRjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYworKysgYi9hcmNoL3NwYXJjNjQvbGliL2RlYnVnbG9ja3MuYwpAQCAtMjUyLDggKzI1Miw5IEBACiAiCQlhbmRuCSUlZzEsICUlZzMsICUlZzdcbiIKICIJCWNhc3gJWyUwXSwgJSVnMSwgJSVnN1xuIgogIgkJY21wCSUlZzEsICUlZzdcbiIKKyIJCW1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKICIJCWJuZSxwbgklJXhjYywgMWJcbiIKLSIJCSBtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlIgorIgkJIG5vcCIKIAkJOiAvKiBubyBvdXRwdXRzICovCiAJCTogInIiICgmKHJ3LT5sb2NrKSkKIAkJOiAiZzMiLCAiZzEiLCAiZzciLCAiY2MiLCAibWVtb3J5Iik7CkBAIC0zNTEsOCArMzUyLDkgQEAKICIJCWFuZG4JJSVnMSwgJSVnMywgJSVnN1xuIgogIgkJY2FzeAlbJTBdLCAlJWcxLCAlJWc3XG4iCiAiCQljbXAJJSVnMSwgJSVnN1xuIgorIgkJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIgkJYm5lLHBuCSUleGNjLCAxYlxuIgotIgkJIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUiCisiCQkgbm9wIgogCQk6IC8qIG5vIG91dHB1dHMgKi8KIAkJOiAiciIgKCYocnctPmxvY2spKQogCQk6ICJnMyIsICJnMSIsICJnNyIsICJjYyIsICJtZW1vcnkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9saWIvZGVjX2FuZF9sb2NrLlMgYi9hcmNoL3NwYXJjNjQvbGliL2RlY19hbmRfbG9jay5TCmluZGV4IDdlNmZkYWUuLjhlZTI4OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9saWIvZGVjX2FuZF9sb2NrLlMKKysrIGIvYXJjaC9zcGFyYzY0L2xpYi9kZWNfYW5kX2xvY2suUwpAQCAtNDgsOCArNDgsOSBAQAogI2VuZGlmCiB0b196ZXJvOgogCWxkc3R1YglbJW8xXSwgJWczCisJbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJybnoscG4JJWczLCBzcGluX29uX2xvY2sKLQkgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCSBub3AKIGxvb3AyOgljYXMJWyVvMF0sICVnMiwgJWc3CQkvKiBBU1NFUlQoZzcgPT0gMCkgKi8KIAljbXAJJWcyLCAlZzcKIApAQCAtNzEsOCArNzIsOSBAQAogCSBub3AKIHNwaW5fb25fbG9jazoKIAlsZHViCVslbzFdLCAlZzMKKwltZW1iYXIJI0xvYWRMb2FkCiAJYnJueixwdAklZzMsIHNwaW5fb25fbG9jawotCSBtZW1iYXIJI0xvYWRMb2FkCisJIG5vcAogCWJhLHB0CSV4Y2MsIHRvX3plcm8KIAkgbm9wCiAJbm9wCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbGliL3J3c2VtLlMgYi9hcmNoL3NwYXJjNjQvbGliL3J3c2VtLlMKaW5kZXggMTc0ZmY3Yi4uNzVmMGU2YiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2xpYi9yd3NlbS5TCisrKyBiL2FyY2gvc3BhcmM2NC9saWIvcndzZW0uUwpAQCAtMTcsOCArMTcsOSBAQAogCWJuZSxwbgkJJWljYywgMWIKIAkgYWRkCQklZzcsIDEsICVnNwogCWNtcAkJJWc3LCAwCisJbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKIAlibCxwbgkJJWljYywgM2YKLQkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKKwkgbm9wCiAyOgogCXJldGwKIAkgbm9wCkBAIC01Nyw4ICs1OCw5IEBACiAJY21wCQklZzMsICVnNwogCWJuZSxwbgkJJWljYywgMWIKIAkgY21wCQklZzcsIDAKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJuZSxwbgkJJWljYywgM2YKLQkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmUKKwkgbm9wCiAyOglyZXRsCiAJIG5vcAogMzoKQEAgLTk3LDggKzk5LDkgQEAKIAljbXAJCSVnMSwgJWc3CiAJYm5lLHBuCQklaWNjLCAxYgogCSBjbXAJCSVnNywgMAorCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCiAJYmwscG4JCSVpY2MsIDNmCi0JIG1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlCisJIG5vcAogMjoJcmV0bAogCSBub3AKIDM6CXNldGhpCQklaGkoUldTRU1fQUNUSVZFX01BU0spLCAlZzEKQEAgLTEyNiw4ICsxMjksOSBAQAogCWJuZSxwbgkJJWljYywgMWIKIAkgc3ViCQklZzcsICVnMSwgJWc3CiAJY21wCQklZzcsIDAKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJsLHBuCQklaWNjLCAzZgotCSBtZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCSBub3AKIDI6CiAJcmV0bAogCSBub3AKQEAgLTE1MSw4ICsxNTUsOSBAQAogCWJuZSxwbgkJJWljYywgMWIKIAkgc3ViCQklZzcsICVnMSwgJWc3CiAJY21wCQklZzcsIDAKKwltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQogCWJsLHBuCQklaWNjLCAzZgotCSBtZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZQorCSBub3AKIDI6CiAJcmV0bAogCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9mYXVsdC5jIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKaW5kZXggM2ZmZWU3Yi4uNTJlOTM3NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2ZhdWx0LmMKQEAgLTM0LDIyICszNCw2IEBACiBleHRlcm4gc3RydWN0IHNwYXJjX3BoeXNfYmFua3Mgc3BfYmFua3NbU1BBUkNfUEhZU19CQU5LU107CiAKIC8qCi0gKiBUbyBkZWJ1ZyBrZXJuZWwgZHVyaW5nIHN5c2NhbGwgZW50cnkuCi0gKi8KLXZvaWQgc3lzY2FsbF90cmFjZV9lbnRyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoInNjYWxsIGVudHJ5OiAlc1slZF0vY3B1JWQ6ICVkXG4iLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNtcF9wcm9jZXNzb3JfaWQoKSwgKGludCkgcmVncy0+dV9yZWdzW1VSRUdfRzFdKTsKLX0KLQotLyoKLSAqIFRvIGRlYnVnIGtlcm5lbCBkdXJpbmcgc3lzY2FsbCBleGl0LgotICovCi12b2lkIHN5c2NhbGxfdHJhY2VfZXhpdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwcmludGsoInNjYWxsIGV4aXQ6ICVzWyVkXS9jcHUlZDogJWRcbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc21wX3Byb2Nlc3Nvcl9pZCgpLCAoaW50KSByZWdzLT51X3JlZ3NbVVJFR19HMV0pOwotfQotCi0vKgogICogVG8gZGVidWcga2VybmVsIHRvIGNhdGNoIGFjY2Vzc2VzIHRvIGNlcnRhaW4gdmlydHVhbC9waHlzaWNhbCBhZGRyZXNzZXMuCiAgKiBNb2RlID0gMCBzZWxlY3RzIHBoeXNpY2FsIHdhdGNocG9pbnRzLCBtb2RlID0gMSBzZWxlY3RzIHZpcnR1YWwgd2F0Y2hwb2ludHMuCiAgKiBmbGFncyA9IFZNX1JFQUQgd2F0Y2hlcyBtZW1yZWFkIGFjY2Vzc2VzLCBmbGFncyA9IFZNX1dSSVRFIHdhdGNoZXMgbWVtd3JpdGUgYWNjZXNzZXMuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwppbmRleCA5YzUyMjIwLi44ZmM0MTNjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKQEAgLTEzNiw4ICsxMzYsOSBAQAogCQkJICAgICAib3IJJSVnMSwgJTAsICUlZzFcblx0IgogCQkJICAgICAiY2FzeAlbJTJdLCAlJWc3LCAlJWcxXG5cdCIKIAkJCSAgICAgImNtcAklJWc3LCAlJWcxXG5cdCIKKwkJCSAgICAgIm1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcblx0IgogCQkJICAgICAiYm5lLHBuCSUleGNjLCAxYlxuXHQiCi0JCQkgICAgICIgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZSIKKwkJCSAgICAgIiBub3AiCiAJCQkgICAgIDogLyogbm8gb3V0cHV0cyAqLwogCQkJICAgICA6ICJyIiAobWFzayksICJyIiAobm9uX2NwdV9iaXRzKSwgInIiICgmcGFnZS0+ZmxhZ3MpCiAJCQkgICAgIDogImcxIiwgImc3Iik7CkBAIC0xNTcsOCArMTU4LDkgQEAKIAkJCSAgICAgIiBhbmRuCSUlZzcsICUxLCAlJWcxXG5cdCIKIAkJCSAgICAgImNhc3gJWyUyXSwgJSVnNywgJSVnMVxuXHQiCiAJCQkgICAgICJjbXAJJSVnNywgJSVnMVxuXHQiCisJCQkgICAgICJtZW1iYXIJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG5cdCIKIAkJCSAgICAgImJuZSxwbgklJXhjYywgMWJcblx0IgotCQkJICAgICAiIG1lbWJhcgkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKwkJCSAgICAgIiBub3BcbiIKIAkJCSAgICAgIjI6IgogCQkJICAgICA6IC8qIG5vIG91dHB1dHMgKi8KIAkJCSAgICAgOiAiciIgKGNwdSksICJyIiAobWFzayksICJyIiAoJnBhZ2UtPmZsYWdzKSwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS91bHRyYS5TIGIvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKaW5kZXggN2EwOTM0My4uMzYzNzcwOCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKKysrIGIvYXJjaC9zcGFyYzY0L21tL3VsdHJhLlMKQEAgLTcyLDYgKzcyLDcgQEAKIAlmbHVzaAkJJWc2CiAJcmV0bAogCSB3cnByCQklZzcsIDB4MCwgJXBzdGF0ZQorCW5vcAogCiAJLmFsaWduCQkzMgogCS5nbG9ibAkJX19mbHVzaF90bGJfa2VybmVsX3JhbmdlCkBAIC0yNDksNyArMjUwLDcgQEAKIAlyZXRsCiAJIHdycHIJCSVnNywgMHgwLCAlcHN0YXRlCiAKLV9fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZzoJLyogMjIgaW5zbnMgKi8KK19fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZzoJLyogMjMgaW5zbnMgKi8KIAkvKiAlbzAgPSBjb250ZXh0LCAlbzEgPSBuciwgJW8yID0gdmFkZHJzW10gKi8KIAlyZHByCQklcHN0YXRlLCAlZzcKIAlzbGx4CQklbzEsIDMsICVvMQpAQCAtMjY2LDggKzI2Nyw5IEBACiAJIGFuZG4JCSVvMywgMSwgJW8zCiAJc3R4YQkJJWcwLCBbJW8zXSBBU0lfSU1NVV9ERU1BUAogMjoJc3R4YQkJJWcwLCBbJW8zXSBBU0lfRE1NVV9ERU1BUAkKKwltZW1iYXIJCSNTeW5jCiAJYnJueixwdAkJJW8xLCAxYgotCSBtZW1iYXIJCSNTeW5jCisJIG5vcAogCXN0eGEJCSVnMiwgWyVvNF0gQVNJX0RNTVUKIAlmbHVzaAkJJWc2CiAJd3JwcgkJJWcwLCAwLCAldGwKQEAgLTMxNiw3ICszMTgsNyBAQAogCXNldGhpCQklaGkoX19jaGVldGFoX2ZsdXNoX3RsYl9wZW5kaW5nKSwgJW8xCiAJb3IJCSVvMSwgJWxvKF9fY2hlZXRhaF9mbHVzaF90bGJfcGVuZGluZyksICVvMQogCWNhbGwJCWNoZWV0YWhfcGF0Y2hfb25lCi0JIG1vdgkJMjIsICVvMgorCSBtb3YJCTIzLCAlbzIKIAogI2lmZGVmIERDQUNIRV9BTElBU0lOR19QT1NTSUJMRQogCXNldGhpCQklaGkoX19mbHVzaF9kY2FjaGVfcGFnZSksICVvMApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZW50cnk2NC5TCmluZGV4IDBjYzlkYWQuLjRiNmFlNTggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2VudHJ5NjQuUworKysgYi9hcmNoL3NwYXJjNjQvc29sYXJpcy9lbnRyeTY0LlMKQEAgLTI0LDggKzI0LDkgQEAKIAogCS50ZXh0CiBzb2xhcmlzX3N5c2NhbGxfdHJhY2U6CisJYWRkCQklc3AsIFBUUkVHU19PRkYsICVvMAogCWNhbGwJCXN5c2NhbGxfdHJhY2UKLQkgbm9wCisJIG1vdgkJMCwgJW8xCiAJc3JsCQklaTAsIDAsICVvMAogCW1vdgkJJWk0LCAlbzQKIAlzcmwJCSVpMSwgMCwgJW8xCkBAIC0xNTksOCArMTYwLDEwIEBACiAJIHN0eAkJJWwyLCBbJXNwICsgUFRSRUdTX09GRiArIFBUX1Y5X1ROUENdICFucGMgPSBucGMrNCAKIAogc29sYXJpc19zeXNjYWxsX3RyYWNlMjoKKwlhZGQJCSVzcCwgUFRSRUdTX09GRiwgJW8wCiAJY2FsbAkJc3lzY2FsbF90cmFjZQotCSBhZGQJCSVsMSwgMHg0LCAlbDIJCQkvKiBucGMgPSBucGMrNCAqLworCSBtb3YJCTEsICVvMQorCWFkZAkJJWwxLCAweDQsICVsMgkJCS8qIG5wYyA9IG5wYys0ICovCiAJYW5kY2MJCSVsMSwgMSwgJWcwCiAJYm5lLHBuCQklaWNjLCAyYgogCSBub3AKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZyBiL2FyY2gvdW0vS2NvbmZpZwppbmRleCA5NDY5ZTc3Li5mOTQ1NDQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL0tjb25maWcKKysrIGIvYXJjaC91bS9LY29uZmlnCkBAIC0xMjgsNyArMTI4LDYgQEAKIAogY29uZmlnIEhQUEZTCiAJdHJpc3RhdGUgIkhvbmV5UG90IFByb2NGUyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEJST0tFTgogCWhlbHAKIAlocHBmcyAoSG9uZXlQb3QgUHJvY0ZTKSBpcyBhIGZpbGVzeXN0ZW0gd2hpY2ggYWxsb3dzIFVNTCAvcHJvYwogCWVudHJpZXMgdG8gYmUgb3ZlcnJpZGRlbiwgcmVtb3ZlZCwgb3IgZmFicmljYXRlZCBmcm9tIHRoZSBob3N0LgpAQCAtMTQxLDggKzE0MCw5IEBACiAJWW91IG9ubHkgbmVlZCB0aGlzIGlmIHlvdSBhcmUgc2V0dGluZyB1cCBhIFVNTCBob25leXBvdC4gIE90aGVyd2lzZSwKIAlpdCBpcyBzYWZlIHRvIHNheSAnTicgaGVyZS4KIAotCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSBhc2sgZm9yIGl0IHRvIGJlIGZpeGVkLiBJbiB0aGlzCi0JbW9tZW50LCBpdCBkb2VzIG5vdCB3b3JrIG9uIDIuNiAoaXQgd29ya3Mgc29tZWhvdyBvbiAyLjQpLgorCUlmIHlvdSBhcmUgYWN0aXZlbHkgdXNpbmcgaXQsIHBsZWFzZSByZXBvcnQgYW55IHByb2JsZW1zLCBzaW5jZSBpdCdzCisJZ2V0dGluZyBmaXhlZC4gSW4gdGhpcyBtb21lbnQsIGl0IGlzIGV4cGVyaW1lbnRhbCBvbiAyLjYgKGl0IHdvcmtzIG9uCisJMi40KS4KIAogY29uZmlnIE1DT05TT0xFCiAJYm9vbCAiTWFuYWdlbWVudCBjb25zb2xlIgpAQCAtMjc1LDYgKzI3NSw4IEBACiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCitzb3VyY2UgIm5ldC9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvYmFzZS9LY29uZmlnIgogCiBzb3VyY2UgImFyY2gvdW0vS2NvbmZpZ19jaGFyIgpAQCAtMjg3LDcgKzI4OSw3IEBACiAKIHNvdXJjZSAiYXJjaC91bS9LY29uZmlnX25ldCIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJmcy9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWdfaTM4NiBiL2FyY2gvdW0vS2NvbmZpZ19pMzg2CmluZGV4IGU0MWYzNzQuLjI3YzE4YTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ19pMzg2CisrKyBiL2FyY2gvdW0vS2NvbmZpZ19pMzg2CkBAIC0xOSw2ICsxOSwxOCBAQAogCW1lbW9yeS4gIEFsbCB0aGUgbWVtb3J5IHRoYXQgY2FuJ3QgYmUgbWFwcGVkIGRpcmVjdGx5IHdpbGwgYmUgdHJlYXRlZAogCWFzIGhpZ2ggbWVtb3J5LgogCitjb25maWcgU1RVQl9DT0RFCisJaGV4CisJZGVmYXVsdCAweGJmZmZlMDAwCisKK2NvbmZpZyBTVFVCX0RBVEEKKwloZXgKKwlkZWZhdWx0IDB4YmZmZmYwMDAKKworY29uZmlnIFNUVUJfU1RBUlQKKwloZXgKKwlkZWZhdWx0IFNUVUJfQ09ERQorCiBjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUwogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQgYi9hcmNoL3VtL0tjb25maWdfeDg2XzY0CmluZGV4IGYxNjJmNTAuLjczNWEwNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZ194ODZfNjQKKysrIGIvYXJjaC91bS9LY29uZmlnX3g4Nl82NApAQCAtMTQsNiArMTQsMTggQEAKICAgICAgICBib29sCiAgICAgICAgZGVmYXVsdCB5CiAKK2NvbmZpZyBTVFVCX0NPREUKKwloZXgKKwlkZWZhdWx0IDB4N2ZiZmZmZTAwMAorCitjb25maWcgU1RVQl9EQVRBCisJaGV4CisJZGVmYXVsdCAweDdmYmZmZmYwMDAKKworY29uZmlnIFNUVUJfU1RBUlQKKwloZXgKKwlkZWZhdWx0IFNUVUJfQ09ERQorCiBjb25maWcgQVJDSF9IQVNfU0NfU0lHTkFMUwogCWJvb2wKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUgYi9hcmNoL3VtL01ha2VmaWxlCmluZGV4IDNmMDczOTAuLjRhMzc1YmJhYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC0xNDAsNyArMTQwLDggQEAKICNXaGVuIGNsZWFuaW5nIHdlIGRvbid0IGluY2x1ZGUgLmNvbmZpZywgc28gd2UgZG9uJ3QgaW5jbHVkZQogI1RUIG9yIHNrYXMgbWFrZWZpbGVzIGFuZCBkb24ndCBjbGVhbiBza2FzX3B0cmVncy5oLgogQ0xFQU5fRklMRVMgKz0gbGludXggeC5pIGdtb24ub3V0ICQoQVJDSF9ESVIpL2luY2x1ZGUvdW1sLWNvbmZpZy5oIFwKLQkkKEdFTl9IRUFERVJTKSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NrYXNfcHRyZWdzLmgKKwkkKEdFTl9IRUFERVJTKSAkKEFSQ0hfRElSKS9pbmNsdWRlL3NrYXNfcHRyZWdzLmggXAorCSQoQVJDSF9ESVIpL2luY2x1ZGUvdXNlcl9jb25zdGFudHMuaAogCiBNUlBST1BFUl9GSUxFUyArPSAkKFNZTUxJTktfSEVBREVSUykgJChBUkNIX1NZTUxJTktTKSBcCiAJJChhZGRwcmVmaXggJChBUkNIX0RJUikva2VybmVsLywkKEtFUk5fU1lNTElOS1MpKSAkKEFSQ0hfRElSKS9vcyBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLWkzODYgYi9hcmNoL3VtL01ha2VmaWxlLWkzODYKaW5kZXggMjllMTgyZC4uMzAxMDU5MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS1pMzg2CisrKyBiL2FyY2gvdW0vTWFrZWZpbGUtaTM4NgpAQCAtOCw3ICs4LDcgQEAKICAgZW5kaWYKIGVuZGlmCiAKLUNGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1VJChTVUJBUkNIKQorQ0ZMQUdTICs9IC1VX18kKFNVQkFSQ0gpX18gLVUkKFNVQkFSQ0gpICQoU1RVQl9DRkxBR1MpCiBBUkNIX1VTRVJfQ0ZMQUdTIDo9CiAKIGlmbmVxICgkKENPTkZJR19HUFJPRikseSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vTWFrZWZpbGUteDg2XzY0IGIvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKaW5kZXggMzIxNDQ1Ni4uZDgwYmQwMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKKysrIGIvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQKQEAgLTQsNyArNCw3IEBACiBTVUJBUkNIX0xJQlMgOj0gYXJjaC91bS9zeXMteDg2XzY0LwogU1RBUlQgOj0gMHg2MDAwMDAwMAogCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAtZm5vLWJ1aWx0aW4KK0NGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fIC1mbm8tYnVpbHRpbiAkKFNUVUJfQ0ZMQUdTKQogQVJDSF9VU0VSX0NGTEFHUyA6PSAtRF9feDg2XzY0X18KIAogRUxGX0FSQ0ggOj0gaTM4Njp4ODYtNjQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZGVmY29uZmlnIGIvYXJjaC91bS9kZWZjb25maWcKaW5kZXggNDA2N2MzYS4uODBkMzBkMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kZWZjb25maWcKKysrIGIvYXJjaC91bS9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmMzLXNrYXMzLXY5LXByZTIKLSMgU3VuIEFwciAyNCAxOTo0NjoxMCAyMDA1CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTItcmM2LW1tMQorIyBUdWUgSnVuIDE0IDE4OjIyOjIxIDIwMDUKICMKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19VTUw9eQpAQCAtMTMsMjMgKzEzLDMyIEBACiAjCiAjIFVNTC1zcGVjaWZpYyBvcHRpb25zCiAjCi1DT05GSUdfTU9ERV9UVD15CisjIENPTkZJR19NT0RFX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQVRJQ19MSU5LIGlzIG5vdCBzZXQKIENPTkZJR19NT0RFX1NLQVM9eQogQ09ORklHX1VNTF9YODY9eQogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1RPUF9BRERSPTB4YzAwMDAwMDAKICMgQ09ORklHXzNfTEVWRUxfUEdUQUJMRVMgaXMgbm90IHNldAorQ09ORklHX1NUVUJfQ09ERT0weGJmZmZlMDAwCitDT05GSUdfU1RVQl9EQVRBPTB4YmZmZmYwMDAKK0NPTkZJR19TVFVCX1NUQVJUPTB4YmZmZmUwMDAKIENPTkZJR19BUkNIX0hBU19TQ19TSUdOQUxTPXkKIENPTkZJR19BUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQT15Ci1DT05GSUdfTERfU0NSSVBUX1NUQVRJQz15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfTERfU0NSSVBUX0RZTj15CiBDT05GSUdfTkVUPXkKIENPTkZJR19CSU5GTVRfRUxGPXkKIENPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfSE9TVEZTPXkKKyMgQ09ORklHX0hPU1RGUyBpcyBub3Qgc2V0CiBDT05GSUdfTUNPTlNPTEU9eQogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfSE9TVF8yR18yRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTVAgaXMgbm90IHNldAogQ09ORklHX05FU1RfTEVWRUw9MAogQ09ORklHX0tFUk5FTF9IQUxGX0dJR1M9MQogIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CkBAIC02Myw2ICs3Miw4IEBACiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQpAQCAtODEsNiArOTIsNyBAQAogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CiBDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0tNT0Q9eQogCkBAIC0xMTUsNiArMTI3LDcgQEAKIENPTkZJR19TT1VORD1tCiBDT05GSUdfSE9TVEFVRElPPW0KIENPTkZJR19VTUxfUkFORE9NPXkKKyMgQ09ORklHX01NQVBQRVIgaXMgbm90IHNldAogCiAjCiAjIEJsb2NrIGRldmljZXMKQEAgLTE3Niw2ICsxODksMTcgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JUF9UQ1BESUFHPXkKICMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisKKyMKKyMgVENQIGNvbmdlc3Rpb24gY29udHJvbAorIworQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfV0VTVFdPT0Q9eQorQ09ORklHX1RDUF9DT05HX0hUQ1A9eQorIyBDT05GSUdfVENQX0NPTkdfSFNUQ1AgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfSFlCTEEgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfVkVHQVMgaXMgbm90IHNldAorIyBDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCkBAIC0yMDYsMTEgKzIzMCwxNSBAQAogIyBOZXR3b3JrIHRlc3RpbmcKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfS0dEQk9FIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTF9SWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1RSQVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVk9bQogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldApAQCAtMjI3LDYgKzI1NSw3IEBACiAjIENPTkZJR19QUFBfU1lOQ19UVFkgaXMgbm90IHNldAogIyBDT05GSUdfUFBQX0RFRkxBVEUgaXMgbm90IHNldAogIyBDT05GSUdfUFBQX0JTRENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfUFBQX01QUEUgaXMgbm90IHNldAogIyBDT05GSUdfUFBQT0UgaXMgbm90IHNldAogQ09ORklHX1NMSVA9bQogIyBDT05GSUdfU0xJUF9DT01QUkVTU0VEIGlzIG5vdCBzZXQKQEAgLTI0MCwxMCArMjY5LDEyIEBACiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKICMgQ09ORklHX0VYVDNfRlNfWEFUVFIgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSNF9GUyBpcyBub3Qgc2V0CiBDT05GSUdfUkVJU0VSRlNfRlM9eQogIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKQEAgLTI1Niw2ICsyODcsNyBAQAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKIENPTkZJR19RVU9UQT15CiAjIENPTkZJR19RRk1UX1YxIGlzIG5vdCBzZXQKICMgQ09ORklHX1FGTVRfVjIgaXMgbm90IHNldApAQCAtMjY1LDYgKzI5NywxMiBAQAogQ09ORklHX0FVVE9GUzRfRlM9bQogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfSVNPOTY2MF9GUz1tCkBAIC0yOTEsNiArMzI5LDggQEAKICMgQ09ORklHX1RNUEZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CiAKICMKICMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcwpAQCAtMzE5LDYgKzM1OSw3IEBACiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtNDA0LDE0ICs0NDUsMTUgQEAKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1NMQUI9eQogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfSU5GTz15CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfUFRfUFJPWFk9eQorIyBDT05GSUdfR1BST0YgaXMgbm90IHNldAogIyBDT05GSUdfR0NPViBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDQUxMX0RFQlVHIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggY2YxNWI0YS4uYzFiMDNmNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKQEAgLTE1Nyw5ICsxNTcsOSBAQAogCiAJb3NfY2xvc2VfZmlsZShwcmktPmZkKTsKIAlvc19jbG9zZV9maWxlKHByaS0+Y29udHJvbCk7Ci0JaWYocHJpLT5kYXRhX2FkZHIgIT0gTlVMTCkga2ZyZWUocHJpLT5kYXRhX2FkZHIpOwotCWlmKHByaS0+Y3RsX2FkZHIgIT0gTlVMTCkga2ZyZWUocHJpLT5jdGxfYWRkcik7Ci0JaWYocHJpLT5sb2NhbF9hZGRyICE9IE5VTEwpIGtmcmVlKHByaS0+bG9jYWxfYWRkcik7CisJa2ZyZWUocHJpLT5kYXRhX2FkZHIpOworCWtmcmVlKHByaS0+Y3RsX2FkZHIpOworCWtmcmVlKHByaS0+bG9jYWxfYWRkcik7CiB9CiAKIGludCBkYWVtb25fdXNlcl93cml0ZShpbnQgZmQsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGRhZW1vbl9kYXRhICpwcmkpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jIGIvYXJjaC91bS9kcml2ZXJzL2xpbmUuYwppbmRleCAwZjU5NzM2Li5lMGZkZmZhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKQEAgLTYwMiwxMSArNjAyLDI2IEBACiAJcmV0dXJuIG47CiB9CiAKLWludCBsaW5lX3JlbW92ZShzdHJ1Y3QgbGluZSAqbGluZXMsIHVuc2lnbmVkIGludCBudW0sIGNoYXIgKnN0cikKK2ludCBsaW5lX2lkKGNoYXIgKipzdHIsIGludCAqc3RhcnRfb3V0LCBpbnQgKmVuZF9vdXQpCit7CisJY2hhciAqZW5kOworICAgICAgICBpbnQgbjsKKworCW4gPSBzaW1wbGVfc3RydG91bCgqc3RyLCAmZW5kLCAwKTsKKwlpZigoKmVuZCAhPSAnXDAnKSB8fCAoZW5kID09ICpzdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAqc3RyID0gZW5kOworICAgICAgICAqc3RhcnRfb3V0ID0gbjsKKyAgICAgICAgKmVuZF9vdXQgPSBuOworICAgICAgICByZXR1cm4gbjsKK30KKworaW50IGxpbmVfcmVtb3ZlKHN0cnVjdCBsaW5lICpsaW5lcywgdW5zaWduZWQgaW50IG51bSwgaW50IG4pCiB7CiAJY2hhciBjb25maWdbc2l6ZW9mKCJjb254eHh4PW5vbmVcMCIpXTsKIAotCXNwcmludGYoY29uZmlnLCAiJXM9bm9uZSIsIHN0cik7CisJc3ByaW50Zihjb25maWcsICIlZD1ub25lIiwgbik7CiAJcmV0dXJuICFsaW5lX3NldHVwKGxpbmVzLCBudW0sIGNvbmZpZywgMCk7CiB9CiAKQEAgLTY0OCwxMSArNjYzLDE1IEBACiAJcmV0dXJuIGRyaXZlcjsKIH0KIAorc3RhdGljIHNwaW5sb2NrX3Qgd2luY2hfaGFuZGxlcl9sb2NrOworTElTVF9IRUFEKHdpbmNoX2hhbmRsZXJzKTsKKwogdm9pZCBsaW5lc19pbml0KHN0cnVjdCBsaW5lICpsaW5lcywgaW50IG5saW5lcykKIHsKIAlzdHJ1Y3QgbGluZSAqbGluZTsKIAlpbnQgaTsKIAorCXNwaW5fbG9ja19pbml0KCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCWZvcihpID0gMDsgaSA8IG5saW5lczsgaSsrKXsKIAkJbGluZSA9ICZsaW5lc1tpXTsKIAkJSU5JVF9MSVNUX0hFQUQoJmxpbmUtPmNoYW5fbGlzdCk7CkBAIC03MDksMzEgKzcyOCwzMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotREVDTEFSRV9NVVRFWCh3aW5jaF9oYW5kbGVyX3NlbSk7Ci1MSVNUX0hFQUQod2luY2hfaGFuZGxlcnMpOwotCiB2b2lkIHJlZ2lzdGVyX3dpbmNoX2lycShpbnQgZmQsIGludCB0dHlfZmQsIGludCBwaWQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CiAJc3RydWN0IHdpbmNoICp3aW5jaDsKIAotCWRvd24oJndpbmNoX2hhbmRsZXJfc2VtKTsKIAl3aW5jaCA9IGttYWxsb2Moc2l6ZW9mKCp3aW5jaCksIEdGUF9LRVJORUwpOwogCWlmICh3aW5jaCA9PSBOVUxMKSB7CiAJCXByaW50aygicmVnaXN0ZXJfd2luY2hfaXJxIC0ga21hbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCX0KKwogCSp3aW5jaCA9ICgoc3RydWN0IHdpbmNoKSB7IC5saXN0ICAJPSBMSVNUX0hFQURfSU5JVCh3aW5jaC0+bGlzdCksCiAJCQkJICAgLmZkICAJPSBmZCwKIAkJCQkgICAudHR5X2ZkIAk9IHR0eV9mZCwKIAkJCQkgICAucGlkICAJPSBwaWQsCiAJCQkJICAgLnR0eSAJPSB0dHkgfSk7CisKKwlzcGluX2xvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAJbGlzdF9hZGQoJndpbmNoLT5saXN0LCAmd2luY2hfaGFuZGxlcnMpOworCXNwaW5fdW5sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOworCiAJaWYodW1fcmVxdWVzdF9pcnEoV0lOQ0hfSVJRLCBmZCwgSVJRX1JFQUQsIHdpbmNoX2ludGVycnVwdCwKIAkJCSAgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEgfCBTQV9TQU1QTEVfUkFORE9NLCAKIAkJCSAgIndpbmNoIiwgd2luY2gpIDwgMCkKIAkJcHJpbnRrKCJyZWdpc3Rlcl93aW5jaF9pcnEgLSBmYWlsZWQgdG8gcmVnaXN0ZXIgSVJRXG4iKTsKLSBvdXQ6Ci0JdXAoJndpbmNoX2hhbmRsZXJfc2VtKTsKIH0KIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl93aW5jaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtNzQxLDcgKzc1OSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlOwogCXN0cnVjdCB3aW5jaCAqd2luY2gsICpmb3VuZCA9IE5VTEw7CiAKLQlkb3duKCZ3aW5jaF9oYW5kbGVyX3NlbSk7CisJc3Bpbl9sb2NrKCZ3aW5jaF9oYW5kbGVyX2xvY2spOwogCWxpc3RfZm9yX2VhY2goZWxlLCAmd2luY2hfaGFuZGxlcnMpewogCQl3aW5jaCA9IGxpc3RfZW50cnkoZWxlLCBzdHJ1Y3Qgd2luY2gsIGxpc3QpOwogICAgICAgICAgICAgICAgIGlmKHdpbmNoLT50dHkgPT0gdHR5KXsKQEAgLTc0OSwyMCArNzY3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBpZihmb3VuZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCQlnb3RvIGVycjsKKworCWxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJndpbmNoX2hhbmRsZXJfbG9jayk7CiAKICAgICAgICAgaWYod2luY2gtPnBpZCAhPSAtMSkKICAgICAgICAgICAgICAgICBvc19raWxsX3Byb2Nlc3Mod2luY2gtPnBpZCwgMSk7CiAKICAgICAgICAgZnJlZV9pcnEoV0lOQ0hfSVJRLCB3aW5jaCk7Ci0gICAgICAgIGxpc3RfZGVsKCZ3aW5jaC0+bGlzdCk7CiAgICAgICAgIGtmcmVlKHdpbmNoKTsKLSBvdXQ6Ci0JdXAoJndpbmNoX2hhbmRsZXJfc2VtKTsKKworCXJldHVybjsKK2VycjoKKwlzcGluX3VubG9jaygmd2luY2hfaGFuZGxlcl9sb2NrKTsKIH0KIAorLyogWFhYOiBObyBsb2NrIGFzIGl0J3MgYW4gZXhpdGNhbGwuLi4gaXMgdGhpcyB2YWxpZD8gRGVwZW5kaW5nIG9uIGNsZWFudXAKKyAqIG9yZGVyLi4uIGFyZSB3ZSBzdXJlIHRoYXQgbm90aGluZyBlbHNlIGlzIGRvbmUgb24gdGhlIGxpc3Q/ICovCiBzdGF0aWMgdm9pZCB3aW5jaF9jbGVhbnVwKHZvaWQpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqZWxlOwpAQCAtNzcxLDYgKzc5NCw5IEBACiAJbGlzdF9mb3JfZWFjaChlbGUsICZ3aW5jaF9oYW5kbGVycyl7CiAJCXdpbmNoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCB3aW5jaCwgbGlzdCk7CiAJCWlmKHdpbmNoLT5mZCAhPSAtMSl7CisJCQkvKiBXaHkgaXMgdGhpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgZnJlZV9pcnEoKSwKKwkJCSAqIHdoaWNoIGRlYWN0aXZhdGVzIFNJR0lPPyBUaGlzIHNlYXJjaGVzIHRoZSBGRAorCQkJICogc29tZXdoZXJlIGVsc2UgYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgbGlzdC4uLiAqLwogCQkJZGVhY3RpdmF0ZV9mZCh3aW5jaC0+ZmQsIFdJTkNIX0lSUSk7CiAJCQlvc19jbG9zZV9maWxlKHdpbmNoLT5mZCk7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCmluZGV4IGQ3YzdhZGMuLjQwNGRlNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYwpAQCAtNDE5LDggKzQxOSw5IEBACiB2b2lkIG1jb25zb2xlX3JlbW92ZShzdHJ1Y3QgbWNfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBtY19kZXZpY2UgKmRldjsJCi0JY2hhciAqcHRyID0gcmVxLT5yZXF1ZXN0LmRhdGE7Ci0JaW50IGVycjsKKwljaGFyICpwdHIgPSByZXEtPnJlcXVlc3QuZGF0YSwgKmVycl9tc2cgPSAiIjsKKyAgICAgICAgY2hhciBlcnJvclsyNTZdOworCWludCBlcnIsIHN0YXJ0LCBlbmQsIG47CiAKIAlwdHIgKz0gc3RybGVuKCJyZW1vdmUiKTsKIAl3aGlsZShpc3NwYWNlKCpwdHIpKSBwdHIrKzsKQEAgLTQyOSw4ICs0MzAsMzUgQEAKIAkJbWNvbnNvbGVfcmVwbHkocmVxLCAiQmFkIHJlbW92ZSBvcHRpb24iLCAxLCAwKTsKIAkJcmV0dXJuOwogCX0KLQllcnIgPSAoKmRldi0+cmVtb3ZlKSgmcHRyW3N0cmxlbihkZXYtPm5hbWUpXSk7Ci0JbWNvbnNvbGVfcmVwbHkocmVxLCAiIiwgZXJyLCAwKTsKKworICAgICAgICBwdHIgPSAmcHRyW3N0cmxlbihkZXYtPm5hbWUpXTsKKworICAgICAgICBlcnIgPSAxOworICAgICAgICBuID0gKCpkZXYtPmlkKSgmcHRyLCAmc3RhcnQsICZlbmQpOworICAgICAgICBpZihuIDwgMCl7CisgICAgICAgICAgICAgICAgZXJyX21zZyA9ICJDb3VsZG4ndCBwYXJzZSBkZXZpY2UgbnVtYmVyIjsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChuIDwgc3RhcnQpIHx8IChuID4gZW5kKSl7CisgICAgICAgICAgICAgICAgc3ByaW50ZihlcnJvciwgIkludmFsaWQgZGV2aWNlIG51bWJlciAtIG11c3QgYmUgYmV0d2VlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJWQgYW5kICVkIiwgc3RhcnQsIGVuZCk7CisgICAgICAgICAgICAgICAgZXJyX21zZyA9IGVycm9yOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKwllcnIgPSAoKmRldi0+cmVtb3ZlKShuKTsKKyAgICAgICAgc3dpdGNoKGVycil7CisgICAgICAgIGNhc2UgLUVOT0RFVjoKKyAgICAgICAgICAgICAgICBlcnJfbXNnID0gIkRldmljZSBkb2Vzbid0IGV4aXN0IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgICAgICAgICAgZXJyX21zZyA9ICJEZXZpY2UgaXMgY3VycmVudGx5IG9wZW4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisgb3V0OgorCW1jb25zb2xlX3JlcGx5KHJlcSwgZXJyX21zZywgZXJyLCAwKTsKIH0KIAogI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL25ldF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYwppbmRleCA1Mzg4YTc0Li4xNDk1MDA3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYwpAQCAtNjEyLDI1ICs2MTIsMzUgQEAKIAlyZXR1cm4oZXJyKTsKIH0KIAotc3RhdGljIGludCBuZXRfcmVtb3ZlKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgbmV0X2lkKGNoYXIgKipzdHIsIGludCAqc3RhcnRfb3V0LCBpbnQgKmVuZF9vdXQpCit7CisgICAgICAgIGNoYXIgKmVuZDsKKyAgICAgICAgaW50IG47CisKKwluID0gc2ltcGxlX3N0cnRvdWwoKnN0ciwgJmVuZCwgMCk7CisJaWYoKCplbmQgIT0gJ1wwJykgfHwgKGVuZCA9PSAqc3RyKSkKKwkJcmV0dXJuIC0xOworCisgICAgICAgICpzdGFydF9vdXQgPSBuOworICAgICAgICAqZW5kX291dCA9IG47CisgICAgICAgICpzdHIgPSBlbmQ7CisgICAgICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IG5ldF9yZW1vdmUoaW50IG4pCiB7CiAJc3RydWN0IHVtbF9uZXQgKmRldmljZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCB1bWxfbmV0X3ByaXZhdGUgKmxwOwotCWNoYXIgKmVuZDsKLQlpbnQgbjsKLQotCW4gPSBzaW1wbGVfc3RydG91bChzdHIsICZlbmQsIDApOwotCWlmKCgqZW5kICE9ICdcMCcpIHx8IChlbmQgPT0gc3RyKSkKLQkJcmV0dXJuKC0xKTsKIAogCWRldmljZSA9IGZpbmRfZGV2aWNlKG4pOwogCWlmKGRldmljZSA9PSBOVUxMKQotCQlyZXR1cm4oMCk7CisJCXJldHVybiAtRU5PREVWOwogCiAJZGV2ID0gZGV2aWNlLT5kZXY7CiAJbHAgPSBkZXYtPnByaXY7Ci0JaWYobHAtPmZkID4gMCkgcmV0dXJuKC0xKTsKKwlpZihscC0+ZmQgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CiAJaWYobHAtPnJlbW92ZSAhPSBOVUxMKSAoKmxwLT5yZW1vdmUpKCZscC0+dXNlcik7CiAJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmZGV2aWNlLT5wZGV2KTsKQEAgLTYzOCwxMyArNjQ4LDE0IEBACiAJbGlzdF9kZWwoJmRldmljZS0+bGlzdCk7CiAJa2ZyZWUoZGV2aWNlKTsKIAlmcmVlX25ldGRldihkZXYpOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBtY19kZXZpY2UgbmV0X21jID0gewogCS5uYW1lCQk9ICJldGgiLAogCS5jb25maWcJCT0gbmV0X2NvbmZpZywKIAkuZ2V0X2NvbmZpZwk9IE5VTEwsCisgICAgICAgIC5pZAkJPSBuZXRfaWQsCiAJLnJlbW92ZQkJPSBuZXRfcmVtb3ZlLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NzbC5jIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCmluZGV4IGIzMmE3NzAuLjYyZTA0ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogc3RhdGljIGludCBzc2xfY29uZmlnKGNoYXIgKnN0cik7CiBzdGF0aWMgaW50IHNzbF9nZXRfY29uZmlnKGNoYXIgKmRldiwgY2hhciAqc3RyLCBpbnQgc2l6ZSwgY2hhciAqKmVycm9yX291dCk7Ci1zdGF0aWMgaW50IHNzbF9yZW1vdmUoY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgc3NsX3JlbW92ZShpbnQgbik7CiAKIHN0YXRpYyBzdHJ1Y3QgbGluZV9kcml2ZXIgZHJpdmVyID0gewogCS5uYW1lIAkJCT0gIlVNTCBzZXJpYWwgbGluZSIsCkBAIC02OSw2ICs2OSw3IEBACiAJCS5uYW1lICAJCT0gInNzbCIsCiAJCS5jb25maWcgCT0gc3NsX2NvbmZpZywKIAkJLmdldF9jb25maWcgCT0gc3NsX2dldF9jb25maWcsCisgICAgICAgICAgICAgICAgLmlkCQk9IGxpbmVfaWQsCiAJCS5yZW1vdmUgCT0gc3NsX3JlbW92ZSwKIAl9LAogfTsKQEAgLTk0LDEwICs5NSwxMCBAQAogCQkJICAgICAgIHN0ciwgc2l6ZSwgZXJyb3Jfb3V0KSk7CiB9CiAKLXN0YXRpYyBpbnQgc3NsX3JlbW92ZShjaGFyICpzdHIpCitzdGF0aWMgaW50IHNzbF9yZW1vdmUoaW50IG4pCiB7Ci0JcmV0dXJuKGxpbmVfcmVtb3ZlKHNlcmlhbF9saW5lcywgCi0JCQkgICBzaXplb2Yoc2VyaWFsX2xpbmVzKS9zaXplb2Yoc2VyaWFsX2xpbmVzWzBdKSwgc3RyKSk7CisgICAgICAgIHJldHVybiBsaW5lX3JlbW92ZShzZXJpYWxfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2VyaWFsX2xpbmVzKS9zaXplb2Yoc2VyaWFsX2xpbmVzWzBdKSwgbik7CiB9CiAKIGludCBzc2xfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMgYi9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCmluZGV4IGFmYmUxZTcuLjAwNWFhNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYwpAQCAtNTUsNyArNTUsNyBAQAogCiBzdGF0aWMgaW50IGNvbl9jb25maWcoY2hhciAqc3RyKTsKIHN0YXRpYyBpbnQgY29uX2dldF9jb25maWcoY2hhciAqZGV2LCBjaGFyICpzdHIsIGludCBzaXplLCBjaGFyICoqZXJyb3Jfb3V0KTsKLXN0YXRpYyBpbnQgY29uX3JlbW92ZShjaGFyICpzdHIpOworc3RhdGljIGludCBjb25fcmVtb3ZlKGludCBuKTsKIAogc3RhdGljIHN0cnVjdCBsaW5lX2RyaXZlciBkcml2ZXIgPSB7CiAJLm5hbWUgCQkJPSAiVU1MIGNvbnNvbGUiLApAQCAtNzUsNiArNzUsNyBAQAogCQkubmFtZSAgCQk9ICJjb24iLAogCQkuY29uZmlnIAk9IGNvbl9jb25maWcsCiAJCS5nZXRfY29uZmlnIAk9IGNvbl9nZXRfY29uZmlnLAorICAgICAgICAgICAgICAgIC5pZAkJPSBsaW5lX2lkLAogCQkucmVtb3ZlIAk9IGNvbl9yZW1vdmUsCiAJfSwKIH07CkBAIC05OSw5ICsxMDAsOSBAQAogCQkJICAgICAgIHNpemUsIGVycm9yX291dCkpOwogfQogCi1zdGF0aWMgaW50IGNvbl9yZW1vdmUoY2hhciAqc3RyKQorc3RhdGljIGludCBjb25fcmVtb3ZlKGludCBuKQogewotCXJldHVybihsaW5lX3JlbW92ZSh2dHMsIHNpemVvZih2dHMpL3NpemVvZih2dHNbMF0pLCBzdHIpKTsKKyAgICAgICAgcmV0dXJuIGxpbmVfcmVtb3ZlKHZ0cywgc2l6ZW9mKHZ0cykvc2l6ZW9mKHZ0c1swXSksIG4pOwogfQogCiBzdGF0aWMgaW50IGNvbl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwppbmRleCAyYTdmNjg5Li4zNDRiMjRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvdWJkX2tlcm4uYwpAQCAtNzU0LDI2ICs3NTQsMzYgQEAKIAlyZXR1cm4obGVuKTsKIH0KIAotc3RhdGljIGludCB1YmRfcmVtb3ZlKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgdWJkX2lkKGNoYXIgKipzdHIsIGludCAqc3RhcnRfb3V0LCBpbnQgKmVuZF9vdXQpCit7CisgICAgICAgIGludCBuOworCisJbiA9IHBhcnNlX3VuaXQoc3RyKTsKKyAgICAgICAgKnN0YXJ0X291dCA9IDA7CisgICAgICAgICplbmRfb3V0ID0gTUFYX0RFViAtIDE7CisgICAgICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IHViZF9yZW1vdmUoaW50IG4pCiB7CiAJc3RydWN0IHViZCAqZGV2OwotCWludCBuLCBlcnIgPSAtRU5PREVWOworCWludCBlcnIgPSAtRU5PREVWOwogCi0JbiA9IHBhcnNlX3VuaXQoJnN0cik7Ci0KLQlpZigobiA8IDApIHx8IChuID49IE1BWF9ERVYpKQotCQlyZXR1cm4oZXJyKTsKLQotCWRldiA9ICZ1YmRfZGV2W25dOwotCWlmKGRldi0+Y291bnQgPiAwKQotCQlyZXR1cm4oLUVCVVNZKTsJLyogeW91IGNhbm5vdCByZW1vdmUgYSBvcGVuIGRpc2sgKi8KLQotCWVyciA9IDA7Ci0gCXNwaW5fbG9jaygmdWJkX2xvY2spOworCXNwaW5fbG9jaygmdWJkX2xvY2spOwogCiAJaWYodWJkX2dlbmRpc2tbbl0gPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKKwlkZXYgPSAmdWJkX2RldltuXTsKKworCWlmKGRldi0+ZmlsZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCS8qIHlvdSBjYW5ub3QgcmVtb3ZlIGEgb3BlbiBkaXNrICovCisJZXJyID0gLUVCVVNZOworCWlmKGRldi0+Y291bnQgPiAwKQorCQlnb3RvIG91dDsKKwogCWRlbF9nZW5kaXNrKHViZF9nZW5kaXNrW25dKTsKIAlwdXRfZGlzayh1YmRfZ2VuZGlza1tuXSk7CiAJdWJkX2dlbmRpc2tbbl0gPSBOVUxMOwpAQCAtNzg3LDE1ICs3OTcsMTYgQEAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT5wZGV2KTsKIAkqZGV2ID0gKChzdHJ1Y3QgdWJkKSBERUZBVUxUX1VCRCk7CiAJZXJyID0gMDsKLSBvdXQ6Ci0gCXNwaW5fdW5sb2NrKCZ1YmRfbG9jayk7Ci0JcmV0dXJuKGVycik7CitvdXQ6CisJc3Bpbl91bmxvY2soJnViZF9sb2NrKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgc3RydWN0IG1jX2RldmljZSB1YmRfbWMgPSB7CiAJLm5hbWUJCT0gInViZCIsCiAJLmNvbmZpZwkJPSB1YmRfY29uZmlnLAogIAkuZ2V0X2NvbmZpZwk9IHViZF9nZXRfY29uZmlnLAorCS5pZAkJPSB1YmRfaWQsCiAJLnJlbW92ZQkJPSB1YmRfcmVtb3ZlLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2xpbmUuaCBiL2FyY2gvdW0vaW5jbHVkZS9saW5lLmgKaW5kZXggNGM1ZTkyYy4uNTMyM2QyMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2xpbmUuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbGluZS5oCkBAIC0xMDEsNyArMTAxLDggQEAKIGV4dGVybiB2b2lkIGNsb3NlX2xpbmVzKHN0cnVjdCBsaW5lICpsaW5lcywgaW50IG5saW5lcyk7CiAKIGV4dGVybiBpbnQgbGluZV9jb25maWcoc3RydWN0IGxpbmUgKmxpbmVzLCB1bnNpZ25lZCBpbnQgc2l6ZW9mX2xpbmVzLCBjaGFyICpzdHIpOwotZXh0ZXJuIGludCBsaW5lX3JlbW92ZShzdHJ1Y3QgbGluZSAqbGluZXMsIHVuc2lnbmVkIGludCBzaXplb2ZfbGluZXMsIGNoYXIgKnN0cik7CitleHRlcm4gaW50IGxpbmVfaWQoY2hhciAqKnN0ciwgaW50ICpzdGFydF9vdXQsIGludCAqZW5kX291dCk7CitleHRlcm4gaW50IGxpbmVfcmVtb3ZlKHN0cnVjdCBsaW5lICpsaW5lcywgdW5zaWduZWQgaW50IHNpemVvZl9saW5lcywgaW50IG4pOwogZXh0ZXJuIGludCBsaW5lX2dldF9jb25maWcoY2hhciAqZGV2LCBzdHJ1Y3QgbGluZSAqbGluZXMsIHVuc2lnbmVkIGludCBzaXplb2ZfbGluZXMsIGNoYXIgKnN0ciwKIAkJCSAgIGludCBzaXplLCBjaGFyICoqZXJyb3Jfb3V0KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlX2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9tY29uc29sZV9rZXJuLmgKaW5kZXggNjFjMjc0Zi4uZDg2ZWUxNCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL21jb25zb2xlX2tlcm4uaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvbWNvbnNvbGVfa2Vybi5oCkBAIC0yMCw3ICsyMCw4IEBACiAJY2hhciAqbmFtZTsKIAlpbnQgKCpjb25maWcpKGNoYXIgKik7CiAJaW50ICgqZ2V0X2NvbmZpZykoY2hhciAqLCBjaGFyICosIGludCwgY2hhciAqKik7Ci0JaW50ICgqcmVtb3ZlKShjaGFyICopOworICAgICAgICBpbnQgKCppZCkoY2hhciAqKiwgaW50ICosIGludCAqKTsKKwlpbnQgKCpyZW1vdmUpKGludCk7CiB9OwogCiAjZGVmaW5lIENPTkZJR19DSFVOSyhzdHIsIHNpemUsIGN1cnJlbnQsIGNodW5rLCBlbmQpIFwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9tZW0uaCBiL2FyY2gvdW0vaW5jbHVkZS9tZW0uaAppbmRleCAxMGM0NmMzLi45OWQzYWQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvbWVtLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL21lbS5oCkBAIC0xMyw2ICsxMyw3IEBACiBleHRlcm4gaW50IGlzX3JlbWFwcGVkKHZvaWQgKnZpcnQpOwogZXh0ZXJuIGludCBwaHlzbWVtX3JlbW92ZV9tYXBwaW5nKHZvaWQgKnZpcnQpOwogZXh0ZXJuIHZvaWQgcGh5c21lbV9mb3JnZXRfZGVzY3JpcHRvcihpbnQgZmQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG9fcGh5cyh2b2lkICp2aXJ0KTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9yZWdpc3RlcnMuaCBiL2FyY2gvdW0vaW5jbHVkZS9yZWdpc3RlcnMuaAppbmRleCA4NzQ0YWJiLi4wYTM1ZTZkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvcmVnaXN0ZXJzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3JlZ2lzdGVycy5oCkBAIC0xNCw2ICsxNCw3IEBACiBleHRlcm4gdm9pZCBzYXZlX3JlZ2lzdGVycyhpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCByZXN0b3JlX3JlZ2lzdGVycyhpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBpbml0X3JlZ2lzdGVycyhpbnQgcGlkKTsKK2V4dGVybiB2b2lkIGdldF9zYWZlX3JlZ2lzdGVycyh1bnNpZ25lZCBsb25nICogcmVncyk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCmluZGV4IGVjYTgwNjYuLjg5OWFhNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9wdHJhY2VfdXNlci5oCkBAIC0yMCwxMSArMjAsMjQgQEAKICNkZWZpbmUgUFRfU1lTQ0FMTF9BUkczX09GRlNFVCBQVF9PRkZTRVQoRURYKQogI2RlZmluZSBQVF9TWVNDQUxMX0FSRzRfT0ZGU0VUIFBUX09GRlNFVChFU0kpCiAjZGVmaW5lIFBUX1NZU0NBTExfQVJHNV9PRkZTRVQgUFRfT0ZGU0VUKEVESSkKKyNkZWZpbmUgUFRfU1lTQ0FMTF9BUkc2X09GRlNFVCBQVF9PRkZTRVQoRUJQKQogCiAjZGVmaW5lIFBUX1NZU0NBTExfUkVUX09GRlNFVCBQVF9PRkZTRVQoRUFYKQogCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9OUiBFQVggLyogVGhpcyBpcyB1c2VkIGJlZm9yZSBhIHN5c3RlbSBjYWxsICovCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkcxIEVCWAorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBFQ1gKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzMgRURYCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkc0IEVTSQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBFREkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgRUJQCisKKyNkZWZpbmUgUkVHU19JUF9JTkRFWCBFSVAKKyNkZWZpbmUgUkVHU19TUF9JTkRFWCBVRVNQCisKICNkZWZpbmUgUFRfSVBfT0ZGU0VUIFBUX09GRlNFVChFSVApCiAjZGVmaW5lIFBUX0lQKHJlZ3MpICgocmVncylbRUlQXSkKKyNkZWZpbmUgUFRfU1BfT0ZGU0VUIFBUX09GRlNFVChVRVNQKQogI2RlZmluZSBQVF9TUChyZWdzKSAoKHJlZ3MpW1VFU1BdKQogCiAjaWZuZGVmIEZSQU1FX1NJWkUKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9zdHViLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNjk5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvc3R1Yi5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK2V4dGVybiB2b2lkIHN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgc3R1Yl9jbG9uZV9oYW5kbGVyKHZvaWQpOworCisjZGVmaW5lIFNUVUJfU1lTQ0FMTF9SRVQgRUFYCisjZGVmaW5lIFNUVUJfTU1BUF9OUiBfX05SX21tYXAyCisjZGVmaW5lIE1NQVBfT0ZGU0VUKG8pICgobykgPj4gUEFHRV9TSElGVCkKKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDIobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMikKK3sKKwlsb25nIHJldDsKKworCV9fYXNtX18oIm1vdmwgJTAsICUlZWN4OyAiIDogOiAiZyIgKGFyZzIpIDogIiVlY3giKTsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVieDsgIiA6IDogImciIChhcmcxKSA6ICIlZWJ4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlYXg7ICIgOiA6ICJnIiAoc3lzY2FsbCkgOiAiJWVheCIpOworCV9fYXNtX18oImludCAkMHg4MDsiIDogOiA6ICIlZWF4Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmwgJSVlYXgsICUwOyAiIDogIj1nIiAocmV0KSA6KTsKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGlubGluZSBsb25nIHN0dWJfc3lzY2FsbDMobG9uZyBzeXNjYWxsLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKQoreworCV9fYXNtX18oIm1vdmwgJTAsICUlZWR4OyAiIDogOiAiZyIgKGFyZzMpIDogIiVlZHgiKTsKKwlyZXR1cm4oc3R1Yl9zeXNjYWxsMihzeXNjYWxsLCBhcmcxLCBhcmcyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw0KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0KQoreworCV9fYXNtX18oIm1vdmwgJTAsICUlZXNpOyAiIDogOiAiZyIgKGFyZzQpIDogIiVlc2kiKTsKKwlyZXR1cm4oc3R1Yl9zeXNjYWxsMyhzeXNjYWxsLCBhcmcxLCBhcmcyLCBhcmczKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGw2KGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMywKKwkJCQkgbG9uZyBhcmc0LCBsb25nIGFyZzUsIGxvbmcgYXJnNikKK3sKKwlsb25nIHJldDsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVheDsgIiA6IDogImciIChzeXNjYWxsKSA6ICIlZWF4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlYng7ICIgOiA6ICJnIiAoYXJnMSkgOiAiJWVieCIpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZWN4OyAiIDogOiAiZyIgKGFyZzIpIDogIiVlY3giKTsKKwlfX2FzbV9fKCJtb3ZsICUwLCAlJWVkeDsgIiA6IDogImciIChhcmczKSA6ICIlZWR4Iik7CisJX19hc21fXygibW92bCAlMCwgJSVlc2k7ICIgOiA6ICJnIiAoYXJnNCkgOiAiJWVzaSIpOworCV9fYXNtX18oIm1vdmwgJTAsICUlZWRpOyAiIDogOiAiZyIgKGFyZzUpIDogIiVlZGkiKTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGwgJSVlYnAgOyBtb3ZsICUxLCAlJWVicDsgIgorCQkiaW50ICQweDgwOyBwb3BsICUlZWJwIDsgIgorCQkibW92bCAlJWVheCwgJTA7ICIgOiAiPWciIChyZXQpIDogImciIChhcmc2KSA6ICIlZWF4Iik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFwX215c2VsZih2b2lkKQoreworCV9fYXNtKCJpbnQzIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlX3VzZXIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZV91c2VyLmgKaW5kZXggMzE3Mjk5Ny4uMTI4ZmFmMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvcHRyYWNlX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2VfdXNlci5oCkBAIC01NSw2ICs1NSwyMCBAQAogI2RlZmluZSBQVFJBQ0VfT0xEU0VUT1BUSU9OUyAyMQogI2VuZGlmCiAKKy8qIFRoZXNlIGFyZSBiZWZvcmUgdGhlIHN5c3RlbSBjYWxsLCBzbyB0aGUgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBSQVgKKyAqIHJhdGhlciB0aGFuIE9SSUdfUkFYLCBhbmQgYXJnNCBpcyBSMTAgcmF0aGVyIHRoYW4gUkNYCisgKi8KKyNkZWZpbmUgUkVHU19TWVNDQUxMX05SIFBUX0lOREVYKFJBWCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzEgUFRfSU5ERVgoUkRJKQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHMiBQVF9JTkRFWChSU0kpCisjZGVmaW5lIFJFR1NfU1lTQ0FMTF9BUkczIFBUX0lOREVYKFJEWCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzQgUFRfSU5ERVgoUjEwKQorI2RlZmluZSBSRUdTX1NZU0NBTExfQVJHNSBQVF9JTkRFWChSOCkKKyNkZWZpbmUgUkVHU19TWVNDQUxMX0FSRzYgUFRfSU5ERVgoUjkpCisKKyNkZWZpbmUgUkVHU19JUF9JTkRFWCBQVF9JTkRFWChSSVApCisjZGVmaW5lIFJFR1NfU1BfSU5ERVggUFRfSU5ERVgoUlNQKQorCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N0dWIuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk5MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3R1Yi5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1lTREVQX1NUVUJfSAorI2RlZmluZSBfX1NZU0RFUF9TVFVCX0gKKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzZGVwL3B0cmFjZV91c2VyLmg+CisKK2V4dGVybiB2b2lkIHN0dWJfc2Vndl9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgc3R1Yl9jbG9uZV9oYW5kbGVyKHZvaWQpOworCisjZGVmaW5lIFNUVUJfU1lTQ0FMTF9SRVQgUFRfSU5ERVgoUkFYKQorI2RlZmluZSBTVFVCX01NQVBfTlIgX19OUl9tbWFwCisjZGVmaW5lIE1NQVBfT0ZGU0VUKG8pIChvKQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsMihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyKQoreworCWxvbmcgcmV0OworCisJX19hc21fXygibW92cSAlMCwgJSVyc2k7ICIgOiA6ICJnIiAoYXJnMikgOiAiJXJzaSIpOworCV9fYXNtX18oIm1vdnEgJTAsICUlcmRpOyAiIDogOiAiZyIgKGFyZzEpIDogIiVyZGkiKTsKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXJheDsgIiA6IDogImciIChzeXNjYWxsKSA6ICIlcmF4Iik7CisJX19hc21fXygic3lzY2FsbDsiIDogOiA6ICIlcmF4IiwgIiVyMTEiLCAiJXJjeCIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZxICUlcmF4LCAlMDsgIiA6ICI9ZyIgKHJldCkgOik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBzdHViX3N5c2NhbGwzKGxvbmcgc3lzY2FsbCwgbG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMykKK3sKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXJkeDsgIiA6IDogImciIChhcmczKSA6ICIlcmR4Iik7CisJcmV0dXJuKHN0dWJfc3lzY2FsbDIoc3lzY2FsbCwgYXJnMSwgYXJnMikpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNChsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCisJCQkJIGxvbmcgYXJnNCkKK3sKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXIxMDsgIiA6IDogImciIChhcmc0KSA6ICIlcjEwIik7CisJcmV0dXJuKHN0dWJfc3lzY2FsbDMoc3lzY2FsbCwgYXJnMSwgYXJnMiwgYXJnMykpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc3R1Yl9zeXNjYWxsNihsb25nIHN5c2NhbGwsIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsCisJCQkJIGxvbmcgYXJnNCwgbG9uZyBhcmc1LCBsb25nIGFyZzYpCit7CisJX19hc21fXygibW92cSAlMCwgJSVyOTsgIiA6IDogImciIChhcmc2KSA6ICIlcjkiKTsKKwlfX2FzbV9fKCJtb3ZxICUwLCAlJXI4OyAiIDogOiAiZyIgKGFyZzUpIDogIiVyOCIpOworCXJldHVybihzdHViX3N5c2NhbGw0KHN5c2NhbGwsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYXBfbXlzZWxmKHZvaWQpCit7CisJX19hc20oImludDMiKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvdGltZV91c2VyLmggYi9hcmNoL3VtL2luY2x1ZGUvdGltZV91c2VyLmgKaW5kZXggNjc5M2EyZi4uMTdkN2VmMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3RpbWVfdXNlci5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS90aW1lX3VzZXIuaApAQCAtOCwxMSArOCwxMiBAQAogCiBleHRlcm4gdm9pZCB0aW1lcih2b2lkKTsKIGV4dGVybiB2b2lkIHN3aXRjaF90aW1lcnMoaW50IHRvX3JlYWwpOwotZXh0ZXJuIHZvaWQgc2V0X2ludGVydmFsKGludCB0aW1lcl90eXBlKTsKIGV4dGVybiB2b2lkIGlkbGVfc2xlZXAoaW50IHNlY3MpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX3RpbWVyKHZvaWQpOworZXh0ZXJuIHZvaWQgcHJlcGFyZV90aW1lcih2b2lkICogcHRyKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfdGltZXIodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lX2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCB0aW1lX3VubG9jayh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIHVzZXJfdGltZV9pbml0KHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS90bGIuaCBiL2FyY2gvdW0vaW5jbHVkZS90bGIuaAppbmRleCBkYTEwOTcyLi5jNmY5NjI4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvdGxiLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3RsYi5oCkBAIC0zNywzMSArMzcsMjUgQEAKIGV4dGVybiB2b2lkIG1wcm90ZWN0X2tlcm5lbF92bShpbnQgdyk7CiBleHRlcm4gdm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCk7CiBleHRlcm4gdm9pZCBmaXhfcmFuZ2VfY29tbW9uKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGludCBmb3JjZSwgaW50IGRhdGEsCi0JCQkgICAgIHZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsIGludCBmb3JjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKTsKIGV4dGVybiBpbnQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24odW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAogZXh0ZXJuIGludCBhZGRfbW1hcCh1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBsZW4sCiAJCSAgICBpbnQgciwgaW50IHcsIGludCB4LCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgaW5kZXgsCi0JCSAgICBpbnQgbGFzdF9maWxsZWQsIGludCBkYXRhLAotCQkgICAgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RfZmlsbGVkLCB1bmlvbiBtbV9jb250ZXh0ICptbXUsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwgc3RydWN0IGhvc3Rfdm1fb3AgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSk7CiBleHRlcm4gaW50IGFkZF9tdW5tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJICAgICAgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LCBpbnQgbGFzdF9maWxsZWQsCi0JCSAgICAgIGludCBkYXRhLCB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpOworICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KSk7CiBleHRlcm4gaW50IGFkZF9tcHJvdGVjdCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsCiAJCQlpbnQgeCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LAotCQkJaW50IGxhc3RfZmlsbGVkLCBpbnQgZGF0YSwKLQkJCXZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdF9maWxsZWQsIHVuaW9uIG1tX2NvbnRleHQgKm1tdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwgc3RydWN0IGhvc3Rfdm1fb3AgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogI2VuZGlmCi0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKaW5kZXggNzE1YjA4My4uMzk0MmE1ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCisrKyBiL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUwpAQCAtNjcsNiArNjcsMTIgQEAKICAgICAqKC5zdHViIC50ZXh0LiogLmdudS5saW5rb25jZS50LiopCiAgICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCiAgICAgKiguZ251Lndhcm5pbmcpCisKKyAgICAuID0gQUxJR04oNDA5Nik7CisgICAgX19zeXNjYWxsX3N0dWJfc3RhcnQgPSAuOworICAgICooLl9fc3lzY2FsbF9zdHViKikKKyAgICBfX3N5c2NhbGxfc3R1Yl9lbmQgPSAuOworICAgIC4gPSBBTElHTig0MDk2KTsKICAgfSA9MHg5MDkwOTA5MAogICAuZmluaSAgICAgICAgICAgOiB7CiAgICAgS0VFUCAoKiguZmluaSkpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9tYWluLmMgYi9hcmNoL3VtL2tlcm5lbC9tYWluLmMKaW5kZXggZTU5ZjU4MS4uMWUxYTg3ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvbWFpbi5jCisrKyBiL2FyY2gvdW0va2VybmVsL21haW4uYwpAQCAtNjksNyArNjksNiBAQAogCiBzdGF0aWMgdm9pZCBsYXN0X2RpdGNoX2V4aXQoaW50IHNpZykKIHsKLSAgICAgICAga21hbGxvY19vayA9IDA7CiAJc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CiAJc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwogCXNpZ25hbChTSUdIVVAsIFNJR19ERkwpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jIGIvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCmluZGV4IDQyMGU2ZDUuLmEyNGUzYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYworKysgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKQEAgLTM1Myw2ICszNTMsOCBAQAogCiAjZGVmaW5lIFBGTl9VUCh4KSAoKCh4KSArIFBBR0VfU0laRS0xKSA+PiBQQUdFX1NISUZUKQogCitleHRlcm4gaW50IF9fc3lzY2FsbF9zdHViX3N0YXJ0LCBfX2JpbmFyeV9zdGFydDsKKwogdm9pZCBzZXR1cF9waHlzbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV9lbmQsCiAJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGhpZ2htZW0pCiB7CkBAIC0zNzEsNiArMzczLDEyIEBACiAJCWV4aXQoMSk7CiAJfQogCisJLyogU3BlY2lhbCBrbHVkZ2UgLSBUaGlzIHBhZ2Ugd2lsbCBiZSBtYXBwZWQgaW4gdG8gdXNlcnNwYWNlIHByb2Nlc3NlcworCSAqIGZyb20gcGh5c21lbV9mZCwgc28gaXQgbmVlZHMgdG8gYmUgd3JpdHRlbiBvdXQgdGhlcmUuCisJICovCisJb3Nfc2Vla19maWxlKHBoeXNtZW1fZmQsIF9fcGEoJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSk7CisJb3Nfd3JpdGVfZmlsZShwaHlzbWVtX2ZkLCAmX19zeXNjYWxsX3N0dWJfc3RhcnQsIFBBR0VfU0laRSk7CisKIAlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0ocGZuLCBwZm4gKyBkZWx0YSk7CiAJZnJlZV9ib290bWVtKF9fcGEocmVzZXJ2ZV9lbmQpICsgYm9vdG1hcF9zaXplLAogCQkgICAgIGxlbiAtIGJvb3RtYXBfc2l6ZSAtIHJlc2VydmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDFiNWVmM2UuLmM0NWE2MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKICNpbmNsdWRlICJtb2RlLmgiCisjaW5jbHVkZSAidGVtcGZpbGUuaCIKICNpZmRlZiBVTUxfQ09ORklHX01PREVfU0tBUwogI2luY2x1ZGUgInNrYXMuaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgpAQCAtMzU4LDExICszNTksMTYgQEAKIAkJa2lsbCh0YXJnZXQsIFNJR0lPKTsKIH0KIAoraW50IHB0cmFjZV9mYXVsdGluZm8gPSAwOworaW50IHByb2NfbW0gPSAxOworCitleHRlcm4gdm9pZCAqX19zeXNjYWxsX3N0dWJfc3RhcnQsIF9fc3lzY2FsbF9zdHViX2VuZDsKKwogI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9TS0FTCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NrYXMzX3B0cmFjZV9zdXBwb3J0KHZvaWQpCiB7CiAJc3RydWN0IHB0cmFjZV9mYXVsdGluZm8gZmk7Ci0JaW50IHBpZCwgbiwgcmV0ID0gMTsKKwlpbnQgcGlkLCBuOwogCiAJcHJpbnRmKCJDaGVja2luZyBmb3IgdGhlIHNrYXMzIHBhdGNoIGluIHRoZSBob3N0Li4uIik7CiAJcGlkID0gc3RhcnRfcHRyYWNlZF9jaGlsZCgpOwpAQCAtMzc0LDMzICszODAsMzEgQEAKIAkJZWxzZSB7CiAJCQlwZXJyb3IoIm5vdCBmb3VuZCIpOwogCQl9Ci0JCXJldCA9IDA7Ci0JfSBlbHNlIHsKKwl9CisJZWxzZSB7CisJCXB0cmFjZV9mYXVsdGluZm8gPSAxOwogCQlwcmludGYoImZvdW5kXG4iKTsKIAl9CiAKIAlpbml0X3JlZ2lzdGVycyhwaWQpOwogCXN0b3BfcHRyYWNlZF9jaGlsZChwaWQsIDEsIDEpOwotCi0JcmV0dXJuKHJldCk7CiB9CiAKIGludCBjYW5fZG9fc2thcyh2b2lkKQogewotCWludCByZXQgPSAxOwotCiAJcHJpbnRmKCJDaGVja2luZyBmb3IgL3Byb2MvbW0uLi4iKTsKIAlpZiAob3NfYWNjZXNzKCIvcHJvYy9tbSIsIE9TX0FDQ19XX09LKSA8IDApIHsKKwkJcHJvY19tbSA9IDA7CiAJCXByaW50Zigibm90IGZvdW5kXG4iKTsKLQkJcmV0ID0gMDsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIHsKKwl9CisJZWxzZSB7CiAJCXByaW50ZigiZm91bmRcbiIpOwogCX0KIAotCXJldCA9IGNoZWNrX3NrYXMzX3B0cmFjZV9zdXBwb3J0KCk7CiBvdXQ6Ci0JcmV0dXJuIHJldDsKKwljaGVja19za2FzM19wdHJhY2Vfc3VwcG9ydCgpOworCXJldHVybiAxOwogfQogI2Vsc2UKIGludCBjYW5fZG9fc2thcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzc19rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYwppbmRleCAxNTc1ODRhLi5kNDAzNmVkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYwpAQCAtOTYsOCArOTYsOCBAQAogCiAJY3VycmVudC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQucHJvYyA9IGZuOwogCWN1cnJlbnQtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLmFyZyA9IGFyZzsKLQlwaWQgPSBkb19mb3JrKENMT05FX1ZNIHwgQ0xPTkVfVU5UUkFDRUQgfCBmbGFncywgMCwgTlVMTCwgMCwgTlVMTCwKLQkJICAgICAgTlVMTCk7CisJcGlkID0gZG9fZm9yayhDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VEIHwgZmxhZ3MsIDAsCisJCSAgICAgICZjdXJyZW50LT50aHJlYWQucmVncywgMCwgTlVMTCwgTlVMTCk7CiAJaWYocGlkIDwgMCkKIAkJcGFuaWMoImRvX2ZvcmsgZmFpbGVkIGluIGtlcm5lbF90aHJlYWQsIGVycm5vID0gJWQiLCBwaWQpOwogCXJldHVybihwaWQpOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAKIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCiB7Ci0JdW1sX2lkbGVfdGltZXIoKTsKKwlDSE9PU0VfTU9ERSh1bWxfaWRsZV90aW1lcigpLCAodm9pZCkgMCk7CiAKIAlhdG9taWNfaW5jKCZpbml0X21tLm1tX2NvdW50KTsKIAljdXJyZW50LT5tbSA9ICZpbml0X21tOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcmVib290LmMgYi9hcmNoL3VtL2tlcm5lbC9yZWJvb3QuYwppbmRleCAyMDdmODlkLi5mY2VjNTFkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL3VtL2tlcm5lbC9yZWJvb3QuYwpAQCAtMzgsMTQgKzM4LDE0IEBACiAKIHZvaWQgdW1sX2NsZWFudXAodm9pZCkKIHsKLQlraWxsX29mZl9wcm9jZXNzZXMoKTsKKyAgICAgICAga21hbGxvY19vayA9IDA7CiAJZG9fdW1sX2V4aXRjYWxscygpOworCWtpbGxfb2ZmX3Byb2Nlc3NlcygpOwogfQogCiB2b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICogX191bnVzZWQpCiB7Ci0JZG9fdW1sX2V4aXRjYWxscygpOwotCWtpbGxfb2ZmX3Byb2Nlc3NlcygpOworICAgICAgICB1bWxfY2xlYW51cCgpOwogCUNIT09TRV9NT0RFKHJlYm9vdF90dCgpLCByZWJvb3Rfc2thcygpKTsKIH0KIApAQCAtNTMsOCArNTMsNyBAQAogCiB2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JZG9fdW1sX2V4aXRjYWxscygpOwotCWtpbGxfb2ZmX3Byb2Nlc3NlcygpOworICAgICAgICB1bWxfY2xlYW51cCgpOwogCUNIT09TRV9NT0RFKGhhbHRfdHQoKSwgaGFsdF9za2FzKCkpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlIGIvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZQppbmRleCBkMzdkMWJmLi5kMjk2ZDU1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvTWFrZWZpbGUKQEAgLTMsMTEgKzMsMTQgQEAKICMgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogIwogCi1vYmoteSA6PSBleGVjX2tlcm4ubyBtZW0ubyBtZW1fdXNlci5vIG1tdS5vIHByb2Nlc3MubyBwcm9jZXNzX2tlcm4ubyBcCi0Jc3lzY2FsbF9rZXJuLm8gc3lzY2FsbF91c2VyLm8gdGltZS5vIHRsYi5vIHRyYXBfdXNlci5vIHVhY2Nlc3MubyBcCitvYmoteSA6PSBjbG9uZS5vIGV4ZWNfa2Vybi5vIG1lbS5vIG1lbV91c2VyLm8gbW11Lm8gcHJvY2Vzcy5vIHByb2Nlc3Nfa2Vybi5vIFwKKwlzeXNjYWxsX2tlcm4ubyBzeXNjYWxsX3VzZXIubyB0bGIubyB0cmFwX3VzZXIubyB1YWNjZXNzLm8gXAogCiBzdWJkaXItIDo9IHV0aWwKIAotVVNFUl9PQkpTIDo9IHByb2Nlc3MubyB0aW1lLm8KK1VTRVJfT0JKUyA6PSBwcm9jZXNzLm8gY2xvbmUubwogCiBpbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcworCisjIGNsb25lLm8gaXMgaW4gdGhlIHN0dWIsIHNvIGl0IGNhbid0IGJlIGJ1aWx0IHdpdGggcHJvZmlsaW5nCiskKG9iaikvY2xvbmUubyA6IGNfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvY2xvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGM1NWYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9jbG9uZS5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJzdHViLWRhdGEuaCIKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKKworLyogVGhpcyBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIGFueQorICogZXh0cmFuZW91cyBnY2MgZmxhZ3MgKC1wZywgLWZwcm9maWxlLWFyY3MsIC1mdGVzdC1jb3ZlcmFnZSkgZGlzYWJsZWQKKyAqLwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX2Nsb25lX2hhbmRsZXIodm9pZCkKK3sKKwlsb25nIGVycjsKKwlzdHJ1Y3Qgc3R1Yl9kYXRhICpmcm9tID0gKHN0cnVjdCBzdHViX2RhdGEgKikgVU1MX0NPTkZJR19TVFVCX0RBVEE7CisKKwllcnIgPSBzdHViX3N5c2NhbGwyKF9fTlJfY2xvbmUsIENMT05FX1BBUkVOVCB8IENMT05FX0ZJTEVTIHwgU0lHQ0hMRCwKKwkJCSAgICBVTUxfQ09ORklHX1NUVUJfREFUQSArIFBBR0VfU0laRSAvIDIgLQorCQkJICAgIHNpemVvZih2b2lkICopKTsKKwlpZihlcnIgIT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzdHViX3N5c2NhbGw0KF9fTlJfcHRyYWNlLCBQVFJBQ0VfVFJBQ0VNRSwgMCwgMCwgMCk7CisJaWYoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IHN0dWJfc3lzY2FsbDMoX19OUl9zZXRpdGltZXIsIElUSU1FUl9WSVJUVUFMLAorCQkJICAgIChsb25nKSAmZnJvbS0+dGltZXIsIDApOworCWlmKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzdHViX3N5c2NhbGw2KFNUVUJfTU1BUF9OUiwgVU1MX0NPTkZJR19TVFVCX0RBVEEsIFBBR0VfU0laRSwKKwkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfRklYRUQgfCBNQVBfU0hBUkVELAorCQkJICAgIGZyb20tPmZkLCBmcm9tLT5vZmZzZXQpOworIG91dDoKKwkvKiBzYXZlIGN1cnJlbnQgcmVzdWx0LiBQYXJlbnQ6IHBpZDsgY2hpbGQ6IHJldGNvZGUgb2YgbW1hcCAqLworCWZyb20tPmVyciA9IGVycjsKKwl0cmFwX215c2VsZigpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvZXhlY19rZXJuLmMKaW5kZXggYzZiNGQ1ZC4uNzdlZDdiYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2V4ZWNfa2Vybi5jCkBAIC0xOCw3ICsxOCw3IEBACiB2b2lkIGZsdXNoX3RocmVhZF9za2FzKHZvaWQpCiB7CiAJZm9yY2VfZmx1c2hfYWxsKCk7Ci0Jc3dpdGNoX21tX3NrYXMoY3VycmVudC0+bW0tPmNvbnRleHQuc2thcy5tbV9mZCk7CisgICAgICAgIHN3aXRjaF9tbV9za2FzKCZjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkKTsKIH0KIAogdm9pZCBzdGFydF90aHJlYWRfc2thcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlaXAsIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvbW1faWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRkMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tX2lkLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2lmbmRlZiBfX01NX0lEX0gKKyNkZWZpbmUgX19NTV9JRF9ICisKK3N0cnVjdCBtbV9pZCB7CisJdW5pb24geworCQlpbnQgbW1fZmQ7CisJCWludCBwaWQ7CisJfSB1OworCXVuc2lnbmVkIGxvbmcgc3RhY2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tbXUtc2thcy5oIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKaW5kZXggNGNkNjBkNy4uMjc4YjcyZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21tdS1za2FzLmgKQEAgLTYsMTAgKzYsMTUgQEAKICNpZm5kZWYgX19TS0FTX01NVV9ICiAjZGVmaW5lIF9fU0tBU19NTVVfSAogCisjaW5jbHVkZSAibW1faWQuaCIKKwogc3RydWN0IG1tdV9jb250ZXh0X3NrYXMgewotCWludCBtbV9mZDsKKwlzdHJ1Y3QgbW1faWQgaWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdF9wYWdlX3RhYmxlOwogfTsKIAorZXh0ZXJuIHZvaWQgc3dpdGNoX21tX3NrYXMoc3RydWN0IG1tX2lkICogbW1faWRwKTsKKwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvbW9kZS1za2FzLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvbW9kZS1za2FzLmgKaW5kZXggYzFlMzNiZC4uYmNkMjZhNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL21vZGUtc2thcy5oCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9tb2RlLXNrYXMuaApAQCAtMTMsNyArMTMsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXhlY19mcHhfcmVnc1tdOwogZXh0ZXJuIGludCBoYXZlX2ZweF9yZWdzOwogCi1leHRlcm4gdm9pZCB1c2VyX3RpbWVfaW5pdF9za2FzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2lnX2hhbmRsZXJfY29tbW9uX3NrYXMoaW50IHNpZywgdm9pZCAqc2NfcHRyKTsKIGV4dGVybiB2b2lkIGhhbHRfc2thcyh2b2lkKTsKIGV4dGVybiB2b2lkIHJlYm9vdF9za2FzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaCBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9za2FzLmgKaW5kZXggOTZiNTFkYi4uZDk4M2VhOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9pbmNsdWRlL3NrYXMuaAorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc2thcy5oCkBAIC02LDkgKzYsMTEgQEAKICNpZm5kZWYgX19TS0FTX0gKICNkZWZpbmUgX19TS0FTX0gKIAorI2luY2x1ZGUgIm1tX2lkLmgiCiAjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgogCiBleHRlcm4gaW50IHVzZXJzcGFjZV9waWRbXTsKK2V4dGVybiBpbnQgcHJvY19tbSwgcHRyYWNlX2ZhdWx0aW5mbzsKIAogZXh0ZXJuIHZvaWQgc3dpdGNoX3RocmVhZHModm9pZCAqbWUsIHZvaWQgKm5leHQpOwogZXh0ZXJuIHZvaWQgdGhyZWFkX3dhaXQodm9pZCAqc3csIHZvaWQgKmZiKTsKQEAgLTIyLDE2ICsyNCwxOCBAQAogZXh0ZXJuIHZvaWQgcmVtb3ZlX3NpZ3N0YWNrKHZvaWQpOwogZXh0ZXJuIHZvaWQgbmV3X3RocmVhZF9oYW5kbGVyKGludCBzaWcpOwogZXh0ZXJuIHZvaWQgaGFuZGxlX3N5c2NhbGwodW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgbWFwKGludCBmZCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LAotCQlpbnQgeCwgaW50IHBoeXNfZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQpOwotZXh0ZXJuIGludCB1bm1hcChpbnQgZmQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKTsKLWV4dGVybiBpbnQgcHJvdGVjdChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIAotCQkgICBpbnQgciwgaW50IHcsIGludCB4KTsKK2V4dGVybiBpbnQgbWFwKHN0cnVjdCBtbV9pZCAqIG1tX2lkcCwgdW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKKyAgICAgICAgICAgICAgIGludCByLCBpbnQgdywgaW50IHgsIGludCBwaHlzX2ZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0KTsKK2V4dGVybiBpbnQgdW5tYXAoc3RydWN0IG1tX2lkICogbW1faWRwLCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CitleHRlcm4gaW50IHByb3RlY3Qoc3RydWN0IG1tX2lkICogbW1faWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgIHVuc2lnbmVkIGxvbmcgbGVuLCBpbnQgciwgaW50IHcsIGludCB4KTsKIGV4dGVybiB2b2lkIHVzZXJfc2lnbmFsKGludCBzaWcsIHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzLCBpbnQgcGlkKTsKIGV4dGVybiBpbnQgbmV3X21tKGludCBmcm9tKTsKLWV4dGVybiB2b2lkIHN0YXJ0X3VzZXJzcGFjZShpbnQgY3B1KTsKK2V4dGVybiBpbnQgc3RhcnRfdXNlcnNwYWNlKHVuc2lnbmVkIGxvbmcgc3R1Yl9zdGFjayk7CitleHRlcm4gaW50IGNvcHlfY29udGV4dF9za2FzMCh1bnNpZ25lZCBsb25nIHN0YWNrLCBpbnQgcGlkKTsKIGV4dGVybiB2b2lkIGdldF9za2FzX2ZhdWx0aW5mbyhpbnQgcGlkLCBzdHJ1Y3QgZmF1bHRpbmZvICogZmkpOwogZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3NrYXModm9pZCAqcik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0dWJfc3RhY2sodm9pZCk7CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc3R1Yi1kYXRhLmggYi9hcmNoL3VtL2tlcm5lbC9za2FzL2luY2x1ZGUvc3R1Yi1kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlZDkyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvaW5jbHVkZS9zdHViLWRhdGEuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisjaWZuZGVmIF9fU1RVQl9EQVRBX0gKKyNkZWZpbmUgX19TVFVCX0RBVEFfSAorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworc3RydWN0IHN0dWJfZGF0YSB7CisJbG9uZyBvZmZzZXQ7CisJaW50IGZkOworCXN0cnVjdCBpdGltZXJ2YWwgdGltZXI7CisJbG9uZyBlcnI7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21lbS5jCmluZGV4IDQzOGRiMmYuLjE0NzQ2NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tZW0uYwpAQCAtNSw3ICs1LDkgQEAKIAogI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImxpbnV4L21tLmgiCisjaW5jbHVkZSAiYXNtL3BndGFibGUuaCIKICNpbmNsdWRlICJtZW1fdXNlci5oIgorI2luY2x1ZGUgInNrYXMuaCIKIAogdW5zaWduZWQgbG9uZyBzZXRfdGFza19zaXplc19za2FzKGludCBhcmcsIHVuc2lnbmVkIGxvbmcgKmhvc3Rfc2l6ZV9vdXQsIAogCQkJCSAgdW5zaWduZWQgbG9uZyAqdGFza19zaXplX291dCkKQEAgLTE4LDcgKzIwLDkgQEAKIAkqdGFza19zaXplX291dCA9IENPTkZJR19IT1NUX1RBU0tfU0laRTsKICNlbHNlCiAJKmhvc3Rfc2l6ZV9vdXQgPSB0b3A7Ci0JKnRhc2tfc2l6ZV9vdXQgPSB0b3A7CisJaWYgKHByb2NfbW0gJiYgcHRyYWNlX2ZhdWx0aW5mbykKKwkJKnRhc2tfc2l6ZV9vdXQgPSB0b3A7CisJZWxzZSAqdGFza19zaXplX291dCA9IENPTkZJR19TVFVCX1NUQVJUICYgUEdESVJfTUFTSzsKICNlbmRpZgogCXJldHVybigoKHVuc2lnbmVkIGxvbmcpIHNldF90YXNrX3NpemVzX3NrYXMpICYgfjB4ZmZmZmZmKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtX3VzZXIuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbWVtX3VzZXIuYwppbmRleCAxMzEwYmYxLi5iMDk4MGZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL21lbV91c2VyLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tZW1fdXNlci5jCkBAIC0zLDEwMCArMywxNzEgQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCisjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAjaW5jbHVkZSAibWVtX3VzZXIuaCIKICNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJtbV9pZC5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInByb2NfbW0uaCIKKyNpbmNsdWRlICJwdHJhY2VfdXNlci5oIgorI2luY2x1ZGUgInVzZXJfdXRpbC5oIgorI2luY2x1ZGUgImtlcm5fdXRpbC5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisjaW5jbHVkZSAic3lzZGVwL3B0cmFjZS5oIgorI2luY2x1ZGUgInN5c2RlcC9zdHViLmgiCisjaW5jbHVkZSAic2thcy5oIgogCi12b2lkIG1hcChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywKLQkgaW50IHgsIGludCBwaHlzX2ZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0KQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzY2FsbF9zdHViLCBfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKworZXh0ZXJuIHZvaWQgd2FpdF9zdHViX2RvbmUoaW50IHBpZCwgaW50IHNpZywgY2hhciAqIGZuYW1lKTsKKworc3RhdGljIGxvbmcgcnVuX3N5c2NhbGxfc3R1YihzdHJ1Y3QgbW1faWQgKiBtbV9pZHAsIGludCBzeXNjYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICphcmdzKQogewotCXN0cnVjdCBwcm9jX21tX29wIG1hcDsKLQlpbnQgcHJvdCwgbjsKKyAgICAgICAgaW50IG4sIHBpZCA9IG1tX2lkcC0+dS5waWQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgcmVnc1tNQVhfUkVHX05SXTsKIAotCXByb3QgPSAociA/IFBST1RfUkVBRCA6IDApIHwgKHcgPyBQUk9UX1dSSVRFIDogMCkgfCAKLQkJKHggPyBQUk9UX0VYRUMgOiAwKTsKKyAgICAgICAgZ2V0X3NhZmVfcmVnaXN0ZXJzKHJlZ3MpOworICAgICAgICByZWdzW1JFR1NfSVBfSU5ERVhdID0gVU1MX0NPTkZJR19TVFVCX0NPREUgKworICAgICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZykgJnN5c2NhbGxfc3R1YiAtCisgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAmX19zeXNjYWxsX3N0dWJfc3RhcnQpOworICAgICAgICAvKiBYWFggRG9uJ3QgaGF2ZSBhIGRlZmluZSBmb3Igc3RhcnRpbmcgYSBzeXNjYWxsICovCisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX05SXSA9IHN5c2NhbGw7CisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzFdID0gYXJnc1swXTsKKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHMl0gPSBhcmdzWzFdOworICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkczXSA9IGFyZ3NbMl07CisgICAgICAgIHJlZ3NbUkVHU19TWVNDQUxMX0FSRzRdID0gYXJnc1szXTsKKyAgICAgICAgcmVnc1tSRUdTX1NZU0NBTExfQVJHNV0gPSBhcmdzWzRdOworICAgICAgICByZWdzW1JFR1NfU1lTQ0FMTF9BUkc2XSA9IGFyZ3NbNV07CisgICAgICAgIG4gPSBwdHJhY2Vfc2V0cmVncyhwaWQsIHJlZ3MpOworICAgICAgICBpZihuIDwgMCl7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJydW5fc3lzY2FsbF9zdHViIDogUFRSQUNFX1NFVFJFR1MgZmFpbGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJlcnJubyA9ICVkXG4iLCBuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4obik7CisgICAgICAgIH0KIAotCW1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wIAk9IE1NX01NQVAsCi0JCQkJICAgICAudSAJPSAKLQkJCQkgICAgIHsgLm1tYXAJPSAKLQkJCQkgICAgICAgeyAuYWRkciAJCT0gdmlydCwKLQkJCQkJIC5sZW4JCT0gbGVuLAotCQkJCQkgLnByb3QJCT0gcHJvdCwKLQkJCQkJIC5mbGFncwkJPSBNQVBfU0hBUkVEIHwgCi0JCQkJCSAgICAgICAgICAgICAgICAgIE1BUF9GSVhFRCwKLQkJCQkJIC5mZAkJPSBwaHlzX2ZkLAotCQkJCQkgLm9mZnNldAk9IG9mZnNldAotCQkJCSAgICAgICB9IH0gfSApOwotCW4gPSBvc193cml0ZV9maWxlKGZkLCAmbWFwLCBzaXplb2YobWFwKSk7Ci0JaWYobiAhPSBzaXplb2YobWFwKSkgCi0JCXByaW50aygibWFwIDogL3Byb2MvbW0gbWFwIGZhaWxlZCwgZXJyID0gJWRcbiIsIC1uKTsKKyAgICAgICAgd2FpdF9zdHViX2RvbmUocGlkLCAwLCAicnVuX3N5c2NhbGxfc3R1YiIpOworCisgICAgICAgIHJldHVybigqKCh1bnNpZ25lZCBsb25nICopIG1tX2lkcC0+c3RhY2spKTsKIH0KIAotaW50IHVubWFwKGludCBmZCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pCitpbnQgbWFwKHN0cnVjdCBtbV9pZCAqbW1faWRwLCB1bnNpZ25lZCBsb25nIHZpcnQsIHVuc2lnbmVkIGxvbmcgbGVuLAorICAgICAgICBpbnQgciwgaW50IHcsIGludCB4LCBpbnQgcGh5c19mZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCkKIHsKLQlzdHJ1Y3QgcHJvY19tbV9vcCB1bm1hcDsKLQlpbnQgbjsKKyAgICAgICAgaW50IHByb3QsIG47CiAKLQl1bm1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wIAk9IE1NX01VTk1BUCwKLQkJCQkgICAgICAgLnUgCT0gCi0JCQkJICAgICAgIHsgLm11bm1hcAk9IAotCQkJCQkgeyAuYWRkciAJPSAodW5zaWduZWQgbG9uZykgYWRkciwKLQkJCQkJICAgLmxlbgkJPSBsZW4gfSB9IH0gKTsKLQluID0gb3Nfd3JpdGVfZmlsZShmZCwgJnVubWFwLCBzaXplb2YodW5tYXApKTsKLQlpZihuICE9IHNpemVvZih1bm1hcCkpIHsKLQkJaWYobiA8IDApCi0JCQlyZXR1cm4obik7Ci0JCWVsc2UgaWYobiA+IDApCi0JCQlyZXR1cm4oLUVJTyk7Ci0JfQorICAgICAgICBwcm90ID0gKHIgPyBQUk9UX1JFQUQgOiAwKSB8ICh3ID8gUFJPVF9XUklURSA6IDApIHwKKyAgICAgICAgICAgICAgICAoeCA/IFBST1RfRVhFQyA6IDApOwogCi0JcmV0dXJuKDApOworICAgICAgICBpZihwcm9jX21tKXsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvY19tbV9vcCBtYXA7CisgICAgICAgICAgICAgICAgaW50IGZkID0gbW1faWRwLT51Lm1tX2ZkOworICAgICAgICAgICAgICAgIG1hcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTU1BUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51CQk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5tbWFwCT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuYWRkcgk9IHZpcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbgk9IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvdAk9IHByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZsYWdzCT0gTUFQX1NIQVJFRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mZAk9IHBoeXNfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldD0gb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfSB9ICk7CisgICAgICAgICAgICAgICAgbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZtYXAsIHNpemVvZihtYXApKTsKKyAgICAgICAgICAgICAgICBpZihuICE9IHNpemVvZihtYXApKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJtYXAgOiAvcHJvYy9tbSBtYXAgZmFpbGVkLCBlcnIgPSAlZFxuIiwgLW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxvbmcgcmVzOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyB2aXJ0LCBsZW4sIHByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQgfCBNQVBfRklYRUQsIHBoeXNfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NQVBfT0ZGU0VUKG9mZnNldCkgfTsKKworICAgICAgICAgICAgICAgIHJlcyA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBTVFVCX01NQVBfTlIsIGFyZ3MpOworICAgICAgICAgICAgICAgIGlmKCh2b2lkICopIHJlcyA9PSBNQVBfRkFJTEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJtbWFwIHN0dWIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBwcm90ZWN0KGludCBmZCwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHIsIGludCB3LCAKLQkgICAgaW50IHgsIGludCBtdXN0X3N1Y2NlZWQpCitpbnQgdW5tYXAoc3RydWN0IG1tX2lkICptbV9pZHAsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCXN0cnVjdCBwcm9jX21tX29wIHByb3RlY3Q7Ci0JaW50IHByb3QsIG47CisgICAgICAgIGludCBuOwogCi0JcHJvdCA9IChyID8gUFJPVF9SRUFEIDogMCkgfCAodyA/IFBST1RfV1JJVEUgOiAwKSB8IAotCQkoeCA/IFBST1RfRVhFQyA6IDApOworICAgICAgICBpZihwcm9jX21tKXsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcHJvY19tbV9vcCB1bm1hcDsKKyAgICAgICAgICAgICAgICBpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7CisgICAgICAgICAgICAgICAgdW5tYXAgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01VTk1BUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnUJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5tdW5tYXAJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmFkZHIJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubGVuCQk9IGxlbiB9IH0gfSApOworICAgICAgICAgICAgICAgIG4gPSBvc193cml0ZV9maWxlKGZkLCAmdW5tYXAsIHNpemVvZih1bm1hcCkpOworICAgICAgICAgICAgICAgIGlmKG4gIT0gc2l6ZW9mKHVubWFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYobiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYobiA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigtRUlPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgKHVuc2lnbmVkIGxvbmcpIGFkZHIsIGxlbiwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9OwogCi0JcHJvdGVjdCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wIAk9IE1NX01QUk9URUNULAotCQkJCSAgICAgICAudSAJPSAKLQkJCQkgICAgICAgeyAubXByb3RlY3QJPSAKLQkJCQkJIHsgLmFkZHIgCT0gKHVuc2lnbmVkIGxvbmcpIGFkZHIsCi0JCQkJCSAgIC5sZW4JCT0gbGVuLAotCQkJCQkgICAucHJvdAk9IHByb3QgfSB9IH0gKTsKKyAgICAgICAgICAgICAgICByZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tdW5tYXAsIGFyZ3MpOworICAgICAgICAgICAgICAgIGlmKHJlcyA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIm11bm1hcCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwgcmVzKTsKKyAgICAgICAgfQogCi0JbiA9IG9zX3dyaXRlX2ZpbGUoZmQsICZwcm90ZWN0LCBzaXplb2YocHJvdGVjdCkpOwotCWlmKG4gIT0gc2l6ZW9mKHByb3RlY3QpKSB7Ci0JCWlmKG4gPT0gMCkgcmV0dXJuKDApOworICAgICAgICByZXR1cm4oMCk7Cit9CiAKLQkJaWYobXVzdF9zdWNjZWVkKQotCQkJcGFuaWMoInByb3RlY3QgZmFpbGVkLCBlcnIgPSAlZCIsIC1uKTsKK2ludCBwcm90ZWN0KHN0cnVjdCBtbV9pZCAqbW1faWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAorCSAgICBpbnQgciwgaW50IHcsIGludCB4KQoreworICAgICAgICBzdHJ1Y3QgcHJvY19tbV9vcCBwcm90ZWN0OworICAgICAgICBpbnQgcHJvdCwgbjsKIAotCQlyZXR1cm4oLUVJTyk7Ci0JfQorICAgICAgICBwcm90ID0gKHIgPyBQUk9UX1JFQUQgOiAwKSB8ICh3ID8gUFJPVF9XUklURSA6IDApIHwKKyAgICAgICAgICAgICAgICAoeCA/IFBST1RfRVhFQyA6IDApOwogCi0JcmV0dXJuKDApOworICAgICAgICBpZihwcm9jX21tKXsKKyAgICAgICAgICAgICAgICBpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7CisgICAgICAgICAgICAgICAgcHJvdGVjdCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTVBST1RFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnUJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm1wcm90ZWN0CT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmFkZHIJPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbgk9IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3QJPSBwcm90IH0gfSB9ICk7CisKKyAgICAgICAgICAgICAgICBuID0gb3Nfd3JpdGVfZmlsZShmZCwgJnByb3RlY3QsIHNpemVvZihwcm90ZWN0KSk7CisgICAgICAgICAgICAgICAgaWYobiAhPSBzaXplb2YocHJvdGVjdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYygicHJvdGVjdCBmYWlsZWQsIGVyciA9ICVkIiwgLW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7IGFkZHIsIGxlbiwgcHJvdCwgMCwgMCwgMCB9OworCisgICAgICAgICAgICAgICAgcmVzID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIF9fTlJfbXByb3RlY3QsIGFyZ3MpOworICAgICAgICAgICAgICAgIGlmKHJlcyA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYygibXByb3RlY3Qgc3R1YiBmYWlsZWQsIGVycm5vID0gJWRcbiIsIHJlcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4oMCk7CiB9CiAKIHZvaWQgYmVmb3JlX21lbV9za2FzKHVuc2lnbmVkIGxvbmcgdW51c2VkKQogewogfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKaW5kZXggNmNiOWE2ZC4uZDIzMmRhYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCkBAIC0zLDQ2ICszLDE0MyBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKKyNpbmNsdWRlICJsaW51eC9jb25maWcuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgogI2luY2x1ZGUgImxpbnV4L2xpc3QuaCIKICNpbmNsdWRlICJsaW51eC9zcGlubG9jay5oIgogI2luY2x1ZGUgImxpbnV4L3NsYWIuaCIKKyNpbmNsdWRlICJsaW51eC9lcnJuby5oIgorI2luY2x1ZGUgImxpbnV4L21tLmgiCiAjaW5jbHVkZSAiYXNtL2N1cnJlbnQuaCIKICNpbmNsdWRlICJhc20vc2VnbWVudC5oIgogI2luY2x1ZGUgImFzbS9tbXUuaCIKKyNpbmNsdWRlICJhc20vcGdhbGxvYy5oIgorI2luY2x1ZGUgImFzbS9wZ3RhYmxlLmgiCiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJza2FzLmgiCiAKK2V4dGVybiBpbnQgX19zeXNjYWxsX3N0dWJfc3RhcnQ7CisKK3N0YXRpYyBpbnQgaW5pdF9zdHViX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwcm9jLAorCQkJIHVuc2lnbmVkIGxvbmcga2VybmVsKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisKKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXBnZCA9IHBnZF9vZmZzZXQobW0sIHByb2MpOworCXB1ZCA9IHB1ZF9hbGxvYyhtbSwgcGdkLCBwcm9jKTsKKwlpZiAoIXB1ZCkKKwkJZ290byBvdXQ7CisKKwlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgcHJvYyk7CisJaWYgKCFwbWQpCisJCWdvdG8gb3V0X3BtZDsKKworCXB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgcHJvYyk7CisJaWYgKCFwdGUpCisJCWdvdG8gb3V0X3B0ZTsKKworCS8qIFRoZXJlJ3MgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgc2thczAgc3R1YiBwYWdlcywgc3RhY2sKKwkgKiByYW5kb21pemF0aW9uLCBhbmQgdGhlIEJVRyBhdCB0aGUgZW5kIG9mIGV4aXRfbW1hcC4gIGV4aXRfbW1hcAorICAgICAgICAgKiBjaGVja3MgdGhhdCB0aGUgbnVtYmVyIG9mIHBhZ2UgdGFibGVzIGZyZWVkIGlzIHRoZSBzYW1lIGFzIGhhZAorICAgICAgICAgKiBiZWVuIGFsbG9jYXRlZC4gIElmIHRoZSBzdGFjayBpcyBvbiB0aGUgbGFzdCBwYWdlIHRhYmxlIHBhZ2UsCisJICogdGhlbiB0aGUgc3RhY2sgcHRlIHBhZ2Ugd2lsbCBiZSBmcmVlZCwgYW5kIGlmIG5vdCwgaXQgd29uJ3QuICBUbworCSAqIGF2b2lkIGhhdmluZyB0byBrbm93IHdoZXJlIHRoZSBzdGFjayBpcywgb3IgaWYgdGhlIHByb2Nlc3MgbWFwcGVkCisJICogc29tZXRoaW5nIGF0IHRoZSB0b3Agb2YgaXRzIGFkZHJlc3Mgc3BhY2UgZm9yIHNvbWUgb3RoZXIgcmVhc29uLAorCSAqIHdlIHNldCBUQVNLX1NJWkUgdG8gZW5kIGF0IHRoZSBzdGFydCBvZiB0aGUgbGFzdCBwYWdlIHRhYmxlLgorCSAqIFRoaXMga2VlcHMgZXhpdF9tbWFwIG9mZiB0aGUgbGFzdCBwYWdlLCBidXQgaW50cm9kdWNlcyBhIGxlYWsKKwkgKiBvZiB0aGF0IHBhZ2UuICBTbywgd2UgaGFuZyBvbnRvIGl0IGhlcmUgYW5kIGZyZWUgaXQgaW4KKwkgKiBkZXN0cm95X2NvbnRleHRfc2thcy4KKwkgKi8KKworICAgICAgICBtbS0+Y29udGV4dC5za2FzLmxhc3RfcGFnZV90YWJsZSA9IHBtZF9wYWdlX2tlcm5lbCgqcG1kKTsKKworCSpwdGUgPSBta19wdGUodmlydF90b19wYWdlKGtlcm5lbCksIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQpKTsKKwkqcHRlID0gcHRlX21rZXhlYygqcHRlKTsKKwkqcHRlID0gcHRlX3dycHJvdGVjdCgqcHRlKTsKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcmV0dXJuKDApOworCisgb3V0X3BtZDoKKwlwdWRfZnJlZShwdWQpOworIG91dF9wdGU6CisJcG1kX2ZyZWUocG1kKTsKKyBvdXQ6CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXJldHVybigtRU5PTUVNKTsKK30KKwogaW50IGluaXRfbmV3X2NvbnRleHRfc2thcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCWludCBmcm9tOworCXN0cnVjdCBtbV9zdHJ1Y3QgKmN1cl9tbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBtbV9pZCAqY3VyX21tX2lkID0gJmN1cl9tbS0+Y29udGV4dC5za2FzLmlkOworCXN0cnVjdCBtbV9pZCAqbW1faWQgPSAmbW0tPmNvbnRleHQuc2thcy5pZDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrOworCWludCBmcm9tLCByZXQ7CiAKLQlpZigoY3VycmVudC0+bW0gIT0gTlVMTCkgJiYgKGN1cnJlbnQtPm1tICE9ICZpbml0X21tKSkKLQkJZnJvbSA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnNrYXMubW1fZmQ7Ci0JZWxzZSBmcm9tID0gLTE7CisJaWYocHJvY19tbSl7CisJCWlmKChjdXJfbW0gIT0gTlVMTCkgJiYgKGN1cl9tbSAhPSAmaW5pdF9tbSkpCisJCQlmcm9tID0gY3VyX21tLT5jb250ZXh0LnNrYXMuaWQudS5tbV9mZDsKKwkJZWxzZSBmcm9tID0gLTE7CiAKLQltbS0+Y29udGV4dC5za2FzLm1tX2ZkID0gbmV3X21tKGZyb20pOwotCWlmKG1tLT5jb250ZXh0LnNrYXMubW1fZmQgPCAwKXsKLQkJcHJpbnRrKCJpbml0X25ld19jb250ZXh0X3NrYXMgLSBuZXdfbW0gZmFpbGVkLCBlcnJubyA9ICVkXG4iLAotCQkgICAgICAgbW0tPmNvbnRleHQuc2thcy5tbV9mZCk7Ci0JCXJldHVybihtbS0+Y29udGV4dC5za2FzLm1tX2ZkKTsKKwkJcmV0ID0gbmV3X21tKGZyb20pOworCQlpZihyZXQgPCAwKXsKKwkJCXByaW50aygiaW5pdF9uZXdfY29udGV4dF9za2FzIC0gbmV3X21tIGZhaWxlZCwgIgorCQkJICAgICAgICJlcnJubyA9ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltbV9pZC0+dS5tbV9mZCA9IHJldDsKKwl9CisJZWxzZSB7CisJCS8qIFRoaXMgemVyb3MgdGhlIGVudHJ5IHRoYXQgcGdkX2FsbG9jIGRpZG4ndCwgbmVlZGVkIHNpbmNlCisJCSAqIHdlIGFyZSBhYm91dCB0byByZWluaXRpYWxpemUgaXQsIGFuZCB3YW50IG1tLm5yX3B0ZXMgdG8KKwkJICogYmUgYWNjdXJhdGUuCisJCSAqLworCQltbS0+cGdkW1VTRVJfUFRSU19QRVJfUEdEXSA9IF9fcGdkKDApOworCisJCXJldCA9IGluaXRfc3R1Yl9wdGUobW0sIENPTkZJR19TVFVCX0NPREUsCisJCQkJICAgICh1bnNpZ25lZCBsb25nKSAmX19zeXNjYWxsX3N0dWJfc3RhcnQpOworCQlpZihyZXQpCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSAtRU5PTUVNOworCQlzdGFjayA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYoc3RhY2sgPT0gMCkKKwkJCWdvdG8gb3V0OworCQltbV9pZC0+c3RhY2sgPSBzdGFjazsKKworCQlyZXQgPSBpbml0X3N0dWJfcHRlKG1tLCBDT05GSUdfU1RVQl9EQVRBLCBzdGFjayk7CisJCWlmKHJldCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJbW0tPm5yX3B0ZXMtLTsKKworCQlpZigoY3VyX21tICE9IE5VTEwpICYmIChjdXJfbW0gIT0gJmluaXRfbW0pKQorCQkJbW1faWQtPnUucGlkID0gY29weV9jb250ZXh0X3NrYXMwKHN0YWNrLAorCQkJCQkJCSAgY3VyX21tX2lkLT51LnBpZCk7CisJCWVsc2UgbW1faWQtPnUucGlkID0gc3RhcnRfdXNlcnNwYWNlKHN0YWNrKTsKIAl9CiAKLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZToKKwlmcmVlX3BhZ2UobW1faWQtPnN0YWNrKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBkZXN0cm95X2NvbnRleHRfc2thcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlvc19jbG9zZV9maWxlKG1tLT5jb250ZXh0LnNrYXMubW1fZmQpOwotfQorCXN0cnVjdCBtbXVfY29udGV4dF9za2FzICptbXUgPSAmbW0tPmNvbnRleHQuc2thczsKIAotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KKwlpZihwcm9jX21tKQorCQlvc19jbG9zZV9maWxlKG1tdS0+aWQudS5tbV9mZCk7CisJZWxzZSB7CisJCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKG1tdS0+aWQudS5waWQsIDEpOworCQlmcmVlX3BhZ2UobW11LT5pZC5zdGFjayk7CisJCWZyZWVfcGFnZShtbXUtPmxhc3RfcGFnZV90YWJsZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYwppbmRleCA3NzNjZDJiLi5iYTY3MWRhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIAotICogQ29weXJpZ2h0IChDKSAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMi0gMjAwNCBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKQEAgLTEzLDcgKzEzLDkgQEAKICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3VzZXIuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAicHRyYWNlX3VzZXIuaCIKICNpbmNsdWRlICJ0aW1lX3VzZXIuaCIKQEAgLTIxLDEzICsyMywxOCBAQAogI2luY2x1ZGUgInVzZXJfdXRpbC5oIgogI2luY2x1ZGUgImtlcm5fdXRpbC5oIgogI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJzdHViLWRhdGEuaCIKKyNpbmNsdWRlICJtbV9pZC5oIgogI2luY2x1ZGUgInN5c2RlcC9zaWdjb250ZXh0LmgiCisjaW5jbHVkZSAic3lzZGVwL3N0dWIuaCIKICNpbmNsdWRlICJvcy5oIgogI2luY2x1ZGUgInByb2NfbW0uaCIKICNpbmNsdWRlICJza2FzX3B0cmFjZS5oIgogI2luY2x1ZGUgImNoYW5fdXNlci5oIgogI2luY2x1ZGUgInNpZ25hbF91c2VyLmgiCiAjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAidW1sLWNvbmZpZy5oIgogI2luY2x1ZGUgInByb2Nlc3MuaCIKIAogaW50IGlzX3NrYXNfd2luY2goaW50IHBpZCwgaW50IGZkLCB2b2lkICpkYXRhKQpAQCAtMzksMjAgKzQ2LDU1IEBACiAJcmV0dXJuKDEpOwogfQogCit2b2lkIHdhaXRfc3R1Yl9kb25lKGludCBwaWQsIGludCBzaWcsIGNoYXIgKiBmbmFtZSkKK3sKKyAgICAgICAgaW50IG4sIHN0YXR1cywgZXJyOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoIHNpZyAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IHB0cmFjZShQVFJBQ0VfQ09OVCwgcGlkLCAwLCBzaWcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYygiJXMgOiBjb250aW51ZSBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBlcnJubyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpZyA9IDA7CisKKyAgICAgICAgICAgICAgICBDQVRDSF9FSU5UUihuID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIFdVTlRSQUNFRCkpOworICAgICAgICB9IHdoaWxlKChuID49IDApICYmIFdJRlNUT1BQRUQoc3RhdHVzKSAmJgorICAgICAgICAgICAgICAgIChXU1RPUFNJRyhzdGF0dXMpID09IFNJR1ZUQUxSTSkpOworCisgICAgICAgIGlmKChuIDwgMCkgfHwgIVdJRlNUT1BQRUQoc3RhdHVzKSB8fAorICAgICAgICAgICAoV1NUT1BTSUcoc3RhdHVzKSAhPSBTSUdVU1IxICYmIFdTVE9QU0lHKHN0YXR1cyAhPSBTSUdUUkFQKSkpeworICAgICAgICAgICAgICAgIHBhbmljKCIlcyA6IGZhaWxlZCB0byB3YWl0IGZvciBTSUdVU1IxL1NJR1RSQVAsICIKKyAgICAgICAgICAgICAgICAgICAgICAicGlkID0gJWQsIG4gPSAlZCwgZXJybm8gPSAlZCwgc3RhdHVzID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgcGlkLCBuLCBlcnJubywgc3RhdHVzKTsKKyAgICAgICAgfQorfQorCiB2b2lkIGdldF9za2FzX2ZhdWx0aW5mbyhpbnQgcGlkLCBzdHJ1Y3QgZmF1bHRpbmZvICogZmkpCiB7Ci0JaW50IGVycjsKKyAgICAgICAgaW50IGVycjsKIAotICAgICAgICBlcnIgPSBwdHJhY2UoUFRSQUNFX0ZBVUxUSU5GTywgcGlkLCAwLCBmaSk7Ci0JaWYoZXJyKQotICAgICAgICAgICAgICAgIHBhbmljKCJnZXRfc2thc19mYXVsdGluZm8gLSBQVFJBQ0VfRkFVTFRJTkZPIGZhaWxlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisgICAgICAgIGlmKHB0cmFjZV9mYXVsdGluZm8peworICAgICAgICAgICAgICAgIGVyciA9IHB0cmFjZShQVFJBQ0VfRkFVTFRJTkZPLCBwaWQsIDAsIGZpKTsKKyAgICAgICAgICAgICAgICBpZihlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYygiZ2V0X3NrYXNfZmF1bHRpbmZvIC0gUFRSQUNFX0ZBVUxUSU5GTyBmYWlsZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CiAKLSAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaTM4Niwgd2hpY2ggaGFzIGRpZmZlcmVudCBzdHJ1Y3RzICovCi0gICAgICAgIGlmIChzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pIDwgc2l6ZW9mKHN0cnVjdCBmYXVsdGluZm8pKQotICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKWZpICsgc2l6ZW9mKHN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBmYXVsdGluZm8pIC0KLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvKSk7CisgICAgICAgICAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaTM4Niwgd2hpY2ggaGFzIGRpZmZlcmVudCBzdHJ1Y3RzICovCisgICAgICAgICAgICAgICAgaWYgKHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykgPCBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykpCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKGNoYXIgKilmaSArIHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBmYXVsdGluZm8pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB3YWl0X3N0dWJfZG9uZShwaWQsIFNJR1NFR1YsICJnZXRfc2thc19mYXVsdGluZm8iKTsKKworICAgICAgICAgICAgICAgIC8qIGZhdWx0aW5mbyBpcyBwcmVwYXJlZCBieSB0aGUgc3R1Yi1zZWd2LWhhbmRsZXIgYXQgc3RhcnQgb2YKKyAgICAgICAgICAgICAgICAgKiB0aGUgc3R1YiBzdGFjayBwYWdlLiBXZSBqdXN0IGhhdmUgdG8gY29weSBpdC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtZW1jcHkoZmksICh2b2lkICopY3VycmVudF9zdHViX3N0YWNrKCksIHNpemVvZigqZmkpKTsKKyAgICAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVfc2VndihpbnQgcGlkLCB1bmlvbiB1bWxfcHRfcmVncyAqIHJlZ3MpCkBAIC05MSwxMSArMTMzLDU2IEBACiAJaGFuZGxlX3N5c2NhbGwocmVncyk7CiB9CiAKLXN0YXRpYyBpbnQgdXNlcnNwYWNlX3RyYW1wKHZvaWQgKmFyZykKK2V4dGVybiBpbnQgX19zeXNjYWxsX3N0dWJfc3RhcnQ7CisKK3N0YXRpYyBpbnQgdXNlcnNwYWNlX3RyYW1wKHZvaWQgKnN0YWNrKQogewotCWluaXRfbmV3X3RocmVhZF9zaWduYWxzKDApOwotCWVuYWJsZV90aW1lcigpOworCXZvaWQgKmFkZHI7CisKIAlwdHJhY2UoUFRSQUNFX1RSQUNFTUUsIDAsIDAsIDApOworCisJaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHMoMSk7CisJZW5hYmxlX3RpbWVyKCk7CisKKwlpZighcHJvY19tbSl7CisJCS8qIFRoaXMgaGFzIGEgcHRlLCBidXQgaXQgY2FuJ3QgYmUgbWFwcGVkIGluIHdpdGggdGhlIHVzdWFsCisJCSAqIHRsYl9mbHVzaCBtZWNoYW5pc20gYmVjYXVzZSB0aGlzIGlzIHBhcnQgb2YgdGhhdCBtZWNoYW5pc20KKwkJICovCisJCWludCBmZDsKKwkJX191NjQgb2Zmc2V0OworCisJCWZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSwgJm9mZnNldCk7CisJCWFkZHIgPSBtbWFwNjQoKHZvaWQgKikgVU1MX0NPTkZJR19TVFVCX0NPREUsIHBhZ2Vfc2l6ZSgpLAorCQkJICAgICAgUFJPVF9FWEVDLCBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmQsIG9mZnNldCk7CisJCWlmKGFkZHIgPT0gTUFQX0ZBSUxFRCl7CisJCQlwcmludGsoIm1hcHBpbmcgbW1hcCBzdHViIGZhaWxlZCwgZXJybm8gPSAlZFxuIiwKKwkJCSAgICAgICBlcnJubyk7CisJCQlleGl0KDEpOworCQl9CisKKwkJaWYoc3RhY2sgIT0gTlVMTCl7CisJCQlmZCA9IHBoeXNfbWFwcGluZyh0b19waHlzKHN0YWNrKSwgJm9mZnNldCk7CisJCQlhZGRyID0gbW1hcCgodm9pZCAqKSBVTUxfQ09ORklHX1NUVUJfREFUQSwgcGFnZV9zaXplKCksCisJCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCQkJICAgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkLCBvZmZzZXQpOworCQkJaWYoYWRkciA9PSBNQVBfRkFJTEVEKXsKKwkJCQlwcmludGsoIm1hcHBpbmcgc2VnZmF1bHQgc3RhY2sgZmFpbGVkLCAiCisJCQkJICAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCX0KKwlpZighcHRyYWNlX2ZhdWx0aW5mbyAmJiAoc3RhY2sgIT0gTlVMTCkpeworCQl1bnNpZ25lZCBsb25nIHYgPSBVTUxfQ09ORklHX1NUVUJfQ09ERSArCisJCQkJICAodW5zaWduZWQgbG9uZykgc3R1Yl9zZWd2X2hhbmRsZXIgLQorCQkJCSAgKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydDsKKworCQlzZXRfc2lnc3RhY2soKHZvaWQgKikgVU1MX0NPTkZJR19TVFVCX0RBVEEsIHBhZ2Vfc2l6ZSgpKTsKKwkJc2V0X2hhbmRsZXIoU0lHU0VHViwgKHZvaWQgKikgdiwgU0FfT05TVEFDSywKKwkJCSAgICBTSUdJTywgU0lHV0lOQ0gsIFNJR0FMUk0sIFNJR1ZUQUxSTSwKKwkJCSAgICBTSUdVU1IxLCAtMSk7CisJfQorCiAJb3Nfc3RvcF9wcm9jZXNzKG9zX2dldHBpZCgpKTsKIAlyZXR1cm4oMCk7CiB9CkBAIC0xMDUsMTEgKzE5MiwxMSBAQAogI2RlZmluZSBOUl9DUFVTIDEKIGludCB1c2Vyc3BhY2VfcGlkW05SX0NQVVNdOwogCi12b2lkIHN0YXJ0X3VzZXJzcGFjZShpbnQgY3B1KQoraW50IHN0YXJ0X3VzZXJzcGFjZSh1bnNpZ25lZCBsb25nIHN0dWJfc3RhY2spCiB7CiAJdm9pZCAqc3RhY2s7CiAJdW5zaWduZWQgbG9uZyBzcDsKLQlpbnQgcGlkLCBzdGF0dXMsIG47CisJaW50IHBpZCwgc3RhdHVzLCBuLCBmbGFnczsKIAogCXN0YWNrID0gbW1hcChOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCiAJCSAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CkBAIC0xMTcsOCArMjA0LDkgQEAKIAkJcGFuaWMoInN0YXJ0X3VzZXJzcGFjZSA6IG1tYXAgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwogCXNwID0gKHVuc2lnbmVkIGxvbmcpIHN0YWNrICsgUEFHRV9TSVpFIC0gc2l6ZW9mKHZvaWQgKik7CiAKLQlwaWQgPSBjbG9uZSh1c2Vyc3BhY2VfdHJhbXAsICh2b2lkICopIHNwLCAKLQkJICAgIENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0gfCBTSUdDSExELCBOVUxMKTsKKwlmbGFncyA9IENMT05FX0ZJTEVTIHwgU0lHQ0hMRDsKKwlpZihwcm9jX21tKSBmbGFncyB8PSBDTE9ORV9WTTsKKwlwaWQgPSBjbG9uZSh1c2Vyc3BhY2VfdHJhbXAsICh2b2lkICopIHNwLCBmbGFncywgKHZvaWQgKikgc3R1Yl9zdGFjayk7CiAJaWYocGlkIDwgMCkKIAkJcGFuaWMoInN0YXJ0X3VzZXJzcGFjZSA6IGNsb25lIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKIApAQCAtMTQwLDcgKzIyOCw3IEBACiAJaWYobXVubWFwKHN0YWNrLCBQQUdFX1NJWkUpIDwgMCkKIAkJcGFuaWMoInN0YXJ0X3VzZXJzcGFjZSA6IG11bm1hcCBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycm5vKTsKIAotCXVzZXJzcGFjZV9waWRbY3B1XSA9IHBpZDsKKwlyZXR1cm4ocGlkKTsKIH0KIAogdm9pZCB1c2Vyc3BhY2UodW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpCkBAIC0xNzQsNyArMjYyLDkgQEAKIAkJaWYoV0lGU1RPUFBFRChzdGF0dXMpKXsKIAkJICAJc3dpdGNoKFdTVE9QU0lHKHN0YXR1cykpewogCQkJY2FzZSBTSUdTRUdWOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfc2VndihwaWQsIHJlZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihQVFJBQ0VfRlVMTF9GQVVMVElORk8gfHwgIXB0cmFjZV9mYXVsdGluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9zaWduYWwoU0lHU0VHViwgcmVncywgcGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBoYW5kbGVfc2VndihwaWQsIHJlZ3MpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBTSUdUUkFQICsgMHg4MDoKIAkJCSAgICAgICAgaGFuZGxlX3RyYXAocGlkLCByZWdzLCBsb2NhbF91c2luZ19zeXNlbXUpOwpAQCAtMTk0LDYgKzI4NCw3IEBACiAJCQkgICAgICAgIHByaW50aygidXNlcnNwYWNlIC0gY2hpbGQgc3RvcHBlZCB3aXRoIHNpZ25hbCAiCiAJCQkJICAgICAgICIlZFxuIiwgV1NUT1BTSUcoc3RhdHVzKSk7CiAJCQl9CisJCQlwaWQgPSB1c2Vyc3BhY2VfcGlkWzBdOwogCQkJaW50ZXJydXB0X2VuZCgpOwogCiAJCQkvKiBBdm9pZCAtRVJFU1RBUlRTWVMgaGFuZGxpbmcgaW4gaG9zdCAqLwpAQCAtMjA3LDYgKzI5OCw2NyBAQAogI2RlZmluZSBJTklUX0pNUF9IQUxUIDMKICNkZWZpbmUgSU5JVF9KTVBfUkVCT09UIDQKIAorCitpbnQgY29weV9jb250ZXh0X3NrYXMwKHVuc2lnbmVkIGxvbmcgbmV3X3N0YWNrLCBpbnQgcGlkKQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyByZWdzW01BWF9SRUdfTlJdOworCXVuc2lnbmVkIGxvbmcgY3VycmVudF9zdGFjayA9IGN1cnJlbnRfc3R1Yl9zdGFjaygpOworCXN0cnVjdCBzdHViX2RhdGEgKmRhdGEgPSAoc3RydWN0IHN0dWJfZGF0YSAqKSBjdXJyZW50X3N0YWNrOworCXN0cnVjdCBzdHViX2RhdGEgKmNoaWxkX2RhdGEgPSAoc3RydWN0IHN0dWJfZGF0YSAqKSBuZXdfc3RhY2s7CisJX191NjQgbmV3X29mZnNldDsKKwlpbnQgbmV3X2ZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoKHZvaWQgKiluZXdfc3RhY2spLCAmbmV3X29mZnNldCk7CisKKwkvKiBwcmVwYXJlIG9mZnNldCBhbmQgZmQgb2YgY2hpbGQncyBzdGFjayBhcyBhcmd1bWVudCBmb3IgcGFyZW50J3MKKwkgKiBhbmQgY2hpbGQncyBtbWFwMiBjYWxscworCSAqLworCSpkYXRhID0gKChzdHJ1Y3Qgc3R1Yl9kYXRhKSB7IC5vZmZzZXQJPSBNTUFQX09GRlNFVChuZXdfb2Zmc2V0KSwKKwkJCQkgICAgICAuZmQJPSBuZXdfZmQsCisJCQkJICAgICAgLnRpbWVyCT0gKChzdHJ1Y3QgaXRpbWVydmFsKQorCQkJCQkgICAgICAgICAgIHsgeyAwLCAxMDAwMDAwIC8gaHooKSB9LAorCQkJCQkJICAgICB7IDAsIDEwMDAwMDAgLyBoeigpIH19KX0pOworCWdldF9zYWZlX3JlZ2lzdGVycyhyZWdzKTsKKworCS8qIFNldCBwYXJlbnQncyBpbnN0cnVjdGlvbiBwb2ludGVyIHRvIHN0YXJ0IG9mIGNsb25lLXN0dWIgKi8KKwlyZWdzW1JFR1NfSVBfSU5ERVhdID0gVU1MX0NPTkZJR19TVFVCX0NPREUgKworCQkJCSh1bnNpZ25lZCBsb25nKSBzdHViX2Nsb25lX2hhbmRsZXIgLQorCQkJCSh1bnNpZ25lZCBsb25nKSAmX19zeXNjYWxsX3N0dWJfc3RhcnQ7CisJcmVnc1tSRUdTX1NQX0lOREVYXSA9IFVNTF9DT05GSUdfU1RVQl9EQVRBICsgUEFHRV9TSVpFIC0KKwkJc2l6ZW9mKHZvaWQgKik7CisJZXJyID0gcHRyYWNlX3NldHJlZ3MocGlkLCByZWdzKTsKKwlpZihlcnIgPCAwKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIDogUFRSQUNFX1NFVFJFR1MgZmFpbGVkLCAiCisJCSAgICAgICJwaWQgPSAlZCwgZXJybm8gPSAlZFxuIiwgcGlkLCBlcnJubyk7CisKKwkvKiBzZXQgYSB3ZWxsIGtub3duIHJldHVybiBjb2RlIGZvciBkZXRlY3Rpb24gb2YgY2hpbGQgd3JpdGUgZmFpbHVyZSAqLworCWNoaWxkX2RhdGEtPmVyciA9IDEyMzQ1Njc4OworCisJLyogV2FpdCwgdW50aWwgcGFyZW50IGhhcyBmaW5pc2hlZCBpdHMgd29yazogcmVhZCBjaGlsZCdzIHBpZCBmcm9tCisJICogcGFyZW50J3Mgc3RhY2ssIGFuZCBjaGVjaywgaWYgYmFkIHJlc3VsdC4KKwkgKi8KKwl3YWl0X3N0dWJfZG9uZShwaWQsIDAsICJjb3B5X2NvbnRleHRfc2thczAiKTsKKworCXBpZCA9IGRhdGEtPmVycjsKKwlpZihwaWQgPCAwKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIC0gc3R1Yi1wYXJlbnQgcmVwb3J0cyBlcnJvciAlZFxuIiwKKwkJICAgICAgcGlkKTsKKworCS8qIFdhaXQsIHVudGlsIGNoaWxkIGhhcyBmaW5pc2hlZCB0b286IHJlYWQgY2hpbGQncyByZXN1bHQgZnJvbQorCSAqIGNoaWxkJ3Mgc3RhY2sgYW5kIGNoZWNrIGl0LgorCSAqLworCXdhaXRfc3R1Yl9kb25lKHBpZCwgLTEsICJjb3B5X2NvbnRleHRfc2thczAiKTsKKwlpZiAoY2hpbGRfZGF0YS0+ZXJyICE9IFVNTF9DT05GSUdfU1RVQl9EQVRBKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIC0gc3R1Yi1jaGlsZCByZXBvcnRzIGVycm9yICVkXG4iLAorCQkgICAgICBjaGlsZF9kYXRhLT5lcnIpOworCisJaWYgKHB0cmFjZShQVFJBQ0VfT0xEU0VUT1BUSU9OUywgcGlkLCBOVUxMLAorCQkgICAodm9pZCAqKVBUUkFDRV9PX1RSQUNFU1lTR09PRCkgPCAwKQorCQlwYW5pYygiY29weV9jb250ZXh0X3NrYXMwIDogUFRSQUNFX1NFVE9QVElPTlMgZmFpbGVkLCAiCisJCSAgICAgICJlcnJubyA9ICVkXG4iLCBlcnJubyk7CisKKwlyZXR1cm4gcGlkOworfQorCiB2b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIHZvaWQgKipzd2l0Y2hfYnVmX3B0ciwgdm9pZCAqKmZvcmtfYnVmX3B0ciwKIAkJdm9pZCAoKmhhbmRsZXIpKGludCkpCiB7CkBAIC0zMzQsMjEgKzQ4NiwxOSBAQAogCXNpZ2xvbmdqbXAoaW5pdGlhbF9qbXBidWYsIElOSVRfSk1QX1JFQk9PVCk7CiB9CiAKLXZvaWQgc3dpdGNoX21tX3NrYXMoaW50IG1tX2ZkKQordm9pZCBzd2l0Y2hfbW1fc2thcyhzdHJ1Y3QgbW1faWQgKm1tX2lkcCkKIHsKIAlpbnQgZXJyOwogCiAjd2FybmluZyBuZWVkIGNwdSBwaWQgaW4gc3dpdGNoX21tX3NrYXMKLQllcnIgPSBwdHJhY2UoUFRSQUNFX1NXSVRDSF9NTSwgdXNlcnNwYWNlX3BpZFswXSwgMCwgbW1fZmQpOwotCWlmKGVycikKLQkJcGFuaWMoInN3aXRjaF9tbV9za2FzIC0gUFRSQUNFX1NXSVRDSF9NTSBmYWlsZWQsIGVycm5vID0gJWRcbiIsCi0JCSAgICAgIGVycm5vKTsKLX0KLQotdm9pZCBraWxsX29mZl9wcm9jZXNzZXNfc2thcyh2b2lkKQotewotI3dhcm5pbmcgbmVlZCB0byBsb29wIG92ZXIgdXNlcnNwYWNlX3BpZHMgaW4ga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXMKLQlvc19raWxsX3B0cmFjZWRfcHJvY2Vzcyh1c2Vyc3BhY2VfcGlkWzBdLCAxKTsKKwlpZihwcm9jX21tKXsKKwkJZXJyID0gcHRyYWNlKFBUUkFDRV9TV0lUQ0hfTU0sIHVzZXJzcGFjZV9waWRbMF0sIDAsCisJCQkgICAgIG1tX2lkcC0+dS5tbV9mZCk7CisJCWlmKGVycikKKwkJCXBhbmljKCJzd2l0Y2hfbW1fc2thcyAtIFBUUkFDRV9TV0lUQ0hfTU0gZmFpbGVkLCAiCisJCQkgICAgICAiZXJybm8gPSAlZFxuIiwgZXJybm8pOworCX0KKwllbHNlIHVzZXJzcGFjZV9waWRbMF0gPSBtbV9pZHAtPnUucGlkOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKaW5kZXggZmM3MWVmMi4uY2JhYmFiMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCkBAIC0xMTEsOCArMTExLDcgQEAKICAgCXZvaWQgKCpoYW5kbGVyKShpbnQpOwogCiAJaWYoY3VycmVudC0+dGhyZWFkLmZvcmtpbmcpewotCSAgCW1lbWNweSgmcC0+dGhyZWFkLnJlZ3MucmVncy5za2FzLCAKLQkJICAgICAgICZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzLnNrYXMsIAorCSAgCW1lbWNweSgmcC0+dGhyZWFkLnJlZ3MucmVncy5za2FzLCAmcmVncy0+cmVncy5za2FzLAogCQkgICAgICAgc2l6ZW9mKHAtPnRocmVhZC5yZWdzLnJlZ3Muc2thcykpOwogCQlSRUdTX1NFVF9TWVNDQUxMX1JFVFVSTihwLT50aHJlYWQucmVncy5yZWdzLnNrYXMucmVncywgMCk7CiAJCWlmKHNwICE9IDApIFJFR1NfU1AocC0+dGhyZWFkLnJlZ3MucmVncy5za2FzLnJlZ3MpID0gc3A7CkBAIC0xNzYsMTIgKzE3NSwxNCBAQAogCXJldHVybigwKTsKIH0KIAorZXh0ZXJuIGludCB1c2Vyc3BhY2VfcGlkW107CisKIGludCBzdGFydF91bWxfc2thcyh2b2lkKQogewotCXN0YXJ0X3VzZXJzcGFjZSgwKTsKKwlpZihwcm9jX21tKQorCQl1c2Vyc3BhY2VfcGlkWzBdID0gc3RhcnRfdXNlcnNwYWNlKDApOwogCiAJaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHMoMSk7Ci0JdW1sX2lkbGVfdGltZXIoKTsKIAogCWluaXRfdGFzay50aHJlYWQucmVxdWVzdC51LnRocmVhZC5wcm9jID0gc3RhcnRfa2VybmVsX3Byb2M7CiAJaW5pdF90YXNrLnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLmFyZyA9IE5VTEw7CkBAIC0yMDIsMTMgKzIwMywzMCBAQAogCXJldHVybih1c2Vyc3BhY2VfcGlkWzBdKTsKIH0KIAotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KK3ZvaWQga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXModm9pZCkKK3sKKwlpZihwcm9jX21tKQorI3dhcm5pbmcgbmVlZCB0byBsb29wIG92ZXIgdXNlcnNwYWNlX3BpZHMgaW4ga2lsbF9vZmZfcHJvY2Vzc2VzX3NrYXMKKwkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3ModXNlcnNwYWNlX3BpZFswXSwgMSk7CisJZWxzZSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwkJaW50IHBpZCwgbWU7CisKKwkJbWUgPSBvc19nZXRwaWQoKTsKKwkJZm9yX2VhY2hfcHJvY2VzcyhwKXsKKwkJCWlmKHAtPm1tID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXBpZCA9IHAtPm1tLT5jb250ZXh0LnNrYXMuaWQudS5waWQ7CisJCQlvc19raWxsX3B0cmFjZWRfcHJvY2VzcyhwaWQsIDEpOworCQl9CisJfQorfQorCit1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3R1Yl9zdGFjayh2b2lkKQoreworCWlmKGN1cnJlbnQtPm1tID09IE5VTEwpCisJCXJldHVybigwKTsKKworCXJldHVybihjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkLnN0YWNrKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvdGltZS5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy90aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDkxNDkuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy90aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgInRpbWVfdXNlci5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0KLXZvaWQgdXNlcl90aW1lX2luaXRfc2thcyh2b2lkKQotewotICAgICAgICBpZihzaWduYWwoU0lHQUxSTSwgKF9fc2lnaGFuZGxlcl90KSBhbGFybV9oYW5kbGVyKSA9PSBTSUdfRVJSKQotICAgICAgICAgICAgICAgIHBhbmljKCJDb3VsZG4ndCBzZXQgU0lHQUxSTSBoYW5kbGVyIik7Ci0gCWlmKHNpZ25hbChTSUdWVEFMUk0sIChfX3NpZ2hhbmRsZXJfdCkgYWxhcm1faGFuZGxlcikgPT0gU0lHX0VSUikKLSAJCXBhbmljKCJDb3VsZG4ndCBzZXQgU0lHVlRBTFJNIGhhbmRsZXIiKTsKLQlzZXRfaW50ZXJ2YWwoSVRJTUVSX1ZJUlRVQUwpOwotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy90bGIuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMKaW5kZXggYjhjNWU3MTcuLjYyMzA5OTkgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvdGxiLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy90bGIuYwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgImxpbnV4L3N0ZGRlZi5oIgogI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCisjaW5jbHVkZSAibGludXgvY29uZmlnLmgiCiAjaW5jbHVkZSAibGludXgvbW0uaCIKICNpbmNsdWRlICJhc20vcGFnZS5oIgogI2luY2x1ZGUgImFzbS9wZ3RhYmxlLmgiCkBAIC0xNyw3ICsxOCw3IEBACiAjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJ0bGIuaCIKIAotc3RhdGljIHZvaWQgZG9fb3BzKGludCBmZCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGxhc3QpCitzdGF0aWMgdm9pZCBkb19vcHModW5pb24gbW1fY29udGV4dCAqbW11LCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgbGFzdCkKIHsKIAlzdHJ1Y3QgaG9zdF92bV9vcCAqb3A7CiAJaW50IGk7CkBAIC0yNiwxOCArMjcsMTggQEAKIAkJb3AgPSAmb3BzW2ldOwogCQlzd2l0Y2gob3AtPnR5cGUpewogCQljYXNlIE1NQVA6Ci0JCQltYXAoZmQsIG9wLT51Lm1tYXAuYWRkciwgb3AtPnUubW1hcC5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBtYXAoJm1tdS0+c2thcy5pZCwgb3AtPnUubW1hcC5hZGRyLCBvcC0+dS5tbWFwLmxlbiwKIAkJCSAgICBvcC0+dS5tbWFwLnIsIG9wLT51Lm1tYXAudywgb3AtPnUubW1hcC54LAogCQkJICAgIG9wLT51Lm1tYXAuZmQsIG9wLT51Lm1tYXAub2Zmc2V0KTsKIAkJCWJyZWFrOwogCQljYXNlIE1VTk1BUDoKLQkJCXVubWFwKGZkLCAodm9pZCAqKSBvcC0+dS5tdW5tYXAuYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubWFwKCZtbXUtPnNrYXMuaWQsICh2b2lkICopIG9wLT51Lm11bm1hcC5hZGRyLAogCQkJICAgICAgb3AtPnUubXVubWFwLmxlbik7CiAJCQlicmVhazsKIAkJY2FzZSBNUFJPVEVDVDoKLQkJCXByb3RlY3QoZmQsIG9wLT51Lm1wcm90ZWN0LmFkZHIsIG9wLT51Lm1wcm90ZWN0LmxlbiwKLQkJCQlvcC0+dS5tcHJvdGVjdC5yLCBvcC0+dS5tcHJvdGVjdC53LAotCQkJCW9wLT51Lm1wcm90ZWN0LngpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdCgmbW11LT5za2FzLmlkLCBvcC0+dS5tcHJvdGVjdC5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+dS5tcHJvdGVjdC5sZW4sIG9wLT51Lm1wcm90ZWN0LnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT51Lm1wcm90ZWN0LncsIG9wLT51Lm1wcm90ZWN0LngpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcmludGsoIlVua25vd24gb3AgdHlwZSAlZCBpbiBkb19vcHNcbiIsIG9wLT50eXBlKTsKQEAgLTQ2LDEyICs0NywxNSBAQAogCX0KIH0KIAorZXh0ZXJuIGludCBwcm9jX21tOworCiBzdGF0aWMgdm9pZCBmaXhfcmFuZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKIAkJICAgICAgdW5zaWduZWQgbG9uZyBlbmRfYWRkciwgaW50IGZvcmNlKQogewotICAgICAgICBpbnQgZmQgPSBtbS0+Y29udGV4dC5za2FzLm1tX2ZkOworICAgICAgICBpZighcHJvY19tbSAmJiAoZW5kX2FkZHIgPiBDT05GSUdfU1RVQl9TVEFSVCkpCisgICAgICAgICAgICAgICAgZW5kX2FkZHIgPSBDT05GSUdfU1RVQl9TVEFSVDsKIAotICAgICAgICBmaXhfcmFuZ2VfY29tbW9uKG1tLCBzdGFydF9hZGRyLCBlbmRfYWRkciwgZm9yY2UsIGZkLCBkb19vcHMpOworICAgICAgICBmaXhfcmFuZ2VfY29tbW9uKG1tLCBzdGFydF9hZGRyLCBlbmRfYWRkciwgZm9yY2UsIGRvX29wcyk7CiB9CiAKIHZvaWQgX19mbHVzaF90bGJfb25lX3NrYXModW5zaWduZWQgbG9uZyBhZGRyKQpAQCAtNjksMTcgKzczLDIwIEBACiAKIHZvaWQgZmx1c2hfdGxiX21tX3NrYXMoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKIAkvKiBEb24ndCBib3RoZXIgZmx1c2hpbmcgaWYgdGhpcyBhZGRyZXNzIHNwYWNlIGlzIGFib3V0IHRvIGJlCiAgICAgICAgICAqIGRlc3Ryb3llZC4KICAgICAgICAgICovCiAgICAgICAgIGlmKGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID09IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGZpeF9yYW5nZShtbSwgMCwgaG9zdF90YXNrX3NpemUsIDApOwotICAgICAgICBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbihzdGFydF92bSwgZW5kX3ZtKTsKKwllbmQgPSBwcm9jX21tID8gdGFza19zaXplIDogQ09ORklHX1NUVUJfU1RBUlQ7CisgICAgICAgIGZpeF9yYW5nZShtbSwgMCwgZW5kLCAwKTsKIH0KIAogdm9pZCBmb3JjZV9mbHVzaF9hbGxfc2thcyh2b2lkKQogewotICAgICAgICBmaXhfcmFuZ2UoY3VycmVudC0+bW0sIDAsIGhvc3RfdGFza19zaXplLCAxKTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IHByb2NfbW0gPyB0YXNrX3NpemUgOiBDT05GSUdfU1RVQl9TVEFSVDsKKyAgICAgICAgZml4X3JhbmdlKGN1cnJlbnQtPm1tLCAwLCBlbmQsIDEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc3lzY2FsbF9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsX2tlcm4uYwppbmRleCBiN2E1NTI1Li44ZTFhMzUwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9zeXNjYWxsX2tlcm4uYwpAQCAtMzEsNyArMzEsOCBAQAogCWxvbmcgcmV0OwogCiAJY3VycmVudC0+dGhyZWFkLmZvcmtpbmcgPSAxOwotICAgICAgICByZXQgPSBkb19mb3JrKFNJR0NITEQsIDAsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCXJldCA9IGRvX2ZvcmsoU0lHQ0hMRCwgVVBUX1NQKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSwKKwkJICAgICAgJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAwLCBOVUxMLCBOVUxMKTsKIAljdXJyZW50LT50aHJlYWQuZm9ya2luZyA9IDA7CiAJcmV0dXJuKHJldCk7CiB9CkBAIC00MSw4ICs0Miw5IEBACiAJbG9uZyByZXQ7CiAKIAljdXJyZW50LT50aHJlYWQuZm9ya2luZyA9IDE7Ci0JcmV0ID0gZG9fZm9yayhDTE9ORV9WRk9SSyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwgMCwgTlVMTCwgMCwgTlVMTCwKLQkJICAgICAgTlVMTCk7CisJcmV0ID0gZG9fZm9yayhDTE9ORV9WRk9SSyB8IENMT05FX1ZNIHwgU0lHQ0hMRCwKKwkJICAgICAgVVBUX1NQKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSwKKwkJICAgICAgJmN1cnJlbnQtPnRocmVhZC5yZWdzLCAwLCBOVUxMLCBOVUxMKTsKIAljdXJyZW50LT50aHJlYWQuZm9ya2luZyA9IDA7CiAJcmV0dXJuKHJldCk7CiB9CkBAIC0xNjIsMTQgKzE2NCwzIEBACiAJc3Bpbl91bmxvY2soJnN5c2NhbGxfbG9jayk7CiAJcmV0dXJuKHJldCk7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90aW1lLmMgYi9hcmNoL3VtL2tlcm5lbC90aW1lLmMKaW5kZXggYzQwYzg2YS4uYzQwYjYxMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3RpbWUuYwpAQCAtMzMsNyArMzMsNyBAQAogCXRpbWVyYWRkKCZ4dGltZSwgJmxvY2FsX29mZnNldCwgJnh0aW1lKTsKIH0KIAotdm9pZCBzZXRfaW50ZXJ2YWwoaW50IHRpbWVyX3R5cGUpCitzdGF0aWMgdm9pZCBzZXRfaW50ZXJ2YWwoaW50IHRpbWVyX3R5cGUpCiB7CiAJaW50IHVzZWMgPSAxMDAwMDAwL2h6KCk7CiAJc3RydWN0IGl0aW1lcnZhbCBpbnRlcnZhbCA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIHVzZWMgfSwKQEAgLTQ1LDEyICs0NSwxNCBAQAogCiB2b2lkIGVuYWJsZV90aW1lcih2b2lkKQogeworCXNldF9pbnRlcnZhbChJVElNRVJfVklSVFVBTCk7Cit9CisKK3ZvaWQgcHJlcGFyZV90aW1lcih2b2lkICogcHRyKQorewogCWludCB1c2VjID0gMTAwMDAwMC9oeigpOwotCXN0cnVjdCBpdGltZXJ2YWwgZW5hYmxlID0gKChzdHJ1Y3QgaXRpbWVydmFsKSB7IHsgMCwgdXNlYyB9LAotCQkJCQkJCXsgMCwgdXNlYyB9fSk7Ci0JaWYoc2V0aXRpbWVyKElUSU1FUl9WSVJUVUFMLCAmZW5hYmxlLCBOVUxMKSkKLQkJcHJpbnRrKCJlbmFibGVfdGltZXIgLSBzZXRpdGltZXIgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAotCQkgICAgICAgZXJybm8pOworCSooc3RydWN0IGl0aW1lcnZhbCAqKXB0ciA9ICgoc3RydWN0IGl0aW1lcnZhbCkgeyB7IDAsIHVzZWMgfSwKKwkJCQkJCQkgeyAwLCB1c2VjIH19KTsKIH0KIAogdm9pZCBkaXNhYmxlX3RpbWVyKHZvaWQpCkBAIC0xNTUsMTMgKzE1NywxNSBAQAogCW5hbm9zbGVlcCgmdHMsIE5VTEwpOwogfQogCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLworLyogWFhYIFRoaXMgcGFydGx5IGR1cGxpY2F0ZXMgaW5pdF9pcnFfc2lnbmFscyAqLworCit2b2lkIHVzZXJfdGltZV9pbml0KHZvaWQpCit7CisJc2V0X2hhbmRsZXIoU0lHVlRBTFJNLCAoX19zaWdoYW5kbGVyX3QpIGFsYXJtX2hhbmRsZXIsCisJCSAgICBTQV9PTlNUQUNLIHwgU0FfUkVTVEFSVCwgU0lHVVNSMSwgU0lHSU8sIFNJR1dJTkNILAorCQkgICAgU0lHQUxSTSwgU0lHVVNSMiwgLTEpOworCXNldF9oYW5kbGVyKFNJR0FMUk0sIChfX3NpZ2hhbmRsZXJfdCkgYWxhcm1faGFuZGxlciwKKwkJICAgIFNBX09OU1RBQ0sgfCBTQV9SRVNUQVJULCBTSUdVU1IxLCBTSUdJTywgU0lHV0lOQ0gsCisJCSAgICBTSUdWVEFMUk0sIFNJR1VTUjIsIC0xKTsKKwlzZXRfaW50ZXJ2YWwoSVRJTUVSX1ZJUlRVQUwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGltZV9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYwppbmRleCA2NTE2ZmM1Li5hOGI0ZWY2IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYwpAQCAtMTYyLDcgKzE2Miw3IEBACiB7CiAJaW50IGVycjsKIAotCUNIT09TRV9NT0RFKHVzZXJfdGltZV9pbml0X3R0KCksIHVzZXJfdGltZV9pbml0X3NrYXMoKSk7CisJdXNlcl90aW1lX2luaXQoKTsKIAllcnIgPSByZXF1ZXN0X2lycShUSU1FUl9JUlEsIHVtX3RpbWVyLCBTQV9JTlRFUlJVUFQsICJ0aW1lciIsIE5VTEwpOwogCWlmKGVyciAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgInRpbWVyX2luaXQgOiByZXF1ZXN0X2lycSBmYWlsZWQgLSAiCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90bGIuYyBiL2FyY2gvdW0va2VybmVsL3RsYi5jCmluZGV4IGVkYTQ3N2UuLjgzZWM4ZDQ3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90bGIuYworKysgYi9hcmNoL3VtL2tlcm5lbC90bGIuYwpAQCAtMTgsMTMgKzE4LDE1IEBACiAjZGVmaW5lIEFERF9ST1VORChuLCBpbmMpICgoKG4pICsgKGluYykpICYgfigoaW5jKSAtIDEpKQogCiB2b2lkIGZpeF9yYW5nZV9jb21tb24oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBpbnQgZm9yY2UsIGludCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKGludCwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSkKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGVuZF9hZGRyLCBpbnQgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRvX29wcykodW5pb24gbW1fY29udGV4dCAqLCBzdHJ1Y3QgaG9zdF92bV9vcCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpCiB7CiAgICAgICAgIHBnZF90ICpucGdkOwogICAgICAgICBwdWRfdCAqbnB1ZDsKICAgICAgICAgcG1kX3QgKm5wbWQ7CiAgICAgICAgIHB0ZV90ICpucHRlOworICAgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUgPSAmbW0tPmNvbnRleHQ7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgZW5kOwogICAgICAgICBpbnQgciwgdywgeDsKICAgICAgICAgc3RydWN0IGhvc3Rfdm1fb3Agb3BzWzE2XTsKQEAgLTQwLDcgKzQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gZW5kX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZihmb3JjZSB8fCBwZ2RfbmV3cGFnZSgqbnBnZCkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgZW5kIC0gYWRkciwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdkX21rdXB0b2RhdGUoKm5wZ2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTUsNyArNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmRfYWRkcjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcmNlIHx8IHB1ZF9uZXdwYWdlKCpucHVkKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4ID0gYWRkX211bm1hcChhZGRyLCBlbmQgLSBhZGRyLCBvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19vcHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWRfbWt1cHRvZGF0ZSgqbnB1ZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC03MCw3ICs3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZF9hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYoZm9yY2UgfHwgcG1kX25ld3BhZ2UoKm5wbWQpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXggPSBhZGRfbXVubWFwKGFkZHIsIGVuZCAtIGFkZHIsIG9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX29wcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZF9ta3VwdG9kYXRlKCpucG1kKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTkzLDIxICs5NSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCA9IGFkZF9tbWFwKGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRlX3ZhbCgqbnB0ZSkgJiBQQUdFX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFLCByLCB3LCB4LCBvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIG1tdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19vcHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBvcF9pbmRleCA9IGFkZF9tdW5tYXAoYWRkciwgUEFHRV9TSVpFLCBvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4LCBsYXN0X29wLCBtbXUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19vcHMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIGlmKHB0ZV9uZXdwcm90KCpucHRlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2luZGV4ID0gYWRkX21wcm90ZWN0KGFkZHIsIFBBR0VfU0laRSwgciwgdywgeCwgb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfaW5kZXgsIGxhc3Rfb3AsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9pbmRleCwgbGFzdF9vcCwgbW11LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fb3BzKTsKIAogICAgICAgICAgICAgICAgICpucHRlID0gcHRlX21rdXB0b2RhdGUoKm5wdGUpOwogICAgICAgICAgICAgICAgIGFkZHIgKz0gUEFHRV9TSVpFOwogICAgICAgICB9Ci0gICAgICAgICgqZG9fb3BzKShkYXRhLCBvcHMsIG9wX2luZGV4KTsKKyAgICAgICAgKCpkb19vcHMpKG1tdSwgb3BzLCBvcF9pbmRleCk7CiB9CiAKIGludCBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbih1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKQEAgLTE5NSw1MSArMTk3LDYgQEAKICAgICAgICAgcmV0dXJuKHVwZGF0ZWQpOwogfQogCi12b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0gICAgICAgIGFkZHJlc3MgJj0gUEFHRV9NQVNLOwotICAgICAgICBmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBhZGRyZXNzICsgUEFHRV9TSVpFKTsKLX0KLQotdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCi17Ci0gICAgICAgIGZsdXNoX3RsYl9tbShjdXJyZW50LT5tbSk7Ci19Ci0gIAotdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfdHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24sIHN0YXJ0LCBlbmQpOwotfQotCi12b2lkIGZsdXNoX3RsYl9rZXJuZWxfdm0odm9pZCkKLXsKLSAgICAgICAgQ0hPT1NFX01PREUoZmx1c2hfdGxiX2tlcm5lbF92bV90dCgpLAotICAgICAgICAgICAgICAgICAgICBmbHVzaF90bGJfa2VybmVsX3JhbmdlX2NvbW1vbihzdGFydF92bSwgZW5kX3ZtKSk7Ci19Ci0KLXZvaWQgX19mbHVzaF90bGJfb25lKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLSAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhfX2ZsdXNoX3RsYl9vbmVfdHQsIF9fZmx1c2hfdGxiX29uZV9za2FzLCBhZGRyKTsKLX0KLQotdm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIAotICAgICB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLSAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfcmFuZ2VfdHQsIGZsdXNoX3RsYl9yYW5nZV9za2FzLCB2bWEsIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCk7Ci19Ci0KLXZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKGZsdXNoX3RsYl9tbV90dCwgZmx1c2hfdGxiX21tX3NrYXMsIG1tKTsKLX0KLQotdm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCkKLXsKLSAgICAgICAgQ0hPT1NFX01PREUoZm9yY2VfZmx1c2hfYWxsX3R0KCksIGZvcmNlX2ZsdXNoX2FsbF9za2FzKCkpOwotfQotCiBwZ2RfdCAqcGdkX29mZnNldF9wcm9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAgICAgICAgIHJldHVybihwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKSk7CkBAIC0yNzAsOSArMjI3LDkgQEAKIH0KIAogaW50IGFkZF9tbWFwKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIGxlbiwKLSAgICAgaW50IHIsIGludCB3LCBpbnQgeCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LAotICAgICBpbnQgbGFzdF9maWxsZWQsIGludCBkYXRhLAotICAgICB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCisgICAgICAgICAgICAgaW50IHIsIGludCB3LCBpbnQgeCwgc3RydWN0IGhvc3Rfdm1fb3AgKm9wcywgaW50IGluZGV4LAorICAgICAgICAgICAgIGludCBsYXN0X2ZpbGxlZCwgdW5pb24gbW1fY29udGV4dCAqbW11LAorICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSkKIHsKICAgICAgICAgX191NjQgb2Zmc2V0OwogCXN0cnVjdCBob3N0X3ZtX29wICpsYXN0OwpAQCAtMjkyLDcgKzI0OSw3IEBACiAJfQogCiAJaWYoaW5kZXggPT0gbGFzdF9maWxsZWQpewotCQkoKmRvX29wcykoZGF0YSwgb3BzLCBsYXN0X2ZpbGxlZCk7CisJCSgqZG9fb3BzKShtbXUsIG9wcywgbGFzdF9maWxsZWQpOwogCQlpbmRleCA9IC0xOwogCX0KIApAQCAtMzEwLDggKzI2Nyw4IEBACiB9CiAKIGludCBhZGRfbXVubWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsCi0JICAgICAgIGludCBpbmRleCwgaW50IGxhc3RfZmlsbGVkLCBpbnQgZGF0YSwKLQkgICAgICAgdm9pZCAoKmRvX29wcykoaW50LCBzdHJ1Y3QgaG9zdF92bV9vcCAqLCBpbnQpKQorCSAgICAgICBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwgdW5pb24gbW1fY29udGV4dCAqbW11LAorCSAgICAgICB2b2lkICgqZG9fb3BzKSh1bmlvbiBtbV9jb250ZXh0ICosIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCiB7CiAJc3RydWN0IGhvc3Rfdm1fb3AgKmxhc3Q7CiAKQEAgLTMyNSw3ICsyODIsNyBAQAogCX0KIAogCWlmKGluZGV4ID09IGxhc3RfZmlsbGVkKXsKLQkJKCpkb19vcHMpKGRhdGEsIG9wcywgbGFzdF9maWxsZWQpOworCQkoKmRvX29wcykobW11LCBvcHMsIGxhc3RfZmlsbGVkKTsKIAkJaW5kZXggPSAtMTsKIAl9CiAKQEAgLTMzNyw4ICsyOTQsOSBAQAogfQogCiBpbnQgYWRkX21wcm90ZWN0KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIGludCByLCBpbnQgdywgaW50IHgsCi0JCSBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgaW5kZXgsIGludCBsYXN0X2ZpbGxlZCwgaW50IGRhdGEsCi0JCSB2b2lkICgqZG9fb3BzKShpbnQsIHN0cnVjdCBob3N0X3ZtX29wICosIGludCkpCisgICAgICAgICAgICAgICAgIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBpbmRleCwgaW50IGxhc3RfZmlsbGVkLAorICAgICAgICAgICAgICAgICB1bmlvbiBtbV9jb250ZXh0ICptbXUsCisgICAgICAgICAgICAgICAgIHZvaWQgKCpkb19vcHMpKHVuaW9uIG1tX2NvbnRleHQgKiwgc3RydWN0IGhvc3Rfdm1fb3AgKiwgaW50KSkKIHsKIAlzdHJ1Y3QgaG9zdF92bV9vcCAqbGFzdDsKIApAQCAtMzU0LDcgKzMxMiw3IEBACiAJfQogCiAJaWYoaW5kZXggPT0gbGFzdF9maWxsZWQpewotCQkoKmRvX29wcykoZGF0YSwgb3BzLCBsYXN0X2ZpbGxlZCk7CisJCSgqZG9fb3BzKShtbXUsIG9wcywgbGFzdF9maWxsZWQpOwogCQlpbmRleCA9IC0xOwogCX0KIApAQCAtMzY3LDMgKzMyNSw0OSBAQAogCQkJCQkJICAgICAgLngJPSB4IH0gfSB9KTsKIAlyZXR1cm4oaW5kZXgpOwogfQorCit2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisgICAgICAgIGFkZHJlc3MgJj0gUEFHRV9NQVNLOworICAgICAgICBmbHVzaF90bGJfcmFuZ2Uodm1hLCBhZGRyZXNzLCBhZGRyZXNzICsgUEFHRV9TSVpFKTsKK30KKwordm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCit7CisgICAgICAgIGZsdXNoX3RsYl9tbShjdXJyZW50LT5tbSk7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKyAgICAgICAgQ0hPT1NFX01PREVfUFJPQyhmbHVzaF90bGJfa2VybmVsX3JhbmdlX3R0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2VfY29tbW9uLCBzdGFydCwgZW5kKTsKK30KKwordm9pZCBmbHVzaF90bGJfa2VybmVsX3ZtKHZvaWQpCit7CisgICAgICAgIENIT09TRV9NT0RFKGZsdXNoX3RsYl9rZXJuZWxfdm1fdHQoKSwKKyAgICAgICAgICAgICAgICAgICAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZV9jb21tb24oc3RhcnRfdm0sIGVuZF92bSkpOworfQorCit2b2lkIF9fZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisgICAgICAgIENIT09TRV9NT0RFX1BST0MoX19mbHVzaF90bGJfb25lX3R0LCBfX2ZsdXNoX3RsYl9vbmVfc2thcywgYWRkcik7Cit9CisKK3ZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworICAgICAgICBDSE9PU0VfTU9ERV9QUk9DKGZsdXNoX3RsYl9yYW5nZV90dCwgZmx1c2hfdGxiX3JhbmdlX3NrYXMsIHZtYSwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kKTsKK30KKwordm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisgICAgICAgIENIT09TRV9NT0RFX1BST0MoZmx1c2hfdGxiX21tX3R0LCBmbHVzaF90bGJfbW1fc2thcywgbW0pOworfQorCit2b2lkIGZvcmNlX2ZsdXNoX2FsbCh2b2lkKQoreworICAgICAgICBDSE9PU0VfTU9ERShmb3JjZV9mbHVzaF9hbGxfdHQoKSwgZm9yY2VfZmx1c2hfYWxsX3NrYXMoKSk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L01ha2VmaWxlIGIvYXJjaC91bS9rZXJuZWwvdHQvTWFrZWZpbGUKaW5kZXggM2ZkMjU1NC4uNjkzOWU1YSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvTWFrZWZpbGUKQEAgLTQsMTEgKzQsMTEgQEAKICMKIAogb2JqLXkgPSBleGVjX2tlcm4ubyBleGVjX3VzZXIubyBnZGIubyBrc3ltcy5vIG1lbS5vIG1lbV91c2VyLm8gcHJvY2Vzc19rZXJuLm8gXAotCXN5c2NhbGxfa2Vybi5vIHN5c2NhbGxfdXNlci5vIHRpbWUubyB0bGIubyB0cmFjZXIubyB0cmFwX3VzZXIubyBcCisJc3lzY2FsbF9rZXJuLm8gc3lzY2FsbF91c2VyLm8gdGxiLm8gdHJhY2VyLm8gdHJhcF91c2VyLm8gXAogCXVhY2Nlc3MubyB1YWNjZXNzX3VzZXIubwogCiBvYmotJChDT05GSUdfUFRfUFJPWFkpICs9IGdkYl9rZXJuLm8gcHRwcm94eS8KIAotVVNFUl9PQkpTIDo9IGdkYi5vIHRpbWUubyB0cmFjZXIubworVVNFUl9PQkpTIDo9IGdkYi5vIHRyYWNlci5vCiAKIGluY2x1ZGUgYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9nZGIuYyBiL2FyY2gvdW0va2VybmVsL3R0L2dkYi5jCmluZGV4IDE5YTBhZDcuLjM3ZTIyZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L2dkYi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2dkYi5jCkBAIC0xNTMsMTAgKzE1MywxMCBAQAogCWV4aXRfZGVidWdnZXJfY2IoTlVMTCk7CiB9CiAKLWludCBnZGJfcmVtb3ZlKGNoYXIgKnVudXNlZCkKK2ludCBnZGJfcmVtb3ZlKGludCB1bnVzZWQpCiB7CiAJaW5pdGlhbF90aHJlYWRfY2IocmVtb3ZlX2dkYl9jYiwgTlVMTCk7Ci0JcmV0dXJuKDApOworICAgICAgICByZXR1cm4gMDsKIH0KIAogdm9pZCBzaWduYWxfdXNyMShpbnQgc2lnKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvZ2RiX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3R0L2dkYl9rZXJuLmMKaW5kZXggOTNmYjEyMS4uMjY1MDYzOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvZ2RiX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC9nZGJfa2Vybi5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaWZkZWYgQ09ORklHX01DT05TT0xFCiAKIGV4dGVybiBpbnQgZ2RiX2NvbmZpZyhjaGFyICpzdHIpOwotZXh0ZXJuIGludCBnZGJfcmVtb3ZlKGNoYXIgKnVudXNlZCk7CitleHRlcm4gaW50IGdkYl9yZW1vdmUoaW50IG4pOwogCiBzdGF0aWMgc3RydWN0IG1jX2RldmljZSBnZGJfbWMgPSB7CiAJLm5hbWUJCT0gImdkYiIsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9pbmNsdWRlL2RlYnVnLmggYi9hcmNoL3VtL2tlcm5lbC90dC9pbmNsdWRlL2RlYnVnLmgKaW5kZXggOGVmZjY3NC4uNzM4NDM1NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvZGVidWcuaApAQCAtNCw4ICs0LDggQEAKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCi0jaWZuZGVmIF9fREVCVUdfSAotI2RlZmluZSBfX0RFQlVHX0gKKyNpZm5kZWYgX19VTUxfVFRfREVCVUdfSAorI2RlZmluZSBfX1VNTF9UVF9ERUJVR19ICiAKIGV4dGVybiBpbnQgZGVidWdnZXJfcHJveHkoaW50IHN0YXR1cywgcGlkX3QgcGlkKTsKIGV4dGVybiB2b2lkIGNoaWxkX3Byb3h5KHBpZF90IHBpZCwgaW50IHN0YXR1cyk7CkBAIC0xMywxNyArMTMsNiBAQAogZXh0ZXJuIGludCBzdGFydF9kZWJ1Z2dlcihjaGFyICpwcm9nLCBpbnQgc3RhcnR1cCwgaW50IHN0b3AsIGludCAqZGVidWdnZXJfZmQpOwogZXh0ZXJuIHZvaWQgZmFrZV9jaGlsZF9leGl0KHZvaWQpOwogZXh0ZXJuIGludCBnZGJfY29uZmlnKGNoYXIgKnN0cik7Ci1leHRlcm4gaW50IGdkYl9yZW1vdmUoY2hhciAqdW51c2VkKTsKK2V4dGVybiBpbnQgZ2RiX3JlbW92ZShpbnQgdW51c2VkKTsKIAogI2VuZGlmCi0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9pbmNsdWRlL21vZGUtdHQuaCBiL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvbW9kZS10dC5oCmluZGV4IGVmZTQ2MjAuLmUxNzFlMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvbW9kZS10dC5oCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L2luY2x1ZGUvbW9kZS10dC5oCkBAIC0xMyw3ICsxMyw2IEBACiBleHRlcm4gaW50IHRyYWNpbmdfcGlkOwogCiBleHRlcm4gaW50IHRyYWNlcihpbnQgKCppbml0X3Byb2MpKHZvaWQgKiksIHZvaWQgKnNwKTsKLWV4dGVybiB2b2lkIHVzZXJfdGltZV9pbml0X3R0KHZvaWQpOwogZXh0ZXJuIHZvaWQgc2lnX2hhbmRsZXJfY29tbW9uX3R0KGludCBzaWcsIHZvaWQgKnNjKTsKIGV4dGVybiB2b2lkIHN5c2NhbGxfaGFuZGxlcl90dChpbnQgc2lnLCB1bmlvbiB1bWxfcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCByZWJvb3RfdHQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3R0L3Byb2Nlc3Nfa2Vybi5jCmluZGV4IDc3NjMxMGYuLmExODlhMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3R0L3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3R0L3Byb2Nlc3Nfa2Vybi5jCkBAIC0yNjYsMTAgKzI2NiwxMCBAQAogCX0KIAogCWlmKGN1cnJlbnQtPnRocmVhZC5mb3JraW5nKXsKLQkJc2NfdG9fc2MoVVBUX1NDKCZwLT50aHJlYWQucmVncy5yZWdzKSwgCi0JCQkgVVBUX1NDKCZjdXJyZW50LT50aHJlYWQucmVncy5yZWdzKSk7CisJCXNjX3RvX3NjKFVQVF9TQygmcC0+dGhyZWFkLnJlZ3MucmVncyksIFVQVF9TQygmcmVncy0+cmVncykpOwogCQlTQ19TRVRfU1lTQ0FMTF9SRVRVUk4oVVBUX1NDKCZwLT50aHJlYWQucmVncy5yZWdzKSwgMCk7Ci0JCWlmKHNwICE9IDApIFNDX1NQKFVQVF9TQygmcC0+dGhyZWFkLnJlZ3MucmVncykpID0gc3A7CisJCWlmKHNwICE9IDApCisJCQlTQ19TUChVUFRfU0MoJnAtPnRocmVhZC5yZWdzLnJlZ3MpKSA9IHNwOwogCX0KIAlwLT50aHJlYWQubW9kZS50dC5leHRlcm5fcGlkID0gbmV3X3BpZDsKIApAQCAtNDU5LDE0ICs0NTksMyBAQAogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlyZXR1cm4oMCk7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC90dC90aW1lLmMgYi9hcmNoL3VtL2tlcm5lbC90dC90aW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjViNzEuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvdGltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWVfdXNlci5oPgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJ1c2VyLmgiCi0KLXZvaWQgdXNlcl90aW1lX2luaXRfdHQodm9pZCkKLXsKLQlpZihzaWduYWwoU0lHVlRBTFJNLCAoX19zaWdoYW5kbGVyX3QpIGFsYXJtX2hhbmRsZXIpID09IFNJR19FUlIpCi0JCXBhbmljKCJDb3VsZG4ndCBzZXQgU0lHVlRBTFJNIGhhbmRsZXIiKTsKLQlzZXRfaW50ZXJ2YWwoSVRJTUVSX1ZJUlRVQUwpOwotfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHQvdGxiLmMgYi9hcmNoL3VtL2tlcm5lbC90dC90bGIuYwppbmRleCAyMDMyMTZhLi4yZWVmYjQzIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90dC90bGIuYworKysgYi9hcmNoL3VtL2tlcm5lbC90dC90bGIuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgIm9zLmgiCiAjaW5jbHVkZSAidGxiLmgiCiAKLXN0YXRpYyB2b2lkIGRvX29wcyhpbnQgdW51c2VkLCBzdHJ1Y3QgaG9zdF92bV9vcCAqb3BzLCBpbnQgbGFzdCkKK3N0YXRpYyB2b2lkIGRvX29wcyh1bmlvbiBtbV9jb250ZXh0ICptbXUsIHN0cnVjdCBob3N0X3ZtX29wICpvcHMsIGludCBsYXN0KQogewogCXN0cnVjdCBob3N0X3ZtX29wICpvcDsKIAlpbnQgaTsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgICAgICAgICBwYW5pYygiZml4X3JhbmdlIGZpeGluZyB3cm9uZyBhZGRyZXNzIHNwYWNlLCBjdXJyZW50ID0gMHglcCIsCiAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CiAKLSAgICAgICAgZml4X3JhbmdlX2NvbW1vbihtbSwgc3RhcnRfYWRkciwgZW5kX2FkZHIsIGZvcmNlLCAwLCBkb19vcHMpOworICAgICAgICBmaXhfcmFuZ2VfY29tbW9uKG1tLCBzdGFydF9hZGRyLCBlbmRfYWRkciwgZm9yY2UsIGRvX29wcyk7CiB9CiAKIGF0b21pY190IHZtY2hhbmdlX3NlcSA9IEFUT01JQ19JTklUKDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCmluZGV4IDYxZGZkNGYuLjE2MzQ3NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUworKysgYi9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKQEAgLTMwLDYgKzMwLDcgQEAKIAlfZWluaXR0ZXh0ID0gLjsKICAgfQogICAuID0gQUxJR04oNDA5Nik7CisKICAgLnRleHQgICAgICA6CiAgIHsKICAgICAqKC50ZXh0KQpAQCAtMzksNiArNDAsMTIgQEAKICAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KICAgICAqKC5nbnUud2FybmluZykKICAgICAqKC5nbnUubGlua29uY2UudCopCisKKyAgICAuID0gQUxJR04oNDA5Nik7CisgICAgX19zeXNjYWxsX3N0dWJfc3RhcnQgPSAuOworICAgICooLl9fc3lzY2FsbF9zdHViKikKKyAgICBfX3N5c2NhbGxfc3R1Yl9lbmQgPSAuOworICAgIC4gPSBBTElHTig0MDk2KTsKICAgfQogCiAgICNpbmNsdWRlICJhc20vY29tbW9uLmxkcy5TIgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvcmVnaXN0ZXJzLmMKaW5kZXggOWEwYWQwOS4uMzEyNWQzMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9yZWdpc3RlcnMuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3JlZ2lzdGVycy5jCkBAIC0xMjEsNiArMTIxLDExIEBACiAJCSAgICAgIGVycik7CiB9CiAKK3ZvaWQgZ2V0X3NhZmVfcmVnaXN0ZXJzKHVuc2lnbmVkIGxvbmcgKnJlZ3MpCit7CisJbWVtY3B5KHJlZ3MsIGV4ZWNfcmVncywgSE9TVF9GUkFNRV9TSVpFICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKK30KKwogLyoKICAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgogICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvcmVnaXN0ZXJzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvcmVnaXN0ZXJzLmMKaW5kZXggNjI4NmM5Ny4uNDQ0MzhkMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3JlZ2lzdGVycy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9yZWdpc3RlcnMuYwpAQCAtNjksNiArNjksMTEgQEAKIAkJICAgICAgZXJyKTsKIH0KIAordm9pZCBnZXRfc2FmZV9yZWdpc3RlcnModW5zaWduZWQgbG9uZyAqcmVncykKK3sKKwltZW1jcHkocmVncywgZXhlY19yZWdzLCBIT1NUX0ZSQU1FX1NJWkUgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworfQorCiAvKgogICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCiAgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcyBiL2FyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS5ydWxlcwppbmRleCA3NDU5ZDA5Li4xN2YzMDViIDEwMDY0NAotLS0gYS9hcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKKysrIGIvYXJjaC91bS9zY3JpcHRzL01ha2VmaWxlLnJ1bGVzCkBAIC0xNiw2ICsxNiwxMSBAQAogZW5kZWYKIAogCisjIFRoZSBzdHVicyBhbmQgdW5tYXAubyBjYW4ndCB0cnkgdG8gY2FsbCBtY291bnQgb3IgdXBkYXRlIGJhc2ljIGJsb2NrIGRhdGEKK2RlZmluZSB1bnByb2ZpbGUKKwkkKHBhdHN1YnN0IC1wZywsJChwYXRzdWJzdCAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UsLCQoMSkpKQorZW5kZWYKKwogcXVpZXRfY21kX21ha2VfbGluayA9IFNZTUxJTksgJEAKIGNtZF9tYWtlX2xpbmsgICAgICAgPSBsbiAtc2YgJChzcmN0cmVlKS9hcmNoLyQoU1VCQVJDSCkvJCgkKG5vdGRpciAkQCktZGlyKS8kKG5vdGRpciAkQCkgJEAKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKaW5kZXggMDk1YmNkYi4uNzdjM2M0ZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogb2JqLXkgPSBiaXRvcHMubyBidWdzLm8gY2hlY2tzdW0ubyBkZWxheS5vIGZhdWx0Lm8ga3N5bXMubyBsZHQubyBwdHJhY2UubyBcCi0JcHRyYWNlX3VzZXIubyBzZW1hcGhvcmUubyBzaWduYWwubyBzaWdjb250ZXh0Lm8gc3lzY2FsbHMubyBzeXNycS5vIFwKLQlzeXNfY2FsbF90YWJsZS5vCisJcHRyYWNlX3VzZXIubyBzZW1hcGhvcmUubyBzaWduYWwubyBzaWdjb250ZXh0Lm8gc3R1Yi5vIHN0dWJfc2Vndi5vIFwKKwlzeXNjYWxscy5vIHN5c3JxLm8gc3lzX2NhbGxfdGFibGUubwogCiBvYmotJChDT05GSUdfSElHSE1FTSkgKz0gaGlnaG1lbS5vCiBvYmotJChDT05GSUdfTU9EVUxFUykgKz0gbW9kdWxlLm8KQEAgLTE2LDYgKzE2LDE0IEBACiBoaWdobWVtLmMtZGlyID0gbW0KIG1vZHVsZS5jLWRpciA9IGtlcm5lbAogCitTVFVCX0NGTEFHUyA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKGNhbGwgdW5wcm9maWxlLCQoVVNFUl9DRkxBR1MpKQorCisjIF9jZmxhZ3Mgd29ya3Mgd2l0aCBrZXJuZWwgZmlsZXMsIG5vdCB3aXRoIHVzZXJzcGFjZSBvbmVzLCBidXQgY19mbGFncyBkb2VzLAorIyB3aHkgYXNrIHdoeT8KKyQob2JqKS9zdHViX3NlZ3YubyA6IGNfZmxhZ3MgPSAkKFNUVUJfQ0ZMQUdTKQorCiskKG9iaikvc3R1Yi5vIDogYV9mbGFncyA9ICQoU1RVQl9DRkxBR1MpCisKIHN1YmRpci0gOj0gdXRpbAogCiBpbmNsdWRlIGFyY2gvdW0vc2NyaXB0cy9NYWtlZmlsZS51bm1hcApkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYyBiL2FyY2gvdW0vc3lzLWkzODYvc2lnbmFsLmMKaW5kZXggMDM5MTNjYS4uNGVmYzY5YSAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtaTM4Ni9zaWduYWwuYworKysgYi9hcmNoL3VtL3N5cy1pMzg2L3NpZ25hbC5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqZXh0cmFtYXNrID0gZnJhbWUtPmV4dHJhbWFzazsKIAlpbnQgc2lnX3NpemUgPSAoX05TSUdfV09SRFMgLSAxKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAotCWlmKGNvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzBdLCBvbGRtYXNrLCBzaXplb2YoJnNldC5zaWdbMF0pKSB8fAorCWlmKGNvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzBdLCBvbGRtYXNrLCBzaXplb2Yoc2V0LnNpZ1swXSkpIHx8CiAJICAgY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMV0sIGV4dHJhbWFzaywgc2lnX3NpemUpKQogCQlnb3RvIHNlZ2ZhdWx0OwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3N0dWIuUyBiL2FyY2gvdW0vc3lzLWkzODYvc3R1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMmM3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy1pMzg2L3N0dWIuUwpAQCAtMCwwICsxLDggQEAKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisKKwkuZ2xvYmwgc3lzY2FsbF9zdHViCisuc2VjdGlvbiAuX19zeXNjYWxsX3N0dWIsICJ4Igorc3lzY2FsbF9zdHViOgorCWludCAJJDB4ODAKKwltb3YJJWVheCwgVU1MX0NPTkZJR19TVFVCX0RBVEEKKwlpbnQzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pMzg2L3N0dWJfc2Vndi5jIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUxNDQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zdHViX3NlZ3YuYwpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgorI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQoreworCXN0cnVjdCBzaWdjb250ZXh0ICpzYyA9IChzdHJ1Y3Qgc2lnY29udGV4dCAqKSAoJnNpZyArIDEpOworCisJR0VUX0ZBVUxUSU5GT19GUk9NX1NDKCooKHN0cnVjdCBmYXVsdGluZm8gKikgVU1MX0NPTkZJR19TVFVCX0RBVEEpLAorCQkJICAgICAgc2MpOworCisJX19hc21fXygibW92bCAlMCwgJSVlYXggOyBpbnQgJDB4ODAiOiA6ICJnIiAoX19OUl9nZXRwaWQpKTsKKwlfX2FzbV9fKCJtb3ZsICUlZWF4LCAlJWVieCA7IG1vdmwgJTAsICUlZWF4IDsgbW92bCAlMSwgJSVlY3ggOyIKKwkJImludCAkMHg4MCI6IDogImciIChfX05SX2tpbGwpLCAiZyIgKFNJR1VTUjEpKTsKKwkvKiBQb3AgdGhlIGZyYW1lIHBvaW50ZXIgYW5kIHJldHVybiBhZGRyZXNzIHNpbmNlIHdlIG5lZWQgdG8gbGVhdmUKKwkgKiB0aGUgc3RhY2sgaW4gaXRzIG9yaWdpbmFsIGZvcm0gd2hlbiB3ZSBkbyB0aGUgc2lncmV0dXJuIGhlcmUsIGJ5CisJICogaGFuZC4KKwkgKi8KKwlfX2FzbV9fKCJwb3BsICUlZWF4IDsgcG9wbCAlJWVheCA7IHBvcGwgJSVlYXggOyBtb3ZsICUwLCAlJWVheCA7ICIKKwkJImludCAkMHg4MCIgOiA6ICJnIiAoX19OUl9zaWdyZXR1cm4pKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvc3lzY2FsbHMuYyBiL2FyY2gvdW0vc3lzLWkzODYvc3lzY2FsbHMuYwppbmRleCAzMzVlMmQ4Li44M2U5YmU4IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy1pMzg2L3N5c2NhbGxzLmMKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9zeXNjYWxscy5jCkBAIC02OSwxNSArNjksMTEgQEAKIHsKIAlsb25nIHJldDsKIAotCS8qIFhYWDogbm9ybWFsIGFyY2ggZG8gaGVyZSB0aGlzIHBhc3MsIGFuZCBhbHNvIHBhc3MgdGhlIHJlZ3MgdG8KLQkgKiBkb19mb3JrLCBpbnN0ZWFkIG9mIE5VTEwuIEN1cnJlbnRseSB0aGUgYXJjaC1pbmRlcGVuZGVudCBjb2RlCi0JICogaWdub3JlcyB0aGVzZSB2YWx1ZXMsIHdoaWxlIHRoZSBVTUwgY29kZSAoYWN0dWFsbHkgaXQncwotCSAqIGNvcHlfdGhyZWFkKSBkb2VzIHRoZSByaWdodCB0aGluZy4gQnV0IHRoaXMgc2hvdWxkIGNoYW5nZSwKLQkgcHJvYmFibHkuICovCi0JLyppZiAoIW5ld3NwKQotCQluZXdzcCA9IFVQVF9TUChjdXJyZW50LT50aHJlYWQucmVncyk7Ki8KKwlpZiAoIW5ld3NwKQorCQluZXdzcCA9IFVQVF9TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncyk7CiAJY3VycmVudC0+dGhyZWFkLmZvcmtpbmcgPSAxOwotCXJldCA9IGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCBOVUxMLCAwLCBwYXJlbnRfdGlkLCBjaGlsZF90aWQpOworCXJldCA9IGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCAmY3VycmVudC0+dGhyZWFkLnJlZ3MsIDAsIHBhcmVudF90aWQsCisJCSAgICAgIGNoaWxkX3RpZCk7CiAJY3VycmVudC0+dGhyZWFkLmZvcmtpbmcgPSAwOwogCXJldHVybihyZXQpOwogfQpAQCAtMTk3LDE0ICsxOTMsMyBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQotLyoKLSAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgotICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5Ci0gKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCi0gKiBvZiB0aGUgZmlsZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1maWxlLXN0eWxlOiAibGludXgiCi0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXg4Nl82NC9NYWtlZmlsZQppbmRleCAyYmM2ZjY4Li43NDg4MjA2IDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMteDg2XzY0L01ha2VmaWxlCkBAIC02LDggKzYsOCBAQAogCiAjWFhYOiB3aHkgaW50byBsaWIteT8KIGxpYi15ID0gYml0b3BzLm8gYnVncy5vIGNzdW0tcGFydGlhbC5vIGRlbGF5Lm8gZmF1bHQubyBtZW0ubyBtZW1jcHkubyBcCi0JcHRyYWNlLm8gcHRyYWNlX3VzZXIubyBzZW1hcGhvcmUubyBzaWdjb250ZXh0Lm8gc2lnbmFsLm8gXAotCXN5c2NhbGxzLm8gc3lzcnEubyB0aHVuay5vIHN5c2NhbGxfdGFibGUubworCXB0cmFjZS5vIHB0cmFjZV91c2VyLm8gc2VtYXBob3JlLm8gc2lnY29udGV4dC5vIHNpZ25hbC5vIHN0dWIubyBcCisJc3R1Yl9zZWd2Lm8gc3lzY2FsbHMubyBzeXNjYWxsX3RhYmxlLm8gc3lzcnEubyB0aHVuay5vCiAKIG9iai15IDo9IGtzeW1zLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKSArPSBtb2R1bGUubyB1bV9tb2R1bGUubwpAQCAtMjgsNiArMjgsMTQgQEAKIHRodW5rLlMtZGlyID0gbGliCiBtb2R1bGUuYy1kaXIgPSBrZXJuZWwKIAorU1RVQl9DRkxBR1MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChjYWxsIHVucHJvZmlsZSwkKFVTRVJfQ0ZMQUdTKSkKKworIyBfY2ZsYWdzIHdvcmtzIHdpdGgga2VybmVsIGZpbGVzLCBub3Qgd2l0aCB1c2Vyc3BhY2Ugb25lcywgYnV0IGNfZmxhZ3MgZG9lcywKKyMgd2h5IGFzayB3aHk/CiskKG9iaikvc3R1Yl9zZWd2Lm8gOiBjX2ZsYWdzID0gJChTVFVCX0NGTEFHUykKKworJChvYmopL3N0dWIubyA6IGFfZmxhZ3MgPSAkKFNUVUJfQ0ZMQUdTKQorCiBzdWJkaXItIDo9IHV0aWwKIAogaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUudW5tYXAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViLlMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzE0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yi5TCkBAIC0wLDAgKzEsMTUgQEAKKyNpbmNsdWRlICJ1bWwtY29uZmlnLmgiCisKKwkuZ2xvYmwgc3lzY2FsbF9zdHViCisuc2VjdGlvbiAuX19zeXNjYWxsX3N0dWIsICJ4Igorc3lzY2FsbF9zdHViOgorCXN5c2NhbGwKKwkvKiBXZSBkb24ndCBoYXZlIDY0LWJpdCBjb25zdGFudHMsIHNvIHRoaXMgY29uc3RydWN0cyB0aGUgYWRkcmVzcworCSAqIHdlIG5lZWQuCisJICovCisJbW92cQkkKFVNTF9DT05GSUdfU1RVQl9EQVRBID4+IDMyKSwgJXJieAorCXNhbHEJJDMyLCAlcmJ4CisJbW92cQkkKFVNTF9DT05GSUdfU1RVQl9EQVRBICYgMHhmZmZmZmZmZiksICVyY3gKKwlvcgklcmN4LCAlcmJ4CisJbW92cQklcmF4LCAoJXJieCkKKwlpbnQzCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3R1Yl9zZWd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZDFmZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0vc3lzLXg4Nl82NC9zdHViX3NlZ3YuYwpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEplZmYgRGlrZSAoamRpa2VAYWRkdG9pdC5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgInVtbC1jb25maWcuaCIKKyNpbmNsdWRlICJzeXNkZXAvc2lnY29udGV4dC5oIgorI2luY2x1ZGUgInN5c2RlcC9mYXVsdGluZm8uaCIKKwordm9pZCBfX2F0dHJpYnV0ZV9fICgoX19zZWN0aW9uX18gKCIuX19zeXNjYWxsX3N0dWIiKSkpCitzdHViX3NlZ3ZfaGFuZGxlcihpbnQgc2lnKQoreworCXN0cnVjdCB1Y29udGV4dCAqdWM7CisKKwlfX2FzbV9fKCJtb3ZxICUlcmR4LCAlMCIgOiAiPWciICh1YykgOik7CisgICAgICAgIEdFVF9GQVVMVElORk9fRlJPTV9TQygqKChzdHJ1Y3QgZmF1bHRpbmZvICopIFVNTF9DT05GSUdfU1RVQl9EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1Yy0+dWNfbWNvbnRleHQpOworCisJX19hc21fXygibW92cSAlMCwgJSVyYXggOyBzeXNjYWxsIjogOiAiZyIgKF9fTlJfZ2V0cGlkKSk7CisJX19hc21fXygibW92cSAlJXJheCwgJSVyZGkgOyBtb3ZxICUwLCAlJXJheCA7IG1vdnEgJTEsICUlcnNpIDsiCisJCSJzeXNjYWxsIjogOiAiZyIgKF9fTlJfa2lsbCksICJnIiAoU0lHVVNSMSkpOworCS8qIFR3byBwb3BxcyB0byByZXN0b3JlIHRoZSBzdGFjayB0byB0aGUgc3RhdGUganVzdCBiZWZvcmUgZW50ZXJpbmcKKwkgKiB0aGUgaGFuZGxlciwgb25lIHBvcHMgdGhlIHJldHVybiBhZGRyZXNzLCB0aGUgb3RoZXIgcG9wcyB0aGUgZnJhbWUKKwkgKiBwb2ludGVyLgorCSAqLworCV9fYXNtX18oInBvcHEgJSVyYXggOyBwb3BxICUlcmF4IDsgbW92cSAlMCwgJSVyYXggOyBzeXNjYWxsIiA6IDogImciCisJCShfX05SX3J0X3NpZ3JldHVybikpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMteDg2XzY0L3N5c2NhbGxzLmMgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbHMuYwppbmRleCA2ZjQ0ZjQwLi4zMjU5YTRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbHMuYworKysgYi9hcmNoL3VtL3N5cy14ODZfNjQvc3lzY2FsbHMuYwpAQCAtMTc0LDI2ICsxNzQsMTEgQEAKIHsKIAlsb25nIHJldDsKIAotCS8qIFhYWDogbm9ybWFsIGFyY2ggZG8gaGVyZSB0aGlzIHBhc3MsIGFuZCBhbHNvIHBhc3MgdGhlIHJlZ3MgdG8KLQkgKiBkb19mb3JrLCBpbnN0ZWFkIG9mIE5VTEwuIEN1cnJlbnRseSB0aGUgYXJjaC1pbmRlcGVuZGVudCBjb2RlCi0JICogaWdub3JlcyB0aGVzZSB2YWx1ZXMsIHdoaWxlIHRoZSBVTUwgY29kZSAoYWN0dWFsbHkgaXQncwotCSAqIGNvcHlfdGhyZWFkKSBkb2VzIHRoZSByaWdodCB0aGluZy4gQnV0IHRoaXMgc2hvdWxkIGNoYW5nZSwKLQkgcHJvYmFibHkuICovCi0JLyppZiAoIW5ld3NwKQotCQluZXdzcCA9IFVQVF9TUChjdXJyZW50LT50aHJlYWQucmVncyk7Ki8KKwlpZiAoIW5ld3NwKQorCQluZXdzcCA9IFVQVF9TUCgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncyk7CiAJY3VycmVudC0+dGhyZWFkLmZvcmtpbmcgPSAxOwotCXJldCA9IGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCBOVUxMLCAwLCBwYXJlbnRfdGlkLCBjaGlsZF90aWQpOworCXJldCA9IGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCAmY3VycmVudC0+dGhyZWFkLnJlZ3MsIDAsIHBhcmVudF90aWQsCisJCSAgICAgIGNoaWxkX3RpZCk7CiAJY3VycmVudC0+dGhyZWFkLmZvcmtpbmcgPSAwOwogCXJldHVybihyZXQpOwogfQotCi0vKgotICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCi0gKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKLSAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKLSAqIG9mIHRoZSBmaWxlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWZpbGUtc3R5bGU6ICJsaW51eCIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL0tjb25maWcgYi9hcmNoL3Y4NTAvS2NvbmZpZwppbmRleCAyN2ZlYmQ2Li44OWMwNTNiIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAvS2NvbmZpZworKysgYi9hcmNoL3Y4NTAvS2NvbmZpZwpAQCAtMjUwLDYgKzI1MCw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogc291cmNlICJkcml2ZXJzL2Jhc2UvS2NvbmZpZyIKQEAgLTI4Myw3ICsyODUsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyIKIAotc291cmNlICJuZXQvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2lzZG4vS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvYXJjaC92ODUwL2xpYi9jaGVja3N1bS5jIGIvYXJjaC92ODUwL2xpYi9jaGVja3N1bS5jCmluZGV4IGQzMDhiNzIuLmZhNTg3MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvdjg1MC9saWIvY2hlY2tzdW0uYworKysgYi9hcmNoL3Y4NTAvbGliL2NoZWNrc3VtLmMKQEAgLTEzOCw3ICsxMzgsOCBAQAogICogQ29weSBmcm9tIHVzZXJzcGFjZSBhbmQgY29tcHV0ZSBjaGVja3N1bS4gIElmIHdlIGNhdGNoIGFuIGV4Y2VwdGlvbgogICogdGhlbiB6ZXJvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCiAgKi8KLXVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgdW5zaWduZWQgY2hhciAqZHN0LAordW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVycl9wdHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9LY29uZmlnIGIvYXJjaC94ODZfNjQvS2NvbmZpZwppbmRleCBkYjI1OTc1Li40YjgzMjYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L0tjb25maWcKQEAgLTIwNywzMyArMjA3LDYgQEAKIAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KIAotY29uZmlnIFBSRUVNUFQKLQlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwiCi0JLS0taGVscC0tLQotCSAgVGhpcyBvcHRpb24gcmVkdWNlcyB0aGUgbGF0ZW5jeSBvZiB0aGUga2VybmVsIHdoZW4gcmVhY3RpbmcgdG8KLQkgIHJlYWwtdGltZSBvciBpbnRlcmFjdGl2ZSBldmVudHMgYnkgYWxsb3dpbmcgYSBsb3cgcHJpb3JpdHkgcHJvY2VzcyB0bwotCSAgYmUgcHJlZW1wdGVkIGV2ZW4gaWYgaXQgaXMgaW4ga2VybmVsIG1vZGUgZXhlY3V0aW5nIGEgc3lzdGVtIGNhbGwuCi0JICBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcnVuIG1vcmUgcmVsaWFibHkgZXZlbiB3aGVuIHRoZSBzeXN0ZW0gaXMKLQkgIHVuZGVyIGxvYWQuIE9uIGNvbnRyYXJ5IGl0IG1heSBhbHNvIGJyZWFrIHlvdXIgZHJpdmVycyBhbmQgYWRkCi0JICBwcmlvcml0eSBpbmhlcml0YW5jZSBwcm9ibGVtcyB0byB5b3VyIHN5c3RlbS4gRG9uJ3Qgc2VsZWN0IGl0IGlmCi0JICB5b3UgcmVseSBvbiBhIHN0YWJsZSBzeXN0ZW0gb3IgaGF2ZSBzbGlnaHRseSBvYnNjdXJlIGhhcmR3YXJlLgotCSAgSXQncyBhbHNvIG5vdCB2ZXJ5IHdlbGwgdGVzdGVkIG9uIHg4Ni02NCBjdXJyZW50bHkuCi0JICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KLQotCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGZlZWxpbmcgYnJhdmUgYW5kIGJ1aWxkaW5nIGEga2VybmVsIGZvciBhCi0JICBkZXNrdG9wLCBlbWJlZGRlZCBvciByZWFsLXRpbWUgc3lzdGVtLiAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCi0KLWNvbmZpZyBQUkVFTVBUX0JLTAotCWJvb2wgIlByZWVtcHQgVGhlIEJpZyBLZXJuZWwgTG9jayIKLQlkZXBlbmRzIG9uIFBSRUVNUFQKLQlkZWZhdWx0IHkKLQloZWxwCi0JICBUaGlzIG9wdGlvbiByZWR1Y2VzIHRoZSBsYXRlbmN5IG9mIHRoZSBrZXJuZWwgYnkgbWFraW5nIHRoZQotCSAgYmlnIGtlcm5lbCBsb2NrIHByZWVtcHRpYmxlLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCBzeXN0ZW0uCi0JICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KLQogY29uZmlnIFNDSEVEX1NNVAogCWJvb2wgIlNNVCAoSHlwZXJ0aHJlYWRpbmcpIHNjaGVkdWxlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gU01QCkBAIC0yNDQsNiArMjE3LDggQEAKIAkgIGNvc3Qgb2Ygc2xpZ2h0bHkgaW5jcmVhc2VkIG92ZXJoZWFkIGluIHNvbWUgcGxhY2VzLiBJZiB1bnN1cmUgc2F5CiAJICBOIGhlcmUuCiAKK3NvdXJjZSAia2VybmVsL0tjb25maWcucHJlZW1wdCIKKwogY29uZmlnIEs4X05VTUEKICAgICAgICBib29sICJLOCBOVU1BIHN1cHBvcnQiCiAgICAgICAgc2VsZWN0IE5VTUEKQEAgLTMxMyw2ICsyODgsMTUgQEAKIAkgIFRoaXMgaXMgcHVyZWx5IHRvIHNhdmUgbWVtb3J5IC0gZWFjaCBzdXBwb3J0ZWQgQ1BVIHJlcXVpcmVzCiAJICBtZW1vcnkgaW4gdGhlIHN0YXRpYyBrZXJuZWwgY29uZmlndXJhdGlvbi4KIAorY29uZmlnIEhPVFBMVUdfQ1BVCisJYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBDUFVzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU01QICYmIEhPVFBMVUcgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCQlTYXkgWSBoZXJlIHRvIGV4cGVyaW1lbnQgd2l0aCB0dXJuaW5nIENQVXMgb2ZmIGFuZCBvbi4gIENQVXMKKwkJY2FuIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUjLgorCQlTYXkgTiBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIENQVSBob3RwbHVnLgorCisKIGNvbmZpZyBIUEVUX1RJTUVSCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMzg1LDYgKzM2OSwzNCBAQAogCSAgIEFkZGl0aW9uYWwgc3VwcG9ydCBmb3IgaW50ZWwgc3BlY2lmaWMgTUNFIGZlYXR1cmVzIHN1Y2ggYXMKIAkgICB0aGUgdGhlcm1hbCBtb25pdG9yLgogCitjb25maWcgUEhZU0lDQUxfU1RBUlQKKwloZXggIlBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQiIGlmIEVNQkVEREVECisJZGVmYXVsdCAiMHgxMDAwMDAiCisJaGVscAorCSAgVGhpcyBnaXZlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZC4KKwkgIFByaW1hcmlseSB1c2VkIGluIHRoZSBjYXNlIG9mIGtleGVjIG9uIHBhbmljIHdoZXJlIHRoZQorCSAgZmFpbCBzYWZlIGtlcm5lbCBuZWVkcyB0byBydW4gYXQgYSBkaWZmZXJlbnQgYWRkcmVzcyB0aGFuCisJICB0aGUgcGFuaWMtZWQga2VybmVsLgorCisJICBEb24ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCitjb25maWcgS0VYRUMKKwlib29sICJrZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIGtleGVjIGlzIGEgc3lzdGVtIGNhbGwgdGhhdCBpbXBsZW1lbnRzIHRoZSBhYmlsaXR5IHRvIHNodXRkb3duIHlvdXIKKwkgIGN1cnJlbnQga2VybmVsLCBhbmQgdG8gc3RhcnQgYW5vdGhlciBrZXJuZWwuICBJdCBpcyBsaWtlIGEgcmVib290CisJICBidXQgaXQgaXMgaW5kZXBlZGVudCBvZiB0aGUgc3lzdGVtIGZpcm13YXJlLiAgIEFuZCBsaWtlIGEgcmVib290CisJICB5b3UgY2FuIHN0YXJ0IGFueSBrZXJuZWwgd2l0aCBpdCwgbm90IGp1c3QgTGludXguCisKKwkgIFRoZSBuYW1lIGNvbWVzIGZyb20gdGhlIHNpbWlsaWFyaXR5IHRvIHRoZSBleGVjIHN5c3RlbSBjYWxsLgorCisJICBJdCBpcyBhbiBvbmdvaW5nIHByb2Nlc3MgdG8gYmUgY2VydGFpbiB0aGUgaGFyZHdhcmUgaW4gYSBtYWNoaW5lCisJICBpcyBwcm9wZXJseSBzaHV0ZG93biwgc28gZG8gbm90IGJlIHN1cnByaXNlZCBpZiB0aGlzIGNvZGUgZG9lcyBub3QKKwkgIGluaXRpYWxseSB3b3JrIGZvciB5b3UuICBJdCBtYXkgaGVscCB0byBlbmFibGUgZGV2aWNlIGhvdHBsdWdnaW5nCisJICBzdXBwb3J0LiAgQXMgb2YgdGhpcyB3cml0aW5nIHRoZSBleGFjdCBoYXJkd2FyZSBpbnRlcmZhY2UgaXMKKwkgIHN0cm9uZ2x5IGluIGZsdXgsIHNvIG5vIGdvb2QgcmVjb21tZW5kYXRpb24gY2FuIGJlIG1hZGUuCisKIGNvbmZpZyBTRUNDT01QCiAJYm9vbCAiRW5hYmxlIHNlY2NvbXAgdG8gc2FmZWx5IGNvbXB1dGUgdW50cnVzdGVkIGJ5dGVjb2RlIgogCWRlcGVuZHMgb24gUFJPQ19GUwpAQCAtNTAzLDYgKzUxNSw4IEBACiAKIGVuZG1lbnUKIAorc291cmNlICJuZXQvS2NvbmZpZyIKKwogc291cmNlIGRyaXZlcnMvS2NvbmZpZwogCiBzb3VyY2UgImRyaXZlcnMvZmlybXdhcmUvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggNmY5MGMyNC4uNDI4OTE1NiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTM1LDcgKzM1LDcgQEAKIAogTERGTEFHUwkJOj0gLW0gZWxmX3g4Nl82NAogT0JKQ09QWUZMQUdTCTo9IC1PIGJpbmFyeSAtUiAubm90ZSAtUiAuY29tbWVudCAtUwotTERGTEFHU192bWxpbnV4IDo9IC1lIHN0ZXh0CitMREZMQUdTX3ZtbGludXggOj0KIAogQ0hFQ0tGTEFHUyAgICAgICs9IC1EX194ODZfNjRfXyAtbTY0CiAKQEAgLTY1LDcgKzY1LDkgQEAKIGhlYWQteSA6PSBhcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5vIGFyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQubyBhcmNoL3g4Nl82NC9rZXJuZWwvaW5pdF90YXNrLm8KIAogbGlicy15IAkJCQkJKz0gYXJjaC94ODZfNjQvbGliLwotY29yZS15CQkJCQkrPSBhcmNoL3g4Nl82NC9rZXJuZWwvIGFyY2gveDg2XzY0L21tLworY29yZS15CQkJCQkrPSBhcmNoL3g4Nl82NC9rZXJuZWwvIFwKKwkJCQkJICAgYXJjaC94ODZfNjQvbW0vIFwKKwkJCQkJICAgYXJjaC94ODZfNjQvY3J5cHRvLwogY29yZS0kKENPTkZJR19JQTMyX0VNVUxBVElPTikJCSs9IGFyY2gveDg2XzY0L2lhMzIvCiBkcml2ZXJzLSQoQ09ORklHX1BDSSkJCQkrPSBhcmNoL3g4Nl82NC9wY2kvCiBkcml2ZXJzLSQoQ09ORklHX09QUk9GSUxFKQkJKz0gYXJjaC94ODZfNjQvb3Byb2ZpbGUvCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvaGVhZC5TIGIvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL2hlYWQuUwppbmRleCAyNzI2NGRiLi42ZjU1NTY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvaGVhZC5TCisrKyBiL2FyY2gveDg2XzY0L2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKQEAgLTIsOCArMiw2IEBACiAgKiAgbGludXgvYm9vdC9oZWFkLlMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzICBMaW51cyBUb3J2YWxkcwotICoKLSAqICAkSWQ6IGhlYWQuUyx2IDEuMyAyMDAxLzA0LzIwIDAwOjU5OjI4IGFrIEV4cCAkCSAJCQogICovCiAKIC8qCkBAIC0yMSwxMyArMTksMTQgQEAKICAqLwogCiAvKgotICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgkKKyAqIEhpZ2ggbG9hZGVkIHN0dWZmIGJ5IEhhbnMgTGVybWVuICYgV2VybmVyIEFsbWVzYmVyZ2VyLCBGZWIuIDE5OTYKICAqLwogLmNvZGUzMgogLnRleHQKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIAkuY29kZTMyCiAJLmdsb2JsIHN0YXJ0dXBfMzIKQEAgLTc3LDcgKzc2LDcgQEAKIAlqbnogIDNmCiAJYWRkbCAkOCwlZXNwCiAJeG9ybCAlZWJ4LCVlYngKLQlsam1wICQoX19LRVJORUxfQ1MpLCAkMHgxMDAwMDAKKwlsam1wICQoX19LRVJORUxfQ1MpLCAkX19QSFlTSUNBTF9TVEFSVAogCiAvKgogICogV2UgY29tZSBoZXJlLCBpZiB3ZSB3ZXJlIGxvYWRlZCBoaWdoLgpAQCAtMTAzLDcgKzEwMiw3IEBACiAJcG9wbCAlZWN4CSMgbGNvdW50CiAJcG9wbCAlZWR4CSMgaGlnaF9idWZmZXJfc3RhcnQKIAlwb3BsICVlYXgJIyBoY291bnQKLQltb3ZsICQweDEwMDAwMCwlZWRpCisJbW92bCAkX19QSFlTSUNBTF9TVEFSVCwlZWRpCiAJY2xpCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW50ZXJydXB0ZWQKIAlsam1wICQoX19LRVJORUxfQ1MpLCAkMHgxMDAwICMgYW5kIGp1bXAgdG8gdGhlIG1vdmUgcm91dGluZQogCkBAIC0xMjgsNyArMTI3LDcgQEAKIAltb3ZzbAogCW1vdmwgJWVieCwlZXNpCSMgUmVzdG9yZSBzZXR1cCBwb2ludGVyCiAJeG9ybCAlZWJ4LCVlYngKLQlsam1wICQoX19LRVJORUxfQ1MpLCAkMHgxMDAwMDAKKwlsam1wICQoX19LRVJORUxfQ1MpLCAkX19QSFlTSUNBTF9TVEFSVAogbW92ZV9yb3V0aW5lX2VuZDoKIAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCBjOGI5MjE2Li5iMzhkNWI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gveDg2XzY0L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTExLDYgKzExLDcgQEAKIAogI2luY2x1ZGUgIm1pc2NzZXR1cC5oIgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIC8qCiAgKiBnemlwIGRlY2xhcmF0aW9ucwpAQCAtOTIsOCArOTMsMTEgQEAKIHN0YXRpYyB2b2lkICptYWxsb2MoaW50IHNpemUpOwogc3RhdGljIHZvaWQgZnJlZSh2b2lkICp3aGVyZSk7CiAgCit2b2lkKiBtZW1zZXQodm9pZCogcywgaW50IGMsIHVuc2lnbmVkIG4pOwordm9pZCogbWVtY3B5KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywgdW5zaWduZWQgbik7CisKIHN0YXRpYyB2b2lkIHB1dHN0cihjb25zdCBjaGFyICopOwotICAKKwogZXh0ZXJuIGludCBlbmQ7CiBzdGF0aWMgbG9uZyBmcmVlX21lbV9wdHIgPSAobG9uZykmZW5kOwogc3RhdGljIGxvbmcgZnJlZV9tZW1fZW5kX3B0cjsKQEAgLTI4NCw3ICsyODgsNyBAQAogI2Vsc2UKIAlpZiAoKEFMVF9NRU1fSyA+IEVYVF9NRU1fSyA/IEFMVF9NRU1fSyA6IEVYVF9NRU1fSykgPCAxMDI0KSBlcnJvcigiTGVzcyB0aGFuIDJNQiBvZiBtZW1vcnkiKTsKICNlbmRpZgotCW91dHB1dF9kYXRhID0gKGNoYXIgKikweDEwMDAwMDsgLyogUG9pbnRzIHRvIDFNICovCisJb3V0cHV0X2RhdGEgPSAoY2hhciAqKV9fUEhZU0lDQUxfU1RBUlQ7IC8qIE5vcm1hbGx5IFBvaW50cyB0byAxTSAqLwogCWZyZWVfbWVtX2VuZF9wdHIgPSAobG9uZylyZWFsX21vZGU7CiB9CiAKQEAgLTMwNyw4ICszMTEsOCBAQAogCWxvd19idWZmZXJfc2l6ZSA9IGxvd19idWZmZXJfZW5kIC0gTE9XX0JVRkZFUl9TVEFSVDsKIAloaWdoX2xvYWRlZCA9IDE7CiAJZnJlZV9tZW1fZW5kX3B0ciA9IChsb25nKWhpZ2hfYnVmZmVyX3N0YXJ0OwotCWlmICggKDB4MTAwMDAwICsgbG93X2J1ZmZlcl9zaXplKSA+ICgodWxnKWhpZ2hfYnVmZmVyX3N0YXJ0KSkgewotCQloaWdoX2J1ZmZlcl9zdGFydCA9ICh1Y2ggKikoMHgxMDAwMDAgKyBsb3dfYnVmZmVyX3NpemUpOworCWlmICggKF9fUEhZU0lDQUxfU1RBUlQgKyBsb3dfYnVmZmVyX3NpemUpID4gKCh1bGcpaGlnaF9idWZmZXJfc3RhcnQpKSB7CisJCWhpZ2hfYnVmZmVyX3N0YXJ0ID0gKHVjaCAqKShfX1BIWVNJQ0FMX1NUQVJUICsgbG93X2J1ZmZlcl9zaXplKTsKIAkJbXYtPmhjb3VudCA9IDA7IC8qIHNheTogd2UgbmVlZCBub3QgdG8gbW92ZSBoaWdoX2J1ZmZlciAqLwogCX0KIAllbHNlIG12LT5oY291bnQgPSAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3QvaW5zdGFsbC5zaCBiL2FyY2gveDg2XzY0L2Jvb3QvaW5zdGFsbC5zaAppbmRleCBmMTdiNDBkLi4xOThhZjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L2luc3RhbGwuc2gKKysrIGIvYXJjaC94ODZfNjQvYm9vdC9pbnN0YWxsLnNoCkBAIC0xLDYgKzEsNiBAQAogIyEvYmluL3NoCiAjCi0jIGFyY2gvaTM4Ni9ib290L2luc3RhbGwuc2gKKyMgYXJjaC94ODZfNjQvYm9vdC9pbnN0YWxsLnNoCiAjCiAjIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUyBiL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUwppbmRleCA3NWQ0ZDJhLi5mZjU4YjI4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L3NldHVwLlMKKysrIGIvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TCkBAIC0zMyw3ICszMyw3IEBACiAgKiBUcmFuc2NyaWJlZCBmcm9tIEludGVsIChhczg2KSAtPiBBVCZUIChnYXMpIGJ5IENocmlzIE5vZSwgTWF5IDE5OTkuCiAgKiA8c3Rpa2VyQG5vcnRobGluay5jb20+CiAgKgotICogRml4IHRvIHdvcmsgYXJvdW5kIGJ1Z2d5IEJJT1NlcyB3aGljaCBkb250IHVzZSBjYXJyeSBiaXQgY29ycmVjdGx5CisgKiBGaXggdG8gd29yayBhcm91bmQgYnVnZ3kgQklPU2VzIHdoaWNoIGRvbid0IHVzZSBjYXJyeSBiaXQgY29ycmVjdGx5CiAgKiBhbmQvb3IgcmVwb3J0IGV4dGVuZGVkIG1lbW9yeSBpbiBDWC9EWCBmb3IgZTgwMWggbWVtb3J5IHNpemUgZGV0ZWN0aW9uIAogICogY2FsbC4gIEFzIGEgcmVzdWx0IHRoZSBrZXJuZWwgZ290IHdyb25nIGZpZ3VyZXMuICBUaGUgaW50MTUvZTgwMWggZG9jcwogICogZnJvbSBSYWxmIEJyb3duIGludGVycnVwdCBsaXN0IHNlZW0gdG8gaW5kaWNhdGUgQVgvQlggc2hvdWxkIGJlIHVzZWQKQEAgLTM4Myw3ICszODMsNyBAQAogIyBhIHdob2xlIGJ1bmNoIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIGFsbG93cyBtZW1vcnkgaG9sZXMgYW5kCiAjIGV2ZXJ5dGhpbmcuICBXZSBzY2FuIHRocm91Z2ggdGhpcyBtZW1vcnkgbWFwIGFuZCBidWlsZCBhIGxpc3QKICMgb2YgdGhlIGZpcnN0IDMyIG1lbW9yeSBhcmVhcywgd2hpY2ggd2UgcmV0dXJuIGF0IFtFODIwTUFQXS4KLSMgVGhpcyBpcyBkb2N1bWVudGVkIGF0IGh0dHA6Ly93d3cudGVsZXBvcnQuY29tL35hY3BpL2FjcGlodG1sL3RvcGljMjQ1Lmh0bQorIyBUaGlzIGlzIGRvY3VtZW50ZWQgYXQgaHR0cDovL3d3dy5hY3BpLmluZm8vLCBpbiB0aGUgQUNQSSAyLjAgc3BlY2lmaWNhdGlvbi4KIAogI2RlZmluZSBTTUFQICAweDUzNGQ0MTUwCiAKQEAgLTQzNiw3ICs0MzYsNyBAQAogCiBtZW1lODAxOgogCXN0YwkJCQkJIyBmaXggdG8gd29yayBhcm91bmQgYnVnZ3kKLQl4b3J3CSVjeCwlY3gJCQkJIyBCSU9TZXMgd2hpY2ggZG9udCBjbGVhci9zZXQKKwl4b3J3CSVjeCwlY3gJCQkJIyBCSU9TZXMgd2hpY2ggZG9uJ3QgY2xlYXIvc2V0CiAJeG9ydwklZHgsJWR4CQkJCSMgY2Fycnkgb24gcGFzcy9lcnJvciBvZgogCQkJCQkJIyBlODAxaCBtZW1vcnkgc2l6ZSBjYWxsCiAJCQkJCQkjIG9yIG1lcmVseSBwYXNzIGN4LGR4IHRob3VnaApAQCAtNzMzLDcgKzczMyw3IEBACiAjCiAjCWJ1dCB3ZSB5ZXQgaGF2ZW4ndCByZWxvYWRlZCB0aGUgQ1MgcmVnaXN0ZXIsIHNvIHRoZSBkZWZhdWx0IHNpemUgCiAjCW9mIHRoZSB0YXJnZXQgb2Zmc2V0IHN0aWxsIGlzIDE2IGJpdC4KLSMgICAgICAgSG93ZXZlciwgdXNpbmcgYW4gb3BlcmFudCBwcmVmaXggKDB4NjYpLCB0aGUgQ1BVIHdpbGwgcHJvcGVybHkKKyMJSG93ZXZlciwgdXNpbmcgYW4gb3BlcmFuZCBwcmVmaXggKDB4NjYpLCB0aGUgQ1BVIHdpbGwgcHJvcGVybHkKICMJdGFrZSBvdXIgNDggYml0IGZhciBwb2ludGVyLiAoSU5UZUwgODAzODYgUHJvZ3JhbW1lcidzIFJlZmVyZW5jZQogIwlNYW51YWwsIE1peGluZyAxNi1iaXQgYW5kIDMyLWJpdCBjb2RlLCBwYWdlIDE2LTYpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2Jvb3QvdG9vbHMvYnVpbGQuYyBiL2FyY2gveDg2XzY0L2Jvb3QvdG9vbHMvYnVpbGQuYwppbmRleCBjMmZhNjYzLi4xOGI1YmFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9ib290L3Rvb2xzL2J1aWxkLmMKKysrIGIvYXJjaC94ODZfNjQvYm9vdC90b29scy9idWlsZC5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqICAkSWQ6IGJ1aWxkLmMsdiAxLjMgMjAwMS8wNi8yNiAxNToxNDo1MCBwYXZlbCBFeHAgJAotICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiBNYXJlcwogICovCkBAIC04LDcgKzYsOCBAQAogLyoKICAqIFRoaXMgZmlsZSBidWlsZHMgYSBkaXNrLWltYWdlIGZyb20gdGhyZWUgZGlmZmVyZW50IGZpbGVzOgogICoKLSAqIC0gYm9vdHNlY3Q6IGV4YWN0bHkgNTEyIGJ5dGVzIG9mIDgwODYgbWFjaGluZSBjb2RlLCBsb2FkcyB0aGUgcmVzdAorICogLSBib290c2VjdDogY29tcGF0aWJpbGl0eSBtYnIgd2hpY2ggcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgaWYKKyAqICAgICAgICAgICAgIHNvbWVvbmUgdHJpZXMgdG8gYm9vdCB0aGUga2VybmVsIGRpcmVjdGx5LgogICogLSBzZXR1cDogODA4NiBtYWNoaW5lIGNvZGUsIHNldHMgdXAgc3lzdGVtIHBhcm0KICAqIC0gc3lzdGVtOiA4MDM4NiBjb2RlIGZvciBhY3R1YWwgc3lzdGVtCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvY3J5cHRvL01ha2VmaWxlIGIvYXJjaC94ODZfNjQvY3J5cHRvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmQyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9jcnlwdG8vTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjIAorIyB4ODZfNjQvY3J5cHRvL01ha2VmaWxlIAorIyAKKyMgQXJjaC1zcGVjaWZpYyBDcnlwdG9BUEkgbW9kdWxlcy4KKyMgCisKK29iai0kKENPTkZJR19DUllQVE9fQUVTX1g4Nl82NCkgKz0gYWVzLXg4Nl82NC5vCisKK2Flcy14ODZfNjQteSA6PSBhZXMteDg2XzY0LWFzbS5vIGFlcy5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLXg4Nl82NC1hc20uUyBiL2FyY2gveDg2XzY0L2NyeXB0by9hZXMteDg2XzY0LWFzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4M2NiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLXg4Nl82NC1hc20uUwpAQCAtMCwwICsxLDE4NiBAQAorLyogQUVTIChSaWpuZGFlbCkgaW1wbGVtZW50YXRpb24gKEZJUFMgUFVCIDE5NykgZm9yIHg4Nl82NAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBbmRyZWFzIFN0ZWlubWV0eiwgPGFzdEBkb21kdi5kZT4KKyAqCisgKiBMaWNlbnNlOgorICogVGhpcyBjb2RlIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgaGVhZGVyIGRvd24gdG8gYW5kCisgKiBpbmNsdWRpbmcgdGhpcyBzZW50ZW5jZSBpcyByZXRhaW5lZCBpbiBmdWxsLgorICovCisKKy5leHRlcm4gYWVzX2Z0X3RhYgorLmV4dGVybiBhZXNfaXRfdGFiCisuZXh0ZXJuIGFlc19mbF90YWIKKy5leHRlcm4gYWVzX2lsX3RhYgorCisudGV4dAorCisjZGVmaW5lIFIxCSVyYXgKKyNkZWZpbmUgUjFFCSVlYXgKKyNkZWZpbmUgUjFYCSVheAorI2RlZmluZSBSMUgJJWFoCisjZGVmaW5lIFIxTAklYWwKKyNkZWZpbmUgUjIJJXJieAorI2RlZmluZSBSMkUJJWVieAorI2RlZmluZSBSMlgJJWJ4CisjZGVmaW5lIFIySAklYmgKKyNkZWZpbmUgUjJMCSVibAorI2RlZmluZSBSMwklcmN4CisjZGVmaW5lIFIzRQklZWN4CisjZGVmaW5lIFIzWAklY3gKKyNkZWZpbmUgUjNICSVjaAorI2RlZmluZSBSM0wJJWNsCisjZGVmaW5lIFI0CSVyZHgKKyNkZWZpbmUgUjRFCSVlZHgKKyNkZWZpbmUgUjRYCSVkeAorI2RlZmluZSBSNEgJJWRoCisjZGVmaW5lIFI0TAklZGwKKyNkZWZpbmUgUjUJJXJzaQorI2RlZmluZSBSNUUJJWVzaQorI2RlZmluZSBSNgklcmRpCisjZGVmaW5lIFI2RQklZWRpCisjZGVmaW5lIFI3CSVyYnAKKyNkZWZpbmUgUjdFCSVlYnAKKyNkZWZpbmUgUjgJJXI4CisjZGVmaW5lIFI5CSVyOQorI2RlZmluZSBSMTAJJXIxMAorI2RlZmluZSBSMTEJJXIxMQorCisjZGVmaW5lIHByb2xvZ3VlKEZVTkMsQkFTRSxCMTI4LEIxOTIscjEscjIscjMscjQscjUscjYscjcscjgscjkscjEwLHIxMSkgXAorCS5nbG9iYWwJRlVOQzsJCQlcCisJLnR5cGUJRlVOQyxAZnVuY3Rpb247CQlcCisJLmFsaWduCTg7CQkJXAorRlVOQzoJbW92cQlyMSxyMjsJCQlcCisJbW92cQlyMyxyNDsJCQlcCisJbGVhcQlCQVNFKzUyKHI4KSxyOTsJCVwKKwltb3ZxCXIxMCxyMTE7CQlcCisJbW92bAkocjcpLHI1ICMjIEU7CQlcCisJbW92bAk0KHI3KSxyMSAjIyBFOwkJXAorCW1vdmwJOChyNykscjYgIyMgRTsJCVwKKwltb3ZsCTEyKHI3KSxyNyAjIyBFOwkJXAorCW1vdmwJKHI4KSxyMTAgIyMgRTsJCVwKKwl4b3JsCS00OChyOSkscjUgIyMgRTsJXAorCXhvcmwJLTQ0KHI5KSxyMSAjIyBFOwlcCisJeG9ybAktNDAocjkpLHI2ICMjIEU7CVwKKwl4b3JsCS0zNihyOSkscjcgIyMgRTsJXAorCWNtcGwJJDI0LHIxMCAjIyBFOwkJXAorCWpiCUIxMjg7CQkJXAorCWxlYXEJMzIocjkpLHI5OwkJXAorCWplCUIxOTI7CQkJXAorCWxlYXEJMzIocjkpLHI5OworCisjZGVmaW5lIGVwaWxvZ3VlKHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4LHI5KSBcCisJbW92cQlyMSxyMjsJCQlcCisJbW92cQlyMyxyNDsJCQlcCisJbW92bAlyNSAjIyBFLChyOSk7CQlcCisJbW92bAlyNiAjIyBFLDQocjkpOwkJXAorCW1vdmwJcjcgIyMgRSw4KHI5KTsJCVwKKwltb3ZsCXI4ICMjIEUsMTIocjkpOwkJXAorCXJldDsKKworI2RlZmluZSByb3VuZChUQUIsT0ZGU0VULHIxLHIyLHIzLHI0LHI1LHI2LHI3LHI4LHJhLHJiLHJjLHJkKSBcCisJbW92emJsCXIyICMjIEgscjUgIyMgRTsJXAorCW1vdnpibAlyMiAjIyBMLHI2ICMjIEU7CVwKKwltb3ZsCVRBQisxMDI0KCxyNSw0KSxyNSAjIyBFO1wKKwltb3Z3CXI0ICMjIFgscjIgIyMgWDsJXAorCW1vdmwJVEFCKCxyNiw0KSxyNiAjIyBFOwlcCisJcm9sbAkkMTYscjIgIyMgRTsJCVwKKwlzaHJsCSQxNixyNCAjIyBFOwkJXAorCW1vdnpibAlyNCAjIyBILHI3ICMjIEU7CVwKKwltb3Z6YmwJcjQgIyMgTCxyNCAjIyBFOwlcCisJeG9ybAlPRkZTRVQocjgpLHJhICMjIEU7CVwKKwl4b3JsCU9GRlNFVCs0KHI4KSxyYiAjIyBFOwlcCisJeG9ybAlUQUIrMzA3MigscjcsNCkscjUgIyMgRTtcCisJeG9ybAlUQUIrMjA0OCgscjQsNCkscjYgIyMgRTtcCisJbW92emJsCXIxICMjIEwscjcgIyMgRTsJXAorCW1vdnpibAlyMSAjIyBILHI0ICMjIEU7CVwKKwltb3ZsCVRBQisxMDI0KCxyNCw0KSxyNCAjIyBFO1wKKwltb3Z3CXIzICMjIFgscjEgIyMgWDsJXAorCXJvbGwJJDE2LHIxICMjIEU7CQlcCisJc2hybAkkMTYscjMgIyMgRTsJCVwKKwl4b3JsCVRBQigscjcsNCkscjUgIyMgRTsJXAorCW1vdnpibAlyMyAjIyBILHI3ICMjIEU7CVwKKwltb3Z6YmwJcjMgIyMgTCxyMyAjIyBFOwlcCisJeG9ybAlUQUIrMzA3MigscjcsNCkscjQgIyMgRTtcCisJeG9ybAlUQUIrMjA0OCgscjMsNCkscjUgIyMgRTtcCisJbW92emJsCXIxICMjIEgscjcgIyMgRTsJXAorCW1vdnpibAlyMSAjIyBMLHIzICMjIEU7CVwKKwlzaHJsCSQxNixyMSAjIyBFOwkJXAorCXhvcmwJVEFCKzMwNzIoLHI3LDQpLHI2ICMjIEU7XAorCW1vdmwJVEFCKzIwNDgoLHIzLDQpLHIzICMjIEU7XAorCW1vdnpibAlyMSAjIyBILHI3ICMjIEU7CVwKKwltb3Z6YmwJcjEgIyMgTCxyMSAjIyBFOwlcCisJeG9ybAlUQUIrMTAyNCgscjcsNCkscjYgIyMgRTtcCisJeG9ybAlUQUIoLHIxLDQpLHIzICMjIEU7CVwKKwltb3Z6YmwJcjIgIyMgSCxyMSAjIyBFOwlcCisJbW92emJsCXIyICMjIEwscjcgIyMgRTsJXAorCXNocmwJJDE2LHIyICMjIEU7CQlcCisJeG9ybAlUQUIrMzA3MigscjEsNCkscjMgIyMgRTtcCisJeG9ybAlUQUIrMjA0OCgscjcsNCkscjQgIyMgRTtcCisJbW92emJsCXIyICMjIEgscjEgIyMgRTsJXAorCW1vdnpibAlyMiAjIyBMLHIyICMjIEU7CVwKKwl4b3JsCU9GRlNFVCs4KHI4KSxyYyAjIyBFOwlcCisJeG9ybAlPRkZTRVQrMTIocjgpLHJkICMjIEU7CVwKKwl4b3JsCVRBQisxMDI0KCxyMSw0KSxyMyAjIyBFO1wKKwl4b3JsCVRBQigscjIsNCkscjQgIyMgRTsKKworI2RlZmluZSBtb3ZlX3JlZ3MocjEscjIscjMscjQpIFwKKwltb3ZsCXIzICMjIEUscjEgIyMgRTsJXAorCW1vdmwJcjQgIyMgRSxyMiAjIyBFOworCisjZGVmaW5lIGVudHJ5KEZVTkMsQkFTRSxCMTI4LEIxOTIpIFwKKwlwcm9sb2d1ZShGVU5DLEJBU0UsQjEyOCxCMTkyLFIyLFI4LFI3LFI5LFIxLFIzLFI0LFI2LFIxMCxSNSxSMTEpCisKKyNkZWZpbmUgcmV0dXJuIGVwaWxvZ3VlKFI4LFIyLFI5LFI3LFI1LFI2LFIzLFI0LFIxMSkKKworI2RlZmluZSBlbmNyeXB0X3JvdW5kKFRBQixPRkZTRVQpIFwKKwlyb3VuZChUQUIsT0ZGU0VULFIxLFIyLFIzLFI0LFI1LFI2LFI3LFIxMCxSNSxSNixSMyxSNCkgXAorCW1vdmVfcmVncyhSMSxSMixSNSxSNikKKworI2RlZmluZSBlbmNyeXB0X2ZpbmFsKFRBQixPRkZTRVQpIFwKKwlyb3VuZChUQUIsT0ZGU0VULFIxLFIyLFIzLFI0LFI1LFI2LFI3LFIxMCxSNSxSNixSMyxSNCkKKworI2RlZmluZSBkZWNyeXB0X3JvdW5kKFRBQixPRkZTRVQpIFwKKwlyb3VuZChUQUIsT0ZGU0VULFIyLFIxLFI0LFIzLFI2LFI1LFI3LFIxMCxSNSxSNixSMyxSNCkgXAorCW1vdmVfcmVncyhSMSxSMixSNSxSNikKKworI2RlZmluZSBkZWNyeXB0X2ZpbmFsKFRBQixPRkZTRVQpIFwKKwlyb3VuZChUQUIsT0ZGU0VULFIyLFIxLFI0LFIzLFI2LFI1LFI3LFIxMCxSNSxSNixSMyxSNCkKKworLyogdm9pZCBhZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikgKi8KKworCWVudHJ5KGFlc19lbmNyeXB0LDAsZW5jMTI4LGVuYzE5MikKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsLTk2KQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtODApCitlbmMxOTI6CWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwtNjQpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC00OCkKK2VuYzEyODoJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLC0zMikKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsLTE2KQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgIDApCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCAxNikKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsIDMyKQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgNDgpCisJZW5jcnlwdF9yb3VuZChhZXNfZnRfdGFiLCA2NCkKKwllbmNyeXB0X3JvdW5kKGFlc19mdF90YWIsIDgwKQorCWVuY3J5cHRfcm91bmQoYWVzX2Z0X3RhYiwgOTYpCisJZW5jcnlwdF9maW5hbChhZXNfZmxfdGFiLDExMikKKwlyZXR1cm4KKworLyogdm9pZCBhZXNfZGVjcnlwdCh2b2lkICpjdHgsIHU4ICpvdXQsIGNvbnN0IHU4ICppbikgKi8KKworCWVudHJ5KGFlc19kZWNyeXB0LDI0MCxkZWMxMjgsZGVjMTkyKQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtOTYpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC04MCkKK2RlYzE5MjoJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLC02NCkKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsLTQ4KQorZGVjMTI4OglkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsLTMyKQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwtMTYpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCAgMCkKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsIDE2KQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwgMzIpCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCA0OCkKKwlkZWNyeXB0X3JvdW5kKGFlc19pdF90YWIsIDY0KQorCWRlY3J5cHRfcm91bmQoYWVzX2l0X3RhYiwgODApCisJZGVjcnlwdF9yb3VuZChhZXNfaXRfdGFiLCA5NikKKwlkZWNyeXB0X2ZpbmFsKGFlc19pbF90YWIsMTEyKQorCXJldHVybgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy5jIGIvYXJjaC94ODZfNjQvY3J5cHRvL2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWM0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9jcnlwdG8vYWVzLmMKQEAgLTAsMCArMSwzMjQgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBBRVMgQ2lwaGVyIEFsZ29yaXRobS4KKyAqCisgKiBCYXNlZCBvbiBCcmlhbiBHbGFkbWFuJ3MgY29kZS4KKyAqCisgKiBMaW51eCBkZXZlbG9wZXJzOgorICogIEFsZXhhbmRlciBLamVsZGFhcyA8YXN0b3JAZmFzdC5ubz4KKyAqICBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAaHZybGFiLm9yZz4KKyAqICBLeWxlIE1jTWFydGluIDxreWxlQGRlYmlhbi5vcmc+CisgKiAgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+IChjb252ZXJzaW9uIHRvIDIuNSBBUEkpLgorICogIEFuZHJlYXMgU3RlaW5tZXR6IDxhc3RAZG9tZHYuZGU+IChhZGFwdGVkIHRvIHg4Nl82NCBhc3NlbWJsZXIpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoYykgMjAwMiwgRHIgQnJpYW4gR2xhZG1hbiA8YnJnQGdsYWRtYW4ubWUudWs+LCBXb3JjZXN0ZXIsIFVLLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMSUNFTlNFIFRFUk1TCisgKgorICogVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5CisgKiBmb3JtIGlzIGFsbG93ZWQgKHdpdGggb3Igd2l0aG91dCBjaGFuZ2VzKSBwcm92aWRlZCB0aGF0OgorICoKKyAqICAgMS4gZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXI7CisgKgorICogICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzOworICoKKyAqICAgMy4gdGhlIGNvcHlyaWdodCBob2xkZXIncyBuYW1lIGlzIG5vdCB1c2VkIHRvIGVuZG9yc2UgcHJvZHVjdHMKKyAqICAgICAgYnVpbHQgdXNpbmcgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAorICogbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKyAqCisgKiBESVNDTEFJTUVSCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCisgKiBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKKyAqIGFuZC9vciBmaXRuZXNzIGZvciBwdXJwb3NlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogU29tZSBjaGFuZ2VzIGZyb20gdGhlIEdsYWRtYW4gdmVyc2lvbjoKKyAgICBzL1JJSk5EQUVMKGVfa2V5KS9FX0tFWS9nCisgICAgcy9SSUpOREFFTChkX2tleSkvRF9LRVkvZworKi8KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIEFFU19NSU5fS0VZX1NJWkUJMTYKKyNkZWZpbmUgQUVTX01BWF9LRVlfU0laRQkzMgorCisjZGVmaW5lIEFFU19CTE9DS19TSVpFCQkxNgorCisvKgorICogI2RlZmluZSBieXRlKHgsIG5yKSAoKHVuc2lnbmVkIGNoYXIpKCh4KSA+PiAobnIqOCkpKQorICovCitzdGF0aWMgaW5saW5lIHU4IGJ5dGUoY29uc3QgdTMyIHgsIGNvbnN0IHVuc2lnbmVkIG4pCit7CisJcmV0dXJuIHggPj4gKG4gPDwgMyk7Cit9CisKKyNkZWZpbmUgdTMyX2luKHgpIGxlMzJfdG9fY3B1KCooY29uc3QgX19sZTMyICopKHgpKQorCitzdHJ1Y3QgYWVzX2N0eAoreworCXUzMiBrZXlfbGVuZ3RoOworCXUzMiBFWzYwXTsKKwl1MzIgRFs2MF07Cit9OworCisjZGVmaW5lIEVfS0VZIGN0eC0+RQorI2RlZmluZSBEX0tFWSBjdHgtPkQKKworc3RhdGljIHU4IHBvd190YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IGxvZ190YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IHNieF90YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHU4IGlzYl90YWJbMjU2XSBfX2luaXRkYXRhOworc3RhdGljIHUzMiByY29fdGFiWzEwXTsKK3UzMiBhZXNfZnRfdGFiWzRdWzI1Nl07Cit1MzIgYWVzX2l0X3RhYls0XVsyNTZdOworCit1MzIgYWVzX2ZsX3RhYls0XVsyNTZdOwordTMyIGFlc19pbF90YWJbNF1bMjU2XTsKKworc3RhdGljIGlubGluZSB1OCBmX211bHQodTggYSwgdTggYikKK3sKKwl1OCBhYSA9IGxvZ190YWJbYV0sIGNjID0gYWEgKyBsb2dfdGFiW2JdOworCisJcmV0dXJuIHBvd190YWJbY2MgKyAoY2MgPCBhYSA/IDEgOiAwKV07Cit9CisKKyNkZWZpbmUgZmZfbXVsdChhLCBiKSAoYSAmJiBiID8gZl9tdWx0KGEsIGIpIDogMCkKKworI2RlZmluZSBsc19ib3goeCkJCQkJXAorCShhZXNfZmxfdGFiWzBdW2J5dGUoeCwgMCldIF4JCVwKKwkgYWVzX2ZsX3RhYlsxXVtieXRlKHgsIDEpXSBeCQlcCisJIGFlc19mbF90YWJbMl1bYnl0ZSh4LCAyKV0gXgkJXAorCSBhZXNfZmxfdGFiWzNdW2J5dGUoeCwgMyldKQorCitzdGF0aWMgdm9pZCBfX2luaXQgZ2VuX3RhYnModm9pZCkKK3sKKwl1MzIgaSwgdDsKKwl1OCBwLCBxOworCisJLyogbG9nIGFuZCBwb3dlciB0YWJsZXMgZm9yIEdGKDIqKjgpIGZpbml0ZSBmaWVsZCB3aXRoCisJICAgMHgwMTFiIGFzIG1vZHVsYXIgcG9seW5vbWlhbCAtIHRoZSBzaW1wbGVzdCBwcmltaXRpdmUKKwkgICByb290IGlzIDB4MDMsIHVzZWQgaGVyZSB0byBnZW5lcmF0ZSB0aGUgdGFibGVzICovCisKKwlmb3IgKGkgPSAwLCBwID0gMTsgaSA8IDI1NjsgKytpKSB7CisJCXBvd190YWJbaV0gPSAodTgpcDsKKwkJbG9nX3RhYltwXSA9ICh1OClpOworCisJCXAgXj0gKHAgPDwgMSkgXiAocCAmIDB4ODAgPyAweDAxYiA6IDApOworCX0KKworCWxvZ190YWJbMV0gPSAwOworCisJZm9yIChpID0gMCwgcCA9IDE7IGkgPCAxMDsgKytpKSB7CisJCXJjb190YWJbaV0gPSBwOworCisJCXAgPSAocCA8PCAxKSBeIChwICYgMHg4MCA/IDB4MDFiIDogMCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisJCXAgPSAoaSA/IHBvd190YWJbMjU1IC0gbG9nX3RhYltpXV0gOiAwKTsKKwkJcSA9ICgocCA+PiA3KSB8IChwIDw8IDEpKSBeICgocCA+PiA2KSB8IChwIDw8IDIpKTsKKwkJcCBePSAweDYzIF4gcSBeICgocSA+PiA2KSB8IChxIDw8IDIpKTsKKwkJc2J4X3RhYltpXSA9IHA7CisJCWlzYl90YWJbcF0gPSAodTgpaTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKwkJcCA9IHNieF90YWJbaV07CisKKwkJdCA9IHA7CisJCWFlc19mbF90YWJbMF1baV0gPSB0OworCQlhZXNfZmxfdGFiWzFdW2ldID0gcm9sMzIodCwgOCk7CisJCWFlc19mbF90YWJbMl1baV0gPSByb2wzMih0LCAxNik7CisJCWFlc19mbF90YWJbM11baV0gPSByb2wzMih0LCAyNCk7CisKKwkJdCA9ICgodTMyKWZmX211bHQoMiwgcCkpIHwKKwkJICAgICgodTMyKXAgPDwgOCkgfAorCQkgICAgKCh1MzIpcCA8PCAxNikgfCAoKHUzMilmZl9tdWx0KDMsIHApIDw8IDI0KTsKKworCQlhZXNfZnRfdGFiWzBdW2ldID0gdDsKKwkJYWVzX2Z0X3RhYlsxXVtpXSA9IHJvbDMyKHQsIDgpOworCQlhZXNfZnRfdGFiWzJdW2ldID0gcm9sMzIodCwgMTYpOworCQlhZXNfZnRfdGFiWzNdW2ldID0gcm9sMzIodCwgMjQpOworCisJCXAgPSBpc2JfdGFiW2ldOworCisJCXQgPSBwOworCQlhZXNfaWxfdGFiWzBdW2ldID0gdDsKKwkJYWVzX2lsX3RhYlsxXVtpXSA9IHJvbDMyKHQsIDgpOworCQlhZXNfaWxfdGFiWzJdW2ldID0gcm9sMzIodCwgMTYpOworCQlhZXNfaWxfdGFiWzNdW2ldID0gcm9sMzIodCwgMjQpOworCisJCXQgPSAoKHUzMilmZl9tdWx0KDE0LCBwKSkgfAorCQkgICAgKCh1MzIpZmZfbXVsdCg5LCBwKSA8PCA4KSB8CisJCSAgICAoKHUzMilmZl9tdWx0KDEzLCBwKSA8PCAxNikgfAorCQkgICAgKCh1MzIpZmZfbXVsdCgxMSwgcCkgPDwgMjQpOworCisJCWFlc19pdF90YWJbMF1baV0gPSB0OworCQlhZXNfaXRfdGFiWzFdW2ldID0gcm9sMzIodCwgOCk7CisJCWFlc19pdF90YWJbMl1baV0gPSByb2wzMih0LCAxNik7CisJCWFlc19pdF90YWJbM11baV0gPSByb2wzMih0LCAyNCk7CisJfQorfQorCisjZGVmaW5lIHN0YXJfeCh4KSAoKCh4KSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4gKCgoKHgpICYgMHg4MDgwODA4MCkgPj4gNykgKiAweDFiKQorCisjZGVmaW5lIGltaXhfY29sKHksIHgpCQkJXAorCXUgICAgPSBzdGFyX3goeCk7CQlcCisJdiAgICA9IHN0YXJfeCh1KTsJCVwKKwl3ICAgID0gc3Rhcl94KHYpOwkJXAorCXQgICAgPSB3IF4gKHgpOwkJCVwKKwkoeSkgID0gdSBeIHYgXiB3OwkJXAorCSh5KSBePSByb3IzMih1IF4gdCwgIDgpIF4JXAorCSAgICAgICByb3IzMih2IF4gdCwgMTYpIF4JXAorCSAgICAgICByb3IzMih0LCAyNCkKKworLyogaW5pdGlhbGlzZSB0aGUga2V5IHNjaGVkdWxlIGZyb20gdGhlIHVzZXIgc3VwcGxpZWQga2V5ICovCisKKyNkZWZpbmUgbG9vcDQoaSkJCQkJCVwKK3sJCQkJCQkJXAorCXQgPSByb3IzMih0LCAgOCk7IHQgPSBsc19ib3godCkgXiByY29fdGFiW2ldOwlcCisJdCBePSBFX0tFWVs0ICogaV07ICAgICBFX0tFWVs0ICogaSArIDRdID0gdDsJXAorCXQgXj0gRV9LRVlbNCAqIGkgKyAxXTsgRV9LRVlbNCAqIGkgKyA1XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzQgKiBpICsgMl07IEVfS0VZWzQgKiBpICsgNl0gPSB0OwlcCisJdCBePSBFX0tFWVs0ICogaSArIDNdOyBFX0tFWVs0ICogaSArIDddID0gdDsJXAorfQorCisjZGVmaW5lIGxvb3A2KGkpCQkJCQlcCit7CQkJCQkJCVwKKwl0ID0gcm9yMzIodCwgIDgpOyB0ID0gbHNfYm94KHQpIF4gcmNvX3RhYltpXTsJXAorCXQgXj0gRV9LRVlbNiAqIGldOyAgICAgRV9LRVlbNiAqIGkgKyA2XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzYgKiBpICsgMV07IEVfS0VZWzYgKiBpICsgN10gPSB0OwlcCisJdCBePSBFX0tFWVs2ICogaSArIDJdOyBFX0tFWVs2ICogaSArIDhdID0gdDsJXAorCXQgXj0gRV9LRVlbNiAqIGkgKyAzXTsgRV9LRVlbNiAqIGkgKyA5XSA9IHQ7CVwKKwl0IF49IEVfS0VZWzYgKiBpICsgNF07IEVfS0VZWzYgKiBpICsgMTBdID0gdDsJXAorCXQgXj0gRV9LRVlbNiAqIGkgKyA1XTsgRV9LRVlbNiAqIGkgKyAxMV0gPSB0OwlcCit9CisKKyNkZWZpbmUgbG9vcDgoaSkJCQkJCVwKK3sJCQkJCQkJXAorCXQgPSByb3IzMih0LCAgOCk7IDsgdCA9IGxzX2JveCh0KSBeIHJjb190YWJbaV07CVwKKwl0IF49IEVfS0VZWzggKiBpXTsgICAgIEVfS0VZWzggKiBpICsgOF0gPSB0OwlcCisJdCBePSBFX0tFWVs4ICogaSArIDFdOyBFX0tFWVs4ICogaSArIDldID0gdDsJXAorCXQgXj0gRV9LRVlbOCAqIGkgKyAyXTsgRV9LRVlbOCAqIGkgKyAxMF0gPSB0OwlcCisJdCBePSBFX0tFWVs4ICogaSArIDNdOyBFX0tFWVs4ICogaSArIDExXSA9IHQ7CVwKKwl0ICA9IEVfS0VZWzggKiBpICsgNF0gXiBsc19ib3godCk7CQlcCisJRV9LRVlbOCAqIGkgKyAxMl0gPSB0OwkJCQlcCisJdCBePSBFX0tFWVs4ICogaSArIDVdOyBFX0tFWVs4ICogaSArIDEzXSA9IHQ7CVwKKwl0IF49IEVfS0VZWzggKiBpICsgNl07IEVfS0VZWzggKiBpICsgMTRdID0gdDsJXAorCXQgXj0gRV9LRVlbOCAqIGkgKyA3XTsgRV9LRVlbOCAqIGkgKyAxNV0gPSB0OwlcCit9CisKK3N0YXRpYyBpbnQgYWVzX3NldF9rZXkodm9pZCAqY3R4X2FyZywgY29uc3QgdTggKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sCisJCSAgICAgICB1MzIgKmZsYWdzKQoreworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBjdHhfYXJnOworCXUzMiBpLCBqLCB0LCB1LCB2LCB3OworCisJaWYgKGtleV9sZW4gIT0gMTYgJiYga2V5X2xlbiAhPSAyNCAmJiBrZXlfbGVuICE9IDMyKSB7CisJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKKworCURfS0VZW2tleV9sZW4gKyAyNF0gPSBFX0tFWVswXSA9IHUzMl9pbihpbl9rZXkpOworCURfS0VZW2tleV9sZW4gKyAyNV0gPSBFX0tFWVsxXSA9IHUzMl9pbihpbl9rZXkgKyA0KTsKKwlEX0tFWVtrZXlfbGVuICsgMjZdID0gRV9LRVlbMl0gPSB1MzJfaW4oaW5fa2V5ICsgOCk7CisJRF9LRVlba2V5X2xlbiArIDI3XSA9IEVfS0VZWzNdID0gdTMyX2luKGluX2tleSArIDEyKTsKKworCXN3aXRjaCAoa2V5X2xlbikgeworCWNhc2UgMTY6CisJCXQgPSBFX0tFWVszXTsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisJCQlsb29wNChpKTsKKwkJYnJlYWs7CisKKwljYXNlIDI0OgorCQlFX0tFWVs0XSA9IHUzMl9pbihpbl9rZXkgKyAxNik7CisJCXQgPSBFX0tFWVs1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCk7CisJCWZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJCQlsb29wNiAoaSk7CisJCWJyZWFrOworCisJY2FzZSAzMjoKKwkJRV9LRVlbNF0gPSB1MzJfaW4oaW5fa2V5ICsgMTYpOworCQlFX0tFWVs1XSA9IHUzMl9pbihpbl9rZXkgKyAyMCk7CisJCUVfS0VZWzZdID0gdTMyX2luKGluX2tleSArIDI0KTsKKwkJdCA9IEVfS0VZWzddID0gdTMyX2luKGluX2tleSArIDI4KTsKKwkJZm9yIChpID0gMDsgaSA8IDc7ICsraSkKKwkJCWxvb3A4KGkpOworCQlicmVhazsKKwl9CisKKwlEX0tFWVswXSA9IEVfS0VZW2tleV9sZW4gKyAyNF07CisJRF9LRVlbMV0gPSBFX0tFWVtrZXlfbGVuICsgMjVdOworCURfS0VZWzJdID0gRV9LRVlba2V5X2xlbiArIDI2XTsKKwlEX0tFWVszXSA9IEVfS0VZW2tleV9sZW4gKyAyN107CisKKwlmb3IgKGkgPSA0OyBpIDwga2V5X2xlbiArIDI0OyArK2kpIHsKKwkJaiA9IGtleV9sZW4gKyAyNCAtIChpICYgfjMpICsgKGkgJiAzKTsKKwkJaW1peF9jb2woRF9LRVlbal0sIEVfS0VZW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHZvaWQgYWVzX2VuY3J5cHQodm9pZCAqY3R4X2FyZywgdTggKm91dCwgY29uc3QgdTggKmluKTsKK2V4dGVybiB2b2lkIGFlc19kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHU4ICpvdXQsIGNvbnN0IHU4ICppbik7CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0geworCS5jcmFfbmFtZQkJPQkiYWVzIiwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9DSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgYWVzX2N0eCksCisJLmNyYV9tb2R1bGUJCT0JVEhJU19NT0RVTEUsCisJLmNyYV9saXN0CQk9CUxJU1RfSEVBRF9JTklUKGFlc19hbGcuY3JhX2xpc3QpLAorCS5jcmFfdQkJCT0JeworCQkuY2lwaGVyID0geworCQkJLmNpYV9taW5fa2V5c2l6ZQk9CUFFU19NSU5fS0VZX1NJWkUsCisJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKKwkJCS5jaWFfc2V0a2V5CSAgIAk9IAlhZXNfc2V0X2tleSwKKwkJCS5jaWFfZW5jcnlwdAkgCT0JYWVzX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJICAJPQlhZXNfZGVjcnlwdAorCQl9CisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgYWVzX2luaXQodm9pZCkKK3sKKwlnZW5fdGFicygpOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFlc19maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKK30KKworbW9kdWxlX2luaXQoYWVzX2luaXQpOworbW9kdWxlX2V4aXQoYWVzX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlJpam5kYWVsIChBRVMpIENpcGhlciBBbGdvcml0aG0iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCmluZGV4IGYzY2EwZGIuLmNjOTM1NDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJLnF1YWQgY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUJLyogMjgwICovCiAJLnF1YWQgY29tcGF0X3N5c19tcV9ub3RpZnkKIAkucXVhZCBjb21wYXRfc3lzX21xX2dldHNldGF0dHIKLQkucXVhZCBxdWlldF9uaV9zeXNjYWxsCQkvKiByZXNlcnZlZCBmb3Iga2V4ZWMgKi8KKwkucXVhZCBjb21wYXRfc3lzX2tleGVjX2xvYWQJLyogcmVzZXJ2ZWQgZm9yIGtleGVjICovCiAJLnF1YWQgY29tcGF0X3N5c193YWl0aWQKIAkucXVhZCBxdWlldF9uaV9zeXNjYWxsCQkvKiBzeXNfYWx0cm9vdCAqLwogCS5xdWFkIHN5c19hZGRfa2V5CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNWNhNGE0NS4uNDhmOWUyYyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQAogb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBhcGljLm8gIG5taS5vCiBvYmotJChDT05GSUdfWDg2X0lPX0FQSUMpCSs9IGlvX2FwaWMubyBtcHBhcnNlLm8gXAogCQlnZW5hcGljLm8gZ2VuYXBpY19jbHVzdGVyLm8gZ2VuYXBpY19mbGF0Lm8KK29iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubyBjcmFzaC5vCiBvYmotJChDT05GSUdfUE0pCQkrPSBzdXNwZW5kLm8KIG9iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzdXNwZW5kX2FzbS5vCiBvYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkrPSBjcHVmcmVxLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvd2FrZXVwLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS93YWtldXAuUwppbmRleCBhNGM2MzAwLi4xODVmYWE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS93YWtldXAuUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtNjcsNyArNjcsNyBAQAogCXNobGwJJDQsICVlYXgKIAlhZGRsCSQoZ2R0YSAtIHdha2V1cF9jb2RlKSwgJWVheAogCW1vdmwJJWVheCwgZ2R0XzQ4YSArMiAtIHdha2V1cF9jb2RlCi0JbGdkdAklZHM6Z2R0XzQ4YSAtIHdha2V1cF9jb2RlCQkjIGxvYWQgZ2R0IHdpdGggd2hhdGV2ZXIgaXMKKwlsZ2R0bAklZHM6Z2R0XzQ4YSAtIHdha2V1cF9jb2RlCSMgbG9hZCBnZHQgd2l0aCB3aGF0ZXZlciBpcwogCQkJCQkJIyBhcHByb3ByaWF0ZQogCiAJbW92bAkkMSwgJWVheAkJCSMgcHJvdGVjdGVkIG1vZGUgKFBFKSBiaXQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCmluZGV4IGY4ZTZjYzQuLjM3NWQzNjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJfQogfQogCi12b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUModm9pZCkKK3ZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyhpbnQgdmlydF93aXJlX3NldHVwKQogewogCWlmIChwaWNfbW9kZSkgewogCQkvKgpAQCAtMTQ2LDYgKzE0Niw0MiBAQAogCQlvdXRiKDB4NzAsIDB4MjIpOwogCQlvdXRiKDB4MDAsIDB4MjMpOwogCX0KKwllbHNlIHsKKwkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOworCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCQl2YWx1ZSB8PSAweGY7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCisJCWlmICghdmlydF93aXJlX3NldHVwKSB7CisJCQkvKiBGb3IgTFZUMCBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgZXh0ZXJuYWwgYW5kIGVuYWJsZWQgKi8KKwkJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7CisJCQl2YWx1ZSAmPSB+KEFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAorCQkJCUFQSUNfSU5QVVRfUE9MQVJJVFkgfCBBUElDX0xWVF9SRU1PVEVfSVJSIHwKKwkJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEICk7CisJCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7CisJCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9FWFRJTlQpOworCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2YWx1ZSk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBEaXNhYmxlIExWVDAgKi8KKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJfQorCisJCS8qIEZvciBMVlQxIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBubWkgYW5kIGVuYWJsZWQgKi8KKwkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKKwkJdmFsdWUgJj0gfigKKwkJCUFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAorCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAorCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCk7CisJCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKKwkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7CisJfQogfQogCiB2b2lkIGRpc2FibGVfbG9jYWxfQVBJQyh2b2lkKQpAQCAtMjg1LDcgKzMyMSw3IEBACiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX2xvY2FsX0FQSUMgKHZvaWQpCit2b2lkIF9fY3B1aW5pdCBzZXR1cF9sb2NhbF9BUElDICh2b2lkKQogewogCXVuc2lnbmVkIGludCB2YWx1ZSwgdmVyLCBtYXhsdnQ7CiAKQEAgLTUzNCw3ICs1NzAsNyBAQAogCS5jbHMJCT0gJmxhcGljX3N5c2NsYXNzLAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGFwaWNfcG1fYWN0aXZhdGUodm9pZCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpCiB7CiAJYXBpY19wbV9zdGF0ZS5hY3RpdmUgPSAxOwogfQpAQCAtNzc0LDE0ICs4MTAsMTQgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKLXZvaWQgX19pbml0IHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKHZvaWQpCit2b2lkIF9fY3B1aW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQogewogCWxvY2FsX2lycV9kaXNhYmxlKCk7IC8qIEZJWE1FOiBEbyB3ZSBuZWVkIHRoaXM/IC0tUlIgKi8KIAlzZXR1cF9BUElDX3RpbWVyKGNhbGlicmF0aW9uX3Jlc3VsdCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogfQogCi12b2lkIF9faW5pdCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCkKK3ZvaWQgX19jcHVpbml0IGRpc2FibGVfQVBJQ190aW1lcih2b2lkKQogewogCWlmICh1c2luZ19hcGljX3RpbWVyKSB7CiAJCXVuc2lnbmVkIGxvbmcgdjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmYTQyNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9jcmFzaC5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgKHg4Nl82NCkgZnVuY3Rpb25zIGZvciBrZXhlYyBiYXNlZCBjcmFzaCBkdW1wcy4KKyAqCisgKiBDcmVhdGVkIGJ5OiBIYXJpcHJhc2FkIE5lbGxpdGhlZXJ0aGEgKGhhcmlAaW4uaWJtLmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxhc20vbm1pLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgorCitub3RlX2J1Zl90IGNyYXNoX25vdGVzW05SX0NQVVNdOworCit2b2lkIG1hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZnRlciB0aGUgc3lzdGVtCisJICogaGFzIHBhbmljZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCisJICogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgdG8gYWxsb3cgYSBrZXhlYydkIGtlcm5lbAorCSAqIHRvIHJ1biBzdWNjZXNzZnVsbHkgbmVlZHMgdG8gaGFwcGVuIGhlcmUuCisJICoKKwkgKiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHNob290aW5nIGRvd24gdGhlIG90aGVyIGNwdXMgaW4KKwkgKiBhbiBTTVAgc3lzdGVtLgorCSAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKaW5kZXggN2MxNTRkZi4uNmRlZDNhNSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgpAQCAtMTkxLDggKzE5Miw2IEBACiAJaW50IGk7CiAJZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyZXM7Ci0JCWlmIChlODIwLm1hcFtpXS5hZGRyICsgZTgyMC5tYXBbaV0uc2l6ZSA+IDB4MTAwMDAwMDAwVUxMKQotCQkJY29udGludWU7CiAJCXJlcyA9IGFsbG9jX2Jvb3RtZW1fbG93KHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKIAkJc3dpdGNoIChlODIwLm1hcFtpXS50eXBlKSB7CiAJCWNhc2UgRTgyMF9SQU06CXJlcy0+bmFtZSA9ICJTeXN0ZW0gUkFNIjsgYnJlYWs7CkBAIC0yMTIsNiArMjExLDkgQEAKIAkJCSAqLwogCQkJcmVxdWVzdF9yZXNvdXJjZShyZXMsICZjb2RlX3Jlc291cmNlKTsKIAkJCXJlcXVlc3RfcmVzb3VyY2UocmVzLCAmZGF0YV9yZXNvdXJjZSk7CisjaWZkZWYgQ09ORklHX0tFWEVDCisJCQlyZXF1ZXN0X3Jlc291cmNlKHJlcywgJmNyYXNoa19yZXMpOworI2VuZGlmCiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKaW5kZXggYjRjYmJhZC4uMjgyODQ2OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwpAQCAtNyw2ICs3LDggQEAKICAqIEhhY2tlZCBmb3IgeDg2LTY0IGJ5IEphbWVzIENsZXZlcmRvbiBmcm9tIGkzODYgYXJjaGl0ZWN0dXJlIGNvZGUgYnkKICAqIE1hcnRpbiBCbGlnaCwgQW5kaSBLbGVlbiwgSmFtZXMgQm90dG9tbGV5LCBKb2huIFN0dWx0eiwgYW5kCiAgKiBKYW1lcyBDbGV2ZXJkb24uCisgKiBBc2hvayBSYWogPGFzaG9rLnJhakBpbnRlbC5jb20+CisgKiAJUmVtb3ZlZCBJUEkgYnJvYWRjYXN0IHNob3J0Y3V0IHRvIHN1cHBvcnQgQ1BVIGhvdHBsdWcKICAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KQEAgLTE4LDYgKzIwLDQ2IEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9pcGkuaD4KIAorLyoKKyAqIFRoZSBmb2xsb3dpbmcgcGVybWl0IGNob29zaW5nIGJyb2FkY2FzdCBJUEkgc2hvcnRjdXQgdi5zIHNlbmRpbmcgSVBJIG9ubHkKKyAqIHRvIG9ubGluZSBjcHVzIHZpYSB0aGUgc2VuZF9JUElfbWFzayB2YXJpZW50LgorICogVGhlIG1hc2sgdmVyc2lvbiBpcyBteSBwcmVmZXJyZWQgb3B0aW9uLCBzaW5jZSBpdCBlbGltaW5hdGVzIGEgbG90IG9mCisgKiBvdGhlciBleHRyYSBjb2RlIHRoYXQgd291bGQgbmVlZCB0byBiZSB3cml0dGVuIHRvIGNsZWFudXAgaW50cnMgc2VudAorICogdG8gYSBDUFUgd2hpbGUgb2ZmbGluZS4KKyAqCisgKiBTZW5kaW5nIGJyb2FkY2FzdCBpbnRyb2R1Y2VzIGxvdHMgb2YgdHJvdWJsZSBpbiBDUFUgaG90cGx1ZyBzaXR1YXRpb25zLgorICogVGhlc2UgSVBJJ3MgYXJlIGRlbGl2ZXJlZCB0byBjcHUncyBpcnJlc3BlY3RpdmUgb2YgdGhlaXIgb2ZmbGluZSBzdGF0dXMKKyAqIGFuZCBjb3VsZCBwaWNrdXAgc3RhbGUgaW50ciBkYXRhIHdoZW4gdGhlc2UgQ1BVUyBhcmUgdHVybmVkIG9ubGluZS4KKyAqCisgKiBOb3QgdXNpbmcgYnJvYWRjYXN0IGlzIGEgY2xlYW5lciBhcHByb2FjaCBJTU8sIGJ1dCBBbmRpIEtsZWVuIGRpc2FncmVlcyB3aXRoCisgKiB0aGUgaWRlYSBvZiBub3QgdXNpbmcgYnJvYWRjYXN0IElQSSdzIGFueW1vcmUuIEhlbmNlIHRoZSBydW4gdGltZSBjaGVjaworICogaXMgaW50cm9kdWNlZCwgb24gaGlzIHJlcXVlc3Qgc28gd2UgY2FuIGNob29zZSBhbiBhbHRlcm5hdGUgbWVjaGFuaXNtLgorICoKKyAqIEluaXRpYWwgd2Fja3kgcGVyZm9ybWFuY2UgdGVzdHMgdGhhdCBjb2xsZWN0IGN5Y2xlIGNvdW50cyBzaG93CisgKiBubyBpbmNyZWFzZSBpbiB1c2luZyBtYXNrIHYucyBicm9hZGNhc3QgdmVyc2lvbi4gSW4gZmFjdCB0aGV5IHNlZW0KKyAqIGlkZW50aWNhbCBpbiB0ZXJtcyBvZiBjeWNsZSBjb3VudHMuCisgKgorICogaWYgd2UgbmVlZCB0byB1c2UgYnJvYWRjYXN0LCB3ZSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmcuCisgKgorICogY2xpOworICogaG9sZCBjYWxsX2xvY2s7CisgKiBjbGVhciBhbnkgcGVuZGluZyBJUEksIGp1c3QgYWNrIGFuZCBjbGVhciBhbGwgcGVuZGluZyBpbnRyCisgKiBzZXQgY3B1X29ubGluZV9tYXA7CisgKiByZWxlYXNlIGNhbGxfbG9jazsKKyAqIHN0aTsKKyAqCisgKiBUaGUgY29tcGxpY2F0ZWQgZHVtbXkgaXJxIHByb2Nlc3Npbmcgc2hvd24gYWJvdmUgaXMgbm90IHJlcXVpcmVkIGlmCisgKiB3ZSBkaWRudCBzZW50IElQSSdzIHRvIHdyb25nIENQVSdzIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAqCisgKiAtIEFzaG9rIFJhaiA8YXNob2sucmFqQGludGVsLmNvbT4KKyAqLworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorI2RlZmluZSBERUZBVUxUX1NFTkRfSVBJCSgxKQorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9TRU5EX0lQSQkoMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IG5vX2Jyb2FkY2FzdD1ERUZBVUxUX1NFTkRfSVBJOwogCiBzdGF0aWMgY3B1bWFza190IGZsYXRfdGFyZ2V0X2NwdXModm9pZCkKIHsKQEAgLTQ1LDIyICs4Nyw2IEBACiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MRFIsIHZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQotewotCS8qCi0JICogaWYgdGhlcmUgYXJlIG5vIG90aGVyIENQVXMgaW4gdGhlIHN5c3RlbSB0aGVuCi0JICogd2UgZ2V0IGFuIEFQSUMgc2VuZCBlcnJvciBpZiB3ZSB0cnkgdG8gYnJvYWRjYXN0LgotCSAqIHRodXMgd2UgaGF2ZSB0byBhdm9pZCBzZW5kaW5nIElQSXMgaW4gdGhpcyBjYXNlLgotCSAqLwotCWlmIChudW1fb25saW5lX2NwdXMoKSA+IDEpCi0JCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX0FMTEJVVCwgdmVjdG9yLCBBUElDX0RFU1RfTE9HSUNBTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCi17Ci0JX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMSU5DLCB2ZWN0b3IsIEFQSUNfREVTVF9MT0dJQ0FMKTsKLX0KLQogc3RhdGljIHZvaWQgZmxhdF9zZW5kX0lQSV9tYXNrKGNwdW1hc2tfdCBjcHVtYXNrLCBpbnQgdmVjdG9yKQogewogCXVuc2lnbmVkIGxvbmcgbWFzayA9IGNwdXNfYWRkcihjcHVtYXNrKVswXTsKQEAgLTkzLDYgKzExOSwzOSBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fbG9jYWxfZmxhdF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCit7CisJaWYgKG5vX2Jyb2FkY2FzdCkgeworCQljcHVtYXNrX3QgbWFzayA9IGNwdV9vbmxpbmVfbWFwOworCQlpbnQgdGhpc19jcHUgPSBnZXRfY3B1KCk7CisKKwkJY3B1X2NsZWFyKHRoaXNfY3B1LCBtYXNrKTsKKwkJZmxhdF9zZW5kX0lQSV9tYXNrKG1hc2ssIHZlY3Rvcik7CisJCXB1dF9jcHUoKTsKKwl9CisJZWxzZQorCQlfX3NlbmRfSVBJX3Nob3J0Y3V0KEFQSUNfREVTVF9BTExCVVQsIHZlY3RvciwgQVBJQ19ERVNUX0xPR0lDQUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19sb2NhbF9mbGF0X3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQoreworCWlmIChub19icm9hZGNhc3QpCisJCWZsYXRfc2VuZF9JUElfbWFzayhjcHVfb25saW5lX21hcCwgdmVjdG9yKTsKKwllbHNlCisJCV9fc2VuZF9JUElfc2hvcnRjdXQoQVBJQ19ERVNUX0FMTElOQywgdmVjdG9yLCBBUElDX0RFU1RfTE9HSUNBTCk7Cit9CisKK3N0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQoreworCWlmICgoKG51bV9vbmxpbmVfY3B1cygpKSAtIDEpID49IDEpCisJCV9fbG9jYWxfZmxhdF9zZW5kX0lQSV9hbGxidXRzZWxmKHZlY3Rvcik7Cit9CisKK3N0YXRpYyB2b2lkIGZsYXRfc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCit7CisJX19sb2NhbF9mbGF0X3NlbmRfSVBJX2FsbCh2ZWN0b3IpOworfQorCiBzdGF0aWMgaW50IGZsYXRfYXBpY19pZF9yZWdpc3RlcmVkKHZvaWQpCiB7CiAJcmV0dXJuIHBoeXNpZF9pc3NldChHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CkBAIC0xMTEsNiArMTcwLDE2IEBACiAJcmV0dXJuICgoZWJ4ID4+IDI0KSAmIDB4RkYpID4+IGluZGV4X21zYjsKIH0KIAorc3RhdGljIF9faW5pdCBpbnQgbm9faXBpX2Jyb2FkY2FzdChjaGFyICpzdHIpCit7CisJZ2V0X29wdGlvbigmc3RyLCAmbm9fYnJvYWRjYXN0KTsKKwlwcmludGsgKCJVc2luZyAlcyBtb2RlXG4iLCBub19icm9hZGNhc3QgPyAiTm8gSVBJIEJyb2FkY2FzdCIgOgorCQkJCQkJCQkJCQkiSVBJIEJyb2FkY2FzdCIpOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub19pcGlfYnJvYWRjYXN0Iiwgbm9faXBpX2Jyb2FkY2FzdCk7CisKIHN0cnVjdCBnZW5hcGljIGFwaWNfZmxhdCA9ICB7CiAJLm5hbWUgPSAiZmxhdCIsCiAJLmludF9kZWxpdmVyeV9tb2RlID0gZGVzdF9Mb3dlc3RQcmlvLApAQCAtMTI1LDMgKzE5NCwxMiBAQAogCS5jcHVfbWFza190b19hcGljaWQgPSBmbGF0X2NwdV9tYXNrX3RvX2FwaWNpZCwKIAkucGh5c19wa2dfaWQgPSBwaHlzX3BrZ19pZCwKIH07CisKK3N0YXRpYyBpbnQgX19pbml0IHByaW50X2lwaV9tb2RlKHZvaWQpCit7CisJcHJpbnRrICgiVXNpbmcgSVBJICVzIG1vZGVcbiIsIG5vX2Jyb2FkY2FzdCA/ICJOby1TaG9ydGN1dCIgOgorCQkJCQkJCQkJCQkiU2hvcnRjdXQiKTsKKwlyZXR1cm4gMDsKK30KKworbGF0ZV9pbml0Y2FsbChwcmludF9pcGlfbW9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwppbmRleCA5YmQyZTdhLi44ZDc2NWFhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKQEAgLTI0OCwyMyArMjQ4LDIzIEBACiAJICovCiAub3JnIDB4MTAwMAogRU5UUlkoaW5pdF9sZXZlbDRfcGd0KQotCS5xdWFkCTB4MDAwMDAwMDAwMDEwMjAwNwkJLyogLT4gbGV2ZWwzX2lkZW50X3BndCAqLworCS5xdWFkCTB4MDAwMDAwMDAwMDAwMjAwNyArIF9fUEhZU0lDQUxfU1RBUlQJLyogLT4gbGV2ZWwzX2lkZW50X3BndCAqLwogCS5maWxsCTI1NSw4LDAKLQkucXVhZAkweDAwMDAwMDAwMDAxMGEwMDcKKwkucXVhZAkweDAwMDAwMDAwMDAwMGEwMDcgKyBfX1BIWVNJQ0FMX1NUQVJUCiAJLmZpbGwJMjU0LDgsMAogCS8qICgyXjQ4LSgyKjEwMjQqMTAyNCoxMDI0KSkvKDJeMzkpID0gNTExICovCi0JLnF1YWQJMHgwMDAwMDAwMDAwMTAzMDA3CQkvKiAtPiBsZXZlbDNfa2VybmVsX3BndCAqLworCS5xdWFkCTB4MDAwMDAwMDAwMDAwMzAwNyArIF9fUEhZU0lDQUxfU1RBUlQJLyogLT4gbGV2ZWwzX2tlcm5lbF9wZ3QgKi8KIAogLm9yZyAweDIwMDAKIEVOVFJZKGxldmVsM19pZGVudF9wZ3QpCi0JLnF1YWQJMHgwMDAwMDAwMDAwMTA0MDA3CisJLnF1YWQJMHgwMDAwMDAwMDAwMDA0MDA3ICsgX19QSFlTSUNBTF9TVEFSVAogCS5maWxsCTUxMSw4LDAKIAogLm9yZyAweDMwMDAKIEVOVFJZKGxldmVsM19rZXJuZWxfcGd0KQogCS5maWxsCTUxMCw4LDAKIAkvKiAoMl40OC0oMioxMDI0KjEwMjQqMTAyNCktKCgyXjM5KSo1MTEpKS8oMl4zMCkgPSA1MTAgKi8KLQkucXVhZAkweDAwMDAwMDAwMDAxMDUwMDcJCS8qIC0+IGxldmVsMl9rZXJuZWxfcGd0ICovCisJLnF1YWQJMHgwMDAwMDAwMDAwMDA1MDA3ICsgX19QSFlTSUNBTF9TVEFSVAkvKiAtPiBsZXZlbDJfa2VybmVsX3BndCAqLwogCS5maWxsCTEsOCwwCiAKIC5vcmcgMHg0MDAwCkBAIC0zMzcsMTcgKzMzNywxNyBAQAogCiAub3JnIDB4YTAwMAogRU5UUlkobGV2ZWwzX3BoeXNtZW1fcGd0KQotCS5xdWFkCTB4MDAwMDAwMDAwMDEwNTAwNwkJLyogLT4gbGV2ZWwyX2tlcm5lbF9wZ3QgKHNvIHRoYXQgX192YSB3b3JrcyBldmVuIGJlZm9yZSBwYWdldGFibGVfaW5pdCkgKi8KKwkucXVhZAkweDAwMDAwMDAwMDAwMDUwMDcgKyBfX1BIWVNJQ0FMX1NUQVJUCS8qIC0+IGxldmVsMl9rZXJuZWxfcGd0IChzbyB0aGF0IF9fdmEgd29ya3MgZXZlbiBiZWZvcmUgcGFnZXRhYmxlX2luaXQpICovCiAKIAkub3JnIDB4YjAwMAogI2lmZGVmIENPTkZJR19BQ1BJX1NMRUVQCiBFTlRSWSh3YWtldXBfbGV2ZWw0X3BndCkKLQkucXVhZAkweDAwMDAwMDAwMDAxMDIwMDcJCS8qIC0+IGxldmVsM19pZGVudF9wZ3QgKi8KKwkucXVhZAkweDAwMDAwMDAwMDAwMDIwMDcgKyBfX1BIWVNJQ0FMX1NUQVJUCS8qIC0+IGxldmVsM19pZGVudF9wZ3QgKi8KIAkuZmlsbAkyNTUsOCwwCi0JLnF1YWQJMHgwMDAwMDAwMDAwMTBhMDA3CisJLnF1YWQJMHgwMDAwMDAwMDAwMDBhMDA3ICsgX19QSFlTSUNBTF9TVEFSVAogCS5maWxsCTI1NCw4LDAKIAkvKiAoMl40OC0oMioxMDI0KjEwMjQqMTAyNCkpLygyXjM5KSA9IDUxMSAqLwotCS5xdWFkCTB4MDAwMDAwMDAwMDEwMzAwNwkJLyogLT4gbGV2ZWwzX2tlcm5lbF9wZ3QgKi8KKwkucXVhZAkweDAwMDAwMDAwMDAwMDMwMDcgKyBfX1BIWVNJQ0FMX1NUQVJUCS8qIC0+IGxldmVsM19rZXJuZWxfcGd0ICovCiAjZW5kaWYKIAogCS5kYXRhCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODZfNjQva2VybmVsL2kzODcuYwppbmRleCBiYTEzOWNhLi5kOWIyMmI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pMzg3LmMKQEAgLTQyLDcgKzQyLDcgQEAKICAqIENhbGxlZCBhdCBib290dXAgdG8gc2V0IHVwIHRoZSBpbml0aWFsIEZQVSBzdGF0ZSB0aGF0IGlzIGxhdGVyIGNsb25lZAogICogaW50byBhbGwgcHJvY2Vzc2VzLgogICovCi12b2lkIF9faW5pdCBmcHVfaW5pdCh2b2lkKQordm9pZCBfX2NwdWluaXQgZnB1X2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIG9sZGNyMCA9IHJlYWRfY3IwKCk7CiAJZXh0ZXJuIHZvaWQgX19iYWRfZnhzYXZlX2FsaWdubWVudCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKaW5kZXggMTllYWZhMC4uYTg5MTY5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKQEAgLTQxNCwxMCArNDE0LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaTgyNTlBX3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJLyogUHV0IHRoZSBpODI1OUEgaW50byBhIHF1aWVzY2VudCBzdGF0ZSB0aGF0CisJICogdGhlIGtlcm5lbCBpbml0aWFsaXphdGlvbiBjb2RlIGNhbiBnZXQgaXQKKwkgKiBvdXQgb2YuCisJICovCisJb3V0YigweGZmLCAweDIxKTsJLyogbWFzayBhbGwgb2YgODI1OUEtMSAqLworCW91dGIoMHhmZiwgMHhBMSk7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgaTgyNTlfc3lzZGV2X2NsYXNzID0gewogCXNldF9rc2V0X25hbWUoImk4MjU5IiksCiAJLnN1c3BlbmQgPSBpODI1OUFfc3VzcGVuZCwKIAkucmVzdW1lID0gaTgyNTlBX3Jlc3VtZSwKKwkuc2h1dGRvd24gPSBpODI1OUFfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgZGV2aWNlX2k4MjU5QSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IGFmZDg3ZTYuLmQyMDZkN2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtMzMwLDcgKzMzMCw3IEBACiAvKgogICogRmluZCB0aGUgcGluIHRvIHdoaWNoIElSUVtpcnFdIChJU0EpIGlzIGNvbm5lY3RlZAogICovCi1zdGF0aWMgaW50IF9faW5pdCBmaW5kX2lzYV9pcnFfcGluKGludCBpcnEsIGludCB0eXBlKQorc3RhdGljIGludCBmaW5kX2lzYV9pcnFfcGluKGludCBpcnEsIGludCB0eXBlKQogewogCWludCBpOwogCkBAIC0xMDY0LDcgKzEwNjQsNiBAQAogCiB2b2lkIF9fYXBpY2RlYnVnaW5pdCBwcmludF9QSUModm9pZCkKIHsKLQlleHRlcm4gc3BpbmxvY2tfdCBpODI1OUFfbG9jazsKIAl1bnNpZ25lZCBpbnQgdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMTMyLDEyICsxMTMxLDQ0IEBACiAgKi8KIHZvaWQgZGlzYWJsZV9JT19BUElDKHZvaWQpCiB7CisJaW50IHBpbjsKIAkvKgogCSAqIENsZWFyIHRoZSBJTy1BUElDIGJlZm9yZSByZWJvb3Rpbmc6CiAJICovCiAJY2xlYXJfSU9fQVBJQygpOwogCi0JZGlzY29ubmVjdF9ic3BfQVBJQygpOworCS8qCisJICogSWYgdGhlIGk4MjU1OSBpcyByb3V0ZWQgdGhyb3VnaCBhbiBJT0FQSUMKKwkgKiBQdXQgdGhhdCBJT0FQSUMgaW4gdmlydHVhbCB3aXJlIG1vZGUKKwkgKiBzbyBsZWdhY3kgaW50ZXJydXBzIGNhbiBiZSBkZWxpdmVyZWQuCisJICovCisJcGluID0gZmluZF9pc2FfaXJxX3BpbigwLCBtcF9FeHRJTlQpOworCWlmIChwaW4gIT0gLTEpIHsKKwkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CisJCWVudHJ5Lm1hc2sgICAgICAgICAgICA9IDA7IC8qIEVuYWJsZWQgKi8KKwkJZW50cnkudHJpZ2dlciAgICAgICAgID0gMDsgLyogRWRnZSAqLworCQllbnRyeS5pcnIgICAgICAgICAgICAgPSAwOworCQllbnRyeS5wb2xhcml0eSAgICAgICAgPSAwOyAvKiBIaWdoICovCisJCWVudHJ5LmRlbGl2ZXJ5X3N0YXR1cyA9IDA7CisJCWVudHJ5LmRlc3RfbW9kZSAgICAgICA9IDA7IC8qIFBoeXNpY2FsICovCisJCWVudHJ5LmRlbGl2ZXJ5X21vZGUgICA9IDc7IC8qIEV4dEludCAqLworCQllbnRyeS52ZWN0b3IgICAgICAgICAgPSAwOworCQllbnRyeS5kZXN0LnBoeXNpY2FsLnBoeXNpY2FsX2Rlc3QgPSAwOworCisKKwkJLyoKKwkJICogQWRkIGl0IHRvIHRoZSBJTy1BUElDIGlycS1yb3V0aW5nIHRhYmxlOgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvX2FwaWNfd3JpdGUoMCwgMHgxMSsyKnBpbiwgKigoKGludCAqKSZlbnRyeSkrMSkpOworCQlpb19hcGljX3dyaXRlKDAsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlkaXNjb25uZWN0X2JzcF9BUElDKHBpbiAhPSAtMSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMKaW5kZXggNjJiMTEyZS4uY2MzZmI4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CiAKQEAgLTEwNiwzICsxMDcsMzEgQEAKIAlyZXR1cm4gMTsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQordm9pZCBmaXh1cF9pcnFzKGNwdW1hc2tfdCBtYXApCit7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdGF0aWMgaW50IHdhcm5lZDsKKworCWZvciAoaXJxID0gMDsgaXJxIDwgTlJfSVJRUzsgaXJxKyspIHsKKwkJY3B1bWFza190IG1hc2s7CisJCWlmIChpcnEgPT0gMikKKwkJCWNvbnRpbnVlOworCisJCWNwdXNfYW5kKG1hc2ssIGlycV9hZmZpbml0eVtpcnFdLCBtYXApOworCQlpZiAoYW55X29ubGluZV9jcHUobWFzaykgPT0gTlJfQ1BVUykgeworCQkJcHJpbnRrKCJCcmVha2luZyBhZmZpbml0eSBmb3IgaXJxICVpXG4iLCBpcnEpOworCQkJbWFzayA9IG1hcDsKKwkJfQorCQlpZiAoaXJxX2Rlc2NbaXJxXS5oYW5kbGVyLT5zZXRfYWZmaW5pdHkpCisJCQlpcnFfZGVzY1tpcnFdLmhhbmRsZXItPnNldF9hZmZpbml0eShpcnEsIG1hc2spOworCQllbHNlIGlmIChpcnFfZGVzY1tpcnFdLmFjdGlvbiAmJiAhKHdhcm5lZCsrKSkKKwkJCXByaW50aygiQ2Fubm90IHNldCBhZmZpbml0eSBmb3IgaXJxICVpXG4iLCBpcnEpOworCX0KKworCS8qIFRoYXQgZG9lc24ndCBzZWVtIHN1ZmZpY2llbnQuICBHaXZlIGl0IDFtcy4gKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJbWRlbGF5KDEpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDRlNjgwZjguLjVjNmRjNzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2twcm9iZXMuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgpAQCAtNTEsOCArNTEsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcga3Byb2JlX3N0YXR1c19wcmV2LCBrcHJvYmVfb2xkX3JmbGFnc19wcmV2LCBrcHJvYmVfc2F2ZWRfcmZsYWdzX3ByZXY7CiBzdGF0aWMgc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CiBzdGF0aWMgbG9uZyAqanByb2JlX3NhdmVkX3JzcDsKLXN0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCk7Ci1zdGF0aWMgdm9pZCBmcmVlX2luc25fc2xvdChrcHJvYmVfb3Bjb2RlX3QgKnNsb3QpOwogdm9pZCBqcHJvYmVfcmV0dXJuX2VuZCh2b2lkKTsKIAogLyogY29weSBvZiB0aGUga2VybmVsIHN0YWNrIGF0IHRoZSBwcm9iZSBmaXJlIHRpbWUgKi8KQEAgLTI3NCw0OCArMjcyLDIzIEBACiAJCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKXAtPmFpbnNuLmluc247CiB9CiAKLXN0cnVjdCB0YXNrX3N0cnVjdCAgKmFyY2hfZ2V0X2twcm9iZV90YXNrKHZvaWQgKnB0cikKLXsKLQlyZXR1cm4gKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgKCgodW5zaWduZWQgbG9uZykgcHRyKSAmCi0JCQkJCSh+KFRIUkVBRF9TSVpFIC0xKSkpKS0+dGFzazsKLX0KLQogdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nICpzYXJhID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5yc3A7Ci0Jc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqcmk7Ci0Jc3RhdGljIHZvaWQgKm9yaWdfcmV0X2FkZHI7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwogCi0JLyoKLQkgKiBTYXZlIHRoZSByZXR1cm4gYWRkcmVzcyB3aGVuIHRoZSByZXR1cm4gcHJvYmUgaGl0cwotCSAqIHRoZSBmaXJzdCB0aW1lLCBhbmQgdXNlIGl0IHRvIHBvcHVsYXRlIHRoZSAoa3Jwcm9iZQotCSAqIGluc3RhbmNlKS0+cmV0X2FkZHIgZm9yIHN1YnNlcXVlbnQgcmV0dXJuIHByb2JlcyBhdAotCSAqIHRoZSBzYW1lIGFkZHJyZXNzIHNpbmNlIHN0YWNrIGFkZHJlc3Mgd291bGQgaGF2ZQotCSAqIHRoZSBrcmV0cHJvYmVfdHJhbXBvbGluZSBieSB0aGVuLgotCSAqLwotCWlmICgoKHZvaWQqKSAqc2FyYSkgIT0ga3JldHByb2JlX3RyYW1wb2xpbmUpCi0JCW9yaWdfcmV0X2FkZHIgPSAodm9pZCopICpzYXJhOworICAgICAgICBpZiAoKHJpID0gZ2V0X2ZyZWVfcnBfaW5zdChycCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByaS0+cnAgPSBycDsKKyAgICAgICAgICAgICAgICByaS0+dGFzayA9IGN1cnJlbnQ7CisJCXJpLT5yZXRfYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgKnNhcmE7CiAKLQlpZiAoKHJpID0gZ2V0X2ZyZWVfcnBfaW5zdChycCkpICE9IE5VTEwpIHsKLQkJcmktPnJwID0gcnA7Ci0JCXJpLT5zdGFja19hZGRyID0gc2FyYTsKLQkJcmktPnJldF9hZGRyID0gb3JpZ19yZXRfYWRkcjsKLQkJYWRkX3JwX2luc3QocmkpOwogCQkvKiBSZXBsYWNlIHRoZSByZXR1cm4gYWRkciB3aXRoIHRyYW1wb2xpbmUgYWRkciAqLwogCQkqc2FyYSA9ICh1bnNpZ25lZCBsb25nKSAma3JldHByb2JlX3RyYW1wb2xpbmU7Ci0JfSBlbHNlIHsKLQkJcnAtPm5taXNzZWQrKzsKLQl9Ci19CiAKLXZvaWQgYXJjaF9rcHJvYmVfZmx1c2hfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRrKQotewotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCXdoaWxlICgocmkgPSBnZXRfcnBfaW5zdF90c2sodGspKSAhPSBOVUxMKSB7Ci0JCSooKHVuc2lnbmVkIGxvbmcgKikocmktPnN0YWNrX2FkZHIpKSA9Ci0JCQkJCSh1bnNpZ25lZCBsb25nKSByaS0+cmV0X2FkZHI7Ci0JCXJlY3ljbGVfcnBfaW5zdChyaSk7Ci0JfQorICAgICAgICAgICAgICAgIGFkZF9ycF9pbnN0KHJpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBycC0+bm1pc3NlZCsrOworICAgICAgICB9CiB9CiAKIC8qCkBAIC00MjgsMzYgKzQwMSw1OSBAQAogICovCiBpbnQgdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXVuc2lnbmVkIGxvbmcgKnNhcmEgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcCAtIDE7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpID0gTlVMTDsKKyAgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisgICAgICAgIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgb3JpZ19yZXRfYWRkcmVzcyA9IDA7CisJdW5zaWduZWQgbG9uZyB0cmFtcG9saW5lX2FkZHJlc3MgPSh1bnNpZ25lZCBsb25nKSZrcmV0cHJvYmVfdHJhbXBvbGluZTsKIAotCXRzayA9IGFyY2hfZ2V0X2twcm9iZV90YXNrKHNhcmEpOwotCWhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKHRzayk7CisgICAgICAgIGhlYWQgPSBrcmV0cHJvYmVfaW5zdF90YWJsZV9oZWFkKGN1cnJlbnQpOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnkocmksIG5vZGUsIGhlYWQsIGhsaXN0KSB7Ci0JCWlmIChyaS0+c3RhY2tfYWRkciA9PSBzYXJhICYmIHJpLT5ycCkgewotCQkJaWYgKHJpLT5ycC0+aGFuZGxlcikKLQkJCQlyaS0+cnAtPmhhbmRsZXIocmksIHJlZ3MpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQorCS8qCisJICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKwkgKiB0YXNrIGVpdGhlciBiZWNhdXNlIGFuIG11bHRpcGxlIGZ1bmN0aW9ucyBpbiB0aGUgY2FsbCBwYXRoCisJICogaGF2ZSBhIHJldHVybiBwcm9iZSBpbnN0YWxsZWQgb24gdGhlbSwgYW5kL29yIG1vcmUgdGhlbiBvbmUgcmV0dXJuCisJICogcmV0dXJuIHByb2JlIHdhcyByZWdpc3RlcmVkIGZvciBhIHRhcmdldCBmdW5jdGlvbi4KKwkgKgorCSAqIFdlIGNhbiBoYW5kbGUgdGhpcyBiZWNhdXNlOgorCSAqICAgICAtIGluc3RhbmNlcyBhcmUgYWx3YXlzIGluc2VydGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0CisJICogICAgIC0gd2hlbiBtdWx0aXBsZSByZXR1cm4gcHJvYmVzIGFyZSByZWdpc3RlcmVkIGZvciB0aGUgc2FtZQorICAgICAgICAgKiAgICAgICBmdW5jdGlvbiwgdGhlIGZpcnN0IGluc3RhbmNlJ3MgcmV0X2FkZHIgd2lsbCBwb2ludCB0byB0aGUKKwkgKiAgICAgICByZWFsIHJldHVybiBhZGRyZXNzLCBhbmQgYWxsIHRoZSByZXN0IHdpbGwgcG9pbnQgdG8KKwkgKiAgICAgICBrcmV0cHJvYmVfdHJhbXBvbGluZQorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmksIG5vZGUsIHRtcCwgaGVhZCwgaGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmktPnRhc2sgIT0gY3VycmVudCkKKwkJCS8qIGFub3RoZXIgdGFzayBpcyBzaGFyaW5nIG91ciBoYXNoIGJ1Y2tldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLXZvaWQgdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCS8qIFJBIGFscmVhZHkgcG9wcGVkICovCi0JdW5zaWduZWQgbG9uZyAqc2FyYSA9ICgodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcCkgLSAxOworCQlpZiAocmktPnJwICYmIHJpLT5ycC0+aGFuZGxlcikKKwkJCXJpLT5ycC0+aGFuZGxlcihyaSwgcmVncyk7CiAKLQl3aGlsZSAoKHJpID0gZ2V0X3JwX2luc3Qoc2FyYSkpKSB7Ci0JCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKKwkJb3JpZ19yZXRfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXJpLT5yZXRfYWRkcjsKIAkJcmVjeWNsZV9ycF9pbnN0KHJpKTsKKworCQlpZiAob3JpZ19yZXRfYWRkcmVzcyAhPSB0cmFtcG9saW5lX2FkZHJlc3MpCisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgcmVhbCByZXR1cm4gYWRkcmVzcy4gQW55IG90aGVyCisJCQkgKiBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFzayBhcmUgZm9yCisJCQkgKiBvdGhlciBjYWxscyBkZWVwZXIgb24gdGhlIGNhbGwgc3RhY2sKKwkJCSAqLworCQkJYnJlYWs7CiAJfQotCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKworCUJVR19PTighb3JpZ19yZXRfYWRkcmVzcyB8fCAob3JpZ19yZXRfYWRkcmVzcyA9PSB0cmFtcG9saW5lX2FkZHJlc3MpKTsKKwlyZWdzLT5yaXAgPSBvcmlnX3JldF9hZGRyZXNzOworCisJdW5sb2NrX2twcm9iZXMoKTsKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUsIHdlIGFyZSB0ZWxsaW5nCisgICAgICAgICAqIGtwcm9iZV9oYW5kbGVyKCkgdGhhdCB3ZSBoYXZlIGhhbmRsZWQgdW5sb2NraW5nCisgICAgICAgICAqIGFuZCByZS1lbmFibGluZyBwcmVlbXB0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC01NTAsOCArNTQ2LDcgQEAKIAkJY3VycmVudF9rcHJvYmUtPnBvc3RfaGFuZGxlcihjdXJyZW50X2twcm9iZSwgcmVncywgMCk7CiAJfQogCi0JaWYgKGN1cnJlbnRfa3Byb2JlLT5wb3N0X2hhbmRsZXIgIT0gdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIpCi0JCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOworCXJlc3VtZV9leGVjdXRpb24oY3VycmVudF9rcHJvYmUsIHJlZ3MpOwogCXJlZ3MtPmVmbGFncyB8PSBrcHJvYmVfc2F2ZWRfcmZsYWdzOwogCiAJLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgc2F2ZWQga3Byb2JlcyB2YXJpYWJsZXMgYW5kIGNvbnRpbnVlLiAqLwpAQCAtNjgyLDExMSArNjc3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBrcHJvYmUtPmFpbnNuLmluc24gcG9pbnRzIHRvIHRoZSBjb3B5IG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSBzaW5nbGUtc3RlcHBlZC4KLSAqIEJ5IGRlZmF1bHQgb24geDg2XzY0LCBwYWdlcyB3ZSBnZXQgZnJvbSBrbWFsbG9jIG9yIHZtYWxsb2MgYXJlIG5vdAotICogZXhlY3V0YWJsZS4gIFNpbmdsZS1zdGVwcGluZyBhbiBpbnN0cnVjdGlvbiBvbiBzdWNoIGEgcGFnZSB5aWVsZHMgYW4KLSAqIG9vcHMuICBTbyBpbnN0ZWFkIG9mIHN0b3JpbmcgdGhlIGluc3RydWN0aW9uIGNvcGllcyBpbiB0aGVpciByZXNwZWN0aXZlCi0gKiBrcHJvYmUgb2JqZWN0cywgd2UgYWxsb2NhdGUgYSBwYWdlLCBtYXAgaXQgZXhlY3V0YWJsZSwgYW5kIHN0b3JlIGFsbCB0aGUKLSAqIGluc3RydWN0aW9uIGNvcGllcyB0aGVyZS4gIChXZSBjYW4gYWxsb2NhdGUgYWRkaXRpb25hbCBwYWdlcyBpZiBzb21lYm9keQotICogaW5zZXJ0cyBhIGh1Z2UgbnVtYmVyIG9mIHByb2Jlcy4pICBFYWNoIHBhZ2UgY2FuIGhvbGQgdXAgdG8gSU5TTlNfUEVSX1BBR0UKLSAqIGluc3RydWN0aW9uIHNsb3RzLCBlYWNoIG9mIHdoaWNoIGlzIE1BWF9JTlNOX1NJWkUqc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkKLSAqIGJ5dGVzLgotICovCi0jZGVmaW5lIElOU05TX1BFUl9QQUdFIChQQUdFX1NJWkUvKE1BWF9JTlNOX1NJWkUqc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpKQotc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgewotCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OwotCWtwcm9iZV9vcGNvZGVfdCAqaW5zbnM7CQkvKiBwYWdlIG9mIGluc3RydWN0aW9uIHNsb3RzICovCi0JY2hhciBzbG90X3VzZWRbSU5TTlNfUEVSX1BBR0VdOwotCWludCBudXNlZDsKK3N0YXRpYyBzdHJ1Y3Qga3Byb2JlIHRyYW1wb2xpbmVfcCA9IHsKKwkuYWRkciA9IChrcHJvYmVfb3Bjb2RlX3QgKikgJmtyZXRwcm9iZV90cmFtcG9saW5lLAorCS5wcmVfaGFuZGxlciA9IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcgogfTsKIAotc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGtwcm9iZV9pbnNuX3BhZ2VzOwotCi0vKioKLSAqIGdldF9pbnNuX3Nsb3QoKSAtIEZpbmQgYSBzbG90IG9uIGFuIGV4ZWN1dGFibGUgcGFnZSBmb3IgYW4gaW5zdHJ1Y3Rpb24uCi0gKiBXZSBhbGxvY2F0ZSBhbiBleGVjdXRhYmxlIHBhZ2UgaWYgdGhlcmUncyBubyByb29tIG9uIGV4aXN0aW5nIG9uZXMuCi0gKi8KLXN0YXRpYyBrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCkKK2ludCBfX2luaXQgYXJjaF9pbml0X2twcm9iZXModm9pZCkKIHsKLQlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0KLQlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgewotCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7Ci0JCWlmIChraXAtPm51c2VkIDwgSU5TTlNfUEVSX1BBR0UpIHsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IElOU05TX1BFUl9QQUdFOyBpKyspIHsKLQkJCQlpZiAoIWtpcC0+c2xvdF91c2VkW2ldKSB7Ci0JCQkJCWtpcC0+c2xvdF91c2VkW2ldID0gMTsKLQkJCQkJa2lwLT5udXNlZCsrOwotCQkJCQlyZXR1cm4ga2lwLT5pbnNucyArIChpKk1BWF9JTlNOX1NJWkUpOwotCQkJCX0KLQkJCX0KLQkJCS8qIFN1cnByaXNlISAgTm8gdW51c2VkIHNsb3RzLiAgRml4IGtpcC0+bnVzZWQuICovCi0JCQlraXAtPm51c2VkID0gSU5TTlNfUEVSX1BBR0U7Ci0JCX0KLQl9Ci0KLQkvKiBBbGwgb3V0IG9mIHNwYWNlLiAgTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBwYWdlLiBVc2Ugc2xvdCAwLiovCi0Ja2lwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtpcCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKgotCSAqIEZvciB0aGUgJXJpcC1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQgZml4dXBzIHRvIGJlIGRvYWJsZSwgd2UKLQkgKiBuZWVkIG91ciBpbnN0cnVjdGlvbiBjb3B5IHRvIGJlIHdpdGhpbiArLy0gMkdCIG9mIGFueSBkYXRhIGl0Ci0JICogbWlnaHQgYWNjZXNzIHZpYSAlcmlwLiAgVGhhdCBpcywgd2l0aGluIDJHQiBvZiB3aGVyZSB0aGUKLQkgKiBrZXJuZWwgaW1hZ2UgYW5kIGxvYWRlZCBtb2R1bGUgaW1hZ2VzIHJlc2lkZS4gIFNvIHdlIGFsbG9jYXRlCi0JICogYSBwYWdlIGluIHRoZSBtb2R1bGUgbG9hZGluZyBhcmVhLgotCSAqLwotCWtpcC0+aW5zbnMgPSBtb2R1bGVfYWxsb2MoUEFHRV9TSVpFKTsKLQlpZiAoIWtpcC0+aW5zbnMpIHsKLQkJa2ZyZWUoa2lwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUlOSVRfSExJU1RfTk9ERSgma2lwLT5obGlzdCk7Ci0JaGxpc3RfYWRkX2hlYWQoJmtpcC0+aGxpc3QsICZrcHJvYmVfaW5zbl9wYWdlcyk7Ci0JbWVtc2V0KGtpcC0+c2xvdF91c2VkLCAwLCBJTlNOU19QRVJfUEFHRSk7Ci0Ja2lwLT5zbG90X3VzZWRbMF0gPSAxOwotCWtpcC0+bnVzZWQgPSAxOwotCXJldHVybiBraXAtPmluc25zOwotfQotCi0vKioKLSAqIGZyZWVfaW5zbl9zbG90KCkgLSBGcmVlIGluc3RydWN0aW9uIHNsb3Qgb2J0YWluZWQgZnJvbSBnZXRfaW5zbl9zbG90KCkuCi0gKi8KLXN0YXRpYyB2b2lkIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqc2xvdCkKLXsKLQlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOwotCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7Ci0KLQlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgewotCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7Ci0JCWlmIChraXAtPmluc25zIDw9IHNsb3QKLQkJICAgICYmIHNsb3QgPCBraXAtPmluc25zKyhJTlNOU19QRVJfUEFHRSpNQVhfSU5TTl9TSVpFKSkgewotCQkJaW50IGkgPSAoc2xvdCAtIGtpcC0+aW5zbnMpIC8gTUFYX0lOU05fU0laRTsKLQkJCWtpcC0+c2xvdF91c2VkW2ldID0gMDsKLQkJCWtpcC0+bnVzZWQtLTsKLQkJCWlmIChraXAtPm51c2VkID09IDApIHsKLQkJCQkvKgotCQkJCSAqIFBhZ2UgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIEZyZWUgaXQgdW5sZXNzCi0JCQkJICogaXQncyB0aGUgbGFzdCBvbmUuICBXZSBrZWVwIHRoZSBsYXN0IG9uZQotCQkJCSAqIHNvIGFzIG5vdCB0byBoYXZlIHRvIHNldCBpdCB1cCBhZ2FpbiB0aGUKLQkJCQkgKiBuZXh0IHRpbWUgc29tZWJvZHkgaW5zZXJ0cyBhIHByb2JlLgotCQkJCSAqLwotCQkJCWhsaXN0X2RlbCgma2lwLT5obGlzdCk7Ci0JCQkJaWYgKGhsaXN0X2VtcHR5KCZrcHJvYmVfaW5zbl9wYWdlcykpIHsKLQkJCQkJSU5JVF9ITElTVF9OT0RFKCZraXAtPmhsaXN0KTsKLQkJCQkJaGxpc3RfYWRkX2hlYWQoJmtpcC0+aGxpc3QsCi0JCQkJCQkma3Byb2JlX2luc25fcGFnZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1vZHVsZV9mcmVlKE5VTEwsIGtpcC0+aW5zbnMpOwotCQkJCQlrZnJlZShraXApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCX0KKwlyZXR1cm4gcmVnaXN0ZXJfa3Byb2JlKCZ0cmFtcG9saW5lX3ApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkMWVmZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBtYWNoaW5lX2tleGVjLmMgLSBoYW5kbGUgdHJhbnNpdGlvbiBvZiBMaW51eCBib290aW5nIGFub3RoZXIga2VybmVsCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBFcmljIEJpZWRlcm1hbiAgPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KKworI2RlZmluZSBMRVZFTDBfU0laRSAoMVVMIDw8IDEyVUwpCisjZGVmaW5lIExFVkVMMV9TSVpFICgxVUwgPDwgMjFVTCkKKyNkZWZpbmUgTEVWRUwyX1NJWkUgKDFVTCA8PCAzMFVMKQorI2RlZmluZSBMRVZFTDNfU0laRSAoMVVMIDw8IDM5VUwpCisjZGVmaW5lIExFVkVMNF9TSVpFICgxVUwgPDwgNDhVTCkKKworI2RlZmluZSBMMF9BVFRSIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorI2RlZmluZSBMMV9BVFRSIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZIHwgX1BBR0VfUFNFKQorI2RlZmluZSBMMl9BVFRSIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorI2RlZmluZSBMM19BVFRSIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQorCitzdGF0aWMgdm9pZCBpbml0X2xldmVsMl9wYWdlKHU2NCAqbGV2ZWwycCwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX2FkZHI7CisKKwlhZGRyICY9IFBBR0VfTUFTSzsKKwllbmRfYWRkciA9IGFkZHIgKyBMRVZFTDJfU0laRTsKKwl3aGlsZSAoYWRkciA8IGVuZF9hZGRyKSB7CisJCSoobGV2ZWwycCsrKSA9IGFkZHIgfCBMMV9BVFRSOworCQlhZGRyICs9IExFVkVMMV9TSVpFOworCX0KK30KKworc3RhdGljIGludCBpbml0X2xldmVsM19wYWdlKHN0cnVjdCBraW1hZ2UgKmltYWdlLCB1NjQgKmxldmVsM3AsCisJCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxhc3RfYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGVuZF9hZGRyOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAwOworCWFkZHIgJj0gUEFHRV9NQVNLOworCWVuZF9hZGRyID0gYWRkciArIExFVkVMM19TSVpFOworCXdoaWxlICgoYWRkciA8IGxhc3RfYWRkcikgJiYgKGFkZHIgPCBlbmRfYWRkcikpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXU2NCAqbGV2ZWwycDsKKworCQlwYWdlID0ga2ltYWdlX2FsbG9jX2NvbnRyb2xfcGFnZXMoaW1hZ2UsIDApOworCQlpZiAoIXBhZ2UpIHsKKwkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlsZXZlbDJwID0gKHU2NCAqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJaW5pdF9sZXZlbDJfcGFnZShsZXZlbDJwLCBhZGRyKTsKKwkJKihsZXZlbDNwKyspID0gX19wYShsZXZlbDJwKSB8IEwyX0FUVFI7CisJCWFkZHIgKz0gTEVWRUwyX1NJWkU7CisJfQorCS8qIGNsZWFyIHRoZSB1bnVzZWQgZW50cmllcyAqLworCXdoaWxlIChhZGRyIDwgZW5kX2FkZHIpIHsKKwkJKihsZXZlbDNwKyspID0gMDsKKwkJYWRkciArPSBMRVZFTDJfU0laRTsKKwl9CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgaW50IGluaXRfbGV2ZWw0X3BhZ2Uoc3RydWN0IGtpbWFnZSAqaW1hZ2UsIHU2NCAqbGV2ZWw0cCwKKwkJCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGFzdF9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX2FkZHI7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IDA7CisJYWRkciAmPSBQQUdFX01BU0s7CisJZW5kX2FkZHIgPSBhZGRyICsgTEVWRUw0X1NJWkU7CisJd2hpbGUgKChhZGRyIDwgbGFzdF9hZGRyKSAmJiAoYWRkciA8IGVuZF9hZGRyKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdTY0ICpsZXZlbDNwOworCisJCXBhZ2UgPSBraW1hZ2VfYWxsb2NfY29udHJvbF9wYWdlcyhpbWFnZSwgMCk7CisJCWlmICghcGFnZSkgeworCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxldmVsM3AgPSAodTY0ICopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlyZXN1bHQgPSBpbml0X2xldmVsM19wYWdlKGltYWdlLCBsZXZlbDNwLCBhZGRyLCBsYXN0X2FkZHIpOworCQlpZiAocmVzdWx0KSB7CisJCQlnb3RvIG91dDsKKwkJfQorCQkqKGxldmVsNHArKykgPSBfX3BhKGxldmVsM3ApIHwgTDNfQVRUUjsKKwkJYWRkciArPSBMRVZFTDNfU0laRTsKKwl9CisJLyogY2xlYXIgdGhlIHVudXNlZCBlbnRyaWVzICovCisJd2hpbGUgKGFkZHIgPCBlbmRfYWRkcikgeworCQkqKGxldmVsNHArKykgPSAwOworCQlhZGRyICs9IExFVkVMM19TSVpFOworCX0KK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9wZ3RhYmxlKHN0cnVjdCBraW1hZ2UgKmltYWdlLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BndGFibGUpCit7CisJdTY0ICpsZXZlbDRwOworCWxldmVsNHAgPSAodTY0ICopX192YShzdGFydF9wZ3RhYmxlKTsKKyAJcmV0dXJuIGluaXRfbGV2ZWw0X3BhZ2UoaW1hZ2UsIGxldmVsNHAsIDAsIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pZHQodm9pZCAqbmV3aWR0LCB1MTYgbGltaXQpCit7CisJdW5zaWduZWQgY2hhciBjdXJpZHRbMTBdOworCisJLyogeDg2LTY0IHN1cHBvcnRzIHVuYWxpZ2VkIGxvYWRzICYgc3RvcmVzICovCisJKCoodTE2ICopKGN1cmlkdCkpID0gbGltaXQ7CisJKCoodTY0ICopKGN1cmlkdCArMikpID0gKHVuc2lnbmVkIGxvbmcpKG5ld2lkdCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJsaWR0ICUwXG4iCisJCTogIj1tIiAoY3VyaWR0KQorCQkpOworfTsKKworCitzdGF0aWMgdm9pZCBzZXRfZ2R0KHZvaWQgKm5ld2dkdCwgdTE2IGxpbWl0KQoreworCXVuc2lnbmVkIGNoYXIgY3VyZ2R0WzEwXTsKKworCS8qIHg4Ni02NCBzdXBwb3J0cyB1bmFsaWduZWQgbG9hZHMgJiBzdG9yZXMgKi8KKwkoKih1MTYgKikoY3VyZ2R0KSkgPSBsaW1pdDsKKwkoKih1NjQgKikoY3VyZ2R0ICsyKSkgPSAodW5zaWduZWQgbG9uZykobmV3Z2R0KTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJImxnZHQgJTBcbiIKKwkJOiAiPW0iIChjdXJnZHQpCisJCSk7Cit9OworCitzdGF0aWMgdm9pZCBsb2FkX3NlZ21lbnRzKHZvaWQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiXHRtb3ZsICQiU1RSKF9fS0VSTkVMX0RTKSIsJWVheFxuIgorCQkiXHRtb3ZsICVlYXgsJWRzXG4iCisJCSJcdG1vdmwgJWVheCwlZXNcbiIKKwkJIlx0bW92bCAlZWF4LCVzc1xuIgorCQkiXHRtb3ZsICVlYXgsJWZzXG4iCisJCSJcdG1vdmwgJWVheCwlZ3NcbiIKKwkJKTsKKyN1bmRlZiBTVFIKKyN1bmRlZiBfX1NUUgorfQorCit0eXBlZGVmIE5PUkVUX1RZUEUgdm9pZCAoKnJlbG9jYXRlX25ld19rZXJuZWxfdCkodW5zaWduZWQgbG9uZyBpbmRpcmVjdGlvbl9wYWdlLAorCQkJCQl1bnNpZ25lZCBsb25nIGNvbnRyb2xfY29kZV9idWZmZXIsCisJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywKKwkJCQkJdW5zaWduZWQgbG9uZyBwZ3RhYmxlKSBBVFRSSUJfTk9SRVQ7CisKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKK2NvbnN0IGV4dGVybiB1bnNpZ25lZCBsb25nIHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZTsKKworaW50IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BndGFibGUsIGNvbnRyb2xfY29kZV9idWZmZXI7CisJaW50IHJlc3VsdDsKKworCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0cyAqLworCXN0YXJ0X3BndGFibGUgPSBwYWdlX3RvX3BmbihpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJY29udHJvbF9jb2RlX2J1ZmZlciA9IHN0YXJ0X3BndGFibGUgKyA0MDk2VUw7CisKKwkvKiBTZXR1cCB0aGUgaWRlbnRpdHkgbWFwcGVkIDY0Yml0IHBhZ2UgdGFibGUgKi8KKwlyZXN1bHQgPSBpbml0X3BndGFibGUoaW1hZ2UsIHN0YXJ0X3BndGFibGUpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwkvKiBQbGFjZSB0aGUgY29kZSBpbiB0aGUgcmVib290IGNvZGUgYnVmZmVyICovCisJbWVtY3B5KF9fdmEoY29udHJvbF9jb2RlX2J1ZmZlciksIHJlbG9jYXRlX25ld19rZXJuZWwsCisJCQkJCQlyZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbWFjaGluZV9rZXhlY19jbGVhbnVwKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXJldHVybjsKK30KKworLyoKKyAqIERvIG5vdCBhbGxvY2F0ZSBtZW1vcnkgKG9yIGZhaWwgaW4gYW55IHdheSkgaW4gbWFjaGluZV9rZXhlYygpLgorICogV2UgYXJlIHBhc3QgdGhlIHBvaW50IG9mIG5vIHJldHVybiwgY29tbWl0dGVkIHRvIHJlYm9vdGluZyBub3cuCisgKi8KK05PUkVUX1RZUEUgdm9pZCBtYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCXVuc2lnbmVkIGxvbmcgcGFnZV9saXN0OworCXVuc2lnbmVkIGxvbmcgY29udHJvbF9jb2RlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BndGFibGU7CisJcmVsb2NhdGVfbmV3X2tlcm5lbF90IHJuazsKKworCS8qIEludGVycnVwdHMgYXJlbid0IGFjY2VwdGFibGUgd2hpbGUgd2UgcmVib290ICovCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0cyAqLworCXBhZ2VfbGlzdCA9IGltYWdlLT5oZWFkOworCXN0YXJ0X3BndGFibGUgPSBwYWdlX3RvX3BmbihpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpIDw8IFBBR0VfU0hJRlQ7CisJY29udHJvbF9jb2RlX2J1ZmZlciA9IHN0YXJ0X3BndGFibGUgKyA0MDk2VUw7CisKKwkvKiBTZXQgdGhlIGxvdyBoYWxmIG9mIHRoZSBwYWdlIHRhYmxlIHRvIG15IGlkZW50aXR5IG1hcHBlZAorCSAqIHBhZ2UgdGFibGUgZm9yIGtleGVjLiAgTGVhdmUgdGhlIGhpZ2ggaGFsZiBwb2ludGluZyBhdCB0aGUKKwkgKiBrZXJuZWwgcGFnZXMuICAgRG9uJ3QgYm90aGVyIHRvIGZsdXNoIHRoZSBnbG9iYWwgcGFnZXMKKwkgKiBhcyB0aGF0IHdpbGwgaGFwcGVuIHdoZW4gSSBmdWxseSBzd2l0Y2ggdG8gbXkgaWRlbnRpdHkgbWFwcGVkCisJICogcGFnZSB0YWJsZSBhbnl3YXkuCisJICovCisJbWVtY3B5KF9fdmEocmVhZF9jcjMoKSksIF9fdmEoc3RhcnRfcGd0YWJsZSksIFBBR0VfU0laRS8yKTsKKwlfX2ZsdXNoX3RsYigpOworCisKKwkvKiBUaGUgc2VnbWVudCByZWdpc3RlcnMgYXJlIGZ1bm55IHRoaW5ncywgdGhleSBhcmUKKwkgKiBhdXRvbWF0aWNhbGx5IGxvYWRlZCBmcm9tIGEgdGFibGUsIGluIG1lbW9yeSB3aGVyZXZlciB5b3UKKwkgKiBzZXQgdGhlbSB0byBhIHNwZWNpZmljIHNlbGVjdG9yLCBidXQgdGhpcyB0YWJsZSBpcyBuZXZlcgorCSAqIGFjY2Vzc2VkIGFnYWluIHVubGVzcyB5b3Ugc2V0IHRoZSBzZWdtZW50IHRvIGEgZGlmZmVyZW50IHNlbGVjdG9yLgorCSAqCisJICogVGhlIG1vcmUgY29tbW9uIG1vZGVsIGFyZSBjYWNoZXMgd2hlcmUgdGhlIGJlaGlkZQorCSAqIHRoZSBzY2VuZXMgd29yayBpcyBkb25lLCBidXQgaXMgYWxzbyBkcm9wcGVkIGF0IGFyYml0cmFyeQorCSAqIHRpbWVzLgorCSAqCisJICogSSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGhlcmUgYnkgZm9yY2UgbG9hZGluZyB0aGUKKwkgKiBzZWdtZW50cywgYmVmb3JlIEkgemFwIHRoZSBnZHQgd2l0aCBhbiBpbnZhbGlkIHZhbHVlLgorCSAqLworCWxvYWRfc2VnbWVudHMoKTsKKwkvKiBUaGUgZ2R0ICYgaWR0IGFyZSBub3cgaW52YWxpZC4KKwkgKiBJZiB5b3Ugd2FudCB0byBsb2FkIHRoZW0geW91IG11c3Qgc2V0IHVwIHlvdXIgb3duIGlkdCAmIGdkdC4KKwkgKi8KKwlzZXRfZ2R0KHBoeXNfdG9fdmlydCgwKSwwKTsKKwlzZXRfaWR0KHBoeXNfdG9fdmlydCgwKSwwKTsKKwkvKiBub3cgY2FsbCBpdCAqLworCXJuayA9IChyZWxvY2F0ZV9uZXdfa2VybmVsX3QpIGNvbnRyb2xfY29kZV9idWZmZXI7CisJKCpybmspKHBhZ2VfbGlzdCwgY29udHJvbF9jb2RlX2J1ZmZlciwgaW1hZ2UtPnN0YXJ0LCBzdGFydF9wZ3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYwppbmRleCAzYTg5ZDczLi4yMWU3MDYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZS5jCkBAIC0zMjcsNyArMzI3LDcgQEAKIH0KIAogLyogQWRkIHBlciBDUFUgc3BlY2lmaWMgd29ya2Fyb3VuZHMgaGVyZSAqLwotc3RhdGljIHZvaWQgX19pbml0IG1jZV9jcHVfcXVpcmtzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykgCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbWNlX2NwdV9xdWlya3Moc3RydWN0IGNwdWluZm9feDg2ICpjKQogeyAKIAkvKiBUaGlzIHNob3VsZCBiZSBkaXNhYmxlZCBieSB0aGUgQklPUywgYnV0IGlzbid0IGFsd2F5cyAqLwogCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmIGMtPng4NiA9PSAxNSkgewpAQCAtMzM3LDcgKzMzNyw3IEBACiAJfQogfQkJCQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbWNlX2NwdV9mZWF0dXJlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbWNlX2NwdV9mZWF0dXJlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJc3dpdGNoIChjLT54ODZfdmVuZG9yKSB7CiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgpAQCAtMzUyLDcgKzM1Miw3IEBACiAgKiBDYWxsZWQgZm9yIGVhY2ggYm9vdGVkIENQVSB0byBzZXQgdXAgbWFjaGluZSBjaGVja3MuCiAgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHByZWVtcHQgb2ZmLiAKICAqLwotdm9pZCBfX2luaXQgbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2NwdWluaXQgbWNoZWNrX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXN0YXRpYyBjcHVtYXNrX3QgbWNlX2NwdXMgX19pbml0ZGF0YSA9IENQVV9NQVNLX05PTkU7CiAKQEAgLTQxMSw3ICs0MTEsNyBAQAogCW1lbXNldChtY2Vsb2cuZW50cnksIDAsIG5leHQgKiBzaXplb2Yoc3RydWN0IG1jZSkpOwogCW1jZWxvZy5uZXh0ID0gMDsKIAotCXN5bmNocm9uaXplX2tlcm5lbCgpOwkKKwlzeW5jaHJvbml6ZV9zY2hlZCgpOwogCiAJLyogQ29sbGVjdCBlbnRyaWVzIHRoYXQgd2VyZSBzdGlsbCBnZXR0aW5nIHdyaXR0ZW4gYmVmb3JlIHRoZSBzeW5jaHJvbml6ZS4gKi8KIApAQCAtNTQyLDcgKzU0Miw3IEBACiBBQ0NFU1NPUih0b2xlcmFudCx0b2xlcmFudCwpCiBBQ0NFU1NPUihjaGVja19pbnRlcnZhbCxjaGVja19pbnRlcnZhbCxtY2VfcmVzdGFydCgpKQogCi1zdGF0aWMgX19pbml0IGludCBtY2VfaW5pdF9kZXZpY2Uodm9pZCkKK3N0YXRpYyBfX2NwdWluaXQgaW50IG1jZV9pbml0X2RldmljZSh2b2lkKQogewogCWludCBlcnI7CiAJaWYgKCFtY2VfYXZhaWxhYmxlKCZib290X2NwdV9kYXRhKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfaW50ZWwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfaW50ZWwuYwppbmRleCA0ZGI5YTY0Li4wYmUwYTc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2ludGVsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZV9pbnRlbC5jCkBAIC00Miw3ICs0Miw3IEBACiAJaXJxX2V4aXQoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGludGVsX2luaXRfdGhlcm1hbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW50ZWxfaW5pdF90aGVybWFsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1MzIgbCwgaDsKIAlpbnQgdG0yID0gMDsKQEAgLTkzLDcgKzkzLDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgX19pbml0IG1jZV9pbnRlbF9mZWF0dXJlX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQordm9pZCBfX2NwdWluaXQgbWNlX2ludGVsX2ZlYXR1cmVfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJaW50ZWxfaW5pdF90aGVybWFsKGMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL25taS5jIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCmluZGV4IDMxYzBmMmUuLjRlNDRkNmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkoUDRfQ0NDUl9PVkZfUE1JMHxQNF9DQ0NSX1RIUkVTSE9MRCgxNSl8UDRfQ0NDUl9DT01QTEVNRU5UfAlcCiAJIFA0X0NDQ1JfQ09NUEFSRXxQNF9DQ0NSX1JFUVVJUkVEfFA0X0NDQ1JfRVNDUl9TRUxFQ1QoNCl8UDRfQ0NDUl9FTkFCTEUpCiAKLXN0YXRpYyBfX2luaXQgaW5saW5lIGludCBubWlfa25vd25fY3B1KHZvaWQpCitzdGF0aWMgX19jcHVpbml0IGlubGluZSBpbnQgbm1pX2tub3duX2NwdSh2b2lkKQogewogCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CiAJY2FzZSBYODZfVkVORE9SX0FNRDoKQEAgLTExMCw3ICsxMTAsNyBAQAogfQogCiAvKiBSdW4gYWZ0ZXIgY29tbWFuZCBsaW5lIGFuZCBjcHVfaW5pdCBpbml0LCBidXQgYmVmb3JlIGFsbCBvdGhlciBjaGVja3MgKi8KLXZvaWQgX19pbml0IG5taV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpCit2b2lkIF9fY3B1aW5pdCBubWlfd2F0Y2hkb2dfZGVmYXVsdCh2b2lkKQogewogCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX0RFRkFVTFQpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGU1OWQxZjkuLjc1NzdmOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYwpAQCAtOCw3ICs4LDggQEAKICAqIAogICogIFg4Ni02NCBwb3J0CiAgKglBbmRpIEtsZWVuLgotICogCisgKgorICoJQ1BVIGhvdHBsdWcgc3VwcG9ydCAtIGFzaG9rLnJhakBpbnRlbC5jb20KICAqICAkSWQ6IHByb2Nlc3MuYyx2IDEuMzggMjAwMi8wMS8xNSAxMDowODowMyBhayBFeHAgJAogICovCiAKQEAgLTE4LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTU0LDYgKzE1NiwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK0RFQ0xBUkVfUEVSX0NQVShpbnQsIGNwdV9zdGF0ZSk7CisKKyNpbmNsdWRlIDxhc20vbm1pLmg+CisvKiBXZSBkb24ndCBhY3R1YWxseSB0YWtlIENQVSBkb3duLCBqdXN0IHNwaW4gd2l0aG91dCBpbnRlcnJ1cHRzLiAqLworc3RhdGljIGlubGluZSB2b2lkIHBsYXlfZGVhZCh2b2lkKQoreworCWlkbGVfdGFza19leGl0KCk7CisJd2JpbnZkKCk7CisJbWIoKTsKKwkvKiBBY2sgaXQgKi8KKwlfX2dldF9jcHVfdmFyKGNwdV9zdGF0ZSkgPSBDUFVfREVBRDsKKworCXdoaWxlICgxKQorCQlzYWZlX2hhbHQoKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGxheV9kZWFkKHZvaWQpCit7CisJQlVHKCk7Cit9CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKIC8qCiAgKiBUaGUgaWRsZSB0aHJlYWQuIFRoZXJlJ3Mgbm8gdXNlZnVsIHdvcmsgdG8gYmUKICAqIGRvbmUsIHNvIGp1c3QgdHJ5IHRvIGNvbnNlcnZlIHBvd2VyIGFuZCBoYXZlIGEKQEAgLTE3NCw2ICsxOTksOCBAQAogCQkJaWRsZSA9IHBtX2lkbGU7CiAJCQlpZiAoIWlkbGUpCiAJCQkJaWRsZSA9IGRlZmF1bHRfaWRsZTsKKwkJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQkJCXBsYXlfZGVhZCgpOwogCQkJaWRsZSgpOwogCQl9CiAKQEAgLTIwNCw3ICsyMzEsNyBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit2b2lkIF9fY3B1aW5pdCBzZWxlY3RfaWRsZV9yb3V0aW5lKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAlzdGF0aWMgaW50IHByaW50ZWQ7CiAJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTVdBSVQpKSB7CkBAIC00NTUsNiArNDgyLDMzIEBACiB9CiAKIC8qCisgKiBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMgaWYgdGhlIGNvbnRleHQgc3dpdGNoIGZyb20gcHJldiB0byBuZXh0CisgKiBoYXMgdG8gdHdlYWsgdGhlIFRTQyBkaXNhYmxlIGJpdCBpbiB0aGUgY3I0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV90c2Moc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCisJCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3ApCit7CisJc3RydWN0IHRocmVhZF9pbmZvICpwcmV2LCAqbmV4dDsKKworCS8qCisJICogZ2NjIHNob3VsZCBlbGltaW5hdGUgdGhlIC0+dGhyZWFkX2luZm8gZGVyZWZlcmVuY2UgaWYKKwkgKiBoYXNfc2VjdXJlX2NvbXB1dGluZyByZXR1cm5zIDAgYXQgY29tcGlsZSB0aW1lIChTRUNDT01QPW4pLgorCSAqLworCXByZXYgPSBwcmV2X3AtPnRocmVhZF9pbmZvOworCW5leHQgPSBuZXh0X3AtPnRocmVhZF9pbmZvOworCisJaWYgKGhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpIHx8IGhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CisJCS8qIHNsb3cgcGF0aCBoZXJlICovCisJCWlmIChoYXNfc2VjdXJlX2NvbXB1dGluZyhwcmV2KSAmJgorCQkgICAgIWhhc19zZWN1cmVfY29tcHV0aW5nKG5leHQpKSB7CisJCQl3cml0ZV9jcjQocmVhZF9jcjQoKSAmIH5YODZfQ1I0X1RTRCk7CisJCX0gZWxzZSBpZiAoIWhhc19zZWN1cmVfY29tcHV0aW5nKHByZXYpICYmCisJCQkgICBoYXNfc2VjdXJlX2NvbXB1dGluZyhuZXh0KSkKKwkJCXdyaXRlX2NyNChyZWFkX2NyNCgpIHwgWDg2X0NSNF9UU0QpOworCX0KK30KKworLyoKICAqIFRoaXMgc3BlY2lhbCBtYWNybyBjYW4gYmUgdXNlZCB0byBsb2FkIGEgZGVidWdnaW5nIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUgbG9hZGRlYnVnKHRocmVhZCxyKSBzZXRfZGVidWcodGhyZWFkLT5kZWJ1Z3JlZyAjIyByLCByKQpAQCAtNTcyLDYgKzYyNiw4IEBACiAJCX0KIAl9CiAKKwlkaXNhYmxlX3RzYyhwcmV2X3AsIG5leHRfcCk7CisKIAlyZXR1cm4gcHJldl9wOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcmVib290LmMKaW5kZXggYmU0YjM2Zi4uNTdlNzFkYiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9yZWJvb3QuYwpAQCAtNjYsMzQgKzY2LDYgQEAKIAogX19zZXR1cCgicmVib290PSIsIHJlYm9vdF9zZXR1cCk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBzbXBfaGFsdCh2b2lkKQotewotCWludCBjcHVpZCA9IHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCgpOyAKLQlzdGF0aWMgaW50IGZpcnN0X2VudHJ5ID0gMTsKLQotCWlmIChyZWJvb3RfZm9yY2UpCi0JCXJldHVybjsKLQotCWlmIChmaXJzdF9lbnRyeSkgewotCQlmaXJzdF9lbnRyeSA9IDA7Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uKCh2b2lkICopbWFjaGluZV9yZXN0YXJ0LCBOVUxMLCAxLCAwKTsKLQl9Ci0JCQkKLQlzbXBfc3RvcF9jcHUoKTsgCi0KLQkvKiBBUCBjYWxsaW5nIHRoaXMuIEp1c3QgaGFsdCAqLwotCWlmIChjcHVpZCAhPSBib290X2NwdV9pZCkgeyAKLQkJZm9yICg7OykgCi0JCQlhc20oImhsdCIpOwotCX0KLQotCS8qIFdhaXQgZm9yIGFsbCBvdGhlciBDUFVzIHRvIGhhdmUgcnVuIHNtcF9zdG9wX2NwdSAqLwotCXdoaWxlICghY3B1c19lbXB0eShjcHVfb25saW5lX21hcCkpCi0JCXJlcF9ub3AoKTsgCi19Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSB2b2lkIGtiX3dhaXQodm9pZCkKIHsKIAlpbnQgaTsKQEAgLTEwMywxNSArNzUsNDcgQEAKIAkJCWJyZWFrOwogfQogCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3sKKwkvKiBTdG9wIHRoZSBjcHVzIGFuZCBhcGljcyAqLworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgcmVib290X2NwdV9pZDsKKworCS8qIFRoZSBib290IGNwdSBpcyBhbHdheXMgbG9naWNhbCBjcHUgMCAqLworCXJlYm9vdF9jcHVfaWQgPSAwOworCisJLyogTWFrZSBjZXJ0YWluIHRoZSBjcHUgSSdtIGFib3V0IHRvIHJlYm9vdCBvbiBpcyBvbmxpbmUgKi8KKwlpZiAoIWNwdV9pc3NldChyZWJvb3RfY3B1X2lkLCBjcHVfb25saW5lX21hcCkpIHsKKwkJcmVib290X2NwdV9pZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl9CisKKwkvKiBNYWtlIGNlcnRhaW4gSSBvbmx5IHJ1biBvbiB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yICovCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdShyZWJvb3RfY3B1X2lkKSk7CisKKwkvKiBPLksgTm93IHRoYXQgSSdtIG9uIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IsCisJICogc3RvcCBhbGwgb2YgdGhlIG90aGVycy4KKwkgKi8KKwlzbXBfc2VuZF9zdG9wKCk7CisjZW5kaWYKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKyNpZm5kZWYgQ09ORklHX1NNUAorCWRpc2FibGVfbG9jYWxfQVBJQygpOworI2VuZGlmCisKKwlkaXNhYmxlX0lPX0FQSUMoKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKwogdm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqIF9fdW51c2VkKQogewogCWludCBpOwogCiAJcHJpbnRrKCJtYWNoaW5lIHJlc3RhcnRcbiIpOwogCi0jaWZkZWYgQ09ORklHX1NNUAotCXNtcF9oYWx0KCk7IAotI2VuZGlmCisJbWFjaGluZV9zaHV0ZG93bigpOwogCiAJaWYgKCFyZWJvb3RfZm9yY2UpIHsKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjRmYTliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogcmVsb2NhdGVfa2VybmVsLlMgLSBwdXQgdGhlIGtlcm5lbCBpbWFnZSBpbiBwbGFjZSB0byBib290CisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBFcmljIEJpZWRlcm1hbiAgPGViaWVkZXJtQHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworCS8qCisJICogTXVzdCBiZSByZWxvY2F0YWJsZSBQSUMgY29kZSBjYWxsYWJsZSBhcyBhIEMgZnVuY3Rpb24sIHRoYXQgb25jZQorCSAqIGl0IHN0YXJ0cyBjYW4gbm90IHVzZSB0aGUgcHJldmlvdXMgcHJvY2Vzc2VzIHN0YWNrLgorCSAqLworCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsCisJLmNvZGU2NAorcmVsb2NhdGVfbmV3X2tlcm5lbDoKKwkvKiAlcmRpIHBhZ2VfbGlzdAorCSAqICVyc2kgcmVib290X2NvZGVfYnVmZmVyCisJICogJXJkeCBzdGFydCBhZGRyZXNzCisJICogJXJjeCBwYWdlX3RhYmxlCisJICogJXI4ICBhcmc1CisJICogJXI5ICBhcmc2CisJICovCisKKwkvKiB6ZXJvIG91dCBmbGFncywgYW5kIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXB1c2hxICQwCisJcG9wZnEKKworCS8qIHNldCBhIG5ldyBzdGFjayBhdCB0aGUgYm90dG9tIG9mIG91ciBwYWdlLi4uICovCisJbGVhICAgNDA5NiglcnNpKSwgJXJzcAorCisJLyogc3RvcmUgdGhlIHBhcmFtZXRlcnMgYmFjayBvbiB0aGUgc3RhY2sgKi8KKwlwdXNocQklcmR4IC8qIHN0b3JlIHRoZSBzdGFydCBhZGRyZXNzICovCisKKwkvKiBTZXQgY3IwIHRvIGEga25vd24gc3RhdGU6CisJICogMzEgMSA9PSBQYWdpbmcgZW5hYmxlZAorCSAqIDE4IDAgPT0gQWxpZ25tZW50IGNoZWNrIGRpc2FibGVkCisJICogMTYgMCA9PSBXcml0ZSBwcm90ZWN0IGRpc2FibGVkCisJICogMyAgMCA9PSBObyB0YXNrIHN3aXRjaAorCSAqIDIgIDAgPT0gRG9uJ3QgZG8gRlAgc29mdHdhcmUgZW11bGF0aW9uLgorCSAqIDAgIDEgPT0gUHJvY3RlY3RlZCBtb2RlIGVuYWJsZWQKKwkgKi8KKwltb3ZxCSVjcjAsICVyYXgKKwlhbmRxCSR+KCgxPDwxOCl8KDE8PDE2KXwoMTw8Myl8KDE8PDIpKSwgJXJheAorCW9ybAkkKCgxPDwzMSl8KDE8PDApKSwgJWVheAorCW1vdnEJJXJheCwgJWNyMAorCisJLyogU2V0IGNyNCB0byBhIGtub3duIHN0YXRlOgorCSAqIDEwIDAgPT0geG1tIGV4Y2VwdGlvbnMgZGlzYWJsZWQKKwkgKiA5ICAwID09IHhtbSByZWdpc3RlcnMgaW5zdHJ1Y3Rpb25zIGRpc2FibGVkCisJICogOCAgMCA9PSBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIGNvdW50ZXIgZGlzYWJsZWQKKwkgKiA3ICAwID09IHBhZ2UgZ2xvYmFsIGRpc2FibGVkCisJICogNiAgMCA9PSBtYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbnMgZGlzYWJsZWQKKwkgKiA1ICAxID09IHBoeXNpY2FsIGFkZHJlc3MgZXh0ZW5zaW9uIGVuYWJsZWQKKwkgKiA0ICAwID09IHBhZ2Ugc2l6ZSBleHRlbnNpb25zCWRpc2FibGVkCisJICogMyAgMCA9PSBEZWJ1ZyBleHRlbnNpb25zIGRpc2FibGVkCisJICogMiAgMCA9PSBUaW1lIHN0YW1wIGRpc2FibGUgKGRpc2FibGVkKQorCSAqIDEgIDAgPT0gUHJvdGVjdGVkIG1vZGUgdmlydHVhbCBpbnRlcnJ1cHRzIGRpc2FibGVkCisJICogMCAgMCA9PSBWTUUgZGlzYWJsZWQKKwkgKi8KKworCW1vdnEJJCgoMTw8NSkpLCAlcmF4CisJbW92cQklcmF4LCAlY3I0CisKKwlqbXAgMWYKKzE6CisKKwkvKiBTd2l0Y2ggdG8gdGhlIGlkZW50aXR5IG1hcHBlZCBwYWdlIHRhYmxlcywKKwkgKiBhbmQgZmx1c2ggdGhlIFRMQi4KKwkqLworCW1vdnEJJXJjeCwgJWNyMworCisJLyogRG8gdGhlIGNvcGllcyAqLworCW1vdnEJJXJkaSwgJXJjeCAJLyogUHV0IHRoZSBwYWdlX2xpc3QgaW4gJXJjeCAqLworCXhvcnEJJXJkaSwgJXJkaQorCXhvcnEJJXJzaSwgJXJzaQorCWptcAkxZgorCiswOgkvKiB0b3AsIHJlYWQgYW5vdGhlciB3b3JkIGZvciB0aGUgaW5kaXJlY3Rpb24gcGFnZSAqLworCisJbW92cQkoJXJieCksICVyY3gKKwlhZGRxCSQ4LAklcmJ4CisxOgorCXRlc3RxCSQweDEsCSVyY3ggIC8qIGlzIGl0IGEgZGVzdGluYXRpb24gcGFnZT8gKi8KKwlqegkyZgorCW1vdnEJJXJjeCwJJXJkaQorCWFuZHEJJDB4ZmZmZmZmZmZmZmZmZjAwMCwgJXJkaQorCWptcAkwYgorMjoKKwl0ZXN0cQkkMHgyLAklcmN4ICAvKiBpcyBpdCBhbiBpbmRpcmVjdGlvbiBwYWdlPyAqLworCWp6CTJmCisJbW92cQklcmN4LCAgICVyYngKKwlhbmRxCSQweGZmZmZmZmZmZmZmZmYwMDAsICVyYngKKwlqbXAJMGIKKzI6CisJdGVzdHEJJDB4NCwJJXJjeCAgLyogaXMgaXQgdGhlIGRvbmUgaW5kaWNhdG9yPyAqLworCWp6CTJmCisJam1wCTNmCisyOgorCXRlc3RxCSQweDgsCSVyY3ggIC8qIGlzIGl0IHRoZSBzb3VyY2UgaW5kaWNhdG9yPyAqLworCWp6CTBiCSAgICAgIC8qIElnbm9yZSBpdCBvdGhlcndpc2UgKi8KKwltb3ZxCSVyY3gsICAgJXJzaSAgLyogRm9yIGV2ZXIgc291cmNlIHBhZ2UgZG8gYSBjb3B5ICovCisJYW5kcQkkMHhmZmZmZmZmZmZmZmZmMDAwLCAlcnNpCisKKwltb3ZxCSQ1MTIsICAgJXJjeAorCXJlcCA7IG1vdnNxCisJam1wCTBiCiszOgorCisJLyogVG8gYmUgY2VydGFpbiBvZiBhdm9pZGluZyBwcm9ibGVtcyB3aXRoIHNlbGYtbW9kaWZ5aW5nIGNvZGUKKwkgKiBJIG5lZWQgdG8gZXhlY3V0ZSBhIHNlcmlhbGl6aW5nIGluc3RydWN0aW9uIGhlcmUuCisJICogU28gSSBmbHVzaCB0aGUgVExCIGJ5IHJlbG9hZGluZyAlY3IzIGhlcmUsIGl0J3MgaGFuZHksCisJICogYW5kIG5vdCBwcm9jZXNzb3IgZGVwZW5kZW50LgorCSAqLworCW1vdnEJJWNyMywgJXJheAorCW1vdnEJJXJheCwgJWNyMworCisJLyogc2V0IGFsbCBvZiB0aGUgcmVnaXN0ZXJzIHRvIGtub3duIHZhbHVlcyAqLworCS8qIGxlYXZlICVyc3AgYWxvbmUgKi8KKworCXhvcnEJJXJheCwgJXJheAorCXhvcnEJJXJieCwgJXJieAorCXhvcnEgICAgJXJjeCwgJXJjeAorCXhvcnEgICAgJXJkeCwgJXJkeAorCXhvcnEgICAgJXJzaSwgJXJzaQorCXhvcnEgICAgJXJkaSwgJXJkaQorCXhvcnEgICAgJXJicCwgJXJicAorCXhvcnEJJXI4LCAgJXI4CisJeG9ycQklcjksICAlcjkKKwl4b3JxCSVyMTAsICVyOQorCXhvcnEJJXIxMSwgJXIxMQorCXhvcnEJJXIxMiwgJXIxMgorCXhvcnEJJXIxMywgJXIxMworCXhvcnEJJXIxNCwgJXIxNAorCXhvcnEJJXIxNSwgJXIxNQorCisJcmV0CityZWxvY2F0ZV9uZXdfa2VybmVsX2VuZDoKKworCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUKK3JlbG9jYXRlX25ld19rZXJuZWxfc2l6ZToKKwkucXVhZCByZWxvY2F0ZV9uZXdfa2VybmVsX2VuZCAtIHJlbG9jYXRlX25ld19rZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKaW5kZXggMDAwMDE1ZC4uNWZkMDMyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zNjcsNiArMzY4LDI3IEBACiAJCWlmICghbWVtY21wKGZyb20sICJub2V4ZWM9IiwgNykpCiAJCQlub254X3NldHVwKGZyb20gKyA3KTsKIAorI2lmZGVmIENPTkZJR19LRVhFQworCQkvKiBjcmFzaGtlcm5lbD1zaXplQGFkZHIgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiB0byByZXNlcnZlIGZvcgorCQkgKiBhIGNyYXNoIGtlcm5lbC4gIEJ5IHJlc2VydmluZyB0aGlzIG1lbW9yeSB3ZSBndWFyYW50ZWUKKwkJICogdGhhdCBsaW51eCBuZXZlciBzZXQncyBpdCB1cCBhcyBhIERNQSB0YXJnZXQuCisJCSAqIFVzZWZ1bCBmb3IgaG9sZGluZyBjb2RlIHRvIGRvIHNvbWV0aGluZyBhcHByb3ByaWF0ZQorCQkgKiBhZnRlciBhIGtlcm5lbCBwYW5pYy4KKwkJICovCisJCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImNyYXNoa2VybmVsPSIsIDEyKSkgeworCQkJdW5zaWduZWQgbG9uZyBzaXplLCBiYXNlOworCQkJc2l6ZSA9IG1lbXBhcnNlKGZyb20rMTIsICZmcm9tKTsKKwkJCWlmICgqZnJvbSA9PSAnQCcpIHsKKwkJCQliYXNlID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7CisJCQkJLyogRklYTUU6IERvIEkgd2FudCBhIHNhbml0eSBjaGVjaworCQkJCSAqIHRvIHZhbGlkYXRlIHRoZSBtZW1vcnkgcmFuZ2U/CisJCQkJICovCisJCQkJY3Jhc2hrX3Jlcy5zdGFydCA9IGJhc2U7CisJCQkJY3Jhc2hrX3Jlcy5lbmQgICA9IGJhc2UgKyBzaXplIC0gMTsKKwkJCX0KKwkJfQorI2VuZGlmCisKIAluZXh0X2NoYXI6CiAJCWMgPSAqKGZyb20rKyk7CiAJCWlmICghYykKQEAgLTYyNSw2ICs2NDcsMTMgQEAKICNlbmRpZgogCiAJc3BhcnNlX2luaXQoKTsKKworI2lmZGVmIENPTkZJR19LRVhFQworCWlmIChjcmFzaGtfcmVzLnN0YXJ0ICE9IGNyYXNoa19yZXMuZW5kKSB7CisJCXJlc2VydmVfYm9vdG1lbShjcmFzaGtfcmVzLnN0YXJ0LAorCQkJY3Jhc2hrX3Jlcy5lbmQgLSBjcmFzaGtfcmVzLnN0YXJ0ICsgMSk7CisJfQorI2VuZGlmCiAJcGFnaW5nX2luaXQoKTsKIAogCWNoZWNrX2lvYXBpYygpOwpAQCAtNjc2LDcgKzcwNSw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGludCBfX2luaXQgZ2V0X21vZGVsX25hbWUoc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIGludCBfX2NwdWluaXQgZ2V0X21vZGVsX25hbWUoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXVuc2lnbmVkIGludCAqdjsKIApAQCAtNjkyLDcgKzcyMSw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgX19pbml0IGRpc3BsYXlfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkaXNwbGF5X2NhY2hlaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdW5zaWduZWQgaW50IG4sIGR1bW15LCBlYXgsIGVieCwgZWN4LCBlZHg7CiAKQEAgLTgwMyw3ICs4MzIsNyBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZGV0ZWN0X2h0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkZXRlY3RfaHQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogI2lmZGVmIENPTkZJR19TTVAKIAl1MzIgCWVheCwgZWJ4LCBlY3gsIGVkeDsKQEAgLTg2NCw3ICs4OTMsNyBAQAogLyoKICAqIGZpbmQgb3V0IHRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIGNvcmVzIG9uIHRoZSBkaWUKICAqLwotc3RhdGljIGludCBfX2luaXQgaW50ZWxfbnVtX2NwdV9jb3JlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBpbnRlbF9udW1fY3B1X2NvcmVzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCkBAIC04ODIsNyArOTExLDcgQEAKIAkJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2ludGVsKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAkvKiBDYWNoZSBzaXplcyAqLwogCXVuc2lnbmVkIG47CkBAIC05MDIsNyArOTMxLDcgQEAKICAJYy0+eDg2X251bV9jb3JlcyA9IGludGVsX251bV9jcHVfY29yZXMoYyk7CiB9CiAKLXZvaWQgX19pbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19jcHVpbml0IGdldF9jcHVfdmVuZG9yKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAljaGFyICp2ID0gYy0+eDg2X3ZlbmRvcl9pZDsKIApAQCAtOTIzLDcgKzk1Miw3IEBACiAvKiBEbyBzb21lIGVhcmx5IGNwdWlkIG9uIHRoZSBib290IENQVSB0byBnZXQgc29tZSBwYXJhbWV0ZXIgdGhhdCBhcmUKICAgIG5lZWRlZCBiZWZvcmUgY2hlY2tfYnVncy4gRXZlcnl0aGluZyBhZHZhbmNlZCBpcyBpbiBpZGVudGlmeV9jcHUKICAgIGJlbG93LiAqLwotdm9pZCBfX2luaXQgZWFybHlfaWRlbnRpZnlfY3B1KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19jcHVpbml0IGVhcmx5X2lkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJdTMyIHRmbXM7CiAKQEAgLTk3Nyw3ICsxMDA2LDcgQEAKIC8qCiAgKiBUaGlzIGRvZXMgdGhlIGhhcmQgd29yayBvZiBhY3R1YWxseSBwaWNraW5nIGFwYXJ0IHRoZSBDUFUgc3R1ZmYuLi4KICAqLwotdm9pZCBfX2luaXQgaWRlbnRpZnlfY3B1KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3ZvaWQgX19jcHVpbml0IGlkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJaW50IGk7CiAJdTMyIHhsdmw7CkBAIC0xMDQ3LDYgKzEwNzYsMTAgQEAKICNpZmRlZiBDT05GSUdfWDg2X01DRQogCW1jaGVja19pbml0KGMpOwogI2VuZGlmCisJaWYgKGMgPT0gJmJvb3RfY3B1X2RhdGEpCisJCW10cnJfYnBfaW5pdCgpOworCWVsc2UKKwkJbXRycl9hcF9pbml0KCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAlpZiAoYyAhPSAmYm9vdF9jcHVfZGF0YSkKIAkJbnVtYV9hZGRfY3B1KGMgLSBjcHVfZGF0YSk7CkBAIC0xMDU0LDcgKzEwODcsNyBAQAogfQogIAogCi12b2lkIF9faW5pdCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit2b2lkIF9fY3B1aW5pdCBwcmludF9jcHVfaW5mbyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJaWYgKGMtPng4Nl9tb2RlbF9pZFswXSkKIAkJcHJpbnRrKCIlcyIsIGMtPng4Nl9tb2RlbF9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYwppbmRleCA2NzhiN2FjLi5mMmI5YzZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogY2hhciB4ODZfYm9vdF9wYXJhbXNbQk9PVF9QQVJBTV9TSVpFXSBfX2luaXRkYXRhID0gezAsfTsKIAotY3B1bWFza190IGNwdV9pbml0aWFsaXplZCBfX2luaXRkYXRhID0gQ1BVX01BU0tfTk9ORTsKK2NwdW1hc2tfdCBjcHVfaW5pdGlhbGl6ZWQgX19jcHVpbml0ZGF0YSA9IENQVV9NQVNLX05PTkU7CiAKIHN0cnVjdCB4ODY2NF9wZGEgY3B1X3BkYVtOUl9DUFVTXSBfX2NhY2hlbGluZV9hbGlnbmVkOyAKIApAQCAtMTcxLDcgKzE3MSw3IEBACiAJd3Jtc3JsKE1TUl9TWVNDQUxMX01BU0ssIEVGX1RGfEVGX0RGfEVGX0lFfDB4MzAwMCk7IAogfQogCi12b2lkIF9faW5pdCBjaGVja19lZmVyKHZvaWQpCit2b2lkIF9fY3B1aW5pdCBjaGVja19lZmVyKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBlZmVyOwogCkBAIC0xODgsNyArMTg4LDcgQEAKICAqICdDUFUgc3RhdGUgYmFycmllcicsIG5vdGhpbmcgc2hvdWxkIGdldCBhY3Jvc3MuCiAgKiBBIGxvdCBvZiBzdGF0ZSBpcyBhbHJlYWR5IHNldCB1cCBpbiBQREEgaW5pdC4KICAqLwotdm9pZCBfX2luaXQgY3B1X2luaXQgKHZvaWQpCit2b2lkIF9fY3B1aW5pdCBjcHVfaW5pdCAodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfU01QCiAJaW50IGNwdSA9IHN0YWNrX3NtcF9wcm9jZXNzb3JfaWQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zaWduYWwuYwppbmRleCA5OGI3YmE5Li45ODU5MGE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NpZ25hbC5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIDE7CiAKLQlpZiAodHJ5X3RvX2ZyZWV6ZSgwKSkKKwlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQlnb3RvIG5vX3NpZ25hbDsKIAogCWlmICghb2xkc2V0KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jCmluZGV4IDFlMzc5ZWQuLmNjYWUzOTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMKQEAgLTI4Myw2ICsyODMsMTYgQEAKIAogc3RhdGljIHN0cnVjdCBjYWxsX2RhdGFfc3RydWN0ICogY2FsbF9kYXRhOwogCit2b2lkIGxvY2tfaXBpX2NhbGxfbG9jayh2b2lkKQoreworCXNwaW5fbG9ja19pcnEoJmNhbGxfbG9jayk7Cit9CisKK3ZvaWQgdW5sb2NrX2lwaV9jYWxsX2xvY2sodm9pZCkKK3sKKwlzcGluX3VubG9ja19pcnEoJmNhbGxfbG9jayk7Cit9CisKIC8qCiAgKiB0aGlzIGZ1bmN0aW9uIHNlbmRzIGEgJ2dlbmVyaWMgY2FsbCBmdW5jdGlvbicgSVBJIHRvIGFsbCBvdGhlciBDUFVzCiAgKiBpbiB0aGUgc3lzdGVtLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggZjFlYzBmMy4uYjk2OWVlMSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCkBAIC0zNCw2ICszNCw3IEBACiAgKiAgICAgIEFuZGkgS2xlZW4gICAgICAgICAgICAgIDogICAgICAgQ29udmVydGVkIHRvIG5ldyBzdGF0ZSBtYWNoaW5lLgogICoJCQkJCVZhcmlvdXMgY2xlYW51cHMuCiAgKgkJCQkJUHJvYmFibHkgbW9zdGx5IGhvdHBsdWcgQ1BVIHJlYWR5IG5vdy4KKyAqCUFzaG9rIFJhagkJCTogQ1BVIGhvdHBsdWcgc3VwcG9ydAogICovCiAKIApAQCAtNTgsMTEgKzU5LDYgQEAKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vbm1pLmg+CiAKLS8qIENoYW5nZSBmb3IgcmVhbCBDUFUgaG90cGx1Zy4gTm90ZSBvdGhlciBmaWxlcyBuZWVkIHRvIGJlIGZpeGVkCi0gICBmaXJzdCB0b28uICovCi0jZGVmaW5lIF9fY3B1aW5pdCBfX2luaXQKLSNkZWZpbmUgX19jcHVpbml0ZGF0YSBfX2luaXRkYXRhCi0KIC8qIE51bWJlciBvZiBzaWJsaW5ncyBwZXIgQ1BVIHBhY2thZ2UgKi8KIGludCBzbXBfbnVtX3NpYmxpbmdzID0gMTsKIC8qIFBhY2thZ2UgSUQgb2YgZWFjaCBsb2dpY2FsIENQVSAqLwpAQCAtMTAzLDYgKzk5LDM3IEBACiBleHRlcm4gdW5zaWduZWQgY2hhciB0cmFtcG9saW5lX2RhdGFbXTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHRyYW1wb2xpbmVfZW5kW107CiAKKy8qIFN0YXRlIG9mIGVhY2ggQ1BVICovCitERUZJTkVfUEVSX0NQVShpbnQsIGNwdV9zdGF0ZSkgPSB7IDAgfTsKKworLyoKKyAqIFN0b3JlIGFsbCBpZGxlIHRocmVhZHMsIHRoaXMgY2FuIGJlIHJldXNlZCBpbnN0ZWFkIG9mIGNyZWF0aW5nCisgKiBhIG5ldyB0aHJlYWQuIEFsc28gYXZvaWRzIGNvbXBsaWNhdGVkIHRocmVhZCBkZXN0cm95IGZ1bmN0aW9uYWxpdHkKKyAqIGZvciBpZGxlIHRocmVhZHMuCisgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZV90aHJlYWRfYXJyYXlbTlJfQ1BVU10gX19jcHVpbml0ZGF0YSA7CisKKyNkZWZpbmUgZ2V0X2lkbGVfZm9yX2NwdSh4KSAgICAgKGlkbGVfdGhyZWFkX2FycmF5Wyh4KV0pCisjZGVmaW5lIHNldF9pZGxlX2Zvcl9jcHUoeCxwKSAgIChpZGxlX3RocmVhZF9hcnJheVsoeCldID0gKHApKQorCisvKgorICogY3B1X3Bvc3NpYmxlX21hcCBzaG91bGQgYmUgc3RhdGljLCBpdCBjYW5ub3QgY2hhbmdlIGFzIGNwdSdzCisgKiBhcmUgb25saW5lZCwgb3Igb2ZmbGluZWQuIFRoZSByZWFzb24gaXMgcGVyLWNwdSBkYXRhLXN0cnVjdHVyZXMKKyAqIGFyZSBhbGxvY2F0ZWQgYnkgc29tZSBtb2R1bGVzIGF0IGluaXQgdGltZSwgYW5kIGRvbnQgZXhwZWN0IHRvCisgKiBkbyB0aGlzIGR5bmFtaWNhbGx5IG9uIGNwdSBhcnJpdmFsL2RlcGFydHVyZS4KKyAqIGNwdV9wcmVzZW50X21hcCBvbiB0aGUgb3RoZXIgaGFuZCBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5LgorICogSW4gY2FzZSB3aGVuIGNwdV9ob3RwbHVnIGlzIG5vdCBjb21waWxlZCwgdGhlbiB3ZSByZXNvcnQgdG8gY3VycmVudAorICogYmVoYXZpb3VyLCB3aGljaCBpcyBjcHVfcG9zc2libGUgPT0gY3B1X3ByZXNlbnQuCisgKiBJZiBjcHUtaG90cGx1ZyBpcyBzdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVhbGxvY2F0ZSBmb3IgYWxsCisgKiB0aG9zZSBOUl9DUFVTLCBoZW5jZSBjcHVfcG9zc2libGVfbWFwIHJlcHJlc2VudHMgZW50aXJlIE5SX0NQVVMgcmFuZ2UuCisgKiAtIEFzaG9rIFJhagorICovCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisjZGVmaW5lIGZpeHVwX2NwdV9wb3NzaWJsZV9tYXAoeCkJY3B1X3NldCgoeCksIGNwdV9wb3NzaWJsZV9tYXApCisjZWxzZQorI2RlZmluZSBmaXh1cF9jcHVfcG9zc2libGVfbWFwKHgpCisjZW5kaWYKKwogLyoKICAqIEN1cnJlbnRseSB0cml2aWFsLiBXcml0ZSB0aGUgcmVhbC0+cHJvdGVjdGVkIG1vZGUKICAqIGJvb3RzdHJhcCBpbnRvIHRoZSBwYWdlIGNvbmNlcm5lZC4gVGhlIGNhbGxlcgpAQCAtNDE4LDYgKzQ0NSwzMyBAQAogCWNwdV9zZXQoY3B1aWQsIGNwdV9jYWxsaW5fbWFwKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNldF9jcHVfc2libGluZ19tYXAoaW50IGNwdSkKK3sKKwlpbnQgaTsKKworCWlmIChzbXBfbnVtX3NpYmxpbmdzID4gMSkgeworCQlmb3JfZWFjaF9jcHUoaSkgeworCQkJaWYgKGNwdV9jb3JlX2lkW2NwdV0gPT0gY3B1X2NvcmVfaWRbaV0pIHsKKwkJCQljcHVfc2V0KGksIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKKwkJCQljcHVfc2V0KGNwdSwgY3B1X3NpYmxpbmdfbWFwW2ldKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNwdV9zZXQoY3B1LCBjcHVfc2libGluZ19tYXBbY3B1XSk7CisJfQorCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEueDg2X251bV9jb3JlcyA+IDEpIHsKKwkJZm9yX2VhY2hfY3B1KGkpIHsKKwkJCWlmIChwaHlzX3Byb2NfaWRbY3B1XSA9PSBwaHlzX3Byb2NfaWRbaV0pIHsKKwkJCQljcHVfc2V0KGksIGNwdV9jb3JlX21hcFtjcHVdKTsKKwkJCQljcHVfc2V0KGNwdSwgY3B1X2NvcmVfbWFwW2ldKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNwdV9jb3JlX21hcFtjcHVdID0gY3B1X3NpYmxpbmdfbWFwW2NwdV07CisJfQorfQorCiAvKgogICogU2V0dXAgY29kZSBvbiBzZWNvbmRhcnkgcHJvY2Vzc29yIChhZnRlciBjb21taW5nIG91dCBvZiB0aGUgdHJhbXBvbGluZSkKICAqLwpAQCAtNDQ4LDkgKzUwMiwyOCBAQAogCWVuYWJsZV9BUElDX3RpbWVyKCk7CiAKIAkvKgorCSAqIFRoZSBzaWJsaW5nIG1hcHMgbXVzdCBiZSBzZXQgYmVmb3JlIHR1cmluZyB0aGUgb25saW5lIG1hcCBvbiBmb3IKKwkgKiB0aGlzIGNwdQorCSAqLworCXNldF9jcHVfc2libGluZ19tYXAoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qCisJICogV2UgbmVlZCB0byBob2xkIGNhbGxfbG9jaywgc28gdGhlcmUgaXMgbm8gaW5jb25zaXN0ZW5jeQorCSAqIGJldHdlZW4gdGhlIHRpbWUgc21wX2NhbGxfZnVuY3Rpb24oKSBkZXRlcm1pbmVzIG51bWJlciBvZgorCSAqIElQSSByZWNlaXBpZW50cywgYW5kIHRoZSB0aW1lIHdoZW4gdGhlIGRldGVybWluYXRpb24gaXMgbWFkZQorCSAqIGZvciB3aGljaCBjcHVzIHJlY2VpdmUgdGhlIElQSSBpbiBnZW5hcGljX2ZsYXQuYy4gSG9sZGluZyB0aGlzCisJICogbG9jayBoZWxwcyB1cyB0byBub3QgaW5jbHVkZSB0aGlzIGNwdSBpbiBhIGN1cnJlbnRseSBpbiBwcm9ncmVzcworCSAqIHNtcF9jYWxsX2Z1bmN0aW9uKCkuCisJICovCisJbG9ja19pcGlfY2FsbF9sb2NrKCk7CisKKwkvKgogCSAqIEFsbG93IHRoZSBtYXN0ZXIgdG8gY29udGludWUuCiAJICovCiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKKwlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7CisJdW5sb2NrX2lwaV9jYWxsX2xvY2soKTsKKwogCW1iKCk7CiAKIAkvKiBXYWl0IGZvciBUU0Mgc3luYyB0byBub3Qgc2NoZWR1bGUgdGhpbmdzIGJlZm9yZS4KQEAgLTYyOCwzMyArNzAxLDc3IEBACiAJcmV0dXJuIChzZW5kX3N0YXR1cyB8IGFjY2VwdF9zdGF0dXMpOwogfQogCitzdHJ1Y3QgY3JlYXRlX2lkbGUgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCWludCBjcHU7Cit9OworCit2b2lkIGRvX2ZvcmtfaWRsZSh2b2lkICpfY19pZGxlKQoreworCXN0cnVjdCBjcmVhdGVfaWRsZSAqY19pZGxlID0gX2NfaWRsZTsKKworCWNfaWRsZS0+aWRsZSA9IGZvcmtfaWRsZShjX2lkbGUtPmNwdSk7CisJY29tcGxldGUoJmNfaWRsZS0+ZG9uZSk7Cit9CisKIC8qCiAgKiBCb290IG9uZSBDUFUuCiAgKi8KIHN0YXRpYyBpbnQgX19jcHVpbml0IGRvX2Jvb3RfY3B1KGludCBjcHUsIGludCBhcGljaWQpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOwogCXVuc2lnbmVkIGxvbmcgYm9vdF9lcnJvcjsKIAlpbnQgdGltZW91dDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3JpcDsKLQkvKgotCSAqIFdlIGNhbid0IHVzZSBrZXJuZWxfdGhyZWFkIHNpbmNlIHdlIG11c3QgYXZvaWQgdG8KLQkgKiByZXNjaGVkdWxlIHRoZSBjaGlsZC4KLQkgKi8KLQlpZGxlID0gZm9ya19pZGxlKGNwdSk7Ci0JaWYgKElTX0VSUihpZGxlKSkgewotCQlwcmludGsoImZhaWxlZCBmb3JrIGZvciBDUFUgJWRcbiIsIGNwdSk7Ci0JCXJldHVybiBQVFJfRVJSKGlkbGUpOworCXN0cnVjdCBjcmVhdGVfaWRsZSBjX2lkbGUgPSB7CisJCS5jcHUgPSBjcHUsCisJCS5kb25lID0gQ09NUExFVElPTl9JTklUSUFMSVpFUihjX2lkbGUuZG9uZSksCisJfTsKKwlERUNMQVJFX1dPUksod29yaywgZG9fZm9ya19pZGxlLCAmY19pZGxlKTsKKworCWNfaWRsZS5pZGxlID0gZ2V0X2lkbGVfZm9yX2NwdShjcHUpOworCisJaWYgKGNfaWRsZS5pZGxlKSB7CisJCWNfaWRsZS5pZGxlLT50aHJlYWQucnNwID0gKHVuc2lnbmVkIGxvbmcpICgoKHN0cnVjdCBwdF9yZWdzICopCisJCQkoVEhSRUFEX1NJWkUgKyAodW5zaWduZWQgbG9uZykgY19pZGxlLmlkbGUtPnRocmVhZF9pbmZvKSkgLSAxKTsKKwkJaW5pdF9pZGxlKGNfaWRsZS5pZGxlLCBjcHUpOworCQlnb3RvIGRvX3Jlc3Q7CiAJfQogCi0JY3B1X3BkYVtjcHVdLnBjdXJyZW50ID0gaWRsZTsKKwkvKgorCSAqIER1cmluZyBjb2xkIGJvb3QgcHJvY2Vzcywga2V2ZW50ZCB0aHJlYWQgaXMgbm90IHNwdW4gdXAgeWV0LgorCSAqIFdoZW4gd2UgZG8gY3B1IGhvdC1hZGQsIHdlIGNyZWF0ZSBpZGxlIHRocmVhZHMgb24gdGhlIGZseSwgd2Ugc2hvdWxkCisJICogbm90IGFjcXVpcmUgYW55IGF0dHJpYnV0ZXMgZnJvbSB0aGUgY2FsbGluZyBjb250ZXh0LiBIZW5jZSB0aGUgY2xlYW4KKwkgKiB3YXkgdG8gY3JlYXRlIGtlcm5lbF90aHJlYWRzKCkgaXMgdG8gZG8gdGhhdCBmcm9tIGtldmVudGQoKS4KKwkgKiBXZSBkbyB0aGUgY3VycmVudF9pc19rZXZlbnRkKCkgZHVlIHRvIHRoZSBmYWN0IHRoYXQgQUNQSSBub3RpZmllcgorCSAqIHdhcyBhbHNvIHF1ZXVpbmcgdG8ga2V2ZW50ZCgpIGFuZCB3aGVuIHRoZSBjYWxsZXIgaXMgYWxyZWFkeSBydW5uaW5nCisJICogaW4gY29udGV4dCBvZiBrZXZlbnRkKCksIHdlIHdvdWxkIGVuZCB1cCB3aXRoIGxvY2tpbmcgdXAgdGhlIGtldmVudGQKKwkgKiB0aHJlYWQuCisJICovCisJaWYgKCFrZXZlbnRkX3VwKCkgfHwgY3VycmVudF9pc19rZXZlbnRkKCkpCisJCXdvcmsuZnVuYyh3b3JrLmRhdGEpOworCWVsc2UgeworCQlzY2hlZHVsZV93b3JrKCZ3b3JrKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmY19pZGxlLmRvbmUpOworCX0KKworCWlmIChJU19FUlIoY19pZGxlLmlkbGUpKSB7CisJCXByaW50aygiZmFpbGVkIGZvcmsgZm9yIENQVSAlZFxuIiwgY3B1KTsKKwkJcmV0dXJuIFBUUl9FUlIoY19pZGxlLmlkbGUpOworCX0KKworCXNldF9pZGxlX2Zvcl9jcHUoY3B1LCBjX2lkbGUuaWRsZSk7CisKK2RvX3Jlc3Q6CisKKwljcHVfcGRhW2NwdV0ucGN1cnJlbnQgPSBjX2lkbGUuaWRsZTsKIAogCXN0YXJ0X3JpcCA9IHNldHVwX3RyYW1wb2xpbmUoKTsKIAotCWluaXRfcnNwID0gaWRsZS0+dGhyZWFkLnJzcDsKKwlpbml0X3JzcCA9IGNfaWRsZS5pZGxlLT50aHJlYWQucnNwOwogCXBlcl9jcHUoaW5pdF90c3MsY3B1KS5yc3AwID0gaW5pdF9yc3A7CiAJaW5pdGlhbF9jb2RlID0gc3RhcnRfc2Vjb25kYXJ5OwotCWNsZWFyX3RpX3RocmVhZF9mbGFnKGlkbGUtPnRocmVhZF9pbmZvLCBUSUZfRk9SSyk7CisJY2xlYXJfdGlfdGhyZWFkX2ZsYWcoY19pZGxlLmlkbGUtPnRocmVhZF9pbmZvLCBUSUZfRk9SSyk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJCb290aW5nIHByb2Nlc3NvciAlZC8lZCByaXAgJWx4IHJzcCAlbHhcbiIsIGNwdSwgYXBpY2lkLAogCSAgICAgICBzdGFydF9yaXAsIGluaXRfcnNwKTsKQEAgLTc0Niw1MSArODYzLDYgQEAKIHVuc2lnbmVkIGxvbmcgY2FjaGVfZGVjYXlfdGlja3M7CiAKIC8qCi0gKiBDb25zdHJ1Y3QgY3B1X3NpYmxpbmdfbWFwW10sIHNvIHRoYXQgd2UgY2FuIHRlbGwgdGhlIHNpYmxpbmcgQ1BVCi0gKiBvbiBTTVQgc3lzdGVtcyBlZmZpY2llbnRseS4KLSAqLwotc3RhdGljIF9fY3B1aW5pdCB2b2lkIGRldGVjdF9zaWJsaW5ncyh2b2lkKQotewotCWludCBjcHU7Ci0KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IE5SX0NQVVM7IGNwdSsrKSB7Ci0JCWNwdXNfY2xlYXIoY3B1X3NpYmxpbmdfbWFwW2NwdV0pOwotCQljcHVzX2NsZWFyKGNwdV9jb3JlX21hcFtjcHVdKTsKLQl9Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1IChjcHUpIHsKLQkJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7Ci0JCWludCBzaWJsaW5ncyA9IDA7Ci0JCWludCBpOwotCQlpZiAoc21wX251bV9zaWJsaW5ncyA+IDEpIHsKLQkJCWZvcl9lYWNoX29ubGluZV9jcHUgKGkpIHsKLQkJCQlpZiAoY3B1X2NvcmVfaWRbY3B1XSA9PSBjcHVfY29yZV9pZFtpXSkgewotCQkJCQlzaWJsaW5ncysrOwotCQkJCQljcHVfc2V0KGksIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzaWJsaW5ncysrOwotCQkJY3B1X3NldChjcHUsIGNwdV9zaWJsaW5nX21hcFtjcHVdKTsKLQkJfQotCi0JCWlmIChzaWJsaW5ncyAhPSBzbXBfbnVtX3NpYmxpbmdzKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICAgICJXQVJOSU5HOiAlZCBzaWJsaW5ncyBmb3VuZCBmb3IgQ1BVJWQsIHNob3VsZCBiZSAlZFxuIiwKLQkJCSAgICAgICBzaWJsaW5ncywgY3B1LCBzbXBfbnVtX3NpYmxpbmdzKTsKLQkJCXNtcF9udW1fc2libGluZ3MgPSBzaWJsaW5nczsKLQkJfQotCQlpZiAoYy0+eDg2X251bV9jb3JlcyA+IDEpIHsKLQkJCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQkJCWlmIChwaHlzX3Byb2NfaWRbY3B1XSA9PSBwaHlzX3Byb2NfaWRbaV0pCi0JCQkJCWNwdV9zZXQoaSwgY3B1X2NvcmVfbWFwW2NwdV0pOwotCQkJfQotCQl9IGVsc2UKLQkJCWNwdV9jb3JlX21hcFtjcHVdID0gY3B1X3NpYmxpbmdfbWFwW2NwdV07Ci0JfQotfQotCi0vKgogICogQ2xlYW51cCBwb3NzaWJsZSBkYW5nbGluZyBlbmRzLi4uCiAgKi8KIHN0YXRpYyBfX2NwdWluaXQgdm9pZCBzbXBfY2xlYW51cF9ib290KHZvaWQpCkBAIC04MjMsNyArODk1LDcgQEAKICAqCiAgKiBSRUQtUEVOIGF1ZGl0L3Rlc3QgdGhpcyBtb3JlLiBJIGJldCB0aGVyZSBpcyBtb3JlIHN0YXRlIG1lc3NlZCB1cCBoZXJlLgogICovCi1zdGF0aWMgX19jcHVpbml0IHZvaWQgZGlzYWJsZV9zbXAodm9pZCkKK3N0YXRpYyBfX2luaXQgdm9pZCBkaXNhYmxlX3NtcCh2b2lkKQogewogCWNwdV9wcmVzZW50X21hcCA9IGNwdW1hc2tfb2ZfY3B1KDApOwogCWNwdV9wb3NzaWJsZV9tYXAgPSBjcHVtYXNrX29mX2NwdSgwKTsKQEAgLTgzOCw3ICs5MTAsNyBAQAogLyoKICAqIEhhbmRsZSB1c2VyIGNwdXM9Li4uIHBhcmFtZXRlci4KICAqLwotc3RhdGljIF9fY3B1aW5pdCB2b2lkIGVuZm9yY2VfbWF4X2NwdXModW5zaWduZWQgbWF4X2NwdXMpCitzdGF0aWMgX19pbml0IHZvaWQgZW5mb3JjZV9tYXhfY3B1cyh1bnNpZ25lZCBtYXhfY3B1cykKIHsKIAlpbnQgaSwgazsKIAlrID0gMDsKQEAgLTg1NSw3ICs5MjcsNyBAQAogLyoKICAqIFZhcmlvdXMgc2FuaXR5IGNoZWNrcy4KICAqLwotc3RhdGljIGludCBfX2NwdWluaXQgc21wX3Nhbml0eV9jaGVjayh1bnNpZ25lZCBtYXhfY3B1cykKK3N0YXRpYyBpbnQgX19pbml0IHNtcF9zYW5pdHlfY2hlY2sodW5zaWduZWQgbWF4X2NwdXMpCiB7CiAJaWYgKCFwaHlzaWRfaXNzZXQoaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCksIHBoeXNfY3B1X3ByZXNlbnRfbWFwKSkgewogCQlwcmludGsoIndlaXJkLCBib290IENQVSAoIyVkKSBub3QgbGlzdGVkIGJ5IHRoZSBCSU9TLlxuIiwKQEAgLTkxMyw3ICs5ODUsNyBAQAogICogUHJlcGFyZSBmb3IgU01QIGJvb3R1cC4gIFRoZSBNUCB0YWJsZSBvciBBQ1BJIGhhcyBiZWVuIHJlYWQKICAqIGVhcmxpZXIuICBKdXN0IGRvIHNvbWUgc2FuaXR5IGNoZWNraW5nIGhlcmUgYW5kIGVuYWJsZSBBUElDIG1vZGUuCiAgKi8KLXZvaWQgX19jcHVpbml0IHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQordm9pZCBfX2luaXQgc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CiAJaW50IGk7CiAKQEAgLTkzMCwxMCArMTAwMiw5IEBACiAJCWludCBhcGljaWQgPSBjcHVfcHJlc2VudF90b19hcGljaWQoaSk7CiAJCWlmIChwaHlzaWRfaXNzZXQoYXBpY2lkLCBwaHlzX2NwdV9wcmVzZW50X21hcCkpIHsKIAkJCWNwdV9zZXQoaSwgY3B1X3ByZXNlbnRfbWFwKTsKLQkJCS8qIHBvc3NpYmxlIG1hcCB3b3VsZCBiZSBkaWZmZXJlbnQgaWYgd2Ugc3VwcG9ydGVkIHJlYWwKLQkJCSAgIENQVSBob3RwbHVnLiAqLwogCQkJY3B1X3NldChpLCBjcHVfcG9zc2libGVfbWFwKTsKIAkJfQorCQlmaXh1cF9jcHVfcG9zc2libGVfbWFwKGkpOwogCX0KIAogCWlmIChzbXBfc2FuaXR5X2NoZWNrKG1heF9jcHVzKSA8IDApIHsKQEAgLTk3OCwxMyArMTA0OSwxMyBAQAogCWludCBtZSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAljcHVfc2V0KG1lLCBjcHVfb25saW5lX21hcCk7CiAJY3B1X3NldChtZSwgY3B1X2NhbGxvdXRfbWFwKTsKKwljcHVfc2V0KDAsIGNwdV9zaWJsaW5nX21hcFswXSk7CisJY3B1X3NldCgwLCBjcHVfY29yZV9tYXBbMF0pOworCXBlcl9jcHUoY3B1X3N0YXRlLCBtZSkgPSBDUFVfT05MSU5FOwogfQogCiAvKgogICogRW50cnkgcG9pbnQgdG8gYm9vdCBhIENQVS4KLSAqCi0gKiBUaGlzIGlzIGFsbCBfX2NwdWluaXQsIG5vdCBfX2RldmluaXQgZm9yIG5vdyBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQKLSAqIENQVSBob3RwbHVnICh5ZXQpLgogICovCiBpbnQgX19jcHVpbml0IF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUpCiB7CkBAIC0xMDAxLDYgKzEwNzIsMTUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJLyoKKwkgKiBBbHJlYWR5IGJvb3RlZCBDUFU/CisJICovCisgCWlmIChjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpIHsKKwkJRHByaW50aygiZG9fYm9vdF9jcHUgJWQgQWxyZWFkeSBzdGFydGVkXG4iLCBjcHUpOworIAkJcmV0dXJuIC1FTk9TWVM7CisJfQorCisJcGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPSBDUFVfVVBfUFJFUEFSRTsKIAkvKiBCb290IGl0ISAqLwogCWVyciA9IGRvX2Jvb3RfY3B1KGNwdSwgYXBpY2lkKTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtMTAxMywyMyArMTA5MywxMTggQEAKIAogCXdoaWxlICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQogCQljcHVfcmVsYXgoKTsKLQlyZXR1cm4gMDsKKwllcnIgPSAwOworCisJcmV0dXJuIGVycjsKIH0KIAogLyoKICAqIEZpbmlzaCB0aGUgU01QIGJvb3QuCiAgKi8KLXZvaWQgX19jcHVpbml0IHNtcF9jcHVzX2RvbmUodW5zaWduZWQgaW50IG1heF9jcHVzKQordm9pZCBfX2luaXQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCiB7CisjaWZuZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCXphcF9sb3dfbWFwcGluZ3MoKTsKKyNlbmRpZgogCXNtcF9jbGVhbnVwX2Jvb3QoKTsKIAogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCXNldHVwX2lvYXBpY19kZXN0KCk7CiAjZW5kaWYKIAotCWRldGVjdF9zaWJsaW5ncygpOwogCXRpbWVfaW5pdF9ndG9kKCk7CiAKIAljaGVja19ubWlfd2F0Y2hkb2coKTsKIH0KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCitzdGF0aWMgdm9pZCByZW1vdmVfc2libGluZ2luZm8oaW50IGNwdSkKK3sKKwlpbnQgc2libGluZzsKKworCWZvcl9lYWNoX2NwdV9tYXNrKHNpYmxpbmcsIGNwdV9zaWJsaW5nX21hcFtjcHVdKQorCQljcHVfY2xlYXIoY3B1LCBjcHVfc2libGluZ19tYXBbc2libGluZ10pOworCWZvcl9lYWNoX2NwdV9tYXNrKHNpYmxpbmcsIGNwdV9jb3JlX21hcFtjcHVdKQorCQljcHVfY2xlYXIoY3B1LCBjcHVfY29yZV9tYXBbc2libGluZ10pOworCWNwdXNfY2xlYXIoY3B1X3NpYmxpbmdfbWFwW2NwdV0pOworCWNwdXNfY2xlYXIoY3B1X2NvcmVfbWFwW2NwdV0pOworCXBoeXNfcHJvY19pZFtjcHVdID0gQkFEX0FQSUNJRDsKKwljcHVfY29yZV9pZFtjcHVdID0gQkFEX0FQSUNJRDsKK30KKwordm9pZCByZW1vdmVfY3B1X2Zyb21fbWFwcyh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwljcHVfY2xlYXIoY3B1LCBjcHVfY2FsbG91dF9tYXApOworCWNwdV9jbGVhcihjcHUsIGNwdV9jYWxsaW5fbWFwKTsKKwljbGVhcl9iaXQoY3B1LCAmY3B1X2luaXRpYWxpemVkKTsgLyogd2FzIHNldCBieSBjcHVfaW5pdCgpICovCit9CisKK2ludCBfX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qCisJICogUGVyaGFwcyB1c2UgY3B1ZnJlcSB0byBkcm9wIGZyZXF1ZW5jeSwgYnV0IHRoYXQgY291bGQgZ28KKwkgKiBpbnRvIGdlbmVyaWMgY29kZS4KKyAJICoKKwkgKiBXZSB3b24ndCB0YWtlIGRvd24gdGhlIGJvb3QgcHJvY2Vzc29yIG9uIGkzODYgZHVlIHRvIHNvbWUKKwkgKiBpbnRlcnJ1cHRzIG9ubHkgYmVpbmcgYWJsZSB0byBiZSBzZXJ2aWNlZCBieSB0aGUgQlNQLgorCSAqIEVzcGVjaWFsbHkgc28gaWYgd2UncmUgbm90IHVzaW5nIGFuIElPQVBJQwktendhbmUKKwkgKi8KKwlpZiAoY3B1ID09IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlkaXNhYmxlX0FQSUNfdGltZXIoKTsKKworCS8qCisJICogSEFDSzoKKwkgKiBBbGxvdyBhbnkgcXVldWVkIHRpbWVyIGludGVycnVwdHMgdG8gZ2V0IHNlcnZpY2VkCisJICogVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsIHdlIGNsZWFudXAKKwkgKiBmaXh1cF9pcnFzIGFzIHdlIGRvIGZvciBJQTY0LgorCSAqLworCWxvY2FsX2lycV9lbmFibGUoKTsKKwltZGVsYXkoMSk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXJlbW92ZV9zaWJsaW5naW5mbyhjcHUpOworCisJLyogSXQncyBub3cgc2FmZSB0byByZW1vdmUgdGhpcyBwcm9jZXNzb3IgZnJvbSB0aGUgb25saW5lIG1hcCAqLworCWNwdV9jbGVhcihjcHUsIGNwdV9vbmxpbmVfbWFwKTsKKwlyZW1vdmVfY3B1X2Zyb21fbWFwcygpOworCWZpeHVwX2lycXMoY3B1X29ubGluZV9tYXApOworCXJldHVybiAwOworfQorCit2b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmU6IGlkbGUgdGFzayBpcyBmYWtpbmcgZGVhdGggaXRzZWxmLiAqLworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJLyogVGhleSBhY2sgdGhpcyBpbiBwbGF5X2RlYWQgYnkgc2V0dGluZyBDUFVfREVBRCAqLworCQlpZiAocGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPT0gQ1BVX0RFQUQpIHsKKwkJCXByaW50ayAoIkNQVSAlZCBpcyBub3cgb2ZmbGluZVxuIiwgY3B1KTsKKwkJCXJldHVybjsKKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwl9CisgCXByaW50ayhLRVJOX0VSUiAiQ1BVICV1IGRpZG4ndCBkaWUuLi5cbiIsIGNwdSk7Cit9CisKKyNlbHNlIC8qIC4uLiAhQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK2ludCBfX2NwdV9kaXNhYmxlKHZvaWQpCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3ZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogV2Ugc2FpZCAibm8iIGluIF9fY3B1X2Rpc2FibGUgKi8KKwlCVUcoKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3VzcGVuZC5jCmluZGV4IGViYWExZTMuLjA2MTI2NDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zdXNwZW5kLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3N1c3BlbmQuYwpAQCAtNDQsNyArNDQsNiBAQAogCSAqLwogCWFzbSB2b2xhdGlsZSAoInNnZHQgJTAiIDogIj1tIiAoY3R4dC0+Z2R0X2xpbWl0KSk7CiAJYXNtIHZvbGF0aWxlICgic2lkdCAlMCIgOiAiPW0iIChjdHh0LT5pZHRfbGltaXQpKTsKLQlhc20gdm9sYXRpbGUgKCJzbGR0ICUwIiA6ICI9bSIgKGN0eHQtPmxkdCkpOwogCWFzbSB2b2xhdGlsZSAoInN0ciAlMCIgIDogIj1tIiAoY3R4dC0+dHIpKTsKIAogCS8qIFhNTTAuLlhNTTE1IHNob3VsZCBiZSBoYW5kbGVkIGJ5IGtlcm5lbF9mcHVfYmVnaW4oKS4gKi8KQEAgLTY5LDYgKzY4LDcgQEAKIAlhc20gdm9sYXRpbGUgKCJtb3ZxICUlY3IyLCAlMCIgOiAiPXIiIChjdHh0LT5jcjIpKTsKIAlhc20gdm9sYXRpbGUgKCJtb3ZxICUlY3IzLCAlMCIgOiAiPXIiIChjdHh0LT5jcjMpKTsKIAlhc20gdm9sYXRpbGUgKCJtb3ZxICUlY3I0LCAlMCIgOiAiPXIiIChjdHh0LT5jcjQpKTsKKwlhc20gdm9sYXRpbGUgKCJtb3ZxICUlY3I4LCAlMCIgOiAiPXIiIChjdHh0LT5jcjgpKTsKIH0KIAogdm9pZCBzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSh2b2lkKQpAQCAtOTAsMTIgKzkwLDIwIEBACiAJLyoKIAkgKiBjb250cm9sIHJlZ2lzdGVycwogCSAqLworCWFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsICUlY3I4IiA6OiAiciIgKGN0eHQtPmNyOCkpOwogCWFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsICUlY3I0IiA6OiAiciIgKGN0eHQtPmNyNCkpOwogCWFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsICUlY3IzIiA6OiAiciIgKGN0eHQtPmNyMykpOwogCWFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsICUlY3IyIiA6OiAiciIgKGN0eHQtPmNyMikpOwogCWFzbSB2b2xhdGlsZSAoIm1vdnEgJTAsICUlY3IwIiA6OiAiciIgKGN0eHQtPmNyMCkpOwogCiAJLyoKKwkgKiBub3cgcmVzdG9yZSB0aGUgZGVzY3JpcHRvciB0YWJsZXMgdG8gdGhlaXIgcHJvcGVyIHZhbHVlcworCSAqIGx0ciBpcyBkb25lIGkgZml4X3Byb2Nlc3Nvcl9jb250ZXh0KCkuCisJICovCisJYXNtIHZvbGF0aWxlICgibGdkdCAlMCIgOjogIm0iIChjdHh0LT5nZHRfbGltaXQpKTsKKwlhc20gdm9sYXRpbGUgKCJsaWR0ICUwIiA6OiAibSIgKGN0eHQtPmlkdF9saW1pdCkpOworCisJLyoKIAkgKiBzZWdtZW50IHJlZ2lzdGVycwogCSAqLwogCWFzbSB2b2xhdGlsZSAoIm1vdncgJTAsICUlZHMiIDo6ICJyIiAoY3R4dC0+ZHMpKTsKQEAgLTEwOCwxNyArMTE2LDEwIEBACiAJd3Jtc3JsKE1TUl9HU19CQVNFLCBjdHh0LT5nc19iYXNlKTsKIAl3cm1zcmwoTVNSX0tFUk5FTF9HU19CQVNFLCBjdHh0LT5nc19rZXJuZWxfYmFzZSk7CiAKLQkvKgotCSAqIG5vdyByZXN0b3JlIHRoZSBkZXNjcmlwdG9yIHRhYmxlcyB0byB0aGVpciBwcm9wZXIgdmFsdWVzCi0JICogbHRyIGlzIGRvbmUgaSBmaXhfcHJvY2Vzc29yX2NvbnRleHQoKS4KLQkgKi8KLQlhc20gdm9sYXRpbGUgKCJsZ2R0ICUwIiA6OiAibSIgKGN0eHQtPmdkdF9saW1pdCkpOwotCWFzbSB2b2xhdGlsZSAoImxpZHQgJTAiIDo6ICJtIiAoY3R4dC0+aWR0X2xpbWl0KSk7Ci0JYXNtIHZvbGF0aWxlICgibGxkdCAlMCIgOjogIm0iIChjdHh0LT5sZHQpKTsKLQogCWZpeF9wcm9jZXNzb3JfY29udGV4dCgpOwogCiAJZG9fZnB1X2VuZCgpOworCW10cnJfYXBfaW5pdCgpOwogfQogCiB2b2lkIHJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCmluZGV4IDEyMTY0NmYuLjEwMjczNjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jCkBAIC01ODYsMTEgKzU4NiwxNyBAQAogYXNtbGlua2FnZSB2b2lkIGRlZmF1bHRfZG9fbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gMDsKKwlpbnQgY3B1OworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJLyogT25seSB0aGUgQlNQIGdldHMgZXh0ZXJuYWwgTk1JcyBmcm9tIHRoZSBzeXN0ZW0uICAqLwotCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpKQorCWlmICghY3B1KQogCQlyZWFzb24gPSBnZXRfbm1pX3JlYXNvbigpOwogCisJaWYgKCFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybjsKKwogCWlmICghKHJlYXNvbiAmIDB4YzApKSB7CiAJCWlmIChub3RpZnlfZGllKERJRV9OTUlfSVBJLCAibm1pX2lwaSIsIHJlZ3MsIHJlYXNvbiwgMCwgU0lHSU5UKQogCQkJCQkJCQk9PSBOT1RJRllfU1RPUCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNTllYmQ1Yi4uMmE5NGY5YiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTIsNyArMiwxMCBAQAogICogV3JpdHRlbiBieSBNYXJ0aW4gTWFyZXMgPG1qQGF0cmV5Lmthcmxpbi5tZmYuY3VuaS5jej47CiAgKi8KIAorI2RlZmluZSBMT0FEX09GRlNFVCBfX1NUQVJUX0tFUk5FTF9tYXAKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQpAQCAtMTEsMjggKzE0LDMwIEBACiBqaWZmaWVzXzY0ID0gamlmZmllczsKIFNFQ1RJT05TCiB7Ci0gIC4gPSAweGZmZmZmZmZmODAxMDAwMDA7CisgIC4gPSBfX1NUQVJUX0tFUk5FTDsKICAgcGh5c19zdGFydHVwXzY0ID0gc3RhcnR1cF82NCAtIExPQURfT0ZGU0VUOwogICBfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KLSAgLnRleHQgOiB7CisgIC50ZXh0IDogIEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKIAkqKC50ZXh0KQogCVNDSEVEX1RFWFQKIAlMT0NLX1RFWFQKIAkqKC5maXh1cCkKIAkqKC5nbnUud2FybmluZykKIAl9ID0gMHg5MDkwCi0gIC50ZXh0LmxvY2sgOiB7ICooLnRleHQubG9jaykgfQkvKiBvdXQtb2YtbGluZSBsb2NrIHRleHQgKi8KKyAgCQkJCS8qIG91dC1vZi1saW5lIGxvY2sgdGV4dCAqLworICAudGV4dC5sb2NrIDogQVQoQUREUigudGV4dC5sb2NrKSAtIExPQURfT0ZGU0VUKSB7ICooLnRleHQubG9jaykgfQogCiAgIF9ldGV4dCA9IC47CQkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLwogCiAgIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KICAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLSAgX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9CisgIF9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsgKihfX2V4X3RhYmxlKSB9CiAgIF9fc3RvcF9fX2V4X3RhYmxlID0gLjsKIAogICBST0RBVEEKIAotICAuZGF0YSA6IHsJCQkvKiBEYXRhICovCisJCQkJLyogRGF0YSAqLworICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsKIAkqKC5kYXRhKQogCUNPTlNUUlVDVE9SUwogCX0KQEAgLTQwLDYyICs0NSw5OSBAQAogICBfZWRhdGEgPSAuOwkJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIAogICBfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLSAgLmJzcyA6IHsKKyAgLmJzcyA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewogCSooLmJzcy5wYWdlX2FsaWduZWQpCQogCSooLmJzcykKIAl9CiAgIF9fYnNzX2VuZCA9IC47CiAKKyAgLiA9IEFMSUdOKFBBR0VfU0laRSk7CiAgIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiB7ICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpIH0KKyAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKKyAgfQorICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7CisgIC5kYXRhLnJlYWRfbW9zdGx5IDogQVQoQUREUiguZGF0YS5yZWFkX21vc3RseSkgLSBMT0FEX09GRlNFVCkgeworICAJKiguZGF0YS5yZWFkX21vc3RseSkKKyAgfQogCi0jZGVmaW5lIEFGVEVSKHgpICAgICAgQklOQUxJR04oTE9BREFERFIoeCkgKyBTSVpFT0YoeCksIDE2KQotI2RlZmluZSBCSU5BTElHTih4LHkpICgoKHgpICsgKHkpIC0gMSkgICYgfigoeSkgLSAxKSkKLSNkZWZpbmUgQ0FDSEVfQUxJR04oeCkgQklOQUxJR04oeCwgQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUykKKyNkZWZpbmUgVlNZU0NBTExfQUREUiAoLTEwKjEwMjQqMTAyNCkKKyNkZWZpbmUgVlNZU0NBTExfUEhZU19BRERSICgoTE9BREFERFIoLmRhdGEucmVhZF9tb3N0bHkpICsgU0laRU9GKC5kYXRhLnJlYWRfbW9zdGx5KSArIDQwOTUpICYgfig0MDk1KSkKKyNkZWZpbmUgVlNZU0NBTExfVklSVF9BRERSICgoQUREUiguZGF0YS5yZWFkX21vc3RseSkgKyBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQogCi0gIC52c3lzY2FsbF8wIC0xMCoxMDI0KjEwMjQ6IEFUICgoTE9BREFERFIoLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpICsgU0laRU9GKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSArIDQwOTUpICYgfig0MDk1KSkgeyAqKC52c3lzY2FsbF8wKSB9Ci0gIF9fdnN5c2NhbGxfMCA9IExPQURBRERSKC52c3lzY2FsbF8wKTsKKyNkZWZpbmUgVkxPQURfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gVlNZU0NBTExfUEhZU19BRERSKQorI2RlZmluZSBWTE9BRCh4KSAoQUREUih4KSAtIFZMT0FEX09GRlNFVCkKKworI2RlZmluZSBWVklSVF9PRkZTRVQgKFZTWVNDQUxMX0FERFIgLSBWU1lTQ0FMTF9WSVJUX0FERFIpCisjZGVmaW5lIFZWSVJUKHgpIChBRERSKHgpIC0gVlZJUlRfT0ZGU0VUKQorCisgIC4gPSBWU1lTQ0FMTF9BRERSOworICAudnN5c2NhbGxfMCA6CSBBVChWU1lTQ0FMTF9QSFlTX0FERFIpIHsgKigudnN5c2NhbGxfMCkgfQorICBfX3ZzeXNjYWxsXzAgPSBWU1lTQ0FMTF9WSVJUX0FERFI7CisKICAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwotICAueHRpbWVfbG9jayA6IEFUIENBQ0hFX0FMSUdOKEFGVEVSKC52c3lzY2FsbF8wKSkgeyAqKC54dGltZV9sb2NrKSB9Ci0gIHh0aW1lX2xvY2sgPSBMT0FEQUREUigueHRpbWVfbG9jayk7Ci0gIC52eHRpbWUgOiBBVCBBRlRFUigueHRpbWVfbG9jaykgeyAqKC52eHRpbWUpIH0KLSAgdnh0aW1lID0gTE9BREFERFIoLnZ4dGltZSk7Ci0gIC53YWxsX2ppZmZpZXMgOiBBVCBBRlRFUigudnh0aW1lKSB7ICooLndhbGxfamlmZmllcykgfQotICB3YWxsX2ppZmZpZXMgPSBMT0FEQUREUigud2FsbF9qaWZmaWVzKTsKLSAgLnN5c190eiA6IEFUIEFGVEVSKC53YWxsX2ppZmZpZXMpIHsgKiguc3lzX3R6KSB9Ci0gIHN5c190eiA9IExPQURBRERSKC5zeXNfdHopOwotICAuc3lzY3RsX3ZzeXNjYWxsIDogQVQgQUZURVIoLnN5c190eikgeyAqKC5zeXNjdGxfdnN5c2NhbGwpIH0KLSAgc3lzY3RsX3ZzeXNjYWxsID0gTE9BREFERFIoLnN5c2N0bF92c3lzY2FsbCk7IAotICAueHRpbWUgOiBBVCBBRlRFUiguc3lzY3RsX3ZzeXNjYWxsKSB7ICooLnh0aW1lKSB9Ci0gIHh0aW1lID0gTE9BREFERFIoLnh0aW1lKTsKKyAgLnh0aW1lX2xvY2sgOiBBVChWTE9BRCgueHRpbWVfbG9jaykpIHsgKigueHRpbWVfbG9jaykgfQorICB4dGltZV9sb2NrID0gVlZJUlQoLnh0aW1lX2xvY2spOworCisgIC52eHRpbWUgOiBBVChWTE9BRCgudnh0aW1lKSkgeyAqKC52eHRpbWUpIH0KKyAgdnh0aW1lID0gVlZJUlQoLnZ4dGltZSk7CisKKyAgLndhbGxfamlmZmllcyA6IEFUKFZMT0FEKC53YWxsX2ppZmZpZXMpKSB7ICooLndhbGxfamlmZmllcykgfQorICB3YWxsX2ppZmZpZXMgPSBWVklSVCgud2FsbF9qaWZmaWVzKTsKKworICAuc3lzX3R6IDogQVQoVkxPQUQoLnN5c190eikpIHsgKiguc3lzX3R6KSB9CisgIHN5c190eiA9IFZWSVJUKC5zeXNfdHopOworCisgIC5zeXNjdGxfdnN5c2NhbGwgOiBBVChWTE9BRCguc3lzY3RsX3ZzeXNjYWxsKSkgeyAqKC5zeXNjdGxfdnN5c2NhbGwpIH0KKyAgc3lzY3RsX3ZzeXNjYWxsID0gVlZJUlQoLnN5c2N0bF92c3lzY2FsbCk7CisKKyAgLnh0aW1lIDogQVQoVkxPQUQoLnh0aW1lKSkgeyAqKC54dGltZSkgfQorICB4dGltZSA9IFZWSVJUKC54dGltZSk7CisKICAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwotICAuamlmZmllcyA6IEFUIENBQ0hFX0FMSUdOKEFGVEVSKC54dGltZSkpIHsgKiguamlmZmllcykgfQotICBqaWZmaWVzID0gTE9BREFERFIoLmppZmZpZXMpOwotICAudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUIChMT0FEQUREUigudnN5c2NhbGxfMCkgKyAxMDI0KSB7ICooLnZzeXNjYWxsXzEpIH0KLSAgLiA9IExPQURBRERSKC52c3lzY2FsbF8wKSArIDQwOTY7CisgIC5qaWZmaWVzIDogQVQoVkxPQUQoLmppZmZpZXMpKSB7ICooLmppZmZpZXMpIH0KKyAgamlmZmllcyA9IFZWSVJUKC5qaWZmaWVzKTsKKworICAudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUKFZMT0FEKC52c3lzY2FsbF8xKSkgeyAqKC52c3lzY2FsbF8xKSB9CisgIC52c3lzY2FsbF8yIEFERFIoLnZzeXNjYWxsXzApICsgMjA0ODogQVQoVkxPQUQoLnZzeXNjYWxsXzIpKSB7ICooLnZzeXNjYWxsXzIpIH0KKyAgLnZzeXNjYWxsXzMgQUREUigudnN5c2NhbGxfMCkgKyAzMDcyOiBBVChWTE9BRCgudnN5c2NhbGxfMykpIHsgKigudnN5c2NhbGxfMykgfQorCisgIC4gPSBWU1lTQ0FMTF9WSVJUX0FERFIgKyA0MDk2OworCisjdW5kZWYgVlNZU0NBTExfQUREUgorI3VuZGVmIFZTWVNDQUxMX1BIWVNfQUREUgorI3VuZGVmIFZTWVNDQUxMX1ZJUlRfQUREUgorI3VuZGVmIFZMT0FEX09GRlNFVAorI3VuZGVmIFZMT0FECisjdW5kZWYgVlZJUlRfT0ZGU0VUCisjdW5kZWYgVlZJUlQKIAogICAuID0gQUxJR04oODE5Mik7CQkvKiBpbml0X3Rhc2sgKi8KLSAgLmRhdGEuaW5pdF90YXNrIDogeyAqKC5kYXRhLmluaXRfdGFzaykgfQorICAuZGF0YS5pbml0X3Rhc2sgOiBBVChBRERSKC5kYXRhLmluaXRfdGFzaykgLSBMT0FEX09GRlNFVCkgeworCSooLmRhdGEuaW5pdF90YXNrKQorICB9CiAKICAgLiA9IEFMSUdOKDQwOTYpOwotICAuZGF0YS5wYWdlX2FsaWduZWQgOiB7ICooLmRhdGEucGFnZV9hbGlnbmVkKSB9CisgIC5kYXRhLnBhZ2VfYWxpZ25lZCA6IEFUKEFERFIoLmRhdGEucGFnZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJKiguZGF0YS5wYWdlX2FsaWduZWQpCisgIH0KIAogICAuID0gQUxJR04oNDA5Nik7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KICAgX19pbml0X2JlZ2luID0gLjsKLSAgLmluaXQudGV4dCA6IHsgCisgIC5pbml0LnRleHQgOiBBVChBRERSKC5pbml0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKIAlfc2luaXR0ZXh0ID0gLjsKIAkqKC5pbml0LnRleHQpCiAJX2Vpbml0dGV4dCA9IC47CiAgIH0KICAgX19pbml0ZGF0YV9iZWdpbiA9IC47Ci0gIC5pbml0LmRhdGEgOiB7ICooLmluaXQuZGF0YSkgfQorICAuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7ICooLmluaXQuZGF0YSkgfQogICBfX2luaXRkYXRhX2VuZCA9IC47CiAgIC4gPSBBTElHTigxNik7CiAgIF9fc2V0dXBfc3RhcnQgPSAuOwotICAuaW5pdC5zZXR1cCA6IHsgKiguaW5pdC5zZXR1cCkgfQorICAuaW5pdC5zZXR1cCA6IEFUKEFERFIoLmluaXQuc2V0dXApIC0gTE9BRF9PRkZTRVQpIHsgKiguaW5pdC5zZXR1cCkgfQogICBfX3NldHVwX2VuZCA9IC47CiAgIF9faW5pdGNhbGxfc3RhcnQgPSAuOwotICAuaW5pdGNhbGwuaW5pdCA6IHsKKyAgLmluaXRjYWxsLmluaXQgOiBBVChBRERSKC5pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7CiAJKiguaW5pdGNhbGwxLmluaXQpIAogCSooLmluaXRjYWxsMi5pbml0KSAKIAkqKC5pbml0Y2FsbDMuaW5pdCkgCkBAIC0xMDYsMzIgKzE0OCwzOCBAQAogICB9CiAgIF9faW5pdGNhbGxfZW5kID0gLjsKICAgX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotICAuY29uX2luaXRjYWxsLmluaXQgOiB7ICooLmNvbl9pbml0Y2FsbC5pbml0KSB9CisgIC5jb25faW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmNvbl9pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7CisJKiguY29uX2luaXRjYWxsLmluaXQpCisgIH0KICAgX19jb25faW5pdGNhbGxfZW5kID0gLjsKICAgU0VDVVJJVFlfSU5JVAogICAuID0gQUxJR04oOCk7CiAgIF9fYWx0X2luc3RydWN0aW9ucyA9IC47Ci0gIC5hbHRpbnN0cnVjdGlvbnMgOiB7ICooLmFsdGluc3RydWN0aW9ucykgfSAKKyAgLmFsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLmFsdGluc3RydWN0aW9ucykgLSBMT0FEX09GRlNFVCkgeworCSooLmFsdGluc3RydWN0aW9ucykKKyAgfQogICBfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsgCi0gLmFsdGluc3RyX3JlcGxhY2VtZW50IDogeyAqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgfQorICAuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiBBVChBRERSKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgeworCSooLmFsdGluc3RyX3JlcGxhY2VtZW50KQorICB9CiAgIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwogICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLwotICAuZXhpdC50ZXh0IDogeyAqKC5leGl0LnRleHQpIH0KLSAgLmV4aXQuZGF0YSA6IHsgKiguZXhpdC5kYXRhKSB9CQorICAuZXhpdC50ZXh0IDogQVQoQUREUiguZXhpdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7ICooLmV4aXQudGV4dCkgfQorICAuZXhpdC5kYXRhIDogQVQoQUREUiguZXhpdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7ICooLmV4aXQuZGF0YSkgfQogICAuID0gQUxJR04oNDA5Nik7CiAgIF9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLSAgLmluaXQucmFtZnMgOiB7ICooLmluaXQucmFtZnMpIH0KKyAgLmluaXQucmFtZnMgOiBBVChBRERSKC5pbml0LnJhbWZzKSAtIExPQURfT0ZGU0VUKSB7ICooLmluaXQucmFtZnMpIH0KICAgX19pbml0cmFtZnNfZW5kID0gLjsJCiAgIC4gPSBBTElHTigzMik7CiAgIF9fcGVyX2NwdV9zdGFydCA9IC47Ci0gIC5kYXRhLnBlcmNwdSAgOiB7ICooLmRhdGEucGVyY3B1KSB9CisgIC5kYXRhLnBlcmNwdSAgOiBBVChBRERSKC5kYXRhLnBlcmNwdSkgLSBMT0FEX09GRlNFVCkgeyAqKC5kYXRhLnBlcmNwdSkgfQogICBfX3Blcl9jcHVfZW5kID0gLjsKICAgLiA9IEFMSUdOKDQwOTYpOwogICBfX2luaXRfZW5kID0gLjsKIAogICAuID0gQUxJR04oNDA5Nik7CiAgIF9fbm9zYXZlX2JlZ2luID0gLjsKLSAgLmRhdGFfbm9zYXZlIDogeyAqKC5kYXRhLm5vc2F2ZSkgfQorICAuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgeyAqKC5kYXRhLm5vc2F2ZSkgfQogICAuID0gQUxJR04oNDA5Nik7CiAgIF9fbm9zYXZlX2VuZCA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL251bWEuYyBiL2FyY2gveDg2XzY0L21tL251bWEuYwppbmRleCA4NGNkZTc5Li5hYzYxYzE4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9udW1hLmMKKysrIGIvYXJjaC94ODZfNjQvbW0vbnVtYS5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAlzZXR1cF9ub2RlX2Jvb3RtZW0oMCwgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsIGVuZF9wZm4gPDwgUEFHRV9TSElGVCk7CiB9CiAKLV9faW5pdCB2b2lkIG51bWFfYWRkX2NwdShpbnQgY3B1KQorX19jcHVpbml0IHZvaWQgbnVtYV9hZGRfY3B1KGludCBjcHUpCiB7CiAJLyogQlAgaXMgaW5pdGlhbGl6ZWQgZWxzZXdoZXJlICovCiAJaWYgKGNwdSkgCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCmluZGV4IGI2OTNjMjMuLjY1N2U4OGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCisrKyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCkBAIC03LDI1ICs3LDUwIEBACiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgInBjaS5oIgogCiAjZGVmaW5lIE1NQ09ORklHX0FQRVJfU0laRSAoMjU2KjEwMjQqMTAyNCkKIAotLyogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE1NQ09ORklHIGFwZXJ0dXJlLiAgU2V0IGZyb20gQUNQSSB0YWJsZXMuICovCi11MzIgcGNpX21tY2ZnX2Jhc2VfYWRkcjsKLQogLyogU3RhdGljIHZpcnR1YWwgbWFwcGluZyBvZiB0aGUgTU1DT05GSUcgYXBlcnR1cmUgKi8KLWNoYXIgKnBjaV9tbWNmZ192aXJ0Oworc3RydWN0IG1tY2ZnX3ZpcnQgeworCXN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpjZmc7CisJY2hhciAqdmlydDsKK307CitzdGF0aWMgc3RydWN0IG1tY2ZnX3ZpcnQgKnBjaV9tbWNmZ192aXJ0OwogCi1zdGF0aWMgaW5saW5lIGNoYXIgKnBjaV9kZXZfYmFzZSh1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCitzdGF0aWMgY2hhciAqZ2V0X3ZpcnQodW5zaWduZWQgaW50IHNlZywgaW50IGJ1cykKIHsKLQlyZXR1cm4gcGNpX21tY2ZnX3ZpcnQgKyAoKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpKTsKKwlpbnQgY2ZnX251bSA9IC0xOworCXN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnICpjZmc7CisKKwl3aGlsZSAoMSkgeworCQkrK2NmZ19udW07CisJCWlmIChjZmdfbnVtID49IHBjaV9tbWNmZ19jb25maWdfbnVtKSB7CisJCQkvKiBzb21ldGhpbmcgYmFkIGlzIGdvaW5nIG9uLCBubyBjZmcgdGFibGUgaXMgZm91bmQuICovCisJCQkvKiBzbyB3ZSBmYWxsIGJhY2sgdG8gdGhlIG9sZCB3YXkgd2UgdXNlZCB0byBkbyB0aGlzICovCisJCQkvKiBhbmQganVzdCByZWx5IG9uIHRoZSBmaXJzdCBlbnRyeSB0byBiZSBjb3JyZWN0LiAqLworCQkJcmV0dXJuIHBjaV9tbWNmZ192aXJ0WzBdLnZpcnQ7CisJCX0KKwkJY2ZnID0gcGNpX21tY2ZnX3ZpcnRbY2ZnX251bV0uY2ZnOworCQlpZiAoY2ZnLT5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIgIT0gc2VnKQorCQkJY29udGludWU7CisJCWlmICgoY2ZnLT5zdGFydF9idXNfbnVtYmVyIDw9IGJ1cykgJiYKKwkJICAgIChjZmctPmVuZF9idXNfbnVtYmVyID49IGJ1cykpCisJCQlyZXR1cm4gcGNpX21tY2ZnX3ZpcnRbY2ZnX251bV0udmlydDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqcGNpX2Rldl9iYXNlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3sKKworCXJldHVybiBnZXRfdmlydChzZWcsIGJ1cykgKyAoKGJ1cyA8PCAyMCkgfCAoZGV2Zm4gPDwgMTIpKTsKIH0KIAogc3RhdGljIGludCBwY2lfbW1jZmdfcmVhZCh1bnNpZ25lZCBpbnQgc2VnLCB1bnNpZ25lZCBpbnQgYnVzLAogCQkJICB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCByZWcsIGludCBsZW4sIHUzMiAqdmFsdWUpCiB7Ci0JY2hhciAqYWRkciA9IHBjaV9kZXZfYmFzZShidXMsIGRldmZuKTsgCisJY2hhciAqYWRkciA9IHBjaV9kZXZfYmFzZShzZWcsIGJ1cywgZGV2Zm4pOwogCiAJaWYgKHVubGlrZWx5KCF2YWx1ZSB8fCAoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiA0MDk1KSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDgsNyArNzMsNyBAQAogc3RhdGljIGludCBwY2lfbW1jZmdfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKIAkJCSAgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyIHZhbHVlKQogewotCWNoYXIgKmFkZHIgPSBwY2lfZGV2X2Jhc2UoYnVzLGRldmZuKTsKKwljaGFyICphZGRyID0gcGNpX2Rldl9iYXNlKHNlZywgYnVzLCBkZXZmbik7CiAKIAlpZiAodW5saWtlbHkoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc1LDkgKzEwMCwxNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwY2lfbW1jZmdfaW5pdCh2b2lkKQogeworCWludCBpOworCiAJaWYgKChwY2lfcHJvYmUgJiBQQ0lfUFJPQkVfTU1DT05GKSA9PSAwKQogCQlyZXR1cm4gMDsKLQlpZiAoIXBjaV9tbWNmZ19iYXNlX2FkZHIpCisKKwlhY3BpX3RhYmxlX3BhcnNlKEFDUElfTUNGRywgYWNwaV9wYXJzZV9tY2ZnKTsKKwlpZiAoKHBjaV9tbWNmZ19jb25maWdfbnVtID09IDApIHx8CisJICAgIChwY2lfbW1jZmdfY29uZmlnID09IE5VTEwpIHx8CisJICAgIChwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcyA9PSAwKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBLbHVkZ2UgZm9yIG5vdy4gRG9uJ3QgdXNlIG1tY29uZmlnIG9uIEFNRCBzeXN0ZW1zIGJlY2F1c2UKQEAgLTg4LDEzICsxMTksMjIgQEAKIAkJcmV0dXJuIDA7IAogCiAJLyogUkVELVBFTiBpMzg2IGRvZXNuJ3QgZG8gX25vY2FjaGUgcmlnaHQgbm93ICovCi0JcGNpX21tY2ZnX3ZpcnQgPSBpb3JlbWFwX25vY2FjaGUocGNpX21tY2ZnX2Jhc2VfYWRkciwgTU1DT05GSUdfQVBFUl9TSVpFKTsKLQlpZiAoIXBjaV9tbWNmZ192aXJ0KSB7IAotCQlwcmludGsoIlBDSTogQ2Fubm90IG1hcCBtbWNvbmZpZyBhcGVydHVyZVxuIik7CisJcGNpX21tY2ZnX3ZpcnQgPSBrbWFsbG9jKHNpemVvZigqcGNpX21tY2ZnX3ZpcnQpICogcGNpX21tY2ZnX2NvbmZpZ19udW0sIEdGUF9LRVJORUwpOworCWlmIChwY2lfbW1jZmdfdmlydCA9PSBOVUxMKSB7CisJCXByaW50aygiUENJOiBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbW1jb25maWcgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybiAwOwotCX0JCisJfQorCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7CisJCXBjaV9tbWNmZ192aXJ0W2ldLmNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2ldOworCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzLCBNTUNPTkZJR19BUEVSX1NJWkUpOworCQlpZiAoIXBjaV9tbWNmZ192aXJ0W2ldLnZpcnQpIHsKKwkJCXByaW50aygiUENJOiBDYW5ub3QgbWFwIG1tY29uZmlnIGFwZXJ0dXJlIGZvciBzZWdtZW50ICVkXG4iLAorCQkJICAgICAgIHBjaV9tbWNmZ19jb25maWdbaV0ucGNpX3NlZ21lbnRfZ3JvdXBfbnVtYmVyKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgTU1DT05GSUcgYXQgJXhcbiIsIHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzKTsKKwl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIE1NQ09ORklHIGF0ICV4XG4iLCBwY2lfbW1jZmdfYmFzZV9hZGRyKTsKIAlyYXdfcGNpX29wcyA9ICZwY2lfbW1jZmc7CiAJcGNpX3Byb2JlID0gKHBjaV9wcm9iZSAmIH5QQ0lfUFJPQkVfTUFTSykgfCBQQ0lfUFJPQkVfTU1DT05GOwogCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9LY29uZmlnIGIvYXJjaC94dGVuc2EvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjYyNTdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvS2NvbmZpZwpAQCAtMCwwICsxLDI2MiBAQAorIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgRG9jdW1lbnRhdGlvbi9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKworbWFpbm1lbnUgIkxpbnV4L1h0ZW5zYSBLZXJuZWwgQ29uZmlndXJhdGlvbiIKKworY29uZmlnIEZSQU1FX1BPSU5URVIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBYVEVOU0EKKwlib29sCisJZGVmYXVsdCB5CisJaGVscAorCSAgWHRlbnNhIHByb2Nlc3NvcnMgYXJlIDMyLWJpdCBSSVNDIG1hY2hpbmVzIGRlc2lnbmVkIGJ5IFRlbnNpbGljYQorCSAgcHJpbWFyaWx5IGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgVGhlc2UgcHJvY2Vzc29ycyBhcmUgYm90aAorCSAgY29uZmlndXJhYmxlIGFuZCBleHRlbnNpYmxlLiAgVGhlIExpbnV4IHBvcnQgdG8gdGhlIFh0ZW5zYQorCSAgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIGFsbCBwcm9jZXNzb3IgY29uZmlndXJhdGlvbnMgYW5kIGV4dGVuc2lvbnMsCisJICB3aXRoIHJlYXNvbmFibGUgbWluaW11bSByZXF1aXJlbWVudHMuICBUaGUgWHRlbnNhIExpbnV4IHByb2plY3QgaGFzCisJICBhIGhvbWUgcGFnZSBhdCA8aHR0cDovL3h0ZW5zYS5zb3VyY2Vmb3JnZS5uZXQvPi4KKworY29uZmlnIFVJRDE2CisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgUldTRU1fWENIR0FERF9BTEdPUklUSE0KKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBIQVZFX0RFQ19MT0NLCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgR0VORVJJQ19IQVJESVJRUworCWJvb2wKKwlkZWZhdWx0IHkKKworc291cmNlICJpbml0L0tjb25maWciCisKK21lbnUgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyIKKworY2hvaWNlCisJcHJvbXB0ICJYdGVuc2EgUHJvY2Vzc29yIENvbmZpZ3VyYXRpb24iCisJZGVmYXVsdCBYVEVOU0FfQ1BVX0xJTlVYX0JFCisKK2NvbmZpZyBYVEVOU0FfQ1BVX0xJTlVYX0JFCisJYm9vbCAibGludXhfYmUiCisJLS0taGVscC0tLQorCSAgVGhlIGxpbnV4X2JlIHByb2Nlc3NvciBjb25maWd1cmF0aW9uIGlzIHRoZSBiYXNlbGluZSBYdGVuc2EKKwkgIGNvbmZpZ3VyYXRpb25zIGluY2x1ZGVkIGluIHRoaXMga2VybmVsIGFuZCBhbHNvIHVzZWQgYnkKKwkgIGJpbnV0aWxzLCBnY2MsIGFuZCBnZGIuIEl0IGNvbnRhaW5zIG5vIFRJRSwgbm8gY29wcm9jZXNzb3JzLAorCSAgYW5kIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zOgorCisJICBDb2RlIERlbnNpdHkgT3B0aW9uICAgICAgICAgICAgICAgIDIgTWlzYyBTcGVjaWFsIFJlZ2lzdGVycworCSAgTlNBL05TQVUgSW5zdHJ1Y3Rpb25zICAgICAgICAgICAgICAxMjgtYml0IERhdGEgQnVzIFdpZHRoCisJICBQcm9jZXNzb3IgSUQgICAgICAgICAgICAgICAgICAgICAgIDhLLCAyLXdheSBJIGFuZCBEIENhY2hlcworCSAgWmVyby1PdmVyaGVhZCBMb29wcyAgICAgICAgICAgICAgICAyIEluc3QgQWRkcmVzcyBCcmVhayBSZWdpc3RlcnMKKwkgIEJpZyBFbmRpYW4gICAgICAgICAgICAgICAgICAgICAgICAgMiBEYXRhIEFkZHJlc3MgQnJlYWsgUmVnaXN0ZXJzCisJICA2NCBHZW5lcmFsLVB1cnBvc2UgUmVnaXN0ZXJzICAgICAgIEpUQUcgSW50ZXJmYWNlIGFuZCBUcmFjZSBQb3J0CisJICAxNyBJbnRlcnJ1cHRzICAgICAgICAgICAgICAgICAgICAgIE1NVSB3LyBUTEJzIGFuZCBBdXRvcmVmaWxsCisJICAzIEludGVycnVwdCBMZXZlbHMgICAgICAgICAgICAgICAgIDggQXV0b3JlZmlsbCBXYXlzIChJL0QgVExCcykKKwkgIDMgVGltZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hbGlnbmVkIEV4Y2VwdGlvbnMKK2VuZGNob2ljZQorCitjb25maWcgTU1VCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgWFRFTlNBX1VOQUxJR05FRF9VU0VSCisJYm9vbCAiVW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgaW4gdXNlIHNwYWNlIgorCS0tLWhlbHAtLS0KKwkgICBUaGUgWHRlbnNhIGFyY2hpdGVjdHVyZSBjdXJyZW50bHkgZG9lcyBub3QgaGFuZGxlIHVuYWxpZ25lZAorCSAgIG1lbW9yeSBhY2Nlc3NlcyBpbiBoYXJkd2FyZSBidXQgdGhyb3VnaCBhbiBleGNlcHRpb24gaGFuZGxlci4KKwkgICBQZXIgZGVmYXVsdCwgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyBhcmUgZGlzYWJsZWQgaW4gdXNlciBzcGFjZS4KKworCSAgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGluIHVzZXIgc3BhY2UuCisKK2NvbmZpZyBQUkVFTVBUCisJYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIgorCS0tLWhlbHAtLS0KKyAgICAgICAgICAgVGhpcyBvcHRpb24gcmVkdWNlcyB0aGUgbGF0ZW5jeSBvZiB0aGUga2VybmVsIHdoZW4gcmVhY3RpbmcgdG8KKyAgICAgICAgICAgcmVhbC10aW1lIG9yIGludGVyYWN0aXZlIGV2ZW50cyBieSBhbGxvd2luZyBhIGxvdyBwcmlvcml0eSBwcm9jZXNzIHRvCisgICAgICAgICAgIGJlIHByZWVtcHRlZCBldmVuIGlmIGl0IGlzIGluIGtlcm5lbCBtb2RlIGV4ZWN1dGluZyBhIHN5c3RlbSBjYWxsLgorICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IHRoZSBrZXJuZWwgY29kZSBoYXMgc29tZSByYWNlIGNvbmRpdGlvbnMgaWYgYm90aAorICAgICAgICAgICBDT05GSUdfU01QIGFuZCBDT05GSUdfUFJFRU1QVCBhcmUgZW5hYmxlZCwgc28gdGhpcyBvcHRpb24gaXMKKyAgICAgICAgICAgY3VycmVudGx5IGRpc2FibGVkIGlmIHlvdSBhcmUgYnVpbGRpbmcgYW4gU01QIGtlcm5lbC4KKworICAgICAgICAgICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCwgZW1iZWRkZWQKKyAgICAgICAgICAgb3IgcmVhbC10aW1lIHN5c3RlbS4gIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorCitjb25maWcgTUFUSF9FTVVMQVRJT04KKwlib29sICJNYXRoIGVtdWxhdGlvbiIKKwloZWxwCisJQ2FuIHdlIHVzZSBpbmZvcm1hdGlvbiBvZiBjb25maWd1cmF0aW9uIGZpbGU/CisKK2NvbmZpZyBISUdITUVNCisJYm9vbCAiSGlnaCBtZW1vcnkgc3VwcG9ydCIKKworZW5kbWVudQorCittZW51ICJQbGF0Zm9ybSBvcHRpb25zIgorCitjaG9pY2UKKwlwcm9tcHQgIlh0ZW5zYSBTeXN0ZW0gVHlwZSIKKwlkZWZhdWx0IFhURU5TQV9QTEFURk9STV9JU1MKKworY29uZmlnIFhURU5TQV9QTEFURk9STV9JU1MKKwlib29sICJJU1MiCisJaGVscAorCSAgSVNTIGlzIGFuIGFjcm9ueW0gZm9yIFRlbnNpbGljYSdzIEluc3RydWN0aW9uIFNldCBTaW11bGF0b3IuCisKK2NvbmZpZyBYVEVOU0FfUExBVEZPUk1fWFQyMDAwCisJYm9vbCAiWFQyMDAwIgorCWhlbHAKKwkgIFhUMjAwMCBpcyB0aGUgbmFtZSBvZiBUZW5zaWxpY2EncyBmZWF0dXJlLXJpY2ggZW11bGF0aW9uIHBsYXRmb3JtLgorCSAgVGhpcyBoYXJkd2FyZSBpcyBjYXBhYmxlIG9mIHJ1bm5pbmcgYSBmdWxsIExpbnV4IGRpc3RyaWJ1dGlvbi4KKworZW5kY2hvaWNlCisKKworY29uZmlnIFhURU5TQV9DQUxJQlJBVEVfQ0NPVU5UCisJYm9vbCAiQXV0byBjYWxpYnJhdGlvbiBvZiB0aGUgQ1BVIGNsb2NrIHJhdGUiCisJLS0taGVscC0tLQorCSAgT24gc29tZSBwbGF0Zm9ybXMgKFhUMjAwMCwgZm9yIGV4YW1wbGUpLCB0aGUgQ1BVIGNsb2NrIHJhdGUgY2FuCisJICB2YXJ5LiAgVGhlIGZyZXF1ZW5jeSBjYW4gYmUgZGV0ZXJtaW5lZCwgaG93ZXZlciwgYnkgbWVhc3VyaW5nCisJICBhZ2FpbnN0IGEgd2VsbCBrbm93biwgZml4ZWQgZnJlcXVlbmN5LCBzdWNoIGFzIGFuIFVBUlQgb3NjaWxsYXRvci4KKworY29uZmlnIFhURU5TQV9DUFVfQ0xPQ0sKKwlpbnQgIkNQVSBjbG9jayByYXRlIFtNSHpdIgorCWRlcGVuZHMgb24gIVhURU5TQV9DQUxJQlJBVEVfQ0NPVU5UCisJZGVmYXVsdCAiMTYiCisKK2NvbmZpZyBHRU5FUklDX0NBTElCUkFURV9ERUxBWQorCWJvb2wgIkF1dG8gY2FsaWJyYXRpb24gb2YgdGhlIEJvZ29NSVBTIHZhbHVlIgorCS0tLWhlbHAtLS0KKwkgIFRoZSBCb2dvTUlQUyB2YWx1ZSBjYW4gZWFzaWx5IGJlIGRlcml2ZWQgZnJvbSB0aGUgQ1BVIGZyZXF1ZW5jeS4KKworY29uZmlnIENNRExJTkVfQk9PTAorCWJvb2wgIkRlZmF1bHQgYm9vdGxvYWRlciBrZXJuZWwgYXJndW1lbnRzIgorCitjb25maWcgQ01ETElORQorCXN0cmluZyAiSW5pdGlhbCBrZXJuZWwgY29tbWFuZCBzdHJpbmciCisJZGVwZW5kcyBvbiBDTURMSU5FX0JPT0wKKwlkZWZhdWx0ICJjb25zb2xlPXR0eVMwLDM4NDAwIHJvb3Q9L2Rldi9yYW0iCisJaGVscAorCSAgT24gc29tZSBhcmNoaXRlY3R1cmVzIChFQlNBMTEwIGFuZCBDQVRTKSwgdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheQorCSAgZm9yIHRoZSBib290IGxvYWRlciB0byBwYXNzIGFyZ3VtZW50cyB0byB0aGUga2VybmVsLiBGb3IgdGhlc2UKKwkgIGFyY2hpdGVjdHVyZXMsIHlvdSBzaG91bGQgc3VwcGx5IHNvbWUgY29tbWFuZC1saW5lIG9wdGlvbnMgYXQgYnVpbGQKKwkgIHRpbWUgYnkgZW50ZXJpbmcgdGhlbSBoZXJlLiBBcyBhIG1pbmltdW0sIHlvdSBzaG91bGQgc3BlY2lmeSB0aGUKKwkgIG1lbW9yeSBzaXplIGFuZCB0aGUgcm9vdCBkZXZpY2UgKGUuZy4sIG1lbT02NE0gcm9vdD0vZGV2L25mcykuCisKK2NvbmZpZyBTRVJJQUxfQ09OU09MRQorCWJvb2wKKwlkZXBlbmRzIG9uIFhURU5TQV9QTEFURk9STV9JU1MKKwlkZWZhdWx0IHkKKworY29uZmlnIFhURU5TQV9JU1NfTkVUV09SSworCWJvb2wKKwlkZXBlbmRzIG9uIFhURU5TQV9QTEFURk9STV9JU1MKKwlkZWZhdWx0IHkKKworc291cmNlICJtbS9LY29uZmlnIgorCitlbmRtZW51CisKK21lbnUgIkJ1cyBvcHRpb25zIgorCitjb25maWcgUENJCisJYm9vbCAiUENJIHN1cHBvcnQiIGlmICFYVEVOU0FfUExBVEZPUk1fSVNTCisJZGVwZW5kcyBvbiAhWFRFTlNBX1BMQVRGT1JNX0lTUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIEZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYSBQQ0kgbW90aGVyYm9hcmQuIFBDSSBpcyB0aGUgbmFtZSBvZiBhCisJICBidXMgc3lzdGVtLCBpLmUuIHRoZSB3YXkgdGhlIENQVSB0YWxrcyB0byB0aGUgb3RoZXIgc3R1ZmYgaW5zaWRlCisJICB5b3VyIGJveC4gT3RoZXIgYnVzIHN5c3RlbXMgYXJlIElTQSwgRUlTQSwgTWljcm9DaGFubmVsIChNQ0EpIG9yCisJICBWRVNBLiBJZiB5b3UgaGF2ZSBQQ0ksIHNheSBZLCBvdGhlcndpc2UgTi4KKworCSAgVGhlIFBDSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjb250YWlucyB2YWx1YWJsZQorCSAgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggUENJIGhhcmR3YXJlIGRvZXMgd29yayB1bmRlciBMaW51eCBhbmQgd2hpY2gKKwkgIGRvZXNuJ3QKKworc291cmNlICJkcml2ZXJzL3BjaS9LY29uZmlnIgorCitjb25maWcgSE9UUExVRworCisJYm9vbCAiU3VwcG9ydCBmb3IgaG90LXBsdWdnYWJsZSBkZXZpY2VzIgorCS0tLWhlbHAtLS0KKwlTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHBsdWcgZGV2aWNlcyBpbnRvIHlvdXIgY29tcHV0ZXIgd2hpbGUKKwl0aGUgc3lzdGVtIGlzIHJ1bm5pbmcsIGFuZCBiZSBhYmxlIHRvIHVzZSB0aGVtIHF1aWNrbHkuICBJbiBtYW55CisJY2FzZXMsIHRoZSBkZXZpY2VzIGNhbiBsaWtld2lzZSBiZSB1bnBsdWdnZWQgYXQgYW55IHRpbWUgdG9vLgorCisJT25lIHdlbGwga25vd24gZXhhbXBsZSBvZiB0aGlzIGlzIFBDTUNJQS0gb3IgUEMtY2FyZHMsIGNyZWRpdC1jYXJkCisJc2l6ZSBkZXZpY2VzIHN1Y2ggYXMgbmV0d29yayBjYXJkcywgbW9kZW1zIG9yIGhhcmQgZHJpdmVzIHdoaWNoIGFyZQorCXBsdWdnZWQgaW50byBzbG90cyBmb3VuZCBvbiBhbGwgbW9kZXJuIGxhcHRvcCBjb21wdXRlcnMuICBBbm90aGVyCisJZXhhbXBsZSwgdXNlZCBvbiBtb2Rlcm4gZGVza3RvcHMgYXMgd2VsbCBhcyBsYXB0b3BzLCBpcyBVU0IuCisKKwlFbmFibGUgSE9UUExVRyBhbmQgS01PRCwgYW5kIGJ1aWxkIGEgbW9kdWxhciBrZXJuZWwuICBHZXQgYWdlbnQKKwlzb2Z0d2FyZSAoYXQgPGh0dHA6Ly9saW51eC1ob3RwbHVnLnNvdXJjZWZvcmdlLm5ldC8+KSBhbmQgaW5zdGFsbCBpdC4KKwlUaGVuIHlvdXIga2VybmVsIHdpbGwgYXV0b21hdGljYWxseSBjYWxsIG91dCB0byBhIHVzZXIgbW9kZSAicG9saWN5CisJYWdlbnQiICgvc2Jpbi9ob3RwbHVnKSB0byBsb2FkIG1vZHVsZXMgYW5kIHNldCB1cCBzb2Z0d2FyZSBuZWVkZWQKKwl0byB1c2UgZGV2aWNlcyBhcyB5b3UgaG90cGx1ZyB0aGVtLgorCitzb3VyY2UgImRyaXZlcnMvcGNtY2lhL0tjb25maWciCisKK3NvdXJjZSAiZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIgorCitlbmRtZW51CisKK21lbnUgIkV4ZWN0dWFibGUgZmlsZSBmb3JtYXRzIgorCisjIG9ubHkgZWxmIHN1cHBvcnRlZAorY29uZmlnIEtDT1JFX0VMRgorICAgICAgICBib29sCisgICAgICAgIGRlcGVuZHMgb24gUFJPQ19GUworICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgaGVscAorICAgICAgICAgIElmIHlvdSBlbmFibGVkIHN1cHBvcnQgZm9yIC9wcm9jIGZpbGUgc3lzdGVtIHRoZW4gdGhlIGZpbGUKKyAgICAgICAgICAvcHJvYy9rY29yZSB3aWxsIGNvbnRhaW4gdGhlIGtlcm5lbCBjb3JlIGltYWdlIGluIEVMRiBmb3JtYXQuIFRoaXMKKyAgICAgICAgICBjYW4gYmUgdXNlZCBpbiBnZGI6CisKKyAgICAgICAgICAkIGNkIC91c3Ivc3JjL2xpbnV4IDsgZ2RiIHZtbGludXggL3Byb2Mva2NvcmUKKworICAgICAgICAgIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91IGhhdmUgY29tcGlsZWQgdGhlIGtlcm5lbCB3aXRoIHRoZQorICAgICAgICAgICItZyIgb3B0aW9uIHRvIHByZXNlcnZlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gSXQgaXMgbWFpbmx5IHVzZWQKKwkgIGZvciBleGFtaW5pbmcga2VybmVsIGRhdGEgc3RydWN0dXJlcyBvbiB0aGUgbGl2ZSBrZXJuZWwuCisKK3NvdXJjZSAiZnMvS2NvbmZpZy5iaW5mbXQiCisKK2VuZG1lbnUKKworc291cmNlICJuZXQvS2NvbmZpZyIKKworc291cmNlICJkcml2ZXJzL0tjb25maWciCisKK3NvdXJjZSAiZnMvS2NvbmZpZyIKKworbWVudSAiWHRlbnNhIGluaXRyZCBvcHRpb25zIgorCWRlcGVuZHMgb24gQkxLX0RFVl9JTklUUkQKKworCWNvbmZpZyBFTUJFRERFRF9SQU1ESVNLCisJYm9vbCAiRW1iZWQgcm9vdCBmaWxlc3lzdGVtIHJhbWRpc2sgaW50byB0aGUga2VybmVsIgorCitjb25maWcgRU1CRURERURfUkFNRElTS19JTUFHRQorCXN0cmluZyAiRmlsZW5hbWUgb2YgZ3ppcGVkIHJhbWRpc2sgaW1hZ2UiCisJZGVwZW5kcyBvbiBFTUJFRERFRF9SQU1ESVNLCisJZGVmYXVsdCAicmFtZGlzay5neiIKKwloZWxwCisJICBUaGlzIGlzIHRoZSBmaWxlbmFtZSBvZiB0aGUgcmFtZGlzayBpbWFnZSB0byBiZSBidWlsdCBpbnRvIHRoZQorCSAga2VybmVsLiAgUmVsYXRpdmUgcGF0aG5hbWVzIGFyZSByZWxhdGl2ZSB0byBhcmNoL3h0ZW5zYS9ib290L3JhbWRpc2svLgorCSAgVGhlIHJhbWRpc2sgaW1hZ2UgaXMgbm90IHBhcnQgb2YgdGhlIGtlcm5lbCBkaXN0cmlidXRpb247IHlvdSBtdXN0CisJICBwcm92aWRlIG9uZSB5b3Vyc2VsZi4KK2VuZG1lbnUKKworc291cmNlICJhcmNoL3h0ZW5zYS9LY29uZmlnLmRlYnVnIgorCitzb3VyY2UgInNlY3VyaXR5L0tjb25maWciCisKK3NvdXJjZSAiY3J5cHRvL0tjb25maWciCisKK3NvdXJjZSAibGliL0tjb25maWciCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gveHRlbnNhL0tjb25maWcuZGVidWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjNTg1MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL0tjb25maWcuZGVidWcKQEAgLTAsMCArMSw3IEBACittZW51ICJLZXJuZWwgaGFja2luZyIKKworc291cmNlICJsaWIvS2NvbmZpZy5kZWJ1ZyIKKworZW5kbWVudQorCisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4NDdlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTA0IEBACisjCisjIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyMgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSAgVGVuc2lsaWNhIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IHRoZSBnbG9iYWwgbWFrZWZpbGUgc28gdGhhdCB5b3UgY2FuIGFkZCB5b3VyIG93bgorIyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgZmxhZ3MgYW5kIGRlcGVuZGVuY2llcy4gUmVtZW1iZXIgdG8gZG8gaGF2ZSBhY3Rpb25zCisjIGZvciAiYXJjaGNsZWFuIiBhbmQgImFyY2hkZXAiIGZvciBjbGVhbmluZyB1cCBhbmQgbWFraW5nIGRlcGVuZGVuY2llcyBmb3IKKyMgdGhpcyBhcmNoaXRlY3R1cmUKKworIyBDb3JlIGNvbmZpZ3VyYXRpb24uCisjIChVc2UgQ1BVPTx4dGVuc2FfY29uZmlnPiB0byB1c2UgYW5vdGhlciBkZWZhdWx0IGNvbXBpbGVyLikKKworY3B1LSQoQ09ORklHX1hURU5TQV9DUFVfTElOVVhfQkUpCTo9IGxpbnV4X2JlCitjcHUtJChDT05GSUdfWFRFTlNBX0NQVV9MSU5VWF9DVVNUT00pCTo9IGxpbnV4X2N1c3RvbQorCitDUFUgPSAkKGNwdS15KQorZXhwb3J0IENQVQorCisjIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KKworcGxhdGZvcm0tJChDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hUMjAwMCkJOj0geHQyMDAwCitwbGF0Zm9ybS0kKENPTkZJR19YVEVOU0FfUExBVEZPUk1fSVNTKQkJOj0gaXNzCisKK1BMQVRGT1JNID0gJChwbGF0Zm9ybS15KQorZXhwb3J0IFBMQVRGT1JNCisKK0NQUEZMQUdTCSs9ICQoaWYgJChLQlVJTERfU1JDKSwtSSQoc3JjdHJlZSkvaW5jbHVkZS9hc20teHRlbnNhLykKK0NQUEZMQUdTCSs9IC1JaW5jbHVkZS9hc20KK0NGTEFHUwkJKz0gLXBpcGUgLW1sb25nY2FsbHMKKworS0JVSUxEX0RFRkNPTkZJRyA6PSBpc3NfZGVmY29uZmlnCisKKyMgcmFtZGlzay9pbml0cmQgc3VwcG9ydAorIyBZb3UgbmVlZCBhIGNvbXByZXNzZWQgcmFtZGlzayBpbWFnZSwgbmFtZWQgcmFtZGlzay5neiBpbgorIyBhcmNoL3h0ZW5zYS9ib290L3JhbWRpc2sKKworY29yZS0kKENPTkZJR19FTUJFRERFRF9SQU1ESVNLKQkrPSBhcmNoL3h0ZW5zYS9ib290L3JhbWRpc2svCisKKyMgVGVzdCBmb3IgY3Jvc3MgY29tcGlsaW5nCisKK2lmbmVxICgkKENQVSksKQorICBDT01QSUxFX0FSQ0ggPSAkKHNoZWxsIHVuYW1lIC1tKQorCisgIGlmbmVxICgkKENPTVBJTEVfQVJDSCksIHh0ZW5zYSkKKyAgICBpZm5kZWYgQ1JPU1NfQ09NUElMRQorICAgICAgQ1JPU1NfQ09NUElMRSA9IHh0ZW5zYV8kKENQVSktCisgICAgZW5kaWYKKyAgZW5kaWYKK2VuZGlmCisKKyMKKworTElCR0NDIDo9ICQoc2hlbGwgJChDQykgJChDRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQorCitoZWFkLXkJCTo9IGFyY2gveHRlbnNhL2tlcm5lbC9oZWFkLm8KK2NvcmUteQkJKz0gYXJjaC94dGVuc2Eva2VybmVsLyBhcmNoL3h0ZW5zYS9tbS8KK2lmbmVxICgkKFBMQVRGT1JNKSwpCitjb3JlLXkJCSs9IGFyY2gveHRlbnNhL3BsYXRmb3JtLSQoUExBVEZPUk0pLworZW5kaWYKK2xpYnMteQkJKz0gYXJjaC94dGVuc2EvbGliLyAkKExJQkdDQykKKworYm9vdAkJOj0gYXJjaC94dGVuc2EvYm9vdAorCithcmNoaW5jCQk6PSBpbmNsdWRlL2FzbS14dGVuc2EKKworYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLnM6IFwKKwlhcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYyAkKGFyY2hpbmMpLy5wbGF0Zm9ybQorCitpbmNsdWRlL2FzbS14dGVuc2Evb2Zmc2V0cy5oOiBhcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMucworCSQoY2FsbCBmaWxlY2hrLGdlbi1hc20tb2Zmc2V0cykKKworcHJlcGFyZTogJChhcmNoaW5jKS8ucGxhdGZvcm0gJChhcmNoaW5jKS9vZmZzZXRzLmgKKworIyBVcGRhdGUgbWFjaGluZSBjcHUgYW5kIHBsYXRmb3JtIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCisjIHRoZW0gY2hhbmdlZC4KKworJChhcmNoaW5jKS8ucGxhdGZvcm06ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvYXJjaC8qLmgpIGluY2x1ZGUvY29uZmlnL01BUktFUgorCUBlY2hvICcgIFNZTUxJTksgJChhcmNoaW5jKS94dGVuc2EvY29uZmlnIC0+ICQoYXJjaGluYykveHRlbnNhL2NvbmZpZy0kKENQVSknCisJJChRKW1rZGlyIC1wICQoYXJjaGluYykKKwkkKFEpbWtkaXIgLXAgJChhcmNoaW5jKS94dGVuc2EKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpLyQoYXJjaGluYykveHRlbnNhL2NvbmZpZy0kKENQVSkgJChhcmNoaW5jKS94dGVuc2EvY29uZmlnCisJQGVjaG8gJyAgU1lNTElOSyAkKGFyY2hpbmMpL3BsYXRmb3JtIC0+ICQoYXJjaGluYykvcGxhdGZvcm0tJChQTEFURk9STSknCisJJChRKWxuIC1mc24gJChzcmN0cmVlKS8kKGFyY2hpbmMpL3BsYXRmb3JtLSQoUExBVEZPUk0pICQoYXJjaGluYykvcGxhdGZvcm0KKwlAdG91Y2ggJEAKKworCithbGw6IHpJbWFnZQorCitiekltYWdlIDogekltYWdlCisKK3pJbWFnZSB6SW1hZ2UuaW5pdHJkOiB2bWxpbnV4CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSAkQAorCitDTEVBTl9GSUxFUwkrPSBhcmNoL3h0ZW5zYS92bWxpbnV4LmxkcyAkKGFyY2hpbmMpL29mZnNldC5oIFwKKwkJICAgJChhcmNoaW5jKS9wbGF0Zm9ybSAkKGFyY2hpbmMpL3h0ZW5zYS9jb25maWcgXAorCQkgICAkKGFyY2hpbmMpLy5wbGF0Zm9ybQorCitkZWZpbmUgYXJjaGhlbHAKKyAgQGVjaG8gJyogekltYWdlICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZSAoYXJjaC94dGVuc2EvYm9vdC9pbWFnZXMvekltYWdlLiopJworZW5kZWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL2Jvb3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwYjMxZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorIworIyBhcmNoL3h0ZW5zYS9ib290L01ha2VmaWxlCisjCisjIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyMgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMKKworCitDRkxBR1MgCQkrPSAtZm5vLWJ1aWx0aW4gLUlhcmNoLyQoQVJDSCkvYm9vdC9pbmNsdWRlCitIT1NURkxBR1MJKz0gLUlhcmNoLyQoQVJDSCkvYm9vdC9pbmNsdWRlCisKK0JJR19FTkRJQU4JOj0gJChzaGVsbCBlY2hvIC1lIF9fWFRFTlNBX0VCX18gfCAkKENDKSAtRSAtIHwgZ3JlcCAtdiAiXCMiKQorCitleHBvcnQgQ0ZMQUdTCitleHBvcnQgQUZMQUdTCitleHBvcnQgQklHX0VORElBTgorCitzdWJkaXIteQk6PSBsaWIKKworIyBTdWJkaXJzIGZvciB0aGUgYm9vdCBsb2FkZXIocykKKworYm9vdGRpci0kKENPTkZJR19YVEVOU0FfUExBVEZPUk1fSVNTKQkgKz0gYm9vdC1lbGYKK2Jvb3RkaXItJChDT05GSUdfWFRFTlNBX1BMQVRGT1JNX1hUMjAwMCkgKz0gYm9vdC1yZWRib290IGJvb3QtZWxmCisKKworekltYWdlIHpJbWFnZS5pbml0cmQgSW1hZ2UgSW1hZ2UuaW5pdHJkOiAkKGJvb3RkaXIteSkKKworJChib290ZGlyLXkpOiAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXkpKSBcCisJICAgICAgJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtcHJvZ3MpKQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQob2JqKS8kQCAkKE1BS0VDTURHT0FMUykKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LWVsZi9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0ZGI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvTWFrZWZpbGUKQEAgLTAsMCArMSw1MiBAQAorIworIyBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisjIGZvciBtb3JlIGRldGFpbHMuCisjCisKK0daSVAgPSBnemlwCitHWklQX0ZMQUdTID0gLXY5ZmMKKworaWZlcSAoJChCSUdfRU5ESUFOKSwxKQorT0JKQ09QWV9BUkdTICAgIDo9IC1PIGVsZjMyLXh0ZW5zYS1iZQorZWxzZQorT0JKQ09QWV9BUkdTICAgIDo9IC1PIGVsZjMyLXh0ZW5zYS1sZQorZW5kaWYKKworZXhwb3J0IE9CSkNPUFlfQVJHUworCitib290LXkJCTo9IGJvb3RzdHJhcC5vCisKK09CSlMJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChib290LXkpKQorCitJbWFnZToJdm1saW51eCAkKE9CSlMpCisJJChPQkpDT1BZKSAtLXN0cmlwLWFsbCAtUiAuY29tbWVudCAtUiAueHQuaW5zbiAtTyBiaW5hcnkgXAorCQl2bWxpbnV4IHZtbGludXgudG1wCisJJChPQkpDT1BZKSAkKE9CSkNPUFlfQVJHUykgLVIgLmNvbW1lbnQgXAorCQktLWFkZC1zZWN0aW9uIGltYWdlPXZtbGludXgudG1wIFwKKwkJLS1zZXQtc2VjdGlvbi1mbGFncyBpbWFnZT1jb250ZW50cyxhbGxvYyxsb2FkLGxvYWQsZGF0YSBcCisJCSQoT0JKUykgJEAudG1wCisJJChMRCkgJChMREZMQUdTKSAkKExERkxBR1Nfdm1saW51eCkgXAorCQktVCAkKHNyY3RyZWUpL2FyY2gvJChBUkNIKS9ib290L2Jvb3QtZWxmL2Jvb3QubGQgXAorCQktbyBhcmNoLyQoQVJDSCkvYm9vdC8kQC5lbGYgJEAudG1wCisJcm0gLWYgJEAudG1wIHZtbGludXgudG1wCisKK0ltYWdlLmluaXRyZDoJdm1saW51eCAkKE9CSlMpCisJJChPQkpDT1BZKSAtLXN0cmlwLWFsbCAtUiAuY29tbWVudCAtUiAueHQuaW5zbiAtTyBiaW5hcnkgXAorCQktLWFkZC1zZWN0aW9uIC5pbml0cmQ9YXJjaC8kKEFSQ0gpL2Jvb3QvcmFtZGlzayBcCisJCS0tc2V0LXNlY3Rpb24tZmxhZ3MgLmluaXRyZD1jb250ZW50cyxhbGxvYyxsb2FkLGxvYWQsZGF0YSBcCisJCXZtbGludXggdm1saW51eC50bXAKKwkkKE9CSkNPUFkpICQoT0JKQ09QWV9BUkdTKSAtUiAuY29tbWVudCBcCisJCS0tYWRkLXNlY3Rpb24gaW1hZ2U9dm1saW51eC50bXAgXAorCQktLXNldC1zZWN0aW9uLWZsYWdzIGltYWdlPWNvbnRlbnRzLGFsbG9jLGxvYWQsbG9hZCxkYXRhIFwKKwkJJChPQkpTKSAkQC50bXAKKwkkKExEKSAkKExERkxBR1MpICQoTERGTEFHU192bWxpbnV4KSBcCisJCS1UICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZCBcCisJCS1vIGFyY2gvJChBUkNIKS9ib290LyRALmVsZiAkQC50bXAKKwlybSAtZiAkQC50bXAgdm1saW51eC50bXAKKworCit6SW1hZ2U6CUltYWdlCisKK3pJbWFnZS5pbml0cmQ6CUltYWdlLmluaXRyZAorCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGQgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3QubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiMDZhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdC5sZApAQCAtMCwwICsxLDcxIEBACitPVVRQVVRfQVJDSCh4dGVuc2EpCisKK1NFQ1RJT05TCit7CisJLnN0YXJ0IDB4RDAwMDAwMDAgOiB7ICooLnN0YXJ0KSB9CisKKwkudGV4dCAweEQwMDAwMDAwOgorCXsKKwkJX19yZWxvY19zdGFydCA9IC4gOworCQlfdGV4dF9zdGFydCA9IC4gOworCQkqKC5saXRlcmFsIC50ZXh0LmxpdGVyYWwgLnRleHQpCisJCV90ZXh0X2VuZCA9IC4gOworCX0KKworCS5yb2RhdGEgQUxJR04oMHgwNCk6CisJeworCQkqKC5yb2RhdGEpCisJCSooLnJvZGF0YTEpCisJfQorCisJLmRhdGEgQUxJR04oMHgwNCk6CisJeworCQkqKC5kYXRhKQorCQkqKC5kYXRhMSkKKwkJKiguc2RhdGEpCisJCSooLnNkYXRhMikKKwkJKiguZ290LnBsdCkKKwkJKiguZ290KQorCQkqKC5keW5hbWljKQorCX0KKworCV9fcmVsb2NfZW5kID0gLiA7CisKKwkuaW5pdHJkIEFMSUdOKDB4MTApIDoKKwl7CisJCWJvb3RfaW5pdHJkX3N0YXJ0ID0gLiA7CisJCSooLmluaXRyZCkKKwkJYm9vdF9pbml0cmRfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMHgxMCk7CisJX19pbWFnZV9sb2FkID0gLiA7CisJLmltYWdlIDB4ZDAwMDEwMDA6CisJeworCQlfaW1hZ2Vfc3RhcnQgPSAuOworCQkqKGltYWdlKQorCQkuID0gKC4gKyAzKSAmIH4gMzsKKwkJX2ltYWdlX2VuZCA9IC4JOworCX0KKworCisJLmJzcyAoKExPQURBRERSKC5pbWFnZSkgKyBTSVpFT0YoLmltYWdlKSArIDMpICYgfiAzKToKKwl7CisJCV9fYnNzX3N0YXJ0ID0gLjsKKwkJKiguc2JzcykKKwkJKiguc2NvbW1vbikKKwkJKiguZHluYnNzKQorCQkqKC5ic3MpCisJCV9fYnNzX2VuZCA9IC47CisJfQorCV9lbmQgPSAuOworCV9wYXJhbV9zdGFydCA9IC47CisKKwkuUmVzZXRWZWN0b3IudGV4dCAweGZlMDAwMDIwIDoKKwl7CisJCSooLlJlc2V0VmVjdG9yLnRleHQpCisJfQorCisKKwlQUk9WSURFIChlbmQgPSAuKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1lbGYvYm9vdHN0cmFwLlMgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3RzdHJhcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmE5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtZWxmL2Jvb3RzdHJhcC5TCkBAIC0wLDAgKzEsMzcgQEAKKworI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3BlY3JlZy5oPgorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgorCisKKy8qIFJlc2V0VmVjdG9yCisgKi8KKwkuc2VjdGlvbiAgICAgICAgLlJlc2V0VmVjdG9yLnRleHQsICJheCIKKwkuZ2xvYmFsICAgICAgICAgX1Jlc2V0VmVjdG9yCitfUmVzZXRWZWN0b3I6CisJX2ogcmVzZXQKKwkuYWxpZ24gNAorUm9tSW5pdEFkZHI6CisJLndvcmQgMHhkMDAwMTAwMAorUm9tQm9vdFBhcmFtOgorCS53b3JkIF9ib290cGFyYW0KK3Jlc2V0OgorCWwzMnIgICAgYTAsIFJvbUluaXRBZGRyCisJbDMycglhMiwgUm9tQm9vdFBhcmFtCisJbW92aQlhMywgMAorCW1vdmkJYTQsIDAKKwlqeCAgICAgIGEwCisKKwkuYWxpZ24gNAorCS5zZWN0aW9uIC5ib290c3RyYXAuZGF0YSwgImF3IgorCisJLmdsb2JsIF9ib290cGFyYW0KK19ib290cGFyYW06CisJLnNob3J0CUJQX1RBR19GSVJTVAorCS5zaG9ydAk0CisJLmxvbmcJQlBfVkVSU0lPTgorCS5zaG9ydAlCUF9UQUdfTEFTVAorCS5zaG9ydAkwCisJLmxvbmcJMApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTMyNjJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvTWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIworIyBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisjIGZvciBtb3JlIGRldGFpbHMuCisjCisKK0daSVAgPSBnemlwCitHWklQX0ZMQUdTID0gLXY5ZmMKK2lmZXEgKCQoQklHX0VORElBTiksMSkKK09CSkNPUFlfQVJHUyAJOj0gLU8gZWxmMzIteHRlbnNhLWJlCitlbHNlCitPQkpDT1BZX0FSR1MgCTo9IC1PIGVsZjMyLXh0ZW5zYS1sZQorZW5kaWYKKworTERfQVJHUwk9IC1UICQoc3JjdHJlZSkvJChvYmopL2Jvb3QubGQKKworYm9vdC15CTo9IGJvb3RzdHJhcC5vCisKK09CSlMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGJvb3QteSkpCitMSUJTCTo9IGFyY2gveHRlbnNhL2Jvb3QvbGliL2xpYi5hIGFyY2gveHRlbnNhL2xpYi9saWIuYQorCitMSUJHQ0MgOj0gJChzaGVsbCAkKENDKSAkKENGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCisKK3pJbWFnZTogdm1saW51eCAkKE9CSlMpICQoTElCUykKKwkkKE9CSkNPUFkpIC0tc3RyaXAtYWxsIC1SIC5jb21tZW50IC1SIC54dC5pbnNuIC1PIGJpbmFyeSBcCisJCXZtbGludXggdm1saW51eC50bXAKKwlnemlwIC12Zjkgdm1saW51eC50bXAKKwkkKE9CSkNPUFkpICQoT0JKQ09QWV9BUkdTKSAtUiAuY29tbWVudCBcCisJCS0tYWRkLXNlY3Rpb24gaW1hZ2U9dm1saW51eC50bXAuZ3ogXAorCQktLXNldC1zZWN0aW9uLWZsYWdzIGltYWdlPWNvbnRlbnRzLGFsbG9jLGxvYWQsbG9hZCxkYXRhIFwKKwkJJChPQkpTKSAkQC50bXAKKwkkKExEKSAkKExEX0FSR1MpIC1vICRALmVsZiAkQC50bXAgJChMSUJTKSAtTC94dGVuc2EtZWxmL2xpYiAkKExJQkdDQykKKwkkKE9CSkNPUFkpIC1TIC1PIGJpbmFyeSAkQC5lbGYgYXJjaC8kKEFSQ0gpL2Jvb3QvJEAucmVkYm9vdAorCXJtIC1mICRALnRtcCAkQC5lbGYgdm1saW51eC50bXAuZ3oKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9ib290LXJlZGJvb3QvYm9vdC5sZCBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1yZWRib290L2Jvb3QubGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjViNzI2NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1yZWRib290L2Jvb3QubGQKQEAgLTAsMCArMSw2NiBAQAorT1VUUFVUX0FSQ0goeHRlbnNhKQorCitTRUNUSU9OUworeworCS5zdGFydCAweEQwMjAwMDAwIDogeyAqKC5zdGFydCkgfQorCisJLnRleHQgOgorCXsKKwkJX19yZWxvY19zdGFydCA9IC4gOworCQlfdGV4dF9zdGFydCA9IC4gOworCQkqKC5saXRlcmFsIC50ZXh0LmxpdGVyYWwgLnRleHQpCisJCV90ZXh0X2VuZCA9IC4gOworCX0KKworCS5yb2RhdGEgQUxJR04oMHgwNCk6CisJeworCQkqKC5yb2RhdGEpCisJCSooLnJvZGF0YTEpCisJfQorCisJLmRhdGEgQUxJR04oMHgwNCk6CisJeworCQkqKC5kYXRhKQorCQkqKC5kYXRhMSkKKwkJKiguc2RhdGEpCisJCSooLnNkYXRhMikKKwkJKiguZ290LnBsdCkKKwkJKiguZ290KQorCQkqKC5keW5hbWljKQorCX0KKworCV9fcmVsb2NfZW5kID0gLiA7CisKKwkuaW5pdHJkIEFMSUdOKDB4MTApIDoKKwl7CisJCWJvb3RfaW5pdHJkX3N0YXJ0ID0gLiA7CisJCSooLmluaXRyZCkKKwkJYm9vdF9pbml0cmRfZW5kID0gLjsKKwl9CisKKwkuID0gQUxJR04oMHgxMCk7CisJX19pbWFnZV9sb2FkID0gLiA7CisJLmltYWdlIDB4ZDAwMDEwMDA6IEFUKF9faW1hZ2VfbG9hZCkKKwl7CisJCV9pbWFnZV9zdGFydCA9IC47CisJCSooaW1hZ2UpCisJCS4gPSAoLiArIDMpICYgfiAzOworCQlfaW1hZ2VfZW5kID0gLgk7CisJfQorCisKKwkuYnNzICgoTE9BREFERFIoLmltYWdlKSArIFNJWkVPRiguaW1hZ2UpICsgMykgJiB+IDMpOgorCXsKKwkJX19ic3Nfc3RhcnQgPSAuOworCQkqKC5zYnNzKQorCQkqKC5zY29tbW9uKQorCQkqKC5keW5ic3MpCisJCSooLmJzcykKKwkJX19ic3NfZW5kID0gLjsKKwl9CisJX2VuZCA9IC47CisJX3BhcmFtX3N0YXJ0ID0gLjsKKworCisJUFJPVklERSAoZW5kID0gLik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9ib290c3RyYXAuUyBiL2FyY2gveHRlbnNhL2Jvb3QvYm9vdC1yZWRib290L2Jvb3RzdHJhcC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNjM2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9ib290L2Jvb3QtcmVkYm9vdC9ib290c3RyYXAuUwpAQCAtMCwwICsxLDI0NiBAQAorCisjZGVmaW5lIF9BU01MQU5HVUFHRQorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3BlY3JlZy5oPgorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorI2luY2x1ZGUgPHh0ZW5zYS9jYWNoZWFzbS5oPgorCisJLyoKKwkgKiBSQi1EYXRhOiBSZWRCb290IGRhdGEvYnNzCisJICogUDoJICAgIEJvb3QtUGFyYW1ldGVycworCSAqIEw6CSAgICBLZXJuZWwtTG9hZGVyCisJICoKKwkgKiBUaGUgTGludXgtS2VybmVsIGltYWdlIGluY2x1ZGluZyB0aGUgbG9hZGVyIG11c3QgYmUgbG9hZGVkCisJICogdG8gYSBwb3NpdGlvbiBzbyB0aGF0IHRoZSBrZXJuZWwgYW5kIHRoZSBib290IHBhcmFtZXRlcnMKKwkgKiBjYW4gZml0IGluIHRoZSBzcGFjZSBiZWZvcmUgdGhlIGxvYWQgYWRkcmVzcy4KKwkgKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisJICogfF9SQi1EYXRhX3xfUF98X19fX19fX19fX3xfTF98X19fTGludXgtS2VybmVsX19ffF9fX19fX3wKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBeIExvYWQgYWRkcmVzcworCSAqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKwkgKiB8X19fTGludXgtS2VybmVsX19ffF9QX3xfTF98X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCSAqCisJICogVGhlIGxvYWRlciBjb3BpZXMgdGhlIHBhcmFtZXRlciB0byB0aGUgcG9zaXRpb24gdGhhdCB3aWxsCisJICogYmUgdGhlIGVuZCBvZiB0aGUga2VybmVsIGFuZCBpdHNlbGYgdG8gdGhlIGVuZCBvZiB0aGUKKwkgKiBwYXJhbWV0ZXIgbGlzdC4KKwkgKi8KKworLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgJ3VuY29tcHJlc3NvcicgKi8KKworI2RlZmluZSBTVEFDS19TSVpFIDMyNzY4CisjZGVmaW5lIEhFQVBfU0laRSAoMTMxMDcyKjQpCisKKwkjIGEyOiBQYXJhbWV0ZXIgbGlzdAorCSMgYTM6IFNpemUgb2YgcGFyYW1ldGVyIGxpc3QKKworCS5zZWN0aW9uIC5zdGFydCwgImF4IgorCisJLmdsb2JsIF9fc3RhcnQKKwkvKiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGxvYWRlciEgKi8KK19fc3RhcnQ6CisJZW50cnkJc3AsIDMyCQkjIHdlIGRvIG5vdCBpbnRlbmQgdG8gcmV0dXJuCisJX2NhbGwwCV9zdGFydAorX19zdGFydF9hMDoKKwkuYWxpZ24gNAorCisJLnNlY3Rpb24gLnRleHQsICJheCIKKwkuYmVnaW4gbGl0ZXJhbF9wcmVmaXggLnRleHQKKworCS8qIHB1dCBsaXRlcmFscyBpbiBoZXJlISAqLworCisJLmdsb2JsIF9zdGFydAorX3N0YXJ0OgorCisJLyogJ3Jlc2V0JyB3aW5kb3cgcmVnaXN0ZXJzICovCisKKwltb3ZpCWE0LCAxCisJd3NyCWE0LCBQUworCXJzeW5jCisKKwlyc3IJYTUsIFdJTkRPV0JBU0UKKwlzc2wJYTUKKwlzbGwJYTQsIGE0CisJd3NyCWE0LCBXSU5ET1dTVEFSVAorCXJzeW5jCisKKwltb3ZpCWE0LCAweDAwMDQwMDAwCisJd3NyCWE0LCBQUworCXJzeW5jCisKKwkvKiBjb3B5IHRoZSBsb2FkZXIgdG8gaXRzIGFkZHJlc3MKKwkgKiBOb3RlOiBUaGUgbG9hZGVyIGl0c2VsZiBpcyBhIHZlcnkgc21hbGwgcGllY2UsIHNvIHdlIGFzc3VtZSB3ZQorCSAqICAgICAgIGRvbid0IHBhcnRpYWxseSBvdmVybGFwLiBXZSBhbHNvIGFzc3VtZSAoZXZlbiBtb3JlIGltcG9ydGFudCkKKwkgKgkgdGhhdCB0aGUga2VybmVsIGltYWdlIGlzIG91dCBvZiB0aGUgd2F5LiBVc3VhbGx5LCB3aGVuIHRoZQorCSAqCSBsb2FkIGFkZHJlc3Mgb2YgdGhpcyBpbWFnZSBpcyBub3QgYXQgYW4gYXJiaXRyYXJ5IGFkZHJlc3MsCisJICoJIGJ1dCBhbGlnbmVkIHRvIHNvbWUgMTBLJ3Mgd2Ugc2hvdWxkbid0IG92ZXJsYXAuCisJICovCisKKwkvKiBOb3RlOiBUaGUgYXNzZW1ibGVyIGNhbm5vdCByZWxheCAiYWRkaSBhMCwgYTAsIC4uLiIgdG8gYW4KKwkgICBsMzJyLCBzbyB3ZSBsb2FkIHRvIGE0IGZpcnN0LiAqLworCisJYWRkaQlhNCwgYTAsIF9fc3RhcnQgLSBfX3N0YXJ0X2EwCisJbW92CWEwLCBhNAorCW1vdmkJYTQsIF9fc3RhcnQKKwltb3ZpCWE1LCBfX3JlbG9jX2VuZAorCisJIyBhMDogYWRkcmVzcyB3aGVyZSB0aGlzIGNvZGUgaGFzIGJlZW4gbG9hZGVkCisJIyBhNDogY29tcGlsZWQgYWRkcmVzcyBvZiBfX3N0YXJ0CisJIyBhNTogY29tcGlsZWQgZW5kIGFkZHJlc3MKKworCW1vdi5uCWE3LCBhMAorCW1vdi5uCWE4LCBhNAorCisxOgorCWwzMmkJYTEwLCBhNywgMAorCWwzMmkJYTExLCBhNywgNAorCXMzMmkJYTEwLCBhOCwgMAorCXMzMmkJYTExLCBhOCwgNAorCWwzMmkJYTEwLCBhNywgOAorCWwzMmkJYTExLCBhNywgMTIKKwlzMzJpCWExMCwgYTgsIDgKKwlzMzJpCWExMSwgYTgsIDEyCisJYWRkaQlhOCwgYTgsIDE2CisJYWRkaQlhNywgYTcsIDE2CisJYmx0CWE4LCBhNSwgMWIKKworCisJLyogV2UgaGF2ZSB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSB0aGUgY2FjaGVzIGhlcmUgYmVmb3JlIHdlIGp1bXAuICovCisKKyNpZiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCisJZGNhY2hlX3dyaXRlYmFja19hbGwgIGE1LCBhNgorI2VuZGlmCisJaWNhY2hlX2ludmFsaWRhdGVfYWxsIGE1LCBhNgorCisJbW92aQlhMTEsIF9yZWxvYworCWp4CWExMQorCisJLmdsb2JsIF9yZWxvYworX3JlbG9jOgorCisJLyogUmVkQm9vdCBpcyBub3cgYXQgdGhlIGVuZCBvZiB0aGUgbWVtb3J5LCBzbyB3ZSBkb24ndCBoYXZlCisJICogdG8gY29weSB0aGUgcGFyYW1ldGVyIGxpc3QuIEtlZXAgdGhlIGNvZGUgYXJvdW5kOyBpbiBjYXNlCisJICogd2UgbmVlZCBpdCBhZ2Fpbi4gKi8KKyNpZiAwCisJIyBhMDogbG9hZCBhZGRyZXNzCisJIyBhMjogc3RhcnQgYWRkcmVzcyBvZiBwYXJhbWV0ZXIgbGlzdAorCSMgYTM6IGxlbmd0aCBvZiBwYXJhbWV0ZXIgbGlzdAorCSMgYTQ6IF9fc3RhcnQKKworCS8qIGNvcHkgdGhlIHBhcmFtZXRlciBsaXN0IG91dCBvZiB0aGUgd2F5ICovCisKKwltb3ZpCWE2LCBfcGFyYW1fc3RhcnQKKwlhZGQJYTMsIGEyLCBhMworMjoKKwlsMzJpCWE4LCBhMiwgMAorCXMzMmkJYTgsIGE2LCAwCisJYWRkaQlhMiwgYTIsIDQKKwlhZGRpCWE2LCBhNiwgNAorCWJsdAlhMiwgYTMsIDJiCisjZW5kaWYKKworCS8qIGNsZWFyIEJTUyBzZWN0aW9uICovCisJbW92aQlhNiwgX19ic3Nfc3RhcnQKKwltb3ZpCWE3LCBfX2Jzc19lbmQKKwltb3ZpLm4JYTUsIDAKKzM6CisJczMyaQlhNSwgYTYsIDAKKwlhZGRpCWE2LCBhNiwgNAorCWJsdAlhNiwgYTcsIDNiCisKKwltb3ZpCWE1LCAtMTYKKwltb3ZpCWExLCBfc3RhY2sgKyBTVEFDS19TSVpFCisJYW5kCWExLCBhMSwgYTUKKworCS8qIFVuY29tcHJlc3MgdGhlIGtlcm5lbCAqLworCisJIyBhMDogbG9hZCBhZGRyZXNzCisJIyBhMjogYm9vdCBwYXJhbWV0ZXIKKwkjIGE0OiBfX3N0YXJ0CisKKwltb3ZpCWEzLCBfX2ltYWdlX2xvYWQKKwlzdWIJYTQsIGEzLCBhNAorCWFkZAlhOCwgYTAsIGE0CisKKwkjIGExICBTdGFjaworCSMgYTgoYTQpICBMb2FkIGFkZHJlc3Mgb2YgdGhlIGltYWdlCisKKwltb3ZpCWE2LCBfaW1hZ2Vfc3RhcnQKKwltb3ZpCWExMCwgX2ltYWdlX2VuZAorCW1vdmkJYTcsIDB4MTAwMDAwMAorCXN1YglhMTEsIGExMCwgYTYKKwltb3ZpCWE5LCBjb21wbGVuCisJczMyaQlhMTEsIGE5LCAwCisKKwltb3ZpCWEwLCAwCisKKwkjIGE2IGRlc3RpbmF0aW9uCisJIyBhNyBtYXhpbXVtIHNpemUgb2YgZGVzdGluYXRpb24KKwkjIGE4IHNvdXJjZQorCSMgYTkgcHRyIHRvIGxlbmd0aAorCisJLmV4dGVybiBndW56aXAKKwltb3ZpCWE0LCBndW56aXAKKwliZXF6CWE0LCAxZgorCisJY2FsbHg0CWE0CisKKwlqCTJmCisKKworCSMgYTYgZGVzdGluYXRpb24gc3RhcnQKKwkjIGE3IG1heGltdW0gc2l6ZSBvZiBkZXN0aW5hdGlvbgorCSMgYTggc291cmNlIHN0YXJ0CisJIyBhOSBwdHIgdG8gbGVuZ3RoCisJIyBhMTAgZGVzdGluYXRpb24gZW5kCisKKzE6CisgICAgICAgIGwzMmkgICAgYTksIGE4LCAwCisgICAgICAgIGwzMmkgICAgYTExLCBhOCwgNAorICAgICAgICBzMzJpICAgIGE5LCBhNiwgMAorICAgICAgICBzMzJpICAgIGExMSwgYTYsIDQKKyAgICAgICAgbDMyaSAgICBhOSwgYTgsIDgKKyAgICAgICAgbDMyaSAgICBhMTEsIGE4LCAxMgorICAgICAgICBzMzJpICAgIGE5LCBhNiwgOAorICAgICAgICBzMzJpICAgIGExMSwgYTYsIDEyCisgICAgICAgIGFkZGkgICAgYTYsIGE2LCAxNgorICAgICAgICBhZGRpICAgIGE4LCBhOCwgMTYKKyAgICAgICAgYmx0ICAgICBhNiwgYTEwLCAxYgorCisKKwkvKiBqdW1wIHRvIHRoZSBrZXJuZWwgKi8KKzI6CisjaWYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworCWRjYWNoZV93cml0ZWJhY2tfYWxsIGE1LCBhNgorI2VuZGlmCisJaWNhY2hlX2ludmFsaWRhdGVfYWxsIGE1LCBhNgorCisJbW92aQlhNSwgX19zdGFydAorCW1vdmkJYTMsIGJvb3RfaW5pdHJkX3N0YXJ0CisJbW92aQlhNCwgYm9vdF9pbml0cmRfZW5kCisJc3ViCWEzLCBhMywgYTUKKwlzdWIJYTQsIGE0LCBhNQorCWFkZAlhMywgYTAsIGEzCisJYWRkCWE0LCBhMCwgYTQKKworCSMgYTIgIEJvb3QgcGFyYW1ldGVyIGxpc3QKKwkjIGEzICBpbml0cmRfc3RhcnQgKHZpcnR1YWwgbG9hZCBhZGRyZXNzKQorCSMgYTQgIGluaXRyZF9lbmQgICAodmlydHVhbCBsb2FkIGFkZHJlc3MpCisKKwltb3ZpCWEwLCBfaW1hZ2Vfc3RhcnQKKwlqeAlhMAorCisJLmFsaWduIDE2CisJLmRhdGEKKwkuZ2xvYmwgYXZhaWxfcmFtCithdmFpbF9yYW06CisJLmxvbmcJX2hlYXAKKwkuZ2xvYmwgZW5kX2F2YWlsCitlbmRfYXZhaWw6CisJLmxvbmcJX2hlYXAgKyBIRUFQX1NJWkUKKworCS5jb21tIF9zdGFjaywgU1RBQ0tfU0laRQorCS5jb21tIF9oZWFwLCBIRUFQX1NJWkUKKworCS5nbG9ibCBlbmRfYXZhaWwKKwkuY29tbSBjb21wbGVuLCA0CisKKwkuZW5kCWxpdGVyYWxfcHJlZml4CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2xpYi9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzNiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9ib290L2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjCisjIE1ha2VmaWxlIGZvciBzb21lIGxpYnMgbmVlZGVkIGJ5IHpJbWFnZS4KKyMKKworemxpYgk6PSBpbmZibG9jay5jIGluZmNvZGVzLmMgaW5mZmFzdC5jIGluZmxhdGUuYyBpbmZ0cmVlcy5jIGluZnV0aWwuYworCitsaWIteQkrPSAkKHpsaWI6LmM9Lm8pIHptZW0ubworCitFWFRSQV9DRkxBR1MJKz0gLUlsaWIvemxpYl9pbmZsYXRlCisKK3F1aWV0X2NtZF9jb3B5X3psaWIgPSBDT1BZICAgICRACisgICAgICBjbWRfY29weV96bGliID0gY2F0ICQ8ID4gJEAKKworJChhZGRwcmVmaXggJChvYmopLywkKHpsaWIpKTogJChvYmopLyU6ICQoc3JjdHJlZSkvbGliL3psaWJfaW5mbGF0ZS8lCisJJChjYWxsIGNtZCxjb3B5X3psaWIpCisKK2NsZWFuLWZpbGVzCTo9ICQoemxpYikKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2Jvb3QvbGliL3ptZW0uYyBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL3ptZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg2MmFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvYm9vdC9saWIvem1lbS5jCkBAIC0wLDAgKzEsNzkgQEAKKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKKy8qIGJpdHMgdGFrZW4gZnJvbSBwcGMgKi8KKworZXh0ZXJuIHZvaWQgKmF2YWlsX3JhbSwgKmVuZF9hdmFpbDsKKwordm9pZCBleGl0ICh2b2lkKQoreworICBmb3IgKDs7KTsKK30KKwordm9pZCAqemFsbG9jKHVuc2lnbmVkIHNpemUpCit7CisgICAgICAgIHZvaWQgKnAgPSBhdmFpbF9yYW07CisKKyAgICAgICAgc2l6ZSA9IChzaXplICsgNykgJiAtODsKKyAgICAgICAgYXZhaWxfcmFtICs9IHNpemU7CisgICAgICAgIGlmIChhdmFpbF9yYW0gPiBlbmRfYXZhaWwpIHsKKyAgICAgICAgICAgICAgICAvL3B1dHMoIm9vcHMuLi4gb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgLy9wYXVzZSgpOworICAgICAgICAgICAgICAgIGV4aXQgKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgSEVBRF9DUkMgICAgICAgIDIKKyNkZWZpbmUgRVhUUkFfRklFTEQgICAgIDQKKyNkZWZpbmUgT1JJR19OQU1FICAgICAgIDgKKyNkZWZpbmUgQ09NTUVOVCAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkVTRVJWRUQgICAgICAgIDB4ZTAKKworI2RlZmluZSBERUZMQVRFRCAgICAgICAgOAorCit2b2lkIGd1bnppcCAodm9pZCAqZHN0LCBpbnQgZHN0bGVuLCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCAqbGVucCkKK3sKKwl6X3N0cmVhbSBzOworCWludCByLCBpLCBmbGFnczsKKworICAgICAgICAvKiBza2lwIGhlYWRlciAqLworICAgICAgICBpID0gMTA7CisgICAgICAgIGZsYWdzID0gc3JjWzNdOworICAgICAgICBpZiAoc3JjWzJdICE9IERFRkxBVEVEIHx8IChmbGFncyAmIFJFU0VSVkVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy9wdXRzKCJiYWQgZ3ppcHBlZCBkYXRhXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmbGFncyAmIEVYVFJBX0ZJRUxEKSAhPSAwKQorICAgICAgICAgICAgICAgIGkgPSAxMiArIHNyY1sxMF0gKyAoc3JjWzExXSA8PCA4KTsKKyAgICAgICAgaWYgKChmbGFncyAmIE9SSUdfTkFNRSkgIT0gMCkKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3JjW2krK10gIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApCisgICAgICAgICAgICAgICAgd2hpbGUgKHNyY1tpKytdICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgIGlmICgoZmxhZ3MgJiBIRUFEX0NSQykgIT0gMCkKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgIGlmIChpID49ICpsZW5wKSB7CisgICAgICAgICAgICAgICAgLy9wdXRzKCJndW56aXA6IHJhbiBvdXQgb2YgZGF0YSBpbiBoZWFkZXJcbiIpOworICAgICAgICAgICAgICAgIGV4aXQoKTsKKyAgICAgICAgfQorCisJcy53b3Jrc3BhY2UgPSB6YWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisgICAgICAgIHIgPSB6bGliX2luZmxhdGVJbml0MigmcywgLU1BWF9XQklUUyk7CisgICAgICAgIGlmIChyICE9IFpfT0spIHsKKyAgICAgICAgICAgICAgICAvL3B1dHMoImluZmxhdGVJbml0MiByZXR1cm5lZCAiKTsgcHV0aGV4KHIpOyBwdXRzKCJcbiIpOworICAgICAgICAgICAgICAgIGV4aXQoKTsKKyAgICAgICAgfQorICAgICAgICBzLm5leHRfaW4gPSBzcmMgKyBpOworICAgICAgICBzLmF2YWlsX2luID0gKmxlbnAgLSBpOworICAgICAgICBzLm5leHRfb3V0ID0gZHN0OworICAgICAgICBzLmF2YWlsX291dCA9IGRzdGxlbjsKKyAgICAgICAgciA9IHpsaWJfaW5mbGF0ZSgmcywgWl9GSU5JU0gpOworICAgICAgICBpZiAociAhPSBaX09LICYmIHIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICAgICAgLy9wdXRzKCJpbmZsYXRlIHJldHVybmVkICIpOyBwdXRoZXgocik7IHB1dHMoIlxuIik7CisgICAgICAgICAgICAgICAgZXhpdCgpOworICAgICAgICB9CisgICAgICAgICpsZW5wID0gcy5uZXh0X291dCAtICh1bnNpZ25lZCBjaGFyICopIGRzdDsKKyAgICAgICAgemxpYl9pbmZsYXRlRW5kKCZzKTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvYm9vdC9yYW1kaXNrL01ha2VmaWxlIGIvYXJjaC94dGVuc2EvYm9vdC9yYW1kaXNrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMmY3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9ib290L3JhbWRpc2svTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorIworIyBNYWtlZmlsZSBmb3IgYSByYW1kaXNrIGltYWdlCisjCisKK0JJR19FTkRJQU4JOj0gJChzaGVsbCBlY2hvIC1lICJcI2lmZGVmIF9fWFRFTlNBX0VMX19cbmludCBsaXR0bGU7XG5cI2Vsc2VcbmludCBiaWc7XG5cI2VuZGlmIiB8ICQoQ0MpIC1FIC18Z3JlcCAtYyBiaWcpCisKK2lmZXEgKCQoQklHX0VORElBTiksMSkKK09CSkNPUFlfQVJHUyAgICA6PSAtTyBlbGYzMi14dGVuc2EtYmUKK2Vsc2UKK09CSkNPUFlfQVJHUyAgICA6PSAtTyBlbGYzMi14dGVuc2EtbGUKK2VuZGlmCisKK29iai15ID0gcmFtZGlzay5vCisKK1JBTURJU0tfSU1BR0UgPSBhcmNoLyQoQVJDSCkvYm9vdC9yYW1kaXNrLyQoQ09ORklHX0VNQkVEREVEX1JBTURJU0tfSU1BR0UpCisKK2FyY2gvJChBUkNIKS9ib290L3JhbWRpc2svcmFtZGlzay5vOgorCSQoUSllY2hvIC1lICJkdW1teToiIHwgJChBUykgLW8gJEA7CisJJChRKSQoT0JKQ09QWSkgJChPQkpDT1BZX0FSR1MpCQkJCQkgICAgXAorCQktLWFkZC1zZWN0aW9uIC5pbml0cmQ9JChSQU1ESVNLX0lNQUdFKQkJCSAgICBcCisJCS0tc2V0LXNlY3Rpb24tZmxhZ3MgLmluaXRyZD1jb250ZW50cyxhbGxvYyxsb2FkLGxvYWQsZGF0YSAgIFwKKwkJYXJjaC8kKEFSQ0gpL2Jvb3QvcmFtZGlzay9yYW1kaXNrLm8gJEAKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvY29uZmlncy9jb21tb25fZGVmY29uZmlnIGIvYXJjaC94dGVuc2EvY29uZmlncy9jb21tb25fZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjMwZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9jb25maWdzL2NvbW1vbl9kZWZjb25maWcKQEAgLTAsMCArMSw2NjIgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xMS1yYzIKKyMgVHVlIE1hciAgMSAxNjozNjo1MyAyMDA1CisjCisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19YVEVOU0E9eQorIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19IQVZFX0RFQ19MT0NLPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CitDT05GSUdfTU9EVkVSU0lPTlM9eQorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMKKyMKK0NPTkZJR19YVEVOU0FfQVJDSF9MSU5VWF9CRT15CisjIENPTkZJR19YVEVOU0FfQVJDSF9MSU5VWF9MRSBpcyBub3Qgc2V0CisjIENPTkZJR19YVEVOU0FfQVJDSF9MSU5VWF9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hURU5TQV9BUkNIX1M1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1hURU5TQV9DVVNUT00gaXMgbm90IHNldAorQ09ORklHX01NVT15CisjIENPTkZJR19YVEVOU0FfVU5BTElHTkVEX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBvcHRpb25zCisjCisjIENPTkZJR19YVEVOU0FfUExBVEZPUk1fSVNTIGlzIG5vdCBzZXQKK0NPTkZJR19YVEVOU0FfUExBVEZPUk1fWFQyMDAwPXkKK0NPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwzODQwMCBpcD1ib290cCByb290PW5mcyBuZnNyb290PS9vcHQvbW9udGF2aXN0YS9wcm8vZGV2a2l0L3h0ZW5zYS9saW51eF9iZS90YXJnZXQiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorIyBDT05GSUdfUENJX0xFR0FDWV9QUk9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9OQU1FUyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQy1jYXJkIGJyaWRnZXMKKyMKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3R1YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19LQ09SRV9FTEY9eQorQ09ORklHX0JJTkZNVF9FTEY9eQorQ09ORklHX0JJTkZNVF9NSVNDPXkKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JMk8gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgc3VwcG9ydAorIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUTElOS19ERVYgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUz15CitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIPXkKK0NPTkZJR19JUF9ST1VURV9WRVJCT1NFPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorQ09ORklHX0lQX1BOUF9SQVJQPXkKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUcgaXMgbm90IHNldAorIyBDT05GSUdfSVBfVENQRElBR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKK0NPTkZJR19ORVRfU0NIRUQ9eQorQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVM9eQorIyBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfQ0xLX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9DQlE9bQorQ09ORklHX05FVF9TQ0hfSFRCPW0KKyMgQ09ORklHX05FVF9TQ0hfSEZTQyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9QUklPPW0KK0NPTkZJR19ORVRfU0NIX1JFRD1tCitDT05GSUdfTkVUX1NDSF9TRlE9bQorQ09ORklHX05FVF9TQ0hfVEVRTD1tCitDT05GSUdfTkVUX1NDSF9UQkY9bQorQ09ORklHX05FVF9TQ0hfR1JFRD1tCitDT05GSUdfTkVUX1NDSF9EU01BUks9bQorIyBDT05GSUdfTkVUX1NDSF9ORVRFTSBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1NDSF9JTkdSRVNTPW0KK0NPTkZJR19ORVRfUU9TPXkKK0NPTkZJR19ORVRfRVNUSU1BVE9SPXkKK0NPTkZJR19ORVRfQ0xTPXkKK0NPTkZJR19ORVRfQ0xTX1RDSU5ERVg9bQorQ09ORklHX05FVF9DTFNfUk9VVEU0PW0KK0NPTkZJR19ORVRfQ0xTX1JPVVRFPXkKK0NPTkZJR19ORVRfQ0xTX0ZXPW0KK0NPTkZJR19ORVRfQ0xTX1UzMj1tCisjIENPTkZJR19DTFNfVTMyX1BFUkYgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19JTkQgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfUlNWUD1tCitDT05GSUdfTkVUX0NMU19SU1ZQNj1tCisjIENPTkZJR19ORVRfQ0xTX0FDVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0NMU19QT0xJQ0U9eQorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKK0NPTkZJR19YVDIwMDBfU09OSUM9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKyMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1RSIGlzIG5vdCBzZXQKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKK0NPTkZJR19ORVRfUkFESU89eQorCisjCisjIE9ic29sZXRlIFdpcmVsZXNzIGNhcmRzIHN1cHBvcnQgKHByZS04MDIuMTEpCisjCitDT05GSUdfU1RSSVA9bQorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CisjCitDT05GSUdfSEVSTUVTPW0KKyMgQ09ORklHX1BMWF9IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfVE1EX0hFUk1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0lfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTUVMIGlzIG5vdCBzZXQKKworIworIyBQcmlzbSBHVC9EdWV0dGUgODAyLjExKGEvYi9nKSBQQ0kvQ2FyZGJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfV0lSRUxFU1M9eQorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CisjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IEkvTyBkcml2ZXJzCisjCisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfR0FNRVBPUlQ9eQorQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX0k4MDQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fQ1Q4MkM3MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CisjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JyBtYXkgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlM9eQorQ09ORklHX0RFVkZTX0ZTPXkKKyMgQ09ORklHX0RFVkZTX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVlBUU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CisjIENPTkZJR19FWFBPUlRGUyBpcyBub3Qgc2V0CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZyBiL2FyY2gveHRlbnNhL2NvbmZpZ3MvaXNzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDI2MjFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvY29uZmlncy9pc3NfZGVmY29uZmlnCkBAIC0wLDAgKzEsNTMxIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTEtcmMyCisjIEZyaSBGZWIgMjUgMTk6MjE6MjQgMjAwNQorIworQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorQ09ORklHX1hURU5TQT15CisjIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CitDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQorQ09ORklHX0hBVkVfREVDX0xPQ0s9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQ0xFQU5fQ09NUElMRT15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CisjIENPTkZJR19LT0JKRUNUX1VFVkVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMKKyMKK0NPTkZJR19YVEVOU0FfQVJDSF9MSU5VWF9CRT15CisjIENPTkZJR19YVEVOU0FfQVJDSF9MSU5VWF9MRSBpcyBub3Qgc2V0CisjIENPTkZJR19YVEVOU0FfQVJDSF9MSU5VWF9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hURU5TQV9BUkNIX1M1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1hURU5TQV9DVVNUT00gaXMgbm90IHNldAorQ09ORklHX01NVT15CisjIENPTkZJR19YVEVOU0FfVU5BTElHTkVEX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRIX0VNVUxBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBvcHRpb25zCisjCitDT05GSUdfWFRFTlNBX1BMQVRGT1JNX0lTUz15CisjIENPTkZJR19YVEVOU0FfUExBVEZPUk1fWFQyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hURU5TQV9QTEFURk9STV9BUlVCQSBpcyBub3Qgc2V0CisjIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfWFRFTlNBX0NQVV9DTE9DSz0xMAorIyBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVkgaXMgbm90IHNldAorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTMCwzODQwMCBldGgwPXR1bnRhcCwsdGFwMCBpcD0xOTIuMTY4LjE2OC41OjE5Mi4xNjguMTY4LjEgcm9vdD1uZnMgbmZzcm9vdD0xOTIuMTY4LjE2OC4xOi9vcHQvbW9udGF2aXN0YS9wcm8vZGV2a2l0L3h0ZW5zYS9saW51eF9iZS90YXJnZXQiCitDT05GSUdfU0VSSUFMX0NPTlNPTEU9eQorQ09ORklHX1hURU5TQV9JU1NfTkVUV09SSz15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKworIworIyBFeGVjdHVhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0tDT1JFX0VMRj15CitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JraW5nIHN1cHBvcnQKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRMSU5LX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9UQ1BESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1RDUERJQUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfSE1BQ19OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfSE1BQ19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDVFBfSE1BQ19NRDUgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIX0NMS19KSUZGSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfQ0xLX0dFVFRJTUVPRkRBWSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIX0NMS19DUFUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19ST1VURSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVERFVklDRVMgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgSS9PIGRyaXZlcnMKKyMKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9HQU1FUE9SVD15CisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworQ09ORklHX1dBVENIRE9HPXkKK0NPTkZJR19XQVRDSERPR19OT1dBWU9VVD15CisKKyMKKyMgV2F0Y2hkb2cgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19TT0ZUX1dBVENIRE9HPXkKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcgbWF5IGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pCRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19ERVZGU19GUz15CitDT05GSUdfREVWRlNfTU9VTlQ9eQorIyBDT05GSUdfREVWRlNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVWUFRTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX0RJUkVDVElPPXkKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorIyBDT05GSUdfRVhQT1JURlMgaXMgbm90IHNldAorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL2tlcm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTczMDE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eC9YdGVuc2Ega2VybmVsLgorIworCitleHRyYS15IDo9IGhlYWQubyB2bWxpbnV4LmxkcworCisKK29iai15IDo9IGFsaWduLm8gZW50cnkubyBpcnEubyBjb3Byb2Nlc3Nvci5vIHByb2Nlc3MubyBwdHJhY2UubyBzZW1hcGhvcmUubyAgXAorCSBzZXR1cC5vIHNpZ25hbC5vIHN5c2NhbGxzLm8gdGltZS5vIHRyYXBzLm8gdmVjdG9ycy5vIHBsYXRmb3JtLm8gIFwKKwkgcGNpLWRtYS5vCisKKyMjIHdpbmRvd3NwaWxsLm8KKworb2JqLSQoQ09ORklHX0tHREIpICs9IHh0ZW5zYS1zdHViLm8KK29iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCitvYmotJChDT05GSUdfTU9EVUxFUykgKz0geHRlbnNhX2tzeW1zLm8gbW9kdWxlLm8KKworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0YjFlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYWxpZ24uUwpAQCAtMCwwICsxLDQ1OSBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC9hbGlnbi5TCisgKgorICogSGFuZGxlIHVuYWxpZ25tZW50IGV4Y2VwdGlvbnMgaW4ga2VybmVsIHNwYWNlLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhLCBJbmMuCisgKgorICogUmV3cml0dGVuIGJ5IENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqCisgKiBCYXNlZCBvbiB3b3JrIGZyb20gSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICogYW5kIE1hcmMgR2F1dGhpZXIgPG1hcmNAdGVuc2lsaWNhLmNvbSwgbWFyY0BhbGltbmkudXdhdGVybG9vLmNhPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKworI2lmIFhDSEFMX1VOQUxJR05FRF9MT0FEX0VYQ0VQVElPTiB8fCBYQ0hBTF9VTkFMSUdORURfU1RPUkVfRVhDRVBUSU9OCisKKy8qICBGaXJzdC1sZXZlbCBleGNlcHRpb24gaGFuZGxlciBmb3IgdW5hbGlnbmVkIGV4Y2VwdGlvbnMuCisgKgorICogIE5vdGU6IFRoaXMgaGFuZGxlciB3b3JrcyBvbmx5IGZvciBrZXJuZWwgZXhjZXB0aW9ucy4gIFVuYWxpZ25lZCB1c2VyCisgKiAgICAgICAgYWNjZXNzIHNob3VsZCBnZXQgYSBzZWcgZmF1bHQuCisgKi8KKworLyogQmlnIGFuZCBsaXR0bGUgZW5kaWFuIDE2LWJpdCB2YWx1ZXMgYXJlIGxvY2F0ZWQgaW4KKyAqIGRpZmZlcmVudCBoYWx2ZXMgb2YgYSByZWdpc3Rlci4gIEhXT1JEX1NUQVJUIGhlbHBzIHRvCisgKiBhYnN0cmFjdCB0aGUgbm90aW9uIG9mIGV4dHJhY3RpbmcgYSAxNi1iaXQgdmFsdWUgZnJvbSBhCisgKiByZWdpc3Rlci4KKyAqIFdlIGFsc28gaGF2ZSB0byBkZWZpbmUgbmV3IHNoaWZ0aW5nIGluc3RydWN0aW9ucyBiZWNhdXNlCisgKiBsc2IgYW5kIG1zYiBhcmUgb24gJ29wcG9zaXRlJyBlbmRzIGluIGEgcmVnaXN0ZXIgZm9yCisgKiBkaWZmZXJlbnQgZW5kaWFuIG1hY2hpbmVzLgorICoKKyAqIEFzc3VtZSBhIG1lbW9yeSByZWdpb24gaW4gYXNjZW5kaW5nIGFkZHJlc3M6CisgKiAgIAkwIDEgMiAzfDQgNSA2IDcKKyAqCisgKiBXaGVuIGxvYWRpbmcgb25lIHdvcmQgaW50byBhIHJlZ2lzdGVyLCB0aGUgY29udGVudCBvZiB0aGF0IHJlZ2lzdGVyIGlzOgorICogIExFCTMgMiAxIDAsIDcgNiA1IDQKKyAqICBCRSAgMCAxIDIgMywgNCA1IDYgNworICoKKyAqIE1hc2tpbmcgdGhlIGJpdHMgb2YgdGhlIGhpZ2hlci9sb3dlciBhZGRyZXNzIG1lYW5zOgorICogIExFICBYIFggMCAwLCAwIDAgWCBYCisgKiAgQkUJMCAwIFggWCwgWCBYIDAgMAorICoKKyAqIFNoaWZ0aW5nIHRvIGhpZ2hlci9sb3dlciBhZGRyZXNzZXMsIG1lYW5zOgorICogIExFICBzaGlmdCBsZWZ0IC8gc2hpZnQgcmlnaHQKKyAqICBCRSAgc2hpZnQgcmlnaHQgLyBzaGlmdCBsZWZ0CisgKgorICogRXh0cmFjdGluZyAxNiBiaXRzIGZyb20gYSAzMiBiaXQgcmVnLiB2YWx1ZSB0byBoaWdoZXIvbG93ZXIgYWRkcmVzcyBtZWFuczoKKyAqICBMRSAgbWFzayAwIDAgWCBYIC8gc2hpZnQgbGVmdAorICogIEJFICBzaGlmdCBsZWZ0IC8gbWFzayAwIDAgWCBYCisgKi8KKworI2RlZmluZSBVTkFMSUdORURfVVNFUl9FWENFUFRJT04KKworI2lmIFhDSEFMX0hBVkVfQkUKKworI2RlZmluZSBIV09SRF9TVEFSVAkxNgorI2RlZmluZQlJTlNOX09QMAkyOAorI2RlZmluZQlJTlNOX1QJCTI0CisjZGVmaW5lCUlOU05fT1AxCTE2CisKKy5tYWNybyBfX3NyY19iCXIsIHcwLCB3MTsJc3JjCVxyLCBcdzAsIFx3MTsJLmVuZG0KKy5tYWNybyBfX3NzYTgJcjsJCXNzYThiCVxyOwkJLmVuZG0KKy5tYWNybyBfX3NzYThyCXI7CQlzc2E4bAlccjsJCS5lbmRtCisubWFjcm8gX19zaAlyLCBzOwkJc3JsCVxyLCBcczsJCS5lbmRtCisubWFjcm8gX19zbAlyLCBzOwkJc2xsCVxyLCBcczsJCS5lbmRtCisubWFjcm8gX19leHRoCXIsIHM7CQlleHR1aQlcciwgXHMsIDAsIDE2OwkuZW5kbQorLm1hY3JvIF9fZXh0bAlyLCBzOwkJc2xsaQlcciwgXHMsIDE2OwkuZW5kbQorCisjZWxzZQorCisjZGVmaW5lIEhXT1JEX1NUQVJUCTAKKyNkZWZpbmUJSU5TTl9PUDAJMAorI2RlZmluZQlJTlNOX1QJCTQKKyNkZWZpbmUJSU5TTl9PUDEJMTIKKworLm1hY3JvIF9fc3JjX2IJciwgdzAsIHcxOwlzcmMJXHIsIFx3MSwgXHcwOwkuZW5kbQorLm1hY3JvIF9fc3NhOAlyOwkJc3NhOGwJXHI7CQkuZW5kbQorLm1hY3JvIF9fc3NhOHIJcjsJCXNzYThiCVxyOwkJLmVuZG0KKy5tYWNybyBfX3NoCXIsIHM7CQlzbGwJXHIsIFxzOwkJLmVuZG0KKy5tYWNybyBfX3NsCXIsIHM7CQlzcmwJXHIsIFxzOwkJLmVuZG0KKy5tYWNybyBfX2V4dGgJciwgczsJCXNsbGkJXHIsIFxzLCAxNjsJLmVuZG0KKy5tYWNybyBfX2V4dGwJciwgczsJCWV4dHVpCVxyLCBccywgMCwgMTY7CS5lbmRtCisKKyNlbmRpZgorCisvKgorICoJeHh4eCB4eHh4ID0gaW1tOCBmaWVsZAorICoJICAgICB5eXl5ID0gaW1tNCBmaWVsZAorICoJICAgICBzc3NzID0gcyBmaWVsZAorICoJICAgICB0dHR0ID0gdCBmaWVsZAorICoKKyAqCSAgICAgICAJCSAxNgkJICAgIDAKKyAqCQkgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJTDMySS5OCQkgIHl5eXkgc3NzcyB0dHR0IDEwMDAKKyAqCVMzMkkuTgkgICAgICAgICAgeXl5eSBzc3NzIHR0dHQgMTAwMQorICoKKyAqCSAgICAgICAyMwkJCSAgICAwCisgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCXJlcwkgICAgICAgICAgMDAwMCAgICAgICAgICAgMDAxMAorICoJTDE2VUkJeHh4eCB4eHh4IDAwMDEgc3NzcyB0dHR0IDAwMTAKKyAqCUwzMkkJeHh4eCB4eHh4IDAwMTAgc3NzcyB0dHR0IDAwMTAKKyAqCVhYWAkgICAgICAgICAgMDAxMSBzc3NzIHR0dHQgMDAxMAorICoJWFhYCSAgICAgICAgICAwMTAwIHNzc3MgdHR0dCAwMDEwCisgKglTMTZJCXh4eHggeHh4eCAwMTAxIHNzc3MgdHR0dCAwMDEwCisgKglTMzJJCXh4eHggeHh4eCAwMTEwIHNzc3MgdHR0dCAwMDEwCisgKglYWFgJICAgICAgICAgIDAxMTEgc3NzcyB0dHR0IDAwMTAKKyAqCVhYWAkgICAgICAgICAgMTAwMCBzc3NzIHR0dHQgMDAxMAorICoJTDE2U0kJeHh4eCB4eHh4IDEwMDEgc3NzcyB0dHR0IDAwMTAKKyAqCVhYWAkgICAgICAgICAgMTAxMCAgICAgICAgICAgMDAxMAorICogICAgICAqKkwzMkFJCXh4eHggeHh4eCAxMDExIHNzc3MgdHR0dCAwMDEwIHVuc3VwcG9ydGVkCisgKglYWFgJICAgICAgICAgIDExMDAgICAgICAgICAgIDAwMTAKKyAqCVhYWAkgICAgICAgICAgMTEwMSAgICAgICAgICAgMDAxMAorICoJWFhYCSAgICAgICAgICAxMTEwICAgICAgICAgICAwMDEwCisgKgkqKlMzMlJJCXh4eHggeHh4eCAxMTExIHNzc3MgdHR0dCAwMDEwIHVuc3VwcG9ydGVkCisgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgIF4gICAgXgorICogICAgc3ViLW9wY29kZSAoTklCQkxFX1IpIC0rICAgICAgICAgfCAgICB8CisgKiAgICAgICB0IGZpZWxkIChOSUJCTEVfVCkgLS0tLS0tLS0tLS0rICAgIHwKKyAqICBtYWpvciBvcGNvZGUgKE5JQkJMRV9PUDApIC0tLS0tLS0tLS0tLS0tKworICovCisKKyNkZWZpbmUgT1AwX0wzMklfTgkweDgJCS8qIGxvYWQgaW1tZWRpYXRlIG5hcnJvdyAqLworI2RlZmluZSBPUDBfUzMySV9OCTB4OQkJLyogc3RvcmUgaW1tZWRpYXRlIG5hcnJvdyAqLworI2RlZmluZSBPUDFfU0lfTUFTSwkweDQJCS8qIE9QMSBiaXQgc2V0IGZvciBzdG9yZXMgKi8KKyNkZWZpbmUgT1AxX1NJX0JJVAkyCQkvKiBPUDEgYml0IG51bWJlciBmb3Igc3RvcmVzICovCisKKyNkZWZpbmUgT1AxX0wzMkkJMHgyCisjZGVmaW5lIE9QMV9MMTZVSQkweDEKKyNkZWZpbmUgT1AxX0wxNlNJCTB4OQorI2RlZmluZSBPUDFfTDMyQUkJMHhiCisKKyNkZWZpbmUgT1AxX1MzMkkJMHg2CisjZGVmaW5lIE9QMV9TMTZJCTB4NQorI2RlZmluZSBPUDFfUzMyUkkJMHhmCisKKy8qCisgKiBFbnRyeSBjb25kaXRpb246CisgKgorICogICBhMDoJdHJhc2hlZCwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0FSRUcwKQorICogICBhMToJYTEKKyAqICAgYTI6CW5ldyBzdGFjayBwb2ludGVyLCBvcmlnaW5hbCBpbiBERVBDCisgKiAgIGEzOglkaXNwYXRjaCB0YWJsZQorICogICBkZXBjOglhMiwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0RFUEMpCisgKiAgIGV4Y3NhdmVfMToJYTMKKyAqCisgKiAgIFBUX0RFUEMgPj0gVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTOiBkb3VibGUgZXhjZXB0aW9uLCBERVBDCisgKgkgICAgIDwgIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogcmVndWxhciBleGNlcHRpb24KKyAqLworCisKK0VOVFJZKGZhc3RfdW5hbGlnbmVkKQorCisJLyogTm90ZTogV2UgZG9uJ3QgZXhwZWN0IHRoZSBhZGRyZXNzIHRvIGJlIGFsaWduZWQgb24gYSB3b3JkCisJICogICAgICAgYm91bmRhcnkuIEFmdGVyIGFsbCwgdGhlIHByb2Nlc3NvciBnZW5lcmF0ZWQgdGhhdCBleGNlcHRpb24KKwkgKiAgICAgICBhbmQgaXQgd291bGQgYmUgYSBoYXJkd2FyZSBmYXVsdC4KKwkgKi8KKworCS8qIFNhdmUgc29tZSB3b3JraW5nIHJlZ2lzdGVyICovCisKKwlzMzJpCWE0LCBhMiwgUFRfQVJFRzQKKwlzMzJpCWE1LCBhMiwgUFRfQVJFRzUKKwlzMzJpCWE2LCBhMiwgUFRfQVJFRzYKKwlzMzJpCWE3LCBhMiwgUFRfQVJFRzcKKwlzMzJpCWE4LCBhMiwgUFRfQVJFRzgKKworCXJzcglhMCwgREVQQworCXhzcglhMywgRVhDU0FWRV8xCisJczMyaQlhMCwgYTIsIFBUX0FSRUcyCisJczMyaQlhMywgYTIsIFBUX0FSRUczCisKKwkvKiBLZWVwIHZhbHVlIG9mIFNBUiBpbiBhMCAqLworCisJcnNyCWEwLCBTQVIKKwlyc3IJYTgsIEVYQ1ZBRERSCQkjIGxvYWQgdW5hbGlnbmVkIG1lbW9yeSBhZGRyZXNzCisKKwkvKiBOb3csIGlkZW50aWZ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zLgorCSAqCisJICogVGhlIG9ubHkgcG9zc2libGUgZGFuZ2VyIG9mIGEgZG91YmxlIGV4Y2VwdGlvbiBvbiB0aGUKKwkgKiBmb2xsb3dpbmcgbDMyaSBpbnN0cnVjdGlvbnMgaXMga2VybmVsIGNvZGUgaW4gdm1hbGxvYworCSAqIG1lbW9yeS4gVGhlIHByb2Nlc3NvciB3YXMganVzdCBleGVjdXRpbmcgYXQgdGhlIEVQQ18xCisJICogYWRkcmVzcywgYW5kIGluZGVlZCwgYWxyZWFkeSBmZXRjaGVkIHRoZSBpbnN0cnVjdGlvbi4gIFRoYXQKKwkgKiBndWFyYW50ZWVzIGEgVExCIG1hcHBpbmcsIHdoaWNoIGhhc24ndCBiZWVuIHJlcGxhY2VkIGJ5CisJICogdGhpcyB1bmFsaWduZWQgZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCB1c2VzIG9ubHkgc3RhdGljIFRMQgorCSAqIG1hcHBpbmdzLiBIb3dldmVyLCBoaWdoLWxldmVsIGludGVycnVwdCBoYW5kbGVycyBtaWdodAorCSAqIG1vZGlmeSBUTEIgZW50cmllcywgc28gZm9yIHRoZSBnZW5lcmljIGNhc2UsIHdlIHJlZ2lzdGVyIGEKKwkgKiBUQUJMRV9GSVhVUCBoYW5kbGVyIGhlcmUsIHRvby4KKwkgKi8KKworCS8qIGEzLi4uYTYgc2F2ZWQgb24gc3RhY2ssIGEyID0gU1AgKi8KKworCS8qIEV4dHJhY3QgdGhlIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkIHRoZSB1bmFsaWduZWQgYWNjZXNzLiAqLworCisJcnNyCWE3LCBFUENfMQkjIGxvYWQgZXhjZXB0aW9uIGFkZHJlc3MKKwltb3ZpCWEzLCB+MworCWFuZAlhMywgYTMsIGE3CSMgbWFzayBsb3dlciBiaXRzCisKKwlsMzJpCWE0LCBhMywgMAkjIGxvYWQgMiB3b3JkcworCWwzMmkJYTUsIGEzLCA0CisKKwlfX3NzYTgJYTcKKwlfX3NyY19iCWE0LCBhNCwgYTUJIyBhNCBoYXMgdGhlIGluc3RydWN0aW9uCisKKwkvKiBBbmFseXplIHRoZSBpbnN0cnVjdGlvbiAobG9hZCBvciBzdG9yZT8pLiAqLworCisJZXh0dWkJYTUsIGE0LCBJTlNOX09QMCwgNAkjIGdldCBpbnNuLm9wMCBuaWJibGUKKworI2lmIFhDSEFMX0hBVkVfTkFSUk9XCisJX2JlcWkJYTUsIE9QMF9MMzJJX04sIC5MbG9hZAkjIEwzMkkuTiwganVtcAorCWFkZGkJYTYsIGE1LCAtT1AwX1MzMklfTgorCV9iZXF6CWE2LCAuTHN0b3JlCQkjIFMzMkkuTiwgZG8gYSBzdG9yZQorI2VuZGlmCisJLyogJ3N0b3JlIGluZGljYXRvciBiaXQnIG5vdCBzZXQsIGp1bXAgKi8KKwlfYmJjaS5sCWE0LCBPUDFfU0lfQklUICsgSU5TTl9PUDEsIC5MbG9hZAorCisJLyogU3RvcmU6IEp1bXAgdG8gdGFibGUgZW50cnkgdG8gZ2V0IHRoZSB2YWx1ZSBpbiB0aGUgc291cmNlIHJlZ2lzdGVyLiovCisKKy5Mc3RvcmU6bW92aQlhNSwgLkxzdG9yZV90YWJsZQkjIHRhYmxlCisJZXh0dWkJYTYsIGE0LCBJTlNOX1QsIDQJIyBnZXQgc291cmNlIHJlZ2lzdGVyCisJYWRkeDgJYTUsIGE2LCBhNQorCWp4CWE1CQkJIyBqdW1wIGludG8gdGFibGUKKworCS8qIEludmFsaWQgaW5zdHJ1Y3Rpb24sIENSSVRJQ0FMISAqLworLkxpbnZhbGlkX2luc3RydWN0aW9uX2xvYWQ6CisJagkuTGludmFsaWRfaW5zdHJ1Y3Rpb24KKworCS8qIExvYWQ6IExvYWQgbWVtb3J5IGFkZHJlc3MuICovCisKKy5MbG9hZDogbW92aQlhMywgfjMKKwlhbmQJYTMsIGEzLCBhOAkJIyBhbGlnbiBtZW1vcnkgYWRkcmVzcworCisJX19zc2E4CWE4CisjaWZkZWYgVU5BTElHTkVEX1VTRVJfRVhDRVBUSU9OCisJYWRkaQlhMywgYTMsIDgKKwlsMzJlCWE1LCBhMywgLTgKKwlsMzJlCWE2LCBhMywgLTQKKyNlbHNlCisJbDMyaQlhNSwgYTMsIDAKKwlsMzJpCWE2LCBhMywgNAorI2VuZGlmCisJX19zcmNfYglhMywgYTUsIGE2CQkjIGEzIGhhcyB0aGUgZGF0YSB3b3JkCisKKyNpZiBYQ0hBTF9IQVZFX05BUlJPVworCWFkZGkJYTcsIGE3LCAyCQkjIGluY3JlbWVudCBQQyAoYXNzdW1lIDE2LWJpdCBpbnNuKQorCisJZXh0dWkJYTUsIGE0LCBJTlNOX09QMCwgNAorCV9iZXFpCWE1LCBPUDBfTDMySV9OLCAxZgkjIGwzMmkubjoganVtcAorCisJYWRkaQlhNywgYTcsIDEKKyNlbHNlCisJYWRkaQlhNywgYTcsIDMKKyNlbmRpZgorCisJZXh0dWkJYTUsIGE0LCBJTlNOX09QMSwgNAorCV9iZXFpCWE1LCBPUDFfTDMySSwgMWYJIyBsMzJpOiBqdW1wCisKKwlleHR1aQlhMywgYTMsIDAsIDE2CQkjIGV4dHJhY3QgbG93ZXIgMTYgYml0cworCV9iZXFpCWE1LCBPUDFfTDE2VUksIDFmCisJYWRkaQlhNSwgYTUsIC1PUDFfTDE2U0kKKwlfYm5leglhNSwgLkxpbnZhbGlkX2luc3RydWN0aW9uX2xvYWQKKworCS8qIHNpZ24gZXh0ZW5kIHZhbHVlICovCisKKwlzbGxpCWEzLCBhMywgMTYKKwlzcmFpCWEzLCBhMywgMTYKKworCS8qIFNldCB0YXJnZXQgcmVnaXN0ZXIuICovCisKKzE6CisKKyNpZiBYQ0hBTF9IQVZFX0xPT1AKKwlyc3IJYTMsIExFTkQJCSMgY2hlY2sgaWYgd2UgcmVhY2hlZCBMRU5ECisJYm5lCWE3LCBhMywgMWYKKwlyc3IJYTMsIExDT1VOVAkJIyBhbmQgTENPVU5UICE9IDAKKwliZXF6CWEzLCAxZgorCWFkZGkJYTMsIGEzLCAtMQkJIyBkZWNyZW1lbnQgTENPVU5UIGFuZCBzZXQKKwlyc3IJYTcsIExCRUcJCSMgc2V0IFBDIHRvIExCRUdJTgorCXdzcglhMywgTENPVU5UCisjZW5kaWYKKworMToJd3NyCWE3LCBFUENfMQkJIyBza2lwIGxvYWQgaW5zdHJ1Y3Rpb24KKwlleHR1aQlhNCwgYTQsIElOU05fVCwgNAkjIGV4dHJhY3QgdGFyZ2V0IHJlZ2lzdGVyCisJbW92aQlhNSwgLkxsb2FkX3RhYmxlCisJYWRkeDgJYTQsIGE0LCBhNQorCWp4CWE0CQkJIyBqdW1wIHRvIGVudHJ5IGZvciB0YXJnZXQgcmVnaXN0ZXIKKworCS5hbGlnbgk4CisuTGxvYWRfdGFibGU6CisJczMyaQlhMywgYTIsIFBUX0FSRUcwOwlfaiAuTGV4aXQ7CS5hbGlnbiA4CisJbW92CWExLCBhMzsJCQlfaiAuTGV4aXQ7CS5hbGlnbiA4ICMgZmlzaHk/PworCXMzMmkJYTMsIGEyLCBQVF9BUkVHMjsJX2ogLkxleGl0OwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHMzsJX2ogLkxleGl0OwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHNDsJX2ogLkxleGl0OwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHNTsJX2ogLkxleGl0OwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHNjsJX2ogLkxleGl0OwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHNzsJX2ogLkxleGl0OwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHODsJX2ogLkxleGl0OwkuYWxpZ24gOAorCW1vdglhOSwgYTMJCTsJX2ogLkxleGl0OwkuYWxpZ24gOAorCW1vdglhMTAsIGEzCQk7CV9qIC5MZXhpdDsJLmFsaWduIDgKKwltb3YJYTExLCBhMwkJOwlfaiAuTGV4aXQ7CS5hbGlnbiA4CisJbW92CWExMiwgYTMJCTsJX2ogLkxleGl0OwkuYWxpZ24gOAorCW1vdglhMTMsIGEzCQk7CV9qIC5MZXhpdDsJLmFsaWduIDgKKwltb3YJYTE0LCBhMwkJOwlfaiAuTGV4aXQ7CS5hbGlnbiA4CisJbW92CWExNSwgYTMJCTsJX2ogLkxleGl0OwkuYWxpZ24gOAorCisuTHN0b3JlX3RhYmxlOgorCWwzMmkJYTMsIGEyLCBQVF9BUkVHMDsJX2ogMWY7CS5hbGlnbiA4CisJbW92CWEzLCBhMTsJCQlfaiAxZjsJLmFsaWduIDgJIyBmaXNoeT8/CisJbDMyaQlhMywgYTIsIFBUX0FSRUcyOwlfaiAxZjsJLmFsaWduIDgKKwlsMzJpCWEzLCBhMiwgUFRfQVJFRzM7CV9qIDFmOwkuYWxpZ24gOAorCWwzMmkJYTMsIGEyLCBQVF9BUkVHNDsJX2ogMWY7CS5hbGlnbiA4CisJbDMyaQlhMywgYTIsIFBUX0FSRUc1OwlfaiAxZjsJLmFsaWduIDgKKwlsMzJpCWEzLCBhMiwgUFRfQVJFRzY7CV9qIDFmOwkuYWxpZ24gOAorCWwzMmkJYTMsIGEyLCBQVF9BUkVHNzsJX2ogMWY7CS5hbGlnbiA4CisJbDMyaQlhMywgYTIsIFBUX0FSRUc4OwlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTMsIGE5CQk7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTEwCQk7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTExCQk7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTEyCQk7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTEzCQk7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTE0CQk7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTE1CQk7CV9qIDFmOwkuYWxpZ24gOAorCisxOiAJIyBhNzogaW5zdHJ1Y3Rpb24gcG9pbnRlciwgYTQ6IGluc3RydWN0aW9uLCBhMzogdmFsdWUKKworCW1vdmkJYTYsIDAJCQkjIG1hc2s6IGZmZmZmZmZmOjAwMDAwMDAwCisKKyNpZiBYQ0hBTF9IQVZFX05BUlJPVworCWFkZGkJYTcsIGE3LCAyCQkjIGluY3IuIFBDLGFzc3VtZSAxNi1iaXQgaW5zdHJ1Y3Rpb24KKworCWV4dHVpCWE1LCBhNCwgSU5TTl9PUDAsIDQJIyBleHRyYWN0IE9QMAorCWFkZGkJYTUsIGE1LCAtT1AwX1MzMklfTgorCV9iZXF6CWE1LCAxZgkJCSMgczMyaS5uOiBqdW1wCisKKwlhZGRpCWE3LCBhNywgMQkJIyBpbmNyZW1lbnQgUEMsIDMyLWJpdCBpbnN0cnVjdGlvbgorI2Vsc2UKKwlhZGRpCWE3LCBhNywgMwkJIyBpbmNyZW1lbnQgUEMsIDMyLWJpdCBpbnN0cnVjdGlvbgorI2VuZGlmCisKKwlleHR1aQlhNSwgYTQsIElOU05fT1AxLCA0CSMgZXh0cmFjdCBPUDEKKwlfYmVxaQlhNSwgT1AxX1MzMkksIDFmCSMganVtcCBpZiAzMiBiaXQgc3RvcmUKKwlfYm5laQlhNSwgT1AxX1MxNkksIC5MaW52YWxpZF9pbnN0cnVjdGlvbl9zdG9yZQorCisJbW92aQlhNSwgLTEKKwlfX2V4dGwJYTMsIGEzCQkJIyBnZXQgMTYtYml0IHZhbHVlCisJX19leHRoCWE2LCBhNQkJCSMgZ2V0IDE2LWJpdCBtYXNrIGZmZmZmZmZmOmZmZmYwMDAwCisKKwkvKiBHZXQgbWVtb3J5IGFkZHJlc3MgKi8KKworMToKKyNpZiBYQ0hBTF9IQVZFX0xPT1AKKwlyc3IJYTMsIExFTkQJCSMgY2hlY2sgaWYgd2UgcmVhY2hlZCBMRU5ECisJYm5lCWE3LCBhMywgMWYKKwlyc3IJYTMsIExDT1VOVAkJIyBhbmQgTENPVU5UICE9IDAKKwliZXF6CWEzLCAxZgorCWFkZGkJYTMsIGEzLCAtMQkJIyBkZWNyZW1lbnQgTENPVU5UIGFuZCBzZXQKKwlyc3IJYTcsIExCRUcJCSMgc2V0IFBDIHRvIExCRUdJTgorCXdzcglhMywgTENPVU5UCisjZW5kaWYKKworMToJd3NyCWE3LCBFUENfMQkJIyBza2lwIHN0b3JlIGluc3RydWN0aW9uCisJbW92aQlhNCwgfjMKKwlhbmQJYTQsIGE0LCBhOAkJIyBhbGlnbiBtZW1vcnkgYWRkcmVzcworCisJLyogSW5zZXJ0IHZhbHVlIGludG8gbWVtb3J5ICovCisKKwltb3ZpCWE1LCAtMQkJCSMgbWFzazogZmZmZmZmZmY6WFhYWDAwMDAKKyNpZmRlZiBVTkFMSUdORURfVVNFUl9FWENFUFRJT04KKwlhZGRpCWE0LCBhNCwgOAorI2VuZGlmCisKKwlfX3NzYThyIGE4CisJX19zcmNfYglhNywgYTUsIGE2CQkjIGxvLW1hc2sgIEYuLkYwLi4wIChCRSkgMC4uMEYuLkYgKExFKQorCV9fc3JjX2IJYTYsIGE2LCBhNQkJIyBoaS1tYXNrICAwLi4wRi4uRiAoQkUpIEYuLkYwLi4wIChMRSkKKyNpZmRlZiBVTkFMSUdORURfVVNFUl9FWENFUFRJT04KKwlsMzJlCWE1LCBhNCwgLTgKKyNlbHNlCisJbDMyaQlhNSwgYTQsIDAJCSMgbG9hZCBsb3dlciBhZGRyZXNzIHdvcmQKKyNlbmRpZgorCWFuZAlhNSwgYTUsIGE3CQkjIG1hc2sKKwlfX3NoCWE3LCBhMyAJCQkjIHNoaWZ0IHZhbHVlCisJb3IJYTUsIGE1LCBhNwkJIyBvciB3aXRoIG9yaWdpbmFsIHZhbHVlCisjaWZkZWYgVU5BTElHTkVEX1VTRVJfRVhDRVBUSU9OCisJczMyZQlhNSwgYTQsIC04CisJbDMyZQlhNywgYTQsIC00CisjZWxzZQorCXMzMmkJYTUsIGE0LCAwCQkjIHN0b3JlCisJbDMyaQlhNywgYTQsIDQJCSMgc2FtZSBmb3IgdXBwZXIgYWRkcmVzcyB3b3JkCisjZW5kaWYKKwlfX3NsCWE1LCBhMworCWFuZAlhNiwgYTcsIGE2CisJb3IJYTYsIGE2LCBhNQorI2lmZGVmIFVOQUxJR05FRF9VU0VSX0VYQ0VQVElPTgorCXMzMmUJYTYsIGE0LCAtNAorI2Vsc2UKKwlzMzJpCWE2LCBhNCwgNAorI2VuZGlmCisKKwkvKiBEb25lLiByZXN0b3JlIHN0YWNrIGFuZCByZXR1cm4gKi8KKworLkxleGl0OgorCW1vdmkJYTQsIDAKKwlyc3IJYTMsIEVYQ1NBVkVfMQorCXMzMmkJYTQsIGEzLCBFWENfVEFCTEVfRklYVVAKKworCS8qIFJlc3RvcmUgd29ya2luZyByZWdpc3RlciAqLworCisJbDMyaQlhNywgYTIsIFBUX0FSRUc3CisJbDMyaQlhNiwgYTIsIFBUX0FSRUc2CisJbDMyaQlhNSwgYTIsIFBUX0FSRUc1CisJbDMyaQlhNCwgYTIsIFBUX0FSRUc0CisJbDMyaQlhMywgYTIsIFBUX0FSRUczCisKKwkvKiByZXN0b3JlIFNBUiBhbmQgcmV0dXJuICovCisKKwl3c3IJYTAsIFNBUgorCWwzMmkJYTAsIGEyLCBQVF9BUkVHMAorCWwzMmkJYTIsIGEyLCBQVF9BUkVHMgorCXJmZQorCisJLyogV2UgY2Fubm90IGhhbmRsZSB0aGlzIGV4Y2VwdGlvbi4gKi8KKworCS5leHRlcm4gX2tlcm5lbF9leGNlcHRpb24KKy5MaW52YWxpZF9pbnN0cnVjdGlvbl9zdG9yZToKKy5MaW52YWxpZF9pbnN0cnVjdGlvbjoKKworCS8qIFJlc3RvcmUgYTQuLi5hOCBhbmQgU0FSLCBzZXQgU1AsIGFuZCBqdW1wIHRvIGRlZmF1bHQgZXhjZXB0aW9uLiAqLworCisJbDMyaQlhOCwgYTIsIFBUX0FSRUc4CisJbDMyaQlhNywgYTIsIFBUX0FSRUc3CisJbDMyaQlhNiwgYTIsIFBUX0FSRUc2CisJbDMyaQlhNSwgYTIsIFBUX0FSRUc1CisJbDMyaQlhNCwgYTIsIFBUX0FSRUc0CisJd3NyCWEwLCBTQVIKKwltb3YJYTEsIGEyCisKKwlyc3IJYTAsIFBTCisgICAgICAgIGJic2kubCAgYTIsIFBTX1VNX1NISUZULCAxZiAgICAgIyBqdW1wIGlmIHVzZXIgbW9kZQorCisJbW92aQlhMCwgX2tlcm5lbF9leGNlcHRpb24KKwlqeAlhMAorCisxOgltb3ZpCWEwLCBfdXNlcl9leGNlcHRpb24KKwlqeAlhMAorCisKKyNlbmRpZiAvKiBYQ0hBTF9VTkFMSUdORURfTE9BRF9FWENFUFRJT04gfHwgWENIQUxfVU5BTElHTkVEX1NUT1JFX0VYQ0VQVElPTiAqLworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9hc20tb2Zmc2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDFkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMCwwICsxLDkzIEBACisvKgorICogYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLmMKKyAqCisgKiBHZW5lcmF0ZXMgZGVmaW5pdGlvbnMgZnJvbSBjLXR5cGUgc3RydWN0dXJlcyB1c2VkIGJ5IGFzc2VtYmx5IHNvdXJjZXMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICovCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIERFRklORShzeW0sIHZhbCkgYXNtIHZvbGF0aWxlKCJcbi0+IiAjc3ltICIgJTAgIiAjdmFsIDogOiAiaSIgKHZhbCkpCisjZGVmaW5lIEJMQU5LKCkgYXNtIHZvbGF0aWxlKCJcbi0+IiA6IDogKQorCitpbnQgbWFpbih2b2lkKQoreworCS8qIHN0cnVjdCBwdF9yZWdzICovCisJREVGSU5FKFBUX1BDLCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIHBjKSk7CisJREVGSU5FKFBUX1BTLCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIHBzKSk7CisJREVGSU5FKFBUX0RFUEMsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgZGVwYykpOworCURFRklORShQVF9FWENDQVVTRSwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBleGNjYXVzZSkpOworCURFRklORShQVF9FWENWQUREUiwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBleGN2YWRkcikpOworCURFRklORShQVF9ERUJVR0NBVVNFLCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIGRlYnVnY2F1c2UpKTsKKwlERUZJTkUoUFRfV01BU0ssIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgd21hc2spKTsKKwlERUZJTkUoUFRfTEJFRywgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBsYmVnKSk7CisJREVGSU5FKFBUX0xFTkQsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgbGVuZCkpOworCURFRklORShQVF9MQ09VTlQsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgbGNvdW50KSk7CisJREVGSU5FKFBUX1NBUiwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBzYXIpKTsKKwlERUZJTkUoUFRfU1lTQ0FMTCwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBzeXNjYWxsKSk7CisJREVGSU5FKFBUX0FSRUcsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgYXJlZ1swXSkpOworCURFRklORShQVF9BUkVHMCwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnWzBdKSk7CisJREVGSU5FKFBUX0FSRUcxLCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIGFyZWdbMV0pKTsKKwlERUZJTkUoUFRfQVJFRzIsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgYXJlZ1syXSkpOworCURFRklORShQVF9BUkVHMywgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnWzNdKSk7CisJREVGSU5FKFBUX0FSRUc0LCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIGFyZWdbNF0pKTsKKwlERUZJTkUoUFRfQVJFRzUsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgYXJlZ1s1XSkpOworCURFRklORShQVF9BUkVHNiwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnWzZdKSk7CisJREVGSU5FKFBUX0FSRUc3LCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIGFyZWdbN10pKTsKKwlERUZJTkUoUFRfQVJFRzgsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgYXJlZ1s4XSkpOworCURFRklORShQVF9BUkVHOSwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnWzldKSk7CisJREVGSU5FKFBUX0FSRUcxMCwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnWzEwXSkpOworCURFRklORShQVF9BUkVHMTEsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgYXJlZ1sxMV0pKTsKKwlERUZJTkUoUFRfQVJFRzEyLCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIGFyZWdbMTJdKSk7CisJREVGSU5FKFBUX0FSRUcxMywgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnWzEzXSkpOworCURFRklORShQVF9BUkVHMTQsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgYXJlZ1sxNF0pKTsKKwlERUZJTkUoUFRfQVJFRzE1LCBvZmZzZXRvZiAoc3RydWN0IHB0X3JlZ3MsIGFyZWdbMTVdKSk7CisJREVGSU5FKFBUX1dJTkRPV0JBU0UsIG9mZnNldG9mIChzdHJ1Y3QgcHRfcmVncywgd2luZG93YmFzZSkpOworCURFRklORShQVF9XSU5ET1dTVEFSVCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIHdpbmRvd3N0YXJ0KSk7CisJREVGSU5FKFBUX1NJWkUsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworCURFRklORShQVF9BUkVHX0VORCwgb2Zmc2V0b2YgKHN0cnVjdCBwdF9yZWdzLCBhcmVnW1hDSEFMX05VTV9BUkVHU10pKTsKKwlERUZJTkUoUFRfVVNFUl9TSVpFLCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYXJlZ1tYQ0hBTF9OVU1fQVJFR1NdKSk7CisJQkxBTksoKTsKKworCS8qIHN0cnVjdCB0YXNrX3N0cnVjdCAqLworCURFRklORShUQVNLX1BUUkFDRSwgb2Zmc2V0b2YgKHN0cnVjdCB0YXNrX3N0cnVjdCwgcHRyYWNlKSk7CisJREVGSU5FKFRBU0tfTU0sIG9mZnNldG9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QsIG1tKSk7CisJREVGSU5FKFRBU0tfQUNUSVZFX01NLCBvZmZzZXRvZiAoc3RydWN0IHRhc2tfc3RydWN0LCBhY3RpdmVfbW0pKTsKKwlERUZJTkUoVEFTS19QSUQsIG9mZnNldG9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QsIHBpZCkpOworCURFRklORShUQVNLX1RIUkVBRCwgb2Zmc2V0b2YgKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkKSk7CisJREVGSU5FKFRBU0tfVEhSRUFEX0lORk8sIG9mZnNldG9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZF9pbmZvKSk7CisJREVGSU5FKFRBU0tfU1RSVUNUX1NJWkUsIHNpemVvZiAoc3RydWN0IHRhc2tfc3RydWN0KSk7CisJQkxBTksoKTsKKworCS8qIHN0cnVjdCB0aHJlYWRfaW5mbyAob2Zmc2V0IGZyb20gc3RhcnRfc3RydWN0KSAqLworCURFRklORShUSFJFQURfUkEsIG9mZnNldG9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5yYSkpOworCURFRklORShUSFJFQURfU1AsIG9mZnNldG9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5zcCkpOworCURFRklORShUSFJFQURfQ1BfU0FWRSwgb2Zmc2V0b2YgKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLmNwX3NhdmUpKTsKKwlERUZJTkUoVEhSRUFEX0NVUlJFTlRfRFMsIG9mZnNldG9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5jdXJyZW50X2RzKSk7CisJQkxBTksoKTsKKworCS8qIHN0cnVjdCBtbV9zdHJ1Y3QgKi8KKwlERUZJTkUoTU1fVVNFUlMsIG9mZnNldG9mKHN0cnVjdCBtbV9zdHJ1Y3QsIG1tX3VzZXJzKSk7CisJREVGSU5FKE1NX1BHRCwgb2Zmc2V0b2YgKHN0cnVjdCBtbV9zdHJ1Y3QsIHBnZCkpOworCURFRklORShNTV9DT05URVhULCBvZmZzZXRvZiAoc3RydWN0IG1tX3N0cnVjdCwgY29udGV4dCkpOworCUJMQU5LKCk7CisJREVGSU5FKFBUX1NJTkdMRVNURVBfQklULCBQVF9TSU5HTEVTVEVQX0JJVCk7CisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2NvcHJvY2Vzc29yLlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvY29wcm9jZXNzb3IuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTYxOTJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2NvcHJvY2Vzc29yLlMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvY29wcm9jZXNzb3IuUworICoKKyAqIFh0ZW5zYSBwcm9jZXNzb3IgY29uZmlndXJhdGlvbi1zcGVjaWZpYyB0YWJsZSBvZiBjb3Byb2Nlc3NvciBhbmQKKyAqIG90aGVyIGN1c3RvbSByZWdpc3RlciBsYXlvdXQgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIE1hcmMgR2F1dGhpZXIgPG1hcmNAdGVuc2lsaWNhLmNvbT4gPG1hcmNAYWx1bW5pLnV3YXRlcmxvby5jYT4KKyAqLworCisvKgorICogVGhpcyBtb2R1bGUgY29udGFpbnMgYSB0YWJsZSB0aGF0IGRlc2NyaWJlcyB0aGUgbGF5b3V0IG9mIHRoZSB2YXJpb3VzCisgKiBjdXN0b20gcmVnaXN0ZXJzIGFuZCBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29wcm9jZXNzb3IsIGFzIHdlbGwKKyAqIGFzIHRob3NlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IGNvcHJvY2Vzc29yICgiZXh0cmEgc3RhdGUiKS4KKyAqIFRoaXMgdGFibGUgaXMgaW5jbHVkZWQgd2l0aCBjb3JlIGR1bXBzIGFuZCBpcyBhdmFpbGFibGUgdmlhIHRoZSBwdHJhY2UKKyAqIGludGVyZmFjZSwgYWxsb3dpbmcgdGhlIGxheW91dCBvZiBzdWNoIHJlZ2lzdGVyL3N0YXRlIGluZm9ybWF0aW9uIHRvCisgKiBiZSBtb2RpZmllZCBpbiB0aGUga2VybmVsIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBkZWJ1Z2dlci4gIEVhY2gKKyAqIHJlZ2lzdGVyIG9yIHN0YXRlIGlzIGlkZW50aWZpZWQgdXNpbmcgYSAzMi1iaXQgImxpYmRiIHRhcmdldCBudW1iZXIiCisgKiBhc3NpZ25lZCB3aGVuIHRoZSBYdGVuc2EgcHJvY2Vzc29yIGlzIGdlbmVyYXRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmIFhDSEFMX0hBVkVfQ1AKKworI2RlZmluZSBDUF9MQVNUICgoWENIQUxfQ1BfTUFYIC0gMSkgKiBDT1BST0NFU1NPUl9JTkZPX1NJWkUpCisKK0VOVFJZKHJlbGVhc2VfY29wcm9jZXNzb3JzKQorCisJZW50cnkJYTEsIDE2CisJCQkJCQkjIGEyOiB0YXNrCisJbW92aQlhMywgMSA8PCBYQ0hBTF9DUF9NQVggCQkjIGEzOiBjb3Byb2Nlc3Nvci1iaXQKKwltb3ZpCWE0LCBjb3Byb2Nlc3Nvcl9pbmZvK0NQX0xBU1QJIyBhNDogb3duZXItdGFibGUKKwkJCQkJCSMgYTU6IHRtcAorCW1vdmkJYTYsIDAJCQkJIyBhNjogMAorCXJzaWwJYTcsIExPQ0tMRVZFTAkJCSMgYTc6IFBTCisKKzE6CS8qIENoZWNrIGlmIHRhc2sgaXMgY29wcm9jZXNzb3Igb3duZXIgb2YgY29wcm9jZXNzb3JbaV0uICovCisKKwlsMzJpCWE1LCBhNCwgQ09QUk9DRVNTT1JfSU5GT19PV05FUgorCXNybGkJYTMsIGEzLCAxCisJYmVxeglhMywgMWYKKwlhZGRpCWE0LCBhNCwgLTgKKwliZXEJYTIsIGE1LCAxYgorCisJLyogRm91bmQgYW4gZW50cnk6IENsZWFyIGVudHJ5IENQRU5BQkxFIGJpdCB0byBkaXNhYmxlIENQLiAqLworCisJcnNyCWE1LCBDUEVOQUJMRQorCXMzMmkJYTYsIGE0LCBDT1BST0NFU1NPUl9JTkZPX09XTkVSCisJeG9yCWE1LCBhMywgYTUKKwl3c3IJYTUsIENQRU5BQkxFCisKKwlibmV6CWEzLCAxYgorCisxOgl3c3IJYTcsIFBTCisJcnN5bmMKKwlyZXR3CisKKworRU5UUlkoZGlzYWJsZV9jb3Byb2Nlc3NvcikKKwllbnRyeQlzcCwgMTYKKwlyc2lsCWE3LCBMT0NLTEVWRUwKKwlyc3IJYTMsIENQRU5BQkxFCisJbW92aQlhNCwgMQorCXNzbAlhMgorCXNsbAlhNCwgYTQKKwlhbmQJYTQsIGEzLCBhNAorCXhvcglhMywgYTMsIGE0CisJd3NyCWEzLCBDUEVOQUJMRQorCXdzcglhNywgUFMKKwlyc3luYworCXJldHcKKworRU5UUlkoZW5hYmxlX2NvcHJvY2Vzc29yKQorCWVudHJ5CXNwLCAxNgorCXJzaWwJYTcsIExPQ0tMRVZFTAorCXJzcglhMywgQ1BFTkFCTEUKKwltb3ZpCWE0LCAxCisJc3NsCWEyCisJc2xsCWE0LCBhNAorCW9yCWEzLCBhMywgYTQKKwl3c3IJYTMsIENQRU5BQkxFCisJd3NyCWE3LCBQUworCXJzeW5jCisJcmV0dworCisjZW5kaWYKKworRU5UUlkoc2F2ZV9jb3Byb2Nlc3Nvcl9leHRyYSkKKwllbnRyeQlzcCwgMTYKKwl4Y2hhbF9leHRyYV9zdG9yZV9mdW5jYm9keQorCXJldHcKKworRU5UUlkocmVzdG9yZV9jb3Byb2Nlc3Nvcl9leHRyYSkKKwllbnRyeQlzcCwgMTYKKwl4Y2hhbF9leHRyYV9sb2FkX2Z1bmNib2R5CisJcmV0dworCitFTlRSWShzYXZlX2NvcHJvY2Vzc29yX3JlZ2lzdGVycykKKwllbnRyeQlzcCwgMTYKKwl4Y2hhbF9jcGlfc3RvcmVfZnVuY2JvZHkKKwlyZXR3CisKK0VOVFJZKHJlc3RvcmVfY29wcm9jZXNzb3JfcmVnaXN0ZXJzKQorCWVudHJ5CXNwLCAxNgorCXhjaGFsX2NwaV9sb2FkX2Z1bmNib2R5CisJcmV0dworCisKKy8qCisgKiAgVGhlIFh0ZW5zYSBjb21waWxlLXRpbWUgSEFMIChjb3JlLmgpIFhDSEFMXypfU0FfQ09OVEVOVFNfTElCREIgbWFjcm9zCisgKiAgZGVzY3JpYmUgdGhlIGNvbnRlbnRzIG9mIGNvcHJvY2Vzc29yICYgZXh0cmEgc2F2ZSBhcmVhcyBpbiB0ZXJtcyBvZgorICogIHVuZGVmaW5lZCBDT05URU5UU19MSUJEQl97U1JFRyxVUkVHLFJFR0Z9IG1hY3Jvcy4gIFdlIGRlZmluZSB0aGVzZQorICogIGxhdHRlciBtYWNyb3MgaGVyZTsgdGhleSBleHBhbmQgaW50byBhIHRhYmxlIG9mIHRoZSBmb3JtYXQgd2Ugd2FudC4KKyAqICBUaGUgZ2VuZXJhbCBmb3JtYXQgaXM6CisgKgorICoJQ09OVEVOVFNfTElCREJfU1JFRyhsaWJkYm51bSwgb2Zmc2V0LCBzaXplLCBhbGlnbiwgcnN2MSwgbmFtZSwgc3JlZ251bSwKKyAqCQkJICAgIGJpdG1hc2ssIHJzdjIsIHJzdjMpCisgKglDT05URU5UU19MSUJEQl9VUkVHKGxpYmRibnVtLCBvZmZzZXQsIHNpemUsIGFsaWduLCByc3YxLCBuYW1lLCB1cmVnbnVtLAorICoJCQkgICAgYml0bWFzaywgcnN2MiwgcnN2MykKKyAqCUNPTlRFTlRTX0xJQkRCX1JFR0YobGliZGJudW0sIG9mZnNldCwgc2l6ZSwgYWxpZ24sIHJzdjEsIG5hbWUsIGluZGV4LAorICoJCQkgICAgbnVtZW50cmllcywgY29udGVudHNpemUsIHJlZ25hbWVfYmFzZSwKKyAqCQkJICAgIHJlZ2ZpbGVfbmFtZSwgcnN2MiwgcnN2MykKKyAqCisgKiAgRm9yIHRoaXMgdGFibGUsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgPGxpYmRibnVtPiwgPG9mZnNldD4gYW5kIDxzaXplPgorICogIGZpZWxkcy4KKyAqLworCisvKiAgTWFwIGFsbCBYQ0hBTCBDT05URU5UUyBtYWNyb3MgdG8gdGhlIHJlZ19lbnRyeSBhc20gbWFjcm8gZGVmaW5lZCBiZWxvdzogICovCisKKyNkZWZpbmUgQ09OVEVOVFNfTElCREJfU1JFRyhsaWJkYm51bSxvZmZzZXQsc2l6ZSxhbGlnbixyc3YxLG5hbWUsc3JlZ251bSwgICAgIFwKKwkJCSAgICBiaXRtYXNrLCByc3YyLCByc3YzKQkJCSAgICAgIFwKKwkJcmVnX2VudHJ5IGxpYmRibnVtLCBvZmZzZXQsIHNpemUgOworI2RlZmluZSBDT05URU5UU19MSUJEQl9VUkVHKGxpYmRibnVtLG9mZnNldCxzaXplLGFsaWduLHJzdjEsbmFtZSx1cmVnbnVtLCAgICAgXAorCQkJICAgIGJpdG1hc2ssIHJzdjIsIHJzdjMpCQkJICAgICAgXAorCQlyZWdfZW50cnkgbGliZGJudW0sIG9mZnNldCwgc2l6ZSA7CisjZGVmaW5lIENPTlRFTlRTX0xJQkRCX1JFR0YobGliZGJudW0sIG9mZnNldCwgc2l6ZSwgYWxpZ24sIHJzdjEsIG5hbWUsIGluZGV4LCBcCisJCQkgICAgbnVtZW50cmllcywgY29udGVudHNpemUsIHJlZ25hbWVfYmFzZSwJICAgICAgXAorCQkJICAgIHJlZ2ZpbGVfbmFtZSwgcnN2MiwgcnN2MykJCQkgICAgICBcCisJCXJlZ19lbnRyeSBsaWJkYm51bSwgb2Zmc2V0LCBzaXplIDsKKworLyogQSBzaW5nbGUgdGFibGUgZW50cnk6ICovCisJLm1hY3JvCXJlZ19lbnRyeQlsaWJkYm51bSwgb2Zmc2V0LCBzaXplCisJIC5pZm5lCShfX2xhc3Rfb2Zmc2V0LShfX2xhc3RfZ3JvdXBfb2Zmc2V0K1xvZmZzZXQpKQorCSAgLyogcGFkZGluZyBlbnRyeSAqLworCSAgLndvcmQJKDB4RkMwMDAwMDArX19sYXN0X29mZnNldC0oX19sYXN0X2dyb3VwX29mZnNldCtcb2Zmc2V0KSkKKwkgLmVuZGlmCisJIC53b3JkCVxsaWJkYm51bQkJCQkvKiBhY3R1YWwgZW50cnkgKi8KKwkgLnNldAlfX2xhc3Rfb2Zmc2V0LCBfX2xhc3RfZ3JvdXBfb2Zmc2V0K1xvZmZzZXQrXHNpemUKKwkuZW5kbQkvKiByZWdfZW50cnkgKi8KKworCisvKiBUYWJsZSBlbnRyeSB0aGF0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgYSBncm91cCAoY29wcm9jZXNzb3Igb3IgImV4dHJhIik6ICovCisJLm1hY3JvCXJlZ19ncm91cAljcG51bSwgbnVtX2VudHJpZXMsIGFsaWduCisJIC5zZXQJX19sYXN0X2dyb3VwX29mZnNldCwgKF9fbGFzdF9vZmZzZXQgKyBcYWxpZ24tIDEpICYgLVxhbGlnbgorCSAuaWZuZQlcbnVtX2VudHJpZXMKKwkgIC53b3JkCTB4RkQwMDAwMDArKFxjcG51bTw8MTYpK1xudW1fZW50cmllcworCSAuZW5kaWYKKwkuZW5kbQkvKiByZWdfZ3JvdXAgKi8KKworLyoKKyAqIFJlZ2lzdGVyIGluZm8gdGFibGVzLgorICovCisKKwkuc2VjdGlvbiAucm9kYXRhLCAiYSIKKwkuZ2xvYmwJX3h0ZW5zYV9yZWdpbmZvX3RhYmxlcworCS5nbG9ibAlfeHRlbnNhX3JlZ2luZm9fdGFibGVfc2l6ZQorCS5hbGlnbgk0CitfeHRlbnNhX3JlZ2luZm9fdGFibGVfc2l6ZToKKwkud29yZAlfeHRlbnNhX3JlZ2luZm9fdGFibGVfZW5kIC0gX3h0ZW5zYV9yZWdpbmZvX3RhYmxlcworCitfeHRlbnNhX3JlZ2luZm9fdGFibGVzOgorCS5zZXQJX19sYXN0X29mZnNldCwgMAorCXJlZ19ncm91cCAweEZGLCBYQ0hBTF9FWFRSQV9TQV9DT05URU5UU19MSUJEQl9OVU0sIFhDSEFMX0VYVFJBX1NBX0FMSUdOCisJWENIQUxfRVhUUkFfU0FfQ09OVEVOVFNfTElCREIKKwlyZWdfZ3JvdXAgMCwgWENIQUxfQ1AwX1NBX0NPTlRFTlRTX0xJQkRCX05VTSwgWENIQUxfQ1AwX1NBX0FMSUdOCisJWENIQUxfQ1AwX1NBX0NPTlRFTlRTX0xJQkRCCisJcmVnX2dyb3VwIDEsIFhDSEFMX0NQMV9TQV9DT05URU5UU19MSUJEQl9OVU0sIFhDSEFMX0NQMV9TQV9BTElHTgorCVhDSEFMX0NQMV9TQV9DT05URU5UU19MSUJEQgorCXJlZ19ncm91cCAyLCBYQ0hBTF9DUDJfU0FfQ09OVEVOVFNfTElCREJfTlVNLCBYQ0hBTF9DUDJfU0FfQUxJR04KKwlYQ0hBTF9DUDJfU0FfQ09OVEVOVFNfTElCREIKKwlyZWdfZ3JvdXAgMywgWENIQUxfQ1AzX1NBX0NPTlRFTlRTX0xJQkRCX05VTSwgWENIQUxfQ1AzX1NBX0FMSUdOCisJWENIQUxfQ1AzX1NBX0NPTlRFTlRTX0xJQkRCCisJcmVnX2dyb3VwIDQsIFhDSEFMX0NQNF9TQV9DT05URU5UU19MSUJEQl9OVU0sIFhDSEFMX0NQNF9TQV9BTElHTgorCVhDSEFMX0NQNF9TQV9DT05URU5UU19MSUJEQgorCXJlZ19ncm91cCA1LCBYQ0hBTF9DUDVfU0FfQ09OVEVOVFNfTElCREJfTlVNLCBYQ0hBTF9DUDVfU0FfQUxJR04KKwlYQ0hBTF9DUDVfU0FfQ09OVEVOVFNfTElCREIKKwlyZWdfZ3JvdXAgNiwgWENIQUxfQ1A2X1NBX0NPTlRFTlRTX0xJQkRCX05VTSwgWENIQUxfQ1A2X1NBX0FMSUdOCisJWENIQUxfQ1A2X1NBX0NPTlRFTlRTX0xJQkRCCisJcmVnX2dyb3VwIDcsIFhDSEFMX0NQN19TQV9DT05URU5UU19MSUJEQl9OVU0sIFhDSEFMX0NQN19TQV9BTElHTgorCVhDSEFMX0NQN19TQV9DT05URU5UU19MSUJEQgorCS53b3JkCTB4RkMwMDAwMDAJLyogaW52YWxpZCByZWdpc3RlciBudW1iZXIsbWFya3MgZW5kIG9mIHRhYmxlKi8KK194dGVuc2FfcmVnaW5mb190YWJsZV9lbmQ6CisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0YTAxZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCkBAIC0wLDAgKzEsMTk5NiBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TCisgKgorICogTG93LWxldmVsIGV4Y2VwdGlvbiBoYW5kbGluZworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IGJ5IFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKworLyogVW5pbXBsZW1lbnRlZCBmZWF0dXJlcy4gKi8KKworI3VuZGVmIFNJR05BTF9IQU5ETElOR19JTl9ET1VCTEVfRVhDRVBUSU9OCisjdW5kZWYgS0VSTkVMX1NUQUNLX09WRVJGTE9XX0NIRUNLCisjdW5kZWYgUFJFRU1QVElCTEVfS0VSTkVMCisjdW5kZWYgQUxMT0NBX0VYQ0VQVElPTl9JTl9JUkFNCisKKy8qIE5vdCB3ZWxsIHRlc3RlZC4KKyAqCisgKiAtIGZhc3RfY29wcm9jZXNzb3IKKyAqLworCisvKgorICogTWFjcm8gdG8gZmluZCBmaXJzdCBiaXQgc2V0IGluIFdJTkRPV0JBU0UgZnJvbSB0aGUgbGVmdCArIDEKKyAqCisgKiAxMDAuLi4uMCAtPiAxCisgKiAwMTAuLi4uMCAtPiAyCisgKiAwMDAuLi4uMSAtPiBXU0JJVFMKKyAqLworCisJLm1hY3JvIGZmc193cyBiaXQgbWFzaworCisjaWYgWENIQUxfSEFWRV9OU0EKKwluc2F1ICAgIFxiaXQsIFxtYXNrCQkJIyAzMi1XU0JJVFMgLi4uIDMxICgzMiBpZmYgMCkKKwlhZGRpICAgIFxiaXQsIFxiaXQsIFdTQklUUyAtIDMyICsgMSAgIAkjIHVwcGVzdCBiaXQgc2V0IC0+IHJldHVybiAxCisjZWxzZQorCW1vdmkgICAgXGJpdCwgV1NCSVRTCisjaWYgV1NCSVRTID4gMTYKKwlfYmx0dWkgIFxtYXNrLCAweDEwMDAwLCA5OWYKKwlhZGRpICAgIFxiaXQsIFxiaXQsIC0xNgorCWV4dHVpICAgXG1hc2ssIFxtYXNrLCAxNiwgMTYKKyNlbmRpZgorI2lmIFdTQklUUyA+IDgKKzk5OglfYmx0dWkgIFxtYXNrLCAweDEwMCwgOTlmCisJYWRkaSAgICBcYml0LCBcYml0LCAtOAorCXNybGkgICAgXG1hc2ssIFxtYXNrLCA4CisjZW5kaWYKKzk5OglfYmx0dWkgIFxtYXNrLCAweDEwLCA5OWYKKwlhZGRpICAgIFxiaXQsIFxiaXQsIC00CisJc3JsaSAgICBcbWFzaywgXG1hc2ssIDQKKzk5OglfYmx0dWkgIFxtYXNrLCAweDQsIDk5ZgorCWFkZGkgICAgXGJpdCwgXGJpdCwgLTIKKwlzcmxpICAgIFxtYXNrLCBcbWFzaywgMgorOTk6CV9ibHR1aSAgXG1hc2ssIDB4MiwgOTlmCisJYWRkaSAgICBcYml0LCBcYml0LCAtMQorOTk6CisKKyNlbmRpZgorCS5lbmRtCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tIERFRkFVTFQgRklSU1QgTEVWRUwgRVhDRVBUSU9OIEhBTkRMRVJTIC0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBGaXJzdC1sZXZlbCBleGNlcHRpb24gaGFuZGxlciBmb3IgdXNlciBleGNlcHRpb25zLgorICogU2F2ZSBzb21lIHNwZWNpYWwgcmVnaXN0ZXJzLCBleHRyYSBzdGF0ZXMgYW5kIGFsbCByZWdpc3RlcnMgaW4gdGhlIEFSCisgKiByZWdpc3RlciBmaWxlIHRoYXQgd2VyZSBpbiB1c2UgaW4gdGhlIHVzZXIgdGFzaywgYW5kIGp1bXAgdG8gdGhlIGNvbW1vbgorICogZXhjZXB0aW9uIGNvZGUuCisgKiBXZSBzYXZlIFNBUiAodXNlZCB0byBjYWxjdWxhdGUgV01BU0spLCBhbmQgV0IgYW5kIFdTICh3ZSBkb24ndCBoYXZlIHRvCisgKiBzYXZlIHRoZW0gZm9yIGtlcm5lbCBleGNlcHRpb25zKS4KKyAqCisgKiBFbnRyeSBjb25kaXRpb24gZm9yIHVzZXJfZXhjZXB0aW9uOgorICoKKyAqICAgYTA6CXRyYXNoZWQsIG9yaWdpbmFsIHZhbHVlIHNhdmVkIG9uIHN0YWNrIChQVF9BUkVHMCkKKyAqICAgYTE6CWExCisgKiAgIGEyOgluZXcgc3RhY2sgcG9pbnRlciwgb3JpZ2luYWwgdmFsdWUgaW4gZGVwYworICogICBhMzoJZGlzcGF0Y2ggdGFibGUKKyAqICAgZGVwYzoJYTIsIG9yaWdpbmFsIHZhbHVlIHNhdmVkIG9uIHN0YWNrIChQVF9ERVBDKQorICogICBleGNzYXZlMToJYTMKKyAqCisgKiAgIFBUX0RFUEMgPj0gVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTOiBkb3VibGUgZXhjZXB0aW9uLCBERVBDCisgKgkgICAgIDwgIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogcmVndWxhciBleGNlcHRpb24KKyAqCisgKiBFbnRyeSBjb25kaXRpb24gZm9yIF91c2VyX2V4Y2VwdGlvbjoKKyAqCisgKiAgIGEwLWEzIGFuZCBkZXBjIGhhdmUgYmVlbiBzYXZlZCB0byBQVF9BUkVHMC4uLlBUX0FSRUczIGFuZCBQVF9ERVBDCisgKiAgIGV4Y3NhdmUgaGFzIGJlZW4gcmVzdG9yZWQsIGFuZAorICogICBzdGFjayBwb2ludGVyIChhMSkgaGFzIGJlZW4gc2V0LgorICoKKyAqIE5vdGU6IF91c2VyX2V4Y2VwdGlvbiBtaWdodCBiZSBhdCBhbiBvZGQgYWRyZXNzLiBEb24ndCB1c2UgY2FsbDAuLmNhbGwxMgorICovCisKK0VOVFJZKHVzZXJfZXhjZXB0aW9uKQorCisJLyogU2F2ZSBhMiwgYTMsIGFuZCBkZXBjLCByZXN0b3JlIGV4Y3NhdmVfMSBhbmQgc2V0IFNQLiAqLworCisJeHNyCWEzLCBFWENTQVZFXzEKKwlyc3IJYTAsIERFUEMKKwlzMzJpCWExLCBhMiwgUFRfQVJFRzEKKwlzMzJpCWEwLCBhMiwgUFRfQVJFRzIKKwlzMzJpCWEzLCBhMiwgUFRfQVJFRzMKKwltb3YJYTEsIGEyCisKKwkuZ2xvYmwgX3VzZXJfZXhjZXB0aW9uCitfdXNlcl9leGNlcHRpb246CisKKwkvKiBTYXZlIFNBUiBhbmQgdHVybiBvZmYgc2luZ2xlIHN0ZXBwaW5nICovCisKKwltb3ZpCWEyLCAwCisJcnNyCWEzLCBTQVIKKwl3c3IJYTIsIElDT1VOVExFVkVMCisJczMyaQlhMywgYTEsIFBUX1NBUgorCisJLyogUm90YXRlIHdzIHNvIHRoYXQgdGhlIGN1cnJlbnQgd2luZG93YmFzZSBpcyBhdCBiaXQwLiAqLworCS8qIEFzc3VtZSB3cyA9IHh4d3d3MXl5eXkuIFJvdGF0ZSB3cyByaWdodCwgc28gdGhhdCBhMiA9IHl5eXl4eHd3dzEgKi8KKworCXJzcglhMiwgV0lORE9XQkFTRQorCXJzcglhMywgV0lORE9XU1RBUlQKKwlzc3IJYTIKKwlzMzJpCWEyLCBhMSwgUFRfV0lORE9XQkFTRQorCXMzMmkJYTMsIGExLCBQVF9XSU5ET1dTVEFSVAorCXNsbGkJYTIsIGEzLCAzMi1XU0JJVFMKKwlzcmMJYTIsIGEzLCBhMgorCXNybGkJYTIsIGEyLCAzMi1XU0JJVFMKKwlzMzJpCWEyLCBhMSwgUFRfV01BU0sJIyBuZWVkZWQgZm9yIHJlc3RvcmluZyByZWdpc3RlcnMKKworCS8qIFNhdmUgb25seSBsaXZlIHJlZ2lzdGVycy4gKi8KKworCV9iYnNpLmwJYTIsIDEsIDFmCisJczMyaQlhNCwgYTEsIFBUX0FSRUc0CisJczMyaQlhNSwgYTEsIFBUX0FSRUc1CisJczMyaQlhNiwgYTEsIFBUX0FSRUc2CisJczMyaQlhNywgYTEsIFBUX0FSRUc3CisJX2Jic2kubAlhMiwgMiwgMWYKKwlzMzJpCWE4LCBhMSwgUFRfQVJFRzgKKwlzMzJpCWE5LCBhMSwgUFRfQVJFRzkKKwlzMzJpCWExMCwgYTEsIFBUX0FSRUcxMAorCXMzMmkJYTExLCBhMSwgUFRfQVJFRzExCisJX2Jic2kubAlhMiwgMywgMWYKKwlzMzJpCWExMiwgYTEsIFBUX0FSRUcxMgorCXMzMmkJYTEzLCBhMSwgUFRfQVJFRzEzCisJczMyaQlhMTQsIGExLCBQVF9BUkVHMTQKKwlzMzJpCWExNSwgYTEsIFBUX0FSRUcxNQorCV9ibmVpCWEyLCAxLCAxZgkJIyBvbmx5IG9uZSB2YWxpZCBmcmFtZT8KKworCS8qIE9ubHkgb25lIHZhbGlkIGZyYW1lLCBza2lwIHNhdmluZyByZWdzLiAqLworCisJagkyZgorCisJLyogU2F2ZSB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycy4KKwkgKiBXZSBoYXZlIHRvIHNhdmUgYWxsIHJlZ2lzdGVycyB1cCB0byB0aGUgZmlyc3QgJzEnIGZyb20KKwkgKiB0aGUgcmlnaHQsIGV4Y2VwdCB0aGUgY3VycmVudCBmcmFtZSAoYml0IDApLgorCSAqIEFzc3VtZSBhMiBpczogIDAwMTAwMTAwMDExMDAwMQorCSAqIEFsbCByZWdpc2VyIGZyYW1lcyBzdGFydGluZyBmcm9tIHRoZSB0b3AgZmllbCB0byB0aGUgbWFya2VkICcxJworCSAqIG11c3QgYmUgc2F2ZWQuCisJICovCisKKzE6CWFkZGkJYTMsIGEyLCAtMQkJIyBlbGltaW5hdGUgJzEnIGluIGJpdCAwOiB5eXl5eHh3dzAKKwluZWcJYTMsIGEzCQkJIyB5eXl5eHh3dzAgLT4gWVlZWVhYV1cxKzEKKwlhbmQJYTMsIGEzLCBhMgkJIyBtYXguIG9ubHkgb25lIGJpdCBpcyBzZXQKKworCS8qIEZpbmQgbnVtYmVyIG9mIGZyYW1lcyB0byBzYXZlICovCisKKwlmZnNfd3MJYTAsIGEzCQkJIyBudW1iZXIgb2YgZnJhbWVzIHRvIHRoZSAnMScgZnJvbSBsZWZ0CisKKwkvKiBTdG9yZSBpbmZvcm1hdGlvbiBpbnRvIFdNQVNLOgorCSAqIGJpdHMgMC4uMzogeHh4MSBtYXNrZWQgbG93ZXIgNCBiaXRzIG9mIHRoZSByb3RhdGVkIHdpbmRvd3N0YXJ0LAorCSAqIGJpdHMgNC4uLjogbnVtYmVyIG9mIHZhbGlkIDQtcmVnaXN0ZXIgZnJhbWVzCisJICovCisKKwlzbGxpCWEzLCBhMCwgNAkJIyBudW1iZXIgb2YgZnJhbWVzIHRvIHNhdmUgaW4gYml0cyA4Li40CisJZXh0dWkJYTIsIGEyLCAwLCA0CQkjIG1hc2sgZm9yIHRoZSBmaXJzdCAxNiByZWdpc3RlcnMKKwlvcglhMiwgYTMsIGEyCisJczMyaQlhMiwgYTEsIFBUX1dNQVNLCSMgbmVlZGVkIHdoZW4gd2UgcmVzdG9yZSB0aGUgcmVnLWZpbGUKKworCS8qIFNhdmUgNCByZWdpc3RlcnMgYXQgYSB0aW1lICovCisKKzE6CXJvdHcJLTEKKwlzMzJpCWEwLCBhNSwgUFRfQVJFR19FTkQgLSAxNgorCXMzMmkJYTEsIGE1LCBQVF9BUkVHX0VORCAtIDEyCisJczMyaQlhMiwgYTUsIFBUX0FSRUdfRU5EIC0gOAorCXMzMmkJYTMsIGE1LCBQVF9BUkVHX0VORCAtIDQKKwlhZGRpCWEwLCBhNCwgLTEKKwlhZGRpCWExLCBhNSwgLTE2CisJX2JuZXoJYTAsIDFiCisKKwkvKiBXSU5ET1dCQVNFIHN0aWxsIGluIFNBUiEgKi8KKworCXJzcglhMiwgU0FSCQkJIyBvcmlnaW5hbCBXSU5ET1dCQVNFCisJbW92aQlhMywgMQorCXNzbAlhMgorCXNsbAlhMywgYTMKKwl3c3IJYTMsIFdJTkRPV1NUQVJUCQkjIHNldCBjb3JyZXNwb25kaW5nIFdJTkRPV1NUQVJUIGJpdAorCXdzcglhMiwgV0lORE9XQkFTRQkJIyBhbmQgV0lORE9XU1RBUlQKKwlyc3luYworCisJLyogV2UgYXJlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHN0YWNrIHBvaW50ZXIgKGExKSAqLworCisyOgorI2lmIFhDSEFMX0VYVFJBX1NBX1NJWkUKKworCS8qIEZvciB1c2VyIGV4Y2VwdGlvbnMsIHNhdmUgdGhlIGV4dHJhIHN0YXRlIGludG8gdGhlIHVzZXIncyBUQ0IuCisJICogTm90ZTogV2UgbXVzdCBhc3N1bWUgdGhhdCB4Y2hhbF9leHRyYV9zdG9yZV9mdW5jYm9keSBkZXN0cm95cyBhMi4uYTE1CisJICovCisKKwlHRVRfQ1VSUkVOVChhMixhMSkKKwlhZGRpCWEyLCBhMiwgVEhSRUFEX0NQX1NBVkUKKwl4Y2hhbF9leHRyYV9zdG9yZV9mdW5jYm9keQorI2VuZGlmCisKKwkvKiBOb3csIGp1bXAgdG8gdGhlIGNvbW1vbiBleGNlcHRpb24gaGFuZGxlci4gKi8KKworCWoJY29tbW9uX2V4Y2VwdGlvbgorCisKKy8qCisgKiBGaXJzdC1sZXZlbCBleGl0IGhhbmRsZXIgZm9yIGtlcm5lbCBleGNlcHRpb25zCisgKiBTYXZlIHNwZWNpYWwgcmVnaXN0ZXJzIGFuZCB0aGUgbGl2ZSB3aW5kb3cgZnJhbWUuCisgKiBOb3RlOiBFdmVuIHRob3VnaCB3ZSBjaGFuZ2VzIHRoZSBzdGFjayBwb2ludGVyLCB3ZSBkb24ndCBoYXZlIHRvIGRvIGEKKyAqCSBNT1ZTUCBoZXJlLCBhcyB3ZSBkbyB0aGF0IHdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIGV4Y2VwdGlvbi4KKyAqCSAoU2VlIGNvbW1lbnQgaW4gdGhlIGtlcm5lbCBleGNlcHRpb24gZXhpdCBjb2RlKQorICoKKyAqIEVudHJ5IGNvbmRpdGlvbiBmb3Iga2VybmVsX2V4Y2VwdGlvbjoKKyAqCisgKiAgIGEwOgl0cmFzaGVkLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfQVJFRzApCisgKiAgIGExOglhMQorICogICBhMjoJbmV3IHN0YWNrIHBvaW50ZXIsIG9yaWdpbmFsIGluIERFUEMKKyAqICAgYTM6CWRpc3BhdGNoIHRhYmxlCisgKiAgIGRlcGM6CWEyLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfREVQQykKKyAqICAgZXhjc2F2ZV8xOglhMworICoKKyAqICAgUFRfREVQQyA+PSBWQUxJRF9ET1VCTEVfRVhDRVBUSU9OX0FERFJFU1M6IGRvdWJsZSBleGNlcHRpb24sIERFUEMKKyAqCSAgICAgPCAgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTOiByZWd1bGFyIGV4Y2VwdGlvbgorICoKKyAqIEVudHJ5IGNvbmRpdGlvbiBmb3IgX2tlcm5lbF9leGNlcHRpb246CisgKgorICogICBhMC1hMyBhbmQgZGVwYyBoYXZlIGJlZW4gc2F2ZWQgdG8gUFRfQVJFRzAuLi5QVF9BUkVHMyBhbmQgUFRfREVQQworICogICBleGNzYXZlIGhhcyBiZWVuIHJlc3RvcmVkLCBhbmQKKyAqICAgc3RhY2sgcG9pbnRlciAoYTEpIGhhcyBiZWVuIHNldC4KKyAqCisgKiBOb3RlOiBfa2VybmVsX2V4Y2VwdGlvbiBtaWdodCBiZSBhdCBhbiBvZGQgYWRyZXNzLiBEb24ndCB1c2UgY2FsbDAuLmNhbGwxMgorICovCisKK0VOVFJZKGtlcm5lbF9leGNlcHRpb24pCisKKwkvKiBTYXZlIGEwLCBhMiwgYTMsIERFUEMgYW5kIHNldCBTUC4gKi8KKworCXhzcglhMywgRVhDU0FWRV8xCQkjIHJlc3RvcmUgYTMsIGV4Y3NhdmVfMQorCXJzcglhMCwgREVQQwkJIyBnZXQgYTIKKwlzMzJpCWExLCBhMiwgUFRfQVJFRzEKKwlzMzJpCWEwLCBhMiwgUFRfQVJFRzIKKwlzMzJpCWEzLCBhMiwgUFRfQVJFRzMKKwltb3YJYTEsIGEyCisKKwkuZ2xvYmwgX2tlcm5lbF9leGNlcHRpb24KK19rZXJuZWxfZXhjZXB0aW9uOgorCisJLyogU2F2ZSBTQVIgYW5kIHR1cm4gb2ZmIHNpbmdsZSBzdGVwcGluZyAqLworCisJbW92aQlhMiwgMAorCXJzcglhMywgU0FSCisJd3NyCWEyLCBJQ09VTlRMRVZFTAorCXMzMmkJYTMsIGExLCBQVF9TQVIKKworCS8qIFJvdGF0ZSB3cyBzbyB0aGF0IHRoZSBjdXJyZW50IHdpbmRvd2Jhc2UgaXMgYXQgYml0MC4gKi8KKwkvKiBBc3N1bWUgd3MgPSB4eHd3dzF5eXl5LiBSb3RhdGUgd3MgcmlnaHQsIHNvIHRoYXQgYTIgPSB5eXl5eHh3d3cxICovCisKKwlyc3IJYTIsIFdJTkRPV0JBU0UJCSMgZG9uJ3QgbmVlZCB0byBzYXZlIHRoZXNlLCB3ZSBvbmx5CisJcnNyCWEzLCBXSU5ET1dTVEFSVAkJIyBuZWVkIHNoaWZ0ZWQgd2luZG93c3RhcnQ6IHdpbmRvd21hc2sKKwlzc3IJYTIKKwlzbGxpCWEyLCBhMywgMzItV1NCSVRTCisJc3JjCWEyLCBhMywgYTIKKwlzcmxpCWEyLCBhMiwgMzItV1NCSVRTCisJczMyaQlhMiwgYTEsIFBUX1dNQVNLCSMgbmVlZGVkIGZvciBrZXJuZWxfZXhjZXB0aW9uX2V4aXQKKworCS8qIFNhdmUgb25seSB0aGUgbGl2ZSB3aW5kb3ctZnJhbWUgKi8KKworCV9iYnNpLmwJYTIsIDEsIDFmCisJczMyaQlhNCwgYTEsIFBUX0FSRUc0CisJczMyaQlhNSwgYTEsIFBUX0FSRUc1CisJczMyaQlhNiwgYTEsIFBUX0FSRUc2CisJczMyaQlhNywgYTEsIFBUX0FSRUc3CisJX2Jic2kubAlhMiwgMiwgMWYKKwlzMzJpCWE4LCBhMSwgUFRfQVJFRzgKKwlzMzJpCWE5LCBhMSwgUFRfQVJFRzkKKwlzMzJpCWExMCwgYTEsIFBUX0FSRUcxMAorCXMzMmkJYTExLCBhMSwgUFRfQVJFRzExCisJX2Jic2kubAlhMiwgMywgMWYKKwlzMzJpCWExMiwgYTEsIFBUX0FSRUcxMgorCXMzMmkJYTEzLCBhMSwgUFRfQVJFRzEzCisJczMyaQlhMTQsIGExLCBQVF9BUkVHMTQKKwlzMzJpCWExNSwgYTEsIFBUX0FSRUcxNQorCisxOgorCisjaWZkZWYgS0VSTkVMX1NUQUNLX09WRVJGTE9XX0NIRUNLCisKKwkvKiAgU3RhY2sgb3ZlcmZsb3cgY2hlY2ssIGZvciBkZWJ1Z2dpbmcgICovCisJZXh0dWkJYTIsIGExLCBUQVNLX1NJWkVfQklUUyxYWAorCW1vdmkJYTMsIFNJWkU/PworCV9iZ2UJYTIsIGEzLCBvdXRfb2Zfc3RhY2tfcGFuaWMKKworI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjb21tb24gZXhjZXB0aW9uIGhhbmRsZXIuCisgKiBXZSBnZXQgaGVyZSBmcm9tIHRoZSB1c2VyIGV4Y2VwdGlvbiBoYW5kbGVyIG9yIHNpbXBseSBieSBmYWxsaW5nIHRocm91Z2gKKyAqIGZyb20gdGhlIGtlcm5lbCBleGNlcHRpb24gaGFuZGxlci4KKyAqIFNhdmUgdGhlIHJlbWFpbmluZyBzcGVjaWFsIHJlZ2lzdGVycywgc3dpdGNoIHRvIGtlcm5lbCBtb2RlLCBhbmQganVtcAorICogdG8gdGhlIHNlY29uZC1sZXZlbCBleGNlcHRpb24gaGFuZGxlci4KKyAqCisgKi8KKworY29tbW9uX2V4Y2VwdGlvbjoKKworCS8qIFNhdmUgRVhDVkFERFIsIERFQlVHQ0FVU0UsIGFuZCBQQywgYW5kIGNsZWFyIExDT1VOVCAqLworCisJcnNyCWEyLCBERUJVR0NBVVNFCisJcnNyCWEzLCBFUENfMQorCXMzMmkJYTIsIGExLCBQVF9ERUJVR0NBVVNFCisJczMyaQlhMywgYTEsIFBUX1BDCisKKwlyc3IJYTMsIEVYQ1ZBRERSCisJbW92aQlhMiwgMAorCXMzMmkJYTMsIGExLCBQVF9FWENWQUREUgorCXhzcglhMiwgTENPVU5UCisJczMyaQlhMiwgYTEsIFBUX0xDT1VOVAorCisJLyogSXQgaXMgbm93IHNhdmUgdG8gcmVzdG9yZSB0aGUgRVhDX1RBQkxFX0ZJWFVQIHZhcmlhYmxlLiAqLworCisJcnNyCWEwLCBFWENDQVVTRQorCW1vdmkJYTMsIDAKKwlyc3IJYTIsIEVYQ1NBVkVfMQorCXMzMmkJYTAsIGExLCBQVF9FWENDQVVTRQorCXMzMmkJYTMsIGEyLCBFWENfVEFCTEVfRklYVVAKKworCS8qIEFsbCB1bnJlY292ZXJhYmxlIHN0YXRlcyBhcmUgc2F2ZWQgb24gc3RhY2ssIG5vdywgYW5kIGExIGlzIHZhbGlkLAorCSAqIHNvIHdlIGNhbiBhbGxvdyBleGNlcHRpb25zIGFuZCBpbnRlcnJ1cHRzICgqKSBhZ2Fpbi4KKwkgKiBTZXQgUFMoRVhDTSA9IDAsIFVNID0gMCwgUklORyA9IDAsIE9XQiA9IDAsIFdPRSA9IDEsIElOVExFVkVMID0gWCkKKwkgKgorCSAqICgqKSBXZSBvbmx5IGFsbG93IGludGVycnVwdHMgaWYgUFMuSU5UTEVWRUwgd2FzIG5vdCBzZXQgdG8gMSBiZWZvcmUKKwkgKiAgICAgKGludGVycnVwdHMgZGlzYWJsZWQpIGFuZCBpZiB0aGlzIGV4Y2VwdGlvbiBpcyBub3QgYW4gaW50ZXJydXB0LgorCSAqLworCisJcnNyCWEzLCBQUworCWFkZGkJYTAsIGEwLCAtNAorCW1vdmkJYTIsIDEKKwlleHR1aQlhMywgYTMsIDAsIDEJCSMgYTMgPSBQUy5JTlRMRVZFTFswXQorCW1vdmVxeglhMywgYTIsIGEwCQkjIGEzID0gMSBpZmYgaW50ZXJydXB0IGV4Y2VwdGlvbgorCW1vdmkJYTIsIFBTX1dPRV9NQVNLCisJb3IJYTMsIGEzLCBhMgorCXJzcglhMCwgRVhDQ0FVU0UKKwl4c3IJYTMsIFBTCisKKwlzMzJpCWEzLCBhMSwgUFRfUFMJCSMgc2F2ZSBwcworCisJLyogU2F2ZSBMQkVHLCBMRU5EICovCisKKwlyc3IJYTIsIExCRUcKKwlyc3IJYTMsIExFTkQKKwlzMzJpCWEyLCBhMSwgUFRfTEJFRworCXMzMmkJYTMsIGExLCBQVF9MRU5ECisKKwkvKiBHbyB0byBzZWNvbmQtbGV2ZWwgZGlzcGF0Y2hlci4gU2V0IHVwIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUKKwkgKiBleGNlcHRpb24gaGFuZGxlciBhbmQgY2FsbCB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuCisJICovCisKKwltb3ZpCWE0LCBleGNfdGFibGUKKwltb3YJYTYsIGExCQkJIyBwYXNzIHN0YWNrIGZyYW1lCisJbW92CWE3LCBhMAkJCSMgcGFzcyBFWENDQVVTRQorCWFkZHg0CWE0LCBhMCwgYTQKKwlsMzJpCWE0LCBhNCwgRVhDX1RBQkxFX0RFRkFVTFQJCSMgbG9hZCBoYW5kbGVyCisKKwkvKiBDYWxsIHRoZSBzZWNvbmQtbGV2ZWwgaGFuZGxlciAqLworCisJY2FsbHg0CWE0CisKKwkvKiBKdW1wIGhlcmUgZm9yIGV4Y2VwdGlvbiBleGl0ICovCisKK2NvbW1vbl9leGNlcHRpb25fcmV0dXJuOgorCisJLyogSnVtcCBpZiB3ZSBhcmUgcmV0dXJuaW5nIGZyb20ga2VybmVsIGV4Y2VwdGlvbnMuICovCisKKzE6CWwzMmkJYTMsIGExLCBQVF9QUworCV9iYnNpLmwJYTMsIFBTX1VNX1NISUZULCAyZgorCWoJa2VybmVsX2V4Y2VwdGlvbl9leGl0CisKKwkvKiBTcGVjaWZpYyB0byBhIHVzZXIgZXhjZXB0aW9uIGV4aXQ6CisJICogV2UgbmVlZCB0byBjaGVjayBzb21lIGZsYWdzIGZvciBzaWduYWwgaGFuZGxpbmcgYW5kIHJlc2NoZWR1bGluZywKKwkgKiBhbmQgaGF2ZSB0byByZXN0b3JlIFdCIGFuZCBXUywgZXh0cmEgc3RhdGVzLCBhbmQgYWxsIHJlZ2lzdGVycworCSAqIGluIHRoZSByZWdpc3RlciBmaWxlIHRoYXQgd2VyZSBpbiB1c2UgaW4gdGhlIHVzZXIgdGFzay4KKwkgKi8KKworMjoJd3NyCWEzLCBQUwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisKKwkvKiBDaGVjayBmb3Igc2lnbmFscyAoa2VlcCBpbnRlcnJ1cHRzIGRpc2FibGVkIHdoaWxlIHdlIHJlYWQgVElfRkxBR1MpCisJICogTm90ZTogUFMuSU5UTEVWRUwgPSAwLCBQUy5FWENNID0gMQorCSAqLworCisJR0VUX1RIUkVBRF9JTkZPKGEyLGExKQorCWwzMmkJYTQsIGEyLCBUSV9GTEFHUworCisJLyogRW5hYmxlIGludGVycnVwdHMgYWdhaW4uCisJICogTm90ZTogV2hlbiB3ZSBnZXQgaGVyZSwgd2UgY2VydGFpbmx5IGhhdmUgaGFuZGxlZCBhbnkgaW50ZXJydXB0cy4KKwkgKiAgICAgICAoSGludDogVGhlcmUgaXMgb25seSBvbmUgdXNlciBleGNlcHRpb24gZnJhbWUgb24gc3RhY2spCisJICovCisKKwltb3ZpCWEzLCBQU19XT0VfTUFTSworCisJX2Jic2kubAlhNCwgVElGX05FRURfUkVTQ0hFRCwgM2YKKwlfYmJjaS5sCWE0LCBUSUZfU0lHUEVORElORywgNGYKKworI2lmbmRlZiBTSUdOQUxfSEFORExJTkdfSU5fRE9VQkxFX0VYQ0VQVElPTgorCWwzMmkJYTQsIGExLCBQVF9ERVBDCisJYmdldWkJYTQsIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUywgNGYKKyNlbmRpZgorCisJLyogUmVlbmFibGUgaW50ZXJydXB0cyBhbmQgY2FsbCBkb19zaWduYWwoKSAqLworCisJd3NyCWEzLCBQUworCW1vdmkJYTQsIGRvX3NpZ25hbAkjIGludCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MqLCBzaWdzZXRfdCopCisJbW92CWE2LCBhMQorCW1vdmkJYTcsIDAKKwljYWxseDQJYTQKKwlqCTFiCisKKzM6CS8qIFJlZW5hYmxlIGludGVycnVwdHMgYW5kIHJlc2NoZWR1bGUgKi8KKworCXdzcglhMywgUFMKKwltb3ZpCWE0LCBzY2hlZHVsZQkjIHZvaWQgc2NoZWR1bGUgKHZvaWQpCisJY2FsbHg0CWE0CisJagkxYgorCisJLyogUmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHRhc2sgYW5kIHJldHVybiBmcm9tIHRoZSBleGNlcHRpb24uICovCisKKworCS8qIElmIHdlIGFyZSByZXR1cm5pbmcgZnJvbSBhIHVzZXIgZXhjZXB0aW9uLCBhbmQgdGhlIHByb2Nlc3MKKwkgKiB0byBydW4gbmV4dCBoYXMgUFRfU0lOR0xFU1RFUCBzZXQsIHdlIHdhbnQgdG8gc2V0dXAKKwkgKiBJQ09VTlQgYW5kIElDT1VOVExFVkVMIHRvIHN0ZXAgb25lIGluc3RydWN0aW9uLgorCSAqIFBUX1NJTkdMRVNURVAgaXMgc2V0IGJ5IHN5c19wdHJhY2UgKHB0cmFjZS5jKQorCSAqLworCis0OgkvKiBhMiBob2xkcyBHRVRfQ1VSUkVOVChhMixhMSkgICovCisKKwlsMzJpCWEzLCBhMiwgVElfVEFTSworCWwzMmkJYTMsIGEzLCBUQVNLX1BUUkFDRQorCWJiY2kubAlhMywgUFRfU0lOR0xFU1RFUF9CSVQsIDFmICMganVtcCBpZiBzaW5nbGUtc3RlcCBmbGFnIGlzIG5vdCBzZXQKKworCW1vdmkJYTMsIC0yCQkJIyBQVF9TSU5HTEVTVEVQIGZsYWcgaXMgc2V0LAorCW1vdmkJYTQsIDEJCQkjIGljb3VudGxldmVsIG9mIDEgbWVhbnMgaXQgd29uJ3QKKwl3c3IJYTMsIElDT1VOVAkJIyBzdGFydCBjb3VudGluZyB1bnRpbCBhZnRlciByZmUKKwl3c3IJYTQsIElDT1VOVExFVkVMCQkjIHNvIHNldHVwIGljb3VudCAmIGljb3VudGxldmVsLgorCWlzeW5jCisKKzE6CisKKyNpZiBYQ0hBTF9FWFRSQV9TQV9TSVpFCisKKwkvKiBGb3IgdXNlciBleGNlcHRpb25zLCByZXN0b3JlIHRoZSBleHRyYSBzdGF0ZSBmcm9tIHRoZSB1c2VyJ3MgVENCLiAqLworCisJLyogTm90ZTogYTIgc3RpbGwgY29udGFpbnMgR0VUX0NVUlJFTlQoYTIsYTEpICovCisJYWRkaQlhMiwgYTIsIFRIUkVBRF9DUF9TQVZFCisJeGNoYWxfZXh0cmFfbG9hZF9mdW5jYm9keQorCisJLyogV2UgbXVzdCBhc3N1bWUgdGhhdCB4Y2hhbF9leHRyYV9zdG9yZV9mdW5jYm9keSBkZXN0cm95cworCSAqIHJlZ2lzdGVycyBhMi4uYTE1LiAgRklYTUUsIHRoaXMgbGlzdCBjYW4gZXZlbnR1YWxseSBiZQorCSAqIHJlZHVjZWQgb25jZSByZWFsIHJlZ2lzdGVyIHJlcXVpcmVtZW50cyBvZiB0aGUgbWFjcm8gYXJlCisJICogZmluYWxpemVkLiAqLworCisjZW5kaWYgLyogWENIQUxfRVhUUkFfU0FfU0laRSAqLworCisKKwkvKiBTd2l0Y2ggdG8gdGhlIHVzZXIgdGhyZWFkIFdJTkRPV0JBU0UuIFNhdmUgU1AgdGVtcG9yYXJpbHkgaW4gREVQQyAqLworCisJbDMyaQlhMiwgYTEsIFBUX1dJTkRPV0JBU0UKKwlsMzJpCWEzLCBhMSwgUFRfV0lORE9XU1RBUlQKKwl3c3IJYTEsIERFUEMJCSMgdXNlIERFUEMgYXMgdGVtcCBzdG9yYWdlCisJd3NyCWEzLCBXSU5ET1dTVEFSVAkJIyByZXN0b3JlIFdJTkRPV1NUQVJUCisJc3NyCWEyCQkJIyBwcmVzZXJ2ZSB1c2VyJ3MgV0IgaW4gdGhlIFNBUgorCXdzcglhMiwgV0lORE9XQkFTRQkJIyBzd2l0Y2ggdG8gdXNlcidzIHNhdmVkIFdCCisJcnN5bmMKKwlyc3IJYTEsIERFUEMJCSMgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJbDMyaQlhMiwgYTEsIFBUX1dNQVNLCSMgcmVnaXN0ZXIgZnJhbWVzIHNhdmVkIChpbiBiaXRzIDQuLi45KQorCXJvdHcJLTEJCQkjIHdlIHJlc3RvcmUgYTQuLmE3CisJX2JsdHVpCWE2LCAxNiwgMWYJCSMgb25seSBoYXZlIHRvIHJlc3RvcmUgY3VycmVudCB3aW5kb3c/CisKKwkvKiBUaGUgd29ya2luZyByZWdpc3RlcnMgYXJlIGEwIGFuZCBhMy4gIFdlIGFyZSByZXN0b3JpbmcgdG8KKwkgKiBhNC4uYTcuICBCZSBjYXJlZnVsIG5vdCB0byBkZXN0cm95IHdoYXQgd2UgaGF2ZSBqdXN0IHJlc3RvcmVkLgorCSAqIE5vdGU6IHdtYXNrIGhhcyB0aGUgZm9ybWF0IFlZWVlNOgorCSAqICAgICAgIFk6IG51bWJlciBvZiByZWdpc3RlcnMgc2F2ZWQgaW4gZ3JvdXBzIG9mIDQKKwkgKiAgICAgICBNOiA0IGJpdCBtYXNrIG9mIGZpcnN0IDE2IHJlZ2lzdGVycworCSAqLworCisJbW92CWEyLCBhNgorCW1vdglhMywgYTUKKworMjoJcm90dwktMQkJCSMgYTAuLmEzIGJlY29tZSBhNC4uYTcKKwlhZGRpCWEzLCBhNywgLTQqNAkJIyBuZXh0IGl0ZXJhdGlvbgorCWFkZGkJYTIsIGE2LCAtMTYJCSMgZGVjcmVtZW50aW5nIFkgaW4gV01BU0sKKwlsMzJpCWE0LCBhMywgUFRfQVJFR19FTkQgKyAwCisJbDMyaQlhNSwgYTMsIFBUX0FSRUdfRU5EICsgNAorCWwzMmkJYTYsIGEzLCBQVF9BUkVHX0VORCArIDgKKwlsMzJpCWE3LCBhMywgUFRfQVJFR19FTkQgKyAxMgorCV9iZ2V1aQlhMiwgMTYsIDJiCisKKwkvKiBDbGVhciB1bnJlc3RvcmVkIHJlZ2lzdGVycyAoZG9uJ3QgbGVhayBhbnl0aGluZyB0byB1c2VyLWxhbmQgKi8KKworMToJcnNyCWEwLCBXSU5ET1dCQVNFCisJcnNyCWEzLCBTQVIKKwlzdWIJYTMsIGEwLCBhMworCWJlcXoJYTMsIDJmCisJZXh0dWkJYTMsIGEzLCAwLCBXQkJJVFMKKworMToJcm90dwktMQorCWFkZGkJYTMsIGE3LCAtMQorCW1vdmkJYTQsIDAKKwltb3ZpCWE1LCAwCisJbW92aQlhNiwgMAorCW1vdmkJYTcsIDAKKwliZ2VpCWEzLCAxLCAxYgorCisJLyogV2UgYXJlIGJhY2sgd2VyZSB3ZSB3ZXJlIHdoZW4gd2Ugc3RhcnRlZC4KKwkgKiBOb3RlOiBhMiBzdGlsbCBjb250YWlucyBXTUFTSyAoaWYgd2UndmUgcmV0dXJuZWQgdG8gdGhlIG9yaWdpbmFsCisJICoJIGZyYW1lIHdoZXJlIHdlIGhhZCBsb2FkZWQgYTIpLCBvciBhdCBsZWFzdCB0aGUgbG93ZXIgNCBiaXRzCisJICoJIChpZiB3ZSBoYXZlIHJlc3RvcmVkIFdTQklUUy0xIGZyYW1lcykuCisJICovCisKKzI6CWoJY29tbW9uX2V4Y2VwdGlvbl9leGl0CisKKwkvKiBUaGlzIGlzIHRoZSBrZXJuZWwgZXhjZXB0aW9uIGV4aXQuCisJICogV2UgYXZvaWRlZCB0byBkbyBhIE1PVlNQIHdoZW4gd2UgZW50ZXJlZCB0aGUgZXhjZXB0aW9uLCBidXQgd2UKKwkgKiBoYXZlIHRvIGRvIGl0IGhlcmUuCisJICovCisKK2tlcm5lbF9leGNlcHRpb25fZXhpdDoKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAoYTMgaG9sZHMgUFRfUFMpICovCisKKwl3c3IJYTMsIFBTCisKKyNpZmRlZiBQUkVFTVBUSUJMRV9LRVJORUwKKworI2lmZGVmIENPTkZJR19QUkVFTVBUCisKKwkvKgorCSAqIE5vdGU6IFdlJ3ZlIGp1c3QgcmV0dXJuZWQgZnJvbSBhIGNhbGw0LCBzbyB3ZSBoYXZlCisJICogYXQgbGVhc3QgNCBhZGR0J2wgcmVncy4KKwkgKi8KKworCS8qIENoZWNrIGN1cnJlbnRfdGhyZWFkX2luZm8tPnByZWVtcHRfY291bnQgKi8KKworCUdFVF9USFJFQURfSU5GTyhhMikKKwlsMzJpCWEzLCBhMiwgVElfUFJFRU1QVAorCWJuZXoJYTMsIDFmCisKKwlsMzJpCWEyLCBhMiwgVElfRkxBR1MKKworMToKKworI2VuZGlmCisKKyNlbmRpZgorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBkbyBhIG1vdnNwLgorCSAqCisJICogV2Ugb25seSBoYXZlIHRvIGRvIGEgbW92c3AgaWYgdGhlIHByZXZpb3VzIHdpbmRvdy1mcmFtZSBoYXMKKwkgKiBiZWVuIHNwaWxsZWQgdG8gdGhlICp0ZW1wb3JhcnkqIGV4Y2VwdGlvbiBzdGFjayBpbnN0ZWFkIG9mIHRoZQorCSAqIHRhc2sncyBzdGFjay4gVGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW4KKwkgKiBXSU5ET1dTVEFSVCBmb3IgdGhlIHByZXZpb3VzIHdpbmRvdy1mcmFtZSB3YXMgc2V0IGJlZm9yZQorCSAqIChub3Qgc3BpbGxlZCkgYnV0IGlzIHplcm8gbm93IChzcGlsbGVkKS4KKwkgKiBJZiB0aGlzIGJpdCBpcyB6ZXJvLCBhbGwgb3RoZXIgYml0cyBleGNlcHQgdGhlIG9uZSBmb3IgdGhlCisJICogY3VycmVudCB3aW5kb3cgZnJhbWUgYXJlIGFsc28gemVyby4gU28sIHdlIGNhbiB1c2UgYSBzaW1wbGUgdGVzdDoKKwkgKiAnYW5kJyBXSU5ET1dTVEFSVCBhbmQgV0lORE9XU1RBUlQtMToKKwkgKgorCSAqICAoWFhYWFhYMVswXSogLSAxKSBBTkQgWFhYWFhYMVswXSogPSBYWFhYWFgwWzBdKgorCSAqCisJICogVGhlIHJlc3VsdCBpcyB6ZXJvIG9ubHkgaWYgb25lIGJpdCB3YXMgc2V0LgorCSAqCisJICogKE5vdGU6IFdlIG1pZ2h0IGhhdmUgZ29uZSB0aHJvdWdoIHNldmVyYWwgdGFzayBzd2l0Y2hlcyBiZWZvcmUKKwkgKiAgICAgICAgd2UgY29tZSBiYWNrIHRvIHRoZSBjdXJyZW50IHRhc2ssIHNvIFdJTkRPV0JBU0UgbWlnaHQgYmUKKwkgKiAgICAgICAgZGlmZmVyZW50IGZyb20gdGhlIHRpbWUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4pCisJICovCisKKwkvKiBUZXN0IFdJTkRPV1NUQVJUIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGV4Y2VwdGlvbi4KKwkgKiBXZSBhY3R1YWxseSBoYXZlIFdNQVNLLCBzbyB3ZSBvbmx5IGhhdmUgdG8gdGVzdCBpZiBpdCBpcyAxIG9yIG5vdC4KKwkgKi8KKworCWwzMmkJYTIsIGExLCBQVF9XTUFTSworCV9iZXFpCWEyLCAxLCBjb21tb25fZXhjZXB0aW9uX2V4aXQJIyBTcGlsbGVkIGJlZm9yZSBleGNlcHRpb24sanVtcAorCisJLyogVGVzdCBXSU5ET1dTVEFSVCBub3cuIElmIHNwaWxsZWQsIGRvIHRoZSBtb3ZzcCAqLworCisJcnNyICAgICBhMywgV0lORE9XU1RBUlQKKwlhZGRpCWEwLCBhMywgLTEKKwlhbmQgICAgIGEzLCBhMywgYTAKKwlfYm5leglhMywgY29tbW9uX2V4Y2VwdGlvbl9leGl0CisKKwkvKiBEbyBhIG1vdnNwICh3ZSByZXR1cm5lZCBmcm9tIGEgY2FsbDQsIHNvIHdlIGhhdmUgYXQgbGVhc3QgYTAuLmE3KSAqLworCisJYWRkaSAgICBhMCwgYTEsIC0xNgorCWwzMmkgICAgYTMsIGEwLCAwCisJbDMyaSAgICBhNCwgYTAsIDQKKwlzMzJpICAgIGEzLCBhMSwgUFRfU0laRSswCisJczMyaSAgICBhNCwgYTEsIFBUX1NJWkUrNAorCWwzMmkgICAgYTMsIGEwLCA4CisJbDMyaSAgICBhNCwgYTAsIDEyCisJczMyaSAgICBhMywgYTEsIFBUX1NJWkUrOAorCXMzMmkgICAgYTQsIGExLCBQVF9TSVpFKzEyCisKKwkvKiBDb21tb24gZXhjZXB0aW9uIGV4aXQuCisJICogV2UgcmVzdG9yZSB0aGUgc3BlY2lhbCByZWdpc3RlciBhbmQgdGhlIGN1cnJlbnQgd2luZG93IGZyYW1lLCBhbmQKKwkgKiByZXR1cm4gZnJvbSB0aGUgZXhjZXB0aW9uLgorCSAqCisJICogTm90ZTogV2UgZXhwZWN0IGEyIHRvIGhvbGQgUFRfV01BU0sKKwkgKi8KKworY29tbW9uX2V4Y2VwdGlvbl9leGl0OgorCisJX2Jic2kubAlhMiwgMSwgMWYKKwlsMzJpCWE0LCAgYTEsIFBUX0FSRUc0CisJbDMyaQlhNSwgIGExLCBQVF9BUkVHNQorCWwzMmkJYTYsICBhMSwgUFRfQVJFRzYKKwlsMzJpCWE3LCAgYTEsIFBUX0FSRUc3CisJX2Jic2kubAlhMiwgMiwgMWYKKwlsMzJpCWE4LCAgYTEsIFBUX0FSRUc4CisJbDMyaQlhOSwgIGExLCBQVF9BUkVHOQorCWwzMmkJYTEwLCBhMSwgUFRfQVJFRzEwCisJbDMyaQlhMTEsIGExLCBQVF9BUkVHMTEKKwlfYmJzaS5sCWEyLCAzLCAxZgorCWwzMmkJYTEyLCBhMSwgUFRfQVJFRzEyCisJbDMyaQlhMTMsIGExLCBQVF9BUkVHMTMKKwlsMzJpCWExNCwgYTEsIFBUX0FSRUcxNAorCWwzMmkJYTE1LCBhMSwgUFRfQVJFRzE1CisKKwkvKiBSZXN0b3JlIFBDLCBTQVIgKi8KKworMToJbDMyaQlhMiwgYTEsIFBUX1BDCisJbDMyaQlhMywgYTEsIFBUX1NBUgorCXdzcglhMiwgRVBDXzEKKwl3c3IJYTMsIFNBUgorCisJLyogUmVzdG9yZSBMQkVHLCBMRU5ELCBMQ09VTlQgKi8KKworCWwzMmkJYTIsIGExLCBQVF9MQkVHCisJbDMyaQlhMywgYTEsIFBUX0xFTkQKKwl3c3IJYTIsIExCRUcKKwlsMzJpCWEyLCBhMSwgUFRfTENPVU5UCisJd3NyCWEzLCBMRU5ECisJd3NyCWEyLCBMQ09VTlQKKworCS8qIENoZWNrIGlmIGl0IHdhcyBkb3VibGUgZXhjZXB0aW9uLiAqLworCisJbDMyaQlhMCwgYTEsIFBUX0RFUEMKKwlsMzJpCWEzLCBhMSwgUFRfQVJFRzMKKwlsMzJpCWEyLCBhMSwgUFRfQVJFRzIKKwlfYmdldWkJYTAsIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUywgMWYKKworCS8qIFJlc3RvcmUgYTAuLi5hMyBhbmQgcmV0dXJuICovCisKKwlsMzJpCWEwLCBhMSwgUFRfQVJFRzAKKwlsMzJpCWExLCBhMSwgUFRfQVJFRzEKKwlyZmUKKworMToJd3NyCWEwLCBERVBDCisJbDMyaQlhMCwgYTEsIFBUX0FSRUcwCisJbDMyaQlhMSwgYTEsIFBUX0FSRUcxCisJcmZkZQorCisvKgorICogRGVidWcgZXhjZXB0aW9uIGhhbmRsZXIuCisgKgorICogQ3VycmVudGx5LCB3ZSBkb24ndCBzdXBwb3J0IEtHREIsIHNvIG9ubHkgdXNlciBhcHBsaWNhdGlvbiBjYW4gYmUgZGVidWdnZWQuCisgKgorICogV2hlbiB3ZSBnZXQgaGVyZSwgIGEwIGlzIHRyYXNoZWQgYW5kIHNhdmVkIHRvIGV4Y3NhdmVbZGVidWdsZXZlbF0KKyAqLworCitFTlRSWShkZWJ1Z19leGNlcHRpb24pCisKKwlyc3IJYTAsIEVQUyArIFhDSEFMX0RFQlVHTEVWRUwKKwliYnNpLmwJYTAsIFBTX0VYQ01fU0hJRlQsIDFmCSMgZXhjZXB0aW9uIG1vZGUKKworCS8qIFNldCBFUENfMSBhbmQgRVhDQ0FVU0UgKi8KKworCXdzcglhMiwgREVQQwkJIyBzYXZlIGEyIHRlbXBvcmFyaWx5CisJcnNyCWEyLCBFUEMgKyBYQ0hBTF9ERUJVR0xFVkVMCisJd3NyCWEyLCBFUENfMQorCisJbW92aQlhMiwgRVhDQ0FVU0VfTUFQUEVEX0RFQlVHCisJd3NyCWEyLCBFWENDQVVTRQorCisJLyogUmVzdG9yZSBQUyB0byB0aGUgdmFsdWUgYmVmb3JlIHRoZSBkZWJ1ZyBleGMgYnV0IHdpdGggUFMuRVhDTSBzZXQuKi8KKworCW1vdmkJYTIsIDEgPDwgUFNfRVhDTV9TSElGVAorCW9yCWEyLCBhMCwgYTIKKwltb3ZpCWEwLCBkZWJ1Z19leGNlcHRpb24JIyByZXN0b3JlIGEzLCBkZWJ1ZyBqdW1wIHZlY3RvcgorCXdzcglhMiwgUFMKKwl4c3IJYTAsIEVYQ1NBVkUgKyBYQ0hBTF9ERUJVR0xFVkVMCisKKwkvKiBTd2l0Y2ggdG8ga2VybmVsL3VzZXIgc3RhY2ssIHJlc3RvcmUganVtcCB2ZWN0b3IsIGFuZCBzYXZlIGEwICovCisKKwliYnNpLmwJYTIsIFBTX1VNX1NISUZULCAyZgkjIGp1bXAgaWYgdXNlciBtb2RlCisKKwlhZGRpCWEyLCBhMSwgLTE2LVBUX1NJWkUJIyBhc3N1bWUga2VybmVsIHN0YWNrCisJczMyaQlhMCwgYTIsIFBUX0FSRUcwCisJbW92aQlhMCwgMAorCXMzMmkJYTEsIGEyLCBQVF9BUkVHMQorCXMzMmkJYTAsIGEyLCBQVF9ERVBDCQkjIG1hcmsgaXQgYXMgYSByZWd1bGFyIGV4Y2VwdGlvbgorCXhzcglhMCwgREVQQworCXMzMmkJYTMsIGEyLCBQVF9BUkVHMworCXMzMmkJYTAsIGEyLCBQVF9BUkVHMgorCW1vdglhMSwgYTIKKwlqCV9rZXJuZWxfZXhjZXB0aW9uCisKKzI6CXJzcglhMiwgRVhDU0FWRV8xCisJbDMyaQlhMiwgYTIsIEVYQ19UQUJMRV9LU1RLCSMgbG9hZCBrZXJuZWwgc3RhY2sgcG9pbnRlcgorCXMzMmkJYTAsIGEyLCBQVF9BUkVHMAorCW1vdmkJYTAsIDAKKwlzMzJpCWExLCBhMiwgUFRfQVJFRzEKKwlzMzJpCWEwLCBhMiwgUFRfREVQQworCXhzcglhMCwgREVQQworCXMzMmkJYTMsIGEyLCBQVF9BUkVHMworCXMzMmkJYTAsIGEyLCBQVF9BUkVHMgorCW1vdglhMSwgYTIKKwlqCV91c2VyX2V4Y2VwdGlvbgorCisJLyogRGVidWcgZXhjZXB0aW9uIHdoaWxlIGluIGV4Y2VwdGlvbiBtb2RlLiAqLworMToJagkxYgkvLyBGSVhNRSEhCisKKworLyoKKyAqIFdlIGdldCBoZXJlIGluIGNhc2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBleGNlcHRpb24uCisgKiBUaGUgb25seSB0aGluZyB3ZSBjYW4gZG8gaXMgdG8gYmUgbmljZSBhbmQgcHJpbnQgYSBwYW5pYyBtZXNzYWdlLgorICogV2Ugb25seSBwcm9kdWNlIGEgc2luZ2xlIHN0YWNrIGZyYW1lIGZvciBwYW5pYywgc28gPz8/CisgKgorICoKKyAqIEVudHJ5IGNvbmRpdGlvbnM6CisgKgorICogICAtIGEwIGNvbnRhaW5zIHRoZSBjYWxsZXIgYWRkcmVzczsgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgaW4gZXhjc2F2ZTEuCisgKiAgIC0gdGhlIG9yaWdpbmFsIGEwIGNvbnRhaW5zIGEgdmFsaWQgcmV0dXJuIGFkZHJlc3MgKGJhY2t0cmFjZSkgb3IgMC4KKyAqICAgLSBhMiBjb250YWlucyBhIHZhbGlkIHN0YWNrcG9pbnRlcgorICoKKyAqIE5vdGVzOgorICoKKyAqICAgLSBJZiB0aGUgc3RhY2sgcG9pbnRlciBjb3VsZCBiZSBpbnZhbGlkLCB0aGUgY2FsbGVyIGhhcyB0byBzZXR1cCBhCisgKiAgICAgZHVtbXkgc3RhY2sgcG9pbnRlciAoZS5nLiB0aGUgc3RhY2sgb2YgdGhlIGluaXRfdGFzaykKKyAqCisgKiAgIC0gSWYgdGhlIHJldHVybiBhZGRyZXNzIGNvdWxkIGJlIGludmFsaWQsIHRoZSBjYWxsZXIgaGFzIHRvIHNldCBpdAorICogICAgIHRvIDAsIHNvIHRoZSBiYWNrdHJhY2Ugd291bGQgc3RvcC4KKyAqCisgKi8KKwkuYWxpZ24gNAordW5yZWNvdmVyYWJsZV90ZXh0OgorCS5hc2NpaSAiVW5yZWNvdmVyYWJsZSBlcnJvciBpbiBleGNlcHRpb24gaGFuZGxlclwwIgorCitFTlRSWSh1bnJlY292ZXJhYmxlX2V4Y2VwdGlvbikKKworCW1vdmkJYTAsIDEKKwltb3ZpCWExLCAwCisKKwl3c3IJYTAsIFdJTkRPV1NUQVJUCisJd3NyCWExLCBXSU5ET1dCQVNFCisJcnN5bmMKKworCW1vdmkJYTEsIFBTX1dPRV9NQVNLIHwgMQorCXdzcglhMSwgUFMKKwlyc3luYworCisJbW92aQlhMSwgaW5pdF90YXNrCisJbW92aQlhMCwgMAorCWFkZGkJYTEsIGExLCBQVF9SRUdTX09GRlNFVAorCisJbW92aQlhNCwgcGFuaWMKKwltb3ZpCWE2LCB1bnJlY292ZXJhYmxlX3RleHQKKworCWNhbGx4NAlhNAorCisxOglqCTFiCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRkFTVCBFWENFUFRJT04gSEFORExFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEZhc3QtaGFuZGxlciBmb3IgYWxsb2NhIGV4Y2VwdGlvbnMKKyAqCisgKiAgVGhlIEFMTE9DQSBoYW5kbGVyIGlzIGVudGVyZWQgd2hlbiB1c2VyIGNvZGUgZXhlY3V0ZXMgdGhlIE1PVlNQCisgKiAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBjYWxsZXIncyBmcmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdGVyIGZpbGUuCisgKiAgSW4gdGhpcyBjYXNlLCB0aGUgY2FsbGVyIGZyYW1lJ3MgYTAuLmEzIGFyZSBvbiB0aGUgc3RhY2sganVzdAorICogIGJlbG93IHNwIChhMSksIGFuZCB0aGlzIGhhbmRsZXIgbW92ZXMgdGhlbS4KKyAqCisgKiAgRm9yICJNT1ZTUCA8YXI+LDxhcz4iIHdpdGhvdXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgYTEsIHRoaXMgcm91dGluZQorICogIHNpbXBseSBtb3ZlcyB0aGUgdmFsdWUgZnJvbSA8YXM+IHRvIDxhcj4gd2l0aG91dCBtb3ZpbmcgdGhlIHNhdmUgYXJlYS4KKyAqCisgKiBFbnRyeSBjb25kaXRpb246CisgKgorICogICBhMDoJdHJhc2hlZCwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0FSRUcwKQorICogICBhMToJYTEKKyAqICAgYTI6CW5ldyBzdGFjayBwb2ludGVyLCBvcmlnaW5hbCBpbiBERVBDCisgKiAgIGEzOglkaXNwYXRjaCB0YWJsZQorICogICBkZXBjOglhMiwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0RFUEMpCisgKiAgIGV4Y3NhdmVfMToJYTMKKyAqCisgKiAgIFBUX0RFUEMgPj0gVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTOiBkb3VibGUgZXhjZXB0aW9uLCBERVBDCisgKgkgICAgIDwgIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogcmVndWxhciBleGNlcHRpb24KKyAqLworCisjaWYgWENIQUxfSEFWRV9CRQorI2RlZmluZSBfRVhUVUlfTU9WU1BfU1JDKGFyKQlleHR1aSBhciwgYXIsIDQsIDQKKyNkZWZpbmUgX0VYVFVJX01PVlNQX0RTVChhcikJZXh0dWkgYXIsIGFyLCAwLCA0CisjZWxzZQorI2RlZmluZSBfRVhUVUlfTU9WU1BfU1JDKGFyKQlleHR1aSBhciwgYXIsIDAsIDQKKyNkZWZpbmUgX0VYVFVJX01PVlNQX0RTVChhcikJZXh0dWkgYXIsIGFyLCA0LCA0CisjZW5kaWYKKworRU5UUlkoZmFzdF9hbGxvY2EpCisKKwkvKiBXZSBzaG91bGRuJ3QgYmUgaW4gYSBkb3VibGUgZXhjZXB0aW9uLiAqLworCisJbDMyaQlhMCwgYTIsIFBUX0RFUEMKKwlfYmdldWkJYTAsIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUywgLkx1bmhhbmRsZWRfZG91YmxlCisKKwlyc3IJYTAsIERFUEMJCSMgZ2V0IGEyCisJczMyaQlhNCwgYTIsIFBUX0FSRUc0CSMgc2F2ZSBhNCBhbmQKKwlzMzJpCWEwLCBhMiwgUFRfQVJFRzIJIyBhMiB0byBzdGFjaworCisJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uLiAqLworCisJbW92aQlhMCwgMAorCXMzMmkJYTAsIGEzLCBFWENfVEFCTEVfRklYVVAKKworCS8qIFJlc3RvcmUgYTMsIGV4Y3NhdmVfMSAqLworCisJeHNyCWEzLCBFWENTQVZFXzEJCSMgbWFrZSBzdXJlIGV4Y3NhdmVfMSBpcyB2YWxpZCBmb3IgZGJsLgorCXJzcglhNCwgRVBDXzEJCSMgZ2V0IGV4Y2VwdGlvbiBhZGRyZXNzCisJczMyaQlhMywgYTIsIFBUX0FSRUczCSMgc2F2ZSBhMyB0byBzdGFjaworCisjaWZkZWYgQUxMT0NBX0VYQ0VQVElPTl9JTl9JUkFNCisjZXJyb3IJaXJhbSBub3Qgc3VwcG9ydGVkCisjZWxzZQorCS8qIE5vdGU6IGw4dWkgbm90IGFsbG93ZWQgaW4gSVJBTS9JUk9NISEgKi8KKwlsOHVpCWEwLCBhNCwgMQkJIyByZWFkIGFzKHNyYykgZnJvbSBNT1ZTUCBpbnN0cnVjdGlvbgorI2VuZGlmCisJbW92aQlhMywgLkxtb3ZzcF9zcmMKKwlfRVhUVUlfTU9WU1BfU1JDKGEwKQkJIyBleHRyYWN0IHNvdXJjZSByZWdpc3RlciBudW1iZXIKKwlhZGR4OAlhMywgYTAsIGEzCisJangJYTMKKworLkx1bmhhbmRsZWRfZG91YmxlOgorCXdzcglhMCwgRVhDU0FWRV8xCisJbW92aQlhMCwgdW5yZWNvdmVyYWJsZV9leGNlcHRpb24KKwljYWxseDAJYTAKKworCS5hbGlnbiA4CisuTG1vdnNwX3NyYzoKKwlsMzJpCWEzLCBhMiwgUFRfQVJFRzA7CV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTE7CQkJX2ogMWY7CS5hbGlnbiA4CisJbDMyaQlhMywgYTIsIFBUX0FSRUcyOwlfaiAxZjsJLmFsaWduIDgKKwlsMzJpCWEzLCBhMiwgUFRfQVJFRzM7CV9qIDFmOwkuYWxpZ24gOAorCWwzMmkJYTMsIGEyLCBQVF9BUkVHNDsJX2ogMWY7CS5hbGlnbiA4CisJbW92CWEzLCBhNTsJCQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTMsIGE2OwkJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTc7CQkJX2ogMWY7CS5hbGlnbiA4CisJbW92CWEzLCBhODsJCQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTMsIGE5OwkJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTEwOwkJX2ogMWY7CS5hbGlnbiA4CisJbW92CWEzLCBhMTE7CQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTMsIGExMjsJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMywgYTEzOwkJX2ogMWY7CS5hbGlnbiA4CisJbW92CWEzLCBhMTQ7CQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTMsIGExNTsJCV9qIDFmOwkuYWxpZ24gOAorCisxOgorCisjaWZkZWYgQUxMT0NBX0VYQ0VQVElPTl9JTl9JUkFNCisjZXJyb3IJaXJhbSBub3Qgc3VwcG9ydGVkCisjZWxzZQorCWw4dWkJYTAsIGE0LCAwCQkjIHJlYWQgYXIoZHN0KSBmcm9tIE1PVlNQIGluc3RydWN0aW9uCisjZW5kaWYKKwlhZGRpCWE0LCBhNCwgMwkJIyBzdGVwIG92ZXIgbW92c3AKKwlfRVhUVUlfTU9WU1BfRFNUKGEwKQkJIyBleHRyYWN0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyCisJd3NyCWE0LCBFUENfMQkJIyBzYXZlIG5ldyBlcGNfMQorCisJX2JuZWkJYTAsIDEsIDFmCQkjIG5vICdtb3ZzcCBhMSwgYXgnOiBqdW1wCisKKyAgICAgICAgLyogTW92ZSB0aGUgc2F2ZSBhcmVhLiBUaGlzIGltcGxpZXMgdGhlIHVzZSBvZiB0aGUgTDMyRQorCSAqIGFuZCBTMzJFIGluc3RydWN0aW9ucywgYmVjYXVzZSB0aGlzIG1vdmUgbXVzdCBiZSBkb25lIHdpdGgKKwkgKiB0aGUgdXNlcidzIFBTLlJJTkcgcHJpdmlsZWdlIGxldmVscywgbm90IHdpdGggcmluZyAwCisJICogKGtlcm5lbCdzKSBwcml2aWxlZ2VzIGN1cnJlbnRseSBhY3RpdmUgd2l0aCBQUy5FWENNCisJICogc2V0LiBOb3RlIHRoYXQgd2UgaGF2ZSBzdGlsIHJlZ2lzdGVyZWQgYSBmaXh1cCByb3V0aW5lIHdpdGggdGhlCisJICogZG91YmxlIGV4Y2VwdGlvbiB2ZWN0b3IgaW4gY2FzZSBhIGRvdWJsZSBleGNlcHRpb24gb2NjdXJzLgorCSAqLworCisJLyogYTAsYTQ6YXZhaWwgYTE6b2xkIHVzZXIgc3RhY2sgYTI6ZXhjLiBzdGFjayBhMzpuZXcgdXNlciBzdGFjay4gKi8KKworCWwzMmUJYTAsIGExLCAtMTYKKwlsMzJlCWE0LCBhMSwgLTEyCisJczMyZQlhMCwgYTMsIC0xNgorCXMzMmUJYTQsIGEzLCAtMTIKKwlsMzJlCWEwLCBhMSwgLTgKKwlsMzJlCWE0LCBhMSwgLTQKKwlzMzJlCWEwLCBhMywgLTgKKwlzMzJlCWE0LCBhMywgLTQKKworCS8qIFJlc3RvcmUgc3RhY2stcG9pbnRlciBhbmQgYWxsIHRoZSBvdGhlciBzYXZlZCByZWdpc3RlcnMuICovCisKKwltb3YJYTEsIGEzCisKKwlsMzJpCWE0LCBhMiwgUFRfQVJFRzQKKwlsMzJpCWEzLCBhMiwgUFRfQVJFRzMKKwlsMzJpCWEwLCBhMiwgUFRfQVJFRzAKKwlsMzJpCWEyLCBhMiwgUFRfQVJFRzIKKwlyZmUKKworCS8qICBNT1ZTUCA8YXQ+LDxhcz4gIHdhcyBpbnZva2VkIHdpdGggPGF0PiAhPSBhMS4KKwkgKiAgQmVjYXVzZSB0aGUgc3RhY2sgcG9pbnRlciBpcyBub3QgYmVpbmcgbW9kaWZpZWQsCisJICogIHdlIHNob3VsZCBiZSBhYmxlIHRvIGp1c3QgbW9kaWZ5IHRoZSBwb2ludGVyCisJICogIHdpdGhvdXQgbW92aW5nIGFueSBzYXZlIGFyZWEuCisJICogIFRoZSBwcm9jZXNzb3Igb25seSB0cmFwcyB0aGVzZSBvY2N1cnJlbmNlcyBpZiB0aGUKKwkgKiAgY2FsbGVyIHdpbmRvdyBpc24ndCBsaXZlLCBzbyB1bmZvcnR1bmF0ZWx5IHdlIGNhbid0CisJICogIHVzZSB0aGlzIGFzIGFuIGFsdGVybmF0ZSB0cmFwIG1lY2hhbmlzbS4KKwkgKiAgU28gd2UganVzdCBkbyB0aGUgbW92ZS4gIFRoaXMgcmVxdWlyZXMgdGhhdCB3ZQorCSAqICByZXNvbHZlIHRoZSBkZXN0aW5hdGlvbiByZWdpc3Rlciwgbm90IGp1c3QgdGhlIHNvdXJjZSwKKwkgKiAgc28gdGhlcmUncyBzb21lIGV4dHJhIHdvcmsuCisJICogIChQRVJIQVBTIE5PVCBSRUFMTFkgTkVFREVELCBCVVQgQ0xFQU5FUi4uLikKKwkgKi8KKworCS8qIGEwIGRzdC1yZWcsIGExIHVzZXItc3RhY2ssIGEyIHN0YWNrLCBhMyB2YWx1ZSBvZiBzcmMgcmVnLiAqLworCisxOgltb3ZpCWE0LCAuTG1vdnNwX2RzdAorCWFkZHg4CWE0LCBhMCwgYTQKKwlqeAlhNAorCisJLmFsaWduIDgKKy5MbW92c3BfZHN0OgorCXMzMmkJYTMsIGEyLCBQVF9BUkVHMDsJX2ogMWY7CS5hbGlnbiA4CisJbW92CWExLCBhMzsJCQlfaiAxZjsJLmFsaWduIDgKKwlzMzJpCWEzLCBhMiwgUFRfQVJFRzI7CV9qIDFmOwkuYWxpZ24gOAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHMzsJX2ogMWY7CS5hbGlnbiA4CisJczMyaQlhMywgYTIsIFBUX0FSRUc0OwlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTUsIGEzOwkJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhNiwgYTM7CQkJX2ogMWY7CS5hbGlnbiA4CisJbW92CWE3LCBhMzsJCQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTgsIGEzOwkJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhOSwgYTM7CQkJX2ogMWY7CS5hbGlnbiA4CisJbW92CWExMCwgYTM7CQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTExLCBhMzsJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMTIsIGEzOwkJX2ogMWY7CS5hbGlnbiA4CisJbW92CWExMywgYTM7CQlfaiAxZjsJLmFsaWduIDgKKwltb3YJYTE0LCBhMzsJCV9qIDFmOwkuYWxpZ24gOAorCW1vdglhMTUsIGEzOwkJX2ogMWY7CS5hbGlnbiA4CisKKzE6CWwzMmkJYTQsIGEyLCBQVF9BUkVHNAorCWwzMmkJYTMsIGEyLCBQVF9BUkVHMworCWwzMmkJYTAsIGEyLCBQVF9BUkVHMAorCWwzMmkJYTIsIGEyLCBQVF9BUkVHMgorCXJmZQorCisKKy8qCisgKiBmYXN0IHN5c3RlbSBjYWxscy4KKyAqCisgKiBXQVJOSU5HOiAgVGhlIGtlcm5lbCBkb2Vzbid0IHNhdmUgdGhlIGVudGlyZSB1c2VyIGNvbnRleHQgYmVmb3JlCisgKiBoYW5kbGluZyBhIGZhc3Qgc3lzdGVtIGNhbGwuICBUaGVzZSBmdW5jdGlvbnMgYXJlIHNtYWxsIGFuZCBzaG9ydCwKKyAqIHVzdWFsbHkgb2ZmZXJpbmcgc29tZSBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgdG8gdXNlciB0YXNrcy4KKyAqCisgKiBCRSBDQVJFRlVMIFRPIFBSRVNFUlZFIFRIRSBVU0VSJ1MgQ09OVEVYVC4KKyAqCisgKiBFbnRyeSBjb25kaXRpb246CisgKgorICogICBhMDoJdHJhc2hlZCwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0FSRUcwKQorICogICBhMToJYTEKKyAqICAgYTI6CW5ldyBzdGFjayBwb2ludGVyLCBvcmlnaW5hbCBpbiBERVBDCisgKiAgIGEzOglkaXNwYXRjaCB0YWJsZQorICogICBkZXBjOglhMiwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0RFUEMpCisgKiAgIGV4Y3NhdmVfMToJYTMKKyAqLworCitFTlRSWShmYXN0X3N5c2NhbGxfa2VybmVsKQorCisJLyogU2tpcCBzeXNjYWxsLiAqLworCisJcnNyCWEwLCBFUENfMQorCWFkZGkJYTAsIGEwLCAzCisJd3NyCWEwLCBFUENfMQorCisJbDMyaQlhMCwgYTIsIFBUX0RFUEMKKwliZ2V1aQlhMCwgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTLCBmYXN0X3N5c2NhbGxfdW5yZWNvdmVyYWJsZQorCisJcnNyCWEwLCBERVBDCQkJIyBnZXQgc3lzY2FsbC1ucgorCV9iZXF6CWEwLCBmYXN0X3N5c2NhbGxfc3BpbGxfcmVnaXN0ZXJzCisKKwlhZGRpCWEwLCBhMCwgLV9fTlJfc3lzeHRlbnNhCisJX2JlcXoJYTAsIGZhc3Rfc3lzY2FsbF9zeXN4dGVuc2EKKworCWoJa2VybmVsX2V4Y2VwdGlvbgorCisKK0VOVFJZKGZhc3Rfc3lzY2FsbF91c2VyKQorCisJLyogU2tpcCBzeXNjYWxsLiAqLworCisJcnNyCWEwLCBFUENfMQorCWFkZGkJYTAsIGEwLCAzCisJd3NyCWEwLCBFUENfMQorCisJbDMyaQlhMCwgYTIsIFBUX0RFUEMKKwliZ2V1aQlhMCwgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTLCBmYXN0X3N5c2NhbGxfdW5yZWNvdmVyYWJsZQorCisJcnNyCWEwLCBERVBDCQkJIyBnZXQgc3lzY2FsbC1ucgorCV9iZXF6CWEwLCBmYXN0X3N5c2NhbGxfc3BpbGxfcmVnaXN0ZXJzCisKKwlhZGRpCWEwLCBhMCwgLV9fTlJfc3lzeHRlbnNhCisJX2JlcXoJYTAsIGZhc3Rfc3lzY2FsbF9zeXN4dGVuc2EKKworCWoJdXNlcl9leGNlcHRpb24KKworRU5UUlkoZmFzdF9zeXNjYWxsX3VucmVjb3ZlcmFibGUpCisKKyAgICAgICAgLyogUmVzdG9yZSBhbGwgc3RhdGVzLiAqLworCisgICAgICAgIGwzMmkgICAgYTAsIGEyLCBQVF9BUkVHMCAgICAgICAgIyByZXN0b3JlIGEwCisgICAgICAgIHhzciAgICAgYTIsIERFUEMgICAgICAgICAgICAgICAgIyByZXN0b3JlIGEyLCBkZXBjCisgICAgICAgIHJzciAgICAgYTMsIEVYQ1NBVkVfMQorCisgICAgICAgIHdzciAgICAgYTAsIEVYQ1NBVkVfMQorICAgICAgICBtb3ZpICAgIGEwLCB1bnJlY292ZXJhYmxlX2V4Y2VwdGlvbgorICAgICAgICBjYWxseDAgIGEwCisKKworCisvKgorICogc3lzeHRlbnNhIHN5c2NhbGwgaGFuZGxlcgorICoKKyAqIGludCBzeXN4dGVuc2EgKFhURU5TQV9BVE9NSUNfU0VULCBwdHIsIHZhbCwgdW51c2VkKTsKKyAqIGludCBzeXN4dGVuc2EgKFhURU5TQV9BVE9NSUNfQURELCBwdHIsIHZhbCwgdW51c2VkKTsKKyAqIGludCBzeXN4dGVuc2EgKFhURU5TQV9BVE9NSUNfRVhHX0FERCwgcHRyLCB2YWwsIHVudXNlZCk7CisgKiBpbnQgc3lzeHRlbnNhIChYVEVOU0FfQVRPTUlDX0NNUF9TV1AsIHB0ciwgb2xkdmFsLCBuZXd2YWwpOworICogYTIgICAgICAgICAgICAgICAgICAgIGE2ICAgICAgICAgICAgICBhMyAgICBhNCAgICAgIGE1CisgKgorICogRW50cnkgY29uZGl0aW9uOgorICoKKyAqICAgYTA6CXRyYXNoZWQsIG9yaWdpbmFsIHZhbHVlIHNhdmVkIG9uIHN0YWNrIChQVF9BUkVHMCkKKyAqICAgYTE6CWExCisgKiAgIGEyOgluZXcgc3RhY2sgcG9pbnRlciwgb3JpZ2luYWwgaW4gREVQQworICogICBhMzoJZGlzcGF0Y2ggdGFibGUKKyAqICAgZGVwYzoJYTIsIG9yaWdpbmFsIHZhbHVlIHNhdmVkIG9uIHN0YWNrIChQVF9ERVBDKQorICogICBleGNzYXZlXzE6CWEzCisgKgorICogICBQVF9ERVBDID49IFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogZG91YmxlIGV4Y2VwdGlvbiwgREVQQworICoJICAgICA8ICBWQUxJRF9ET1VCTEVfRVhDRVBUSU9OX0FERFJFU1M6IHJlZ3VsYXIgZXhjZXB0aW9uCisgKgorICogTm90ZTogd2UgZG9uJ3QgaGF2ZSB0byBzYXZlIGEyOyBhMiBob2xkcyB0aGUgcmV0dXJuIHZhbHVlCisgKgorICogV2UgdXNlIHRoZSB0d28gbWFjcm9zIFRSWSBhbmQgQ0FUQ0g6CisgKgorICogVFJZCSBhZGRzIGFuIGVudHJ5IHRvIHRoZSBfX2V4X3RhYmxlIGZpeHVwIHRhYmxlIGZvciB0aGUgaW1tZWRpYXRlbHkKKyAqCSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uCisgKgorICogQ0FUQ0ggY2F0Y2hlcyBhbnkgZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgYXQgb25lIG9mIHRoZSBwcmVjZWVkaW5nIFRSWQorICogICAgICAgc3RhdGVtZW50cyBhbmQgY29udGludWVzIGZyb20gdGhlcmUKKyAqCisgKiBVc2FnZSBUUlkJbDMyaQlhMCwgYTEsIDAKKyAqCQk8b3RoZXIgY29kZT4KKyAqCSBkb25lOglyZmUKKyAqCSBDQVRDSAk8c2V0IHJldHVybiBjb2RlPgorICoJCWogZG9uZQorICovCisKKyNkZWZpbmUgVFJZCQkJCQkJCQlcCisJLnNlY3Rpb24gX19leF90YWJsZSwgImEiOwkJCQkJXAorCS53b3JkCTY2ZiwgNjdmOwkJCQkJCVwKKwkudGV4dDsJCQkJCQkJCVwKKzY2OgorCisjZGVmaW5lIENBVENICQkJCQkJCQlcCis2NzoKKworRU5UUlkoZmFzdF9zeXNjYWxsX3N5c3h0ZW5zYSkKKworCV9iZXF6CWE2LCAxZgorCV9ibHRpCWE2LCBTWVNYVEVOU0FfQ09VTlQsIDJmCisKKzE6CWoJdXNlcl9leGNlcHRpb24KKworMjoJeHNyCWEzLCBFWENTQVZFXzEJCSMgcmVzdG9yZSBhMywgZXhjc2F2ZTEKKwlzMzJpCWE3LCBhMiwgUFRfQVJFRzcKKworCW1vdmkJYTcsIDQJCQkjIHNpemVvZih1bnNpZ25lZCBpbnQpCisJdmVyaWZ5X2FyZWEgYTMsIGE3LCBhMCwgYTIsIC5MZWFjCisKKwlfYmVxaQlhNiwgU1lTWFRFTlNBX0FUT01JQ19TRVQsIC5Mc2V0CisJX2JlcWkJYTYsIFNZU1hURU5TQV9BVE9NSUNfRVhHX0FERCwgLkxleGcKKwlfYmVxaQlhNiwgU1lTWFRFTlNBX0FUT01JQ19BREQsIC5MYWRkCisKKwkvKiBGYWxsIHRocm91Z2ggZm9yIFNZU1hURU5TQV9BVE9NSUNfQ01QX1NXUCAqLworCisuTHN3cDoJLyogQXRvbWljIGNvbXBhcmUgYW5kIHN3YXAgKi8KKworVFJZCWwzMmkJYTcsIGEzLCAwCQkjIHJlYWQgb2xkIHZhbHVlCisJYm5lCWE3LCBhNCwgMWYJCSMgc2FtZSBhcyBvbGQgdmFsdWU/IGp1bXAKKwlzMzJpCWE1LCBhMywgMAkJIyBkaWZmZXJlbnQsIG1vZGlmeSB2YWx1ZQorCW1vdmkJYTcsIDEJCQkjIGFuZCByZXR1cm4gMQorCWoJLkxyZXQKKworMToJbW92aQlhNywgMAkJCSMgc2FtZSB2YWx1ZXM6IHJldHVybiAwCisJagkuTHJldAorCisuTGFkZDoJLyogQXRvbWljIGFkZCAqLworLkxleGc6CS8qIEF0b21pYyAoZXhjaGFuZ2UpIGFkZCAqLworCitUUlkJbDMyaQlhNywgYTMsIDAKKwlhZGQJYTQsIGE0LCBhNworCXMzMmkJYTQsIGEzLCAwCisJagkuTHJldAorCisuTHNldDoJLyogQXRvbWljIHNldCAqLworCitUUlkJbDMyaQlhNywgYTMsIDAJCSMgcmVhZCBvbGQgdmFsdWUgYXMgcmV0dXJuIHZhbHVlCisJczMyaQlhNCwgYTMsIDAJCSMgd3JpdGUgbmV3IHZhbHVlCisKKy5McmV0Ogltb3YJYTAsIGEyCisJbW92CWEyLCBhNworCWwzMmkJYTcsIGEwLCBQVF9BUkVHNworCWwzMmkJYTMsIGEwLCBQVF9BUkVHMworCWwzMmkJYTAsIGEwLCBQVF9BUkVHMAorCXJmZQorCitDQVRDSAorLkxlYWM6CW1vdmkJYTcsIC1FRkFVTFQKKwlqCS5McmV0CisKKworCisvKiBmYXN0X3N5c2NhbGxfc3BpbGxfcmVnaXN0ZXJzLgorICoKKyAqIEVudHJ5IGNvbmRpdGlvbjoKKyAqCisgKiAgIGEwOgl0cmFzaGVkLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfQVJFRzApCisgKiAgIGExOglhMQorICogICBhMjoJbmV3IHN0YWNrIHBvaW50ZXIsIG9yaWdpbmFsIGluIERFUEMKKyAqICAgYTM6CWRpc3BhdGNoIHRhYmxlCisgKiAgIGRlcGM6CWEyLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfREVQQykKKyAqICAgZXhjc2F2ZV8xOglhMworICoKKyAqIE5vdGU6IFdlIGFzc3VtZSB0aGUgc3RhY2sgcG9pbnRlciBpcyBFWENfVEFCTEVfS1NUSyBpbiB0aGUgZml4dXAgaGFuZGxlci4KKyAqIE5vdGU6IFdlIGRvbid0IG5lZWQgdG8gc2F2ZSBhMiBpbiBkZXBjIChyZXR1cm4gdmFsdWUpCisgKi8KKworRU5UUlkoZmFzdF9zeXNjYWxsX3NwaWxsX3JlZ2lzdGVycykKKworCS8qIFJlZ2lzdGVyIGEgRklYVVAgaGFuZGxlciAocGFzcyBjdXJyZW50IHdiIGFzIGEgcGFyYW1ldGVyKSAqLworCisJbW92aQlhMCwgZmFzdF9zeXNjYWxsX3NwaWxsX3JlZ2lzdGVyc19maXh1cAorCXMzMmkJYTAsIGEzLCBFWENfVEFCTEVfRklYVVAKKwlyc3IJYTAsIFdJTkRPV0JBU0UKKwlzMzJpCWEwLCBhMywgRVhDX1RBQkxFX1BBUkFNCisKKwkvKiBTYXZlIGEzIGFuZCBTQVIgb24gc3RhY2suICovCisKKwlyc3IJYTAsIFNBUgorCXhzcglhMywgRVhDU0FWRV8xCQkjIHJlc3RvcmUgYTMgYW5kIGV4Y3NhdmVfMQorCXMzMmkJYTAsIGEyLCBQVF9BUkVHNAkjIHN0b3JlIFNBUiB0byBQVF9BUkVHNAorCXMzMmkJYTMsIGEyLCBQVF9BUkVHMworCisJLyogVGhlIHNwaWxsIHJvdXRpbmUgbWlnaHQgY2xvYmJlciBhNywgYTExLCBhbmQgYTE1LiAqLworCisJczMyaQlhNywgYTIsIFBUX0FSRUc1CisJczMyaQlhMTEsIGEyLCBQVF9BUkVHNgorCXMzMmkJYTE1LCBhMiwgUFRfQVJFRzcKKworCWNhbGwwCV9zcGlsbF9yZWdpc3RlcnMJIyBkZXN0cm95cyBhMywgREVQQywgYW5kIFNBUgorCisJLyogQWR2YW5jZSBQQywgcmVzdG9yZSByZWdpc3RlcnMgYW5kIFNBUiwgYW5kIHJldHVybiBmcm9tIGV4Y2VwdGlvbi4gKi8KKworCWwzMmkJYTMsIGEyLCBQVF9BUkVHNAorCWwzMmkJYTAsIGEyLCBQVF9BUkVHMAorCXdzcglhMywgU0FSCisJbDMyaQlhMywgYTIsIFBUX0FSRUczCisKKwkvKiBSZXN0b3JlIGNsb2JiZXJlZCByZWdpc3RlcnMuICovCisKKwlsMzJpCWE3LCBhMiwgUFRfQVJFRzUKKwlsMzJpCWExMSwgYTIsIFBUX0FSRUc2CisJbDMyaQlhMTUsIGEyLCBQVF9BUkVHNworCisJbW92aQlhMiwgMAorCXJmZQorCisvKiBGaXh1cCBoYW5kbGVyLgorICoKKyAqIFdlIGdldCBoZXJlIGlmIHRoZSBzcGlsbCByb3V0aW5lIGNhdXNlcyBhbiBleGNlcHRpb24sIGUuZy4gdGxiIG1pc3MuCisgKiBXZSBiYXNpY2FsbHkgcmVzdG9yZSBXSU5ET1dCQVNFIGFuZCBXSU5ET1dTVEFSVCB0byB0aGUgY29uZGl0aW9uIHdoZW4KKyAqIHdlIGVudGVyZWQgdGhlIHNwaWxsIHJvdXRpbmUgYW5kIGp1bXAgdG8gdGhlIHVzZXIgZXhjZXB0aW9uIGhhbmRsZXIuCisgKgorICogYTA6IHZhbHVlIG9mIGRlcGMsIG9yaWdpbmFsIHZhbHVlIGluIGRlcGMKKyAqIGEyOiB0cmFzaGVkLCBvcmlnaW5hbCB2YWx1ZSBpbiBFWENfVEFCTEVfRE9VQkxFX1NBVkUKKyAqIGEzOiBleGN0YWJsZSwgb3JpZ2luYWwgdmFsdWUgaW4gZXhjc2F2ZTEKKyAqLworCitmYXN0X3N5c2NhbGxfc3BpbGxfcmVnaXN0ZXJzX2ZpeHVwOgorCisJcnNyCWEyLCBXSU5ET1dCQVNFCSMgZ2V0IGN1cnJlbnQgd2luZG93YmFzZSAoYTIgaXMgc2F2ZWQpCisJeHNyCWEwLCBERVBDCSMgcmVzdG9yZSBkZXBjIGFuZCBhMAorCXNzbAlhMgkJIyBzZXQgc2hpZnQgKDMyIC0gV0IpCisKKwkvKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCByZWdpc3RlcnMgKGEwLWEzKSBhcmUgcHJlc2VydmVkLgorCSAqIFRvIGRvIHRoaXMsIHdlIHNpbXBseSBzZXQgdGhlIGJpdCBmb3IgdGhlIGN1cnJlbnQgd2luZG93IGZyYW1lCisJICogaW4gV1MsIHNvIHRoYXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGVycyBzYXZlIHRoZW0gdG8gdGhlIHRhc2sgc3RhY2suCisJICovCisKKwlyc3IJYTMsIEVYQ1NBVkVfMQkjIGdldCBzcGlsbC1tYXNrCisJc2xsaQlhMiwgYTMsIDEJIyBzaGlmdCBsZWZ0IGJ5IG9uZQorCisJc2xsaQlhMywgYTIsIDMyLVdTQklUUworCXNyYwlhMiwgYTIsIGEzCSMgYTEgPSB4eHd3dzF5eXh4eHd3dzF5eS4uLi4uLgorCXdzcglhMiwgV0lORE9XU1RBUlQJIyBzZXQgY29ycmVjdGVkIHdpbmRvd3N0YXJ0CisKKwltb3ZpCWEzLCBleGNfdGFibGUKKwlsMzJpCWEyLCBhMywgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCSMgcmVzdG9yZSBhMgorCWwzMmkJYTMsIGEzLCBFWENfVEFCTEVfUEFSQU0JIyBvcmlnaW5hbCBXQiAoaW4gdXNlciB0YXNrKQorCisJLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCAodXNlciB0YXNrKSBXSU5ET1dCQVNFLgorCSAqIFdlIGxlYXZlIHRoZSBmb2xsb3dpbmcgZnJhbWUgYmVoaW5kOgorCSAqIGEwLCBhMSwgYTIJc2FtZQorCSAqIGEzOgkJdHJhc2hlZCAoc2F2ZWQgaW4gZXhjc2F2ZV8xKQorCSAqIGRlcGM6CWRlcGMgKHdlIGhhdmUgdG8gcmV0dXJuIHRvIHRoYXQgYWRkcmVzcykKKwkgKiBleGNzYXZlXzE6CWEzCisJICovCisKKwl3c3IJYTMsIFdJTkRPV0JBU0UKKwlyc3luYworCisJLyogV2UgYXJlIG5vdyBpbiB0aGUgb3JpZ2luYWwgZnJhbWUgd2hlbiB3ZSBlbnRlcmVkIF9zcGlsbF9yZWdpc3RlcnM6CisJICogIGEwOiByZXR1cm4gYWRkcmVzcworCSAqICBhMTogdXNlZCwgc3RhY2sgcG9pbnRlcgorCSAqICBhMjoga2VybmVsIHN0YWNrIHBvaW50ZXIKKwkgKiAgYTM6IGF2YWlsYWJsZSwgc2F2ZWQgaW4gRVhDU0FWRV8xCisJICogIGRlcGM6IGV4Y2VwdGlvbiBhZGRyZXNzCisJICogIGV4Y3NhdmU6IGEzCisJICogTm90ZTogVGhpcyBmcmFtZSBtaWdodCBiZSB0aGUgc2FtZSBhcyBhYm92ZS4KKwkgKi8KKworI2lmZGVmIFNJR05BTF9IQU5ETElOR19JTl9ET1VCTEVfRVhDRVBUSU9OCisJLyogUmVzdG9yZSByZWdpc3RlcnMgd2UgcHJlY2F1dGlvdXNseSBzYXZlZC4KKwkgKiBXZSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGUgJ3JpZ2h0JyBhMworCSAqLworCisJbDMyaQlhNywgYTIsIFBUX0FSRUc1CisJbDMyaQlhMTEsIGEyLCBQVF9BUkVHNgorCWwzMmkJYTE1LCBhMiwgUFRfQVJFRzcKKyNlbmRpZgorCisJLyogU2V0dXAgc3RhY2sgcG9pbnRlci4gKi8KKworCWFkZGkJYTIsIGEyLCAtUFRfVVNFUl9TSVpFCisJczMyaQlhMCwgYTIsIFBUX0FSRUcwCisKKwkvKiBNYWtlIHN1cmUgd2UgcmV0dXJuIHRvIHRoaXMgZml4dXAgaGFuZGxlci4gKi8KKworCW1vdmkJYTMsIGZhc3Rfc3lzY2FsbF9zcGlsbF9yZWdpc3RlcnNfZml4dXBfcmV0dXJuCisJczMyaQlhMywgYTIsIFBUX0RFUEMJCSMgc2V0dXAgZGVwYworCisJLyogSnVtcCB0byB0aGUgZXhjZXB0aW9uIGhhbmRsZXIuICovCisKKwltb3ZpCWEzLCBleGNfdGFibGUKKwlyc3IJYTAsIEVYQ0NBVVNFCisgICAgICAgIGFkZHg0ICAgYTAsIGEwLCBhMyAgICAgICAgICAgICAgCSMgZmluZCBlbnRyeSBpbiB0YWJsZQorICAgICAgICBsMzJpICAgIGEwLCBhMCwgRVhDX1RBQkxFX0ZBU1RfVVNFUiAgICAgIyBsb2FkIGhhbmRsZXIKKyAgICAgICAganggICAgICBhMAorCitmYXN0X3N5c2NhbGxfc3BpbGxfcmVnaXN0ZXJzX2ZpeHVwX3JldHVybjoKKworCS8qIFdoZW4gd2UgcmV0dXJuIGhlcmUsIGFsbCByZWdpc3RlcnMgaGF2ZSBiZWVuIHJlc3RvcmVkIChhMjogREVQQykgKi8KKworCXdzcglhMiwgREVQQwkJIyBleGNlcHRpb24gYWRkcmVzcworCisJLyogUmVzdG9yZSBmaXh1cCBoYW5kbGVyLiAqLworCisJeHNyCWEzLCBFWENTQVZFXzEKKwltb3ZpCWEyLCBmYXN0X3N5c2NhbGxfc3BpbGxfcmVnaXN0ZXJzX2ZpeHVwCisJczMyaQlhMiwgYTMsIEVYQ19UQUJMRV9GSVhVUAorCXJzcglhMiwgV0lORE9XQkFTRQorCXMzMmkJYTIsIGEzLCBFWENfVEFCTEVfUEFSQU0KKwlsMzJpCWEyLCBhMywgRVhDX1RBQkxFX0tTVEsKKworI2lmZGVmIFNJR05BTF9IQU5ETElOR19JTl9ET1VCTEVfRVhDRVBUSU9OCisJLyogU2F2ZSByZWdpc3RlcnMgYWdhaW4gdGhhdCBtaWdodCBiZSBjbG9iYmVyZWQuICovCisKKwlzMzJpCWE3LCBhMiwgUFRfQVJFRzUKKwlzMzJpCWExMSwgYTIsIFBUX0FSRUc2CisJczMyaQlhMTUsIGEyLCBQVF9BUkVHNworI2VuZGlmCisKKwkvKiBMb2FkIFdCIGF0IHRoZSB0aW1lIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICovCisKKwlyc3IJYTMsIFNBUgkJCSMgV0IgaXMgc3RpbGwgaW4gU0FSCisJbmVnCWEzLCBhMworCXdzcglhMywgV0lORE9XQkFTRQorCXJzeW5jCisKKwkvKiBSZXN0b3JlIGEzIGFuZCByZXR1cm4uICovCisKKwltb3ZpCWEzLCBleGNfdGFibGUKKwl4c3IJYTMsIEVYQ1NBVkVfMQorCisJcmZkZQorCisKKy8qCisgKiBzcGlsbCBhbGwgcmVnaXN0ZXJzLgorICoKKyAqIFRoaXMgaXMgbm90IGEgcmVhbCBmdW5jdGlvbi4gVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYmUgbWV0OgorICoKKyAqICAtIG11c3QgYmUgY2FsbGVkIHdpdGggY2FsbDAuCisgKiAgLSB1c2VzIERFUEMsIGEzIGFuZCBTQVIuCisgKiAgLSB0aGUgbGFzdCAndmFsaWQnIHJlZ2lzdGVyIG9mIGVhY2ggZnJhbWUgYXJlIGNsb2JiZXJlZC4KKyAqICAtIHRoZSBjYWxsZXIgbXVzdCBoYXZlIHJlZ2lzdGVyZWQgYSBmaXh1cCBoYW5kbGVyCisgKiAgICAob3IgYmUgaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbikKKyAqICAtIFBTX0VYQ00gbXVzdCBiZSBzZXQgKFBTX1dPRSBjbGVhcmVkPykKKyAqLworCitFTlRSWShfc3BpbGxfcmVnaXN0ZXJzKQorCisJLyoKKwkgKiBSb3RhdGUgd3Mgc28gdGhhdCB0aGUgY3VycmVudCB3aW5kb3diYXNlIGlzIGF0IGJpdCAwLgorCSAqIEFzc3VtZSB3cyA9IHh4eHd3dzF5eSAod3d3MSBjdXJyZW50IHdpbmRvdyBmcmFtZSkuCisJICogUm90YXRlIHdzIHJpZ2h0IHNvIHRoYXQgYTIgPSB5eXh4eHd3dzEuCisJICovCisKKwl3c3IJYTIsIERFUEMJCSMgcHJlc2VydmUgYTIKKwlyc3IJYTIsIFdJTkRPV0JBU0UKKwlyc3IJYTMsIFdJTkRPV1NUQVJUCisJc3NyCWEyCQkJIyBob2xkcyBXQgorCXNsbGkJYTIsIGEzLCBXU0JJVFMKKwlvcglhMywgYTMsIGEyCQkjIGEyID0geHh4d3d3MXl5eHh4d3d3MXl5CisJc3JsCWEzLCBhMworCisJLyogV2UgYXJlIGRvbmUgaWYgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiB0aGUgY3VycmVudCByZWdpc3RlciBmcmFtZS4gKi8KKworCWV4dHVpCWEzLCBhMywgMSwgV1NCSVRTLTIJIyBhMyA9IDB5eXh4eHd3dworCW1vdmkJYTIsICgxIDw8IChXU0JJVFMtMSkpCisJX2JlcXoJYTMsIC5Mbm9zcGlsbAkJIyBvbmx5IG9uZSBhY3RpdmUgZnJhbWU/IGp1bXAKKworCS8qIFdlIHdhbnQgMSBhdCB0aGUgdG9wLCBzbyB0aGF0IHdlIHJldHVybiB0byB0aGUgY3VycmVudCB3aW5kb3diYXNlICovCisKKwlvcglhMywgYTMsIGEyCQkjIDF5eXh4eHd3dworCisJLyogU2tpcCBlbXB0eSBmcmFtZXMgLSBnZXQgJ29sZGVzdCcgV0lORE9XU1RBUlQtYml0LiAqLworCisJd3NyCWEzLCBXSU5ET1dTVEFSVAkJIyBzYXZlIHNoaWZ0ZWQgd2luZG93c3RhcnQKKwluZWcJYTIsIGEzCisJYW5kCWEzLCBhMiwgYTMJCSMgZmlyc3QgYml0IHNldCBmcm9tIHJpZ2h0OiAwMDAwMTAwMDAKKworCWZmc193cwlhMiwgYTMJCQkjIGEyOiBzaGlmdHMgdG8gc2tpcCBlbXB0eSBmcmFtZXMKKwltb3ZpCWEzLCBXU0JJVFMKKwlzdWIJYTIsIGEzLCBhMgkJIyBXU0JJVFMtYTI6bnVtYmVyIG9mIDAtYml0cyBmcm9tIHJpZ2h0CisJc3NyCWEyCQkJIyBzYXZlIGluIFNBUiBmb3IgbGF0ZXIuCisKKwlyc3IJYTMsIFdJTkRPV0JBU0UKKwlhZGQJYTMsIGEzLCBhMgorCXJzcglhMiwgREVQQwkJIyByZXN0b3JlIGEyCisJd3NyCWEzLCBXSU5ET1dCQVNFCisJcnN5bmMKKworCXJzcglhMywgV0lORE9XU1RBUlQKKwlzcmwJYTMsIGEzCQkJIyBzaGlmdCB3aW5kb3dzdGFydAorCisJLyogV0IgaXMgbm93IGp1c3Qgb25lIGZyYW1lIGJlbG93IHRoZSBvbGRlc3QgZnJhbWUgaW4gdGhlIHJlZ2lzdGVyCisJICAgd2luZG93LiBXUyBpcyBzaGlmdGVkIHNvIHRoZSBvbGRlc3QgZnJhbWUgaXMgaW4gYml0IDAsIHRodXMsIFdCCisJICAgYW5kIFdTIGRpZmZlciBieSBvbmUgNC1yZWdpc3RlciBmcmFtZS4gKi8KKworCS8qIFNhdmUgZnJhbWVzLiBEZXBlbmRpbmcgd2hhdCBjYWxsIHdhcyB1c2VkIChjYWxsNCwgY2FsbDgsIGNhbGwxMiksCisJICogd2UgaGF2ZSB0byBzYXZlIDQsOC4gb3IgMTIgcmVnaXN0ZXJzLgorCSAqLworCisJX2Jic2kubAlhMywgMSwgLkxjNAorCV9iYnNpLmwJYTMsIDIsIC5MYzgKKworCS8qIFNwZWNpYWwgY2FzZTogd2UgaGF2ZSBhIGNhbGwxMi1mcmFtZSBzdGFydGluZyBhdCBhNC4gKi8KKworCV9iYmNpLmwJYTMsIDMsIC5MYzEyCSMgYml0IDMgc2hvdWxkbid0IGJlIHplcm8hIChKdW1wIHRvIExjMTIgZmlyc3QpCisKKwlzMzJlCWE0LCBhMSwgLTE2CSMgYTEgaXMgdmFsaWQgd2l0aCBhbiBlbXB0eSBzcGlsbCBhcmVhCisJbDMyZQlhNCwgYTUsIC0xMgorCXMzMmUJYTgsIGE0LCAtNDgKKwltb3YJYTgsIGE0CisJbDMyZQlhNCwgYTEsIC0xNgorCWoJLkxjMTJjCisKKy5MbG9vcDogX2Jic2kubAlhMywgMSwgLkxjNAorCV9iYmNpLmwJYTMsIDIsIC5MYzEyCisKKy5MYzg6CXMzMmUJYTQsIGExMywgLTE2CisJbDMyZQlhNCwgYTUsIC0xMgorCXMzMmUJYTgsIGE0LCAtMzIKKwlzMzJlCWE1LCBhMTMsIC0xMgorCXMzMmUJYTYsIGExMywgLTgKKwlzMzJlCWE3LCBhMTMsIC00CisJczMyZQlhOSwgYTQsIC0yOAorCXMzMmUJYTEwLCBhNCwgLTI0CisJczMyZQlhMTEsIGE0LCAtMjAKKworCXNybGkJYTExLCBhMywgMgkJIyBzaGlmdCB3aW5kb3diYXNlIGJ5IDIKKwlyb3R3CTIKKwlfYm5laQlhMywgMSwgLkxsb29wCisKKy5MZXhpdDogLyogRG9uZS4gRG8gdGhlIGZpbmFsIHJvdGF0aW9uLCBzZXQgV1MsIGFuZCByZXR1cm4uICovCisKKwlyb3R3CTEKKwlyc3IJYTMsIFdJTkRPV0JBU0UKKwlzc2wJYTMKKwltb3ZpCWEzLCAxCisJc2xsCWEzLCBhMworCXdzcglhMywgV0lORE9XU1RBUlQKKworLkxub3NwaWxsOgorCWp4CWEwCisKKy5MYzQ6CXMzMmUJYTQsIGE5LCAtMTYKKwlzMzJlCWE1LCBhOSwgLTEyCisJczMyZQlhNiwgYTksIC04CisJczMyZQlhNywgYTksIC00CisKKwlzcmxpCWE3LCBhMywgMQorCXJvdHcJMQorCV9ibmVpCWEzLCAxLCAuTGxvb3AKKwlqCS5MZXhpdAorCisuTGMxMjoJX2JiY2kubAlhMywgMywgLkxpbnZhbGlkX21hc2sJIyBiaXQgMiBzaG91bGRuJ3QgYmUgemVybyEKKworCS8qIDEyLXJlZ2lzdGVyIGZyYW1lIChjYWxsMTIpICovCisKKwlsMzJlCWEyLCBhNSwgLTEyCisJczMyZQlhOCwgYTIsIC00OAorCW1vdglhOCwgYTIKKworLkxjMTJjOiBzMzJlCWE5LCBhOCwgLTQ0CisJczMyZQlhMTAsIGE4LCAtNDAKKwlzMzJlCWExMSwgYTgsIC0zNgorCXMzMmUJYTEyLCBhOCwgLTMyCisJczMyZQlhMTMsIGE4LCAtMjgKKwlzMzJlCWExNCwgYTgsIC0yNAorCXMzMmUJYTE1LCBhOCwgLTIwCisJc3JsaQlhMTUsIGEzLCAzCisKKwkvKiBUaGUgc3RhY2sgcG9pbnRlciBmb3IgYTQuLmE3IGlzIG91dCBvZiByZWFjaCwgc28gd2Ugcm90YXRlIHRoZQorCSAqIHdpbmRvdywgZ3JhYiB0aGUgc3RhY2twb2ludGVyLCBhbmQgcm90YXRlIGJhY2suCisJICogQWx0ZXJuYXRpdmVseSwgd2UgY291bGQgYWxzbyB1c2UgdGhlIGZvbGxvd2luZyBhcHByb2FjaCwgYnV0IHRoYXQKKwkgKiBtYWtlcyB0aGUgZml4dXAgcm91dGluZSBtdWNoIG1vcmUgY29tcGxpY2F0ZWQ6CisJICogcm90dwkxCisJICogczMyZQlhMCwgYTEzLCAtMTYKKwkgKiAuLi4KKwkgKiByb3R3IDIKKwkgKi8KKworCXJvdHcJMQorCW1vdglhNSwgYTEzCisJcm90dwktMQorCisJczMyZQlhNCwgYTksIC0xNgorCXMzMmUJYTUsIGE5LCAtMTIKKwlzMzJlCWE2LCBhOSwgLTgKKwlzMzJlCWE3LCBhOSwgLTQKKworCXJvdHcJMworCisJX2JlcWkJYTMsIDEsIC5MZXhpdAorCWoJLkxsb29wCisKKy5MaW52YWxpZF9tYXNrOgorCisJLyogV2UgZ2V0IGhlcmUgYmVjYXVzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yIGluIHRoZSB3aW5kb3cKKwkgKiByZWdpc3RlcnMuIElmIHdlIGFyZSBpbiB1c2VyIHNwYWNlLCB3ZSBraWxsIHRoZSBhcHBsaWNhdGlvbiwKKwkgKiBob3dldmVyLCB0aGlzIGNvbmRpdGlvbiBpcyB1bnJlY292ZXJhYmxlIGluIGtlcm5lbCBzcGFjZS4KKwkgKi8KKworCXJzcglhMCwgUFMKKwlfYmJjaS5sCWEwLCBQU19VTV9TSElGVCwgMWYKKworIAkvKiBVc2VyIHNwYWNlOiBTZXR1cCBhIGR1bW15IGZyYW1lIGFuZCBraWxsIGFwcGxpY2F0aW9uLgorCSAqIE5vdGU6IFdlIGFzc3VtZSBFWENfVEFCTEVfS1NUSyBjb250YWlucyBhIHZhbGlkIHN0YWNrIHBvaW50ZXIuCisJICovCisKKwltb3ZpCWEwLCAxCisJbW92aQlhMSwgMAorCisJd3NyCWEwLCBXSU5ET1dTVEFSVAorCXdzcglhMSwgV0lORE9XQkFTRQorCXJzeW5jCisKKwltb3ZpCWEwLCAwCisKKwltb3ZpCWEzLCBleGNfdGFibGUKKwlsMzJpCWExLCBhMywgRVhDX1RBQkxFX0tTVEsKKwl3c3IJYTMsIEVYQ1NBVkVfMQorCisJbW92aQlhNCwgUFNfV09FX01BU0sgfCAxCisJd3NyCWE0LCBQUworCXJzeW5jCisKKwltb3ZpCWE2LCBTSUdTRUdWCisJbW92aQlhNCwgZG9fZXhpdAorCWNhbGx4NAlhNAorCisxOgkvKiBLZXJuZWwgc3BhY2U6IFBBTklDISAqLworCisJd3NyCWEwLCBFWENTQVZFXzEKKwltb3ZpCWEwLCB1bnJlY292ZXJhYmxlX2V4Y2VwdGlvbgorCWNhbGx4MAlhMAkJIyBzaG91bGQgbm90IHJldHVybgorMToJagkxYgorCisvKgorICogV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiBCYWlsIG91dCEKKyAqLworCitFTlRSWShmYXN0X3NlY29uZF9sZXZlbF9taXNzX2RvdWJsZV9rZXJuZWwpCisKKzE6CW1vdmkJYTAsIHVucmVjb3ZlcmFibGVfZXhjZXB0aW9uCisJY2FsbHgwCWEwCQkjIHNob3VsZCBub3QgcmV0dXJuCisxOglqCTFiCisKKy8qIEZpcnN0LWxldmVsIGVudHJ5IGhhbmRsZXIgZm9yIHVzZXIsIGtlcm5lbCwgYW5kIGRvdWJsZSAybmQtbGV2ZWwKKyAqIFRMQiBtaXNzIGV4Y2VwdGlvbnMuICBOb3RlIHRoYXQgZm9yIG5vdywgdXNlciBhbmQga2VybmVsIG1pc3MKKyAqIGV4Y2VwdGlvbnMgc2hhcmUgdGhlIHNhbWUgZW50cnkgcG9pbnQgYW5kIGFyZSBoYW5kbGVkIGlkZW50aWNhbGx5LgorICoKKyAqIEFuIG9sZCwgbGVzcy1lZmZpY2llbnQgQyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gdXNlZCB0byBleGlzdC4KKyAqIFdlIGluY2x1ZGUgaXQgYmVsb3csIGludGVybGVhdmVkIGFzIGNvbW1lbnRzLCBmb3IgcmVmZXJlbmNlLgorICoKKyAqIEVudHJ5IGNvbmRpdGlvbjoKKyAqCisgKiAgIGEwOgl0cmFzaGVkLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfQVJFRzApCisgKiAgIGExOglhMQorICogICBhMjoJbmV3IHN0YWNrIHBvaW50ZXIsIG9yaWdpbmFsIGluIERFUEMKKyAqICAgYTM6CWRpc3BhdGNoIHRhYmxlCisgKiAgIGRlcGM6CWEyLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfREVQQykKKyAqICAgZXhjc2F2ZV8xOglhMworICoKKyAqICAgUFRfREVQQyA+PSBWQUxJRF9ET1VCTEVfRVhDRVBUSU9OX0FERFJFU1M6IGRvdWJsZSBleGNlcHRpb24sIERFUEMKKyAqCSAgICAgPCAgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTOiByZWd1bGFyIGV4Y2VwdGlvbgorICovCisKK0VOVFJZKGZhc3Rfc2Vjb25kX2xldmVsX21pc3MpCisKKwkvKiBTYXZlIGExLiBOb3RlOiB3ZSBkb24ndCBleHBlY3QgYSBkb3VibGUgZXhjZXB0aW9uLiAqLworCisJczMyaQlhMSwgYTIsIFBUX0FSRUcxCisKKwkvKiBXZSBuZWVkIHRvIG1hcCB0aGUgcGFnZSBvZiBQVEVzIGZvciB0aGUgdXNlciB0YXNrLiAgRmluZAorCSAqIHRoZSBwb2ludGVyIHRvIHRoYXQgcGFnZS4gIEFsc28sIGl0J3MgcG9zc2libGUgZm9yIHRzay0+bW0KKwkgKiB0byBiZSBOVUxMIHdoaWxlIHRzay0+YWN0aXZlX21tIGlzIG5vbnplcm8gaWYgd2UgZmF1bHRlZCBvbgorCSAqIGEgdm1hbGxvYyBhZGRyZXNzLiAgSW4gdGhhdCByYXJlIGNhc2UsIHdlIG11c3QgdXNlCisJICogYWN0aXZlX21tIGluc3RlYWQgdG8gYXZvaWQgYSBmYXVsdCBpbiB0aGlzIGhhbmRsZXIuICBTZWUKKwkgKgorCSAqIGh0dHA6Ly9tYWlsLm5sLmxpbnV4Lm9yZy9saW51eC1tbS8yMDAyLTA4L21zZzAwMjU4Lmh0bWwKKwkgKiAgIChvciBzZWFyY2ggSW50ZXJuZXQgb24gIm1tIHZzLiBhY3RpdmVfbW0iKQorCSAqCisJICoJaWYgKCFtbSkKKwkgKgkJbW0gPSB0c2stPmFjdGl2ZV9tbTsKKwkgKglwZ2QgPSBwZ2Rfb2Zmc2V0IChtbSwgcmVncy0+ZXhjdmFkZHIpOworCSAqCXBtZCA9IHBtZF9vZmZzZXQgKHBnZCwgcmVncy0+ZXhjdmFkZHIpOworCSAqCXBtZHZhbCA9ICpwbWQ7CisJICovCisKKwlHRVRfQ1VSUkVOVChhMSxhMikKKwlsMzJpCWEwLCBhMSwgVEFTS19NTQkJIyB0c2stPm1tCisJYmVxeglhMCwgOWYKKworODoJcnNyCWExLCBFWENWQUREUgkJIyBmYXVsdCBhZGRyZXNzCisJX1BHRF9PRkZTRVQoYTAsIGExLCBhMSkKKwlsMzJpCWEwLCBhMCwgMAkJIyByZWFkIHBtZHZhbAorCS8vYmVxaQlhMCwgX1BBR0VfVVNFUiwgMmYKKwliZXF6CWEwLCAyZgorCisJLyogUmVhZCBwdGV2YWRkciBhbmQgY29udmVydCB0byB0b3Agb2YgcGFnZS10YWJsZSBwYWdlLgorCSAqCisJICogCXZwbnZhbCA9IHJlYWRfcHRldmFkZHJfcmVnaXN0ZXIoKSAmIFBBR0VfTUFTSzsKKwkgKiAJdnBudmFsICs9IERUTEJfV0FZX1BHVEFCTEU7CisJICoJcHRldmFsID0gbWtfcHRlICh2aXJ0X3RvX3BhZ2UocG1kX3ZhbChwbWR2YWwpKSwgUEFHRV9LRVJORUwpOworCSAqCXdyaXRlX2R0bGJfZW50cnkgKHB0ZXZhbCwgdnBudmFsKTsKKwkgKgorCSAqIFRoZSBtZXNzeSBjb21wdXRhdGlvbiBmb3IgJ3B0ZXZhbCcgYWJvdmUgcmVhbGx5IHNpbXBsaWZpZXMKKwkgKiBpbnRvIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiBwdGV2YWwgPSAoKHBtZHZhbCAtIFBBR0VfT0ZGU0VUKSAmIFBBR0VfTUFTSykgfCBQQUdFX0tFUk5FTAorCSAqLworCisJbW92aQlhMSwgLVBBR0VfT0ZGU0VUCisJYWRkCWEwLCBhMCwgYTEJCSMgcG1kdmFsIC0gUEFHRV9PRkZTRVQKKwlleHR1aQlhMSwgYTAsIDAsIFBBR0VfU0hJRlQJIyAuLi4gJiBQQUdFX01BU0sKKwl4b3IJYTAsIGEwLCBhMQorCisKKwltb3ZpCWExLCBQQUdFX0RJUkVDVE9SWQorCW9yCWEwLCBhMCwgYTEJCSMgLi4uIHwgUEFHRV9ESVJFQ1RPUlkKKworCXJzcglhMSwgUFRFVkFERFIKKwlzcmxpCWExLCBhMSwgUEFHRV9TSElGVAorCXNsbGkJYTEsIGExLCBQQUdFX1NISUZUCSMgcHRldmFkZHIgJiBQQUdFX01BU0sKKwlhZGRpCWExLCBhMSwgRFRMQl9XQVlfUEdUQUJMRQkjIC4uLiArIHdheV9udW1iZXIKKworCXdkdGxiCWEwLCBhMQorCWRzeW5jCisKKwkvKiBFeGl0IGNyaXRpY2FsIHNlY3Rpb24uICovCisKKwltb3ZpCWEwLCAwCisJczMyaQlhMCwgYTMsIEVYQ19UQUJMRV9GSVhVUAorCisJLyogUmVzdG9yZSB0aGUgd29ya2luZyByZWdpc3RlcnMsIGFuZCByZXR1cm4uICovCisKKwlsMzJpCWEwLCBhMiwgUFRfQVJFRzAKKwlsMzJpCWExLCBhMiwgUFRfQVJFRzEKKwlsMzJpCWEyLCBhMiwgUFRfREVQQworCXhzcglhMywgRVhDU0FWRV8xCisKKwliZ2V1aQlhMiwgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTLCAxZgorCisJLyogUmVzdG9yZSBleGNzYXZlMSBhbmQgcmV0dXJuLiAqLworCisJcnNyCWEyLCBERVBDCisJcmZlCisKKwkvKiBSZXR1cm4gZnJvbSBkb3VibGUgZXhjZXB0aW9uLiAqLworCisxOgl4c3IJYTIsIERFUEMKKwllc3luYworCXJmZGUKKworOToJbDMyaQlhMCwgYTEsIFRBU0tfQUNUSVZFX01NCSMgdW5saWtlbHkgY2FzZSBtbSA9PSAwCisJagk4YgorCisyOgkvKiBJbnZhbGlkIFBHRCwgZGVmYXVsdCBleGNlcHRpb24gaGFuZGxpbmcgKi8KKworCXJzcglhMSwgREVQQworCXhzcglhMywgRVhDU0FWRV8xCisJczMyaQlhMSwgYTIsIFBUX0FSRUcyCisJczMyaQlhMywgYTIsIFBUX0FSRUczCisJbW92CWExLCBhMgorCisJcnNyCWEyLCBQUworCWJic2kubAlhMiwgUFNfVU1fU0hJRlQsIDFmCisJaglfa2VybmVsX2V4Y2VwdGlvbgorMToJaglfdXNlcl9leGNlcHRpb24KKworCisvKgorICogU3RvcmVQcm9oaWJpdGVkRXhjZXB0aW9uCisgKgorICogVXBkYXRlIHRoZSBwdGUgYW5kIGludmFsaWRhdGUgdGhlIGl0bGIgbWFwcGluZyBmb3IgdGhpcyBwdGUuCisgKgorICogRW50cnkgY29uZGl0aW9uOgorICoKKyAqICAgYTA6CXRyYXNoZWQsIG9yaWdpbmFsIHZhbHVlIHNhdmVkIG9uIHN0YWNrIChQVF9BUkVHMCkKKyAqICAgYTE6CWExCisgKiAgIGEyOgluZXcgc3RhY2sgcG9pbnRlciwgb3JpZ2luYWwgaW4gREVQQworICogICBhMzoJZGlzcGF0Y2ggdGFibGUKKyAqICAgZGVwYzoJYTIsIG9yaWdpbmFsIHZhbHVlIHNhdmVkIG9uIHN0YWNrIChQVF9ERVBDKQorICogICBleGNzYXZlXzE6CWEzCisgKgorICogICBQVF9ERVBDID49IFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogZG91YmxlIGV4Y2VwdGlvbiwgREVQQworICoJICAgICA8ICBWQUxJRF9ET1VCTEVfRVhDRVBUSU9OX0FERFJFU1M6IHJlZ3VsYXIgZXhjZXB0aW9uCisgKi8KKworRU5UUlkoZmFzdF9zdG9yZV9wcm9oaWJpdGVkKQorCisJLyogU2F2ZSBhMSBhbmQgYTQuICovCisKKwlzMzJpCWExLCBhMiwgUFRfQVJFRzEKKwlzMzJpCWE0LCBhMiwgUFRfQVJFRzQKKworCUdFVF9DVVJSRU5UKGExLGEyKQorCWwzMmkJYTAsIGExLCBUQVNLX01NCQkjIHRzay0+bW0KKwliZXF6CWEwLCA5ZgorCis4Oglyc3IJYTEsIEVYQ1ZBRERSCQkjIGZhdWx0IGFkZHJlc3MKKwlfUEdEX09GRlNFVChhMCwgYTEsIGE0KQorCWwzMmkJYTAsIGEwLCAwCisJLy9iZXFpCWEwLCBfUEFHRV9VU0VSLCAyZgkjIEZJWE1FIHVzZSBfUEFHRV9JTlZBTElECisJYmVxeglhMCwgMmYKKworCV9QVEVfT0ZGU0VUKGEwLCBhMSwgYTQpCisJbDMyaQlhNCwgYTAsIDAJCSMgcmVhZCBwdGV2YWwKKwltb3ZpCWExLCBfUEFHRV9WQUxJRCB8IF9QQUdFX1JXCisJYm5hbGwJYTQsIGExLCAyZgorCisJbW92aQlhMSwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX1dSRU5BQkxFCisJb3IJYTQsIGE0LCBhMQorCXJzcglhMSwgRVhDVkFERFIKKwlzMzJpCWE0LCBhMCwgMAorCisJLyogV2UgbmVlZCB0byBmbHVzaCB0aGUgY2FjaGUgaWYgd2UgaGF2ZSBwYWdlIGNvbG9yaW5nLiAqLworI2lmIChEQ0FDSEVfV0FZX1NJWkUgPiBQQUdFX1NJWkUpICYmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKKwlkaHdiCWEwLCAwCisjZW5kaWYKKwlwZHRsYglhMCwgYTEKKwliZXF6CWEwLCAxZgorCWlkdGxiCWEwCQkvLyBGSVhNRSBkbyB3ZSBuZWVkIHRoaXM/CisJd2R0bGIJYTQsIGEwCisxOgorCisJLyogRXhpdCBjcml0aWNhbCBzZWN0aW9uLiAqLworCisJbW92aQlhMCwgMAorCXMzMmkJYTAsIGEzLCBFWENfVEFCTEVfRklYVVAKKworCS8qIFJlc3RvcmUgdGhlIHdvcmtpbmcgcmVnaXN0ZXJzLCBhbmQgcmV0dXJuLiAqLworCisJbDMyaQlhNCwgYTIsIFBUX0FSRUc0CisJbDMyaQlhMSwgYTIsIFBUX0FSRUcxCisJbDMyaQlhMCwgYTIsIFBUX0FSRUcwCisJbDMyaQlhMiwgYTIsIFBUX0RFUEMKKworCS8qIFJlc3RvcmUgZXhjc2F2ZTEgYW5kIGEzLiAqLworCisJeHNyCWEzLCBFWENTQVZFXzEKKwliZ2V1aQlhMiwgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTLCAxZgorCisJcnNyCWEyLCBERVBDCisJcmZlCisKKwkvKiBEb3VibGUgZXhjZXB0aW9uLiBSZXN0b3JlIEZJWFVQIGhhbmRsZXIgYW5kIHJldHVybi4gKi8KKworMToJeHNyCWEyLCBERVBDCisJZXN5bmMKKwlyZmRlCisKKzk6CWwzMmkJYTAsIGExLCBUQVNLX0FDVElWRV9NTQkjIHVubGlrZWx5IGNhc2UgbW0gPT0gMAorCWoJOGIKKworMjoJLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSwgaGFuZGxlIGZhdWx0IGluIEMgKi8KKworCXJzcglhNCwgREVQQwkjIHN0aWxsIGhvbGRzIGEyCisJeHNyCWEzLCBFWENTQVZFXzEKKwlzMzJpCWE0LCBhMiwgUFRfQVJFRzIKKwlzMzJpCWEzLCBhMiwgUFRfQVJFRzMKKwlsMzJpCWE0LCBhMiwgUFRfQVJFRzQKKwltb3YJYTEsIGEyCisKKwlyc3IJYTIsIFBTCisJYmJzaS5sCWEyLCBQU19VTV9TSElGVCwgMWYKKwlqCV9rZXJuZWxfZXhjZXB0aW9uCisxOglqCV91c2VyX2V4Y2VwdGlvbgorCisKKyNpZiBYQ0hBTF9FWFRSQV9TQV9TSVpFCisKKyN3YXJuaW5nIGZhc3RfY29wcm9jZXNzb3IgdW50ZXN0ZWQKKworLyoKKyAqIEVudHJ5IGNvbmRpdGlvbjoKKyAqCisgKiAgIGEwOgl0cmFzaGVkLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfQVJFRzApCisgKiAgIGExOglhMQorICogICBhMjoJbmV3IHN0YWNrIHBvaW50ZXIsIG9yaWdpbmFsIGluIERFUEMKKyAqICAgYTM6CWRpc3BhdGNoIHRhYmxlCisgKiAgIGRlcGM6CWEyLCBvcmlnaW5hbCB2YWx1ZSBzYXZlZCBvbiBzdGFjayAoUFRfREVQQykKKyAqICAgZXhjc2F2ZV8xOglhMworICoKKyAqICAgUFRfREVQQyA+PSBWQUxJRF9ET1VCTEVfRVhDRVBUSU9OX0FERFJFU1M6IGRvdWJsZSBleGNlcHRpb24sIERFUEMKKyAqCSAgICAgPCAgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTOiByZWd1bGFyIGV4Y2VwdGlvbgorICovCisKK0VOVFJZKGZhc3RfY29wcm9jZXNzb3JfZG91YmxlKQorCXdzcglhMCwgRVhDU0FWRV8xCisJbW92aQlhMCwgdW5yZWNvdmVyYWJsZV9leGNlcHRpb24KKwljYWxseDAJYTAKKworRU5UUlkoZmFzdF9jb3Byb2Nlc3NvcikKKworCS8qIEZhdGFsIGlmIHdlIGFyZSBpbiBhIGRvdWJsZSBleGNlcHRpb24uICovCisKKwlsMzJpCWEwLCBhMiwgUFRfREVQQworCV9iZ2V1aQlhMCwgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTLCBmYXN0X2NvcHJvY2Vzc29yX2RvdWJsZQorCisJLyogU2F2ZSBzb21lIHJlZ2lzdGVycyBhMSwgYTMsIGE0LCBTQVIgKi8KKworCXhzcglhMywgRVhDU0FWRV8xCisJczMyaQlhMywgYTIsIFBUX0FSRUczCisJcnNyCWEzLCBTQVIKKwlzMzJpCWE0LCBhMiwgUFRfQVJFRzQKKwlzMzJpCWExLCBhMiwgUFRfQVJFRzEKKwlzMzJpCWE1LCBhMSwgUFRfQVJFRzUKKwlzMzJpCWEzLCBhMiwgUFRfU0FSCisJbW92CWExLCBhMgorCisJLyogQ3VycmVudGx5LCB0aGUgSEFMIG1hY3JvcyBvbmx5IGd1YXJhbnRlZSBzYXZpbmcgYTAgYW5kIGExLgorCSAqIFRoZXNlIGNhbiBhbmQgd2lsbCBiZSByZWZpbmVkIGluIHRoZSBmdXR1cmUsIGJ1dCBmb3Igbm93LAorCSAqIGp1c3Qgc2F2ZSB0aGUgcmVtYWluaW5nIHJlZ2lzdGVycyBvZiBhMi4uLmExNS4KKwkgKi8KKwlzMzJpCWE2LCBhMSwgUFRfQVJFRzYKKwlzMzJpCWE3LCBhMSwgUFRfQVJFRzcKKwlzMzJpCWE4LCBhMSwgUFRfQVJFRzgKKwlzMzJpCWE5LCBhMSwgUFRfQVJFRzkKKwlzMzJpCWExMCwgYTEsIFBUX0FSRUcxMAorCXMzMmkJYTExLCBhMSwgUFRfQVJFRzExCisJczMyaQlhMTIsIGExLCBQVF9BUkVHMTIKKwlzMzJpCWExMywgYTEsIFBUX0FSRUcxMworCXMzMmkJYTE0LCBhMSwgUFRfQVJFRzE0CisJczMyaQlhMTUsIGExLCBQVF9BUkVHMTUKKworCS8qIEZpbmQgY29wcm9jZXNzb3IgbnVtYmVyLiBTdWJ0cmFjdCBmaXJzdCBDUCBFWENDQVVTRSBmcm9tIEVYQ0NBVVNFICovCisKKwlyc3IJYTAsIEVYQ0NBVVNFCisJYWRkaQlhMywgYTAsIC1YQ0hBTF9FWENDQVVTRV9DT1BST0NFU1NPUjBfRElTQUJMRUQKKworCS8qIFNldCBjb3JyZXNwb25kaW5nIENQRU5BQkxFIGJpdCAqLworCisJbW92aQlhNCwgMQorCXNzbAlhMwkJCSMgU0FSOiAzMiAtIGNvcHJvY2Vzc29yX251bWJlcgorCXJzcglhNSwgQ1BFTkFCTEUKKwlzbGwJYTQsIGE0CisJb3IJYTQsIGE1LCBhNAorCXdzcglhNCwgQ1BFTkFCTEUKKwlyc3luYworCW1vdmkJYTUsIGNvcHJvY2Vzc29yX2luZm8JIyBsaXN0IG9mIG93bmVyIGFuZCBvZmZzZXQgaW50byBjcF9zYXZlCisJYWRkeDgJYTAsIGE0LCBhNQkJIyBlbnRyeSBmb3IgQ1AKKworCWJuZQlhNCwgYTUsIC5MbG9hZAkJIyBiaXQgd2Fzbid0IHNldCBiZWZvcmUsIGNwIG5vdCBpbiB1c2UKKworCS8qIE5vdyBjb21wYXJlIHRoZSBjdXJyZW50IHRhc2sgd2l0aCB0aGUgb3duZXIgb2YgdGhlIGNvcHJvY2Vzc29yLgorCSAqIElmIHRoZXkgYXJlIHRoZSBzYW1lLCB0aGVyZSBpcyBubyByZWFzb24gdG8gc2F2ZSBvciByZXN0b3JlIGFueQorCSAqIGNvcHJvY2Vzc29yIHN0YXRlLiBIYXZpbmcgYWxyZWFkeSBlbmFibGVkIHRoZSBjb3Byb2Nlc3NvciwKKwkgKiBicmFuY2ggYWhlYWQgdG8gcmV0dXJuLgorCSAqLworCUdFVF9DVVJSRU5UKGE1LGExKQorCWwzMmkJYTQsIGEwLCBDT1BST0NFU1NPUl9JTkZPX09XTkVSCSMgYTQ6IGN1cnJlbnQgb3duZXIgZm9yIHRoaXMgQ1AKKwliZXEJYTQsIGE1LCAuTGRvbmUKKworCS8qIEZpbmQgbG9jYXRpb24gdG8gZHVtcCBjdXJyZW50IGNvcHJvY2Vzc29yIHN0YXRlOgorCSAqICB0YXNrX3N0cnVjdC0+dGFza19jcF9zYXZlX29mZnNldCArIGNvcHJvY2Vzc29yX29mZnNldFtjb3Byb2Nlc3Nvcl0KKwkgKgorCSAqIE5vdGU6IGEwIHBvaW50ZXIgdG8gdGhlIGVudHJ5IGluIHRoZSBjb3Byb2Nlc3NvciBvd25lciB0YWJsZSwKKwkgKgkgYTMgY29wcm9jZXNzb3IgbnVtYmVyLAorICAgICAgICAgKgkgYTQgY3VycmVudCBvd25lciBvZiBjb3Byb2Nlc3Nvci4KKwkgKi8KKwlsMzJpCWE1LCBhMCwgQ09QUk9DRVNTT1JfSU5GT19PRkZTRVQKKwlhZGRpCWEyLCBhNCwgVEhSRUFEX0NQX1NBVkUKKwlhZGQJYTIsIGEyLCBhNQorCisJLyogU3RvcmUgY3VycmVudCBjb3Byb2Nlc3NvciBzdGF0ZXMuIChhNSBzdGlsbCBoYXMgQ1AgbnVtYmVyKSAqLworCisJeGNoYWxfY3BpX3N0b3JlX2Z1bmNib2R5CisKKwkvKiBUaGUgbWFjcm8gbWlnaHQgaGF2ZSBkZXN0cm95ZWQgYTMgKGNvcHJvY2Vzc29yIG51bWJlciksIGJ1dAorCSAqIFNBUiBzdGlsbCBoYXMgMzIgLSBjb3Byb2Nlc3Nvcl9udW1iZXIhCisJICovCisJbW92aQlhMywgMzIKKwlyc3IJYTQsIFNBUgorCXN1YglhMywgYTMsIGE0CisKKy5MbG9hZDoJLyogQSBuZXcgdGFzayBub3cgb3ducyB0aGUgY29ycG9jZXNzb3JzLiBTYXZlIGl0cyBUQ0IgcG9pbnRlciBpbnRvCisJICogdGhlIGNvcHJvY2Vzc29yIG93bmVyIHRhYmxlLgorCSAqCisJICogTm90ZTogYTAgcG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIGNvcHJvY2Vzc29yIG93bmVyIHRhYmxlLAorCSAqCSBhMyBjb3Byb2Nlc3NvciBudW1iZXIuCisJICovCisJR0VUX0NVUlJFTlQoYTQsYTEpCisJczMyaQlhNCwgYTAsIDAKKworCS8qIEZpbmQgbG9jYXRpb24gZnJvbSB3aGVyZSB0byByZXN0b3JlIHRoZSBjdXJyZW50IGNvcHJvY2Vzc29yIHN0YXRlLiovCisKKwlsMzJpCWE1LCBhMCwgQ09QUk9DRVNTT1JfSU5GT19PRkZTRVQKKwlhZGRpCWEyLCBhNCwgVEhSRUFEX0NQX1NBVkUKKwlhZGQJYTIsIGEyLCBhNAorCisJeGNoYWxfY3BpX2xvYWRfZnVuY2JvZHkKKworCS8qIFdlIG11c3QgYXNzdW1lIHRoYXQgdGhlIHhjaGFsX2NwaV9zdG9yZV9mdW5jYm9keSBtYWNybyBkZXN0cm95ZWQKKwkgKiByZWdpc3RlcnMgYTIuLmExNS4KKwkgKi8KKworLkxkb25lOglsMzJpCWExNSwgYTEsIFBUX0FSRUcxNQorCWwzMmkJYTE0LCBhMSwgUFRfQVJFRzE0CisJbDMyaQlhMTMsIGExLCBQVF9BUkVHMTMKKwlsMzJpCWExMiwgYTEsIFBUX0FSRUcxMgorCWwzMmkJYTExLCBhMSwgUFRfQVJFRzExCisJbDMyaQlhMTAsIGExLCBQVF9BUkVHMTAKKwlsMzJpCWE5LCBhMSwgUFRfQVJFRzkKKwlsMzJpCWE4LCBhMSwgUFRfQVJFRzgKKwlsMzJpCWE3LCBhMSwgUFRfQVJFRzcKKwlsMzJpCWE2LCBhMSwgUFRfQVJFRzYKKwlsMzJpCWE1LCBhMSwgUFRfQVJFRzUKKwlsMzJpCWE0LCBhMSwgUFRfQVJFRzQKKwlsMzJpCWEzLCBhMSwgUFRfQVJFRzMKKwlsMzJpCWEyLCBhMSwgUFRfQVJFRzIKKwlsMzJpCWEwLCBhMSwgUFRfQVJFRzAKKwlsMzJpCWExLCBhMSwgUFRfQVJFRzEKKworCXJmZQorCisjZW5kaWYgLyogWENIQUxfRVhUUkFfU0FfU0laRSAqLworCisvKgorICogVGFzayBzd2l0Y2guCisgKgorICogc3RydWN0IHRhc2sqICBfc3dpdGNoX3RvIChzdHJ1Y3QgdGFzayogcHJldiwgc3RydWN0IHRhc2sqIG5leHQpCisgKiAgICAgICAgIGEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIgICAgICAgICAgICAgICAgIGEzCisgKi8KKworRU5UUlkoX3N3aXRjaF90bykKKworCWVudHJ5CWExLCAxNgorCisJbW92CWE0LCBhMwkJCSMgcHJlc2VydmUgYTMKKworCXMzMmkJYTAsIGEyLCBUSFJFQURfUkEJIyBzYXZlIHJldHVybiBhZGRyZXNzCisJczMyaQlhMSwgYTIsIFRIUkVBRF9TUAkjIHNhdmUgc3RhY2sgcG9pbnRlcgorCisJLyogRGlzYWJsZSBpbnRzIHdoaWxlIHdlIG1hbmlwdWxhdGUgdGhlIHN0YWNrIHBvaW50ZXI7IHNwaWxsIHJlZ3MuICovCisKKwltb3ZpCWE1LCBQU19FWENNX01BU0sgfCBMT0NLTEVWRUwKKwl4c3IJYTUsIFBTCisJcnNyCWEzLCBFWENTQVZFXzEKKwlyc3luYworCXMzMmkJYTMsIGEzLCBFWENfVEFCTEVfRklYVVAJLyogZW50ZXIgY3JpdGljYWwgc2VjdGlvbiAqLworCisJY2FsbDAJX3NwaWxsX3JlZ2lzdGVycworCisJLyogU2V0IGtlcm5lbCBzdGFjayAoYW5kIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24pCisJICogTm90ZTogSXQncyBzYXZlIHRvIHNldCBpdCBoZXJlLiBUaGUgc3RhY2sgd2lsbCBub3QgYmUgb3ZlcndyaXR0ZW4KKwkgKiAgICAgICBiZWNhdXNlIHRoZSBrZXJuZWwgc3RhY2sgd2lsbCBvbmx5IGJlIGxvYWRlZCBhZ2FpbiBhZnRlcgorCSAqICAgICAgIHdlIHJldHVybiBmcm9tIGtlcm5lbCBzcGFjZS4KKwkgKi8KKworCWwzMmkJYTAsIGE0LCBUQVNLX1RIUkVBRF9JTkZPCisJcnNyCWEzLCBFWENTQVZFXzEJCSMgZXhjX3RhYmxlCisJbW92aQlhMSwgMAorCWFkZGkJYTAsIGEwLCBQVF9SRUdTX09GRlNFVAorCXMzMmkJYTEsIGEzLCBFWENfVEFCTEVfRklYVVAKKwlzMzJpCWEwLCBhMywgRVhDX1RBQkxFX0tTVEsKKworCS8qIHJlc3RvcmUgY29udGV4dCBvZiB0aGUgdGFzayB0aGF0ICduZXh0JyBhZGRyZXNzZXMgKi8KKworCWwzMmkJYTAsIGE0LCBUSFJFQURfUkEJLyogcmVzdG9yZSByZXR1cm4gYWRkcmVzcyAqLworCWwzMmkJYTEsIGE0LCBUSFJFQURfU1AJLyogcmVzdG9yZSBzdGFjayBwb2ludGVyICovCisKKwl3c3IJYTUsIFBTCisJcnN5bmMKKworCXJldHcKKworCitFTlRSWShyZXRfZnJvbV9mb3JrKQorCisJLyogdm9pZCBzY2hlZHVsZV90YWlsIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCisJICogTm90ZTogcHJldiBpcyBzdGlsbCBpbiBhNiAocmV0dXJuIHZhbHVlIGZyb20gZmFrZSBjYWxsNCBmcmFtZSkKKwkgKi8KKwltb3ZpCWE0LCBzY2hlZHVsZV90YWlsCisJY2FsbHg0CWE0CisKKwltb3ZpCWE0LCBkb19zeXNjYWxsX3RyYWNlCisJY2FsbHg0CWE0CisKKwlqCWNvbW1vbl9leGNlcHRpb25fcmV0dXJuCisKKworCisvKgorICogVGFibGUgb2Ygc3lzY2FsbHMKKyAqLworCisuZGF0YQorLmFsaWduICA0CisuZ2xvYmFsIHN5c19jYWxsX3RhYmxlCitzeXNfY2FsbF90YWJsZToKKworI2RlZmluZSBTWVNDQUxMKGNhbGwsIG5hcmcpIC53b3JkIGNhbGwKKyNpbmNsdWRlICJzeXNjYWxscy5oIgorCisvKgorICogTnVtYmVyIG9mIGFyZ3VtZW50cyBvZiBlYWNoIHN5c2NhbGwKKyAqLworCisuZ2xvYmFsIHN5c19uYXJnX3RhYmxlCitzeXNfbmFyZ190YWJsZToKKworI3VuZGVmIFNZU0NBTEwKKyNkZWZpbmUgU1lTQ0FMTChjYWxsLCBuYXJnKSAuYnl0ZSBuYXJnCisjaW5jbHVkZSAic3lzY2FsbHMuaCIKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2hlYWQuUyBiL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5YjUyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9oZWFkLlMKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvaGVhZC5TCisgKgorICogWHRlbnNhIFByb2Nlc3NvciBzdGFydHVwIGNvZGUuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqIE1hcmMgR2F1dGhpZXIgPG1hcmNAdGVuc2lsaWNhLmNvbSwgbWFyY0BhbHVtbmkudXdhdGVybG9vLmNhPgorICogSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICogS2V2aW4gQ2hlYQorICovCisKKyNpbmNsdWRlIDx4dGVuc2EvY2FjaGVhc20uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworLyoKKyAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBlbnRyeSBjb2RlIGZvciBrZXJuZWwgaW1hZ2VzLiBJdCBwZXJmb3JtcyB0aGUKKyAqIG1pbmltYWwgc2V0dXAgbmVlZGVkIHRvIGNhbGwgdGhlIGdlbmVyaWMgQyByb3V0aW5lcy4KKyAqCisgKiBQcmVyZXF1aXNpdGVzOgorICoKKyAqIC0gVGhlIGtlcm5lbCBpbWFnZSBoYXMgYmVlbiBsb2FkZWQgdG8gdGhlIGFjdHVhbCBhZGRyZXNzIHdoZXJlIGl0IHdhcworICogICBjb21waWxlZCB0by4KKyAqIC0gYTIgY29udGFpbnMgZWl0aGVyIDAgb3IgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBib290IHBhcmFtZXRlcnMuCisgKiAgIChzZWUgc2V0dXAuYyBmb3IgbW9yZSBkZXRhaWxzKQorICoKKyAqLworCisJLm1hY3JvCWl0ZXJhdGUJZnJvbSwgdG8gLCBjbWQKKwkJLmlmZXEJKChcdG8gLSBcZnJvbSkgJiB+MHhmZmYpCisJCQlcY21kCVxmcm9tCisJCQlpdGVyYXRlICIoXGZyb20rMSkiLCBcdG8sIFxjbWQKKwkJLmVuZGlmCisJLmVuZG0KKworLyoKKyAqICBfc3RhcnQKKyAqCisgKiAgVGhlIGJvb3Rsb2FkZXIgcGFzc2VzIGEgcG9pbnRlciB0byBhIGxpc3Qgb2YgYm9vdCBwYXJhbWV0ZXJzIGluIGEyLgorICovCisKKwkvKiBUaGUgZmlyc3QgYnl0ZXMgb2YgdGhlIGtlcm5lbCBpbWFnZSBtdXN0IGJlIGFuIGluc3RydWN0aW9uLCBzbyB3ZQorCSAqIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCBkZWZpbmUgdGhlIGxpdGVyYWwgY29uc3RhbnQgd2UgbmVlZCBmb3IgYSBqeAorCSAqIGluc3RydWN0aW9uLgorCSAqLworCisJLnNlY3Rpb24gLmhlYWQudGV4dCwgImF4IgorCS5nbG9ibCBfc3RhcnQKK19zdGFydDoJX2oJMmYKKwkuYWxpZ24JNAorMToJLndvcmQJX3N0YXJ0dXAKKzI6CWwzMnIJYTAsIDFiCisJangJYTAKKworCS50ZXh0CisJLmFsaWduIDQKK19zdGFydHVwOgorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBleGNlcHRpb25zLiAqLworCisJbW92aQlhMCwgWENIQUxfUFNfRVhDTV9NQVNLCisJd3NyCWEwLCBQUworCisJLyogUHJlc2VydmUgdGhlIHBvaW50ZXIgdG8gdGhlIGJvb3QgcGFyYW1ldGVyIGxpc3QgaW4gRVhDU0FWRV8xICovCisKKwl3c3IJYTIsIEVYQ1NBVkVfMQorCisJLyogU3RhcnQgd2l0aCBhIGZyZXNoIHdpbmRvd2Jhc2UgYW5kIHdpbmRvd3N0YXJ0LiAgKi8KKworCW1vdmkJYTEsIDEKKwltb3ZpCWEwLCAwCisJd3NyCWExLCBXSU5ET1dTVEFSVAorCXdzcglhMCwgV0lORE9XQkFTRQorCXJzeW5jCisKKwkvKiBTZXQgYTAgdG8gMCBmb3IgdGhlIHJlbWFpbmluZyBpbml0aWFsaXphdGlvbi4gKi8KKworCW1vdmkJYTAsIDAKKworCS8qIENsZWFyIGRlYnVnZ2luZyByZWdpc3RlcnMuICovCisKKyNpZiBYQ0hBTF9IQVZFX0RFQlVHCisJd3NyCWEwLCBJQlJFQUtFTkFCTEUKKwl3c3IJYTAsIElDT1VOVAorCW1vdmkJYTEsIDE1CisJd3NyCWEwLCBJQ09VTlRMRVZFTAorCisJLm1hY3JvIHJlc2V0X2RicmVhayBudW0KKwl3c3IJYTAsIERCUkVBS0MgKyBcbnVtCisJLmVuZG0KKworICAgICAgICBpdGVyYXRlIDAsIFhDSEFMX05VTV9JQlJFQUstMSwgcmVzZXRfZGJyZWFrCisjZW5kaWYKKworCS8qIENsZWFyIENDT1VOVCAobm90IHJlYWxseSBuZWNlc3NhcnksIGJ1dCBuaWNlKSAqLworCisJd3NyCWEwLCBDQ09VTlQJIyBub3QgcmVhbGx5IG5lY2Vzc2FyeSwgYnV0IG5pY2UKKworCS8qIERpc2FibGUgemVyby1sb29wcy4gKi8KKworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwl3c3IJYTAsIExDT1VOVAorI2VuZGlmCisKKwkvKiBEaXNhYmxlIGFsbCB0aW1lcnMuICovCisKKwkubWFjcm8JcmVzZXRfdGltZXIJbnVtCisJd3NyCWEwLCBDQ09NUEFSRV8wICsgXG51bQorCS5lbmRtCisJaXRlcmF0ZQkwLCBYQ0hBTF9OVU1fVElNRVJTLTEsIHJlc2V0X3RpbWVyCisKKwkvKiBJbnRlcnJ1cHQgaW5pdGlhbGl6YXRpb24uICovCisKKwltb3ZpCWEyLCBYQ0hBTF9JTlRUWVBFX01BU0tfU09GVFdBUkUgfCBYQ0hBTF9JTlRUWVBFX01BU0tfRVhURVJOX0VER0UKKwl3c3IJYTAsIElOVEVOQUJMRQorCXdzcglhMiwgSU5UQ0xFQVIKKworCS8qIERpc2FibGUgY29wcm9jZXNzb3JzLiAqLworCisjaWYgWENIQUxfQ1BfTlVNID4gMAorCXdzcglhMCwgQ1BFTkFCTEUKKyNlbmRpZgorCisJLyogU2V0IFBTLklOVExFVkVMPTEsIFBTLldPRT0wLCBrZXJuZWwgc3RhY2ssIFBTLkVYQ009MAorCSAqCisJICogTm90ZTogUFMuRVhDTSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHVzaW5nIGFueSBsb29wCisJICoJIGluc3RydWN0aW9uczsgb3RoZXJ3aXNlLCB0aGV5IGFyZSBzaWxlbnRseSBkaXNhYmxlZCwgYW5kCisJICogCSBhdCBtb3N0IG9uZSBpdGVyYXRpb24gb2YgdGhlIGxvb3AgaXMgZXhlY3V0ZWQuCisJICovCisKKwltb3ZpCWExLCAxCisJd3NyCWExLCBQUworCXJzeW5jCisKKwkvKiAgSW5pdGlhbGl6ZSB0aGUgY2FjaGVzLgorCSAqICBEb2VzIG5vdCBpbmNsdWRlIGZsdXNoaW5nIHdyaXRlYmFjayBkLWNhY2hlLgorCSAqICBhNiwgYTcgYXJlIGp1c3Qgd29ya2luZyByZWdpc3RlcnMgKGNsb2JiZXJlZCkuCisJICovCisKKwlpY2FjaGVfcmVzZXQgIGEyLCBhMworCWRjYWNoZV9yZXNldCAgYTIsIGEzCisKKwkvKiBVbnBhY2sgZGF0YSBzZWN0aW9ucworCSAqCisJICogVGhlIGxpbmtlciBzY3JpcHQgdXNlZCB0byBidWlsZCB0aGUgTGludXgga2VybmVsIGltYWdlCisJICogY3JlYXRlcyBhIHRhYmxlIGxvY2F0ZWQgYXQgX19ib290X3JlbG9jX3RhYmxlX3N0YXJ0CisJICogdGhhdCBjb250YW5zIHRoZSBpbmZvcm1hdGlvbiB3aGF0IGRhdGEgbmVlZHMgdG8gYmUgdW5wYWNrZWQuCisJICoKKwkgKiBVc2VzIGEyLWE3LgorCSAqLworCisJbW92aQlhMiwgX19ib290X3JlbG9jX3RhYmxlX3N0YXJ0CisJbW92aQlhMywgX19ib290X3JlbG9jX3RhYmxlX2VuZAorCisxOgliZXEJYTIsIGEzLCAzZgkjIG5vIG1vcmUgZW50cmllcz8KKwlsMzJpCWE0LCBhMiwgMAkjIHN0YXJ0IGRlc3RpbmF0aW9uIChpbiBSQU0pCisJbDMyaQlhNSwgYTIsIDQJIyBlbmQgZGVzaW5hdGlvbiAoaW4gUkFNKQorCWwzMmkJYTYsIGEyLCA4CSMgc3RhcnQgc291cmNlIChpbiBST00pCisJYWRkaQlhMiwgYTIsIDEyCSMgbmV4dCBlbnRyeQorCWJlcQlhNCwgYTUsIDFiCSMgc2tpcCwgZW1wdHkgZW50cnkKKwliZXEJYTQsIGE2LCAxYgkjIHNraXAsIHNvdXJjZSBhbmQgZGVzdC4gYXJlIHRoZSBzYW1lCisKKzI6CWwzMmkJYTcsIGE2LCAwCSMgbG9hZCB3b3JkCisJYWRkaQlhNiwgYTYsIDQKKwlzMzJpCWE3LCBhNCwgMAkjIHN0b3JlIHdvcmQKKwlhZGRpCWE0LCBhNCwgNAorCWJsdHUJYTQsIGE1LCAyYgorCWoJMWIKKworMzoKKwkvKiBBbGwgY29kZSBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBzZWdtZW50cyBoYXZlIGJlZW4gY29waWVkLgorCSAqIE5vdyBjbGVhciB0aGUgQlNTIHNlZ21lbnQuCisJICovCisKKwltb3ZpCWEyLCBfYnNzX3N0YXJ0CSMgc3RhcnQgb2YgQlNTCisJbW92aQlhMywgX2Jzc19lbmQJIyBlbmQgb2YgQlNTCisKKzE6CWFkZGkJYTIsIGEyLCA0CisJczMyaQlhMCwgYTIsIDAKKwlibHQJYTIsIGEzLCAxYgorCisjaWYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworCisJLyogQWZ0ZXIgdW5wYWNraW5nLCBmbHVzaCB0aGUgd3JpdGViYWNrIGNhY2hlIHRvIG1lbW9yeSBzbyB0aGUKKwkgKiBpbnN0cnVjdGlvbnMvZGF0YSBhcmUgYXZhaWxhYmxlLgorCSAqLworCisJZGNhY2hlX3dyaXRlYmFja19hbGwJYTIsIGEzCisjZW5kaWYKKworCS8qIFNldHVwIHN0YWNrIGFuZCBlbmFibGUgd2luZG93IGV4Y2VwdGlvbnMgKGtlZXAgaXJxcyBkaXNhYmxlZCkgKi8KKworCW1vdmkJYTEsIGluaXRfdGhyZWFkX3VuaW9uCisJYWRkaQlhMSwgYTEsIEtFUk5FTF9TVEFDS19TSVpFCisKKwltb3ZpCWEyLCAweDAwMDQwMDAxCQkjIFdPRT0xLCBJTlRMRVZFTD0xLCBVTT0wCisJd3NyCWEyLCBQUwkJCSMgKGVuYWJsZSByZWctd2luZG93czsgcHJvZ21vZGUgc3RhY2spCisJcnN5bmMKKworCS8qIFNldCB1cCBFWENTQVZFW0RFQlVHTEVWRUxdIHRvIHBvaW50IHRvIHRoZSBEZWJ1ZyBFeGNlcHRpb24gSGFuZGxlci4qLworCisJbW92aQlhMiwgZGVidWdfZXhjZXB0aW9uCisJd3NyCWEyLCBFWENTQVZFICsgWENIQUxfREVCVUdMRVZFTAorCisJLyogU2V0IHVwIEVYQ1NBVkVbMV0gdG8gcG9pbnQgdG8gdGhlIGV4Y190YWJsZS4gKi8KKworCW1vdmkJYTYsIGV4Y190YWJsZQorCXhzcglhNiwgRVhDU0FWRV8xCisKKwkvKiBpbml0X2FyY2gga2ljay1zdGFydHMgdGhlIGxpbnV4IGtlcm5lbCAqLworCisJbW92aQlhNCwgaW5pdF9hcmNoCisJY2FsbHg0CWE0CisKKwltb3ZpCWE0LCBzdGFydF9rZXJuZWwKKwljYWxseDQJYTQKKworc2hvdWxkX25ldmVyX3JldHVybjoKKwlqCXNob3VsZF9uZXZlcl9yZXR1cm4KKworCS8qIERlZmluZSBzb21lIGNvbW1vbiBkYXRhIHN0cnVjdHVyZXMgaGVyZS4gIFdlIGRlZmluZSB0aGVtCisJICogaGVyZSBpbiB0aGlzIGFzc2VtYmx5IGZpbGUgZHVlIHRvIHRoZWlyIHVudXN1YWwgYWxpZ25tZW50CisJICogcmVxdWlyZW1lbnRzLgorCSAqLworCisJLmNvbW0gICBzd2FwcGVyX3BnX2RpcixQQUdFX1NJWkUsUEFHRV9TSVpFCisJLmNvbW0JZW1wdHlfYmFkX3BhZ2VfdGFibGUsUEFHRV9TSVpFLFBBR0VfU0laRQorCS5jb21tCWVtcHR5X2JhZF9wYWdlLFBBR0VfU0laRSxQQUdFX1NJWkUKKwkuY29tbQllbXB0eV96ZXJvX3BhZ2UsUEFHRV9TSVpFLFBBR0VfU0laRQorCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiZjZkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIGxpbnV4L2FyY2gveHRlbnNhL2tlcm5lbC9pcnEuYworICoKKyAqIFh0ZW5zYSBidWlsdC1pbiBpbnRlcnJ1cHQgY29udHJvbGxlciBhbmQgc29tZSBnZW5lcmljIGZ1bmN0aW9ucyBjb3BpZWQKKyAqIGZyb20gaTM4Ni4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA1IFRlbnNpbGljYSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk4IExpbnVzIFRvcnZhbGRzLCBJbmdvIE1vbG5hcgorICoKKyAqCisgKiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKiBLZXZpbiBDaGVhCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS5oPgorCitzdGF0aWMgdm9pZCBlbmFibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIGRpc2FibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja194dGVuc2EodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBlbmRfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjYWNoZWRfaXJxX21hc2s7CisKK2F0b21pY190IGlycV9lcnJfY291bnQ7CisKKy8qCisgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KKyAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgorICovCit2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisgICAgICAgICAgcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOworfQorCisvKgorICogZG9fSVJRIGhhbmRsZXMgYWxsIG5vcm1hbCBkZXZpY2UgSVJRJ3MgKHRoZSBzcGVjaWFsCisgKiBTTVAgY3Jvc3MtQ1BVIGludGVycnVwdHMgaGF2ZSB0aGVpciBvd24gc3BlY2lmaWMKKyAqIGhhbmRsZXJzKS4KKyAqLworCit1bnNpZ25lZCBpbnQgIGRvX0lSUShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpcnFfZW50ZXIoKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XCisJLyogRGVidWdnaW5nIGNoZWNrIGZvciBzdGFjayBvdmVyZmxvdzogaXMgdGhlcmUgbGVzcyB0aGFuIDFLQiBmcmVlPyAqLworCXsKKwkJdW5zaWduZWQgbG9uZyBzcDsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdiAlMCwgYTFcbiIgOiAiPWEiIChzcCkpOworCQlzcCAmPSBUSFJFQURfU0laRSAtIDE7CisKKwkJaWYgKHVubGlrZWx5KHNwIDwgKHNpemVvZih0aHJlYWRfaW5mbykgKyAxMDI0KSkpCisJCQlwcmludGsoIlN0YWNrIG92ZXJmbG93IGluIGRvX0lSUTogJWxkXG4iLAorCQkJICAgICAgIHNwIC0gc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpOworCX0KKyNlbmRpZgorCisJX19kb19JUlEoaXJxLCByZWdzKTsKKworCWlycV9leGl0KCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEdlbmVyaWMsIGNvbnRyb2xsZXItaW5kZXBlbmRlbnQgZnVuY3Rpb25zOgorICovCisKK2ludCBzaG93X2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCWludCBpID0gKihsb2ZmX3QgKikgdiwgajsKKwlzdHJ1Y3QgaXJxYWN0aW9uICogYWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaSA9PSAwKSB7CisJCXNlcV9wcmludGYocCwgIiAgICAgICAgICAgIik7CisJCWZvciAoaj0wOyBqPE5SX0NQVVM7IGorKykKKwkJCWlmIChjcHVfb25saW5lKGopKQorCQkJCXNlcV9wcmludGYocCwgIkNQVSVkICAgICAgICIsaik7CisJCXNlcV9wdXRjKHAsICdcbicpOworCX0KKworCWlmIChpIDwgTlJfSVJRUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOworCQlhY3Rpb24gPSBpcnFfZGVzY1tpXS5hY3Rpb247CisJCWlmICghYWN0aW9uKQorCQkJZ290byBza2lwOworCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsaSk7CisjaWZuZGVmIENPTkZJR19TTVAKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9pcnFzKGkpKTsKKyNlbHNlCisJCWZvciAoaiA9IDA7IGogPCBOUl9DUFVTOyBqKyspCisJCQlpZiAoY3B1X29ubGluZShqKSkKKwkJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGtzdGF0X2NwdShqKS5pcnFzW2ldKTsKKyNlbmRpZgorCQlzZXFfcHJpbnRmKHAsICIgJTE0cyIsIGlycV9kZXNjW2ldLmhhbmRsZXItPnR5cGVuYW1lKTsKKwkJc2VxX3ByaW50ZihwLCAiICAlcyIsIGFjdGlvbi0+bmFtZSk7CisKKwkJZm9yIChhY3Rpb249YWN0aW9uLT5uZXh0OyBhY3Rpb247IGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkKKwkJCXNlcV9wcmludGYocCwgIiwgJXMiLCBhY3Rpb24tPm5hbWUpOworCisJCXNlcV9wdXRjKHAsICdcbicpOworc2tpcDoKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOworCX0gZWxzZSBpZiAoaSA9PSBOUl9JUlFTKSB7CisJCXNlcV9wcmludGYocCwgIk5NSTogIik7CisJCWZvciAoaiA9IDA7IGogPCBOUl9DUFVTOyBqKyspCisJCQlpZiAoY3B1X29ubGluZShqKSkKKwkJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIG5taV9jb3VudChqKSk7CisJCXNlcV9wdXRjKHAsICdcbicpOworCQlzZXFfcHJpbnRmKHAsICJFUlI6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CisJfQorCXJldHVybiAwOworfQorLyogc2h1dGRvd24gaXMgc2FtZSBhcyAiZGlzYWJsZSIgKi8KKyNkZWZpbmUgc2h1dGRvd25feHRlbnNhX2lycSBkaXNhYmxlX3h0ZW5zYV9pcnEKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3h0ZW5zYV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwllbmFibGVfeHRlbnNhX2lycShpcnEpOworCXJldHVybiAwOyAgICAgICAgICAgICAgIC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KK30KKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSB4dGVuc2FfaXJxX3R5cGUgPSB7CisJIlh0ZW5zYS1JUlEiLAorCXN0YXJ0dXBfeHRlbnNhX2lycSwKKwlzaHV0ZG93bl94dGVuc2FfaXJxLAorCWVuYWJsZV94dGVuc2FfaXJxLAorCWRpc2FibGVfeHRlbnNhX2lycSwKKwltYXNrX2FuZF9hY2tfeHRlbnNhLAorCWVuZF94dGVuc2FfaXJxCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwljYWNoZWRfaXJxX21hc2sgJj0gfigxIDw8IGlycSk7CisJc2V0X3NyIChjYWNoZWRfaXJxX21hc2ssIElOVEVOQUJMRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJY2FjaGVkX2lycV9tYXNrIHw9IDEgPDwgaXJxOworCXNldF9zciAoY2FjaGVkX2lycV9tYXNrLCBJTlRFTkFCTEUpOworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX3h0ZW5zYV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCW1hc2tfaXJxKGlycSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfeHRlbnNhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJdW5tYXNrX2lycShpcnEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX3h0ZW5zYSh1bnNpZ25lZCBpbnQgaXJxKQoreworICAgICAgICBkaXNhYmxlX3h0ZW5zYV9pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgZW5kX3h0ZW5zYV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKyAgICAgICAgZW5hYmxlX3h0ZW5zYV9pcnEoaXJxKTsKK30KKworCit2b2lkIF9faW5pdCBpbml0X0lSUSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBYVEVOU0FfTlJfSVJRUzsgaSsrKQorCQlpcnFfZGVzY1tpXS5oYW5kbGVyID0gJnh0ZW5zYV9pcnFfdHlwZTsKKworCWNhY2hlZF9pcnFfbWFzayA9IDA7CisKKwlwbGF0Zm9ybV9pbml0X2lycSgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL21vZHVsZS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjgzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvbW9kdWxlLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC9wbGF0Zm9ybS5jCisgKgorICogTW9kdWxlIHN1cHBvcnQuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZWxvYWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisKK0xJU1RfSEVBRChtb2R1bGVfYnVmX2xpc3QpOworCit2b2lkICptb2R1bGVfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQoreworICBwYW5pYygibW9kdWxlX2FsbG9jIG5vdCBpbXBsZW1lbnRlZCIpOworfQorCit2b2lkIG1vZHVsZV9mcmVlKHN0cnVjdCBtb2R1bGUgKm1vZCwgdm9pZCAqbW9kdWxlX3JlZ2lvbikKK3sKKyAgcGFuaWMoIm1vZHVsZV9mcmVlIG5vdCBpbXBsZW1lbnRlZCIpOworfQorCitpbnQgbW9kdWxlX2Zyb2JfYXJjaF9zZWN0aW9ucyhFbGYzMl9FaGRyICpoZHIsCisgICAgCQkJICAgICAgRWxmMzJfU2hkciAqc2VjaGRycywKKwkJCSAgICAgIGNoYXIgKnNlY3N0cmluZ3MsCisJCQkgICAgICBzdHJ1Y3QgbW9kdWxlICptZSkKK3sKKyAgcGFuaWMoIm1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMgbm90IGltcGxlbWVudGVkIik7Cit9CisKK2ludCBhcHBseV9yZWxvY2F0ZShFbGYzMl9TaGRyICpzZWNoZHJzLAorICAgIAkJICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICB1bnNpZ25lZCBpbnQgc3ltaW5kZXgsCisJCSAgIHVuc2lnbmVkIGludCByZWxzZWMsCisJCSAgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKyAgcGFuaWMgKCJhcHBseV9yZWxvY2F0ZSBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworaW50IGFwcGx5X3JlbG9jYXRlX2FkZChFbGYzMl9TaGRyICpzZWNoZHJzLAorCQkgICAgICAgY29uc3QgY2hhciAqc3RydGFiLAorCQkgICAgICAgdW5zaWduZWQgaW50IHN5bWluZGV4LAorCQkgICAgICAgdW5zaWduZWQgaW50IHJlbHNlYywKKwkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKyAgcGFuaWMoImFwcGx5X3JlbG9jYXRlX2FkZCBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworaW50IG1vZHVsZV9maW5hbGl6ZShjb25zdCBFbGZfRWhkciAqaGRyLAorICAgIAkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkgICAgc3RydWN0IG1vZHVsZSAqbWUpCit7CisgIHBhbmljICgibW9kdWxlX2ZpbmFsaXplIG5vdCBpbXBsZW1lbnRlZCIpOworfQorCit2b2lkIG1vZHVsZV9hcmNoX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQoreworICBwYW5pYygibW9kdWxlX2FyY2hfY2xlYW51cCBub3QgaW1wbGVtZW50ZWQiKTsKK30KKworc3RydWN0IGJ1Z19lbnRyeSAqbW9kdWxlX2ZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKK3sKKyAgcGFuaWMoIm1vZHVsZV9maW5kX2J1ZyBub3QgaW1wbGVtZW50ZWQiKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmRlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLWRtYS5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9wY2ktZG1hLmMKKyAqCisgKiBETUEgY29oZXJlbnQgbWVtb3J5IGFsbG9jYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogQmFzZWQgb24gdmVyc2lvbiBmb3IgaTM4Ni4KKyAqCisgKiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKiBKb2UgVGF5bG9yIDxqb2VAdGVuc2lsaWNhLmNvbSwgam9ldHlsckB5YWhvby5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisvKgorICogTm90ZTogV2UgYXNzdW1lIHRoYXQgdGhlIGZ1bGwgbWVtb3J5IHNwYWNlIGlzIGFsd2F5cyBtYXBwZWQgdG8gJ2tzZWcnCisgKgkgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gdXNlIHBhZ2UgYXR0cmlidXRlcyAobm90IGltcGxlbWVudGVkKS4KKyAqLworCit2b2lkICoKK2RtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUsIGludCBnZnApCit7CisJdm9pZCAqcmV0OworCisJLyogaWdub3JlIHJlZ2lvbiBzcGVpY2lmaWVycyAqLworCWdmcCAmPSB+KF9fR0ZQX0RNQSB8IF9fR0ZQX0hJR0hNRU0pOworCisJaWYgKGRldiA9PSBOVUxMIHx8ICgqZGV2LT5kbWFfbWFzayA8IDB4ZmZmZmZmZmYpKQorCQlnZnAgfD0gR0ZQX0RNQTsKKwlyZXQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoc2l6ZSkpOworCisJaWYgKHJldCAhPSBOVUxMKSB7CisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCQkqaGFuZGxlID0gdmlydF90b19idXMocmV0KTsKKwl9CisJcmV0dXJuICh2b2lkKikgQllQQVNTX0FERFIoKHVuc2lnbmVkIGxvbmcpcmV0KTsKK30KKwordm9pZCBkbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCisJCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKK3sKKwlmcmVlX3BhZ2VzKENBQ0hFRF9BRERSKCh1bnNpZ25lZCBsb25nKXZhZGRyKSwgZ2V0X29yZGVyKHNpemUpKTsKK30KKworCit2b2lkIGNvbnNpc3RlbnRfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJc3dpdGNoIChkaXJlY3Rpb24pIHsKKwljYXNlIFBDSV9ETUFfTk9ORToKKwkJQlVHKCk7CisJY2FzZSBQQ0lfRE1BX0ZST01ERVZJQ0U6ICAgICAgICAvKiBpbnZhbGlkYXRlIG9ubHkgKi8KKwkJX19pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl2YWRkciwKKwkJCQkgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZSk7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfRE1BX1RPREVWSUNFOiAgICAgICAgICAvKiB3cml0ZWJhY2sgb25seSAqLworCWNhc2UgUENJX0RNQV9CSURJUkVDVElPTkFMOiAgICAgLyogd3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlICovCisJCV9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpdmFkZHIsCisJCQkJICAgIAkJKHVuc2lnbmVkIGxvbmcpc2l6ZSk7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg4N2M5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3BjaS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogYXJjaC94dGVuc2EvcGNpYmlvcy5jCisgKgorICogUENJIGJpb3MtdHlwZSBpbml0aWFsaXNhdGlvbiBmb3IgUENJIG1hY2hpbmVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIEJhc2VkIGxhcmdlbHkgb24gd29yayBmcm9tIENvcnQgKHBwYy9rZXJuZWwvcGNpLmMpCisgKiBJTyBmdW5jdGlvbnMgY29waWVkIGZyb20gc3BhcmMuCisgKgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtLmg+CisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayh4KQorI2Vsc2UKKyNkZWZpbmUgREJHKHguLi4pCisjZW5kaWYKKworLyogUENJIENvbnRyb2xsZXIgKi8KKworCisvKgorICogcGNpYmlvc19hbGxvY19jb250cm9sbGVyCisgKiBwY2liaW9zX2VuYWJsZV9kZXZpY2UKKyAqIHBjaWJpb3NfZml4dXBzCisgKiBwY2liaW9zX2FsaWduX3Jlc291cmNlCisgKiBwY2liaW9zX2ZpeHVwX2J1cworICogcGNpYmlvc19zZXR1cAorICogcGNpX2J1c19hZGRfZGV2aWNlCisgKiBwY2lfbW1hcF9wYWdlX3JhbmdlCisgKi8KKworc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2lfY3RybF9oZWFkOworc3RydWN0IHBjaV9jb250cm9sbGVyKiogcGNpX2N0cmxfdGFpbCA9ICZwY2lfY3RybF9oZWFkOworCitzdGF0aWMgaW50IHBjaV9idXNfY291bnQ7CisKKy8qCisgKiBXZSBuZWVkIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBgbWlycm9yZWQnIFZHQSBwb3J0cworICogYW5kIG90aGVyIHN0cmFuZ2UgSVNBIGhhcmR3YXJlLCBzbyB3ZSBhbHdheXMgd2FudCB0aGUKKyAqIGFkZHJlc3NlcyB0byBiZSBhbGxvY2F0ZWQgaW4gdGhlIDB4MDAwLTB4MGZmIHJlZ2lvbgorICogbW9kdWxvIDB4NDAwLgorICoKKyAqIFdoeT8gQmVjYXVzZSBzb21lIHNpbGx5IGV4dGVybmFsIElPIGNhcmRzIG9ubHkgZGVjb2RlCisgKiB0aGUgbG93IDEwIGJpdHMgb2YgdGhlIElPIGFkZHJlc3MuIFRoZSAweDAwLTB4ZmYgcmVnaW9uCisgKiBpcyByZXNlcnZlZCBmb3IgbW90aGVyYm9hcmQgZGV2aWNlcyB0aGF0IGRlY29kZSBhbGwgMTYKKyAqIGJpdHMsIHNvIGl0J3Mgb2sgdG8gYWxsb2NhdGUgYXQsIHNheSwgMHgyODAwLTB4MjhmZiwKKyAqIGJ1dCB3ZSB3YW50IHRvIHRyeSB0byBhdm9pZCBhbGxvY2F0aW5nIGF0IDB4MjkwMC0weDJiZmYKKyAqIHdoaWNoIG1pZ2h0IGhhdmUgYmUgbWlycm9yZWQgYXQgMHgwMTAwLTB4MDNmZi4uCisgKi8KK3ZvaWQKK3BjaWJpb3NfYWxpZ25fcmVzb3VyY2Uodm9pZCAqZGF0YSwgc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFsaWduKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBkYXRhOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSByZXMtPnN0YXJ0OworCisJCWlmIChzaXplID4gMHgxMDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBJL08gUmVnaW9uICVzLyVkIHRvbyBsYXJnZSIKKwkJCSAgICAgICAiICglbGQgYnl0ZXMpXG4iLCBwY2lfbmFtZShkZXYpLAorCQkJICAgICAgIGRldi0+cmVzb3VyY2UgLSByZXMsIHNpemUpOworCQl9CisKKwkJaWYgKHN0YXJ0ICYgMHgzMDApIHsKKwkJCXN0YXJ0ID0gKHN0YXJ0ICsgMHgzZmYpICYgfjB4M2ZmOworCQkJcmVzLT5zdGFydCA9IHN0YXJ0OworCQl9CisJfQorfQorCitpbnQKK3BjaWJpb3NfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwl1MTYgY21kLCBvbGRfY21kOworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJb2xkX2NtZCA9IGNtZDsKKwlmb3IoaWR4PTA7IGlkeDw2OyBpZHgrKykgeworCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJaWYgKCFyLT5zdGFydCAmJiByLT5lbmQpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSAiCisJCQkJIm9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCX0KKwlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkKKwkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKKwlpZiAoY21kICE9IG9sZF9jbWQpIHsKKwkJcHJpbnRrKCJQQ0k6IEVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwKKwkJCXBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHBjaV9jb250cm9sbGVyICogX19pbml0IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcih2b2lkKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpX2N0cmw7CisKKwlwY2lfY3RybCA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilhbGxvY19ib290bWVtKHNpemVvZigqcGNpX2N0cmwpKTsKKwltZW1zZXQocGNpX2N0cmwsIDAsIHNpemVvZihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIpKTsKKworCSpwY2lfY3RybF90YWlsID0gcGNpX2N0cmw7CisJcGNpX2N0cmxfdGFpbCA9ICZwY2lfY3RybC0+bmV4dDsKKworCXJldHVybiBwY2lfY3RybDsKK30KKworc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwY2lfY3RybDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCWludCBuZXh0X2J1c25vID0gMCwgaTsKKworCXByaW50aygiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CisKKwkvKiBTY2FuIGFsbCBvZiB0aGUgcmVjb3JkZWQgUENJIGNvbnRyb2xsZXJzLiAgKi8KKwlmb3IgKHBjaV9jdHJsID0gcGNpX2N0cmxfaGVhZDsgcGNpX2N0cmw7IHBjaV9jdHJsID0gcGNpX2N0cmwtPm5leHQpIHsKKwkJcGNpX2N0cmwtPmxhc3RfYnVzbm8gPSAweGZmOworCQlidXMgPSBwY2lfc2Nhbl9idXMocGNpX2N0cmwtPmZpcnN0X2J1c25vLCBwY2lfY3RybC0+b3BzLAorCQkJCSAgIHBjaV9jdHJsKTsKKwkJaWYgKHBjaV9jdHJsLT5pb19yZXNvdXJjZS5mbGFncykgeworCQkJdW5zaWduZWQgbG9uZyBvZmZzOworCisJCQlvZmZzID0gKHVuc2lnbmVkIGxvbmcpcGNpX2N0cmwtPmlvX3NwYWNlLmJhc2U7CisJCQlwY2lfY3RybC0+aW9fcmVzb3VyY2Uuc3RhcnQgKz0gb2ZmczsKKwkJCXBjaV9jdHJsLT5pb19yZXNvdXJjZS5lbmQgKz0gb2ZmczsKKwkJCWJ1cy0+cmVzb3VyY2VbMF0gPSAmcGNpX2N0cmwtPmlvX3Jlc291cmNlOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisJCQlpZiAocGNpX2N0cmwtPm1lbV9yZXNvdXJjZXNbaV0uZmxhZ3MpCisJCQkJYnVzLT5yZXNvdXJjZVtpKzFdID0mcGNpX2N0cmwtPm1lbV9yZXNvdXJjZXNbaV07CisJCXBjaV9jdHJsLT5idXMgPSBidXM7CisJCXBjaV9jdHJsLT5sYXN0X2J1c25vID0gYnVzLT5zdWJvcmRpbmF0ZTsKKwkJaWYgKG5leHRfYnVzbm8gPD0gcGNpX2N0cmwtPmxhc3RfYnVzbm8pCisJCQluZXh0X2J1c25vID0gcGNpX2N0cmwtPmxhc3RfYnVzbm8rMTsKKwl9CisJcGNpX2J1c19jb3VudCA9IG5leHRfYnVzbm87CisKKwlyZXR1cm4gcGxhdGZvcm1fcGNpYmlvc19maXh1cCgpOworfQorCitzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKKwordm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9jdHJsID0gYnVzLT5zeXNkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGxvbmcgaW9fb2Zmc2V0OworCWludCBpOworCisJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpcGNpX2N0cmwtPmlvX3NwYWNlLmJhc2U7CisJaWYgKGJ1cy0+cGFyZW50ID09IE5VTEwpIHsKKwkJLyogdGhpcyBpcyBhIGhvc3QgYnJpZGdlIC0gZmlsbCBpbiBpdHMgcmVzb3VyY2VzICovCisJCXBjaV9jdHJsLT5idXMgPSBidXM7CisKKwkJYnVzLT5yZXNvdXJjZVswXSA9IHJlcyA9ICZwY2lfY3RybC0+aW9fcmVzb3VyY2U7CisJCWlmICghcmVzLT5mbGFncykgeworCQkJaWYgKGlvX29mZnNldCkKKwkJCQlwcmludGsgKEtFUk5fRVJSICJJL08gcmVzb3VyY2Ugbm90IHNldCBmb3IgaG9zdCIKKwkJCQkJIiBicmlkZ2UgJWRcbiIsIHBjaV9jdHJsLT5pbmRleCk7CisJCQlyZXMtPnN0YXJ0ID0gMDsKKwkJCXJlcy0+ZW5kID0gSU9fU1BBQ0VfTElNSVQ7CisJCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJfQorCQlyZXMtPnN0YXJ0ICs9IGlvX29mZnNldDsKKwkJcmVzLT5lbmQgKz0gaW9fb2Zmc2V0OworCisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXJlcyA9ICZwY2lfY3RybC0+bWVtX3Jlc291cmNlc1tpXTsKKwkJCWlmICghcmVzLT5mbGFncykgeworCQkJCWlmIChpID4gMCkKKwkJCQkJY29udGludWU7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgcmVzb3VyY2Ugbm90IHNldCBmb3IgIgorCQkJCSAgICAgICAiaG9zdCBicmlkZ2UgJWRcbiIsIHBjaV9jdHJsLT5pbmRleCk7CisJCQkJcmVzLT5zdGFydCA9IDA7CisJCQkJcmVzLT5lbmQgPSB+MFU7CisJCQkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQkJfQorCQkJYnVzLT5yZXNvdXJjZVtpKzFdID0gcmVzOworCQl9CisJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyBhIHN1Ym9yZGluYXRlIGJyaWRnZSAqLworCQlwY2lfcmVhZF9icmlkZ2VfYmFzZXMoYnVzKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQlpZiAoKHJlcyA9IGJ1cy0+cmVzb3VyY2VbaV0pID09IE5VTEwgfHwgIXJlcy0+ZmxhZ3MpCisJCQkJY29udGludWU7CisJCQlpZiAoaW9fb2Zmc2V0ICYmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJCQlyZXMtPnN0YXJ0ICs9IGlvX29mZnNldDsKKwkJCQlyZXMtPmVuZCArPSBpb19vZmZzZXQ7CisJCQl9CisJCX0KKwl9Cit9CisKK2NoYXIgX19pbml0ICpwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gc3RyOworfQorCisvKiB0aGUgbmV4dCBvbmUgaXMgc3RvbGVuIGZyb20gdGhlIGFscGhhIHBvcnQuLi4gKi8KKwordm9pZCBfX2luaXQKK3BjaWJpb3NfdXBkYXRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaXJxKQoreworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgaXJxKTsKK30KKworaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKK3sKKwl1MTYgY21kLCBvbGRfY21kOworCWludCBpZHg7CisJc3RydWN0IHJlc291cmNlICpyOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7CisJb2xkX2NtZCA9IGNtZDsKKwlmb3IgKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKKwkJciA9ICZkZXYtPnJlc291cmNlW2lkeF07CisJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSAiCisJCQkgICAgICAgIm9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCWNtZCB8PSBQQ0lfQ09NTUFORF9JTzsKKwkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOworCX0KKwlpZiAoY21kICE9IG9sZF9jbWQpIHsKKwkJcHJpbnRrKCJQQ0k6IEVuYWJsaW5nIGRldmljZSAlcyAoJTA0eCAtPiAlMDR4KVxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldiksIG9sZF9jbWQsIGNtZCk7CisJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBjbWQpOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKworLyoKKyAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIFBDSSBjb250cm9sbGVyIGZvciBkZXZpY2UgcGRldi4KKyAqLworCitpbnQKK3BjaV9jb250cm9sbGVyX251bShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqcGNpX2N0cmwgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyKikgZGV2LT5zeXNkYXRhOworCXJldHVybiBwY2lfY3RybC0+aW5kZXg7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCisvKgorICogUGxhdGZvcm0gc3VwcG9ydCBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbW1hcCgpcywKKyAqIG1vZGVsbGVkIG9uIHRoZSBzcGFyYzY0IGltcGxlbWVudGF0aW9uIGJ5IERhdmUgTWlsbGVyLgorICogIC0tIHBhdWx1cy4KKyAqLworCisvKgorICogQWRqdXN0IHZtX3Bnb2ZmIG9mIFZNQSBzdWNoIHRoYXQgaXQgaXMgdGhlIHBoeXNpY2FsIHBhZ2Ugb2Zmc2V0CisgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAzMi1iaXQgcGNpIGJ1cyBvZmZzZXQgZm9yIERFViByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIuCisgKgorICogQmFzaWNhbGx5LCB0aGUgdXNlciBmaW5kcyB0aGUgYmFzZSBhZGRyZXNzIGZvciBoaXMgZGV2aWNlIHdoaWNoIGhlIHdpc2hlcworICogdG8gbW1hcC4gIFRoZXkgcmVhZCB0aGUgMzItYml0IHZhbHVlIGZyb20gdGhlIGNvbmZpZyBzcGFjZSBiYXNlIHJlZ2lzdGVyLAorICogYWRkIHdoYXRldmVyIFBBR0VfU0laRSBtdWx0aXBsZSBvZmZzZXQgdGhleSB3aXNoLCBhbmQgZmVlZCB0aGlzIGludG8gdGhlCisgKiBvZmZzZXQgcGFyYW1ldGVyIG9mIG1tYXAgb24gL3Byb2MvYnVzL3BjaS9YWFggZm9yIHRoYXQgZGV2aWNlLgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLCB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludAorX19wY2lfbW1hcF9tYWtlX29mZnNldChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9jdHJsID0gKHN0cnVjdCBwY2lfY29udHJvbGxlciopIGRldi0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIGlvX29mZnNldCA9IDA7CisJaW50IGksIHJlc19iaXQ7CisKKwlpZiAocGNpX2N0cmwgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisKKwkvKiBJZiBtZW1vcnksIGFkZCBvbiB0aGUgUENJIGJyaWRnZSBhZGRyZXNzIG9mZnNldCAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX21lbSkgeworCQlyZXNfYml0ID0gSU9SRVNPVVJDRV9NRU07CisJfSBlbHNlIHsKKwkJaW9fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpcGNpX2N0cmwtPmlvX3NwYWNlLmJhc2U7CisJCW9mZnNldCArPSBpb19vZmZzZXQ7CisJCXJlc19iaXQgPSBJT1JFU09VUkNFX0lPOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHJlcXVlc3RlZCBjb3JyZXNwb25kcyB0byBvbmUgb2YgdGhlCisJICogcmVzb3VyY2VzIG9mIHRoZSBkZXZpY2UuCisJICovCisJZm9yIChpID0gMDsgaSA8PSBQQ0lfUk9NX1JFU09VUkNFOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpycCA9ICZkZXYtPnJlc291cmNlW2ldOworCQlpbnQgZmxhZ3MgPSBycC0+ZmxhZ3M7CisKKwkJLyogdHJlYXQgUk9NIGFzIG1lbW9yeSAoc2hvdWxkIGJlIGFscmVhZHkpICovCisJCWlmIChpID09IFBDSV9ST01fUkVTT1VSQ0UpCisJCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKKworCQkvKiBBY3RpdmUgYW5kIHNhbWUgdHlwZT8gKi8KKwkJaWYgKChmbGFncyAmIHJlc19iaXQpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBJbiB0aGUgcmFuZ2Ugb2YgdGhpcyByZXNvdXJjZT8gKi8KKwkJaWYgKG9mZnNldCA8IChycC0+c3RhcnQgJiBQQUdFX01BU0spIHx8IG9mZnNldCA+IHJwLT5lbmQpCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCBpdCEgY29uc3RydWN0IHRoZSBmaW5hbCBwaHlzaWNhbCBhZGRyZXNzICovCisJCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQorCQkJb2Zmc2V0ICs9IHBjaV9jdHJsLT5pb19zcGFjZS5zdGFydCAtIGlvX29mZnNldDsKKwkJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFNldCB2bV9mbGFncyBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpIGRldmljZQorICogbWFwcGluZy4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorX19wY2lfbW1hcF9zZXRfZmxhZ3Moc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQoreworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87Cit9CisKKy8qCisgKiBTZXQgdm1fcGFnZV9wcm90IG9mIFZNQSwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLCBmb3IgYSBwY2kKKyAqIGRldmljZSBtYXBwaW5nLgorICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitfX3BjaV9tbWFwX3NldF9wZ3Byb3Qoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCit7CisJaW50IHByb3QgPSBwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCS8qIFNldCB0byB3cml0ZS10aHJvdWdoICovCisJcHJvdCAmPSB+X1BBR0VfTk9fQ0FDSEU7CisjaWYgMAorCWlmICghd3JpdGVfY29tYmluZSkKKwkJcHJvdCB8PSBfUEFHRV9XUklURVRIUlU7CisjZW5kaWYKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IF9fcGdwcm90KHByb3QpOworfQorCisvKgorICogUGVyZm9ybSB0aGUgYWN0dWFsIHJlbWFwIG9mIHRoZSBwYWdlcyBmb3IgYSBQQ0kgZGV2aWNlIG1hcHBpbmcsIGFzCisgKiBhcHByb3ByaWF0ZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICBUaGUgcmVnaW9uIGluIHRoZSBwcm9jZXNzIHRvIG1hcAorICogaXMgZGVzY3JpYmVkIGJ5IHZtX3N0YXJ0IGFuZCB2bV9lbmQgbWVtYmVycyBvZiBWTUEsIHRoZSBiYXNlIHBoeXNpY2FsCisgKiBhZGRyZXNzIGlzIGZvdW5kIGluIHZtX3Bnb2ZmLgorICogVGhlIHBjaSBkZXZpY2Ugc3RydWN0dXJlIGlzIHByb3ZpZGVkIHNvIHRoYXQgYXJjaGl0ZWN0dXJlcyBtYXkgbWFrZSBtYXBwaW5nCisgKiBkZWNpc2lvbnMgb24gYSBwZXItZGV2aWNlIG9yIHBlci1idXMgYmFzaXMuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSwgemVybyBvbiBzdWNjZXNzLgorICovCitpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwKKwkJCWludCB3cml0ZV9jb21iaW5lKQoreworCWludCByZXQ7CisKKwlyZXQgPSBfX3BjaV9tbWFwX21ha2Vfb2Zmc2V0KGRldiwgdm1hLCBtbWFwX3N0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCV9fcGNpX21tYXBfc2V0X2ZsYWdzKGRldiwgdm1hLCBtbWFwX3N0YXRlKTsKKwlfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCB2bWEsIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOworCisJcmV0ID0gaW9fcmVtYXBfcGFnZV9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmY8PFBBR0VfU0hJRlQsCisJCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBwcm9iYWJseSBiZWxvbmdzIGhlcmUgcmF0aGVyIHRoYW4gaW9wb3J0LmMgYmVjYXVzZQorICogd2UgZG8gbm90IHdhbnQgdGhpcyBjcnVkIGxpbmtlZCBpbnRvIFNCdXMga2VybmVscy4KKyAqIEFsc28sIHRoaW5rIGZvciBhIG1vbWVudCBhYm91dCBsaWtlcyBvZiBmbG9wcHkuYyB0aGF0CisgKiBpbmNsdWRlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBwYXJ0cy4gVGhleSBtYXkgd2FudCB0byByZWRlZmluZSBpbnMvb3V0cy4KKyAqCisgKiBXZSBkbyBub3QgdXNlIGhvcnJvYmxlIG1hY3Jvc2VzIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvCisgKiBhZHZhbmNlIHBvaW50ZXIgYnkgc2l6ZW9mKHNpemUpLgorICovCit2b2lkIG91dHNiKHVuc2lnbmVkIGxvbmcgYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KSB7CisgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgIGNvdW50IC09IDE7CisgICAgICAgICAgICAgICAgd3JpdGViKCooY29uc3QgY2hhciAqKXNyYywgYWRkcik7CisgICAgICAgICAgICAgICAgc3JjICs9IDE7CisgICAgICAgICAgICAgICAgYWRkciArPSAxOworICAgICAgICB9Cit9CisKK3ZvaWQgb3V0c3codW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpIHsKKyAgICAgICAgd2hpbGUgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgY291bnQgLT0gMjsKKyAgICAgICAgICAgICAgICB3cml0ZXcoKihjb25zdCBzaG9ydCAqKXNyYywgYWRkcik7CisgICAgICAgICAgICAgICAgc3JjICs9IDI7CisgICAgICAgICAgICAgICAgYWRkciArPSAyOworICAgICAgICB9Cit9CisKK3ZvaWQgb3V0c2wodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpIHsKKyAgICAgICAgd2hpbGUgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgY291bnQgLT0gNDsKKyAgICAgICAgICAgICAgICB3cml0ZWwoKihjb25zdCBsb25nICopc3JjLCBhZGRyKTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gNDsKKyAgICAgICAgICAgICAgICBhZGRyICs9IDQ7CisgICAgICAgIH0KK30KKwordm9pZCBpbnNiKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KSB7CisgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgIGNvdW50IC09IDE7CisgICAgICAgICAgICAgICAgKih1bnNpZ25lZCBjaGFyICopZHN0ID0gcmVhZGIoYWRkcik7CisgICAgICAgICAgICAgICAgZHN0ICs9IDE7CisgICAgICAgICAgICAgICAgYWRkciArPSAxOworICAgICAgICB9Cit9CisKK3ZvaWQgaW5zdyh1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkgeworICAgICAgICB3aGlsZSAoY291bnQpIHsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSAyOworICAgICAgICAgICAgICAgICoodW5zaWduZWQgc2hvcnQgKilkc3QgPSByZWFkdyhhZGRyKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gMjsKKyAgICAgICAgICAgICAgICBhZGRyICs9IDI7CisgICAgICAgIH0KK30KKwordm9pZCBpbnNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KSB7CisgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgIGNvdW50IC09IDQ7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBYWFggSSBhbSBzdXJlIHdlIGFyZSBpbiBmb3IgYW4gdW5hbGlnbmVkIHRyYXAgaGVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAqKHVuc2lnbmVkIGxvbmcgKilkc3QgPSByZWFkbChhZGRyKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gNDsKKyAgICAgICAgICAgICAgICBhZGRyICs9IDQ7CisgICAgICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wbGF0Zm9ybS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxMzYyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvcGxhdGZvcm0uYworICoKKyAqIERlZmF1bHQgcGxhdGZvcm0gZnVuY3Rpb25zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisKKyNkZWZpbmUgX0YocixmLGEsYikJCQkJCQkJXAorCXIgX19wbGF0Zm9ybV8jI2YgYSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKwlyIHBsYXRmb3JtXyMjZiBhIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJfX3BsYXRmb3JtXyIjZikpKQorCisvKgorICogRGVmYXVsdCBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBpZiBubyBwbGF0Zm9ybSBzcGVjaWZpYyBmdW5jdGlvbiBpcyBkZWZpbmVkLgorICogKFBsZWFzZSwgcmVmZXIgdG8gaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmggZm9yIG1vcmUgaW5mb3JtYXRpb24pCisgKi8KKworX0Yodm9pZCwgc2V0dXAsIChjaGFyKiogY21kKSwgeyB9KTsKK19GKHZvaWQsIGluaXRfaXJxLCAodm9pZCksIHsgfSk7CitfRih2b2lkLCByZXN0YXJ0LCAodm9pZCksIHsgd2hpbGUoMSk7IH0pOworX0Yodm9pZCwgaGFsdCwgKHZvaWQpLCB7IHdoaWxlKDEpOyB9KTsKK19GKHZvaWQsIHBvd2VyX29mZiwgKHZvaWQpLCB7IHdoaWxlKDEpOyB9KTsKK19GKHZvaWQsIGlkbGUsICh2b2lkKSwgeyBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndhaXRpIDAiIDo6OiAibWVtb3J5Iik7IH0pOworX0Yodm9pZCwgaGVhcnRiZWF0LCAodm9pZCksIHsgfSk7CitfRihpbnQsICBwY2liaW9zX2ZpeHVwLCAodm9pZCksIHsgcmV0dXJuIDA7IH0pOworX0YoaW50LCBnZXRfcnRjX3RpbWUsICh0aW1lX3QqIHQpLCB7IHJldHVybiAwOyB9KTsKK19GKGludCwgc2V0X3J0Y190aW1lLCAodGltZV90IHQpLCB7IHJldHVybiAwOyB9KTsKKworI2lmIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAorX0Yodm9pZCwgY2FsaWJyYXRlX2Njb3VudCwgKHZvaWQpLAoreworICBwcmludGsgKCJFUlJPUjogQ2Fubm90IGNhbGlicmF0ZSBjcHUgZnJlcXVlbmN5ISBBc3N1bWluZyAxMDBNSHouXG4iKTsKKyAgY2NvdW50X3Blcl9qaWZmeSA9IDEwMCAqICgxMDAwMDAwVUwvSFopOworfSk7CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5OTcwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8vIFRPRE8JdmVyaWZ5IGNvcHJvY2Vzc29yIGhhbmRsaW5nCisvKgorICogYXJjaC94dGVuc2Eva2VybmVsL3Byb2Nlc3MuYworICoKKyAqIFh0ZW5zYSBQcm9jZXNzb3IgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICogTWFyYyBHYXV0aGllciA8bWFyY0B0ZW5zaWxpY2EuY29tLCBtYXJjQGFsdW1uaS51d2F0ZXJsb28uY2E+CisgKiBLZXZpbiBDaGVhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21xdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KKworZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBmc19zdHJ1Y3QgaW5pdF9mcyA9IElOSVRfRlM7CitzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCBpbml0X2ZpbGVzID0gSU5JVF9GSUxFUzsKK3N0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKK3N0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7CitzdHJ1Y3QgbW1fc3RydWN0IGluaXRfbW0gPSBJTklUX01NKGluaXRfbW0pOworRVhQT1JUX1NZTUJPTChpbml0X21tKTsKKwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uCisJX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhLmluaXRfdGFzayIpKSkgPQoreyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKKworc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzayA9IElOSVRfVEFTSyhpbml0X3Rhc2spOworRVhQT1JUX1NZTUJPTChpbml0X3Rhc2spOworCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnJlbnRfc2V0W05SX0NQVVNdID0geyZpbml0X3Rhc2ssIH07CisKKworI2lmIFhDSEFMX0NQX05VTSA+IDAKKworLyoKKyAqIENvcHJvY2Vzc29yIG93bmVyc2hpcC4KKyAqLworCitjb3Byb2Nlc3Nvcl9pbmZvX3QgY29wcm9jZXNzb3JfaW5mb1tdID0geworCXsgMCwgWFRFTlNBX0NQRV9DUDBfT0ZGU0VUIH0sCisJeyAwLCBYVEVOU0FfQ1BFX0NQMV9PRkZTRVQgfSwKKwl7IDAsIFhURU5TQV9DUEVfQ1AyX09GRlNFVCB9LAorCXsgMCwgWFRFTlNBX0NQRV9DUDNfT0ZGU0VUIH0sCisJeyAwLCBYVEVOU0FfQ1BFX0NQNF9PRkZTRVQgfSwKKwl7IDAsIFhURU5TQV9DUEVfQ1A1X09GRlNFVCB9LAorCXsgMCwgWFRFTlNBX0NQRV9DUDZfT0ZGU0VUIH0sCisJeyAwLCBYVEVOU0FfQ1BFX0NQN19PRkZTRVQgfSwKK307CisKKyNlbmRpZgorCisvKgorICogUG93ZXJtYW5hZ2VtZW50IGlkbGUgZnVuY3Rpb24sIGlmIGFueSBpcyBwcm92aWRlZCBieSB0aGUgcGxhdGZvcm0uCisgKi8KKwordm9pZCBjcHVfaWRsZSh2b2lkKQoreworICAJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQorCQkJcGxhdGZvcm1faWRsZSgpOworCQlwcmVlbXB0X2VuYWJsZSgpOworCQlzY2hlZHVsZSgpOworCX0KK30KKworLyoKKyAqIEZyZWUgY3VycmVudCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzIGV0Yy4uCisgKi8KKwordm9pZCBleGl0X3RocmVhZCh2b2lkKQoreworCXJlbGVhc2VfY29wcm9jZXNzb3JzKGN1cnJlbnQpOwkvKiBFbXB0eSBtYWNybyBpZiBubyBDUHMgYXJlIGRlZmluZWQgKi8KK30KKwordm9pZCBmbHVzaF90aHJlYWQodm9pZCkKK3sKKwlyZWxlYXNlX2NvcHJvY2Vzc29ycyhjdXJyZW50KTsJLyogRW1wdHkgbWFjcm8gaWYgbm8gQ1BzIGFyZSBkZWZpbmVkICovCit9CisKKy8qCisgKiBDb3B5IHRocmVhZC4KKyAqCisgKiBUaGUgc3RhY2sgbGF5b3V0IGZvciB0aGUgbmV3IHRocmVhZCBsb29rcyBsaWtlIHRoaXM6CisgKgorICoJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgPC0gc3AgaW4gY2hpbGRyZWdzICg9IHRvcykKKyAqCXwgICAgICAgY2hpbGRyZWdzICAgICAgICB8CisgKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyA8LSB0aHJlYWQuc3AgPSBzcCBpbiBkdW1teS1mcmFtZQorICoJfCAgICAgIGR1bW15LWZyYW1lICAgICAgIHwgICAgKHNhdmVkIGluIGR1bW15LWZyYW1lIHNwaWxsLWFyZWEpCisgKgkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFdlIGNyZWF0ZSBhIGR1bW15IGZyYW1lIHRvIHJldHVybiB0byByZXRfZnJvbV9mb3JrOgorICogICBhMCBwb2ludHMgdG8gcmV0X2Zyb21fZm9yayAoc2ltdWxhdGluZyBhIGNhbGw0KQorICogICBzcCBwb2ludHMgdG8gaXRzZWxmICh0aHJlYWQuc3ApCisgKiAgIGEyLCBhMyBhcmUgdW51c2VkLgorICoKKyAqIE5vdGU6IFRoaXMgaXMgYSBwcmlzdGluZSBmcmFtZSwgc28gd2UgZG9uJ3QgbmVlZCBhbnkgc3BpbGwgcmVnaW9uIG9uIHRvcCBvZgorICogICAgICAgY2hpbGRyZWdzLgorICovCisKK2ludCBjb3B5X3RocmVhZChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgdXNwLAorCQl1bnNpZ25lZCBsb25nIHVudXNlZCwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKmNoaWxkcmVnczsKKwl1bnNpZ25lZCBsb25nIHRvczsKKwlpbnQgdXNlcl9tb2RlID0gdXNlcl9tb2RlKHJlZ3MpOworCisJLyogU2V0IHVwIG5ldyBUU1MuICovCisJdG9zID0gKHVuc2lnbmVkIGxvbmcpcC0+dGhyZWFkX2luZm8gKyBUSFJFQURfU0laRTsKKwlpZiAodXNlcl9tb2RlKQorCQljaGlsZHJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MqKSh0b3MgLSBQVF9VU0VSX1NJWkUpOworCWVsc2UKKwkJY2hpbGRyZWdzID0gKHN0cnVjdCBwdF9yZWdzKil0b3MgLSAxOworCisJKmNoaWxkcmVncyA9ICpyZWdzOworCisJLyogQ3JlYXRlIGEgY2FsbDQgZHVtbXktZnJhbWU6IGEwID0gMCwgYTEgPSBjaGlsZHJlZ3MuICovCisJKigoaW50KiljaGlsZHJlZ3MgLSAzKSA9ICh1bnNpZ25lZCBsb25nKWNoaWxkcmVnczsKKwkqKChpbnQqKWNoaWxkcmVncyAtIDQpID0gMDsKKworCWNoaWxkcmVncy0+YXJlZ1sxXSA9IHRvczsKKwljaGlsZHJlZ3MtPmFyZWdbMl0gPSAwOworCXAtPnNldF9jaGlsZF90aWQgPSBwLT5jbGVhcl9jaGlsZF90aWQgPSBOVUxMOworCXAtPnRocmVhZC5yYSA9IE1BS0VfUkFfRk9SX0NBTEwoKHVuc2lnbmVkIGxvbmcpcmV0X2Zyb21fZm9yaywgMHgxKTsKKwlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZyljaGlsZHJlZ3M7CisJaWYgKHVzZXJfbW9kZShyZWdzKSkgeworCisJCWludCBsZW4gPSBjaGlsZHJlZ3MtPndtYXNrICYgfjB4ZjsKKwkJY2hpbGRyZWdzLT5hcmVnWzFdID0gdXNwOworCQltZW1jcHkoJmNoaWxkcmVncy0+YXJlZ1tYQ0hBTF9OVU1fQVJFR1MgLSBsZW4vNF0sCisJCSAgICAgICAmcmVncy0+YXJlZ1tYQ0hBTF9OVU1fQVJFR1MgLSBsZW4vNF0sIGxlbik7CisKKwkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQorCQkJY2hpbGRyZWdzLT5hcmVnWzJdID0gY2hpbGRyZWdzLT5hcmVnWzZdOworCisJfSBlbHNlIHsKKwkJLyogSW4ga2VybmVsIHNwYWNlLCB3ZSBzdGFydCBhIG5ldyB0aHJlYWQgd2l0aCBhIG5ldyBzdGFjay4gKi8KKwkJY2hpbGRyZWdzLT53bWFzayA9IDE7CisJfQorCXJldHVybiAwOworfQorCisKKy8qCisgKiBDcmVhdGUgYSBrZXJuZWwgdGhyZWFkCisgKi8KKworaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJbG9uZyByZXR2YWw7CisJX19hc21fXyBfX3ZvbGF0aWxlX18KKwkJKCJtb3YgICAgICAgICAgIGE1LCAlNFxuXHQiIC8qIHByZXNlcnZlIGZuIGluIGE1ICovCisJCSAibW92ICAgICAgICAgICBhNiwgJTNcblx0IiAvKiBwcmVzZXJ2ZSBhbmQgc2V0dXAgYXJnIGluIGE2ICovCisJCSAibW92aQkJYTIsICUxXG5cdCIgLyogbG9hZCBfX05SX2Nsb25lIGZvciBzeXNjYWxsKi8KKwkJICJtb3YJCWEzLCBzcFxuXHQiIC8qIHNwIGNoZWNrIGFuZCBzeXNfY2xvbmUgKi8KKwkJICJtb3YJCWE0LCAlNVxuXHQiIC8qIGxvYWQgZmxhZ3MgZm9yIHN5c2NhbGwgKi8KKwkJICJzeXNjYWxsXG5cdCIKKwkJICJiZXEJCWEzLCBzcCwgMWZcblx0IiAvKiBicmFuY2ggaWYgcGFyZW50ICovCisJCSAiY2FsbHg0CWE1XG5cdCIgICAgIC8qIGNhbGwgZm4gKi8KKwkJICJtb3ZpCQlhMiwgJTJcblx0IiAvKiBsb2FkIF9fTlJfZXhpdCBmb3Igc3lzY2FsbCAqLworCQkgIm1vdgkJYTMsIGE2XG5cdCIgLyogbG9hZCBmbiByZXR1cm4gdmFsdWUgKi8KKwkJICJzeXNjYWxsXG4iCisJCSAiMTpcblx0IgorCQkgIm1vdgkJJTAsIGEyXG5cdCIgLyogcGFyZW50IHJldHVybnMgemVybyAqLworCQkgOiI9ciIgKHJldHZhbCkKKwkJIDoiaSIgKF9fTlJfY2xvbmUpLCAiaSIgKF9fTlJfZXhpdCksCisJCSAiciIgKGFyZyksICJyIiAoZm4pLAorCQkgInIiIChmbGFncyB8IENMT05FX1ZNKQorCQkgOiAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAiYTYiICk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKgorICogVGhlc2UgYnJhY2tldCB0aGUgc2xlZXBpbmcgZnVuY3Rpb25zLi4KKyAqLworCit1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJdW5zaWduZWQgbG9uZyBzcCwgcGM7CisJdW5zaWduZWQgbG9uZyBzdGFja19wYWdlID0gKHVuc2lnbmVkIGxvbmcpIHAtPnRocmVhZF9pbmZvOworCWludCBjb3VudCA9IDA7CisKKwlpZiAoIXAgfHwgcCA9PSBjdXJyZW50IHx8IHAtPnN0YXRlID09IFRBU0tfUlVOTklORykKKwkJcmV0dXJuIDA7CisKKwlzcCA9IHAtPnRocmVhZC5zcDsKKwlwYyA9IE1BS0VfUENfRlJPTV9SQShwLT50aHJlYWQucmEsIHAtPnRocmVhZC5zcCk7CisKKwlkbyB7CisJCWlmIChzcCA8IHN0YWNrX3BhZ2UgKyBzaXplb2Yoc3RydWN0IHRhc2tfc3RydWN0KSB8fAorCQkgICAgc3AgPj0gKHN0YWNrX3BhZ2UgKyBUSFJFQURfU0laRSkgfHwKKwkJICAgIHBjID09IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFpbl9zY2hlZF9mdW5jdGlvbnMocGMpKQorCQkJcmV0dXJuIHBjOworCisJCS8qIFN0YWNrIGxheW91dDogc3AtNDogcmEsIHNwLTM6IHNwJyAqLworCisJCXBjID0gTUFLRV9QQ19GUk9NX1JBKCoodW5zaWduZWQgbG9uZyopc3AgLSA0LCBzcCk7CisJCXNwID0gKih1bnNpZ25lZCBsb25nICopc3AgLSAzOworCX0gd2hpbGUgKGNvdW50KysgPCAxNik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkb19jb3B5X3JlZ3MoKSBnYXRoZXJzIGluZm9ybWF0aW9uIGZyb20gJ3N0cnVjdCBwdF9yZWdzJyBhbmQKKyAqICdjdXJyZW50LT50aHJlYWQuYXJlZ1tdJyB0byBmaWxsIGluIHRoZSB4dGVuc2FfZ3JlZ3NldF90CisgKiBzdHJ1Y3R1cmUuCisgKgorICogeHRlbnNhX2dyZWdzZXRfdCBhbmQgJ3N0cnVjdCBwdF9yZWdzJyBhcmUgdmFzdGx5IGRpZmZlcmVudCBmb3JtYXRzCisgKiBvZiBwcm9jZXNzb3IgcmVnaXN0ZXJzLiAgQmVzaWRlcyBkaWZmZXJlbnQgb3JkZXJpbmcsCisgKiB4dGVuc2FfZ3JlZ3NldF90IGNvbnRhaW5zIG5vbi1saXZlIHJlZ2lzdGVyIGluZm9ybWF0aW9uIHRoYXQKKyAqICdzdHJ1Y3QgcHRfcmVncycgZG9lcyBub3QuICBFeGNlcHRpb24gaGFuZGxpbmcgKHByaW1hcmlseSkgdXNlcworICogJ3N0cnVjdCBwdF9yZWdzJy4gIENvcmUgZmlsZXMgYW5kIHB0cmFjZSB1c2UgeHRlbnNhX2dyZWdzZXRfdC4KKyAqCisgKi8KKwordm9pZCBkb19jb3B5X3JlZ3MgKHh0ZW5zYV9ncmVnc2V0X3QgKmVsZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpbnQgaSwgbiwgd2Jfb2Zmc2V0OworCisJZWxmcmVncy0+eGNoYWxfY29uZmlnX2lkMCA9IFhDSEFMX0hXX0NPTkZJR0lEMDsKKwllbGZyZWdzLT54Y2hhbF9jb25maWdfaWQxID0gWENIQUxfSFdfQ09ORklHSUQxOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyc3IgICUwLCAxNzZcbiIgOiAiPWEiIChpKSk7CisgCWVsZnJlZ3MtPmNwdXggPSBpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgicnNyICAlMCwgMjA4XG4iIDogIj1hIiAoaSkpOworIAllbGZyZWdzLT5jcHV5ID0gaTsKKworCS8qIE5vdGU6ICBQUy5FWENNIGlzIG5vdCBzZXQgd2hpbGUgdXNlciB0YXNrIGlzIHJ1bm5pbmc7IGl0cworCSAqIGJlaW5nIHNldCBpbiByZWdzLT5wcyBpcyBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIGNvbnZlbmllbmNlLgorCSAqLworCisJZWxmcmVncy0+cGMJCT0gcmVncy0+cGM7CisJZWxmcmVncy0+cHMJCT0gKHJlZ3MtPnBzICYgflhDSEFMX1BTX0VYQ01fTUFTSyk7CisJZWxmcmVncy0+ZXhjY2F1c2UJPSByZWdzLT5leGNjYXVzZTsKKwllbGZyZWdzLT5leGN2YWRkcgk9IHJlZ3MtPmV4Y3ZhZGRyOworCWVsZnJlZ3MtPndpbmRvd2Jhc2UJPSByZWdzLT53aW5kb3diYXNlOworCWVsZnJlZ3MtPndpbmRvd3N0YXJ0CT0gcmVncy0+d2luZG93c3RhcnQ7CisJZWxmcmVncy0+bGJlZwkJPSByZWdzLT5sYmVnOworCWVsZnJlZ3MtPmxlbmQJCT0gcmVncy0+bGVuZDsKKwllbGZyZWdzLT5sY291bnQJCT0gcmVncy0+bGNvdW50OworCWVsZnJlZ3MtPnNhcgkJPSByZWdzLT5zYXI7CisJZWxmcmVncy0+c3lzY2FsbAk9IHJlZ3MtPnN5c2NhbGw7CisKKwkvKiBDb3B5IHJlZ2lzdGVyIGZpbGUuCisJICogVGhlIGxheW91dCBsb29rcyBsaWtlIHRoaXM6CisJICoKKwkgKiB8ICBhMCAuLi4gYTE1ICB8IFogLi4uIFogfCAgYXJYIC4uLiBhclkgIHwKKwkgKiAgY3VycmVudCB3aW5kb3cgIHVudXNlZCAgICBzYXZlZCBmcmFtZXMKKwkgKi8KKworCW1lbXNldCAoZWxmcmVncy0+YXIsIDAsIHNpemVvZihlbGZyZWdzLT5hcikpOworCisJd2Jfb2Zmc2V0ID0gcmVncy0+d2luZG93YmFzZSAqIDQ7CisJbiA9IChyZWdzLT53bWFzayYxKT8gNCA6IChyZWdzLT53bWFzayYyKT8gOCA6IChyZWdzLT53bWFzayY0KT8gMTIgOiAxNjsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWVsZnJlZ3MtPmFyWyh3Yl9vZmZzZXQgKyBpKSAlIFhDSEFMX05VTV9BUkVHU10gPSByZWdzLT5hcmVnW2ldOworCisJbiA9IChyZWdzLT53bWFzayA+PiA0KSAqIDQ7CisKKwlmb3IgKGkgPSBYQ0hBTF9OVU1fQVJFR1MgLSBuOyBuID4gMDsgaSsrLCBuLS0pCisJCWVsZnJlZ3MtPmFyWyh3Yl9vZmZzZXQgKyBpKSAlIFhDSEFMX05VTV9BUkVHU10gPSByZWdzLT5hcmVnW2ldOworfQorCit2b2lkIHh0ZW5zYV9lbGZfY29yZV9jb3B5X3JlZ3MgKHh0ZW5zYV9ncmVnc2V0X3QgKmVsZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWRvX2NvcHlfcmVncyAoKHh0ZW5zYV9ncmVnc2V0X3QgKillbGZyZWdzLCByZWdzLCBjdXJyZW50KTsKK30KKworCisvKiBUaGUgaW52ZXJzZSBvZiBkb19jb3B5X3JlZ3MoKS4gIE5vIGVycm9yIG9yIHNhbml0eSBjaGVja2luZy4gKi8KKwordm9pZCBkb19yZXN0b3JlX3JlZ3MgKHh0ZW5zYV9ncmVnc2V0X3QgKmVsZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpbnQgaSwgbiwgd2Jfb2Zmc2V0OworCisJLyogTm90ZTogIFBTLkVYQ00gaXMgbm90IHNldCB3aGlsZSB1c2VyIHRhc2sgaXMgcnVubmluZzsgaXQKKwkgKiBuZWVkcyB0byBiZSBzZXQgaW4gcmVncy0+cHMgaXMgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyBjb252ZW5pZW5jZS4KKwkgKi8KKworCXJlZ3MtPnBjCQk9IGVsZnJlZ3MtPnBjOworCXJlZ3MtPnBzCQk9IChlbGZyZWdzLT5wcyB8IFhDSEFMX1BTX0VYQ01fTUFTSyk7CisJcmVncy0+ZXhjY2F1c2UJCT0gZWxmcmVncy0+ZXhjY2F1c2U7CisJcmVncy0+ZXhjdmFkZHIJCT0gZWxmcmVncy0+ZXhjdmFkZHI7CisJcmVncy0+d2luZG93YmFzZQk9IGVsZnJlZ3MtPndpbmRvd2Jhc2U7CisJcmVncy0+d2luZG93c3RhcnQJPSBlbGZyZWdzLT53aW5kb3dzdGFydDsKKwlyZWdzLT5sYmVnCQk9IGVsZnJlZ3MtPmxiZWc7CisJcmVncy0+bGVuZAkJPSBlbGZyZWdzLT5sZW5kOworCXJlZ3MtPmxjb3VudAkJPSBlbGZyZWdzLT5sY291bnQ7CisJcmVncy0+c2FyCQk9IGVsZnJlZ3MtPnNhcjsKKwlyZWdzLT5zeXNjYWxsCT0gZWxmcmVncy0+c3lzY2FsbDsKKworCS8qIENsZWFyIGV2ZXJ5dGhpbmcuICovCisKKwltZW1zZXQgKHJlZ3MtPmFyZWcsIDAsIHNpemVvZihyZWdzLT5hcmVnKSk7CisKKwkvKiBDb3B5IHJlZ3MgZnJvbSBsaXZlIHdpbmRvdyBmcmFtZS4gKi8KKworCXdiX29mZnNldCA9IHJlZ3MtPndpbmRvd2Jhc2UgKiA0OworCW4gPSAocmVncy0+d21hc2smMSk/IDQgOiAocmVncy0+d21hc2smMik/IDggOiAocmVncy0+d21hc2smNCk/IDEyIDogMTY7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlyZWdzLT5hcmVnWyh3Yl9vZmZzZXQraSkgJSBYQ0hBTF9OVU1fQVJFR1NdID0gZWxmcmVncy0+YXJbaV07CisKKwluID0gKHJlZ3MtPndtYXNrID4+IDQpICogNDsKKworCWZvciAoaSA9IFhDSEFMX05VTV9BUkVHUyAtIG47IG4gPiAwOyBpKyssIG4tLSkKKwkJcmVncy0+YXJlZ1sod2Jfb2Zmc2V0K2kpICUgWENIQUxfTlVNX0FSRUdTXSA9IGVsZnJlZ3MtPmFyW2ldOworfQorCisvKgorICogZG9fc2F2ZV9mcHJlZ3MoKSBnYXRoZXJzIGluZm9ybWF0aW9uIGZyb20gJ3N0cnVjdCBwdF9yZWdzJyBhbmQKKyAqICdjdXJyZW50LT50aHJlYWQnIHRvIGZpbGwgaW4gdGhlIGVsZl9mcHJlZ3NldF90IHN0cnVjdHVyZS4KKyAqCisgKiBDb3JlIGZpbGVzIGFuZCBwdHJhY2UgdXNlIGVsZl9mcHJlZ3NldF90LgorICovCisKK3ZvaWQgZG9fc2F2ZV9mcHJlZ3MgKGVsZl9mcHJlZ3NldF90ICpmcHJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworI2lmIFhDSEFMX0hBVkVfQ1AKKworCWV4dGVybiB1bnNpZ25lZCBjaGFyCV94dGVuc2FfcmVnaW5mb190YWJsZXNbXTsKKwlleHRlcm4gdW5zaWduZWQJCV94dGVuc2FfcmVnaW5mb190YWJsZV9zaXplOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBCZWZvcmUgZHVtcGluZyBjb3Byb2Nlc3NvciBzdGF0ZSBmcm9tIG1lbW9yeSwKKwkgKiBlbnN1cmUgYW55IGxpdmUgY29wcm9jZXNzb3IgY29udGVudHMgZm9yIHRoaXMKKwkgKiB0YXNrIGFyZSBmaXJzdCBzYXZlZCB0byBtZW1vcnk6CisJICovCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFhDSEFMX0NQX01BWDsgaSsrKSB7CisJCWlmICh0c2sgPT0gY29wcm9jZXNzb3JfaW5mb1tpXS5vd25lcikgeworCQkJZW5hYmxlX2NvcHJvY2Vzc29yKGkpOworCQkJc2F2ZV9jb3Byb2Nlc3Nvcl9yZWdpc3RlcnMoCisJCQkgICAgdHNrLT50aHJlYWQuY3Bfc2F2ZStjb3Byb2Nlc3Nvcl9pbmZvW2ldLm9mZnNldCxpKTsKKwkJCWRpc2FibGVfY29wcm9jZXNzb3IoaSk7CisJCX0KKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKiBOb3cgZHVtcCBjb3Byb2Nlc3NvciAmIGV4dHJhIHN0YXRlOiAqLworCW1lbWNweSgodW5zaWduZWQgY2hhciopZnByZWdzLAorCQlfeHRlbnNhX3JlZ2luZm9fdGFibGVzLCBfeHRlbnNhX3JlZ2luZm9fdGFibGVfc2l6ZSk7CisJbWVtY3B5KCh1bnNpZ25lZCBjaGFyKilmcHJlZ3MgKyBfeHRlbnNhX3JlZ2luZm9fdGFibGVfc2l6ZSwKKwkJdHNrLT50aHJlYWQuY3Bfc2F2ZSwgWFRFTlNBX0NQX0VYVFJBX1NJWkUpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGUgaW52ZXJzZSBvZiBkb19zYXZlX2ZwcmVncygpLgorICogQ29waWVzIGNvcHJvY2Vzc29yIGFuZCBleHRyYSBzdGF0ZSBmcm9tIGZwcmVncyBpbnRvIHJlZ3MgYW5kIHRzay0+dGhyZWFkLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIGlmIGxheW91dCBkb2Vzbid0IG1hdGNoLgorICovCisKK2ludCAgZG9fcmVzdG9yZV9mcHJlZ3MgKGVsZl9mcHJlZ3NldF90ICpmcHJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworI2lmIFhDSEFMX0hBVkVfQ1AKKworCWV4dGVybiB1bnNpZ25lZCBjaGFyCV94dGVuc2FfcmVnaW5mb190YWJsZXNbXTsKKwlleHRlcm4gdW5zaWduZWQJCV94dGVuc2FfcmVnaW5mb190YWJsZV9zaXplOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBNYWtlIHN1cmUgc2F2ZSBhcmVhIGxheW91dHMgbWF0Y2guCisJICogRklYTUU6ICBpbiB0aGUgZnV0dXJlIHdlIGNvdWxkIGFsbG93IHJlc3RvcmluZyBmcm9tCisJICogYSBkaWZmZXJlbnQgbGF5b3V0IG9mIHRoZSBzYW1lIHJlZ2lzdGVycywgYnkgY29tcGFyaW5nCisJICogZnByZWdzJyB0YWJsZSB3aXRoIF94dGVuc2FfcmVnaW5mb190YWJsZXMgYW5kIG1hdGNoaW5nCisJICogZW50cmllcyBhbmQgY29weWluZyByZWdpc3RlcnMgb25lIGF0IGEgdGltZS4KKwkgKiBOb3QgdG9vIHN1cmUgeWV0IHdoZXRoZXIgdGhhdCdzIHZlcnkgdXNlZnVsLgorCSAqLworCisJaWYoIG1lbWNtcCgodW5zaWduZWQgY2hhciopZnByZWdzLAorCQlfeHRlbnNhX3JlZ2luZm9fdGFibGVzLCBfeHRlbnNhX3JlZ2luZm9fdGFibGVfc2l6ZSkgKSB7CisJICAgIHJldHVybiAtMTsKKwl9CisKKwkvKiBCZWZvcmUgcmVzdG9yaW5nIGNvcHJvY2Vzc29yIHN0YXRlIGZyb20gbWVtb3J5LAorCSAqIGVuc3VyZSBhbnkgbGl2ZSBjb3Byb2Nlc3NvciBjb250ZW50cyBmb3IgdGhpcworCSAqIHRhc2sgYXJlIGZpcnN0IGludmFsaWRhdGVkLgorCSAqLworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFhDSEFMX0NQX01BWDsgaSsrKSB7CisJCWlmICh0c2sgPT0gY29wcm9jZXNzb3JfaW5mb1tpXS5vd25lcikgeworCQkJZW5hYmxlX2NvcHJvY2Vzc29yKGkpOworCQkJc2F2ZV9jb3Byb2Nlc3Nvcl9yZWdpc3RlcnMoCisJCQkgICAgdHNrLT50aHJlYWQuY3Bfc2F2ZStjb3Byb2Nlc3Nvcl9pbmZvW2ldLm9mZnNldCxpKTsKKwkJCWNvcHJvY2Vzc29yX2luZm9baV0ub3duZXIgPSAwOworCQkJZGlzYWJsZV9jb3Byb2Nlc3NvcihpKTsKKwkJfQorCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qICBOb3cgcmVzdG9yZSBjb3Byb2Nlc3NvciAmIGV4dHJhIHN0YXRlOiAgKi8KKworCW1lbWNweSh0c2stPnRocmVhZC5jcF9zYXZlLAorCQkodW5zaWduZWQgY2hhciopZnByZWdzICsgX3h0ZW5zYV9yZWdpbmZvX3RhYmxlX3NpemUsCisJCVhURU5TQV9DUF9FWFRSQV9TSVpFKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorLyoKKyAqIEZpbGwgaW4gdGhlIENQIHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAgZm9yIGEgcGFydGljdWxhciB0YXNrLgorICovCisKK2ludAorZHVtcF90YXNrX2ZwdShzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbGZfZnByZWdzZXRfdCAqcikKK3sKKy8qIHNlZSBhc20vY29wcm9jZXNzb3IuaCBmb3IgdGhpcyBtYWdpYyBudW1iZXIgMTYgKi8KKyNpZiBUT1RBTF9DUEVYVFJBX1NJWkUgPiAxNgorCWRvX3NhdmVfZnByZWdzIChyLCByZWdzLCB0YXNrKTsKKworCS8qICBGb3Igbm93LCBiaXQgMTYgbWVhbnMgc29tZSBleHRyYSBzdGF0ZSBtYXkgYmUgcHJlc2VudDogICovCisvLyBGSVhNRSEhIG5lZWQgdG8gdHJhY2sgdG8gcmV0dXJuIG1vcmUgYWNjdXJhdGUgbWFzaworCXJldHVybiAweDEwMDAwIHwgWENIQUxfQ1BfTUFTSzsKKyNlbHNlCisJcmV0dXJuIDA7CS8qIG5vIGNvcHJvY2Vzc29ycyBhY3RpdmUgb24gdGhpcyBwcm9jZXNzb3IgKi8KKyNlbmRpZgorfQorCisvKgorICogRmlsbCBpbiB0aGUgQ1Agc3RydWN0dXJlIGZvciBhIGNvcmUgZHVtcC4KKyAqIFRoaXMgaW5jbHVkZXMgYW55IEZQVSBjb3Byb2Nlc3Nvci4KKyAqIEhlcmUsIHdlIGR1bXAgYWxsIGNvcHJvY2Vzc29ycywgYW5kIG90aGVyICgiZXh0cmEiKSBjdXN0b20gc3RhdGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgZWxmX2NvcmVfZHVtcCgpIGluIGZzL2JpbmZtdF9lbGYuYworICogKGluIHdoaWNoIGNhc2UgJ3JlZ3MnIGNvbWVzIGZyb20gY2FsbHMgdG8gZG9fY29yZWR1bXAsIHNlZSBzaWduYWxzLmMpLgorICovCitpbnQgIGR1bXBfZnB1KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBlbGZfZnByZWdzZXRfdCAqcikKK3sKKwlyZXR1cm4gZHVtcF90YXNrX2ZwdShyZWdzLCBjdXJyZW50LCByKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU5ZWZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3B0cmFjZS5jCkBAIC0wLDAgKzEsNDA4IEBACisvLyBUT0RPIHNvbWUgbWlub3IgaXNzdWVzCisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSAgVGVuc2lsaWNhIEluYy4KKyAqCisgKiBKb2UgVGF5bG9yCTxqb2VAdGVuc2lsaWNhLmNvbSwgam9ldHlsckB5YWhvby5jb20+CisgKiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKiBTY290dCBGb2VobmVyPHNmb2VobmVyQHlhaG9vLmNvbT4sCisgKiBLZXZpbiBDaGVhCisgKiBNYXJjIEdhdXRoaWVyPG1hcmNAdGVuc2lsaWNhLmNvbT4gPG1hcmNAYWx1bW5pLnV3YXRlcmxvby5jYT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vZWxmLmg+CisKKyNkZWZpbmUgVEVTVF9LRVJORUwJLy8gdmVyaWZ5IGtlcm5lbCBvcGVyYXRpb25zIEZJWE1FOiByZW1vdmUKKworCisvKgorICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCisgKgorICogTWFrZSBzdXJlIHNpbmdsZSBzdGVwIGJpdHMgZXRjIGFyZSBub3Qgc2V0LgorICovCisKK3ZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwkvKiBOb3RoaW5nIHRvIGRvLi4gKi8KK30KKworaW50IHN5c19wdHJhY2UobG9uZyByZXF1ZXN0LCBsb25nIHBpZCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZDsKKwlpbnQgcmV0ID0gLUVQRVJNOworCisJbG9ja19rZXJuZWwoKTsKKworI2lmIDAKKwlpZiAoKGludClyZXF1ZXN0ICE9IDEpCisJcHJpbnRrKCJwdHJhY2Uocj0lZCxwaWQ9JWQsYWRkcj0lMDhseCxkYXRhPSUwOGx4KVxuIiwKKwkgICAgICAgKGludCkgcmVxdWVzdCwgKGludCkgcGlkLCAodW5zaWduZWQgbG9uZykgYWRkciwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGRhdGEpOworI2VuZGlmCisKKwlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfVFJBQ0VNRSkgeworCisJCS8qIEFyZSB3ZSBhbHJlYWR5IGJlaW5nIHRyYWNlZD8gKi8KKworCQlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJCWdvdG8gb3V0OworCisJCWlmICgocmV0ID0gc2VjdXJpdHlfcHRyYWNlKGN1cnJlbnQtPnBhcmVudCwgY3VycmVudCkpKQorCQkJZ290byBvdXQ7CisKKwkJLyogU2V0IHRoZSBwdHJhY2UgYml0IGluIHRoZSBwcm9jZXNzIGZsYWdzLiAqLworCisJCWN1cnJlbnQtPnB0cmFjZSB8PSBQVF9QVFJBQ0VEOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAtRVNSQ0g7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwljaGlsZCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwlpZiAoY2hpbGQpCisJCWdldF90YXNrX3N0cnVjdChjaGlsZCk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICghY2hpbGQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVQRVJNOworCWlmIChwaWQgPT0gMSkJCS8qIHlvdSBtYXkgbm90IG1lc3Mgd2l0aCBpbml0ICovCisJCWdvdG8gb3V0OworCisJaWYgKHJlcXVlc3QgPT0gUFRSQUNFX0FUVEFDSCkgeworCQlyZXQgPSBwdHJhY2VfYXR0YWNoKGNoaWxkKTsKKwkJZ290byBvdXRfdHNrOworCX0KKworCWlmICgocmV0ID0gcHRyYWNlX2NoZWNrX2F0dGFjaChjaGlsZCwgcmVxdWVzdCA9PSBQVFJBQ0VfS0lMTCkpIDwgMCkKKwkJZ290byBvdXRfdHNrOworCisJc3dpdGNoIChyZXF1ZXN0KSB7CisJY2FzZSBQVFJBQ0VfUEVFS1RFWFQ6IC8qIHJlYWQgd29yZCBhdCBsb2NhdGlvbiBhZGRyLiAqLworCWNhc2UgUFRSQUNFX1BFRUtEQVRBOgorCXsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisJCWludCBjb3BpZWQ7CisKKwkJY29waWVkID0gYWNjZXNzX3Byb2Nlc3Nfdm0oY2hpbGQsIGFkZHIsICZ0bXAsIHNpemVvZih0bXApLCAwKTsKKwkJcmV0ID0gLUVJTzsKKwkJaWYgKGNvcGllZCAhPSBzaXplb2YodG1wKSkKKwkJCWJyZWFrOworCQlyZXQgPSBwdXRfdXNlcih0bXAsKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7CisKKwkJZ290byBvdXQ7CisJfQorCisJLyogUmVhZCB0aGUgd29yZCBhdCBsb2NhdGlvbiBhZGRyIGluIHRoZSBVU0VSIGFyZWEuICAqLworCisJY2FzZSBQVFJBQ0VfUEVFS1VTUjoKKwkJeworCQlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwkJdW5zaWduZWQgbG9uZyB0bXA7CisKKwkJcmVncyA9IHh0ZW5zYV9wdF9yZWdzKGNoaWxkKTsKKwkJdG1wID0gMDsgIC8qIERlZmF1bHQgcmV0dXJuIHZhbHVlLiAqLworCisJCXN3aXRjaChhZGRyKSB7CisKKwkJY2FzZSBSRUdfQVJfQkFTRSAuLi4gUkVHX0FSX0JBU0UgKyBYQ0hBTF9OVU1fQVJFR1MgLSAxOgorCQkJeworCQkJaW50IGFyID0gYWRkciAtIFJFR19BUl9CQVNFIC0gcmVncy0+d2luZG93YmFzZSAqIDQ7CisJCQlhciAmPSAoWENIQUxfTlVNX0FSRUdTIC0gMSk7CisJCQlpZiAoYXIgPCAxNiAmJiBhciArIChyZWdzLT53bWFzayA+PiA0KSAqIDQgPj0gMCkKKwkJCQl0bXAgPSByZWdzLT5hcmVnW2FyXTsKKwkJCWVsc2UKKwkJCQlyZXQgPSAtRUlPOworCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgUkVHX0FfQkFTRSAuLi4gUkVHX0FfQkFTRSArIDE1OgorCQkJdG1wID0gcmVncy0+YXJlZ1thZGRyIC0gUkVHX0FfQkFTRV07CisJCQlicmVhazsKKwkJY2FzZSBSRUdfUEM6CisJCQl0bXAgPSByZWdzLT5wYzsKKwkJCWJyZWFrOworCQljYXNlIFJFR19QUzoKKwkJCS8qIE5vdGU6ICBQUy5FWENNIGlzIG5vdCBzZXQgd2hpbGUgdXNlciB0YXNrIGlzIHJ1bm5pbmc7CisJCQkgKiBpdHMgYmVpbmcgc2V0IGluIHJlZ3MgaXMgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZworCQkJICogY29udmVuaWVuY2UuICAqLworCQkJdG1wID0gKHJlZ3MtPnBzICYgflhDSEFMX1BTX0VYQ01fTUFTSyk7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfV0I6CisJCQl0bXAgPSByZWdzLT53aW5kb3diYXNlOworCQkJYnJlYWs7CisJCWNhc2UgUkVHX1dTOgorCQkJdG1wID0gcmVncy0+d2luZG93c3RhcnQ7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfTEJFRzoKKwkJCXRtcCA9IHJlZ3MtPmxiZWc7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfTEVORDoKKwkJCXRtcCA9IHJlZ3MtPmxlbmQ7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfTENPVU5UOgorCQkJdG1wID0gcmVncy0+bGNvdW50OworCQkJYnJlYWs7CisJCWNhc2UgUkVHX1NBUjoKKwkJCXRtcCA9IHJlZ3MtPnNhcjsKKwkJCWJyZWFrOworCQljYXNlIFJFR19ERVBDOgorCQkJdG1wID0gcmVncy0+ZGVwYzsKKwkJCWJyZWFrOworCQljYXNlIFJFR19FWENDQVVTRToKKwkJCXRtcCA9IHJlZ3MtPmV4Y2NhdXNlOworCQkJYnJlYWs7CisJCWNhc2UgUkVHX0VYQ1ZBRERSOgorCQkJdG1wID0gcmVncy0+ZXhjdmFkZHI7CisJCQlicmVhazsKKwkJY2FzZSBTWVNDQUxMX05SOgorCQkJdG1wID0gcmVncy0+c3lzY2FsbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdG1wID0gMDsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBwdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQlnb3RvIG91dDsKKwkJfQorCisJY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6IC8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCisJY2FzZSBQVFJBQ0VfUE9LRURBVEE6CisJCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkKKwkJICAgID09IHNpemVvZihkYXRhKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKworCWNhc2UgUFRSQUNFX1BPS0VVU1I6CisJCXsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisJCXJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisKKwkJc3dpdGNoIChhZGRyKSB7CisJCWNhc2UgUkVHX0FSX0JBU0UgLi4uIFJFR19BUl9CQVNFICsgWENIQUxfTlVNX0FSRUdTIC0gMToKKwkJCXsKKwkJCWludCBhciA9IGFkZHIgLSBSRUdfQVJfQkFTRSAtIHJlZ3MtPndpbmRvd2Jhc2UgKiA0OworCQkJaWYgKGFyIDwgMTYgJiYgYXIgKyAocmVncy0+d21hc2sgPj4gNCkgKiA0ID49IDApCisJCQkJcmVncy0+YXJlZ1thciAmIChYQ0hBTF9OVU1fQVJFR1MgLSAxKV0gPSBkYXRhOworCQkJZWxzZQorCQkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBSRUdfQV9CQVNFIC4uLiBSRUdfQV9CQVNFICsgMTU6CisJCQlyZWdzLT5hcmVnW2FkZHIgLSBSRUdfQV9CQVNFXSA9IGRhdGE7CisJCQlicmVhazsKKwkJY2FzZSBSRUdfUEM6CisJCQlyZWdzLT5wYyA9IGRhdGE7CisJCQlicmVhazsKKwkJY2FzZSBTWVNDQUxMX05SOgorCQkJcmVncy0+c3lzY2FsbCA9IGRhdGE7CisJCQlicmVhazsKKyNpZmRlZiBURVNUX0tFUk5FTAorCQljYXNlIFJFR19XQjoKKwkJCXJlZ3MtPndpbmRvd2Jhc2UgPSBkYXRhOworCQkJYnJlYWs7CisJCWNhc2UgUkVHX1dTOgorCQkJcmVncy0+d2luZG93c3RhcnQgPSBkYXRhOworCQkJYnJlYWs7CisjZW5kaWYKKworCQlkZWZhdWx0OgorCQkJLyogVGhlIHJlc3QgYXJlIG5vdCBhbGxvd2VkLiAqLworCQkJcmV0ID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCQl9CisKKwkvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLworCWNhc2UgUFRSQUNFX1NZU0NBTEw6CisJY2FzZSBQVFJBQ0VfQ09OVDogLyogcmVzdGFydCBhZnRlciBzaWduYWwuICovCisJeworCQlyZXQgPSAtRUlPOworCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKKwkJCWJyZWFrOworCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkKKwkJCXNldF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKKwkJZWxzZQorCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQkvKiBNYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0LiAqLworCQljaGlsZC0+cHRyYWNlICY9IH5QVF9TSU5HTEVTVEVQOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlyZXQgPSAwOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLgorCSAqIHBlcmhhcHMgaXQgc2hvdWxkIGJlIHB1dCBpbiB0aGUgc3RhdHVzIHRoYXQgaXQgd2FudHMgdG8KKwkgKiBleGl0LgorCSAqLworCWNhc2UgUFRSQUNFX0tJTEw6CisJCXJldCA9IDA7CisJCWlmIChjaGlsZC0+c3RhdGUgPT0gRVhJVF9aT01CSUUpCS8qIGFscmVhZHkgZGVhZCAqLworCQkJYnJlYWs7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBTSUdLSUxMOworCQljaGlsZC0+cHRyYWNlICY9IH5QVF9TSU5HTEVTVEVQOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6CisJCXJldCA9IC1FSU87CisJCWlmICghdmFsaWRfc2lnbmFsKGRhdGEpKQorCQkJYnJlYWs7CisJCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOworCQljaGlsZC0+cHRyYWNlIHw9IFBUX1NJTkdMRVNURVA7CisJCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOworCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOworCQlyZXQgPSAwOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0dFVFJFR1M6CisJeworCQkvKiAnZGF0YScgcG9pbnRzIHRvIHVzZXIgbWVtb3J5IGluIHdoaWNoIHRvIHdyaXRlLgorCQkgKiBNYWlubHkgZHVlIHRvIHRoZSBub24tbGl2ZSByZWdpc3RlciB2YWx1ZXMsIHdlCisJCSAqIHJlZm9ybWF0IHRoZSByZWdpc3RlciB2YWx1ZXMgaW50byBzb21ldGhpbmcgbW9yZQorCQkgKiBzdGFuZGFyZC4gIEZvciBjb252ZW5pZW5jZSwgd2UgdXNlIHRoZSBoYW5keQorCQkgKiBlbGZfZ3JlZ3NldF90IGZvcm1hdC4gKi8KKworCQl4dGVuc2FfZ3JlZ3NldF90IGZvcm1hdDsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisKKwkJZG9fY29weV9yZWdzICgmZm9ybWF0LCByZWdzLCBjaGlsZCk7CisKKwkJLyogTm93LCBjb3B5IHRvIHVzZXIgc3BhY2UgbmljZSBhbmQgZWFzeS4uLiAqLworCQlyZXQgPSAwOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopZGF0YSwgJmZvcm1hdCwgc2l6ZW9mKGVsZl9ncmVnc2V0X3QpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX1NFVFJFR1M6CisJeworCQkvKiAnZGF0YScgcG9pbnRzIHRvIHVzZXIgbWVtb3J5IHRoYXQgY29udGFpbnMgdGhlIG5ldworCQkgKiB2YWx1ZXMgaW4gdGhlIGVsZl9ncmVnc2V0X3QgZm9ybWF0LiAqLworCisJCXh0ZW5zYV9ncmVnc2V0X3QgZm9ybWF0OworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHh0ZW5zYV9wdF9yZWdzKGNoaWxkKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZvcm1hdCwodm9pZCAqKWRhdGEsc2l6ZW9mKGVsZl9ncmVnc2V0X3QpKSl7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBGSVhNRTogUGVyaGFwcyB3ZSB3YW50IHNvbWUgc2FuaXR5IGNoZWNrcyBvbgorCQkgKiB0aGVzZSB1c2VyLXNwYWNlIHZhbHVlcz8gIFNlZSBBUk0gdmVyc2lvbi4gIEFyZQorCQkgKiBkZWJ1Z2dlcnMgYSBzZWN1cml0eSBjb25jZXJuPyAqLworCisJCWRvX3Jlc3RvcmVfcmVncyAoJmZvcm1hdCwgcmVncywgY2hpbGQpOworCisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzoKKwl7CisJCS8qICdkYXRhJyBwb2ludHMgdG8gdXNlciBtZW1vcnkgaW4gd2hpY2ggdG8gd3JpdGUuCisJCSAqIEZvciBjb252ZW5pZW5jZSwgd2UgdXNlIHRoZSBoYW5keQorCQkgKiBlbGZfZnByZWdzZXRfdCBmb3JtYXQuICovCisKKwkJZWxmX2ZwcmVnc2V0X3QgZnByZWdzOworCQlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHh0ZW5zYV9wdF9yZWdzKGNoaWxkKTsKKworCQlkb19zYXZlX2ZwcmVncyAoJmZwcmVncywgcmVncywgY2hpbGQpOworCisJCS8qIE5vdywgY29weSB0byB1c2VyIHNwYWNlIG5pY2UgYW5kIGVhc3kuLi4gKi8KKwkJcmV0ID0gMDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWRhdGEsICZmcHJlZ3MsIHNpemVvZihlbGZfZnByZWdzZXRfdCkpKQorCQkJcmV0ID0gLUVGQVVMVDsKKworCQlicmVhazsKKwl9CisKKwljYXNlIFBUUkFDRV9TRVRGUFJFR1M6CisJeworCQkvKiAnZGF0YScgcG9pbnRzIHRvIHVzZXIgbWVtb3J5IHRoYXQgY29udGFpbnMgdGhlIG5ldworCQkgKiB2YWx1ZXMgaW4gdGhlIGVsZl9mcHJlZ3NldF90IGZvcm1hdC4KKwkJICovCisJCWVsZl9mcHJlZ3NldF90IGZwcmVnczsKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB4dGVuc2FfcHRfcmVncyhjaGlsZCk7CisKKwkJcmV0ID0gMDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHJlZ3MsICh2b2lkICopZGF0YSwgc2l6ZW9mKGVsZl9mcHJlZ3NldF90KSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkb19yZXN0b3JlX2ZwcmVncyAoJmZwcmVncywgcmVncywgY2hpbGQpKQorCQkJcmV0ID0gLUVJTzsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBQVFJBQ0VfR0VURlBSRUdTSVpFOgorCQkvKiAnZGF0YScgcG9pbnRzIHRvICd1bnNpZ25lZCBsb25nJyBzZXQgdG8gdGhlIHNpemUKKwkJICogb2YgZWxmX2ZwcmVnc2V0X3QKKwkJICovCisJCXJldCA9IHB1dF91c2VyKHNpemVvZihlbGZfZnByZWdzZXRfdCksICh1bnNpZ25lZCBsb25nICopIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgUFRSQUNFX0RFVEFDSDogLyogZGV0YWNoIGEgcHJvY2VzcyB0aGF0IHdhcyBhdHRhY2hlZC4gKi8KKwkJcmV0ID0gcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOworCQlnb3RvIG91dDsKKwl9CitvdXRfdHNrOgorCXB1dF90YXNrX3N0cnVjdChjaGlsZCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZG9fc3lzY2FsbF90cmFjZSh2b2lkKQoreworCWlmICghdGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCisJCXJldHVybjsKKworCWlmICghKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRoZSAweDgwIHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgdHJhY2luZyBwYXJlbnQgdG8gZGlzdGluZ3Vpc2gKKwkgKiBiZXR3ZWVuIGEgc3lzY2FsbCBzdG9wIGFuZCBTSUdUUkFQIGRlbGl2ZXJ5CisJICovCisJcHRyYWNlX25vdGlmeShTSUdUUkFQfCgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKSA/IDB4ODAgOiAwKSk7CisKKwkvKgorCSAqIHRoaXMgaXNuJ3QgdGhlIHNhbWUgYXMgY29udGludWluZyB3aXRoIGEgc2lnbmFsLCBidXQgaXQgd2lsbCBkbworCSAqIGZvciBub3JtYWwgdXNlLiAgc3RyYWNlIG9ubHkgY29udGludWVzIHdpdGggYSBzaWduYWwgaWYgdGhlCisJICogc3RvcHBpbmcgc2lnbmFsIGlzIG5vdCBTSUdUUkFQLiAgLWJybAorCSAqLworCWlmIChjdXJyZW50LT5leGl0X2NvZGUpIHsKKwkJc2VuZF9zaWcoY3VycmVudC0+ZXhpdF9jb2RlLCBjdXJyZW50LCAxKTsKKwkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2VtYXBob3JlLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2VtYXBob3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQwZjRiMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zZW1hcGhvcmUuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC9zZW1hcGhvcmUuYworICoKKyAqIEdlbmVyaWMgc2VtYXBob3JlIGNvZGUuIEJ1eWVyIGJld2FyZS4gRG8geW91ciBvd24gc3BlY2lmaWMgY2hhbmdlcworICogaW4gPGFzbS9zZW1hcGhvcmUtaGVscGVyLmg+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIEpvZSBUYXlsb3IJPGpvZUB0ZW5zaWxpY2EuY29tLCBqb2V0eWxyQHlhaG9vLmNvbT4KKyAqIENocmlzIFphbmtlbAk8Y2hyaXNAemFua2VsLm5ldD4KKyAqIE1hcmMgR2F1dGhpZXI8bWFyY0B0ZW5zaWxpY2EuY29tLCBtYXJjQGFsdW1uaS51d2F0ZXJsb28uY2E+CisgKiBLZXZpbiBDaGVhCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisKKy8qCisgKiBUaGVzZSB0d28gX211c3RfIGV4ZWN1dGUgYXRvbWljYWxseSB3cnQgZWFjaCBvdGhlci4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHdha2Vfb25lX21vcmUoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlhdG9taWNfaW5jKChhdG9taWNfdCAqKSZzZW0tPnNsZWVwZXJzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHdha2luZ19ub25femVybyhzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW1hcGhvcmVfd2FrZV9sb2NrLCBmbGFncyk7CisJaWYgKHNlbS0+c2xlZXBlcnMgPiAwKSB7CisJCXNlbS0+c2xlZXBlcnMtLTsKKwkJcmV0ID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtYXBob3JlX3dha2VfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3YWtpbmdfbm9uX3plcm9faW50ZXJydXB0aWJsZToKKyAqCTEJZ290IHRoZSBsb2NrCisgKgkwCWdvIHRvIHNsZWVwCisgKgktRUlOVFIJaW50ZXJydXB0ZWQKKyAqCisgKiBXZSBtdXN0IHVuZG8gdGhlIHNlbS0+Y291bnQgZG93bl9pbnRlcnJ1cHRpYmxlKCkgaW5jcmVtZW50IHdoaWxlIHdlIGFyZQorICogcHJvdGVjdGVkIGJ5IHRoZSBzcGlubG9jayBpbiBvcmRlciB0byBtYWtlIGF0b21pYyB0aGlzIGF0b21pY19pbmMoKSB3aXRoIHRoZQorICogYXRvbWljX3JlYWQoKSBpbiB3YWtlX29uZV9tb3JlKCksIG90aGVyd2lzZSB3ZSBjYW4gcmFjZS4gLWFyY2EKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgd2FraW5nX25vbl96ZXJvX2ludGVycnVwdGlibGUoc3RydWN0IHNlbWFwaG9yZSAqc2VtLAorCQkJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzZW1hcGhvcmVfd2FrZV9sb2NrLCBmbGFncyk7CisJaWYgKHNlbS0+c2xlZXBlcnMgPiAwKSB7CisJCXNlbS0+c2xlZXBlcnMtLTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgaWYgKHNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJYXRvbWljX2luYygmc2VtLT5jb3VudCk7CisJCXJldCA9IC1FSU5UUjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VtYXBob3JlX3dha2VfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB3YWtpbmdfbm9uX3plcm9fdHJ5bG9jazoKKyAqCTEJZmFpbGVkIHRvIGxvY2sKKyAqCTAJZ290IHRoZSBsb2NrCisgKgorICogV2UgbXVzdCB1bmRvIHRoZSBzZW0tPmNvdW50IGRvd25fdHJ5bG9jaygpIGluY3JlbWVudCB3aGlsZSB3ZSBhcmUKKyAqIHByb3RlY3RlZCBieSB0aGUgc3BpbmxvY2sgaW4gb3JkZXIgdG8gbWFrZSBhdG9taWMgdGhpcyBhdG9taWNfaW5jKCkgd2l0aCB0aGUKKyAqIGF0b21pY19yZWFkKCkgaW4gd2FrZV9vbmVfbW9yZSgpLCBvdGhlcndpc2Ugd2UgY2FuIHJhY2UuIC1hcmNhCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IHdha2luZ19ub25femVyb190cnlsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNlbWFwaG9yZV93YWtlX2xvY2ssIGZsYWdzKTsKKwlpZiAoc2VtLT5zbGVlcGVycyA8PSAwKQorCQlhdG9taWNfaW5jKCZzZW0tPmNvdW50KTsKKwllbHNlIHsKKwkJc2VtLT5zbGVlcGVycy0tOworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZW1hcGhvcmVfd2FrZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3BpbmxvY2tfdCBzZW1hcGhvcmVfd2FrZV9sb2NrOworCisvKgorICogU2VtYXBob3JlcyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYSB0d28td2F5IGNvdW50ZXI6CisgKiBUaGUgImNvdW50IiB2YXJpYWJsZSBpcyBkZWNyZW1lbnRlZCBmb3IgZWFjaCBwcm9jZXNzCisgKiB0aGF0IHRyaWVzIHRvIHNsZWVwLCB3aGlsZSB0aGUgIndha2luZyIgdmFyaWFibGUgaXMKKyAqIGluY3JlbWVudGVkIHdoZW4gdGhlICJ1cCgpIiBjb2RlIGdvZXMgdG8gd2FrZSB1cCB3YWl0aW5nCisgKiBwcm9jZXNzZXMuCisgKgorICogTm90YWJseSwgdGhlIGlubGluZSAidXAoKSIgYW5kICJkb3duKCkiIGZ1bmN0aW9ucyBjYW4KKyAqIGVmZmljaWVudGx5IHRlc3QgaWYgdGhleSBuZWVkIHRvIGRvIGFueSBleHRyYSB3b3JrICh1cAorICogbmVlZHMgdG8gZG8gc29tZXRoaW5nIG9ubHkgaWYgY291bnQgd2FzIG5lZ2F0aXZlIGJlZm9yZQorICogdGhlIGluY3JlbWVudCBvcGVyYXRpb24uCisgKgorICogd2FraW5nX25vbl96ZXJvKCkgKGZyb20gYXNtL3NlbWFwaG9yZS5oKSBtdXN0IGV4ZWN1dGUKKyAqIGF0b21pY2FsbHkuCisgKgorICogV2hlbiBfX3VwKCkgaXMgY2FsbGVkLCB0aGUgY291bnQgd2FzIG5lZ2F0aXZlIGJlZm9yZQorICogaW5jcmVtZW50aW5nIGl0LCBhbmQgd2UgbmVlZCB0byB3YWtlIHVwIHNvbWVib2R5LgorICoKKyAqIFRoaXMgcm91dGluZSBhZGRzIG9uZSB0byB0aGUgY291bnQgb2YgcHJvY2Vzc2VzIHRoYXQgbmVlZCB0bworICogd2FrZSB1cCBhbmQgZXhpdC4gIEFMTCB3YWl0aW5nIHByb2Nlc3NlcyBhY3R1YWxseSB3YWtlIHVwIGJ1dAorICogb25seSB0aGUgb25lIHRoYXQgZ2V0cyB0byB0aGUgIndha2luZyIgZmllbGQgZmlyc3Qgd2lsbCBnYXRlCisgKiB0aHJvdWdoIGFuZCBhY3F1aXJlIHRoZSBzZW1hcGhvcmUuICBUaGUgb3RoZXJzIHdpbGwgZ28gYmFjaworICogdG8gc2xlZXAuCisgKgorICogTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgd2hlbiB0aGVyZSBpcworICogY29udGVudGlvbiBvbiB0aGUgbG9jaywgYW5kIGFzIHN1Y2ggYWxsIHRoaXMgaXMgdGhlCisgKiAibm9uLWNyaXRpY2FsIiBwYXJ0IG9mIHRoZSB3aG9sZSBzZW1hcGhvcmUgYnVzaW5lc3MuIFRoZQorICogY3JpdGljYWwgcGFydCBpcyB0aGUgaW5saW5lIHN0dWZmIGluIDxhc20vc2VtYXBob3JlLmg+CisgKiB3aGVyZSB3ZSB3YW50IHRvIGF2b2lkIGFueSBleHRyYSBqdW1wcyBhbmQgY2FsbHMuCisgKi8KKwordm9pZCBfX3VwKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwl3YWtlX29uZV9tb3JlKHNlbSk7CisJd2FrZV91cCgmc2VtLT53YWl0KTsKK30KKworLyoKKyAqIFBlcmZvcm0gdGhlICJkb3duIiBmdW5jdGlvbi4gIFJldHVybiB6ZXJvIGZvciBzZW1hcGhvcmUgYWNxdWlyZWQsCisgKiByZXR1cm4gbmVnYXRpdmUgZm9yIHNpZ25hbGxlZCBvdXQgb2YgdGhlIGZ1bmN0aW9uLgorICoKKyAqIElmIGNhbGxlZCBmcm9tIF9fZG93biwgdGhlIHJldHVybiBpcyBpZ25vcmVkIGFuZCB0aGUgd2FpdCBsb29wIGlzCisgKiBub3QgaW50ZXJydXB0aWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBhIHRhc2sgd2FpdGluZyBvbiBhIHNlbWFwaG9yZQorICogdXNpbmcgImRvd24oKSIgY2Fubm90IGJlIGtpbGxlZCB1bnRpbCBzb21lb25lIGRvZXMgYW4gInVwKCkiIG9uCisgKiB0aGUgc2VtYXBob3JlLgorICoKKyAqIElmIGNhbGxlZCBmcm9tIF9fZG93bl9pbnRlcnJ1cHRpYmxlLCB0aGUgcmV0dXJuIHZhbHVlIGdldHMgY2hlY2tlZAorICogdXBvbiByZXR1cm4uICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlIHRoZW4gdGhlIHRhc2sgY29udGludWVzCisgKiB3aXRoIHRoZSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgcmV0dXJuIHJlZ2lzdGVyIChpdCBjYW4gYmUgdGVzdGVkIGJ5CisgKiB0aGUgY2FsbGVyKS4KKyAqCisgKiBFaXRoZXIgZm9ybSBtYXkgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoICJ1cCgpIi4KKyAqCisgKi8KKworI2RlZmluZSBET1dOX1ZBUgkJCQlcCisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwlcCisJd2FpdF9xdWV1ZV90IHdhaXQ7CQkJXAorCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCB0c2spOworCisjZGVmaW5lIERPV05fSEVBRCh0YXNrX3N0YXRlKQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0c2stPnN0YXRlID0gKHRhc2tfc3RhdGUpOwkJCQkJXAorCWFkZF93YWl0X3F1ZXVlKCZzZW0tPndhaXQsICZ3YWl0KTsJCQkJXAorCQkJCQkJCQkJXAorCS8qCQkJCQkJCQlcCisJICogT2ssIHdlJ3JlIHNldCB1cC4gIHNlbS0+Y291bnQgaXMga25vd24gdG8gYmUgbGVzcyB0aGFuIHplcm8JXAorCSAqIHNvIHdlIG11c3Qgd2FpdC4JCQkJCQlcCisJICoJCQkJCQkJCVwKKwkgKiBXZSBjYW4gbGV0IGdvIHRoZSBsb2NrIGZvciBwdXJwb3NlcyBvZiB3YWl0aW5nLgkJXAorCSAqIFdlIHJlLWFjcXVpcmUgaXQgYWZ0ZXIgYXdha2luZyBzbyBhcyB0byBwcm90ZWN0CQlcCisJICogYWxsIHNlbWFwaG9yZSBvcGVyYXRpb25zLgkJCQkJXAorCSAqCQkJCQkJCQlcCisJICogSWYgInVwKCkiIGlzIGNhbGxlZCBiZWZvcmUgd2UgY2FsbCB3YWtpbmdfbm9uX3plcm8oKSB0aGVuCVwKKwkgKiB3ZSB3aWxsIGNhdGNoIGl0IHJpZ2h0IGF3YXkuICBJZiBpdCBpcyBjYWxsZWQgbGF0ZXIgdGhlbglcCisJICogd2Ugd2lsbCBoYXZlIHRvIGdvIHRocm91Z2ggYSB3YWtldXAgY3ljbGUgdG8gY2F0Y2ggaXQuCVwKKwkgKgkJCQkJCQkJXAorCSAqIE11bHRpcGxlIHdhaXRlcnMgY29udGVuZCBmb3IgdGhlIHNlbWFwaG9yZSBsb2NrIHRvIHNlZQlcCisJICogd2hvIGdldHMgdG8gZ2F0ZSB0aHJvdWdoIGFuZCB3aG8gaGFzIHRvIHdhaXQgc29tZSBtb3JlLglcCisJICovCQkJCQkJCQlcCisJZm9yICg7OykgeworCisjZGVmaW5lIERPV05fVEFJTCh0YXNrX3N0YXRlKQkJCVwKKwkJdHNrLT5zdGF0ZSA9ICh0YXNrX3N0YXRlKTsJXAorCX0JCQkJCVwKKwl0c2stPnN0YXRlID0gVEFTS19SVU5OSU5HOwkJXAorCXJlbW92ZV93YWl0X3F1ZXVlKCZzZW0tPndhaXQsICZ3YWl0KTsKKwordm9pZCBfX3NjaGVkIF9fZG93bihzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQoreworCURPV05fVkFSCisJRE9XTl9IRUFEKFRBU0tfVU5JTlRFUlJVUFRJQkxFKQorCWlmICh3YWtpbmdfbm9uX3plcm8oc2VtKSkKKwkJYnJlYWs7CisJc2NoZWR1bGUoKTsKKwlET1dOX1RBSUwoVEFTS19VTklOVEVSUlVQVElCTEUpCit9CisKK2ludCBfX3NjaGVkIF9fZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJaW50IHJldCA9IDA7CisJRE9XTl9WQVIKKwlET1dOX0hFQUQoVEFTS19JTlRFUlJVUFRJQkxFKQorCisJcmV0ID0gd2FraW5nX25vbl96ZXJvX2ludGVycnVwdGlibGUoc2VtLCB0c2spOworCWlmIChyZXQpCisJeworCQlpZiAocmV0ID09IDEpCisJCQkvKiByZXQgIT0gMCBvbmx5IGlmIHdlIGdldCBpbnRlcnJ1cHRlZCAtYXJjYSAqLworCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisJfQorCXNjaGVkdWxlKCk7CisJRE9XTl9UQUlMKFRBU0tfSU5URVJSVVBUSUJMRSkKKwlyZXR1cm4gcmV0OworfQorCitpbnQgX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqIHNlbSkKK3sKKwlyZXR1cm4gd2FraW5nX25vbl96ZXJvX3RyeWxvY2soc2VtKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1YmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zZXR1cC5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICogYXJjaC94dGVuc2Evc2V0dXAuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgIFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsCTxjaHJpc0B6YW5rZWwubmV0PgorICogSm9lIFRheWxvcgk8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICogS2V2aW4gQ2hlYQorICogTWFyYyBHYXV0aGllcjxtYXJjQHRlbnNpbGljYS5jb20+IDxtYXJjQGFsdW1uaS51d2F0ZXJsb28uY2E+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19WR0FfQ09OU09MRSkgfHwgZGVmaW5lZChDT05GSUdfRFVNTVlfQ09OU09MRSkKKyMgaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRDCisjIGluY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjIGluY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKworI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3lzdGVtLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19WR0FfQ09OU09MRSkgfHwgZGVmaW5lZChDT05GSUdfRFVNTVlfQ09OU09MRSkKK3N0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbyA9IHsgMCwgMjQsIDAsIDAsIDAsIDgwLCAwLCAwLCAwLCAyNCwgMSwgMTZ9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9GRAorZXh0ZXJuIHN0cnVjdCBmZF9vcHMgbm9fZmRfb3BzOworc3RydWN0IGZkX29wcyAqZmRfb3BzOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0lERSkgfHwgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JREVfTU9EVUxFKQorZXh0ZXJuIHN0cnVjdCBpZGVfb3BzIG5vX2lkZV9vcHM7CitzdHJ1Y3QgaWRlX29wcyAqaWRlX29wczsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHJ0Y19vcHMgbm9fcnRjX29wczsKK3N0cnVjdCBydGNfb3BzICpydGNfb3BzOworCisjaWZkZWYgQ09ORklHX1BDX0tFWUIKK2V4dGVybiBzdHJ1Y3Qga2JkX29wcyBub19rYmRfb3BzOworc3RydWN0IGtiZF9vcHMgKmtiZF9vcHM7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorZXh0ZXJuIHZvaWQgKmluaXRyZF9zdGFydDsKK2V4dGVybiB2b2lkICppbml0cmRfZW5kOworZXh0ZXJuIHZvaWQgKl9faW5pdHJkX3N0YXJ0OworZXh0ZXJuIHZvaWQgKl9faW5pdHJkX2VuZDsKK2ludCBpbml0cmRfaXNfbWFwcGVkID0gMDsKK2V4dGVybiBpbnQgaW5pdHJkX2JlbG93X3N0YXJ0X29rOworI2VuZGlmCisKK3Vuc2lnbmVkIGNoYXIgYXV4X2RldmljZV9wcmVzZW50OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OworCisvKiBDb21tYW5kIGxpbmUgc3BlY2lmaWVkIGFzIGNvbmZpZ3VyYXRpb24gb3B0aW9uLiAqLworCitzdGF0aWMgY2hhciBjb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOworCisjaWZkZWYgQ09ORklHX0NNRExJTkVfQk9PTAorc3RhdGljIGNoYXIgZGVmYXVsdF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdIF9faW5pdGRhdGEgPSBDT05GSUdfQ01ETElORTsKKyNlbmRpZgorCitzeXNtZW1faW5mb190IF9faW5pdGRhdGEgc3lzbWVtOworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECitpbnQgaW5pdHJkX2lzX21hcHBlZDsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBpbml0X21tdSh2b2lkKTsKKworLyoKKyAqIEJvb3QgcGFyYW1ldGVyIHBhcnNpbmcuCisgKgorICogVGhlIFh0ZW5zYSBwb3J0IHVzZXMgYSBsaXN0IG9mIHZhcmlhYmxlLXNpemVkIHRhZ3MgdG8gcGFzcyBkYXRhIHRvCisgKiB0aGUga2VybmVsLiBUaGUgZmlyc3QgdGFnIG11c3QgYmUgYSBCUF9UQUdfRklSU1QgdGFnIGZvciB0aGUgbGlzdAorICogdG8gYmUgcmVjb2duaXNlZC4gVGhlIGxpc3QgaXMgdGVybWluYXRlZCB3aXRoIGEgemVyby1zaXplZAorICogQlBfVEFHX0xBU1QgdGFnLgorICovCisKK3R5cGVkZWYgc3RydWN0IHRhZ3RhYmxlIHsKKwl1MzIgdGFnOworCWludCAoKnBhcnNlKShjb25zdCBicF90YWdfdCopOworfSB0YWd0YWJsZV90OworCisjZGVmaW5lIF9fdGFndGFibGUodGFnLCBmbikgc3RhdGljIHRhZ3RhYmxlX3QgX190YWd0YWJsZV8jI2ZuIAkJXAorCV9fYXR0cmlidXRlX18oKHVudXNlZCwgX19zZWN0aW9uX18oIi50YWdsaXN0IikpKSA9IHsgdGFnLCBmbiB9CisKKy8qIHBhcnNlIGN1cnJlbnQgdGFnICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19tZW0oY29uc3QgYnBfdGFnX3QgKnRhZykKK3sKKwltZW1pbmZvX3QgKm1pID0gKG1lbWluZm9fdCopKHRhZy0+ZGF0YSk7CisKKwlpZiAobWktPnR5cGUgIT0gTUVNT1JZX1RZUEVfQ09OVkVOVElPTkFMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3lzbWVtLm5yX2JhbmtzID49IFNZU01FTV9CQU5LU19NQVgpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIklnbm9yaW5nIG1lbW9yeSBiYW5rIDB4JTA4bHggc2l6ZSAlbGRLQlxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKW1pLT5zdGFydCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKW1pLT5lbmQgLSAodW5zaWduZWQgbG9uZyltaS0+c3RhcnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3lzbWVtLmJhbmtbc3lzbWVtLm5yX2JhbmtzXS50eXBlICA9IG1pLT50eXBlOworCXN5c21lbS5iYW5rW3N5c21lbS5ucl9iYW5rc10uc3RhcnQgPSBQQUdFX0FMSUdOKG1pLT5zdGFydCk7CisJc3lzbWVtLmJhbmtbc3lzbWVtLm5yX2JhbmtzXS5lbmQgICA9IG1pLT5lbmQgJiBQQUdFX1NJWkU7CisJc3lzbWVtLm5yX2JhbmtzKys7CisKKwlyZXR1cm4gMDsKK30KKworX190YWd0YWJsZShCUF9UQUdfTUVNT1JZLCBwYXJzZV90YWdfbWVtKTsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV90YWdfaW5pdHJkKGNvbnN0IGJwX3RhZ190KiB0YWcpCit7CisJbWVtaW5mb190KiBtaTsKKwltaSA9IChtZW1pbmZvX3QqKSh0YWctPmRhdGEpOworCWluaXRyZF9zdGFydCA9ICh2b2lkKikobWktPnN0YXJ0KTsKKwlpbml0cmRfZW5kID0gKHZvaWQqKShtaS0+ZW5kKTsKKworCXJldHVybiAwOworfQorCitfX3RhZ3RhYmxlKEJQX1RBR19JTklUUkQsIHBhcnNlX3RhZ19pbml0cmQpOworCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU5JVFJEICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3RhZ19jbWRsaW5lKGNvbnN0IGJwX3RhZ190KiB0YWcpCit7CisJc3RybmNweShjb21tYW5kX2xpbmUsIChjaGFyKikodGFnLT5kYXRhKSwgQ09NTUFORF9MSU5FX1NJWkUpOworCWNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRSAtIDFdID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KKworX190YWd0YWJsZShCUF9UQUdfQ09NTUFORF9MSU5FLCBwYXJzZV90YWdfY21kbGluZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2Jvb3RwYXJhbShjb25zdCBicF90YWdfdCogdGFnKQoreworCWV4dGVybiB0YWd0YWJsZV90IF9fdGFndGFibGVfYmVnaW4sIF9fdGFndGFibGVfZW5kOworCXRhZ3RhYmxlX3QgKnQ7CisKKwkvKiBCb290IHBhcmFtZXRlcnMgbXVzdCBzdGFydCB3aXRoIGEgQlBfVEFHX0ZJUlNUIHRhZy4gKi8KKworCWlmICh0YWctPmlkICE9IEJQX1RBR19GSVJTVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbnZhbGlkIGJvb3QgcGFyYW1ldGVycyFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0YWcgPSAoYnBfdGFnX3QqKSgodW5zaWduZWQgbG9uZyl0YWcgKyBzaXplb2YoYnBfdGFnX3QpICsgdGFnLT5zaXplKTsKKworCS8qIFBhcnNlIGFsbCB0YWdzLiAqLworCisJd2hpbGUgKHRhZyAhPSBOVUxMICYmIHRhZy0+aWQgIT0gQlBfVEFHX0xBU1QpIHsKKwkgCWZvciAodCA9ICZfX3RhZ3RhYmxlX2JlZ2luOyB0IDwgJl9fdGFndGFibGVfZW5kOyB0KyspIHsKKwkJCWlmICh0YWctPmlkID09IHQtPnRhZykgeworCQkJCXQtPnBhcnNlKHRhZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHQgPT0gJl9fdGFndGFibGVfZW5kKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSWdub3JpbmcgdGFnICIKKwkJCSAgICAgICAiMHglMDh4XG4iLCB0YWctPmlkKTsKKwkJdGFnID0gKGJwX3RhZ190KikoKHVuc2lnbmVkIGxvbmcpKHRhZyArIDEpICsgdGFnLT5zaXplKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYXJjaGl0ZWN0dXJlLiAoRWFybHkgc3RhZ2UpCisgKi8KKwordm9pZCBfX2luaXQgaW5pdF9hcmNoKGJwX3RhZ190ICpicF9zdGFydCkKK3sKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCWluaXRyZF9zdGFydCA9ICZfX2luaXRyZF9zdGFydDsKKwlpbml0cmRfZW5kID0gJl9faW5pdHJkX2VuZDsKKyNlbmRpZgorCisJc3lzbWVtLm5yX2JhbmtzID0gMDsKKworI2lmZGVmIENPTkZJR19DTURMSU5FX0JPT0wKKwlzdHJjcHkoY29tbWFuZF9saW5lLCBkZWZhdWx0X2NvbW1hbmRfbGluZSk7CisjZW5kaWYKKworCS8qIFBhcnNlIGJvb3QgcGFyYW1ldGVycyAqLworCisgICAgICAgIGlmIChicF9zdGFydCkKKwkgIHBhcnNlX2Jvb3RwYXJhbShicF9zdGFydCk7CisKKwlpZiAoc3lzbWVtLm5yX2JhbmtzID09IDApIHsKKwkJc3lzbWVtLm5yX2JhbmtzID0gMTsKKwkJc3lzbWVtLmJhbmtbMF0uc3RhcnQgPSBQTEFURk9STV9ERUZBVUxUX01FTV9TVEFSVDsKKwkJc3lzbWVtLmJhbmtbMF0uZW5kID0gUExBVEZPUk1fREVGQVVMVF9NRU1fU1RBUlQKKwkJCQkgICAgICsgUExBVEZPUk1fREVGQVVMVF9NRU1fU0laRTsKKwl9CisKKwkvKiBFYXJseSBob29rIGZvciBwbGF0Zm9ybXMgKi8KKworCXBsYXRmb3JtX2luaXQoYnBfc3RhcnQpOworCisJLyogSW5pdGlhbGl6ZSBNTVUuICovCisKKwlpbml0X21tdSgpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBzeXN0ZW0uIFNldHVwIG1lbW9yeSBhbmQgcmVzZXJ2ZSByZWdpb25zLgorICovCisKK2V4dGVybiBjaGFyIF9lbmQ7CitleHRlcm4gY2hhciBfc3RleHQ7CitleHRlcm4gY2hhciBfV2luZG93VmVjdG9yc190ZXh0X3N0YXJ0OworZXh0ZXJuIGNoYXIgX1dpbmRvd1ZlY3RvcnNfdGV4dF9lbmQ7CitleHRlcm4gY2hhciBfRGVidWdJbnRlcnJ1cHRWZWN0b3JfbGl0ZXJhbF9zdGFydDsKK2V4dGVybiBjaGFyIF9EZWJ1Z0ludGVycnVwdFZlY3Rvcl90ZXh0X2VuZDsKK2V4dGVybiBjaGFyIF9LZXJuZWxFeGNlcHRpb25WZWN0b3JfbGl0ZXJhbF9zdGFydDsKK2V4dGVybiBjaGFyIF9LZXJuZWxFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQ7CitleHRlcm4gY2hhciBfVXNlckV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsX3N0YXJ0OworZXh0ZXJuIGNoYXIgX1VzZXJFeGNlcHRpb25WZWN0b3JfdGV4dF9lbmQ7CitleHRlcm4gY2hhciBfRG91YmxlRXhjZXB0aW9uVmVjdG9yX2xpdGVyYWxfc3RhcnQ7CitleHRlcm4gY2hhciBfRG91YmxlRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kOworCit2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCit7CisJZXh0ZXJuIGludCBtZW1fcmVzZXJ2ZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOworCWV4dGVybiB2b2lkIGJvb3RtZW1faW5pdCh2b2lkKTsKKworCW1lbWNweShzYXZlZF9jb21tYW5kX2xpbmUsIGNvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOworCXNhdmVkX2NvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRS0xXSA9ICdcMCc7CisJKmNtZGxpbmVfcCA9IGNvbW1hbmRfbGluZTsKKworCS8qIFJlc2VydmUgc29tZSBtZW1vcnkgcmVnaW9ucyAqLworCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKGluaXRyZF9zdGFydCA8IGluaXRyZF9lbmQpIHsKKwkJaW5pdHJkX2lzX21hcHBlZCA9IG1lbV9yZXNlcnZlKF9fcGEoaW5pdHJkX3N0YXJ0KSwKKwkJCQkJICAgICAgIF9fcGEoaW5pdHJkX2VuZCksIDApOworCQlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOworIAl9IGVsc2UgeworCQlpbml0cmRfc3RhcnQgPSAwOworCX0KKyNlbmRpZgorCisJbWVtX3Jlc2VydmUoX19wYSgmX3N0ZXh0KSxfX3BhKCZfZW5kKSwgMSk7CisKKwltZW1fcmVzZXJ2ZShfX3BhKCZfV2luZG93VmVjdG9yc190ZXh0X3N0YXJ0KSwKKwkJICAgIF9fcGEoJl9XaW5kb3dWZWN0b3JzX3RleHRfZW5kKSwgMCk7CisKKwltZW1fcmVzZXJ2ZShfX3BhKCZfRGVidWdJbnRlcnJ1cHRWZWN0b3JfbGl0ZXJhbF9zdGFydCksCisJCSAgICBfX3BhKCZfRGVidWdJbnRlcnJ1cHRWZWN0b3JfdGV4dF9lbmQpLCAwKTsKKworCW1lbV9yZXNlcnZlKF9fcGEoJl9LZXJuZWxFeGNlcHRpb25WZWN0b3JfbGl0ZXJhbF9zdGFydCksCisJCSAgICBfX3BhKCZfS2VybmVsRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kKSwgMCk7CisKKwltZW1fcmVzZXJ2ZShfX3BhKCZfVXNlckV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsX3N0YXJ0KSwKKwkJICAgIF9fcGEoJl9Vc2VyRXhjZXB0aW9uVmVjdG9yX3RleHRfZW5kKSwgMCk7CisKKwltZW1fcmVzZXJ2ZShfX3BhKCZfRG91YmxlRXhjZXB0aW9uVmVjdG9yX2xpdGVyYWxfc3RhcnQpLAorCQkgICAgX19wYSgmX0RvdWJsZUV4Y2VwdGlvblZlY3Rvcl90ZXh0X2VuZCksIDApOworCisJYm9vdG1lbV9pbml0KCk7CisKKwlwbGF0Zm9ybV9zZXR1cChjbWRsaW5lX3ApOworCisKKwlwYWdpbmdfaW5pdCgpOworCisjaWZkZWYgQ09ORklHX1ZUCisjIGlmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKQorCWNvbnN3aXRjaHAgPSAmdmdhX2NvbjsKKyMgZWxpZiBkZWZpbmVkKENPTkZJR19EVU1NWV9DT05TT0xFKQorCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBDT05GSUdfUENJCisJcGxhdGZvcm1fcGNpYmlvc19pbml0KCk7CisjZW5kaWYKK30KKwordm9pZCBtYWNoaW5lX3Jlc3RhcnQoY2hhciAqIGNtZCkKK3sKKwlwbGF0Zm9ybV9yZXN0YXJ0KCk7Cit9CisKK3ZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCit7CisJcGxhdGZvcm1faGFsdCgpOworCXdoaWxlICgxKTsKK30KKwordm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQoreworCXBsYXRmb3JtX3Bvd2VyX29mZigpOworCXdoaWxlICgxKTsKK30KKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKgorICogRGlzcGxheSBzb21lIGNvcmUgaW5mb3JtYXRpb24gdGhyb3VnaCAvcHJvYy9jcHVpbmZvLgorICovCisKK3N0YXRpYyBpbnQKK2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnNsb3QpCit7CisJLyogaGlnaC1sZXZlbCBzdHVmZiAqLworCXNlcV9wcmludGYoZiwicHJvY2Vzc29yXHQ6IDBcbiIKKwkJICAgICAidmVuZG9yX2lkXHQ6IFRlbnNpbGljYVxuIgorCQkgICAgICJtb2RlbFx0XHQ6IFh0ZW5zYSAiIFhDSEFMX0hXX1JFTEVBU0VfTkFNRSAiXG4iCisJCSAgICAgImNvcmUgSURcdFx0OiAiIFhDSEFMX0NPUkVfSUQgIlxuIgorCQkgICAgICJidWlsZCBJRFx0OiAweCV4XG4iCisJCSAgICAgImJ5dGUgb3JkZXJcdDogJXNcbiIKKyAJCSAgICAgImNwdSBNSHpcdFx0OiAlbHUuJTAybHVcbiIKKwkJICAgICAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iLAorCQkgICAgIFhDSEFMX0JVSUxEX1VOSVFVRV9JRCwKKwkJICAgICBYQ0hBTF9IQVZFX0JFID8gICJiaWciIDogImxpdHRsZSIsCisJCSAgICAgQ0NPVU5UX1BFUl9KSUZGWS8oMTAwMDAwMC9IWiksCisJCSAgICAgKENDT1VOVF9QRVJfSklGRlkvKDEwMDAwL0haKSkgJSAxMDAsCisJCSAgICAgbG9vcHNfcGVyX2ppZmZ5Lyg1MDAwMDAvSFopLAorCQkgICAgIChsb29wc19wZXJfamlmZnkvKDUwMDAvSFopKSAlIDEwMCk7CisKKwlzZXFfcHJpbnRmKGYsImZsYWdzXHRcdDogIgorI2lmIFhDSEFMX0hBVkVfTk1JCisJCSAgICAgIm5taSAiCisjZW5kaWYKKyNpZiBYQ0hBTF9IQVZFX0RFQlVHCisJCSAgICAgImRlYnVnICIKKyMgaWYgWENIQUxfSEFWRV9PQ0QKKwkJICAgICAib2NkICIKKyMgZW5kaWYKKyNlbmRpZgorI2lmIFhDSEFMX0hBVkVfREVOU0lUWQorCSAgICAJICAgICAiZGVuc2l0eSAiCisjZW5kaWYKKyNpZiBYQ0hBTF9IQVZFX0JPT0xFQU5TCisJCSAgICAgImJvb2xlYW4gIgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9MT09QUworCQkgICAgICJsb29wICIKKyNlbmRpZgorI2lmIFhDSEFMX0hBVkVfTlNBCisJCSAgICAgIm5zYSAiCisjZW5kaWYKKyNpZiBYQ0hBTF9IQVZFX01JTk1BWAorCQkgICAgICJtaW5tYXggIgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9TRVhUCisJCSAgICAgInNleHQgIgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9DTEFNUFMKKwkJICAgICAiY2xhbXBzICIKKyNlbmRpZgorI2lmIFhDSEFMX0hBVkVfTUFDMTYKKwkJICAgICAibWFjMTYgIgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9NVUwxNgorCQkgICAgICJtdWwxNiAiCisjZW5kaWYKKyNpZiBYQ0hBTF9IQVZFX01VTDMyCisJCSAgICAgIm11bDMyICIKKyNlbmRpZgorI2lmIFhDSEFMX0hBVkVfTVVMMzJfSElHSAorCQkgICAgICJtdWwzMmggIgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9GUAorCQkgICAgICJmcHUgIgorI2VuZGlmCisJCSAgICAgIlxuIik7CisKKwkvKiBSZWdpc3RlcnMuICovCisJc2VxX3ByaW50ZihmLCJwaHlzaWNhbCBhcmVnc1x0OiAlZFxuIgorCQkgICAgICJtaXNjIHJlZ3NcdDogJWRcbiIKKwkJICAgICAiaWJyZWFrXHRcdDogJWRcbiIKKwkJICAgICAiZGJyZWFrXHRcdDogJWRcbiIsCisJCSAgICAgWENIQUxfTlVNX0FSRUdTLAorCQkgICAgIFhDSEFMX05VTV9NSVNDX1JFR1MsCisJCSAgICAgWENIQUxfTlVNX0lCUkVBSywKKwkJICAgICBYQ0hBTF9OVU1fREJSRUFLKTsKKworCisJLyogSW50ZXJydXB0LiAqLworCXNlcV9wcmludGYoZiwibnVtIGludHNcdDogJWRcbiIKKwkJICAgICAiZXh0IGludHNcdDogJWRcbiIKKwkJICAgICAiaW50IGxldmVsc1x0OiAlZFxuIgorCQkgICAgICJ0aW1lcnNcdFx0OiAlZFxuIgorCQkgICAgICJkZWJ1ZyBsZXZlbFx0OiAlZFxuIiwKKwkJICAgICBYQ0hBTF9OVU1fSU5URVJSVVBUUywKKwkJICAgICBYQ0hBTF9OVU1fRVhUSU5URVJSVVBUUywKKwkJICAgICBYQ0hBTF9OVU1fSU5UTEVWRUxTLAorCQkgICAgIFhDSEFMX05VTV9USU1FUlMsCisJCSAgICAgWENIQUxfREVCVUdMRVZFTCk7CisKKwkvKiBDb3Byb2Nlc3NvcnMgKi8KKyNpZiBYQ0hBTF9IQVZFX0NQCisJc2VxX3ByaW50ZihmLCAiY29wcm9jZXNzb3JzXHQ6ICVkXG4iLCBYQ0hBTF9DUF9OVU0pOworI2Vsc2UKKwlzZXFfcHJpbnRmKGYsICJjb3Byb2Nlc3NvcnNcdDogbm9uZVxuIik7CisjZW5kaWYKKworCS8qIHtJLER9e1JBTSxST019IGFuZCBYTE1JICovCisJc2VxX3ByaW50ZihmLCJpbnN0IFJPTXNcdDogJWRcbiIKKwkJICAgICAiaW5zdCBSQU1zXHQ6ICVkXG4iCisJCSAgICAgImRhdGEgUk9Nc1x0OiAlZFxuIgorCQkgICAgICJkYXRhIFJBTXNcdDogJWRcbiIKKwkJICAgICAiWExNSSBwb3J0c1x0OiAlZFxuIiwKKwkJICAgICBYQ0hBTF9OVU1fSVJPTSwKKwkJICAgICBYQ0hBTF9OVU1fSVJBTSwKKwkJICAgICBYQ0hBTF9OVU1fRFJPTSwKKwkJICAgICBYQ0hBTF9OVU1fRFJBTSwKKwkJICAgICBYQ0hBTF9OVU1fWExNSSk7CisKKwkvKiBDYWNoZSAqLworCXNlcV9wcmludGYoZiwiaWNhY2hlIGxpbmUgc2l6ZTogJWRcbiIKKwkJICAgICAiaWNhY2hlIHdheXNcdDogJWRcbiIKKwkJICAgICAiaWNhY2hlIHNpemVcdDogJWRcbiIKKwkJICAgICAiaWNhY2hlIGZsYWdzXHQ6ICIKKyNpZiBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQorCQkgICAgICJsb2NrIgorI2VuZGlmCisJCSAgICAgIlxuIgorCQkgICAgICJkY2FjaGUgbGluZSBzaXplOiAlZFxuIgorCQkgICAgICJkY2FjaGUgd2F5c1x0OiAlZFxuIgorCQkgICAgICJkY2FjaGUgc2l6ZVx0OiAlZFxuIgorCQkgICAgICJkY2FjaGUgZmxhZ3NcdDogIgorI2lmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKKwkJICAgICAid3JpdGViYWNrIgorI2VuZGlmCisjaWYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKKwkJICAgICAibG9jayIKKyNlbmRpZgorCQkgICAgICJcbiIsCisJCSAgICAgWENIQUxfSUNBQ0hFX0xJTkVTSVpFLAorCQkgICAgIFhDSEFMX0lDQUNIRV9XQVlTLAorCQkgICAgIFhDSEFMX0lDQUNIRV9TSVpFLAorCQkgICAgIFhDSEFMX0RDQUNIRV9MSU5FU0laRSwKKwkJICAgICBYQ0hBTF9EQ0FDSEVfV0FZUywKKwkJICAgICBYQ0hBTF9EQ0FDSEVfU0laRSk7CisKKwkvKiBNTVUgKi8KKwlzZXFfcHJpbnRmKGYsIkFTSUQgYml0c1x0OiAlZFxuIgorCQkgICAgICJBU0lEIGludmFsaWRcdDogJWRcbiIKKwkJICAgICAiQVNJRCBrZXJuZWxcdDogJWRcbiIKKwkJICAgICAicmluZ3NcdFx0OiAlZFxuIgorCQkgICAgICJpdGxiIHdheXNcdDogJWRcbiIKKwkJICAgICAiaXRsYiBBUiB3YXlzXHQ6ICVkXG4iCisJCSAgICAgImR0bGIgd2F5c1x0OiAlZFxuIgorCQkgICAgICJkdGxiIEFSIHdheXNcdDogJWRcbiIsCisJCSAgICAgWENIQUxfTU1VX0FTSURfQklUUywKKwkJICAgICBYQ0hBTF9NTVVfQVNJRF9JTlZBTElELAorCQkgICAgIFhDSEFMX01NVV9BU0lEX0tFUk5FTCwKKwkJICAgICBYQ0hBTF9NTVVfUklOR1MsCisJCSAgICAgWENIQUxfSVRMQl9XQVlTLAorCQkgICAgIFhDSEFMX0lUTEJfQVJGX1dBWVMsCisJCSAgICAgWENIQUxfRFRMQl9XQVlTLAorCQkgICAgIFhDSEFMX0RUTEJfQVJGX1dBWVMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBzaG93IG9ubHkgQ1BVICMwIGluZm8uCisgKi8KK3N0YXRpYyB2b2lkICoKK2Nfc3RhcnQoc3RydWN0IHNlcV9maWxlICpmLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gKHZvaWQgKikgKCgqcG9zID09IDApID8gKHZvaWQgKikxIDogTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkICoKK2NfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdikKK3sKK30KKworc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPQoreworCXN0YXJ0OiAgY19zdGFydCwKKwluZXh0OiAgIGNfbmV4dCwKKwlzdG9wOiAgIGNfc3RvcCwKKwlzaG93OiAgIGNfc2hvdworfTsKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZlMWUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3NpZ25hbC5jCkBAIC0wLDAgKzEsNzEzIEBACisvLyBUT0RPIGNvcHJvY2Vzc29yIHN0dWZmCisvKgorICogIGxpbnV4L2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKiAgMTk5Ny0xMS0yOCAgTW9kaWZpZWQgZm9yIFBPU0lYLjFiIHNpZ25hbHMgYnkgUmljaGFyZCBIZW5kZXJzb24KKyAqCisgKiAgSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20+CisgKiAgQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICoKKyAqCisgKgorICovCisKKyNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KKyNpbmNsdWRlIDx4dGVuc2EvaGFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxhc20vdWNvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2RlZmluZSBERUJVR19TSUcgIDAKKworI2RlZmluZSBfQkxPQ0tBQkxFICh+KHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKSkKKworYXNtbGlua2FnZSBsb25nIHN5c193YWl0NChwaWRfdCBwaWQsdW5zaWduZWQgaW50ICogc3RhdF9hZGRyLCBpbnQgb3B0aW9ucywKKwkJCSAgc3RydWN0IHJ1c2FnZSAqIHJ1KTsKK2FzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCk7CisKK2V4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHJvY19vd25lcnNbXTsKKworCisvKgorICogQXRvbWljYWxseSBzd2FwIGluIHRoZSBuZXcgc2lnbmFsIG1hc2ssIGFuZCB3YWl0IGZvciBhIHNpZ25hbC4KKyAqLworCitpbnQgc3lzX3NpZ3N1c3BlbmQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJb2xkX3NpZ3NldF90IG1hc2sgPSAob2xkX3NpZ3NldF90KSByZWdzLT5hcmVnWzNdOworCXNpZ3NldF90IHNhdmVzZXQ7CisKKwltYXNrICY9IF9CTE9DS0FCTEU7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJcmVncy0+YXJlZ1syXSA9IC1FSU5UUjsKKwl3aGlsZSAoMSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKGRvX3NpZ25hbChyZWdzLCAmc2F2ZXNldCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KK30KKworYXNtbGlua2FnZSBpbnQKK3N5c19ydF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpZ3NldF90ICp1bmV3c2V0ID0gKHNpZ3NldF90ICopIHJlZ3MtPmFyZWdbNF07CisJc2l6ZV90IHNpZ3NldHNpemUgPSAoc2l6ZV90KSByZWdzLT5hcmVnWzNdOworCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKKwkvKiBYWFg6IERvbid0IHByZWNsdWRlIGhhbmRsaW5nIGRpZmZlcmVudCBzaXplZCBzaWdzZXRfdCdzLiAgKi8KKwlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2Yoc2lnc2V0X3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3c2V0LCB1bmV3c2V0LCBzaXplb2YobmV3c2V0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXNpZ2RlbHNldG1hc2soJm5ld3NldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPmJsb2NrZWQgPSBuZXdzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJcmVncy0+YXJlZ1syXSA9IC1FSU5UUjsKKwl3aGlsZSAoMSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGUoKTsKKwkJaWYgKGRvX3NpZ25hbChyZWdzLCAmc2F2ZXNldCkpCisJCQlyZXR1cm4gLUVJTlRSOworCX0KK30KKworYXNtbGlua2FnZSBpbnQKK3N5c19zaWdhY3Rpb24oaW50IHNpZywgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24gKmFjdCwKKwkgICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiAqb2FjdCkKK3sKKwlzdHJ1Y3Qga19zaWdhY3Rpb24gbmV3X2thLCBvbGRfa2E7CisJaW50IHJldDsKKworCWlmIChhY3QpIHsKKwkJb2xkX3NpZ3NldF90IG1hc2s7CisJCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CisJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9oYW5kbGVyLCAmYWN0LT5zYV9oYW5kbGVyKSB8fAorCQkgICAgX19nZXRfdXNlcihuZXdfa2Euc2Euc2FfcmVzdG9yZXIsICZhY3QtPnNhX3Jlc3RvcmVyKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX2dldF91c2VyKG5ld19rYS5zYS5zYV9mbGFncywgJmFjdC0+c2FfZmxhZ3MpOworCQlfX2dldF91c2VyKG1hc2ssICZhY3QtPnNhX21hc2spOworCQlzaWdpbml0c2V0KCZuZXdfa2Euc2Euc2FfbWFzaywgbWFzayk7CisJfQorCisJcmV0ID0gZG9fc2lnYWN0aW9uKHNpZywgYWN0ID8gJm5ld19rYSA6IE5VTEwsIG9hY3QgPyAmb2xkX2thIDogTlVMTCk7CisKKwlpZiAoIXJldCAmJiBvYWN0KSB7CisJCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfV1JJVEUsIG9hY3QsIHNpemVvZigqb2FjdCkpIHx8CisJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9oYW5kbGVyLCAmb2FjdC0+c2FfaGFuZGxlcikgfHwKKwkJICAgIF9fcHV0X3VzZXIob2xkX2thLnNhLnNhX3Jlc3RvcmVyLCAmb2FjdC0+c2FfcmVzdG9yZXIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCV9fcHV0X3VzZXIob2xkX2thLnNhLnNhX2ZsYWdzLCAmb2FjdC0+c2FfZmxhZ3MpOworCQlfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9tYXNrLnNpZ1swXSwgJm9hY3QtPnNhX21hc2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgaW50CitzeXNfc2lnYWx0c3RhY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJY29uc3Qgc3RhY2tfdCAqdXNzID0gKHN0YWNrX3QgKikgcmVncy0+YXJlZ1s0XTsKKwlzdGFja190ICp1b3NzID0gKHN0YWNrX3QgKikgcmVncy0+YXJlZ1szXTsKKworCWlmIChyZWdzLT5kZXBjID4gNjQpCisJCXBhbmljICgiRG91YmxlIGV4Y2VwdGlvbiBzeXNfc2lncmV0dXJuXG4iKTsKKworCisJcmV0dXJuIGRvX3NpZ2FsdHN0YWNrKHVzcywgdW9zcywgcmVncy0+YXJlZ1sxXSk7Cit9CisKKworLyoKKyAqIERvIGEgc2lnbmFsIHJldHVybjsgdW5kbyB0aGUgc2lnbmFsIHN0YWNrLgorICovCisKK3N0cnVjdCBzaWdmcmFtZQoreworCXN0cnVjdCBzaWdjb250ZXh0IHNjOworCXN0cnVjdCBfY3BzdGF0ZSBjcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZXh0cmFtYXNrW19OU0lHX1dPUkRTLTFdOworCXVuc2lnbmVkIGNoYXIgcmV0Y29kZVs2XTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRbNF07IC8qIFJlc2VydmVkIGFyZWEgZm9yIGNoYWluaW5nICovCisJdW5zaWduZWQgaW50IHdpbmRvd1s0XTsgLyogV2luZG93IG9mIDQgcmVnaXN0ZXJzIGZvciBpbml0aWFsIGNvbnRleHQgKi8KK307CisKK3N0cnVjdCBydF9zaWdmcmFtZQoreworCXN0cnVjdCBzaWdpbmZvIGluZm87CisJc3RydWN0IHVjb250ZXh0IHVjOworCXN0cnVjdCBfY3BzdGF0ZSBjcHN0YXRlOworCXVuc2lnbmVkIGNoYXIgcmV0Y29kZVs2XTsKKwl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWRbNF07IC8qIFJlc2VydmVkIGFyZWEgZm9yIGNoYWluaW5nICovCisJdW5zaWduZWQgaW50IHdpbmRvd1s0XTsgLyogV2luZG93IG9mIDQgcmVnaXN0ZXJzIGZvciBpbml0aWFsIGNvbnRleHQgKi8KK307CisKK2V4dGVybiB2b2lkIHJlbGVhc2VfYWxsX2NwIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CisKKworLy8gRklYTUUgcmVzdG9yZV9jcGV4dHJhCitzdGF0aWMgaW5saW5lIGludAorcmVzdG9yZV9jcGV4dHJhIChzdHJ1Y3QgX2Nwc3RhdGUgKmJ1ZikKK3sKKyNpZiAwCisJLyogVGhlIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlIHVzZWQgY29wcm9jZXNzb3JzIGluIHdoaWNoCisJICogY2FzZSB0aGV5IGFyZSBzdGlsbCBlbmFibGVkLiAgV2UgZGlzYWJsZSB0aGVtIHRvIGZvcmNlIGEKKwkgKiByZWxvYWRpbmcgb2YgdGhlIG9yaWdpbmFsIHRhc2sncyBDUCBzdGF0ZSBieSB0aGUgbGF6eQorCSAqIGNvbnRleHQtc3dpdGNoaW5nIG1lY2hhbmlzbXMgb2YgQ1AgZXhjZXB0aW9uIGhhbmRsaW5nLgorCSAqIEFsc28sIHdlIGVzc2VudGlhbGx5IGRpc2NhcmQgYW55IGNvcHJvY2Vzc29yIHN0YXRlIHRoYXQgdGhlCisJICogc2lnbmFsIGhhbmRsZXIgY3JlYXRlZC4gKi8KKworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlyZWxlYXNlX2FsbF9jcCh0c2spOworCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRzay0+dGhyZWFkLmNwZXh0cmEsIGJ1ZiwgVE9UQUxfQ1BFWFRSQV9TSVpFKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKiBOb3RlOiBXZSBkb24ndCBjb3B5IGRvdWJsZSBleGNlcHRpb24gJ3RyZWdzJywgd2UgaGF2ZSB0byBmaW5pc2ggZG91YmxlIGV4Yy4gZmlyc3QgYmVmb3JlIHdlIHJldHVybiB0byBzaWduYWwgaGFuZGxlciEgVGhpcyBkYmwuZXhjLmhhbmRsZXIgbWlnaHQgY2F1c2UgYW5vdGhlciBkb3VibGUgZXhjZXB0aW9uLCBidXQgSSB0aGluayB3ZSBhcmUgZmluZSBhcyB0aGUgc2l0dWF0aW9uIGlzIHRoZSBzYW1lIGFzIGlmIHdlIGhhZCByZXR1cm5lZCB0byB0aGUgc2lnbmFsIGhhbmRlcmwgYW5kIGdvdCBhbiBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkuLi4KKyAqLworCisKK3N0YXRpYyBpbnQKK3Jlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKQoreworCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQ7CisJdW5zaWduZWQgaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBwczsKKwlzdHJ1Y3QgX2Nwc3RhdGUgKmJ1ZjsKKworI2RlZmluZSBDT1BZKHgpCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPngsICZzYy0+c2NfIyN4KQorCUNPUFkocGMpOworCUNPUFkoZGVwYyk7CisJQ09QWSh3bWFzayk7CisJQ09QWShsYmVnKTsKKwlDT1BZKGxlbmQpOworCUNPUFkobGNvdW50KTsKKwlDT1BZKHNhcik7CisJQ09QWSh3aW5kb3diYXNlKTsKKwlDT1BZKHdpbmRvd3N0YXJ0KTsKKyN1bmRlZiBDT1BZCisKKwkvKiBGb3IgUFMsIHJlc3RvcmUgb25seSBQUy5DQUxMSU5DLgorCSAqIEFzc3VtZSB0aGF0IGFsbCBvdGhlciBiaXRzIGFyZSBlaXRoZXIgdGhlIHNhbWUgYXMgZm9yIHRoZSBzaWduYWwKKwkgKiBoYW5kbGVyLCBvciB0aGUgdXNlciBtb2RlIHZhbHVlIGRvZXNuJ3QgbWF0dGVyIChlLmcuIFBTLk9XQikuCisJICovCisJZXJyIHw9IF9fZ2V0X3VzZXIocHMsICZzYy0+c2NfcHMpOworCXJlZ3MtPnBzID0gKHJlZ3MtPnBzICYgflhDSEFMX1BTX0NBTExJTkNfTUFTSykKKwkJfCAocHMgJiBYQ0hBTF9QU19DQUxMSU5DX01BU0spOworCisJLyogQWRkaXRpb25hbCBjb3JydXB0aW9uIGNoZWNrcyAqLworCisJaWYgKChyZWdzLT53aW5kb3diYXNlID49IChYQ0hBTF9OVU1fQVJFR1MvNCkpCisJfHwgKChyZWdzLT53aW5kb3dzdGFydCAmIH4oKDE8PChYQ0hBTF9OVU1fQVJFR1MvNCkpIC0gMSkpICE9IDApICkKKwkJZXJyID0gMTsKKwlpZiAoKHJlZ3MtPmxjb3VudCA+IDApCisJJiYgKChyZWdzLT5sYmVnID4gVEFTS19TSVpFKSB8fCAocmVncy0+bGVuZCA+IFRBU0tfU0laRSkpICkKKwkJZXJyID0gMTsKKworCS8qIFJlc3RvcmUgZXh0ZW5kZWQgcmVnaXN0ZXIgc3RhdGUuCisJICogU2VlIHN0cnVjdCB0aHJlYWRfc3RydWN0IGluIHByb2Nlc3Nvci5oLgorCSAqLworCXRocmVhZCA9ICZjdXJyZW50LT50aHJlYWQ7CisKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlciAocmVncy0+YXJlZywgc2MtPnNjX2FyZWcsIFhDSEFMX05VTV9BUkVHUyo0KTsKKwllcnIgfD0gX19nZXRfdXNlcihidWYsICZzYy0+c2NfY3BzdGF0ZSk7CisJaWYgKGJ1ZikgeworCQlpZiAodmVyaWZ5X2FyZWEoVkVSSUZZX1JFQUQsIGJ1Ziwgc2l6ZW9mKCpidWYpKSkKKwkJCWdvdG8gYmFkZnJhbWU7CisJCWVyciB8PSByZXN0b3JlX2NwZXh0cmEoYnVmKTsKKwl9CisKKwlyZWdzLT5zeXNjYWxsID0gLTE7CQkvKiBkaXNhYmxlIHN5c2NhbGwgY2hlY2tzICovCisJcmV0dXJuIGVycjsKKworYmFkZnJhbWU6CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZmx1c2hfbXlfY3BzdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworI2lmIDAJLy8gRklYTUUKKwlmb3IgKGkgPSAwOyBpIDwgWENIQUxfQ1BfTlVNOyBpKyspIHsKKwkJaWYgKHRzayA9PSBjb3Byb2Nfb3duZXJzW2ldKSB7CisJCQl4dGhhbF92YWxpZGF0ZV9jcChpKTsKKwkJCXh0aGFsX3NhdmVfY3ByZWdzKHRzay0+dGhyZWFkLmNwcmVnc19wdHJbaV0sIGkpOworCisJCQkvKiBJbnZhbGlkYXRlIGFuZCAiZGlzb3duIiB0aGUgY3AgdG8gYWxsb3cKKwkJCSAqIGNhbGxlcnMgdGhlIGNoYW5jZSB0byByZXNldCBjcCBzdGF0ZSBpbiB0aGUKKwkJCSAqIHRhc2tfc3RydWN0LiAqLworCisJCQl4dGhhbF9pbnZhbGlkYXRlX2NwKGkpOworCQkJY29wcm9jX293bmVyc1tpXSA9IDA7CisJCX0KKwl9CisjZW5kaWYKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qIFJldHVybiBjb2RlczoKKwkwOiAgbm90aGluZyBzYXZlZAorCTE6ICBzdHVmZiB0byBzYXZlLCBzdWNjZXNzZnVsCisgICAgICAgLTE6ICBzdHVmZiB0byBzYXZlLCBlcnJvciBoYXBwZW5lZAorKi8KK3N0YXRpYyBpbnQKK3NhdmVfY3BleHRyYSAoc3RydWN0IF9jcHN0YXRlICpidWYpCit7CisjaWYgKFhDSEFMX0VYVFJBX1NBX1NJWkUgPT0gMCkgJiYgKFhDSEFMX0NQX05VTSA9PSAwKQorCXJldHVybiAwOworI2Vsc2UKKworCS8qIEZJWE1FOiBJZiBhIHRhc2sgaGFzIG5ldmVyIHVzZWQgYSBjb3Byb2Nlc3NvciwgdGhlcmUgaXMKKwkgKiBubyBuZWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgYW55dGhpbmcuICBUcmFja2luZyB0aGlzCisJICogaW5mb3JtYXRpb24gd291bGQgYWxsb3cgdXMgdG8gb3B0aW1pemUgdGhpcyBzZWN0aW9uLgorCSAqIFBlcmhhcHMgd2UgY2FuIHVzZSBjdXJyZW50LT51c2VkX21hdGggb3IgKGN1cnJlbnQtPmZsYWdzICYKKwkgKiBQRl9VU0VERlBVKSBvciBkZWZpbmUgYSBuZXcgZmllbGQgaW4gdGhlIHRocmVhZAorCSAqIHN0cnVjdHVyZS4gKi8KKworCS8qIFdlIGZsdXNoIGFueSBsaXZlLCB0YXNrLW93bmVkIGNwIHN0YXRlIHRvIHRoZSB0YXNrX3N0cnVjdCwKKwkgKiB0aGVuIGNvcHkgaXQgYWxsIHRvIHRoZSBzaWdmcmFtZS4gIFRoZW4gd2UgY2xlYXIgYWxsCisJICogY3AvZXh0cmEgc3RhdGUgaW4gdGhlIHRhc2tfc3RydWN0LCBlZmZlY3RpdmVseQorCSAqIGNsZWFyaW5nL3Jlc2V0dGluZyBhbGwgY3AvZXh0cmEgc3RhdGUgZm9yIHRoZSBzaWduYWwKKwkgKiBoYW5kbGVyIChjcC1leGNlcHRpb24gaGFuZGxpbmcgd2lsbCBsb2FkIHRoZXNlIG5ldyB2YWx1ZXMKKwkgKiBpbnRvIHRoZSBjcC9leHRyYSByZWdpc3RlcnMuKSAgVGhpcyBzdGVwIGlzIGltcG9ydGFudCBmb3IKKwkgKiB0aGluZ3MgbGlrZSBhIGZsb2F0aW5nLXBvaW50IGNwLCB3aGVyZSB0aGUgT1MgbXVzdCByZXNldAorCSAqIHRoZSBGQ1IgdG8gdGhlIGRlZmF1bHQgcm91bmRpbmcgbW9kZS4gKi8KKworCWludCBlcnIgPSAwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCWZsdXNoX215X2Nwc3RhdGUodHNrKTsKKwkvKiBOb3RlIHRoYXQgd2UganVzdCBjb3B5IGV2ZXJ5dGhpbmc6ICdleHRyYScgYW5kICdjcCcgc3RhdGUgdG9nZXRoZXIuKi8KKwllcnIgfD0gX19jb3B5X3RvX3VzZXIoYnVmLCB0c2stPnRocmVhZC5jcF9zYXZlLCBYVEVOU0FfQ1BfRVhUUkFfU0laRSk7CisJbWVtc2V0KHRzay0+dGhyZWFkLmNwX3NhdmUsIDAsIFhURU5TQV9DUF9FWFRSQV9TSVpFKTsKKworI2lmIChYVEVOU0FfQ1BfRVhUUkFfU0laRSA9PSAwKQorI2Vycm9yIFNhbml0eSBjaGVjayBvbiBtZW1zZXQgYWJvdmUsIGNwZXh0cmFfc2l6ZSBzaG91bGQgbm90IGJlIHplcm8uCisjZW5kaWYKKworCXJldHVybiBlcnIgPyAtMSA6IDE7CisjZW5kaWYKK30KKworc3RhdGljIGludAorc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCAqc2MsIHN0cnVjdCBfY3BzdGF0ZSAqY3BzdGF0ZSwKKwkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZDsKKwlpbnQgZXJyID0gMDsKKworLy9wcmludGsoInNldHVwX3NpZ2NvbnRleHRcbiIpOworI2RlZmluZSBDT1BZKHgpCWVyciB8PSBfX3B1dF91c2VyKHJlZ3MtPngsICZzYy0+c2NfIyN4KQorCUNPUFkocGMpOworCUNPUFkocHMpOworCUNPUFkoZGVwYyk7CisJQ09QWSh3bWFzayk7CisJQ09QWShsYmVnKTsKKwlDT1BZKGxlbmQpOworCUNPUFkobGNvdW50KTsKKwlDT1BZKHNhcik7CisJQ09QWSh3aW5kb3diYXNlKTsKKwlDT1BZKHdpbmRvd3N0YXJ0KTsKKyN1bmRlZiBDT1BZCisKKwkvKiBTYXZlIGV4dGVuZGVkIHJlZ2lzdGVyIHN0YXRlLgorCSAqIFNlZSBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCBpbiBwcm9jZXNzb3IuaC4KKwkgKi8KKwl0aHJlYWQgPSAmY3VycmVudC0+dGhyZWFkOworCWVyciB8PSBfX2NvcHlfdG9fdXNlciAoc2MtPnNjX2FyZWcsIHJlZ3MtPmFyZWcsIFhDSEFMX05VTV9BUkVHUyAqIDQpOworCWVyciB8PSBzYXZlX2NwZXh0cmEoY3BzdGF0ZSk7CisJZXJyIHw9IF9fcHV0X3VzZXIoZXJyID8gTlVMTCA6IGNwc3RhdGUsICZzYy0+c2NfY3BzdGF0ZSk7CisJLyogbm9uLWlCQ1MyIGV4dGVuc2lvbnMuLiAqLworCWVyciB8PSBfX3B1dF91c2VyKG1hc2ssICZzYy0+b2xkbWFzayk7CisKKwlyZXR1cm4gZXJyOworfQorCithc21saW5rYWdlIGludCBzeXNfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBzaWdmcmFtZSAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lICopcmVncy0+YXJlZ1sxXTsKKwlzaWdzZXRfdCBzZXQ7CisJaWYgKHJlZ3MtPmRlcGMgPiA2NCkKKwkJcGFuaWMgKCJEb3VibGUgZXhjZXB0aW9uIHN5c19zaWdyZXR1cm5cbiIpOworCisJaWYgKHZlcmlmeV9hcmVhKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCQlnb3RvIGJhZGZyYW1lOworCisJaWYgKF9fZ2V0X3VzZXIoc2V0LnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKQorCSAgICB8fCAoX05TSUdfV09SRFMgPiAxCisJCSYmIF9fY29weV9mcm9tX3VzZXIoJnNldC5zaWdbMV0sICZmcmFtZS0+ZXh0cmFtYXNrLAorCQkJCSAgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MpKQorCQlnb3RvIGJhZGZyYW1lOworCXJldHVybiByZWdzLT5hcmVnWzJdOworCitiYWRmcmFtZToKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKK2FzbWxpbmthZ2UgaW50IHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHJ0X3NpZ2ZyYW1lICpmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgKilyZWdzLT5hcmVnWzFdOworCXNpZ3NldF90IHNldDsKKwlzdGFja190IHN0OworCWludCByZXQ7CisJaWYgKHJlZ3MtPmRlcGMgPiA2NCkKKwl7CisJCXByaW50aygiISEhISEhISBERVBDICEhISEhISFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodmVyaWZ5X2FyZWEoVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCisJCWdvdG8gYmFkZnJhbWU7CisKKwlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LCAmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKKwkJZ290byBiYWRmcmFtZTsKKworCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0KSkKKwkJZ290byBiYWRmcmFtZTsKKwlyZXQgPSByZWdzLT5hcmVnWzJdOworCisJaWYgKF9fY29weV9mcm9tX3VzZXIoJnN0LCAmZnJhbWUtPnVjLnVjX3N0YWNrLCBzaXplb2Yoc3QpKSkKKwkJZ290byBiYWRmcmFtZTsKKwkvKiBJdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBhdm9pZCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhhbiB0bworCSAgIGNhbGwgaXQgYW5kIGlnbm9yZSBlcnJvcnMuICAqLworCWRvX3NpZ2FsdHN0YWNrKCZzdCwgTlVMTCwgcmVncy0+YXJlZ1sxXSk7CisKKwlyZXR1cm4gcmV0OworCitiYWRmcmFtZToKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdXAgYSBzaWduYWwgZnJhbWUuCisgKi8KKworLyoKKyAqIERldGVybWluZSB3aGljaCBzdGFjayB0byB1c2UuLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKgorZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHVuc2lnbmVkIGxvbmcgc3AsIHNpemVfdCBmcmFtZV9zaXplKQoreworCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgIT0gMCAmJiAhIG9uX3NpZ19zdGFjayhzcCkpCisJCXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CisKKwlyZXR1cm4gKHZvaWQgKikoKHNwIC0gZnJhbWVfc2l6ZSkgJiAtMTZ1bCk7Cit9CisKKyNkZWZpbmUgVVNFX1NJR1JFVFVSTgkJMAorI2RlZmluZSBVU0VfUlRfU0lHUkVUVVJOCTEKKworc3RhdGljIGludAorZ2VuX3JldHVybl9jb2RlKHVuc2lnbmVkIGNoYXIgKmNvZGVtZW0sIHVuc2lnbmVkIGludCB1c2VfcnRfc2lncmV0dXJuKQoreworCXVuc2lnbmVkIGludCByZXRjYWxsOworCWludCBlcnIgPSAwOworCisjaWYgMAorCS8qIElnbm9yaW5nIFNBX1JFU1RPUkVSIGZvciBub3c7IGl0J3Mgc3VwcG9zZWQgdG8gYmUgb2Jzb2xldGUsCisJICogYW5kIHRoZSB4dGVuc2EgZ2xpYmMgZG9lc24ndCB1c2UgaXQuCisJICovCisJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSB7CisJCXJlZ3MtPnByID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9yZXN0b3JlcjsKKwl9IGVsc2UKKyNlbmRpZiAvKiAwICovCisJeworCisjaWYgKF9fTlJfc2lncmV0dXJuID4gMjU1KSB8fCAoX19OUl9ydF9zaWdyZXR1cm4gPiAyNTUpCisKKy8qIFRoZSAxMi1iaXQgaW1tZWRpYXRlIGlzIHJlYWxseSBzcGxpdCB1cCB3aXRoaW4gdGhlIDI0LWJpdCBNT1ZJCisgKiBpbnN0cnVjdGlvbi4gIEFzIGxvbmcgYXMgdGhlIGFib3ZlIHN5c3RlbSBjYWxsIG51bWJlcnMgZml0IHdpdGhpbgorICogOC1iaXRzLCB0aGUgZm9sbG93aW5nIGNvZGUgd29ya3MgZmluZS4gU2VlIHRoZSBYdGVuc2EgSVNBIGZvcgorICogZGV0YWlscy4KKyAqLworCisjZXJyb3IgR2VuZXJhdGluZyB0aGUgTU9WSSBpbnN0cnVjdGlvbiBiZWxvdyBicmVha3MhCisjZW5kaWYKKworCQlyZXRjYWxsID0gdXNlX3J0X3NpZ3JldHVybiA/IF9fTlJfcnRfc2lncmV0dXJuIDogX19OUl9zaWdyZXR1cm47CisKKyNpZmRlZiBfX1hURU5TQV9FQl9fICAgLyogQmlnIEVuZGlhbiB2ZXJzaW9uICovCisJCS8qIEdlbmVyYXRlIGluc3RydWN0aW9uOiAgTU9WSSBhMiwgcmV0Y2FsbCAqLworCQllcnIgfD0gX19wdXRfdXNlcigweDIyLCAmY29kZW1lbVswXSk7CisJCWVyciB8PSBfX3B1dF91c2VyKDB4MGEsICZjb2RlbWVtWzFdKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIocmV0Y2FsbCwgJmNvZGVtZW1bMl0pOworCQkvKiBHZW5lcmF0ZSBpbnN0cnVjdGlvbjogIFNZU0NBTEwgKi8KKwkJZXJyIHw9IF9fcHV0X3VzZXIoMHgwMCwgJmNvZGVtZW1bM10pOworCQllcnIgfD0gX19wdXRfdXNlcigweDA1LCAmY29kZW1lbVs0XSk7CisJCWVyciB8PSBfX3B1dF91c2VyKDB4MDAsICZjb2RlbWVtWzVdKTsKKworI2VsaWYgZGVmaW5lZCBfX1hURU5TQV9FTF9fICAgLyogTGl0dGxlIEVuZGlhbiB2ZXJzaW9uICovCisJCS8qIEdlbmVyYXRlIGluc3RydWN0aW9uOiAgTU9WSSBhMiwgcmV0Y2FsbCAqLworCQllcnIgfD0gX19wdXRfdXNlcigweDIyLCAmY29kZW1lbVswXSk7CisJCWVyciB8PSBfX3B1dF91c2VyKDB4YTAsICZjb2RlbWVtWzFdKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIocmV0Y2FsbCwgJmNvZGVtZW1bMl0pOworCQkvKiBHZW5lcmF0ZSBpbnN0cnVjdGlvbjogIFNZU0NBTEwgKi8KKwkJZXJyIHw9IF9fcHV0X3VzZXIoMHgwMCwgJmNvZGVtZW1bM10pOworCQllcnIgfD0gX19wdXRfdXNlcigweDUwLCAmY29kZW1lbVs0XSk7CisJCWVyciB8PSBfX3B1dF91c2VyKDB4MDAsICZjb2RlbWVtWzVdKTsKKyNlbHNlCisjZXJyb3IgTXVzdCB1c2UgY29tcGlsZXIgZm9yIFh0ZW5zYSBwcm9jZXNzb3JzLgorI2VuZGlmCisJfQorCisJLyogRmx1c2ggZ2VuZXJhdGVkIGNvZGUgb3V0IG9mIHRoZSBkYXRhIGNhY2hlICovCisKKwlpZiAoZXJyID09IDApCisJCV9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyljb2RlbWVtLCA2VUwpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK3NldF90aHJlYWRfc3RhdGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHZvaWQgKnN0YWNrLCB1bnNpZ25lZCBjaGFyICpyZXRhZGRyLAorCXZvaWQgKmhhbmRsZXIsIHVuc2lnbmVkIGxvbmcgYXJnMSwgdm9pZCAqYXJnMiwgdm9pZCAqYXJnMykKK3sKKwkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLworCXN0YXJ0X3RocmVhZChyZWdzLCAodW5zaWduZWQgbG9uZykgaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpIHN0YWNrKTsKKworCS8qIFNldCB1cCBhIHN0YWNrIGZyYW1lIGZvciBhIGNhbGw0CisJICogTm90ZTogUFMuQ0FMTElOQyBpcyBzZXQgdG8gb25lIGJ5IHN0YXJ0X3RocmVhZAorCSAqLworCXJlZ3MtPmFyZWdbNF0gPSAoKCh1bnNpZ25lZCBsb25nKSByZXRhZGRyKSAmIDB4M2ZmZmZmZmYpIHwgMHg0MDAwMDAwMDsKKwlyZWdzLT5hcmVnWzZdID0gYXJnMTsKKwlyZWdzLT5hcmVnWzddID0gKHVuc2lnbmVkIGxvbmcpIGFyZzI7CisJcmVncy0+YXJlZ1s4XSA9ICh1bnNpZ25lZCBsb25nKSBhcmczOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAorCQkJc2lnc2V0X3QgKnNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNpZ2ZyYW1lICpmcmFtZTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgc2lnbmFsOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa2EsIHJlZ3MtPmFyZWdbMV0sIHNpemVvZigqZnJhbWUpKTsKKwlpZiAocmVncy0+ZGVwYyA+IDY0KQorCXsKKwkJcHJpbnRrKCIhISEhISEhIERFUEMgISEhISEhIVxuIik7CisJCXJldHVybjsKKwl9CisKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwlzaWduYWwgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCisJCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKKwkJJiYgc2lnIDwgMzIKKwkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KKwkJOiBzaWc7CisKKwllcnIgfD0gc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnNjLCAmZnJhbWUtPmNwc3RhdGUsIHJlZ3MsIHNldC0+c2lnWzBdKTsKKworCWlmIChfTlNJR19XT1JEUyA+IDEpIHsKKwkJZXJyIHw9IF9fY29weV90b191c2VyKGZyYW1lLT5leHRyYW1hc2ssICZzZXQtPnNpZ1sxXSwKKwkJCQkgICAgICBzaXplb2YoZnJhbWUtPmV4dHJhbWFzaykpOworCX0KKworCS8qIENyZWF0ZSBzeXNfc2lncmV0dXJuIHN5c2NhbGwgaW4gc3RhY2sgZnJhbWUgKi8KKwllcnIgfD0gZ2VuX3JldHVybl9jb2RlKGZyYW1lLT5yZXRjb2RlLCBVU0VfU0lHUkVUVVJOKTsKKworCWlmIChlcnIpCisJCWdvdG8gZ2l2ZV9zaWdzZWd2OworCisJLyogQ3JlYXRlIHNpZ25hbCBoYW5kbGVyIGV4ZWN1dGlvbiBjb250ZXh0LgorCSAqIFJldHVybiBjb250ZXh0IG5vdCBtb2RpZmllZCB1bnRpbCB0aGlzIHBvaW50LgorCSAqLworCXNldF90aHJlYWRfc3RhdGUocmVncywgZnJhbWUsIGZyYW1lLT5yZXRjb2RlLAorCQlrYS0+c2Euc2FfaGFuZGxlciwgc2lnbmFsLCAmZnJhbWUtPnNjLCBOVUxMKTsKKworCS8qIFNldCBhY2Nlc3MgbW9kZSB0byBVU0VSX0RTLiAgTm9tZW5jbGF0dXJlIGlzIG91dGRhdGVkLCBidXQKKwkgKiBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgaW4gdWFjY2Vzcy5oCisJICovCisJc2V0X2ZzKFVTRVJfRFMpOworCisKKyNpZiBERUJVR19TSUcKKwlwcmludGsoIlNJRyBkZWxpdmVyICglczolZCk6IHNpZ25hbD0lZCBzcD0lcCBwYz0lMDh4XG4iLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNpZ25hbCwgZnJhbWUsIHJlZ3MtPnBjKTsKKyNlbmRpZgorCisJcmV0dXJuOworCitnaXZlX3NpZ3NlZ3Y6CisJaWYgKHNpZyA9PSBTSUdTRUdWKQorCQlrYS0+c2Euc2FfaGFuZGxlciA9IFNJR19ERkw7CisJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCisJCQkgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcnRfc2lnZnJhbWUgKmZyYW1lOworCWludCBlcnIgPSAwOworCWludCBzaWduYWw7CisKKwlmcmFtZSA9IGdldF9zaWdmcmFtZShrYSwgcmVncy0+YXJlZ1sxXSwgc2l6ZW9mKCpmcmFtZSkpOworCWlmIChyZWdzLT5kZXBjID4gNjQpCisJCXBhbmljICgiRG91YmxlIGV4Y2VwdGlvbiBzeXNfc2lncmV0dXJuXG4iKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwlzaWduYWwgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCisJCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKKwkJJiYgc2lnIDwgMzIKKwkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KKwkJOiBzaWc7CisKKwllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCBpbmZvKTsKKworCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpOworCWVyciB8PSBfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfbGluayk7CisJZXJyIHw9IF9fcHV0X3VzZXIoKHZvaWQgKiljdXJyZW50LT5zYXNfc3Nfc3AsCisJCQkgICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOworCWVyciB8PSBfX3B1dF91c2VyKHNhc19zc19mbGFncyhyZWdzLT5hcmVnWzFdKSwKKwkJCSAgJmZyYW1lLT51Yy51Y19zdGFjay5zc19mbGFncyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+c2FzX3NzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CisJZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5jcHN0YXRlLAorCQkJICAgICAgICByZWdzLCBzZXQtPnNpZ1swXSk7CisJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpOworCisJLyogQ3JlYXRlIHN5c19ydF9zaWdyZXR1cm4gc3lzY2FsbCBpbiBzdGFjayBmcmFtZSAqLworCWVyciB8PSBnZW5fcmV0dXJuX2NvZGUoZnJhbWUtPnJldGNvZGUsIFVTRV9SVF9TSUdSRVRVUk4pOworCisJaWYgKGVycikKKwkJZ290byBnaXZlX3NpZ3NlZ3Y7CisKKwkvKiBDcmVhdGUgc2lnbmFsIGhhbmRsZXIgZXhlY3V0aW9uIGNvbnRleHQuCisJICogUmV0dXJuIGNvbnRleHQgbm90IG1vZGlmaWVkIHVudGlsIHRoaXMgcG9pbnQuCisJICovCisJc2V0X3RocmVhZF9zdGF0ZShyZWdzLCBmcmFtZSwgZnJhbWUtPnJldGNvZGUsCisJCWthLT5zYS5zYV9oYW5kbGVyLCBzaWduYWwsICZmcmFtZS0+aW5mbywgJmZyYW1lLT51Yyk7CisKKwkvKiBTZXQgYWNjZXNzIG1vZGUgdG8gVVNFUl9EUy4gIE5vbWVuY2xhdHVyZSBpcyBvdXRkYXRlZCwgYnV0CisJICogZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGluIHVhY2Nlc3MuaAorCSAqLworCXNldF9mcyhVU0VSX0RTKTsKKworI2lmIERFQlVHX1NJRworCXByaW50aygiU0lHIHJ0IGRlbGl2ZXIgKCVzOiVkKTogc2lnbmFsPSVkIHNwPSVwIHBjPSUwOHhcbiIsCisJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc2lnbmFsLCBmcmFtZSwgcmVncy0+cGMpOworI2VuZGlmCisKKwlyZXR1cm47CisKK2dpdmVfc2lnc2VndjoKKwlpZiAoc2lnID09IFNJR1NFR1YpCisJCWthLT5zYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKKwlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7Cit9CisKKworCisvKgorICogTm90ZSB0aGF0ICdpbml0JyBpcyBhIHNwZWNpYWwgcHJvY2VzczogaXQgZG9lc24ndCBnZXQgc2lnbmFscyBpdCBkb2Vzbid0CisgKiB3YW50IHRvIGhhbmRsZS4gVGh1cyB5b3UgY2Fubm90IGtpbGwgaW5pdCBldmVuIHdpdGggYSBTSUdLSUxMIGV2ZW4gYnkKKyAqIG1pc3Rha2UuCisgKgorICogTm90ZSB0aGF0IHdlIGdvIHRocm91Z2ggdGhlIHNpZ25hbHMgdHdpY2U6IG9uY2UgdG8gY2hlY2sgdGhlIHNpZ25hbHMgdGhhdAorICogdGhlIGtlcm5lbCBjYW4gaGFuZGxlLCBhbmQgdGhlbiB3ZSBidWlsZCBhbGwgdGhlIHVzZXItbGV2ZWwgc2lnbmFsIGhhbmRsaW5nCisgKiBzdGFjay1mcmFtZXMgaW4gb25lIGdvIGFmdGVyIHRoYXQuCisgKi8KK2ludCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHNpZ3NldF90ICpvbGRzZXQpCit7CisJc2lnaW5mb190IGluZm87CisJaW50IHNpZ25yOworCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKKworCWlmICghb2xkc2V0KQorCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKKworCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOworCisJLyogQXJlIHdlIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KKwlpZiAocmVncy0+c3lzY2FsbCA+PSAwKSB7CisJCS8qIElmIHNvLCBjaGVjayBzeXN0ZW0gY2FsbCByZXN0YXJ0aW5nLi4gKi8KKwkJc3dpdGNoIChyZWdzLT5hcmVnWzJdKSB7CisJCQljYXNlIEVSRVNUQVJUTk9IQU5EOgorCQkJY2FzZSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0s6CisJCQkJcmVncy0+YXJlZ1syXSA9IC1FSU5UUjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBFUkVTVEFSVFNZUzoKKwkJCQlpZiAoIShrYS5zYS5zYV9mbGFncyAmIFNBX1JFU1RBUlQpKSB7CisJCQkJCXJlZ3MtPmFyZWdbMl0gPSAtRUlOVFI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCQljYXNlIEVSRVNUQVJUTk9JTlRSOgorCQkJCXJlZ3MtPmFyZWdbMl0gPSByZWdzLT5zeXNjYWxsOworCQkJCXJlZ3MtPnBjIC09IDM7CisJCX0KKwl9CisKKwlpZiAoc2lnbnIgPT0gMCkKKwkJcmV0dXJuIDA7CQkvKiBubyBzaWduYWxzIGRlbGl2ZXJlZCAqLworCisJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCisKKwkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCisJaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKwkJc2V0dXBfcnRfZnJhbWUoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7CisJZWxzZQorCQlzZXR1cF9mcmFtZShzaWduciwgJmthLCBvbGRzZXQsIHJlZ3MpOworCisJaWYgKGthLnNhLnNhX2ZsYWdzICYgU0FfT05FU0hPVCkKKwkJa2Euc2Euc2FfaGFuZGxlciA9IFNJR19ERkw7CisKKwlpZiAoIShrYS5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2Euc2Euc2FfbWFzayk7CisJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCwgc2lnbnIpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwYzY0OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5jCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogYXJjaC94dGVuc2Eva2VybmVsL3N5c2NhbGwuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUgLSAyMDAwIGJ5IFJhbGYgQmFlY2hsZQorICoKKyAqIEpvZSBUYXlsb3IgPGpvZUB0ZW5zaWxpY2EuY29tLCBqb2V0eWxyQHlhaG9vLmNvbT4KKyAqIE1hcmMgR2F1dGhpZXIgPG1hcmNAdGVuc2lsaWNhLmNvbSwgbWFyY0BhbHVtbmkudXdhdGVybG9vLmNhPgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICogS2V2aW4gQ2hlYQorICoKKyAqLworCisjZGVmaW5lIERFQlVHCTAKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tc2cuaD4KKyNpbmNsdWRlIDxsaW51eC9zaG0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc2lnbmFsLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9tbWFuLmg+CisjaW5jbHVkZSA8YXNtL3NobXBhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworZXh0ZXJuIHZvaWQgZG9fc3lzY2FsbF90cmFjZSh2b2lkKTsKK3R5cGVkZWYgaW50ICgqc3lzY2FsbF90KSh2b2lkICphMCwuLi4pOworZXh0ZXJuIHN5c2NhbGxfdCBzeXNfY2FsbF90YWJsZVtdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3lzX25hcmdfdGFibGVbXTsKKworLyoKKyAqIHN5c19waXBlKCkgaXMgdGhlIG5vcm1hbCBDIGNhbGxpbmcgc3RhbmRhcmQgZm9yIGNyZWF0aW5nIGEgcGlwZS4gSXQncyBub3QKKyAqIHRoZSB3YXkgdW5peCB0cmFkaXRpb25hbCBkb2VzIHRoaXMsIHRob3VnaC4KKyAqLworCitpbnQgc3lzX3BpcGUoaW50IF9fdXNlciAqdXNlcmZkcykKK3sKKwlpbnQgZmRbMl07CisJaW50IGVycm9yOworCisJZXJyb3IgPSBkb19waXBlKGZkKTsKKwlpZiAoIWVycm9yKSB7CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcmZkcywgZmQsIDIgKiBzaXplb2YoaW50KSkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENvbW1vbiBjb2RlIGZvciBvbGQgYW5kIG5ldyBtbWFwcy4KKyAqLworbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHByb3QsCisJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBmZCwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gTlVMTDsKKworCWZsYWdzICY9IH4oTUFQX0VYRUNVVEFCTEUgfCBNQVBfREVOWVdSSVRFKTsKKwlpZiAoIShmbGFncyAmIE1BUF9BTk9OWU1PVVMpKSB7CisJCWZpbGUgPSBmZ2V0KGZkKTsKKwkJaWYgKCFmaWxlKQorCQkJZ290byBvdXQ7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXBfcGdvZmYoZmlsZSwgYWRkciwgbGVuLCBwcm90LCBmbGFncywgcGdvZmYpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCisJaWYgKGZpbGUpCisJCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgc3lzX2Nsb25lKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBuZXdzcDsKKwlpbnQgX191c2VyICpwYXJlbnRfdGlkcHRyLCAqY2hpbGRfdGlkcHRyOworCWNsb25lX2ZsYWdzID0gcmVncy0+YXJlZ1s0XTsKKwluZXdzcCA9IHJlZ3MtPmFyZWdbM107CisJcGFyZW50X3RpZHB0ciA9IChpbnQgX191c2VyICopcmVncy0+YXJlZ1s1XTsKKwljaGlsZF90aWRwdHIgPSAoaW50IF9fdXNlciAqKXJlZ3MtPmFyZWdbNl07CisJaWYgKCFuZXdzcCkKKwkJbmV3c3AgPSByZWdzLT5hcmVnWzFdOworCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLG5ld3NwLHJlZ3MsMCxwYXJlbnRfdGlkcHRyLGNoaWxkX3RpZHB0cik7Cit9CisKKy8qCisgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KKyAqLworCitpbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgZXJyb3I7CisJY2hhciAqIGZpbGVuYW1lOworCisJZmlsZW5hbWUgPSBnZXRuYW1lKChjaGFyICopIChsb25nKXJlZ3MtPmFyZWdbNV0pOworCWVycm9yID0gUFRSX0VSUihmaWxlbmFtZSk7CisJaWYgKElTX0VSUihmaWxlbmFtZSkpCisJCWdvdG8gb3V0OworCWVycm9yID0gZG9fZXhlY3ZlKGZpbGVuYW1lLCAoY2hhciAqKikgKGxvbmcpcmVncy0+YXJlZ1szXSwKKwkgICAgICAgICAgICAgICAgICAoY2hhciAqKikgKGxvbmcpcmVncy0+YXJlZ1s0XSwgcmVncyk7CisJcHV0bmFtZShmaWxlbmFtZSk7CisKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBzeXNfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lICogbmFtZSkKK3sKKwlpZiAobmFtZSAmJiAhY29weV90b191c2VyKG5hbWUsICZzeXN0ZW1fdXRzbmFtZSwgc2l6ZW9mICgqbmFtZSkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoKKyAqIEJ1aWxkIHRoZSBzdHJpbmcgdGFibGUgZm9yIHRoZSBidWlsdGluICJwb29yIG1hbidzIHN0cmFjZSIuCisgKi8KKworI2lmIERFQlVHCisjZGVmaW5lIFNZU0NBTEwoZnVuLCBuYXJnKSAjZnVuLAorc3RhdGljIGNoYXIgKnNmbmFtZXNbXSA9IHsKKyNpbmNsdWRlICJzeXNjYWxscy5oIgorfTsKKyN1bmRlZiBTWVMKKyNlbmRpZgorCit2b2lkIHN5c3RlbV9jYWxsIChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzeXNjYWxsX3Qgc3lzY2FsbDsKKwl1bnNpZ25lZCBsb25nIHBhcm0wLCBwYXJtMSwgcGFybTIsIHBhcm0zLCBwYXJtNCwgcGFybTU7CisJaW50IG5hcmdzLCByZXM7CisJdW5zaWduZWQgaW50IHN5c2NhbGxucjsKKwlpbnQgcHM7CisKKyNpZiBERUJVRworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcGFybXNbNl07CisJY2hhciAqc3lzbmFtZTsKKyNlbmRpZgorCisJcmVncy0+c3lzY2FsbCA9IHJlZ3MtPmFyZWdbMl07CisKKwlkb19zeXNjYWxsX3RyYWNlKCk7CisKKwkvKiBIYXZlIHRvIGxvYWQgYWZ0ZXIgc3lzY2FsbF90cmFjZSBiZWNhdXNlIHN0cmFjZQorCSAqIHNvbWV0aW1lcyBjaGFuZ2VzIHJlZ3MtPnN5c2NhbGwuCisJICovCisJc3lzY2FsbG5yID0gcmVncy0+c3lzY2FsbDsKKworCXBhcm0wID0gcGFybTEgPSBwYXJtMiA9IHBhcm0zID0gcGFybTQgPSBwYXJtNSA9IDA7CisKKwkvKiBSZXN0b3JlIGludGVycnVwdCBsZXZlbCB0byBzeXNjYWxsIGludm9rZXIncy4KKwkgKiBJZiB0aGlzIHdlcmUgaW4gYXNzZW1ibHksIHdlIHdvdWxkbid0IGRpc2FibGUKKwkgKiBpbnRlcnJ1cHRzIGluIHRoZSBmaXJzdCBwbGFjZToKKwkgKi8KKwlsb2NhbF9zYXZlX2ZsYWdzIChwcyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoKHBzICYgflhDSEFMX1BTX0lOVExFVkVMX01BU0spIHwKKwkJCSAgKHJlZ3MtPnBzICYgWENIQUxfUFNfSU5UTEVWRUxfTUFTSykgKTsKKworCWlmIChzeXNjYWxsbnIgPiBfX05SX0xpbnV4X3N5c2NhbGxzKSB7CisJCXJlZ3MtPmFyZWdbMl0gPSAtRU5PU1lTOworCQlyZXR1cm47CisJfQorCisJc3lzY2FsbCA9IHN5c19jYWxsX3RhYmxlW3N5c2NhbGxucl07CisJbmFyZ3MgPSBzeXNfbmFyZ190YWJsZVtzeXNjYWxsbnJdOworCisJaWYgKHN5c2NhbGwgPT0gTlVMTCkgeworCQlyZWdzLT5hcmVnWzJdID0gLUVOT1NZUzsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZXJlIHNob3VsZG4ndCBiZSBtb3JlIHRoYW4gc2l4IGFyZ3VtZW50cyBpbiB0aGUgdGFibGUhICovCisKKwlpZiAobmFyZ3MgPiA2KQorCQlwYW5pYygiSW50ZXJuYWwgZXJyb3IgLSB0b28gbWFueSBzeXNjYWxsIGFyZ3VtZW50cyAoJWQpIVxuIiwKKwkJICAgICAgbmFyZ3MpOworCisJLyogTGludXggdGFrZXMgc3lzdGVtLWNhbGwgYXJndW1lbnRzIGluIHJlZ2lzdGVycy4gIFRoZSBBQkkKKyAgICAgICAgICogYW5kIFh0ZW5zYSBzb2Z0d2FyZSBjb252ZW50aW9ucyByZXF1aXJlIHRoZSBzeXN0ZW0tY2FsbAorICAgICAgICAgKiBudW1iZXIgaW4gYTIuICBJZiBhbiBhcmd1bWVudCBleGlzdHMgaW4gYTIsIHdlIG1vdmUgaXQgdG8KKyAgICAgICAgICogdGhlIG5leHQgYXZhaWxhYmxlIHJlZ2lzdGVyLiAgTm90ZSB0aGF0IGZvciBpbXByb3ZlZAorICAgICAgICAgKiBlZmZpY2llbmN5LCB3ZSBkbyBOT1Qgc2hpZnQgYWxsIHBhcmFtZXRlcnMgZG93biBvbmUKKyAgICAgICAgICogcmVnaXN0ZXIgdG8gbWFpbnRhaW4gdGhlIG9yaWdpbmFsIG9yZGVyLgorCSAqCisgICAgICAgICAqIEF0IGJlc3QgY2FzZSAoemVybyBhcmd1bWVudHMpLCB3ZSBqdXN0IHdyaXRlIHRoZSBzeXNjYWxsCisgICAgICAgICAqIG51bWJlciB0byBhMi4gIEF0IHdvcnN0IGNhc2UgKDEgdG8gNiBhcmd1bWVudHMpLCB3ZSBtb3ZlCisgICAgICAgICAqIHRoZSBhcmd1bWVudCBpbiBhMiB0byB0aGUgbmV4dCBhdmFpbGFibGUgcmVnaXN0ZXIsIHRoZW4KKyAgICAgICAgICogd3JpdGUgdGhlIHN5c2NhbGwgbnVtYmVyIHRvIGEyLgorCSAqCisgICAgICAgICAqIEZvciBjbGFyaXR5LCB0aGUgZm9sbG93aW5nIHRydXRoIHRhYmxlIGVudW1lcmF0ZXMgYWxsCisgICAgICAgICAqIHBvc3NpYmlsaXRpZXMuCisJICoKKyAgICAgICAgICogYXJndW1lbnRzCXN5c2NhbGwgbnVtYmVyCWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUKKyAgICAgICAgICogLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKgkwCSAgICAgIGEyCisJICoJMQkgICAgICBhMglhMworCSAqCTIJICAgICAgYTIJYTQsICAgYTMKKwkgKgkzCSAgICAgIGEyCWE1LCAgIGEzLCAgIGE0CisJICoJNAkgICAgICBhMglhNiwgICBhMywgICBhNCwgICBhNQorCSAqCTUJICAgICAgYTIJYTcsICAgYTMsICAgYTQsICAgYTUsICAgYTYKKwkgKgk2CSAgICAgIGEyCWE4LCAgIGEzLCAgIGE0LCAgIGE1LCAgIGE2LCAgIGE3CisJICovCisJaWYgKG5hcmdzKSB7CisJCXBhcm0wID0gcmVncy0+YXJlZ1tuYXJncysyXTsKKwkJcGFybTEgPSByZWdzLT5hcmVnWzNdOworCQlwYXJtMiA9IHJlZ3MtPmFyZWdbNF07CisJCXBhcm0zID0gcmVncy0+YXJlZ1s1XTsKKwkJcGFybTQgPSByZWdzLT5hcmVnWzZdOworCQlwYXJtNSA9IHJlZ3MtPmFyZWdbN107CisJfSBlbHNlIC8qIG5hcmdzID09IDAgKi8KKwkJcGFybTAgPSAodW5zaWduZWQgbG9uZykgcmVnczsKKworI2lmIERFQlVHCisJcGFybXNbMF0gPSBwYXJtMDsKKwlwYXJtc1sxXSA9IHBhcm0xOworCXBhcm1zWzJdID0gcGFybTI7CisJcGFybXNbM10gPSBwYXJtMzsKKwlwYXJtc1s0XSA9IHBhcm00OworCXBhcm1zWzVdID0gcGFybTU7CisKKwlzeXNuYW1lID0gc2ZuYW1lc1tzeXNjYWxsbnJdOworCWlmIChzdHJuY21wKHN5c25hbWUsICJzeXNfIiwgNCkgPT0gMCkKKwkJc3lzbmFtZSA9IHN5c25hbWUgKyA0OworCisJcHJpbnRrKCJcMDE3U1lTQ0FMTDpJOiV4OiVkOiVzICAlcygiLCByZWdzLT5wYywgY3VycmVudC0+cGlkLAorCSAgICAgICBjdXJyZW50LT5jb21tLCBzeXNuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKKwkJcHJpbnRrKChpPjApID8gIiwgJSNseCIgOiAiJSNseCIsIHBhcm1zW2ldKTsKKwlwcmludGsoIilcbiIpOworI2VuZGlmCisKKwlyZXMgPSBzeXNjYWxsKCh2b2lkICopcGFybTAsIHBhcm0xLCBwYXJtMiwgcGFybTMsIHBhcm00LCBwYXJtNSk7CisKKyNpZiBERUJVRworCXByaW50aygiXDAxN1NZU0NBTEw6TzolZDolcyAgJXMoIixjdXJyZW50LT5waWQsIGN1cnJlbnQtPmNvbW0sIHN5c25hbWUpOworCWZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQorCQlwcmludGsoKGk+MCkgPyAiLCAlI2x4IiA6ICIlI2x4IiwgcGFybXNbaV0pOworCWlmIChyZXMgPCA0MDk2KQorCQlwcmludGsoIikgPSAlZFxuIiwgcmVzKTsKKwllbHNlCisJCXByaW50aygiKSA9ICUjeFxuIiwgcmVzKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCisJcmVncy0+YXJlZ1syXSA9IHJlczsKKwlkb19zeXNjYWxsX3RyYWNlKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaCBiL2FyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNmMxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc3lzY2FsbHMuaApAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC9zeXNjYWxscy5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IGJ5IFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIENoYW5nZXMgYnkgSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20+CisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBpcyBiZWluZyBpbmNsdWRlZCB0d2ljZSAtIG9uY2UgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbAorICogc3lzY2FsbHMgYW5kIG9uY2UgdG8gYnVpbGQgYSB0YWJsZSBvZiBob3cgbWFueSBhcmd1bWVudHMgZWFjaCBzeXNjYWxsCisgKiBhY2NlcHRzLiAgU3lzY2FsbHMgdGhhdCByZWNlaXZlIGEgcG9pbnRlciB0byB0aGUgc2F2ZWQgcmVnaXN0ZXJzIGFyZQorICogbWFya2VkIGFzIGhhdmluZyB6ZXJvIGFyZ3VtZW50cy4KKyAqCisgKiBUaGUgYmluYXJ5IGNvbXBhdGliaWxpdHkgY2FsbHMgYXJlIGluIGEgc2VwYXJhdGUgbGlzdC4KKyAqCisgKiBFbnRyeSAnMCcgdXNlZCB0byBiZSBzeXN0ZW1fY2FsbC4gIEl0J3MgcmVtb3ZlZCB0byBkaXNhYmxlIGluZGlyZWN0CisgKiBzeXN0ZW0gY2FsbHMgZm9yIG5vdyBzbyB1c2VyIHRhc2tzIGNhbid0IHJlY3Vyc2UuICBTZWUgbWlwcycKKyAqIHN5c19zeXNjYWxsIGZvciBhIGNvbXBhcmFibGUgZXhhbXBsZS4KKyAqLworCitTWVNDQUxMKDAsIDApCQkgICAgICAgICAgICAgICAgLyogMDAgKi8KK1NZU0NBTEwoc3lzX2V4aXQsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfcmVhZCwgMykKK1NZU0NBTEwoc3lzX3dyaXRlLCAzKQorU1lTQ0FMTChzeXNfb3BlbiwgMykJCQkvKiAwNSAqLworU1lTQ0FMTChzeXNfY2xvc2UsIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAzKQorU1lTQ0FMTChzeXNfY3JlYXQsIDIpCitTWVNDQUxMKHN5c19saW5rLCAyKQorU1lTQ0FMTChzeXNfdW5saW5rLCAxKQkJCS8qIDEwICovCitTWVNDQUxMKHN5c19leGVjdmUsIDApCitTWVNDQUxMKHN5c19jaGRpciwgMSkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCitTWVNDQUxMKHN5c19ta25vZCwgMykKK1NZU0NBTEwoc3lzX2NobW9kLCAyKQkJCS8qIDE1ICovCitTWVNDQUxMKHN5c19sY2hvd24sIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfbmV3c3RhdCwgMikKK1NZU0NBTEwoc3lzX2xzZWVrLCAzKQorU1lTQ0FMTChzeXNfZ2V0cGlkLCAwKQkJCS8qIDIwICovCitTWVNDQUxMKHN5c19tb3VudCwgNSkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCitTWVNDQUxMKHN5c19zZXR1aWQsIDEpCitTWVNDQUxMKHN5c19nZXR1aWQsIDApCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQkJLyogMjUgKi8KK1NZU0NBTEwoc3lzX3B0cmFjZSwgNCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDEpCitTWVNDQUxMKHN5c19uZXdmc3RhdCwgMikKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c191dGltZSwgMikJCQkvKiAzMCAqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19hY2Nlc3MsIDIpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDM1ICovCitTWVNDQUxMKHN5c19zeW5jLCAwKQorU1lTQ0FMTChzeXNfa2lsbCwgMikKK1NZU0NBTEwoc3lzX3JlbmFtZSwgMikKK1NZU0NBTEwoc3lzX21rZGlyLCAyKQorU1lTQ0FMTChzeXNfcm1kaXIsIDEpCQkJLyogNDAgKi8KK1NZU0NBTEwoc3lzX2R1cCwgMSkKK1NZU0NBTEwoc3lzX3BpcGUsIDEpCitTWVNDQUxMKHN5c190aW1lcywgMSkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19icmssIDEpCQkJLyogNDUgKi8KK1NZU0NBTEwoc3lzX3NldGdpZCwgMSkKK1NZU0NBTEwoc3lzX2dldGdpZCwgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19nZXRldWlkLCAwKQorU1lTQ0FMTChzeXNfZ2V0ZWdpZCwgMCkJCQkvKiA1MCAqLworU1lTQ0FMTChzeXNfYWNjdCwgMSkKK1NZU0NBTEwoc3lzX3Vtb3VudCwgMikKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19pb2N0bCwgMykKK1NZU0NBTEwoc3lzX2ZjbnRsLCAzKQkJCS8qIDU1ICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAyKQorU1lTQ0FMTChzeXNfc2V0cGdpZCwgMikKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfdW1hc2ssIDEpCQkJLyogNjAgKi8KK1NZU0NBTEwoc3lzX2Nocm9vdCwgMSkKK1NZU0NBTEwoc3lzX3VzdGF0LCAyKQorU1lTQ0FMTChzeXNfZHVwMiwgMikKK1NZU0NBTEwoc3lzX2dldHBwaWQsIDApCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQkJLyogNjUgKi8KK1NZU0NBTEwoc3lzX3NldHNpZCwgMCkKK1NZU0NBTEwoc3lzX3NpZ2FjdGlvbiwgMykKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAxKQorU1lTQ0FMTChzeXNfc2V0cmV1aWQsIDIpCQkvKiA3MCAqLworU1lTQ0FMTChzeXNfc2V0cmVnaWQsIDIpCitTWVNDQUxMKHN5c19zaWdzdXNwZW5kLCAwKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkKK1NZU0NBTEwoc3lzX3NldGhvc3RuYW1lLCAyKQorU1lTQ0FMTChzeXNfc2V0cmxpbWl0LCAyKQkJLyogNzUgKi8KK1NZU0NBTEwoc3lzX2dldHJsaW1pdCwgMikKK1NZU0NBTEwoc3lzX2dldHJ1c2FnZSwgMikKK1NZU0NBTEwoc3lzX2dldHRpbWVvZmRheSwgMikKK1NZU0NBTEwoc3lzX3NldHRpbWVvZmRheSwgMikKK1NZU0NBTEwoc3lzX2dldGdyb3VwcywgMikJCS8qIDgwICovCitTWVNDQUxMKHN5c19zZXRncm91cHMsIDIpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfc3ltbGluaywgMikKK1NZU0NBTEwoc3lzX25ld2xzdGF0LCAyKQorU1lTQ0FMTChzeXNfcmVhZGxpbmssIDMpCQkvKiA4NSAqLworU1lTQ0FMTChzeXNfdXNlbGliLCAxKQorU1lTQ0FMTChzeXNfc3dhcG9uLCAyKQorU1lTQ0FMTChzeXNfcmVib290LCAzKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMykKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDYpCQkvKiA5MCAqLworU1lTQ0FMTChzeXNfbXVubWFwLCAyKQorU1lTQ0FMTChzeXNfdHJ1bmNhdGUsIDIpCitTWVNDQUxMKHN5c19mdHJ1bmNhdGUsIDIpCitTWVNDQUxMKHN5c19mY2htb2QsIDIpCitTWVNDQUxMKHN5c19mY2hvd24sIDMpCQkJLyogOTUgKi8KK1NZU0NBTEwoc3lzX2dldHByaW9yaXR5LCAyKQorU1lTQ0FMTChzeXNfc2V0cHJpb3JpdHksIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfc3RhdGZzLCAyKQorU1lTQ0FMTChzeXNfZnN0YXRmcywgMikJCQkvKiAxMDAgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAyKQorU1lTQ0FMTChzeXNfc3lzbG9nLCAzKQorU1lTQ0FMTChzeXNfc2V0aXRpbWVyLCAzKQorU1lTQ0FMTChzeXNfZ2V0aXRpbWVyLCAyKQkJLyogMTA1ICovCitTWVNDQUxMKHN5c19uZXdzdGF0LCAyKQorU1lTQ0FMTChzeXNfbmV3bHN0YXQsIDIpCitTWVNDQUxMKHN5c19uZXdmc3RhdCwgMikKK1NZU0NBTEwoc3lzX3VuYW1lLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDExMCAqLworU1lTQ0FMTChzeXNfdmhhbmd1cCwgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfd2FpdDQsIDQpCitTWVNDQUxMKHN5c19zd2Fwb2ZmLCAxKQkJCS8qIDExNSAqLworU1lTQ0FMTChzeXNfc3lzaW5mbywgMSkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19mc3luYywgMSkKK1NZU0NBTEwoc3lzX3NpZ3JldHVybiwgMCkKK1NZU0NBTEwoc3lzX2Nsb25lLCAwKQkJCS8qIDEyMCAqLworU1lTQ0FMTChzeXNfc2V0ZG9tYWlubmFtZSwgMikKK1NZU0NBTEwoc3lzX25ld3VuYW1lLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKK1NZU0NBTEwoc3lzX2FkanRpbWV4LCAxKQorU1lTQ0FMTChzeXNfbXByb3RlY3QsIDMpCQkvKiAxMjUgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAyKQorU1lTQ0FMTChzeXNfaW5pdF9tb2R1bGUsIDIpCitTWVNDQUxMKHN5c19kZWxldGVfbW9kdWxlLCAxKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMSkJCS8qIDEzMCAqLworU1lTQ0FMTChzeXNfcXVvdGFjdGwsIDApCitTWVNDQUxMKHN5c19nZXRwZ2lkLCAxKQorU1lTQ0FMTChzeXNfZmNoZGlyLCAxKQorU1lTQ0FMTChzeXNfYmRmbHVzaCwgMikKK1NZU0NBTEwoc3lzX3N5c2ZzLCAzKQkJCS8qIDEzNSAqLworU1lTQ0FMTChzeXNfcGVyc29uYWxpdHksIDEpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCAwKQorU1lTQ0FMTChzeXNfc2V0ZnN1aWQsIDEpCitTWVNDQUxMKHN5c19zZXRmc2dpZCwgMSkKK1NZU0NBTEwoc3lzX2xsc2VlaywgNSkJCQkvKiAxNDAgKi8KK1NZU0NBTEwoc3lzX2dldGRlbnRzLCAzKQorU1lTQ0FMTChzeXNfc2VsZWN0LCA1KQorU1lTQ0FMTChzeXNfZmxvY2ssIDIpCitTWVNDQUxMKHN5c19tc3luYywgMykKK1NZU0NBTEwoc3lzX3JlYWR2LCAzKQkJCS8qIDE0NSAqLworU1lTQ0FMTChzeXNfd3JpdGV2LCAzKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMykKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCA0KQkJLyogaGFuZGxlZCBpbiBmYXN0IHN5c2NhbGwgaGFuZGxlci4gKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCQkvKiAxNTAgKi8KK1NZU0NBTEwoc3lzX2dldHNpZCwgMSkKK1NZU0NBTEwoc3lzX2ZkYXRhc3luYywgMSkKK1NZU0NBTEwoc3lzX3N5c2N0bCwgMSkKK1NZU0NBTEwoc3lzX21sb2NrLCAyKQorU1lTQ0FMTChzeXNfbXVubG9jaywgMikJCQkvKiAxNTUgKi8KK1NZU0NBTEwoc3lzX21sb2NrYWxsLCAxKQorU1lTQ0FMTChzeXNfbXVubG9ja2FsbCwgMCkKK1NZU0NBTEwoc3lzX3NjaGVkX3NldHBhcmFtLDIpCitTWVNDQUxMKHN5c19zY2hlZF9nZXRwYXJhbSwyKQorU1lTQ0FMTChzeXNfc2NoZWRfc2V0c2NoZWR1bGVyLDMpCS8qIDE2MCAqLworU1lTQ0FMTChzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyLDEpCitTWVNDQUxMKHN5c19zY2hlZF95aWVsZCwwKQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCwxKQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwxKQorU1lTQ0FMTChzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLDIpCS8qIDE2NSAqLworU1lTQ0FMTChzeXNfbmFub3NsZWVwLDIpCitTWVNDQUxMKHN5c19tcmVtYXAsNCkKK1NZU0NBTEwoc3lzX2FjY2VwdCwgMykKK1NZU0NBTEwoc3lzX2JpbmQsIDMpCitTWVNDQUxMKHN5c19jb25uZWN0LCAzKQkJCS8qIDE3MCAqLworU1lTQ0FMTChzeXNfZ2V0cGVlcm5hbWUsIDMpCitTWVNDQUxMKHN5c19nZXRzb2NrbmFtZSwgMykKK1NZU0NBTEwoc3lzX2dldHNvY2tvcHQsIDUpCitTWVNDQUxMKHN5c19saXN0ZW4sIDIpCitTWVNDQUxMKHN5c19yZWN2LCA0KQkJCS8qIDE3NSAqLworU1lTQ0FMTChzeXNfcmVjdmZyb20sIDYpCitTWVNDQUxMKHN5c19yZWN2bXNnLCAzKQorU1lTQ0FMTChzeXNfc2VuZCwgNCkKK1NZU0NBTEwoc3lzX3NlbmRtc2csIDMpCitTWVNDQUxMKHN5c19zZW5kdG8sIDYpCQkJLyogMTgwICovCitTWVNDQUxMKHN5c19zZXRzb2Nrb3B0LCA1KQorU1lTQ0FMTChzeXNfc2h1dGRvd24sIDIpCitTWVNDQUxMKHN5c19zb2NrZXQsIDMpCitTWVNDQUxMKHN5c19zb2NrZXRwYWlyLCA0KQorU1lTQ0FMTChzeXNfc2V0cmVzdWlkLCAzKQkJLyogMTg1ICovCitTWVNDQUxMKHN5c19nZXRyZXN1aWQsIDMpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLCA1KQorU1lTQ0FMTChzeXNfcG9sbCwgMykKK1NZU0NBTEwoc3lzX25mc3NlcnZjdGwsIDMpCitTWVNDQUxMKHN5c19zZXRyZXNnaWQsIDMpCQkvKiAxOTAgKi8KK1NZU0NBTEwoc3lzX2dldHJlc2dpZCwgMykKK1NZU0NBTEwoc3lzX3ByY3RsLCA1KQorU1lTQ0FMTChzeXNfcnRfc2lncmV0dXJuLCAwKQorU1lTQ0FMTChzeXNfcnRfc2lnYWN0aW9uLCA0KQorU1lTQ0FMTChzeXNfcnRfc2lncHJvY21hc2ssIDQpCQkvKiAxOTUgKi8KK1NZU0NBTEwoc3lzX3J0X3NpZ3BlbmRpbmcsIDIpCitTWVNDQUxMKHN5c19ydF9zaWd0aW1lZHdhaXQsIDQpCitTWVNDQUxMKHN5c19ydF9zaWdxdWV1ZWluZm8sIDMpCitTWVNDQUxMKHN5c19ydF9zaWdzdXNwZW5kLCAwKQorU1lTQ0FMTChzeXNfcHJlYWQ2NCwgNSkJCQkvKiAyMDAgKi8KK1NZU0NBTEwoc3lzX3B3cml0ZTY0LCA1KQorU1lTQ0FMTChzeXNfY2hvd24sIDMpCitTWVNDQUxMKHN5c19nZXRjd2QsIDIpCitTWVNDQUxMKHN5c19jYXBnZXQsIDIpCitTWVNDQUxMKHN5c19jYXBzZXQsIDIpCQkJLyogMjA1ICovCitTWVNDQUxMKHN5c19zaWdhbHRzdGFjaywgMCkKK1NZU0NBTEwoc3lzX3NlbmRmaWxlLCA0KQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsIDApCitTWVNDQUxMKHN5c19tbWFwLCA2KQkJCS8qIDIxMCAqLworU1lTQ0FMTChzeXNfdHJ1bmNhdGU2NCwgMikKK1NZU0NBTEwoc3lzX2Z0cnVuY2F0ZTY0LCAyKQorU1lTQ0FMTChzeXNfc3RhdDY0LCAyKQorU1lTQ0FMTChzeXNfbHN0YXQ2NCwgMikKK1NZU0NBTEwoc3lzX2ZzdGF0NjQsIDIpCQkJLyogMjE1ICovCitTWVNDQUxMKHN5c19waXZvdF9yb290LCAyKQorU1lTQ0FMTChzeXNfbWluY29yZSwgMykKK1NZU0NBTEwoc3lzX21hZHZpc2UsIDMpCitTWVNDQUxMKHN5c19nZXRkZW50czY0LCAzKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCwgMCkJCS8qIDIyMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3Mjg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCisgKgorICogVGltZXIgYW5kIGNsb2NrIHN1cHBvcnQuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybS5oPgorCisKK2V4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHdhbGxfamlmZmllczsKKwordTY0IGppZmZpZXNfNjQgPSBJTklUSUFMX0pJRkZJRVM7CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfNjQpOworCitzcGlubG9ja190IHJ0Y19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworRVhQT1JUX1NZTUJPTChydGNfbG9jayk7CisKKworI2lmZGVmIENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFX0NDT1VOVAordW5zaWduZWQgbG9uZyBjY291bnRfcGVyX2ppZmZ5OwkJLyogcGVyIDEvSFogKi8KK3Vuc2lnbmVkIGxvbmcgY2NvdW50X25zZWM7CQkvKiBuc2VjIHBlciBjY291bnQgaW5jcmVtZW50ICovCisjZW5kaWYKKwordW5zaWduZWQgaW50IGxhc3RfY2NvdW50X3N0YW1wOworc3RhdGljIGxvbmcgbGFzdF9ydGNfdXBkYXRlID0gMDsKKworLyoKKyAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW0gaW4gbmFub3NlYyB1bml0cy4KKyAqLworCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZylqaWZmaWVzICogKDEwMDAwMDAwMDAgLyBIWik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiB0aW1lcl9pcnFhY3Rpb24gPSB7CisJLmhhbmRsZXIgPQl0aW1lcl9pbnRlcnJ1cHQsCisJLmZsYWdzID0JU0FfSU5URVJSVVBULAorCS5uYW1lID0JCSJ0aW1lciIsCit9OworCit2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKK3sKKwl0aW1lX3Qgc2VjX28sIHNlY19uID0gMDsKKworCS8qIFRoZSBwbGF0Zm9ybSBtdXN0IHByb3ZpZGUgYSBmdW5jdGlvbiB0byBjYWxpYnJhdGUgdGhlIHByb2Nlc3NvcgorCSAqIHNwZWVkIGZvciB0aGUgQ0FMSUJSQVRFLgorCSAqLworCisjaWYgQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UCisJcHJpbnRrKCJDYWxpYnJhdGluZyBDUFUgZnJlcXVlbmN5ICIpOworCXBsYXRmb3JtX2NhbGlicmF0ZV9jY291bnQoKTsKKwlwcmludGsoIiVkLiUwMmQgTUh6XG4iLCAoaW50KWNjb3VudF9wZXJfamlmZnkvKDEwMDAwMDAvSFopLAorCQkJKGludCkoY2NvdW50X3Blcl9qaWZmeS8oMTAwMDAvSFopKSUxMDApOworI2VuZGlmCisKKwkvKiBTZXQgdGltZSBmcm9tIFJUQyAoaWYgcHJvdmlkZWQpICovCisKKwlpZiAocGxhdGZvcm1fZ2V0X3J0Y190aW1lKCZzZWNfbykgPT0gMCkKKwkJd2hpbGUgKHBsYXRmb3JtX2dldF9ydGNfdGltZSgmc2VjX24pKQorCQkJaWYgKHNlY19vICE9IHNlY19uKQorCQkJCWJyZWFrOworCisJeHRpbWUudHZfbnNlYyA9IDA7CisJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjID0gc2VjX247CisJbGFzdF9jY291bnRfc3RhbXAgPSBnZXRfY2NvdW50KCk7CisKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCisJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGxpbnV4IHRpbWVyIGludGVycnVwdC4gKi8KKworCXNldHVwX2lycShMSU5VWF9USU1FUl9JTlQsICZ0aW1lcl9pcnFhY3Rpb24pOworCXNldF9saW51eF90aW1lcihnZXRfY2NvdW50KCkgKyBDQ09VTlRfUEVSX0pJRkZZKTsKK30KKworCitpbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCit7CisJdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7CisJbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOworCXVuc2lnbmVkIGxvbmcgY2NvdW50OworCisJaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7CisKKwkvKiBUaGlzIGlzIHJldm9sdGluZy4gV2UgbmVlZCB0byBzZXQgInh0aW1lIiBjb3JyZWN0bHkuIEhvd2V2ZXIsIHRoZQorCSAqIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBtb3N0IHJlY2VudCB1cGRhdGUgb2YKKwkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQorCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCisJICovCisJY2NvdW50ID0gZ2V0X2Njb3VudCgpOworCW5zZWMgLT0gKGNjb3VudCAtIGxhc3RfY2NvdW50X3N0YW1wKSAqIENDT1VOVF9OU0VDOworCW5zZWMgLT0gKGppZmZpZXMgLSB3YWxsX2ppZmZpZXMpICogQ0NPVU5UX1BFUl9KSUZGWSAqIENDT1VOVF9OU0VDOworCisJd3RtX3NlYyAgPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyAoeHRpbWUudHZfc2VjIC0gc2VjKTsKKwl3dG1fbnNlYyA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMgKyAoeHRpbWUudHZfbnNlYyAtIG5zZWMpOworCisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOworCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOworCisJdGltZV9hZGp1c3QgPSAwOyAgICAgICAgICAgICAgICAvKiBzdG9wIGFjdGl2ZSBhZGp0aW1lKCkgKi8KKwl0aW1lX3N0YXR1cyB8PSBTVEFfVU5TWU5DOworCXRpbWVfbWF4ZXJyb3IgPSBOVFBfUEhBU0VfTElNSVQ7CisJdGltZV9lc3RlcnJvciA9IE5UUF9QSEFTRV9MSU1JVDsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChkb19zZXR0aW1lb2ZkYXkpOworCisKK3ZvaWQgZG9fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgc2VjLCB1c2VjLCBkZWx0YSwgbG9zdCwgc2VxOworCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKworCQlkZWx0YSA9IGdldF9jY291bnQoKSAtIGxhc3RfY2NvdW50X3N0YW1wOworCQlzZWMgPSB4dGltZS50dl9zZWM7CisJCXVzZWMgPSAoeHRpbWUudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpOworCisJCWxvc3QgPSBqaWZmaWVzIC0gd2FsbF9qaWZmaWVzOworCisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7CisKKwl1c2VjICs9IGxvc3QgKiAoMTAwMDAwMFVML0haKSArIChkZWx0YSAqIENDT1VOVF9OU0VDKSAvIE5TRUNfUEVSX1VTRUM7CisJZm9yICg7IHVzZWMgPj0gMTAwMDAwMDsgc2VjKyssIHVzZWMgLT0gMTAwMDAwMCkKKwkJOworCisJdHYtPnR2X3NlYyA9IHNlYzsKKwl0di0+dHZfdXNlYyA9IHVzZWM7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKKworLyoKKyAqIFRoZSB0aW1lciBpbnRlcnJ1cHQgaXMgY2FsbGVkIEhaIHRpbWVzIHBlciBzZWNvbmQuCisgKi8KKworaXJxcmV0dXJuX3QgdGltZXJfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCisJdW5zaWduZWQgbG9uZyBuZXh0OworCisJbmV4dCA9IGdldF9saW51eF90aW1lcigpOworCithZ2FpbjoKKwl3aGlsZSAoKHNpZ25lZCBsb25nKShnZXRfY2NvdW50KCkgLSBuZXh0KSA+IDApIHsKKworCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORywgcmVncyk7CisjaWZuZGVmIENPTkZJR19TTVAKKwkJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKHJlZ3MpKTsKKyNlbmRpZgorCisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJCWxhc3RfY2NvdW50X3N0YW1wID0gbmV4dDsKKwkJbmV4dCArPSBDQ09VTlRfUEVSX0pJRkZZOworCQlkb190aW1lciAocmVncyk7IC8qIExpbnV4IGhhbmRsZXIgaW4ga2VybmVsL3RpbWVyLmMgKi8KKworCQlpZiAoKHRpbWVfc3RhdHVzICYgU1RBX1VOU1lOQykgPT0gMCAmJgorCQkgICAgeHRpbWUudHZfc2VjIC0gbGFzdF9ydGNfdXBkYXRlID49IDY1OSAmJgorCQkgICAgYWJzKCh4dGltZS50dl9uc2VjLzEwMDApLSgxMDAwMDAwLTEwMDAwMDAvSFopKTw1MDAwMDAwL0haICYmCisJCSAgICBqaWZmaWVzIC0gd2FsbF9qaWZmaWVzID09IDEpIHsKKworCQkJaWYgKHBsYXRmb3JtX3NldF9ydGNfdGltZSh4dGltZS50dl9zZWMrMSkgPT0gMCkKKwkJCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWMrMTsKKwkJCWVsc2UKKwkJCQkvKiBEbyBpdCBhZ2FpbiBpbiA2MCBzICovCisJCQkJbGFzdF9ydGNfdXBkYXRlICs9IDYwOworCQl9CisJCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CisJfQorCisJLyogTk9URTogd3JpdGluZyBDQ09NUEFSRW4gY2xlYXJzIHRoZSBpbnRlcnJ1cHQuICAqLworCisJc2V0X2xpbnV4X3RpbWVyIChuZXh0KTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgbWlzcyBhbnkgdGljay4uLiAqLworCisJaWYgKChzaWduZWQgbG9uZykoZ2V0X2Njb3VudCgpIC0gbmV4dCkgPiAwKQorCQlnb3RvIGFnYWluOworCisJLyogQWxsb3cgcGxhdGZvcm0gdG8gZG8gc29tZXRoaW5nIHVzZWZ1bGwgKFdkb2cpLiAqLworCisJcGxhdGZvcm1faGVhcnRiZWF0KCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZm5kZWYgQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZCit2b2lkIF9fZGV2aW5pdCBjYWxpYnJhdGVfZGVsYXkodm9pZCkKK3sKKwlsb29wc19wZXJfamlmZnkgPSBDQ09VTlRfUEVSX0pJRkZZOworCXByaW50aygiQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcCAoc2tpcHBlZCkuLi4gIgorCSAgICAgICAiJWx1LiUwMmx1IEJvZ29NSVBTIHByZXNldFxuIiwKKwkgICAgICAgbG9vcHNfcGVyX2ppZmZ5LygxMDAwMDAwL0haKSwKKwkgICAgICAgKGxvb3BzX3Blcl9qaWZmeS8oMTAwMDAvSFopKSAlIDEwMCk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjVkNjRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3RyYXBzLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvdHJhcHMuYworICoKKyAqIEV4Y2VwdGlvbiBoYW5kbGluZy4KKyAqCisgKiBEZXJpdmVkIGZyb20gY29kZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0czoKKyAqIENvcHlyaWdodCAoQykgMTk5NCAtIDE5OTkgYnkgUmFsZiBCYWVjaGxlCisgKiBNb2RpZmllZCBmb3IgUjMwMDAgYnkgUGF1bCBNLiBBbnRvaW5lLCAxOTk1LCAxOTk2CisgKiBDb21wbGV0ZSBvdXRwdXQgZnJvbSBkaWUoKSBieSBVbGYgQ2FybHNzb24sIDE5OTgKKyAqIENvcHlyaWdodCAoQykgMTk5OSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCisgKgorICogRXNzZW50aWFsbHkgcmV3cml0dGVuIGZvciB0aGUgWHRlbnNhIGFyY2hpdGVjdHVyZSBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqCisgKiBKb2UgVGF5bG9yCTxqb2VAdGVuc2lsaWNhLmNvbSwgam9ldHlsckB5YWhvby5jb20+CisgKiBDaHJpcyBaYW5rZWwJPGNocmlzQHphbmtlbC5uZXQ+CisgKiBNYXJjIEdhdXRoaWVyPG1hcmNAdGVuc2lsaWNhLmNvbSwgbWFyY0BhbHVtbmkudXdhdGVybG9vLmNhPgorICogS2V2aW4gQ2hlYQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworI2lmZGVmIENPTkZJR19LR0RCCitleHRlcm4gaW50IGdkYl9lbnRlcjsKK2V4dGVybiBpbnQgcmV0dXJuX2Zyb21fZGVidWdfZmxhZzsKKyNlbmRpZgorCisvKgorICogTWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlcnMKKyAqLworCitleHRlcm4gdm9pZCBrZXJuZWxfZXhjZXB0aW9uKHZvaWQpOworZXh0ZXJuIHZvaWQgdXNlcl9leGNlcHRpb24odm9pZCk7CisKK2V4dGVybiB2b2lkIGZhc3Rfc3lzY2FsbF9rZXJuZWwodm9pZCk7CitleHRlcm4gdm9pZCBmYXN0X3N5c2NhbGxfdXNlcih2b2lkKTsKK2V4dGVybiB2b2lkIGZhc3RfYWxsb2NhKHZvaWQpOworZXh0ZXJuIHZvaWQgZmFzdF91bmFsaWduZWQodm9pZCk7CitleHRlcm4gdm9pZCBmYXN0X3NlY29uZF9sZXZlbF9taXNzKHZvaWQpOworZXh0ZXJuIHZvaWQgZmFzdF9zdG9yZV9wcm9oaWJpdGVkKHZvaWQpOworZXh0ZXJuIHZvaWQgZmFzdF9jb3Byb2Nlc3Nvcih2b2lkKTsKKworZXh0ZXJuIHZvaWQgZG9faWxsZWdhbF9pbnN0cnVjdGlvbiAoc3RydWN0IHB0X3JlZ3MqKTsKK2V4dGVybiB2b2lkIGRvX2ludGVycnVwdCAoc3RydWN0IHB0X3JlZ3MqKTsKK2V4dGVybiB2b2lkIGRvX3VuYWxpZ25lZF91c2VyIChzdHJ1Y3QgcHRfcmVncyopOworZXh0ZXJuIHZvaWQgZG9fbXVsdGloaXQgKHN0cnVjdCBwdF9yZWdzKiwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBkb19wYWdlX2ZhdWx0IChzdHJ1Y3QgcHRfcmVncyosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgZG9fZGVidWcgKHN0cnVjdCBwdF9yZWdzKik7CitleHRlcm4gdm9pZCBzeXN0ZW1fY2FsbCAoc3RydWN0IHB0X3JlZ3MqKTsKKworLyoKKyAqIFRoZSB2ZWN0b3IgdGFibGUgbXVzdCBiZSBwcmVjZWRlZCBieSBhIHNhdmUgYXJlYSAod2hpY2gKKyAqIGltcGxpZXMgaXQgbXVzdCBiZSBpbiBSQU0sIHVubGVzcyBvbmUgcGxhY2VzIFJBTSBpbW1lZGlhdGVseQorICogYmVmb3JlIGEgUk9NIGFuZCBwdXRzIHRoZSB2ZWN0b3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBST00gKCEpKQorICovCisKKyNkZWZpbmUgS1JOTAkJMHgwMQorI2RlZmluZSBVU0VSCQkweDAyCisKKyNkZWZpbmUgQ09QUk9DRVNTT1IoeCkJCQkJCQkJXAoreyBYQ0hBTF9FWENDQVVTRV9DT1BST0NFU1NPUiAjIyB4ICMjIF9ESVNBQkxFRCwgVVNFUiwgZmFzdF9jb3Byb2Nlc3NvciB9CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgY2F1c2U7CisJaW50IGZhc3Q7CisJdm9pZCogaGFuZGxlcjsKK30gZGlzcGF0Y2hfaW5pdF90YWJsZV90OworCitkaXNwYXRjaF9pbml0X3RhYmxlX3QgX19pbml0IGRpc3BhdGNoX2luaXRfdGFibGVbXSA9IHsKKworeyBYQ0hBTF9FWENDQVVTRV9JTExFR0FMX0lOU1RSVUNUSU9OLAkwLAkgICBkb19pbGxlZ2FsX2luc3RydWN0aW9ufSwKK3sgWENIQUxfRVhDQ0FVU0VfU1lTVEVNX0NBTEwsCQlLUk5MLAkgICBmYXN0X3N5c2NhbGxfa2VybmVsIH0sCit7IFhDSEFMX0VYQ0NBVVNFX1NZU1RFTV9DQUxMLAkJVVNFUiwJICAgZmFzdF9zeXNjYWxsX3VzZXIgfSwKK3sgWENIQUxfRVhDQ0FVU0VfU1lTVEVNX0NBTEwsCQkwLAkgICBzeXN0ZW1fY2FsbCB9LAorLyogWENIQUxfRVhDQ0FVU0VfSU5TVFJVQ1RJT05fRkVUQ0ggdW5oYW5kbGVkICovCisvKiBYQ0hBTF9FWENDQVVTRV9MT0FEX1NUT1JFX0VSUk9SIHVuaGFuZGxlZCovCit7IFhDSEFMX0VYQ0NBVVNFX0xFVkVMMV9JTlRFUlJVUFQsCTAsCSAgIGRvX2ludGVycnVwdCB9LAoreyBYQ0hBTF9FWENDQVVTRV9BTExPQ0EsCQlVU0VSfEtSTkwsIGZhc3RfYWxsb2NhIH0sCisvKiBYQ0hBTF9FWENDQVVTRV9JTlRFR0VSX0RJVklERV9CWV9aRVJPIHVuaGFuZGxlZCAqLworLyogWENIQUxfRVhDQ0FVU0VfUFJJVklMRUdFRCB1bmhhbmRsZWQgKi8KKyNpZiBYQ0hBTF9VTkFMSUdORURfTE9BRF9FWENFUFRJT04gfHwgWENIQUxfVU5BTElHTkVEX1NUT1JFX0VYQ0VQVElPTgorI2lmZGVmIENPTkZJR19VTkFMSUdORURfVVNFUgoreyBYQ0hBTF9FWENDQVVTRV9VTkFMSUdORUQsCQlVU0VSLAkgICBmYXN0X3VuYWxpZ25lZCB9LAorI2Vsc2UKK3sgWENIQUxfRVhDQ0FVU0VfVU5BTElHTkVELAkJMCwJICAgZG9fdW5hbGlnbmVkX3VzZXIgfSwKKyNlbmRpZgoreyBYQ0hBTF9FWENDQVVTRV9VTkFMSUdORUQsCQlLUk5MLAkgICBmYXN0X3VuYWxpZ25lZCB9LAorI2VuZGlmCit7IFhDSEFMX0VYQ0NBVVNFX0lUTEJfTUlTUywJCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKK3sgWENIQUxfRVhDQ0FVU0VfSVRMQl9NSVNTLAkJVVNFUnxLUk5MLCBmYXN0X3NlY29uZF9sZXZlbF9taXNzfSwKK3sgWENIQUxfRVhDQ0FVU0VfSVRMQl9NVUxUSUhJVCwJCTAsCSAgIGRvX211bHRpaGl0IH0sCit7IFhDSEFMX0VYQ0NBVVNFX0lUTEJfUFJJVklMRUdFLAkwLAkgICBkb19wYWdlX2ZhdWx0IH0sCisvKiBYQ0hBTF9FWENDQVVTRV9TSVpFX1JFU1RSSUNUSU9OIHVuaGFuZGxlZCAqLworeyBYQ0hBTF9FWENDQVVTRV9GRVRDSF9DQUNIRV9BVFRSSUJVVEUsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKK3sgWENIQUxfRVhDQ0FVU0VfRFRMQl9NSVNTLAkJVVNFUnxLUk5MLCBmYXN0X3NlY29uZF9sZXZlbF9taXNzfSwKK3sgWENIQUxfRVhDQ0FVU0VfRFRMQl9NSVNTLAkJMCwJICAgZG9fcGFnZV9mYXVsdCB9LAoreyBYQ0hBTF9FWENDQVVTRV9EVExCX01VTFRJSElULAkJMCwJICAgZG9fbXVsdGloaXQgfSwKK3sgWENIQUxfRVhDQ0FVU0VfRFRMQl9QUklWSUxFR0UsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKKy8qIFhDSEFMX0VYQ0NBVVNFX0RUTEJfU0laRV9SRVNUUklDVElPTiB1bmhhbmRsZWQgKi8KK3sgWENIQUxfRVhDQ0FVU0VfU1RPUkVfQ0FDSEVfQVRUUklCVVRFLAlVU0VSfEtSTkwsIGZhc3Rfc3RvcmVfcHJvaGliaXRlZCB9LAoreyBYQ0hBTF9FWENDQVVTRV9TVE9SRV9DQUNIRV9BVFRSSUJVVEUsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKK3sgWENIQUxfRVhDQ0FVU0VfTE9BRF9DQUNIRV9BVFRSSUJVVEUsCTAsCSAgIGRvX3BhZ2VfZmF1bHQgfSwKKy8qIFhDQ0hBTF9FWENDQVVTRV9GTE9BVElOR19QT0lOVCB1bmhhbmRsZWQgKi8KKyNpZiAoWENIQUxfQ1BfTUFTSyAmIDEpCitDT1BST0NFU1NPUigwKSwKKyNlbmRpZgorI2lmIChYQ0hBTF9DUF9NQVNLICYgMikKK0NPUFJPQ0VTU09SKDEpLAorI2VuZGlmCisjaWYgKFhDSEFMX0NQX01BU0sgJiA0KQorQ09QUk9DRVNTT1IoMiksCisjZW5kaWYKKyNpZiAoWENIQUxfQ1BfTUFTSyAmIDgpCitDT1BST0NFU1NPUigzKSwKKyNlbmRpZgorI2lmIChYQ0hBTF9DUF9NQVNLICYgMTYpCitDT1BST0NFU1NPUig0KSwKKyNlbmRpZgorI2lmIChYQ0hBTF9DUF9NQVNLICYgMzIpCitDT1BST0NFU1NPUig1KSwKKyNlbmRpZgorI2lmIChYQ0hBTF9DUF9NQVNLICYgNjQpCitDT1BST0NFU1NPUig2KSwKKyNlbmRpZgorI2lmIChYQ0hBTF9DUF9NQVNLICYgMTI4KQorQ09QUk9DRVNTT1IoNyksCisjZW5kaWYKK3sgRVhDQ0FVU0VfTUFQUEVEX0RFQlVHLAkJMCwJCWRvX2RlYnVnIH0sCit7IC0xLCAtMSwgMCB9CisKK307CisKKy8qIFRoZSBleGNlcHRpb24gdGFibGUgPGV4Y190YWJsZT4gc2VydmVzIHR3byBmdW5jdGlvbnM6CisgKiAxLiBpdCBjb250YWlucyB0aHJlZSBkaXNwYXRjaCB0YWJsZXMgKGZhc3RfdXNlciwgZmFzdF9rZXJuZWwsIGRlZmF1bHQtYykKKyAqIDIuIGl0IGlzIGEgdGVtcG9yYXJ5IG1lbW9yeSBidWZmZXIgZm9yIHRoZSBleGNlcHRpb24gaGFuZGxlcnMuCisgKi8KKwordW5zaWduZWQgbG9uZyBleGNfdGFibGVbRVhDX1RBQkxFX1NJWkUvNF07CisKK3ZvaWQgZGllKGNvbnN0IGNoYXIqLCBzdHJ1Y3QgcHRfcmVncyosIGxvbmcpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJZGllKHN0ciwgcmVncywgZXJyKTsKK30KKworLyoKKyAqIFVuaGFuZGxlZCBFeGNlcHRpb25zLiBLaWxsIHVzZXIgdGFzayBvciBwYW5pYyBpZiBpbiBrZXJuZWwgc3BhY2UuCisgKi8KKwordm9pZCBkb191bmhhbmRsZWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgZXhjY2F1c2UpCit7CisJX19kaWVfaWZfa2VybmVsKCJDYXVnaHQgdW5oYW5kbGVkIGV4Y2VwdGlvbiAtIHNob3VsZCBub3QgaGFwcGVuIiwKKwkgICAgCQlyZWdzLCBTSUdLSUxMKTsKKworCS8qIElmIGluIHVzZXIgbW9kZSwgc2VuZCBTSUdJTEwgc2lnbmFsIHRvIGN1cnJlbnQgcHJvY2VzcyAqLworCXByaW50aygiQ2F1Z2h0IHVuaGFuZGxlZCBleGNlcHRpb24gaW4gJyVzJyAiCisJICAgICAgICIocGlkID0gJWQsIHBjID0gJSMwMTBseCkgLSBzaG91bGQgbm90IGhhcHBlblxuIgorCSAgICAgICAiXHRFWENDQVVTRSBpcyAlbGRcbiIsCisJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgcmVncy0+cGMsIGV4Y2NhdXNlKTsKKwlmb3JjZV9zaWcoU0lHSUxMLCBjdXJyZW50KTsKK30KKworLyoKKyAqIE11bHRpLWhpdCBleGNlcHRpb24uIFRoaXMgaWYgZmF0YWwhCisgKi8KKwordm9pZCBkb19tdWx0aWhpdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBleGNjYXVzZSkKK3sKKwlkaWUoIkNhdWdodCBtdWx0aWhpdCBleGNlcHRpb24iLCByZWdzLCBTSUdLSUxMKTsKK30KKworLyoKKyAqIExldmVsLTEgaW50ZXJydXB0LgorICogV2UgY3VycmVudGx5IGhhdmUgbm8gcHJpb3JpdHkgZW5jb2RpbmcuCisgKi8KKwordW5zaWduZWQgbG9uZyBpZ25vcmVkX2xldmVsMV9pbnRlcnJ1cHRzOworZXh0ZXJuIHZvaWQgZG9fSVJRKGludCwgc3RydWN0IHB0X3JlZ3MgKik7CisKK3ZvaWQgZG9faW50ZXJydXB0IChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGludHJlYWQgPSBnZXRfc3IgKElOVFJFQUQpOworCXVuc2lnbmVkIGxvbmcgaW50ZW5hYmxlID0gZ2V0X3NyIChJTlRFTkFCTEUpOworCWludCBpLCBtYXNrOworCisJLyogSGFuZGxlIGFsbCBpbnRlcnJ1cHRzIChubyBwcmlvcml0aWVzKS4KKwkgKiAoQ2xlYXIgdGhlIGludGVycnVwdCBiZWZvcmUgcHJvY2Vzc2luZywgaW4gY2FzZSBpdCdzCisJICogIGVkZ2UtdHJpZ2dlcmVkIG9yIHNvZnR3YXJlLWdlbmVyYXRlZCkKKwkgKi8KKworCWZvciAoaT0wLCBtYXNrID0gMTsgaSA8IFhDSEFMX05VTV9JTlRFUlJVUFRTOyBpKyssIG1hc2sgPDw9IDEpIHsKKwkJaWYgKG1hc2sgJiAoaW50cmVhZCAmIGludGVuYWJsZSkpIHsKKwkJCXNldF9zciAobWFzaywgSU5UQ0xFQVIpOworCQkJZG9fSVJRIChpLHJlZ3MpOworCQl9CisJfQorfQorCisvKgorICogSWxsZWdhbCBpbnN0cnVjdGlvbi4gRmF0YWwgaWYgaW4ga2VybmVsIHNwYWNlLgorICovCisKK3ZvaWQKK2RvX2lsbGVnYWxfaW5zdHJ1Y3Rpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJX19kaWVfaWZfa2VybmVsKCJJbGxlZ2FsIGluc3RydWN0aW9uIGluIGtlcm5lbCIsIHJlZ3MsIFNJR0tJTEwpOworCisJLyogSWYgaW4gdXNlciBtb2RlLCBzZW5kIFNJR0lMTCBzaWduYWwgdG8gY3VycmVudCBwcm9jZXNzLiAqLworCisJcHJpbnRrKCJJbGxlZ2FsIEluc3RydWN0aW9uIGluICclcycgKHBpZCA9ICVkLCBwYyA9ICUjMDEwbHgpXG4iLAorCSAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHJlZ3MtPnBjKTsKKwlmb3JjZV9zaWcoU0lHSUxMLCBjdXJyZW50KTsKK30KKworCisvKgorICogSGFuZGxlIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgZnJvbSB1c2VyIHNwYWNlLiBLaWxsIHRhc2suCisgKgorICogSWYgQ09ORklHX1VOQUxJR05FRF9VU0VSIGlzIG5vdCBzZXQsIHdlIGRvbid0IGFsbG93IHVuYWxpZ25lZCBtZW1vcnkKKyAqIGFjY2Vzc2VzIGNhdXNlcyBmcm9tIHVzZXIgc3BhY2UuCisgKi8KKworI2lmIFhDSEFMX1VOQUxJR05FRF9MT0FEX0VYQ0VQVElPTiB8fCBYQ0hBTF9VTkFMSUdORURfU1RPUkVfRVhDRVBUSU9OCisjaWZuZGVmIENPTkZJR19VTkFMSUdORURfVVNFUgordm9pZAorZG9fdW5hbGlnbmVkX3VzZXIgKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXNpZ2luZm9fdCBpbmZvOworCisJX19kaWVfaWZfa2VybmVsKCJVbmhhbmRsZWQgdW5hbGlnbmVkIGV4Y2VwdGlvbiBpbiBrZXJuZWwiLAorCSAgICAJCXJlZ3MsIFNJR0tJTEwpOworCisJY3VycmVudC0+dGhyZWFkLmJhZF92YWRkciA9IHJlZ3MtPmV4Y3ZhZGRyOworCWN1cnJlbnQtPnRocmVhZC5lcnJvcl9jb2RlID0gLTM7CisJcHJpbnRrKCJVbmFsaWduZWQgbWVtb3J5IGFjY2VzcyB0byAlMDhseCBpbiAnJXMnICIKKwkgICAgICAgIihwaWQgPSAlZCwgcGMgPSAlIzAxMGx4KVxuIiwKKwkgICAgICAgcmVncy0+ZXhjdmFkZHIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgcmVncy0+cGMpOworCWluZm8uc2lfc2lnbm8gPSBTSUdCVVM7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gQlVTX0FEUkFMTjsKKwlpbmZvLnNpX2FkZHIgPSAodm9pZCAqKSByZWdzLT5leGN2YWRkcjsKKwlmb3JjZV9zaWdfaW5mbyhTSUdTRUdWLCAmaW5mbywgY3VycmVudCk7CisKK30KKyNlbmRpZgorI2VuZGlmCisKK3ZvaWQKK2RvX2RlYnVnKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19LR0RCCisJLyogSWYgcmVtb3RlIGRlYnVnZ2luZyBpcyBjb25maWd1cmVkIEFORCBlbmFibGVkLCB3ZSBnaXZlIGNvbnRyb2wgdG8KKwkgKiBrZ2RiLiAgT3RoZXJ3aXNlLCB3ZSBmYWxsIHRocm91Z2gsIHBlcmhhcHMgZ2l2aW5nIGNvbnRyb2wgdG8gdGhlCisJICogbmF0aXZlIGRlYnVnZ2VyLgorCSAqLworCisJaWYgKGdkYl9lbnRlcikgeworCQlleHRlcm4gdm9pZCBnZGJfaGFuZGxlX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqKTsKKwkJZ2RiX2hhbmRsZV9leGNlcHRpb24ocmVncyk7CisJCXJldHVybl9mcm9tX2RlYnVnX2ZsYWcgPSAxOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlfX2RpZV9pZl9rZXJuZWwoIkJyZWFrcG9pbnQgaW4ga2VybmVsIiwgcmVncywgU0lHS0lMTCk7CisKKwkvKiBJZiBpbiB1c2VyIG1vZGUsIHNlbmQgU0lHVFJBUCBzaWduYWwgdG8gY3VycmVudCBwcm9jZXNzICovCisKKwlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZGlzcGF0Y2ggdGFibGVzLgorICoKKyAqIFRoZSBleGNlcHRpb24gdmVjdG9ycyBhcmUgc3RvcmVkIGNvbXByZXNzZWQgdGhlIF9faW5pdCBzZWN0aW9uIGluIHRoZQorICogZGlzcGF0Y2hfaW5pdF90YWJsZS4gVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZm9sbG93aW5nIHRocmVlIHRhYmxlcworICogZnJvbSB0aGF0IGNvbXByZXNzZWQgdGFibGU6CisgKiAtIGZhc3QgdXNlcgkJZmlyc3QgZGlzcGF0Y2ggdGFibGUgZm9yIHVzZXIgZXhjZXB0aW9ucworICogLSBmYXN0IGtlcm5lbAlmaXJzdCBkaXNwYXRjaCB0YWJsZSBmb3Iga2VybmVsIGV4Y2VwdGlvbnMKKyAqIC0gZGVmYXVsdCBDLWhhbmRsZXIJQy1oYW5kbGVyIGNhbGxlZCBieSB0aGUgZGVmYXVsdCBmYXN0IGhhbmRsZXIuCisgKgorICogU2VlIHZlY3RvcnMuUyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgc2V0X2hhbmRsZXIoaWR4LGhhbmRsZXIpIChleGNfdGFibGVbaWR4XSA9ICh1bnNpZ25lZCBsb25nKSAoaGFuZGxlcikpCisKK3ZvaWQgdHJhcF9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwkvKiBTZXR1cCBkZWZhdWx0IHZlY3RvcnMuICovCisKKwlmb3IoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCXNldF9oYW5kbGVyKEVYQ19UQUJMRV9GQVNUX1VTRVIvNCAgICsgaSwgdXNlcl9leGNlcHRpb24pOworCQlzZXRfaGFuZGxlcihFWENfVEFCTEVfRkFTVF9LRVJORUwvNCArIGksIGtlcm5lbF9leGNlcHRpb24pOworCQlzZXRfaGFuZGxlcihFWENfVEFCTEVfREVGQVVMVC80ICsgaSwgZG9fdW5oYW5kbGVkKTsKKwl9CisKKwkvKiBTZXR1cCBzcGVjaWZpYyBoYW5kbGVycy4gKi8KKworCWZvcihpID0gMDsgZGlzcGF0Y2hfaW5pdF90YWJsZVtpXS5jYXVzZSA+PSAwOyBpKyspIHsKKworCQlpbnQgZmFzdCA9IGRpc3BhdGNoX2luaXRfdGFibGVbaV0uZmFzdDsKKwkJaW50IGNhdXNlID0gZGlzcGF0Y2hfaW5pdF90YWJsZVtpXS5jYXVzZTsKKwkJdm9pZCAqaGFuZGxlciA9IGRpc3BhdGNoX2luaXRfdGFibGVbaV0uaGFuZGxlcjsKKworCQlpZiAoZmFzdCA9PSAwKQorCQkJc2V0X2hhbmRsZXIgKEVYQ19UQUJMRV9ERUZBVUxULzQgKyBjYXVzZSwgaGFuZGxlcik7CisJCWlmIChmYXN0ICYmIGZhc3QgJiBVU0VSKQorCQkJc2V0X2hhbmRsZXIgKEVYQ19UQUJMRV9GQVNUX1VTRVIvNCArIGNhdXNlLCBoYW5kbGVyKTsKKwkJaWYgKGZhc3QgJiYgZmFzdCAmIEtSTkwpCisJCQlzZXRfaGFuZGxlciAoRVhDX1RBQkxFX0ZBU1RfS0VSTkVMLzQgKyBjYXVzZSwgaGFuZGxlcik7CisJfQorCisJLyogSW5pdGlhbGl6ZSBFWENTQVZFXzEgdG8gaG9sZCB0aGUgYWRkcmVzcyBvZiB0aGUgZXhjZXB0aW9uIHRhYmxlLiAqLworCisJaSA9ICh1bnNpZ25lZCBsb25nKWV4Y190YWJsZTsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3NyICAlMCwgIl9fc3RyaW5naWZ5KEVYQ1NBVkVfMSkiXG4iIDogOiAiYSIgKGkpKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZHVtcHMgdGhlIGN1cnJlbnQgdmFsaWQgd2luZG93IGZyYW1lIGFuZCBvdGhlciBiYXNlIHJlZ2lzdGVycy4KKyAqLworCit2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJaW50IGksIHdtYXNrOworCisJd21hc2sgPSByZWdzLT53bWFzayAmIH4xOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKHdtYXNrICYgKDEgPDwgKGkgLyA0KSkpCisJCQlicmVhazsKKwkJaWYgKChpICUgOCkgPT0gMCkKKwkJCXByaW50ayAoIlxuIiBLRVJOX0lORk8gImElMDJkOiAiLCBpKTsKKwkJcHJpbnRrKCIlMDhseCAiLCByZWdzLT5hcmVnW2ldKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCisJcHJpbnRrKCJwYzogJTA4bHgsIHBzOiAlMDhseCwgZGVwYzogJTA4bHgsIGV4Y3ZhZGRyOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+cGMsIHJlZ3MtPnBzLCByZWdzLT5kZXBjLCByZWdzLT5leGN2YWRkcik7CisJcHJpbnRrKCJsYmVnOiAlMDhseCwgbGVuZDogJTA4bHggbGNvdW50OiAlMDhseCwgc2FyOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+bGJlZywgcmVncy0+bGVuZCwgcmVncy0+bGNvdW50LCByZWdzLT5zYXIpOworCWlmICh1c2VyX21vZGUocmVncykpCisJCXByaW50aygid2I6ICUwOGx4LCB3czogJTA4bHgsIHdtYXNrOiAlMDhseCwgc3lzY2FsbDogJWxkXG4iLAorCQkgICAgICAgcmVncy0+d2luZG93YmFzZSwgcmVncy0+d2luZG93c3RhcnQsIHJlZ3MtPndtYXNrLAorCQkgICAgICAgcmVncy0+c3lzY2FsbCk7Cit9CisKK3ZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXVuc2lnbmVkIGxvbmcgYTAsIGExLCBwYzsKKwl1bnNpZ25lZCBsb25nIHNwX3N0YXJ0LCBzcF9lbmQ7CisKKwlhMSA9ICh1bnNpZ25lZCBsb25nKXNwOworCisJaWYgKGExID09IDApCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ICUwLCBhMVxuIiA6ICI9YSIoYTEpKTsKKworCisJc3Bfc3RhcnQgPSBhMSAmIH4oVEhSRUFEX1NJWkUtMSk7CisJc3BfZW5kID0gc3Bfc3RhcnQgKyBUSFJFQURfU0laRTsKKworCXByaW50aygiQ2FsbCBUcmFjZToiKTsKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwlwcmludGsoIlxuIik7CisjZW5kaWYKKwlzcGlsbF9yZWdpc3RlcnMoKTsKKworCXdoaWxlIChhMSA+IHNwX3N0YXJ0ICYmIGExIDwgc3BfZW5kKSB7CisJCXNwID0gKHVuc2lnbmVkIGxvbmcqKWExOworCisJCWEwID0gKihzcCAtIDQpOworCQlhMSA9ICooc3AgLSAzKTsKKworCQlpZiAoYTEgPD0gKHVuc2lnbmVkIGxvbmcpIHNwKQorCQkJYnJlYWs7CisKKwkJcGMgPSBNQUtFX1BDX0ZST01fUkEoYTAsIGExKTsKKworCQlpZiAoa2VybmVsX3RleHRfYWRkcmVzcyhwYykpIHsKKwkJCXByaW50aygiIFs8JTA4bHg+XSAiLCBwYyk7CisJCQlwcmludF9zeW1ib2woIiVzXG4iLCBwYyk7CisJCX0KKwl9CisJcHJpbnRrKCJcbiIpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGFidXNlcyBnZXRfdXNlcigpL3B1dF91c2VyKCkgdG8gcmVmZXJlbmNlIHBvaW50ZXJzCisgKiB3aXRoIGF0IGxlYXN0IGEgYml0IG9mIGVycm9yIGNoZWNraW5nIC4uLgorICovCisKK3N0YXRpYyBpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMjQ7CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCWludCBpID0gMDsKKwl1bnNpZ25lZCBsb25nICpzdGFjazsKKworCWlmIChzcCA9PSAwKQorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1vdiAlMCwgYTFcbiIgOiAiPWEiKHNwKSk7CisKKyAJc3RhY2sgPSBzcDsKKworCXByaW50aygiXG5TdGFjazogIik7CisKKwlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKKwkJaWYgKGtzdGFja19lbmQoc3ApKQorCQkJYnJlYWs7CisJCWlmIChpICYmICgoaSAlIDgpID09IDApKQorCQkJcHJpbnRrKCJcbiAgICAgICAiKTsKKwkJcHJpbnRrKCIlMDhseCAiLCAqc3ArKyk7CisJfQorCXByaW50aygiXG4iKTsKKwlzaG93X3RyYWNlKHRhc2ssIHN0YWNrKTsKK30KKwordm9pZCBkdW1wX3N0YWNrKHZvaWQpCit7CisJc2hvd19zdGFjayhjdXJyZW50LCBOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKKworCit2b2lkIHNob3dfY29kZSh1bnNpZ25lZCBpbnQgKnBjKQoreworCWxvbmcgaTsKKworCXByaW50aygiXG5Db2RlOiIpOworCisJZm9yKGkgPSAtMyA7IGkgPCA2IDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgaW5zbjsKKwkJaWYgKF9fZ2V0X3VzZXIoaW5zbiwgcGMgKyBpKSkgeworCQkJcHJpbnRrKCIgKEJhZCBhZGRyZXNzIGluIHBjKVxuIik7CisJCQlicmVhazsKKwkJfQorCQlwcmludGsoIiVjJTA4bHglYyIsKGk/JyAnOic8JyksaW5zbiwoaT8nICc6Jz4nKSk7CisJfQorfQorCitzcGlubG9ja190IGRpZV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCit2b2lkIGRpZShjb25zdCBjaGFyICogc3RyLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyKQoreworCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisJaW50IG5sID0gMDsKKworCWNvbnNvbGVfdmVyYm9zZSgpOworCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKKworCXByaW50aygiJXM6IHNpZzogJWxkIFsjJWRdXG4iLCBzdHIsIGVyciwgKytkaWVfY291bnRlcik7CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwlwcmludGsoIlBSRUVNUFQgIik7CisJbmwgPSAxOworI2VuZGlmCisJaWYgKG5sKQorCQlwcmludGsoIlxuIik7CisJc2hvd19yZWdzKHJlZ3MpOworCWlmICghdXNlcl9tb2RlKHJlZ3MpKQorCQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nKilyZWdzLT5hcmVnWzFdKTsKKworCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIGluIGludGVycnVwdCIpOworCisJaWYgKHBhbmljX29uX29vcHMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkZhdGFsIGV4Y2VwdGlvbjogcGFuaWMgaW4gNSBzZWNvbmRzXG4iKTsKKwkJc3NsZWVwKDUpOworCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisJfQorCWRvX2V4aXQoZXJyKTsKK30KKworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdmVjdG9ycy5TIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZlY3RvcnMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgwOGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZlY3RvcnMuUwpAQCAtMCwwICsxLDQ2NCBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC92ZWN0b3JzLlMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIGV4Y2VwdGlvbiB2ZWN0b3JzICh1c2VyLCBrZXJuZWwsIGFuZCBkb3VibGUpLAorICogYXMgd2VsbCBhcyB0aGUgd2luZG93IHZlY3RvcnMgKG92ZXJmbG93IGFuZCB1bmRlcmZsb3cpLCBhbmQgdGhlIGRlYnVnCisgKiB2ZWN0b3IuIFRoZXNlIGFyZSB0aGUgcHJpbWFyeSB2ZWN0b3JzIGV4ZWN1dGVkIGJ5IHRoZSBwcm9jZXNzb3IgaWYgYW4KKyAqIGV4Y2VwdGlvbiBvY2N1cnMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSwgSW5jLgorICoKKyAqIENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqCisgKi8KKworLyoKKyAqIFdlIHVzZSBhIHR3by1sZXZlbCB0YWJsZSBhcHByb2FjaC4gVGhlIHVzZXIgYW5kIGtlcm5lbCBleGNlcHRpb24gdmVjdG9ycworICogdXNlIGEgZmlyc3QtbGV2ZWwgZGlzcGF0Y2ggdGFibGUgdG8gZGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiB0byBhIHJlZ2lzdGVyZWQKKyAqIGZhc3QgaGFuZGxlciBvciB0aGUgZGVmYXVsdCBoYW5kbGVyLCBpZiBubyBmYXN0IGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQuCisgKiBUaGUgZGVmYXVsdCBoYW5kbGVyIHNldHMgdXAgYSBDLXN0YWNrIGFuZCBkaXNwYXRjaGVzIHRoZSBleGNlcHRpb24gdG8gYQorICogcmVnaXN0ZXJkIEMgaGFuZGxlciBpbiB0aGUgc2Vjb25kLWxldmVsIGRpc3BhdGNoIHRhYmxlLgorICoKKyAqIEZhc3QgaGFuZGxlciBlbnRyeSBjb25kaXRpb246CisgKgorICogICBhMDoJdHJhc2hlZCwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0FSRUcwKQorICogICBhMToJYTEKKyAqICAgYTI6CW5ldyBzdGFjayBwb2ludGVyLCBvcmlnaW5hbCB2YWx1ZSBpbiBkZXBjCisgKiAgIGEzOglkaXNwYXRjaCB0YWJsZQorICogICBkZXBjOglhMiwgb3JpZ2luYWwgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKFBUX0RFUEMpCisgKiAgIGV4Y3NhdmVfMToJYTMKKyAqCisgKiBUaGUgdmFsdWUgZm9yIFBUX0RFUEMgc2F2ZWQgdG8gc3RhY2sgYWxzbyBmdW5jdGlvbnMgYXMgYSBib29sZWFuIHRvCisgKiBpbmRpY2F0ZSB0aGF0IHRoZSBleGNlcHRpb24gaXMgZWl0aGVyIGEgZG91YmxlIG9yIGEgcmVndWxhciBleGNlcHRpb246CisgKgorICogICBQVF9ERVBDCT49IFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogZG91YmxlIGV4Y2VwdGlvbgorICoJCTwgIFZBTElEX0RPVUJMRV9FWENFUFRJT05fQUREUkVTUzogcmVndWxhciBleGNlcHRpb24KKyAqCisgKiBOb3RlOiAgTmVpdGhlciB0aGUga2VybmVsIG5vciB0aGUgdXNlciBleGNlcHRpb24gaGFuZGxlciBnZW5lcmF0ZSBsaXRlcmFscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworCisvKgorICogVXNlciBleGNlcHRpb24gdmVjdG9yLiAoRXhjZXB0aW9ucyB3aXRoIFBTLlVNID09IDEsIFBTLkVYQ00gPT0gMCkKKyAqCisgKiBXZSBnZXQgaGVyZSB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB3ZSB3ZXJlIGluIHVzZXJsYW5kLgorICogV2Ugc3dpdGNoIHRvIHRoZSBrZXJuZWwgc3RhY2sgYW5kIGp1bXAgdG8gdGhlIGZpcnN0IGxldmVsIGhhbmRsZXIKKyAqIGFzc29jaWF0ZWQgdG8gdGhlIGV4Y2VwdGlvbiBjYXVzZS4KKyAqCisgKiBOb3RlOiB0aGUgc2F2ZWQga2VybmVsIHN0YWNrIHBvaW50ZXIgKEVYQ19UQUJMRV9LU1RLKSBpcyBhbHJlYWR5CisgKiAgICAgICBkZWNyZW1lbnRlZCBieSBQVF9VU0VSX1NJWkUuCisgKi8KKworCS5zZWN0aW9uIC5Vc2VyRXhjZXB0aW9uVmVjdG9yLnRleHQsICJheCIKKworRU5UUlkoX1VzZXJFeGNlcHRpb25WZWN0b3IpCisKKwl4c3IJYTMsIEVYQ1NBVkVfMQkJIyBzYXZlIGEzIGFuZCBnZXQgZGlzcGF0Y2ggdGFibGUKKwl3c3IJYTIsIERFUEMJCSMgc2F2ZSBhMgorCWwzMmkJYTIsIGEzLCBFWENfVEFCTEVfS1NUSwkjIGxvYWQga2VybmVsIHN0YWNrIHRvIGEyCisJczMyaQlhMCwgYTIsIFBUX0FSRUcwCSMgc2F2ZSBhMCB0byBFU0YKKwlyc3IJYTAsIEVYQ0NBVVNFCQkjIHJldHJpZXZlIGV4Y2VwdGlvbiBjYXVzZQorCXMzMmkJYTAsIGEyLCBQVF9ERVBDCQkjIG1hcmsgaXQgYXMgYSByZWd1bGFyIGV4Y2VwdGlvbgorCWFkZHg0CWEwLCBhMCwgYTMJCSMgZmluZCBlbnRyeSBpbiB0YWJsZQorCWwzMmkJYTAsIGEwLCBFWENfVEFCTEVfRkFTVF9VU0VSCSMgbG9hZCBoYW5kbGVyCisJangJYTAKKworLyoKKyAqIEtlcm5lbCBleGNlcHRpb24gdmVjdG9yLiAoRXhjZXB0aW9ucyB3aXRoIFBTLlVNID09IDAsIFBTLkVYQ00gPT0gMCkKKyAqCisgKiBXZSBnZXQgdGhpcyBleGNlcHRpb24gd2hlbiB3ZSB3ZXJlIGFscmVhZHkgaW4ga2VybmVsIHNwYWNlLgorICogV2UgZGVjcmVtZW50IHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIgKGtlcm5lbCkgYnkgUFRfU0laRSBhbmQKKyAqIGp1bXAgdG8gdGhlIGZpcnN0LWxldmVsIGhhbmRsZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24gY2F1c2UuCisgKgorICogTm90ZTogd2UgbmVlZCB0byBwcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIHNwaWxsIHJlZ2lvbi4KKyAqLworCisJLnNlY3Rpb24gLktlcm5lbEV4Y2VwdGlvblZlY3Rvci50ZXh0LCAiYXgiCisKK0VOVFJZKF9LZXJuZWxFeGNlcHRpb25WZWN0b3IpCisKKwl4c3IJYTMsIEVYQ1NBVkVfMQkJIyBzYXZlIGEzLCBhbmQgZ2V0IGRpc3BhdGNoIHRhYmxlCisJd3NyCWEyLCBERVBDCQkjIHNhdmUgYTIKKwlhZGRpCWEyLCBhMSwgLTE2LVBUX1NJWkUJIyBhZGp1c3Qgc3RhY2sgcG9pbnRlcgorCXMzMmkJYTAsIGEyLCBQVF9BUkVHMAkjIHNhdmUgYTAgdG8gRVNGCisJcnNyCWEwLCBFWENDQVVTRQkJIyByZXRyaWV2ZSBleGNlcHRpb24gY2F1c2UKKwlzMzJpCWEwLCBhMiwgUFRfREVQQwkJIyBtYXJrIGl0IGFzIGEgcmVndWxhciBleGNlcHRpb24KKwlhZGR4NAlhMCwgYTAsIGEzCQkjIGZpbmQgZW50cnkgaW4gdGFibGUKKwlsMzJpCWEwLCBhMCwgRVhDX1RBQkxFX0ZBU1RfS0VSTkVMCSMgbG9hZCBoYW5kbGVyIGFkZHJlc3MKKwlqeAlhMAorCisKKy8qCisgKiBEb3VibGUgZXhjZXB0aW9uIHZlY3RvciAoRXhjZXB0aW9ucyB3aXRoIFBTLkVYQ00gPT0gMSkKKyAqIFdlIGdldCB0aGlzIGV4Y2VwdGlvbiB3aGVuIGFub3RoZXIgZXhjZXB0aW9uIG9jY3VycyB3aGlsZSB3ZXJlIGFyZQorICogYWxyZWFkeSBpbiBhbiBleGNlcHRpb24sIHN1Y2ggYXMgd2luZG93IG92ZXJmbG93L3VuZGVyZmxvdyBleGNlcHRpb24sCisgKiBvciAnZXhwZWN0ZWQnIGV4Y2VwdGlvbnMsIGZvciBleGFtcGxlIG1lbW9yeSBleGNlcHRpb24gd2hlbiB3ZSB3ZXJlIHRyeWluZworICogdG8gcmVhZCBkYXRhIGZyb20gYW4gaW52YWxpZCBhZGRyZXNzIGluIHVzZXIgc3BhY2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgdmVjdG9yIGlzIG5ldmVyIGludm9rZWQgZm9yIGxldmVsLTEgaW50ZXJydXB0cywgYmVjYXVzZSBzdWNoCisgKiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAobWFza2VkKSB3aGVuIFBTLkVYQ00gaXMgc2V0LgorICoKKyAqIFdlIGRlY29kZSB0aGUgZXhjZXB0aW9uIGFuZCB0YWtlIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb24uICBIb3dldmVyLCB0aGUKKyAqIGRvdWJsZSBleGNlcHRpb24gdmVjdG9yIGlzIG11Y2ggbW9yZSBjYXJlZnVsLCBiZWNhdXNlIGEgbG90IG1vcmUgZXJyb3IKKyAqIGNhc2VzIGdvIHRocm91Z2ggdGhlIGRvdWJsZSBleGNlcHRpb24gdmVjdG9yIHRoYW4gdGhyb3VnaCB0aGUgdXNlciBhbmQKKyAqIGtlcm5lbCBleGNlcHRpb24gdmVjdG9ycy4KKyAqCisgKiBPY2Nhc2lvbmFsbHksIHRoZSBrZXJuZWwgZXhwZWN0cyBhIGRvdWJsZSBleGNlcHRpb24gdG8gb2NjdXIuICBUaGlzIHVzdWFsbHkKKyAqIGhhcHBlbnMgd2hlbiBhY2Nlc3NpbmcgdXNlci1zcGFjZSBtZW1vcnkgd2l0aCB0aGUgdXNlcidzIHBlcm1pc3Npb25zCisgKiAobDMyZS9zMzJlIGluc3RydWN0aW9ucykuICBUaGUga2VybmVsIHN0YXRlLCB0aG91Z2gsIGlzIG5vdCBhbHdheXMgc3VpdGFibGUKKyAqIGZvciBpbW1lZGlhdGUgdHJhbnNmZXIgb2YgY29udHJvbCB0byBoYW5kbGVfZG91YmxlLCB3aGVyZSAibm9ybWFsIiBleGNlcHRpb24KKyAqIHByb2Nlc3Npbmcgb2NjdXJzLiBBbHNvIGluIGtlcm5lbCBtb2RlLCBUTEIgbWlzc2VzIGNhbiBvY2N1ciBpZiBhY2Nlc3NpbmcKKyAqIHZtYWxsb2MgbWVtb3J5LCBwb3NzaWJseSByZXF1aXJpbmcgcmVwYWlyIGluIGEgZG91YmxlIGV4Y2VwdGlvbiBoYW5kbGVyLgorICoKKyAqIFRoZSB2YXJpYWJsZSBhdCBUQUJMRV9GSVhVUCBvZmZzZXQgZnJvbSB0aGUgcG9pbnRlciBpbiBFWENTQVZFXzEgZG91YmxlcyBhcworICogYSBib29sZWFuIHZhcmlhYmxlIGFuZCBhIHBvaW50ZXIgdG8gYSBmaXh1cCByb3V0aW5lLiBJZiB0aGUgdmFyaWFibGUKKyAqIEVYQ19UQUJMRV9GSVhVUCBpcyBub24temVybywgdGhpcyBoYW5kbGVyIGp1bXBzIHRvIHRoYXQgYWRkcmVzcy4gQSB2YWx1ZSBvZgorICogemVybyBpbmRpY2F0ZXMgdG8gdXNlIHRoZSBkZWZhdWx0IGtlcm5lbC91c2VyIGV4Y2VwdGlvbiBoYW5kbGVyLgorICogVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uLCB3aGVuIHRoZSB2YWx1ZSBpcyBpZGVudGljYWwgdG8gdGhlIGV4Y190YWJsZQorICogbGFiZWwsIHRoZSBrZXJuZWwgaXMgaW4gdHJvdWJsZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCB0byBwcm90ZWN0IGNyaXRpY2FsCisgKiBzZWN0aW9ucywgbWFpbmx5IHdoZW4gdGhlIGhhbmRsZXIgd3JpdGVzIHRvIHRoZSBzdGFjayB0byBhc3NlcnQgdGhlIHN0YWNrCisgKiBwb2ludGVyIGlzIHZhbGlkLiBPbmNlIHRoZSBmaXh1cC9kZWZhdWx0IGhhbmRsZXIgbGVhdmVzIHRoYXQgYXJlYSwgdGhlCisgKiBFWENfVEFCTEVfRklYVVAgdmFyaWFibGUgaXMgcmVzZXQgdG8gdGhlIGZpeHVwIGhhbmRsZXIgb3IgemVyby4KKyAqCisgKiBQcm9jZWR1cmVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgbWVjaGFuaXNtIHNob3VsZCBzZXQgRVhDX1RBQkxFX0ZJWFVQIHRvIHRoZQorICogbm9uemVybyBhZGRyZXNzIG9mIGEgZml4dXAgcm91dGluZSBiZWZvcmUgaXQgY291bGQgY2F1c2UgYSBkb3VibGUgZXhjZXB0aW9uCisgKiBhbmQgcmVzZXQgaXQgYmVmb3JlIGl0IHJldHVybnMuCisgKgorICogU29tZSBvdGhlciB0aGluZ3MgdG8gdGFrZSBjYXJlIG9mIHdoZW4gYSBmYXN0IGV4Y2VwdGlvbiBoYW5kbGVyIGRvZXNuJ3QKKyAqIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIGZpeHVwIGhhbmRsZXIgYnV0IHdhbnRzIHRvIHVzZSB0aGUgZGVmYXVsdCBoYW5kbGVyczoKKyAqCisgKiAgLSBUaGUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlciAoaW4gYTEpIG11c3Qgbm90IGJlIG1vZGlmaWVkLiBUaGUgZmFzdAorICogICAgZXhjZXB0aW9uIGhhbmRsZXIgc2hvdWxkIG9ubHkgdXNlIGEyIGFzIHRoZSBzdGFjayBwb2ludGVyLgorICoKKyAqICAtIElmIHRoZSBmYXN0IGhhbmRsZXIgbWFuaXB1bGF0ZXMgdGhlIHN0YWNrIHBvaW50ZXIgKGluIGEyKSwgaXQgaGFzIHRvCisgKiAgICByZWdpc3RlciBhIHZhbGlkIGZpeHVwIGhhbmRsZXIgYW5kIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgaGFuZGxlcnMuCisgKgorICogIC0gVGhlIGhhbmRsZXIgY2FuIHVzZSBhbnkgb3RoZXIgZ2VuZXJpYyByZWdpc3RlciBmcm9tIGEzIHRvIGExNSwgYnV0IGl0CisgKiAgICBtdXN0IHNhdmUgdGhlIGNvbnRlbnQgb2YgdGhlc2UgcmVnaXN0ZXJzIHRvIHN0YWNrIChQVF9BUkVHMy4uLlBUX0FSRUd4KQorICoKKyAqICAtIFRoZXNlIHJlZ2lzdGVycyBtdXN0IGJlIHNhdmVkIGJlZm9yZSBhIGRvdWJsZSBleGNlcHRpb24gY2FuIG9jY3VyLgorICoKKyAqICAtIElmIHdlIGV2ZXIgaW1wbGVtZW50IGhhbmRsaW5nIHNpZ25hbHMgd2hpbGUgaW4gZG91YmxlIGV4Y2VwdGlvbnMsIHRoZQorICogICAgbnVtYmVyIG9mIHJlZ2lzdGVycyBhIGZhc3QgaGFuZGxlciBoYXMgc2F2ZWQgKGV4Y2x1ZGluZyBhMCBhbmQgYTEpIG11c3QKKyAqICAgIGJlIHdyaXR0ZW4gdG8gIFBUX0FSRUcxLiAoMSBpZiBvbmx5IGEzIGlzIHVzZWQsIDIgZm9yIGEzIGFuZCBhNCwgZXRjLiApCisgKgorICogVGhlIGZpeHVwIGhhbmRsZXJzIGFyZSBzcGVjaWFsIGhhbmRsZXJzOgorICoKKyAqICAtIEZpeHVwIGVudHJ5IGNvbmRpdGlvbnMgZGlmZmVyIGZyb20gcmVndWxhciBleGNlcHRpb25zOgorICoKKyAqCWEwOgkgICBERVBDCisgKglhMTogCSAgIGExCisgKglhMjoJICAgdHJhc2hlZCwgb3JpZ2luYWwgdmFsdWUgaW4gRVhDX1RBQkxFX0RPVUJMRV9BMgorICoJYTM6CSAgIGV4Y3RhYmxlCisgKglkZXBjOgkgICBhMAorICoJZXhjc2F2ZV8xOiBhMworICoKKyAqICAtIFdoZW4gdGhlIGtlcm5lbCBlbnRlcnMgdGhlIGZpeHVwIGhhbmRsZXIsIGl0IHN0aWxsIGFzc3VtZXMgaXQgaXMgaW4gYQorICogICAgY3JpdGljYWwgc2VjdGlvbiwgc28gRVhDX1RBQkxFX0ZJWFVQIHZhcmlhYmxlIGlzIHNldCB0byBleGNfdGFibGUuCisgKiAgICBUaGUgZml4dXAgaGFuZGxlciwgdGhlcmVmb3JlLCBoYXMgdG8gcmUtcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSBmaXh1cAorICogICAgaGFuZGxlciBiZWZvcmUgaXQgcmV0dXJucyBmcm9tIHRoZSBkb3VibGUgZXhjZXB0aW9uLgorICoKKyAqICAtIEZpeHVwIGhhbmRsZXIgY2FuIHNoYXJlIHRoZSBzYW1lIGV4Y2VwdGlvbiBmcmFtZSB3aXRoIHRoZSBmYXN0IGhhbmRsZXIuCisgKiAgICBUaGUga2VybmVsIHN0YWNrIHBvaW50ZXIgaXMgbm90IGNoYW5nZWQgd2hlbiBlbnRlcmluZyB0aGUgZml4dXAgaGFuZGxlci4KKyAqCisgKiAgLSBGaXh1cCBoYW5kbGVycyBjYW4ganVtcCB0byB0aGUgZGVmYXVsdCBrZXJuZWwgYW5kIHVzZXIgZXhjZXB0aW9uCisgKiAgICBoYW5kbGVycy4gQmVmb3JlIGl0IGp1bXBzLCB0aG91Z2gsIGl0IGhhcyB0byBzZXR1cCBhIGV4Y2VwdGlvbiBmcmFtZQorICogICAgb24gc3RhY2suIEJlY2F1c2UgdGhlIGRlZmF1bHQgaGFuZGxlciByZXNldHMgdGhlIHJlZ2lzdGVyIGZpeHVwIGhhbmRsZXIKKyAqICAgIHRoZSBmaXh1cCBoYW5kbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIGRlZmF1bHQgaGFuZGxlciByZXR1cm5zIHRvCisgKiAgICBpdCBpbnN0ZWFkIG9mIHRoZSBleGNlcHRpb24gYWRkcmVzcywgc28gaXQgY2FuIHJlLXJlZ2lzdGVyIGl0c2VsZiBhcworICogICAgdGhlIGZpeHVwIGhhbmRsZXIuCisgKgorICogSW4gY2FzZSBvZiBhIGNyaXRpY2FsIGNvbmRpdGlvbiB3aGVyZSB0aGUga2VybmVsIGNhbm5vdCByZWNvdmVyLCB3ZSBqdW1wCisgKiB0byB1bnJlY292ZXJhYmxlX2V4Y2VwdGlvbiB3aXRoIHRoZSBmb2xsb3dpbmcgZW50cnkgY29uZGl0aW9ucy4KKyAqIEFsbCByZWdpc3RlcnMgYTAuLi5hMTUgYXJlIHVuY2hhbmdlZCBmcm9tIHRoZSBsYXN0IGV4Y2VwdGlvbiwgZXhjZXB0OgorICoKKyAqCWEwOgkgICBsYXN0IGFkZHJlc3MgYmVmb3JlIHdlIGp1bXBlZCB0byB0aGUgdW5yZWNvdmVyYWJsZV9leGNlcHRpb24uCisgKglleGNzYXZlXzE6IGEwCisgKgorICoKKyAqIFNlZSB0aGUgaGFuZGxlX2FsbG9jYV91c2VyIGFuZCBzcGlsbF9yZWdpc3RlcnMgcm91dGluZXMgZm9yIGV4YW1wbGUgY2xpZW50cy4KKyAqCisgKiBGSVhNRTogTm90ZTogd2UgY3VycmVudGx5IGRvbid0IGFsbG93IHNpZ25hbCBoYW5kbGluZyBjb21pbmcgZnJvbSBhIGRvdWJsZQorICogICAgICAgIGV4Y2VwdGlvbiwgc28gdGhlIGl0ZW0gbWFya3Qgd2l0aCAoKikgaXMgbm90IHJlcXVpcmVkLgorICovCisKKwkuc2VjdGlvbiAuRG91YmxlRXhjZXB0aW9uVmVjdG9yLnRleHQsICJheCIKKwkuYmVnaW4gbGl0ZXJhbF9wcmVmaXggLkRvdWJsZUV4Y2VwdGlvblZlY3RvcgorCitFTlRSWShfRG91YmxlRXhjZXB0aW9uVmVjdG9yKQorCisJLyogRGVsaWJlcmF0ZWx5IGRlc3Ryb3kgZXhjc2F2ZSAoZG9uJ3QgYXNzdW1lIGl0J3MgdmFsdWUgd2FzIHZhbGlkKS4gKi8KKworCXdzcglhMywgRVhDU0FWRV8xCQkjIHNhdmUgYTMKKworCS8qIENoZWNrIGZvciBrZXJuZWwgZG91YmxlIGV4Y2VwdGlvbiAodXN1YWxseSBmYXRhbCkuICovCisKKwlyc3IJYTMsIFBTCisJX2JiY2kubAlhMywgUFNfVU1fU0hJRlQsIC5Ma3NwCisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IGhhbmRsaW5nIGEgd2luZG93IGV4Y2VwdGlvbi4gKi8KKwkvKiBOb3RlOiBXZSBkb24ndCBuZWVkIHRvIGluZGljYXRlIHRoYXQgd2UgZW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uLiAqLworCisJeHNyCWEwLCBERVBDCQkjIGdldCBERVBDLCBzYXZlIGEwCisKKwltb3ZpCWEzLCBYQ0hBTF9XSU5ET1dfVkVDVE9SU19WQUREUgorCV9ibHR1CWEwLCBhMywgLkxmaXh1cAorCWFkZGkJYTMsIGEzLCBYU0hBTF9XSU5ET1dfVkVDVE9SU19TSVpFCisJX2JnZXUJYTAsIGEzLCAuTGZpeHVwCisKKwkvKiBXaW5kb3cgb3ZlcmZsb3cvdW5kZXJmbG93IGV4Y2VwdGlvbi4gR2V0IHN0YWNrIHBvaW50ZXIuICovCisKKwltb3YJYTMsIGEyCisJbW92aQlhMiwgZXhjX3RhYmxlCisJbDMyaQlhMiwgYTIsIEVYQ19UQUJMRV9LU1RLCisKKwkvKiBDaGVjayBmb3Igb3ZlcmZsb3cvdW5kZXJmbG93IGV4Y2VwdGlvbiwganVtcCBpZiBvdmVyZmxvdy4gKi8KKworCV9iYmNpLmwJYTAsIDYsIC5Mb3ZmbAorCisJLyogYTA6IGRlcGMsIGExOiBhMSwgYTI6IGtzdGssIGEzOiBhMiwgZGVwYzogYTAsIGV4Y3NhdmU6IGEzICAqLworCisJLyogUmVzdGFydCB3aW5kb3cgdW5kZXJmbG93IGV4Y2VwdGlvbi4KKwkgKiBXZSByZXR1cm4gdG8gdGhlIGluc3RydWN0aW9uIGluIHVzZXIgc3BhY2UgdGhhdCBjYXVzZWQgdGhlIHdpbmRvdworCSAqIHVuZGVyZmxvdyBleGNlcHRpb24uIFRoZXJlZm9yZSwgd2UgY2hhbmdlIHdpbmRvdyBiYXNlIHRvIHRoZSB2YWx1ZQorCSAqIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSB3aW5kb3cgdW5kZXJmbG93IGV4Y2VwdGlvbiBhbmQgcHJlcGFyZSB0aGUKKwkgKiByZWdpc3RlcnMgdG8gcmV0dXJuIGFzIGlmIHdlIHdlcmUgY29taW5nIGZyb20gYSByZWd1bGFyIGV4Y2VwdGlvbgorCSAqIGJ5IGNoYW5naW5nIGRlcGMgKGluIGEwKS4KKwkgKiBOb3RlOiBXZSBjYW4gdHJhc2ggdGhlIGN1cnJlbnQgd2luZG93IGZyYW1lIChhMC4uLmEzKSBhbmQgZGVwYyEKKwkgKi8KKworCXdzcglhMiwgREVQQwkJIyBzYXZlIHN0YWNrIHBvaW50ZXIgdGVtcG9yYXJpbHkKKwlyc3IJYTAsIFBTCisJZXh0dWkJYTAsIGEwLCBYQ0hBTF9QU19PV0JfU0hJRlQsIFhDSEFMX1BTX09XQl9CSVRTCisJd3NyCWEwLCBXSU5ET1dCQVNFCisJcnN5bmMKKworCS8qIFdlIGFyZSBub3cgaW4gdGhlIHByZXZpb3VzIHdpbmRvdyBmcmFtZS4gU2F2ZSByZWdpc3RlcnMgYWdhaW4uICovCisKKwl4c3IJYTIsIERFUEMJCSMgc2F2ZSBhMiBhbmQgZ2V0IHN0YWNrIHBvaW50ZXIKKwlzMzJpCWEwLCBhMiwgUFRfQVJFRzAKKworCXdzcglhMywgRVhDU0FWRV8xCQkjIHNhdmUgYTMKKwltb3ZpCWEzLCBleGNfdGFibGUKKworCXJzcglhMCwgRVhDQ0FVU0UKKwlzMzJpCWEwLCBhMiwgUFRfREVQQwkJIyBtYXJrIGl0IGFzIGEgcmVndWxhciBleGNlcHRpb24KKwlhZGR4NAlhMCwgYTAsIGEzCisJbDMyaQlhMCwgYTAsIEVYQ19UQUJMRV9GQVNUX1VTRVIKKwlqeAlhMAorCisuTGZpeHVwOi8qIENoZWNrIGZvciBhIGZpeHVwIGhhbmRsZXIgb3IgaWYgd2Ugd2VyZSBpbiBhIGNyaXRpY2FsIHNlY3Rpb24uICovCisKKwkvKiBhMDogZGVwYywgYTE6IGExLCBhMjogYTIsIGEzOiB0cmFzaGVkLCBkZXBjOiBhMCwgZXhjc2F2ZTE6IGEzICovCisKKwltb3ZpCWEzLCBleGNfdGFibGUKKwlzMzJpCWEyLCBhMywgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCSMgdGVtcG9yYXJ5IHZhcmlhYmxlCisKKwkvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uLiAqLworCisJbDMyaQlhMiwgYTMsIEVYQ19UQUJMRV9GSVhVUAorCXMzMmkJYTMsIGEzLCBFWENfVEFCTEVfRklYVVAKKwliZXEJYTIsIGEzLCAuTHVucmVjb3ZlcmFibGVfZml4dXAJIyBjcml0aWNhbCEKKwliZXF6CWEyLCAuTGRmbHQJCQkjIG5vIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQKKworCS8qIGEwOiBkZXBjLCBhMTogYTEsIGEyOiB0cmFzaCwgYTM6IGV4Y3RhYmxlLCBkZXBjOiBhMCwgZXhjc2F2ZTogYTMgKi8KKworCWp4CWEyCisKKy5MZGZsdDoJLyogR2V0IHN0YWNrIHBvaW50ZXIuICovCisKKwlsMzJpCWEzLCBhMywgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCisJYWRkaQlhMiwgYTMsIC1QVF9VU0VSX1NJWkUKKworLkxvdmZsOgkvKiBKdW1wIHRvIGRlZmF1bHQgaGFuZGxlcnMuICovCisKKwkvKiBhMDogZGVwYywgYTE6IGExLCBhMjoga3N0aywgYTM6IGEyLCBkZXBjOiBhMCwgZXhjc2F2ZTogYTMgKi8KKworCXhzcglhMywgREVQQworCXMzMmkJYTAsIGEyLCBQVF9ERVBDCisJczMyaQlhMywgYTIsIFBUX0FSRUcwCisKKwkvKiBhMDogYXZhaWwsIGExOiBhMSwgYTI6IGtzdGssIGEzOiBhdmFpbCwgZGVwYzogYTIsIGV4Y3NhdmU6IGEzICovCisKKwltb3ZpCWEzLCBleGNfdGFibGUKKwlyc3IJYTAsIEVYQ0NBVVNFCisJYWRkeDQJYTAsIGEwLCBhMworCWwzMmkJYTAsIGEwLCBFWENfVEFCTEVfRkFTVF9VU0VSCisJangJYTAKKworCS8qCisJICogV2Ugb25seSBhbGxvdyB0aGUgSVRMQiBtaXNzIGV4Y2VwdGlvbiBpZiB3ZSBhcmUgaW4ga2VybmVsIHNwYWNlLgorCSAqIEFsbCBvdGhlciBleGNlcHRpb25zIGFyZSB1bmV4cGVjdGVkIGFuZCB0aHVzIHVucmVjb3ZlcmFibGUhCisJICovCisKKwkuZXh0ZXJuIGZhc3Rfc2Vjb25kX2xldmVsX21pc3NfZG91YmxlX2tlcm5lbAorCisuTGtzcDoJLyogYTA6IGEwLCBhMTogYTEsIGEyOiBhMiwgYTM6IHRyYXNoZWQsIGRlcGM6IGRlcGMsIGV4Y3NhdmU6IGEzICovCisKKwlyc3IJYTMsIEVYQ0NBVVNFCisJYmVxaQlhMywgWENIQUxfRVhDQ0FVU0VfSVRMQl9NSVNTLCAxZgorCWFkZGkJYTMsIGEzLCAtWENIQUxfRVhDQ0FVU0VfRFRMQl9NSVNTCisJYm5leglhMywgLkx1bnJlY292ZXJhYmxlCisxOgltb3ZpCWEzLCBmYXN0X3NlY29uZF9sZXZlbF9taXNzX2RvdWJsZV9rZXJuZWwKKwlqeAlhMworCisJLyogQ3JpdGljYWwhIFdlIGNhbid0IGhhbmRsZSB0aGlzIHNpdHVhdGlvbi4gUEFOSUMhICovCisKKwkuZXh0ZXJuIHVucmVjb3ZlcmFibGVfZXhjZXB0aW9uCisKKy5MdW5yZWNvdmVyYWJsZV9maXh1cDoKKwlsMzJpCWEyLCBhMywgRVhDX1RBQkxFX0RPVUJMRV9TQVZFCisJeHNyCWEwLCBERVBDCisKKy5MdW5yZWNvdmVyYWJsZToKKwlyc3IJYTMsIEVYQ1NBVkVfMQorCXdzcglhMCwgRVhDU0FWRV8xCisJbW92aQlhMCwgdW5yZWNvdmVyYWJsZV9leGNlcHRpb24KKwljYWxseDAJYTAKKworCS5lbmQgbGl0ZXJhbF9wcmVmaXgKKworCisvKgorICogRGVidWcgaW50ZXJydXB0IHZlY3RvcgorICoKKyAqIFRoZXJlIGlzIG5vdCBtdWNoIHNwYWNlIGhlcmUsIHNvIHNpbXBseSBqdW1wIHRvIGFub3RoZXIgaGFuZGxlci4KKyAqIEVYQ1NBVkVbREVCVUdMRVZFTF0gaGFzIGJlZW4gc2V0IHRvIHRoYXQgaGFuZGxlci4KKyAqLworCisJLnNlY3Rpb24gLkRlYnVnSW50ZXJydXB0VmVjdG9yLnRleHQsICJheCIKKworRU5UUlkoX0RlYnVnSW50ZXJydXB0VmVjdG9yKQorCXhzcglhMCwgRVhDU0FWRSArIFhDSEFMX0RFQlVHTEVWRUwKKwlqeAlhMAorCisKKworLyogV2luZG93IG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgaGFuZGxlcnMuCisgKiBUaGUgaGFuZGxlcnMgbXVzdCBiZSA2NCBieXRlcyBhcGFydCwgZmlyc3Qgc3RhcnRpbmcgd2l0aCB0aGUgdW5kZXJmbG93CisgKiBoYW5kbGVycyB1bmRlcmZsb3ctNCB0byB1bmRlcmZsb3ctMTIsIHRoZW4gdGhlIG92ZXJmbG93IGhhbmRsZXJzCisgKiBvdmVyZmxvdy00IHRvIG92ZXJmbG93LTEyLgorICoKKyAqIE5vdGU6IFdlIHJlcnVuIHRoZSB1bmRlcmZsb3cgaGFuZGxlcnMgaWYgd2UgaGl0IGFuIGV4Y2VwdGlvbiwgc28KKyAqCSB3ZSB0cnkgdG8gYWNjZXNzIGFueSBwYWdlIHRoYXQgd291bGQgY2F1c2UgYSBwYWdlIGZhdWx0IGVhcmx5LgorICovCisKKwkuc2VjdGlvbgkJLldpbmRvd1ZlY3RvcnMudGV4dCwgImF4IgorCisKKy8qIDQtUmVnaXN0ZXIgV2luZG93IE92ZXJmbG93IFZlY3RvciAoSGFuZGxlcikgKi8KKworCS5hbGlnbiA2NAorLmdsb2JhbCBfV2luZG93T3ZlcmZsb3c0CitfV2luZG93T3ZlcmZsb3c0OgorCXMzMmUJYTAsIGE1LCAtMTYKKwlzMzJlCWExLCBhNSwgLTEyCisJczMyZQlhMiwgYTUsICAtOAorCXMzMmUJYTMsIGE1LCAgLTQKKwlyZndvCisKKworLyogNC1SZWdpc3RlciBXaW5kb3cgVW5kZXJmbG93IFZlY3RvciAoSGFuZGxlcikgKi8KKworCS5hbGlnbiA2NAorLmdsb2JhbCBfV2luZG93VW5kZXJmbG93NAorX1dpbmRvd1VuZGVyZmxvdzQ6CisJbDMyZQlhMCwgYTUsIC0xNgorCWwzMmUJYTEsIGE1LCAtMTIKKwlsMzJlCWEyLCBhNSwgIC04CisJbDMyZQlhMywgYTUsICAtNAorCXJmd3UKKworCisvKiA4LVJlZ2lzdGVyIFdpbmRvdyBPdmVyZmxvdyBWZWN0b3IgKEhhbmRsZXIpICovCisKKwkuYWxpZ24gNjQKKy5nbG9iYWwgX1dpbmRvd092ZXJmbG93OAorX1dpbmRvd092ZXJmbG93ODoKKwlzMzJlCWEwLCBhOSwgLTE2CisJbDMyZQlhMCwgYTEsIC0xMgorCXMzMmUJYTIsIGE5LCAgLTgKKwlzMzJlCWExLCBhOSwgLTEyCisJczMyZQlhMywgYTksICAtNAorCXMzMmUJYTQsIGEwLCAtMzIKKwlzMzJlCWE1LCBhMCwgLTI4CisJczMyZQlhNiwgYTAsIC0yNAorCXMzMmUJYTcsIGEwLCAtMjAKKwlyZndvCisKKy8qIDgtUmVnaXN0ZXIgV2luZG93IFVuZGVyZmxvdyBWZWN0b3IgKEhhbmRsZXIpICovCisKKwkuYWxpZ24gNjQKKy5nbG9iYWwgX1dpbmRvd1VuZGVyZmxvdzgKK19XaW5kb3dVbmRlcmZsb3c4OgorCWwzMmUJYTEsIGE5LCAtMTIKKwlsMzJlCWEwLCBhOSwgLTE2CisJbDMyZQlhNywgYTEsIC0xMgorCWwzMmUJYTIsIGE5LCAgLTgKKwlsMzJlCWE0LCBhNywgLTMyCisJbDMyZQlhMywgYTksICAtNAorCWwzMmUJYTUsIGE3LCAtMjgKKwlsMzJlCWE2LCBhNywgLTI0CisJbDMyZQlhNywgYTcsIC0yMAorCXJmd3UKKworCisvKiAxMi1SZWdpc3RlciBXaW5kb3cgT3ZlcmZsb3cgVmVjdG9yIChIYW5kbGVyKSAqLworCisJLmFsaWduIDY0CisuZ2xvYmFsIF9XaW5kb3dPdmVyZmxvdzEyCitfV2luZG93T3ZlcmZsb3cxMjoKKwlzMzJlCWEwLCAgYTEzLCAtMTYKKwlsMzJlCWEwLCAgYTEsICAtMTIKKwlzMzJlCWExLCAgYTEzLCAtMTIKKwlzMzJlCWEyLCAgYTEzLCAgLTgKKwlzMzJlCWEzLCAgYTEzLCAgLTQKKwlzMzJlCWE0LCAgYTAsICAtNDgKKwlzMzJlCWE1LCAgYTAsICAtNDQKKwlzMzJlCWE2LCAgYTAsICAtNDAKKwlzMzJlCWE3LCAgYTAsICAtMzYKKwlzMzJlCWE4LCAgYTAsICAtMzIKKwlzMzJlCWE5LCAgYTAsICAtMjgKKwlzMzJlCWExMCwgYTAsICAtMjQKKwlzMzJlCWExMSwgYTAsICAtMjAKKwlyZndvCisKKy8qIDEyLVJlZ2lzdGVyIFdpbmRvdyBVbmRlcmZsb3cgVmVjdG9yIChIYW5kbGVyKSAqLworCisJLmFsaWduIDY0CisuZ2xvYmFsIF9XaW5kb3dVbmRlcmZsb3cxMgorX1dpbmRvd1VuZGVyZmxvdzEyOgorCWwzMmUJYTEsICBhMTMsIC0xMgorCWwzMmUJYTAsICBhMTMsIC0xNgorCWwzMmUJYTExLCBhMSwgIC0xMgorCWwzMmUJYTIsICBhMTMsICAtOAorCWwzMmUJYTQsICBhMTEsIC00OAorCWwzMmUJYTgsICBhMTEsIC0zMgorCWwzMmUJYTMsICBhMTMsICAtNAorCWwzMmUJYTUsICBhMTEsIC00NAorCWwzMmUJYTYsICBhMTEsIC00MAorCWwzMmUJYTcsICBhMTEsIC0zNgorCWwzMmUJYTksICBhMTEsIC0yOAorCWwzMmUJYTEwLCBhMTEsIC0yNAorCWwzMmUJYTExLCBhMTEsIC0yMAorCXJmd3UKKworCS50ZXh0CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWQ3MWRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9rZXJuZWwvdm1saW51eC5sZHMuUworICoKKyAqIFh0ZW5zYSBsaW5rZXIgc2NyaXB0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqIE1hcmMgR2F1dGhpZXIgPG1hcmNAdGVuc2lsaWNhLmNvbSwgbWFyY0BhbHVtbmkudXdhdGVybG9vLmNhPgorICogSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICovCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZGVmaW5lIF9OT0NMQU5HVUFHRQorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3lzdGVtLmg+CitPVVRQVVRfQVJDSCh4dGVuc2EpCitFTlRSWShfc3RhcnQpCisKKyNpZiBYQ0hBTF9NRU1PUllfT1JERVIgPT0gWFRIQUxfQklHRU5ESUFOCitqaWZmaWVzID0gamlmZmllc182NCArIDQ7CisjZWxzZQoramlmZmllcyA9IGppZmZpZXNfNjQ7CisjZW5kaWYKKworI2RlZmluZSBLRVJORUxPRkZTRVQgMHgxMDAwCisKKy8qIE5vdGU6IEluIHRoZSBmb2xsb3dpbmcgbWFjcm9zLCBpdCB3b3VsZCBiZSBuaWNlIHRvIHNwZWNpZnkgb25seSB0aGUKKyAgIHZlY3RvciBuYW1lIGFuZCBzZWN0aW9uIGtpbmQgYW5kIGNvbnN0cnVjdCAic3ltIiBhbmQgInNlY3Rpb24iIHVzaW5nCisgICBDUFAgY29uY2F0ZW5hdGlvbiwgYnV0IHRoYXQgZG9lcyBub3Qgd29yayByZWxpYWJseS4gIENvbmNhdGVuYXRpbmcgYQorICAgc3RyaW5nIHdpdGggIi4iIHByb2R1Y2VzIGFuIGludmFsaWQgdG9rZW4uICBDUFAgd2lsbCBub3QgcHJpbnQgYQorICAgd2FybmluZyBiZWNhdXNlIGl0IHRoaW5rcyB0aGlzIGlzIGFuIGFzc2VtYmx5IGZpbGUsIGJ1dCBpdCBsZWF2ZXMKKyAgIHRoZW0gYXMgbXVsdGlwbGUgdG9rZW5zIGFuZCB0aGVyZSBtYXkgb3IgbWF5IG5vdCBiZSB3aGl0ZXNwYWNlCisgICBiZXR3ZWVuIHRoZW0uICAqLworCisvKiBNYWNybyBmb3IgYSByZWxvY2F0aW9uIGVudHJ5ICovCisKKyNkZWZpbmUgUkVMT0NBVEVfRU5UUlkoc3ltLCBzZWN0aW9uKQkJXAorCUxPTkcoc3ltICMjIF9zdGFydCk7CQkJXAorCUxPTkcoc3ltICMjIF9lbmQpOwkJCVwKKwlMT05HKExPQURBRERSKHNlY3Rpb24pKQorCisvKiBNYWNybyB0byBkZWZpbmUgYSBzZWN0aW9uIGZvciBhIHZlY3Rvci4KKyAqCisgKiBVc2Ugb2YgdGhlIE1JTiBmdW5jdGlvbiBjYXRjaGVzIHRoZSB0eXBlcyBvZiBlcnJvcnMgaWxsdXN0cmF0ZWQgaW4KKyAqIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAqCisgKiBBc3N1bWUgdGhlIHNlY3Rpb24gLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci5saXRlcmFsIGlzIGNvbXBsZXRlbHkKKyAqIGZ1bGwuICBUaGVuIGEgcHJvZ3JhbW1lciBhZGRzIGNvZGUgdG8gLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci50ZXh0CisgKiB0aGF0IHByb2R1Y2VzIGFub3RoZXIgbGl0ZXJhbC4gIFRoZSBmaW5hbCBsaXRlcmFsIHBvc2l0aW9uIHdpbGwKKyAqIG92ZXJsYXkgb250byB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgYWRqYWNlbnQgY29kZSBzZWN0aW9uCisgKiAuRG91YmxlRXhjZXB0aW9uVmVjdG9yLnRleHQuICAoSW4gcHJhY3RpY2UsIHRoZSBsaXRlcmFscyB3aWxsCisgKiBvdmVyd3JpdGUgdGhlIGNvZGUsIGFuZCB0aGUgZmlyc3QgZmV3IGluc3RydWN0aW9ucyB3aWxsIGJlCisgKiBnYXJiYWdlLikKKyAqLworCisjZGVmaW5lIFNFQ1RJT05fVkVDVE9SKHN5bSwgc2VjdGlvbiwgYWRkciwgbWF4X3ByZXZzZWNfc2l6ZSwgcHJldnNlYykgICAgICAgXAorICBzZWN0aW9uIGFkZHIgOiBBVCgoTUlOKExPQURBRERSKHByZXZzZWMpICsgbWF4X3ByZXZzZWNfc2l6ZSwJCSAgICBcCisJCSAgICAgICAgIExPQURBRERSKHByZXZzZWMpICsgU0laRU9GKHByZXZzZWMpKSArIDMpICYgfiAzKSAgIFwKKyAgewkJCQkJCQkJCSAgICBcCisgICAgLiA9IEFMSUdOKDQpOwkJCQkJCQkgICAgXAorICAgIHN5bSAjIyBfc3RhcnQgPSBBQlNPTFVURSguKTsJCSAJCQkgICAgXAorICAgICooc2VjdGlvbikJCQkJCQkJCSAgICBcCisgICAgc3ltICMjIF9lbmQgPSBBQlNPTFVURSguKTsJCQkJCQkgICAgXAorICB9CisKKy8qCisgKiAgTWFwcGluZyBvZiBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMgd2hlbiBsaW5raW5nLgorICovCisKK1NFQ1RJT05TCit7CisgIC4gPSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiArIEtFUk5FTE9GRlNFVDsKKyAgLyogLnRleHQgc2VjdGlvbiAqLworCisgIF90ZXh0ID0gLjsKKyAgX3N0ZXh0ID0gLjsKKyAgX2Z0ZXh0ID0gLjsKKworICAudGV4dCA6CisgIHsKKyAgICAvKiBUaGUgLmhlYWQudGV4dCBzZWN0aW9uIG11c3QgYmUgdGhlIGZpcnN0IHNlY3Rpb24hICovCisgICAgKiguaGVhZC50ZXh0KQorICAgICooLmxpdGVyYWwgLnRleHQpCisgICAgKiguc3JvbS50ZXh0KQorICAgIFZNTElOVVhfU1lNQk9MKF9fc2NoZWRfdGV4dF9zdGFydCkgPSAuOworICAgICooLnNjaGVkLmxpdGVyYWwgLnNjaGVkLnRleHQpCisgICAgVk1MSU5VWF9TWU1CT0woX19zY2hlZF90ZXh0X2VuZCkgPSAuOworICAgIFZNTElOVVhfU1lNQk9MKF9fbG9ja190ZXh0X3N0YXJ0KSA9IC47CisgICAgKiguc3BpbmxvY2subGl0ZXJhbCAuc3BpbmxvY2sudGV4dCkKKyAgICBWTUxJTlVYX1NZTUJPTChfX2xvY2tfdGV4dF9lbmQpID0gLjsKKworICB9CisgIF9ldGV4dCA9IC47CisKKyAgLiA9IEFMSUdOKDE2KTsKKworICBST0RBVEEKKworICAvKiAgUmVsb2NhdGlvbiB0YWJsZSAqLworCisgIC4gPSBBTElHTigxNik7CisgIF9fYm9vdF9yZWxvY190YWJsZV9zdGFydCA9IEFCU09MVVRFKC4pOworCisgIF9fcmVsb2NhdGUgOiB7CisKKyAgICBSRUxPQ0FURV9FTlRSWShfV2luZG93VmVjdG9yc190ZXh0LAorCQkgICAuV2luZG93VmVjdG9ycy50ZXh0KTsKKyNpZiAwCisgICAgUkVMT0NBVEVfRU5UUlkoX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLAorCQkgICAuS2VybmVsRXhjZXB0aW9uVmVjdG9yLmxpdGVyYWwpOworI2VuZGlmCisgICAgUkVMT0NBVEVfRU5UUlkoX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl90ZXh0LAorCQkgICAuS2VybmVsRXhjZXB0aW9uVmVjdG9yLnRleHQpOworI2lmIDAKKyAgICBSRUxPQ0FURV9FTlRSWShfVXNlckV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLAorCQkgICAuVXNlckV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKTsKKyNlbmRpZgorICAgIFJFTE9DQVRFX0VOVFJZKF9Vc2VyRXhjZXB0aW9uVmVjdG9yX3RleHQsCisJCSAgIC5Vc2VyRXhjZXB0aW9uVmVjdG9yLnRleHQpOworICAgIFJFTE9DQVRFX0VOVFJZKF9Eb3VibGVFeGNlcHRpb25WZWN0b3JfbGl0ZXJhbCwKKwkJICAgLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKTsKKyAgICBSRUxPQ0FURV9FTlRSWShfRG91YmxlRXhjZXB0aW9uVmVjdG9yX3RleHQsCisJCSAgIC5Eb3VibGVFeGNlcHRpb25WZWN0b3IudGV4dCk7CisgIH0KKyAgX19ib290X3JlbG9jX3RhYmxlX2VuZCA9IEFCU09MVVRFKC4pIDsKKworICAuZml4dXAgICA6IHsgKiguZml4dXApIH0KKworICAuID0gQUxJR04oMTYpOworCisgIF9fZXhfdGFibGUgOiB7CisgICAgX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKyAgICAqKF9fZXhfdGFibGUpCisgICAgX19zdG9wX19fZXhfdGFibGUgPSAuOworICB9CisKKyAgLyogRGF0YSBzZWN0aW9uICovCisKKyAgLiA9IEFMSUdOKFhDSEFMX0lDQUNIRV9MSU5FU0laRSk7CisgIF9mZGF0YSA9IC47CisgIC5kYXRhIDoKKyAgeworICAgICooLmRhdGEpIENPTlNUUlVDVE9SUworICAgIC4gPSBBTElHTihYQ0hBTF9JQ0FDSEVfTElORVNJWkUpOworICAgICooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCisgIH0KKworICBfZWRhdGEgPSAuOworCisgIC8qIFRoZSBpbml0aWFsIHRhc2sgKi8KKyAgLiA9IEFMSUdOKDgxOTIpOworICAuZGF0YS5pbml0X3Rhc2sgOiB7ICooLmRhdGEuaW5pdF90YXNrKSB9CisKKyAgLyogSW5pdGlhbGl6YXRpb24gY29kZSBhbmQgZGF0YTogKi8KKworICAuID0gQUxJR04oMTw8WENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFKTsKKyAgX19pbml0X2JlZ2luID0gLjsKKyAgLmluaXQudGV4dCA6IHsKKyAgCV9zaW5pdHRleHQgPSAuOworCSooLmluaXQubGl0ZXJhbCkgKiguaW5pdC50ZXh0KQorCV9laW5pdHRleHQgPSAuOworICB9CisKKyAgLmluaXQuZGF0YSA6CisgIHsKKyAgICAqKC5pbml0LmRhdGEpCisgICAgLiA9IEFMSUdOKDB4NCk7CisgICAgX190YWd0YWJsZV9iZWdpbiA9IC47CisgICAgKigudGFnbGlzdCkKKyAgICBfX3RhZ3RhYmxlX2VuZCA9IC47CisgIH0KKworICAuID0gQUxJR04oWENIQUxfSUNBQ0hFX0xJTkVTSVpFKTsKKworICBfX3NldHVwX3N0YXJ0ID0gLjsKKyAgLmluaXQuc2V0dXAgOiB7ICooLmluaXQuc2V0dXApIH0KKyAgX19zZXR1cF9lbmQgPSAuOworCisgIF9faW5pdGNhbGxfc3RhcnQgPSAuOworICAuaW5pdGNhbGwuaW5pdCA6IHsKKyAgCSooLmluaXRjYWxsMS5pbml0KQorICAJKiguaW5pdGNhbGwyLmluaXQpCisgIAkqKC5pbml0Y2FsbDMuaW5pdCkKKyAgCSooLmluaXRjYWxsNC5pbml0KQorICAJKiguaW5pdGNhbGw1LmluaXQpCisgIAkqKC5pbml0Y2FsbDYuaW5pdCkKKyAgCSooLmluaXRjYWxsNy5pbml0KQorICB9CisgIF9faW5pdGNhbGxfZW5kID0gLjsKKworICBfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CisgIC5jb25faW5pdGNhbGwuaW5pdCA6IHsgKiguY29uX2luaXRjYWxsLmluaXQpIH0KKyAgX19jb25faW5pdGNhbGxfZW5kID0gLjsKKworICBTRUNVUklUWV9JTklUCisKKyAgLiA9IEFMSUdOKDQpOworCisgIF9fc3RhcnRfX19mdHJfZml4dXAgPSAuOworICBfX2Z0cl9maXh1cCA6IHsgKihfX2Z0cl9maXh1cCkgfQorICBfX3N0b3BfX19mdHJfZml4dXAgPSAuOworCisgIC4gPSBBTElHTigzMik7CisgIF9fcGVyX2NwdV9zdGFydCA9IC47CisgIC5kYXRhLnBlcmNwdSAgOiB7ICooLmRhdGEucGVyY3B1KSB9CisgIF9fcGVyX2NwdV9lbmQgPSAuOworCisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0cmFtZnNfc3RhcnQgPS47CisgIC5pbml0LnJhbWZzIDogeyAqKC5pbml0LnJhbWZzKSB9CisgIF9faW5pdHJhbWZzX2VuZCA9IC47CisKKyAgLyogV2UgbmVlZCB0aGlzIGR1bW15IHNlZ21lbnQgaGVyZSAqLworCisgIC4gPSBBTElHTig0KTsKKyAgLmR1bW15IDogeyBMT05HKDApIH0KKworICAvKiBUaGUgdmVjdG9ycyBhcmUgcmVsb2NhdGVkIHRvIHRoZSByZWFsIHBvc2l0aW9uIGF0IHN0YXJ0dXAgdGltZSAqLworCisgIFNFQ1RJT05fVkVDVE9SIChfV2luZG93VmVjdG9yc190ZXh0LAorCQkgIC5XaW5kb3dWZWN0b3JzLnRleHQsCisJCSAgWENIQUxfV0lORE9XX1ZFQ1RPUlNfVkFERFIsIDQsCisJCSAgLmR1bW15KQorICBTRUNUSU9OX1ZFQ1RPUiAoX0RlYnVnSW50ZXJydXB0VmVjdG9yX2xpdGVyYWwsCisJCSAgLkRlYnVnSW50ZXJydXB0VmVjdG9yLmxpdGVyYWwsCisJCSAgWENIQUxfSU5UTEVWRUxfVkVDVE9SX1ZBRERSKFhDSEFMX0RFQlVHTEVWRUwpIC0gNCwKKwkJICBTSVpFT0YoLldpbmRvd1ZlY3RvcnMudGV4dCksCisJCSAgLldpbmRvd1ZlY3RvcnMudGV4dCkKKyAgU0VDVElPTl9WRUNUT1IgKF9EZWJ1Z0ludGVycnVwdFZlY3Rvcl90ZXh0LAorCQkgIC5EZWJ1Z0ludGVycnVwdFZlY3Rvci50ZXh0LAorCQkgIFhDSEFMX0lOVExFVkVMX1ZFQ1RPUl9WQUREUihYQ0hBTF9ERUJVR0xFVkVMKSwKKwkJICA0LAorCQkgIC5EZWJ1Z0ludGVycnVwdFZlY3Rvci5saXRlcmFsKQorICBTRUNUSU9OX1ZFQ1RPUiAoX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLAorCQkgIC5LZXJuZWxFeGNlcHRpb25WZWN0b3IubGl0ZXJhbCwKKwkJICBYQ0hBTF9LRVJORUxFWENfVkVDVE9SX1ZBRERSIC0gNCwKKwkJICBTSVpFT0YoLkRlYnVnSW50ZXJydXB0VmVjdG9yLnRleHQpLAorCQkgIC5EZWJ1Z0ludGVycnVwdFZlY3Rvci50ZXh0KQorICBTRUNUSU9OX1ZFQ1RPUiAoX0tlcm5lbEV4Y2VwdGlvblZlY3Rvcl90ZXh0LAorCQkgIC5LZXJuZWxFeGNlcHRpb25WZWN0b3IudGV4dCwKKwkJICBYQ0hBTF9LRVJORUxFWENfVkVDVE9SX1ZBRERSLAorCQkgIDQsCisJCSAgLktlcm5lbEV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKQorICBTRUNUSU9OX1ZFQ1RPUiAoX1VzZXJFeGNlcHRpb25WZWN0b3JfbGl0ZXJhbCwKKwkJICAuVXNlckV4Y2VwdGlvblZlY3Rvci5saXRlcmFsLAorCQkgIFhDSEFMX1VTRVJFWENfVkVDVE9SX1ZBRERSIC0gNCwKKwkJICBTSVpFT0YoLktlcm5lbEV4Y2VwdGlvblZlY3Rvci50ZXh0KSwKKwkJICAuS2VybmVsRXhjZXB0aW9uVmVjdG9yLnRleHQpCisgIFNFQ1RJT05fVkVDVE9SIChfVXNlckV4Y2VwdGlvblZlY3Rvcl90ZXh0LAorCQkgIC5Vc2VyRXhjZXB0aW9uVmVjdG9yLnRleHQsCisJCSAgWENIQUxfVVNFUkVYQ19WRUNUT1JfVkFERFIsCisJCSAgNCwKKwkJICAuVXNlckV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKQorICBTRUNUSU9OX1ZFQ1RPUiAoX0RvdWJsZUV4Y2VwdGlvblZlY3Rvcl9saXRlcmFsLAorCQkgIC5Eb3VibGVFeGNlcHRpb25WZWN0b3IubGl0ZXJhbCwKKwkJICBYQ0hBTF9ET1VCTEVFWENfVkVDVE9SX1ZBRERSIC0gMTYsCisJCSAgU0laRU9GKC5Vc2VyRXhjZXB0aW9uVmVjdG9yLnRleHQpLAorCQkgIC5Vc2VyRXhjZXB0aW9uVmVjdG9yLnRleHQpCisgIFNFQ1RJT05fVkVDVE9SIChfRG91YmxlRXhjZXB0aW9uVmVjdG9yX3RleHQsCisJCSAgLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci50ZXh0LAorCQkgIFhDSEFMX0RPVUJMRUVYQ19WRUNUT1JfVkFERFIsCisJCSAgMzIsCisJCSAgLkRvdWJsZUV4Y2VwdGlvblZlY3Rvci5saXRlcmFsKQorCisgIC4gPSAoTE9BREFERFIoIC5Eb3VibGVFeGNlcHRpb25WZWN0b3IudGV4dCApICsgU0laRU9GKCAuRG91YmxlRXhjZXB0aW9uVmVjdG9yLnRleHQgKSArIDMpICYgfiAzOworICAuID0gQUxJR04oMTw8WENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFKTsKKworICBfX2luaXRfZW5kID0gLjsKKworICAuID0gQUxJR04oODE5Mik7CisKKyAgLyogQlNTIHNlY3Rpb24gKi8KKyAgX2Jzc19zdGFydCA9IC47CisgIC5zYnNzIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9CisgIC5ic3MgOiB7ICooQ09NTU9OKSAqKC5ic3MpIH0KKyAgX2Jzc19lbmQgPSAuOworICBfZW5kID0gLjsKKworICAvKiBvbmx5IHVzZWQgYnkgdGhlIGJvb3QgbG9hZGVyICAqLworCisgIC4gPSBBTElHTigweDEwKTsKKyAgLmJvb3RzdHJhcCA6IHsgKiguYm9vdHN0cmFwLmxpdGVyYWwgLmJvb3RzdHJhcC50ZXh0IC5ib290c3RyYXAuZGF0YSkgfQorCisgIC4gPSBBTElHTigweDEwMDApOworICBfX2luaXRyZF9zdGFydCA9IC47CisgIC5pbml0cmQgOiB7ICooLmluaXRyZCkgfQorICBfX2luaXRyZF9lbmQgPSAuOworCisgIC5SZXNldFZlY3Rvci50ZXh0IFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUiA6CisgIHsKKyAgICAqKC5SZXNldFZlY3Rvci50ZXh0KQorICB9CisKKworICAvKiBTZWN0aW9ucyB0byBiZSBkaXNjYXJkZWQgKi8KKyAgL0RJU0NBUkQvIDoKKyAgeworICAgICAgICAqKC50ZXh0LmV4aXQpCisJKigudGV4dC5leGl0LmxpdGVyYWwpCisgICAgICAgICooLmRhdGEuZXhpdCkKKyAgICAgICAgKiguZXhpdGNhbGwuZXhpdCkKKyAgfQorCisKKyAgLmRlYnVnICAwIDogIHsgKiguZGVidWcpIH0KKyAgLmxpbmUgIDAgOiAgeyAqKC5saW5lKSB9CisgIC5kZWJ1Z19zcmNpbmZvICAwIDogIHsgKiguZGVidWdfc3JjaW5mbykgfQorICAuZGVidWdfc2ZuYW1lcyAgMCA6ICB7ICooLmRlYnVnX3NmbmFtZXMpIH0KKyAgLmRlYnVnX2FyYW5nZXMgIDAgOiAgeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9CisgIC5kZWJ1Z19wdWJuYW1lcyAgMCA6ICB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9CisgIC5kZWJ1Z19pbmZvICAwIDogIHsgKiguZGVidWdfaW5mbykgfQorICAuZGVidWdfYWJicmV2ICAwIDogIHsgKiguZGVidWdfYWJicmV2KSB9CisgIC5kZWJ1Z19saW5lICAwIDogIHsgKiguZGVidWdfbGluZSkgfQorICAuZGVidWdfZnJhbWUgIDAgOiAgeyAqKC5kZWJ1Z19mcmFtZSkgfQorICAuZGVidWdfc3RyICAwIDogIHsgKiguZGVidWdfc3RyKSB9CisgIC5kZWJ1Z19sb2MgIDAgOiAgeyAqKC5kZWJ1Z19sb2MpIH0KKyAgLmRlYnVnX21hY2luZm8gIDAgOiAgeyAqKC5kZWJ1Z19tYWNpbmZvKSB9CisgIC5kZWJ1Z193ZWFrbmFtZXMgIDAgOiAgeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KKyAgLmRlYnVnX2Z1bmNuYW1lcyAgMCA6ICB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQorICAuZGVidWdfdHlwZW5hbWVzICAwIDogIHsgKiguZGVidWdfdHlwZW5hbWVzKSB9CisgIC5kZWJ1Z192YXJuYW1lcyAgMCA6ICB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9CisKKyAgLnh0Lmluc24gMCA6CisgIHsKKyAgICAqKC54dC5pbnNuKQorICAgICooLmdudS5saW5rb25jZS54KikKKyAgfQorCisgIC54dC5saXQgMCA6CisgIHsKKyAgICAqKC54dC5saXQpCisgICAgKiguZ251LmxpbmtvbmNlLnAqKQorICB9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwveHRlbnNhX2tzeW1zLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwveHRlbnNhX2tzeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhZTU2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC94dGVuc2Ffa3N5bXMuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC94dGVuc2Ffa3N5bXMuYworICoKKyAqIEV4cG9ydCBYdGVuc2Etc3BlY2lmaWMgZnVuY3Rpb25zIGZvciBsb2FkYWJsZSBtb2R1bGVzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgIFRlbnNpbGljYSBJbmMuCisgKgorICogSm9lIFRheWxvciA8am9lQHRlbnNpbGljYS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9GRAorI2luY2x1ZGUgPGFzbS9mbG9wcHkuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVQKKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNlbmRpZiAvKiBDT05GSUdfTkVUICovCisKKworLyoKKyAqIFN0cmluZyBmdW5jdGlvbnMKKyAqLworRVhQT1JUX1NZTUJPTChtZW1jbXApOworRVhQT1JUX1NZTUJPTChtZW1zZXQpOworRVhQT1JUX1NZTUJPTChtZW1jcHkpOworRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKK0VYUE9SVF9TWU1CT0wobWVtY2hyKTsKK0VYUE9SVF9TWU1CT0woc3RyY2F0KTsKK0VYUE9SVF9TWU1CT0woc3RyY2hyKTsKK0VYUE9SVF9TWU1CT0woc3RybGVuKTsKK0VYUE9SVF9TWU1CT0woc3RycGJyayk7CitFWFBPUlRfU1lNQk9MKHN0cm5jYXQpOworRVhQT1JUX1NZTUJPTChzdHJubGVuKTsKK0VYUE9SVF9TWU1CT0woc3RycmNocik7CitFWFBPUlRfU1lNQk9MKHN0cnN0cik7CisKK0VYUE9SVF9TWU1CT0woZW5hYmxlX2lycSk7CitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKK0VYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CisKKy8qCisgKiBnY2MgaW50ZXJuYWwgbWF0aCBmdW5jdGlvbnMKKyAqLworZXh0ZXJuIGxvbmcgbG9uZyBfX2FzaHJkaTMobG9uZyBsb25nLCBpbnQpOworZXh0ZXJuIGxvbmcgbG9uZyBfX2FzaGxkaTMobG9uZyBsb25nLCBpbnQpOworZXh0ZXJuIGxvbmcgbG9uZyBfX2xzaHJkaTMobG9uZyBsb25nLCBpbnQpOworZXh0ZXJuIGludCBfX2RpdnNpMyhpbnQsIGludCk7CitleHRlcm4gaW50IF9fbW9kc2kzKGludCwgaW50KTsKK2V4dGVybiBsb25nIGxvbmcgX19tdWxkaTMobG9uZyBsb25nLCBsb25nIGxvbmcpOworZXh0ZXJuIGludCBfX211bHNpMyhpbnQsIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50IF9fdWRpdnNpMyh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50IF9fdW1vZHNpMyh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIF9fdW1vZGRpMyh1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIF9fdWRpdmRpMyh1bnNpZ25lZCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcgbG9uZyk7CisKK0VYUE9SVF9TWU1CT0woX19hc2hsZGkzKTsKK0VYUE9SVF9TWU1CT0woX19hc2hyZGkzKTsKK0VYUE9SVF9TWU1CT0woX19sc2hyZGkzKTsKK0VYUE9SVF9TWU1CT0woX19kaXZzaTMpOworRVhQT1JUX1NZTUJPTChfX21vZHNpMyk7CitFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKK0VYUE9SVF9TWU1CT0woX19tdWxzaTMpOworRVhQT1JUX1NZTUJPTChfX3VkaXZzaTMpOworRVhQT1JUX1NZTUJPTChfX3Vtb2RzaTMpOworRVhQT1JUX1NZTUJPTChfX3VkaXZkaTMpOworRVhQT1JUX1NZTUJPTChfX3Vtb2RkaTMpOworCisvKgorICogU2VtYXBob3JlIG9wZXJhdGlvbnMKKyAqLworRVhQT1JUX1NZTUJPTChfX2Rvd24pOworRVhQT1JUX1NZTUJPTChfX2Rvd25faW50ZXJydXB0aWJsZSk7CitFWFBPUlRfU1lNQk9MKF9fZG93bl90cnlsb2NrKTsKK0VYUE9SVF9TWU1CT0woX191cCk7CisKKyNpZmRlZiBDT05GSUdfTkVUCisvKgorICogTmV0d29ya2luZyBzdXBwb3J0CisgKi8KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyk7CisjZW5kaWYgLyogQ09ORklHX05FVCAqLworCisvKgorICogQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHN5bWJvbHMKKyAqLworRVhQT1JUX1NZTUJPTChfX3h0ZW5zYV9jb3B5X3VzZXIpOworCisvKgorICogS2VybmVsIGhhY2tpbmcgLi4uCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZHQV9DT05TT0xFKSB8fCBkZWZpbmVkKENPTkZJR19EVU1NWV9DT05TT0xFKQorLy8gRklYTUUgRVhQT1JUX1NZTUJPTChzY3JlZW5faW5mbyk7CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChnZXRfd2NoYW4pOworCitFWFBPUlRfU1lNQk9MKG91dHNiKTsKK0VYUE9SVF9TWU1CT0wob3V0c3cpOworRVhQT1JUX1NZTUJPTChvdXRzbCk7CitFWFBPUlRfU1lNQk9MKGluc2IpOworRVhQT1JUX1NZTUJPTChpbnN3KTsKK0VYUE9SVF9TWU1CT0woaW5zbCk7CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvTWFrZWZpbGUgYi9hcmNoL3h0ZW5zYS9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MzViNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2xpYi9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFh0ZW5zYS1zcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLgorIworCitsaWIteQkrPSBtZW1jb3B5Lm8gbWVtc2V0Lm8gY2hlY2tzdW0ubyBzdHJjYXNlY21wLm8gXAorCSAgIHVzZXJjb3B5Lm8gc3RybmNweV91c2VyLm8gc3Rybmxlbl91c2VyLm8KK2xpYi0kKENPTkZJR19QQ0kpICs9IHBjaS1hdXRvLm8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TIGIvYXJjaC94dGVuc2EvbGliL2NoZWNrc3VtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJkNjRkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2xpYi9jaGVja3N1bS5TCkBAIC0wLDAgKzEsNDEwIEBACisvKgorICogSU5FVAkJQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRDUC9JUCBwcm90b2NvbCBzdWl0ZSBmb3IgdGhlIExJTlVYCisgKgkJb3BlcmF0aW5nIHN5c3RlbS4gIElORVQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlICBCU0QgU29ja2V0CisgKgkJaW50ZXJmYWNlIGFzIHRoZSBtZWFucyBvZiBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVzZXIgbGV2ZWwuCisgKgorICoJCUlQL1RDUC9VRFAgY2hlY2tzdW1taW5nIHJvdXRpbmVzCisgKgorICogWHRlbnNhIHZlcnNpb246ICBDb3B5cmlnaHQgKEMpIDIwMDEgVGVuc2lsaWNhLCBJbmMuIGJ5IEtldmluIENoZWEKKyAqICAgICAgICAgICAgICAgICAgT3B0aW1pemVkIGJ5IEpvZSBUYXlsb3IKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2RlZmluZSBfQVNNTEFOR1VBR0UKKyNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KKworLyoKKyAqIGNvbXB1dGVzIGEgcGFydGlhbCBjaGVja3N1bSwgZS5nLiBmb3IgVENQL1VEUCBmcmFnbWVudHMKKyAqLworCisvKgorICogdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdW0pOworICogICAgYTIgPSBidWYKKyAqICAgIGEzID0gbGVuCisgKiAgICBhNCA9IHN1bQorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyAyLSBvciA0LWJ5dGUgYWxpZ25tZW50LiAgT3RoZXIgYWxpZ25tZW50cyB3aWxsIGZhaWwhCisgKi8KKworLyogT05FU19BREQgY29udmVydHMgdHdvcy1jb21wbGVtZW50IG1hdGggdG8gb25lcy1jb21wbGVtZW50LiAqLworI2RlZmluZSBPTkVTX0FERChzdW0sIHZhbCkJICBcCisJYWRkCXN1bSwgc3VtLCB2YWwJOyBcCisJYmdldQlzdW0sIHZhbCwgOTlmCTsgXAorCWFkZGkJc3VtLCBzdW0sIDEJOyBcCis5OToJCQkJOworCisudGV4dAorRU5UUlkoY3N1bV9wYXJ0aWFsKQorCSAgLyoKKwkgICAqIEV4cGVyaW1lbnRzIHdpdGggRXRoZXJuZXQgYW5kIFNMSVAgY29ubmVjdGlvbnMgc2hvdyB0aGF0IGJ1ZgorCSAgICogaXMgYWxpZ25lZCBvbiBlaXRoZXIgYSAyLWJ5dGUgb3IgNC1ieXRlIGJvdW5kYXJ5LgorCSAgICovCisJZW50cnkJc3AsIDMyCisJZXh0dWkJYTUsIGEyLCAwLCAyCisJYm5leglhNSwgOGYJCS8qIGJyYW5jaCBpZiAyLWJ5dGUgYWxpZ25lZCAqLworCS8qIEZhbGwtdGhyb3VnaCBvbiBjb21tb24gY2FzZSwgNC1ieXRlIGFsaWdubWVudCAqLworMToKKwlzcmxpCWE1LCBhMywgNQkvKiAzMi1ieXRlIGNodW5rcyAqLworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wZ3R6CWE1LCAyZgorI2Vsc2UKKwliZXF6CWE1LCAyZgorCXNsbGkJYTUsIGE1LCA1CisJYWRkCWE1LCBhNSwgYTIJLyogYTUgPSBlbmQgb2YgbGFzdCAzMi1ieXRlIGNodW5rICovCisuTG9vcDE6CisjZW5kaWYKKwlsMzJpCWE2LCBhMiwgMAorCWwzMmkJYTcsIGEyLCA0CisJT05FU19BREQoYTQsIGE2KQorCU9ORVNfQUREKGE0LCBhNykKKwlsMzJpCWE2LCBhMiwgOAorCWwzMmkJYTcsIGEyLCAxMgorCU9ORVNfQUREKGE0LCBhNikKKwlPTkVTX0FERChhNCwgYTcpCisJbDMyaQlhNiwgYTIsIDE2CisJbDMyaQlhNywgYTIsIDIwCisJT05FU19BREQoYTQsIGE2KQorCU9ORVNfQUREKGE0LCBhNykKKwlsMzJpCWE2LCBhMiwgMjQKKwlsMzJpCWE3LCBhMiwgMjgKKwlPTkVTX0FERChhNCwgYTYpCisJT05FU19BREQoYTQsIGE3KQorCWFkZGkJYTIsIGEyLCA0KjgKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCWJsdAlhMiwgYTUsIC5Mb29wMQorI2VuZGlmCisyOgorCWV4dHVpCWE1LCBhMywgMiwgMwkvKiByZW1haW5pbmcgNC1ieXRlIGNodW5rcyAqLworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wZ3R6CWE1LCAzZgorI2Vsc2UKKwliZXF6CWE1LCAzZgorCXNsbGkJYTUsIGE1LCAyCisJYWRkCWE1LCBhNSwgYTIJLyogYTUgPSBlbmQgb2YgbGFzdCA0LWJ5dGUgY2h1bmsgKi8KKy5Mb29wMjoKKyNlbmRpZgorCWwzMmkJYTYsIGEyLCAwCisJT05FU19BREQoYTQsIGE2KQorCWFkZGkJYTIsIGEyLCA0CisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTIsIGE1LCAuTG9vcDIKKyNlbmRpZgorMzoKKwlfYmJjaS5sCWEzLCAxLCA1ZgkvKiByZW1haW5pbmcgMi1ieXRlIGNodW5rICovCisJbDE2dWkJYTYsIGEyLCAwCisJT05FU19BREQoYTQsIGE2KQorCWFkZGkJYTIsIGEyLCAyCis1OgorCV9iYmNpLmwJYTMsIDAsIDdmCS8qIHJlbWFpbmluZyAxLWJ5dGUgY2h1bmsgKi8KKzY6CWw4dWkJYTYsIGEyLCAwCisjaWZkZWYgX19YVEVOU0FfRUJfXworCXNsbGkJYTYsIGE2LCA4CS8qIGxvYWQgYnl0ZSBpbnRvIGJpdHMgOC4uMTUgKi8KKyNlbmRpZgorCU9ORVNfQUREKGE0LCBhNikKKzc6CisJbW92CWEyLCBhNAorCXJldHcKKworCS8qIHVuY29tbW9uIGNhc2UsIGJ1ZiBpcyAyLWJ5dGUgYWxpZ25lZCAqLworODoKKwliZXF6CWEzLCA3YgkJLyogYnJhbmNoIGlmIGxlbiA9PSAwICovCisJYmVxaQlhMywgMSwgNmIJLyogYnJhbmNoIGlmIGxlbiA9PSAxICovCisKKwlleHR1aQlhNSwgYTIsIDAsIDEKKwlibmV6CWE1LCA4ZgkJLyogYnJhbmNoIGlmIDEtYnl0ZSBhbGlnbmVkICovCisKKwlsMTZ1aQlhNiwgYTIsIDAJLyogY29tbW9uIGNhc2UsIGxlbiA+PSAyICovCisJT05FU19BREQoYTQsIGE2KQorCWFkZGkJYTIsIGEyLCAyCS8qIGFkanVzdCBidWYgKi8KKwlhZGRpCWEzLCBhMywgLTIJLyogYWRqdXN0IGxlbiAqLworCWoJMWIJCS8qIG5vdyBidWYgaXMgNC1ieXRlIGFsaWduZWQgKi8KKworCS8qIGNhc2U6IG9kZC1ieXRlIGFsaWduZWQsIGxlbiA+IDEKKwkgKiBUaGlzIGNhc2UgaXMgZG9nIHNsb3csIHNvIGRvbid0IGdpdmUgdXMgYW4gb2RkIGFkZHJlc3MuCisJICogKEkgZG9uJ3QgdGhpbmsgdGhpcyBldmVyIGhhcHBlbnMsIGJ1dCBqdXN0IGluIGNhc2UuKQorCSAqLworODoKKwlzcmxpCWE1LCBhMywgMgkvKiA0LWJ5dGUgY2h1bmtzICovCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BndHoJYTUsIDJmCisjZWxzZQorCWJlcXoJYTUsIDJmCisJc2xsaQlhNSwgYTUsIDIKKwlhZGQJYTUsIGE1LCBhMgkvKiBhNSA9IGVuZCBvZiBsYXN0IDQtYnl0ZSBjaHVuayAqLworLkxvb3AzOgorI2VuZGlmCisJbDh1aQlhNiwgYTIsIDAJLyogYml0cyAyNC4uMzEgKi8KKwlsMTZ1aQlhNywgYTIsIDEJLyogYml0cyAgOC4uMjMgKi8KKwlsOHVpCWE4LCBhMiwgMwkvKiBiaXRzICAwLi4gOCAqLworI2lmZGVmCV9fWFRFTlNBX0VCX18KKwlzbGxpCWE2LCBhNiwgMjQKKyNlbHNlCisJc2xsaQlhOCwgYTgsIDI0CisjZW5kaWYKKwlzbGxpCWE3LCBhNywgOAorCW9yCWE3LCBhNywgYTYKKwlvcglhNywgYTcsIGE4CisJT05FU19BREQoYTQsIGE3KQorCWFkZGkJYTIsIGEyLCA0CisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTIsIGE1LCAuTG9vcDMKKyNlbmRpZgorMjoKKwlfYmJjaS5sCWEzLCAxLCAzZgkvKiByZW1haW5pbmcgMi1ieXRlIGNodW5rLCBzdGlsbCBvZGQgYWRkciAqLworCWw4dWkJYTYsIGEyLCAwCisJbDh1aQlhNywgYTIsIDEKKyNpZmRlZglfX1hURU5TQV9FQl9fCisJc2xsaQlhNiwgYTYsIDgKKyNlbHNlCisJc2xsaQlhNywgYTcsIDgKKyNlbmRpZgorCW9yCWE3LCBhNywgYTYKKwlPTkVTX0FERChhNCwgYTcpCisJYWRkaQlhMiwgYTIsIDIKKzM6CisJagk1YgkJLyogYnJhbmNoIHRvIGhhbmRsZSB0aGUgcmVtYWluaW5nIGJ5dGUgKi8KKworCisKKy8qCisgKiBDb3B5IGZyb20gZHMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKKyAqCisgKiBUaGUgbWFjcm9zIFNSQyBhbmQgRFNUIHNwZWNpZnkgdGhlIHR5cGUgb2YgYWNjZXNzIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCisgKiB0aHVzIHdlIGNhbiBjYWxsIGEgY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBlYWNoIGFjY2VzcyB0eXBlLgorICovCisKKyNkZWZpbmUgU1JDKHkuLi4pCQkJXAorCTk5OTk6IHk7CQkJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIjsJXAorCS5sb25nIDk5OTliLCA2MDAxZgk7CVwKKwkucHJldmlvdXMKKworI2RlZmluZSBEU1QoeS4uLikJCQlcCisJOTk5OTogeTsJCQlcCisJLnNlY3Rpb24gX19leF90YWJsZSwgImEiOwlcCisJLmxvbmcgOTk5OWIsIDYwMDJmCTsJXAorCS5wcmV2aW91cworCisvKgordW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLAorCQkJCQlpbnQgc3VtLCBpbnQgKnNyY19lcnJfcHRyLCBpbnQgKmRzdF9lcnJfcHRyKQorCWEyICA9IHNyYworCWEzICA9IGRzdAorCWE0ICA9IGxlbgorCWE1ICA9IHN1bQorCWE2ICA9IHNyY19lcnJfcHRyCisJYTcgID0gZHN0X2Vycl9wdHIKKwlhOCAgPSB0ZW1wCisJYTkgID0gdGVtcAorCWExMCA9IHRlbXAKKwlhMTEgPSBvcmlnaW5hbCBsZW4gZm9yIGV4Y2VwdGlvbiBoYW5kbGluZworCWExMiA9IG9yaWdpbmFsIGRzdCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nCisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIG9wdGltaXplZCBmb3IgNC1ieXRlIGFsaWduZWQgYWRkcmVzc2VzLiAgT3RoZXIKKyAgICBhbGlnbm1lbnRzIHdvcmssIGJ1dCBub3QgbmVhcmx5IGFzIGVmZmljaWVudGx5LgorICovCisKK0VOVFJZKGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMpCisJZW50cnkJc3AsIDMyCisJbW92CWExMiwgYTMKKwltb3YJYTExLCBhNAorCW9yCWExMCwgYTIsIGEzCisKKwkvKiBXZSBvcHRpbWl6ZSB0aGUgZm9sbG93aW5nIGFsaWdubWVudCB0ZXN0cyBmb3IgdGhlIDQtYnl0ZQorCWFsaWduZWQgY2FzZS4gIFR3byBiYnNpLmwgaW5zdHJ1Y3Rpb25zIG1pZ2h0IHNlZW0gbW9yZSBvcHRpbWFsCisJKGNvbW1lbnRlZCBvdXQgYmVsb3cpLiAgSG93ZXZlciwgYm90aCBsYWJlbHMgNTogYW5kIDM6IGFyZSBvdXQKKwlvZiB0aGUgaW1tOCByYW5nZSwgc28gdGhlIGFzc2VtYmxlciByZWxheGVzIHRoZW0gaW50bworCWVxdWl2YWxlbnQgYmJjaS5sLCBqIGNvbWJpbmF0aW9ucywgd2hpY2ggaXMgYWN0dWFsbHkKKwlzbG93ZXIuICovCisKKwlleHR1aQlhOSwgYTEwLCAwLCAyCisJYmVxeglhOSwgMWYJCS8qIGJyYW5jaCBpZiBib3RoIGFyZSA0LWJ5dGUgYWxpZ25lZCAqLworCWJic2kubAlhMTAsIDAsIDVmCS8qIGJyYW5jaCBpZiBvbmUgYWRkcmVzcyBpcyBvZGQgKi8KKwlqCTNmCQkvKiBvbmUgYWRkcmVzcyBpcyAyLWJ5dGUgYWxpZ25lZCAqLworCisvKglfYmJzaS5sCWExMCwgMCwgNWYgKi8JLyogYnJhbmNoIGlmIG9kZCBhZGRyZXNzICovCisvKglfYmJzaS5sCWExMCwgMSwgM2YgKi8JLyogYnJhbmNoIGlmIDItYnl0ZS1hbGlnbmVkIGFkZHJlc3MgKi8KKworMToKKwkvKiBzcmMgYW5kIGRzdCBhcmUgYm90aCA0LWJ5dGUgYWxpZ25lZCAqLworCXNybGkJYTEwLCBhNCwgNQkvKiAzMi1ieXRlIGNodW5rcyAqLworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wZ3R6CWExMCwgMmYKKyNlbHNlCisJYmVxeglhMTAsIDJmCisJc2xsaQlhMTAsIGExMCwgNQorCWFkZAlhMTAsIGExMCwgYTIJLyogYTEwID0gZW5kIG9mIGxhc3QgMzItYnl0ZSBzcmMgY2h1bmsgKi8KKy5Mb29wNToKKyNlbmRpZgorU1JDKAlsMzJpCWE5LCBhMiwgMAkpCitTUkMoCWwzMmkJYTgsIGEyLCA0CSkKK0RTVCgJczMyaQlhOSwgYTMsIDAJKQorRFNUKAlzMzJpCWE4LCBhMywgNAkpCisJT05FU19BREQoYTUsIGE5KQorCU9ORVNfQUREKGE1LCBhOCkKK1NSQygJbDMyaQlhOSwgYTIsIDgJKQorU1JDKAlsMzJpCWE4LCBhMiwgMTIJKQorRFNUKAlzMzJpCWE5LCBhMywgOAkpCitEU1QoCXMzMmkJYTgsIGEzLCAxMgkpCisJT05FU19BREQoYTUsIGE5KQorCU9ORVNfQUREKGE1LCBhOCkKK1NSQygJbDMyaQlhOSwgYTIsIDE2CSkKK1NSQygJbDMyaQlhOCwgYTIsIDIwCSkKK0RTVCgJczMyaQlhOSwgYTMsIDE2CSkKK0RTVCgJczMyaQlhOCwgYTMsIDIwCSkKKwlPTkVTX0FERChhNSwgYTkpCisJT05FU19BREQoYTUsIGE4KQorU1JDKAlsMzJpCWE5LCBhMiwgMjQJKQorU1JDKAlsMzJpCWE4LCBhMiwgMjgJKQorRFNUKAlzMzJpCWE5LCBhMywgMjQJKQorRFNUKAlzMzJpCWE4LCBhMywgMjgJKQorCU9ORVNfQUREKGE1LCBhOSkKKwlPTkVTX0FERChhNSwgYTgpCisJYWRkaQlhMiwgYTIsIDMyCisJYWRkaQlhMywgYTMsIDMyCisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTIsIGExMCwgLkxvb3A1CisjZW5kaWYKKzI6CisJZXh0dWkJYTEwLCBhNCwgMiwgMwkvKiByZW1haW5pbmcgNC1ieXRlIGNodW5rcyAqLworCWV4dHVpCWE0LCBhNCwgMCwgMgkvKiByZXNldCBsZW4gZm9yIGdlbmVyYWwtY2FzZSwgMi1ieXRlIGNodW5rcyAqLworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wZ3R6CWExMCwgM2YKKyNlbHNlCisJYmVxeglhMTAsIDNmCisJc2xsaQlhMTAsIGExMCwgMgorCWFkZAlhMTAsIGExMCwgYTIJLyogYTEwID0gZW5kIG9mIGxhc3QgNC1ieXRlIHNyYyBjaHVuayAqLworLkxvb3A2OgorI2VuZGlmCitTUkMoCWwzMmkJYTksIGEyLCAwCSkKK0RTVCgJczMyaQlhOSwgYTMsIDAJKQorCU9ORVNfQUREKGE1LCBhOSkKKwlhZGRpCWEyLCBhMiwgNAorCWFkZGkJYTMsIGEzLCA0CisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTIsIGExMCwgLkxvb3A2CisjZW5kaWYKKzM6CisJLyoKKwlDb250cm9sIGNvbWVzIHRvIGhlcmUgaW4gdHdvIGNhc2VzOiAoMSkgSXQgbWF5IGZhbGwgdGhyb3VnaAorCXRvIGhlcmUgZnJvbSB0aGUgNC1ieXRlIGFsaWdubWVudCBjYXNlIHRvIHByb2Nlc3MsIGF0IG1vc3QsCisJb25lIDItYnl0ZSBjaHVuay4gICgyKSBJdCBicmFuY2hlcyB0byBoZXJlIGZyb20gYWJvdmUgaWYKKwllaXRoZXIgc3JjIG9yIGRzdCBpcyAyLWJ5dGUgYWxpZ25lZCwgYW5kIHdlIHByb2Nlc3MgYWxsIGJ5dGVzCisJaGVyZSwgZXhjZXB0IGZvciBwZXJoYXBzIGEgdHJhaWxpbmcgb2RkIGJ5dGUuICBJdCdzCisJaW5lZmZpY2llbnQsIHNvIGFsaWduIHlvdXIgYWRkcmVzc2VzIHRvIDQtYnl0ZSBib3VuZGFyaWVzLgorCisJYTIgPSBzcmMKKwlhMyA9IGRzdAorCWE0ID0gbGVuCisJYTUgPSBzdW0KKwkqLworCXNybGkJYTEwLCBhNCwgMQkvKiAyLWJ5dGUgY2h1bmtzICovCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BndHoJYTEwLCA0ZgorI2Vsc2UKKwliZXF6CWExMCwgNGYKKwlzbGxpCWExMCwgYTEwLCAxCisJYWRkCWExMCwgYTEwLCBhMgkvKiBhMTAgPSBlbmQgb2YgbGFzdCAyLWJ5dGUgc3JjIGNodW5rICovCisuTG9vcDc6CisjZW5kaWYKK1NSQygJbDE2dWkJYTksIGEyLCAwCSkKK0RTVCgJczE2aQlhOSwgYTMsIDAJKQorCU9ORVNfQUREKGE1LCBhOSkKKwlhZGRpCWEyLCBhMiwgMgorCWFkZGkJYTMsIGEzLCAyCisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTIsIGExMCwgLkxvb3A3CisjZW5kaWYKKzQ6CisJLyogVGhpcyBzZWN0aW9uIHByb2Nlc3NlcyBhIHBvc3NpYmxlIHRyYWlsaW5nIG9kZCBieXRlLiAqLworCV9iYmNpLmwJYTQsIDAsIDhmCS8qIDEtYnl0ZSBjaHVuayAqLworU1JDKAlsOHVpCWE5LCBhMiwgMAkpCitEU1QoCXM4aQlhOSwgYTMsIDAJKQorI2lmZGVmIF9fWFRFTlNBX0VCX18KKwlzbGxpCWE5LCBhOSwgOAkvKiBzaGlmdCBieXRlIHRvIGJpdHMgOC4uMTUgKi8KKyNlbmRpZgorCU9ORVNfQUREKGE1LCBhOSkKKzg6CisJbW92CWEyLCBhNQorCXJldHcKKworNToKKwkvKiBDb250cm9sIGJyYW5jaCB0byBoZXJlIHdoZW4gZWl0aGVyIHNyYyBvciBkc3QgaXMgb2RkLiAgV2UKKwlwcm9jZXNzIGFsbCBieXRlcyB1c2luZyA4LWJpdCBhY2Nlc3Nlcy4gIEdyb3NzbHkgaW5lZmZpY2llbnQsCisJc28gZG9uJ3QgZmVlZCB1cyBhbiBvZGQgYWRkcmVzcy4gKi8KKworCXNybGkJYTEwLCBhNCwgMQkvKiBoYW5kbGUgaW4gcGFpcnMgZm9yIDE2LWJpdCBjc3VtICovCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BndHoJYTEwLCA2ZgorI2Vsc2UKKwliZXF6CWExMCwgNmYKKwlzbGxpCWExMCwgYTEwLCAxCisJYWRkCWExMCwgYTEwLCBhMgkvKiBhMTAgPSBlbmQgb2YgbGFzdCBvZGQtYWxpZ25lZCwgMi1ieXRlIHNyYyBjaHVuayAqLworLkxvb3A4OgorI2VuZGlmCitTUkMoCWw4dWkJYTksIGEyLCAwCSkKK1NSQygJbDh1aQlhOCwgYTIsIDEJKQorRFNUKAlzOGkJYTksIGEzLCAwCSkKK0RTVCgJczhpCWE4LCBhMywgMQkpCisjaWZkZWYgX19YVEVOU0FfRUJfXworCXNsbGkJYTksIGE5LCA4CS8qIGNvbWJpbmUgaW50byBhIHNpbmdsZSAxNi1iaXQgdmFsdWUgKi8KKyNlbHNlCQkJCS8qIGZvciBjaGVja3N1bSBjb21wdXRhdGlvbiAqLworCXNsbGkJYTgsIGE4LCA4CisjZW5kaWYKKwlvcglhOSwgYTksIGE4CisJT05FU19BREQoYTUsIGE5KQorCWFkZGkJYTIsIGEyLCAyCisJYWRkaQlhMywgYTMsIDIKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCWJsdAlhMiwgYTEwLCAuTG9vcDgKKyNlbmRpZgorNjoKKwlqCTRiCQkvKiBwcm9jZXNzIHRoZSBwb3NzaWJsZSB0cmFpbGluZyBvZGQgYnl0ZSAqLworCisKKyMgRXhjZXB0aW9uIGhhbmRsZXI6Cisuc2VjdGlvbiAuZml4dXAsICJheCIKKy8qCisJYTYgID0gc3JjX2Vycl9wdHIKKwlhNyAgPSBkc3RfZXJyX3B0cgorCWExMSA9IG9yaWdpbmFsIGxlbiBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nCisJYTEyID0gb3JpZ2luYWwgZHN0IGZvciBleGNlcHRpb24gaGFuZGxpbmcKKyovCisKKzYwMDE6CisJX21vdmkJYTIsIC1FRkFVTFQKKwlzMzJpCWEyLCBhNiwgMAkvKiBzcmNfZXJyX3B0ciAqLworCisJIyBjbGVhciB0aGUgY29tcGxldGUgZGVzdGluYXRpb24gLSBjb21wdXRpbmcgdGhlIHJlc3QKKwkjIGlzIHRvbyBtdWNoIHdvcmsKKwltb3ZpCWEyLCAwCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BndHoJYTExLCAyZgorI2Vsc2UKKwliZXF6CWExMSwgMmYKKwlhZGQJYTExLCBhMTEsIGExMgkvKiBhMTEgPSBlbmRpbmcgYWRkcmVzcyAqLworLkxlbG9vcDoKKyNlbmRpZgorCXM4aQlhMiwgYTEyLCAwCisJYWRkaQlhMTIsIGExMiwgMQorI2lmICFYQ0hBTF9IQVZFX0xPT1BTCisJYmx0CWExMiwgYTExLCAuTGVsb29wCisjZW5kaWYKKzI6CisJcmV0dworCis2MDAyOgorCW1vdmkJYTIsIC1FRkFVTFQKKwlzMzJpCWEyLCBhNywgMAkvKiBkc3RfZXJyX3B0ciAqLworCW1vdmkJYTIsIDAKKwlyZXR3CisKKy5wcmV2aW91cworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvbWVtY29weS5TIGIvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY2ZDdlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbGliL21lbWNvcHkuUwpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2xpYi9oYWwvbWVtY29weS5TIC0tIENvcmUgSEFMIGxpYnJhcnkgZnVuY3Rpb25zCisgKiB4dGhhbF9tZW1jcHkgYW5kIHh0aGFsX2Jjb3B5CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpbmNsdWRlIDx4dGVuc2EvY29yZWFzbS5oPgorCisJLm1hY3JvCXNyY19iCXIsIHcwLCB3MQorI2lmZGVmIF9fWFRFTlNBX0VCX18KKwlzcmMJXHIsIFx3MCwgXHcxCisjZWxzZQorCXNyYwlcciwgXHcxLCBcdzAKKyNlbmRpZgorCS5lbmRtCisKKwkubWFjcm8Jc3NhOAlyCisjaWZkZWYgX19YVEVOU0FfRUJfXworCXNzYThiCVxyCisjZWxzZQorCXNzYThsCVxyCisjZW5kaWYKKwkuZW5kbQorCisKKy8qCisgKiB2b2lkICptZW1jcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBsZW4pOworICogdm9pZCAqbWVtbW92ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbik7CisgKiB2b2lkICpiY29weShjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgc2l6ZV90IGxlbik7CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBkbyB0aGUgc2FtZSB0aGluZyBhcyB0aGUgc3RhbmRhcmQKKyAqIGxpYnJhcnkgZnVuY3Rpb24gbWVtY3B5KCkgKG9yIGJjb3B5KCkpIGZvciBtb3N0IGNhc2VzLgorICogSG93ZXZlciwgd2hlcmUgdGhlIHNvdXJjZSBhbmQvb3IgZGVzdGluYXRpb24gcmVmZXJlbmNlcworICogYW4gaW5zdHJ1Y3Rpb24gUkFNIG9yIFJPTSBvciBhIGRhdGEgUkFNIG9yIFJPTSwgdGhhdAorICogc291cmNlIGFuZC9vciBkZXN0aW5hdGlvbiB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NlZCB3aXRoCisgKiAzMi1iaXQgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIChhcyByZXF1aXJlZCBmb3IgdGhlc2UKKyAqIHR5cGVzIG9mIGRldmljZXMpLgorICoKKyAqICEhISEhISEgIFhURklYTUU6CisgKiAhISEhISEhICBIYW5kbGluZyBvZiBJUkFNL0lST00gaGFzIG5vdCB5ZXQKKyAqICEhISEhISEgIGJlZW4gaW1wbGVtZW50ZWQuCisgKgorICogVGhlIGJjb3B5IHZlcnNpb24gaXMgcHJvdmlkZWQgaGVyZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQKKyAqIG9mIGFuIGV4dHJhIGNhbGwsIGZvciBjYWxsZXJzIHRoYXQgcmVxdWlyZSB0aGlzIGNvbnZlbnRpb24uCisgKgorICogVGhlIChnZW5lcmFsIGNhc2UpIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOgorICogICBJZiBkZXN0aW5hdGlvbiBpcyB1bmFsaWduZWQsIGFsaWduIGl0IGJ5IGNvbmRpdGlvbmFsbHkKKyAqICAgICBjb3B5aW5nIDEgYW5kIDIgYnl0ZXMuCisgKiAgIElmIHNvdXJjZSBpcyBhbGlnbmVkLAorICogICAgIGRvIDE2IGJ5dGVzIHdpdGggYSBsb29wLCBhbmQgdGhlbiBmaW5pc2ggdXAgd2l0aAorICogICAgIDgsIDQsIDIsIGFuZCAxIGJ5dGUgY29waWVzIGNvbmRpdGlvbmFsIG9uIHRoZSBsZW5ndGg7CisgKiAgIGVsc2UgKGlmIHNvdXJjZSBpcyB1bmFsaWduZWQpLAorICogICAgIGRvIHRoZSBzYW1lLCBidXQgdXNlIFNSQyB0byBhbGlnbiB0aGUgc291cmNlIGRhdGEuCisgKiAgIFRoaXMgY29kZSB0cmllcyB0byB1c2UgZmFsbC10aHJvdWdoIGJyYW5jaGVzIGZvciB0aGUgY29tbW9uCisgKiAgICAgY2FzZSBvZiBhbGlnbmVkIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYW5kIG11bHRpcGxlCisgKiAgICAgb2YgNCAob3IgOCkgbGVuZ3RoLgorICoKKyAqIFJlZ2lzdGVyIHVzZToKKyAqCWEwLyByZXR1cm4gYWRkcmVzcworICoJYTEvIHN0YWNrIHBvaW50ZXIKKyAqCWEyLyByZXR1cm4gdmFsdWUKKyAqCWEzLyBzcmMKKyAqCWE0LyBsZW5ndGgKKyAqCWE1LyBkc3QKKyAqCWE2LyB0bXAKKyAqCWE3LyB0bXAKKyAqCWE4LyB0bXAKKyAqCWE5LyB0bXAKKyAqCWExMC8gdG1wCisgKglhMTEvIHRtcAorICovCisKKwkudGV4dAorCS5hbGlnbgk0CisJLmdsb2JhbAliY29weQorCS50eXBlICAgYmNvcHksQGZ1bmN0aW9uCitiY29weToKKwllbnRyeQlzcCwgMTYJCSMgbWluaW1hbCBzdGFjayBmcmFtZQorCSMgYTI9c3JjLCBhMz1kc3QsIGE0PWxlbgorCW1vdglhNSwgYTMJCSMgY29weSBkc3Qgc28gdGhhdCBhMiBpcyByZXR1cm4gdmFsdWUKKwltb3YJYTMsIGEyCisJbW92CWEyLCBhNQorCWoJLkxjb21tb24JIyBnbyB0byBjb21tb24gY29kZSBmb3IgbWVtY3B5K2Jjb3B5CisKKworLyoKKyAqIEJ5dGUgYnkgYnl0ZSBjb3B5CisgKi8KKwkuYWxpZ24JNAorCS5ieXRlCTAJCSMgMSBtb2QgNCBhbGlnbm1lbnQgZm9yIExPT1BORVoKKwkJCQkjICgwIG1vZCA0IGFsaWdubWVudCBmb3IgTEJFRykKKy5MYnl0ZWNvcHk6CisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BuZXoJYTQsIC5MYnl0ZWNvcHlkb25lCisjZWxzZSAvKiAhWENIQUxfSEFWRV9MT09QUyAqLworCWJlcXoJYTQsIC5MYnl0ZWNvcHlkb25lCisJYWRkCWE3LCBhMywgYTQJIyBhNyA9IGVuZCBhZGRyZXNzIGZvciBzb3VyY2UKKyNlbmRpZiAvKiAhWENIQUxfSEFWRV9MT09QUyAqLworLkxuZXh0Ynl0ZToKKwlsOHVpCWE2LCBhMywgMAorCWFkZGkJYTMsIGEzLCAxCisJczhpCWE2LCBhNSwgMAorCWFkZGkJYTUsIGE1LCAxCisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTMsIGE3LCAuTG5leHRieXRlCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5MYnl0ZWNvcHlkb25lOgorCXJldHcKKworLyoKKyAqIERlc3RpbmF0aW9uIGlzIHVuYWxpZ25lZAorICovCisKKwkuYWxpZ24JNAorLkxkc3QxbW9kMjoJIyBkc3QgaXMgb25seSBieXRlIGFsaWduZWQKKwlfYmx0dWkJYTQsIDcsIC5MYnl0ZWNvcHkJIyBkbyBzaG9ydCBjb3BpZXMgYnl0ZSBieSBieXRlCisKKwkjIGNvcHkgMSBieXRlCisJbDh1aQlhNiwgYTMsICAwCisJYWRkaQlhMywgYTMsICAxCisJYWRkaQlhNCwgYTQsIC0xCisJczhpCWE2LCBhNSwgIDAKKwlhZGRpCWE1LCBhNSwgIDEKKwlfYmJjaS5sCWE1LCAxLCAuTGRzdGFsaWduZWQJIyBpZiBkc3QgaXMgbm93IGFsaWduZWQsIHRoZW4KKwkJCQkJIyByZXR1cm4gdG8gbWFpbiBhbGdvcml0aG0KKy5MZHN0Mm1vZDQ6CSMgZHN0IDE2LWJpdCBhbGlnbmVkCisJIyBjb3B5IDIgYnl0ZXMKKwlfYmx0dWkJYTQsIDYsIC5MYnl0ZWNvcHkJIyBkbyBzaG9ydCBjb3BpZXMgYnl0ZSBieSBieXRlCisJbDh1aQlhNiwgYTMsICAwCisJbDh1aQlhNywgYTMsICAxCisJYWRkaQlhMywgYTMsICAyCisJYWRkaQlhNCwgYTQsIC0yCisJczhpCWE2LCBhNSwgIDAKKwlzOGkJYTcsIGE1LCAgMQorCWFkZGkJYTUsIGE1LCAgMgorCWoJLkxkc3RhbGlnbmVkCSMgZHN0IGlzIG5vdyBhbGlnbmVkLCByZXR1cm4gdG8gbWFpbiBhbGdvcml0aG0KKworCS5hbGlnbgk0CisJLmdsb2JhbAltZW1jcHkKKwkudHlwZSAgIG1lbWNweSxAZnVuY3Rpb24KK21lbWNweToKKwkuZ2xvYmFsCW1lbW1vdmUKKwkudHlwZSAgIG1lbW1vdmUsQGZ1bmN0aW9uCittZW1tb3ZlOgorCisJZW50cnkJc3AsIDE2CQkjIG1pbmltYWwgc3RhY2sgZnJhbWUKKwkjIGEyLyBkc3QsIGEzLyBzcmMsIGE0LyBsZW4KKwltb3YJYTUsIGEyCQkjIGNvcHkgZHN0IHNvIHRoYXQgYTIgaXMgcmV0dXJuIHZhbHVlCisuTGNvbW1vbjoKKwlfYmJzaS5sCWEyLCAwLCAuTGRzdDFtb2QyCSMgaWYgZHN0IGlzIDEgbW9kIDIKKwlfYmJzaS5sCWEyLCAxLCAuTGRzdDJtb2Q0CSMgaWYgZHN0IGlzIDIgbW9kIDQKKy5MZHN0YWxpZ25lZDoJIyByZXR1cm4gaGVyZSBmcm9tIC5MZHN0P21vZD8gb25jZSBkc3QgaXMgYWxpZ25lZAorCXNybGkJYTcsIGE0LCA0CSMgbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyB3aXRoIDE2QgorCQkJCSMgcGVyIGl0ZXJhdGlvbgorCW1vdmkJYTgsIDMJCSMgaWYgc291cmNlIGlzIG5vdCBhbGlnbmVkLAorCV9iYW55CWEzLCBhOCwgLkxzcmN1bmFsaWduZWQJIyB0aGVuIHVzZSBzaGlmdGluZyBjb3B5CisJLyoKKwkgKiBEZXN0aW5hdGlvbiBhbmQgc291cmNlIGFyZSB3b3JkLWFsaWduZWQsIHVzZSB3b3JkIGNvcHkuCisJICovCisJIyBjb3B5IDE2IGJ5dGVzIHBlciBpdGVyYXRpb24gZm9yIHdvcmQtYWxpZ25lZCBkc3QgYW5kIHdvcmQtYWxpZ25lZCBzcmMKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJbG9vcG5leglhNywgLkxvb3AxZG9uZQorI2Vsc2UgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKwliZXF6CWE3LCAuTG9vcDFkb25lCisJc2xsaQlhOCwgYTcsIDQKKwlhZGQJYTgsIGE4LCBhMwkjIGE4ID0gZW5kIG9mIGxhc3QgMTZCIHNvdXJjZSBjaHVuaworI2VuZGlmIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisuTG9vcDE6CisJbDMyaQlhNiwgYTMsICAwCisJbDMyaQlhNywgYTMsICA0CisJczMyaQlhNiwgYTUsICAwCisJbDMyaQlhNiwgYTMsICA4CisJczMyaQlhNywgYTUsICA0CisJbDMyaQlhNywgYTMsIDEyCisJczMyaQlhNiwgYTUsICA4CisJYWRkaQlhMywgYTMsIDE2CisJczMyaQlhNywgYTUsIDEyCisJYWRkaQlhNSwgYTUsIDE2CisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTMsIGE4LCAuTG9vcDEKKyNlbmRpZiAvKiAhWENIQUxfSEFWRV9MT09QUyAqLworLkxvb3AxZG9uZToKKwliYmNpLmwJYTQsIDMsIC5MMgorCSMgY29weSA4IGJ5dGVzCisJbDMyaQlhNiwgYTMsICAwCisJbDMyaQlhNywgYTMsICA0CisJYWRkaQlhMywgYTMsICA4CisJczMyaQlhNiwgYTUsICAwCisJczMyaQlhNywgYTUsICA0CisJYWRkaQlhNSwgYTUsICA4CisuTDI6CisJYmJzaS5sCWE0LCAyLCAuTDMKKwliYnNpLmwJYTQsIDEsIC5MNAorCWJic2kubAlhNCwgMCwgLkw1CisJcmV0dworLkwzOgorCSMgY29weSA0IGJ5dGVzCisJbDMyaQlhNiwgYTMsICAwCisJYWRkaQlhMywgYTMsICA0CisJczMyaQlhNiwgYTUsICAwCisJYWRkaQlhNSwgYTUsICA0CisJYmJzaS5sCWE0LCAxLCAuTDQKKwliYnNpLmwJYTQsIDAsIC5MNQorCXJldHcKKy5MNDoKKwkjIGNvcHkgMiBieXRlcworCWwxNnVpCWE2LCBhMywgIDAKKwlhZGRpCWEzLCBhMywgIDIKKwlzMTZpCWE2LCBhNSwgIDAKKwlhZGRpCWE1LCBhNSwgIDIKKwliYnNpLmwJYTQsIDAsIC5MNQorCXJldHcKKy5MNToKKwkjIGNvcHkgMSBieXRlCisJbDh1aQlhNiwgYTMsICAwCisJczhpCWE2LCBhNSwgIDAKKwlyZXR3CisKKy8qCisgKiBEZXN0aW5hdGlvbiBpcyBhbGlnbmVkLCBTb3VyY2UgaXMgdW5hbGlnbmVkCisgKi8KKworCS5hbGlnbgk0CisuTHNyY3VuYWxpZ25lZDoKKwlfYmVxeglhNCwgLkxkb25lCSMgYXZvaWQgbG9hZGluZyBhbnl0aGluZyBmb3IgemVyby1sZW5ndGggY29waWVzCisJIyBjb3B5IDE2IGJ5dGVzIHBlciBpdGVyYXRpb24gZm9yIHdvcmQtYWxpZ25lZCBkc3QgYW5kIHVuYWxpZ25lZCBzcmMKKwlzc2E4CWEzCQkjIHNldCBzaGlmdCBhbW91bnQgZnJvbSBieXRlIG9mZnNldAorI2RlZmluZSBTSU1fQ0hFQ0tTX0FMSUdOTUVOVAkxCS8qIHNldCB0byAxIHdoZW4gcnVubmluZyBvbiBJU1MgKHNpbXVsYXRvcikgd2l0aCB0aGUKKwkJCQkJICAgbGludCBvciBmZXJyZXQgY2xpZW50LCBvciAwIHRvIHNhdmUgYSBmZXcgY3ljbGVzICovCisjaWYgWENIQUxfVU5BTElHTkVEX0xPQURfRVhDRVBUSU9OIHx8IFNJTV9DSEVDS1NfQUxJR05NRU5UCisJYW5kCWExMSwgYTMsIGE4CSMgc2F2ZSB1bmFsaWdubWVudCBvZmZzZXQgZm9yIGJlbG93CisJc3ViCWEzLCBhMywgYTExCSMgYWxpZ24gYTMKKyNlbmRpZgorCWwzMmkJYTYsIGEzLCAwCSMgbG9hZCBmaXJzdCB3b3JkCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BuZXoJYTcsIC5Mb29wMmRvbmUKKyNlbHNlIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisJYmVxeglhNywgLkxvb3AyZG9uZQorCXNsbGkJYTEwLCBhNywgNAorCWFkZAlhMTAsIGExMCwgYTMJIyBhMTAgPSBlbmQgb2YgbGFzdCAxNkIgc291cmNlIGNodW5rCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5Mb29wMjoKKwlsMzJpCWE3LCBhMywgIDQKKwlsMzJpCWE4LCBhMywgIDgKKwlzcmNfYglhNiwgYTYsIGE3CisJczMyaQlhNiwgYTUsICAwCisJbDMyaQlhOSwgYTMsIDEyCisJc3JjX2IJYTcsIGE3LCBhOAorCXMzMmkJYTcsIGE1LCAgNAorCWwzMmkJYTYsIGEzLCAxNgorCXNyY19iCWE4LCBhOCwgYTkKKwlzMzJpCWE4LCBhNSwgIDgKKwlhZGRpCWEzLCBhMywgMTYKKwlzcmNfYglhOSwgYTksIGE2CisJczMyaQlhOSwgYTUsIDEyCisJYWRkaQlhNSwgYTUsIDE2CisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTMsIGExMCwgLkxvb3AyCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5Mb29wMmRvbmU6CisJYmJjaS5sCWE0LCAzLCAuTDEyCisJIyBjb3B5IDggYnl0ZXMKKwlsMzJpCWE3LCBhMywgIDQKKwlsMzJpCWE4LCBhMywgIDgKKwlzcmNfYglhNiwgYTYsIGE3CisJczMyaQlhNiwgYTUsICAwCisJYWRkaQlhMywgYTMsICA4CisJc3JjX2IJYTcsIGE3LCBhOAorCXMzMmkJYTcsIGE1LCAgNAorCWFkZGkJYTUsIGE1LCAgOAorCW1vdglhNiwgYTgKKy5MMTI6CisJYmJjaS5sCWE0LCAyLCAuTDEzCisJIyBjb3B5IDQgYnl0ZXMKKwlsMzJpCWE3LCBhMywgIDQKKwlhZGRpCWEzLCBhMywgIDQKKwlzcmNfYglhNiwgYTYsIGE3CisJczMyaQlhNiwgYTUsICAwCisJYWRkaQlhNSwgYTUsICA0CisJbW92CWE2LCBhNworLkwxMzoKKyNpZiBYQ0hBTF9VTkFMSUdORURfTE9BRF9FWENFUFRJT04gfHwgU0lNX0NIRUNLU19BTElHTk1FTlQKKwlhZGQJYTMsIGEzLCBhMTEJIyByZWFkanVzdCBhMyB3aXRoIGNvcnJlY3QgbWlzYWxpZ25tZW50CisjZW5kaWYKKwliYnNpLmwJYTQsIDEsIC5MMTQKKwliYnNpLmwJYTQsIDAsIC5MMTUKKy5MZG9uZToJcmV0dworLkwxNDoKKwkjIGNvcHkgMiBieXRlcworCWw4dWkJYTYsIGEzLCAgMAorCWw4dWkJYTcsIGEzLCAgMQorCWFkZGkJYTMsIGEzLCAgMgorCXM4aQlhNiwgYTUsICAwCisJczhpCWE3LCBhNSwgIDEKKwlhZGRpCWE1LCBhNSwgIDIKKwliYnNpLmwJYTQsIDAsIC5MMTUKKwlyZXR3CisuTDE1OgorCSMgY29weSAxIGJ5dGUKKwlsOHVpCWE2LCBhMywgIDAKKwlzOGkJYTYsIGE1LCAgMAorCXJldHcKKwwKKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBtb2RlOmZ1bmRhbWVudGFsCisgKiBjb21tZW50LXN0YXJ0OiAiIyAiCisgKiBjb21tZW50LXN0YXJ0LXNraXA6ICIjICoiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUyBiL2FyY2gveHRlbnNhL2xpYi9tZW1zZXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGUyNTEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbGliL21lbXNldC5TCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogIGFyY2gveHRlbnNhL2xpYi9tZW1zZXQuUworICoKKyAqICBBTlNJIEMgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbiBtZW1zZXQKKyAqICAoV2VsbCwgYWxtb3N0LiAgLmZpeHVwIGNvZGUgbWlnaHQgcmV0dXJuIHplcm8uKQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiAgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKworLyoKKyAqIHZvaWQgKm1lbXNldCh2b2lkICpkc3QsIGludCBjLCBzaXplX3QgbGVuZ3RoKQorICoKKyAqIFRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czoKKyAqICAgQ3JlYXRlIGEgd29yZCB3aXRoIGMgaW4gYWxsIGJ5dGUgcG9zaXRpb25zCisgKiAgIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhbGlnbmVkLAorICogICAgIGRvIDE2QiBjaHVja3Mgd2l0aCBhIGxvb3AsIGFuZCB0aGVuIGZpbmlzaCB1cCB3aXRoCisgKiAgICAgOEIsIDRCLCAyQiwgYW5kIDFCIHN0b3JlcyBjb25kaXRpb25hbCBvbiB0aGUgbGVuZ3RoLgorICogICBJZiBkZXN0aW5hdGlvbiBpcyB1bmFsaWduZWQsIGFsaWduIGl0IGJ5IGNvbmRpdGlvbmFsbHkKKyAqICAgICBzZXR0aW5nIDFCIGFuZCAyQiBhbmQgdGhlbiBnbyB0byBhbGlnbmVkIGNhc2UuCisgKiAgIFRoaXMgY29kZSB0cmllcyB0byB1c2UgZmFsbC10aHJvdWdoIGJyYW5jaGVzIGZvciB0aGUgY29tbW9uCisgKiAgICAgY2FzZSBvZiBhbiBhbGlnbmVkIGRlc3RpbmF0aW9uIChleGNlcHQgZm9yIHRoZSBicmFuY2hlcyB0bworICogICAgIHRoZSBhbGlnbm1lbnQgbGFiZWxzKS4KKyAqLworCisvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCisKKyNkZWZpbmUgRVgoaW5zbixyZWcxLHJlZzIsb2Zmc2V0LGhhbmRsZXIpCVwKKzk6CWluc24JcmVnMSwgcmVnMiwgb2Zmc2V0OwkJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIjsJCVwKKwkud29yZAk5YiwgaGFuZGxlcjsJCQlcCisJLnByZXZpb3VzCisKKworLnRleHQKKy5hbGlnbgk0CisuZ2xvYmFsCW1lbXNldAorLnR5cGUJbWVtc2V0LEBmdW5jdGlvbgorbWVtc2V0OgorCWVudHJ5CXNwLCAxNgkJIyBtaW5pbWFsIHN0YWNrIGZyYW1lCisJIyBhMi8gZHN0LCBhMy8gYywgYTQvIGxlbmd0aAorCWV4dHVpCWEzLCBhMywgMCwgOAkjIG1hc2sgdG8ganVzdCA4IGJpdHMKKwlzbGxpCWE3LCBhMywgOAkjIGR1cGxpY2F0ZSBjaGFyYWN0ZXIgaW4gYWxsIGJ5dGVzIG9mIHdvcmQKKwlvcglhMywgYTMsIGE3CSMgLi4uCisJc2xsaQlhNywgYTMsIDE2CSMgLi4uCisJb3IJYTMsIGEzLCBhNwkjIC4uLgorCW1vdglhNSwgYTIJCSMgY29weSBkc3Qgc28gdGhhdCBhMiBpcyByZXR1cm4gdmFsdWUKKwltb3ZpCWE2LCAzCQkjIGZvciBhbGlnbm1lbnQgdGVzdHMKKwliYW55CWEyLCBhNiwgLkxkc3R1bmFsaWduZWQgIyBpZiBkc3QgaXMgdW5hbGlnbmVkCisuTDA6CSMgcmV0dXJuIGhlcmUgZnJvbSAuTGRzdHVuYWxpZ25lZCB3aGVuIGRzdCBpcyBhbGlnbmVkCisJc3JsaQlhNywgYTQsIDQJIyBudW1iZXIgb2YgbG9vcCBpdGVyYXRpb25zIHdpdGggMTZCCisJCQkJIyBwZXIgaXRlcmF0aW9uCisJYm5leglhNCwgLkxhbGlnbmVkCisJcmV0dworCisvKgorICogRGVzdGluYXRpb24gaXMgd29yZC1hbGlnbmVkLgorICovCisJIyBzZXQgMTYgYnl0ZXMgcGVyIGl0ZXJhdGlvbiBmb3Igd29yZC1hbGlnbmVkIGRzdAorCS5hbGlnbgk0CQkjIDEgbW9kIDQgYWxpZ25tZW50IGZvciBMT09QTkVaCisJLmJ5dGUJMAkJIyAoMCBtb2QgNCBhbGlnbm1lbnQgZm9yIExCRUcpCisuTGFsaWduZWQ6CisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BuZXoJYTcsIC5Mb29wMWRvbmUKKyNlbHNlIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisJYmVxeglhNywgLkxvb3AxZG9uZQorCXNsbGkJYTYsIGE3LCA0CisJYWRkCWE2LCBhNiwgYTUJIyBhNiA9IGVuZCBvZiBsYXN0IDE2QiBjaHVuaworI2VuZGlmIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisuTG9vcDE6CisJRVgoczMyaSwgYTMsIGE1LCAgMCwgbWVtc2V0X2ZpeHVwKQorCUVYKHMzMmksIGEzLCBhNSwgIDQsIG1lbXNldF9maXh1cCkKKwlFWChzMzJpLCBhMywgYTUsICA4LCBtZW1zZXRfZml4dXApCisJRVgoczMyaSwgYTMsIGE1LCAxMiwgbWVtc2V0X2ZpeHVwKQorCWFkZGkJYTUsIGE1LCAxNgorI2lmICFYQ0hBTF9IQVZFX0xPT1BTCisJYmx0CWE1LCBhNiwgLkxvb3AxCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5Mb29wMWRvbmU6CisJYmJjaS5sCWE0LCAzLCAuTDIKKwkjIHNldCA4IGJ5dGVzCisJRVgoczMyaSwgYTMsIGE1LCAgMCwgbWVtc2V0X2ZpeHVwKQorCUVYKHMzMmksIGEzLCBhNSwgIDQsIG1lbXNldF9maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDgKKy5MMjoKKwliYmNpLmwJYTQsIDIsIC5MMworCSMgc2V0IDQgYnl0ZXMKKwlFWChzMzJpLCBhMywgYTUsICAwLCBtZW1zZXRfZml4dXApCisJYWRkaQlhNSwgYTUsICA0CisuTDM6CisJYmJjaS5sCWE0LCAxLCAuTDQKKwkjIHNldCAyIGJ5dGVzCisJRVgoczE2aSwgYTMsIGE1LCAgMCwgbWVtc2V0X2ZpeHVwKQorCWFkZGkJYTUsIGE1LCAgMgorLkw0OgorCWJiY2kubAlhNCwgMCwgLkw1CisJIyBzZXQgMSBieXRlCisJRVgoczhpLCBhMywgYTUsICAwLCBtZW1zZXRfZml4dXApCisuTDU6CisuTHJldDE6CisJcmV0dworCisvKgorICogRGVzdGluYXRpb24gaXMgdW5hbGlnbmVkCisgKi8KKworLkxkc3R1bmFsaWduZWQ6CisJYmx0dWkJYTQsIDgsIC5MYnl0ZXNldAkjIGRvIHNob3J0IGNvcGllcyBieXRlIGJ5IGJ5dGUKKwliYmNpLmwJYTUsIDAsIC5MMjAJCSMgYnJhbmNoIGlmIGRzdCBhbGlnbm1lbnQgaGFsZi1hbGlnbmVkCisJIyBkc3QgaXMgb25seSBieXRlIGFsaWduZWQKKwkjIHNldCAxIGJ5dGUKKwlFWChzOGksIGEzLCBhNSwgIDAsIG1lbXNldF9maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDEKKwlhZGRpCWE0LCBhNCwgLTEKKwkjIG5vdyByZXRlc3QgaWYgZHN0IGFsaWduZWQKKwliYmNpLmwJYTUsIDEsIC5MMAkjIGlmIG5vdyBhbGlnbmVkLCByZXR1cm4gdG8gbWFpbiBhbGdvcml0aG0KKy5MMjA6CisJIyBkc3QgaGFsZi1hbGlnbmVkCisJIyBzZXQgMiBieXRlcworCUVYKHMxNmksIGEzLCBhNSwgIDAsIG1lbXNldF9maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDIKKwlhZGRpCWE0LCBhNCwgLTIKKwlqCS5MMAkJIyBkc3QgaXMgbm93IGFsaWduZWQsIHJldHVybiB0byBtYWluIGFsZ29yaXRobQorCisvKgorICogQnl0ZSBieSBieXRlIHNldAorICovCisJLmFsaWduCTQKKwkuYnl0ZQkwCQkjIDEgbW9kIDQgYWxpZ25tZW50IGZvciBMT09QTkVaCisJCQkJIyAoMCBtb2QgNCBhbGlnbm1lbnQgZm9yIExCRUcpCisuTGJ5dGVzZXQ6CisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BuZXoJYTQsIC5MYnl0ZXNldGRvbmUKKyNlbHNlIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisJYmVxeglhNCwgLkxieXRlc2V0ZG9uZQorCWFkZAlhNiwgYTUsIGE0CSMgYTYgPSBlbmRpbmcgYWRkcmVzcworI2VuZGlmIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisuTGJ5dGVsb29wOgorCUVYKHM4aSwgYTMsIGE1LCAwLCBtZW1zZXRfZml4dXApCisJYWRkaQlhNSwgYTUsIDEKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCWJsdAlhNSwgYTYsIC5MYnl0ZWxvb3AKKyNlbmRpZiAvKiAhWENIQUxfSEFWRV9MT09QUyAqLworLkxieXRlc2V0ZG9uZToKKwlyZXR3CisKKworCS5zZWN0aW9uIC5maXh1cCwgImF4IgorCS5hbGlnbgk0CisKKy8qIFdlIHJldHVybiB6ZXJvIGlmIGEgZmFpbHVyZSBvY2N1cnJlZC4gKi8KKworbWVtc2V0X2ZpeHVwOgorCW1vdmkJYTIsIDAKKwlyZXR3CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvcGNpLWF1dG8uYyBiL2FyY2gveHRlbnNhL2xpYi9wY2ktYXV0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzc5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9saWIvcGNpLWF1dG8uYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIGFyY2gveHRlbnNhL2tlcm5lbC9wY2ktYXV0by5jCisgKgorICogUENJIGF1dG9jb25maWd1cmF0aW9uIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsIDx6YW5rZWxAdGVuc2lsaWNhLmNvbSwgY2V6QHphbmtlbC5uZXQ+CisgKgorICogQmFzZWQgb24gd29yayBmcm9tIE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKworCisvKgorICoKKyAqIFNldHRpbmcgdXAgYSBQQ0kKKyAqCisgKiBwY2lfY3RybC0+Zmlyc3RfYnVzbm8gPSA8Zmlyc3QgYnVzIG51bWJlciAoMCk+CisgKiBwY2lfY3RybC0+bGFzdF9idXNubyA9IDxsYXN0IGJ1cyBudW1iZXIgKDB4ZmYpPgorICogcGNpX2N0cmwtPm9wcyA9IDxQQ0kgY29uZmlnIG9wZXJhdGlvbnM+CisgKiBwY2lfY3RybC0+bWFwX2lycSA9IDxmdW5jdGlvbiB0byByZXR1cm4gdGhlIGludGVycnVwdCBudW1iZXIgZm9yIGEgZGV2aWNlPgorICoKKyAqIHBjaV9jdHJsLT5pb19zcGFjZS5zdGFydCA9IDxJTyBzcGFjZSBzdGFydCBhZGRyZXNzIChQQ0kgdmlldyk+CisgKiBwY2lfY3RybC0+aW9fc3BhY2UuZW5kID0gPElPIHNwYWNlIGVuZCBhZGRyZXNzIChQQ0kgdmlldyk+CisgKiBwY2lfY3RybC0+aW9fc3BhY2UuYmFzZSA9IDxJTyBzcGFjZSBvZmZzZXQ6IGFkZHJlc3MgMCBmcm9tIENQVSBzcGFjZT4KKyAqIHBjaV9jdHJsLT5tZW1fc3BhY2Uuc3RhcnQgPSA8TUVNIHNwYWNlIHN0YXJ0IGFkZHJlc3MgKFBDSSB2aWV3KT4KKyAqIHBjaV9jdHJsLT5tZW1fc3BhY2UuZW5kID0gPE1FTSBzcGFjZSBlbmQgYWRkcmVzcyAoUENJIHZpZXcpPgorICogcGNpX2N0cmwtPm1lbV9zcGFjZS5iYXNlID0gPE1FTSBzcGFjZSBvZmZzZXQ6IGFkZHJlc3MgMCBmcm9tIENQVSBzcGFjZT4KKyAqCisgKiBwY2liaW9zX2luaXRfcmVzb3VyY2UoJnBjaV9jdHJsLT5pb19yZXNvdXJjZSwgPElPIHNwYWNlIHN0YXJ0PiwKKyAqIAkJCSA8SU8gc3BhY2UgZW5kPiwgSU9SRVNPVVJDRV9JTywgIlBDSSBob3N0IGJyaWRnZSIpOworICogcGNpYmlvc19pbml0X3Jlc291cmNlKCZwY2lfY3RybC0+bWVtX3Jlc291cmNlc1swXSwgPE1FTSBzcGFjZSBzdGFydD4sCisgKiAJCQkgPE1FTSBzcGFjZSBlbmQ+LCBJT1JFU09VUkNFX01FTSwgIlBDSSBob3N0IGJyaWRnZSIpOworICoKKyAqIHBjaV9jdHJsLT5sYXN0X2J1c25vID0gcGNpYXV0b19idXNfc2NhbihwY2lfY3RybCxwY2lfY3RybC0+Zmlyc3RfYnVzbm8pOworICoKKyAqIGludCBfX2luaXQgcGNpYXV0b19idXNfc2NhbihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9jdHJsLCBpbnQgY3VycmVudF9idXMpCisgKgorICovCisKKworLyogZGVmaW5lIERFQlVHIHRvIHByaW50IHNvbWUgZGVidWdnaW5nIG1lc3NhZ2VzLiAqLworCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjIGRlZmluZSBEQkcoeC4uLikgcHJpbnRrKHgpCisjZWxzZQorIyBkZWZpbmUgREJHKHguLi4pCisjZW5kaWYKKworc3RhdGljIGludCBwY2lhdXRvX3VwcGVyX2lvc3BjOworc3RhdGljIGludCBwY2lhdXRvX3VwcGVyX21lbXNwYzsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2IHBjaWF1dG9fZGV2Oworc3RhdGljIHN0cnVjdCBwY2lfYnVzIHBjaWF1dG9fYnVzOworCisvKgorICogSGVscGVyIGZ1bmN0aW9ucworICovCisKKy8qIEluaXRpYWxpemUgdGhlIGJhcnMgb2YgYSBQQ0kgZGV2aWNlLiAgKi8KKworc3RhdGljIHZvaWQgX19pbml0CitwY2lhdXRvX3NldHVwX2JhcnMoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhcl9saW1pdCkKK3sKKwlpbnQgYmFyX3NpemU7CisJaW50IGJhciwgYmFyX25yOworCWludCAqdXBwZXJfbGltaXQ7CisJaW50IGZvdW5kX21lbTY0ID0gMDsKKworCWZvciAoYmFyID0gUENJX0JBU0VfQUREUkVTU18wLCBiYXJfbnIgPSAwOworCSAgICAgYmFyIDw9IGJhcl9saW1pdDsKKwkgICAgIGJhcis9NCwgYmFyX25yKyspCisJeworCQkvKiBUaWNrbGUgdGhlIEJBUiBhbmQgZ2V0IHRoZSBzaXplICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBiYXIsIDB4ZmZmZmZmZmYpOworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBiYXIsICZiYXJfc2l6ZSk7CisKKwkJLyogSWYgQkFSIGlzIG5vdCBpbXBsZW1lbnRlZCBnbyB0byB0aGUgbmV4dCBCQVIgKi8KKwkJaWYgKCFiYXJfc2l6ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIHRoZSBCQVIgdHlwZSBhbmQgc2V0IG91ciBhZGRyZXNzIG1hc2sgKi8KKwkJaWYgKGJhcl9zaXplICYgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykKKwkJeworCQkJYmFyX3NpemUgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCQkJdXBwZXJfbGltaXQgPSAmcGNpYXV0b191cHBlcl9pb3NwYzsKKwkJCURCRygiUENJIEF1dG9jb25maWc6IEJBUiAlZCwgSS9PLCAiLCBiYXJfbnIpOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKChiYXJfc2l6ZSAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykgPT0KKwkJCSAgICBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KQorCQkJCWZvdW5kX21lbTY0ID0gMTsKKworCQkJYmFyX3NpemUgJj0gUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwkJCXVwcGVyX2xpbWl0ID0gJnBjaWF1dG9fdXBwZXJfbWVtc3BjOworCQkJREJHKCJQQ0kgQXV0b2NvbmZpZzogQkFSICVkLCBNZW0sICIsIGJhcl9ucik7CisJCX0KKworCQkvKiBBbGxvY2F0ZSBhIGJhc2UgYWRkcmVzcyAoYmFyX3NpemUgaXMgbmVnYXRpdmUhKSAqLworCQkqdXBwZXJfbGltaXQgPSAoKnVwcGVyX2xpbWl0ICsgYmFyX3NpemUpICYgYmFyX3NpemU7CisKKwkJLyogV3JpdGUgaXQgb3V0IGFuZCB1cGRhdGUgb3VyIGxpbWl0ICovCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBiYXIsICp1cHBlcl9saW1pdCk7CisKKwkJLyoKKwkJICogSWYgd2UgYXJlIGEgNjQtYml0IGRlY29kZXIgdGhlbiBpbmNyZW1lbnQgdG8gdGhlCisJCSAqIHVwcGVyIDMyIGJpdHMgb2YgdGhlIGJhciBhbmQgZm9yY2UgaXQgdG8gbG9jYXRlCisJCSAqIGluIHRoZSBsb3dlciA0R0Igb2YgbWVtb3J5LgorCQkgKi8KKworCQlpZiAoZm91bmRfbWVtNjQpCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgKGJhcis9NCksIDB4MDAwMDAwMDApOworCisJCURCRygic2l6ZT0weCV4LCBhZGRyZXNzPTB4JXhcbiIsIH5iYXJfc2l6ZSArIDEsICp1cHBlcl9saW1pdCk7CisJfQorfQorCisvKiBJbml0aWFsaXplIHRoZSBpbnRlcnJ1cHQgbnVtYmVyLiAqLworCitzdGF0aWMgdm9pZCBfX2luaXQKK3BjaWF1dG9fc2V0dXBfaXJxKHN0cnVjdCBwY2lfY29udHJvbGxlciogcGNpX2N0cmwsc3RydWN0IHBjaV9kZXYgKmRldixpbnQgZGV2Zm4pCit7CisJdTggcGluOworCWludCBpcnEgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CisKKwkvKiBGaXggaWxsZWdhbCBwaW4gbnVtYmVycy4gKi8KKworCWlmIChwaW4gPT0gMCB8fCBwaW4gPiA0KQorCQlwaW4gPSAxOworCisJaWYgKHBjaV9jdHJsLT5tYXBfaXJxKQorCQlpcnEgPSBwY2lfY3RybC0+bWFwX2lycShkZXYsIFBDSV9TTE9UKGRldmZuKSwgcGluKTsKKworCWlmIChpcnEgPT0gLTEpCisJCWlycSA9IDA7CisKKwlEQkcoIlBDSSBBdXRvY29uZmlnOiBJbnRlcnJ1cHQgJWQsIHBpbiAlZFxuIiwgaXJxLCBwaW4pOworCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOworfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdAorcGNpYXV0b19wcmVzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY3VycmVudF9idXMsCisJCQkgICAgIGludCBzdWJfYnVzLCBpbnQgKmlvc2F2ZSwgaW50ICptZW1zYXZlKQoreworCS8qIENvbmZpZ3VyZSBidXMgbnVtYmVyIHJlZ2lzdGVycyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9QUklNQVJZX0JVUywgY3VycmVudF9idXMpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLCBzdWJfYnVzICsgMSk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1NVQk9SRElOQVRFX0JVUywJMHhmZik7CisKKwkvKiBSb3VuZCBtZW1vcnkgYWxsb2NhdG9yIHRvIDFNQiBib3VuZGFyeSAqLworCXBjaWF1dG9fdXBwZXJfbWVtc3BjICY9IH4oMHgxMDAwMDAgLSAxKTsKKwkqbWVtc2F2ZSA9IHBjaWF1dG9fdXBwZXJfbWVtc3BjOworCisJLyogUm91bmQgSS9PIGFsbG9jYXRvciB0byA0S0IgYm91bmRhcnkgKi8KKwlwY2lhdXRvX3VwcGVyX2lvc3BjICY9IH4oMHgxMDAwIC0gMSk7CisJKmlvc2F2ZSA9IHBjaWF1dG9fdXBwZXJfaW9zcGM7CisKKwkvKiBTZXQgdXAgbWVtb3J5IGFuZCBJL08gZmlsdGVyIGxpbWl0cywgYXNzdW1lIDMyLWJpdCBJL08gc3BhY2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfTUVNT1JZX0xJTUlULAorCQkJICAgICAgKChwY2lhdXRvX3VwcGVyX21lbXNwYyAtIDEpICYgMHhmZmYwMDAwMCkgPj4gMTYpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JT19MSU1JVCwKKwkJCSAgICAgICgocGNpYXV0b191cHBlcl9pb3NwYyAtIDEpICYgMHgwMDAwZjAwMCkgPj4gOCk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0lPX0xJTUlUX1VQUEVSMTYsCisJCQkgICAgICAoKHBjaWF1dG9fdXBwZXJfaW9zcGMgLSAxKSAmIDB4ZmZmZjAwMDApID4+IDE2KTsKK30KKworc3RhdGljIHZvaWQgX19pbml0CitwY2lhdXRvX3Bvc3RzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY3VycmVudF9idXMsIGludCBzdWJfYnVzLAorCQkJICAgICAgaW50ICppb3NhdmUsIGludCAqbWVtc2F2ZSkKK3sKKwlpbnQgY21kc3RhdDsKKworCS8qIENvbmZpZ3VyZSBidXMgbnVtYmVyIHJlZ2lzdGVycyAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9TVUJPUkRJTkFURV9CVVMsCXN1Yl9idXMpOworCisJLyoKKwkgKiBSb3VuZCBtZW1vcnkgYWxsb2NhdG9yIHRvIDFNQiBib3VuZGFyeS4KKwkgKiBJZiBubyBzcGFjZSB1c2VkLCBhbGxvY2F0ZSBtaW5pbXVtLgorCSAqLworCXBjaWF1dG9fdXBwZXJfbWVtc3BjICY9IH4oMHgxMDAwMDAgLSAxKTsKKwlpZiAoKm1lbXNhdmUgPT0gcGNpYXV0b191cHBlcl9tZW1zcGMpCisJCXBjaWF1dG9fdXBwZXJfbWVtc3BjIC09IDB4MDAxMDAwMDA7CisKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfTUVNT1JZX0JBU0UsIHBjaWF1dG9fdXBwZXJfbWVtc3BjID4+IDE2KTsKKworCS8qIEFsbG9jYXRlIDFNQiBmb3IgcHJlLWZyZXRjaCAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9QUkVGX01FTU9SWV9MSU1JVCwKKwkJCSAgICAgICgocGNpYXV0b191cHBlcl9tZW1zcGMgLSAxKSAmIDB4ZmZmMDAwMDApID4+IDE2KTsKKworCXBjaWF1dG9fdXBwZXJfbWVtc3BjIC09IDB4MTAwMDAwOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX1BSRUZfTUVNT1JZX0JBU0UsCisJCQkgICAgICBwY2lhdXRvX3VwcGVyX21lbXNwYyA+PiAxNik7CisKKwkvKiBSb3VuZCBJL08gYWxsb2NhdG9yIHRvIDRLQiBib3VuZGFyeSAqLworCXBjaWF1dG9fdXBwZXJfaW9zcGMgJj0gfigweDEwMDAgLSAxKTsKKwlpZiAoKmlvc2F2ZSA9PSBwY2lhdXRvX3VwcGVyX2lvc3BjKQorCQlwY2lhdXRvX3VwcGVyX2lvc3BjIC09IDB4MTAwMDsKKworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JT19CQVNFLAorCQkJICAgICAgKHBjaWF1dG9fdXBwZXJfaW9zcGMgJiAweDAwMDBmMDAwKSA+PiA4KTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfSU9fQkFTRV9VUFBFUjE2LAorCQkJICAgICAgcGNpYXV0b191cHBlcl9pb3NwYyA+PiAxNik7CisKKwkvKiBFbmFibGUgbWVtb3J5IGFuZCBJL08gYWNjZXNzZXMsIGVuYWJsZSBidXMgbWFzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWRzdGF0KTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsCisJCQkgICAgICAgY21kc3RhdCB8CisJCQkgICAgICAgUENJX0NPTU1BTkRfSU8gfAorCQkJICAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8CisJCQkgICAgICAgUENJX0NPTU1BTkRfTUFTVEVSKTsKK30KKworLyoKKyAqIFNjYW4gdGhlIGN1cnJlbnQgUENJIGJ1cy4KKyAqLworCisKK2ludCBfX2luaXQgcGNpYXV0b19idXNfc2NhbihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9jdHJsLCBpbnQgY3VycmVudF9idXMpCit7CisJaW50IHN1Yl9idXMsIHBjaV9kZXZmbiwgcGNpX2NsYXNzLCBjbWRzdGF0LCBmb3VuZF9tdWx0aT0wOworCXVuc2lnbmVkIHNob3J0IHZpZDsKKwl1bnNpZ25lZCBjaGFyIGhlYWRlcl90eXBlOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSAmcGNpYXV0b19kZXY7CisKKyAgICAgICAgcGNpYXV0b19kZXYuYnVzID0gJnBjaWF1dG9fYnVzOworICAgICAgICBwY2lhdXRvX2Rldi5zeXNkYXRhID0gcGNpX2N0cmw7CisJcGNpYXV0b19idXMub3BzID0gcGNpX2N0cmwtPm9wczsKKworCS8qCisJICogRmV0Y2ggb3VyIEkvTyBhbmQgbWVtb3J5IHNwYWNlIHVwcGVyIGJvdW5kYXJpZXMgdXNlZAorCSAqIHRvIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBvbiB0aGlzIHBjaV9jb250cm9sbGVyLgorCSAqLworCisJaWYgKGN1cnJlbnRfYnVzID09IHBjaV9jdHJsLT5maXJzdF9idXNubykKKwl7CisJCXBjaWF1dG9fdXBwZXJfaW9zcGMgPSBwY2lfY3RybC0+aW9fcmVzb3VyY2UuZW5kICsgMTsKKwkJcGNpYXV0b191cHBlcl9tZW1zcGMgPSBwY2lfY3RybC0+bWVtX3Jlc291cmNlc1swXS5lbmQgKyAxOworCX0KKworCXN1Yl9idXMgPSBjdXJyZW50X2J1czsKKworCWZvciAocGNpX2RldmZuID0gMDsgcGNpX2RldmZuIDwgMHhmZjsgcGNpX2RldmZuKyspCisJeworCQkvKiBTa2lwIG91ciBob3N0IGJyaWRnZSAqLworCQlpZiAoKGN1cnJlbnRfYnVzID09IHBjaV9jdHJsLT5maXJzdF9idXNubykgJiYgKHBjaV9kZXZmbiA9PSAwKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChQQ0lfRlVOQyhwY2lfZGV2Zm4pICYmICFmb3VuZF9tdWx0aSkKKwkJCWNvbnRpbnVlOworCisJCXBjaWF1dG9fYnVzLm51bWJlciA9IGN1cnJlbnRfYnVzOworCQlwY2lhdXRvX2Rldi5kZXZmbiA9IHBjaV9kZXZmbjsKKworCQkvKiBJZiBjb25maWcgc3BhY2UgcmVhZCBmYWlscyBmcm9tIHRoaXMgZGV2aWNlLCBtb3ZlIG9uICovCisJCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9IRUFERVJfVFlQRSwgJmhlYWRlcl90eXBlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghUENJX0ZVTkMocGNpX2RldmZuKSkKKwkJCWZvdW5kX211bHRpID0gaGVhZGVyX3R5cGUgJiAweDgwOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsICZ2aWQpOworCisJCWlmICh2aWQgPT0gMHhmZmZmIHx8IHZpZCA9PSAweDAwMDApIHsKKwkJCWZvdW5kX211bHRpID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcGNpX2NsYXNzKTsKKworCQlpZiAoKHBjaV9jbGFzcyA+PiAxNikgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKKworCQkJaW50IGlvc2F2ZSwgbWVtc2F2ZTsKKworCQkJREJHKCJQQ0kgQXV0b2NvbmZpZzogRm91bmQgUDJQIGJyaWRnZSwgZGV2aWNlICVkXG4iLAorCQkJICAgIFBDSV9TTE9UKHBjaV9kZXZmbikpOworCisJCQkvKiBBbGxvY2F0ZSBQQ0kgSS9PIGFuZC9vciBtZW1vcnkgc3BhY2UgKi8KKwkJCXBjaWF1dG9fc2V0dXBfYmFycyhkZXYsIFBDSV9CQVNFX0FERFJFU1NfMSk7CisKKwkJCXBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9icmlkZ2UoZGV2LCBjdXJyZW50X2J1cywgc3ViX2J1cywKKwkJCQkJJmlvc2F2ZSwgJm1lbXNhdmUpOworCQkJc3ViX2J1cyA9IHBjaWF1dG9fYnVzX3NjYW4ocGNpX2N0cmwsIHN1Yl9idXMrMSk7CisJCQlwY2lhdXRvX3Bvc3RzY2FuX3NldHVwX2JyaWRnZShkZXYsIGN1cnJlbnRfYnVzLCBzdWJfYnVzLAorCQkJCQkmaW9zYXZlLCAmbWVtc2F2ZSk7CisJCQlwY2lhdXRvX2J1cy5udW1iZXIgPSBjdXJyZW50X2J1czsKKworCQkJY29udGludWU7CisKKwkJfQorCisKKyNpZiAwCisJCS8qIFNraXAgbGVnYWN5IG1vZGUgSURFIGNvbnRyb2xsZXIgKi8KKworCQlpZiAoKHBjaV9jbGFzcyA+PiAxNikgPT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKSB7CisKKwkJCXVuc2lnbmVkIGNoYXIgcHJnX2lmYWNlOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0xBU1NfUFJPRywgJnByZ19pZmFjZSk7CisKKwkJCWlmICghKHByZ19pZmFjZSAmIFBDSUFVVE9fSURFX01PREVfTUFTSykpIHsKKwkJCQlEQkcoIlBDSSBBdXRvY29uZmlnOiBTa2lwcGluZyBsZWdhY3kgbW9kZSAiCisJCQkJICAgICJJREUgY29udHJvbGxlclxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKyNlbmRpZgorCisJCS8qCisJCSAqIEZvdW5kIGEgcGVyaXBoZXJhbCwgZW5hYmxlIHNvbWUgc3RhbmRhcmQKKwkJICogc2V0dGluZ3MKKwkJICovCisKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX0NPTU1BTkQsCSZjbWRzdGF0KTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DT01NQU5ELAorCQkJCWNtZHN0YXQgfAorCQkJCQlQQ0lfQ09NTUFORF9JTyB8CisJCQkJCVBDSV9DT01NQU5EX01FTU9SWSB8CisJCQkJCVBDSV9DT01NQU5EX01BU1RFUik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKKworCQkvKiBBbGxvY2F0ZSBQQ0kgSS9PIGFuZC9vciBtZW1vcnkgc3BhY2UgKi8KKwkJREJHKCJQQ0kgQXV0b2NvbmZpZzogRm91bmQgQnVzICVkLCBEZXZpY2UgJWQsIEZ1bmN0aW9uICVkXG4iLAorCQkgICAgY3VycmVudF9idXMsIFBDSV9TTE9UKHBjaV9kZXZmbiksIFBDSV9GVU5DKHBjaV9kZXZmbikgKTsKKworCQlwY2lhdXRvX3NldHVwX2JhcnMoZGV2LCBQQ0lfQkFTRV9BRERSRVNTXzUpOworCQlwY2lhdXRvX3NldHVwX2lycShwY2lfY3RybCwgZGV2LCBwY2lfZGV2Zm4pOworCX0KKwlyZXR1cm4gc3ViX2J1czsKK30KKworCisKKworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvc3RyY2FzZWNtcC5jIGIvYXJjaC94dGVuc2EvbGliL3N0cmNhc2VjbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjViMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbGliL3N0cmNhc2VjbXAuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogIGxpbnV4L2FyY2gveHRlbnNhL2xpYi9zdHJjYXNlY21wLmMKKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqICB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisKKy8qIFdlIGhhbmRsZSBub3RoaW5nIGhlcmUgZXhjZXB0IHRoZSBDIGxvY2FsZS4gIFNpbmNlIHRoaXMgaXMgdXNlZCBpbgorICAgb25seSBvbmUgcGxhY2UsIG9uIHN0cmluZ3Mga25vd24gdG8gY29udGFpbiBvbmx5IDcgYml0IEFTQ0lJLCB0aGlzCisgICBpcyBvay4gICovCisKK2ludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJaW50IGNhLCBjYjsKKworCWRvIHsKKwkJY2EgPSAqYSsrICYgMHhmZjsKKwkJY2IgPSAqYisrICYgMHhmZjsKKwkJaWYgKGNhID49ICdBJyAmJiBjYSA8PSAnWicpCisJCQljYSArPSAnYScgLSAnQSc7CisJCWlmIChjYiA+PSAnQScgJiYgY2IgPD0gJ1onKQorCQkJY2IgKz0gJ2EnIC0gJ0EnOworCX0gd2hpbGUgKGNhID09IGNiICYmIGNhICE9ICdcMCcpOworCisJcmV0dXJuIGNhIC0gY2I7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMgYi9hcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkNTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL2xpYi9zdHJuY3B5X3VzZXIuUwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqICBhcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMKKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqICB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgUmV0dXJuczogLUVGQVVMVCBpZiBleGNlcHRpb24gYmVmb3JlIHRlcm1pbmF0b3IsIE4gaWYgdGhlIGVudGlyZQorICogIGJ1ZmZlciBmaWxsZWQsIGVsc2Ugc3RybGVuLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCisKKyNkZWZpbmUgRVgoaW5zbixyZWcxLHJlZzIsb2Zmc2V0LGhhbmRsZXIpCVwKKzk6CWluc24JcmVnMSwgcmVnMiwgb2Zmc2V0OwkJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIjsJCVwKKwkud29yZAk5YiwgaGFuZGxlcjsJCQlcCisJLnByZXZpb3VzCisKKy8qCisgKiBjaGFyICpfX3N0cm5jcHlfdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGxlbikKKyAqLworLnRleHQKKy5iZWdpbiBsaXRlcmFsCisuYWxpZ24JNAorLkxtYXNrMDoKKwkuYnl0ZQkweGZmLCAweDAwLCAweDAwLCAweDAwCisuTG1hc2sxOgorCS5ieXRlCTB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAKKy5MbWFzazI6CisJLmJ5dGUJMHgwMCwgMHgwMCwgMHhmZiwgMHgwMAorLkxtYXNrMzoKKwkuYnl0ZQkweDAwLCAweDAwLCAweDAwLCAweGZmCisuZW5kIGxpdGVyYWwKKworIyBSZWdpc3RlciB1c2UKKyMgICBhMC8gcmV0dXJuIGFkZHJlc3MKKyMgICBhMS8gc3RhY2sgcG9pbnRlcgorIyAgIGEyLyByZXR1cm4gdmFsdWUKKyMgICBhMy8gc3JjCisjICAgYTQvIGxlbgorIyAgIGE1LyBtYXNrMAorIyAgIGE2LyBtYXNrMQorIyAgIGE3LyBtYXNrMgorIyAgIGE4LyBtYXNrMworIyAgIGE5LyB0bXAKKyMgICBhMTAvIHRtcAorIyAgIGExMS8gZHN0CisjICAgYTEyLyB0bXAKKworLmFsaWduCTQKKy5nbG9iYWwJX19zdHJuY3B5X3VzZXIKKy50eXBlCV9fc3RybmNweV91c2VyLEBmdW5jdGlvbgorX19zdHJuY3B5X3VzZXI6CisJZW50cnkJc3AsIDE2CQkjIG1pbmltYWwgc3RhY2sgZnJhbWUKKwkjIGEyLyBkc3QsIGEzLyBzcmMsIGE0LyBsZW4KKwltb3YJYTExLCBhMgkJIyBsZWF2ZSBkc3QgaW4gcmV0dXJuIHZhbHVlIHJlZ2lzdGVyCisJYmVxeglhNCwgLkxyZXQJIyBpZiBsZW4gaXMgemVybworCWwzMnIJYTUsIC5MbWFzazAJIyBtYXNrIGZvciBieXRlIDAKKwlsMzJyCWE2LCAuTG1hc2sxCSMgbWFzayBmb3IgYnl0ZSAxCisJbDMycglhNywgLkxtYXNrMgkjIG1hc2sgZm9yIGJ5dGUgMgorCWwzMnIJYTgsIC5MbWFzazMJIyBtYXNrIGZvciBieXRlIDMKKwliYnNpLmwJYTMsIDAsIC5Mc3JjMW1vZDIgIyBpZiBvbmx5ICA4LWJpdCBhbGlnbmVkCisJYmJzaS5sCWEzLCAxLCAuTHNyYzJtb2Q0ICMgaWYgb25seSAxNi1iaXQgYWxpZ25lZAorLkxzcmNhbGlnbmVkOgkjIHJldHVybiBoZXJlIHdoZW4gc3JjIGlzIHdvcmQtYWxpZ25lZAorCXNybGkJYTEyLCBhNCwgMgkjIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMgd2l0aCA0QiBwZXIgbG9vcAorCW1vdmkJYTksIDMKKwlibm9uZQlhMTEsIGE5LCAuTGFsaWduZWQKKwlqCS5MZHN0dW5hbGlnbmVkCisKKy5Mc3JjMW1vZDI6CSMgc3JjIGFkZHJlc3MgaXMgb2RkCisJRVgobDh1aSwgYTksIGEzLCAwLCBmaXh1cF9sKQkjIGdldCBieXRlIDAKKwlhZGRpCWEzLCBhMywgMQkJIyBhZHZhbmNlIHNyYyBwb2ludGVyCisJRVgoczhpLCBhOSwgYTExLCAwLCBmaXh1cF9zKQkjIHN0b3JlIGJ5dGUgMAorCWJlcXoJYTksIC5McmV0CQkjIGlmIGJ5dGUgMCBpcyB6ZXJvCisJYWRkaQlhMTEsIGExMSwgMQkJIyBhZHZhbmNlIGRzdCBwb2ludGVyCisJYWRkaQlhNCwgYTQsIC0xCQkjIGRlY3JlbWVudCBsZW4KKwliZXF6CWE0LCAuTHJldAkJIyBpZiBsZW4gaXMgemVybworCWJiY2kubAlhMywgMSwgLkxzcmNhbGlnbmVkCSMgaWYgc3JjIGlzIG5vdyB3b3JkLWFsaWduZWQKKworLkxzcmMybW9kNDoJIyBzcmMgYWRkcmVzcyBpcyAyIG1vZCA0CisJRVgobDh1aSwgYTksIGEzLCAwLCBmaXh1cF9sKQkjIGdldCBieXRlIDAKKwkvKiAxLWN5Y2xlIGludGVybG9jayAqLworCUVYKHM4aSwgYTksIGExMSwgMCwgZml4dXBfcykJIyBzdG9yZSBieXRlIDAKKwliZXF6CWE5LCAuTHJldAkJIyBpZiBieXRlIDAgaXMgemVybworCWFkZGkJYTExLCBhMTEsIDEJCSMgYWR2YW5jZSBkc3QgcG9pbnRlcgorCWFkZGkJYTQsIGE0LCAtMQkJIyBkZWNyZW1lbnQgbGVuCisJYmVxeglhNCwgLkxyZXQJCSMgaWYgbGVuIGlzIHplcm8KKwlFWChsOHVpLCBhOSwgYTMsIDEsIGZpeHVwX2wpCSMgZ2V0IGJ5dGUgMAorCWFkZGkJYTMsIGEzLCAyCQkjIGFkdmFuY2Ugc3JjIHBvaW50ZXIKKwlFWChzOGksIGE5LCBhMTEsIDAsIGZpeHVwX3MpCSMgc3RvcmUgYnl0ZSAwCisJYmVxeglhOSwgLkxyZXQJCSMgaWYgYnl0ZSAwIGlzIHplcm8KKwlhZGRpCWExMSwgYTExLCAxCQkjIGFkdmFuY2UgZHN0IHBvaW50ZXIKKwlhZGRpCWE0LCBhNCwgLTEJCSMgZGVjcmVtZW50IGxlbgorCWJuZXoJYTQsIC5Mc3JjYWxpZ25lZAkjIGlmIGxlbiBpcyBub256ZXJvCisuTHJldDoKKwlzdWIJYTIsIGExMSwgYTIJCSMgY29tcHV0ZSBzdHJsZW4KKwlyZXR3CisKKy8qCisgKiBkc3QgaXMgd29yZC1hbGlnbmVkLCBzcmMgaXMgd29yZC1hbGlnbmVkCisgKi8KKwkuYWxpZ24JNAkJIyAxIG1vZCA0IGFsaWdubWVudCBmb3IgTE9PUE5FWgorCS5ieXRlCTAJCSMgKDAgbW9kIDQgYWxpZ25tZW50IGZvciBMQkVHKQorLkxhbGlnbmVkOgorI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wbmV6CWExMiwgLkxvb3AxZG9uZQorI2Vsc2UKKwliZXF6CWExMiwgLkxvb3AxZG9uZQorCXNsbGkJYTEyLCBhMTIsIDIKKwlhZGQJYTEyLCBhMTIsIGExMQkjIGExMiA9IGVuZCBvZiBsYXN0IDRCIGNodW5jaworI2VuZGlmCisuTG9vcDE6CisJRVgobDMyaSwgYTksIGEzLCAwLCBmaXh1cF9sKQkjIGdldCB3b3JkIGZyb20gc3JjCisJYWRkaQlhMywgYTMsIDQJCSMgYWR2YW5jZSBzcmMgcG9pbnRlcgorCWJub25lCWE5LCBhNSwgLkx6MAkJIyBpZiBieXRlIDAgaXMgemVybworCWJub25lCWE5LCBhNiwgLkx6MQkJIyBpZiBieXRlIDEgaXMgemVybworCWJub25lCWE5LCBhNywgLkx6MgkJIyBpZiBieXRlIDIgaXMgemVybworCUVYKHMzMmksIGE5LCBhMTEsIDAsIGZpeHVwX3MpCSMgc3RvcmUgd29yZCB0byBkc3QKKwlibm9uZQlhOSwgYTgsIC5MejMJCSMgaWYgYnl0ZSAzIGlzIHplcm8KKwlhZGRpCWExMSwgYTExLCA0CQkjIGFkdmFuY2UgZHN0IHBvaW50ZXIKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCWJsdAlhMTEsIGExMiwgLkxvb3AxCisjZW5kaWYKKworLkxvb3AxZG9uZToKKwliYmNpLmwJYTQsIDEsIC5MMTAwCisJIyBjb3B5IDIgYnl0ZXMKKwlFWChsMTZ1aSwgYTksIGEzLCAwLCBmaXh1cF9sKQorCWFkZGkJYTMsIGEzLCAyCQkjIGFkdmFuY2Ugc3JjIHBvaW50ZXIKKyNpZmRlZiBfX1hURU5TQV9FQl9fCisJYm5vbmUJYTksIGE3LCAuTHowCQkjIGlmIGJ5dGUgMiBpcyB6ZXJvCisJYm5vbmUJYTksIGE4LCAuTHoxCQkjIGlmIGJ5dGUgMyBpcyB6ZXJvCisjZWxzZQorCWJub25lCWE5LCBhNSwgLkx6MAkJIyBpZiBieXRlIDAgaXMgemVybworCWJub25lCWE5LCBhNiwgLkx6MQkJIyBpZiBieXRlIDEgaXMgemVybworI2VuZGlmCisJRVgoczE2aSwgYTksIGExMSwgMCwgZml4dXBfcykKKwlhZGRpCWExMSwgYTExLCAyCQkjIGFkdmFuY2UgZHN0IHBvaW50ZXIKKy5MMTAwOgorCWJiY2kubAlhNCwgMCwgLkxyZXQKKwlFWChsOHVpLCBhOSwgYTMsIDAsIGZpeHVwX2wpCisJLyogc2xvdCAqLworCUVYKHM4aSwgYTksIGExMSwgMCwgZml4dXBfcykKKwliZXF6CWE5LCAuTHJldAkJIyBpZiBieXRlIGlzIHplcm8KKwlhZGRpCWExMSwgYTExLCAxLTMJCSMgYWR2YW5jZSBkc3QgcHRyIDEsIGJ1dCBhbHNvIGNhbmNlbAorCQkJCQkjIHRoZSBlZmZlY3Qgb2YgYWRkaW5nIDMgaW4gLkx6MyBjb2RlCisJLyogZmFsbCB0aHJ1IHRvIC5MejMgYW5kICJyZXR3IiAqLworCisuTHozOgkjIGJ5dGUgMyBpcyB6ZXJvCisJYWRkaQlhMTEsIGExMSwgMwkJIyBhZHZhbmNlIGRzdCBwb2ludGVyCisJc3ViCWEyLCBhMTEsIGEyCQkjIGNvbXB1dGUgc3RybGVuCisJcmV0dworLkx6MDoJIyBieXRlIDAgaXMgemVybworI2lmZGVmIF9fWFRFTlNBX0VCX18KKwltb3ZpCWE5LCAwCisjZW5kaWYgLyogX19YVEVOU0FfRUJfXyAqLworCUVYKHM4aSwgYTksIGExMSwgMCwgZml4dXBfcykKKwlzdWIJYTIsIGExMSwgYTIJCSMgY29tcHV0ZSBzdHJsZW4KKwlyZXR3CisuTHoxOgkjIGJ5dGUgMSBpcyB6ZXJvCisjaWZkZWYgX19YVEVOU0FfRUJfXworICAgICAgICBleHR1aSAgIGE5LCBhOSwgMTYsIDE2CisjZW5kaWYgLyogX19YVEVOU0FfRUJfXyAqLworCUVYKHMxNmksIGE5LCBhMTEsIDAsIGZpeHVwX3MpCisJYWRkaQlhMTEsIGExMSwgMQkJIyBhZHZhbmNlIGRzdCBwb2ludGVyCisJc3ViCWEyLCBhMTEsIGEyCQkjIGNvbXB1dGUgc3RybGVuCisJcmV0dworLkx6MjoJIyBieXRlIDIgaXMgemVybworI2lmZGVmIF9fWFRFTlNBX0VCX18KKyAgICAgICAgZXh0dWkgICBhOSwgYTksIDE2LCAxNgorI2VuZGlmIC8qIF9fWFRFTlNBX0VCX18gKi8KKwlFWChzMTZpLCBhOSwgYTExLCAwLCBmaXh1cF9zKQorCW1vdmkJYTksIDAKKwlFWChzOGksIGE5LCBhMTEsIDIsIGZpeHVwX3MpCisJYWRkaQlhMTEsIGExMSwgMgkJIyBhZHZhbmNlIGRzdCBwb2ludGVyCisJc3ViCWEyLCBhMTEsIGEyCQkjIGNvbXB1dGUgc3RybGVuCisJcmV0dworCisJLmFsaWduCTQJCSMgMSBtb2QgNCBhbGlnbm1lbnQgZm9yIExPT1BORVoKKwkuYnl0ZQkwCQkjICgwIG1vZCA0IGFsaWdubWVudCBmb3IgTEJFRykKKy5MZHN0dW5hbGlnbmVkOgorLyoKKyAqIGZvciBub3cganVzdCB1c2UgYnl0ZSBjb3B5IGxvb3AKKyAqLworI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wbmV6CWE0LCAuTHVuYWxpZ25lZGVuZAorI2Vsc2UKKwliZXF6CWE0LCAuTHVuYWxpZ25lZGVuZAorCWFkZAlhMTIsIGExMSwgYTQJCSMgYTEyID0gZW5kaW5nIGFkZHJlc3MKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCisuTG5leHRieXRlOgorCUVYKGw4dWksIGE5LCBhMywgMCwgZml4dXBfbCkKKwlhZGRpCWEzLCBhMywgMQorCUVYKHM4aSwgYTksIGExMSwgMCwgZml4dXBfcykKKwliZXF6CWE5LCAuTHVuYWxpZ25lZGVuZAorCWFkZGkJYTExLCBhMTEsIDEKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCWJsdAlhMTEsIGExMiwgLkxuZXh0Ynl0ZQorI2VuZGlmCisKKy5MdW5hbGlnbmVkZW5kOgorCXN1YglhMiwgYTExLCBhMgkJIyBjb21wdXRlIHN0cmxlbgorCXJldHcKKworCisJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCisJLmFsaWduCTQKKworCS8qIEZvciBub3csIGp1c3QgcmV0dXJuIC1FRkFVTFQuICBGdXR1cmUgaW1wbGVtZW50YXRpb25zIG1pZ2h0CisJICogbGlrZSB0byBjbGVhciByZW1haW5pbmcga2VybmVsIHNwYWNlLCBsaWtlIHRoZSBmaXh1cAorCSAqIGltcGxlbWVudGF0aW9uIGluIG1lbXNldCgpLiAgVGh1cywgd2UgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCisJICogbG9hZC9zdG9yZSBmaXh1cHMuICovCisKK2ZpeHVwX3M6CitmaXh1cF9sOgorCW1vdmkJYTIsIC1FRkFVTFQKKwlyZXR3CisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUyBiL2FyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGZmNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbGliL3N0cm5sZW5fdXNlci5TCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogIGFyY2gveHRlbnNhL2xpYi9zdHJubGVuX3VzZXIuUworICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiAgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBSZXR1cm5zIHN0cm5sZW4sIGluY2x1ZGluZyB0cmFpbGluZyB6ZXJvIHRlcm1pbmF0b3IuCisgKiAgWmVybyBpbmRpY2F0ZXMgZXJyb3IuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpbmNsdWRlIDx4dGVuc2EvY29yZWFzbS5oPgorCisvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCisKKyNkZWZpbmUgRVgoaW5zbixyZWcxLHJlZzIsb2Zmc2V0LGhhbmRsZXIpCVwKKzk6CWluc24JcmVnMSwgcmVnMiwgb2Zmc2V0OwkJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIjsJCVwKKwkud29yZAk5YiwgaGFuZGxlcjsJCQlcCisJLnByZXZpb3VzCisKKy8qCisgKiBzaXplX3QgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbikKKyAqLworLnRleHQKKy5iZWdpbiBsaXRlcmFsCisuYWxpZ24JNAorLkxtYXNrMDoKKwkuYnl0ZQkweGZmLCAweDAwLCAweDAwLCAweDAwCisuTG1hc2sxOgorCS5ieXRlCTB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAKKy5MbWFzazI6CisJLmJ5dGUJMHgwMCwgMHgwMCwgMHhmZiwgMHgwMAorLkxtYXNrMzoKKwkuYnl0ZQkweDAwLCAweDAwLCAweDAwLCAweGZmCisuZW5kIGxpdGVyYWwKKworIyBSZWdpc3RlciB1c2U6CisjICAgYTIvIHNyYworIyAgIGEzLyBsZW4KKyMgICBhNC8gdG1wCisjICAgYTUvIG1hc2swCisjICAgYTYvIG1hc2sxCisjICAgYTcvIG1hc2syCisjICAgYTgvIG1hc2szCisjICAgYTkvIHRtcAorIyAgIGExMC8gdG1wCisKKy5hbGlnbgk0CisuZ2xvYmFsCV9fc3Rybmxlbl91c2VyCisudHlwZQlfX3N0cm5sZW5fdXNlcixAZnVuY3Rpb24KK19fc3Rybmxlbl91c2VyOgorCWVudHJ5CXNwLCAxNgkJIyBtaW5pbWFsIHN0YWNrIGZyYW1lCisJIyBhMi8gcywgYTMvIGxlbgorCWFkZGkJYTQsIGEyLCAtNAkjIGJlY2F1c2Ugd2Ugb3ZlcmluY3JlbWVudCBhdCB0aGUgZW5kOworCQkJCSMgd2UgY29tcGVuc2F0ZSB3aXRoIGxvYWQgb2Zmc2V0cyBvZiA0CisJbDMycglhNSwgLkxtYXNrMAkjIG1hc2sgZm9yIGJ5dGUgMAorCWwzMnIJYTYsIC5MbWFzazEJIyBtYXNrIGZvciBieXRlIDEKKwlsMzJyCWE3LCAuTG1hc2syCSMgbWFzayBmb3IgYnl0ZSAyCisJbDMycglhOCwgLkxtYXNrMwkjIG1hc2sgZm9yIGJ5dGUgMworCWJic2kubAlhMiwgMCwgLkwxbW9kMgkjIGlmIG9ubHkgIDgtYml0IGFsaWduZWQKKwliYnNpLmwJYTIsIDEsIC5MMm1vZDQJIyBpZiBvbmx5IDE2LWJpdCBhbGlnbmVkCisKKy8qCisgKiBTdHJpbmcgaXMgd29yZC1hbGlnbmVkLgorICovCisuTGFsaWduZWQ6CisJc3JsaQlhMTAsIGEzLCAyCSMgbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyB3aXRoIDRCIHBlciBsb29wCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BuZXoJYTEwLCAuTGRvbmUKKyNlbHNlCisJYmVxeglhMTAsIC5MZG9uZQorCXNsbGkJYTEwLCBhMTAsIDIKKwlhZGQJYTEwLCBhMTAsIGE0CSMgYTEwID0gZW5kIG9mIGxhc3QgNEIgY2h1bmsKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCisuTG9vcDoKKwlFWChsMzJpLCBhOSwgYTQsIDQsIGxlbmZpeHVwKQkjIGdldCBuZXh0IHdvcmQgb2Ygc3RyaW5nCisJYWRkaQlhNCwgYTQsIDQJCSMgYWR2YW5jZSBzdHJpbmcgcG9pbnRlcgorCWJub25lCWE5LCBhNSwgLkx6MAkJIyBpZiBieXRlIDAgaXMgemVybworCWJub25lCWE5LCBhNiwgLkx6MQkJIyBpZiBieXRlIDEgaXMgemVybworCWJub25lCWE5LCBhNywgLkx6MgkJIyBpZiBieXRlIDIgaXMgemVybworCWJub25lCWE5LCBhOCwgLkx6MwkJIyBpZiBieXRlIDMgaXMgemVybworI2lmICFYQ0hBTF9IQVZFX0xPT1BTCisJYmx0CWE0LCBhMTAsIC5Mb29wCisjZW5kaWYKKworLkxkb25lOgorCUVYKGwzMmksIGE5LCBhNCwgNCwgbGVuZml4dXApCSMgbG9hZCA0IGJ5dGVzIGZvciByZW1haW5pbmcgY2hlY2tzCisKKwliYmNpLmwJYTMsIDEsIC5MMTAwCisJIyBjaGVjayB0d28gbW9yZSBieXRlcyAoYnl0ZXMgMCwgMSBvZiB3b3JkKQorCWFkZGkJYTQsIGE0LCAyCSMgYWR2YW5jZSBzdHJpbmcgcG9pbnRlcgorCWJub25lCWE5LCBhNSwgLkx6MAkjIGlmIGJ5dGUgMCBpcyB6ZXJvCisJYm5vbmUJYTksIGE2LCAuTHoxCSMgaWYgYnl0ZSAxIGlzIHplcm8KKy5MMTAwOgorCWJiY2kubAlhMywgMCwgLkwxMDEKKwkjIGNoZWNrIG9uZSBtb3JlIGJ5dGUgKGJ5dGUgMiBvZiB3b3JkKQorCSMgQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgdG8gY2hlY2suICBaZXJvIG9yIG5vbnplcm8sIHdlJ2xsIGFkZCBvbmUuCisJIyBEbyBub3QgYWRkIGFuIGV4dHJhIG9uZSBmb3IgdGhlIE5VTEwgdGVybWluYXRvciBzaW5jZSB3ZSBoYXZlCisJIyAgZXhoYXVzdGVkIHRoZSBvcmlnaW5hbCBsZW4gcGFyYW1ldGVyLgorCWFkZGkJYTQsIGE0LCAxCSMgYWR2YW5jZSBzdHJpbmcgcG9pbnRlcgorLkwxMDE6CisJc3ViCWEyLCBhNCwgYTIJIyBjb21wdXRlIGxlbmd0aAorCXJldHcKKworIyBOT1RFIHRoYXQgaW4gc2V2ZXJhbCBwbGFjZXMgYmVsb3csIHdlIHBvaW50IHRvIHRoZSBieXRlIGp1c3QgYWZ0ZXIKKyMgdGhlIHplcm8gYnl0ZSBpbiBvcmRlciB0byBpbmNsdWRlIHRoZSBOVUxMIHRlcm1pbmF0b3IgaW4gdGhlIGNvdW50LgorCisuTHozOgkjIGJ5dGUgMyBpcyB6ZXJvCisJYWRkaQlhNCwgYTQsIDMJIyBwb2ludCB0byB6ZXJvIGJ5dGUKKy5MejA6CSMgYnl0ZSAwIGlzIHplcm8KKwlhZGRpCWE0LCBhNCwgMQkjIHBvaW50IGp1c3QgYmV5b25kIHplcm8gYnl0ZQorCXN1YglhMiwgYTQsIGEyCSMgc3VidHJhY3QgdG8gZ2V0IGxlbmd0aAorCXJldHcKKy5MejE6CSMgYnl0ZSAxIGlzIHplcm8KKwlhZGRpCWE0LCBhNCwgMSsxCSMgcG9pbnQganVzdCBiZXlvbmQgemVybyBieXRlCisJc3ViCWEyLCBhNCwgYTIJIyBzdWJ0cmFjdCB0byBnZXQgbGVuZ3RoCisJcmV0dworLkx6MjoJIyBieXRlIDIgaXMgemVybworCWFkZGkJYTQsIGE0LCAyKzEJIyBwb2ludCBqdXN0IGJleW9uZCB6ZXJvIGJ5dGUKKwlzdWIJYTIsIGE0LCBhMgkjIHN1YnRyYWN0IHRvIGdldCBsZW5ndGgKKwlyZXR3CisKKy5MMW1vZDI6CSMgYWRkcmVzcyBpcyBvZGQKKwlFWChsOHVpLCBhOSwgYTQsIDQsIGxlbmZpeHVwKQkjIGdldCBieXRlIDAKKwlhZGRpCWE0LCBhNCwgMQkJIyBhZHZhbmNlIHN0cmluZyBwb2ludGVyCisJYmVxeglhOSwgLkx6MwkJIyBpZiBieXRlIDAgaXMgemVybworCWJiY2kubAlhNCwgMSwgLkxhbGlnbmVkCSMgaWYgc3RyaW5nIHBvaW50ZXIgaXMgbm93IHdvcmQtYWxpZ25lZAorCisuTDJtb2Q0OgkjIGFkZHJlc3MgaXMgMiBtb2QgNAorCWFkZGkJYTQsIGE0LCAyCSMgYWR2YW5jZSBwdHIgZm9yIGFsaWduZWQgYWNjZXNzCisJRVgobDMyaSwgYTksIGE0LCAwLCBsZW5maXh1cCkJIyBnZXQgd29yZCB3aXRoIGZpcnN0IHR3byBieXRlcyBvZiBzdHJpbmcKKwlibm9uZQlhOSwgYTcsIC5MejIJIyBpZiBieXRlIDIgKG9mIHdvcmQsIG5vdCBzdHJpbmcpIGlzIHplcm8KKwliYW55CWE5LCBhOCwgLkxhbGlnbmVkICMgaWYgYnl0ZSAzIChvZiB3b3JkLCBub3Qgc3RyaW5nKSBpcyBub256ZXJvCisJIyBieXRlIDMgaXMgemVybworCWFkZGkJYTQsIGE0LCAzKzEJIyBwb2ludCBqdXN0IGJleW9uZCB6ZXJvIGJ5dGUKKwlzdWIJYTIsIGE0LCBhMgkjIHN1YnRyYWN0IHRvIGdldCBsZW5ndGgKKwlyZXR3CisKKwkuc2VjdGlvbiAuZml4dXAsICJheCIKKwkuYWxpZ24JNAorbGVuZml4dXA6CisJbW92aQlhMiwgMAorCXJldHcKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMgYi9hcmNoL3h0ZW5zYS9saWIvdXNlcmNvcHkuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVkYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKQEAgLTAsMCArMSwzMjEgQEAKKy8qCisgKiAgYXJjaC94dGVuc2EvbGliL3VzZXJjb3B5LlMKKyAqCisgKiAgQ29weSB0by9mcm9tIHVzZXIgc3BhY2UgKGRlcml2ZWQgZnJvbSBhcmNoL3h0ZW5zYS9saWIvaGFsL21lbWNvcHkuUykKKyAqCisgKiAgRE8gTk9UIENPTUJJTkUgdGhpcyBmdW5jdGlvbiB3aXRoIDxhcmNoL3h0ZW5zYS9saWIvaGFsL21lbWNvcHkuUz4uCisgKiAgSXQgbmVlZHMgdG8gcmVtYWluIHNlcGFyYXRlIGFuZCBkaXN0aW5jdC4gIFRoZSBoYWwgZmlsZXMgYXJlIHBhcnQKKyAqICBvZiB0aGUgdGhlIFh0ZW5zYSBsaW5rLXRpbWUgSEFMLCBhbmQgdGhvc2UgZmlsZXMgbWF5IGRpZmZlciBwZXIKKyAqICBwcm9jZXNzb3IgY29uZmlndXJhdGlvbi4gIFBhdGNoaW5nIHRoZSBrZXJuZWwgZm9yIGFub3RoZXIKKyAqICBwcm9jZXNzb3IgY29uZmlndXJhdGlvbiBpbmNsdWRlcyByZXBsYWNpbmcgdGhlIGhhbCBmaWxlcywgYW5kIHdlCisgKiAgY291bGQgbG9vc2UgdGhlIHNwZWNpYWwgZnVuY3Rpb25hbGl0eSBmb3IgYWNjZXNzaW5nIHVzZXItc3BhY2UKKyAqICBtZW1vcnkgZHVyaW5nIHN1Y2ggYSBwYXRjaC4gIFdlIHNhY3JpZmljZSBhIGxpdHRsZSBjb2RlIHNwYWNlIGhlcmUKKyAqICBpbiBmYXZvciB0byBzaW1wbGlmeSBjb2RlIG1haW50ZW5hbmNlLgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiAgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KKyAqLworCisKKy8qCisgKiBzaXplX3QgX194dGVuc2FfY29weV91c2VyICh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbik7CisgKgorICogVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbm90IGNvcGllZC4gIEltcGxpZXMgemVybworICogaXMgc3VjY2Vzcy4KKyAqCisgKiBUaGUgZ2VuZXJhbCBjYXNlIGFsZ29yaXRobSBpcyBhcyBmb2xsb3dzOgorICogICBJZiB0aGUgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBhcmUgYm90aCBhbGlnbmVkLAorICogICAgIGRvIDE2QiBjaHVua3Mgd2l0aCBhIGxvb3AsIGFuZCB0aGVuIGZpbmlzaCB1cCB3aXRoCisgKiAgICAgOEIsIDRCLCAyQiwgYW5kIDFCIGNvcGllcyBjb25kaXRpb25hbCBvbiB0aGUgbGVuZ3RoLgorICogICBJZiBkZXN0aW5hdGlvbiBpcyBhbGlnbmVkIGFuZCBzb3VyY2UgdW5hbGlnbmVkLAorICogICAgIGRvIHRoZSBzYW1lLCBidXQgdXNlIFNSQyB0byBhbGlnbiB0aGUgc291cmNlIGRhdGEuCisgKiAgIElmIGRlc3RpbmF0aW9uIGlzIHVuYWxpZ25lZCwgYWxpZ24gaXQgYnkgY29uZGl0aW9uYWxseQorICogICAgIGNvcHlpbmcgMUIgYW5kIDJCIGFuZCB0aGVuIHJldGVzdC4KKyAqICAgVGhpcyBjb2RlIHRyaWVzIHRvIHVzZSBmYWxsLXRocm91Z2ggYnJhY2hlcyBmb3IgdGhlIGNvbW1vbgorICogICAgIGNhc2Ugb2YgYWxpZ25lZCBkZXN0aW5hdGlvbnMgKGV4Y2VwdCBmb3IgdGhlIGJyYW5jaGVzIHRvCisgKiAgICAgdGhlIGFsaWdubWVudCBsYWJlbCkuCisgKgorICogUmVnaXN0ZXIgdXNlOgorICoJYTAvIHJldHVybiBhZGRyZXNzCisgKglhMS8gc3RhY2sgcG9pbnRlcgorICoJYTIvIHJldHVybiB2YWx1ZQorICoJYTMvIHNyYworICoJYTQvIGxlbmd0aAorICoJYTUvIGRzdAorICoJYTYvIHRtcAorICoJYTcvIHRtcAorICoJYTgvIHRtcAorICoJYTkvIHRtcAorICoJYTEwLyB0bXAKKyAqCWExMS8gb3JpZ2luYWwgbGVuZ3RoCisgKi8KKworI2luY2x1ZGUgPHh0ZW5zYS9jb3JlYXNtLmg+CisKKyNpZmRlZiBfX1hURU5TQV9FQl9fCisjZGVmaW5lIEFMSUdOKFIsIFcwLCBXMSkgc3JjCVIsIFcwLCBXMQorI2RlZmluZSBTU0E4KFIpCXNzYThiIFIKKyNlbHNlCisjZGVmaW5lIEFMSUdOKFIsIFcwLCBXMSkgc3JjCVIsIFcxLCBXMAorI2RlZmluZSBTU0E4KFIpCXNzYThsIFIKKyNlbmRpZgorCisvKiBMb2FkIG9yIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBjYXVzZSBleGNlcHRpb25zIHVzZSB0aGUgRVggbWFjcm8uICovCisKKyNkZWZpbmUgRVgoaW5zbixyZWcxLHJlZzIsb2Zmc2V0LGhhbmRsZXIpCVwKKzk6CWluc24JcmVnMSwgcmVnMiwgb2Zmc2V0OwkJXAorCS5zZWN0aW9uIF9fZXhfdGFibGUsICJhIjsJCVwKKwkud29yZAk5YiwgaGFuZGxlcjsJCQlcCisJLnByZXZpb3VzCisKKworCS50ZXh0CisJLmFsaWduCTQKKwkuZ2xvYmFsCV9feHRlbnNhX2NvcHlfdXNlcgorCS50eXBlCV9feHRlbnNhX2NvcHlfdXNlcixAZnVuY3Rpb24KK19feHRlbnNhX2NvcHlfdXNlcjoKKwllbnRyeQlzcCwgMTYJCSMgbWluaW1hbCBzdGFjayBmcmFtZQorCSMgYTIvIGRzdCwgYTMvIHNyYywgYTQvIGxlbgorCW1vdglhNSwgYTIJCSMgY29weSBkc3Qgc28gdGhhdCBhMiBpcyByZXR1cm4gdmFsdWUKKwltb3YJYTExLCBhNAkJIyBwcmVzZXJ2ZSBvcmlnaW5hbCBsZW4gZm9yIGVycm9yIGNhc2UKKy5MY29tbW9uOgorCWJic2kubAlhMiwgMCwgLkxkc3QxbW9kMiAjIGlmIGRzdCBpcyAxIG1vZCAyCisJYmJzaS5sCWEyLCAxLCAuTGRzdDJtb2Q0ICMgaWYgZHN0IGlzIDIgbW9kIDQKKy5MZHN0YWxpZ25lZDoJIyByZXR1cm4gaGVyZSBmcm9tIC5MZHN0dW5hbGlnbmVkIHdoZW4gZHN0IGlzIGFsaWduZWQKKwlzcmxpCWE3LCBhNCwgNAkjIG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMgd2l0aCAxNkIKKwkJCQkjIHBlciBpdGVyYXRpb24KKwltb3ZpCWE4LCAzCQkgICMgaWYgc291cmNlIGlzIGFsc28gYWxpZ25lZCwKKwlibm9uZQlhMywgYTgsIC5MYWxpZ25lZCAjIHRoZW4gdXNlIHdvcmQgY29weQorCVNTQTgoCWEzKQkJIyBzZXQgc2hpZnQgYW1vdW50IGZyb20gYnl0ZSBvZmZzZXQKKwlibmV6CWE0LCAuTHNyY3VuYWxpZ25lZAorCW1vdmkJYTIsIDAJCSMgcmV0dXJuIHN1Y2Nlc3MgZm9yIGxlbj09MAorCXJldHcKKworLyoKKyAqIERlc3RpbmF0aW9uIGlzIHVuYWxpZ25lZAorICovCisKKy5MZHN0MW1vZDI6CSMgZHN0IGlzIG9ubHkgYnl0ZSBhbGlnbmVkCisJYmx0dWkJYTQsIDcsIC5MYnl0ZWNvcHkJIyBkbyBzaG9ydCBjb3BpZXMgYnl0ZSBieSBieXRlCisKKwkjIGNvcHkgMSBieXRlCisJRVgobDh1aSwgYTYsIGEzLCAwLCBsX2ZpeHVwKQorCWFkZGkJYTMsIGEzLCAgMQorCUVYKHM4aSwgYTYsIGE1LCAgMCwgc19maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDEKKwlhZGRpCWE0LCBhNCwgLTEKKwliYmNpLmwJYTUsIDEsIC5MZHN0YWxpZ25lZAkjIGlmIGRzdCBpcyBub3cgYWxpZ25lZCwgdGhlbgorCQkJCQkjIHJldHVybiB0byBtYWluIGFsZ29yaXRobQorLkxkc3QybW9kNDoJIyBkc3QgMTYtYml0IGFsaWduZWQKKwkjIGNvcHkgMiBieXRlcworCWJsdHVpCWE0LCA2LCAuTGJ5dGVjb3B5CSMgZG8gc2hvcnQgY29waWVzIGJ5dGUgYnkgYnl0ZQorCUVYKGw4dWksIGE2LCBhMywgMCwgbF9maXh1cCkKKwlFWChsOHVpLCBhNywgYTMsIDEsIGxfZml4dXApCisJYWRkaQlhMywgYTMsICAyCisJRVgoczhpLCBhNiwgYTUsICAwLCBzX2ZpeHVwKQorCUVYKHM4aSwgYTcsIGE1LCAgMSwgc19maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDIKKwlhZGRpCWE0LCBhNCwgLTIKKwlqCS5MZHN0YWxpZ25lZAkjIGRzdCBpcyBub3cgYWxpZ25lZCwgcmV0dXJuIHRvIG1haW4gYWxnb3JpdGhtCisKKy8qCisgKiBCeXRlIGJ5IGJ5dGUgY29weQorICovCisJLmFsaWduCTQKKwkuYnl0ZQkwCQkjIDEgbW9kIDQgYWxpZ25tZW50IGZvciBMT09QTkVaCisJCQkJIyAoMCBtb2QgNCBhbGlnbm1lbnQgZm9yIExCRUcpCisuTGJ5dGVjb3B5OgorI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wbmV6CWE0LCAuTGJ5dGVjb3B5ZG9uZQorI2Vsc2UgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKwliZXF6CWE0LCAuTGJ5dGVjb3B5ZG9uZQorCWFkZAlhNywgYTMsIGE0CSMgYTcgPSBlbmQgYWRkcmVzcyBmb3Igc291cmNlCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5MbmV4dGJ5dGU6CisJRVgobDh1aSwgYTYsIGEzLCAwLCBsX2ZpeHVwKQorCWFkZGkJYTMsIGEzLCAxCisJRVgoczhpLCBhNiwgYTUsIDAsIHNfZml4dXApCisJYWRkaQlhNSwgYTUsIDEKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCWJsdAlhMywgYTcsIC5MbmV4dGJ5dGUKKyNlbmRpZiAvKiAhWENIQUxfSEFWRV9MT09QUyAqLworLkxieXRlY29weWRvbmU6CisJbW92aQlhMiwgMAkJIyByZXR1cm4gc3VjY2VzcyBmb3IgbGVuIGJ5dGVzIGNvcGllZAorCXJldHcKKworLyoKKyAqIERlc3RpbmF0aW9uIGFuZCBzb3VyY2UgYXJlIHdvcmQtYWxpZ25lZC4KKyAqLworCSMgY29weSAxNiBieXRlcyBwZXIgaXRlcmF0aW9uIGZvciB3b3JkLWFsaWduZWQgZHN0IGFuZCB3b3JkLWFsaWduZWQgc3JjCisJLmFsaWduCTQJCSMgMSBtb2QgNCBhbGlnbm1lbnQgZm9yIExPT1BORVoKKwkuYnl0ZQkwCQkjICgwIG1vZCA0IGFsaWdubWVudCBmb3IgTEJFRykKKy5MYWxpZ25lZDoKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJbG9vcG5leglhNywgLkxvb3AxZG9uZQorI2Vsc2UgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKwliZXF6CWE3LCAuTG9vcDFkb25lCisJc2xsaQlhOCwgYTcsIDQKKwlhZGQJYTgsIGE4LCBhMwkjIGE4ID0gZW5kIG9mIGxhc3QgMTZCIHNvdXJjZSBjaHVuaworI2VuZGlmIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisuTG9vcDE6CisJRVgobDMyaSwgYTYsIGEzLCAgMCwgbF9maXh1cCkKKwlFWChsMzJpLCBhNywgYTMsICA0LCBsX2ZpeHVwKQorCUVYKHMzMmksIGE2LCBhNSwgIDAsIHNfZml4dXApCisJRVgobDMyaSwgYTYsIGEzLCAgOCwgbF9maXh1cCkKKwlFWChzMzJpLCBhNywgYTUsICA0LCBzX2ZpeHVwKQorCUVYKGwzMmksIGE3LCBhMywgMTIsIGxfZml4dXApCisJRVgoczMyaSwgYTYsIGE1LCAgOCwgc19maXh1cCkKKwlhZGRpCWEzLCBhMywgMTYKKwlFWChzMzJpLCBhNywgYTUsIDEyLCBzX2ZpeHVwKQorCWFkZGkJYTUsIGE1LCAxNgorI2lmICFYQ0hBTF9IQVZFX0xPT1BTCisJYmx0CWEzLCBhOCwgLkxvb3AxCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5Mb29wMWRvbmU6CisJYmJjaS5sCWE0LCAzLCAuTDIKKwkjIGNvcHkgOCBieXRlcworCUVYKGwzMmksIGE2LCBhMywgIDAsIGxfZml4dXApCisJRVgobDMyaSwgYTcsIGEzLCAgNCwgbF9maXh1cCkKKwlhZGRpCWEzLCBhMywgIDgKKwlFWChzMzJpLCBhNiwgYTUsICAwLCBzX2ZpeHVwKQorCUVYKHMzMmksIGE3LCBhNSwgIDQsIHNfZml4dXApCisJYWRkaQlhNSwgYTUsICA4CisuTDI6CisJYmJjaS5sCWE0LCAyLCAuTDMKKwkjIGNvcHkgNCBieXRlcworCUVYKGwzMmksIGE2LCBhMywgIDAsIGxfZml4dXApCisJYWRkaQlhMywgYTMsICA0CisJRVgoczMyaSwgYTYsIGE1LCAgMCwgc19maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDQKKy5MMzoKKwliYmNpLmwJYTQsIDEsIC5MNAorCSMgY29weSAyIGJ5dGVzCisJRVgobDE2dWksIGE2LCBhMywgIDAsIGxfZml4dXApCisJYWRkaQlhMywgYTMsICAyCisJRVgoczE2aSwgIGE2LCBhNSwgIDAsIHNfZml4dXApCisJYWRkaQlhNSwgYTUsICAyCisuTDQ6CisJYmJjaS5sCWE0LCAwLCAuTDUKKwkjIGNvcHkgMSBieXRlCisJRVgobDh1aSwgYTYsIGEzLCAgMCwgbF9maXh1cCkKKwlFWChzOGksICBhNiwgYTUsICAwLCBzX2ZpeHVwKQorLkw1OgorCW1vdmkJYTIsIDAJCSMgcmV0dXJuIHN1Y2Nlc3MgZm9yIGxlbiBieXRlcyBjb3BpZWQKKwlyZXR3CisKKy8qCisgKiBEZXN0aW5hdGlvbiBpcyBhbGlnbmVkLCBTb3VyY2UgaXMgdW5hbGlnbmVkCisgKi8KKworCS5hbGlnbgk0CisJLmJ5dGUJMAkJIyAxIG1vZCA0IGFsaWduZW1lbnQgZm9yIExPT1BORVoKKwkJCQkjICgwIG1vZCA0IGFsaWdubWVudCBmb3IgTEJFRykKKy5Mc3JjdW5hbGlnbmVkOgorCSMgY29weSAxNiBieXRlcyBwZXIgaXRlcmF0aW9uIGZvciB3b3JkLWFsaWduZWQgZHN0IGFuZCB1bmFsaWduZWQgc3JjCisJYW5kCWExMCwgYTMsIGE4CSMgc2F2ZSB1bmFsaWdubWVudCBvZmZzZXQgZm9yIGJlbG93CisJc3ViCWEzLCBhMywgYTEwCSMgYWxpZ24gYTMgKHRvIGF2b2lkIHNpbSB3YXJuaW5ncyBvbmx5OyBub3QgbmVlZGVkIGZvciBoYXJkd2FyZSkKKwlFWChsMzJpLCBhNiwgYTMsIDAsIGxfZml4dXApCSMgbG9hZCBmaXJzdCB3b3JkCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BuZXoJYTcsIC5Mb29wMmRvbmUKKyNlbHNlIC8qICFYQ0hBTF9IQVZFX0xPT1BTICovCisJYmVxeglhNywgLkxvb3AyZG9uZQorCXNsbGkJYTEwLCBhNywgNAorCWFkZAlhMTAsIGExMCwgYTMJIyBhMTAgPSBlbmQgb2YgbGFzdCAxNkIgc291cmNlIGNodW5rCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5Mb29wMjoKKwlFWChsMzJpLCBhNywgYTMsICA0LCBsX2ZpeHVwKQorCUVYKGwzMmksIGE4LCBhMywgIDgsIGxfZml4dXApCisJQUxJR04oCWE2LCBhNiwgYTcpCisJRVgoczMyaSwgYTYsIGE1LCAgMCwgc19maXh1cCkKKwlFWChsMzJpLCBhOSwgYTMsIDEyLCBsX2ZpeHVwKQorCUFMSUdOKAlhNywgYTcsIGE4KQorCUVYKHMzMmksIGE3LCBhNSwgIDQsIHNfZml4dXApCisJRVgobDMyaSwgYTYsIGEzLCAxNiwgbF9maXh1cCkKKwlBTElHTigJYTgsIGE4LCBhOSkKKwlFWChzMzJpLCBhOCwgYTUsICA4LCBzX2ZpeHVwKQorCWFkZGkJYTMsIGEzLCAxNgorCUFMSUdOKAlhOSwgYTksIGE2KQorCUVYKHMzMmksIGE5LCBhNSwgMTIsIHNfZml4dXApCisJYWRkaQlhNSwgYTUsIDE2CisjaWYgIVhDSEFMX0hBVkVfTE9PUFMKKwlibHQJYTMsIGExMCwgLkxvb3AyCisjZW5kaWYgLyogIVhDSEFMX0hBVkVfTE9PUFMgKi8KKy5Mb29wMmRvbmU6CisJYmJjaS5sCWE0LCAzLCAuTDEyCisJIyBjb3B5IDggYnl0ZXMKKwlFWChsMzJpLCBhNywgYTMsICA0LCBsX2ZpeHVwKQorCUVYKGwzMmksIGE4LCBhMywgIDgsIGxfZml4dXApCisJQUxJR04oCWE2LCBhNiwgYTcpCisJRVgoczMyaSwgYTYsIGE1LCAgMCwgc19maXh1cCkKKwlhZGRpCWEzLCBhMywgIDgKKwlBTElHTigJYTcsIGE3LCBhOCkKKwlFWChzMzJpLCBhNywgYTUsICA0LCBzX2ZpeHVwKQorCWFkZGkJYTUsIGE1LCAgOAorCW1vdglhNiwgYTgKKy5MMTI6CisJYmJjaS5sCWE0LCAyLCAuTDEzCisJIyBjb3B5IDQgYnl0ZXMKKwlFWChsMzJpLCBhNywgYTMsICA0LCBsX2ZpeHVwKQorCWFkZGkJYTMsIGEzLCAgNAorCUFMSUdOKAlhNiwgYTYsIGE3KQorCUVYKHMzMmksIGE2LCBhNSwgIDAsIHNfZml4dXApCisJYWRkaQlhNSwgYTUsICA0CisJbW92CWE2LCBhNworLkwxMzoKKwlhZGQJYTMsIGEzLCBhMTAJIyByZWFkanVzdCBhMyB3aXRoIGNvcnJlY3QgbWlzYWxpZ25tZW50CisJYmJjaS5sCWE0LCAxLCAuTDE0CisJIyBjb3B5IDIgYnl0ZXMKKwlFWChsOHVpLCBhNiwgYTMsICAwLCBsX2ZpeHVwKQorCUVYKGw4dWksIGE3LCBhMywgIDEsIGxfZml4dXApCisJYWRkaQlhMywgYTMsICAyCisJRVgoczhpLCBhNiwgYTUsICAwLCBzX2ZpeHVwKQorCUVYKHM4aSwgYTcsIGE1LCAgMSwgc19maXh1cCkKKwlhZGRpCWE1LCBhNSwgIDIKKy5MMTQ6CisJYmJjaS5sCWE0LCAwLCAuTDE1CisJIyBjb3B5IDEgYnl0ZQorCUVYKGw4dWksIGE2LCBhMywgIDAsIGxfZml4dXApCisJRVgoczhpLCAgYTYsIGE1LCAgMCwgc19maXh1cCkKKy5MMTU6CisJbW92aQlhMiwgMAkJIyByZXR1cm4gc3VjY2VzcyBmb3IgbGVuIGJ5dGVzIGNvcGllZAorCXJldHcKKworCisJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCisJLmFsaWduCTQKKworLyogYTIgPSBvcmlnaW5hbCBkc3Q7IGE1ID0gY3VycmVudCBkc3Q7IGExMT0gb3JpZ2luYWwgbGVuCisgKiBieXRlc19jb3BpZWQgPSBhNSAtIGEyCisgKiByZXR2YWwgPSBieXRlc19ub3RfY29waWVkID0gb3JpZ2luYWwgbGVuIC0gYnl0ZXNfY29waWVkCisgKiByZXR2YWwgPSBhMTEgLSAoYTUgLSBhMikKKyAqCisgKiBDbGVhcmluZyB0aGUgcmVtYWluaW5nIHBpZWNlcyBvZiBrZXJuZWwgbWVtb3J5IHBsdWdzIHNlY3VyaXR5CisgKiBob2xlcy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgKl96ZXJvaW5nCisgKiBmdW5jdGlvbnMgdGhhdCBzb21lIGFyY2hpdGVjdHVyZXMgcHJvdmlkZS4KKyAqLworCisuTG1lbXNldDoKKwkud29yZAltZW1zZXQKKworc19maXh1cDoKKwlzdWIJYTIsIGE1LCBhMgkvKiBhMiA8LS0gYnl0ZXMgY29waWVkICovCisJc3ViCWEyLCBhMTEsIGEyCS8qIGEyIDwtLSBieXRlcyBub3QgY29waWVkICovCisJcmV0dworCitsX2ZpeHVwOgorCXN1YglhMiwgYTUsIGEyCS8qIGEyIDwtLSBieXRlcyBjb3BpZWQgKi8KKwlzdWIJYTIsIGExMSwgYTIJLyogYTIgPC0tIGJ5dGVzIG5vdCBjb3BpZWQgPT0gcmV0dXJuIHZhbHVlICovCisKKwkvKiB2b2lkICptZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsgKi8KKwltb3YJYTYsIGE1CQkvKiBzICovCisJbW92aQlhNywgMAkJLyogYyAqLworCW1vdglhOCwgYTIJCS8qIG4gKi8KKwlsMzJyCWE0LCAuTG1lbXNldAorCWNhbGx4NAlhNAorCS8qIElnbm9yZSBtZW1zZXQgcmV0dXJuIHZhbHVlIGluIGE2LiAqLworCS8qIGEyIHN0aWxsIGNvbnRhaW5zIGJ5dGVzIG5vdCBjb3BpZWQuICovCisJcmV0dworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9tbS9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL21tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YWVkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9tbS9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXgvWHRlbnNhLXNwZWNpZmljIHBhcnRzIG9mIHRoZSBtZW1vcnkgbWFuYWdlci4KKyMKKyMgTm90ZSEgRGVwZW5kZW5jaWVzIGFyZSBkb25lIGF1dG9tYWdpY2FsbHkgYnkgJ21ha2UgZGVwJywgd2hpY2ggYWxzbworIyByZW1vdmVzIGFueSBvbGQgZGVwZW5kZW5jaWVzLiBET04nVCBwdXQgeW91ciBvd24gZGVwZW5kZW5jaWVzIGhlcmUKKyMgdW5sZXNzIGl0J3Mgc29tZXRoaW5nIHNwZWNpYWwgKGllIG5vdCBhIC5jIGZpbGUpLgorIworIyBOb3RlIDIhIFRoZSBDRkxBR1MgZGVmaW5pdGlvbiBpcyBub3cgaW4gdGhlIG1haW4gbWFrZWZpbGUuLi4KKworb2JqLXkJIDo9IGluaXQubyBmYXVsdC5vIHRsYi5vIG1pc2Mubworb2JqLW0JIDo9CitvYmotbgkgOj0KK29iai0JIDo9CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9tbS9mYXVsdC5jIGIvYXJjaC94dGVuc2EvbW0vZmF1bHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ1YTMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbW0vZmF1bHQuYwpAQCAtMCwwICsxLDI0MSBAQAorLy8gVE9ETyBWTV9FWEVDIGZsYWcgd29yay1hcm91bmQsIGNhY2hlIGFsaWFzaW5nCisvKgorICogYXJjaC94dGVuc2EvbW0vZmF1bHQuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqCisgKiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKiBKb2UgVGF5bG9yCTxqb2VAdGVuc2lsaWNhLmNvbSwgam9ldHlsckB5YWhvby5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisKK3Vuc2lnbmVkIGxvbmcgYXNpZF9jYWNoZSA9IEFTSURfRklSU1RfVkVSU0lPTjsKK3ZvaWQgYmFkX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MqLCB1bnNpZ25lZCBsb25nLCBpbnQpOworCisvKgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgcGFnZSBmYXVsdHMuICBJdCBkZXRlcm1pbmVzIHRoZSBhZGRyZXNzLAorICogYW5kIHRoZSBwcm9ibGVtLCBhbmQgdGhlbiBwYXNzZXMgaXQgb2ZmIHRvIG9uZSBvZiB0aGUgYXBwcm9wcmlhdGUKKyAqIHJvdXRpbmVzLgorICoKKyAqIE5vdGU6IGRvZXMgbm90IGhhbmRsZSBNaXNzIGFuZCBNdWx0aUhpdC4KKyAqLworCit2b2lkIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJdW5zaWduZWQgaW50IGV4Y2NhdXNlID0gcmVncy0+ZXhjY2F1c2U7CisJdW5zaWduZWQgaW50IGFkZHJlc3MgPSByZWdzLT5leGN2YWRkcjsKKwlzaWdpbmZvX3QgaW5mbzsKKworCWludCBpc193cml0ZSwgaXNfZXhlYzsKKworCWluZm8uc2lfY29kZSA9IFNFR1ZfTUFQRVJSOworCisJLyogV2UgZmF1bHQtaW4ga2VybmVsLXNwYWNlIHZpcnR1YWwgbWVtb3J5IG9uLWRlbWFuZC4gVGhlCisJICogJ3JlZmVyZW5jZScgcGFnZSB0YWJsZSBpcyBpbml0X21tLnBnZC4KKwkgKi8KKwlpZiAoYWRkcmVzcyA+PSBUQVNLX1NJWkUgJiYgIXVzZXJfbW9kZShyZWdzKSkKKwkJZ290byB2bWFsbG9jX2ZhdWx0OworCisJLyogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0IG9yIGhhdmUgbm8gdXNlcgorCSAqIGNvbnRleHQsIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0Li4KKwkgKi8KKwlpZiAoaW5fYXRvbWljKCkgfHwgIW1tKSB7CisJCWJhZF9wYWdlX2ZhdWx0KHJlZ3MsIGFkZHJlc3MsIFNJR1NFR1YpOworCQlyZXR1cm47CisJfQorCisJaXNfd3JpdGUgPSAoZXhjY2F1c2UgPT0gWENIQUxfRVhDQ0FVU0VfU1RPUkVfQ0FDSEVfQVRUUklCVVRFKSA/IDEgOiAwOworCWlzX2V4ZWMgPSAgKGV4Y2NhdXNlID09IFhDSEFMX0VYQ0NBVVNFX0lUTEJfUFJJVklMRUdFIHx8CisJCSAgICBleGNjYXVzZSA9PSBYQ0hBTF9FWENDQVVTRV9JVExCX01JU1MgfHwKKwkJICAgIGV4Y2NhdXNlID09IFhDSEFMX0VYQ0NBVVNFX0ZFVENIX0NBQ0hFX0FUVFJJQlVURSkgPyAxIDogMDsKKworI2lmIDAKKwlwcmludGsoIlslczolZDolMDh4OiVkOiUwOHg6JXMlc11cbiIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkgICAgICAgYWRkcmVzcywgZXhjY2F1c2UsIHJlZ3MtPnBjLCBpc193cml0ZT8gInciOiIiLCBpc19leGVjPyAieCI6IiIpOworI2VuZGlmCisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOworCisJaWYgKCF2bWEpCisJCWdvdG8gYmFkX2FyZWE7CisJaWYgKHZtYS0+dm1fc3RhcnQgPD0gYWRkcmVzcykKKwkJZ290byBnb29kX2FyZWE7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX0dST1dTRE9XTikpCisJCWdvdG8gYmFkX2FyZWE7CisJaWYgKGV4cGFuZF9zdGFjayh2bWEsIGFkZHJlc3MpKQorCQlnb3RvIGJhZF9hcmVhOworCisJLyogT2ssIHdlIGhhdmUgYSBnb29kIHZtX2FyZWEgZm9yIHRoaXMgbWVtb3J5IGFjY2Vzcywgc28KKwkgKiB3ZSBjYW4gaGFuZGxlIGl0Li4KKwkgKi8KKworZ29vZF9hcmVhOgorCWluZm8uc2lfY29kZSA9IFNFR1ZfQUNDRVJSOworCisJaWYgKGlzX3dyaXRlKSB7CisJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCQlnb3RvIGJhZF9hcmVhOworCX0gZWxzZSBpZiAoaXNfZXhlYykgeworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykpCisJCQlnb3RvIGJhZF9hcmVhOworCX0gZWxzZQkvKiBBbGxvdyByZWFkIGV2ZW4gZnJvbSB3cml0ZS1vbmx5IHBhZ2VzLiAqLworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9XUklURSkpKQorCQkJZ290byBiYWRfYXJlYTsKKworCS8qIElmIGZvciBhbnkgcmVhc29uIGF0IGFsbCB3ZSBjb3VsZG4ndCBoYW5kbGUgdGhlIGZhdWx0LAorCSAqIG1ha2Ugc3VyZSB3ZSBleGl0IGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW5kbGVzc2x5IHJlZG8KKwkgKiB0aGUgZmF1bHQuCisJICovCitzdXJ2aXZlOgorCXN3aXRjaCAoaGFuZGxlX21tX2ZhdWx0KG1tLCB2bWEsIGFkZHJlc3MsIGlzX3dyaXRlKSkgeworCWNhc2UgVk1fRkFVTFRfTUlOT1I6CisJCWN1cnJlbnQtPm1pbl9mbHQrKzsKKwkJYnJlYWs7CisJY2FzZSBWTV9GQVVMVF9NQUpPUjoKKwkJY3VycmVudC0+bWFqX2ZsdCsrOworCQlicmVhazsKKwljYXNlIFZNX0ZBVUxUX1NJR0JVUzoKKwkJZ290byBkb19zaWdidXM7CisJY2FzZSBWTV9GQVVMVF9PT006CisJCWdvdG8gb3V0X29mX21lbW9yeTsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybjsKKworCS8qIFNvbWV0aGluZyB0cmllZCB0byBhY2Nlc3MgbWVtb3J5IHRoYXQgaXNuJ3QgaW4gb3VyIG1lbW9yeSBtYXAuLgorCSAqIEZpeCBpdCwgYnV0IGNoZWNrIGlmIGl0J3Mga2VybmVsIG9yIHVzZXIgZmlyc3QuLgorCSAqLworYmFkX2FyZWE6CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWN1cnJlbnQtPnRocmVhZC5iYWRfdmFkZHIgPSBhZGRyZXNzOworCQljdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSA9IGlzX3dyaXRlOworCQlpbmZvLnNpX3NpZ25vID0gU0lHU0VHVjsKKwkJaW5mby5zaV9lcnJubyA9IDA7CisJCS8qIGluZm8uc2lfY29kZSBoYXMgYmVlbiBzZXQgYWJvdmUgKi8KKwkJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgYWRkcmVzczsKKwkJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgJmluZm8sIGN1cnJlbnQpOworCQlyZXR1cm47CisJfQorCWJhZF9wYWdlX2ZhdWx0KHJlZ3MsIGFkZHJlc3MsIFNJR1NFR1YpOworCXJldHVybjsKKworCisJLyogV2UgcmFuIG91dCBvZiBtZW1vcnksIG9yIHNvbWUgb3RoZXIgdGhpbmcgaGFwcGVuZWQgdG8gdXMgdGhhdCBtYWRlCisJICogdXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUgcGFnZSBmYXVsdCBncmFjZWZ1bGx5LgorCSAqLworb3V0X29mX21lbW9yeToKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWlmIChjdXJyZW50LT5waWQgPT0gMSkgeworCQl5aWVsZCgpOworCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCWdvdG8gc3Vydml2ZTsKKwl9CisJcHJpbnRrKCJWTToga2lsbGluZyBwcm9jZXNzICVzXG4iLCBjdXJyZW50LT5jb21tKTsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKQorCQlkb19leGl0KFNJR0tJTEwpOworCWJhZF9wYWdlX2ZhdWx0KHJlZ3MsIGFkZHJlc3MsIFNJR0tJTEwpOworCXJldHVybjsKKworZG9fc2lnYnVzOgorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBTZW5kIGEgc2lnYnVzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2Ugd2VyZSBpbiBrZXJuZWwKKwkgKiBvciB1c2VyIG1vZGUuCisJICovCisJY3VycmVudC0+dGhyZWFkLmJhZF92YWRkciA9IGFkZHJlc3M7CisJaW5mby5zaV9jb2RlID0gU0lHQlVTOworCWluZm8uc2lfZXJybm8gPSAwOworCWluZm8uc2lfY29kZSA9IEJVU19BRFJFUlI7CisJaW5mby5zaV9hZGRyID0gKHZvaWQgKikgYWRkcmVzczsKKwlmb3JjZV9zaWdfaW5mbyhTSUdCVVMsICZpbmZvLCBjdXJyZW50KTsKKworCS8qIEtlcm5lbCBtb2RlPyBIYW5kbGUgZXhjZXB0aW9ucyBvciBkaWUgKi8KKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwkJYmFkX3BhZ2VfZmF1bHQocmVncywgYWRkcmVzcywgU0lHQlVTKTsKKwordm1hbGxvY19mYXVsdDoKKwl7CisJCS8qIFN5bmNocm9uaXplIHRoaXMgdGFzaydzIHRvcCBsZXZlbCBwYWdlLXRhYmxlCisJCSAqIHdpdGggdGhlICdyZWZlcmVuY2UnIHBhZ2UgdGFibGUuCisJCSAqLworCQlzdHJ1Y3QgbW1fc3RydWN0ICphY3RfbW0gPSBjdXJyZW50LT5hY3RpdmVfbW07CisJCWludCBpbmRleCA9IHBnZF9pbmRleChhZGRyZXNzKTsKKwkJcGdkX3QgKnBnZCwgKnBnZF9rOworCQlwbWRfdCAqcG1kLCAqcG1kX2s7CisJCXB0ZV90ICpwdGVfazsKKworCQlpZiAoYWN0X21tID09IE5VTEwpCisJCQlnb3RvIGJhZF9wYWdlX2ZhdWx0OworCisJCXBnZCA9IGFjdF9tbS0+cGdkICsgaW5kZXg7CisJCXBnZF9rID0gaW5pdF9tbS5wZ2QgKyBpbmRleDsKKworCQlpZiAoIXBnZF9wcmVzZW50KCpwZ2RfaykpCisJCQlnb3RvIGJhZF9wYWdlX2ZhdWx0OworCisJCXBnZF92YWwoKnBnZCkgPSBwZ2RfdmFsKCpwZ2Rfayk7CisKKwkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlwbWRfayA9IHBtZF9vZmZzZXQocGdkX2ssIGFkZHJlc3MpOworCQlpZiAoIXBtZF9wcmVzZW50KCpwbWQpIHx8ICFwbWRfcHJlc2VudCgqcG1kX2spKQorCQkJZ290byBiYWRfcGFnZV9mYXVsdDsKKworCQlwbWRfdmFsKCpwbWQpID0gcG1kX3ZhbCgqcG1kX2spOworCQlwdGVfayA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZF9rLCBhZGRyZXNzKTsKKworCQlpZiAoIXB0ZV9wcmVzZW50KCpwdGVfaykpCisJCQlnb3RvIGJhZF9wYWdlX2ZhdWx0OworCQlyZXR1cm47CisJfQorYmFkX3BhZ2VfZmF1bHQ6CisJYmFkX3BhZ2VfZmF1bHQocmVncywgYWRkcmVzcywgU0lHS0lMTCk7CisJcmV0dXJuOworfQorCisKK3ZvaWQKK2JhZF9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCBzaWcpCit7CisJZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIqLCBzdHJ1Y3QgcHRfcmVncyosIGxvbmcpOworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmVudHJ5OworCisJLyogQXJlIHdlIHByZXBhcmVkIHRvIGhhbmRsZSB0aGlzIGtlcm5lbCBmYXVsdD8gICovCisJaWYgKChlbnRyeSA9IHNlYXJjaF9leGNlcHRpb25fdGFibGVzKHJlZ3MtPnBjKSkgIT0gTlVMTCkgeworI2lmIDEKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFeGNlcHRpb24gYXQgcGM9JSMwMTBseCAoJWx4KVxuIiwKKwkJCQljdXJyZW50LT5jb21tLCByZWdzLT5wYywgZW50cnktPmZpeHVwKTsKKyNlbmRpZgorCQljdXJyZW50LT50aHJlYWQuYmFkX3VhZGRyID0gYWRkcmVzczsKKwkJcmVncy0+cGMgPSBlbnRyeS0+Zml4dXA7CisJCXJldHVybjsKKwl9CisKKwkvKiBPb3BzLiBUaGUga2VybmVsIHRyaWVkIHRvIGFjY2VzcyBzb21lIGJhZCBwYWdlLiBXZSdsbCBoYXZlIHRvCisJICogdGVybWluYXRlIHRoaW5ncyB3aXRoIGV4dHJlbWUgcHJlanVkaWNlLgorCSAqLworCXByaW50ayhLRVJOX0FMRVJUICJVbmFibGUgdG8gaGFuZGxlIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCBhdCB2aXJ0dWFsICIKKwkgICAgICAgImFkZHJlc3MgJTA4bHhcbiBwYyA9ICUwOGx4LCByYSA9ICUwOGx4XG4iLAorCSAgICAgICBhZGRyZXNzLCByZWdzLT5wYywgcmVncy0+YXJlZ1swXSk7CisJZGllKCJPb3BzIiwgcmVncywgc2lnKTsKKwlkb19leGl0KHNpZyk7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL21tL2luaXQuYyBiL2FyY2gveHRlbnNhL21tL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFhY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbW0vaW5pdC5jCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogYXJjaC94dGVuc2EvbW0vaW5pdC5jCisgKgorICogRGVyaXZlZCBmcm9tIE1JUFMsIFBQQy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsCTxjaHJpc0B6YW5rZWwubmV0PgorICogSm9lIFRheWxvcgk8am9lQHRlbnNpbGljYS5jb20sIGpvZXR5bHJAeWFob28uY29tPgorICogTWFyYyBHYXV0aGllcgorICogS2V2aW4gQ2hlYQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworCisjZGVmaW5lIERFQlVHIDAKKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKKy8vc3RhdGljIERFRklORV9TUElOTE9DSyh0bGJfbG9jayk7CisKKy8qCisgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwYWdlIHdhcyBtYXBwZWQgYW5kIG1vZGlmaWVkIGluCisgKiBrZXJuZWwgc3BhY2UsIHNvIHRoZSBjYWNoZSBpcyBwcm9iYWJseSBkaXJ0eSBhdCB0aGF0IGFkZHJlc3MuCisgKiBJZiBjYWNoZSBhbGlhc2luZyBpcyBlbmFibGVkIGFuZCB0aGUgcGFnZSBjb2xvciBtaXNtYXRjaGVzLCB1cGRhdGVfbW11X2NhY2hlCisgKiBzeW5jaHJvbml6ZXMgdGhlIGNhY2hlcyBpZiB0aGlzIGJpdCBpcyBzZXQuCisgKi8KKworI2RlZmluZSBQR19jYWNoZV9jbGVhbiBQR19hcmNoXzEKKworLyogUmVmZXJlbmNlcyB0byBzZWN0aW9uIGJvdW5kYXJpZXMgKi8KKworZXh0ZXJuIGNoYXIgX2Z0ZXh0LCBfZXRleHQsIF9mZGF0YSwgX2VkYXRhLCBfcm9kYXRhX2VuZDsKK2V4dGVybiBjaGFyIF9faW5pdF9iZWdpbiwgX19pbml0X2VuZDsKKworLyoKKyAqIG1lbV9yZXNlcnZlKHN0YXJ0LCBlbmQsIG11c3RfZXhpc3QpCisgKgorICogUmVzZXJ2ZSBzb21lIG1lbW9yeSBmcm9tIHRoZSBtZW1vcnkgcG9vbC4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogIHN0YXJ0CVN0YXJ0IG9mIHJlZ2lvbiwKKyAqICBlbmQJCUVuZCBvZiByZWdpb24sCisgKiAgbXVzdF9leGlzdAlNdXN0IGV4aXN0IGluIG1lbW9yeSBwb29sLgorICoKKyAqIFJldHVybnM6CisgKiAgMCAobWVtb3J5IGFyZWEgY291bGRuJ3QgYmUgbWFwcGVkKQorICogLTEgKHN1Y2Nlc3MpCisgKi8KKworaW50IF9faW5pdCBtZW1fcmVzZXJ2ZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IG11c3RfZXhpc3QpCit7CisJaW50IGk7CisKKwlpZiAoc3RhcnQgPT0gZW5kKQorCQlyZXR1cm4gMDsKKworCXN0YXJ0ID0gc3RhcnQgJiBQQUdFX01BU0s7CisJZW5kID0gUEFHRV9BTElHTihlbmQpOworCisJZm9yIChpID0gMDsgaSA8IHN5c21lbS5ucl9iYW5rczsgaSsrKQorCQlpZiAoc3RhcnQgPCBzeXNtZW0uYmFua1tpXS5lbmQKKwkJICAgICYmIGVuZCA+PSBzeXNtZW0uYmFua1tpXS5zdGFydCkKKwkJCWJyZWFrOworCisJaWYgKGkgPT0gc3lzbWVtLm5yX2JhbmtzKSB7CisJCWlmIChtdXN0X2V4aXN0KQorCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm1lbV9yZXNlcnZlOiBbMHglMGx4LCAweCUwbHgpICIKKwkJCQkibm90IGluIGFueSByZWdpb24hXG4iLCBzdGFydCwgZW5kKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0YXJ0ID4gc3lzbWVtLmJhbmtbaV0uc3RhcnQpIHsKKwkJaWYgKGVuZCA8IHN5c21lbS5iYW5rW2ldLmVuZCkgeworCQkJLyogc3BsaXQgZW50cnkgKi8KKwkJCWlmIChzeXNtZW0ubnJfYmFua3MgPj0gU1lTTUVNX0JBTktTX01BWCkKKwkJCQlwYW5pYygibWVtaW5mbyBvdmVyZmxvd1xuIik7CisJCQlzeXNtZW0uYmFua1tzeXNtZW0ubnJfYmFua3NdLnN0YXJ0ID0gZW5kOworCQkJc3lzbWVtLmJhbmtbc3lzbWVtLm5yX2JhbmtzXS5lbmQgPSBzeXNtZW0uYmFua1tpXS5lbmQ7CisJCQlzeXNtZW0ubnJfYmFua3MrKzsKKwkJfQorCQlzeXNtZW0uYmFua1tpXS5lbmQgPSBzdGFydDsKKwl9IGVsc2UgeworCQlpZiAoZW5kIDwgc3lzbWVtLmJhbmtbaV0uZW5kKQorCQkJc3lzbWVtLmJhbmtbaV0uc3RhcnQgPSBlbmQ7CisJCWVsc2UgeworCQkJLyogcmVtb3ZlIGVudHJ5ICovCisJCQlzeXNtZW0ubnJfYmFua3MtLTsKKwkJCXN5c21lbS5iYW5rW2ldLnN0YXJ0ID0gc3lzbWVtLmJhbmtbc3lzbWVtLm5yX2JhbmtzXS5zdGFydDsKKwkJCXN5c21lbS5iYW5rW2ldLmVuZCAgID0gc3lzbWVtLmJhbmtbc3lzbWVtLm5yX2JhbmtzXS5lbmQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBib290bWVtIHN5c3RlbSBhbmQgZ2l2ZSBpdCBhbGwgdGhlIG1lbW9yeSB3ZSBoYXZlIGF2YWlsYWJsZS4KKyAqLworCit2b2lkIF9faW5pdCBib290bWVtX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc3RhcnQsIGJvb3RtYXBfc2l6ZTsKKwlpbnQgaTsKKworCW1heF9sb3dfcGZuID0gbWF4X3BmbiA9IDA7CisJbWluX2xvd19wZm4gPSB+MDsKKworCWZvciAoaT0wOyBpIDwgc3lzbWVtLm5yX2JhbmtzOyBpKyspIHsKKwkJcGZuID0gUEFHRV9BTElHTihzeXNtZW0uYmFua1tpXS5zdGFydCkgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHBmbiA8IG1pbl9sb3dfcGZuKQorCQkJbWluX2xvd19wZm4gPSBwZm47CisJCXBmbiA9IFBBR0VfQUxJR04oc3lzbWVtLmJhbmtbaV0uZW5kIC0gMSkgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHBmbiA+IG1heF9wZm4pCisJCQltYXhfcGZuID0gcGZuOworCX0KKworCWlmIChtaW5fbG93X3BmbiA+IG1heF9wZm4pCisJCXBhbmljKCJObyBtZW1vcnkgZm91bmQhXG4iKTsKKworCW1heF9sb3dfcGZuID0gbWF4X3BmbiA8IE1BWF9MT1dfTUVNT1JZID4+IFBBR0VfU0hJRlQgPworCQltYXhfcGZuIDogTUFYX0xPV19NRU1PUlkgPj4gUEFHRV9TSElGVDsKKworCS8qIEZpbmQgYW4gYXJlYSB0byB1c2UgZm9yIHRoZSBib290bWVtIGJpdG1hcC4gKi8KKworCWJvb3RtYXBfc2l6ZSA9IGJvb3RtZW1fYm9vdG1hcF9wYWdlcyhtYXhfbG93X3BmbikgPDwgUEFHRV9TSElGVDsKKwlib290bWFwX3N0YXJ0ID0gfjA7CisKKwlmb3IgKGk9MDsgaTxzeXNtZW0ubnJfYmFua3M7IGkrKykKKwkJaWYgKHN5c21lbS5iYW5rW2ldLmVuZCAtIHN5c21lbS5iYW5rW2ldLnN0YXJ0ID49IGJvb3RtYXBfc2l6ZSkgeworCQkJYm9vdG1hcF9zdGFydCA9IHN5c21lbS5iYW5rW2ldLnN0YXJ0OworCQkJYnJlYWs7CisJCX0KKworCWlmIChib290bWFwX3N0YXJ0ID09IH4wVUwpCisJCXBhbmljKCJDYW5ub3QgZmluZCAlbGQgYnl0ZXMgZm9yIGJvb3RtYXBcbiIsIGJvb3RtYXBfc2l6ZSk7CisKKwkvKiBSZXNlcnZlIHRoZSBib290bWVtIGJpdG1hcCBhcmVhICovCisKKwltZW1fcmVzZXJ2ZShib290bWFwX3N0YXJ0LCBib290bWFwX3N0YXJ0ICsgYm9vdG1hcF9zaXplLCAxKTsKKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIG1pbl9sb3dfcGZuLAorCQkJCQkgYm9vdG1hcF9zdGFydCA+PiBQQUdFX1NISUZULAorCQkJCQkgbWF4X2xvd19wZm4pOworCisJLyogQWRkIGFsbCByZW1haW5pbmcgbWVtb3J5IHBpZWNlcyBpbnRvIHRoZSBib290bWVtIG1hcCAqLworCisJZm9yIChpPTA7IGk8c3lzbWVtLm5yX2JhbmtzOyBpKyspCisJCWZyZWVfYm9vdG1lbShzeXNtZW0uYmFua1tpXS5zdGFydCwKKwkJCSAgICAgc3lzbWVtLmJhbmtbaV0uZW5kIC0gc3lzbWVtLmJhbmtbaV0uc3RhcnQpOworCit9CisKKwordm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbTUFYX05SX1pPTkVTXTsKKwlpbnQgaTsKKworCS8qIEFsbCBwYWdlcyBhcmUgRE1BLWFibGUsIHNvIHdlIHB1dCB0aGVtIGFsbCBpbiB0aGUgRE1BIHpvbmUuICovCisKKwl6b25lc19zaXplW1pPTkVfRE1BXSA9IG1heF9sb3dfcGZuOworCWZvciAoaSA9IDE7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKKwkJem9uZXNfc2l6ZVtpXSA9IDA7CisKKyNpZmRlZiBDT05GSUdfSElHSE1FTQorCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IG1heF9wZm4gLSBtYXhfbG93X3BmbjsKKyNlbmRpZgorCisJLyogSW5pdGlhbGl6ZSB0aGUga2VybmVsJ3MgcGFnZSB0YWJsZXMuICovCisKKwltZW1zZXQoc3dhcHBlcl9wZ19kaXIsIDAsIFBBR0VfU0laRSk7CisKKwlmcmVlX2FyZWFfaW5pdCh6b25lc19zaXplKTsKK30KKworLyoKKyAqIEZsdXNoIHRoZSBtbXUgYW5kIHJlc2V0IGFzc29jaWF0ZWQgcmVnaXN0ZXIgdG8gZGVmYXVsdCB2YWx1ZXMuCisgKi8KKwordm9pZCBfX2luaXQgaW5pdF9tbXUgKHZvaWQpCit7CisJLyogV3JpdGluZyB6ZXJvcyB0byB0aGUgPHQ+VExCQ0ZHIHNwZWNpYWwgcmVnaXN0ZXJzIGVuc3VyZQorCSAqIHRoYXQgdmFsaWQgdmFsdWVzIGV4aXN0IGluIHRoZSByZWdpc3Rlci4gIEZvciBleGlzdGluZworCSAqIFBHU1pJRDx3PiBmaWVsZHMsIHplcm8gc2VsZWN0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKwkgKiBwYWdlLXNpemUgYXJyYXkuICBGb3Igbm9uZXhpc3RhbnQgUEdTWklEPHc+IGZpZWxkcywgemVybyBpcworCSAqIHRoZSBiZXN0IHZhbHVlIHRvIHdyaXRlLiAgQWxzbywgd2hlbiBjaGFuZ2luZyBQR1NaSUQ8dz4KKwkgKiBmaWVsZHMsIHRoZSBjb3JyZXNwb25kaW5nIFRMQiBtdXN0IGJlIGZsdXNoZWQuCisJICovCisJc2V0X2l0bGJjZmdfcmVnaXN0ZXIgKDApOworCXNldF9kdGxiY2ZnX3JlZ2lzdGVyICgwKTsKKwlmbHVzaF90bGJfYWxsICgpOworCisJLyogU2V0IHJhc2lkIHJlZ2lzdGVyIHRvIGEga25vd24gdmFsdWUuICovCisKKwlzZXRfcmFzaWRfcmVnaXN0ZXIgKEFTSURfQUxMX1JFU0VSVkVEKTsKKworCS8qIFNldCBQVEVWQUREUiBzcGVjaWFsIHJlZ2lzdGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgcGFnZQorCSAqIHRhYmxlLCB3aGljaCBpcyBpbiBrZXJuZWwgbWFwcGFibGUgc3BhY2UgKGllLiBub3QKKwkgKiBzdGF0aWNhbGx5IG1hcHBlZCkuICBUaGlzIHJlZ2lzdGVyJ3MgdmFsdWUgaXMgdW5kZWZpbmVkIG9uCisJICogcmVzZXQuCisJICovCisJc2V0X3B0ZXZhZGRyX3JlZ2lzdGVyIChQR1RBQkxFX1NUQVJUKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgbWVtb3J5IHBhZ2VzLgorICovCisKK3ZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjb2Rlc2l6ZSwgcmVzZXJ2ZWRwYWdlcywgZGF0YXNpemUsIGluaXRzaXplOworCXVuc2lnbmVkIGxvbmcgaGlnaG1lbXNpemUsIHRtcCwgcmFtOworCisJbWF4X21hcG5yID0gbnVtX3BoeXNwYWdlcyA9IG1heF9sb3dfcGZuOworCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShtYXhfbWFwbnIgPDwgUEFHRV9TSElGVCk7CisJaGlnaG1lbXNpemUgPSAwOworCisjaWYgQ09ORklHX0hJR0hNRU0KKyNlcnJvciBISUdIR01FTSBub3QgaW1wbGVtZW50ZWQgaW4gaW5pdC5jCisjZW5kaWYKKworCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYWxsX2Jvb3RtZW0oKTsKKworCXJlc2VydmVkcGFnZXMgPSByYW0gPSAwOworCWZvciAodG1wID0gMDsgdG1wIDwgbWF4X2xvd19wZm47IHRtcCsrKSB7CisJCXJhbSsrOworCQlpZiAoUGFnZVJlc2VydmVkKG1lbV9tYXArdG1wKSkKKwkJCXJlc2VydmVkcGFnZXMrKzsKKwl9CisKKwljb2Rlc2l6ZSA9ICAodW5zaWduZWQgbG9uZykgJl9ldGV4dCAtICh1bnNpZ25lZCBsb25nKSAmX2Z0ZXh0OworCWRhdGFzaXplID0gICh1bnNpZ25lZCBsb25nKSAmX2VkYXRhIC0gKHVuc2lnbmVkIGxvbmcpICZfZmRhdGE7CisJaW5pdHNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfZW5kIC0gKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfYmVnaW47CisKKwlwcmludGsoIk1lbW9yeTogJWx1ay8lbHVrIGF2YWlsYWJsZSAoJWxkayBrZXJuZWwgY29kZSwgJWxkayByZXNlcnZlZCwgIgorCSAgICAgICAiJWxkayBkYXRhLCAlbGRrIGluaXQgJWxkayBoaWdobWVtKVxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG5yX2ZyZWVfcGFnZXMoKSA8PCAoUEFHRV9TSElGVC0xMCksCisJICAgICAgIHJhbSA8PCAoUEFHRV9TSElGVC0xMCksCisJICAgICAgIGNvZGVzaXplID4+IDEwLAorCSAgICAgICByZXNlcnZlZHBhZ2VzIDw8IChQQUdFX1NISUZULTEwKSwKKwkgICAgICAgZGF0YXNpemUgPj4gMTAsCisJICAgICAgIGluaXRzaXplID4+IDEwLAorCSAgICAgICBoaWdobWVtc2l6ZSA+PiAxMCk7Cit9CisKK3ZvaWQKK2ZyZWVfcmVzZXJ2ZWRfbWVtKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCit7CisJZm9yICg7IHN0YXJ0IDwgZW5kOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKHN0YXJ0KSk7CisJCXNldF9wYWdlX2NvdW50KHZpcnRfdG9fcGFnZShzdGFydCksIDEpOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpc3RhcnQpOworCQl0b3RhbHJhbV9wYWdlcysrOworCX0KK30KKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorZXh0ZXJuIGludCBpbml0cmRfaXNfbWFwcGVkOworCit2b2lkIGZyZWVfaW5pdHJkX21lbSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlpZiAoaW5pdHJkX2lzX21hcHBlZCkgeworCQlmcmVlX3Jlc2VydmVkX21lbSgodm9pZCopc3RhcnQsICh2b2lkKillbmQpOworCQlwcmludGsgKCJGcmVlaW5nIGluaXRyZCBtZW1vcnk6ICVsZGsgZnJlZWRcbiIsKGVuZC1zdGFydCk+PjEwKTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3sKKwlmcmVlX3Jlc2VydmVkX21lbSgmX19pbml0X2JlZ2luLCAmX19pbml0X2VuZCk7CisJcHJpbnRrKCJGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAlZGsgZnJlZWRcbiIsCisJICAgICAgICgmX19pbml0X2VuZCAtICZfX2luaXRfYmVnaW4pID4+IDEwKTsKK30KKwordm9pZCBzaG93X21lbSh2b2lkKQoreworCWludCBpLCBmcmVlID0gMCwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDA7CisJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDA7CisKKwlwcmludGsoIk1lbS1pbmZvOlxuIik7CisJc2hvd19mcmVlX2FyZWFzKCk7CisJcHJpbnRrKCJGcmVlIHN3YXA6ICAgICAgICU2bGRrQlxuIiwgbnJfc3dhcF9wYWdlczw8KFBBR0VfU0hJRlQtMTApKTsKKwlpID0gbWF4X21hcG5yOworCXdoaWxlIChpLS0gPiAwKSB7CisJCXRvdGFsKys7CisJCWlmIChQYWdlUmVzZXJ2ZWQobWVtX21hcCtpKSkKKwkJCXJlc2VydmVkKys7CisJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUobWVtX21hcCtpKSkKKwkJCWNhY2hlZCsrOworCQllbHNlIGlmICghcGFnZV9jb3VudChtZW1fbWFwICsgaSkpCisJCQlmcmVlKys7CisJCWVsc2UKKwkJCXNoYXJlZCArPSBwYWdlX2NvdW50KG1lbV9tYXAgKyBpKSAtIDE7CisJfQorCXByaW50aygiJWQgcGFnZXMgb2YgUkFNXG4iLCB0b3RhbCk7CisJcHJpbnRrKCIlZCByZXNlcnZlZCBwYWdlc1xuIiwgcmVzZXJ2ZWQpOworCXByaW50aygiJWQgcGFnZXMgc2hhcmVkXG4iLCBzaGFyZWQpOworCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsY2FjaGVkKTsKKwlwcmludGsoIiVkIGZyZWUgcGFnZXNcbiIsIGZyZWUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKQorCisvKgorICogV2l0aCBjYWNoZSBhbGlhc2luZywgdGhlIHBhZ2UgY29sb3Igb2YgdGhlIHBhZ2UgaW4ga2VybmVsIHNwYWNlIGFuZCB1c2VyCisgKiBzcGFjZSBtaWdodCBtaXNtYXRjaC4gV2UgdGVtcG9yYXJpbHkgbWFwIHRoZSBwYWdlIHRvIGEgZGlmZmVyZW50IHZpcnR1YWwKKyAqIGFkZHJlc3Mgd2l0aCB0aGUgc2FtZSBjb2xvciBhbmQgY2xlYXIgdGhlIHBhZ2UgdGhlcmUuCisgKi8KKwordm9pZCBjbGVhcl91c2VyX3BhZ2Uodm9pZCAqa2FkZHIsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCBwYWdlKiBwYWdlKQoreworCisgIAkvKiAgVGhlcmUgc2hvdWxkbid0IGJlIGFueSBlbnRyaWVzIGZvciB0aGlzIHBhZ2UuICovCisKKwlfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2VfcGh5cyhfX3BhKHBhZ2VfYWRkcmVzcyhwYWdlKSkpOworCisJaWYgKCFQQUdFX0NPTE9SX0VRKHZhZGRyLCBrYWRkcikpIHsKKwkJdW5zaWduZWQgbG9uZyB2LCBwOworCisJCS8qIFRlbXBvcmFyaWx5IG1hcCBwYWdlIHRvIERUTEJfV0FZX0RDQUNIRV9BTElBUzAuICovCisKKwkJc3Bpbl9sb2NrKCZ0bGJfbG9jayk7CisKKwkJcCA9ICh1bnNpZ25lZCBsb25nKXB0ZV92YWwoKG1rX3B0ZShwYWdlLFBBR0VfS0VSTkVMKSkpOworCQlrYWRkciA9ICh2b2lkKilQQUdFX0NPTE9SX01BUDAodmFkZHIpOworCQl2ID0gKHVuc2lnbmVkIGxvbmcpa2FkZHIgfCBEVExCX1dBWV9EQ0FDSEVfQUxJQVMwOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygid2R0bGIgJTAsJTE7IGRzeW5jIiA6IDoiYSIgKHApLCAiYSIgKHYpKTsKKworCQljbGVhcl9wYWdlKGthZGRyKTsKKworCQlzcGluX3VubG9jaygmdGxiX2xvY2spOworCX0gZWxzZSB7CisJCWNsZWFyX3BhZ2Uoa2FkZHIpOworCX0KKworCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaSQgYW5kIGQkIGFyZSBjb2hlcmVudC4gKi8KKworCWNsZWFyX2JpdChQR19jYWNoZV9jbGVhbiwgJnBhZ2UtPmZsYWdzKTsKK30KKworLyoKKyAqIFdpdGggY2FjaGUgYWxpYXNpbmcsIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBhZ2UgY29sb3Igb2YgdGhlIHBhZ2UKKyAqIGluIGtlcm5lbCBzcGFjZSBtYXRjaGVzIHRoYXQgb2YgdGhlIHZpcnR1YWwgdXNlciBhZGRyZXNzIGJlZm9yZSB3ZSByZWFkCisgKiB0aGUgcGFnZS4gSWYgdGhlIHBhZ2UgY29sb3IgZGlmZmVyLCB3ZSBjcmVhdGUgYSB0ZW1wb3JhcnkgRFRMQiBlbnRyeSB3aXRoCisgKiB0aGUgY29ycmVudCBwYWdlIGNvbG9yIGFuZCB1c2UgdGhpcyAndGVtcG9yYXJ5JyBhZGRyZXNzIGFzIHRoZSBzb3VyY2UuCisgKiBXZSB0aGVuIHVzZSB0aGUgc2FtZSBhcHByb2FjaCBhcyBpbiBjbGVhcl91c2VyX3BhZ2UgYW5kIGNvcHkgdGhlIGRhdGEKKyAqIHRvIHRoZSBrZXJuZWwgc3BhY2UgYW5kIGNsZWFyIHRoZSBQR19jYWNoZV9jbGVhbiBiaXQgdG8gc3luY2hyb25pemUgY2FjaGVzCisgKiBsYXRlci4KKyAqCisgKiBOb3RlOgorICogSW5zdGVhZCBvZiB1c2luZyBhbm90aGVyICd3YXknIGZvciB0aGUgdGVtcG9yYXJ5IERUTEIgZW50cnksIHdlIGNvdWxkCisgKiBwcm9iYWJseSB1c2UgdGhlIHNhbWUgZW50cnkgdGhhdCBwb2ludHMgdG8gdGhlIGtlcm5lbCBhZGRyZXNzIChhZnRlcgorICogc2F2aW5nIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbmQgcmVzdG9yaW5nIGl0IHdoZW4gd2UgYXJlIGRvbmUpLgorICovCisKK3ZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCogdG8sIHZvaWQqIGZyb20sIHVuc2lnbmVkIGxvbmcgdmFkZHIsCisgICAgCQkgICAgc3RydWN0IHBhZ2UqIHRvX3BhZ2UpCit7CisJLyogVGhlcmUgc2hvdWxkbid0IGJlIGFueSBlbnRyaWVzIGZvciB0aGUgbmV3IHBhZ2UuICovCisKKwlfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2VfcGh5cyhfX3BhKHBhZ2VfYWRkcmVzcyh0b19wYWdlKSkpOworCisJc3Bpbl9sb2NrKCZ0bGJfbG9jayk7CisKKwlpZiAoIVBBR0VfQ09MT1JfRVEodmFkZHIsIGZyb20pKSB7CisJCXVuc2lnbmVkIGxvbmcgdiwgcCwgdDsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInBkdGxiICUxLCUyOyByZHRsYjEgJTAsJTEiCisJCQkJICAgICAgOiAiPWEiKHApLCAiPWEiKHQpIDogImEiKGZyb20pKTsKKwkJZnJvbSA9ICh2b2lkKilQQUdFX0NPTE9SX01BUDAodmFkZHIpOworCQl2ID0gKHVuc2lnbmVkIGxvbmcpZnJvbSB8IERUTEJfV0FZX0RDQUNIRV9BTElBUzA7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgid2R0bGIgJTAsJTE7IGRzeW5jIiA6OiJhIiAocCksICJhIiAodikpOworCX0KKworCWlmICghUEFHRV9DT0xPUl9FUSh2YWRkciwgdG8pKSB7CisJCXVuc2lnbmVkIGxvbmcgdiwgcDsKKworCQlwID0gKHVuc2lnbmVkIGxvbmcpcHRlX3ZhbCgobWtfcHRlKHRvX3BhZ2UsUEFHRV9LRVJORUwpKSk7CisJCXRvID0gKHZvaWQqKVBBR0VfQ09MT1JfTUFQMSh2YWRkcik7CisJCXYgPSAodW5zaWduZWQgbG9uZyl0byB8IERUTEJfV0FZX0RDQUNIRV9BTElBUzE7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgid2R0bGIgJTAsJTE7IGRzeW5jIiA6OiJhIiAocCksICJhIiAodikpOworCX0KKwljb3B5X3BhZ2UodG8sIGZyb20pOworCisJc3Bpbl91bmxvY2soJnRsYl9sb2NrKTsKKworCS8qIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaSQgYW5kIGQkIGFyZSBjb2hlcmVudC4gKi8KKworCWNsZWFyX2JpdChQR19jYWNoZV9jbGVhbiwgJnRvX3BhZ2UtPmZsYWdzKTsKK30KKworCisKKy8qCisgKiBBbnkgdGltZSB0aGUga2VybmVsIHdyaXRlcyB0byBhIHVzZXIgcGFnZSBjYWNoZSBwYWdlLCBvciBpdCBpcyBhYm91dCB0bworICogcmVhZCBmcm9tIGEgcGFnZSBjYWNoZSBwYWdlIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuCisgKgorICogTm90ZToKKyAqIFRoZSBrZXJuZWwgY3VycmVudGx5IG9ubHkgcHJvdmlkZXMgb25lIGFyY2hpdGVjdHVyZSBiaXQgaW4gdGhlIHBhZ2UKKyAqIGZsYWdzIHRoYXQgd2UgdXNlIGZvciBJJC9EJCBjb2hlcmVuY3kuIE1heWJlLCBpbiBmdXR1cmUsIHdlIGNhbgorICogdXNlIGEgc2VwZWFydGUgYml0IGZvciBkZWZlcnJlZCBkY2FjaGUgYWxpYXNpbmc6CisgKiBJZiB0aGUgcGFnZSBpcyBub3QgbWFwcGVkIHlldCwgd2Ugb25seSBuZWVkIHRvIHNldCBhIGZsYWcsCisgKiBpZiBtYXBwZWQsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgcGFnZS4KKyAqLworLy8gRklYTUU6IHdlIHByb2JhYmx5IG5lZWQgdGhpcyBmb3IgV0IgY2FjaGVzIG5vdCBvbmx5IGZvciBQYWdlIENvbG9yaW5nLi4KKwordm9pZCBmbHVzaF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBfX3BhKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisKKwlfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2VfcGh5cyhhZGRyKTsKKworCWlmICghdGVzdF9iaXQoUEdfY2FjaGVfY2xlYW4sICZwYWdlLT5mbGFncykpCisJCXJldHVybjsKKworCS8qIElmIHRoaXMgcGFnZSBoYXNuJ3QgYmVlbiBtYXBwZWQsIHlldCwgaGFuZGxlIEkkL0QkIGNvaGVyZW5jeSBsYXRlci4qLworI2lmIDAKKwlpZiAobWFwcGluZyAmJiAhbWFwcGluZ19tYXBwZWQobWFwcGluZykpCisJCWNsZWFyX2JpdChQR19jYWNoZV9jbGVhbiwgJnBhZ2UtPmZsYWdzKTsKKwllbHNlCisjZW5kaWYKKwkJX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlX3BoeXMoYWRkcik7Cit9CisKK3ZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0KiB2bWEsIHVuc2lnbmVkIGxvbmcgcywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZSkKK3sKKwlfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKCk7Cit9CisKK3ZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqIHZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorICAgIAkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCisJLyogUmVtb3ZlIGFueSBlbnRyeSBmb3IgdGhlIG9sZCBtYXBwaW5nLiAqLworCisJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSB2bWEtPnZtX21tKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkciA9IF9fcGEocGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9wYWdlX3BoeXMoYWRkcik7CisJCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpICE9IDApCisJCQlfX2ludmFsaWRhdGVfaWNhY2hlX3BhZ2VfcGh5cyhhZGRyKTsKKwl9IGVsc2UgeworCQlCVUcoKTsKKwl9Cit9CisKKyNlbmRpZgkvKiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKSAqLworCisKK3B0ZV90KiBwdGVfYWxsb2Nfb25lX2tlcm5lbCAoc3RydWN0IG1tX3N0cnVjdCogbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlwdGVfdCogcHRlID0gKHB0ZV90KilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfUkVQRUFULCAwKTsKKwlpZiAobGlrZWx5KHB0ZSkpIHsKKwkgICAgICAgCXB0ZV90KiBwdGVwID0gKHB0ZV90KikocHRlX3ZhbCgqcHRlKSArIFBBR0VfT0ZGU0VUKTsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyssIHB0ZXArKykKKwkJCXB0ZV9jbGVhcihtbSwgYWRkciwgcHRlcCk7CisJfQorCXJldHVybiBwdGU7Cit9CisKK3N0cnVjdCBwYWdlKiBwdGVfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFUEVBVCwgMCk7CisKKwlpZiAobGlrZWx5KHBhZ2UpKSB7CisJCXB0ZV90KiBwdGVwID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrLCBwdGVwKyspCisJCQlwdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOworCisJCWt1bm1hcF9hdG9taWMocHRlcCwgS01fVVNFUjApOworCX0KKwlyZXR1cm4gcGFnZTsKK30KKworCisvKgorICogSGFuZGxlIEQkL0kkIGNvaGVyZW5jeS4KKyAqCisgKiBOb3RlOgorICogV2Ugb25seSBoYXZlIG9uZSBhcmNoaXRlY3R1cmUgYml0IGZvciB0aGUgcGFnZSBmbGFncywgc28gd2UgY2Fubm90IGhhbmRsZQorICogY2FjaGUgYWxpYXNpbmcsIHlldC4KKyAqLworCit2b2lkCit1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGUpCit7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyB2YWRkciA9IGFkZHIgJiBQQUdFX01BU0s7CisKKwlpZiAoIXBmbl92YWxpZChwZm4pKQorCQlyZXR1cm47CisKKwlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKworCWludmFsaWRhdGVfaXRsYl9tYXBwaW5nKGFkZHIpOworCWludmFsaWRhdGVfZHRsYl9tYXBwaW5nKGFkZHIpOworCisJLyogV2UgaGF2ZSBhIG5ldyBtYXBwaW5nLiBVc2UgaXQuICovCisKKwl3cml0ZV9kdGxiX2VudHJ5KHB0ZSwgZHRsYl9wcm9iZShhZGRyKSk7CisKKwkvKiBJZiB0aGUgcHJvY2Vzc29yIGNhbiBleGVjdXRlIGZyb20gdGhpcyBwYWdlLCBzeW5jaHJvbml6ZSBEJC9JJC4gKi8KKworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpICE9IDApIHsKKworCQl3cml0ZV9pdGxiX2VudHJ5KHB0ZSwgaXRsYl9wcm9iZShhZGRyKSk7CisKKwkJLyogU3luY2hyb25pemUgY2FjaGVzLCBpZiBub3QgY2xlYW4uICovCisKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFBHX2NhY2hlX2NsZWFuLCAmcGFnZS0+ZmxhZ3MpKSB7CisJCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKHZhZGRyKTsKKwkJCV9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZSh2YWRkcik7CisJCX0KKwl9Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL21tL21pc2MuUyBiL2FyY2gveHRlbnNhL21tL21pc2MuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjdjMGYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbW0vbWlzYy5TCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogYXJjaC94dGVuc2EvbW0vbWlzYy5TCisgKgorICogTWlzY2VsbGFuZW91cyBhc3NlbWJseSBmdW5jdGlvbnMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIENocmlzIFphbmtlbAk8Y2hyaXNAemFua2VsLm5ldD4KKyAqLworCisvKiBOb3RlOiB3ZSBtaWdodCB3YW50IHRvIGltcGxlbWVudCBzb21lIG9mIHRoZSBsb29wcyBhcyB6ZXJvLW92ZXJoZWFkLWxvb3BzLAorICoJIHdoZXJlIGFwcGxpY2FibGUgYW5kIGlmIHN1cHBvcnRlZCBieSB0aGUgcHJvY2Vzc29yLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaW5jbHVkZSA8eHRlbnNhL2NhY2hlYXNtLmg+CisjaW5jbHVkZSA8eHRlbnNhL2NhY2hlYXR0cmFzbS5oPgorCisvKiBjbGVhcl9wYWdlIChwYWdlKSAqLworCitFTlRSWShjbGVhcl9wYWdlKQorCWVudHJ5CWExLCAxNgorCWFkZGkJYTQsIGEyLCBQQUdFX1NJWkUKKwltb3ZpCWEzLCAwCisKKzE6CXMzMmkJYTMsIGEyLCAwCisJczMyaQlhMywgYTIsIDQKKwlzMzJpCWEzLCBhMiwgOAorCXMzMmkJYTMsIGEyLCAxMgorCXMzMmkJYTMsIGEyLCAxNgorCXMzMmkJYTMsIGEyLCAyMAorCXMzMmkJYTMsIGEyLCAyNAorCXMzMmkJYTMsIGEyLCAyOAorCWFkZGkJYTIsIGEyLCAzMgorCWJsdAlhMiwgYTQsIDFiCisKKwlyZXR3CisKKy8qCisgKiBjb3B5X3BhZ2UgKHZvaWQgKnRvLCB2b2lkICpmcm9tKQorICogICAgICAgICAgICAgICAgICBhMiAgICAgICAgYTMKKyAqLworCitFTlRSWShjb3B5X3BhZ2UpCisJZW50cnkJYTEsIDE2CisJYWRkaQlhNCwgYTIsIFBBR0VfU0laRQorCisxOglsMzJpCWE1LCBhMywgMAorCWwzMmkJYTYsIGEzLCA0CisJbDMyaQlhNywgYTMsIDgKKwlzMzJpCWE1LCBhMiwgMAorCXMzMmkJYTYsIGEyLCA0CisJczMyaQlhNywgYTIsIDgKKwlsMzJpCWE1LCBhMywgMTIKKwlsMzJpCWE2LCBhMywgMTYKKwlsMzJpCWE3LCBhMywgMjAKKwlzMzJpCWE1LCBhMiwgMTIKKwlzMzJpCWE2LCBhMiwgMTYKKwlzMzJpCWE3LCBhMiwgMjAKKwlsMzJpCWE1LCBhMywgMjQKKwlsMzJpCWE2LCBhMywgMjgKKwlzMzJpCWE1LCBhMiwgMjQKKwlzMzJpCWE2LCBhMiwgMjgKKwlhZGRpCWEyLCBhMiwgMzIKKwlhZGRpCWEzLCBhMywgMzIKKwlibHQJYTIsIGE0LCAxYgorCisJcmV0dworCisKKy8qCisgKiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9hbGwodm9pZCkKKyAqLworCitFTlRSWShfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKQorCWVudHJ5CXNwLCAxNgorCWRjYWNoZV93cml0ZWJhY2tfaW52X2FsbCBhMiwgYTMKKwlpY2FjaGVfaW52YWxpZGF0ZV9hbGwgYTIsIGEzCisJcmV0dworCisvKgorICogdm9pZCBfX2ludmFsaWRhdGVfaWNhY2hlX2FsbCh2b2lkKQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfYWxsKQorCWVudHJ5CXNwLCAxNgorCWljYWNoZV9pbnZhbGlkYXRlX2FsbCBhMiwgYTMKKwlyZXR3CisKKy8qCisgKiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfYWxsKHZvaWQpCisgKi8KKworRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9hbGwpCisJZW50cnkJc3AsIDE2CisJZGNhY2hlX3dyaXRlYmFja19pbnZfYWxsIGEyLCBhMworCXJldHcKKworCisvKgorICogdm9pZCBfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfcmFuZ2UodWxvbmcgc3RhcnQsIHVsb25nIHNpemUpCisgKi8KKworRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2NhY2hlX3JhbmdlKQorCWVudHJ5CXNwLCAxNgorCW1vdglhNCwgYTIKKwltb3YJYTUsIGEzCisJZGNhY2hlX3dyaXRlYmFja19pbnZfcmVnaW9uIGE0LCBhNSwgYTYKKwlpY2FjaGVfaW52YWxpZGF0ZV9yZWdpb24gYTIsIGEzLCBhNAorCXJldHcKKworLyoKKyAqIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlKHVsb25nIHN0YXJ0KQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZSkKKwllbnRyeQlzcCwgMTYKKwltb3ZpCWEzLCBQQUdFX1NJWkUKKwlpY2FjaGVfaW52YWxpZGF0ZV9yZWdpb24gYTIsIGEzLCBhNAorCXJldHcKKworLyoKKyAqIHZvaWQgX19pbnZhbGlkYXRlX2RjYWNoZV9wYWdlKHVsb25nIHN0YXJ0KQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9kY2FjaGVfcGFnZSkKKwllbnRyeQlzcCwgMTYKKwltb3ZpCWEzLCBQQUdFX1NJWkUKKwlkY2FjaGVfaW52YWxpZGF0ZV9yZWdpb24gYTIsIGEzLCBhNAorCXJldHcKKworLyoKKyAqIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9yYW5nZSh1bG9uZyBzdGFydCwgdWxvbmcgc2l6ZSkKKyAqLworCitFTlRSWShfX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlKQorCWVudHJ5CXNwLCAxNgorCWljYWNoZV9pbnZhbGlkYXRlX3JlZ2lvbiBhMiwgYTMsIGE0CisJcmV0dworCisvKgorICogdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UpCisJZW50cnkJc3AsIDE2CisJZGNhY2hlX2ludmFsaWRhdGVfcmVnaW9uIGEyLCBhMywgYTQKKwlyZXR3CisKKy8qCisgKiB2b2lkIF9fZmx1c2hfZGNhY2hlX3BhZ2UodWxvbmcgc3RhcnQpCisgKi8KKworRU5UUlkoX19mbHVzaF9kY2FjaGVfcGFnZSkKKwllbnRyeQlzcCwgMTYKKwltb3ZpCWEzLCBQQUdFX1NJWkUKKwlkY2FjaGVfd3JpdGViYWNrX3JlZ2lvbiBhMiwgYTMsIGE0CisJcmV0dworCisvKgorICogdm9pZCBfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UodWxvbmcgc3RhcnQpCisgKi8KKworRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9wYWdlKQorCWVudHJ5CXNwLCAxNgorCW1vdmkJYTMsIFBBR0VfU0laRQorCWRjYWNoZV93cml0ZWJhY2tfaW52X3JlZ2lvbiBhMiwgYTMsIGE0CisJcmV0dworCisvKgorICogdm9pZCBfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHVsb25nIHN0YXJ0LCB1bG9uZyBzaXplKQorICovCisKK0VOVFJZKF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UpCisJZW50cnkJc3AsIDE2CisJZGNhY2hlX3dyaXRlYmFja19pbnZfcmVnaW9uIGEyLCBhMywgYTQKKwlyZXR3CisKKy8qCisgKiB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfYWxsKHZvaWQpCisgKi8KKworRU5UUlkoX19pbnZhbGlkYXRlX2RjYWNoZV9hbGwpCisJZW50cnkJc3AsIDE2CisJZGNhY2hlX2ludmFsaWRhdGVfYWxsIGEyLCBhMworCXJldHcKKworLyoKKyAqIHZvaWQgX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9wYWdlX3BoeXModWxvbmcgc3RhcnQpCisgKi8KKworRU5UUlkoX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9wYWdlX3BoeXMpCisJZW50cnkJc3AsIDE2CisKKwltb3ZpCWEzLCBYQ0hBTF9EQ0FDSEVfU0laRQorCW1vdmkJYTQsIFBBR0VfTUFTSyB8IDEKKwlhZGRpCWEyLCBhMiwgMQorCisxOglhZGRpCWEzLCBhMywgLVhDSEFMX0RDQUNIRV9MSU5FU0laRQorCisJbGRjdAlhNiwgYTMKKwlkc3luYworCWFuZAlhNiwgYTYsIGE0CisJYmVxCWE2LCBhMiwgMmYKKwliZ2V1aQlhMywgMiwgMWIKKwlyZXR3CisKKzI6CWRpd2JpCWEzLCAwCisJYmdldWkJYTMsIDIsIDFiCisJcmV0dworCitFTlRSWShjaGVja19kY2FjaGVfbG93MCkKKwllbnRyeQlzcCwgMTYKKworCW1vdmkJYTMsIFhDSEFMX0RDQUNIRV9TSVpFIC8gNAorCW1vdmkJYTQsIFBBR0VfTUFTSyB8IDEKKwlhZGRpCWEyLCBhMiwgMQorCisxOglhZGRpCWEzLCBhMywgLVhDSEFMX0RDQUNIRV9MSU5FU0laRQorCisJbGRjdAlhNiwgYTMKKwlkc3luYworCWFuZAlhNiwgYTYsIGE0CisJYmVxCWE2LCBhMiwgMmYKKwliZ2V1aQlhMywgMiwgMWIKKwlyZXR3CisKKzI6CWogMmIKKworRU5UUlkoY2hlY2tfZGNhY2hlX2hpZ2gwKQorCWVudHJ5CXNwLCAxNgorCisJbW92aQlhNSwgWENIQUxfRENBQ0hFX1NJWkUgLyA0CisJbW92aQlhMywgWENIQUxfRENBQ0hFX1NJWkUgLyAyCisJbW92aQlhNCwgUEFHRV9NQVNLIHwgMQorCWFkZGkJYTIsIGEyLCAxCisKKzE6CWFkZGkJYTMsIGEzLCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCisJYWRkaQlhNSwgYTUsIC1YQ0hBTF9EQ0FDSEVfTElORVNJWkUKKworCWxkY3QJYTYsIGEzCisJZHN5bmMKKwlhbmQJYTYsIGE2LCBhNAorCWJlcQlhNiwgYTIsIDJmCisJYmdldWkJYTUsIDIsIDFiCisJcmV0dworCisyOglqIDJiCisKK0VOVFJZKGNoZWNrX2RjYWNoZV9sb3cxKQorCWVudHJ5CXNwLCAxNgorCisJbW92aQlhNSwgWENIQUxfRENBQ0hFX1NJWkUgLyA0CisJbW92aQlhMywgWENIQUxfRENBQ0hFX1NJWkUgKiAzIC8gNAorCW1vdmkJYTQsIFBBR0VfTUFTSyB8IDEKKwlhZGRpCWEyLCBhMiwgMQorCisxOglhZGRpCWEzLCBhMywgLVhDSEFMX0RDQUNIRV9MSU5FU0laRQorCWFkZGkJYTUsIGE1LCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCisKKwlsZGN0CWE2LCBhMworCWRzeW5jCisJYW5kCWE2LCBhNiwgYTQKKwliZXEJYTYsIGEyLCAyZgorCWJnZXVpCWE1LCAyLCAxYgorCXJldHcKKworMjoJaiAyYgorCitFTlRSWShjaGVja19kY2FjaGVfaGlnaDEpCisJZW50cnkJc3AsIDE2CisKKwltb3ZpCWE1LCBYQ0hBTF9EQ0FDSEVfU0laRSAvIDQKKwltb3ZpCWEzLCBYQ0hBTF9EQ0FDSEVfU0laRQorCW1vdmkJYTQsIFBBR0VfTUFTSyB8IDEKKwlhZGRpCWEyLCBhMiwgMQorCisxOglhZGRpCWEzLCBhMywgLVhDSEFMX0RDQUNIRV9MSU5FU0laRQorCWFkZGkJYTUsIGE1LCAtWENIQUxfRENBQ0hFX0xJTkVTSVpFCisKKwlsZGN0CWE2LCBhMworCWRzeW5jCisJYW5kCWE2LCBhNiwgYTQKKwliZXEJYTYsIGEyLCAyZgorCWJnZXVpCWE1LCAyLCAxYgorCXJldHcKKworMjoJaiAyYgorCisKKy8qCisgKiB2b2lkIF9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZV9waHlzKHVsb25nIHN0YXJ0KQorICovCisKK0VOVFJZKF9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZV9waHlzKQorCWVudHJ5CXNwLCAxNgorCisJbW92aQlhMywgWENIQUxfSUNBQ0hFX1NJWkUKKwltb3ZpCWE0LCBQQUdFX01BU0sgfCAxCisJYWRkaQlhMiwgYTIsIDEKKworMToJYWRkaQlhMywgYTMsIC1YQ0hBTF9JQ0FDSEVfTElORVNJWkUKKworCWxpY3QJYTYsIGEzCisJaXN5bmMKKwlhbmQJYTYsIGE2LCBhNAorCWJlcQlhNiwgYTIsIDJmCisJYmdldWkJYTMsIDIsIDFiCisJcmV0dworCisyOglpaWkJYTMsIDAKKwliZ2V1aQlhMywgMiwgMWIKKwlyZXR3CisKKworI2lmIDAKKworCW1vdmkJYTMsIFhDSEFMX0RDQUNIRV9XQVlTIC0gMQorCW1vdmkJYTQsIFBBR0VfU0laRQorCisxOgltb3YJYTUsIGEyCisJYWRkCWE2LCBhMiwgYTQKKworMjoJZGl3YmkJYTUsIDAKKwlkaXdiaQlhNSwgWENIQUxfRENBQ0hFX0xJTkVTSVpFCisJZGl3YmkJYTUsIFhDSEFMX0RDQUNIRV9MSU5FU0laRSAqIDIKKwlkaXdiaQlhNSwgWENIQUxfRENBQ0hFX0xJTkVTSVpFICogMworCisJYWRkaQlhNSwgYTUsIFhDSEFMX0RDQUNIRV9MSU5FU0laRSAqIDQKKwlibHQJYTUsIGE2LCAyYgorCisJYWRkaQlhMywgYTMsIC0xCisJYWRkaQlhMiwgYTIsIFhDSEFMX0RDQUNIRV9TSVpFIC8gWENIQUxfRENBQ0hFX1dBWVMKKwliZ2V6CWEzLCAxYgorCisJcmV0dworCitFTlRSWShfX2ludmFsaWRhdGVfaWNhY2hlX3BhZ2VfaW5kZXgpCisJZW50cnkJc3AsIDE2CisKKwltb3ZpCWEzLCBYQ0hBTF9JQ0FDSEVfV0FZUyAtIDEKKwltb3ZpCWE0LCBQQUdFX1NJWkUKKworMToJbW92CWE1LCBhMgorCWFkZAlhNiwgYTIsIGE0CisKKzI6CWlpaQlhNSwgMAorCWlpaQlhNSwgWENIQUxfSUNBQ0hFX0xJTkVTSVpFCisJaWlpCWE1LCBYQ0hBTF9JQ0FDSEVfTElORVNJWkUgKiAyCisJaWlpCWE1LCBYQ0hBTF9JQ0FDSEVfTElORVNJWkUgKiAzCisKKwlhZGRpCWE1LCBhNSwgWENIQUxfSUNBQ0hFX0xJTkVTSVpFICogNAorCWJsdAlhNSwgYTYsIDJiCisKKwlhZGRpCWEzLCBhMywgLTEKKwlhZGRpCWEyLCBhMiwgWENIQUxfSUNBQ0hFX1NJWkUgLyBYQ0hBTF9JQ0FDSEVfV0FZUworCWJnZXoJYTMsIDJiCisKKwlyZXR3CisKKyNlbmRpZgorCisKKworCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbW0vcGd0YWJsZS5jIGIvYXJjaC94dGVuc2EvbW0vcGd0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTExOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9tbS9wZ3RhYmxlLmMKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIGFyY2gveHRlbnNhL21tL2ZhdWx0LmMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogQ2hyaXMgWmFua2VsIDxjaHJpc0B6YW5rZWwubmV0PgorICovCisKKyNpZiAoRENBQ0hFX1NJWkUgPiBQQUdFX1NJWkUpCisKK3B0ZV90KiBwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXB0ZV90ICpwdGUsIHA7CisJaW50IGNvbG9yID0gQUREUl9DT0xPUihhZGRyZXNzKTsKKwlpbnQgaTsKKworCXAgPSAocHRlX3QqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfUkVQRUFULCBDT0xPUl9PUkRFUik7CisKKwlpZiAobGlrZWx5KHApKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCWZvciAoaSA9IDA7IGkgPCBDT0xPUl9TSVpFOyBpKyssIHArKykgeworCQkJcGFnZSA9IHZpcnRfdG9fcGFnZShwdGUpOworCisJCQlzZXRfcGFnZV9jb3VudChwYWdlLCAxKTsKKwkJCUNsZWFyUGFnZUNvbXBvdW5kKHBhZ2UpOworCisJCQlpZiAoQUREUl9DT0xPUihwKSA9PSBjb2xvcikKKwkJCQlwdGUgPSBwOworCQkJZWxzZQorCQkJCWZyZWVfcGFnZShwKTsKKwkJfQorCQljbGVhcl9wYWdlKHB0ZSk7CisJfQorCXJldHVybiBwdGU7Cit9CisKKyNpZmRlZiBQUk9GSUxJTkcKKworaW50IG1hc2s7CitpbnQgaGl0OworaW50IGZsdXNoOworCisjZW5kaWYKKworc3RydWN0IHBhZ2UqIHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgcDsKKwlpbnQgY29sb3IgPSBBRERSX0NPTE9SKGFkZHJlc3MpOworCisJcCA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQsIFBURV9PUkRFUik7CisKKwlpZiAobGlrZWx5KHApKSB7CisJCWZvciAoaSA9IDA7IGkgPCBQQUdFX09SREVSOyBpKyspIHsKKwkJCXNldF9wYWdlX2NvdW50KHAsIDEpOworCQkJQ2xlYXJQYWdlQ29tcG91bmQocCk7CisKKwkJCWlmIChQQUREUl9DT0xPUihwYWdlX2FkZHJlc3MocGcpKSA9PSBjb2xvcikKKwkJCQlwYWdlID0gcDsKKwkJCWVsc2UKKwkJCQlmcmVlX3BhZ2UocCk7CisJCX0KKwkJY2xlYXJfaGlnaHBhZ2UocGFnZSk7CisJfQorCisJcmV0dXJuIHBhZ2U7Cit9CisKKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvbW0vdGxiLmMgYi9hcmNoL3h0ZW5zYS9tbS90bGIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2JkM2JmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvbW0vdGxiLmMKQEAgLTAsMCArMSw1NDUgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9tbS9tbXUuYworICoKKyAqIExvZ2ljIHRoYXQgbWFuaXB1bGF0ZXMgdGhlIFh0ZW5zYSBNTVUuICBEZXJpdmVkIGZyb20gTUlQUy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDAzIFRlbnNpbGljYSBJbmMuCisgKgorICogSm9lIFRheWxvcgorICogQ2hyaXMgWmFua2VsCTxjaHJpc0B6YW5rZWwubmV0PgorICogTWFyYyBHYXV0aGllcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworCitzdGF0aWMgaW5saW5lIHZvaWQgX19mbHVzaF9pdGxiX2FsbCAodm9pZCkKK3sKKwlpbnQgd2F5LCBpbmRleDsKKworCWZvciAod2F5ID0gMDsgd2F5IDwgWENIQUxfSVRMQl9BUkZfV0FZUzsgd2F5KyspIHsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgSVRMQl9FTlRSSUVTX1BFUl9BUkZfV0FZOyBpbmRleCsrKSB7CisJCQlpbnQgZW50cnkgPSB3YXkgKyAoaW5kZXggPDwgUEFHRV9TSElGVCk7CisJCQlpbnZhbGlkYXRlX2l0bGJfZW50cnlfbm9faXN5bmMgKGVudHJ5KTsKKwkJfQorCX0KKwlhc20gdm9sYXRpbGUgKCJpc3luY1xuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX2R0bGJfYWxsICh2b2lkKQoreworCWludCB3YXksIGluZGV4OworCisJZm9yICh3YXkgPSAwOyB3YXkgPCBYQ0hBTF9EVExCX0FSRl9XQVlTOyB3YXkrKykgeworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBEVExCX0VOVFJJRVNfUEVSX0FSRl9XQVk7IGluZGV4KyspIHsKKwkJCWludCBlbnRyeSA9IHdheSArIChpbmRleCA8PCBQQUdFX1NISUZUKTsKKwkJCWludmFsaWRhdGVfZHRsYl9lbnRyeV9ub19pc3luYyAoZW50cnkpOworCQl9CisJfQorCWFzbSB2b2xhdGlsZSAoImlzeW5jXG4iKTsKK30KKworCit2b2lkIGZsdXNoX3RsYl9hbGwgKHZvaWQpCit7CisJX19mbHVzaF9pdGxiX2FsbCgpOworCV9fZmx1c2hfZHRsYl9hbGwoKTsKK30KKworLyogSWYgbW0gaXMgY3VycmVudCwgd2Ugc2ltcGx5IGFzc2lnbiB0aGUgY3VycmVudCB0YXNrIGEgbmV3IEFTSUQsIHRodXMsCisgKiBpbnZhbGlkYXRpbmcgYWxsIHByZXZpb3VzIHRsYiBlbnRyaWVzLiBJZiBtbSBpcyBzb21lb25lIGVsc2UncyB1c2VyIG1hcHBpbmcsCisgKiB3aWUgaW52YWxpZGF0ZSB0aGUgY29udGV4dCwgdGh1cywgd2hlbiB0aGF0IHVzZXIgbWFwcGluZyBpcyBzd2FwcGVkIGluLAorICogYSBuZXcgY29udGV4dCB3aWxsIGJlIGFzc2lnbmVkIHRvIGl0LgorICovCisKK3ZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworI2lmIDAKKwlwcmludGsoIlt0bGJtbTwlbHg+XVxuIiwgKHVuc2lnbmVkIGxvbmcpbW0tPmNvbnRleHQpOworI2VuZGlmCisKKwlpZiAobW0gPT0gY3VycmVudC0+YWN0aXZlX21tKSB7CisJCWludCBmbGFnczsKKwkJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisJCWdldF9uZXdfbW11X2NvbnRleHQobW0sIGFzaWRfY2FjaGUpOworCQlzZXRfcmFzaWRfcmVnaXN0ZXIoQVNJRF9JTlNFUlQobW0tPmNvbnRleHQpKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKwllbHNlCisJCW1tLT5jb250ZXh0ID0gMDsKK30KKwordm9pZCBmbHVzaF90bGJfcmFuZ2UgKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorICAgIAkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobW0tPmNvbnRleHQgPT0gTk9fQ09OVEVYVCkKKwkJcmV0dXJuOworCisjaWYgMAorCXByaW50aygiW3RsYnJhbmdlPCUwMmx4LCUwOGx4LCUwOGx4Pl1cbiIsCisJCQkodW5zaWduZWQgbG9uZyltbS0+Y29udGV4dCwgc3RhcnQsIGVuZCk7CisjZW5kaWYKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKworCWlmIChlbmQtc3RhcnQgKyAoUEFHRV9TSVpFLTEpIDw9IFNNQUxMRVNUX05UTEJfRU5UUklFUyA8PCBQQUdFX1NISUZUKSB7CisJCWludCBvbGRwaWQgPSBnZXRfcmFzaWRfcmVnaXN0ZXIoKTsKKwkJc2V0X3Jhc2lkX3JlZ2lzdGVyIChBU0lEX0lOU0VSVChtbS0+Y29udGV4dCkpOworCQlzdGFydCAmPSBQQUdFX01BU0s7CisgCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCisJCQl3aGlsZShzdGFydCA8IGVuZCkgeworCQkJCWludmFsaWRhdGVfaXRsYl9tYXBwaW5nKHN0YXJ0KTsKKwkJCQlpbnZhbGlkYXRlX2R0bGJfbWFwcGluZyhzdGFydCk7CisJCQkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQkJfQorCQllbHNlCisJCQl3aGlsZShzdGFydCA8IGVuZCkgeworCQkJCWludmFsaWRhdGVfZHRsYl9tYXBwaW5nKHN0YXJ0KTsKKwkJCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCQl9CisKKwkJc2V0X3Jhc2lkX3JlZ2lzdGVyKG9sZHBpZCk7CisJfSBlbHNlIHsKKwkJZ2V0X25ld19tbXVfY29udGV4dChtbSwgYXNpZF9jYWNoZSk7CisJCWlmIChtbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pCisJCQlzZXRfcmFzaWRfcmVnaXN0ZXIoQVNJRF9JTlNFUlQobW0tPmNvbnRleHQpKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCit2b2lkIGZsdXNoX3RsYl9wYWdlIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QqIG1tID0gdm1hLT52bV9tbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvbGRwaWQ7CisjaWYgMAorCXByaW50aygiW3RsYnBhZ2U8JTAybHgsJTA4bHg+XVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKW1tLT5jb250ZXh0LCBwYWdlKTsKKyNlbmRpZgorCisJaWYobW0tPmNvbnRleHQgPT0gTk9fQ09OVEVYVCkKKwkJcmV0dXJuOworCisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisKKyAgICAgICAJb2xkcGlkID0gZ2V0X3Jhc2lkX3JlZ2lzdGVyKCk7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCisJCWludmFsaWRhdGVfaXRsYl9tYXBwaW5nKHBhZ2UpOworCWludmFsaWRhdGVfZHRsYl9tYXBwaW5nKHBhZ2UpOworCisJc2V0X3Jhc2lkX3JlZ2lzdGVyKG9sZHBpZCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyNpZiAwCisJZmx1c2hfdGxiX2FsbCgpOworCXJldHVybjsKKyNlbmRpZgorfQorCisKKyNpZmRlZiBERUJVR19UTEIKKworI2RlZmluZSBVU0VfSVRMQiAgMAorI2RlZmluZSBVU0VfRFRMQiAgMQorCitzdHJ1Y3Qgd2F5X2NvbmZpZ190IHsKKwlpbnQgaW5kaWNpZXM7CisJaW50IGluZGljaWVzX2xvZzI7CisJaW50IHBnc3pfbG9nMjsKKwlpbnQgYXJmOworfTsKKworc3RhdGljIHN0cnVjdCB3YXlfY29uZmlnX3QgaXRsYltYQ0hBTF9JVExCX1dBWVNdID0KK3sKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMF9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkwX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMF9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTBfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMV9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkxX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMV9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTFfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMl9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkyX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMl9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTJfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZM19TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkzX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZM19TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTNfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNF9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk0X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNF9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTRfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNV9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk1X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNV9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTVfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNl9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk2X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNl9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTZfU0VULCBBUkYpCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB3YXlfY29uZmlnX3QgZHRsYltYQ0hBTF9EVExCX1dBWVNdID0KK3sKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMF9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkwX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMF9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTBfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMV9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkxX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMV9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTFfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMl9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkyX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMl9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTJfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZM19TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkzX1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZM19TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTNfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNF9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk0X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNF9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTRfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNV9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk1X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNV9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTVfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNl9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk2X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNl9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTZfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZN19TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk3X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZN19TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTdfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOF9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk4X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOF9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWThfU0VULCBBUkYpCisJfSwKKwl7IFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOV9TRVQsIEVOVFJJRVMpLAorCSAgWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk5X1NFVCwgRU5UUklFU19MT0cyKSwKKwkgIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZOV9TRVQsIFBBR0VTWl9MT0cyX01JTiksCisJICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTlfU0VULCBBUkYpCisJfQorfTsKKworLyogIFRvdGFsIG51bWJlciBvZiBlbnRyaWVzOiAgKi8KKyNkZWZpbmUgSVRMQl9UT1RBTF9FTlRSSUVTCVwKKwkJWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkwX1NFVCwgRU5UUklFUykgKyBcCisJCVhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZMV9TRVQsIEVOVFJJRVMpICsgXAorCQlYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTJfU0VULCBFTlRSSUVTKSArIFwKKwkJWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVkzX1NFVCwgRU5UUklFUykgKyBcCisJCVhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfV0FZNF9TRVQsIEVOVFJJRVMpICsgXAorCQlYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX1dBWTVfU0VULCBFTlRSSUVTKSArIFwKKwkJWENIQUxfSVRMQl9TRVQoWENIQUxfSVRMQl9XQVk2X1NFVCwgRU5UUklFUykKKyNkZWZpbmUgRFRMQl9UT1RBTF9FTlRSSUVTCVwKKwkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkwX1NFVCwgRU5UUklFUykgKyBcCisJCVhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZMV9TRVQsIEVOVFJJRVMpICsgXAorCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTJfU0VULCBFTlRSSUVTKSArIFwKKwkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVkzX1NFVCwgRU5UUklFUykgKyBcCisJCVhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZNF9TRVQsIEVOVFJJRVMpICsgXAorCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWTVfU0VULCBFTlRSSUVTKSArIFwKKwkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk2X1NFVCwgRU5UUklFUykgKyBcCisJCVhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfV0FZN19TRVQsIEVOVFJJRVMpICsgXAorCQlYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX1dBWThfU0VULCBFTlRSSUVTKSArIFwKKwkJWENIQUxfRFRMQl9TRVQoWENIQUxfRFRMQl9XQVk5X1NFVCwgRU5UUklFUykKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQJCXZhOworICAgIHVuc2lnbmVkCQlwYTsKKyAgICB1bnNpZ25lZCBjaGFyCWFzaWQ7CisgICAgdW5zaWduZWQgY2hhcgljYTsKKyAgICB1bnNpZ25lZCBjaGFyCXdheTsKKyAgICB1bnNpZ25lZCBjaGFyCWluZGV4OworICAgIHVuc2lnbmVkIGNoYXIJcGdzel9sb2cyOwkvKiAwIC4uIDMyICovCisgICAgdW5zaWduZWQgY2hhcgl0eXBlOwkJLyogMD1JVExCIDE9RFRMQiAqLworfSB0bGJfZHVtcF9lbnRyeV90OworCisvKiAgUmV0dXJuIC0xIGlmIGEgcHJlY2VkZXMgYiwgKzEgaWYgYSBmb2xsb3dzIGIsIDAgaWYgc2FtZTogICovCitpbnQgY21wX3RsYl9kdW1wX2luZm8oIHRsYl9kdW1wX2VudHJ5X3QgKmEsIHRsYl9kdW1wX2VudHJ5X3QgKmIgKQoreworICAgIGlmIChhLT5hc2lkIDwgYi0+YXNpZCkgcmV0dXJuIC0xOworICAgIGlmIChhLT5hc2lkID4gYi0+YXNpZCkgcmV0dXJuICAxOworICAgIGlmIChhLT52YSA8IGItPnZhKSByZXR1cm4gLTE7CisgICAgaWYgKGEtPnZhID4gYi0+dmEpIHJldHVybiAgMTsKKyAgICBpZiAoYS0+cGEgPCBiLT5wYSkgcmV0dXJuIC0xOworICAgIGlmIChhLT5wYSA+IGItPnBhKSByZXR1cm4gIDE7CisgICAgaWYgKGEtPmNhIDwgYi0+Y2EpIHJldHVybiAtMTsKKyAgICBpZiAoYS0+Y2EgPiBiLT5jYSkgcmV0dXJuICAxOworICAgIGlmIChhLT53YXkgPCBiLT53YXkpIHJldHVybiAtMTsKKyAgICBpZiAoYS0+d2F5ID4gYi0+d2F5KSByZXR1cm4gIDE7CisgICAgaWYgKGEtPmluZGV4IDwgYi0+aW5kZXgpIHJldHVybiAtMTsKKyAgICBpZiAoYS0+aW5kZXggPiBiLT5pbmRleCkgcmV0dXJuICAxOworICAgIHJldHVybiAwOworfQorCit2b2lkIHNvcnRfdGxiX2R1bXBfaW5mbyggdGxiX2R1bXBfZW50cnlfdCAqdCwgaW50IG4gKQoreworICAgIGludCBpLCBqOworICAgIC8qICBTaW1wbGUgTyhuKm4pIHNvcnQ6ICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuLTE7IGkrKykKKwlmb3IgKGogPSBpKzE7IGogPCBuOyBqKyspCisJICAgIGlmIChjbXBfdGxiX2R1bXBfaW5mbyh0K2ksIHQraikgPiAwKSB7CisJCXRsYl9kdW1wX2VudHJ5X3QgdG1wID0gdFtpXTsKKwkJdFtpXSA9IHRbal07CisJCXRbal0gPSB0bXA7CisJICAgIH0KK30KKworCitzdGF0aWMgdGxiX2R1bXBfZW50cnlfdCBpdGxiX2R1bXBfaW5mb1tJVExCX1RPVEFMX0VOVFJJRVNdOworc3RhdGljIHRsYl9kdW1wX2VudHJ5X3QgZHRsYl9kdW1wX2luZm9bRFRMQl9UT1RBTF9FTlRSSUVTXTsKKworCitzdGF0aWMgaW5saW5lIGNoYXIgKndheV90eXBlIChpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdHlwZSA/ICJhdXRvcmVmaWxsIiA6ICJub24tYXV0b3JlZmlsbCI7Cit9CisKK3ZvaWQgcHJpbnRfZW50cnkgKHN0cnVjdCB3YXlfY29uZmlnX3QgKndheV9pbmZvLAorCQkgIHVuc2lnbmVkIGludCB3YXksCisJCSAgdW5zaWduZWQgaW50IGluZGV4LAorCQkgIHVuc2lnbmVkIGludCB2aXJ0dWFsLAorCQkgIHVuc2lnbmVkIGludCB0cmFuc2xhdGlvbikKK3sKKwljaGFyIHZhbGlkX2NocjsKKwl1bnNpZ25lZCBpbnQgdmEsIHBhLCBhc2lkLCBjYTsKKworCXZhID0gdmlydHVhbCAmCisJICAJfigoMSA8PCAod2F5X2luZm8tPnBnc3pfbG9nMiArIHdheV9pbmZvLT5pbmRpY2llc19sb2cyKSkgLSAxKTsKKwlhc2lkID0gdmlydHVhbCAmICgoMSA8PCBYQ0hBTF9NTVVfQVNJRF9CSVRTKSAtIDEpOworCXBhID0gdHJhbnNsYXRpb24gJiB+KCgxIDw8IHdheV9pbmZvLT5wZ3N6X2xvZzIpIC0gMSk7CisJY2EgPSB0cmFuc2xhdGlvbiAmICgoMSA8PCBYQ0hBTF9NTVVfQ0FfQklUUykgLSAxKTsKKwl2YWxpZF9jaHIgPSBhc2lkID8gJ1YnIDogJ0knOworCisJLyogQ29tcHV0ZSBhbmQgaW5jb3Jwb3JhdGUgdGhlIGVmZmVjdCBvZiB0aGUgaW5kZXggYml0cyBvbiB0aGUKKwkgKiB2YS4gIEl0J3MgbW9yZSB1c2VmdWwgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcsIHNpbmNlIHdlIGFsd2F5cworCSAqIHdhbnQgdG8ga25vdyB0aGUgZWZmZWN0aXZlIHZhIGFueXdheS4gKi8KKworCXZhICs9IGluZGV4IDw8IHdheV9pbmZvLT5wZ3N6X2xvZzI7CisKKwlwcmludGsgKCJcdFslZCwlZF0gKCVjKSB2cG4gMHglLjh4ICBwcG4gMHglLjh4ICBhc2lkIDB4JS4yeCAgYW0gMHgleFxuIiwKKwkJd2F5LCBpbmRleCwgdmFsaWRfY2hyLCB2YSwgcGEsIGFzaWQsIGNhKTsKK30KKwordm9pZCBwcmludF9pdGxiX2VudHJ5IChzdHJ1Y3Qgd2F5X2NvbmZpZ190ICp3YXlfaW5mbywgaW50IHdheSwgaW50IGluZGV4KQoreworCXByaW50X2VudHJ5ICh3YXlfaW5mbywgd2F5LCBpbmRleCwKKwkJICAgICByZWFkX2l0bGJfdmlydHVhbCAod2F5ICsgKGluZGV4IDw8IHdheV9pbmZvLT5wZ3N6X2xvZzIpKSwKKwkJICAgICByZWFkX2l0bGJfdHJhbnNsYXRpb24gKHdheSArIChpbmRleCA8PCB3YXlfaW5mby0+cGdzel9sb2cyKSkpOworfQorCit2b2lkIHByaW50X2R0bGJfZW50cnkgKHN0cnVjdCB3YXlfY29uZmlnX3QgKndheV9pbmZvLCBpbnQgd2F5LCBpbnQgaW5kZXgpCit7CisJcHJpbnRfZW50cnkgKHdheV9pbmZvLCB3YXksIGluZGV4LAorCQkgICAgIHJlYWRfZHRsYl92aXJ0dWFsICh3YXkgKyAoaW5kZXggPDwgd2F5X2luZm8tPnBnc3pfbG9nMikpLAorCQkgICAgIHJlYWRfZHRsYl90cmFuc2xhdGlvbiAod2F5ICsgKGluZGV4IDw8IHdheV9pbmZvLT5wZ3N6X2xvZzIpKSk7Cit9CisKK3ZvaWQgZHVtcF9pdGxiICh2b2lkKQoreworCWludCB3YXksIGluZGV4OworCisJcHJpbnRrICgiXG5JVExCOiB3YXlzID0gJWRcbiIsIFhDSEFMX0lUTEJfV0FZUyk7CisKKwlmb3IgKHdheSA9IDA7IHdheSA8IFhDSEFMX0lUTEJfV0FZUzsgd2F5KyspIHsKKwkJcHJpbnRrICgiXG5XYXk6ICVkLCBFbnRyaWVzOiAlZCwgTWluUGFnZVNpemU6ICVkLCBUeXBlOiAlc1xuIiwKKwkJCXdheSwgaXRsYlt3YXldLmluZGljaWVzLAorCQkJaXRsYlt3YXldLnBnc3pfbG9nMiwgd2F5X3R5cGUoaXRsYlt3YXldLmFyZikpOworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpdGxiW3dheV0uaW5kaWNpZXM7IGluZGV4KyspIHsKKwkJCXByaW50X2l0bGJfZW50cnkoJml0bGJbd2F5XSwgd2F5LCBpbmRleCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgZHVtcF9kdGxiICh2b2lkKQoreworCWludCB3YXksIGluZGV4OworCisJcHJpbnRrICgiXG5EVExCOiB3YXlzID0gJWRcbiIsIFhDSEFMX0RUTEJfV0FZUyk7CisKKwlmb3IgKHdheSA9IDA7IHdheSA8IFhDSEFMX0RUTEJfV0FZUzsgd2F5KyspIHsKKwkJcHJpbnRrICgiXG5XYXk6ICVkLCBFbnRyaWVzOiAlZCwgTWluUGFnZVNpemU6ICVkLCBUeXBlOiAlc1xuIiwKKwkJCXdheSwgZHRsYlt3YXldLmluZGljaWVzLAorCQkJZHRsYlt3YXldLnBnc3pfbG9nMiwgd2F5X3R5cGUoZHRsYlt3YXldLmFyZikpOworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBkdGxiW3dheV0uaW5kaWNpZXM7IGluZGV4KyspIHsKKwkJCXByaW50X2R0bGJfZW50cnkoJmR0bGJbd2F5XSwgd2F5LCBpbmRleCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgZHVtcF90bGIgKHRsYl9kdW1wX2VudHJ5X3QgKnRpbmZvLCBzdHJ1Y3Qgd2F5X2NvbmZpZ190ICpjb25maWcsCisJCWludCBlbnRyaWVzLCBpbnQgd2F5cywgaW50IHR5cGUsIGludCBzaG93X2ludmFsaWQpCit7CisgICAgdGxiX2R1bXBfZW50cnlfdCAqZSA9IHRpbmZvOworICAgIGludCB3YXksIGk7CisKKyAgICAvKiAgR2F0aGVyIGFsbCBpbmZvOiAgKi8KKyAgICBmb3IgKHdheSA9IDA7IHdheSA8IHdheXM7IHdheSsrKSB7CisJc3RydWN0IHdheV9jb25maWdfdCAqY2ZnID0gY29uZmlnICsgd2F5OworCWZvciAoaSA9IDA7IGkgPCBjZmctPmluZGljaWVzOyBpKyspIHsKKwkgICAgdW5zaWduZWQgd2F5aW5kZXggPSB3YXkgKyAoaSA8PCBjZmctPnBnc3pfbG9nMik7CisJICAgIHVuc2lnbmVkIHZ2ID0gKHR5cGUgPyByZWFkX2R0bGJfdmlydHVhbCAod2F5aW5kZXgpCisJCSAgICAJCTogcmVhZF9pdGxiX3ZpcnR1YWwgKHdheWluZGV4KSk7CisJICAgIHVuc2lnbmVkIHBwID0gKHR5cGUgPyByZWFkX2R0bGJfdHJhbnNsYXRpb24gKHdheWluZGV4KQorCQkgICAgCQk6IHJlYWRfaXRsYl90cmFuc2xhdGlvbiAod2F5aW5kZXgpKTsKKworCSAgICAvKiBDb21wdXRlIGFuZCBpbmNvcnBvcmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBpbmRleCBiaXRzIG9uIHRoZQorCSAgICAgKiB2YS4gIEl0J3MgbW9yZSB1c2VmdWwgZm9yIGtlcm5lbCBkZWJ1Z2dpbmcsIHNpbmNlIHdlIGFsd2F5cworCSAgICAgKiB3YW50IHRvIGtub3cgdGhlIGVmZmVjdGl2ZSB2YSBhbnl3YXkuICovCisKKwkgICAgZS0+dmEgPSAodnYgJiB+KCgxIDw8IChjZmctPnBnc3pfbG9nMiArIGNmZy0+aW5kaWNpZXNfbG9nMikpIC0gMSkpOworCSAgICBlLT52YSArPSAoaSA8PCBjZmctPnBnc3pfbG9nMik7CisJICAgIGUtPnBhID0gKHBwICYgfigoMSA8PCBjZmctPnBnc3pfbG9nMikgLSAxKSk7CisJICAgIGUtPmFzaWQgPSAodnYgJiAoKDEgPDwgWENIQUxfTU1VX0FTSURfQklUUykgLSAxKSk7CisJICAgIGUtPmNhID0gKHBwICYgKCgxIDw8IFhDSEFMX01NVV9DQV9CSVRTKSAtIDEpKTsKKwkgICAgZS0+d2F5ID0gd2F5OworCSAgICBlLT5pbmRleCA9IGk7CisJICAgIGUtPnBnc3pfbG9nMiA9IGNmZy0+cGdzel9sb2cyOworCSAgICBlLT50eXBlID0gdHlwZTsKKwkgICAgZSsrOworCX0KKyAgICB9CisjaWYgMQorICAgIC8qICBTb3J0IGJ5IEFTSUQgYW5kIFZBRERSOiAgKi8KKyAgICBzb3J0X3RsYl9kdW1wX2luZm8gKHRpbmZvLCBlbnRyaWVzKTsKKyNlbmRpZgorCisgICAgLyogIERpc3BsYXkgYWxsIHNvcnRlZCBpbmZvOiAgKi8KKyAgICBwcmludGsgKCJcbiVjVExCIGR1bXA6XG4iLCAodHlwZSA/ICdEJyA6ICdJJykpOworICAgIGZvciAoZSA9IHRpbmZvLCBpID0gMDsgaSA8IGVudHJpZXM7IGkrKywgZSsrKSB7CisjaWYgMAorCWlmIChlLT5hc2lkID09IDAgJiYgIXNob3dfaW52YWxpZCkKKwkgICAgY29udGludWU7CisjZW5kaWYKKwlwcmludGsgKCIlYyB3YXk9JWQgaT0lZCAgQVNJRD0lMDJYIFY9JTA4WCAtPiBQPSUwOFggQ0E9JVggKCVkICVjQilcbiIsCisJCShlLT50eXBlID8gJ0QnIDogJ0knKSwgZS0+d2F5LCBlLT5pbmRleCwKKwkJZS0+YXNpZCwgZS0+dmEsIGUtPnBhLCBlLT5jYSwKKwkJKDEgPDwgKGUtPnBnc3pfbG9nMiAlIDEwKSksCisJCSIga01HIltlLT5wZ3N6X2xvZzIgLyAxMF0KKwkJKTsKKyAgICB9Cit9CisKK3ZvaWQgZHVtcF90bGJzMiAoaW50IHNob3dpbnYpCit7CisgICAgZHVtcF90bGIgKGl0bGJfZHVtcF9pbmZvLCBpdGxiLCBJVExCX1RPVEFMX0VOVFJJRVMsIFhDSEFMX0lUTEJfV0FZUywgMCwgc2hvd2ludik7CisgICAgZHVtcF90bGIgKGR0bGJfZHVtcF9pbmZvLCBkdGxiLCBEVExCX1RPVEFMX0VOVFJJRVMsIFhDSEFMX0RUTEJfV0FZUywgMSwgc2hvd2ludik7Cit9CisKK3ZvaWQgZHVtcF9hbGxfdGxicyAodm9pZCkKK3sKKyAgICBkdW1wX3RsYnMyICgxKTsKK30KKwordm9pZCBkdW1wX3ZhbGlkX3RsYnMgKHZvaWQpCit7CisgICAgZHVtcF90bGJzMiAoMCk7Cit9CisKKwordm9pZCBkdW1wX3RsYnMgKHZvaWQpCit7CisJZHVtcF9pdGxiKCk7CisJZHVtcF9kdGxiKCk7Cit9CisKK3ZvaWQgZHVtcF9jYWNoZV90YWcoaW50IGRjYWNoZSwgaW50IGlkeCkKK3sKKwlpbnQgdywgaSwgcywgZTsKKwl1bnNpZ25lZCBsb25nIHRhZywgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBudW1fbGluZXMsIG51bV93YXlzLCBjYWNoZV9zaXplLCBsaW5lX3NpemU7CisKKwludW1fd2F5cyA9IGRjYWNoZSA/IFhDSEFMX0RDQUNIRV9XQVlTIDogWENIQUxfSUNBQ0hFX1dBWVM7CisJY2FjaGVfc2l6ZSA9IGRjYWNoZSA/IFhDSEFMX0RDQUNIRV9TSVpFIDogWENIQUxfSUNBQ0hFX1NJWkU7CisJbGluZV9zaXplID0gZGNhY2hlID8gWENIQUxfRENBQ0hFX0xJTkVTSVpFIDogWENIQUxfSUNBQ0hFX0xJTkVTSVpFOworCisJbnVtX2xpbmVzID0gY2FjaGVfc2l6ZSAvIG51bV93YXlzOworCisJcyA9IDA7IGUgPSBudW1fbGluZXM7CisKKwlpZiAoaWR4ID49IDApCisJCWUgPSAocyA9IGlkeCAqIGxpbmVfc2l6ZSkgKyAxOworCisJZm9yIChpID0gczsgaSA8IGU7IGkrPSBsaW5lX3NpemUpIHsKKwkJcHJpbnRrKCJcbmxpbmUgJSMwOHg6IiwgaSk7CisJCWZvciAodyA9IDA7IHcgPCBudW1fd2F5czsgdysrKSB7CisJCQlpbmRleCA9IHcgKiBudW1fbGluZXMgKyBpOworCQkJaWYgKGRjYWNoZSkKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGRjdCAlMCwgJTFcblx0IgorCQkJCQkJOiAiPWEiKHRhZykgOiAiYSIoaW5kZXgpKTsKKwkJCWVsc2UKKwkJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGljdCAlMCwgJTFcblx0IgorCQkJCQkJOiAiPWEiKHRhZykgOiAiYSIoaW5kZXgpKTsKKworCQkJcHJpbnRrKCIgJSMwMTBseCIsIHRhZyk7CisJCX0KKwl9CisJcHJpbnRrICgiXG4iKTsKK30KKwordm9pZCBkdW1wX2ljYWNoZShpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhLCBhZGRyOworCWludCB3LCBpOworCisJY29uc3QgdW5zaWduZWQgbG9uZyBudW1fd2F5cyA9IFhDSEFMX0lDQUNIRV9XQVlTOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgY2FjaGVfc2l6ZSA9IFhDSEFMX0lDQUNIRV9TSVpFOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbGluZV9zaXplID0gWENIQUxfSUNBQ0hFX0xJTkVTSVpFOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbnVtX2xpbmVzID0gY2FjaGVfc2l6ZSAvIG51bV93YXlzIC8gbGluZV9zaXplOworCisJZm9yICh3ID0gMDsgdyA8IG51bV93YXlzOyB3KyspIHsKKwkJcHJpbnRrICgiXG5XYXkgJWQiLCB3KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbGluZV9zaXplOyBpKz0gNCkgeworCQkJYWRkciA9IHcgKiBudW1fbGluZXMgKyBpbmRleCAqIGxpbmVfc2l6ZSArIGk7CisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibGljdyAlMCwgJTFcblx0IgorCQkJCQk6ICI9YSIoZGF0YSkgOiAiYSIoYWRkcikpOworCQkJcHJpbnRrKCIgJSMwMTBseCIsIGRhdGEpOworCQl9CisJfQorCXByaW50ayAoIlxuIik7Cit9CisKK3ZvaWQgZHVtcF9jYWNoZV90YWdzKHZvaWQpCit7CisJcHJpbnRrKCJJbnN0cnVjdGlvbiBjYWNoZVxuIik7CisJZHVtcF9jYWNoZV90YWcoMCwgLTEpOworCXByaW50aygiRGF0YSBjYWNoZVxuIik7CisJZHVtcF9jYWNoZV90YWcoMSwgLTEpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM5NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMgJElkOiBNYWtlZmlsZSx2IDEuMS4xLjEgMjAwMi8wOC8yOCAxNjoxMDoxNCBhcm9sbCBFeHAgJAorIworIyBNYWtlZmlsZSBmb3IgdGhlIFh0ZW5zYSBJbnN0cnVjdGlvbiBTZXQgU2ltdWxhdG9yIChJU1MpCisjICJwcm9tIG1vbml0b3IiIGxpYnJhcnkgcm91dGluZXMgdW5kZXIgTGludXguCisjCisjIE5vdGUhIERlcGVuZGVuY2llcyBhcmUgZG9uZSBhdXRvbWFnaWNhbGx5IGJ5ICdtYWtlIGRlcCcsIHdoaWNoIGFsc28KKyMgcmVtb3ZlcyBhbnkgb2xkIGRlcGVuZGVuY2llcy4gRE9OJ1QgcHV0IHlvdXIgb3duIGRlcGVuZGVuY2llcyBoZXJlCisjIHVubGVzcyBpdCdzIHNvbWV0aGluZyBzcGVjaWFsIChpZSBub3QgYSAuYyBmaWxlKS4KKyMKKyMgTm90ZSAyISBUaGUgQ0ZMQUdTIGRlZmluaXRpb25zIGFyZSBpbiB0aGUgbWFpbiBtYWtlZmlsZS4uLgorCitvYmoteQkJCT0gaW8ubyBjb25zb2xlLm8gc2V0dXAubyBuZXR3b3JrLm8KKwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvcGxhdGZvcm0taXNzL2NvbnNvbGUuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiZGRmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9jb25zb2xlLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvY29uc29sZS5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgVGVuc2lsaWNhIEluYy4KKyAqICAgQXV0aG9ycwlDaHJpc3RpYW4gWmFua2VsLCBKb2UgVGF5bG9yCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsUC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSA8eHRlbnNhL3NpbWNhbGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisKKyNpZmRlZiBTRVJJQUxfSU5MSU5FCisjZGVmaW5lIF9JTkxJTkVfIGlubGluZQorI2VuZGlmCisKKyNkZWZpbmUgU0VSSUFMX01BWF9OVU1fTElORVMgMQorI2RlZmluZSBTRVJJQUxfVElNRVJfVkFMVUUgKDIwICogSFopCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzZXJpYWxfdGltZXI7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGltZXJfbG9jayk7CisKK2ludCBlcnJubzsKKworc3RhdGljIGludCBfX3NpbWMgKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkLCBpbnQgZSwgaW50IGYpCit7CisJaW50IHJldDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInNpbWNhbGxcbiIKKwkJCSJtb3YgJTAsIGEyXG4iCisJCQkibW92ICUxLCBhM1xuIiA6ICI9YSIgKHJldCksICI9YSIgKGVycm5vKQorCQkJOiA6ICJhMiIsICJhMyIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjaGFyICpzZXJpYWxfdmVyc2lvbiA9ICIwLjEiOworc3RhdGljIGNoYXIgKnNlcmlhbF9uYW1lID0gIklTUyBzZXJpYWwgZHJpdmVyIjsKKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAorICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBhc3luYyBzdHJ1Y3R1cmUgaW50bworICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKKyAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgdm9pZCByc19wb2xsKHVuc2lnbmVkIGxvbmcpOworCitzdGF0aWMgaW50IHJzX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWludCBsaW5lID0gdHR5LT5pbmRleDsKKworCWlmICgobGluZSA8IDApIHx8IChsaW5lID49IFNFUklBTF9NQVhfTlVNX0xJTkVTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2soJnRpbWVyX2xvY2spOworCisJaWYgKHR0eS0+Y291bnQgPT0gMSkgeworCQlpbml0X3RpbWVyKCZzZXJpYWxfdGltZXIpOworCQlzZXJpYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0dHk7CisJCXNlcmlhbF90aW1lci5mdW5jdGlvbiA9IHJzX3BvbGw7CisJCW1vZF90aW1lcigmc2VyaWFsX3RpbWVyLCBqaWZmaWVzICsgU0VSSUFMX1RJTUVSX1ZBTFVFKTsKKwl9CisJc3Bpbl91bmxvY2soJnRpbWVyX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaXNzX3NlcmlhbF9jbG9zZSgpCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBzZXJpYWwgcG9ydCBnZXRzIGNsb3NlZC4gIEZpcnN0LCB3ZQorICogd2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4gIFRoZW4sIHdlIHVubGluayBpdHMKKyAqIGFzeW5jIHN0cnVjdHVyZSBmcm9tIHRoZSBpbnRlcnJ1cHQgY2hhaW4gaWYgbmVjZXNzYXJ5LCBhbmQgd2UgZnJlZQorICogdGhhdCBJUlEgaWYgbm90aGluZyBpcyBsZWZ0IGluIHRoZSBjaGFpbi4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCitzdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3Bpbl9sb2NrKCZ0aW1lcl9sb2NrKTsKKwlpZiAodHR5LT5jb3VudCA9PSAxKQorCQlkZWxfdGltZXJfc3luYygmc2VyaWFsX3RpbWVyKTsKKwlzcGluX3VubG9jaygmdGltZXJfbG9jayk7Cit9CisKKworc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCS8qIHNlZSBkcml2ZXJzL2NoYXIvc2VyaWFsWC5jIHRvIHJlZmVyZW5jZSBvcmlnaW5hbCB2ZXJzaW9uICovCisKKwlfX3NpbWMgKFNZU193cml0ZSwgMSwgKHVuc2lnbmVkIGxvbmcpYnVmLCBjb3VudCwgMCwgMCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdm9pZCByc19wb2xsKHVuc2lnbmVkIGxvbmcgcHJpdikKK3sKKwlzdHJ1Y3QgdHR5X3N0cnVjdCogdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0KikgcHJpdjsKKworCXN0cnVjdCB0aW1ldmFsIHR2ID0geyAudHZfc2VjID0gMCwgLnR2X3VzZWMgPSAwIH07CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGNoYXIgYzsKKworCXNwaW5fbG9jaygmdGltZXJfbG9jayk7CisKKwl3aGlsZSAoX19zaW1jKFNZU19zZWxlY3Rfb25lLCAwLCBYVElTU19TRUxFQ1RfT05FX1JFQUQsIChpbnQpJnR2LDAsMCkpeworCQlfX3NpbWMgKFNZU19yZWFkLCAwLCAodW5zaWduZWQgbG9uZykmYywgMSwgMCwgMCk7CisJCXR0eS0+ZmxpcC5jb3VudCsrOworCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gYzsKKwkJKnR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIrKyA9IFRUWV9OT1JNQUw7CisJCWkrKzsKKwl9CisKKwlpZiAoaSkKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKworCisJbW9kX3RpbWVyKCZzZXJpYWxfdGltZXIsIGppZmZpZXMgKyBTRVJJQUxfVElNRVJfVkFMVUUpOworCXNwaW5fdW5sb2NrKCZ0aW1lcl9sb2NrKTsKK30KKworCitzdGF0aWMgdm9pZCByc19wdXRfY2hhcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBjaGFyIGNoKQoreworCWNoYXIgYnVmWzJdOworCisJaWYgKCF0dHkpCisJCXJldHVybjsKKworCWJ1ZlswXSA9IGNoOworCWJ1ZlsxXSA9ICdcMCc7CQkvKiBJcyB0aGlzIE5VTEwgbmVjZXNzYXJ5PyAqLworCV9fc2ltYyAoU1lTX3dyaXRlLCAxLCAodW5zaWduZWQgbG9uZykgYnVmLCAxLCAwLCAwKTsKK30KKworc3RhdGljIHZvaWQgcnNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKK30KKworc3RhdGljIGludCByc193cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLyogTGV0J3Mgc2F5IGlzcyBjYW4gYWx3YXlzIGFjY2VwdCAySyBjaGFyYWN0ZXJzLi4gKi8KKwlyZXR1cm4gMiAqIDEwMjQ7Cit9CisKK3N0YXRpYyBpbnQgcnNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJLyogdGhlIGlzcyBkb2Vzbid0IGJ1ZmZlciBjaGFyYWN0ZXJzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJzX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCS8qIFN0dWIsIG9uY2UgYWdhaW4uLiAqLworfQorCitzdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpCit7CisJLyogU3R1Yiwgb25jZSBhZ2Fpbi4uICovCit9CisKK3N0YXRpYyBpbnQgcnNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJCQlpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwlvZmZfdCBiZWdpbiA9IDA7CisKKwlsZW4gKz0gc3ByaW50ZihwYWdlLCAic2VyaW5mbzoxLjAgZHJpdmVyOiVzXG4iLCBzZXJpYWxfdmVyc2lvbik7CisJKmVvZiA9IDE7CisKKwlpZiAob2ZmID49IGxlbiArIGJlZ2luKQorCQlyZXR1cm4gMDsKKworCSpzdGFydCA9IHBhZ2UgKyAob2ZmIC0gYmVnaW4pOworCXJldHVybiAoKGNvdW50IDwgYmVnaW4gKyBsZW4gLSBvZmYpID8gY291bnQgOiBiZWdpbiArIGxlbiAtIG9mZik7Cit9CisKKworc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZXJpYWxfb3BzID0geworCS5vcGVuID0gcnNfb3BlbiwKKwkuY2xvc2UgPSByc19jbG9zZSwKKwkud3JpdGUgPSByc193cml0ZSwKKwkucHV0X2NoYXIgPSByc19wdXRfY2hhciwKKwkuZmx1c2hfY2hhcnMgPSByc19mbHVzaF9jaGFycywKKwkud3JpdGVfcm9vbSA9IHJzX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IHJzX2NoYXJzX2luX2J1ZmZlciwKKwkuaGFuZ3VwID0gcnNfaGFuZ3VwLAorCS53YWl0X3VudGlsX3NlbnQgPSByc193YWl0X3VudGlsX3NlbnQsCisJLnJlYWRfcHJvYyA9IHJzX3JlYWRfcHJvYworfTsKKworaW50IF9faW5pdCByc19pbml0KHZvaWQpCit7CisJc2VyaWFsX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoMSk7CisKKwlwcmludGsgKCIlcyAlc1xuIiwgc2VyaWFsX25hbWUsIHNlcmlhbF92ZXJzaW9uKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCisKKwlzZXJpYWxfZHJpdmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCXNlcmlhbF9kcml2ZXItPmRyaXZlcl9uYW1lID0gImlzc19zZXJpYWwiOworCXNlcmlhbF9kcml2ZXItPm5hbWUgPSAidHR5UyI7CisJc2VyaWFsX2RyaXZlci0+bWFqb3IgPSBUVFlfTUFKT1I7CisJc2VyaWFsX2RyaXZlci0+bWlub3Jfc3RhcnQgPSA2NDsKKwlzZXJpYWxfZHJpdmVyLT50eXBlID0gVFRZX0RSSVZFUl9UWVBFX1NFUklBTDsKKwlzZXJpYWxfZHJpdmVyLT5zdWJ0eXBlID0gU0VSSUFMX1RZUEVfTk9STUFMOworCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKKwlzZXJpYWxfZHJpdmVyLT5pbml0X3Rlcm1pb3MuY19jZmxhZyA9CisJCUI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwlzZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7CisKKwl0dHlfc2V0X29wZXJhdGlvbnMoc2VyaWFsX2RyaXZlciwgJnNlcmlhbF9vcHMpOworCisJaWYgKHR0eV9yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpCisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgX19leGl0IHZvaWQgcnNfZXhpdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCWlmICgoZXJyb3IgPSB0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc2VyaWFsX2RyaXZlcikpKQorCQlwcmludGsoIklTU19TRVJJQUw6IGZhaWxlZCB0byB1bnJlZ2lzdGVyIHNlcmlhbCBkcml2ZXIgKCVkKVxuIiwKKwkJICAgICAgIGVycm9yKTsKKwlwdXRfdHR5X2RyaXZlcihzZXJpYWxfZHJpdmVyKTsKK30KKworCisvKiBXZSB1c2UgYGxhdGVfaW5pdGNhbGwnIGluc3RlYWQgb2YganVzdCBgX19pbml0Y2FsbCcgYXMgYSB3b3JrYXJvdW5kIGZvcgorICogdGhlIGZhY3QgdGhhdCAoMSkgc2ltY29uc190dHlfaW5pdCBjYW4ndCBiZSBjYWxsZWQgYmVmb3JlIHR0eV9pbml0LAorICogKDIpIHR0eV9pbml0IGlzIGNhbGxlZCB2aWEgYG1vZHVsZV9pbml0JywgKDMpIGlmIHN0YXRpY2FsbHkgbGlua2VkLAorICogbW9kdWxlX2luaXQgPT0gZGV2aWNlX2luaXQsIGFuZCAoNCkgdGhlcmUncyBubyBvcmRlcmluZyBvZiBpbml0IGxpc3RzLgorICogV2UgY2FuIGRvIHRoaXMgZWFzaWx5IGJlY2F1c2Ugc2ltY29ucyBpcyBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQsIGJ1dAorICogb3RoZXIgdHR5IGRyaXZlcnMgdGhhdCBkZXBlbmQgb24gdHR5X2luaXQgYW5kIHdoaWNoIG11c3QgdXNlCisgKiBgbW9kdWxlX2luaXQnIHRvIGRlY2xhcmUgdGhlaXIgaW5pdCByb3V0aW5lcyBhcmUgbGlrZWx5IHRvIGJlIGJyb2tlbi4KKyAqLworCitsYXRlX2luaXRjYWxsKHJzX2luaXQpOworCisKKyNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKKworc3RhdGljIHZvaWQgaXNzX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlpbnQgbGVuID0gc3RybGVuKHMpOworCisJaWYgKHMgIT0gMCAmJiAqcyAhPSAwKQorCQlfX3NpbWMgKFNZU193cml0ZSwgMSwgKHVuc2lnbmVkIGxvbmcpcywKKwkJCWNvdW50IDwgbGVuID8gY291bnQgOiBsZW4sMCwwKTsKK30KKworc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyKiBpc3NfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKmMsIGludCAqaW5kZXgpCit7CisJKmluZGV4ID0gYy0+aW5kZXg7CisJcmV0dXJuIHNlcmlhbF9kcml2ZXI7Cit9CisKKworc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmNvbnMgPSB7CisJLm5hbWUgPSAidHR5UyIsCisJLndyaXRlID0gaXNzX2NvbnNvbGVfd3JpdGUsCisJLmRldmljZSA9IGlzc19jb25zb2xlX2RldmljZSwKKwkuZmxhZ3MgPSBDT05fUFJJTlRCVUZGRVIsCisJLmluZGV4ID0gLTEKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlzc19jb25zb2xlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9jb25zb2xlKCZzZXJjb25zKTsKKwlyZXR1cm4gMDsKK30KKworY29uc29sZV9pbml0Y2FsbChpc3NfY29uc29sZV9pbml0KTsKKworI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfQ09OU09MRSAqLworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvaW8uYyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTYxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvaW8uYwpAQCAtMCwwICsxLDMyIEBACisvKiBUaGlzIGZpbGUgaXNuJ3QgcmVhbGx5IG5lZWRlZCByaWdodCBub3cuICovCisKKyNpZiAwCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDx4dGVuc2Evc2ltY2FsbC5oPgorCitleHRlcm4gaW50IF9fc2ltYyAoKTsKKworCitjaGFyIGlzc19zZXJpYWxfZ2V0YygpCit7CisgIGNoYXIgYzsKKyAgX19zaW1jKCBTWVNfcmVhZCwgMCwgJmMsIDEgKTsKKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgaXNzX3NlcmlhbF9wdXRjKCBjaGFyIGMgKQoreworICBfX3NpbWMoIFNZU193cml0ZSwgMSwgJmMsIDEgKTsKK30KKwordm9pZCBpc3Nfc2VyaWFsX3B1dHMoIGNoYXIgKnMgKQoreworICBpZiggcyAhPSAwICYmICpzICE9IDAgKQorICAgIF9fc2ltYyggU1lTX3dyaXRlLCAxLCBzLCBzdHJsZW4ocykgKTsKK30KKworLyojZXJyb3IgTmVlZCBJL08gcG9ydHMgdG8gc3BlY2lmaWMgaGFyZHdhcmUhKi8KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OGQ3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3MvbmV0d29yay5jCkBAIC0wLDAgKzEsODU1IEBACisvKgorICoKKyAqIGFyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9uZXR3b3JrLmMKKyAqCisgKiBQbGF0Zm9ybSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBBdXRob3JzOiBDaHJpcyBaYW5rZWwgPGNocmlzQHphbmtlbC5uZXQ+CisgKiBCYXNlZCBvbiB3b3JrIGZvcm0gdGhlIFVNTCB0ZWFtLgorICoKKyAqIENvcHlyaWdodCAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSA8eHRlbnNhL3NpbWNhbGwuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAiaXNzLW5ldGRldiIKKyNkZWZpbmUgRVRIX01BWF9QQUNLRVQgMTUwMAorI2RlZmluZSBFVEhfSEVBREVSX09USEVSIDE0CisjZGVmaW5lIElTU19ORVRfVElNRVJfVkFMVUUgKDIgKiBIWikKKworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG9wZW5lZF9sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQob3BlbmVkKTsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhkZXZpY2VzX2xvY2spOworc3RhdGljIExJU1RfSEVBRChkZXZpY2VzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBXZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBUVU5UQVAgdHJhbnNwb3J0IHByb3RvY29sLiAqLworCisjZGVmaW5lIFRSQU5TUE9SVF9UVU5UQVBfTkFNRSAidHVudGFwIgorI2RlZmluZSBUUkFOU1BPUlRfVFVOVEFQX01UVSBFVEhfTUFYX1BBQ0tFVAorCitzdHJ1Y3QgdHVudGFwX2luZm8geworCWNoYXIgZGV2X25hbWVbSUZOQU1TSVpdOworCWludCBmaXhlZF9jb25maWc7CisJdW5zaWduZWQgY2hhciBnd1tFVEhfQUxFTl07CisJaW50IGZkOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIG91dCBwcml2YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgZHJpdmVyLiAqLworCitzdHJ1Y3QgaXNzX25ldF9wcml2YXRlIHsKKworCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBvcGVuZWRfbGlzdDsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcGRldjsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0bDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCXVuc2lnbmVkIGludCB0aW1lcl92YWw7CisKKwlpbnQgaW5kZXg7CisJaW50IG10dTsKKworCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKKwlpbnQgaGF2ZV9tYWM7CisKKwlzdHJ1Y3QgeworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgdHVudGFwX2luZm8gdHVudGFwOworCQl9IGluZm87CisKKwkJaW50ICgqb3Blbikoc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHApOworCQl2b2lkICgqY2xvc2UpKHN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwKTsKKwkJaW50ICgqcmVhZCkoc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICoqc2tiKTsKKwkJaW50ICgqd3JpdGUpKHN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYik7CisJCXVuc2lnbmVkIHNob3J0ICgqcHJvdG9jb2wpKHN0cnVjdCBza19idWZmICpza2IpOworCQlpbnQgKCpwb2xsKShzdHJ1Y3QgaXNzX25ldF9wcml2YXRlICpscCk7CisJfSB0cDsKKworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT0gSVNTIFNJTUNBTEwgSU5URVJGQUNFID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBOb3RlOiBfX3NpbWMgbXVzdCBfbm90XyBiZSBkZWNsYXJlZCBpbmxpbmUhICovCisKK3N0YXRpYyBpbnQgZXJybm87CisKK3N0YXRpYyBpbnQgX19zaW1jIChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUsIGludCBmKQoreworCWludCByZXQ7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzaW1jYWxsXG4iCisJICAgIAkJICAgICAgIm1vdiAlMCwgYTJcbiIKKwkJCSAgICAgICJtb3YgJTEsIGEzXG4iIDogIj1hIiAocmV0KSwgIj1hIiAoZXJybm8pCisJCQkgICAgICA6IDogImEyIiwgImEzIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbmxpbmUgc2ltY19vcGVuKGNoYXIgKmZpbGUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisJcmV0dXJuIF9fc2ltYyhTWVNfb3BlbiwgKGludCkgZmlsZSwgZmxhZ3MsIG1vZGUsIDAsIDApOworfQorCitzdGF0aWMgaW50IGlubGluZSBzaW1jX2Nsb3NlKGludCBmZCkKK3sKKwlyZXR1cm4gX19zaW1jKFNZU19jbG9zZSwgZmQsIDAsIDAsIDAsIDApOworfQorCitzdGF0aWMgaW50IGlubGluZSBzaW1jX2lvY3RsKGludCBmZCwgaW50IHJlcXVlc3QsIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gX19zaW1jKFNZU19pb2N0bCwgZmQsIHJlcXVlc3QsIChpbnQpIGFyZywgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIHNpbWNfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBfX3NpbWMoU1lTX3JlYWQsIGZkLCAoaW50KSBidWYsIGNvdW50LCAwLCAwKTsKK30KKworc3RhdGljIGludCBpbmxpbmUgc2ltY193cml0ZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBfX3NpbWMoU1lTX3dyaXRlLCBmZCwgKGludCkgYnVmLCBjb3VudCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaW5saW5lIHNpbWNfcG9sbChpbnQgZmQpCit7CisJc3RydWN0IHRpbWV2YWwgdHYgPSB7IC50dl9zZWMgPSAwLCAudHZfdXNlYyA9IDAgfTsKKworCXJldHVybiBfX3NpbWMoU1lTX3NlbGVjdF9vbmUsIGZkLCBYVElTU19TRUxFQ1RfT05FX1JFQUQsIChpbnQpJnR2LDAsMCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworCitzdGF0aWMgY2hhciAqc3BsaXRfaWZfc3BlYyhjaGFyICpzdHIsIC4uLikKK3sKKwljaGFyICoqYXJnLCAqZW5kOworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgc3RyKTsKKwl3aGlsZSAoKGFyZyA9IHZhX2FyZyhhcCwgY2hhcioqKSkgIT0gTlVMTCkgeworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJcmV0dXJuIE5VTEw7CisJCWVuZCA9IHN0cmNocihzdHIsICcsJyk7CisJCWlmIChlbmQgIT0gc3RyKQorCQkJKmFyZyA9IHN0cjsKKwkJaWYgKGVuZCA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCSplbmQgKysgPSAnXDAnOworCQlzdHIgPSBlbmQ7CisJfQorCXZhX2VuZChhcCk7CisJcmV0dXJuIHN0cjsKK30KKworCisjaWYgMAorLyogQWRqdXN0IFNLQi4gKi8KKworc3RydWN0IHNrX2J1ZmYgKmV0aGVyX2FkanVzdF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGV4dHJhKQoreworCWlmICgoc2tiICE9IE5VTEwpICYmIChza2JfdGFpbHJvb20oc2tiKSA8IGV4dHJhKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKworCQlza2IyID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgMCwgZXh0cmEsIEdGUF9BVE9NSUMpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IHNrYjI7CisJfQorCWlmIChza2IgIT0gTlVMTCkKKwkJc2tiX3B1dChza2IsIGV4dHJhKTsKKworCXJldHVybiBza2I7Cit9CisjZW5kaWYKKworLyogUmV0dXJuIHRoZSBJUCBhZGRyZXNzIGFzIGEgc3RyaW5nIGZvciBhIGdpdmVuIGRldmljZS4gKi8KKworc3RhdGljIHZvaWQgZGV2X2lwX2FkZHIodm9pZCAqZCwgY2hhciAqYnVmLCBjaGFyICpiaW5fYnVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkOworCXN0cnVjdCBpbl9kZXZpY2UgKmlwID0gZGV2LT5pcF9wdHI7CisJc3RydWN0IGluX2lmYWRkciAqaW47CisJdTMyIGFkZHI7CisKKwlpZiAoKGlwID09IE5VTEwpIHx8ICgoaW4gPSBpcC0+aWZhX2xpc3QpID09IE5VTEwpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRldmljZSBub3QgYXNzaWduZWQgYW4gSVAgYWRkcmVzcyFcbiIpOworCQlyZXR1cm47CisJfQorCisJYWRkciA9IGluLT5pZmFfYWRkcmVzczsKKwlzcHJpbnRmKGJ1ZiwgIiVkLiVkLiVkLiVkIiwgYWRkciAmIDB4ZmYsIChhZGRyID4+IDgpICYgMHhmZiwKKwkJKGFkZHIgPj4gMTYpICYgMHhmZiwgYWRkciA+PiAyNCk7CisKKwlpZiAoYmluX2J1ZikgeworCQliaW5fYnVmWzBdID0gYWRkciAmIDB4ZmY7CisJCWJpbl9idWZbMV0gPSAoYWRkciA+PiA4KSAmIDB4ZmY7CisJCWJpbl9idWZbMl0gPSAoYWRkciA+PiAxNikgJiAweGZmOworCQliaW5fYnVmWzNdID0gYWRkciA+PiAyNDsKKwl9Cit9CisKKy8qIFNldCBFdGhlcm5ldCBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZGV2aWNlLiAqLworCitzdGF0aWMgdm9pZCBpbmxpbmUgc2V0X2V0aGVyX21hYyh2b2lkICpkLCB1bnNpZ25lZCBjaGFyICphZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkOworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCBFVEhfQUxFTik7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT0gVFVOVEFQIFRSQU5TUE9SVCBJTlRFUkZBQ0UgPT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgaW50IHR1bnRhcF9vcGVuKHN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJY2hhciAqZGV2X25hbWUgPSBscC0+dHAuaW5mby50dW50YXAuZGV2X25hbWU7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGZkOworCisJLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBhIGZpeGVkIGNvbmZpZ3VyYXRpb24uICovCisKKwlpZiAoIWxwLT50cC5pbmZvLnR1bnRhcC5maXhlZF9jb25maWcpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChmZCA9IHNpbWNfb3BlbigiL2Rldi9uZXQvdHVuIiwgMDIsIDApKSA8IDApIHsJLyogT19SRFdSICovCisJCXByaW50aygiRmFpbGVkIHRvIG9wZW4gL2Rldi9uZXQvdHVuLCByZXR1cm5lZCAlZCAiCisJCSAgICAgICAiKGVycm5vID0gJWQpXG4iLCBmZCwgZXJybm8pOworCQlyZXR1cm4gZmQ7CisJfQorCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZiBpZnIpOworCWlmci5pZnJfZmxhZ3MgPSBJRkZfVEFQIHwgSUZGX05PX1BJOworCXN0cmxjcHkoaWZyLmlmcl9uYW1lLCBkZXZfbmFtZSwgc2l6ZW9mIGlmci5pZnJfbmFtZSAtIDEpOworCisJaWYgKChlcnIgPSBzaW1jX2lvY3RsKGZkLCBUVU5TRVRJRkYsICh2b2lkKikgJmlmcikpIDwgMCkgeworCQlwcmludGsoIkZhaWxlZCB0byBzZXQgaW50ZXJmYWNlLCByZXR1cm5lZCAlZCAiCisJCSAgICAgICAiKGVycm5vID0gJWQpXG4iLCBlcnIsIGVycm5vKTsKKwkJc2ltY19jbG9zZShmZCk7CisJCXJldHVybiBlcnI7CisJfQorCisJbHAtPnRwLmluZm8udHVudGFwLmZkID0gZmQ7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdHVudGFwX2Nsb3NlKHN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwKQoreworI2lmIDAKKwlpZiAobHAtPnRwLmluZm8udHVudGFwLmZpeGVkX2NvbmZpZykKKwkJaXRlcl9hZGRyZXNzZXMobHAtPnRwLmluZm8udHVudGFwLmRldiwgY2xvc2VfYWRkciwgbHAtPmhvc3QuZGV2X25hbWUpOworI2VuZGlmCisJc2ltY19jbG9zZShscC0+dHAuaW5mby50dW50YXAuZmQpOworCWxwLT50cC5pbmZvLnR1bnRhcC5mZCA9IC0xOworfQorCitzdGF0aWMgaW50IHR1bnRhcF9yZWFkIChzdHJ1Y3QgaXNzX25ldF9wcml2YXRlICpscCwgc3RydWN0IHNrX2J1ZmYgKipza2IpCit7CisjaWYgMAorCSpza2IgPSBldGhlcl9hZGp1c3Rfc2tiKCpza2IsIEVUSF9IRUFERVJfT1RIRVIpOworCWlmICgqc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworI2VuZGlmCisKKwlyZXR1cm4gc2ltY19yZWFkKGxwLT50cC5pbmZvLnR1bnRhcC5mZCwKKwkJCSgqc2tiKS0+ZGF0YSwgKCpza2IpLT5kZXYtPm10dSArIEVUSF9IRUFERVJfT1RIRVIpOworfQorCitzdGF0aWMgaW50IHR1bnRhcF93cml0ZSAoc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHAsIHN0cnVjdCBza19idWZmICoqc2tiKQoreworCXJldHVybiBzaW1jX3dyaXRlKGxwLT50cC5pbmZvLnR1bnRhcC5mZCwgKCpza2IpLT5kYXRhLCAoKnNrYiktPmxlbik7Cit9CisKK3Vuc2lnbmVkIHNob3J0IHR1bnRhcF9wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKK30KKworc3RhdGljIGludCB0dW50YXBfcG9sbChzdHJ1Y3QgaXNzX25ldF9wcml2YXRlICpscCkKK3sKKwlyZXR1cm4gc2ltY19wb2xsKGxwLT50cC5pbmZvLnR1bnRhcC5mZCk7Cit9CisKKy8qCisgKiBDdXJyZW50bHkgb25seSBhIGRldmljZSBuYW1lIGlzIHN1cHBvcnRlZC4KKyAqIGV0aFg9dHVudGFwWyxbbWFjIGFkZHJlc3NdWyxbZGV2aWNlIG5hbWVdXV0KKyAqLworCitzdGF0aWMgaW50IHR1bnRhcF9wcm9iZShzdHJ1Y3QgaXNzX25ldF9wcml2YXRlICpscCwgaW50IGluZGV4LCBjaGFyICppbml0KQoreworCWNvbnN0IGludCBsZW4gPSBzdHJsZW4oVFJBTlNQT1JUX1RVTlRBUF9OQU1FKTsKKwljaGFyICpkZXZfbmFtZSA9IE5VTEwsICptYWNfc3RyID0gTlVMTCwgKnJlbSA9IE5VTEw7CisKKwkvKiBUcmFuc3BvcnQgc2hvdWxkIGJlICd0dW50YXAnOiBldGhYPXR1bnRhcCxtYWMsZGV2X25hbWUgKi8KKworCWlmIChzdHJuY21wKGluaXQsIFRSQU5TUE9SVF9UVU5UQVBfTkFNRSwgbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKihpbml0ICs9IHN0cmxlbihUUkFOU1BPUlRfVFVOVEFQX05BTUUpKSA9PSAnLCcpIHsKKwkJaWYgKChyZW09c3BsaXRfaWZfc3BlYyhpbml0KzEsICZtYWNfc3RyLCAmZGV2X25hbWUpKSAhPSBOVUxMKSB7CisJCQlwcmludGsoIkV4dHJhIGdhcmJhZ2Ugb24gc3BlY2lmaWNhdGlvbiA6ICclcydcbiIsIHJlbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAoKmluaXQgIT0gJ1wwJykgeworCQlwcmludGsoIkludmFsaWQgYXJndW1lbnQ6ICVzLiBTa2lwcGluZyBkZXZpY2UhXG4iLCBpbml0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRldl9uYW1lKSB7CisJCXN0cm5jcHkobHAtPnRwLmluZm8udHVudGFwLmRldl9uYW1lLCBkZXZfbmFtZSwKKwkJCSBzaXplb2YgbHAtPnRwLmluZm8udHVudGFwLmRldl9uYW1lKTsKKwkJbHAtPnRwLmluZm8udHVudGFwLmZpeGVkX2NvbmZpZyA9IDE7CisJfSBlbHNlCisJCXN0cmNweShscC0+dHAuaW5mby50dW50YXAuZGV2X25hbWUsIFRSQU5TUE9SVF9UVU5UQVBfTkFNRSk7CisKKworI2lmIDAKKwlpZiAoc2V0dXBfZXRoZXJhZGRyKG1hY19zdHIsIGxwLT5tYWMpKQorCQlscC0+aGF2ZV9tYWMgPSAxOworI2VuZGlmCisJbHAtPm10dSA9IFRSQU5TUE9SVF9UVU5UQVBfTVRVOworCisJLy9scC0+aW5mby50dW50YXAuZ2F0ZV9hZGRyID0gZ2F0ZV9hZGRyOworCisJbHAtPnRwLmluZm8udHVudGFwLmZkID0gLTE7CisKKwlscC0+dHAub3BlbiA9IHR1bnRhcF9vcGVuOworCWxwLT50cC5jbG9zZSA9IHR1bnRhcF9jbG9zZTsKKwlscC0+dHAucmVhZCA9IHR1bnRhcF9yZWFkOworCWxwLT50cC53cml0ZSA9IHR1bnRhcF93cml0ZTsKKwlscC0+dHAucHJvdG9jb2wgPSB0dW50YXBfcHJvdG9jb2w7CisJbHAtPnRwLnBvbGwgPSB0dW50YXBfcG9sbDsKKworCXByaW50aygiVFVOL1RBUCBiYWNrZW5kIC0gIik7CisjaWYgMAorCWlmIChscC0+aG9zdC5nYXRlX2FkZHIgIT0gTlVMTCkKKwkJcHJpbnRrKCJJUCA9ICVzIiwgbHAtPmhvc3QuZ2F0ZV9hZGRyKTsKKyNlbmRpZgorCXByaW50aygiXG4iKTsKKworCXJldHVybiAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJU1MgTkVUID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBpbnQgaXNzX25ldF9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCWludCBwa3RfbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgbmV3IGRhdGEuICovCisKKwlpZiAobHAtPnRwLnBvbGwobHApID09IDApCisJCXJldHVybiAwOworCisJLyogVHJ5IHRvIGFsbG9jYXRlIG1lbW9yeSwgaWYgaXQgZmFpbHMsIHRyeSBhZ2FpbiBuZXh0IHJvdW5kLiAqLworCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGRldi0+bXR1ICsgMiArIEVUSF9IRUFERVJfT1RIRVIpKSA9PSBOVUxMKSB7CisJCWxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybiAwOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgMik7CisKKwkvKiBTZXR1cCBza2IgKi8KKworCXNrYi0+ZGV2ID0gZGV2OworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlwa3RfbGVuID0gbHAtPnRwLnJlYWQobHAsICZza2IpOworCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKKworCWlmIChwa3RfbGVuID4gMCkgeworCQlza2JfdHJpbShza2IsIHBrdF9sZW4pOworCQlza2ItPnByb3RvY29sID0gbHAtPnRwLnByb3RvY29sKHNrYik7CisJLy8JbmV0aWZfcngoc2tiKTsKKwkJbmV0aWZfcnhfbmkoc2tiKTsKKworCQlscC0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXJldHVybiBwa3RfbGVuOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcGt0X2xlbjsKK30KKworc3RhdGljIGludCBpc3NfbmV0X3BvbGwodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGU7CisJaW50IGVyciwgcmV0ID0gMDsKKworCXNwaW5fbG9jaygmb3BlbmVkX2xvY2spOworCisJbGlzdF9mb3JfZWFjaChlbGUsICZvcGVuZWQpIHsKKwkJc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHA7CisKKwkJbHAgPSBsaXN0X2VudHJ5KGVsZSwgc3RydWN0IGlzc19uZXRfcHJpdmF0ZSwgb3BlbmVkX2xpc3QpOworCisJCWlmICghbmV0aWZfcnVubmluZyhscC0+ZGV2KSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9jaygmbHAtPmxvY2spOworCisJCXdoaWxlICgoZXJyID0gaXNzX25ldF9yeChscC0+ZGV2KSkgPiAwKQorCQkJcmV0Kys7CisKKwkJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJEZXZpY2UgJyVzJyByZWFkIHJldHVybmVkICVkLCAiCisJCQkgICAgICAgInNodXR0aW5nIGl0IGRvd25cbiIsIGxwLT5kZXYtPm5hbWUsIGVycik7CisJCQlkZXZfY2xvc2UobHAtPmRldik7CisJCX0gZWxzZSB7CisJCQkvLyBGSVhNRSByZWFjdGl2YXRlX2ZkKGxwLT5mZCwgSVNTX0VUSF9JUlEpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJm9wZW5lZF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIGlzc19uZXRfdGltZXIodW5zaWduZWQgbG9uZyBwcml2KQoreworCXN0cnVjdCBpc3NfbmV0X3ByaXZhdGUqIGxwID0gKHN0cnVjdCBpc3NfbmV0X3ByaXZhdGUqKSBwcml2OworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlpc3NfbmV0X3BvbGwoKTsKKworCW1vZF90aW1lcigmbHAtPnRpbWVyLCBqaWZmaWVzICsgbHAtPnRpbWVyX3ZhbCk7CisKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworfQorCisKK3N0YXRpYyBpbnQgaXNzX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJY2hhciBhZGRyW3NpemVvZiAiMjU1LjI1NS4yNTUuMjU1XDAiXTsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisKKwlpZiAoKGVyciA9IGxwLT50cC5vcGVuKGxwKSkgPCAwKQorCQlnb3RvIG91dDsKKworCWlmICghbHAtPmhhdmVfbWFjKSB7CisJCWRldl9pcF9hZGRyKGRldiwgYWRkciwgJmxwLT5tYWNbMl0pOworCQlzZXRfZXRoZXJfbWFjKGRldiwgbHAtPm1hYyk7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCS8qIGNsZWFyIGJ1ZmZlciAtIGl0IGNhbiBoYXBwZW4gdGhhdCB0aGUgaG9zdCBzaWRlIG9mIHRoZSBpbnRlcmZhY2UKKwkgKiBpcyBmdWxsIHdoZW4gd2UgZ2V0aGVyZS4gSW4gdGhpcyBjYXNlLCBuZXcgZGF0YSBpcyBuZXZlciBxdWV1ZWQsCisJICogU0lHSU9zIG5ldmVyIGFycml2ZSwgYW5kIHRoZSBuZXQgbmV2ZXIgd29ya3MuCisJICovCisJd2hpbGUgKChlcnIgPSBpc3NfbmV0X3J4KGRldikpID4gMCkKKwkJOworCisJc3Bpbl9sb2NrKCZvcGVuZWRfbG9jayk7CisJbGlzdF9hZGQoJmxwLT5vcGVuZWRfbGlzdCwgJm9wZW5lZCk7CisJc3Bpbl91bmxvY2soJm9wZW5lZF9sb2NrKTsKKworCWluaXRfdGltZXIoJmxwLT50aW1lcik7CisJbHAtPnRpbWVyX3ZhbCA9IElTU19ORVRfVElNRVJfVkFMVUU7CisJbHAtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgbHA7CisJbHAtPnRpbWVyLmZ1bmN0aW9uID0gaXNzX25ldF90aW1lcjsKKwltb2RfdGltZXIoJmxwLT50aW1lciwgamlmZmllcyArIGxwLT50aW1lcl92YWwpOworCitvdXQ6CisJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlzc19uZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNzX25ldF9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKK3ByaW50aygiaXNzX25ldF9jbG9zZSFcbiIpOworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCXNwaW5fbG9jaygmb3BlbmVkX2xvY2spOworCWxpc3RfZGVsKCZvcGVuZWQpOworCXNwaW5fdW5sb2NrKCZvcGVuZWRfbG9jayk7CisKKwlkZWxfdGltZXJfc3luYygmbHAtPnRpbWVyKTsKKworCWxwLT50cC5jbG9zZShscCk7CisKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzc19uZXRfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwID0gZGV2LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxlbjsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPmxvY2ssIGZsYWdzKTsKKworCWxlbiA9IGxwLT50cC53cml0ZShscCwgJnNrYik7CisKKwlpZiAobGVuID09IHNrYi0+bGVuKSB7CisJCWxwLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwkJLyogdGhpcyBpcyBub3JtYWxseSBkb25lIGluIHRoZSBpbnRlcnJ1cHQgd2hlbiB0eCBmaW5pc2hlcyAqLworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisKKwl9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisJCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisJCWxwLT5zdGF0cy50eF9kcm9wcGVkKys7CisKKwl9IGVsc2UgeworCQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCQlwcmludGsoS0VSTl9FUlIgImlzc19uZXRfc3RhcnRfeG1pdDogZmFpbGVkKCVkKVxuIiwgbGVuKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZscC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXNzX25ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNzX25ldF9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKKwlyZXR1cm4gJmxwLT5zdGF0czsKK30KKworc3RhdGljIHZvaWQgaXNzX25ldF9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNpZiAwCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKKwkJcmV0dXJuOworCWVsc2UgaWYgKGRldi0+bWNfY291bnQpCisJCWRldi0+ZmxhZ3MgfD0gSUZGX0FMTE1VTFRJOworCWVsc2UKKwkJZGV2LT5mbGFncyAmPSB+SUZGX0FMTE1VTFRJOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGlzc19uZXRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2lmIDAKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBpc3NfbmV0X3NldF9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKK3sKKyNpZiAwCisJc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJc3RydWN0IHNvY2thZGRyICpod2FkZHIgPSBhZGRyOworCisJc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGh3YWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzc19uZXRfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKK3sKKyNpZiAwCisJc3RydWN0IGlzc19uZXRfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJmxwLT5sb2NrKTsKKworCS8vIEZJWE1FIG5vdCBuZWVkZWQgbmV3X210dSA9IHRyYW5zcG9ydF9zZXRfbXR1KG5ld19tdHUsICZscC0+dXNlcik7CisKKwlpZiAobmV3X210dSA8IDApCisJCWVyciA9IG5ld19tdHU7CisJZWxzZQorCQlkZXYtPm10dSA9IG5ld19tdHU7CisKKwlzcGluX3VubG9jaygmbHAtPmxvY2spOworCXJldHVybiBlcnI7CisjZW5kaWYKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBpc3NfbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworI2lmIDAKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBpbmZvID0geworCQkuY21kICAgICA9IEVUSFRPT0xfR0RSVklORk8sCisJCS5kcml2ZXIgID0gRFJJVkVSX05BTUUsCisJCS52ZXJzaW9uID0gIjQyIiwKKwl9OworCXZvaWQgKnVzZXJhZGRyOworCXUzMiBldGhjbWQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0VUSFRPT0w6CisJCXVzZXJhZGRyID0gaWZyLT5pZnJfZGF0YTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZldGhjbWQsIHVzZXJhZGRyLCBzaXplb2YoZXRoY21kKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKGV0aGNtZCkgeworCQkJY2FzZSBFVEhUT09MX0dEUlZJTkZPOgorCQkJCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4gMDsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgaXNzX25ldF91c2VyX3RpbWVyX2V4cGlyZSh1bnNpZ25lZCBsb25nIF9jb25uKQoreworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBpc3NfbmV0X2RyaXZlciA9IHsKKwkubmFtZSAgPSBEUklWRVJfTkFNRSwKKwkuYnVzICAgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCit9OworCitzdGF0aWMgaW50IGRyaXZlcl9yZWdpc3RlcmVkOworCitzdGF0aWMgaW50IGlzc19uZXRfY29uZmlndXJlKGludCBpbmRleCwgY2hhciAqaW5pdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmxwOworCWludCBlcnI7CisKKwlpZiAoKGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZiAqbHApKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXRoX2NvbmZpZ3VyZTogZmFpbGVkIHRvIGFsbG9jYXRlIGRldmljZVxuIik7CisJCXJldHVybiAxOworCX0KKworCS8qIEluaXRpYWxpemUgcHJpdmF0ZSBlbGVtZW50LiAqLworCisJbHAgPSBkZXYtPnByaXY7CisJKmxwID0gKChzdHJ1Y3QgaXNzX25ldF9wcml2YXRlKSB7CisJCS5kZXZpY2VfbGlzdAkJPSBMSVNUX0hFQURfSU5JVChscC0+ZGV2aWNlX2xpc3QpLAorCQkub3BlbmVkX2xpc3QJCT0gTElTVF9IRUFEX0lOSVQobHAtPm9wZW5lZF9saXN0KSwKKwkJLmxvY2sJCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkJLmRldgkJCT0gZGV2LAorCQkuaW5kZXgJCQk9IGluZGV4LAorCQkvLy5mZCAgICAgICAgICAgICAgICAgICA9IC0xLAorCQkubWFjCQkJPSB7IDB4ZmUsIDB4ZmQsIDB4MCwgMHgwLCAweDAsIDB4MCB9LAorCQkuaGF2ZV9tYWMJCT0gMCwKKwkJfSk7CisKKwkvKgorCSAqIFRyeSBhbGwgdHJhbnNwb3J0IHByb3RvY29scy4KKwkgKiBOb3RlOiBtb3JlIHByb3RvY29scyBjYW4gYmUgYWRkZWQgYnkgYWRkaW5nICcmJiAhWF9pbml0KGxwLCBldGgpJy4KKwkgKi8KKworCWlmICghdHVudGFwX3Byb2JlKGxwLCBpbmRleCwgaW5pdCkpIHsKKwkJcHJpbnRrKCJJbnZhbGlkIGFyZ3VtZW50cy4gU2tpcHBpbmcgZGV2aWNlIVxuIik7CisJCWdvdG8gZXJyb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gIk5ldGRldmljZSAlZCAiLCBpbmRleCk7CisJaWYgKGxwLT5oYXZlX21hYykKKwkJcHJpbnRrKCIoJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngpICIsCisJCQkJbHAtPm1hY1swXSwgbHAtPm1hY1sxXSwKKwkJCQlscC0+bWFjWzJdLCBscC0+bWFjWzNdLAorCQkJCWxwLT5tYWNbNF0sIGxwLT5tYWNbNV0pOworCXByaW50aygiOiAiKTsKKworCS8qIHN5c2ZzIHJlZ2lzdGVyICovCisKKwlpZiAoIWRyaXZlcl9yZWdpc3RlcmVkKSB7CisJCWRyaXZlcl9yZWdpc3RlcigmaXNzX25ldF9kcml2ZXIpOworCQlkcml2ZXJfcmVnaXN0ZXJlZCA9IDE7CisJfQorCisJc3Bpbl9sb2NrKCZkZXZpY2VzX2xvY2spOworCWxpc3RfYWRkKCZscC0+ZGV2aWNlX2xpc3QsICZkZXZpY2VzKTsKKwlzcGluX3VubG9jaygmZGV2aWNlc19sb2NrKTsKKworCWxwLT5wZGV2LmlkID0gaW5kZXg7CisJbHAtPnBkZXYubmFtZSA9IERSSVZFUl9OQU1FOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbHAtPnBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwmbHAtPnBkZXYuZGV2KTsKKworCS8qCisJICogSWYgdGhpcyBuYW1lIGVuZHMgdXAgY29uZmxpY3Rpbmcgd2l0aCBhbiBleGlzdGluZyByZWdpc3RlcmVkCisJICogbmV0ZGV2aWNlLCB0aGF0IGlzIE9LLCByZWdpc3Rlcl9uZXRkZXZ7LGljZX0oKSB3aWxsIG5vdGljZSB0aGlzCisJICogYW5kIGZhaWwuCisJICovCisJc25wcmludGYoZGV2LT5uYW1lLCBzaXplb2YgZGV2LT5uYW1lLCAiZXRoJWQiLCBpbmRleCk7CisKKwlkZXYtPm10dSA9IGxwLT5tdHU7CisJZGV2LT5vcGVuID0gaXNzX25ldF9vcGVuOworCWRldi0+aGFyZF9zdGFydF94bWl0ID0gaXNzX25ldF9zdGFydF94bWl0OworCWRldi0+c3RvcCA9IGlzc19uZXRfY2xvc2U7CisJZGV2LT5nZXRfc3RhdHMgPSBpc3NfbmV0X2dldF9zdGF0czsKKwlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGlzc19uZXRfc2V0X211bHRpY2FzdF9saXN0OworCWRldi0+dHhfdGltZW91dCA9IGlzc19uZXRfdHhfdGltZW91dDsKKwlkZXYtPnNldF9tYWNfYWRkcmVzcyA9IGlzc19uZXRfc2V0X21hYzsKKwlkZXYtPmNoYW5nZV9tdHUgPSBpc3NfbmV0X2NoYW5nZV9tdHU7CisJZGV2LT5kb19pb2N0bCA9IGlzc19uZXRfaW9jdGw7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IChIWiA+PiAxKTsKKwlkZXYtPmlycSA9IC0xOworCisJcnRubF9sb2NrKCk7CisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CisJcnRubF91bmxvY2soKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKCJFcnJvciByZWdpc3RlcmluZyBuZXQgZGV2aWNlIVxuIik7CisJCS8qIFhYWDogc2hvdWxkIHdlIGNhbGwgLT5yZW1vdmUoKSBoZXJlPyAqLworCQlmcmVlX25ldGRldihkZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpbml0X3RpbWVyKCZscC0+dGwpOworCWxwLT50bC5mdW5jdGlvbiA9IGlzc19uZXRfdXNlcl90aW1lcl9leHBpcmU7CisKKyNpZiAwCisJaWYgKGxwLT5oYXZlX21hYykKKwkJc2V0X2V0aGVyX21hYyhkZXYsIGxwLT5tYWMpOworI2VuZGlmCisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwkvLyBGSVhNRTogdW5yZWdpc3RlcjsgZnJlZSwgZXRjLi4KKwlyZXR1cm4gLUVJTzsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZpbGxlZCBpbiBkdXJpbmcgZWFybHkgYm9vdCAqLworCitzdHJ1Y3QgbGlzdF9oZWFkIGV0aF9jbWRfbGluZSA9IExJU1RfSEVBRF9JTklUKGV0aF9jbWRfbGluZSk7CisKK3N0cnVjdCBpc3NfbmV0X2luaXQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwljaGFyICppbml0OwkJLyogaW5pdCBzdHJpbmcgKi8KKwlpbnQgaW5kZXg7Cit9OworCisvKgorICogUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhbmQgbG9vayBmb3IgJ2V0aFg9Li4uJyBmaWVsZHMsIGFuZCByZWdpc3RlciBhbGwKKyAqIHRob3NlIGZpZWxkcy4gVGhleSB3aWxsIGJlIGxhdGVyIGluaXRpYWxpemVkIGluIGlzc19uZXRfaW5pdC4KKyAqLworCisjZGVmaW5lIEVSUiBLRVJOX0VSUiAiaXNzX25ldF9zZXR1cDogIgorCitzdGF0aWMgaW50IGlzc19uZXRfc2V0dXAoY2hhciAqc3RyKQoreworCXN0cnVjdCBpc3NfbmV0X3ByaXZhdGUgKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGlzc19uZXRfaW5pdCAqbmV3OworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZTsKKwljaGFyICplbmQ7CisJaW50IG47CisKKwluID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmZW5kLCAwKTsKKwlpZiAoZW5kID09IHN0cikgeworCQlwcmludGsoRVJSICJGYWlsZWQgdG8gcGFyc2UgJyVzJ1xuIiwgc3RyKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChuIDwgMCkgeworCQlwcmludGsoRVJSICJEZXZpY2UgJWQgaXMgbmVnYXRpdmVcbiIsIG4pOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCooc3RyID0gZW5kKSAhPSAnPScpIHsKKwkJcHJpbnRrKEVSUiAiRXhwZWN0ZWQgJz0nIGFmdGVyIGRldmljZSBudW1iZXJcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlzcGluX2xvY2soJmRldmljZXNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKGVsZSwgJmRldmljZXMpIHsKKwkJZGV2aWNlID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBpc3NfbmV0X3ByaXZhdGUsIGRldmljZV9saXN0KTsKKwkJaWYgKGRldmljZS0+aW5kZXggPT0gbikKKwkJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrKCZkZXZpY2VzX2xvY2spOworCisJaWYgKGRldmljZSAmJiBkZXZpY2UtPmluZGV4ID09IG4pIHsKKwkJcHJpbnRrKEVSUiAiRGV2aWNlICVkIGFscmVhZHkgY29uZmlndXJlZFxuIiwgbik7CisJCXJldHVybiAxOworCX0KKworCWlmICgobmV3ID0gYWxsb2NfYm9vdG1lbShzaXplb2YgbmV3KSkgPT0gTlVMTCkgeworCQlwcmludGsoIkFsbG9jX2Jvb3RtZW0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJm5ldy0+bGlzdCk7CisJbmV3LT5pbmRleCA9IG47CisJbmV3LT5pbml0ID0gc3RyICsgMTsKKworCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgJmV0aF9jbWRfbGluZSk7CisJcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBFUlIKKworX19zZXR1cCgiZXRoIiwgaXNzX25ldF9zZXR1cCk7CisKKy8qCisgKiBJbml0aWFsaXplIGFsbCBJU1MgRXRoZXJuZXQgZGV2aWNlcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaW4gaXNzX25ldF9zZXR1cC4KKyAqLworCitzdGF0aWMgaW50IGlzc19uZXRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZSwgKm5leHQ7CisKKwkvKiBXYWxrIHRocm91Z2ggYWxsIEV0aGVybmV0IGRldmljZXMgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kIGxpbmUuICovCisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZWxlLCBuZXh0LCAmZXRoX2NtZF9saW5lKSB7CisJCXN0cnVjdCBpc3NfbmV0X2luaXQgKmV0aDsKKwkJZXRoID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBpc3NfbmV0X2luaXQsIGxpc3QpOworCQlpc3NfbmV0X2NvbmZpZ3VyZShldGgtPmluZGV4LCBldGgtPmluaXQpOworCX0KKworCXJldHVybiAxOworfQorCittb2R1bGVfaW5pdChpc3NfbmV0X2luaXQpOworCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2V0dXAuYyBiL2FyY2gveHRlbnNhL3BsYXRmb3JtLWlzcy9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNmRjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2V0dXAuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqCisgKiBhcmNoL3h0ZW5zYS9wbGF0Zm9ybS1pc3Mvc2V0dXAuYworICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLgorICoKKyAqIEF1dGhvcnM6IENocmlzIFphbmtlbCA8Y2hyaXNAemFua2VsLm5ldD4KKyAqICAgICAgICAgIEpvZSBUYXlsb3IgPGpvZUB0ZW5zaWxpY2EuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKKyNpbmNsdWRlIDxhc20vcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisKKwordm9pZCBfX2luaXQgcGxhdGZvcm1faW5pdChicF90YWdfdCogYm9vdHBhcmFtKQoreworCit9CisKK3ZvaWQgcGxhdGZvcm1faGFsdCh2b2lkKQoreworCXByaW50ayAoIiAqKiBDYWxsZWQgcGxhdGZvcm1faGFsdCgpLCBsb29waW5nIGZvcmV2ZXIhICoqXG4iKTsKKwl3aGlsZSAoMSk7Cit9CisKK3ZvaWQgcGxhdGZvcm1fcG93ZXJfb2ZmKHZvaWQpCit7CisJcHJpbnRrICgiICoqIENhbGxlZCBwbGF0Zm9ybV9wb3dlcl9vZmYoKSwgbG9vcGluZyBmb3JldmVyISAqKlxuIik7CisJd2hpbGUgKDEpOworfQordm9pZCBwbGF0Zm9ybV9yZXN0YXJ0KHZvaWQpCit7CisJLyogRmx1c2ggYW5kIHJlc2V0IHRoZSBtbXUsIHNpbXVsYXRlIGEgcHJvY2Vzc29yIHJlc2V0LCBhbmQKKwkgKiBqdW1wIHRvIHRoZSByZXNldCB2ZWN0b3IuICovCisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92aQlhMiwgMTVcblx0IgorCQkJICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KElDT1VOVExFVkVMKSAiXG5cdCIKKwkJCSAgICAgIm1vdmkJYTIsIDBcblx0IgorCQkJICAgICAid3NyCWEyLCAiIF9fc3RyaW5naWZ5KElDT1VOVCkgIlxuXHQiCisJCQkgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoSUJSRUFLRU5BQkxFKSAiXG5cdCIKKwkJCSAgICAgIndzcglhMiwgIiBfX3N0cmluZ2lmeShMQ09VTlQpICJcblx0IgorCQkJICAgICAibW92aQlhMiwgMHgxZlxuXHQiCisJCQkgICAgICJ3c3IJYTIsICIgX19zdHJpbmdpZnkoUFMpICJcblx0IgorCQkJICAgICAiaXN5bmNcblx0IgorCQkJICAgICAiangJJTBcblx0IgorCQkJICAgICA6CisJCQkgICAgIDogImEiIChYQ0hBTF9SRVNFVF9WRUNUT1JfVkFERFIpCisJCQkgICAgIDogImEyIik7CisKKwkvKiBjb250cm9sIG5ldmVyIGdldHMgaGVyZSAqLworfQorCitleHRlcm4gdm9pZCBpc3NfbmV0X3BvbGwodm9pZCk7CisKK2NvbnN0IGNoYXIgdHdpcmxbXT0ifC8tXFx8Ly1cXCI7CisKK3ZvaWQgcGxhdGZvcm1faGVhcnRiZWF0KHZvaWQpCit7CisjaWYgMAorCXN0YXRpYyBpbnQgaSA9IDAsIGogPSAwOworCisJaWYgKC0taSA8IDApIHsKKwkJaSA9IDk5OworCQlwcmludGsoIlxyJWNcciIsIHR3aXJsW2orK10pOworCQlpZiAoaiA9PSA4KQorCQkJaiA9IDA7CisJfQorI2VuZGlmCit9CisKKworCitzdGF0aWMgaW50Citpc3NfcGFuaWNfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdmkgYTIsIC0xOyBzaW1jYWxsXG4iKTsKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXNzX3BhbmljX2Jsb2NrID0geworCWlzc19wYW5pY19ldmVudCwKKwlOVUxMLAorCTAKK307CisKK3ZvaWQgX19pbml0IHBsYXRmb3JtX3NldHVwKGNoYXIgKipwX2NtZGxpbmUpCit7CisJbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZpc3NfcGFuaWNfYmxvY2spOworfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCA5MGQ2MDg5Li4yNTZjMGIxIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIGNvbmZpZyBDUllQVE9fQUVTCiAJdHJpc3RhdGUgIkFFUyBjaXBoZXIgYWxnb3JpdGhtcyIKLQlkZXBlbmRzIG9uIENSWVBUTyAmJiAhKChYODYgfHwgVU1MX1g4NikgJiYgITY0QklUKQorCWRlcGVuZHMgb24gQ1JZUFRPICYmICEoWDg2IHx8IFVNTF9YODYpCiAJaGVscAogCSAgQUVTIGNpcGhlciBhbGdvcml0aG1zIChGSVBTLTE5NykuIEFFUyB1c2VzIHRoZSBSaWpuZGFlbCAKIAkgIGFsZ29yaXRobS4KQEAgLTE4NCw2ICsxODQsMjYgQEAKIAogCSAgU2VlIDxodHRwOi8vY3NyYy5uaXN0Lmdvdi9lbmNyeXB0aW9uL2Flcy8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogCitjb25maWcgQ1JZUFRPX0FFU19YODZfNjQKKwl0cmlzdGF0ZSAiQUVTIGNpcGhlciBhbGdvcml0aG1zICh4ODZfNjQpIgorCWRlcGVuZHMgb24gQ1JZUFRPICYmICgoWDg2IHx8IFVNTF9YODYpICYmIDY0QklUKQorCWhlbHAKKwkgIEFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoRklQUy0xOTcpLiBBRVMgdXNlcyB0aGUgUmlqbmRhZWwgCisJICBhbGdvcml0aG0uCisKKwkgIFJpam5kYWVsIGFwcGVhcnMgdG8gYmUgY29uc2lzdGVudGx5IGEgdmVyeSBnb29kIHBlcmZvcm1lciBpbgorCSAgYm90aCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBjb21wdXRpbmcgCisJICBlbnZpcm9ubWVudHMgcmVnYXJkbGVzcyBvZiBpdHMgdXNlIGluIGZlZWRiYWNrIG9yIG5vbi1mZWVkYmFjayAKKwkgIG1vZGVzLiBJdHMga2V5IHNldHVwIHRpbWUgaXMgZXhjZWxsZW50LCBhbmQgaXRzIGtleSBhZ2lsaXR5IGlzIAorCSAgZ29vZC4gUmlqbmRhZWwncyB2ZXJ5IGxvdyBtZW1vcnkgcmVxdWlyZW1lbnRzIG1ha2UgaXQgdmVyeSB3ZWxsIAorCSAgc3VpdGVkIGZvciByZXN0cmljdGVkLXNwYWNlIGVudmlyb25tZW50cywgaW4gd2hpY2ggaXQgYWxzbyAKKwkgIGRlbW9uc3RyYXRlcyBleGNlbGxlbnQgcGVyZm9ybWFuY2UuIFJpam5kYWVsJ3Mgb3BlcmF0aW9ucyBhcmUgCisJICBhbW9uZyB0aGUgZWFzaWVzdCB0byBkZWZlbmQgYWdhaW5zdCBwb3dlciBhbmQgdGltaW5nIGF0dGFja3MuCQorCisJICBUaGUgQUVTIHNwZWNpZmllcyB0aHJlZSBrZXkgc2l6ZXM6IDEyOCwgMTkyIGFuZCAyNTYgYml0cwkgIAorCisJICBTZWUgPGh0dHA6Ly9jc3JjLm5pc3QuZ292L2VuY3J5cHRpb24vYWVzLz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKIGNvbmZpZyBDUllQVE9fQ0FTVDUKIAl0cmlzdGF0ZSAiQ0FTVDUgKENBU1QtMTI4KSBjaXBoZXIgYWxnb3JpdGhtIgogCWRlcGVuZHMgb24gQ1JZUFRPCmRpZmYgLS1naXQgYS9jcnlwdG8vYXBpLmMgYi9jcnlwdG8vYXBpLmMKaW5kZXggMzk0MTY5YS4uYjQ3Mjg4MSAxMDA2NDQKLS0tIGEvY3J5cHRvL2FwaS5jCisrKyBiL2NyeXB0by9hcGkuYwpAQCAtMTMsOSArMTMsMTIgQEAKICAqIGFueSBsYXRlciB2ZXJzaW9uLgogICoKICAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTMzLDcgKzM2LDcgQEAKIAltb2R1bGVfcHV0KGFsZy0+Y3JhX21vZHVsZSk7CiB9CiAKLXN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBjcnlwdG9fYWxnICpxLCAqYWxnID0gTlVMTDsKIApAQCAtNTQsNiArNTcsMTMgQEAKIAlyZXR1cm4gYWxnOwogfQogCisvKiBBIGZhciBtb3JlIGludGVsbGlnZW50IHZlcnNpb24gb2YgdGhpcyBpcyBwbGFubmVkLiAgRm9yIG5vdywganVzdAorICogdHJ5IGFuIGV4YWN0IG1hdGNoIG9uIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fYWxnX21vZF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoY3J5cHRvX2FsZ19sb29rdXAobmFtZSksIG5hbWUpOworfQorCiBzdGF0aWMgaW50IGNyeXB0b19pbml0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKIHsKIAl0Zm0tPmNydF9mbGFncyA9IDA7CkBAIC0xMTcsMjAgKzEyNyw0NiBAQAogCX0KIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdG9fY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKworCXN3aXRjaCAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgeworCWRlZmF1bHQ6CisJCUJVRygpOworCisJY2FzZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOgorCQlsZW4gPSBjcnlwdG9fY2lwaGVyX2N0eHNpemUoYWxnLCBmbGFncyk7CisJCWJyZWFrOworCQkKKwljYXNlIENSWVBUT19BTEdfVFlQRV9ESUdFU1Q6CisJCWxlbiA9IGNyeXB0b19kaWdlc3RfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOgorCQlsZW4gPSBjcnlwdG9fY29tcHJlc3NfY3R4c2l6ZShhbGcsIGZsYWdzKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxlbiArIGFsZy0+Y3JhX2FsaWdubWFzazsKK30KKwogc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQogewogCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBOVUxMOwogCXN0cnVjdCBjcnlwdG9fYWxnICphbGc7CisJdW5zaWduZWQgaW50IHRmbV9zaXplOwogCiAJYWxnID0gY3J5cHRvX2FsZ19tb2RfbG9va3VwKG5hbWUpOwogCWlmIChhbGcgPT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JCi0JdGZtID0ga21hbGxvYyhzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplLCBHRlBfS0VSTkVMKTsKKworCXRmbV9zaXplID0gc2l6ZW9mKCp0Zm0pICsgY3J5cHRvX2N0eHNpemUoYWxnLCBmbGFncyk7CisJdGZtID0ga21hbGxvYyh0Zm1fc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRmbSA9PSBOVUxMKQogCQlnb3RvIG91dF9wdXQ7CiAKLQltZW1zZXQodGZtLCAwLCBzaXplb2YoKnRmbSkgKyBhbGctPmNyYV9jdHhzaXplKTsKKwltZW1zZXQodGZtLCAwLCB0Zm1fc2l6ZSk7CiAJCiAJdGZtLT5fX2NydF9hbGcgPSBhbGc7CiAJCkBAIC0xNTUsOCArMTkxLDE0IEBACiAKIHZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0Jc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOwotCWludCBzaXplID0gc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZTsKKwlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCWludCBzaXplOworCisJaWYgKHVubGlrZWx5KCF0Zm0pKQorCQlyZXR1cm47CisKKwlhbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlzaXplID0gc2l6ZW9mKCp0Zm0pICsgYWxnLT5jcmFfY3R4c2l6ZTsKIAogCWNyeXB0b19leGl0X29wcyh0Zm0pOwogCWNyeXB0b19hbGdfcHV0KGFsZyk7CkBAIC0xNjgsNiArMjEwLDEyIEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGNyeXB0b19hbGcgKnE7CisKKwlpZiAoYWxnLT5jcmFfYWxpZ25tYXNrICYgKGFsZy0+Y3JhX2FsaWdubWFzayArIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhbGctPmNyYV9hbGlnbm1hc2sgPiBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOwogCQogCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIAkKZGlmZiAtLWdpdCBhL2NyeXB0by9jaXBoZXIuYyBiL2NyeXB0by9jaXBoZXIuYwppbmRleCBmNDM0Y2U3Li4xYzkyYzZiIDEwMDY0NAotLS0gYS9jcnlwdG8vY2lwaGVyLmMKKysrIGIvY3J5cHRvL2NpcGhlci5jCkBAIC00LDYgKzQsNyBAQAogICogQ2lwaGVyIG9wZXJhdGlvbnMuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKQEAgLTIyLDEwICsyMyw2IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzY2F0dGVyd2Fsay5oIgogCi10eXBlZGVmIHZvaWQgKGNyeXB0Zm5fdCkodm9pZCAqLCB1OCAqLCBjb25zdCB1OCAqKTsKLXR5cGVkZWYgdm9pZCAocHJvY2ZuX3QpKHN0cnVjdCBjcnlwdG9fdGZtICosIHU4ICosCi0gICAgICAgICAgICAgICAgICAgICAgICB1OCosIGNyeXB0Zm5fdCwgdm9pZCAqKTsKLQogc3RhdGljIGlubGluZSB2b2lkIHhvcl82NCh1OCAqYSwgY29uc3QgdTggKmIpCiB7CiAJKCh1MzIgKilhKVswXSBePSAoKHUzMiAqKWIpWzBdOwpAQCAtMzksNjMgKzM2LDcwIEBACiAJKCh1MzIgKilhKVsyXSBePSAoKHUzMiAqKWIpWzJdOwogCSgodTMyICopYSlbM10gXj0gKCh1MzIgKiliKVszXTsKIH0KLSAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqcHJlcGFyZV9zcmMoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IGJzaXplLAotCQkJCXZvaWQgKnRtcCwgaW50IGluX3BsYWNlKQotewotCXZvaWQgKnNyYyA9IHdhbGstPmRhdGE7Ci0JaW50IG4gPSBic2l6ZTsKIAotCWlmICh1bmxpa2VseShzY2F0dGVyd2Fsa19hY3Jvc3NfcGFnZXMod2FsaywgYnNpemUpKSkgeworc3RhdGljIHVuc2lnbmVkIGludCBjcnlwdF9zbG93KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICppbiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcl93YWxrICpvdXQsIHVuc2lnbmVkIGludCBic2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgYWxpZ25tYXNrID0gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGRlc2MtPnRmbSk7CisJdTggYnVmZmVyW2JzaXplICogMiArIGFsaWdubWFza107CisJdTggKnNyYyA9ICh1OCAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKWJ1ZmZlciwgYWxpZ25tYXNrICsgMSk7CisJdTggKmRzdCA9IHNyYyArIGJzaXplOworCXVuc2lnbmVkIGludCBuOworCisJbiA9IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Moc3JjLCBpbiwgYnNpemUsIDApOworCXNjYXR0ZXJ3YWxrX2FkdmFuY2UoaW4sIG4pOworCisJZGVzYy0+cHJmbihkZXNjLCBkc3QsIHNyYywgYnNpemUpOworCisJbiA9IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3MoZHN0LCBvdXQsIGJzaXplLCAxKTsKKwlzY2F0dGVyd2Fsa19hZHZhbmNlKG91dCwgbik7CisKKwlyZXR1cm4gYnNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0X2Zhc3QoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKmluLAorCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVyX3dhbGsgKm91dCwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqdG1wKQoreworCXU4ICpzcmMsICpkc3Q7CisKKwlzcmMgPSBpbi0+ZGF0YTsKKwlkc3QgPSBzY2F0dGVyd2Fsa19zYW1lYnVmKGluLCBvdXQpID8gc3JjIDogb3V0LT5kYXRhOworCisJaWYgKHRtcCkgeworCQltZW1jcHkodG1wLCBpbi0+ZGF0YSwgbmJ5dGVzKTsKIAkJc3JjID0gdG1wOwotCQluID0gc2NhdHRlcndhbGtfY29weWNodW5rcyhzcmMsIHdhbGssIGJzaXplLCAwKTsKLQl9Ci0Jc2NhdHRlcndhbGtfYWR2YW5jZSh3YWxrLCBuKTsKLQlyZXR1cm4gc3JjOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgKnByZXBhcmVfZHN0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBic2l6ZSwKLQkJCQl2b2lkICp0bXAsIGludCBpbl9wbGFjZSkKLXsKLQl2b2lkICpkc3QgPSB3YWxrLT5kYXRhOwotCi0JaWYgKHVubGlrZWx5KHNjYXR0ZXJ3YWxrX2Fjcm9zc19wYWdlcyh3YWxrLCBic2l6ZSkpIHx8IGluX3BsYWNlKQogCQlkc3QgPSB0bXA7Ci0JcmV0dXJuIGRzdDsKLX0KKwl9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb21wbGV0ZV9zcmMoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IGJzaXplLAotCQkJCXZvaWQgKnNyYywgaW50IGluX3BsYWNlKQotewotfQorCW5ieXRlcyA9IGRlc2MtPnByZm4oZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb21wbGV0ZV9kc3Qoc3RydWN0IHNjYXR0ZXJfd2FsayAqd2FsaywgaW50IGJzaXplLAotCQkJCXZvaWQgKmRzdCwgaW50IGluX3BsYWNlKQotewotCWludCBuID0gYnNpemU7CisJaWYgKHRtcCkKKwkJbWVtY3B5KG91dC0+ZGF0YSwgdG1wLCBuYnl0ZXMpOwogCi0JaWYgKHVubGlrZWx5KHNjYXR0ZXJ3YWxrX2Fjcm9zc19wYWdlcyh3YWxrLCBic2l6ZSkpKQotCQluID0gc2NhdHRlcndhbGtfY29weWNodW5rcyhkc3QsIHdhbGssIGJzaXplLCAxKTsKLQllbHNlIGlmIChpbl9wbGFjZSkKLQkJbWVtY3B5KHdhbGstPmRhdGEsIGRzdCwgYnNpemUpOwotCXNjYXR0ZXJ3YWxrX2FkdmFuY2Uod2Fsaywgbik7CisJc2NhdHRlcndhbGtfYWR2YW5jZShpbiwgbmJ5dGVzKTsKKwlzY2F0dGVyd2Fsa19hZHZhbmNlKG91dCwgbmJ5dGVzKTsKKworCXJldHVybiBuYnl0ZXM7CiB9CiAKIC8qIAogICogR2VuZXJpYyBlbmNyeXB0L2RlY3J5cHQgd3JhcHBlciBmb3IgY2lwaGVycywgaGFuZGxlcyBvcGVyYXRpb25zIGFjcm9zcwogICogbXVsdGlwbGUgcGFnZSBib3VuZGFyaWVzIGJ5IHVzaW5nIHRlbXBvcmFyeSBibG9ja3MuICBJbiB1c2VyIGNvbnRleHQsCi0gKiB0aGUga2VybmVsIGlzIGdpdmVuIGEgY2hhbmNlIHRvIHNjaGVkdWxlIHVzIG9uY2UgcGVyIGJsb2NrLgorICogdGhlIGtlcm5lbCBpcyBnaXZlbiBhIGNoYW5jZSB0byBzY2hlZHVsZSB1cyBvbmNlIHBlciBwYWdlLgogICovCi1zdGF0aWMgaW50IGNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCitzdGF0aWMgaW50IGNyeXB0KGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKIAkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAogCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIGNyeXB0Zm5fdCBjcmZuLAotICAgICAgICAgICAgICAgICBwcm9jZm5fdCBwcmZuLCB2b2lkICppbmZvKQorCQkgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKIAlzdHJ1Y3Qgc2NhdHRlcl93YWxrIHdhbGtfaW4sIHdhbGtfb3V0OworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBkZXNjLT50Zm07CiAJY29uc3QgdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSk7Ci0JdTggdG1wX3NyY1tic2l6ZV07Ci0JdTggdG1wX2RzdFtic2l6ZV07CisJdW5zaWduZWQgaW50IGFsaWdubWFzayA9IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayh0Zm0pOworCXVuc2lnbmVkIGxvbmcgYnVmZmVyID0gMDsKIAogCWlmICghbmJ5dGVzKQogCQlyZXR1cm4gMDsKQEAgLTEwOSw2NCArMTEzLDE0NCBAQAogCXNjYXR0ZXJ3YWxrX3N0YXJ0KCZ3YWxrX291dCwgZHN0KTsKIAogCWZvcig7OykgewotCQl1OCAqc3JjX3AsICpkc3RfcDsKLQkJaW50IGluX3BsYWNlOworCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlczsKKwkJdTggKnRtcCA9IE5VTEw7CisKKwkJaWYgKCFzY2F0dGVyd2Fsa19hbGlnbmVkKCZ3YWxrX2luLCBhbGlnbm1hc2spIHx8CisJCSAgICAhc2NhdHRlcndhbGtfYWxpZ25lZCgmd2Fsa19vdXQsIGFsaWdubWFzaykpIHsKKwkJCWlmICghYnVmZmVyKSB7CisJCQkJYnVmZmVyID0gX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworCQkJCWlmICghYnVmZmVyKQorCQkJCQluID0gMDsKKwkJCX0KKwkJCXRtcCA9ICh1OCAqKWJ1ZmZlcjsKKwkJfQogCiAJCXNjYXR0ZXJ3YWxrX21hcCgmd2Fsa19pbiwgMCk7CiAJCXNjYXR0ZXJ3YWxrX21hcCgmd2Fsa19vdXQsIDEpOwogCi0JCWluX3BsYWNlID0gc2NhdHRlcndhbGtfc2FtZWJ1Zigmd2Fsa19pbiwgJndhbGtfb3V0KTsKKwkJbiA9IHNjYXR0ZXJ3YWxrX2NsYW1wKCZ3YWxrX2luLCBuKTsKKwkJbiA9IHNjYXR0ZXJ3YWxrX2NsYW1wKCZ3YWxrX291dCwgbik7CiAKLQkJZG8gewotCQkJc3JjX3AgPSBwcmVwYXJlX3NyYygmd2Fsa19pbiwgYnNpemUsIHRtcF9zcmMsCi0JCQkJCSAgICBpbl9wbGFjZSk7Ci0JCQlkc3RfcCA9IHByZXBhcmVfZHN0KCZ3YWxrX291dCwgYnNpemUsIHRtcF9kc3QsCi0JCQkJCSAgICBpbl9wbGFjZSk7CisJCWlmIChsaWtlbHkobiA+PSBic2l6ZSkpCisJCQluID0gY3J5cHRfZmFzdChkZXNjLCAmd2Fsa19pbiwgJndhbGtfb3V0LCBuLCB0bXApOworCQllbHNlCisJCQluID0gY3J5cHRfc2xvdyhkZXNjLCAmd2Fsa19pbiwgJndhbGtfb3V0LCBic2l6ZSk7CiAKLQkJCXByZm4odGZtLCBkc3RfcCwgc3JjX3AsIGNyZm4sIGluZm8pOwotCi0JCQljb21wbGV0ZV9zcmMoJndhbGtfaW4sIGJzaXplLCBzcmNfcCwgaW5fcGxhY2UpOwotCQkJY29tcGxldGVfZHN0KCZ3YWxrX291dCwgYnNpemUsIGRzdF9wLCBpbl9wbGFjZSk7Ci0KLQkJCW5ieXRlcyAtPSBic2l6ZTsKLQkJfSB3aGlsZSAobmJ5dGVzICYmCi0JCQkgIXNjYXR0ZXJ3YWxrX2Fjcm9zc19wYWdlcygmd2Fsa19pbiwgYnNpemUpICYmCi0JCQkgIXNjYXR0ZXJ3YWxrX2Fjcm9zc19wYWdlcygmd2Fsa19vdXQsIGJzaXplKSk7CisJCW5ieXRlcyAtPSBuOwogCiAJCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfaW4sIDAsIG5ieXRlcyk7CiAJCXNjYXR0ZXJ3YWxrX2RvbmUoJndhbGtfb3V0LCAxLCBuYnl0ZXMpOwogCiAJCWlmICghbmJ5dGVzKQotCQkJcmV0dXJuIDA7CisJCQlicmVhazsKIAogCQljcnlwdG9feWllbGQodGZtKTsKIAl9CisKKwlpZiAoYnVmZmVyKQorCQlmcmVlX3BhZ2UoYnVmZmVyKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjYmNfcHJvY2Vzc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCi0JCQkJY3J5cHRmbl90IGZuLCB2b2lkICppbmZvKQorc3RhdGljIGludCBjcnlwdF9pdl91bmFsaWduZWQoc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JdTggKml2ID0gaW5mbzsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOworCXVuc2lnbmVkIGludCBhbGlnbm1hc2sgPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKTsKKwl1OCAqaXYgPSBkZXNjLT5pbmZvOwogCi0JdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jayhpdiwgc3JjKTsKLQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIGl2KTsKLQltZW1jcHkoaXYsIGRzdCwgY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKHRmbSkpOworCWlmICh1bmxpa2VseSgoKHVuc2lnbmVkIGxvbmcpaXYgJiBhbGlnbm1hc2spKSkgeworCQl1bnNpZ25lZCBpbnQgaXZzaXplID0gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdnNpemU7CisJCXU4IGJ1ZmZlcltpdnNpemUgKyBhbGlnbm1hc2tdOworCQl1OCAqdG1wID0gKHU4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCBhbGlnbm1hc2sgKyAxKTsKKwkJaW50IGVycjsKKworCQlkZXNjLT5pbmZvID0gbWVtY3B5KHRtcCwgaXYsIGl2c2l6ZSk7CisJCWVyciA9IGNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOworCQltZW1jcHkoaXYsIHRtcCwgaXZzaXplKTsKKworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjcnlwdChkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAotc3RhdGljIHZvaWQgY2JjX3Byb2Nlc3NfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCB1OCAqc3JjLAotCQkJCWNyeXB0Zm5fdCBmbiwgdm9pZCAqaW5mbykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2JjX3Byb2Nlc3NfZW5jcnlwdChjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JdTggKml2ID0gaW5mbzsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOworCXZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICopID0gdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jazsKKwlpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKIAotCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgc3JjKTsKLQl0Zm0tPmNydF91LmNpcGhlci5jaXRfeG9yX2Jsb2NrKGRzdCwgaXYpOwotCW1lbWNweShpdiwgc3JjLCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSk7CisJdm9pZCAoKmZuKSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKKwl1OCAqaXYgPSBkZXNjLT5pbmZvOworCXVuc2lnbmVkIGludCBkb25lID0gMDsKKworCWRvIHsKKwkJeG9yKGl2LCBzcmMpOworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIGl2KTsKKwkJbWVtY3B5KGl2LCBkc3QsIGJzaXplKTsKKworCQlzcmMgKz0gYnNpemU7CisJCWRzdCArPSBic2l6ZTsKKwl9IHdoaWxlICgoZG9uZSArPSBic2l6ZSkgPCBuYnl0ZXMpOworCisJcmV0dXJuIGRvbmU7CiB9CiAKLXN0YXRpYyB2b2lkIGVjYl9wcm9jZXNzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIHU4ICpzcmMsCi0JCQljcnlwdGZuX3QgZm4sIHZvaWQgKmluZm8pCitzdGF0aWMgdW5zaWduZWQgaW50IGNiY19wcm9jZXNzX2RlY3J5cHQoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCWZuKGNyeXB0b190Zm1fY3R4KHRmbSksIGRzdCwgc3JjKTsKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOworCXZvaWQgKCp4b3IpKHU4ICosIGNvbnN0IHU4ICopID0gdGZtLT5jcnRfdS5jaXBoZXIuY2l0X3hvcl9ibG9jazsKKwlpbnQgYnNpemUgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKTsKKworCXU4IHN0YWNrW3NyYyA9PSBkc3QgPyBic2l6ZSA6IDBdOworCXU4ICpidWYgPSBzdGFjazsKKwl1OCAqKmRzdF9wID0gc3JjID09IGRzdCA/ICZidWYgOiAmZHN0OworCisJdm9pZCAoKmZuKSh2b2lkICosIHU4ICosIGNvbnN0IHU4ICopID0gZGVzYy0+Y3JmbjsKKwl1OCAqaXYgPSBkZXNjLT5pbmZvOworCXVuc2lnbmVkIGludCBkb25lID0gMDsKKworCWRvIHsKKwkJdTggKnRtcF9kc3QgPSAqZHN0X3A7CisKKwkJZm4oY3J5cHRvX3RmbV9jdHgodGZtKSwgdG1wX2RzdCwgc3JjKTsKKwkJeG9yKHRtcF9kc3QsIGl2KTsKKwkJbWVtY3B5KGl2LCBzcmMsIGJzaXplKTsKKwkJaWYgKHRtcF9kc3QgIT0gZHN0KQorCQkJbWVtY3B5KGRzdCwgdG1wX2RzdCwgYnNpemUpOworCisJCXNyYyArPSBic2l6ZTsKKwkJZHN0ICs9IGJzaXplOworCX0gd2hpbGUgKChkb25lICs9IGJzaXplKSA8IG5ieXRlcyk7CisKKwlyZXR1cm4gZG9uZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBlY2JfcHJvY2Vzcyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpkc3QsCisJCQkJY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGVzYy0+dGZtOworCWludCBic2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOworCXZvaWQgKCpmbikodm9pZCAqLCB1OCAqLCBjb25zdCB1OCAqKSA9IGRlc2MtPmNyZm47CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJZG8geworCQlmbihjcnlwdG9fdGZtX2N0eCh0Zm0pLCBkc3QsIHNyYyk7CisKKwkJc3JjICs9IGJzaXplOworCQlkc3QgKz0gYnNpemU7CisJfSB3aGlsZSAoKGRvbmUgKz0gYnNpemUpIDwgbmJ5dGVzKTsKKworCXJldHVybiBkb25lOwogfQogCiBzdGF0aWMgaW50IHNldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQpAQCAtMTg1LDkgKzI2OSwxNCBAQAogCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXJldHVybiBjcnlwdCh0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsCi0JICAgICAgICAgICAgIHRmbS0+X19jcnRfYWxnLT5jcmFfY2lwaGVyLmNpYV9lbmNyeXB0LAotCSAgICAgICAgICAgICBlY2JfcHJvY2VzcywgTlVMTCk7CisJc3RydWN0IGNpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IGNpcGhlcl9hbGcgKmNpcGhlciA9ICZ0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlcjsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuY3JmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHQ7CisJZGVzYy5wcmZuID0gY2lwaGVyLT5jaWFfZW5jcnlwdF9lY2IgPzogZWNiX3Byb2Nlc3M7CisKKwlyZXR1cm4gY3J5cHQoJmRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCkBAIC0xOTUsOSArMjg0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkgICAgICAgICAgICAgZWNiX3Byb2Nlc3MsIE5VTEwpOworCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBjaXBoZXJfYWxnICpjaXBoZXIgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0OworCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHRfZWNiID86IGVjYl9wcm9jZXNzOworCisJcmV0dXJuIGNyeXB0KCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBjYmNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtMjA1LDkgKzI5OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkgICAgICAgICAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2VuY3J5cHQsCi0JICAgICAgICAgICAgIGNiY19wcm9jZXNzX2VuY3J5cHQsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOworCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBjaXBoZXJfYWxnICpjaXBoZXIgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0OworCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2VuY3J5cHQ7CisJZGVzYy5pbmZvID0gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdjsKKworCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiB9CiAKIHN0YXRpYyBpbnQgY2JjX2VuY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTIxNSw5ICszMTUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZW5jcnlwdCwKLQkgICAgICAgICAgICAgY2JjX3Byb2Nlc3NfZW5jcnlwdCwgaXYpOworCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBjaXBoZXJfYWxnICpjaXBoZXIgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9lbmNyeXB0OworCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2VuY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2VuY3J5cHQ7CisJZGVzYy5pbmZvID0gaXY7CisKKwlyZXR1cm4gY3J5cHRfaXZfdW5hbGlnbmVkKCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBjYmNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLApAQCAtMjI1LDkgKzMzMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIGNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcywKLQkgICAgICAgICAgICAgdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX2RlY3J5cHQsCi0JICAgICAgICAgICAgIGNiY19wcm9jZXNzX2RlY3J5cHQsIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOworCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBjaXBoZXJfYWxnICpjaXBoZXIgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0OworCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2RlY3J5cHQ7CisJZGVzYy5pbmZvID0gdGZtLT5jcnRfY2lwaGVyLmNpdF9pdjsKKworCXJldHVybiBjcnlwdCgmZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiB9CiAKIHN0YXRpYyBpbnQgY2JjX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKQEAgLTIzNSw5ICszNDcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKIHsKLQlyZXR1cm4gY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzLAotCSAgICAgICAgICAgICB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2NpcGhlci5jaWFfZGVjcnlwdCwKLQkgICAgICAgICAgICAgY2JjX3Byb2Nlc3NfZGVjcnlwdCwgaXYpOworCXN0cnVjdCBjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBjaXBoZXJfYWxnICpjaXBoZXIgPSAmdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXI7CisKKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmNyZm4gPSBjaXBoZXItPmNpYV9kZWNyeXB0OworCWRlc2MucHJmbiA9IGNpcGhlci0+Y2lhX2RlY3J5cHRfY2JjID86IGNiY19wcm9jZXNzX2RlY3J5cHQ7CisJZGVzYy5pbmZvID0gaXY7CisKKwlyZXR1cm4gY3J5cHRfaXZfdW5hbGlnbmVkKCZkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCBub2NyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCkBAIC0zMDYsNiArNDI0LDggQEAKIAl9CiAJCiAJaWYgKG9wcy0+Y2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0NCQykgeworCQl1bnNpZ25lZCBpbnQgYWxpZ247CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAkgICAgCQogCSAgICAJc3dpdGNoIChjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUodGZtKSkgewogCSAgICAJY2FzZSA4OgpAQCAtMzI1LDkgKzQ0NSwxMSBAQAogCSAgICAJfQogCSAgICAJCiAJCW9wcy0+Y2l0X2l2c2l6ZSA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZSh0Zm0pOwotCSAgICAJb3BzLT5jaXRfaXYgPSBrbWFsbG9jKG9wcy0+Y2l0X2l2c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChvcHMtPmNpdF9pdiA9PSBOVUxMKQotCQkJcmV0ID0gLUVOT01FTTsKKwkJYWxpZ24gPSBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2sodGZtKSArIDE7CisJCWFkZHIgPSAodW5zaWduZWQgbG9uZyljcnlwdG9fdGZtX2N0eCh0Zm0pOworCQlhZGRyID0gQUxJR04oYWRkciwgYWxpZ24pOworCQlhZGRyICs9IEFMSUdOKHRmbS0+X19jcnRfYWxnLT5jcmFfY3R4c2l6ZSwgYWxpZ24pOworCQlvcHMtPmNpdF9pdiA9ICh2b2lkICopYWRkcjsKIAl9CiAKIG91dDoJCkBAIC0zMzYsNiArNDU4LDQgQEAKIAogdm9pZCBjcnlwdG9fZXhpdF9jaXBoZXJfb3BzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCiB7Ci0JaWYgKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpCi0JCWtmcmVlKHRmbS0+Y3J0X2NpcGhlci5jaXRfaXYpOwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Rlcy5jIGIvY3J5cHRvL2Rlcy5jCmluZGV4IDFjN2U2ZGUuLmEzYzg2M2QgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kZXMuYworKysgYi9jcnlwdG8vZGVzLmMKQEAgLTEsMTggKzEsOSBAQAotLyogCisvKgogICogQ3J5cHRvZ3JhcGhpYyBBUEkuCiAgKgogICogREVTICYgVHJpcGxlIERFUyBFREUgQ2lwaGVyIEFsZ29yaXRobXMuCiAgKgotICogT3JpZ2luYWxseSByZWxlYXNlZCBhcyBkZXNjb3JlIGJ5IERhbmEgTC4gSG93IDxob3dAaXNsLnN0YW5mb3JkLmVkdT4uCi0gKiBNb2RpZmllZCBieSBSYWltYXIgRmFsa2UgPHJmMTNAaW5mLnR1LWRyZXNkZW4uZGU+IGZvciB0aGUgTGludXgtS2VybmVsLgotICogRGVyaXZlZCBmcm9tIENyeXB0b2FwaSBhbmQgTmV0dGxlIGltcGxlbWVudGF0aW9ucywgYWRhcHRlZCBmb3IgaW4tcGxhY2UKLSAqIHNjYXR0ZXJsaXN0IGludGVyZmFjZS4gIENoYW5nZWQgTEdQTCB0byBHUEwgcGVyIHNlY3Rpb24gMyBvZiB0aGUgTEdQTC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTIgRGFuYSBMLiBIb3cuCi0gKiBDb3B5cmlnaHQgKGMpIFJhaW1hciBGYWxrZSA8cmYxM0BpbmYudHUtZHJlc2Rlbi5kZT4gCi0gKiBDb3B5cmlnaHQgKGMpIEdpc2xlIFPmbGVuc21pbmRlIDxnaXNsZUBpaS51aWIubm8+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgTmllbHMgTfZsbGVyLgotICogQ29weXJpZ2h0IChjKSAyMDAyIEphbWVzIE1vcnJpcyA8am1vcnJpc0BpbnRlcmNvZGUuY29tLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDA1IERhZyBBcm5lIE9zdmlrIDxkYUBvc3Zpay5ubz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIwLDExICsxMSwxMSBAQAogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCiAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAKICNkZWZpbmUgREVTX0tFWV9TSVpFCQk4CkBAIC0zNSwxMTU3ICsyNiw4MjYgQEAKICNkZWZpbmUgREVTM19FREVfRVhQS0VZX1dPUkRTCSgzICogREVTX0VYUEtFWV9XT1JEUykKICNkZWZpbmUgREVTM19FREVfQkxPQ0tfU0laRQlERVNfQkxPQ0tfU0laRQogCi0jZGVmaW5lIFJPUihkLGMsbykJKChkKSA9IChkKSA+PiAoYykgfCAoZCkgPDwgKG8pKQorI2RlZmluZSBST0woeCwgcikgKCh4KSA9IHJvbDMyKCh4KSwgKHIpKSkKKyNkZWZpbmUgUk9SKHgsIHIpICgoeCkgPSByb3IzMigoeCksIChyKSkpCiAKIHN0cnVjdCBkZXNfY3R4IHsKLQl1OCBpdltERVNfQkxPQ0tfU0laRV07CiAJdTMyIGV4cGtleVtERVNfRVhQS0VZX1dPUkRTXTsKIH07CiAKIHN0cnVjdCBkZXMzX2VkZV9jdHggewotCXU4IGl2W0RFU19CTE9DS19TSVpFXTsKIAl1MzIgZXhwa2V5W0RFUzNfRURFX0VYUEtFWV9XT1JEU107CiB9OwogCi1zdGF0aWMgY29uc3QgdTMyIGRlc19rZXltYXBbXSA9IHsKLQkweDAyMDgwMDA4LCAweDAyMDgyMDAwLCAweDAwMDAyMDA4LCAweDAwMDAwMDAwLAotCTB4MDIwMDIwMDAsIDB4MDAwODAwMDgsIDB4MDIwODAwMDAsIDB4MDIwODIwMDgsCi0JMHgwMDAwMDAwOCwgMHgwMjAwMDAwMCwgMHgwMDA4MjAwMCwgMHgwMDAwMjAwOCwKLQkweDAwMDgyMDA4LCAweDAyMDAyMDA4LCAweDAyMDAwMDA4LCAweDAyMDgwMDAwLAotCTB4MDAwMDIwMDAsIDB4MDAwODIwMDgsIDB4MDAwODAwMDgsIDB4MDIwMDIwMDAsCi0JMHgwMjA4MjAwOCwgMHgwMjAwMDAwOCwgMHgwMDAwMDAwMCwgMHgwMDA4MjAwMCwKLQkweDAyMDAwMDAwLCAweDAwMDgwMDAwLCAweDAyMDAyMDA4LCAweDAyMDgwMDA4LAotCTB4MDAwODAwMDAsIDB4MDAwMDIwMDAsIDB4MDIwODIwMDAsIDB4MDAwMDAwMDgsCi0JMHgwMDA4MDAwMCwgMHgwMDAwMjAwMCwgMHgwMjAwMDAwOCwgMHgwMjA4MjAwOCwKLQkweDAwMDAyMDA4LCAweDAyMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDgyMDAwLAotCTB4MDIwODAwMDgsIDB4MDIwMDIwMDgsIDB4MDIwMDIwMDAsIDB4MDAwODAwMDgsCi0JMHgwMjA4MjAwMCwgMHgwMDAwMDAwOCwgMHgwMDA4MDAwOCwgMHgwMjAwMjAwMCwKLQkweDAyMDgyMDA4LCAweDAwMDgwMDAwLCAweDAyMDgwMDAwLCAweDAyMDAwMDA4LAotCTB4MDAwODIwMDAsIDB4MDAwMDIwMDgsIDB4MDIwMDIwMDgsIDB4MDIwODAwMDAsCi0JMHgwMDAwMDAwOCwgMHgwMjA4MjAwMCwgMHgwMDA4MjAwOCwgMHgwMDAwMDAwMCwKLQkweDAyMDAwMDAwLCAweDAyMDgwMDA4LCAweDAwMDAyMDAwLCAweDAwMDgyMDA4LAorLyogTG9va3VwIHRhYmxlcyBmb3Iga2V5IGV4cGFuc2lvbiAqLwogCi0JMHgwODAwMDAwNCwgMHgwMDAyMDAwNCwgMHgwMDAwMDAwMCwgMHgwODAyMDIwMCwKLQkweDAwMDIwMDA0LCAweDAwMDAwMjAwLCAweDA4MDAwMjA0LCAweDAwMDIwMDAwLAotCTB4MDAwMDAyMDQsIDB4MDgwMjAyMDQsIDB4MDAwMjAyMDAsIDB4MDgwMDAwMDAsCi0JMHgwODAwMDIwMCwgMHgwODAwMDAwNCwgMHgwODAyMDAwMCwgMHgwMDAyMDIwNCwKLQkweDAwMDIwMDAwLCAweDA4MDAwMjA0LCAweDA4MDIwMDA0LCAweDAwMDAwMDAwLAotCTB4MDAwMDAyMDAsIDB4MDAwMDAwMDQsIDB4MDgwMjAyMDAsIDB4MDgwMjAwMDQsCi0JMHgwODAyMDIwNCwgMHgwODAyMDAwMCwgMHgwODAwMDAwMCwgMHgwMDAwMDIwNCwKLQkweDAwMDAwMDA0LCAweDAwMDIwMjAwLCAweDAwMDIwMjA0LCAweDA4MDAwMjAwLAotCTB4MDAwMDAyMDQsIDB4MDgwMDAwMDAsIDB4MDgwMDAyMDAsIDB4MDAwMjAyMDQsCi0JMHgwODAyMDIwMCwgMHgwMDAyMDAwNCwgMHgwMDAwMDAwMCwgMHgwODAwMDIwMCwKLQkweDA4MDAwMDAwLCAweDAwMDAwMjAwLCAweDA4MDIwMDA0LCAweDAwMDIwMDAwLAotCTB4MDAwMjAwMDQsIDB4MDgwMjAyMDQsIDB4MDAwMjAyMDAsIDB4MDAwMDAwMDQsCi0JMHgwODAyMDIwNCwgMHgwMDAyMDIwMCwgMHgwMDAyMDAwMCwgMHgwODAwMDIwNCwKLQkweDA4MDAwMDA0LCAweDA4MDIwMDAwLCAweDAwMDIwMjA0LCAweDAwMDAwMDAwLAotCTB4MDAwMDAyMDAsIDB4MDgwMDAwMDQsIDB4MDgwMDAyMDQsIDB4MDgwMjAyMDAsCi0JMHgwODAyMDAwMCwgMHgwMDAwMDIwNCwgMHgwMDAwMDAwNCwgMHgwODAyMDAwNCwKLQotCTB4ODAwNDAxMDAsIDB4MDEwMDAxMDAsIDB4ODAwMDAwMDAsIDB4ODEwNDAxMDAsCi0JMHgwMDAwMDAwMCwgMHgwMTA0MDAwMCwgMHg4MTAwMDEwMCwgMHg4MDA0MDAwMCwKLQkweDAxMDQwMTAwLCAweDgxMDAwMDAwLCAweDAxMDAwMDAwLCAweDgwMDAwMTAwLAotCTB4ODEwMDAwMDAsIDB4ODAwNDAxMDAsIDB4MDAwNDAwMDAsIDB4MDEwMDAwMDAsCi0JMHg4MTA0MDAwMCwgMHgwMDA0MDEwMCwgMHgwMDAwMDEwMCwgMHg4MDAwMDAwMCwKLQkweDAwMDQwMTAwLCAweDgxMDAwMTAwLCAweDAxMDQwMDAwLCAweDAwMDAwMTAwLAotCTB4ODAwMDAxMDAsIDB4MDAwMDAwMDAsIDB4ODAwNDAwMDAsIDB4MDEwNDAxMDAsCi0JMHgwMTAwMDEwMCwgMHg4MTA0MDAwMCwgMHg4MTA0MDEwMCwgMHgwMDA0MDAwMCwKLQkweDgxMDQwMDAwLCAweDgwMDAwMTAwLCAweDAwMDQwMDAwLCAweDgxMDAwMDAwLAotCTB4MDAwNDAxMDAsIDB4MDEwMDAxMDAsIDB4ODAwMDAwMDAsIDB4MDEwNDAwMDAsCi0JMHg4MTAwMDEwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDEwMCwgMHg4MDA0MDAwMCwKLQkweDAwMDAwMDAwLCAweDgxMDQwMDAwLCAweDAxMDQwMTAwLCAweDAwMDAwMTAwLAotCTB4MDEwMDAwMDAsIDB4ODEwNDAxMDAsIDB4ODAwNDAxMDAsIDB4MDAwNDAwMDAsCi0JMHg4MTA0MDEwMCwgMHg4MDAwMDAwMCwgMHgwMTAwMDEwMCwgMHg4MDA0MDEwMCwKLQkweDgwMDQwMDAwLCAweDAwMDQwMTAwLCAweDAxMDQwMDAwLCAweDgxMDAwMTAwLAotCTB4ODAwMDAxMDAsIDB4MDEwMDAwMDAsIDB4ODEwMDAwMDAsIDB4MDEwNDAxMDAsCi0KLQkweDA0MDEwODAxLCAweDAwMDAwMDAwLCAweDAwMDEwODAwLCAweDA0MDEwMDAwLAotCTB4MDQwMDAwMDEsIDB4MDAwMDA4MDEsIDB4MDQwMDA4MDAsIDB4MDAwMTA4MDAsCi0JMHgwMDAwMDgwMCwgMHgwNDAxMDAwMSwgMHgwMDAwMDAwMSwgMHgwNDAwMDgwMCwKLQkweDAwMDEwMDAxLCAweDA0MDEwODAwLCAweDA0MDEwMDAwLCAweDAwMDAwMDAxLAotCTB4MDAwMTAwMDAsIDB4MDQwMDA4MDEsIDB4MDQwMTAwMDEsIDB4MDAwMDA4MDAsCi0JMHgwMDAxMDgwMSwgMHgwNDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAxMDAwMSwKLQkweDA0MDAwODAxLCAweDAwMDEwODAxLCAweDA0MDEwODAwLCAweDA0MDAwMDAxLAotCTB4MDQwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MDAwMDA4MDEsIDB4MDQwMTA4MDEsCi0JMHgwMDAxMDAwMSwgMHgwNDAxMDgwMCwgMHgwNDAwMDgwMCwgMHgwMDAxMDgwMSwKLQkweDA0MDEwODAxLCAweDAwMDEwMDAxLCAweDA0MDAwMDAxLCAweDAwMDAwMDAwLAotCTB4MDQwMDAwMDAsIDB4MDAwMDA4MDEsIDB4MDAwMTAwMDAsIDB4MDQwMTAwMDEsCi0JMHgwMDAwMDgwMCwgMHgwNDAwMDAwMCwgMHgwMDAxMDgwMSwgMHgwNDAwMDgwMSwKLQkweDA0MDEwODAwLCAweDAwMDAwODAwLCAweDAwMDAwMDAwLCAweDA0MDAwMDAxLAotCTB4MDAwMDAwMDEsIDB4MDQwMTA4MDEsIDB4MDAwMTA4MDAsIDB4MDQwMTAwMDAsCi0JMHgwNDAxMDAwMSwgMHgwMDAxMDAwMCwgMHgwMDAwMDgwMSwgMHgwNDAwMDgwMCwKLQkweDA0MDAwODAxLCAweDAwMDAwMDAxLCAweDA0MDEwMDAwLCAweDAwMDEwODAwLAotCi0JMHgwMDAwMDQwMCwgMHgwMDAwMDAyMCwgMHgwMDEwMDAyMCwgMHg0MDEwMDAwMCwKLQkweDQwMTAwNDIwLCAweDQwMDAwNDAwLCAweDAwMDAwNDIwLCAweDAwMDAwMDAwLAotCTB4MDAxMDAwMDAsIDB4NDAxMDAwMjAsIDB4NDAwMDAwMjAsIDB4MDAxMDA0MDAsCi0JMHg0MDAwMDAwMCwgMHgwMDEwMDQyMCwgMHgwMDEwMDQwMCwgMHg0MDAwMDAyMCwKLQkweDQwMTAwMDIwLCAweDAwMDAwNDAwLCAweDQwMDAwNDAwLCAweDQwMTAwNDIwLAotCTB4MDAwMDAwMDAsIDB4MDAxMDAwMjAsIDB4NDAxMDAwMDAsIDB4MDAwMDA0MjAsCi0JMHg0MDEwMDQwMCwgMHg0MDAwMDQyMCwgMHgwMDEwMDQyMCwgMHg0MDAwMDAwMCwKLQkweDQwMDAwNDIwLCAweDQwMTAwNDAwLCAweDAwMDAwMDIwLCAweDAwMTAwMDAwLAotCTB4NDAwMDA0MjAsIDB4MDAxMDA0MDAsIDB4NDAxMDA0MDAsIDB4NDAwMDAwMjAsCi0JMHgwMDAwMDQwMCwgMHgwMDAwMDAyMCwgMHgwMDEwMDAwMCwgMHg0MDEwMDQwMCwKLQkweDQwMTAwMDIwLCAweDQwMDAwNDIwLCAweDAwMDAwNDIwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMjAsIDB4NDAxMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAxMDAwMjAsCi0JMHgwMDAwMDAwMCwgMHg0MDEwMDAyMCwgMHgwMDEwMDAyMCwgMHgwMDAwMDQyMCwKLQkweDQwMDAwMDIwLCAweDAwMDAwNDAwLCAweDQwMTAwNDIwLCAweDAwMTAwMDAwLAotCTB4MDAxMDA0MjAsIDB4NDAwMDAwMDAsIDB4NDAwMDA0MDAsIDB4NDAxMDA0MjAsCi0JMHg0MDEwMDAwMCwgMHgwMDEwMDQyMCwgMHgwMDEwMDQwMCwgMHg0MDAwMDQwMCwKLQotCTB4MDA4MDAwMDAsIDB4MDAwMDEwMDAsIDB4MDAwMDAwNDAsIDB4MDA4MDEwNDIsCi0JMHgwMDgwMTAwMiwgMHgwMDgwMDA0MCwgMHgwMDAwMTA0MiwgMHgwMDgwMTAwMCwKLQkweDAwMDAxMDAwLCAweDAwMDAwMDAyLCAweDAwODAwMDAyLCAweDAwMDAxMDQwLAotCTB4MDA4MDAwNDIsIDB4MDA4MDEwMDIsIDB4MDA4MDEwNDAsIDB4MDAwMDAwMDAsCi0JMHgwMDAwMTA0MCwgMHgwMDgwMDAwMCwgMHgwMDAwMTAwMiwgMHgwMDAwMDA0MiwKLQkweDAwODAwMDQwLCAweDAwMDAxMDQyLCAweDAwMDAwMDAwLCAweDAwODAwMDAyLAotCTB4MDAwMDAwMDIsIDB4MDA4MDAwNDIsIDB4MDA4MDEwNDIsIDB4MDAwMDEwMDIsCi0JMHgwMDgwMTAwMCwgMHgwMDAwMDA0MCwgMHgwMDAwMDA0MiwgMHgwMDgwMTA0MCwKLQkweDAwODAxMDQwLCAweDAwODAwMDQyLCAweDAwMDAxMDAyLCAweDAwODAxMDAwLAotCTB4MDAwMDEwMDAsIDB4MDAwMDAwMDIsIDB4MDA4MDAwMDIsIDB4MDA4MDAwNDAsCi0JMHgwMDgwMDAwMCwgMHgwMDAwMTA0MCwgMHgwMDgwMTA0MiwgMHgwMDAwMDAwMCwKLQkweDAwMDAxMDQyLCAweDAwODAwMDAwLCAweDAwMDAwMDQwLCAweDAwMDAxMDAyLAotCTB4MDA4MDAwNDIsIDB4MDAwMDAwNDAsIDB4MDAwMDAwMDAsIDB4MDA4MDEwNDIsCi0JMHgwMDgwMTAwMiwgMHgwMDgwMTA0MCwgMHgwMDAwMDA0MiwgMHgwMDAwMTAwMCwKLQkweDAwMDAxMDQwLCAweDAwODAxMDAyLCAweDAwODAwMDQwLCAweDAwMDAwMDQyLAotCTB4MDAwMDAwMDIsIDB4MDAwMDEwNDIsIDB4MDA4MDEwMDAsIDB4MDA4MDAwMDIsCi0KLQkweDEwNDAwMDAwLCAweDAwNDA0MDEwLCAweDAwMDAwMDEwLCAweDEwNDAwMDEwLAotCTB4MTAwMDQwMDAsIDB4MDA0MDAwMDAsIDB4MTA0MDAwMTAsIDB4MDAwMDQwMTAsCi0JMHgwMDQwMDAxMCwgMHgwMDAwNDAwMCwgMHgwMDQwNDAwMCwgMHgxMDAwMDAwMCwKLQkweDEwNDA0MDEwLCAweDEwMDAwMDEwLCAweDEwMDAwMDAwLCAweDEwNDA0MDAwLAotCTB4MDAwMDAwMDAsIDB4MTAwMDQwMDAsIDB4MDA0MDQwMTAsIDB4MDAwMDAwMTAsCi0JMHgxMDAwMDAxMCwgMHgxMDQwNDAxMCwgMHgwMDAwNDAwMCwgMHgxMDQwMDAwMCwKLQkweDEwNDA0MDAwLCAweDAwNDAwMDEwLCAweDEwMDA0MDEwLCAweDAwNDA0MDAwLAotCTB4MDAwMDQwMTAsIDB4MDAwMDAwMDAsIDB4MDA0MDAwMDAsIDB4MTAwMDQwMTAsCi0JMHgwMDQwNDAxMCwgMHgwMDAwMDAxMCwgMHgxMDAwMDAwMCwgMHgwMDAwNDAwMCwKLQkweDEwMDAwMDEwLCAweDEwMDA0MDAwLCAweDAwNDA0MDAwLCAweDEwNDAwMDEwLAotCTB4MDAwMDAwMDAsIDB4MDA0MDQwMTAsIDB4MDAwMDQwMTAsIDB4MTA0MDQwMDAsCi0JMHgxMDAwNDAwMCwgMHgwMDQwMDAwMCwgMHgxMDQwNDAxMCwgMHgxMDAwMDAwMCwKLQkweDEwMDA0MDEwLCAweDEwNDAwMDAwLCAweDAwNDAwMDAwLCAweDEwNDA0MDEwLAotCTB4MDAwMDQwMDAsIDB4MDA0MDAwMTAsIDB4MTA0MDAwMTAsIDB4MDAwMDQwMTAsCi0JMHgwMDQwMDAxMCwgMHgwMDAwMDAwMCwgMHgxMDQwNDAwMCwgMHgxMDAwMDAxMCwKLQkweDEwNDAwMDAwLCAweDEwMDA0MDEwLCAweDAwMDAwMDEwLCAweDAwNDA0MDAwLAotCi0JMHgwMDIwODA4MCwgMHgwMDAwODAwMCwgMHgyMDIwMDAwMCwgMHgyMDIwODA4MCwKLQkweDAwMjAwMDAwLCAweDIwMDA4MDgwLCAweDIwMDA4MDAwLCAweDIwMjAwMDAwLAotCTB4MjAwMDgwODAsIDB4MDAyMDgwODAsIDB4MDAyMDgwMDAsIDB4MjAwMDAwODAsCi0JMHgyMDIwMDA4MCwgMHgwMDIwMDAwMCwgMHgwMDAwMDAwMCwgMHgyMDAwODAwMCwKLQkweDAwMDA4MDAwLCAweDIwMDAwMDAwLCAweDAwMjAwMDgwLCAweDAwMDA4MDgwLAotCTB4MjAyMDgwODAsIDB4MDAyMDgwMDAsIDB4MjAwMDAwODAsIDB4MDAyMDAwODAsCi0JMHgyMDAwMDAwMCwgMHgwMDAwMDA4MCwgMHgwMDAwODA4MCwgMHgyMDIwODAwMCwKLQkweDAwMDAwMDgwLCAweDIwMjAwMDgwLCAweDIwMjA4MDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsIDB4MjAyMDgwODAsIDB4MDAyMDAwODAsIDB4MjAwMDgwMDAsCi0JMHgwMDIwODA4MCwgMHgwMDAwODAwMCwgMHgyMDAwMDA4MCwgMHgwMDIwMDA4MCwKLQkweDIwMjA4MDAwLCAweDAwMDAwMDgwLCAweDAwMDA4MDgwLCAweDIwMjAwMDAwLAotCTB4MjAwMDgwODAsIDB4MjAwMDAwMDAsIDB4MjAyMDAwMDAsIDB4MDAyMDgwMDAsCi0JMHgyMDIwODA4MCwgMHgwMDAwODA4MCwgMHgwMDIwODAwMCwgMHgyMDIwMDA4MCwKLQkweDAwMjAwMDAwLCAweDIwMDAwMDgwLCAweDIwMDA4MDAwLCAweDAwMDAwMDAwLAotCTB4MDAwMDgwMDAsIDB4MDAyMDAwMDAsIDB4MjAyMDAwODAsIDB4MDAyMDgwODAsCi0JMHgyMDAwMDAwMCwgMHgyMDIwODAwMCwgMHgwMDAwMDA4MCwgMHgyMDAwODA4MCwKK3N0YXRpYyBjb25zdCB1OCBwYzFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDQwLCAweDA0LCAweDEwLCAweDEwLCAweDUwLCAweDE0LAorCTB4MDQsIDB4NDAsIDB4NDQsIDB4NDQsIDB4MTQsIDB4NTAsIDB4NTQsIDB4NTQsCisJMHgwMiwgMHgwMiwgMHg0MiwgMHgwNiwgMHgxMiwgMHgxMiwgMHg1MiwgMHgxNiwKKwkweDA2LCAweDQyLCAweDQ2LCAweDQ2LCAweDE2LCAweDUyLCAweDU2LCAweDU2LAorCTB4ODAsIDB4MDgsIDB4YzAsIDB4MGMsIDB4OTAsIDB4MTgsIDB4ZDAsIDB4MWMsCisJMHg4NCwgMHg0OCwgMHhjNCwgMHg0YywgMHg5NCwgMHg1OCwgMHhkNCwgMHg1YywKKwkweDgyLCAweDBhLCAweGMyLCAweDBlLCAweDkyLCAweDFhLCAweGQyLCAweDFlLAorCTB4ODYsIDB4NGEsIDB4YzYsIDB4NGUsIDB4OTYsIDB4NWEsIDB4ZDYsIDB4NWUsCisJMHgyMCwgMHgyMCwgMHg2MCwgMHgyNCwgMHgzMCwgMHgzMCwgMHg3MCwgMHgzNCwKKwkweDI0LCAweDYwLCAweDY0LCAweDY0LCAweDM0LCAweDcwLCAweDc0LCAweDc0LAorCTB4MjIsIDB4MjIsIDB4NjIsIDB4MjYsIDB4MzIsIDB4MzIsIDB4NzIsIDB4MzYsCisJMHgyNiwgMHg2MiwgMHg2NiwgMHg2NiwgMHgzNiwgMHg3MiwgMHg3NiwgMHg3NiwKKwkweGEwLCAweDI4LCAweGUwLCAweDJjLCAweGIwLCAweDM4LCAweGYwLCAweDNjLAorCTB4YTQsIDB4NjgsIDB4ZTQsIDB4NmMsIDB4YjQsIDB4NzgsIDB4ZjQsIDB4N2MsCisJMHhhMiwgMHgyYSwgMHhlMiwgMHgyZSwgMHhiMiwgMHgzYSwgMHhmMiwgMHgzZSwKKwkweGE2LCAweDZhLCAweGU2LCAweDZlLCAweGI2LCAweDdhLCAweGY2LCAweDdlLAorCTB4MDgsIDB4ODAsIDB4NDgsIDB4ODQsIDB4MTgsIDB4OTAsIDB4NTgsIDB4OTQsCisJMHgwYywgMHhjMCwgMHg0YywgMHhjNCwgMHgxYywgMHhkMCwgMHg1YywgMHhkNCwKKwkweDBhLCAweDgyLCAweDRhLCAweDg2LCAweDFhLCAweDkyLCAweDVhLCAweDk2LAorCTB4MGUsIDB4YzIsIDB4NGUsIDB4YzYsIDB4MWUsIDB4ZDIsIDB4NWUsIDB4ZDYsCisJMHg4OCwgMHg4OCwgMHhjOCwgMHg4YywgMHg5OCwgMHg5OCwgMHhkOCwgMHg5YywKKwkweDhjLCAweGM4LCAweGNjLCAweGNjLCAweDljLCAweGQ4LCAweGRjLCAweGRjLAorCTB4OGEsIDB4OGEsIDB4Y2EsIDB4OGUsIDB4OWEsIDB4OWEsIDB4ZGEsIDB4OWUsCisJMHg4ZSwgMHhjYSwgMHhjZSwgMHhjZSwgMHg5ZSwgMHhkYSwgMHhkZSwgMHhkZSwKKwkweDI4LCAweGEwLCAweDY4LCAweGE0LCAweDM4LCAweGIwLCAweDc4LCAweGI0LAorCTB4MmMsIDB4ZTAsIDB4NmMsIDB4ZTQsIDB4M2MsIDB4ZjAsIDB4N2MsIDB4ZjQsCisJMHgyYSwgMHhhMiwgMHg2YSwgMHhhNiwgMHgzYSwgMHhiMiwgMHg3YSwgMHhiNiwKKwkweDJlLCAweGUyLCAweDZlLCAweGU2LCAweDNlLCAweGYyLCAweDdlLCAweGY2LAorCTB4YTgsIDB4YTgsIDB4ZTgsIDB4YWMsIDB4YjgsIDB4YjgsIDB4ZjgsIDB4YmMsCisJMHhhYywgMHhlOCwgMHhlYywgMHhlYywgMHhiYywgMHhmOCwgMHhmYywgMHhmYywKKwkweGFhLCAweGFhLCAweGVhLCAweGFlLCAweGJhLCAweGJhLCAweGZhLCAweGJlLAorCTB4YWUsIDB4ZWEsIDB4ZWUsIDB4ZWUsIDB4YmUsIDB4ZmEsIDB4ZmUsIDB4ZmUKIH07CiAKLXN0YXRpYyBjb25zdCB1OCByb3RvcnNbXSA9IHsKLQkzNCwgMTMsICA1LCA0NiwgNDcsIDE4LCAzMiwgNDEsIDExLCA1MywgMzMsIDIwLAotCTE0LCAzNiwgMzAsIDI0LCA0OSwgIDIsIDE1LCAzNywgNDIsIDUwLCAgMCwgMjEsCi0JMzgsIDQ4LCAgNiwgMjYsIDM5LCAgNCwgNTIsIDI1LCAxMiwgMjcsIDMxLCA0MCwKLQkxLCAxNywgMjgsIDI5LCAyMywgNTEsIDM1LCAgNywgIDMsIDIyLCAgOSwgNDMsCi0KLQk0MSwgMjAsIDEyLCA1MywgNTQsIDI1LCAzOSwgNDgsIDE4LCAzMSwgNDAsIDI3LAotCTIxLCA0MywgMzcsICAwLCAgMSwgIDksIDIyLCA0NCwgNDksICAyLCAgNywgMjgsCi0JNDUsIDU1LCAxMywgMzMsIDQ2LCAxMSwgIDYsIDMyLCAxOSwgMzQsIDM4LCA0NywKLQk4LCAyNCwgMzUsIDM2LCAzMCwgIDMsIDQyLCAxNCwgMTAsIDI5LCAxNiwgNTAsCi0KLQk1NSwgMzQsIDI2LCAzOCwgMTEsIDM5LCA1MywgIDUsIDMyLCA0NSwgNTQsIDQxLAotCTM1LCAgMiwgNTEsIDE0LCAxNSwgMjMsIDM2LCAgMywgIDgsIDE2LCAyMSwgNDIsCi0JNiwgMTIsIDI3LCA0NywgMzEsIDI1LCAyMCwgNDYsIDMzLCA0OCwgNTIsICA0LAotCTIyLCAgNywgNDksIDUwLCA0NCwgMTcsICAxLCAyOCwgMjQsIDQzLCAzMCwgIDksCi0KLQkxMiwgNDgsIDQwLCA1MiwgMjUsIDUzLCAzOCwgMTksIDQ2LCAgNiwgMTEsIDU1LAotCTQ5LCAxNiwgMTAsIDI4LCAyOSwgMzcsIDUwLCAxNywgMjIsIDMwLCAzNSwgIDEsCi0JMjAsIDI2LCA0MSwgIDQsIDQ1LCAzOSwgMzQsIDMxLCA0NywgIDUsIDEzLCAxOCwKLQkzNiwgMjEsICA4LCAgOSwgIDMsICAwLCAxNSwgNDIsICA3LCAgMiwgNDQsIDIzLAotCi0JMjYsICA1LCA1NCwgMTMsIDM5LCAzOCwgNTIsIDMzLCAzMSwgMjAsIDI1LCAxMiwKLQk4LCAzMCwgMjQsIDQyLCA0MywgNTEsICA5LCAgMCwgMzYsIDQ0LCA0OSwgMTUsCi0JMzQsIDQwLCA1NSwgMTgsICA2LCA1MywgNDgsIDQ1LCAgNCwgMTksIDI3LCAzMiwKLQk1MCwgMzUsIDIyLCAyMywgMTcsIDE0LCAyOSwgIDEsIDIxLCAxNiwgIDMsIDM3LAotCi0JNDAsIDE5LCAxMSwgMjcsIDUzLCA1MiwgMTMsIDQ3LCA0NSwgMzQsIDM5LCAyNiwKLQkyMiwgNDQsICA3LCAgMSwgIDIsIDEwLCAyMywgMTQsIDUwLCAgMywgIDgsIDI5LAotCTQ4LCA1NCwgMTIsIDMyLCAyMCwgMzgsICA1LCAgNiwgMTgsIDMzLCA0MSwgNDYsCi0JOSwgNDksIDM2LCAzNywgIDAsIDI4LCA0MywgMTUsIDM1LCAzMCwgMTcsIDUxLAotCi0JNTQsIDMzLCAyNSwgNDEsIDM4LCAxMywgMjcsICA0LCAgNiwgNDgsIDUzLCA0MCwKLQkzNiwgIDMsIDIxLCAxNSwgMTYsIDI0LCAzNywgMjgsICA5LCAxNywgMjIsIDQzLAotCTUsIDExLCAyNiwgNDYsIDM0LCA1MiwgMTksIDIwLCAzMiwgNDcsIDU1LCAzMSwKLQkyMywgIDgsIDUwLCA1MSwgMTQsIDQyLCAgMiwgMjksIDQ5LCA0NCwgIDAsIDEwLAotCi0JMTEsIDQ3LCAzOSwgNTUsIDUyLCAyNywgNDEsIDE4LCAyMCwgIDUsIDM4LCA1NCwKLQk1MCwgMTcsIDM1LCAyOSwgMzAsICA3LCA1MSwgNDIsIDIzLCAgMCwgMzYsICAyLAotCTE5LCAyNSwgNDAsIDMxLCA0OCwgMTMsIDMzLCAzNCwgNDYsICA0LCAxMiwgNDUsCi0JMzcsIDIyLCAgOSwgMTAsIDI4LCAgMSwgMTYsIDQzLCAgOCwgIDMsIDE0LCAyNCwKLQotCTE4LCA1NCwgNDYsICA1LCAgNiwgMzQsIDQ4LCAyNSwgMjcsIDEyLCA0NSwgIDQsCi0JMiwgMjQsIDQyLCAzNiwgMzcsIDE0LCAgMywgNDksIDMwLCAgNywgNDMsICA5LAotCTI2LCAzMiwgNDcsIDM4LCA1NSwgMjAsIDQwLCA0MSwgNTMsIDExLCAxOSwgNTIsCi0JNDQsIDI5LCAxNiwgMTcsIDM1LCAgOCwgMjMsIDUwLCAxNSwgMTAsIDIxLCAgMCwKLQotCTMyLCAxMSwgMzEsIDE5LCAyMCwgNDgsICA1LCAzOSwgNDEsIDI2LCAgNiwgMTgsCi0JMTYsICA3LCAgMSwgNTAsIDUxLCAyOCwgMTcsICA4LCA0NCwgMjEsICAyLCAyMywKLQk0MCwgNDYsICA0LCA1MiwgMTIsIDM0LCA1NCwgNTUsIDM4LCAyNSwgMzMsIDEzLAotCTMsIDQzLCAzMCwgIDAsIDQ5LCAyMiwgMzcsICA5LCAyOSwgMjQsIDM1LCAxNCwKLQotCTQ2LCAyNSwgNDUsIDMzLCAzNCwgIDUsIDE5LCA1MywgNTUsIDQwLCAyMCwgMzIsCi0JMzAsIDIxLCAxNSwgIDksIDEwLCA0MiwgIDAsIDIyLCAgMywgMzUsIDE2LCAzNywKLQk1NCwgMzEsIDE4LCAxMywgMjYsIDQ4LCAxMSwgMTIsIDUyLCAzOSwgNDcsIDI3LAotCTE3LCAgMiwgNDQsIDE0LCAgOCwgMzYsIDUxLCAyMywgNDMsICA3LCA0OSwgMjgsCi0KLQkzMSwgMzksICA2LCA0NywgNDgsIDE5LCAzMywgMzgsIDEyLCA1NCwgMzQsIDQ2LAotCTQ0LCAzNSwgMjksIDIzLCAyNCwgIDEsIDE0LCAzNiwgMTcsIDQ5LCAzMCwgNTEsCi0JMTEsIDQ1LCAzMiwgMjcsIDQwLCAgNSwgMjUsIDI2LCAxMywgNTMsICA0LCA0MSwKLQkwLCAxNiwgIDMsIDI4LCAyMiwgNTAsIDEwLCAzNywgIDIsIDIxLCAgOCwgNDIsCi0KLQk0NSwgNTMsIDIwLCAgNCwgIDUsIDMzLCA0NywgNTIsIDI2LCAxMSwgNDgsIDMxLAotCTMsIDQ5LCA0MywgMzcsICA3LCAxNSwgMjgsIDUwLCAgMCwgIDgsIDQ0LCAxMCwKLQkyNSwgIDYsIDQ2LCA0MSwgNTQsIDE5LCAzOSwgNDAsIDI3LCAzOCwgMTgsIDU1LAotCTE0LCAzMCwgMTcsIDQyLCAzNiwgIDksIDI0LCA1MSwgMTYsIDM1LCAyMiwgIDEsCi0KLQk2LCAzOCwgMzQsIDE4LCAxOSwgNDcsICA0LCAxMywgNDAsIDI1LCAgNSwgNDUsCi0JMTcsICA4LCAgMiwgNTEsIDIxLCAyOSwgNDIsICA5LCAxNCwgMjIsICAzLCAyNCwKLQkzOSwgMjAsIDMxLCA1NSwgMTEsIDMzLCA1MywgNTQsIDQxLCA1MiwgMzIsIDEyLAotCTI4LCA0NCwgIDAsICAxLCA1MCwgMjMsICA3LCAxMCwgMzAsIDQ5LCAzNiwgMTUsCi0KLQkyMCwgNTIsIDQ4LCAzMiwgMzMsICA0LCAxOCwgMjcsIDU0LCAzOSwgMTksICA2LAotCTAsIDIyLCAxNiwgMTAsIDM1LCA0MywgIDEsIDIzLCAyOCwgMzYsIDE3LCAgNywKLQk1MywgMzQsIDQ1LCAxMiwgMjUsIDQ3LCAzOCwgMTEsIDU1LCAxMywgNDYsIDI2LAotCTQyLCAgMywgMTQsIDE1LCAgOSwgMzcsIDIxLCAyNCwgNDQsICA4LCA1MCwgMjksCi0KLQkyNywgIDYsIDU1LCAzOSwgNDAsIDExLCAyNSwgMzQsICA0LCA0NiwgMjYsIDEzLAotCTcsIDI5LCAyMywgMTcsIDQyLCA1MCwgIDgsIDMwLCAzNSwgNDMsIDI0LCAxNCwKLQkzMSwgNDEsIDUyLCAxOSwgMzIsIDU0LCA0NSwgMTgsICA1LCAyMCwgNTMsIDMzLAotCTQ5LCAxMCwgMjEsIDIyLCAxNiwgNDQsIDI4LCAgMCwgNTEsIDE1LCAgMiwgMzYsCitzdGF0aWMgY29uc3QgdTggcnNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAyLCAweDAyLCAweDgyLCAweDgyLAorCTB4MDQsIDB4MDQsIDB4ODQsIDB4ODQsIDB4MDYsIDB4MDYsIDB4ODYsIDB4ODYsCisJMHgwOCwgMHgwOCwgMHg4OCwgMHg4OCwgMHgwYSwgMHgwYSwgMHg4YSwgMHg4YSwKKwkweDBjLCAweDBjLCAweDhjLCAweDhjLCAweDBlLCAweDBlLCAweDhlLCAweDhlLAorCTB4MTAsIDB4MTAsIDB4OTAsIDB4OTAsIDB4MTIsIDB4MTIsIDB4OTIsIDB4OTIsCisJMHgxNCwgMHgxNCwgMHg5NCwgMHg5NCwgMHgxNiwgMHgxNiwgMHg5NiwgMHg5NiwKKwkweDE4LCAweDE4LCAweDk4LCAweDk4LCAweDFhLCAweDFhLCAweDlhLCAweDlhLAorCTB4MWMsIDB4MWMsIDB4OWMsIDB4OWMsIDB4MWUsIDB4MWUsIDB4OWUsIDB4OWUsCisJMHgyMCwgMHgyMCwgMHhhMCwgMHhhMCwgMHgyMiwgMHgyMiwgMHhhMiwgMHhhMiwKKwkweDI0LCAweDI0LCAweGE0LCAweGE0LCAweDI2LCAweDI2LCAweGE2LCAweGE2LAorCTB4MjgsIDB4MjgsIDB4YTgsIDB4YTgsIDB4MmEsIDB4MmEsIDB4YWEsIDB4YWEsCisJMHgyYywgMHgyYywgMHhhYywgMHhhYywgMHgyZSwgMHgyZSwgMHhhZSwgMHhhZSwKKwkweDMwLCAweDMwLCAweGIwLCAweGIwLCAweDMyLCAweDMyLCAweGIyLCAweGIyLAorCTB4MzQsIDB4MzQsIDB4YjQsIDB4YjQsIDB4MzYsIDB4MzYsIDB4YjYsIDB4YjYsCisJMHgzOCwgMHgzOCwgMHhiOCwgMHhiOCwgMHgzYSwgMHgzYSwgMHhiYSwgMHhiYSwKKwkweDNjLCAweDNjLCAweGJjLCAweGJjLCAweDNlLCAweDNlLCAweGJlLCAweGJlLAorCTB4NDAsIDB4NDAsIDB4YzAsIDB4YzAsIDB4NDIsIDB4NDIsIDB4YzIsIDB4YzIsCisJMHg0NCwgMHg0NCwgMHhjNCwgMHhjNCwgMHg0NiwgMHg0NiwgMHhjNiwgMHhjNiwKKwkweDQ4LCAweDQ4LCAweGM4LCAweGM4LCAweDRhLCAweDRhLCAweGNhLCAweGNhLAorCTB4NGMsIDB4NGMsIDB4Y2MsIDB4Y2MsIDB4NGUsIDB4NGUsIDB4Y2UsIDB4Y2UsCisJMHg1MCwgMHg1MCwgMHhkMCwgMHhkMCwgMHg1MiwgMHg1MiwgMHhkMiwgMHhkMiwKKwkweDU0LCAweDU0LCAweGQ0LCAweGQ0LCAweDU2LCAweDU2LCAweGQ2LCAweGQ2LAorCTB4NTgsIDB4NTgsIDB4ZDgsIDB4ZDgsIDB4NWEsIDB4NWEsIDB4ZGEsIDB4ZGEsCisJMHg1YywgMHg1YywgMHhkYywgMHhkYywgMHg1ZSwgMHg1ZSwgMHhkZSwgMHhkZSwKKwkweDYwLCAweDYwLCAweGUwLCAweGUwLCAweDYyLCAweDYyLCAweGUyLCAweGUyLAorCTB4NjQsIDB4NjQsIDB4ZTQsIDB4ZTQsIDB4NjYsIDB4NjYsIDB4ZTYsIDB4ZTYsCisJMHg2OCwgMHg2OCwgMHhlOCwgMHhlOCwgMHg2YSwgMHg2YSwgMHhlYSwgMHhlYSwKKwkweDZjLCAweDZjLCAweGVjLCAweGVjLCAweDZlLCAweDZlLCAweGVlLCAweGVlLAorCTB4NzAsIDB4NzAsIDB4ZjAsIDB4ZjAsIDB4NzIsIDB4NzIsIDB4ZjIsIDB4ZjIsCisJMHg3NCwgMHg3NCwgMHhmNCwgMHhmNCwgMHg3NiwgMHg3NiwgMHhmNiwgMHhmNiwKKwkweDc4LCAweDc4LCAweGY4LCAweGY4LCAweDdhLCAweDdhLCAweGZhLCAweGZhLAorCTB4N2MsIDB4N2MsIDB4ZmMsIDB4ZmMsIDB4N2UsIDB4N2UsIDB4ZmUsIDB4ZmUKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBwYXJpdHlbXSA9IHsKLQk4LDEsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMiw4LDAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDMsCi0JMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LAotCTAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDAsOCwwLDAsOCwwLDgsOCwwLDAsOCw4LDAsOCwwLDAsOCwKLQk4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDAsCi0JMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LAotCTgsMCwwLDgsMCw4LDgsMCwwLDgsOCwwLDgsMCwwLDgsMCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCwKLQk4LDAsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsMCw4LDAsOCw4LDAsOCwwLDAsOCw4LDAsMCw4LDAsOCw4LDAsCi0JNCw4LDgsMCw4LDAsMCw4LDgsMCwwLDgsMCw4LDgsMCw4LDUsMCw4LDAsOCw4LDAsMCw4LDgsMCw4LDAsNiw4LAorc3RhdGljIGNvbnN0IHUzMiBwYzJbMTAyNF0gPSB7CisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDQwMDAwLCAweDAwMDAwMDAwLCAweDA0MDAwMDAwLCAweDAwMTAwMDAwLAorCTB4MDA0MDAwMDAsIDB4MDAwMDAwMDgsIDB4MDAwMDA4MDAsIDB4NDAwMDAwMDAsCisJMHgwMDQ0MDAwMCwgMHgwMDAwMDAwOCwgMHgwNDAwMDgwMCwgMHg0MDEwMDAwMCwKKwkweDAwMDAwNDAwLCAweDAwMDAwMDIwLCAweDA4MDAwMDAwLCAweDAwMDAwMTAwLAorCTB4MDAwNDA0MDAsIDB4MDAwMDAwMjAsIDB4MGMwMDAwMDAsIDB4MDAxMDAxMDAsCisJMHgwMDQwMDQwMCwgMHgwMDAwMDAyOCwgMHgwODAwMDgwMCwgMHg0MDAwMDEwMCwKKwkweDAwNDQwNDAwLCAweDAwMDAwMDI4LCAweDBjMDAwODAwLCAweDQwMTAwMTAwLAorCTB4ODAwMDAwMDAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsIDB4MDA4MDAwMDAsCisJMHg4MDA0MDAwMCwgMHgwMDAwMDAxMCwgMHgwNDAwMDAwMCwgMHgwMDkwMDAwMCwKKwkweDgwNDAwMDAwLCAweDAwMDAwMDE4LCAweDAwMDAwODAwLCAweDQwODAwMDAwLAorCTB4ODA0NDAwMDAsIDB4MDAwMDAwMTgsIDB4MDQwMDA4MDAsIDB4NDA5MDAwMDAsCisJMHg4MDAwMDQwMCwgMHgwMDAwMDAzMCwgMHgwODAwMDAwMCwgMHgwMDgwMDEwMCwKKwkweDgwMDQwNDAwLCAweDAwMDAwMDMwLCAweDBjMDAwMDAwLCAweDAwOTAwMTAwLAorCTB4ODA0MDA0MDAsIDB4MDAwMDAwMzgsIDB4MDgwMDA4MDAsIDB4NDA4MDAxMDAsCisJMHg4MDQ0MDQwMCwgMHgwMDAwMDAzOCwgMHgwYzAwMDgwMCwgMHg0MDkwMDEwMCwKKwkweDEwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMjAwMDAwLCAweDAwMDAxMDAwLAorCTB4MTAwNDAwMDAsIDB4MDAwMDAwMDAsIDB4MDQyMDAwMDAsIDB4MDAxMDEwMDAsCisJMHgxMDQwMDAwMCwgMHgwMDAwMDAwOCwgMHgwMDIwMDgwMCwgMHg0MDAwMTAwMCwKKwkweDEwNDQwMDAwLCAweDAwMDAwMDA4LCAweDA0MjAwODAwLCAweDQwMTAxMDAwLAorCTB4MTAwMDA0MDAsIDB4MDAwMDAwMjAsIDB4MDgyMDAwMDAsIDB4MDAwMDExMDAsCisJMHgxMDA0MDQwMCwgMHgwMDAwMDAyMCwgMHgwYzIwMDAwMCwgMHgwMDEwMTEwMCwKKwkweDEwNDAwNDAwLCAweDAwMDAwMDI4LCAweDA4MjAwODAwLCAweDQwMDAxMTAwLAorCTB4MTA0NDA0MDAsIDB4MDAwMDAwMjgsIDB4MGMyMDA4MDAsIDB4NDAxMDExMDAsCisJMHg5MDAwMDAwMCwgMHgwMDAwMDAxMCwgMHgwMDIwMDAwMCwgMHgwMDgwMTAwMCwKKwkweDkwMDQwMDAwLCAweDAwMDAwMDEwLCAweDA0MjAwMDAwLCAweDAwOTAxMDAwLAorCTB4OTA0MDAwMDAsIDB4MDAwMDAwMTgsIDB4MDAyMDA4MDAsIDB4NDA4MDEwMDAsCisJMHg5MDQ0MDAwMCwgMHgwMDAwMDAxOCwgMHgwNDIwMDgwMCwgMHg0MDkwMTAwMCwKKwkweDkwMDAwNDAwLCAweDAwMDAwMDMwLCAweDA4MjAwMDAwLCAweDAwODAxMTAwLAorCTB4OTAwNDA0MDAsIDB4MDAwMDAwMzAsIDB4MGMyMDAwMDAsIDB4MDA5MDExMDAsCisJMHg5MDQwMDQwMCwgMHgwMDAwMDAzOCwgMHgwODIwMDgwMCwgMHg0MDgwMTEwMCwKKwkweDkwNDQwNDAwLCAweDAwMDAwMDM4LCAweDBjMjAwODAwLCAweDQwOTAxMTAwLAorCTB4MDAwMDAyMDAsIDB4MDAwODAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDQsCisJMHgwMDA0MDIwMCwgMHgwMDA4MDAwMCwgMHgwNDAwMDAwMCwgMHgwMDEwMDAwNCwKKwkweDAwNDAwMjAwLCAweDAwMDgwMDA4LCAweDAwMDAwODAwLCAweDQwMDAwMDA0LAorCTB4MDA0NDAyMDAsIDB4MDAwODAwMDgsIDB4MDQwMDA4MDAsIDB4NDAxMDAwMDQsCisJMHgwMDAwMDYwMCwgMHgwMDA4MDAyMCwgMHgwODAwMDAwMCwgMHgwMDAwMDEwNCwKKwkweDAwMDQwNjAwLCAweDAwMDgwMDIwLCAweDBjMDAwMDAwLCAweDAwMTAwMTA0LAorCTB4MDA0MDA2MDAsIDB4MDAwODAwMjgsIDB4MDgwMDA4MDAsIDB4NDAwMDAxMDQsCisJMHgwMDQ0MDYwMCwgMHgwMDA4MDAyOCwgMHgwYzAwMDgwMCwgMHg0MDEwMDEwNCwKKwkweDgwMDAwMjAwLCAweDAwMDgwMDEwLCAweDAwMDAwMDAwLCAweDAwODAwMDA0LAorCTB4ODAwNDAyMDAsIDB4MDAwODAwMTAsIDB4MDQwMDAwMDAsIDB4MDA5MDAwMDQsCisJMHg4MDQwMDIwMCwgMHgwMDA4MDAxOCwgMHgwMDAwMDgwMCwgMHg0MDgwMDAwNCwKKwkweDgwNDQwMjAwLCAweDAwMDgwMDE4LCAweDA0MDAwODAwLCAweDQwOTAwMDA0LAorCTB4ODAwMDA2MDAsIDB4MDAwODAwMzAsIDB4MDgwMDAwMDAsIDB4MDA4MDAxMDQsCisJMHg4MDA0MDYwMCwgMHgwMDA4MDAzMCwgMHgwYzAwMDAwMCwgMHgwMDkwMDEwNCwKKwkweDgwNDAwNjAwLCAweDAwMDgwMDM4LCAweDA4MDAwODAwLCAweDQwODAwMTA0LAorCTB4ODA0NDA2MDAsIDB4MDAwODAwMzgsIDB4MGMwMDA4MDAsIDB4NDA5MDAxMDQsCisJMHgxMDAwMDIwMCwgMHgwMDA4MDAwMCwgMHgwMDIwMDAwMCwgMHgwMDAwMTAwNCwKKwkweDEwMDQwMjAwLCAweDAwMDgwMDAwLCAweDA0MjAwMDAwLCAweDAwMTAxMDA0LAorCTB4MTA0MDAyMDAsIDB4MDAwODAwMDgsIDB4MDAyMDA4MDAsIDB4NDAwMDEwMDQsCisJMHgxMDQ0MDIwMCwgMHgwMDA4MDAwOCwgMHgwNDIwMDgwMCwgMHg0MDEwMTAwNCwKKwkweDEwMDAwNjAwLCAweDAwMDgwMDIwLCAweDA4MjAwMDAwLCAweDAwMDAxMTA0LAorCTB4MTAwNDA2MDAsIDB4MDAwODAwMjAsIDB4MGMyMDAwMDAsIDB4MDAxMDExMDQsCisJMHgxMDQwMDYwMCwgMHgwMDA4MDAyOCwgMHgwODIwMDgwMCwgMHg0MDAwMTEwNCwKKwkweDEwNDQwNjAwLCAweDAwMDgwMDI4LCAweDBjMjAwODAwLCAweDQwMTAxMTA0LAorCTB4OTAwMDAyMDAsIDB4MDAwODAwMTAsIDB4MDAyMDAwMDAsIDB4MDA4MDEwMDQsCisJMHg5MDA0MDIwMCwgMHgwMDA4MDAxMCwgMHgwNDIwMDAwMCwgMHgwMDkwMTAwNCwKKwkweDkwNDAwMjAwLCAweDAwMDgwMDE4LCAweDAwMjAwODAwLCAweDQwODAxMDA0LAorCTB4OTA0NDAyMDAsIDB4MDAwODAwMTgsIDB4MDQyMDA4MDAsIDB4NDA5MDEwMDQsCisJMHg5MDAwMDYwMCwgMHgwMDA4MDAzMCwgMHgwODIwMDAwMCwgMHgwMDgwMTEwNCwKKwkweDkwMDQwNjAwLCAweDAwMDgwMDMwLCAweDBjMjAwMDAwLCAweDAwOTAxMTA0LAorCTB4OTA0MDA2MDAsIDB4MDAwODAwMzgsIDB4MDgyMDA4MDAsIDB4NDA4MDExMDQsCisJMHg5MDQ0MDYwMCwgMHgwMDA4MDAzOCwgMHgwYzIwMDgwMCwgMHg0MDkwMTEwNCwKKwkweDAwMDAwMDAyLCAweDAwMDAyMDAwLCAweDIwMDAwMDAwLCAweDAwMDAwMDAxLAorCTB4MDAwNDAwMDIsIDB4MDAwMDIwMDAsIDB4MjQwMDAwMDAsIDB4MDAxMDAwMDEsCisJMHgwMDQwMDAwMiwgMHgwMDAwMjAwOCwgMHgyMDAwMDgwMCwgMHg0MDAwMDAwMSwKKwkweDAwNDQwMDAyLCAweDAwMDAyMDA4LCAweDI0MDAwODAwLCAweDQwMTAwMDAxLAorCTB4MDAwMDA0MDIsIDB4MDAwMDIwMjAsIDB4MjgwMDAwMDAsIDB4MDAwMDAxMDEsCisJMHgwMDA0MDQwMiwgMHgwMDAwMjAyMCwgMHgyYzAwMDAwMCwgMHgwMDEwMDEwMSwKKwkweDAwNDAwNDAyLCAweDAwMDAyMDI4LCAweDI4MDAwODAwLCAweDQwMDAwMTAxLAorCTB4MDA0NDA0MDIsIDB4MDAwMDIwMjgsIDB4MmMwMDA4MDAsIDB4NDAxMDAxMDEsCisJMHg4MDAwMDAwMiwgMHgwMDAwMjAxMCwgMHgyMDAwMDAwMCwgMHgwMDgwMDAwMSwKKwkweDgwMDQwMDAyLCAweDAwMDAyMDEwLCAweDI0MDAwMDAwLCAweDAwOTAwMDAxLAorCTB4ODA0MDAwMDIsIDB4MDAwMDIwMTgsIDB4MjAwMDA4MDAsIDB4NDA4MDAwMDEsCisJMHg4MDQ0MDAwMiwgMHgwMDAwMjAxOCwgMHgyNDAwMDgwMCwgMHg0MDkwMDAwMSwKKwkweDgwMDAwNDAyLCAweDAwMDAyMDMwLCAweDI4MDAwMDAwLCAweDAwODAwMTAxLAorCTB4ODAwNDA0MDIsIDB4MDAwMDIwMzAsIDB4MmMwMDAwMDAsIDB4MDA5MDAxMDEsCisJMHg4MDQwMDQwMiwgMHgwMDAwMjAzOCwgMHgyODAwMDgwMCwgMHg0MDgwMDEwMSwKKwkweDgwNDQwNDAyLCAweDAwMDAyMDM4LCAweDJjMDAwODAwLCAweDQwOTAwMTAxLAorCTB4MTAwMDAwMDIsIDB4MDAwMDIwMDAsIDB4MjAyMDAwMDAsIDB4MDAwMDEwMDEsCisJMHgxMDA0MDAwMiwgMHgwMDAwMjAwMCwgMHgyNDIwMDAwMCwgMHgwMDEwMTAwMSwKKwkweDEwNDAwMDAyLCAweDAwMDAyMDA4LCAweDIwMjAwODAwLCAweDQwMDAxMDAxLAorCTB4MTA0NDAwMDIsIDB4MDAwMDIwMDgsIDB4MjQyMDA4MDAsIDB4NDAxMDEwMDEsCisJMHgxMDAwMDQwMiwgMHgwMDAwMjAyMCwgMHgyODIwMDAwMCwgMHgwMDAwMTEwMSwKKwkweDEwMDQwNDAyLCAweDAwMDAyMDIwLCAweDJjMjAwMDAwLCAweDAwMTAxMTAxLAorCTB4MTA0MDA0MDIsIDB4MDAwMDIwMjgsIDB4MjgyMDA4MDAsIDB4NDAwMDExMDEsCisJMHgxMDQ0MDQwMiwgMHgwMDAwMjAyOCwgMHgyYzIwMDgwMCwgMHg0MDEwMTEwMSwKKwkweDkwMDAwMDAyLCAweDAwMDAyMDEwLCAweDIwMjAwMDAwLCAweDAwODAxMDAxLAorCTB4OTAwNDAwMDIsIDB4MDAwMDIwMTAsIDB4MjQyMDAwMDAsIDB4MDA5MDEwMDEsCisJMHg5MDQwMDAwMiwgMHgwMDAwMjAxOCwgMHgyMDIwMDgwMCwgMHg0MDgwMTAwMSwKKwkweDkwNDQwMDAyLCAweDAwMDAyMDE4LCAweDI0MjAwODAwLCAweDQwOTAxMDAxLAorCTB4OTAwMDA0MDIsIDB4MDAwMDIwMzAsIDB4MjgyMDAwMDAsIDB4MDA4MDExMDEsCisJMHg5MDA0MDQwMiwgMHgwMDAwMjAzMCwgMHgyYzIwMDAwMCwgMHgwMDkwMTEwMSwKKwkweDkwNDAwNDAyLCAweDAwMDAyMDM4LCAweDI4MjAwODAwLCAweDQwODAxMTAxLAorCTB4OTA0NDA0MDIsIDB4MDAwMDIwMzgsIDB4MmMyMDA4MDAsIDB4NDA5MDExMDEsCisJMHgwMDAwMDIwMiwgMHgwMDA4MjAwMCwgMHgyMDAwMDAwMCwgMHgwMDAwMDAwNSwKKwkweDAwMDQwMjAyLCAweDAwMDgyMDAwLCAweDI0MDAwMDAwLCAweDAwMTAwMDA1LAorCTB4MDA0MDAyMDIsIDB4MDAwODIwMDgsIDB4MjAwMDA4MDAsIDB4NDAwMDAwMDUsCisJMHgwMDQ0MDIwMiwgMHgwMDA4MjAwOCwgMHgyNDAwMDgwMCwgMHg0MDEwMDAwNSwKKwkweDAwMDAwNjAyLCAweDAwMDgyMDIwLCAweDI4MDAwMDAwLCAweDAwMDAwMTA1LAorCTB4MDAwNDA2MDIsIDB4MDAwODIwMjAsIDB4MmMwMDAwMDAsIDB4MDAxMDAxMDUsCisJMHgwMDQwMDYwMiwgMHgwMDA4MjAyOCwgMHgyODAwMDgwMCwgMHg0MDAwMDEwNSwKKwkweDAwNDQwNjAyLCAweDAwMDgyMDI4LCAweDJjMDAwODAwLCAweDQwMTAwMTA1LAorCTB4ODAwMDAyMDIsIDB4MDAwODIwMTAsIDB4MjAwMDAwMDAsIDB4MDA4MDAwMDUsCisJMHg4MDA0MDIwMiwgMHgwMDA4MjAxMCwgMHgyNDAwMDAwMCwgMHgwMDkwMDAwNSwKKwkweDgwNDAwMjAyLCAweDAwMDgyMDE4LCAweDIwMDAwODAwLCAweDQwODAwMDA1LAorCTB4ODA0NDAyMDIsIDB4MDAwODIwMTgsIDB4MjQwMDA4MDAsIDB4NDA5MDAwMDUsCisJMHg4MDAwMDYwMiwgMHgwMDA4MjAzMCwgMHgyODAwMDAwMCwgMHgwMDgwMDEwNSwKKwkweDgwMDQwNjAyLCAweDAwMDgyMDMwLCAweDJjMDAwMDAwLCAweDAwOTAwMTA1LAorCTB4ODA0MDA2MDIsIDB4MDAwODIwMzgsIDB4MjgwMDA4MDAsIDB4NDA4MDAxMDUsCisJMHg4MDQ0MDYwMiwgMHgwMDA4MjAzOCwgMHgyYzAwMDgwMCwgMHg0MDkwMDEwNSwKKwkweDEwMDAwMjAyLCAweDAwMDgyMDAwLCAweDIwMjAwMDAwLCAweDAwMDAxMDA1LAorCTB4MTAwNDAyMDIsIDB4MDAwODIwMDAsIDB4MjQyMDAwMDAsIDB4MDAxMDEwMDUsCisJMHgxMDQwMDIwMiwgMHgwMDA4MjAwOCwgMHgyMDIwMDgwMCwgMHg0MDAwMTAwNSwKKwkweDEwNDQwMjAyLCAweDAwMDgyMDA4LCAweDI0MjAwODAwLCAweDQwMTAxMDA1LAorCTB4MTAwMDA2MDIsIDB4MDAwODIwMjAsIDB4MjgyMDAwMDAsIDB4MDAwMDExMDUsCisJMHgxMDA0MDYwMiwgMHgwMDA4MjAyMCwgMHgyYzIwMDAwMCwgMHgwMDEwMTEwNSwKKwkweDEwNDAwNjAyLCAweDAwMDgyMDI4LCAweDI4MjAwODAwLCAweDQwMDAxMTA1LAorCTB4MTA0NDA2MDIsIDB4MDAwODIwMjgsIDB4MmMyMDA4MDAsIDB4NDAxMDExMDUsCisJMHg5MDAwMDIwMiwgMHgwMDA4MjAxMCwgMHgyMDIwMDAwMCwgMHgwMDgwMTAwNSwKKwkweDkwMDQwMjAyLCAweDAwMDgyMDEwLCAweDI0MjAwMDAwLCAweDAwOTAxMDA1LAorCTB4OTA0MDAyMDIsIDB4MDAwODIwMTgsIDB4MjAyMDA4MDAsIDB4NDA4MDEwMDUsCisJMHg5MDQ0MDIwMiwgMHgwMDA4MjAxOCwgMHgyNDIwMDgwMCwgMHg0MDkwMTAwNSwKKwkweDkwMDAwNjAyLCAweDAwMDgyMDMwLCAweDI4MjAwMDAwLCAweDAwODAxMTA1LAorCTB4OTAwNDA2MDIsIDB4MDAwODIwMzAsIDB4MmMyMDAwMDAsIDB4MDA5MDExMDUsCisJMHg5MDQwMDYwMiwgMHgwMDA4MjAzOCwgMHgyODIwMDgwMCwgMHg0MDgwMTEwNSwKKwkweDkwNDQwNjAyLCAweDAwMDgyMDM4LCAweDJjMjAwODAwLCAweDQwOTAxMTA1LAorCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDA4LCAweDAwMDgwMDAwLCAweDEwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwODAsIDB4MDAwMDEwMDAsCisJMHgwMjAwMDAwMCwgMHgwMDAwMDAwOCwgMHgwMDA4MDA4MCwgMHgxMDAwMTAwMCwKKwkweDAwMDA0MDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDQwLCAweDAwMDQwMDAwLAorCTB4MDAwMDQwMDAsIDB4MDAwMDAwMDgsIDB4MDAwODAwNDAsIDB4MTAwNDAwMDAsCisJMHgwMjAwNDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDBjMCwgMHgwMDA0MTAwMCwKKwkweDAyMDA0MDAwLCAweDAwMDAwMDA4LCAweDAwMDgwMGMwLCAweDEwMDQxMDAwLAorCTB4MDAwMjAwMDAsIDB4MDAwMDgwMDAsIDB4MDgwMDAwMDAsIDB4MDAyMDAwMDAsCisJMHgwMDAyMDAwMCwgMHgwMDAwODAwOCwgMHgwODA4MDAwMCwgMHgxMDIwMDAwMCwKKwkweDAyMDIwMDAwLCAweDAwMDA4MDAwLCAweDA4MDAwMDgwLCAweDAwMjAxMDAwLAorCTB4MDIwMjAwMDAsIDB4MDAwMDgwMDgsIDB4MDgwODAwODAsIDB4MTAyMDEwMDAsCisJMHgwMDAyNDAwMCwgMHgwMDAwODAwMCwgMHgwODAwMDA0MCwgMHgwMDI0MDAwMCwKKwkweDAwMDI0MDAwLCAweDAwMDA4MDA4LCAweDA4MDgwMDQwLCAweDEwMjQwMDAwLAorCTB4MDIwMjQwMDAsIDB4MDAwMDgwMDAsIDB4MDgwMDAwYzAsIDB4MDAyNDEwMDAsCisJMHgwMjAyNDAwMCwgMHgwMDAwODAwOCwgMHgwODA4MDBjMCwgMHgxMDI0MTAwMCwKKwkweDAwMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAyMDAwLCAweDAwMDAwMDIwLAorCTB4MDAwMDAwMDAsIDB4MDEwMDAwMDgsIDB4MDAwODIwMDAsIDB4MTAwMDAwMjAsCisJMHgwMjAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMDAwMjA4MCwgMHgwMDAwMTAyMCwKKwkweDAyMDAwMDAwLCAweDAxMDAwMDA4LCAweDAwMDgyMDgwLCAweDEwMDAxMDIwLAorCTB4MDAwMDQwMDAsIDB4MDEwMDAwMDAsIDB4MDAwMDIwNDAsIDB4MDAwNDAwMjAsCisJMHgwMDAwNDAwMCwgMHgwMTAwMDAwOCwgMHgwMDA4MjA0MCwgMHgxMDA0MDAyMCwKKwkweDAyMDA0MDAwLCAweDAxMDAwMDAwLCAweDAwMDAyMGMwLCAweDAwMDQxMDIwLAorCTB4MDIwMDQwMDAsIDB4MDEwMDAwMDgsIDB4MDAwODIwYzAsIDB4MTAwNDEwMjAsCisJMHgwMDAyMDAwMCwgMHgwMTAwODAwMCwgMHgwODAwMjAwMCwgMHgwMDIwMDAyMCwKKwkweDAwMDIwMDAwLCAweDAxMDA4MDA4LCAweDA4MDgyMDAwLCAweDEwMjAwMDIwLAorCTB4MDIwMjAwMDAsIDB4MDEwMDgwMDAsIDB4MDgwMDIwODAsIDB4MDAyMDEwMjAsCisJMHgwMjAyMDAwMCwgMHgwMTAwODAwOCwgMHgwODA4MjA4MCwgMHgxMDIwMTAyMCwKKwkweDAwMDI0MDAwLCAweDAxMDA4MDAwLCAweDA4MDAyMDQwLCAweDAwMjQwMDIwLAorCTB4MDAwMjQwMDAsIDB4MDEwMDgwMDgsIDB4MDgwODIwNDAsIDB4MTAyNDAwMjAsCisJMHgwMjAyNDAwMCwgMHgwMTAwODAwMCwgMHgwODAwMjBjMCwgMHgwMDI0MTAyMCwKKwkweDAyMDI0MDAwLCAweDAxMDA4MDA4LCAweDA4MDgyMGMwLCAweDEwMjQxMDIwLAorCTB4MDAwMDA0MDAsIDB4MDQwMDAwMDAsIDB4MDAxMDAwMDAsIDB4MDAwMDAwMDQsCisJMHgwMDAwMDQwMCwgMHgwNDAwMDAwOCwgMHgwMDE4MDAwMCwgMHgxMDAwMDAwNCwKKwkweDAyMDAwNDAwLCAweDA0MDAwMDAwLCAweDAwMTAwMDgwLCAweDAwMDAxMDA0LAorCTB4MDIwMDA0MDAsIDB4MDQwMDAwMDgsIDB4MDAxODAwODAsIDB4MTAwMDEwMDQsCisJMHgwMDAwNDQwMCwgMHgwNDAwMDAwMCwgMHgwMDEwMDA0MCwgMHgwMDA0MDAwNCwKKwkweDAwMDA0NDAwLCAweDA0MDAwMDA4LCAweDAwMTgwMDQwLCAweDEwMDQwMDA0LAorCTB4MDIwMDQ0MDAsIDB4MDQwMDAwMDAsIDB4MDAxMDAwYzAsIDB4MDAwNDEwMDQsCisJMHgwMjAwNDQwMCwgMHgwNDAwMDAwOCwgMHgwMDE4MDBjMCwgMHgxMDA0MTAwNCwKKwkweDAwMDIwNDAwLCAweDA0MDA4MDAwLCAweDA4MTAwMDAwLCAweDAwMjAwMDA0LAorCTB4MDAwMjA0MDAsIDB4MDQwMDgwMDgsIDB4MDgxODAwMDAsIDB4MTAyMDAwMDQsCisJMHgwMjAyMDQwMCwgMHgwNDAwODAwMCwgMHgwODEwMDA4MCwgMHgwMDIwMTAwNCwKKwkweDAyMDIwNDAwLCAweDA0MDA4MDA4LCAweDA4MTgwMDgwLCAweDEwMjAxMDA0LAorCTB4MDAwMjQ0MDAsIDB4MDQwMDgwMDAsIDB4MDgxMDAwNDAsIDB4MDAyNDAwMDQsCisJMHgwMDAyNDQwMCwgMHgwNDAwODAwOCwgMHgwODE4MDA0MCwgMHgxMDI0MDAwNCwKKwkweDAyMDI0NDAwLCAweDA0MDA4MDAwLCAweDA4MTAwMGMwLCAweDAwMjQxMDA0LAorCTB4MDIwMjQ0MDAsIDB4MDQwMDgwMDgsIDB4MDgxODAwYzAsIDB4MTAyNDEwMDQsCisJMHgwMDAwMDQwMCwgMHgwNTAwMDAwMCwgMHgwMDEwMjAwMCwgMHgwMDAwMDAyNCwKKwkweDAwMDAwNDAwLCAweDA1MDAwMDA4LCAweDAwMTgyMDAwLCAweDEwMDAwMDI0LAorCTB4MDIwMDA0MDAsIDB4MDUwMDAwMDAsIDB4MDAxMDIwODAsIDB4MDAwMDEwMjQsCisJMHgwMjAwMDQwMCwgMHgwNTAwMDAwOCwgMHgwMDE4MjA4MCwgMHgxMDAwMTAyNCwKKwkweDAwMDA0NDAwLCAweDA1MDAwMDAwLCAweDAwMTAyMDQwLCAweDAwMDQwMDI0LAorCTB4MDAwMDQ0MDAsIDB4MDUwMDAwMDgsIDB4MDAxODIwNDAsIDB4MTAwNDAwMjQsCisJMHgwMjAwNDQwMCwgMHgwNTAwMDAwMCwgMHgwMDEwMjBjMCwgMHgwMDA0MTAyNCwKKwkweDAyMDA0NDAwLCAweDA1MDAwMDA4LCAweDAwMTgyMGMwLCAweDEwMDQxMDI0LAorCTB4MDAwMjA0MDAsIDB4MDUwMDgwMDAsIDB4MDgxMDIwMDAsIDB4MDAyMDAwMjQsCisJMHgwMDAyMDQwMCwgMHgwNTAwODAwOCwgMHgwODE4MjAwMCwgMHgxMDIwMDAyNCwKKwkweDAyMDIwNDAwLCAweDA1MDA4MDAwLCAweDA4MTAyMDgwLCAweDAwMjAxMDI0LAorCTB4MDIwMjA0MDAsIDB4MDUwMDgwMDgsIDB4MDgxODIwODAsIDB4MTAyMDEwMjQsCisJMHgwMDAyNDQwMCwgMHgwNTAwODAwMCwgMHgwODEwMjA0MCwgMHgwMDI0MDAyNCwKKwkweDAwMDI0NDAwLCAweDA1MDA4MDA4LCAweDA4MTgyMDQwLCAweDEwMjQwMDI0LAorCTB4MDIwMjQ0MDAsIDB4MDUwMDgwMDAsIDB4MDgxMDIwYzAsIDB4MDAyNDEwMjQsCisJMHgwMjAyNDQwMCwgMHgwNTAwODAwOCwgMHgwODE4MjBjMCwgMHgxMDI0MTAyNCwKKwkweDAwMDAwODAwLCAweDAwMDEwMDAwLCAweDIwMDAwMDAwLCAweDAwMDAwMDEwLAorCTB4MDAwMDA4MDAsIDB4MDAwMTAwMDgsIDB4MjAwODAwMDAsIDB4MTAwMDAwMTAsCisJMHgwMjAwMDgwMCwgMHgwMDAxMDAwMCwgMHgyMDAwMDA4MCwgMHgwMDAwMTAxMCwKKwkweDAyMDAwODAwLCAweDAwMDEwMDA4LCAweDIwMDgwMDgwLCAweDEwMDAxMDEwLAorCTB4MDAwMDQ4MDAsIDB4MDAwMTAwMDAsIDB4MjAwMDAwNDAsIDB4MDAwNDAwMTAsCisJMHgwMDAwNDgwMCwgMHgwMDAxMDAwOCwgMHgyMDA4MDA0MCwgMHgxMDA0MDAxMCwKKwkweDAyMDA0ODAwLCAweDAwMDEwMDAwLCAweDIwMDAwMGMwLCAweDAwMDQxMDEwLAorCTB4MDIwMDQ4MDAsIDB4MDAwMTAwMDgsIDB4MjAwODAwYzAsIDB4MTAwNDEwMTAsCisJMHgwMDAyMDgwMCwgMHgwMDAxODAwMCwgMHgyODAwMDAwMCwgMHgwMDIwMDAxMCwKKwkweDAwMDIwODAwLCAweDAwMDE4MDA4LCAweDI4MDgwMDAwLCAweDEwMjAwMDEwLAorCTB4MDIwMjA4MDAsIDB4MDAwMTgwMDAsIDB4MjgwMDAwODAsIDB4MDAyMDEwMTAsCisJMHgwMjAyMDgwMCwgMHgwMDAxODAwOCwgMHgyODA4MDA4MCwgMHgxMDIwMTAxMCwKKwkweDAwMDI0ODAwLCAweDAwMDE4MDAwLCAweDI4MDAwMDQwLCAweDAwMjQwMDEwLAorCTB4MDAwMjQ4MDAsIDB4MDAwMTgwMDgsIDB4MjgwODAwNDAsIDB4MTAyNDAwMTAsCisJMHgwMjAyNDgwMCwgMHgwMDAxODAwMCwgMHgyODAwMDBjMCwgMHgwMDI0MTAxMCwKKwkweDAyMDI0ODAwLCAweDAwMDE4MDA4LCAweDI4MDgwMGMwLCAweDEwMjQxMDEwLAorCTB4MDAwMDA4MDAsIDB4MDEwMTAwMDAsIDB4MjAwMDIwMDAsIDB4MDAwMDAwMzAsCisJMHgwMDAwMDgwMCwgMHgwMTAxMDAwOCwgMHgyMDA4MjAwMCwgMHgxMDAwMDAzMCwKKwkweDAyMDAwODAwLCAweDAxMDEwMDAwLCAweDIwMDAyMDgwLCAweDAwMDAxMDMwLAorCTB4MDIwMDA4MDAsIDB4MDEwMTAwMDgsIDB4MjAwODIwODAsIDB4MTAwMDEwMzAsCisJMHgwMDAwNDgwMCwgMHgwMTAxMDAwMCwgMHgyMDAwMjA0MCwgMHgwMDA0MDAzMCwKKwkweDAwMDA0ODAwLCAweDAxMDEwMDA4LCAweDIwMDgyMDQwLCAweDEwMDQwMDMwLAorCTB4MDIwMDQ4MDAsIDB4MDEwMTAwMDAsIDB4MjAwMDIwYzAsIDB4MDAwNDEwMzAsCisJMHgwMjAwNDgwMCwgMHgwMTAxMDAwOCwgMHgyMDA4MjBjMCwgMHgxMDA0MTAzMCwKKwkweDAwMDIwODAwLCAweDAxMDE4MDAwLCAweDI4MDAyMDAwLCAweDAwMjAwMDMwLAorCTB4MDAwMjA4MDAsIDB4MDEwMTgwMDgsIDB4MjgwODIwMDAsIDB4MTAyMDAwMzAsCisJMHgwMjAyMDgwMCwgMHgwMTAxODAwMCwgMHgyODAwMjA4MCwgMHgwMDIwMTAzMCwKKwkweDAyMDIwODAwLCAweDAxMDE4MDA4LCAweDI4MDgyMDgwLCAweDEwMjAxMDMwLAorCTB4MDAwMjQ4MDAsIDB4MDEwMTgwMDAsIDB4MjgwMDIwNDAsIDB4MDAyNDAwMzAsCisJMHgwMDAyNDgwMCwgMHgwMTAxODAwOCwgMHgyODA4MjA0MCwgMHgxMDI0MDAzMCwKKwkweDAyMDI0ODAwLCAweDAxMDE4MDAwLCAweDI4MDAyMGMwLCAweDAwMjQxMDMwLAorCTB4MDIwMjQ4MDAsIDB4MDEwMTgwMDgsIDB4MjgwODIwYzAsIDB4MTAyNDEwMzAsCisJMHgwMDAwMGMwMCwgMHgwNDAxMDAwMCwgMHgyMDEwMDAwMCwgMHgwMDAwMDAxNCwKKwkweDAwMDAwYzAwLCAweDA0MDEwMDA4LCAweDIwMTgwMDAwLCAweDEwMDAwMDE0LAorCTB4MDIwMDBjMDAsIDB4MDQwMTAwMDAsIDB4MjAxMDAwODAsIDB4MDAwMDEwMTQsCisJMHgwMjAwMGMwMCwgMHgwNDAxMDAwOCwgMHgyMDE4MDA4MCwgMHgxMDAwMTAxNCwKKwkweDAwMDA0YzAwLCAweDA0MDEwMDAwLCAweDIwMTAwMDQwLCAweDAwMDQwMDE0LAorCTB4MDAwMDRjMDAsIDB4MDQwMTAwMDgsIDB4MjAxODAwNDAsIDB4MTAwNDAwMTQsCisJMHgwMjAwNGMwMCwgMHgwNDAxMDAwMCwgMHgyMDEwMDBjMCwgMHgwMDA0MTAxNCwKKwkweDAyMDA0YzAwLCAweDA0MDEwMDA4LCAweDIwMTgwMGMwLCAweDEwMDQxMDE0LAorCTB4MDAwMjBjMDAsIDB4MDQwMTgwMDAsIDB4MjgxMDAwMDAsIDB4MDAyMDAwMTQsCisJMHgwMDAyMGMwMCwgMHgwNDAxODAwOCwgMHgyODE4MDAwMCwgMHgxMDIwMDAxNCwKKwkweDAyMDIwYzAwLCAweDA0MDE4MDAwLCAweDI4MTAwMDgwLCAweDAwMjAxMDE0LAorCTB4MDIwMjBjMDAsIDB4MDQwMTgwMDgsIDB4MjgxODAwODAsIDB4MTAyMDEwMTQsCisJMHgwMDAyNGMwMCwgMHgwNDAxODAwMCwgMHgyODEwMDA0MCwgMHgwMDI0MDAxNCwKKwkweDAwMDI0YzAwLCAweDA0MDE4MDA4LCAweDI4MTgwMDQwLCAweDEwMjQwMDE0LAorCTB4MDIwMjRjMDAsIDB4MDQwMTgwMDAsIDB4MjgxMDAwYzAsIDB4MDAyNDEwMTQsCisJMHgwMjAyNGMwMCwgMHgwNDAxODAwOCwgMHgyODE4MDBjMCwgMHgxMDI0MTAxNCwKKwkweDAwMDAwYzAwLCAweDA1MDEwMDAwLCAweDIwMTAyMDAwLCAweDAwMDAwMDM0LAorCTB4MDAwMDBjMDAsIDB4MDUwMTAwMDgsIDB4MjAxODIwMDAsIDB4MTAwMDAwMzQsCisJMHgwMjAwMGMwMCwgMHgwNTAxMDAwMCwgMHgyMDEwMjA4MCwgMHgwMDAwMTAzNCwKKwkweDAyMDAwYzAwLCAweDA1MDEwMDA4LCAweDIwMTgyMDgwLCAweDEwMDAxMDM0LAorCTB4MDAwMDRjMDAsIDB4MDUwMTAwMDAsIDB4MjAxMDIwNDAsIDB4MDAwNDAwMzQsCisJMHgwMDAwNGMwMCwgMHgwNTAxMDAwOCwgMHgyMDE4MjA0MCwgMHgxMDA0MDAzNCwKKwkweDAyMDA0YzAwLCAweDA1MDEwMDAwLCAweDIwMTAyMGMwLCAweDAwMDQxMDM0LAorCTB4MDIwMDRjMDAsIDB4MDUwMTAwMDgsIDB4MjAxODIwYzAsIDB4MTAwNDEwMzQsCisJMHgwMDAyMGMwMCwgMHgwNTAxODAwMCwgMHgyODEwMjAwMCwgMHgwMDIwMDAzNCwKKwkweDAwMDIwYzAwLCAweDA1MDE4MDA4LCAweDI4MTgyMDAwLCAweDEwMjAwMDM0LAorCTB4MDIwMjBjMDAsIDB4MDUwMTgwMDAsIDB4MjgxMDIwODAsIDB4MDAyMDEwMzQsCisJMHgwMjAyMGMwMCwgMHgwNTAxODAwOCwgMHgyODE4MjA4MCwgMHgxMDIwMTAzNCwKKwkweDAwMDI0YzAwLCAweDA1MDE4MDAwLCAweDI4MTAyMDQwLCAweDAwMjQwMDM0LAorCTB4MDAwMjRjMDAsIDB4MDUwMTgwMDgsIDB4MjgxODIwNDAsIDB4MTAyNDAwMzQsCisJMHgwMjAyNGMwMCwgMHgwNTAxODAwMCwgMHgyODEwMjBjMCwgMHgwMDI0MTAzNCwKKwkweDAyMDI0YzAwLCAweDA1MDE4MDA4LCAweDI4MTgyMGMwLCAweDEwMjQxMDM0CiB9OwogCisvKiBTLWJveCBsb29rdXAgdGFibGVzICovCiAKLXN0YXRpYyB2b2lkIGRlc19zbWFsbF9maXBzX2VuY3J5cHQodTMyICpleHBrZXksIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCitzdGF0aWMgY29uc3QgdTMyIFMxWzY0XSA9IHsKKwkweDAxMDEwNDAwLCAweDAwMDAwMDAwLCAweDAwMDEwMDAwLCAweDAxMDEwNDA0LAorCTB4MDEwMTAwMDQsIDB4MDAwMTA0MDQsIDB4MDAwMDAwMDQsIDB4MDAwMTAwMDAsCisJMHgwMDAwMDQwMCwgMHgwMTAxMDQwMCwgMHgwMTAxMDQwNCwgMHgwMDAwMDQwMCwKKwkweDAxMDAwNDA0LCAweDAxMDEwMDA0LCAweDAxMDAwMDAwLCAweDAwMDAwMDA0LAorCTB4MDAwMDA0MDQsIDB4MDEwMDA0MDAsIDB4MDEwMDA0MDAsIDB4MDAwMTA0MDAsCisJMHgwMDAxMDQwMCwgMHgwMTAxMDAwMCwgMHgwMTAxMDAwMCwgMHgwMTAwMDQwNCwKKwkweDAwMDEwMDA0LCAweDAxMDAwMDA0LCAweDAxMDAwMDA0LCAweDAwMDEwMDA0LAorCTB4MDAwMDAwMDAsIDB4MDAwMDA0MDQsIDB4MDAwMTA0MDQsIDB4MDEwMDAwMDAsCisJMHgwMDAxMDAwMCwgMHgwMTAxMDQwNCwgMHgwMDAwMDAwNCwgMHgwMTAxMDAwMCwKKwkweDAxMDEwNDAwLCAweDAxMDAwMDAwLCAweDAxMDAwMDAwLCAweDAwMDAwNDAwLAorCTB4MDEwMTAwMDQsIDB4MDAwMTAwMDAsIDB4MDAwMTA0MDAsIDB4MDEwMDAwMDQsCisJMHgwMDAwMDQwMCwgMHgwMDAwMDAwNCwgMHgwMTAwMDQwNCwgMHgwMDAxMDQwNCwKKwkweDAxMDEwNDA0LCAweDAwMDEwMDA0LCAweDAxMDEwMDAwLCAweDAxMDAwNDA0LAorCTB4MDEwMDAwMDQsIDB4MDAwMDA0MDQsIDB4MDAwMTA0MDQsIDB4MDEwMTA0MDAsCisJMHgwMDAwMDQwNCwgMHgwMTAwMDQwMCwgMHgwMTAwMDQwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDEwMDA0LCAweDAwMDEwNDAwLCAweDAwMDAwMDAwLCAweDAxMDEwMDA0Cit9OworCitzdGF0aWMgY29uc3QgdTMyIFMyWzY0XSA9IHsKKwkweDgwMTA4MDIwLCAweDgwMDA4MDAwLCAweDAwMDA4MDAwLCAweDAwMTA4MDIwLAorCTB4MDAxMDAwMDAsIDB4MDAwMDAwMjAsIDB4ODAxMDAwMjAsIDB4ODAwMDgwMjAsCisJMHg4MDAwMDAyMCwgMHg4MDEwODAyMCwgMHg4MDEwODAwMCwgMHg4MDAwMDAwMCwKKwkweDgwMDA4MDAwLCAweDAwMTAwMDAwLCAweDAwMDAwMDIwLCAweDgwMTAwMDIwLAorCTB4MDAxMDgwMDAsIDB4MDAxMDAwMjAsIDB4ODAwMDgwMjAsIDB4MDAwMDAwMDAsCisJMHg4MDAwMDAwMCwgMHgwMDAwODAwMCwgMHgwMDEwODAyMCwgMHg4MDEwMDAwMCwKKwkweDAwMTAwMDIwLCAweDgwMDAwMDIwLCAweDAwMDAwMDAwLCAweDAwMTA4MDAwLAorCTB4MDAwMDgwMjAsIDB4ODAxMDgwMDAsIDB4ODAxMDAwMDAsIDB4MDAwMDgwMjAsCisJMHgwMDAwMDAwMCwgMHgwMDEwODAyMCwgMHg4MDEwMDAyMCwgMHgwMDEwMDAwMCwKKwkweDgwMDA4MDIwLCAweDgwMTAwMDAwLCAweDgwMTA4MDAwLCAweDAwMDA4MDAwLAorCTB4ODAxMDAwMDAsIDB4ODAwMDgwMDAsIDB4MDAwMDAwMjAsIDB4ODAxMDgwMjAsCisJMHgwMDEwODAyMCwgMHgwMDAwMDAyMCwgMHgwMDAwODAwMCwgMHg4MDAwMDAwMCwKKwkweDAwMDA4MDIwLCAweDgwMTA4MDAwLCAweDAwMTAwMDAwLCAweDgwMDAwMDIwLAorCTB4MDAxMDAwMjAsIDB4ODAwMDgwMjAsIDB4ODAwMDAwMjAsIDB4MDAxMDAwMjAsCisJMHgwMDEwODAwMCwgMHgwMDAwMDAwMCwgMHg4MDAwODAwMCwgMHgwMDAwODAyMCwKKwkweDgwMDAwMDAwLCAweDgwMTAwMDIwLCAweDgwMTA4MDIwLCAweDAwMTA4MDAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFMzWzY0XSA9IHsKKwkweDAwMDAwMjA4LCAweDA4MDIwMjAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDA4LAorCTB4MDgwMDAyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMjAyMDgsIDB4MDgwMDAyMDAsCisJMHgwMDAyMDAwOCwgMHgwODAwMDAwOCwgMHgwODAwMDAwOCwgMHgwMDAyMDAwMCwKKwkweDA4MDIwMjA4LCAweDAwMDIwMDA4LCAweDA4MDIwMDAwLCAweDAwMDAwMjA4LAorCTB4MDgwMDAwMDAsIDB4MDAwMDAwMDgsIDB4MDgwMjAyMDAsIDB4MDAwMDAyMDAsCisJMHgwMDAyMDIwMCwgMHgwODAyMDAwMCwgMHgwODAyMDAwOCwgMHgwMDAyMDIwOCwKKwkweDA4MDAwMjA4LCAweDAwMDIwMjAwLCAweDAwMDIwMDAwLCAweDA4MDAwMjA4LAorCTB4MDAwMDAwMDgsIDB4MDgwMjAyMDgsIDB4MDAwMDAyMDAsIDB4MDgwMDAwMDAsCisJMHgwODAyMDIwMCwgMHgwODAwMDAwMCwgMHgwMDAyMDAwOCwgMHgwMDAwMDIwOCwKKwkweDAwMDIwMDAwLCAweDA4MDIwMjAwLCAweDA4MDAwMjAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAyMDAsIDB4MDAwMjAwMDgsIDB4MDgwMjAyMDgsIDB4MDgwMDAyMDAsCisJMHgwODAwMDAwOCwgMHgwMDAwMDIwMCwgMHgwMDAwMDAwMCwgMHgwODAyMDAwOCwKKwkweDA4MDAwMjA4LCAweDAwMDIwMDAwLCAweDA4MDAwMDAwLCAweDA4MDIwMjA4LAorCTB4MDAwMDAwMDgsIDB4MDAwMjAyMDgsIDB4MDAwMjAyMDAsIDB4MDgwMDAwMDgsCisJMHgwODAyMDAwMCwgMHgwODAwMDIwOCwgMHgwMDAwMDIwOCwgMHgwODAyMDAwMCwKKwkweDAwMDIwMjA4LCAweDAwMDAwMDA4LCAweDA4MDIwMDA4LCAweDAwMDIwMjAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM0WzY0XSA9IHsKKwkweDAwODAyMDAxLCAweDAwMDAyMDgxLCAweDAwMDAyMDgxLCAweDAwMDAwMDgwLAorCTB4MDA4MDIwODAsIDB4MDA4MDAwODEsIDB4MDA4MDAwMDEsIDB4MDAwMDIwMDEsCisJMHgwMDAwMDAwMCwgMHgwMDgwMjAwMCwgMHgwMDgwMjAwMCwgMHgwMDgwMjA4MSwKKwkweDAwMDAwMDgxLCAweDAwMDAwMDAwLCAweDAwODAwMDgwLCAweDAwODAwMDAxLAorCTB4MDAwMDAwMDEsIDB4MDAwMDIwMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDIwMDEsCisJMHgwMDAwMDA4MCwgMHgwMDgwMDAwMCwgMHgwMDAwMjAwMSwgMHgwMDAwMjA4MCwKKwkweDAwODAwMDgxLCAweDAwMDAwMDAxLCAweDAwMDAyMDgwLCAweDAwODAwMDgwLAorCTB4MDAwMDIwMDAsIDB4MDA4MDIwODAsIDB4MDA4MDIwODEsIDB4MDAwMDAwODEsCisJMHgwMDgwMDA4MCwgMHgwMDgwMDAwMSwgMHgwMDgwMjAwMCwgMHgwMDgwMjA4MSwKKwkweDAwMDAwMDgxLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwODAyMDAwLAorCTB4MDAwMDIwODAsIDB4MDA4MDAwODAsIDB4MDA4MDAwODEsIDB4MDAwMDAwMDEsCisJMHgwMDgwMjAwMSwgMHgwMDAwMjA4MSwgMHgwMDAwMjA4MSwgMHgwMDAwMDA4MCwKKwkweDAwODAyMDgxLCAweDAwMDAwMDgxLCAweDAwMDAwMDAxLCAweDAwMDAyMDAwLAorCTB4MDA4MDAwMDEsIDB4MDAwMDIwMDEsIDB4MDA4MDIwODAsIDB4MDA4MDAwODEsCisJMHgwMDAwMjAwMSwgMHgwMDAwMjA4MCwgMHgwMDgwMDAwMCwgMHgwMDgwMjAwMSwKKwkweDAwMDAwMDgwLCAweDAwODAwMDAwLCAweDAwMDAyMDAwLCAweDAwODAyMDgwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM1WzY0XSA9IHsKKwkweDAwMDAwMTAwLCAweDAyMDgwMTAwLCAweDAyMDgwMDAwLCAweDQyMDAwMTAwLAorCTB4MDAwODAwMDAsIDB4MDAwMDAxMDAsIDB4NDAwMDAwMDAsIDB4MDIwODAwMDAsCisJMHg0MDA4MDEwMCwgMHgwMDA4MDAwMCwgMHgwMjAwMDEwMCwgMHg0MDA4MDEwMCwKKwkweDQyMDAwMTAwLCAweDQyMDgwMDAwLCAweDAwMDgwMTAwLCAweDQwMDAwMDAwLAorCTB4MDIwMDAwMDAsIDB4NDAwODAwMDAsIDB4NDAwODAwMDAsIDB4MDAwMDAwMDAsCisJMHg0MDAwMDEwMCwgMHg0MjA4MDEwMCwgMHg0MjA4MDEwMCwgMHgwMjAwMDEwMCwKKwkweDQyMDgwMDAwLCAweDQwMDAwMTAwLCAweDAwMDAwMDAwLCAweDQyMDAwMDAwLAorCTB4MDIwODAxMDAsIDB4MDIwMDAwMDAsIDB4NDIwMDAwMDAsIDB4MDAwODAxMDAsCisJMHgwMDA4MDAwMCwgMHg0MjAwMDEwMCwgMHgwMDAwMDEwMCwgMHgwMjAwMDAwMCwKKwkweDQwMDAwMDAwLCAweDAyMDgwMDAwLCAweDQyMDAwMTAwLCAweDQwMDgwMTAwLAorCTB4MDIwMDAxMDAsIDB4NDAwMDAwMDAsIDB4NDIwODAwMDAsIDB4MDIwODAxMDAsCisJMHg0MDA4MDEwMCwgMHgwMDAwMDEwMCwgMHgwMjAwMDAwMCwgMHg0MjA4MDAwMCwKKwkweDQyMDgwMTAwLCAweDAwMDgwMTAwLCAweDQyMDAwMDAwLCAweDQyMDgwMTAwLAorCTB4MDIwODAwMDAsIDB4MDAwMDAwMDAsIDB4NDAwODAwMDAsIDB4NDIwMDAwMDAsCisJMHgwMDA4MDEwMCwgMHgwMjAwMDEwMCwgMHg0MDAwMDEwMCwgMHgwMDA4MDAwMCwKKwkweDAwMDAwMDAwLCAweDQwMDgwMDAwLCAweDAyMDgwMTAwLCAweDQwMDAwMTAwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM2WzY0XSA9IHsKKwkweDIwMDAwMDEwLCAweDIwNDAwMDAwLCAweDAwMDA0MDAwLCAweDIwNDA0MDEwLAorCTB4MjA0MDAwMDAsIDB4MDAwMDAwMTAsIDB4MjA0MDQwMTAsIDB4MDA0MDAwMDAsCisJMHgyMDAwNDAwMCwgMHgwMDQwNDAxMCwgMHgwMDQwMDAwMCwgMHgyMDAwMDAxMCwKKwkweDAwNDAwMDEwLCAweDIwMDA0MDAwLCAweDIwMDAwMDAwLCAweDAwMDA0MDEwLAorCTB4MDAwMDAwMDAsIDB4MDA0MDAwMTAsIDB4MjAwMDQwMTAsIDB4MDAwMDQwMDAsCisJMHgwMDQwNDAwMCwgMHgyMDAwNDAxMCwgMHgwMDAwMDAxMCwgMHgyMDQwMDAxMCwKKwkweDIwNDAwMDEwLCAweDAwMDAwMDAwLCAweDAwNDA0MDEwLCAweDIwNDA0MDAwLAorCTB4MDAwMDQwMTAsIDB4MDA0MDQwMDAsIDB4MjA0MDQwMDAsIDB4MjAwMDAwMDAsCisJMHgyMDAwNDAwMCwgMHgwMDAwMDAxMCwgMHgyMDQwMDAxMCwgMHgwMDQwNDAwMCwKKwkweDIwNDA0MDEwLCAweDAwNDAwMDAwLCAweDAwMDA0MDEwLCAweDIwMDAwMDEwLAorCTB4MDA0MDAwMDAsIDB4MjAwMDQwMDAsIDB4MjAwMDAwMDAsIDB4MDAwMDQwMTAsCisJMHgyMDAwMDAxMCwgMHgyMDQwNDAxMCwgMHgwMDQwNDAwMCwgMHgyMDQwMDAwMCwKKwkweDAwNDA0MDEwLCAweDIwNDA0MDAwLCAweDAwMDAwMDAwLCAweDIwNDAwMDEwLAorCTB4MDAwMDAwMTAsIDB4MDAwMDQwMDAsIDB4MjA0MDAwMDAsIDB4MDA0MDQwMTAsCisJMHgwMDAwNDAwMCwgMHgwMDQwMDAxMCwgMHgyMDAwNDAxMCwgMHgwMDAwMDAwMCwKKwkweDIwNDA0MDAwLCAweDIwMDAwMDAwLCAweDAwNDAwMDEwLCAweDIwMDA0MDEwCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM3WzY0XSA9IHsKKwkweDAwMjAwMDAwLCAweDA0MjAwMDAyLCAweDA0MDAwODAyLCAweDAwMDAwMDAwLAorCTB4MDAwMDA4MDAsIDB4MDQwMDA4MDIsIDB4MDAyMDA4MDIsIDB4MDQyMDA4MDAsCisJMHgwNDIwMDgwMiwgMHgwMDIwMDAwMCwgMHgwMDAwMDAwMCwgMHgwNDAwMDAwMiwKKwkweDAwMDAwMDAyLCAweDA0MDAwMDAwLCAweDA0MjAwMDAyLCAweDAwMDAwODAyLAorCTB4MDQwMDA4MDAsIDB4MDAyMDA4MDIsIDB4MDAyMDAwMDIsIDB4MDQwMDA4MDAsCisJMHgwNDAwMDAwMiwgMHgwNDIwMDAwMCwgMHgwNDIwMDgwMCwgMHgwMDIwMDAwMiwKKwkweDA0MjAwMDAwLCAweDAwMDAwODAwLCAweDAwMDAwODAyLCAweDA0MjAwODAyLAorCTB4MDAyMDA4MDAsIDB4MDAwMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDAyMDA4MDAsCisJMHgwNDAwMDAwMCwgMHgwMDIwMDgwMCwgMHgwMDIwMDAwMCwgMHgwNDAwMDgwMiwKKwkweDA0MDAwODAyLCAweDA0MjAwMDAyLCAweDA0MjAwMDAyLCAweDAwMDAwMDAyLAorCTB4MDAyMDAwMDIsIDB4MDQwMDAwMDAsIDB4MDQwMDA4MDAsIDB4MDAyMDAwMDAsCisJMHgwNDIwMDgwMCwgMHgwMDAwMDgwMiwgMHgwMDIwMDgwMiwgMHgwNDIwMDgwMCwKKwkweDAwMDAwODAyLCAweDA0MDAwMDAyLCAweDA0MjAwODAyLCAweDA0MjAwMDAwLAorCTB4MDAyMDA4MDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDIsIDB4MDQyMDA4MDIsCisJMHgwMDAwMDAwMCwgMHgwMDIwMDgwMiwgMHgwNDIwMDAwMCwgMHgwMDAwMDgwMCwKKwkweDA0MDAwMDAyLCAweDA0MDAwODAwLCAweDAwMDAwODAwLCAweDAwMjAwMDAyCit9OworCitzdGF0aWMgY29uc3QgdTMyIFM4WzY0XSA9IHsKKwkweDEwMDAxMDQwLCAweDAwMDAxMDAwLCAweDAwMDQwMDAwLCAweDEwMDQxMDQwLAorCTB4MTAwMDAwMDAsIDB4MTAwMDEwNDAsIDB4MDAwMDAwNDAsIDB4MTAwMDAwMDAsCisJMHgwMDA0MDA0MCwgMHgxMDA0MDAwMCwgMHgxMDA0MTA0MCwgMHgwMDA0MTAwMCwKKwkweDEwMDQxMDAwLCAweDAwMDQxMDQwLCAweDAwMDAxMDAwLCAweDAwMDAwMDQwLAorCTB4MTAwNDAwMDAsIDB4MTAwMDAwNDAsIDB4MTAwMDEwMDAsIDB4MDAwMDEwNDAsCisJMHgwMDA0MTAwMCwgMHgwMDA0MDA0MCwgMHgxMDA0MDA0MCwgMHgxMDA0MTAwMCwKKwkweDAwMDAxMDQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDEwMDQwMDQwLAorCTB4MTAwMDAwNDAsIDB4MTAwMDEwMDAsIDB4MDAwNDEwNDAsIDB4MDAwNDAwMDAsCisJMHgwMDA0MTA0MCwgMHgwMDA0MDAwMCwgMHgxMDA0MTAwMCwgMHgwMDAwMTAwMCwKKwkweDAwMDAwMDQwLCAweDEwMDQwMDQwLCAweDAwMDAxMDAwLCAweDAwMDQxMDQwLAorCTB4MTAwMDEwMDAsIDB4MDAwMDAwNDAsIDB4MTAwMDAwNDAsIDB4MTAwNDAwMDAsCisJMHgxMDA0MDA0MCwgMHgxMDAwMDAwMCwgMHgwMDA0MDAwMCwgMHgxMDAwMTA0MCwKKwkweDAwMDAwMDAwLCAweDEwMDQxMDQwLCAweDAwMDQwMDQwLCAweDEwMDAwMDQwLAorCTB4MTAwNDAwMDAsIDB4MTAwMDEwMDAsIDB4MTAwMDEwNDAsIDB4MDAwMDAwMDAsCisJMHgxMDA0MTA0MCwgMHgwMDA0MTAwMCwgMHgwMDA0MTAwMCwgMHgwMDAwMTA0MCwKKwkweDAwMDAxMDQwLCAweDAwMDQwMDQwLCAweDEwMDAwMDAwLCAweDEwMDQxMDAwCit9OworCisvKiBFbmNyeXB0aW9uIGNvbXBvbmVudHM6IElQLCBGUCwgYW5kIHJvdW5kIGZ1bmN0aW9uICovCisKKyNkZWZpbmUgSVAoTCwgUiwgVCkJCVwKKwlST0woUiwgNCk7CQlcCisJVCAgPSBMOwkJCVwKKwlMIF49IFI7CQkJXAorCUwgJj0gMHhmMGYwZjBmMDsJXAorCVIgXj0gTDsJCQlcCisJTCBePSBUOwkJCVwKKwlST0woUiwgMTIpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4ZmZmZjAwMDA7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9SKFIsIDE0KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGNjY2NjY2NjOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCA2KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGZmMDBmZjAwOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPUihSLCA3KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGFhYWFhYWFhOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChMLCAxKTsKKworI2RlZmluZSBGUChMLCBSLCBUKQkJXAorCVJPUihMLCAxKTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGFhYWFhYWFhOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCA3KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGZmMDBmZjAwOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPUihSLCA2KTsJCVwKKwlUICA9IEw7CQkJXAorCUwgXj0gUjsJCQlcCisJTCAmPSAweGNjY2NjY2NjOwlcCisJUiBePSBMOwkJCVwKKwlMIF49IFQ7CQkJXAorCVJPTChSLCAxNCk7CQlcCisJVCAgPSBMOwkJCVwKKwlMIF49IFI7CQkJXAorCUwgJj0gMHhmZmZmMDAwMDsJXAorCVIgXj0gTDsJCQlcCisJTCBePSBUOwkJCVwKKwlST1IoUiwgMTIpOwkJXAorCVQgID0gTDsJCQlcCisJTCBePSBSOwkJCVwKKwlMICY9IDB4ZjBmMGYwZjA7CVwKKwlSIF49IEw7CQkJXAorCUwgXj0gVDsJCQlcCisJUk9SKFIsIDQpOworCisjZGVmaW5lIFJPVU5EKEwsIFIsIEEsIEIsIEssIGQpCQkJCQlcCisJQiA9IEtbMF07CQkJQSA9IEtbMV07CUsgKz0gZDsJXAorCUIgXj0gUjsJCQkJQSBePSBSOwkJCVwKKwlCICY9IDB4M2YzZjNmM2Y7CQlST1IoQSwgNCk7CQlcCisJTCBePSBTOFsweGZmICYgQl07CQlBICY9IDB4M2YzZjNmM2Y7CVwKKwlMIF49IFM2WzB4ZmYgJiAoQiA+PiA4KV07CUIgPj49IDE2OwkJXAorCUwgXj0gUzdbMHhmZiAmIEFdOwkJCQkJXAorCUwgXj0gUzVbMHhmZiAmIChBID4+IDgpXTsJQSA+Pj0gMTY7CQlcCisJTCBePSBTNFsweGZmICYgQl07CQkJCQlcCisJTCBePSBTMlsweGZmICYgKEIgPj4gOCldOwkJCQlcCisJTCBePSBTM1sweGZmICYgQV07CQkJCQlcCisJTCBePSBTMVsweGZmICYgKEEgPj4gOCldOworCisvKgorICogUEMyIGxvb2t1cCB0YWJsZXMgYXJlIG9yZ2FuaXplZCBhcyAyIGNvbnNlY3V0aXZlIHNldHMgb2YgNCBpbnRlcmxlYXZlZAorICogdGFibGVzIG9mIDEyOCBlbGVtZW50cy4gIE9uZSBzZXQgaXMgZm9yIENfaSBhbmQgdGhlIG90aGVyIGZvciBEX2ksIHdoaWxlCisgKiB0aGUgNCBpbnRlcmxlYXZlZCB0YWJsZXMgY29ycmVzcG9uZCB0byBmb3VyIDctYml0IHN1YnNldHMgb2YgQ19pIG9yIERfaS4KKyAqCisgKiBBZnRlciBQQzEgZWFjaCBvZiB0aGUgdmFyaWFibGVzIGEsYixjLGQgY29udGFpbnMgYSA3IGJpdCBzdWJzZXQgb2YgQ19pCisgKiBvciBEX2kgaW4gYml0cyA3LTEgKGJpdCAwIGJlaW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCkuCisgKi8KKworI2RlZmluZSBUMSh4KSBwdFsyICogKHgpICsgMF0KKyNkZWZpbmUgVDIoeCkgcHRbMiAqICh4KSArIDFdCisjZGVmaW5lIFQzKHgpIHB0WzIgKiAoeCkgKyAyXQorI2RlZmluZSBUNCh4KSBwdFsyICogKHgpICsgM10KKworI2RlZmluZSBQQzIoYSwgYiwgYywgZCkgKFQ0KGQpIHwgVDMoYykgfCBUMihiKSB8IFQxKGEpKQorCisvKgorICogRW5jcnlwdGlvbiBrZXkgZXhwYW5zaW9uCisgKgorICogUkZDMjQ1MTogV2VhayBrZXkgY2hlY2tzIFNIT1VMRCBiZSBwZXJmb3JtZWQuCisgKgorICogRklQUyA3NDoKKyAqCisgKiAgIEtleXMgaGF2aW5nIGR1YWxzIGFyZSBrZXlzIHdoaWNoIHByb2R1Y2UgYWxsIHplcm9zLCBhbGwgb25lcywgb3IKKyAqICAgYWx0ZXJuYXRpbmcgemVyby1vbmUgcGF0dGVybnMgaW4gdGhlIEMgYW5kIEQgcmVnaXN0ZXJzIGFmdGVyIFBlcm11dGVkCisgKiAgIENob2ljZSAxIGhhcyBvcGVyYXRlZCBvbiB0aGUga2V5LgorICoKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWtleSh1MzIgKnBlLCBjb25zdCB1OCAqaykKIHsKLQl1MzIgeCwgeSwgejsKLQkKLQl4ICA9IHNyY1s3XTsKLQl4IDw8PSA4OwotCXggfD0gc3JjWzZdOwotCXggPDw9IDg7Ci0JeCB8PSBzcmNbNV07Ci0JeCA8PD0gODsKLQl4IHw9IHNyY1s0XTsKLQl5ICA9IHNyY1szXTsKLQl5IDw8PSA4OwotCXkgfD0gc3JjWzJdOwotCXkgPDw9IDg7Ci0JeSB8PSBzcmNbMV07Ci0JeSA8PD0gODsKLQl5IHw9IHNyY1swXTsKLQl6ICA9ICgoeCA+PiAwMDQpIF4geSkgJiAweDBGMEYwRjBGTDsKLQl4IF49IHogPDwgMDA0OwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMjApIF4geCkgJiAweDAwMDBGRkZGTDsKLQl5IF49IHogPDwgMDIwOwotCXggXj0gejsKLQl6ICA9ICgoeCA+PiAwMDIpIF4geSkgJiAweDMzMzMzMzMzTDsKLQl4IF49IHogPDwgMDAyOwotCXkgXj0gejsKLQl6ICA9ICgoeSA+PiAwMTApIF4geCkgJiAweDAwRkYwMEZGTDsKLQl5IF49IHogPDwgMDEwOwotCXggXj0gejsKLQl4ICA9IHggPj4gMSB8IHggPDwgMzE7Ci0JeiAgPSAoeCBeIHkpICYgMHg1NTU1NTU1NUw7Ci0JeSBePSB6OwotCXggXj0gejsKLQl5ICA9IHkgPj4gMSB8IHkgPDwgMzE7Ci0JeiAgPSBleHBrZXlbMF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMV07Ci0JeiBePSB5OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzJdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzNdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs0XTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs1XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbN107Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzhdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzldOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTFdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxMl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTNdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTVdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxNl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTddOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxOF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTldOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjFdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyMl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjNdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjVdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyNl07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjddOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyOF07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjldOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVszMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMzFdOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl4ICA9IHggPDwgMSB8IHggPj4gMzE7Ci0JeiAgPSAoeCBeIHkpICYgMHg1NTU1NTU1NUw7Ci0JeSBePSB6OwotCXggXj0gejsKLQl5ICA9IHkgPDwgMSB8IHkgPj4gMzE7Ci0JeiAgPSAoKHggPj4gMDEwKSBeIHkpICYgMHgwMEZGMDBGRkw7Ci0JeCBePSB6IDw8IDAxMDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDAyKSBeIHgpICYgMHgzMzMzMzMzM0w7Ci0JeSBePSB6IDw8IDAwMjsKLQl4IF49IHo7Ci0JeiAgPSAoKHggPj4gMDIwKSBeIHkpICYgMHgwMDAwRkZGRkw7Ci0JeCBePSB6IDw8IDAyMDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDA0KSBeIHgpICYgMHgwRjBGMEYwRkw7Ci0JeSBePSB6IDw8IDAwNDsKLQl4IF49IHo7Ci0JZHN0WzBdID0geDsKLQl4ID4+PSA4OwotCWRzdFsxXSA9IHg7Ci0JeCA+Pj0gODsKLQlkc3RbMl0gPSB4OwotCXggPj49IDg7Ci0JZHN0WzNdID0geDsKLQlkc3RbNF0gPSB5OwotCXkgPj49IDg7Ci0JZHN0WzVdID0geTsKLQl5ID4+PSA4OwotCWRzdFs2XSA9IHk7Ci0JeSA+Pj0gODsKLQlkc3RbN10gPSB5OwotfQorCS8qIEsmUjogbG9uZyBpcyBhdCBsZWFzdCAzMiBiaXRzICovCisJdW5zaWduZWQgbG9uZyBhLCBiLCBjLCBkLCB3OworCWNvbnN0IHUzMiAqcHQgPSBwYzI7CiAKLXN0YXRpYyB2b2lkIGRlc19zbWFsbF9maXBzX2RlY3J5cHQodTMyICpleHBrZXksIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCi17Ci0JdTMyIHgsIHksIHo7Ci0JCi0JeCAgPSBzcmNbN107Ci0JeCA8PD0gODsKLQl4IHw9IHNyY1s2XTsKLQl4IDw8PSA4OwotCXggfD0gc3JjWzVdOwotCXggPDw9IDg7Ci0JeCB8PSBzcmNbNF07Ci0JeSAgPSBzcmNbM107Ci0JeSA8PD0gODsKLQl5IHw9IHNyY1syXTsKLQl5IDw8PSA4OwotCXkgfD0gc3JjWzFdOwotCXkgPDw9IDg7Ci0JeSB8PSBzcmNbMF07Ci0JeiAgPSAoKHggPj4gMDA0KSBeIHkpICYgMHgwRjBGMEYwRkw7Ci0JeCBePSB6IDw8IDAwNDsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDIwKSBeIHgpICYgMHgwMDAwRkZGRkw7Ci0JeSBePSB6IDw8IDAyMDsKLQl4IF49IHo7Ci0JeiAgPSAoKHggPj4gMDAyKSBeIHkpICYgMHgzMzMzMzMzM0w7Ci0JeCBePSB6IDw8IDAwMjsKLQl5IF49IHo7Ci0JeiAgPSAoKHkgPj4gMDEwKSBeIHgpICYgMHgwMEZGMDBGRkw7Ci0JeSBePSB6IDw8IDAxMDsKLQl4IF49IHo7Ci0JeCAgPSB4ID4+IDEgfCB4IDw8IDMxOwotCXogID0gKHggXiB5KSAmIDB4NTU1NTU1NTVMOwotCXkgXj0gejsKLQl4IF49IHo7Ci0JeSAgPSB5ID4+IDEgfCB5IDw8IDMxOwotCXogID0gZXhwa2V5WzMxXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMzBdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI5XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjhdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI3XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjZdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzI1XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjRdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzIzXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjJdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzIxXTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMjBdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE5XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMThdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE3XTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTZdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzE1XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTRdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzEzXTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTJdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzExXTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMTBdOwotCXogXj0geTsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzldOwotCXogXj0geDsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs4XTsKLQl6IF49IHg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVs3XTsKLQl6IF49IHk7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNl07Ci0JeiBePSB5OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbNV07Ci0JeiBePSB4OwotCXogID0geiA8PCA0IHwgeiA+PiAyODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNDQ4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDM4NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzMjApICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMjU2KSArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzRdOwotCXogXj0geDsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTkyKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDEyOCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA2NCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgZGVzX2tleW1hcCArICgweEZDICYgeikpOwotCXogID0gZXhwa2V5WzNdOwotCXogXj0geTsKLQl6ICA9IHogPDwgNCB8IHogPj4gMjg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDQ0OCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAzODQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzIwKSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDI1NikgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsyXTsKLQl6IF49IHk7Ci0JeCBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDE5MikgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXggXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxMjgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgNjQpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl4IF49ICogKHUzMiAqKSAoKHU4ICopIGRlc19rZXltYXAgKyAoMHhGQyAmIHopKTsKLQl6ICA9IGV4cGtleVsxXTsKLQl6IF49IHg7Ci0JeiAgPSB6IDw8IDQgfCB6ID4+IDI4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyA0NDgpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMzg0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDMyMCkgKyAoMHhGQyAmIHopKTsKLQl6ID4+PSA4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAyNTYpICsgKDB4RkMgJiB6KSk7Ci0JeiAgPSBleHBrZXlbMF07Ci0JeiBePSB4OwotCXkgXj0gKiAodTMyICopICgodTggKikgKGRlc19rZXltYXAgKyAxOTIpICsgKDB4RkMgJiB6KSk7Ci0JeiA+Pj0gODsKLQl5IF49ICogKHUzMiAqKSAoKHU4ICopIChkZXNfa2V5bWFwICsgMTI4KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSAoZGVzX2tleW1hcCArIDY0KSArICgweEZDICYgeikpOwotCXogPj49IDg7Ci0JeSBePSAqICh1MzIgKikgKCh1OCAqKSBkZXNfa2V5bWFwICsgKDB4RkMgJiB6KSk7Ci0JeCAgPSB4IDw8IDEgfCB4ID4+IDMxOwotCXogID0gKHggXiB5KSAmIDB4NTU1NTU1NTVMOwotCXkgXj0gejsKLQl4IF49IHo7Ci0JeSAgPSB5IDw8IDEgfCB5ID4+IDMxOwotCXogID0gKCh4ID4+IDAxMCkgXiB5KSAmIDB4MDBGRjAwRkZMOwotCXggXj0geiA8PCAwMTA7Ci0JeSBePSB6OwotCXogID0gKCh5ID4+IDAwMikgXiB4KSAmIDB4MzMzMzMzMzNMOwotCXkgXj0geiA8PCAwMDI7Ci0JeCBePSB6OwotCXogID0gKCh4ID4+IDAyMCkgXiB5KSAmIDB4MDAwMEZGRkZMOwotCXggXj0geiA8PCAwMjA7Ci0JeSBePSB6OwotCXogID0gKCh5ID4+IDAwNCkgXiB4KSAmIDB4MEYwRjBGMEZMOwotCXkgXj0geiA8PCAwMDQ7Ci0JeCBePSB6OwotCWRzdFswXSA9IHg7Ci0JeCA+Pj0gODsKLQlkc3RbMV0gPSB4OwotCXggPj49IDg7Ci0JZHN0WzJdID0geDsKLQl4ID4+PSA4OwotCWRzdFszXSA9IHg7Ci0JZHN0WzRdID0geTsKLQl5ID4+PSA4OwotCWRzdFs1XSA9IHk7Ci0JeSA+Pj0gODsKLQlkc3RbNl0gPSB5OwotCXkgPj49IDg7Ci0JZHN0WzddID0geTsKKwlkID0ga1s0XTsgZCAmPSAweDBlOyBkIDw8PSA0OyBkIHw9IGtbMF0gJiAweDFlOyBkID0gcGMxW2RdOworCWMgPSBrWzVdOyBjICY9IDB4MGU7IGMgPDw9IDQ7IGMgfD0ga1sxXSAmIDB4MWU7IGMgPSBwYzFbY107CisJYiA9IGtbNl07IGIgJj0gMHgwZTsgYiA8PD0gNDsgYiB8PSBrWzJdICYgMHgxZTsgYiA9IHBjMVtiXTsKKwlhID0ga1s3XTsgYSAmPSAweDBlOyBhIDw8PSA0OyBhIHw9IGtbM10gJiAweDFlOyBhID0gcGMxW2FdOworCisJcGVbMTUgKiAyICsgMF0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsKKwlwZVsxNCAqIDIgKyAwXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbMTMgKiAyICsgMF0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWzEyICogMiArIDBdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsxMSAqIDIgKyAwXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbMTAgKiAyICsgMF0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWyA5ICogMiArIDBdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgOCAqIDIgKyAwXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA3ICogMiArIDBdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgNiAqIDIgKyAwXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbIDUgKiAyICsgMF0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA0ICogMiArIDBdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsgMyAqIDIgKyAwXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDIgKiAyICsgMF0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWyAxICogMiArIDBdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07CisJcGVbIDAgKiAyICsgMF0gPSBQQzIoYiwgYywgZCwgYSk7CisKKwkvKiBDaGVjayBpZiBmaXJzdCBoYWxmIGlzIHdlYWsgKi8KKwl3ICA9IChhIF4gYykgfCAoYiBeIGQpIHwgKHJzW2FdIF4gYykgfCAoYiBeIHJzW2RdKTsKKworCS8qIFNraXAgdG8gbmV4dCB0YWJsZSBzZXQgKi8KKwlwdCArPSA1MTI7CisKKwlkID0ga1swXTsgZCAmPSAweGUwOyBkID4+PSA0OyBkIHw9IGtbNF0gJiAweGYwOyBkID0gcGMxW2QgKyAxXTsKKwljID0ga1sxXTsgYyAmPSAweGUwOyBjID4+PSA0OyBjIHw9IGtbNV0gJiAweGYwOyBjID0gcGMxW2MgKyAxXTsKKwliID0ga1syXTsgYiAmPSAweGUwOyBiID4+PSA0OyBiIHw9IGtbNl0gJiAweGYwOyBiID0gcGMxW2IgKyAxXTsKKwlhID0ga1szXTsgYSAmPSAweGUwOyBhID4+PSA0OyBhIHw9IGtbN10gJiAweGYwOyBhID0gcGMxW2EgKyAxXTsKKworCS8qIENoZWNrIGlmIHNlY29uZCBoYWxmIGlzIHdlYWsgKi8KKwl3IHw9IChhIF4gYykgfCAoYiBeIGQpIHwgKHJzW2FdIF4gYykgfCAoYiBeIHJzW2RdKTsKKworCXBlWzE1ICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07CisJcGVbMTQgKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWzEzICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsxMiAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbMTEgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWzEwICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgOSAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDggKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsKKwlwZVsgNyAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbIDYgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWyA1ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgNCAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbIDMgKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyAyICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsgMSAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOworCXBlWyAwICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOworCisJLyogRml4dXA6IDI0MTMgNTc2OCAtPiAxMzU3IDI0NjggKi8KKwlmb3IgKGQgPSAwOyBkIDwgMTY7ICsrZCkgeworCQlhID0gcGVbMiAqIGRdOworCQliID0gcGVbMiAqIGQgKyAxXTsKKwkJYyA9IGEgXiBiOworCQljICY9IDB4ZmZmZjAwMDA7CisJCWEgXj0gYzsKKwkJYiBePSBjOworCQlST0woYiwgMTgpOworCQlwZVsyICogZF0gPSBhOworCQlwZVsyICogZCArIDFdID0gYjsKKwl9CisKKwkvKiBaZXJvIGlmIHdlYWsga2V5ICovCisJcmV0dXJuIHc7CiB9CiAKIC8qCi0gKiBSRkMyNDUxOiBXZWFrIGtleSBjaGVja3MgU0hPVUxEIGJlIHBlcmZvcm1lZC4KKyAqIERlY3J5cHRpb24ga2V5IGV4cGFuc2lvbgorICoKKyAqIE5vIHdlYWsga2V5IGNoZWNraW5nIGlzIHBlcmZvcm1lZCwgYXMgdGhpcyBpcyBvbmx5IHVzZWQgYnkgdHJpcGxlIERFUworICoKICAqLwotc3RhdGljIGludCBzZXRrZXkodTMyICpleHBrZXksIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCitzdGF0aWMgdm9pZCBka2V5KHUzMiAqcGUsIGNvbnN0IHU4ICprKQogewotCWNvbnN0IHU4ICprOwotCXU4ICpiMCwgKmIxOwotCXUzMiBuLCB3OwotCXU4IGJpdHMwWzU2XSwgYml0czFbNTZdOworCS8qIEsmUjogbG9uZyBpcyBhdCBsZWFzdCAzMiBiaXRzICovCisJdW5zaWduZWQgbG9uZyBhLCBiLCBjLCBkOworCWNvbnN0IHUzMiAqcHQgPSBwYzI7CiAKLQluICA9IHBhcml0eVtrZXlbMF1dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVsxXV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzJdXTsgbiA8PD0gNDsKLQluIHw9IHBhcml0eVtrZXlbM11dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVs0XV07IG4gPDw9IDQ7Ci0JbiB8PSBwYXJpdHlba2V5WzVdXTsgbiA8PD0gNDsKLQluIHw9IHBhcml0eVtrZXlbNl1dOyBuIDw8PSA0OwotCW4gfD0gcGFyaXR5W2tleVs3XV07Ci0JdyA9IDB4ODg4ODg4ODhMOwotCQotCWlmICgoKmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpCi0JICAgICYmICEoKG4gLSAodyA+PiAzKSkgJiB3KSkgeyAgLyogMSBpbiAxMF4xMCBrZXlzIHBhc3NlcyB0aGlzIHRlc3QgKi8KLQkJaWYgKG4gPCAweDQxNDE1MTUxKSB7Ci0JCQlpZiAobiA8IDB4MzEzMTIxMjEpIHsKLQkJCQlpZiAobiA8IDB4MTQxNDE1MTUpIHsKLQkJCQkJLyogMDEgMDEgMDEgMDEgMDEgMDEgMDEgMDEgKi8KLQkJCQkJaWYgKG4gPT0gMHgxMTExMTExMSkgZ290byB3ZWFrOwotCQkJCQkvKiAwMSAxRiAwMSAxRiAwMSAwRSAwMSAwRSAqLwotCQkJCQlpZiAobiA9PSAweDEzMTMxMjEyKSBnb3RvIHdlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogMDEgRTAgMDEgRTAgMDEgRjEgMDEgRjEgKi8KLQkJCQkJaWYgKG4gPT0gMHgxNDE0MTUxNSkgZ290byB3ZWFrOwotCQkJCQkvKiAwMSBGRSAwMSBGRSAwMSBGRSAwMSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDE2MTYxNjE2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAobiA8IDB4MzQzNDI1MjUpIHsKLQkJCQkJLyogMUYgMDEgMUYgMDEgMEUgMDEgMEUgMDEgKi8KLQkJCQkJaWYgKG4gPT0gMHgzMTMxMjEyMSkgZ290byB3ZWFrOwotCQkJCQkvKiAxRiAxRiAxRiAxRiAwRSAwRSAwRSAwRSAoPykgKi8KLQkJCQkJaWYgKG4gPT0gMHgzMzMzMjIyMikgZ290byB3ZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIDFGIEUwIDFGIEUwIDBFIEYxIDBFIEYxICovCi0JCQkJCWlmIChuID09IDB4MzQzNDI1MjUpIGdvdG8gd2VhazsKLQkJCQkJLyogMUYgRkUgMUYgRkUgMEUgRkUgMEUgRkUgKi8KLQkJCQkJaWYgKG4gPT0gMHgzNjM2MjYyNikgZ290byB3ZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChuIDwgMHg2MTYxNjE2MSkgewotCQkJCWlmIChuIDwgMHg0NDQ0NTU1NSkgewotCQkJCQkvKiBFMCAwMSBFMCAwMSBGMSAwMSBGMSAwMSAqLwotCQkJCQlpZiAobiA9PSAweDQxNDE1MTUxKSBnb3RvIHdlYWs7Ci0JCQkJCS8qIEUwIDFGIEUwIDFGIEYxIDBFIEYxIDBFICovCi0JCQkJCWlmIChuID09IDB4NDM0MzUyNTIpIGdvdG8gd2VhazsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBFMCBFMCBFMCBFMCBGMSBGMSBGMSBGMSAoPykgKi8KLQkJCQkJaWYgKG4gPT0gMHg0NDQ0NTU1NSkgZ290byB3ZWFrOwotCQkJCQkvKiBFMCBGRSBFMCBGRSBGMSBGRSBGMSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDQ2NDY1NjU2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAobiA8IDB4NjQ2NDY1NjUpIHsKLQkJCQkJLyogRkUgMDEgRkUgMDEgRkUgMDEgRkUgMDEgKi8KLQkJCQkJaWYgKG4gPT0gMHg2MTYxNjE2MSkgZ290byB3ZWFrOwotCQkJCQkvKiBGRSAxRiBGRSAxRiBGRSAwRSBGRSAwRSAqLwotCQkJCQlpZiAobiA9PSAweDYzNjM2MjYyKSBnb3RvIHdlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogRkUgRTAgRkUgRTAgRkUgRjEgRkUgRjEgKi8KLQkJCQkJaWYgKG4gPT0gMHg2NDY0NjU2NSkgZ290byB3ZWFrOwotCQkJCQkvKiBGRSBGRSBGRSBGRSBGRSBGRSBGRSBGRSAqLwotCQkJCQlpZiAobiA9PSAweDY2NjY2NjY2KSBnb3RvIHdlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCWdvdG8gbm90X3dlYWs7Ci13ZWFrOgotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7Ci0JCXJldHVybiAtRUlOVkFMOworCWQgPSBrWzRdOyBkICY9IDB4MGU7IGQgPDw9IDQ7IGQgfD0ga1swXSAmIDB4MWU7IGQgPSBwYzFbZF07CisJYyA9IGtbNV07IGMgJj0gMHgwZTsgYyA8PD0gNDsgYyB8PSBrWzFdICYgMHgxZTsgYyA9IHBjMVtjXTsKKwliID0ga1s2XTsgYiAmPSAweDBlOyBiIDw8PSA0OyBiIHw9IGtbMl0gJiAweDFlOyBiID0gcGMxW2JdOworCWEgPSBrWzddOyBhICY9IDB4MGU7IGEgPDw9IDQ7IGEgfD0ga1szXSAmIDB4MWU7IGEgPSBwYzFbYV07CisKKwlwZVsgMCAqIDJdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07CisJcGVbIDEgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDIgKiAyXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDMgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDQgKiAyXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDUgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDYgKiAyXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDcgKiAyXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA4ICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWyA5ICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzEwICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWzExICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzEyICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWzEzICogMl0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzE0ICogMl0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsKKwlwZVsxNSAqIDJdID0gUEMyKGIsIGMsIGQsIGEpOworCisJLyogU2tpcCB0byBuZXh0IHRhYmxlIHNldCAqLworCXB0ICs9IDUxMjsKKworCWQgPSBrWzBdOyBkICY9IDB4ZTA7IGQgPj49IDQ7IGQgfD0ga1s0XSAmIDB4ZjA7IGQgPSBwYzFbZCArIDFdOworCWMgPSBrWzFdOyBjICY9IDB4ZTA7IGMgPj49IDQ7IGMgfD0ga1s1XSAmIDB4ZjA7IGMgPSBwYzFbYyArIDFdOworCWIgPSBrWzJdOyBiICY9IDB4ZTA7IGIgPj49IDQ7IGIgfD0ga1s2XSAmIDB4ZjA7IGIgPSBwYzFbYiArIDFdOworCWEgPSBrWzNdOyBhICY9IDB4ZTA7IGEgPj49IDQ7IGEgfD0ga1s3XSAmIDB4ZjA7IGEgPSBwYzFbYSArIDFdOworCisJcGVbIDAgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsKKwlwZVsgMSAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOyBiID0gcnNbYl07CisJcGVbIDIgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7IGEgPSByc1thXTsgZCA9IHJzW2RdOworCXBlWyAzICogMiArIDFdID0gUEMyKGQsIGEsIGIsIGMpOyBjID0gcnNbY107IGIgPSByc1tiXTsKKwlwZVsgNCAqIDIgKyAxXSA9IFBDMihiLCBjLCBkLCBhKTsgYSA9IHJzW2FdOyBkID0gcnNbZF07CisJcGVbIDUgKiAyICsgMV0gPSBQQzIoZCwgYSwgYiwgYyk7IGMgPSByc1tjXTsgYiA9IHJzW2JdOworCXBlWyA2ICogMiArIDFdID0gUEMyKGIsIGMsIGQsIGEpOyBhID0gcnNbYV07IGQgPSByc1tkXTsKKwlwZVsgNyAqIDIgKyAxXSA9IFBDMihkLCBhLCBiLCBjKTsgYyA9IHJzW2NdOworCXBlWyA4ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07IGEgPSByc1thXTsKKwlwZVsgOSAqIDIgKyAxXSA9IFBDMihhLCBiLCBjLCBkKTsgZCA9IHJzW2RdOyBjID0gcnNbY107CisJcGVbMTAgKiAyICsgMV0gPSBQQzIoYywgZCwgYSwgYik7IGIgPSByc1tiXTsgYSA9IHJzW2FdOworCXBlWzExICogMiArIDFdID0gUEMyKGEsIGIsIGMsIGQpOyBkID0gcnNbZF07IGMgPSByc1tjXTsKKwlwZVsxMiAqIDIgKyAxXSA9IFBDMihjLCBkLCBhLCBiKTsgYiA9IHJzW2JdOyBhID0gcnNbYV07CisJcGVbMTMgKiAyICsgMV0gPSBQQzIoYSwgYiwgYywgZCk7IGQgPSByc1tkXTsgYyA9IHJzW2NdOworCXBlWzE0ICogMiArIDFdID0gUEMyKGMsIGQsIGEsIGIpOyBiID0gcnNbYl07CisJcGVbMTUgKiAyICsgMV0gPSBQQzIoYiwgYywgZCwgYSk7CisKKwkvKiBGaXh1cDogMjQxMyA1NzY4IC0+IDEzNTcgMjQ2OCAqLworCWZvciAoZCA9IDA7IGQgPCAxNjsgKytkKSB7CisJCWEgPSBwZVsyICogZF07CisJCWIgPSBwZVsyICogZCArIDFdOworCQljID0gYSBeIGI7CisJCWMgJj0gMHhmZmZmMDAwMDsKKwkJYSBePSBjOworCQliIF49IGM7CisJCVJPTChiLCAxOCk7CisJCXBlWzIgKiBkXSA9IGE7CisJCXBlWzIgKiBkICsgMV0gPSBiOwogCX0KLQotbm90X3dlYWs6Ci0KLQkvKiBleHBsb2RlIHRoZSBiaXRzICovCi0JbiA9IDU2OwotCWIwID0gYml0czA7Ci0JYjEgPSBiaXRzMTsKLQkKLQlkbyB7Ci0JCXcgPSAoMjU2IHwgKmtleSsrKSA8PCAyOwotCQlkbyB7Ci0JCQktLW47Ci0JCQliMVtuXSA9IDggJiB3OwotCQkJdyA+Pj0gMTsKLQkJCWIwW25dID0gNCAmIHc7Ci0JCX0gd2hpbGUgKCB3ID49IDE2ICk7Ci0JfSB3aGlsZSAoIG4gKTsKLQkKLQkvKiBwdXQgdGhlIGJpdHMgaW4gdGhlIGNvcnJlY3QgcGxhY2VzICovCi0JbiA9IDE2OwotCWsgPSByb3RvcnM7Ci0JCi0JZG8gewotCQl3ICAgPSAoYjFba1sgMCAgIF1dIHwgYjBba1sgMSAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sgMiAgIF1dIHwgYjBba1sgMyAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sgNCAgIF1dIHwgYjBba1sgNSAgIF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sgNiAgIF1dIHwgYjBba1sgNyAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sgOCAgIF1dIHwgYjBba1sgOSAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sxMCAgIF1dIHwgYjBba1sxMSAgIF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sxMiAgIF1dIHwgYjBba1sxMyAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1sxNCAgIF1dIHwgYjBba1sxNSAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1sxNiAgIF1dIHwgYjBba1sxNyAgIF1dOwotCQl3IDw8PSA4OwotCQl3ICB8PSAoYjFba1sxOCAgIF1dIHwgYjBba1sxOSAgIF1dKSA8PCA0OwotCQl3ICB8PSAoYjFba1syMCAgIF1dIHwgYjBba1syMSAgIF1dKSA8PCAyOwotCQl3ICB8PSAgYjFba1syMiAgIF1dIHwgYjBba1syMyAgIF1dOwotCQlleHBrZXlbMF0gPSB3OwotCQkKLQkJdyAgID0gKGIxW2tbIDArMjRdXSB8IGIwW2tbIDErMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbIDIrMjRdXSB8IGIwW2tbIDMrMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbIDQrMjRdXSB8IGIwW2tbIDUrMjRdXTsKLQkJdyA8PD0gODsKLQkJdyAgfD0gKGIxW2tbIDYrMjRdXSB8IGIwW2tbIDcrMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbIDgrMjRdXSB8IGIwW2tbIDkrMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbMTArMjRdXSB8IGIwW2tbMTErMjRdXTsKLQkJdyA8PD0gODsKLQkJdyAgfD0gKGIxW2tbMTIrMjRdXSB8IGIwW2tbMTMrMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbMTQrMjRdXSB8IGIwW2tbMTUrMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbMTYrMjRdXSB8IGIwW2tbMTcrMjRdXTsKLQkJdyA8PD0gODsKLQkJdyAgfD0gKGIxW2tbMTgrMjRdXSB8IGIwW2tbMTkrMjRdXSkgPDwgNDsKLQkJdyAgfD0gKGIxW2tbMjArMjRdXSB8IGIwW2tbMjErMjRdXSkgPDwgMjsKLQkJdyAgfD0gIGIxW2tbMjIrMjRdXSB8IGIwW2tbMjMrMjRdXTsKLQkJCi0JCVJPUih3LCA0LCAyOCk7ICAgICAgLyogY291bGQgYmUgZWxpbWluYXRlZCAqLwotCQlleHBrZXlbMV0gPSB3OwotCi0JCWsgKz0gNDg7Ci0JCWV4cGtleSArPSAyOwotCX0gd2hpbGUgKC0tbik7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkZXNfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncykKIHsKLQlyZXR1cm4gc2V0a2V5KCgoc3RydWN0IGRlc19jdHggKiljdHgpLT5leHBrZXksIGtleSwga2V5bGVuLCBmbGFncyk7CisJc3RydWN0IGRlc19jdHggKmRjdHggPSBjdHg7CisJdTMyIHRtcFtERVNfRVhQS0VZX1dPUkRTXTsKKwlpbnQgcmV0OworCisJLyogRXhwYW5kIHRvIHRtcCAqLworCXJldCA9IGVrZXkodG1wLCBrZXkpOworCisJaWYgKHVubGlrZWx5KHJldCA9PSAwKSAmJiAoKmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpKSB7CisJCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29weSB0byBvdXRwdXQgKi8KKwltZW1jcHkoZGN0eC0+ZXhwa2V5LCB0bXAsIHNpemVvZihkY3R4LT5leHBrZXkpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkZXNfZW5jcnlwdCh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCiB7Ci0JZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdCgoKHN0cnVjdCBkZXNfY3R4ICopY3R4KS0+ZXhwa2V5LCBkc3QsIHNyYyk7CisJY29uc3QgdTMyICpLID0gKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleTsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CisKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAyKTsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgMik7CisJfQorCUZQKFIsIEwsIEEpOworCisJZFswXSA9IGNwdV90b19sZTMyKFIpOworCWRbMV0gPSBjcHVfdG9fbGUzMihMKTsKIH0KIAogc3RhdGljIHZvaWQgZGVzX2RlY3J5cHQodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQogewotCWRlc19zbWFsbF9maXBzX2RlY3J5cHQoKChzdHJ1Y3QgZGVzX2N0eCAqKWN0eCktPmV4cGtleSwgZHN0LCBzcmMpOworCWNvbnN0IHUzMiAqSyA9ICgoc3RydWN0IGRlc19jdHggKiljdHgpLT5leHBrZXkgKyBERVNfRVhQS0VZX1dPUkRTIC0gMjsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CisKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAtMik7CisJCVJPVU5EKFIsIEwsIEEsIEIsIEssIC0yKTsKKwl9CisJRlAoUiwgTCwgQSk7CisKKwlkWzBdID0gY3B1X3RvX2xlMzIoUik7CisJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCi0vKiAKKy8qCiAgKiBSRkMyNDUxOgogICoKICAqICAgRm9yIERFUy1FREUzLCB0aGVyZSBpcyBubyBrbm93biBuZWVkIHRvIHJlamVjdCB3ZWFrIG9yCkBAIC0xMTk5LDQ0ICs4NTksODYgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQgZGVzM19lZGVfc2V0a2V5KHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpCisJCQkgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKQogewotCXVuc2lnbmVkIGludCBpLCBvZmY7CisJY29uc3QgdTMyICpLID0gKGNvbnN0IHUzMiAqKWtleTsKIAlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OworCXUzMiAqZXhwa2V5ID0gZGN0eC0+ZXhwa2V5OwogCi0JaWYgKCEobWVtY21wKGtleSwgJmtleVtERVNfS0VZX1NJWkVdLCBERVNfS0VZX1NJWkUpICYmIAotCSAgICBtZW1jbXAoJmtleVtERVNfS0VZX1NJWkVdLCAma2V5W0RFU19LRVlfU0laRSAqIDJdLAotCSAgICAJCQkJCURFU19LRVlfU0laRSkpKSB7Ci0KKwlpZiAodW5saWtlbHkoISgoS1swXSBeIEtbMl0pIHwgKEtbMV0gXiBLWzNdKSkgfHwKKwkJICAgICAhKChLWzJdIF4gS1s0XSkgfCAoS1szXSBeIEtbNV0pKSkpCisJewogCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCQotCWZvciAoaSA9IDAsIG9mZiA9IDA7IGkgPCAzOyBpKyssIG9mZiArPSBERVNfRVhQS0VZX1dPUkRTLAotCQkJCQkJCWtleSArPSBERVNfS0VZX1NJWkUpIHsKLQkJaW50IHJldCA9IHNldGtleSgmZGN0eC0+ZXhwa2V5W29mZl0sIGtleSwgREVTX0tFWV9TSVpFLCBmbGFncyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9CQorCisJZWtleShleHBrZXksIGtleSk7IGV4cGtleSArPSBERVNfRVhQS0VZX1dPUkRTOyBrZXkgKz0gREVTX0tFWV9TSVpFOworCWRrZXkoZXhwa2V5LCBrZXkpOyBleHBrZXkgKz0gREVTX0VYUEtFWV9XT1JEUzsga2V5ICs9IERFU19LRVlfU0laRTsKKwlla2V5KGV4cGtleSwga2V5KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkZXMzX2VkZV9lbmNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OwotCQotCWRlc19zbWFsbF9maXBzX2VuY3J5cHQoZGN0eC0+ZXhwa2V5LCBkc3QsIHNyYyk7Ci0JZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFNdLCBkc3QsIGRzdCk7Ci0JZGVzX3NtYWxsX2ZpcHNfZW5jcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFMgKiAyXSwgZHN0LCBkc3QpOworCWNvbnN0IHUzMiAqSyA9IGRjdHgtPmV4cGtleTsKKwljb25zdCBfX2xlMzIgKnMgPSAoY29uc3QgX19sZTMyICopc3JjOworCV9fbGUzMiAqZCA9IChfX2xlMzIgKilkc3Q7CisJdTMyIEwsIFIsIEEsIEI7CisJaW50IGk7CisKKwlMID0gbGUzMl90b19jcHUoc1swXSk7CisJUiA9IGxlMzJfdG9fY3B1KHNbMV0pOworCisJSVAoTCwgUiwgQSk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlST1VORChMLCBSLCBBLCBCLCBLLCAyKTsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgMik7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIDIpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCVJPVU5EKEwsIFIsIEEsIEIsIEssIDIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAyKTsKKwl9CisJRlAoUiwgTCwgQSk7CisKKwlkWzBdID0gY3B1X3RvX2xlMzIoUik7CisJZFsxXSA9IGNwdV90b19sZTMyKEwpOwogfQogCiBzdGF0aWMgdm9pZCBkZXMzX2VkZV9kZWNyeXB0KHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAlzdHJ1Y3QgZGVzM19lZGVfY3R4ICpkY3R4ID0gY3R4OworCWNvbnN0IHUzMiAqSyA9IGRjdHgtPmV4cGtleSArIERFUzNfRURFX0VYUEtFWV9XT1JEUyAtIDI7CisJY29uc3QgX19sZTMyICpzID0gKGNvbnN0IF9fbGUzMiAqKXNyYzsKKwlfX2xlMzIgKmQgPSAoX19sZTMyICopZHN0OworCXUzMiBMLCBSLCBBLCBCOworCWludCBpOwogCi0JZGVzX3NtYWxsX2ZpcHNfZGVjcnlwdCgmZGN0eC0+ZXhwa2V5W0RFU19FWFBLRVlfV09SRFMgKiAyXSwgZHN0LCBzcmMpOwotCWRlc19zbWFsbF9maXBzX2VuY3J5cHQoJmRjdHgtPmV4cGtleVtERVNfRVhQS0VZX1dPUkRTXSwgZHN0LCBkc3QpOwotCWRlc19zbWFsbF9maXBzX2RlY3J5cHQoZGN0eC0+ZXhwa2V5LCBkc3QsIGRzdCk7CisJTCA9IGxlMzJfdG9fY3B1KHNbMF0pOworCVIgPSBsZTMyX3RvX2NwdShzWzFdKTsKKworCUlQKEwsIFIsIEEpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoTCwgUiwgQSwgQiwgSywgLTIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAtMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoUiwgTCwgQSwgQiwgSywgLTIpOworCQlST1VORChMLCBSLCBBLCBCLCBLLCAtMik7CisJfQorCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJUk9VTkQoTCwgUiwgQSwgQiwgSywgLTIpOworCQlST1VORChSLCBMLCBBLCBCLCBLLCAtMik7CisJfQorCUZQKFIsIEwsIEEpOworCisJZFswXSA9IGNwdV90b19sZTMyKFIpOworCWRbMV0gPSBjcHVfdG9fbGUzMihMKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlc19hbGcgPSB7CkBAIC0xMjQ5LDcgKzk1MSw3IEBACiAJLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7CiAJLmNpYV9taW5fa2V5c2l6ZQk9CURFU19LRVlfU0laRSwKIAkuY2lhX21heF9rZXlzaXplCT0JREVTX0tFWV9TSVpFLAotCS5jaWFfc2V0a2V5CQk9IAlkZXNfc2V0a2V5LAorCS5jaWFfc2V0a2V5CQk9CWRlc19zZXRrZXksCiAJLmNpYV9lbmNyeXB0CQk9CWRlc19lbmNyeXB0LAogCS5jaWFfZGVjcnlwdAkJPQlkZXNfZGVjcnlwdCB9IH0KIH07CkBAIC0xMjY0LDkgKzk2Niw5IEBACiAJLmNyYV91CQkJPQl7IC5jaXBoZXIgPSB7CiAJLmNpYV9taW5fa2V5c2l6ZQk9CURFUzNfRURFX0tFWV9TSVpFLAogCS5jaWFfbWF4X2tleXNpemUJPQlERVMzX0VERV9LRVlfU0laRSwKLQkuY2lhX3NldGtleQkgICAJPSAJZGVzM19lZGVfc2V0a2V5LAotCS5jaWFfZW5jcnlwdAkgCT0JZGVzM19lZGVfZW5jcnlwdCwKLQkuY2lhX2RlY3J5cHQJICAJPQlkZXMzX2VkZV9kZWNyeXB0IH0gfQorCS5jaWFfc2V0a2V5CQk9CWRlczNfZWRlX3NldGtleSwKKwkuY2lhX2VuY3J5cHQJCT0JZGVzM19lZGVfZW5jcnlwdCwKKwkuY2lhX2RlY3J5cHQJCT0JZGVzM19lZGVfZGVjcnlwdCB9IH0KIH07CiAKIE1PRFVMRV9BTElBUygiZGVzM19lZGUiKTsKQEAgLTEyNzQsNyArOTc2LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKIAlpbnQgcmV0ID0gMDsKLQkKKwogCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKQEAgLTEyODIsNyArOTg0LDcgQEAKIAlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXMzX2VkZV9hbGcpOwogCWlmIChyZXQgPCAwKQogCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOwotb3V0OgkKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjk3LDMgKzk5OSw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiREVTICYgVHJpcGxlIERFUyBFREUgQ2lwaGVyIEFsZ29yaXRobXMiKTsKK01PRFVMRV9BVVRIT1IoIkRhZyBBcm5lIE9zdmlrIDxkYUBvc3Zpay5ubz4iKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9obWFjLmMgYi9jcnlwdG8vaG1hYy5jCmluZGV4IDg0N2RmOTIuLmRhMDQ1NmIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9obWFjLmMKKysrIGIvY3J5cHRvL2htYWMuYwpAQCAtNDksOCArNDksNyBAQAogCiB2b2lkIGNyeXB0b19mcmVlX2htYWNfYmxvY2soc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKLQlpZiAodGZtLT5jcnRfZGlnZXN0LmRpdF9obWFjX2Jsb2NrKQotCQlrZnJlZSh0Zm0tPmNydF9kaWdlc3QuZGl0X2htYWNfYmxvY2spOworCWtmcmVlKHRmbS0+Y3J0X2RpZ2VzdC5kaXRfaG1hY19ibG9jayk7CiB9CiAKIHZvaWQgY3J5cHRvX2htYWNfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbikKZGlmZiAtLWdpdCBhL2NyeXB0by9pbnRlcm5hbC5oIGIvY3J5cHRvL2ludGVybmFsLmgKaW5kZXggOTY0YjlhNi4uNjg2MTI4NyAxMDA2NDQKLS0tIGEvY3J5cHRvL2ludGVybmFsLmgKKysrIGIvY3J5cHRvL2ludGVybmFsLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxhc20va21hcF90eXBlcy5oPgogCiBleHRlcm4gZW51bSBrbV90eXBlIGNyeXB0b19rbV90eXBlc1tdOwpAQCAtNDIsMjAgKzQyLDYgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqY3J5cHRvX3RmbV9jdHgoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKLXsKLQlyZXR1cm4gKHZvaWQgKikmdGZtWzFdOwotfQotCi1zdHJ1Y3QgY3J5cHRvX2FsZyAqY3J5cHRvX2FsZ19sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7Ci0KLS8qIEEgZmFyIG1vcmUgaW50ZWxsaWdlbnQgdmVyc2lvbiBvZiB0aGlzIGlzIHBsYW5uZWQuICBGb3Igbm93LCBqdXN0Ci0gKiB0cnkgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19hbGcgKmNyeXB0b19hbGdfbW9kX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQotewotCXJldHVybiB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShjcnlwdG9fYWxnX2xvb2t1cChuYW1lKSwgbmFtZSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKIGludCBjcnlwdG9fYWxsb2NfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKIHZvaWQgY3J5cHRvX2ZyZWVfaG1hY19ibG9jayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKQEAgLTc2LDYgKzYyLDMzIEBACiB7IH0KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fZGlnZXN0X2N0eHNpemUoc3RydWN0IGNyeXB0b19hbGcgKmFsZywKKwkJCQkJCSBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jaXBoZXJfY3R4c2l6ZShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnLAorCQkJCQkJIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gYWxnLT5jcmFfY3R4c2l6ZTsKKwkKKwlzd2l0Y2ggKGZsYWdzICYgQ1JZUFRPX1RGTV9NT0RFX01BU0spIHsKKwljYXNlIENSWVBUT19URk1fTU9ERV9DQkM6CisJCWxlbiA9IEFMSUdOKGxlbiwgYWxnLT5jcmFfYWxpZ25tYXNrICsgMSk7CisJCWxlbiArPSBhbGctPmNyYV9ibG9ja3NpemU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jb21wcmVzc19jdHhzaXplKHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCisJCQkJCQkgICBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGFsZy0+Y3JhX2N0eHNpemU7Cit9CisKIGludCBjcnlwdG9faW5pdF9kaWdlc3RfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKIGludCBjcnlwdG9faW5pdF9jaXBoZXJfZmxhZ3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTMyIGZsYWdzKTsKIGludCBjcnlwdG9faW5pdF9jb21wcmVzc19mbGFncyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1MzIgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NjYXR0ZXJ3YWxrLmMgYi9jcnlwdG8vc2NhdHRlcndhbGsuYwppbmRleCA1MGM5NDYxLi40N2FjOTBlIDEwMDY0NAotLS0gYS9jcnlwdG8vc2NhdHRlcndhbGsuYworKysgYi9jcnlwdG8vc2NhdHRlcndhbGsuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiBpbnQgc2NhdHRlcndhbGtfY29weWNodW5rcyh2b2lkICpidWYsIHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCiAJCQkgICBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KQogewotCWRvIHsKKwl3aGlsZSAobmJ5dGVzID4gd2Fsay0+bGVuX3RoaXNfcGFnZSkgewogCQltZW1jcHlfZGlyKGJ1Ziwgd2Fsay0+ZGF0YSwgd2Fsay0+bGVuX3RoaXNfcGFnZSwgb3V0KTsKIAkJYnVmICs9IHdhbGstPmxlbl90aGlzX3BhZ2U7CiAJCW5ieXRlcyAtPSB3YWxrLT5sZW5fdGhpc19wYWdlOwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCXNjYXR0ZXJ3YWxrX3VubWFwKHdhbGssIG91dCk7CiAJCXNjYXR0ZXJ3YWxrX3BhZ2Vkb25lKHdhbGssIG91dCwgMSk7CiAJCXNjYXR0ZXJ3YWxrX21hcCh3YWxrLCBvdXQpOwotCX0gd2hpbGUgKG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UpOworCX0KIAogCW1lbWNweV9kaXIoYnVmLCB3YWxrLT5kYXRhLCBuYnl0ZXMsIG91dCk7CiAJcmV0dXJuIG5ieXRlczsKZGlmZiAtLWdpdCBhL2NyeXB0by9zY2F0dGVyd2Fsay5oIGIvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKaW5kZXggMDJhYTU2Yy4uZTc5OTI1YyAxMDA2NDQKLS0tIGEvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKKysrIGIvY3J5cHRvL3NjYXR0ZXJ3YWxrLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogCSAgICAgICB3YWxrX2luLT5vZmZzZXQgPT0gd2Fsa19vdXQtPm9mZnNldDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2NhdHRlcndhbGtfYWNyb3NzX3BhZ2VzKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssCi0JCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2F0dGVyd2Fsa19jbGFtcChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0JcmV0dXJuIG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2U7CisJcmV0dXJuIG5ieXRlcyA+IHdhbGstPmxlbl90aGlzX3BhZ2UgPyB3YWxrLT5sZW5fdGhpc19wYWdlIDogbmJ5dGVzOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NhdHRlcndhbGtfYWR2YW5jZShzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLApAQCAtNTUsNiArNTUsMTIgQEAKIAl3YWxrLT5sZW5fdGhpc19zZWdtZW50IC09IG5ieXRlczsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2NhdHRlcndhbGtfYWxpZ25lZChzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGFsaWdubWFzaykKK3sKKwlyZXR1cm4gISh3YWxrLT5vZmZzZXQgJiBhbGlnbm1hc2spOworfQorCiB2b2lkIHNjYXR0ZXJ3YWxrX3N0YXJ0KHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpOwogaW50IHNjYXR0ZXJ3YWxrX2NvcHljaHVua3Modm9pZCAqYnVmLCBzdHJ1Y3Qgc2NhdHRlcl93YWxrICp3YWxrLCBzaXplX3QgbmJ5dGVzLCBpbnQgb3V0KTsKIHZvaWQgc2NhdHRlcndhbGtfbWFwKHN0cnVjdCBzY2F0dGVyX3dhbGsgKndhbGssIGludCBvdXQpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3NlcnBlbnQuYyBiL2NyeXB0by9zZXJwZW50LmMKaW5kZXggN2QxNTJlOC4uM2NmMmM1MCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NlcnBlbnQuYworKysgYi9jcnlwdG8vc2VycGVudC5jCkBAIC0yMTAsNyArMjEwLDYgQEAKIAl4NCBePSB4MjsKIAogc3RydWN0IHNlcnBlbnRfY3R4IHsKLQl1OCBpdltTRVJQRU5UX0JMT0NLX1NJWkVdOwogCXUzMiBleHBrZXlbU0VSUEVOVF9FWFBLRVlfV09SRFNdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9LY29uZmlnIGIvZHJpdmVycy9LY29uZmlnCmluZGV4IGFlZDRhOWIuLmNlY2FiMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvS2NvbmZpZworKysgYi9kcml2ZXJzL0tjb25maWcKQEAgLTI4LDcgKzI4LDcgQEAKIAogc291cmNlICJkcml2ZXJzL21hY2ludG9zaC9LY29uZmlnIgogCi1zb3VyY2UgIm5ldC9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL25ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvaXNkbi9LY29uZmlnIgogCkBAIC00NCw2ICs0NCw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy93MS9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvaHdtb24vS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL21pc2MvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL21lZGlhL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCAzMTY3YmU1Li4xMjZhODUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTUyLDYgKzUyLDcgQEAKIG9iai0kKENPTkZJR19JMk8pCQkrPSBtZXNzYWdlLwogb2JqLSQoQ09ORklHX0kyQykJCSs9IGkyYy8KIG9iai0kKENPTkZJR19XMSkJCSs9IHcxLworb2JqLSQoQ09ORklHX0hXTU9OKQkJKz0gaHdtb24vCiBvYmotJChDT05GSUdfUEhPTkUpCQkrPSB0ZWxlcGhvbnkvCiBvYmotJChDT05GSUdfTUQpCQkrPSBtZC8KIG9iai0kKENPTkZJR19CVCkJCSs9IGJsdWV0b290aC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggNjcwZmRiNS4uOTg2NDEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTMsNiArMyw3IEBACiAjCiAKIG1lbnUgIkFDUEkgKEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSkgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBNCiAJZGVwZW5kcyBvbiAhWDg2X1ZJU1dTCiAJZGVwZW5kcyBvbiAhSUE2NF9IUF9TSU0KIAlkZXBlbmRzIG9uIElBNjQgfHwgWDg2CkBAIC00OCwxNCArNDksMTMgQEAKIAogY29uZmlnIEFDUElfSU5URVJQUkVURVIKIAlib29sCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IHkKIAogaWYgQUNQSV9JTlRFUlBSRVRFUgogCiBjb25maWcgQUNQSV9TTEVFUAogCWJvb2wgIlNsZWVwIFN0YXRlcyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFg4NgorCWRlcGVuZHMgb24gWDg2ICYmICghU01QIHx8IFNVU1BFTkRfU01QKQogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFBNCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQpAQCAtNzksNiArNzksMTQgQEAKIAlkZXBlbmRzIG9uIEFDUElfU0xFRVAgJiYgUFJPQ19GUwogCWRlZmF1bHQgeQogCitjb25maWcgQUNQSV9TTEVFUF9QUk9DX1NMRUVQCisJYm9vbCAiL3Byb2MvYWNwaS9zbGVlcCAoZGVwcmVjYXRlZCkiCisJZGVwZW5kcyBvbiBBQ1BJX1NMRUVQX1BST0NfRlMKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBDcmVhdGUgL3Byb2MvYWNwaS9zbGVlcAorCSAgRGVwcmVjYXRlZCBieSAvc3lzL3Bvd2VyL3N0YXRlCisKIGNvbmZpZyBBQ1BJX0FDCiAJdHJpc3RhdGUgIkFDIEFkYXB0ZXIiCiAJZGVwZW5kcyBvbiBYODYKQEAgLTk5LDcgKzEwNyw2IEBACiAKIGNvbmZpZyBBQ1BJX0JVVFRPTgogCXRyaXN0YXRlICJCdXR0b24iCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IG0KIAloZWxwCiAJICBUaGlzIGRyaXZlciByZWdpc3RlcnMgZm9yIGV2ZW50cyBiYXNlZCBvbiBidXR0b25zLCBzdWNoIGFzIHRoZQpAQCAtMTExLDcgKzExOCw2IEBACiBjb25maWcgQUNQSV9WSURFTwogCXRyaXN0YXRlICJWaWRlbyIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50IHRoZSBBQ1BJIEV4dGVuc2lvbnMgRm9yIERpc3BsYXkgQWRhcHRlcnMKQEAgLTEyMiw5ICsxMjgsMTcgQEAKIAkgIE5vdGUgdGhhdCB0aGlzIGlzIGFuIHJlZi4gaW1wbGVtZW50YXRpb24gb25seS4gIEl0IG1heSBvciBtYXkgbm90IHdvcmsKIAkgIGZvciB5b3VyIGludGVncmF0ZWQgdmlkZW8gZGV2aWNlLgogCitjb25maWcgQUNQSV9IT1RLRVkKKwl0cmlzdGF0ZSAiR2VuZXJpYyBIb3RrZXkiCisJZGVwZW5kcyBvbiBBQ1BJX0lOVEVSUFJFVEVSCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgorCWRlZmF1bHQgbQorCWhlbHAKKwlBQ1BJIGdlbmVyaWMgaG90a2V5CisKIGNvbmZpZyBBQ1BJX0ZBTgogCXRyaXN0YXRlICJGYW4iCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IG0KIAloZWxwCiAJICBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIEFDUEkgZmFuIGRldmljZXMsIGFsbG93aW5nIHVzZXItbW9kZSAKQEAgLTEzMiw3ICsxNDYsNiBAQAogCiBjb25maWcgQUNQSV9QUk9DRVNTT1IKIAl0cmlzdGF0ZSAiUHJvY2Vzc29yIgotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBtCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaW5zdGFsbHMgQUNQSSBhcyB0aGUgaWRsZSBoYW5kbGVyIGZvciBMaW51eCwgYW5kIHVzZXMKQEAgLTE0Miw3ICsxNTUsNiBAQAogY29uZmlnIEFDUElfSE9UUExVR19DUFUKIAlib29sICJQcm9jZXNzb3IgSG90cGx1ZyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEFDUElfUFJPQ0VTU09SICYmIEhPVFBMVUdfQ1BVICYmIEVYUEVSSU1FTlRBTAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJc2VsZWN0IEFDUElfQ09OVEFJTkVSCiAJZGVmYXVsdCBuCiAJIC0tLWhlbHAtLS0KQEAgLTI2Miw3ICsyNzQsNiBAQAogCiBjb25maWcgQUNQSV9ERUJVRwogCWJvb2wgIkRlYnVnIFN0YXRlbWVudHMiCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGUgQUNQSSBkcml2ZXIgY2FuIG9wdGlvbmFsbHkgcmVwb3J0IGVycm9ycyB3aXRoIGEgZ3JlYXQgZGVhbApAQCAtMjcxLDcgKzI4Miw2IEBACiAKIGNvbmZpZyBBQ1BJX0JVUwogCWJvb2wKLQlkZXBlbmRzIG9uICFJQTY0X1NHSV9TTgogCWRlZmF1bHQgeQogCiBjb25maWcgQUNQSV9FQwpAQCAtMjg1LDE3ICsyOTUsMTQgQEAKIAogY29uZmlnIEFDUElfUE9XRVIKIAlib29sCi0JZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04KIAlkZWZhdWx0IHkKIAogY29uZmlnIEFDUElfUENJCiAJYm9vbAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCBQQ0kKIAogY29uZmlnIEFDUElfU1lTVEVNCiAJYm9vbAotCWRlcGVuZHMgb24gIUlBNjRfU0dJX1NOCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhpcyBkcml2ZXIgd2lsbCBlbmFibGUgeW91ciBzeXN0ZW0gdG8gc2h1dCBkb3duIHVzaW5nIEFDUEksIGFuZApAQCAtMzI3LDggKzMzNCwxMyBAQAogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCAoQUNQSV9IT1RQTFVHX01FTU9SWSB8fCBBQ1BJX0hPVFBMVUdfQ1BVIHx8IEFDUElfSE9UUExVR19JTykKIAkgLS0taGVscC0tLQotCSAJVGhpcyBpcyB0aGUgQUNQSSBnZW5lcmljIGNvbnRhaW5lciBkcml2ZXIgd2hpY2ggc3VwcG9ydHMKLQkJQUNQSTAwMDQsIFBOUDBBMDUgYW5kIFBOUDBBMDYgZGV2aWNlcworCSAgVGhpcyBhbGxvd3MgX3BoeXNpY2FsXyBpbnNlcnRpb24gYW5kIHJlbW92YWwgb2YgQ1BVcyBhbmQgbWVtb3J5LgorCSAgVGhpcyBjYW4gYmUgdXNlZnVsLCBmb3IgZXhhbXBsZSwgb24gTlVNQSBtYWNoaW5lcyB0aGF0IHN1cHBvcnQKKwkgIEFDUEkgYmFzZWQgcGh5c2ljYWwgaG90cGx1ZyBvZiBub2Rlcywgb3Igbm9uLU5VTUEgbWFjaGluZXMgdGhhdAorCSAgc3VwcG9ydCBwaHlzaWNhbCBjcHUvbWVtb3J5IGhvdC1wbHVnLgorCisJICBJZiBvbmUgc2VsZWN0cyAibSIsIHRoaXMgZHJpdmVyIGNhbiBiZSBsb2FkZWQgd2l0aAorCSAgIm1vZHByb2JlIGFjcGlfY29udGFpbmVyIi4KIAogY29uZmlnIEFDUElfSE9UUExVR19NRU1PUlkKIAl0cmlzdGF0ZSAiTWVtb3J5IEhvdHBsdWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKaW5kZXggNjVjOTJlMi4uYWQ2N2U4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQpAQCAtMzYsMTMgKzM2LDE0IEBACiBlbmRpZgogCiBvYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBzbGVlcC8KLW9iai0kKENPTkZJR19BQ1BJX0JVUykJCSs9IGJ1cy5vCitvYmotJChDT05GSUdfQUNQSV9CVVMpCQkrPSBidXMubyBnbHVlLm8KIG9iai0kKENPTkZJR19BQ1BJX0FDKSAJCSs9IGFjLm8KIG9iai0kKENPTkZJR19BQ1BJX0JBVFRFUlkpCSs9IGJhdHRlcnkubwogb2JqLSQoQ09ORklHX0FDUElfQlVUVE9OKQkrPSBidXR0b24ubwogb2JqLSQoQ09ORklHX0FDUElfRUMpCQkrPSBlYy5vCiBvYmotJChDT05GSUdfQUNQSV9GQU4pCQkrPSBmYW4ubwotb2JqLSQoQ09ORklHX0FDUElfVklERU8pCSs9IHZpZGVvLm8KK29iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vIAorb2JqLSQoQ09ORklHX0FDUElfSE9US0VZKQkrPSBob3RrZXkubwogb2JqLSQoQ09ORklHX0FDUElfUENJKQkJKz0gcGNpX3Jvb3QubyBwY2lfbGluay5vIHBjaV9pcnEubyBwY2lfYmluZC5vCiBvYmotJChDT05GSUdfQUNQSV9QT1dFUikJKz0gcG93ZXIubwogb2JqLSQoQ09ORklHX0FDUElfUFJPQ0VTU09SKQkrPSBwcm9jZXNzb3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCmluZGV4IGE3NWNiNTYuLmE1NjBiMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKQEAgLTEyMDQsNiArMTIwNCwxMCBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCl7CisJCXByaW50ayhLRVJOX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CQorCX0KIAlhc3VzX3Byb2NfZGlyID0gcHJvY19ta2RpcihQUk9DX0FTVVMsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghYXN1c19wcm9jX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkFzdXMgQUNQSTogVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggNGVkZmYxNy4uZDc3YzIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMjEyLDYgKzIxMiwxMiBAQAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1dBUk4sICJEZXZpY2UgaXMgbm90IHBvd2VyIG1hbmFnZWFibGVcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KKwkvKgorCSAqIEdldCBkZXZpY2UncyBjdXJyZW50IHBvd2VyIHN0YXRlIGlmIGl0J3MgdW5rbm93bgorCSAqIFRoaXMgbWVhbnMgZGV2aWNlIHBvd2VyIHN0YXRlIGlzbid0IGluaXRpYWxpemVkIG9yIHByZXZpb3VzIHNldHRpbmcgZmFpbGVkCisJICovCisJaWYgKGRldmljZS0+cG93ZXIuc3RhdGUgPT0gQUNQSV9TVEFURV9VTktOT1dOKQorCQlhY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsICZkZXZpY2UtPnBvd2VyLnN0YXRlKTsKIAlpZiAoc3RhdGUgPT0gZGV2aWNlLT5wb3dlci5zdGF0ZSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEZXZpY2UgaXMgYWxyZWFkeSBhdCBEJWRcbiIsIHN0YXRlKSk7CiAJCXJldHVybl9WQUxVRSgwKTsKQEAgLTIzMSw3ICsyMzcsNyBAQAogCSAqIE9uIHRyYW5zaXRpb25zIHRvIGEgaGlnaC1wb3dlcmVkIHN0YXRlIHdlIGZpcnN0IGFwcGx5IHBvd2VyICh2aWEKIAkgKiBwb3dlciByZXNvdXJjZXMpIHRoZW4gZXZhbHV0ZSBfUFN4LiAgQ29udmVyc2x5IGZvciB0cmFuc2l0aW9ucyB0bwogCSAqIGEgbG93ZXItcG93ZXJlZCBzdGF0ZS4KLQkgKi8gCisJICovCiAJaWYgKHN0YXRlIDwgZGV2aWNlLT5wb3dlci5zdGF0ZSkgewogCQlpZiAoZGV2aWNlLT5wb3dlci5mbGFncy5wb3dlcl9yZXNvdXJjZXMpIHsKIAkJCXJlc3VsdCA9IGFjcGlfcG93ZXJfdHJhbnNpdGlvbihkZXZpY2UsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCBlYzQ0MzBlLi4wZjQ1ZDQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKQEAgLTM2LDkgKzMzLDYgQEAKICNkZWZpbmUgQUNQSV9CVVRUT05fQ09NUE9ORU5UCQkweDAwMDgwMDAwCiAjZGVmaW5lIEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FCQkiQUNQSSBCdXR0b24gRHJpdmVyIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9DTEFTUwkJImJ1dHRvbiIKLSNkZWZpbmUgQUNQSV9CVVRUT05fRklMRV9JTkZPCQkiaW5mbyIKLSNkZWZpbmUgQUNQSV9CVVRUT05fRklMRV9TVEFURQkJInN0YXRlIgotI2RlZmluZSBBQ1BJX0JVVFRPTl9UWVBFX1VOS05PV04JMHgwMAogI2RlZmluZSBBQ1BJX0JVVFRPTl9OT1RJRllfU1RBVFVTCTB4ODAKIAogI2RlZmluZSBBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUgkicG93ZXIiCkBAIC03MCw4ICs2NCw2IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9idXR0b25fYWRkIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLXN0YXRpYyBpbnQgYWNwaV9idXR0b25faW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9idXR0b25fZHJpdmVyID0gewogCS5uYW1lID0JCUFDUElfQlVUVE9OX0RSSVZFUl9OQU1FLApAQCAtOTAsMTg3ICs4Miw2IEBACiAJdW5zaWduZWQgbG9uZwkJcHVzaGVkOwogfTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9idXR0b25faW5mb19mb3BzID0gewotCS5vcGVuCQk9IGFjcGlfYnV0dG9uX2luZm9fb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9idXR0b25fc3RhdGVfZm9wcyA9IHsKLQkub3BlbgkJPSBhY3BpX2J1dHRvbl9zdGF0ZV9vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi19OwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTIEludGVyZmFjZSAoL3Byb2MpCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5CSphY3BpX2J1dHRvbl9kaXI7Ci0KLXN0YXRpYyBpbnQgYWNwaV9idXR0b25faW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gKHN0cnVjdCBhY3BpX2J1dHRvbiAqKSBzZXEtPnByaXZhdGU7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9pbmZvX3NlcV9zaG93Iik7Ci0KLQlpZiAoIWJ1dHRvbiB8fCAhYnV0dG9uLT5kZXZpY2UpCi0JCXJldHVybl9WQUxVRSgwKTsKLQotCXNlcV9wcmludGYoc2VxLCAidHlwZTogICAgICAgICAgICAgICAgICAgICVzXG4iLCAKLQkJYWNwaV9kZXZpY2VfbmFtZShidXR0b24tPmRldmljZSkpOwotCi0JcmV0dXJuX1ZBTFVFKDApOwotfQotCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9idXR0b25faW5mb19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Ci19Ci0JCi1zdGF0aWMgaW50IGFjcGlfYnV0dG9uX3N0YXRlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSAoc3RydWN0IGFjcGlfYnV0dG9uICopIHNlcS0+cHJpdmF0ZTsKLQlhY3BpX3N0YXR1cwkJc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcJCXN0YXRlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fc3RhdGVfc2VxX3Nob3ciKTsKLQotCWlmICghYnV0dG9uIHx8ICFidXR0b24tPmRldmljZSkKLQkJcmV0dXJuX1ZBTFVFKDApOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGJ1dHRvbi0+aGFuZGxlLCJfTElEIixOVUxMLCZzdGF0ZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXNlcV9wcmludGYoc2VxLCAic3RhdGU6ICAgICAgdW5zdXBwb3J0ZWRcbiIpOwotCX0KLQllbHNlewotCQlzZXFfcHJpbnRmKHNlcSwgInN0YXRlOiAgICAgICVzXG4iLCAoc3RhdGUgPyAib3BlbiIgOiAiY2xvc2VkIikpOyAKLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLXN0YXRpYyBpbnQgYWNwaV9idXR0b25fc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgYWNwaV9idXR0b25fc3RhdGVfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwotfQotCi1zdGF0aWMgaW50Ci1hY3BpX2J1dHRvbl9hZGRfZnMgKAotCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2J1dHRvbgkqYnV0dG9uID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX2FkZF9mcyIpOwotCi0JaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKLQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCi0JYnV0dG9uID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCi0Jc3dpdGNoIChidXR0b24tPnR5cGUpIHsKLQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVI6Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSRjoKLQkJCWVudHJ5ID0gcHJvY19ta2RpcihBQ1BJX0JVVFRPTl9TVUJDTEFTU19QT1dFUiwgCi0JCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCQllbnRyeSA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVAsIAotCQkJCWFjcGlfYnV0dG9uX2Rpcik7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9MSUQ6Ci0JCQllbnRyeSA9IHByb2NfbWtkaXIoQUNQSV9CVVRUT05fU1VCQ0xBU1NfTElELCAKLQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIWVudHJ5KQotCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlhY3BpX2RldmljZV9kaXIoZGV2aWNlKSA9IHByb2NfbWtkaXIoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksIGVudHJ5KTsKLQlpZiAoIWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKQotCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JYWNwaV9kZXZpY2VfZGlyKGRldmljZSktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQkvKiAnaW5mbycgW1JdICovCi0JZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX0lORk8sCi0JCVNfSVJVR08sIGFjcGlfZGV2aWNlX2RpcihkZXZpY2UpKTsKLQlpZiAoIWVudHJ5KQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAotCQkJIlVuYWJsZSB0byBjcmVhdGUgJyVzJyBmcyBlbnRyeVxuIiwKLQkJCUFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOwotCWVsc2UgewotCQllbnRyeS0+cHJvY19mb3BzID0gJmFjcGlfYnV0dG9uX2luZm9fZm9wczsKLQkJZW50cnktPmRhdGEgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0JCWVudHJ5LT5vd25lciA9IFRISVNfTU9EVUxFOwotCX0KLQotCS8qIHNob3cgbGlkIHN0YXRlIFtSXSAqLwotCWlmIChidXR0b24tPnR5cGUgPT0gQUNQSV9CVVRUT05fVFlQRV9MSUQpIHsKLQkJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX1NUQVRFLAotCQkJU19JUlVHTywgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlpZiAoIWVudHJ5KQotCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKLQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSAnJXMnIGZzIGVudHJ5XG4iLAotCQkJCUFDUElfQlVUVE9OX0ZJTEVfSU5GTykpOwotCQllbHNlIHsKLQkJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmYWNwaV9idXR0b25fc3RhdGVfZm9wczsKLQkJCWVudHJ5LT5kYXRhID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCQkJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLQotc3RhdGljIGludAotYWNwaV9idXR0b25fcmVtb3ZlX2ZzICgKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKLXsKLQlzdHJ1Y3QgYWNwaV9idXR0b24JKmJ1dHRvbiA9IE5VTEw7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9yZW1vdmVfZnMiKTsKLQotCWJ1dHRvbiA9IGFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKLQlpZiAoYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpIHsKLQkJaWYgKGJ1dHRvbi0+dHlwZSA9PSBBQ1BJX0JVVFRPTl9UWVBFX0xJRCkKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX0ZJTEVfU1RBVEUsCi0JCQkJCSAgICAgYWNwaV9kZXZpY2VfZGlyKGRldmljZSkpOwotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9GSUxFX0lORk8sCi0JCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKSk7Ci0KLQkJcmVtb3ZlX3Byb2NfZW50cnkoYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCi0JCQkJICAgICBhY3BpX2RldmljZV9kaXIoZGV2aWNlKS0+cGFyZW50KTsKLQotCi0JCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7Ci0JCQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVI6Ci0JCQljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KEFDUElfQlVUVE9OX1NVQkNMQVNTX1BPV0VSLCAKLQkJCQkJYWNwaV9idXR0b25fZGlyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUDoKLQkJCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCQkJcmVtb3ZlX3Byb2NfZW50cnkoQUNQSV9CVVRUT05fU1VCQ0xBU1NfU0xFRVAsIAotCQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX0xJRDoKLQkJCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9TVUJDTEFTU19MSUQsIAotCQkJCQlhY3BpX2J1dHRvbl9kaXIpOwotCQkJCWJyZWFrOwotCQl9Ci0JCWFjcGlfZGV2aWNlX2RpcihkZXZpY2UpID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm5fVkFMVUUoMCk7Ci19Ci0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIEludGVyZmFjZQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMxMCw4ICsxMjEsNyBAQAogCQogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnV0dG9uX25vdGlmeV9maXhlZCIpOwogCi0JaWYgKCFidXR0b24pCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKKwlCVUdfT04oIWJ1dHRvbik7CiAKIAlhY3BpX2J1dHRvbl9ub3RpZnkoYnV0dG9uLT5oYW5kbGUsIEFDUElfQlVUVE9OX05PVElGWV9TVEFUVVMsIGJ1dHRvbik7CiAKQEAgLTMyNywxMCArMTM3LDYgQEAKIAlhY3BpX3N0YXR1cwkJc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfYnV0dG9uCSpidXR0b24gPSBOVUxMOwogCi0Jc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqcG93ZXJfYnV0dG9uOwotCXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNsZWVwX2J1dHRvbjsKLQlzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICpsaWRfYnV0dG9uOwotCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXR0b25fYWRkIik7CiAKIAlpZiAoIWRldmljZSkKQEAgLTM5MSw0MiArMTk3LDYgQEAKIAkJZ290byBlbmQ7CiAJfQogCi0JLyoKLQkgKiBFbnN1cmUgb25seSBvbmUgYnV0dG9uIG9mIGVhY2ggdHlwZSBpcyB1c2VkLgotCSAqLwotCXN3aXRjaCAoYnV0dG9uLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1BPV0VSOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9QT1dFUkY6Ci0JCWlmICghcG93ZXJfYnV0dG9uKQotCQkJcG93ZXJfYnV0dG9uID0gZGV2aWNlOwotCQllbHNlIHsKLQkJCWtmcmVlKGJ1dHRvbik7Ci0JCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX1NMRUVQOgotCWNhc2UgQUNQSV9CVVRUT05fVFlQRV9TTEVFUEY6Ci0JCWlmICghc2xlZXBfYnV0dG9uKQotCQkJc2xlZXBfYnV0dG9uID0gZGV2aWNlOwotCQllbHNlIHsKLQkJCWtmcmVlKGJ1dHRvbik7Ci0JCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBQ1BJX0JVVFRPTl9UWVBFX0xJRDoKLQkJaWYgKCFsaWRfYnV0dG9uKQotCQkJbGlkX2J1dHRvbiA9IGRldmljZTsKLQkJZWxzZSB7Ci0JCQlrZnJlZShidXR0b24pOwotCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfYnV0dG9uX2FkZF9mcyhkZXZpY2UpOwotCWlmIChyZXN1bHQpCi0JCWdvdG8gZW5kOwotCiAJc3dpdGNoIChidXR0b24tPnR5cGUpIHsKIAljYXNlIEFDUElfQlVUVE9OX1RZUEVfUE9XRVJGOgogCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlciAoCkBAIC00NzAsNyArMjQwLDYgQEAKIAogZW5kOgogCWlmIChyZXN1bHQpIHsKLQkJYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CiAJCWtmcmVlKGJ1dHRvbik7CiAJfQogCkBAIC01MTEsOCArMjgwLDYgQEAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKIAkJCSJFcnJvciByZW1vdmluZyBub3RpZnkgaGFuZGxlclxuIikpOwogCi0JYWNwaV9idXR0b25fcmVtb3ZlX2ZzKGRldmljZSk7CQotCiAJa2ZyZWUoYnV0dG9uKTsKIAogCXJldHVybl9WQUxVRSgwKTsKQEAgLTUyNiwyMSArMjkzLDE0IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1dHRvbl9pbml0Iik7CiAKLQlhY3BpX2J1dHRvbl9kaXIgPSBwcm9jX21rZGlyKEFDUElfQlVUVE9OX0NMQVNTLCBhY3BpX3Jvb3RfZGlyKTsKLQlpZiAoIWFjcGlfYnV0dG9uX2RpcikKLQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwotCWFjcGlfYnV0dG9uX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9idXR0b25fZHJpdmVyKTsKIAlpZiAocmVzdWx0IDwgMCkgewotCQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9DTEFTUywgYWNwaV9yb290X2Rpcik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKLQogc3RhdGljIHZvaWQgX19leGl0CiBhY3BpX2J1dHRvbl9leGl0ICh2b2lkKQogewpAQCAtNTQ4LDExICszMDgsOCBAQAogCiAJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfYnV0dG9uX2RyaXZlcik7CiAKLQlyZW1vdmVfcHJvY19lbnRyeShBQ1BJX0JVVFRPTl9DTEFTUywgYWNwaV9yb290X2Rpcik7Ci0KIAlyZXR1cm5fVk9JRDsKIH0KIAotCiBtb2R1bGVfaW5pdChhY3BpX2J1dHRvbl9pbml0KTsKIG1vZHVsZV9leGl0KGFjcGlfYnV0dG9uX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCmluZGV4IDVhMGFkYmYuLjk3MDEzZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0JcmVzdWx0ID0gYWNwaV9idXNfc2NhbigqZGV2aWNlKTsKKwlyZXN1bHQgPSBhY3BpX2J1c19zdGFydCgqZGV2aWNlKTsKIAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCmluZGV4IDI3NzkyMTEuLjg0MTkzOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKQEAgLTUzLDEzICs1MywyMCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNmaWVsZCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2dldF9maWVsZF9uYW1lcyAoCisJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICAqaW5mbywKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfYnVmZmVyX2ZpZWxkCiAgKgotICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBUaGUgb3Bjb2RlIHRvIGJlIGV4ZWN1dGVkCi0gKiAgICAgICAgICAgICAgT3BlcmFuZHMgICAgICAgICAgICAtIExpc3Qgb2Ygb3BlcmFuZHMgZm9yIHRoZSBvcGNvZGUKKyAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYXJzZSBvcCAoY3JlYXRlX3hYRmllbGQpCiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC03MCw3ICs3Nyw3IEBACiAgKiAgICAgICAgICAgICAgY3JlYXRlX3dvcmRfZmllbGRfb3AsCiAgKiAgICAgICAgICAgICAgY3JlYXRlX2R3b3JkX2ZpZWxkX29wLAogICogICAgICAgICAgICAgIGNyZWF0ZV9xd29yZF9maWVsZF9vcCwKLSAqICAgICAgICAgICAgICBjcmVhdGVfZmllbGRfb3AgICAgIChhbGwgb2Ygd2hpY2ggZGVmaW5lIGZpZWxkcyBpbiBidWZmZXJzKQorICogICAgICAgICAgICAgIGNyZWF0ZV9maWVsZF9vcCAgICAgKGFsbCBvZiB3aGljaCBkZWZpbmUgYSBmaWVsZCBpbiBhIGJ1ZmZlcikKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMTksNyArMTI2LDggQEAKIAkJCWZsYWdzID0gQUNQSV9OU19OT19VUFNFQVJDSCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFOwogCQl9CiAJCWVsc2UgewotCQkJZmxhZ3MgPSBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfCBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EOworCQkJZmxhZ3MgPSBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfAorCQkJCQlBQ1BJX05TX0VSUk9SX0lGX0ZPVU5EOwogCQl9CiAKIAkJLyoKQEAgLTEzNCwxNiArMTQyLDE2IEBACiAJCX0KIAl9CiAKLQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IgbGF0ZXIsIGJ1dAotCSAqIGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkgKiBjYW4gZ2V0IGl0IGFnYWluIGF0IHRoZSBlbmQgb2YgdGhpcyBzY29wZQorCS8qIFdlIGNvdWxkIHB1dCB0aGUgcmV0dXJuZWQgb2JqZWN0IChOb2RlKSBvbiB0aGUgb2JqZWN0IHN0YWNrIGZvciBsYXRlciwKKwkgKiBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlIHBhcnNlciB1c2VzLAorCSAqIHNvIHdlIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlCiAJICovCiAJb3AtPmNvbW1vbi5ub2RlID0gbm9kZTsKIAogCS8qCi0JICogSWYgdGhlcmUgaXMgbm8gb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlLCB0aGlzIG5vZGUgd2FzIGp1c3QgY3JlYXRlZCBhbmQKLQkgKiB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cCBvZiBhbgotCSAqIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCisJICogSWYgdGhlcmUgaXMgbm8gb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBub2RlLCB0aGlzIG5vZGUgd2FzIGp1c3QgY3JlYXRlZAorCSAqIGFuZCB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgZmllbGQgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGlzIHdhcyBhIGxvb2t1cAorCSAqIG9mIGFuIGV4aXN0aW5nIG5vZGUgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIHRoZSBmaWVsZCBvYmplY3QgYWdhaW4uCiAJICovCiAJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwogCWlmIChvYmpfZGVzYykgewpAQCAtMjA1LDcgKzIxMyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKAogCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8sCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTIzOCw3ICsyNDYsOCBAQAogCQkJCQkgKyAoYWNwaV9pbnRlZ2VyKSBhcmctPmNvbW1vbi52YWx1ZS5zaXplOwogCiAJCQlpZiAocG9zaXRpb24gPiBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJCaXQgb2Zmc2V0IHdpdGhpbiBmaWVsZCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiQml0IG9mZnNldCB3aXRoaW4gZmllbGQgdG9vIGxhcmdlICg+IDB4RkZGRkZGRkYpXG4iKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKIAkJCX0KIApAQCAtMjUwLDEyICsyNTksMTUgQEAKIAogCQkJLyoKIAkJCSAqIEdldCBhIG5ldyBhY2Nlc3NfdHlwZSBhbmQgYWNjZXNzX2F0dHJpYnV0ZSAtLSB0byBiZSB1c2VkIGZvciBhbGwKLQkJCSAqIGZpZWxkIHVuaXRzIHRoYXQgZm9sbG93LCB1bnRpbCBmaWVsZCBlbmQgb3IgYW5vdGhlciBhY2Nlc3NfYXMga2V5d29yZC4KKwkJCSAqIGZpZWxkIHVuaXRzIHRoYXQgZm9sbG93LCB1bnRpbCBmaWVsZCBlbmQgb3IgYW5vdGhlciBhY2Nlc3NfYXMKKwkJCSAqIGtleXdvcmQuCiAJCQkgKgotCQkJICogSW4gZmllbGRfZmxhZ3MsIHByZXNlcnZlIHRoZSBmbGFnIGJpdHMgb3RoZXIgdGhhbiB0aGUgQUNDRVNTX1RZUEUgYml0cworCQkJICogSW4gZmllbGRfZmxhZ3MsIHByZXNlcnZlIHRoZSBmbGFnIGJpdHMgb3RoZXIgdGhhbiB0aGUKKwkJCSAqIEFDQ0VTU19UWVBFIGJpdHMKIAkJCSAqLwotCQkJaW5mby0+ZmllbGRfZmxhZ3MgPSAodTgpICgoaW5mby0+ZmllbGRfZmxhZ3MgJiB+KEFNTF9GSUVMRF9BQ0NFU1NfVFlQRV9NQVNLKSkgfAotCQkJCQkgICgodTgpICgodTMyKSBhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyID4+IDgpKSk7CisJCQlpbmZvLT5maWVsZF9mbGFncyA9ICh1OCkKKwkJCQkoKGluZm8tPmZpZWxkX2ZsYWdzICYgfihBTUxfRklFTERfQUNDRVNTX1RZUEVfTUFTSykpIHwKKwkJCQkoKHU4KSAoKHUzMikgYXJnLT5jb21tb24udmFsdWUuaW50ZWdlciA+PiA4KSkpOwogCiAJCQlpbmZvLT5hdHRyaWJ1dGUgPSAodTgpIChhcmctPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKTsKIAkJCWJyZWFrOwpAQCAtMjY3LDcgKzI3OSw4IEBACiAKIAkJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLAogCQkJCQkgIChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsCi0JCQkJCSAgaW5mby0+ZmllbGRfdHlwZSwgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwKKwkJCQkJICBpbmZvLT5maWVsZF90eXBlLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJCSAgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCiAJCQkJCSAgd2Fsa19zdGF0ZSwgJmluZm8tPmZpZWxkX25vZGUpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCUFDUElfUkVQT1JUX05TRVJST1IgKChjaGFyICopICZhcmctPm5hbWVkLm5hbWUsIHN0YXR1cyk7CkBAIC0yOTUsOCArMzA4LDkgQEAKIAkJCQkJICsgKGFjcGlfaW50ZWdlcikgYXJnLT5jb21tb24udmFsdWUuc2l6ZTsKIAogCQkJaWYgKHBvc2l0aW9uID4gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiRmllbGQgWyU0LjRzXSBiaXQgb2Zmc2V0IHRvbyBsYXJnZSAoPiAweEZGRkZGRkZGKVxuIiwKLQkJCQkJCShjaGFyICopICZpbmZvLT5maWVsZF9ub2RlLT5uYW1lKSk7CisJCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkJIkZpZWxkIFslNC40c10gYml0IG9mZnNldCB0b28gbGFyZ2UgKD4gMHhGRkZGRkZGRilcbiIsCisJCQkJCShjaGFyICopICZpbmZvLT5maWVsZF9ub2RlLT5uYW1lKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9TVVBQT1JUKTsKIAkJCX0KIApAQCAtMzA2LDcgKzMyMCw4IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIG9wY29kZSBpbiBmaWVsZCBsaXN0OiAlWFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJJbnZhbGlkIG9wY29kZSBpbiBmaWVsZCBsaXN0OiAlWFxuIiwKIAkJCQlhcmctPmNvbW1vbi5hbWxfb3Bjb2RlKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfT1BDT0RFKTsKIAkJfQpAQCAtNDM1LDcgKzQ1MCw4IEBACiAJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKIAkJCQkJICAoY2hhciAqKSAmYXJnLT5uYW1lZC5uYW1lLAogCQkJCQkgIHR5cGUsIEFDUElfSU1PREVfTE9BRF9QQVNTMSwKLQkJCQkJICBBQ1BJX05TX05PX1VQU0VBUkNIIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUgfCBBQ1BJX05TX0VSUk9SX0lGX0ZPVU5ELAorCQkJCQkgIEFDUElfTlNfTk9fVVBTRUFSQ0ggfCBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSB8CisJCQkJCSAgQUNQSV9OU19FUlJPUl9JRl9GT1VORCwKIAkJCQkJICB3YWxrX3N0YXRlLCAmbm9kZSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJQUNQSV9SRVBPUlRfTlNFUlJPUiAoKGNoYXIgKikgJmFyZy0+bmFtZWQubmFtZSwgc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKaW5kZXggYjRkMjY0ZC4uZDc3OTBkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKQEAgLTQ5LDEyICs0OSwyMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNpbml0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZHNfaW5pdF9vbmVfb2JqZWN0ICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogIG9ial9oYW5kbGUgICAgICAtIE5vZGUKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBOb2RlIGZvciB0aGUgb2JqZWN0CiAgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGxldmVsCiAgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gUG9pbnRzIHRvIGEgaW5pdCBpbmZvIHN0cnVjdAogICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAtIE5vdCB1c2VkCkBAIC03MCw3ICs3OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19pbml0X29uZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLApAQCAtMTA1LDcgKzExNCw4IEBACiAKIAkJc3RhdHVzID0gYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbiAob2JqX2hhbmRsZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiUmVnaW9uICVwIFslNC40c10gLSBJbml0IGZhaWx1cmUsICVzXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIlJlZ2lvbiAlcCBbJTQuNHNdIC0gSW5pdCBmYWlsdXJlLCAlc1xuIiwKIAkJCQlvYmpfaGFuZGxlLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9oYW5kbGUpLAogCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQl9CkBAIC0xMTgsOCArMTI4LDEwIEBACiAKIAkJaW5mby0+bWV0aG9kX2NvdW50Kys7CiAKLQkJLyogUHJpbnQgYSBkb3QgZm9yIGVhY2ggbWV0aG9kIHVubGVzcyB3ZSBhcmUgZ29pbmcgdG8gcHJpbnQgdGhlIGVudGlyZSBwYXRobmFtZSAqLwotCisJCS8qCisJCSAqIFByaW50IGEgZG90IGZvciBlYWNoIG1ldGhvZCB1bmxlc3Mgd2UgYXJlIGdvaW5nIHRvIHByaW50CisJCSAqIHRoZSBlbnRpcmUgcGF0aG5hbWUKKwkJICovCiAJCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9JTklUX05BTUVTKSkgewogCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0lOSVQsICIuIikpOwogCQl9CkBAIC0xNDAsNyArMTUyLDggQEAKIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfZHNfcGFyc2VfbWV0aG9kIChvYmpfaGFuZGxlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJNZXRob2QgJXAgWyU0LjRzXSAtIHBhcnNlIGZhaWx1cmUsICVzXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIk1ldGhvZCAlcCBbJTQuNHNdIC0gcGFyc2UgZmFpbHVyZSwgJXNcbiIsCiAJCQkJb2JqX2hhbmRsZSwgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfaGFuZGxlKSwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIApAQCAtMTU0LDcgKzE2Nyw4IEBACiAJCSAqIGZvciBldmVyeSBleGVjdXRpb24gc2luY2UgdGhlcmUgaXNuJ3QgbXVjaCBvdmVyaGVhZAogCQkgKi8KIAkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUgKG9ial9oYW5kbGUpOwotCQlhY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb2JqX2hhbmRsZSktPm9iamVjdC0+bWV0aG9kLm93bmluZ19pZCk7CisJCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lciAoCisJCQkoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9oYW5kbGUpLT5vYmplY3QtPm1ldGhvZC5vd25pbmdfaWQpOwogCQlicmVhazsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYwppbmRleCA5ZjA0NTZjLi45ZmMzZjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKQEAgLTE1MywxMiArMTUzLDExIEBACiAJLyoKIAkgKiBQYXJzZSB0aGUgbWV0aG9kLCBmaXJzdCBwYXNzCiAJICoKLQkgKiBUaGUgZmlyc3QgcGFzcyBsb2FkIGlzIHdoZXJlIG5ld2x5IGRlY2xhcmVkIG5hbWVkIG9iamVjdHMgYXJlCi0JICogYWRkZWQgaW50byB0aGUgbmFtZXNwYWNlLiAgQWN0dWFsIGV2YWx1YXRpb24gb2YKLQkgKiB0aGUgbmFtZWQgb2JqZWN0cyAod2hhdCB3b3VsZCBiZSBjYWxsZWQgYSAic2Vjb25kCi0JICogcGFzcyIpIGhhcHBlbnMgZHVyaW5nIHRoZSBhY3R1YWwgZXhlY3V0aW9uIG9mIHRoZQotCSAqIG1ldGhvZCBzbyB0aGF0IG9wZXJhbmRzIHRvIHRoZSBuYW1lZCBvYmplY3RzIGNhbgotCSAqIHRha2Ugb24gZHluYW1pYyBydW4tdGltZSB2YWx1ZXMuCisJICogVGhlIGZpcnN0IHBhc3MgbG9hZCBpcyB3aGVyZSBuZXdseSBkZWNsYXJlZCBuYW1lZCBvYmplY3RzIGFyZSBhZGRlZCBpbnRvCisJICogdGhlIG5hbWVzcGFjZS4gIEFjdHVhbCBldmFsdWF0aW9uIG9mIHRoZSBuYW1lZCBvYmplY3RzICh3aGF0IHdvdWxkIGJlCisJICogY2FsbGVkIGEgInNlY29uZCBwYXNzIikgaGFwcGVucyBkdXJpbmcgdGhlIGFjdHVhbCBleGVjdXRpb24gb2YgdGhlCisJICogbWV0aG9kIHNvIHRoYXQgb3BlcmFuZHMgdG8gdGhlIG5hbWVkIG9iamVjdHMgY2FuIHRha2Ugb24gZHluYW1pYworCSAqIHJ1bi10aW1lIHZhbHVlcy4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbCAod2Fsa19zdGF0ZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKaW5kZXggZjMxZDA5NS4uZjc5OTgzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCkBAIC01Miw2ICs1MiwyOSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNtdGhkYXQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX21ldGhvZF9kYXRhX3NldF92YWx1ZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworYWNwaV9vYmplY3RfdHlwZQorYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKyNlbmRpZgorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjIsOCArODUsOCBAQAogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBob2xkIHRoZSBtZXRob2QncyBhcmd1bWVudHMKLSAqICAgICAgICAgICAgICBhbmQgbG9jYWxzLiAgVGhlIGRhdGEgc3RydWN0IGlzIGFuIGFycmF5IG9mIE5URXMgZm9yIGVhY2guCi0gKiAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgcmVmX29mIGFuZCBkZV9yZWZfb2YgdG8gd29yayBwcm9wZXJseSBmb3IgdGhlc2UKKyAqICAgICAgICAgICAgICBhbmQgbG9jYWxzLiAgVGhlIGRhdGEgc3RydWN0IGlzIGFuIGFycmF5IG9mIG5hbWVzcGFjZSBub2RlcyBmb3IKKyAqICAgICAgICAgICAgICBlYWNoIC0gdGhpcyBhbGxvd3MgcmVmX29mIGFuZCBkZV9yZWZfb2YgdG8gd29yayBwcm9wZXJseSBmb3IgdGhlc2UKICAqICAgICAgICAgICAgICBzcGVjaWFsIGRhdGEgdHlwZXMuCiAgKgogICogTk9URVM6ICAgICAgIHdhbGtfc3RhdGUgZmllbGRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IHRoZQpAQCAtOTIsNyArMTE1LDggQEAKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7CiAJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yICAgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLnR5cGUgICAgICAgICA9IEFDUElfVFlQRV9BTlk7Ci0JCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5mbGFncyAgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0FSRzsKKwkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLmZsYWdzICAgICAgICA9IEFOT0JKX0VORF9PRl9QRUVSX0xJU1QgfAorCQkJCSAgQU5PQkpfTUVUSE9EX0FSRzsKIAl9CiAKIAkvKiBJbml0IHRoZSBtZXRob2QgbG9jYWxzICovCkBAIC0xMDQsNyArMTI4LDggQEAKIAkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7CiAJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5kZXNjcmlwdG9yICA9IEFDUElfREVTQ19UWVBFX05BTUVEOwogCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0udHlwZSAgICAgICAgPSBBQ1BJX1RZUEVfQU5ZOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZmxhZ3MgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0xPQ0FMOworCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZmxhZ3MgICAgICAgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKKwkJCQkgQU5PQkpfTUVUSE9EX0xPQ0FMOwogCX0KIAogCXJldHVybl9WT0lEOwpAQCAtMTk4LDE1ICsyMjMsMTggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJfQogCi0JLyogQ29weSBwYXNzZWQgcGFyYW1ldGVycyBpbnRvIHRoZSBuZXcgbWV0aG9kIHN0YWNrIGZyYW1lICAqLworCS8qIENvcHkgcGFzc2VkIHBhcmFtZXRlcnMgaW50byB0aGUgbmV3IG1ldGhvZCBzdGFjayBmcmFtZSAqLwogCi0Jd2hpbGUgKChpbmRleCA8IEFDUElfTUVUSE9EX05VTV9BUkdTKSAmJiAoaW5kZXggPCBtYXhfcGFyYW1fY291bnQpICYmIHBhcmFtc1tpbmRleF0pIHsKKwl3aGlsZSAoKGluZGV4IDwgQUNQSV9NRVRIT0RfTlVNX0FSR1MpICYmCisJCSAgIChpbmRleCA8IG1heF9wYXJhbV9jb3VudCkgICAgICAmJgorCQkJcGFyYW1zW2luZGV4XSkgewogCQkvKgogCQkgKiBBIHZhbGlkIHBhcmFtZXRlci4KIAkJICogU3RvcmUgdGhlIGFyZ3VtZW50IGluIHRoZSBtZXRob2Qvd2FsayBkZXNjcmlwdG9yLgogCQkgKiBEbyBub3QgY29weSB0aGUgYXJnIGluIG9yZGVyIHRvIGltcGxlbWVudCBjYWxsIGJ5IHJlZmVyZW5jZQogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKEFNTF9BUkdfT1AsIGluZGV4LCBwYXJhbXNbaW5kZXhdLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKEFNTF9BUkdfT1AsIGluZGV4LAorCQkJCSBwYXJhbXNbaW5kZXhdLCB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0yMjQsMTEgKzI1MiwxMyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUKICAqCiAgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAotICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSB3aGljaCBsb2NhbF92YXIgb3IgYXJndW1lbnQgd2hvc2UgdHlwZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGdldAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgd2hvc2UgdHlwZSB0byBnZXQKICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgbm9kZSBpcyByZXR1cm5lZC4KICAqCi0gKiBSRVRVUk46ICAgICAgR2V0IHRoZSBOb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsIG9yIGFyZy4KKyAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIG5vZGUKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBOb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGxvY2FsIG9yIGFyZy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNDksNyArMjc5LDggQEAKIAljYXNlIEFNTF9MT0NBTF9PUDoKIAogCQlpZiAoaW5kZXggPiBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTG9jYWwgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJMb2NhbCBpbmRleCAlZCBpcyBpbnZhbGlkIChtYXggJWQpXG4iLAogCQkJCWluZGV4LCBBQ1BJX01FVEhPRF9NQVhfTE9DQUwpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVkFMSURfSU5ERVgpOwogCQl9CkBAIC0yNjIsNyArMjkzLDggQEAKIAljYXNlIEFNTF9BUkdfT1A6CiAKIAkJaWYgKGluZGV4ID4gQUNQSV9NRVRIT0RfTUFYX0FSRykgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJBcmcgaW5kZXggJWQgaXMgaW52YWxpZCAobWF4ICVkKVxuIiwKIAkJCQlpbmRleCwgQUNQSV9NRVRIT0RfTUFYX0FSRykpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9JTkRFWCk7CiAJCX0KQEAgLTI4Niw3ICszMTgsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlCiAgKgogICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBFaXRoZXIgQU1MX0xPQ0FMX09QIG9yIEFNTF9BUkdfT1AKLSAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gd2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHRvIGdldAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGljaCBMb2NhbCBvciBBcmcgdG8gZ2V0CiAgKiAgICAgICAgICAgICAgT2JqZWN0ICAgICAgICAgICAgICAtIE9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzdGFjayBlbnRyeQogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CiAgKgpAQCAtMjk3LDcgKzMyOSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCkBAIC0zNDAsNjggKzM3MiwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlCi0gKgotICogUEFSQU1FVEVSUzogIE9wY29kZSAgICAgICAgICAgICAgLSBFaXRoZXIgQU1MX0xPQ0FMX09QIG9yIEFNTF9BUkdfT1AKLSAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gd2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHdob3NlIHR5cGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQKLSAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlIG9iamVjdAotICoKLSAqIFJFVFVSTjogICAgICBEYXRhIHR5cGUgb2YgY3VycmVudCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQgQXJnIG9yIExvY2FsCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotYWNwaV9vYmplY3RfdHlwZQotYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZSAoCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQotewotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGU7Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0OwotCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUiKTsKLQotCi0JLyogR2V0IHRoZSBuYW1lc3BhY2Ugbm9kZSBmb3IgdGhlIGFyZy9sb2NhbCAqLwotCi0Jc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfbm9kZSAob3Bjb2RlLCBpbmRleCwgd2Fsa19zdGF0ZSwgJm5vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJcmV0dXJuX1ZBTFVFICgoQUNQSV9UWVBFX05PVF9GT1VORCkpOwotCX0KLQotCS8qIEdldCB0aGUgb2JqZWN0ICovCi0KLQlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG5vZGUpOwotCWlmICghb2JqZWN0KSB7Ci0JCS8qIFVuaW5pdGlhbGl6ZWQgbG9jYWwvYXJnLCByZXR1cm4gVFlQRV9BTlkgKi8KLQotCQlyZXR1cm5fVkFMVUUgKEFDUElfVFlQRV9BTlkpOwotCX0KLQotCS8qIEdldCB0aGUgb2JqZWN0IHR5cGUgKi8KLQotCXJldHVybl9WQUxVRSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9iamVjdCkpOwotfQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUKICAqCiAgKiBQQVJBTUVURVJTOiAgT3Bjb2RlICAgICAgICAgICAgICAtIEVpdGhlciBBTUxfTE9DQUxfT1Agb3IgQU1MX0FSR19PUAogICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSB3aGljaCBsb2NhbF92YXIgb3IgYXJndW1lbnQgdG8gZ2V0CiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgd2FsayBzdGF0ZSBvYmplY3QKLSAqICAgICAgICAgICAgICAqZGVzdF9kZXNjICAgICAgICAgIC0gUHRyIHRvIERlc2NyaXB0b3IgaW50byB3aGljaCBzZWxlY3RlZCBBcmcKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgTG9jYWwgdmFsdWUgc2hvdWxkIGJlIGNvcGllZAorICogICAgICAgICAgICAgIGRlc3RfZGVzYyAgICAgICAgICAgLSBXaGVyZSBBcmcgb3IgTG9jYWwgdmFsdWUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIHZhbHVlIG9mIHNlbGVjdGVkIEFyZyBvciBMb2NhbCBmcm9tIHRoZSBtZXRob2QgZnJhbWUKLSAqICAgICAgICAgICAgICBhdCB0aGUgY3VycmVudCB0b3Agb2YgdGhlIG1ldGhvZCBzdGFjay4KKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB2YWx1ZSBvZiBzZWxlY3RlZCBBcmcgb3IgTG9jYWwgZm9yIHRoaXMgbWV0aG9kCiAgKiAgICAgICAgICAgICAgVXNlZCBvbmx5IGluIGFjcGlfZXhfcmVzb2x2ZV90b192YWx1ZSgpLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NjcsMTQgKzQ0NywxNiBAQAogCQllbHNlIHN3aXRjaCAob3Bjb2RlKSB7CiAJCWNhc2UgQU1MX0FSR19PUDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJVbmluaXRpYWxpemVkIEFyZ1slZF0gYXQgbm9kZSAlcFxuIiwKIAkJCQlpbmRleCwgbm9kZSkpOwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9VTklOSVRJQUxJWkVEX0FSRyk7CiAKIAkJY2FzZSBBTUxfTE9DQUxfT1A6CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5pbml0aWFsaXplZCBMb2NhbFslZF0gYXQgbm9kZSAlcFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJVbmluaXRpYWxpemVkIExvY2FsWyVkXSBhdCBub2RlICVwXG4iLAogCQkJCWluZGV4LCBub2RlKSk7CiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpOwpAQCAtNTA2LDEyICs0ODgsMTIgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGUgdGhlIGVudHJ5IGF0IE9wY29kZTpJbmRleCBvbiB0aGUgbWV0aG9kIHN0YWNrLiAgSW5zZXJ0cworICogREVTQ1JJUFRJT046IERlbGV0ZSB0aGUgZW50cnkgYXQgT3Bjb2RlOkluZGV4LiAgSW5zZXJ0cwogICogICAgICAgICAgICAgIGEgbnVsbCBpbnRvIHRoZSBzdGFjayBzbG90IGFmdGVyIHRoZSBvYmplY3QgaXMgZGVsZXRlZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCkBAIC01NjIsNyArNTQ0LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbAogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIHdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBzZXQKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggTG9jYWwgb3IgQXJnIHRvIHNldAogICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBWYWx1ZSB0byBiZSBzdG9yZWQKICAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCB3YWxrIHN0YXRlCiAgKgpAQCAtNjUxLDE5ICs2MzMsMjAgQEAKIAkJICovCiAJCWlmIChvcGNvZGUgPT0gQU1MX0FSR19PUCkgewogCQkJLyoKLQkJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBvYmplY3QgaXMgdGhlIGNvcnJlY3QgdHlwZS4gIFRoaXMgbWF5IGJlIG92ZXJraWxsLCBidXQKLQkJCSAqIGl0IGlzIGhlcmUgYmVjYXVzZSByZWZlcmVuY2VzIHdlcmUgTlMgbm9kZXMgaW4gdGhlIHBhc3QuICBOb3cgdGhleSBhcmUKLQkJCSAqIG9wZXJhbmQgb2JqZWN0cyBvZiB0eXBlIFJlZmVyZW5jZS4KKwkJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBvYmplY3QgaXMgdGhlIGNvcnJlY3QgdHlwZS4gIFRoaXMgbWF5IGJlCisJCQkgKiBvdmVya2lsbCwgYnV0aXQgaXMgaGVyZSBiZWNhdXNlIHJlZmVyZW5jZXMgd2VyZSBOUyBub2RlcyBpbgorCQkJICogIHRoZSBwYXN0LiAgTm93IHRoZXkgYXJlIG9wZXJhbmQgb2JqZWN0cyBvZiB0eXBlIFJlZmVyZW5jZS4KIAkJCSAqLwogCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoY3VycmVudF9vYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewotCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgZGVzY3JpcHRvciB0eXBlIHdoaWxlIHN0b3JpbmcgdG8gbWV0aG9kIGFyZzogWyVzXVxuIiwKLQkJCQkJCWFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAoY3VycmVudF9vYmpfZGVzYykpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiSW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgd2hpbGUgc3RvcmluZyB0byBtZXRob2QgYXJnOiBbJXNdXG4iLAorCQkJCQlhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGN1cnJlbnRfb2JqX2Rlc2MpKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwogCQkJfQogCiAJCQkvKgotCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSBvYmplY3QgdGhhdCBjYW1lIGZyb20gcmVmX29mKCksIGRvIHRoZQotCQkJICogaW5kaXJlY3Qgc3RvcmUKKwkJCSAqIElmIHdlIGhhdmUgYSB2YWxpZCByZWZlcmVuY2Ugb2JqZWN0IHRoYXQgY2FtZSBmcm9tIHJlZl9vZigpLAorCQkJICogZG8gdGhlIGluZGlyZWN0IHN0b3JlCiAJCQkgKi8KIAkJCWlmICgoY3VycmVudF9vYmpfZGVzYy0+Y29tbW9uLnR5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYKIAkJCQkoY3VycmVudF9vYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfUkVGX09GX09QKSkgewpAQCAtNzEzLDMgKzY5Niw1NSBAQAogfQogCiAKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdHlwZQorICoKKyAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCisgKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoaWNoIExvY2FsIG9yIEFyZyB3aG9zZSB0eXBlIHRvIGdldAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CisgKgorICogUkVUVVJOOiAgICAgIERhdGEgdHlwZSBvZiBjdXJyZW50IHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBBcmcgb3IgTG9jYWwKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSB0eXBlIG9mIHRoZSBvYmplY3Qgc3RvcmVkIGluIHRoZSBMb2NhbCBvciBBcmcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX29iamVjdF90eXBlCithY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlICgKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpCit7CisJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3Q7CisKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJkc19tZXRob2RfZGF0YV9nZXRfdHlwZSIpOworCisKKwkvKiBHZXQgdGhlIG5hbWVzcGFjZSBub2RlIGZvciB0aGUgYXJnL2xvY2FsICovCisKKwlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChvcGNvZGUsIGluZGV4LCB3YWxrX3N0YXRlLCAmbm9kZSk7CisJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgeworCQlyZXR1cm5fVkFMVUUgKChBQ1BJX1RZUEVfTk9UX0ZPVU5EKSk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgKi8KKworCW9iamVjdCA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CisJaWYgKCFvYmplY3QpIHsKKwkJLyogVW5pbml0aWFsaXplZCBsb2NhbC9hcmcsIHJldHVybiBUWVBFX0FOWSAqLworCisJCXJldHVybl9WQUxVRSAoQUNQSV9UWVBFX0FOWSk7CisJfQorCisJLyogR2V0IHRoZSBvYmplY3QgdHlwZSAqLworCisJcmV0dXJuX1ZBTFVFIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqZWN0KSk7Cit9CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYwppbmRleCBlYjhhZjQ3Li5iZmJhZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKQEAgLTUyLDkgKzUyLDE1IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9ESVNQQVRDSEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc29iamVjdCIpCiAKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjX3B0cik7CisKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QKICAqCkBAIC02Nyw5ICs3Myw5IEBACiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIG9iamVjdCB0byB0aGUgZXF1aXZhbGVudCBuYW1lc3BhY2Ugb2JqZWN0CiAgKiAgICAgICAgICAgICAgU2ltcGxlIG9iamVjdHMgYXJlIGFueSBvYmplY3RzIG90aGVyIHRoYW4gYSBwYWNrYWdlIG9iamVjdCEKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLApAQCAtOTAsOSArOTYsMTEgQEAKIAkJICogT3RoZXJ3aXNlLCBnbyBhaGVhZCBhbmQgbG9vayBpdCB1cCBub3cKIAkJICovCiAJCWlmICghb3AtPmNvbW1vbi5ub2RlKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgb3AtPmNvbW1vbi52YWx1ZS5zdHJpbmcsCisJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywKKwkJCQkJICBvcC0+Y29tbW9uLnZhbHVlLnN0cmluZywKIAkJCQkJICBBQ1BJX1RZUEVfQU5ZLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCi0JCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsCisJCQkJCSAgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsCisJCQkJCSAgTlVMTCwKIAkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICYob3AtPmNvbW1vbi5ub2RlKSk7CiAKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTEwNCwxMiArMTEyLDE0IEBACiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgdGhlIGludGVybmFsIEFDUEkgb2JqZWN0ICovCiAKLQlvYmpfZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoKGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGUpOworCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgKKwkJCSAoYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24uYW1sX29wY29kZSkpLT5vYmplY3RfdHlwZSk7CiAJaWYgKCFvYmpfZGVzYykgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICh3YWxrX3N0YXRlLCBvcCwgb3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCAmb2JqX2Rlc2MpOworCXN0YXR1cyA9IGFjcGlfZHNfaW5pdF9vYmplY3RfZnJvbV9vcCAod2Fsa19zdGF0ZSwgb3AsIG9wLT5jb21tb24uYW1sX29wY29kZSwKKwkJCSAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChvYmpfZGVzYyk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTEyMCw3ICsxMzAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19idWlsZF9pbnRlcm5hbF9idWZmZXJfb2JqCiAgKgpAQCAtMTM0LDcgKzE0NCw3IEBACiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgcGFyc2VyIE9wIHBhY2thZ2Ugb2JqZWN0IHRvIHRoZSBlcXVpdmFsZW50CiAgKiAgICAgICAgICAgICAgbmFtZXNwYWNlIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfYnVmZmVyX29iaiAoCkBAIC0yMjksNyArMjM5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfcGFja2FnZV9vYmoKICAqCkBAIC0yNDMsNyArMjUzLDcgQEAKICAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBwYXJzZXIgT3AgcGFja2FnZSBvYmplY3QgdG8gdGhlIGVxdWl2YWxlbnQKICAqICAgICAgICAgICAgICBuYW1lc3BhY2Ugb2JqZWN0CiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaiAoCkBAIC0zMzEsMTEgKzM0MSwxMiBAQAogCQlpZiAoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCkgewogCQkJLyogT2JqZWN0IChwYWNrYWdlIG9yIGJ1ZmZlcikgaXMgYWxyZWFkeSBidWlsdCAqLwogCi0JCQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFyZy0+Y29tbW9uLm5vZGUpOworCQkJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0gPQorCQkJCUFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIGFyZy0+Y29tbW9uLm5vZGUpOwogCQl9CiAJCWVsc2UgewogCQkJc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKHdhbGtfc3RhdGUsIGFyZywKLQkJCQkJICAmb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0pOworCQkJCQkgJm9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzW2ldKTsKIAkJfQogCiAJCWkrKzsKQEAgLTM0OCw3ICszNTksNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19jcmVhdGVfbm9kZQogICoKQEAgLTM2MCw3ICszNzEsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgdGhlIG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBuYW1lc3BhY2Ugbm9kZQogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfY3JlYXRlX25vZGUgKApAQCAtMzkyLDcgKzQwMyw4IEBACiAKIAkvKiBCdWlsZCBhbiBpbnRlcm5hbCBvYmplY3QgZm9yIHRoZSBhcmd1bWVudChzKSAqLwogCi0Jc3RhdHVzID0gYWNwaV9kc19idWlsZF9pbnRlcm5hbF9vYmplY3QgKHdhbGtfc3RhdGUsIG9wLT5jb21tb24udmFsdWUuYXJnLCAmb2JqX2Rlc2MpOworCXN0YXR1cyA9IGFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICh3YWxrX3N0YXRlLCBvcC0+Y29tbW9uLnZhbHVlLmFyZywKKwkJCSAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTQxNCw3ICs0MjYsNyBAQAogI2VuZGlmIC8qIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTiAqLwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wCiAgKgpAQCAtNDI5LDcgKzQ0MSw3IEBACiAgKiAgICAgICAgICAgICAgYXNzb2NpYXRlZCBhcmd1bWVudHMuICBUaGUgbmFtZXNwYWNlIG9iamVjdCBpcyBhIG1vcmUgY29tcGFjdAogICogICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBPcCBhbmQgaXRzIGFyZ3VtZW50cy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3AgKApAQCAtNDYyLDcgKzQ3NCw4IEBACiAJCS8qCiAJCSAqIERlZmVyIGV2YWx1YXRpb24gb2YgQnVmZmVyIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5idWZmZXIubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJCW9ial9kZXNjLT5idWZmZXIubm9kZSAgICAgPSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkgICB3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5hbWxfbGVuZ3RoID0gb3AtPm5hbWVkLmxlbmd0aDsKIAkJYnJlYWs7CkBAIC00NzMsNyArNDg2LDggQEAKIAkJLyoKIAkJICogRGVmZXIgZXZhbHVhdGlvbiBvZiBQYWNrYWdlIHRlcm1fYXJnIG9wZXJhbmQKIAkJICovCi0JCW9ial9kZXNjLT5wYWNrYWdlLm5vZGUgICAgID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOworCQlvYmpfZGVzYy0+cGFja2FnZS5ub2RlICAgICA9IChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKQorCQkJCSAgIHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCQlvYmpfZGVzYy0+cGFja2FnZS5hbWxfc3RhcnQgPSBvcC0+bmFtZWQuZGF0YTsKIAkJb2JqX2Rlc2MtPnBhY2thZ2UuYW1sX2xlbmd0aCA9IG9wLT5uYW1lZC5sZW5ndGg7CiAJCWJyZWFrOwpAQCAtNDg2LDkgKzUwMCwxMCBAQAogCQkJLyoKIAkJCSAqIFJlc29sdmUgQU1MIENvbnN0YW50cyBoZXJlIC0gQU5EIE9OTFkgSEVSRSEKIAkJCSAqIEFsbCBjb25zdGFudHMgYXJlIGludGVnZXJzLgotCQkJICogV2UgbWFyayB0aGUgaW50ZWdlciB3aXRoIGEgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0IHN0YXJ0ZWQgbGlmZQotCQkJICogYXMgYSBjb25zdGFudCAtLSBzbyB0aGF0IHN0b3JlcyB0byBjb25zdGFudHMgd2lsbCBwZXJmb3JtIGFzIGV4cGVjdGVkIChub29wKS4KLQkJCSAqICh6ZXJvX29wIGlzIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3Igb3B0aW9uYWwgdGFyZ2V0IG9wZXJhbmRzLikKKwkJCSAqIFdlIG1hcmsgdGhlIGludGVnZXIgd2l0aCBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdCBzdGFydGVkCisJCQkgKiBsaWZlIGFzIGEgY29uc3RhbnQgLS0gc28gdGhhdCBzdG9yZXMgdG8gY29uc3RhbnRzIHdpbGwgcGVyZm9ybQorCQkJICogYXMgZXhwZWN0ZWQgKG5vb3ApLiB6ZXJvX29wIGlzIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3Igb3B0aW9uYWwKKwkJCSAqIHRhcmdldCBvcGVyYW5kcy4KIAkJCSAqLwogCQkJb2JqX2Rlc2MtPmNvbW1vbi5mbGFncyA9IEFPUE9CSl9BTUxfQ09OU1RBTlQ7CiAKQEAgLTUyMSw3ICs1MzYsOCBAQAogCiAJCQlkZWZhdWx0OgogCi0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWFxuIiwgb3Bjb2RlKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJCSJVbmtub3duIGNvbnN0YW50IG9wY29kZSAlWFxuIiwgb3Bjb2RlKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTUzNSw3ICs1NTEsOCBAQAogCiAKIAkJZGVmYXVsdDoKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBJbnRlZ2VyIHR5cGUgJVhcbiIsIG9wX2luZm8tPnR5cGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBJbnRlZ2VyIHR5cGUgJVhcbiIsCisJCQkJb3BfaW5mby0+dHlwZSkpOwogCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCWJyZWFrOwogCQl9CkBAIC01NzAsOCArNTg3LDEwIEBACiAJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9IG9wY29kZSAtIEFNTF9MT0NBTF9PUDsKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKEFNTF9MT0NBTF9PUCwgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsCi0JCQkJCSB3YWxrX3N0YXRlLCAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfTE9DQUxfT1AsCisJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJIHdhbGtfc3RhdGUsCisJCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAjZW5kaWYKIAkJCWJyZWFrOwogCkBAIC01ODQsOCArNjAzLDEwIEBACiAJCQlvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9IG9wY29kZSAtIEFNTF9BUkdfT1A7CiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0JCQlzdGF0dXMgPSBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF9ub2RlIChBTUxfQVJHX09QLCBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKLQkJCQkJIHdhbGtfc3RhdGUsIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKikgJm9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKKwkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUgKEFNTF9BUkdfT1AsCisJCQkJCSBvYmpfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKKwkJCQkJIHdhbGtfc3RhdGUsCisJCQkJCSAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKiopICZvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAjZW5kaWYKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYwppbmRleCA1Yzk4N2EwLi5iYTEzYmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKQEAgLTU0LDEyICs1NCwzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHNvcGNvZGUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlX25vZGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfbGVuZ3RoLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbF9zdGFydCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9kc19pbml0X2J1ZmZlcl9maWVsZCAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmJ1ZmZlcl9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9mZnNldF9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmxlbmd0aF9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJlc3VsdF9kZXNjKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzCiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBQYXJlbnQgTlMgbm9kZQorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBPYmplY3QgTlMgbm9kZQorICogICAgICAgICAgICAgIHNjb3BlX25vZGUgICAgICAgICAgLSBQYXJlbnQgTlMgbm9kZQogICogICAgICAgICAgICAgIGFtbF9sZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgZXhlY3V0YWJsZSBBTUwKICAqICAgICAgICAgICAgICBhbWxfc3RhcnQgICAgICAgICAgIC0gUG9pbnRlciB0byB0aGUgQU1MCiAgKgpAQCAtNjcsOSArODYsOSBAQAogICoKICAqIERFU0NSSVBUSU9OOiBMYXRlIChkZWZlcnJlZCkgZXhlY3V0aW9uIG9mIHJlZ2lvbiBvciBmaWVsZCBhcmd1bWVudHMKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc2NvcGVfbm9kZSwKQEAgLTE2Miw3ICsxODEsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfYnVmZmVyX2ZpZWxkX2FyZ3VtZW50cwogICoKQEAgLTE3Myw3ICsxOTIsNyBAQAogICogREVTQ1JJUFRJT046IEdldCBidWZmZXJfZmllbGQgQnVmZmVyIGFuZCBJbmRleC4gVGhpcyBpbXBsZW1lbnRzIHRoZSBsYXRlCiAgKiAgICAgICAgICAgICAgZXZhbHVhdGlvbiBvZiB0aGVzZSBmaWVsZCBhdHRyaWJ1dGVzLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMgKApAQCAtMjA4LDcgKzIyNyw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzCiAgKgpAQCAtMjE5LDcgKzIzOCw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IEJ1ZmZlciBsZW5ndGggYW5kIGluaXRpYWxpemVyIGJ5dGUgbGlzdC4gIFRoaXMgaW1wbGVtZW50cwogICogICAgICAgICAgICAgIHRoZSBsYXRlIGV2YWx1YXRpb24gb2YgdGhlc2UgYXR0cmlidXRlcy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2dldF9idWZmZXJfYXJndW1lbnRzICgKQEAgLTI1NSw3ICsyNzQsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMKICAqCkBAIC0yNjYsNyArMjg1LDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgUGFja2FnZSBsZW5ndGggYW5kIGluaXRpYWxpemVyIGJ5dGUgbGlzdC4gIFRoaXMgaW1wbGVtZW50cwogICogICAgICAgICAgICAgIHRoZSBsYXRlIGV2YWx1YXRpb24gb2YgdGhlc2UgYXR0cmlidXRlcy4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyAoCkBAIC0zNTMsMTcgKzM3MiwxNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19pbml0aWFsaXplX3JlZ2lvbgogICoKLSAqIFBBUkFNRVRFUlM6ICBPcCAgICAgICAgICAgICAgLSBBIHZhbGlkIHJlZ2lvbiBPcCBvYmplY3QKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgLSBSZWdpb24gbmFtZXNwYWNlIG5vZGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IEZyb250IGVuZCB0byBldl9pbml0aWFsaXplX3JlZ2lvbgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfaW5pdGlhbGl6ZV9yZWdpb24gKApAQCAtMzgyLDcgKzQwMSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkCiAgKgpAQCAtMzkwLDE2ICs0MDksMTYgQEAKICAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBidWZmZXJfZmllbGQgb2JqZWN0CiAgKiAgICAgICAgICAgICAgYnVmZmVyX2Rlc2MgICAgIC0gSG9zdCBCdWZmZXIKICAqICAgICAgICAgICAgICBvZmZzZXRfZGVzYyAgICAgLSBPZmZzZXQgaW50byBidWZmZXIKLSAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgLSBMZW5ndGggb2YgZmllbGQgKENSRUFURV9GSUVMRF9PUCBvbmx5KQotICogICAgICAgICAgICAgIFJlc3VsdCAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAqICAgICAgICAgICAgICBsZW5ndGhfZGVzYyAgICAgLSBMZW5ndGggb2YgZmllbGQgKENSRUFURV9GSUVMRF9PUCBvbmx5KQorICogICAgICAgICAgICAgIHJlc3VsdF9kZXNjICAgICAtIFdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFBlcmZvcm0gYWN0dWFsIGluaXRpYWxpemF0aW9uIG9mIGEgYnVmZmVyIGZpZWxkCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkICgKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC00MzUsOCArNDU0LDEwIEBACiAJICogYWZ0ZXIgcmVzb2x1dGlvbiBpbiBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMoKS4KIAkgKi8KIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChyZXN1bHRfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXVxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoYW1sX29wY29kZSksIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAocmVzdWx0X2Rlc2MpKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSIoJXMpIGRlc3RpbmF0aW9uIG5vdCBhIE5TIE5vZGUgWyVzXVxuIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoYW1sX29wY29kZSksCisJCQkJYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lIChyZXN1bHRfZGVzYykpKTsKIAogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCQlnb3RvIGNsZWFudXA7CkBAIC00NTIsOSArNDczLDE4IEBACiAKIAkJLyogT2Zmc2V0IGlzIGluIGJpdHMsIGNvdW50IGlzIGluIGJpdHMgKi8KIAorCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKIAkJYml0X29mZnNldCA9IG9mZnNldDsKIAkJYml0X2NvdW50ICA9ICh1MzIpIGxlbmd0aF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwotCQlmaWVsZF9mbGFncyA9IEFNTF9GSUVMRF9BQ0NFU1NfQllURTsKKworCQkvKiBNdXN0IGhhdmUgYSB2YWxpZCAoPjApIGJpdCBjb3VudCAqLworCisJCWlmIChiaXRfY291bnQgPT0gMCkgeworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkF0dGVtcHQgdG8gY3JlYXRlX2ZpZWxkIG9mIGxlbmd0aCAwXG4iKSk7CisJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9WQUxVRTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQU1MX0NSRUFURV9CSVRfRklFTERfT1A6CkBAIC01MjcsNyArNTU3LDggQEAKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBhcmVhcyBvZiB0aGUgZmllbGQgb2JqZWN0IHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgZmllbGRzCi0JICogRm9yIGZpZWxkX2ZsYWdzLCB1c2UgTE9DS19SVUxFID0gMCAoTk9fTE9DSyksIFVQREFURV9SVUxFID0gMCAoVVBEQVRFX1BSRVNFUlZFKQorCSAqIEZvciBmaWVsZF9mbGFncywgdXNlIExPQ0tfUlVMRSA9IDAgKE5PX0xPQ0spLAorCSAqIFVQREFURV9SVUxFID0gMCAoVVBEQVRFX1BSRVNFUlZFKQogCSAqLwogCXN0YXR1cyA9IGFjcGlfZXhfcHJlcF9jb21tb25fZmllbGRfb2JqZWN0IChvYmpfZGVzYywgZmllbGRfZmxhZ3MsIDAsCiAJCQkgIGJpdF9vZmZzZXQsIGJpdF9jb3VudCk7CkBAIC01MzksOCArNTcwLDggQEAKIAogCS8qIFJlZmVyZW5jZSBjb3VudCBmb3IgYnVmZmVyX2Rlc2MgaW5oZXJpdHMgb2JqX2Rlc2MgY291bnQgKi8KIAotCWJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gKHUxNikgKGJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ICsKLQkJCSAgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCWJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ID0gKHUxNikKKwkJKGJ1ZmZlcl9kZXNjLT5jb21tb24ucmVmZXJlbmNlX2NvdW50ICsgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCiAKIGNsZWFudXA6CkBAIC01NjksNyArNjAwLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9idWZmZXJfZmllbGRfb3BlcmFuZHMKICAqCkBAIC01ODEsNyArNjEyLDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgYnVmZmVyX2ZpZWxkIEJ1ZmZlciBhbmQgSW5kZXgKICAqICAgICAgICAgICAgICBDYWxsZWQgZnJvbSBhY3BpX2RzX2V4ZWNfZW5kX29wIGR1cmluZyBidWZmZXJfZmllbGQgcGFyc2UgdHJlZSB3YWxrCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyAoCkBAIC02NTYsNyArNjg3LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9yZWdpb25fb3BlcmFuZHMKICAqCkBAIC02NjgsNyArNjk5LDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZXQgcmVnaW9uIGFkZHJlc3MgYW5kIGxlbmd0aAogICogICAgICAgICAgICAgIENhbGxlZCBmcm9tIGFjcGlfZHNfZXhlY19lbmRfb3AgZHVyaW5nIG9wX3JlZ2lvbiBwYXJzZSB0cmVlIHdhbGsKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2V2YWxfcmVnaW9uX29wZXJhbmRzICgKQEAgLTY4Niw3ICs3MTcsOCBAQAogCiAKIAkvKgotCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlIG9wX3JlZ2lvbiBkZWNsYXJhdGlvbgorCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlCisJICogb3BfcmVnaW9uIGRlY2xhcmF0aW9uCiAJICovCiAJbm9kZSA9ICBvcC0+Y29tbW9uLm5vZGU7CiAKQEAgLTcwNyw3ICs3MzksOCBAQAogCiAJLyogUmVzb2x2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9wZXJhbmRzIHRvIG51bWJlcnMgKi8KIAotCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLCBBQ1BJX1dBTEtfT1BFUkFORFMsIHdhbGtfc3RhdGUpOworCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlLAorCQkJIEFDUElfV0FMS19PUEVSQU5EUywgd2Fsa19zdGF0ZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtNzM2LDcgKzc2OSw4IEBACiAJICovCiAJb3BlcmFuZF9kZXNjID0gd2Fsa19zdGF0ZS0+b3BlcmFuZHNbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gMl07CiAKLQlvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBvcGVyYW5kX2Rlc2MtPmludGVnZXIudmFsdWU7CisJb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzID0gKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykKKwkJCSAgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob3BlcmFuZF9kZXNjKTsKIAogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJyZ25fb2JqICVwIEFkZHIgJTguOFglOC44WCBMZW4gJVhcbiIsCkBAIC03NTIsNyArNzg2LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcwogICoKQEAgLTc2NSw3ICs3OTksNyBAQAogICogREVTQ1JJUFRJT046IEdldCB0aGUgb3BlcmFuZHMgYW5kIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZGF0YSBvYmplY3QgdHlwZXM6CiAgKiAgICAgICAgICAgICAgQnVmZmVyLCBQYWNrYWdlLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyAoCkBAIC04MzAsNyArODY0LDcgQEAKIAogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJLyoKLQkJICogUmV0dXJuIHRoZSBvYmplY3QgaW4gdGhlIHdhbGtfc3RhdGUsIHVubGVzcyB0aGUgcGFyZW50IGlzIGEgcGFja2FnZSAtLQorCQkgKiBSZXR1cm4gdGhlIG9iamVjdCBpbiB0aGUgd2Fsa19zdGF0ZSwgdW5sZXNzIHRoZSBwYXJlbnQgaXMgYSBwYWNrYWdlIC0KIAkJICogaW4gdGhpcyBjYXNlLCB0aGUgcmV0dXJuIG9iamVjdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcGFyc2UgdHJlZQogCQkgKiBmb3IgdGhlIHBhY2thZ2UuCiAJCSAqLwpAQCAtOTg4LDcgKzEwMjIsOCBAQAogCQkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCQl9CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJbV0hJTEVfT1BdIHRlcm1pbmF0aW9uISBPcD0lcFxuIiwgb3ApKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCQkiW1dISUxFX09QXSB0ZXJtaW5hdGlvbiEgT3A9JXBcbiIsb3ApKTsKIAogCQkvKiBQb3AgdGhpcyBjb250cm9sIHN0YXRlIGFuZCBmcmVlIGl0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwppbmRleCA0NjJjNWQ4Li45NjEzMzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCkBAIC0xMDAsNyArMTAwLDYgQEAKIAogCiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybgpAQCAtMjA1LDcgKzIwNCw3IEBACiAJICogTk9URTogdGhpcyBpcyBvcHRpb25hbCBiZWNhdXNlIHRoZSBBU0wgbGFuZ3VhZ2UgZG9lcyBub3QgYWN0dWFsbHkKIAkgKiBzdXBwb3J0IHRoaXMgYmVoYXZpb3IuCiAJICovCi0JYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4gKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUsIFRSVUUpOworCSh2b2lkKSBhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSwgVFJVRSk7CiAKIAkvKgogCSAqIE5vdyBkZXRlcm1pbmUgaWYgdGhlIHBhcmVudCB3aWxsIHVzZSB0aGUgcmVzdWx0CkBAIC0yMTksOCArMjE4LDkgQEAKIAkJKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfU0NPUEVfT1ApKSB7CiAJCS8qIE5vIHBhcmVudCwgdGhlIHJldHVybiB2YWx1ZSBjYW5ub3QgcG9zc2libHkgYmUgdXNlZCAqLwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiQXQgTWV0aG9kIGxldmVsLCByZXN1bHQgb2YgWyVzXSBub3QgdXNlZFxuIiwKLQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCSJBdCBNZXRob2QgbGV2ZWwsIHJlc3VsdCBvZiBbJXNdIG5vdCB1c2VkXG4iLAorCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSkpKTsKIAkJcmV0dXJuX1ZBTFVFIChGQUxTRSk7CiAJfQogCkBAIC0yMjgsNyArMjI4LDggQEAKIAogCXBhcmVudF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSk7CiAJaWYgKHBhcmVudF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gcGFyZW50IG9wY29kZS4gT3A9JXBcbiIsIG9wKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIlVua25vd24gcGFyZW50IG9wY29kZS4gT3A9JXBcbiIsIG9wKSk7CiAJCXJldHVybl9WQUxVRSAoRkFMU0UpOwogCX0KIApAQCAtMzA5LDE3ICszMTAsMTkgQEAKIAogCiByZXN1bHRfdXNlZDoKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIlJlc3VsdCBvZiBbJXNdIHVzZWQgYnkgUGFyZW50IFslc10gT3A9JXBcbiIsCi0JCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkiUmVzdWx0IG9mIFslc10gdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOwogCiAJcmV0dXJuX1ZBTFVFIChUUlVFKTsKIAogCiByZXN1bHRfbm90X3VzZWQ6Ci0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJSZXN1bHQgb2YgWyVzXSBub3QgdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKLQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAotCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24uYW1sX29wY29kZSksIG9wKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCSJSZXN1bHQgb2YgWyVzXSBub3QgdXNlZCBieSBQYXJlbnQgWyVzXSBPcD0lcFxuIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKG9wLT5jb21tb24uYW1sX29wY29kZSksCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpLCBvcCkpOwogCiAJcmV0dXJuX1ZBTFVFIChGQUxTRSk7CiB9CkBAIC01MjIsNyArNTI1LDggQEAKIAkJaWYgKCh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSAmJgogCQkJKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkgJiYKIAkJCShhcmdfaW5kZXggIT0gMCkpIHsKLQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7CisJCQlvYmpfZGVzYyA9IEFDUElfQ0FTVF9QVFIgKAorCQkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSk7CiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfQogCQllbHNlICAgIC8qIEFsbCBvdGhlciBvcGNvZGVzICovIHsKQEAgLTU2NSw3ICs1NjksOCBAQAogCQkJCQkgKiBpbmRpY2F0ZSB0aGlzIHRvIHRoZSBpbnRlcnByZXRlciwgc2V0IHRoZQogCQkJCQkgKiBvYmplY3QgdG8gdGhlIHJvb3QKIAkJCQkJICovCi0JCQkJCW9ial9kZXNjID0gQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKKwkJCQkJb2JqX2Rlc2MgPSBBQ1BJX0NBU1RfUFRSICgKKwkJCQkJCQkgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwgYWNwaV9nYmxfcm9vdF9ub2RlKTsKIAkJCQkJc3RhdHVzID0gQUVfT0s7CiAJCQkJfQogCQkJCWVsc2UgewpAQCAtNjEyLDcgKzYxNyw4IEBACiAJCQkgKi8KIAkJCW9wY29kZSA9IEFNTF9aRVJPX09QOyAgICAgICAvKiBIYXMgbm8gYXJndW1lbnRzISAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwgIk51bGwgbmFtZXBhdGg6IEFyZz0lcFxuIiwgYXJnKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9ESVNQQVRDSCwKKwkJCQkiTnVsbCBuYW1lcGF0aDogQXJnPSVwXG4iLCBhcmcpKTsKIAkJfQogCQllbHNlIHsKIAkJCW9wY29kZSA9IGFyZy0+Y29tbW9uLmFtbF9vcGNvZGU7CkBAIC02NDIsNyArNjQ4LDggQEAKIAkJCQkgKiBPbmx5IGVycm9yIGlzIHVuZGVyZmxvdywgYW5kIHRoaXMgaW5kaWNhdGVzCiAJCQkJICogYSBtaXNzaW5nIG9yIG51bGwgb3BlcmFuZCEKIAkJCQkgKi8KLQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJIk1pc3Npbmcgb3IgbnVsbCBvcGVyYW5kLCAlc1xuIiwKIAkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJfQpAQCAtNjU3LDggKzY2NCw4IEBACiAKIAkJCS8qIEluaXRpYWxpemUgdGhlIG5ldyBvYmplY3QgKi8KIAotCQkJc3RhdHVzID0gYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICh3YWxrX3N0YXRlLCBhcmcsCi0JCQkJCSBvcGNvZGUsICZvYmpfZGVzYyk7CisJCQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfb2JqZWN0X2Zyb21fb3AgKAorCQkJCQkgd2Fsa19zdGF0ZSwgYXJnLCBvcGNvZGUsICZvYmpfZGVzYyk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQkJYWNwaV91dF9kZWxldGVfb2JqZWN0X2Rlc2MgKG9ial9kZXNjKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKaW5kZXggMjA3MWEwZC4uMTBmNzEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYwpAQCAtNzMsMTEgKzczLDEzIEBACiAJCQkgIGFjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSLAogCQkJICBhY3BpX2V4X29wY29kZV82QV8wVF8xUn07CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZQogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKKyAqICAgICAgICAgICAgICByZXN1bHRfb2JqICAgICAgLSBpZiBub24temVybywgcG9wIHJlc3VsdCBmcm9tIHJlc3VsdCBzdGFjawogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xMjQsNyArMTI2LDggQEAKIAl9CiAKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcHJlZGljYXRlIG9ial9kZXNjPSVwIFN0YXRlPSVwXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJObyBwcmVkaWNhdGUgb2JqX2Rlc2M9JXAgU3RhdGU9JXBcbiIsCiAJCQlvYmpfZGVzYywgd2Fsa19zdGF0ZSkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX05PX09QRVJBTkQpOwpAQCAtMTk3LDcgKzIwMCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2JlZ2luX29wCiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAorICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXJlIHRvIHJldHVybiBvcCBpZiBhIG5ldyBvbmUgaXMgY3JlYXRlZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yMzMsNyArMjM2LDggQEAKIAkJd2Fsa19zdGF0ZS0+b3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpOwogCiAJCWlmIChhY3BpX25zX29wZW5zX3Njb3BlICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5vYmplY3RfdHlwZSkpIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSIoJXMpIFBvcHBpbmcgc2NvcGUgZm9yIE9wICVwXG4iLAogCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAod2Fsa19zdGF0ZS0+b3BfaW5mby0+b2JqZWN0X3R5cGUpLCBvcCkpOwogCiAJCQlzdGF0dXMgPSBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7CkBAIC0yOTcsMTEgKzMwMSwxMCBAQAogCiAJCWlmICh3YWxrX3N0YXRlLT53YWxrX3R5cGUgPT0gQUNQSV9XQUxLX01FVEhPRCkgewogCQkJLyoKLQkJCSAqIEZvdW5kIGEgbmFtZWQgb2JqZWN0IGRlY2xhcmF0aW9uIGR1cmluZyBtZXRob2QKLQkJCSAqIGV4ZWN1dGlvbjsgIHdlIG11c3QgZW50ZXIgdGhpcyBvYmplY3QgaW50byB0aGUKLQkJCSAqIG5hbWVzcGFjZS4gIFRoZSBjcmVhdGVkIG9iamVjdCBpcyB0ZW1wb3JhcnkgYW5kCi0JCQkgKiB3aWxsIGJlIGRlbGV0ZWQgdXBvbiBjb21wbGV0aW9uIG9mIHRoZSBleGVjdXRpb24KLQkJCSAqIG9mIHRoaXMgbWV0aG9kLgorCQkJICogRm91bmQgYSBuYW1lZCBvYmplY3QgZGVjbGFyYXRpb24gZHVyaW5nIG1ldGhvZCBleGVjdXRpb247CisJCQkgKiB3ZSBtdXN0IGVudGVyIHRoaXMgb2JqZWN0IGludG8gdGhlIG5hbWVzcGFjZS4gIFRoZSBjcmVhdGVkCisJCQkgKiBvYmplY3QgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgdXBvbiBjb21wbGV0aW9uIG9mCisJCQkgKiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLgogCQkJICovCiAJCQlzdGF0dXMgPSBhY3BpX2RzX2xvYWQyX2JlZ2luX29wICh3YWxrX3N0YXRlLCBOVUxMKTsKIAkJfQpAQCAtMzM4LDggKzM0MSw2IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19leGVjX2VuZF9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiBjb21wbGV0ZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsazsgIEFyZ3VtZW50cyBoYXZlIG5vdyBiZWVuIGV2YWx1YXRlZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzg5LDcgKzM5MCw3IEBACiAJLyogRGVjb2RlIHRoZSBPcGNvZGUgQ2xhc3MgKi8KIAogCXN3aXRjaCAob3BfY2xhc3MpIHsKLQljYXNlIEFNTF9DTEFTU19BUkdVTUVOVDogICAgLyogY29uc3RhbnRzLCBsaXRlcmFscywgZXRjLiAtLSBkbyBub3RoaW5nICovCisJY2FzZSBBTUxfQ0xBU1NfQVJHVU1FTlQ6ICAgIC8qIGNvbnN0YW50cywgbGl0ZXJhbHMsIGV0Yy4gLSBkbyBub3RoaW5nICovCiAJCWJyZWFrOwogCiAKQEAgLTQxNywxMiArNDE4LDEyIEBACiAJCQkvKiBSZXNvbHZlIGFsbCBvcGVyYW5kcyAqLwogCiAJCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKHdhbGtfc3RhdGUtPm9wY29kZSwKLQkJCQkJICAmKHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLTFdKSwKLQkJCQkJICB3YWxrX3N0YXRlKTsKKwkJCQkJICYod2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtMV0pLAorCQkJCQkgd2Fsa19zdGF0ZSk7CiAJCQlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCQkJQUNQSV9EVU1QX09QRVJBTkRTIChBQ1BJX1dBTEtfT1BFUkFORFMsIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSksCi0JCQkJCQkgIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcywgImFmdGVyIGV4X3Jlc29sdmVfb3BlcmFuZHMiKTsKKwkJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSksCisJCQkJCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcywgImFmdGVyIGV4X3Jlc29sdmVfb3BlcmFuZHMiKTsKIAkJCX0KIAkJfQogCkBAIC01MDYsNyArNTA3LDggQEAKIAkJCWlmICgob3AtPmFzbC5wYXJlbnQpICYmCiAJCQkgICAoKG9wLT5hc2wucGFyZW50LT5hc2wuYW1sX29wY29kZSA9PSBBTUxfUEFDS0FHRV9PUCkgfHwKIAkJCQkob3AtPmFzbC5wYXJlbnQtPmFzbC5hbWxfb3Bjb2RlID09IEFNTF9WQVJfUEFDS0FHRV9PUCkpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJNZXRob2QgUmVmZXJlbmNlIGluIGEgUGFja2FnZSwgT3A9JXBcbiIsIG9wKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsCisJCQkJCSJNZXRob2QgUmVmZXJlbmNlIGluIGEgUGFja2FnZSwgT3A9JXBcbiIsIG9wKSk7CiAJCQkJb3AtPmNvbW1vbi5ub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9wLT5hc2wudmFsdWUuYXJnLT5hc2wubm9kZS0+b2JqZWN0OwogCQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob3AtPmFzbC52YWx1ZS5hcmctPmFzbC5ub2RlLT5vYmplY3QpOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwpAQCAtNTgzLDEzICs1ODUsMTUgQEAKIAkJCWNhc2UgQU1MX05BTUVfT1A6CiAKIAkJCQkvKgotCQkJCSAqIFB1dCB0aGUgTm9kZSBvbiB0aGUgb2JqZWN0IHN0YWNrIChDb250YWlucyB0aGUgQUNQSSBOYW1lIG9mCi0JCQkJICogdGhpcyBvYmplY3QpCisJCQkJICogUHV0IHRoZSBOb2RlIG9uIHRoZSBvYmplY3Qgc3RhY2sgKENvbnRhaW5zIHRoZSBBQ1BJIE5hbWUKKwkJCQkgKiBvZiB0aGlzIG9iamVjdCkKIAkJCQkgKi8KIAkJCQl3YWxrX3N0YXRlLT5vcGVyYW5kc1swXSA9ICh2b2lkICopIG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZTsKIAkJCQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPSAxOwogCi0JCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSAod2Fsa19zdGF0ZSwgb3AtPmNvbW1vbi5wYXJlbnQtPmNvbW1vbi5ub2RlLCBvcC0+Y29tbW9uLnBhcmVudCk7CisJCQkJc3RhdHVzID0gYWNwaV9kc19jcmVhdGVfbm9kZSAod2Fsa19zdGF0ZSwKKwkJCQkJCSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGUsCisJCQkJCQkgb3AtPmNvbW1vbi5wYXJlbnQpOwogCQkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtNjAwLDcgKzYwNCw3IEBACiAJCQljYXNlIEFNTF9JTlRfRVZBTF9TVUJUUkVFX09QOgogCiAJCQkJc3RhdHVzID0gYWNwaV9kc19ldmFsX2RhdGFfb2JqZWN0X29wZXJhbmRzICh3YWxrX3N0YXRlLCBvcCwKLQkJCQkJCSAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLm5vZGUpKTsKKwkJCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKG9wLT5jb21tb24ucGFyZW50LT5jb21tb24ubm9kZSkpOwogCQkJCWJyZWFrOwogCiAJCQlkZWZhdWx0OgpAQCAtNjA5LDcgKzYxMyw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCS8qIERvbmUgd2l0aCB0aGlzIHJlc3VsdCBzdGF0ZSAoTm93IHRoYXQgb3BlcmFuZCBzdGFjayBpcyBidWlsdCkgKi8KKwkJCS8qIERvbmUgd2l0aCByZXN1bHQgc3RhdGUgKE5vdyB0aGF0IG9wZXJhbmQgc3RhY2sgaXMgYnVpbHQpICovCiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcCAod2Fsa19zdGF0ZSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC02MjAsOCArNjI0LDcgQEAKIAkJCSAqIElmIGEgcmVzdWx0IG9iamVjdCB3YXMgcmV0dXJuZWQgZnJvbSBhYm92ZSwgcHVzaCBpdCBvbiB0aGUKIAkJCSAqIGN1cnJlbnQgcmVzdWx0IHN0YWNrCiAJCQkgKi8KLQkJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykgJiYKLQkJCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisJCQlpZiAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3B1c2ggKHdhbGtfc3RhdGUtPnJlc3VsdF9vYmosIHdhbGtfc3RhdGUpOwogCQkJfQogCQkJYnJlYWs7CkBAIC02NTQsNyArNjU3LDggQEAKIAogCQljYXNlIEFNTF9UWVBFX1VOREVGSU5FRDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJVbmRlZmluZWQgb3Bjb2RlIHR5cGUgT3A9JXBcbiIsIG9wKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiVW5kZWZpbmVkIG9wY29kZSB0eXBlIE9wPSVwXG4iLCBvcCkpOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT1RfSU1QTEVNRU5URUQpOwogCiAKQEAgLTcwOSwxMyArNzEzLDE0IEBACiAJCXN0YXR1cyA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9oYW5kbGVyIChzdGF0dXMsCiAJCQkJIHdhbGtfc3RhdGUtPm1ldGhvZF9ub2RlLT5uYW1lLmludGVnZXIsIHdhbGtfc3RhdGUtPm9wY29kZSwKIAkJCQkgd2Fsa19zdGF0ZS0+YW1sX29mZnNldCwgTlVMTCk7Ci0JCWFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKCk7CisJCSh2b2lkKSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyICgpOwogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CiAJCS8qIEJyZWFrIHRvIGRlYnVnZ2VyIHRvIGRpc3BsYXkgcmVzdWx0ICovCiAKLQkJQUNQSV9ERUJVR0dFUl9FWEVDIChhY3BpX2RiX2Rpc3BsYXlfcmVzdWx0X29iamVjdCAod2Fsa19zdGF0ZS0+cmVzdWx0X29iaiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHR0VSX0VYRUMgKGFjcGlfZGJfZGlzcGxheV9yZXN1bHRfb2JqZWN0ICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqLAorCQkJCSB3YWxrX3N0YXRlKSk7CiAKIAkJLyoKIAkJICogRGVsZXRlIHRoZSByZXN1bHQgb3AgaWYgYW5kIG9ubHkgaWY6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKaW5kZXggMDZkNzU4Ni4uMWFjMTk3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwpAQCAtNzksMjAgKzc5LDIzIEBACiAKIAlzd2l0Y2ggKHBhc3NfbnVtYmVyKSB7CiAJY2FzZSAxOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8IEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKKwkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMV9lbmRfb3A7CiAJCWJyZWFrOwogCiAJY2FzZSAyOgotCQl3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAgICAgICA9IEFDUElfUEFSU0VfTE9BRF9QQVNTMSB8IEFDUElfUEFSU0VfREVMRVRFX1RSRUU7CisJCXdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICAgICAgID0gQUNQSV9QQVJTRV9MT0FEX1BBU1MxIHwKKwkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9iZWdpbl9vcDsKIAkJd2Fsa19zdGF0ZS0+YXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19sb2FkMl9lbmRfb3A7CiAJCWJyZWFrOwogCiAJY2FzZSAzOgogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICB8PSBBQ1BJX1BBUlNFX0VYRUNVVEUgIHwgQUNQSV9QQVJTRV9ERUxFVEVfVFJFRTsKKwkJd2Fsa19zdGF0ZS0+cGFyc2VfZmxhZ3MgICAgICB8PSBBQ1BJX1BBUlNFX0VYRUNVVEUgIHwKKwkJCQkgICBBQ1BJX1BBUlNFX0RFTEVURV9UUkVFOwogCQl3YWxrX3N0YXRlLT5kZXNjZW5kaW5nX2NhbGxiYWNrID0gYWNwaV9kc19leGVjX2JlZ2luX29wOwogCQl3YWxrX3N0YXRlLT5hc2NlbmRpbmdfY2FsbGJhY2sgPSBhY3BpX2RzX2V4ZWNfZW5kX29wOwogI2VuZGlmCkBAIC0xMTEsOCArMTE0LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2JlZ2luX29wCiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhcnNlIHRyZWUgd2FsawotICogICAgICAgICAgICAgIE9wICAgICAgICAgICAgICAtIE9wIHRoYXQgaGFzIGJlZW4ganVzdCBiZWVuIHJlYWNoZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsazsgIEFyZ3VtZW50cyBoYXZlIG5vdCBiZWVuIGV2YWx1YXRlZCB5ZXQuCisgKiAgICAgICAgICAgICAgb3V0X29wICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIG9wIGlmIGEgbmV3IG9uZSBpcyBjcmVhdGVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE0Niw3ICsxNDgsOCBAQAogI2lmIDAKIAkJCWlmICgod2Fsa19zdGF0ZS0+b3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX0VYRUNVVEUpIHx8CiAJCQkJKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19DT05UUk9MKSkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG5cbioqKkVYRUNVVEFCTEUgT1BDT0RFICVzKioqXG5cbiIsIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUpOworCQkJCWFjcGlfb3NfcHJpbnRmICgiXG5cbioqKkVYRUNVVEFCTEUgT1BDT0RFICVzKioqXG5cbiIsCisJCQkJCXdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUpOwogCQkJCSpvdXRfb3AgPSBvcDsKIAkJCQlyZXR1cm4gKEFFX0NUUkxfU0tJUCk7CiAJCQl9CkBAIC0xOTEsNyArMTk0LDggQEAKIAkJCSAqLwogCQkJYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdCAocGF0aCk7CiAJCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCi0JCQkJCSAgIEFDUElfSU1PREVfTE9BRF9QQVNTMSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsCisJCQkJCSAgIHdhbGtfc3RhdGUsICYobm9kZSkpOwogCQl9CiAjZW5kaWYKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMjI0LDEwICsyMjgsMTIgQEAKIAkJCSAqICBOYW1lIChERUIsIDApCiAJCQkgKiAgU2NvcGUgKERFQikgeyAuLi4gfQogCQkJICoKLQkJCSAqIE5vdGU6IHNpbGVudGx5IGNoYW5nZSB0aGUgdHlwZSBoZXJlLiAgT24gdGhlIHNlY29uZCBwYXNzLCB3ZSB3aWxsIHJlcG9ydCBhIHdhcm5pbmcKKwkJCSAqIE5vdGU6IHNpbGVudGx5IGNoYW5nZSB0aGUgdHlwZSBoZXJlLiAgT24gdGhlIHNlY29uZCBwYXNzLCB3ZSB3aWxsIHJlcG9ydAorCQkJICogYSB3YXJuaW5nCiAJCQkgKi8KIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCisJCQkJIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKIAkJCQlwYXRoLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CiAKIAkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwpAQCAtMjM4LDcgKzI0NCw4IEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdIChDYW5ub3Qgb3ZlcnJpZGUpXG4iLAogCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIHBhdGgpKTsKIAogCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKQEAgLTI0OSw3ICsyNTYsOCBAQAogCWRlZmF1bHQ6CiAKIAkJLyoKLQkJICogRm9yIGFsbCBvdGhlciBuYW1lZCBvcGNvZGVzLCB3ZSB3aWxsIGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZS4KKwkJICogRm9yIGFsbCBvdGhlciBuYW1lZCBvcGNvZGVzLCB3ZSB3aWxsIGVudGVyIHRoZSBuYW1lIGludG8KKwkJICogdGhlIG5hbWVzcGFjZS4KIAkJICoKIAkJICogU2V0dXAgdGhlIHNlYXJjaCBmbGFncy4KIAkJICogU2luY2Ugd2UgYXJlIGVudGVyaW5nIGEgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIHdlIGRvIG5vdCB3YW50IHRvCkBAIC0yNzksMTQgKzI4NywxNiBAQAogCQkJCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKG9iamVjdF90eXBlKSkpOwogCQl9CiAJCWVsc2UgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRElTUEFUQ0gsICJbJXNdIEJvdGggRmluZCBvciBDcmVhdGUgYWxsb3dlZFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILAorCQkJCSJbJXNdIEJvdGggRmluZCBvciBDcmVhdGUgYWxsb3dlZFxuIiwKIAkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChvYmplY3RfdHlwZSkpKTsKIAkJfQogCiAJCS8qCiAJCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gIFdlIGVudGVyIHRoZSBuYW1lCi0JCSAqIGFzIHdlIGdvIGRvd253YXJkIGluIHRoZSBwYXJzZSB0cmVlLiAgQW55IG5lY2Vzc2FyeSBzdWJvYmplY3RzIHRoYXQgaW52b2x2ZQotCQkgKiBhcmd1bWVudHMgdG8gdGhlIG9wY29kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgd2UgZ28gYmFjayB1cCB0aGUgcGFyc2UgdHJlZSBsYXRlci4KKwkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuICBBbnkgbmVjZXNzYXJ5IHN1Ym9iamVjdHMgdGhhdAorCQkgKiBpbnZvbHZlIGFyZ3VtZW50cyB0byB0aGUgb3Bjb2RlIG11c3QgYmUgY3JlYXRlZCBhcyB3ZSBnbyBiYWNrIHVwIHRoZQorCQkgKiBwYXJzZSB0cmVlIGxhdGVyLgogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8sIHBhdGgsIG9iamVjdF90eXBlLAogCQkJCSAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwgJihub2RlKSk7CkBAIC0zMzUsOCArMzQ1LDYgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2xvYWQxX2VuZF9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiBjb21wbGV0ZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsazsgIEFyZ3VtZW50cyBoYXZlIG5vdyBiZWVuIGV2YWx1YXRlZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzgzLDcgKzM5MSw5IEBACiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKIAkJc3RhdHVzID0gYWNwaV9leF9jcmVhdGVfcmVnaW9uIChvcC0+bmFtZWQuZGF0YSwgb3AtPm5hbWVkLmxlbmd0aCwKLQkJCQkgICAoYWNwaV9hZHJfc3BhY2VfdHlwZSkgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKSwgd2Fsa19zdGF0ZSk7CisJCQkJICAgKGFjcGlfYWRyX3NwYWNlX3R5cGUpCisJCQkJCQkgKChvcC0+Y29tbW9uLnZhbHVlLmFyZyktPmNvbW1vbi52YWx1ZS5pbnRlZ2VyKSwKKwkJCQkJCSB3YWxrX3N0YXRlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuIChzdGF0dXMpOwogCQl9CkBAIC0zOTQsNyArNDA0LDggQEAKIAkJLyogRm9yIE5hbWUgb3Bjb2RlLCBnZXQgdGhlIG9iamVjdCB0eXBlIGZyb20gdGhlIGFyZ3VtZW50ICovCiAKIAkJaWYgKG9wLT5jb21tb24udmFsdWUuYXJnKSB7Ci0JCQlvYmplY3RfdHlwZSA9IChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGU7CisJCQlvYmplY3RfdHlwZSA9IChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoCisJCQkJKG9wLT5jb21tb24udmFsdWUuYXJnKS0+Y29tbW9uLmFtbF9vcGNvZGUpKS0+b2JqZWN0X3R5cGU7CiAJCQlvcC0+Y29tbW9uLm5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOwogCQl9CiAJfQpAQCAtNDQ4LDggKzQ1OSw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMl9iZWdpbl9vcAogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSBwYXJzZSB0cmVlIHdhbGsKLSAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBPcCB0aGF0IGhhcyBiZWVuIGp1c3QgYmVlbiByZWFjaGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3QgYmVlbiBldmFsdWF0ZWQgeWV0LgorICogICAgICAgICAgICAgIG91dF9vcCAgICAgICAgICAtIFdoZXIgdG8gcmV0dXJuIG9wIGlmIGEgbmV3IG9uZSBpcyBjcmVhdGVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQ3OCwxNCArNDg4LDIwIEBACiAJaWYgKG9wKSB7CiAJCS8qIFdlIG9ubHkgY2FyZSBhYm91dCBOYW1lc3BhY2Ugb3Bjb2RlcyBoZXJlICovCiAKLQkJaWYgKCghKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05TT1BDT0RFKSAmJiAod2Fsa19zdGF0ZS0+b3Bjb2RlICE9IEFNTF9JTlRfTkFNRVBBVEhfT1ApKSB8fAorCQlpZiAoKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTlNPUENPREUpICYmCisJCQkgICh3YWxrX3N0YXRlLT5vcGNvZGUgIT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkpIHx8CiAJCQkoISh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9OQU1FRCkpKSB7CisJCQlpZiAoKHdhbGtfc3RhdGUtPm9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19FWEVDVVRFKSB8fAorCQkJCSh3YWxrX3N0YXRlLT5vcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfQ09OVFJPTCkpIHsKKwkJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkJCSJFbmNvdW50ZXJlZCBleGVjdXRhYmxlIGNvZGUgYXQgbW9kdWxlIGxldmVsLCBbJXNdXG4iLAorCQkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSkpOworCQkJfQogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJCX0KIAotCQkvKgotCQkgKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlCi0JCSAqLworCQkvKiBHZXQgdGhlIG5hbWUgd2UgYXJlIGdvaW5nIHRvIGVudGVyIG9yIGxvb2t1cCBpbiB0aGUgbmFtZXNwYWNlICovCisKIAkJaWYgKHdhbGtfc3RhdGUtPm9wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CiAJCQkvKiBGb3IgTmFtZXBhdGggb3AsIGdldCB0aGUgcGF0aCBzdHJpbmcgKi8KIApAQCAtNTI4LDIxICs1NDQsMjUgQEAKIAljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6CiAKIAkJLyoKLQkJICogVGhlIG5hbWVfcGF0aCBpcyBhbiBvYmplY3QgcmVmZXJlbmNlIHRvIGFuIGV4aXN0aW5nIG9iamVjdC4gRG9uJ3QgZW50ZXIgdGhlCi0JCSAqIG5hbWUgaW50byB0aGUgbmFtZXNwYWNlLCBidXQgbG9vayBpdCB1cCBmb3IgdXNlIGxhdGVyCisJCSAqIFRoZSBuYW1lX3BhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuCisJCSAqIERvbid0IGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAKKwkJICogZm9yIHVzZSBsYXRlci4KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBTUxfU0NPUEVfT1A6CiAKIAkJLyoKLQkJICogVGhlIFBhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuICBEb24ndCBlbnRlciB0aGUKLQkJICogbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UsIGJ1dCBsb29rIGl0IHVwIGZvciB1c2UgbGF0ZXIKKwkJICogVGhlIFBhdGggaXMgYW4gb2JqZWN0IHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBvYmplY3QuCisJCSAqIERvbid0IGVudGVyIHRoZSBuYW1lIGludG8gdGhlIG5hbWVzcGFjZSwgYnV0IGxvb2sgaXQgdXAKKwkJICogZm9yIHVzZSBsYXRlci4KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfbnNfbG9va3VwICh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBidWZmZXJfcHRyLCBvYmplY3RfdHlwZSwKLQkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCB3YWxrX3N0YXRlLCAmKG5vZGUpKTsKKwkJCQkgIEFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKICNpZmRlZiBfQUNQSV9BU0xfQ09NUElMRVIKIAkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CkBAIC01ODIsNyArNjAyLDggQEAKIAkJCSAqICBTY29wZSAoREVCKSB7IC4uLiB9CiAJCQkgKi8KIAotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJUeXBlIG92ZXJyaWRlIC0gWyU0LjRzXSBoYWQgaW52YWxpZCB0eXBlICglcykgZm9yIFNjb3BlIG9wZXJhdG9yLCBjaGFuZ2VkIHRvIChTY29wZSlcbiIsCisJCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkJIlR5cGUgb3ZlcnJpZGUgLSBbJTQuNHNdIGhhZCBpbnZhbGlkIHR5cGUgKCVzKSBmb3IgU2NvcGUgb3BlcmF0b3IsIGNoYW5nZWQgdG8gKFNjb3BlKVxuIiwKIAkJCQlidWZmZXJfcHRyLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKG5vZGUtPnR5cGUpKSk7CiAKIAkJCW5vZGUtPnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwpAQCAtNTkzLDcgKzYxNCw4IEBACiAKIAkJCS8qIEFsbCBvdGhlciB0eXBlcyBhcmUgYW4gZXJyb3IgKi8KIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiSW52YWxpZCB0eXBlICglcykgZm9yIHRhcmdldCBvZiBTY29wZSBvcGVyYXRvciBbJTQuNHNdXG4iLAogCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAobm9kZS0+dHlwZSksIGJ1ZmZlcl9wdHIpKTsKIAogCQkJcmV0dXJuIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKQEAgLTYyMSw4ICs2NDMsOSBAQAogCiAJCS8qCiAJCSAqIEVudGVyIHRoZSBuYW1lZCB0eXBlIGludG8gdGhlIGludGVybmFsIG5hbWVzcGFjZS4gIFdlIGVudGVyIHRoZSBuYW1lCi0JCSAqIGFzIHdlIGdvIGRvd253YXJkIGluIHRoZSBwYXJzZSB0cmVlLiAgQW55IG5lY2Vzc2FyeSBzdWJvYmplY3RzIHRoYXQgaW52b2x2ZQotCQkgKiBhcmd1bWVudHMgdG8gdGhlIG9wY29kZSBtdXN0IGJlIGNyZWF0ZWQgYXMgd2UgZ28gYmFjayB1cCB0aGUgcGFyc2UgdHJlZSBsYXRlci4KKwkJICogYXMgd2UgZ28gZG93bndhcmQgaW4gdGhlIHBhcnNlIHRyZWUuICBBbnkgbmVjZXNzYXJ5IHN1Ym9iamVjdHMgdGhhdAorCQkgKiBpbnZvbHZlIGFyZ3VtZW50cyB0byB0aGUgb3Bjb2RlIG11c3QgYmUgY3JlYXRlZCBhcyB3ZSBnbyBiYWNrIHVwIHRoZQorCQkgKiBwYXJzZSB0cmVlIGxhdGVyLgogCQkgKgogCQkgKiBOb3RlOiBOYW1lIG1heSBhbHJlYWR5IGV4aXN0IGlmIHdlIGFyZSBleGVjdXRpbmcgYSBkZWZlcnJlZCBvcGNvZGUuCiAJCSAqLwpAQCAtNjM1LDcgKzY1OCw4IEBACiAJCX0KIAogCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgYnVmZmVyX3B0ciwgb2JqZWN0X3R5cGUsCi0JCQkJICBBQ1BJX0lNT0RFX0VYRUNVVEUsIEFDUElfTlNfTk9fVVBTRUFSQ0gsIHdhbGtfc3RhdGUsICYobm9kZSkpOworCQkJCSAgQUNQSV9JTU9ERV9FWEVDVVRFLCBBQ1BJX05TX05PX1VQU0VBUkNILAorCQkJCSAgd2Fsa19zdGF0ZSwgJihub2RlKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNjc4LDggKzcwMiw2IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9kc19sb2FkMl9lbmRfb3AKICAqCiAgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZSBvZiB0aGUgcGFyc2UgdHJlZSB3YWxrCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gT3AgdGhhdCBoYXMgYmVlbiBqdXN0IGJlZW4gY29tcGxldGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGs7ICBBcmd1bWVudHMgaGF2ZSBub3cgYmVlbiBldmFsdWF0ZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTczOCw3ICs3NjAsOCBAQAogCiAJLyogUG9wIHRoZSBzY29wZSBzdGFjayAqLwogCi0JaWYgKGFjcGlfbnNfb3BlbnNfc2NvcGUgKG9iamVjdF90eXBlKSAmJiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlICE9IEFNTF9JTlRfTUVUSE9EQ0FMTF9PUCkpIHsKKwlpZiAoYWNwaV9uc19vcGVuc19zY29wZSAob2JqZWN0X3R5cGUpICYmCisJICAgKG9wLT5jb21tb24uYW1sX29wY29kZSAhPSBBTUxfSU5UX01FVEhPRENBTExfT1ApKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0RJU1BBVENILCAiKCVzKSBQb3BwaW5nIHNjb3BlIGZvciBPcCAlcFxuIiwKIAkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAob2JqZWN0X3R5cGUpLCBvcCkpOwogCkBAIC04MDMsNyArODI2LDcgQEAKIAkJY2FzZSBBTUxfSU5ERVhfRklFTERfT1A6CiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfY3JlYXRlX2luZGV4X2ZpZWxkIChvcCwgKGFjcGlfaGFuZGxlKSBhcmctPmNvbW1vbi5ub2RlLAotCQkJCQkgICB3YWxrX3N0YXRlKTsKKwkJCQkJIHdhbGtfc3RhdGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBTUxfQkFOS19GSUVMRF9PUDoKQEAgLTg4NCwxNCArOTA3LDE2IEBACiAjaWZuZGVmIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgogCQljYXNlIEFNTF9SRUdJT05fT1A6CiAJCQkvKgotCQkJICogVGhlIG9wX3JlZ2lvbiBpcyBub3QgZnVsbHkgcGFyc2VkIGF0IHRoaXMgdGltZS4gT25seSB2YWxpZCBhcmd1bWVudCBpcyB0aGUgc3BhY2VfaWQuCi0JCQkgKiAoV2UgbXVzdCBzYXZlIHRoZSBhZGRyZXNzIG9mIHRoZSBBTUwgb2YgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvcGVyYW5kcykKKwkJCSAqIFRoZSBvcF9yZWdpb24gaXMgbm90IGZ1bGx5IHBhcnNlZCBhdCB0aGlzIHRpbWUuIE9ubHkgdmFsaWQKKwkJCSAqIGFyZ3VtZW50IGlzIHRoZSBzcGFjZV9pZC4gKFdlIG11c3Qgc2F2ZSB0aGUgYWRkcmVzcyBvZiB0aGUKKwkJCSAqIEFNTCBvZiB0aGUgYWRkcmVzcyBhbmQgbGVuZ3RoIG9wZXJhbmRzKQogCQkJICovCiAJCQkvKgogCQkJICogSWYgd2UgaGF2ZSBhIHZhbGlkIHJlZ2lvbiwgaW5pdGlhbGl6ZSBpdAogCQkJICogTmFtZXNwYWNlIGlzIE5PVCBsb2NrZWQgYXQgdGhpcyBwb2ludC4KIAkJCSAqLwotCQkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSwgRkFMU0UpOworCQkJc3RhdHVzID0gYWNwaV9ldl9pbml0aWFsaXplX3JlZ2lvbiAoYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKSwKKwkJCQkJIEZBTFNFKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQkvKgogCQkJCSAqICBJZiBBRV9OT1RfRVhJU1QgaXMgcmV0dXJuZWQsIGl0IGlzIG5vdCBmYXRhbApAQCAtOTQyLDE1ICs5NjcsMTYgQEAKIAkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkJLyoKIAkJCSAqIE1ha2Ugc3VyZSB0aGF0IHdoYXQgd2UgZm91bmQgaXMgaW5kZWVkIGEgbWV0aG9kCi0JCQkgKiBXZSBkaWRuJ3Qgc2VhcmNoIGZvciBhIG1ldGhvZCBvbiBwdXJwb3NlLCB0byBzZWUgaWYgdGhlIG5hbWUgd291bGQgcmVzb2x2ZQorCQkJICogV2UgZGlkbid0IHNlYXJjaCBmb3IgYSBtZXRob2Qgb24gcHVycG9zZSwgdG8gc2VlIGlmIHRoZSBuYW1lCisJCQkgKiB3b3VsZCByZXNvbHZlCiAJCQkgKi8KIAkJCWlmIChuZXdfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfTUVUSE9EKSB7CiAJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJCX0KIAotCQkJLyogV2UgY291bGQgcHV0IHRoZSByZXR1cm5lZCBvYmplY3QgKE5vZGUpIG9uIHRoZSBvYmplY3Qgc3RhY2sgZm9yIGxhdGVyLCBidXQKLQkJCSAqIGZvciBub3csIHdlIHdpbGwgcHV0IGl0IGluIHRoZSAib3AiIG9iamVjdCB0aGF0IHRoZSBwYXJzZXIgdXNlcywgc28gd2UKLQkJCSAqIGNhbiBnZXQgaXQgYWdhaW4gYXQgdGhlIGVuZCBvZiB0aGlzIHNjb3BlCisJCQkvKiBXZSBjb3VsZCBwdXQgdGhlIHJldHVybmVkIG9iamVjdCAoTm9kZSkgb24gdGhlIG9iamVjdCBzdGFjayBmb3IKKwkJCSAqIGxhdGVyLCBidXQgZm9yIG5vdywgd2Ugd2lsbCBwdXQgaXQgaW4gdGhlICJvcCIgb2JqZWN0IHRoYXQgdGhlCisJCQkgKiBwYXJzZXIgdXNlcywgc28gd2UgY2FuIGdldCBpdCBhZ2FpbiBhdCB0aGUgZW5kIG9mIHRoaXMgc2NvcGUKIAkJCSAqLwogCQkJb3AtPmNvbW1vbi5ub2RlID0gbmV3X25vZGU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCmluZGV4IDY1ZjQ1NjEuLjIxZjQ1NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYwpAQCAtNTAsMTQgKzUwLDEzIEBACiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJkc3dzY29wZSIpCiAKIAotI2RlZmluZSBTVEFDS19QT1AoaGVhZCkgaGVhZAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfY2xlYXIKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9uZQorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBQb3AgKGFuZCBmcmVlKSBldmVyeXRoaW5nIG9uIHRoZSBzY29wZSBzdGFjayBleGNlcHQgdGhlCiAgKiAgICAgICAgICAgICAgcm9vdCBzY29wZSBvYmplY3QgKHdoaWNoIHJlbWFpbnMgYXQgdGhlIHN0YWNrIHRvcC4pCkBAIC04MCw3ICs3OSw4IEBACiAJCXdhbGtfc3RhdGUtPnNjb3BlX2luZm8gPSBzY29wZV9pbmZvLT5zY29wZS5uZXh0OwogCiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCi0JCQkiUG9wcGVkIG9iamVjdCB0eXBlICglcylcbiIsIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlKSkpOworCQkJIlBvcHBlZCBvYmplY3QgdHlwZSAoJXMpXG4iLAorCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChzY29wZV9pbmZvLT5jb21tb24udmFsdWUpKSk7CiAJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUgKHNjb3BlX2luZm8pOwogCX0KIH0KQEAgLTkwLDggKzkwLDExIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfc2NvcGVfc3RhY2tfcHVzaAogICoKLSAqIFBBUkFNRVRFUlM6ICAqTm9kZSwgICAgICAgICAgICAgIC0gTmFtZSB0byBiZSBtYWRlIGN1cnJlbnQKLSAqICAgICAgICAgICAgICBUeXBlLCAgICAgICAgICAgICAgIC0gVHlwZSBvZiBmcmFtZSBiZWluZyBwdXNoZWQKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOYW1lIHRvIGJlIG1hZGUgY3VycmVudAorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIFR5cGUgb2YgZnJhbWUgYmVpbmcgcHVzaGVkCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogUHVzaCB0aGUgY3VycmVudCBzY29wZSBvbiB0aGUgc2NvcGUgc3RhY2ssIGFuZCBtYWtlIHRoZQogICogICAgICAgICAgICAgIHBhc3NlZCBOb2RlIGN1cnJlbnQuCkBAIC0xMjEsNyArMTI0LDggQEAKIAkvKiBNYWtlIHN1cmUgb2JqZWN0IHR5cGUgaXMgdmFsaWQgKi8KIAogCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAodHlwZSkpIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CisJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCSJkc19zY29wZV9zdGFja19wdXNoOiBJbnZhbGlkIG9iamVjdCB0eXBlOiAweCVYXG4iLCB0eXBlKSk7CiAJfQogCiAJLyogQWxsb2NhdGUgYSBuZXcgc2NvcGUgb2JqZWN0ICovCkBAIC0xNzAsMTYgKzE3NCwxMSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Njb3BlX3N0YWNrX3BvcAogICoKLSAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gVGhlIHR5cGUgb2YgZnJhbWUgdG8gYmUgZm91bmQKKyAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBDdXJyZW50IHN0YXRlCiAgKgotICogREVTQ1JJUFRJT046IFBvcCB0aGUgc2NvcGUgc3RhY2sgdW50aWwgYSBmcmFtZSBvZiB0aGUgcmVxdWVzdGVkIHR5cGUKLSAqICAgICAgICAgICAgICBpcyBmb3VuZC4KKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBSRVRVUk46ICAgICAgQ291bnQgb2YgZnJhbWVzIHBvcHBlZC4gIElmIG5vIGZyYW1lIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZQotICogICAgICAgICAgICAgIHdhcyBmb3VuZCwgdGhlIGNvdW50IGlzIHJldHVybmVkIGFzIGEgbmVnYXRpdmUgbnVtYmVyIGFuZAotICogICAgICAgICAgICAgIHRoZSBzY29wZSBzdGFjayBpcyBlbXB0aWVkICh3aGljaCBzZXRzIHRoZSBjdXJyZW50IHNjb3BlCi0gKiAgICAgICAgICAgICAgdG8gdGhlIHJvb3QpLiAgSWYgdGhlIHNjb3BlIHN0YWNrIHdhcyBlbXB0eSBhdCBlbnRyeSwgdGhlCi0gKiAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgYSBuby1vcCBhbmQgcmV0dXJucyAwLgorICogREVTQ1JJUFRJT046IFBvcCB0aGUgc2NvcGUgc3RhY2sgb25jZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYwppbmRleCBlNTU1YjNmLi45Y2QzZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKQEAgLTUwLDY3ICs1MCwzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRElTUEFUQ0hFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZHN3c3RhdGUiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Jlc3VsdF9pbnNlcnQKLSAqCi0gKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgICAgICAtIE9iamVjdCB0byBwdXNoCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIFdoZXJlIHRvIGluc2VydCB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogSW5zZXJ0IGFuIG9iamVjdCBvbnRvIHRoaXMgd2FsaydzIHJlc3VsdCBzdGFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfcmVzdWx0X2luc2VydCAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAorYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FICgiZHNfcmVzdWx0X2luc2VydCIpOworYWNwaV9zdGF0dXMKK2FjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKK3ZvaWQgKgorYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworI2VuZGlmCiAKLQlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7Ci0JaWYgKCFzdGF0ZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3QgcHVzaGVkISBTdGF0ZT0lcFxuIiwKLQkJCXdhbGtfc3RhdGUpKTsKLQkJcmV0dXJuIChBRV9OT1RfRVhJU1QpOwotCX0KLQotCWlmIChpbmRleCA+PSBBQ1BJX09CSl9OVU1fT1BFUkFORFMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiSW5kZXggb3V0IG9mIHJhbmdlOiAlWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAotCQkJaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKLQkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKLQl9Ci0KLQlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJOdWxsIE9iamVjdCEgSW5kZXg9JVggT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKLQkJCWluZGV4LCBvYmplY3QsIHdhbGtfc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKSk7Ci0JCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQotCi0Jc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4XSA9IG9iamVjdDsKLQlzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cysrOwotCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKLQkJIk9iaj0lcCBbJXNdIFN0YXRlPSVwIE51bT0lWCBDdXI9JVhcbiIsCi0JCW9iamVjdCwgb2JqZWN0ID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikgb2JqZWN0KSA6ICJOVUxMIiwKLQkJd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMsIHdhbGtfc3RhdGUtPmN1cnJlbnRfcmVzdWx0KSk7Ci0KLQlyZXR1cm4gKEFFX09LKTsKLX0KLQorI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTc4LDcgKzE0Miw2IEBACiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3BvcApAQCAtMjI3LDE1ICsxOTAsMTggQEAKIAkJCSpvYmplY3QgPSBzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXggLTFdOwogCQkJc3RhdGUtPnJlc3VsdHMub2JqX2Rlc2MgW2luZGV4IC0xXSA9IE5VTEw7CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCi0JCQkJKm9iamVjdCwgKCpvYmplY3QpID8gYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCkgOiAiTlVMTCIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJCSJPYmo9JXAgWyVzXSBJbmRleD0lWCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQkJKm9iamVjdCwKKwkJCQkoKm9iamVjdCkgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgqb2JqZWN0KSA6ICJOVUxMIiwKIAkJCQkodTMyKSBpbmRleCAtMSwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAogCQkJcmV0dXJuIChBRV9PSyk7CiAJCX0KIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkiTm8gcmVzdWx0IG9iamVjdHMhIFN0YXRlPSVwXG4iLCB3YWxrX3N0YXRlKSk7CiAJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIH0KIApAQCAtMjc0LDcgKzI0MCw4IEBACiAJfQogCiAJaWYgKCFzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIHJlc3VsdCBvYmplY3RzISBTdGF0ZT0lcFxuIiwKKwkJCXdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CiAKQEAgLTI5Myw3ICsyNjAsOCBAQAogCS8qIENoZWNrIGZvciBhIHZhbGlkIHJlc3VsdCBvYmplY3QgKi8KIAogCWlmICghKm9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCwgSW5kZXg9JVhcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIk51bGwgb3BlcmFuZCEgU3RhdGU9JXAgI09wcz0lWCwgSW5kZXg9JVhcbiIsCiAJCQl3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgKHUzMikgaW5kZXgpKTsKIAkJcmV0dXJuIChBRV9BTUxfTk9fUkVUVVJOX1ZBTFVFKTsKIAl9CkBAIC0zNDQsNyArMzEyLDggQEAKIAl9CiAKIAlpZiAoIW9iamVjdCkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk51bGwgT2JqZWN0ISBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOdWxsIE9iamVjdCEgT2JqPSVwIFN0YXRlPSVwIE51bT0lWFxuIiwKIAkJCW9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CkBAIC00MzksNDMgKzQwOCw2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwKLSAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ2xlYXIgdGhlIG9iamVjdCBzdGFjayBieSBkZWxldGluZyBhbGwgb2JqZWN0cyB0aGF0IGFyZSBvbiBpdC4KLSAqICAgICAgICAgICAgICBTaG91bGQgYmUgdXNlZCB3aXRoIGdyZWF0IGNhcmUsIGlmIGF0IGFsbCEKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwiLCB3YWxrX3N0YXRlKTsKLQotCi0JLyogVGhlIHN0YWNrIHNpemUgaXMgY29uZmlndXJhYmxlLCBidXQgZml4ZWQgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX09CSl9OVU1fT1BFUkFORFM7IGkrKykgewotCQlpZiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOwotCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOwotCQl9Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Ci19Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wdXNoCiAgKgogICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gcHVzaApAQCAtNTE3LDY3ICs0NDksNiBAQAogfQogCiAKLSNpZiAwCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0Ci0gKgotICogUEFSQU1FVEVSUzogIHBvcF9jb3VudCAgICAgICAgICAgLSBOdW1iZXIgb2Ygb2JqZWN0cy9lbnRyaWVzIHRvIHBvcAotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFBvcCB0aGlzIHdhbGsncyBvYmplY3Qgc3RhY2suICBPYmplY3RzIG9uIHRoZSBzdGFjayBhcmUgTk9UCi0gKiAgICAgICAgICAgICAgZGVsZXRlZCBieSB0aGlzIHJvdXRpbmUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19vYmpfc3RhY2tfcG9wX29iamVjdCIpOwotCi0KLQkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCi0KLQlpZiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzID09IDApIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTWlzc2luZyBvcGVyYW5kL3N0YWNrIGVtcHR5ISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7Ci0JCSpvYmplY3QgPSBOVUxMOwotCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKLQl9Ci0KLQkvKiBQb3AgdGhlIHN0YWNrICovCi0KLQl3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMtLTsKLQotCS8qIENoZWNrIGZvciBhIHZhbGlkIG9wZXJhbmQgKi8KLQotCWlmICghd2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kc10pIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkiTnVsbCBvcGVyYW5kISBTdGF0ZT0lcCAjT3BzPSVYXG4iLAotCQkJd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7Ci0JCSpvYmplY3QgPSBOVUxMOwotCQlyZXR1cm4gKEFFX0FNTF9OT19PUEVSQU5EKTsKLQl9Ci0KLQkvKiBHZXQgb3BlcmFuZCBhbmQgc2V0IHN0YWNrIGVudHJ5IHRvIG51bGwgKi8KLQotCSpvYmplY3QgPSB3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXTsKLQl3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSA9IE5VTEw7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiT2JqPSVwIFslc10gU3RhdGU9JXAgI09wcz0lWFxuIiwKLQkJCSAgKm9iamVjdCwgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoKm9iamVjdCksCi0JCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcykpOwotCi0JcmV0dXJuIChBRV9PSyk7Ci19Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19wb3AKQEAgLTY4MCw0OCArNTUxLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfZ2V0X3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIEluZGV4ICAgICAgICAgICAgICAgLSBTdGFjayBpbmRleCB3aG9zZSB2YWx1ZSBpcyBkZXNpcmVkLiAgQmFzZWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGluZGV4PTAgPT0gdG9wKQotICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHJpZXZlIGFuIG9iamVjdCBmcm9tIHRoaXMgd2FsaydzIG9iamVjdCBzdGFjay4gIEluZGV4IG11c3QKLSAqICAgICAgICAgICAgICBiZSB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdm9pZCAqCi1hY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKLXsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2dldF92YWx1ZSIsIHdhbGtfc3RhdGUpOwotCi0KLQkvKiBDYW4ndCBkbyBpdCBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgKi8KLQotCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgewotCQlyZXR1cm5fUFRSIChOVUxMKTsKLQl9Ci0KLQkvKiBvciBpZiB0aGUgaW5kZXggaXMgcGFzdCB0aGUgdG9wIG9mIHRoZSBzdGFjayAqLwotCi0JaWYgKGluZGV4ID4gKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtICh1MzIpIDEpKSB7Ci0JCXJldHVybl9QVFIgKE5VTEwpOwotCX0KLQotCXJldHVybl9QVFIgKHdhbGtfc3RhdGUtPm9wZXJhbmRzWyhhY3BpX25hdGl2ZV91aW50KSh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgLSAxKSAtCi0JCQkgIGluZGV4XSk7Ci19Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2dldF9jdXJyZW50X3dhbGtfc3RhdGUKICAqCiAgKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgICAgIC0gR2V0IGN1cnJlbnQgYWN0aXZlIHN0YXRlIGZvciB0aGlzIFRocmVhZApAQCAtNzU3LDExICs1ODYsMTEgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3B1c2hfd2Fsa19zdGF0ZQogICoKICAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgLSBTdGF0ZSB0byBwdXNoCi0gKiAgICAgICAgICAgICAgd2Fsa19saXN0ICAgICAgIC0gVGhlIGxpc3QgdGhhdCBvd25zIHRoZSB3YWxrIHN0YWNrCisgKiAgICAgICAgICAgICAgVGhyZWFkICAgICAgICAgIC0gVGhyZWFkIHN0YXRlIG9iamVjdAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IFBsYWNlIHRoZSB3YWxrX3N0YXRlIGF0IHRoZSBoZWFkIG9mIHRoZSBzdGF0ZSBsaXN0LgorICogREVTQ1JJUFRJT046IFBsYWNlIHRoZSBUaHJlYWQgc3RhdGUgYXQgdGhlIGhlYWQgb2YgdGhlIHN0YXRlIGxpc3QuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNzg0LDkgKzYxMyw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcG9wX3dhbGtfc3RhdGUKICAqCi0gKiBQQVJBTUVURVJTOiAgd2Fsa19saXN0ICAgICAgIC0gVGhlIGxpc3QgdGhhdCBvd25zIHRoZSB3YWxrIHN0YWNrCisgKiBQQVJBTUVURVJTOiAgVGhyZWFkICAgICAgLSBDdXJyZW50IHRocmVhZCBzdGF0ZQogICoKLSAqIFJFVFVSTjogICAgICBBIHdhbGtfc3RhdGUgb2JqZWN0IHBvcHBlZCBmcm9tIHRoZSBzdGFjaworICogUkVUVVJOOiAgICAgIEEgd2Fsa19zdGF0ZSBvYmplY3QgcG9wcGVkIGZyb20gdGhlIHRocmVhZCdzIHN0YWNrCiAgKgogICogREVTQ1JJUFRJT046IFJlbW92ZSBhbmQgcmV0dXJuIHRoZSB3YWxrc3RhdGUgb2JqZWN0IHRoYXQgaXMgYXQgdGhlIGhlYWQgb2YKICAqICAgICAgICAgICAgICB0aGUgd2FsayBzdGFjayBmb3IgdGhlIGdpdmVuIHdhbGsgbGlzdC4gIE5VTEwgaW5kaWNhdGVzIHRoYXQKQEAgLTgxNCw3ICs2NDMsNyBAQAogCQkvKgogCQkgKiBEb24ndCBjbGVhciB0aGUgTkVYVCBmaWVsZCwgdGhpcyBzZXJ2ZXMgYXMgYW4gaW5kaWNhdG9yCiAJCSAqIHRoYXQgdGhlcmUgaXMgYSBwYXJlbnQgV0FMSyBTVEFURQotCQkgKiAgICAgTk86IHdhbGtfc3RhdGUtPk5leHQgPSBOVUxMOworCQkgKiBEbyBOb3Q6IHdhbGtfc3RhdGUtPk5leHQgPSBOVUxMOwogCQkgKi8KIAl9CiAKQEAgLTgyNiw3ICs2NTUsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlCiAgKgotICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFN0YXJ0aW5nIHBvaW50IGZvciB0aGlzIHdhbGsKKyAqIFBBUkFNRVRFUlM6ICBvd25lcl9pZCAgICAgICAgLSBJRCBmb3Igb2JqZWN0IGNyZWF0aW9uCisgKiAgICAgICAgICAgICAgT3JpZ2luICAgICAgICAgIC0gU3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgd2FsaworICogICAgICAgICAgICAgIG10aF9kZXNjICAgICAgICAtIE1ldGhvZCBvYmplY3QKICAqICAgICAgICAgICAgICBUaHJlYWQgICAgICAgICAgLSBDdXJyZW50IHRocmVhZCBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgd2FsayBzdGF0ZS4KQEAgLTg5Niw4ICs3MjcsNyBAQAogICogICAgICAgICAgICAgIG1ldGhvZF9ub2RlICAgICAtIENvbnRyb2wgbWV0aG9kIE5TIG5vZGUsIGlmIGFueQogICogICAgICAgICAgICAgIGFtbF9zdGFydCAgICAgICAtIFN0YXJ0IG9mIEFNTAogICogICAgICAgICAgICAgIGFtbF9sZW5ndGggICAgICAtIExlbmd0aCBvZiBBTUwKLSAqICAgICAgICAgICAgICBQYXJhbXMgICAgICAgICAgLSBNZXRob2QgYXJncywgaWYgYW55Ci0gKiAgICAgICAgICAgICAgcmV0dXJuX29ial9kZXNjIC0gV2hlcmUgdG8gc3RvcmUgYSByZXR1cm4gb2JqZWN0LCBpZiBhbnkKKyAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jayAocGFyYW1zLCBldGMuKQogICogICAgICAgICAgICAgIHBhc3NfbnVtYmVyICAgICAtIDEsIDIsIG9yIDMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC05MzEsNyArNzYxLDcgQEAKIAogCS8qIFRoZSBuZXh0X29wIG9mIHRoZSBuZXh0X3dhbGsgd2lsbCBiZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXRob2QgKi8KIAotCXdhbGtfc3RhdGUtPm5leHRfb3AgICAgICAgICAgICAgPSBOVUxMOworCXdhbGtfc3RhdGUtPm5leHRfb3AgPSBOVUxMOwogCiAJaWYgKGluZm8pIHsKIAkJaWYgKGluZm8tPnBhcmFtZXRlcl90eXBlID09IEFDUElfUEFSQU1fR1BFKSB7CkBAIC05MzksOCArNzY5LDggQEAKIAkJCQkJICAgaW5mby0+cGFyYW1ldGVycyk7CiAJCX0KIAkJZWxzZSB7Ci0JCQl3YWxrX3N0YXRlLT5wYXJhbXMgICAgICAgICAgICAgID0gaW5mby0+cGFyYW1ldGVyczsKLQkJCXdhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYyAgPSAmaW5mby0+cmV0dXJuX29iamVjdDsKKwkJCXdhbGtfc3RhdGUtPnBhcmFtcyAgICAgICAgICA9IGluZm8tPnBhcmFtZXRlcnM7CisJCQl3YWxrX3N0YXRlLT5jYWxsZXJfcmV0dXJuX2Rlc2MgPSAmaW5mby0+cmV0dXJuX29iamVjdDsKIAkJfQogCX0KIApAQCAtOTY0LDcgKzc5NCw4IEBACiAKIAkJLyogSW5pdCB0aGUgbWV0aG9kIGFyZ3VtZW50cyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfaW5pdF9hcmdzICh3YWxrX3N0YXRlLT5wYXJhbXMsIEFDUElfTUVUSE9EX05VTV9BUkdTLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9pbml0X2FyZ3MgKHdhbGtfc3RhdGUtPnBhcmFtcywKKwkJCQkgQUNQSV9NRVRIT0RfTlVNX0FSR1MsIHdhbGtfc3RhdGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTEwMzEsMTIgKzg2MiwxNCBAQAogCX0KIAogCWlmICh3YWxrX3N0YXRlLT5kYXRhX3R5cGUgIT0gQUNQSV9ERVNDX1RZUEVfV0FMSykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIGlzIG5vdCBhIHZhbGlkIHdhbGsgc3RhdGVcbiIsIHdhbGtfc3RhdGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICIlcCBpcyBub3QgYSB2YWxpZCB3YWxrIHN0YXRlXG4iLAorCQkJd2Fsa19zdGF0ZSkpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zY29wZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIHdhbGsgc3RpbGwgaGFzIGEgc2NvcGUgbGlzdFxuIiwgd2Fsa19zdGF0ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIiVwIHdhbGsgc3RpbGwgaGFzIGEgc2NvcGUgbGlzdFxuIiwKKwkJCXdhbGtfc3RhdGUpKTsKIAl9CiAKIAkvKiBBbHdheXMgbXVzdCBmcmVlIGFueSBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KQEAgLTEwNzgsNyArOTExLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFB1cmdlIHRoZSBnbG9iYWwgc3RhdGUgb2JqZWN0IGNhY2hlLiAgVXNlZCBkdXJpbmcgc3Vic3lzdGVtCiAgKiAgICAgICAgICAgICAgdGVybWluYXRpb24uCkBAIC0xMDk4LDMgKzkzMSwyMDAgQEAKICNlbmRpZgogCiAKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19yZXN1bHRfaW5zZXJ0CisgKgorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBPYmplY3QgdG8gcHVzaAorICogICAgICAgICAgICAgIEluZGV4ICAgICAgICAgICAgICAgLSBXaGVyZSB0byBpbnNlcnQgdGhlIG9iamVjdAorICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IFdhbGsgc3RhdGUKKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IEluc2VydCBhbiBvYmplY3Qgb250byB0aGlzIHdhbGsncyByZXN1bHQgc3RhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19yZXN1bHRfaW5zZXJ0ICgKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3QsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlOworCisKKwlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJkc19yZXN1bHRfaW5zZXJ0Iik7CisKKworCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKKwlpZiAoIXN0YXRlKSB7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiTm8gcmVzdWx0IG9iamVjdCBwdXNoZWQhIFN0YXRlPSVwXG4iLAorCQkJd2Fsa19zdGF0ZSkpOworCQlyZXR1cm4gKEFFX05PVF9FWElTVCk7CisJfQorCisJaWYgKGluZGV4ID49IEFDUElfT0JKX05VTV9PUEVSQU5EUykgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJJbmRleCBvdXQgb2YgcmFuZ2U6ICVYIE9iaj0lcCBTdGF0ZT0lcCBOdW09JVhcbiIsCisJCQlpbmRleCwgb2JqZWN0LCB3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cykpOworCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOworCX0KKworCWlmICghb2JqZWN0KSB7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIk51bGwgT2JqZWN0ISBJbmRleD0lWCBPYmo9JXAgU3RhdGU9JXAgTnVtPSVYXG4iLAorCQkJaW5kZXgsIG9iamVjdCwgd2Fsa19zdGF0ZSwgc3RhdGUtPnJlc3VsdHMubnVtX3Jlc3VsdHMpKTsKKwkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKKwl9CisKKwlzdGF0ZS0+cmVzdWx0cy5vYmpfZGVzYyBbaW5kZXhdID0gb2JqZWN0OworCXN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzKys7CisKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkiT2JqPSVwIFslc10gU3RhdGU9JXAgTnVtPSVYIEN1cj0lWFxuIiwKKwkJb2JqZWN0LCBvYmplY3QgPyBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBvYmplY3QpIDogIk5VTEwiLAorCQl3YWxrX3N0YXRlLCBzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cywgd2Fsa19zdGF0ZS0+Y3VycmVudF9yZXN1bHQpKTsKKworCXJldHVybiAoQUVfT0spOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwKKyAqCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ2xlYXIgdGhlIG9iamVjdCBzdGFjayBieSBkZWxldGluZyBhbGwgb2JqZWN0cyB0aGF0IGFyZSBvbiBpdC4KKyAqICAgICAgICAgICAgICBTaG91bGQgYmUgdXNlZCB3aXRoIGdyZWF0IGNhcmUsIGlmIGF0IGFsbCEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19vYmpfc3RhY2tfZGVsZXRlX2FsbCAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKK3sKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CisKKworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwiLCB3YWxrX3N0YXRlKTsKKworCisJLyogVGhlIHN0YWNrIHNpemUgaXMgY29uZmlndXJhYmxlLCBidXQgZml4ZWQgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX09CSl9OVU1fT1BFUkFORFM7IGkrKykgeworCQlpZiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pIHsKKwkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0pOworCQkJd2Fsa19zdGF0ZS0+b3BlcmFuZHNbaV0gPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBwb3BwZWQgb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogUG9wIHRoaXMgd2FsaydzIG9iamVjdCBzdGFjay4gIE9iamVjdHMgb24gdGhlIHN0YWNrIGFyZSBOT1QKKyAqICAgICAgICAgICAgICBkZWxldGVkIGJ5IHRoaXMgcm91dGluZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV9kc19vYmpfc3RhY2tfcG9wX29iamVjdCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCUFDUElfRlVOQ1RJT05fTkFNRSAoImRzX29ial9zdGFja19wb3Bfb2JqZWN0Iik7CisKKworCS8qIENoZWNrIGZvciBzdGFjayB1bmRlcmZsb3cgKi8KKworCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJNaXNzaW5nIG9wZXJhbmQvc3RhY2sgZW1wdHkhIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQl3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJKm9iamVjdCA9IE5VTEw7CisJCXJldHVybiAoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCS8qIFBvcCB0aGUgc3RhY2sgKi8KKworCXdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcy0tOworCisJLyogQ2hlY2sgZm9yIGEgdmFsaWQgb3BlcmFuZCAqLworCisJaWYgKCF3YWxrX3N0YXRlLT5vcGVyYW5kcyBbd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzXSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJOdWxsIG9wZXJhbmQhIFN0YXRlPSVwICNPcHM9JVhcbiIsCisJCQl3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMpKTsKKwkJKm9iamVjdCA9IE5VTEw7CisJCXJldHVybiAoQUVfQU1MX05PX09QRVJBTkQpOworCX0KKworCS8qIEdldCBvcGVyYW5kIGFuZCBzZXQgc3RhY2sgZW50cnkgdG8gbnVsbCAqLworCisJKm9iamVjdCA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdOworCXdhbGtfc3RhdGUtPm9wZXJhbmRzIFt3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKKworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmo9JXAgWyVzXSBTdGF0ZT0lcCAjT3BzPSVYXG4iLAorCQkJICAqb2JqZWN0LCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lICgqb2JqZWN0KSwKKwkJCSAgd2Fsa19zdGF0ZSwgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzKSk7CisKKwlyZXR1cm4gKEFFX09LKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTOiAgSW5kZXggICAgICAgICAgICAgICAtIFN0YWNrIGluZGV4IHdob3NlIHZhbHVlIGlzIGRlc2lyZWQuICBCYXNlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayAoaW5kZXg9MCA9PSB0b3ApCisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgV2FsayBzdGF0ZQorICoKKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgb3BlcmFuZAorICoKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSBhbiBvYmplY3QgZnJvbSB0aGlzIHdhbGsncyBvcGVyYW5kIHN0YWNrLiAgSW5kZXggbXVzdAorICogICAgICAgICAgICAgIGJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlci4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICoKK2FjcGlfZHNfb2JqX3N0YWNrX2dldF92YWx1ZSAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQoreworCisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIgKCJkc19vYmpfc3RhY2tfZ2V0X3ZhbHVlIiwgd2Fsa19zdGF0ZSk7CisKKworCS8qIENhbid0IGRvIGl0IGlmIHRoZSBzdGFjayBpcyBlbXB0eSAqLworCisJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7CisJCXJldHVybl9QVFIgKE5VTEwpOworCX0KKworCS8qIG9yIGlmIHRoZSBpbmRleCBpcyBwYXN0IHRoZSB0b3Agb2YgdGhlIHN0YWNrICovCisKKwlpZiAoaW5kZXggPiAod2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzIC0gKHUzMikgMSkpIHsKKwkJcmV0dXJuX1BUUiAoTlVMTCk7CisJfQorCisJcmV0dXJuX1BUUiAod2Fsa19zdGF0ZS0+b3BlcmFuZHNbKGFjcGlfbmF0aXZlX3VpbnQpKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtIDEpIC0KKwkJCSAgaW5kZXhdKTsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggZmRmMTQzYi4uOGU2NjVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgpAQCAtNDksMTcgKzUwLDE5IEBACiAKICNkZWZpbmUgQUNQSV9FQ19GTEFHX09CRgkweDAxCS8qIE91dHB1dCBidWZmZXIgZnVsbCAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfSUJGCTB4MDIJLyogSW5wdXQgYnVmZmVyIGZ1bGwgKi8KKyNkZWZpbmUgQUNQSV9FQ19GTEFHX0JVUlNUCTB4MTAJLyogYnVyc3QgbW9kZSAqLwogI2RlZmluZSBBQ1BJX0VDX0ZMQUdfU0NJCTB4MjAJLyogRUMtU0NJIG9jY3VycmVkICovCiAKICNkZWZpbmUgQUNQSV9FQ19FVkVOVF9PQkYJMHgwMQkvKiBPdXRwdXQgYnVmZmVyIGZ1bGwgKi8KICNkZWZpbmUgQUNQSV9FQ19FVkVOVF9JQkUJMHgwMgkvKiBJbnB1dCBidWZmZXIgZW1wdHkgKi8KIAotI2RlZmluZSBBQ1BJX0VDX1VERUxBWQkJMTAwCS8qIFBvbGwgQCAxMDB1cyBpbmNyZW1lbnRzICovCi0jZGVmaW5lIEFDUElfRUNfVURFTEFZX0NPVU5UCTEwMDAJLyogV2FpdCAxMG1zIG1heC4gZHVyaW5nIEVDIG9wcyAqLworI2RlZmluZSBBQ1BJX0VDX0RFTEFZCQk1MAkvKiBXYWl0IDUwbXMgbWF4LiBkdXJpbmcgRUMgb3BzICovCiAjZGVmaW5lIEFDUElfRUNfVURFTEFZX0dMSwkxMDAwCS8qIFdhaXQgMW1zIG1heC4gdG8gZ2V0IGdsb2JhbCBsb2NrICovCiAKICNkZWZpbmUgQUNQSV9FQ19DT01NQU5EX1JFQUQJMHg4MAogI2RlZmluZSBBQ1BJX0VDX0NPTU1BTkRfV1JJVEUJMHg4MQorI2RlZmluZSBBQ1BJX0VDX0JVUlNUX0VOQUJMRQkweDgyCisjZGVmaW5lIEFDUElfRUNfQlVSU1RfRElTQUJMRQkweDgzCiAjZGVmaW5lIEFDUElfRUNfQ09NTUFORF9RVUVSWQkweDg0CiAKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKQEAgLTg3LDcgKzkwLDExIEBACiAJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzCWNvbW1hbmRfYWRkcjsKIAlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MJZGF0YV9hZGRyOwogCXVuc2lnbmVkIGxvbmcJCQlnbG9iYWxfbG9jazsKLQlzcGlubG9ja190CQkJbG9jazsKKwl1bnNpZ25lZCBpbnQJCQlleHBlY3RfZXZlbnQ7CisJYXRvbWljX3QJCQlsZWF2aW5nX2J1cnN0OyAvKiAwIDogTm8sIDEgOiBZZXMsIDI6IGFib3J0Ki8KKwlhdG9taWNfdAkJCXBlbmRpbmdfZ3BlOworCXN0cnVjdCBzZW1hcGhvcmUJCXNlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJd2FpdDsKIH07CiAKIC8qIElmIHdlIGZpbmQgYW4gRUMgdmlhIHRoZSBFQ0RULCB3ZSBuZWVkIHRvIGtlZXAgYSBwdHIgdG8gaXRzIGNvbnRleHQgKi8KQEAgLTEwMCw0MiArMTA3LDEyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbiBNYW5hZ2VtZW50CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50Ci1hY3BpX2VjX3dhaXQgKAotCXN0cnVjdCBhY3BpX2VjCQkqZWMsCi0JdTgJCQlldmVudCkKK3N0YXRpYyBpbmxpbmUgdTMyIGFjcGlfZWNfcmVhZF9zdGF0dXMoc3RydWN0IGFjcGlfZWMgKmVjKQogewotCXUzMgkJCWFjcGlfZWNfc3RhdHVzID0gMDsKLQl1MzIJCQlpID0gQUNQSV9FQ19VREVMQVlfQ09VTlQ7CisJdTMyCXN0YXR1cyA9IDA7CiAKLQlpZiAoIWVjKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFBvbGwgdGhlIEVDIHN0YXR1cyByZWdpc3RlciB3YWl0aW5nIGZvciB0aGUgZXZlbnQgdG8gb2NjdXIuICovCi0Jc3dpdGNoIChldmVudCkgewotCWNhc2UgQUNQSV9FQ19FVkVOVF9PQkY6Ci0JCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLCAmZWMtPnN0YXR1c19hZGRyKTsKLQkJCWlmIChhY3BpX2VjX3N0YXR1cyAmIEFDUElfRUNfRkxBR19PQkYpCi0JCQkJcmV0dXJuIDA7Ci0JCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWk+MCk7Ci0JCWJyZWFrOwotCWNhc2UgQUNQSV9FQ19FVkVOVF9JQkU6Ci0JCWRvIHsKLQkJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJmFjcGlfZWNfc3RhdHVzLCAmZWMtPnN0YXR1c19hZGRyKTsKLQkJCWlmICghKGFjcGlfZWNfc3RhdHVzICYgQUNQSV9FQ19GTEFHX0lCRikpCi0JCQkJcmV0dXJuIDA7Ci0JCQl1ZGVsYXkoQUNQSV9FQ19VREVMQVkpOwotCQl9IHdoaWxlICgtLWk+MCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAtRVRJTUU7CisJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmc3RhdHVzLCAmZWMtPnN0YXR1c19hZGRyKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IGFjcGlfZWNfd2FpdChzdHJ1Y3QgYWNwaV9lYyAqZWMsIHVuc2lnbmVkIGludCBldmVudCkKK3sKKwlpbnQJcmVzdWx0ID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfd2FpdCIpOworCisJZWMtPmV4cGVjdF9ldmVudCA9IGV2ZW50OworCXNtcF9tYigpOworCisJcmVzdWx0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZWMtPndhaXQsCisJCQkJCSFlYy0+ZXhwZWN0X2V2ZW50LAorCQkJCQltc2Vjc190b19qaWZmaWVzKEFDUElfRUNfREVMQVkpKTsKKwkKKwllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKKwlzbXBfbWIoKTsKKworCWlmIChyZXN1bHQgPCAwKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiIHJlc3VsdCAgPSAlZCAiLCByZXN1bHQpKTsKKwkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJfQorCisJLyoKKwkgKiBWZXJpZnkgdGhhdCB0aGUgZXZlbnQgaW4gcXVlc3Rpb24gaGFzIGFjdHVhbGx5IGhhcHBlbmVkIGJ5CisJICogcXVlcnlpbmcgRUMgc3RhdHVzLiBEbyB0aGUgY2hlY2sgZXZlbiBpZiBvcGVyYXRpb24gdGltZWQtb3V0CisJICogdG8gbWFrZSBzdXJlIHRoYXQgd2UgZGlkIG5vdCBtaXNzIGludGVycnVwdC4KKwkgKi8KKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBBQ1BJX0VDX0VWRU5UX09CRjoKKwkJaWYgKGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX09CRikKKwkJCXJldHVybl9WQUxVRSgwKTsKKwkJYnJlYWs7CisKKwljYXNlIEFDUElfRUNfRVZFTlRfSUJFOgorCQlpZiAofmFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpICYgQUNQSV9FQ19GTEFHX0lCRikKKwkJCXJldHVybl9WQUxVRSgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuX1ZBTFVFKC1FVElNRSk7Cit9CisKKworCitzdGF0aWMgaW50CithY3BpX2VjX2VudGVyX2J1cnN0X21vZGUgKAorCXN0cnVjdCBhY3BpX2VjCQkqZWMpCit7CisJdTMyCQkJdG1wID0gMDsKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlIik7CisKKwlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJlbnRlcmluZyBidXJzdCBtb2RlIFxuIikpOworCQlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0JVUlNUX0VOQUJMRSwgJmVjLT5jb21tYW5kX2FkZHIpOworCQlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwkJaWYgKHN0YXR1cyl7CisJCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCIgc3RhdHVzID0gJWRcbiIsIHN0YXR1cykpOworCQkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCQl9CisJCWFjcGlfaHdfbG93X2xldmVsX3JlYWQoOCwgJnRtcCwgJmVjLT5kYXRhX2FkZHIpOworCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCWlmKHRtcCAhPSAweDkwICkgey8qIEJ1cnN0IEFDSyBieXRlKi8KKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIkFjayBmYWlsZWQgXG4iKSk7CisJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJCX0KKwl9IGVsc2UKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhbHJlYWR5IGJlIGluIGJ1cnN0IG1vZGUgXG4iKSk7CisJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QgLCAwKTsKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2FjcGlfZWNfbGVhdmVfYnVyc3RfbW9kZSAoCisJc3RydWN0IGFjcGlfZWMJCSplYykKK3sKKwlpbnQJCQlzdGF0dXMgPTA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUiKTsKKworCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0ICwgMSk7CisJc3RhdHVzID0gYWNwaV9lY19yZWFkX3N0YXR1cyhlYyk7CisJaWYgKHN0YXR1cyAhPSAtRUlOVkFMICYmCisJCShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJsZWF2aW5nIGJ1cnN0IG1vZGVcbiIpKTsKKwkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9ESVNBQkxFLCAmZWMtPmNvbW1hbmRfYWRkcik7CisJCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19GTEFHX0lCRik7CisJCWlmIChzdGF0dXMpeworCQkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwiLS0tLS0tLT53YWl0IGZhaWxcbiIpKTsKKwkJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwkJfQorCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCXN0YXR1cyA9IGFjcGlfZWNfcmVhZF9zdGF0dXMoZWMpOworCQlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJCShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCItLS0tLS0tPnN0YXR1cyBmYWlsXG4iKSk7CisJCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJCX0KKwl9ZWxzZQorCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sImFscmVhZHkgYmUgaW4gTm9uLWJ1cnN0IG1vZGUgXG4iKSk7CisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJsZWF2aW5nIGJ1cnN0IG1vZGVcbiIpKTsKKworCXJldHVybl9WQUxVRSgwKTsKK30KIAogc3RhdGljIGludAogYWNwaV9lY19yZWFkICgKQEAgLTE0MywxNiArMjMwLDE1IEBACiAJdTgJCQlhZGRyZXNzLAogCXUzMgkJCSpkYXRhKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludAkJCXN0YXR1cyA9IDA7CisJdTMyCQkJZ2xrOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19yZWFkIik7CiAKIAlpZiAoIWVjIHx8ICFkYXRhKQogCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CiAKK3JldHJ5OgogCSpkYXRhID0gMDsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spIHsKQEAgLTE2MCwzMiArMjQ2LDUwIEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisKKwlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKKwlkb3duKCZlYy0+c2VtKTsKKworCWlmKGFjcGlfZWNfZW50ZXJfYnVyc3RfbW9kZShlYykpCisJCWdvdG8gZW5kOwogCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1JFQUQsICZlYy0+Y29tbWFuZF9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cyA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKKwlpZiAoc3RhdHVzKSB7CiAJCWdvdG8gZW5kOworCX0KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIGFkZHJlc3MsICZlYy0+ZGF0YV9hZGRyKTsKLQlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKLQlpZiAocmVzdWx0KQorCXN0YXR1cz0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7CisJaWYgKHN0YXR1cyl7CisJCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAkJZ290byBlbmQ7Ci0KKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+ZGF0YV9hZGRyKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZWFkIFslMDJ4XSBmcm9tIGFkZHJlc3MgWyUwMnhdXG4iLAogCQkqZGF0YSwgYWRkcmVzcykpOwotCisJCiBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOworCXVwKCZlYy0+c2VtKTsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCi0JcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJaWYoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAyKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhYm9ydGVkLCByZXRyeSAuLi5cbiIpKTsKKwkJd2hpbGUoYXRvbWljX3JlYWQoJmVjLT5wZW5kaW5nX2dwZSkpeworCQkJbXNsZWVwKDEpOwkKKwkJfQorCQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJCWdvdG8gcmV0cnk7CisJfQorCisJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIApAQCAtMTk1LDQ5ICsyOTksODAgQEAKIAl1OAkJCWFkZHJlc3MsCiAJdTgJCQlkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludAkJCXN0YXR1cyA9IDA7CisJdTMyCQkJZ2xrOworCXUzMgkJCXRtcDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfd3JpdGUiKTsKIAogCWlmICghZWMpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQorcmV0cnk6CiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewogCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOworCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOworCWRvd24oJmVjLT5zZW0pOworCisJaWYoYWNwaV9lY19lbnRlcl9idXJzdF9tb2RlKGVjKSkKKwkJZ290byBlbmQ7CisKKwlzdGF0dXMgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKKwlpZiAoc3RhdHVzICE9IC1FSU5WQUwgJiYKKwkJIShzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpKXsKKwkJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19CVVJTVF9FTkFCTEUsICZlYy0+Y29tbWFuZF9hZGRyKTsKKwkJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGVuZDsKKwkJYWNwaV9od19sb3dfbGV2ZWxfcmVhZCg4LCAmdG1wLCAmZWMtPmRhdGFfYWRkcik7CisJCWlmKHRtcCAhPSAweDkwICkgLyogQnVyc3QgQUNLIGJ5dGUqLworCQkJZ290byBlbmQ7CisJfQorCS8qTm93IHdlIGFyZSBpbiBidXJzdCBtb2RlKi8KIAogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9XUklURSwgJmVjLT5jb21tYW5kX2FkZHIpOwotCXJlc3VsdCA9IGFjcGlfZWNfd2FpdChlYywgQUNQSV9FQ19FVkVOVF9JQkUpOwotCWlmIChyZXN1bHQpCisJc3RhdHVzID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CisJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCWlmIChzdGF0dXMpewogCQlnb3RvIGVuZDsKKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBhZGRyZXNzLCAmZWMtPmRhdGFfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlpZiAoc3RhdHVzKXsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCQlnb3RvIGVuZDsKKwl9CiAKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBkYXRhLCAmZWMtPmRhdGFfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfSUJFKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CisJaWYgKHN0YXR1cykKIAkJZ290byBlbmQ7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJXcm90ZSBbJTAyeF0gdG8gYWRkcmVzcyBbJTAyeF1cbiIsCiAJCWRhdGEsIGFkZHJlc3MpKTsKIAogZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CisJYWNwaV9lY19sZWF2ZV9idXJzdF9tb2RlKGVjKTsKKwl1cCgmZWMtPnNlbSk7CiAKIAlpZiAoZWMtPmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIAotCXJldHVybl9WQUxVRShyZXN1bHQpOworCWlmKGF0b21pY19yZWFkKCZlYy0+bGVhdmluZ19idXJzdCkgPT0gMil7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywiYWJvcnRlZCwgcmV0cnkgLi4uXG4iKSk7CisJCXdoaWxlKGF0b21pY19yZWFkKCZlYy0+cGVuZGluZ19ncGUpKXsKKwkJCW1zbGVlcCgxKTsJCisJCX0KKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQlnb3RvIHJldHJ5OworCX0KKworCXJldHVybl9WQUxVRShzdGF0dXMpOwogfQogCiAvKgpAQCAtMjg5LDE2ICs0MjQsMTMgQEAKIAlzdHJ1Y3QgYWNwaV9lYwkJKmVjLAogCXUzMgkJCSpkYXRhKQogewotCWludAkJCXJlc3VsdCA9IDA7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzID0gMDsKLQl1MzIJCQlnbGsgPSAwOworCWludAkJCXN0YXR1cyA9IDA7CisJdTMyCQkJZ2xrOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19xdWVyeSIpOwogCiAJaWYgKCFlYyB8fCAhZGF0YSkKIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwotCiAJKmRhdGEgPSAwOwogCiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewpAQCAtMzA3LDI5ICs0MzksMzkgQEAKIAkJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKKwlkb3duKCZlYy0+c2VtKTsKKwlpZihhY3BpX2VjX2VudGVyX2J1cnN0X21vZGUoZWMpKQorCQlnb3RvIGVuZDsKIAkvKgogCSAqIFF1ZXJ5IHRoZSBFQyB0byBmaW5kIG91dCB3aGljaCBfUXh4IG1ldGhvZCB3ZSBuZWVkIHRvIGV2YWx1YXRlLgogCSAqIE5vdGUgdGhhdCBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHF1ZXJ5IGNhdXNlcyB0aGUgQUNQSV9FQ19TQ0kKIAkgKiBiaXQgdG8gYmUgY2xlYXJlZCAoYW5kIHRodXMgY2xlYXJpbmcgdGhlIGludGVycnVwdCBzb3VyY2UpLgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOwotCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1FVRVJZLCAmZWMtPmNvbW1hbmRfYWRkcik7Ci0JcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX09CRik7Ci0JaWYgKHJlc3VsdCkKKwlzdGF0dXMgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKKwlpZiAoc3RhdHVzKXsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOwogCQlnb3RvIGVuZDsKLQkKKwl9CisKIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsIGRhdGEsICZlYy0+ZGF0YV9hZGRyKTsKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CiAJaWYgKCEqZGF0YSkKLQkJcmVzdWx0ID0gLUVOT0RBVEE7CisJCXN0YXR1cyA9IC1FTk9EQVRBOwogCiBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlhY3BpX2VjX2xlYXZlX2J1cnN0X21vZGUoZWMpOworCXVwKCZlYy0+c2VtKTsKIAogCWlmIChlYy0+Z2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCi0JcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CisJaWYoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAyKXsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCJhYm9ydGVkLCByZXRyeSAuLi5cbiIpKTsKKwkJYWNwaV9lbmFibGVfZ3BlKE5VTEwsIGVjLT5ncGVfYml0LCBBQ1BJX05PVF9JU1IpOworCQlzdGF0dXMgPSAtRU5PREFUQTsKKwl9CisJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CiB9CiAKIApAQCAtMzQ3LDQyICs0ODksMjkgQEAKIAl2b2lkCQkJKmVjX2N4dCkKIHsKIAlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gKHN0cnVjdCBhY3BpX2VjICopIGVjX2N4dDsKLQl1MzIJCQl2YWx1ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3MgPSAwOworCXUzMgkJCXZhbHVlOworCWludAkJCXJlc3VsdCA9IC1FTk9EQVRBOwogCXN0YXRpYyBjaGFyCQlvYmplY3RfbmFtZVs1XSA9IHsnXycsJ1EnLCcwJywnMCcsJ1wwJ307CiAJY29uc3QgY2hhcgkJaGV4W10gPSB7JzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywKIAkJCQkgICAgICAgICAnOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnfTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfZ3BlX3F1ZXJ5Iik7CiAKLQlpZiAoIWVjX2N4dCkKLQkJZ290byBlbmQ7CQorCWlmIChhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKSAmIEFDUElfRUNfRkxBR19TQ0kpCisJCXJlc3VsdCA9IGFjcGlfZWNfcXVlcnkoZWMsICZ2YWx1ZSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKLQlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ2YWx1ZSwgJmVjLT5jb21tYW5kX2FkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBUQkQ6IEltcGxlbWVudCBhc3luY2ggZXZlbnRzIQotCSAqIE5PVEU6IEFsbCB3ZSBjYXJlIGFib3V0IGFyZSBFQy1TQ0kncy4gIE90aGVyIEVDIGV2ZW50cyBhcmUKLQkgKiBoYW5kbGVkIHZpYSBwb2xsaW5nICh5dWNrISkuICBUaGlzIGlzIGJlY2F1c2Ugc29tZSBzeXN0ZW1zCi0JICogdHJlYXQgRUMtU0NJcyBhcyBsZXZlbCAodmVyc3VzIEVER0UhKSB0cmlnZ2VyZWQsIHByZXZlbnRpbmcKLQkgKiAgYSBwdXJlbHkgaW50ZXJydXB0LWRyaXZlbiBhcHByb2FjaCAoZ3J1bWJsZSwgZ3J1bWJsZSkuCi0JICovCi0JaWYgKCEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfU0NJKSkKKwlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCWlmIChhY3BpX2VjX3F1ZXJ5KGVjLCAmdmFsdWUpKQotCQlnb3RvIGVuZDsKLQkKIAlvYmplY3RfbmFtZVsyXSA9IGhleFsoKHZhbHVlID4+IDQpICYgMHgwRildOwogCW9iamVjdF9uYW1lWzNdID0gaGV4Wyh2YWx1ZSAmIDB4MEYpXTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkV2YWx1YXRpbmcgJXNcbiIsIG9iamVjdF9uYW1lKSk7CiAKIAlhY3BpX2V2YWx1YXRlX29iamVjdChlYy0+aGFuZGxlLCBvYmplY3RfbmFtZSwgTlVMTCwgTlVMTCk7Ci0KLWVuZDoKLQlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfTk9UX0lTUik7CitlbmQ6CQorCWF0b21pY19kZWMoJmVjLT5wZW5kaW5nX2dwZSk7CisJcmV0dXJuOwogfQogCiBzdGF0aWMgdTMyCkBAIC0zOTAsNiArNTE5LDcgQEAKIAl2b2lkCQkJKmRhdGEpCiB7CiAJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOworCXUzMgkJCXZhbHVlOwogCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSAoc3RydWN0IGFjcGlfZWMgKikgZGF0YTsKIAogCWlmICghZWMpCkBAIC0zOTcsMTMgKzUyNyw0MSBAQAogCiAJYWNwaV9kaXNhYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9JU1IpOwogCi0Jc3RhdHVzID0gYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKE9TRF9QUklPUklUWV9HUEUsCi0JCWFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJdmFsdWUgPSBhY3BpX2VjX3JlYWRfc3RhdHVzKGVjKTsKIAotCWlmIChzdGF0dXMgPT0gQUVfT0spCi0JCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOwotCWVsc2UKLQkJcmV0dXJuIEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOworCWlmKCh2YWx1ZSAmIEFDUElfRUNfRkxBR19JQkYpICYmCisJCSEodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpICYmCisJCQkoYXRvbWljX3JlYWQoJmVjLT5sZWF2aW5nX2J1cnN0KSA9PSAwKSkgeyAKKwkvKgorCSAqIHRoZSBlbWJlZGRlZCBjb250cm9sbGVyIGRpc2FibGVzIAorCSAqIGJ1cnN0IG1vZGUgZm9yIGFueSByZWFzb24gb3RoZXIgCisJICogdGhhbiB0aGUgYnVyc3QgZGlzYWJsZSBjb21tYW5kCisJICogdG8gcHJvY2VzcyBjcml0aWNhbCBldmVudC4KKwkgKi8KKwkJYXRvbWljX3NldCgmZWMtPmxlYXZpbmdfYnVyc3QgLCAyKTsgLyogYmxvY2sgY3VycmVudCBwZW5kaW5nIHRyYW5zYWN0aW9uCisJCQkJCWFuZCByZXRyeSAqLworCQl3YWtlX3VwKCZlYy0+d2FpdCk7CisJfWVsc2UgeworCQlpZiAoKGVjLT5leHBlY3RfZXZlbnQgPT0gQUNQSV9FQ19FVkVOVF9PQkYgJiYKKwkJCQkodmFsdWUgJiBBQ1BJX0VDX0ZMQUdfT0JGKSkgfHwKKwkgICAgCQkJKGVjLT5leHBlY3RfZXZlbnQgPT0gQUNQSV9FQ19FVkVOVF9JQkUgJiYKKwkJCQkhKHZhbHVlICYgQUNQSV9FQ19GTEFHX0lCRikpKSB7CisJCQllYy0+ZXhwZWN0X2V2ZW50ID0gMDsKKwkJCXdha2VfdXAoJmVjLT53YWl0KTsKKwkJCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOworCQl9CisJfQorCisJaWYgKHZhbHVlICYgQUNQSV9FQ19GTEFHX1NDSSl7CisJCWF0b21pY19hZGQoMSwgJmVjLT5wZW5kaW5nX2dwZSkgOworCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0dQRSwKKwkJCQkJCWFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPworCQlBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEIDogQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQ7CisJfSAKKwlhY3BpX2VuYWJsZV9ncGUoTlVMTCwgZWMtPmdwZV9iaXQsIEFDUElfSVNSKTsKKwlyZXR1cm4gc3RhdHVzID09IEFFX09LID8KKwkJQUNQSV9JTlRFUlJVUFRfSEFORExFRCA6IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDIxLDEwICs1NzksOCBAQAogCSAqIFRoZSBFQyBvYmplY3QgaXMgaW4gdGhlIGhhbmRsZXIgY29udGV4dCBhbmQgaXMgbmVlZGVkCiAJICogd2hlbiBjYWxsaW5nIHRoZSBhY3BpX2VjX3NwYWNlX2hhbmRsZXIuCiAJICovCi0JaWYoZnVuY3Rpb24gPT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgCi0JCSpyZXR1cm5fY29udGV4dCA9IE5VTEw7Ci0JZWxzZSAKLQkJKnJldHVybl9jb250ZXh0ID0gaGFuZGxlcl9jb250ZXh0OworCSpyZXR1cm5fY29udGV4dCAgPSAoZnVuY3Rpb24gIT0gQUNQSV9SRUdJT05fREVBQ1RJVkFURSkgPworCQkJCQkJaGFuZGxlcl9jb250ZXh0IDogTlVMTDsKIAogCXJldHVybiBBRV9PSzsKIH0KQEAgLTQ0MSw3ICs1OTcsNyBAQAogewogCWludAkJCXJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfZWMJCSplYyA9IE5VTEw7Ci0JdTMyCQkJdGVtcCA9IDA7CisJdTY0CQkJdGVtcCA9ICp2YWx1ZTsKIAlhY3BpX2ludGVnZXIJCWZfdiA9IDA7CiAJaW50IAkJCWkgPSAwOwogCkBAIC00NTAsMTAgKzYwNiw5IEBACiAJaWYgKChhZGRyZXNzID4gMHhGRikgfHwgIXZhbHVlIHx8ICFoYW5kbGVyX2NvbnRleHQpCiAJCXJldHVybl9WQUxVRShBRV9CQURfUEFSQU1FVEVSKTsKIAotCWlmKGJpdF93aWR0aCAhPSA4KSB7CisJaWYgKGJpdF93aWR0aCAhPSA4ICYmIGFjcGlfc3RyaWN0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICJhY3BpX2VjX3NwYWNlX2hhbmRsZXI6IGJpdF93aWR0aCBzaG91bGQgYmUgOFxuIik7Ci0JCWlmIChhY3BpX3N0cmljdCkKLQkJCXJldHVybl9WQUxVRShBRV9CQURfUEFSQU1FVEVSKTsKKwkJcmV0dXJuX1ZBTFVFKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAogCWVjID0gKHN0cnVjdCBhY3BpX2VjICopIGhhbmRsZXJfY29udGV4dDsKQEAgLTQ2MSwxMSArNjE2LDExIEBACiBuZXh0X2J5dGU6CiAJc3dpdGNoIChmdW5jdGlvbikgewogCWNhc2UgQUNQSV9SRUFEOgotCQlyZXN1bHQgPSBhY3BpX2VjX3JlYWQoZWMsICh1OCkgYWRkcmVzcywgJnRlbXApOwotCQkqdmFsdWUgPSAoYWNwaV9pbnRlZ2VyKSB0ZW1wOworCQl0ZW1wID0gMDsKKwkJcmVzdWx0ID0gYWNwaV9lY19yZWFkKGVjLCAodTgpIGFkZHJlc3MsICh1MzIgKikmdGVtcCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9XUklURToKLQkJcmVzdWx0ID0gYWNwaV9lY193cml0ZShlYywgKHU4KSBhZGRyZXNzLCAodTgpICp2YWx1ZSk7CisJCXJlc3VsdCA9IGFjcGlfZWNfd3JpdGUoZWMsICh1OCkgYWRkcmVzcywgKHU4KSB0ZW1wKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzdWx0ID0gLUVJTlZBTDsKQEAgLTQ3NCwxOSArNjI5LDE4IEBACiAJfQogCiAJYml0X3dpZHRoIC09IDg7Ci0JaWYoYml0X3dpZHRoKXsKLQotCQlpZihmdW5jdGlvbiA9PSBBQ1BJX1JFQUQpCi0JCQlmX3YgfD0gKGFjcGlfaW50ZWdlcikgKCp2YWx1ZSkgPDwgOCppOwotCQlpZihmdW5jdGlvbiA9PSBBQ1BJX1dSSVRFKQotCQkJKCp2YWx1ZSkgPj49ODsgCisJaWYgKGJpdF93aWR0aCkgeworCQlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKQorCQkJZl92IHw9IHRlbXAgPDwgOCAqIGk7CisJCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1dSSVRFKQorCQkJdGVtcCA+Pj0gODsKIAkJaSsrOworCQlhZGRyZXNzKys7CiAJCWdvdG8gbmV4dF9ieXRlOwogCX0KIAotCi0JaWYoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKXsKLQkJZl92IHw9IChhY3BpX2ludGVnZXIpICgqdmFsdWUpIDw8IDgqaTsKKwlpZiAoZnVuY3Rpb24gPT0gQUNQSV9SRUFEKSB7CisJCWZfdiB8PSB0ZW1wIDw8IDggKiBpOwogCQkqdmFsdWUgPSBmX3Y7CiAJfQogCkBAIC01MDUsOCArNjU5LDYgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm5fVkFMVUUoQUVfT0spOwogCX0KLQkKLQogfQogCiAKQEAgLTUzMyw2ICs2ODUsNyBAQAogCQkodTMyKSBlYy0+c3RhdHVzX2FkZHIuYWRkcmVzcywgKHUzMikgZWMtPmRhdGFfYWRkci5hZGRyZXNzKTsKIAlzZXFfcHJpbnRmKHNlcSwgInVzZSBnbG9iYWwgbG9jazogICAgICAgICAlc1xuIiwKIAkJZWMtPmdsb2JhbF9sb2NrPyJ5ZXMiOiJubyIpOworCWFjcGlfZW5hYmxlX2dwZShOVUxMLCBlYy0+Z3BlX2JpdCwgQUNQSV9OT1RfSVNSKTsKIAogZW5kOgogCXJldHVybl9WQUxVRSgwKTsKQEAgLTU1NSw3ICs3MDgsNyBAQAogYWNwaV9lY19hZGRfZnMgKAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQogewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnkgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkqZW50cnk7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2FkZF9mcyIpOwogCkBAIC02MDYsOSArNzU5LDkgQEAKIGFjcGlfZWNfYWRkICgKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOwotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gTlVMTDsKKwlpbnQJCQlyZXN1bHQ7CisJYWNwaV9zdGF0dXMJCXN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9lYwkJKmVjOwogCXVuc2lnbmVkIGxvbmcJCXVpZDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfYWRkIik7CkBAIC02MjMsNyArNzc2LDEwIEBACiAKIAllYy0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJZWMtPnVpZCA9IC0xOwotCXNwaW5fbG9ja19pbml0KCZlYy0+bG9jayk7CisgCWF0b21pY19zZXQoJmVjLT5wZW5kaW5nX2dwZSwgMCk7CisgCWF0b21pY19zZXQoJmVjLT5sZWF2aW5nX2J1cnN0ICwgMSk7CisgCWluaXRfTVVURVgoJmVjLT5zZW0pOworIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlYy0+d2FpdCk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9FQ19ERVZJQ0VfTkFNRSk7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfRUNfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGVjOwpAQCAtNjM3LDcgKzc5Myw3IEBACiAJaWYgKGVjX2VjZHQgJiYgZWNfZWNkdC0+dWlkID09IHVpZCkgewogCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKIAkJCUFDUElfQURSX1NQQUNFX0VDLCAmYWNwaV9lY19zcGFjZV9oYW5kbGVyKTsKLQkKKwogCQlhY3BpX3JlbW92ZV9ncGVfaGFuZGxlcihOVUxMLCBlY19lY2R0LT5ncGVfYml0LCAmYWNwaV9lY19ncGVfaGFuZGxlcik7CiAKIAkJa2ZyZWUoZWNfZWNkdCk7CkBAIC02NzcsNyArODMzLDcgQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSwKIAlpbnQJCQl0eXBlKQogewotCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSBOVUxMOworCXN0cnVjdCBhY3BpX2VjCQkqZWM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3JlbW92ZSIpOwogCkBAIC03MzIsOCArODg4LDggQEAKIGFjcGlfZWNfc3RhcnQgKAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlKQogewotCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9lYwkJKmVjID0gTlVMTDsKKwlhY3BpX3N0YXR1cwkJc3RhdHVzOworCXN0cnVjdCBhY3BpX2VjCQkqZWM7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3N0YXJ0Iik7CiAKQEAgLTc4OSw4ICs5NDUsOCBAQAogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLAogCWludAkJCXR5cGUpCiB7Ci0JYWNwaV9zdGF0dXMJCXN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX2VjCQkqZWMgPSBOVUxMOworCWFjcGlfc3RhdHVzCQlzdGF0dXM7CisJc3RydWN0IGFjcGlfZWMJCSplYzsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfc3RvcCIpOwogCkBAIC04MzIsNyArOTg4LDYgQEAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0dQRSIsIE5VTEwsICZlY19lY2R0LT5ncGVfYml0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybiBzdGF0dXM7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVjX2VjZHQtPmxvY2spOwogCWVjX2VjZHQtPmdsb2JhbF9sb2NrID0gVFJVRTsKIAllY19lY2R0LT5oYW5kbGUgPSBoYW5kbGU7CiAKQEAgLTg5MCw3ICsxMDQ1LDcgQEAKIAlhY3BpX3N0YXR1cwkJc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2VjZHQgCSplY2R0X3B0cjsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsIAorCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKCJFQ0RUIiwgMSwgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsCiAJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopICZlY2R0X3B0cik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTkwNSwxMSArMTA2MCwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoZWNfZWNkdCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX2VjKSk7CiAKKyAJaW5pdF9NVVRFWCgmZWNfZWNkdC0+c2VtKTsKKyAJaW5pdF93YWl0cXVldWVfaGVhZCgmZWNfZWNkdC0+d2FpdCk7CiAJZWNfZWNkdC0+Y29tbWFuZF9hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7CiAJZWNfZWNkdC0+c3RhdHVzX2FkZHIgPSBlY2R0X3B0ci0+ZWNfY29udHJvbDsKIAllY19lY2R0LT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+ZWNfZGF0YTsKIAllY19lY2R0LT5ncGVfYml0ID0gZWNkdF9wdHItPmdwZV9iaXQ7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVjX2VjZHQtPmxvY2spOwogCS8qIHVzZSB0aGUgR0wganVzdCB0byBiZSBzYWZlICovCiAJZWNfZWNkdC0+Z2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPnVpZCA9IGVjZHRfcHRyLT51aWQ7CkBAIC05NzgsNyArMTEzNCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfZWNfaW5pdCAodm9pZCkKIHsKLQlpbnQJCQlyZXN1bHQgPSAwOworCWludAkJCXJlc3VsdDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfaW5pdCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2ZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCmluZGV4IDJhMjEzNjAuLmRkM2E3MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jCkBAIC00Nyw2ICs0NywxNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldmV2ZW50IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CisKK3N0YXRpYyB1MzIKK2FjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2ggKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTYsNyArNjYsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBldmVudHMuCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBBQ1BJIGV2ZW50cyAoRml4ZWQsIEdQRSkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03OCw5ICs4OCw5IEBACiAJfQogCiAJLyoKLQkgKiBJbml0aWFsaXplIHRoZSBGaXhlZCBhbmQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50cy4gVGhpcyBpcwotCSAqIGRvbmUgcHJpb3IgdG8gZW5hYmxpbmcgU0NJcyB0byBwcmV2ZW50IGludGVycnVwdHMgZnJvbQotCSAqIG9jY3VycmluZyBiZWZvcmUgaGFuZGVycyBhcmUgaW5zdGFsbGVkLgorCSAqIEluaXRpYWxpemUgdGhlIEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnRzLiBUaGlzIGlzIGRvbmUgcHJpb3IgdG8KKwkgKiBlbmFibGluZyBTQ0lzIHRvIHByZXZlbnQgaW50ZXJydXB0cyBmcm9tIG9jY3VycmluZyBiZWZvcmUgdGhlIGhhbmRsZXJzIGFyZQorCSAqIGluc3RhbGxlZC4KIAkgKi8KIAlzdGF0dXMgPSBhY3BpX2V2X2ZpeGVkX2V2ZW50X2luaXRpYWxpemUgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMTYxLDcgKzE3MSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9ldl9maXhlZF9ldmVudF9pbml0aWFsaXplICgKIAl2b2lkKQogewpAQCAtMTgwLDcgKzE5MCw4IEBACiAJCS8qIEVuYWJsZSB0aGUgZml4ZWQgZXZlbnQgKi8KIAogCQlpZiAoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQgIT0gMHhGRikgewotCQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKGFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9baV0uZW5hYmxlX3JlZ2lzdGVyX2lkLAorCQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKAorCQkJCQkgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS5lbmFibGVfcmVnaXN0ZXJfaWQsCiAJCQkJCSAwLCBBQ1BJX01UWF9MT0NLKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlyZXR1cm4gKHN0YXR1cyk7CkBAIC0yMDAsNyArMjExLDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECiAgKgotICogREVTQ1JJUFRJT046IENoZWNrcyB0aGUgUE0gc3RhdHVzIHJlZ2lzdGVyIGZvciBmaXhlZCBldmVudHMKKyAqIERFU0NSSVBUSU9OOiBDaGVja3MgdGhlIFBNIHN0YXR1cyByZWdpc3RlciBmb3IgYWN0aXZlIGZpeGVkIGV2ZW50cwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTIyMSw4ICsyMzIsMTAgQEAKIAkgKiBSZWFkIHRoZSBmaXhlZCBmZWF0dXJlIHN0YXR1cyBhbmQgZW5hYmxlIHJlZ2lzdGVycywgYXMgYWxsIHRoZSBjYXNlcwogCSAqIGRlcGVuZCBvbiB0aGVpciB2YWx1ZXMuICBJZ25vcmUgZXJyb3JzIGhlcmUuCiAJICovCi0JKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywgJmZpeGVkX3N0YXR1cyk7Ci0JKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgJmZpeGVkX2VuYWJsZSk7CisJKHZvaWQpIGFjcGlfaHdfcmVnaXN0ZXJfcmVhZCAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCSAmZml4ZWRfc3RhdHVzKTsKKwkodm9pZCkgYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLAorCQkJICZmaXhlZF9lbmFibGUpOwogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5URVJSVVBUUywKIAkJIkZpeGVkIEV2ZW50IEJsb2NrOiBFbmFibGUgJTA4WCBTdGF0dXMgJTA4WFxuIiwKQEAgLTI1OSw3ICsyNzIsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgorc3RhdGljIHUzMgogYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYwppbmRleCAxMThkNzJhLi4wODExMjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCkBAIC00OCw2ICs0OCwxMiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldmdwZSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKK2FjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zMzUsOCArMzQxLDEwIEBACiAJCQlncGVfYmxvY2sgPSBhY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbaV07CiAJCQlpZiAoZ3BlX2Jsb2NrKSB7CiAJCQkJaWYgKChncGVfbnVtYmVyID49IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIpICYmCi0JCQkJCShncGVfbnVtYmVyIDwgZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlciArIChncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogOCkpKSB7Ci0JCQkJCXJldHVybiAoJmdwZV9ibG9jay0+ZXZlbnRfaW5mb1tncGVfbnVtYmVyIC0gZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOworCQkJCQkoZ3BlX251bWJlciA8IGdwZV9ibG9jay0+YmxvY2tfYmFzZV9udW1iZXIgKworCQkJCQkJKGdwZV9ibG9jay0+cmVnaXN0ZXJfY291bnQgKiA4KSkpIHsKKwkJCQkJcmV0dXJuICgmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvW2dwZV9udW1iZXIgLQorCQkJCQkJZ3BlX2Jsb2NrLT5ibG9ja19iYXNlX251bWJlcl0pOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtNDM3LDcgKzQ0NSw3IEBACiAJCQkJIlJlYWQgR1BFIFJlZ2lzdGVyIGF0IEdQRSVYOiBTdGF0dXM9JTAyWCwgRW5hYmxlPSUwMlhcbiIsCiAJCQkJZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlciwgc3RhdHVzX3JlZywgZW5hYmxlX3JlZykpOwogCi0JCQkvKiBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyBhY3RpdmUgYXQgYWxsIGluIHRoaXMgcmVnaXN0ZXIgKi8KKwkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIGFjdGl2ZSBhdCBhbGwgaW4gdGhpcyByZWdpc3RlciAqLwogCiAJCQllbmFibGVkX3N0YXR1c19ieXRlID0gKHU4KSAoc3RhdHVzX3JlZyAmIGVuYWJsZV9yZWcpOwogCQkJaWYgKCFlbmFibGVkX3N0YXR1c19ieXRlKSB7CkBAIC00NTcsOCArNDY1LDggQEAKIAkJCQkJICogb3IgbWV0aG9kLgogCQkJCQkgKi8KIAkJCQkJaW50X3N0YXR1cyB8PSBhY3BpX2V2X2dwZV9kaXNwYXRjaCAoCi0JCQkJCQkJICAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sCi0JCQkJCQkJICAodTMyKSBqICsgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcik7CisJCQkJCQkmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal0sCisJCQkJCQkodTMyKSBqICsgZ3BlX3JlZ2lzdGVyX2luZm8tPmJhc2VfZ3BlX251bWJlcik7CiAJCQkJfQogCQkJfQogCQl9CkBAIC01MjMsNyArNTMxLDggQEAKIAkgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIEdQRSBpbmZvIGZvciB0aGlzIGxldmVsIC0gd2UgY29weSB0aGUKIAkgKiBpbmZvIHRvIHByZXZlbnQgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHJlbW92ZV9oYW5kbGVyL3JlbW92ZV9ibG9jay4KIAkgKi8KLQlBQ1BJX01FTUNQWSAoJmxvY2FsX2dwZV9ldmVudF9pbmZvLCBncGVfZXZlbnRfaW5mbywgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbykpOworCUFDUElfTUVNQ1BZICgmbG9jYWxfZ3BlX2V2ZW50X2luZm8sIGdwZV9ldmVudF9pbmZvLAorCQlzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX0VWRU5UUyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtNTM0LDcgKzU0Myw4IEBACiAJICogTXVzdCBjaGVjayBmb3IgY29udHJvbCBtZXRob2QgdHlwZSBkaXNwYXRjaCBvbmUgbW9yZQogCSAqIHRpbWUgdG8gYXZvaWQgcmFjZSB3aXRoIGV2X2dwZV9pbnN0YWxsX2hhbmRsZXIKIAkgKi8KLQlpZiAoKGxvY2FsX2dwZV9ldmVudF9pbmZvLmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0gQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EKSB7CisJaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX0RJU1BBVENIX01BU0spID09CisJCQlBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKIAkJLyoKIAkJICogSW52b2tlIHRoZSBHUEUgTWV0aG9kIChfTHh4LCBfRXh4KSBpLmUuLCBldmFsdWF0ZSB0aGUgX0x4eC9fRXh4CiAJCSAqIGNvbnRyb2wgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUKQEAgLTU1Myw3ICs1NjMsOCBAQAogCQl9CiAJfQogCi0JaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0gQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CisJaWYgKChsb2NhbF9ncGVfZXZlbnRfaW5mby5mbGFncyAmIEFDUElfR1BFX1hSVVBUX1RZUEVfTUFTSykgPT0KKwkJCUFDUElfR1BFX0xFVkVMX1RSSUdHRVJFRCkgewogCQkvKgogCQkgKiBHUEUgaXMgbGV2ZWwtdHJpZ2dlcmVkLCB3ZSBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgYWZ0ZXIKIAkJICogaGFuZGxpbmcgdGhlIGV2ZW50LgpAQCAtNTc1LDcgKzU4Niw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZ3BlX2Rpc3BhdGNoCiAgKgotICogUEFSQU1FVEVSUzogIGdwZV9ldmVudF9pbmZvICAtIGluZm8gZm9yIHRoaXMgR1BFCisgKiBQQVJBTUVURVJTOiAgZ3BlX2V2ZW50X2luZm8gIC0gSW5mbyBmb3IgdGhpcyBHUEUKICAqICAgICAgICAgICAgICBncGVfbnVtYmVyICAgICAgLSBOdW1iZXIgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBHUEUgYmxvY2sKICAqCiAgKiBSRVRVUk46ICAgICAgSU5URVJSVVBUX0hBTkRMRUQgb3IgSU5URVJSVVBUX05PVF9IQU5ETEVECkBAIC02MDIsMTAgKzYxMywxMiBAQAogCSAqIElmIGVkZ2UtdHJpZ2dlcmVkLCBjbGVhciB0aGUgR1BFIHN0YXR1cyBiaXQgbm93LiAgTm90ZSB0aGF0CiAJICogbGV2ZWwtdHJpZ2dlcmVkIGV2ZW50cyBhcmUgY2xlYXJlZCBhZnRlciB0aGUgR1BFIGlzIHNlcnZpY2VkLgogCSAqLwotCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PSBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCkgeworCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PQorCQkJQUNQSV9HUEVfRURHRV9UUklHR0VSRUQpIHsKIAkJc3RhdHVzID0gYWNwaV9od19jbGVhcl9ncGUgKGdwZV9ldmVudF9pbmZvKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9ldl9ncGVfZGlzcGF0Y2g6ICVzLCBVbmFibGUgdG8gY2xlYXIgR1BFWyUyWF1cbiIsCisJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCSJhY3BpX2V2X2dwZV9kaXNwYXRjaDogJXMsIFVuYWJsZSB0byBjbGVhciBHUEVbJTJYXVxuIiwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cyksIGdwZV9udW1iZXIpKTsKIAkJCXJldHVybl9WQUxVRSAoQUNQSV9JTlRFUlJVUFRfTk9UX0hBTkRMRUQpOwogCQl9CkBAIC02MzksNyArNjUyLDggQEAKIAogCQkvKiBJdCBpcyBub3cgc2FmZSB0byBjbGVhciBsZXZlbC10cmlnZ2VyZWQgZXZlbnRzLiAqLwogCi0JCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfWFJVUFRfVFlQRV9NQVNLKSA9PSBBQ1BJX0dQRV9MRVZFTF9UUklHR0VSRUQpIHsKKwkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9YUlVQVF9UWVBFX01BU0spID09CisJCQkJQUNQSV9HUEVfTEVWRUxfVFJJR0dFUkVEKSB7CiAJCQlzdGF0dXMgPSBhY3BpX2h3X2NsZWFyX2dwZSAoZ3BlX2V2ZW50X2luZm8pOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCUFDUElfUkVQT1JUX0VSUk9SICgoCkBAIC03MDQsNyArNzE4LDYgQEAKIAogCiAjaWZkZWYgQUNQSV9HUEVfTk9USUZZX0NIRUNLCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUQkQ6IE5PVCBVU0VELCBQUk9UT1RZUEUgT05MWSBBTkQgV0lMTCBQUk9CQUJMWSBCRSBSRU1PVkVECiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCmluZGV4IDAwZDk4MWYuLjg0MTg2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKQEAgLTQ4LDYgKzQ4LDM5IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FVkVOVFMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV2Z3BlYmxrIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfc2F2ZV9tZXRob2RfaW5mbyAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2Rlc2MsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9tYXRjaF9wcndfYW5kX2dwZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mbywKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKworc3RhdGljIHN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICoKK2FjcGlfZXZfZ2V0X2dwZV94cnVwdF9ibG9jayAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfZGVsZXRlX2dwZV94cnVwdCAoCisJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0KTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V2X2luc3RhbGxfZ3BlX2Jsb2NrICgKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2ssCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfbGV2ZWwpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyAoCisJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE1NSw3ICsxODgsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycwogICoKQEAgLTE5MCw3ICsyMjMsOCBAQAogCQlmb3IgKGogPSAwOyBqIDwgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7IGorKykgewogCQkJZ3BlX2V2ZW50X2luZm8gPSAmZ3BlX2Jsb2NrLT5ldmVudF9pbmZvWyhpICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICsgal07CiAKLQkJCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0gQUNQSV9HUEVfRElTUEFUQ0hfSEFORExFUikgeworCQkJaWYgKChncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQorCQkJCQlBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7CiAJCQkJQUNQSV9NRU1fRlJFRSAoZ3BlX2V2ZW50X2luZm8tPmRpc3BhdGNoLmhhbmRsZXIpOwogCQkJCWdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyID0gTlVMTDsKIAkJCQlncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJj0gfkFDUElfR1BFX0RJU1BBVENIX01BU0s7CkBAIC00NzEsNyArNTA1LDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXZfZ2V0X2dwZV94cnVwdF9ibG9jayIpOwogCiAKLQkvKiBObyBuZWVkIGZvciBzcGluIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyBoZXJlICovCisJLyogTm8gbmVlZCBmb3IgbG9jayBzaW5jZSB3ZSBhcmUgbm90IGNoYW5naW5nIGFueSBsaXN0IGVsZW1lbnRzIGhlcmUgKi8KIAogCW5leHRfZ3BlX3hydXB0ID0gYWNwaV9nYmxfZ3BlX3hydXB0X2xpc3RfaGVhZDsKIAl3aGlsZSAobmV4dF9ncGVfeHJ1cHQpIHsKQEAgLTYxOSw3ICs2NTMsNyBAQAogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CiAKLQkvKiBJbnN0YWxsIHRoZSBuZXcgYmxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBmb3IgdGhpcyBpbnRlcnJ1cHQgd2l0aCBsb2NrICovCisJLyogSW5zdGFsbCB0aGUgbmV3IGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2l0aCBsb2NrICovCiAKIAlhY3BpX29zX2FjcXVpcmVfbG9jayAoYWNwaV9nYmxfZ3BlX2xvY2ssIEFDUElfTk9UX0lTUik7CiAJaWYgKGdwZV94cnVwdF9ibG9jay0+Z3BlX2Jsb2NrX2xpc3RfaGVhZCkgewpAQCAtNzU2LDEwICs3OTAsMTIgQEAKIAkgKiBwZXIgcmVnaXN0ZXIuICBJbml0aWFsaXphdGlvbiB0byB6ZXJvcyBpcyBzdWZmaWNpZW50LgogCSAqLwogCWdwZV9ldmVudF9pbmZvID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKLQkJCSAgICgoYWNwaV9zaXplKSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKKwkJCSAgICgoYWNwaV9zaXplKSBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50ICoKKwkJCSAgIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIKSAqCiAJCQkgICBzaXplb2YgKHN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvKSk7CiAJaWYgKCFncGVfZXZlbnRfaW5mbykgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX2V2ZW50X2luZm8gdGFibGVcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiQ291bGQgbm90IGFsbG9jYXRlIHRoZSBncGVfZXZlbnRfaW5mbyB0YWJsZVxuIikpOwogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CkBAIC04OTksNyArOTM1LDggQEAKIAlncGVfYmxvY2stPmJsb2NrX2Jhc2VfbnVtYmVyID0gZ3BlX2Jsb2NrX2Jhc2VfbnVtYmVyOwogCWdwZV9ibG9jay0+bm9kZSAgICAgICAgICAgPSBncGVfZGV2aWNlOwogCi0JQUNQSV9NRU1DUFkgKCZncGVfYmxvY2stPmJsb2NrX2FkZHJlc3MsIGdwZV9ibG9ja19hZGRyZXNzLCBzaXplb2YgKHN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcykpOworCUFDUElfTUVNQ1BZICgmZ3BlX2Jsb2NrLT5ibG9ja19hZGRyZXNzLCBncGVfYmxvY2tfYWRkcmVzcywKKwkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpKTsKIAogCS8qIENyZWF0ZSB0aGUgcmVnaXN0ZXJfaW5mbyBhbmQgZXZlbnRfaW5mbyBzdWItc3RydWN0dXJlcyAqLwogCkBAIC0xMDYxLDggKzEwOTgsOSBAQAogCiAJCS8qIEluc3RhbGwgR1BFIEJsb2NrIDAgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwgJmFjcGlfZ2JsX0ZBRFQtPnhncGUwX2JsaywKLQkJCQkgcmVnaXN0ZXJfY291bnQwLCAwLCBhY3BpX2dibF9GQURULT5zY2lfaW50LCAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzBdKTsKKwkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrIChhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJICZhY3BpX2dibF9GQURULT54Z3BlMF9ibGssIHJlZ2lzdGVyX2NvdW50MCwgMCwKKwkJCQkgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwgJmFjcGlfZ2JsX2dwZV9mYWR0X2Jsb2Nrc1swXSk7CiAKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKQEAgLTEwOTQsOCArMTEzMiw5IEBACiAJCWVsc2UgewogCQkJLyogSW5zdGFsbCBHUEUgQmxvY2sgMSAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V2X2NyZWF0ZV9ncGVfYmxvY2sgKGFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSwgJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywKLQkJCQkJIHJlZ2lzdGVyX2NvdW50MSwgYWNwaV9nYmxfRkFEVC0+Z3BlMV9iYXNlLAorCQkJc3RhdHVzID0gYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrIChhY3BpX2dibF9mYWR0X2dwZV9kZXZpY2UsCisJCQkJCSAmYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLCByZWdpc3Rlcl9jb3VudDEsCisJCQkJCSBhY3BpX2dibF9GQURULT5ncGUxX2Jhc2UsCiAJCQkJCSBhY3BpX2dibF9GQURULT5zY2lfaW50LCAmYWNwaV9nYmxfZ3BlX2ZhZHRfYmxvY2tzWzFdKTsKIAogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMTEwOSw3ICsxMTQ4LDcgQEAKIAkJCSAqIHNwYWNlLiBIb3dldmVyLCBHUEUwIGFsd2F5cyBzdGFydHMgYXQgR1BFIG51bWJlciB6ZXJvLgogCQkJICovCiAJCQlncGVfbnVtYmVyX21heCA9IGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmFzZSArCi0JCQkJCSAgICgocmVnaXN0ZXJfY291bnQxICogQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpIC0gMSk7CisJCQkJCSAgKChyZWdpc3Rlcl9jb3VudDEgKiBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgLSAxKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggMjU0OGVmYS4uNjU5ZTkwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC01MCw2ICs1MCwzNSBAQAogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXZtaXNjIikKIAogCisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKK3N0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICphY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tdID0KK3sKKwkiQnVzIENoZWNrIiwKKwkiRGV2aWNlIENoZWNrIiwKKwkiRGV2aWNlIFdha2UiLAorCSJFamVjdCByZXF1ZXN0IiwKKwkiRGV2aWNlIENoZWNrIExpZ2h0IiwKKwkiRnJlcXVlbmN5IE1pc21hdGNoIiwKKwkiQnVzIE1vZGUgTWlzbWF0Y2giLAorCSJQb3dlciBGYXVsdCIKK307CisjZW5kaWYKKworLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2ggKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitzdGF0aWMgdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQgKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitzdGF0aWMgdTMyCithY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIgKAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfaXNfbm90aWZ5X29iamVjdApAQCAtOTgsMjAgKzEyNyw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAqYWNwaV9ub3RpZnlfdmFsdWVfbmFtZXNbXSA9Ci17Ci0JIkJ1cyBDaGVjayIsCi0JIkRldmljZSBDaGVjayIsCi0JIkRldmljZSBXYWtlIiwKLQkiRWplY3QgcmVxdWVzdCIsCi0JIkRldmljZSBDaGVjayBMaWdodCIsCi0JIkZyZXF1ZW5jeSBNaXNtYXRjaCIsCi0JIkJ1cyBNb2RlIE1pc21hdGNoIiwKLQkiUG93ZXIgRmF1bHQiCi19OwotI2VuZGlmCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V2X3F1ZXVlX25vdGlmeV9yZXF1ZXN0ICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLApAQCAtMTI4LDkgKzE0MywxMCBAQAogCiAJLyoKIAkgKiBGb3IgdmFsdWUgMyAoRWplY3Rpb24gUmVxdWVzdCksIHNvbWUgZGV2aWNlIG1ldGhvZCBtYXkgbmVlZCB0byBiZSBydW4uCi0JICogRm9yIHZhbHVlIDIgKERldmljZSBXYWtlKSBpZiBfUFJXIGV4aXN0cywgdGhlIF9QUzAgbWV0aG9kIG1heSBuZWVkIHRvIGJlIHJ1bi4KKwkgKiBGb3IgdmFsdWUgMiAoRGV2aWNlIFdha2UpIGlmIF9QUlcgZXhpc3RzLCB0aGUgX1BTMCBtZXRob2QgbWF5IG5lZWQKKwkgKiAgIHRvIGJlIHJ1bi4KIAkgKiBGb3IgdmFsdWUgMHg4MCAoU3RhdHVzIENoYW5nZSkgb24gdGhlIHBvd2VyIGJ1dHRvbiBvciBzbGVlcCBidXR0b24sCi0JICogaW5pdGlhdGUgc29mdC1vZmYgb3Igc2xlZXAgb3BlcmF0aW9uPworCSAqICAgaW5pdGlhdGUgc29mdC1vZmYgb3Igc2xlZXAgb3BlcmF0aW9uPwogCSAqLwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCiAJCSJEaXNwYXRjaGluZyBOb3RpZnkoJVgpIG9uIG5vZGUgJXBcbiIsIG5vdGlmeV92YWx1ZSwgbm9kZSkpOwpAQCAtMTQwLDggKzE1Niw5IEBACiAJCQkJYWNwaV9ub3RpZnlfdmFsdWVfbmFtZXNbbm90aWZ5X3ZhbHVlXSkpOwogCX0KIAllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIk5vdGlmeSB2YWx1ZTogMHglMi4yWCAqKkRldmljZSBTcGVjaWZpYyoqXG4iLAotCQkJCW5vdGlmeV92YWx1ZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLAorCQkJIk5vdGlmeSB2YWx1ZTogMHglMi4yWCAqKkRldmljZSBTcGVjaWZpYyoqXG4iLAorCQkJbm90aWZ5X3ZhbHVlKSk7CiAJfQogCiAJLyogR2V0IHRoZSBub3RpZnkgb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBOUyBOb2RlICovCkBAIC0yMTAsNyArMjI3LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2gKICAqCi0gKiBQQVJBTUVURVJTOiAgQ29udGV4dCAgICAgICAgIC0gVG8gYmUgcGFzc3NlZCB0byB0aGUgbm90aWZ5IGhhbmRsZXIKKyAqIFBBUkFNRVRFUlM6ICBDb250ZXh0ICAgICAgICAgLSBUbyBiZSBwYXNzZWQgdG8gdGhlIG5vdGlmeSBoYW5kbGVyCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUuCiAgKgpAQCAtMjE5LDcgKzIzNiw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQorc3RhdGljIHZvaWQgQUNQSV9TWVNURU1fWEZBQ0UKIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoICgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KQogewpAQCAtMjM0LDcgKzI1MSw4IEBACiAKIAkvKgogCSAqIFdlIHdpbGwgaW52b2tlIGEgZ2xvYmFsIG5vdGlmeSBoYW5kbGVyIGlmIGluc3RhbGxlZC4KLQkgKiBUaGlzIGlzIGRvbmUgX2JlZm9yZV8gd2UgaW52b2tlIHRoZSBwZXItZGV2aWNlIGhhbmRsZXIgYXR0YWNoZWQgdG8gdGhlIGRldmljZS4KKwkgKiBUaGlzIGlzIGRvbmUgX2JlZm9yZV8gd2UgaW52b2tlIHRoZSBwZXItZGV2aWNlIGhhbmRsZXIgYXR0YWNoZWQKKwkgKiB0byB0aGUgZGV2aWNlLgogCSAqLwogCWlmIChub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpIHsKIAkJLyogR2xvYmFsIHN5c3RlbSBub3RpZmljYXRpb24gaGFuZGxlciAqLwpAQCAtMjU2LDE1ICsyNzQsMTcgQEAKIAkvKiBJbnZva2UgdGhlIHN5c3RlbSBoYW5kbGVyIGZpcnN0LCBpZiBwcmVzZW50ICovCiAKIAlpZiAoZ2xvYmFsX2hhbmRsZXIpIHsKLQkJZ2xvYmFsX2hhbmRsZXIgKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwgZ2xvYmFsX2NvbnRleHQpOworCQlnbG9iYWxfaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLCBub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlLAorCQkJZ2xvYmFsX2NvbnRleHQpOwogCX0KIAogCS8qIE5vdyBpbnZva2UgdGhlIHBlci1kZXZpY2UgaGFuZGxlciwgaWYgcHJlc2VudCAqLwogCiAJaGFuZGxlcl9vYmogPSBub3RpZnlfaW5mby0+bm90aWZ5LmhhbmRsZXJfb2JqOwogCWlmIChoYW5kbGVyX29iaikgewotCQloYW5kbGVyX29iai0+bm90aWZ5LmhhbmRsZXIgKG5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSwgbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKLQkJCQkgIGhhbmRsZXJfb2JqLT5ub3RpZnkuY29udGV4dCk7CisJCWhhbmRsZXJfb2JqLT5ub3RpZnkuaGFuZGxlciAobm90aWZ5X2luZm8tPm5vdGlmeS5ub2RlLAorCQkJbm90aWZ5X2luZm8tPm5vdGlmeS52YWx1ZSwKKwkJCWhhbmRsZXJfb2JqLT5ub3RpZnkuY29udGV4dCk7CiAJfQogCiAJLyogQWxsIGRvbmUgd2l0aCB0aGUgaW5mbyBvYmplY3QgKi8KQEAgLTM3MCw3ICszOTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfaW5pdF9nbG9iYWxfbG9ja19oYW5kbGVyICh2b2lkKQorYWNwaV9ldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKQEAgLTM4MCw3ICs0MDEsNyBAQAogCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfcHJlc2VudCA9IFRSVUU7CiAJc3RhdHVzID0gYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIgKEFDUElfRVZFTlRfR0xPQkFMLAotCQkJICBhY3BpX2V2X2dsb2JhbF9sb2NrX2hhbmRsZXIsIE5VTEwpOworCQkJIGFjcGlfZXZfZ2xvYmFsX2xvY2tfaGFuZGxlciwgTlVMTCk7CiAKIAkvKgogCSAqIElmIHRoZSBnbG9iYWwgbG9jayBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBsYXRmb3JtLCB0aGUgYXR0ZW1wdApAQCAtNDMzLDggKzQ1NCwxMCBAQAogCiAJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfdGhyZWFkX2NvdW50Kys7CiAKLQkvKiBJZiB3ZSAoT1Mgc2lkZSB2cy4gQklPUyBzaWRlKSBoYXZlIHRoZSBoYXJkd2FyZSBsb2NrIGFscmVhZHksIHdlIGFyZSBkb25lICovCi0KKwkvKgorCSAqIElmIHdlIChPUyBzaWRlIHZzLiBCSU9TIHNpZGUpIGhhdmUgdGhlIGhhcmR3YXJlIGxvY2sgYWxyZWFkeSwKKwkgKiB3ZSBhcmUgZG9uZQorCSAqLwogCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAl9CkBAIC00ODAsNyArNTAzLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKHZvaWQpCithY3BpX2V2X3JlbGVhc2VfZ2xvYmFsX2xvY2sgKAorCXZvaWQpCiB7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gRkFMU0U7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKQEAgLTQ5MCw3ICs1MTQsOCBAQAogCiAKIAlpZiAoIWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgewotCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgiQ2Fubm90IHJlbGVhc2UgSFcgR2xvYmFsIExvY2ssIGl0IGhhcyBub3QgYmVlbiBhY3F1aXJlZFxuIikpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HKCgKKwkJCSJDYW5ub3QgcmVsZWFzZSBIVyBHbG9iYWwgTG9jaywgaXQgaGFzIG5vdCBiZWVuIGFjcXVpcmVkXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0FDUVVJUkVEKTsKIAl9CiAKQEAgLTUxNSw3ICs1NDAsOCBAQAogCSAqIHJlZ2lzdGVyCiAJICovCiAJaWYgKHBlbmRpbmcpIHsKLQkJc3RhdHVzID0gYWNwaV9zZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX0dMT0JBTF9MT0NLX1JFTEVBU0UsIDEsIEFDUElfTVRYX0xPQ0spOworCQlzdGF0dXMgPSBhY3BpX3NldF9yZWdpc3RlciAoQUNQSV9CSVRSRUdfR0xPQkFMX0xPQ0tfUkVMRUFTRSwKKwkJCQkgMSwgQUNQSV9NVFhfTE9DSyk7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtNTM1LDcgKzU2MSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2V2X3Rlcm1pbmF0ZSAodm9pZCkKK2FjcGlfZXZfdGVybWluYXRlICgKKwl2b2lkKQogewogCWFjcGlfbmF0aXZlX3VpbnQgICAgICAgICAgICAgICAgaTsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKQEAgLTU1NSw3ICs1ODIsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fRklYRURfRVZFTlRTOyBpKyspIHsKIAkJCXN0YXR1cyA9IGFjcGlfZGlzYWJsZV9ldmVudCAoKHUzMikgaSwgMCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJDb3VsZCBub3QgZGlzYWJsZSBmaXhlZCBldmVudCAlZFxuIiwgKHUzMikgaSkpOworCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCQkiQ291bGQgbm90IGRpc2FibGUgZml4ZWQgZXZlbnQgJWRcbiIsICh1MzIpIGkpKTsKIAkJCX0KIAkJfQogCkBAIC01NjcsNyArNTk1LDggQEAKIAogCQlzdGF0dXMgPSBhY3BpX2V2X3JlbW92ZV9zY2lfaGFuZGxlciAoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCByZW1vdmUgU0NJIGhhbmRsZXJcbiIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJDb3VsZCBub3QgcmVtb3ZlIFNDSSBoYW5kbGVyXG4iKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwppbmRleCA3NzIzNDI3Li5hMWQ3Mjc2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYwpAQCAtNTgsNiArNTgsMjIgQEAKIAkJCSBBQ1BJX0FEUl9TUEFDRV9QQ0lfQ09ORklHLAogCQkJIEFDUElfQURSX1NQQUNFX0RBVEFfVEFCTEV9OwogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9ldl9yZWdfcnVuICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXZfaW5zdGFsbF9oYW5kbGVyICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTc5LDggKzE5NSw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfZXhlY3V0ZV9yZWdfbWV0aG9kCiAgKgotICogUEFSQU1FVEVSUzogIHJlZ2lvbl9vYmogICAgICAgICAgLSBPYmplY3Qgc3RydWN0dXJlCi0gKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgICAtIFBhc3NlZCB0byBfUkVHOiAgT24gKDEpIG9yIE9mZiAoMCkKKyAqIFBBUkFNRVRFUlM6ICByZWdpb25fb2JqICAgICAgICAgIC0gUmVnaW9uIG9iamVjdAorICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBQYXNzZWQgdG8gX1JFRzogT24gKDEpIG9yIE9mZiAoMCkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzIzLDE0ICszMzksMTYgQEAKIAkJaWYgKCFyZWdpb25fc2V0dXApIHsKIAkJCS8qIE5vIGluaXRpYWxpemF0aW9uIHJvdXRpbmUsIGV4aXQgd2l0aCBlcnJvciAqLwogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIk5vIGluaXQgcm91dGluZSBmb3IgcmVnaW9uKCVwKSBbJXNdXG4iLAogCQkJCXJlZ2lvbl9vYmosIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fb2JqLT5yZWdpb24uc3BhY2VfaWQpKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PVF9FWElTVCk7CiAJCX0KIAogCQkvKgotCQkgKiBXZSBtdXN0IGV4aXQgdGhlIGludGVycHJldGVyIGJlY2F1c2UgdGhlIHJlZ2lvbiBzZXR1cCB3aWxsIHBvdGVudGlhbGx5Ci0JCSAqIGV4ZWN1dGUgY29udHJvbCBtZXRob2RzIChlLmcuLCBfUkVHIG1ldGhvZCBmb3IgdGhpcyByZWdpb24pCisJCSAqIFdlIG11c3QgZXhpdCB0aGUgaW50ZXJwcmV0ZXIgYmVjYXVzZSB0aGUgcmVnaW9uCisJCSAqIHNldHVwIHdpbGwgcG90ZW50aWFsbHkgZXhlY3V0ZSBjb250cm9sIG1ldGhvZHMKKwkJICogKGUuZy4sIF9SRUcgbWV0aG9kIGZvciB0aGlzIHJlZ2lvbikKIAkJICovCiAJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlciAoKTsKIApAQCAtNjIxLDcgKzYzOSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9ldl9pbnN0YWxsX2hhbmRsZXIgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLApAQCAtODQ4LDcgKzg2Niw4IEBACiAJCQkJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPT0gaGFuZGxlcikgewogCQkJCQkvKgogCQkJCQkgKiBJdCBpcyAocmVsYXRpdmVseSkgT0sgdG8gYXR0ZW1wdCB0byBpbnN0YWxsIHRoZSBTQU1FCi0JCQkJCSAqIGhhbmRsZXIgdHdpY2UuIFRoaXMgY2FuIGVhc2lseSBoYXBwZW4gd2l0aCBQQ0lfQ29uZmlnIHNwYWNlLgorCQkJCQkgKiBoYW5kbGVyIHR3aWNlLiBUaGlzIGNhbiBlYXNpbHkgaGFwcGVuCisJCQkJCSAqIHdpdGggUENJX0NvbmZpZyBzcGFjZS4KIAkJCQkJICovCiAJCQkJCXN0YXR1cyA9IEFFX1NBTUVfSEFORExFUjsKIAkJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CkBAIC0xMDExLDcgKzEwMzAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXZfcmVnX3J1biAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKaW5kZXggNDk4M2EzMy4uOTViYzA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYwpAQCAtNjEsNyArNjEsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRG8gYW55IHByZXAgd29yayBmb3IgcmVnaW9uIGhhbmRsaW5nLCBhIG5vcCBmb3Igbm93CisgKiBERVNDUklQVElPTjogU2V0dXAgYSBzeXN0ZW1fbWVtb3J5IG9wZXJhdGlvbiByZWdpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMTUsNyArMTE1LDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IERvIGFueSBwcmVwIHdvcmsgZm9yIHJlZ2lvbiBoYW5kbGluZworICogREVTQ1JJUFRJT046IFNldHVwIGEgSU8gb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE0NCwxNCArMTQ0LDE0IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXAKICAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgIC0gUmVnaW9uIHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIFJlZ2lvbiB3ZSBhcmUgaW50ZXJlc3RlZCBpbgogICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBTdGFydCBvciBzdG9wCiAgKiAgICAgICAgICAgICAgaGFuZGxlcl9jb250ZXh0ICAgICAtIEFkZHJlc3Mgc3BhY2UgaGFuZGxlciBjb250ZXh0CiAgKiAgICAgICAgICAgICAgcmVnaW9uX2NvbnRleHQgICAgICAtIFJlZ2lvbiBzcGVjaWZpYyBjb250ZXh0CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIFBDSV9Db25maWcgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCiAgKgpAQCAtMzI0LDcgKzMyNCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIHBjaV9iQVIgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCiAgKgpAQCAtMzU1LDcgKzM1NSw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBTZXR1cCBhIENNT1Mgb3BlcmF0aW9uIHJlZ2lvbgogICoKICAqIE1VVEVYOiAgICAgICBBc3N1bWVzIG5hbWVzcGFjZSBpcyBub3QgbG9ja2VkCiAgKgpAQCAtMzg2LDcgKzM4Niw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBEbyBhbnkgcHJlcCB3b3JrIGZvciByZWdpb24gaGFuZGxpbmcKKyAqIERFU0NSSVBUSU9OOiBEZWZhdWx0IHJlZ2lvbiBpbml0aWFsaXphdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYwppbmRleCA0NmIzMTk5Li5mMzEyM2MyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCkBAIC00OSw2ICs0OSwxMiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVZFTlRTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJldnNjaSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHUzMiBBQ1BJX1NZU1RFTV9YRkFDRQorYWNwaV9ldl9zY2lfeHJ1cHRfaGFuZGxlciAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNDYsNyArMTUyLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgotYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyICh2b2lkKQorYWNwaV9ldl9pbnN0YWxsX3NjaV9oYW5kbGVyICgKKwl2b2lkKQogewogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTE4MCw3ICsxODcsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZXZfcmVtb3ZlX3NjaV9oYW5kbGVyICh2b2lkKQorYWNwaV9ldl9yZW1vdmVfc2NpX2hhbmRsZXIgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMKaW5kZXggMGJmZWMxMC4uNDA5MmQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmYWNlLmMKQEAgLTY0LDYgKzY0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBTYXZlcyB0aGUgcG9pbnRlciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlciAoCkBAIC00NTcsNyArNDU4LDggQEAKIAkvKiBSb290IE9iamVjdCAqLwogCiAJaWYgKGRldmljZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJSZW1vdmluZyBub3RpZnkgaGFuZGxlciBmb3IgUk9PVCBvYmplY3QuXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCisJCQkiUmVtb3Zpbmcgbm90aWZ5IGhhbmRsZXIgZm9yIFJPT1Qgb2JqZWN0LlxuIikpOwogCiAJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKIAkJCSAgIWFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgICAgICB8fApAQCAtNTY0LDggKzU2Niw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcgogICoKLSAqIFBBUkFNRVRFUlM6ICBncGVfbnVtYmVyICAgICAgLSBUaGUgR1BFIG51bWJlciB3aXRoaW4gdGhlIEdQRSBibG9jawotICogICAgICAgICAgICAgIGdwZV9ibG9jayAgICAgICAtIEdQRSBibG9jayAoTlVMTCA9PSBGQURUIEdQRXMpCisgKiBQQVJBTUVURVJTOiAgZ3BlX2RldmljZSAgICAgIC0gTmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBHUEUgKE5VTEwgZm9yIEZBRFQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIEdQRXMpCisgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gVGhlIEdQRSBudW1iZXIgd2l0aGluIHRoZSBHUEUgYmxvY2sKICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBXaGV0aGVyIHRoaXMgR1BFIHNob3VsZCBiZSB0cmVhdGVkIGFzIGFuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZS0gb3IgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdC4KICAqICAgICAgICAgICAgICBBZGRyZXNzICAgICAgICAgLSBBZGRyZXNzIG9mIHRoZSBoYW5kbGVyCkBAIC02NjIsOCArNjY1LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIKICAqCi0gKiBQQVJBTUVURVJTOiAgZ3BlX251bWJlciAgICAgIC0gVGhlIGV2ZW50IHRvIHJlbW92ZSBhIGhhbmRsZXIKLSAqICAgICAgICAgICAgICBncGVfYmxvY2sgICAgICAgLSBHUEUgYmxvY2sgKE5VTEwgPT0gRkFEVCBHUEVzKQorICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIE5hbWVzcGFjZSBub2RlIGZvciB0aGUgR1BFIChOVUxMIGZvciBGQURUCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBHUEVzKQorICogICAgICAgICAgICAgIGdwZV9udW1iZXIgICAgICAtIFRoZSBldmVudCB0byByZW1vdmUgYSBoYW5kbGVyCiAgKiAgICAgICAgICAgICAgQWRkcmVzcyAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgaGFuZGxlcgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTc2Niw3ICs3NzAsOCBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jawogICoKICAqIFBBUkFNRVRFUlM6ICBUaW1lb3V0ICAgICAgICAgLSBIb3cgbG9uZyB0aGUgY2FsbGVyIGlzIHdpbGxpbmcgdG8gd2FpdAotICogICAgICAgICAgICAgIG91dF9oYW5kbGUgICAgICAtIEEgaGFuZGxlIHRvIHRoZSBsb2NrIGlmIGFjcXVpcmVkCisgKiAgICAgICAgICAgICAgSGFuZGxlICAgICAgICAgIC0gV2hlcmUgdGhlIGhhbmRsZSB0byB0aGUgbG9jayBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBhY3F1aXJlZCkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtODEyLDcgKzgxNyw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBBQ1BJIEdsb2JhbCBMb2NrCisgKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgQUNQSSBHbG9iYWwgTG9jay4gVGhlIGhhbmRsZSBtdXN0IGJlIHZhbGlkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwppbmRleCBmYThkNWYyLi5mMzM3ZGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCkBAIC02NCw3ICs2NCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9lbmFibGUgKHZvaWQpCithY3BpX2VuYWJsZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCkBAIC05MSw3ICs5Miw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULCAiVHJhbnNpdGlvbiB0byBBQ1BJIG1vZGUgc3VjY2Vzc2Z1bFxuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAorCQkJIlRyYW5zaXRpb24gdG8gQUNQSSBtb2RlIHN1Y2Nlc3NmdWxcbiIpKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0xMDYsMTIgKzEwOCwxMyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVHJhbnNmZXJzIHRoZSBzeXN0ZW0gaW50byBMRUdBQ1kgbW9kZS4KKyAqIERFU0NSSVBUSU9OOiBUcmFuc2ZlcnMgdGhlIHN5c3RlbSBpbnRvIExFR0FDWSAobm9uLUFDUEkpIG1vZGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfZGlzYWJsZSAodm9pZCkKK2FjcGlfZGlzYWJsZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCkBAIC0xMjUsNyArMTI4LDggQEAKIAl9CiAKIAlpZiAoYWNwaV9od19nZXRfbW9kZSgpID09IEFDUElfU1lTX01PREVfTEVHQUNZKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJTeXN0ZW0gaXMgYWxyZWFkeSBpbiBsZWdhY3kgKG5vbi1BQ1BJKSBtb2RlXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsCisJCQkiU3lzdGVtIGlzIGFscmVhZHkgaW4gbGVnYWN5IChub24tQUNQSSkgbW9kZVxuIikpOwogCX0KIAllbHNlIHsKIAkJLyogVHJhbnNpdGlvbiB0byBMRUdBQ1kgbW9kZSAqLwpAQCAtMTMzLDcgKzEzNyw4IEBACiAJCXN0YXR1cyA9IGFjcGlfaHdfc2V0X21vZGUgKEFDUElfU1lTX01PREVfTEVHQUNZKTsKIAogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBleGl0IEFDUEkgbW9kZSB0byBsZWdhY3kgbW9kZSIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJDb3VsZCBub3QgZXhpdCBBQ1BJIG1vZGUgdG8gbGVnYWN5IG1vZGUiKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIApAQCAtMjE0LDcgKzIxOSw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYW4gQUNQSSBldmVudCAoZ2VuZXJhbCBwdXJwb3NlKQorICogREVTQ1JJUFRJT046IFNldCB0aGUgdHlwZSBvZiBhbiBpbmRpdmlkdWFsIEdQRQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTUxOSwxMyArNTI0LDEyIEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cwogICoKICAqIFBBUkFNRVRFUlM6ICBFdmVudCAgICAgICAgICAgLSBUaGUgZml4ZWQgZXZlbnQKLSAqICAgICAgICAgICAgICBFdmVudCBTdGF0dXMgICAgLSBXaGVyZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGV2ZW50IHdpbGwKKyAqICAgICAgICAgICAgICBldmVudF9zdGF0dXMgICAgLSBXaGVyZSB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIGV2ZW50IHdpbGwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTU3MSw3ICs1NzUsNyBAQAogICogUEFSQU1FVEVSUzogIGdwZV9kZXZpY2UgICAgICAtIFBhcmVudCBHUEUgRGV2aWNlCiAgKiAgICAgICAgICAgICAgZ3BlX251bWJlciAgICAgIC0gR1BFIGxldmVsIHdpdGhpbiB0aGUgR1BFIGJsb2NrCiAgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgIC0gQ2FsbGVkIGZyb20gYW4gSVNSIG9yIG5vdAotICogICAgICAgICAgICAgIEV2ZW50IFN0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAorICogICAgICAgICAgICAgIGV2ZW50X3N0YXR1cyAgICAtIFdoZXJlIHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgZXZlbnQgd2lsbAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtNzc1LDQgKzc3OSw1IEBACiAJKHZvaWQpIGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiB9CisKIEVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbmZpZy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKaW5kZXggYWMzYzA2MS4uNzM0YjJmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMKQEAgLTU0LDYgKzU0LDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhjb25maWciKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9hZGRfdGFibGUgKAorCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlLAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipkZGJfaGFuZGxlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTcwLDcgKzc4LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2FkZF90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqdGFibGUsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqcGFyZW50X25vZGUsCkBAIC05NSwxMCArMTAzLDEwIEBACiAKIAlBQ1BJX01FTVNFVCAoJnRhYmxlX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCi0JdGFibGVfaW5mby50eXBlICAgICAgICA9IEFDUElfVEFCTEVfU1NEVDsKLQl0YWJsZV9pbmZvLnBvaW50ZXIgICAgID0gdGFibGU7Ci0JdGFibGVfaW5mby5sZW5ndGggICAgICA9IChhY3BpX3NpemUpIHRhYmxlLT5sZW5ndGg7Ci0JdGFibGVfaW5mby5hbGxvY2F0aW9uICA9IEFDUElfTUVNX0FMTE9DQVRFRDsKKwl0YWJsZV9pbmZvLnR5cGUgICAgICA9IEFDUElfVEFCTEVfU1NEVDsKKwl0YWJsZV9pbmZvLnBvaW50ZXIgICA9IHRhYmxlOworCXRhYmxlX2luZm8ubGVuZ3RoICAgID0gKGFjcGlfc2l6ZSkgdGFibGUtPmxlbmd0aDsKKwl0YWJsZV9pbmZvLmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7CiAKIAlzdGF0dXMgPSBhY3BpX3RiX2luc3RhbGxfdGFibGUgKCZ0YWJsZV9pbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yMjYsMTEgKzIzNCwxMCBAQAogCQkJc3RhcnRfbm9kZSA9IHBhcmVudF9ub2RlOwogCQl9CiAKLQkJLyoKLQkJICogRmluZCB0aGUgbm9kZSByZWZlcmVuY2VkIGJ5IHRoZSBwYXJhbWV0ZXJfcGF0aF9zdHJpbmcKLQkJICovCisJCS8qIEZpbmQgdGhlIG5vZGUgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyX3BhdGhfc3RyaW5nICovCisKIAkJc3RhdHVzID0gYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoIChvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlciwgc3RhcnRfbm9kZSwKLQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsICZwYXJhbWV0ZXJfbm9kZSk7CisJCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgJnBhcmFtZXRlcl9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0yNDgsNyArMjU1LDggQEAKIAlpZiAocGFyYW1ldGVyX25vZGUpIHsKIAkJLyogU3RvcmUgdGhlIHBhcmFtZXRlciBkYXRhIGludG8gdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvYmplY3QgKi8KIAotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChvcGVyYW5kWzVdLCBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCBwYXJhbWV0ZXJfbm9kZSksCisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmUgKG9wZXJhbmRbNV0sCisJCQkJIEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QsIHBhcmFtZXRlcl9ub2RlKSwKIAkJCQkgd2Fsa19zdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCSh2b2lkKSBhY3BpX2V4X3VubG9hZF90YWJsZSAoZGRiX2hhbmRsZSk7CkBAIC0zNzEsNyArMzc5LDggQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCXRhYmxlX3B0ciA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciwgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKKwkJdGFibGVfcHRyID0gQUNQSV9DQVNUX1BUUiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyLAorCQkJCSAgYnVmZmVyX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKTsKIAogCQkgLyogU2FuaXR5IGNoZWNrIHRoZSB0YWJsZSBsZW5ndGggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwppbmRleCBkZjdiYTEyLi45Nzg1NmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb252cnQuYwpAQCAtNTAsNiArNTAsMTUgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGNvbnZydCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHUzMgorYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpICgKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTE1LDkgKzEyNCw4IEBACiAJICovCiAJcmVzdWx0ID0gMDsKIAotCS8qCi0JICogU3RyaW5nIGNvbnZlcnNpb24gaXMgZGlmZmVyZW50IHRoYW4gQnVmZmVyIGNvbnZlcnNpb24KLQkgKi8KKwkvKiBTdHJpbmcgY29udmVyc2lvbiBpcyBkaWZmZXJlbnQgdGhhbiBCdWZmZXIgY29udmVyc2lvbiAqLworCiAJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCkBAIC0xNjgsOSArMTc2LDggQEAKIAkJYnJlYWs7CiAJfQogCi0JLyoKLQkgKiBDcmVhdGUgYSBuZXcgaW50ZWdlcgotCSAqLworCS8qIENyZWF0ZSBhIG5ldyBpbnRlZ2VyICovCisKIAlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOwogCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwpAQCAtMjUxLDcgKzI1OCw4IEBACiAJCSAqIEFTTC9BTUwgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhlIG51bGwgYmVpbmcgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldwogCQkgKiBidWZmZXIuCiAJCSAqLwotCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2J1ZmZlcl9vYmplY3QgKChhY3BpX3NpemUpIG9ial9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfYnVmZmVyX29iamVjdCAoCisJCQkJICAoYWNwaV9zaXplKSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJCX0KQEAgLTI5MSw3ICsyOTksNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXUzMgorc3RhdGljIHUzMgogYWNwaV9leF9jb252ZXJ0X3RvX2FzY2lpICgKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGludGVnZXIsCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLApAQCAtMzU3LDggKzM2NSw5IEBACiAKIAljYXNlIDE2OgogCi0JCWhleF9sZW5ndGggPSBBQ1BJX01VTF8yIChkYXRhX3dpZHRoKTsgLyogMiBhc2NpaSBoZXggY2hhcnMgcGVyIGRhdGEgYnl0ZSAqLworCQkvKiBoZXhfbGVuZ3RoOiAyIGFzY2lpIGhleCBjaGFycyBwZXIgZGF0YSBieXRlICovCiAKKwkJaGV4X2xlbmd0aCA9IEFDUElfTVVMXzIgKGRhdGFfd2lkdGgpOwogCQlmb3IgKGkgPSAwLCBqID0gKGhleF9sZW5ndGgtMSk7IGkgPCBoZXhfbGVuZ3RoOyBpKyssIGotLSkgewogCQkJLyogR2V0IG9uZSBoZXggZGlnaXQsIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXRzIGZpcnN0ICovCiAKQEAgLTQ3NSw3ICs0ODQsNyBAQAogCQkvKiBTZXR1cCBzdHJpbmcgbGVuZ3RoLCBiYXNlLCBhbmQgc2VwYXJhdG9yICovCiAKIAkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUw6IC8qIFVzZWQgYnkgdG9fZGVjaW1hbF9zdHJpbmcgb3BlcmF0b3IgKi8KKwkJY2FzZSBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfREVDSU1BTDogLyogVXNlZCBieSB0b19kZWNpbWFsX3N0cmluZyAqLwogCQkJLyoKIAkJCSAqIEZyb20gQUNQSTogIklmIERhdGEgaXMgYSBidWZmZXIsIGl0IGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZgogCQkJICogZGVjaW1hbCB2YWx1ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcy4iCkBAIC01MDksNyArNTE4LDcgQEAKIAkJCXN0cmluZ19sZW5ndGggPSAob2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGggKiAzKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0hFWDogICAgIC8qIFVzZWQgYnkgdG9faGV4X3N0cmluZyBvcGVyYXRvciAqLworCQljYXNlIEFDUElfRVhQTElDSVRfQ09OVkVSVF9IRVg6ICAgICAvKiBVc2VkIGJ5IHRvX2hleF9zdHJpbmcgKi8KIAkJCS8qCiAJCQkgKiBGcm9tIEFDUEk6ICJJZiBEYXRhIGlzIGEgYnVmZmVyLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YKIAkJCSAqIGhleGFkZWNpbWFsIHZhbHVlcyBzZXBhcmF0ZWQgYnkgY29tbWFzLiIKQEAgLTUzMCw5ICs1MzksOCBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfU1RSSU5HX0xJTUlUKTsKIAkJfQogCi0JCS8qCi0JCSAqIENyZWF0ZSBhIG5ldyBzdHJpbmcgb2JqZWN0IGFuZCBzdHJpbmcgYnVmZmVyCi0JCSAqLworCQkvKiBDcmVhdGUgYSBuZXcgc3RyaW5nIG9iamVjdCBhbmQgc3RyaW5nIGJ1ZmZlciAqLworCiAJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdCAoKGFjcGlfc2l6ZSkgc3RyaW5nX2xlbmd0aCk7CiAJCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKQEAgLTU1MSw4ICs1NTksMTAgQEAKIAkJCSpuZXdfYnVmKysgPSBzZXBhcmF0b3I7IC8qIGVhY2ggc2VwYXJhdGVkIGJ5IGEgY29tbWEgb3Igc3BhY2UgKi8KIAkJfQogCi0JCS8qIE51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgKG92ZXJ3cml0ZXMgZmluYWwgY29tbWEvc3BhY2UgZnJvbSBhYm92ZSkgKi8KLQorCQkvKgorCQkgKiBOdWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nCisJCSAqIChvdmVyd3JpdGVzIGZpbmFsIGNvbW1hL3NwYWNlIGZyb20gYWJvdmUpCisJCSAqLwogCQluZXdfYnVmLS07CiAJCSpuZXdfYnVmID0gMDsKIAkJYnJlYWs7CkBAIC02NDUsNyArNjU1LDYgQEAKIAogCiAJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKLQogCQkJLyoKIAkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBTdHJpbmcuICBXZSBjYW4gY29udmVydCBhbgogCQkJICogSW50ZWdlciBvciBCdWZmZXIgaWYgbmVjZXNzYXJ5CkBAIC02NTYsNyArNjY1LDYgQEAKIAogCiAJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQogCQkJLyoKIAkJCSAqIFRoZSBvcGVyYW5kIG11c3QgYmUgYSBCdWZmZXIuICBXZSBjYW4gY29udmVydCBhbgogCQkJICogSW50ZWdlciBvciBTdHJpbmcgaWYgbmVjZXNzYXJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCmluZGV4IGQ5NGMyNjAuLjgxMmNkY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCkBAIC01NSw3ICs1NSw3IEBACiAKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfYWxpYXMKICAqCkBAIC02NSw3ICs2NSw3IEBACiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBuYW1lZCBhbGlhcwogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX2FsaWFzICgKQEAgLTE0MCw4ICsxNDAsNyBAQAogCQkgKiB0YXJnZXQgbm9kZSBvciB0aGUgYWxpYXMgTm9kZQogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChhbGlhc19ub2RlLAotCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRhcmdldF9ub2RlKSwKLQkJCQkgdGFyZ2V0X25vZGUtPnR5cGUpOworCQkJCSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKHRhcmdldF9ub2RlKSwgdGFyZ2V0X25vZGUtPnR5cGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTE1MSw3ICsxNTAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfZXZlbnQKICAqCkBAIC0xNjEsNyArMTYwLDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IGV2ZW50IG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX2V2ZW50ICgKQEAgLTE4NSw3ICsxODQsNyBAQAogCSAqIHRoYXQgdGhlIGV2ZW50IGlzIGNyZWF0ZWQgaW4gYW4gdW5zaWduYWxsZWQgc3RhdGUKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUgKEFDUElfTk9fVU5JVF9MSU1JVCwgMCwKLQkJCSAgICZvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlKTsKKwkJCSAmb2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTkzLDcgKzE5Miw3IEBACiAJLyogQXR0YWNoIG9iamVjdCB0byB0aGUgTm9kZSAqLwogCiAJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0ICgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF0sCi0JCQkgICBvYmpfZGVzYywgQUNQSV9UWVBFX0VWRU5UKTsKKwkJCSBvYmpfZGVzYywgQUNQSV9UWVBFX0VWRU5UKTsKIAogY2xlYW51cDoKIAkvKgpAQCAtMjA1LDcgKzIwNCw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9tdXRleAogICoKQEAgLTIxNyw3ICsyMTYsNyBAQAogICoKICAqICAgICAgICAgICAgICBNdXRleCAoTmFtZVswXSwgc3luY19sZXZlbFsxXSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9tdXRleCAoCkBAIC0yNjcsMjAgKzI2NiwyMCBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9jcmVhdGVfcmVnaW9uCiAgKgogICogUEFSQU1FVEVSUzogIGFtbF9zdGFydCAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSByZWdpb24gZGVjbGFyYXRpb24gQU1MCiAgKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgICAgICAtIE1heCBsZW5ndGggb2YgdGhlIGRlY2xhcmF0aW9uIEFNTAotICogICAgICAgICAgICAgIE9wZXJhbmRzICAgICAgICAgICAgLSBMaXN0IG9mIG9wZXJhbmRzIGZvciB0aGUgb3Bjb2RlCisgKiAgICAgICAgICAgICAgcmVnaW9uX3NwYWNlICAgICAgICAtIHNwYWNlX2lEIGZvciB0aGUgcmVnaW9uCiAgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBvcGVyYXRpb24gcmVnaW9uIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX3JlZ2lvbiAoCkBAIC0zMjEsNyArMzIwLDcgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiUmVnaW9uIFR5cGUgLSAlcyAoJVgpXG4iLAotCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnaW9uX3NwYWNlKSwgcmVnaW9uX3NwYWNlKSk7CisJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWdpb25fc3BhY2UpLCByZWdpb25fc3BhY2UpKTsKIAogCS8qIENyZWF0ZSB0aGUgcmVnaW9uIGRlc2NyaXB0b3IgKi8KIApAQCAtMzYwLDcgKzM1OSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV90YWJsZV9yZWdpb24KICAqCkBAIC0zNzAsNyArMzY5LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IGRhdGFfdGFibGVfcmVnaW9uIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiAoCkBAIC00NTUsNyArNDU0LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfY3JlYXRlX3Byb2Nlc3NvcgogICoKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogICoKICAqICAgICAgICAgICAgICBQcm9jZXNzb3IgKE5hbWVbMF0sIGNwdV9pRFsxXSwgcGJsb2NrX2FkZHJbMl0sIHBibG9ja19sZW5ndGhbM10pCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jcmVhdGVfcHJvY2Vzc29yICgKQEAgLTQ4OCw5ICs0ODcsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzb3Igb2JqZWN0IGZyb20gdGhlIG9wZXJhbmRzCi0JICovCisJLyogSW5pdGlhbGl6ZSB0aGUgcHJvY2Vzc29yIG9iamVjdCBmcm9tIHRoZSBvcGVyYW5kcyAqLworCiAJb2JqX2Rlc2MtPnByb2Nlc3Nvci5wcm9jX2lkID0gKHU4KSAgICAgICAgICBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwogCW9ial9kZXNjLT5wcm9jZXNzb3IuYWRkcmVzcyA9IChhY3BpX2lvX2FkZHJlc3MpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CiAJb2JqX2Rlc2MtPnByb2Nlc3Nvci5sZW5ndGggPSAodTgpICAgICAgICAgICBvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlOwpAQCAtNTA3LDcgKzUwNSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZQogICoKQEAgLTUxOSw3ICs1MTcsNyBAQAogICoKICAqICAgICAgICAgICAgICBwb3dlcl9yZXNvdXJjZSAoTmFtZVswXSwgc3lzdGVtX2xldmVsWzFdLCByZXNvdXJjZV9vcmRlclsyXSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSAoCkBAIC01NTUsMTAgKzU1MywxMCBAQAogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KLQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2NyZWF0ZV9tZXRob2QKICAqCkBAIC01NzAsNyArNTY4LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmV3IG1ldGhvZCBvYmplY3QKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NyZWF0ZV9tZXRob2QgKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCmluZGV4IGUyZjdjMzIuLjQwODUwMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKQEAgLTUxLDIzICs1MSw0OCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4ZHVtcCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCitzdGF0aWMgdm9pZAorYWNwaV9leF9vdXRfc3RyaW5nICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X291dF9wb2ludGVyICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CisKK3N0YXRpYyB2b2lkCithY3BpX2V4X291dF9pbnRlZ2VyICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworc3RhdGljIHZvaWQKK2FjcGlfZXhfb3V0X2FkZHJlc3MgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAorCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgdmFsdWUpOworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCisKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHVzZWQgZm9yIGRlYnVnIG91dHB1dCBvbmx5CiAgKi8KICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmQKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgLSBQb2ludGVyIHRvIGVudHJ5IHRvIGJlIGR1bXBlZAorICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAtIFBvaW50ZXIgdG8gZW50cnkgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgRGVwdGggICAgICAgICAgIC0gQ3VycmVudCBuZXN0aW5nIGRlcHRoCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcCBhbiBvcGVyYW5kIG9iamVjdAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV9leF9kdW1wX29wZXJhbmQgKApAQCAtODYsOSArMTExLDggQEAKIAl9CiAKIAlpZiAoIW9ial9kZXNjKSB7Ci0JCS8qCi0JCSAqIFRoaXMgY291bGQgYmUgYSBudWxsIGVsZW1lbnQgb2YgYSBwYWNrYWdlCi0JCSAqLworCQkvKiBUaGlzIGNvdWxkIGJlIGEgbnVsbCBlbGVtZW50IG9mIGEgcGFja2FnZSAqLworCiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJOdWxsIE9iamVjdCBEZXNjcmlwdG9yXG4iKSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTcsNiArMTQxLDggQEAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVwICIsIG9ial9kZXNjKSk7CiAJfQogCisJLyogRGVjb2RlIG9iamVjdCB0eXBlICovCisKIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKQEAgLTI3NCw3ICszMDAsOSBAQAogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKIAogCQlhY3BpX29zX3ByaW50ZiAoIlN0cmluZyBsZW5ndGggJVggQCAlcCAiLAotCQkJb2JqX2Rlc2MtPnN0cmluZy5sZW5ndGgsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisJCQlvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCwKKwkJCW9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CisKIAkJYWNwaV91dF9wcmludF9zdHJpbmcgKG9ial9kZXNjLT5zdHJpbmcucG9pbnRlciwgQUNQSV9VSU5UOF9NQVgpOwogCQlhY3BpX29zX3ByaW50ZiAoIlxuIik7CiAJCWJyZWFrOwpAQCAtMjkwLDEwICszMTgsMTMgQEAKIAogCQlhY3BpX29zX3ByaW50ZiAoCiAJCQkicmVnaW9uX2ZpZWxkOiBCaXRzPSVYIGFjY193aWR0aD0lWCBMb2NrPSVYIFVwZGF0ZT0lWCBhdCBieXRlPSVYIGJpdD0lWCBvZiBiZWxvdzpcbiIsCi0JCQlvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLAorCQkJb2JqX2Rlc2MtPmZpZWxkLmJpdF9sZW5ndGgsCisJCQlvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCiAJCQlvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfTE9DS19SVUxFX01BU0ssCiAJCQlvYmpfZGVzYy0+ZmllbGQuZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSywKLQkJCW9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LCBvYmpfZGVzYy0+ZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CisJCQlvYmpfZGVzYy0+ZmllbGQuYmFzZV9ieXRlX29mZnNldCwKKwkJCW9ial9kZXNjLT5maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwogCQlhY3BpX2V4X2R1bXBfb3BlcmFuZCAob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmosIGRlcHRoKzEpOwogCQlicmVhazsKIApAQCAtMzA4LDEzICszMzksMTUgQEAKIAogCQlhY3BpX29zX3ByaW50ZiAoCiAJCQkiYnVmZmVyX2ZpZWxkOiAlWCBiaXRzIGF0IGJ5dGUgJVggYml0ICVYIG9mIFxuIiwKLQkJCW9ial9kZXNjLT5idWZmZXJfZmllbGQuYml0X2xlbmd0aCwgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAorCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iaXRfbGVuZ3RoLAorCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAogCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKIAogCQlpZiAoIW9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaikgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIipOVUxMKiBcbiIpKTsKIAkJfQotCQllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSB7CisJCWVsc2UgaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJ1ZmZlcl9vYmopICE9CisJCQkJIEFDUElfVFlQRV9CVUZGRVIpIHsKIAkJCWFjcGlfb3NfcHJpbnRmICgiKm5vdCBhIEJ1ZmZlciogXG4iKTsKIAkJfQogCQllbHNlIHsKQEAgLTMzMSwxMCArMzY0LDEwIEBACiAKIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAKLQkJYWNwaV9vc19wcmludGYgKAotCQkJIk1ldGhvZCglWCkgQCAlcDolWFxuIiwKKwkJYWNwaV9vc19wcmludGYgKCJNZXRob2QoJVgpIEAgJXA6JVhcbiIsCiAJCQlvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50LAotCQkJb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CisJCQlvYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKKwkJCW9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCk7CiAJCWJyZWFrOwogCiAKQEAgLTM3OSw3ICs0MTIsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29wZXJhbmRzCiAgKgpAQCAtMzkzLDcgKzQyNiw3IEBACiAgKgogICogREVTQ1JJUFRJT046IER1bXAgdGhlIG9iamVjdCBzdGFjawogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV9leF9kdW1wX29wZXJhbmRzICgKQEAgLTQ0MSwxMCArNDc0LDkgQEAKIAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X291dCogZnVuY3Rpb25zCiAgKgogICogUEFSQU1FVEVSUzogIFRpdGxlICAgICAgICAgICAgICAgLSBEZXNjcmlwdGl2ZSB0ZXh0CiAgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGRpc3BsYXllZApAQCAtNDUzLDkgKzQ4NSw5IEBACiAgKiAgICAgICAgICAgICAgcmVkdWNlIHRoZSBudW1iZXIgb2YgZm9ybWF0IHN0cmluZ3MgcmVxdWlyZWQgYW5kIGtlZXBzIHRoZW0KICAqICAgICAgICAgICAgICBhbGwgaW4gb25lIHBsYWNlIGZvciBlYXN5IG1vZGlmaWNhdGlvbi4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X291dF9zdHJpbmcgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKQpAQCAtNDYzLDcgKzQ5NSw3IEBACiAJYWNwaV9vc19wcmludGYgKCIlMjBzIDogJXNcbiIsIHRpdGxlLCB2YWx1ZSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX2V4X291dF9wb2ludGVyICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSkKQEAgLTQ3MSw3ICs1MDMsNyBAQAogCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVwXG4iLCB0aXRsZSwgdmFsdWUpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9leF9vdXRfaW50ZWdlciAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKQEAgLTQ3OSw3ICs1MTEsNyBAQAogCWFjcGlfb3NfcHJpbnRmICgiJTIwcyA6ICVYXG4iLCB0aXRsZSwgdmFsdWUpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9leF9vdXRfYWRkcmVzcyAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCiAJYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICB2YWx1ZSkKQEAgLTQ5MywxNiArNTI1LDE2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2R1bXBfbm9kZQogICoKICAqIFBBUkFNRVRFUlM6ICAqTm9kZSAgICAgICAgICAgICAgIC0gRGVzY3JpcHRvciB0byBkdW1wCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAtIEZvcmNlIGRpc3BsYXkKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheSBpZiBUUlVFCiAgKgogICogREVTQ1JJUFRJT046IER1bXBzIHRoZSBtZW1iZXJzIG9mIHRoZSBnaXZlbi5Ob2RlCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX2V4X2R1bXBfbm9kZSAoCkBAIC01MzEsMTYgKzU2MywxNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yCiAgKgogICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAgICAgLSBEZXNjcmlwdG9yIHRvIGR1bXAKLSAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRm9yY2UgZGlzcGxheQorICogICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAgICAgLSBGb3JjZSBkaXNwbGF5IGlmIFRSVUUKICAqCiAgKiBERVNDUklQVElPTjogRHVtcHMgdGhlIG1lbWJlcnMgb2YgdGhlIG9iamVjdCBkZXNjcmlwdG9yIGdpdmVuLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yICgKQEAgLTU1Myw2ICs1ODUsMTAgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfZHVtcF9vYmplY3RfZGVzY3JpcHRvciIpOwogCiAKKwlpZiAoIW9ial9kZXNjKSB7CisJCXJldHVybl9WT0lEOworCX0KKwogCWlmICghZmxhZ3MpIHsKIAkJaWYgKCEoKEFDUElfTFZfT0JKRUNUUyAmIGFjcGlfZGJnX2xldmVsKSAmJiAoX0NPTVBPTkVOVCAmIGFjcGlfZGJnX2xheWVyKSkpIHsKIAkJCXJldHVybl9WT0lEOwpAQCAtNzQ3LDExICs3ODMsMTcgQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAKIAkJYWNwaV9leF9vdXRfaW50ZWdlciAoInRhcmdldF90eXBlIiwgb2JqX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSk7Ci0JCWFjcGlfZXhfb3V0X3N0cmluZyAoIk9wY29kZSIsICAgICAgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKS0+bmFtZSk7CisJCWFjcGlfZXhfb3V0X3N0cmluZyAoIk9wY29kZSIsICAgICAgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoCisJCQkJICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSkpLT5uYW1lKTsKIAkJYWNwaV9leF9vdXRfaW50ZWdlciAoIk9mZnNldCIsICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpOwogCQlhY3BpX2V4X291dF9wb2ludGVyICgib2JqX2Rlc2MiLCAgICBvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCk7CiAJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJOb2RlIiwgICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uubm9kZSk7CiAJCWFjcGlfZXhfb3V0X3BvaW50ZXIgKCJXaGVyZSIsICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uud2hlcmUpOworCisJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgeworCQkJYWNwaV9vc19wcmludGYgKCJcblJlZmVyZW5jZWQgT2JqZWN0OlxuIik7CisJCQlhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LCBmbGFncyk7CisJCX0KIAkJYnJlYWs7CiAKIApAQCAtNzg4LDYgKzgzMCw1IEBACiB9CiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKaW5kZXggYmU3ZjIxMi4uMjJjOGZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCkBAIC0xMjAsOCArMTIwLDggQEAKIAkJICogTm90ZTogU21idXMgcHJvdG9jb2wgdmFsdWUgaXMgcGFzc2VkIGluIHVwcGVyIDE2LWJpdHMgb2YgRnVuY3Rpb24KIAkJICovCiAJCXN0YXR1cyA9IGFjcGlfZXhfYWNjZXNzX3JlZ2lvbiAob2JqX2Rlc2MsIDAsCi0JCQkJICBBQ1BJX0NBU1RfUFRSIChhY3BpX2ludGVnZXIsIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlciksCi0JCQkJICBBQ1BJX1JFQUQgfCAob2JqX2Rlc2MtPmZpZWxkLmF0dHJpYnV0ZSA8PCAxNikpOworCQkJCSBBQ1BJX0NBU1RfUFRSIChhY3BpX2ludGVnZXIsIGJ1ZmZlcl9kZXNjLT5idWZmZXIucG9pbnRlciksCisJCQkJIEFDUElfUkVBRCB8IChvYmpfZGVzYy0+ZmllbGQuYXR0cmlidXRlIDw8IDE2KSk7CiAJCWFjcGlfZXhfcmVsZWFzZV9nbG9iYWxfbG9jayAobG9ja2VkKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTE5Niw2ICsxOTYsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gQ29udGFpbnMgZGF0YSB0byB3cml0ZQogICogICAgICAgICAgICAgIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgbmFtZWQgZmllbGQKKyAqICAgICAgICAgICAgICByZXN1bHRfZGVzYyAgICAgICAgIC0gV2hlcmUgdGhlIHJldHVybiB2YWx1ZSBpcyByZXR1cm5lZCwgaWYgYW55CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI1MCwxMiArMjUxLDE1IEBACiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9CVUZGRVIpIHsKIAkJCUFDUElfUkVQT1JUX0VSUk9SICgoIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciwgZm91bmQgdHlwZSAlc1xuIiwKIAkJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKKwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKIAkJfQogCiAJCWlmIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IEFDUElfU01CVVNfQlVGRkVSX1NJWkUpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciBvZiBsZW5ndGggJVgsIGZvdW5kIGxlbmd0aCAlWFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIlNNQnVzIHdyaXRlIHJlcXVpcmVzIEJ1ZmZlciBvZiBsZW5ndGggJVgsIGZvdW5kIGxlbmd0aCAlWFxuIiwKIAkJCQlBQ1BJX1NNQlVTX0JVRkZFUl9TSVpFLCBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOworCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CVUZGRVJfTElNSVQpOwogCQl9CiAKQEAgLTI2NSwxNCArMjY5LDE2IEBACiAJCX0KIAogCQlidWZmZXIgPSBidWZmZXJfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JCUFDUElfTUVNQ1BZIChidWZmZXIsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwgQUNQSV9TTUJVU19CVUZGRVJfU0laRSk7CisJCUFDUElfTUVNQ1BZIChidWZmZXIsIHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCUFDUElfU01CVVNfQlVGRkVSX1NJWkUpOwogCiAJCS8qIExvY2sgZW50aXJlIHRyYW5zYWN0aW9uIGlmIHJlcXVlc3RlZCAqLwogCiAJCWxvY2tlZCA9IGFjcGlfZXhfYWNxdWlyZV9nbG9iYWxfbG9jayAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5maWVsZF9mbGFncyk7CiAKIAkJLyoKLQkJICogUGVyZm9ybSB0aGUgd3JpdGUgKHJldHVybnMgc3RhdHVzIGFuZCBwZXJoYXBzIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyKQorCQkgKiBQZXJmb3JtIHRoZSB3cml0ZSAocmV0dXJucyBzdGF0dXMgYW5kIHBlcmhhcHMgZGF0YSBpbiB0aGUKKwkJICogc2FtZSBidWZmZXIpCiAJCSAqIE5vdGU6IFNNQnVzIHByb3RvY29sIHR5cGUgaXMgcGFzc2VkIGluIHVwcGVyIDE2LWJpdHMgb2YgRnVuY3Rpb24uCiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX2V4X2FjY2Vzc19yZWdpb24gKG9ial9kZXNjLCAwLApAQCAtMjg0LDkgKzI5MCw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQkvKgotCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgd3JpdHRlbgotCSAqLworCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gYmUgd3JpdHRlbiAqLworCiAJc3dpdGNoIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAkJYnVmZmVyID0gJnNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlOwpAQCAtMzE0LDcgKzMxOSw4IEBACiAJICogdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KIAkgKi8KIAluZXdfYnVmZmVyID0gTlVMTDsKLQlyZXF1aXJlZF9sZW5ndGggPSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCk7CisJcmVxdWlyZWRfbGVuZ3RoID0gQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTICgKKwkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCk7CiAKIAlpZiAobGVuZ3RoIDwgcmVxdWlyZWRfbGVuZ3RoKSB7CiAJCS8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGJ1ZmZlciAqLwpAQCAtMzM4LDYgKzM0NCw3IEBACiAJCSJmaWVsZF93cml0ZSBbRlJPTV06IE9iaiAlcCAoJXM6JVgpLCBCdWYgJXAsIGJ5dGVfbGVuICVYXG4iLAogCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfdHlwZV9uYW1lIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpKSwKIAkJQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSwgYnVmZmVyLCBsZW5ndGgpKTsKKwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJImZpZWxkX3dyaXRlIFtUT106ICBPYmogJXAgKCVzOiVYKSwgYml0X2xlbiAlWCwgYml0X29mZiAlWCwgYnl0ZV9vZmYgJVhcbiIsCiAJCW9ial9kZXNjLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKaW5kZXggOWQwZjlkMi4uM2MyZjg5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCkBAIC01MiwxMiArNTIsMzEgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleGZsZGlvIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfZmllbGRfZGF0dW1faW8gKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKTsKKworc3RhdGljIHU4CithY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X3NldHVwX3JlZ2lvbiAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zZXR1cF9yZWdpb24KICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAgICAgLSBGaWVsZCB0byBiZSByZWFkIG9yIHdyaXR0ZW4KKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQgb3Igd3JpdHRlbgogICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gQnl0ZSBvZmZzZXQgb2YgdGhpcyBkYXR1bSB3aXRoaW4gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgZmllbGQKICAqCkBAIC02OSw3ICs4OCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9leF9zZXR1cF9yZWdpb24gKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpCkBAIC0xMjcsOSArMTQ2LDkgQEAKIAkgKiBsZW5ndGggb2Ygb25lIGZpZWxkIGRhdHVtIChhY2Nlc3Mgd2lkdGgpIG11c3QgZml0IHdpdGhpbiB0aGUgcmVnaW9uLgogCSAqIChSZWdpb24gbGVuZ3RoIGlzIHNwZWNpZmllZCBpbiBieXRlcykKIAkgKi8KLQlpZiAocmduX2Rlc2MtPnJlZ2lvbi5sZW5ndGggPCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0Ci0JCQkgICArIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0Ci0JCQkgICArIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKSB7CisJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArCisJCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSkgewogCQlpZiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7CiAJCQkvKgogCQkJICogU2xhY2sgbW9kZSBvbmx5OiAgV2Ugd2lsbCBnbyBhaGVhZCBhbmQgYWxsb3cgYWNjZXNzIHRvIHRoaXMKQEAgLTE1NSw3ICsxNzQsOCBAQAogCQkJCSJGaWVsZCBbJTQuNHNdIGFjY2VzcyB3aWR0aCAoJWQgYnl0ZXMpIHRvbyBsYXJnZSBmb3IgcmVnaW9uIFslNC40c10gKGxlbmd0aCAlWClcbiIsCiAJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLAogCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChyZ25fZGVzYy0+cmVnaW9uLm5vZGUpLCByZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOworCQkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAocmduX2Rlc2MtPnJlZ2lvbi5ub2RlKSwKKwkJCQlyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwogCQl9CiAKIAkJLyoKQEAgLTE2Nyw3ICsxODcsOCBAQAogCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLm5vZGUpLAogCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAogCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCi0JCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksIHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CisJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKHJnbl9kZXNjLT5yZWdpb24ubm9kZSksCisJCQlyZ25fZGVzYy0+cmVnaW9uLmxlbmd0aCkpOwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lPTl9MSU1JVCk7CiAJfQpAQCAtMTgwLDEwICsyMDEsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY2Nlc3NfcmVnaW9uCiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgICAgIC0gRmllbGQgdG8gYmUgcmVhZAogICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gQnl0ZSBvZmZzZXQgb2YgdGhpcyBkYXR1bSB3aXRoaW4gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQgZmllbGQKLSAqICAgICAgICAgICAgICAqVmFsdWUgICAgICAgICAgICAgICAgICAtIFdoZXJlIHRvIHN0b3JlIHZhbHVlIChtdXN0IGF0IGxlYXN0CisgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBhdCBsZWFzdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNpemUgb2YgYWNwaV9pbnRlZ2VyKQogICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgICAgIC0gUmVhZCBvciBXcml0ZSBmbGFnIHBsdXMgb3RoZXIgcmVnaW9uLQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW50IGZsYWdzCkBAIC0yMjYsOSArMjQ3LDkgQEAKIAkgKiAzKSBUaGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgZmllbGQKIAkgKi8KIAlyZ25fZGVzYyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQucmVnaW9uX29iajsKLQlhZGRyZXNzID0gcmduX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzCi0JCQkgKyBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQKLQkJCSArIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0OworCWFkZHJlc3MgPSByZ25fZGVzYy0+cmVnaW9uLmFkZHJlc3MgKworCQkJIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJCQkgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQ7CiAKIAlpZiAoKGZ1bmN0aW9uICYgQUNQSV9JT19NQVNLKSA9PSBBQ1BJX1JFQUQpIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELCAiW1JFQURdIikpOwpAQCAtMjQ5LDcgKzI3MCw4IEBACiAJLyogSW52b2tlIHRoZSBhcHByb3ByaWF0ZSBhZGRyZXNzX3NwYWNlL29wX3JlZ2lvbiBoYW5kbGVyICovCiAKIAlzdGF0dXMgPSBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2ggKHJnbl9kZXNjLCBmdW5jdGlvbiwKLQkJCSAgYWRkcmVzcywgQUNQSV9NVUxfOCAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCksIHZhbHVlKTsKKwkJCSBhZGRyZXNzLAorCQkJIEFDUElfTVVMXzggKG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpLCB2YWx1ZSk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0lNUExFTUVOVEVEKSB7CkBAIC0yNzQsNyArMjk2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdwogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgICAgICAtIFJlZ2lzdGVyKEZpZWxkKSB0byBiZSB3cml0dGVuCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAgICAgLSBSZWdpc3RlcihGaWVsZCkgdG8gYmUgd3JpdHRlbgogICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCiAgKgogICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdmFsdWUgb3ZlcmZsb3dzIHRoZSBmaWVsZCwgRkFMU0Ugb3RoZXJ3aXNlCkBAIC0yODcsNyArMzA5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11OAorc3RhdGljIHU4CiBhY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKQpAQCAtMzE5LDEwICszNDEsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9maWVsZF9kYXR1bV9pbwogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHJlYWQKICAqICAgICAgICAgICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCAtIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZGF0dW0gd2l0aGluIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IGZpZWxkCi0gKiAgICAgICAgICAgICAgKlZhbHVlICAgICAgICAgICAgICAgICAgLSBXaGVyZSB0byBzdG9yZSB2YWx1ZSAobXVzdCBiZSA2NCBiaXRzKQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgIC0gV2hlcmUgdG8gc3RvcmUgdmFsdWUgKG11c3QgYmUgNjQgYml0cykKICAqICAgICAgICAgICAgICByZWFkX3dyaXRlICAgICAgICAgICAgICAtIFJlYWQgb3IgV3JpdGUgZmxhZwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTMzMyw3ICszNTUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfZmllbGRfZGF0dW1faW8gKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCkBAIC0zNTAsNyArMzcyLDkgQEAKIAlpZiAocmVhZF93cml0ZSA9PSBBQ1BJX1JFQUQpIHsKIAkJaWYgKCF2YWx1ZSkgewogCQkJbG9jYWxfdmFsdWUgPSAwOwotCQkJdmFsdWUgPSAmbG9jYWxfdmFsdWU7IC8qIFRvIHN1cHBvcnQgcmVhZHMgd2l0aG91dCBzYXZpbmcgcmV0dXJuIHZhbHVlICovCisKKwkJCS8qIFRvIHN1cHBvcnQgcmVhZHMgd2l0aG91dCBzYXZpbmcgcmV0dXJuIHZhbHVlICovCisJCQl2YWx1ZSA9ICZsb2NhbF92YWx1ZTsKIAkJfQogCiAJCS8qIENsZWFyIHRoZSBlbnRpcmUgcmV0dXJuIGJ1ZmZlciBmaXJzdCwgW1ZlcnkgSW1wb3J0YW50IV0gKi8KQEAgLTM2Myw4ICszODcsMTAgQEAKIAkgKgogCSAqIGJ1ZmZlcl9maWVsZCAtIFJlYWQvd3JpdGUgZnJvbS90byBhIEJ1ZmZlcgogCSAqIHJlZ2lvbl9maWVsZCAtIFJlYWQvd3JpdGUgZnJvbS90byBhIE9wZXJhdGlvbiBSZWdpb24uCi0JICogYmFua19maWVsZCAgLSBXcml0ZSB0byBhIEJhbmsgUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGFuIG9wX3JlZ2lvbgotCSAqIGluZGV4X2ZpZWxkIC0gV3JpdGUgdG8gYW4gSW5kZXggUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGEgRGF0YSBSZWdpc3RlcgorCSAqIGJhbmtfZmllbGQgIC0gV3JpdGUgdG8gYSBCYW5rIFJlZ2lzdGVyLCB0aGVuIHJlYWQvd3JpdGUgZnJvbS90byBhbgorCSAqICAgICAgICAgICAgICAgb3BlcmF0aW9uX3JlZ2lvbgorCSAqIGluZGV4X2ZpZWxkIC0gV3JpdGUgdG8gYW4gSW5kZXggUmVnaXN0ZXIsIHRoZW4gcmVhZC93cml0ZSBmcm9tL3RvIGEKKwkgKiAgICAgICAgICAgICAgIERhdGEgUmVnaXN0ZXIKIAkgKi8KIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CkBAIC0zODQsMTkgKzQxMCwyMCBAQAogCQkJICogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLgogCQkJICogTGVuZ3RoIGlzIHRoZSBmaWVsZCB3aWR0aCBpbiBieXRlcy4KIAkJCSAqLwotCQkJQUNQSV9NRU1DUFkgKHZhbHVlLCAob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIKLQkJCQkJICArIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYmFzZV9ieXRlX29mZnNldAotCQkJCQkgICsgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JCQkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CisJCQlBQ1BJX01FTUNQWSAodmFsdWUsCisJCQkJKG9ial9kZXNjLT5idWZmZXJfZmllbGQuYnVmZmVyX29iaiktPmJ1ZmZlci5wb2ludGVyICsKKwkJCQkJb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5iYXNlX2J5dGVfb2Zmc2V0ICsKKwkJCQkJZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCk7CiAJCX0KIAkJZWxzZSB7CiAJCQkvKgogCQkJICogQ29weSB0aGUgZGF0YSB0byB0aGUgdGFyZ2V0IGJ1ZmZlci4KIAkJCSAqIExlbmd0aCBpcyB0aGUgZmllbGQgd2lkdGggaW4gYnl0ZXMuCiAJCQkgKi8KLQkJCUFDUElfTUVNQ1BZICgob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIKLQkJCQkJKyBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQKLQkJCQkJKyBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKKwkJCUFDUElfTUVNQ1BZICgob2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5idWZmZXJfb2JqKS0+YnVmZmVyLnBvaW50ZXIgKworCQkJCQlvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQgKworCQkJCQlmaWVsZF9kYXR1bV9ieXRlX29mZnNldCwKIAkJCQkJdmFsdWUsIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpOwogCQl9CiAKQEAgLTQwNiw4ICs0MzMsMTAgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAKLQkJLyogRW5zdXJlIHRoYXQgdGhlIGJhbmtfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YgdGhlIHJlZ2lzdGVyICovCi0KKwkJLyoKKwkJICogRW5zdXJlIHRoYXQgdGhlIGJhbmtfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YKKwkJICogdGhlIHJlZ2lzdGVyCisJCSAqLwogCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAob2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFua19vYmosCiAJCQkJICAoYWNwaV9pbnRlZ2VyKSBvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSkpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKQEAgLTQ0NSw4ICs0NzQsMTAgQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAogCi0JCS8qIEVuc3VyZSB0aGF0IHRoZSBpbmRleF92YWx1ZSBpcyBub3QgYmV5b25kIHRoZSBjYXBhY2l0eSBvZiB0aGUgcmVnaXN0ZXIgKi8KLQorCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgaW5kZXhfdmFsdWUgaXMgbm90IGJleW9uZCB0aGUgY2FwYWNpdHkgb2YKKwkJICogdGhlIHJlZ2lzdGVyCisJCSAqLwogCQlpZiAoYWNwaV9leF9yZWdpc3Rlcl9vdmVyZmxvdyAob2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmluZGV4X29iaiwKIAkJCQkgIChhY3BpX2ludGVnZXIpIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSkpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX1JFR0lTVEVSX0xJTUlUKTsKQEAgLTQ5NiwxNCArNTI3LDE2IEBACiAKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELCAiVmFsdWUgUmVhZCAlOC44WCU4LjhYLCBXaWR0aCAlZFxuIiwKLQkJCQkJICAgQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAotCQkJCQkgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCisJCQkJIlZhbHVlIFJlYWQgJTguOFglOC44WCwgV2lkdGggJWRcbiIsCisJCQkJQUNQSV9GT1JNQVRfVUlOVDY0ICgqdmFsdWUpLAorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJfQogCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwgIlZhbHVlIFdyaXR0ZW4gJTguOFglOC44WCwgV2lkdGggJWRcbiIsCi0JCQkJCSAgIEFDUElfRk9STUFUX1VJTlQ2NCAoKnZhbHVlKSwKLQkJCQkJICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAorCQkJCSJWYWx1ZSBXcml0dGVuICU4LjhYJTguOFgsIFdpZHRoICVkXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoKnZhbHVlKSwKKwkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CiAJCX0KIAl9CiAKQEAgLTUxNSw4ICs1NDgsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlCiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfZGVzYyAgICAgICAgICAgLSBGaWVsZCB0byBiZSBzZXQKLSAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gc3RvcmUKKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgICAgICAtIEZpZWxkIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICBNYXNrICAgICAgICAgICAgICAgICAgICAtIGJpdG1hc2sgd2l0aGluIGZpZWxkIGRhdHVtCisgKiAgICAgICAgICAgICAgZmllbGRfdmFsdWUgICAgICAgICAgICAgLSBWYWx1ZSB0byB3cml0ZQorICogICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0IC0gT2Zmc2V0IG9mIGRhdHVtIHdpdGhpbiBmaWVsZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC02ODksNyArNzI0LDggQEAKIAkJLyogTWVyZ2Ugd2l0aCBwcmV2aW91cyBkYXR1bSBpZiBuZWNlc3NhcnkgKi8KIAogCQltZXJnZWRfZGF0dW0gfD0gcmF3X2RhdHVtIDw8Ci0JCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAKIAkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKIAkJCWJyZWFrOwpAQCAtNzA3LDcgKzc0Myw4IEBACiAKIAkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLwogCi0JYnVmZmVyX3RhaWxfYml0cyA9IG9ial9kZXNjLT5jb21tb25fZmllbGQuYml0X2xlbmd0aCAlIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKKwlidWZmZXJfdGFpbF9iaXRzID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICUKKwkJCSAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKIAlpZiAoYnVmZmVyX3RhaWxfYml0cykgewogCQltZXJnZWRfZGF0dW0gJj0gQUNQSV9NQVNLX0JJVFNfQUJPVkUgKGJ1ZmZlcl90YWlsX2JpdHMpOwogCX0KQEAgLTc5MSw3ICs4MjgsOCBAQAogCQkvKiBXcml0ZSBtZXJnZWQgZGF0dW0gdG8gdGhlIHRhcmdldCBmaWVsZCAqLwogCiAJCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKG9ial9kZXNjLCBtYXNrLCBtZXJnZWRfZGF0dW0sIGZpZWxkX29mZnNldCk7CisJCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsIG1hc2ssCisJCQkJIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC04MDAsNyArODM4LDggQEAKIAogCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKIAkJbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtID4+Ci0JCQkob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKwkJCShvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggLQorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCk7CiAJCW1hc2sgPSBBQ1BJX0lOVEVHRVJfTUFYOwogCiAJCWlmIChpID09IGRhdHVtX2NvdW50KSB7CkBAIC04MTksNyArODU4LDggQEAKIAkvKiBNYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBkYXR1bSAqLwogCiAJYnVmZmVyX3RhaWxfYml0cyA9IChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KSAlIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKKwkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCkgJQorCQkJCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aDsKIAlpZiAoYnVmZmVyX3RhaWxfYml0cykgewogCQltYXNrICY9IEFDUElfTUFTS19CSVRTX0FCT1ZFIChidWZmZXJfdGFpbF9iaXRzKTsKIAl9CkBAIC04MjcsNyArODY3LDggQEAKIAkvKiBXcml0ZSB0aGUgbGFzdCBkYXR1bSB0byB0aGUgZmllbGQgKi8KIAogCW1lcmdlZF9kYXR1bSAmPSBtYXNrOwotCXN0YXR1cyA9IGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAob2JqX2Rlc2MsIG1hc2ssIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKKwlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUgKG9ial9kZXNjLAorCQkJIG1hc2ssIG1lcmdlZF9kYXR1bSwgZmllbGRfb2Zmc2V0KTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYwppbmRleCBiNTQyZGNkLi4wMjJmMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCkBAIC0xMzksOCArMTM5LDkgQEAKIAlyZWZlcmVuY2Vfb2JqLT5yZWZlcmVuY2Uub2JqZWN0ID0gcmVmZXJlbmNlZF9vYmo7CiAJKnJldHVybl9kZXNjID0gcmVmZXJlbmNlX29iajsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmplY3QgJXAgVHlwZSBbJXNdLCByZXR1cm5pbmcgUmVmZXJlbmNlICVwXG4iLAotCQkJb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKG9ial9kZXNjKSwgKnJldHVybl9kZXNjKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJIk9iamVjdCAlcCBUeXBlIFslc10sIHJldHVybmluZyBSZWZlcmVuY2UgJXBcbiIsCisJCW9ial9kZXNjLCBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChvYmpfZGVzYyksICpyZXR1cm5fZGVzYykpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC00NTYsNyArNDU3LDcgQEAKIAkJcmV0dXJuIChpbnRlZ2VyMCAqIGludGVnZXIxKTsKIAogCi0JY2FzZSBBTUxfU0hJRlRfTEVGVF9PUDogICAgICAgICAvKiBzaGlmdF9sZWZ0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLworCWNhc2UgQU1MX1NISUZUX0xFRlRfT1A6ICAgICAgICAgLyogc2hpZnRfbGVmdCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkqLwogCiAJCXJldHVybiAoaW50ZWdlcjAgPDwgaW50ZWdlcjEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwppbmRleCA2OGM0YmIxLi5jM2NiNzE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKQEAgLTQ5LDYgKzQ5LDEzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhtdXRleCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfZXhfbGlua19tdXRleCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICAgICAgICAqdGhyZWFkKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU2LDcgKzYzLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBtdXRleCB0byBiZSB1bmxpbmtlZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFJlbW92ZSBhIG11dGV4IGZyb20gdGhlICJhY3F1aXJlZF9tdXRleCIgbGlzdAogICoKQEAgLTkyLDE2ICs5OSwxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2xpbmtfbXV0ZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBtdXRleCB0byBiZSBsaW5rZWQKLSAqICAgICAgICAgICAgICBsaXN0X2hlYWQgICAgICAgICAgIC0gaGVhZCBvZiB0aGUgImFjcXVpcmVkX211dGV4IiBsaXN0CisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG11dGV4IHRvIGJlIGxpbmtlZAorICogICAgICAgICAgICAgIFRocmVhZCAgICAgICAgICAtIEN1cnJlbnQgZXhlY3V0aW5nIHRocmVhZCBvYmplY3QKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKICAqIERFU0NSSVBUSU9OOiBBZGQgYSBtdXRleCB0byB0aGUgImFjcXVpcmVkX211dGV4IiBsaXN0IGZvciB0aGlzIHdhbGsKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9leF9saW5rX211dGV4ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpCkBAIC0xMzIsOCArMTM5LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hY3F1aXJlX211dGV4CiAgKgotICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAgICAgLSBUaW1lb3V0IGludGVnZXIKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgICAgIC0gTXV0ZXggb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgbWV0aG9kIGV4ZWN1dGlvbiBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xNjEsNyArMTY5LDcgQEAKIAogCWlmICghd2Fsa19zdGF0ZS0+dGhyZWFkKSB7CiAJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIG51bGwgdGhyZWFkIGluZm9cbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAl9CiAKQEAgLTE3MCw4ICsxNzgsOSBAQAogCSAqIG11dGV4LiAgVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgc29tZSBkZWFkbG9jayBwcmV2ZW50aW9uCiAJICovCiAJaWYgKHdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID4gb2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ2Fubm90IGFjcXVpcmUgTXV0ZXggWyU0LjRzXSwgaW5jb3JyZWN0IHN5bmNfbGV2ZWxcbiIsCi0JCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKKwkJCWFjcGlfdXRfZ2V0X25vZGVfbmFtZSAob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX01VVEVYX09SREVSKTsKIAl9CiAKQEAgLTE4MCw4ICsxODksMTAgQEAKIAlpZiAob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCkgewogCQkvKiBTcGVjaWFsIGNhc2UgZm9yIEdsb2JhbCBMb2NrLCBhbGxvdyBhbGwgdGhyZWFkcyAqLwogCi0JCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkID09IHdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSB8fAotCQkJKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSkgeworCQlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCA9PQorCQkJCXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkKSAgICAgIHx8CisJCQkob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSA9PQorCQkJCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkpIHsKIAkJCS8qCiAJCQkgKiBUaGUgbXV0ZXggaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRocmVhZCwKIAkJCSAqIGp1c3QgaW5jcmVtZW50IHRoZSBhY3F1aXNpdGlvbiBkZXB0aApAQCAtMjIxLDYgKzIzMiw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX211dGV4CiAgKgogICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKKyAqICAgICAgICAgICAgICB3YWxrX3N0YXRlICAgICAgICAgIC0gQ3VycmVudCBtZXRob2QgZXhlY3V0aW9uIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI3OCw4ICsyOTAsOSBAQAogCSAqIGVxdWFsIHRvIHRoZSBjdXJyZW50IHN5bmMgbGV2ZWwKIAkgKi8KIAlpZiAob2JqX2Rlc2MtPm11dGV4LnN5bmNfbGV2ZWwgPiB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbFxuIiwKLQkJCQlhY3BpX3V0X2dldF9ub2RlX25hbWUgKG9ial9kZXNjLT5tdXRleC5ub2RlKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIkNhbm5vdCByZWxlYXNlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBzeW5jX2xldmVsXG4iLAorCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lIChvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTVVURVhfT1JERVIpOwogCX0KIApAQCAtMzEzLDExICszMjYsMTEgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZWxlYXNlX2FsbF9tdXRleGVzCiAgKgotICogUEFSQU1FVEVSUzogIG11dGV4X2xpc3QgICAgICAgICAgICAtIEhlYWQgb2YgdGhlIG11dGV4IGxpc3QKKyAqIFBBUkFNRVRFUlM6ICBUaHJlYWQgICAgICAgICAgLSBDdXJyZW50IGV4ZWN1dGluZyB0aHJlYWQgb2JqZWN0CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGFsbCBtdXRleGVzIGluIHRoZSBsaXN0CisgKiBERVNDUklQVElPTjogUmVsZWFzZSBhbGwgbXV0ZXhlcyBoZWxkIGJ5IHRoaXMgdGhyZWFkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKaW5kZXggNzkxMWM1My4uNjM5ZjBiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCkBAIC01MCwxMyArNTAsMTcgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleG5hbWVzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi0vKiBBTUwgUGFja2FnZSBMZW5ndGggZW5jb2RpbmdzICovCitzdGF0aWMgY2hhciAqCithY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9jb3VudCwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MpOwogCi0jZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTEgICAweDQwCi0jZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTIgICAweDQwMDAKLSNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMyAgIDB4NDAwMDAwCi0jZGVmaW5lIEFDUElfQU1MX1BBQ0tBR0VfVFlQRTQgICAweDQwMDAwMDAwCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfbmFtZV9zZWdtZW50ICgKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqaW5fYW1sX2FkZHJlc3MsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmcpOwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC02NCw3ICs2OCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9hbGxvY2F0ZV9uYW1lX3N0cmluZwogICoKICAqIFBBUkFNRVRFUlM6ICBwcmVmaXhfY291bnQgICAgICAgIC0gQ291bnQgb2YgcGFyZW50IGxldmVscy4gU3BlY2lhbCBjYXNlczoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xKSA9IHJvb3QsICAwID0gbm9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEpPT1yb290LCAgMD09bm9uZQogICogICAgICAgICAgICAgIG51bV9uYW1lX3NlZ3MgICAgICAgLSBjb3VudCBvZiA0LWNoYXJhY3RlciBuYW1lIHNlZ21lbnRzCiAgKgogICogUkVUVVJOOiAgICAgIEEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHN0cmluZyBzZWdtZW50LiAgVGhpcyBzZWdtZW50IG11c3QKQEAgLTc1LDcgKzc5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1jaGFyICoKK3N0YXRpYyBjaGFyICoKIGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2NvdW50LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25hbWVfc2VncykKQEAgLTg4LDcgKzkyLDcgQEAKIAogCiAJLyoKLQkgKiBBbGxvdyByb29tIGZvciBhbGwgXCBhbmQgXiBwcmVmaXhlcywgYWxsIHNlZ21lbnRzLCBhbmQgYSBtdWx0aV9uYW1lX3ByZWZpeC4KKwkgKiBBbGxvdyByb29tIGZvciBhbGwgXCBhbmQgXiBwcmVmaXhlcywgYWxsIHNlZ21lbnRzIGFuZCBhIG11bHRpX25hbWVfcHJlZml4LgogCSAqIEFsc28sIG9uZSBieXRlIGZvciB0aGUgbnVsbCB0ZXJtaW5hdG9yLgogCSAqIFRoaXMgbWF5IGFjdHVhbGx5IGJlIHNvbWV3aGF0IGxvbmdlciB0aGFuIG5lZWRlZC4KIAkgKi8KQEAgLTEwNyw3ICsxMTEsOCBAQAogCSAqLwogCW5hbWVfc3RyaW5nID0gQUNQSV9NRU1fQUxMT0NBVEUgKHNpemVfbmVlZGVkKTsKIAlpZiAoIW5hbWVfc3RyaW5nKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoImV4X2FsbG9jYXRlX25hbWVfc3RyaW5nOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlZFxuIiwgc2l6ZV9uZWVkZWQpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJleF9hbGxvY2F0ZV9uYW1lX3N0cmluZzogQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJWRcbiIsIHNpemVfbmVlZGVkKSk7CiAJCXJldHVybl9QVFIgKE5VTEwpOwogCX0KIApAQCAtMTUyLDE1ICsxNTcsMTcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9uYW1lX3NlZ21lbnQKICAqCi0gKiBQQVJBTUVURVJTOiAgaW50ZXJwcmV0ZXJfbW9kZSAgICAtIEN1cnJlbnQgcnVubmluZyBtb2RlIChsb2FkMS9Mb2FkMi9FeGVjKQorICogUEFSQU1FVEVSUzogIGluX2FtbF9hZGRyZXNzICAtIFBvaW50ZXIgdG8gdGhlIG5hbWUgaW4gdGhlIEFNTCBjb2RlCisgKiAgICAgICAgICAgICAgbmFtZV9zdHJpbmcgICAgIC0gV2hlcmUgdG8gcmV0dXJuIHRoZSBuYW1lLiBUaGUgbmFtZSBpcyBhcHBlbmRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFueSBleGlzdGluZyBzdHJpbmcgdG8gZm9ybSBhIG5hbWVwYXRoCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIGEgbmFtZSBzZWdtZW50ICg0IGJ5dGVzKQorICogREVTQ1JJUFRJT046IEV4dHJhY3QgYW4gQUNQSSBuYW1lICg0IGJ5dGVzKSBmcm9tIHRoZSBBTUwgYnl0ZSBzdHJlYW0KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X25hbWVfc2VnbWVudCAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmluX2FtbF9hZGRyZXNzLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfc3RyaW5nKQpAQCAtMjIzLDEwICsyMzAsMTMgQEAKIAkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCX0KIAllbHNlIHsKLQkJLyogU2VnbWVudCBzdGFydGVkIHdpdGggb25lIG9yIG1vcmUgdmFsaWQgY2hhcmFjdGVycywgYnV0IGZld2VyIHRoYW4gNCAqLwotCisJCS8qCisJCSAqIFNlZ21lbnQgc3RhcnRlZCB3aXRoIG9uZSBvciBtb3JlIHZhbGlkIGNoYXJhY3RlcnMsIGJ1dCBmZXdlciB0aGFuCisJCSAqIHRoZSByZXF1aXJlZCA0CisJCSAqLwogCQlzdGF0dXMgPSBBRV9BTUxfQkFEX05BTUU7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQmFkIGNoYXJhY3RlciAlMDJ4IGluIG5hbWUsIGF0ICVwXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJCYWQgY2hhcmFjdGVyICUwMnggaW4gbmFtZSwgYXQgJXBcbiIsCiAJCQkqYW1sX2FkZHJlc3MsIGFtbF9hZGRyZXNzKSk7CiAJfQogCkBAIC0yMzksMTEgKzI0OSwxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dldF9uYW1lX3N0cmluZwogICoKLSAqIFBBUkFNRVRFUlM6ICBkYXRhX3R5cGUgICAgICAgICAgIC0gRGF0YSB0eXBlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUKKyAqIFBBUkFNRVRFUlM6ICBkYXRhX3R5cGUgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZQorICogICAgICAgICAgICAgIGluX2FtbF9hZGRyZXNzICAgICAgLSBQb2ludGVyIHRvIHRoZSBuYW1lc3RyaW5nIGluIHRoZSBBTUwgY29kZQorICogICAgICAgICAgICAgIG91dF9uYW1lX3N0cmluZyAgICAgLSBXaGVyZSB0aGUgbmFtZXN0cmluZyBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIG91dF9uYW1lX2xlbmd0aCAgICAgLSBMZW5ndGggb2YgdGhlIHJldHVybmVkIHN0cmluZwogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBTdGF0dXMsIG5hbWVzdHJpbmcgYW5kIGxlbmd0aAogICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYSBuYW1lLCBpbmNsdWRpbmcgYW55IHByZWZpeGVzLgorICogREVTQ1JJUFRJT046IEV4dHJhY3QgYSBmdWxsIG5hbWVwYXRoIGZyb20gdGhlIEFNTCBieXRlIHN0cmVhbSwKKyAqICAgICAgICAgICAgICBpbmNsdWRpbmcgYW55IHByZWZpeGVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI4Niw3ICszMDEsOCBAQAogCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgewogCQljYXNlIEFNTF9ST09UX1BSRUZJWDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInJvb3RfcHJlZml4KFxcKSBhdCAlcFxuIiwgYW1sX2FkZHJlc3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJyb290X3ByZWZpeChcXCkgYXQgJXBcbiIsCisJCQkJYW1sX2FkZHJlc3MpKTsKIAogCQkJLyoKIAkJCSAqIFJlbWVtYmVyIHRoYXQgd2UgaGF2ZSBhIHJvb3RfcHJlZml4IC0tCkBAIC0zMDMsNyArMzE5LDggQEAKIAkJCS8qIEluY3JlbWVudCBwYXN0IHBvc3NpYmx5IG11bHRpcGxlIHBhcmVudCBwcmVmaXhlcyAqLwogCiAJCQlkbyB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgInBhcmVudF9wcmVmaXggKF4pIGF0ICVwXG4iLCBhbWxfYWRkcmVzcykpOworCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJwYXJlbnRfcHJlZml4ICheKSBhdCAlcFxuIiwKKwkJCQkJYW1sX2FkZHJlc3MpKTsKIAogCQkJCWFtbF9hZGRyZXNzKys7CiAJCQkJcHJlZml4X2NvdW50Kys7CkBAIC0zMjEsMTMgKzMzOCwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCiAJCS8qIEV4YW1pbmUgZmlyc3QgY2hhcmFjdGVyIG9mIG5hbWUgZm9yIG5hbWUgc2VnbWVudCBwcmVmaXggb3BlcmF0b3IgKi8KIAogCQlzd2l0Y2ggKCphbWxfYWRkcmVzcykgewogCQljYXNlIEFNTF9EVUFMX05BTUVfUFJFRklYOgogCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9MT0FELCAiZHVhbF9uYW1lX3ByZWZpeCBhdCAlcFxuIiwgYW1sX2FkZHJlc3MpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0xPQUQsICJkdWFsX25hbWVfcHJlZml4IGF0ICVwXG4iLAorCQkJCWFtbF9hZGRyZXNzKSk7CiAKIAkJCWFtbF9hZGRyZXNzKys7CiAJCQluYW1lX3N0cmluZyA9IGFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKHByZWZpeF9jb3VudCwgMik7CkBAIC0zNDksNyArMzY2LDggQEAKIAogCQljYXNlIEFNTF9NVUxUSV9OQU1FX1BSRUZJWF9PUDoKIAotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgIm11bHRpX25hbWVfcHJlZml4IGF0ICVwXG4iLCBhbWxfYWRkcmVzcykpOworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTE9BRCwgIm11bHRpX25hbWVfcHJlZml4IGF0ICVwXG4iLAorCQkJCWFtbF9hZGRyZXNzKSk7CiAKIAkJCS8qIEZldGNoIGNvdW50IG9mIHNlZ21lbnRzIHJlbWFpbmluZyBpbiBuYW1lIHBhdGggKi8KIApAQCAtMzY4LDcgKzM4Niw4IEBACiAJCQloYXNfcHJlZml4ID0gVFJVRTsKIAogCQkJd2hpbGUgKG51bV9zZWdtZW50cyAmJgotCQkJCQkoc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpKSA9PSBBRV9PSykgeworCQkJCQkoc3RhdHVzID0gYWNwaV9leF9uYW1lX3NlZ21lbnQgKCZhbWxfYWRkcmVzcywgbmFtZV9zdHJpbmcpKSA9PQorCQkJCQkJQUVfT0spIHsKIAkJCQludW1fc2VnbWVudHMtLTsKIAkJCX0KIApAQCAtMzgwLDcgKzM5OSw4IEBACiAJCQkvKiBudWxsX25hbWUgdmFsaWQgYXMgb2YgOC0xMi05OCBBU0wvQU1MIEdyYW1tYXIgVXBkYXRlICovCiAKIAkJCWlmIChwcmVmaXhfY291bnQgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIm5hbWVfc2VnIGlzIFwiXFxcIiBmb2xsb3dlZCBieSBOVUxMXG4iKSk7CisJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKKwkJCQkJIm5hbWVfc2VnIGlzIFwiXFxcIiBmb2xsb3dlZCBieSBOVUxMXG4iKSk7CiAJCQl9CiAKIAkJCS8qIENvbnN1bWUgdGhlIE5VTEwgYnl0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwppbmRleCA4NDgyYWVmLi5kYmRmODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwpAQCAtOTcsNyArOTcsOCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMEFfMFRfMVIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMEFfMFRfMVIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTE2MSw3ICsxNjIsOCBAQAogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzBUXzBSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzBUXzBSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC0yMzYsNyArMjM4LDggQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb3BlcmFuZCA9ICZ3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMFIiLCBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIgKCJleF9vcGNvZGVfMUFfMVRfMFIiLAorCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTI4OSw3ICsyOTIsOCBAQAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgZGlnaXQ7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzFUXzFSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzFBXzFUXzFSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC00MDksOCArNDEzLDEwIEBACiAJCQlmb3IgKGkgPSAwOyAoaSA8IGFjcGlfZ2JsX2ludGVnZXJfbnliYmxlX3dpZHRoKSAmJiAoZGlnaXQgPiAwKTsgaSsrKSB7CiAJCQkJKHZvaWQpIGFjcGlfdXRfc2hvcnRfZGl2aWRlIChkaWdpdCwgMTAsICZkaWdpdCwgJnRlbXAzMik7CiAKLQkJCQkvKiBJbnNlcnQgdGhlIEJDRCBkaWdpdCB0aGF0IHJlc2lkZXMgaW4gdGhlIHJlbWFpbmRlciBmcm9tIGFib3ZlICovCi0KKwkJCQkvKgorCQkJCSAqIEluc2VydCB0aGUgQkNEIGRpZ2l0IHRoYXQgcmVzaWRlcyBpbiB0aGUKKwkJCQkgKiByZW1haW5kZXIgZnJvbSBhYm92ZQorCQkJCSAqLwogCQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlIHw9ICgoKGFjcGlfaW50ZWdlcikgdGVtcDMyKSA8PAogCQkJCQkJICAgQUNQSV9NVUxfNCAoaSkpOwogCQkJfQpAQCAtNDQ1LDcgKzQ1MSw4IEBACiAKIAkJCS8qIEdldCB0aGUgb2JqZWN0IHJlZmVyZW5jZSwgc3RvcmUgaXQsIGFuZCByZW1vdmUgb3VyIHJlZmVyZW5jZSAqLwogCi0JCQlzdGF0dXMgPSBhY3BpX2V4X2dldF9vYmplY3RfcmVmZXJlbmNlIChvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MyLCB3YWxrX3N0YXRlKTsKKwkJCXN0YXR1cyA9IGFjcGlfZXhfZ2V0X29iamVjdF9yZWZlcmVuY2UgKG9wZXJhbmRbMF0sCisJCQkJCSAmcmV0dXJuX2Rlc2MyLCB3YWxrX3N0YXRlKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CkBAIC00ODIsMTAgKzQ4OSwxMCBAQAogCiAJCWlmICghd2Fsa19zdGF0ZS0+cmVzdWx0X29iaikgewogCQkJLyoKLQkJCSAqIE5vcm1hbGx5LCB3ZSB3b3VsZCByZW1vdmUgYSByZWZlcmVuY2Ugb24gdGhlIE9wZXJhbmRbMF0gcGFyYW1ldGVyOwotCQkJICogQnV0IHNpbmNlIGl0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QKLQkJCSAqIChtZWFuaW5nIHdlIHdvdWxkIG5vcm1hbGx5IGluY3JlbWVudCBpdCksIHRoZSB0d28gY2FuY2VsIG91dCwKLQkJCSAqIGFuZCB3ZSBzaW1wbHkgZG9uJ3QgZG8gYW55dGhpbmcuCisJCQkgKiBOb3JtYWxseSwgd2Ugd291bGQgcmVtb3ZlIGEgcmVmZXJlbmNlIG9uIHRoZSBPcGVyYW5kWzBdCisJCQkgKiBwYXJhbWV0ZXI7IEJ1dCBzaW5jZSBpdCBpcyBiZWluZyB1c2VkIGFzIHRoZSBpbnRlcm5hbCByZXR1cm4KKwkJCSAqIG9iamVjdCAobWVhbmluZyB3ZSB3b3VsZCBub3JtYWxseSBpbmNyZW1lbnQgaXQpLCB0aGUgdHdvCisJCQkgKiBjYW5jZWwgb3V0LCBhbmQgd2Ugc2ltcGx5IGRvbid0IGRvIGFueXRoaW5nLgogCQkJICovCiAJCQl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gb3BlcmFuZFswXTsKIAkJCXdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdID0gTlVMTDsgLyogUHJldmVudCBkZWxldGlvbiAqLwpAQCAtNTQ5LDkgKzU1Niw4IEBACiAJY2FzZSBBTUxfU0hJRlRfTEVGVF9CSVRfT1A6ICAgICAvKiBzaGlmdF9sZWZ0X2JpdCAoU291cmNlLCBiaXRfbnVtKSAqLwogCWNhc2UgQU1MX1NISUZUX1JJR0hUX0JJVF9PUDogICAgLyogc2hpZnRfcmlnaHRfYml0IChTb3VyY2UsIGJpdF9udW0pICovCiAKLQkJLyoKLQkJICogVGhlc2UgYXJlIHR3byBvYnNvbGV0ZSBvcGNvZGVzCi0JCSAqLworCQkvKiBUaGVzZSBhcmUgdHdvIG9ic29sZXRlIG9wY29kZXMgKi8KKwogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCSIlcyBpcyBvYnNvbGV0ZSBhbmQgbm90IGltcGxlbWVudGVkXG4iLAogCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpKTsKQEAgLTU2OCw5ICs1NzQsOCBAQAogCX0KIAogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKLQkJLyoKLQkJICogU3RvcmUgdGhlIHJldHVybiB2YWx1ZSBjb21wdXRlZCBhYm92ZSBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0Ci0JCSAqLworCQkvKiBTdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGNvbXB1dGVkIGFib3ZlIGludG8gdGhlIHRhcmdldCBvYmplY3QgKi8KKwogCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlIChyZXR1cm5fZGVzYywgb3BlcmFuZFsxXSwgd2Fsa19zdGF0ZSk7CiAJfQogCkBAIC02MTUsNyArNjIwLDggQEAKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8wVF8xUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8xQV8wVF8xUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwpAQCAtNzA2LDkgKzcxMiw5IEBACiAKIAkJLyoKIAkJICogTm90ZTogVGhlIG9wZXJhbmQgaXMgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSB3YW50IHRvCi0JCSAqIGdldCB0aGUgYXNzb2NpYXRlZCBvYmplY3QsIG5vdCBpdHMgdmFsdWUuICBGb3IgZXhhbXBsZSwgd2UgZG9uJ3Qgd2FudAotCQkgKiB0byByZXNvbHZlIGEgZmllbGRfdW5pdCB0byBpdHMgdmFsdWUsIHdlIHdhbnQgdGhlIGFjdHVhbCBmaWVsZF91bml0Ci0JCSAqIG9iamVjdC4KKwkJICogZ2V0IHRoZSBhc3NvY2lhdGVkIG9iamVjdCwgbm90IGl0cyB2YWx1ZS4gIEZvciBleGFtcGxlLCB3ZSBkb24ndAorCQkgKiB3YW50IHRvIHJlc29sdmUgYSBmaWVsZF91bml0IHRvIGl0cyB2YWx1ZSwgd2Ugd2FudCB0aGUgYWN0dWFsCisJCSAqIGZpZWxkX3VuaXQgb2JqZWN0LgogCQkgKi8KIAogCQkvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIGJhc2Ugb2JqZWN0ICovCkBAIC03MzgsNyArNzQ0LDggQEAKIAogCQkvKiBHZXQgdGhlIGJhc2Ugb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICh3YWxrX3N0YXRlLCBvcGVyYW5kWzBdLCAmdHlwZSwgJnRlbXBfZGVzYyk7CisJCXN0YXR1cyA9IGFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSAod2Fsa19zdGF0ZSwKKwkJCQkgb3BlcmFuZFswXSwgJnR5cGUsICZ0ZW1wX2Rlc2MpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTgxOCw4ICs4MjUsMTAgQEAKIAogCQkJCQkvKiBTZXQgT3BlcmFuZFswXSB0byB0aGUgdmFsdWUgb2YgdGhlIGxvY2FsL2FyZyAqLwogCi0JCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIChvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlLAotCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0LCB3YWxrX3N0YXRlLCAmdGVtcF9kZXNjKTsKKwkJCQkJc3RhdHVzID0gYWNwaV9kc19tZXRob2RfZGF0YV9nZXRfdmFsdWUgKAorCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlLAorCQkJCQkJCSBvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub2Zmc2V0LAorCQkJCQkJCSB3YWxrX3N0YXRlLCAmdGVtcF9kZXNjKTsKIAkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQkJZ290byBjbGVhbnVwOwogCQkJCQl9CkBAIC04NTIsMjEgKzg2MSwyNiBAQAogCQkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCiAJCQkJLyoKLQkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UgdG8gYSBuYW1lZCBBQ1BJIG9iamVjdC4KKwkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UKKwkJCQkgKiB0byBhIG5hbWVkIEFDUEkgb2JqZWN0LgogCQkJCSAqCiAJCQkJICogMSkgRmluZCB0aGUgb3duaW5nIE5vZGUKLQkJCQkgKiAyKSBEZXJlZmVyZW5jZSB0aGUgbm9kZSB0byBhbiBhY3R1YWwgb2JqZWN0LiAgQ291bGQgYmUgYSBGaWVsZCwgc28gd2UgbmVlCi0JCQkJICogICAgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgorCQkJCSAqIDIpIERlcmVmZXJlbmNlIHRoZSBub2RlIHRvIGFuIGFjdHVhbCBvYmplY3QuICBDb3VsZCBiZSBhCisJCQkJICogICAgRmllbGQsIHNvIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgbm9kZSB0byBhIHZhbHVlLgogCQkJCSAqLwogCQkJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aCAob3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJCQkgIHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPnNjb3BlLm5vZGUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKLQkJCQkJCSAgQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYykpOworCQkJCQkJIHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPnNjb3BlLm5vZGUsCisJCQkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKAorCQkJCQkJCQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQlnb3RvIGNsZWFudXA7CiAJCQkJfQogCiAJCQkJc3RhdHVzID0gYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgKAotCQkJCQkJICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSwgd2Fsa19zdGF0ZSk7CisJCQkJCQkgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKAorCQkJCQkJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsICZyZXR1cm5fZGVzYyksCisJCQkJCQkJCXdhbGtfc3RhdGUpOwogCQkJCWdvdG8gY2xlYW51cDsKIAogCkBAIC04ODMsMTQgKzg5NywxNiBAQAogCQkJLyoKIAkJCSAqIFRoaXMgaXMgYSBkZXJlZl9vZiAob2JqZWN0X3JlZmVyZW5jZSkKIAkJCSAqIEdldCB0aGUgYWN0dWFsIG9iamVjdCBmcm9tIHRoZSBOb2RlIChUaGlzIGlzIHRoZSBkZXJlZmVyZW5jZSkuCi0JCQkgKiAtLSBUaGlzIGNhc2UgbWF5IG9ubHkgaGFwcGVuIHdoZW4gYSBsb2NhbF94IG9yIGFyZ194IGlzIGRlcmVmZXJlbmNlZCBhYm92ZS4KKwkJCSAqIFRoaXMgY2FzZSBtYXkgb25seSBoYXBwZW4gd2hlbiBhIGxvY2FsX3ggb3IgYXJnX3ggaXMKKwkJCSAqIGRlcmVmZXJlbmNlZCBhYm92ZS4KIAkJCSAqLwotCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBvcGVyYW5kWzBdKTsKKwkJCXJldHVybl9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkJICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikgb3BlcmFuZFswXSk7CiAJCX0KIAkJZWxzZSB7CiAJCQkvKgotCQkJICogVGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIG9iamVjdCBwcm9kdWNlZCBieSBlaXRoZXIgdGhlIEluZGV4KCkgb3IKLQkJCSAqIHJlZl9vZigpIG9wZXJhdG9yCisJCQkgKiBUaGlzIG11c3QgYmUgYSByZWZlcmVuY2Ugb2JqZWN0IHByb2R1Y2VkIGJ5IGVpdGhlciB0aGUKKwkJCSAqIEluZGV4KCkgb3IgcmVmX29mKCkgb3BlcmF0b3IKIAkJCSAqLwogCQkJc3dpdGNoIChvcGVyYW5kWzBdLT5yZWZlcmVuY2Uub3Bjb2RlKSB7CiAJCQljYXNlIEFNTF9JTkRFWF9PUDoKQEAgLTkzMSw4ICs5NDcsOCBAQAogCQkJCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKIAkJCQkJLyoKLQkJCQkJICogUmV0dXJuIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UuICBXZSBtdXN0IGFkZAotCQkJCQkgKiBhbm90aGVyIHJlZmVyZW5jZSB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QsIGhvd2V2ZXIuCisJCQkJCSAqIFJldHVybiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IG9mIHRoZSBwYWNrYWdlLiAgV2UgbXVzdAorCQkJCQkgKiBhZGQgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LCBob3dldmVyLgogCQkJCQkgKi8KIAkJCQkJcmV0dXJuX2Rlc2MgPSAqKG9wZXJhbmRbMF0tPnJlZmVyZW5jZS53aGVyZSk7CiAJCQkJCWlmICghcmV0dXJuX2Rlc2MpIHsKQEAgLTk2Nyw5ICs5ODMsMTEgQEAKIAogCQkJCXJldHVybl9kZXNjID0gb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9iamVjdDsKIAotCQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHJldHVybl9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKHJldHVybl9kZXNjKSA9PQorCQkJCQkJQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAotCQkJCQlyZXR1cm5fZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHJldHVybl9kZXNjKTsKKwkJCQkJcmV0dXJuX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCQkJCSAgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIHJldHVybl9kZXNjKTsKIAkJCQl9CiAKIAkJCQkvKiBBZGQgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKaW5kZXggOGJlNGQ4MC4uNzQyOTAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCiAJCXZhbHVlID0gKHUzMikgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKIAotCQkvKiBOb3RpZmllcyBhbGxvd2VkIG9uIHRoaXMgb2JqZWN0PyAqLworCQkvKiBBcmUgbm90aWZpZXMgYWxsb3dlZCBvbiB0aGlzIG9iamVjdD8gKi8KIAogCQlpZiAoIWFjcGlfZXZfaXNfbm90aWZ5X29iamVjdCAobm9kZSkpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLApAQCAtMjAzLDExICsyMDMsMTIgQEAKIAkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG9wY29kZQotCSAqLworCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLworCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9ESVZJREVfT1A6ICAgICAgICAgICAgIC8qIERpdmlkZSAoRGl2aWRlbmQsIERpdmlzb3IsIHJlbWFpbmRlcl9yZXN1bHQgcXVvdGllbnRfcmVzdWx0KSAqLworCWNhc2UgQU1MX0RJVklERV9PUDoKKworCQkvKiBEaXZpZGUgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IHF1b3RpZW50X3Jlc3VsdCkgKi8KIAogCQlyZXR1cm5fZGVzYzEgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9JTlRFR0VSKTsKIAkJaWYgKCFyZXR1cm5fZGVzYzEpIHsKQEAgLTI0MSw3ICsyNDIsNiBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KIAkvKiBTdG9yZSB0aGUgcmVzdWx0cyB0byB0aGUgdGFyZ2V0IHJlZmVyZW5jZSBvcGVyYW5kcyAqLwogCiAJc3RhdHVzID0gYWNwaV9leF9zdG9yZSAocmV0dXJuX2Rlc2MyLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKQEAgLTI5NSw3ICsyOTUsNyBAQAogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OworCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5kZXg7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBBRV9PSzsKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKIApAQCAtMzA0LDkgKzMwNCw4IEBACiAJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBvcGNvZGUKLQkgKi8KKwkvKiBFeGVjdXRlIHRoZSBvcGNvZGUgKi8KKwogCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9NQVRIKSB7CiAJCS8qIEFsbCBzaW1wbGUgbWF0aCBvcGNvZGVzIChhZGQsIGV0Yy4pICovCiAKQEAgLTMyMiw5ICszMjEsOCBAQAogCQlnb3RvIHN0b3JlX3Jlc3VsdF90b190YXJnZXQ7CiAJfQogCi0KIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewotCWNhc2UgQU1MX01PRF9PUDogICAgICAgICAgICAgICAgLyogTW9kIChEaXZpZGVuZCwgRGl2aXNvciwgcmVtYWluZGVyX3Jlc3VsdCAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfTU9EX09QOiAvKiBNb2QgKERpdmlkZW5kLCBEaXZpc29yLCByZW1haW5kZXJfcmVzdWx0IChBQ1BJIDIuMCkgKi8KIAogCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoQUNQSV9UWVBFX0lOVEVHRVIpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CkBAIC0zNDEsMTggKzMzOSwxOSBAQAogCQlicmVhazsKIAogCi0JY2FzZSBBTUxfQ09OQ0FUX09QOiAgICAgICAgICAgICAvKiBDb25jYXRlbmF0ZSAoRGF0YTEsIERhdGEyLCBSZXN1bHQpICovCisJY2FzZSBBTUxfQ09OQ0FUX09QOiAvKiBDb25jYXRlbmF0ZSAoRGF0YTEsIERhdGEyLCBSZXN1bHQpICovCiAKIAkJc3RhdHVzID0gYWNwaV9leF9kb19jb25jYXRlbmF0ZSAob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKIAkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKIAkJYnJlYWs7CiAKIAotCWNhc2UgQU1MX1RPX1NUUklOR19PUDogICAgICAgICAgLyogdG9fc3RyaW5nIChCdWZmZXIsIExlbmd0aCwgUmVzdWx0KSAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfVE9fU1RSSU5HX09QOiAvKiB0b19zdHJpbmcgKEJ1ZmZlciwgTGVuZ3RoLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KIAogCQkvKgogCQkgKiBJbnB1dCBvYmplY3QgaXMgZ3VhcmFudGVlZCB0byBiZSBhIGJ1ZmZlciBhdCB0aGlzIHBvaW50IChpdCBtYXkgaGF2ZQotCQkgKiBiZWVuIGNvbnZlcnRlZC4pICBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgdG8gYSBuZXcgb2JqZWN0IG9mIHR5cGUgU3RyaW5nLgorCQkgKiBiZWVuIGNvbnZlcnRlZC4pICBDb3B5IHRoZSByYXcgYnVmZmVyIGRhdGEgdG8gYSBuZXcgb2JqZWN0IG9mCisJCSAqIHR5cGUgU3RyaW5nLgogCQkgKi8KIAogCQkvKgpAQCAtMzgzLDE0ICszODIsMTYgQEAKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCS8qIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybS4gTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkuICovCisJCS8qIENvcHkgdGhlIHJhdyBidWZmZXIgZGF0YSB3aXRoIG5vIHRyYW5zZm9ybS4gTlVMTCB0ZXJtaW5hdGVkIGFscmVhZHkqLwogCiAJCUFDUElfTUVNQ1BZIChyZXR1cm5fZGVzYy0+c3RyaW5nLnBvaW50ZXIsCiAJCQlvcGVyYW5kWzBdLT5idWZmZXIucG9pbnRlciwgbGVuZ3RoKTsKIAkJYnJlYWs7CiAKIAotCWNhc2UgQU1MX0NPTkNBVF9SRVNfT1A6ICAgICAgICAgLyogY29uY2F0ZW5hdGVfcmVzX3RlbXBsYXRlIChCdWZmZXIsIEJ1ZmZlciwgUmVzdWx0KSAoQUNQSSAyLjApICovCisJY2FzZSBBTUxfQ09OQ0FUX1JFU19PUDoKKworCQkvKiBjb25jYXRlbmF0ZV9yZXNfdGVtcGxhdGUgKEJ1ZmZlciwgQnVmZmVyLCBSZXN1bHQpIChBQ1BJIDIuMCkgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X2NvbmNhdF90ZW1wbGF0ZSAob3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKIAkJCQkgJnJldHVybl9kZXNjLCB3YWxrX3N0YXRlKTsKQEAgLTQwNywzMyArNDA4LDMzIEBACiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQlpbmRleCA9ICh1MzIpIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CisJCWluZGV4ID0gb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKIAotCQkvKgotCQkgKiBBdCB0aGlzIHBvaW50LCB0aGUgU291cmNlIG9wZXJhbmQgaXMgYSBQYWNrYWdlLCBCdWZmZXIsIG9yIFN0cmluZwotCQkgKi8KKwkJLyogQXQgdGhpcyBwb2ludCwgdGhlIFNvdXJjZSBvcGVyYW5kIGlzIGEgUGFja2FnZSwgQnVmZmVyLCBvciBTdHJpbmcgKi8KKwogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9wZXJhbmRbMF0pID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CiAJCQkvKiBPYmplY3QgdG8gYmUgaW5kZXhlZCBpcyBhIFBhY2thZ2UgKi8KIAogCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkluZGV4IHZhbHVlICglWCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCi0JCQkJCWluZGV4LCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CisJCQkJCSJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWClcbiIsCisJCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX1BBQ0tBR0VfTElNSVQ7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQogCiAJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlID0gQUNQSV9UWVBFX1BBQ0tBR0U7CiAJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9iamVjdCAgICA9IG9wZXJhbmRbMF07Ci0JCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLndoZXJlICAgICA9ICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzIFtpbmRleF07CisJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLndoZXJlICAgICA9ICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzIFsKKwkJCQkJICBpbmRleF07CiAJCX0KIAkJZWxzZSB7CiAJCQkvKiBPYmplY3QgdG8gYmUgaW5kZXhlZCBpcyBhIEJ1ZmZlci9TdHJpbmcgKi8KIAogCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkluZGV4IHZhbHVlICglWCkgYmV5b25kIGVuZCBvZiBidWZmZXIgKCVYKVxuIiwKLQkJCQkJaW5kZXgsIG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpKTsKKwkJCQkJIkluZGV4IHZhbHVlICglWCU4LjhYKSBiZXlvbmQgZW5kIG9mIGJ1ZmZlciAoJVgpXG4iLAorCQkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGluZGV4KSwgb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkpOwogCQkJCXN0YXR1cyA9IEFFX0FNTF9CVUZGRVJfTElNSVQ7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQpAQCAtNDUxLDcgKzQ1Miw3IEBACiAJCS8qIENvbXBsZXRlIHRoZSBJbmRleCByZWZlcmVuY2Ugb2JqZWN0ICovCiAKIAkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgICAgPSBBTUxfSU5ERVhfT1A7Ci0JCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ICAgID0gaW5kZXg7CisJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0ICAgID0gKHUzMikgaW5kZXg7CiAKIAkJLyogU3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgVGFyZ2V0ICovCiAKQEAgLTUzNiwyMiArNTM3LDI0IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIE9wY29kZQotCSAqLwotCWlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMX05VTUVSSUMpIC8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8geworCS8qIEV4ZWN1dGUgdGhlIE9wY29kZSAqLworCisJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUxfTlVNRVJJQykgeworCQkvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisKIAkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX251bWVyaWNfb3AgKHdhbGtfc3RhdGUtPm9wY29kZSwKIAkJCQkgIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsIG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWUsCiAJCQkJICAmbG9naWNhbF9yZXN1bHQpOwogCQlnb3RvIHN0b3JlX2xvZ2ljYWxfcmVzdWx0OwogCX0KLQllbHNlIGlmICh3YWxrX3N0YXRlLT5vcF9pbmZvLT5mbGFncyAmIEFNTF9MT0dJQ0FMKSAgLyogbG9naWNhbF9vcCAoT3BlcmFuZDAsIE9wZXJhbmQxKSAqLyB7CisJZWxzZSBpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTE9HSUNBTCkgeworCQkvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCisKIAkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX29wICh3YWxrX3N0YXRlLT5vcGNvZGUsIG9wZXJhbmRbMF0sCiAJCQkJIG9wZXJhbmRbMV0sICZsb2dpY2FsX3Jlc3VsdCk7CiAJCWdvdG8gc3RvcmVfbG9naWNhbF9yZXN1bHQ7CiAJfQogCi0KIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewogCWNhc2UgQU1MX0FDUVVJUkVfT1A6ICAgICAgICAgICAgLyogQWNxdWlyZSAobXV0ZXhfb2JqZWN0LCBUaW1lb3V0KSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCmluZGV4IDI5ZDBiMTYuLjIzYjA2OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jCkBAIC05NywxMSArOTcsMTIgQEAKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8wVF8wUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8wVF8wUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9GQVRBTF9PUDogICAgICAgICAgLyogRmF0YWwgKGZhdGFsX3R5cGUgZmF0YWxfY29kZSBmYXRhbF9hcmcpICAgKi8KKwljYXNlIEFNTF9GQVRBTF9PUDogICAgICAgICAgLyogRmF0YWwgKGZhdGFsX3R5cGUgZmF0YWxfY29kZSBmYXRhbF9hcmcpICovCiAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKIAkJCSJmYXRhbF9vcDogVHlwZSAlWCBDb2RlICVYIEFyZyAlWCA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8XG4iLApAQCAtMTE2LDkgKzExNyw4IEBACiAJCQlmYXRhbC0+YXJndW1lbnQgPSAodTMyKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwogCQl9CiAKLQkJLyoKLQkJICogQWx3YXlzIHNpZ25hbCB0aGUgT1MhCi0JCSAqLworCQkvKiBBbHdheXMgc2lnbmFsIHRoZSBPUyEgKi8KKwogCQlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbCAoQUNQSV9TSUdOQUxfRkFUQUwsIGZhdGFsKTsKIAogCQkvKiBNaWdodCByZXR1cm4gd2hpbGUgT1MgaXMgc2h1dHRpbmcgZG93biwganVzdCBjb250aW51ZSAqLwpAQCAtMTYyLDIxICsxNjIsMjMgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpyZXR1cm5fZGVzYyA9IE5VTEw7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9uYXRpdmVfdWludCAgICAgICAgICAgICAgICBpbmRleDsKKwlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIGluZGV4OwogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwogCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8xVF8xUiIsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoImV4X29wY29kZV8zQV8xVF8xUiIsCisJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lICh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCiAJc3dpdGNoICh3YWxrX3N0YXRlLT5vcGNvZGUpIHsKLQljYXNlIEFNTF9NSURfT1A6ICAgICAgICAvKiBNaWQgIChTb3VyY2VbMF0sIEluZGV4WzFdLCBMZW5ndGhbMl0sIFJlc3VsdFszXSkgKi8KKwljYXNlIEFNTF9NSURfT1A6ICAgIC8qIE1pZCAoU291cmNlWzBdLCBJbmRleFsxXSwgTGVuZ3RoWzJdLCBSZXN1bHRbM10pICovCiAKIAkJLyoKIAkJICogQ3JlYXRlIHRoZSByZXR1cm4gb2JqZWN0LiAgVGhlIFNvdXJjZSBvcGVyYW5kIGlzIGd1YXJhbnRlZWQgdG8gYmUKIAkJICogZWl0aGVyIGEgU3RyaW5nIG9yIGEgQnVmZmVyLCBzbyBqdXN0IHVzZSBpdHMgdHlwZS4KIAkJICovCi0JCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0IChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZFswXSkpOworCQlyZXR1cm5fZGVzYyA9IGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdCAoCisJCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob3BlcmFuZFswXSkpOwogCQlpZiAoIXJldHVybl9kZXNjKSB7CiAJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCQlnb3RvIGNsZWFudXA7CkBAIC0xODQsNyArMTg2LDcgQEAKIAogCQkvKiBHZXQgdGhlIEludGVnZXIgdmFsdWVzIGZyb20gdGhlIG9iamVjdHMgKi8KIAotCQlpbmRleCA9IChhY3BpX25hdGl2ZV91aW50KSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQlpbmRleCA9IG9wZXJhbmRbMV0tPmludGVnZXIudmFsdWU7CiAJCWxlbmd0aCA9IChhY3BpX3NpemUpIG9wZXJhbmRbMl0tPmludGVnZXIudmFsdWU7CiAKIAkJLyoKQEAgLTE5Nyw3ICsxOTksOCBAQAogCiAJCQlpZiAoKGluZGV4ICsgbGVuZ3RoKSA+CiAJCQkJb3BlcmFuZFswXS0+c3RyaW5nLmxlbmd0aCkgewotCQkJCWxlbmd0aCA9IChhY3BpX3NpemUpIG9wZXJhbmRbMF0tPnN0cmluZy5sZW5ndGggLSBpbmRleDsKKwkJCQlsZW5ndGggPSAoYWNwaV9zaXplKSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoIC0KKwkJCQkJCSAoYWNwaV9zaXplKSBpbmRleDsKIAkJCX0KIAogCQkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgU3RyaW5nL0J1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwppbmRleCBkMzI2MjQzLi4xN2Y4MWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzYuYwpAQCAtNzUsNiArNzUsMTQgQEAKICAqIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmRzLgogISovCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHU4CithY3BpX2V4X2RvX21hdGNoICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX29wLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnBhY2thZ2Vfb2JqLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm1hdGNoX29iaik7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC05Miw3ICsxMDAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4CitzdGF0aWMgdTgKIGFjcGlfZXhfZG9fbWF0Y2ggKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmosCkBAIC0yMTYsMTEgKzIyNCwxMiBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnJldHVybl9kZXNjID0gTlVMTDsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFFX09LOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbmRleDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0aGlzX2VsZW1lbnQ7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzZBXzBUXzFSIiwgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgiZXhfb3Bjb2RlXzZBXzBUXzFSIiwKKwkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUgKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewpAQCAtMjQxLDkgKzI1MCwxMSBAQAogCiAJCS8qIEdldCB0aGUgcGFja2FnZSBzdGFydF9pbmRleCwgdmFsaWRhdGUgYWdhaW5zdCB0aGUgcGFja2FnZSBsZW5ndGggKi8KIAotCQlpbmRleCA9ICh1MzIpIG9wZXJhbmRbNV0tPmludGVnZXIudmFsdWU7Ci0JCWlmIChpbmRleCA+PSAodTMyKSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkluZGV4IGJleW9uZCBwYWNrYWdlIGVuZFxuIikpOworCQlpbmRleCA9IG9wZXJhbmRbNV0tPmludGVnZXIudmFsdWU7CisJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiSW5kZXggKCVYJTguOFgpIGJleW9uZCBwYWNrYWdlIGVuZCAoJVgpXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoaW5kZXgpLCBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKIAkJCWdvdG8gY2xlYW51cDsKIAkJfQpAQCAtMzE0LDEzICszMjUsMTIgQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9vcGNvZGVfM0FfMFRfMFI6IFVua25vd24gb3Bjb2RlICVYXG4iLAorCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X29wY29kZV82QV8wVF8xUjogVW5rbm93biBvcGNvZGUgJVhcbiIsCiAJCQkJd2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9CQURfT1BDT0RFOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KIAl3YWxrX3N0YXRlLT5yZXN1bHRfb2JqID0gcmV0dXJuX2Rlc2M7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCmluZGV4IDI2NGVmM2IuLmM5ZTNjNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKQEAgLTUyLDggKzUyLDIzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9FWEVDVVRFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgiZXhwcmVwIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTMyCithY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZmxhZ3MsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0dXJuX2J5dGVfYWxpZ25tZW50KTsKKwogCiAjaWZkZWYgQUNQSV9VTkRFUl9ERVZFTE9QTUVOVAorCitzdGF0aWMgdTMyCithY3BpX2V4X2dlbmVyYXRlX2FjY2VzcyAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9iaXRfb2Zmc2V0LAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfYml0X2xlbmd0aCwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9sZW5ndGgpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2dlbmVyYXRlX2FjY2VzcwpAQCAtOTksMTIgKzExNCwxNCBAQAogCS8qIFJvdW5kIEZpZWxkIHN0YXJ0IG9mZnNldCBhbmQgbGVuZ3RoIHRvICJtaW5pbWFsIiBieXRlIGJvdW5kYXJpZXMgKi8KIAogCWZpZWxkX2J5dGVfb2Zmc2V0ICA9IEFDUElfRElWXzggKEFDUElfUk9VTkRfRE9XTiAoZmllbGRfYml0X29mZnNldCwgOCkpOwotCWZpZWxkX2J5dGVfZW5kX29mZnNldCA9IEFDUElfRElWXzggKEFDUElfUk9VTkRfVVAgKGZpZWxkX2JpdF9sZW5ndGggKyBmaWVsZF9iaXRfb2Zmc2V0LCA4KSk7CisJZmllbGRfYnl0ZV9lbmRfb2Zmc2V0ID0gQUNQSV9ESVZfOCAoQUNQSV9ST1VORF9VUCAoZmllbGRfYml0X2xlbmd0aCArCisJCQkgICBmaWVsZF9iaXRfb2Zmc2V0LCA4KSk7CiAJZmllbGRfYnl0ZV9sZW5ndGggID0gZmllbGRfYnl0ZV9lbmRfb2Zmc2V0IC0gZmllbGRfYnl0ZV9vZmZzZXQ7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkiQml0IGxlbmd0aCAlZCwgQml0IG9mZnNldCAlZFxuIiwKIAkJCWZpZWxkX2JpdF9sZW5ndGgsIGZpZWxkX2JpdF9vZmZzZXQpKTsKKwogCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0JGSUVMRCwKIAkJCSJCeXRlIExlbmd0aCAlZCwgQnl0ZSBPZmZzZXQgJWQsIEVuZCBPZmZzZXQgJWRcbiIsCiAJCQlmaWVsZF9ieXRlX2xlbmd0aCwgZmllbGRfYnl0ZV9vZmZzZXQsIGZpZWxkX2J5dGVfZW5kX29mZnNldCkpOwpAQCAtMTE3LDIwICsxMzQsMjYgQEAKIAkgKi8KIAlmb3IgKGFjY2Vzc19ieXRlX3dpZHRoID0gMTsgYWNjZXNzX2J5dGVfd2lkdGggPD0gODsgYWNjZXNzX2J5dGVfd2lkdGggPDw9IDEpIHsKIAkJLyoKLQkJICogMSkgUm91bmQgZW5kIG9mZnNldCB1cCB0byBuZXh0IGFjY2VzcyBib3VuZGFyeSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhpcwotCQkgKiAgICBkb2VzIG5vdCBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IHJlZ2lvbi4KLQkJICogMikgV2hlbiB0aGUgQWNjZXNzIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZmllbGRfYnl0ZV9sZW5ndGgsIHdlIGFyZSBkb25lLgotCQkgKiAgICAoVGhpcyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhlIHBlcmZlY3RseSBhbGlnbmVkIGNhc2UgeWV0KS4KKwkJICogMSkgUm91bmQgZW5kIG9mZnNldCB1cCB0byBuZXh0IGFjY2VzcyBib3VuZGFyeSBhbmQgbWFrZSBzdXJlIHRoYXQKKwkJICogICAgdGhpcyBkb2VzIG5vdCBnbyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IHJlZ2lvbi4KKwkJICogMikgV2hlbiB0aGUgQWNjZXNzIHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZmllbGRfYnl0ZV9sZW5ndGgsIHdlCisJCSAqICAgIGFyZSBkb25lLiAoVGhpcyBkb2VzIG5vdCBvcHRpbWl6ZSBmb3IgdGhlIHBlcmZlY3RseSBhbGlnbmVkCisJCSAqICAgIGNhc2UgeWV0KS4KIAkJICovCiAJCWlmIChBQ1BJX1JPVU5EX1VQIChmaWVsZF9ieXRlX2VuZF9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSA8PSByZWdpb25fbGVuZ3RoKSB7Ci0JCQlmaWVsZF9zdGFydF9vZmZzZXQgPSBBQ1BJX1JPVU5EX0RPV04gKGZpZWxkX2J5dGVfb2Zmc2V0LCBhY2Nlc3NfYnl0ZV93aWR0aCkgLwotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoOwotCQkJZmllbGRfZW5kX29mZnNldCA9IEFDUElfUk9VTkRfVVAgICAoKGZpZWxkX2J5dGVfbGVuZ3RoICsgZmllbGRfYnl0ZV9vZmZzZXQpLAotCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSAvIGFjY2Vzc19ieXRlX3dpZHRoOwotCQkJYWNjZXNzZXMgICAgICAgICA9IGZpZWxkX2VuZF9vZmZzZXQgLSBmaWVsZF9zdGFydF9vZmZzZXQ7CisJCQlmaWVsZF9zdGFydF9vZmZzZXQgPQorCQkJCUFDUElfUk9VTkRfRE9XTiAoZmllbGRfYnl0ZV9vZmZzZXQsIGFjY2Vzc19ieXRlX3dpZHRoKSAvCisJCQkJYWNjZXNzX2J5dGVfd2lkdGg7CisKKwkJCWZpZWxkX2VuZF9vZmZzZXQgPQorCQkJCUFDUElfUk9VTkRfVVAgKChmaWVsZF9ieXRlX2xlbmd0aCArIGZpZWxkX2J5dGVfb2Zmc2V0KSwKKwkJCQkJYWNjZXNzX2J5dGVfd2lkdGgpIC8gYWNjZXNzX2J5dGVfd2lkdGg7CisKKwkJCWFjY2Vzc2VzID0gZmllbGRfZW5kX29mZnNldCAtIGZpZWxkX3N0YXJ0X29mZnNldDsKIAogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyB3aXRoaW4gcmVnaW9uXG4iLCBhY2Nlc3NfYnl0ZV93aWR0aCkpOworCiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkJCSJGaWVsZCBTdGFydCAlZCwgRmllbGQgRW5kICVkIC0tIHJlcXVpcmVzICVkIGFjY2Vzc2VzXG4iLAogCQkJCQlmaWVsZF9zdGFydF9vZmZzZXQsIGZpZWxkX2VuZF9vZmZzZXQsIGFjY2Vzc2VzKSk7CkBAIC0xMzksOCArMTYyLDggQEAKIAogCQkJaWYgKGFjY2Vzc2VzIDw9IDEpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCi0JCQkJCQkiRW50aXJlIGZpZWxkIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIG9uZSBvcGVyYXRpb24gb2Ygc2l6ZSAlZFxuIiwKLQkJCQkJCWFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCQkJCSJFbnRpcmUgZmllbGQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggb25lIG9wZXJhdGlvbiBvZiBzaXplICVkXG4iLAorCQkJCQlhY2Nlc3NfYnl0ZV93aWR0aCkpOwogCQkJCXJldHVybl9WQUxVRSAoYWNjZXNzX2J5dGVfd2lkdGgpOwogCQkJfQogCkBAIC0xNTUsMTUgKzE3OCwyMCBAQAogCQl9CiAJCWVsc2UgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAotCQkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyBOT1Qgd2l0aGluIHJlZ2lvblxuIiwgYWNjZXNzX2J5dGVfd2lkdGgpKTsKKwkJCQkiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyBOT1Qgd2l0aGluIHJlZ2lvblxuIiwgYWNjZXNzX2J5dGVfd2lkdGgpKTsKIAkJCWlmIChhY2Nlc3NfYnl0ZV93aWR0aCA9PSAxKSB7CiAJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJCQkJIkZpZWxkIGdvZXMgYmV5b25kIGVuZC1vZi1yZWdpb24hXG4iKSk7Ci0JCQkJcmV0dXJuX1ZBTFVFICgwKTsgICAgIC8qIEZpZWxkIGRvZXMgbm90IGZpdCBpbiB0aGUgcmVnaW9uIGF0IGFsbCAqLworCisJCQkJLyogRmllbGQgZG9lcyBub3QgZml0IGluIHRoZSByZWdpb24gYXQgYWxsICovCisKKwkJCQlyZXR1cm5fVkFMVUUgKDApOwogCQkJfQogCi0JCQkvKiBUaGlzIHdpZHRoIGdvZXMgYmV5b25kIHRoZSBlbmQtb2YtcmVnaW9uLCBiYWNrIG9mZiB0byBwcmV2aW91cyBhY2Nlc3MgKi8KLQorCQkJLyoKKwkJCSAqIFRoaXMgd2lkdGggZ29lcyBiZXlvbmQgdGhlIGVuZC1vZi1yZWdpb24sIGJhY2sgb2ZmIHRvCisJCQkgKiBwcmV2aW91cyBhY2Nlc3MKKwkJCSAqLwogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQkZJRUxELAogCQkJCQkiQmFja2luZyBvZmYgdG8gcHJldmlvdXMgb3B0aW1hbCBhY2Nlc3Mgd2lkdGggb2YgJWRcbiIsCiAJCQkJCW1pbmltdW1fYWNjZXNzX3dpZHRoKSk7CkBAIC0xNzEsOCArMTk5LDEwIEBACiAJCX0KIAl9CiAKLQkvKiBDb3VsZCBub3QgcmVhZC93cml0ZSBmaWVsZCB3aXRoIG9uZSBvcGVyYXRpb24sIGp1c3QgdXNlIG1heCBhY2Nlc3Mgd2lkdGggKi8KLQorCS8qCisJICogQ291bGQgbm90IHJlYWQvd3JpdGUgZmllbGQgd2l0aCBvbmUgb3BlcmF0aW9uLAorCSAqIGp1c3QgdXNlIG1heCBhY2Nlc3Mgd2lkdGgKKwkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9CRklFTEQsCiAJCQkiQ2Fubm90IGFjY2VzcyBmaWVsZCBpbiBvbmUgb3BlcmF0aW9uLCB1c2luZyB3aWR0aCA4XG4iKSk7CiAJcmV0dXJuX1ZBTFVFICg4KTsKQEAgLTE4NCw4ICsyMTQsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RlY29kZV9maWVsZF9hY2Nlc3MKICAqCi0gKiBQQVJBTUVURVJTOiAgQWNjZXNzICAgICAgICAgIC0gRW5jb2RlZCBmaWVsZCBhY2Nlc3MgYml0cwotICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAtIEZpZWxkIGxlbmd0aC4KKyAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgICAgIC0gRmllbGQgb2JqZWN0CisgKiAgICAgICAgICAgICAgZmllbGRfZmxhZ3MgICAgICAgICAtIEVuY29kZWQgZmllbGRmbGFncyAoY29udGFpbnMgYWNjZXNzIGJpdHMpCisgKiAgICAgICAgICAgICAgcmV0dXJuX2J5dGVfYWxpZ25tZW50IC0gV2hlcmUgdGhlIGJ5dGUgYWxpZ25tZW50IGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIEZpZWxkIGdyYW51bGFyaXR5ICg4LCAxNiwgMzIgb3IgNjQpIGFuZAogICogICAgICAgICAgICAgIGJ5dGVfYWxpZ25tZW50ICgxLCAyLCAzLCBvciA0KQpAQCAtMjE0LDkgKzI0NSwxMCBAQAogCWNhc2UgQU1MX0ZJRUxEX0FDQ0VTU19BTlk6CiAKICNpZmRlZiBBQ1BJX1VOREVSX0RFVkVMT1BNRU5UCi0JCWJ5dGVfYWxpZ25tZW50ID0gYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MgKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKLQkJCQkgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJCSAweEZGRkZGRkZGIC8qIFRlbXAgdW50aWwgd2UgcGFzcyByZWdpb25fbGVuZ3RoIGFzIHBhcmFtICovKTsKKwkJYnl0ZV9hbGlnbm1lbnQgPQorCQkJYWNwaV9leF9nZW5lcmF0ZV9hY2Nlc3MgKG9ial9kZXNjLT5jb21tb25fZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKKwkJCQlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkJMHhGRkZGRkZGRiAvKiBUZW1wIHVudGlsIHdlIHBhc3MgcmVnaW9uX2xlbmd0aCBhcyBwYXJhbWV0ZXIgKi8pOwogCQliaXRfbGVuZ3RoID0gYnl0ZV9hbGlnbm1lbnQgKiA4OwogI2VuZGlmCiAKQEAgLTI3Niw2ICszMDgsNyBAQAogICogICAgICAgICAgICAgIGZpZWxkX2ZsYWdzICAgICAgICAgLSBBY2Nlc3MsIGxvY2tfcnVsZSwgYW5kIHVwZGF0ZV9ydWxlLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IG9mIGEgZmllbGRfZmxhZyBpcyBkZXNjcmliZWQKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbgorICogICAgICAgICAgICAgIGZpZWxkX2F0dHJpYnV0ZSAgICAgLSBTcGVjaWFsIGF0dHJpYnV0ZXMgKG5vdCB1c2VkKQogICogICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiAgLSBGaWVsZCBzdGFydCBwb3NpdGlvbgogICogICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGggICAgLSBGaWVsZCBsZW5ndGggaW4gbnVtYmVyIG9mIGJpdHMKICAqCkBAIC0zMzcsNyArMzcwLDcgQEAKIAkvKiBTZXR1cCB3aWR0aCAoYWNjZXNzIGdyYW51bGFyaXR5KSBmaWVsZHMgKi8KIAogCW9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2J5dGVfd2lkdGggPSAodTgpCi0JCQlBQ1BJX0RJVl84IChhY2Nlc3NfYml0X3dpZHRoKTsgLyogMSwgMiwgNCwgIDggKi8KKwkJCUFDUElfRElWXzggKGFjY2Vzc19iaXRfd2lkdGgpOyAgICAgICAgICAvKiAxLCAgMiwgIDQsICA4ICovCiAKIAlvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGggPSAodTgpIGFjY2Vzc19iaXRfd2lkdGg7CiAKQEAgLTM4MCwxMSArNDEzLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9wcmVwX2ZpZWxkX3ZhbHVlCiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAgICAgLSBPd25pbmcgTm9kZQotICogICAgICAgICAgICAgIHJlZ2lvbl9ub2RlICAgICAgICAgLSBSZWdpb24gaW4gd2hpY2ggZmllbGQgaXMgYmVpbmcgZGVmaW5lZAotICogICAgICAgICAgICAgIGZpZWxkX2ZsYWdzICAgICAgICAgLSBBY2Nlc3MsIGxvY2tfcnVsZSwgYW5kIHVwZGF0ZV9ydWxlLgotICogICAgICAgICAgICAgIGZpZWxkX2JpdF9wb3NpdGlvbiAgLSBGaWVsZCBzdGFydCBwb3NpdGlvbgotICogICAgICAgICAgICAgIGZpZWxkX2JpdF9sZW5ndGggICAgLSBGaWVsZCBsZW5ndGggaW4gbnVtYmVyIG9mIGJpdHMKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgIC0gQ29udGFpbnMgYWxsIGZpZWxkIGNyZWF0aW9uIGluZm8KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDQ1LDcgKzQ3NCw3IEBACiAJc3dpdGNoIChpbmZvLT5maWVsZF90eXBlKSB7CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCi0JCW9ial9kZXNjLT5maWVsZC5yZWdpb25fb2JqICAgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPnJlZ2lvbl9ub2RlKTsKKwkJb2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKGluZm8tPnJlZ2lvbl9ub2RlKTsKIAogCQkvKiBBbiBhZGRpdGlvbmFsIHJlZmVyZW5jZSBmb3IgdGhlIGNvbnRhaW5lciAqLwogCkBAIC00NjEsOCArNDkwLDEwIEBACiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAogCQlvYmpfZGVzYy0+YmFua19maWVsZC52YWx1ZSAgID0gaW5mby0+YmFua192YWx1ZTsKLQkJb2JqX2Rlc2MtPmJhbmtfZmllbGQucmVnaW9uX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaW9uX25vZGUpOwotCQlvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoaW5mby0+cmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLnJlZ2lvbl9vYmogPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QgKAorCQkJCSBpbmZvLT5yZWdpb25fbm9kZSk7CisJCW9ial9kZXNjLT5iYW5rX2ZpZWxkLmJhbmtfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkgaW5mby0+cmVnaXN0ZXJfbm9kZSk7CiAKIAkJLyogQW4gYWRkaXRpb25hbCByZWZlcmVuY2UgZm9yIHRoZSBhdHRhY2hlZCBvYmplY3RzICovCiAKQEAgLTQ4MSwxMCArNTEyLDEzIEBACiAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5yZWdpc3Rlcl9ub2RlKTsKLQkJb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChpbmZvLT5kYXRhX3JlZ2lzdGVyX25vZGUpOworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0ICgKKwkJCQkgaW5mby0+cmVnaXN0ZXJfbm9kZSk7CisJCW9ial9kZXNjLT5pbmRleF9maWVsZC5kYXRhX29iaiA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAoCisJCQkJIGluZm8tPmRhdGFfcmVnaXN0ZXJfbm9kZSk7CiAJCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSAgPSAodTMyKQotCQkJKGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOworCQkJKGluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKAorCQkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOwogCiAJCWlmICghb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLmRhdGFfb2JqIHx8ICFvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKSB7CiAJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOdWxsIEluZGV4IE9iamVjdCBkdXJpbmcgZmllbGQgcHJlcFxuIikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwppbmRleCA3Y2ZkMDY4Li43MjNhYWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZWdpb24uYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX09QRVJBTkRfVkFMVUUpOwogCX0KIAotCiAjaWZuZGVmIEFDUElfTUlTQUxJR05FRF9UUkFOU0ZFUlMKIAkvKgogCSAqIEhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgbm9uLWFsaWduZWQgZGF0YSB0cmFuc2ZlcnMsIHdlIG11c3QgdmVyaWZ5CkBAIC0xMzQsNyArMTMzLDggQEAKIAkgKi8KIAlpZiAoKGFkZHJlc3MgPCBtZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MpIHx8CiAJCSgoKGFjcGlfaW50ZWdlcikgYWRkcmVzcyArIGxlbmd0aCkgPgotCQkJKChhY3BpX2ludGVnZXIpIG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyArIG1lbV9pbmZvLT5tYXBwZWRfbGVuZ3RoKSkpIHsKKwkJCSgoYWNwaV9pbnRlZ2VyKQorCQkJbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzICsgbWVtX2luZm8tPm1hcHBlZF9sZW5ndGgpKSkgewogCQkvKgogCQkgKiBUaGUgcmVxdWVzdCBjYW5ub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGN1cnJlbnQgbWVtb3J5IG1hcHBpbmc7CiAJCSAqIERlbGV0ZSB0aGUgZXhpc3RpbmcgbWFwcGluZyBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KQEAgLTE1MCw3ICsxNTAsOSBAQAogCQkgKiBEb24ndCBhdHRlbXB0IHRvIG1hcCBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIHJlZ2lvbiwgYW5kCiAJCSAqIGNvbnN0cmFpbiB0aGUgbWF4aW11bSBtYXBwaW5nIHNpemUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUuCiAJCSAqLwotCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpICgobWVtX2luZm8tPmFkZHJlc3MgKyBtZW1faW5mby0+bGVuZ3RoKSAtIGFkZHJlc3MpOworCQl3aW5kb3dfc2l6ZSA9IChhY3BpX3NpemUpCisJCQkoKG1lbV9pbmZvLT5hZGRyZXNzICsgbWVtX2luZm8tPmxlbmd0aCkgLSBhZGRyZXNzKTsKKwogCQlpZiAod2luZG93X3NpemUgPiBBQ1BJX1NZU01FTV9SRUdJT05fV0lORE9XX1NJWkUpIHsKIAkJCXdpbmRvd19zaXplID0gQUNQSV9TWVNNRU1fUkVHSU9OX1dJTkRPV19TSVpFOwogCQl9CkBAIC0xNjAsOCArMTYyLDkgQEAKIAkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLCB3aW5kb3dfc2l6ZSwKIAkJCQkgICh2b2lkICoqKSAmbWVtX2luZm8tPm1hcHBlZF9sb2dpY2FsX2FkZHJlc3MpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBtYXAgbWVtb3J5IGF0ICU4LjhYJTguOFgsIHNpemUgJVhcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzcyksICh1MzIpIHdpbmRvd19zaXplKSk7CisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFglOC44WCwgc2l6ZSAlWFxuIiwKKwkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLCAodTMyKSB3aW5kb3dfc2l6ZSkpOwogCQkJbWVtX2luZm8tPm1hcHBlZF9sZW5ndGggPSAwOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0xNzcsMTAgKzE4MCwxMiBAQAogCSAqIGFjY2VzcwogCSAqLwogCWxvZ2ljYWxfYWRkcl9wdHIgPSBtZW1faW5mby0+bWFwcGVkX2xvZ2ljYWxfYWRkcmVzcyArCi0JCQkgICgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzIC0gKGFjcGlfaW50ZWdlcikgbWVtX2luZm8tPm1hcHBlZF9waHlzaWNhbF9hZGRyZXNzKTsKKwkJCSAgICgoYWNwaV9pbnRlZ2VyKSBhZGRyZXNzIC0KKwkJCQkJICAoYWNwaV9pbnRlZ2VyKSBtZW1faW5mby0+bWFwcGVkX3BoeXNpY2FsX2FkZHJlc3MpOwogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKLQkJCSJzeXN0ZW1fbWVtb3J5ICVkICglZCB3aWR0aCkgQWRkcmVzcz0lOC44WCU4LjhYXG4iLCBmdW5jdGlvbiwgYml0X3dpZHRoLAorCQkJInN5c3RlbV9tZW1vcnkgJWQgKCVkIHdpZHRoKSBBZGRyZXNzPSU4LjhYJTguOFhcbiIsCisJCQlmdW5jdGlvbiwgYml0X3dpZHRoLAogCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSkpOwogCiAgICAvKgpAQCAtMjk4LDEzICszMDMsMTUgQEAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CiAKLQkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BvcnQgKChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsICZ2YWx1ZTMyLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywKKwkJCQkgJnZhbHVlMzIsIGJpdF93aWR0aCk7CiAJCSp2YWx1ZSA9IHZhbHVlMzI7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydCAoKGFjcGlfaW9fYWRkcmVzcykgYWRkcmVzcywgKHUzMikgKnZhbHVlLCBiaXRfd2lkdGgpOworCQlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKChhY3BpX2lvX2FkZHJlc3MpIGFkZHJlc3MsCisJCQkJICh1MzIpICp2YWx1ZSwgYml0X3dpZHRoKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzc1LDEyICszODIsMTQgQEAKIAljYXNlIEFDUElfUkVBRDoKIAogCQkqdmFsdWUgPSAwOwotCQlzdGF0dXMgPSBhY3BpX29zX3JlYWRfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLCB2YWx1ZSwgYml0X3dpZHRoKTsKKwkJc3RhdHVzID0gYWNwaV9vc19yZWFkX3BjaV9jb25maWd1cmF0aW9uIChwY2lfaWQsIHBjaV9yZWdpc3RlciwKKwkJCQkgdmFsdWUsIGJpdF93aWR0aCk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgogCi0JCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLCAqdmFsdWUsIGJpdF93aWR0aCk7CisJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcGNpX2NvbmZpZ3VyYXRpb24gKHBjaV9pZCwgcGNpX3JlZ2lzdGVyLAorCQkJCSAqdmFsdWUsIGJpdF93aWR0aCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTUwNSw4ICs1MTQsNyBAQAogCiAJbG9naWNhbF9hZGRyX3B0ciA9IEFDUElfUEhZU0FERFJfVE9fUFRSIChhZGRyZXNzKTsKIAotCi0gICAvKiBQZXJmb3JtIHRoZSBtZW1vcnkgcmVhZCBvciB3cml0ZSAqLworCS8qIFBlcmZvcm0gdGhlIG1lbW9yeSByZWFkIG9yIHdyaXRlICovCiAKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CiAJY2FzZSBBQ1BJX1JFQUQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCmluZGV4IDc5MzYzMjkuLjIxZDVjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc250ZS5jCkBAIC0yMTAsMTUgKzIxMCwxNSBAQAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgImZpZWxkX3JlYWQgTm9kZT0lcCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJImZpZWxkX3JlYWQgTm9kZT0lcCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAogCQkJbm9kZSwgc291cmNlX2Rlc2MsIGVudHJ5X3R5cGUpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkICh3YWxrX3N0YXRlLCBzb3VyY2VfZGVzYywgJm9ial9kZXNjKTsKIAkJYnJlYWs7CiAKLQkvKgotCSAqIEZvciB0aGVzZSBvYmplY3RzLCBqdXN0IHJldHVybiB0aGUgb2JqZWN0IGF0dGFjaGVkIHRvIHRoZSBOb2RlCi0JICovCisJLyogRm9yIHRoZXNlIG9iamVjdHMsIGp1c3QgcmV0dXJuIHRoZSBvYmplY3QgYXR0YWNoZWQgdG8gdGhlIE5vZGUgKi8KKwogCWNhc2UgQUNQSV9UWVBFX01VVEVYOgogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAljYXNlIEFDUElfVFlQRV9QT1dFUjoKQEAgLTIzMywxMiArMjMzLDEyIEBACiAJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCQlicmVhazsKIAotCiAJLyogVFlQRV9BTlkgaXMgdW50eXBlZCwgYW5kIHRodXMgdGhlcmUgaXMgbm8gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBpdCAqLwogCiAJY2FzZSBBQ1BJX1RZUEVfQU5ZOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW50eXBlZCBlbnRyeSAlcCwgbm8gYXR0YWNoZWQgb2JqZWN0IVxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVW50eXBlZCBlbnRyeSAlcCwgbm8gYXR0YWNoZWQgb2JqZWN0IVxuIiwKIAkJCW5vZGUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOyAgLyogQ2Fubm90IGJlIEFFX1RZUEUgKi8KQEAgLTI1OSw3ICsyNTksOCBAQAogCQlkZWZhdWx0OgogCQkJLyogTm8gbmFtZWQgcmVmZXJlbmNlcyBhcmUgYWxsb3dlZCBoZXJlICovCiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5zdXBwb3J0ZWQgUmVmZXJlbmNlIG9wY29kZSAlWCAoJXMpXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIlVuc3VwcG9ydGVkIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKVxuIiwKIAkJCQlzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CiAKQEAgLTI2OCwxMSArMjY5LDEyIEBACiAJCWJyZWFrOwogCiAKLQkvKiBEZWZhdWx0IGNhc2UgaXMgZm9yIHVua25vd24gdHlwZXMgKi8KLQogCWRlZmF1bHQ6CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJOb2RlICVwIC0gVW5rbm93biBvYmplY3QgdHlwZSAlWFxuIiwKKwkJLyogRGVmYXVsdCBjYXNlIGlzIGZvciB1bmtub3duIHR5cGVzICovCisKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiTm9kZSAlcCAtIFVua25vd24gb2JqZWN0IHR5cGUgJVhcbiIsCiAJCQlub2RlLCBlbnRyeV90eXBlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfT1BFUkFORF9UWVBFKTsKQEAgLTI4MCw3ICsyODIsNyBAQAogCX0gLyogc3dpdGNoIChlbnRyeV90eXBlKSAqLwogCiAKLQkvKiBQdXQgdGhlIG9iamVjdCBkZXNjcmlwdG9yIG9uIHRoZSBzdGFjayAqLworCS8qIFJldHVybiB0aGUgb2JqZWN0IGRlc2NyaXB0b3IgKi8KIAogCSpvYmplY3RfcHRyID0gKHZvaWQgKikgb2JqX2Rlc2M7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYwppbmRleCA3YmU2MDQ5Li4zZGU0NTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvbHYuYwpAQCAtNTQsNiArNTQsMTMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc29sdiIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX2V4X3Jlc29sdmVfb2JqZWN0X3RvX3ZhbHVlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtOTYsNiArMTAzLDExIEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQorCisJCWlmICghKnN0YWNrX3B0cikgeworCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJJbnRlcm5hbCAtIG51bGwgcG9pbnRlclxuIikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fT1BFUkFORCk7CisJCX0KIAl9CiAKIAkvKgpAQCAtMTIwLDE4ICsxMzIsMTcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBzdGFja19wdHIgICAgICAgLSBQb2ludGVyIHRvIGEgc3RhY2sgbG9jYXRpb24gdGhhdCBjb250YWlucyBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyIHRvIGFuIGludGVybmFsIG9iamVjdC4KKyAqIFBBUkFNRVRFUlM6ICBzdGFja19wdHIgICAgICAgLSBQb2ludGVyIHRvIGFuIGludGVybmFsIG9iamVjdAogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAtIEN1cnJlbnQgbWV0aG9kIHN0YXRlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSBhbiBpbnRlcm5hbCBvYmplY3QuICBUaGUgUmVmZXJlbmNlIHR5cGUKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB0aGUgdmFsdWUgZnJvbSBhbiBpbnRlcm5hbCBvYmplY3QuIFRoZSBSZWZlcmVuY2UgdHlwZQogICogICAgICAgICAgICAgIHVzZXMgdGhlIGFzc29jaWF0ZWQgQU1MIG9wY29kZSB0byBkZXRlcm1pbmUgdGhlIHZhbHVlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdGFja19wdHIsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSkKQEAgLTE1OSw3ICsxNzAsNyBAQAogCQljYXNlIEFNTF9OQU1FX09QOgogCiAJCQkvKgotCQkJICogQ29udmVydCBpbmRpcmVjdCBuYW1lIHB0ciB0byBhIGRpcmVjdCBuYW1lIHB0ci4KKwkJCSAqIENvbnZlcnQgbmFtZSByZWZlcmVuY2UgdG8gYSBuYW1lc3BhY2Ugbm9kZQogCQkJICogVGhlbiwgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZQogCQkJICovCiAJCQl0ZW1wX25vZGUgPSBzdGFja19kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwpAQCAtMTY4LDcgKzE3OSw3IEBACiAKIAkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoc3RhY2tfZGVzYyk7CiAKLQkJCS8qIFB1dCBkaXJlY3QgbmFtZSBwb2ludGVyIG9udG8gc3RhY2sgYW5kIGV4aXQgKi8KKwkJCS8qIFJldHVybiB0aGUgbmFtZXNwYWNlIG5vZGUgKi8KIAogCQkJKCpzdGFja19wdHIpID0gdGVtcF9ub2RlOwogCQkJYnJlYWs7CkBAIC0yNTUsMTAgKzI2NiwxOSBAQAogCiAJCQlicmVhazsKIAorCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6ICAgLyogUmVmZXJlbmNlIHRvIGEgbmFtZWQgb2JqZWN0ICovCisKKwkJCS8qIEdldCB0aGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIG5hbWVzcGFjZSBub2RlICovCisKKwkJCSpzdGFja19wdHIgPSAoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGUpLT5vYmplY3Q7CisJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UgKCpzdGFja19wdHIpOworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlIChzdGFja19kZXNjKTsKKwkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CiAKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkR1cmluZyByZXNvbHZlLCBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwKKwkJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkJIkR1cmluZyByZXNvbHZlLCBVbmtub3duIFJlZmVyZW5jZSBvcGNvZGUgJVggKCVzKSBpbiAlcFxuIiwKIAkJCQlvcGNvZGUsIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lIChvcGNvZGUpLCBzdGFja19kZXNjKSk7CiAJCQlzdGF0dXMgPSBBRV9BTUxfSU5URVJOQUw7CiAJCQlicmVhazsKQEAgLTI3OCw5ICsyOTgsOCBAQAogCQlicmVhazsKIAogCi0JLyoKLQkgKiBUaGVzZSBjYXNlcyBtYXkgbmV2ZXIgaGFwcGVuIGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UuLgotCSAqLworCS8qIFRoZXNlIGNhc2VzIG1heSBuZXZlciBoYXBwZW4gaGVyZSwgYnV0IGp1c3QgaW4gY2FzZS4uICovCisKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CkBAIC0zMzMsOSArMzUyLDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlIik7CiAKIAotCS8qCi0JICogT3BlcmFuZCBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gb3BlcmFuZCBkZXNjcmlwdG9yCi0JICovCisJLyogT3BlcmFuZCBjYW4gYmUgZWl0aGVyIGEgbmFtZXNwYWNlIG5vZGUgb3IgYW4gb3BlcmFuZCBkZXNjcmlwdG9yICovCisKIAlzd2l0Y2ggKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgogCQl0eXBlID0gb2JqX2Rlc2MtPmNvbW1vbi50eXBlOwpAQCAtMzU3LDEwICszNzUsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCX0KIAorCS8qIElmIHR5cGUgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHJlZmVyZW5jZSwgd2UgYXJlIGRvbmUgKi8KIAotCS8qCi0JICogSWYgdHlwZSBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgcmVmZXJlbmNlLCB3ZSBhcmUgZG9uZQotCSAqLwogCWlmICh0eXBlICE9IEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKIAkJZ290byBleGl0OwogCX0KQEAgLTM4Miw4ICszOTgsOSBAQAogCQkJLyogQWxsICJSZWZlcmVuY2VzIiBwb2ludCB0byBhIE5TIG5vZGUgKi8KIAogCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKLQkJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBOb3QgYSBOUyBub2RlICVwIFslc11cbiIsCisJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CiAJCQl9CiAKQEAgLTQ0MCw4ICs0NTcsOSBAQAogCQkJLyogQWxsICJSZWZlcmVuY2VzIiBwb2ludCB0byBhIE5TIG5vZGUgKi8KIAogCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGU6IE5vdCBhIE5TIG5vZGUgJXAgWyVzXVxuIiwKLQkJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKKwkJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBOb3QgYSBOUyBub2RlICVwIFslc11cbiIsCisJCQkJCW5vZGUsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZSAobm9kZSkpKTsKIAkJCSAgIHJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0lOVEVSTkFMKTsKIAkJCX0KIApAQCAtNDY4LDcgKzQ4Niw3IEBACiAKIAkJCWlmIChyZXR1cm5fZGVzYykgewogCQkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSwKLQkJCQkJCSAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsIHdhbGtfc3RhdGUsICZvYmpfZGVzYyk7CisJCQkJCQkgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQsIHdhbGtfc3RhdGUsICZvYmpfZGVzYyk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCQkJfQpAQCAtNTAwLDcgKzUxOCw4IEBACiAKIAkJZGVmYXVsdDoKIAotCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiYWNwaV9leF9yZXNvbHZlX211bHRpcGxlOiBVbmtub3duIFJlZmVyZW5jZSBzdWJ0eXBlICVYXG4iLAogCQkJCW9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCmluZGV4IGM5Mjg5MDIuLmQ4YjQ3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYwpAQCAtNTIsNiArNTIsMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHJlc29wIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfZXhfY2hlY2tfb2JqZWN0X3R5cGUgKAorCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdHlwZV9uZWVkZWQsCisJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0aGlzX3R5cGUsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY3LDcgKzc1LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NoZWNrX29iamVjdF90eXBlICgKIAlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkLAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGhpc190eXBlLApAQCAtMTQyLDYgKzE1MCw3IEBACiAJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAqb3BfaW5mbzsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfYXJnX3R5cGU7CiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlX25lZWRlZDsKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9vcCA9IDA7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyICgiZXhfcmVzb2x2ZV9vcGVyYW5kcyIsIG9wY29kZSk7CkBAIC0xNjAsNyArMTY5LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5URVJOQUwpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPcGNvZGUgJVggWyVzXSByZXF1aXJlZF9vcGVyYW5kX3R5cGVzPSU4LjhYIFxuIiwKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkiT3Bjb2RlICVYIFslc10gcmVxdWlyZWRfb3BlcmFuZF90eXBlcz0lOC44WCBcbiIsCiAJCW9wY29kZSwgb3BfaW5mby0+bmFtZSwgYXJnX3R5cGVzKSk7CiAKIAkvKgpAQCAtMTg3LDcgKzE5Nyw3IEBACiAJCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChvYmpfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKIAotCQkJLyogTm9kZSAqLworCQkJLyogTmFtZXNwYWNlIE5vZGUgKi8KIAogCQkJb2JqZWN0X3R5cGUgPSAoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopIG9ial9kZXNjKS0+dHlwZTsKIAkJCWJyZWFrOwpAQCAtMjAyLDE2ICsyMTIsMTYgQEAKIAkJCS8qIENoZWNrIGZvciBiYWQgYWNwaV9vYmplY3RfdHlwZSAqLwogCiAJCQlpZiAoIWFjcGlfdXRfdmFsaWRfb2JqZWN0X3R5cGUgKG9iamVjdF90eXBlKSkgewotCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQmFkIG9wZXJhbmQgb2JqZWN0IHR5cGUgWyVYXVxuIiwKKwkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJIkJhZCBvcGVyYW5kIG9iamVjdCB0eXBlIFslWF1cbiIsCiAJCQkJCW9iamVjdF90eXBlKSk7CiAKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQkJfQogCiAJCQlpZiAob2JqZWN0X3R5cGUgPT0gKHU4KSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7Ci0JCQkJLyoKLQkJCQkgKiBEZWNvZGUgdGhlIFJlZmVyZW5jZQotCQkJCSAqLworCQkJCS8qIERlY29kZSB0aGUgUmVmZXJlbmNlICovCisKIAkJCQlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8gKG9wY29kZSk7CiAJCQkJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQU1MX0JBRF9PUENPREUpOwpAQCAtMjE5LDEyICsyMjksMTcgQEAKIAogCQkJCXN3aXRjaCAob2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpIHsKIAkJCQljYXNlIEFNTF9ERUJVR19PUDoKKwkJCQkJdGFyZ2V0X29wID0gQU1MX0RFQlVHX09QOworCisJCQkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KKwogCQkJCWNhc2UgQU1MX05BTUVfT1A6CiAJCQkJY2FzZSBBTUxfSU5ERVhfT1A6CiAJCQkJY2FzZSBBTUxfUkVGX09GX09QOgogCQkJCWNhc2UgQU1MX0FSR19PUDoKIAkJCQljYXNlIEFNTF9MT0NBTF9PUDoKLQkJCQljYXNlIEFNTF9MT0FEX09QOiAgIC8qIGRkYl9oYW5kbGUgZnJvbSBMT0FEX09QIG9yIExPQURfVEFCTEVfT1AgKi8KKwkJCQljYXNlIEFNTF9MT0FEX09QOiAvKiBkZGJfaGFuZGxlIGZyb20gTE9BRF9PUCBvciBMT0FEX1RBQkxFX09QICovCisJCQkJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOiAvKiBSZWZlcmVuY2UgdG8gYSBuYW1lZCBvYmplY3QgKi8KIAogCQkJCQlBQ1BJX0RFQlVHX09OTFlfTUVNQkVSUyAoQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywKIAkJCQkJCSJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCByZWZfb3Bjb2RlIFslc11cbiIsCkBAIC0yNTQsMTAgKzI2OSw4IEBACiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9PUEVSQU5EX1RZUEUpOwogCQl9CiAKKwkJLyogR2V0IG9uZSBhcmd1bWVudCB0eXBlLCBwb2ludCB0byB0aGUgbmV4dCAqLwogCi0JCS8qCi0JCSAqIEdldCBvbmUgYXJndW1lbnQgdHlwZSwgcG9pbnQgdG8gdGhlIG5leHQKLQkJICovCiAJCXRoaXNfYXJnX3R5cGUgPSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKTsKIAkJSU5DUkVNRU5UX0FSR19MSVNUIChhcmdfdHlwZXMpOwogCkBAIC0yNzEsMjYgKzI4NCwzMSBAQAogCQkJaWYgKChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSAmJgogCQkJCShBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9TVFJJTkcpKSB7CiAJCQkJLyoKLQkJCQkgKiBTdHJpbmcgZm91bmQgLSB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBuYW1lZCBvYmplY3QgYW5kIG11c3QgYmUKLQkJCQkgKiByZXNvbHZlZCB0byBhIG5vZGUKKwkJCQkgKiBTdHJpbmcgZm91bmQgLSB0aGUgc3RyaW5nIHJlZmVyZW5jZXMgYSBuYW1lZCBvYmplY3QgYW5kCisJCQkJICogbXVzdCBiZSByZXNvbHZlZCB0byBhIG5vZGUKIAkJCQkgKi8KIAkJCQlnb3RvIG5leHRfb3BlcmFuZDsKIAkJCX0KIAotCQkJLyogRWxzZSBub3QgYSBzdHJpbmcgLSBmYWxsIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBSZWZlcmVuY2UgY2FzZSBiZWxvdyAqLworCQkJLyoKKwkJCSAqIEVsc2Ugbm90IGEgc3RyaW5nIC0gZmFsbCB0aHJvdWdoIHRvIHRoZSBub3JtYWwgUmVmZXJlbmNlCisJCQkgKiBjYXNlIGJlbG93CisJCQkgKi8KIAkJCS8qbGludCAtZmFsbHRocm91Z2ggKi8KIAogCQljYXNlIEFSR0lfUkVGRVJFTkNFOiAgICAgICAgICAgIC8qIFJlZmVyZW5jZXM6ICovCiAJCWNhc2UgQVJHSV9JTlRFR0VSX1JFRjoKIAkJY2FzZSBBUkdJX09CSkVDVF9SRUY6CiAJCWNhc2UgQVJHSV9ERVZJQ0VfUkVGOgotCQljYXNlIEFSR0lfVEFSR0VUUkVGOiAgICAgICAgICAgIC8qIEFsbG93cyBpbXBsaWNpdCBjb252ZXJzaW9uIHJ1bGVzIGJlZm9yZSBzdG9yZSAqLwotCQljYXNlIEFSR0lfRklYRURfVEFSR0VUOiAgICAgICAgIC8qIE5vIGltcGxpY2l0IGNvbnZlcnNpb24gYmVmb3JlIHN0b3JlIHRvIHRhcmdldCAqLwotCQljYXNlIEFSR0lfU0lNUExFX1RBUkdFVDogICAgICAgIC8qIE5hbWUsIExvY2FsLCBvciBBcmcgLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICAqLworCQljYXNlIEFSR0lfVEFSR0VUUkVGOiAgICAgLyogQWxsb3dzIGltcGxpY2l0IGNvbnZlcnNpb24gcnVsZXMgYmVmb3JlIHN0b3JlICovCisJCWNhc2UgQVJHSV9GSVhFRF9UQVJHRVQ6ICAvKiBObyBpbXBsaWNpdCBjb252ZXJzaW9uIGJlZm9yZSBzdG9yZSB0byB0YXJnZXQgKi8KKwkJY2FzZSBBUkdJX1NJTVBMRV9UQVJHRVQ6IC8qIE5hbWUsIExvY2FsLCBvciBBcmcgLSBubyBpbXBsaWNpdCBjb252ZXJzaW9uICAqLwogCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFICovCi0KLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgLyogTm9kZSAobmFtZSkgcHRyIE9LIGFzLWlzICovIHsKKwkJCS8qCisJCQkgKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFCisJCQkgKiBBIE5hbWVzcGFjZSBOb2RlIGlzIE9LIGFzLWlzCisJCQkgKi8KKwkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgewogCQkJCWdvdG8gbmV4dF9vcGVyYW5kOwogCQkJfQogCkBAIC0zMDAsMTEgKzMxOCw5IEBACiAJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJfQogCi0JCQlpZiAoQU1MX05BTUVfT1AgPT0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpIHsKLQkJCQkvKgotCQkJCSAqIENvbnZlcnQgYW4gaW5kaXJlY3QgbmFtZSBwdHIgdG8gZGlyZWN0IG5hbWUgcHRyIGFuZCBwdXQKLQkJCQkgKiBpdCBvbiB0aGUgc3RhY2sKLQkJCQkgKi8KKwkJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfTkFNRV9PUCkgeworCQkJCS8qIENvbnZlcnQgYSBuYW1lZCByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBuYW1lZCBvYmplY3QgKi8KKwogCQkJCXRlbXBfbm9kZSA9IG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OwogCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAob2JqX2Rlc2MpOwogCQkJCSgqc3RhY2tfcHRyKSA9IHRlbXBfbm9kZTsKQEAgLTMzMiw3ICszNDgsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAotCiAJCS8qCiAJCSAqIFJlc29sdmUgdGhpcyBvYmplY3QgdG8gYSB2YWx1ZQogCQkgKi8KQEAgLTM5Miw3ICs0MDcsNyBAQAogCQkvKgogCQkgKiBUaGUgbW9yZSBjb21wbGV4IGNhc2VzIGFsbG93IG11bHRpcGxlIHJlc29sdmVkIG9iamVjdCB0eXBlcwogCQkgKi8KLQkJY2FzZSBBUkdJX0lOVEVHRVI6ICAgLyogTnVtYmVyICovCisJCWNhc2UgQVJHSV9JTlRFR0VSOgogCiAJCQkvKgogCQkJICogTmVlZCBhbiBvcGVyYW5kIG9mIHR5cGUgQUNQSV9UWVBFX0lOVEVHRVIsCkBAIC01NjMsNyArNTc4LDcgQEAKIAogCQljYXNlIEFSR0lfUkVHSU9OX09SX0ZJRUxEOgogCi0JCQkvKiBOZWVkIGFuIG9wZXJhbmQgb2YgdHlwZSBBQ1BJX1RZUEVfUkVHSU9OIG9yIGEgRklFTEQgaW4gYSByZWdpb24gKi8KKwkJCS8qIE5lZWQgYW4gb3BlcmFuZCBvZiB0eXBlIFJFR0lPTiBvciBhIEZJRUxEIGluIGEgcmVnaW9uICovCiAKIAkJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSkgewogCQkJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgpAQCAtNjE0LDYgKzYyOSwxMiBAQAogCQkJCQlicmVhazsKIAkJCQl9CiAKKwkJCQlpZiAodGFyZ2V0X29wID09IEFNTF9ERUJVR19PUCkgeworCQkJCQkvKiBBbGxvdyBzdG9yZSBvZiBhbnkgb2JqZWN0IHRvIHRoZSBEZWJ1ZyBvYmplY3QgKi8KKworCQkJCQlicmVhazsKKwkJCQl9CisKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCQkJIk5lZWRlZCBJbnRlZ2VyL0J1ZmZlci9TdHJpbmcvUGFja2FnZS9SZWYvRGRiXSwgZm91bmQgWyVzXSAlcFxuIiwKIAkJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwpAQCAtNjUyLDggKzY3Myw3IEBACiAJCWlmIChHRVRfQ1VSUkVOVF9BUkdfVFlQRSAoYXJnX3R5cGVzKSkgewogCQkJc3RhY2tfcHRyLS07CiAJCX0KLQotCX0gICAvKiB3aGlsZSAoKlR5cGVzKSAqLworCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCmluZGV4IGUwZmM2YWIuLjI3MjVkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYwpAQCAtNDgsMTEgKzQ4LDE3MSBAQAogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KICNpbmNsdWRlIDxhY3BpL2FtbGNvZGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogCiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VYRUNVVEVSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJleHN0b3JlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9leF9zdG9yZV9vYmplY3RfdG9faW5kZXggKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnZhbF9kZXNjLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3RfZGVzYywKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X2RvX2RlYnVnX29iamVjdAorICoKKyAqIFBBUkFNRVRFUlM6ICBzb3VyY2VfZGVzYyAgICAgICAgIC0gVmFsdWUgdG8gYmUgc3RvcmVkCisgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIEluZGVudGF0aW9uIGxldmVsICh1c2VkIGZvciBwYWNrYWdlcykKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gQ3VycmVudCBwYWNrYWdlIGVsZW1lbnQsIHplcm8gaWYgbm90IHBrZworICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZXMgc3RvcmVzIHRvIHRoZSBEZWJ1ZyBPYmplY3QuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2FjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpCit7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoImV4X2RvX2RlYnVnX29iamVjdCIsIHNvdXJjZV9kZXNjKTsKKworCisJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIltBQ1BJIERlYnVnXSAlKnMiLAorCQlsZXZlbCwgIiAiKSk7CisKKwkvKiBEaXNwbGF5IGluZGV4IGZvciBwYWNrYWdlIG91dHB1dCBvbmx5ICovCisKKwlpZiAoaW5kZXggPiAwKSB7CisJICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKKwkJICAgIiglLjJ1KSAiLCBpbmRleCAtMSkpOworCX0KKworCWlmICghc291cmNlX2Rlc2MpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIjxOdWxsIE9iamVjdD5cbiIpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCisJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MpID09IEFDUElfREVTQ19UWVBFX09QRVJBTkQpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAiLAorCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisKKwkJaWYgKCFhY3BpX3V0X3ZhbGlkX2ludGVybmFsX29iamVjdCAoc291cmNlX2Rlc2MpKSB7CisJCSAgIEFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsCisJCQkgICAiJXAsIEludmFsaWQgSW50ZXJuYWwgT2JqZWN0IVxuIiwgc291cmNlX2Rlc2MpKTsKKwkJICAgcmV0dXJuX1ZPSUQ7CisJCX0KKwl9CisJZWxzZSBpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFIChzb3VyY2VfZGVzYykgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIiVzOiAlcFxuIiwKKwkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKSBzb3VyY2VfZGVzYyktPnR5cGUpLAorCQkJc291cmNlX2Rlc2MpKTsKKwkJcmV0dXJuX1ZPSUQ7CisJfQorCWVsc2UgeworCQlyZXR1cm5fVk9JRDsKKwl9CisKKwlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpIHsKKwljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgorCisJCS8qIE91dHB1dCBjb3JyZWN0IGludGVnZXIgd2lkdGggKi8KKworCQlpZiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpIHsKKwkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYXG4iLAorCQkJCSh1MzIpIHNvdXJjZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKSk7CisJCX0KKwkJZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WCU4LjhYXG4iLAorCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFDUElfVFlQRV9CVUZGRVI6CisKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIiwKKwkJCSh1MzIpIHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKSk7CisJCUFDUElfRFVNUF9CVUZGRVIgKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlciwKKwkJCShzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IDMyKSA/IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDogMzIpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0gXCIlc1wiXG4iLAorCQkJc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikpOworCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CisKKwkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlggRWxlbWVudHNdXG4iLAorCQkJc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQpKTsKKworCQkvKiBPdXRwdXQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcGFja2FnZSAqLworCisJCWZvciAoaSA9IDA7IGkgPCBzb3VyY2VfZGVzYy0+cGFja2FnZS5jb3VudDsgaSsrKSB7CisJCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHNbaV0sCisJCQkJbGV2ZWwrNCwgaSsxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRToKKworCQlpZiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0lOREVYX09QKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzLCAweCVYXVxuIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpLAorCQkJCXNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2Zmc2V0KSk7CisJCX0KKwkJZWxzZSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWyVzXVxuIiwKKwkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUpKSk7CisJCX0KKworCisJCWlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCkgeworCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpID09CisJCQkJCUFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKCgoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5vYmplY3QsCisJCQkJCWxldmVsKzQsIDApOworCQkJfQorCQkJZWxzZSB7CisJCQkJYWNwaV9leF9kb19kZWJ1Z19vYmplY3QgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0LCBsZXZlbCs0LCAwKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChzb3VyY2VfZGVzYy0+cmVmZXJlbmNlLm5vZGUpIHsKKwkJCWFjcGlfZXhfZG9fZGVidWdfb2JqZWN0ICgoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5ub2RlKS0+b2JqZWN0LAorCQkJCWxldmVsKzQsIDApOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKworCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiJXAgJXNcbiIsCisJCQlzb3VyY2VfZGVzYywgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpKSk7CisJCWJyZWFrOworCX0KKworCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9FWEVDLCAiXG4iKSk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xNTQsOCArMzE0LDkgQEAKIAogCQkvKiBTdG9yaW5nIGFuIG9iamVjdCBpbnRvIGEgTmFtZSAiY29udGFpbmVyIiAqLwogCi0JCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKHNvdXJjZV9kZXNjLCByZWZfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKLQkJCQkgIHdhbGtfc3RhdGUsIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTik7CisJCXN0YXR1cyA9IGFjcGlfZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUgKHNvdXJjZV9kZXNjLAorCQkJCSByZWZfZGVzYy0+cmVmZXJlbmNlLm9iamVjdCwKKwkJCQkgd2Fsa19zdGF0ZSwgQUNQSV9JTVBMSUNJVF9DT05WRVJTSU9OKTsKIAkJYnJlYWs7CiAKIApAQCAtMTczLDcgKzMzNCw3IEBACiAJCS8qIFN0b3JlIHRvIGEgbWV0aG9kIGxvY2FsL2FyZyAgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2RzX3N0b3JlX29iamVjdF90b19sb2NhbCAocmVmX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUsCi0JCQkJICByZWZfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOworCQkJCSByZWZfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwgc291cmNlX2Rlc2MsIHdhbGtfc3RhdGUpOwogCQlicmVhazsKIAogCkBAIC0xODcsNjAgKzM0OCw3IEBACiAJCQkiKioqKiBXcml0ZSB0byBEZWJ1ZyBPYmplY3Q6IE9iamVjdCAlcCAlcyAqKioqOlxuXG4iLAogCQkJc291cmNlX2Rlc2MsIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUgKHNvdXJjZV9kZXNjKSkpOwogCi0JCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbQUNQSSBEZWJ1Z10gJXM6ICIsCi0JCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChzb3VyY2VfZGVzYykpKTsKLQotCQlpZiAoIWFjcGlfdXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0IChzb3VyY2VfZGVzYykpIHsKLQkJICAgQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwKLQkJCSAgICIlcCwgSW52YWxpZCBJbnRlcm5hbCBPYmplY3QhXG4iLCBzb3VyY2VfZGVzYykpOwotCQkgICBicmVhazsKLQkJfQotCi0JCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSkgewotCQljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgotCi0JCQlpZiAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpIHsKLQkJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiMHglOC44WFxuIiwKLQkJCQkJKHUzMikgc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIweCU4LjhYJTguOFhcbiIsCi0JCQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoc291cmNlX2Rlc2MtPmludGVnZXIudmFsdWUpKSk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKLQotCQkJQUNQSV9ERUJVR19QUklOVF9SQVcgKChBQ1BJX0RCX0RFQlVHX09CSkVDVCwgIlsweCUuMlhdIiwKLQkJCQkodTMyKSBzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpOwotCQkJQUNQSV9EVU1QX0JVRkZFUiAoc291cmNlX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAotCQkJCShzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCA8IDMyKSA/IHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoIDogMzIpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEFDUElfVFlQRV9TVFJJTkc6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICJbMHglLjJYXSBcIiVzXCJcbiIsCi0JCQkJc291cmNlX2Rlc2MtPnN0cmluZy5sZW5ndGgsIHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikpOwotCQkJYnJlYWs7Ci0KLQotCQljYXNlIEFDUElfVFlQRV9QQUNLQUdFOgotCi0JCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfREVCVUdfT0JKRUNULCAiWzB4JS4yWF0gRWxlbWVudHMgUHRyIC0gJXBcbiIsCi0JCQkJc291cmNlX2Rlc2MtPnBhY2thZ2UuY291bnQsIHNvdXJjZV9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKSk7Ci0JCQlicmVhazsKLQotCi0JCWRlZmF1bHQ6Ci0KLQkJCUFDUElfREVCVUdfUFJJTlRfUkFXICgoQUNQSV9EQl9ERUJVR19PQkpFQ1QsICIlcFxuIiwKLQkJCQlzb3VyY2VfZGVzYykpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVyAoKEFDUElfREJfRVhFQywgIlxuIikpOworCQlhY3BpX2V4X2RvX2RlYnVnX29iamVjdCAoc291cmNlX2Rlc2MsIDAsIDApOwogCQlicmVhazsKIAogCkBAIC0yNzIsNyArMzgwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaW5kZXhfZGVzYywKQEAgLTMxMywxNiArNDIxLDIyIEBACiAJCWlmIChvYmpfZGVzYykgewogCQkJLyogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZSAqLwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopIGluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OyBpKyspIHsKKwkJCWZvciAoaSA9IDA7CisJCQkJIGkgPCAoKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKikKKwkJCQkJCWluZGV4X2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QpLT5jb21tb24ucmVmZXJlbmNlX2NvdW50OworCQkJCSBpKyspIHsKIAkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKG9ial9kZXNjKTsKIAkJCX0KIAkJfQogCiAJCSooaW5kZXhfZGVzYy0+cmVmZXJlbmNlLndoZXJlKSA9IG5ld19kZXNjOwogCi0JCS8qIEluY3JlbWVudCByZWZlcmVuY2UgY291bnQgYnkgdGhlIHJlZiBjb3VudCBvZiB0aGUgcGFyZW50IHBhY2thZ2UgLTEgKi8KKwkJLyogSW5jcmVtZW50IHJlZiBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZS0xICovCiAKLQkJZm9yIChpID0gMTsgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKSBpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsgaSsrKSB7CisJCWZvciAoaSA9IDE7CisJCQkgaSA8ICgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKQorCQkJCQlpbmRleF9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KS0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudDsKKwkJCSBpKyspIHsKIAkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSAobmV3X2Rlc2MpOwogCQl9CiAKQEAgLTQ0MCw5ICs1NTQsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSICgiZXhfc3RvcmVfb2JqZWN0X3RvX25vZGUiLCBzb3VyY2VfZGVzYyk7CiAKIAotCS8qCi0JICogR2V0IGN1cnJlbnQgdHlwZSBvZiB0aGUgbm9kZSwgYW5kIG9iamVjdCBhdHRhY2hlZCB0byBOb2RlCi0JICovCisJLyogR2V0IGN1cnJlbnQgdHlwZSBvZiB0aGUgbm9kZSwgYW5kIG9iamVjdCBhdHRhY2hlZCB0byBOb2RlICovCisKIAl0YXJnZXRfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUgKG5vZGUpOwogCXRhcmdldF9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0IChub2RlKTsKIApAQCAtNDY3LDE5ICs1ODAsMTggQEAKIAkJdGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCX0KIAotCS8qCi0JICogRG8gdGhlIGFjdHVhbCBzdG9yZSBvcGVyYXRpb24KLQkgKi8KKwkvKiBEbyB0aGUgYWN0dWFsIHN0b3JlIG9wZXJhdGlvbiAqLworCiAJc3dpdGNoICh0YXJnZXRfdHlwZSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQkFOS19GSUVMRDoKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAotCQkvKgotCQkgKiBGb3IgZmllbGRzLCBjb3B5IHRoZSBzb3VyY2UgZGF0YSB0byB0aGUgdGFyZ2V0IGZpZWxkLgotCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9leF93cml0ZV9kYXRhX3RvX2ZpZWxkIChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsICZ3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKTsKKwkJLyogRm9yIGZpZWxkcywgY29weSB0aGUgc291cmNlIGRhdGEgdG8gdGhlIHRhcmdldCBmaWVsZC4gKi8KKworCQlzdGF0dXMgPSBhY3BpX2V4X3dyaXRlX2RhdGFfdG9fZmllbGQgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywKKwkJCQkgJndhbGtfc3RhdGUtPnJlc3VsdF9vYmopOwogCQlicmVhazsKIAogCkBAIC00OTMsNyArNjA1LDggQEAKIAkJICoKIAkJICogQ29weSBhbmQvb3IgY29udmVydCB0aGUgc291cmNlIG9iamVjdCB0byBhIG5ldyB0YXJnZXQgb2JqZWN0CiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlX29iamVjdF90b19vYmplY3QgKHNvdXJjZV9kZXNjLCB0YXJnZXRfZGVzYywgJm5ld19kZXNjLCB3YWxrX3N0YXRlKTsKKwkJc3RhdHVzID0gYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0IChzb3VyY2VfZGVzYywgdGFyZ2V0X2Rlc2MsCisJCQkJICZuZXdfZGVzYywgd2Fsa19zdGF0ZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtNTI2LDcgKzYzOSw4IEBACiAKIAkJLyogTm8gY29udmVyc2lvbnMgZm9yIGFsbCBvdGhlciB0eXBlcy4gIEp1c3QgYXR0YWNoIHRoZSBzb3VyY2Ugb2JqZWN0ICovCiAKLQkJc3RhdHVzID0gYWNwaV9uc19hdHRhY2hfb2JqZWN0IChub2RlLCBzb3VyY2VfZGVzYywgQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdCAobm9kZSwgc291cmNlX2Rlc2MsCisJCQkJIEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKaW5kZXggZDM2NzdmZS4uMTIwZjMwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKQEAgLTgxLDkgKzgxLDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiZXhfcmVzb2x2ZV9vYmplY3QiKTsKIAogCi0JLyoKLQkgKiBFbnN1cmUgd2UgaGF2ZSBhIFRhcmdldCB0aGF0IGNhbiBiZSBzdG9yZWQgdG8KLQkgKi8KKwkvKiBFbnN1cmUgd2UgaGF2ZSBhIFRhcmdldCB0aGF0IGNhbiBiZSBzdG9yZWQgdG8gKi8KKwogCXN3aXRjaCAodGFyZ2V0X3R5cGUpIHsKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVHSU9OX0ZJRUxEOgpAQCAtMTE4LDE2ICsxMTcsMTQgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJLyoKLQkJICogTXVzdCBoYXZlIGEgSW50ZWdlciwgQnVmZmVyLCBvciBTdHJpbmcKLQkJICovCisJCS8qIE11c3QgaGF2ZSBhIEludGVnZXIsIEJ1ZmZlciwgb3IgU3RyaW5nICovCisKIAkJaWYgKChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoc291cmNlX2Rlc2MpICE9IEFDUElfVFlQRV9JTlRFR0VSKSAgICYmCiAJCQkoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKHNvdXJjZV9kZXNjKSAhPSBBQ1BJX1RZUEVfQlVGRkVSKSAgICAmJgogCQkJKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgIT0gQUNQSV9UWVBFX1NUUklORykgICAgJiYKIAkJCSEoKEFDUElfR0VUX09CSkVDVF9UWVBFIChzb3VyY2VfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgJiYgKHNvdXJjZV9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9MT0FEX09QKSkpIHsKLQkJCS8qCi0JCQkgKiBDb252ZXJzaW9uIHN1Y2Nlc3NmdWwgYnV0IHN0aWxsIG5vdCBhIHZhbGlkIHR5cGUKLQkJCSAqLworCQkJLyogQ29udmVyc2lvbiBzdWNjZXNzZnVsIGJ1dCBzdGlsbCBub3QgYSB2YWxpZCB0eXBlICovCisKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCSJDYW5ub3QgYXNzaWduIHR5cGUgJXMgdG8gJXMgKG11c3QgYmUgdHlwZSBJbnQvU3RyL0J1ZilcbiIsCiAJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoc291cmNlX2Rlc2MpLApAQCAtMTQwLDkgKzEzNyw4IEBACiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfQUxJQVM6CiAJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTOgogCi0JCS8qCi0JCSAqIEFsaWFzZXMgYXJlIHJlc29sdmVkIGJ5IGFjcGlfZXhfcHJlcF9vcGVyYW5kcwotCQkgKi8KKwkJLyogQWxpYXNlcyBhcmUgcmVzb2x2ZWQgYnkgYWNwaV9leF9wcmVwX29wZXJhbmRzICovCisKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU3RvcmUgaW50byBBbGlhcyAtIHNob3VsZCBuZXZlciBoYXBwZW5cbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JvYi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKaW5kZXggMDVlMWVjYS4uMTJkMTUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMKQEAgLTEyOCw3ICsxMjgsOCBAQAogCWVsc2UgewogCQkvKiBUcnVuY2F0ZSB0aGUgc291cmNlLCBjb3B5IG9ubHkgd2hhdCB3aWxsIGZpdCAqLwogCi0JCUFDUElfTUVNQ1BZICh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIGJ1ZmZlciwgdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpOworCQlBQ1BJX01FTUNQWSAodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5wb2ludGVyLCBidWZmZXIsCisJCQl0YXJnZXRfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywKIAkJCSJUcnVuY2F0aW5nIHNvdXJjZSBidWZmZXIgZnJvbSAlWCB0byAlWFxuIiwKQEAgLTE4Myw3ICsxODQsOCBAQAogCQkgKiBTdHJpbmcgd2lsbCBmaXQgaW4gZXhpc3Rpbmcgbm9uLXN0YXRpYyBidWZmZXIuCiAJCSAqIENsZWFyIG9sZCBzdHJpbmcgYW5kIGNvcHkgaW4gdGhlIG5ldyBvbmUKIAkJICovCi0JCUFDUElfTUVNU0VUICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDAsIChhY3BpX3NpemUpIHRhcmdldF9kZXNjLT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCUFDUElfTUVNU0VUICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIsIDAsCisJCQkoYWNwaV9zaXplKSB0YXJnZXRfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDEpOwogCQlBQ1BJX01FTUNQWSAodGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyLCBidWZmZXIsIGxlbmd0aCk7CiAJfQogCWVsc2UgewpAQCAtMTk4LDcgKzIwMCw4IEBACiAJCQlBQ1BJX01FTV9GUkVFICh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOwogCQl9CiAKLQkJdGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgoYWNwaV9zaXplKSBsZW5ndGggKyAxKTsKKwkJdGFyZ2V0X2Rlc2MtPnN0cmluZy5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFICgKKwkJCQkgICAoYWNwaV9zaXplKSBsZW5ndGggKyAxKTsKIAkJaWYgKCF0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3lzdGVtLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYwppbmRleCBmOTJlZmM1Li5jYWZhNzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYwpAQCAtNTUsOCArNTUsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZQogICoKLSAqIFBBUkFNRVRFUlM6ICBTZW1hcGhvcmUgICAgICAgICAgIC0gT1NEIHNlbWFwaG9yZSB0byB3YWl0IG9uCi0gKiAgICAgICAgICAgICAgVGltZW91dCAgICAgICAgICAgICAtIE1heCB0aW1lIHRvIHdhaXQKKyAqIFBBUkFNRVRFUlM6ICBTZW1hcGhvcmUgICAgICAgLSBTZW1hcGhvcmUgdG8gd2FpdCBvbgorICogICAgICAgICAgICAgIFRpbWVvdXQgICAgICAgICAtIE1heCB0aW1lIHRvIHdhaXQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtOTAsNyArOTAsOCBAQAogCiAJCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUgKHNlbWFwaG9yZSwgMSwgdGltZW91dCk7CiAKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIioqKiBUaHJlYWQgYXdha2UgYWZ0ZXIgYmxvY2tpbmcsICVzXG4iLAogCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAKIAkJLyogUmVhY3F1aXJlIHRoZSBpbnRlcnByZXRlciAqLwpAQCAtMTExLDggKzExMiw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N0YWxsCiAgKgotICogUEFSQU1FVEVSUzogIGhvd19sb25nICAgICAgICAgICAgLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gc3RhbGwsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcworICogUEFSQU1FVEVSUzogIGhvd19sb25nICAgICAgICAtIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdGFsbCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWNyb3NlY29uZHMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMTQxLDcgKzE0Miw4IEBACiAJCSAqIChBQ1BJIHNwZWNpZmllcyAxMDAgdXNlYyBhcyBtYXgsIGJ1dCB0aGlzIGdpdmVzIHNvbWUgc2xhY2sgaW4KIAkJICogb3JkZXIgdG8gc3VwcG9ydCBleGlzdGluZyBCSU9TcykKIAkJICovCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIlN0YWxsOiBUaW1lIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UgKCVkKVxuIiwgaG93X2xvbmcpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiU3RhbGw6IFRpbWUgcGFyYW1ldGVyIGlzIHRvbyBsYXJnZSAoJWQpXG4iLAorCQkJaG93X2xvbmcpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CiAJfQogCWVsc2UgewpAQCAtMTU2LDggKzE1OCw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX2RvX3N1c3BlbmQKICAqCi0gKiBQQVJBTUVURVJTOiAgaG93X2xvbmcgICAgICAgICAgICAtIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdXNwZW5kLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMKKyAqIFBBUkFNRVRFUlM6ICBob3dfbG9uZyAgICAgICAgLSBUaGUgYW1vdW50IG9mIHRpbWUgdG8gc3VzcGVuZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE5Miw4ICsxOTQsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4CiAgKgotICogUEFSQU1FVEVSUzogICp0aW1lX2Rlc2MgICAgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIHRpbWVfZGVzYyAgICAgICAtIFRoZSAndGltZSB0byBkZWxheScgb2JqZWN0IGRlc2NyaXB0b3IKKyAqICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjE4LDE2ICsyMjAsMTUgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSBnbyBnZXQgdGhlIGdsb2JhbCBsb2NrCi0JICovCisJLyogU3VwcG9ydCBmb3IgdGhlIF9HTF8gTXV0ZXggb2JqZWN0IC0tIGdvIGdldCB0aGUgZ2xvYmFsIGxvY2sgKi8KKwogCWlmIChvYmpfZGVzYy0+bXV0ZXguc2VtYXBob3JlID09IGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSkgewogCQlzdGF0dXMgPSBhY3BpX2V2X2FjcXVpcmVfZ2xvYmFsX2xvY2sgKCh1MTYpIHRpbWVfZGVzYy0+aW50ZWdlci52YWx1ZSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSAob2JqX2Rlc2MtPm11dGV4LnNlbWFwaG9yZSwKLQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJCSAodTE2KSB0aW1lX2Rlc2MtPmludGVnZXIudmFsdWUpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KIApAQCAtMjM2LDcgKzIzNyw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yNjEsOSArMjYyLDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jawotCSAqLworCS8qIFN1cHBvcnQgZm9yIHRoZSBfR0xfIE11dGV4IG9iamVjdCAtLSByZWxlYXNlIHRoZSBnbG9iYWwgbG9jayAqLworCiAJaWYgKG9ial9kZXNjLT5tdXRleC5zZW1hcGhvcmUgPT0gYWNwaV9nYmxfZ2xvYmFsX2xvY2tfc2VtYXBob3JlKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXZfcmVsZWFzZV9nbG9iYWxfbG9jayAoKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMjc4LDkgKzI3OCw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfc3lzdGVtX3NpZ25hbF9ldmVudAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqX2Rlc2MgICAgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCisgKiBQQVJBTUVURVJTOiAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCiAgKgotICogUkVUVVJOOiAgICAgIEFFX09LCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFByb3ZpZGVzIGFuIGFjY2VzcyBwb2ludCB0byBwZXJmb3JtIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zCiAgKiAgICAgICAgICAgICAgd2l0aGluIHRoZSBBTUwuCkBAIC0zMDksOCArMzA5LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9ldmVudAogICoKLSAqIFBBUkFNRVRFUlM6ICAqdGltZV9kZXNjICAgICAgICAgIC0gVGhlICd0aW1lIHRvIGRlbGF5JyBvYmplY3QgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgICpvYmpfZGVzYyAgICAgICAgICAgLSBUaGUgb2JqZWN0IGRlc2NyaXB0b3IgZm9yIHRoaXMgb3AKKyAqIFBBUkFNRVRFUlM6ICB0aW1lX2Rlc2MgICAgICAgLSBUaGUgJ3RpbWUgdG8gZGVsYXknIG9iamVjdCBkZXNjcmlwdG9yCisgKiAgICAgICAgICAgICAgb2JqX2Rlc2MgICAgICAgIC0gVGhlIG9iamVjdCBkZXNjcmlwdG9yIGZvciB0aGlzIG9wCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTMzMyw3ICszMzMsNyBAQAogCiAJaWYgKG9ial9kZXNjKSB7CiAJCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlIChvYmpfZGVzYy0+ZXZlbnQuc2VtYXBob3JlLAotCQkJCSAgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKKwkJCQkgKHUxNikgdGltZV9kZXNjLT5pbnRlZ2VyLnZhbHVlKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC0zNDQsNyArMzQ0LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9leF9zeXN0ZW1fcmVzZXRfZXZlbnQKICAqCi0gKiBQQVJBTUVURVJTOiAgKm9ial9kZXNjICAgICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAorICogUEFSQU1FVEVSUzogIG9ial9kZXNjICAgICAgICAtIFRoZSBvYmplY3QgZGVzY3JpcHRvciBmb3IgdGhpcyBvcAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYwppbmRleCA0MGM2YWJiLi41YzdlYzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKQEAgLTY3LDIyICs2NywzMSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfRVhFQ1VURVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImV4dXRpbHMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB1MzIKK2FjcGlfZXhfZGlnaXRzX25lZWRlZCAoCisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOworCiAKICNpZm5kZWYgQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCiAgKiBERVNDUklQVElPTjogRW50ZXIgdGhlIGludGVycHJldGVyIGV4ZWN1dGlvbiByZWdpb24uICBGYWlsdXJlIHRvIGVudGVyCiAgKiAgICAgICAgICAgICAgdGhlIGludGVycHJldGVyIHJlZ2lvbiBpcyBhIGZhdGFsIHN5c3RlbSBlcnJvcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X2VudGVyX2ludGVycHJldGVyICh2b2lkKQorYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlciAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKIApAQCAtMTA0LDYgKzExMyw4IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBFeGl0IHRoZSBpbnRlcnByZXRlciBleGVjdXRpb24gcmVnaW9uCiAgKgogICogQ2FzZXMgd2hlcmUgdGhlIGludGVycHJldGVyIGlzIHVubG9ja2VkOgpAQCAtMTE5LDcgKzEzMCw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCi1hY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKHZvaWQpCithY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKQEAgLTIxMiw3ICsyMjQsOCBAQAogCQkJbG9ja2VkID0gVFJVRTsKIAkJfQogCQllbHNlIHsKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQ291bGQgbm90IGFjcXVpcmUgR2xvYmFsIExvY2ssICVzXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJIkNvdWxkIG5vdCBhY3F1aXJlIEdsb2JhbCBMb2NrLCAlc1xuIiwKIAkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJfQogCX0KQEAgLTIyOCw3ICsyNDEsNyBAQAogICogUEFSQU1FVEVSUzogIGxvY2tlZF9ieV9tZSAgICAtIFJldHVybiB2YWx1ZSBmcm9tIGNvcnJlc3BvbmRpbmcgY2FsbCB0bwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVfZ2xvYmFsX2xvY2suCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgZ2xvYmFsIGxvY2sgaWYgaXQgaXMgbG9ja2VkLgogICoKQEAgLTI2OSwxMSArMjgyLDE0IEBACiAgKiBQQVJBTUVURVJTOiAgVmFsdWUgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgcmVwcmVzZW50ZWQKICAqICAgICAgICAgICAgICBCYXNlICAgICAgICAgICAgLSBCYXNlIG9mIHJlcHJlc2VudGF0aW9uCiAgKgotICogUkVUVVJOOiAgICAgIHRoZSBudW1iZXIgb2YgZGlnaXRzIG5lZWRlZCB0byByZXByZXNlbnQgVmFsdWUgaW4gQmFzZQorICogUkVUVVJOOiAgICAgIFRoZSBudW1iZXIgb2YgZGlnaXRzLgorICoKKyAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBkaWdpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUgVmFsdWUKKyAqICAgICAgICAgICAgICBpbiB0aGUgZ2l2ZW4gQmFzZSAoUmFkaXgpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTMyCitzdGF0aWMgdTMyCiBhY3BpX2V4X2RpZ2l0c19uZWVkZWQgKAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgdmFsdWUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlKQpAQCAtMzEyLDYgKzMyOCw4IEBACiAgKiBQQVJBTUVURVJTOiAgbnVtZXJpY19pZCAgICAgIC0gRUlTQSBJRCB0byBiZSBjb252ZXJ0ZWQKICAqICAgICAgICAgICAgICBvdXRfc3RyaW5nICAgICAgLSBXaGVyZSB0byBwdXQgdGhlIGNvbnZlcnRlZCBzdHJpbmcgKDggYnl0ZXMpCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBhIG51bWVyaWMgRUlTQSBJRCB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzQ5LDcgKzM2NywxMCBAQAogICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAogICogICAgICAgICAgICAgIG91dF9zdHJpbmcgICAgICAtIFdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIHN0cmluZyAoOCBieXRlcykKICAqCi0gKiBSRVRVUk46ICAgICAgQ29udmVydCBhIG51bWJlciB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAqIFJFVFVSTjogICAgICBOb25lLCBzdHJpbmcKKyAqCisgKiBERVNDUklQVE9JTjogQ29udmVydCBhIG51bWJlciB0byBzdHJpbmcgcmVwcmVzZW50YXRpb24uIEFzc3VtZXMgc3RyaW5nCisgKiAgICAgICAgICAgICAgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzdHJpbmcuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwY2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBMaW5rIHBoeXNpY2FsIGRldmljZXMgd2l0aCBBQ1BJIGRldmljZXMgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBEYXZpZCBTaGFvaHVhIExpIDxzaGFvaHVhLmxpQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBJbnRlbCBDb3JwLgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorCisjZGVmaW5lIEFDUElfR0xVRV9ERUJVRwkwCisjaWYgQUNQSV9HTFVFX0RFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGsoUFJFRklYIHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorc3RhdGljIExJU1RfSEVBRChidXNfdHlwZV9saXN0KTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKGJ1c190eXBlX3NlbSk7CisKK2ludCByZWdpc3Rlcl9hY3BpX2J1c190eXBlKHN0cnVjdCBhY3BpX2J1c190eXBlICp0eXBlKQoreworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAodHlwZSAmJiB0eXBlLT5idXMgJiYgdHlwZS0+ZmluZF9kZXZpY2UpIHsKKwkJZG93bl93cml0ZSgmYnVzX3R5cGVfc2VtKTsKKwkJbGlzdF9hZGRfdGFpbCgmdHlwZS0+bGlzdCwgJmJ1c190eXBlX2xpc3QpOworCQl1cF93cml0ZSgmYnVzX3R5cGVfc2VtKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggImJ1cyB0eXBlICVzIHJlZ2lzdGVyZWRcbiIsIHR5cGUtPmJ1cy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9hY3BpX2J1c190eXBlKTsKKworaW50IHVucmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqdHlwZSkKK3sKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUpIHsKKwkJZG93bl93cml0ZSgmYnVzX3R5cGVfc2VtKTsKKwkJbGlzdF9kZWxfaW5pdCgmdHlwZS0+bGlzdCk7CisJCXVwX3dyaXRlKCZidXNfdHlwZV9zZW0pOworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiQUNQSSBidXMgdHlwZSAlcyB1bnJlZ2lzdGVyZWRcbiIsIHR5cGUtPmJ1cy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUpOworCitzdGF0aWMgc3RydWN0IGFjcGlfYnVzX3R5cGUgKmFjcGlfZ2V0X2J1c190eXBlKHN0cnVjdCBidXNfdHlwZSAqdHlwZSkKK3sKKwlzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqdG1wLCAqcmV0ID0gTlVMTDsKKworCWRvd25fcmVhZCgmYnVzX3R5cGVfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmJ1c190eXBlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRtcC0+YnVzID09IHR5cGUpIHsKKwkJCXJldCA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwX3JlYWQoJmJ1c190eXBlX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3BpX2ZpbmRfYnJpZGdlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICogaGFuZGxlKQoreworCXN0cnVjdCBhY3BpX2J1c190eXBlICp0bXA7CisJaW50IHJldCA9IC1FTk9ERVY7CisKKwlkb3duX3JlYWQoJmJ1c190eXBlX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZidXNfdHlwZV9saXN0LCBsaXN0KSB7CisJCWlmICh0bXAtPmZpbmRfYnJpZGdlICYmICF0bXAtPmZpbmRfYnJpZGdlKGRldiwgaGFuZGxlKSkgeworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwX3JlYWQoJmJ1c190eXBlX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyogR2V0IFBDSSByb290IGJyaWRnZSdzIGhhbmRsZSBmcm9tIGl0cyBzZWdtZW50IGFuZCBidXMgbnVtYmVyICovCitzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290IHsKKwl1bnNpZ25lZCBpbnQgc2VnOworCXVuc2lnbmVkIGludCBidXM7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworfTsKKworc3RhdGljIGFjcGlfc3RhdHVzCitkb19yb290X2JyaWRnZV9idXNucl9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmRhdGEpCit7CisJaW50ICpidXNuciA9IChpbnQgKilkYXRhOworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzOworCisJaWYgKHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTMTYgJiYKKwkgICAgcmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1MzMiAmJgorCSAgICByZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzY0KQorCQlyZXR1cm4gQUVfT0s7CisKKwlhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXNvdXJjZSwgJmFkZHJlc3MpOworCWlmICgoYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApICYmCisJICAgIChhZGRyZXNzLnJlc291cmNlX3R5cGUgPT0gQUNQSV9CVVNfTlVNQkVSX1JBTkdFKSkKKwkJKmJ1c25yID0gYWRkcmVzcy5taW5fYWRkcmVzc19yYW5nZTsKKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIGludCBnZXRfcm9vdF9icmlkZ2VfYnVzbnIoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgYnVzLCBiYm47CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKworCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwgTlVMTCwKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgKikmYmJuKTsKKwlpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkgeworCQkvKiBBc3N1bWUgYnVzID0gMCAqLworCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWAorCQkgICAgICAgIkFzc3VtZSByb290IGJyaWRnZSBbJXNdIGJ1cyBpcyAwXG4iLAorCQkgICAgICAgKGNoYXIgKilidWZmZXIucG9pbnRlcik7CisJCXN0YXR1cyA9IEFFX09LOworCQliYm4gPSAwOworCX0KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJYmJuID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKwlpZiAoYmJuID4gMCkKKwkJZ290byBleGl0OworCisJLyogX0JCTiBpbiBzb21lIHN5c3RlbXMgcmV0dXJuIDAgZm9yIGFsbCByb290IGJyaWRnZXMgKi8KKwlidXMgPSAtMTsKKwlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQkgICAgIGRvX3Jvb3RfYnJpZGdlX2J1c25yX2NhbGxiYWNrLCAmYnVzKTsKKwkvKiBJZiBfQ1JTIGZhaWxlZCwgd2UganVzdCB1c2UgX0JCTiAqLworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAoYnVzID09IC0xKSkKKwkJZ290byBleGl0OworCS8qIFdlIHNlbGVjdCBfQ1JTICovCisJaWYgKGJibiAhPSBidXMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVgKKwkJICAgICAgICJfQkJOIGFuZCBfQ1JTIHJldHVybnMgZGlmZmVyZW50IHZhbHVlIGZvciAlcy4gU2VsZWN0IF9DUlNcbiIsCisJCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJYmJuID0gYnVzOworCX0KKyAgICAgIGV4aXQ6CisJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gYmJuOworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMKK2ZpbmRfcGNpX3Jvb3RicmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJc3RydWN0IGFjcGlfZmluZF9wY2lfcm9vdCAqZmluZCA9IChzdHJ1Y3QgYWNwaV9maW5kX3BjaV9yb290ICopY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIHNlZywgYnVzOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgdG1wOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisKKwlhY3BpX2dldF9uYW1lKGhhbmRsZSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsIE1FVEhPRF9OQU1FX19TRUcsIE5VTEwsICZzZWcpOworCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisJCS8qIEFzc3VtZSBzZWcgPSAwICovCisJCXByaW50ayhLRVJOX0lORk8gUFJFRklYCisJCSAgICAgICAiQXNzdW1lIHJvb3QgYnJpZGdlIFslc10gc2VnbWVudCBpcyAwXG4iLAorCQkgICAgICAgKGNoYXIgKilidWZmZXIucG9pbnRlcik7CisJCXN0YXR1cyA9IEFFX09LOworCQlzZWcgPSAwOworCX0KKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKKwkJZ290byBleGl0OworCX0KKworCXRtcCA9IGdldF9yb290X2JyaWRnZV9idXNucihoYW5kbGUpOworCWlmICh0bXAgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJGaW5kIHJvb3QgYnJpZGdlIGZhaWxlZCBmb3IgJXNcbiIsCisJCSAgICAgICAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJc3RhdHVzID0gQUVfQ1RSTF9ERVBUSDsKKwkJZ290byBleGl0OworCX0KKwlidXMgPSB0bXA7CisKKwlpZiAoc2VnID09IGZpbmQtPnNlZyAmJiBidXMgPT0gZmluZC0+YnVzKQorCQlmaW5kLT5oYW5kbGUgPSBoYW5kbGU7CisJc3RhdHVzID0gQUVfT0s7CisgICAgICBleGl0OgorCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworYWNwaV9oYW5kbGUgYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMpCit7CisJc3RydWN0IGFjcGlfZmluZF9wY2lfcm9vdCBmaW5kID0geyBzZWcsIGJ1cywgTlVMTCB9OworCisJYWNwaV9nZXRfZGV2aWNlcyhQQ0lfUk9PVF9ISURfU1RSSU5HLCBmaW5kX3BjaV9yb290YnJpZGdlLCAmZmluZCwgTlVMTCk7CisJcmV0dXJuIGZpbmQuaGFuZGxlOworfQorCisvKiBHZXQgZGV2aWNlJ3MgaGFuZGxlciBwZXIgaXRzIGFkZHJlc3MgdW5kZXIgaXRzIHBhcmVudCAqLworc3RydWN0IGFjcGlfZmluZF9jaGlsZCB7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfaW50ZWdlciBhZGRyZXNzOworfTsKKworc3RhdGljIGFjcGlfc3RhdHVzCitkb19hY3BpX2ZpbmRfY2hpbGQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJc3RydWN0IGFjcGlfZmluZF9jaGlsZCAqZmluZCA9IChzdHJ1Y3QgYWNwaV9maW5kX2NoaWxkICopY29udGV4dDsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X29iamVjdF9pbmZvKGhhbmRsZSwgJmJ1ZmZlcik7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCWluZm8gPSBidWZmZXIucG9pbnRlcjsKKwkJaWYgKGluZm8tPmFkZHJlc3MgPT0gZmluZC0+YWRkcmVzcykKKwkJCWZpbmQtPmhhbmRsZSA9IGhhbmRsZTsKKwkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwl9CisJcmV0dXJuIEFFX09LOworfQorCithY3BpX2hhbmRsZSBhY3BpX2dldF9jaGlsZChhY3BpX2hhbmRsZSBwYXJlbnQsIGFjcGlfaW50ZWdlciBhZGRyZXNzKQoreworCXN0cnVjdCBhY3BpX2ZpbmRfY2hpbGQgZmluZCA9IHsgTlVMTCwgYWRkcmVzcyB9OworCisJaWYgKCFwYXJlbnQpCisJCXJldHVybiBOVUxMOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcGFyZW50LAorCQkJICAgIDEsIGRvX2FjcGlfZmluZF9jaGlsZCwgJmZpbmQsIE5VTEwpOworCXJldHVybiBmaW5kLmhhbmRsZTsKK30KKworRVhQT1JUX1NZTUJPTChhY3BpX2dldF9jaGlsZCk7CisKKy8qIExpbmsgQUNQSSBkZXZpY2VzIHdpdGggcGh5c2ljYWwgZGV2aWNlcyAqLworc3RhdGljIHZvaWQgYWNwaV9nbHVlX2RhdGFfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJICAgdTMyIGZ1bmN0aW9uLCB2b2lkICpjb250ZXh0KQoreworCS8qIHdlIHByb3ZpZGUgYW4gZW1wdHkgaGFuZGxlciAqLworfQorCisvKiBOb3RlOiBhIHN1Y2Nlc3MgY2FsbCB3aWxsIGluY3JlYXNlIHJlZmVyZW5jZSBjb3VudCBieSBvbmUgKi8KK3N0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X2RhdGEoaGFuZGxlLCBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyLCAodm9pZCAqKikmZGV2KTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBnZXRfZGV2aWNlKGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcGh5c2ljYWxfZGV2aWNlKTsKKworc3RhdGljIGludCBhY3BpX2JpbmRfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChkZXYtPmZpcm13YXJlX2RhdGEpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVgKKwkJICAgICAgICJEcml2ZXJzIGNoYW5nZWQgJ2Zpcm13YXJlX2RhdGEnIGZvciAlc1xuIiwgZGV2LT5idXNfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZ2V0X2RldmljZShkZXYpOworCXN0YXR1cyA9IGFjcGlfYXR0YWNoX2RhdGEoaGFuZGxlLCBhY3BpX2dsdWVfZGF0YV9oYW5kbGVyLCBkZXYpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlwdXRfZGV2aWNlKGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPmZpcm13YXJlX2RhdGEgPSBoYW5kbGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX3VuYmluZF9vbmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZGV2LT5maXJtd2FyZV9kYXRhKQorCQlyZXR1cm4gMDsKKwlpZiAoZGV2ID09IGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShkZXYtPmZpcm13YXJlX2RhdGEpKSB7CisJCS8qIGFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZSBpbmNyZWFzZSByZWZjbnQgYnkgb25lICovCisJCXB1dF9kZXZpY2UoZGV2KTsKKwkJYWNwaV9kZXRhY2hfZGF0YShkZXYtPmZpcm13YXJlX2RhdGEsIGFjcGlfZ2x1ZV9kYXRhX2hhbmRsZXIpOworCQlkZXYtPmZpcm13YXJlX2RhdGEgPSBOVUxMOworCQkvKiBhY3BpX2JpbmRfb25lIGluY3JlYXNlIHJlZmNudCBieSBvbmUgKi8KKwkJcHV0X2RldmljZShkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVgKKwkJICAgICAgICJPb3BzLCAnZmlybXdhcmVfZGF0YScgY29ycnVwdCBmb3IgJXNcbiIsIGRldi0+YnVzX2lkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9wbGF0Zm9ybV9ub3RpZnkoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2J1c190eXBlICp0eXBlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghZGV2LT5idXMgfHwgIWRldi0+cGFyZW50KSB7CisJCS8qIGJyaWRnZSBkZXZpY2VzIGdlbmVybmFsbHkgaGF2ZW4ndCBidXMgb3IgcGFyZW50ICovCisJCXJldCA9IGFjcGlfZmluZF9icmlkZ2VfZGV2aWNlKGRldiwgJmhhbmRsZSk7CisJCWdvdG8gZW5kOworCX0KKwl0eXBlID0gYWNwaV9nZXRfYnVzX3R5cGUoZGV2LT5idXMpOworCWlmICghdHlwZSkgeworCQlEQkcoIk5vIEFDUEkgYnVzIHN1cHBvcnQgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZW5kOworCX0KKwlpZiAoKHJldCA9IHR5cGUtPmZpbmRfZGV2aWNlKGRldiwgJmhhbmRsZSkpICE9IDApCisJCURCRygiQ2FuJ3QgZ2V0IGhhbmRsZXIgZm9yICVzXG4iLCBkZXYtPmJ1c19pZCk7CisgICAgICBlbmQ6CisJaWYgKCFyZXQpCisJCWFjcGlfYmluZF9vbmUoZGV2LCBoYW5kbGUpOworCisjaWYgQUNQSV9HTFVFX0RFQlVHCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKworCQlhY3BpX2dldF9uYW1lKGRldi0+ZmlybXdhcmVfZGF0YSwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTsKKwkJREJHKCJEZXZpY2UgJXMgLT4gJXNcbiIsIGRldi0+YnVzX2lkLCAoY2hhciAqKWJ1ZmZlci5wb2ludGVyKTsKKwkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwl9IGVsc2UKKwkJREJHKCJEZXZpY2UgJXMgLT4gTm8gQUNQSSBzdXBwb3J0XG4iLCBkZXYtPmJ1c19pZCk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9wbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlhY3BpX3VuYmluZF9vbmUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hY3BpX2RldmljZV9ub3RpZnkodm9pZCkKK3sKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuIDA7CisJaWYgKHBsYXRmb3JtX25vdGlmeSB8fCBwbGF0Zm9ybV9ub3RpZnlfcmVtb3ZlKSB7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkNhbid0IHVzZSBwbGF0Zm9ybV9ub3RpZnlcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcGxhdGZvcm1fbm90aWZ5ID0gYWNwaV9wbGF0Zm9ybV9ub3RpZnk7CisJcGxhdGZvcm1fbm90aWZ5X3JlbW92ZSA9IGFjcGlfcGxhdGZvcm1fbm90aWZ5X3JlbW92ZTsKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChpbml0X2FjcGlfZGV2aWNlX25vdGlmeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKaW5kZXggNTI5ZTkyMi4uYjUxMDAxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwpAQCAtNTgsNyArNTgsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBhbmQgdmFsaWRhdGUgdmFyaW91cyBBQ1BJIHJlZ2lzdGVycworICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYW5kIHZhbGlkYXRlIHRoZSB2YXJpb3VzIEFDUEkgcmVnaXN0ZXJzIGRlZmluZWQgaW4KKyAqICAgICAgICAgICAgICB0aGUgRkFEVC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03NSw3ICs3Niw3IEBACiAJLyogV2UgbXVzdCBoYXZlIHRoZSBBQ1BJIHRhYmxlcyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSAqLwogCiAJaWYgKCFhY3BpX2dibF9GQURUKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQSBGQURUIGlzIG5vdCBsb2FkZWRcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJObyBGQURUIGlzIHByZXNlbnRcbiIpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CkBAIC0xMzEsNyArMTMyLDggQEAKIAkgKiB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4KIAkgKi8KIAlpZiAoIWFjcGlfZ2JsX0ZBRFQtPmFjcGlfZW5hYmxlICYmICFhY3BpX2dibF9GQURULT5hY3BpX2Rpc2FibGUpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiTm8gQUNQSSBtb2RlIHRyYW5zaXRpb24gc3VwcG9ydGVkIGluIHRoaXMgc3lzdGVtIChlbmFibGUvZGlzYWJsZSBib3RoIHplcm8pXG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KIApAQCAtMTYyLDcgKzE2NCw4IEBACiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3Qgd3JpdGUgbW9kZSBjaGFuZ2UsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IHdyaXRlIG1vZGUgY2hhbmdlLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCkBAIC0xNzMsNyArMTc2LDggQEAKIAlyZXRyeSA9IDMwMDA7CiAJd2hpbGUgKHJldHJ5KSB7CiAJCWlmIChhY3BpX2h3X2dldF9tb2RlKCkgPT0gbW9kZSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgIk1vZGUgJVggc3VjY2Vzc2Z1bGx5IGVuYWJsZWRcbiIsIG1vZGUpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sICJNb2RlICVYIHN1Y2Nlc3NmdWxseSBlbmFibGVkXG4iLAorCQkJCW1vZGUpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCQl9CiAJCWFjcGlfb3Nfc3RhbGwoMTAwMCk7CkBAIC0xODUsNyArMTg5LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2h3X2dldF9tb2RlCiAgKgpAQCAtMTk5LDcgKzIwMyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1MzIKLWFjcGlfaHdfZ2V0X21vZGUgKHZvaWQpCithY3BpX2h3X2dldF9tb2RlICgKKwl2b2lkKQogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCmluZGV4IDlhYzFkNjMuLjhkYWVhYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCkBAIC00OCw2ICs0OCwxMyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfSEFSRFdBUkUKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoImh3Z3BlIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sgKAorCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAorCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzNSw2ICsxNDIsNyBAQAogICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgc3RhdHVzIG9mIGEgc2luZ2xlIEdQRS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2h3X2dldF9ncGVfc3RhdHVzICgKQEAgLTIwNiw3ICsyMTQsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbGwgR1BFcyB3aXRoaW4gYSBHUEUgYmxvY2sKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFsbCBHUEVzIHdpdGhpbiBhIHNpbmdsZSBHUEUgYmxvY2sKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNDQsNyArMjUyLDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IENsZWFyIHN0YXR1cyBiaXRzIGZvciBhbGwgR1BFcyB3aXRoaW4gYSBHUEUgYmxvY2sKKyAqIERFU0NSSVBUSU9OOiBDbGVhciBzdGF0dXMgYml0cyBmb3IgYWxsIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jawogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTI4Miw4ICsyOTAsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAicnVudGltZSIgR1BFcyB3aXRoaW4gYSBHUEUgYmxvY2suIChJbmNsdWRlcwotICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuKQorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgInJ1bnRpbWUiIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jay4gSW5jbHVkZXMKKyAqICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3YWtlL3J1biBHUEVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTMyNywxMiArMzM1LDEyIEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFbmFibGUgYWxsICJ3YWtlIiBHUEVzIHdpdGhpbiBhIEdQRSBibG9jay4gIChJbmNsdWRlcwotICogICAgICAgICAgICAgIGNvbWJpbmF0aW9uIHdha2UvcnVuIEdQRXMuKQorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgIndha2UiIEdQRXMgd2l0aGluIGEgc2luZ2xlIEdQRSBibG9jay4gSW5jbHVkZXMKKyAqICAgICAgICAgICAgICBjb21iaW5hdGlvbiB3YWtlL3J1biBHUEVzLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sgKAogCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jaykKQEAgLTM1MCw3ICszNTgsOCBAQAogCiAJCS8qIEVuYWJsZSBhbGwgIndha2UiIEdQRXMgaW4gdGhpcyByZWdpc3RlciAqLwogCi0JCXN0YXR1cyA9IGFjcGlfaHdfbG93X2xldmVsX3dyaXRlICg4LCBncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV0uZW5hYmxlX2Zvcl93YWtlLAorCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSAoOCwKKwkJCQkgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvW2ldLmVuYWJsZV9mb3Jfd2FrZSwKIAkJCQkgJmdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mb1tpXS5lbmFibGVfYWRkcmVzcyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybiAoc3RhdHVzKTsKQEAgLTM2OSw3ICszNzgsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRGlzYWJsZSBhbmQgY2xlYXIgYWxsIEdQRXMKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgR1BFcyBpbiBhbGwgR1BFIGJsb2NrcwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM5Nyw3ICs0MDYsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCBHUEVzIG9mIHRoZSBnaXZlbiB0eXBlCisgKiBERVNDUklQVElPTjogRW5hYmxlIGFsbCAicnVudGltZSIgR1BFcywgaW4gYWxsIEdQRSBibG9ja3MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00MjQsNyArNDMzLDcgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgotICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgR1BFcyBvZiB0aGUgZ2l2ZW4gdHlwZQorICogREVTQ1JJUFRJT046IEVuYWJsZSBhbGwgIndha2V1cCIgR1BFcywgaW4gYWxsIEdQRSBibG9ja3MKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKaW5kZXggOTFhZjBjMi4uNmQ5ZTRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwpAQCAtODcsOCArODcsOSBAQAogCQl9CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKLQkJCSAgQUNQSV9CSVRNQVNLX0FMTF9GSVhFRF9TVEFUVVMpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xX1NUQVRVUywKKwkJCSBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CkBAIC0xMzgsMjggKzEzOSwzMCBAQAogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICBpbmZvOworCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNsZWVwX3N0YXRlX25hbWU7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEiKTsKIAogCi0JLyoKLQkgKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzCi0JICovCisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLworCiAJaWYgKChzbGVlcF9zdGF0ZSA+IEFDUElfU19TVEFURVNfTUFYKSB8fAogCQkhc2xlZXBfdHlwZV9hIHx8ICFzbGVlcF90eXBlX2IpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQkvKgotCSAqIEV2YWx1YXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgdGhpcyBzdGF0ZQotCSAqLworCS8qIEV2YWx1YXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgdGhpcyBzdGF0ZSAqLworCiAJaW5mby5wYXJhbWV0ZXJzID0gTlVMTDsKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUgKChjaGFyICopIGFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXSwKLQkJCSAgJmluZm8pOworCWluZm8ucmV0dXJuX29iamVjdCA9IE5VTEw7CisJc2xlZXBfc3RhdGVfbmFtZSA9IChjaGFyICopIGFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXTsKKworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZSAoc2xlZXBfc3RhdGVfbmFtZSwgJmluZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIiVzIHdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXVxuIiwKLQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgYWNwaV9nYmxfc2xlZXBfc3RhdGVfbmFtZXNbc2xlZXBfc3RhdGVdKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiJXMgd2hpbGUgZXZhbHVhdGluZyBzbGVlcF9zdGF0ZSBbJXNdXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLCBzbGVlcF9zdGF0ZV9uYW1lKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTE2Nyw0NSArMTcwLDU3IEBACiAJLyogTXVzdCBoYXZlIGEgcmV0dXJuIG9iamVjdCAqLwogCiAJaWYgKCFpbmZvLnJldHVybl9vYmplY3QpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWlzc2luZyBTbGVlcCBTdGF0ZSBvYmplY3RcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTm8gU2xlZXAgU3RhdGUgb2JqZWN0IHJldHVybmVkIGZyb20gWyVzXVxuIiwKKwkJCXNsZWVwX3N0YXRlX25hbWUpKTsKIAkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCX0KIAogCS8qIEl0IG11c3QgYmUgb2YgdHlwZSBQYWNrYWdlICovCiAKIAllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoaW5mby5yZXR1cm5fb2JqZWN0KSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSBvYmplY3Qgbm90IGEgUGFja2FnZVxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSByZXR1cm4gb2JqZWN0IGlzIG5vdCBhIFBhY2thZ2VcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAl9CiAKLQkvKiBUaGUgcGFja2FnZSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzICovCi0KKwkvKgorCSAqIFRoZSBwYWNrYWdlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuICBOT1RFIChNYXJjaCAyMDA1KTogVGhpcworCSAqIGdvZXMgYWdhaW5zdCB0aGUgY3VycmVudCBBQ1BJIHNwZWMgd2hpY2ggZGVmaW5lcyB0aGlzIG9iamVjdCBhcyBhCisJICogcGFja2FnZSB3aXRoIG9uZSBlbmNvZGVkIERXT1JEIGVsZW1lbnQuICBIb3dldmVyLCBleGlzdGluZyBwcmFjdGljZQorCSAqIGJ5IEJJT1MgdmVuZG9ycyBzZWVtcyB0byBiZSB0byBoYXZlIDIgb3IgbW9yZSBlbGVtZW50cywgYXQgbGVhc3QKKwkgKiBvbmUgcGVyIHNsZWVwIHR5cGUgKEEvQikuCisJICovCiAJZWxzZSBpZiAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmNvdW50IDwgMikgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSBwYWNrYWdlIGRvZXMgbm90IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzXG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiU2xlZXAgU3RhdGUgcmV0dXJuIHBhY2thZ2UgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHNcbiIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX05PX09QRVJBTkQ7CiAJfQogCiAJLyogVGhlIGZpcnN0IHR3byBlbGVtZW50cyBtdXN0IGJvdGggYmUgb2YgdHlwZSBJbnRlZ2VyICovCiAKLQllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHx8Ci0JCQkgKEFDUElfR0VUX09CSkVDVF9UWVBFIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pICE9IEFDUElfVFlQRV9JTlRFR0VSKSkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJTbGVlcCBTdGF0ZSBwYWNrYWdlIGVsZW1lbnRzIGFyZSBub3QgYm90aCBJbnRlZ2VycyAoJXMsICVzKVxuIiwKKwllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkKKwkJCSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgfHwKKwkJCSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkKKwkJCQkhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJTbGVlcCBTdGF0ZSByZXR1cm4gcGFja2FnZSBlbGVtZW50cyBhcmUgbm90IGJvdGggSW50ZWdlcnMgKCVzLCAlcylcbiIsCiAJCQlhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLAogCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzFdKSkpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwogCX0KIAllbHNlIHsKLQkJLyoKLQkJICogVmFsaWQgX1N4XyBwYWNrYWdlIHNpemUsIHR5cGUsIGFuZCB2YWx1ZQotCQkgKi8KLQkJKnNsZWVwX3R5cGVfYSA9ICh1OCkgKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSktPmludGVnZXIudmFsdWU7Ci0JCSpzbGVlcF90eXBlX2IgPSAodTgpIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pLT5pbnRlZ2VyLnZhbHVlOworCQkvKiBWYWxpZCBfU3hfIHBhY2thZ2Ugc2l6ZSwgdHlwZSwgYW5kIHZhbHVlICovCisKKwkJKnNsZWVwX3R5cGVfYSA9ICh1OCkKKwkJCShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLT5pbnRlZ2VyLnZhbHVlOworCQkqc2xlZXBfdHlwZV9iID0gKHU4KQorCQkJKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSktPmludGVnZXIudmFsdWU7CiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCSJXaGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlc1xuIiwKLQkJCWFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXSwgaW5mby5yZXR1cm5fb2JqZWN0LAorCQkJIiVzIFdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXSwgYmFkIFNsZWVwIG9iamVjdCAlcCB0eXBlICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpLAorCQkJc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LAogCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZSAoaW5mby5yZXR1cm5fb2JqZWN0KSkpOwogCX0KIApAQCAtMjIxLDkgKzIzNiw5IEBACiAgKgogICogUEFSQU1FVEVSUzogIHJlZ2lzdGVyX2lkICAgICAgICAgLSBJbmRleCBvZiBBQ1BJIFJlZ2lzdGVyIHRvIGFjY2VzcwogICoKLSAqIFJFVFVSTjogICAgICBUaGUgYml0IG1hc2sgdG8gYmUgdXNlZCB3aGVuIGFjY2Vzc2luZyB0aGUgcmVnaXN0ZXIKKyAqIFJFVFVSTjogICAgICBUaGUgYml0bWFzayB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIHRoZSByZWdpc3RlcgogICoKLSAqIERFU0NSSVBUSU9OOiBNYXAgcmVnaXN0ZXJfaWQgaW50byBhIHJlZ2lzdGVyIGJpdCBtYXNrLgorICogREVTQ1JJUFRJT046IE1hcCByZWdpc3Rlcl9pZCBpbnRvIGEgcmVnaXN0ZXIgYml0bWFzay4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zNTksNyArMzc0LDcgQEAKIAkvKiBBbHdheXMgZG8gYSByZWdpc3RlciByZWFkIGZpcnN0IHNvIHdlIGNhbiBpbnNlcnQgdGhlIG5ldyBiaXRzICAqLwogCiAJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywKLQkJCSAgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsICZyZWdpc3Rlcl92YWx1ZSk7CisJCQkgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsICZyZWdpc3Rlcl92YWx1ZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKIAl9CkBAIC0zOTYsNyArNDExLDcgQEAKIAkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSAgQUNQSV9SRUdJU1RFUl9QTTFfRU5BQkxFLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CisJCQkJIEFDUElfUkVHSVNURVJfUE0xX0VOQUJMRSwgKHUxNikgcmVnaXN0ZXJfdmFsdWUpOwogCQlicmVhazsKIAogCkBAIC00MTMsNyArNDI4LDcgQEAKIAkJCQliaXRfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzaywgdmFsdWUpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSAgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgKHUxNikgcmVnaXN0ZXJfdmFsdWUpOworCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLCAodTE2KSByZWdpc3Rlcl92YWx1ZSk7CiAJCWJyZWFrOwogCiAKQEAgLTQyNywxNyArNDQyLDE5IEBACiAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJQTTIgY29udHJvbDogUmVhZCAlWCBmcm9tICU4LjhYJTguOFhcbiIsCiAJCQlyZWdpc3Rlcl92YWx1ZSwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CisJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKAorCQkJCWFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkpOwogCiAJCUFDUElfUkVHSVNURVJfSU5TRVJUX1ZBTFVFIChyZWdpc3Rlcl92YWx1ZSwgYml0X3JlZ19pbmZvLT5iaXRfcG9zaXRpb24sCiAJCQkJYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2ssIHZhbHVlKTsKIAogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIkFib3V0IHRvIHdyaXRlICU0LjRYIHRvICU4LjhYJTguOFhcbiIsCiAJCQlyZWdpc3Rlcl92YWx1ZSwKLQkJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MpKSk7CisJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKAorCQkJCWFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2Jsay5hZGRyZXNzKSkpOwogCiAJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAotCQkJCSAgIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsICh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CisJCQkJIEFDUElfUkVHSVNURVJfUE0yX0NPTlRST0wsICh1OCkgKHJlZ2lzdGVyX3ZhbHVlKSk7CiAJCWJyZWFrOwogCiAKQEAgLTQ1NCw3ICs0NzEsOSBAQAogCiAJLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCiAKLQlBQ1BJX0RFQlVHX0VYRUMgKHJlZ2lzdGVyX3ZhbHVlID0gKChyZWdpc3Rlcl92YWx1ZSAmIGJpdF9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKSA+PiBiaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbikpOworCUFDUElfREVCVUdfRVhFQyAocmVnaXN0ZXJfdmFsdWUgPQorCQkoKHJlZ2lzdGVyX3ZhbHVlICYgYml0X3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2spID4+CisJCQliaXRfcmVnX2luZm8tPmJpdF9wb3NpdGlvbikpOwogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sICJTZXQgYml0czogJTguOFggYWN0dWFsICU4LjhYIHJlZ2lzdGVyICVYXG4iLAogCQkJdmFsdWUsIHJlZ2lzdGVyX3ZhbHVlLCBiaXRfcmVnX2luZm8tPnBhcmVudF9yZWdpc3RlcikpOwpAQCAtNDY5LDcgKzQ4OCw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIHVzZV9sb2NrICAgICAgICAgICAgLSBNdXRleCBodyBhY2Nlc3MKICAqICAgICAgICAgICAgICByZWdpc3Rlcl9pZCAgICAgICAgIC0gcmVnaXN0ZXJfaUQgKyBPZmZzZXQKLSAqICAgICAgICAgICAgICByZXR1cm5fdmFsdWUgICAgICAgIC0gVmFsdWUgdGhhdCB3YXMgcmVhZCBmcm9tIHRoZSByZWdpc3RlcgorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBXaGVyZSB0aGUgcmVnaXN0ZXIgdmFsdWUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzIGFuZCB0aGUgdmFsdWUgcmVhZC4KICAqCkBAIC01NTcsNyArNTc2LDggQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gUmVnaXN0ZXIgSUQ6ICVYXG4iLCByZWdpc3Rlcl9pZCkpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gUmVnaXN0ZXIgSUQ6ICVYXG4iLAorCQkJcmVnaXN0ZXJfaWQpKTsKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAkJYnJlYWs7CiAJfQpAQCAtNzYzLDEwICs3ODMsMTEgQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIlJlYWQ6ICAlOC44WCB3aWR0aCAlMmQgZnJvbSAlOC44WCU4LjhYICglcylcbiIsCi0JCQkqdmFsdWUsIHdpZHRoLAotCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKLQkJCWFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lIChyZWctPmFkZHJlc3Nfc3BhY2VfaWQpKSk7CisJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU8sCisJCSJSZWFkOiAgJTguOFggd2lkdGggJTJkIGZyb20gJTguOFglOC44WCAoJXMpXG4iLAorCQkqdmFsdWUsIHdpZHRoLAorCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAorCQlhY3BpX3V0X2dldF9yZWdpb25fbmFtZSAocmVnLT5hZGRyZXNzX3NwYWNlX2lkKSkpOwogCiAJcmV0dXJuIChzdGF0dXMpOwogfQpAQCAtODQxLDEwICs4NjIsMTEgQEAKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywgIldyb3RlOiAlOC44WCB3aWR0aCAlMmQgICB0byAlOC44WCU4LjhYICglcylcbiIsCi0JCQl2YWx1ZSwgd2lkdGgsCi0JCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MpLAotCQkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTywKKwkJIldyb3RlOiAlOC44WCB3aWR0aCAlMmQgICB0byAlOC44WCU4LjhYICglcylcbiIsCisJCXZhbHVlLCB3aWR0aCwKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzKSwKKwkJYWNwaV91dF9nZXRfcmVnaW9uX25hbWUgKHJlZy0+YWRkcmVzc19zcGFjZV9pZCkpKTsKIAogCXJldHVybiAoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCmluZGV4IDc3YjNlOWEuLjQxNWQzNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwpAQCAtNDMsMjcgKzQzLDEzIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJod3NsZWVwIikKIAogCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19CRlMgICAgICAgICJcXF9CRlMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19HVFMgICAgICAgICJcXF9HVFMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19QVFMgICAgICAgICJcXF9QVFMiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19TU1QgICAgICAgICJcXF9TSS5fU1NUIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fV0FLICAgICAgICAiXFxfV0FLIgotCi0jZGVmaW5lIEFDUElfU1NUX0lORElDQVRPUl9PRkYgIDAKLSNkZWZpbmUgQUNQSV9TU1RfV09SS0lORyAgICAgICAgMQotI2RlZmluZSBBQ1BJX1NTVF9XQUtJTkcgICAgICAgICAyCi0jZGVmaW5lIEFDUElfU1NUX1NMRUVQSU5HICAgICAgIDMKLSNkZWZpbmUgQUNQSV9TU1RfU0xFRVBfQ09OVEVYVCAgNAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IKICAqCkBAIC03Miw3ICs1OCw3IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBhY2Nlc3MgZnVuY3Rpb24gZm9yIGRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCisgKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtOTksMTkgKzg1LDIwIEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcgogICoKLSAqIFBBUkFNRVRFUlM6ICAqcGh5c2ljYWxfYWRkcmVzcyAgIC0gT3V0cHV0IGJ1ZmZlciB3aGVyZSBjb250ZW50cyBvZgorICogUEFSQU1FVEVSUzogICpwaHlzaWNhbF9hZGRyZXNzICAgLSBXaGVyZSB0aGUgY29udGVudHMgb2YKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcm13YXJlX3dha2luZ192ZWN0b3IgZmllbGQgb2YKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZBQ1Mgd2lsbCBiZSBzdG9yZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGQUNTIHdpbGwgYmUgcmV0dXJuZWQuCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIFN0YXR1cywgdmVjdG9yCiAgKgotICogREVTQ1JJUFRJT046IEFjY2VzcyBmdW5jdGlvbiBmb3IgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCisgKiBERVNDUklQVElPTjogQWNjZXNzIGZ1bmN0aW9uIGZvciB0aGUgZmlybXdhcmVfd2FraW5nX3ZlY3RvciBmaWVsZCBpbiBGQUNTCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciAoCkBAIC0xNDEsNyArMTI4LDcgQEAKICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcAogICoKQEAgLTIxNSw3ICsyMDIsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfSU5ESUNBVE9SX09GRjsgLyogRGVmYXVsdCBpcyBpbmRpY2F0b3Igb2ZmICovCisJCWFyZy5pbnRlZ2VyLnZhbHVlID0gQUNQSV9TU1RfSU5ESUNBVE9SX09GRjsgLyogRGVmYXVsdCBpcyBvZmYgKi8KIAkJYnJlYWs7CiAJfQogCkBAIC0yMjMsMTQgKzIxMCwxNSBAQAogCiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCSBBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJIEFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlCiAgKgpAQCAtMjk5LDE1ICsyODcsMTggQEAKIAogCS8qIEdldCBjdXJyZW50IHZhbHVlIG9mIFBNMUEgY29udHJvbCAqLwogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl9yZWFkIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFfQ09OVFJPTCwgJlBNMUFjb250cm9sKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsICZQTTFBY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lOSVQsICJFbnRlcmluZyBzbGVlcCBzdGF0ZSBbUyVkXVxuIiwgc2xlZXBfc3RhdGUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTklULAorCQkiRW50ZXJpbmcgc2xlZXAgc3RhdGUgW1MlZF1cbiIsIHNsZWVwX3N0YXRlKSk7CiAKIAkvKiBDbGVhciBTTFBfRU4gYW5kIFNMUF9UWVAgZmllbGRzICovCiAKLQlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8IHNsZWVwX2VuYWJsZV9yZWdfaW5mby0+YWNjZXNzX2JpdF9tYXNrKTsKKwlQTTFBY29udHJvbCAmPSB+KHNsZWVwX3R5cGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayB8CisJCQkgICBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CiAJUE0xQmNvbnRyb2wgPSBQTTFBY29udHJvbDsKIAogCS8qIEluc2VydCBTTFBfVFlQIGJpdHMgKi8KQEAgLTMyMiwxMiArMzEzLDE0IEBACiAKIAkvKiBXcml0ZSAjMTogZmlsbCBpbiBTTFBfVFlQIGRhdGEgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwgUE0xQWNvbnRyb2wpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xQV9DT05UUk9MLCBQTTFBY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLCBQTTFCY29udHJvbCk7CisJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssCisJCQkgQUNQSV9SRUdJU1RFUl9QTTFCX0NPTlRST0wsIFBNMUJjb250cm9sKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CkBAIC0zNDEsMjIgKzMzNCwyNSBAQAogCiAJQUNQSV9GTFVTSF9DUFVfQ0FDSEUgKCk7CiAKLQlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywgQUNQSV9SRUdJU1RFUl9QTTFBX0NPTlRST0wsIFBNMUFjb250cm9sKTsKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlIChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwkJCSBBQ1BJX1JFR0lTVEVSX1BNMUFfQ09OVFJPTCwgUE0xQWNvbnRyb2wpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLCBBQ1BJX1JFR0lTVEVSX1BNMUJfQ09OVFJPTCwgUE0xQmNvbnRyb2wpOworCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJIEFDUElfUkVHSVNURVJfUE0xQl9DT05UUk9MLCBQTTFCY29udHJvbCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCiAJaWYgKHNsZWVwX3N0YXRlID4gQUNQSV9TVEFURV9TMykgewogCQkvKgotCQkgKiBXZSB3YW50ZWQgdG8gc2xlZXAgPiBTMywgYnV0IGl0IGRpZG4ndCBoYXBwZW4gKGJ5IHZpcnR1ZSBvZiB0aGUgZmFjdCB0aGF0Ci0JCSAqIHdlIGFyZSBzdGlsbCBleGVjdXRpbmchKQorCQkgKiBXZSB3YW50ZWQgdG8gc2xlZXAgPiBTMywgYnV0IGl0IGRpZG4ndCBoYXBwZW4gKGJ5IHZpcnR1ZSBvZiB0aGUKKwkJICogZmFjdCB0aGF0IHdlIGFyZSBzdGlsbCBleGVjdXRpbmchKQogCQkgKgotCQkgKiBXYWl0IHRlbiBzZWNvbmRzLCB0aGVuIHRyeSBhZ2Fpbi4gVGhpcyBpcyB0byBnZXQgUzQvUzUgdG8gd29yayBvbiBhbGwgbWFjaGluZXMuCisJCSAqIFdhaXQgdGVuIHNlY29uZHMsIHRoZW4gdHJ5IGFnYWluLiBUaGlzIGlzIHRvIGdldCBTNC9TNSB0byB3b3JrIG9uCisJCSAqIGFsbCBtYWNoaW5lcy4KIAkJICoKIAkJICogV2Ugd2FpdCBzbyBsb25nIHRvIGFsbG93IGNoaXBzZXRzIHRoYXQgcG9sbCB0aGlzIHJlZyB2ZXJ5IHNsb3dseSB0bwogCQkgKiBzdGlsbCByZWFkIHRoZSByaWdodCB2YWx1ZS4gSWRlYWxseSwgdGhpcyBibG9jayB3b3VsZCBnbwpAQCAtMzY0LDcgKzM2MCw4IEBACiAJCSAqLwogCQlhY3BpX29zX3N0YWxsICgxMDAwMDAwMCk7CiAKLQkJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZSAoQUNQSV9NVFhfRE9fTk9UX0xPQ0ssIEFDUElfUkVHSVNURVJfUE0xX0NPTlRST0wsCisJCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfd3JpdGUgKEFDUElfTVRYX0RPX05PVF9MT0NLLAorCQkJCSBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAogCQkJCSBzbGVlcF9lbmFibGVfcmVnX2luZm8tPmFjY2Vzc19iaXRfbWFzayk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTM3NCw3ICszNzEsOCBAQAogCS8qIFdhaXQgdW50aWwgd2UgZW50ZXIgc2xlZXAgc3RhdGUgKi8KIAogCWRvIHsKLQkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKKwkJc3RhdHVzID0gYWNwaV9nZXRfcmVnaXN0ZXIgKEFDUElfQklUUkVHX1dBS0VfU1RBVFVTLCAmaW5fdmFsdWUsCisJCQlBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQpAQCAtMzg4LDcgKzM4Niw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGUpOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zCiAgKgpAQCAtNDM5LDExICs0MzcsMTMgQEAKIAogCUFDUElfRkxVU0hfQ1BVX0NBQ0hFICgpOwogCi0Jc3RhdHVzID0gYWNwaV9vc193cml0ZV9wb3J0IChhY3BpX2dibF9GQURULT5zbWlfY21kLCAodTMyKSBhY3BpX2dibF9GQURULT5TNGJpb3NfcmVxLCA4KTsKKwlzdGF0dXMgPSBhY3BpX29zX3dyaXRlX3BvcnQgKGFjcGlfZ2JsX0ZBRFQtPnNtaV9jbWQsCisJCQkgKHUzMikgYWNwaV9nYmxfRkFEVC0+UzRiaW9zX3JlcSwgOCk7CiAKIAlkbyB7CiAJCWFjcGlfb3Nfc3RhbGwoMTAwMCk7Ci0JCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCXN0YXR1cyA9IGFjcGlfZ2V0X3JlZ2lzdGVyIChBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgJmluX3ZhbHVlLAorCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTQ1NCw3ICs0NTQsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZQogICoKQEAgLTUzNCwxOCArNTM0LDIxIEBACiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XQUtJTkc7CiAJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QgKE5VTEwsIE1FVEhPRF9OQU1FX19TU1QsICZhcmdfbGlzdCwgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSAmJiBzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfU1NUIGZhaWxlZCwgJXNcbiIsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJfQogCiAJYXJnLmludGVnZXIudmFsdWUgPSBzbGVlcF9zdGF0ZTsKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX0JGUywgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9CRlMgZmFpbGVkLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfQkZTIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdCAoTlVMTCwgTUVUSE9EX05BTUVfX1dBSywgJmFyZ19saXN0LCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpICYmIHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9XQUsgZmFpbGVkLCAlc1xuIiwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoIk1ldGhvZCBfV0FLIGZhaWxlZCwgJXNcbiIsCisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAl9CiAJLyogVEJEOiBfV0FLICJzb21ldGltZXMiIHJldHVybnMgc3R1ZmYgLSBkbyB3ZSB3YW50IHRvIGxvb2sgYXQgaXQ/ICovCiAKQEAgLTU2NywxNSArNTcwLDE5IEBACiAKIAkvKiBFbmFibGUgcG93ZXIgYnV0dG9uICovCiAKLQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uZW5hYmxlX3JlZ2lzdGVyX2lkLAorCSh2b2lkKSBhY3BpX3NldF9yZWdpc3RlcigKKwkJCWFjcGlfZ2JsX2ZpeGVkX2V2ZW50X2luZm9bQUNQSV9FVkVOVF9QT1dFUl9CVVRUT05dLmVuYWJsZV9yZWdpc3Rlcl9pZCwKIAkJCTEsIEFDUElfTVRYX0RPX05PVF9MT0NLKTsKLQkodm9pZCkgYWNwaV9zZXRfcmVnaXN0ZXIoYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLAorCisJKHZvaWQpIGFjcGlfc2V0X3JlZ2lzdGVyKAorCQkJYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTl0uc3RhdHVzX3JlZ2lzdGVyX2lkLAogCQkJMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCiAJYXJnLmludGVnZXIudmFsdWUgPSBBQ1BJX1NTVF9XT1JLSU5HOwogCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0IChOVUxMLCBNRVRIT0RfTkFNRV9fU1NULCAmYXJnX2xpc3QsIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJNZXRob2QgX1NTVCBmYWlsZWQsICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiTWV0aG9kIF9TU1QgZmFpbGVkLCAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCX0KIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCmluZGV4IDE5MDYxNjcuLjQ5ZDdiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYwpAQCAtNDMsNyArNDMsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9IQVJEV0FSRQpAQCAtOTAsNyArODksNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBUaWNrcyAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRpbWVyIHZhbHVlIGlzIHJldHVybmVkCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgY3VycmVudCB0aWNrcworICogUkVUVVJOOiAgICAgIFN0YXR1cyBhbmQgY3VycmVudCB0aW1lciB2YWx1ZSAodGlja3MpCiAgKgogICogREVTQ1JJUFRJT046IE9idGFpbnMgY3VycmVudCB2YWx1ZSBvZiBBQ1BJIFBNIFRpbWVyIChpbiB0aWNrcykuCiAgKgpAQCAtMTk5LDUgKzE5OCw2IEBACiAJKnRpbWVfZWxhcHNlZCA9ICh1MzIpIHF1b3RpZW50OwogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KKwogRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9kdXJhdGlvbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ob3RrZXkuYyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWJkZjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2hvdGtleS5jCkBAIC0wLDAgKzEsMTAxOSBAQAorLyogCisgKiAgaG90a2V5LmMgLSBBQ1BJIEhvdGtleSBEcml2ZXIgKCRSZXZpc2lvbjokKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgTHVtaW5nIFl1IDxsdW1pbmcueXVAaW50ZWwuY29tPgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBIT1RLRVlfQUNQSV9WRVJTSU9OICIwLjEiCisKKyNkZWZpbmUgSE9US0VZX1BST0MgImhvdGtleSIKKyNkZWZpbmUgSE9US0VZX0VWX0NPTkZJRyAgICAiZXZlbnRfY29uZmlnIgorI2RlZmluZSBIT1RLRVlfUExfQ09ORklHICAgICJwb2xsX2NvbmZpZyIKKyNkZWZpbmUgSE9US0VZX0FDVElPTiAgICJhY3Rpb24iCisjZGVmaW5lIEhPVEtFWV9JTkZPICJpbmZvIgorCisjZGVmaW5lIEFDUElfSE9US19OQU1FICAgICAgICAgICJHZW5lcmljIEhvdGtleSBEcml2ZXIiCisjZGVmaW5lIEFDUElfSE9US19DTEFTUyAgICAgICAgICJIb3RrZXkiCisjZGVmaW5lIEFDUElfSE9US19ERVZJQ0VfTkFNRSAgICJIb3RrZXkiCisjZGVmaW5lIEFDUElfSE9US19ISUQgICAgICAgICAgICJVbmtub3duPyIKKyNkZWZpbmUgQUNQSV9IT1RLRVlfQ09NUE9ORU5UICAgMHgyMDAwMDAwMAorCisjZGVmaW5lIEFDUElfSE9US0VZX0VWRU5UICAgMHgxCisjZGVmaW5lIEFDUElfSE9US0VZX1BPTExJTkcgMHgyCisjZGVmaW5lIEFDUElfVU5ERUZJTkVEX0VWRU5UICAgIDB4ZgorCisjZGVmaW5lIE1BWF9DT05GSUdfUkVDT1JEX0xFTiAgIDgwCisjZGVmaW5lIE1BWF9OQU1FX1BBVEhfTEVOICAgODAKKyNkZWZpbmUgTUFYX0NBTExfUEFSTSAgICAgICA4MAorCisjZGVmaW5lIElTX0VWRU5UKGUpICAgICAgIDB4ZmYJLyogKChlKSAmIDB4NDAwMDAwMDApICAqLworI2RlZmluZSBJU19QT0xMKGUpICAgICAgMHhmZgkvKiAofigoZSkgJiAweDQwMDAwMDAwKSkgICovCisKKyNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9IT1RLRVlfQ09NUE9ORU5UCitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2hvdGtleSIpCisKKyAgICBNT0RVTEVfQVVUSE9SKCJsdW1pbmcueXVAaW50ZWwuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9IT1RLX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiAgc3RhbmRhcmRpemVkIGludGVybmFsIGhvdGtleSBudW1iZXIvZXZlbnQgICovCitlbnVtIHsKKwkvKiBWaWRlbyBFeHRlbnNpb24gZXZlbnQgKi8KKwlIS19FVkVOVF9DWUNMRV9PVVRQVVRfREVWSUNFID0gMHg4MCwKKwlIS19FVkVOVF9PVVRQVVRfREVWSUNFX1NUQVRVU19DSEFOR0UsCisJSEtfRVZFTlRfQ1lDTEVfRElTUExBWV9PVVRQVVQsCisJSEtfRVZFTlRfTkVYVF9ESVNQTEFZX09VVFBVVCwKKwlIS19FVkVOVF9QUkVWSU9VU19ESVNQTEFZX09VVFBVVCwKKwlIS19FVkVOVF9DWUNMRV9CUklHSFRORVNTLAorCUhLX0VWRU5UX0lOQ1JFQVNFX0JSSUdIVE5FU1MsCisJSEtfRVZFTlRfREVDUkVBU0VfQlJJR0hUTkVTUywKKwlIS19FVkVOVF9aRVJPX0JSSUdIVE5FU1MsCisJSEtfRVZFTlRfRElTUExBWV9ERVZJQ0VfT0ZGLAorCisJLyogU25kIENhcmQgZXZlbnQgKi8KKwlIS19FVkVOVF9WT0xVTUVfTVVURSwKKwlIS19FVkVOVF9WT0xVTUVfSU5DTFJFQVNFLAorCUhLX0VWRU5UX1ZPTFVNRV9ERUNSRUFTRSwKKworCS8qIHJ1bm5pbmcgc3RhdGUgY29udHJvbCAqLworCUhLX0VWRU5UX0VOVEVSUklOR19TMywKKwlIS19FVkVOVF9FTlRFUlJJTkdfUzQsCisJSEtfRVZFTlRfRU5URVJSSU5HX1M1LAorfTsKKworLyogIHByb2NkaXIgd2UgdXNlICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfcHJvY19kaXI7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfY29uZmlnOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X3BvbGxfY29uZmlnOworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X2FjdGlvbjsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9pbmZvOworCisvKiBsaW5rYWdlIGZvciBhbGwgdHlwZSBvZiBob3RrZXkgKi8KK3N0cnVjdCBhY3BpX2hvdGtleV9saW5rIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7CisJaW50IGhvdGtleV90eXBlOwkvKiBldmVudCBvciBwb2xsaW5nIGJhc2VkIGhvdGtleSAgKi8KKwlpbnQgaG90a2V5X3N0YW5kYXJkX251bTsJLyogc3RhbmRhcmRpemVkIGhvdGtleShldmVudCkgbnVtYmVyICovCit9OworCisvKiBldmVudCBiYXNlZCBob3RrZXkgKi8KK3N0cnVjdCBhY3BpX2V2ZW50X2hvdGtleSB7CisJc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgaG90a2V5X2xpbms7CisJaW50IGZsYWc7CisJYWNwaV9oYW5kbGUgYnVzX2hhbmRsZTsJLyogYnVzIHRvIGluc3RhbGwgbm90aWZ5IGhhbmRsZXIgKi8KKwlpbnQgZXh0ZXJuYWxfaG90a2V5X251bTsJLyogZXh0ZXJuYWwgaG90a2V5L2V2ZW50IG51bWJlciAqLworCWFjcGlfaGFuZGxlIGFjdGlvbl9oYW5kbGU7CS8qIGFjcGkgaGFuZGxlIGF0dGFjaGVkIGFtbCBhY3Rpb24gbWV0aG9kICovCisJY2hhciAqYWN0aW9uX21ldGhvZDsJLyogYWN0aW9uIG1ldGhvZCAqLworfTsKKworLyogCisgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gcG9sbCBzdGF0dXMKKyAqIDEuIGRpcmVjdHkgY2FsbCByZWFkX3h4eCBtZXRob2QsIHdpdGhvdXQgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4KKyAqIDIuIGNhbGwgd3JpdGVfeHh4IG1ldGhvZCwgd2l0aCBhcmd1bWVudHMgcGFzc2VkIGluLCB5b3UgbmVlZAorICogdGhlIHJlc3VsdCBpcyBzYXZlZCBpbiBhY3BpX3BvbGxpbmdfaG90a2V5LnBvbGxfcmVzdWx0LgorICogYW50aG9lciByZWFkIGNvbW1hbmQgdGhyb3VnaCBwb2xsaW5nIGludGVyZmFjZS4KKyAqCisgKi8KKworLyogcG9sbGluZyBiYXNlZCBob3RrZXkgKi8KK3N0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5IHsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBob3RrZXlfbGluazsKKwlpbnQgZmxhZzsKKwlhY3BpX2hhbmRsZSBwb2xsX2hhbmRsZTsJLyogYWNwaSBoYW5kbGUgYXR0YWNoZWQgcG9sbGluZyBtZXRob2QgKi8KKwljaGFyICpwb2xsX21ldGhvZDsJLyogcG9sbCBtZXRob2QgKi8KKwlhY3BpX2hhbmRsZSBhY3Rpb25faGFuZGxlOwkvKiBhY3BpIGhhbmRsZSBhdHRhY2hlZCBhY3Rpb24gbWV0aG9kICovCisJY2hhciAqYWN0aW9uX21ldGhvZDsJLyogYWN0aW9uIG1ldGhvZCAqLworCXZvaWQgKnBvbGxfcmVzdWx0OwkvKiBwb2xsaW5nX3Jlc3VsdCAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKK307CisKKy8qIGhvdGtleSBvYmplY3QgdW5pb24gKi8KK3VuaW9uIGFjcGlfaG90a2V5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7CisJc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgbGluazsKKwlzdHJ1Y3QgYWNwaV9ldmVudF9ob3RrZXkgZXZlbnRfaG90a2V5OworCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5IHBvbGxfaG90a2V5OworfTsKKworLyogaG90a2V5IG9iamVjdCBsaXN0ICovCitzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllczsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgaW50IGF1dG9faG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CitzdGF0aWMgaW50IGF1dG9faG90a2V5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGhvdGtleV9kcml2ZXIgPSB7CisJLm5hbWUgPSBBQ1BJX0hPVEtfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX0hPVEtfQ0xBU1MsCisJLmlkcyA9IEFDUElfSE9US19ISUQsCisJLm9wcyA9IHsKKwkJLmFkZCA9IGF1dG9faG90a2V5X2FkZCwKKwkJLnJlbW92ZSA9IGF1dG9faG90a2V5X3JlbW92ZSwKKwkJfSwKK307CisKK3N0YXRpYyBpbnQgaG90a2V5X29wZW5fY29uZmlnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9wb2xsX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSk7CitzdGF0aWMgaW50IGhvdGtleV9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBob3RrZXlfYWN0aW9uX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3QgaG90a2V5X2V4ZWN1dGVfYW1sX21ldGhvZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKK3N0YXRpYyBpbnQgaG90a2V5X2NvbmZpZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK3N0YXRpYyBpbnQgaG90a2V5X3BvbGxpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKKy8qIGV2ZW50IGJhc2VkIGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X2NvbmZpZ19mb3BzID0geworCS5vcGVuID0gaG90a2V5X29wZW5fY29uZmlnLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gaG90a2V5X3dyaXRlX2NvbmZpZywKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBwb2xsaW5nIGJhc2VkIGNvbmZpZyAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X3BvbGxfY29uZmlnX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfb3Blbl9jb25maWcsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkud3JpdGUgPSBob3RrZXlfd3JpdGVfcG9sbF9jb25maWcsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogaG90a2V5IGRyaXZlciBpbmZvICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfaW5mb19mb3BzID0geworCS5vcGVuID0gaG90a2V5X2luZm9fb3Blbl9mcywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qIGFjdGlvbiAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X2FjdGlvbl9mb3BzID0geworCS5vcGVuID0gaG90a2V5X2FjdGlvbl9vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLndyaXRlID0gaG90a2V5X2V4ZWN1dGVfYW1sX21ldGhvZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBwb2xsaW5nIHJlc3VsdHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9wb2xsaW5nX2ZvcHMgPSB7CisJLm9wZW4gPSBob3RrZXlfcG9sbGluZ19vcGVuX2ZzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgZ2xvYmFsX2hvdGtleV9saXN0OwkvKiBsaW5rIGFsbCBldiBvciBwbCBob3RrZXkgICovCitzdHJ1Y3QgbGlzdF9oZWFkIGhvdGtleV9lbnRyaWVzOwkvKiBoZWFkIG9mIHRoZSBsaXN0IG9mIGhvdGtleV9saXN0ICovCisKK3N0YXRpYyBpbnQgaG90a2V5X2luZm9fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfaW5mb19zZXFfc2hvdyIpOworCisJc2VxX3ByaW50ZihzZXEsICJIb3RrZXkgZ2VuZXJpYyBkcml2ZXIgdmVyOiAlcyIsIEhPVEtFWV9BQ1BJX1ZFUlNJT04pOworCisJcmV0dXJuX1ZBTFVFKDApOworfQorCitzdGF0aWMgaW50IGhvdGtleV9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKK30KKworc3RhdGljIGNoYXIgKmZvcm1hdF9yZXN1bHQodW5pb24gYWNwaV9vYmplY3QgKm9iamVjdCkKK3sKKwljaGFyICpidWYgPSAoY2hhciAqKWttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpKTsKKworCS8qIE5vdywganVzdCBzdXBwb3J0IGludGVnZXIgdHlwZSAqLworCWlmIChvYmplY3QtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCisJCXNwcmludGYoYnVmLCAiJWQiLCAodTMyKSBvYmplY3QtPmludGVnZXIudmFsdWUpOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGludCBob3RrZXlfcG9sbGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQoreworCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICpwb2xsX2hvdGtleSA9CisJICAgIChzdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSAqKXNlcS0+cHJpdmF0ZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV9wb2xsaW5nX3NlcV9zaG93Iik7CisKKwlpZiAocG9sbF9ob3RrZXktPnBvbGxfcmVzdWx0KQorCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgZm9ybWF0X3Jlc3VsdChwb2xsX2hvdGtleS0+cG9sbF9yZXN1bHQpKTsKKworCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIGludCBob3RrZXlfcG9sbGluZ19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBob3RrZXlfcG9sbGluZ19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgaG90a2V5X2FjdGlvbl9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBob3RrZXlfaW5mb19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKKy8qIE1hcHBpbmcgZXh0ZXJuYWwgaG90a2V5IG51bWJlciB0byBzdGFuZGFyZGl6ZWQgaG90a2V5IGV2ZW50IG51bSAqLworc3RhdGljIGludCBob3RrZXlfZ2V0X2ludGVybmFsX2V2ZW50KGludCBldmVudCwgc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmxpc3QpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisJaW50IHZhbCA9IDA7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfZ2V0X2ludGVybmFsX2V2ZW50Iik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgbGlzdC0+ZW50cmllcykgeworCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KKwkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7CisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQKKwkJICAgICYmIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPT0gZXZlbnQpCisJCQl2YWwgPSBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bTsKKwkJZWxzZQorCQkJdmFsID0gLTE7CisJfQorCisJcmV0dXJuX1ZBTFVFKHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCithY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CisJdTMyIGludGVybmFsX2V2ZW50OworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIiKTsKKworCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSkpCisJCXJldHVybl9WT0lEOworCisJaW50ZXJuYWxfZXZlbnQgPSBob3RrZXlfZ2V0X2ludGVybmFsX2V2ZW50KGV2ZW50LCAmZ2xvYmFsX2hvdGtleV9saXN0KTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXZpY2UsIGV2ZW50LCAwKTsKKworCXJldHVybl9WT0lEOworfQorCisvKiBOZWVkIHRvIGludmVudCBhdXRvbWF0aWNhbGx5IGhvdGtleSBhZGQgbWV0aG9kICovCitzdGF0aWMgaW50IGF1dG9faG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwkvKiBJbXBsZW1lbnQgbWUgKi8KKwlyZXR1cm4gMDsKK30KKworLyogTmVlZCB0byBpbnZlbnQgYXV0b21hdGljYWxseSBob3RrZXkgcmVtb3ZlIG1ldGhvZCAqLworc3RhdGljIGludCBhdXRvX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCS8qIEltcGxlbWVudCBtZSAqLworCXJldHVybiAwOworfQorCisvKiBDcmVhdGUgYSBwcm9jIGZpbGUgZm9yIGVhY2ggcG9sbGluZyBtZXRob2QgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX3BvbGxpbmdfcHJvYyh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKKwltb2RlX3QgbW9kZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImNyZWF0ZV9wb2xsaW5nX3Byb2MiKTsKKwltb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPOworCisJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldmljZS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKworCWlmICghcHJvYykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkhvdGtleTogVW5hYmxlIHRvIGNyZWF0ZSAlcyBlbnRyeVxuIiwKKwkJCQkgIGRldmljZS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCXByb2MtPnByb2NfZm9wcyA9ICZob3RrZXlfcG9sbGluZ19mb3BzOworCQlwcm9jLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlwcm9jLT5kYXRhID0gZGV2aWNlOworCQlwcm9jLT51aWQgPSAwOworCQlwcm9jLT5naWQgPSAwOworCQlkZXZpY2UtPnBvbGxfaG90a2V5LnByb2MgPSBwcm9jOworCX0KKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQgaXNfdmFsaWRfYWNwaV9wYXRoKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXNfdmFsaWRfYWNwaV9wYXRoIik7CisKKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgKGNoYXIgKilwYXRobmFtZSwgJmhhbmRsZSk7CisJcmV0dXJuX1ZBTFVFKCFBQ1BJX0ZBSUxVUkUoc3RhdHVzKSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfdmFsaWRfaG90a2V5KHVuaW9uIGFjcGlfaG90a2V5ICpkZXZpY2UpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXNfdmFsaWRfaG90a2V5Iik7CisJLyogSW1wbGVtZW50IHZhbGlkIGNoZWNrICovCisJcmV0dXJuX1ZBTFVFKDEpOworfQorCitzdGF0aWMgaW50IGhvdGtleV9hZGQodW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IE5VTEw7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfYWRkIik7CisKKwlpZiAoZGV2aWNlLT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UKSB7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX2J1c19nZXRfZGV2aWNlKGRldmljZS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUsICZkZXYpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuX1ZBTFVFKHN0YXR1cyk7CisKKwkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRldi0+aGFuZGxlLAorCQkJCQkJICAgICBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQkJCQkgICAgIGFjcGlfaG90a2V5X25vdGlmeV9oYW5kbGVyLAorCQkJCQkJICAgICBkZXZpY2UpOworCX0gZWxzZQkJCS8qIEFkZCBwb2xsaW5nIGhvdGtleSAqLworCQljcmVhdGVfcG9sbGluZ19wcm9jKGRldmljZSk7CisKKwlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQrKzsKKworCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+bGluay5lbnRyaWVzLCBnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcyk7CisKKwlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKK30KKworc3RhdGljIGludCBob3RrZXlfcmVtb3ZlKHVuaW9uIGFjcGlfaG90a2V5ICpkZXZpY2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfcmVtb3ZlIik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0KKwkJICAgIGRldmljZS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSB7CisJCQlsaXN0X2RlbCgma2V5LT5saW5rLmVudHJpZXMpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLAorCQkJCQkgIGhvdGtleV9wcm9jX2Rpcik7CisJCQlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQtLTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybl9WQUxVRSgwKTsKK30KKworc3RhdGljIHZvaWQgaG90a2V5X3VwZGF0ZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXMsICpuZXh0OworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X3VwZGF0ZSIpOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJpZXMsIG5leHQsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKSB7CisJCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQorCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKKwkJaWYgKGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09CisJCSAgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSkgeworCQkJa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSA9CisJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZTsKKwkJCWtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPQorCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW07CisJCQlrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlID0KKwkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlOworCQkJa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9CisJCQkgICAga2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuX1ZPSUQ7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2OworCWludCBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJmcmVlX2hvdGtleV9kZXZpY2UiKTsKKworCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfYnVzX2dldF9kZXZpY2Uoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSwgJmRldik7CisJCWlmIChkZXYtPmhhbmRsZSkKKwkJCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGRldi0+aGFuZGxlLAorCQkJCQkJICAgQUNQSV9TWVNURU1fTk9USUZZLAorCQkJCQkJICAgYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIpOworCX0gZWxzZQorCQlyZW1vdmVfcHJvY19lbnRyeShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsCisJCQkJICBob3RrZXlfcHJvY19kaXIpOworCWtmcmVlKGtleSk7CisJcmV0dXJuX1ZPSUQ7Cit9CisKK3N0YXRpYyBpbnQKK2luaXRfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LCBjaGFyICpidXNfc3RyLCBjaGFyICphY3Rpb25fc3RyLAorCQkgICBjaGFyICptZXRob2QsIGludCBzdGRfbnVtLCBpbnQgZXh0ZXJuYWxfbnVtKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImluaXRfaG90a2V5X2RldmljZSIpOworCisJa2V5LT5saW5rLmhvdGtleV90eXBlID0gQUNQSV9IT1RLRVlfRVZFTlQ7CisJa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPSBzdGRfbnVtOworCWtleS0+ZXZlbnRfaG90a2V5LmZsYWcgPSAwOworCWlmIChpc192YWxpZF9hY3BpX3BhdGgoYnVzX3N0cikpCisJCWFjcGlfZ2V0X2hhbmRsZSgoYWNwaV9oYW5kbGUpIDAsCisJCQkJYnVzX3N0ciwgJihrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlKSk7CisJZWxzZQorCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CisJa2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9IGV4dGVybmFsX251bTsKKwlpZiAoaXNfdmFsaWRfYWNwaV9wYXRoKGFjdGlvbl9zdHIpKQorCQlhY3BpX2dldF9oYW5kbGUoKGFjcGlfaGFuZGxlKSAwLAorCQkJCWFjdGlvbl9zdHIsICYoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOworCWtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QgPSBrbWFsbG9jKHNpemVvZihtZXRob2QpLCBHRlBfS0VSTkVMKTsKKwlzdHJjcHkoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCwgbWV0aG9kKTsKKworCXJldHVybl9WQUxVRSghaXNfdmFsaWRfaG90a2V5KGtleSkpOworfQorCitzdGF0aWMgaW50Citpbml0X3BvbGxfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LAorCQkJY2hhciAqcG9sbF9zdHIsCisJCQljaGFyICpwb2xsX21ldGhvZCwKKwkJCWNoYXIgKmFjdGlvbl9zdHIsIGNoYXIgKmFjdGlvbl9tZXRob2QsIGludCBzdGRfbnVtKQoreworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImluaXRfcG9sbF9ob3RrZXlfZGV2aWNlIik7CisKKwlrZXktPmxpbmsuaG90a2V5X3R5cGUgPSBBQ1BJX0hPVEtFWV9QT0xMSU5HOworCWtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID0gc3RkX251bTsKKwlrZXktPnBvbGxfaG90a2V5LmZsYWcgPSAwOworCWlmIChpc192YWxpZF9hY3BpX3BhdGgocG9sbF9zdHIpKQorCQlhY3BpX2dldF9oYW5kbGUoKGFjcGlfaGFuZGxlKSAwLAorCQkJCXBvbGxfc3RyLCAmKGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUpKTsKKwllbHNlCisJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKKwlrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kID0gcG9sbF9tZXRob2Q7CisJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChhY3Rpb25fc3RyKSkKKwkJYWNwaV9nZXRfaGFuZGxlKChhY3BpX2hhbmRsZSkgMCwKKwkJCQlhY3Rpb25fc3RyLCAmKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOworCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9CisJICAgIGttYWxsb2Moc2l6ZW9mKGFjdGlvbl9tZXRob2QpLCBHRlBfS0VSTkVMKTsKKwlzdHJjcHkoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLCBhY3Rpb25fbWV0aG9kKTsKKwlrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0ID0KKwkgICAgKHVuaW9uIGFjcGlfb2JqZWN0ICopa21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKKwlyZXR1cm5fVkFMVUUoaXNfdmFsaWRfaG90a2V5KGtleSkpOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hvdGtleV92YWxpZCh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LAorCQkJICAgICAgc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmxpc3QpCit7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiY2hlY2tfaG90a2V5X3ZhbGlkIik7CisJcmV0dXJuX1ZBTFVFKDApOworfQorCitzdGF0aWMgaW50IGhvdGtleV9vcGVuX2NvbmZpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfb3Blbl9jb25maWciKTsKKwlyZXR1cm5fVkFMVUUoc2luZ2xlX29wZW4KKwkJICAgICAoZmlsZSwgaG90a2V5X2NvbmZpZ19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSkpOworfQorCitzdGF0aWMgaW50IGhvdGtleV9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXMsICpuZXh0OworCWNoYXIgYnVzX25hbWVbQUNQSV9QQVRITkFNRV9NQVhdID0geyAwIH07CisJY2hhciBhY3Rpb25fbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVzID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYnVzX25hbWUgfTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYWN0ID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYWN0aW9uX25hbWUgfTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoKCJob3RrZXlfY29uZmlnX3NlcV9zaG93IikpOworCisJaWYgKCFob3RrZXlfbGlzdCkKKwkJZ290byBlbmQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UKSB7CisJCQlhY3BpX2dldF9uYW1lKGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUsCisJCQkJICAgICAgQUNQSV9OQU1FX1RZUEVfTUFYLCAmYnVzKTsKKwkJCWFjcGlfZ2V0X25hbWUoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSwKKwkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZhY3QpOworCQkJc2VxX3ByaW50ZihzZXEsICIlczolczolczolZDolZCIsIGJ1c19uYW1lLAorCQkJCSAgIGFjdGlvbl9uYW1lLAorCQkJCSAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QsCisJCQkJICAga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0sCisJCQkJICAga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSk7CisJCX0gLyogQUNQSV9IT1RLRVlfUE9MTElORyAqLworCQllbHNlIHsKKwkJCWFjcGlfZ2V0X25hbWUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSwKKwkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZidXMpOworCQkJYWNwaV9nZXRfbmFtZShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUsCisJCQkJICAgICAgQUNQSV9OQU1FX1RZUEVfTUFYLCAmYWN0KTsKKwkJCXNlcV9wcmludGYoc2VxLCAiJXM6JXM6JXM6JXM6JWQiLCBidXNfbmFtZSwKKwkJCQkgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kLAorCQkJCSAgIGFjdGlvbl9uYW1lLAorCQkJCSAgIGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKKwkJCQkgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSk7CisJCX0KKwl9CisJc2VxX3B1dHMoc2VxLCAiXG4iKTsKKyAgICAgIGVuZDoKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9wYXJtcyhjaGFyICpjb25maWdfcmVjb3JkLAorCSAgaW50ICpjbWQsCisJICBjaGFyICpidXNfaGFuZGxlLAorCSAgY2hhciAqYnVzX21ldGhvZCwKKwkgIGNoYXIgKmFjdGlvbl9oYW5kbGUsCisJICBjaGFyICptZXRob2QsIGludCAqaW50ZXJuYWxfZXZlbnRfbnVtLCBpbnQgKmV4dGVybmFsX2V2ZW50X251bSkKK3sKKwljaGFyICp0bXAsICp0bXAxOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoKCJnZXRfcGFybXMiKSk7CisKKwlzc2NhbmYoY29uZmlnX3JlY29yZCwgIiVkIiwgY21kKTsKKworCXRtcCA9IHN0cmNocihjb25maWdfcmVjb3JkLCAnOicpOworCXRtcCsrOworCXRtcDEgPSBzdHJjaHIodG1wLCAnOicpOworCXN0cm5jcHkoYnVzX2hhbmRsZSwgdG1wLCB0bXAxIC0gdG1wKTsKKwlidXNfaGFuZGxlW3RtcDEgLSB0bXBdID0gMDsKKworCXRtcCA9IHRtcDE7CisJdG1wKys7CisJdG1wMSA9IHN0cmNocih0bXAsICc6Jyk7CisJc3RybmNweShidXNfbWV0aG9kLCB0bXAsIHRtcDEgLSB0bXApOworCWJ1c19tZXRob2RbdG1wMSAtIHRtcF0gPSAwOworCisJdG1wID0gdG1wMTsKKwl0bXArKzsKKwl0bXAxID0gc3RyY2hyKHRtcCwgJzonKTsKKwlzdHJuY3B5KGFjdGlvbl9oYW5kbGUsIHRtcCwgdG1wMSAtIHRtcCk7CisJYWN0aW9uX2hhbmRsZVt0bXAxIC0gdG1wXSA9IDA7CisKKwl0bXAgPSB0bXAxOworCXRtcCsrOworCXRtcDEgPSBzdHJjaHIodG1wLCAnOicpOworCXN0cm5jcHkobWV0aG9kLCB0bXAsIHRtcDEgLSB0bXApOworCW1ldGhvZFt0bXAxIC0gdG1wXSA9IDA7CisKKwlzc2NhbmYodG1wMSArIDEsICIlZDolZCIsIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtKTsKKwlyZXR1cm5fVkFMVUUoNik7Cit9CisKKy8qICBjb3VudCBpcyBsZW5ndGggZm9yIG9uZSBpbnB1dCByZWNvcmQgKi8KK3N0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQoreworCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJY2hhciBjb25maWdfcmVjb3JkW01BWF9DT05GSUdfUkVDT1JEX0xFTl07CisJY2hhciBidXNfaGFuZGxlW01BWF9OQU1FX1BBVEhfTEVOXTsKKwljaGFyIGJ1c19tZXRob2RbTUFYX05BTUVfUEFUSF9MRU5dOworCWNoYXIgYWN0aW9uX2hhbmRsZVtNQVhfTkFNRV9QQVRIX0xFTl07CisJY2hhciBtZXRob2RbMjBdOworCWludCBjbWQsIGludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtOworCWludCByZXQgPSAwOworCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPSBOVUxMOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgoImhvdGtleV93cml0ZV9jb25maWciKSk7CisKKwlpZiAoIWhvdGtleV9saXN0IHx8IGNvdW50ID4gTUFYX0NPTkZJR19SRUNPUkRfTEVOKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50c1xuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGNvbmZpZ19yZWNvcmQsIGJ1ZmZlciwgY291bnQpKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisJY29uZmlnX3JlY29yZFtjb3VudF0gPSAnXDAnOworCisJcmV0ID0gZ2V0X3Bhcm1zKGNvbmZpZ19yZWNvcmQsCisJCQkmY21kLAorCQkJYnVzX2hhbmRsZSwKKwkJCWJ1c19tZXRob2QsCisJCQlhY3Rpb25faGFuZGxlLAorCQkJbWV0aG9kLCAmaW50ZXJuYWxfZXZlbnRfbnVtLCAmZXh0ZXJuYWxfZXZlbnRfbnVtKTsKKwlpZiAocmV0ICE9IDYpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJJbnZhbGlkIGRhdGEgZm9ybWF0IHJldD0lZFxuIiwgcmV0KSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlrZXkgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSksIEdGUF9LRVJORUwpOworCXJldCA9IGluaXRfaG90a2V5X2RldmljZShrZXksIGJ1c19oYW5kbGUsIGFjdGlvbl9oYW5kbGUsIG1ldGhvZCwKKwkJCQkgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pOworCisJaWYgKHJldCB8fCBjaGVja19ob3RrZXlfdmFsaWQoa2V5LCBob3RrZXlfbGlzdCkpIHsKKwkJa2ZyZWUoa2V5KTsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgaG90a2V5IFxuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSAwOgorCQlob3RrZXlfYWRkKGtleSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaG90a2V5X3JlbW92ZShrZXkpOworCQlmcmVlX2hvdGtleV9kZXZpY2Uoa2V5KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlob3RrZXlfdXBkYXRlKGtleSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm5fVkFMVUUoY291bnQpOworfQorCisvKiAgY291bnQgaXMgbGVuZ3RoIGZvciBvbmUgaW5wdXQgcmVjb3JkICovCitzdGF0aWMgc3NpemVfdCBob3RrZXlfd3JpdGVfcG9sbF9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCit7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPQorCSAgICAoc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKiltLT5wcml2YXRlOworCisJY2hhciBjb25maWdfcmVjb3JkW01BWF9DT05GSUdfUkVDT1JEX0xFTl07CisJY2hhciBwb2xsaW5nX2hhbmRsZVtNQVhfTkFNRV9QQVRIX0xFTl07CisJY2hhciBhY3Rpb25faGFuZGxlW01BWF9OQU1FX1BBVEhfTEVOXTsKKwljaGFyIHBvbGxfbWV0aG9kWzIwXSwgYWN0aW9uX21ldGhvZFsyMF07CisJaW50IHJldCwgaW50ZXJuYWxfZXZlbnRfbnVtLCBjbWQsIGV4dGVybmFsX2V2ZW50X251bTsKKwl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0gTlVMTDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImhvdGtleV93cml0ZV9wb2xsX2NvbmZpZyIpOworCisJaWYgKCFob3RrZXlfbGlzdCB8fCBjb3VudCA+IE1BWF9DT05GSUdfUkVDT1JEX0xFTikgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudHNcbiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihjb25maWdfcmVjb3JkLCBidWZmZXIsIGNvdW50KSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBkYXRhIFxuIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCWNvbmZpZ19yZWNvcmRbY291bnRdID0gJ1wwJzsKKworCXJldCA9IGdldF9wYXJtcyhjb25maWdfcmVjb3JkLAorCQkJJmNtZCwKKwkJCXBvbGxpbmdfaGFuZGxlLAorCQkJcG9sbF9tZXRob2QsCisJCQlhY3Rpb25faGFuZGxlLAorCQkJYWN0aW9uX21ldGhvZCwKKwkJCSZpbnRlcm5hbF9ldmVudF9udW0sICZleHRlcm5hbF9ldmVudF9udW0pOworCisJaWYgKHJldCAhPSA2KSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGRhdGEgZm9ybWF0XG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisKKwlrZXkgPSBrbWFsbG9jKHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSksIEdGUF9LRVJORUwpOworCXJldCA9IGluaXRfcG9sbF9ob3RrZXlfZGV2aWNlKGtleSwgcG9sbGluZ19oYW5kbGUsIHBvbGxfbWV0aG9kLAorCQkJCSAgICAgIGFjdGlvbl9oYW5kbGUsIGFjdGlvbl9tZXRob2QsCisJCQkJICAgICAgaW50ZXJuYWxfZXZlbnRfbnVtKTsKKwlpZiAocmV0IHx8IGNoZWNrX2hvdGtleV92YWxpZChrZXksIGhvdGtleV9saXN0KSkgeworCQlrZnJlZShrZXkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBob3RrZXkgXG4iKSk7CisJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKKwl9CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIDA6CisJCWhvdGtleV9hZGQoa2V5KTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlob3RrZXlfcmVtb3ZlKGtleSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaG90a2V5X3VwZGF0ZShrZXkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuX1ZBTFVFKGNvdW50KTsKK30KKworLyogIAorICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgYW4gQUNQSSBtZXRob2QsIGdpdmVuIGFuIGludCBhcyBwYXJhbWV0ZXIsIHRoZQorICogbWV0aG9kIGlzIHNlYXJjaGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGhhbmRsZSwgY2FuIGJlIE5VTEwuIFRoZSBvdXRwdXQKKyAqIG9mIHRoZSBtZXRob2QgaXMgd3JpdHRlbiBpcyBvdXRwdXQsIHdoaWNoIGNhbiBhbHNvIGJlIE5VTEwKKyAqCisgKiByZXR1cm5zIDEgaWYgd3JpdGUgaXMgc3VjY2Vzc2Z1bCwgMCBlbHNlLgorICovCitzdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAorCQkJICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CS8qIGxpc3Qgb2YgaW5wdXQgcGFyYW1ldGVycyAoYW4gaW50IGhlcmUpICovCisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOwkvKiB0aGUgb25seSBwYXJhbSB3ZSB1c2UgKi8KKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ3cml0ZV9hY3BpX2ludCIpOworCXBhcmFtcy5jb3VudCA9IDE7CisJcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOworCWluX29iai50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJaW5fb2JqLmludGVnZXIudmFsdWUgPSB2YWw7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCAmcGFyYW1zLCBvdXRwdXQpOworCisJcmV0dXJuX1ZBTFVFKHN0YXR1cyA9PSBBRV9PSyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9hY3BpX2ludChhY3BpX2hhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIgKm1ldGhvZCwgaW50ICp2YWwpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJlYWRfYWNwaV9pbnQiKTsKKwlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCBOVUxMLCAmb3V0cHV0KTsKKwkqdmFsID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOworCXJldHVybl9WQUxVRSgoc3RhdHVzID09IEFFX09LKQorCQkgICAgICYmIChvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpKTsKK30KKworc3RhdGljIGFjcGlfaGFuZGxlCitnZXRfaGFuZGxlX2Zyb21faG90a2V5bGlzdChzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QsIGludCBldmVudF9udW0pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UCisJCSAgICAmJiBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9PSBldmVudF9udW0pIHsKKwkJCXJldHVybiAoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSk7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljCitjaGFyICpnZXRfbWV0aG9kX2Zyb21faG90a2V5bGlzdChzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QsCisJCQkJIGludCBldmVudF9udW0pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCisJCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQgJiYKKwkJICAgIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09IGV2ZW50X251bSkKKwkJCXJldHVybiAoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSAqZ2V0X2hvdGtleV9ieV9ldmVudChzdHJ1Y3QKKwkJCQkJCSAgICAgICBhY3BpX2hvdGtleV9saXN0CisJCQkJCQkgICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgaG90a2V5X2xpc3QtPmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX1BPTExJTkcKKwkJICAgICYmIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09IGV2ZW50KSB7CisJCQlyZXR1cm4gKCZrZXktPnBvbGxfaG90a2V5KTsKKwkJfQorCX0KKwlyZXR1cm4gKE5VTEwpOworfQorCisvKiAgCisgKiB1c2VyIGNhbGwgQU1MIG1ldGhvZCBpbnRlcmZhY2U6CisgKiBDYWxsIGNvbnZlbnRpb246CisgKiBlY2hvICJldmVudF9udW06IGFyZyB0eXBlIDogdmFsdWUiCisgKiBleGFtcGxlOiBlY2hvICIxOjE6MzAiID4gL3Byb2MvYWNwaS9hY3Rpb24KKyAqIEp1c3Qgc3VwcG9ydCAxIGludGVnZXIgYXJnIHBhc3NpbmcgdG8gQU1MIG1ldGhvZAorICovCisKK3N0YXRpYyBzc2l6ZV90IGhvdGtleV9leGVjdXRlX2FtbF9tZXRob2Qoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKK3sKKwlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OworCWNoYXIgYXJnW01BWF9DQUxMX1BBUk1dOworCWludCBldmVudCwgdHlwZSwgdmFsdWU7CisKKwljaGFyICptZXRob2Q7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X2V4ZWN0ZV9hbWxfbWV0aG9kIik7CisKKwlpZiAoIWhvdGtleV9saXN0IHx8IGNvdW50ID4gTUFYX0NBTExfUEFSTSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudCAxIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGFyZywgYnVmZmVyLCBjb3VudCkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgYXJndW1lbnQgMiIpKTsKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCX0KKworCWFyZ1tjb3VudF0gPSAnXDAnOworCisJaWYgKHNzY2FuZihhcmcsICIlZDolZDolZCIsICZldmVudCwgJnR5cGUsICZ2YWx1ZSkgIT0gMykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBhcmd1bWVudCAzIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJaWYgKHR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJaGFuZGxlID0gZ2V0X2hhbmRsZV9mcm9tX2hvdGtleWxpc3QoaG90a2V5X2xpc3QsIGV2ZW50KTsKKwkJbWV0aG9kID0gKGNoYXIgKilnZXRfbWV0aG9kX2Zyb21faG90a2V5bGlzdChob3RrZXlfbGlzdCwgZXZlbnQpOworCQlpZiAoSVNfRVZFTlQoZXZlbnQpKQorCQkJd3JpdGVfYWNwaV9pbnQoaGFuZGxlLCBtZXRob2QsIHZhbHVlLCBOVUxMKTsKKwkJZWxzZSBpZiAoSVNfUE9MTChldmVudCkpIHsKKwkJCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICprZXk7CisJCQlrZXkgPSAoc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgKikKKwkJCSAgICBnZXRfaG90a2V5X2J5X2V2ZW50KGhvdGtleV9saXN0LCBldmVudCk7CisJCQlyZWFkX2FjcGlfaW50KGhhbmRsZSwgbWV0aG9kLCBrZXktPnBvbGxfcmVzdWx0KTsKKwkJfQorCX0gZWxzZSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJOb3Qgc3VwcG9ydGVkIikpOworCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuX1ZBTFVFKGNvdW50KTsKK30KKworc3RhdGljIGludCBfX2luaXQgaG90a2V5X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaG90a2V5X2luaXQiKTsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKSB7CisJCXByaW50aygiVXNpbmcgc3BlY2lmaWMgaG90a2V5IGRyaXZlclxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWhvdGtleV9wcm9jX2RpciA9IHByb2NfbWtkaXIoSE9US0VZX1BST0MsIGFjcGlfcm9vdF9kaXIpOworCWlmICghaG90a2V5X3Byb2NfZGlyKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX1BST0MpKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9CisJaG90a2V5X3Byb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJaG90a2V5X2NvbmZpZyA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CisJaWYgKCFob3RrZXlfY29uZmlnKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX0VWX0NPTkZJRykpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCWhvdGtleV9jb25maWctPnByb2NfZm9wcyA9ICZob3RrZXlfY29uZmlnX2ZvcHM7CisJCWhvdGtleV9jb25maWctPmRhdGEgPSAmZ2xvYmFsX2hvdGtleV9saXN0OworCQlob3RrZXlfY29uZmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlob3RrZXlfY29uZmlnLT51aWQgPSAwOworCQlob3RrZXlfY29uZmlnLT5naWQgPSAwOworCX0KKworCWhvdGtleV9wb2xsX2NvbmZpZyA9CisJICAgIGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9QTF9DT05GSUcsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CisJaWYgKCFob3RrZXlfcG9sbF9jb25maWcpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwKKwkJCQkgICJIb3RrZXk6IFVuYWJsZSB0byBjcmVhdGUgJXMgZW50cnlcbiIsCisJCQkJICBIT1RLRVlfRVZfQ09ORklHKSk7CisJCXJldHVybiAoLUVOT0RFVik7CisJfSBlbHNlIHsKKwkJaG90a2V5X3BvbGxfY29uZmlnLT5wcm9jX2ZvcHMgPSAmaG90a2V5X3BvbGxfY29uZmlnX2ZvcHM7CisJCWhvdGtleV9wb2xsX2NvbmZpZy0+ZGF0YSA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7CisJCWhvdGtleV9wb2xsX2NvbmZpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkJaG90a2V5X3BvbGxfY29uZmlnLT51aWQgPSAwOworCQlob3RrZXlfcG9sbF9jb25maWctPmdpZCA9IDA7CisJfQorCisJaG90a2V5X2FjdGlvbiA9IGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9BQ1RJT04sIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7CisJaWYgKCFob3RrZXlfYWN0aW9uKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX0FDVElPTikpOworCQlyZXR1cm4gKC1FTk9ERVYpOworCX0gZWxzZSB7CisJCWhvdGtleV9hY3Rpb24tPnByb2NfZm9wcyA9ICZob3RrZXlfYWN0aW9uX2ZvcHM7CisJCWhvdGtleV9hY3Rpb24tPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWhvdGtleV9hY3Rpb24tPnVpZCA9IDA7CisJCWhvdGtleV9hY3Rpb24tPmdpZCA9IDA7CisJfQorCisJaG90a2V5X2luZm8gPSBjcmVhdGVfcHJvY19lbnRyeShIT1RLRVlfSU5GTywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKKwlpZiAoIWhvdGtleV9pbmZvKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCisJCQkJICAiSG90a2V5OiBVbmFibGUgdG8gY3JlYXRlICVzIGVudHJ5XG4iLAorCQkJCSAgSE9US0VZX0lORk8pKTsKKwkJcmV0dXJuICgtRU5PREVWKTsKKwl9IGVsc2UgeworCQlob3RrZXlfaW5mby0+cHJvY19mb3BzID0gJmhvdGtleV9pbmZvX2ZvcHM7CisJCWhvdGtleV9pbmZvLT5vd25lciA9IFRISVNfTU9EVUxFOworCQlob3RrZXlfaW5mby0+dWlkID0gMDsKKwkJaG90a2V5X2luZm8tPmdpZCA9IDA7CisJfQorCisJcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZob3RrZXlfZHJpdmVyKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfUFJPQywgYWNwaV9yb290X2Rpcik7CisJCXJldHVybiAoLUVOT0RFVik7CisJfQorCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudCA9IDA7CisJZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMgPSAmaG90a2V5X2VudHJpZXM7CisKKwlJTklUX0xJU1RfSEVBRCgmaG90a2V5X2VudHJpZXMpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhvdGtleV9leGl0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cmllcywgKm5leHQ7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJob3RrZXlfcmVtb3ZlIik7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKKwkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9CisJCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOworCisJCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7CisJCWxpc3RfZGVsKCZrZXktPmxpbmsuZW50cmllcyk7CisJCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudC0tOworCQlmcmVlX2hvdGtleV9kZXZpY2Uoa2V5KTsKKwl9CisJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmhvdGtleV9kcml2ZXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BMX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfQUNUSU9OLCBob3RrZXlfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9JTkZPLCBob3RrZXlfcHJvY19kaXIpOworCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGhvdGtleV9pbml0KTsKK21vZHVsZV9leGl0KGhvdGtleV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKaW5kZXggMGZiNzMxYS4uYWQ4NWUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKQEAgLTEwMjUsNyArMTAyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGV2aWNlX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgaWJtYWNwaV9kZXZpY2VfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCXJldHVybiAwOwogfQpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKIAltZW1zZXQoaWJtLT5kcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWNwaV9kcml2ZXIpKTsKIAlzcHJpbnRmKGlibS0+ZHJpdmVyLT5uYW1lLCAiJXMvJXMiLCBJQk1fTkFNRSwgaWJtLT5uYW1lKTsKIAlpYm0tPmRyaXZlci0+aWRzID0gaWJtLT5oaWQ7Ci0JaWJtLT5kcml2ZXItPm9wcy5hZGQgPSAmZGV2aWNlX2FkZDsKKwlpYm0tPmRyaXZlci0+b3BzLmFkZCA9ICZpYm1hY3BpX2RldmljZV9hZGQ7CiAKIAlyZXQgPSBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoaWJtLT5kcml2ZXIpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xMTg1LDYgKzExODUsMTAgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpeworCQlwcmludGsoSUJNX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CQorCX0KIAkvKiB0aGVzZSBoYW5kbGVzIGFyZSByZXF1aXJlZCAqLwogCWlmIChJQk1fSEFORExFX0lOSVQoZWMsCSAgMSkgPCAwIHx8CiAJICAgIElCTV9IQU5ETEVfSU5JVChoa2V5LCAxKSA8IDAgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYwppbmRleCAxYzBjMTIzLi5lY2U3YTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCkBAIC02Nyw3ICs2Nyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19yb290X2luaXRpYWxpemUgKHZvaWQpCithY3BpX25zX3Jvb3RfaW5pdGlhbGl6ZSAoCisJdm9pZCkKIHsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAJY29uc3Qgc3RydWN0IGFjcGlfcHJlZGVmaW5lZF9uYW1lcyAqaW5pdF92YWwgPSBOVUxMOwpAQCAtMjY1LDcgKzI2Niw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9va3VwCiAgKgotICogUEFSQU1FVEVSUzogIHByZWZpeF9ub2RlICAgICAtIFNlYXJjaCBzY29wZSBpZiBuYW1lIGlzIG5vdCBmdWxseSBxdWFsaWZpZWQKKyAqIFBBUkFNRVRFUlM6ICBzY29wZV9pbmZvICAgICAgLSBDdXJyZW50IHNjb3BlIGluZm8gYmxvY2sKICAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgLSBTZWFyY2ggcGF0aG5hbWUsIGluIGludGVybmFsIGZvcm1hdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcyByZXByZXNlbnRlZCBpbiB0aGUgQU1MIHN0cmVhbSkKICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBUeXBlIGFzc29jaWF0ZWQgd2l0aCBuYW1lCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCmluZGV4IGJmZDkyMmMuLjU2NTNhMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhbGxvYy5jCkBAIC00OSwxNCArNDksMjAgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNhbGxvYyIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfbnNfcmVtb3ZlX3JlZmVyZW5jZSAoCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19jcmVhdGVfbm9kZQogICoKLSAqIFBBUkFNRVRFUlM6ICBhY3BpX25hbWUgICAgICAgLSBOYW1lIG9mIHRoZSBuZXcgbm9kZQorICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIE5hbWUgb2YgdGhlIG5ldyBub2RlICg0IGNoYXIgQUNQSSBuYW1lKQogICoKLSAqIFJFVFVSTjogICAgICBOb25lCisgKiBSRVRVUk46ICAgICAgTmV3IG5hbWVzcGFjZSBub2RlIChOdWxsIG9uIGZhaWx1cmUpCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5hbWVzcGFjZSBub2RlCiAgKgpAQCAtMTQ1LDcgKzE1MSw2IEBACiAJCX0KIAl9CiAKLQogCUFDUElfTUVNX1RSQUNLSU5HIChhY3BpX2dibF9tZW1vcnlfbGlzdHNbQUNQSV9NRU1fTElTVF9OU05PREVdLnRvdGFsX2ZyZWVkKyspOwogCiAJLyoKQEAgLTE1Nyw1NyArMTYyLDYgQEAKIH0KIAogCi0jaWZkZWYgQUNQSV9BTFBIQUJFVElDX05BTUVTUEFDRQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19jb21wYXJlX25hbWVzCi0gKgotICogUEFSQU1FVEVSUzogIE5hbWUxICAgICAgICAgICAtIEZpcnN0IG5hbWUgdG8gY29tcGFyZQotICogICAgICAgICAgICAgIE5hbWUyICAgICAgICAgICAtIFNlY29uZCBuYW1lIHRvIGNvbXBhcmUKLSAqCi0gKiBSRVRVUk46ICAgICAgdmFsdWUgZnJvbSBzdHJuY21wCi0gKgotICogREVTQ1JJUFRJT046IENvbXBhcmUgdHdvIEFDUEkgbmFtZXMuICBOYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIGFuCi0gKiAgICAgICAgICAgICAgdW5kZXJzY29yZSBhcmUgZm9yY2VkIHRvIGJlIGFscGhhYmV0aWNhbGx5IGZpcnN0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludAotYWNwaV9uc19jb21wYXJlX25hbWVzICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lMikKLXsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUxW0FDUElfTkFNRV9TSVpFXTsKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkX25hbWUyW0FDUElfTkFNRV9TSVpFXTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqOwotCi0KLQkvKgotCSAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAidW5kZXJzY29yZSIgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciBzbwotCSAqIHRoYXQgYWxsIG5hbWVzIHRoYXQgYXJlIHByZWZpeGVkIHdpdGggdW5kZXJzY29yZShzKSBhcmUgYWxwaGFiZXRpY2FsbHkKLQkgKiBmaXJzdC4KLQkgKgotCSAqIFJldmVyc2UgdGhlIG5hbWUgYnl0ZXdpc2Ugc28gd2UgY2FuIGp1c3QgZG8gYSAzMi1iaXQgY29tcGFyZSBpbnN0ZWFkCi0JICogb2YgYSBzdHJuY21wLgotCSAqLwotCWZvciAoaSA9IDAsIGo9IChBQ1BJX05BTUVfU0laRSAtIDEpOyBpIDwgQUNQSV9OQU1FX1NJWkU7IGkrKywgai0tKSB7Ci0JCXJldmVyc2VkX25hbWUxW2pdID0gbmFtZTFbaV07Ci0JCWlmIChuYW1lMVtpXSA9PSAnXycpIHsKLQkJCXJldmVyc2VkX25hbWUxW2pdID0gJyonOwotCQl9Ci0KLQkJcmV2ZXJzZWRfbmFtZTJbal0gPSBuYW1lMltpXTsKLQkJaWYgKG5hbWUyW2ldID09ICdfJykgewotCQkJcmV2ZXJzZWRfbmFtZTJbal0gPSAnKic7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKCooaW50ICopIHJldmVyc2VkX25hbWUxIC0gKihpbnQgKikgcmV2ZXJzZWRfbmFtZTIpOwotfQotI2VuZGlmCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbnN0YWxsX25vZGUKQEAgLTI3MSw3ICsyMjUsOCBAQAogCQkgKiBhbHBoYWJldGljIHBsYWNlbWVudC4KIAkJICovCiAJCXByZXZpb3VzX2NoaWxkX25vZGUgPSBOVUxMOwotCQl3aGlsZSAoYWNwaV9uc19jb21wYXJlX25hbWVzIChhY3BpX3V0X2dldF9ub2RlX25hbWUgKGNoaWxkX25vZGUpLCBhY3BpX3V0X2dldF9ub2RlX25hbWUgKG5vZGUpKSA8IDApIHsKKwkJd2hpbGUgKGFjcGlfbnNfY29tcGFyZV9uYW1lcyAoYWNwaV91dF9nZXRfbm9kZV9uYW1lIChjaGlsZF9ub2RlKSwKKwkJCQkgYWNwaV91dF9nZXRfbm9kZV9uYW1lIChub2RlKSkgPCAwKSB7CiAJCQlpZiAoY2hpbGRfbm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CiAJCQkJLyogTGFzdCBwZWVyOyAgQ2xlYXIgZW5kLW9mLWxpc3QgZmxhZyAqLwogCkBAIC00MjksNyArMzg0LDggQEAKIAkJLyogVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIHJlZmVyZW5jZSByZW1haW5pbmcgb24gdGhpcyBub2RlICovCiAKIAkJaWYgKGNoaWxkX25vZGUtPnJlZmVyZW5jZV9jb3VudCAhPSAxKSB7Ci0JCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoIkV4aXN0aW5nIHJlZmVyZW5jZXMgKCVkKSBvbiBub2RlIGJlaW5nIGRlbGV0ZWQgKCVwKVxuIiwKKwkJCUFDUElfUkVQT1JUX1dBUk5JTkcgKCgKKwkJCQkiRXhpc3RpbmcgcmVmZXJlbmNlcyAoJWQpIG9uIG5vZGUgYmVpbmcgZGVsZXRlZCAoJXApXG4iLAogCQkJCWNoaWxkX25vZGUtPnJlZmVyZW5jZV9jb3VudCwgY2hpbGRfbm9kZSkpOwogCQl9CiAKQEAgLTU0OCw3ICs1MDQsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpCiB7CkBAIC02ODMsMyArNjM5LDU0IEBACiB9CiAKIAorI2lmZGVmIEFDUElfQUxQSEFCRVRJQ19OQU1FU1BBQ0UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfY29tcGFyZV9uYW1lcworICoKKyAqIFBBUkFNRVRFUlM6ICBOYW1lMSAgICAgICAgICAgLSBGaXJzdCBuYW1lIHRvIGNvbXBhcmUKKyAqICAgICAgICAgICAgICBOYW1lMiAgICAgICAgICAgLSBTZWNvbmQgbmFtZSB0byBjb21wYXJlCisgKgorICogUkVUVVJOOiAgICAgIHZhbHVlIGZyb20gc3RybmNtcAorICoKKyAqIERFU0NSSVBUSU9OOiBDb21wYXJlIHR3byBBQ1BJIG5hbWVzLiAgTmFtZXMgdGhhdCBhcmUgcHJlZml4ZWQgd2l0aCBhbgorICogICAgICAgICAgICAgIHVuZGVyc2NvcmUgYXJlIGZvcmNlZCB0byBiZSBhbHBoYWJldGljYWxseSBmaXJzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQKK2FjcGlfbnNfY29tcGFyZV9uYW1lcyAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTEsCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZTIpCit7CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZF9uYW1lMVtBQ1BJX05BTUVfU0laRV07CisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnNlZF9uYW1lMltBQ1BJX05BTUVfU0laRV07CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgajsKKworCisJLyoKKwkgKiBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgInVuZGVyc2NvcmUiIHdpdGggYSB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIgc28KKwkgKiB0aGF0IGFsbCBuYW1lcyB0aGF0IGFyZSBwcmVmaXhlZCB3aXRoIHVuZGVyc2NvcmUocykgYXJlIGFscGhhYmV0aWNhbGx5CisJICogZmlyc3QuCisJICoKKwkgKiBSZXZlcnNlIHRoZSBuYW1lIGJ5dGV3aXNlIHNvIHdlIGNhbiBqdXN0IGRvIGEgMzItYml0IGNvbXBhcmUgaW5zdGVhZAorCSAqIG9mIGEgc3RybmNtcC4KKwkgKi8KKwlmb3IgKGkgPSAwLCBqPSAoQUNQSV9OQU1FX1NJWkUgLSAxKTsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyssIGotLSkgeworCQlyZXZlcnNlZF9uYW1lMVtqXSA9IG5hbWUxW2ldOworCQlpZiAobmFtZTFbaV0gPT0gJ18nKSB7CisJCQlyZXZlcnNlZF9uYW1lMVtqXSA9ICcqJzsKKwkJfQorCisJCXJldmVyc2VkX25hbWUyW2pdID0gbmFtZTJbaV07CisJCWlmIChuYW1lMltpXSA9PSAnXycpIHsKKwkJCXJldmVyc2VkX25hbWUyW2pdID0gJyonOworCQl9CisJfQorCisJcmV0dXJuICgqKGludCAqKSByZXZlcnNlZF9uYW1lMSAtICooaW50ICopIHJldmVyc2VkX25hbWUyKTsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCmluZGV4IDFmNmFmM2UuLjZjMmFlZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYwpAQCAtNTAsMTYgKzUwLDMyIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZHVtcCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCit2b2lkCithY3BpX25zX2R1bXBfcm9vdF9kZXZpY2VzICgKKwl2b2lkKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2R1bXBfb25lX2RldmljZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKyNlbmRpZgorCiAKICNpZiBkZWZpbmVkKEFDUElfREVCVUdfT1VUUFVUKSB8fCBkZWZpbmVkKEFDUElfREVCVUdHRVIpCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfcHJpbnRfcGF0aG5hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgbnVtX3NlZ21lbnQgICAgICAgICAtIE51bWJlciBvZiBBQ1BJIG5hbWUgc2VnbWVudHMKKyAqIFBBUkFNRVRFUlM6ICBudW1fc2VnbWVudHMgICAgICAgIC0gTnVtYmVyIG9mIEFDUEkgbmFtZSBzZWdtZW50cwogICogICAgICAgICAgICAgIFBhdGhuYW1lICAgICAgICAgICAgLSBUaGUgY29tcHJlc3NlZCAoaW50ZXJuYWwpIHBhdGgKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBvYmplY3QncyBmdWxsIG5hbWVzcGFjZSBwYXRobmFtZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMDMsNiArMTE5LDggQEAKICAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gRGVzaXJlZCBkZWJ1ZyBsZXZlbAogICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKICAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKICAqIERFU0NSSVBUSU9OOiBQcmludCBhbiBvYmplY3QncyBmdWxsIG5hbWVzcGFjZSBwYXRobmFtZQogICogICAgICAgICAgICAgIE1hbmFnZXMgYWxsb2NhdGlvbi9mcmVlaW5nIG9mIGEgcGF0aG5hbWUgYnVmZmVyCiAgKgpAQCAtMTM3LDkgKzE1NSwxMiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb25lX29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKKyAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKICAqICAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgICAgIC0gTmVzdGluZyBsZXZlbCBvZiB0aGUgaGFuZGxlCiAgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgICAgICAtIFBhc3NlZCBpbnRvIHdhbGtfbmFtZXNwYWNlCisgKiAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlICAgICAgICAtIE5vdCB1c2VkCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBEdW1wIGEgc2luZ2xlIE5vZGUKICAqICAgICAgICAgICAgICBUaGlzIHByb2NlZHVyZSBpcyBhIHVzZXJfZnVuY3Rpb24gY2FsbGVkIGJ5IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UuCkBAIC0zOTQsOCArNDE1LDcgQEAKIAkJCXJldHVybiAoQUVfT0spOwogCQl9CiAKLQkJYWNwaV9vc19wcmludGYgKCIoUiVkKSIsCi0JCQkJb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOworCQlhY3BpX29zX3ByaW50ZiAoIihSJWQpIiwgb2JqX2Rlc2MtPmNvbW1vbi5yZWZlcmVuY2VfY291bnQpOwogCiAJCXN3aXRjaCAodHlwZSkgewogCQljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CkBAIC01NTEsMTggKzU3MSwyMCBAQAogCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb2JqZWN0cwogICoKICAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gYmUgZHVtcGVkCisgKiAgICAgICAgICAgICAgZGlzcGxheV90eXBlICAgICAgICAtIDAgb3IgQUNQSV9ESVNQTEFZX1NVTU1BUlkKICAqICAgICAgICAgICAgICBtYXhfZGVwdGggICAgICAgICAgIC0gTWF4aW11bSBkZXB0aCBvZiBkdW1wLiBVc2UgQUNQSV9VSU5UMzJfTUFYCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBlZmZlY3RpdmVseSB1bmxpbWl0ZWQgZGVwdGguCiAgKiAgICAgICAgICAgICAgb3duZXJfaWQgICAgICAgICAgICAtIER1bXAgb25seSBvYmplY3RzIG93bmVkIGJ5IHRoaXMgSUQuICBVc2UKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNQSV9VSU5UMzJfTUFYIHRvIG1hdGNoIGFsbCBvd25lcnMuCiAgKiAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlICAgICAgICAtIFdoZXJlIGluIG5hbWVzcGFjZSB0byBzdGFydC9lbmQgc2VhcmNoCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogRHVtcCB0eXBlZCBvYmplY3RzIHdpdGhpbiB0aGUgbG9hZGVkIG5hbWVzcGFjZS4KICAqICAgICAgICAgICAgICBVc2VzIGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UgaW4gY29uanVuY3Rpb24gd2l0aCBhY3BpX25zX2R1bXBfb25lX29iamVjdC4KICAqCkBAIC01OTAsMTAgKzYxMiw0NCBAQAogCQkJIEFDUElfTlNfV0FMS19OT19VTkxPQ0ssIGFjcGlfbnNfZHVtcF9vbmVfb2JqZWN0LAogCQkJICh2b2lkICopICZpbmZvLCBOVUxMKTsKIH0KKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZHVtcF9lbnRyeQorICoKKyAqIFBBUkFNRVRFUlM6ICBIYW5kbGUgICAgICAgICAgICAgIC0gTm9kZSB0byBiZSBkdW1wZWQKKyAqICAgICAgICAgICAgICBkZWJ1Z19sZXZlbCAgICAgICAgIC0gT3V0cHV0IGxldmVsCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCisgKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorYWNwaV9uc19kdW1wX2VudHJ5ICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2xldmVsKQoreworCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgaW5mbzsKKworCisJQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKKworCisJaW5mby5kZWJ1Z19sZXZlbCA9IGRlYnVnX2xldmVsOworCWluZm8ub3duZXJfaWQgPSBBQ1BJX1VJTlQzMl9NQVg7CisJaW5mby5kaXNwbGF5X3R5cGUgPSBBQ1BJX0RJU1BMQVlfU1VNTUFSWTsKKworCSh2b2lkKSBhY3BpX25zX2R1bXBfb25lX29iamVjdCAoaGFuZGxlLCAxLCAmaW5mbywgTlVMTCk7Cit9CisKKworI2lmZGVmIF9BQ1BJX0FTTF9DT01QSUxFUgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX3RhYmxlcwogICoKICAqIFBBUkFNRVRFUlM6ICBzZWFyY2hfYmFzZSAgICAgICAgIC0gUm9vdCBvZiBzdWJ0cmVlIHRvIGJlIGR1bXBlZCwgb3IKQEAgLTYwMSw2ICs2NTcsOCBAQAogICogICAgICAgICAgICAgIG1heF9kZXB0aCAgICAgICAgICAgLSBNYXhpbXVtIGRlcHRoIG9mIGR1bXAuICBVc2UgSU5UX01BWAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gZWZmZWN0aXZlbHkgdW5saW1pdGVkIGRlcHRoLgogICoKKyAqIFJFVFVSTjogICAgICBOb25lCisgKgogICogREVTQ1JJUFRJT046IER1bXAgdGhlIG5hbWUgc3BhY2UsIG9yIGEgcG9ydGlvbiBvZiBpdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjI2LDcgKzY4NCw3IEBACiAJfQogCiAJaWYgKEFDUElfTlNfQUxMID09IHNlYXJjaF9iYXNlKSB7Ci0JCS8qICBlbnRpcmUgbmFtZXNwYWNlICAgICovCisJCS8qIEVudGlyZSBuYW1lc3BhY2UgKi8KIAogCQlzZWFyY2hfaGFuZGxlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9UQUJMRVMsICJcXFxuIikpOwpAQCAtNjM2LDM4ICs2OTQsNSBAQAogCQkJQUNQSV9VSU5UMzJfTUFYLCBzZWFyY2hfaGFuZGxlKTsKIAlyZXR1cm5fVk9JRDsKIH0KLQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19kdW1wX2VudHJ5Ci0gKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBOb2RlIHRvIGJlIGR1bXBlZAotICogICAgICAgICAgICAgIGRlYnVnX2xldmVsICAgICAgICAgLSBPdXRwdXQgbGV2ZWwKLSAqCi0gKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZAotYWNwaV9uc19kdW1wX2VudHJ5ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2xldmVsKQotewotCXN0cnVjdCBhY3BpX3dhbGtfaW5mbyAgICAgICAgICAgaW5mbzsKLQotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JaW5mby5kZWJ1Z19sZXZlbCA9IGRlYnVnX2xldmVsOwotCWluZm8ub3duZXJfaWQgPSBBQ1BJX1VJTlQzMl9NQVg7Ci0JaW5mby5kaXNwbGF5X3R5cGUgPSBBQ1BJX0RJU1BMQVlfU1VNTUFSWTsKLQotCSh2b2lkKSBhY3BpX25zX2R1bXBfb25lX29iamVjdCAoaGFuZGxlLCAxLCAmaW5mbywgTlVMTCk7Ci19Ci0KLSNlbmRpZgotCisjZW5kaWYJLyogX0FDUElfQVNMX0NPTVBJTEVSICovCisjZW5kaWYJLyogZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCmluZGV4IGQzMGE1OWUuLjI3YzRmN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKQEAgLTQzLDE1ICs0MywxOCBAQAogCiAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KLSNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKIAorLyogVEJEOiBUaGlzIGVudGlyZSBtb2R1bGUgaXMgYXBwYXJlbnRseSBvYnNvbGV0ZSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgKi8KKwogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2R1bXBkdiIpCiAKLQorI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogCisjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2R1bXBfb25lX2RldmljZQpAQCAtNTksMTMgKzYyLDE2IEBACiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE5vZGUgdG8gYmUgZHVtcGVkCiAgKiAgICAgICAgICAgICAgTGV2ZWwgICAgICAgICAgICAgICAtIE5lc3RpbmcgbGV2ZWwgb2YgdGhlIGhhbmRsZQogICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgaW50byB3YWxrX25hbWVzcGFjZQorICogICAgICAgICAgICAgIHJldHVybl92YWx1ZSAgICAgICAgLSBOb3QgdXNlZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogRHVtcCBhIHNpbmdsZSBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIGRldmljZQogICogICAgICAgICAgICAgIFRoaXMgcHJvY2VkdXJlIGlzIGEgdXNlcl9mdW5jdGlvbiBjYWxsZWQgYnkgYWNwaV9uc193YWxrX25hbWVzcGFjZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2R1bXBfb25lX2RldmljZSAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCkBAIC0xMDgsMTIgKzExNCwxNSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgorICogUkVUVVJOOiAgICAgIE5vbmUKKyAqCiAgKiBERVNDUklQVElPTjogRHVtcCBhbGwgb2JqZWN0cyBvZiB0eXBlICJkZXZpY2UiCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAotYWNwaV9uc19kdW1wX3Jvb3RfZGV2aWNlcyAodm9pZCkKK2FjcGlfbnNfZHVtcF9yb290X2RldmljZXMgKAorCXZvaWQpCiB7CiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzeXNfYnVzX2hhbmRsZTsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKQEAgLTE0Miw1ICsxNTEsNiBAQAogfQogCiAjZW5kaWYKKyNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCmluZGV4IDBkMDA4ZDUuLjFhZTg5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYwpAQCAtNTIsMTkgKzUyLDMzIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zZXZhbCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKAorCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfZ2V0X29iamVjdF92YWx1ZSAoCisJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgICAgIC0gTmFtZSBvZiBtZXRob2QgdG8gZXhlY3V0ZSwgSWYgTlVMTCwgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBpcyB0aGUgb2JqZWN0IHRvIGV4ZWN1dGUKLSAqICAgICAgICAgICAgICBJbmZvICAgICAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sKKyAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBOYW1lIG9mIG1ldGhvZCB0byBleGVjdXRlLCBJZiBOVUxMLCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgaXMgdGhlIG9iamVjdCB0byBleGVjdXRlCisgKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiAgSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIFBhcmFtcyAgICAgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCB1c2luZyB0aGUgaGFuZGxlIGFzIGEKLSAqICAgICAgICAgICAgICBzY29wZQorICogREVTQ1JJUFRJT046IEV2YWx1YXRlIHRoZSBvYmplY3Qgb3IgZmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZAogICoKICAqIE1VVEVYOiAgICAgICBMb2NrcyBOYW1lc3BhY2UKICAqCkBAIC0xNTcsOCArMTcxLDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lCiAgKgotICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAgICAgLSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgdG8gdGhlIG9iamVjdAotICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBDb250YWluczoKKyAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBGdWxseSBxdWFsaWZpZWQgcGF0aG5hbWUgdG8gdGhlIG9iamVjdAorICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAgICAgLSBNZXRob2QgaW5mbyBibG9jaywgY29udGFpbnM6CiAgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqICAgICAgICAgICAgICAgICAgUGFyYW1zICAgICAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZCwKQEAgLTE2Nyw4ICsxODEsOCBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogRmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCBwYXNzaW5nIHRoZSBnaXZlbgotICogICAgICAgICAgICAgIHBhcmFtZXRlcnMKKyAqIERFU0NSSVBUSU9OOiBFdmFsdWF0ZSB0aGUgb2JqZWN0IG9yIHJpbmQgYW5kIGV4ZWN1dGUgdGhlIHJlcXVlc3RlZCBtZXRob2QKKyAqICAgICAgICAgICAgICBwYXNzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCiAgKgogICogTVVURVg6ICAgICAgIExvY2tzIE5hbWVzcGFjZQogICoKQEAgLTI0MSwxNyArMjU1LDIxIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBNZXRob2QgTm9kZSB0byBleGVjdXRlCi0gKiAgICAgICAgICAgICAgUGFyYW1zICAgICAgICAgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgLSBNZXRob2QvT2JqZWN0IE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgIHBhcmFtX3R5cGUgICAgICAgICAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0Ci0gKiAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgICAgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuICBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKKyAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHBhc3NpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMKKyAqIERFU0NSSVBUSU9OOiBFdmFsdWF0ZSBvYmplY3Qgb3IgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCBwYXNzaW5nIHRoZQorICogICAgICAgICAgICAgIGdpdmVuIHBhcmFtZXRlcnMKICAqCiAgKiBNVVRFWDogICAgICAgTG9ja3MgTmFtZXNwYWNlCiAgKgpAQCAtMzQ1LDcgKzM2MywxNiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QKICAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHcvcGFyYW1zKQorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3R5cGUgIC0gVHlwZSBvZiBQYXJhbWV0ZXIgbGlzdAorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzU1LDcgKzM4Miw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kICgKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQogewpAQCAtNDE0LDcgKzQ0MSwxMCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUKICAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2sgKHcvcGFyYW1zKQorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gT2JqZWN0J3MgTlMgbm9kZQorICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgb2JqZWN0IHZhbHVlIChpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDI0LDcgKzQ1NCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlICgKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKaW5kZXggNGE0NmIzOC4uMzYyODAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCkBAIC01MCw2ICs1MCwyMiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc2luaXQiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19pbml0X29uZV9vYmplY3QgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19pbml0X29uZV9kZXZpY2UgKAorCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE5MSw3ICsyMDcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfaW5pdF9vbmVfb2JqZWN0ICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKQEAgLTMzMSw3ICszNDcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLApAQCAtMzc0LDcgKzM5MCw4IEBACiAJLyoKIAkgKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHJ1biBfSU5JIG9uIHRoZSBkZXZpY2UuCiAJICovCi0JQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX01FVEhPRCwgcGluZm8ubm9kZSwgIl9TVEEiKSk7CisJQUNQSV9ERUJVR19FWEVDIChhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSAoQUNQSV9UWVBFX01FVEhPRCwKKwkJCSAgIHBpbmZvLm5vZGUsIE1FVEhPRF9OQU1FX19TVEEpKTsKIAlzdGF0dXMgPSBhY3BpX3V0X2V4ZWN1dGVfU1RBIChwaW5mby5ub2RlLCAmZmxhZ3MpOwogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtMzk5LDggKzQxNiw5IEBACiAJLyoKIAkgKiBUaGUgZGV2aWNlIGlzIHByZXNlbnQuIFJ1biBfSU5JLgogCSAqLwotCUFDUElfREVCVUdfRVhFQyAoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUgKEFDUElfVFlQRV9NRVRIT0QsIHBpbmZvLm5vZGUsICJfSU5JIikpOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKCJfSU5JIiwgJnBpbmZvKTsKKwlBQ1BJX0RFQlVHX0VYRUMgKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lIChBQ1BJX1RZUEVfTUVUSE9ELAorCQkJICAgcGluZm8ubm9kZSwgTUVUSE9EX05BTUVfX0lOSSkpOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKE1FVEhPRF9OQU1FX19JTkksICZwaW5mbyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkvKiBObyBfSU5JIChBRV9OT1RfRk9VTkQpIG1lYW5zIGRldmljZSByZXF1aXJlcyBubyBpbml0aWFsaXphdGlvbiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYwppbmRleCAxZDdhZWRmLi4zNGU0OTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKQEAgLTUwLDkgKzUwLDI0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zbG9hZCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCisJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKTsKKworI2lmZGVmIEFDUElfRlVUVVJFX0lNUExFTUVOVEFUSU9OCithY3BpX3N0YXR1cworYWNwaV9uc191bmxvYWRfbmFtZXNwYWNlICgKKwlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19kZWxldGVfc3VidHJlZSAoCisJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUpOworI2VuZGlmCisKIAogI2lmbmRlZiBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19sb2FkX3RhYmxlCkBAIC0xNTksNyArMTc0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZSAoCiAJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlKQogewpAQCAtMzIxLDggKzMzNiw3IEBACiB9CiAKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KKyNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfc3VidHJlZQpAQCAtMzM5LDcgKzM1Myw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9uc19kZWxldGVfc3VidHJlZSAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzdGFydF9oYW5kbGUpCiB7CkBAIC00NTMsOCArNDY3LDYgQEAKIAogCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIH0KLQotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KKyNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKaW5kZXggYjZmOGY5MS4uZDhjZTdlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc25hbWVzLmMKQEAgLTUwLDYgKzUwLDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9OQU1FU1BBQ0UKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoIm5zbmFtZXMiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyB2b2lkCithY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGggKAorCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWVfYnVmZmVyKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY2LDcgKzc0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKQEAgLTEyNiw3ICsxMzQsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBOUyBub2RlIHdob3NlIHBhdGhuYW1lIGlzIG5lZWRlZAorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlIHdob3NlIHBhdGhuYW1lIGlzIG5lZWRlZAogICoKICAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHN0b3JhZ2UgY29udGFpbmluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YKICAqICAgICAgICAgICAgICB0aGUgbm9kZSwgSW4gZXh0ZXJuYWwgZm9ybWF0IChuYW1lIHNlZ21lbnRzIHNlcGFyYXRlZCBieSBwYXRoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKaW5kZXggNGU0MWU2Ni4uMjcyNThjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYwpAQCAtNjAsNiArNjAsOCBAQAogICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBUeXBlIG9mIG9iamVjdCwgb3IgQUNQSV9UWVBFX0FOWSBpZiBub3QKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vd24KICAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgogICogREVTQ1JJUFRJT046IFJlY29yZCB0aGUgZ2l2ZW4gb2JqZWN0IGFzIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCiAgKiAgICAgICAgICAgICAgbmFtZSB3aG9zZSBhY3BpX2hhbmRsZSBpcyBwYXNzZWQuICBJZiBPYmplY3QgaXMgTlVMTAogICogICAgICAgICAgICAgIGFuZCBUeXBlIGlzIEFDUElfVFlQRV9BTlksIHNldCB0aGUgbmFtZSBhcyBoYXZpbmcgbm8gdmFsdWUuCkBAIC05Nyw3ICs5OSw4IEBACiAJaWYgKCFvYmplY3QgJiYgKEFDUElfVFlQRV9BTlkgIT0gdHlwZSkpIHsKIAkJLyogTnVsbCBvYmplY3QgKi8KIAotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG9iamVjdCwgYnV0IHR5cGUgbm90IEFDUElfVFlQRV9BTllcbiIpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJuc19hdHRhY2hfb2JqZWN0OiBOdWxsIG9iamVjdCwgYnV0IHR5cGUgbm90IEFDUElfVFlQRV9BTllcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKQEAgLTExMiw3ICsxMTUsOCBAQAogCS8qIENoZWNrIGlmIHRoaXMgb2JqZWN0IGlzIGFscmVhZHkgYXR0YWNoZWQgKi8KIAogCWlmIChub2RlLT5vYmplY3QgPT0gb2JqZWN0KSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJPYmogJXAgYWxyZWFkeSBpbnN0YWxsZWQgaW4gbmFtZV9vYmogJXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiT2JqICVwIGFscmVhZHkgaW5zdGFsbGVkIGluIG5hbWVfb2JqICVwXG4iLAogCQkJb2JqZWN0LCBub2RlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CkBAIC0xOTIsNyArMTk2LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZXRhY2hfb2JqZWN0CiAgKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgIC0gQW4gbm9kZSB3aG9zZSBvYmplY3Qgd2lsbCBiZSBkZXRhY2hlZAorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgIC0gQSBOYW1lc3BhY2Ugbm9kZSB3aG9zZSBvYmplY3Qgd2lsbCBiZSBkZXRhY2hlZAogICoKICAqIFJFVFVSTjogICAgICBOb25lLgogICoKQEAgLTI0OCw3ICsyNTIsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIEN1cnJlbnQgdmFsdWUgb2YgdGhlIG9iamVjdCBmaWVsZCBmcm9tIHRoZSBOb2RlIHdob3NlCiAgKiAgICAgICAgICAgICAgaGFuZGxlIGlzIHBhc3NlZApAQCAtMjg0LDcgKzI4OCw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIFBhcmVudCBOb2RlIHRvIGJlIGV4YW1pbmVkCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAtIE5hbWVzcGFjZSBub2RlCiAgKgogICogUkVUVVJOOiAgICAgIEN1cnJlbnQgdmFsdWUgb2YgdGhlIG9iamVjdCBmaWVsZCBmcm9tIHRoZSBOb2RlIHdob3NlCiAgKiAgICAgICAgICAgICAgaGFuZGxlIGlzIHBhc3NlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYwppbmRleCAwZTZkZWEyLi5hZjhhYWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCkBAIC00OSwxNSArNDksMjQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgibnNzZWFyY2giKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19zZWFyY2hfcGFyZW50X3RyZWUgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X25hbWUsCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKKwlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnJldHVybl9ub2RlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3NlYXJjaF9ub2RlCiAgKgotICogUEFSQU1FVEVSUzogICp0YXJnZXRfbmFtZSAgICAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgICpOb2RlICAgICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCi0gKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCi0gKiAgICAgICAgICAgICAgKipyZXR1cm5fbm9kZSAgICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5hbWVkIG9iaiBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIHRhcmdldF9uYW1lICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCisgKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgcmV0dXJuX25vZGUgICAgIC0gV2hlcmUgdGhlIG1hdGNoZWQgTmFtZWQgb2JqIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTE2MywxMCArMTcyLDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfc2VhcmNoX3BhcmVudF90cmVlCiAgKgotICogUEFSQU1FVEVSUzogICp0YXJnZXRfbmFtZSAgICAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgotICogICAgICAgICAgICAgICpOb2RlICAgICAgICAgICAgICAgLSBTdGFydGluZyBub2RlIHdoZXJlIHNlYXJjaCB3aWxsIGJlZ2luCi0gKiAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIG1hdGNoCi0gKiAgICAgICAgICAgICAgKipyZXR1cm5fbm9kZSAgICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5vZGUgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICB0YXJnZXRfbmFtZSAgICAgLSBBc2NpaSBBQ1BJIG5hbWUgdG8gc2VhcmNoIGZvcgorICogICAgICAgICAgICAgIE5vZGUgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KKyAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBtYXRjaAorICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5vZGUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjU3LDEyICsyNjYsMTIgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgdGFyZ2V0X25hbWUgICAgICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yICg0IGNoYXJzKQogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlIG9mIHRoZSB3YWxrCi0gKiAgICAgICAgICAgICAgKk5vZGUgICAgICAgICAgICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KKyAqICAgICAgICAgICAgICBOb2RlICAgICAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgogICogICAgICAgICAgICAgIGludGVycHJldGVyX21vZGUgICAgLSBBZGQgbmFtZXMgb25seSBpbiBBQ1BJX01PREVfTE9BRF9QQVNTX3guCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSxzZWFyY2ggb25seS4KICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgIC0gT2JqZWN0IHR5cGUgdG8gbWF0Y2gKICAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gRmxhZ3MgZGVzY3JpYmluZyB0aGUgc2VhcmNoIHJlc3RyaWN0aW9ucwotICogICAgICAgICAgICAgICoqcmV0dXJuX25vZGUgICAgICAgLSBXaGVyZSB0aGUgTm9kZSBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAgICAgLSBXaGVyZSB0aGUgTm9kZSBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCmluZGV4IDc1ZGE3NmMuLmM1M2I4MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCkBAIC01MSw2ICs1MSwxOCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJuc3V0aWxzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTgKK2FjcGlfbnNfdmFsaWRfcGF0aF9zZXBhcmF0b3IgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwKTsKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCithY3BpX25hbWUKK2FjcGlfbnNfZmluZF9wYXJlbnRfbmFtZSAoCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZV90b19zZWFyY2gpOworI2VuZGlmCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01OSw3ICs3MSw4IEBACiAgKiBQQVJBTUVURVJTOiAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQotICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfbmFtZSAgICAgICAtIE5hbWUgb3IgcGF0aCBvZiB0aGUgbmFtZXNwYWNlIG5vZGUKKyAqICAgICAgICAgICAgICBsb29rdXBfc3RhdHVzICAgICAgIC0gRXhjZXB0aW9uIGNvZGUgZnJvbSBOUyBsb29rdXAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTEyMSw2ICsxMzQsOSBAQAogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAgICAgLSBFcnJvciBtZXNzYWdlIHRvIHVzZSBvbiBmYWlsdXJlCisgKiAgICAgICAgICAgICAgcHJlZml4X25vZGUgICAgICAgICAtIFByZWZpeCByZWxhdGl2ZSB0byB0aGUgcGF0aAorICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgLSBQYXRoIHRvIHRoZSBub2RlCisgKiAgICAgICAgICAgICAgbWV0aG9kX3N0YXR1cyAgICAgICAtIEV4ZWN1dGlvbiBzdGF0dXMKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTE2MSw4ICsxNzcsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ByaW50X25vZGVfcGF0aG5hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgICAgICAtIE9iamVjdAotICogICAgICAgICAgICAgIE1zZyAgICAgICAgICAgICAgICAgLSBQcmVmaXggbWVzc2FnZQorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIE9iamVjdAorICogICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgICAtIFByZWZpeCBtZXNzYWdlCiAgKgogICogREVTQ1JJUFRJT046IFByaW50IGFuIG9iamVjdCdzIGZ1bGwgbmFtZXNwYWNlIHBhdGhuYW1lCiAgKiAgICAgICAgICAgICAgTWFuYWdlcyBhbGxvY2F0aW9uL2ZyZWVpbmcgb2YgYSBwYXRobmFtZSBidWZmZXIKQEAgLTE3Miw3ICsxODgsNyBAQAogdm9pZAogYWNwaV9uc19wcmludF9ub2RlX3BhdGhuYW1lICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1zZykKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgYnVmZmVyOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwpAQCAtMTg5LDggKzIwNSw4IEBACiAKIAlzdGF0dXMgPSBhY3BpX25zX2hhbmRsZV90b19wYXRobmFtZSAobm9kZSwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewotCQlpZiAobXNnKSB7Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiVzICIsIG1zZyk7CisJCWlmIChtZXNzYWdlKSB7CisJCQlhY3BpX29zX3ByaW50ZiAoIiVzICIsIG1lc3NhZ2UpOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCJbJXNdIChOb2RlICVwKSIsIChjaGFyICopIGJ1ZmZlci5wb2ludGVyLCBub2RlKTsKQEAgLTIyNCw3ICsyNDAsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yCiAgKgotICogUEFSQU1FVEVSUzogIFNlcCAgICAgICAgICAgICAgLSBDaGFyYWN0ZXIgdG8gYmUgY2hlY2tlZAorICogUEFSQU1FVEVSUzogIFNlcCAgICAgICAgIC0gQ2hhcmFjdGVyIHRvIGJlIGNoZWNrZWQKICAqCiAgKiBSRVRVUk46ICAgICAgVFJVRSBpZiBhIHZhbGlkIHBhdGggc2VwYXJhdG9yCiAgKgpAQCAtMjMyLDcgKzI0OCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTgKK3N0YXRpYyB1OAogYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXApCiB7CkBAIC0yNDUsMTAgKzI2MSwxMiBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF90eXBlCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAgICAgLSBQYXJlbnQgTm9kZSB0byBiZSBleGFtaW5lZAorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgIC0gUGFyZW50IE5vZGUgdG8gYmUgZXhhbWluZWQKICAqCiAgKiBSRVRVUk46ICAgICAgVHlwZSBmaWVsZCBmcm9tIE5vZGUgd2hvc2UgaGFuZGxlIGlzIHBhc3NlZAogICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm4gdGhlIHR5cGUgb2YgYSBOYW1lc3BhY2Ugbm9kZQorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfb2JqZWN0X3R5cGUKQEAgLTI3MSwxMSArMjg5LDEzIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfbG9jYWwKICAqCi0gKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgIC0gQSBuYW1lc3BhY2Ugb2JqZWN0IHR5cGUKKyAqIFBBUkFNRVRFUlM6ICBUeXBlICAgICAgICAtIEEgbmFtZXNwYWNlIG9iamVjdCB0eXBlCiAgKgogICogUkVUVVJOOiAgICAgIExPQ0FMIGlmIG5hbWVzIG11c3QgYmUgZm91bmQgbG9jYWxseSBpbiBvYmplY3RzIG9mIHRoZQogICogICAgICAgICAgICAgIHBhc3NlZCB0eXBlLCAwIGlmIGVuY2xvc2luZyBzY29wZXMgc2hvdWxkIGJlIHNlYXJjaGVkCiAgKgorICogREVTQ1JJUFRJT046IFJldHVybnMgc2NvcGUgcnVsZSBmb3IgdGhlIGdpdmVuIG9iamVjdCB0eXBlLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHUzMgpAQCAtMzAzLDcgKzMyMyw3IEBACiAgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gSW5mbyBzdHJ1Y3QgaW5pdGlhbGl6ZWQgd2l0aCB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBuYW1lIHBvaW50ZXIuCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGludGVybmFsIChBTUwpIG5hbWVzdHJpbmcKICAqICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHRlcm5hbCAoQVNMKSBuYW1lc3RyaW5nLgpAQCAtNTUxLDE0ICs1NzEsMTYgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19leHRlcm5hbGl6ZV9uYW1lCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9uYW1lICAgICAgICAgLSBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBuYW1lCi0gKiAgICAgICAgICAgICAgKipjb252ZXJ0ZWRfbmFtZSAgICAgICAtIFdoZXJlIHRvIHJldHVybiB0aGUgcmVzdWx0aW5nCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9uYW1lX2xlbmd0aCAtIExlbnRoIG9mIHRoZSBpbnRlcm5hbCBuYW1lIGJlbG93CisgKiAgICAgICAgICAgICAgaW50ZXJuYWxfbmFtZSAgICAgICAtIEludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIG5hbWUKKyAqICAgICAgICAgICAgICBjb252ZXJ0ZWRfbmFtZV9sZW5ndGggLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgY29udmVydGVkX25hbWUgICAgICAtIFdoZXJlIHRoZSByZXN1bHRpbmcgZXh0ZXJuYWwgbmFtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBpbnRlcm5hbCBuYW1lIChlLmcuIDVjIDJmIDAyIDVmIDUwIDUyIDVmIDQzIDUwIDU1IDMwKQotICogICAgICAgICAgICAgIHRvIGl0cyBleHRlcm5hbCBmb3JtIChlLmcuICJcX1BSXy5DUFUwIikKKyAqICAgICAgICAgICAgICB0byBpdHMgZXh0ZXJuYWwgKHByaW50YWJsZSkgZm9ybSAoZS5nLiAiXF9QUl8uQ1BVMCIpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNzE3LDggKzczOSw5IEBACiAgKgogICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBuYW1lc3BhY2UgaGFuZGxlIHRvIGEgcmVhbCBOb2RlCiAgKgotICogTm90ZTogUmVhbCBpbnRlZ2VyIGhhbmRsZXMgYWxsb3cgZm9yIG1vcmUgdmVyaWZpY2F0aW9uCi0gKiAgICAgICBhbmQga2VlcCBhbGwgcG9pbnRlcnMgd2l0aGluIHRoaXMgc3Vic3lzdGVtLgorICogTm90ZTogUmVhbCBpbnRlZ2VyIGhhbmRsZXMgd291bGQgYWxsb3cgZm9yIG1vcmUgdmVyaWZpY2F0aW9uCisgKiAgICAgICBhbmQga2VlcCBhbGwgcG9pbnRlcnMgd2l0aGluIHRoaXMgc3Vic3lzdGVtIC0gaG93ZXZlciB0aGlzIGludHJvZHVjZXMKKyAqICAgICAgIG1vcmUgKGFuZCBwZXJoYXBzIHVubmVjZXNzYXJ5KSBvdmVyaGVhZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC03NzUsNyArNzk4LDcgQEAKIAlyZXR1cm4gKChhY3BpX2hhbmRsZSkgbm9kZSk7CiAKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiBFeGFtcGxlIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogCWlmICghTm9kZSkKIAl7CkBAIC04MDEsMTIgKzgyNCwxMyBAQAogICoKICAqIFJFVFVSTjogICAgICBub25lCiAgKgotICogREVTQ1JJUFRJT046IGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGFibGUgc3RvcmFnZS4KKyAqIERFU0NSSVBUSU9OOiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG5hbWVzcGFjZSBhbmQgQUNQSSB0YWJsZSBzdG9yYWdlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfbnNfdGVybWluYXRlICh2b2lkKQorYWNwaV9uc190ZXJtaW5hdGUgKAorCXZvaWQpCiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2M7CiAKQEAgLTk0MCw3ICs5NjQsNiBAQAogCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CiAKIGNsZWFudXA6Ci0JLyogQ2xlYW51cCAqLwogCWlmIChpbnRlcm5hbF9wYXRoKSB7CiAJCUFDUElfTUVNX0ZSRUUgKGludGVybmFsX3BhdGgpOwogCX0KQEAgLTk1MCw2ICs5NzMsNzQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfcGFyZW50X25vZGUKKyAqCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKKyAqCisgKiBSRVRVUk46ICAgICAgUGFyZW50IGVudHJ5IG9mIHRoZSBnaXZlbiBlbnRyeQorICoKKyAqIERFU0NSSVBUSU9OOiBPYnRhaW4gdGhlIHBhcmVudCBlbnRyeSBmb3IgYSBnaXZlbiBlbnRyeSBpbiB0aGUgbmFtZXNwYWNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKK2FjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQoreworCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisKKworCWlmICghbm9kZSkgeworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogV2FsayB0byB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LiBUaGUgbGFzdCBlbnRyeSBpcyBtYXJrZWQgd2l0aCBhIGZsYWcKKwkgKiBhbmQgdGhlIHBlZXIgcG9pbnRlciBpcyByZWFsbHkgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHBhcmVudC4gVGhpcyBzYXZlcworCSAqIHB1dHRpbmcgYSBwYXJlbnQgYmFjayBwb2ludGVyIGluIGVhY2ggYW5kIGV2ZXJ5IG5hbWVkIG9iamVjdCEKKwkgKi8KKwl3aGlsZSAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7CisJCW5vZGUgPSBub2RlLT5wZWVyOworCX0KKworCXJldHVybiAobm9kZS0+cGVlcik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlCisgKgorICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgLSBDdXJyZW50IHRhYmxlIGVudHJ5CisgKgorICogUkVUVVJOOiAgICAgIE5leHQgdmFsaWQgTm9kZSBpbiB0aGUgbGlua2VkIG5vZGUgbGlzdC4gTlVMTCBpZiBubyBtb3JlIHZhbGlkCisgKiAgICAgICAgICAgICAgbm9kZXMuCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgdGhlIG5leHQgdmFsaWQgbm9kZSB3aXRoaW4gYSBuYW1lIHRhYmxlLgorICogICAgICAgICAgICAgIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIE5VTEwtZW5kLW9mLWxpc3QgbG9vcHMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKgorYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlICgKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQoreworCisJLyogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhpcyBwZWVyIGxpc3QsIHJldHVybiBOVUxMICovCisKKwlpZiAobm9kZS0+ZmxhZ3MgJiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE90aGVyd2lzZSBqdXN0IHJldHVybiB0aGUgbmV4dCBwZWVyICovCisKKwlyZXR1cm4gKG5vZGUtPnBlZXIpOworfQorCisKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19maW5kX3BhcmVudF9uYW1lCiAgKgogICogUEFSQU1FVEVSUzogICpjaGlsZF9ub2RlICAgICAgICAgICAgLSBOYW1lZCBPYmogd2hvc2UgbmFtZSBpcyB0byBiZSBmb3VuZApAQCAtOTYxLDcgKzEwNTIsNyBAQAogICogICAgICAgICAgICAgICh3aGljaCAic2hvdWxkIG5vdCBoYXBwZW4iKS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisKIGFjcGlfbmFtZQogYWNwaV9uc19maW5kX3BhcmVudF9uYW1lICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjaGlsZF9ub2RlKQpAQCAtOTk3LDczICsxMDg4LDMgQEAKICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlCi0gKgotICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgLSBDdXJyZW50IHRhYmxlIGVudHJ5Ci0gKgotICogUkVUVVJOOiAgICAgIFBhcmVudCBlbnRyeSBvZiB0aGUgZ2l2ZW4gZW50cnkKLSAqCi0gKiBERVNDUklQVElPTjogT2J0YWluIHRoZSBwYXJlbnQgZW50cnkgZm9yIGEgZ2l2ZW4gZW50cnkgaW4gdGhlIG5hbWVzcGFjZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKQotewotCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7Ci0KLQotCWlmICghbm9kZSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qCi0JICogV2FsayB0byB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LiBUaGUgbGFzdCBlbnRyeSBpcyBtYXJrZWQgd2l0aCBhIGZsYWcKLQkgKiBhbmQgdGhlIHBlZXIgcG9pbnRlciBpcyByZWFsbHkgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHBhcmVudC4gVGhpcyBzYXZlcwotCSAqIHB1dHRpbmcgYSBwYXJlbnQgYmFjayBwb2ludGVyIGluIGVhY2ggYW5kIGV2ZXJ5IG5hbWVkIG9iamVjdCEKLQkgKi8KLQl3aGlsZSAoIShub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpKSB7Ci0JCW5vZGUgPSBub2RlLT5wZWVyOwotCX0KLQotCi0JcmV0dXJuIChub2RlLT5wZWVyKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2dldF9uZXh0X3ZhbGlkX25vZGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAtIEN1cnJlbnQgdGFibGUgZW50cnkKLSAqCi0gKiBSRVRVUk46ICAgICAgTmV4dCB2YWxpZCBOb2RlIGluIHRoZSBsaW5rZWQgbm9kZSBsaXN0LiBOVUxMIGlmIG5vIG1vcmUgdmFsaWQKLSAqICAgICAgICAgICAgICBub2Rlcy4KLSAqCi0gKiBERVNDUklQVElPTjogRmluZCB0aGUgbmV4dCB2YWxpZCBub2RlIHdpdGhpbiBhIG5hbWUgdGFibGUuCi0gKiAgICAgICAgICAgICAgVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgTlVMTC1lbmQtb2YtbGlzdCBsb29wcy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoKLWFjcGlfbnNfZ2V0X25leHRfdmFsaWRfbm9kZSAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSkKLXsKLQotCS8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoaXMgcGVlciBsaXN0LCByZXR1cm4gTlVMTCAqLwotCi0JaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBPdGhlcndpc2UganVzdCByZXR1cm4gdGhlIG5leHQgcGVlciAqLwotCi0JcmV0dXJuIChub2RlLT5wZWVyKTsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwppbmRleCA0ZGUyNDQ0Li5mOWE3Mjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIFR5cGUgb2Ygbm9kZSB0byBiZSBzZWFyY2hlZCBmb3IKICAqICAgICAgICAgICAgICBwYXJlbnRfbm9kZSAgICAgICAgIC0gUGFyZW50IG5vZGUgd2hvc2UgY2hpbGRyZW4gd2UgYXJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldHRpbmcKICAqICAgICAgICAgICAgICBjaGlsZF9ub2RlICAgICAgICAgIC0gUHJldmlvdXMgY2hpbGQgdGhhdCB3YXMgZm91bmQuCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBORVhUIGNoaWxkIHdpbGwgYmUgcmV0dXJuZWQKICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKaW5kZXggMWRjOTk1NS4uMTJlYTIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4ZmV2YWwuYwpAQCAtNTgsMTEgKzU4LDExIEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgICAgICAtIE9iamVjdCBoYW5kbGUgKG9wdGlvbmFsKQotICogICAgICAgICAgICAgICpQYXRobmFtZSAgICAgICAgICAgLSBPYmplY3QgcGF0aG5hbWUgKG9wdGlvbmFsKQotICogICAgICAgICAgICAgICoqZXh0ZXJuYWxfcGFyYW1zICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byBtZXRob2QsCisgKiAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgICAgICAtIE9iamVjdCBwYXRobmFtZSAob3B0aW9uYWwpCisgKiAgICAgICAgICAgICAgZXh0ZXJuYWxfcGFyYW1zICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIG1ldGhvZCwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRlZCBieSBOVUxMLiAgTWF5IGJlIE5VTEwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgICpyZXR1cm5fYnVmZmVyICAgICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgorICogICAgICAgICAgICAgIHJldHVybl9idWZmZXIgICAgICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiAgSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCiAgKiAgICAgICAgICAgICAgcmV0dXJuX3R5cGUgICAgICAgICAtIEV4cGVjdGVkIHR5cGUgb2YgcmV0dXJuIG9iamVjdAogICoKQEAgLTczLDYgKzczLDcgQEAKICAqICAgICAgICAgICAgICBiZSB2YWxpZCAobm9uLW51bGwpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQgKApAQCAtMzA3LDcgKzMwOCw4IEBACiAJCQkJaWYgKEFDUElfU1VDQ0VTUyAoc3RhdHVzKSkgewogCQkJCQkvKiBWYWxpZGF0ZS9BbGxvY2F0ZS9DbGVhciBjYWxsZXIgYnVmZmVyICovCiAKLQkJCQkJc3RhdHVzID0gYWNwaV91dF9pbml0aWFsaXplX2J1ZmZlciAocmV0dXJuX2J1ZmZlciwgYnVmZmVyX3NwYWNlX25lZWRlZCk7CisJCQkJCXN0YXR1cyA9IGFjcGlfdXRfaW5pdGlhbGl6ZV9idWZmZXIgKHJldHVybl9idWZmZXIsCisJCQkJCQkJICBidWZmZXJfc3BhY2VfbmVlZGVkKTsKIAkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQkJLyoKIAkJCQkJCSAqIENhbGxlcidzIGJ1ZmZlciBpcyB0b28gc21hbGwgb3IgYSBuZXcgb25lIGNhbid0IGJlIGFsbG9jYXRlZApAQCAtNDIzLDcgKzQyNSw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICh0eXBlLCBzdGFydF9vYmplY3QsIG1heF9kZXB0aCwgQUNQSV9OU19XQUxLX1VOTE9DSywKKwlzdGF0dXMgPSBhY3BpX25zX3dhbGtfbmFtZXNwYWNlICh0eXBlLCBzdGFydF9vYmplY3QsIG1heF9kZXB0aCwKKwkJCSAgQUNQSV9OU19XQUxLX1VOTE9DSywKIAkJCSAgdXNlcl9mdW5jdGlvbiwgY29udGV4dCwgcmV0dXJuX3ZhbHVlKTsKIAogCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CkBAIC01MjUsNyArNTI4LDggQEAKIAkJfQogCX0KIAotCXN0YXR1cyA9IGluZm8tPnVzZXJfZnVuY3Rpb24gKG9ial9oYW5kbGUsIG5lc3RpbmdfbGV2ZWwsIGluZm8tPmNvbnRleHQsIHJldHVybl92YWx1ZSk7CisJc3RhdHVzID0gaW5mby0+dXNlcl9mdW5jdGlvbiAob2JqX2hhbmRsZSwgbmVzdGluZ19sZXZlbCwgaW5mby0+Y29udGV4dCwKKwkJCSByZXR1cm5fdmFsdWUpOwogCXJldHVybiAoc3RhdHVzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCmluZGV4IGYyNDA1ZWYuLjhkMDk3OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKQEAgLTU3LDkgKzU3LDkgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2dldF9oYW5kbGUKICAqCiAgKiBQQVJBTUVURVJTOiAgUGFyZW50ICAgICAgICAgIC0gT2JqZWN0IHRvIHNlYXJjaCB1bmRlciAoc2VhcmNoIHNjb3BlKS4KLSAqICAgICAgICAgICAgICBwYXRoX25hbWUgICAgICAgLSBQb2ludGVyIHRvIGFuIGFzY2lpeiBzdHJpbmcgY29udGFpbmluZyB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUKLSAqICAgICAgICAgICAgICByZXRfaGFuZGxlICAgICAgLSBXaGVyZSB0aGUgcmV0dXJuIGhhbmRsZSBpcyBwbGFjZWQKKyAqICAgICAgICAgICAgICBQYXRobmFtZSAgICAgICAgLSBQb2ludGVyIHRvIGFuIGFzY2lpeiBzdHJpbmcgY29udGFpbmluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lCisgKiAgICAgICAgICAgICAgcmV0X2hhbmRsZSAgICAgIC0gV2hlcmUgdGhlIHJldHVybiBoYW5kbGUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjIwLDcgKzIyMCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfb2JqZWN0X2luZm8KICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gT2JqZWN0IEhhbmRsZQotICogICAgICAgICAgICAgIEluZm8gICAgICAgICAgICAtIFdoZXJlIHRoZSBpbmZvIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgQnVmZmVyICAgICAgICAgIC0gV2hlcmUgdGhlIGluZm8gaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmb2JqLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYwppbmRleCAxOWFjZjMyLi4zNjNlMWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYwpAQCAtNTYsNyArNTYsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3R5cGUKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gSGFuZGxlIG9mIG9iamVjdCB3aG9zZSB0eXBlIGlzIGRlc2lyZWQKLSAqICAgICAgICAgICAgICAqcmV0X3R5cGUgICAgICAgLSBXaGVyZSB0aGUgdHlwZSB3aWxsIGJlIHBsYWNlZAorICogICAgICAgICAgICAgIHJldF90eXBlICAgICAgICAtIFdoZXJlIHRoZSB0eXBlIHdpbGwgYmUgcGxhY2VkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTI1OCw1ICsyNTgsNSBAQAogCSh2b2lkKSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXggKEFDUElfTVRYX05BTUVTUEFDRSk7CiAJcmV0dXJuIChzdGF0dXMpOwogfQotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uZXh0X29iamVjdCk7CiAKK0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfbmV4dF9vYmplY3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IDVhOTEyOGQuLmJkZDlmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTcxLDYgKzcxLDkgQEAKIGV4dGVybiBjaGFyIGxpbmVfYnVmWzgwXTsKICNlbmRpZiAvKkVOQUJMRV9ERUJVR0dFUiovCiAKK2ludCBhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkOworRVhQT1JUX1NZTUJPTChhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKTsKKwogc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX2lycV9pcnE7CiBzdGF0aWMgYWNwaV9vc2RfaGFuZGxlciBhY3BpX2lycV9oYW5kbGVyOwogc3RhdGljIHZvaWQgKmFjcGlfaXJxX2NvbnRleHQ7CkBAIC0xMTUyLDYgKzExNTUsMTUgQEAKIAogX19zZXR1cCgiYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uIiwgYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uX3NldHVwKTsKIAoraW50IF9faW5pdAorYWNwaV9ob3RrZXlfc2V0dXAoY2hhciAqc3RyKQoreworCWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQgPSBUUlVFOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJhY3BpX3NwZWNpZmljX2hvdGtleSIsIGFjcGlfaG90a2V5X3NldHVwKTsKKwogLyoKICAqIG1heF9jc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgYmFzZSBrZXJuZWwgc28gbW9kdWxlcyBjYW4KICAqIGNoYW5nZSBpdCB3L28gZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIG1vZHVsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCmluZGV4IGI1ZDk4ODkuLmI3YWM2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwpAQCAtNTAsNiArNTAsMTYgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1BBUlNFUgogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicHNhcmdzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdTMyCithY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfbGVuZ3RoICgKKwlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOworCitzdGF0aWMgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgorYWNwaV9wc19nZXRfbmV4dF9maWVsZCAoCisJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY0LDcgKzc0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11MzIKK3N0YXRpYyB1MzIKIGFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKIHsKQEAgLTc4LDcgKzg4LDYgQEAKIAllbmNvZGVkX2xlbmd0aCA9ICh1MzIpIEFDUElfR0VUOCAocGFyc2VyX3N0YXRlLT5hbWwpOwogCXBhcnNlcl9zdGF0ZS0+YW1sKys7CiAKLQogCXN3aXRjaCAoZW5jb2RlZF9sZW5ndGggPj4gNikgLyogYml0cyA2LTcgY29udGFpbiBlbmNvZGluZyBzY2hlbWUgKi8gewogCWNhc2UgMDogLyogMS1ieXRlIGVuY29kaW5nIChiaXRzIDAtNSkgKi8KIApAQCAtMjg3LDEzICsyOTYsMTQgQEAKIAkJICogcGFyZW50IHRyZWUsIGJ1dCBkb24ndCBvcGVuIGEgbmV3IHNjb3BlIC0tIHdlIGp1c3Qgd2FudCB0byBsb29rdXAgdGhlCiAJCSAqIG9iamVjdCAgKE1VU1QgQkUgbW9kZSBFWEVDVVRFIHRvIHBlcmZvcm0gdXBzZWFyY2gpCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cCAoJnNjb3BlX2luZm8sIHBhdGgsIEFDUElfVFlQRV9BTlksIEFDUElfSU1PREVfRVhFQ1VURSwKLQkJCQkgQUNQSV9OU19TRUFSQ0hfUEFSRU5UIHwgQUNQSV9OU19ET05UX09QRU5fU0NPUEUsIE5VTEwsICZub2RlKTsKKwkJc3RhdHVzID0gYWNwaV9uc19sb29rdXAgKCZzY29wZV9pbmZvLCBwYXRoLCBBQ1BJX1RZUEVfQU5ZLAorCQkJCSBBQ1BJX0lNT0RFX0VYRUNVVEUsCisJCQkJIEFDUElfTlNfU0VBUkNIX1BBUkVOVCB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFLAorCQkJCSBOVUxMLCAmbm9kZSk7CiAJCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykgJiYgbWV0aG9kX2NhbGwpIHsKIAkJCWlmIChub2RlLT50eXBlID09IEFDUElfVFlQRV9NRVRIT0QpIHsKLQkJCQkvKgotCQkJCSAqIFRoaXMgbmFtZSBpcyBhY3R1YWxseSBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24KLQkJCQkgKi8KKwkJCQkvKiBUaGlzIG5hbWUgaXMgYWN0dWFsbHkgYSBjb250cm9sIG1ldGhvZCBpbnZvY2F0aW9uICovCisKIAkJCQltZXRob2RfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCAobm9kZSk7CiAJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfUEFSU0UsCiAJCQkJCSJDb250cm9sIE1ldGhvZCAtICVwIERlc2MgJXAgUGF0aD0lcFxuIiwKQEAgLTM2MCw3ICszNzAsNyBAQAogCQkJCS8qCiAJCQkJICogV2UgZ290IGEgTk9UX0ZPVU5EIGR1cmluZyB0YWJsZSBsb2FkIG9yIHdlIGVuY291bnRlcmVkCiAJCQkJICogYSBjb25kX3JlZl9vZih4KSB3aGVyZSB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0LgotCQkJCSAqIC0tIGVpdGhlciBjYXNlIGlzIG9rCisJCQkJICogRWl0aGVyIGNhc2UgaXMgb2sKIAkJCQkgKi8KIAkJCQlzdGF0dXMgPSBBRV9PSzsKIAkJCX0KQEAgLTQ4NiwxMiArNDk2LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgorc3RhdGljIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKIGFjcGlfcHNfZ2V0X25leHRfZmllbGQgKAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSkKIHsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vZmZzZXQgPSAodTMyKSBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCSBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb2Zmc2V0ID0gKHUzMikKKwkJCSAgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsCisJCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpmaWVsZDsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZTsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CkBAIC01MDAsNyArNTExLDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicHNfZ2V0X25leHRfZmllbGQiKTsKIAogCi0JLyogZGV0ZXJtaW5lIGZpZWxkIHR5cGUgKi8KKwkvKiBEZXRlcm1pbmUgZmllbGQgdHlwZSAqLwogCiAJc3dpdGNoIChBQ1BJX0dFVDggKHBhcnNlcl9zdGF0ZS0+YW1sKSkgewogCWRlZmF1bHQ6CkBAIC01MjEsNyArNTMyLDYgQEAKIAkJYnJlYWs7CiAJfQogCi0KIAkvKiBBbGxvY2F0ZSBhIG5ldyBmaWVsZCBvcCAqLwogCiAJZmllbGQgPSBhY3BpX3BzX2FsbG9jX29wIChvcGNvZGUpOwpAQCAtNTgyLDEwICs1OTIsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfbmV4dF9hcmcKICAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAogICogICAgICAgICAgICAgIGFyZ190eXBlICAgICAgICAgICAgLSBUaGUgYXJndW1lbnQgdHlwZSAoQU1MXypfQVJHKQotICogICAgICAgICAgICAgIGFyZ19jb3VudCAgICAgICAgICAgLSBJZiB0aGUgYXJndW1lbnQgcG9pbnRzIHRvIGEgY29udHJvbCBtZXRob2QKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGFyZ3VtZW50IGlzIHJldHVybmVkIGhlcmUuCisgKiAgICAgICAgICAgICAgcmV0dXJuX2FyZyAgICAgICAgICAtIFdoZXJlIHRoZSBuZXh0IGFyZyBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMsIGFuZCBhbiBvcCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV4dCBhcmd1bWVudC4KICAqCkBAIC02MTksNyArNjI5LDcgQEAKIAljYXNlIEFSR1BfTkFNRToKIAljYXNlIEFSR1BfTkFNRVNUUklORzoKIAotCQkvKiBjb25zdGFudHMsIHN0cmluZ3MsIGFuZCBuYW1lc3RyaW5ncyBhcmUgYWxsIHRoZSBzYW1lIHNpemUgKi8KKwkJLyogQ29uc3RhbnRzLCBzdHJpbmdzLCBhbmQgbmFtZXN0cmluZ3MgYXJlIGFsbCB0aGUgc2FtZSBzaXplICovCiAKIAkJYXJnID0gYWNwaV9wc19hbGxvY19vcCAoQU1MX0JZVEVfT1ApOwogCQlpZiAoIWFyZykgewpAQCAtNjU0LDcgKzY2NCw2IEBACiAJCQkJZWxzZSB7CiAJCQkJCWFyZyA9IGZpZWxkOwogCQkJCX0KLQogCQkJCXByZXYgPSBmaWVsZDsKIAkJCX0KIApAQCAtNjc3LDggKzY4Niw4IEBACiAKIAkJCS8qIEZpbGwgaW4gYnl0ZWxpc3QgZGF0YSAqLwogCi0JCQlhcmctPmNvbW1vbi52YWx1ZS5zaXplID0gKHUzMikgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5wa2dfZW5kLAotCQkJCQkgIHBhcnNlcl9zdGF0ZS0+YW1sKTsKKwkJCWFyZy0+Y29tbW9uLnZhbHVlLnNpemUgPSAodTMyKQorCQkJCUFDUElfUFRSX0RJRkYgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCwgcGFyc2VyX3N0YXRlLT5hbWwpOwogCQkJYXJnLT5uYW1lZC5kYXRhID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAKIAkJCS8qIFNraXAgdG8gRW5kIG9mIGJ5dGUgZGF0YSAqLwpAQCAtNzA2LDcgKzcxNSw3IEBACiAJCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X25hbWVwYXRoICh3YWxrX3N0YXRlLCBwYXJzZXJfc3RhdGUsIGFyZywgMCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQkvKiBzaW5nbGUgY29tcGxleCBhcmd1bWVudCwgbm90aGluZyByZXR1cm5lZCAqLworCQkJLyogU2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gMTsKIAkJfQpAQCAtNzE2LDcgKzcyNSw3IEBACiAJY2FzZSBBUkdQX0RBVEFPQko6CiAJY2FzZSBBUkdQX1RFUk1BUkc6CiAKLQkJLyogc2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KKwkJLyogU2luZ2xlIGNvbXBsZXggYXJndW1lbnQsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQl3YWxrX3N0YXRlLT5hcmdfY291bnQgPSAxOwogCQlicmVhazsKQEAgLTcyNyw3ICs3MzYsNyBAQAogCWNhc2UgQVJHUF9PQkpMSVNUOgogCiAJCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgewotCQkJLyogbm9uLWVtcHR5IGxpc3Qgb2YgdmFyaWFibGUgYXJndW1lbnRzLCBub3RoaW5nIHJldHVybmVkICovCisJCQkvKiBOb24tZW1wdHkgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gQUNQSV9WQVJfQVJHUzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCmluZGV4IDAzZTMzZmUuLjU3NDQ2NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKIAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwYXJzZXIuaD4KKyNpbmNsdWRlIDxhY3BpL2Fjb3Bjb2RlLmg+CiAjaW5jbHVkZSA8YWNwaS9hbWxjb2RlLmg+CiAKIApAQCAtNTEsMjMgKzUyLDYgQEAKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzb3Bjb2RlIikKIAogCi0jZGVmaW5lIF9VTksgICAgICAgICAgICAgICAgICAgICAgICAweDZCCi0vKgotICogUmVzZXJ2ZWQgQVNDSUkgY2hhcmFjdGVycy4gIERvIG5vdCB1c2UgYW55IG9mIHRoZXNlIGZvcgotICogaW50ZXJuYWwgb3Bjb2Rlcywgc2luY2UgdGhleSBhcmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlCi0gKiBuYW1lIHN0cmluZ3MgZnJvbSBBTUwgb3Bjb2RlcwotICovCi0jZGVmaW5lIF9BU0MgICAgICAgICAgICAgICAgICAgICAgICAweDZDCi0jZGVmaW5lIF9OQU0gICAgICAgICAgICAgICAgICAgICAgICAweDZDCi0jZGVmaW5lIF9QRlggICAgICAgICAgICAgICAgICAgICAgICAweDZECi0jZGVmaW5lIF9VTktOT1dOX09QQ09ERSAgICAgICAgICAgICAweDAyICAgIC8qIEFuIGV4YW1wbGUgdW5rbm93biBvcGNvZGUgKi8KLQotI2RlZmluZSBNQVhfRVhURU5ERURfT1BDT0RFICAgICAgICAgMHg4OAotI2RlZmluZSBOVU1fRVhURU5ERURfT1BDT0RFICAgICAgICAgKE1BWF9FWFRFTkRFRF9PUENPREUgKyAxKQotI2RlZmluZSBNQVhfSU5URVJOQUxfT1BDT0RFCi0jZGVmaW5lIE5VTV9JTlRFUk5BTF9PUENPREUgICAgICAgICAoTUFYX0lOVEVSTkFMX09QQ09ERSArIDEpCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBOQU1FOiAgICAgICAgYWNwaV9nYmxfYW1sX29wX2luZm8KQEAgLTc5LDI3NCArNjMsOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQotLyoKLSAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHBhcnNlLXRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MIHBhcnNlciAgRWFjaCBsaXN0IGlzIGNvbXByZXNzZWQKLSAqIGludG8gYSAzMi1iaXQgbnVtYmVyIGFuZCBzdG9yZWQgaW4gdGhlIG1hc3RlciBvcGNvZGUgdGFibGUgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi0gKi8KLQotCi0jZGVmaW5lIEFSR1BfQUNDRVNTRklFTERfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX0FDUVVJUkVfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9XT1JEREFUQSkKLSNkZWZpbmUgQVJHUF9BRERfT1AgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQUxJQVNfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FU1RSSU5HLCBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfQVJHMCAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9BUkcxICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0FSRzIgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQVJHMyAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9BUkc0ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0FSRzUgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQVJHNiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9CQU5LX0ZJRUxEX09QICAgICAgICAgICAgICBBUkdQX0xJU1Q2IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRVNUUklORywgICAgQVJHUF9OQU1FU1RSSU5HLEFSR1BfVEVSTUFSRywgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9GSUVMRExJU1QpCi0jZGVmaW5lIEFSR1BfQklUX0FORF9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0JJVF9OQU5EX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9CSVRfTk9SX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQklUX05PVF9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9CSVRfT1JfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQklUX1hPUl9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0JSRUFLX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQlJFQUtfUE9JTlRfT1AgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9CVUZGRVJfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9CWVRFTElTVCkKLSNkZWZpbmUgQVJHUF9CWVRFX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX0JZVEVEQVRBKQotI2RlZmluZSBBUkdQX0JZVEVMSVNUX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9DT05DQVRfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfQ09OQ0FUX1JFU19PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0NPTkRfUkVGX09GX09QICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfU1VQRVJOQU1FLCAgQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfQ09OVElOVUVfT1AgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9DT1BZX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfU0lNUExFTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfQklUX0ZJRUxEX09QICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfQ1JFQVRFX0RXT1JEX0ZJRUxEX09QICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfRklFTERfT1AgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfTkFNRSkKLSNkZWZpbmUgQVJHUF9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQotI2RlZmluZSBBUkdQX0NSRUFURV9XT1JEX0ZJRUxEX09QICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfREFUQV9SRUdJT05fT1AgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9OQU1FLCAgICAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfREVCVUdfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9ERUNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9ERVJFRl9PRl9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfREVWSUNFX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfT0JKTElTVCkKLSNkZWZpbmUgQVJHUF9ESVZJREVfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0RXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfRFdPUkREQVRBKQotI2RlZmluZSBBUkdQX0VMU0VfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNTElTVCkKLSNkZWZpbmUgQVJHUF9FVkVOVF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUUpCi0jZGVmaW5lIEFSR1BfRkFUQUxfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9CWVRFREFUQSwgICBBUkdQX0RXT1JEREFUQSwgICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9GSUVMRF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRVNUUklORywgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfRklFTERMSVNUKQotI2RlZmluZSBBUkdQX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX0lGX09QICAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX0lOQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX0lOREVYX0ZJRUxEX09QICAgICAgICAgICAgIEFSR1BfTElTVDUgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FU1RSSU5HLCAgICBBUkdQX05BTUVTVFJJTkcsQVJHUF9CWVRFREFUQSwgIEFSR1BfRklFTERMSVNUKQotI2RlZmluZSBBUkdQX0lOREVYX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9MQU5EX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MRVFVQUxfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MR1JFQVRFUl9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MR1JFQVRFUkVRVUFMX09QICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTEVTU19PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTEVTU0VRVUFMX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9MTk9UX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTE5PVEVRVUFMX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTE9BRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FU1RSSU5HLCBBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9MT0FEX1RBQkxFX09QICAgICAgICAgICAgICBBUkdQX0xJU1Q2IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEVSTUFSRywgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTE9DQUwwICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDEgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMMiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9DQUwzICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDQgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPQ0FMNSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfTE9DQUw2ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9MT0NBTDcgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX0xPUl9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX01BVENIX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9CWVRFREFUQSwgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfTUVUSE9EX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX01FVEhPRENBTExfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9NSURfT1AgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q0IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX01PRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9NVUxUSVBMWV9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfTVVURVhfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0JZVEVEQVRBKQotI2RlZmluZSBBUkdQX05BTUVfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfTkFNRSwgICAgICAgQVJHUF9EQVRBT0JKKQotI2RlZmluZSBBUkdQX05BTUVERklFTERfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKLSNkZWZpbmUgQVJHUF9OQU1FUEFUSF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCi0jZGVmaW5lIEFSR1BfTk9PUF9PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHUF9OT1RJRllfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9PTkVfT1AgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX09ORVNfT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfUEFDS0FHRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfREFUQU9CSkxJU1QpCi0jZGVmaW5lIEFSR1BfUE9XRVJfUkVTX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUNSAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfQllURURBVEEsICBBUkdQX1dPUkREQVRBLCAgQVJHUF9PQkpMSVNUKQotI2RlZmluZSBBUkdQX1BST0NFU1NPUl9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDYgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9EV09SRERBVEEsIEFSR1BfQllURURBVEEsICBBUkdQX09CSkxJU1QpCi0jZGVmaW5lIEFSR1BfUVdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9RV09SRERBVEEpCi0jZGVmaW5lIEFSR1BfUkVGX09GX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfUkVHSU9OX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9OQU1FLCAgICAgICBBUkdQX0JZVEVEQVRBLCAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcpCi0jZGVmaW5lIEFSR1BfUkVMRUFTRV9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfUkVTRVJWRURGSUVMRF9PUCAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQotI2RlZmluZSBBUkdQX1JFU0VUX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQotI2RlZmluZSBBUkdQX1JFVFVSTl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9SRVZJU0lPTl9PUCAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdQX1NDT1BFX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX1RFUk1MSVNUKQotI2RlZmluZSBBUkdQX1NISUZUX0xFRlRfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9TSElGVF9SSUdIVF9PUCAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfU0lHTkFMX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfU0laRV9PRl9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCi0jZGVmaW5lIEFSR1BfU0xFRVBfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQotI2RlZmluZSBBUkdQX1NUQUxMX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9TVEFUSUNTVFJJTkdfT1AgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCi0jZGVmaW5lIEFSR1BfU1RPUkVfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9TVFJJTkdfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX0NIQVJMSVNUKQotI2RlZmluZSBBUkdQX1NVQlRSQUNUX09QICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9USEVSTUFMX1pPTkVfT1AgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9PQkpMSVNUKQotI2RlZmluZSBBUkdQX1RJTUVSX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfVE9fQkNEX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UT19CVUZGRVJfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RPX0RFQ19TVFJfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCi0jZGVmaW5lIEFSR1BfVE9fSEVYX1NUUl9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UT19JTlRFR0VSX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQotI2RlZmluZSBBUkdQX1RPX1NUUklOR19PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKLSNkZWZpbmUgQVJHUF9UWVBFX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9VTkxPQURfT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKLSNkZWZpbmUgQVJHUF9WQVJfUEFDS0FHRV9PUCAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9EQVRBT0JKTElTVCkKLSNkZWZpbmUgQVJHUF9XQUlUX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfVEVSTUFSRykKLSNkZWZpbmUgQVJHUF9XSElMRV9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNTElTVCkKLSNkZWZpbmUgQVJHUF9XT1JEX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1dPUkREQVRBKQotI2RlZmluZSBBUkdQX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0KLQotLyoKLSAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHJ1bnRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MIGludGVycHJldGVyICBFYWNoIGxpc3QgaXMgY29tcHJlc3NlZAotICogaW50byBhIDMyLWJpdCBudW1iZXIgYW5kIHN0b3JlZCBpbiB0aGUgbWFzdGVyIG9wY29kZSB0YWJsZSBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KLSAqCi0gKiAoVXNlZCBieSBwcmVwX29wZXJhbmRzIHByb2NlZHVyZSBhbmQgdGhlIEFTTCBDb21waWxlcikKLSAqLwotCi0KLSNkZWZpbmUgQVJHSV9BQ0NFU1NGSUVMRF9PUCAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQUNRVUlSRV9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9NVVRFWCwgICAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfQUREX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0FMSUFTX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9BUkcwICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0FSRzEgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQVJHMiAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9BUkczICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0FSRzQgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfQVJHNSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9BUkc2ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0JBTktfRklFTERfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9CSVRfQU5EX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQklUX05BTkRfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0JJVF9OT1JfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9CSVRfTk9UX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0JJVF9PUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9CSVRfWE9SX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQlJFQUtfT1AgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9CUkVBS19QT0lOVF9PUCAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0JVRkZFUl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9CWVRFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQllURUxJU1RfT1AgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0NPTkNBVF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSwgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9DT05DQVRfUkVTX09QICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfQlVGRkVSLCAgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfQ09ORF9SRUZfT0ZfT1AgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9PQkpFQ1RfUkVGLCBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9DT05USU5VRV9PUCAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9BTllUWVBFLCAgICBBUkdJX1NJTVBMRV9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX0JJVF9GSUVMRF9PUCAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQotI2RlZmluZSBBUkdJX0NSRUFURV9CWVRFX0ZJRUxEX09QICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfRFdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX0ZJRUxEX09QICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1JFRkVSRU5DRSkKLSNkZWZpbmUgQVJHSV9DUkVBVEVfUVdPUkRfRklFTERfT1AgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCi0jZGVmaW5lIEFSR0lfQ1JFQVRFX1dPUkRfRklFTERfT1AgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQotI2RlZmluZSBBUkdJX0RBVEFfUkVHSU9OX09QICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORykKLSNkZWZpbmUgQVJHSV9ERUJVR19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0RFQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCi0jZGVmaW5lIEFSR0lfREVSRUZfT0ZfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9SRUZfT1JfU1RSSU5HKQotI2RlZmluZSBBUkdJX0RFVklDRV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9ESVZJREVfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0RXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9FTFNFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfRVZFTlRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0ZBVEFMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0ZJTkRfU0VUX0xFRlRfQklUX09QICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfRklORF9TRVRfUklHSFRfQklUX09QICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9GUk9NX0JDRF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0lGX09QICAgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9JTkNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVJfUkVGKQotI2RlZmluZSBBUkdJX0lOREVYX0ZJRUxEX09QICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9JTkRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0NPTVBMRVhPQkosIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfTEFORF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfTEVRVUFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQotI2RlZmluZSBBUkdJX0xHUkVBVEVSX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9DT01QVVRFREFUQSkKLSNkZWZpbmUgQVJHSV9MR1JFQVRFUkVRVUFMX09QICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTExFU1NfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQotI2RlZmluZSBBUkdJX0xMRVNTRVFVQUxfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9MTk9UX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfTE5PVEVRVUFMX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX0xPQURfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfUkVHSU9OX09SX0ZJRUxELEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX0xPQURfVEFCTEVfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfU1RSSU5HLCAgICAgQVJHSV9TVFJJTkcsICAgICAgICBBUkdJX1NUUklORywgICAgICAgQVJHSV9TVFJJTkcsICAgIEFSR0lfU1RSSU5HLCBBUkdJX0FOWVRZUEUpCi0jZGVmaW5lIEFSR0lfTE9DQUwwICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDEgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMMiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9DQUwzICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDQgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPQ0FMNSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfTE9DQUw2ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9MT0NBTDcgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX0xPUl9PUCAgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX01BVENIX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDYgKEFSR0lfUEFDS0FHRSwgICAgQVJHSV9JTlRFR0VSLCAgIEFSR0lfQ09NUFVURURBVEEsICAgICAgQVJHSV9JTlRFR0VSLEFSR0lfQ09NUFVURURBVEEsQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX01FVEhPRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9NRVRIT0RDQUxMX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTUlEX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUNCAoQVJHSV9CVUZGRVJfT1JfU1RSSU5HLEFSR0lfSU5URUdFUiwgIEFSR0lfSU5URUdFUiwgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9NT0RfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfTVVMVElQTFlfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX01VVEVYX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9OQU1FX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfTkFNRURGSUVMRF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX05BTUVQQVRIX09QICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9OT09QX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX05PVElGWV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfREVWSUNFX1JFRiwgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX09ORV9PUCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfT05FU19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKLSNkZWZpbmUgQVJHSV9QQUNLQUdFX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCi0jZGVmaW5lIEFSR0lfUE9XRVJfUkVTX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1BST0NFU1NPUl9PUCAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9RV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfUkVGX09GX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9PQkpFQ1RfUkVGKQotI2RlZmluZSBBUkdJX1JFR0lPTl9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1JFTEVBU0VfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfTVVURVgpCi0jZGVmaW5lIEFSR0lfUkVTRVJWRURGSUVMRF9PUCAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1JFU0VUX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRVZFTlQpCi0jZGVmaW5lIEFSR0lfUkVUVVJOX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1JFVklTSU9OX09QICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR0lfU0NPUEVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1NISUZUX0xFRlRfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9TSElGVF9SSUdIVF9PUCAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCi0jZGVmaW5lIEFSR0lfU0lHTkFMX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9FVkVOVCkKLSNkZWZpbmUgQVJHSV9TSVpFX09GX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0RBVEFPQkpFQ1QpCi0jZGVmaW5lIEFSR0lfU0xFRVBfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQotI2RlZmluZSBBUkdJX1NUQUxMX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9TVEFUSUNTVFJJTkdfT1AgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfU1RPUkVfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9EQVRBUkVGT0JKLCBBUkdJX1RBUkdFVFJFRikKLSNkZWZpbmUgQVJHSV9TVFJJTkdfT1AgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfU1VCVFJBQ1RfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQotI2RlZmluZSBBUkdJX1RIRVJNQUxfWk9ORV9PUCAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKLSNkZWZpbmUgQVJHSV9USU1FUl9PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQotI2RlZmluZSBBUkdJX1RPX0JDRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVE9fQlVGRkVSX09QICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UT19ERUNfU1RSX09QICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQotI2RlZmluZSBBUkdJX1RPX0hFWF9TVFJfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVE9fSU5URUdFUl9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKLSNkZWZpbmUgQVJHSV9UT19TVFJJTkdfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9GSVhFRF9UQVJHRVQpCi0jZGVmaW5lIEFSR0lfVFlQRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9BTllUWVBFKQotI2RlZmluZSBBUkdJX1VOTE9BRF9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfRERCSEFORExFKQotI2RlZmluZSBBUkdJX1ZBUl9QQUNLQUdFX09QICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9XQUlUX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0VWRU5ULCAgICAgIEFSR0lfSU5URUdFUikKLSNkZWZpbmUgQVJHSV9XSElMRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCi0jZGVmaW5lIEFSR0lfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQotI2RlZmluZSBBUkdJX1pFUk9fT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCi0KLQogLyoKICAqIFN1bW1hcnkgb2Ygb3Bjb2RlIHR5cGVzL2ZsYWdzCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKIAogIE9wY29kZXMgdGhhdCBoYXZlIGFzc29jaWF0ZWQgbmFtZXNwYWNlIG9iamVjdHMgKEFNTF9OU09CSkVDVCBmbGFnKQogCkBAIC00NjAsMTQgKzE3OSwxMyBAQAogCUFNTF9DUkVBVEVfRFdPUkRfRklFTERfT1AKIAlBTUxfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QCiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogLyoKLSAqIE1hc3RlciBPcGNvZGUgaW5mb3JtYXRpb24gdGFibGUuICBBIHN1bW1hcnkgb2YgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0IGVhY2ggb3Bjb2RlLCBhbGwgaW4gb25lIHBsYWNlLgorICogTWFzdGVyIE9wY29kZSBpbmZvcm1hdGlvbiB0YWJsZS4gIEEgc3VtbWFyeSBvZiBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQgZWFjaAorICogb3Bjb2RlLCBhbGwgaW4gb25lIHBsYWNlLgogICovCi0KLQogY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gICAgIGFjcGlfZ2JsX2FtbF9vcF9pbmZvW0FNTF9OVU1fT1BDT0RFU10gPQogewogLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKi8KQEAgLTY5Myw4ICs0MTEsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gVGhlIEFNTCBvcGNvZGUKICAqCi0gKiBSRVRVUk46ICAgICAgQSBwb2ludGVyIHRvIHRoZSBpbmZvIGFib3V0IHRoZSBvcGNvZGUuICBOVUxMIGlmIHRoZSBvcGNvZGUgd2FzCi0gKiAgICAgICAgICAgICAgbm90IGZvdW5kIGluIHRoZSB0YWJsZS4KKyAqIFJFVFVSTjogICAgICBBIHBvaW50ZXIgdG8gdGhlIGluZm8gYWJvdXQgdGhlIG9wY29kZS4KICAqCiAgKiBERVNDUklQVElPTjogRmluZCBBTUwgb3Bjb2RlIGRlc2NyaXB0aW9uIGJhc2VkIG9uIHRoZSBvcGNvZGUuCiAgKiAgICAgICAgICAgICAgTk9URTogVGhpcyBwcm9jZWR1cmUgbXVzdCBBTFdBWVMgcmV0dXJuIGEgdmFsaWQgcG9pbnRlciEKQEAgLTczMSw3ICs0NDgsOCBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlVua25vd24gQU1MIG9wY29kZSBbJTQuNFhdXG4iLCBvcGNvZGUpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVW5rbm93biBBTUwgb3Bjb2RlIFslNC40WF1cbiIsIG9wY29kZSkpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNwYXJzZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKaW5kZXggZTc5ZWRiNS4uYmJmZGMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMKQEAgLTY0LDYgKzY0LDIzIEBACiAKIHN0YXRpYyB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlcHRoID0gMDsKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCisJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfcHNfcGFyc2VfbG9vcCAoCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMDAsNyArMTE3LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEEgcGFyc2VyIHN0YXRlIG9iamVjdAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOZXh0IEFNTCBvcGNvZGUKICAqCiAgKiBERVNDUklQVElPTjogR2V0IG5leHQgQU1MIG9wY29kZSAod2l0aG91dCBpbmNyZW1lbnRpbmcgQU1MIHBvaW50ZXIpCiAgKgpAQCAtMTE3LDcgKzEzNCw2IEBACiAJYW1sID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJb3Bjb2RlID0gKHUxNikgQUNQSV9HRVQ4IChhbWwpOwogCi0KIAlpZiAob3Bjb2RlID09IEFNTF9FWFRPUCkgewogCQkvKiBFeHRlbmRlZCBvcGNvZGUgKi8KIApAQCAtMTQyLDcgKzE1OCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcHNfY29tcGxldGVfdGhpc19vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKQEAgLTI3Miw3ICsyODgsNiBAQAogCQkJCQluZXh0ID0gTlVMTDsKIAkJCQl9CiAJCQl9Ci0KIAkJCXByZXYgPSBuZXh0OwogCQl9CiAJfQpAQCAtMjgwLDcgKzI5NSw3IEBACiAKIGNsZWFudXA6CiAKLQkvKiBOb3cgd2UgY2FuIGFjdHVhbGx5IGRlbGV0ZSB0aGUgc3VidHJlZSByb290ZWQgYXQgb3AgKi8KKwkvKiBOb3cgd2UgY2FuIGFjdHVhbGx5IGRlbGV0ZSB0aGUgc3VidHJlZSByb290ZWQgYXQgT3AgKi8KIAogCWFjcGlfcHNfZGVsZXRlX3BhcnNlX3RyZWUgKG9wKTsKIAlyZXR1cm5fVk9JRDsKQEAgLTI5MSw3ICszMDYsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX25leHRfcGFyc2Vfc3RhdGUKICAqCi0gKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAorICogUEFSQU1FVEVSUzogIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHN0YXRlCisgKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgICAgICAtIEN1cnJlbnQgcGFyc2Ugb3AKKyAqICAgICAgICAgICAgICBjYWxsYmFja19zdGF0dXMgICAgIC0gU3RhdHVzIGZyb20gcHJldmlvdXMgb3BlcmF0aW9uCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTMwMCw3ICszMTcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTM4Miw5ICszOTksOCBAQAogCiAJY2FzZSBBRV9DVFJMX1RSQU5TRkVSOgogCi0JCS8qCi0JCSAqIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wKLQkJICovCisJCS8qIEEgbWV0aG9kIGNhbGwgKGludm9jYXRpb24pIC0tIHRyYW5zZmVyIGNvbnRyb2wgKi8KKwogCQlzdGF0dXMgPSBBRV9DVFJMX1RSQU5TRkVSOwogCQl3YWxrX3N0YXRlLT5wcmV2X29wID0gb3A7CiAJCXdhbGtfc3RhdGUtPm1ldGhvZF9jYWxsX29wID0gb3A7CkBAIC0zOTcsNiArNDEzLDcgQEAKIAogCiAJZGVmYXVsdDoKKwogCQlzdGF0dXMgPSBjYWxsYmFja19zdGF0dXM7CiAJCWlmICgoY2FsbGJhY2tfc3RhdHVzICYgQUVfQ09ERV9NQVNLKSA9PSBBRV9DT0RFX0NPTlRST0wpIHsKIAkJCXN0YXR1cyA9IEFFX09LOwpAQCAtNDEyLDcgKzQyOSw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfbG9vcAogICoKLSAqIFBBUkFNRVRFUlM6ICBwYXJzZXJfc3RhdGUgICAgICAgIC0gQ3VycmVudCBwYXJzZXIgc3RhdGUgb2JqZWN0CisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgICAgICAtIEN1cnJlbnQgc3RhdGUKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDIxLDcgKzQzOCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV9wc19wYXJzZV9sb29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKQogewpAQCAtNDQzLDYgKzQ2MCw3IEBACiAJd2Fsa19zdGF0ZS0+YXJnX3R5cGVzID0gMDsKIAogI2lmICghZGVmaW5lZCAoQUNQSV9OT19NRVRIT0RfRVhFQ1VUSU9OKSAmJiAhZGVmaW5lZCAoQUNQSV9DT05TVEFOVF9FVkFMX09OTFkpKQorCiAJaWYgKHdhbGtfc3RhdGUtPndhbGtfdHlwZSAmIEFDUElfV0FMS19NRVRIT0RfUkVTVEFSVCkgewogCQkvKiBXZSBhcmUgcmVzdGFydGluZyBhIHByZWVtcHRlZCBjb250cm9sIG1ldGhvZCAqLwogCkBAIC00NzEsNyArNDg5LDggQEAKIAkJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAogCQkJCQl9Ci0JCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiZ2V0X3ByZWRpY2F0ZSBGYWlsZWQsICVzXG4iLAorCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCQkJCSJnZXRfcHJlZGljYXRlIEZhaWxlZCwgJXNcbiIsCiAJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQkJCX0KQEAgLTQ5MiwxNiArNTExLDE1IEBACiAJfQogI2VuZGlmCiAKLQkvKgotCSAqIEl0ZXJhdGl2ZSBwYXJzaW5nIGxvb3AsIHdoaWxlIHRoZXJlIGlzIG1vcmUgYW1sIHRvIHByb2Nlc3M6Ci0JICovCisJLyogSXRlcmF0aXZlIHBhcnNpbmcgbG9vcCwgd2hpbGUgdGhlcmUgaXMgbW9yZSBBTUwgdG8gcHJvY2VzczogKi8KKwogCXdoaWxlICgocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPmFtbF9lbmQpIHx8IChvcCkpIHsKIAkJYW1sX29wX3N0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJCWlmICghb3ApIHsKIAkJCS8qIEdldCB0aGUgbmV4dCBvcGNvZGUgZnJvbSB0aGUgQU1MIHN0cmVhbSAqLwogCiAJCQl3YWxrX3N0YXRlLT5hbWxfb2Zmc2V0ID0gKHUzMikgQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsCi0JCQkJCSAgIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwkJCQkJICBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CiAJCQl3YWxrX3N0YXRlLT5vcGNvZGUgICA9IGFjcGlfcHNfcGVla19vcGNvZGUgKHBhcnNlcl9zdGF0ZSk7CiAKIAkJCS8qCkBAIC01NzgsOCArNTk2LDEwIEBACiAJCQkJCUlOQ1JFTUVOVF9BUkdfTElTVCAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKTsKIAkJCQl9CiAKLQkJCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBmb3VuZCBhIE5BTUUgYW5kIGRpZG4ndCBydW4gb3V0IG9mIGFyZ3VtZW50cyAqLwotCisJCQkJLyoKKwkJCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBmb3VuZCBhIE5BTUUgYW5kIGRpZG4ndCBydW4gb3V0IG9mCisJCQkJICogYXJndW1lbnRzCisJCQkJICovCiAJCQkJaWYgKCFHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSkgewogCQkJCQlzdGF0dXMgPSBBRV9BTUxfTk9fT1BFUkFORDsKIAkJCQkJZ290byBjbG9zZV90aGlzX29wOwpAQCAtNTk3LDEyICs2MTcsMTMgQEAKIAogCQkJCXN0YXR1cyA9IHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgKHdhbGtfc3RhdGUsICZvcCk7CiAJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkR1cmluZyBuYW1lIGxvb2t1cC9jYXRhbG9nLCAlc1xuIiwKLQkJCQkJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkJCQkiRHVyaW5nIG5hbWUgbG9va3VwL2NhdGFsb2csICVzXG4iLAorCQkJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCQkJCWdvdG8gY2xvc2VfdGhpc19vcDsKIAkJCQl9CiAKLQkJCQlpZiAob3AgPT0gTlVMTCkgeworCQkJCWlmICghb3ApIHsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCkBAIC02NTksNyArNjgwLDcgQEAKIAogCQkJCWlmICgod2Fsa19zdGF0ZS0+ZGVzY2VuZGluZ19jYWxsYmFjayAhPSBOVUxMKSkgewogCQkJCQkvKgotCQkJCQkgKiBGaW5kIHRoZSBvYmplY3QuICBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KKwkJCQkJICogRmluZCB0aGUgb2JqZWN0LiBUaGlzIHdpbGwgZWl0aGVyIGluc2VydCB0aGUgb2JqZWN0IGludG8KIAkJCQkJICogdGhlIG5hbWVzcGFjZSBvciBzaW1wbHkgbG9vayBpdCB1cAogCQkJCQkgKi8KIAkJCQkJd2Fsa19zdGF0ZS0+b3AgPSBvcDsKQEAgLTY4OCwxMSArNzA5LDE1IEBACiAJCX0KIAogCi0JCS8qIFN0YXJ0IGFyZ19jb3VudCBhdCB6ZXJvIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGVyZSBhcmUgYW55IGFyZ3MgeWV0ICovCi0KKwkJLyoKKwkJICogU3RhcnQgYXJnX2NvdW50IGF0IHplcm8gYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIGFyZQorCQkgKiBhbnkgYXJncyB5ZXQKKwkJICovCiAJCXdhbGtfc3RhdGUtPmFyZ19jb3VudCA9IDA7CiAKLQkJaWYgKHdhbGtfc3RhdGUtPmFyZ190eXBlcykgLyogQXJlIHRoZXJlIGFueSBhcmd1bWVudHMgdGhhdCBtdXN0IGJlIHByb2Nlc3NlZD8gKi8geworCQkvKiBBcmUgdGhlcmUgYW55IGFyZ3VtZW50cyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkPyAqLworCisJCWlmICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpIHsKIAkJCS8qIEdldCBhcmd1bWVudHMgKi8KIAogCQkJc3dpdGNoIChvcC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKQEAgLTcyMCwxNCArNzQ1LDE4IEBACiAKIAkJCWRlZmF1bHQ6CiAKLQkJCQkvKiBPcCBpcyBub3QgYSBjb25zdGFudCBvciBzdHJpbmcsIGFwcGVuZCBlYWNoIGFyZ3VtZW50IHRvIHRoZSBPcCAqLwotCisJCQkJLyoKKwkJCQkgKiBPcCBpcyBub3QgYSBjb25zdGFudCBvciBzdHJpbmcsIGFwcGVuZCBlYWNoIGFyZ3VtZW50CisJCQkJICogdG8gdGhlIE9wCisJCQkJICovCiAJCQkJd2hpbGUgKEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpICYmCiAJCQkJCQkhd2Fsa19zdGF0ZS0+YXJnX2NvdW50KSB7Ci0JCQkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKSBBQ1BJX1BUUl9ESUZGIChwYXJzZXJfc3RhdGUtPmFtbCwKLQkJCQkJCQkgICBwYXJzZXJfc3RhdGUtPmFtbF9zdGFydCk7CisJCQkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPSAodTMyKQorCQkJCQkJQUNQSV9QVFJfRElGRiAocGFyc2VyX3N0YXRlLT5hbWwsIHBhcnNlcl9zdGF0ZS0+YW1sX3N0YXJ0KTsKKwogCQkJCQlzdGF0dXMgPSBhY3BpX3BzX2dldF9uZXh0X2FyZyAod2Fsa19zdGF0ZSwgcGFyc2VyX3N0YXRlLAotCQkJCQkJCSBHRVRfQ1VSUkVOVF9BUkdfVFlQRSAod2Fsa19zdGF0ZS0+YXJnX3R5cGVzKSwgJmFyZyk7CisJCQkJCQkJIEdFVF9DVVJSRU5UX0FSR19UWVBFICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpLAorCQkJCQkJCSAmYXJnKTsKIAkJCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCQkJZ290byBjbG9zZV90aGlzX29wOwogCQkJCQl9CkBAIC03NTIsNyArNzgxLDggQEAKIAkJCQkJICogU2F2ZSB0aGUgbGVuZ3RoIGFuZCBhZGRyZXNzIG9mIHRoZSBib2R5CiAJCQkJCSAqLwogCQkJCQlvcC0+bmFtZWQuZGF0YSAgID0gcGFyc2VyX3N0YXRlLT5hbWw7Ci0JCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0gcGFyc2VyX3N0YXRlLT5hbWwpOworCQkJCQlvcC0+bmFtZWQubGVuZ3RoID0gKHUzMikgKHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCAtCisJCQkJCQkJICAgcGFyc2VyX3N0YXRlLT5hbWwpOwogCiAJCQkJCS8qIFNraXAgYm9keSBvZiBtZXRob2QgKi8KIApAQCAtNzczLDcgKzgwMyw4IEBACiAJCQkJCQkgKiB0byBwYXJzZSB0aGVtIGNvcnJlY3RseS4KIAkJCQkJCSAqLwogCQkJCQkJb3AtPm5hbWVkLmRhdGEgICA9IGFtbF9vcF9zdGFydDsKLQkJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0gYW1sX29wX3N0YXJ0KTsKKwkJCQkJCW9wLT5uYW1lZC5sZW5ndGggPSAodTMyKSAocGFyc2VyX3N0YXRlLT5wa2dfZW5kIC0KKwkJCQkJCQkJICAgYW1sX29wX3N0YXJ0KTsKIAogCQkJCQkJLyogU2tpcCBib2R5ICovCiAKQEAgLTc4NSw3ICs4MTYsOCBAQAogCQkJCWNhc2UgQU1MX1dISUxFX09QOgogCiAJCQkJCWlmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlKSB7Ci0JCQkJCQl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb250cm9sLnBhY2thZ2VfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCQkJCQkJd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZS0+Y29udHJvbC5wYWNrYWdlX2VuZCA9CisJCQkJCQkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCkBAIC04MDEsOCArODMzLDEwIEBACiAJCS8qIENoZWNrIGZvciBhcmd1bWVudHMgdGhhdCBuZWVkIHRvIGJlIHByb2Nlc3NlZCAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5hcmdfY291bnQpIHsKLQkJCS8qIFRoZXJlIGFyZSBhcmd1bWVudHMgKGNvbXBsZXggb25lcyksIHB1c2ggT3AgYW5kIHByZXBhcmUgZm9yIGFyZ3VtZW50ICovCi0KKwkJCS8qCisJCQkgKiBUaGVyZSBhcmUgYXJndW1lbnRzIChjb21wbGV4IG9uZXMpLCBwdXNoIE9wIGFuZAorCQkJICogcHJlcGFyZSBmb3IgYXJndW1lbnQKKwkJCSAqLwogCQkJc3RhdHVzID0gYWNwaV9wc19wdXNoX3Njb3BlIChwYXJzZXJfc3RhdGUsIG9wLAogCQkJCQkgd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLCB3YWxrX3N0YXRlLT5hcmdfY291bnQpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewpAQCAtODEyLDggKzg0NiwxMCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsIHByZXBhcmUgZm9yIG5leHQgKi8KLQorCQkvKgorCQkgKiBBbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgLS0gT3AgaXMgY29tcGxldGUsCisJCSAqIHByZXBhcmUgZm9yIG5leHQKKwkJICovCiAJCXdhbGtfc3RhdGUtPm9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKTsKIAkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX05BTUVEKSB7CiAJCQlpZiAoYWNwaV9nYmxfZGVwdGgpIHsKQEAgLTg4MCw5ICs5MTYsOCBAQAogCiAJCWNhc2UgQUVfQ1RSTF9UUkFOU0ZFUjoKIAotCQkJLyoKLQkJCSAqIFdlIGFyZSBhYm91dCB0byB0cmFuc2ZlciB0byBhIGNhbGxlZCBtZXRob2QuCi0JCQkgKi8KKwkJCS8qIFdlIGFyZSBhYm91dCB0byB0cmFuc2ZlciB0byBhIGNhbGxlZCBtZXRob2QuICovCisKIAkJCXdhbGtfc3RhdGUtPnByZXZfb3AgPSBvcDsKIAkJCXdhbGtfc3RhdGUtPnByZXZfYXJnX3R5cGVzID0gd2Fsa19zdGF0ZS0+YXJnX3R5cGVzOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMTA1MSwxMCArMTA4Niw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfcGFyc2VfYW1sCiAgKgotICogUEFSQU1FVEVSUzogIHN0YXJ0X3Njb3BlICAgICAtIFRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgcGFyc2UuICBCZWNvbWVzIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBhcnNlZCBvcCB0cmVlLgotICogICAgICAgICAgICAgIEFtbCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgY29kZSB0byBwYXJzZQotICogICAgICAgICAgICAgIGFtbF9zaXplICAgICAgICAtIExlbmd0aCBvZiB0aGUgQU1MIHRvIHBhcnNlCisgKiBQQVJBTUVURVJTOiAgd2Fsa19zdGF0ZSAgICAgIC0gQ3VycmVudCBzdGF0ZQogICoKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCkBAIC0xMDc2LDggKzExMDgsMTAgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJwc19wYXJzZV9hbWwiKTsKIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiRW50ZXJlZCB3aXRoIHdhbGtfc3RhdGU9JXAgQW1sPSVwIHNpemU9JVhcbiIsCi0JCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc2l6ZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAorCQkiRW50ZXJlZCB3aXRoIHdhbGtfc3RhdGU9JXAgQW1sPSVwIHNpemU9JVhcbiIsCisJCXdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCisJCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc2l6ZSkpOwogCiAKIAkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdGhyZWFkIHN0YXRlICovCkBAIC0xMTQyLDkgKzExNzYsMTAgQEAKIAkJCWlmICgoc3RhdHVzID09IEFFX0FMUkVBRFlfRVhJU1RTKSAmJgogCQkJCSghd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CiAJCQkJLyoKLQkJCQkgKiBUaGlzIG1ldGhvZCBpcyBtYXJrZWQgbm90X3NlcmlhbGl6ZWQsIGJ1dCBpdCB0cmllZCB0byBjcmVhdGUgYSBuYW1lZAotCQkJCSAqIG9iamVjdCwgY2F1c2luZyB0aGUgc2Vjb25kIHRocmVhZCBlbnRyYW5jZSB0byBmYWlsLiAgV2Ugd2lsbCB3b3JrYXJvdW5kCi0JCQkJICogdGhpcyBieSBtYXJraW5nIHRoZSBtZXRob2QgcGVybWFuZW50bHkgYXMgU2VyaWFsaXplZC4KKwkJCQkgKiBUaGlzIG1ldGhvZCBpcyBtYXJrZWQgbm90X3NlcmlhbGl6ZWQsIGJ1dCBpdCB0cmllZCB0byBjcmVhdGUKKwkJCQkgKiBhIG5hbWVkIG9iamVjdCwgY2F1c2luZyB0aGUgc2Vjb25kIHRocmVhZCBlbnRyYW5jZSB0byBmYWlsLgorCQkJCSAqIFdlIHdpbGwgd29ya2Fyb3VuZCB0aGlzIGJ5IG1hcmtpbmcgdGhlIG1ldGhvZCBwZXJtYW5lbnRseQorCQkJCSAqIGFzIFNlcmlhbGl6ZWQuCiAJCQkJICovCiAJCQkJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgfD0gQU1MX01FVEhPRF9TRVJJQUxJWkVEOwogCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPSAxOwpAQCAtMTE4Nyw3ICsxMjIyLDggQEAKIAogCQlwcmV2aW91c193YWxrX3N0YXRlID0gd2Fsa19zdGF0ZTsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9QQVJTRSwgInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAorCQkJInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCiAJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYywgd2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiwgd2Fsa19zdGF0ZSkpOwogCiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgcmVzdGFydGVkIGEgcHJlZW1wdGVkIHdhbGsgKi8KQEAgLTEyMzEsMTIgKzEyNjcsMTQgQEAKIAkJICovCiAJCWVsc2UgaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYykgewogCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKLQkJCQkqKHByZXZpb3VzX3dhbGtfc3RhdGUtPmNhbGxlcl9yZXR1cm5fZGVzYykgPSBwcmV2aW91c193YWxrX3N0YXRlLT5pbXBsaWNpdF9yZXR1cm5fb2JqOworCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9CisJCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmo7CiAJCQl9CiAJCQllbHNlIHsKIAkJCQkgLyogTlVMTCBpZiBubyByZXR1cm4gdmFsdWUgKi8KIAotCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9IHByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOworCQkJCSoocHJldmlvdXNfd2Fsa19zdGF0ZS0+Y2FsbGVyX3JldHVybl9kZXNjKSA9CisJCQkJCXByZXZpb3VzX3dhbGtfc3RhdGUtPnJldHVybl9kZXNjOwogCQkJfQogCQl9CiAJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3Njb3BlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwppbmRleCBkY2JlZDQ5Li44ZGNkMWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwpAQCAtNjUsNiArNjUsNyBAQAogYWNwaV9wc19nZXRfcGFyZW50X3Njb3BlICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpCiB7CisKIAlyZXR1cm4gKHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLm9wKTsKIH0KIApAQCAtODcsOCArODgsMTAgQEAKIGFjcGlfcHNfaGFzX2NvbXBsZXRlZF9zY29wZSAoCiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKQogewotCXJldHVybiAoKHU4KSAoKHBhcnNlcl9zdGF0ZS0+YW1sID49IHBhcnNlcl9zdGF0ZS0+c2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19lbmQgfHwKLQkJCSAgICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7CisKKwlyZXR1cm4gKCh1OCkKKwkJCSgocGFyc2VyX3N0YXRlLT5hbWwgPj0gcGFyc2VyX3N0YXRlLT5zY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2VuZCB8fAorCQkJICFwYXJzZXJfc3RhdGUtPnNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQpKSk7CiB9CiAKIApAQCAtMTY3LDIzICsxNzAsMjMgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19NRU1PUlkpOwogCX0KIAotCXNjb3BlLT5jb21tb24uZGF0YV90eXBlICAgICAgICA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKLQlzY29wZS0+cGFyc2Vfc2NvcGUub3AgICAgICAgICAgPSBvcDsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3QgICAgPSByZW1haW5pbmdfYXJnczsKLQlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ICAgPSBhcmdfY291bnQ7Ci0Jc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQgICAgID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOworCXNjb3BlLT5jb21tb24uZGF0YV90eXBlICAgID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUFNDT1BFOworCXNjb3BlLT5wYXJzZV9zY29wZS5vcCAgICAgID0gb3A7CisJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0ID0gcmVtYWluaW5nX2FyZ3M7CisJc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudCA9IGFyZ19jb3VudDsKKwlzY29wZS0+cGFyc2Vfc2NvcGUucGtnX2VuZCA9IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZDsKIAogCS8qIFB1c2ggb250byBzY29wZSBzdGFjayAqLwogCiAJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlLCBzY29wZSk7CiAKIAlpZiAoYXJnX2NvdW50ID09IEFDUElfVkFSX0FSR1MpIHsKLQkJLyogbXVsdGlwbGUgYXJndW1lbnRzICovCisJCS8qIE11bHRpcGxlIGFyZ3VtZW50cyAqLwogCiAJCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwogCX0KIAllbHNlIHsKLQkJLyogc2luZ2xlIGFyZ3VtZW50ICovCisJCS8qIFNpbmdsZSBhcmd1bWVudCAqLwogCiAJCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gQUNQSV9UT19QT0lOVEVSIChBQ1BJX01BWF9QVFIpOwogCX0KQEAgLTIyMSwxOCArMjI0LDE3IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInBzX3BvcF9zY29wZSIpOwogCiAKLQkvKgotCSAqIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZQotCSAqLworCS8qIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZSAqLworCiAJaWYgKHNjb3BlLT5jb21tb24ubmV4dCkgewogCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUgKCZwYXJzZXJfc3RhdGUtPnNjb3BlKTsKIAogCQkvKiByZXR1cm4gdG8gcGFyc2luZyBwcmV2aW91cyBvcCAqLwogCi0JCSpvcCAgICAgICAgICAgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOwotCQkqYXJnX2xpc3QgICAgICAgICAgICAgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5hcmdfbGlzdDsKLQkJKmFyZ19jb3VudCAgICAgICAgICAgICAgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50OwotCQlwYXJzZXJfc3RhdGUtPnBrZ19lbmQgICA9IHNjb3BlLT5wYXJzZV9zY29wZS5wa2dfZW5kOworCQkqb3AgICAgICAgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOworCQkqYXJnX2xpc3QgICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19saXN0OworCQkqYXJnX2NvdW50ICAgICAgICAgID0gc2NvcGUtPnBhcnNlX3Njb3BlLmFyZ19jb3VudDsKKwkJcGFyc2VyX3N0YXRlLT5wa2dfZW5kID0gc2NvcGUtPnBhcnNlX3Njb3BlLnBrZ19lbmQ7CiAKIAkJLyogQWxsIGRvbmUgd2l0aCB0aGlzIHNjb3BlIHN0YXRlIHN0cnVjdHVyZSAqLwogCkBAIC0yNDEsMTIgKzI0MywxMyBAQAogCWVsc2UgewogCQkvKiBlbXB0eSBwYXJzZSBzdGFjaywgcHJlcGFyZSB0byBmZXRjaCBuZXh0IG9wY29kZSAqLwogCi0JCSpvcCAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKLQkJKmFyZ19saXN0ICAgICAgICAgICAgICAgPSAwOwotCQkqYXJnX2NvdW50ICAgICAgICAgICAgICA9IDA7CisJCSpvcCAgICAgICA9IE5VTEw7CisJCSphcmdfbGlzdCA9IDA7CisJCSphcmdfY291bnQgPSAwOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLCAiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1BBUlNFLAorCQkiUG9wcGVkIE9wICVwIEFyZ3MgJVhcbiIsICpvcCwgKmFyZ19jb3VudCkpOwogCXJldHVybl9WT0lEOwogfQogCkBAIC0yNTcsNyArMjYwLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgcGFyc2VyX3N0YXRlICAgICAgICAtIEN1cnJlbnQgcGFyc2VyIHN0YXRlIG9iamVjdAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IERlc3Ryb3kgYXZhaWxhYmxlIGxpc3QsIHJlbWFpbmluZyBzdGFjayBsZXZlbHMsIGFuZCByZXR1cm4KICAqICAgICAgICAgICAgICByb290IHNjb3BlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYwppbmRleCAyMTQwYmQxLi5kNWFhZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKQEAgLTQ5LDYgKzQ5LDE0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9QQVJTRVIKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInBzdHJlZSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCit1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCithY3BpX3BzX2dldF9jaGlsZCAoCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOworI2VuZGlmCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01Nyw3ICs2NSw3IEBACiAgKiBQQVJBTUVURVJTOiAgT3AgICAgICAgICAgICAgIC0gR2V0IGFuIGFyZ3VtZW50IGZvciB0aGlzIG9wCiAgKiAgICAgICAgICAgICAgQXJnbiAgICAgICAgICAgIC0gTnRoIGFyZ3VtZW50IHRvIGdldAogICoKLSAqIFJFVFVSTjogICAgICBUaGUgYXJndW1lbnQgKGFzIGFuIE9wIG9iamVjdCkuICBOVUxMIGlmIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0CisgKiBSRVRVUk46ICAgICAgVGhlIGFyZ3VtZW50IChhcyBhbiBPcCBvYmplY3QpLiBOVUxMIGlmIGFyZ3VtZW50IGRvZXMgbm90IGV4aXN0CiAgKgogICogREVTQ1JJUFRJT046IEdldCB0aGUgc3BlY2lmaWVkIG9wJ3MgYXJndW1lbnQuCiAgKgpAQCAtMTUyLDcgKzE2MCw2IEBACiAJCXJldHVybjsKIAl9CiAKLQogCS8qIEFwcGVuZCB0aGUgYXJndW1lbnQgdG8gdGhlIGxpbmtlZCBhcmd1bWVudCBsaXN0ICovCiAKIAlpZiAob3AtPmNvbW1vbi52YWx1ZS5hcmcpIHsKQEAgLTE2NCwxNCArMTcxLDEyIEBACiAJCX0KIAkJcHJldl9hcmctPmNvbW1vbi5uZXh0ID0gYXJnOwogCX0KLQogCWVsc2UgewogCQkvKiBObyBhcmd1bWVudCBsaXN0LCB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGFyZ3VtZW50ICovCiAKIAkJb3AtPmNvbW1vbi52YWx1ZS5hcmcgPSBhcmc7CiAJfQogCi0KIAkvKiBTZXQgdGhlIHBhcmVudCBpbiB0aGlzIGFyZyBhbmQgYW55IGFyZ3MgbGlua2VkIGFmdGVyIGl0ICovCiAKIAl3aGlsZSAoYXJnKSB7CkBAIC0xODIsNyArMTg3LDgyIEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9kZXB0aF9uZXh0CisgKgorICogUEFSQU1FVEVSUzogIE9yaWdpbiAgICAgICAgICAtIFJvb3Qgb2Ygc3VidHJlZSB0byBzZWFyY2gKKyAqICAgICAgICAgICAgICBPcCAgICAgICAgICAgICAgLSBMYXN0IChwcmV2aW91cykgT3AgdGhhdCB3YXMgZm91bmQKKyAqCisgKiBSRVRVUk46ICAgICAgTmV4dCBPcCBmb3VuZCBpbiB0aGUgc2VhcmNoLgorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgbmV4dCBvcCBpbiB0cmVlICh3YWxraW5nIHRoZSB0cmVlIGluIGRlcHRoLWZpcnN0IG9yZGVyKQorICogICAgICAgICAgICAgIFJldHVybiBOVUxMIHdoZW4gcmVhY2hpbmcgIm9yaWdpbiIgb3Igd2hlbiB3YWxraW5nIHVwIGZyb20gcm9vdAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3VuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKK2FjcGlfcHNfZ2V0X2RlcHRoX25leHQgKAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9yaWdpbiwKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCkKK3sKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpuZXh0ID0gTlVMTDsKKwl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpwYXJlbnQ7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqYXJnOworCisKKwlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOworCisKKwlpZiAoIW9wKSB7CisJCXJldHVybiAoTlVMTCk7CisJfQorCisJLyogTG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgKi8KKworCW5leHQgPSBhY3BpX3BzX2dldF9hcmcgKG9wLCAwKTsKKwlpZiAobmV4dCkgeworCQlyZXR1cm4gKG5leHQpOworCX0KKworCS8qIExvb2sgZm9yIGEgc2libGluZyAqLworCisJbmV4dCA9IG9wLT5jb21tb24ubmV4dDsKKwlpZiAobmV4dCkgeworCQlyZXR1cm4gKG5leHQpOworCX0KKworCS8qIExvb2sgZm9yIGEgc2libGluZyBvZiBwYXJlbnQgKi8KKworCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OworCisJd2hpbGUgKHBhcmVudCkgeworCQlhcmcgPSBhY3BpX3BzX2dldF9hcmcgKHBhcmVudCwgMCk7CisJCXdoaWxlIChhcmcgJiYgKGFyZyAhPSBvcmlnaW4pICYmIChhcmcgIT0gb3ApKSB7CisJCQlhcmcgPSBhcmctPmNvbW1vbi5uZXh0OworCQl9CisKKwkJaWYgKGFyZyA9PSBvcmlnaW4pIHsKKwkJCS8qIFJlYWNoZWQgcGFyZW50IG9mIG9yaWdpbiwgZW5kIHNlYXJjaCAqLworCisJCQlyZXR1cm4gKE5VTEwpOworCQl9CisKKwkJaWYgKHBhcmVudC0+Y29tbW9uLm5leHQpIHsKKwkJCS8qIEZvdW5kIHNpYmxpbmcgb2YgcGFyZW50ICovCisKKwkJCXJldHVybiAocGFyZW50LT5jb21tb24ubmV4dCk7CisJCX0KKworCQlvcCA9IHBhcmVudDsKKwkJcGFyZW50ID0gcGFyZW50LT5jb21tb24ucGFyZW50OworCX0KKworCXJldHVybiAobmV4dCk7Cit9CisKKworI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3BzX2dldF9jaGlsZApAQCAtMTk0LDYgKzI3NCw3IEBACiAgKiBERVNDUklQVElPTjogR2V0IG9wJ3MgY2hpbGRyZW4gb3IgTlVMTCBpZiBub25lCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgogYWNwaV9wc19nZXRfY2hpbGQgKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKQpAQCAtMjQ3LDgxICszMjgsNyBAQAogCiAJcmV0dXJuIChjaGlsZCk7CiB9Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9wc19nZXRfZGVwdGhfbmV4dAotICoKLSAqIFBBUkFNRVRFUlM6ICBPcmlnaW4gICAgICAgICAgLSBSb290IG9mIHN1YnRyZWUgdG8gc2VhcmNoCi0gKiAgICAgICAgICAgICAgT3AgICAgICAgICAgICAgIC0gTGFzdCAocHJldmlvdXMpIE9wIHRoYXQgd2FzIGZvdW5kCi0gKgotICogUkVUVVJOOiAgICAgIE5leHQgT3AgZm91bmQgaW4gdGhlIHNlYXJjaC4KLSAqCi0gKiBERVNDUklQVElPTjogR2V0IG5leHQgb3AgaW4gdHJlZSAod2Fsa2luZyB0aGUgdHJlZSBpbiBkZXB0aC1maXJzdCBvcmRlcikKLSAqICAgICAgICAgICAgICBSZXR1cm4gTlVMTCB3aGVuIHJlYWNoaW5nICJvcmlnaW4iIG9yIHdoZW4gd2Fsa2luZyB1cCBmcm9tIHJvb3QKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCi1hY3BpX3BzX2dldF9kZXB0aF9uZXh0ICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCi17Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dCA9IE5VTEw7Ci0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcGFyZW50OwotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZzsKLQotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSAoKTsKLQotCi0JaWYgKCFvcCkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCS8qIGxvb2sgZm9yIGFuIGFyZ3VtZW50IG9yIGNoaWxkICovCi0KLQluZXh0ID0gYWNwaV9wc19nZXRfYXJnIChvcCwgMCk7Ci0JaWYgKG5leHQpIHsKLQkJcmV0dXJuIChuZXh0KTsKLQl9Ci0KLQkvKiBsb29rIGZvciBhIHNpYmxpbmcgKi8KLQotCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7Ci0JaWYgKG5leHQpIHsKLQkJcmV0dXJuIChuZXh0KTsKLQl9Ci0KLQkvKiBsb29rIGZvciBhIHNpYmxpbmcgb2YgcGFyZW50ICovCi0KLQlwYXJlbnQgPSBvcC0+Y29tbW9uLnBhcmVudDsKLQotCXdoaWxlIChwYXJlbnQpIHsKLQkJYXJnID0gYWNwaV9wc19nZXRfYXJnIChwYXJlbnQsIDApOwotCQl3aGlsZSAoYXJnICYmIChhcmcgIT0gb3JpZ2luKSAmJiAoYXJnICE9IG9wKSkgewotCQkJYXJnID0gYXJnLT5jb21tb24ubmV4dDsKLQkJfQotCi0JCWlmIChhcmcgPT0gb3JpZ2luKSB7Ci0JCQkvKiByZWFjaGVkIHBhcmVudCBvZiBvcmlnaW4sIGVuZCBzZWFyY2ggKi8KLQotCQkJcmV0dXJuIChOVUxMKTsKLQkJfQotCi0JCWlmIChwYXJlbnQtPmNvbW1vbi5uZXh0KSB7Ci0JCQkvKiBmb3VuZCBzaWJsaW5nIG9mIHBhcmVudCAqLwotCi0JCQlyZXR1cm4gKHBhcmVudC0+Y29tbW9uLm5leHQpOwotCQl9Ci0KLQkJb3AgPSBwYXJlbnQ7Ci0JCXBhcmVudCA9IHBhcmVudC0+Y29tbW9uLnBhcmVudDsKLQl9Ci0KLQlyZXR1cm4gKG5leHQpOwotfQorI2VuZGlmCiAKICNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCmluZGV4IGIzNTk3Y2IuLmExMGY4ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCkBAIC00NSw3ICs0NSw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BhcnNlci5oPgogI2luY2x1ZGUgPGFjcGkvYW1sY29kZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfUEFSU0VSCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJwc3V0aWxzIikKQEAgLTU3LDcgKzU2LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBzY29wZV9vcAorICogUkVUVVJOOiAgICAgIEEgbmV3IFNjb3BlIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIFNjb3BlIGFuZCBhc3NvY2lhdGVkIG5hbWVwYXRoIG9wIHdpdGggdGhlIHJvb3QgbmFtZQogICoKQEAgLTc1LDcgKzc0LDYgQEAKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQogCXNjb3BlX29wLT5uYW1lZC5uYW1lID0gQUNQSV9ST09UX05BTUU7CiAJcmV0dXJuIChzY29wZV9vcCk7CiB9CkBAIC04OCwxMCArODYsOSBAQAogICogUEFSQU1FVEVSUzogIE9wICAgICAgICAgICAgICAtIEEgbmV3bHkgYWxsb2NhdGVkIE9wIG9iamVjdAogICogICAgICAgICAgICAgIE9wY29kZSAgICAgICAgICAtIE9wY29kZSB0byBzdG9yZSBpbiB0aGUgT3AKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbiBhY3BpX29wLCBjaG9vc2Ugb3AgdHlwZSAoYW5kIHRodXMgc2l6ZSkgYmFzZWQgb24KLSAqICAgICAgICAgICAgICBvcGNvZGUKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGEgcGFyc2UgKE9wKSBvYmplY3QKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMDcsNyArMTA0LDggQEAKIAlvcC0+Y29tbW9uLmFtbF9vcGNvZGUgPSBvcGNvZGU7CiAKIAlBQ1BJX0RJU0FTTV9PTkxZX01FTUJFUlMgKEFDUElfU1RSTkNQWSAob3AtPmNvbW1vbi5hbWxfb3BfbmFtZSwKLQkJCShhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKSktPm5hbWUsIHNpemVvZiAob3AtPmNvbW1vbi5hbWxfb3BfbmFtZSkpKTsKKwkJCShhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAob3Bjb2RlKSktPm5hbWUsCisJCQkJc2l6ZW9mIChvcC0+Y29tbW9uLmFtbF9vcF9uYW1lKSkpOwogfQogCiAKQEAgLTExNyw3ICsxMTUsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgLSBPcGNvZGUgdGhhdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbmV3IE9wCiAgKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gdGhlIG5ldyBPcC4KKyAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgT3AsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBBbGxvY2F0ZSBhbiBhY3BpX29wLCBjaG9vc2Ugb3AgdHlwZSAoYW5kIHRodXMgc2l6ZSkgYmFzZWQgb24KICAqICAgICAgICAgICAgICBvcGNvZGUuICBBIGNhY2hlIG9mIG9wY29kZXMgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHVyZQpAQCAtMjc1LDcgKzI3Myw2IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApCiB7CiAKLQogCS8qIFRoZSAiZ2VuZXJpYyIgb2JqZWN0IGhhcyBubyBuYW1lIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwogCiAJaWYgKG9wLT5jb21tb24uZmxhZ3MgJiBBQ1BJX1BBUlNFT1BfR0VORVJJQykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKaW5kZXggMTEwZDJjZS4uOWQyMGNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCkBAIC05MCwxNyArOTAsMTUgQEAKIAkJCX0KIAkJfQogCi0JCS8qCi0JCSAqIE5vIG1vcmUgY2hpbGRyZW4sIHRoaXMgT3AgaXMgY29tcGxldGUuCi0JCSAqLworCQkvKiBObyBtb3JlIGNoaWxkcmVuLCB0aGlzIE9wIGlzIGNvbXBsZXRlLiAqLworCiAJCW5leHQgPSBvcC0+Y29tbW9uLm5leHQ7CiAJCXBhcmVudCA9IG9wLT5jb21tb24ucGFyZW50OwogCiAJCWFjcGlfcHNfZnJlZV9vcCAob3ApOwogCi0JCS8qCi0JCSAqIElmIHdlIGFyZSBiYWNrIHRvIHRoZSBzdGFydGluZyBwb2ludCwgdGhlIHdhbGsgaXMgY29tcGxldGUuCi0JCSAqLworCQkvKiBJZiB3ZSBhcmUgYmFjayB0byB0aGUgc3RhcnRpbmcgcG9pbnQsIHRoZSB3YWxrIGlzIGNvbXBsZXRlLiAqLworCiAJCWlmIChvcCA9PSBzdWJ0cmVlX3Jvb3QpIHsKIAkJCXJldHVybl9WT0lEOwogCQl9CkBAIC0xMTEsNSArMTA5LDYgQEAKIAkJCW9wID0gcGFyZW50OwogCQl9CiAJfQorCiAJcmV0dXJuX1ZPSUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCmluZGV4IGIzMThhZDIuLmRiYTg5MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCkBAIC01NywxMyArNTcsMTYgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc3hfZXhlY3V0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBJbmZvLT5Ob2RlICAgICAgICAgIC0gQSBtZXRob2Qgb2JqZWN0IGNvbnRhaW5pbmcgYm90aCB0aGUgQU1MCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgYW5kIGxlbmd0aC4KLSAqICAgICAgICAgICAgICAqKlBhcmFtcyAgICAgICAgICAgIC0gTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHBhc3MgdG8gbWV0aG9kLAorICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKKyAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQorICogICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuIFBhcmFtcyBpdHNlbGYgbWF5IGJlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICogICAgICAgICAgICAgICoqcmV0dXJuX29ial9kZXNjICAgLSBSZXR1cm4gb2JqZWN0IGZyb20gZXhlY3V0aW9uIG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuCisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgorICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0CisgKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0xOTYsOSArMTk5LDggQEAKIAkJZ290byBjbGVhbnVwMzsKIAl9CiAKLQkvKgotCSAqIFRoZSB3YWxrIG9mIHRoZSBwYXJzZSB0cmVlIGlzIHdoZXJlIHdlIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIG1ldGhvZAotCSAqLworCS8qIFRoZSB3YWxrIG9mIHRoZSBwYXJzZSB0cmVlIGlzIHdoZXJlIHdlIGFjdHVhbGx5IGV4ZWN1dGUgdGhlIG1ldGhvZCAqLworCiAJc3RhdHVzID0gYWNwaV9wc19wYXJzZV9hbWwgKHdhbGtfc3RhdGUpOwogCWdvdG8gY2xlYW51cDI7IC8qIFdhbGsgc3RhdGUgYWxyZWFkeSBkZWxldGVkICovCiAKQEAgLTIxNyw3ICsyMTksOCBAQAogCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKIAkJCS8qIElnbm9yZSBlcnJvcnMsIGp1c3QgZG8gdGhlbSBhbGwgKi8KIAotCQkJKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKGluZm8tPnBhcmFtZXRlcnNbaV0sIFJFRl9ERUNSRU1FTlQpOworCQkJKHZvaWQpIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAorCQkJCQkgaW5mby0+cGFyYW1ldGVyc1tpXSwgUkVGX0RFQ1JFTUVOVCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKaW5kZXggNWQxOWIzOS4uNTE0OGYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKQEAgLTYxLDE1ICs2MSwxNCBAQAogCiAKIC8qKgotICogYWNwaV9vc19nZXRfcGNpX2lkCisgKiBhY3BpX2dldF9wY2lfaWQKICAqIC0tLS0tLS0tLS0tLS0tLS0tLQogICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZSBBQ1BJIEludGVycHJldGVyIChhLmsuYS4gQ29yZSBTdWJzeXN0ZW0pCiAgKiB0byByZXNvbHZlIFBDSSBpbmZvcm1hdGlvbiBmb3IgQUNQSS1QQ0kgZGV2aWNlcyBkZWZpbmVkIGluIHRoZSBuYW1lc3BhY2UuCiAgKiBUaGlzIHR5cGljYWxseSBvY2N1cnMgd2hlbiByZXNvbHZpbmcgUENJIG9wZXJhdGlvbiByZWdpb24gaW5mb3JtYXRpb24uCiAgKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKLWFjcGlfb3NfZ2V0X3BjaV9pZCAoCithY3BpX2dldF9wY2lfaWQgKAogCWFjcGlfaGFuZGxlCQloYW5kbGUsCiAJc3RydWN0IGFjcGlfcGNpX2lkCSppZCkKIHsKQEAgLTc4LDcgKzc3LDcgQEAKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKmRldmljZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcGNpX2RhdGEJKmRhdGEgPSBOVUxMOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9vc19nZXRfcGNpX2lkIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfcGNpX2lkIik7CiAKIAlpZiAoIWlkKQogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC05Miw3ICs5MSw3IEBACiAJfQogCiAJc3RhdHVzID0gYWNwaV9nZXRfZGF0YShoYW5kbGUsIGFjcGlfcGNpX2RhdGFfaGFuZGxlciwgKHZvaWQqKikgJmRhdGEpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSB8fCAhZGF0YSB8fCAhZGF0YS0+ZGV2KSB7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpIHx8ICFkYXRhKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsIAogCQkJIkludmFsaWQgQUNQSS1QQ0kgY29udGV4dCBmb3IgZGV2aWNlICVzXG4iLAogCQkJYWNwaV9kZXZpY2VfYmlkKGRldmljZSkpKTsKQEAgLTExNSw3ICsxMTQsNyBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wY2lfaWQpOwogCiAJCiBpbnQKQEAgLTEyOSw2ICsxMjgsOCBAQAogCWNoYXIJCQkqcGF0aG5hbWUgPSBOVUxMOwogCXN0cnVjdCBhY3BpX2J1ZmZlcglidWZmZXIgPSB7MCwgTlVMTH07CiAJYWNwaV9oYW5kbGUJCWhhbmRsZSA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYJCSpkZXY7CisJc3RydWN0IHBjaV9idXMgCQkqYnVzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wY2lfYmluZCIpOwogCkBAIC0xOTMsOCArMTk0LDIwIEBACiAJICogTG9jYXRlIG1hdGNoaW5nIGRldmljZSBpbiBQQ0kgbmFtZXNwYWNlLiAgSWYgaXQgZG9lc24ndCBleGlzdAogCSAqIHRoaXMgdHlwaWNhbGx5IG1lYW5zIHRoYXQgdGhlIGRldmljZSBpc24ndCBjdXJyZW50bHkgaW5zZXJ0ZWQKIAkgKiAoZS5nLiBkb2NraW5nIHN0YXRpb24sIHBvcnQgcmVwbGljYXRvciwgZXRjLikuCisJICogV2UgY2Fubm90IHNpbXBseSBzZWFyY2ggdGhlIGdsb2JhbCBwY2kgZGV2aWNlIGxpc3QsIHNpbmNlCisJICogUENJIGRldmljZXMgYXJlIGFkZGVkIHRvIHRoZSBnbG9iYWwgcGNpIGxpc3Qgd2hlbiB0aGUgcm9vdAorCSAqIGJyaWRnZSBzdGFydCBvcHMgYXJlIHJ1biwgd2hpY2ggbWF5IG5vdCBoYXZlIGhhcHBlbmVkIHlldC4KIAkgKi8KLQlkYXRhLT5kZXYgPSBwY2lfZmluZF9zbG90KGRhdGEtPmlkLmJ1cywgUENJX0RFVkZOKGRhdGEtPmlkLmRldmljZSwgZGF0YS0+aWQuZnVuY3Rpb24pKTsKKwlidXMgPSBwY2lfZmluZF9idXMoZGF0YS0+aWQuc2VnbWVudCwgZGF0YS0+aWQuYnVzKTsKKwlpZiAoYnVzKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQkJaWYgKGRldi0+ZGV2Zm4gPT0gUENJX0RFVkZOKGRhdGEtPmlkLmRldmljZSwKKwkJCQkJCWRhdGEtPmlkLmZ1bmN0aW9uKSkgeworCQkJCWRhdGEtPmRldiA9IGRldjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KIAlpZiAoIWRhdGEtPmRldikgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sIAogCQkJIkRldmljZSAlMDJ4OiUwMng6JTAyeC4lMDJ4IG5vdCBwcmVzZW50IGluIFBDSSBuYW1lc3BhY2VcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2lycS5jIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwppbmRleCA4MDkzZjJlLi5kMWY0MmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKQEAgLTQzMyw4ICs0MzMsOSBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiUENJIEludGVycnVwdCAlc1slY106IG5vIEdTSSIsCiAJCQlwY2lfbmFtZShkZXYpLCAoJ0EnICsgcGluKSk7CiAJCS8qIEludGVycnVwdCBMaW5lIHZhbHVlcyBhYm92ZSAweEYgYXJlIGZvcmJpZGRlbiAqLwotCQlpZiAoZGV2LT5pcnEgPj0gMCAmJiAoZGV2LT5pcnEgPD0gMHhGKSkgeworCQlpZiAoZGV2LT5pcnEgPiAwICYmIChkZXYtPmlycSA8PSAweEYpKSB7CiAJCQlwcmludGsoIiAtIHVzaW5nIElSUSAlZFxuIiwgZGV2LT5pcnEpOworCQkJYWNwaV9yZWdpc3Rlcl9nc2koZGV2LT5pcnEsIEFDUElfTEVWRUxfU0VOU0lUSVZFLCBBQ1BJX0FDVElWRV9MT1cpOwogCQkJcmV0dXJuX1ZBTFVFKDApOwogCQl9CiAJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwppbmRleCA1MjBiMjhhLi42YWQwZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYwpAQCAtNzIsMTAgKzcyLDEyIEBACiAJdTgJCQlhY3RpdmU7CQkJLyogQ3VycmVudCBJUlEgKi8KIAl1OAkJCWVkZ2VfbGV2ZWw7CQkvKiBBbGwgSVJRcyAqLwogCXU4CQkJYWN0aXZlX2hpZ2hfbG93OwkvKiBBbGwgSVJRcyAqLwotCXU4CQkJaW5pdGlhbGl6ZWQ7CiAJdTgJCQlyZXNvdXJjZV90eXBlOwogCXU4CQkJcG9zc2libGVfY291bnQ7CiAJdTgJCQlwb3NzaWJsZVtBQ1BJX1BDSV9MSU5LX01BWF9QT1NTSUJMRV07CisJdTgJCQlpbml0aWFsaXplZDoxOworCXU4CQkJc3VzcGVuZF9yZXN1bWU6MTsKKwl1OAkJCXJlc2VydmVkOjY7CiB9OwogCiBzdHJ1Y3QgYWNwaV9wY2lfbGluayB7CkBAIC01MzAsNiArNTMyLDEwIEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9saW5rX2FsbG9jYXRlIik7CiAKKwlpZiAobGluay0+aXJxLnN1c3BlbmRfcmVzdW1lKSB7CisJCWFjcGlfcGNpX2xpbmtfc2V0KGxpbmssIGxpbmstPmlycS5hY3RpdmUpOworCQlsaW5rLT5pcnEuc3VzcGVuZF9yZXN1bWUgPSAwOworCX0KIAlpZiAobGluay0+aXJxLmluaXRpYWxpemVkKQogCQlyZXR1cm5fVkFMVUUoMCk7CiAKQEAgLTcxMywzOCArNzE5LDI0IEBACiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CiAKLQogc3RhdGljIGludAotYWNwaV9wY2lfbGlua19yZXN1bWUgKAotCXN0cnVjdCBhY3BpX3BjaV9saW5rCSpsaW5rKQotewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcGNpX2xpbmtfcmVzdW1lIik7Ci0JCi0JaWYgKGxpbmstPmlycS5hY3RpdmUgJiYgbGluay0+aXJxLmluaXRpYWxpemVkKQotCQlyZXR1cm5fVkFMVUUoYWNwaV9wY2lfbGlua19zZXQobGluaywgbGluay0+aXJxLmFjdGl2ZSkpOwotCWVsc2UKLQkJcmV0dXJuX1ZBTFVFKDApOwotfQotCi0KLXN0YXRpYyBpbnQKLWlycXJvdXRlcl9yZXN1bWUoCi0Jc3RydWN0IHN5c19kZXZpY2UgKmRldikKK2lycXJvdXRlcl9zdXNwZW5kKAorCXN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCisJdTMyCXN0YXRlKQogewogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICpub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9wY2lfbGluayAgICAqbGluayA9IE5VTEw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJpcnFyb3V0ZXJfcmVzdW1lIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSgiaXJxcm91dGVyX3N1c3BlbmQiKTsKIAogCWxpc3RfZm9yX2VhY2gobm9kZSwgJmFjcGlfbGluay5lbnRyaWVzKSB7Ci0KIAkJbGluayA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGFjcGlfcGNpX2xpbmssIG5vZGUpOwogCQlpZiAoIWxpbmspIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGxpbmsgY29udGV4dFxuIikpOwogCQkJY29udGludWU7CiAJCX0KLQotCQlhY3BpX3BjaV9saW5rX3Jlc3VtZShsaW5rKTsKKwkJaWYgKGxpbmstPmlycS5hY3RpdmUgJiYgbGluay0+aXJxLmluaXRpYWxpemVkKQorCQkJbGluay0+aXJxLnN1c3BlbmRfcmVzdW1lID0gMTsKIAl9CiAJcmV0dXJuX1ZBTFVFKDApOwogfQpAQCAtODEyLDkgKzgwNCwxMiBAQAogICogVGhlcmUgaXMgbm8gSVNBX1BPU1NJQkxFIHdlaWdodCwgc28gd2Ugc2ltcGx5IHVzZQogICogdGhlIChzbWFsbCkgUENJX1VTSU5HIHBlbmFsdHkuCiAgKi8KLXZvaWQgYWNwaV9wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCit2b2lkIGFjcGlfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewotCWFjcGlfaXJxX3BlbmFsdHlbaXJxXSArPSBQSVJRX1BFTkFMVFlfUENJX1VTSU5HOworCWlmIChhY3RpdmUpCisJCWFjcGlfaXJxX3BlbmFsdHlbaXJxXSArPSBQSVJRX1BFTkFMVFlfSVNBX1VTRUQ7CisJZWxzZQorCQlhY3BpX2lycV9wZW5hbHR5W2lycV0gKz0gUElSUV9QRU5BTFRZX1BDSV9VU0lORzsKIH0KIAogLyoKQEAgLTg1Niw3ICs4NTEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBpcnFyb3V0ZXJfc3lzZGV2X2NsYXNzID0gewogICAgICAgICBzZXRfa3NldF9uYW1lKCJpcnFyb3V0ZXIiKSwKLSAgICAgICAgLnJlc3VtZSA9IGlycXJvdXRlcl9yZXN1bWUsCisgICAgICAgIC5zdXNwZW5kID0gaXJxcm91dGVyX3N1c3BlbmQsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggN2U2YjhlMy4uNWQyZjc3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAogc3RhdGljIGludCBhY3BpX3BjaV9yb290X2FkZCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3BjaV9yb290X3JlbW92ZSAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9zdGFydCAoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX3Jvb3RfZHJpdmVyID0gewogCS5uYW1lID0JCUFDUElfUENJX1JPT1RfRFJJVkVSX05BTUUsCkBAIC01NCw2ICs1NSw3IEBACiAJLm9wcyA9CQl7CiAJCQkJLmFkZCA9ICAgIGFjcGlfcGNpX3Jvb3RfYWRkLAogCQkJCS5yZW1vdmUgPSBhY3BpX3BjaV9yb290X3JlbW92ZSwKKwkJCQkuc3RhcnQgPSAgYWNwaV9wY2lfcm9vdF9zdGFydCwKIAkJCX0sCiB9OwogCkBAIC0xNjksNiArMTcxLDcgQEAKIAlpZiAoIXJvb3QpCiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKIAltZW1zZXQocm9vdCwgMCwgc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9yb290KSk7CisJSU5JVF9MSVNUX0hFQUQoJnJvb3QtPm5vZGUpOwogCiAJcm9vdC0+aGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgQUNQSV9QQ0lfUk9PVF9ERVZJQ0VfTkFNRSk7CkBAIC0yOTgsMTIgKzMwMSwzMSBAQAogCQkJcm9vdC0+aWQuYnVzKTsKIAogZW5kOgotCWlmIChyZXN1bHQpCisJaWYgKHJlc3VsdCkgeworCQlpZiAoIWxpc3RfZW1wdHkoJnJvb3QtPm5vZGUpKQorCQkJbGlzdF9kZWwoJnJvb3QtPm5vZGUpOwogCQlrZnJlZShyb290KTsKKwl9CiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAorc3RhdGljIGludAorYWNwaV9wY2lfcm9vdF9zdGFydCAoCisJc3RydWN0IGFjcGlfZGV2aWNlCSpkZXZpY2UpCit7CisJc3RydWN0IGFjcGlfcGNpX3Jvb3QJKnJvb3Q7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3BjaV9yb290X3N0YXJ0Iik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJvb3QsICZhY3BpX3BjaV9yb290cywgbm9kZSkgeworCQlpZiAocm9vdC0+aGFuZGxlID09IGRldmljZS0+aGFuZGxlKSB7CisJCQlwY2lfYnVzX2FkZF9kZXZpY2VzKHJvb3QtPmJ1cyk7CisJCQlyZXR1cm5fVkFMVUUoMCk7CisJCX0KKwl9CisJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOworfQogCiBzdGF0aWMgaW50CiBhY3BpX3BjaV9yb290X3JlbW92ZSAoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IGY0Nzc4NzQuLmQ1NmE0MzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC0yNTYsNiArMjU2LDQzIEBACiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbiBBQ1BJIHByb2Nlc3NvciBmdWNudGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBfUERDIGlzIHJlcXVpcmVkIGZvciBhIEJJT1MtT1MgaGFuZHNoYWtlIGZvciBtb3N0IG9mIHRoZSBuZXdlcgorICogQUNQSSBwcm9jZXNzb3IgZmVhdHVyZXMuCisgKi8KKworaW50IGFjcGlfcHJvY2Vzc29yX3NldF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjX2luKQoreworCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKKwl1MzIJCQlhcmcwX2J1ZlszXTsKKwl1bmlvbiBhY3BpX29iamVjdAlhcmcwID0ge0FDUElfVFlQRV9CVUZGRVJ9OworCXN0cnVjdCBhY3BpX29iamVjdF9saXN0CW5vX29iamVjdCA9IHsxLCAmYXJnMH07CisJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QJKnBkYzsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX3NldF9wZGMiKTsKKworCWFyZzAuYnVmZmVyLmxlbmd0aCA9IDEyOworCWFyZzAuYnVmZmVyLnBvaW50ZXIgPSAodTggKikgYXJnMF9idWY7CisJYXJnMF9idWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKKwlhcmcwX2J1ZlsxXSA9IDA7CisJYXJnMF9idWZbMl0gPSAwOworCisJcGRjID0gKHBkY19pbikgPyBwZGNfaW4gOiAmbm9fb2JqZWN0OworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QocHItPmhhbmRsZSwgIl9QREMiLCBwZGMsIE5VTEwpOworCisJaWYgKChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgJiYgKHBkY19pbikpCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkVycm9yIGV2YWx1YXRpbmcgX1BEQywgdXNpbmcgbGVnYWN5IHBlcmYuIGNvbnRyb2wuLi5cbiIpKTsKKworCXJldHVybl9WQUxVRShzdGF0dXMpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNzIzLDcgKzc2MCw3IEBACiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKLQlhY3BpX2J1c19zY2FuKCpkZXZpY2UpOworCWFjcGlfYnVzX3N0YXJ0KCpkZXZpY2UpOwogCiAJcHIgPSBhY3BpX2RyaXZlcl9kYXRhKCpkZXZpY2UpOwogCWlmICghcHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IGM5ZDY3MWMuLjg5M2IwNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC02LDYgKzYsOCBAQAogICogIENvcHlyaWdodCAoQykgMjAwNCAgICAgICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0ICBBbmlsIFMgS2VzaGF2YW11cnRoeSA8YW5pbC5zLmtlc2hhdmFtdXJ0aHlAaW50ZWwuY29tPgogICogIAkJCS0gQWRkZWQgcHJvY2Vzc29yIGhvdHBsdWcgc3VwcG9ydAorICogIENvcHlyaWdodCAoQykgMjAwNSAgVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+CisgKiAgCQkJLSBBZGRlZCBzdXBwb3J0IGZvciBDMyBvbiBTTVAKICAqCiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICoKQEAgLTE0Miw3ICsxNDQsNyBAQAogCQlzd2l0Y2ggKG9sZC0+dHlwZSkgewogCQljYXNlIEFDUElfU1RBVEVfQzM6CiAJCQkvKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgcmVsb2FkICovCi0JCQlpZiAobmV3LT50eXBlICE9IEFDUElfU1RBVEVfQzMpCisJCQlpZiAobmV3LT50eXBlICE9IEFDUElfU1RBVEVfQzMgJiYgcHItPmZsYWdzLmJtX2NoZWNrKQogCQkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0JVU19NQVNURVJfUkxELCAwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTUyLDcgKzE1NCw3IEBACiAJc3dpdGNoIChuZXctPnR5cGUpIHsKIAljYXNlIEFDUElfU1RBVEVfQzM6CiAJCS8qIEVuYWJsZSBidXMgbWFzdGVyIHJlbG9hZCAqLwotCQlpZiAob2xkLT50eXBlICE9IEFDUElfU1RBVEVfQzMpCisJCWlmIChvbGQtPnR5cGUgIT0gQUNQSV9TVEFURV9DMyAmJiBwci0+ZmxhZ3MuYm1fY2hlY2spCiAJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCwgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwogCQlicmVhazsKIAl9CkBAIC0xNjMsNiArMTY1LDkgQEAKIH0KIAogCitzdGF0aWMgYXRvbWljX3QgCWMzX2NwdV9jb3VudDsKKworCiBzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlICh2b2lkKQogewogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIgPSBOVUxMOwpAQCAtMjk3LDggKzMwMiwyMiBAQAogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TVEFURV9DMzoKLQkJLyogRGlzYWJsZSBidXMgbWFzdGVyIGFyYml0cmF0aW9uICovCi0JCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAxLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCQorCQlpZiAocHItPmZsYWdzLmJtX2NoZWNrKSB7CisJCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJmMzX2NwdV9jb3VudCkgPT0KKwkJCQkJbnVtX29ubGluZV9jcHVzKCkpIHsKKwkJCQkvKgorCQkJCSAqIEFsbCBDUFVzIGFyZSB0cnlpbmcgdG8gZ28gdG8gQzMKKwkJCQkgKiBEaXNhYmxlIGJ1cyBtYXN0ZXIgYXJiaXRyYXRpb24KKwkJCQkgKi8KKwkJCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMSwKKwkJCQkJQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogU01QIHdpdGggbm8gc2hhcmVkIGNhY2hlLi4uIEludmFsaWRhdGUgY2FjaGUgICovCisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQl9CisJCQogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCiAJCXQxID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMzICovCkBAIC0zMDcsOCArMzI2LDEyIEBACiAJCXQyID0gaW5sKGFjcGlfZmFkdC54cG1fdG1yX2Jsay5hZGRyZXNzKTsKIAkJLyogR2V0IGVuZCB0aW1lICh0aWNrcykgKi8KIAkJdDIgPSBpbmwoYWNwaV9mYWR0LnhwbV90bXJfYmxrLmFkZHJlc3MpOwotCQkvKiBFbmFibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLwotCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19BUkJfRElTQUJMRSwgMCwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOworCQlpZiAocHItPmZsYWdzLmJtX2NoZWNrKSB7CisJCQkvKiBFbmFibGUgYnVzIG1hc3RlciBhcmJpdHJhdGlvbiAqLworCQkJYXRvbWljX2RlYygmYzNfY3B1X2NvdW50KTsKKwkJCWFjcGlfc2V0X3JlZ2lzdGVyKEFDUElfQklUUkVHX0FSQl9ESVNBQkxFLCAwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJCX0KKwogCQkvKiBSZS1lbmFibGUgaW50ZXJydXB0cyAqLwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCS8qIENvbXB1dGUgdGltZSAodGlja3MpIHRoYXQgd2Ugd2VyZSBhY3R1YWxseSBhc2xlZXAgKi8KQEAgLTUxOSw2ICs1NDIsMjkgQEAKIH0KIAogCitzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2RlZmF1bHRfYzEgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisJaW50IGk7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19kZWZhdWx0X2MxIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspCisJCW1lbXNldChwci0+cG93ZXIuc3RhdGVzLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4KSk7CisKKwkvKiBpZiBpbmZvIGlzIG9idGFpbmVkIGZyb20gcGJsay9mYWR0LCB0eXBlIGVxdWFscyBzdGF0ZSAqLworCXByLT5wb3dlci5zdGF0ZXNbQUNQSV9TVEFURV9DMV0udHlwZSA9IEFDUElfU1RBVEVfQzE7CisJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MyXS50eXBlID0gQUNQSV9TVEFURV9DMjsKKwlwci0+cG93ZXIuc3RhdGVzW0FDUElfU1RBVEVfQzNdLnR5cGUgPSBBQ1BJX1NUQVRFX0MzOworCisJLyogdGhlIEMwIHN0YXRlIG9ubHkgZXhpc3RzIGFzIGEgZmlsbGVyIGluIG91ciBhcnJheSwKKwkgKiBhbmQgYWxsIHByb2Nlc3NvcnMgbmVlZCB0byBzdXBwb3J0IEMxICovCisJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MwXS52YWxpZCA9IDE7CisJcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MxXS52YWxpZCA9IDE7CisKKwlyZXR1cm5fVkFMVUUoMCk7Cit9CisKKwogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfaW5mb19jc3QgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCiB7CiAJYWNwaV9zdGF0dXMJCXN0YXR1cyA9IDA7CkBAIC01MjksOSArNTc1LDYgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2NzdCIpOwogCi0JaWYgKGVycmF0YS5zbXApCi0JCXJldHVybl9WQUxVRSgtRU5PREVWKTsKLQogCWlmIChub2NzdCkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCkBAIC02NjQsMTMgKzcwNyw2IEBACiAJCXJldHVybl9WT0lEOwogCX0KIAotCS8qIFdlJ3JlIChjdXJyZW50bHkpIG9ubHkgc3VwcG9ydGluZyBDMiBvbiBVUCAqLwotCWVsc2UgaWYgKGVycmF0YS5zbXApIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIkMyIG5vdCBzdXBwb3J0ZWQgaW4gU01QIG1vZGVcbiIpKTsKLQkJcmV0dXJuX1ZPSUQ7Ci0JfQotCiAJLyoKIAkgKiBPdGhlcndpc2Ugd2UndmUgbWV0IGFsbCBvZiBvdXIgQzIgcmVxdWlyZW1lbnRzLgogCSAqIE5vcm1hbGl6ZSB0aGUgQzIgbGF0ZW5jeSB0byBleHBpZGl0ZSBwb2xpY3kKQEAgLTY4Niw2ICs3MjIsOCBAQAogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCkKIHsKKwlzdGF0aWMgaW50IGJtX2NoZWNrX2ZsYWc7CisKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9nZXRfcG93ZXJfdmVyaWZ5X2MzIik7CiAKIAlpZiAoIWN4LT5hZGRyZXNzKQpAQCAtNzAyLDIwICs3NDAsNiBAQAogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQkvKiBidXMgbWFzdGVyaW5nIGNvbnRyb2wgaXMgbmVjZXNzYXJ5ICovCi0JZWxzZSBpZiAoIXByLT5mbGFncy5ibV9jb250cm9sKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJDMyBzdXBwb3J0IHJlcXVpcmVzIGJ1cyBtYXN0ZXJpbmcgY29udHJvbFxuIikpOwotCQlyZXR1cm5fVk9JRDsKLQl9Ci0KLQkvKiBXZSdyZSAoY3VycmVudGx5KSBvbmx5IHN1cHBvcnRpbmcgQzIgb24gVVAgKi8KLQllbHNlIGlmIChlcnJhdGEuc21wKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJDMyBub3Qgc3VwcG9ydGVkIGluIFNNUCBtb2RlXG4iKSk7Ci0JCXJldHVybl9WT0lEOwotCX0KLQogCS8qCiAJICogUElJWDQgRXJyYXR1bSAjMTg6IFdlIGRvbid0IHN1cHBvcnQgQzMgd2hlbiBUeXBlLUYgKGZhc3QpCiAJICogRE1BIHRyYW5zZmVycyBhcmUgdXNlZCBieSBhbnkgSVNBIGRldmljZSB0byBhdm9pZCBsaXZlbG9jay4KQEAgLTcyOSw2ICs3NTMsMzkgQEAKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCisJLyogQWxsIHRoZSBsb2dpYyBoZXJlIGFzc3VtZXMgZmxhZ3MuYm1fY2hlY2sgaXMgc2FtZSBhY3Jvc3MgYWxsIENQVXMgKi8KKwlpZiAoIWJtX2NoZWNrX2ZsYWcpIHsKKwkJLyogRGV0ZXJtaW5lIHdoZXRoZXIgYm1fY2hlY2sgaXMgbmVlZGVkIGJhc2VkIG9uIENQVSAgKi8KKwkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjaygmKHByLT5mbGFncyksIHByLT5pZCk7CisJCWJtX2NoZWNrX2ZsYWcgPSBwci0+ZmxhZ3MuYm1fY2hlY2s7CisJfSBlbHNlIHsKKwkJcHItPmZsYWdzLmJtX2NoZWNrID0gYm1fY2hlY2tfZmxhZzsKKwl9CisKKwlpZiAocHItPmZsYWdzLmJtX2NoZWNrKSB7CisJCXByaW50aygiRGlzYWJsaW5nIEJNIGFjY2VzcyBiZWZvcmUgZW50ZXJpbmcgQzNcbiIpOworCQkvKiBidXMgbWFzdGVyaW5nIGNvbnRyb2wgaXMgbmVjZXNzYXJ5ICovCisJCWlmICghcHItPmZsYWdzLmJtX2NvbnRyb2wpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCSAgIkMzIHN1cHBvcnQgcmVxdWlyZXMgYnVzIG1hc3RlcmluZyBjb250cm9sXG4iKSk7CisJCQlyZXR1cm5fVk9JRDsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50aygiSW52YWxpZGF0aW5nIGNhY2hlIGJlZm9yZSBlbnRlcmluZyBDM1xuIik7CisJCS8qCisJCSAqIFdCSU5WRCBzaG91bGQgYmUgc2V0IGluIGZhZHQsIGZvciBDMyBzdGF0ZSB0byBiZQorCQkgKiBzdXBwb3J0ZWQgb24gd2hlbiBibV9jaGVjayBpcyBub3QgcmVxdWlyZWQuCisJCSAqLworCQlpZiAoYWNwaV9mYWR0LndiX2ludmQgIT0gMSkgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAorCQkJICAiQ2FjaGUgaW52YWxpZGF0aW9uIHNob3VsZCB3b3JrIHByb3Blcmx5IgorCQkJICAiIGZvciBDMyB0byBiZSBlbmFibGVkIG9uIFNNUCBzeXN0ZW1zXG4iKSk7CisJCQlyZXR1cm5fVk9JRDsKKwkJfQorCQlhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19CVVNfTUFTVEVSX1JMRCwKKwkJCQkwLCBBQ1BJX01UWF9ET19OT1RfTE9DSyk7CisJfQorCiAJLyoKIAkgKiBPdGhlcndpc2Ugd2UndmUgbWV0IGFsbCBvZiBvdXIgQzMgcmVxdWlyZW1lbnRzLgogCSAqIE5vcm1hbGl6ZSB0aGUgQzMgbGF0ZW5jeSB0byBleHBpZGl0ZSBwb2xpY3kuICBFbmFibGUKQEAgLTczNyw3ICs3OTQsNiBAQAogCSAqLwogCWN4LT52YWxpZCA9IDE7CiAJY3gtPmxhdGVuY3lfdGlja3MgPSBVU19UT19QTV9USU1FUl9USUNLUyhjeC0+bGF0ZW5jeSk7Ci0JcHItPmZsYWdzLmJtX2NoZWNrID0gMTsKIAogCXJldHVybl9WT0lEOwogfQpAQCAtNzg3LDEwICs4NDMsNyBAQAogCWlmICgocmVzdWx0KSB8fCAoYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5KHByKSA8IDIpKSB7CiAJCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX2dldF9wb3dlcl9pbmZvX2ZhZHQocHIpOwogCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7Ci0KLQkJaWYgKGFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeShwcikgPCAyKQotCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOworCQkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm9fZGVmYXVsdF9jMShwcik7CiAJfQogCiAJLyoKQEAgLTgxMCwxMSArODYzLDEwIEBACiAJICogQ1BVIGFzIGJlaW5nICJpZGxlIG1hbmFnZWFibGUiCiAJICovCiAJZm9yIChpID0gMTsgaSA8IEFDUElfUFJPQ0VTU09SX01BWF9QT1dFUjsgaSsrKSB7Ci0JCWlmIChwci0+cG93ZXIuc3RhdGVzW2ldLnZhbGlkKQorCQlpZiAocHItPnBvd2VyLnN0YXRlc1tpXS52YWxpZCkgewogCQkJcHItPnBvd2VyLmNvdW50ID0gaTsKLQkJaWYgKChwci0+cG93ZXIuc3RhdGVzW2ldLnZhbGlkKSAmJgotCQkgICAgKHByLT5wb3dlci5zdGF0ZXNbaV0udHlwZSA+PSBBQ1BJX1NUQVRFX0MyKSkKIAkJCXByLT5mbGFncy5wb3dlciA9IDE7CisJCX0KIAl9CiAKIAlyZXR1cm5fVkFMVUUoMCk7CkBAIC04MjksNyArODgxLDcgQEAKIAlpZiAoIXByKQogIAkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOwogCi0JaWYgKGVycmF0YS5zbXAgfHwgbm9jc3QpIHsKKwlpZiAoIG5vY3N0KSB7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKQEAgLTkyOSw3ICs5ODEsNiBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi0KIGludCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSAwOwpAQCAtOTQ2LDcgKzk5NywxMCBAQAogCQlmaXJzdF9ydW4rKzsKIAl9CiAKLQlpZiAoIWVycmF0YS5zbXAgJiYgKHByLT5pZCA9PSAwKSAmJiBhY3BpX2ZhZHQuY3N0X2NudCAmJiAhbm9jc3QpIHsKKwlpZiAoIXByKQorCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisKKwlpZiAoYWNwaV9mYWR0LmNzdF9jbnQgJiYgIW5vY3N0KSB7CiAJCXN0YXR1cyA9IGFjcGlfb3Nfd3JpdGVfcG9ydChhY3BpX2ZhZHQuc21pX2NtZCwgYWNwaV9mYWR0LmNzdF9jbnQsIDgpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCkBAIC05NTQsNiArMTAwOCw4IEBACiAJCX0KIAl9CiAKKwlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYygmKHByLT5wb3dlciksIHByLT5pZCk7CisJYWNwaV9wcm9jZXNzb3Jfc2V0X3BkYyhwciwgcHItPnBvd2VyLnBkYyk7CiAJYWNwaV9wcm9jZXNzb3JfZ2V0X3Bvd2VyX2luZm8ocHIpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKaW5kZXggYTlhMWE4Zi4uMWYwZDYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKQEAgLTE2NSwzNyArMTY1LDYgQEAKIAlhY3BpX3Byb2Nlc3Nvcl9wcGNfc3RhdHVzICY9IH5QUENfUkVHSVNURVJFRDsKIH0KIAotLyoKLSAqIHdoZW4gcmVnaXN0ZXJpbmcgYSBjcHVmcmVxIGRyaXZlciB3aXRoIHRoaXMgQUNQSSBwcm9jZXNzb3IgZHJpdmVyLCB0aGUKLSAqIF9QQ1QgYW5kIF9QU1Mgc3RydWN0dXJlcyBhcmUgcmVhZCBvdXQgYW5kIHdyaXR0ZW4gaW50byBzdHJ1Y3QKLSAqIGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlLgotICovCi1zdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX3NldF9wZGMgKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCi17Ci0JYWNwaV9zdGF0dXMgICAgICAgICAgICAgc3RhdHVzID0gQUVfT0s7Ci0JdTMyCQkJYXJnMF9idWZbM107Ci0JdW5pb24gYWNwaV9vYmplY3QJYXJnMCA9IHtBQ1BJX1RZUEVfQlVGRkVSfTsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBub19vYmplY3QgPSB7MSwgJmFyZzB9OwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICpwZGM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3Byb2Nlc3Nvcl9zZXRfcGRjIik7Ci0KLQlhcmcwLmJ1ZmZlci5sZW5ndGggPSAxMjsKLQlhcmcwLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGFyZzBfYnVmOwotCWFyZzBfYnVmWzBdID0gQUNQSV9QRENfUkVWSVNJT05fSUQ7Ci0JYXJnMF9idWZbMV0gPSAwOwotCWFyZzBfYnVmWzJdID0gMDsKLQotCXBkYyA9IChwci0+cGVyZm9ybWFuY2UtPnBkYykgPyBwci0+cGVyZm9ybWFuY2UtPnBkYyA6ICZub19vYmplY3Q7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX1BEQyIsIHBkYywgTlVMTCk7Ci0KLQlpZiAoKEFDUElfRkFJTFVSRShzdGF0dXMpKSAmJiAocHItPnBlcmZvcm1hbmNlLT5wZGMpKQotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJFcnJvciBldmFsdWF0aW5nIF9QREMsIHVzaW5nIGxlZ2FjeSBwZXJmLiBjb250cm9sLi4uXG4iKSk7Ci0KLQlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKLX0KLQogCiBzdGF0aWMgaW50CiBhY3BpX3Byb2Nlc3Nvcl9nZXRfcGVyZm9ybWFuY2VfY29udHJvbCAoCkBAIC0zNTcsNyArMzI2LDcgQEAKIAlpZiAoIXByIHx8ICFwci0+cGVyZm9ybWFuY2UgfHwgIXByLT5oYW5kbGUpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWFjcGlfcHJvY2Vzc29yX3NldF9wZGMocHIpOworCWFjcGlfcHJvY2Vzc29yX3NldF9wZGMocHIsIHByLT5wZXJmb3JtYW5jZS0+cGRjKTsKIAogCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShwci0+aGFuZGxlLCAiX1BDVCIsICZoYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNhZGRyLmMKaW5kZXggNDc4OGMwNy4uNTVkMjY0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2FkZHIuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzYWRkci5jCkBAIC03NywyMSArNzcsMjEgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0cHV0X2J1ZmZlciwKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpzdHJ1Y3R1cmVfc2l6ZSkKIHsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSBieXRlX3N0cmVhbV9idWZmZXI7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KTsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2OwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDg7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGVtcF9wdHI7CisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzMTYpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfYWRkcmVzczE2X3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIApAQCAtMTA0LDkgKzEwNCw4IEBACiAJKmJ5dGVzX2NvbnN1bWVkID0gdGVtcDE2ICsgMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0FERFJFU1MxNjsKIAotCS8qCi0JICogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykKLQkgKi8KKwkvKiBHZXQgdGhlIFJlc291cmNlIFR5cGUgKEJ5dGUzKSAqLworCiAJYnVmZmVyICs9IDI7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC0xMTgsOSArMTE3LDggQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUgPSB0ZW1wODsKIAotCS8qCi0JICogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkKLQkgKi8KKwkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC0xNDAsOSArMTM4LDggQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1heF9hZGRyZXNzX2ZpeGVkID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKIAotCS8qCi0JICogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkKLQkgKi8KKwkvKiBHZXQgdGhlIFR5cGUgU3BlY2lmaWMgRmxhZ3MgKEJ5dGU1KSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCkBAIC0xNjUsMzkgKzE2MiwzNCBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtNykKLQkgKi8KKwkvKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtNykgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmdyYW51bGFyaXR5LCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDgtOSkKLQkgKi8KKwkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDgtOSkgKi8KKwogCWJ1ZmZlciArPSAyOwogCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2Lm1pbl9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDEwLTExKQotCSAqLworCS8qIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTAtMTEpICovCisKIAlidWZmZXIgKz0gMjsKIAlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19yYW5nZSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0IChCeXRlcyAxMi0xMykKLQkgKi8KLQlidWZmZXIgKz0gMjsKLQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKKwkvKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDEyLTEzKSAqLwogCi0JLyoKLQkgKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDE0LTE1KQotCSAqLworCWJ1ZmZlciArPSAyOworCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LAorCQlidWZmZXIpOworCisJLyogR2V0IGFkZHJlc3NfbGVuZ3RoIChCeXRlcyAxNC0xNSkgKi8KKwogCWJ1ZmZlciArPSAyOwogCUFDUElfTU9WRV8xNl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoLCBidWZmZXIpOwogCi0JLyoKLQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpCi0JICovCisJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KSAqLworCiAJYnVmZmVyICs9IDI7CiAKIAkvKgpAQCAtMjI1LDcgKzIxNyw4IEBACiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0KIAkJCQkoY2hhciAqKSgodTggKiApb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKIAotCQl0ZW1wX3B0ciA9ICh1OCAqKSBvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJdGVtcF9wdHIgPSAodTggKikKKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCiAJCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIApAQCAtMjM5LDkgKzIzMiw4IEBACiAJCQlpbmRleCArPSAxOwogCQl9CiAKLQkJLyoKLQkJICogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsCi0JCSAqLworCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgKi8KKwogCQkqdGVtcF9wdHIgPSAweDAwOwogCiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOwpAQCAtMjYwLDE0ICsyNTIsMTIgQEAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOwogCX0KIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zMDUsMjggKzI5NSwyNCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19hZGRyZXNzMTZfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4ODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2F2ZSBhIHBvaW50ZXIgdG8gdGhlIExlbmd0aCBmaWVsZCAtIHRvIGJlIGZpbGxlZCBpbiBsYXRlcgotCSAqLworCS8qIFNhdmUgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KKwogCWxlbmd0aF9maWVsZCA9IGJ1ZmZlcjsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyKQotCSAqLworCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUgJiAweDAzKTsKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgZ2VuZXJhbCBmbGFncwotCSAqLworCS8qIFNldCB0aGUgZ2VuZXJhbCBmbGFncyAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucHJvZHVjZXJfY29uc3VtZXIgJiAweDAxKTsKIAogCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuZGVjb2RlICYgMHgwMSkgPDwgMTsKQEAgLTMzNiw5ICszMjIsOCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzICovCisKIAl0ZW1wOCA9IDA7CiAKIAlpZiAoQUNQSV9NRU1PUllfUkFOR0UgPT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3R5cGUpIHsKQEAgLTM2MiwzOSArMzQ3LDM0IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkKLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkgKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LmdyYW51bGFyaXR5KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0KLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYubWluX2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5tYXhfYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQKLQkgKi8KLQlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJLyogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldCAqLworCisJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsCisJCSZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYuYWRkcmVzc19sZW5ndGgpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwKLQkgKi8KKwkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KKwogCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewogCQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczE2LnJlc291cmNlX3NvdXJjZS5pbmRleDsKIApAQCAtNDAzLDkgKzM4Myw4IEBACiAKIAkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOwogCi0JCS8qCi0JCSAqIENvcHkgdGhlIHN0cmluZwotCQkgKi8KKwkJLyogQ29weSB0aGUgc3RyaW5nICovCisKIAkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwKIAkJCQlsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCkBAIC00MTMsMTIgKzM5MiwxMiBAQAogCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0aW5nICsgb25lIGZvciB0aGUKIAkJICogdGVybWluYXRpbmcgbnVsbAogCQkgKi8KLQkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CisJCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAoCisJCQkJIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKIAl9CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCWFjdHVhbF9ieXRlcyA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCSpieXRlc19jb25zdW1lZCA9IGFjdHVhbF9ieXRlczsKIApAQCAtNDc1LDkgKzQ1NCw4IEBACiAJYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCXN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMik7CiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKQEAgLTQ5MCw5ICs0NjgsOCBAQAogCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI7CiAKLQkvKgotCSAqIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpCi0JICovCisJLyogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykgKi8KKwogCWJ1ZmZlciArPSAyOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtNTA0LDM1ICs0ODEsMjkgQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3R5cGUgPSB0ZW1wODsKIAotCS8qCi0JICogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkKLQkgKi8KKwkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCi0JLyoKLQkgKiBQcm9kdWNlciAvIENvbnN1bWVyCi0JICovCisJLyogUHJvZHVjZXIgLyBDb25zdW1lciAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucHJvZHVjZXJfY29uc3VtZXIgPSB0ZW1wOCAmIDB4MDE7CiAKLQkvKgotCSAqIERlY29kZQotCSAqLworCS8qIERlY29kZSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuZGVjb2RlID0gKHRlbXA4ID4+IDEpICYgMHgwMTsKIAotCS8qCi0JICogTWluIEFkZHJlc3MgRml4ZWQKLQkgKi8KKwkvKiBNaW4gQWRkcmVzcyBGaXhlZCAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMikgJiAweDAxOwogCi0JLyoKLQkgKiBNYXggQWRkcmVzcyBGaXhlZAotCSAqLworCS8qIE1heCBBZGRyZXNzIEZpeGVkICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpCi0JICovCisJLyogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtNTU2LDM5ICs1MjcsMzQgQEAKIAkJfQogCX0KIAotCS8qCi0JICogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTkpCi0JICovCisJLyogR2V0IEdyYW51bGFyaXR5IChCeXRlcyA2LTkpICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5ncmFudWxhcml0eSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxMC0xMykKLQkgKi8KKwkvKiBHZXQgbWluX2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDEwLTEzKSAqLworCiAJYnVmZmVyICs9IDQ7CiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBtYXhfYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTQtMTcpCi0JICovCisJLyogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0xNykgKi8KKwogCWJ1ZmZlciArPSA0OwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLm1heF9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDE4LTIxKQotCSAqLwotCWJ1ZmZlciArPSA0OwotCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0LCBidWZmZXIpOworCS8qIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMTgtMjEpICovCiAKLQkvKgotCSAqIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMjItMjUpCi0JICovCisJYnVmZmVyICs9IDQ7CisJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQsCisJCWJ1ZmZlcik7CisKKwkvKiBHZXQgYWRkcmVzc19sZW5ndGggKEJ5dGVzIDIyLTI1KSAqLworCiAJYnVmZmVyICs9IDQ7CiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIFJlc291cmNlIFNvdXJjZSBJbmRleCAoaWYgcHJlc2VudCkKLQkgKi8KKwkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggKGlmIHByZXNlbnQpICovCisKIAlidWZmZXIgKz0gNDsKIAogCS8qCkBAIC02MTUsNyArNTgxLDggQEAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPQogCQkJCShjaGFyICopKCh1OCAqKW91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKLQkJdGVtcF9wdHIgPSAodTggKikgb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHI7CisJCXRlbXBfcHRyID0gKHU4ICopCisJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKIAogCQkvKiBDb3B5IHRoZSBzdHJpbmcgaW50byB0aGUgYnVmZmVyICovCiAKQEAgLTYyOCw5ICs1OTUsOCBAQAogCQkJaW5kZXggKz0gMTsKIAkJfQogCi0JCS8qCi0JCSAqIEFkZCB0aGUgdGVybWluYXRpbmcgbnVsbAotCQkgKi8KKwkJLyogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsICovCisKIAkJKnRlbXBfcHRyID0gMHgwMDsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPSBpbmRleCArIDE7CiAKQEAgLTY0OCwxNCArNjE0LDEyIEBACiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyID0gTlVMTDsKIAl9CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNjk0LDI5ICs2NTgsMjUgQEAKIAogCWJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDg3OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIKLQkgKi8KKwkvKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KKwogCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIgKHUxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyKQotCSAqLworCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3R5cGUgJiAweDAzKTsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBnZW5lcmFsIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOwogCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuZGVjb2RlICYgMHgwMSkgPDwgMTsKIAl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLm1pbl9hZGRyZXNzX2ZpeGVkICYgMHgwMSkgPDwgMjsKQEAgLTcyNSw5ICs2ODUsOCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSB0eXBlIHNwZWNpZmljIGZsYWdzICovCisKIAl0ZW1wOCA9IDA7CiAKIAlpZiAoQUNQSV9NRU1PUllfUkFOR0UgPT0gbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3R5cGUpIHsKQEAgLTc1MSwzOSArNzEwLDM0IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkKLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3Mgc3BhY2UgZ3JhbnVsYXJpdHkgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLmdyYW51bGFyaXR5KTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0KLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWluaW11bSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIubWluX2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bQotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtYXhpbXVtICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5tYXhfYWRkcmVzc19yYW5nZSk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQKLQkgKi8KLQlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7CisJLyogU2V0IHRoZSBhZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldCAqLworCisJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsCisJCSZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwKLQkgKi8KKwkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KKwogCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewogCQl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczMyLnJlc291cmNlX3NvdXJjZS5pbmRleDsKIApAQCAtNzkyLDkgKzc0Niw4IEBACiAKIAkJdGVtcF9wb2ludGVyID0gKGNoYXIgKikgYnVmZmVyOwogCi0JCS8qCi0JCSAqIENvcHkgdGhlIHN0cmluZwotCQkgKi8KKwkJLyogQ29weSB0aGUgc3RyaW5nICovCisKIAkJQUNQSV9TVFJDUFkgKHRlbXBfcG9pbnRlciwKIAkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAKQEAgLTgwMiwxMiArNzU1LDEyIEBACiAJCSAqIEJ1ZmZlciBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3RpbmcgKyBvbmUgZm9yIHRoZQogCQkgKiAgdGVybWluYXRpbmcgbnVsbAogCQkgKi8KLQkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CisJCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAoCisJCQkJIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKIAl9CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCiAJLyoKQEAgLTg2NCw5ICs4MTcsOCBAQAogCXN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCk7CiAJcmVzb3VyY2VfdHlwZSA9ICpidWZmZXI7CiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKQEAgLTg3OSw5ICs4MzEsOCBAQAogCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9BRERSRVNTNjQ7CiAKLQkvKgotCSAqIEdldCB0aGUgUmVzb3VyY2UgVHlwZSAoQnl0ZTMpCi0JICovCisJLyogR2V0IHRoZSBSZXNvdXJjZSBUeXBlIChCeXRlMykgKi8KKwogCWJ1ZmZlciArPSAyOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtODkzLDM1ICs4NDQsMjkgQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3R5cGUgPSB0ZW1wODsKIAotCS8qCi0JICogR2V0IHRoZSBHZW5lcmFsIEZsYWdzIChCeXRlNCkKLQkgKi8KKwkvKiBHZXQgdGhlIEdlbmVyYWwgRmxhZ3MgKEJ5dGU0KSAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCi0JLyoKLQkgKiBQcm9kdWNlciAvIENvbnN1bWVyCi0JICovCisJLyogUHJvZHVjZXIgLyBDb25zdW1lciAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucHJvZHVjZXJfY29uc3VtZXIgPSB0ZW1wOCAmIDB4MDE7CiAKLQkvKgotCSAqIERlY29kZQotCSAqLworCS8qIERlY29kZSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQuZGVjb2RlID0gKHRlbXA4ID4+IDEpICYgMHgwMTsKIAotCS8qCi0JICogTWluIEFkZHJlc3MgRml4ZWQKLQkgKi8KKwkvKiBNaW4gQWRkcmVzcyBGaXhlZCAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWluX2FkZHJlc3NfZml4ZWQgPSAodGVtcDggPj4gMikgJiAweDAxOwogCi0JLyoKLQkgKiBNYXggQWRkcmVzcyBGaXhlZAotCSAqLworCS8qIE1heCBBZGRyZXNzIEZpeGVkICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5tYXhfYWRkcmVzc19maXhlZCA9ICh0ZW1wOCA+PiAzKSAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCB0aGUgVHlwZSBTcGVjaWZpYyBGbGFncyAoQnl0ZTUpCi0JICovCisJLyogR2V0IHRoZSBUeXBlIFNwZWNpZmljIEZsYWdzIChCeXRlNSkgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtOTUxLDMzICs4OTYsMjkgQEAKIAkJYnVmZmVyICs9IDI7CiAJfQogCi0JLyoKLQkgKiBHZXQgR3JhbnVsYXJpdHkgKEJ5dGVzIDYtMTMpIG9yIChCeXRlcyA4LTE1KQotCSAqLworCS8qIEdldCBHcmFudWxhcml0eSAoQnl0ZXMgNi0xMykgb3IgKEJ5dGVzIDgtMTUpICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSwgYnVmZmVyKTsKIAotCS8qCi0JICogR2V0IG1pbl9hZGRyZXNzX3JhbmdlIChCeXRlcyAxNC0yMSkgb3IgKEJ5dGVzIDE2LTIzKQotCSAqLworCS8qIEdldCBtaW5fYWRkcmVzc19yYW5nZSAoQnl0ZXMgMTQtMjEpIG9yIChCeXRlcyAxNi0yMykgKi8KKwogCWJ1ZmZlciArPSA4OwogCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX3JhbmdlLCBidWZmZXIpOwogCi0JLyoKLQkgKiBHZXQgbWF4X2FkZHJlc3NfcmFuZ2UgKEJ5dGVzIDIyLTI5KSBvciAoQnl0ZXMgMjQtMzEpCi0JICovCisJLyogR2V0IG1heF9hZGRyZXNzX3JhbmdlIChCeXRlcyAyMi0yOSkgb3IgKEJ5dGVzIDI0LTMxKSAqLworCiAJYnVmZmVyICs9IDg7CiAJQUNQSV9NT1ZFXzY0X1RPXzY0ICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfcmFuZ2UsIGJ1ZmZlcik7CiAKLQkvKgotCSAqIEdldCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCAoQnl0ZXMgMzAtMzcpIG9yIChCeXRlcyAzMi0zOSkKLQkgKi8KLQlidWZmZXIgKz0gODsKLQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwgYnVmZmVyKTsKKwkvKiBHZXQgYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQgKEJ5dGVzIDMwLTM3KSBvciAoQnl0ZXMgMzItMzkpICovCiAKLQkvKgotCSAqIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMzgtNDUpIG9yIChCeXRlcyA0MC00NykKLQkgKi8KKwlidWZmZXIgKz0gODsKKwlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5hZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCwKKwkJYnVmZmVyKTsKKworCS8qIEdldCBhZGRyZXNzX2xlbmd0aCAoQnl0ZXMgMzgtNDUpIG9yIChCeXRlcyA0MC00NykgKi8KKwogCWJ1ZmZlciArPSA4OwogCUFDUElfTU9WRV82NF9UT182NCAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoLCBidWZmZXIpOwogCkBAIC05ODksMTQgKzkzMCwxNSBAQAogCQkvKiBHZXQgdHlwZV9zcGVjaWZpY19hdHRyaWJ1dGUgKEJ5dGVzIDQ4LTU1KSAqLwogCiAJCWJ1ZmZlciArPSA4OwotCQlBQ1BJX01PVkVfNjRfVE9fNjQgKCZvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC50eXBlX3NwZWNpZmljX2F0dHJpYnV0ZXMsIGJ1ZmZlcik7CisJCUFDUElfTU9WRV82NF9UT182NCAoCisJCQkmb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQudHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzLAorCQkJYnVmZmVyKTsKIAl9CiAJZWxzZSB7CiAJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcyA9IDA7CiAKLQkJLyoKLQkJICogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KQotCQkgKi8KKwkJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IChpZiBwcmVzZW50KSAqLworCiAJCWJ1ZmZlciArPSA4OwogCiAJCS8qCkBAIC0xMDI1LDcgKzk2Nyw4IEBACiAJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9CiAJCQkJCShjaGFyICopKCh1OCAqKW91dHB1dF9zdHJ1Y3QgKyBzdHJ1Y3Rfc2l6ZSk7CiAKLQkJCXRlbXBfcHRyID0gKHU4ICopIG91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOworCQkJdGVtcF9wdHIgPSAodTggKikKKwkJCQlvdXRwdXRfc3RydWN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKIAogCQkJLyogQ29weSB0aGUgc3RyaW5nIGludG8gdGhlIGJ1ZmZlciAqLwogCkBAIC0xMDQyLDcgKzk4NSw4IEBACiAJCQkgKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwKIAkJCSAqLwogCQkJKnRlbXBfcHRyID0gMHgwMDsKLQkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfbGVuZ3RoID0gaW5kZXggKyAxOworCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGggPQorCQkJCWluZGV4ICsgMTsKIAogCQkJLyoKIAkJCSAqIEluIG9yZGVyIGZvciB0aGUgc3RydWN0X3NpemUgdG8gZmFsbCBvbiBhIDMyLWJpdCBib3VuZGFyeSwKQEAgLTEwNTQsMTQgKzk5OCwxMiBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTExMDAsMjkgKzEwNDIsMjUgQEAKIAogCWJ1ZmZlciA9ICpvdXRwdXRfYnVmZmVyOwogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDhBOwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIKLQkgKi8KKwkvKiBTZXQgYSBwb2ludGVyIHRvIHRoZSBMZW5ndGggZmllbGQgLSB0byBiZSBmaWxsZWQgaW4gbGF0ZXIgKi8KKwogCWxlbmd0aF9maWVsZCA9IEFDUElfQ0FTVF9QVFIgKHUxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBSZXNvdXJjZSBUeXBlIChNZW1vcnksIElvLCBidXNfbnVtYmVyKQotCSAqLworCS8qIFNldCB0aGUgUmVzb3VyY2UgVHlwZSAoTWVtb3J5LCBJbywgYnVzX251bWJlcikgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3R5cGUgJiAweDAzKTsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBnZW5lcmFsIGZsYWdzCi0JICovCisJLyogU2V0IHRoZSBnZW5lcmFsIGZsYWdzICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOwogCXRlbXA4IHw9IChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuZGVjb2RlICYgMHgwMSkgPDwgMTsKIAl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX2ZpeGVkICYgMHgwMSkgPDwgMjsKQEAgLTExMzEsOSArMTA2OSw4IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MKLQkgKi8KKwkvKiBTZXQgdGhlIHR5cGUgc3BlY2lmaWMgZmxhZ3MgKi8KKwogCXRlbXA4ID0gMDsKIAogCWlmIChBQ1BJX01FTU9SWV9SQU5HRSA9PSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2VfdHlwZSkgewpAQCAtMTE1NywzOSArMTA5NCwzNCBAQAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5Ci0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHNwYWNlIGdyYW51bGFyaXR5ICovCisKIAlBQ1BJX01PVkVfNjRfVE9fNjQgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5ncmFudWxhcml0eSk7CiAJYnVmZmVyICs9IDg7CiAKLQkvKgotCSAqIFNldCB0aGUgYWRkcmVzcyByYW5nZSBtaW5pbXVtCi0JICovCisJLyogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1pbmltdW0gKi8KKwogCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0Lm1pbl9hZGRyZXNzX3JhbmdlKTsKIAlidWZmZXIgKz0gODsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIHJhbmdlIG1heGltdW0KLQkgKi8KKwkvKiBTZXQgdGhlIGFkZHJlc3MgcmFuZ2UgbWF4aW11bSAqLworCiAJQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQubWF4X2FkZHJlc3NfcmFuZ2UpOwogCWJ1ZmZlciArPSA4OwogCi0JLyoKLQkgKiBTZXQgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0Ci0JICovCi0JQUNQSV9NT1ZFXzY0X1RPXzY0IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQuYWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCS8qIFNldCB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBvZmZzZXQgKi8KKworCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLAorCQkmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsKIAlidWZmZXIgKz0gODsKIAotCS8qCi0JICogU2V0IHRoZSBhZGRyZXNzIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgYWRkcmVzcyBsZW5ndGggKi8KKwogCUFDUElfTU9WRV82NF9UT182NCAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoKTsKIAlidWZmZXIgKz0gODsKIAotCS8qCi0JICogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsCi0JICovCisJLyogUmVzb3VyY2UgU291cmNlIEluZGV4IGFuZCBSZXNvdXJjZSBTb3VyY2UgYXJlIG9wdGlvbmFsICovCisKIAlpZiAoMCAhPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGgpIHsKIAkJdGVtcDggPSAodTgpIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2UuaW5kZXg7CiAKQEAgLTExOTgsMjEgKzExMzAsMjEgQEAKIAogCQl0ZW1wX3BvaW50ZXIgPSAoY2hhciAqKSBidWZmZXI7CiAKLQkJLyoKLQkJICogQ29weSB0aGUgc3RyaW5nCi0JCSAqLwotCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLCBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQkvKiBDb3B5IHRoZSBzdHJpbmcgKi8KKworCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLAorCQkJbGlua2VkX2xpc3QtPmRhdGEuYWRkcmVzczY0LnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAogCQkvKgogCQkgKiBCdWZmZXIgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0aW5nICsgb25lIGZvciB0aGUKIAkJICogdGVybWluYXRpbmcgbnVsbAogCQkgKi8KLQkJYnVmZmVyICs9IChhY3BpX3NpemUpKEFDUElfU1RSTEVOIChsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpICsgMSk7CisJCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAoCisJCQkJIGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKIAl9CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCmluZGV4IDhhNWYwYTUuLjk4MTc2ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYwpAQCAtODEsOSArODEsOCBAQAogCiAKIAl3aGlsZSAoIWRvbmUpIHsKLQkJLyoKLQkJICogSW5pdCB0aGUgdmFyaWFibGUgdGhhdCB3aWxsIGhvbGQgdGhlIHNpemUgdG8gYWRkIHRvIHRoZSB0b3RhbC4KLQkJICovCisJCS8qIEluaXQgdGhlIHZhcmlhYmxlIHRoYXQgd2lsbCBob2xkIHRoZSBzaXplIHRvIGFkZCB0byB0aGUgdG90YWwuICovCisKIAkJc2VnbWVudF9zaXplID0gMDsKIAogCQlzd2l0Y2ggKGxpbmtlZF9saXN0LT5pZCkgewpAQCAtMTk2LDcgKzE5NSw4IEBACiAJCQlzZWdtZW50X3NpemUgPSAxNjsKIAogCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgewotCQkJCXNlZ21lbnRfc2l6ZSArPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMTYucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJc2VnbWVudF9zaXplICs9CisJCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MxNi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjEyLDcgKzIxMiw4IEBACiAJCQlzZWdtZW50X3NpemUgPSAyNjsKIAogCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgewotCQkJCXNlZ21lbnRfc2l6ZSArPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzMzIucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJc2VnbWVudF9zaXplICs9CisJCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3MzMi5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjI3LDcgKzIyOCw4IEBACiAJCQlzZWdtZW50X3NpemUgPSA0NjsKIAogCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgewotCQkJCXNlZ21lbnRfc2l6ZSArPSBsaW5rZWRfbGlzdC0+ZGF0YS5hZGRyZXNzNjQucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJc2VnbWVudF9zaXplICs9CisJCQkJCWxpbmtlZF9saXN0LT5kYXRhLmFkZHJlc3M2NC5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjQxLDM4ICsyNDMsMzYgQEAKIAkJCSAqIEluZGV4ICsgdGhlIGxlbmd0aCBvZiB0aGUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZwogCQkJICogUmVzb3VyY2UgU291cmNlICsgMSBmb3IgdGhlIG51bGwuCiAJCQkgKi8KLQkJCXNlZ21lbnRfc2l6ZSA9IDkgKwotCQkJCSgoKGFjcGlfc2l6ZSkgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzIC0gMSkgKiA0KTsKKwkJCXNlZ21lbnRfc2l6ZSA9IDkgKyAoKChhY3BpX3NpemUpCisJCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzIC0gMSkgKiA0KTsKIAogCQkJaWYgKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgewotCQkJCXNlZ21lbnRfc2l6ZSArPSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19sZW5ndGg7CisJCQkJc2VnbWVudF9zaXplICs9CisJCQkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aDsKIAkJCQlzZWdtZW50X3NpemUrKzsKIAkJCX0KIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQkvKgotCQkJICogSWYgd2UgZ2V0IGhlcmUsIGV2ZXJ5dGhpbmcgaXMgb3V0IG9mIHN5bmMsIGV4aXQgd2l0aCBlcnJvcgotCQkJICovCisKKwkJCS8qIElmIHdlIGdldCBoZXJlLCBldmVyeXRoaW5nIGlzIG91dCBvZiBzeW5jLCBleGl0IHdpdGggZXJyb3IgKi8KKwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKIAogCQl9IC8qIHN3aXRjaCAobGlua2VkX2xpc3QtPklkKSAqLwogCi0JCS8qCi0JCSAqIFVwZGF0ZSB0aGUgdG90YWwKLQkJICovCisJCS8qIFVwZGF0ZSB0aGUgdG90YWwgKi8KKwogCQlieXRlX3N0cmVhbV9zaXplX25lZWRlZCArPSBzZWdtZW50X3NpemU7CiAKLQkJLyoKLQkJICogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0Ci0JCSAqLworCQkvKiBQb2ludCB0byB0aGUgbmV4dCBvYmplY3QgKi8KKwogCQlsaW5rZWRfbGlzdCA9IEFDUElfUFRSX0FERCAoc3RydWN0IGFjcGlfcmVzb3VyY2UsCiAJCQkJICBsaW5rZWRfbGlzdCwgbGlua2VkX2xpc3QtPmxlbmd0aCk7CiAJfQogCi0JLyoKLQkgKiBUaGlzIGlzIHRoZSBkYXRhIHRoZSBjYWxsZXIgbmVlZHMKLQkgKi8KKwkvKiBUaGlzIGlzIHRoZSBkYXRhIHRoZSBjYWxsZXIgbmVlZHMgKi8KKwogCSpzaXplX25lZWRlZCA9IGJ5dGVfc3RyZWFtX3NpemVfbmVlZGVkOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzIwLDkgKzMyMCw4IEBACiAKIAogCXdoaWxlIChieXRlc19wYXJzZWQgPCBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoKSB7Ci0JCS8qCi0JCSAqIFRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbSBpcyB0aGUgcmVzb3VyY2UgdHlwZQotCQkgKi8KKwkJLyogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlICovCisKIAkJcmVzb3VyY2VfdHlwZSA9IGFjcGlfcnNfZ2V0X3Jlc291cmNlX3R5cGUgKCpieXRlX3N0cmVhbV9idWZmZXIpOwogCiAJCXN3aXRjaCAocmVzb3VyY2VfdHlwZSkgewpAQCAtMzQ2LDkgKzM0NSw4IEBACiAJCQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJCQlieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAKLQkJCS8qCi0JCQkgKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLworCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCisKIAkJCXRlbXAxNiA9ICh1MTYpIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDE2KTsKIAogCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfdmVuZG9yKSArCkBAIC00MTYsOSArNDE0LDggQEAKIAkJCQl0ZW1wOCA9IDA7CiAJCQl9CiAKLQkJCS8qCi0JCQkgKiBFbnN1cmUgYSA2NC1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLworCQkJLyogRW5zdXJlIGEgNjQtYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCisKIAkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzY0X2JJVFMgKHRlbXA4KTsKIAogCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KSArCkBAIC00NTIsOSArNDQ5LDggQEAKIAkJCQl0ZW1wOCA9IDA7CiAJCQl9CiAKLQkJCS8qCi0JCQkgKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLworCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCisKIAkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKIAogCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyKSArCkBAIC00ODgsOSArNDg0LDggQEAKIAkJCQl0ZW1wOCA9IDA7CiAJCQl9CiAKLQkJCS8qCi0JCQkgKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLworCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCisKIAkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKIAogCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2KSArCkBAIC01MzcsOSArNTMyLDggQEAKIAkJCQl0ZW1wOCA9IDA7CiAJCQl9CiAKLQkJCS8qCi0JCQkgKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLworCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCisKIAkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKIAogCQkJc3RydWN0dXJlX3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0X2lycSkgKwpAQCAtNTY3LDkgKzU2MSw4IEBACiAKIAkJCSsrYnVmZmVyOwogCi0JCQkvKgotCQkJICogTG9vayBhdCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0Ci0JCQkgKi8KKwkJCS8qIExvb2sgYXQgdGhlIG51bWJlciBvZiBiaXRzIHNldCAqLworCiAJCQlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKIAkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDE2OyBpbmRleCsrKSB7CkBAIC01OTYsOSArNTg5LDggQEAKIAogCQkJKytidWZmZXI7CiAKLQkJCS8qCi0JCQkgKiBMb29rIGF0IHRoZSBudW1iZXIgb2YgYml0cyBzZXQKLQkJCSAqLworCQkJLyogTG9vayBhdCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0ICovCisKIAkJCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCQkJZm9yKGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSB7CkBAIC02NzAsOSArNjYyLDggQEAKIAkJCXRlbXA4ID0gKHU4KSAodGVtcDggJiAweDcpOwogCQkJYnl0ZXNfY29uc3VtZWQgPSB0ZW1wOCArIDE7CiAKLQkJCS8qCi0JCQkgKiBFbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLworCQkJLyogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlICovCisKIAkJCXRlbXA4ID0gKHU4KSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMgKHRlbXA4KTsKIAkJCXN0cnVjdHVyZV9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcikgKwogCQkJCQkgICAodGVtcDggKiBzaXplb2YgKHU4KSk7CkBAIC02OTcsMjEgKzY4OCwxOCBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFKTsKIAkJfQogCi0JCS8qCi0JCSAqIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjb3VudGVyCi0JCSAqLworCQkvKiBVcGRhdGUgdGhlIHJldHVybiB2YWx1ZSBhbmQgY291bnRlciAqLworCiAJCWJ1ZmZlcl9zaXplICs9ICh1MzIpIEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRSAoc3RydWN0dXJlX3NpemUpOwogCQlieXRlc19wYXJzZWQgKz0gYnl0ZXNfY29uc3VtZWQ7CiAKLQkJLyoKLQkJICogU2V0IHRoZSBieXRlIHN0cmVhbSB0byBwb2ludCB0byB0aGUgbmV4dCByZXNvdXJjZQotCQkgKi8KKwkJLyogU2V0IHRoZSBieXRlIHN0cmVhbSB0byBwb2ludCB0byB0aGUgbmV4dCByZXNvdXJjZSAqLworCiAJCWJ5dGVfc3RyZWFtX2J1ZmZlciArPSBieXRlc19jb25zdW1lZDsKIAl9CiAKLQkvKgotCSAqIFRoaXMgaXMgdGhlIGRhdGEgdGhlIGNhbGxlciBuZWVkcwotCSAqLworCS8qIFRoaXMgaXMgdGhlIGRhdGEgdGhlIGNhbGxlciBuZWVkcyAqLworCiAJKnNpemVfbmVlZGVkID0gYnVmZmVyX3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC03NjcsOSArNzU1LDggQEAKIAl0b3Bfb2JqZWN0X2xpc3QgPSBwYWNrYWdlX29iamVjdC0+cGFja2FnZS5lbGVtZW50czsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcl9vZl9lbGVtZW50czsgaW5kZXgrKykgewotCQkvKgotCQkgKiBEZXJlZmVyZW5jZSB0aGUgc3ViLXBhY2thZ2UKLQkJICovCisJCS8qIERlcmVmZXJlbmNlIHRoZSBzdWItcGFja2FnZSAqLworCiAJCXBhY2thZ2VfZWxlbWVudCA9ICp0b3Bfb2JqZWN0X2xpc3Q7CiAKIAkJLyoKQEAgLTc3OCwzNyArNzY1LDQwIEBACiAJCSAqLwogCQlzdWJfb2JqZWN0X2xpc3QgPSBwYWNrYWdlX2VsZW1lbnQtPnBhY2thZ2UuZWxlbWVudHM7CiAKLQkJLyoKLQkJICogU2NhbiB0aGUgaXJxX3RhYmxlX2VsZW1lbnRzIGZvciB0aGUgU291cmNlIE5hbWUgU3RyaW5nCi0JCSAqLworCQkvKiBTY2FuIHRoZSBpcnFfdGFibGVfZWxlbWVudHMgZm9yIHRoZSBTb3VyY2UgTmFtZSBTdHJpbmcgKi8KKwogCQluYW1lX2ZvdW5kID0gRkFMU0U7CiAKIAkJZm9yICh0YWJsZV9pbmRleCA9IDA7IHRhYmxlX2luZGV4IDwgNCAmJiAhbmFtZV9mb3VuZDsgdGFibGVfaW5kZXgrKykgewotCQkJaWYgKChBQ1BJX1RZUEVfU1RSSU5HID09IEFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSkgfHwKLQkJCQkoKEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UgPT0gQUNQSV9HRVRfT0JKRUNUX1RZUEUgKCpzdWJfb2JqZWN0X2xpc3QpKSAmJgotCQkJCQkoKCpzdWJfb2JqZWN0X2xpc3QpLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9JTlRfTkFNRVBBVEhfT1ApKSkgeworCQkJaWYgKChBQ1BJX1RZUEVfU1RSSU5HID09CisJCQkJCUFDUElfR0VUX09CSkVDVF9UWVBFICgqc3ViX29iamVjdF9saXN0KSkgfHwKKworCQkJCSgoQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSA9PQorCQkJCQlBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkpICYmCisKKwkJCQkJKCgqc3ViX29iamVjdF9saXN0KS0+cmVmZXJlbmNlLm9wY29kZSA9PQorCQkJCQkJQU1MX0lOVF9OQU1FUEFUSF9PUCkpKSB7CiAJCQkJbmFtZV9mb3VuZCA9IFRSVUU7CiAJCQl9CiAJCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIExvb2sgYXQgdGhlIG5leHQgZWxlbWVudAotCQkJCSAqLworCQkJCS8qIExvb2sgYXQgdGhlIG5leHQgZWxlbWVudCAqLworCiAJCQkJc3ViX29iamVjdF9saXN0Kys7CiAJCQl9CiAJCX0KIAogCQl0ZW1wX3NpemVfbmVlZGVkICs9IChzaXplb2YgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKSAtIDQpOwogCi0JCS8qCi0JCSAqIFdhcyBhIFN0cmluZyB0eXBlIGZvdW5kPwotCQkgKi8KKwkJLyogV2FzIGEgU3RyaW5nIHR5cGUgZm91bmQ/ICovCisKIAkJaWYgKG5hbWVfZm91bmQpIHsKIAkJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAoKnN1Yl9vYmplY3RfbGlzdCkgPT0gQUNQSV9UWVBFX1NUUklORykgewogCQkJCS8qCiAJCQkJICogVGhlIGxlbmd0aCBTdHJpbmcuTGVuZ3RoIGZpZWxkIGRvZXMgbm90IGluY2x1ZGUgdGhlCiAJCQkJICogdGVybWluYXRpbmcgTlVMTCwgYWRkIDEKIAkJCQkgKi8KLQkJCQl0ZW1wX3NpemVfbmVlZGVkICs9ICgoYWNwaV9zaXplKSAoKnN1Yl9vYmplY3RfbGlzdCktPnN0cmluZy5sZW5ndGggKyAxKTsKKwkJCQl0ZW1wX3NpemVfbmVlZGVkICs9ICgoYWNwaV9zaXplKQorCQkJCQkoKnN1Yl9vYmplY3RfbGlzdCktPnN0cmluZy5sZW5ndGggKyAxKTsKIAkJCX0KIAkJCWVsc2UgewogCQkJCXRlbXBfc2l6ZV9uZWVkZWQgKz0gYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoICgKQEAgLTgyNywxNCArODE3LDE0IEBACiAKIAkJdGVtcF9zaXplX25lZWRlZCA9IEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyAodGVtcF9zaXplX25lZWRlZCk7CiAKLQkJLyoKLQkJICogUG9pbnQgdG8gdGhlIG5leHQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAotCQkgKi8KKwkJLyogUG9pbnQgdG8gdGhlIG5leHQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqLworCiAJCXRvcF9vYmplY3RfbGlzdCsrOwogCX0KIAogCS8qCi0JICogQWRkaW5nIGFuIGV4dHJhIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgZXNzZW50aWFsbHkgYSBOVUxMIHRlcm1pbmF0b3IKKwkgKiBBZGRpbmcgYW4gZXh0cmEgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlc3NlbnRpYWxseSBhCisJICogTlVMTCB0ZXJtaW5hdG9yCiAJICovCiAJKmJ1ZmZlcl9zaXplX25lZWRlZCA9IHRlbXBfc2l6ZV9uZWVkZWQgKyBzaXplb2YgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwppbmRleCBhM2EwY2JmLi44ZTBlYWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCkBAIC04Nyw5ICs4Nyw4IEBACiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5GTywgImJ5dGVfc3RyZWFtX2J1ZmZlciA9ICVwXG4iLAogCQlieXRlX3N0cmVhbV9idWZmZXIpKTsKIAotCS8qCi0JICogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlCi0JICovCisJLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCisKIAlieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoID0gYnl0ZV9zdHJlYW1fYnVmZmVyLT5idWZmZXIubGVuZ3RoOwogCWJ5dGVfc3RyZWFtX3N0YXJ0ID0gYnl0ZV9zdHJlYW1fYnVmZmVyLT5idWZmZXIucG9pbnRlcjsKIApAQCAtMTcxLDkgKzE3MCw4IEBACiAKIAkvKiBQYXJhbXMgYWxyZWFkeSB2YWxpZGF0ZWQsIHNvIHdlIGRvbid0IHJlLXZhbGlkYXRlIGhlcmUgKi8KIAotCS8qCi0JICogR2V0IHRoZSByZXF1aXJlZCBidWZmZXIgbGVuZ3RoCi0JICovCisJLyogR2V0IHRoZSByZXF1aXJlZCBidWZmZXIgbGVuZ3RoICovCisKIAlzdGF0dXMgPSBhY3BpX3JzX2dldF9wY2lfcm91dGluZ190YWJsZV9sZW5ndGggKHBhY2thZ2Vfb2JqZWN0LAogCQkJICZidWZmZXJfc2l6ZV9uZWVkZWQpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTIxNyw5ICsyMTUsOCBAQAogCQkgKi8KIAkJdXNlcl9wcnQtPmxlbmd0aCA9IChzaXplb2YgKHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlKSAtIDQpOwogCi0JCS8qCi0JCSAqIEVhY2ggZWxlbWVudCBvZiB0aGUgdG9wLWxldmVsIHBhY2thZ2UgbXVzdCBhbHNvIGJlIGEgcGFja2FnZQotCQkgKi8KKwkJLyogRWFjaCBlbGVtZW50IG9mIHRoZSB0b3AtbGV2ZWwgcGFja2FnZSBtdXN0IGFsc28gYmUgYSBwYWNrYWdlICovCisKIAkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFICgqdG9wX29iamVjdF9saXN0KSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkgewogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkJIihQUlRbJVhdKSBOZWVkIHN1Yi1wYWNrYWdlLCBmb3VuZCAlc1xuIiwKQEAgLTI0Myw5ICsyNDAsOCBAQAogCQkgKi8KIAkJc3ViX29iamVjdF9saXN0ID0gKCp0b3Bfb2JqZWN0X2xpc3QpLT5wYWNrYWdlLmVsZW1lbnRzOwogCi0JCS8qCi0JCSAqIDEpIEZpcnN0IHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5BZGRyZXNzCi0JCSAqLworCQkvKiAxKSBGaXJzdCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuQWRkcmVzcyAqLworCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzBdOwogCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUgKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQkJdXNlcl9wcnQtPmFkZHJlc3MgPSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKQEAgLTI1Nyw5ICsyNTMsOCBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CiAJCX0KIAotCQkvKgotCQkgKiAyKSBTZWNvbmQgc3Vib2JqZWN0OiBEZXJlZmVyZW5jZSB0aGUgUFJULlBpbgotCQkgKi8KKwkJLyogMikgU2Vjb25kIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5QaW4gKi8KKwogCQlvYmpfZGVzYyA9IHN1Yl9vYmplY3RfbGlzdFsxXTsKIAkJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJCXVzZXJfcHJ0LT5waW4gPSAodTMyKSBvYmpfZGVzYy0+aW50ZWdlci52YWx1ZTsKQEAgLTI3MSw5ICsyNjYsOCBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CiAJCX0KIAotCQkvKgotCQkgKiAzKSBUaGlyZCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX25hbWUKLQkJICovCisJCS8qIDMpIFRoaXJkIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfbmFtZSAqLworCiAJCW9ial9kZXNjID0gc3ViX29iamVjdF9saXN0WzJdOwogCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFIChvYmpfZGVzYykpIHsKIAkJY2FzZSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFOgpAQCAtMjk2LDcgKzI5MCw5IEBACiAKIAkJCXN0YXR1cyA9IGFjcGlfbnNfaGFuZGxlX3RvX3BhdGhuYW1lICgoYWNwaV9oYW5kbGUpIG5vZGUsICZwYXRoX2J1ZmZlcik7CiAKLQkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gKHUzMikgQUNQSV9TVFJMRU4gKHVzZXJfcHJ0LT5zb3VyY2UpICsgMTsgLyogaW5jbHVkZSBudWxsIHRlcm1pbmF0b3IgKi8KKwkJCS8qICsxIHRvIGluY2x1ZGUgbnVsbCB0ZXJtaW5hdG9yICovCisKKwkJCXVzZXJfcHJ0LT5sZW5ndGggKz0gKHUzMikgQUNQSV9TVFJMRU4gKHVzZXJfcHJ0LT5zb3VyY2UpICsgMTsKIAkJCWJyZWFrOwogCiAKQEAgLTMwNCw4ICszMDAsMTAgQEAKIAogCQkJQUNQSV9TVFJDUFkgKHVzZXJfcHJ0LT5zb3VyY2UsIG9ial9kZXNjLT5zdHJpbmcucG9pbnRlcik7CiAKLQkJCS8qIEFkZCB0byB0aGUgTGVuZ3RoIGZpZWxkIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoYWRkIDEgZm9yIHRlcm1pbmF0b3IpICovCi0KKwkJCS8qCisJCQkgKiBBZGQgdG8gdGhlIExlbmd0aCBmaWVsZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKwkJCSAqIChhZGQgMSBmb3IgdGVybWluYXRvcikKKwkJCSAqLwogCQkJdXNlcl9wcnQtPmxlbmd0aCArPSBvYmpfZGVzYy0+c3RyaW5nLmxlbmd0aCArIDE7CiAJCQlicmVhazsKIApAQCAtMzMzLDkgKzMzMSw4IEBACiAKIAkJdXNlcl9wcnQtPmxlbmd0aCA9ICh1MzIpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyAodXNlcl9wcnQtPmxlbmd0aCk7CiAKLQkJLyoKLQkJICogNCkgRm91cnRoIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfaW5kZXgKLQkJICovCisJCS8qIDQpIEZvdXJ0aCBzdWJvYmplY3Q6IERlcmVmZXJlbmNlIHRoZSBQUlQuc291cmNlX2luZGV4ICovCisKIAkJb2JqX2Rlc2MgPSBzdWJfb2JqZWN0X2xpc3RbM107CiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CiAJCQl1c2VyX3BydC0+c291cmNlX2luZGV4ID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwppbmRleCBlZWYxYjFmLi4xOTM1ZGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKQEAgLTQ4LDkgKzQ4LDYyIEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInJzZHVtcCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9pcnEgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfYWRkcmVzczMyICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9hZGRyZXNzNjQgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2RtYSAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfaW8gKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2V4dGVuZGVkX2lycSAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfZml4ZWRfaW8gKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX2ZpeGVkX21lbW9yeTMyICgKKwl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKKworc3RhdGljIHZvaWQKK2FjcGlfcnNfZHVtcF9tZW1vcnkyNCAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithY3BpX3JzX2R1bXBfbWVtb3J5MzIgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX3N0YXJ0X2RlcGVuZF9mbnMgKAorCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOworCitzdGF0aWMgdm9pZAorYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyAoCisJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7CisKIAogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX2lycQpAQCAtNjMsNyArMTE2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2lycSAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTc3LDEzICsxMzAsMTMgQEAKIAlhY3BpX29zX3ByaW50ZiAoIklSUSBSZXNvdXJjZVxuIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXMgVHJpZ2dlcmVkXG4iLAotCQkJIEFDUElfTEVWRUxfU0VOU0lUSVZFID09IGlycV9kYXRhLT5lZGdlX2xldmVsID8gIkxldmVsIiA6ICJFZGdlIik7CisJCUFDUElfTEVWRUxfU0VOU0lUSVZFID09IGlycV9kYXRhLT5lZGdlX2xldmVsID8gIkxldmVsIiA6ICJFZGdlIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWN0aXZlICVzXG4iLAotCQkJIEFDUElfQUNUSVZFX0xPVyA9PSBpcnFfZGF0YS0+YWN0aXZlX2hpZ2hfbG93ID8gIkxvdyIgOiAiSGlnaCIpOworCQlBQ1BJX0FDVElWRV9MT1cgPT0gaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/ICJMb3ciIDogIkhpZ2giKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlc1xuIiwKLQkJCSBBQ1BJX1NIQVJFRCA9PSBpcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/ICJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOworCQlBQ1BJX1NIQVJFRCA9PSBpcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/ICJTaGFyZWQiIDogIkV4Y2x1c2l2ZSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVYIEludGVycnVwdHMgKCAiLCBpcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHMpOwogCkBAIC0xMDgsNyArMTYxLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2RtYSAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTE0NCw3ICsxOTcsNyBAQAogCX0KIAogCWFjcGlfb3NfcHJpbnRmICgiICAlc0J1cyBNYXN0ZXJcbiIsCi0JCQkgQUNQSV9CVVNfTUFTVEVSID09IGRtYV9kYXRhLT5idXNfbWFzdGVyID8gIiIgOiAiTm90IGEgIik7CisJCUFDUElfQlVTX01BU1RFUiA9PSBkbWFfZGF0YS0+YnVzX21hc3RlciA/ICIiIDogIk5vdCBhICIpOwogCiAKIAlzd2l0Y2ggKGRtYV9kYXRhLT50cmFuc2ZlcikgewpAQCAtMTY1LDcgKzIxOCw4IEBACiAJCWJyZWFrOwogCX0KIAotCWFjcGlfb3NfcHJpbnRmICgiICBOdW1iZXIgb2YgQ2hhbm5lbHM6ICVYICggIiwgZG1hX2RhdGEtPm51bWJlcl9vZl9jaGFubmVscyk7CisJYWNwaV9vc19wcmludGYgKCIgIE51bWJlciBvZiBDaGFubmVsczogJVggKCAiLAorCQlkbWFfZGF0YS0+bnVtYmVyX29mX2NoYW5uZWxzKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGRtYV9kYXRhLT5udW1iZXJfb2ZfY2hhbm5lbHM7IGluZGV4KyspIHsKIAkJYWNwaV9vc19wcmludGYgKCIlWCAiLCBkbWFfZGF0YS0+Y2hhbm5lbHNbaW5kZXhdKTsKQEAgLTE4OCw3ICsyNDIsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucyAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTIzMiw4ICsyODYsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCWFjcGlfb3NfcHJpbnRmICgiICBJbnZhbGlkIHBlcmZvcm1hbmNlICIKLQkJCQkgICJyb2J1c3RuZXNzIHByZWZlcmVuY2VcbiIpOworCQlhY3BpX29zX3ByaW50ZiAoIiAgSW52YWxpZCBwZXJmb3JtYW5jZSByb2J1c3RuZXNzIHByZWZlcmVuY2VcbiIpOwogCQlicmVhazsKIAl9CiAKQEAgLTI1Myw3ICszMDYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfaW8gKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC0yNjYsMTkgKzMxOSwxNSBAQAogCWFjcGlfb3NfcHJpbnRmICgiSW8gUmVzb3VyY2VcbiIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVkIGJpdCBkZWNvZGVcbiIsCi0JCQkgQUNQSV9ERUNPREVfMTYgPT0gaW9fZGF0YS0+aW9fZGVjb2RlID8gMTYgOiAxMCk7CisJCUFDUElfREVDT0RFXzE2ID09IGlvX2RhdGEtPmlvX2RlY29kZSA/IDE2IDogMTApOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKLQkJCSBpb19kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWluaW11bSBiYXNlOiAlMDhYXG4iLCBpb19kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtYXhpbXVtIGJhc2U6ICUwOFhcbiIsCi0JCQkgaW9fZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwgaW9fZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLAotCQkJIGlvX2RhdGEtPmFsaWdubWVudCk7CisJYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwgaW9fZGF0YS0+YWxpZ25tZW50KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBMZW5ndGg6ICUwOFhcbiIsCi0JCQkgaW9fZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgTGVuZ3RoOiAlMDhYXG4iLCBpb19kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQpAQCAtMjk2LDcgKzM0NSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9maXhlZF9pbyAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTMwNywxMSArMzU2LDkgQEAKIAogCiAJYWNwaV9vc19wcmludGYgKCJGaXhlZCBJbyBSZXNvdXJjZVxuIik7Ci0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGJhc2UgYWRkcmVzczogJTA4WCIsCi0JCQkgZml4ZWRfaW9fZGF0YS0+YmFzZV9hZGRyZXNzKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgYmFzZSBhZGRyZXNzOiAlMDhYIiwgZml4ZWRfaW9fZGF0YS0+YmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFgiLAotCQkJIGZpeGVkX2lvX2RhdGEtPnJhbmdlX2xlbmd0aCk7CisJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WCIsIGZpeGVkX2lvX2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CkBAIC0zMjksNyArMzc2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX3ZlbmRvcl9zcGVjaWZpYyAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTM0Niw3ICszOTMsNyBAQAogCiAJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdmVuZG9yX2RhdGEtPmxlbmd0aDsgaW5kZXgrKykgewogCQlhY3BpX29zX3ByaW50ZiAoIiAgQnl0ZSAlWDogJTA4WFxuIiwKLQkJCQkgaW5kZXgsIHZlbmRvcl9kYXRhLT5yZXNlcnZlZFtpbmRleF0pOworCQkJaW5kZXgsIHZlbmRvcl9kYXRhLT5yZXNlcnZlZFtpbmRleF0pOwogCX0KIAogCXJldHVybjsKQEAgLTM2NSw3ICs0MTIsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfbWVtb3J5MjQgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC0zNzgsMjEgKzQyNSwxOSBAQAogCWFjcGlfb3NfcHJpbnRmICgiMjQtQml0IE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVhZCVzXG4iLAotCQkJIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCSBtZW1vcnkyNF9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkgIi9Xcml0ZSIgOiAiIG9ubHkiKTsKKwkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkJbWVtb3J5MjRfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPworCQkJIi9Xcml0ZSIgOiAiIG9ubHkiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBtaW5pbXVtIGJhc2U6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MjRfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CisJCW1lbW9yeTI0X2RhdGEtPm1pbl9iYXNlX2FkZHJlc3MpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1heGltdW0gYmFzZTogJTA4WFxuIiwKLQkJCSBtZW1vcnkyNF9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKKwkJbWVtb3J5MjRfZGF0YS0+bWF4X2Jhc2VfYWRkcmVzcyk7CiAKLQlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLAotCQkJIG1lbW9yeTI0X2RhdGEtPmFsaWdubWVudCk7CisJYWNwaV9vc19wcmludGYgKCIgIEFsaWdubWVudDogJTA4WFxuIiwgbWVtb3J5MjRfZGF0YS0+YWxpZ25tZW50KTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MjRfZGF0YS0+cmFuZ2VfbGVuZ3RoKTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbGVuZ3RoOiAlMDhYXG4iLCBtZW1vcnkyNF9kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQpAQCAtNDEwLDcgKzQ1NSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9tZW1vcnkzMiAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTQyMywyMSArNDY4LDE5IEBACiAJYWNwaV9vc19wcmludGYgKCIzMi1CaXQgTWVtb3J5IFJhbmdlIFJlc291cmNlXG4iKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZWFkJXNcbiIsCi0JCQkgQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJIG1lbW9yeTMyX2RhdGEtPnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSAiL1dyaXRlIiA6ICIgb25seSIpOworCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09CisJCQltZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCQkiL1dyaXRlIiA6ICIgb25seSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIG1pbmltdW0gYmFzZTogJTA4WFxuIiwKLQkJCSBtZW1vcnkzMl9kYXRhLT5taW5fYmFzZV9hZGRyZXNzKTsKKwkJbWVtb3J5MzJfZGF0YS0+bWluX2Jhc2VfYWRkcmVzcyk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmFuZ2UgbWF4aW11bSBiYXNlOiAlMDhYXG4iLAotCQkJIG1lbW9yeTMyX2RhdGEtPm1heF9iYXNlX2FkZHJlc3MpOworCQltZW1vcnkzMl9kYXRhLT5tYXhfYmFzZV9hZGRyZXNzKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBBbGlnbm1lbnQ6ICUwOFhcbiIsCi0JCQkgbWVtb3J5MzJfZGF0YS0+YWxpZ25tZW50KTsKKwlhY3BpX29zX3ByaW50ZiAoIiAgQWxpZ25tZW50OiAlMDhYXG4iLCBtZW1vcnkzMl9kYXRhLT5hbGlnbm1lbnQpOwogCi0JYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwKLQkJCSBtZW1vcnkzMl9kYXRhLT5yYW5nZV9sZW5ndGgpOworCWFjcGlfb3NfcHJpbnRmICgiICBSYW5nZSBsZW5ndGg6ICUwOFhcbiIsIG1lbW9yeTMyX2RhdGEtPnJhbmdlX2xlbmd0aCk7CiAKIAlyZXR1cm47CiB9CkBAIC00NTUsMTEgKzQ5OCwxMiBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgICAgICpkYXRhKQogewotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICAgICpmaXhlZF9tZW1vcnkzMl9kYXRhID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICopIGRhdGE7CisJc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIgICAgKmZpeGVkX21lbW9yeTMyX2RhdGEgPQorCQkJICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX21lbTMyICopIGRhdGE7CiAKIAogCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CkBAIC00NjgsMTUgKzUxMiwxNCBAQAogCWFjcGlfb3NfcHJpbnRmICgiMzItQml0IEZpeGVkIExvY2F0aW9uIE1lbW9yeSBSYW5nZSBSZXNvdXJjZVxuIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVhZCVzXG4iLAotCQkJIEFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCSBmaXhlZF9tZW1vcnkzMl9kYXRhLT5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkgIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQorCQkJZml4ZWRfbWVtb3J5MzJfZGF0YS0+cmVhZF93cml0ZV9hdHRyaWJ1dGUgPyAiL1dyaXRlIiA6ICIgT25seSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGJhc2UgYWRkcmVzczogJTA4WFxuIiwKLQkJCSBmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9iYXNlX2FkZHJlc3MpOworCQlmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9iYXNlX2FkZHJlc3MpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIFJhbmdlIGxlbmd0aDogJTA4WFxuIiwKLQkJCSBmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9sZW5ndGgpOworCQlmaXhlZF9tZW1vcnkzMl9kYXRhLT5yYW5nZV9sZW5ndGgpOwogCiAJcmV0dXJuOwogfQpAQCAtNDk0LDcgKzUzNyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9hZGRyZXNzMTYgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC01MTQsMzUgKzU1NywzMCBAQAogCiAJCXN3aXRjaCAoYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fQ0FDSEVBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIk5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbmNhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0NBQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkNhY2hlYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IENhY2hlYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1dSSVRFX0NPTUJJTklOR19NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBXcml0ZS1jb21iaW5pbmcgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9QUkVGRVRDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUHJlZmV0Y2hhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IEludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFJlYWQlc1xuIiwKIAkJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgPT0KLQkJCWFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KLQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CisJCQkJYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPworCQkJCSIvV3JpdGUiIDogIiBPbmx5Iik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0lPX1JBTkdFOgpAQCAtNTUxLDMwICs1ODksMjYgQEAKIAogCQlzd2l0Y2ggKGFkZHJlc3MxNl9kYXRhLT5hdHRyaWJ1dGUuaW8ucmFuZ2VfYXR0cmlidXRlKSB7CiAJCWNhc2UgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IE5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9FTlRJUkVfUkFOR0U6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJU0EgYW5kIG5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJbnZhbGlkIHJhbmdlIGF0dHJpYnV0ZVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCByYW5nZSBhdHRyaWJ1dGVcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCiAJCQlBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTiA9PQotCQkJYWRkcmVzczE2X2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPwotCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKKwkJCQlhZGRyZXNzMTZfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/CisJCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfQlVTX05VTUJFUl9SQU5HRToKQEAgLTU4OSw0MSArNjIzLDQyIEBACiAJfQogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzMTZfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQlBQ1BJX0NPTlNVTUVSID09IGFkZHJlc3MxNl9kYXRhLT5wcm9kdWNlcl9jb25zdW1lciA/CiAJCQkiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgJXMgZGVjb2RlXG4iLAotCQkJIEFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMTZfZGF0YS0+ZGVjb2RlID8KLQkJCSAiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CisJCUFDUElfU1VCX0RFQ09ERSA9PSBhZGRyZXNzMTZfZGF0YS0+ZGVjb2RlID8KKwkJCSJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBNaW4gYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJCSBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KLQkJCSAiIiA6ICJub3QiKTsKKwkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/CisJCQkiIiA6ICJub3QiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJCSBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJCSAiIiA6ICJub3QiKTsKKwkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MxNl9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/CisJCQkiIiA6ICJub3QiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBHcmFudWxhcml0eTogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMTZfZGF0YS0+Z3JhbnVsYXJpdHkpOworCQlhZGRyZXNzMTZfZGF0YS0+Z3JhbnVsYXJpdHkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlMDhYXG4iLAotCQkJIGFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7CisJCWFkZHJlc3MxNl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKTsKKwkJYWRkcmVzczE2X2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCQlhZGRyZXNzMTZfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgTGVuZ3RoOiAlMDhYXG4iLAotCQkJIGFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7CisJCWFkZHJlc3MxNl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7CiAKIAlpZiAoMHhGRiAhPSBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KSB7CiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2UgSW5kZXg6ICVYXG4iLAotCQkJCSBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwkJCWFkZHJlc3MxNl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCiAJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBTb3VyY2U6ICVzXG4iLAotCQkJCSBhZGRyZXNzMTZfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOworCQkJYWRkcmVzczE2X2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIAl9CiAKIAlyZXR1cm47CkBAIC02NDIsNyArNjc3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCitzdGF0aWMgdm9pZAogYWNwaV9yc19kdW1wX2FkZHJlc3MzMiAoCiAJdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSkKIHsKQEAgLTY2MSwzNSArNjk2LDMwIEBACiAKIAkJc3dpdGNoIChhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5jYWNoZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9DQUNIRUFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uY2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfQ0FDSEFCTEVfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiQ2FjaGVhYmxlIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogQ2FjaGVhYmxlIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfV1JJVEVfQ09NQklOSU5HX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIldyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFdyaXRlLWNvbWJpbmluZyBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1BSRUZFVENIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBQcmVmZXRjaGFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBjYWNoZSBhdHRyaWJ1dGVcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogUmVhZCVzXG4iLAogCQkJQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PQotCQkJYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5tZW1vcnkucmVhZF93cml0ZV9hdHRyaWJ1dGUgPwotCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKKwkJCQlhZGRyZXNzMzJfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/CisJCQkJIi9Xcml0ZSIgOiAiIE9ubHkiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfSU9fUkFOR0U6CkBAIC02OTgsMzAgKzcyOCwyNiBAQAogCiAJCXN3aXRjaCAoYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5pby5yYW5nZV9hdHRyaWJ1dGUpIHsKIAkJY2FzZSBBQ1BJX05PTl9JU0FfT05MWV9SQU5HRVM6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogTm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIklTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX0VOVElSRV9SQU5HRToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIklTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IElTQSBhbmQgbm9uLUlTQSBJbyBBZGRyZXNzZXNcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkludmFsaWQgUmFuZ2UgYXR0cmlidXRlIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICVzIFRyYW5zbGF0aW9uXG4iLAogCQkJQUNQSV9TUEFSU0VfVFJBTlNMQVRJT04gPT0KLQkJCWFkZHJlc3MzMl9kYXRhLT5hdHRyaWJ1dGUuaW8udHJhbnNsYXRpb25fYXR0cmlidXRlID8KLQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CisJCQkJYWRkcmVzczMyX2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPworCQkJCSJTcGFyc2UiIDogIkRlbnNlIik7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6CkBAIC03MzEsNDYgKzc1Nyw0OCBAQAogCiAJZGVmYXVsdDoKIAotCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwgYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3R5cGUpOworCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgVHlwZTogMHglMi4yWFxuIiwKKwkJCWFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV90eXBlKTsKIAkJYnJlYWs7CiAJfQogCiAJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlICVzXG4iLAotCQkJIEFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczMyX2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KLQkJCSAiQ29uc3VtZXIiIDogIlByb2R1Y2VyIik7CisJCUFDUElfQ09OU1VNRVIgPT0gYWRkcmVzczMyX2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KKwkJCSJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlcyBkZWNvZGVcbiIsCi0JCQkgQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MzMl9kYXRhLT5kZWNvZGUgPwotCQkJICJTdWJ0cmFjdGl2ZSIgOiAiUG9zaXRpdmUiKTsKKwkJQUNQSV9TVUJfREVDT0RFID09IGFkZHJlc3MzMl9kYXRhLT5kZWNvZGUgPworCQkJIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIE1pbiBhZGRyZXNzIGlzICVzIGZpeGVkXG4iLAotCQkJIEFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzMzJfZGF0YS0+bWluX2FkZHJlc3NfZml4ZWQgPwotCQkJICIiIDogIm5vdCAiKTsKKwkJQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/CisJCQkiIiA6ICJub3QgIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgTWF4IGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCQkgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3MzMl9kYXRhLT5tYXhfYWRkcmVzc19maXhlZCA/Ci0JCQkgIiIgOiAibm90ICIpOworCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KKwkJCSIiIDogIm5vdCAiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBHcmFudWxhcml0eTogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMzJfZGF0YS0+Z3JhbnVsYXJpdHkpOworCQlhZGRyZXNzMzJfZGF0YS0+Z3JhbnVsYXJpdHkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgcmFuZ2UgbWluOiAlMDhYXG4iLAotCQkJIGFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7CisJCWFkZHJlc3MzMl9kYXRhLT5taW5fYWRkcmVzc19yYW5nZSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtYXg6ICUwOFhcbiIsCi0JCQkgYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKTsKKwkJYWRkcmVzczMyX2RhdGEtPm1heF9hZGRyZXNzX3JhbmdlKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHRyYW5zbGF0aW9uIG9mZnNldDogJTA4WFxuIiwKLQkJCSBhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOworCQlhZGRyZXNzMzJfZGF0YS0+YWRkcmVzc190cmFuc2xhdGlvbl9vZmZzZXQpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgTGVuZ3RoOiAlMDhYXG4iLAotCQkJIGFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7CisJCWFkZHJlc3MzMl9kYXRhLT5hZGRyZXNzX2xlbmd0aCk7CiAKIAlpZigweEZGICE9IGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVhcbiIsCi0JCQkJIGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpOworCQkJYWRkcmVzczMyX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXNcbiIsCi0JCQkJIGFkZHJlc3MzMl9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CisJCQlhZGRyZXNzMzJfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCX0KIAogCXJldHVybjsKQEAgLTc4OSw3ICs4MTcsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBhY3BpX3JzX2R1bXBfYWRkcmVzczY0ICgKIAl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKQogewpAQCAtODA4LDM1ICs4MzYsMzAgQEAKIAogCQlzd2l0Y2ggKGFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LmNhY2hlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0NBQ0hFQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb25jYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9DQUNIQUJMRV9NRU1PUlk6Ci0JCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogIgotCQkJCQkgICJDYWNoZWFibGUgbWVtb3J5XG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBDYWNoZWFibGUgbWVtb3J5XG4iKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9XUklURV9DT01CSU5JTkdfTUVNT1JZOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogV3JpdGUtY29tYmluaW5nIG1lbW9yeVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWToKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIlByZWZldGNoYWJsZSBtZW1vcnlcbiIpOworCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6IFByZWZldGNoYWJsZSBtZW1vcnlcbiIpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIkludmFsaWQgY2FjaGUgYXR0cmlidXRlXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZVxuIik7CiAJCQlicmVhazsKIAkJfQogCiAJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBSZWFkJXNcbiIsCiAJCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZID09Ci0JCQlhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLm1lbW9yeS5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA/Ci0JCQkiL1dyaXRlIiA6ICIgT25seSIpOworCQkJCWFkZHJlc3M2NF9kYXRhLT5hdHRyaWJ1dGUubWVtb3J5LnJlYWRfd3JpdGVfYXR0cmlidXRlID8KKwkJCQkiL1dyaXRlIiA6ICIgT25seSIpOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9JT19SQU5HRToKQEAgLTg0NSwzMCArODY4LDI2IEBACiAKIAkJc3dpdGNoIChhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLmlvLnJhbmdlX2F0dHJpYnV0ZSkgewogCQljYXNlIEFDUElfTk9OX0lTQV9PTkxZX1JBTkdFUzoKLQkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiAiCi0JCQkJCSAgIk5vbi1JU0EgSW8gQWRkcmVzc2VzXG4iKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBOb24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfSVNBX09OTFlfUkFOR0VTOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfRU5USVJFX1JBTkdFOgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CisJCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogSVNBIGFuZCBub24tSVNBIElvIEFkZHJlc3Nlc1xuIik7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJYWNwaV9vc19wcmludGYgKCIgIFR5cGUgU3BlY2lmaWM6ICIKLQkJCQkJICAiSW52YWxpZCBSYW5nZSBhdHRyaWJ1dGUiKTsKKwkJCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljOiBJbnZhbGlkIFJhbmdlIGF0dHJpYnV0ZSIpOwogCQkJYnJlYWs7CiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZiAoIiAgVHlwZSBTcGVjaWZpYzogJXMgVHJhbnNsYXRpb25cbiIsCiAJCQlBQ1BJX1NQQVJTRV9UUkFOU0xBVElPTiA9PQotCQkJYWRkcmVzczY0X2RhdGEtPmF0dHJpYnV0ZS5pby50cmFuc2xhdGlvbl9hdHRyaWJ1dGUgPwotCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKKwkJCQlhZGRyZXNzNjRfZGF0YS0+YXR0cmlidXRlLmlvLnRyYW5zbGF0aW9uX2F0dHJpYnV0ZSA/CisJCQkJIlNwYXJzZSIgOiAiRGVuc2UiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfQlVTX05VTUJFUl9SQU5HRToKQEAgLTg3OCw0OSArODk3LDUxIEBACiAKIAlkZWZhdWx0OgogCi0JCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLCBhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2VfdHlwZSk7CisJCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSBUeXBlOiAweCUyLjJYXG4iLAorCQkJYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3R5cGUpOwogCQlicmVhazsKIAl9CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgJXNcbiIsCi0JCQkgQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzNjRfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJICJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKKwkJQUNQSV9DT05TVU1FUiA9PSBhZGRyZXNzNjRfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPworCQkJIkNvbnN1bWVyIiA6ICJQcm9kdWNlciIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzIGRlY29kZVxuIiwKLQkJCSBBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczY0X2RhdGEtPmRlY29kZSA/Ci0JCQkgIlN1YnRyYWN0aXZlIiA6ICJQb3NpdGl2ZSIpOworCQlBQ1BJX1NVQl9ERUNPREUgPT0gYWRkcmVzczY0X2RhdGEtPmRlY29kZSA/CisJCQkiU3VidHJhY3RpdmUiIDogIlBvc2l0aXZlIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgTWluIGFkZHJlc3MgaXMgJXMgZml4ZWRcbiIsCi0JCQkgQUNQSV9BRERSRVNTX0ZJWEVEID09IGFkZHJlc3M2NF9kYXRhLT5taW5fYWRkcmVzc19maXhlZCA/Ci0JCQkgIiIgOiAibm90ICIpOworCQlBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1pbl9hZGRyZXNzX2ZpeGVkID8KKwkJCSIiIDogIm5vdCAiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBNYXggYWRkcmVzcyBpcyAlcyBmaXhlZFxuIiwKLQkJCSBBQ1BJX0FERFJFU1NfRklYRUQgPT0gYWRkcmVzczY0X2RhdGEtPm1heF9hZGRyZXNzX2ZpeGVkID8KLQkJCSAiIiA6ICJub3QgIik7CisJCUFDUElfQUREUkVTU19GSVhFRCA9PSBhZGRyZXNzNjRfZGF0YS0+bWF4X2FkZHJlc3NfZml4ZWQgPworCQkJIiIgOiAibm90ICIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEdyYW51bGFyaXR5OiAlOC44WCU4LjhYXG4iLAotCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPmdyYW51bGFyaXR5KSk7CisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPmdyYW51bGFyaXR5KSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyByYW5nZSBtaW46ICU4LjhYJTguOFhcbiIsCi0JCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpKTsKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+bWluX2FkZHJlc3NfcmFuZ2UpKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBBZGRyZXNzIHJhbmdlIG1heDogJTguOFglOC44WFxuIiwKLQkJCSBBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSkpOworCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3M2NF9kYXRhLT5tYXhfYWRkcmVzc19yYW5nZSkpOwogCiAJYWNwaV9vc19wcmludGYgKCIgIEFkZHJlc3MgdHJhbnNsYXRpb24gb2Zmc2V0OiAlOC44WCU4LjhYXG4iLAotCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KSk7CisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPmFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KSk7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzcyBMZW5ndGg6ICU4LjhYJTguOFhcbiIsCi0JCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc19sZW5ndGgpKTsKKwkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+YWRkcmVzc19sZW5ndGgpKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBUeXBlIFNwZWNpZmljIEF0dHJpYnV0ZXM6ICU4LjhYJTguOFhcbiIsCi0JCQkgQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzNjRfZGF0YS0+dHlwZV9zcGVjaWZpY19hdHRyaWJ1dGVzKSk7CisJCUFDUElfRk9STUFUX1VJTlQ2NCAoYWRkcmVzczY0X2RhdGEtPnR5cGVfc3BlY2lmaWNfYXR0cmlidXRlcykpOwogCiAJaWYgKDB4RkYgIT0gYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCkgewogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlIEluZGV4OiAlWFxuIiwKLQkJCQkgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJCQlhZGRyZXNzNjRfZGF0YS0+cmVzb3VyY2Vfc291cmNlLmluZGV4KTsKKwogCQlhY3BpX29zX3ByaW50ZiAoIiAgUmVzb3VyY2UgU291cmNlOiAlc1xuIiwKLQkJCQkgYWRkcmVzczY0X2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJCWFkZHJlc3M2NF9kYXRhLT5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cik7CiAJfQogCiAJcmV0dXJuOwpAQCAtOTM5LDcgKzk2MCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEgKAogCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpCiB7CkBAIC05NTMsMjMgKzk3NCwyMiBAQAogCWFjcGlfb3NfcHJpbnRmICgiRXh0ZW5kZWQgSVJRIFJlc291cmNlXG4iKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICBSZXNvdXJjZSAlc1xuIiwKLQkJCSBBQ1BJX0NPTlNVTUVSID09IGV4dF9pcnFfZGF0YS0+cHJvZHVjZXJfY29uc3VtZXIgPwotCQkJICJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKKwkJQUNQSV9DT05TVU1FUiA9PSBleHRfaXJxX2RhdGEtPnByb2R1Y2VyX2NvbnN1bWVyID8KKwkJCSJDb25zdW1lciIgOiAiUHJvZHVjZXIiKTsKIAogCWFjcGlfb3NfcHJpbnRmICgiICAlc1xuIiwKLQkJCSBBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBleHRfaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPwotCQkJICJMZXZlbCIgOiAiRWRnZSIpOworCQlBQ1BJX0xFVkVMX1NFTlNJVElWRSA9PSBleHRfaXJxX2RhdGEtPmVkZ2VfbGV2ZWwgPworCQkJIkxldmVsIiA6ICJFZGdlIik7CiAKIAlhY3BpX29zX3ByaW50ZiAoIiAgQWN0aXZlICVzXG4iLAotCQkJIEFDUElfQUNUSVZFX0xPVyA9PSBleHRfaXJxX2RhdGEtPmFjdGl2ZV9oaWdoX2xvdyA/Ci0JCQkgImxvdyIgOiAiaGlnaCIpOworCQlBQ1BJX0FDVElWRV9MT1cgPT0gZXh0X2lycV9kYXRhLT5hY3RpdmVfaGlnaF9sb3cgPworCQkJImxvdyIgOiAiaGlnaCIpOwogCiAJYWNwaV9vc19wcmludGYgKCIgICVzXG4iLAotCQkJIEFDUElfU0hBUkVEID09IGV4dF9pcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/Ci0JCQkgIlNoYXJlZCIgOiAiRXhjbHVzaXZlIik7CisJCUFDUElfU0hBUkVEID09IGV4dF9pcnFfZGF0YS0+c2hhcmVkX2V4Y2x1c2l2ZSA/CisJCQkiU2hhcmVkIiA6ICJFeGNsdXNpdmUiKTsKIAotCWFjcGlfb3NfcHJpbnRmICgiICBJbnRlcnJ1cHRzIDogJVggKCAiLAotCQkJIGV4dF9pcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHMpOworCWFjcGlfb3NfcHJpbnRmICgiICBJbnRlcnJ1cHRzIDogJVggKCAiLCBleHRfaXJxX2RhdGEtPm51bWJlcl9vZl9pbnRlcnJ1cHRzKTsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGV4dF9pcnFfZGF0YS0+bnVtYmVyX29mX2ludGVycnVwdHM7IGluZGV4KyspIHsKIAkJYWNwaV9vc19wcmludGYgKCIlWCAiLCBleHRfaXJxX2RhdGEtPmludGVycnVwdHNbaW5kZXhdKTsKQEAgLTk3OSw5ICs5OTksMTAgQEAKIAogCWlmKDB4RkYgIT0gZXh0X2lycV9kYXRhLT5yZXNvdXJjZV9zb3VyY2UuaW5kZXgpIHsKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZSBJbmRleDogJVgiLAotCQkJCSBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisJCQlleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5pbmRleCk7CisKIAkJYWNwaV9vc19wcmludGYgKCIgIFJlc291cmNlIFNvdXJjZTogJXMiLAotCQkJCSBleHRfaXJxX2RhdGEtPnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKKwkJCWV4dF9pcnFfZGF0YS0+cmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIpOwogCX0KIAogCXJldHVybjsKQEAgLTk5Miw3ICsxMDEzLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19kdW1wX3Jlc291cmNlX2xpc3QKICAqCi0gKiBQQVJBTUVURVJTOiAgRGF0YSAgICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlIHRvIGR1bXAuCisgKiBQQVJBTUVURVJTOiAgUmVzb3VyY2UgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlIHRvIGR1bXAuCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC0xMDk2LDcgKzExMTcsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2R1bXBfaXJxX2xpc3QKICAqCi0gKiBQQVJBTUVURVJTOiAgRGF0YSAgICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgcm91dGluZyB0YWJsZSB0byBkdW1wLgorICogUEFSQU1FVEVSUzogIHJvdXRlX3RhYmxlICAgICAtIHBvaW50ZXIgdG8gdGhlIHJvdXRpbmcgdGFibGUgdG8gZHVtcC4KICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKQEAgLTExMjQsMjAgKzExNDUsMTcgQEAKIAkJCWFjcGlfb3NfcHJpbnRmICgiUENJIElSUSBSb3V0aW5nIFRhYmxlIHN0cnVjdHVyZSAlWC5cbiIsIGNvdW50KyspOwogCiAJCQlhY3BpX29zX3ByaW50ZiAoIiAgQWRkcmVzczogJTguOFglOC44WFxuIiwKLQkJCQkJIEFDUElfRk9STUFUX1VJTlQ2NCAocHJ0X2VsZW1lbnQtPmFkZHJlc3MpKTsKKwkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKHBydF9lbGVtZW50LT5hZGRyZXNzKSk7CiAKIAkJCWFjcGlfb3NfcHJpbnRmICgiICBQaW46ICVYXG4iLCBwcnRfZWxlbWVudC0+cGluKTsKIAogCQkJYWNwaV9vc19wcmludGYgKCIgIFNvdXJjZTogJXNcbiIsIHBydF9lbGVtZW50LT5zb3VyY2UpOwogCi0JCQlhY3BpX29zX3ByaW50ZiAoIiAgc291cmNlX2luZGV4OiAlWFxuIiwKLQkJCQkJIHBydF9lbGVtZW50LT5zb3VyY2VfaW5kZXgpOworCQkJYWNwaV9vc19wcmludGYgKCIgIHNvdXJjZV9pbmRleDogJVhcbiIsIHBydF9lbGVtZW50LT5zb3VyY2VfaW5kZXgpOwogCiAJCQlidWZmZXIgKz0gcHJ0X2VsZW1lbnQtPmxlbmd0aDsKLQogCQkJcHJ0X2VsZW1lbnQgPSBBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgYWNwaV9wY2lfcm91dGluZ190YWJsZSwgYnVmZmVyKTsKLQotCQkJaWYoMCA9PSBwcnRfZWxlbWVudC0+bGVuZ3RoKSB7CisJCQlpZiAoMCA9PSBwcnRfZWxlbWVudC0+bGVuZ3RoKSB7CiAJCQkJZG9uZSA9IFRSVUU7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpby5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKaW5kZXggOTcyYzc0Ni4uMjNhNGQxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lvLmMKQEAgLTgxLDY3ICs4MSw2MCBAQAogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9pbyk7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfaW8pOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfaW9fcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBDb25zdGFudAotCSAqLworCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50ICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSA4OwogCiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9JTzsKIAotCS8qCi0JICogQ2hlY2sgRGVjb2RlCi0JICovCisJLyogQ2hlY2sgRGVjb2RlICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLmlvX2RlY29kZSA9IHRlbXA4ICYgMHgwMTsKIAotCS8qCi0JICogQ2hlY2sgbWluX2Jhc2UgQWRkcmVzcwotCSAqLworCS8qIENoZWNrIG1pbl9iYXNlIEFkZHJlc3MgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8ubWluX2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAotCS8qCi0JICogQ2hlY2sgbWF4X2Jhc2UgQWRkcmVzcwotCSAqLworCS8qIENoZWNrIG1heF9iYXNlIEFkZHJlc3MgKi8KKwogCWJ1ZmZlciArPSAyOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuaW8ubWF4X2Jhc2VfYWRkcmVzcyA9IHRlbXAxNjsKIAotCS8qCi0JICogQ2hlY2sgQmFzZSBhbGlnbm1lbnQKLQkgKi8KKwkvKiBDaGVjayBCYXNlIGFsaWdubWVudCAqLworCiAJYnVmZmVyICs9IDI7CiAJdGVtcDggPSAqYnVmZmVyOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pby5hbGlnbm1lbnQgPSB0ZW1wODsKIAotCS8qCi0JICogQ2hlY2sgcmFuZ2VfbGVuZ3RoCi0JICovCisJLyogQ2hlY2sgcmFuZ2VfbGVuZ3RoICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlvLnJhbmdlX2xlbmd0aCA9IHRlbXA4OwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTE3OSw0MyArMTcyLDM5IEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2ZpeGVkX2lvKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19maXhlZF9pb19yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50Ci0JICovCisJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KKwogCSpieXRlc19jb25zdW1lZCA9IDQ7CiAKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX0ZJWEVEX0lPOwogCi0JLyoKLQkgKiBDaGVjayBSYW5nZSBCYXNlIEFkZHJlc3MKLQkgKi8KKwkvKiBDaGVjayBSYW5nZSBCYXNlIEFkZHJlc3MgKi8KKwogCWJ1ZmZlciArPSAxOwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfaW8uYmFzZV9hZGRyZXNzID0gdGVtcDE2OwogCi0JLyoKLQkgKiBDaGVjayByYW5nZV9sZW5ndGgKLQkgKi8KKwkvKiBDaGVjayByYW5nZV9sZW5ndGggKi8KKwogCWJ1ZmZlciArPSAyOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfaW8ucmFuZ2VfbGVuZ3RoID0gdGVtcDg7CiAKLQkvKgotCSAqIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlcgotCSAqLworCS8qIFNldCB0aGUgTGVuZ3RoIHBhcmFtZXRlciAqLworCiAJb3V0cHV0X3N0cnVjdC0+bGVuZ3RoID0gKHUzMikgc3RydWN0X3NpemU7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMjUxLDU1ICsyNDAsNDggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfaW9fc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg0NzsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogSW8gSW5mb3JtYXRpb24gQnl0ZQotCSAqLworCS8qIElvIEluZm9ybWF0aW9uIEJ5dGUgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEuaW8uaW9fZGVjb2RlICYgMHgwMSk7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzICovCisKIAl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5pby5taW5fYmFzZV9hZGRyZXNzOwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcyAqLworCiAJdGVtcDE2ID0gKHUxNikgbGlua2VkX2xpc3QtPmRhdGEuaW8ubWF4X2Jhc2VfYWRkcmVzczsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBiYXNlIGFsaWdubWVudAotCSAqLworCS8qIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQgKi8KKwogCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5pby5hbGlnbm1lbnQ7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgcmFuZ2UgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KKwogCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5pby5yYW5nZV9sZW5ndGg7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzM1LDMyICszMTcsMjggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfaW9fc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg0QjsKIAogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgYmFzZSBhZGRyZXNzICovCisKIAl0ZW1wMTYgPSAodTE2KSBsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9pby5iYXNlX2FkZHJlc3M7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgcmFuZ2UgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KKwogCXRlbXA4ID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9pby5yYW5nZV9sZW5ndGg7CiAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMzk5LDIxICszNzcsMjAgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2RtYSk7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZG1hKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2RtYV9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIENvbnN0YW50Ci0JICovCisJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBhcmUgQ29uc3RhbnQgKi8KKwogCSpieXRlc19jb25zdW1lZCA9IDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9ETUE7CiAKLQkvKgotCSAqIFBvaW50IHRvIHRoZSA4LWJpdHMgb2YgQnl0ZSAxCi0JICovCisJLyogUG9pbnQgdG8gdGhlIDgtYml0cyBvZiBCeXRlIDEgKi8KKwogCWJ1ZmZlciArPSAxOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtNDMwLDQ2ICs0MDcsNDAgQEAKIAogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZG1hLm51bWJlcl9vZl9jaGFubmVscyA9IGk7CiAJaWYgKGkgPiAwKSB7Ci0JCS8qCi0JCSAqIENhbGN1bGF0ZSB0aGUgc3RydWN0dXJlIHNpemUgYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMKLQkJICovCisJCS8qIENhbGN1bGF0ZSB0aGUgc3RydWN0dXJlIHNpemUgYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgKi8KKwogCQlzdHJ1Y3Rfc2l6ZSArPSAoKGFjcGlfc2l6ZSkgaSAtIDEpICogNDsKIAl9CiAKLQkvKgotCSAqIFBvaW50IHRvIEJ5dGUgMgotCSAqLworCS8qIFBvaW50IHRvIEJ5dGUgMiAqLworCiAJYnVmZmVyICs9IDE7CiAJdGVtcDggPSAqYnVmZmVyOwogCi0JLyoKLQkgKiBDaGVjayBmb3IgdHJhbnNmZXIgcHJlZmVyZW5jZSAoQml0c1sxOjBdKQotCSAqLworCS8qIENoZWNrIGZvciB0cmFuc2ZlciBwcmVmZXJlbmNlIChCaXRzWzE6MF0pICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS50cmFuc2ZlciA9IHRlbXA4ICYgMHgwMzsKIAogCWlmICgweDAzID09IG91dHB1dF9zdHJ1Y3QtPmRhdGEuZG1hLnRyYW5zZmVyKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBETUEuVHJhbnNmZXIgcHJlZmVyZW5jZSAoMylcbiIpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiSW52YWxpZCBETUEuVHJhbnNmZXIgcHJlZmVyZW5jZSAoMylcbiIpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfREFUQSk7CiAJfQogCi0JLyoKLQkgKiBHZXQgYnVzIG1hc3RlciBwcmVmZXJlbmNlIChCaXRbMl0pCi0JICovCisJLyogR2V0IGJ1cyBtYXN0ZXIgcHJlZmVyZW5jZSAoQml0WzJdKSAqLworCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5kbWEuYnVzX21hc3RlciA9ICh0ZW1wOCA+PiAyKSAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCBjaGFubmVsIHNwZWVkIHN1cHBvcnQgKEJpdHNbNjo1XSkKLQkgKi8KKwkvKiBHZXQgY2hhbm5lbCBzcGVlZCBzdXBwb3J0IChCaXRzWzY6NV0pICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmRtYS50eXBlID0gKHRlbXA4ID4+IDUpICYgMHgwMzsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC01MDYsMTYgKzQ3NywxNCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19kbWFfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHgyQTsKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9IDA7CiAKLQkvKgotCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIENoYW5uZWxzIGFuZCBzZXQgdGhlIG1hc2sgYml0cwotCSAqLworCS8qIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIENoYW5uZWxzIGFuZCBzZXQgdGhlIG1hc2sgYml0cyAqLworCiAJZm9yIChpbmRleCA9IDA7CiAJCSBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLmRtYS5udW1iZXJfb2ZfY2hhbm5lbHM7CiAJCSBpbmRleCsrKSB7CkBAIC01MjYsOSArNDk1LDggQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgRE1BIEluZm8KLQkgKi8KKwkvKiBTZXQgdGhlIERNQSBJbmZvICovCisKIAl0ZW1wOCA9ICh1OCkgKChsaW5rZWRfbGlzdC0+ZGF0YS5kbWEudHlwZSAmIDB4MDMpIDw8IDUpOwogCXRlbXA4IHw9ICgobGlua2VkX2xpc3QtPmRhdGEuZG1hLmJ1c19tYXN0ZXIgJiAweDAxKSA8PCAyKTsKIAl0ZW1wOCB8PSAobGlua2VkX2xpc3QtPmRhdGEuZG1hLnRyYW5zZmVyICYgMHgwMyk7CkBAIC01MzYsOSArNTA0LDggQEAKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2lycS5jCmluZGV4IGZkMDdhODcuLjhhMmI2MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaXJxLmMKQEAgLTgzLDcgKzgzLDggQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX2lycSk7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2lycV9yZXNvdXJjZSIpOwpAQCAtOTEsMTUgKzkyLDE0IEBACiAKIAkvKgogCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZGVzY3JpcHRvcgotCSAqICAoQml0czowLTEpCisJICogKEJpdHM6MC0xKQogCSAqLwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAkqYnl0ZXNfY29uc3VtZWQgPSAodGVtcDggJiAweDAzKSArIDE7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9JUlE7CiAKLQkvKgotCSAqIFBvaW50IHRvIHRoZSAxNi1iaXRzIG9mIEJ5dGVzIDEgYW5kIDIKLQkgKi8KKwkvKiBQb2ludCB0byB0aGUgMTYtYml0cyBvZiBCeXRlcyAxIGFuZCAyICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKQEAgLTExOCwyMiArMTE4LDE5IEBACiAKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5udW1iZXJfb2ZfaW50ZXJydXB0cyA9IGk7CiAJaWYgKGkgPiAwKSB7Ci0JCS8qCi0JCSAqIENhbGN1bGF0ZSB0aGUgc3RydWN0dXJlIHNpemUgYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMKLQkJICovCisJCS8qIENhbGN1bGF0ZSB0aGUgc3RydWN0dXJlIHNpemUgYmFzZWQgdXBvbiB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMgKi8KKwogCQlzdHJ1Y3Rfc2l6ZSArPSAoKGFjcGlfc2l6ZSkgaSAtIDEpICogNDsKIAl9CiAKLQkvKgotCSAqIFBvaW50IHRvIEJ5dGUgMyBpZiBpdCBpcyB1c2VkCi0JICovCisJLyogUG9pbnQgdG8gQnl0ZSAzIGlmIGl0IGlzIHVzZWQgKi8KKwogCWlmICg0ID09ICpieXRlc19jb25zdW1lZCkgewogCQlidWZmZXIgKz0gMjsKIAkJdGVtcDggPSAqYnVmZmVyOwogCi0JCS8qCi0JCSAqIENoZWNrIGZvciBIRSwgTEwgaW50ZXJydXB0cwotCQkgKi8KKwkJLyogQ2hlY2sgZm9yIEhFLCBMTCBpbnRlcnJ1cHRzICovCisKIAkJc3dpdGNoICh0ZW1wOCAmIDB4MDkpIHsKIAkJY2FzZSAweDAxOiAvKiBIRSAqLwogCQkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5pcnEuZWRnZV9sZXZlbCA9IEFDUElfRURHRV9TRU5TSVRJVkU7CkBAIC0xNTIsMTMgKzE0OSwxMyBAQAogCQkJICogc28gMHgwMCBhbmQgMHgwOSBhcmUgaWxsZWdhbC4KIAkJCSAqLwogCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJIkludmFsaWQgaW50ZXJydXB0IHBvbGFyaXR5L3RyaWdnZXIgaW4gcmVzb3VyY2UgbGlzdCwgJVhcbiIsIHRlbXA4KSk7CisJCQkJIkludmFsaWQgaW50ZXJydXB0IHBvbGFyaXR5L3RyaWdnZXIgaW4gcmVzb3VyY2UgbGlzdCwgJVhcbiIsCisJCQkJdGVtcDgpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfQkFEX0RBVEEpOwogCQl9CiAKLQkJLyoKLQkJICogQ2hlY2sgZm9yIHNoYXJhYmxlCi0JCSAqLworCQkvKiBDaGVjayBmb3Igc2hhcmFibGUgKi8KKwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKIAl9CiAJZWxzZSB7CkBAIC0xNzEsMTQgKzE2OCwxMiBAQAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmlycS5zaGFyZWRfZXhjbHVzaXZlID0gQUNQSV9FWENMVVNJVkU7CiAJfQogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTIzNCw5ICsyMjksOCBAQAogCWJ1ZmZlciArPSAxOwogCXRlbXAxNiA9IDA7CiAKLQkvKgotCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIGludGVycnVwdHMgYW5kIHNldCB0aGUgbWFzayBiaXRzCi0JICovCisJLyogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgaW50ZXJydXB0cyBhbmQgc2V0IHRoZSBtYXNrIGJpdHMgKi8KKwogCWZvcihpbmRleCA9IDA7CiAJCWluZGV4IDwgbGlua2VkX2xpc3QtPmRhdGEuaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOwogCQlpbmRleCsrKSB7CkBAIC0yNDcsOSArMjQxLDggQEAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgSVJRIEluZm8gYnl0ZSBpZiBuZWVkZWQuCi0JICovCisJLyogU2V0IHRoZSBJUlEgSW5mbyBieXRlIGlmIG5lZWRlZC4gKi8KKwogCWlmIChJUnFpbmZvX2J5dGVfbmVlZGVkKSB7CiAJCXRlbXA4ID0gMDsKIAkJdGVtcDggPSAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuaXJxLnNoYXJlZF9leGNsdXNpdmUgJgpAQCAtMjY3LDkgKzI2MCw4IEBACiAJCWJ1ZmZlciArPSAxOwogCX0KIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zMDksMTUgKzMwMSwxNSBAQAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfcHRyOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9leHRfaXJxKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2V4dGVuZGVkX2lycV9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAKQEAgLTMzMCw5ICszMjIsOCBAQAogCSpieXRlc19jb25zdW1lZCA9IHRlbXAxNiArIDM7CiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9FWFRfSVJROwogCi0JLyoKLQkgKiBQb2ludCB0byB0aGUgQnl0ZTMKLQkgKi8KKwkvKiBQb2ludCB0byB0aGUgQnl0ZTMgKi8KKwogCWJ1ZmZlciArPSAyOwogCXRlbXA4ID0gKmJ1ZmZlcjsKIApAQCAtMzQ3LDIxICszMzgsMTggQEAKIAkgKiAtIEVkZ2UvTGV2ZWwgYXJlIGRlZmluZWQgb3Bwb3NpdGUgaW4gdGhlIHRhYmxlIHZzIHRoZSBoZWFkZXJzCiAJICovCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCA9Ci0JCQkgICAodGVtcDggJiAweDIpID8gQUNQSV9FREdFX1NFTlNJVElWRSA6IEFDUElfTEVWRUxfU0VOU0lUSVZFOworCQkodGVtcDggJiAweDIpID8gQUNQSV9FREdFX1NFTlNJVElWRSA6IEFDUElfTEVWRUxfU0VOU0lUSVZFOwogCi0JLyoKLQkgKiBDaGVjayBJbnRlcnJ1cHQgUG9sYXJpdHkKLQkgKi8KKwkvKiBDaGVjayBJbnRlcnJ1cHQgUG9sYXJpdHkgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLmFjdGl2ZV9oaWdoX2xvdyA9ICh0ZW1wOCA+PiAyKSAmIDB4MTsKIAotCS8qCi0JICogQ2hlY2sgZm9yIHNoYXJhYmxlCi0JICovCisJLyogQ2hlY2sgZm9yIHNoYXJhYmxlICovCisKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5zaGFyZWRfZXhjbHVzaXZlID0gKHRlbXA4ID4+IDMpICYgMHgwMTsKIAotCS8qCi0JICogUG9pbnQgdG8gQnl0ZTQgKElSUSBUYWJsZSBsZW5ndGgpCi0JICovCisJLyogUG9pbnQgdG8gQnl0ZTQgKElSUSBUYWJsZSBsZW5ndGgpICovCisKIAlidWZmZXIgKz0gMTsKIAl0ZW1wOCA9ICpidWZmZXI7CiAKQEAgLTM3OSwxNCArMzY3LDEyIEBACiAJICovCiAJc3RydWN0X3NpemUgKz0gKHRlbXA4IC0gMSkgKiA0OwogCi0JLyoKLQkgKiBQb2ludCB0byBCeXRlNSAoRmlyc3QgSVJRIE51bWJlcikKLQkgKi8KKwkvKiBQb2ludCB0byBCeXRlNSAoRmlyc3QgSVJRIE51bWJlcikgKi8KKwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBDeWNsZSB0aHJvdWdoIGV2ZXJ5IElSUSBpbiB0aGUgdGFibGUKLQkgKi8KKwkvKiBDeWNsZSB0aHJvdWdoIGV2ZXJ5IElSUSBpbiB0aGUgdGFibGUgKi8KKwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRlbXA4OyBpbmRleCsrKSB7CiAJCUFDUElfTU9WRV8zMl9UT18zMiAoCiAJCQkmb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1tpbmRleF0sIGJ1ZmZlcik7CkBAIC00MDcsNyArMzkzLDggQEAKIAkgKiB3ZSBhZGQgMSB0byB0aGUgbGVuZ3RoLgogCSAqLwogCWlmICgqYnl0ZXNfY29uc3VtZWQgPgotCQkoKGFjcGlfc2l6ZSkgb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEubnVtYmVyX29mX2ludGVycnVwdHMgKiA0KSArICg1ICsgMSkpIHsKKwkJKChhY3BpX3NpemUpIG91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzICogNCkgKworCQkoNSArIDEpKSB7CiAJCS8qIERlcmVmZXJlbmNlIHRoZSBJbmRleCAqLwogCiAJCXRlbXA4ID0gKmJ1ZmZlcjsKQEAgLTQxNywxMyArNDA0LDEzIEBACiAKIAkJYnVmZmVyICs9IDE7CiAKLQkJLyoKLQkJICogUG9pbnQgdGhlIFN0cmluZyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdHJ1Y3R1cmUuCi0JCSAqLworCQkvKiBQb2ludCB0aGUgU3RyaW5nIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZS4gKi8KKwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0ciA9CiAJCQkJKGNoYXIgKikoKGNoYXIgKikgb3V0cHV0X3N0cnVjdCArIHN0cnVjdF9zaXplKTsKIAotCQl0ZW1wX3B0ciA9ICh1OCAqKSBvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cjsKKwkJdGVtcF9wdHIgPSAodTggKikKKwkJCW91dHB1dF9zdHJ1Y3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyOwogCiAJCS8qIENvcHkgdGhlIHN0cmluZyBpbnRvIHRoZSBidWZmZXIgKi8KIApAQCAtNDM2LDkgKzQyMyw4IEBACiAJCQlpbmRleCArPSAxOwogCQl9CiAKLQkJLyoKLQkJICogQWRkIHRoZSB0ZXJtaW5hdGluZyBudWxsCi0JCSAqLworCQkvKiBBZGQgdGhlIHRlcm1pbmF0aW5nIG51bGwgKi8KKwogCQkqdGVtcF9wdHIgPSAweDAwOwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCA9IGluZGV4ICsgMTsKIApAQCAtNDU2LDE0ICs0NDIsMTIgQEAKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLnN0cmluZ19wdHIgPSBOVUxMOwogCX0KIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC01MDEsMjEgKzQ4NSwxOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19leHRlbmRlZF9pcnFfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4OTsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyCi0JICovCisJLyogU2V0IGEgcG9pbnRlciB0byB0aGUgTGVuZ3RoIGZpZWxkIC0gdG8gYmUgZmlsbGVkIGluIGxhdGVyICovCisKIAlsZW5ndGhfZmllbGQgPSBBQ1BJX0NBU1RfUFRSICh1MTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgSW50ZXJydXB0IHZlY3RvciBmbGFncwotCSAqLworCS8qIFNldCB0aGUgSW50ZXJydXB0IHZlY3RvciBmbGFncyAqLworCiAJdGVtcDggPSAodTgpKGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciAmIDB4MDEpOwogCXRlbXA4IHw9ICgobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnNoYXJlZF9leGNsdXNpdmUgJiAweDAxKSA8PCAzKTsKIApAQCAtNTMyLDE3ICs1MTMsMTUgQEAKIAkJdGVtcDggfD0gMHgyOwogCX0KIAotCS8qCi0JICogU2V0IHRoZSBJbnRlcnJ1cHQgUG9sYXJpdHkKLQkgKi8KKwkvKiBTZXQgdGhlIEludGVycnVwdCBQb2xhcml0eSAqLworCiAJdGVtcDggfD0gKChsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEuYWN0aXZlX2hpZ2hfbG93ICYgMHgxKSA8PCAyKTsKIAogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBJbnRlcnJ1cHQgdGFibGUgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSBJbnRlcnJ1cHQgdGFibGUgbGVuZ3RoICovCisKIAl0ZW1wOCA9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLm51bWJlcl9vZl9pbnRlcnJ1cHRzOwogCiAJKmJ1ZmZlciA9IHRlbXA4OwpAQCAtNTU1LDE4ICs1MzQsMTYgQEAKIAkJYnVmZmVyICs9IDQ7CiAJfQogCi0JLyoKLQkgKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwKLQkgKi8KKwkvKiBSZXNvdXJjZSBTb3VyY2UgSW5kZXggYW5kIFJlc291cmNlIFNvdXJjZSBhcmUgb3B0aW9uYWwgKi8KKwogCWlmICgwICE9IGxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX2xlbmd0aCkgewogCQkqYnVmZmVyID0gKHU4KSBsaW5rZWRfbGlzdC0+ZGF0YS5leHRlbmRlZF9pcnEucmVzb3VyY2Vfc291cmNlLmluZGV4OwogCQlidWZmZXIgKz0gMTsKIAogCQl0ZW1wX3BvaW50ZXIgPSAoY2hhciAqKSBidWZmZXI7CiAKLQkJLyoKLQkJICogQ29weSB0aGUgc3RyaW5nCi0JCSAqLworCQkvKiBDb3B5IHRoZSBzdHJpbmcgKi8KKwogCQlBQ1BJX1NUUkNQWSAodGVtcF9wb2ludGVyLAogCQkJbGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKTsKIApAQCAtNTc0LDEyICs1NTEsMTIgQEAKIAkJICogQnVmZmVyIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzdGluZyArIG9uZSBmb3IgdGhlCiAJCSAqIHRlcm1pbmF0aW5nIG51bGwKIAkJICovCi0JCWJ1ZmZlciArPSAoYWNwaV9zaXplKShBQ1BJX1NUUkxFTiAobGlua2VkX2xpc3QtPmRhdGEuZXh0ZW5kZWRfaXJxLnJlc291cmNlX3NvdXJjZS5zdHJpbmdfcHRyKSArIDEpOworCQlidWZmZXIgKz0gKGFjcGlfc2l6ZSkgKEFDUElfU1RSTEVOICgKKwkJCWxpbmtlZF9saXN0LT5kYXRhLmV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2Uuc3RyaW5nX3B0cikgKyAxKTsKIAl9CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCmluZGV4IGU0OWMxZTAuLmRiN2JjYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYwpAQCAtNTUsNyArNTUsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICByZXNvdXJjZV9zdGFydF9ieXRlICAgICAtIEJ5dGUgMCBvZiBhIHJlc291cmNlIGRlc2NyaXB0b3IKICAqCi0gKiBSRVRVUk46ICAgICAgVGhlIFJlc291cmNlIFR5cGUgKE5hbWUpIHdpdGggbm8gZXh0cmFuZW91cyBiaXRzCisgKiBSRVRVUk46ICAgICAgVGhlIFJlc291cmNlIFR5cGUgd2l0aCBubyBleHRyYW5lb3VzIGJpdHMKICAqCiAgKiBERVNDUklQVElPTjogRXh0cmFjdCB0aGUgUmVzb3VyY2UgVHlwZS9OYW1lIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YKICAqICAgICAgICAgICAgICBhIHJlc291cmNlIGRlc2NyaXB0b3IuCkBAIC03MCwyOCArNzAsMjUgQEAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwogCiAKLQkvKgotCSAqIERldGVybWluZSBpZiB0aGlzIGlzIGEgc21hbGwgb3IgbGFyZ2UgcmVzb3VyY2UKLQkgKi8KKwkvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIHNtYWxsIG9yIGxhcmdlIHJlc291cmNlICovCisKIAlzd2l0Y2ggKHJlc291cmNlX3N0YXJ0X2J5dGUgJiBBQ1BJX1JERVNDX1RZUEVfTUFTSykgewogCWNhc2UgQUNQSV9SREVTQ19UWVBFX1NNQUxMOgogCi0JCS8qCi0JCSAqIFNtYWxsIFJlc291cmNlIFR5cGUgLS0gT25seSBiaXRzIDY6MyBhcmUgdmFsaWQKLQkJICovCisJCS8qIFNtYWxsIFJlc291cmNlIFR5cGUgLS0gT25seSBiaXRzIDY6MyBhcmUgdmFsaWQgKi8KKwogCQlyZXR1cm4gKCh1OCkgKHJlc291cmNlX3N0YXJ0X2J5dGUgJiBBQ1BJX1JERVNDX1NNQUxMX01BU0spKTsKIAogCiAJY2FzZSBBQ1BJX1JERVNDX1RZUEVfTEFSR0U6CiAKLQkJLyoKLQkJICogTGFyZ2UgUmVzb3VyY2UgVHlwZSAtLSBBbGwgYml0cyBhcmUgdmFsaWQKLQkJICovCisJCS8qIExhcmdlIFJlc291cmNlIFR5cGUgLS0gQWxsIGJpdHMgYXJlIHZhbGlkICovCisKIAkJcmV0dXJuIChyZXNvdXJjZV9zdGFydF9ieXRlKTsKIAogCiAJZGVmYXVsdDoKLQkJLyogTm8gb3RoZXIgdHlwZXMgb2YgcmVzb3VyY2UgZGVzY3JpcHRvciAqLworCQkvKiBJbnZhbGlkIHR5cGUgKi8KIAkJYnJlYWs7CiAJfQogCkBAIC0xMzUsOSArMTMyLDggQEAKIAogCXdoaWxlIChieXRlc19wYXJzZWQgPCBieXRlX3N0cmVhbV9idWZmZXJfbGVuZ3RoICYmCiAJCQkhZW5kX3RhZ19wcm9jZXNzZWQpIHsKLQkJLyoKLQkJICogVGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtIGlzIHRoZSByZXNvdXJjZSB0eXBlCi0JCSAqLworCQkvKiBUaGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0gaXMgdGhlIHJlc291cmNlIHR5cGUgKi8KKwogCQlyZXNvdXJjZV90eXBlID0gYWNwaV9yc19nZXRfcmVzb3VyY2VfdHlwZSAoKmJ5dGVfc3RyZWFtX2J1ZmZlcik7CiAKIAkJc3dpdGNoIChyZXNvdXJjZV90eXBlKSB7CkBAIC0yOTksMjggKzI5NSwyMyBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CiAKLQkJLyoKLQkJICogVXBkYXRlIHRoZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50ZXIKLQkJICovCisJCS8qIFVwZGF0ZSB0aGUgcmV0dXJuIHZhbHVlIGFuZCBjb3VudGVyICovCisKIAkJYnl0ZXNfcGFyc2VkICs9IGJ5dGVzX2NvbnN1bWVkOwogCi0JCS8qCi0JCSAqIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gcG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2UKLQkJICovCisJCS8qIFNldCB0aGUgYnl0ZSBzdHJlYW0gdG8gcG9pbnQgdG8gdGhlIG5leHQgcmVzb3VyY2UgKi8KKwogCQlieXRlX3N0cmVhbV9idWZmZXIgKz0gYnl0ZXNfY29uc3VtZWQ7CiAKLQkJLyoKLQkJICogU2V0IHRoZSBCdWZmZXIgdG8gdGhlIG5leHQgc3RydWN0dXJlCi0JCSAqLworCQkvKiBTZXQgdGhlIEJ1ZmZlciB0byB0aGUgbmV4dCBzdHJ1Y3R1cmUgKi8KKwogCQlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIgKHN0cnVjdCBhY3BpX3Jlc291cmNlLCBidWZmZXIpOwogCQlyZXNvdXJjZS0+bGVuZ3RoID0gKHUzMikgQUNQSV9BTElHTl9SRVNPVVJDRV9TSVpFIChyZXNvdXJjZS0+bGVuZ3RoKTsKIAkJYnVmZmVyICs9IEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRSAoc3RydWN0dXJlX3NpemUpOworCX0KIAotCX0gLyogIGVuZCB3aGlsZSAqLworCS8qIENoZWNrIHRoZSByZWFzb24gZm9yIGV4aXRpbmcgdGhlIHdoaWxlIGxvb3AgKi8KIAotCS8qCi0JICogQ2hlY2sgdGhlIHJlYXNvbiBmb3IgZXhpdGluZyB0aGUgd2hpbGUgbG9vcAotCSAqLwogCWlmICghZW5kX3RhZ19wcm9jZXNzZWQpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CiAJfQpAQCAtNDI0LDkgKzQxNSw4IEBACiAJCQkgKi8KIAkJCXN0YXR1cyA9IGFjcGlfcnNfZW5kX3RhZ19zdHJlYW0gKGxpbmtlZF9saXN0LCAmYnVmZmVyLCAmYnl0ZXNfY29uc3VtZWQpOwogCi0JCQkvKgotCQkJICogQW4gRW5kIFRhZyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgUmVzb3VyY2UgVGVtcGxhdGUKLQkJCSAqLworCQkJLyogQW4gRW5kIFRhZyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgUmVzb3VyY2UgVGVtcGxhdGUgKi8KKwogCQkJZG9uZSA9IFRSVUU7CiAJCQlicmVhazsKIApAQCAtNDg4LDI3ICs0NzgsMjUgQEAKIAkJZGVmYXVsdDoKIAkJCS8qCiAJCQkgKiBJZiB3ZSBnZXQgaGVyZSwgZXZlcnl0aGluZyBpcyBvdXQgb2Ygc3luYywKLQkJCSAqICBzbyBleGl0IHdpdGggYW4gZXJyb3IKKwkJCSAqIHNvIGV4aXQgd2l0aCBhbiBlcnJvcgogCQkJICovCi0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgZGVzY3JpcHRvciB0eXBlICglWCkgaW4gcmVzb3VyY2UgbGlzdFxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJCSJJbnZhbGlkIGRlc2NyaXB0b3IgdHlwZSAoJVgpIGluIHJlc291cmNlIGxpc3RcbiIsCiAJCQkJbGlua2VkX2xpc3QtPmlkKSk7CiAJCQlzdGF0dXMgPSBBRV9CQURfREFUQTsKIAkJCWJyZWFrOwotCi0JCX0gLyogc3dpdGNoIChsaW5rZWRfbGlzdC0+SWQpICovCisJCX0KIAogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIAotCQkvKgotCQkgKiBTZXQgdGhlIEJ1ZmZlciB0byBwb2ludCB0byB0aGUgb3BlbiBieXRlCi0JCSAqLworCQkvKiBTZXQgdGhlIEJ1ZmZlciB0byBwb2ludCB0byB0aGUgb3BlbiBieXRlICovCisKIAkJYnVmZmVyICs9IGJ5dGVzX2NvbnN1bWVkOwogCi0JCS8qCi0JCSAqIFBvaW50IHRvIHRoZSBuZXh0IG9iamVjdAotCQkgKi8KKwkJLyogUG9pbnQgdG8gdGhlIG5leHQgb2JqZWN0ICovCisKIAkJbGlua2VkX2xpc3QgPSBBQ1BJX1BUUl9BREQgKHN0cnVjdCBhY3BpX3Jlc291cmNlLAogCQkJCSAgbGlua2VkX2xpc3QsIGxpbmtlZF9saXN0LT5sZW5ndGgpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtZW1vcnkuYwppbmRleCA3YzkzNWFlLi45MWQwMjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWVtb3J5LmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21lbW9yeS5jCkBAIC04MSwxNSArODEsMTUgQEAKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpvdXRwdXRfc3RydWN0ID0gKHZvaWQgKikgKm91dHB1dF9idWZmZXI7CiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfbWVtMjQpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTI0KTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTI0X3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZAotCSAqLworCS8qIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgKi8KKwogCWJ1ZmZlciArPSAxOwogCiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwpAQCAtOTcsNDggKzk3LDQxIEBACiAJKmJ5dGVzX2NvbnN1bWVkID0gKGFjcGlfc2l6ZSkgdGVtcDE2ICsgMzsKIAlvdXRwdXRfc3RydWN0LT5pZCA9IEFDUElfUlNUWVBFX01FTTI0OwogCi0JLyoKLQkgKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0Ci0JICovCisJLyogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdCAqLworCiAJdGVtcDggPSAqYnVmZmVyOwogCWJ1ZmZlciArPSAxOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQucmVhZF93cml0ZV9hdHRyaWJ1dGUgPSB0ZW1wOCAmIDB4MDE7CiAKLQkvKgotCSAqIEdldCBtaW5fYmFzZV9hZGRyZXNzIChCeXRlcyA0LTUpCi0JICovCisJLyogR2V0IG1pbl9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNSkgKi8KKwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0Lm1pbl9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKLQkvKgotCSAqIEdldCBtYXhfYmFzZV9hZGRyZXNzIChCeXRlcyA2LTcpCi0JICovCisJLyogR2V0IG1heF9iYXNlX2FkZHJlc3MgKEJ5dGVzIDYtNykgKi8KKwogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKIAlidWZmZXIgKz0gMjsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTI0Lm1heF9iYXNlX2FkZHJlc3MgPSB0ZW1wMTY7CiAKLQkvKgotCSAqIEdldCBBbGlnbm1lbnQgKEJ5dGVzIDgtOSkKLQkgKi8KKwkvKiBHZXQgQWxpZ25tZW50IChCeXRlcyA4LTkpICovCisKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKCZ0ZW1wMTYsIGJ1ZmZlcik7CiAJYnVmZmVyICs9IDI7CiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkyNC5hbGlnbm1lbnQgPSB0ZW1wMTY7CiAKLQkvKgotCSAqIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDEwLTExKQotCSAqLworCS8qIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDEwLTExKSAqLworCiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCW91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MjQucmFuZ2VfbGVuZ3RoID0gdGVtcDE2OwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTE3NCw1MyArMTY3LDQ1IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTI0X3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4ODE7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGxlbmd0aCBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCXRlbXAxNiA9IDB4MDk7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2IChidWZmZXIsICZ0ZW1wMTYpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUKLQkgKi8KKwkvKiBTZXQgdGhlIEluZm9ybWF0aW9uIEJ5dGUgKi8KKwogCXRlbXA4ID0gKHU4KSAobGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQucmVhZF93cml0ZV9hdHRyaWJ1dGUgJiAweDAxKTsKIAkqYnVmZmVyID0gdGVtcDg7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIG1pbmltdW0gYmFzZSBhZGRyZXNzICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMTYgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTI0Lm1pbl9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzCi0JICovCisJLyogU2V0IHRoZSBSYW5nZSBtYXhpbXVtIGJhc2UgYWRkcmVzcyAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5tYXhfYmFzZV9hZGRyZXNzKTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBiYXNlIGFsaWdubWVudAotCSAqLworCS8qIFNldCB0aGUgYmFzZSBhbGlnbm1lbnQgKi8KKwogCUFDUElfTU9WRV8zMl9UT18xNiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MjQuYWxpZ25tZW50KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSByYW5nZSBsZW5ndGgKLQkgKi8KKwkvKiBTZXQgdGhlIHJhbmdlIGxlbmd0aCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzE2IChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkyNC5yYW5nZV9sZW5ndGgpOwogCWJ1ZmZlciArPSAyOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTI1OCwxNSArMjQzLDE1IEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqb3V0cHV0X3N0cnVjdCA9ICh2b2lkICopICpvdXRwdXRfYnVmZmVyOwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2ID0gMDsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX21lbTMyKTsKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKAorCQkJICBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW0zMik7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19tZW1vcnkzMl9yYW5nZV9yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFBvaW50IHBhc3QgdGhlIERlc2NyaXB0b3IgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKLQkgKi8KKwkvKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkICovCisKIAlidWZmZXIgKz0gMTsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoJnRlbXAxNiwgYnVmZmVyKTsKQEAgLTI4NSw0NSArMjcwLDM4IEBACiAJICogIDQgKiBzaXplb2YoUkVTT1VSQ0VfREFUQSkgaW5zdGVhZCBvZiA0ICogc2l6ZW9mKHU4KQogCSAqLwogCi0JLyoKLQkgKiBDaGVjayBCeXRlIDMgdGhlIFJlYWQvV3JpdGUgYml0Ci0JICovCisJLyogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdCAqLworCiAJdGVtcDggPSAqYnVmZmVyOwogCWJ1ZmZlciArPSAxOwogCiAJb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSA9IHRlbXA4ICYgMHgwMTsKIAotCS8qCi0JICogR2V0IG1pbl9iYXNlX2FkZHJlc3MgKEJ5dGVzIDQtNykKLQkgKi8KKwkvKiBHZXQgbWluX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KSAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5tZW1vcnkzMi5taW5fYmFzZV9hZGRyZXNzLCBidWZmZXIpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBHZXQgbWF4X2Jhc2VfYWRkcmVzcyAoQnl0ZXMgOC0xMSkKLQkgKi8KKwkvKiBHZXQgbWF4X2Jhc2VfYWRkcmVzcyAoQnl0ZXMgOC0xMSkgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEubWVtb3J5MzIubWF4X2Jhc2VfYWRkcmVzcywgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogR2V0IEFsaWdubWVudCAoQnl0ZXMgMTItMTUpCi0JICovCisJLyogR2V0IEFsaWdubWVudCAoQnl0ZXMgMTItMTUpICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLmFsaWdubWVudCwgYnVmZmVyKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgMTYtMTkpCi0JICovCisJLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgMTYtMTkpICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKCZvdXRwdXRfc3RydWN0LT5kYXRhLm1lbW9yeTMyLnJhbmdlX2xlbmd0aCwgYnVmZmVyKTsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0zNjEsMTUgKzMzOSwxNSBAQAogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxNiA9IDA7CiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wOCA9IDA7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW0zMik7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2VfZml4ZWRfbWVtMzIpOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfbWVtb3J5MzJfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBQb2ludCBwYXN0IHRoZSBEZXNjcmlwdG9yIHRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkCi0JICovCisJLyogUG9pbnQgcGFzdCB0aGUgRGVzY3JpcHRvciB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCAqLworCiAJYnVmZmVyICs9IDE7CiAJQUNQSV9NT1ZFXzE2X1RPXzE2ICgmdGVtcDE2LCBidWZmZXIpOwogCkBAIC0zNzgsMzIgKzM1NiwyOCBAQAogCiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9GSVhFRF9NRU0zMjsKIAotCS8qCi0JICogQ2hlY2sgQnl0ZSAzIHRoZSBSZWFkL1dyaXRlIGJpdAotCSAqLworCS8qIENoZWNrIEJ5dGUgMyB0aGUgUmVhZC9Xcml0ZSBiaXQgKi8KKwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAlidWZmZXIgKz0gMTsKIAlvdXRwdXRfc3RydWN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlID0gdGVtcDggJiAweDAxOwogCi0JLyoKLQkgKiBHZXQgcmFuZ2VfYmFzZV9hZGRyZXNzIChCeXRlcyA0LTcpCi0JICovCi0JQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9iYXNlX2FkZHJlc3MsIGJ1ZmZlcik7CisJLyogR2V0IHJhbmdlX2Jhc2VfYWRkcmVzcyAoQnl0ZXMgNC03KSAqLworCisJQUNQSV9NT1ZFXzMyX1RPXzMyICgmb3V0cHV0X3N0cnVjdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9iYXNlX2FkZHJlc3MsCisJCWJ1ZmZlcik7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIEdldCByYW5nZV9sZW5ndGggKEJ5dGVzIDgtMTEpCi0JICovCisJLyogR2V0IHJhbmdlX2xlbmd0aCAoQnl0ZXMgOC0xMSkgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoJm91dHB1dF9zdHJ1Y3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoLCBidWZmZXIpOwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9ICh1MzIpIHN0cnVjdF9zaXplOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZQotCSAqLworCS8qIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlICovCisKIAkqc3RydWN0dXJlX3NpemUgPSBzdHJ1Y3Rfc2l6ZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTQzOSw1NCArNDEzLDQ2IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX21lbW9yeTMyX3JhbmdlX3N0cmVhbSIpOwogCiAKLQkvKgotCSAqIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYwotCSAqLworCS8qIFRoZSBkZXNjcmlwdG9yIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJKmJ1ZmZlciA9IDB4ODU7CiAJYnVmZmVyICs9IDE7CiAKLQkvKgotCSAqIFRoZSBsZW5ndGggZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGxlbmd0aCBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCXRlbXAxNiA9IDB4MTE7CiAKIAlBQ1BJX01PVkVfMTZfVE9fMTYgKGJ1ZmZlciwgJnRlbXAxNik7CiAJYnVmZmVyICs9IDI7CiAKLQkvKgotCSAqIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZQotCSAqLworCS8qIFNldCB0aGUgSW5mb3JtYXRpb24gQnl0ZSAqLworCiAJdGVtcDggPSAodTgpIChsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5yZWFkX3dyaXRlX2F0dHJpYnV0ZSAmIDB4MDEpOwogCSpidWZmZXIgPSB0ZW1wODsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogU2V0IHRoZSBSYW5nZSBtaW5pbXVtIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgbWluaW11bSBiYXNlIGFkZHJlc3MgKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLCAmbGlua2VkX2xpc3QtPmRhdGEubWVtb3J5MzIubWluX2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgUmFuZ2UgbWF4aW11bSBiYXNlIGFkZHJlc3MKLQkgKi8KKwkvKiBTZXQgdGhlIFJhbmdlIG1heGltdW0gYmFzZSBhZGRyZXNzICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLm1heF9iYXNlX2FkZHJlc3MpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIGJhc2UgYWxpZ25tZW50Ci0JICovCisJLyogU2V0IHRoZSBiYXNlIGFsaWdubWVudCAqLworCiAJQUNQSV9NT1ZFXzMyX1RPXzMyIChidWZmZXIsICZsaW5rZWRfbGlzdC0+ZGF0YS5tZW1vcnkzMi5hbGlnbm1lbnQpOwogCWJ1ZmZlciArPSA0OwogCi0JLyoKLQkgKiBTZXQgdGhlIHJhbmdlIGxlbmd0aAotCSAqLworCS8qIFNldCB0aGUgcmFuZ2UgbGVuZ3RoICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwgJmxpbmtlZF9saXN0LT5kYXRhLm1lbW9yeTMyLnJhbmdlX2xlbmd0aCk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uCi0JICovCisJLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24gKi8KKwogCSpieXRlc19jb25zdW1lZCA9IEFDUElfUFRSX0RJRkYgKGJ1ZmZlciwgKm91dHB1dF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtNTIyLDQ0ICs0ODgsMzggQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgicnNfZml4ZWRfbWVtb3J5MzJfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg4NjsKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogVGhlIGxlbmd0aCBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgbGVuZ3RoIGZpZWxkIGlzIHN0YXRpYyAqLworCiAJdGVtcDE2ID0gMHgwOTsKIAogCUFDUElfTU9WRV8xNl9UT18xNiAoYnVmZmVyLCAmdGVtcDE2KTsKIAlidWZmZXIgKz0gMjsKIAotCS8qCi0JICogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlCi0JICovCisJLyogU2V0IHRoZSBJbmZvcm1hdGlvbiBCeXRlICovCisKIAl0ZW1wOCA9ICh1OCkgKGxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJlYWRfd3JpdGVfYXR0cmlidXRlICYgMHgwMSk7CiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBTZXQgdGhlIFJhbmdlIGJhc2UgYWRkcmVzcwotCSAqLworCS8qIFNldCB0aGUgUmFuZ2UgYmFzZSBhZGRyZXNzICovCisKIAlBQ1BJX01PVkVfMzJfVE9fMzIgKGJ1ZmZlciwKLQkJCSAmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfYmFzZV9hZGRyZXNzKTsKKwkJJmxpbmtlZF9saXN0LT5kYXRhLmZpeGVkX21lbW9yeTMyLnJhbmdlX2Jhc2VfYWRkcmVzcyk7CiAJYnVmZmVyICs9IDQ7CiAKLQkvKgotCSAqIFNldCB0aGUgcmFuZ2UgbGVuZ3RoCi0JICovCisJLyogU2V0IHRoZSByYW5nZSBsZW5ndGggKi8KKwogCUFDUElfTU9WRV8zMl9UT18zMiAoYnVmZmVyLAotCQkJICZsaW5rZWRfbGlzdC0+ZGF0YS5maXhlZF9tZW1vcnkzMi5yYW5nZV9sZW5ndGgpOworCQkmbGlua2VkX2xpc3QtPmRhdGEuZml4ZWRfbWVtb3J5MzIucmFuZ2VfbGVuZ3RoKTsKIAlidWZmZXIgKz0gNDsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYwppbmRleCBkMTZiZTQ0Li5hMWYxNzQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKQEAgLTg0LDI0ICs4NCwyMCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19lbmRfdGFnX3Jlc291cmNlIik7CiAKIAotCS8qCi0JICogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGlzIHN0YXRpYyAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gMjsKIAotCS8qCi0JICogIEZpbGwgb3V0IHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiAgRmlsbCBvdXQgdGhlIHN0cnVjdHVyZSAqLworCiAJb3V0cHV0X3N0cnVjdC0+aWQgPSBBQ1BJX1JTVFlQRV9FTkRfVEFHOwogCi0JLyoKLQkgKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIKLQkgKi8KKwkvKiBTZXQgdGhlIExlbmd0aCBwYXJhbWV0ZXIgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmxlbmd0aCA9IDA7CiAKLQkvKgotCSAqIFJldHVybiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlCi0JICovCisJLyogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwogCSpzdHJ1Y3R1cmVfc2l6ZSA9IHN0cnVjdF9zaXplOwogCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogfQpAQCAtMTM2LDkgKzEzMiw4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX2VuZF90YWdfc3RyZWFtIik7CiAKIAotCS8qCi0JICogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIGRlc2NyaXB0b3IgZmllbGQgaXMgc3RhdGljICovCisKIAkqYnVmZmVyID0gMHg3OTsKIAlidWZmZXIgKz0gMTsKIApAQCAtMTUxLDkgKzE0Niw4IEBACiAJKmJ1ZmZlciA9IHRlbXA4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTE5MiwyMSArMTg2LDIwIEBACiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYgPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDggPSAwOwogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZV92ZW5kb3IpOworCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3NpemUgPSBBQ1BJX1NJWkVPRl9SRVNPVVJDRSAoCisJCQkgIHN0cnVjdCBhY3BpX3Jlc291cmNlX3ZlbmRvcik7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc192ZW5kb3JfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBEZXJlZmVyZW5jZSB0aGUgRGVzY3JpcHRvciB0byBmaW5kIGlmIHRoaXMgaXMgYSBsYXJnZSBvciBzbWFsbCBpdGVtLgotCSAqLworCS8qIERlcmVmZXJlbmNlIHRoZSBEZXNjcmlwdG9yIHRvIGZpbmQgaWYgdGhpcyBpcyBhIGxhcmdlIG9yIHNtYWxsIGl0ZW0uICovCisKIAl0ZW1wOCA9ICpidWZmZXI7CiAKIAlpZiAodGVtcDggJiAweDgwKSB7Ci0JCS8qCi0JCSAqIExhcmdlIEl0ZW0sIHBvaW50IHRvIHRoZSBsZW5ndGggZmllbGQKLQkJICovCisJCS8qIExhcmdlIEl0ZW0sIHBvaW50IHRvIHRoZSBsZW5ndGggZmllbGQgKi8KKwogCQlidWZmZXIgKz0gMTsKIAogCQkvKiBEZXJlZmVyZW5jZSAqLwpAQCAtMjIyLDkgKzIxNSw4IEBACiAJCWJ1ZmZlciArPSAyOwogCX0KIAllbHNlIHsKLQkJLyoKLQkJICogU21hbGwgSXRlbSwgZGVyZWZlcmVuY2UgdGhlIHNpemUKLQkJICovCisJCS8qIFNtYWxsIEl0ZW0sIGRlcmVmZXJlbmNlIHRoZSBzaXplICovCisKIAkJdGVtcDE2ID0gKHU4KSgqYnVmZmVyICYgMHgwNyk7CiAKIAkJLyogQ2FsY3VsYXRlIGJ5dGVzIGNvbnN1bWVkICovCkBAIC0yNTEsMTQgKzI0MywxMiBAQAogCSAqLwogCXN0cnVjdF9zaXplICs9IEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyAodGVtcDE2KTsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC0yOTUsMTMgKzI4NSwxMSBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc192ZW5kb3Jfc3RyZWFtIik7CiAKIAotCS8qCi0JICogRGVyZWZlcmVuY2UgdGhlIGxlbmd0aCB0byBmaW5kIGlmIHRoaXMgaXMgYSBsYXJnZSBvciBzbWFsbCBpdGVtLgotCSAqLworCS8qIERlcmVmZXJlbmNlIHRoZSBsZW5ndGggdG8gZmluZCBpZiB0aGlzIGlzIGEgbGFyZ2Ugb3Igc21hbGwgaXRlbS4gKi8KKwogCWlmKGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGggPiA3KSB7Ci0JCS8qCi0JCSAqIExhcmdlIEl0ZW0sIFNldCB0aGUgZGVzY3JpcHRvciBmaWVsZCBhbmQgbGVuZ3RoIGJ5dGVzCi0JCSAqLworCQkvKiBMYXJnZSBJdGVtLCBTZXQgdGhlIGRlc2NyaXB0b3IgZmllbGQgYW5kIGxlbmd0aCBieXRlcyAqLworCiAJCSpidWZmZXIgPSAweDg0OwogCQlidWZmZXIgKz0gMTsKIApAQCAtMzExLDkgKzI5OSw4IEBACiAJCWJ1ZmZlciArPSAyOwogCX0KIAllbHNlIHsKLQkJLyoKLQkJICogU21hbGwgSXRlbSwgU2V0IHRoZSBkZXNjcmlwdG9yIGZpZWxkCi0JCSAqLworCQkvKiBTbWFsbCBJdGVtLCBTZXQgdGhlIGRlc2NyaXB0b3IgZmllbGQgKi8KKwogCQl0ZW1wOCA9IDB4NzA7CiAJCXRlbXA4IHw9ICh1OCkgbGlua2VkX2xpc3QtPmRhdGEudmVuZG9yX3NwZWNpZmljLmxlbmd0aDsKIApAQCAtMzIxLDkgKzMwOCw4IEBACiAJCWJ1ZmZlciArPSAxOwogCX0KIAotCS8qCi0JICogTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgVmVuZG9yIFNwZWNpZmljIGZpZWxkcwotCSAqLworCS8qIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIFZlbmRvciBTcGVjaWZpYyBmaWVsZHMgKi8KKwogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxpbmtlZF9saXN0LT5kYXRhLnZlbmRvcl9zcGVjaWZpYy5sZW5ndGg7IGluZGV4KyspIHsKIAkJdGVtcDggPSBsaW5rZWRfbGlzdC0+ZGF0YS52ZW5kb3Jfc3BlY2lmaWMucmVzZXJ2ZWRbaW5kZXhdOwogCkBAIC0zMzEsOSArMzE3LDggQEAKIAkJYnVmZmVyICs9IDE7CiAJfQogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTM3MCw0MCArMzU1LDM3IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gYnl0ZV9zdHJlYW1fYnVmZmVyOwogCXN0cnVjdCBhY3BpX3Jlc291cmNlICAgICAgICAgICAgKm91dHB1dF9zdHJ1Y3QgPSAodm9pZCAqKSAqb3V0cHV0X2J1ZmZlcjsKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA4ID0gMDsKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF9zaXplID0gQUNQSV9TSVpFT0ZfUkVTT1VSQ0UgKHN0cnVjdCBhY3BpX3Jlc291cmNlX3N0YXJ0X2RwZik7CisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Rfc2l6ZSA9IEFDUElfU0laRU9GX1JFU09VUkNFICgKKwkJCSAgc3RydWN0IGFjcGlfcmVzb3VyY2Vfc3RhcnRfZHBmKTsKIAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInJzX3N0YXJ0X2RlcGVuZF9mbnNfcmVzb3VyY2UiKTsKIAogCi0JLyoKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGFyZSBjb250YWluZWQgaW4gdGhlIGRlc2NyaXB0b3IgKEJpdHM6MC0xKQotCSAqLworCS8qIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYXJlIGZvdW5kIGluIHRoZSBkZXNjcmlwdG9yIChCaXRzOjAtMSkgKi8KKwogCXRlbXA4ID0gKmJ1ZmZlcjsKIAogCSpieXRlc19jb25zdW1lZCA9ICh0ZW1wOCAmIDB4MDEpICsgMTsKIAogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfU1RBUlRfRFBGOwogCi0JLyoKLQkgKiBQb2ludCB0byBCeXRlIDEgaWYgaXQgaXMgdXNlZAotCSAqLworCS8qIFBvaW50IHRvIEJ5dGUgMSBpZiBpdCBpcyB1c2VkICovCisKIAlpZiAoMiA9PSAqYnl0ZXNfY29uc3VtZWQpIHsKIAkJYnVmZmVyICs9IDE7CiAJCXRlbXA4ID0gKmJ1ZmZlcjsKIAotCQkvKgotCQkgKiBDaGVjayBDb21wYXRpYmlsaXR5IHByaW9yaXR5Ci0JCSAqLworCQkvKiBDaGVjayBDb21wYXRpYmlsaXR5IHByaW9yaXR5ICovCisKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSA9IHRlbXA4ICYgMHgwMzsKIAogCQlpZiAoMyA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5jb21wYXRpYmlsaXR5X3ByaW9yaXR5KSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9CQURfUkVTT1VSQ0VfVkFMVUUpOwogCQl9CiAKLQkJLyoKLQkJICogQ2hlY2sgUGVyZm9ybWFuY2UvUm9idXN0bmVzcyBwcmVmZXJlbmNlCi0JCSAqLworCQkvKiBDaGVjayBQZXJmb3JtYW5jZS9Sb2J1c3RuZXNzIHByZWZlcmVuY2UgKi8KKwogCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID0gKHRlbXA4ID4+IDIpICYgMHgwMzsKIAogCQlpZiAoMyA9PSBvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzKSB7CkBAIC00MTIsMjAgKzM5NCwxOCBAQAogCX0KIAllbHNlIHsKIAkJb3V0cHV0X3N0cnVjdC0+ZGF0YS5zdGFydF9kcGYuY29tcGF0aWJpbGl0eV9wcmlvcml0eSA9Ci0JCQkJQUNQSV9BQ0NFUFRBQkxFX0NPTkZJR1VSQVRJT047CisJCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKIAogCQlvdXRwdXRfc3RydWN0LT5kYXRhLnN0YXJ0X2RwZi5wZXJmb3JtYW5jZV9yb2J1c3RuZXNzID0KLQkJCQlBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjsKKwkJCUFDUElfQUNDRVBUQUJMRV9DT05GSUdVUkFUSU9OOwogCX0KIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC00NjYsMjQgKzQ0NiwyMCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19lbmRfZGVwZW5kX2Zuc19yZXNvdXJjZSIpOwogCiAKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaXMgc3RhdGljCi0JICovCisJLyogVGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpcyBzdGF0aWMgKi8KKwogCSpieXRlc19jb25zdW1lZCA9IDE7CiAKLQkvKgotCSAqICBGaWxsIG91dCB0aGUgc3RydWN0dXJlCi0JICovCisJLyogIEZpbGwgb3V0IHRoZSBzdHJ1Y3R1cmUgKi8KKwogCW91dHB1dF9zdHJ1Y3QtPmlkID0gQUNQSV9SU1RZUEVfRU5EX0RQRjsKIAotCS8qCi0JICogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyCi0JICovCisJLyogU2V0IHRoZSBMZW5ndGggcGFyYW1ldGVyICovCisKIAlvdXRwdXRfc3RydWN0LT5sZW5ndGggPSAodTMyKSBzdHJ1Y3Rfc2l6ZTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBmaW5hbCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUKLQkgKi8KKwkvKiBSZXR1cm4gdGhlIGZpbmFsIHNpemUgb2YgdGhlIHN0cnVjdHVyZSAqLworCiAJKnN0cnVjdHVyZV9zaXplID0gc3RydWN0X3NpemU7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC01MzMsOSArNTA5LDggQEAKIAkJKmJ1ZmZlciA9IDB4MzE7CiAJCWJ1ZmZlciArPSAxOwogCi0JCS8qCi0JCSAqIFNldCB0aGUgUHJpb3JpdHkgQnl0ZSBEZWZpbml0aW9uCi0JCSAqLworCQkvKiBTZXQgdGhlIFByaW9yaXR5IEJ5dGUgRGVmaW5pdGlvbiAqLworCiAJCXRlbXA4ID0gMDsKIAkJdGVtcDggPSAodTgpICgobGlua2VkX2xpc3QtPmRhdGEuc3RhcnRfZHBmLnBlcmZvcm1hbmNlX3JvYnVzdG5lc3MgJgogCQkJCSAgIDB4MDMpIDw8IDIpOwpAQCAtNTQ2LDkgKzUyMSw4IEBACiAKIAlidWZmZXIgKz0gMTsKIAotCS8qCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgaW4gdGhpcyBvcGVyYXRpb24KLQkgKi8KKwkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbiAqLworCiAJKmJ5dGVzX2NvbnN1bWVkID0gQUNQSV9QVFJfRElGRiAoYnVmZmVyLCAqb3V0cHV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiB9CkBAIC01ODIsMTUgKzU1NiwxMyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJyc19lbmRfZGVwZW5kX2Zuc19zdHJlYW0iKTsKIAogCi0JLyoKLQkgKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMKLQkgKi8KKwkvKiBUaGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzdGF0aWMgKi8KKwogCSpidWZmZXIgPSAweDM4OwogCWJ1ZmZlciArPSAxOwogCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBpbiB0aGlzIG9wZXJhdGlvbgotCSAqLworCS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGluIHRoaXMgb3BlcmF0aW9uICovCisKIAkqYnl0ZXNfY29uc3VtZWQgPSBBQ1BJX1BUUl9ESUZGIChidWZmZXIsICpvdXRwdXRfYnVmZmVyKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKaW5kZXggZWU5Y2UxMy4uNzAwY2Y3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKQEAgLTgzLDEwICs4MywxMCBAQAogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCAiX1BSVCIsIEFDUElfQlRZUEVfUEFDS0FHRSwgJm9ial9kZXNjKTsKKwkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlQsCisJCQkgQUNQSV9CVFlQRV9QQUNLQUdFLCAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTEzNiwxMCArMTM2LDEwIEBACiAKIAkvKiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyICovCiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcGFyYW1ldGVycwotCSAqLwotCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsICJfQ1JTIiwgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdCAoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLAorCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KQEAgLTE3NSw2ICsxNzUsNyBAQAogICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEgKApAQCAtMTkwLDEwICsxOTEsMTAgQEAKIAogCS8qIFBhcmFtZXRlcnMgZ3VhcmFudGVlZCB2YWxpZCBieSBjYWxsZXIgKi8KIAotCS8qCi0JICogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzCi0JICovCi0Jc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QgKGhhbmRsZSwgIl9QUlMiLCBBQ1BJX0JUWVBFX0JVRkZFUiwgJm9ial9kZXNjKTsKKwkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCisJCQkgQUNQSV9CVFlQRV9CVUZGRVIsICZvYmpfZGVzYyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtMjE4LDYgKzIxOSw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfbWV0aG9kX2RhdGEKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gYSBoYW5kbGUgdG8gdGhlIGNvbnRhaW5pbmcgb2JqZWN0CisgKiAgICAgICAgICAgICAgUGF0aCAgICAgICAgICAgIC0gUGF0aCB0byBtZXRob2QsIHJlbGF0aXZlIHRvIEhhbmRsZQogICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cwogICoKQEAgLTI0Niw5ICsyNDgsOCBAQAogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMKLQkgKi8KKwkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHBhcmFtZXRlcnMgKi8KKwogCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0IChoYW5kbGUsIHBhdGgsIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMzE0LDE4ICszMTUsMTYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCS8qCi0JICogSW5pdCB0aGUgcGFyYW0gb2JqZWN0Ci0JICovCisJLyogSW5pdCB0aGUgcGFyYW0gb2JqZWN0ICovCisKIAlwYXJhbXNbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKEFDUElfVFlQRV9CVUZGRVIpOwogCWlmICghcGFyYW1zWzBdKSB7CiAJCWFjcGlfb3NfZnJlZSAoYnVmZmVyLnBvaW50ZXIpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJfQogCi0JLyoKLQkgKiBTZXQgdXAgdGhlIHBhcmFtZXRlciBvYmplY3QKLQkgKi8KKwkvKiBTZXQgdXAgdGhlIHBhcmFtZXRlciBvYmplY3QgKi8KKwogCXBhcmFtc1swXS0+YnVmZmVyLmxlbmd0aCAgPSAodTMyKSBidWZmZXIubGVuZ3RoOwogCXBhcmFtc1swXS0+YnVmZmVyLnBvaW50ZXIgPSBidWZmZXIucG9pbnRlcjsKIAlwYXJhbXNbMF0tPmNvbW1vbi5mbGFncyAgID0gQU9QT0JKX0RBVEFfVkFMSUQ7CkBAIC0zMzUsMTAgKzMzNCw5IEBACiAJaW5mby5wYXJhbWV0ZXJzID0gcGFyYW1zOwogCWluZm8ucGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CiAKLQkvKgotCSAqIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcmV0dXJuIHZhbHVlCi0JICovCi0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAoIl9TUlMiLCAmaW5mbyk7CisJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyByZXR1cm4gdmFsdWUgKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUgKE1FVEhPRF9OQU1FX19TUlMsICZpbmZvKTsKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCS8qIERlbGV0ZSBhbnkgcmV0dXJuIG9iamVjdCAoZXNwZWNpYWxseSBpZiBpbXBsaWNpdF9yZXR1cm4gaXMgZW5hYmxlZCkgKi8KIApAQCAtMzQ3LDkgKzM0NSw4IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIENsZWFuIHVwIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBmcm9tIGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUKLQkgKi8KKwkvKiBDbGVhbiB1cCBhbmQgcmV0dXJuIHRoZSBzdGF0dXMgZnJvbSBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlICovCisKIAlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKHBhcmFtc1swXSk7CiAJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYwppbmRleCBhOWNkY2JlLi44M2M5NDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzeGZhY2UuYwpAQCAtNDksNiArNDksMjMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1JFU09VUkNFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgicnN4ZmFjZSIpCiAKKy8qIExvY2FsIG1hY3JvcyBmb3IgMTYsMzItYml0IHRvIDY0LWJpdCBjb252ZXJzaW9uICovCisKKyNkZWZpbmUgQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGZpZWxkKSAgKChvdXQpLT5maWVsZCA9IChpbiktPmZpZWxkKQorI2RlZmluZSBBQ1BJX0NPUFlfQUREUkVTUyhvdXQsIGluKSAgICAgICAgICAgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHJlc291cmNlX3R5cGUpOyAgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIHByb2R1Y2VyX2NvbnN1bWVyKTsgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGRlY29kZSk7ICAgICAgICAgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX2ZpeGVkKTsgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGF0dHJpYnV0ZSk7ICAgICAgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGdyYW51bGFyaXR5KTsgICAgICAgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1pbl9hZGRyZXNzX3JhbmdlKTsgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIG1heF9hZGRyZXNzX3JhbmdlKTsgICAgICAgICBcCisJQUNQSV9DT1BZX0ZJRUxEKG91dCwgaW4sIGFkZHJlc3NfdHJhbnNsYXRpb25fb2Zmc2V0KTsgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhZGRyZXNzX2xlbmd0aCk7ICAgICAgICAgICAgXAorCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCByZXNvdXJjZV9zb3VyY2UpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTgwLDYgKzE5Nyw3IEBACiAgKiAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSBvZiByZXRfYnVmZmVyIGlzIHVuZGVmaW5lZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX2dldF9wb3NzaWJsZV9yZXNvdXJjZXMgKApAQCAtMzQ2LDkgKzM2NCw4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoImFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzIik7CiAKIAotCS8qCi0JICogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIGFuZCBidWZmZXIKLQkgKi8KKwkvKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciAqLworCiAJaWYgKCghZGV2aWNlX2hhbmRsZSkgICAgICB8fAogCQkoIWluX2J1ZmZlcikgICAgICAgICAgfHwKIAkJKCFpbl9idWZmZXItPnBvaW50ZXIpIHx8CkBAIC0zNjIsMjEgKzM3OSw2IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKIAogCi0jZGVmaW5lIEFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBmaWVsZCkgICgob3V0KS0+ZmllbGQgPSAoaW4pLT5maWVsZCkKLSNkZWZpbmUgQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBpbikgICAgICAgICAgICAgICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCByZXNvdXJjZV90eXBlKTsgICAgICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBwcm9kdWNlcl9jb25zdW1lcik7ICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBkZWNvZGUpOyAgICAgICAgICAgICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtaW5fYWRkcmVzc19maXhlZCk7ICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtYXhfYWRkcmVzc19maXhlZCk7ICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhdHRyaWJ1dGUpOyAgICAgICAgICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBncmFudWxhcml0eSk7ICAgICAgICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtaW5fYWRkcmVzc19yYW5nZSk7ICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBtYXhfYWRkcmVzc19yYW5nZSk7ICAgICAgICAgXAotCUFDUElfQ09QWV9GSUVMRChvdXQsIGluLCBhZGRyZXNzX3RyYW5zbGF0aW9uX29mZnNldCk7IFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgYWRkcmVzc19sZW5ndGgpOyAgICAgICAgICAgIFwKLQlBQ1BJX0NPUFlfRklFTEQob3V0LCBpbiwgcmVzb3VyY2Vfc291cmNlKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NApAQCAtNDA4LDE0ICs0MTAsMTQgQEAKIAljYXNlIEFDUElfUlNUWVBFX0FERFJFU1MxNjoKIAogCQlhZGRyZXNzMTYgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczE2ICopICZyZXNvdXJjZS0+ZGF0YTsKLQkJQUNQSV9DT1BZX0FERFJFU1Mob3V0LCBhZGRyZXNzMTYpOworCQlBQ1BJX0NPUFlfQUREUkVTUyAob3V0LCBhZGRyZXNzMTYpOwogCQlicmVhazsKIAogCiAJY2FzZSBBQ1BJX1JTVFlQRV9BRERSRVNTMzI6CiAKIAkJYWRkcmVzczMyID0gKHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3MzMiAqKSAmcmVzb3VyY2UtPmRhdGE7Ci0JCUFDUElfQ09QWV9BRERSRVNTKG91dCwgYWRkcmVzczMyKTsKKwkJQUNQSV9DT1BZX0FERFJFU1MgKG91dCwgYWRkcmVzczMyKTsKIAkJYnJlYWs7CiAKIApAQCAtNDM0LDQgKzQzNiwzIEBACiAJcmV0dXJuIChBRV9PSyk7CiB9CiBFWFBPUlRfU1lNQk9MKGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggZTg1ODg1NS4uY2JjZGEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC01NTMsMjAgKzU1MywyOSBAQAogCSAqIHVwb24gcG9zc2libGUgY29uZmlndXJhdGlvbiBhbmQgY3VycmVudGx5IGFsbG9jYXRlZCByZXNvdXJjZXMuCiAJICovCiAKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJEcml2ZXIgc3VjY2Vzc2Z1bGx5IGJvdW5kIHRvIGRldmljZVxuIikpOworCXJldHVybl9WQUxVRSgwKTsKK30KKworaW50CithY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QgKAorCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfc3RhcnRfc2luZ2xlX29iamVjdCIpOworCisJaWYgKCEoZHJpdmVyID0gZGV2aWNlLT5kcml2ZXIpKQorCQlyZXR1cm5fVkFMVUUoMCk7CisKIAlpZiAoZHJpdmVyLT5vcHMuc3RhcnQpIHsKIAkJcmVzdWx0ID0gZHJpdmVyLT5vcHMuc3RhcnQoZGV2aWNlKTsKIAkJaWYgKHJlc3VsdCAmJiBkcml2ZXItPm9wcy5yZW1vdmUpCiAJCQlkcml2ZXItPm9wcy5yZW1vdmUoZGV2aWNlLCBBQ1BJX0JVU19SRU1PVkFMX05PUk1BTCk7Ci0JCXJldHVybl9WQUxVRShyZXN1bHQpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRyaXZlciBzdWNjZXNzZnVsbHkgYm91bmQgdG8gZGV2aWNlXG4iKSk7Ci0KLQlpZiAoZHJpdmVyLT5vcHMuc2NhbikgewotCQlkcml2ZXItPm9wcy5zY2FuKGRldmljZSk7Ci0JfQotCi0JcmV0dXJuX1ZBTFVFKDApOworCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCiBzdGF0aWMgaW50IGFjcGlfZHJpdmVyX2F0dGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKiBkcnYpCkBAIC01ODYsNiArNTk1LDcgQEAKIAogCQlpZiAoIWFjcGlfYnVzX21hdGNoKGRldiwgZHJ2KSkgewogCQkJaWYgKCFhY3BpX2J1c19kcml2ZXJfaW5pdChkZXYsIGRydikpIHsKKwkJCQlhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2KTsKIAkJCQlhdG9taWNfaW5jKCZkcnYtPnJlZmVyZW5jZXMpOwogCQkJCWNvdW50Kys7CiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRm91bmQgZHJpdmVyIFslc10gZm9yIGRldmljZSBbJXNdXG4iLApAQCAtMTAwOSw4ICsxMDE5LDggQEAKIH0KIAogCi1pbnQKLWFjcGlfYnVzX2FkZCAoCitzdGF0aWMgaW50CithY3BpX2FkZF9zaW5nbGVfb2JqZWN0ICgKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKipjaGlsZCwKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKnBhcmVudCwKIAlhY3BpX2hhbmRsZQkJaGFuZGxlLApAQCAtMTAxOSw3ICsxMDI5LDcgQEAKIAlpbnQJCQlyZXN1bHQgPSAwOwogCXN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYnVzX2FkZCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfYWRkX3NpbmdsZV9vYmplY3QiKTsKIAogCWlmICghY2hpbGQpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKQEAgLTEwNTEsMTMgKzEwNjEsMTUgQEAKIAkvKgogCSAqIFN0YXR1cwogCSAqIC0tLS0tLQotCSAqIFNlZSBpZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQuICBXZSBhbHdheXMgYXNzdW1lIHRoYXQgbm9uLURldmljZSgpCi0JICogb2JqZWN0cyAoZS5nLiB0aGVybWFsIHpvbmVzLCBwb3dlciByZXNvdXJjZXMsIHByb2Nlc3NvcnMsIGV0Yy4pIGFyZQotCSAqIHByZXNlbnQsIGZ1bmN0aW9uaW5nLCBldGMuIChhdCBsZWFzdCB3aGVuIHBhcmVudCBvYmplY3QgaXMgcHJlc2VudCkuCi0JICogTm90ZSB0aGF0IF9TVEEgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgZm9yIHNvbWUgb2JqZWN0cyAoZS5nLgotCSAqIHBvd2VyIHJlc291cmNlcykgc28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIGhvdyB3ZSB1c2UgaXQuCisJICogU2VlIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudC4gIFdlIGFsd2F5cyBhc3N1bWUgdGhhdCBub24tRGV2aWNlCisJICogYW5kIG5vbi1Qcm9jZXNzb3Igb2JqZWN0cyAoZS5nLiB0aGVybWFsIHpvbmVzLCBwb3dlciByZXNvdXJjZXMsCisJICogZXRjLikgYXJlIHByZXNlbnQsIGZ1bmN0aW9uaW5nLCBldGMuIChhdCBsZWFzdCB3aGVuIHBhcmVudCBvYmplY3QKKwkgKiBpcyBwcmVzZW50KS4gIE5vdGUgdGhhdCBfU1RBIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGZvciBzb21lCisJICogb2JqZWN0cyAoZS5nLiBwb3dlciByZXNvdXJjZXMpIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBob3cgd2UgdXNlCisJICogaXQuCiAJICovCiAJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ1BJX0JVU19UWVBFX1BST0NFU1NPUjoKIAljYXNlIEFDUElfQlVTX1RZUEVfREVWSUNFOgogCQlyZXN1bHQgPSBhY3BpX2J1c19nZXRfc3RhdHVzKGRldmljZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUocmVzdWx0KSB8fCAhZGV2aWNlLT5zdGF0dXMucHJlc2VudCkgewpAQCAtMTE0MCw3ICsxMTUyLDcgQEAKIAkgKgogCSAqIFRCRDogQXNzdW1lcyBMRE0gcHJvdmlkZXMgZHJpdmVyIGhvdC1wbHVnIGNhcGFiaWxpdHkuCiAJICovCi0JYWNwaV9idXNfZmluZF9kcml2ZXIoZGV2aWNlKTsKKwlyZXN1bHQgPSBhY3BpX2J1c19maW5kX2RyaXZlcihkZXZpY2UpOwogCiBlbmQ6CiAJaWYgKCFyZXN1bHQpCkBAIC0xMTUzLDEwICsxMTY1LDEwIEBACiAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KLUVYUE9SVF9TWU1CT0woYWNwaV9idXNfYWRkKTsKIAogCi1pbnQgYWNwaV9idXNfc2NhbiAoc3RydWN0IGFjcGlfZGV2aWNlCSpzdGFydCkKK3N0YXRpYyBpbnQgYWNwaV9idXNfc2NhbiAoc3RydWN0IGFjcGlfZGV2aWNlCSpzdGFydCwKKwkJc3RydWN0IGFjcGlfYnVzX29wcyAqb3BzKQogewogCWFjcGlfc3RhdHVzCQlzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UJKnBhcmVudCA9IE5VTEw7CkBAIC0xMjI5LDkgKzEyNDEsMjAgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc3RhdHVzID0gYWNwaV9idXNfYWRkKCZjaGlsZCwgcGFyZW50LCBjaGFuZGxlLCB0eXBlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJY29udGludWU7CisJCWlmIChvcHMtPmFjcGlfb3BfYWRkKQorCQkJc3RhdHVzID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmY2hpbGQsIHBhcmVudCwKKwkJCQkJY2hhbmRsZSwgdHlwZSk7CisJCSBlbHNlCisJCQlzdGF0dXMgPSBhY3BpX2J1c19nZXRfZGV2aWNlKGNoYW5kbGUsICZjaGlsZCk7CisKKwkJIGlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCSBjb250aW51ZTsKKworCQlpZiAob3BzLT5hY3BpX29wX3N0YXJ0KSB7CisJCQlzdGF0dXMgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoY2hpbGQpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJCWNvbnRpbnVlOworCQl9CiAKIAkJLyoKIAkJICogSWYgdGhlIGRldmljZSBpcyBwcmVzZW50LCBlbmFibGVkLCBhbmQgZnVuY3Rpb25pbmcgdGhlbgpAQCAtMTI1Nyw4ICsxMjgwLDUwIEBACiAKIAlyZXR1cm5fVkFMVUUoMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3NjYW4pOwogCitpbnQKK2FjcGlfYnVzX2FkZCAoCisJc3RydWN0IGFjcGlfZGV2aWNlCSoqY2hpbGQsCisJc3RydWN0IGFjcGlfZGV2aWNlCSpwYXJlbnQsCisJYWNwaV9oYW5kbGUJCWhhbmRsZSwKKwlpbnQJCQl0eXBlKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGFjcGlfYnVzX29wcyBvcHM7CisKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c19hZGQiKTsKKworCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoY2hpbGQsIHBhcmVudCwgaGFuZGxlLCB0eXBlKTsKKwlpZiAoIXJlc3VsdCkgeworCQltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOworCQlvcHMuYWNwaV9vcF9hZGQgPSAxOworCQlyZXN1bHQgPSBhY3BpX2J1c19zY2FuKCpjaGlsZCwgJm9wcyk7CisJfQorCXJldHVybl9WQUxVRShyZXN1bHQpOworfQorRVhQT1JUX1NZTUJPTChhY3BpX2J1c19hZGQpOworCitpbnQKK2FjcGlfYnVzX3N0YXJ0ICgKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfc3RhcnQiKTsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm5fVkFMVUUoLUVJTlZBTCk7CisKKwlyZXN1bHQgPSBhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2aWNlKTsKKwlpZiAoIXJlc3VsdCkgeworCQltZW1zZXQoJm9wcywgMCwgc2l6ZW9mKG9wcykpOworCQlvcHMuYWNwaV9vcF9zdGFydCA9IDE7CisJCXJlc3VsdCA9IGFjcGlfYnVzX3NjYW4oZGV2aWNlLCAmb3BzKTsKKwl9CisJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3N0YXJ0KTsKIAogc3RhdGljIGludAogYWNwaV9idXNfdHJpbShzdHJ1Y3QgYWNwaV9kZXZpY2UJKnN0YXJ0LApAQCAtMTMzMSwxMyArMTM5NiwxOSBAQAogCS8qCiAJICogRW51bWVyYXRlIGFsbCBmaXhlZC1mZWF0dXJlIGRldmljZXMuCiAJICovCi0JaWYgKGFjcGlfZmFkdC5wd3JfYnV0dG9uID09IDApCi0JCXJlc3VsdCA9IGFjcGlfYnVzX2FkZCgmZGV2aWNlLCBhY3BpX3Jvb3QsIAorCWlmIChhY3BpX2ZhZHQucHdyX2J1dHRvbiA9PSAwKSB7CisJCXJlc3VsdCA9IGFjcGlfYWRkX3NpbmdsZV9vYmplY3QoJmRldmljZSwgYWNwaV9yb290LAogCQkJTlVMTCwgQUNQSV9CVVNfVFlQRV9QT1dFUl9CVVRUT04pOworCQlpZiAoIXJlc3VsdCkKKwkJCXJlc3VsdCA9IGFjcGlfc3RhcnRfc2luZ2xlX29iamVjdChkZXZpY2UpOworCX0KIAotCWlmIChhY3BpX2ZhZHQuc2xlZXBfYnV0dG9uID09IDApCi0JCXJlc3VsdCA9IGFjcGlfYnVzX2FkZCgmZGV2aWNlLCBhY3BpX3Jvb3QsIAorCWlmIChhY3BpX2ZhZHQuc2xlZXBfYnV0dG9uID09IDApIHsKKwkJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmZGV2aWNlLCBhY3BpX3Jvb3QsCiAJCQlOVUxMLCBBQ1BJX0JVU19UWVBFX1NMRUVQX0JVVFRPTik7CisJCWlmICghcmVzdWx0KQorCQkJcmVzdWx0ID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGRldmljZSk7CisJfQogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CkBAIC0xMzQ2LDYgKzE0MTcsNyBAQAogc3RhdGljIGludCBfX2luaXQgYWNwaV9zY2FuX2luaXQodm9pZCkKIHsKIAlpbnQgcmVzdWx0OworCXN0cnVjdCBhY3BpX2J1c19vcHMgb3BzOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zY2FuX2luaXQiKTsKIApAQCAtMTM1NywxNyArMTQyOSwyMyBAQAogCS8qCiAJICogQ3JlYXRlIHRoZSByb290IGRldmljZSBpbiB0aGUgYnVzJ3MgZGV2aWNlIHRyZWUKIAkgKi8KLQlyZXN1bHQgPSBhY3BpX2J1c19hZGQoJmFjcGlfcm9vdCwgTlVMTCwgQUNQSV9ST09UX09CSkVDVCwgCisJcmVzdWx0ID0gYWNwaV9hZGRfc2luZ2xlX29iamVjdCgmYWNwaV9yb290LCBOVUxMLCBBQ1BJX1JPT1RfT0JKRUNULAogCQlBQ1BJX0JVU19UWVBFX1NZU1RFTSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBEb25lOwogCisJcmVzdWx0ID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGFjcGlfcm9vdCk7CisKIAkvKgogCSAqIEVudW1lcmF0ZSBkZXZpY2VzIGluIHRoZSBBQ1BJIG5hbWVzcGFjZS4KIAkgKi8KIAlyZXN1bHQgPSBhY3BpX2J1c19zY2FuX2ZpeGVkKGFjcGlfcm9vdCk7Ci0JaWYgKCFyZXN1bHQpIAotCQlyZXN1bHQgPSBhY3BpX2J1c19zY2FuKGFjcGlfcm9vdCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJbWVtc2V0KCZvcHMsIDAsIHNpemVvZihvcHMpKTsKKwkJb3BzLmFjcGlfb3BfYWRkID0gMTsKKwkJb3BzLmFjcGlfb3Bfc3RhcnQgPSAxOworCQlyZXN1bHQgPSBhY3BpX2J1c19zY2FuKGFjcGlfcm9vdCwgJm9wcyk7CisJfQogCiAJaWYgKHJlc3VsdCkKIAkJYWNwaV9kZXZpY2VfdW5yZWdpc3RlcihhY3BpX3Jvb3QsIEFDUElfQlVTX1JFTU9WQUxfTk9STUFMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCmluZGV4IDBhNWQyYTkuLjcyNDliYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBzbGVlcC5jIC0gQUNQSSBzbGVlcCBzdXBwb3J0LgogICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbGV4ZXkgU3Rhcmlrb3Zza2l5IDxhbGV4ZXkueS5zdGFyaWtvdnNraXlAaW50ZWwuY29tPgogICogQ29weXJpZ2h0IChjKSAyMDA0IERhdmlkIFNoYW9odWEgTGkgPHNoYW9odWEubGlAaW50ZWwuY29tPgogICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgUGF0cmljayBNb2NoZWwKICAqIENvcHlyaWdodCAoYykgMjAwMyBPcGVuIFNvdXJjZSBEZXZlbG9wbWVudCBMYWIKQEAgLTE0LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAjaW5jbHVkZSAic2xlZXAuaCIKQEAgLTI3LDEwICsyNywxMSBAQAogZXh0ZXJuIHZvaWQgZG9fc3VzcGVuZF9sb3dsZXZlbCh2b2lkKTsKIAogc3RhdGljIHUzMiBhY3BpX3N1c3BlbmRfc3RhdGVzW10gPSB7Ci0JW1BNX1NVU1BFTkRfT05dCQk9IEFDUElfU1RBVEVfUzAsCi0JW1BNX1NVU1BFTkRfU1RBTkRCWV0JPSBBQ1BJX1NUQVRFX1MxLAotCVtQTV9TVVNQRU5EX01FTV0JPSBBQ1BJX1NUQVRFX1MzLAotCVtQTV9TVVNQRU5EX0RJU0tdCT0gQUNQSV9TVEFURV9TNCwKKwlbUE1fU1VTUEVORF9PTl0gPSBBQ1BJX1NUQVRFX1MwLAorCVtQTV9TVVNQRU5EX1NUQU5EQlldID0gQUNQSV9TVEFURV9TMSwKKwlbUE1fU1VTUEVORF9NRU1dID0gQUNQSV9TVEFURV9TMywKKwlbUE1fU1VTUEVORF9ESVNLXSA9IEFDUElfU1RBVEVfUzQsCisJW1BNX1NVU1BFTkRfTUFYXSA9IEFDUElfU1RBVEVfUzUKIH07CiAKIHN0YXRpYyBpbnQgaW5pdF84MjU5QV9hZnRlcl9TMTsKQEAgLTQ0LDMwICs0NSwyMCBAQAogICoJd2FrZXVwIGNvZGUgdG8gdGhlIHdha2luZyB2ZWN0b3IuIAogICovCiAKK2V4dGVybiBpbnQgYWNwaV9zbGVlcF9wcmVwYXJlKHUzMiBhY3BpX3N0YXRlKTsKK2V4dGVybiB2b2lkIGFjcGlfcG93ZXJfb2ZmKHZvaWQpOworCiBzdGF0aWMgaW50IGFjcGlfcG1fcHJlcGFyZShzdXNwZW5kX3N0YXRlX3QgcG1fc3RhdGUpCiB7CiAJdTMyIGFjcGlfc3RhdGUgPSBhY3BpX3N1c3BlbmRfc3RhdGVzW3BtX3N0YXRlXTsKIAotCWlmICghc2xlZXBfc3RhdGVzW2FjcGlfc3RhdGVdKQorCWlmICghc2xlZXBfc3RhdGVzW2FjcGlfc3RhdGVdKSB7CisJCXByaW50aygiYWNwaV9wbV9wcmVwYXJlIGRvZXMgbm90IHN1cHBvcnQgJWQgXG4iLCBwbV9zdGF0ZSk7CiAJCXJldHVybiAtRVBFUk07Ci0KLQkvKiBkbyB3ZSBoYXZlIGEgd2FrZXVwIGFkZHJlc3MgZm9yIFMyIGFuZCBTMz8gKi8KLQkvKiBIZXJlLCB3ZSBzdXBwb3J0IG9ubHkgUzRCSU9TLCB0aG9zZSB3ZSBzZXQgdGhlIHdha2V1cCBhZGRyZXNzICovCi0JLyogUzRPUyBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igbm93IHZpYSBzd3N1c3AuLiAqLwotCWlmIChwbV9zdGF0ZSA9PSBQTV9TVVNQRU5EX01FTSB8fCBwbV9zdGF0ZSA9PSBQTV9TVVNQRU5EX0RJU0spIHsKLQkJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoCi0JCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSB2aXJ0X3RvX3BoeXMoCi0JCQkJKHZvaWQgKilhY3BpX3dha2V1cF9hZGRyZXNzKSk7CiAJfQotCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7Ci0JYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZV9wcmVwKGFjcGlfc3RhdGUpOwotCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcChhY3BpX3N0YXRlKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYWNwaV9zbGVlcF9wcmVwYXJlKGFjcGlfc3RhdGUpOwogfQogCi0KIC8qKgogICoJYWNwaV9wbV9lbnRlciAtIEFjdHVhbGx5IGVudGVyIGEgc2xlZXAgc3RhdGUuCiAgKglAcG1fc3RhdGU6CQlTdGF0ZSB3ZSdyZSBlbnRlcmluZy4KQEAgLTkyLDExICs4Myw5IEBACiAJCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZShhY3BpX3N0YXRlKTsKLQlzd2l0Y2ggKHBtX3N0YXRlKQotCXsKKwlzd2l0Y2ggKHBtX3N0YXRlKSB7CiAJY2FzZSBQTV9TVVNQRU5EX1NUQU5EQlk6CiAJCWJhcnJpZXIoKTsKIAkJc3RhdHVzID0gYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZShhY3BpX3N0YXRlKTsKQEAgLTExMiw2ICsxMDEsMTAgQEAKIAkJZWxzZQogCQkJZG9fc3VzcGVuZF9sb3dsZXZlbF9zNGJpb3MoKTsKIAkJYnJlYWs7CisJY2FzZSBQTV9TVVNQRU5EX01BWDoKKwkJYWNwaV9wb3dlcl9vZmYoKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMjYsMTEgKzExOSw5IEBACiAJaWYgKHBtX3N0YXRlID4gUE1fU1VTUEVORF9TVEFOREJZKQogCQlhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKCk7CiAKLQogCXJldHVybiBBQ1BJX1NVQ0NFU1Moc3RhdHVzKSA/IDAgOiAtRUZBVUxUOwogfQogCi0KIC8qKgogICoJYWNwaV9wbV9maW5pc2ggLSBGaW5pc2ggdXAgc3VzcGVuZCBzZXF1ZW5jZS4KICAqCUBwbV9zdGF0ZToJCVN0YXRlIHdlJ3JlIGNvbWluZyBvdXQgb2YuCkBAIC0xNTYsMjcgKzE0NywyNiBAQAogCXJldHVybiAwOwogfQogCi0KIGludCBhY3BpX3N1c3BlbmQodTMyIGFjcGlfc3RhdGUpCiB7CiAJc3VzcGVuZF9zdGF0ZV90IHN0YXRlc1tdID0gewotCQlbMV0JPSBQTV9TVVNQRU5EX1NUQU5EQlksCi0JCVszXQk9IFBNX1NVU1BFTkRfTUVNLAotCQlbNF0JPSBQTV9TVVNQRU5EX0RJU0ssCisJCVsxXSA9IFBNX1NVU1BFTkRfU1RBTkRCWSwKKwkJWzNdID0gUE1fU1VTUEVORF9NRU0sCisJCVs0XSA9IFBNX1NVU1BFTkRfRElTSywKKwkJWzVdID0gUE1fU1VTUEVORF9NQVgKIAl9OwogCi0JaWYgKGFjcGlfc3RhdGUgPD0gNCAmJiBzdGF0ZXNbYWNwaV9zdGF0ZV0pCisJaWYgKGFjcGlfc3RhdGUgPCA2ICYmIHN0YXRlc1thY3BpX3N0YXRlXSkKIAkJcmV0dXJuIHBtX3N1c3BlbmQoc3RhdGVzW2FjcGlfc3RhdGVdKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIHN0cnVjdCBwbV9vcHMgYWNwaV9wbV9vcHMgPSB7Ci0JLnByZXBhcmUJPSBhY3BpX3BtX3ByZXBhcmUsCi0JLmVudGVyCQk9IGFjcGlfcG1fZW50ZXIsCi0JLmZpbmlzaAkJPSBhY3BpX3BtX2ZpbmlzaCwKKwkucHJlcGFyZSA9IGFjcGlfcG1fcHJlcGFyZSwKKwkuZW50ZXIgPSBhY3BpX3BtX2VudGVyLAorCS5maW5pc2ggPSBhY3BpX3BtX2ZpbmlzaCwKIH07CiAKLQogLyoKICAqIFRvc2hpYmEgZmFpbHMgdG8gcHJlc2VydmUgaW50ZXJydXB0cyBvdmVyIFMxLCByZWluaXRpYWxpemF0aW9uCiAgKiBvZiA4MjU5IGlzIG5lZWRlZCBhZnRlciBTMSByZXN1bWUuCkBAIC0xOTAsMTYgKzE4MCwxNiBAQAogCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBhY3Bpc2xlZXBfZG1pX3RhYmxlW10gPSB7CiAJewotCQkuY2FsbGJhY2sgPSBpbml0X2ludHNfYWZ0ZXJfczEsCi0JCS5pZGVudCA9ICJUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwY2R0IiwKLQkJLm1hdGNoZXMgPSB7IERNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiUzQwMzBDRFQvNC4zIiksIH0sCi0JfSwKLQl7IH0sCisJIC5jYWxsYmFjayA9IGluaXRfaW50c19hZnRlcl9zMSwKKwkgLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIDQwMzBjZHQiLAorCSAubWF0Y2hlcyA9IHtETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlM0MDMwQ0RULzQuMyIpLH0sCisJIH0sCisJe30sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NsZWVwX2luaXQodm9pZCkKIHsKLQlpbnQJCQlpID0gMDsKKwlpbnQgaSA9IDA7CiAKIAlkbWlfY2hlY2tfc3lzdGVtKGFjcGlzbGVlcF9kbWlfdGFibGUpOwogCkBAIC0yMDcsNyArMTk3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiKHN1cHBvcnRzIik7Ci0JZm9yIChpPTA7IGkgPCBBQ1BJX1NfU1RBVEVfQ09VTlQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1NfU1RBVEVfQ09VTlQ7IGkrKykgewogCQlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJCXU4IHR5cGVfYSwgdHlwZV9iOwogCQlzdGF0dXMgPSBhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEoaSwgJnR5cGVfYSwgJnR5cGVfYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvcG93ZXJvZmYuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jCmluZGV4IGRhMjM3NzUuLjFmYzg2ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9wb3dlcm9mZi5jCkBAIC0zLDM1ICszLDEwMCBAQAogICoKICAqIEFLQSBTNSwgYnV0IGl0IGlzIGluZGVwZW5kZW50IG9mIHdoZXRoZXIgb3Igbm90IHRoZSBrZXJuZWwgc3VwcG9ydHMKICAqIGFueSBvdGhlciBzbGVlcCBzdXBwb3J0IGluIHRoZSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFsZXhleSBTdGFyaWtvdnNraXkgPGFsZXhleS55LnN0YXJpa292c2tpeUBpbnRlbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAic2xlZXAuaCIKIAotc3RhdGljIHZvaWQKLWFjcGlfcG93ZXJfb2ZmICh2b2lkKQoraW50IGFjcGlfc2xlZXBfcHJlcGFyZSh1MzIgYWNwaV9zdGF0ZSkKIHsKLQlwcmludGsoIiVzIGNhbGxlZFxuIixfX0ZVTkNUSU9OX18pOworCS8qIEZsYWcgdG8gZG8gbm90IGFsbG93IHNlY29uZCB0aW1lIGludm9jYXRpb24gZm9yIFM1IHN0YXRlICovCisJc3RhdGljIGludCBzaHV0ZG93bl9wcmVwYXJlZCA9IDA7CisjaWZkZWYgQ09ORklHX0FDUElfU0xFRVAKKwkvKiBkbyB3ZSBoYXZlIGEgd2FrZXVwIGFkZHJlc3MgZm9yIFMyIGFuZCBTMz8gKi8KKwkvKiBIZXJlLCB3ZSBzdXBwb3J0IG9ubHkgUzRCSU9TLCB0aG9zZSB3ZSBzZXQgdGhlIHdha2V1cCBhZGRyZXNzICovCisJLyogUzRPUyBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igbm93IHZpYSBzd3N1c3AuLiAqLworCWlmIChhY3BpX3N0YXRlID09IEFDUElfU1RBVEVfUzMgfHwgYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1M0KSB7CisJCWlmICghYWNwaV93YWtldXBfYWRkcmVzcykgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvcigoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJCQkJdmlydF90b19waHlzKCh2b2lkICopCisJCQkJCQkJICAgICBhY3BpX3dha2V1cF9hZGRyZXNzKSk7CisKKwl9CisJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKKwlhY3BpX2VuYWJsZV93YWtldXBfZGV2aWNlX3ByZXAoYWNwaV9zdGF0ZSk7CisjZW5kaWYKKwlpZiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1M1KSB7CisJCS8qIENoZWNrIGlmIHdlIHdlcmUgYWxyZWFkeSBjYWxsZWQgKi8KKwkJaWYgKHNodXRkb3duX3ByZXBhcmVkKQorCQkJcmV0dXJuIDA7CisJCWFjcGlfd2FrZXVwX2dwZV9wb3dlcm9mZl9wcmVwYXJlKCk7CisJCXNodXRkb3duX3ByZXBhcmVkID0gMTsKKwl9CisJYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKGFjcGlfc3RhdGUpOworCXJldHVybiAwOworfQorCit2b2lkIGFjcGlfcG93ZXJfb2ZmKHZvaWQpCit7CisJcHJpbnRrKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJYWNwaV9zbGVlcF9wcmVwYXJlKEFDUElfU1RBVEVfUzUpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJLyogU29tZSBTTVAgbWFjaGluZXMgb25seSBjYW4gcG93ZXJvZmYgaW4gYm9vdCBDUFUgKi8KIAlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KDApKTsKLQlhY3BpX3dha2V1cF9ncGVfcG93ZXJvZmZfcHJlcGFyZSgpOwotCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcChBQ1BJX1NUQVRFX1M1KTsKLQlBQ1BJX0RJU0FCTEVfSVJRUygpOwogCWFjcGlfZW50ZXJfc2xlZXBfc3RhdGUoQUNQSV9TVEFURV9TNSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBhY3BpX3NodXRkb3duKHN0cnVjdCBzeXNfZGV2aWNlICp4KQoreworCXJldHVybiBhY3BpX3NsZWVwX3ByZXBhcmUoQUNQSV9TVEFURV9TNSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIGFjcGlfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiYWNwaSIpLAorCS5zaHV0ZG93biA9IGFjcGlfc2h1dGRvd24KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfYWNwaSA9IHsKKwkuaWQgPSAwLAorCS5jbHMgPSAmYWNwaV9zeXNjbGFzcywKK307CisKKyNlbmRpZgorCiBzdGF0aWMgaW50IGFjcGlfcG93ZXJvZmZfaW5pdCh2b2lkKQogewogCWlmICghYWNwaV9kaXNhYmxlZCkgewogCQl1OCB0eXBlX2EsIHR5cGVfYjsKIAkJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JCXN0YXR1cyA9IGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YShBQ1BJX1NUQVRFX1M1LCAmdHlwZV9hLCAmdHlwZV9iKTsKLQkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKQorCQlzdGF0dXMgPQorCQkgICAgYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhKEFDUElfU1RBVEVfUzUsICZ0eXBlX2EsICZ0eXBlX2IpOworCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXBtX3Bvd2VyX29mZiA9IGFjcGlfcG93ZXJfb2ZmOworI2lmZGVmIENPTkZJR19QTQorCQkJeworCQkJCWludCBlcnJvcjsKKwkJCQllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmYWNwaV9zeXNjbGFzcyk7CisJCQkJaWYgKCFlcnJvcikKKwkJCQkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV9hY3BpKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvcHJvYy5jCmluZGV4IGZkN2M1YTAuLjFiZTk5ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC9wcm9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwL3Byb2MuYwpAQCAtMTMsMTMgKzEzLDE3IEBACiAKICNpbmNsdWRlICJzbGVlcC5oIgogCisjaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX1NMRUVQCQkic2xlZXAiCisjZW5kaWYKKwogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0FMQVJNCQkiYWxhcm0iCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfV0FLRVVQX0RFVklDRSAgICJ3YWtldXAiCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCiBBQ1BJX01PRFVMRV9OQU1FCQkoInNsZWVwIikKIAorI2lmZGVmCUNPTkZJR19BQ1BJX1NMRUVQX1BST0NfU0xFRVAKIAogc3RhdGljIGludCBhY3BpX3N5c3RlbV9zbGVlcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewpAQCAtNzgsNiArODIsNyBAQAogIERvbmU6CiAJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBjb3VudDsKIH0KKyNlbmRpZgkvKiBDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQICovCiAKIHN0YXRpYyBpbnQgYWNwaV9zeXN0ZW1fYWxhcm1fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKQEAgLTQ1Miw2ICs0NTcsNyBAQAogCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCisjaWZkZWYJQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9zeXN0ZW1fc2xlZXBfZm9wcyA9IHsKIAkub3BlbgkJPSBhY3BpX3N5c3RlbV9zbGVlcF9vcGVuX2ZzLAogCS5yZWFkCQk9IHNlcV9yZWFkLApAQCAtNDU5LDYgKzQ2NSw3IEBACiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CisjZW5kaWYJLyogQ09ORklHX0FDUElfU0xFRVBfUFJPQ19TTEVFUCAqLwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX3N5c3RlbV9hbGFybV9mb3BzID0gewogCS5vcGVuCQk9IGFjcGlfc3lzdGVtX2FsYXJtX29wZW5fZnMsCkBAIC00ODQsMTEgKzQ5MSwxMyBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gMDsKICAKKyNpZmRlZglDT05GSUdfQUNQSV9TTEVFUF9QUk9DX1NMRUVQCiAJLyogJ3NsZWVwJyBbUi9XXSovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX1NMRUVQLAogCQkJCSAgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIGFjcGlfcm9vdF9kaXIpOwogCWlmIChlbnRyeSkKIAkJZW50cnktPnByb2NfZm9wcyA9ICZhY3BpX3N5c3RlbV9zbGVlcF9mb3BzOworI2VuZGlmCiAKIAkvKiAnYWxhcm0nIFtSL1ddICovCiAJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeShBQ1BJX1NZU1RFTV9GSUxFX0FMQVJNLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCmluZGV4IDMzNDMyN2MuLjkyZTBjMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKQEAgLTUwLDYgKzUwLDI0IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9UQUJMRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInRiY29udnJ0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICAgICAqbmV3X2dhc19zdHJ1Y3QsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9iaXRfd2lkdGgsCisJYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzKTsKKworc3RhdGljIHZvaWQKK2FjcGlfdGJfY29udmVydF9mYWR0MSAoCisJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpsb2NhbF9mYWR0LAorCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MSAgICAqb3JpZ2luYWxfZmFkdCk7CisKK3N0YXRpYyB2b2lkCithY3BpX3RiX2NvbnZlcnRfZmFkdDIgKAorCXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAgICAqbG9jYWxfZmFkdCwKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgICAgKm9yaWdpbmFsX2ZhZHQpOworCiAKIHU4IGFjcGlfZmFkdF9pc192MTsKIEVYUE9SVF9TWU1CT0woYWNwaV9mYWR0X2lzX3YxKTsKQEAgLTE0MiwxMSArMTYwLDEzIEBACiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQ7IGkrKykgewogCQlpZiAoYWNwaV9nYmxfUlNEUC0+cmV2aXNpb24gPCAyKSB7CiAJCQlBQ1BJX1NUT1JFX0FERFJFU1MgKG5ld190YWJsZS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldLAotCQkJCShBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEsIHRhYmxlX2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldKTsKKwkJCQkoQUNQSV9DQVNUX1BUUiAoc3RydWN0IHJzZHRfZGVzY3JpcHRvcl9yZXYxLAorCQkJCQl0YWJsZV9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXSk7CiAJCX0KIAkJZWxzZSB7CiAJCQluZXdfdGFibGUtPnRhYmxlX29mZnNldF9lbnRyeVtpXSA9Ci0JCQkJKEFDUElfQ0FTVF9QVFIgKFhTRFRfREVTQ1JJUFRPUiwgdGFibGVfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV07CisJCQkJKEFDUElfQ0FTVF9QVFIgKFhTRFRfREVTQ1JJUFRPUiwKKwkJCQkJdGFibGVfaW5mby0+cG9pbnRlcikpLT50YWJsZV9vZmZzZXRfZW50cnlbaV07CiAJCX0KIAl9CiAKQEAgLTE2NCw3ICsxODQsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MKICAqCkBAIC0yMDEsNyArMjIxLDcgQEAKICAqIFBBUkFNRVRFUlM6ICBsb2NhbF9mYWR0ICAgICAgLSBQb2ludGVyIHRvIG5ldyBGQURUCiAgKiAgICAgICAgICAgICAgb3JpZ2luYWxfZmFkdCAgIC0gUG9pbnRlciB0byBvbGQgRkFEVAogICoKLSAqIFJFVFVSTjogICAgICBQb3B1bGF0ZXMgbG9jYWxfZmFkdAorICogUkVUVVJOOiAgICAgIE5vbmUsIHBvcHVsYXRlcyBsb2NhbF9mYWR0CiAgKgogICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQUNQSSAxLjAgRkFEVCB0byBjb21tb24gaW50ZXJuYWwgZm9ybWF0CiAgKgpAQCAtMjEzLDcgKzIzMyw2IEBACiAJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxICAgICpvcmlnaW5hbF9mYWR0KQogewogCi0KIAkvKiBBQ1BJIDEuMCBGQUNTICovCiAJLyogVGhlIEJJT1Mgc3RvcmVkIEZBRFQgc2hvdWxkIGFncmVlIHdpdGggUmV2aXNpb24gMS4wICovCiAJYWNwaV9mYWR0X2lzX3YxID0gMTsKQEAgLTIzMiw3ICsyNTEsOCBAQAogCUFDUElfU1RPUkVfQUREUkVTUyAobG9jYWxfZmFkdC0+WGRzZHQsIGxvY2FsX2ZhZHQtPlYxX2RzZHQpOwogCiAJLyoKLQkgKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsIGlzbid0IHVzZWQgaW4gQUNQSSAyLjAgKGxvY2FsX2ZhZHQtPlJlc2VydmVkMSA9IDA7KQorCSAqIFN5c3RlbSBJbnRlcnJ1cHQgTW9kZWwgaXNuJ3QgdXNlZCBpbiBBQ1BJIDIuMAorCSAqIChsb2NhbF9mYWR0LT5SZXNlcnZlZDEgPSAwOykKIAkgKi8KIAogCS8qCkBAIC0yNjksNyArMjg5LDggQEAKIAkJICogdGhhdCBpbW1lZGlhdGVseSBmb2xsb3dzLgogCQkgKi8KIAkJQUNQSV9NRU1DUFkgKCZsb2NhbF9mYWR0LT5yZXNldF9yZWdpc3RlciwKLQkJCSYoQUNQSV9DQVNUX1BUUiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyX21pbnVzLCBvcmlnaW5hbF9mYWR0KSktPnJlc2V0X3JlZ2lzdGVyLAorCQkJJihBQ1BJX0NBU1RfUFRSIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjJfbWludXMsCisJCQkJb3JpZ2luYWxfZmFkdCkpLT5yZXNldF9yZWdpc3RlciwKICAgCQkJc2l6ZW9mIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MpICsgMSk7CiAJfQogCWVsc2UgewpAQCAtMzA0LDcgKzMyNSw4IEBACiAKIAlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWFfZW5hYmxlLAogCQkgKHU4KSBBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiksCi0JCSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKKwkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkobG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzICsKIAkJCUFDUElfRElWXzIgKGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuKSkpOwogCiAJLyogUE0xQiBpcyBvcHRpb25hbDsgbGVhdmUgbnVsbCBpZiBub3QgcHJlc2VudCAqLwpAQCAtMzEyLDcgKzMzNCw4IEBACiAJaWYgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWJfZW5hYmxlLAogCQkJICh1OCkgQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pLAotCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIChsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MgKworCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyArCiAJCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7CiAJfQogfQpAQCAtMzI1LDcgKzM0OCw3IEBACiAgKiBQQVJBTUVURVJTOiAgbG9jYWxfZmFkdCAgICAgIC0gUG9pbnRlciB0byBuZXcgRkFEVAogICogICAgICAgICAgICAgIG9yaWdpbmFsX2ZhZHQgICAtIFBvaW50ZXIgdG8gb2xkIEZBRFQKICAqCi0gKiBSRVRVUk46ICAgICAgUG9wdWxhdGVzIGxvY2FsX2ZhZHQKKyAqIFJFVFVSTjogICAgICBOb25lLCBwb3B1bGF0ZXMgbG9jYWxfZmFkdAogICoKICAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGFuIEFDUEkgMi4wIEZBRFQgdG8gY29tbW9uIGludGVybmFsIGZvcm1hdC4KICAqICAgICAgICAgICAgICBIYW5kbGVzIG9wdGlvbmFsICJYIiBmaWVsZHMuCkBAIC0zNDgsNyArMzcxLDggQEAKIAkgKiBpcyB6ZXJvLgogCSAqLwogCWlmICghKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsKSkgewotCQlBQ1BJX1NUT1JFX0FERFJFU1MgKGxvY2FsX2ZhZHQtPnhmaXJtd2FyZV9jdHJsLCBsb2NhbF9mYWR0LT5WMV9maXJtd2FyZV9jdHJsKTsKKwkJQUNQSV9TVE9SRV9BRERSRVNTIChsb2NhbF9mYWR0LT54ZmlybXdhcmVfY3RybCwKKwkJCWxvY2FsX2ZhZHQtPlYxX2Zpcm13YXJlX2N0cmwpOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPlhkc2R0KSkgewpAQCAtMzU3LDMyICszODEsMzggQEAKIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcykpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYV9ldnRfYmxrKTsKKwkJCWxvY2FsX2ZhZHQtPnBtMV9ldnRfbGVuLAorCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYV9ldnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLmFkZHJlc3MpKSB7CiAJCWFjcGlfdGJfaW5pdF9nZW5lcmljX2FkZHJlc3MgKCZsb2NhbF9mYWR0LT54cG0xYl9ldnRfYmxrLAotCQkJbG9jYWxfZmFkdC0+cG0xX2V2dF9sZW4sIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWJfZXZ0X2Jsayk7CisJCQlsb2NhbF9mYWR0LT5wbTFfZXZ0X2xlbiwKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMWJfZXZ0X2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eHBtMWFfY250X2Jsay5hZGRyZXNzKSkgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtMWFfY250X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFhX2NudF9ibGspOworCQkJbG9jYWxfZmFkdC0+cG0xX2NudF9sZW4sCisJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTFhX2NudF9ibGspOwogCX0KIAogCWlmICghKGxvY2FsX2ZhZHQtPnhwbTFiX2NudF9ibGsuYWRkcmVzcykpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTFiX2NudF9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbTFfY250X2xlbiwgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYl9jbnRfYmxrKTsKKwkJCWxvY2FsX2ZhZHQtPnBtMV9jbnRfbGVuLAorCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG0xYl9jbnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG0yX2NudF9ibGsuYWRkcmVzcykpIHsKIAkJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmxvY2FsX2ZhZHQtPnhwbTJfY250X2JsaywKLQkJCWxvY2FsX2ZhZHQtPnBtMl9jbnRfbGVuLCAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBsb2NhbF9mYWR0LT5WMV9wbTJfY250X2Jsayk7CisJCQlsb2NhbF9mYWR0LT5wbTJfY250X2xlbiwKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtMl9jbnRfYmxrKTsKIAl9CiAKIAlpZiAoIShsb2NhbF9mYWR0LT54cG1fdG1yX2Jsay5hZGRyZXNzKSkgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmbG9jYWxfZmFkdC0+eHBtX3Rtcl9ibGssCi0JCQlsb2NhbF9mYWR0LT5wbV90bV9sZW4sIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIGxvY2FsX2ZhZHQtPlYxX3BtX3Rtcl9ibGspOworCQkJbG9jYWxfZmFkdC0+cG1fdG1fbGVuLAorCQkJKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgbG9jYWxfZmFkdC0+VjFfcG1fdG1yX2Jsayk7CiAJfQogCiAJaWYgKCEobG9jYWxfZmFkdC0+eGdwZTBfYmxrLmFkZHJlc3MpKSB7CkBAIC0zOTksMTggKzQyOSwyNCBAQAogCiAJYWNwaV90Yl9pbml0X2dlbmVyaWNfYWRkcmVzcyAoJmFjcGlfZ2JsX3hwbTFhX2VuYWJsZSwKIAkJKHU4KSBBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiksCi0JCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIChsb2NhbF9mYWR0LT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgKworCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQorCQkJKGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcyArCiAJCQlBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikpKTsKLQlhY3BpX2dibF94cG0xYV9lbmFibGUuYWRkcmVzc19zcGFjZV9pZCA9IGxvY2FsX2ZhZHQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKKworCWFjcGlfZ2JsX3hwbTFhX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0KKwkJbG9jYWxfZmFkdC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOwogCiAJLyogUE0xQiBpcyBvcHRpb25hbDsgbGVhdmUgbnVsbCBpZiBub3QgcHJlc2VudCAqLwogCiAJaWYgKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcykgewogCQlhY3BpX3RiX2luaXRfZ2VuZXJpY19hZGRyZXNzICgmYWNwaV9nYmxfeHBtMWJfZW5hYmxlLAogCQkJKHU4KSBBQ1BJX0RJVl8yIChhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiksCi0JCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSAobG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzICsKKwkJCShhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCisJCQkJKGxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyArCiAJCQkJQUNQSV9ESVZfMiAoYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pKSk7Ci0JCWFjcGlfZ2JsX3hwbTFiX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0gbG9jYWxfZmFkdC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzX3NwYWNlX2lkOworCisJCWFjcGlfZ2JsX3hwbTFiX2VuYWJsZS5hZGRyZXNzX3NwYWNlX2lkID0KKwkJCWxvY2FsX2ZhZHQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzc19zcGFjZV9pZDsKIAl9CiB9CiAKQEAgLTQzMiw3ICs0NjgsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0ICh2b2lkKQorYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQgKAorCXZvaWQpCiB7CiAJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICAgICpsb2NhbF9mYWR0OwogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAqdGFibGVfZGVzYzsKQEAgLTQ0Niw3ICs0ODMsOCBAQAogCSAqIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIHZlcnNpb24gMS4wIEZBRFQKIAkgKi8KIAlpZiAoYWNwaV9nYmxfRkFEVC0+bGVuZ3RoIDwgc2l6ZW9mIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEpKSB7Ci0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkZBRFQgaXMgaW52YWxpZCwgdG9vIHNob3J0OiAweCVYXG4iLCBhY3BpX2dibF9GQURULT5sZW5ndGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiRkFEVCBpcyBpbnZhbGlkLCB0b28gc2hvcnQ6IDB4JVhcbiIsCisJCQlhY3BpX2dibF9GQURULT5sZW5ndGgpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9JTlZBTElEX1RBQkxFX0xFTkdUSCk7CiAJfQogCkBAIC00NjEsOCArNDk5LDkgQEAKIAkJaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSkgewogCQkJLyogTGVuZ3RoIGlzIHRvbyBzaG9ydCB0byBiZSBhIFYyLjAgdGFibGUgKi8KIAotCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJJbmNvbnNpc3RlbnQgRkFEVCBsZW5ndGggKDB4JVgpIGFuZCByZXZpc2lvbiAoMHglWCksIHVzaW5nIEZBRFQgVjEuMCBwb3J0aW9uIG9mIHRhYmxlXG4iLAotCQkJCQkgYWNwaV9nYmxfRkFEVC0+bGVuZ3RoLCBhY3BpX2dibF9GQURULT5yZXZpc2lvbikpOworCQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKAorCQkJCSJJbmNvbnNpc3RlbnQgRkFEVCBsZW5ndGggKDB4JVgpIGFuZCByZXZpc2lvbiAoMHglWCksIHVzaW5nIEZBRFQgVjEuMCBwb3J0aW9uIG9mIHRhYmxlXG4iLAorCQkJCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCwgYWNwaV9nYmxfRkFEVC0+cmV2aXNpb24pKTsKIAogCQkJYWNwaV90Yl9jb252ZXJ0X2ZhZHQxIChsb2NhbF9mYWR0LCAodm9pZCAqKSBhY3BpX2dibF9GQURUKTsKIAkJfQpAQCAtNDc4LDkgKzUxNyw4IEBACiAJCWFjcGlfdGJfY29udmVydF9mYWR0MSAobG9jYWxfZmFkdCwgKHZvaWQgKikgYWNwaV9nYmxfRkFEVCk7CiAJfQogCi0JLyoKLQkgKiBHbG9iYWwgRkFEVCBwb2ludGVyIHdpbGwgcG9pbnQgdG8gdGhlIG5ldyBjb21tb24gVjIuMCBGQURUCi0JICovCisJLyogR2xvYmFsIEZBRFQgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoZSBuZXcgY29tbW9uIFYyLjAgRkFEVCAqLworCiAJYWNwaV9nYmxfRkFEVCA9IGxvY2FsX2ZhZHQ7CiAJYWNwaV9nYmxfRkFEVC0+bGVuZ3RoID0gc2l6ZW9mIChGQURUX0RFU0NSSVBUT1IpOwogCkBAIC01MDgsNyArNTQ2LDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhY3MKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzCiAgKgogICogUEFSQU1FVEVSUzogIHRhYmxlX2luZm8gICAgICAtIEluZm8gZm9yIGN1cnJlbnRseSBpbnN0YWxsZWQgRkFDUwogICoKQEAgLTUzMCwxMiArNTY4LDE0IEBACiAJLyogQWJzb2x1dGUgbWluaW11bSBsZW5ndGggaXMgMjQsIGJ1dCB0aGUgQUNQSSBzcGVjIHNheXMgNjQgKi8KIAogCWlmIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCAyNCkgewotCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJJbnZhbGlkIEZBQ1MgdGFibGUgbGVuZ3RoOiAweCVYXG4iLCBhY3BpX2dibF9GQUNTLT5sZW5ndGgpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW52YWxpZCBGQUNTIHRhYmxlIGxlbmd0aDogMHglWFxuIiwKKwkJCWFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0lOVkFMSURfVEFCTEVfTEVOR1RIKTsKIAl9CiAKIAlpZiAoYWNwaV9nYmxfRkFDUy0+bGVuZ3RoIDwgNjQpIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJGQUNTIGlzIHNob3J0ZXIgdGhhbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIGFsbG93czogMHglWCwgdXNpbmcgYW55d2F5XG4iLAorCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkiRkFDUyBpcyBzaG9ydGVyIHRoYW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiBhbGxvd3M6IDB4JVgsIHVzaW5nIGFueXdheVxuIiwKIAkJCWFjcGlfZ2JsX0ZBQ1MtPmxlbmd0aCkpOwogCX0KIApAQCAtNTQ4LDcgKzU4OCw4IEBACiAJCSghKGFjcGlfZ2JsX0ZBQ1MtPnhmaXJtd2FyZV93YWtpbmdfdmVjdG9yKSkpIHsKIAkJLyogQUNQSSAxLjAgRkFDUyBvciBzaG9ydCB0YWJsZSBvciBvcHRpb25hbCBYXyBmaWVsZCBpcyB6ZXJvICovCiAKLQkJYWNwaV9nYmxfY29tbW9uX2ZBQ1MuZmlybXdhcmVfd2FraW5nX3ZlY3RvciA9IEFDUElfQ0FTVF9QVFIgKHU2NCwgJihhY3BpX2dibF9GQUNTLT5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7CisJCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IgPSBBQ1BJX0NBU1RfUFRSICh1NjQsCisJCQkJJihhY3BpX2dibF9GQUNTLT5maXJtd2FyZV93YWtpbmdfdmVjdG9yKSk7CiAJCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLnZlY3Rvcl93aWR0aCA9IDMyOwogCX0KIAllbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYwppbmRleCA4OTZmM2RkLi40YWIyYWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCkBAIC00OSw2ICs0OSwxOSBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YmdldCIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX2dldF90aGlzX3RhYmxlICgKKwlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAorCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX3RhYmxlX292ZXJyaWRlICgKKwlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC03Niw5ICs4OSw4IEBACiAJQUNQSV9GVU5DVElPTl9UUkFDRSAoInRiX2dldF90YWJsZSIpOwogCiAKLQkvKgotCSAqIEdldCB0aGUgaGVhZGVyIGluIG9yZGVyIHRvIGdldCBzaWduYXR1cmUgYW5kIHRhYmxlIHNpemUKLQkgKi8KKwkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplICovCisKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKGFkZHJlc3MsICZoZWFkZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMTI3LDggKzEzOSw4IEBACiAKIAogCS8qCi0JICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwgYWRkcmVzc2luZykKLQkgKiBUaGUgcG9pbnRlcl90eXBlIGlzIGVpdGhlciBMb2dpY2FsIG9yIFBoeXNpY2FsCisJICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwKKwkgKiBhZGRyZXNzaW5nKSBUaGUgcG9pbnRlcl90eXBlIGlzIGVpdGhlciBMb2dpY2FsIG9yIFBoeXNpY2FsCiAJICovCiAJc3dpdGNoIChhZGRyZXNzLT5wb2ludGVyX3R5cGUpIHsKIAljYXNlIEFDUElfUEhZU01PREVfUEhZU1BUUjoKQEAgLTEzNiw3ICsxNDgsOCBAQAogCiAJCS8qIFBvaW50ZXIgbWF0Y2hlcyBwcm9jZXNzb3IgbW9kZSwgY29weSB0aGUgaGVhZGVyICovCiAKLQkJQUNQSV9NRU1DUFkgKHJldHVybl9oZWFkZXIsIGFkZHJlc3MtPnBvaW50ZXIubG9naWNhbCwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKKwkJQUNQSV9NRU1DUFkgKHJldHVybl9oZWFkZXIsIGFkZHJlc3MtPnBvaW50ZXIubG9naWNhbCwKKwkJCXNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJCWJyZWFrOwogCiAKQEAgLTE0NCwxMCArMTU3LDExIEBACiAKIAkJLyogQ3JlYXRlIGEgbG9naWNhbCBhZGRyZXNzIGZvciB0aGUgcGh5c2ljYWwgcG9pbnRlciovCiAKLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLCBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciksCi0JCQkJICAodm9pZCAqKSAmaGVhZGVyKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAorCQkJCSBzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciksICh2b2lkICopICZoZWFkZXIpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCU4LjhYIGZvciBsZW5ndGggJVhcbiIsCisJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCU4LjhYIGZvciBsZW5ndGggJVhcbiIsCiAJCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsKSwKIAkJCQlzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKQEAgLTIxMCw5ICsyMjQsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCS8qCi0JICogQXR0ZW1wdCB0YWJsZSBvdmVycmlkZS4KLQkgKi8KKwkvKiBBdHRlbXB0IHRhYmxlIG92ZXJyaWRlLiAqLworCiAJc3RhdHVzID0gYWNwaV90Yl90YWJsZV9vdmVycmlkZSAoaGVhZGVyLCB0YWJsZV9pbmZvKTsKIAlpZiAoQUNQSV9TVUNDRVNTIChzdGF0dXMpKSB7CiAJCS8qIFRhYmxlIHdhcyBvdmVycmlkZGVuIGJ5IHRoZSBob3N0IE9TICovCkBAIC0yNDEsNyArMjU0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3RiX3RhYmxlX292ZXJyaWRlICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpoZWFkZXIsCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbykKQEAgLTMxNSw3ICszMjgsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3RoaXNfdGFibGUgKAogCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqaGVhZGVyLApAQCAtMzMwLDggKzM0Myw4IEBACiAKIAogCS8qCi0JICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwgYWRkcmVzc2luZykKLQkgKiBUaGUgcG9pbnRlcl90eXBlIGlzIGVpdGhlciBMb2dpY2FsIG9yIFBoeXNpY2FsCisJICogRmxhZ3MgY29udGFpbnMgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG1vZGUgKFZpcnR1YWwgb3IgUGh5c2ljYWwKKwkgKiBhZGRyZXNzaW5nKSBUaGUgcG9pbnRlcl90eXBlIGlzIGVpdGhlciBMb2dpY2FsIG9yIFBoeXNpY2FsCiAJICovCiAJc3dpdGNoIChhZGRyZXNzLT5wb2ludGVyX3R5cGUpIHsKIAljYXNlIEFDUElfUEhZU01PREVfUEhZU1BUUjoKQEAgLTM0MSw3ICszNTQsOCBAQAogCiAJCWZ1bGxfdGFibGUgPSBBQ1BJX01FTV9BTExPQ0FURSAoaGVhZGVyLT5sZW5ndGgpOwogCQlpZiAoIWZ1bGxfdGFibGUpIHsKLQkJCUFDUElfUkVQT1JUX0VSUk9SICgoIkNvdWxkIG5vdCBhbGxvY2F0ZSB0YWJsZSBtZW1vcnkgZm9yIFslNC40c10gbGVuZ3RoICVYXG4iLAorCQkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCQkiQ291bGQgbm90IGFsbG9jYXRlIHRhYmxlIG1lbW9yeSBmb3IgWyU0LjRzXSBsZW5ndGggJVhcbiIsCiAJCQkJaGVhZGVyLT5zaWduYXR1cmUsIGhlYWRlci0+bGVuZ3RoKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJCX0KQEAgLTM2MiwxMiArMzc2LDE0IEBACiAJCSAqIEp1c3QgbWFwIHRoZSB0YWJsZSdzIHBoeXNpY2FsIG1lbW9yeQogCQkgKiBpbnRvIG91ciBhZGRyZXNzIHNwYWNlLgogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLCAoYWNwaV9zaXplKSBoZWFkZXItPmxlbmd0aCwKLQkJCQkgICh2b2lkICopICZmdWxsX3RhYmxlKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsLAorCQkJCSAoYWNwaV9zaXplKSBoZWFkZXItPmxlbmd0aCwgKHZvaWQgKikgJmZ1bGxfdGFibGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7Ci0JCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJDb3VsZCBub3QgbWFwIG1lbW9yeSBmb3IgdGFibGUgWyU0LjRzXSBhdCAlOC44WCU4LjhYIGZvciBsZW5ndGggJVhcbiIsCisJCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBmb3IgdGFibGUgWyU0LjRzXSBhdCAlOC44WCU4LjhYIGZvciBsZW5ndGggJVhcbiIsCiAJCQkJaGVhZGVyLT5zaWduYXR1cmUsCi0JCQkJQUNQSV9GT1JNQVRfVUlOVDY0IChhZGRyZXNzLT5wb2ludGVyLnBoeXNpY2FsKSwgaGVhZGVyLT5sZW5ndGgpKTsKKwkJCQlBQ1BJX0ZPUk1BVF9VSU5UNjQgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwpLAorCQkJCWhlYWRlci0+bGVuZ3RoKSk7CiAJCQlyZXR1cm4gKHN0YXR1cyk7CiAJCX0KIApAQCAtNDY1LDkgKzQ4MSw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KIAotCS8qCi0JICogQ2hlY2sgZm9yIGluc3RhbmNlIG91dCBvZiByYW5nZQotCSAqLworCS8qIENoZWNrIGZvciBpbnN0YW5jZSBvdXQgb2YgcmFuZ2UgKi8KKwogCWlmIChpbnN0YW5jZSA+IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLmNvdW50KSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKaW5kZXggYWRjNDI3MC4uZWVhNWI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYwpAQCAtNDksNiArNDksMTkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJnZXRhbGwiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSAoCisJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3RiX2dldF9zZWNvbmRhcnlfdGFibGUgKAorCXN0cnVjdCBhY3BpX3BvaW50ZXIgICAgICAgICAgICAgKmFkZHJlc3MsCisJYWNwaV9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02Myw3ICs3Niw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV90Yl9nZXRfcHJpbWFyeV90YWJsZSAoCiAJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKQpAQCAtODEsOSArOTQsOCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAl9CiAKLQkvKgotCSAqIEdldCB0aGUgaGVhZGVyIGluIG9yZGVyIHRvIGdldCBzaWduYXR1cmUgYW5kIHRhYmxlIHNpemUKLQkgKi8KKwkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplICovCisKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9oZWFkZXIgKGFkZHJlc3MsICZoZWFkZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwpAQCAtMTMwLDcgKzE0Miw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgKIAlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAogCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLApAQCAtMTUzLDcgKzE2NSw4IEBACiAJLyogU2lnbmF0dXJlIG11c3QgbWF0Y2ggcmVxdWVzdCAqLwogCiAJaWYgKEFDUElfU1RSTkNNUCAoaGVhZGVyLnNpZ25hdHVyZSwgc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiSW5jb3JyZWN0IHRhYmxlIHNpZ25hdHVyZSAtIHdhbnRlZCBbJXNdIGZvdW5kIFslNC40c11cbiIsCisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiSW5jb3JyZWN0IHRhYmxlIHNpZ25hdHVyZSAtIHdhbnRlZCBbJXNdIGZvdW5kIFslNC40c11cbiIsCiAJCQlzaWduYXR1cmUsIGhlYWRlci5zaWduYXR1cmUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfU0lHTkFUVVJFKTsKIAl9CkBAIC0yMzAsNyArMjQzLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsgaSsrKSB7CiAJCS8qIEdldCB0aGUgdGFibGUgYWRkcmVzcyBmcm9tIHRoZSBjb21tb24gaW50ZXJuYWwgWFNEVCAqLwogCi0JCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX1hTRFQtPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKKwkJYWRkcmVzcy5wb2ludGVyLnZhbHVlID0KKwkJCQkgIGFjcGlfZ2JsX1hTRFQtPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKIAogCQkvKgogCQkgKiBHZXQgdGhlIHRhYmxlcyBuZWVkZWQgYnkgdGhpcyBzdWJzeXN0ZW0gKEZBRFQgYW5kIGFueSBTU0RUcykuCkBAIC0yNTIsMTggKzI2NiwxOCBAQAogCX0KIAogCS8qCi0JICogQ29udmVydCB0aGUgRkFEVCB0byBhIGNvbW1vbiBmb3JtYXQuICBUaGlzIGFsbG93cyBlYXJsaWVyIHJldmlzaW9ucyBvZiB0aGUKLQkgKiB0YWJsZSB0byBjb2V4aXN0IHdpdGggbmV3ZXIgdmVyc2lvbnMsIHVzaW5nIGNvbW1vbiBhY2Nlc3MgY29kZS4KKwkgKiBDb252ZXJ0IHRoZSBGQURUIHRvIGEgY29tbW9uIGZvcm1hdC4gIFRoaXMgYWxsb3dzIGVhcmxpZXIgcmV2aXNpb25zIG9mCisJICogdGhlIHRhYmxlIHRvIGNvZXhpc3Qgd2l0aCBuZXdlciB2ZXJzaW9ucywgdXNpbmcgY29tbW9uIGFjY2VzcyBjb2RlLgogCSAqLwogCXN0YXR1cyA9IGFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0ICgpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiQ291bGQgbm90IGNvbnZlcnQgRkFEVCB0byBpbnRlcm5hbCBjb21tb24gZm9ybWF0XG4iKSk7CisJCUFDUElfUkVQT1JUX0VSUk9SICgoCisJCQkiQ291bGQgbm90IGNvbnZlcnQgRkFEVCB0byBpbnRlcm5hbCBjb21tb24gZm9ybWF0XG4iKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAl9CiAKLQkvKgotCSAqIEdldCB0aGUgRkFDUyAoUG9pbnRlZCB0byBieSB0aGUgRkFEVCkKLQkgKi8KKwkvKiBHZXQgdGhlIEZBQ1MgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpICovCisKIAlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9GQURULT54ZmlybXdhcmVfY3RybDsKIAogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoJmFkZHJlc3MsIEZBQ1NfU0lHLCAmdGFibGVfaW5mbyk7CkBAIC0yODIsOSArMjk2LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCS8qCi0JICogR2V0L2luc3RhbGwgdGhlIERTRFQgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpCi0JICovCisJLyogR2V0L2luc3RhbGwgdGhlIERTRFQgKFBvaW50ZWQgdG8gYnkgdGhlIEZBRFQpICovCisKIAlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9GQURULT5YZHNkdDsKIAogCXN0YXR1cyA9IGFjcGlfdGJfZ2V0X3NlY29uZGFyeV90YWJsZSAoJmFkZHJlc3MsIERTRFRfU0lHLCAmdGFibGVfaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKaW5kZXggODVkNWJiMC4uNjI5YjY0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYwpAQCAtNDksNiArNDksMTQgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJpbnN0YWwiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZSwKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoX3R5cGUpOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNTYsNiArNjQsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBTaWduYXR1cmUgICAgICAgICAgIC0gVGFibGUgc2lnbmF0dXJlIHRvIG1hdGNoCiAgKiAgICAgICAgICAgICAgdGFibGVfaW5mbyAgICAgICAgICAtIFJldHVybiBkYXRhCisgKiAgICAgICAgICAgICAgc2VhcmNoX3R5cGUgICAgICAgICAtIFRhYmxlIHR5cGUgdG8gbWF0Y2ggKHByaW1hcnkvc2Vjb25kYXJ5KQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC02NCw3ICs3Myw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV90Yl9tYXRjaF9zaWduYXR1cmUgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNpZ25hdHVyZSwKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvLApAQCAtNzYsOSArODUsOCBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJ0Yl9tYXRjaF9zaWduYXR1cmUiKTsKIAogCi0JLyoKLQkgKiBTZWFyY2ggZm9yIGEgc2lnbmF0dXJlIG1hdGNoIGFtb25nIHRoZSBrbm93biB0YWJsZSB0eXBlcwotCSAqLworCS8qIFNlYXJjaCBmb3IgYSBzaWduYXR1cmUgbWF0Y2ggYW1vbmcgdGhlIGtub3duIHRhYmxlIHR5cGVzICovCisKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX0FDUElfVEFCTEVfVFlQRVM7IGkrKykgewogCQlpZiAoIShhY3BpX2dibF90YWJsZV9kYXRhW2ldLmZsYWdzICYgc2VhcmNoX3R5cGUpKSB7CiAJCQljb250aW51ZTsKQEAgLTE2MSw2ICsxNjksNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfcmVjb2duaXplX3RhYmxlCiAgKgogICogUEFSQU1FVEVSUzogIHRhYmxlX2luZm8gICAgICAgICAgLSBSZXR1cm4gdmFsdWUgZnJvbSBhY3BpX3RiX2dldF90YWJsZV9ib2R5CisgKiAgICAgICAgICAgICAgc2VhcmNoX3R5cGUgICAgICAgICAtIFRhYmxlIHR5cGUgdG8gbWF0Y2ggKHByaW1hcnkvc2Vjb25kYXJ5KQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0yMDMsNyArMjEyLDggQEAKIAkgKiBUaGlzIGNhbiBiZSBhbnkgb25lIG9mIG1hbnkgdmFsaWQgQUNQSSB0YWJsZXMsIGl0IGp1c3QgaXNuJ3Qgb25lIG9mCiAJICogdGhlIHRhYmxlcyB0aGF0IGlzIGNvbnN1bWVkIGJ5IHRoZSBjb3JlIHN1YnN5c3RlbQogCSAqLwotCXN0YXR1cyA9IGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwgdGFibGVfaW5mbywgc2VhcmNoX3R5cGUpOworCXN0YXR1cyA9IGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwKKwkJCSB0YWJsZV9pbmZvLCBzZWFyY2hfdHlwZSk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQpAQCAtMjUzLDkgKzI2Myw4IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQkvKgotCSAqIEluc3RhbGwgdGhlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZQotCSAqLworCS8qIEluc3RhbGwgdGhlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSAqLworCiAJbGlzdF9oZWFkID0gJmFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdOwogCiAJLyoKQEAgLTMxNiw3ICszMjUsOCBAQAogCXRhYmxlX2Rlc2MtPmFtbF9zdGFydCAgICAgICAgICAgPSAodTggKikgKHRhYmxlX2Rlc2MtPnBvaW50ZXIgKyAxKSwKIAl0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoICAgICAgICAgID0gKHUzMikgKHRhYmxlX2Rlc2MtPmxlbmd0aCAtCiAJCQkgKHUzMikgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKLQl0YWJsZV9kZXNjLT50YWJsZV9pZCAgICAgICAgICAgID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCAoQUNQSV9PV05FUl9UWVBFX1RBQkxFKTsKKwl0YWJsZV9kZXNjLT50YWJsZV9pZCAgICAgICAgICAgID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCAoCisJCQkgQUNQSV9PV05FUl9UWVBFX1RBQkxFKTsKIAl0YWJsZV9kZXNjLT5sb2FkZWRfaW50b19uYW1lc3BhY2UgPSBGQUxTRTsKIAogCS8qCkBAIC0zNDksNyArMzU5LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfdGJfZGVsZXRlX2FsbF90YWJsZXMgKHZvaWQpCithY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzICgKKwl2b2lkKQogewogCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdHlwZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKaW5kZXggOWM2OTEzMi4uYjdmZmUzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCkBAIC04NCw4ICs4NCw5IEBACiAJCS8qCiAJCSAqIE9idGFpbiBhY2Nlc3MgdG8gdGhlIFJTRFAgc3RydWN0dXJlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MtPnBvaW50ZXIucGh5c2ljYWwsIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksCi0JCQkJICAodm9pZCAqKSAmcnNkcCk7CisJCXN0YXR1cyA9IGFjcGlfb3NfbWFwX21lbW9yeSAoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKKwkJCQkgc2l6ZW9mIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKSwKKwkJCQkJCSAgICh2b2lkICopICZyc2RwKTsKIAkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCQl9CkBAIC0xNTQsOSArMTU1LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV90Yl9nZXRfcnNkdF9hZGRyZXNzCiAgKgotICogUEFSQU1FVEVSUzogIE5vbmUKKyAqIFBBUkFNRVRFUlM6ICBvdXRfYWRkcmVzcyAgICAgICAgIC0gV2hlcmUgdGhlIGFkZHJlc3MgaXMgcmV0dXJuZWQKICAqCi0gKiBSRVRVUk46ICAgICAgUlNEVCBwaHlzaWNhbCBhZGRyZXNzCisgKiBSRVRVUk46ICAgICAgTm9uZSwgQWRkcmVzcwogICoKICAqIERFU0NSSVBUSU9OOiBFeHRyYWN0IHRoZSBhZGRyZXNzIG9mIHRoZSBSU0RUIG9yIFhTRFQsIGRlcGVuZGluZyBvbiB0aGUKICAqICAgICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBSU0RQCkBAIC0xODEsNyArMTgyLDggQEAKIAkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3M7CiAJfQogCWVsc2UgewotCQlvdXRfYWRkcmVzcy0+cG9pbnRlci52YWx1ZSA9IGFjcGlfZ2JsX1JTRFAtPnhzZHRfcGh5c2ljYWxfYWRkcmVzczsKKwkJb3V0X2FkZHJlc3MtPnBvaW50ZXIudmFsdWUgPQorCQkJYWNwaV9nYmxfUlNEUC0+eHNkdF9waHlzaWNhbF9hZGRyZXNzOwogCX0KIH0KIApAQCAtMjI0LDcgKzIyNiw4IEBACiAJaWYgKG5vX21hdGNoKSB7CiAJCS8qIEludmFsaWQgUlNEVCBvciBYU0RUIHNpZ25hdHVyZSAqLwogCi0JCUFDUElfUkVQT1JUX0VSUk9SICgoIkludmFsaWQgc2lnbmF0dXJlIHdoZXJlIFJTRFAgaW5kaWNhdGVzIFJTRFQvWFNEVCBzaG91bGQgYmUgbG9jYXRlZFxuIikpOworCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKAorCQkJIkludmFsaWQgc2lnbmF0dXJlIHdoZXJlIFJTRFAgaW5kaWNhdGVzIFJTRFQvWFNEVCBzaG91bGQgYmUgbG9jYXRlZFxuIikpOwogCiAJCUFDUElfRFVNUF9CVUZGRVIgKGFjcGlfZ2JsX1JTRFAsIDIwKTsKIApAQCAtMjgyLDYgKzI4NSw3IEBACiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIkNvdWxkIG5vdCBnZXQgdGhlIFJTRFQvWFNEVCwgJXNcbiIsCiAJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJfQogCkBAIC0yOTksNyArMzAzLDggQEAKIAogCS8qIEdldCB0aGUgbnVtYmVyIG9mIHRhYmxlcyBkZWZpbmVkIGluIHRoZSBSU0RUIG9yIFhTRFQgKi8KIAotCWFjcGlfZ2JsX3JzZHRfdGFibGVfY291bnQgPSBhY3BpX3RiX2dldF90YWJsZV9jb3VudCAoYWNwaV9nYmxfUlNEUCwgdGFibGVfaW5mby5wb2ludGVyKTsKKwlhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50ID0gYWNwaV90Yl9nZXRfdGFibGVfY291bnQgKGFjcGlfZ2JsX1JTRFAsCisJCQkgIHRhYmxlX2luZm8ucG9pbnRlcik7CiAKIAkvKiBDb252ZXJ0IGFuZC9vciBjb3B5IHRvIGFuIFhTRFQgc3RydWN0dXJlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ1dGlscy5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMKaW5kZXggZmVkZTU4MC4uZTY5ZDAxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMKQEAgLTQ5LDQ4ICs0OSwxNCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVEFCTEVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ0YnV0aWxzIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2hhbmRsZV90b19vYmplY3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgdGFibGVfaWQgICAgICAgICAgICAtIElkIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgc2VhcmNoaW5nCi0gKiAgICAgICAgICAgICAgdGFibGVfZGVzYyAgICAgICAgICAtIFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGluZyB0YWJsZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuCi0gKgotICogUkVUVVJOOiAgICAgIFNlYXJjaCB0aGUgdGFibGVzIHRvIGZpbmQgb25lIHdpdGggYSBtYXRjaGluZyB0YWJsZV9pZCBhbmQKLSAqICAgICAgICAgICAgICByZXR1cm4gYSBwb2ludGVyIHRvIHRoYXQgdGFibGUgZGVzY3JpcHRvci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYgQUNQSV9PQlNPTEVURV9GVU5DVElPTlMKIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2hhbmRsZV90b19vYmplY3QgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnJldHVybl90YWJsZV9kZXNjKQotewotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJ0Yl9oYW5kbGVfdG9fb2JqZWN0Iik7Ci0KLQotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX1RBQkxFX01BWDsgaSsrKSB7Ci0JCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tpXS5uZXh0OwotCQl3aGlsZSAodGFibGVfZGVzYykgewotCQkJaWYgKHRhYmxlX2Rlc2MtPnRhYmxlX2lkID09IHRhYmxlX2lkKSB7Ci0JCQkJKnJldHVybl90YWJsZV9kZXNjID0gdGFibGVfZGVzYzsKLQkJCQlyZXR1cm4gKEFFX09LKTsKLQkJCX0KLQotCQkJdGFibGVfZGVzYyA9IHRhYmxlX2Rlc2MtPm5leHQ7Ci0JCX0KLQl9Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgInRhYmxlX2lkPSVYIGRvZXMgbm90IGV4aXN0XG4iLCB0YWJsZV9pZCkpOwotCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7Ci19Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICoqdGFibGVfZGVzYyk7CisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTI4LDYgKzk0LDcgQEAKIAlpZiAoIWFjcGlfb3NfcmVhZGFibGUgKHRhYmxlX2hlYWRlciwgc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCSJDYW5ub3QgcmVhZCB0YWJsZSBoZWFkZXIgYXQgJXBcbiIsIHRhYmxlX2hlYWRlcikpOworCiAJCXJldHVybiAoQUVfQkFEX0FERFJFU1MpOwogCX0KIApAQCAtMTQxLDYgKzEwOCw3IEBACiAKIAkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJJbnZhbGlkIHRhYmxlIHNpZ25hdHVyZSBmb3VuZDogWyU0LjRzXVxuIiwKIAkJCShjaGFyICopICZzaWduYXR1cmUpKTsKKwogCQlBQ1BJX0RVTVBfQlVGRkVSICh0YWJsZV9oZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJCXJldHVybiAoQUVfQkFEX1NJR05BVFVSRSk7CiAJfQpAQCAtMTU0LDYgKzEyMiw3IEBACiAKIAkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJJbnZhbGlkIHRhYmxlIGhlYWRlciBsZW5ndGggKDB4JVgpIGZvdW5kXG4iLAogCQkJKHUzMikgdGFibGVfaGVhZGVyLT5sZW5ndGgpKTsKKwogCQlBQ1BJX0RVTVBfQlVGRkVSICh0YWJsZV9oZWFkZXIsIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJCXJldHVybiAoQUVfQkFEX0hFQURFUik7CiAJfQpAQCAtMTkzLDggKzE2MiwxMCBAQAogCS8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uICovCiAKIAlpZiAoY2hlY2tzdW0pIHsKLQkJQUNQSV9SRVBPUlRfV0FSTklORyAoKCJJbnZhbGlkIGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gKCUwMlgsIHN1bSAlMDJYIGlzIG5vdCB6ZXJvKVxuIiwKLQkJCXRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAodTMyKSB0YWJsZV9oZWFkZXItPmNoZWNrc3VtLCAodTMyKSBjaGVja3N1bSkpOworCQlBQ1BJX1JFUE9SVF9XQVJOSU5HICgoCisJCQkiSW52YWxpZCBjaGVja3N1bSBpbiB0YWJsZSBbJTQuNHNdICglMDJYLCBzdW0gJTAyWCBpcyBub3QgemVybylcbiIsCisJCQl0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwgKHUzMikgdGFibGVfaGVhZGVyLT5jaGVja3N1bSwKKwkJCSh1MzIpIGNoZWNrc3VtKSk7CiAKIAkJc3RhdHVzID0gQUVfQkFEX0NIRUNLU1VNOwogCX0KQEAgLTIwOSw3ICsxODAsNyBAQAogICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gY2hlY2tzdW0KICAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgYnVmZmVyCiAgKgotICogUkVUVVJOUyAgICAgIDggYml0IGNoZWNrc3VtIG9mIGJ1ZmZlcgorICogUkVUVVJOOiAgICAgIDggYml0IGNoZWNrc3VtIG9mIGJ1ZmZlcgogICoKICAqIERFU0NSSVBUSU9OOiBDb21wdXRlcyBhbiA4IGJpdCBjaGVja3N1bSBvZiB0aGUgYnVmZmVyKGxlbmd0aCkgYW5kIHJldHVybnMgaXQuCiAgKgpAQCAtMjM4LDMgKzIwOSw0NyBAQAogfQogCiAKKyNpZmRlZiBBQ1BJX09CU09MRVRFX0ZVTkNUSU9OUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0CisgKgorICogUEFSQU1FVEVSUzogIHRhYmxlX2lkICAgICAgICAgICAgLSBJZCBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIHNlYXJjaGluZworICogICAgICAgICAgICAgIHRhYmxlX2Rlc2MgICAgICAgICAgLSBQb2ludGVyIHRvIHJldHVybiB0aGUgbWF0Y2hpbmcgdGFibGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLgorICoKKyAqIFJFVFVSTjogICAgICBTZWFyY2ggdGhlIHRhYmxlcyB0byBmaW5kIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdGFibGVfaWQgYW5kCisgKiAgICAgICAgICAgICAgcmV0dXJuIGEgcG9pbnRlciB0byB0aGF0IHRhYmxlIGRlc2NyaXB0b3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfdGJfaGFuZGxlX3RvX29iamVjdCAoCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9pZCwKKwlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICoqcmV0dXJuX3RhYmxlX2Rlc2MpCit7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2M7CisKKworCUFDUElfRlVOQ1RJT05fTkFNRSAoInRiX2hhbmRsZV90b19vYmplY3QiKTsKKworCisJZm9yIChpID0gMDsgaSA8IEFDUElfVEFCTEVfTUFYOyBpKyspIHsKKwkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLm5leHQ7CisJCXdoaWxlICh0YWJsZV9kZXNjKSB7CisJCQlpZiAodGFibGVfZGVzYy0+dGFibGVfaWQgPT0gdGFibGVfaWQpIHsKKwkJCQkqcmV0dXJuX3RhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjOworCQkJCXJldHVybiAoQUVfT0spOworCQkJfQorCisJCQl0YWJsZV9kZXNjID0gdGFibGVfZGVzYy0+bmV4dDsKKwkJfQorCX0KKworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAidGFibGVfaWQ9JVggZG9lcyBub3QgZXhpc3RcbiIsIHRhYmxlX2lkKSk7CisJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKaW5kZXggNzcxNTA0My4uMGMwYjkwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKQEAgLTY3LDcgKzY3LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX2xvYWRfdGFibGVzICh2b2lkKQorYWNwaV9sb2FkX3RhYmxlcyAoCisJdm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgIHJzZHBfYWRkcmVzczsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKQEAgLTgyLDcgKzgzLDcgQEAKIAkJCSAgJnJzZHBfYWRkcmVzcyk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJhY3BpX2xvYWRfdGFibGVzOiBDb3VsZCBub3QgZ2V0IFJTRFAsICVzXG4iLAotCQkJCSAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCQlhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKIAkJZ290byBlcnJvcl9leGl0OwogCX0KIApAQCAtOTMsNyArOTQsNyBAQAogCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3JzZHAgKCZyc2RwX2FkZHJlc3MpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogUlNEUCBGYWlsZWQgdmFsaWRhdGlvbjogJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC0xMDIsNyArMTAzLDcgQEAKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZV9yc2R0ICgpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGxvYWQgUlNEVDogJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC0xMTAsMjAgKzExMSwyMCBAQAogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfcmVxdWlyZWRfdGFibGVzICgpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogRXJyb3IgZ2V0dGluZyByZXF1aXJlZCB0YWJsZXMgKERTRFQvRkFEVC9GQUNTKTogJXNcbiIsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJhY3BpX2xvYWRfdGFibGVzOiBFcnJvciBnZXR0aW5nIHJlcXVpcmVkIHRhYmxlcyAoRFNEVC9GQURUL0ZBQ1MpOiAlc1xuIiwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfSU5JVCwgIkFDUEkgVGFibGVzIHN1Y2Nlc3NmdWxseSBhY3F1aXJlZFxuIikpOwogCi0KIAkvKiBMb2FkIHRoZSBuYW1lc3BhY2UgZnJvbSB0aGUgdGFibGVzICovCiAKIAlzdGF0dXMgPSBhY3BpX25zX2xvYWRfbmFtZXNwYWNlICgpOwogCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJQUNQSV9SRVBPUlRfRVJST1IgKCgiYWNwaV9sb2FkX3RhYmxlczogQ291bGQgbm90IGxvYWQgbmFtZXNwYWNlOiAlc1xuIiwKLQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSkpOworCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTEzOSw3ICsxNDAsNiBAQAogCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2xvYWRfdGFibGUKQEAgLTI1MCw3ICsyNTAsNiBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCiAJLyogRmluZCBhbGwgdGFibGVzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSAqLwogCiAJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLm5leHQ7CkBAIC0zMjEsNyArMzIwLDYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQogCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGVudGlyZSB0YWJsZSAqLwogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcHRyICh0YWJsZV90eXBlLCBpbnN0YW5jZSwgJnRibF9wdHIpOwpAQCAtMzI5LDIzICszMjcsMjAgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCS8qCi0JICogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgTlVMTCBwb2ludGVyIGlmIHRoZSB0YWJsZSBpcyBub3QgbG9hZGVkCi0JICovCisJLyogVGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgTlVMTCBwb2ludGVyIGlmIHRoZSB0YWJsZSBpcyBub3QgbG9hZGVkICovCisKIAlpZiAodGJsX3B0ciA9PSBOVUxMKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfTk9UX0VYSVNUKTsKIAl9CiAKLQkvKgotCSAqIENvcHkgdGhlIGhlYWRlciB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyCi0JICovCisJLyogQ29weSB0aGUgaGVhZGVyIHRvIHRoZSBjYWxsZXIncyBidWZmZXIgKi8KKwogCUFDUElfTUVNQ1BZICgodm9pZCAqKSBvdXRfdGFibGVfaGVhZGVyLCAodm9pZCAqKSB0YmxfcHRyLAotCQkJIHNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJCXNpemVvZiAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiB9CiAKLQogI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MDQsNyArMzk5LDYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKLQogCS8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIGVudGlyZSB0YWJsZSAqLwogCiAJc3RhdHVzID0gYWNwaV90Yl9nZXRfdGFibGVfcHRyICh0YWJsZV90eXBlLCBpbnN0YW5jZSwgJnRibF9wdHIpOwpAQCAtNDIzLDkgKzQxNyw4IEBACiAJLyogR2V0IHRoZSB0YWJsZSBsZW5ndGggKi8KIAogCWlmICh0YWJsZV90eXBlID09IEFDUElfVEFCTEVfUlNEUCkgewotCQkvKgotCQkgKiAgUlNEIFBUUiBpcyB0aGUgb25seSAidGFibGUiIHdpdGhvdXQgYSBoZWFkZXIKLQkJICovCisJCS8qIFJTRCBQVFIgaXMgdGhlIG9ubHkgInRhYmxlIiB3aXRob3V0IGEgaGVhZGVyICovCisKIAkJdGFibGVfbGVuZ3RoID0gc2l6ZW9mIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKTsKIAl9CiAJZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKaW5kZXggNmU4MDcyZS4uZGMzYzNmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwpAQCAtNTAsNiArNTAsMTggQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1RBQkxFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidGJ4ZnJvb3QiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV90Yl9maW5kX3JzZHAgKAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKK3N0YXRpYyB1OCAqCithY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICgKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGFydF9hZGRyZXNzLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTU3LDcgKzY5LDggQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgU2lnbmF0dXJlICAgICAgICAgICAtIFN0cmluZyB3aXRoIEFDUEkgdGFibGUgc2lnbmF0dXJlCiAgKiAgICAgICAgICAgICAgb2VtX2lkICAgICAgICAgICAgICAtIFN0cmluZyB3aXRoIHRoZSB0YWJsZSBPRU0gSUQKLSAqICAgICAgICAgICAgICBvZW1fdGFibGVfaWQgICAgICAgIC0gU3RyaW5nIHdpdGggdGhlIE9FTSBUYWJsZSBJRC4KKyAqICAgICAgICAgICAgICBvZW1fdGFibGVfaWQgICAgICAgIC0gU3RyaW5nIHdpdGggdGhlIE9FTSBUYWJsZSBJRAorICogICAgICAgICAgICAgIHRhYmxlX3B0ciAgICAgICAgICAgLSBXaGVyZSB0aGUgdGFibGUgcG9pbnRlciBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC05OSwxNCArMTEyLDEzIEBACiAJCWlmICghYWNwaV9nYmxfRFNEVCkgewogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9OT19BQ1BJX1RBQkxFUyk7CiAJCX0KLQogCQl0YWJsZSA9IGFjcGlfZ2JsX0RTRFQ7CiAJfQogCWVsc2UgewogCQkvKiBGaW5kIHRoZSB0YWJsZSAqLwogCiAJCXN0YXR1cyA9IGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlIChzaWduYXR1cmUsIDEsCi0JCQkJICAgQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcsICZ0YWJsZSk7CisJCQkJIEFDUElfTE9HSUNBTF9BRERSRVNTSU5HLCAmdGFibGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KQEAgLTExNCwxNCArMTI2LDE5IEBACiAKIAkvKiBDaGVjayBvZW1faWQgYW5kIG9lbV90YWJsZV9pZCAqLwogCi0JaWYgKChvZW1faWRbMF0gICAgICYmIEFDUElfU1RSTkNNUCAoCi0JCQkgb2VtX2lkLCB0YWJsZS0+b2VtX2lkLCBzaXplb2YgKHRhYmxlLT5vZW1faWQpKSkgfHwKKwlpZiAoKG9lbV9pZFswXSAmJiBBQ1BJX1NUUk5DTVAgKAorCQkJICAgb2VtX2lkLCB0YWJsZS0+b2VtX2lkLAorCQkJICAgc2l6ZW9mICh0YWJsZS0+b2VtX2lkKSkpIHx8CisKIAkJKG9lbV90YWJsZV9pZFswXSAmJiBBQ1BJX1NUUk5DTVAgKAotCQkJCSAgIG9lbV90YWJsZV9pZCwgdGFibGUtPm9lbV90YWJsZV9pZCwgc2l6ZW9mICh0YWJsZS0+b2VtX3RhYmxlX2lkKSkpKSB7CisJCQkJICAgb2VtX3RhYmxlX2lkLCB0YWJsZS0+b2VtX3RhYmxlX2lkLAorCQkJCSAgIHNpemVvZiAodGFibGUtPm9lbV90YWJsZV9pZCkpKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX0FNTF9OQU1FX05PVF9GT1VORCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfVEFCTEVTLCAiRm91bmQgdGFibGUgWyU0LjRzXVxuIiwgdGFibGUtPnNpZ25hdHVyZSkpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX1RBQkxFUywgIkZvdW5kIHRhYmxlIFslNC40c11cbiIsCisJCXRhYmxlLT5zaWduYXR1cmUpKTsKKwogCSp0YWJsZV9wdHIgPSB0YWJsZTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIH0KQEAgLTE5MSw4ICsyMDgsOCBAQAogCQkvKiBNYXAgYW5kIHZhbGlkYXRlIHRoZSBSU0RQICovCiAKIAkJaWYgKChmbGFncyAmIEFDUElfTUVNT1JZX01PREUpID09IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HKSB7Ci0JCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MucG9pbnRlci5waHlzaWNhbCwgc2l6ZW9mIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKSwKLQkJCQkJICAodm9pZCAqKSAmYWNwaV9nYmxfUlNEUCk7CisJCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKGFkZHJlc3MucG9pbnRlci5waHlzaWNhbCwKKwkJCQkJIHNpemVvZiAoc3RydWN0IHJzZHBfZGVzY3JpcHRvciksICh2b2lkICopICZhY3BpX2dibF9SU0RQKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCQl9CkBAIC0yMDMsNyArMjIwLDggQEAKIAogCQkvKiBUaGUgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLwogCi0JCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIGFjcGlfZ2JsX1JTRFAsIFJTRFBfU0lHLCBzaXplb2YgKFJTRFBfU0lHKS0xKSAhPSAwKSB7CisJCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIGFjcGlfZ2JsX1JTRFAsIFJTRFBfU0lHLAorCQkJCXNpemVvZiAoUlNEUF9TSUcpLTEpICE9IDApIHsKIAkJCS8qIE5vcGUsIEJBRCBTaWduYXR1cmUgKi8KIAogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9CQURfU0lHTkFUVVJFKTsKQEAgLTMxMyw3ICszMzEsOCBAQAogCiAKIGNsZWFudXA6Ci0JYWNwaV9vc191bm1hcF9tZW1vcnkgKHJzZHRfaW5mby0+cG9pbnRlciwgKGFjcGlfc2l6ZSkgcnNkdF9pbmZvLT5wb2ludGVyLT5sZW5ndGgpOworCWFjcGlfb3NfdW5tYXBfbWVtb3J5IChyc2R0X2luZm8tPnBvaW50ZXIsCisJCShhY3BpX3NpemUpIHJzZHRfaW5mby0+cG9pbnRlci0+bGVuZ3RoKTsKIAlBQ1BJX01FTV9GUkVFIChyc2R0X2luZm8pOwogCiAJaWYgKGhlYWRlcikgewpAQCAtMzM1LDggKzM1NCw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZmluZF9yb290X3BvaW50ZXIKICAqCi0gKiBQQVJBTUVURVJTOiAgKipyc2RwX2FkZHJlc3MgICAgICAgICAgLSBXaGVyZSB0byBwbGFjZSB0aGUgUlNEUCBhZGRyZXNzCi0gKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAgICAgLSBMb2dpY2FsL1BoeXNpY2FsIGFkZHJlc3NpbmcKKyAqIFBBUkFNRVRFUlM6ICBGbGFncyAgICAgICAgICAgICAgICAgICAtIExvZ2ljYWwvUGh5c2ljYWwgYWRkcmVzc2luZworICogICAgICAgICAgICAgIHJzZHBfYWRkcmVzcyAgICAgICAgICAgIC0gV2hlcmUgdG8gcGxhY2UgdGhlIFJTRFAgYWRkcmVzcwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMsIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFJTRFAKICAqCkBAIC0zNjMsNiArMzgyLDcgQEAKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCiAJCQkiUlNEUCBzdHJ1Y3R1cmUgbm90IGZvdW5kLCAlcyBGbGFncz0lWFxuIiwKIAkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoc3RhdHVzKSwgZmxhZ3MpKTsKKwogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX0FDUElfVEFCTEVTKTsKIAl9CiAKQEAgLTM4NSw3ICs0MDUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4ICoKK3N0YXRpYyB1OCAqCiBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGFydF9hZGRyZXNzLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKQpAQCAtNDA2LDcgKzQyNiw4IEBACiAJCSBtZW1fcm92ZXIgKz0gQUNQSV9SU0RQX1NDQU5fU1RFUCkgewogCQkvKiBUaGUgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLwogCi0JCWlmIChBQ1BJX1NUUk5DTVAgKChjaGFyICopIG1lbV9yb3ZlciwgUlNEUF9TSUcsIHNpemVvZiAoUlNEUF9TSUcpLTEpICE9IDApIHsKKwkJaWYgKEFDUElfU1RSTkNNUCAoKGNoYXIgKikgbWVtX3JvdmVyLAorCQkJCVJTRFBfU0lHLCBzaXplb2YgKFJTRFBfU0lHKSAtIDEpICE9IDApIHsKIAkJCS8qIE5vIHNpZ25hdHVyZSBtYXRjaCwga2VlcCBsb29raW5nICovCiAKIAkJCWNvbnRpbnVlOwpAQCAtNDUwLDcgKzQ3MSw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGJfZmluZF9yc2RwCiAgKgotICogUEFSQU1FVEVSUzogICp0YWJsZV9pbmZvICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHRhYmxlIGluZm8gaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICB0YWJsZV9pbmZvICAgICAgICAgICAgICAtIFdoZXJlIHRoZSB0YWJsZSBpbmZvIGlzIHJldHVybmVkCiAgKiAgICAgICAgICAgICAgRmxhZ3MgICAgICAgICAgICAgICAgICAgLSBDdXJyZW50IG1lbW9yeSBtb2RlIChsb2dpY2FsIHZzLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgYWRkcmVzc2luZykKICAqCkBAIC00NjgsNyArNDg5LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2ZpbmRfcnNkcCAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKQpAQCAtNDgzLDQzICs1MDQsNDkgQEAKIAogCiAJLyoKLQkgKiBTY2FuIHN1cHBvcnRzIGVpdGhlciAxKSBMb2dpY2FsIGFkZHJlc3Npbmcgb3IgMikgUGh5c2ljYWwgYWRkcmVzc2luZworCSAqIFNjYW4gc3VwcG9ydHMgZWl0aGVyIGxvZ2ljYWwgYWRkcmVzc2luZyBvciBwaHlzaWNhbCBhZGRyZXNzaW5nCiAJICovCiAJaWYgKChmbGFncyAmIEFDUElfTUVNT1JZX01PREUpID09IEFDUElfTE9HSUNBTF9BRERSRVNTSU5HKSB7Ci0JCS8qCi0JCSAqIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFQkRBCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIEFDUElfRUJEQV9QVFJfTE9DQVRJT04sCi0JCQkJICBBQ1BJX0VCREFfUFRSX0xFTkdUSCwKLQkJCQkgICh2b2lkICopICZ0YWJsZV9wdHIpOworCQkvKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRXh0ZW5kZWQgQklPUyBEYXRhIEFyZWEgKEVCREEpICovCisKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgKKwkJCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgQUNQSV9FQkRBX1BUUl9MT0NBVElPTiwKKwkJCQkgQUNQSV9FQkRBX1BUUl9MRU5HVEgsICh2b2lkICopICZ0YWJsZV9wdHIpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKIAkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKIAkJCQlBQ1BJX0VCREFfUFRSX0xPQ0FUSU9OLCBBQ1BJX0VCREFfUFRSX0xFTkdUSCkpOworCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCX0KIAogCQlBQ1BJX01PVkVfMTZfVE9fMzIgKCZwaHlzaWNhbF9hZGRyZXNzLCB0YWJsZV9wdHIpOwotCQlwaHlzaWNhbF9hZGRyZXNzIDw8PSA0OyAgICAgICAgICAgICAgICAgLyogQ29udmVydCBzZWdtZW50IHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCQkvKiBDb252ZXJ0IHNlZ21lbnQgcGFydCB0byBwaHlzaWNhbCBhZGRyZXNzICovCisKKwkJcGh5c2ljYWxfYWRkcmVzcyA8PD0gNDsKIAkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHRhYmxlX3B0ciwgQUNQSV9FQkRBX1BUUl9MRU5HVEgpOwogCiAJCS8qIEVCREEgcHJlc2VudD8gKi8KIAogCQlpZiAocGh5c2ljYWxfYWRkcmVzcyA+IDB4NDAwKSB7CiAJCQkvKgotCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYSBtaW5pbXVtIG9mIDFfayBsZW5ndGgpCisJCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEYSBpcyByZXF1aXJlZCB0byBiZSBhCisJCQkgKiAgICAgbWluaW11bSBvZiAxX2sgbGVuZ3RoKQogCQkJICovCi0JCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkgKChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3MsCi0JCQkJCSAgQUNQSV9FQkRBX1dJTkRPV19TSVpFLAotCQkJCQkgICh2b2lkICopICZ0YWJsZV9wdHIpOworCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgKKwkJCQkJIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3MsCisJCQkJCSBBQ1BJX0VCREFfV0lORE9XX1NJWkUsICh2b2lkICopICZ0YWJsZV9wdHIpOwogCQkJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCQkiQ291bGQgbm90IG1hcCBtZW1vcnkgYXQgJTguOFggZm9yIGxlbmd0aCAlWFxuIiwKIAkJCQkJcGh5c2ljYWxfYWRkcmVzcywgQUNQSV9FQkRBX1dJTkRPV19TSVpFKSk7CisKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CiAJCQl9CiAKLQkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKHRhYmxlX3B0ciwgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKKwkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKHRhYmxlX3B0ciwKKwkJCQkJICBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwogCQkJYWNwaV9vc191bm1hcF9tZW1vcnkgKHRhYmxlX3B0ciwgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKIAogCQkJaWYgKG1lbV9yb3ZlcikgewpAQCAtNTI3LDcgKzU1NCw4IEBACiAKIAkJCQlwaHlzaWNhbF9hZGRyZXNzICs9IEFDUElfUFRSX0RJRkYgKG1lbV9yb3ZlciwgdGFibGVfcHRyKTsKIAotCQkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPSAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzOworCQkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPQorCQkJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzOwogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCQkJfQogCQl9CkBAIC01MzUsMTMgKzU2MywxNSBAQAogCQkvKgogCQkgKiAyKSBTZWFyY2ggdXBwZXIgbWVtb3J5OiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gRTAwMDBoLUZGRkZGaAogCQkgKi8KLQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UsCi0JCQkJICBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUsCi0JCQkJICAodm9pZCAqKSAmdGFibGVfcHRyKTsKKwkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5ICgKKwkJCQkgKGFjcGlfcGh5c2ljYWxfYWRkcmVzcykgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFLAorCQkJCSBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUsICh2b2lkICopICZ0YWJsZV9wdHIpOworCiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAogCQkJCSJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCBmb3IgbGVuZ3RoICVYXG4iLAogCQkJCUFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSwgQUNQSV9ISV9SU0RQX1dJTkRPV19TSVpFKSk7CisKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyAoc3RhdHVzKTsKIAkJfQogCkBAIC01NTEsOSArNTgxLDExIEBACiAJCWlmIChtZW1fcm92ZXIpIHsKIAkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCQkJcGh5c2ljYWxfYWRkcmVzcyA9IEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSArIEFDUElfUFRSX0RJRkYgKG1lbV9yb3ZlciwgdGFibGVfcHRyKTsKKwkJCXBoeXNpY2FsX2FkZHJlc3MgPQorCQkJCUFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSArIEFDUElfUFRSX0RJRkYgKG1lbV9yb3ZlciwgdGFibGVfcHRyKTsKIAotCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CisJCQl0YWJsZV9pbmZvLT5waHlzaWNhbF9hZGRyZXNzID0KKwkJCQkoYWNwaV9waHlzaWNhbF9hZGRyZXNzKSBwaHlzaWNhbF9hZGRyZXNzOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTIChBRV9PSyk7CiAJCX0KIAl9CkBAIC01NjIsOSArNTk0LDggQEAKIAkgKiBQaHlzaWNhbCBhZGRyZXNzaW5nCiAJICovCiAJZWxzZSB7Ci0JCS8qCi0JCSAqIDFhKSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBFQkRBCi0JCSAqLworCQkvKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRUJEQSAqLworCiAJCUFDUElfTU9WRV8xNl9UT18zMiAoJnBoeXNpY2FsX2FkZHJlc3MsIEFDUElfRUJEQV9QVFJfTE9DQVRJT04pOwogCQlwaHlzaWNhbF9hZGRyZXNzIDw8PSA0OyAgICAgLyogQ29udmVydCBzZWdtZW50IHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8KIApAQCAtNTcyLDkgKzYwMywxMSBAQAogCiAJCWlmIChwaHlzaWNhbF9hZGRyZXNzID4gMHg0MDApIHsKIAkJCS8qCi0JCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEYSBpcyByZXF1aXJlZCB0byBiZSBhIG1pbmltdW0gb2YgMV9rIGxlbmd0aCkKKwkJCSAqIDFiKSBTZWFyY2ggRUJEQSBwYXJhZ3JhcGhzIChFQkRhIGlzIHJlcXVpcmVkIHRvIGJlIGEgbWluaW11bSBvZgorCQkJICogICAgIDFfayBsZW5ndGgpCiAJCQkgKi8KLQkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKEFDUElfUEhZU0FERFJfVE9fUFRSIChwaHlzaWNhbF9hZGRyZXNzKSwKKwkJCW1lbV9yb3ZlciA9IGFjcGlfdGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHAgKAorCQkJCQkgIEFDUElfUEhZU0FERFJfVE9fUFRSIChwaHlzaWNhbF9hZGRyZXNzKSwKIAkJCQkJICBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwogCQkJaWYgKG1lbV9yb3ZlcikgewogCQkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KQEAgLTU4NCwxMCArNjE3LDEwIEBACiAJCQl9CiAJCX0KIAotCQkvKgotCQkgKiAyKSBTZWFyY2ggdXBwZXIgbWVtb3J5OiAxNi1ieXRlIGJvdW5kYXJpZXMgaW4gRTAwMDBoLUZGRkZGaAotCQkgKi8KLQkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoQUNQSV9QSFlTQUREUl9UT19QVFIgKEFDUElfSElfUlNEUF9XSU5ET1dfQkFTRSksCisJCS8qIDIpIFNlYXJjaCB1cHBlciBtZW1vcnk6IDE2LWJ5dGUgYm91bmRhcmllcyBpbiBFMDAwMGgtRkZGRkZoICovCisKKwkJbWVtX3JvdmVyID0gYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCisJCQkJICBBQ1BJX1BIWVNBRERSX1RPX1BUUiAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFKSwKIAkJCQkgIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CiAJCWlmIChtZW1fcm92ZXIpIHsKIAkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYwppbmRleCBjODQ5OTdjLi43M2IxZDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCkBAIC0yNjMsNiArMjYzLDkgQEAKIAkgKiBkZXN0aW5hdGlvbiBzbyB0aGF0IHNzY2FuZiBjYW4gYmUgdXNlZCBvbiBpdCBzYWZlbHkuCiAJICovCiAJdG1wX2J1ZmZlciA9IGttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZighdG1wX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAoY29weV9mcm9tX3VzZXIodG1wX2J1ZmZlciwgYnVmZmVyLCBjb3VudCkpIHsKIAkJcmVzdWx0ID0gLUVGQVVMVDsKIAl9CkBAIC01MjksNiArNTMyLDExIEBACiAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpeworCQlwcmludGsoTVlfSU5GTyAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CQorCX0KIAkvKiBzaW1wbGUgZGV2aWNlIGRldGVjdGlvbjogbG9vayBmb3IgSENJIG1ldGhvZCAqLwogCWlmIChpc192YWxpZF9hY3BpX3BhdGgoTUVUSE9EX0hDSV8xKSkKIAkJbWV0aG9kX2hjaSA9IE1FVEhPRF9IQ0lfMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKaW5kZXggMzMxMzQzOS4uYzRlN2Y5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGFsbG9jLmMKQEAgLTQ3LDggKzQ3LDM1IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9VVElMSVRJRVMKIAkgQUNQSV9NT0RVTEVfTkFNRSAgICAoInV0YWxsb2MiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZmRlZglBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUworc3RhdGljIHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqCithY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbiAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jYXRpb24pOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbiAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAorCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCisJc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWRkcmVzcywKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyNlbmRpZgkvKiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVsZWFzZV90b19jYWNoZQogICoKQEAgLTk4LDcgKzEyNSw4IEBACiAKIAkJLyogUHV0IHRoZSBvYmplY3QgYXQgdGhlIGhlYWQgb2YgdGhlIGNhY2hlIGxpc3QgKi8KIAotCQkqIChBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLCAmKCgoY2hhciAqKSBvYmplY3QpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKSA9IGNhY2hlX2luZm8tPmxpc3RfaGVhZDsKKwkJKiAoQUNQSV9DQVNUX0lORElSRUNUX1BUUiAoY2hhciwKKwkJCSYoKChjaGFyICopIG9iamVjdClbY2FjaGVfaW5mby0+bGlua19vZmZzZXRdKSkpID0gY2FjaGVfaW5mby0+bGlzdF9oZWFkOwogCQljYWNoZV9pbmZvLT5saXN0X2hlYWQgPSBvYmplY3Q7CiAJCWNhY2hlX2luZm8tPmNhY2hlX2RlcHRoKys7CiAKQEAgLTExNSw3ICsxNDMsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWNxdWlyZV9mcm9tX2NhY2hlCiAgKgpAQCAtMTU2LDcgKzE4NCw4IEBACiAJCS8qIFRoZXJlIGlzIGFuIG9iamVjdCBhdmFpbGFibGUsIHVzZSBpdCAqLwogCiAJCW9iamVjdCA9IGNhY2hlX2luZm8tPmxpc3RfaGVhZDsKLQkJY2FjaGVfaW5mby0+bGlzdF9oZWFkID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLCAmKCgoY2hhciAqKSBvYmplY3QpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKTsKKwkJY2FjaGVfaW5mby0+bGlzdF9oZWFkID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLAorCQkJCSAmKCgoY2hhciAqKSBvYmplY3QpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKTsKIAogCQlBQ1BJX01FTV9UUkFDS0lORyAoY2FjaGVfaW5mby0+Y2FjaGVfaGl0cysrKTsKIAkJY2FjaGVfaW5mby0+Y2FjaGVfZGVwdGgtLTsKQEAgLTIwMSw3ICsyMzAsNyBAQAogCiAKICNpZmRlZiBBQ1BJX0VOQUJMRV9PQkpFQ1RfQ0FDSEUKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfY2FjaGUKICAqCkBAIC0yMjgsNyArMjU3LDggQEAKIAl3aGlsZSAoY2FjaGVfaW5mby0+bGlzdF9oZWFkKSB7CiAJCS8qIERlbGV0ZSBvbmUgY2FjaGVkIHN0YXRlIG9iamVjdCAqLwogCi0JCW5leHQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIgKGNoYXIsICYoKChjaGFyICopIGNhY2hlX2luZm8tPmxpc3RfaGVhZClbY2FjaGVfaW5mby0+bGlua19vZmZzZXRdKSkpOworCQluZXh0ID0gKihBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSIChjaGFyLAorCQkJCSAmKCgoY2hhciAqKSBjYWNoZV9pbmZvLT5saXN0X2hlYWQpW2NhY2hlX2luZm8tPmxpbmtfb2Zmc2V0XSkpKTsKIAkJQUNQSV9NRU1fRlJFRSAoY2FjaGVfaW5mby0+bGlzdF9oZWFkKTsKIAogCQljYWNoZV9pbmZvLT5saXN0X2hlYWQgPSBuZXh0OwpAQCAtNDk3LDggKzUyNyw4IEBACiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CiAKIAotCWFsbG9jYXRpb24gPSBhY3BpX3V0X2FsbG9jYXRlIChzaXplICsgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSwgY29tcG9uZW50LAotCQkJICBtb2R1bGUsIGxpbmUpOworCWFsbG9jYXRpb24gPSBhY3BpX3V0X2FsbG9jYXRlIChzaXplICsgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSwKKwkJCSAgY29tcG9uZW50LCBtb2R1bGUsIGxpbmUpOwogCWlmICghYWxsb2NhdGlvbikgewogCQlyZXR1cm4gKE5VTEwpOwogCX0KQEAgLTU0Myw4ICs1NzMsOCBAQAogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogCiAKLQlhbGxvY2F0aW9uID0gYWNwaV91dF9jYWxsb2NhdGUgKHNpemUgKyBzaXplb2YgKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIpLCBjb21wb25lbnQsCi0JCQkgIG1vZHVsZSwgbGluZSk7CisJYWxsb2NhdGlvbiA9IGFjcGlfdXRfY2FsbG9jYXRlIChzaXplICsgc2l6ZW9mIChzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSwKKwkJCSAgY29tcG9uZW50LCBtb2R1bGUsIGxpbmUpOwogCWlmICghYWxsb2NhdGlvbikgewogCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLwogCkBAIC02MzcsNyArNjY3LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKgorc3RhdGljIHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqCiBhY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbiAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jYXRpb24pCkBAIC02ODYsNyArNzE2LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKIAlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICphbGxvY2F0aW9uLApAQCAtNzIxLDEwICs3NTEsMTIgQEAKIAogCWVsZW1lbnQgPSBhY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbiAobGlzdF9pZCwgYWxsb2NhdGlvbik7CiAJaWYgKGVsZW1lbnQpIHsKLQkJQUNQSV9SRVBPUlRfRVJST1IgKCgidXRfdHJhY2tfYWxsb2NhdGlvbjogQWxsb2NhdGlvbiBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdCEgKCVwKVxuIiwKKwkJQUNQSV9SRVBPUlRfRVJST1IgKCgKKwkJCSJ1dF90cmFja19hbGxvY2F0aW9uOiBBbGxvY2F0aW9uIGFscmVhZHkgcHJlc2VudCBpbiBsaXN0ISAoJXApXG4iLAogCQkJYWxsb2NhdGlvbikpOwogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiRWxlbWVudCAlcCBBZGRyZXNzICVwXG4iLCBlbGVtZW50LCBhbGxvY2F0aW9uKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiRWxlbWVudCAlcCBBZGRyZXNzICVwXG4iLAorCQkJZWxlbWVudCwgYWxsb2NhdGlvbikpOwogCiAJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCX0KQEAgLTc3Myw3ICs4MDUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24gKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9pZCwKIAlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICphbGxvY2F0aW9uLApAQCAtNzk3LDcgKzgyOSw3IEBACiAJCS8qIE5vIGFsbG9jYXRpb25zISAqLwogCiAJCV9BQ1BJX1JFUE9SVF9FUlJPUiAobW9kdWxlLCBsaW5lLCBjb21wb25lbnQsCi0JCQkJKCJ1dF9yZW1vdmVfYWxsb2NhdGlvbjogRW1wdHkgYWxsb2NhdGlvbiBsaXN0LCBub3RoaW5nIHRvIGZyZWUhXG4iKSk7CisJCQkoInV0X3JlbW92ZV9hbGxvY2F0aW9uOiBFbXB0eSBhbGxvY2F0aW9uIGxpc3QsIG5vdGhpbmcgdG8gZnJlZSFcbiIpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX09LKTsKIAl9CkBAIC04MjQsNyArODU2LDggQEAKIAogCUFDUElfTUVNU0VUICgmYWxsb2NhdGlvbi0+dXNlcl9zcGFjZSwgMHhFQSwgYWxsb2NhdGlvbi0+c2l6ZSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkZyZWVpbmcgc2l6ZSAwJVhcbiIsIGFsbG9jYXRpb24tPnNpemUpKTsKKwlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIkZyZWVpbmcgc2l6ZSAwJVhcbiIsCisJCWFsbG9jYXRpb24tPnNpemUpKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleCAoQUNQSV9NVFhfTUVNT1JZKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMgKHN0YXR1cyk7CkBAIC04NDIsNiArODc1LDcgQEAKICAqIERFU0NSSVBUSU9OOiBQcmludCBzb21lIGluZm8gYWJvdXQgdGhlIG91dHN0YW5kaW5nIGFsbG9jYXRpb25zLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogdm9pZAogYWNwaV91dF9kdW1wX2FsbG9jYXRpb25faW5mbyAoCkBAIC04ODQsNyArOTE4LDggQEAKIAlBQ1BJX0RFQlVHX1BSSU5UIChUUkFDRV9BTExPQ0FUSU9OUyB8IFRSQUNFX1RBQkxFUywKIAkJCSAgKCIlMzBzOiAlNGQgKCUzZCBLYilcbiIsICJNYXggTm9kZXMiLAogCQkJICBhY3BpX2dibF9tYXhfY29uY3VycmVudF9ub2RlX2NvdW50LAotCQkJICBST1VORF9VUF9UT18xSyAoKGFjcGlfZ2JsX21heF9jb25jdXJyZW50X25vZGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKSkpKSk7CisJCQkgIFJPVU5EX1VQX1RPXzFLICgoYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudCAqCisJCQkJCSBzaXplb2YgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKSkpKSk7CiAqLwogCXJldHVybl9WT0lEOwogfQpAQCAtOTMzLDI2ICs5NjgsMjYgQEAKIAkJCWRlc2NyaXB0b3IgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX2Rlc2NyaXB0b3IsICZlbGVtZW50LT51c2VyX3NwYWNlKTsKIAkJCWlmIChkZXNjcmlwdG9yLT5kZXNjcmlwdG9yX2lkICE9IEFDUElfREVTQ19UWVBFX0NBQ0hFRCkgewogCQkJCWFjcGlfb3NfcHJpbnRmICgiJXAgTGVuICUwNFggJTkuOXMtJWQgWyVzXSAiLAotCQkJCQkJIGRlc2NyaXB0b3IsIGVsZW1lbnQtPnNpemUsIGVsZW1lbnQtPm1vZHVsZSwKLQkJCQkJCSBlbGVtZW50LT5saW5lLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGRlc2NyaXB0b3IpKTsKKwkJCQkJZGVzY3JpcHRvciwgZWxlbWVudC0+c2l6ZSwgZWxlbWVudC0+bW9kdWxlLAorCQkJCQllbGVtZW50LT5saW5lLCBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUgKGRlc2NyaXB0b3IpKTsKIAogCQkJCS8qIE1vc3Qgb2YgdGhlIGVsZW1lbnRzIHdpbGwgYmUgT3BlcmFuZCBvYmplY3RzLiAqLwogCiAJCQkJc3dpdGNoIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKGRlc2NyaXB0b3IpKSB7CiAJCQkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgogCQkJCQlhY3BpX29zX3ByaW50ZiAoIiUxMi4xMnMgUiVoZCIsCi0JCQkJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lIChkZXNjcmlwdG9yLT5vYmplY3QuY29tbW9uLnR5cGUpLAotCQkJCQkJCWRlc2NyaXB0b3ItPm9iamVjdC5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKKwkJCQkJCWFjcGlfdXRfZ2V0X3R5cGVfbmFtZSAoZGVzY3JpcHRvci0+b2JqZWN0LmNvbW1vbi50eXBlKSwKKwkJCQkJCWRlc2NyaXB0b3ItPm9iamVjdC5jb21tb24ucmVmZXJlbmNlX2NvdW50KTsKIAkJCQkJYnJlYWs7CiAKIAkJCQljYXNlIEFDUElfREVTQ19UWVBFX1BBUlNFUjoKIAkJCQkJYWNwaV9vc19wcmludGYgKCJhbWxfb3Bjb2RlICUwNGhYIiwKLQkJCQkJCQlkZXNjcmlwdG9yLT5vcC5hc2wuYW1sX29wY29kZSk7CisJCQkJCQlkZXNjcmlwdG9yLT5vcC5hc2wuYW1sX29wY29kZSk7CiAJCQkJCWJyZWFrOwogCiAJCQkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKIAkJCQkJYWNwaV9vc19wcmludGYgKCIlNC40cyIsCi0JCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lICgmZGVzY3JpcHRvci0+bm9kZSkpOworCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lICgmZGVzY3JpcHRvci0+bm9kZSkpOwogCQkJCQlicmVhazsKIAogCQkJCWRlZmF1bHQ6CkBAIC05ODMsNiArMTAxOCw1IEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLQogI2VuZGlmICAvKiAjaWZkZWYgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKaW5kZXggMGZjZDk4Yi4uMTFlODg0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCkBAIC00OSwyMSArNDksNjkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRjb3B5IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKKwl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICpleHRlcm5hbF9vYmplY3QsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YV9zcGFjZSwKKwlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJfc3BhY2VfdXNlZCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2llbGVtZW50ICgKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKnNwYWNlX3VzZWQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUoCisJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqdXNlcl9vYmosCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmopOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0ICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCAoCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAorCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaiwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NvcHlfaXNpbXBsZV90b19lc2ltcGxlCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9vYmplY3QgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIGV4YW1pbmluZwotICogICAgICAgICAgICAgICpCdWZmZXIgICAgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCi0gKiAgICAgICAgICAgICAgKnNwYWNlX3VzZWQgICAgICAgICAtIFdoZXJlIHRoZSBkYXRhIGxlbmd0aCBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBTb3VyY2Ugb2JqZWN0IHRvIGJlIGNvcGllZAorICogICAgICAgICAgICAgIGV4dGVybmFsX29iamVjdCAgICAgLSBXaGVyZSB0byByZXR1cm4gdGhlIGNvcGllZCBvYmplY3QKKyAqICAgICAgICAgICAgICBkYXRhX3NwYWNlICAgICAgICAgIC0gV2hlcmUgb2JqZWN0IGRhdGEgaXMgcmV0dXJuZWQgKHN1Y2ggYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGFuZCBzdHJpbmcgZGF0YSkKKyAqICAgICAgICAgICAgICBidWZmZXJfc3BhY2VfdXNlZCAgIC0gTGVuZ3RoIG9mIGRhdGFfc3BhY2UgdGhhdCB3YXMgdXNlZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcGxhY2UgYSBzaW1wbGUgb2JqZWN0IGluIGEgdXNlcgotICogICAgICAgICAgICAgIGJ1ZmZlci4KKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBjb3B5IGEgc2ltcGxlIGludGVybmFsIG9iamVjdCB0bworICogICAgICAgICAgICAgIGFuIGV4dGVybmFsIG9iamVjdC4KICAqCi0gKiAgICAgICAgICAgICAgVGhlIGJ1ZmZlciBpcyBhc3N1bWVkIHRvIGhhdmUgc3VmZmljaWVudCBzcGFjZSBmb3IgdGhlIG9iamVjdC4KKyAqICAgICAgICAgICAgICBUaGUgZGF0YV9zcGFjZSBidWZmZXIgaXMgYXNzdW1lZCB0byBoYXZlIHN1ZmZpY2llbnQgc3BhY2UgZm9yCisgKiAgICAgICAgICAgICAgdGhlIG9iamVjdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0xMDcsMTAgKzE1NSwxMiBAQAogCiAJCWV4dGVybmFsX29iamVjdC0+c3RyaW5nLnBvaW50ZXIgPSAoY2hhciAqKSBkYXRhX3NwYWNlOwogCQlleHRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggPSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGg7Ci0JCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKChhY3BpX3NpemUpIGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCArIDEpOworCQkqYnVmZmVyX3NwYWNlX3VzZWQgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKKwkJCQkgICAoYWNwaV9zaXplKSBpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5sZW5ndGggKyAxKTsKIAotCQlBQ1BJX01FTUNQWSAoKHZvaWQgKikgZGF0YV9zcGFjZSwgKHZvaWQgKikgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKLQkJCQkgKGFjcGlfc2l6ZSkgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcubGVuZ3RoICsgMSk7CisJCUFDUElfTUVNQ1BZICgodm9pZCAqKSBkYXRhX3NwYWNlLAorCQkJKHZvaWQgKikgaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciwKKwkJCShhY3BpX3NpemUpIGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCArIDEpOwogCQlicmVhazsKIAogCkBAIC0xMTgsMTAgKzE2OCwxMiBAQAogCiAJCWV4dGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIgPSBkYXRhX3NwYWNlOwogCQlleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGggPSBpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGg7Ci0JCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCk7CisJCSpidWZmZXJfc3BhY2VfdXNlZCA9IEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAorCQkJCSAgIGludGVybmFsX29iamVjdC0+c3RyaW5nLmxlbmd0aCk7CiAKLQkJQUNQSV9NRU1DUFkgKCh2b2lkICopIGRhdGFfc3BhY2UsICh2b2lkICopIGludGVybmFsX29iamVjdC0+YnVmZmVyLnBvaW50ZXIsCi0JCQkJIGludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CisJCUFDUElfTUVNQ1BZICgodm9pZCAqKSBkYXRhX3NwYWNlLAorCQkJKHZvaWQgKikgaW50ZXJuYWxfb2JqZWN0LT5idWZmZXIucG9pbnRlciwKKwkJCWludGVybmFsX29iamVjdC0+YnVmZmVyLmxlbmd0aCk7CiAJCWJyZWFrOwogCiAKQEAgLTE5NCw3ICsyNDYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9pZWxlbWVudF90b19lZWxlbWVudCAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LApAQCAtMjEzLDcgKzI2NSw3IEBACiAKIAl0aGlzX2luZGV4ICAgPSBzdGF0ZS0+cGtnLmluZGV4OwogCXRhcmdldF9vYmplY3QgPSAodW5pb24gYWNwaV9vYmplY3QgKikKLQkJCSAgJigodW5pb24gYWNwaV9vYmplY3QgKikoc3RhdGUtPnBrZy5kZXN0X29iamVjdCkpLT5wYWNrYWdlLmVsZW1lbnRzW3RoaXNfaW5kZXhdOworCQkmKCh1bmlvbiBhY3BpX29iamVjdCAqKShzdGF0ZS0+cGtnLmRlc3Rfb2JqZWN0KSktPnBhY2thZ2UuZWxlbWVudHNbdGhpc19pbmRleF07CiAKIAlzd2l0Y2ggKG9iamVjdF90eXBlKSB7CiAJY2FzZSBBQ1BJX0NPUFlfVFlQRV9TSU1QTEU6CkBAIC0yMzYsNyArMjg4LDggQEAKIAkJICovCiAJCXRhcmdldF9vYmplY3QtPnR5cGUgICAgICAgICAgICAgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKIAkJdGFyZ2V0X29iamVjdC0+cGFja2FnZS5jb3VudCAgICA9IHNvdXJjZV9vYmplY3QtPnBhY2thZ2UuY291bnQ7Ci0JCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX0NBU1RfUFRSICh1bmlvbiBhY3BpX29iamVjdCwgaW5mby0+ZnJlZV9zcGFjZSk7CisJCXRhcmdldF9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHMgPQorCQkJQUNQSV9DQVNUX1BUUiAodW5pb24gYWNwaV9vYmplY3QsIGluZm8tPmZyZWVfc3BhY2UpOwogCiAJCS8qCiAJCSAqIFBhc3MgdGhlIG5ldyBwYWNrYWdlIG9iamVjdCBiYWNrIHRvIHRoZSBwYWNrYWdlIHdhbGsgcm91dGluZQpAQCAtMjQ4LDcgKzMwMSw4IEBACiAJCSAqIHVwZGF0ZSB0aGUgYnVmZmVyIGxlbmd0aCBjb3VudGVyCiAJCSAqLwogCQlvYmplY3Rfc3BhY2UgPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKLQkJCQkgICAoYWNwaV9zaXplKSB0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICogc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOworCQkJCSAgIChhY3BpX3NpemUpIHRhcmdldF9vYmplY3QtPnBhY2thZ2UuY291bnQgKgorCQkJCSAgIHNpemVvZiAodW5pb24gYWNwaV9vYmplY3QpKTsKIAkJYnJlYWs7CiAKIApAQCAtMjY2LDkgKzMyMCw5IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pcGFja2FnZV90b19lcGFja2FnZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqaW50ZXJuYWxfb2JqZWN0ICAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHdlIGFyZSByZXR1cm5pbmcKLSAqICAgICAgICAgICAgICAqQnVmZmVyICAgICAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBpcyByZXR1cm5lZAotICogICAgICAgICAgICAgICpzcGFjZV91c2VkICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGxlbmd0aCBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIHJldHVybmluZworICogICAgICAgICAgICAgIEJ1ZmZlciAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgb2JqZWN0IGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgc3BhY2VfdXNlZCAgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgbGVuZ3RoIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTMwNCwxMyArMzU4LDE1IEBACiAJICogRnJlZSBzcGFjZSBiZWdpbnMgcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IHBhY2thZ2UKIAkgKi8KIAlpbmZvLmxlbmd0aCAgICAgID0gQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOwotCWluZm8uZnJlZV9zcGFjZSAgPSBidWZmZXIgKyBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChzaXplb2YgKHVuaW9uIGFjcGlfb2JqZWN0KSk7CisJaW5mby5mcmVlX3NwYWNlICA9IGJ1ZmZlciArIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQgKAorCQkJICAgc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpOwogCWluZm8ub2JqZWN0X3NwYWNlID0gMDsKIAlpbmZvLm51bV9wYWNrYWdlcyA9IDE7CiAKIAlleHRlcm5hbF9vYmplY3QtPnR5cGUgICAgICAgICAgICA9IEFDUElfR0VUX09CSkVDVF9UWVBFIChpbnRlcm5hbF9vYmplY3QpOwogCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5jb3VudCAgID0gaW50ZXJuYWxfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwotCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LCBpbmZvLmZyZWVfc3BhY2UpOworCWV4dGVybmFsX29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQ0FTVF9QVFIgKHVuaW9uIGFjcGlfb2JqZWN0LAorCQkJICBpbmZvLmZyZWVfc3BhY2UpOwogCiAJLyoKIAkgKiBMZWF2ZSByb29tIGZvciBhbiBhcnJheSBvZiBBQ1BJX09CSkVDVFMgaW4gdGhlIGJ1ZmZlcgpAQCAtMzMzLDggKzM4OSw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QKICAqCi0gKiBQQVJBTUVURVJTOiAgKmludGVybmFsX29iamVjdCAgICAtIFRoZSBpbnRlcm5hbCBvYmplY3QgdG8gYmUgY29udmVydGVkCi0gKiAgICAgICAgICAgICAgKmJ1ZmZlcl9wdHIgICAgICAgICAtIFdoZXJlIHRoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gVGhlIGludGVybmFsIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQKKyAqICAgICAgICAgICAgICBidWZmZXJfcHRyICAgICAgICAgIC0gV2hlcmUgdGhlIG9iamVjdCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zNjcsMTAgKzQyMywxMCBAQAogCQkgKiBCdWlsZCBhIHNpbXBsZSBvYmplY3QgKG5vIG5lc3RlZCBvYmplY3RzKQogCQkgKi8KIAkJc3RhdHVzID0gYWNwaV91dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSAoaW50ZXJuYWxfb2JqZWN0LAotCQkJCSAgKHVuaW9uIGFjcGlfb2JqZWN0ICopIHJldF9idWZmZXItPnBvaW50ZXIsCi0JCQkJICAoKHU4ICopIHJldF9idWZmZXItPnBvaW50ZXIgKwotCQkJCSAgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpKSwKLQkJCQkgICZyZXRfYnVmZmVyLT5sZW5ndGgpOworCQkJCSAodW5pb24gYWNwaV9vYmplY3QgKikgcmV0X2J1ZmZlci0+cG9pbnRlciwKKwkJCQkgKCh1OCAqKSByZXRfYnVmZmVyLT5wb2ludGVyICsKKwkJCQkgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRCAoc2l6ZW9mICh1bmlvbiBhY3BpX29iamVjdCkpKSwKKwkJCQkgJnJldF9idWZmZXItPmxlbmd0aCk7CiAJCS8qCiAJCSAqIGJ1aWxkIHNpbXBsZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvYmplY3Qgc2l6ZSBpbiB0aGUgbGVuZ3RoCiAJCSAqIHNvIHdlIGFkZCBpdCBpbiBoZXJlCkBAIC0zODYsOCArNDQyLDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jb3B5X2VzaW1wbGVfdG9faXNpbXBsZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqZXh0ZXJuYWxfb2JqZWN0ICAgLSBUaGUgZXh0ZXJuYWwgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogICAgICAgICAgICAgICppbnRlcm5hbF9vYmplY3QgICAtIFdoZXJlIHRoZSBpbnRlcm5hbCBvYmplY3QgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBleHRlcm5hbF9vYmplY3QgICAgIC0gVGhlIGV4dGVybmFsIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQKKyAqICAgICAgICAgICAgICByZXRfaW50ZXJuYWxfb2JqZWN0IC0gV2hlcmUgdGhlIGludGVybmFsIG9iamVjdCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC0zOTgsNyArNDU0LDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlICgKIAl1bmlvbiBhY3BpX29iamVjdCAgICAgICAgICAgICAgICpleHRlcm5hbF9vYmplY3QsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldF9pbnRlcm5hbF9vYmplY3QpCkBAIC00MTcsNyArNDczLDggQEAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVI6CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKIAotCQlpbnRlcm5hbF9vYmplY3QgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QgKCh1OCkgZXh0ZXJuYWxfb2JqZWN0LT50eXBlKTsKKwkJaW50ZXJuYWxfb2JqZWN0ID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0ICgKKwkJCQkgICAodTgpIGV4dGVybmFsX29iamVjdC0+dHlwZSk7CiAJCWlmICghaW50ZXJuYWxfb2JqZWN0KSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMgKEFFX05PX01FTU9SWSk7CiAJCX0KQEAgLTQ4Niw3ICs1NDMsNiBAQAogCiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9JTVBMRU1FTlRBVElPTgotCiAvKiBDb2RlIHRvIGNvbnZlcnQgcGFja2FnZXMgdGhhdCBhcmUgcGFyYW1ldGVycyB0byBjb250cm9sIG1ldGhvZHMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxNCw3ICs2NzAsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MpCkBAIC03MjQsNyArNzgwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cworc3RhdGljIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKQEAgLTgzNyw3ICs4OTMsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKaW5kZXggOTg1YzVkMC4uNzk0YzdkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKQEAgLTU2LDcgKzU2LDcgQEAKIHN0YXRpYyBjaGFyICAgICAqYWNwaV9nYmxfZm5fZXhpdF9zdHIgPSAiLS0tLUV4aXQtIjsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UKICAqCkBAIC02NCw5ICs2NCw5IEBACiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCi0gKiBERVNDUklQVElPTjogU2F2ZSB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyCisgKiBERVNDUklQVElPTjogU2F2ZSB0aGUgY3VycmVudCBDUFUgc3RhY2sgcG9pbnRlciBhdCBzdWJzeXN0ZW0gc3RhcnR1cAogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSAoCkBAIC03OSw3ICs3OSw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNrX3N0YWNrX3B0cgogICoKQEAgLTg3LDkgKzg3LDkgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBTYXZlIHRoZSBjdXJyZW50IHN0YWNrIHBvaW50ZXIKKyAqIERFU0NSSVBUSU9OOiBTYXZlIHRoZSBjdXJyZW50IENQVSBzdGFjayBwb2ludGVyCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3RyYWNrX3N0YWNrX3B0ciAoCkBAIC0xMTAsMTYgKzExMCwxNiBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWJ1Z19wcmludAogICoKLSAqIFBBUkFNRVRFUlM6ICBkZWJ1Z19sZXZlbCAgICAgICAgIC0gUmVxdWVzdGVkIGRlYnVnIHByaW50IGxldmVsCi0gKiAgICAgICAgICAgICAgcHJvY19uYW1lICAgICAgICAgICAtIENhbGxlcidzIHByb2NlZHVyZSBuYW1lCi0gKiAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lIChmb3IgZXJyb3Igb3V0cHV0KQorICogUEFSQU1FVEVSUzogIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCAtIFJlcXVlc3RlZCBkZWJ1ZyBwcmludCBsZXZlbAogICogICAgICAgICAgICAgIGxpbmVfbnVtYmVyICAgICAgICAgLSBDYWxsZXIncyBsaW5lIG51bWJlciAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBjb21wb25lbnRfaWQgICAgICAgIC0gQ2FsbGVyJ3MgY29tcG9uZW50IElEIChmb3IgZXJyb3Igb3V0cHV0KQotICoKKyAqICAgICAgICAgICAgICBkYmdfaW5mbyAgICAgICAgICAgIC0gQ29udGFpbnM6CisgKiAgICAgICAgICAgICAgICAgIHByb2NfbmFtZSAgICAgICAgICAgLSBDYWxsZXIncyBwcm9jZWR1cmUgbmFtZQorICogICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUKKyAqICAgICAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRAogICogICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgLSBQcmludGYgZm9ybWF0IGZpZWxkCiAgKiAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAtIE9wdGlvbmFsIHByaW50ZiBhcmd1bWVudHMKICAqCkBAIC0xMjgsNyArMTI4LDcgQEAKICAqIERFU0NSSVBUSU9OOiBQcmludCBlcnJvciBtZXNzYWdlIHdpdGggcHJlZml4IGNvbnNpc3Rpbmcgb2YgdGhlIG1vZHVsZSBuYW1lLAogICogICAgICAgICAgICAgIGxpbmUgbnVtYmVyLCBhbmQgY29tcG9uZW50IElELgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZCAgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKIGFjcGlfdXRfZGVidWdfcHJpbnQgKApAQCAtMTU3LDcgKzE1Nyw4IEBACiAKIAlpZiAodGhyZWFkX2lkICE9IGFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkKSB7CiAJCWlmIChBQ1BJX0xWX1RIUkVBRFMgJiBhY3BpX2RiZ19sZXZlbCkgewotCQkJYWNwaV9vc19wcmludGYgKCJcbioqKiogQ29udGV4dCBTd2l0Y2ggZnJvbSBUSUQgJVggdG8gVElEICVYICoqKipcblxuIiwKKwkJCWFjcGlfb3NfcHJpbnRmICgKKwkJCQkiXG4qKioqIENvbnRleHQgU3dpdGNoIGZyb20gVElEICVYIHRvIFRJRCAlWCAqKioqXG5cbiIsCiAJCQkJYWNwaV9nYmxfcHJldl90aHJlYWRfaWQsIHRocmVhZF9pZCk7CiAJCX0KIApAQCAtMTc0LDE1ICsxNzUsMTYgQEAKIAkJYWNwaV9vc19wcmludGYgKCJbJTA0bFhdICIsIHRocmVhZF9pZCk7CiAJfQogCi0JYWNwaV9vc19wcmludGYgKCJbJTAybGRdICUtMjIuMjJzOiAiLCBhY3BpX2dibF9uZXN0aW5nX2xldmVsLCBkYmdfaW5mby0+cHJvY19uYW1lKTsKKwlhY3BpX29zX3ByaW50ZiAoIlslMDJsZF0gJS0yMi4yMnM6ICIsCisJCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwsIGRiZ19pbmZvLT5wcm9jX25hbWUpOwogCiAJdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7CiAJYWNwaV9vc192cHJpbnRmIChmb3JtYXQsIGFyZ3MpOwogfQorCiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnQpOwogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kZWJ1Z19wcmludF9yYXcKICAqCkBAIC0yMDAsNyArMjAyLDcgQEAKICAqIERFU0NSSVBUSU9OOiBQcmludCBtZXNzYWdlIHdpdGggbm8gaGVhZGVycy4gIEhhcyBzYW1lIGludGVyZmFjZSBhcwogICogICAgICAgICAgICAgIGRlYnVnX3ByaW50IHNvIHRoYXQgdGhlIHNhbWUgbWFjcm9zIGNhbiBiZSB1c2VkLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZCAgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKIGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3ICgKQEAgLTIyNCw3ICsyMjYsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3V0X2RlYnVnX3ByaW50X3Jhdyk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3RyYWNlCiAgKgpAQCAtMjM5LDcgKzI0MSw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3RyYWNlICgKQEAgLTI1Niw3ICsyNTgsNyBAQAogRVhQT1JUX1NZTUJPTChhY3BpX3V0X3RyYWNlKTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2VfcHRyCiAgKgpAQCAtMjcyLDcgKzI3NCw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3RyYWNlX3B0ciAoCkBAIC0yODgsNyArMjkwLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2Vfc3RyCiAgKgpAQCAtMzA0LDcgKzMwNiw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3RyYWNlX3N0ciAoCkBAIC0zMjEsNyArMzIzLDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2VfdTMyCiAgKgpAQCAtMzM3LDcgKzMzOSw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZW50cnkgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X3RyYWNlX3UzMiAoCkBAIC0zNTQsNyArMzU2LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhpdAogICoKQEAgLTM2OSw3ICszNzEsNyBAQAogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkCiBhY3BpX3V0X2V4aXQgKApAQCAtMzg1LDcgKzM4Nyw3IEBACiBFWFBPUlRfU1lNQk9MKGFjcGlfdXRfZXhpdCk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0YXR1c19leGl0CiAgKgpAQCAtNDAxLDcgKzQwMyw3IEBACiAgKiBERVNDUklQVElPTjogRnVuY3Rpb24gZXhpdCB0cmFjZS4gIFByaW50cyBvbmx5IGlmIFRSQUNFX0ZVTkNUSU9OUyBiaXQgaXMKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHN0YXR1cyBhbHNvLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF9zdGF0dXNfZXhpdCAoCkBAIC00MjYsNyArNDI4LDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV91dF9zdGF0dXNfZXhpdCk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbHVlX2V4aXQKICAqCkBAIC00NDIsNyArNDQ0LDcgQEAKICAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiBleGl0IHRyYWNlLiAgUHJpbnRzIG9ubHkgaWYgVFJBQ0VfRlVOQ1RJT05TIGJpdCBpcwogICogICAgICAgICAgICAgIHNldCBpbiBkZWJ1Z19sZXZlbC4gUHJpbnRzIGV4aXQgdmFsdWUgYWxzby4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfdmFsdWVfZXhpdCAoCkBAIC00NjAsNyArNDYyLDcgQEAKIEVYUE9SVF9TWU1CT0woYWNwaV91dF92YWx1ZV9leGl0KTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcHRyX2V4aXQKICAqCkBAIC00NjksMTQgKzQ3MSwxNCBAQAogICogICAgICAgICAgICAgICAgICBwcm9jX25hbWUgICAgICAgICAgIC0gQ2FsbGVyJ3MgcHJvY2VkdXJlIG5hbWUKICAqICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUgICAgICAgICAtIENhbGxlcidzIG1vZHVsZSBuYW1lCiAgKiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKLSAqICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgIC0gVmFsdWUgdG8gYmUgcHJpbnRlZCB3aXRoIGV4aXQgbXNnCisgKiAgICAgICAgICAgICAgUHRyICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gZGlzcGxheQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIGV4aXQgdHJhY2UuICBQcmludHMgb25seSBpZiBUUkFDRV9GVU5DVElPTlMgYml0IGlzCiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCB2YWx1ZSBhbHNvLgogICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF9wdHJfZXhpdCAoCkBAIC00OTQsNyArNDk2LDcgQEAKICNlbmRpZgogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9kdW1wX2J1ZmZlcgogICoKQEAgLTUwNyw3ICs1MDksNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBHZW5lcmljIGR1bXAgYnVmZmVyIGluIGJvdGggaGV4IGFuZCBhc2NpaS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKIGFjcGlfdXRfZHVtcF9idWZmZXIgKApAQCAtNTMzLDM0ICs1MzUsMjggQEAKIAkJZGlzcGxheSA9IERCX0JZVEVfRElTUExBWTsKIAl9CiAKLQlhY3BpX29zX3ByaW50ZiAoIlxuT2Zmc2V0IFZhbHVlXG4iKTsKKwkvKiBOYXN0eSBsaXR0bGUgZHVtcCBidWZmZXIgcm91dGluZSEgKi8KIAotCS8qCi0JICogTmFzdHkgbGl0dGxlIGR1bXAgYnVmZmVyIHJvdXRpbmUhCi0JICovCiAJd2hpbGUgKGkgPCBjb3VudCkgewogCQkvKiBQcmludCBjdXJyZW50IG9mZnNldCAqLwogCi0JCWFjcGlfb3NfcHJpbnRmICgiJTA1WCAgIiwgKHUzMikgaSk7CisJCWFjcGlfb3NfcHJpbnRmICgiJTYuNFg6ICIsICh1MzIpIGkpOwogCiAJCS8qIFByaW50IDE2IGhleCBjaGFycyAqLwogCiAJCWZvciAoaiA9IDA7IGogPCAxNjspIHsKIAkJCWlmIChpICsgaiA+PSBjb3VudCkgewotCQkJCWFjcGlfb3NfcHJpbnRmICgiXG4iKTsKLQkJCQlyZXR1cm47CisJCQkJLyogRHVtcCBmaWxsIHNwYWNlcyAqLworCisJCQkJYWNwaV9vc19wcmludGYgKCIlKnMiLCAoKGRpc3BsYXkgKiAyKSArIDEpLCAiICIpOworCQkJCWogKz0gZGlzcGxheTsKKwkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIHM4IGRvZXNuJ3QgZ2V0IHNpZ24tZXh0ZW5kZWQhICovCi0KIAkJCXN3aXRjaCAoZGlzcGxheSkgewotCQkJLyogRGVmYXVsdCBpcyBCWVRFIGRpc3BsYXkgKi8KKwkJCWRlZmF1bHQ6ICAgIC8qIERlZmF1bHQgaXMgQllURSBkaXNwbGF5ICovCiAKLQkJCWRlZmF1bHQ6Ci0KLQkJCQlhY3BpX29zX3ByaW50ZiAoIiUwMlggIiwKLQkJCQkJCSooKHU4ICopICZidWZmZXJbaSArIGpdKSk7Ci0JCQkJaiArPSAxOworCQkJCWFjcGlfb3NfcHJpbnRmICgiJTAyWCAiLCBidWZmZXJbaSArIGpdKTsKIAkJCQlicmVhazsKIAogCkBAIC01NjgsNyArNTY0LDYgQEAKIAogCQkJCUFDUElfTU9WRV8xNl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOwogCQkJCWFjcGlfb3NfcHJpbnRmICgiJTA0WCAiLCB0ZW1wMzIpOwotCQkJCWogKz0gMjsKIAkJCQlicmVhazsKIAogCkBAIC01NzYsNyArNTcxLDYgQEAKIAogCQkJCUFDUElfTU9WRV8zMl9UT18zMiAoJnRlbXAzMiwgJmJ1ZmZlcltpICsgal0pOwogCQkJCWFjcGlfb3NfcHJpbnRmICgiJTA4WCAiLCB0ZW1wMzIpOwotCQkJCWogKz0gNDsKIAkJCQlicmVhazsKIAogCkBAIC01ODcsMTUgKzU4MSwxNyBAQAogCiAJCQkJQUNQSV9NT1ZFXzMyX1RPXzMyICgmdGVtcDMyLCAmYnVmZmVyW2kgKyBqICsgNF0pOwogCQkJCWFjcGlfb3NfcHJpbnRmICgiJTA4WCAiLCB0ZW1wMzIpOwotCQkJCWogKz0gODsKIAkJCQlicmVhazsKIAkJCX0KKworCQkJaiArPSBkaXNwbGF5OwogCQl9CiAKIAkJLyoKIAkJICogUHJpbnQgdGhlIEFTQ0lJIGVxdWl2YWxlbnQgY2hhcmFjdGVycwogCQkgKiBCdXQgd2F0Y2ggb3V0IGZvciB0aGUgYmFkIHVucHJpbnRhYmxlIG9uZXMuLi4KIAkJICovCisJCWFjcGlfb3NfcHJpbnRmICgiICIpOwogCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgewogCQkJaWYgKGkgKyBqID49IGNvdW50KSB7CiAJCQkJYWNwaV9vc19wcmludGYgKCJcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCmluZGV4IDlhNTJhZDUuLmJjNTQwMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKQEAgLTUxLDEyICs1MSwyMyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dGRlbGV0ZSIpCiAKKy8qIExvY2FsIHByb3RvdHlwZXMgKi8KKworc3RhdGljIHZvaWQKK2FjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaiAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKKworc3RhdGljIHZvaWQKK2FjcGlfdXRfdXBkYXRlX3JlZl9jb3VudCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmoKICAqCi0gKiBQQVJBTUVURVJTOiAgKk9iamVjdCAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBsaXN0IHRvIGJlIGRlbGV0ZWQKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAtIE9iamVjdCB0byBiZSBkZWxldGVkCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC02NSw3ICs3Niw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZAorc3RhdGljIHZvaWQKIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iaiAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KQogewpAQCAtMTUyLDcgKzE2Myw4IEBACiAKIAljYXNlIEFDUElfVFlQRV9NVVRFWDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKioqIE11dGV4ICVwLCBTZW1hcGhvcmUgJXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIioqKioqIE11dGV4ICVwLCBTZW1hcGhvcmUgJXBcbiIsCiAJCQlvYmplY3QsIG9iamVjdC0+bXV0ZXguc2VtYXBob3JlKSk7CiAKIAkJYWNwaV9leF91bmxpbmtfbXV0ZXggKG9iamVjdCk7CkBAIC0xNjIsNyArMTc0LDggQEAKIAogCWNhc2UgQUNQSV9UWVBFX0VWRU5UOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiKioqKiogRXZlbnQgJXAsIFNlbWFwaG9yZSAlcFxuIiwKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiKioqKiogRXZlbnQgJXAsIFNlbWFwaG9yZSAlcFxuIiwKIAkJCW9iamVjdCwgb2JqZWN0LT5ldmVudC5zZW1hcGhvcmUpKTsKIAogCQkodm9pZCkgYWNwaV9vc19kZWxldGVfc2VtYXBob3JlIChvYmplY3QtPmV2ZW50LnNlbWFwaG9yZSk7CkBAIC0xNzIsNyArMTg1LDggQEAKIAogCWNhc2UgQUNQSV9UWVBFX01FVEhPRDoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKioqIE1ldGhvZCAlcFxuIiwgb2JqZWN0KSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIioqKioqIE1ldGhvZCAlcFxuIiwgb2JqZWN0KSk7CiAKIAkJLyogRGVsZXRlIHRoZSBtZXRob2Qgc2VtYXBob3JlIGlmIGl0IGV4aXN0cyAqLwogCkBAIC0xODUsNyArMTk5LDggQEAKIAogCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIioqKioqIFJlZ2lvbiAlcFxuIiwgb2JqZWN0KSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIioqKioqIFJlZ2lvbiAlcFxuIiwgb2JqZWN0KSk7CiAKIAkJc2Vjb25kX2Rlc2MgPSBhY3BpX25zX2dldF9zZWNvbmRhcnlfb2JqZWN0IChvYmplY3QpOwogCQlpZiAoc2Vjb25kX2Rlc2MpIHsKQEAgLTIxMiw3ICsyMjcsOCBAQAogCiAJY2FzZSBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOgogCi0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiKioqKiogQnVmZmVyIEZpZWxkICVwXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiKioqKiogQnVmZmVyIEZpZWxkICVwXG4iLCBvYmplY3QpKTsKIAogCQlzZWNvbmRfZGVzYyA9IGFjcGlfbnNfZ2V0X3NlY29uZGFyeV9vYmplY3QgKG9iamVjdCk7CiAJCWlmIChzZWNvbmRfZGVzYykgewpAQCAtMjQ3LDcgKzI2Myw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0CiAgKgotICogUEFSQU1FVEVSUzogICpvYmpfbGlzdCAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAorICogUEFSQU1FVEVSUzogIG9ial9saXN0ICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGxpc3QgdG8gYmUgZGVsZXRlZAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMjgzLDcgKzI5OSw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdXBkYXRlX3JlZl9jb3VudAogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmIGNvdW50IGlzIHRvIGJlIHVwZGF0ZWQKKyAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmIGNvdW50IGlzIHRvIGJlIHVwZGF0ZWQKICAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBXaGF0IHRvIGRvCiAgKgogICogUkVUVVJOOiAgICAgIE5ldyByZWYgY291bnQKQEAgLTMxMiw3ICszMjgsOCBAQAogCW5ld19jb3VudCA9IGNvdW50OwogCiAJLyoKLQkgKiBQZXJmb3JtIHRoZSByZWZlcmVuY2UgY291bnQgYWN0aW9uIChpbmNyZW1lbnQsIGRlY3JlbWVudCwgb3IgZm9yY2UgZGVsZXRlKQorCSAqIFBlcmZvcm0gdGhlIHJlZmVyZW5jZSBjb3VudCBhY3Rpb24KKwkgKiAoaW5jcmVtZW50LCBkZWNyZW1lbnQsIG9yIGZvcmNlIGRlbGV0ZSkKIAkgKi8KIAlzd2l0Y2ggKGFjdGlvbikgewogCkBAIC0zMjEsNyArMzM4LDggQEAKIAkJbmV3X2NvdW50Kys7CiAJCW9iamVjdC0+Y29tbW9uLnJlZmVyZW5jZV9jb3VudCA9IG5ld19jb3VudDsKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIk9iaiAlcCBSZWZzPSVYLCBbSW5jcmVtZW50ZWRdXG4iLAorCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCSJPYmogJXAgUmVmcz0lWCwgW0luY3JlbWVudGVkXVxuIiwKIAkJCW9iamVjdCwgbmV3X2NvdW50KSk7CiAJCWJyZWFrOwogCkBAIC0zMjksNyArMzQ3LDggQEAKIAljYXNlIFJFRl9ERUNSRU1FTlQ6CiAKIAkJaWYgKGNvdW50IDwgMSkgewotCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJPYmogJXAgUmVmcz0lWCwgY2FuJ3QgZGVjcmVtZW50ISAoU2V0IHRvIDApXG4iLAorCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkJIk9iaiAlcCBSZWZzPSVYLCBjYW4ndCBkZWNyZW1lbnQhIChTZXQgdG8gMClcbiIsCiAJCQkJb2JqZWN0LCBuZXdfY291bnQpKTsKIAogCQkJbmV3X2NvdW50ID0gMDsKQEAgLTMzNywxMiArMzU2LDE0IEBACiAJCWVsc2UgewogCQkJbmV3X2NvdW50LS07CiAKLQkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCisJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywKKwkJCQkiT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCiAJCQkJb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJfQogCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRSAob2JqZWN0KSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7Ci0JCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIk1ldGhvZCBPYmogJXAgUmVmcz0lWCwgW0RlY3JlbWVudGVkXVxuIiwKKwkJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJCSJNZXRob2QgT2JqICVwIFJlZnM9JVgsIFtEZWNyZW1lbnRlZF1cbiIsCiAJCQkJb2JqZWN0LCBuZXdfY291bnQpKTsKIAkJfQogCkBAIC0zNTYsNyArMzc3LDggQEAKIAogCWNhc2UgUkVGX0ZPUkNFX0RFTEVURToKIAotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9BTExPQ0FUSU9OUywgIk9iaiAlcCBSZWZzPSVYLCBGb3JjZSBkZWxldGUhIChTZXQgdG8gMClcbiIsCisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0FMTE9DQVRJT05TLAorCQkJIk9iaiAlcCBSZWZzPSVYLCBGb3JjZSBkZWxldGUhIChTZXQgdG8gMClcbiIsCiAJCQlvYmplY3QsIGNvdW50KSk7CiAKIAkJbmV3X2NvdW50ID0gMDsKQEAgLTM5MCw3ICs0MTIsNyBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAgICAgLSBJbmNyZW1lbnQgcmVmIGNvdW50IGZvciB0aGlzIG9iamVjdAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBJbmNyZW1lbnQgcmVmIGNvdW50IGZvciB0aGlzIG9iamVjdAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIHN1Yi1vYmplY3RzCiAgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAtIEVpdGhlciBSRUZfSU5DUkVNRU5UIG9yIFJFRl9ERUNSRU1FTlQgb3IKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX0ZPUkNFX0RFTEVURQpAQCAtNDMxLDcgKzQ1Myw4IEBACiAJLyogTWFrZSBzdXJlIHRoYXQgdGhpcyBpc24ndCBhIG5hbWVzcGFjZSBoYW5kbGUgKi8KIAogCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUgKG9iamVjdCkgPT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsICJPYmplY3QgJXAgaXMgTlMgaGFuZGxlXG4iLCBvYmplY3QpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfQUxMT0NBVElPTlMsCisJCQkiT2JqZWN0ICVwIGlzIE5TIGhhbmRsZVxuIiwgb2JqZWN0KSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwogCX0KIApAQCAtNjE0LDggKzYzNyw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWRkX3JlZmVyZW5jZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAtIE9iamVjdCB3aG9zZSByZWZlcmVuY2UgY291bnQgaXMgdG8gYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGVkCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZmVyZW5jZSBjb3VudCBpcyB0byBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGVkCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC02NTIsNyArNjc1LDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgIC0gT2JqZWN0IHdob3NlIHJlZiBjb3VudCB3aWxsIGJlIGRlY3JlbWVudGVkCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgLSBPYmplY3Qgd2hvc2UgcmVmIGNvdW50IHdpbGwgYmUgZGVjcmVtZW50ZWQKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCmluZGV4IGVhZDI3ZDIuLjAwMDQ2ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwpAQCAtNTAsNiArNTAsMTkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRldmFsIikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV91dF9jb3B5X2lkX3N0cmluZyAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdGluYXRpb24sCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc291cmNlLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF90cmFuc2xhdGVfb25lX2NpZCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZCAgICAgICAqb25lX2NpZCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMzcsOSArMjUwLDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICAqb2JqZWN0X25hbWUgICAgICAgIC0gT2JqZWN0IG5hbWUgdG8gYmUgZXZhbHVhdGVkCisgKiBQQVJBTUVURVJTOiAgb2JqZWN0X25hbWUgICAgICAgICAtIE9iamVjdCBuYW1lIHRvIGJlIGV2YWx1YXRlZAogICogICAgICAgICAgICAgIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgKkFkZHJlc3MgICAgICAgICAgICAtIFdoZXJlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSB0aGUgdmFsdWUgaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMzAzLDcgKzMxNiw2IEBACiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQogewogCi0KIAkvKgogCSAqIFdvcmthcm91bmQgZm9yIElEIHN0cmluZ3MgdGhhdCBoYXZlIGEgbGVhZGluZyBhc3Rlcmlzay4gVGhpcyBjb25zdHJ1Y3QKIAkgKiBpcyBub3QgYWxsb3dlZCBieSB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uICAoSUQgc3RyaW5ncyBtdXN0IGJlCkBAIC0zMjUsNyArMzM3LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfSElECiAgKgogICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgKkhpZCAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBISUQgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBIaWQgICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIEhJRCBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC00MjksNyArNDQxLDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2V4ZWN1dGVfQ0lECiAgKgogICogUEFSQU1FVEVSUzogIGRldmljZV9ub2RlICAgICAgICAgLSBOb2RlIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgKkNpZCAgICAgICAgICAgICAgICAtIFdoZXJlIHRoZSBDSUQgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICByZXR1cm5fY2lkX2xpc3QgICAgIC0gV2hlcmUgdGhlIENJRCBsaXN0IGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQ4OCwxMCArNTAwLDEwIEBACiAJY2lkX2xpc3QtPnNpemUgPSBzaXplOwogCiAJLyoKLQkgKiAgQSBfQ0lEIGNhbiByZXR1cm4gZWl0aGVyIGEgc2luZ2xlIGNvbXBhdGlibGUgSUQgb3IgYSBwYWNrYWdlIG9mIGNvbXBhdGlibGUKLQkgKiAgSURzLiAgRWFjaCBjb21wYXRpYmxlIElEIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkgKiAgLS0gTnVtYmVyICgzMiBiaXQgY29tcHJlc3NlZCBFSVNBIElEKSBvcgotCSAqICAtLSBTdHJpbmcgKFBDSSBJRCBmb3JtYXQsIGUuZy4gIlBDSVxWRU5fdnZ2diZERVZfZGRkZCZTVUJTWVNfc3Nzc3Nzc3MiKS4KKwkgKiAgQSBfQ0lEIGNhbiByZXR1cm4gZWl0aGVyIGEgc2luZ2xlIGNvbXBhdGlibGUgSUQgb3IgYSBwYWNrYWdlIG9mCisJICogIGNvbXBhdGlibGUgSURzLiAgRWFjaCBjb21wYXRpYmxlIElEIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKiAgMSkgSW50ZWdlciAoMzIgYml0IGNvbXByZXNzZWQgRUlTQSBJRCkgb3IKKwkgKiAgMikgU3RyaW5nIChQQ0kgSUQgZm9ybWF0LCBlLmcuICJQQ0lcVkVOX3Z2dnYmREVWX2RkZGQmU1VCU1lTX3Nzc3Nzc3NzIikKIAkgKi8KIAogCS8qIFRoZSBfQ0lEIG9iamVjdCBjYW4gYmUgZWl0aGVyIGEgc2luZ2xlIENJRCBvciBhIHBhY2thZ2UgKGxpc3QpIG9mIENJRHMgKi8KQEAgLTUzNCw3ICs1NDYsNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9VSUQKICAqCiAgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAqVWlkICAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIFVJRCBpcyByZXR1cm5lZAorICogICAgICAgICAgICAgIFVpZCAgICAgICAgICAgICAgICAgLSBXaGVyZSB0aGUgVUlEIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTU4Nyw3ICs1OTksNyBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZXhlY3V0ZV9TVEEKICAqCiAgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAqRmxhZ3MgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHN0YXR1cyBmbGFncyBhcmUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHN0YXR1cyBmbGFncyBhcmUgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNjQxLDcgKzY1Myw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9leGVjdXRlX1N4ZHMKICAqCiAgKiBQQVJBTUVURVJTOiAgZGV2aWNlX25vZGUgICAgICAgICAtIE5vZGUgZm9yIHRoZSBkZXZpY2UKLSAqICAgICAgICAgICAgICAqRmxhZ3MgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHN0YXR1cyBmbGFncyBhcmUgcmV0dXJuZWQKKyAqICAgICAgICAgICAgICBGbGFncyAgICAgICAgICAgICAgIC0gV2hlcmUgdGhlIHN0YXR1cyBmbGFncyBhcmUgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCmluZGV4IDI1YjBmOGEuLjQxNDYwMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKICNkZWZpbmUgREVGSU5FX0FDUElfR0xPQkFMUwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKQEAgLTUyLDEzICs1MSwxNCBAQAogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRnbG9iYWwiKQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgogICoKICAqIFBBUkFNRVRFUlM6ICBTdGF0dXMgICAgICAgLSBUaGUgYWNwaV9zdGF0dXMgY29kZSB0byBiZSBmb3JtYXR0ZWQKICAqCi0gKiBSRVRVUk46ICAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uICB0ZXh0CisgKiBSRVRVUk46ICAgICAgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQuIEEgdmFsaWQgcG9pbnRlciBpcworICogICAgICAgICAgICAgIGFsd2F5cyByZXR1cm5lZC4KICAqCiAgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIGFuIEFDUEkgZXhjZXB0aW9uIGludG8gYW4gQVNDSUkgc3RyaW5nLgogICoKQEAgLTY4LDggKzY4LDggQEAKIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbiAoCiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpCiB7Ci0JY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAgICAqZXhjZXB0aW9uID0gIlVOS05PV05fU1RBVFVTX0NPREUiOwogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3ViX3N0YXR1czsKKwljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpleGNlcHRpb24gPSBOVUxMOwogCiAKIAlBQ1BJX0ZVTkNUSU9OX05BTUUgKCJmb3JtYXRfZXhjZXB0aW9uIik7CkBAIC04Miw1NyArODIsNTUgQEAKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0VOVl9NQVgpIHsKIAkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19lbnYgW3N1Yl9zdGF0dXNdOwotCQkJYnJlYWs7CiAJCX0KLQkJZ290byB1bmtub3duOworCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9QUk9HUkFNTUVSOgogCiAJCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfUEdNX01BWCkgewogCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3BnbSBbc3ViX3N0YXR1cyAtMV07Ci0JCQlicmVhazsKIAkJfQotCQlnb3RvIHVua25vd247CisJCWJyZWFrOwogCiAJY2FzZSBBRV9DT0RFX0FDUElfVEFCTEVTOgogCiAJCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfVEJMX01BWCkgewogCQkJZXhjZXB0aW9uID0gYWNwaV9nYmxfZXhjZXB0aW9uX25hbWVzX3RibCBbc3ViX3N0YXR1cyAtMV07Ci0JCQlicmVhazsKIAkJfQotCQlnb3RvIHVua25vd247CisJCWJyZWFrOwogCiAJY2FzZSBBRV9DT0RFX0FNTDoKIAogCQlpZiAoc3ViX3N0YXR1cyA8PSBBRV9DT0RFX0FNTF9NQVgpIHsKIAkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19hbWwgW3N1Yl9zdGF0dXMgLTFdOwotCQkJYnJlYWs7CiAJCX0KLQkJZ290byB1bmtub3duOworCQlicmVhazsKIAogCWNhc2UgQUVfQ09ERV9DT05UUk9MOgogCiAJCWlmIChzdWJfc3RhdHVzIDw9IEFFX0NPREVfQ1RSTF9NQVgpIHsKIAkJCWV4Y2VwdGlvbiA9IGFjcGlfZ2JsX2V4Y2VwdGlvbl9uYW1lc19jdHJsIFtzdWJfc3RhdHVzIC0xXTsKLQkJCWJyZWFrOwogCQl9Ci0JCWdvdG8gdW5rbm93bjsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlnb3RvIHVua25vd247CisJCWJyZWFrOwogCX0KIAorCWlmICghZXhjZXB0aW9uKSB7CisJCS8qIEV4Y2VwdGlvbiBjb2RlIHdhcyBub3QgcmVjb2duaXplZCAqLwogCi0JcmV0dXJuICgoY29uc3QgY2hhciAqKSBleGNlcHRpb24pOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKKwkJCSJVbmtub3duIGV4Y2VwdGlvbiBjb2RlOiAweCU4LjhYXG4iLCBzdGF0dXMpKTsKIAotdW5rbm93bjoKKwkJcmV0dXJuICgoY29uc3QgY2hhciAqKSAiVU5LTk9XTl9TVEFUVVNfQ09ERSIpOworCX0KIAotCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBleGNlcHRpb24gY29kZTogMHglOC44WFxuIiwgc3RhdHVzKSk7CiAJcmV0dXJuICgoY29uc3QgY2hhciAqKSBleGNlcHRpb24pOwogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU3RhdGljIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXphdGlvbi4KICAqCkBAIC0yMTIsMTMgKzIxMCwxMiBAQAogfTsKIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5hbWVzcGFjZSBnbG9iYWxzCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKgogICogUHJlZGVmaW5lZCBBQ1BJIE5hbWVzIChCdWlsdC1pbiB0byB0aGUgSW50ZXJwcmV0ZXIpCiAgKgpAQCAtMjQxLDkgKzIzOCwxMSBAQAogI2lmICFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pIHx8IGRlZmluZWQgKEFDUElfQ09OU1RBTlRfRVZBTF9PTkxZKQogCXsiX09TSSIsICAgIEFDUElfVFlQRV9NRVRIT0QsICAgICAgICAgICAoY2hhciAqKSAxfSwKICNlbmRpZgotCXtOVUxMLCAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgICAgLyogVGFibGUgdGVybWluYXRvciAqLwotfTsKIAorCS8qIFRhYmxlIHRlcm1pbmF0b3IgKi8KKworCXtOVUxMLCAgICAgIEFDUElfVFlQRV9BTlksICAgICAgICAgICAgICBOVUxMfQorfTsKIAogLyoKICAqIFByb3BlcnRpZXMgb2YgdGhlIEFDUEkgT2JqZWN0IFR5cGVzLCBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbC4KQEAgLTI4OCwyMiArMjg3LDI1IEBACiAvKiBIZXggdG8gQVNDSUkgY29udmVyc2lvbiB0YWJsZSAqLwogCiBzdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9oZXhfdG9fYXNjaWlbXSA9Ci0JCQkgIHsnMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLAotCQkJCQkgJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307Cit7CisJJzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywKKwknOCcsJzknLCdBJywnQicsJ0MnLCdEJywnRScsJ0YnCit9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9oZXhfdG9fYXNjaWlfY2hhcgogICoKICAqIFBBUkFNRVRFUlM6ICBJbnRlZ2VyICAgICAgICAgICAgIC0gQ29udGFpbnMgdGhlIGhleCBkaWdpdAogICogICAgICAgICAgICAgIFBvc2l0aW9uICAgICAgICAgICAgLSBiaXQgcG9zaXRpb24gb2YgdGhlIGRpZ2l0IHdpdGhpbiB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIChtdWx0aXBsZSBvZiA0KQogICoKLSAqIFJFVFVSTjogICAgICBBc2NpaSBjaGFyYWN0ZXIKKyAqIFJFVFVSTjogICAgICBUaGUgY29udmVydGVkIEFzY2lpIGNoYXJhY3RlcgogICoKLSAqIERFU0NSSVBUSU9OOiBDb252ZXJ0IGEgaGV4IGRpZ2l0IHRvIGFuIGFzY2lpIGNoYXJhY3RlcgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYSBoZXggZGlnaXQgdG8gYW4gQXNjaWkgY2hhcmFjdGVyCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBjaGFyCiBhY3BpX3V0X2hleF90b19hc2NpaV9jaGFyICgKQEAgLTMxNSw3ICszMTcsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogVGFibGUgbmFtZSBnbG9iYWxzCiAgKgpAQCAtMzI0LDcgKzMyNiw3IEBACiAgKiB0aGF0IGFyZSBub3QgdXNlZCBieSB0aGUgc3Vic3lzdGVtIGFyZSBzaW1wbHkgaWdub3JlZC4KICAqCiAgKiBEbyBOT1QgYWRkIGFueSB0YWJsZSB0byB0aGlzIGxpc3QgdGhhdCBpcyBub3QgY29uc3VtZWQgZGlyZWN0bHkgYnkgdGhpcwotICogc3Vic3lzdGVtLgorICogc3Vic3lzdGVtIChObyBNQURULCBFQ0RULCBTQlNULCBldGMuKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTM5MSw3ICszOTMsNyBAQAogCS8qIEFDUElfRVZFTlRfUlRDICAgICAgICAgICAqLyAge0FDUElfQklUUkVHX1JUX0NMT0NLX1NUQVRVUywgICAgICAgQUNQSV9CSVRSRUdfUlRfQ0xPQ0tfRU5BQkxFLCAgICAgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVUywgICAgICAgQUNQSV9CSVRNQVNLX1JUX0NMT0NLX0VOQUJMRX0sCiB9OwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lCiAgKgpAQCAtNDAxLDcgKzQwMyw3IEBACiAgKgogICogREVTQ1JJUFRJT046IFRyYW5zbGF0ZSBhIFNwYWNlIElEIGludG8gYSBuYW1lIHN0cmluZyAoRGVidWcgb25seSkKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIFJlZ2lvbiB0eXBlIGRlY29kaW5nICovCiAKQEAgLTQyOSw3ICs0MzEsNiBAQAogCXsKIAkJcmV0dXJuICgidXNlcl9kZWZpbmVkX3JlZ2lvbiIpOwogCX0KLQogCWVsc2UgaWYgKHNwYWNlX2lkID49IEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUykKIAl7CiAJCXJldHVybiAoImludmFsaWRfc3BhY2VfaWQiKTsKQEAgLTQzOSw3ICs0NDAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZXZlbnRfbmFtZQogICoKQEAgLTQ0OSw3ICs0NTAsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBFdmVudCBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBFdmVudCB0eXBlIGRlY29kaW5nICovCiAKQEAgLTQ3Nyw3ICs0NzgsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lCiAgKgpAQCAtNDg3LDIwICs0ODgsMjEgQEAKICAqCiAgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGEgVHlwZSBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKgogICogRWxlbWVudHMgb2YgYWNwaV9nYmxfbnNfdHlwZV9uYW1lcyBiZWxvdyBtdXN0IG1hdGNoCiAgKiBvbmUtdG8tb25lIHdpdGggdmFsdWVzIG9mIGFjcGlfb2JqZWN0X3R5cGUKICAqCi0gKiBUaGUgdHlwZSBBQ1BJX1RZUEVfQU5ZIChVbnR5cGVkKSBpcyB1c2VkIGFzIGEgImRvbid0IGNhcmUiIHdoZW4gc2VhcmNoaW5nOyB3aGVuCi0gKiBzdG9yZWQgaW4gYSB0YWJsZSBpdCByZWFsbHkgbWVhbnMgdGhhdCB3ZSBoYXZlIHRodXMgZmFyIHNlZW4gbm8gZXZpZGVuY2UgdG8KLSAqIGluZGljYXRlIHdoYXQgdHlwZSBpcyBhY3R1YWxseSBnb2luZyB0byBiZSBzdG9yZWQgZm9yIHRoaXMgZW50cnkuCisgKiBUaGUgdHlwZSBBQ1BJX1RZUEVfQU5ZIChVbnR5cGVkKSBpcyB1c2VkIGFzIGEgImRvbid0IGNhcmUiIHdoZW4gc2VhcmNoaW5nOworICogd2hlbiBzdG9yZWQgaW4gYSB0YWJsZSBpdCByZWFsbHkgbWVhbnMgdGhhdCB3ZSBoYXZlIHRodXMgZmFyIHNlZW4gbm8KKyAqIGV2aWRlbmNlIHRvIGluZGljYXRlIHdoYXQgdHlwZSBpcyBhY3R1YWxseSBnb2luZyB0byBiZSBzdG9yZWQgZm9yIHRoaXMgZW50cnkuCiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2JhZF90eXBlW10gPSAiVU5ERUZJTkVEIjsKLSNkZWZpbmUgVFlQRV9OQU1FX0xFTkdUSCAgICAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gbGVuZ3RoIG9mIGVhY2ggc3RyaW5nICovCiAKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9uc190eXBlX25hbWVzW10gPSAvKiBwcmludGFibGUgbmFtZXMgb2YgQUNQSSB0eXBlcyAqLworLyogUHJpbnRhYmxlIG5hbWVzIG9mIHRoZSBBQ1BJIG9iamVjdCB0eXBlcyAqLworCitzdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1tdID0KIHsKIAkvKiAwMCAqLyAiVW50eXBlZCIsCiAJLyogMDEgKi8gIkludGVnZXIiLApAQCAtNTY0LDcgKzU2Niw3IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUKICAqCkBAIC01NzQsNyArNTc2LDcgQEAKICAqCiAgKiBERVNDUklQVElPTjogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIHJldHVybiB0aGUgbm9kZSdzIEFDUEkgbmFtZS4KICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGNoYXIgKgogYWNwaV91dF9nZXRfbm9kZV9uYW1lICgKQEAgLTYxOCw3ICs2MjAsNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9uYW1lCiAgKgpAQCAtNjI4LDkgKzYzMCwxMSBAQAogICoKICAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBvYmplY3QgYW5kIHJldHVybiB0aGUgZGVzY3JpcHRvciB0eXBlCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgY29uc3QgY2hhciAgICAgICAgICAgICAgICAgICAqYWNwaV9nYmxfZGVzY190eXBlX25hbWVzW10gPSAvKiBwcmludGFibGUgbmFtZXMgb2YgZGVzY3JpcHRvciB0eXBlcyAqLworLyogUHJpbnRhYmxlIG5hbWVzIG9mIG9iamVjdCBkZXNjcmlwdG9yIHR5cGVzICovCisKK3N0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICphY3BpX2dibF9kZXNjX3R5cGVfbmFtZXNbXSA9CiB7CiAJLyogMDAgKi8gIkludmFsaWQiLAogCS8qIDAxICovICJDYWNoZWQiLApAQCAtNjc2LDE3ICs2ODAsMTggQEAKICAqIFN0cmluZ3MgYW5kIHByb2NlZHVyZXMgdXNlZCBmb3IgZGVidWcgb25seQogICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBOb25lLgorICogUEFSQU1FVEVSUzogIG11dGV4X2lkICAgICAgICAtIFRoZSBwcmVkZWZpbmVkIElEIGZvciB0aGlzIG11dGV4LgogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBTdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgbXV0ZXguIEFsd2F5cyByZXR1cm5zIGEgdmFsaWQKKyAqICAgICAgICAgICAgICBwb2ludGVyLgogICoKICAqIERFU0NSSVBUSU9OOiBUcmFuc2xhdGUgYSBtdXRleCBJRCBpbnRvIGEgbmFtZSBzdHJpbmcgKERlYnVnIG9ubHkpCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBjaGFyICoKIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKApAQCAtNzAwLDIxICs3MDUsMjAgQEAKIAogCXJldHVybiAoYWNwaV9nYmxfbXV0ZXhfbmFtZXNbbXV0ZXhfaWRdKTsKIH0KLQogI2VuZGlmCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlCiAgKgogICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAtIE9iamVjdCB0eXBlIHRvIGJlIHZhbGlkYXRlZAogICoKLSAqIFJFVFVSTjogICAgICBUUlVFIGlmIHZhbGlkIG9iamVjdCB0eXBlCisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiB2YWxpZCBvYmplY3QgdHlwZSwgRkFMU0Ugb3RoZXJ3aXNlCiAgKgogICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGFuIG9iamVjdCB0eXBlCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1OAogYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSAoCkBAIC03MzIsNyArNzM2LDcgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZAogICoKQEAgLTc0MCw3ICs3NDQsMTAgQEAKICAqCiAgKiBERVNDUklQVElPTjogQWxsb2NhdGUgYSB0YWJsZSBvciBtZXRob2Qgb3duZXIgaWQKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogTk9URTogdGhpcyBhbGdvcml0aG0gaGFzIGEgd3JhcGFyb3VuZCBwcm9ibGVtIGF0IDY0X2sgbWV0aG9kIGludm9jYXRpb25zLCBhbmQKKyAqICAgICAgIHNob3VsZCBiZSByZXZpc2l0ZWQgKFRCRCkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX293bmVyX2lkCiBhY3BpX3V0X2FsbG9jYXRlX293bmVyX2lkICgKQEAgLTc5NiwxNiArODAzLDE4IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaW5pdF9nbG9iYWxzCiAgKgotICogUEFSQU1FVEVSUzogIG5vbmUKKyAqIFBBUkFNRVRFUlM6ICBOb25lCisgKgorICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogSW5pdCBsaWJyYXJ5IGdsb2JhbHMuICBBbGwgZ2xvYmFscyB0aGF0IHJlcXVpcmUgc3BlY2lmaWMKICAqICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgaGVyZSEKICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdm9pZAogYWNwaV91dF9pbml0X2dsb2JhbHMgKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKaW5kZXggYmRiYWRhZi4uN2YzNzEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCkBAIC00OSwxOSArNDksMjkgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRpbml0IikKIAorLyogTG9jYWwgcHJvdG90eXBlcyAqLworCitzdGF0aWMgdm9pZAorYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpc3Rlcl9uYW1lLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworCitzdGF0aWMgdm9pZCBhY3BpX3V0X3Rlcm1pbmF0ZSAoCisJdm9pZCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yCiAgKgotICogUEFSQU1FVEVSUzogICpyZWdpc3Rlcl9uYW1lICAgICAgICAgIC0gUG9pbnRlciB0byBzdHJpbmcgaWRlbnRpZnlpbmcgcmVnaXN0ZXIKKyAqIFBBUkFNRVRFUlM6ICByZWdpc3Rlcl9uYW1lICAgICAgICAgICAtIFBvaW50ZXIgdG8gc3RyaW5nIGlkZW50aWZ5aW5nIHJlZ2lzdGVyCiAgKiAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBBY3R1YWwgcmVnaXN0ZXIgY29udGVudHMgdmFsdWUKLSAqICAgICAgICAgICAgICBhY3BpX3Rlc3Rfc3BlY19zZWN0aW9uICAtIFREUyBzZWN0aW9uIGNvbnRhaW5pbmcgYXNzZXJ0aW9uCi0gKiAgICAgICAgICAgICAgYWNwaV9hc3NlcnRpb24gICAgICAgICAgLSBBc3NlcnRpb24gbnVtYmVyIGJlaW5nIHRlc3RlZAorICogICAgICAgICAgICAgIE9mZnNldCAgICAgICAgICAgICAgICAgIC0gQnl0ZSBvZmZzZXQgaW4gdGhlIEZBRFQKICAqCiAgKiBSRVRVUk46ICAgICAgQUVfQkFEX1ZBTFVFCiAgKgotICogREVTQ1JJUFRJT046IERpc3BsYXkgZmFpbHVyZSBtZXNzYWdlIGFuZCBsaW5rIGZhaWx1cmUgdG8gVERTIGFzc2VydGlvbgorICogREVTQ1JJUFRJT046IERpc3BsYXkgZmFpbHVyZSBtZXNzYWdlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTY2LDEyICsxNzYsMTMgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgbm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBmcmVlIGdsb2JhbCBtZW1vcnkKKyAqIERFU0NSSVBUSU9OOiBGcmVlIGdsb2JhbCBtZW1vcnkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkCi1hY3BpX3V0X3Rlcm1pbmF0ZSAodm9pZCkKK3N0YXRpYyB2b2lkCithY3BpX3V0X3Rlcm1pbmF0ZSAoCisJdm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2s7CiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqbmV4dF9ncGVfYmxvY2s7CkBAIC0xODMsOCArMTk0LDYgQEAKIAogCiAJLyogRnJlZSBnbG9iYWwgdGFibGVzLCBldGMuICovCi0KLQogCS8qIEZyZWUgZ2xvYmFsIEdQRSBibG9ja3MgYW5kIHJlbGF0ZWQgaW5mbyBzdHJ1Y3R1cmVzICovCiAKIAlncGVfeHJ1cHRfaW5mbyA9IGFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CkBAIC0yMjEsNyArMjMwLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHZvaWQKLWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICh2b2lkKQorYWNwaV91dF9zdWJzeXN0ZW1fc2h1dGRvd24gKAorCXZvaWQpCiB7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgidXRfc3Vic3lzdGVtX3NodXRkb3duIik7CkBAIC0yMjksMTQgKzIzOSwxNiBAQAogCS8qIEp1c3QgZXhpdCBpZiBzdWJzeXN0ZW0gaXMgYWxyZWFkeSBzaHV0ZG93biAqLwogCiAJaWYgKGFjcGlfZ2JsX3NodXRkb3duKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLCAiQUNQSSBTdWJzeXN0ZW0gaXMgYWxyZWFkeSB0ZXJtaW5hdGVkXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIkFDUEkgU3Vic3lzdGVtIGlzIGFscmVhZHkgdGVybWluYXRlZFxuIikpOwogCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBTdWJzeXN0ZW0gYXBwZWFycyBhY3RpdmUsIGdvIGFoZWFkIGFuZCBzaHV0IGl0IGRvd24gKi8KIAogCWFjcGlfZ2JsX3NodXRkb3duID0gVFJVRTsKLQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9JTkZPLCAiU2h1dHRpbmcgZG93biBBQ1BJIFN1YnN5c3RlbS4uLlxuIikpOworCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0lORk8sCisJCSJTaHV0dGluZyBkb3duIEFDUEkgU3Vic3lzdGVtLi4uXG4iKSk7CiAKIAkvKiBDbG9zZSB0aGUgYWNwaV9ldmVudCBIYW5kbGluZyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYwppbmRleCAyNTI1YzFhLi4wZDUyN2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKQEAgLTI1OSw2ICsyNTksOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3Nob3J0X2RpdmlkZSwgYWNwaV91dF9kaXZpZGUKICAqCisgKiBQQVJBTUVURVJTOiAgU2VlIGZ1bmN0aW9uIGhlYWRlcnMgYWJvdmUKKyAqCiAgKiBERVNDUklQVElPTjogTmF0aXZlIHZlcnNpb25zIG9mIHRoZSB1dF9kaXZpZGUgZnVuY3Rpb25zLiBVc2UgdGhlc2UgaWYgZWl0aGVyCiAgKiAgICAgICAgICAgICAgMSkgVGhlIHRhcmdldCBpcyBhIDY0LWJpdCBwbGF0Zm9ybSBhbmQgdGhlcmVmb3JlIDY0LWJpdAogICogICAgICAgICAgICAgICAgIGludGVnZXIgbWF0aCBpcyBzdXBwb3J0ZWQgZGlyZWN0bHkgYnkgdGhlIG1hY2hpbmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYwppbmRleCBmNjU5ODU0Li5mNmRlNGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKQEAgLTQ5LDEyICs0OSw1NyBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiAJIEFDUElfTU9EVUxFX05BTUUgICAgKCJ1dG1pc2MiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9jcmVhdGVfbXV0ZXggKAorCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfZGVsZXRlX211dGV4ICgKKwlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3N0cnVwciAoc3RydXByKQorICoKKyAqIFBBUkFNRVRFUlM6ICBzcmNfc3RyaW5nICAgICAgLSBUaGUgc291cmNlIHN0cmluZyB0byBjb252ZXJ0CisgKgorICogUkVUVVJOOiAgICAgIENvbnZlcnRlZCBzcmNfc3RyaW5nIChzYW1lIGFzIGlucHV0IHBvaW50ZXIpCisgKgorICogREVTQ1JJUFRJT046IENvbnZlcnQgc3RyaW5nIHRvIHVwcGVyY2FzZQorICoKKyAqIE5PVEU6IFRoaXMgaXMgbm90IGEgUE9TSVggZnVuY3Rpb24sIHNvIGl0IGFwcGVhcnMgaGVyZSwgbm90IGluIHV0Y2xpYi5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2hhciAqCithY3BpX3V0X3N0cnVwciAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3JjX3N0cmluZykKK3sKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmc7CisKKworCUFDUElfRlVOQ1RJT05fRU5UUlkgKCk7CisKKworCS8qIFdhbGsgZW50aXJlIHN0cmluZywgdXBwZXJjYXNpbmcgdGhlIGxldHRlcnMgKi8KKworCWZvciAoc3RyaW5nID0gc3JjX3N0cmluZzsgKnN0cmluZzsgc3RyaW5nKyspIHsKKwkJKnN0cmluZyA9IChjaGFyKSBBQ1BJX1RPVVBQRVIgKCpzdHJpbmcpOworCX0KKworCXJldHVybiAoc3JjX3N0cmluZyk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9wcmludF9zdHJpbmcKICAqCiAgKiBQQVJBTUVURVJTOiAgU3RyaW5nICAgICAgICAgIC0gTnVsbCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZworICogICAgICAgICAgICAgIG1heF9sZW5ndGggICAgICAtIE1heGltdW0gb3V0cHV0IGxlbmd0aAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTQ4LDYgKzE5Myw4IEBACiAgKgogICogUEFSQU1FVEVSUzogIFZhbHVlICAgICAgICAgICAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZAogICoKKyAqIFJFVFVSTjogICAgICB1MzIgaW50ZWdlciB3aXRoIGJ5dGVzIHN3YXBwZWQKKyAqCiAgKiBERVNDUklQVElPTjogQ29udmVydCBhIDMyLWJpdCB2YWx1ZSB0byBiaWctZW5kaWFuIChzd2FwIHRoZSBieXRlcykKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTYwLDcgKzIwNyw2IEBACiAJCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKIAkJdTggICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzWzRdOwogCX0gb3V0OwotCiAJdW5pb24gewogCQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiAJCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1s0XTsKQEAgLTIxOSw3ICsyNjUsOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfaGFuZGxlICAgICAgICAgIC0gSGFuZGxlIHdob3NlIHBhdGhuYW1lIHdpbGwgYmUgZGlzcGxheWVkCisgKiBQQVJBTUVURVJTOiAgVHlwZSAgICAgICAgICAgICAgICAtIE9iamVjdCB0eXBlIG9mIHRoZSBub2RlCisgKiAgICAgICAgICAgICAgb2JqX2hhbmRsZSAgICAgICAgICAtIEhhbmRsZSB3aG9zZSBwYXRobmFtZSB3aWxsIGJlIGRpc3BsYXllZAogICogICAgICAgICAgICAgIFBhdGggICAgICAgICAgICAgICAgLSBBZGRpdGlvbmFsIHBhdGggc3RyaW5nIHRvIGJlIGFwcGVuZGVkLgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVUxMIGlmIG5vIGV4dHJhIHBhdGgpCiAgKgpAQCAtMjcwLDcgKzMxNyw4IEBACiAKIAkvKiBQcmludCB0aGUgb2JqZWN0IHR5cGUgYW5kIHBhdGhuYW1lICovCiAKLQlhY3BpX29zX3ByaW50ZiAoIiUtMTJzICVzIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSwgKGNoYXIgKikgYnVmZmVyLnBvaW50ZXIpOworCWFjcGlfb3NfcHJpbnRmICgiJS0xMnMgJXMiLAorCQlhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpLCAoY2hhciAqKSBidWZmZXIucG9pbnRlcik7CiAKIAkvKiBFeHRyYSBwYXRoIGlzIHVzZWQgdG8gYXBwZW5kIG5hbWVzIGxpa2UgX1NUQSwgX0lOSSwgZXRjLiAqLwogCkBAIC0yODgsOSArMzM2LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX25hbWUKICAqCi0gKiBQQVJBTUVURVJTOiAgQ2hhcmFjdGVyICAgICAgICAgICAtIFRoZSBjaGFyYWN0ZXIgdG8gYmUgZXhhbWluZWQKKyAqIFBBUkFNRVRFUlM6ICBOYW1lICAgICAgICAgICAgLSBUaGUgbmFtZSB0byBiZSBleGFtaW5lZAogICoKLSAqIFJFVFVSTjogICAgICAxIGlmIENoYXJhY3RlciBtYXkgYXBwZWFyIGluIGEgbmFtZSwgZWxzZSAwCisgKiBSRVRVUk46ICAgICAgVFJVRSBpZiB0aGUgbmFtZSBpcyB2YWxpZCwgRkFMU0Ugb3RoZXJ3aXNlCiAgKgogICogREVTQ1JJUFRJT046IENoZWNrIGZvciBhIHZhbGlkIEFDUEkgbmFtZS4gIEVhY2ggY2hhcmFjdGVyIG11c3QgYmUgb25lIG9mOgogICogICAgICAgICAgICAgIDEpIFVwcGVyIGNhc2UgYWxwaGEKQEAgLTQ5NSw0MCArNTQzLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9zdHJ1cHIKLSAqCi0gKiBQQVJBTUVURVJTOiAgc3JjX3N0cmluZyAgICAgIC0gVGhlIHNvdXJjZSBzdHJpbmcgdG8gY29udmVydCB0bwotICoKLSAqIFJFVFVSTjogICAgICBzcmNfc3RyaW5nCi0gKgotICogREVTQ1JJUFRJT046IENvbnZlcnQgc3RyaW5nIHRvIHVwcGVyY2FzZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWNoYXIgKgotYWNwaV91dF9zdHJ1cHIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNyY19zdHJpbmcpCi17Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nOwotCi0KLQlBQ1BJX0ZVTkNUSU9OX0VOVFJZICgpOwotCi0KLQkvKiBXYWxrIGVudGlyZSBzdHJpbmcsIHVwcGVyY2FzaW5nIHRoZSBsZXR0ZXJzICovCi0KLQlmb3IgKHN0cmluZyA9IHNyY19zdHJpbmc7ICpzdHJpbmc7ICkgewotCQkqc3RyaW5nID0gKGNoYXIpIEFDUElfVE9VUFBFUiAoKnN0cmluZyk7Ci0JCXN0cmluZysrOwotCX0KLQotCXJldHVybiAoc3JjX3N0cmluZyk7Ci19Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X211dGV4X2luaXRpYWxpemUKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZS4KQEAgLTYxMSw3ICs2MjUsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfY3JlYXRlX211dGV4ICgKIAlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKQogewpAQCAtNjQ4LDcgKzY2Miw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9kZWxldGVfbXV0ZXggKAogCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpCiB7CkBAIC03MTUsMTYgKzcyOSwxNiBAQAogCQkJaWYgKGFjcGlfZ2JsX211dGV4X2luZm9baV0ub3duZXJfaWQgPT0gdGhpc190aHJlYWRfaWQpIHsKIAkJCQlpZiAoaSA9PSBtdXRleF9pZCkgewogCQkJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJCQkiTXV0ZXggWyVzXSBhbHJlYWR5IGFjcXVpcmVkIGJ5IHRoaXMgdGhyZWFkIFslWF1cbiIsCi0JCQkJCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLCB0aGlzX3RocmVhZF9pZCkpOworCQkJCQkJIk11dGV4IFslc10gYWxyZWFkeSBhY3F1aXJlZCBieSB0aGlzIHRocmVhZCBbJVhdXG4iLAorCQkJCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLCB0aGlzX3RocmVhZF9pZCkpOwogCiAJCQkJCXJldHVybiAoQUVfQUxSRUFEWV9BQ1FVSVJFRCk7CiAJCQkJfQogCiAJCQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCi0JCQkJCQkiSW52YWxpZCBhY3F1aXJlIG9yZGVyOiBUaHJlYWQgJVggb3ducyBbJXNdLCB3YW50cyBbJXNdXG4iLAotCQkJCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKGkpLAotCQkJCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CisJCQkJCSJJbnZhbGlkIGFjcXVpcmUgb3JkZXI6IFRocmVhZCAlWCBvd25zIFslc10sIHdhbnRzIFslc11cbiIsCisJCQkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChpKSwKKwkJCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CiAKIAkJCQlyZXR1cm4gKEFFX0FDUVVJUkVfREVBRExPQ0spOwogCQkJfQpAQCAtNzMzLDIyICs3NDcsMjMgQEAKICNlbmRpZgogCiAJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsCi0JCQkgIlRocmVhZCAlWCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgTXV0ZXggWyVzXVxuIiwKLQkJCSB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CisJCSJUaHJlYWQgJVggYXR0ZW1wdGluZyB0byBhY3F1aXJlIE11dGV4IFslc11cbiIsCisJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCkpKTsKIAogCXN0YXR1cyA9IGFjcGlfb3Nfd2FpdF9zZW1hcGhvcmUgKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm11dGV4LAogCQkJICAgMSwgQUNQSV9XQUlUX0ZPUkVWRVIpOwogCWlmIChBQ1BJX1NVQ0NFU1MgKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfTVVURVgsICJUaHJlYWQgJVggYWNxdWlyZWQgTXV0ZXggWyVzXVxuIiwKLQkJCQkgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOworCQkJdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOwogCiAJCWFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLnVzZV9jb3VudCsrOwogCQlhY3BpX2dibF9tdXRleF9pbmZvW211dGV4X2lkXS5vd25lcl9pZCA9IHRoaXNfdGhyZWFkX2lkOwogCX0KIAllbHNlIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsICJUaHJlYWQgJVggY291bGQgbm90IGFjcXVpcmUgTXV0ZXggWyVzXSAlc1xuIiwKLQkJCQkgdGhpc190aHJlYWRfaWQsIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSwKLQkJCQkgYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAorCQkJIlRocmVhZCAlWCBjb3VsZCBub3QgYWNxdWlyZSBNdXRleCBbJXNdICVzXG4iLAorCQkJCXRoaXNfdGhyZWFkX2lkLCBhY3BpX3V0X2dldF9tdXRleF9uYW1lIChtdXRleF9pZCksCisJCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwpAQCAtNzkzLDggKzgwOCw4IEBACiAJICovCiAJaWYgKGFjcGlfZ2JsX211dGV4X2luZm9bbXV0ZXhfaWRdLm93bmVyX2lkID09IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEKSB7CiAJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VSUk9SLAotCQkJCSJNdXRleCBbJXNdIGlzIG5vdCBhY3F1aXJlZCwgY2Fubm90IHJlbGVhc2VcbiIsCi0JCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CisJCQkiTXV0ZXggWyVzXSBpcyBub3QgYWNxdWlyZWQsIGNhbm5vdCByZWxlYXNlXG4iLAorCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CiAKIAkJcmV0dXJuIChBRV9OT1RfQUNRVUlSRUQpOwogCX0KQEAgLTgxMiw4ICs4MjcsOCBAQAogCQkJfQogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwKLQkJCQkJIkludmFsaWQgcmVsZWFzZSBvcmRlcjogb3ducyBbJXNdLCByZWxlYXNpbmcgWyVzXVxuIiwKLQkJCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAoaSksIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOworCQkJCSJJbnZhbGlkIHJlbGVhc2Ugb3JkZXI6IG93bnMgWyVzXSwgcmVsZWFzaW5nIFslc11cbiIsCisJCQkJYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAoaSksIGFjcGlfdXRfZ2V0X211dGV4X25hbWUgKG11dGV4X2lkKSkpOwogCiAJCQlyZXR1cm4gKEFFX1JFTEVBU0VfREVBRExPQ0spOwogCQl9CkBAIC04MjYsMTMgKzg0MSwxNCBAQAogCXN0YXR1cyA9IGFjcGlfb3Nfc2lnbmFsX3NlbWFwaG9yZSAoYWNwaV9nYmxfbXV0ZXhfaW5mb1ttdXRleF9pZF0ubXV0ZXgsIDEpOwogCiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FUlJPUiwgIlRocmVhZCAlWCBjb3VsZCBub3QgcmVsZWFzZSBNdXRleCBbJXNdICVzXG4iLAotCQkJCSB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLAotCQkJCSBhY3BpX2Zvcm1hdF9leGNlcHRpb24gKHN0YXR1cykpKTsKKwkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVJST1IsCisJCQkiVGhyZWFkICVYIGNvdWxkIG5vdCByZWxlYXNlIE11dGV4IFslc10gJXNcbiIsCisJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpLAorCQkJYWNwaV9mb3JtYXRfZXhjZXB0aW9uIChzdGF0dXMpKSk7CiAJfQogCWVsc2UgewogCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9NVVRFWCwgIlRocmVhZCAlWCByZWxlYXNlZCBNdXRleCBbJXNdXG4iLAotCQkJCSB0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CisJCQl0aGlzX3RocmVhZF9pZCwgYWNwaV91dF9nZXRfbXV0ZXhfbmFtZSAobXV0ZXhfaWQpKSk7CiAJfQogCiAJcmV0dXJuIChzdGF0dXMpOwpAQCAtODQzLDExICs4NTksMTEgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfdXBkYXRlX3N0YXRlX2FuZF9wdXNoCiAgKgotICogUEFSQU1FVEVSUzogICpPYmplY3QgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBuZXcgc3RhdGUKICAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBJbmNyZW1lbnQvRGVjcmVtZW50CiAgKiAgICAgICAgICAgICAgc3RhdGVfbGlzdCAgICAgIC0gTGlzdCB0aGUgc3RhdGUgd2lsbCBiZSBhZGRlZCB0bwogICoKLSAqIFJFVFVSTjogICAgICBOb25lCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIG5ldyBzdGF0ZSBhbmQgcHVzaCBpdAogICoKQEAgLTg4NSwxNSArOTAxLDE2IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZV9hbmRfcHVzaAogICoKLSAqIFBBUkFNRVRFUlM6ICAqT2JqZWN0ICAgICAgICAgLSBPYmplY3QgdG8gYmUgYWRkZWQgdG8gdGhlIG5ldyBzdGF0ZQorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIE9iamVjdCB0byBiZSBhZGRlZCB0byB0aGUgbmV3IHN0YXRlCiAgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gSW5jcmVtZW50L0RlY3JlbWVudAogICogICAgICAgICAgICAgIHN0YXRlX2xpc3QgICAgICAtIExpc3QgdGhlIHN0YXRlIHdpbGwgYmUgYWRkZWQgdG8KICAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQorICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSBuZXcgc3RhdGUgYW5kIHB1c2ggaXQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2ggKApAQCAtOTI1LDcgKzk0Miw3IEBACiAgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCiAgKiAgICAgICAgICAgICAgU3RhdGUgICAgICAgICAgICAgICAtIFN0YXRlIG9iamVjdCB0byBwdXNoCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5vbmUKICAqCiAgKiBERVNDUklQVElPTjogUHVzaCBhIHN0YXRlIG9iamVjdCBvbnRvIGEgc3RhdGUgc3RhY2sKICAqCkBAIC05NTQsNyArOTcxLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgbGlzdF9oZWFkICAgICAgICAgICAtIEhlYWQgb2YgdGhlIHN0YXRlIHN0YWNrCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIFRoZSBwb3BwZWQgc3RhdGUgb2JqZWN0CiAgKgogICogREVTQ1JJUFRJT046IFBvcCBhIHN0YXRlIG9iamVjdCBmcm9tIGEgc3RhdGUgc3RhY2sKICAqCkBAIC05ODksNyArMTAwNiw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIE5vbmUKICAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKiBSRVRVUk46ICAgICAgVGhlIG5ldyBzdGF0ZSBvYmplY3QuIE5VTEwgb24gZmFpbHVyZS4KICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgZ2VuZXJpYyBzdGF0ZSBvYmplY3QuICBBdHRlbXB0IHRvIG9idGFpbiBvbmUgZnJvbQogICogICAgICAgICAgICAgIHRoZSBnbG9iYWwgc3RhdGUgY2FjaGU7ICBJZiBub25lIGF2YWlsYWJsZSwgY3JlYXRlIGEgbmV3IG9uZS4KQEAgLTk5Nyw3ICsxMDE0LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqCi1hY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlICh2b2lkKQorYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSAoCisJdm9pZCkKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZTsKIApAQCAtMTAyMyw3ICsxMDQxLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBUaHJlYWQgU3RhdGUKKyAqIFJFVFVSTjogICAgICBOZXcgVGhyZWFkIFN0YXRlLiBOVUxMIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgIlRocmVhZCBTdGF0ZSIgLSBhIGZsYXZvciBvZiB0aGUgZ2VuZXJpYyBzdGF0ZSB1c2VkCiAgKiAgICAgICAgICAgICAgdG8gdHJhY2sgcGVyLXRocmVhZCBpbmZvIGR1cmluZyBtZXRob2QgZXhlY3V0aW9uCkBAIC0xMDYwLDExICsxMDc4LDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gSW5pdGlhbCBPYmplY3QgdG8gYmUgaW5zdGFsbGVkIGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZQotICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAorICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAtIEluaXRpYWwgT2JqZWN0IHRvIGJlIGluc3RhbGxlZCBpbiB0aGUgc3RhdGUKKyAqICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICAgLSBVcGRhdGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOZXcgc3RhdGUgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGFuICJVcGRhdGUgU3RhdGUiIC0gYSBmbGF2b3Igb2YgdGhlIGdlbmVyaWMgc3RhdGUgdXNlZAogICogICAgICAgICAgICAgIHRvIHVwZGF0ZSByZWZlcmVuY2UgY291bnRzIGFuZCBkZWxldGUgY29tcGxleCBvYmplY3RzIHN1Y2gKQEAgLTExMDQsMTEgKzExMjEsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfcGtnX3N0YXRlCiAgKgotICogUEFSQU1FVEVSUzogIE9iamVjdCAgICAgICAgICAgICAgLSBJbml0aWFsIE9iamVjdCB0byBiZSBpbnN0YWxsZWQgaW4gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlCi0gKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAtIFVwZGF0ZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCisgKiBQQVJBTUVURVJTOiAgT2JqZWN0ICAgICAgICAgIC0gSW5pdGlhbCBPYmplY3QgdG8gYmUgaW5zdGFsbGVkIGluIHRoZSBzdGF0ZQorICogICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAtIFVwZGF0ZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5ldyBzdGF0ZSBvYmplY3QsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSAiUGFja2FnZSBTdGF0ZSIKICAqCkBAIC0xMTUxLDcgKzExNjcsNyBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBOb25lCiAgKgotICogUkVUVVJOOiAgICAgIFN0YXR1cworICogUkVUVVJOOiAgICAgIE5ldyBzdGF0ZSBvYmplY3QsIG51bGwgb24gZmFpbHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBDcmVhdGUgYSAiQ29udHJvbCBTdGF0ZSIgLSBhIGZsYXZvciBvZiB0aGUgZ2VuZXJpYyBzdGF0ZSB1c2VkCiAgKiAgICAgICAgICAgICAgdG8gc3VwcG9ydCBuZXN0ZWQgSUYvV0hJTEUgY29uc3RydWN0cyBpbiB0aGUgQU1MLgpAQCAtMTE5MCw3ICsxMjA2LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgU3RhdGUgICAgICAgICAgICAgICAtIFRoZSBzdGF0ZSBvYmplY3QgdG8gYmUgZGVsZXRlZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFB1dCBhIHN0YXRlIG9iamVjdCBiYWNrIGludG8gdGhlIGdsb2JhbCBzdGF0ZSBjYWNoZS4gIFRoZSBvYmplY3QKICAqICAgICAgICAgICAgICBpcyBub3QgYWN0dWFsbHkgZnJlZWQgYXQgdGhpcyB0aW1lLgpAQCAtMTIxNiw3ICsxMjMyLDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgTm9uZQogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBOb25lCiAgKgogICogREVTQ1JJUFRJT046IFB1cmdlIHRoZSBnbG9iYWwgc3RhdGUgb2JqZWN0IGNhY2hlLiAgVXNlZCBkdXJpbmcgc3Vic3lzdGVtCiAgKiAgICAgICAgICAgICAgdGVybWluYXRpb24uCkBAIC0xMjQwLDcgKzEyNTYsMTAgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF93YWxrX3BhY2thZ2VfdHJlZQogICoKLSAqIFBBUkFNRVRFUlM6ICBvYmpfZGVzYyAgICAgICAgLSBUaGUgUGFja2FnZSBvYmplY3Qgb24gd2hpY2ggdG8gcmVzb2x2ZSByZWZzCisgKiBQQVJBTUVURVJTOiAgc291cmNlX29iamVjdCAgICAgICAtIFRoZSBwYWNrYWdlIHRvIHdhbGsKKyAqICAgICAgICAgICAgICB0YXJnZXRfb2JqZWN0ICAgICAgIC0gVGFyZ2V0IG9iamVjdCAoaWYgcGFja2FnZSBpcyBiZWluZyBjb3BpZWQpCisgKiAgICAgICAgICAgICAgd2Fsa19jYWxsYmFjayAgICAgICAtIENhbGxlZCBvbmNlIGZvciBlYWNoIHBhY2thZ2UgZWxlbWVudAorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAgICAgLSBQYXNzZWQgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTEzNTksNyArMTM3OCw3IEBACiAgKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgIC0gQnVmZmVyIHRvIGJlIHNjYW5uZWQKICAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgLSBudW1iZXIgb2YgYnl0ZXMgdG8gZXhhbWluZQogICoKLSAqIFJFVFVSTjogICAgICBjaGVja3N1bQorICogUkVUVVJOOiAgICAgIFRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0KICAqCiAgKiBERVNDUklQVElPTjogR2VuZXJhdGUgYSBjaGVja3N1bSBvbiBhIHJhdyBidWZmZXIKICAqCkBAIC0xNDQyLDcgKzE0NjEsNiBAQAogICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRCAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICAgICAgIC0gRXJyb3IgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTQ1Nyw3ICsxNDc1LDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZCkKIHsKIAotCiAJYWNwaV9vc19wcmludGYgKCIlOHMtJTA0ZDogKioqIEVycm9yOiAiLCBtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOwogfQogCkBAIC0xNDY5LDcgKzE0ODYsNiBAQAogICogUEFSQU1FVEVSUzogIG1vZHVsZV9uYW1lICAgICAgICAgLSBDYWxsZXIncyBtb2R1bGUgbmFtZSAoZm9yIGVycm9yIG91dHB1dCkKICAqICAgICAgICAgICAgICBsaW5lX251bWJlciAgICAgICAgIC0gQ2FsbGVyJ3MgbGluZSBudW1iZXIgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENhbGxlcidzIGNvbXBvbmVudCBJRCAoZm9yIGVycm9yIG91dHB1dCkKLSAqICAgICAgICAgICAgICBNZXNzYWdlICAgICAgICAgICAgIC0gRXJyb3IgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZQogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgpAQCAtMTQ5NSw3ICsxNTExLDYgQEAKICAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCiAgKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQogICogICAgICAgICAgICAgIGNvbXBvbmVudF9pZCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgTWVzc2FnZSAgICAgICAgICAgICAtIEVycm9yIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYwppbmRleCA5ZWU0MGE0Li5jZDM4OTliOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYwpAQCAtNTAsNiArNTAsMjUgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwogCSBBQ1BJX01PRFVMRV9OQU1FICAgICgidXRvYmplY3QiKQogCisvKiBMb2NhbCBwcm90b3R5cGVzICovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCisJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7CisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqLAorCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgKm9ial9sZW5ndGgpOworCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoICgKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCisJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02MCw3ICs3OSw3IEBACiAgKiAgICAgICAgICAgICAgY29tcG9uZW50X2lkICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgogICogICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgLSBBQ1BJIFR5cGUgb2YgdGhlIG5ldyBvYmplY3QKICAqCi0gKiBSRVRVUk46ICAgICAgT2JqZWN0ICAgICAgICAgICAgICAtIFRoZSBuZXcgb2JqZWN0LiAgTnVsbCBvbiBmYWlsdXJlCisgKiBSRVRVUk46ICAgICAgQSBuZXcgaW50ZXJuYWwgb2JqZWN0LCBudWxsIG9uIGZhaWx1cmUKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IGludGVybmFsIG9iamVjdC4KICAqCkBAIC04Myw3ICsxMDIsOCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNlY29uZF9vYmplY3Q7CiAKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSICgidXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmciLCBhY3BpX3V0X2dldF90eXBlX25hbWUgKHR5cGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUiAoInV0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3RfZGJnIiwKKwkJYWNwaV91dF9nZXRfdHlwZV9uYW1lICh0eXBlKSk7CiAKIAogCS8qIEFsbG9jYXRlIHRoZSByYXcgb2JqZWN0IGRlc2NyaXB0b3IgKi8KQEAgLTk5LDcgKzExOSw4IEBACiAKIAkJLyogVGhlc2UgdHlwZXMgcmVxdWlyZSBhIHNlY29uZGFyeSBvYmplY3QgKi8KIAotCQlzZWNvbmRfb2JqZWN0ID0gYWNwaV91dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmcgKG1vZHVsZV9uYW1lLCBsaW5lX251bWJlciwgY29tcG9uZW50X2lkKTsKKwkJc2Vjb25kX29iamVjdCA9IGFjcGlfdXRfYWxsb2NhdGVfb2JqZWN0X2Rlc2NfZGJnIChtb2R1bGVfbmFtZSwKKwkJCQkgICBsaW5lX251bWJlciwgY29tcG9uZW50X2lkKTsKIAkJaWYgKCFzZWNvbmRfb2JqZWN0KSB7CiAJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyAob2JqZWN0KTsKIAkJCXJldHVybl9QVFIgKE5VTEwpOwpAQCAtMTM4LDcgKzE1OSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIGJ1ZmZlcl9zaXplICAgICAgICAgICAgLSBTaXplIG9mIGJ1ZmZlciB0byBiZSBjcmVhdGVkCiAgKgotICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgQnVmZmVyIG9iamVjdAorICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgQnVmZmVyIG9iamVjdCwgbnVsbCBvbiBmYWlsdXJlCiAgKgogICogREVTQ1JJUFRJT046IENyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkIGJ1ZmZlciBvYmplY3QKICAqCkBAIC0xOTIsOSArMjEzLDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9jcmVhdGVfc3RyaW5nX29iamVjdAogICoKLSAqIFBBUkFNRVRFUlM6ICBzdHJpbmdfc2l6ZSAgICAgICAgICAgIC0gU2l6ZSBvZiBzdHJpbmcgdG8gYmUgY3JlYXRlZC4gIERvZXMgbm90Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgTlVMTCB0ZXJtaW5hdG9yLCB0aGlzIGlzIGFkZGVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuCisgKiBQQVJBTUVURVJTOiAgc3RyaW5nX3NpemUgICAgICAgICAtIFNpemUgb2Ygc3RyaW5nIHRvIGJlIGNyZWF0ZWQuIERvZXMgbm90CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgTlVMTCB0ZXJtaW5hdG9yLCB0aGlzIGlzIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkuCiAgKgogICogUkVUVVJOOiAgICAgIFBvaW50ZXIgdG8gYSBuZXcgU3RyaW5nIG9iamVjdAogICoKQEAgLTI0OSw3ICsyNzAsOSBAQAogICoKICAqIFBBUkFNRVRFUlM6ICBPYmplY3QgICAgICAgICAgICAgIC0gT2JqZWN0IHRvIGJlIHZhbGlkYXRlZAogICoKLSAqIFJFVFVSTjogICAgICBWYWxpZGF0ZSBhIHBvaW50ZXIgdG8gYmUgYW4gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdAorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgb2JqZWN0IGlzIHZhbGlkLCBGQUxTRSBvdGhlcndpc2UKKyAqCisgKiBERVNDUklQVElPTjogVmFsaWRhdGUgYSBwb2ludGVyIHRvIGJlIGFuIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zOTksOCArNDIyLDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9vYmplY3QgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIGV4YW1pbmluZwotICogICAgICAgICAgICAgICpvYmpfbGVuZ3RoICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCisgKiBQQVJBTUVURVJTOiAgaW50ZXJuYWxfb2JqZWN0ICAgIC0gQW4gQUNQSSBvcGVyYW5kIG9iamVjdAorICogICAgICAgICAgICAgIG9ial9sZW5ndGggICAgICAgICAtIFdoZXJlIHRoZSBsZW5ndGggaXMgcmV0dXJuZWQKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDEyLDcgKzQzNSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKK3N0YXRpYyBhY3BpX3N0YXR1cwogYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICppbnRlcm5hbF9vYmplY3QsCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCkKQEAgLTQyNCw4ICs0NDcsMTAgQEAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUiAoInV0X2dldF9zaW1wbGVfb2JqZWN0X3NpemUiLCBpbnRlcm5hbF9vYmplY3QpOwogCiAKLQkvKiBIYW5kbGUgYSBudWxsIG9iamVjdCAoQ291bGQgYmUgYSB1bmluaXRpYWxpemVkIHBhY2thZ2UgZWxlbWVudCAtLSB3aGljaCBpcyBsZWdhbCkgKi8KLQorCS8qCisJICogSGFuZGxlIGEgbnVsbCBvYmplY3QgKENvdWxkIGJlIGEgdW5pbml0aWFsaXplZCBwYWNrYWdlCisJICogZWxlbWVudCAtLSB3aGljaCBpcyBsZWdhbCkKKwkgKi8KIAlpZiAoIWludGVybmFsX29iamVjdCkgewogCQkqb2JqX2xlbmd0aCA9IDA7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyAoQUVfT0spOwpAQCAtNDgwLDcgKzUwNSw4IEBACiAJCQkgKiBHZXQgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gdGhpcyBvYmplY3QuCiAJCQkgKiBUaGUgcmVmZXJlbmNlIHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBwYXRobmFtZSB0byB0aGUgb2JqZWN0CiAJCQkgKi8KLQkJCWxlbmd0aCArPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEIChhY3BpX25zX2dldF9wYXRobmFtZV9sZW5ndGggKGludGVybmFsX29iamVjdC0+cmVmZXJlbmNlLm5vZGUpKTsKKwkJCWxlbmd0aCArPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEICgKKwkJCQkJIGFjcGlfbnNfZ2V0X3BhdGhuYW1lX2xlbmd0aCAoaW50ZXJuYWxfb2JqZWN0LT5yZWZlcmVuY2Uubm9kZSkpOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTUzMCw3ICs1NTYsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfZ2V0X2VsZW1lbnRfbGVuZ3RoICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCkBAIC01ODIsOCArNjA4LDggQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV91dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZQogICoKLSAqIFBBUkFNRVRFUlM6ICAqaW50ZXJuYWxfb2JqZWN0ICAgIC0gUG9pbnRlciB0byB0aGUgb2JqZWN0IHdlIGFyZSBleGFtaW5pbmcKLSAqICAgICAgICAgICAgICAqb2JqX2xlbmd0aCAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCBpcyByZXR1cm5lZAorICogUEFSQU1FVEVSUzogIGludGVybmFsX29iamVjdCAgICAgLSBBbiBBQ1BJIGludGVybmFsIG9iamVjdAorICogICAgICAgICAgICAgIG9ial9sZW5ndGggICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTU5NSw3ICs2MjEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWFjcGlfc3RhdHVzCitzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfdXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKQpAQCAtNjM2LDggKzY2Miw4IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZ2V0X29iamVjdF9zaXplCiAgKgotICogUEFSQU1FVEVSUzogICppbnRlcm5hbF9vYmplY3QgICAgLSBQb2ludGVyIHRvIHRoZSBvYmplY3Qgd2UgYXJlIGV4YW1pbmluZwotICogICAgICAgICAgICAgICpvYmpfbGVuZ3RoICAgICAgICAgLSBXaGVyZSB0aGUgbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBpbnRlcm5hbF9vYmplY3QgICAgIC0gQW4gQUNQSSBpbnRlcm5hbCBvYmplY3QKKyAqICAgICAgICAgICAgICBvYmpfbGVuZ3RoICAgICAgICAgIC0gV2hlcmUgdGhlIGxlbmd0aCB3aWxsIGJlIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTY0Nyw3ICs2NzMsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfZ2V0X29iamVjdF9zaXplKAorYWNwaV91dF9nZXRfb2JqZWN0X3NpemUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmludGVybmFsX29iamVjdCwKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgICpvYmpfbGVuZ3RoKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwppbmRleCA5N2E5MWYzLi5lODgwM2Q4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0eGZhY2UuYwpAQCAtNzMsNiArNzMsNyBAQAogewogCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogCisKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFICgiYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSIpOwogCiAKQEAgLTEwNSw3ICsxMDYsNiBAQAogCSAqIEluaXRpYWxpemUgdGhlIG5hbWVzcGFjZSBtYW5hZ2VyIGFuZAogCSAqIHRoZSByb290IG9mIHRoZSBuYW1lc3BhY2UgdHJlZQogCSAqLwotCiAJc3RhdHVzID0gYWNwaV9uc19yb290X2luaXRpYWxpemUgKCk7CiAJaWYgKEFDUElfRkFJTFVSRSAoc3RhdHVzKSkgewogCQlBQ1BJX1JFUE9SVF9FUlJPUiAoKCJOYW1lc3BhY2UgaW5pdGlhbGl6YXRpb24gZmFpbHVyZSwgJXNcbiIsCkBAIC0xMTMsNyArMTEzLDYgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTIChzdGF0dXMpOwogCX0KIAotCiAJLyogSWYgY29uZmlndXJlZCwgaW5pdGlhbGl6ZSB0aGUgQU1MIGRlYnVnZ2VyICovCiAKIAlBQ1BJX0RFQlVHR0VSX0VYRUMgKHN0YXR1cyA9IGFjcGlfZGJfaW5pdGlhbGl6ZSAoKSk7CkBAIC0xNTAsNyArMTQ5LDggQEAKIAkgKiBUaGUgdmFsdWVzIGZyb20gdGhlIEZBRFQgYXJlIHZhbGlkYXRlZCBoZXJlLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19IQVJEV0FSRV9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIGhhcmR3YXJlXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIGhhcmR3YXJlXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9od19pbml0aWFsaXplICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0xNzgsNyArMTc4LDggQEAKIAkgKiBpbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciBpbnRlcmZhY2UuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FERFJFU1NfU1BBQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBJbnN0YWxsaW5nIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBoYW5kbGVyc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBJbnN0YWxsaW5nIGRlZmF1bHQgYWRkcmVzcyBzcGFjZSBoYW5kbGVyc1xuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnMgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTE4OSwxMiArMTkwLDE0IEBACiAJLyoKIAkgKiBJbml0aWFsaXplIEFDUEkgRXZlbnQgaGFuZGxpbmcgKEZpeGVkIGFuZCBHZW5lcmFsIFB1cnBvc2UpCiAJICoKLQkgKiBOT1RFOiBXZSBtdXN0IGhhdmUgdGhlIGhhcmR3YXJlIEFORCBldmVudHMgaW5pdGlhbGl6ZWQgYmVmb3JlIHdlIGNhbiBleGVjdXRlCi0JICogQU5ZIGNvbnRyb2wgbWV0aG9kcyBTQUZFTFkuICBBbnkgY29udHJvbCBtZXRob2QgY2FuIHJlcXVpcmUgQUNQSSBoYXJkd2FyZQotCSAqIHN1cHBvcnQsIHNvIHRoZSBoYXJkd2FyZSBNVVNUIGJlIGluaXRpYWxpemVkIGJlZm9yZSBleGVjdXRpb24hCisJICogTk9URTogV2UgbXVzdCBoYXZlIHRoZSBoYXJkd2FyZSBBTkQgZXZlbnRzIGluaXRpYWxpemVkIGJlZm9yZSB3ZSBjYW4KKwkgKiBleGVjdXRlIEFOWSBjb250cm9sIG1ldGhvZHMgU0FGRUxZLiAgQW55IGNvbnRyb2wgbWV0aG9kIGNhbiByZXF1aXJlCisJICogQUNQSSBoYXJkd2FyZSBzdXBwb3J0LCBzbyB0aGUgaGFyZHdhcmUgTVVTVCBiZSBpbml0aWFsaXplZCBiZWZvcmUKKwkgKiBleGVjdXRpb24hCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0VWRU5UX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgZXZlbnRzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIEluaXRpYWxpemluZyBBQ1BJIGV2ZW50c1xuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9ldmVudHMgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTIwNSw3ICsyMDgsOCBAQAogCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyIGFuZCBHbG9iYWwgTG9jayBoYW5kbGVyICovCiAKIAlpZiAoIShmbGFncyAmIEFDUElfTk9fSEFORExFUl9JTklUKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLCAiW0luaXRdIEluc3RhbGxpbmcgU0NJL0dMIGhhbmRsZXJzXG4iKSk7CisJCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsCisJCQkiW0luaXRdIEluc3RhbGxpbmcgU0NJL0dMIGhhbmRsZXJzXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yNDcsNyArMjUxLDggQEAKIAkgKiBjb250YWluIGV4ZWN1dGFibGUgQU1MIChzZWUgY2FsbCB0byBhY3BpX25zX2luaXRpYWxpemVfb2JqZWN0cyBiZWxvdykuCiAJICovCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX05PX0FERFJFU1NfU1BBQ0VfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBFeGVjdXRpbmcgX1JFRyBvcF9yZWdpb24gbWV0aG9kc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBFeGVjdXRpbmcgX1JFRyBvcF9yZWdpb24gbWV0aG9kc1xuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yNjEsNyArMjY2LDggQEAKIAkgKiBvYmplY3RzOiBvcGVyYXRpb25fcmVnaW9ucywgYnVmZmVyX2ZpZWxkcywgQnVmZmVycywgYW5kIFBhY2thZ2VzLgogCSAqLwogCWlmICghKGZsYWdzICYgQUNQSV9OT19PQkpFQ1RfSU5JVCkpIHsKLQkJQUNQSV9ERUJVR19QUklOVCAoKEFDUElfREJfRVhFQywgIltJbml0XSBDb21wbGV0aW5nIEluaXRpYWxpemF0aW9uIG9mIEFDUEkgT2JqZWN0c1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBDb21wbGV0aW5nIEluaXRpYWxpemF0aW9uIG9mIEFDUEkgT2JqZWN0c1xuIikpOwogCiAJCXN0YXR1cyA9IGFjcGlfbnNfaW5pdGlhbGl6ZV9vYmplY3RzICgpOwogCQlpZiAoQUNQSV9GQUlMVVJFIChzdGF0dXMpKSB7CkBAIC0yNzQsNyArMjgwLDggQEAKIAkgKiBUaGlzIHJ1bnMgdGhlIF9TVEEgYW5kIF9JTkkgbWV0aG9kcy4KIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fREVWSUNFX0lOSVQpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQgKChBQ1BJX0RCX0VYRUMsICJbSW5pdF0gSW5pdGlhbGl6aW5nIEFDUEkgRGV2aWNlc1xuIikpOworCQlBQ1BJX0RFQlVHX1BSSU5UICgoQUNQSV9EQl9FWEVDLAorCQkJIltJbml0XSBJbml0aWFsaXppbmcgQUNQSSBEZXZpY2VzXG4iKSk7CiAKIAkJc3RhdHVzID0gYWNwaV9uc19pbml0aWFsaXplX2RldmljZXMgKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUgKHN0YXR1cykpIHsKQEAgLTMwNyw3ICszMTQsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdGVybWluYXRlICh2b2lkKQorYWNwaV90ZXJtaW5hdGUgKAorCXZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgICAgICAgICAgICAgICAgIHN0YXR1czsKIApAQCAtMzQ0LDggKzM1Miw3IEBACiAKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9zdWJzeXN0ZW1fc3RhdHVzCiAgKgpAQCAtMzU0LDE0ICszNjEsMTYgQEAKICAqIFJFVFVSTjogICAgICBTdGF0dXMgb2YgdGhlIEFDUEkgc3Vic3lzdGVtCiAgKgogICogREVTQ1JJUFRJT046IE90aGVyIGRyaXZlcnMgdGhhdCB1c2UgdGhlIEFDUEkgc3Vic3lzdGVtIHNob3VsZCBjYWxsIHRoaXMKLSAqICAgICAgICAgICAgICBiZWZvcmUgbWFraW5nIGFueSBvdGhlciBjYWxscywgdG8gZW5zdXJlIHRoZSBzdWJzeXN0ZW0gaW5pdGlhbC0KLSAqICAgICAgICAgICAgICBpemVkIHN1Y2Nlc3NmdWxseS4KKyAqICAgICAgICAgICAgICBiZWZvcmUgbWFraW5nIGFueSBvdGhlciBjYWxscywgdG8gZW5zdXJlIHRoZSBzdWJzeXN0ZW0KKyAqICAgICAgICAgICAgICBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCiAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9zdWJzeXN0ZW1fc3RhdHVzICh2b2lkKQorYWNwaV9zdWJzeXN0ZW1fc3RhdHVzICgKKwl2b2lkKQogeworCiAJaWYgKGFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3MgJiBBQ1BJX0lOSVRJQUxJWkVEX09LKSB7CiAJCXJldHVybiAoQUVfT0spOwogCX0KQEAgLTM3MSwxMyArMzgwLDEyIEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfc3lzdGVtX2luZm8KICAqCi0gKiBQQVJBTUVURVJTOiAgb3V0X2J1ZmZlciAgICAgIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIGZvciB0aGUgZGV2aWNlCi0gKiAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCAgIC0gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlcgorICogUEFSQU1FVEVSUzogIG91dF9idWZmZXIgICAgICAtIEEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHJlc291cmNlcyBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cyAgICAgICAgICAtIHRoZSBzdGF0dXMgb2YgdGhlIGNhbGwKICAqCkBAIC0zOTUsOCArNDAzLDggQEAKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpvdXRfYnVmZmVyKQogewogCXN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICAgICAgICAgKmluZm9fcHRyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsKIAlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CiAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX2dldF9zeXN0ZW1faW5mbyIpOwpAQCAtNDY2LDYgKzQ3NCw3IEBACiAgKiBGVU5DVElPTjogICAgYWNwaV9pbnN0YWxsX2luaXRpYWxpemF0aW9uX2hhbmRsZXIKICAqCiAgKiBQQVJBTUVURVJTOiAgSGFuZGxlciAgICAgICAgICAgICAtIENhbGxiYWNrIHByb2NlZHVyZQorICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBOb3QgKGN1cnJlbnRseSkgdXNlZCwgc2VlIGJlbG93CiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQ5NSw3ICs1MDQsNiBAQAogCiAjZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cwpAQCAtNTA5LDcgKzUxNyw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMgKHZvaWQpCithY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzICgKKwl2b2lkKQogewogCUFDUElfRlVOQ1RJT05fVFJBQ0UgKCJhY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggNzFmYTEwMS4uMmNmMjY0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMKKysrIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKQEAgLTU2NCwxMiArNTY0LDEzIEBACiAJCWludCBjb3VudCA9IDA7CiAJCXVuaW9uIGFjcGlfb2JqZWN0ICpvOwogCQkKLQkJYnIgPSBrbWFsbG9jKHNpemVvZiAmYnIsIEdGUF9LRVJORUwpOworCQliciA9IGttYWxsb2Moc2l6ZW9mKCpiciksIEdGUF9LRVJORUwpOwogCQlpZiAoIWJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCX0gZWxzZSB7Ci0JCQltZW1zZXQoYnIsIDAsIHNpemVvZiAmYnIpOwotCQkJYnItPmxldmVscyA9IGttYWxsb2Mob2JqLT5wYWNrYWdlLmNvdW50ICogc2l6ZW9mICZici0+bGV2ZWxzLCBHRlBfS0VSTkVMKTsKKwkJCW1lbXNldChiciwgMCwgc2l6ZW9mKCpicikpOworCQkJYnItPmxldmVscyA9IGttYWxsb2Mob2JqLT5wYWNrYWdlLmNvdW50ICoKKwkJCQkJc2l6ZW9mICooYnItPmxldmVscyksIEdGUF9LRVJORUwpOwogCQkJaWYgKCFici0+bGV2ZWxzKQogCQkJCWdvdG8gb3V0OwogCkBAIC01ODQsOCArNTg1LDcgQEAKIAkJCX0KIG91dDoKIAkJCWlmIChjb3VudCA8IDIpIHsKLQkJCQlpZiAoYnItPmxldmVscykKLQkJCQkJa2ZyZWUoYnItPmxldmVscyk7CisJCQkJa2ZyZWUoYnItPmxldmVscyk7CiAJCQkJa2ZyZWUoYnIpOwogCQkJfSBlbHNlIHsKIAkJCQlici0+Y291bnQgPSBjb3VudDsKQEAgLTU5NSw4ICs1OTUsNyBAQAogCQl9CiAJfQogCi0JaWYgKG9iaikKLQkJa2ZyZWUob2JqKTsKKwlrZnJlZShvYmopOwogCiAJcmV0dXJuX1ZPSUQ7CiB9CkBAIC0xNTg1LDcgKzE1ODQsNyBAQAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fc3dpdGNoX291dHB1dCIpOwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZ2aWRlby0+dmlkZW9fZGV2aWNlX2xpc3QpIHsKLQkJc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlICogZGV2ID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSwgZW50cnkpOworCQlkZXYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfdmlkZW9fZGV2aWNlLCBlbnRyeSk7CiAJCXN0YXR1cyA9IGFjcGlfdmlkZW9fZGV2aWNlX2dldF9zdGF0ZShkZXYsICZzdGF0ZSk7CiAJCWlmIChzdGF0ZSAmIDB4Mil7CiAJCQlkZXZfbmV4dCA9IGNvbnRhaW5lcl9vZihub2RlLT5uZXh0LCBzdHJ1Y3QgYWNwaV92aWRlb19kZXZpY2UsIGVudHJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9iYXNlLmggYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCmluZGV4IDY0NWY2MjY5Li43ODM3NTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYmFzZS5oCisrKyBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKQEAgLTUsNiArNSw3IEBACiBleHRlcm4gdm9pZCBidXNfcmVtb3ZlX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqKTsKIAogZXh0ZXJuIHZvaWQgZHJpdmVyX2RldGFjaChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydik7CitleHRlcm4gaW50IGRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgc3RydWN0IGRldmljZSAqKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY2xhc3NfZGV2aWNlICp0b19jbGFzc19kZXYoc3RydWN0IGtvYmplY3QgKm9iaikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9idXMuYyBiL2RyaXZlcnMvYmFzZS9idXMuYwppbmRleCBjM2ZhYzdmLi45NmZlMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvYnVzLmMKKysrIGIvZHJpdmVycy9iYXNlL2J1cy5jCkBAIC0xMzMsNiArMTMzLDU4IEBACiBkZWNsX3N1YnN5cyhidXMsICZrdHlwZV9idXMsIE5VTEwpOwogCiAKKy8qIE1hbnVhbGx5IGRldGFjaCBhIGRldmljZSBmcm9tIGl0J3MgYXNzb2NpYXRlZCBkcml2ZXIuICovCitzdGF0aWMgaW50IGRyaXZlcl9oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhOworCisJaWYgKHN0cmNtcChuYW1lLCBkZXYtPmJ1c19pZCkgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRyaXZlcl91bmJpbmQoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGJ1c190eXBlICpidXMgPSBnZXRfYnVzKGRydi0+YnVzKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGVyciA9IC1FTk9ERVY7CisKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoYnVzLCBOVUxMLCAodm9pZCAqKWJ1ZiwgZHJpdmVyX2hlbHBlcik7CisJaWYgKChkZXYpICYmCisJICAgIChkZXYtPmRyaXZlciA9PSBkcnYpKSB7CisJCWRldmljZV9yZWxlYXNlX2RyaXZlcihkZXYpOworCQllcnIgPSBjb3VudDsKKwl9CisJcmV0dXJuIGVycjsKK30KK3N0YXRpYyBEUklWRVJfQVRUUih1bmJpbmQsIFNfSVdVU1IsIE5VTEwsIGRyaXZlcl91bmJpbmQpOworCisvKgorICogTWFudWFsbHkgYXR0YWNoIGEgZGV2aWNlIHRvIGEgZHJpdmVyLgorICogTm90ZTogdGhlIGRyaXZlciBtdXN0IHdhbnQgdG8gYmluZCB0byB0aGUgZGV2aWNlLAorICogaXQgaXMgbm90IHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBkcml2ZXIncyBpZCB0YWJsZS4KKyAqLworc3RhdGljIHNzaXplX3QgZHJpdmVyX2JpbmQoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBidXNfdHlwZSAqYnVzID0gZ2V0X2J1cyhkcnYtPmJ1cyk7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBlcnIgPSAtRU5PREVWOworCisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKGJ1cywgTlVMTCwgKHZvaWQgKilidWYsIGRyaXZlcl9oZWxwZXIpOworCWlmICgoZGV2KSAmJgorCSAgICAoZGV2LT5kcml2ZXIgPT0gTlVMTCkpIHsKKwkJZG93bigmZGV2LT5zZW0pOworCQllcnIgPSBkcml2ZXJfcHJvYmVfZGV2aWNlKGRydiwgZGV2KTsKKwkJdXAoJmRldi0+c2VtKTsKKwkJcHV0X2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gZXJyOworfQorc3RhdGljIERSSVZFUl9BVFRSKGJpbmQsIFNfSVdVU1IsIE5VTEwsIGRyaXZlcl9iaW5kKTsKKworCiBzdGF0aWMgc3RydWN0IGRldmljZSAqIG5leHRfZGV2aWNlKHN0cnVjdCBrbGlzdF9pdGVyICogaSkKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4gPSBrbGlzdF9uZXh0KGkpOwpAQCAtMTc3LDYgKzIyOSwzOSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorLyoqCisgKiBidXNfZmluZF9kZXZpY2UgLSBkZXZpY2UgaXRlcmF0b3IgZm9yIGxvY2F0aW5nIGEgcGFydGljdWxhciBkZXZpY2UuCisgKiBAYnVzOiBidXMgdHlwZQorICogQHN0YXJ0OiBEZXZpY2UgdG8gYmVnaW4gd2l0aAorICogQGRhdGE6IERhdGEgdG8gcGFzcyB0byBtYXRjaCBmdW5jdGlvbgorICogQG1hdGNoOiBDYWxsYmFjayBmdW5jdGlvbiB0byBjaGVjayBkZXZpY2UKKyAqCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGJ1c19mb3JfZWFjaF9kZXYoKSBmdW5jdGlvbiBhYm92ZSwgYnV0IGl0CisgKiByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZGV2aWNlIHRoYXQgaXMgJ2ZvdW5kJyBmb3IgbGF0ZXIgdXNlLCBhcworICogZGV0ZXJtaW5lZCBieSB0aGUgQG1hdGNoIGNhbGxiYWNrLgorICoKKyAqIFRoZSBjYWxsYmFjayBzaG91bGQgcmV0dXJuIDAgaWYgdGhlIGRldmljZSBkb2Vzbid0IG1hdGNoIGFuZCBub24temVybworICogaWYgaXQgZG9lcy4gIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIG5vbi16ZXJvLCB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqIHJldHVybiB0byB0aGUgY2FsbGVyIGFuZCBub3QgaXRlcmF0ZSBvdmVyIGFueSBtb3JlIGRldmljZXMuCisgKi8KK3N0cnVjdCBkZXZpY2UgKiBidXNfZmluZF9kZXZpY2Uoc3RydWN0IGJ1c190eXBlICpidXMsCisJCQkJc3RydWN0IGRldmljZSAqc3RhcnQsIHZvaWQgKmRhdGEsCisJCQkJaW50ICgqbWF0Y2gpKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSkKK3sKKwlzdHJ1Y3Qga2xpc3RfaXRlciBpOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWlmICghYnVzKQorCQlyZXR1cm4gTlVMTDsKKworCWtsaXN0X2l0ZXJfaW5pdF9ub2RlKCZidXMtPmtsaXN0X2RldmljZXMsICZpLAorCQkJICAgICAoc3RhcnQgPyAmc3RhcnQtPmtub2RlX2J1cyA6IE5VTEwpKTsKKwl3aGlsZSAoKGRldiA9IG5leHRfZGV2aWNlKCZpKSkpCisJCWlmIChtYXRjaChkZXYsIGRhdGEpICYmIGdldF9kZXZpY2UoZGV2KSkKKwkJCWJyZWFrOworCWtsaXN0X2l0ZXJfZXhpdCgmaSk7CisJcmV0dXJuIGRldjsKK30KIAogCiBzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgKiBuZXh0X2RyaXZlcihzdHJ1Y3Qga2xpc3RfaXRlciAqIGkpCkBAIC0zNjMsNiArNDQ4LDggQEAKIAkJbW9kdWxlX2FkZF9kcml2ZXIoZHJ2LT5vd25lciwgZHJ2KTsKIAogCQlkcml2ZXJfYWRkX2F0dHJzKGJ1cywgZHJ2KTsKKwkJZHJpdmVyX2NyZWF0ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX3VuYmluZCk7CisJCWRyaXZlcl9jcmVhdGVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl9iaW5kKTsKIAl9CiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMzgwLDYgKzQ2Nyw4IEBACiB2b2lkIGJ1c19yZW1vdmVfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogewogCWlmIChkcnYtPmJ1cykgeworCQlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfYmluZCk7CisJCWRyaXZlcl9yZW1vdmVfZmlsZShkcnYsICZkcml2ZXJfYXR0cl91bmJpbmQpOwogCQlkcml2ZXJfcmVtb3ZlX2F0dHJzKGRydi0+YnVzLCBkcnYpOwogCQlrbGlzdF9yZW1vdmUoJmRydi0+a25vZGVfYnVzKTsKIAkJcHJfZGVidWcoImJ1cyAlczogcmVtb3ZlIGRyaXZlciAlc1xuIiwgZHJ2LT5idXMtPm5hbWUsIGRydi0+bmFtZSk7CkBAIC0zOTQsMzEgKzQ4MywyMiBAQAogLyogSGVscGVyIGZvciBidXNfcmVzY2FuX2RldmljZXMncyBpdGVyICovCiBzdGF0aWMgaW50IGJ1c19yZXNjYW5fZGV2aWNlc19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewotCWludCAqY291bnQgPSBkYXRhOwotCi0JaWYgKCFkZXYtPmRyaXZlciAmJiAoZGV2aWNlX2F0dGFjaChkZXYpID4gMCkpCi0JCSgqY291bnQpKys7Ci0KKwlpZiAoIWRldi0+ZHJpdmVyKQorCQlkZXZpY2VfYXR0YWNoKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKLQogLyoqCi0gKglidXNfcmVzY2FuX2RldmljZXMgLSByZXNjYW4gZGV2aWNlcyBvbiB0aGUgYnVzIGZvciBwb3NzaWJsZSBkcml2ZXJzCi0gKglAYnVzOgl0aGUgYnVzIHRvIHNjYW4uCisgKiBidXNfcmVzY2FuX2RldmljZXMgLSByZXNjYW4gZGV2aWNlcyBvbiB0aGUgYnVzIGZvciBwb3NzaWJsZSBkcml2ZXJzCisgKiBAYnVzOiB0aGUgYnVzIHRvIHNjYW4uCiAgKgotICoJVGhpcyBmdW5jdGlvbiB3aWxsIGxvb2sgZm9yIGRldmljZXMgb24gdGhlIGJ1cyB3aXRoIG5vIGRyaXZlcgotICoJYXR0YWNoZWQgYW5kIHJlc2NhbiBpdCBhZ2FpbnN0IGV4aXN0aW5nIGRyaXZlcnMgdG8gc2VlIGlmIGl0Ci0gKgltYXRjaGVzIGFueS4gQ2FsbHMgZGV2aWNlX2F0dGFjaCgpLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGV2aWNlcwotICoJdGhhdCB3ZXJlIHN1Y2Vzc2Z1bGx5IGJvdW5kIHRvIGEgZHJpdmVyLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGxvb2sgZm9yIGRldmljZXMgb24gdGhlIGJ1cyB3aXRoIG5vIGRyaXZlcgorICogYXR0YWNoZWQgYW5kIHJlc2NhbiBpdCBhZ2FpbnN0IGV4aXN0aW5nIGRyaXZlcnMgdG8gc2VlIGlmIGl0IG1hdGNoZXMKKyAqIGFueSBieSBjYWxsaW5nIGRldmljZV9hdHRhY2goKSBmb3IgdGhlIHVuYm91bmQgZGV2aWNlcy4KICAqLwotaW50IGJ1c19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpCit2b2lkIGJ1c19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpCiB7Ci0JaW50IGNvdW50ID0gMDsKLQotCWJ1c19mb3JfZWFjaF9kZXYoYnVzLCBOVUxMLCAmY291bnQsIGJ1c19yZXNjYW5fZGV2aWNlc19oZWxwZXIpOwotCi0JcmV0dXJuIGNvdW50OworCWJ1c19mb3JfZWFjaF9kZXYoYnVzLCBOVUxMLCBOVUxMLCBidXNfcmVzY2FuX2RldmljZXNfaGVscGVyKTsKIH0KIAogCkBAIC01NTcsNiArNjM3LDcgQEAKIAogCiBFWFBPUlRfU1lNQk9MX0dQTChidXNfZm9yX2VhY2hfZGV2KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJ1c19maW5kX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChidXNfZm9yX2VhY2hfZHJ2KTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoYnVzX2FkZF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggODZkNzk3NTUuLmVmZTAzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJc3RydWN0IGRldmljZSAqIHBhcmVudCA9IGRldi0+cGFyZW50OwogCiAJaWYgKHBhcmVudCkKLQkJa2xpc3RfcmVtb3ZlKCZkZXYtPmtub2RlX3BhcmVudCk7CisJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOwogCiAJLyogTm90aWZ5IHRoZSBwbGF0Zm9ybSBvZiB0aGUgcmVtb3ZhbCwgaW4gY2FzZSB0aGV5CiAJICogbmVlZCB0byBkbyBhbnl0aGluZy4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NwdS5jIGIvZHJpdmVycy9iYXNlL2NwdS5jCmluZGV4IDZlZjMwNjkuLmI3OWJhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jcHUuYworKysgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKQEAgLTE2LDYgKzE2LDExIEBACiBFWFBPUlRfU1lNQk9MKGNwdV9zeXNkZXZfY2xhc3MpOwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitpbnQgX19hdHRyaWJ1dGVfXygod2VhaykpIHNtcF9wcmVwYXJlX2NwdSAoaW50IGNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19vbmxpbmUoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgY2hhciAqYnVmKQogewogCXN0cnVjdCBjcHUgKmNwdSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjcHUsIHN5c2Rldik7CkBAIC0zNiw3ICs0MSwxMSBAQAogCQkJa29iamVjdF9ob3RwbHVnKCZkZXYtPmtvYmosIEtPQkpfT0ZGTElORSk7CiAJCWJyZWFrOwogCWNhc2UgJzEnOgotCQlyZXQgPSBjcHVfdXAoY3B1LT5zeXNkZXYuaWQpOworCQlyZXQgPSBzbXBfcHJlcGFyZV9jcHUoY3B1LT5zeXNkZXYuaWQpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGNwdV91cChjcHUtPnN5c2Rldi5pZCk7CisJCWlmICghcmV0KQorCQkJa29iamVjdF9ob3RwbHVnKCZkZXYtPmtvYmosIEtPQkpfT05MSU5FKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggNmRiM2E3OC4uMTYzMjNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKKysrIGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTY1LDcgKzY1LDcgQEAKICAqCiAgKglUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggQGRldi0+c2VtIGhlbGQuCiAgKi8KLXN0YXRpYyBpbnQgZHJpdmVyX3Byb2JlX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydiwgc3RydWN0IGRldmljZSAqIGRldikKK2ludCBkcml2ZXJfcHJvYmVfZGV2aWNlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2LCBzdHJ1Y3QgZGV2aWNlICogZGV2KQogewogCWludCByZXQgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggMWI2NDU4OC4uMjkxYzU5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtNTYsNiArNTYsNDEgQEAKIAogCiAvKioKKyAqIGRyaXZlcl9maW5kX2RldmljZSAtIGRldmljZSBpdGVyYXRvciBmb3IgbG9jYXRpbmcgYSBwYXJ0aWN1bGFyIGRldmljZS4KKyAqIEBkcml2ZXI6IFRoZSBkZXZpY2UncyBkcml2ZXIKKyAqIEBzdGFydDogRGV2aWNlIHRvIGJlZ2luIHdpdGgKKyAqIEBkYXRhOiBEYXRhIHRvIHBhc3MgdG8gbWF0Y2ggZnVuY3Rpb24KKyAqIEBtYXRjaDogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gY2hlY2sgZGV2aWNlCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKCkgZnVuY3Rpb24gYWJvdmUsIGJ1dAorICogaXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIGRldmljZSB0aGF0IGlzICdmb3VuZCcgZm9yIGxhdGVyIHVzZSwgYXMKKyAqIGRldGVybWluZWQgYnkgdGhlIEBtYXRjaCBjYWxsYmFjay4KKyAqCisgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiAwIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBtYXRjaCBhbmQgbm9uLXplcm8KKyAqIGlmIGl0IGRvZXMuICBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyBub24temVybywgdGhpcyBmdW5jdGlvbiB3aWxsCisgKiByZXR1cm4gdG8gdGhlIGNhbGxlciBhbmQgbm90IGl0ZXJhdGUgb3ZlciBhbnkgbW9yZSBkZXZpY2VzLgorICovCitzdHJ1Y3QgZGV2aWNlICogZHJpdmVyX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsCisJCQkJICAgc3RydWN0IGRldmljZSAqIHN0YXJ0LCB2b2lkICogZGF0YSwKKwkJCQkgICBpbnQgKCptYXRjaCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopKQoreworCXN0cnVjdCBrbGlzdF9pdGVyIGk7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJaWYgKCFkcnYpCisJCXJldHVybiBOVUxMOworCisJa2xpc3RfaXRlcl9pbml0X25vZGUoJmRydi0+a2xpc3RfZGV2aWNlcywgJmksCisJCQkgICAgIChzdGFydCA/ICZzdGFydC0+a25vZGVfZHJpdmVyIDogTlVMTCkpOworCXdoaWxlICgoZGV2ID0gbmV4dF9kZXZpY2UoJmkpKSkKKwkJaWYgKG1hdGNoKGRldiwgZGF0YSkgJiYgZ2V0X2RldmljZShkZXYpKQorCQkJYnJlYWs7CisJa2xpc3RfaXRlcl9leGl0KCZpKTsKKwlyZXR1cm4gZGV2OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZHJpdmVyX2ZpbmRfZGV2aWNlKTsKKworLyoqCiAgKglkcml2ZXJfY3JlYXRlX2ZpbGUgLSBjcmVhdGUgc3lzZnMgZmlsZSBmb3IgZHJpdmVyLgogICoJQGRydjoJZHJpdmVyLgogICoJQGF0dHI6CWRyaXZlciBhdHRyaWJ1dGUgZGVzY3JpcHRvci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKaW5kZXggOTdmZTEzZi4uNjUyMjgxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKQEAgLTc0LDYgKzc0LDggQEAKIGZpcm13YXJlX3RpbWVvdXRfc3RvcmUoc3RydWN0IGNsYXNzICpjbGFzcywgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJbG9hZGluZ190aW1lb3V0ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlpZiAobG9hZGluZ190aW1lb3V0IDwgMCkKKwkJbG9hZGluZ190aW1lb3V0ID0gMDsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTEzOCw2ICsxNDAsMTAgQEAKIAlzd2l0Y2ggKGxvYWRpbmcpIHsKIAljYXNlIDE6CiAJCWRvd24oJmZ3X2xvY2spOworCQlpZiAoIWZ3X3ByaXYtPmZ3KSB7CisJCQl1cCgmZndfbG9jayk7CisJCQlicmVhazsKKwkJfQogCQl2ZnJlZShmd19wcml2LT5mdy0+ZGF0YSk7CiAJCWZ3X3ByaXYtPmZ3LT5kYXRhID0gTlVMTDsKIAkJZndfcHJpdi0+ZnctPnNpemUgPSAwOwpAQCAtMTc4LDcgKzE4NCw3IEBACiAKIAlkb3duKCZmd19sb2NrKTsKIAlmdyA9IGZ3X3ByaXYtPmZ3OwotCWlmICh0ZXN0X2JpdChGV19TVEFUVVNfRE9ORSwgJmZ3X3ByaXYtPnN0YXR1cykpIHsKKwlpZiAoIWZ3IHx8IHRlc3RfYml0KEZXX1NUQVRVU19ET05FLCAmZndfcHJpdi0+c3RhdHVzKSkgewogCQlyZXRfY291bnQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMzgsOSArMjQ0LDEwIEBACiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCXJldHVybiAtRVBFUk07CisKIAlkb3duKCZmd19sb2NrKTsKIAlmdyA9IGZ3X3ByaXYtPmZ3OwotCWlmICh0ZXN0X2JpdChGV19TVEFUVVNfRE9ORSwgJmZ3X3ByaXYtPnN0YXR1cykpIHsKKwlpZiAoIWZ3IHx8IHRlc3RfYml0KEZXX1NUQVRVU19ET05FLCAmZndfcHJpdi0+c3RhdHVzKSkgewogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MTgsNyArNDI1LDcgQEAKIAogCWZ3X3ByaXYgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOwogCi0JaWYgKGxvYWRpbmdfdGltZW91dCkgeworCWlmIChsb2FkaW5nX3RpbWVvdXQgPiAwKSB7CiAJCWZ3X3ByaXYtPnRpbWVvdXQuZXhwaXJlcyA9IGppZmZpZXMgKyBsb2FkaW5nX3RpbWVvdXQgKiBIWjsKIAkJYWRkX3RpbWVyKCZmd19wcml2LT50aW1lb3V0KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvc3lzLmMgYi9kcml2ZXJzL2Jhc2Uvc3lzLmMKaW5kZXggZjM3YTEzZC4uMjE0Yjk2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3N5cy5jCisrKyBiL2RyaXZlcnMvYmFzZS9zeXMuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAKLQogZXh0ZXJuIHN0cnVjdCBzdWJzeXN0ZW0gZGV2aWNlc19zdWJzeXM7CiAKICNkZWZpbmUgdG9fc3lzZGV2KGspIGNvbnRhaW5lcl9vZihrLCBzdHJ1Y3Qgc3lzX2RldmljZSwga29iaikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYXMtaW9zY2hlZC5jIGIvZHJpdmVycy9ibG9jay9hcy1pb3NjaGVkLmMKaW5kZXggMzQxMGI0ZC4uOTFhZWI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hcy1pb3NjaGVkLmMKKysrIGIvZHJpdmVycy9ibG9jay9hcy1pb3NjaGVkLmMKQEAgLTE4MDYsNyArMTgwNiw4IEBACiAJcnEtPmVsZXZhdG9yX3ByaXZhdGUgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IGFzX3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZ2ZwX21hc2spCitzdGF0aWMgaW50IGFzX3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJICBzdHJ1Y3QgYmlvICpiaW8sIGludCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgYXNfZGF0YSAqYWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgYXNfcnEgKmFycSA9IG1lbXBvb2xfYWxsb2MoYWQtPmFycV9wb29sLCBnZnBfbWFzayk7CkBAIC0xODI3LDcgKzE4MjgsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGFzX21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydykKK3N0YXRpYyBpbnQgYXNfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJaW50IHJldCA9IEVMVl9NUVVFVUVfTUFZOwogCXN0cnVjdCBhc19kYXRhICphZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzcy5jIGIvZHJpdmVycy9ibG9jay9jY2lzcy5jCmluZGV4IGFiZGUyNzAuLjNlOWZiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY2Npc3MuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogICAgRGlzayBBcnJheSBkcml2ZXIgZm9yIEhQIFNBIDV4eHggYW5kIDZ4eHggQ29udHJvbGxlcnMKLSAqICAgIENvcHlyaWdodCAyMDAwLCAyMDAyIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiAgICBDb3B5cmlnaHQgMjAwMCwgMjAwNSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgogICoKICAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNTQsNyArNTQsNyBAQAogTU9EVUxFX0FVVEhPUigiSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBIUCBDb250cm9sbGVyIFNBNXh4eCBTQTZ4eHggdmVyc2lvbiAyLjYuNiIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkhQIFNBNWkgU0E1aSsgU0E1MzIgU0E1MzAwIFNBNTMxMiBTQTY0MSBTQTY0MiBTQTY0MDAiCi0JCQkiIFNBNmkgUDYwMCBQODAwIEU0MDAiKTsKKwkJCSIgU0E2aSBQNjAwIFA4MDAgRTQwMCBFMzAwIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNpbmNsdWRlICJjY2lzc19jbWQuaCIKQEAgLTg1LDggKzg1LDEwIEBACiAJCTB4MTAzQywgMHgzMjI1LCAwLCAwLCAwfSwKIAl7IFBDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0IsCiAJCTB4MTAzYywgMHgzMjIzLCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfSFAsIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0IsCisJeyBQQ0lfVkVORE9SX0lEX0hQLCBQQ0lfREVWSUNFX0lEX0hQX0NJU1NDLAogCQkweDEwM2MsIDB4MzIzMSwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX0hQLCBQQ0lfREVWSUNFX0lEX0hQX0NJU1NDLAorCQkweDEwM2MsIDB4MzIzMywgMCwgMCwgMH0sCiAJezAsfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjY2lzc19wY2lfZGV2aWNlX2lkKTsKQEAgLTExMCw2ICsxMTIsNyBAQAogCXsgMHgzMjI1MTAzQywgIlNtYXJ0IEFycmF5IFA2MDAiLCAmU0E1X2FjY2Vzc30sCiAJeyAweDMyMjMxMDNDLCAiU21hcnQgQXJyYXkgUDgwMCIsICZTQTVfYWNjZXNzfSwKIAl7IDB4MzIzMTEwM0MsICJTbWFydCBBcnJheSBFNDAwIiwgJlNBNV9hY2Nlc3N9LAorCXsgMHgzMjMzMTAzQywgIlNtYXJ0IEFycmF5IEUzMDAiLCAmU0E1X2FjY2Vzc30sCiB9OwogCiAvKiBIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsZXNjb25kcykgZm9yIGJvYXJkIHRvIGdvIGludG8gc2ltcGxlIG1vZGUgKi8KQEAgLTYzNSw2ICs2MzgsNyBAQAogCQljY2lzc19wY2lfaW5mb19zdHJ1Y3QgcGNpaW5mbzsKIAogCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CisJCXBjaWluZm8uZG9tYWluID0gcGNpX2RvbWFpbl9ucihob3N0LT5wZGV2LT5idXMpOwogCQlwY2lpbmZvLmJ1cyA9IGhvc3QtPnBkZXYtPmJ1cy0+bnVtYmVyOwogCQlwY2lpbmZvLmRldl9mbiA9IGhvc3QtPnBkZXYtPmRldmZuOwogCQlwY2lpbmZvLmJvYXJkX2lkID0gaG9zdC0+Ym9hcmRfaWQ7CkBAIC03ODIsMTggKzc4NiwxMCBAQAogCiAgCWNhc2UgQ0NJU1NfR0VUTFVOSU5GTzogewogIAkJTG9ndm9sSW5mb19zdHJ1Y3QgbHVuaW5mbzsKLSAJCWludCBpOwogIAkJCiAgCQlsdW5pbmZvLkx1bklEID0gZHJ2LT5MdW5JRDsKICAJCWx1bmluZm8ubnVtX29wZW5zID0gZHJ2LT51c2FnZV9jb3VudDsKICAJCWx1bmluZm8ubnVtX3BhcnRzID0gMDsKLSAJCS8qIGNvdW50IHBhcnRpdGlvbnMgMSB0byAxNSB3aXRoIHNpemVzID4gMCAqLwotIAkJZm9yIChpID0gMDsgaSA8IE1BWF9QQVJUIC0gMTsgaSsrKSB7Ci0JCQlpZiAoIWRpc2stPnBhcnRbaV0pCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZGlzay0+cGFydFtpXS0+bnJfc2VjdHMgIT0gMCkKLQkJCQlsdW5pbmZvLm51bV9wYXJ0cysrOwotCQl9CiAgCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsdW5pbmZvLAogIAkJCQlzaXplb2YoTG9ndm9sSW5mb19zdHJ1Y3QpKSkKICAJCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svY2ZxLWlvc2NoZWQuYyBiL2RyaXZlcnMvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCAzYWM0N2RkLi5kZTU3NDZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvZHJpdmVycy9ibG9jay9jZnEtaW9zY2hlZC5jCkBAIC0yMSwyMiArMjEsMzQgQEAKICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfZWxhcHNlZF9jcnE7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfZWxhcHNlZF9kaXNwYXRjaDsKKyNpbmNsdWRlIDxsaW51eC9pb3ByaW8uaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KIAogLyoKICAqIHR1bmFibGVzCiAgKi8KIHN0YXRpYyBpbnQgY2ZxX3F1YW50dW0gPSA0OwkJLyogbWF4IHF1ZXVlIGluIG9uZSByb3VuZCBvZiBzZXJ2aWNlICovCiBzdGF0aWMgaW50IGNmcV9xdWV1ZWQgPSA4OwkJLyogbWluaW11bSBycSBhbGxvY2F0ZSBsaW1pdCBwZXItcXVldWUqLwotc3RhdGljIGludCBjZnFfc2VydmljZSA9IEhaOwkJLyogcGVyaW9kIG92ZXIgd2hpY2ggc2VydmljZSBpcyBhdmcgKi8KLXN0YXRpYyBpbnQgY2ZxX2ZpZm9fZXhwaXJlX3IgPSBIWiAvIDI7CS8qIGZpZm8gdGltZW91dCBmb3Igc3luYyByZXF1ZXN0cyAqLwotc3RhdGljIGludCBjZnFfZmlmb19leHBpcmVfdyA9IDUgKiBIWjsJLyogZmlmbyB0aW1lb3V0IGZvciBhc3luYyByZXF1ZXN0cyAqLwotc3RhdGljIGludCBjZnFfZmlmb19yYXRlID0gSFogLyA4OwkvKiBmaWZvIGV4cGlyeSByYXRlICovCitzdGF0aWMgaW50IGNmcV9maWZvX2V4cGlyZVsyXSA9IHsgSFogLyA0LCBIWiAvIDggfTsKIHN0YXRpYyBpbnQgY2ZxX2JhY2tfbWF4ID0gMTYgKiAxMDI0OwkvKiBtYXhpbXVtIGJhY2t3YXJkcyBzZWVrLCBpbiBLaUIgKi8KIHN0YXRpYyBpbnQgY2ZxX2JhY2tfcGVuYWx0eSA9IDI7CS8qIHBlbmFsdHkgb2YgYSBiYWNrd2FyZHMgc2VlayAqLwogCitzdGF0aWMgaW50IGNmcV9zbGljZV9zeW5jID0gSFogLyAxMDsKK3N0YXRpYyBpbnQgY2ZxX3NsaWNlX2FzeW5jID0gSFogLyAyNTsKK3N0YXRpYyBpbnQgY2ZxX3NsaWNlX2FzeW5jX3JxID0gMjsKK3N0YXRpYyBpbnQgY2ZxX3NsaWNlX2lkbGUgPSBIWiAvIDEwMDsKKworI2RlZmluZSBDRlFfSURMRV9HUkFDRQkJKEhaIC8gMTApCisjZGVmaW5lIENGUV9TTElDRV9TQ0FMRQkJKDUpCisKKyNkZWZpbmUgQ0ZRX0tFWV9BU1lOQwkJKDApCisjZGVmaW5lIENGUV9LRVlfQU5ZCQkoMHhmZmZmKQorCisvKgorICogZGlzYWJsZSBxdWV1ZWluZyBhdCB0aGUgZHJpdmVyL2hhcmR3YXJlIGxldmVsCisgKi8KK3N0YXRpYyBpbnQgY2ZxX21heF9kZXB0aCA9IDE7CisKIC8qCiAgKiBmb3IgdGhlIGhhc2ggb2YgY2ZxcSBpbnNpZGUgdGhlIGNmcWQKICAqLwpAQCAtNTUsNiArNjcsNyBAQAogI2RlZmluZSBsaXN0X2VudHJ5X2hhc2gocHRyKQlobGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IGNmcV9ycSwgaGFzaCkKIAogI2RlZmluZSBsaXN0X2VudHJ5X2NmcXEocHRyKQlsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgY2ZxX3F1ZXVlLCBjZnFfbGlzdCkKKyNkZWZpbmUgbGlzdF9lbnRyeV9maWZvKHB0cikJbGlzdF9lbnRyeSgocHRyKSwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkKIAogI2RlZmluZSBSUV9EQVRBKHJxKQkJKHJxKS0+ZWxldmF0b3JfcHJpdmF0ZQogCkBAIC03NSw3OCArODgsMTEwIEBACiAjZGVmaW5lIHJiX2VudHJ5X2NycShub2RlKQlyYl9lbnRyeSgobm9kZSksIHN0cnVjdCBjZnFfcnEsIHJiX25vZGUpCiAjZGVmaW5lIHJxX3JiX2tleShycSkJCShycSktPnNlY3RvcgogCi0vKgotICogdGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgb2ZmIG5vbi10YWcgYWNjb3VudGluZwotICovCi0jZGVmaW5lIENGUV9NQVhfVEFHCQkoNCkKLQotLyoKLSAqIHNvcnQga2V5IHR5cGVzIGFuZCBuYW1lcwotICovCi1lbnVtIHsKLQlDRlFfS0VZX1BHSUQsCi0JQ0ZRX0tFWV9UR0lELAotCUNGUV9LRVlfVUlELAotCUNGUV9LRVlfR0lELAotCUNGUV9LRVlfTEFTVCwKLX07Ci0KLXN0YXRpYyBjaGFyICpjZnFfa2V5X3R5cGVzW10gPSB7ICJwZ2lkIiwgInRnaWQiLCAidWlkIiwgImdpZCIsIE5VTEwgfTsKLQogc3RhdGljIGttZW1fY2FjaGVfdCAqY3JxX3Bvb2w7CiBzdGF0aWMga21lbV9jYWNoZV90ICpjZnFfcG9vbDsKIHN0YXRpYyBrbWVtX2NhY2hlX3QgKmNmcV9pb2NfcG9vbDsKIAorI2RlZmluZSBDRlFfUFJJT19MSVNUUwkJSU9QUklPX0JFX05SCisjZGVmaW5lIGNmcV9jbGFzc19pZGxlKGNmcXEpCSgoY2ZxcSktPmlvcHJpb19jbGFzcyA9PSBJT1BSSU9fQ0xBU1NfSURMRSkKKyNkZWZpbmUgY2ZxX2NsYXNzX2JlKGNmcXEpCSgoY2ZxcSktPmlvcHJpb19jbGFzcyA9PSBJT1BSSU9fQ0xBU1NfQkUpCisjZGVmaW5lIGNmcV9jbGFzc19ydChjZnFxKQkoKGNmcXEpLT5pb3ByaW9fY2xhc3MgPT0gSU9QUklPX0NMQVNTX1JUKQorCisjZGVmaW5lIEFTWU5DCQkJKDApCisjZGVmaW5lIFNZTkMJCQkoMSkKKworI2RlZmluZSBjZnFfY2ZxcV9kaXNwYXRjaGVkKGNmcXEpCVwKKwkoKGNmcXEpLT5vbl9kaXNwYXRjaFtBU1lOQ10gKyAoY2ZxcSktPm9uX2Rpc3BhdGNoW1NZTkNdKQorCisjZGVmaW5lIGNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSkJKChjZnFxKS0+a2V5ICE9IENGUV9LRVlfQVNZTkMpCisKKyNkZWZpbmUgY2ZxX2NmcXFfc3luYyhjZnFxKQkJXAorCShjZnFfY2ZxcV9jbGFzc19zeW5jKGNmcXEpIHx8IChjZnFxKS0+b25fZGlzcGF0Y2hbU1lOQ10pCisKKy8qCisgKiBQZXIgYmxvY2sgZGV2aWNlIHF1ZXVlIHN0cnVjdHVyZQorICovCiBzdHJ1Y3QgY2ZxX2RhdGEgewotCXN0cnVjdCBsaXN0X2hlYWQgcnJfbGlzdDsKKwlhdG9taWNfdCByZWY7CisJcmVxdWVzdF9xdWV1ZV90ICpxdWV1ZTsKKworCS8qCisJICogcnIgbGlzdCBvZiBxdWV1ZXMgd2l0aCByZXF1ZXN0cyBhbmQgdGhlIGNvdW50IG9mIHRoZW0KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJyX2xpc3RbQ0ZRX1BSSU9fTElTVFNdOworCXN0cnVjdCBsaXN0X2hlYWQgYnVzeV9ycjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGN1cl9ycjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGlkbGVfcnI7CisJdW5zaWduZWQgaW50IGJ1c3lfcXVldWVzOworCisJLyoKKwkgKiBub24tb3JkZXJlZCBsaXN0IG9mIGVtcHR5IGNmcXEncworCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgZW1wdHlfbGlzdDsKIAorCS8qCisJICogY2ZxcSBsb29rdXAgaGFzaAorCSAqLwogCXN0cnVjdCBobGlzdF9oZWFkICpjZnFfaGFzaDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqY3JxX2hhc2g7CiAKLQkvKiBxdWV1ZXMgb24gcnJfbGlzdCAoaWUgdGhleSBoYXZlIHBlbmRpbmcgcmVxdWVzdHMgKi8KLQl1bnNpZ25lZCBpbnQgYnVzeV9xdWV1ZXM7CisJLyoKKwkgKiBnbG9iYWwgY3JxIGhhc2ggZm9yIGFsbCBxdWV1ZXMKKwkgKi8KKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqY3JxX2hhc2g7CiAKIAl1bnNpZ25lZCBpbnQgbWF4X3F1ZXVlZDsKIAotCWF0b21pY190IHJlZjsKLQotCWludCBrZXlfdHlwZTsKLQogCW1lbXBvb2xfdCAqY3JxX3Bvb2w7CiAKLQlyZXF1ZXN0X3F1ZXVlX3QgKnF1ZXVlOworCWludCBycV9pbl9kcml2ZXI7CisKKwkvKgorCSAqIHNjaGVkdWxlIHNsaWNlIHN0YXRlIGluZm8KKwkgKi8KKwkvKgorCSAqIGlkbGUgd2luZG93IG1hbmFnZW1lbnQKKwkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX3NsaWNlX3RpbWVyOworCXN0cnVjdCB3b3JrX3N0cnVjdCB1bnBsdWdfd29yazsKKworCXN0cnVjdCBjZnFfcXVldWUgKmFjdGl2ZV9xdWV1ZTsKKwlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmFjdGl2ZV9jaWM7CisJaW50IGN1cl9wcmlvLCBjdXJfZW5kX3ByaW87CisJdW5zaWduZWQgaW50IGRpc3BhdGNoX3NsaWNlOworCisJc3RydWN0IHRpbWVyX2xpc3QgaWRsZV9jbGFzc190aW1lcjsKIAogCXNlY3Rvcl90IGxhc3Rfc2VjdG9yOworCXVuc2lnbmVkIGxvbmcgbGFzdF9lbmRfcmVxdWVzdDsKIAotCWludCBycV9pbl9kcml2ZXI7CisJdW5zaWduZWQgaW50IHJxX3N0YXJ2ZWQ7CiAKIAkvKgogCSAqIHR1bmFibGVzLCBzZWUgdG9wIG9mIGZpbGUKIAkgKi8KIAl1bnNpZ25lZCBpbnQgY2ZxX3F1YW50dW07CiAJdW5zaWduZWQgaW50IGNmcV9xdWV1ZWQ7Ci0JdW5zaWduZWQgaW50IGNmcV9maWZvX2V4cGlyZV9yOwotCXVuc2lnbmVkIGludCBjZnFfZmlmb19leHBpcmVfdzsKLQl1bnNpZ25lZCBpbnQgY2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlOworCXVuc2lnbmVkIGludCBjZnFfZmlmb19leHBpcmVbMl07CiAJdW5zaWduZWQgaW50IGNmcV9iYWNrX3BlbmFsdHk7CiAJdW5zaWduZWQgaW50IGNmcV9iYWNrX21heDsKLQl1bnNpZ25lZCBpbnQgZmluZF9iZXN0X2NycTsKLQotCXVuc2lnbmVkIGludCBjZnFfdGFnZ2VkOworCXVuc2lnbmVkIGludCBjZnFfc2xpY2VbMl07CisJdW5zaWduZWQgaW50IGNmcV9zbGljZV9hc3luY19ycTsKKwl1bnNpZ25lZCBpbnQgY2ZxX3NsaWNlX2lkbGU7CisJdW5zaWduZWQgaW50IGNmcV9tYXhfZGVwdGg7CiB9OwogCisvKgorICogUGVyIHByb2Nlc3MtZ3JvdXBpbmcgc3RydWN0dXJlCisgKi8KIHN0cnVjdCBjZnFfcXVldWUgewogCS8qIHJlZmVyZW5jZSBjb3VudCAqLwogCWF0b21pY190IHJlZjsKIAkvKiBwYXJlbnQgY2ZxX2RhdGEgKi8KIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQ7Ci0JLyogaGFzaCBvZiBtZXJnZWFibGUgcmVxdWVzdHMgKi8KKwkvKiBjZnFxIGxvb2t1cCBoYXNoICovCiAJc3RydWN0IGhsaXN0X25vZGUgY2ZxX2hhc2g7CiAJLyogaGFzaCBrZXkgKi8KLQl1bnNpZ25lZCBsb25nIGtleTsKLQkvKiB3aGV0aGVyIHF1ZXVlIGlzIG9uIHJyIChvciBlbXB0eSkgbGlzdCAqLwotCWludCBvbl9ycjsKKwl1bnNpZ25lZCBpbnQga2V5OwogCS8qIG9uIGVpdGhlciByciBvciBlbXB0eSBsaXN0IG9mIGNmcWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNmcV9saXN0OwogCS8qIHNvcnRlZCBsaXN0IG9mIHBlbmRpbmcgcmVxdWVzdHMgKi8KQEAgLTE1OCwyMSArMjAzLDIyIEBACiAJLyogY3VycmVudGx5IGFsbG9jYXRlZCByZXF1ZXN0cyAqLwogCWludCBhbGxvY2F0ZWRbMl07CiAJLyogZmlmbyBsaXN0IG9mIHJlcXVlc3RzIGluIHNvcnRfbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZmlmb1syXTsKLQkvKiBsYXN0IHRpbWUgZmlmbyBleHBpcmVkICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X2ZpZm9fZXhwaXJlOworCXN0cnVjdCBsaXN0X2hlYWQgZmlmbzsKIAotCWludCBrZXlfdHlwZTsKKwl1bnNpZ25lZCBsb25nIHNsaWNlX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgc2xpY2VfZW5kOworCXVuc2lnbmVkIGxvbmcgc2xpY2VfbGVmdDsKKwl1bnNpZ25lZCBsb25nIHNlcnZpY2VfbGFzdDsKIAotCXVuc2lnbmVkIGxvbmcgc2VydmljZV9zdGFydDsKLQl1bnNpZ25lZCBsb25nIHNlcnZpY2VfdXNlZDsKKwkvKiBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCBhcmUgb24gdGhlIGRpc3BhdGNoIGxpc3QgKi8KKwlpbnQgb25fZGlzcGF0Y2hbMl07CiAKLQl1bnNpZ25lZCBpbnQgbWF4X3JhdGU7CisJLyogaW8gcHJpbyBvZiB0aGlzIGdyb3VwICovCisJdW5zaWduZWQgc2hvcnQgaW9wcmlvLCBvcmdfaW9wcmlvOworCXVuc2lnbmVkIHNob3J0IGlvcHJpb19jbGFzcywgb3JnX2lvcHJpb19jbGFzczsKIAotCS8qIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGhhdmUgYmVlbiBoYW5kZWQgdG8gdGhlIGRyaXZlciAqLwotCWludCBpbl9mbGlnaHQ7Ci0JLyogbnVtYmVyIG9mIGN1cnJlbnRseSBhbGxvY2F0ZWQgcmVxdWVzdHMgKi8KLQlpbnQgYWxsb2NfbGltaXRbMl07CisJLyogdmFyaW91cyBzdGF0ZSBmbGFncywgc2VlIGJlbG93ICovCisJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKIAogc3RydWN0IGNmcV9ycSB7CkBAIC0xODQsNDIgKzIzMCw3OCBAQAogCXN0cnVjdCBjZnFfcXVldWUgKmNmcV9xdWV1ZTsKIAlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmlvX2NvbnRleHQ7CiAKLQl1bnNpZ25lZCBsb25nIHNlcnZpY2Vfc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBxdWV1ZV9zdGFydDsKLQotCXVuc2lnbmVkIGludCBpbl9mbGlnaHQgOiAxOwotCXVuc2lnbmVkIGludCBhY2NvdW50ZWQgOiAxOwotCXVuc2lnbmVkIGludCBpc19zeW5jICAgOiAxOwotCXVuc2lnbmVkIGludCBpc193cml0ZSAgOiAxOworCXVuc2lnbmVkIGludCBjcnFfZmxhZ3M7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2ZpbmRfY2ZxX2hhc2goc3RydWN0IGNmcV9kYXRhICosIHVuc2lnbmVkIGxvbmcpOworZW51bSBjZnFxX3N0YXRlX2ZsYWdzIHsKKwlDRlFfQ0ZRUV9GTEFHX29uX3JyID0gMCwKKwlDRlFfQ0ZRUV9GTEFHX3dhaXRfcmVxdWVzdCwKKwlDRlFfQ0ZRUV9GTEFHX211c3RfYWxsb2MsCisJQ0ZRX0NGUVFfRkxBR19tdXN0X2FsbG9jX3NsaWNlLAorCUNGUV9DRlFRX0ZMQUdfbXVzdF9kaXNwYXRjaCwKKwlDRlFfQ0ZRUV9GTEFHX2ZpZm9fZXhwaXJlLAorCUNGUV9DRlFRX0ZMQUdfaWRsZV93aW5kb3csCisJQ0ZRX0NGUVFfRkxBR19wcmlvX2NoYW5nZWQsCisJQ0ZRX0NGUVFfRkxBR19leHBpcmVkLAorfTsKKworI2RlZmluZSBDRlFfQ0ZRUV9GTlMobmFtZSkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgY2ZxX21hcmtfY2ZxcV8jI25hbWUoc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkJCVwKK3sJCQkJCQkJCQlcCisJY2ZxcS0+ZmxhZ3MgfD0gKDEgPDwgQ0ZRX0NGUVFfRkxBR18jI25hbWUpOwkJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgY2ZxX2NsZWFyX2NmcXFfIyNuYW1lKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCVwKK3sJCQkJCQkJCQlcCisJY2ZxcS0+ZmxhZ3MgJj0gfigxIDw8IENGUV9DRlFRX0ZMQUdfIyNuYW1lKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIGlubGluZSBpbnQgY2ZxX2NmcXFfIyNuYW1lKGNvbnN0IHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiAoY2ZxcS0+ZmxhZ3MgJiAoMSA8PCBDRlFfQ0ZRUV9GTEFHXyMjbmFtZSkpICE9IDA7CVwKK30KKworQ0ZRX0NGUVFfRk5TKG9uX3JyKTsKK0NGUV9DRlFRX0ZOUyh3YWl0X3JlcXVlc3QpOworQ0ZRX0NGUVFfRk5TKG11c3RfYWxsb2MpOworQ0ZRX0NGUVFfRk5TKG11c3RfYWxsb2Nfc2xpY2UpOworQ0ZRX0NGUVFfRk5TKG11c3RfZGlzcGF0Y2gpOworQ0ZRX0NGUVFfRk5TKGZpZm9fZXhwaXJlKTsKK0NGUV9DRlFRX0ZOUyhpZGxlX3dpbmRvdyk7CitDRlFfQ0ZRUV9GTlMocHJpb19jaGFuZ2VkKTsKK0NGUV9DRlFRX0ZOUyhleHBpcmVkKTsKKyN1bmRlZiBDRlFfQ0ZRUV9GTlMKKworZW51bSBjZnFfcnFfc3RhdGVfZmxhZ3MgeworCUNGUV9DUlFfRkxBR19pbl9mbGlnaHQgPSAwLAorCUNGUV9DUlFfRkxBR19pbl9kcml2ZXIsCisJQ0ZRX0NSUV9GTEFHX2lzX3N5bmMsCisJQ0ZRX0NSUV9GTEFHX3JlcXVldWVkLAorfTsKKworI2RlZmluZSBDRlFfQ1JRX0ZOUyhuYW1lKQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZnFfbWFya19jcnFfIyNuYW1lKHN0cnVjdCBjZnFfcnEgKmNycSkJCVwKK3sJCQkJCQkJCQlcCisJY3JxLT5jcnFfZmxhZ3MgfD0gKDEgPDwgQ0ZRX0NSUV9GTEFHXyMjbmFtZSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZnFfY2xlYXJfY3JxXyMjbmFtZShzdHJ1Y3QgY2ZxX3JxICpjcnEpCQlcCit7CQkJCQkJCQkJXAorCWNycS0+Y3JxX2ZsYWdzICY9IH4oMSA8PCBDRlFfQ1JRX0ZMQUdfIyNuYW1lKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIGlubGluZSBpbnQgY2ZxX2NycV8jI25hbWUoY29uc3Qgc3RydWN0IGNmcV9ycSAqY3JxKQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gKGNycS0+Y3JxX2ZsYWdzICYgKDEgPDwgQ0ZRX0NSUV9GTEFHXyMjbmFtZSkpICE9IDA7CVwKK30KKworQ0ZRX0NSUV9GTlMoaW5fZmxpZ2h0KTsKK0NGUV9DUlFfRk5TKGluX2RyaXZlcik7CitDRlFfQ1JRX0ZOUyhpc19zeW5jKTsKK0NGUV9DUlFfRk5TKHJlcXVldWVkKTsKKyN1bmRlZiBDRlFfQ1JRX0ZOUworCitzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2ZpbmRfY2ZxX2hhc2goc3RydWN0IGNmcV9kYXRhICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgc2hvcnQpOwogc3RhdGljIHZvaWQgY2ZxX2Rpc3BhdGNoX3NvcnQocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBjZnFfcnEgKik7Ci1zdGF0aWMgdm9pZCBjZnFfdXBkYXRlX25leHRfY3JxKHN0cnVjdCBjZnFfcnEgKik7CiBzdGF0aWMgdm9pZCBjZnFfcHV0X2NmcWQoc3RydWN0IGNmcV9kYXRhICpjZnFkKTsKIAotLyoKLSAqIHdoYXQgdGhlIGZhaXJuZXNzIGlzIGJhc2VkIG9uIChpZSBob3cgcHJvY2Vzc2VzIGFyZSBncm91cGVkIGFuZAotICogZGlmZmVyZW50aWF0ZWQpCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotY2ZxX2hhc2hfa2V5KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JLyoKLQkgKiBvcHRpbWl6ZSB0aGlzIHNvIHRoYXQgLT5rZXlfdHlwZSBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIHN0cnVjdAotCSAqLwotCXN3aXRjaCAoY2ZxZC0+a2V5X3R5cGUpIHsKLQkJY2FzZSBDRlFfS0VZX1BHSUQ6Ci0JCQlyZXR1cm4gcHJvY2Vzc19ncm91cCh0c2spOwotCQlkZWZhdWx0OgotCQljYXNlIENGUV9LRVlfVEdJRDoKLQkJCXJldHVybiB0c2stPnRnaWQ7Ci0JCWNhc2UgQ0ZRX0tFWV9VSUQ6Ci0JCQlyZXR1cm4gdHNrLT51aWQ7Ci0JCWNhc2UgQ0ZRX0tFWV9HSUQ6Ci0JCQlyZXR1cm4gdHNrLT5naWQ7Ci0JfQotfQorI2RlZmluZSBwcm9jZXNzX3N5bmModHNrKQkoKHRzayktPmZsYWdzICYgUEZfU1lOQ1dSSVRFKQogCiAvKgogICogbG90cyBvZiBkZWFkbGluZSBpb3NjaGVkIGR1cGVzLCBjYW4gYmUgYWJzdHJhY3RlZCBsYXRlci4uLgpAQCAtMjM1LDE2ICszMTcsMTIgQEAKIAogCWlmIChxLT5sYXN0X21lcmdlID09IGNycS0+cmVxdWVzdCkKIAkJcS0+bGFzdF9tZXJnZSA9IE5VTEw7Ci0KLQljZnFfdXBkYXRlX25leHRfY3JxKGNycSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZnFfYWRkX2NycV9oYXNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9ycSAqY3JxKQogewogCWNvbnN0IGludCBoYXNoX2lkeCA9IENGUV9NSEFTSF9GTihycV9oYXNoX2tleShjcnEtPnJlcXVlc3QpKTsKIAotCUJVR19PTighaGxpc3RfdW5oYXNoZWQoJmNycS0+aGFzaCkpOwotCiAJaGxpc3RfYWRkX2hlYWQoJmNycS0+aGFzaCwgJmNmcWQtPmNycV9oYXNoW2hhc2hfaWR4XSk7CiB9CiAKQEAgLTI1Nyw4ICszMzUsNiBAQAogCQlzdHJ1Y3QgY2ZxX3JxICpjcnEgPSBsaXN0X2VudHJ5X2hhc2goZW50cnkpOwogCQlzdHJ1Y3QgcmVxdWVzdCAqX19ycSA9IGNycS0+cmVxdWVzdDsKIAotCQlCVUdfT04oaGxpc3RfdW5oYXNoZWQoJmNycS0+aGFzaCkpOwotCiAJCWlmICghcnFfbWVyZ2VhYmxlKF9fcnEpKSB7CiAJCQljZnFfZGVsX2NycV9oYXNoKGNycSk7CiAJCQljb250aW51ZTsKQEAgLTI3MSw2ICszNDcsMjggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgY2ZxX3BlbmRpbmdfcmVxdWVzdHMoc3RydWN0IGNmcV9kYXRhICpjZnFkKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmY2ZxZC0+cXVldWUtPnF1ZXVlX2hlYWQpIHx8IGNmcWQtPmJ1c3lfcXVldWVzOworfQorCisvKgorICogc2NoZWR1bGVyIHJ1biBvZiBxdWV1ZSwgaWYgdGhlcmUgYXJlIHJlcXVlc3RzIHBlbmRpbmcgYW5kIG5vIG9uZSBpbiB0aGUKKyAqIGRyaXZlciB0aGF0IHdpbGwgcmVzdGFydCBxdWV1ZWluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCkKK3sKKwlpZiAoIWNmcWQtPnJxX2luX2RyaXZlciAmJiBjZnFfcGVuZGluZ19yZXF1ZXN0cyhjZnFkKSkKKwkJa2Jsb2NrZF9zY2hlZHVsZV93b3JrKCZjZnFkLT51bnBsdWdfd29yayk7Cit9CisKK3N0YXRpYyBpbnQgY2ZxX3F1ZXVlX2VtcHR5KHJlcXVlc3RfcXVldWVfdCAqcSkKK3sKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKKworCXJldHVybiAhY2ZxX3BlbmRpbmdfcmVxdWVzdHMoY2ZxZCk7Cit9CisKIC8qCiAgKiBMaWZ0ZWQgZnJvbSBBUyAtIGNob29zZSB3aGljaCBvZiBjcnExIGFuZCBjcnEyIHRoYXQgaXMgYmVzdCBzZXJ2ZWQgbm93LgogICogV2UgY2hvb3NlIHRoZSByZXF1ZXN0IHRoYXQgaXMgY2xvc2VzdCB0byB0aGUgaGVhZCByaWdodCBub3cuIERpc3RhbmNlCkBAIC0yODcsMzYgKzM4NSwxNiBAQAogCQlyZXR1cm4gY3JxMjsKIAlpZiAoY3JxMiA9PSBOVUxMKQogCQlyZXR1cm4gY3JxMTsKKwlpZiAoY2ZxX2NycV9yZXF1ZXVlZChjcnExKSkKKwkJcmV0dXJuIGNycTE7CisJaWYgKGNmcV9jcnFfcmVxdWV1ZWQoY3JxMikpCisJCXJldHVybiBjcnEyOwogCiAJczEgPSBjcnExLT5yZXF1ZXN0LT5zZWN0b3I7CiAJczIgPSBjcnEyLT5yZXF1ZXN0LT5zZWN0b3I7CiAKIAlsYXN0ID0gY2ZxZC0+bGFzdF9zZWN0b3I7CiAKLSNpZiAwCi0JaWYgKCFsaXN0X2VtcHR5KCZjZnFkLT5xdWV1ZS0+cXVldWVfaGVhZCkpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSAmY2ZxZC0+cXVldWUtPnF1ZXVlX2hlYWQ7Ci0JCXVuc2lnbmVkIGxvbmcgZGlzdGFuY2UgPSB+MFVMOwotCQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQkJd2hpbGUgKChlbnRyeSA9IGVudHJ5LT5wcmV2KSAhPSAmY2ZxZC0+cXVldWUtPnF1ZXVlX2hlYWQpIHsKLQkJCXJxID0gbGlzdF9lbnRyeV9ycShlbnRyeSk7Ci0KLQkJCWlmIChibGtfYmFycmllcl9ycShycSkpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChkaXN0YW5jZSA8IGFicyhzMSAtIHJxLT5zZWN0b3IgKyBycS0+bnJfc2VjdG9ycykpIHsKLQkJCQlkaXN0YW5jZSA9IGFicyhzMSAtIHJxLT5zZWN0b3IgK3JxLT5ucl9zZWN0b3JzKTsKLQkJCQlsYXN0ID0gcnEtPnNlY3RvciArIHJxLT5ucl9zZWN0b3JzOwotCQkJfQotCQkJaWYgKGRpc3RhbmNlIDwgYWJzKHMyIC0gcnEtPnNlY3RvciArIHJxLT5ucl9zZWN0b3JzKSkgewotCQkJCWRpc3RhbmNlID0gYWJzKHMyIC0gcnEtPnNlY3RvciArcnEtPm5yX3NlY3RvcnMpOwotCQkJCWxhc3QgPSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQogCS8qCiAJICogYnkgZGVmaW5pdGlvbiwgMUtpQiBpcyAyIHNlY3RvcnMKIAkgKi8KQEAgLTM3NywxMSArNDU1LDE0IEBACiAJc3RydWN0IGNmcV9ycSAqY3JxX25leHQgPSBOVUxMLCAqY3JxX3ByZXYgPSBOVUxMOwogCXN0cnVjdCByYl9ub2RlICpyYm5leHQsICpyYnByZXY7CiAKLQlpZiAoIU9OX1JCKCZsYXN0LT5yYl9ub2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoKHJibmV4dCA9IHJiX25leHQoJmxhc3QtPnJiX25vZGUpKSA9PSBOVUxMKQorCXJibmV4dCA9IE5VTEw7CisJaWYgKE9OX1JCKCZsYXN0LT5yYl9ub2RlKSkKKwkJcmJuZXh0ID0gcmJfbmV4dCgmbGFzdC0+cmJfbm9kZSk7CisJaWYgKCFyYm5leHQpIHsKIAkJcmJuZXh0ID0gcmJfZmlyc3QoJmNmcXEtPnNvcnRfbGlzdCk7CisJCWlmIChyYm5leHQgPT0gJmxhc3QtPnJiX25vZGUpCisJCQlyYm5leHQgPSBOVUxMOworCX0KIAogCXJicHJldiA9IHJiX3ByZXYoJmxhc3QtPnJiX25vZGUpOwogCkBAIC00MDEsNjcgKzQ4Miw1MyBAQAogCQljZnFxLT5uZXh0X2NycSA9IGNmcV9maW5kX25leHRfY3JxKGNmcXEtPmNmcWQsIGNmcXEsIGNycSk7CiB9CiAKLXN0YXRpYyBpbnQgY2ZxX2NoZWNrX3NvcnRfcnJfbGlzdChzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQorc3RhdGljIHZvaWQgY2ZxX3Jlc29ydF9ycl9saXN0KHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsIGludCBwcmVlbXB0ZWQpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZjZnFxLT5jZnFkLT5ycl9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQsICpwcmV2OworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IGNmcXEtPmNmcWQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKmVudHJ5OwogCi0JLyoKLQkgKiBsaXN0IG1pZ2h0IHN0aWxsIGJlIG9yZGVyZWQKLQkgKi8KLQluZXh0ID0gY2ZxcS0+Y2ZxX2xpc3QubmV4dDsKLQlpZiAobmV4dCAhPSBoZWFkKSB7Ci0JCXN0cnVjdCBjZnFfcXVldWUgKmNuZXh0ID0gbGlzdF9lbnRyeV9jZnFxKG5leHQpOwotCi0JCWlmIChjZnFxLT5zZXJ2aWNlX3VzZWQgPiBjbmV4dC0+c2VydmljZV91c2VkKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcHJldiA9IGNmcXEtPmNmcV9saXN0LnByZXY7Ci0JaWYgKHByZXYgIT0gaGVhZCkgewotCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjcHJldiA9IGxpc3RfZW50cnlfY2ZxcShwcmV2KTsKLQotCQlpZiAoY2ZxcS0+c2VydmljZV91c2VkIDwgY3ByZXYtPnNlcnZpY2VfdXNlZCkKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjZnFfc29ydF9ycl9saXN0KHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsIGludCBuZXdfcXVldWUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSAmY2ZxcS0+Y2ZxZC0+cnJfbGlzdDsKLQotCWlmICghY2ZxcS0+b25fcnIpCi0JCXJldHVybjsKLQlpZiAoIW5ld19xdWV1ZSAmJiAhY2ZxX2NoZWNrX3NvcnRfcnJfbGlzdChjZnFxKSkKLQkJcmV0dXJuOworCUJVR19PTighY2ZxX2NmcXFfb25fcnIoY2ZxcSkpOwogCiAJbGlzdF9kZWwoJmNmcXEtPmNmcV9saXN0KTsKIAorCWlmIChjZnFfY2xhc3NfcnQoY2ZxcSkpCisJCWxpc3QgPSAmY2ZxZC0+Y3VyX3JyOworCWVsc2UgaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQlsaXN0ID0gJmNmcWQtPmlkbGVfcnI7CisJZWxzZSB7CisJCS8qCisJCSAqIGlmIGNmcXEgaGFzIHJlcXVlc3RzIGluIGZsaWdodCwgZG9uJ3QgYWxsb3cgaXQgdG8gYmUKKwkJICogZm91bmQgaW4gY2ZxX3NldF9hY3RpdmVfcXVldWUgYmVmb3JlIGl0IGhhcyBmaW5pc2hlZCB0aGVtLgorCQkgKiB0aGlzIGlzIGRvbmUgdG8gaW5jcmVhc2UgZmFpcm5lc3MgYmV0d2VlbiBhIHByb2Nlc3MgdGhhdAorCQkgKiBoYXMgbG90cyBvZiBpbyBwZW5kaW5nIHZzIG9uZSB0aGF0IG9ubHkgZ2VuZXJhdGVzIG9uZQorCQkgKiBzcG9yYWRpY2FsbHkgb3Igc3luY2hyb25vdXNseQorCQkgKi8KKwkJaWYgKGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpCisJCQlsaXN0ID0gJmNmcWQtPmJ1c3lfcnI7CisJCWVsc2UKKwkJCWxpc3QgPSAmY2ZxZC0+cnJfbGlzdFtjZnFxLT5pb3ByaW9dOworCX0KKwogCS8qCi0JICogc29ydCBieSBvdXIgbWVhbiBzZXJ2aWNlX3VzZWQsIHN1Yi1zb3J0IGJ5IGluLWZsaWdodCByZXF1ZXN0cworCSAqIGlmIHF1ZXVlIHdhcyBwcmVlbXB0ZWQsIGp1c3QgYWRkIHRvIGZyb250IHRvIGJlIGZhaXIuIGJ1c3lfcnIKKwkgKiBpc24ndCBzb3J0ZWQuCiAJICovCi0Jd2hpbGUgKChlbnRyeSA9IGVudHJ5LT5wcmV2KSAhPSAmY2ZxcS0+Y2ZxZC0+cnJfbGlzdCkgeworCWlmIChwcmVlbXB0ZWQgfHwgbGlzdCA9PSAmY2ZxZC0+YnVzeV9ycikgeworCQlsaXN0X2FkZCgmY2ZxcS0+Y2ZxX2xpc3QsIGxpc3QpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBzb3J0IGJ5IHdoZW4gcXVldWUgd2FzIGxhc3Qgc2VydmljZWQKKwkgKi8KKwllbnRyeSA9IGxpc3Q7CisJd2hpbGUgKChlbnRyeSA9IGVudHJ5LT5wcmV2KSAhPSBsaXN0KSB7CiAJCXN0cnVjdCBjZnFfcXVldWUgKl9fY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShlbnRyeSk7CiAKLQkJaWYgKGNmcXEtPnNlcnZpY2VfdXNlZCA+IF9fY2ZxcS0+c2VydmljZV91c2VkKQorCQlpZiAoIV9fY2ZxcS0+c2VydmljZV9sYXN0KQogCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKGNmcXEtPnNlcnZpY2VfdXNlZCA9PSBfX2NmcXEtPnNlcnZpY2VfdXNlZCkgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqcHJ2OwotCi0JCQl3aGlsZSAoKHBydiA9IGVudHJ5LT5wcmV2KSAhPSAmY2ZxcS0+Y2ZxZC0+cnJfbGlzdCkgewotCQkJCV9fY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShwcnYpOwotCi0JCQkJV0FSTl9PTihfX2NmcXEtPnNlcnZpY2VfdXNlZCA+IGNmcXEtPnNlcnZpY2VfdXNlZCk7Ci0JCQkJaWYgKGNmcXEtPnNlcnZpY2VfdXNlZCAhPSBfX2NmcXEtPnNlcnZpY2VfdXNlZCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGNmcXEtPmluX2ZsaWdodCA+IF9fY2ZxcS0+aW5fZmxpZ2h0KQotCQkJCQlicmVhazsKLQotCQkJCWVudHJ5ID0gcHJ2OwotCQkJfQotCQl9CisJCWlmICh0aW1lX2JlZm9yZShfX2NmcXEtPnNlcnZpY2VfbGFzdCwgY2ZxcS0+c2VydmljZV9sYXN0KSkKKwkJCWJyZWFrOwogCX0KIAogCWxpc3RfYWRkKCZjZnFxLT5jZnFfbGlzdCwgZW50cnkpOwpAQCAtNDY5LDI4ICs1MzYsMjQgQEAKIAogLyoKICAqIGFkZCB0byBidXN5IGxpc3Qgb2YgcXVldWVzIGZvciBzZXJ2aWNlLCB0cnlpbmcgdG8gYmUgZmFpciBpbiBvcmRlcmluZwotICogdGhlIHBlbmRpbmcgbGlzdCBhY2NvcmRpbmcgdG8gcmVxdWVzdHMgc2VydmljZWQKKyAqIHRoZSBwZW5kaW5nIGxpc3QgYWNjb3JkaW5nIHRvIGxhc3QgcmVxdWVzdCBzZXJ2aWNlCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotY2ZxX2FkZF9jZnFxX3JyKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK2NmcV9hZGRfY2ZxcV9ycihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsIGludCByZXF1ZXVlKQogewotCS8qCi0JICogaXQncyBjdXJyZW50bHkgb24gdGhlIGVtcHR5IGxpc3QKLQkgKi8KLQljZnFxLT5vbl9yciA9IDE7CisJQlVHX09OKGNmcV9jZnFxX29uX3JyKGNmcXEpKTsKKwljZnFfbWFya19jZnFxX29uX3JyKGNmcXEpOwogCWNmcWQtPmJ1c3lfcXVldWVzKys7CiAKLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBjZnFxLT5zZXJ2aWNlX3N0YXJ0ICsgY2ZxX3NlcnZpY2UpKQotCQljZnFxLT5zZXJ2aWNlX3VzZWQgPj49IDM7Ci0KLQljZnFfc29ydF9ycl9saXN0KGNmcXEsIDEpOworCWNmcV9yZXNvcnRfcnJfbGlzdChjZnFxLCByZXF1ZXVlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBjZnFfZGVsX2NmcXFfcnIoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogeworCUJVR19PTighY2ZxX2NmcXFfb25fcnIoY2ZxcSkpOworCWNmcV9jbGVhcl9jZnFxX29uX3JyKGNmcXEpOwogCWxpc3RfbW92ZSgmY2ZxcS0+Y2ZxX2xpc3QsICZjZnFkLT5lbXB0eV9saXN0KTsKLQljZnFxLT5vbl9yciA9IDA7CiAKIAlCVUdfT04oIWNmcWQtPmJ1c3lfcXVldWVzKTsKIAljZnFkLT5idXN5X3F1ZXVlcy0tOwpAQCAtNTA1LDE2ICs1NjgsMTcgQEAKIAogCWlmIChPTl9SQigmY3JxLT5yYl9ub2RlKSkgewogCQlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOworCQljb25zdCBpbnQgc3luYyA9IGNmcV9jcnFfaXNfc3luYyhjcnEpOwogCi0JCUJVR19PTighY2ZxcS0+cXVldWVkW2NycS0+aXNfc3luY10pOworCQlCVUdfT04oIWNmcXEtPnF1ZXVlZFtzeW5jXSk7CisJCWNmcXEtPnF1ZXVlZFtzeW5jXS0tOwogCiAJCWNmcV91cGRhdGVfbmV4dF9jcnEoY3JxKTsKIAotCQljZnFxLT5xdWV1ZWRbY3JxLT5pc19zeW5jXS0tOwogCQlyYl9lcmFzZSgmY3JxLT5yYl9ub2RlLCAmY2ZxcS0+c29ydF9saXN0KTsKIAkJUkJfQ0xFQVJfQ09MT1IoJmNycS0+cmJfbm9kZSk7CiAKLQkJaWYgKFJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpICYmIGNmcXEtPm9uX3JyKQorCQlpZiAoY2ZxX2NmcXFfb25fcnIoY2ZxcSkgJiYgUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkpCiAJCQljZnFfZGVsX2NmcXFfcnIoY2ZxZCwgY2ZxcSk7CiAJfQogfQpAQCAtNTUwLDcgKzYxNCw3IEBACiAJc3RydWN0IGNmcV9ycSAqX19hbGlhczsKIAogCWNycS0+cmJfa2V5ID0gcnFfcmJfa2V5KHJxKTsKLQljZnFxLT5xdWV1ZWRbY3JxLT5pc19zeW5jXSsrOworCWNmcXEtPnF1ZXVlZFtjZnFfY3JxX2lzX3N5bmMoY3JxKV0rKzsKIAogCS8qCiAJICogbG9va3MgYSBsaXR0bGUgb2RkLCBidXQgdGhlIGZpcnN0IGluc2VydCBtaWdodCByZXR1cm4gYW4gYWxpYXMuCkBAIC01NjEsOCArNjI1LDggQEAKIAogCXJiX2luc2VydF9jb2xvcigmY3JxLT5yYl9ub2RlLCAmY2ZxcS0+c29ydF9saXN0KTsKIAotCWlmICghY2ZxcS0+b25fcnIpCi0JCWNmcV9hZGRfY2ZxcV9ycihjZnFkLCBjZnFxKTsKKwlpZiAoIWNmcV9jZnFxX29uX3JyKGNmcXEpKQorCQljZnFfYWRkX2NmcXFfcnIoY2ZxZCwgY2ZxcSwgY2ZxX2NycV9yZXF1ZXVlZChjcnEpKTsKIAogCS8qCiAJICogY2hlY2sgaWYgdGhpcyByZXF1ZXN0IGlzIGEgYmV0dGVyIG5leHQtc2VydmUgY2FuZGlkYXRlCkBAIC01NzUsMTcgKzYzOSwxNiBAQAogewogCWlmIChPTl9SQigmY3JxLT5yYl9ub2RlKSkgewogCQlyYl9lcmFzZSgmY3JxLT5yYl9ub2RlLCAmY2ZxcS0+c29ydF9saXN0KTsKLQkJY2ZxcS0+cXVldWVkW2NycS0+aXNfc3luY10tLTsKKwkJY2ZxcS0+cXVldWVkW2NmcV9jcnFfaXNfc3luYyhjcnEpXS0tOwogCX0KIAogCWNmcV9hZGRfY3JxX3JiKGNycSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqCi1jZnFfZmluZF9ycV9yYihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHNlY3Rvcl90IHNlY3RvcikKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqY2ZxX2ZpbmRfcnFfcmIoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzZWN0b3JfdCBzZWN0b3IpCisKIHsKLQljb25zdCB1bnNpZ25lZCBsb25nIGtleSA9IGNmcV9oYXNoX2tleShjZnFkLCBjdXJyZW50KTsKLQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5KTsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwgY3VycmVudC0+cGlkLCBDRlFfS0VZX0FOWSk7CiAJc3RydWN0IHJiX25vZGUgKm47CiAKIAlpZiAoIWNmcXEpCkBAIC02MDksMjAgKzY3MiwyNSBAQAogCiBzdGF0aWMgdm9pZCBjZnFfZGVhY3RpdmF0ZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogeworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCBjZnFfcnEgKmNycSA9IFJRX0RBVEEocnEpOwogCiAJaWYgKGNycSkgewogCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY3JxLT5jZnFfcXVldWU7CiAKLQkJaWYgKGNmcXEtPmNmcWQtPmNmcV90YWdnZWQpIHsKLQkJCWNmcXEtPnNlcnZpY2VfdXNlZC0tOwotCQkJY2ZxX3NvcnRfcnJfbGlzdChjZnFxLCAwKTsKKwkJaWYgKGNmcV9jcnFfaW5fZHJpdmVyKGNycSkpIHsKKwkJCWNmcV9jbGVhcl9jcnFfaW5fZHJpdmVyKGNycSk7CisJCQlXQVJOX09OKCFjZnFkLT5ycV9pbl9kcml2ZXIpOworCQkJY2ZxZC0+cnFfaW5fZHJpdmVyLS07CiAJCX0KKwkJaWYgKGNmcV9jcnFfaW5fZmxpZ2h0KGNycSkpIHsKKwkJCWNvbnN0IGludCBzeW5jID0gY2ZxX2NycV9pc19zeW5jKGNycSk7CiAKLQkJaWYgKGNycS0+YWNjb3VudGVkKSB7Ci0JCQljcnEtPmFjY291bnRlZCA9IDA7Ci0JCQljZnFxLT5jZnFkLT5ycV9pbl9kcml2ZXItLTsKKwkJCWNmcV9jbGVhcl9jcnFfaW5fZmxpZ2h0KGNycSk7CisJCQlXQVJOX09OKCFjZnFxLT5vbl9kaXNwYXRjaFtzeW5jXSk7CisJCQljZnFxLT5vbl9kaXNwYXRjaFtzeW5jXS0tOwogCQl9CisJCWNmcV9tYXJrX2NycV9yZXF1ZXVlZChjcnEpOwogCX0KIH0KIApAQCAtNjQwLDExICs3MDgsMTAgQEAKIAlzdHJ1Y3QgY2ZxX3JxICpjcnEgPSBSUV9EQVRBKHJxKTsKIAogCWlmIChjcnEpIHsKLQkJY2ZxX3JlbW92ZV9tZXJnZV9oaW50cyhxLCBjcnEpOwogCQlsaXN0X2RlbF9pbml0KCZycS0+cXVldWVsaXN0KTsKKwkJY2ZxX2RlbF9jcnFfcmIoY3JxKTsKKwkJY2ZxX3JlbW92ZV9tZXJnZV9oaW50cyhxLCBjcnEpOwogCi0JCWlmIChjcnEtPmNmcV9xdWV1ZSkKLQkJCWNmcV9kZWxfY3JxX3JiKGNycSk7CiAJfQogfQogCkBAIC02NjIsMjEgKzcyOSwxNSBAQAogCX0KIAogCV9fcnEgPSBjZnFfZmluZF9ycV9oYXNoKGNmcWQsIGJpby0+Ymlfc2VjdG9yKTsKLQlpZiAoX19ycSkgewotCQlCVUdfT04oX19ycS0+c2VjdG9yICsgX19ycS0+bnJfc2VjdG9ycyAhPSBiaW8tPmJpX3NlY3Rvcik7Ci0KLQkJaWYgKGVsdl9ycV9tZXJnZV9vayhfX3JxLCBiaW8pKSB7Ci0JCQlyZXQgPSBFTEVWQVRPUl9CQUNLX01FUkdFOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoX19ycSAmJiBlbHZfcnFfbWVyZ2Vfb2soX19ycSwgYmlvKSkgeworCQlyZXQgPSBFTEVWQVRPUl9CQUNLX01FUkdFOworCQlnb3RvIG91dDsKIAl9CiAKIAlfX3JxID0gY2ZxX2ZpbmRfcnFfcmIoY2ZxZCwgYmlvLT5iaV9zZWN0b3IgKyBiaW9fc2VjdG9ycyhiaW8pKTsKLQlpZiAoX19ycSkgewotCQlpZiAoZWx2X3JxX21lcmdlX29rKF9fcnEsIGJpbykpIHsKLQkJCXJldCA9IEVMRVZBVE9SX0ZST05UX01FUkdFOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoX19ycSAmJiBlbHZfcnFfbWVyZ2Vfb2soX19ycSwgYmlvKSkgeworCQlyZXQgPSBFTEVWQVRPUl9GUk9OVF9NRVJHRTsKKwkJZ290byBvdXQ7CiAJfQogCiAJcmV0dXJuIEVMRVZBVE9SX05PX01FUkdFOwpAQCAtNzA5LDIwICs3NzAsMjIwIEBACiBjZnFfbWVyZ2VkX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLAogCQkgICAgc3RydWN0IHJlcXVlc3QgKm5leHQpCiB7Ci0Jc3RydWN0IGNmcV9ycSAqY3JxID0gUlFfREFUQShycSk7Ci0Jc3RydWN0IGNmcV9ycSAqY25leHQgPSBSUV9EQVRBKG5leHQpOwotCiAJY2ZxX21lcmdlZF9yZXF1ZXN0KHEsIHJxKTsKIAotCWlmICghbGlzdF9lbXB0eSgmcnEtPnF1ZXVlbGlzdCkgJiYgIWxpc3RfZW1wdHkoJm5leHQtPnF1ZXVlbGlzdCkpIHsKLQkJaWYgKHRpbWVfYmVmb3JlKGNuZXh0LT5xdWV1ZV9zdGFydCwgY3JxLT5xdWV1ZV9zdGFydCkpIHsKLQkJCWxpc3RfbW92ZSgmcnEtPnF1ZXVlbGlzdCwgJm5leHQtPnF1ZXVlbGlzdCk7Ci0JCQljcnEtPnF1ZXVlX3N0YXJ0ID0gY25leHQtPnF1ZXVlX3N0YXJ0OwotCQl9CisJLyoKKwkgKiByZXBvc2l0aW9uIGluIGZpZm8gaWYgbmV4dCBpcyBvbGRlciB0aGFuIHJxCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZycS0+cXVldWVsaXN0KSAmJiAhbGlzdF9lbXB0eSgmbmV4dC0+cXVldWVsaXN0KSAmJgorCSAgICB0aW1lX2JlZm9yZShuZXh0LT5zdGFydF90aW1lLCBycS0+c3RhcnRfdGltZSkpCisJCWxpc3RfbW92ZSgmcnEtPnF1ZXVlbGlzdCwgJm5leHQtPnF1ZXVlbGlzdCk7CisKKwljZnFfcmVtb3ZlX3JlcXVlc3QocSwgbmV4dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19jZnFfc2V0X2FjdGl2ZV9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCit7CisJaWYgKGNmcXEpIHsKKwkJLyoKKwkJICogc3RvcCBwb3RlbnRpYWwgaWRsZSBjbGFzcyBxdWV1ZXMgd2FpdGluZyBzZXJ2aWNlCisJCSAqLworCQlkZWxfdGltZXIoJmNmcWQtPmlkbGVfY2xhc3NfdGltZXIpOworCisJCWNmcXEtPnNsaWNlX3N0YXJ0ID0gamlmZmllczsKKwkJY2ZxcS0+c2xpY2VfZW5kID0gMDsKKwkJY2ZxcS0+c2xpY2VfbGVmdCA9IDA7CisJCWNmcV9jbGVhcl9jZnFxX211c3RfYWxsb2Nfc2xpY2UoY2ZxcSk7CisJCWNmcV9jbGVhcl9jZnFxX2ZpZm9fZXhwaXJlKGNmcXEpOworCQljZnFfY2xlYXJfY2ZxcV9leHBpcmVkKGNmcXEpOwogCX0KIAotCWNmcV91cGRhdGVfbmV4dF9jcnEoY25leHQpOwotCWNmcV9yZW1vdmVfcmVxdWVzdChxLCBuZXh0KTsKKwljZnFkLT5hY3RpdmVfcXVldWUgPSBjZnFxOworfQorCisvKgorICogMAorICogMCwxCisgKiAwLDEsMgorICogMCwxLDIsMworICogMCwxLDIsMyw0CisgKiAwLDEsMiwzLDQsNQorICogMCwxLDIsMyw0LDUsNgorICogMCwxLDIsMyw0LDUsNiw3CisgKi8KK3N0YXRpYyBpbnQgY2ZxX2dldF9uZXh0X3ByaW9fbGV2ZWwoc3RydWN0IGNmcV9kYXRhICpjZnFkKQoreworCWludCBwcmlvLCB3cmFwOworCisJcHJpbyA9IC0xOworCXdyYXAgPSAwOworCWRvIHsKKwkJaW50IHA7CisKKwkJZm9yIChwID0gY2ZxZC0+Y3VyX3ByaW87IHAgPD0gY2ZxZC0+Y3VyX2VuZF9wcmlvOyBwKyspIHsKKwkJCWlmICghbGlzdF9lbXB0eSgmY2ZxZC0+cnJfbGlzdFtwXSkpIHsKKwkJCQlwcmlvID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChwcmlvICE9IC0xKQorCQkJYnJlYWs7CisJCWNmcWQtPmN1cl9wcmlvID0gMDsKKwkJaWYgKCsrY2ZxZC0+Y3VyX2VuZF9wcmlvID09IENGUV9QUklPX0xJU1RTKSB7CisJCQljZnFkLT5jdXJfZW5kX3ByaW8gPSAwOworCQkJaWYgKHdyYXApCisJCQkJYnJlYWs7CisJCQl3cmFwID0gMTsKKwkJfQorCX0gd2hpbGUgKDEpOworCisJaWYgKHVubGlrZWx5KHByaW8gPT0gLTEpKQorCQlyZXR1cm4gLTE7CisKKwlCVUdfT04ocHJpbyA+PSBDRlFfUFJJT19MSVNUUyk7CisKKwlsaXN0X3NwbGljZV9pbml0KCZjZnFkLT5ycl9saXN0W3ByaW9dLCAmY2ZxZC0+Y3VyX3JyKTsKKworCWNmcWQtPmN1cl9wcmlvID0gcHJpbyArIDE7CisJaWYgKGNmcWQtPmN1cl9wcmlvID4gY2ZxZC0+Y3VyX2VuZF9wcmlvKSB7CisJCWNmcWQtPmN1cl9lbmRfcHJpbyA9IGNmcWQtPmN1cl9wcmlvOworCQljZnFkLT5jdXJfcHJpbyA9IDA7CisJfQorCWlmIChjZnFkLT5jdXJfZW5kX3ByaW8gPT0gQ0ZRX1BSSU9fTElTVFMpIHsKKwkJY2ZxZC0+Y3VyX3ByaW8gPSAwOworCQljZnFkLT5jdXJfZW5kX3ByaW8gPSAwOworCX0KKworCXJldHVybiBwcmlvOworfQorCitzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX3NldF9hY3RpdmVfcXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkKQoreworCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CisKKwkvKgorCSAqIGlmIGN1cnJlbnQgcXVldWUgaXMgZXhwaXJlZCBidXQgbm90IGRvbmUgd2l0aCBpdHMgcmVxdWVzdHMgeWV0LAorCSAqIHdhaXQgZm9yIHRoYXQgdG8gaGFwcGVuCisJICovCisJaWYgKChjZnFxID0gY2ZxZC0+YWN0aXZlX3F1ZXVlKSAhPSBOVUxMKSB7CisJCWlmIChjZnFfY2ZxcV9leHBpcmVkKGNmcXEpICYmIGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIGlmIGN1cnJlbnQgbGlzdCBpcyBub24tZW1wdHksIGdyYWIgZmlyc3QgZW50cnkuIGlmIGl0IGlzIGVtcHR5LAorCSAqIGdldCBuZXh0IHByaW8gbGV2ZWwgYW5kIGdyYWIgZmlyc3QgZW50cnkgdGhlbiBpZiBhbnkgYXJlIHNwbGljZWQKKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNmcWQtPmN1cl9ycikgfHwgY2ZxX2dldF9uZXh0X3ByaW9fbGV2ZWwoY2ZxZCkgIT0gLTEpCisJCWNmcXEgPSBsaXN0X2VudHJ5X2NmcXEoY2ZxZC0+Y3VyX3JyLm5leHQpOworCisJLyoKKwkgKiBpZiB3ZSBoYXZlIGlkbGUgcXVldWVzIGFuZCBubyBydCBvciBiZSBxdWV1ZXMgaGFkIHBlbmRpbmcKKwkgKiByZXF1ZXN0cywgZWl0aGVyIGFsbG93IGltbWVkaWF0ZSBzZXJ2aWNlIGlmIHRoZSBncmFjZSBwZXJpb2QKKwkgKiBoYXMgcGFzc2VkIG9yIGFybSB0aGUgaWRsZSBncmFjZSB0aW1lcgorCSAqLworCWlmICghY2ZxcSAmJiAhbGlzdF9lbXB0eSgmY2ZxZC0+aWRsZV9ycikpIHsKKwkJdW5zaWduZWQgbG9uZyBlbmQgPSBjZnFkLT5sYXN0X2VuZF9yZXF1ZXN0ICsgQ0ZRX0lETEVfR1JBQ0U7CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSkKKwkJCWNmcXEgPSBsaXN0X2VudHJ5X2NmcXEoY2ZxZC0+aWRsZV9yci5uZXh0KTsKKwkJZWxzZQorCQkJbW9kX3RpbWVyKCZjZnFkLT5pZGxlX2NsYXNzX3RpbWVyLCBlbmQpOworCX0KKworCV9fY2ZxX3NldF9hY3RpdmVfcXVldWUoY2ZxZCwgY2ZxcSk7CisJcmV0dXJuIGNmcXE7Cit9CisKKy8qCisgKiBjdXJyZW50IGNmcXEgZXhwaXJlZCBpdHMgc2xpY2UgKG9yIHdhcyB0b28gaWRsZSksIHNlbGVjdCBuZXcgb25lCisgKi8KK3N0YXRpYyB2b2lkCitfX2NmcV9zbGljZV9leHBpcmVkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwKKwkJICAgIGludCBwcmVlbXB0ZWQpCit7CisJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOworCisJaWYgKGNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSkKKwkJZGVsX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKKworCWlmICghcHJlZW1wdGVkICYmICFjZnFfY2ZxcV9kaXNwYXRjaGVkKGNmcXEpKQorCQljZnFxLT5zZXJ2aWNlX2xhc3QgPSBub3c7CisKKwljZnFfY2xlYXJfY2ZxcV9tdXN0X2Rpc3BhdGNoKGNmcXEpOworCWNmcV9jbGVhcl9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKTsKKworCS8qCisJICogc3RvcmUgd2hhdCB3YXMgbGVmdCBvZiB0aGlzIHNsaWNlLCBpZiB0aGUgcXVldWUgaWRsZWQgb3V0CisJICogb3Igd2FzIHByZWVtcHRlZAorCSAqLworCWlmICh0aW1lX2FmdGVyKG5vdywgY2ZxcS0+c2xpY2VfZW5kKSkKKwkJY2ZxcS0+c2xpY2VfbGVmdCA9IG5vdyAtIGNmcXEtPnNsaWNlX2VuZDsKKwllbHNlCisJCWNmcXEtPnNsaWNlX2xlZnQgPSAwOworCisJaWYgKGNmcV9jZnFxX29uX3JyKGNmcXEpKQorCQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgcHJlZW1wdGVkKTsKKworCWlmIChjZnFxID09IGNmcWQtPmFjdGl2ZV9xdWV1ZSkKKwkJY2ZxZC0+YWN0aXZlX3F1ZXVlID0gTlVMTDsKKworCWlmIChjZnFkLT5hY3RpdmVfY2ljKSB7CisJCXB1dF9pb19jb250ZXh0KGNmcWQtPmFjdGl2ZV9jaWMtPmlvYyk7CisJCWNmcWQtPmFjdGl2ZV9jaWMgPSBOVUxMOworCX0KKworCWNmcWQtPmRpc3BhdGNoX3NsaWNlID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNmcV9zbGljZV9leHBpcmVkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgaW50IHByZWVtcHRlZCkKK3sKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY2ZxZC0+YWN0aXZlX3F1ZXVlOworCisJaWYgKGNmcXEpIHsKKwkJLyoKKwkJICogdXNlIGRlZmVycmVkIGV4cGlyeSwgaWYgdGhlcmUgYXJlIHJlcXVlc3RzIGluIHByb2dyZXNzIGFzCisJCSAqIG5vdCB0byBkaXN0dXJiIHRoZSBzbGljZSBvZiB0aGUgbmV4dCBxdWV1ZQorCQkgKi8KKwkJaWYgKGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpCisJCQljZnFfbWFya19jZnFxX2V4cGlyZWQoY2ZxcSk7CisJCWVsc2UKKwkJCV9fY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgY2ZxcSwgcHJlZW1wdGVkKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2ZxX2FybV9zbGljZV90aW1lcihzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCisKK3sKKwlXQVJOX09OKCFSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSk7CisJV0FSTl9PTihjZnFxICE9IGNmcWQtPmFjdGl2ZV9xdWV1ZSk7CisKKwkvKgorCSAqIGlkbGUgaXMgZGlzYWJsZWQsIGVpdGhlciBtYW51YWxseSBvciBieSBwYXN0IHByb2Nlc3MgaGlzdG9yeQorCSAqLworCWlmICghY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpCisJCXJldHVybiAwOworCWlmICghY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSkpCisJCXJldHVybiAwOworCS8qCisJICogdGFzayBoYXMgZXhpdGVkLCBkb24ndCB3YWl0CisJICovCisJaWYgKGNmcWQtPmFjdGl2ZV9jaWMgJiYgIWNmcWQtPmFjdGl2ZV9jaWMtPmlvYy0+dGFzaykKKwkJcmV0dXJuIDA7CisKKwljZnFfbWFya19jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSk7CisJY2ZxX21hcmtfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSk7CisKKwlpZiAoIXRpbWVyX3BlbmRpbmcoJmNmcWQtPmlkbGVfc2xpY2VfdGltZXIpKSB7CisJCXVuc2lnbmVkIGxvbmcgc2xpY2VfbGVmdCA9IG1pbihjZnFxLT5zbGljZV9lbmQgLSAxLCAodW5zaWduZWQgbG9uZykgY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpOworCisJCWNmcWQtPmlkbGVfc2xpY2VfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBzbGljZV9sZWZ0OworCQlhZGRfdGltZXIoJmNmcWQtPmlkbGVfc2xpY2VfdGltZXIpOworCX0KKworCXJldHVybiAxOwogfQogCiAvKgpAQCAtNzM4LDMxICs5OTksNDAgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqX19ycTsKIAlzZWN0b3JfdCBsYXN0OwogCi0JY2ZxX2RlbF9jcnFfcmIoY3JxKTsKLQljZnFfcmVtb3ZlX21lcmdlX2hpbnRzKHEsIGNycSk7CiAJbGlzdF9kZWwoJmNycS0+cmVxdWVzdC0+cXVldWVsaXN0KTsKIAogCWxhc3QgPSBjZnFkLT5sYXN0X3NlY3RvcjsKLQl3aGlsZSAoKGVudHJ5ID0gZW50cnktPnByZXYpICE9IGhlYWQpIHsKLQkJX19ycSA9IGxpc3RfZW50cnlfcnEoZW50cnkpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShfX3JxLCBoZWFkLCBxdWV1ZWxpc3QpIHsKKwkJc3RydWN0IGNmcV9ycSAqX19jcnEgPSBSUV9EQVRBKF9fcnEpOwogCi0JCWlmIChibGtfYmFycmllcl9ycShjcnEtPnJlcXVlc3QpKQorCQlpZiAoYmxrX2JhcnJpZXJfcnEoX19ycSkpCiAJCQlicmVhazsKLQkJaWYgKCFibGtfZnNfcmVxdWVzdChjcnEtPnJlcXVlc3QpKQorCQlpZiAoIWJsa19mc19yZXF1ZXN0KF9fcnEpKQorCQkJYnJlYWs7CisJCWlmIChjZnFfY3JxX3JlcXVldWVkKF9fY3JxKSkKIAkJCWJyZWFrOwogCi0JCWlmIChjcnEtPnJlcXVlc3QtPnNlY3RvciA+IF9fcnEtPnNlY3RvcikKKwkJaWYgKF9fcnEtPnNlY3RvciA8PSBjcnEtPnJlcXVlc3QtPnNlY3RvcikKIAkJCWJyZWFrOwogCQlpZiAoX19ycS0+c2VjdG9yID4gbGFzdCAmJiBjcnEtPnJlcXVlc3QtPnNlY3RvciA8IGxhc3QpIHsKLQkJCWxhc3QgPSBjcnEtPnJlcXVlc3QtPnNlY3RvcjsKKwkJCWxhc3QgPSBjcnEtPnJlcXVlc3QtPnNlY3RvciArIGNycS0+cmVxdWVzdC0+bnJfc2VjdG9yczsKIAkJCWJyZWFrOwogCQl9CisJCWVudHJ5ID0gJl9fcnEtPnF1ZXVlbGlzdDsKIAl9CiAKIAljZnFkLT5sYXN0X3NlY3RvciA9IGxhc3Q7Ci0JY3JxLT5pbl9mbGlnaHQgPSAxOwotCWNmcXEtPmluX2ZsaWdodCsrOwotCWxpc3RfYWRkKCZjcnEtPnJlcXVlc3QtPnF1ZXVlbGlzdCwgZW50cnkpOworCisJY2ZxcS0+bmV4dF9jcnEgPSBjZnFfZmluZF9uZXh0X2NycShjZnFkLCBjZnFxLCBjcnEpOworCisJY2ZxX2RlbF9jcnFfcmIoY3JxKTsKKwljZnFfcmVtb3ZlX21lcmdlX2hpbnRzKHEsIGNycSk7CisKKwljZnFfbWFya19jcnFfaW5fZmxpZ2h0KGNycSk7CisJY2ZxX2NsZWFyX2NycV9yZXF1ZXVlZChjcnEpOworCisJY2ZxcS0+b25fZGlzcGF0Y2hbY2ZxX2NycV9pc19zeW5jKGNycSldKys7CisJbGlzdF9hZGRfdGFpbCgmY3JxLT5yZXF1ZXN0LT5xdWV1ZWxpc3QsIGVudHJ5KTsKIH0KIAogLyoKQEAgLTc3MSwxNzMgKzEwNDEsMjI1IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjZnFfcnEgKmNmcV9jaGVja19maWZvKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKLQljb25zdCBpbnQgcmVhZHMgPSAhbGlzdF9lbXB0eSgmY2ZxcS0+Zmlmb1swXSk7Ci0JY29uc3QgaW50IHdyaXRlcyA9ICFsaXN0X2VtcHR5KCZjZnFxLT5maWZvWzFdKTsKLQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJc3RydWN0IHJlcXVlc3QgKnJxOwogCXN0cnVjdCBjZnFfcnEgKmNycTsKIAotCWlmICh0aW1lX2JlZm9yZShub3csIGNmcXEtPmxhc3RfZmlmb19leHBpcmUgKyBjZnFkLT5jZnFfZmlmb19iYXRjaF9leHBpcmUpKQorCWlmIChjZnFfY2ZxcV9maWZvX2V4cGlyZShjZnFxKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQljcnEgPSBSUV9EQVRBKGxpc3RfZW50cnkoY2ZxcS0+Zmlmb1swXS5uZXh0LCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KSk7Ci0JaWYgKHJlYWRzICYmIHRpbWVfYWZ0ZXIobm93LCBjcnEtPnF1ZXVlX3N0YXJ0ICsgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlX3IpKSB7Ci0JCWNmcXEtPmxhc3RfZmlmb19leHBpcmUgPSBub3c7Ci0JCXJldHVybiBjcnE7Ci0JfQorCWlmICghbGlzdF9lbXB0eSgmY2ZxcS0+ZmlmbykpIHsKKwkJaW50IGZpZm8gPSBjZnFfY2ZxcV9jbGFzc19zeW5jKGNmcXEpOwogCi0JY3JxID0gUlFfREFUQShsaXN0X2VudHJ5KGNmcXEtPmZpZm9bMV0ubmV4dCwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCkpOwotCWlmICh3cml0ZXMgJiYgdGltZV9hZnRlcihub3csIGNycS0+cXVldWVfc3RhcnQgKyBjZnFkLT5jZnFfZmlmb19leHBpcmVfdykpIHsKLQkJY2ZxcS0+bGFzdF9maWZvX2V4cGlyZSA9IG5vdzsKLQkJcmV0dXJuIGNycTsKKwkJY3JxID0gUlFfREFUQShsaXN0X2VudHJ5X2ZpZm8oY2ZxcS0+Zmlmby5uZXh0KSk7CisJCXJxID0gY3JxLT5yZXF1ZXN0OworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBycS0+c3RhcnRfdGltZSArIGNmcWQtPmNmcV9maWZvX2V4cGlyZVtmaWZvXSkpIHsKKwkJCWNmcV9tYXJrX2NmcXFfZmlmb19leHBpcmUoY2ZxcSk7CisJCQlyZXR1cm4gY3JxOworCQl9CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qCi0gKiBkaXNwYXRjaCBhIHNpbmdsZSByZXF1ZXN0IGZyb20gZ2l2ZW4gcXVldWUKKyAqIFNjYWxlIHNjaGVkdWxlIHNsaWNlIGJhc2VkIG9uIGlvIHByaW9yaXR5LiBVc2UgdGhlIHN5bmMgdGltZSBzbGljZSBvbmx5CisgKiBpZiBhIHF1ZXVlIGlzIG1hcmtlZCBzeW5jIGFuZCBoYXMgc3luYyBpbyBxdWV1ZWQuIEEgc3luYyBxdWV1ZSB3aXRoIGFzeW5jCisgKiBpbyBvbmx5LCBzaG91bGQgbm90IGdldCBmdWxsIHN5bmMgc2xpY2UgbGVuZ3RoLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWNmcV9kaXNwYXRjaF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGNmcV9kYXRhICpjZnFkLAotCQkgICAgIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCitzdGF0aWMgaW5saW5lIGludAorY2ZxX3ByaW9fdG9fc2xpY2Uoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogewotCXN0cnVjdCBjZnFfcnEgKmNycTsKKwljb25zdCBpbnQgYmFzZV9zbGljZSA9IGNmcWQtPmNmcV9zbGljZVtjZnFfY2ZxcV9zeW5jKGNmcXEpXTsKIAotCS8qCi0JICogZm9sbG93IGV4cGlyZWQgcGF0aCwgZWxzZSBnZXQgZmlyc3QgbmV4dCBhdmFpbGFibGUKLQkgKi8KLQlpZiAoKGNycSA9IGNmcV9jaGVja19maWZvKGNmcXEpKSA9PSBOVUxMKSB7Ci0JCWlmIChjZnFkLT5maW5kX2Jlc3RfY3JxKQotCQkJY3JxID0gY2ZxcS0+bmV4dF9jcnE7Ci0JCWVsc2UKLQkJCWNycSA9IHJiX2VudHJ5X2NycShyYl9maXJzdCgmY2ZxcS0+c29ydF9saXN0KSk7Ci0JfQorCVdBUk5fT04oY2ZxcS0+aW9wcmlvID49IElPUFJJT19CRV9OUik7CiAKLQljZnFkLT5sYXN0X3NlY3RvciA9IGNycS0+cmVxdWVzdC0+c2VjdG9yICsgY3JxLT5yZXF1ZXN0LT5ucl9zZWN0b3JzOwotCi0JLyoKLQkgKiBmaW5hbGx5LCBpbnNlcnQgcmVxdWVzdCBpbnRvIGRyaXZlciBsaXN0Ci0JICovCi0JY2ZxX2Rpc3BhdGNoX3NvcnQocSwgY3JxKTsKKwlyZXR1cm4gYmFzZV9zbGljZSArIChiYXNlX3NsaWNlL0NGUV9TTElDRV9TQ0FMRSAqICg0IC0gY2ZxcS0+aW9wcmlvKSk7CiB9CiAKLXN0YXRpYyBpbnQgY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IG1heF9kaXNwYXRjaCkKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2ZxX3NldF9wcmlvX3NsaWNlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwljZnFxLT5zbGljZV9lbmQgPSBjZnFfcHJpb190b19zbGljZShjZnFkLCBjZnFxKSArIGppZmZpZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjZnFfcHJpb190b19tYXhycShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCit7CisJY29uc3QgaW50IGJhc2VfcnEgPSBjZnFkLT5jZnFfc2xpY2VfYXN5bmNfcnE7CisKKwlXQVJOX09OKGNmcXEtPmlvcHJpbyA+PSBJT1BSSU9fQkVfTlIpOworCisJcmV0dXJuIDIgKiAoYmFzZV9ycSArIGJhc2VfcnEgKiAoQ0ZRX1BSSU9fTElTVFMgLSAxIC0gY2ZxcS0+aW9wcmlvKSk7Cit9CisKKy8qCisgKiBnZXQgbmV4dCBxdWV1ZSBmb3Igc2VydmljZQorICovCitzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGludCBmb3JjZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKKworCWNmcXEgPSBjZnFkLT5hY3RpdmVfcXVldWU7CisJaWYgKCFjZnFxKQorCQlnb3RvIG5ld19xdWV1ZTsKKworCWlmIChjZnFfY2ZxcV9leHBpcmVkKGNmcXEpKQorCQlnb3RvIG5ld19xdWV1ZTsKKworCS8qCisJICogc2xpY2UgaGFzIGV4cGlyZWQKKwkgKi8KKwlpZiAoIWNmcV9jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSkgJiYgdGltZV9hZnRlcihub3csIGNmcXEtPnNsaWNlX2VuZCkpCisJCWdvdG8gZXhwaXJlOworCisJLyoKKwkgKiBpZiBxdWV1ZSBoYXMgcmVxdWVzdHMsIGRpc3BhdGNoIG9uZS4gaWYgbm90LCBjaGVjayBpZgorCSAqIGVub3VnaCBzbGljZSBpcyBsZWZ0IHRvIHdhaXQgZm9yIG9uZQorCSAqLworCWlmICghUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkpCisJCWdvdG8ga2VlcF9xdWV1ZTsKKwllbHNlIGlmICghZm9yY2UgJiYgY2ZxX2NmcXFfY2xhc3Nfc3luYyhjZnFxKSAmJgorCQkgdGltZV9iZWZvcmUobm93LCBjZnFxLT5zbGljZV9lbmQpKSB7CisJCWlmIChjZnFfYXJtX3NsaWNlX3RpbWVyKGNmcWQsIGNmcXEpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCitleHBpcmU6CisJY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCk7CituZXdfcXVldWU6CisJY2ZxcSA9IGNmcV9zZXRfYWN0aXZlX3F1ZXVlKGNmcWQpOwora2VlcF9xdWV1ZToKKwlyZXR1cm4gY2ZxcTsKK30KKworc3RhdGljIGludAorX19jZnFfZGlzcGF0Y2hfcmVxdWVzdHMoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAorCQkJaW50IG1heF9kaXNwYXRjaCkKK3sKKwlpbnQgZGlzcGF0Y2hlZCA9IDA7CisKKwlCVUdfT04oUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkpOworCisJZG8geworCQlzdHJ1Y3QgY2ZxX3JxICpjcnE7CisKKwkJLyoKKwkJICogZm9sbG93IGV4cGlyZWQgcGF0aCwgZWxzZSBnZXQgZmlyc3QgbmV4dCBhdmFpbGFibGUKKwkJICovCisJCWlmICgoY3JxID0gY2ZxX2NoZWNrX2ZpZm8oY2ZxcSkpID09IE5VTEwpCisJCQljcnEgPSBjZnFxLT5uZXh0X2NycTsKKworCQkvKgorCQkgKiBmaW5hbGx5LCBpbnNlcnQgcmVxdWVzdCBpbnRvIGRyaXZlciBkaXNwYXRjaCBsaXN0CisJCSAqLworCQljZnFfZGlzcGF0Y2hfc29ydChjZnFkLT5xdWV1ZSwgY3JxKTsKKworCQljZnFkLT5kaXNwYXRjaF9zbGljZSsrOworCQlkaXNwYXRjaGVkKys7CisKKwkJaWYgKCFjZnFkLT5hY3RpdmVfY2ljKSB7CisJCQlhdG9taWNfaW5jKCZjcnEtPmlvX2NvbnRleHQtPmlvYy0+cmVmY291bnQpOworCQkJY2ZxZC0+YWN0aXZlX2NpYyA9IGNycS0+aW9fY29udGV4dDsKKwkJfQorCisJCWlmIChSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoZGlzcGF0Y2hlZCA8IG1heF9kaXNwYXRjaCk7CisKKwkvKgorCSAqIGlmIHNsaWNlIGVuZCBpc24ndCBzZXQgeWV0LCBzZXQgaXQuIGlmIGF0IGxlYXN0IG9uZSByZXF1ZXN0IHdhcworCSAqIHN5bmMsIHVzZSB0aGUgc3luYyB0aW1lIHNsaWNlIHZhbHVlCisJICovCisJaWYgKCFjZnFxLT5zbGljZV9lbmQpCisJCWNmcV9zZXRfcHJpb19zbGljZShjZnFkLCBjZnFxKTsKKworCS8qCisJICogZXhwaXJlIGFuIGFzeW5jIHF1ZXVlIGltbWVkaWF0ZWx5IGlmIGl0IGhhcyB1c2VkIHVwIGl0cyBzbGljZS4gaWRsZQorCSAqIHF1ZXVlIGFsd2F5cyBleHBpcmUgYWZ0ZXIgMSBkaXNwYXRjaCByb3VuZC4KKwkgKi8KKwlpZiAoKCFjZnFfY2ZxcV9zeW5jKGNmcXEpICYmCisJICAgIGNmcWQtPmRpc3BhdGNoX3NsaWNlID49IGNmcV9wcmlvX3RvX21heHJxKGNmcWQsIGNmcXEpKSB8fAorCSAgICBjZnFfY2xhc3NfaWRsZShjZnFxKSkKKwkJY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgMCk7CisKKwlyZXR1cm4gZGlzcGF0Y2hlZDsKK30KKworc3RhdGljIGludAorY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IG1heF9kaXNwYXRjaCwgaW50IGZvcmNlKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICp0bXA7Ci0JaW50IHF1ZXVlZCwgYnVzeV9xdWV1ZXMsIGZpcnN0X3JvdW5kOwogCi0JaWYgKGxpc3RfZW1wdHkoJmNmcWQtPnJyX2xpc3QpKQorCWlmICghY2ZxZC0+YnVzeV9xdWV1ZXMpCiAJCXJldHVybiAwOwogCi0JcXVldWVkID0gMDsKLQlmaXJzdF9yb3VuZCA9IDE7Ci1yZXN0YXJ0OgotCWJ1c3lfcXVldWVzID0gMDsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmNmcWQtPnJyX2xpc3QpIHsKLQkJY2ZxcSA9IGxpc3RfZW50cnlfY2ZxcShlbnRyeSk7CisJY2ZxcSA9IGNmcV9zZWxlY3RfcXVldWUoY2ZxZCwgZm9yY2UpOworCWlmIChjZnFxKSB7CisJCWNmcV9jbGVhcl9jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSk7CisJCWNmcV9jbGVhcl9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKTsKKwkJZGVsX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKIAotCQlCVUdfT04oUkJfRU1QVFkoJmNmcXEtPnNvcnRfbGlzdCkpOworCQlpZiAoY2ZxX2NsYXNzX2lkbGUoY2ZxcSkpCisJCQltYXhfZGlzcGF0Y2ggPSAxOwogCi0JCS8qCi0JCSAqIGZpcnN0IHJvdW5kIG9mIHF1ZXVlaW5nLCBvbmx5IHNlbGVjdCBmcm9tIHF1ZXVlcyB0aGF0Ci0JCSAqIGRvbid0IGFscmVhZHkgaGF2ZSBpbyBpbi1mbGlnaHQKLQkJICovCi0JCWlmIChmaXJzdF9yb3VuZCAmJiBjZnFxLT5pbl9mbGlnaHQpCi0JCQljb250aW51ZTsKLQotCQljZnFfZGlzcGF0Y2hfcmVxdWVzdChxLCBjZnFkLCBjZnFxKTsKLQotCQlpZiAoIVJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKQotCQkJYnVzeV9xdWV1ZXMrKzsKLQotCQlxdWV1ZWQrKzsKKwkJcmV0dXJuIF9fY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKGNmcWQsIGNmcXEsIG1heF9kaXNwYXRjaCk7CiAJfQogCi0JaWYgKChxdWV1ZWQgPCBtYXhfZGlzcGF0Y2gpICYmIChidXN5X3F1ZXVlcyB8fCBmaXJzdF9yb3VuZCkpIHsKLQkJZmlyc3Rfcm91bmQgPSAwOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JcmV0dXJuIHF1ZXVlZDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNmcV9hY2NvdW50X2Rpc3BhdGNoKHN0cnVjdCBjZnFfcnEgKmNycSkKIHsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY3JxLT5jZnFfcXVldWU7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKLQl1bnNpZ25lZCBsb25nIG5vdywgZWxhcHNlZDsKIAotCWlmICghYmxrX2ZzX3JlcXVlc3QoY3JxLT5yZXF1ZXN0KSkKKwlpZiAodW5saWtlbHkoIWJsa19mc19yZXF1ZXN0KGNycS0+cmVxdWVzdCkpKQogCQlyZXR1cm47CiAKIAkvKgogCSAqIGFjY291bnRlZCBiaXQgaXMgbmVjZXNzYXJ5IHNpbmNlIHNvbWUgZHJpdmVycyB3aWxsIGNhbGwKIAkgKiBlbHZfbmV4dF9yZXF1ZXN0KCkgbWFueSB0aW1lcyBmb3IgdGhlIHNhbWUgcmVxdWVzdCAoZWcgaWRlKQogCSAqLwotCWlmIChjcnEtPmFjY291bnRlZCkKKwlpZiAoY2ZxX2NycV9pbl9kcml2ZXIoY3JxKSkKIAkJcmV0dXJuOwogCi0Jbm93ID0gamlmZmllczsKLQlpZiAoY2ZxcS0+c2VydmljZV9zdGFydCA9PSB+MFVMKQotCQljZnFxLT5zZXJ2aWNlX3N0YXJ0ID0gbm93OwotCi0JLyoKLQkgKiBvbiBkcml2ZXMgd2l0aCB0YWdnZWQgY29tbWFuZCBxdWV1ZWluZywgY29tbWFuZCB0dXJuLWFyb3VuZCB0aW1lCi0JICogZG9lc24ndCBuZWNlc3NhcmlseSByZWZsZWN0IHRoZSB0aW1lIHNwZW50IHByb2Nlc3NpbmcgdGhpcyB2ZXJ5Ci0JICogY29tbWFuZCBpbnNpZGUgdGhlIGRyaXZlLiBzbyBkbyB0aGUgYWNjb3VudGluZyBkaWZmZXJlbnRseSB0aGVyZSwKLQkgKiBieSBqdXN0IHNvcnRpbmcgb24gdGhlIG51bWJlciBvZiByZXF1ZXN0cwotCSAqLwotCWlmIChjZnFkLT5jZnFfdGFnZ2VkKSB7Ci0JCWlmICh0aW1lX2FmdGVyKG5vdywgY2ZxcS0+c2VydmljZV9zdGFydCArIGNmcV9zZXJ2aWNlKSkgewotCQkJY2ZxcS0+c2VydmljZV9zdGFydCA9IG5vdzsKLQkJCWNmcXEtPnNlcnZpY2VfdXNlZCAvPSAxMDsKLQkJfQotCi0JCWNmcXEtPnNlcnZpY2VfdXNlZCsrOwotCQljZnFfc29ydF9ycl9saXN0KGNmcXEsIDApOwotCX0KLQotCWVsYXBzZWQgPSBub3cgLSBjcnEtPnF1ZXVlX3N0YXJ0OwotCWlmIChlbGFwc2VkID4gbWF4X2VsYXBzZWRfZGlzcGF0Y2gpCi0JCW1heF9lbGFwc2VkX2Rpc3BhdGNoID0gZWxhcHNlZDsKLQotCWNycS0+YWNjb3VudGVkID0gMTsKLQljcnEtPnNlcnZpY2Vfc3RhcnQgPSBub3c7Ci0KLQlpZiAoKytjZnFkLT5ycV9pbl9kcml2ZXIgPj0gQ0ZRX01BWF9UQUcgJiYgIWNmcWQtPmNmcV90YWdnZWQpIHsKLQkJY2ZxcS0+Y2ZxZC0+Y2ZxX3RhZ2dlZCA9IDE7Ci0JCXByaW50aygiY2ZxOiBkZXB0aCAlZCByZWFjaGVkLCB0YWdnaW5nIG5vdyBvblxuIiwgQ0ZRX01BWF9UQUcpOwotCX0KKwljZnFfbWFya19jcnFfaW5fZHJpdmVyKGNycSk7CisJY2ZxZC0+cnFfaW5fZHJpdmVyKys7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogY2ZxX2FjY291bnRfY29tcGxldGlvbihzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLCBzdHJ1Y3QgY2ZxX3JxICpjcnEpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKKwl1bnNpZ25lZCBsb25nIG5vdzsKIAotCWlmICghY3JxLT5hY2NvdW50ZWQpCisJaWYgKCFjZnFfY3JxX2luX2RyaXZlcihjcnEpKQogCQlyZXR1cm47CiAKKwlub3cgPSBqaWZmaWVzOworCiAJV0FSTl9PTighY2ZxZC0+cnFfaW5fZHJpdmVyKTsKIAljZnFkLT5ycV9pbl9kcml2ZXItLTsKIAotCWlmICghY2ZxZC0+Y2ZxX3RhZ2dlZCkgewotCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0JCXVuc2lnbmVkIGxvbmcgZHVyYXRpb24gPSBub3cgLSBjcnEtPnNlcnZpY2Vfc3RhcnQ7CisJaWYgKCFjZnFfY2xhc3NfaWRsZShjZnFxKSkKKwkJY2ZxZC0+bGFzdF9lbmRfcmVxdWVzdCA9IG5vdzsKIAotCQlpZiAodGltZV9hZnRlcihub3csIGNmcXEtPnNlcnZpY2Vfc3RhcnQgKyBjZnFfc2VydmljZSkpIHsKLQkJCWNmcXEtPnNlcnZpY2Vfc3RhcnQgPSBub3c7Ci0JCQljZnFxLT5zZXJ2aWNlX3VzZWQgPj49IDM7CisJaWYgKCFjZnFfY2ZxcV9kaXNwYXRjaGVkKGNmcXEpKSB7CisJCWlmIChjZnFfY2ZxcV9vbl9ycihjZnFxKSkgeworCQkJY2ZxcS0+c2VydmljZV9sYXN0ID0gbm93OworCQkJY2ZxX3Jlc29ydF9ycl9saXN0KGNmcXEsIDApOwogCQl9Ci0KLQkJY2ZxcS0+c2VydmljZV91c2VkICs9IGR1cmF0aW9uOwotCQljZnFfc29ydF9ycl9saXN0KGNmcXEsIDApOwotCi0JCWlmIChkdXJhdGlvbiA+IG1heF9lbGFwc2VkX2NycSkKLQkJCW1heF9lbGFwc2VkX2NycSA9IGR1cmF0aW9uOworCQlpZiAoY2ZxX2NmcXFfZXhwaXJlZChjZnFxKSkgeworCQkJX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCAwKTsKKwkJCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKKwkJfQogCX0KKworCWlmIChjZnFfY3JxX2lzX3N5bmMoY3JxKSkKKwkJY3JxLT5pb19jb250ZXh0LT5sYXN0X2VuZF9yZXF1ZXN0ID0gbm93OwogfQogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmNmcV9uZXh0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQpAQCAtOTUwLDcgKzEyNzIsMTggQEAKIGRpc3BhdGNoOgogCQlycSA9IGxpc3RfZW50cnlfcnEocS0+cXVldWVfaGVhZC5uZXh0KTsKIAotCQlpZiAoKGNycSA9IFJRX0RBVEEocnEpKSAhPSBOVUxMKSB7CisJCWNycSA9IFJRX0RBVEEocnEpOworCQlpZiAoY3JxKSB7CisJCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY3JxLT5jZnFfcXVldWU7CisKKwkJCS8qCisJCQkgKiBpZiBpZGxlIHdpbmRvdyBpcyBkaXNhYmxlZCwgYWxsb3cgcXVldWUgYnVpbGR1cAorCQkJICovCisJCQlpZiAoIWNmcV9jcnFfaW5fZHJpdmVyKGNycSkgJiYKKwkJCSAgICAhY2ZxX2NmcXFfaWRsZV93aW5kb3coY2ZxcSkgJiYKKwkJCSAgICBjZnFkLT5ycV9pbl9kcml2ZXIgPj0gY2ZxZC0+Y2ZxX21heF9kZXB0aCkKKwkJCQlyZXR1cm4gTlVMTDsKKwogCQkJY2ZxX3JlbW92ZV9tZXJnZV9oaW50cyhxLCBjcnEpOwogCQkJY2ZxX2FjY291bnRfZGlzcGF0Y2goY3JxKTsKIAkJfQpAQCAtOTU4LDcgKzEyOTEsNyBAQAogCQlyZXR1cm4gcnE7CiAJfQogCi0JaWYgKGNmcV9kaXNwYXRjaF9yZXF1ZXN0cyhxLCBjZnFkLT5jZnFfcXVhbnR1bSkpCisJaWYgKGNmcV9kaXNwYXRjaF9yZXF1ZXN0cyhxLCBjZnFkLT5jZnFfcXVhbnR1bSwgMCkpCiAJCWdvdG8gZGlzcGF0Y2g7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTk3MiwxMyArMTMwNSwyMSBAQAogICovCiBzdGF0aWMgdm9pZCBjZnFfcHV0X3F1ZXVlKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7Ci0JQlVHX09OKCFhdG9taWNfcmVhZCgmY2ZxcS0+cmVmKSk7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ZxcS0+Y2ZxZDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmY2ZxcS0+cmVmKSA8PSAwKTsKIAogCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmY2ZxcS0+cmVmKSkKIAkJcmV0dXJuOwogCiAJQlVHX09OKHJiX2ZpcnN0KCZjZnFxLT5zb3J0X2xpc3QpKTsKLQlCVUdfT04oY2ZxcS0+b25fcnIpOworCUJVR19PTihjZnFxLT5hbGxvY2F0ZWRbUkVBRF0gKyBjZnFxLT5hbGxvY2F0ZWRbV1JJVEVdKTsKKwlCVUdfT04oY2ZxX2NmcXFfb25fcnIoY2ZxcSkpOworCisJaWYgKHVubGlrZWx5KGNmcWQtPmFjdGl2ZV9xdWV1ZSA9PSBjZnFxKSkgeworCQlfX2NmcV9zbGljZV9leHBpcmVkKGNmcWQsIGNmcXEsIDApOworCQljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CisJfQogCiAJY2ZxX3B1dF9jZnFkKGNmcXEtPmNmcWQpOwogCkBAIC05OTEsMTUgKzEzMzIsMTcgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZxX3F1ZXVlICoKLV9fY2ZxX2ZpbmRfY2ZxX2hhc2goc3RydWN0IGNmcV9kYXRhICpjZnFkLCB1bnNpZ25lZCBsb25nIGtleSwgY29uc3QgaW50IGhhc2h2YWwpCitfX2NmcV9maW5kX2NmcV9oYXNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgdW5zaWduZWQgaW50IGtleSwgdW5zaWduZWQgaW50IHByaW8sCisJCSAgICBjb25zdCBpbnQgaGFzaHZhbCkKIHsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaF9saXN0ID0gJmNmcWQtPmNmcV9oYXNoW2hhc2h2YWxdOwogCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeSwgKm5leHQ7CiAKIAlobGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCBuZXh0LCBoYXNoX2xpc3QpIHsKIAkJc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxID0gbGlzdF9lbnRyeV9xaGFzaChlbnRyeSk7CisJCWNvbnN0IHVuc2lnbmVkIHNob3J0IF9fcCA9IElPUFJJT19QUklPX1ZBTFVFKF9fY2ZxcS0+aW9wcmlvX2NsYXNzLCBfX2NmcXEtPmlvcHJpbyk7CiAKLQkJaWYgKF9fY2ZxcS0+a2V5ID09IGtleSkKKwkJaWYgKF9fY2ZxcS0+a2V5ID09IGtleSAmJiAoX19wID09IHByaW8gfHwgcHJpbyA9PSBDRlFfS0VZX0FOWSkpCiAJCQlyZXR1cm4gX19jZnFxOwogCX0KIApAQCAtMTAwNywyMTAgKzEzNTAsMTg3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICoKLWNmcV9maW5kX2NmcV9oYXNoKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgdW5zaWduZWQgbG9uZyBrZXkpCitjZnFfZmluZF9jZnFfaGFzaChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHVuc2lnbmVkIGludCBrZXksIHVuc2lnbmVkIHNob3J0IHByaW8pCiB7Ci0JcmV0dXJuIF9fY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCBoYXNoX2xvbmcoa2V5LCBDRlFfUUhBU0hfU0hJRlQpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1jZnFfcmVoYXNoX2NmcXEoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICoqY2ZxcSwKLQkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCi17Ci0JdW5zaWduZWQgbG9uZyBoYXNoa2V5ID0gY2ZxX2hhc2hfa2V5KGNmcWQsIGN1cnJlbnQpOwotCXVuc2lnbmVkIGxvbmcgaGFzaHZhbCA9IGhhc2hfbG9uZyhoYXNoa2V5LCBDRlFfUUhBU0hfU0hJRlQpOwotCXN0cnVjdCBjZnFfcXVldWUgKl9fY2ZxcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCWhsaXN0X2RlbCgmKCpjZnFxKS0+Y2ZxX2hhc2gpOwotCi0JX19jZnFxID0gX19jZnFfZmluZF9jZnFfaGFzaChjZnFkLCBoYXNoa2V5LCBoYXNodmFsKTsKLQlpZiAoIV9fY2ZxcSB8fCBfX2NmcXEgPT0gKmNmcXEpIHsKLQkJX19jZnFxID0gKmNmcXE7Ci0JCWhsaXN0X2FkZF9oZWFkKCZfX2NmcXEtPmNmcV9oYXNoLCAmY2ZxZC0+Y2ZxX2hhc2hbaGFzaHZhbF0pOwotCQlfX2NmcXEtPmtleV90eXBlID0gY2ZxZC0+a2V5X3R5cGU7Ci0JfSBlbHNlIHsKLQkJYXRvbWljX2luYygmX19jZnFxLT5yZWYpOwotCQljaWMtPmNmcXEgPSBfX2NmcXE7Ci0JCWNmcV9wdXRfcXVldWUoKmNmcXEpOwotCQkqY2ZxcSA9IF9fY2ZxcTsKLQl9Ci0KLQljaWMtPmNmcXEgPSBfX2NmcXE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCXJldHVybiBfX2NmcV9maW5kX2NmcV9oYXNoKGNmcWQsIGtleSwgcHJpbywgaGFzaF9sb25nKGtleSwgQ0ZRX1FIQVNIX1NISUZUKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9mcmVlX2lvX2NvbnRleHQoc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCiB7CisJc3RydWN0IGNmcV9pb19jb250ZXh0ICpfX2NpYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIG5leHQsICZjaWMtPmxpc3QpIHsKKwkJX19jaWMgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQsIGxpc3QpOworCQlrbWVtX2NhY2hlX2ZyZWUoY2ZxX2lvY19wb29sLCBfX2NpYyk7CisJfQorCiAJa21lbV9jYWNoZV9mcmVlKGNmcV9pb2NfcG9vbCwgY2ljKTsKIH0KIAogLyoKLSAqIGxvY2tpbmcgaGllcmFyY2h5IGlzOiBpb19jb250ZXh0IGxvY2sgLT4gcXVldWUgbG9ja3MKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgY2ZxX2V4aXRfc2luZ2xlX2lvX2NvbnRleHQoc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCit7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gY2ljLT5jZnFxLT5jZnFkOworCXJlcXVlc3RfcXVldWVfdCAqcSA9IGNmcWQtPnF1ZXVlOworCisJV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKTsKKworCXNwaW5fbG9jayhxLT5xdWV1ZV9sb2NrKTsKKworCWlmICh1bmxpa2VseShjaWMtPmNmcXEgPT0gY2ZxZC0+YWN0aXZlX3F1ZXVlKSkgeworCQlfX2NmcV9zbGljZV9leHBpcmVkKGNmcWQsIGNpYy0+Y2ZxcSwgMCk7CisJCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKKwl9CisKKwljZnFfcHV0X3F1ZXVlKGNpYy0+Y2ZxcSk7CisJY2ljLT5jZnFxID0gTlVMTDsKKwlzcGluX3VubG9jayhxLT5xdWV1ZV9sb2NrKTsKK30KKworLyoKKyAqIEFub3RoZXIgdGFzayBtYXkgdXBkYXRlIHRoZSB0YXNrIGNpYyBsaXN0LCBpZiBpdCBpcyBkb2luZyBhIHF1ZXVlIGxvb2t1cAorICogb24gaXRzIGJlaGFsZi4gY2ZxX2NpY19sb2NrIGV4Y2x1ZGVzIHN1Y2ggY29uY3VycmVudCB1cGRhdGVzCiAgKi8KIHN0YXRpYyB2b2lkIGNmcV9leGl0X2lvX2NvbnRleHQoc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMpCiB7Ci0Jc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IGNpYy0+Y2ZxcTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZjaWMtPmxpc3Q7Ci0JcmVxdWVzdF9xdWV1ZV90ICpxOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqX19jaWM7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwogCS8qCiAJICogcHV0IHRoZSByZWZlcmVuY2UgdGhpcyB0YXNrIGlzIGhvbGRpbmcgdG8gdGhlIHZhcmlvdXMgcXVldWVzCiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNpYy0+aW9jLT5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKChlbnRyeSA9IGNpYy0+bGlzdC5uZXh0KSAhPSAmY2ljLT5saXN0KSB7Ci0JCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqX19jaWM7Ci0KKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2ljLT5saXN0KSB7CiAJCV9fY2ljID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNmcV9pb19jb250ZXh0LCBsaXN0KTsKLQkJbGlzdF9kZWwoZW50cnkpOwotCi0JCXEgPSBfX2NpYy0+Y2ZxcS0+Y2ZxZC0+cXVldWU7Ci0JCXNwaW5fbG9jayhxLT5xdWV1ZV9sb2NrKTsKLQkJY2ZxX3B1dF9xdWV1ZShfX2NpYy0+Y2ZxcSk7Ci0JCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOworCQljZnFfZXhpdF9zaW5nbGVfaW9fY29udGV4dChfX2NpYyk7CiAJfQogCi0JcSA9IGNmcXEtPmNmcWQtPnF1ZXVlOwotCXNwaW5fbG9jayhxLT5xdWV1ZV9sb2NrKTsKLQljZnFfcHV0X3F1ZXVlKGNmcXEpOwotCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOwotCi0JY2ljLT5jZnFxID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaWMtPmlvYy0+bG9jaywgZmxhZ3MpOworCWNmcV9leGl0X3NpbmdsZV9pb19jb250ZXh0KGNpYyk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IGNmcV9pb19jb250ZXh0ICpjZnFfYWxsb2NfaW9fY29udGV4dChpbnQgZ2ZwX2ZsYWdzKQorc3RhdGljIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqCitjZnFfYWxsb2NfaW9fY29udGV4dChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGludCBnZnBfbWFzaykKIHsKLQlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYyA9IGttZW1fY2FjaGVfYWxsb2MoY2ZxX2lvY19wb29sLCBnZnBfZmxhZ3MpOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljID0ga21lbV9jYWNoZV9hbGxvYyhjZnFfaW9jX3Bvb2wsIGdmcF9tYXNrKTsKIAogCWlmIChjaWMpIHsKLQkJY2ljLT5kdG9yID0gY2ZxX2ZyZWVfaW9fY29udGV4dDsKLQkJY2ljLT5leGl0ID0gY2ZxX2V4aXRfaW9fY29udGV4dDsKIAkJSU5JVF9MSVNUX0hFQUQoJmNpYy0+bGlzdCk7CiAJCWNpYy0+Y2ZxcSA9IE5VTEw7CisJCWNpYy0+a2V5ID0gTlVMTDsKKwkJY2ljLT5sYXN0X2VuZF9yZXF1ZXN0ID0gamlmZmllczsKKwkJY2ljLT50dGltZV90b3RhbCA9IDA7CisJCWNpYy0+dHRpbWVfc2FtcGxlcyA9IDA7CisJCWNpYy0+dHRpbWVfbWVhbiA9IDA7CisJCWNpYy0+ZHRvciA9IGNmcV9mcmVlX2lvX2NvbnRleHQ7CisJCWNpYy0+ZXhpdCA9IGNmcV9leGl0X2lvX2NvbnRleHQ7CiAJfQogCiAJcmV0dXJuIGNpYzsKIH0KIAorc3RhdGljIHZvaWQgY2ZxX2luaXRfcHJpb19kYXRhKHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCWludCBpb3ByaW9fY2xhc3M7CisKKwlpZiAoIWNmcV9jZnFxX3ByaW9fY2hhbmdlZChjZnFxKSkKKwkJcmV0dXJuOworCisJaW9wcmlvX2NsYXNzID0gSU9QUklPX1BSSU9fQ0xBU1ModHNrLT5pb3ByaW8pOworCXN3aXRjaCAoaW9wcmlvX2NsYXNzKSB7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgImNmcTogYmFkIHByaW8gJXhcbiIsIGlvcHJpb19jbGFzcyk7CisJCWNhc2UgSU9QUklPX0NMQVNTX05PTkU6CisJCQkvKgorCQkJICogbm8gcHJpbyBzZXQsIHBsYWNlIHVzIGluIHRoZSBtaWRkbGUgb2YgdGhlIEJFIGNsYXNzZXMKKwkJCSAqLworCQkJY2ZxcS0+aW9wcmlvID0gdGFza19uaWNlX2lvcHJpbyh0c2spOworCQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gSU9QUklPX0NMQVNTX0JFOworCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX0NMQVNTX1JUOgorCQkJY2ZxcS0+aW9wcmlvID0gdGFza19pb3ByaW8odHNrKTsKKwkJCWNmcXEtPmlvcHJpb19jbGFzcyA9IElPUFJJT19DTEFTU19SVDsKKwkJCWJyZWFrOworCQljYXNlIElPUFJJT19DTEFTU19CRToKKwkJCWNmcXEtPmlvcHJpbyA9IHRhc2tfaW9wcmlvKHRzayk7CisJCQljZnFxLT5pb3ByaW9fY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fQ0xBU1NfSURMRToKKwkJCWNmcXEtPmlvcHJpb19jbGFzcyA9IElPUFJJT19DTEFTU19JRExFOworCQkJY2ZxcS0+aW9wcmlvID0gNzsKKwkJCWNmcV9jbGVhcl9jZnFxX2lkbGVfd2luZG93KGNmcXEpOworCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBrZWVwIHRyYWNrIG9mIG9yaWdpbmFsIHByaW8gc2V0dGluZ3MgaW4gY2FzZSB3ZSBoYXZlIHRvIHRlbXBvcmFyaWx5CisJICogZWxldmF0ZSB0aGUgcHJpb3JpdHkgb2YgdGhpcyBxdWV1ZQorCSAqLworCWNmcXEtPm9yZ19pb3ByaW8gPSBjZnFxLT5pb3ByaW87CisJY2ZxcS0+b3JnX2lvcHJpb19jbGFzcyA9IGNmcXEtPmlvcHJpb19jbGFzczsKKworCWlmIChjZnFfY2ZxcV9vbl9ycihjZnFxKSkKKwkJY2ZxX3Jlc29ydF9ycl9saXN0KGNmcXEsIDApOworCisJY2ZxX2NsZWFyX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlZF9pb3ByaW8oc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwlpZiAoY2ZxcSkgeworCQlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBjZnFxLT5jZnFkOworCisJCXNwaW5fbG9jayhjZnFkLT5xdWV1ZS0+cXVldWVfbG9jayk7CisJCWNmcV9tYXJrX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOworCQljZnFfaW5pdF9wcmlvX2RhdGEoY2ZxcSk7CisJCXNwaW5fdW5sb2NrKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKKwl9Cit9CisKIC8qCi0gKiBTZXR1cCBnZW5lcmFsIGlvIGNvbnRleHQgYW5kIGNmcSBpbyBjb250ZXh0LiBUaGVyZSBjYW4gYmUgc2V2ZXJhbCBjZnEKLSAqIGlvIGNvbnRleHRzIHBlciBnZW5lcmFsIGlvIGNvbnRleHQsIGlmIHRoaXMgcHJvY2VzcyBpcyBkb2luZyBpbyB0byBtb3JlCi0gKiB0aGFuIG9uZSBkZXZpY2UgbWFuYWdlZCBieSBjZnEuIE5vdGUgdGhhdCBjYWxsZXIgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0bwotICogY2ZxcSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpdCBkaXNhcHBlYXJpbmcKKyAqIGNhbGxiYWNrIGZyb20gc3lzX2lvcHJpb19zZXQsIGlycXMgYXJlIGRpc2FibGVkCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKgotY2ZxX2dldF9pb19jb250ZXh0KHN0cnVjdCBjZnFfcXVldWUgKipjZnFxLCBpbnQgZ2ZwX2ZsYWdzKQorc3RhdGljIGludCBjZnFfaW9jX3NldF9pb3ByaW8oc3RydWN0IGlvX2NvbnRleHQgKmlvYywgdW5zaWduZWQgaW50IGlvcHJpbykKIHsKLQlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSAoKmNmcXEpLT5jZnFkOwotCXN0cnVjdCBjZnFfcXVldWUgKl9fY2ZxcSA9ICpjZnFxOwotCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwotCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CisJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMgPSBpb2MtPmNpYzsKIAotCW1pZ2h0X3NsZWVwX2lmKGdmcF9mbGFncyAmIF9fR0ZQX1dBSVQpOworCWNoYW5nZWRfaW9wcmlvKGNpYy0+Y2ZxcSk7CiAKLQlpb2MgPSBnZXRfaW9fY29udGV4dChnZnBfZmxhZ3MpOwotCWlmICghaW9jKQotCQlyZXR1cm4gTlVMTDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpYywgJmNpYy0+bGlzdCwgbGlzdCkKKwkJY2hhbmdlZF9pb3ByaW8oY2ljLT5jZnFxKTsKIAotCWlmICgoY2ljID0gaW9jLT5jaWMpID09IE5VTEwpIHsKLQkJY2ljID0gY2ZxX2FsbG9jX2lvX2NvbnRleHQoZ2ZwX2ZsYWdzKTsKLQotCQlpZiAoY2ljID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQotCQlpb2MtPmNpYyA9IGNpYzsKLQkJY2ljLT5pb2MgPSBpb2M7Ci0JCWNpYy0+Y2ZxcSA9IF9fY2ZxcTsKLQkJYXRvbWljX2luYygmX19jZnFxLT5yZWYpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqX19jaWM7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyoKLQkJICogc2luY2UgdGhlIGZpcnN0IGNpYyBvbiB0aGUgbGlzdCBpcyBhY3R1YWxseSB0aGUgaGVhZAotCQkgKiBpdHNlbGYsIG5lZWQgdG8gY2hlY2sgdGhpcyBoZXJlIG9yIHdlJ2xsIGR1cGxpY2F0ZSBhbgotCQkgKiBjaWMgcGVyIGlvYyBmb3Igbm8gcmVhc29uCi0JCSAqLwotCQlpZiAoY2ljLT5jZnFxID09IF9fY2ZxcSkKLQkJCWdvdG8gb3V0OwotCi0JCS8qCi0JCSAqIGNpYyBleGlzdHMsIGNoZWNrIGlmIHdlIGFscmVhZHkgYXJlIHRoZXJlLiBsaW5lYXIgc2VhcmNoCi0JCSAqIHNob3VsZCBiZSBvayBoZXJlLCB0aGUgbGlzdCB3aWxsIHVzdWFsbHkgbm90IGJlIG1vcmUgdGhhbgotCQkgKiAxIG9yIGEgZmV3IGVudHJpZXMgbG9uZwotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYy0+bG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9fY2ljLCAmY2ljLT5saXN0LCBsaXN0KSB7Ci0JCQkvKgotCQkJICogdGhpcyBwcm9jZXNzIGlzIGFscmVhZHkgaG9sZGluZyBhIHJlZmVyZW5jZSB0bwotCQkJICogdGhpcyBxdWV1ZSwgc28gbm8gbmVlZCB0byBnZXQgb25lIG1vcmUKLQkJCSAqLwotCQkJaWYgKF9fY2ljLT5jZnFxID09IF9fY2ZxcSkgewotCQkJCWNpYyA9IF9fY2ljOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+bG9jaywgZmxhZ3MpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+bG9jaywgZmxhZ3MpOwotCi0JCS8qCi0JCSAqIG5vcGUsIHByb2Nlc3MgZG9lc24ndCBoYXZlIGEgY2ljIGFzc29pY2F0ZWQgd2l0aCB0aGlzCi0JCSAqIGNmcXEgeWV0LiBnZXQgYSBuZXcgb25lIGFuZCBhZGQgdG8gbGlzdAotCQkgKi8KLQkJX19jaWMgPSBjZnFfYWxsb2NfaW9fY29udGV4dChnZnBfZmxhZ3MpOwotCQlpZiAoX19jaWMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCi0JCV9fY2ljLT5pb2MgPSBpb2M7Ci0JCV9fY2ljLT5jZnFxID0gX19jZnFxOwotCQlhdG9taWNfaW5jKCZfX2NmcXEtPnJlZik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPmxvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGQoJl9fY2ljLT5saXN0LCAmY2ljLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9jLT5sb2NrLCBmbGFncyk7Ci0KLQkJY2ljID0gX19jaWM7Ci0JCSpjZnFxID0gX19jZnFxOwotCX0KLQotb3V0OgotCS8qCi0JICogaWYga2V5X3R5cGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmx5LCB3ZSBsYXppbHkgcmVoYXNoCi0JICogZWFjaCBxdWV1ZSBhdCBsb29rdXAgdGltZQotCSAqLwotCWlmICgoKmNmcXEpLT5rZXlfdHlwZSAhPSBjZnFkLT5rZXlfdHlwZSkKLQkJY2ZxX3JlaGFzaF9jZnFxKGNmcWQsIGNmcXEsIGNpYyk7Ci0KLQlyZXR1cm4gY2ljOwotZXJyOgotCXB1dF9pb19jb250ZXh0KGlvYyk7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZxX3F1ZXVlICoKLV9fY2ZxX2dldF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHVuc2lnbmVkIGxvbmcga2V5LCBpbnQgZ2ZwX21hc2spCitjZnFfZ2V0X3F1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgdW5zaWduZWQgaW50IGtleSwgdW5zaWduZWQgc2hvcnQgaW9wcmlvLAorCSAgICAgIGludCBnZnBfbWFzaykKIHsKIAljb25zdCBpbnQgaGFzaHZhbCA9IGhhc2hfbG9uZyhrZXksIENGUV9RSEFTSF9TSElGVCk7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgKm5ld19jZnFxID0gTlVMTDsKIAogcmV0cnk6Ci0JY2ZxcSA9IF9fY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwga2V5LCBoYXNodmFsKTsKKwljZnFxID0gX19jZnFfZmluZF9jZnFfaGFzaChjZnFkLCBrZXksIGlvcHJpbywgaGFzaHZhbCk7CiAKIAlpZiAoIWNmcXEpIHsKIAkJaWYgKG5ld19jZnFxKSB7CiAJCQljZnFxID0gbmV3X2NmcXE7CiAJCQluZXdfY2ZxcSA9IE5VTEw7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZSBpZiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSB7CiAJCQlzcGluX3VubG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOwogCQkJbmV3X2NmcXEgPSBrbWVtX2NhY2hlX2FsbG9jKGNmcV9wb29sLCBnZnBfbWFzayk7CiAJCQlzcGluX2xvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKLQotCQkJaWYgKCFuZXdfY2ZxcSAmJiAhKGdmcF9tYXNrICYgX19HRlBfV0FJVCkpCi0JCQkJZ290byBvdXQ7Ci0KIAkJCWdvdG8gcmV0cnk7CisJCX0gZWxzZSB7CisJCQljZnFxID0ga21lbV9jYWNoZV9hbGxvYyhjZnFfcG9vbCwgZ2ZwX21hc2spOworCQkJaWYgKCFjZnFxKQorCQkJCWdvdG8gb3V0OwogCQl9CiAKIAkJbWVtc2V0KGNmcXEsIDAsIHNpemVvZigqY2ZxcSkpOwpAQCAtMTIxOCwxNiArMTUzOCwyMSBAQAogCQlJTklUX0hMSVNUX05PREUoJmNmcXEtPmNmcV9oYXNoKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmNmcXEtPmNmcV9saXN0KTsKIAkJUkJfQ0xFQVJfUk9PVCgmY2ZxcS0+c29ydF9saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJmNmcXEtPmZpZm9bMF0pOwotCQlJTklUX0xJU1RfSEVBRCgmY2ZxcS0+Zmlmb1sxXSk7CisJCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvKTsKIAogCQljZnFxLT5rZXkgPSBrZXk7CiAJCWhsaXN0X2FkZF9oZWFkKCZjZnFxLT5jZnFfaGFzaCwgJmNmcWQtPmNmcV9oYXNoW2hhc2h2YWxdKTsKIAkJYXRvbWljX3NldCgmY2ZxcS0+cmVmLCAwKTsKIAkJY2ZxcS0+Y2ZxZCA9IGNmcWQ7CiAJCWF0b21pY19pbmMoJmNmcWQtPnJlZik7Ci0JCWNmcXEtPmtleV90eXBlID0gY2ZxZC0+a2V5X3R5cGU7Ci0JCWNmcXEtPnNlcnZpY2Vfc3RhcnQgPSB+MFVMOworCQljZnFxLT5zZXJ2aWNlX2xhc3QgPSAwOworCQkvKgorCQkgKiBzZXQgLT5zbGljZV9sZWZ0IHRvIGFsbG93IHByZWVtcHRpb24gZm9yIGEgbmV3IHByb2Nlc3MKKwkJICovCisJCWNmcXEtPnNsaWNlX2xlZnQgPSAyICogY2ZxZC0+Y2ZxX3NsaWNlX2lkbGU7CisJCWNmcV9tYXJrX2NmcXFfaWRsZV93aW5kb3coY2ZxcSk7CisJCWNmcV9tYXJrX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOworCQljZnFfaW5pdF9wcmlvX2RhdGEoY2ZxcSk7CiAJfQogCiAJaWYgKG5ld19jZnFxKQpAQCAtMTIzOSw1NSArMTU2NCwyOTcgQEAKIAlyZXR1cm4gY2ZxcTsKIH0KIAotc3RhdGljIHZvaWQgY2ZxX2VucXVldWUoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3JxICpjcnEpCisvKgorICogU2V0dXAgZ2VuZXJhbCBpbyBjb250ZXh0IGFuZCBjZnEgaW8gY29udGV4dC4gVGhlcmUgY2FuIGJlIHNldmVyYWwgY2ZxCisgKiBpbyBjb250ZXh0cyBwZXIgZ2VuZXJhbCBpbyBjb250ZXh0LCBpZiB0aGlzIHByb2Nlc3MgaXMgZG9pbmcgaW8gdG8gbW9yZQorICogdGhhbiBvbmUgZGV2aWNlIG1hbmFnZWQgYnkgY2ZxLiBOb3RlIHRoYXQgY2FsbGVyIGlzIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8KKyAqIGNmcXEsIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgZGlzYXBwZWFyaW5nCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKgorY2ZxX2dldF9pb19jb250ZXh0KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgcGlkX3QgcGlkLCBpbnQgZ2ZwX21hc2spCiB7Ci0JY3JxLT5pc19zeW5jID0gMDsKLQlpZiAocnFfZGF0YV9kaXIoY3JxLT5yZXF1ZXN0KSA9PSBSRUFEIHx8IGN1cnJlbnQtPmZsYWdzICYgUEZfU1lOQ1dSSVRFKQotCQljcnEtPmlzX3N5bmMgPSAxOworCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBOVUxMOworCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOworCisJbWlnaHRfc2xlZXBfaWYoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKTsKKworCWlvYyA9IGdldF9pb19jb250ZXh0KGdmcF9tYXNrKTsKKwlpZiAoIWlvYykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoKGNpYyA9IGlvYy0+Y2ljKSA9PSBOVUxMKSB7CisJCWNpYyA9IGNmcV9hbGxvY19pb19jb250ZXh0KGNmcWQsIGdmcF9tYXNrKTsKKworCQlpZiAoY2ljID09IE5VTEwpCisJCQlnb3RvIGVycjsKKworCQkvKgorCQkgKiBtYW51YWxseSBpbmNyZW1lbnQgZ2VuZXJpYyBpb19jb250ZXh0IHVzYWdlIGNvdW50LCBpdAorCQkgKiBjYW5ub3QgZ28gYXdheSBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBob2xkaW5nIG9uZSByZWYgdG8gaXQKKwkJICovCisJCWlvYy0+Y2ljID0gY2ljOworCQlpb2MtPnNldF9pb3ByaW8gPSBjZnFfaW9jX3NldF9pb3ByaW87CisJCWNpYy0+aW9jID0gaW9jOworCQljaWMtPmtleSA9IGNmcWQ7CisJCWF0b21pY19pbmMoJmNmcWQtPnJlZik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpfX2NpYzsKKworCQkvKgorCQkgKiB0aGUgZmlyc3QgY2ljIG9uIHRoZSBsaXN0IGlzIGFjdHVhbGx5IHRoZSBoZWFkIGl0c2VsZgorCQkgKi8KKwkJaWYgKGNpYy0+a2V5ID09IGNmcWQpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBjaWMgZXhpc3RzLCBjaGVjayBpZiB3ZSBhbHJlYWR5IGFyZSB0aGVyZS4gbGluZWFyIHNlYXJjaAorCQkgKiBzaG91bGQgYmUgb2sgaGVyZSwgdGhlIGxpc3Qgd2lsbCB1c3VhbGx5IG5vdCBiZSBtb3JlIHRoYW4KKwkJICogMSBvciBhIGZldyBlbnRyaWVzIGxvbmcKKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoX19jaWMsICZjaWMtPmxpc3QsIGxpc3QpIHsKKwkJCS8qCisJCQkgKiB0aGlzIHByb2Nlc3MgaXMgYWxyZWFkeSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvCisJCQkgKiB0aGlzIHF1ZXVlLCBzbyBubyBuZWVkIHRvIGdldCBvbmUgbW9yZQorCQkJICovCisJCQlpZiAoX19jaWMtPmtleSA9PSBjZnFkKSB7CisJCQkJY2ljID0gX19jaWM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBub3BlLCBwcm9jZXNzIGRvZXNuJ3QgaGF2ZSBhIGNpYyBhc3NvaWNhdGVkIHdpdGggdGhpcworCQkgKiBjZnFxIHlldC4gZ2V0IGEgbmV3IG9uZSBhbmQgYWRkIHRvIGxpc3QKKwkJICovCisJCV9fY2ljID0gY2ZxX2FsbG9jX2lvX2NvbnRleHQoY2ZxZCwgZ2ZwX21hc2spOworCQlpZiAoX19jaWMgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCisJCV9fY2ljLT5pb2MgPSBpb2M7CisJCV9fY2ljLT5rZXkgPSBjZnFkOworCQlhdG9taWNfaW5jKCZjZnFkLT5yZWYpOworCQlsaXN0X2FkZCgmX19jaWMtPmxpc3QsICZjaWMtPmxpc3QpOworCQljaWMgPSBfX2NpYzsKKwl9CisKK291dDoKKwlyZXR1cm4gY2ljOworZXJyOgorCXB1dF9pb19jb250ZXh0KGlvYyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitjZnFfdXBkYXRlX2lvX3RoaW5rdGltZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljKQoreworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZCwgdHRpbWU7CisKKwkvKgorCSAqIGlmIHRoaXMgY29udGV4dCBhbHJlYWR5IGhhcyBzdHVmZiBxdWV1ZWQsIHRoaW5rdGltZSBpcyBmcm9tCisJICogbGFzdCBxdWV1ZSBub3QgbGFzdCBlbmQKKwkgKi8KKyNpZiAwCisJaWYgKHRpbWVfYWZ0ZXIoY2ljLT5sYXN0X2VuZF9yZXF1ZXN0LCBjaWMtPmxhc3RfcXVldWUpKQorCQllbGFwc2VkID0gamlmZmllcyAtIGNpYy0+bGFzdF9lbmRfcmVxdWVzdDsKKwllbHNlCisJCWVsYXBzZWQgPSBqaWZmaWVzIC0gY2ljLT5sYXN0X3F1ZXVlOworI2Vsc2UKKwkJZWxhcHNlZCA9IGppZmZpZXMgLSBjaWMtPmxhc3RfZW5kX3JlcXVlc3Q7CisjZW5kaWYKKworCXR0aW1lID0gbWluKGVsYXBzZWQsIDJVTCAqIGNmcWQtPmNmcV9zbGljZV9pZGxlKTsKKworCWNpYy0+dHRpbWVfc2FtcGxlcyA9ICg3KmNpYy0+dHRpbWVfc2FtcGxlcyArIDI1NikgLyA4OworCWNpYy0+dHRpbWVfdG90YWwgPSAoNypjaWMtPnR0aW1lX3RvdGFsICsgMjU2KnR0aW1lKSAvIDg7CisJY2ljLT50dGltZV9tZWFuID0gKGNpYy0+dHRpbWVfdG90YWwgKyAxMjgpIC8gY2ljLT50dGltZV9zYW1wbGVzOworfQorCisjZGVmaW5lIHNhbXBsZV92YWxpZChzYW1wbGVzKQkoKHNhbXBsZXMpID4gODApCisKKy8qCisgKiBEaXNhYmxlIGlkbGUgd2luZG93IGlmIHRoZSBwcm9jZXNzIHRoaW5rcyB0b28gbG9uZyBvciBzZWVrcyBzbyBtdWNoIHRoYXQKKyAqIGl0IGRvZXNuJ3QgbWF0dGVyCisgKi8KK3N0YXRpYyB2b2lkCitjZnFfdXBkYXRlX2lkbGVfd2luZG93KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwKKwkJICAgICAgIHN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljKQoreworCWludCBlbmFibGVfaWRsZSA9IGNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpOworCisJaWYgKCFjaWMtPmlvYy0+dGFzayB8fCAhY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpCisJCWVuYWJsZV9pZGxlID0gMDsKKwllbHNlIGlmIChzYW1wbGVfdmFsaWQoY2ljLT50dGltZV9zYW1wbGVzKSkgeworCQlpZiAoY2ljLT50dGltZV9tZWFuID4gY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUpCisJCQllbmFibGVfaWRsZSA9IDA7CisJCWVsc2UKKwkJCWVuYWJsZV9pZGxlID0gMTsKKwl9CisKKwlpZiAoZW5hYmxlX2lkbGUpCisJCWNmcV9tYXJrX2NmcXFfaWRsZV93aW5kb3coY2ZxcSk7CisJZWxzZQorCQljZnFfY2xlYXJfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKTsKK30KKworCisvKgorICogQ2hlY2sgaWYgbmV3X2NmcXEgc2hvdWxkIHByZWVtcHQgdGhlIGN1cnJlbnRseSBhY3RpdmUgcXVldWUuIFJldHVybiAwIGZvcgorICogbm8gb3IgaWYgd2UgYXJlbid0IHN1cmUsIGEgMSB3aWxsIGNhdXNlIGEgcHJlZW1wdC4KKyAqLworc3RhdGljIGludAorY2ZxX3Nob3VsZF9wcmVlbXB0KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqbmV3X2NmcXEsCisJCSAgIHN0cnVjdCBjZnFfcnEgKmNycSkKK3sKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxID0gY2ZxZC0+YWN0aXZlX3F1ZXVlOworCisJaWYgKGNmcV9jbGFzc19pZGxlKG5ld19jZnFxKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWNmcXEpCisJCXJldHVybiAxOworCisJaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQorCQlyZXR1cm4gMTsKKwlpZiAoIWNmcV9jZnFxX3dhaXRfcmVxdWVzdChuZXdfY2ZxcSkpCisJCXJldHVybiAwOworCS8qCisJICogaWYgaXQgZG9lc24ndCBoYXZlIHNsaWNlIGxlZnQsIGZvcmdldCBpdAorCSAqLworCWlmIChuZXdfY2ZxcS0+c2xpY2VfbGVmdCA8IGNmcWQtPmNmcV9zbGljZV9pZGxlKQorCQlyZXR1cm4gMDsKKwlpZiAoY2ZxX2NycV9pc19zeW5jKGNycSkgJiYgIWNmcV9jZnFxX3N5bmMoY2ZxcSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjZnFxIHByZWVtcHRzIHRoZSBhY3RpdmUgcXVldWUuIGlmIHdlIGFsbG93ZWQgcHJlZW1wdCB3aXRoIG5vIHNsaWNlIGxlZnQsCisgKiBsZXQgaXQgaGF2ZSBoYWxmIG9mIGl0cyBub21pbmFsIHNsaWNlLgorICovCitzdGF0aWMgdm9pZCBjZnFfcHJlZW1wdF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCit7CisJc3RydWN0IGNmcV9xdWV1ZSAqX19jZnFxLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShfX2NmcXEsIG5leHQsICZjZnFkLT5jdXJfcnIsIGNmcV9saXN0KQorCQljZnFfcmVzb3J0X3JyX2xpc3QoX19jZnFxLCAxKTsKKworCWlmICghY2ZxcS0+c2xpY2VfbGVmdCkKKwkJY2ZxcS0+c2xpY2VfbGVmdCA9IGNmcV9wcmlvX3RvX3NsaWNlKGNmcWQsIGNmcXEpIC8gMjsKKworCWNmcXEtPnNsaWNlX2VuZCA9IGNmcXEtPnNsaWNlX2xlZnQgKyBqaWZmaWVzOworCV9fY2ZxX3NsaWNlX2V4cGlyZWQoY2ZxZCwgY2ZxcSwgMSk7CisJX19jZnFfc2V0X2FjdGl2ZV9xdWV1ZShjZnFkLCBjZnFxKTsKK30KKworLyoKKyAqIHNob3VsZCByZWFsbHkgYmUgYSBsbF9yd19ibGsuYyBoZWxwZXIKKyAqLworc3RhdGljIHZvaWQgY2ZxX3N0YXJ0X3F1ZXVlaW5nKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBjZnFkLT5xdWV1ZTsKKworCWlmICghYmxrX3F1ZXVlX3BsdWdnZWQocSkpCisJCXEtPnJlcXVlc3RfZm4ocSk7CisJZWxzZQorCQlfX2dlbmVyaWNfdW5wbHVnX2RldmljZShxKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgbmV3IGZzIHJlcXVlc3QgKGNycSkgaXMgYWRkZWQgKHRvIGNmcXEpLiBDaGVjayBpZiB0aGVyZSdzCisgKiBzb21ldGhpbmcgd2Ugc2hvdWxkIGRvIGFib3V0IGl0CisgKi8KK3N0YXRpYyB2b2lkCitjZnFfY3JxX2VucXVldWVkKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwKKwkJIHN0cnVjdCBjZnFfcnEgKmNycSkKK3sKKwljb25zdCBpbnQgc3luYyA9IGNmcV9jcnFfaXNfc3luYyhjcnEpOworCisJY2ZxcS0+bmV4dF9jcnEgPSBjZnFfY2hvb3NlX3JlcShjZnFkLCBjZnFxLT5uZXh0X2NycSwgY3JxKTsKKworCWlmIChzeW5jKSB7CisJCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljID0gY3JxLT5pb19jb250ZXh0OworCisJCWNmcV91cGRhdGVfaW9fdGhpbmt0aW1lKGNmcWQsIGNpYyk7CisJCWNmcV91cGRhdGVfaWRsZV93aW5kb3coY2ZxZCwgY2ZxcSwgY2ljKTsKKworCQljaWMtPmxhc3RfcXVldWUgPSBqaWZmaWVzOworCX0KKworCWlmIChjZnFxID09IGNmcWQtPmFjdGl2ZV9xdWV1ZSkgeworCQkvKgorCQkgKiBpZiB3ZSBhcmUgd2FpdGluZyBmb3IgYSByZXF1ZXN0IGZvciB0aGlzIHF1ZXVlLCBsZXQgaXQgcmlwCisJCSAqIGltbWVkaWF0ZWx5IGFuZCBmbGFnIHRoYXQgd2UgbXVzdCBub3QgZXhwaXJlIHRoaXMgcXVldWUKKwkJICoganVzdCBub3cKKwkJICovCisJCWlmIChjZnFfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSkpIHsKKwkJCWNmcV9tYXJrX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKKwkJCWRlbF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CisJCQljZnFfc3RhcnRfcXVldWVpbmcoY2ZxZCwgY2ZxcSk7CisJCX0KKwl9IGVsc2UgaWYgKGNmcV9zaG91bGRfcHJlZW1wdChjZnFkLCBjZnFxLCBjcnEpKSB7CisJCS8qCisJCSAqIG5vdCB0aGUgYWN0aXZlIHF1ZXVlIC0gZXhwaXJlIGN1cnJlbnQgc2xpY2UgaWYgaXQgaXMKKwkJICogaWRsZSBhbmQgaGFzIGV4cGlyZWQgaXQncyBtZWFuIHRoaW5rdGltZSBvciB0aGlzIG5ldyBxdWV1ZQorCQkgKiBoYXMgc29tZSBvbGQgc2xpY2UgdGltZSBsZWZ0IGFuZCBpcyBvZiBoaWdoZXIgcHJpb3JpdHkKKwkJICovCisJCWNmcV9wcmVlbXB0X3F1ZXVlKGNmcWQsIGNmcXEpOworCQljZnFfbWFya19jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSk7CisJCWNmcV9zdGFydF9xdWV1ZWluZyhjZnFkLCBjZnFxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNmcV9lbnF1ZXVlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCBjZnFfcnEgKmNycSA9IFJRX0RBVEEocnEpOworCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjcnEtPmNmcV9xdWV1ZTsKKworCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxKTsKIAogCWNmcV9hZGRfY3JxX3JiKGNycSk7Ci0JY3JxLT5xdWV1ZV9zdGFydCA9IGppZmZpZXM7CiAKLQlsaXN0X2FkZF90YWlsKCZjcnEtPnJlcXVlc3QtPnF1ZXVlbGlzdCwgJmNycS0+Y2ZxX3F1ZXVlLT5maWZvW2NycS0+aXNfc3luY10pOworCWxpc3RfYWRkX3RhaWwoJnJxLT5xdWV1ZWxpc3QsICZjZnFxLT5maWZvKTsKKworCWlmIChycV9tZXJnZWFibGUocnEpKSB7CisJCWNmcV9hZGRfY3JxX2hhc2goY2ZxZCwgY3JxKTsKKworCQlpZiAoIWNmcWQtPnF1ZXVlLT5sYXN0X21lcmdlKQorCQkJY2ZxZC0+cXVldWUtPmxhc3RfbWVyZ2UgPSBycTsKKwl9CisKKwljZnFfY3JxX2VucXVldWVkKGNmcWQsIGNmcXEsIGNycSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjZnFfaW5zZXJ0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB3aGVyZSkKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKLQlzdHJ1Y3QgY2ZxX3JxICpjcnEgPSBSUV9EQVRBKHJxKTsKIAogCXN3aXRjaCAod2hlcmUpIHsKIAkJY2FzZSBFTEVWQVRPUl9JTlNFUlRfQkFDSzoKLQkJCXdoaWxlIChjZnFfZGlzcGF0Y2hfcmVxdWVzdHMocSwgY2ZxZC0+Y2ZxX3F1YW50dW0pKQorCQkJd2hpbGUgKGNmcV9kaXNwYXRjaF9yZXF1ZXN0cyhxLCBJTlRfTUFYLCAxKSkKIAkJCQk7CiAJCQlsaXN0X2FkZF90YWlsKCZycS0+cXVldWVsaXN0LCAmcS0+cXVldWVfaGVhZCk7CisJCQkvKgorCQkJICogSWYgd2Ugd2VyZSBpZGxpbmcgd2l0aCBwZW5kaW5nIHJlcXVlc3RzIG9uCisJCQkgKiBpbmFjdGl2ZSBjZnFxcywgZm9yY2UgZGlzcGF0Y2hpbmcgd2lsbAorCQkJICogcmVtb3ZlIHRoZSBpZGxlIHRpbWVyIGFuZCB0aGUgcXVldWUgd29uJ3QKKwkJCSAqIGJlIGtpY2tlZCBieSBfX21ha2VfcmVxdWVzdCgpIGFmdGVyd2FyZC4KKwkJCSAqIEtpY2sgaXQgaGVyZS4KKwkJCSAqLworCQkJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgRUxFVkFUT1JfSU5TRVJUX0ZST05UOgogCQkJbGlzdF9hZGQoJnJxLT5xdWV1ZWxpc3QsICZxLT5xdWV1ZV9oZWFkKTsKIAkJCWJyZWFrOwogCQljYXNlIEVMRVZBVE9SX0lOU0VSVF9TT1JUOgogCQkJQlVHX09OKCFibGtfZnNfcmVxdWVzdChycSkpOwotCQkJY2ZxX2VucXVldWUoY2ZxZCwgY3JxKTsKKwkJCWNmcV9lbnF1ZXVlKGNmcWQsIHJxKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKCIlczogYmFkIGluc2VydCBwb2ludCAlZFxuIiwgX19GVU5DVElPTl9fLHdoZXJlKTsKIAkJCXJldHVybjsKIAl9Ci0KLQlpZiAocnFfbWVyZ2VhYmxlKHJxKSkgewotCQljZnFfYWRkX2NycV9oYXNoKGNmcWQsIGNycSk7Ci0KLQkJaWYgKCFxLT5sYXN0X21lcmdlKQotCQkJcS0+bGFzdF9tZXJnZSA9IHJxOwotCX0KLX0KLQotc3RhdGljIGludCBjZnFfcXVldWVfZW1wdHkocmVxdWVzdF9xdWV1ZV90ICpxKQotewotCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwotCi0JcmV0dXJuIGxpc3RfZW1wdHkoJnEtPnF1ZXVlX2hlYWQpICYmIGxpc3RfZW1wdHkoJmNmcWQtPnJyX2xpc3QpOwogfQogCiBzdGF0aWMgdm9pZCBjZnFfY29tcGxldGVkX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCkBAIC0xMzAwLDkgKzE4NjcsMTEgQEAKIAogCWNmcXEgPSBjcnEtPmNmcV9xdWV1ZTsKIAotCWlmIChjcnEtPmluX2ZsaWdodCkgewotCQlXQVJOX09OKCFjZnFxLT5pbl9mbGlnaHQpOwotCQljZnFxLT5pbl9mbGlnaHQtLTsKKwlpZiAoY2ZxX2NycV9pbl9mbGlnaHQoY3JxKSkgeworCQljb25zdCBpbnQgc3luYyA9IGNmcV9jcnFfaXNfc3luYyhjcnEpOworCisJCVdBUk5fT04oIWNmcXEtPm9uX2Rpc3BhdGNoW3N5bmNdKTsKKwkJY2ZxcS0+b25fZGlzcGF0Y2hbc3luY10tLTsKIAl9CiAKIAljZnFfYWNjb3VudF9jb21wbGV0aW9uKGNmcXEsIGNycSk7CkBAIC0xMzMyLDUxICsxOTAxLDEzNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGNmcV9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncpCisvKgorICogd2UgdGVtcG9yYXJpbHkgYm9vc3QgbG93ZXIgcHJpb3JpdHkgcXVldWVzIGlmIHRoZXkgYXJlIGhvbGRpbmcgZnMgZXhjbHVzaXZlCisgKiByZXNvdXJjZXMuIHRoZXkgYXJlIGJvb3N0ZWQgdG8gbm9ybWFsIHByaW8gKENMQVNTX0JFLzQpCisgKi8KK3N0YXRpYyB2b2lkIGNmcV9wcmlvX2Jvb3N0KHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7Ci0Jc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7Ci0Jc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKLQlpbnQgcmV0ID0gRUxWX01RVUVVRV9NQVk7CisJY29uc3QgaW50IGlvcHJpb19jbGFzcyA9IGNmcXEtPmlvcHJpb19jbGFzczsKKwljb25zdCBpbnQgaW9wcmlvID0gY2ZxcS0+aW9wcmlvOwogCi0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpCi0JCXJldHVybiBFTFZfTVFVRVVFX01BWTsKLQotCWNmcXEgPSBjZnFfZmluZF9jZnFfaGFzaChjZnFkLCBjZnFfaGFzaF9rZXkoY2ZxZCwgY3VycmVudCkpOwotCWlmIChjZnFxKSB7Ci0JCWludCBsaW1pdCA9IGNmcWQtPm1heF9xdWV1ZWQ7Ci0KLQkJaWYgKGNmcXEtPmFsbG9jYXRlZFtyd10gPCBjZnFkLT5jZnFfcXVldWVkKQotCQkJcmV0dXJuIEVMVl9NUVVFVUVfTVVTVDsKLQotCQlpZiAoY2ZxZC0+YnVzeV9xdWV1ZXMpCi0JCQlsaW1pdCA9IHEtPm5yX3JlcXVlc3RzIC8gY2ZxZC0+YnVzeV9xdWV1ZXM7Ci0KLQkJaWYgKGxpbWl0IDwgY2ZxZC0+Y2ZxX3F1ZXVlZCkKLQkJCWxpbWl0ID0gY2ZxZC0+Y2ZxX3F1ZXVlZDsKLQkJZWxzZSBpZiAobGltaXQgPiBjZnFkLT5tYXhfcXVldWVkKQotCQkJbGltaXQgPSBjZnFkLT5tYXhfcXVldWVkOwotCi0JCWlmIChjZnFxLT5hbGxvY2F0ZWRbcnddID49IGxpbWl0KSB7Ci0JCQlpZiAobGltaXQgPiBjZnFxLT5hbGxvY19saW1pdFtyd10pCi0JCQkJY2ZxcS0+YWxsb2NfbGltaXRbcnddID0gbGltaXQ7Ci0KLQkJCXJldCA9IEVMVl9NUVVFVUVfTk87Ci0JCX0KKwlpZiAoaGFzX2ZzX2V4Y2woKSkgeworCQkvKgorCQkgKiBib29zdCBpZGxlIHByaW8gb24gdHJhbnNhY3Rpb25zIHRoYXQgd291bGQgbG9jayBvdXQgb3RoZXIKKwkJICogdXNlcnMgb2YgdGhlIGZpbGVzeXN0ZW0KKwkJICovCisJCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKKwkJCWNmcXEtPmlvcHJpb19jbGFzcyA9IElPUFJJT19DTEFTU19CRTsKKwkJaWYgKGNmcXEtPmlvcHJpbyA+IElPUFJJT19OT1JNKQorCQkJY2ZxcS0+aW9wcmlvID0gSU9QUklPX05PUk07CisJfSBlbHNlIHsKKwkJLyoKKwkJICogY2hlY2sgaWYgd2UgbmVlZCB0byB1bmJvb3N0IHRoZSBxdWV1ZQorCQkgKi8KKwkJaWYgKGNmcXEtPmlvcHJpb19jbGFzcyAhPSBjZnFxLT5vcmdfaW9wcmlvX2NsYXNzKQorCQkJY2ZxcS0+aW9wcmlvX2NsYXNzID0gY2ZxcS0+b3JnX2lvcHJpb19jbGFzczsKKwkJaWYgKGNmcXEtPmlvcHJpbyAhPSBjZnFxLT5vcmdfaW9wcmlvKQorCQkJY2ZxcS0+aW9wcmlvID0gY2ZxcS0+b3JnX2lvcHJpbzsKIAl9CiAKLQlyZXR1cm4gcmV0OworCS8qCisJICogcmVmaWxlIGJldHdlZW4gcm91bmQtcm9iaW4gbGlzdHMgaWYgd2UgbW92ZWQgdGhlIHByaW9yaXR5IGNsYXNzCisJICovCisJaWYgKChpb3ByaW9fY2xhc3MgIT0gY2ZxcS0+aW9wcmlvX2NsYXNzIHx8IGlvcHJpbyAhPSBjZnFxLT5pb3ByaW8pICYmCisJICAgIGNmcV9jZnFxX29uX3JyKGNmcXEpKQorCQljZnFfcmVzb3J0X3JyX2xpc3QoY2ZxcSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGlkX3QgY2ZxX3F1ZXVlX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBydykKK3sKKwlpZiAocncgPT0gUkVBRCB8fCBwcm9jZXNzX3N5bmModGFzaykpCisJCXJldHVybiB0YXNrLT5waWQ7CisKKwlyZXR1cm4gQ0ZRX0tFWV9BU1lOQzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fY2ZxX21heV9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJ3KQoreworI2lmIDEKKwlpZiAoKGNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSB8fCBjZnFfY2ZxcV9tdXN0X2FsbG9jKGNmcXEpKSAmJgorCSAgICAhY2ZxX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKSkgeworCQljZnFfbWFya19jZnFxX211c3RfYWxsb2Nfc2xpY2UoY2ZxcSk7CisJCXJldHVybiBFTFZfTVFVRVVFX01VU1Q7CisJfQorCisJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOworI2Vsc2UKKwlpZiAoIWNmcXEgfHwgdGFzay0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKKwkJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOworCWlmICghY2ZxcS0+YWxsb2NhdGVkW3J3XSB8fCBjZnFfY2ZxcV9tdXN0X2FsbG9jKGNmcXEpKSB7CisJCWlmIChjZnFfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSkpCisJCQlyZXR1cm4gRUxWX01RVUVVRV9NVVNUOworCisJCS8qCisJCSAqIG9ubHkgYWxsb3cgMSBFTFZfTVFVRVVFX01VU1QgcGVyIHNsaWNlLCBvdGhlcndpc2Ugd2UKKwkJICogY2FuIHF1aWNrbHkgZmxvb2QgdGhlIHF1ZXVlIHdpdGggd3JpdGVzIGZyb20gYSBzaW5nbGUgdGFzaworCQkgKi8KKwkJaWYgKHJ3ID09IFJFQUQgfHwgIWNmcV9jZnFxX211c3RfYWxsb2Nfc2xpY2UoY2ZxcSkpIHsKKwkJCWNmcV9tYXJrX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKTsKKwkJCXJldHVybiBFTFZfTVFVRVVFX01VU1Q7CisJCX0KKworCQlyZXR1cm4gRUxWX01RVUVVRV9NQVk7CisJfQorCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKKwkJcmV0dXJuIEVMVl9NUVVFVUVfTk87CisJaWYgKGNmcXEtPmFsbG9jYXRlZFtyd10gPj0gY2ZxZC0+bWF4X3F1ZXVlZCkgeworCQlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jID0gZ2V0X2lvX2NvbnRleHQoR0ZQX0FUT01JQyk7CisJCWludCByZXQgPSBFTFZfTVFVRVVFX05POworCisJCWlmIChpb2MgJiYgaW9jLT5ucl9iYXRjaF9yZXF1ZXN0cykKKwkJCXJldCA9IEVMVl9NUVVFVUVfTUFZOworCisJCXB1dF9pb19jb250ZXh0KGlvYyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIEVMVl9NUVVFVUVfTUFZOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgY2ZxX21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxOworCisJLyoKKwkgKiBkb24ndCBmb3JjZSBzZXR1cCBvZiBhIHF1ZXVlIGZyb20gaGVyZSwgYXMgYSBjYWxsIHRvIG1heV9xdWV1ZQorCSAqIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGltcGx5IHRoYXQgYSByZXF1ZXN0IGFjdHVhbGx5IHdpbGwgYmUgcXVldWVkLgorCSAqIHNvIGp1c3QgbG9va3VwIGEgcG9zc2libHkgZXhpc3RpbmcgcXVldWUsIG9yIHJldHVybiAnbWF5IHF1ZXVlJworCSAqIGlmIHRoYXQgZmFpbHMKKwkgKi8KKwljZnFxID0gY2ZxX2ZpbmRfY2ZxX2hhc2goY2ZxZCwgY2ZxX3F1ZXVlX3BpZCh0c2ssIHJ3KSwgdHNrLT5pb3ByaW8pOworCWlmIChjZnFxKSB7CisJCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxKTsKKwkJY2ZxX3ByaW9fYm9vc3QoY2ZxcSk7CisKKwkJcmV0dXJuIF9fY2ZxX21heV9xdWV1ZShjZnFkLCBjZnFxLCB0c2ssIHJ3KTsKKwl9CisKKwlyZXR1cm4gRUxWX01RVUVVRV9NQVk7CiB9CiAKIHN0YXRpYyB2b2lkIGNmcV9jaGVja193YWl0ZXJzKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSkKIHsKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKLQljb25zdCBpbnQgd3JpdGUgPSB3YWl0cXVldWVfYWN0aXZlKCZybC0+d2FpdFtXUklURV0pOwotCWNvbnN0IGludCByZWFkID0gd2FpdHF1ZXVlX2FjdGl2ZSgmcmwtPndhaXRbUkVBRF0pOwogCi0JaWYgKHJlYWQgJiYgY2ZxcS0+YWxsb2NhdGVkW1JFQURdIDwgY2ZxcS0+YWxsb2NfbGltaXRbUkVBRF0pCi0JCXdha2VfdXAoJnJsLT53YWl0W1JFQURdKTsKLQlpZiAod3JpdGUgJiYgY2ZxcS0+YWxsb2NhdGVkW1dSSVRFXSA8IGNmcXEtPmFsbG9jX2xpbWl0W1dSSVRFXSkKLQkJd2FrZV91cCgmcmwtPndhaXRbV1JJVEVdKTsKKwlpZiAoY2ZxcS0+YWxsb2NhdGVkW1JFQURdIDw9IGNmcWQtPm1heF9xdWV1ZWQgfHwgY2ZxZC0+cnFfc3RhcnZlZCkgeworCQlzbXBfbWIoKTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJsLT53YWl0W1JFQURdKSkKKwkJCXdha2VfdXAoJnJsLT53YWl0W1JFQURdKTsKKwl9CisKKwlpZiAoY2ZxcS0+YWxsb2NhdGVkW1dSSVRFXSA8PSBjZnFkLT5tYXhfcXVldWVkIHx8IGNmcWQtPnJxX3N0YXJ2ZWQpIHsKKwkJc21wX21iKCk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZybC0+d2FpdFtXUklURV0pKQorCQkJd2FrZV91cCgmcmwtPndhaXRbV1JJVEVdKTsKKwl9CiB9CiAKIC8qCkBAIC0xMzg5LDY5ICsyMDQzLDYxIEBACiAKIAlpZiAoY3JxKSB7CiAJCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEgPSBjcnEtPmNmcV9xdWV1ZTsKKwkJY29uc3QgaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOwogCi0JCUJVR19PTihxLT5sYXN0X21lcmdlID09IHJxKTsKLQkJQlVHX09OKCFobGlzdF91bmhhc2hlZCgmY3JxLT5oYXNoKSk7CisJCUJVR19PTighY2ZxcS0+YWxsb2NhdGVkW3J3XSk7CisJCWNmcXEtPmFsbG9jYXRlZFtyd10tLTsKIAotCQlpZiAoY3JxLT5pb19jb250ZXh0KQotCQkJcHV0X2lvX2NvbnRleHQoY3JxLT5pb19jb250ZXh0LT5pb2MpOwotCi0JCUJVR19PTighY2ZxcS0+YWxsb2NhdGVkW2NycS0+aXNfd3JpdGVdKTsKLQkJY2ZxcS0+YWxsb2NhdGVkW2NycS0+aXNfd3JpdGVdLS07CisJCXB1dF9pb19jb250ZXh0KGNycS0+aW9fY29udGV4dC0+aW9jKTsKIAogCQltZW1wb29sX2ZyZWUoY3JxLCBjZnFkLT5jcnFfcG9vbCk7CiAJCXJxLT5lbGV2YXRvcl9wcml2YXRlID0gTlVMTDsKIAotCQlzbXBfbWIoKTsKIAkJY2ZxX2NoZWNrX3dhaXRlcnMocSwgY2ZxcSk7CiAJCWNmcV9wdXRfcXVldWUoY2ZxcSk7CiAJfQogfQogCiAvKgotICogQWxsb2NhdGUgY2ZxIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LiBBIHF1ZXVlIGFuZAorICogQWxsb2NhdGUgY2ZxIGRhdGEgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0LgogICovCi1zdGF0aWMgaW50IGNmcV9zZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGdmcF9tYXNrKQorc3RhdGljIGludAorY2ZxX3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3QgYmlvICpiaW8sCisJCWludCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiAJY29uc3QgaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOwotCXN0cnVjdCBjZnFfcXVldWUgKmNmcXEsICpzYXZlZF9jZnFxOworCXBpZF90IGtleSA9IGNmcV9xdWV1ZV9waWQodHNrLCBydyk7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKIAlzdHJ1Y3QgY2ZxX3JxICpjcnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW1pZ2h0X3NsZWVwX2lmKGdmcF9tYXNrICYgX19HRlBfV0FJVCk7CiAKKwljaWMgPSBjZnFfZ2V0X2lvX2NvbnRleHQoY2ZxZCwga2V5LCBnZnBfbWFzayk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQljZnFxID0gX19jZnFfZ2V0X3F1ZXVlKGNmcWQsIGNmcV9oYXNoX2tleShjZnFkLCBjdXJyZW50KSwgZ2ZwX21hc2spOwotCWlmICghY2ZxcSkKLQkJZ290byBvdXRfbG9jazsKKwlpZiAoIWNpYykKKwkJZ290byBxdWV1ZV9mYWlsOwogCi1yZXBlYXQ6Ci0JaWYgKGNmcXEtPmFsbG9jYXRlZFtyd10gPj0gY2ZxZC0+bWF4X3F1ZXVlZCkKLQkJZ290byBvdXRfbG9jazsKKwlpZiAoIWNpYy0+Y2ZxcSkgeworCQljZnFxID0gY2ZxX2dldF9xdWV1ZShjZnFkLCBrZXksIHRzay0+aW9wcmlvLCBnZnBfbWFzayk7CisJCWlmICghY2ZxcSkKKwkJCWdvdG8gcXVldWVfZmFpbDsKKworCQljaWMtPmNmcXEgPSBjZnFxOworCX0gZWxzZQorCQljZnFxID0gY2ljLT5jZnFxOwogCiAJY2ZxcS0+YWxsb2NhdGVkW3J3XSsrOworCWNmcV9jbGVhcl9jZnFxX211c3RfYWxsb2MoY2ZxcSk7CisJY2ZxZC0+cnFfc3RhcnZlZCA9IDA7CisJYXRvbWljX2luYygmY2ZxcS0+cmVmKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAotCS8qCi0JICogaWYgaGFzaGluZyB0eXBlIGhhcyBjaGFuZ2VkLCB0aGUgY2ZxX3F1ZXVlIG1pZ2h0IGNoYW5nZSBoZXJlLgotCSAqLwotCXNhdmVkX2NmcXEgPSBjZnFxOwotCWNpYyA9IGNmcV9nZXRfaW9fY29udGV4dCgmY2ZxcSwgZ2ZwX21hc2spOwotCWlmICghY2ljKQotCQlnb3RvIGVycjsKLQotCS8qCi0JICogcmVwZWF0IGFsbG9jYXRpb24gY2hlY2tzIG9uIHF1ZXVlIGNoYW5nZQotCSAqLwotCWlmICh1bmxpa2VseShzYXZlZF9jZnFxICE9IGNmcXEpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJc2F2ZWRfY2ZxcS0+YWxsb2NhdGVkW3J3XS0tOwotCQlnb3RvIHJlcGVhdDsKLQl9Ci0KIAljcnEgPSBtZW1wb29sX2FsbG9jKGNmcWQtPmNycV9wb29sLCBnZnBfbWFzayk7CiAJaWYgKGNycSkgewogCQlSQl9DTEVBUigmY3JxLT5yYl9ub2RlKTsKQEAgLTE0NjAsMjQgKzIxMDYsMTQxIEBACiAJCUlOSVRfSExJU1RfTk9ERSgmY3JxLT5oYXNoKTsKIAkJY3JxLT5jZnFfcXVldWUgPSBjZnFxOwogCQljcnEtPmlvX2NvbnRleHQgPSBjaWM7Ci0JCWNycS0+c2VydmljZV9zdGFydCA9IGNycS0+cXVldWVfc3RhcnQgPSAwOwotCQljcnEtPmluX2ZsaWdodCA9IGNycS0+YWNjb3VudGVkID0gY3JxLT5pc19zeW5jID0gMDsKLQkJY3JxLT5pc193cml0ZSA9IHJ3OworCQljZnFfY2xlYXJfY3JxX2luX2ZsaWdodChjcnEpOworCQljZnFfY2xlYXJfY3JxX2luX2RyaXZlcihjcnEpOworCQljZnFfY2xlYXJfY3JxX3JlcXVldWVkKGNycSk7CisKKwkJaWYgKHJ3ID09IFJFQUQgfHwgcHJvY2Vzc19zeW5jKHRzaykpCisJCQljZnFfbWFya19jcnFfaXNfc3luYyhjcnEpOworCQllbHNlCisJCQljZnFfY2xlYXJfY3JxX2lzX3N5bmMoY3JxKTsKKwogCQlycS0+ZWxldmF0b3JfcHJpdmF0ZSA9IGNycTsKLQkJY2ZxcS0+YWxsb2NfbGltaXRbcnddID0gMDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcHV0X2lvX2NvbnRleHQoY2ljLT5pb2MpOwotZXJyOgogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIAljZnFxLT5hbGxvY2F0ZWRbcnddLS07CisJaWYgKCEoY2ZxcS0+YWxsb2NhdGVkWzBdICsgY2ZxcS0+YWxsb2NhdGVkWzFdKSkKKwkJY2ZxX21hcmtfY2ZxcV9tdXN0X2FsbG9jKGNmcXEpOwogCWNmcV9wdXRfcXVldWUoY2ZxcSk7Ci1vdXRfbG9jazoKK3F1ZXVlX2ZhaWw6CisJaWYgKGNpYykKKwkJcHV0X2lvX2NvbnRleHQoY2ljLT5pb2MpOworCS8qCisJICogbWFyayB1cyBycSBhbGxvY2F0aW9uIHN0YXJ2ZWQuIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBwcm9jZXNzCisJICogb3Vyc2VsdmVzIGlmIHRoZXJlIGFyZSBubyBwZW5kaW5nIHJlcXVlc3RzIHRoYXQgY2FuIGRvIGl0IGZvciB1cy4KKwkgKiB0aGF0IHdvdWxkIGJlIGFuIGV4dHJlbWVseSByYXJlIE9PTSBzaXR1YXRpb24KKwkgKi8KKwljZnFkLT5ycV9zdGFydmVkID0gMTsKKwljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyB2b2lkIGNmcV9raWNrX3F1ZXVlKHZvaWQgKmRhdGEpCit7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gZGF0YTsKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKGNmcWQtPnJxX3N0YXJ2ZWQpIHsKKwkJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CisKKwkJLyoKKwkJICogd2UgYXJlbid0IGd1YXJhbnRlZWQgdG8gZ2V0IGEgcmVxdWVzdCBhZnRlciB0aGlzLCBidXQgd2UKKwkJICogaGF2ZSB0byBiZSBvcHBvcnR1bmlzdGljCisJCSAqLworCQlzbXBfbWIoKTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJsLT53YWl0W1JFQURdKSkKKwkJCXdha2VfdXAoJnJsLT53YWl0W1JFQURdKTsKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJsLT53YWl0W1dSSVRFXSkpCisJCQl3YWtlX3VwKCZybC0+d2FpdFtXUklURV0pOworCX0KKworCWJsa19yZW1vdmVfcGx1ZyhxKTsKKwlxLT5yZXF1ZXN0X2ZuKHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGltZXIgcnVubmluZyBpZiB0aGUgYWN0aXZlX3F1ZXVlIGlzIGN1cnJlbnRseSBpZGxpbmcgaW5zaWRlIGl0cyB0aW1lIHNsaWNlCisgKi8KK3N0YXRpYyB2b2lkIGNmcV9pZGxlX3NsaWNlX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQgPSAoc3RydWN0IGNmcV9kYXRhICopIGRhdGE7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWlmICgoY2ZxcSA9IGNmcWQtPmFjdGl2ZV9xdWV1ZSkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisKKwkJLyoKKwkJICogZXhwaXJlZAorCQkgKi8KKwkJaWYgKHRpbWVfYWZ0ZXIobm93LCBjZnFxLT5zbGljZV9lbmQpKQorCQkJZ290byBleHBpcmU7CisKKwkJLyoKKwkJICogb25seSBleHBpcmUgYW5kIHJlaW52b2tlIHJlcXVlc3QgaGFuZGxlciwgaWYgdGhlcmUgYXJlCisJCSAqIG90aGVyIHF1ZXVlcyB3aXRoIHBlbmRpbmcgcmVxdWVzdHMKKwkJICovCisJCWlmICghY2ZxX3BlbmRpbmdfcmVxdWVzdHMoY2ZxZCkpIHsKKwkJCWNmcWQtPmlkbGVfc2xpY2VfdGltZXIuZXhwaXJlcyA9IG1pbihub3cgKyBjZnFkLT5jZnFfc2xpY2VfaWRsZSwgY2ZxcS0+c2xpY2VfZW5kKTsKKwkJCWFkZF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CisJCQlnb3RvIG91dF9jb250OworCQl9CisKKwkJLyoKKwkJICogbm90IGV4cGlyZWQgYW5kIGl0IGhhcyBhIHJlcXVlc3QgcGVuZGluZywgbGV0IGl0IGRpc3BhdGNoCisJCSAqLworCQlpZiAoIVJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKSB7CisJCQljZnFfbWFya19jZnFxX211c3RfZGlzcGF0Y2goY2ZxcSk7CisJCQlnb3RvIG91dF9raWNrOworCQl9CisJfQorZXhwaXJlOgorCWNmcV9zbGljZV9leHBpcmVkKGNmcWQsIDApOworb3V0X2tpY2s6CisJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOworb3V0X2NvbnQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogVGltZXIgcnVubmluZyBpZiBhbiBpZGxlIGNsYXNzIHF1ZXVlIGlzIHdhaXRpbmcgZm9yIHNlcnZpY2UKKyAqLworc3RhdGljIHZvaWQgY2ZxX2lkbGVfY2xhc3NfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IChzdHJ1Y3QgY2ZxX2RhdGEgKikgZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBlbmQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShjZnFkLT5xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiByYWNlIHdpdGggYSBub24taWRsZSBxdWV1ZSwgcmVzZXQgdGltZXIKKwkgKi8KKwllbmQgPSBjZnFkLT5sYXN0X2VuZF9yZXF1ZXN0ICsgQ0ZRX0lETEVfR1JBQ0U7CisJaWYgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVuZCkpIHsKKwkJY2ZxZC0+aWRsZV9jbGFzc190aW1lci5leHBpcmVzID0gZW5kOworCQlhZGRfdGltZXIoJmNmcWQtPmlkbGVfY2xhc3NfdGltZXIpOworCX0gZWxzZQorCQljZnFfc2NoZWR1bGVfZGlzcGF0Y2goY2ZxZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNmcV9zaHV0ZG93bl90aW1lcl93cShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCit7CisJZGVsX3RpbWVyX3N5bmMoJmNmcWQtPmlkbGVfc2xpY2VfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZjZnFkLT5pZGxlX2NsYXNzX3RpbWVyKTsKKwlibGtfc3luY19xdWV1ZShjZnFkLT5xdWV1ZSk7Cit9CisKIHN0YXRpYyB2b2lkIGNmcV9wdXRfY2ZxZChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQpCiB7CiAJcmVxdWVzdF9xdWV1ZV90ICpxID0gY2ZxZC0+cXVldWU7CkBAIC0xNDg3LDYgKzIyNTAsOSBAQAogCiAJYmxrX3B1dF9xdWV1ZShxKTsKIAorCWNmcV9zaHV0ZG93bl90aW1lcl93cShjZnFkKTsKKwlxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YSA9IE5VTEw7CisKIAltZW1wb29sX2Rlc3Ryb3koY2ZxZC0+Y3JxX3Bvb2wpOwogCWtmcmVlKGNmcWQtPmNycV9oYXNoKTsKIAlrZnJlZShjZnFkLT5jZnFfaGFzaCk7CkBAIC0xNDk1LDcgKzIyNjEsMTAgQEAKIAogc3RhdGljIHZvaWQgY2ZxX2V4aXRfcXVldWUoZWxldmF0b3JfdCAqZSkKIHsKLQljZnFfcHV0X2NmcWQoZS0+ZWxldmF0b3JfZGF0YSk7CisJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gZS0+ZWxldmF0b3JfZGF0YTsKKworCWNmcV9zaHV0ZG93bl90aW1lcl93cShjZnFkKTsKKwljZnFfcHV0X2NmcWQoY2ZxZCk7CiB9CiAKIHN0YXRpYyBpbnQgY2ZxX2luaXRfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBlbGV2YXRvcl90ICplKQpAQCAtMTUwOCw3ICsyMjc3LDEzIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWVtc2V0KGNmcWQsIDAsIHNpemVvZigqY2ZxZCkpOwotCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5ycl9saXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBDRlFfUFJJT19MSVNUUzsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+cnJfbGlzdFtpXSk7CisKKwlJTklUX0xJU1RfSEVBRCgmY2ZxZC0+YnVzeV9ycik7CisJSU5JVF9MSVNUX0hFQUQoJmNmcWQtPmN1cl9ycik7CisJSU5JVF9MSVNUX0hFQUQoJmNmcWQtPmlkbGVfcnIpOwogCUlOSVRfTElTVF9IRUFEKCZjZnFkLT5lbXB0eV9saXN0KTsKIAogCWNmcWQtPmNycV9oYXNoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpICogQ0ZRX01IQVNIX0VOVFJJRVMsIEdGUF9LRVJORUwpOwpAQCAtMTUzMywyNCArMjMwOCwzMiBAQAogCWNmcWQtPnF1ZXVlID0gcTsKIAlhdG9taWNfaW5jKCZxLT5yZWZjbnQpOwogCi0JLyoKLQkgKiBqdXN0IHNldCBpdCB0byBzb21lIGhpZ2ggdmFsdWUsIHdlIHdhbnQgYW55b25lIHRvIGJlIGFibGUgdG8gcXVldWUKLQkgKiBzb21lIHJlcXVlc3RzLiBmYWlybmVzcyBpcyBoYW5kbGVkIGRpZmZlcmVudGx5Ci0JICovCi0JcS0+bnJfcmVxdWVzdHMgPSAxMDI0OwotCWNmcWQtPm1heF9xdWV1ZWQgPSBxLT5ucl9yZXF1ZXN0cyAvIDE2OworCWNmcWQtPm1heF9xdWV1ZWQgPSBxLT5ucl9yZXF1ZXN0cyAvIDQ7CiAJcS0+bnJfYmF0Y2hpbmcgPSBjZnFfcXVldWVkOwotCWNmcWQtPmtleV90eXBlID0gQ0ZRX0tFWV9UR0lEOwotCWNmcWQtPmZpbmRfYmVzdF9jcnEgPSAxOworCisJaW5pdF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CisJY2ZxZC0+aWRsZV9zbGljZV90aW1lci5mdW5jdGlvbiA9IGNmcV9pZGxlX3NsaWNlX3RpbWVyOworCWNmcWQtPmlkbGVfc2xpY2VfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjZnFkOworCisJaW5pdF90aW1lcigmY2ZxZC0+aWRsZV9jbGFzc190aW1lcik7CisJY2ZxZC0+aWRsZV9jbGFzc190aW1lci5mdW5jdGlvbiA9IGNmcV9pZGxlX2NsYXNzX3RpbWVyOworCWNmcWQtPmlkbGVfY2xhc3NfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjZnFkOworCisJSU5JVF9XT1JLKCZjZnFkLT51bnBsdWdfd29yaywgY2ZxX2tpY2tfcXVldWUsIHEpOworCiAJYXRvbWljX3NldCgmY2ZxZC0+cmVmLCAxKTsKIAogCWNmcWQtPmNmcV9xdWV1ZWQgPSBjZnFfcXVldWVkOwogCWNmcWQtPmNmcV9xdWFudHVtID0gY2ZxX3F1YW50dW07Ci0JY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlX3IgPSBjZnFfZmlmb19leHBpcmVfcjsKLQljZnFkLT5jZnFfZmlmb19leHBpcmVfdyA9IGNmcV9maWZvX2V4cGlyZV93OwotCWNmcWQtPmNmcV9maWZvX2JhdGNoX2V4cGlyZSA9IGNmcV9maWZvX3JhdGU7CisJY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzBdID0gY2ZxX2ZpZm9fZXhwaXJlWzBdOworCWNmcWQtPmNmcV9maWZvX2V4cGlyZVsxXSA9IGNmcV9maWZvX2V4cGlyZVsxXTsKIAljZnFkLT5jZnFfYmFja19tYXggPSBjZnFfYmFja19tYXg7CiAJY2ZxZC0+Y2ZxX2JhY2tfcGVuYWx0eSA9IGNmcV9iYWNrX3BlbmFsdHk7CisJY2ZxZC0+Y2ZxX3NsaWNlWzBdID0gY2ZxX3NsaWNlX2FzeW5jOworCWNmcWQtPmNmcV9zbGljZVsxXSA9IGNmcV9zbGljZV9zeW5jOworCWNmcWQtPmNmcV9zbGljZV9hc3luY19ycSA9IGNmcV9zbGljZV9hc3luY19ycTsKKwljZnFkLT5jZnFfc2xpY2VfaWRsZSA9IGNmcV9zbGljZV9pZGxlOworCWNmcWQtPmNmcV9tYXhfZGVwdGggPSBjZnFfbWF4X2RlcHRoOwogCiAJcmV0dXJuIDA7CiBvdXRfY3JxcG9vbDoKQEAgLTE1OTUsNyArMjM3OCw2IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLQogLyoKICAqIHN5c2ZzIHBhcnRzIGJlbG93IC0tPgogICovCkBAIC0xNjIwLDQ1ICsyNDAyLDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90Ci1jZnFfY2xlYXJfZWxhcHNlZChzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBjb3VudCkKLXsKLQltYXhfZWxhcHNlZF9kaXNwYXRjaCA9IG1heF9lbGFwc2VkX2NycSA9IDA7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdAotY2ZxX3NldF9rZXlfdHlwZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBjb3VudCkKLXsKLQlzcGluX2xvY2tfaXJxKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKLQlpZiAoIXN0cm5jbXAocGFnZSwgInBnaWQiLCA0KSkKLQkJY2ZxZC0+a2V5X3R5cGUgPSBDRlFfS0VZX1BHSUQ7Ci0JZWxzZSBpZiAoIXN0cm5jbXAocGFnZSwgInRnaWQiLCA0KSkKLQkJY2ZxZC0+a2V5X3R5cGUgPSBDRlFfS0VZX1RHSUQ7Ci0JZWxzZSBpZiAoIXN0cm5jbXAocGFnZSwgInVpZCIsIDMpKQotCQljZnFkLT5rZXlfdHlwZSA9IENGUV9LRVlfVUlEOwotCWVsc2UgaWYgKCFzdHJuY21wKHBhZ2UsICJnaWQiLCAzKSkKLQkJY2ZxZC0+a2V5X3R5cGUgPSBDRlFfS0VZX0dJRDsKLQlzcGluX3VubG9ja19pcnEoY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWNmcV9yZWFkX2tleV90eXBlKHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwgY2hhciAqcGFnZSkKLXsKLQlzc2l6ZV90IGxlbiA9IDA7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBDRlFfS0VZX1BHSUQ7IGkgPCBDRlFfS0VZX0xBU1Q7IGkrKykgewotCQlpZiAoY2ZxZC0+a2V5X3R5cGUgPT0gaSkKLQkJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiWyVzXSAiLCBjZnFfa2V5X3R5cGVzW2ldKTsKLQkJZWxzZQotCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlcyAiLCBjZnFfa2V5X3R5cGVzW2ldKTsKLQl9Ci0JbGVuICs9IHNwcmludGYocGFnZStsZW4sICJcbiIpOwotCXJldHVybiBsZW47Ci19Ci0KICNkZWZpbmUgU0hPV19GVU5DVElPTihfX0ZVTkMsIF9fVkFSLCBfX0NPTlYpCQkJCVwKIHN0YXRpYyBzc2l6ZV90IF9fRlVOQyhzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIGNoYXIgKnBhZ2UpCQlcCiB7CQkJCQkJCQkJXApAQCAtMTY2OSwxMiArMjQxMiwxNSBAQAogfQogU0hPV19GVU5DVElPTihjZnFfcXVhbnR1bV9zaG93LCBjZnFkLT5jZnFfcXVhbnR1bSwgMCk7CiBTSE9XX0ZVTkNUSU9OKGNmcV9xdWV1ZWRfc2hvdywgY2ZxZC0+Y2ZxX3F1ZXVlZCwgMCk7Ci1TSE9XX0ZVTkNUSU9OKGNmcV9maWZvX2V4cGlyZV9yX3Nob3csIGNmcWQtPmNmcV9maWZvX2V4cGlyZV9yLCAxKTsKLVNIT1dfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX3dfc2hvdywgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlX3csIDEpOwotU0hPV19GVU5DVElPTihjZnFfZmlmb19iYXRjaF9leHBpcmVfc2hvdywgY2ZxZC0+Y2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlLCAxKTsKLVNIT1dfRlVOQ1RJT04oY2ZxX2ZpbmRfYmVzdF9zaG93LCBjZnFkLT5maW5kX2Jlc3RfY3JxLCAwKTsKK1NIT1dfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX3N5bmNfc2hvdywgY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzFdLCAxKTsKK1NIT1dfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX2FzeW5jX3Nob3csIGNmcWQtPmNmcV9maWZvX2V4cGlyZVswXSwgMSk7CiBTSE9XX0ZVTkNUSU9OKGNmcV9iYWNrX21heF9zaG93LCBjZnFkLT5jZnFfYmFja19tYXgsIDApOwogU0hPV19GVU5DVElPTihjZnFfYmFja19wZW5hbHR5X3Nob3csIGNmcWQtPmNmcV9iYWNrX3BlbmFsdHksIDApOworU0hPV19GVU5DVElPTihjZnFfc2xpY2VfaWRsZV9zaG93LCBjZnFkLT5jZnFfc2xpY2VfaWRsZSwgMSk7CitTSE9XX0ZVTkNUSU9OKGNmcV9zbGljZV9zeW5jX3Nob3csIGNmcWQtPmNmcV9zbGljZVsxXSwgMSk7CitTSE9XX0ZVTkNUSU9OKGNmcV9zbGljZV9hc3luY19zaG93LCBjZnFkLT5jZnFfc2xpY2VbMF0sIDEpOworU0hPV19GVU5DVElPTihjZnFfc2xpY2VfYXN5bmNfcnFfc2hvdywgY2ZxZC0+Y2ZxX3NsaWNlX2FzeW5jX3JxLCAwKTsKK1NIT1dfRlVOQ1RJT04oY2ZxX21heF9kZXB0aF9zaG93LCBjZnFkLT5jZnFfbWF4X2RlcHRoLCAwKTsKICN1bmRlZiBTSE9XX0ZVTkNUSU9OCiAKICNkZWZpbmUgU1RPUkVfRlVOQ1RJT04oX19GVU5DLCBfX1BUUiwgTUlOLCBNQVgsIF9fQ09OVikJCQlcCkBAIC0xNjk0LDEyICsyNDQwLDE1IEBACiB9CiBTVE9SRV9GVU5DVElPTihjZnFfcXVhbnR1bV9zdG9yZSwgJmNmcWQtPmNmcV9xdWFudHVtLCAxLCBVSU5UX01BWCwgMCk7CiBTVE9SRV9GVU5DVElPTihjZnFfcXVldWVkX3N0b3JlLCAmY2ZxZC0+Y2ZxX3F1ZXVlZCwgMSwgVUlOVF9NQVgsIDApOwotU1RPUkVfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX3Jfc3RvcmUsICZjZnFkLT5jZnFfZmlmb19leHBpcmVfciwgMSwgVUlOVF9NQVgsIDEpOwotU1RPUkVfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX3dfc3RvcmUsICZjZnFkLT5jZnFfZmlmb19leHBpcmVfdywgMSwgVUlOVF9NQVgsIDEpOwotU1RPUkVfRlVOQ1RJT04oY2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlX3N0b3JlLCAmY2ZxZC0+Y2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlLCAwLCBVSU5UX01BWCwgMSk7Ci1TVE9SRV9GVU5DVElPTihjZnFfZmluZF9iZXN0X3N0b3JlLCAmY2ZxZC0+ZmluZF9iZXN0X2NycSwgMCwgMSwgMCk7CitTVE9SRV9GVU5DVElPTihjZnFfZmlmb19leHBpcmVfc3luY19zdG9yZSwgJmNmcWQtPmNmcV9maWZvX2V4cGlyZVsxXSwgMSwgVUlOVF9NQVgsIDEpOworU1RPUkVfRlVOQ1RJT04oY2ZxX2ZpZm9fZXhwaXJlX2FzeW5jX3N0b3JlLCAmY2ZxZC0+Y2ZxX2ZpZm9fZXhwaXJlWzBdLCAxLCBVSU5UX01BWCwgMSk7CiBTVE9SRV9GVU5DVElPTihjZnFfYmFja19tYXhfc3RvcmUsICZjZnFkLT5jZnFfYmFja19tYXgsIDAsIFVJTlRfTUFYLCAwKTsKIFNUT1JFX0ZVTkNUSU9OKGNmcV9iYWNrX3BlbmFsdHlfc3RvcmUsICZjZnFkLT5jZnFfYmFja19wZW5hbHR5LCAxLCBVSU5UX01BWCwgMCk7CitTVE9SRV9GVU5DVElPTihjZnFfc2xpY2VfaWRsZV9zdG9yZSwgJmNmcWQtPmNmcV9zbGljZV9pZGxlLCAwLCBVSU5UX01BWCwgMSk7CitTVE9SRV9GVU5DVElPTihjZnFfc2xpY2Vfc3luY19zdG9yZSwgJmNmcWQtPmNmcV9zbGljZVsxXSwgMSwgVUlOVF9NQVgsIDEpOworU1RPUkVfRlVOQ1RJT04oY2ZxX3NsaWNlX2FzeW5jX3N0b3JlLCAmY2ZxZC0+Y2ZxX3NsaWNlWzBdLCAxLCBVSU5UX01BWCwgMSk7CitTVE9SRV9GVU5DVElPTihjZnFfc2xpY2VfYXN5bmNfcnFfc3RvcmUsICZjZnFkLT5jZnFfc2xpY2VfYXN5bmNfcnEsIDEsIFVJTlRfTUFYLCAwKTsKK1NUT1JFX0ZVTkNUSU9OKGNmcV9tYXhfZGVwdGhfc3RvcmUsICZjZnFkLT5jZnFfbWF4X2RlcHRoLCAxLCBVSU5UX01BWCwgMCk7CiAjdW5kZWYgU1RPUkVfRlVOQ1RJT04KIAogc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX3F1YW50dW1fZW50cnkgPSB7CkBAIC0xNzEyLDI1ICsyNDYxLDE1IEBACiAJLnNob3cgPSBjZnFfcXVldWVkX3Nob3csCiAJLnN0b3JlID0gY2ZxX3F1ZXVlZF9zdG9yZSwKIH07Ci1zdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfZmlmb19leHBpcmVfcl9lbnRyeSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9maWZvX2V4cGlyZV9zeW5jX2VudHJ5ID0gewogCS5hdHRyID0gey5uYW1lID0gImZpZm9fZXhwaXJlX3N5bmMiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCi0JLnNob3cgPSBjZnFfZmlmb19leHBpcmVfcl9zaG93LAotCS5zdG9yZSA9IGNmcV9maWZvX2V4cGlyZV9yX3N0b3JlLAorCS5zaG93ID0gY2ZxX2ZpZm9fZXhwaXJlX3N5bmNfc2hvdywKKwkuc3RvcmUgPSBjZnFfZmlmb19leHBpcmVfc3luY19zdG9yZSwKIH07Ci1zdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfZmlmb19leHBpcmVfd19lbnRyeSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9maWZvX2V4cGlyZV9hc3luY19lbnRyeSA9IHsKIAkuYXR0ciA9IHsubmFtZSA9ICJmaWZvX2V4cGlyZV9hc3luYyIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKLQkuc2hvdyA9IGNmcV9maWZvX2V4cGlyZV93X3Nob3csCi0JLnN0b3JlID0gY2ZxX2ZpZm9fZXhwaXJlX3dfc3RvcmUsCi19Owotc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlX2VudHJ5ID0gewotCS5hdHRyID0gey5uYW1lID0gImZpZm9fYmF0Y2hfZXhwaXJlIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAotCS5zaG93ID0gY2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlX3Nob3csCi0JLnN0b3JlID0gY2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlX3N0b3JlLAotfTsKLXN0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9maW5kX2Jlc3RfZW50cnkgPSB7Ci0JLmF0dHIgPSB7Lm5hbWUgPSAiZmluZF9iZXN0X2NycSIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKLQkuc2hvdyA9IGNmcV9maW5kX2Jlc3Rfc2hvdywKLQkuc3RvcmUgPSBjZnFfZmluZF9iZXN0X3N0b3JlLAorCS5zaG93ID0gY2ZxX2ZpZm9fZXhwaXJlX2FzeW5jX3Nob3csCisJLnN0b3JlID0gY2ZxX2ZpZm9fZXhwaXJlX2FzeW5jX3N0b3JlLAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9iYWNrX21heF9lbnRyeSA9IHsKIAkuYXR0ciA9IHsubmFtZSA9ICJiYWNrX3NlZWtfbWF4IiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LApAQCAtMTc0MiwyNyArMjQ4MSw0NCBAQAogCS5zaG93ID0gY2ZxX2JhY2tfcGVuYWx0eV9zaG93LAogCS5zdG9yZSA9IGNmcV9iYWNrX3BlbmFsdHlfc3RvcmUsCiB9Owotc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2NsZWFyX2VsYXBzZWRfZW50cnkgPSB7Ci0JLmF0dHIgPSB7Lm5hbWUgPSAiY2xlYXJfZWxhcHNlZCIsIC5tb2RlID0gU19JV1VTUiB9LAotCS5zdG9yZSA9IGNmcV9jbGVhcl9lbGFwc2VkLAorc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX3NsaWNlX3N5bmNfZW50cnkgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAic2xpY2Vfc3luYyIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdyA9IGNmcV9zbGljZV9zeW5jX3Nob3csCisJLnN0b3JlID0gY2ZxX3NsaWNlX3N5bmNfc3RvcmUsCiB9Owotc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX2tleV90eXBlX2VudHJ5ID0gewotCS5hdHRyID0gey5uYW1lID0gImtleV90eXBlIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiB9LAotCS5zaG93ID0gY2ZxX3JlYWRfa2V5X3R5cGUsCi0JLnN0b3JlID0gY2ZxX3NldF9rZXlfdHlwZSwKK3N0YXRpYyBzdHJ1Y3QgY2ZxX2ZzX2VudHJ5IGNmcV9zbGljZV9hc3luY19lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJzbGljZV9hc3luYyIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdyA9IGNmcV9zbGljZV9hc3luY19zaG93LAorCS5zdG9yZSA9IGNmcV9zbGljZV9hc3luY19zdG9yZSwKK307CitzdGF0aWMgc3RydWN0IGNmcV9mc19lbnRyeSBjZnFfc2xpY2VfYXN5bmNfcnFfZW50cnkgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAic2xpY2VfYXN5bmNfcnEiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCisJLnNob3cgPSBjZnFfc2xpY2VfYXN5bmNfcnFfc2hvdywKKwkuc3RvcmUgPSBjZnFfc2xpY2VfYXN5bmNfcnFfc3RvcmUsCit9Oworc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX3NsaWNlX2lkbGVfZW50cnkgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAic2xpY2VfaWRsZSIsIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IgfSwKKwkuc2hvdyA9IGNmcV9zbGljZV9pZGxlX3Nob3csCisJLnN0b3JlID0gY2ZxX3NsaWNlX2lkbGVfc3RvcmUsCit9Oworc3RhdGljIHN0cnVjdCBjZnFfZnNfZW50cnkgY2ZxX21heF9kZXB0aF9lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJtYXhfZGVwdGgiLCAubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSIH0sCisJLnNob3cgPSBjZnFfbWF4X2RlcHRoX3Nob3csCisJLnN0b3JlID0gY2ZxX21heF9kZXB0aF9zdG9yZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpkZWZhdWx0X2F0dHJzW10gPSB7CiAJJmNmcV9xdWFudHVtX2VudHJ5LmF0dHIsCiAJJmNmcV9xdWV1ZWRfZW50cnkuYXR0ciwKLQkmY2ZxX2ZpZm9fZXhwaXJlX3JfZW50cnkuYXR0ciwKLQkmY2ZxX2ZpZm9fZXhwaXJlX3dfZW50cnkuYXR0ciwKLQkmY2ZxX2ZpZm9fYmF0Y2hfZXhwaXJlX2VudHJ5LmF0dHIsCi0JJmNmcV9rZXlfdHlwZV9lbnRyeS5hdHRyLAotCSZjZnFfZmluZF9iZXN0X2VudHJ5LmF0dHIsCisJJmNmcV9maWZvX2V4cGlyZV9zeW5jX2VudHJ5LmF0dHIsCisJJmNmcV9maWZvX2V4cGlyZV9hc3luY19lbnRyeS5hdHRyLAogCSZjZnFfYmFja19tYXhfZW50cnkuYXR0ciwKIAkmY2ZxX2JhY2tfcGVuYWx0eV9lbnRyeS5hdHRyLAotCSZjZnFfY2xlYXJfZWxhcHNlZF9lbnRyeS5hdHRyLAorCSZjZnFfc2xpY2Vfc3luY19lbnRyeS5hdHRyLAorCSZjZnFfc2xpY2VfYXN5bmNfZW50cnkuYXR0ciwKKwkmY2ZxX3NsaWNlX2FzeW5jX3JxX2VudHJ5LmF0dHIsCisJJmNmcV9zbGljZV9pZGxlX2VudHJ5LmF0dHIsCisJJmNmcV9tYXhfZGVwdGhfZW50cnkuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMTgzMiwyMSArMjU4OCw0NiBAQAogewogCWludCByZXQ7CiAKKwkvKgorCSAqIGNvdWxkIGJlIDAgb24gSFogPCAxMDAwIHNldHVwcworCSAqLworCWlmICghY2ZxX3NsaWNlX2FzeW5jKQorCQljZnFfc2xpY2VfYXN5bmMgPSAxOworCWlmICghY2ZxX3NsaWNlX2lkbGUpCisJCWNmcV9zbGljZV9pZGxlID0gMTsKKwogCWlmIChjZnFfc2xhYl9zZXR1cCgpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IGVsdl9yZWdpc3RlcigmaW9zY2hlZF9jZnEpOwotCWlmICghcmV0KSB7Ci0JCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAocmV0KQorCQljZnFfc2xhYl9raWxsKCk7CiAKLQljZnFfc2xhYl9raWxsKCk7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNmcV9leGl0KHZvaWQpCiB7CisJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVhZF9sb2NrX2lycXNhdmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogaXRlcmF0ZSBlYWNoIHByb2Nlc3MgaW4gdGhlIHN5c3RlbSwgcmVtb3Zpbmcgb3VyIGlvX2NvbnRleHQKKwkgKi8KKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBwLT5pb19jb250ZXh0OworCisJCWlmIChpb2MgJiYgaW9jLT5jaWMpIHsKKwkJCWlvYy0+Y2ljLT5leGl0KGlvYy0+Y2ljKTsKKwkJCWNmcV9mcmVlX2lvX2NvbnRleHQoaW9jLT5jaWMpOworCQkJaW9jLT5jaWMgPSBOVUxMOworCQl9CisJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKKworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKTsKKwogCWNmcV9zbGFiX2tpbGwoKTsKIAllbHZfdW5yZWdpc3RlcigmaW9zY2hlZF9jZnEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMgYi9kcml2ZXJzL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwppbmRleCA0YmMyZmVhLi5mZjUyMDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYwpAQCAtNzYwLDcgKzc2MCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRlYWRsaW5lX3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZ2ZwX21hc2spCitkZWFkbGluZV9zZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwgc3RydWN0IGJpbyAqYmlvLAorCQkgICAgIGludCBnZnBfbWFzaykKIHsKIAlzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqZGQgPSBxLT5lbGV2YXRvci0+ZWxldmF0b3JfZGF0YTsKIAlzdHJ1Y3QgZGVhZGxpbmVfcnEgKmRycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZWxldmF0b3IuYyBiL2RyaXZlcnMvYmxvY2svZWxldmF0b3IuYwppbmRleCBmODMxZjA4Li45OGYwMTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvZHJpdmVycy9ibG9jay9lbGV2YXRvci5jCkBAIC00ODYsMTIgKzQ4NiwxMyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQgZWx2X3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZ2ZwX21hc2spCitpbnQgZWx2X3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3QgYmlvICpiaW8sCisJCSAgICBpbnQgZ2ZwX21hc2spCiB7CiAJZWxldmF0b3JfdCAqZSA9IHEtPmVsZXZhdG9yOwogCiAJaWYgKGUtPm9wcy0+ZWxldmF0b3Jfc2V0X3JlcV9mbikKLQkJcmV0dXJuIGUtPm9wcy0+ZWxldmF0b3Jfc2V0X3JlcV9mbihxLCBycSwgZ2ZwX21hc2spOworCQlyZXR1cm4gZS0+b3BzLT5lbGV2YXRvcl9zZXRfcmVxX2ZuKHEsIHJxLCBiaW8sIGdmcF9tYXNrKTsKIAogCXJxLT5lbGV2YXRvcl9wcml2YXRlID0gTlVMTDsKIAlyZXR1cm4gMDsKQEAgLTUwNSwxMiArNTA2LDEyIEBACiAJCWUtPm9wcy0+ZWxldmF0b3JfcHV0X3JlcV9mbihxLCBycSk7CiB9CiAKLWludCBlbHZfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQoraW50IGVsdl9tYXlfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxLCBpbnQgcncsIHN0cnVjdCBiaW8gKmJpbykKIHsKIAllbGV2YXRvcl90ICplID0gcS0+ZWxldmF0b3I7CiAKIAlpZiAoZS0+b3BzLT5lbGV2YXRvcl9tYXlfcXVldWVfZm4pCi0JCXJldHVybiBlLT5vcHMtPmVsZXZhdG9yX21heV9xdWV1ZV9mbihxLCBydyk7CisJCXJldHVybiBlLT5vcHMtPmVsZXZhdG9yX21heV9xdWV1ZV9mbihxLCBydywgYmlvKTsKIAogCXJldHVybiBFTFZfTVFVRVVFX01BWTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMgYi9kcml2ZXJzL2Jsb2NrL2xsX3J3X2Jsay5jCmluZGV4IGZkOTRlYTIuLjY5MmE1ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvZHJpdmVycy9ibG9jay9sbF9yd19ibGsuYwpAQCAtMzcsNiArMzcsNyBAQAogCiBzdGF0aWMgdm9pZCBibGtfdW5wbHVnX3dvcmsodm9pZCAqZGF0YSk7CiBzdGF0aWMgdm9pZCBibGtfdW5wbHVnX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIGRyaXZlX3N0YXRfYWNjdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBucl9zZWN0b3JzLCBpbnQgbmV3X2lvKTsKIAogLyoKICAqIEZvciB0aGUgYWxsb2NhdGVkIHJlcXVlc3QgdGFibGVzCkBAIC0yNzUsNiArMjc2LDcgQEAKIAlycS0+ZXJyb3JzID0gMDsKIAlycS0+cnFfc3RhdHVzID0gUlFfQUNUSVZFOwogCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IE5VTEw7CisJcnEtPmlvcHJpbyA9IDA7CiAJcnEtPmJ1ZmZlciA9IE5VTEw7CiAJcnEtPnJlZl9jb3VudCA9IDE7CiAJcnEtPnEgPSBxOwpAQCAtMTEzNyw3ICsxMTM5LDcgQEAKIH0KIAogCi1pbnQgYmxrX3BoeXNfY29udGlnX3NlZ21lbnQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8sCitzdGF0aWMgaW50IGJsa19waHlzX2NvbnRpZ19zZWdtZW50KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvLAogCQkJCSAgIHN0cnVjdCBiaW8gKm54dCkKIHsKIAlpZiAoIShxLT5xdWV1ZV9mbGFncyAmICgxIDw8IFFVRVVFX0ZMQUdfQ0xVU1RFUikpKQpAQCAtMTE1OCw5ICsxMTYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChibGtfcGh5c19jb250aWdfc2VnbWVudCk7Ci0KLWludCBibGtfaHdfY29udGlnX3NlZ21lbnQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8sCitzdGF0aWMgaW50IGJsa19od19jb250aWdfc2VnbWVudChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbywKIAkJCQkgc3RydWN0IGJpbyAqbnh0KQogewogCWlmICh1bmxpa2VseSghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fU0VHX1ZBTElEKSkpCkBAIC0xMTc2LDggKzExNzYsNiBAQAogCXJldHVybiAxOwogfQogCi1FWFBPUlRfU1lNQk9MKGJsa19od19jb250aWdfc2VnbWVudCk7Ci0KIC8qCiAgKiBtYXAgYSByZXF1ZXN0IHRvIHNjYXR0ZXJsaXN0LCByZXR1cm4gbnVtYmVyIG9mIHNnIGVudHJpZXMgc2V0dXAuIENhbGxlcgogICogbXVzdCBtYWtlIHN1cmUgc2cgY2FuIGhvbGQgcnEtPm5yX3BoeXNfc2VnbWVudHMgZW50cmllcwpAQCAtMTM0Nyw4ICsxMzQ1LDggQEAKIHN0YXRpYyBpbnQgbGxfbWVyZ2VfcmVxdWVzdHNfZm4ocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxLAogCQkJCXN0cnVjdCByZXF1ZXN0ICpuZXh0KQogewotCWludCB0b3RhbF9waHlzX3NlZ21lbnRzID0gcmVxLT5ucl9waHlzX3NlZ21lbnRzICtuZXh0LT5ucl9waHlzX3NlZ21lbnRzOwotCWludCB0b3RhbF9od19zZWdtZW50cyA9IHJlcS0+bnJfaHdfc2VnbWVudHMgKyBuZXh0LT5ucl9od19zZWdtZW50czsKKwlpbnQgdG90YWxfcGh5c19zZWdtZW50czsKKwlpbnQgdG90YWxfaHdfc2VnbWVudHM7CiAKIAkvKgogCSAqIEZpcnN0IGNoZWNrIGlmIHRoZSBlaXRoZXIgb2YgdGhlIHJlcXVlc3RzIGFyZSByZS1xdWV1ZWQKQEAgLTEzNTgsNyArMTM1Niw3IEBACiAJCXJldHVybiAwOwogCiAJLyoKLQkgKiBXaWxsIGl0IGJlY29tZSB0byBsYXJnZT8KKwkgKiBXaWxsIGl0IGJlY29tZSB0b28gbGFyZ2U/CiAJICovCiAJaWYgKChyZXEtPm5yX3NlY3RvcnMgKyBuZXh0LT5ucl9zZWN0b3JzKSA+IHEtPm1heF9zZWN0b3JzKQogCQlyZXR1cm4gMDsKQEAgLTE0NDUsMTEgKzE0NDMsNyBAQAogCWlmICghYmxrX3JlbW92ZV9wbHVnKHEpKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIHdhcyBwbHVnZ2VkLCBmaXJlIHJlcXVlc3RfZm4gaWYgcXVldWUgaGFzIHN0dWZmIHRvIGRvCi0JICovCi0JaWYgKGVsdl9uZXh0X3JlcXVlc3QocSkpCi0JCXEtPnJlcXVlc3RfZm4ocSk7CisJcS0+cmVxdWVzdF9mbihxKTsKIH0KIEVYUE9SVF9TWU1CT0woX19nZW5lcmljX3VucGx1Z19kZXZpY2UpOwogCkBAIC0xNzc5LDggKzE3NzMsOCBAQAogCW1lbXBvb2xfZnJlZShycSwgcS0+cnEucnFfcG9vbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3QgKmJsa19hbGxvY19yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LAotCQkJCQkJaW50IGdmcF9tYXNrKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdCAqCitibGtfYWxsb2NfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEsIGludCBydywgc3RydWN0IGJpbyAqYmlvLCBpbnQgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gbWVtcG9vbF9hbGxvYyhxLT5ycS5ycV9wb29sLCBnZnBfbWFzayk7CiAKQEAgLTE3OTMsNyArMTc4Nyw3IEBACiAJICovCiAJcnEtPmZsYWdzID0gcnc7CiAKLQlpZiAoIWVsdl9zZXRfcmVxdWVzdChxLCBycSwgZ2ZwX21hc2spKQorCWlmICghZWx2X3NldF9yZXF1ZXN0KHEsIHJxLCBiaW8sIGdmcF9tYXNrKSkKIAkJcmV0dXJuIHJxOwogCiAJbWVtcG9vbF9mcmVlKHJxLCBxLT5ycS5ycV9wb29sKTsKQEAgLTE4MjUsNyArMTgxOSw3IEBACiAgKiBpcyB0aGUgYmVoYXZpb3VyIHdlIHdhbnQgdGhvdWdoIC0gb25jZSBpdCBnZXRzIGEgd2FrZXVwIGl0IHNob3VsZCBiZSBnaXZlbgogICogYSBuaWNlIHJ1bi4KICAqLwotdm9pZCBpb2Nfc2V0X2JhdGNoaW5nKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGlvX2NvbnRleHQgKmlvYykKK3N0YXRpYyB2b2lkIGlvY19zZXRfYmF0Y2hpbmcocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgaW9fY29udGV4dCAqaW9jKQogewogCWlmICghaW9jIHx8IGlvY19iYXRjaGluZyhxLCBpb2MpKQogCQlyZXR1cm47CkBAIC0xODczLDE4ICsxODY3LDIwIEBACiAKICNkZWZpbmUgYmxrZGV2X2ZyZWVfcnEobGlzdCkgbGlzdF9lbnRyeSgobGlzdCktPm5leHQsIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpCiAvKgotICogR2V0IGEgZnJlZSByZXF1ZXN0LCBxdWV1ZV9sb2NrIG11c3Qgbm90IGJlIGhlbGQKKyAqIEdldCBhIGZyZWUgcmVxdWVzdCwgcXVldWVfbG9jayBtdXN0IGJlIGhlbGQuCisgKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZSwgd2l0aCBxdWV1ZV9sb2NrIGhlbGQuCisgKiBSZXR1cm5zICFOVUxMIG9uIHN1Y2Nlc3MsIHdpdGggcXVldWVfbG9jayAqbm90IGhlbGQqLgogICovCi1zdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBpbnQgZ2ZwX21hc2spCitzdGF0aWMgc3RydWN0IHJlcXVlc3QgKmdldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkJICAgaW50IGdmcF9tYXNrKQogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9IE5VTEw7CiAJc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7Ci0Jc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IGdldF9pb19jb250ZXh0KGdmcF9tYXNrKTsKKwlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jID0gY3VycmVudF9pb19jb250ZXh0KEdGUF9BVE9NSUMpOwogCiAJaWYgKHVubGlrZWx5KHRlc3RfYml0KFFVRVVFX0ZMQUdfRFJBSU4sICZxLT5xdWV1ZV9mbGFncykpKQogCQlnb3RvIG91dDsKIAotCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJaWYgKHJsLT5jb3VudFtyd10rMSA+PSBxLT5ucl9yZXF1ZXN0cykgewogCQkvKgogCQkgKiBUaGUgcXVldWUgd2lsbCBmaWxsIGFmdGVyIHRoaXMgYWxsb2NhdGlvbiwgc28gc2V0IGl0IGFzCkBAIC0xODk4LDcgKzE4OTQsNyBAQAogCQl9CiAJfQogCi0Jc3dpdGNoIChlbHZfbWF5X3F1ZXVlKHEsIHJ3KSkgeworCXN3aXRjaCAoZWx2X21heV9xdWV1ZShxLCBydywgYmlvKSkgewogCQljYXNlIEVMVl9NUVVFVUVfTk86CiAJCQlnb3RvIHJxX3N0YXJ2ZWQ7CiAJCWNhc2UgRUxWX01RVUVVRV9NQVk6CkBAIC0xOTEyLDE4ICsxOTA4LDI1IEBACiAJCSAqIFRoZSBxdWV1ZSBpcyBmdWxsIGFuZCB0aGUgYWxsb2NhdGluZyBwcm9jZXNzIGlzIG5vdCBhCiAJCSAqICJiYXRjaGVyIiwgYW5kIG5vdCBleGVtcHRlZCBieSB0aGUgSU8gc2NoZWR1bGVyCiAJCSAqLwotCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCWdvdG8gb3V0OwogCX0KIAogZ2V0X3JxOgorCS8qCisJICogT25seSBhbGxvdyBiYXRjaGluZyBxdWV1ZXJzIHRvIGFsbG9jYXRlIHVwIHRvIDUwJSBvdmVyIHRoZSBkZWZpbmVkCisJICogbGltaXQgb2YgcmVxdWVzdHMsIG90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIHRob3VzYW5kcyBvZiByZXF1ZXN0cworCSAqIGFsbG9jYXRlZCB3aXRoIGFueSBzZXR0aW5nIG9mIC0+bnJfcmVxdWVzdHMKKwkgKi8KKwlpZiAocmwtPmNvdW50W3J3XSA+PSAoMyAqIHEtPm5yX3JlcXVlc3RzIC8gMikpCisJCWdvdG8gb3V0OworCiAJcmwtPmNvdW50W3J3XSsrOwogCXJsLT5zdGFydmVkW3J3XSA9IDA7CiAJaWYgKHJsLT5jb3VudFtyd10gPj0gcXVldWVfY29uZ2VzdGlvbl9vbl90aHJlc2hvbGQocSkpCiAJCXNldF9xdWV1ZV9jb25nZXN0ZWQocSwgcncpOwogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCXJxID0gYmxrX2FsbG9jX3JlcXVlc3QocSwgcncsIGdmcF9tYXNrKTsKKwlycSA9IGJsa19hbGxvY19yZXF1ZXN0KHEsIHJ3LCBiaW8sIGdmcF9tYXNrKTsKIAlpZiAoIXJxKSB7CiAJCS8qCiAJCSAqIEFsbG9jYXRpb24gZmFpbGVkIHByZXN1bWFibHkgZHVlIHRvIG1lbW9yeS4gVW5kbyBhbnl0aGluZwpAQCAtMTk0Niw3ICsxOTQ5LDYgQEAKIAkJaWYgKHVubGlrZWx5KHJsLT5jb3VudFtyd10gPT0gMCkpCiAJCQlybC0+c3RhcnZlZFtyd10gPSAxOwogCi0JCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xOTU2LDMxICsxOTU4LDM1IEBACiAJcnFfaW5pdChxLCBycSk7CiAJcnEtPnJsID0gcmw7CiBvdXQ6Ci0JcHV0X2lvX2NvbnRleHQoaW9jKTsKIAlyZXR1cm4gcnE7CiB9CiAKIC8qCiAgKiBObyBhdmFpbGFibGUgcmVxdWVzdHMgZm9yIHRoaXMgcXVldWUsIHVucGx1ZyB0aGUgZGV2aWNlIGFuZCB3YWl0IGZvciBzb21lCiAgKiByZXF1ZXN0cyB0byBiZWNvbWUgYXZhaWxhYmxlLgorICoKKyAqIENhbGxlZCB3aXRoIHEtPnF1ZXVlX2xvY2sgaGVsZCwgYW5kIHJldHVybnMgd2l0aCBpdCB1bmxvY2tlZC4KICAqLwotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdF93YWl0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3KQorc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpnZXRfcmVxdWVzdF93YWl0KHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LAorCQkJCQlzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JREVGSU5FX1dBSVQod2FpdCk7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCi0JZG8geworCXJxID0gZ2V0X3JlcXVlc3QocSwgcncsIGJpbywgR0ZQX05PSU8pOworCXdoaWxlICghcnEpIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CiAJCXN0cnVjdCByZXF1ZXN0X2xpc3QgKnJsID0gJnEtPnJxOwogCiAJCXByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUoJnJsLT53YWl0W3J3XSwgJndhaXQsCiAJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwogCi0JCXJxID0gZ2V0X3JlcXVlc3QocSwgcncsIEdGUF9OT0lPKTsKKwkJcnEgPSBnZXRfcmVxdWVzdChxLCBydywgYmlvLCBHRlBfTk9JTyk7CiAKIAkJaWYgKCFycSkgewogCQkJc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKIAotCQkJZ2VuZXJpY191bnBsdWdfZGV2aWNlKHEpOworCQkJX19nZW5lcmljX3VucGx1Z19kZXZpY2UocSk7CisJCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCQlpb19zY2hlZHVsZSgpOwogCiAJCQkvKgpAQCAtMTk4OSwxMiArMTk5NSwxMyBAQAogCQkJICogdXAgdG8gYSBiaWcgYmF0Y2ggb2YgdGhlbSBmb3IgYSBzbWFsbCBwZXJpb2QgdGltZS4KIAkJCSAqIFNlZSBpb2NfYmF0Y2hpbmcsIGlvY19zZXRfYmF0Y2hpbmcKIAkJCSAqLwotCQkJaW9jID0gZ2V0X2lvX2NvbnRleHQoR0ZQX05PSU8pOworCQkJaW9jID0gY3VycmVudF9pb19jb250ZXh0KEdGUF9OT0lPKTsKIAkJCWlvY19zZXRfYmF0Y2hpbmcocSwgaW9jKTsKLQkJCXB1dF9pb19jb250ZXh0KGlvYyk7CisKKwkJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCX0KIAkJZmluaXNoX3dhaXQoJnJsLT53YWl0W3J3XSwgJndhaXQpOwotCX0gd2hpbGUgKCFycSk7CisJfQogCiAJcmV0dXJuIHJxOwogfQpAQCAtMjAwNSwxNCArMjAxMiwxOCBAQAogCiAJQlVHX09OKHJ3ICE9IFJFQUQgJiYgcncgIT0gV1JJVEUpOwogCi0JaWYgKGdmcF9tYXNrICYgX19HRlBfV0FJVCkKLQkJcnEgPSBnZXRfcmVxdWVzdF93YWl0KHEsIHJ3KTsKLQllbHNlCi0JCXJxID0gZ2V0X3JlcXVlc3QocSwgcncsIGdmcF9tYXNrKTsKKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCWlmIChnZnBfbWFzayAmIF9fR0ZQX1dBSVQpIHsKKwkJcnEgPSBnZXRfcmVxdWVzdF93YWl0KHEsIHJ3LCBOVUxMKTsKKwl9IGVsc2UgeworCQlycSA9IGdldF9yZXF1ZXN0KHEsIHJ3LCBOVUxMLCBnZnBfbWFzayk7CisJCWlmICghcnEpCisJCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CisJfQorCS8qIHEtPnF1ZXVlX2xvY2sgaXMgdW5sb2NrZWQgYXQgdGhpcyBwb2ludCAqLwogCiAJcmV0dXJuIHJxOwogfQotCiBFWFBPUlRfU1lNQk9MKGJsa19nZXRfcmVxdWVzdCk7CiAKIC8qKgpAQCAtMjI1NCw0NSArMjI2NSw3IEBACiAKIEVYUE9SVF9TWU1CT0woYmxrZGV2X2lzc3VlX2ZsdXNoKTsKIAotLyoqCi0gKiBibGtkZXZfc2NzaV9pc3N1ZV9mbHVzaF9mbiAtIGlzc3VlIGZsdXNoIGZvciBTQ1NJIGRldmljZXMKLSAqIEBxOgkJZGV2aWNlIHF1ZXVlCi0gKiBAZGlzazoJZ2VuZGlzawotICogQGVycm9yX3NlY3RvcjoJZXJyb3Igb2Zmc2V0Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgICBEZXZpY2VzIHVuZGVyc3RhbmRpbmcgdGhlIFNDU0kgY29tbWFuZCBzZXQsIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBhcwotICogICAgYSBoZWxwZXIgZm9yIGlzc3VpbmcgYSBjYWNoZSBmbHVzaC4gTm90ZTogZHJpdmVyIGlzIHJlcXVpcmVkIHRvIHN0b3JlCi0gKiAgICB0aGUgZXJyb3Igb2Zmc2V0IChpbiBjYXNlIG9mIGVycm9yIGZsdXNoaW5nKSBpbiAtPnNlY3RvciBvZiBzdHJ1Y3QKLSAqICAgIHJlcXVlc3QuCi0gKi8KLWludCBibGtkZXZfc2NzaV9pc3N1ZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBnZW5kaXNrICpkaXNrLAotCQkJICAgICAgIHNlY3Rvcl90ICplcnJvcl9zZWN0b3IpCi17Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFdSSVRFLCBfX0dGUF9XQUlUKTsKLQlpbnQgcmV0OwotCi0JcnEtPmZsYWdzIHw9IFJFUV9CTE9DS19QQyB8IFJFUV9TT0ZUQkFSUklFUjsKLQlycS0+c2VjdG9yID0gMDsKLQltZW1zZXQocnEtPmNtZCwgMCwgc2l6ZW9mKHJxLT5jbWQpKTsKLQlycS0+Y21kWzBdID0gMHgzNTsKLQlycS0+Y21kX2xlbiA9IDEyOwotCXJxLT5kYXRhID0gTlVMTDsKLQlycS0+ZGF0YV9sZW4gPSAwOwotCXJxLT50aW1lb3V0ID0gNjAgKiBIWjsKLQotCXJldCA9IGJsa19leGVjdXRlX3JxKHEsIGRpc2ssIHJxKTsKLQotCWlmIChyZXQgJiYgZXJyb3Jfc2VjdG9yKQotCQkqZXJyb3Jfc2VjdG9yID0gcnEtPnNlY3RvcjsKLQotCWJsa19wdXRfcmVxdWVzdChycSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotRVhQT1JUX1NZTUJPTChibGtkZXZfc2NzaV9pc3N1ZV9mbHVzaF9mbik7Ci0KLXZvaWQgZHJpdmVfc3RhdF9hY2N0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IG5yX3NlY3RvcnMsIGludCBuZXdfaW8pCitzdGF0aWMgdm9pZCBkcml2ZV9zdGF0X2FjY3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgbnJfc2VjdG9ycywgaW50IG5ld19pbykKIHsKIAlpbnQgcncgPSBycV9kYXRhX2RpcihycSk7CiAKQEAgLTIzNzQsNyArMjM0Nyw2IEBACiAJCXJldHVybjsKIAogCXJlcS0+cnFfc3RhdHVzID0gUlFfSU5BQ1RJVkU7Ci0JcmVxLT5xID0gTlVMTDsKIAlyZXEtPnJsID0gTlVMTDsKIAogCS8qCkBAIC0yNTAzLDYgKzI0NzUsOCBAQAogCQlyZXEtPnJxX2Rpc2stPmluX2ZsaWdodC0tOwogCX0KIAorCXJlcS0+aW9wcmlvID0gaW9wcmlvX2Jlc3QocmVxLT5pb3ByaW8sIG5leHQtPmlvcHJpbyk7CisKIAlfX2Jsa19wdXRfcmVxdWVzdChxLCBuZXh0KTsKIAlyZXR1cm4gMTsKIH0KQEAgLTI1NTEsMjUgKzI1MjUsMTcgQEAKIAogRVhQT1JUX1NZTUJPTChibGtfYXR0ZW1wdF9yZW1lcmdlKTsKIAotLyoKLSAqIE5vbi1sb2NraW5nIGJsa19hdHRlbXB0X3JlbWVyZ2UgdmFyaWFudC4KLSAqLwotdm9pZCBfX2Jsa19hdHRlbXB0X3JlbWVyZ2UocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCi17Ci0JYXR0ZW1wdF9iYWNrX21lcmdlKHEsIHJxKTsKLX0KLQotRVhQT1JUX1NZTUJPTChfX2Jsa19hdHRlbXB0X3JlbWVyZ2UpOwotCiBzdGF0aWMgaW50IF9fbWFrZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQogewotCXN0cnVjdCByZXF1ZXN0ICpyZXEsICpmcmVlcmVxID0gTlVMTDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCWludCBlbF9yZXQsIHJ3LCBucl9zZWN0b3JzLCBjdXJfbnJfc2VjdG9ycywgYmFycmllciwgZXJyLCBzeW5jOworCXVuc2lnbmVkIHNob3J0IHByaW87CiAJc2VjdG9yX3Qgc2VjdG9yOwogCiAJc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CiAJbnJfc2VjdG9ycyA9IGJpb19zZWN0b3JzKGJpbyk7CiAJY3VyX25yX3NlY3RvcnMgPSBiaW9fY3VyX3NlY3RvcnMoYmlvKTsKKwlwcmlvID0gYmlvX3ByaW8oYmlvKTsKIAogCXJ3ID0gYmlvX2RhdGFfZGlyKGJpbyk7CiAJc3luYyA9IGJpb19zeW5jKGJpbyk7CkBAIC0yNTg5LDE0ICsyNTU1LDkgQEAKIAkJZ290byBlbmRfaW87CiAJfQogCi1hZ2FpbjoKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCi0JaWYgKGVsdl9xdWV1ZV9lbXB0eShxKSkgewotCQlibGtfcGx1Z19kZXZpY2UocSk7Ci0JCWdvdG8gZ2V0X3JxOwotCX0KLQlpZiAoYmFycmllcikKKwlpZiAodW5saWtlbHkoYmFycmllcikgfHwgZWx2X3F1ZXVlX2VtcHR5KHEpKQogCQlnb3RvIGdldF9ycTsKIAogCWVsX3JldCA9IGVsdl9tZXJnZShxLCAmcmVxLCBiaW8pOwpAQCAtMjYxMCw2ICsyNTcxLDcgQEAKIAkJCXJlcS0+YmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKIAkJCXJlcS0+YmlvdGFpbCA9IGJpbzsKIAkJCXJlcS0+bnJfc2VjdG9ycyA9IHJlcS0+aGFyZF9ucl9zZWN0b3JzICs9IG5yX3NlY3RvcnM7CisJCQlyZXEtPmlvcHJpbyA9IGlvcHJpb19iZXN0KHJlcS0+aW9wcmlvLCBwcmlvKTsKIAkJCWRyaXZlX3N0YXRfYWNjdChyZXEsIG5yX3NlY3RvcnMsIDApOwogCQkJaWYgKCFhdHRlbXB0X2JhY2tfbWVyZ2UocSwgcmVxKSkKIAkJCQllbHZfbWVyZ2VkX3JlcXVlc3QocSwgcmVxKTsKQEAgLTI2MzQsNDUgKzI1OTYsMzAgQEAKIAkJCXJlcS0+aGFyZF9jdXJfc2VjdG9ycyA9IGN1cl9ucl9zZWN0b3JzOwogCQkJcmVxLT5zZWN0b3IgPSByZXEtPmhhcmRfc2VjdG9yID0gc2VjdG9yOwogCQkJcmVxLT5ucl9zZWN0b3JzID0gcmVxLT5oYXJkX25yX3NlY3RvcnMgKz0gbnJfc2VjdG9yczsKKwkJCXJlcS0+aW9wcmlvID0gaW9wcmlvX2Jlc3QocmVxLT5pb3ByaW8sIHByaW8pOwogCQkJZHJpdmVfc3RhdF9hY2N0KHJlcSwgbnJfc2VjdG9ycywgMCk7CiAJCQlpZiAoIWF0dGVtcHRfZnJvbnRfbWVyZ2UocSwgcmVxKSkKIAkJCQllbHZfbWVyZ2VkX3JlcXVlc3QocSwgcmVxKTsKIAkJCWdvdG8gb3V0OwogCi0JCS8qCi0JCSAqIGVsZXZhdG9yIHNheXMgZG9uJ3QvY2FuJ3QgbWVyZ2UuIGdldCBuZXcgcmVxdWVzdAotCQkgKi8KLQkJY2FzZSBFTEVWQVRPUl9OT19NRVJHRToKLQkJCWJyZWFrOwotCisJCS8qIEVMVl9OT19NRVJHRTogZWxldmF0b3Igc2F5cyBkb24ndC9jYW4ndCBtZXJnZS4gKi8KIAkJZGVmYXVsdDoKLQkJCXByaW50aygiZWxldmF0b3IgcmV0dXJuZWQgY3JhcCAoJWQpXG4iLCBlbF9yZXQpOwotCQkJQlVHKCk7CisJCQk7CiAJfQogCitnZXRfcnE6CisJLyoKKwkgKiBHcmFiIGEgZnJlZSByZXF1ZXN0LiBUaGlzIGlzIG1pZ2h0IHNsZWVwIGJ1dCBjYW4gbm90IGZhaWwuCisJICogUmV0dXJucyB3aXRoIHRoZSBxdWV1ZSB1bmxvY2tlZC4KKwkgKi8KKwlyZXEgPSBnZXRfcmVxdWVzdF93YWl0KHEsIHJ3LCBiaW8pOworCiAJLyoKLQkgKiBHcmFiIGEgZnJlZSByZXF1ZXN0IGZyb20gdGhlIGZyZWVsaXN0IC0gaWYgdGhhdCBpcyBlbXB0eSwgY2hlY2sKLQkgKiBpZiB3ZSBhcmUgZG9pbmcgcmVhZCBhaGVhZCBhbmQgYWJvcnQgaW5zdGVhZCBvZiBibG9ja2luZyBmb3IKLQkgKiBhIGZyZWUgc2xvdC4KKwkgKiBBZnRlciBkcm9wcGluZyB0aGUgbG9jayBhbmQgcG9zc2libHkgc2xlZXBpbmcgaGVyZSwgb3VyIHJlcXVlc3QKKwkgKiBtYXkgbm93IGJlIG1lcmdlYWJsZSBhZnRlciBpdCBoYWQgcHJvdmVuIHVubWVyZ2VhYmxlIChhYm92ZSkuCisJICogV2UgZG9uJ3Qgd29ycnkgYWJvdXQgdGhhdCBjYXNlIGZvciBlZmZpY2llbmN5LiBJdCB3b24ndCBoYXBwZW4KKwkgKiBvZnRlbiwgYW5kIHRoZSBlbGV2YXRvcnMgYXJlIGFibGUgdG8gaGFuZGxlIGl0LgogCSAqLwotZ2V0X3JxOgotCWlmIChmcmVlcmVxKSB7Ci0JCXJlcSA9IGZyZWVyZXE7Ci0JCWZyZWVyZXEgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKLQkJaWYgKChmcmVlcmVxID0gZ2V0X3JlcXVlc3QocSwgcncsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0JCQkvKgotCQkJICogUkVBREEgYml0IHNldAotCQkJICovCi0JCQllcnIgPSAtRVdPVUxEQkxPQ0s7Ci0JCQlpZiAoYmlvX3J3X2FoZWFkKGJpbykpCi0JCQkJZ290byBlbmRfaW87Ci0JCi0JCQlmcmVlcmVxID0gZ2V0X3JlcXVlc3Rfd2FpdChxLCBydyk7Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQl9CiAKIAlyZXEtPmZsYWdzIHw9IFJFUV9DTUQ7CiAKQEAgLTI2OTcsMTMgKzI2NDQsMTUgQEAKIAlyZXEtPmJ1ZmZlciA9IGJpb19kYXRhKGJpbyk7CS8qIHNlZSAtPmJ1ZmZlciBjb21tZW50IGFib3ZlICovCiAJcmVxLT53YWl0aW5nID0gTlVMTDsKIAlyZXEtPmJpbyA9IHJlcS0+YmlvdGFpbCA9IGJpbzsKKwlyZXEtPmlvcHJpbyA9IHByaW87CiAJcmVxLT5ycV9kaXNrID0gYmlvLT5iaV9iZGV2LT5iZF9kaXNrOwogCXJlcS0+c3RhcnRfdGltZSA9IGppZmZpZXM7CiAKKwlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOworCWlmIChlbHZfcXVldWVfZW1wdHkocSkpCisJCWJsa19wbHVnX2RldmljZShxKTsKIAlhZGRfcmVxdWVzdChxLCByZXEpOwogb3V0OgotCWlmIChmcmVlcmVxKQotCQlfX2Jsa19wdXRfcmVxdWVzdChxLCBmcmVlcmVxKTsKIAlpZiAoc3luYykKIAkJX19nZW5lcmljX3VucGx1Z19kZXZpY2UocSk7CiAKQEAgLTI3MjUsNyArMjY3NCw3IEBACiAJaWYgKGJkZXYgIT0gYmRldi0+YmRfY29udGFpbnMpIHsKIAkJc3RydWN0IGhkX3N0cnVjdCAqcCA9IGJkZXYtPmJkX3BhcnQ7CiAKLQkJc3dpdGNoIChiaW8tPmJpX3J3KSB7CisJCXN3aXRjaCAoYmlvX2RhdGFfZGlyKGJpbykpIHsKIAkJY2FzZSBSRUFEOgogCQkJcC0+cmVhZF9zZWN0b3JzICs9IGJpb19zZWN0b3JzKGJpbyk7CiAJCQlwLT5yZWFkcysrOwpAQCAtMjc0NCw2ICsyNjkzLDcgQEAKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHJlcXVldWVkID0gMDsKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJY2xlYXJfYml0KFFVRVVFX0ZMQUdfRFJBSU4sICZxLT5xdWV1ZV9mbGFncyk7CkBAIC0yNzUyLDkgKzI3MDIsMTMgQEAKIAkJcnEgPSBsaXN0X2VudHJ5X3JxKHEtPmRyYWluX2xpc3QubmV4dCk7CiAKIAkJbGlzdF9kZWxfaW5pdCgmcnEtPnF1ZXVlbGlzdCk7Ci0JCV9fZWx2X2FkZF9yZXF1ZXN0KHEsIHJxLCBFTEVWQVRPUl9JTlNFUlRfQkFDSywgMSk7CisJCWVsdl9yZXF1ZXVlX3JlcXVlc3QocSwgcnEpOworCQlyZXF1ZXVlZCsrOwogCX0KIAorCWlmIChyZXF1ZXVlZCkKKwkJcS0+cmVxdWVzdF9mbihxKTsKKwogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAogCXdha2VfdXAoJnJsLT53YWl0WzBdKTsKQEAgLTI5NTEsNyArMjkwNSw3IEBACiAKIAlCSU9fQlVHX09OKCFiaW8tPmJpX3NpemUpOwogCUJJT19CVUdfT04oIWJpby0+YmlfaW9fdmVjKTsKLQliaW8tPmJpX3J3ID0gcnc7CisJYmlvLT5iaV9ydyB8PSBydzsKIAlpZiAocncgJiBXUklURSkKIAkJbW9kX3BhZ2Vfc3RhdGUocGdwZ291dCwgY291bnQpOwogCWVsc2UKQEAgLTI5NzEsNyArMjkyNSw3IEBACiAKIEVYUE9SVF9TWU1CT0woc3VibWl0X2Jpbyk7CiAKLXZvaWQgYmxrX3JlY2FsY19ycV9zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdCAqcnEpCitzdGF0aWMgdm9pZCBibGtfcmVjYWxjX3JxX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgYmlvICpiaW8sICpwcmV2YmlvID0gTlVMTDsKIAlpbnQgbnJfcGh5c19zZWdzLCBucl9od19zZWdzOwpAQCAtMzAxMyw3ICsyOTY3LDcgQEAKIAlycS0+bnJfaHdfc2VnbWVudHMgPSBucl9od19zZWdzOwogfQogCi12b2lkIGJsa19yZWNhbGNfcnFfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBuc2VjdCkKK3N0YXRpYyB2b2lkIGJsa19yZWNhbGNfcnFfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBuc2VjdCkKIHsKIAlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7CiAJCXJxLT5oYXJkX3NlY3RvciArPSBuc2VjdDsKQEAgLTMzMDgsOCArMzI2MiwxMSBAQAogCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJdGFza19sb2NrKGN1cnJlbnQpOwogCWlvYyA9IGN1cnJlbnQtPmlvX2NvbnRleHQ7CiAJY3VycmVudC0+aW9fY29udGV4dCA9IE5VTEw7CisJaW9jLT50YXNrID0gTlVMTDsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAlpZiAoaW9jLT5haWMgJiYgaW9jLT5haWMtPmV4aXQpCkBAIC0zMzIyLDU1ICszMjc5LDUxIEBACiAKIC8qCiAgKiBJZiB0aGUgY3VycmVudCB0YXNrIGhhcyBubyBJTyBjb250ZXh0IHRoZW4gY3JlYXRlIG9uZSBhbmQgaW5pdGlhbGlzZSBpdC4KLSAqIElmIGl0IGRvZXMgaGF2ZSBhIGNvbnRleHQsIHRha2UgYSByZWYgb24gaXQuCisgKiBPdGhlcndpc2UsIHJldHVybiBpdHMgZXhpc3RpbmcgSU8gY29udGV4dC4KICAqCi0gKiBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRhc2sgd2hpY2ggc3VibWl0dGVkIHRoZSBJL08uCi0gKiBCdXQgd2VpcmQgdGhpbmdzIGhhcHBlbiwgc28gd2UgZGlzYWJsZSBsb2NhbCBpbnRlcnJ1cHRzIHRvIGVuc3VyZSBleGNsdXNpdmUKLSAqIGFjY2VzcyB0byAqY3VycmVudC4KKyAqIFRoaXMgcmV0dXJuZWQgSU8gY29udGV4dCBkb2Vzbid0IGhhdmUgYSBzcGVjaWZpY2FsbHkgZWxldmF0ZWQgcmVmY291bnQsCisgKiBidXQgc2luY2UgdGhlIGN1cnJlbnQgdGFzayBpdHNlbGYgaG9sZHMgYSByZWZlcmVuY2UsIHRoZSBjb250ZXh0IGNhbiBiZQorICogdXNlZCBpbiBnZW5lcmFsIGNvZGUsIHNvIGxvbmcgYXMgaXQgc3RheXMgd2l0aGluIGBjdXJyZW50YCBjb250ZXh0LgogICovCi1zdHJ1Y3QgaW9fY29udGV4dCAqZ2V0X2lvX2NvbnRleHQoaW50IGdmcF9mbGFncykKK3N0cnVjdCBpb19jb250ZXh0ICpjdXJyZW50X2lvX2NvbnRleHQoaW50IGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaW9fY29udGV4dCAqcmV0OwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXJldCA9IHRzay0+aW9fY29udGV4dDsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlpZiAobGlrZWx5KHJldCkpCisJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKGlvY29udGV4dF9jYWNoZXAsIGdmcF9mbGFncyk7CiAJaWYgKHJldCkgewogCQlhdG9taWNfc2V0KCZyZXQtPnJlZmNvdW50LCAxKTsKLQkJcmV0LT5waWQgPSB0c2stPnBpZDsKKwkJcmV0LT50YXNrID0gY3VycmVudDsKKwkJcmV0LT5zZXRfaW9wcmlvID0gTlVMTDsKIAkJcmV0LT5sYXN0X3dhaXRlZCA9IGppZmZpZXM7IC8qIGRvZXNuJ3QgbWF0dGVyLi4uICovCiAJCXJldC0+bnJfYmF0Y2hfcmVxdWVzdHMgPSAwOyAvKiBiZWNhdXNlIHRoaXMgaXMgMCAqLwogCQlyZXQtPmFpYyA9IE5VTEw7CiAJCXJldC0+Y2ljID0gTlVMTDsKLQkJc3Bpbl9sb2NrX2luaXQoJnJldC0+bG9jayk7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JCS8qCi0JCSAqIHZlcnkgdW5saWtlbHksIHNvbWVvbmUgcmFjZWQgd2l0aCB1cyBpbiBzZXR0aW5nIHVwIHRoZSB0YXNrCi0JCSAqIGlvIGNvbnRleHQuIGZyZWUgbmV3IGNvbnRleHQgYW5kIGp1c3QgZ3JhYiBhIHJlZmVyZW5jZS4KLQkJICovCi0JCWlmICghdHNrLT5pb19jb250ZXh0KQotCQkJdHNrLT5pb19jb250ZXh0ID0gcmV0OwotCQllbHNlIHsKLQkJCWttZW1fY2FjaGVfZnJlZShpb2NvbnRleHRfY2FjaGVwLCByZXQpOwotCQkJcmV0ID0gdHNrLT5pb19jb250ZXh0OwotCQl9Ci0KLW91dDoKLQkJYXRvbWljX2luYygmcmV0LT5yZWZjb3VudCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJdHNrLT5pb19jb250ZXh0ID0gcmV0OwogCX0KIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MKGN1cnJlbnRfaW9fY29udGV4dCk7CisKKy8qCisgKiBJZiB0aGUgY3VycmVudCB0YXNrIGhhcyBubyBJTyBjb250ZXh0IHRoZW4gY3JlYXRlIG9uZSBhbmQgaW5pdGlhbGlzZSBpdC4KKyAqIElmIGl0IGRvZXMgaGF2ZSBhIGNvbnRleHQsIHRha2UgYSByZWYgb24gaXQuCisgKgorICogVGhpcyBpcyBhbHdheXMgY2FsbGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0YXNrIHdoaWNoIHN1Ym1pdHRlZCB0aGUgSS9PLgorICovCitzdHJ1Y3QgaW9fY29udGV4dCAqZ2V0X2lvX2NvbnRleHQoaW50IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgaW9fY29udGV4dCAqcmV0OworCXJldCA9IGN1cnJlbnRfaW9fY29udGV4dChnZnBfZmxhZ3MpOworCWlmIChsaWtlbHkocmV0KSkKKwkJYXRvbWljX2luYygmcmV0LT5yZWZjb3VudCk7CisJcmV0dXJuIHJldDsKK30KIEVYUE9SVF9TWU1CT0woZ2V0X2lvX2NvbnRleHQpOwogCiB2b2lkIGNvcHlfaW9fY29udGV4dChzdHJ1Y3QgaW9fY29udGV4dCAqKnBkc3QsIHN0cnVjdCBpb19jb250ZXh0ICoqcHNyYykKQEAgLTM2MDEsNyArMzU1NCw3IEBACiAJLnN0b3JlCT0gcXVldWVfYXR0cl9zdG9yZSwKIH07CiAKLXN0cnVjdCBrb2JqX3R5cGUgcXVldWVfa3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBxdWV1ZV9rdHlwZSA9IHsKIAkuc3lzZnNfb3BzCT0gJnF1ZXVlX3N5c2ZzX29wcywKIAkuZGVmYXVsdF9hdHRycwk9IGRlZmF1bHRfYXR0cnMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wa3RjZHZkLmMgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwppbmRleCA3ZjNkNzhkLi43YjgzODM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYwpAQCAtMTI1MSw4ICsxMjUxLDcgQEAKIAkJCVZQUklOVEsoImtjZHJ3ZDogd2FrZSB1cFxuIik7CiAKIAkJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLwotCQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQotCQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCQkJdHJ5X3RvX2ZyZWV6ZSgpOwogCiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBrdCwgJnBkLT5jZHJ3LnBrdF9hY3RpdmVfbGlzdCwgbGlzdCkgewogCQkJCWlmICghcGt0LT5zbGVlcF90aW1lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zd2ltMy5jIGIvZHJpdmVycy9ibG9jay9zd2ltMy5jCmluZGV4IDViMDljZjEuLmU1Zjc0OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogc3RhdGljIGludCBzd2ltM19hZGRfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3dpbXMpOwogaW50IHN3aW0zX2luaXQodm9pZCk7CiAKLSNpZm5kZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZm5kZWYgQ09ORklHX1BNQUNfTUVESUFCQVkKICNkZWZpbmUgY2hlY2tfbWVkaWFfYmF5KHdoaWNoLCB3aGF0KQkxCiAjZW5kaWYKIApAQCAtMjk3LDkgKzI5NywxMSBAQAogCWludCBpOwogCWZvcihpPTA7aTxmbG9wcHlfY291bnQ7aSsrKQogCXsKKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQogCQlpZiAoZmxvcHB5X3N0YXRlc1tpXS5tZWRpYV9iYXkgJiYKIAkJCWNoZWNrX21lZGlhX2JheShmbG9wcHlfc3RhdGVzW2ldLm1lZGlhX2JheSwgTUJfRkQpKQogCQkJY29udGludWU7CisjZW5kaWYgLyogQ09ORklHX1BNQUNfTUVESUFCQVkgKi8KIAkJc3RhcnRfcmVxdWVzdCgmZmxvcHB5X3N0YXRlc1tpXSk7CiAJfQogCXN0aSgpOwpAQCAtODU2LDggKzg1OCwxMCBAQAogCWlmICgoY21kICYgMHg4MCkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQogCWlmIChmcy0+bWVkaWFfYmF5ICYmIGNoZWNrX21lZGlhX2JheShmcy0+bWVkaWFfYmF5LCBNQl9GRCkpCiAJCXJldHVybiAtRU5YSU87CisjZW5kaWYKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBGREVKRUNUOgpAQCAtODgxLDggKzg4NSwxMCBAQAogCWludCBuLCBlcnIgPSAwOwogCiAJaWYgKGZzLT5yZWZfY291bnQgPT0gMCkgeworI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCiAJCWlmIChmcy0+bWVkaWFfYmF5ICYmIGNoZWNrX21lZGlhX2JheShmcy0+bWVkaWFfYmF5LCBNQl9GRCkpCiAJCQlyZXR1cm4gLUVOWElPOworI2VuZGlmCiAJCW91dF84KCZzdy0+c2V0dXAsIFNfSUJNX0RSSVZFIHwgU19GQ0xLX0RJVjIpOwogCQlvdXRfOCgmc3ctPmNvbnRyb2xfYmljLCAweGZmKTsKIAkJb3V0XzgoJnN3LT5tb2RlLCAweDk1KTsKQEAgLTk2Nyw4ICs5NzMsMTAgQEAKIAlzdHJ1Y3Qgc3dpbTMgX19pb21lbSAqc3c7CiAJaW50IHJldCwgbjsKIAorI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCiAJaWYgKGZzLT5tZWRpYV9iYXkgJiYgY2hlY2tfbWVkaWFfYmF5KGZzLT5tZWRpYV9iYXksIE1CX0ZEKSkKIAkJcmV0dXJuIC1FTlhJTzsKKyNlbmRpZgogCiAJc3cgPSBmcy0+c3dpbTM7CiAJZ3JhYl9kcml2ZShmcywgcmV2YWxpZGF0aW5nLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3g4LmMgYi9kcml2ZXJzL2Jsb2NrL3N4OC5jCmluZGV4IDVlZDNhNjMuLjlkYjBhOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3g4LmMKKysrIGIvZHJpdmVycy9ibG9jay9zeDguYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTE1ODIsOSArMTU4Myw5IEBACiAJCWdvdG8gZXJyX291dDsKIAogI2lmIElGXzY0QklUX0RNQV9JU19QT1NTSUJMRSAvKiBncnJyci4uLiAqLwotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CiAJaWYgKCFyYykgewotCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpOworCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSyk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBjb25zaXN0ZW50IERNQSBtYXNrIGZhaWx1cmVcbiIsCiAJCQkJcGNpX25hbWUocGRldikpOwpAQCAtMTU5Myw3ICsxNTk0LDcgQEAKIAkJcGNpX2RhYyA9IDE7CiAJfSBlbHNlIHsKICNlbmRpZgotCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICIoJXMpOiBETUEgbWFzayBmYWlsdXJlXG4iLAogCQkJCXBjaV9uYW1lKHBkZXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCmluZGV4IGU0ODFjYzQuLmJkMmVjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC04OTUsMTEgKzg5NCw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZibHVlY2FyZF9ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIApAQCAtMTA4OSwxMyArMTA4MywyMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYmx1ZWNhcmRfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJsdWVDYXJkIiwgIkxTRTA0MSIsIDB4YmFmMTZmYmYsIDB4NjU3Y2MxNWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCVENGQ0FSRCIsICJMU0UxMzkiLCAweGUzOTg3NzY0LCAweDI1MjRiNTljKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV1NTIiwgIkxTRTAzOSIsIDB4MGEwNzM2ZWMsIDB4MjRlNmRmYWIpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBibHVlY2FyZF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYmx1ZWNhcmRfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiYmx1ZWNhcmRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBibHVlY2FyZF9hdHRhY2gsCisJLmV2ZW50CQk9IGJsdWVjYXJkX2V2ZW50LAogCS5kZXRhY2gJCT0gYmx1ZWNhcmRfZGV0YWNoLAorCS5pZF90YWJsZQk9IGJsdWVjYXJkX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfYmx1ZWNhcmRfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwppbmRleCBmNzFlNWM3Li5hZGYxNzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtNjk2LDExICs2OTUsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYnQzY19ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIApAQCAtOTM1LDEzICs5MjksMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGJ0M2NfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIjNDT00iLCAiQmx1ZXRvb3RoIFBDIENhcmQiLCAweGVmY2UwYTMxLCAweGQ0Y2U5YjAyKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgYnQzY19pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYnQzY19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJidDNjX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gYnQzY19hdHRhY2gsCisJLmV2ZW50CQk9IGJ0M2NfZXZlbnQsCiAJLmRldGFjaAkJPSBidDNjX2RldGFjaCwKKwkuaWRfdGFibGUJPSBidDNjX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfYnQzY19jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1YXJ0X2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwppbmRleCBhZDhkOTcyLi5lNGM1OWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtNjE1LDExICs2MTQsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmYnR1YXJ0X2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC04NTUsMTMgKzg0OSwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYnR1YXJ0X2lkc1tdID0geworCS8qIGRvbid0IHVzZSB0aGlzIGRyaXZlci4gVXNlIHNlcmlhbF9jcyArIGhjaV91YXJ0IGluc3RlYWQgKi8KKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgYnR1YXJ0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBidHVhcnRfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiYnR1YXJ0X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gYnR1YXJ0X2F0dGFjaCwKKwkuZXZlbnQJCT0gYnR1YXJ0X2V2ZW50LAogCS5kZXRhY2gJCT0gYnR1YXJ0X2RldGFjaCwKKwkuaWRfdGFibGUJPSBidHVhcnRfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9idHVhcnRfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYwppbmRleCBmZTk1NGU1Li5lMzk4NjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC01OTQsMTEgKzU5Myw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZkdGwxX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC04MDcsMTMgKzgwMSwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgZHRsMV9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTm9raWEgTW9iaWxlIFBob25lcyIsICJEVEwtMSIsIDB4ZTFiZmRkNjQsIDB4ZTE2ODQ4MGQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTb2NrZXQiLCAiQ0YiLCAweGIzOGJjYzJlLCAweDQ0ZWJmODYzKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgZHRsMV9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgZHRsMV9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJkdGwxX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZHRsMV9hdHRhY2gsCisJLmV2ZW50CQk9IGR0bDFfZXZlbnQsCiAJLmRldGFjaAkJPSBkdGwxX2RldGFjaCwKKwkuaWRfdGFibGUJPSBkdGwxX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfZHRsMV9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKaW5kZXggMzI1NjE5Mi4uZjliOTU2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAKIAlwb2xsX3dhaXQoZmlsZSwgJmhjaV92aGNpLT5yZWFkX3dhaXQsIHdhaXQpOwogIAotCWlmIChza2JfcXVldWVfbGVuKCZoY2lfdmhjaS0+cmVhZHEpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZoY2lfdmhjaS0+cmVhZHEpKQogCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCXJldHVybiBQT0xMT1VUIHwgUE9MTFdSTk9STTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vY20yMDYuYyBiL2RyaXZlcnMvY2Ryb20vY20yMDYuYwppbmRleCBkYTgwYjE0Li4wMWYwMzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL2NtMjA2LmMKKysrIGIvZHJpdmVycy9jZHJvbS9jbTIwNi5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIC8qIEZpcnN0LCB3ZSBkZWZpbmUgc29tZSBwb2xsaW5nIGZ1bmN0aW9ucy4gVGhlc2UgYXJlIGFjdHVhbGx5CiAgICBvbmx5IGJlaW5nIHVzZWQgaW4gdGhlIGluaXRpYWxpemF0aW9uLiAqLwogCi12b2lkIHNlbmRfY29tbWFuZF9wb2xsZWQoaW50IGNvbW1hbmQpCitzdGF0aWMgdm9pZCBzZW5kX2NvbW1hbmRfcG9sbGVkKGludCBjb21tYW5kKQogewogCWludCBsb29wID0gUE9MTE9PUDsKIAl3aGlsZSAoIShpbncocl9saW5lX3N0YXR1cykgJiBsc190cmFuc21pdHRlcl9idWZmZXJfZW1wdHkpCkBAIC0zMTgsNyArMzE4LDcgQEAKIAlvdXR3KGNvbW1hbmQsIHJfdWFydF90cmFuc21pdCk7CiB9CiAKLXVjaCByZWNlaXZlX2VjaG9fcG9sbGVkKHZvaWQpCitzdGF0aWMgdWNoIHJlY2VpdmVfZWNob19wb2xsZWQodm9pZCkKIHsKIAlpbnQgbG9vcCA9IFBPTExPT1A7CiAJd2hpbGUgKCEoaW53KHJfbGluZV9zdGF0dXMpICYgbHNfcmVjZWl2ZV9idWZmZXJfZnVsbCkgJiYgbG9vcCA+IDApIHsKQEAgLTMyOCwxMyArMzI4LDEzIEBACiAJcmV0dXJuICgodWNoKSBpbncocl91YXJ0X3JlY2VpdmUpKTsKIH0KIAotdWNoIHNlbmRfcmVjZWl2ZV9wb2xsZWQoaW50IGNvbW1hbmQpCitzdGF0aWMgdWNoIHNlbmRfcmVjZWl2ZV9wb2xsZWQoaW50IGNvbW1hbmQpCiB7CiAJc2VuZF9jb21tYW5kX3BvbGxlZChjb21tYW5kKTsKIAlyZXR1cm4gcmVjZWl2ZV9lY2hvX3BvbGxlZCgpOwogfQogCi1pbmxpbmUgdm9pZCBjbGVhcl91cih2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3VyKHZvaWQpCiB7CiAJaWYgKGNkLT51cl9yICE9IGNkLT51cl93KSB7CiAJCWRlYnVnKCgiRGVsZXRpbmcgYnl0ZXMgZnJvbSBmaWZvOiIpKTsKQEAgLTQzOSw3ICs0MzksNyBAQAogfQogCiAvKiB3ZSBoYXZlIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUgd2FpdCBxdWV1ZSBpbiB3aG8gKi8KLXZvaWQgY20yMDZfdGltZW91dCh1bnNpZ25lZCBsb25nIHdobykKK3N0YXRpYyB2b2lkIGNtMjA2X3RpbWVvdXQodW5zaWduZWQgbG9uZyB3aG8pCiB7CiAJY2QtPnRpbWVkX291dCA9IDE7CiAJZGVidWcoKCJUaW1pbmcgb3V0XG4iKSk7CkBAIC00NDgsNyArNDQ4LDcgQEAKIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgYSB0aW1lb3V0IG9jY3VycmVkLCAwIGlmIGFuIGludGVycnVwdAogICAgaGFwcGVuZWQgKi8KLWludCBzbGVlcF9vcl90aW1lb3V0KHdhaXRfcXVldWVfaGVhZF90ICogd2FpdCwgaW50IHRpbWVvdXQpCitzdGF0aWMgaW50IHNsZWVwX29yX3RpbWVvdXQod2FpdF9xdWV1ZV9oZWFkX3QgKiB3YWl0LCBpbnQgdGltZW91dCkKIHsKIAljZC0+dGltZWRfb3V0ID0gMDsKIAlpbml0X3RpbWVyKCZjZC0+dGltZXIpOwpAQCAtNDY1LDEzICs0NjUsNyBAQAogCQlyZXR1cm4gMDsKIH0KIAotdm9pZCBjbTIwNl9kZWxheShpbnQgbnJfamlmZmllcykKLXsKLQlERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh3YWl0KTsKLQlzbGVlcF9vcl90aW1lb3V0KCZ3YWl0LCBucl9qaWZmaWVzKTsKLX0KLQotdm9pZCBzZW5kX2NvbW1hbmQoaW50IGNvbW1hbmQpCitzdGF0aWMgdm9pZCBzZW5kX2NvbW1hbmQoaW50IGNvbW1hbmQpCiB7CiAJZGVidWcoKCJTZW5kaW5nIDB4JXhcbiIsIGNvbW1hbmQpKTsKIAlpZiAoIShpbncocl9saW5lX3N0YXR1cykgJiBsc190cmFuc21pdHRlcl9idWZmZXJfZW1wdHkpKSB7CkBAIC00OTAsNyArNDg0LDcgQEAKIAkJb3V0dyhjb21tYW5kLCByX3VhcnRfdHJhbnNtaXQpOwogfQogCi11Y2ggcmVjZWl2ZV9ieXRlKGludCB0aW1lb3V0KQorc3RhdGljIHVjaCByZWNlaXZlX2J5dGUoaW50IHRpbWVvdXQpCiB7CiAJdWNoIHJldDsKIAljbGkoKTsKQEAgLTUyMSwyMyArNTE1LDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW5saW5lIHVjaCByZWNlaXZlX2VjaG8odm9pZCkKK3N0YXRpYyBpbmxpbmUgdWNoIHJlY2VpdmVfZWNobyh2b2lkKQogewogCXJldHVybiByZWNlaXZlX2J5dGUoVUFSVF9USU1FT1VUKTsKIH0KIAotaW5saW5lIHVjaCBzZW5kX3JlY2VpdmUoaW50IGNvbW1hbmQpCitzdGF0aWMgaW5saW5lIHVjaCBzZW5kX3JlY2VpdmUoaW50IGNvbW1hbmQpCiB7CiAJc2VuZF9jb21tYW5kKGNvbW1hbmQpOwogCXJldHVybiByZWNlaXZlX2VjaG8oKTsKIH0KIAotaW5saW5lIHVjaCB3YWl0X2RzYih2b2lkKQorc3RhdGljIGlubGluZSB1Y2ggd2FpdF9kc2Iodm9pZCkKIHsKIAlyZXR1cm4gcmVjZWl2ZV9ieXRlKERTQl9USU1FT1VUKTsKIH0KIAotaW50IHR5cGVfMF9jb21tYW5kKGludCBjb21tYW5kLCBpbnQgZXhwZWN0X2RzYikKK3N0YXRpYyBpbnQgdHlwZV8wX2NvbW1hbmQoaW50IGNvbW1hbmQsIGludCBleHBlY3RfZHNiKQogewogCWludCBlOwogCWNsZWFyX3VyKCk7CkBAIC01NTIsNyArNTQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHR5cGVfMV9jb21tYW5kKGludCBjb21tYW5kLCBpbnQgYnl0ZXMsIHVjaCAqIHN0YXR1cykKK3N0YXRpYyBpbnQgdHlwZV8xX2NvbW1hbmQoaW50IGNvbW1hbmQsIGludCBieXRlcywgdWNoICogc3RhdHVzKQogewkJCQkvKiByZXR1cm5zIGluZm8gKi8KIAlpbnQgaTsKIAlpZiAodHlwZV8wX2NvbW1hbmQoY29tbWFuZCwgMCkpCkBAIC01NjQsNyArNTU4LDcgQEAKIAogLyogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGFkYXB0ZXIgY2FyZC4gV2UnZCBiZXR0ZXIgbm90IGRvIHRoaXMgdG9vCiAgKiBvZnRlbiwgYmVjYXVzZSBpdCB0ZW5kcyB0byBnZW5lcmF0ZSBgbG9zdCBpbnRlcnJ1cHRzLicgKi8KLXZvaWQgcmVzZXRfY20yNjAodm9pZCkKK3N0YXRpYyB2b2lkIHJlc2V0X2NtMjYwKHZvaWQpCiB7CiAJb3V0dyhkY19ub3JtYWwgfCBkY19pbml0aWFsaXplIHwgUkVBRF9BSEVBRCwgcl9kYXRhX2NvbnRyb2wpOwogCXVkZWxheSgxMCk7CQkvKiAzLjMgbXUgc2VjIG1pbmltdW0gKi8KQEAgLTU3Miw3ICs1NjYsNyBAQAogfQogCiAvKiBmc206IGZyYW1lLXNlYy1taW4gZnJvbSBsaW5lYXIgYWRkcmVzczsgb25lIG9mIG1hbnkgKi8KLXZvaWQgZnNtKGludCBsYmEsIHVjaCAqIGZzbSkKK3N0YXRpYyB2b2lkIGZzbShpbnQgbGJhLCB1Y2ggKiBmc20pCiB7CiAJZnNtWzBdID0gbGJhICUgNzU7CiAJbGJhIC89IDc1OwpAQCAtNTgxLDE3ICs1NzUsMTcgQEAKIAlmc21bMl0gPSBsYmEgLyA2MDsKIH0KIAotaW5saW5lIGludCBmc20ybGJhKHVjaCAqIGZzbSkKK3N0YXRpYyBpbmxpbmUgaW50IGZzbTJsYmEodWNoICogZnNtKQogewogCXJldHVybiBmc21bMF0gKyA3NSAqIChmc21bMV0gLSAyICsgNjAgKiBmc21bMl0pOwogfQogCi1pbmxpbmUgaW50IGZfc19tMmxiYSh1Y2ggZiwgdWNoIHMsIHVjaCBtKQorc3RhdGljIGlubGluZSBpbnQgZl9zX20ybGJhKHVjaCBmLCB1Y2ggcywgdWNoIG0pCiB7CiAJcmV0dXJuIGYgKyA3NSAqIChzIC0gMiArIDYwICogbSk7CiB9CiAKLWludCBzdGFydF9yZWFkKGludCBzdGFydCkKK3N0YXRpYyBpbnQgc3RhcnRfcmVhZChpbnQgc3RhcnQpCiB7CiAJdWNoIHJlYWRfc2VjdG9yWzRdID0geyBjX3JlYWRfZGF0YSwgfTsKIAlpbnQgaSwgZTsKQEAgLTYxMyw3ICs2MDcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc3RvcF9yZWFkKHZvaWQpCitzdGF0aWMgaW50IHN0b3BfcmVhZCh2b2lkKQogewogCWludCBlOwogCXR5cGVfMF9jb21tYW5kKGNfc3RvcCwgMCk7CkBAIC02MzAsNyArNjI0LDcgQEAKICAgIHJvdXRpbmUgdGFrZXMgY2FyZSBvZiB0aGlzLiBTZXQgYSBmbGFnIGBiYWNrZ3JvdW5kJyBpbiB0aGUgY2QKICAgIHN0cnVjdCB0byBpbmRpY2F0ZSB0aGUgcHJvY2Vzcy4gKi8KIAotaW50IHJlYWRfYmFja2dyb3VuZChpbnQgc3RhcnQsIGludCByZWFkaW5nKQorc3RhdGljIGludCByZWFkX2JhY2tncm91bmQoaW50IHN0YXJ0LCBpbnQgcmVhZGluZykKIHsKIAlpZiAoY2QtPmJhY2tncm91bmQpCiAJCXJldHVybiAtMTsJLyogY2FuJ3QgZG8gdHdpY2UgKi8KQEAgLTY1OCw3ICs2NTIsNyBAQAogCiAKICNkZWZpbmUgTUFYX1RSSUVTIDEwMAotaW50IHJlYWRfc2VjdG9yKGludCBzdGFydCkKK3N0YXRpYyBpbnQgcmVhZF9zZWN0b3IoaW50IHN0YXJ0KQogewogCWludCB0cmllcyA9IDA7CiAJaWYgKGNkLT5iYWNrZ3JvdW5kKSB7CkBAIC03NTMsNyArNzQ3LDcgQEAKIC8qIFRoaXMgY29tbWFuZCBjbGVhcnMgdGhlIGRzYl9wb3NzaWJsZV9tZWRpYV9jaGFuZ2UgZmxhZywgc28gd2UgbXVzdCAKICAqIHJldGFpbiBpdC4KICAqLwotdm9pZCBnZXRfZHJpdmVfc3RhdHVzKHZvaWQpCitzdGF0aWMgdm9pZCBnZXRfZHJpdmVfc3RhdHVzKHZvaWQpCiB7CiAJdWNoIHN0YXR1c1syXTsKIAl0eXBlXzFfY29tbWFuZChjX2RyaXZlX3N0YXR1cywgMiwgc3RhdHVzKTsJLyogdGhpcyBtaWdodCBiZSBkb25lIGZhc3RlciAqLwpAQCAtNzY0LDcgKzc1OCw3IEBACiAJCQkgIGRzYl9kcml2ZV9ub3RfcmVhZHkgfCBkc2JfdHJheV9ub3RfY2xvc2VkKSk7CiB9CiAKLXZvaWQgZ2V0X2Rpc2Nfc3RhdHVzKHZvaWQpCitzdGF0aWMgdm9pZCBnZXRfZGlzY19zdGF0dXModm9pZCkKIHsKIAlpZiAodHlwZV8xX2NvbW1hbmQoY19kaXNjX3N0YXR1cywgNywgY2QtPmRpc2Nfc3RhdHVzKSkgewogCQlkZWJ1ZygoImdldF9kaXNjX3N0YXR1czogZXJyb3JcbiIpKTsKQEAgLTgwMSw3ICs3OTUsNyBAQAogCiAvKiBFbXB0eSBidWZmZXIgZW1wdGllcyAkc2VjdG9ycyQgc2VjdG9ycyBvZiB0aGUgYWRhcHRlciBjYXJkIGJ1ZmZlciwKICAqIGFuZCB0aGVuIHJlYWRzIGEgc2VjdG9yIGluIGtlcm5lbCBtZW1vcnkuICAqLwotdm9pZCBlbXB0eV9idWZmZXIoaW50IHNlY3RvcnMpCitzdGF0aWMgdm9pZCBlbXB0eV9idWZmZXIoaW50IHNlY3RvcnMpCiB7CiAJd2hpbGUgKHNlY3RvcnMgPj0gMCkgewogCQl0cmFuc3BvcnRfZGF0YShyX2ZpZm9fb3V0cHV0X2J1ZmZlciwKQEAgLTgxOSw3ICs4MTMsNyBAQAogLyogdHJ5X2FkYXB0ZXIuIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgcmVxdWVzdGVkIHNlY3RvciBpcwogICAgaW4gYWRhcHRlciBtZW1vcnksIG9yIHdpbGwgYXBwZWFyIHRoZXJlIHNvb24uIFJldHVybnMgMCB1cG9uCiAgICBzdWNjZXNzICovCi1pbnQgdHJ5X2FkYXB0ZXIoaW50IHNlY3RvcikKK3N0YXRpYyBpbnQgdHJ5X2FkYXB0ZXIoaW50IHNlY3RvcikKIHsKIAlpZiAoY2QtPmFkYXB0ZXJfZmlyc3QgPD0gc2VjdG9yICYmIHNlY3RvciA8IGNkLT5hZGFwdGVyX2xhc3QpIHsKIAkJLyogc2VjdG9yIGlzIGluIGFkYXB0ZXIgbWVtb3J5ICovCkBAIC05MTAsNyArOTA0LDcgQEAKICovCiAKIC8qIHNlZWsgc2Vla3MgdG8gYWRkcmVzcyBsYmEuIEl0IGRvZXMgd2FpdCB0byBhcnJpdmUgdGhlcmUuICovCi12b2lkIHNlZWsoaW50IGxiYSkKK3N0YXRpYyB2b2lkIHNlZWsoaW50IGxiYSkKIHsKIAlpbnQgaTsKIAl1Y2ggc2Vla19jb21tYW5kWzRdID0geyBjX3NlZWssIH07CkBAIC05MjYsNyArOTIwLDcgQEAKIAlyZXR1cm4gKGJjZCA+PiA0KSAqIDEwICsgKGJjZCAmIDB4Zik7CiB9CiAKLWlubGluZSB1Y2ggbm9ybWFsaXplX3RyYWNrKHVjaCB0cmFjaykKK3N0YXRpYyBpbmxpbmUgdWNoIG5vcm1hbGl6ZV90cmFjayh1Y2ggdHJhY2spCiB7CiAJaWYgKHRyYWNrIDwgMSkKIAkJcmV0dXJuIDE7CkBAIC05MzksNyArOTMzLDcgQEAKICAqIHRyYWNrcyBzZWVuIGluIHRoZSBwcm9jZXNzLiBJbnB1dCAkdHJhY2skIG11c3QgYmUgYmV0d2VlbiAxIGFuZAogICogIy1vZi10cmFja3MrMS4gIE5vdGUgdGhhdCB0aGUgc3RhcnQgb2YgdGhlIGRpc2MgbXVzdCBiZSBpbiB0b2NbMV0uZnNtLiAKICAqLwotaW50IGdldF90b2NfbGJhKHVjaCB0cmFjaykKK3N0YXRpYyBpbnQgZ2V0X3RvY19sYmEodWNoIHRyYWNrKQogewogCWludCBtYXggPSA3NCAqIDYwICogNzUgLSAxNTAsIG1pbiA9IGZzbTJsYmEoY2QtPnRvY1sxXS5mc20pOwogCWludCBpLCBsYmEsIGwsIG9sZF9sYmEgPSAwOwpAQCAtOTkxLDcgKzk4NSw3IEBACiAJcmV0dXJuIGxiYTsKIH0KIAotdm9pZCB1cGRhdGVfdG9jX2VudHJ5KHVjaCB0cmFjaykKK3N0YXRpYyB2b2lkIHVwZGF0ZV90b2NfZW50cnkodWNoIHRyYWNrKQogewogCXRyYWNrID0gbm9ybWFsaXplX3RyYWNrKHRyYWNrKTsKIAlpZiAoIWNkLT50b2NbdHJhY2tdLnRyYWNrKQpAQCAtOTk5LDcgKzk5Myw3IEBACiB9CiAKIC8qIHJldHVybiAwIHVwb24gc3VjY2VzcyAqLwotaW50IHJlYWRfdG9jX2hlYWRlcihzdHJ1Y3QgY2Ryb21fdG9jaGRyICpocCkKK3N0YXRpYyBpbnQgcmVhZF90b2NfaGVhZGVyKHN0cnVjdCBjZHJvbV90b2NoZHIgKmhwKQogewogCWlmICghRklSU1RfVFJBQ0spCiAJCWdldF9kaXNjX3N0YXR1cygpOwpAQCAtMTAxNiw3ICsxMDEwLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXZvaWQgcGxheV9mcm9tX3RvX21zZihzdHJ1Y3QgY2Ryb21fbXNmICptc2ZwKQorc3RhdGljIHZvaWQgcGxheV9mcm9tX3RvX21zZihzdHJ1Y3QgY2Ryb21fbXNmICptc2ZwKQogewogCXVjaCBwbGF5X2NvbW1hbmRbXSA9IHsgY19wbGF5LAogCQltc2ZwLT5jZG1zZl9mcmFtZTAsIG1zZnAtPmNkbXNmX3NlYzAsIG1zZnAtPmNkbXNmX21pbjAsCkBAIC0xMDMyLDcgKzEwMjYsNyBAQAogCWNkLT5kc2IgPSB3YWl0X2RzYigpOwogfQogCi12b2lkIHBsYXlfZnJvbV90b190cmFjayhpbnQgZnJvbSwgaW50IHRvKQorc3RhdGljIHZvaWQgcGxheV9mcm9tX3RvX3RyYWNrKGludCBmcm9tLCBpbnQgdG8pCiB7CiAJdWNoIHBsYXlfY29tbWFuZFs4XSA9IHsgY19wbGF5LCB9OwogCWludCBpOwpAQCAtMTA1OSw3ICsxMDUzLDcgQEAKIAljZC0+ZHNiID0gd2FpdF9kc2IoKTsKIH0KIAotaW50IGdldF9jdXJyZW50X3Eoc3RydWN0IGNkcm9tX3N1YmNobmwgKnFwKQorc3RhdGljIGludCBnZXRfY3VycmVudF9xKHN0cnVjdCBjZHJvbV9zdWJjaG5sICpxcCkKIHsKIAlpbnQgaTsKIAl1Y2ggKnEgPSBjZC0+cTsKQEAgLTEwOTMsMTQgKzEwODcsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpbnZhbGlkYXRlX3RvYyh2b2lkKQorc3RhdGljIHZvaWQgaW52YWxpZGF0ZV90b2Modm9pZCkKIHsKIAltZW1zZXQoY2QtPnRvYywgMCwgc2l6ZW9mKGNkLT50b2MpKTsKIAltZW1zZXQoY2QtPmRpc2Nfc3RhdHVzLCAwLCBzaXplb2YoY2QtPmRpc2Nfc3RhdHVzKSk7CiB9CiAKIC8qIGNkcm9tLmMgZ3VhcmFudGVlcyB0aGF0IGNkdGVfZm9ybWF0ID09IENEUk9NX01TRiAqLwotdm9pZCBnZXRfdG9jX2VudHJ5KHN0cnVjdCBjZHJvbV90b2NlbnRyeSAqZXApCitzdGF0aWMgdm9pZCBnZXRfdG9jX2VudHJ5KHN0cnVjdCBjZHJvbV90b2NlbnRyeSAqZXApCiB7CiAJdWNoIHRyYWNrID0gbm9ybWFsaXplX3RyYWNrKGVwLT5jZHRlX3RyYWNrKTsKIAl1cGRhdGVfdG9jX2VudHJ5KHRyYWNrKTsKQEAgLTExMTcsOCArMTExMSw4IEBACiAgKiB1cG9uIHN1Y2Nlc3MuIE1lbW9yeSBjaGVja2luZyBoYXMgYmVlbiBkb25lIGJ5IGNkcm9tX2lvY3RsKCksIHRoZQogICogY2FsbGluZyBmdW5jdGlvbiwgYXMgd2VsbCBhcyBMQkEvTVNGIHNhbml0aXphdGlvbi4KICovCi1pbnQgY20yMDZfYXVkaW9faW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHVuc2lnbmVkIGludCBjbWQsCi0JCSAgICAgIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgY20yMDZfYXVkaW9faW9jdGwoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgIHZvaWQgKmFyZykKIHsKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQ0RST01SRUFEVE9DSERSOgpAQCAtMTE4OSw3ICsxMTgzLDcgQEAKIAl9CiB9CiAKLWludCBjbTIwNl9tZWRpYV9jaGFuZ2VkKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgZGlzY19ucikKK3N0YXRpYyBpbnQgY20yMDZfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgaW50IGRpc2NfbnIpCiB7CiAJaWYgKGNkICE9IE5VTEwpIHsKIAkJaW50IHI7CkBAIC0xMjA0LDE2ICsxMTk4LDkgQEAKIC8qIFRoZSBuZXcgZ2VuZXJpYyBjZHJvbSBzdXBwb3J0LiBSb3V0aW5lcyBzaG91bGQgYmUgY29uY2lzZSwgbW9zdCBvZgogICAgdGhlIGxvZ2ljIHNob3VsZCBiZSBpbiBjZHJvbS5jICovCiAKLS8qIHJldHVybnMgbnVtYmVyIG9mIHRpbWVzIGRldmljZSBpcyBpbiB1c2UgKi8KLWludCBjbTIwNl9vcGVuX2ZpbGVzKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpKQotewotCWlmIChjZCkKLQkJcmV0dXJuIGNkLT5vcGVuZmlsZXM7Ci0JcmV0dXJuIC0xOwotfQogCiAvKiBjb250cm9scyB0cmF5IG1vdmVtZW50ICovCi1pbnQgY20yMDZfdHJheV9tb3ZlKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgcG9zaXRpb24pCitzdGF0aWMgaW50IGNtMjA2X3RyYXlfbW92ZShzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSwgaW50IHBvc2l0aW9uKQogewogCWlmIChwb3NpdGlvbikgewkJLyogMTogZWplY3QgKi8KIAkJdHlwZV8wX2NvbW1hbmQoY19vcGVuX3RyYXksIDEpOwpAQCAtMTIyNCw3ICsxMjExLDcgQEAKIH0KIAogLyogZ2l2ZXMgY3VycmVudCBzdGF0ZSBvZiB0aGUgZHJpdmUgKi8KLWludCBjbTIwNl9kcml2ZV9zdGF0dXMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzbG90X25yKQorc3RhdGljIGludCBjbTIwNl9kcml2ZV9zdGF0dXMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzbG90X25yKQogewogCWdldF9kcml2ZV9zdGF0dXMoKTsKIAlpZiAoY2QtPmRzYiAmIGRzYl90cmF5X25vdF9jbG9zZWQpCkBAIC0xMjM3LDcgKzEyMjQsNyBAQAogfQogCiAvKiBsb2NrcyBvciB1bmxvY2tzIGRvb3IgbG9jaz09MTogbG9jazsgcmV0dXJuIDAgdXBvbiBzdWNjZXNzICovCi1pbnQgY20yMDZfbG9ja19kb29yKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgbG9jaykKK3N0YXRpYyBpbnQgY20yMDZfbG9ja19kb29yKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgbG9jaykKIHsKIAl1Y2ggY29tbWFuZCA9IChsb2NrKSA/IGNfbG9ja190cmF5IDogY191bmxvY2tfdHJheTsKIAl0eXBlXzBfY29tbWFuZChjb21tYW5kLCAxKTsJLyogd2FpdCBhbmQgZ2V0IGRzYiAqLwpAQCAtMTI0OCw4ICsxMjM1LDggQEAKIC8qIEFsdGhvdWdoIGEgc2Vzc2lvbiBzdGFydCBzaG91bGQgYmUgaW4gTEJBIGZvcm1hdCwgd2UgcmV0dXJuIGl0IGluIAogICAgTVNGIGZvcm1hdCBiZWNhdXNlIGl0IGlzIHNsaWdodGx5IGVhc2llciwgYW5kIHRoZSBuZXcgZ2VuZXJpYyBpb2N0bAogICAgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIG5lY2Vzc2FyeSBjb252ZXJzaW9uLiAqLwotaW50IGNtMjA2X2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksCi0JCQkgICBzdHJ1Y3QgY2Ryb21fbXVsdGlzZXNzaW9uICptc3NwKQorc3RhdGljIGludCBjbTIwNl9nZXRfbGFzdF9zZXNzaW9uKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLAorCQkJCSAgc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiAqbXNzcCkKIHsKIAlpZiAoIUZJUlNUX1RSQUNLKQogCQlnZXRfZGlzY19zdGF0dXMoKTsKQEAgLTEyNjgsNyArMTI1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjbTIwNl9nZXRfdXBjKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBzdHJ1Y3QgY2Ryb21fbWNuICptY24pCitzdGF0aWMgaW50IGNtMjA2X2dldF91cGMoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIHN0cnVjdCBjZHJvbV9tY24gKm1jbikKIHsKIAl1Y2ggdXBjWzEwXTsKIAljaGFyICpyZXQgPSBtY24tPm1lZGl1bV9jYXRhbG9nX251bWJlcjsKQEAgLTEyODcsNyArMTI3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjbTIwNl9yZXNldChzdHJ1Y3QgY2Ryb21fZGV2aWNlX2luZm8gKmNkaSkKK3N0YXRpYyBpbnQgY20yMDZfcmVzZXQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGkpCiB7CiAJc3RvcF9yZWFkKCk7CiAJcmVzZXRfY20yNjAoKTsKQEAgLTEzMDAsNyArMTI4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjbTIwNl9zZWxlY3Rfc3BlZWQoc3RydWN0IGNkcm9tX2RldmljZV9pbmZvICpjZGksIGludCBzcGVlZCkKK3N0YXRpYyBpbnQgY20yMDZfc2VsZWN0X3NwZWVkKHN0cnVjdCBjZHJvbV9kZXZpY2VfaW5mbyAqY2RpLCBpbnQgc3BlZWQpCiB7CiAJaW50IHI7CiAJc3dpdGNoIChzcGVlZCkgewpAQCAtMTM5Miw3ICsxMzc5LDcgQEAKICAgIHJlcXVlc3RfcmVnaW9uLCAxNSBiaXRzIG9mIG9uZSBwb3J0IGFuZCA2IG9mIGFub3RoZXIgbWFrZSB0aGluZ3MKICAgIGxpa2VseSBlbm91Z2ggdG8gYWNjZXB0IHRoZSByZWdpb24gb24gdGhlIGZpcnN0IGhpdC4uLgogICovCi1pbnQgX19pbml0IHByb2JlX2Jhc2VfcG9ydChpbnQgYmFzZSkKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2Jhc2VfcG9ydChpbnQgYmFzZSkKIHsKIAlpbnQgYiA9IDB4MzAwLCBlID0gMHgzNzA7CS8qIHRoaXMgaXMgdGhlIHJhbmdlIG9mIHN0YXJ0IGFkZHJlc3NlcyAqLwogCXZvbGF0aWxlIGludCBmb29sLCBpOwpAQCAtMTQxNiw3ICsxNDAzLDcgQEAKIAogI2lmICFkZWZpbmVkKE1PRFVMRSkgfHwgZGVmaW5lZChBVVRPX1BST0JFX01PRFVMRSkKIC8qIFByb2JlIGZvciBpcnEjIG5yLiBJZiBucj09MCwgcHJvYmUgZm9yIGFsbCBwb3NzaWJsZSBpcnEncy4gKi8KLWludCBfX2luaXQgcHJvYmVfaXJxKGludCBucikKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX2lycShpbnQgbnIpCiB7CiAJaW50IGlycXMsIGlycTsKIAlvdXR3KGRjX25vcm1hbCB8IFJFQURfQUhFQUQsIHJfZGF0YV9jb250cm9sKTsJLyogZGlzYWJsZSBpcnEtZ2VuZXJhdGlvbiAqLwpAQCAtMTU1OCw3ICsxNTQ1LDcgQEAKIAl9CiB9CiAKLWludCBfX2NtMjA2X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19jbTIwNl9pbml0KHZvaWQpCiB7CiAJcGFyc2Vfb3B0aW9ucygpOwogI2lmICFkZWZpbmVkKEFVVE9fUFJPQkVfTU9EVUxFKQpAQCAtMTU2Nyw3ICsxNTU0LDcgQEAKIAlyZXR1cm4gY20yMDZfaW5pdCgpOwogfQogCi12b2lkIF9fZXhpdCBjbTIwNl9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgY20yMDZfZXhpdCh2b2lkKQogewogCWRlbF9nZW5kaXNrKGNtMjA2X2dlbmRpc2spOwogCXB1dF9kaXNrKGNtMjA2X2dlbmRpc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9zb255Y2Q1MzUuYyBiL2RyaXZlcnMvY2Ryb20vc29ueWNkNTM1LmMKaW5kZXggZjRiZTdiZi4uOWYyMmU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jZHJvbS9zb255Y2Q1MzUuYworKysgYi9kcml2ZXJzL2Nkcm9tL3NvbnljZDUzNS5jCkBAIC0xNjA1LDggKzE2MDUsNyBAQAogCXB1dF9kaXNrKGNkdV9kaXNrKTsKIG91dDY6CiAJZm9yIChpID0gMDsgaSA8IHNvbnlfYnVmZmVyX3NlY3RvcnM7IGkrKykKLQkJaWYgKHNvbnlfYnVmZmVyW2ldKSAKLQkJCWtmcmVlKHNvbnlfYnVmZmVyW2ldKTsKKwkJa2ZyZWUoc29ueV9idWZmZXJbaV0pOwogb3V0NToKIAlrZnJlZShzb255X2J1ZmZlcik7CiBvdXQ0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCA3Y2NmODcxLi40M2QwY2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtOTQwLDggKzk0MCw4IEBACiAJICBPbmNlIGJvdW5kLCBJL08gYWdhaW5zdCAvZGV2L3Jhdy9yYXdOIHVzZXMgZWZmaWNpZW50IHplcm8tY29weSBJL08uIAogCSAgU2VlIHRoZSByYXcoOCkgbWFucGFnZSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICAgICAgICAgVGhlIHJhdyBkcml2ZXIgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgZnJvbSAyLjcKLSAgICAgICAgICBrZXJuZWxzLiAgQXBwbGljYXRpb25zIHNob3VsZCBzaW1wbHkgb3BlbiB0aGUgZGV2aWNlIChlZyAvZGV2L2hkYTEpCisgICAgICAgICAgVGhlIHJhdyBkcml2ZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uCisgICAgICAgICAgQXBwbGljYXRpb25zIHNob3VsZCBzaW1wbHkgb3BlbiB0aGUgZGV2aWNlIChlZyAvZGV2L2hkYTEpCiAgICAgICAgICAgd2l0aCB0aGUgT19ESVJFQ1QgZmxhZy4KIAogY29uZmlnIEhQRVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCAxYWZmODE5Li4wOGY2OTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC00MCw3ICs0MCw3IEBACiBvYmotJChDT05GSUdfQU1JR0FfQlVJTFRJTl9TRVJJQUwpICs9IGFtaXNlcmlhbC5vCiBvYmotJChDT05GSUdfU1gpCQkrPSBzeC5vIGdlbmVyaWNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19SSU8pCQkrPSByaW8vIGdlbmVyaWNfc2VyaWFsLm8KLW9iai0kKENPTkZJR19IVkNfQ09OU09MRSkJKz0gaHZjX2NvbnNvbGUubyBodnNpLm8KK29iai0kKENPTkZJR19IVkNfQ09OU09MRSkJKz0gaHZjX2NvbnNvbGUubyBodmNfdmlvLm8gaHZzaS5vCiBvYmotJChDT05GSUdfUkFXX0RSSVZFUikJKz0gcmF3Lm8KIG9iai0kKENPTkZJR19TR0lfU05TQykJCSs9IHNuc2MubyBzbnNjX2V2ZW50Lm8KIG9iai0kKENPTkZJR19NTVRJTUVSKQkJKz0gbW10aW1lci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwppbmRleCAxNDA3OTQ1Li41OWY1ODlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKQEAgLTY4Niw2ICs2ODYsMTUgQEAKIAkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKIAkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKIAl9LAorCS8qIFNJUyA3NjAgKi8KKwl7CisJLmNsYXNzCQk9IChQQ0lfQ0xBU1NfQlJJREdFX0hPU1QgPDwgOCksCisJLmNsYXNzX21hc2sJPSB+MCwKKwkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfU0ksCisJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX1NJXzc2MCwKKwkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKKwkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jIGIvZHJpdmVycy9jaGFyL2FtaXNlcmlhbC5jCmluZGV4IDc3N2JjNDkuLjJhMzY1NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hbWlzZXJpYWwuYworKysgYi9kcml2ZXJzL2NoYXIvYW1pc2VyaWFsLmMKQEAgLTE5NzMsMTAgKzE5NzMsNiBAQAogfQogCiAKLWludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSk7Ci12b2lkIHVucmVnaXN0ZXJfc2VyaWFsKGludCBsaW5lKTsKLQotCiBzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIHNlcmlhbF9vcHMgPSB7CiAJLm9wZW4gPSByc19vcGVuLAogCS5jbG9zZSA9IHJzX2Nsb3NlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FwcGxpY29tLmMgYi9kcml2ZXJzL2NoYXIvYXBwbGljb20uYwppbmRleCA2YmYyZTI3Li4xMWY5ZWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYXBwbGljb20uYworKysgYi9kcml2ZXJzL2NoYXIvYXBwbGljb20uYwpAQCAtNTk5LDcgKzU5OSw3IEBACiAKICNpZmRlZiBERUJVRwogCQlpZiAobG9vcGNvdW50KysgPiAyKSB7Ci0JCQlwcmludGsoIkxvb3BpbmcgaW4gYWNfcmVhZC4gbG9vcGNvdW50ICVkXG4iLCBsb29wY291bnQpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkxvb3BpbmcgaW4gYWNfcmVhZC4gbG9vcGNvdW50ICVkXG4iLCBsb29wY291bnQpOwogCQl9CiAjZW5kaWYKIAl9IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2RybS9LY29uZmlnCmluZGV4IGQ5YTAyOTkuLjEyMzQxN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvZHJtL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAjCiBjb25maWcgRFJNCiAJdHJpc3RhdGUgIkRpcmVjdCBSZW5kZXJpbmcgTWFuYWdlciAoWEZyZWU4NiA0LjEuMCBhbmQgaGlnaGVyIERSSSBzdXBwb3J0KSIKLQlkZXBlbmRzIG9uIEFHUCB8fCBBR1A9bgorCWRlcGVuZHMgb24gKEFHUCB8fCBBR1A9bikgJiYgUENJCiAJaGVscAogCSAgS2VybmVsLWxldmVsIHN1cHBvcnQgZm9yIHRoZSBEaXJlY3QgUmVuZGVyaW5nIEluZnJhc3RydWN0dXJlIChEUkkpCiAJICBpbnRyb2R1Y2VkIGluIFhGcmVlODYgNC4wLiBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IG5lZWQgdG8gc2VsZWN0CkBAIC05NiwzICs5NiwxMCBAQAogICAgICAgICAgIGNoaXBzZXQuIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaXMuIEFHUAogICAgICAgICAgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZHJpdmVyIHRvIHdvcmsuCiAKK2NvbmZpZyBEUk1fVklBCisJdHJpc3RhdGUgIlZpYSB1bmljaHJvbWUgdmlkZW8gY2FyZHMiCisJZGVwZW5kcyBvbiBEUk0KKwloZWxwCisJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBWaWEgdW5pY2hyb21lIG9yIGNvbXBhdGlibGUgdmlkZW8KKwkgIGNoaXBzZXQuIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2aWEuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvZHJtL01ha2VmaWxlCmluZGV4IDIzYWIyNjMuLmRkZDk0MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL2RybS9NYWtlZmlsZQpAQCAtMTgsNiArMTgsMTUgQEAKIHJhZGVvbi1vYmpzIDo9IHJhZGVvbl9kcnYubyByYWRlb25fY3AubyByYWRlb25fc3RhdGUubyByYWRlb25fbWVtLm8gcmFkZW9uX2lycS5vCiBmZmItb2JqcyAgICA6PSBmZmJfZHJ2Lm8gZmZiX2NvbnRleHQubwogc2lzLW9ianMgICAgOj0gc2lzX2Rydi5vIHNpc19kcy5vIHNpc19tbS5vCit2aWEtb2JqcyAgICA6PSB2aWFfaXJxLm8gdmlhX2Rydi5vIHZpYV9kcy5vIHZpYV9tYXAubyB2aWFfbW0ubyB2aWFfZG1hLm8gdmlhX3ZlcmlmaWVyLm8gdmlhX3ZpZGVvLm8KKworaWZlcSAoJChDT05GSUdfQ09NUEFUKSx5KQorZHJtLW9ianMgICAgKz0gZHJtX2lvYzMyLm8KK3JhZGVvbi1vYmpzICs9IHJhZGVvbl9pb2MzMi5vCittZ2Etb2JqcyAgICArPSBtZ2FfaW9jMzIubworcjEyOC1vYmpzICAgKz0gcjEyOF9pb2MzMi5vCitpOTE1LW9ianMgICArPSBpOTE1X2lvYzMyLm8KK2VuZGlmCiAKIG9iai0kKENPTkZJR19EUk0pCSs9IGRybS5vCiBvYmotJChDT05GSUdfRFJNX0dBTU1BKSArPSBnYW1tYS5vCkBAIC0zMCw0ICszOSw1IEBACiBvYmotJChDT05GSUdfRFJNX0k5MTUpICArPSBpOTE1Lm8KIG9iai0kKENPTkZJR19EUk1fRkZCKSAgICs9IGZmYi5vCiBvYmotJChDT05GSUdfRFJNX1NJUykgICArPSBzaXMubworb2JqLSQoQ09ORklHX0RSTV9WSUEpCSs9dmlhLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jIGIvZHJpdmVycy9jaGFyL2RybS9hdGlfcGNpZ2FydC5jCmluZGV4IGZkY2ExODcuLjBhZWM1ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vYXRpX3BjaWdhcnQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2F0aV9wY2lnYXJ0LmMKQEAgLTUyLDcgKzUyLDcgQEAKICMgZGVmaW5lIEFUSV9NQVhfUENJR0FSVF9QQUdFUwkJODE5MgkvKio8IDMyIE1CIGFwZXJ0dXJlLCA0SyBwYWdlcyAqLwogIyBkZWZpbmUgQVRJX1BDSUdBUlRfUEFHRV9TSVpFCQk0MDk2CS8qKjwgUENJIEdBUlQgcGFnZSBzaXplICovCiAKLXVuc2lnbmVkIGxvbmcgZHJtX2F0aV9hbGxvY19wY2lnYXJ0X3RhYmxlKCB2b2lkICkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRybV9hdGlfYWxsb2NfcGNpZ2FydF90YWJsZSggdm9pZCApCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwogCXN0cnVjdCBwYWdlICpwYWdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtLmgKaW5kZXggNTg3MzA1Mi4uZTgzNzFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm0uaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybS5oCkBAIC0zOCw3ICszOCw5IEBACiAjZGVmaW5lIF9EUk1fSF8KIAogI2lmIGRlZmluZWQoX19saW51eF9fKQorI2lmIGRlZmluZWQoX19LRVJORUxfXykKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGFzbS9pb2N0bC5oPgkJLyogRm9yIF9JTyogbWFjcm9zICovCiAjZGVmaW5lIERSTV9JT0NUTF9OUihuKQkJX0lPQ19OUihuKQogI2RlZmluZSBEUk1fSU9DX1ZPSUQJCV9JT0NfTk9ORQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1QLmggYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAppbmRleCAyMWY0YzU0Li41ZGYwOWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybVAuaApAQCAtMzE2LDYgKzMxNiw5IEBACiB0eXBlZGVmIGludCBkcm1faW9jdGxfdCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKIAordHlwZWRlZiBpbnQgZHJtX2lvY3RsX2NvbXBhdF90KHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwogdHlwZWRlZiBzdHJ1Y3QgZHJtX2lvY3RsX2Rlc2MgewogCWRybV9pb2N0bF90CSAgICAgKmZ1bmM7CiAJaW50CQkgICAgIGF1dGhfbmVlZGVkOwpAQCAtNzcxLDM3ICs3NzQsMjggQEAKIAkJCQkvKiBEcml2ZXIgc3VwcG9ydCAoZHJtX2Rydi5oKSAqLwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2luaXQoc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CiBleHRlcm4gdm9pZCAgICAgICAgICBkcm1fZXhpdChzdHJ1Y3QgZHJtX2RyaXZlciAqZHJpdmVyKTsKLWV4dGVybiBpbnQgICAgICAgICAgIGRybV92ZXJzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK2V4dGVybiBsb25nCSAgICAgZHJtX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBleHRlcm4gaW50ICAgICAgICAgICBkcm1fdGFrZWRvd24oZHJtX2RldmljZV90ICogZGV2KTsKIAogCQkJCS8qIERldmljZSBzdXBwb3J0IChkcm1fZm9wcy5oKSAqLwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCAgICAgICAgICAgZHJtX3N0dWJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gaW50CSAgICAgZHJtX29wZW5faGVscGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCSAgICAgIGRybV9kZXZpY2VfdCAqZGV2KTsKIGV4dGVybiBpbnQJICAgICBkcm1fZmx1c2goc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludAkgICAgIGRybV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKTsKIGV4dGVybiBpbnQgICAgICAgICAgIGRybV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIAogCQkJCS8qIE1hcHBpbmcgc3VwcG9ydCAoZHJtX3ZtLmgpICovCi1leHRlcm4gdm9pZAkgICAgIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLWV4dGVybiB2b2lkCSAgICAgZHJtX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLWV4dGVybiB2b2lkCSAgICAgZHJtX3ZtX3NobV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci1leHRlcm4gaW50CSAgICAgZHJtX21tYXBfZG1hKHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCSAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIGV4dGVybiBpbnQJICAgICBkcm1fbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogZXh0ZXJuIHVuc2lnbmVkIGludCAgZHJtX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7Ci1leHRlcm4gc3NpemVfdCAgICAgICBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZik7CiAKIAkJCQkvKiBNZW1vcnkgbWFuYWdlbWVudCBzdXBwb3J0IChkcm1fbWVtb3J5LmgpICovCiAjaW5jbHVkZSAiZHJtX21lbW9yeS5oIgogZXh0ZXJuIHZvaWQJICAgICBkcm1fbWVtX2luaXQodm9pZCk7CiBleHRlcm4gaW50CSAgICAgZHJtX21lbV9pbmZvKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCiAJCQkJICAgaW50IHJlcXVlc3QsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLWV4dGVybiB2b2lkCSAgICAgKmRybV9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpOwogZXh0ZXJuIHZvaWQJICAgICAqZHJtX3JlYWxsb2Modm9pZCAqb2xkcHQsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSwKIAkJCQkgICBpbnQgYXJlYSk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBkcm1fYWxsb2NfcGFnZXMoaW50IG9yZGVyLCBpbnQgYXJlYSk7CkBAIC04NDksOSArODQzLDYgQEAKIGV4dGVybiBpbnQJICAgICBkcm1fcm1jdHgoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogCQkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApOwogCi1leHRlcm4gaW50CSAgICAgZHJtX2NvbnRleHRfc3dpdGNoKGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgb2xkLCBpbnQgbmV3KTsKLWV4dGVybiBpbnQJICAgICBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoZHJtX2RldmljZV90ICpkZXYsIGludCBuZXcpOwotCiBleHRlcm4gaW50CSAgICAgZHJtX2N0eGJpdG1hcF9pbml0KCBkcm1fZGV2aWNlX3QgKmRldiApOwogZXh0ZXJuIHZvaWQJICAgICBkcm1fY3R4Yml0bWFwX2NsZWFudXAoIGRybV9kZXZpY2VfdCAqZGV2ICk7CiBleHRlcm4gdm9pZCAgICAgICAgICBkcm1fY3R4Yml0bWFwX2ZyZWUoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgY3R4X2hhbmRsZSApOwpAQCAtODY5LDkgKzg2MCw2IEBACiAKIAogCQkJCS8qIEF1dGhlbnRpY2F0aW9uIElPQ1RMIHN1cHBvcnQgKGRybV9hdXRoLmgpICovCi1leHRlcm4gaW50CSAgICAgZHJtX2FkZF9tYWdpYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqcHJpdiwKLQkJCQkgICAgZHJtX21hZ2ljX3QgbWFnaWMpOwotZXh0ZXJuIGludAkgICAgIGRybV9yZW1vdmVfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9tYWdpY190IG1hZ2ljKTsKIGV4dGVybiBpbnQJICAgICBkcm1fZ2V0bWFnaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGludAkgICAgIGRybV9hdXRobWFnaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCkBAIC04ODgsMTMgKzg3Niw5IEBACiAJCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiBpbnQJICAgICBkcm1fbG9ja190YWtlKF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCiAJCQkJICAgIHVuc2lnbmVkIGludCBjb250ZXh0KTsKLWV4dGVybiBpbnQJICAgICBkcm1fbG9ja190cmFuc2Zlcihkcm1fZGV2aWNlX3QgKmRldiwKLQkJCQkJX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywKLQkJCQkJdW5zaWduZWQgaW50IGNvbnRleHQpOwogZXh0ZXJuIGludAkgICAgIGRybV9sb2NrX2ZyZWUoZHJtX2RldmljZV90ICpkZXYsCiAJCQkJICAgIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCiAJCQkJICAgIHVuc2lnbmVkIGludCBjb250ZXh0KTsKLWV4dGVybiBpbnQgICAgICAgICAgIGRybV9ub3RpZmllcih2b2lkICpwcml2KTsKIAogCQkJCS8qIEJ1ZmZlciBtYW5hZ2VtZW50IHN1cHBvcnQgKGRybV9idWZzLmgpICovCiBleHRlcm4gaW50CSAgICAgZHJtX29yZGVyKCB1bnNpZ25lZCBsb25nIHNpemUgKTsKQEAgLTkyMiw3ICs5MDYsNiBAQAogCQkJCS8qIElSUSBzdXBwb3J0IChkcm1faXJxLmgpICovCiBleHRlcm4gaW50ICAgICAgICAgICBkcm1fY29udHJvbCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKTsKLWV4dGVybiBpbnQgICAgICAgICAgIGRybV9pcnFfaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKTsKIGV4dGVybiBpbnQgICAgICAgICAgIGRybV9pcnFfdW5pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOwogZXh0ZXJuIGlycXJldHVybl90ICAgZHJtX2lycV9oYW5kbGVyKCBEUk1fSVJRX0FSR1MgKTsKIGV4dGVybiB2b2lkICAgICAgICAgIGRybV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CkBAIC05NjIsNyArOTQ1LDYgQEAKIGV4dGVybiBpbnQgZHJtX2dldF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQsCiAJCSAgICAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlcik7CiBleHRlcm4gaW50IGRybV9wdXRfZGV2KGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IGRybV9nZXRfaGVhZChkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9oZWFkX3QgKmhlYWQpOwogZXh0ZXJuIGludCBkcm1fcHV0X2hlYWQoZHJtX2hlYWRfdCAqIGhlYWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCAgIGRybV9kZWJ1ZzsKIGV4dGVybiB1bnNpZ25lZCBpbnQgICBkcm1fY2FyZHNfbGltaXQ7CkBAIC0xMDU5LDkgKzEwNDEsMTYgQEAKIHsKIAlrZnJlZShwdCk7CiB9CisKKy8qKiBXcmFwcGVyIGFyb3VuZCBrY2FsbG9jKCkgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgKmRybV9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCit7CisJcmV0dXJuIGtjYWxsb2Mobm1lbWIsIHNpemUsIEdGUF9LRVJORUwpOworfQogI2Vsc2UKIGV4dGVybiB2b2lkICpkcm1fYWxsb2Moc2l6ZV90IHNpemUsIGludCBhcmVhKTsKIGV4dGVybiB2b2lkIGRybV9mcmVlKHZvaWQgKnB0LCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpOworZXh0ZXJuIHZvaWQgKmRybV9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpOwogI2VuZGlmCiAKIC8qQH0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYXV0aC5jCmluZGV4IGI0Mjg3NjEuLmRkMTQwYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2F1dGguYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9hdXRoLmMKQEAgLTg3LDcgKzg3LDcgQEAKICAqIGFzc29jaWF0ZWQgdGhlIG1hZ2ljIG51bWJlciBoYXNoIGtleSBpbiBkcm1fZGV2aWNlOjptYWdpY2xpc3QsIHdoaWxlIGhvbGRpbmcKICAqIHRoZSBkcm1fZGV2aWNlOjpzdHJ1Y3Rfc2VtIGxvY2suCiAgKi8KLWludCBkcm1fYWRkX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fZmlsZV90ICpwcml2LCBkcm1fbWFnaWNfdCBtYWdpYykKK3N0YXRpYyBpbnQgZHJtX2FkZF9tYWdpYyhkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2ZpbGVfdCAqcHJpdiwgZHJtX21hZ2ljX3QgbWFnaWMpCiB7CiAJaW50CQkgIGhhc2g7CiAJZHJtX21hZ2ljX2VudHJ5X3QgKmVudHJ5OwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgKiBTZWFyY2hlcyBhbmQgdW5saW5rcyB0aGUgZW50cnkgaW4gZHJtX2RldmljZTo6bWFnaWNsaXN0IHdpdGggdGhlIG1hZ2ljCiAgKiBudW1iZXIgaGFzaCBrZXksIHdoaWxlIGhvbGRpbmcgdGhlIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KICAqLwotaW50IGRybV9yZW1vdmVfbWFnaWMoZHJtX2RldmljZV90ICpkZXYsIGRybV9tYWdpY190IG1hZ2ljKQorc3RhdGljIGludCBkcm1fcmVtb3ZlX21hZ2ljKGRybV9kZXZpY2VfdCAqZGV2LCBkcm1fbWFnaWNfdCBtYWdpYykKIHsKIAlkcm1fbWFnaWNfZW50cnlfdCAqcHJldiA9IE5VTEw7CiAJZHJtX21hZ2ljX2VudHJ5X3QgKnB0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fYnVmcy5jCmluZGV4IDQxMTNiY2IuLjRjNjE5MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2J1ZnMuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9idWZzLmMKQEAgLTYwLDYgKzYwLDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9vcmRlcik7CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisvKgorICogVXNlZCB0byBhbGxvY2F0ZSAzMi1iaXQgaGFuZGxlcyBmb3IgX0RSTV9TSE0gcmVnaW9ucworICogVGhlIDB4MTAwMDAwMDAgdmFsdWUgaXMgY2hvc2VuIHRvIGJlIG91dCBvZiB0aGUgd2F5IG9mCisgKiBGQi9yZWdpc3RlciBhbmQgR0FSVCBwaHlzaWNhbCBhZGRyZXNzZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWFwMzJfaGFuZGxlID0gMHgxMDAwMDAwMDsKKyNlbmRpZgorCiAvKioKICAqIElvY3RsIHRvIHNwZWNpZnkgYSByYW5nZSBvZiBtZW1vcnkgdGhhdCBpcyBhdmFpbGFibGUgZm9yIG1hcHBpbmcgYnkgYSBub24tcm9vdCBwcm9jZXNzLgogICoKQEAgLTE4NywxNiArMTk2LDE4IEBACiAKIAlkb3duKCZkZXYtPnN0cnVjdF9zZW0pOwogCWxpc3RfYWRkKCZsaXN0LT5oZWFkLCAmZGV2LT5tYXBsaXN0LT5oZWFkKTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLyogQXNzaWduIGEgMzItYml0IGhhbmRsZSBmb3IgX0RSTV9TSE0gbWFwcGluZ3MgKi8KKwkvKiBXZSBkbyBpdCBoZXJlIHNvIHRoYXQgZGV2LT5zdHJ1Y3Rfc2VtIHByb3RlY3RzIHRoZSBpbmNyZW1lbnQgKi8KKwlpZiAobWFwLT50eXBlID09IF9EUk1fU0hNKQorCQltYXAtPm9mZnNldCA9IG1hcDMyX2hhbmRsZSArPSBQQUdFX1NJWkU7CisjZW5kaWYKICAJdXAoJmRldi0+c3RydWN0X3NlbSk7CiAKIAlpZiAoIGNvcHlfdG9fdXNlciggYXJncCwgbWFwLCBzaXplb2YoKm1hcCkgKSApCiAJCXJldHVybiAtRUZBVUxUOwotCWlmICggbWFwLT50eXBlICE9IF9EUk1fU0hNICkgewotCQlpZiAoIGNvcHlfdG9fdXNlciggJmFyZ3AtPmhhbmRsZSwKLQkJCQkgICAmbWFwLT5vZmZzZXQsCi0JCQkJICAgc2l6ZW9mKG1hcC0+b2Zmc2V0KSApICkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KKwlpZiAoY29weV90b191c2VyKCZhcmdwLT5oYW5kbGUsICZtYXAtPm9mZnNldCwgc2l6ZW9mKG1hcC0+b2Zmc2V0KSkpCisJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCkBAIC0yNDAsNyArMjUxLDcgQEAKIAkJcl9saXN0ID0gbGlzdF9lbnRyeShsaXN0LCBkcm1fbWFwX2xpc3RfdCwgaGVhZCk7CiAKIAkJaWYocl9saXN0LT5tYXAgJiYKLQkJICAgcl9saXN0LT5tYXAtPmhhbmRsZSA9PSByZXF1ZXN0LmhhbmRsZSAmJgorCQkgICByX2xpc3QtPm1hcC0+b2Zmc2V0ID09ICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0LmhhbmRsZSAmJgogCQkgICByX2xpc3QtPm1hcC0+ZmxhZ3MgJiBfRFJNX1JFTU9WQUJMRSkgYnJlYWs7CiAJfQogCkBAIC0zNDUsOCArMzU2LDggQEAKICAqIHJlYWxsb2NhdGVzIHRoZSBidWZmZXIgbGlzdCBvZiB0aGUgc2FtZSBzaXplIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcKICAqIGJ1ZmZlcnMuCiAgKi8KLWludCBkcm1fYWRkYnVmc19hZ3AoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitzdGF0aWMgaW50IGRybV9hZGRidWZzX2FncCggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQogewogCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CkBAIC01MTAsOCArNTIxLDggQEAKIH0KICNlbmRpZiAvKiBfX09TX0hBU19BR1AgKi8KIAotaW50IGRybV9hZGRidWZzX3BjaSggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKK3N0YXRpYyBpbnQgZHJtX2FkZGJ1ZnNfcGNpKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCiB7CiAgICAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKQEAgLTc0MCw4ICs3NTEsOCBAQAogCiB9CiAKLWludCBkcm1fYWRkYnVmc19zZyggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCitzdGF0aWMgaW50IGRybV9hZGRidWZzX3NnKCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICkKIHsKIAlkcm1fZmlsZV90ICpwcml2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdCAqZGV2ID0gcHJpdi0+aGVhZC0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fY29udGV4dC5jCmluZGV4IGYxNWM4NmMuLmE3Y2ZhYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9jb250ZXh0LmMKQEAgLTg0LDcgKzg0LDcgQEAKICAqIGRybV9kZXZpY2U6OmNvbnRleHRfc2FyZWFzIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgZW50cnkgd2hpbGUgaG9sZGluZyB0aGUKICAqIGRybV9kZXZpY2U6OnN0cnVjdF9zZW0gbG9jay4KICAqLwotaW50IGRybV9jdHhiaXRtYXBfbmV4dCggZHJtX2RldmljZV90ICpkZXYgKQorc3RhdGljIGludCBkcm1fY3R4Yml0bWFwX25leHQoIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlpbnQgYml0OwogCkBAIC0yMjUsNyArMjI1LDcgQEAKIAltYXAgPSBkZXYtPmNvbnRleHRfc2FyZWFzW3JlcXVlc3QuY3R4X2lkXTsKIAl1cCgmZGV2LT5zdHJ1Y3Rfc2VtKTsKIAotCXJlcXVlc3QuaGFuZGxlID0gbWFwLT5oYW5kbGU7CisJcmVxdWVzdC5oYW5kbGUgPSAodm9pZCAqKSBtYXAtPm9mZnNldDsKIAlpZiAoY29weV90b191c2VyKGFyZ3AsICZyZXF1ZXN0LCBzaXplb2YocmVxdWVzdCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKQEAgLTI2MSw4ICsyNjEsOCBAQAogCWRvd24oJmRldi0+c3RydWN0X3NlbSk7CiAJbGlzdF9mb3JfZWFjaChsaXN0LCAmZGV2LT5tYXBsaXN0LT5oZWFkKSB7CiAJCXJfbGlzdCA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21hcF9saXN0X3QsIGhlYWQpOwotCQlpZihyX2xpc3QtPm1hcCAmJgotCQkgICByX2xpc3QtPm1hcC0+aGFuZGxlID09IHJlcXVlc3QuaGFuZGxlKQorCQlpZiAocl9saXN0LT5tYXAKKwkJICAgICYmIHJfbGlzdC0+bWFwLT5vZmZzZXQgPT0gKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QuaGFuZGxlKQogCQkJZ290byBmb3VuZDsKIAl9CiBiYWQ6CkBAIC0zMjYsNyArMzI2LDcgQEAKICAqIGhhcmR3YXJlIGxvY2sgaXMgaGVsZCwgY2xlYXJzIHRoZSBkcm1fZGV2aWNlOjpjb250ZXh0X2ZsYWcgYW5kIHdha2VzIHVwCiAgKiBkcm1fZGV2aWNlOjpjb250ZXh0X3dhaXQuCiAgKi8KLWludCBkcm1fY29udGV4dF9zd2l0Y2hfY29tcGxldGUoIGRybV9kZXZpY2VfdCAqZGV2LCBpbnQgbmV3ICkKK3N0YXRpYyBpbnQgZHJtX2NvbnRleHRfc3dpdGNoX2NvbXBsZXRlKCBkcm1fZGV2aWNlX3QgKmRldiwgaW50IG5ldyApCiB7CiAgICAgICAgIGRldi0+bGFzdF9jb250ZXh0ID0gbmV3OyAgLyogUFJFL1BPU1Q6IFRoaXMgaXMgdGhlIF9vbmx5XyB3cml0ZXIuICovCiAgICAgICAgIGRldi0+bGFzdF9zd2l0Y2ggID0gamlmZmllczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKaW5kZXggMWUzN2VkMC4uMzMzM2MyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZHJ2LmMKQEAgLTUxLDggKzUxLDExIEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgImRybV9jb3JlLmgiCiAKK3N0YXRpYyBpbnQgZHJtX3ZlcnNpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKIC8qKiBJb2N0bCB0YWJsZSAqLwotZHJtX2lvY3RsX2Rlc2NfdAkJICBkcm1faW9jdGxzW10gPSB7CitzdGF0aWMgZHJtX2lvY3RsX2Rlc2NfdAkJICBkcm1faW9jdGxzW10gPSB7CiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVkVSU0lPTildICAgICAgID0geyBkcm1fdmVyc2lvbiwgICAgIDAsIDAgfSwKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfVU5JUVVFKV0gICAgPSB7IGRybV9nZXR1bmlxdWUsICAgMCwgMCB9LAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9NQUdJQyldICAgICA9IHsgZHJtX2dldG1hZ2ljLCAgICAwLCAwIH0sCkBAIC00NDcsOCArNDUwLDggQEAKICAqCiAgKiBGaWxscyBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBccCBhcmcuCiAgKi8KLWludCBkcm1fdmVyc2lvbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcgKQorc3RhdGljIGludCBkcm1fdmVyc2lvbiggc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyApCiB7CiAJZHJtX2ZpbGVfdCAqcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QgKmRldiA9IHByaXYtPmhlYWQtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX2ZvcHMuYwppbmRleCA5MDY3OTQyLi4xMGU2NGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9mb3BzLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fZm9wcy5jCkBAIC0zNyw2ICszNyw4IEBACiAjaW5jbHVkZSAiZHJtUC5oIgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAorc3RhdGljIGludCBkcm1fb3Blbl9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIGRybV9kZXZpY2VfdCAqZGV2KTsKKwogc3RhdGljIGludCBkcm1fc2V0dXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKIHsKIAlpbnQgaTsKQEAgLTI1MSw3ICsyNTMsNyBAQAogCQl9CiAJfQogCQotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0hBVkVfRE1BKSkKKwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9IQVZFX0RNQSkgJiYgIWRldi0+ZHJpdmVyLT5yZWxlYXNlKQogCXsKIAkJZGV2LT5kcml2ZXItPnJlY2xhaW1fYnVmZmVycyhkZXYsIGZpbHApOwogCX0KQEAgLTI1OSw3ICsyNjEsNyBAQAogCWRybV9mYXN5bmMoIC0xLCBmaWxwLCAwICk7CiAKIAlkb3duKCAmZGV2LT5jdHhsaXN0X3NlbSApOwotCWlmICggIWxpc3RfZW1wdHkoICZkZXYtPmN0eGxpc3QtPmhlYWQgKSApIHsKKwlpZiAoIGRldi0+Y3R4bGlzdCAmJiAoIWxpc3RfZW1wdHkoJmRldi0+Y3R4bGlzdC0+aGVhZCkpKSB7CiAJCWRybV9jdHhfbGlzdF90ICpwb3MsICpuOwogCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSggcG9zLCBuLCAmZGV2LT5jdHhsaXN0LT5oZWFkLCBoZWFkICkgewpAQCAtMzQxLDcgKzM0Myw3IEBACiAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIGRybV9maWxlIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGUgcHJpdmF0ZSBkYXRhIGluIFxwCiAgKiBmaWxwIGFuZCBhZGQgaXQgaW50byB0aGUgZG91YmxlIGxpbmtlZCBsaXN0IGluIFxwIGRldi4KICAqLwotaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RldmljZV90ICpkZXYpCitzdGF0aWMgaW50IGRybV9vcGVuX2hlbHBlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZHJtX2RldmljZV90ICpkZXYpCiB7CiAJaW50CSAgICAgbWlub3IgPSBpbWlub3IoaW5vZGUpOwogCWRybV9maWxlX3QgICAqcHJpdjsKQEAgLTQ0Myw5ICs0NDUsMyBAQAogfQogRVhQT1JUX1NZTUJPTChkcm1fcG9sbCk7CiAKLQotLyoqIE5vLW9wLiAqLwotc3NpemVfdCBkcm1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwODdhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pb2MzMi5jCkBAIC0wLDAgKzEsMTA2OSBAQAorLyoqCisgKiBcZmlsZSBkcm1faW9jMzIuYworICoKKyAqIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciB0aGUgRFJNLgorICoKKyAqIFxhdXRob3IgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAyMDA1LgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm1fY29yZS5oIgorCisjZGVmaW5lIERSTV9JT0NUTF9WRVJTSU9OMzIJCURSTV9JT1dSKDB4MDAsIGRybV92ZXJzaW9uMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9VTklRVUUzMgkJRFJNX0lPV1IoMHgwMSwgZHJtX3VuaXF1ZTMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9HRVRfTUFQMzIJCURSTV9JT1dSKDB4MDQsIGRybV9tYXAzMl90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX0NMSUVOVDMyCQlEUk1fSU9XUigweDA1LCBkcm1fY2xpZW50MzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0dFVF9TVEFUUzMyCQlEUk1fSU9SKCAweDA2LCBkcm1fc3RhdHMzMl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9TRVRfVU5JUVVFMzIJCURSTV9JT1coIDB4MTAsIGRybV91bmlxdWUzMl90KQorI2RlZmluZSBEUk1fSU9DVExfQUREX01BUDMyCQlEUk1fSU9XUigweDE1LCBkcm1fbWFwMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FERF9CVUZTMzIJCURSTV9JT1dSKDB4MTYsIGRybV9idWZfZGVzYzMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9NQVJLX0JVRlMzMgkJRFJNX0lPVyggMHgxNywgZHJtX2J1Zl9kZXNjMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0lORk9fQlVGUzMyCQlEUk1fSU9XUigweDE4LCBkcm1fYnVmX2luZm8zMl90KQorI2RlZmluZSBEUk1fSU9DVExfTUFQX0JVRlMzMgkJRFJNX0lPV1IoMHgxOSwgZHJtX2J1Zl9tYXAzMl90KQorI2RlZmluZSBEUk1fSU9DVExfRlJFRV9CVUZTMzIJCURSTV9JT1coIDB4MWEsIGRybV9idWZfZnJlZTMyX3QpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX1JNX01BUDMyCQlEUk1fSU9XKCAweDFiLCBkcm1fbWFwMzJfdCkKKworI2RlZmluZSBEUk1fSU9DVExfU0VUX1NBUkVBX0NUWDMyCURSTV9JT1coIDB4MWMsIGRybV9jdHhfcHJpdl9tYXAzMl90KQorI2RlZmluZSBEUk1fSU9DVExfR0VUX1NBUkVBX0NUWDMyCURSTV9JT1dSKDB4MWQsIGRybV9jdHhfcHJpdl9tYXAzMl90KQorCisjZGVmaW5lIERSTV9JT0NUTF9SRVNfQ1RYMzIJCURSTV9JT1dSKDB4MjYsIGRybV9jdHhfcmVzMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0RNQTMyCQkJRFJNX0lPV1IoMHgyOSwgZHJtX2RtYTMyX3QpCisKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9FTkFCTEUzMgkJRFJNX0lPVyggMHgzMiwgZHJtX2FncF9tb2RlMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9JTkZPMzIJCURSTV9JT1IoIDB4MzMsIGRybV9hZ3BfaW5mbzMyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9BR1BfQUxMT0MzMgkJRFJNX0lPV1IoMHgzNCwgZHJtX2FncF9idWZmZXIzMl90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0ZSRUUzMgkJRFJNX0lPVyggMHgzNSwgZHJtX2FncF9idWZmZXIzMl90KQorI2RlZmluZSBEUk1fSU9DVExfQUdQX0JJTkQzMgkJRFJNX0lPVyggMHgzNiwgZHJtX2FncF9iaW5kaW5nMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0FHUF9VTkJJTkQzMgkJRFJNX0lPVyggMHgzNywgZHJtX2FncF9iaW5kaW5nMzJfdCkKKworI2RlZmluZSBEUk1fSU9DVExfU0dfQUxMT0MzMgkJRFJNX0lPVyggMHgzOCwgZHJtX3NjYXR0ZXJfZ2F0aGVyMzJfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1NHX0ZSRUUzMgkJRFJNX0lPVyggMHgzOSwgZHJtX3NjYXR0ZXJfZ2F0aGVyMzJfdCkKKworI2RlZmluZSBEUk1fSU9DVExfV0FJVF9WQkxBTkszMgkJRFJNX0lPV1IoMHgzYSwgZHJtX3dhaXRfdmJsYW5rMzJfdCkKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZlcnNpb25fMzIgeworCWludAl2ZXJzaW9uX21ham9yOwkgIC8qKjwgTWFqb3IgdmVyc2lvbiAqLworCWludAl2ZXJzaW9uX21pbm9yOwkgIC8qKjwgTWlub3IgdmVyc2lvbiAqLworCWludAl2ZXJzaW9uX3BhdGNobGV2ZWw7LyoqPCBQYXRjaCBsZXZlbCAqLworCXUzMgluYW1lX2xlbjsJICAvKio8IExlbmd0aCBvZiBuYW1lIGJ1ZmZlciAqLworCXUzMgluYW1lOwkJICAvKio8IE5hbWUgb2YgZHJpdmVyICovCisJdTMyCWRhdGVfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRhdGUgYnVmZmVyICovCisJdTMyCWRhdGU7CQkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkYXRlICovCisJdTMyCWRlc2NfbGVuOwkgIC8qKjwgTGVuZ3RoIG9mIGRlc2MgYnVmZmVyICovCisJdTMyCWRlc2M7CQkgIC8qKjwgVXNlci1zcGFjZSBidWZmZXIgdG8gaG9sZCBkZXNjICovCit9IGRybV92ZXJzaW9uMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX3ZlcnNpb24oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fdmVyc2lvbjMyX3QgdjMyOworCWRybV92ZXJzaW9uX3QgX191c2VyICp2ZXJzaW9uOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnYzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHYzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXZlcnNpb24gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnZlcnNpb24pKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHZlcnNpb24sIHNpemVvZigqdmVyc2lvbikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcih2MzIubmFtZV9sZW4sICZ2ZXJzaW9uLT5uYW1lX2xlbikKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyl2MzIubmFtZSwKKwkJCSAgJnZlcnNpb24tPm5hbWUpCisJICAgIHx8IF9fcHV0X3VzZXIodjMyLmRhdGVfbGVuLCAmdmVyc2lvbi0+ZGF0ZV9sZW4pCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpdjMyLmRhdGUsCisJCQkgICZ2ZXJzaW9uLT5kYXRlKQorCSAgICB8fCBfX3B1dF91c2VyKHYzMi5kZXNjX2xlbiwgJnZlcnNpb24tPmRlc2NfbGVuKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXYzMi5kZXNjLAorCQkJICAmdmVyc2lvbi0+ZGVzYykpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX1ZFUlNJT04sICh1bnNpZ25lZCBsb25nKSB2ZXJzaW9uKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIodjMyLnZlcnNpb25fbWFqb3IsICZ2ZXJzaW9uLT52ZXJzaW9uX21ham9yKQorCSAgICB8fCBfX2dldF91c2VyKHYzMi52ZXJzaW9uX21pbm9yLCAmdmVyc2lvbi0+dmVyc2lvbl9taW5vcikKKwkgICAgfHwgX19nZXRfdXNlcih2MzIudmVyc2lvbl9wYXRjaGxldmVsLCAmdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsKQorCSAgICB8fCBfX2dldF91c2VyKHYzMi5uYW1lX2xlbiwgJnZlcnNpb24tPm5hbWVfbGVuKQorCSAgICB8fCBfX2dldF91c2VyKHYzMi5kYXRlX2xlbiwgJnZlcnNpb24tPmRhdGVfbGVuKQorCSAgICB8fCBfX2dldF91c2VyKHYzMi5kZXNjX2xlbiwgJnZlcnNpb24tPmRlc2NfbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZ2MzIsIHNpemVvZih2MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV91bmlxdWUzMiB7CisJdTMyIHVuaXF1ZV9sZW47CS8qKjwgTGVuZ3RoIG9mIHVuaXF1ZSAqLworCXUzMiB1bmlxdWU7CS8qKjwgVW5pcXVlIG5hbWUgZm9yIGRyaXZlciBpbnN0YW50aWF0aW9uICovCit9IGRybV91bmlxdWUzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fZ2V0dW5pcXVlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV91bmlxdWUzMl90IHVxMzI7CisJZHJtX3VuaXF1ZV90IF9fdXNlciAqdTsKKwlpbnQgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1cTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YodXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXUgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnUpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHUsIHNpemVvZigqdSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcih1cTMyLnVuaXF1ZV9sZW4sICZ1LT51bmlxdWVfbGVuKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSB1cTMyLnVuaXF1ZSwKKwkJCSAgJnUtPnVuaXF1ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0dFVF9VTklRVUUsICh1bnNpZ25lZCBsb25nKSB1KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIodXEzMi51bmlxdWVfbGVuLCAmdS0+dW5pcXVlX2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGFyZywgJnVxMzIsIHNpemVvZih1cTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fc2V0dW5pcXVlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV91bmlxdWUzMl90IHVxMzI7CisJZHJtX3VuaXF1ZV90IF9fdXNlciAqdTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl1ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1LCBzaXplb2YoKnUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIodXEzMi51bmlxdWVfbGVuLCAmdS0+dW5pcXVlX2xlbikKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgdXEzMi51bmlxdWUsCisJCQkgICZ1LT51bmlxdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1NFVF9VTklRVUUsICh1bnNpZ25lZCBsb25nKSB1KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX21hcDMyIHsKKwl1MzIJb2Zmc2V0OwkgCS8qKjwgUmVxdWVzdGVkIHBoeXNpY2FsIGFkZHJlc3MgKDAgZm9yIFNBUkVBKSovCisJdTMyCXNpemU7CSAJLyoqPCBSZXF1ZXN0ZWQgcGh5c2ljYWwgc2l6ZSAoYnl0ZXMpICovCisJZHJtX21hcF90eXBlX3QJdHlwZTsJLyoqPCBUeXBlIG9mIG1lbW9yeSB0byBtYXAgKi8KKwlkcm1fbWFwX2ZsYWdzX3QgZmxhZ3M7CS8qKjwgRmxhZ3MgKi8KKwl1MzIJaGFuZGxlOwkJLyoqPCBVc2VyLXNwYWNlOiAiSGFuZGxlIiB0byBwYXNzIHRvIG1tYXAoKSAqLworCWludAltdHJyOwkJLyoqPCBNVFJSIHNsb3QgdXNlZCAqLworfSBkcm1fbWFwMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX2dldG1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9tYXAzMl90IG0zMjsKKwlkcm1fbWFwX3QgX191c2VyICptYXA7CisJaW50IGlkeCwgZXJyOworCXZvaWQgKmhhbmRsZTsKKworCWlmIChnZXRfdXNlcihpZHgsICZhcmdwLT5vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1hcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqbWFwKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBtYXAsIHNpemVvZigqbWFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKGlkeCwgJm1hcC0+b2Zmc2V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfR0VUX01BUCwgKHVuc2lnbmVkIGxvbmcpIG1hcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKG0zMi5vZmZzZXQsICZtYXAtPm9mZnNldCkKKwkgICAgfHwgX19nZXRfdXNlcihtMzIuc2l6ZSwgJm1hcC0+c2l6ZSkKKwkgICAgfHwgX19nZXRfdXNlcihtMzIudHlwZSwgJm1hcC0+dHlwZSkKKwkgICAgfHwgX19nZXRfdXNlcihtMzIuZmxhZ3MsICZtYXAtPmZsYWdzKQorCSAgICB8fCBfX2dldF91c2VyKGhhbmRsZSwgJm1hcC0+aGFuZGxlKQorCSAgICB8fCBfX2dldF91c2VyKG0zMi5tdHJyLCAmbWFwLT5tdHJyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltMzIuaGFuZGxlID0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZTsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZtMzIsIHNpemVvZihtMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX2FkZG1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9tYXAzMl90IG0zMjsKKwlkcm1fbWFwX3QgX191c2VyICptYXA7CisJaW50IGVycjsKKwl2b2lkICpoYW5kbGU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm0zMiwgYXJncCwgc2l6ZW9mKG0zMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1hcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqbWFwKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBtYXAsIHNpemVvZigqbWFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKG0zMi5vZmZzZXQsICZtYXAtPm9mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihtMzIuc2l6ZSwgJm1hcC0+c2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcihtMzIudHlwZSwgJm1hcC0+dHlwZSkKKwkgICAgfHwgX19wdXRfdXNlcihtMzIuZmxhZ3MsICZtYXAtPmZsYWdzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfQUREX01BUCwgKHVuc2lnbmVkIGxvbmcpIG1hcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKG0zMi5vZmZzZXQsICZtYXAtPm9mZnNldCkKKwkgICAgfHwgX19nZXRfdXNlcihtMzIubXRyciwgJm1hcC0+bXRycikKKwkgICAgfHwgX19nZXRfdXNlcihoYW5kbGUsICZtYXAtPmhhbmRsZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbTMyLmhhbmRsZSA9ICh1bnNpZ25lZCBsb25nKSBoYW5kbGU7CisJaWYgKG0zMi5oYW5kbGUgIT0gKHVuc2lnbmVkIGxvbmcpIGhhbmRsZSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCisJCXByaW50ayhLRVJOX0VSUiAiY29tcGF0X2RybV9hZGRtYXAgdHJ1bmNhdGVkIGhhbmRsZSIKKwkJICAgICAgICIgJXAgZm9yIHR5cGUgJWQgb2Zmc2V0ICV4XG4iLAorCQkgICAgICAgaGFuZGxlLCBtMzIudHlwZSwgbTMyLm9mZnNldCk7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZtMzIsIHNpemVvZihtMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX3JtbWFwKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9tYXAzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fbWFwX3QgX191c2VyICptYXA7CisJdTMyIGhhbmRsZTsKKworCWlmIChnZXRfdXNlcihoYW5kbGUsICZhcmdwLT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1hcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqbWFwKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBtYXAsIHNpemVvZigqbWFwKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKCh2b2lkICopKHVuc2lnbmVkIGxvbmcpIGhhbmRsZSwgJm1hcC0+aGFuZGxlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9STV9NQVAsICh1bnNpZ25lZCBsb25nKSBtYXApOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fY2xpZW50MzIgeworCWludAlpZHg7CS8qKjwgV2hpY2ggY2xpZW50IGRlc2lyZWQ/ICovCisJaW50CWF1dGg7CS8qKjwgSXMgY2xpZW50IGF1dGhlbnRpY2F0ZWQ/ICovCisJdTMyCXBpZDsJLyoqPCBQcm9jZXNzIElEICovCisJdTMyCXVpZDsJLyoqPCBVc2VyIElEICovCisJdTMyCW1hZ2ljOwkvKio8IE1hZ2ljICovCisJdTMyCWlvY3M7CS8qKjwgSW9jdGwgY291bnQgKi8KK30gZHJtX2NsaWVudDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9nZXRjbGllbnQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2NsaWVudDMyX3QgYzMyOworCWRybV9jbGllbnQzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fY2xpZW50X3QgX191c2VyICpjbGllbnQ7CisJaW50IGlkeCwgZXJyOworCisJaWYgKGdldF91c2VyKGlkeCwgJmFyZ3AtPmlkeCkpCisJCXJldHVybiAtRUZBVUxUOworCisJY2xpZW50ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbGllbnQpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNsaWVudCwgc2l6ZW9mKCpjbGllbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIoaWR4LCAmY2xpZW50LT5pZHgpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9HRVRfQ0xJRU5ULCAodW5zaWduZWQgbG9uZykgY2xpZW50KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIoYzMyLmF1dGgsICZjbGllbnQtPmF1dGgpCisJICAgIHx8IF9fZ2V0X3VzZXIoYzMyLnBpZCwgJmNsaWVudC0+cGlkKQorCSAgICB8fCBfX2dldF91c2VyKGMzMi51aWQsICZjbGllbnQtPnVpZCkKKwkgICAgfHwgX19nZXRfdXNlcihjMzIubWFnaWMsICZjbGllbnQtPm1hZ2ljKQorCSAgICB8fCBfX2dldF91c2VyKGMzMi5pb2NzLCAmY2xpZW50LT5pb2NzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZjMzIsIHNpemVvZihjMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9zdGF0czMyIHsKKwl1MzIgY291bnQ7CisJc3RydWN0IHsKKwkJdTMyIHZhbHVlOworCQlkcm1fc3RhdF90eXBlX3QgdHlwZTsKKwl9IGRhdGFbMTVdOworfSBkcm1fc3RhdHMzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fZ2V0c3RhdHMoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3N0YXRzMzJfdCBzMzI7CisJZHJtX3N0YXRzMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3N0YXRzX3QgX191c2VyICpzdGF0czsKKwlpbnQgaSwgZXJyOworCisJc3RhdHMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnN0YXRzKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9HRVRfU1RBVFMsICh1bnNpZ25lZCBsb25nKSBzdGF0cyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKHMzMi5jb3VudCwgJnN0YXRzLT5jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWZvciAoaSA9IDA7IGkgPCAxNTsgKytpKQorCQlpZiAoX19nZXRfdXNlcihzMzIuZGF0YVtpXS52YWx1ZSwgJnN0YXRzLT5kYXRhW2ldLnZhbHVlKQorCQkgICAgfHwgX19nZXRfdXNlcihzMzIuZGF0YVtpXS50eXBlLCAmc3RhdHMtPmRhdGFbaV0udHlwZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnMzMiwgc2l6ZW9mKHMzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9kZXNjMzIgeworCWludAkgICAgICBjb3VudDsJIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgb2YgdGhpcyBzaXplICovCisJaW50CSAgICAgIHNpemU7CSAvKio8IFNpemUgaW4gYnl0ZXMgKi8KKwlpbnQJICAgICAgbG93X21hcms7CSAvKio8IExvdyB3YXRlciBtYXJrICovCisJaW50CSAgICAgIGhpZ2hfbWFyazsgLyoqPCBIaWdoIHdhdGVyIG1hcmsgKi8KKwlpbnQJICAgICAgZmxhZ3M7CisJdTMyCSAgICAgIGFncF9zdGFydDsgLyoqPCBTdGFydCBhZGRyZXNzIGluIHRoZSBBR1AgYXBlcnR1cmUgKi8KK30gZHJtX2J1Zl9kZXNjMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX2FkZGJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fYnVmX2Rlc2MzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYnVmX2Rlc2NfdCBfX3VzZXIgKmJ1ZjsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgYWdwX3N0YXJ0OworCisJYnVmID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpidWYpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1Ziwgc2l6ZW9mKCpidWYpKQorCSAgICB8fCAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJncCwgc2l6ZW9mKCphcmdwKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKF9fY29weV9pbl91c2VyKGJ1ZiwgYXJncCwgb2Zmc2V0b2YoZHJtX2J1Zl9kZXNjMzJfdCwgYWdwX3N0YXJ0KSkKKwkgICAgfHwgX19nZXRfdXNlcihhZ3Bfc3RhcnQsICZhcmdwLT5hZ3Bfc3RhcnQpCisJICAgIHx8IF9fcHV0X3VzZXIoYWdwX3N0YXJ0LCAmYnVmLT5hZ3Bfc3RhcnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9BRERfQlVGUywgKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2NvcHlfaW5fdXNlcihhcmdwLCBidWYsIG9mZnNldG9mKGRybV9idWZfZGVzYzMyX3QsIGFncF9zdGFydCkpCisJICAgIHx8IF9fZ2V0X3VzZXIoYWdwX3N0YXJ0LCAmYnVmLT5hZ3Bfc3RhcnQpCisJICAgIHx8IF9fcHV0X3VzZXIoYWdwX3N0YXJ0LCAmYXJncC0+YWdwX3N0YXJ0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX21hcmtidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9idWZfZGVzYzMyX3QgYjMyOworCWRybV9idWZfZGVzYzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9idWZfZGVzY190IF9fdXNlciAqYnVmOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiMzIsIGFyZ3AsIHNpemVvZihiMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlidWYgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmJ1ZikpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmLCBzaXplb2YoKmJ1ZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX3B1dF91c2VyKGIzMi5zaXplLCAmYnVmLT5zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKGIzMi5sb3dfbWFyaywgJmJ1Zi0+bG93X21hcmspCisJICAgIHx8IF9fcHV0X3VzZXIoYjMyLmhpZ2hfbWFyaywgJmJ1Zi0+aGlnaF9tYXJrKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9NQVJLX0JVRlMsICh1bnNpZ25lZCBsb25nKSBidWYpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2luZm8zMiB7CisJaW50CSAgICAgICBjb3VudDsJLyoqPCBFbnRyaWVzIGluIGxpc3QgKi8KKwl1MzIJICAgICAgIGxpc3Q7Cit9IGRybV9idWZfaW5mbzMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9pbmZvYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fYnVmX2luZm8zMl90IHJlcTMyOworCWRybV9idWZfaW5mbzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9idWZfZGVzYzMyX3QgX191c2VyICp0bzsKKwlkcm1fYnVmX2luZm9fdCBfX3VzZXIgKnJlcXVlc3Q7CisJZHJtX2J1Zl9kZXNjX3QgX191c2VyICpsaXN0OworCXNpemVfdCBuYnl0ZXM7CisJaW50IGksIGVycjsKKwlpbnQgY291bnQsIGFjdHVhbDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsIGFyZ3AsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNvdW50ID0gcmVxMzIuY291bnQ7CisJdG8gPSAoZHJtX2J1Zl9kZXNjMzJfdCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgcmVxMzIubGlzdDsKKwlpZiAoY291bnQgPCAwKQorCQljb3VudCA9IDA7CisJaWYgKGNvdW50ID4gMAorCSAgICAmJiAhYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIGNvdW50ICogc2l6ZW9mKGRybV9idWZfZGVzYzMyX3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwluYnl0ZXMgPSBzaXplb2YoKnJlcXVlc3QpICsgY291bnQgKiBzaXplb2YoZHJtX2J1Zl9kZXNjX3QpOworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShuYnl0ZXMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgbmJ5dGVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbGlzdCA9IChkcm1fYnVmX2Rlc2NfdCAqKSAocmVxdWVzdCArIDEpOworCisJaWYgKF9fcHV0X3VzZXIoY291bnQsICZyZXF1ZXN0LT5jb3VudCkKKwkgICAgfHwgX19wdXRfdXNlcihsaXN0LCAmcmVxdWVzdC0+bGlzdCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0lORk9fQlVGUywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcihhY3R1YWwsICZyZXF1ZXN0LT5jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA+PSBhY3R1YWwpCisJCWZvciAoaSA9IDA7IGkgPCBhY3R1YWw7ICsraSkKKwkJCWlmIChfX2NvcHlfaW5fdXNlcigmdG9baV0sICZsaXN0W2ldLAorCQkJCQkgICBvZmZzZXRvZihkcm1fYnVmX2Rlc2NfdCwgZmxhZ3MpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX3B1dF91c2VyKGFjdHVhbCwgJmFyZ3AtPmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2J1Zl9wdWIzMiB7CisJaW50CWlkeDsJCS8qKjwgSW5kZXggaW50byB0aGUgbWFzdGVyIGJ1ZmZlciBsaXN0ICovCisJaW50CXRvdGFsOwkJLyoqPCBCdWZmZXIgc2l6ZSAqLworCWludAl1c2VkOwkJLyoqPCBBbW91bnQgb2YgYnVmZmVyIGluIHVzZSAoZm9yIERNQSkgKi8KKwl1MzIJYWRkcmVzczsJLyoqPCBBZGRyZXNzIG9mIGJ1ZmZlciAqLworfSBkcm1fYnVmX3B1YjMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9idWZfbWFwMzIgeworCWludAljb3VudDsJCS8qKjwgTGVuZ3RoIG9mIHRoZSBidWZmZXIgbGlzdCAqLworCXUzMgl2aXJ0dWFsOwkvKio8IE1tYXAnZCBhcmVhIGluIHVzZXItdmlydHVhbCAqLworCXUzMglsaXN0OwkJLyoqPCBCdWZmZXIgaW5mb3JtYXRpb24gKi8KK30gZHJtX2J1Zl9tYXAzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fbWFwYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9idWZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2J1Zl9tYXAzMl90IHJlcTMyOworCWRybV9idWZfcHViMzJfdCBfX3VzZXIgKmxpc3QzMjsKKwlkcm1fYnVmX21hcF90IF9fdXNlciAqcmVxdWVzdDsKKwlkcm1fYnVmX3B1Yl90IF9fdXNlciAqbGlzdDsKKwlpbnQgaSwgZXJyOworCWludCBjb3VudCwgYWN0dWFsOworCXNpemVfdCBuYnl0ZXM7CisJdm9pZCBfX3VzZXIgKmFkZHI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY291bnQgPSByZXEzMi5jb3VudDsKKwlsaXN0MzIgPSAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5saXN0OworCisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbmJ5dGVzID0gc2l6ZW9mKCpyZXF1ZXN0KSArIGNvdW50ICogc2l6ZW9mKGRybV9idWZfcHViX3QpOworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShuYnl0ZXMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgbmJ5dGVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJbGlzdCA9IChkcm1fYnVmX3B1Yl90ICopIChyZXF1ZXN0ICsgMSk7CisKKwlpZiAoX19wdXRfdXNlcihjb3VudCwgJnJlcXVlc3QtPmNvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKGxpc3QsICZyZXF1ZXN0LT5saXN0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfTUFQX0JVRlMsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIoYWN0dWFsLCAmcmVxdWVzdC0+Y291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPj0gYWN0dWFsKQorCQlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsOyArK2kpCisJCQlpZiAoX19jb3B5X2luX3VzZXIoJmxpc3QzMltpXSwgJmxpc3RbaV0sCisJCQkJCSAgIG9mZnNldG9mKGRybV9idWZfcHViX3QsIGFkZHJlc3MpKQorCQkJICAgIHx8IF9fZ2V0X3VzZXIoYWRkciwgJmxpc3RbaV0uYWRkcmVzcykKKwkJCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQkJCQkgICZsaXN0MzJbaV0uYWRkcmVzcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX19wdXRfdXNlcihhY3R1YWwsICZhcmdwLT5jb3VudCkKKwkgICAgfHwgX19nZXRfdXNlcihhZGRyLCAmcmVxdWVzdC0+dmlydHVhbCkKKwkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgbG9uZykgYWRkciwgJmFyZ3AtPnZpcnR1YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fYnVmX2ZyZWUzMiB7CisJaW50CWNvdW50OworCXUzMglsaXN0OworfSBkcm1fYnVmX2ZyZWUzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fZnJlZWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2J1Zl9mcmVlMzJfdCByZXEzMjsKKwlkcm1fYnVmX2ZyZWVfdCBfX3VzZXIgKnJlcXVlc3Q7CisJZHJtX2J1Zl9mcmVlMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIocmVxMzIuY291bnQsICZyZXF1ZXN0LT5jb3VudCkKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSByZXEzMi5saXN0LAorCQkJICAmcmVxdWVzdC0+bGlzdCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfRlJFRV9CVUZTLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9jdHhfcHJpdl9tYXAzMiB7CisJdW5zaWduZWQgaW50CWN0eF9pZDsgIC8qKjwgQ29udGV4dCByZXF1ZXN0aW5nIHByaXZhdGUgbWFwcGluZyAqLworCXUzMgkJaGFuZGxlOyAvKio8IEhhbmRsZSBvZiBtYXAgKi8KK30gZHJtX2N0eF9wcml2X21hcDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9zZXRzYXJlYWN0eChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9jdHhfcHJpdl9tYXAzMl90IHJlcTMyOworCWRybV9jdHhfcHJpdl9tYXBfdCBfX3VzZXIgKnJlcXVlc3Q7CisJZHJtX2N0eF9wcml2X21hcDMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgYXJncCwgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX3B1dF91c2VyKHJlcTMyLmN0eF9pZCwgJnJlcXVlc3QtPmN0eF9pZCkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCAqKSh1bnNpZ25lZCBsb25nKSByZXEzMi5oYW5kbGUsCisJCQkgICZyZXF1ZXN0LT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1NFVF9TQVJFQV9DVFgsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX2dldHNhcmVhY3R4KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2N0eF9wcml2X21hcF90IF9fdXNlciAqcmVxdWVzdDsKKwlkcm1fY3R4X3ByaXZfbWFwMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgY3R4X2lkOworCXZvaWQgKmhhbmRsZTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYXJncCwgc2l6ZW9mKCphcmdwKSkKKwkgICAgfHwgX19nZXRfdXNlcihjdHhfaWQsICZhcmdwLT5jdHhfaWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcihjdHhfaWQsICZyZXF1ZXN0LT5jdHhfaWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9HRVRfU0FSRUFfQ1RYLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKGhhbmRsZSwgJnJlcXVlc3QtPmhhbmRsZSkKKwkgICAgfHwgX19wdXRfdXNlcigodW5zaWduZWQgbG9uZykgaGFuZGxlLCAmYXJncC0+aGFuZGxlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2N0eF9yZXMzMiB7CisJaW50CWNvdW50OworCXUzMgljb250ZXh0czsKK30gZHJtX2N0eF9yZXMzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fcmVzY3R4KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fY3R4X3JlczMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9jdHhfcmVzMzJfdCByZXMzMjsKKwlkcm1fY3R4X3Jlc190IF9fdXNlciAqcmVzOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlczMyLCBhcmdwLCBzaXplb2YocmVzMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcykpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVzLCBzaXplb2YoKnJlcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19wdXRfdXNlcihyZXMzMi5jb3VudCwgJnJlcy0+Y291bnQpCisJICAgIHx8IF9fcHV0X3VzZXIoKGRybV9jdHhfdCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgcmVzMzIuY29udGV4dHMsCisJCQkgICZyZXMtPmNvbnRleHRzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfUkVTX0NUWCwgKHVuc2lnbmVkIGxvbmcpIHJlcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKHJlczMyLmNvdW50LCAmcmVzLT5jb3VudCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXMzMi5jb3VudCwgJmFyZ3AtPmNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2RtYTMyIHsKKwlpbnQJY29udGV4dDsJICAvKio8IENvbnRleHQgaGFuZGxlICovCisJaW50CXNlbmRfY291bnQ7CSAgLyoqPCBOdW1iZXIgb2YgYnVmZmVycyB0byBzZW5kICovCisJdTMyCXNlbmRfaW5kaWNlczsJICAvKio8IExpc3Qgb2YgaGFuZGxlcyB0byBidWZmZXJzICovCisJdTMyCXNlbmRfc2l6ZXM7CSAgLyoqPCBMZW5ndGhzIG9mIGRhdGEgdG8gc2VuZCAqLworCWRybV9kbWFfZmxhZ3NfdCBmbGFnczsJCSAgLyoqPCBGbGFncyAqLworCWludAlyZXF1ZXN0X2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWVzdGVkICovCisJaW50CXJlcXVlc3Rfc2l6ZTsJICAvKio8IERlc2lyZWQgc2l6ZSBmb3IgYnVmZmVycyAqLworCXUzMglyZXF1ZXN0X2luZGljZXM7ICAvKio8IEJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCXUzMglyZXF1ZXN0X3NpemVzOworCWludAlncmFudGVkX2NvdW50OwkgIC8qKjwgTnVtYmVyIG9mIGJ1ZmZlcnMgZ3JhbnRlZCAqLworfSBkcm1fZG1hMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX2RtYShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2RtYTMyX3QgZDMyOworCWRybV9kbWEzMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisJZHJtX2RtYV90IF9fdXNlciAqZDsKKwlpbnQgZXJyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkMzIsIGFyZ3AsIHNpemVvZihkMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpkKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkLCBzaXplb2YoKmQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX19wdXRfdXNlcihkMzIuY29udGV4dCwgJmQtPmNvbnRleHQpCisJICAgIHx8IF9fcHV0X3VzZXIoZDMyLnNlbmRfY291bnQsICZkLT5zZW5kX2NvdW50KQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpIGQzMi5zZW5kX2luZGljZXMsCisJCQkgICZkLT5zZW5kX2luZGljZXMpCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgZDMyLnNlbmRfc2l6ZXMsCisJCQkgICZkLT5zZW5kX3NpemVzKQorCSAgICB8fCBfX3B1dF91c2VyKGQzMi5mbGFncywgJmQtPmZsYWdzKQorCSAgICB8fCBfX3B1dF91c2VyKGQzMi5yZXF1ZXN0X2NvdW50LCAmZC0+cmVxdWVzdF9jb3VudCkKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKSBkMzIucmVxdWVzdF9pbmRpY2VzLAorCQkJICAmZC0+cmVxdWVzdF9pbmRpY2VzKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpIGQzMi5yZXF1ZXN0X3NpemVzLAorCQkJICAmZC0+cmVxdWVzdF9zaXplcykpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0RNQSwgKHVuc2lnbmVkIGxvbmcpIGQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoX19nZXRfdXNlcihkMzIucmVxdWVzdF9zaXplLCAmZC0+cmVxdWVzdF9zaXplKQorCSAgICB8fCBfX2dldF91c2VyKGQzMi5ncmFudGVkX2NvdW50LCAmZC0+Z3JhbnRlZF9jb3VudCkKKwkgICAgfHwgX19wdXRfdXNlcihkMzIucmVxdWVzdF9zaXplLCAmYXJncC0+cmVxdWVzdF9zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKGQzMi5ncmFudGVkX2NvdW50LCAmYXJncC0+Z3JhbnRlZF9jb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBfX09TX0hBU19BR1AKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfbW9kZTMyIHsKKwl1MzIgbW9kZTsJLyoqPCBBR1AgbW9kZSAqLworfSBkcm1fYWdwX21vZGUzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWdwX2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2FncF9tb2RlMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2FncF9tb2RlMzJfdCBtMzI7CisJZHJtX2FncF9tb2RlX3QgX191c2VyICptb2RlOworCisJaWYgKGdldF91c2VyKG0zMi5tb2RlLCAmYXJncC0+bW9kZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbW9kZSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqbW9kZSkpOworCWlmIChwdXRfdXNlcihtMzIubW9kZSwgJm1vZGUtPm1vZGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0FHUF9FTkFCTEUsICh1bnNpZ25lZCBsb25nKSBtb2RlKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX2FncF9pbmZvMzIgeworCWludCAgICAgICBhZ3BfdmVyc2lvbl9tYWpvcjsKKwlpbnQgICAgICAgYWdwX3ZlcnNpb25fbWlub3I7CisJdTMyCSAgbW9kZTsKKwl1MzIJICBhcGVydHVyZV9iYXNlOyAgLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCXUzMgkgIGFwZXJ0dXJlX3NpemU7ICAvKiBieXRlcyAqLworCXUzMgkgIG1lbW9yeV9hbGxvd2VkOyAvKiBieXRlcyAqLworCXUzMgkgIG1lbW9yeV91c2VkOworCisJCQkJLyogUENJIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgc2hvcnQgaWRfdmVuZG9yOworCXVuc2lnbmVkIHNob3J0IGlkX2RldmljZTsKK30gZHJtX2FncF9pbmZvMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfZHJtX2FncF9pbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9hZ3BfaW5mbzMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV9hZ3BfaW5mbzMyX3QgaTMyOworCWRybV9hZ3BfaW5mb190IF9fdXNlciAqaW5mbzsKKwlpbnQgZXJyOworCisJaW5mbyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW5mbykpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaW5mbywgc2l6ZW9mKCppbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJRFJNX0lPQ1RMX0FHUF9JTkZPLCAodW5zaWduZWQgbG9uZykgaW5mbyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKGkzMi5hZ3BfdmVyc2lvbl9tYWpvciwgJmluZm8tPmFncF92ZXJzaW9uX21ham9yKQorCSAgICB8fCBfX2dldF91c2VyKGkzMi5hZ3BfdmVyc2lvbl9taW5vciwgJmluZm8tPmFncF92ZXJzaW9uX21pbm9yKQorCSAgICB8fCBfX2dldF91c2VyKGkzMi5tb2RlLCAmaW5mby0+bW9kZSkKKwkgICAgfHwgX19nZXRfdXNlcihpMzIuYXBlcnR1cmVfYmFzZSwgJmluZm8tPmFwZXJ0dXJlX2Jhc2UpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLmFwZXJ0dXJlX3NpemUsICZpbmZvLT5hcGVydHVyZV9zaXplKQorCSAgICB8fCBfX2dldF91c2VyKGkzMi5tZW1vcnlfYWxsb3dlZCwgJmluZm8tPm1lbW9yeV9hbGxvd2VkKQorCSAgICB8fCBfX2dldF91c2VyKGkzMi5tZW1vcnlfdXNlZCwgJmluZm8tPm1lbW9yeV91c2VkKQorCSAgICB8fCBfX2dldF91c2VyKGkzMi5pZF92ZW5kb3IsICZpbmZvLT5pZF92ZW5kb3IpCisJICAgIHx8IF9fZ2V0X3VzZXIoaTMyLmlkX2RldmljZSwgJmluZm8tPmlkX2RldmljZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaTMyLCBzaXplb2YoaTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYnVmZmVyMzIgeworCXUzMiBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXUzMiBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgYmluZGluZyAvIHVuYmluZGluZyAqLworCXUzMiB0eXBlOwkvKio8IFR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlICovCisgICAgICAgIHUzMiBwaHlzaWNhbDsJLyoqPCBQaHlzaWNhbCB1c2VkIGJ5IGk4MTAgKi8KK30gZHJtX2FncF9idWZmZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWdwX2FsbG9jKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9hZ3BfYnVmZmVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2FncF9idWZmZXIzMl90IHJlcTMyOworCWRybV9hZ3BfYnVmZmVyX3QgX191c2VyICpyZXF1ZXN0OworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnNpemUsICZyZXF1ZXN0LT5zaXplKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnR5cGUsICZyZXF1ZXN0LT50eXBlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfQUdQX0FMTE9DLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChfX2dldF91c2VyKHJlcTMyLmhhbmRsZSwgJnJlcXVlc3QtPmhhbmRsZSkKKwkgICAgfHwgX19nZXRfdXNlcihyZXEzMi5waHlzaWNhbCwgJnJlcXVlc3QtPnBoeXNpY2FsKQorCSAgICB8fCBjb3B5X3RvX3VzZXIoYXJncCwgJnJlcTMyLCBzaXplb2YocmVxMzIpKSkgeworCQlkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgIERSTV9JT0NUTF9BR1BfRlJFRSwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21wYXRfZHJtX2FncF9mcmVlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9hZ3BfYnVmZmVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2FncF9idWZmZXJfdCBfX3VzZXIgKnJlcXVlc3Q7CisJdTMyIGhhbmRsZTsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IGdldF91c2VyKGhhbmRsZSwgJmFyZ3AtPmhhbmRsZSkKKwkgICAgfHwgX19wdXRfdXNlcihoYW5kbGUsICZyZXF1ZXN0LT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0FHUF9GUkVFLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9hZ3BfYmluZGluZzMyIHsKKwl1MzIgaGFuZGxlOwkvKio8IEZyb20gZHJtX2FncF9idWZmZXIgKi8KKwl1MzIgb2Zmc2V0OwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworfSBkcm1fYWdwX2JpbmRpbmczMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fYWdwX2JpbmQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2FncF9iaW5kaW5nMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX2FncF9iaW5kaW5nMzJfdCByZXEzMjsKKwlkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKnJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmhhbmRsZSwgJnJlcXVlc3QtPmhhbmRsZSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5vZmZzZXQsICZyZXF1ZXN0LT5vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0FHUF9CSU5ELCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9hZ3BfdW5iaW5kKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fYWdwX2JpbmRpbmczMl90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlkcm1fYWdwX2JpbmRpbmdfdCBfX3VzZXIgKnJlcXVlc3Q7CisJdTMyIGhhbmRsZTsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IGdldF91c2VyKGhhbmRsZSwgJmFyZ3AtPmhhbmRsZSkKKwkgICAgfHwgX19wdXRfdXNlcihoYW5kbGUsICZyZXF1ZXN0LT5oYW5kbGUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0FHUF9VTkJJTkQsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKyNlbmRpZiAvKiBfX09TX0hBU19BR1AgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3NjYXR0ZXJfZ2F0aGVyMzIgeworCXUzMiBzaXplOwkvKio8IEluIGJ5dGVzIC0tIHdpbGwgcm91bmQgdG8gcGFnZSBib3VuZGFyeSAqLworCXUzMiBoYW5kbGU7CS8qKjwgVXNlZCBmb3IgbWFwcGluZyAvIHVubWFwcGluZyAqLworfSBkcm1fc2NhdHRlcl9nYXRoZXIzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9kcm1fc2dfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3NjYXR0ZXJfZ2F0aGVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICpyZXF1ZXN0OworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyB4OworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZ3AsIHNpemVvZigqYXJncCkpCisJICAgIHx8IF9fZ2V0X3VzZXIoeCwgJmFyZ3AtPnNpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoeCwgJnJlcXVlc3QtPnNpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCURSTV9JT0NUTF9TR19BTExPQywgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBYWFggbm90IHN1cmUgYWJvdXQgdGhlIGhhbmRsZSBjb252ZXJzaW9uIGhlcmUuLi4gKi8KKwlpZiAoX19nZXRfdXNlcih4LCAmcmVxdWVzdC0+aGFuZGxlKQorCSAgICB8fCBfX3B1dF91c2VyKHggPj4gUEFHRV9TSElGVCwgJmFyZ3AtPmhhbmRsZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV9zZ19mcmVlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3NjYXR0ZXJfZ2F0aGVyMzJfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJZHJtX3NjYXR0ZXJfZ2F0aGVyX3QgX191c2VyICpyZXF1ZXN0OworCXVuc2lnbmVkIGxvbmcgeDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBzaXplb2YoKmFyZ3ApKQorCSAgICB8fCBfX2dldF91c2VyKHgsICZhcmdwLT5oYW5kbGUpCisJICAgIHx8IF9fcHV0X3VzZXIoeCA8PCBQQUdFX1NISUZULCAmcmVxdWVzdC0+aGFuZGxlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9TR19GUkVFLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVxdWVzdDMyIHsKKwlkcm1fdmJsYW5rX3NlcV90eXBlX3QgdHlwZTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJdTMyIHNpZ25hbDsKK307CisKK3N0cnVjdCBkcm1fd2FpdF92YmxhbmtfcmVwbHkzMiB7CisJZHJtX3ZibGFua19zZXFfdHlwZV90IHR5cGU7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworCXMzMiB0dmFsX3NlYzsKKwlzMzIgdHZhbF91c2VjOworfTsKKwordHlwZWRlZiB1bmlvbiBkcm1fd2FpdF92YmxhbmszMiB7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXF1ZXN0MzIgcmVxdWVzdDsKKwlzdHJ1Y3QgZHJtX3dhaXRfdmJsYW5rX3JlcGx5MzIgcmVwbHk7Cit9IGRybV93YWl0X3ZibGFuazMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2RybV93YWl0X3ZibGFuayhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV93YWl0X3ZibGFuazMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWRybV93YWl0X3ZibGFuazMyX3QgcmVxMzI7CisJZHJtX3dhaXRfdmJsYW5rX3QgX191c2VyICpyZXF1ZXN0OworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCBhcmdwLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnJlcXVlc3QudHlwZSwgJnJlcXVlc3QtPnJlcXVlc3QudHlwZSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5yZXF1ZXN0LnNlcXVlbmNlLCAmcmVxdWVzdC0+cmVxdWVzdC5zZXF1ZW5jZSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5yZXF1ZXN0LnNpZ25hbCwgJnJlcXVlc3QtPnJlcXVlc3Quc2lnbmFsKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQlEUk1fSU9DVExfV0FJVF9WQkxBTkssICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKF9fZ2V0X3VzZXIocmVxMzIucmVwbHkudHlwZSwgJnJlcXVlc3QtPnJlcGx5LnR5cGUpCisJICAgIHx8IF9fZ2V0X3VzZXIocmVxMzIucmVwbHkuc2VxdWVuY2UsICZyZXF1ZXN0LT5yZXBseS5zZXF1ZW5jZSkKKwkgICAgfHwgX19nZXRfdXNlcihyZXEzMi5yZXBseS50dmFsX3NlYywgJnJlcXVlc3QtPnJlcGx5LnR2YWxfc2VjKQorCSAgICB8fCBfX2dldF91c2VyKHJlcTMyLnJlcGx5LnR2YWxfdXNlYywgJnJlcXVlc3QtPnJlcGx5LnR2YWxfdXNlYykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcmVxMzIsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitkcm1faW9jdGxfY29tcGF0X3QgKmRybV9jb21wYXRfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVkVSU0lPTjMyKV0gPSBjb21wYXRfZHJtX3ZlcnNpb24sCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1VOSVFVRTMyKV0gPSBjb21wYXRfZHJtX2dldHVuaXF1ZSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9HRVRfTUFQMzIpXSA9IGNvbXBhdF9kcm1fZ2V0bWFwLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9DTElFTlQzMildID0gY29tcGF0X2RybV9nZXRjbGllbnQsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfR0VUX1NUQVRTMzIpXSA9IGNvbXBhdF9kcm1fZ2V0c3RhdHMsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1VOSVFVRTMyKV0gPSBjb21wYXRfZHJtX3NldHVuaXF1ZSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BRERfTUFQMzIpXSA9IGNvbXBhdF9kcm1fYWRkbWFwLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FERF9CVUZTMzIpXSA9IGNvbXBhdF9kcm1fYWRkYnVmcywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVJLX0JVRlMzMildID0gY29tcGF0X2RybV9tYXJrYnVmcywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9JTkZPX0JVRlMzMildID0gY29tcGF0X2RybV9pbmZvYnVmcywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NQVBfQlVGUzMyKV0gPSBjb21wYXRfZHJtX21hcGJ1ZnMsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfRlJFRV9CVUZTMzIpXSA9IGNvbXBhdF9kcm1fZnJlZWJ1ZnMsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfUk1fTUFQMzIpXSA9IGNvbXBhdF9kcm1fcm1tYXAsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfU0VUX1NBUkVBX0NUWDMyKV0gPSBjb21wYXRfZHJtX3NldHNhcmVhY3R4LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0dFVF9TQVJFQV9DVFgzMildID0gY29tcGF0X2RybV9nZXRzYXJlYWN0eCwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9SRVNfQ1RYMzIpXSA9IGNvbXBhdF9kcm1fcmVzY3R4LAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0RNQTMyKV0gPSBjb21wYXRfZHJtX2RtYSwKKyNpZiBfX09TX0hBU19BR1AKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfRU5BQkxFMzIpXSA9IGNvbXBhdF9kcm1fYWdwX2VuYWJsZSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfSU5GTzMyKV0gPSBjb21wYXRfZHJtX2FncF9pbmZvLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9BTExPQzMyKV0gPSBjb21wYXRfZHJtX2FncF9hbGxvYywKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9BR1BfRlJFRTMyKV0gPSBjb21wYXRfZHJtX2FncF9mcmVlLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX0FHUF9CSU5EMzIpXSA9IGNvbXBhdF9kcm1fYWdwX2JpbmQsCisJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfQUdQX1VOQklORDMyKV0gPSBjb21wYXRfZHJtX2FncF91bmJpbmQsCisjZW5kaWYKKwlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9TR19BTExPQzMyKV0gPSBjb21wYXRfZHJtX3NnX2FsbG9jLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1NHX0ZSRUUzMildID0gY29tcGF0X2RybV9zZ19mcmVlLAorCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1dBSVRfVkJMQU5LMzIpXSA9IGNvbXBhdF9kcm1fd2FpdF92YmxhbmssCit9OworCisvKioKKyAqIENhbGxlZCB3aGVuZXZlciBhIDMyLWJpdCBwcm9jZXNzIHJ1bm5pbmcgdW5kZXIgYSA2NC1iaXQga2VybmVsCisgKiBwZXJmb3JtcyBhbiBpb2N0bCBvbiAvZGV2L2RybS4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworbG9uZyBkcm1fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKKwlkcm1faW9jdGxfY29tcGF0X3QgKmZuOworCWludCByZXQ7CisKKwlpZiAobnIgPj0gRFJNX0FSUkFZX1NJWkUoZHJtX2NvbXBhdF9pb2N0bHMpKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCWZuID0gZHJtX2NvbXBhdF9pb2N0bHNbbnJdOworCisJbG9ja19rZXJuZWwoKTsJCS8qIFhYWCBmb3Igbm93ICovCisJaWYgKGZuICE9IE5VTEwpCisJCXJldCA9ICgqZm4pKGZpbHAsIGNtZCwgYXJnKTsKKwllbHNlCisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlscCwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jb21wYXRfaW9jdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1faXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwppbmRleCAyZTIzNmViLi5jZGQ0YWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9pcnEuYwpAQCAtODksNyArODksNyBAQAogICogXGMgZHJtX2RyaXZlcl9pcnFfcHJlaW5zdGFsbCgpIGFuZCBcYyBkcm1fZHJpdmVyX2lycV9wb3N0aW5zdGFsbCgpIGZ1bmN0aW9ucwogICogYmVmb3JlIGFuZCBhZnRlciB0aGUgaW5zdGFsbGF0aW9uLgogICovCi1pbnQgZHJtX2lycV9pbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApCitzdGF0aWMgaW50IGRybV9pcnFfaW5zdGFsbCggZHJtX2RldmljZV90ICpkZXYgKQogewogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBzaF9mbGFncz0wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbG9jay5jCmluZGV4IGQwZDZmYzYuLjQ3MDJkODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX2xvY2suYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9sb2NrLmMKQEAgLTM1LDYgKzM1LDExIEBACiAKICNpbmNsdWRlICJkcm1QLmgiCiAKK3N0YXRpYyBpbnQgZHJtX2xvY2tfdHJhbnNmZXIoZHJtX2RldmljZV90ICpkZXYsCisJCQkgICAgIF9fdm9sYXRpbGVfXyB1bnNpZ25lZCBpbnQgKmxvY2ssCisJCQkgICAgIHVuc2lnbmVkIGludCBjb250ZXh0KTsKK3N0YXRpYyBpbnQgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpOworCiAvKiogCiAgKiBMb2NrIGlvY3RsLgogICoKQEAgLTIyNSw4ICsyMzAsOSBAQAogICogUmVzZXRzIHRoZSBsb2NrIGZpbGUgcG9pbnRlci4KICAqIE1hcmtzIHRoZSBsb2NrIGFzIGhlbGQgYnkgdGhlIGdpdmVuIGNvbnRleHQsIHZpYSB0aGUgXHAgY21weGNoZyBpbnN0cnVjdGlvbi4KICAqLwotaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9kZXZpY2VfdCAqZGV2LAotCQkgICAgICAgX192b2xhdGlsZV9fIHVuc2lnbmVkIGludCAqbG9jaywgdW5zaWduZWQgaW50IGNvbnRleHQpCitzdGF0aWMgaW50IGRybV9sb2NrX3RyYW5zZmVyKGRybV9kZXZpY2VfdCAqZGV2LAorCQkJICAgICBfX3ZvbGF0aWxlX18gdW5zaWduZWQgaW50ICpsb2NrLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY29udGV4dCkKIHsKIAl1bnNpZ25lZCBpbnQgb2xkLCBuZXcsIHByZXY7CiAKQEAgLTI4Miw3ICsyODgsNyBAQAogICogXHJldHVybiBvbmUgaWYgdGhlIHNpZ25hbCBzaG91bGQgYmUgZGVsaXZlcmVkIG5vcm1hbGx5LCBvciB6ZXJvIGlmIHRoZQogICogc2lnbmFsIHNob3VsZCBiZSBibG9ja2VkLgogICovCi1pbnQgZHJtX25vdGlmaWVyKHZvaWQgKnByaXYpCitzdGF0aWMgaW50IGRybV9ub3RpZmllcih2b2lkICpwcml2KQogewogCWRybV9zaWdkYXRhX3QgKnMgPSAoZHJtX3NpZ2RhdGFfdCAqKXByaXY7CiAJdW5zaWduZWQgaW50ICBvbGQsIG5ldywgcHJldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX21lbW9yeS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKaW5kZXggN2Y1M2Y3NS4uYWNlM2Q0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fbWVtb3J5LmMKQEAgLTY1LDE5ICs2NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKiBXcmFwcGVyIGFyb3VuZCBrbWFsbG9jKCkgKi8KLXZvaWQgKmRybV9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCi17Ci0Jdm9pZCAqYWRkcjsKLQotCWFkZHIgPSBrbWFsbG9jKHNpemUgKiBubWVtYiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFkZHIgIT0gTlVMTCkKLQkJbWVtc2V0KCh2b2lkICopYWRkciwgMCwgc2l6ZSAqIG5tZW1iKTsKLQotCXJldHVybiBhZGRyOwotfQotRVhQT1JUX1NZTUJPTChkcm1fY2FsbG9jKTsKLQogLyoqIFdyYXBwZXIgYXJvdW5kIGttYWxsb2MoKSBhbmQga2ZyZWUoKSAqLwogdm9pZCAqZHJtX3JlYWxsb2Modm9pZCAqb2xkcHQsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSwgaW50IGFyZWEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wY2lpZHMuaCBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCmluZGV4IDExYzY5NTAuLjcwY2E0ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3BjaWlkcy5oCkBAIC0yMjMsMyArMjIzLDEwIEBACiAJezB4ODA4NiwgMHgyNzcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAogCXswLCAwLCAwfQogCisjZGVmaW5lIHZpYWRydl9QQ0lfSURTIFwKKwl7MHgxMTA2LCAweDMwMjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezB4MTEwNiwgMHgzMTIyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwgXAorCXsweDExMDYsIDB4NzIwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sIFwKKwl7MHgxMTA2LCAweDcyMDQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LCBcCisJezAsIDAsIDB9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3Byb2MuYwppbmRleCA2ZTA2ZThjLi40Nzc0MDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV9wcm9jLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fcHJvYy5jCkBAIC01Nyw3ICs1Nyw3IEBACiAvKioKICAqIFByb2MgZmlsZSBsaXN0LgogICovCi1zdHJ1Y3QgZHJtX3Byb2NfbGlzdCB7CitzdGF0aWMgc3RydWN0IGRybV9wcm9jX2xpc3QgewogCWNvbnN0IGNoYXIgKm5hbWU7CS8qKjwgZmlsZSBuYW1lICovCiAJaW50CSAgICgqZikoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50LCBpbnQgKiwgdm9pZCAqKTsJLyoqPCBwcm9jIGNhbGxiYWNrKi8KIH0gZHJtX3Byb2NfbGlzdFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fc3R1Yi5jCmluZGV4IDhjY2JkZWYuLjQ4ODI5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vZHJtX3N0dWIuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2RybV9zdHViLmMKQEAgLTE1Nyw1MiArMTU3LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0KLS8qKgotICogUmVnaXN0ZXIuCi0gKgotICogXHBhcmFtIHBkZXYgLSBQQ0kgZGV2aWNlIHN0cnVjdHVyZQotICogXHBhcmFtIGVudCBlbnRyeSBmcm9tIHRoZSBQQ0kgSUQgdGFibGUgd2l0aCBkZXZpY2UgdHlwZSBmbGFncwotICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KLSAqCi0gKiBBdHRlbXB0IHRvIGdldHMgaW50ZXIgbW9kdWxlICJkcm0iIGluZm9ybWF0aW9uLiBJZiB3ZSBhcmUgZmlyc3QKLSAqIHRoZW4gcmVnaXN0ZXIgdGhlIGNoYXJhY3RlciBkZXZpY2UgYW5kIGludGVyIG1vZHVsZSBpbmZvcm1hdGlvbi4KLSAqIFRyeSBhbmQgcmVnaXN0ZXIsIGlmIHdlIGZhaWwgdG8gcmVnaXN0ZXIsIGJhY2tvdXQgcHJldmlvdXMgd29yay4KLSAqLwotaW50IGRybV9nZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAotCSAgICAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCi17Ci0JZHJtX2RldmljZV90ICpkZXY7Ci0JaW50IHJldDsKLQotCURSTV9ERUJVRygiXG4iKTsKLQotCWRldiA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCpkZXYpLCBEUk1fTUVNX1NUVUIpOwotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCi0JaWYgKChyZXQgPSBkcm1fZmlsbF9pbl9kZXYoZGV2LCBwZGV2LCBlbnQsIGRyaXZlcikpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRFJNOiBGaWxsX2luX2RldiBmYWlsZWQuXG4iKTsKLQkJZ290byBlcnJfZzE7Ci0JfQotCWlmICgocmV0ID0gZHJtX2dldF9oZWFkKGRldiwgJmRldi0+cHJpbWFyeSkpKQotCQlnb3RvIGVycl9nMTsKLQotCS8qIHBvc3Rpbml0IGlzIGEgcmVxdWlyZWQgZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgc2lnbm9uIGJhbm5lciAqLwotCS8qIGRyaXZlcnMgYWRkIHNlY29uZGFyeSBoZWFkcyBoZXJlIGlmIG5lZWRlZCAqLwotCWlmICgocmV0ID0gZGV2LT5kcml2ZXItPnBvc3Rpbml0KGRldiwgZW50LT5kcml2ZXJfZGF0YSkpKQotCQlnb3RvIGVycl9nMTsKLQotCXJldHVybiAwOwotCi1lcnJfZzE6Ci0JZHJtX2ZyZWUoZGV2LCBzaXplb2YoKmRldiksIERSTV9NRU1fU1RVQik7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2dldF9kZXYpOwotCiAvKioKICAqIEdldCBhIHNlY29uZGFyeSBtaW5vciBudW1iZXIuCiAgKgpAQCAtMjE0LDcgKzE2OCw3IEBACiAgKiBjcmVhdGUgdGhlIHByb2MgaW5pdCBlbnRyeSB2aWEgcHJvY19pbml0KCkuIFRoaXMgcm91dGluZXMgYXNzaWducwogICogbWlub3IgbnVtYmVycyB0byBzZWNvbmRhcnkgaGVhZHMgb2YgbXVsdGktaGVhZGVkIGNhcmRzCiAgKi8KLWludCBkcm1fZ2V0X2hlYWQoZHJtX2RldmljZV90ICpkZXYsIGRybV9oZWFkX3QgKmhlYWQpCitzdGF0aWMgaW50IGRybV9nZXRfaGVhZChkcm1fZGV2aWNlX3QgKmRldiwgZHJtX2hlYWRfdCAqaGVhZCkKIHsKIAlkcm1faGVhZF90ICoqaGVhZHMgPSBkcm1faGVhZHM7CiAJaW50IHJldDsKQEAgLTI2Miw2ICsyMTYsNTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCQkKKy8qKgorICogUmVnaXN0ZXIuCisgKgorICogXHBhcmFtIHBkZXYgLSBQQ0kgZGV2aWNlIHN0cnVjdHVyZQorICogXHBhcmFtIGVudCBlbnRyeSBmcm9tIHRoZSBQQ0kgSUQgdGFibGUgd2l0aCBkZXZpY2UgdHlwZSBmbGFncworICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqCisgKiBBdHRlbXB0IHRvIGdldHMgaW50ZXIgbW9kdWxlICJkcm0iIGluZm9ybWF0aW9uLiBJZiB3ZSBhcmUgZmlyc3QKKyAqIHRoZW4gcmVnaXN0ZXIgdGhlIGNoYXJhY3RlciBkZXZpY2UgYW5kIGludGVyIG1vZHVsZSBpbmZvcm1hdGlvbi4KKyAqIFRyeSBhbmQgcmVnaXN0ZXIsIGlmIHdlIGZhaWwgdG8gcmVnaXN0ZXIsIGJhY2tvdXQgcHJldmlvdXMgd29yay4KKyAqLworaW50IGRybV9nZXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAorCSAgICAgIHN0cnVjdCBkcm1fZHJpdmVyICpkcml2ZXIpCit7CisJZHJtX2RldmljZV90ICpkZXY7CisJaW50IHJldDsKKworCURSTV9ERUJVRygiXG4iKTsKKworCWRldiA9IGRybV9jYWxsb2MoMSwgc2l6ZW9mKCpkZXYpLCBEUk1fTUVNX1NUVUIpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCisJaWYgKChyZXQgPSBkcm1fZmlsbF9pbl9kZXYoZGV2LCBwZGV2LCBlbnQsIGRyaXZlcikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRFJNOiBGaWxsX2luX2RldiBmYWlsZWQuXG4iKTsKKwkJZ290byBlcnJfZzE7CisJfQorCWlmICgocmV0ID0gZHJtX2dldF9oZWFkKGRldiwgJmRldi0+cHJpbWFyeSkpKQorCQlnb3RvIGVycl9nMTsKKworCS8qIHBvc3Rpbml0IGlzIGEgcmVxdWlyZWQgZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgc2lnbm9uIGJhbm5lciAqLworCS8qIGRyaXZlcnMgYWRkIHNlY29uZGFyeSBoZWFkcyBoZXJlIGlmIG5lZWRlZCAqLworCWlmICgocmV0ID0gZGV2LT5kcml2ZXItPnBvc3Rpbml0KGRldiwgZW50LT5kcml2ZXJfZGF0YSkpKQorCQlnb3RvIGVycl9nMTsKKworCXJldHVybiAwOworCitlcnJfZzE6CisJZHJtX2ZyZWUoZGV2LCBzaXplb2YoKmRldiksIERSTV9NRU1fU1RVQik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2dldF9kZXYpOwogCiAvKioKICAqIFB1dCBhIGRldmljZSBtaW5vciBudW1iZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jIGIvZHJpdmVycy9jaGFyL2RybS9kcm1fdm0uYwppbmRleCBmYzcyZjMwLi42MjEyMjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2RybV92bS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vZHJtX3ZtLmMKQEAgLTM4LDYgKzM4LDggQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNlbmRpZgogCitzdGF0aWMgdm9pZCBkcm1fdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CitzdGF0aWMgdm9pZCBkcm1fdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiAvKioKICAqIFxjIG5vcGFnZSBtZXRob2QgZm9yIEFHUCB2aXJ0dWFsIG1lbW9yeS4KQEAgLTE2Myw3ICsxNjUsNyBAQAogICogRGVsZXRlcyBtYXAgaW5mb3JtYXRpb24gaWYgd2UgYXJlIHRoZSBsYXN0CiAgKiBwZXJzb24gdG8gY2xvc2UgYSBtYXBwaW5nIGFuZCBpdCdzIG5vdCBpbiB0aGUgZ2xvYmFsIG1hcGxpc3QuCiAgKi8KLXZvaWQgZHJtX3ZtX3NobV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyB2b2lkIGRybV92bV9zaG1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJZHJtX2ZpbGVfdAkqcHJpdgk9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWRybV9kZXZpY2VfdAkqZGV2CT0gcHJpdi0+aGVhZC0+ZGV2OwpAQCAtMzk5LDcgKzQwMSw3IEBACiAgKiBDcmVhdGUgYSBuZXcgZHJtX3ZtYV9lbnRyeSBzdHJ1Y3R1cmUgYXMgdGhlIFxwIHZtYSBwcml2YXRlIGRhdGEgZW50cnkgYW5kCiAgKiBhZGQgaXQgdG8gZHJtX2RldmljZTo6dm1hbGlzdC4KICAqLwotdm9pZCBkcm1fdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyB2b2lkIGRybV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWRybV9maWxlX3QJKnByaXYJPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QJKmRldgk9IHByaXYtPmhlYWQtPmRldjsKQEAgLTQyOCw3ICs0MzAsNyBAQAogICogU2VhcmNoIHRoZSBccCB2bWEgcHJpdmF0ZSBkYXRhIGVudHJ5IGluIGRybV9kZXZpY2U6OnZtYWxpc3QsIHVubGluayBpdCwgYW5kCiAgKiBmcmVlIGl0LgogICovCi12b2lkIGRybV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3N0YXRpYyB2b2lkIGRybV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlkcm1fZmlsZV90CSpwcml2CT0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAJZHJtX2RldmljZV90CSpkZXYJPSBwcml2LT5oZWFkLT5kZXY7CkBAIC00NjMsNyArNDY1LDcgQEAKICAqIFNldHMgdGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEgb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgdG8gdm1fZG1hX29wcywgdGhlIGZpbGUKICAqIHBvaW50ZXIsIGFuZCBjYWxscyB2bV9vcGVuKCkuCiAgKi8KLWludCBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBkcm1fbW1hcF9kbWEoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCWRybV9maWxlX3QJICpwcml2CSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QJICpkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZG1hLmMKaW5kZXggMjQ4NTdjYy4uMThlMGI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODEwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kbWEuYwpAQCAtOTAsMTYgKzkwLDcgQEAKICAgIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgxMF9idWZmZXJfZm9wcyA9IHsKLQkub3BlbgkgPSBkcm1fb3BlbiwKLQkuZmx1c2gJID0gZHJtX2ZsdXNoLAotCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCi0JLmlvY3RsCSA9IGRybV9pb2N0bCwKLQkubW1hcAkgPSBpODEwX21tYXBfYnVmZmVycywKLQkuZmFzeW5jICA9IGRybV9mYXN5bmMsCi19OwotCi1pbnQgaTgxMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBpODEwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJZHJtX2ZpbGVfdAkgICAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QJICAgICpkZXY7CkBAIC0xMjYsNiArMTE3LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4MTBfYnVmZmVyX2ZvcHMgPSB7CisJLm9wZW4JID0gZHJtX29wZW4sCisJLmZsdXNoCSA9IGRybV9mbHVzaCwKKwkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCS5pb2N0bAkgPSBkcm1faW9jdGwsCisJLm1tYXAJID0gaTgxMF9tbWFwX2J1ZmZlcnMsCisJLmZhc3luYyAgPSBkcm1fZmFzeW5jLAorfTsKKwogc3RhdGljIGludCBpODEwX21hcF9idWZmZXIoZHJtX2J1Zl90ICpidWYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOwpAQCAtMTAwMyw4ICsxMDAzLDggQEAKIAl9CiB9CiAKLWludCBpODEwX2ZsdXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBpODEwX2ZsdXNoX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogICAgCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogICAgCWRybV9kZXZpY2VfdAkgICpkZXYJICA9IHByaXYtPmhlYWQtPmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgxMF9kcnYuaAppbmRleCBmYTIzY2E0Li4xYjQwNTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MTBfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODEwX2Rydi5oCkBAIC0xMTUsNyArMTE1LDYgQEAKIAogCQkJCS8qIGk4MTBfZG1hLmMgKi8KIGV4dGVybiB2b2lkIGk4MTBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1leHRlcm4gaW50IGk4MTBfbW1hcF9idWZmZXJzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiAKIGV4dGVybiBpbnQgaTgxMF9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKmRldik7CiBleHRlcm4gdm9pZCBpODEwX2RyaXZlcl9yZWxlYXNlKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZG1hLmMKaW5kZXggOThhZGNjZi4uZGM3NzMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kbWEuYwpAQCAtOTIsMTYgKzkyLDcgQEAKICAgIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTgzMF9idWZmZXJfZm9wcyA9IHsKLQkub3BlbgkgPSBkcm1fb3BlbiwKLQkuZmx1c2gJID0gZHJtX2ZsdXNoLAotCS5yZWxlYXNlID0gZHJtX3JlbGVhc2UsCi0JLmlvY3RsCSA9IGRybV9pb2N0bCwKLQkubW1hcAkgPSBpODMwX21tYXBfYnVmZmVycywKLQkuZmFzeW5jICA9IGRybV9mYXN5bmMsCi19OwotCi1pbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBpODMwX21tYXBfYnVmZmVycyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJZHJtX2ZpbGVfdAkgICAgKnByaXYJICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlkcm1fZGV2aWNlX3QJICAgICpkZXY7CkBAIC0xMjgsNiArMTE5LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4MzBfYnVmZmVyX2ZvcHMgPSB7CisJLm9wZW4JID0gZHJtX29wZW4sCisJLmZsdXNoCSA9IGRybV9mbHVzaCwKKwkucmVsZWFzZSA9IGRybV9yZWxlYXNlLAorCS5pb2N0bAkgPSBkcm1faW9jdGwsCisJLm1tYXAJID0gaTgzMF9tbWFwX2J1ZmZlcnMsCisJLmZhc3luYyAgPSBkcm1fZmFzeW5jLAorfTsKKwogc3RhdGljIGludCBpODMwX21hcF9idWZmZXIoZHJtX2J1Zl90ICpidWYsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWRybV9maWxlX3QJICAqcHJpdgkgID0gZmlscC0+cHJpdmF0ZV9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5jCmluZGV4IGFhODBhZDYuLmJjMzZiZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuYworKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmMKQEAgLTQwLDcgKzQwLDcgQEAKIAogI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKIAotaW50IHBvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICkKK3N0YXRpYyBpbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQogewogCWRldi0+Y291bnRlcnMgKz0gNDsKIAlkZXYtPnR5cGVzWzZdID0gX0RSTV9TVEFUX0lSUTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9kcnYuaAppbmRleCBkNGIyZDA5Li5kZjc3NDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfZHJ2LmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pODMwX2Rydi5oCkBAIC0xMjMsOCArMTIzLDYgQEAKIC8qIGk4MzBfZG1hLmMgKi8KIGV4dGVybiB2b2lkIGk4MzBfcmVjbGFpbV9idWZmZXJzKGRybV9kZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiAKLWV4dGVybiBpbnQgaTgzMF9tbWFwX2J1ZmZlcnMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLQogLyogaTgzMF9pcnEuYyAqLwogZXh0ZXJuIGludCBpODMwX2lycV9lbWl0KCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgCiAJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k4MzBfaXJxLmMKaW5kZXggNmQ3NzI5Zi4uYTU5MjNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pODMwX2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTgzMF9pcnEuYwpAQCAtNTQsOCArNTQsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotCi1pbnQgaTgzMF9lbWl0X2lycShkcm1fZGV2aWNlX3QgKmRldikKK3N0YXRpYyBpbnQgaTgzMF9lbWl0X2lycShkcm1fZGV2aWNlX3QgKmRldikKIHsKIAlkcm1faTgzMF9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlSSU5HX0xPQ0FMUzsKQEAgLTczLDcgKzcyLDcgQEAKIH0KIAogCi1pbnQgaTgzMF93YWl0X2lycShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGlycV9ucikKK3N0YXRpYyBpbnQgaTgzMF93YWl0X2lycShkcm1fZGV2aWNlX3QgKmRldiwgaW50IGlycV9ucikKIHsKICAgCWRybV9pODMwX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAKIAkgICAoZHJtX2k4MzBfcHJpdmF0ZV90ICopZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwppbmRleCA3MzAwYTA5Li5hY2Y5ZTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCkBAIC0xLDEwICsxLDMwIEBACiAvKiBpOTE1X2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgSTkxNSAtKi0gbGludXgtYyAtKi0KICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKKyAqCiAgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgpAQCAtMTIsMjMgKzMyLDYgQEAKICNpbmNsdWRlICJpOTE1X2RybS5oIgogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAKLWRybV9pb2N0bF9kZXNjX3QgaTkxNV9pb2N0bHNbXSA9IHsKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVQpXSA9IHtpOTE1X2RtYV9pbml0LCAxLCAxfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZMVVNIKV0gPSB7aTkxNV9mbHVzaF9pb2N0bCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTElQKV0gPSB7aTkxNV9mbGlwX2J1ZnMsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQkFUQ0hCVUZGRVIpXSA9IHtpOTE1X2JhdGNoYnVmZmVyLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lSUV9FTUlUKV0gPSB7aTkxNV9pcnFfZW1pdCwgMSwgMH0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfV0FJVCldID0ge2k5MTVfaXJxX3dhaXQsIDEsIDB9LAotCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfR0VUUEFSQU0pXSA9IHtpOTE1X2dldHBhcmFtLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X1NFVFBBUkFNKV0gPSB7aTkxNV9zZXRwYXJhbSwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9BTExPQyldID0ge2k5MTVfbWVtX2FsbG9jLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0ZSRUUpXSA9IHtpOTE1X21lbV9mcmVlLCAxLCAwfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0lOSVRfSEVBUCldID0ge2k5MTVfbWVtX2luaXRfaGVhcCwgMSwgMX0sCi0JW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9DTURCVUZGRVIpXSA9IHtpOTE1X2NtZGJ1ZmZlciwgMSwgMH0KLX07Ci0KLWludCBpOTE1X21heF9pb2N0bCA9IERSTV9BUlJBWV9TSVpFKGk5MTVfaW9jdGxzKTsKLQogLyogUmVhbGx5IHdhbnQgYW4gT1MtaW5kZXBlbmRlbnQgcmVzZXR0YWJsZSB0aW1lci4gIFdvdWxkIGxpa2UgdG8gaGF2ZQogICogdGhpcyBsb29wIHJ1biBmb3IgKGVnKSAzIHNlYywgYnV0IGhhdmUgdGhlIHRpbWVyIHJlc2V0IGV2ZXJ5IHRpbWUKICAqIHRoZSBoZWFkIHBvaW50ZXIgY2hhbmdlcywgc28gdGhhdCBFQlVTWSBvbmx5IGhhcHBlbnMgaWYgdGhlIHJpbmcKQEAgLTc1LDcgKzc4LDcgQEAKIAkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBlcmZfYm94ZXMgfD0gSTkxNV9CT1hfUklOR19FTVBUWTsKIH0KIAotaW50IGk5MTVfZG1hX2NsZWFudXAoZHJtX2RldmljZV90ICogZGV2KQorc3RhdGljIGludCBpOTE1X2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldikKIHsKIAkvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgaGVyZSBiZWNhdXNlIHRoZSB1bmluc3RhbGwgaW9jdGwKIAkgKiBtYXkgbm90IGhhdmUgYmVlbiBjYWxsZWQgZnJvbSB1c2Vyc3BhY2UgYW5kIGFmdGVyIGRldl9wcml2YXRlCkBAIC0yMjcsNyArMjMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpCitzdGF0aWMgaW50IGk5MTVfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIAlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2OwpAQCAtNTM4LDcgKzU0MSw3IEBACiAJcmV0dXJuIGk5MTVfd2FpdF9yaW5nKGRldiwgZGV2X3ByaXYtPnJpbmcuU2l6ZSAtIDgsIF9fRlVOQ1RJT05fXyk7CiB9CiAKLWludCBpOTE1X2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAKQEAgLTU0Nyw3ICs1NTAsNyBAQAogCXJldHVybiBpOTE1X3F1aWVzY2VudChkZXYpOwogfQogCi1pbnQgaTkxNV9iYXRjaGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9iYXRjaGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC01ODEsNyArNTg0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaTkxNV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpCitzdGF0aWMgaW50IGk5MTVfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTYxNywxOCArNjIwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGk5MTVfZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCi17Ci0JZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Ci0KLQlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCWlmIChkZXZfcHJpdi0+Y3VycmVudF9wYWdlICE9IDApCi0JCWk5MTVfZGlzcGF0Y2hfZmxpcChkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpOTE1X2ZsaXBfYnVmcyhEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9mbGlwX2J1ZnMoRFJNX0lPQ1RMX0FSR1MpCiB7CiAJRFJNX0RFVklDRTsKIApAQCAtNjM5LDcgKzYzMSw3IEBACiAJcmV0dXJuIGk5MTVfZGlzcGF0Y2hfZmxpcChkZXYpOwogfQogCi1pbnQgaTkxNV9nZXRwYXJhbShEUk1fSU9DVExfQVJHUykKK3N0YXRpYyBpbnQgaTkxNV9nZXRwYXJhbShEUk1fSU9DVExfQVJHUykKIHsKIAlEUk1fREVWSUNFOwogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwpAQCAtNjc0LDcgKzY2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQorc3RhdGljIGludCBpOTE1X3NldHBhcmFtKERSTV9JT0NUTF9BUkdTKQogewogCURSTV9ERVZJQ0U7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC03MjMsMyArNzE1LDE5IEBACiAJfQogfQogCitkcm1faW9jdGxfZGVzY190IGk5MTVfaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JTklUKV0gPSB7aTkxNV9kbWFfaW5pdCwgMSwgMX0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GTFVTSCldID0ge2k5MTVfZmx1c2hfaW9jdGwsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfRkxJUCldID0ge2k5MTVfZmxpcF9idWZzLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0JBVENIQlVGRkVSKV0gPSB7aTkxNV9iYXRjaGJ1ZmZlciwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JUlFfRU1JVCldID0ge2k5MTVfaXJxX2VtaXQsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSVJRX1dBSVQpXSA9IHtpOTE1X2lycV93YWl0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0dFVFBBUkFNKV0gPSB7aTkxNV9nZXRwYXJhbSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9TRVRQQVJBTSldID0ge2k5MTVfc2V0cGFyYW0sIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQUxMT0MpXSA9IHtpOTE1X21lbV9hbGxvYywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GUkVFKV0gPSB7aTkxNV9tZW1fZnJlZSwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9JTklUX0hFQVApXSA9IHtpOTE1X21lbV9pbml0X2hlYXAsIDEsIDF9LAorCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQ01EQlVGRkVSKV0gPSB7aTkxNV9jbWRidWZmZXIsIDEsIDB9Cit9OworCitpbnQgaTkxNV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpOTE1X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKaW5kZXggN2U1NWVkZi4uMjNlMDI3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaApAQCAtMSwzICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogI2lmbmRlZiBfSTkxNV9EUk1fSF8KICNkZWZpbmUgX0k5MTVfRFJNX0hfCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuYwppbmRleCAwMDJiNzA4Li4xZjU5ZDNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5jCkBAIC0xLDExICsxLDMwIEBACiAvKiBpOTE1X2Rydi5jIC0tIGk4MzAsaTg0NSxpODU1LGk4NjUsaTkxNSBkcml2ZXIgLSotIGxpbnV4LWMgLSotCiAgKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAKKyAqCiAgKiBDb3B5cmlnaHQgMjAwMyBUdW5nc3RlbiBHcmFwaGljcywgSW5jLiwgQ2VkYXIgUGFyaywgVGV4YXMuCiAgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVFVOR1NURU4gR1JBUEhJQ1MgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSAiZHJtUC5oIgpAQCAtMTUsNyArMzQsNyBAQAogCiAjaW5jbHVkZSAiZHJtX3BjaWlkcy5oIgogCi1pbnQgcG9zdGluaXQoIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgKQorc3RhdGljIGludCBwb3N0aW5pdCggc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBmbGFncyApCiB7CiAJZGV2LT5jb3VudGVycyArPSA0OwogCWRldi0+dHlwZXNbNl0gPSBfRFJNX1NUQVRfSVJROwpAQCAtNzgsNiArOTcsOSBAQAogCQkubW1hcCA9IGRybV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJCS5jb21wYXRfaW9jdGwgPSBpOTE1X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCX0sCiAJLnBjaV9kcml2ZXIgPSB7CiAJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKaW5kZXggZjZjYTkyYS4uOWMzN2QyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaApAQCAtMSwxMCArMSwzMCBAQAogLyogaTkxNV9kcnYuaCAtLSBQcml2YXRlIGhlYWRlciBmb3IgdGhlIEk5MTUgZHJpdmVyIC0qLSBsaW51eC1jIC0qLQogICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAorICoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZm5kZWYgX0k5MTVfRFJWX0hfCkBAIC03OSwxNCArOTksNiBAQAogfSBkcm1faTkxNV9wcml2YXRlX3Q7CiAKIAkJCQkvKiBpOTE1X2RtYS5jICovCi1leHRlcm4gaW50IGk5MTVfZG1hX2luaXQoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldik7Ci1leHRlcm4gaW50IGk5MTVfZmx1c2hfaW9jdGwoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X2JhdGNoYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV9mbGlwX2J1ZnMoRFJNX0lPQ1RMX0FSR1MpOwotZXh0ZXJuIGludCBpOTE1X2dldHBhcmFtKERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV9zZXRwYXJhbShEUk1fSU9DVExfQVJHUyk7Ci1leHRlcm4gaW50IGk5MTVfY21kYnVmZmVyKERSTV9JT0NUTF9BUkdTKTsKIGV4dGVybiB2b2lkIGk5MTVfa2VybmVsX2xvc3RfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKQEAgLTk0LDggKzEwNiw2IEBACiAvKiBpOTE1X2lycS5jICovCiBleHRlcm4gaW50IGk5MTVfaXJxX2VtaXQoRFJNX0lPQ1RMX0FSR1MpOwogZXh0ZXJuIGludCBpOTE1X2lycV93YWl0KERSTV9JT0NUTF9BUkdTKTsKLWV4dGVybiBpbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpOwotZXh0ZXJuIGludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldik7CiAKIGV4dGVybiBpcnFyZXR1cm5fdCBpOTE1X2RyaXZlcl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICpkZXYpOwpAQCAtMTEwLDYgKzEyMCwxMCBAQAogZXh0ZXJuIHZvaWQgaTkxNV9tZW1fcmVsZWFzZShkcm1fZGV2aWNlX3QgKiBkZXYsCiAJCQkgICAgIERSTUZJTEUgZmlscCwgc3RydWN0IG1lbV9ibG9jayAqaGVhcCk7CiAKK2V4dGVybiBsb25nIGk5MTVfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpOworCisKICNkZWZpbmUgSTkxNV9SRUFEKHJlZykgICAgICAgICAgRFJNX1JFQUQzMihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZykKICNkZWZpbmUgSTkxNV9XUklURShyZWcsdmFsKSAgICAgRFJNX1dSSVRFMzIoZGV2X3ByaXYtPm1taW9fbWFwLCByZWcsIHZhbCkKICNkZWZpbmUgSTkxNV9SRUFEMTYocmVnKSAJRFJNX1JFQUQxNihkZXZfcHJpdi0+bW1pb19tYXAsIHJlZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pb2MzMi5jIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lvYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwMDllMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pb2MzMi5jCkBAIC0wLDAgKzEsMjIxIEBACisvKioKKyAqIFxmaWxlIGk5MTVfaW9jMzIuYworICoKKyAqIDMyLWJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IHJvdXRpbmVzIGZvciB0aGUgaTkxNSBEUk0uCisgKgorICogXGF1dGhvciBBbGFuIEhvdXJpaGFuZSA8YWxhbmhAZmFpcmxpdGUuZGVtb24uY28udWs+IAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDIwMDUKKyAqIENvcHlyaWdodCAoQykgQWxhbiBIb3VyaWhhbmUgMjAwNQorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJpOTE1X2RybS5oIgorCit0eXBlZGVmIHN0cnVjdCBfZHJtX2k5MTVfYmF0Y2hidWZmZXIzMiB7CisJaW50IHN0YXJ0OwkJLyogYWdwIG9mZnNldCAqLworCWludCB1c2VkOwkJLyogbnIgYnl0ZXMgaW4gdXNlICovCisJaW50IERSMTsJCS8qIGh3IGZsYWdzIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLworCWludCBEUjQ7CQkvKiB3aW5kb3cgb3JpZ2luIGZvciBHRlhfT1BfRFJBV1JFQ1RfSU5GTyAqLworCWludCBudW1fY2xpcHJlY3RzOwkvKiBtdWxpdHBhc3Mgd2l0aCBtdWx0aXBsZSBjbGlwcmVjdHM/ICovCisJdTMyIGNsaXByZWN0czsJLyogcG9pbnRlciB0byB1c2Vyc3BhY2UgY2xpcHJlY3RzICovCit9IGRybV9pOTE1X2JhdGNoYnVmZmVyMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfaTkxNV9iYXRjaGJ1ZmZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9pOTE1X2JhdGNoYnVmZmVyMzJfdCBiYXRjaGJ1ZmZlcjMyOworCWRybV9pOTE1X2JhdGNoYnVmZmVyX3QgX191c2VyICpiYXRjaGJ1ZmZlcjsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJhdGNoYnVmZmVyMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGJhdGNoYnVmZmVyMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJYmF0Y2hidWZmZXIgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmJhdGNoYnVmZmVyKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBiYXRjaGJ1ZmZlciwgc2l6ZW9mKCpiYXRjaGJ1ZmZlcikpCisJICAgIHx8IF9fcHV0X3VzZXIoYmF0Y2hidWZmZXIzMi5zdGFydCwgJmJhdGNoYnVmZmVyLT5zdGFydCkKKwkgICAgfHwgX19wdXRfdXNlcihiYXRjaGJ1ZmZlcjMyLnVzZWQsICZiYXRjaGJ1ZmZlci0+dXNlZCkKKwkgICAgfHwgX19wdXRfdXNlcihiYXRjaGJ1ZmZlcjMyLkRSMSwgJmJhdGNoYnVmZmVyLT5EUjEpCisJICAgIHx8IF9fcHV0X3VzZXIoYmF0Y2hidWZmZXIzMi5EUjQsICZiYXRjaGJ1ZmZlci0+RFI0KQorCSAgICB8fCBfX3B1dF91c2VyKGJhdGNoYnVmZmVyMzIubnVtX2NsaXByZWN0cywgJmJhdGNoYnVmZmVyLT5udW1fY2xpcHJlY3RzKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYmF0Y2hidWZmZXIzMi5jbGlwcmVjdHMsCisJCQkgICZiYXRjaGJ1ZmZlci0+Y2xpcHJlY3RzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfSTkxNV9CQVRDSEJVRkZFUiwgKHVuc2lnbmVkIGxvbmcpIGJhdGNoYnVmZmVyKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV9pOTE1X2NtZGJ1ZmZlcjMyIHsKKwl1MzIgYnVmOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjb21tYW5kIGJ1ZmZlciAqLworCWludCBzejsJCQkvKiBuciBieXRlcyBpbiBidWYgKi8KKwlpbnQgRFIxOwkJLyogaHcgZmxhZ3MgZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IERSNDsJCS8qIHdpbmRvdyBvcmlnaW4gZm9yIEdGWF9PUF9EUkFXUkVDVF9JTkZPICovCisJaW50IG51bV9jbGlwcmVjdHM7CS8qIG11bGl0cGFzcyB3aXRoIG11bHRpcGxlIGNsaXByZWN0cz8gKi8KKwl1MzIgY2xpcHJlY3RzOwkvKiBwb2ludGVyIHRvIHVzZXJzcGFjZSBjbGlwcmVjdHMgKi8KK30gZHJtX2k5MTVfY21kYnVmZmVyMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfaTkxNV9jbWRidWZmZXIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1faTkxNV9jbWRidWZmZXIzMl90IGNtZGJ1ZmZlcjMyOworCWRybV9pOTE1X2NtZGJ1ZmZlcl90IF9fdXNlciAqY21kYnVmZmVyOworCQorCWlmIChjb3B5X2Zyb21fdXNlcigmY21kYnVmZmVyMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGNtZGJ1ZmZlcjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWNtZGJ1ZmZlciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqY21kYnVmZmVyKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBjbWRidWZmZXIsIHNpemVvZigqY21kYnVmZmVyKSkKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWNtZGJ1ZmZlcjMyLmJ1ZiwKKwkJCSAgJmNtZGJ1ZmZlci0+YnVmKQorCSAgICB8fCBfX3B1dF91c2VyKGNtZGJ1ZmZlcjMyLnN6LCAmY21kYnVmZmVyLT5zeikKKwkgICAgfHwgX19wdXRfdXNlcihjbWRidWZmZXIzMi5EUjEsICZjbWRidWZmZXItPkRSMSkKKwkgICAgfHwgX19wdXRfdXNlcihjbWRidWZmZXIzMi5EUjQsICZjbWRidWZmZXItPkRSNCkKKwkgICAgfHwgX19wdXRfdXNlcihjbWRidWZmZXIzMi5udW1fY2xpcHJlY3RzLCAmY21kYnVmZmVyLT5udW1fY2xpcHJlY3RzKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpY21kYnVmZmVyMzIuY2xpcHJlY3RzLAorCQkJICAmY21kYnVmZmVyLT5jbGlwcmVjdHMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9JOTE1X0NNREJVRkZFUiwgKHVuc2lnbmVkIGxvbmcpIGNtZGJ1ZmZlcik7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2lycV9lbWl0MzIgeworCXUzMiBpcnFfc2VxOworfSBkcm1faTkxNV9pcnFfZW1pdDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X2k5MTVfaXJxX2VtaXQoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1faTkxNV9pcnFfZW1pdDMyX3QgcmVxMzI7CisJZHJtX2k5MTVfaXJxX2VtaXRfdCBfX3VzZXIgKnJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIuaXJxX3NlcSwKKwkJCSAgJnJlcXVlc3QtPmlycV9zZXEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0k5MTVfSVJRX0VNSVQsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X2dldHBhcmFtMzIgeworCWludCBwYXJhbTsKKwl1MzIgdmFsdWU7Cit9IGRybV9pOTE1X2dldHBhcmFtMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfaTkxNV9nZXRwYXJhbShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9pOTE1X2dldHBhcmFtMzJfdCByZXEzMjsKKwlkcm1faTkxNV9nZXRwYXJhbV90IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIucGFyYW0sICZyZXF1ZXN0LT5wYXJhbSkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi52YWx1ZSwKKwkJCSAgJnJlcXVlc3QtPnZhbHVlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9JOTE1X0dFVFBBUkFNLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X21lbV9hbGxvYzMyIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJdTMyIHJlZ2lvbl9vZmZzZXQ7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZiIG9yIGFncCAqLworfSBkcm1faTkxNV9tZW1fYWxsb2MzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9pOTE1X2FsbG9jKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX2k5MTVfbWVtX2FsbG9jMzJfdCByZXEzMjsKKwlkcm1faTkxNV9tZW1fYWxsb2NfdCBfX3VzZXIgKnJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLnJlZ2lvbiwgJnJlcXVlc3QtPnJlZ2lvbikKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5hbGlnbm1lbnQsICZyZXF1ZXN0LT5hbGlnbm1lbnQpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIuc2l6ZSwgJnJlcXVlc3QtPnNpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIucmVnaW9uX29mZnNldCwKKwkJCSAgJnJlcXVlc3QtPnJlZ2lvbl9vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX0k5MTVfQUxMT0MsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKworCitkcm1faW9jdGxfY29tcGF0X3QgKmk5MTVfY29tcGF0X2lvY3Rsc1tdID0geworCVtEUk1fSTkxNV9CQVRDSEJVRkZFUl0gPSBjb21wYXRfaTkxNV9iYXRjaGJ1ZmZlciwKKwlbRFJNX0k5MTVfQ01EQlVGRkVSXSA9IGNvbXBhdF9pOTE1X2NtZGJ1ZmZlciwKKwlbRFJNX0k5MTVfR0VUUEFSQU1dID0gY29tcGF0X2k5MTVfZ2V0cGFyYW0sCisJW0RSTV9JOTE1X0lSUV9FTUlUXSA9IGNvbXBhdF9pOTE1X2lycV9lbWl0LAorCVtEUk1fSTkxNV9BTExPQ10gPSBjb21wYXRfaTkxNV9hbGxvYworfTsKKworLyoqCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSAzMi1iaXQgcHJvY2VzcyBydW5uaW5nIHVuZGVyIGEgNjQtYml0IGtlcm5lbAorICogcGVyZm9ybXMgYW4gaW9jdGwgb24gL2Rldi9kcmkvY2FyZDxuPi4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworbG9uZyBpOTE1X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKKwlkcm1faW9jdGxfY29tcGF0X3QgKmZuID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKKwkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOworCQorCWlmIChuciA8IERSTV9DT01NQU5EX0JBU0UgKyBEUk1fQVJSQVlfU0laRShpOTE1X2NvbXBhdF9pb2N0bHMpKQorCQlmbiA9IGk5MTVfY29tcGF0X2lvY3Rsc1tuciAtIERSTV9DT01NQU5EX0JBU0VdOworCisJbG9ja19rZXJuZWwoKTsJCS8qIFhYWCBmb3Igbm93ICovCisJaWYgKGZuICE9IE5VTEwpCisJCXJldCA9ICgqZm4pKGZpbHAsIGNtZCwgYXJnKTsKKwllbHNlCisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlscCwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKaW5kZXggYjAyMzkyNi4uNGZhNDQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwpAQCAtMSwxMCArMSwzMCBAQAogLyogaTkxNV9kbWEuYyAtLSBETUEgc3VwcG9ydCBmb3IgdGhlIEk5MTUgLSotIGxpbnV4LWMgLSotCiAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCisgKgogICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImRybVAuaCIKQEAgLTM2LDcgKzU2LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLWludCBpOTE1X2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqIGRldikKK3N0YXRpYyBpbnQgaTkxNV9lbWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYpCiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdTMyIHJldDsKQEAgLTU2LDcgKzc2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaTkxNV93YWl0X2lycShkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBpcnFfbnIpCitzdGF0aWMgaW50IGk5MTVfd2FpdF9pcnEoZHJtX2RldmljZV90ICogZGV2LCBpbnQgaXJxX25yKQogewogCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX2k5MTVfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CiAJaW50IHJldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfbWVtLmMKaW5kZXggZDU0YTMwMC4uOWIxNjk4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9tZW0uYwpAQCAtMSwxMCArMSwzMCBAQAogLyogaTkxNV9tZW0uYyAtLSBTaW1wbGUgYWdwL2ZiIG1lbW9yeSBtYW5hZ2VyIGZvciBpOTE1IC0qLSBsaW51eC1jIC0qLQogICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAorICoKICAqIENvcHlyaWdodCAyMDAzIFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUZXhhcy4KICAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiAKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUVU5HU1RFTiBHUkFQSElDUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJkcm1QLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCmluZGV4IDIyZGFiM2UuLjg0NGNjYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5jCkBAIC0xMDEsNiArMTAxLDkgQEAKIAkJLm1tYXAgPSBkcm1fbW1hcCwKIAkJLnBvbGwgPSBkcm1fcG9sbCwKIAkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQkuY29tcGF0X2lvY3RsID0gbWdhX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCX0sCiAJLnBjaV9kcml2ZXIgPSB7CiAJCS5uYW1lID0gRFJJVkVSX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2Rydi5oCmluZGV4IDFkODRhMWUuLjk0MTJlMjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL21nYV9kcnYuaApAQCAtMTM3LDYgKzEzNyw4IEBACiBleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV9wcmVpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApOwogZXh0ZXJuIHZvaWQgbWdhX2RyaXZlcl9pcnFfcG9zdGluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CiBleHRlcm4gdm9pZCBtZ2FfZHJpdmVyX2lycV91bmluc3RhbGwoIGRybV9kZXZpY2VfdCAqZGV2ICk7CitleHRlcm4gbG9uZyBtZ2FfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAKICNkZWZpbmUgbWdhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKQlEUk1fV1JJVEVNRU1PUllCQVJSSUVSKCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9tZ2FfaW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3NDVjZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vbWdhX2lvYzMyLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qKgorICogXGZpbGUgbWdhX2lvYzMyLmMKKyAqCisgKiAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgdGhlIE1HQSBEUk0uCisgKgorICogXGF1dGhvciBEYXZlIEFpcmxpZSA8YWlybGllZEBsaW51eC5pZT4gd2l0aCBjb2RlIGZyb20gcGF0Y2hlcyBieSBFZ2JlcnQgRWljaAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDIwMDUKKyAqIENvcHlyaWdodCAoQykgRWdiZXJ0IEVpY2ggMjAwMywyMDA0CisgKiBDb3B5cmlnaHQgKEMpIERhdmUgQWlybGllIDIwMDUKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAibWdhX2RybS5oIgorCit0eXBlZGVmIHN0cnVjdCBkcm0zMl9tZ2FfaW5pdCB7CisJaW50IGZ1bmM7CisgICAJdTMyIHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBjaGlwc2V0OworICAgCWludCBzZ3JhbTsKKwl1bnNpZ25lZCBpbnQgbWFjY2VzczsKKyAgIAl1bnNpZ25lZCBpbnQgZmJfY3BwOworCXVuc2lnbmVkIGludCBmcm9udF9vZmZzZXQsIGZyb250X3BpdGNoOworICAgCXVuc2lnbmVkIGludCBiYWNrX29mZnNldCwgYmFja19waXRjaDsKKyAgIAl1bnNpZ25lZCBpbnQgZGVwdGhfY3BwOworICAgCXVuc2lnbmVkIGludCBkZXB0aF9vZmZzZXQsIGRlcHRoX3BpdGNoOworICAgCXVuc2lnbmVkIGludCB0ZXh0dXJlX29mZnNldFtNR0FfTlJfVEVYX0hFQVBTXTsKKyAgIAl1bnNpZ25lZCBpbnQgdGV4dHVyZV9zaXplW01HQV9OUl9URVhfSEVBUFNdOworCXUzMiBmYl9vZmZzZXQ7CisJdTMyIG1taW9fb2Zmc2V0OworCXUzMiBzdGF0dXNfb2Zmc2V0OworCXUzMiB3YXJwX29mZnNldDsKKwl1MzIgcHJpbWFyeV9vZmZzZXQ7CisJdTMyIGJ1ZmZlcnNfb2Zmc2V0OworfSBkcm1fbWdhX2luaXQzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9tZ2FfaW5pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9tZ2FfaW5pdDMyX3QgaW5pdDMyOworCWRybV9tZ2FfaW5pdF90IF9fdXNlciAqaW5pdDsKKwlpbnQgZXJyID0gMCwgaTsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW5pdDMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWluaXQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmluaXQpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGluaXQsIHNpemVvZigqaW5pdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZ1bmMsICZpbml0LT5mdW5jKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5zYXJlYV9wcml2X29mZnNldCwgJmluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5jaGlwc2V0LCAmaW5pdC0+Y2hpcHNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuc2dyYW0sICZpbml0LT5zZ3JhbSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIubWFjY2VzcywgJmluaXQtPm1hY2Nlc3MpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZiX2NwcCwgJmluaXQtPmZiX2NwcCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnJvbnRfb2Zmc2V0LCAmaW5pdC0+ZnJvbnRfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mcm9udF9waXRjaCwgJmluaXQtPmZyb250X3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5iYWNrX29mZnNldCwgJmluaXQtPmJhY2tfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5iYWNrX3BpdGNoLCAmaW5pdC0+YmFja19waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfY3BwLCAmaW5pdC0+ZGVwdGhfY3BwKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9vZmZzZXQsICZpbml0LT5kZXB0aF9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX3BpdGNoLCAmaW5pdC0+ZGVwdGhfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZiX29mZnNldCwgJmluaXQtPmZiX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIubW1pb19vZmZzZXQsICZpbml0LT5tbWlvX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuc3RhdHVzX29mZnNldCwgJmluaXQtPnN0YXR1c19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLndhcnBfb2Zmc2V0LCAmaW5pdC0+d2FycF9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnByaW1hcnlfb2Zmc2V0LCAmaW5pdC0+cHJpbWFyeV9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJ1ZmZlcnNfb2Zmc2V0LCAmaW5pdC0+YnVmZmVyc19vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlmb3IgKGk9MDsgaTxNR0FfTlJfVEVYX0hFQVBTOyBpKyspCisJeworCQllcnIgfD0gX19wdXRfdXNlcihpbml0MzIudGV4dHVyZV9vZmZzZXRbaV0sICZpbml0LT50ZXh0dXJlX29mZnNldFtpXSk7CisJCWVyciB8PSBfX3B1dF91c2VyKGluaXQzMi50ZXh0dXJlX3NpemVbaV0sICZpbml0LT50ZXh0dXJlX3NpemVbaV0pOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9NR0FfSU5JVCwgKHVuc2lnbmVkIGxvbmcpIGluaXQpOworfQorCisKK3R5cGVkZWYgc3RydWN0IGRybV9tZ2FfZ2V0cGFyYW0zMiB7CisJaW50IHBhcmFtOworCXUzMiB2YWx1ZTsKK30gZHJtX21nYV9nZXRwYXJhbTMyX3Q7CisKKworc3RhdGljIGludCBjb21wYXRfbWdhX2dldHBhcmFtKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9tZ2FfZ2V0cGFyYW0zMl90IGdldHBhcmFtMzI7CisJZHJtX21nYV9nZXRwYXJhbV90IF9fdXNlciAqZ2V0cGFyYW07CisJCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXRwYXJhbTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihnZXRwYXJhbTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZ2V0cGFyYW0gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmdldHBhcmFtKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBnZXRwYXJhbSwgc2l6ZW9mKCpnZXRwYXJhbSkpCisJICAgIHx8IF9fcHV0X3VzZXIoZ2V0cGFyYW0zMi5wYXJhbSwgJmdldHBhcmFtLT5wYXJhbSkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylnZXRwYXJhbTMyLnZhbHVlLCAmZ2V0cGFyYW0tPnZhbHVlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLCAKKwkJCSBEUk1fSU9DVExfTUdBX0dFVFBBUkFNLCAodW5zaWduZWQgbG9uZylnZXRwYXJhbSk7Cit9CisKK2RybV9pb2N0bF9jb21wYXRfdCAqbWdhX2NvbXBhdF9pb2N0bHNbXSA9IHsKKwlbRFJNX01HQV9JTklUXSA9IGNvbXBhdF9tZ2FfaW5pdCwKKwlbRFJNX01HQV9HRVRQQVJBTV0gPSBjb21wYXRfbWdhX2dldHBhcmFtLAorfTsKKworLyoqCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSAzMi1iaXQgcHJvY2VzcyBydW5uaW5nIHVuZGVyIGEgNjQtYml0IGtlcm5lbAorICogcGVyZm9ybXMgYW4gaW9jdGwgb24gL2Rldi9kcmkvY2FyZDxuPi4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworbG9uZyBtZ2FfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm4gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFKQorCQlyZXR1cm4gZHJtX2NvbXBhdF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKG1nYV9jb21wYXRfaW9jdGxzKSkKKwkJZm4gPSBtZ2FfY29tcGF0X2lvY3Rsc1tuciAtIERSTV9DT01NQU5EX0JBU0VdOworCisJbG9ja19rZXJuZWwoKTsJCS8qIFhYWCBmb3Igbm93ICovCisJaWYgKGZuICE9IE5VTEwpCisJCXJldCA9ICgqZm4pKGZpbHAsIGNtZCwgYXJnKTsKKwllbHNlCisJCXJldCA9IGRybV9pb2N0bChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlscCwgY21kLCBhcmcpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmMKaW5kZXggY2VkNjM4MS4uYmM0NDZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuYwpAQCAtOTYsNiArOTYsOSBAQAogCQkubW1hcCA9IGRybV9tbWFwLAogCQkucG9sbCA9IGRybV9wb2xsLAogCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJCS5jb21wYXRfaW9jdGwgPSByMTI4X2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCX0sCiAJLnBjaV9kcml2ZXIgPSB7CiAJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKaW5kZXggY2YxYWE1ZC4uMGZiNjg3YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfZHJ2LmgKQEAgLTE1Niw2ICsxNTYsOSBAQAogZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJldGFrZWRvd24oZHJtX2RldmljZV90ICpkZXYpOwogZXh0ZXJuIHZvaWQgcjEyOF9kcml2ZXJfcHJlcmVsZWFzZShkcm1fZGV2aWNlX3QgKmRldiwgRFJNRklMRSBmaWxwKTsKIAorZXh0ZXJuIGxvbmcgcjEyOF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CisKIC8qIFJlZ2lzdGVyIGRlZmluaXRpb25zLCByZWdpc3RlciBhY2Nlc3MgbWFjcm9zIGFuZCBkcm1BZGRNYXAgY29uc3RhbnRzCiAgKiBmb3IgUmFnZSAxMjgga2VybmVsIGRyaXZlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3IxMjhfaW9jMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDU5OGVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X2lvYzMyLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qKgorICogXGZpbGUgcjEyOF9pb2MzMi5jCisgKgorICogMzItYml0IGlvY3RsIGNvbXBhdGliaWxpdHkgcm91dGluZXMgZm9yIHRoZSBSMTI4IERSTS4KKyAqCisgKiBcYXV0aG9yIERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPiB3aXRoIGNvZGUgZnJvbSBwYXRjaGVzIGJ5IEVnYmVydCBFaWNoCisgKgorICogQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAyMDA1CisgKiBDb3B5cmlnaHQgKEMpIEVnYmVydCBFaWNoIDIwMDMsMjAwNAorICogQ29weXJpZ2h0IChDKSBEYXZlIEFpcmxpZSAyMDA1CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwzMi5oPgorCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInIxMjhfZHJtLmgiCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2luaXQzMiB7CisJaW50IGZ1bmM7CisJdW5zaWduZWQgaW50IHNhcmVhX3ByaXZfb2Zmc2V0OworCWludCBpc19wY2k7CisJaW50IGNjZV9tb2RlOworCWludCBjY2Vfc2VjdXJlOworCWludCByaW5nX3NpemU7CisJaW50IHVzZWNfdGltZW91dDsKKworCXVuc2lnbmVkIGludCBmYl9icHA7CisJdW5zaWduZWQgaW50IGZyb250X29mZnNldCwgZnJvbnRfcGl0Y2g7CisJdW5zaWduZWQgaW50IGJhY2tfb2Zmc2V0LCBiYWNrX3BpdGNoOworCXVuc2lnbmVkIGludCBkZXB0aF9icHA7CisJdW5zaWduZWQgaW50IGRlcHRoX29mZnNldCwgZGVwdGhfcGl0Y2g7CisJdW5zaWduZWQgaW50IHNwYW5fb2Zmc2V0OworCisJdW5zaWduZWQgaW50IGZiX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgbW1pb19vZmZzZXQ7CisJdW5zaWduZWQgaW50IHJpbmdfb2Zmc2V0OworCXVuc2lnbmVkIGludCByaW5nX3JwdHJfb2Zmc2V0OworCXVuc2lnbmVkIGludCBidWZmZXJzX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYWdwX3RleHR1cmVzX29mZnNldDsKK30gZHJtX3IxMjhfaW5pdDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3IxMjhfaW5pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcjEyOF9pbml0MzJfdCBpbml0MzI7CisJZHJtX3IxMjhfaW5pdF90IF9fdXNlciAqaW5pdDsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJmluaXQzMiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW5pdDMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWluaXQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmluaXQpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGluaXQsIHNpemVvZigqaW5pdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZ1bmMsICZpbml0LT5mdW5jKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5zYXJlYV9wcml2X29mZnNldCwgJmluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5pc19wY2ksICZpbml0LT5pc19wY2kpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmNjZV9tb2RlLCAmaW5pdC0+Y2NlX21vZGUpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmNjZV9zZWN1cmUsICZpbml0LT5jY2Vfc2VjdXJlKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5yaW5nX3NpemUsICZpbml0LT5yaW5nX3NpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnVzZWNfdGltZW91dCwgJmluaXQtPnVzZWNfdGltZW91dCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZmJfYnBwLCAmaW5pdC0+ZmJfYnBwKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mcm9udF9vZmZzZXQsICZpbml0LT5mcm9udF9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZyb250X3BpdGNoLCAmaW5pdC0+ZnJvbnRfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJhY2tfb2Zmc2V0LCAmaW5pdC0+YmFja19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmJhY2tfcGl0Y2gsICZpbml0LT5iYWNrX3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9icHAsICZpbml0LT5kZXB0aF9icHApCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX29mZnNldCwgJmluaXQtPmRlcHRoX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfcGl0Y2gsICZpbml0LT5kZXB0aF9waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuc3Bhbl9vZmZzZXQsICZpbml0LT5zcGFuX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZmJfb2Zmc2V0LCAmaW5pdC0+ZmJfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5tbWlvX29mZnNldCwgJmluaXQtPm1taW9fb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5yaW5nX29mZnNldCwgJmluaXQtPnJpbmdfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5yaW5nX3JwdHJfb2Zmc2V0LCAmaW5pdC0+cmluZ19ycHRyX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYnVmZmVyc19vZmZzZXQsICZpbml0LT5idWZmZXJzX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYWdwX3RleHR1cmVzX29mZnNldCwgJmluaXQtPmFncF90ZXh0dXJlc19vZmZzZXQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SMTI4X0lOSVQsICh1bnNpZ25lZCBsb25nKWluaXQpOworfQorCisKK3R5cGVkZWYgc3RydWN0IGRybV9yMTI4X2RlcHRoMzIgeworCWludCBmdW5jOworCWludCBuOworCXUzMiB4OworCXUzMiB5OworCXUzMiBidWZmZXI7CisJdTMyIG1hc2s7Cit9IGRybV9yMTI4X2RlcHRoMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcjEyOF9kZXB0aChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3IxMjhfZGVwdGgzMl90IGRlcHRoMzI7CisJZHJtX3IxMjhfZGVwdGhfdCBfX3VzZXIgKmRlcHRoOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkZXB0aDMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihkZXB0aDMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGVwdGggPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmRlcHRoKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkZXB0aCwgc2l6ZW9mKCpkZXB0aCkpCisJICAgIHx8IF9fcHV0X3VzZXIoZGVwdGgzMi5mdW5jLCAmZGVwdGgtPmZ1bmMpCisJICAgIHx8IF9fcHV0X3VzZXIoZGVwdGgzMi5uLCAmZGVwdGgtPm4pCisJICAgIHx8IF9fcHV0X3VzZXIoKGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylkZXB0aDMyLngsICZkZXB0aC0+eCkKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWRlcHRoMzIueSwgJmRlcHRoLT55KQorCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpZGVwdGgzMi5idWZmZXIsICZkZXB0aC0+YnVmZmVyKQorCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWRlcHRoMzIubWFzaywgJmRlcHRoLT5tYXNrKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUjEyOF9ERVBUSCwgKHVuc2lnbmVkIGxvbmcpZGVwdGgpOwkKKwkKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3IxMjhfc3RpcHBsZTMyIHsKKwl1MzIgbWFzazsKK30gZHJtX3IxMjhfc3RpcHBsZTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3IxMjhfc3RpcHBsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcjEyOF9zdGlwcGxlMzJfdCBzdGlwcGxlMzI7CisJZHJtX3IxMjhfc3RpcHBsZV90IF9fdXNlciAqc3RpcHBsZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmc3RpcHBsZTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdGlwcGxlMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdGlwcGxlID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpzdGlwcGxlKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBzdGlwcGxlLCBzaXplb2YoKnN0aXBwbGUpKQorCSAgICB8fCBfX3B1dF91c2VyKCh1bnNpZ25lZCBpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpc3RpcHBsZTMyLm1hc2ssICZzdGlwcGxlLT5tYXNrKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SMTI4X1NUSVBQTEUsICh1bnNpZ25lZCBsb25nKXN0aXBwbGUpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcjEyOF9nZXRwYXJhbTMyIHsKKwlpbnQgcGFyYW07CisJdTMyIHZhbHVlOworfSBkcm1fcjEyOF9nZXRwYXJhbTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3IxMjhfZ2V0cGFyYW0oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3IxMjhfZ2V0cGFyYW0zMl90IGdldHBhcmFtMzI7CisJZHJtX3IxMjhfZ2V0cGFyYW1fdCBfX3VzZXIgKmdldHBhcmFtOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXRwYXJhbTMyLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihnZXRwYXJhbTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZ2V0cGFyYW0gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmdldHBhcmFtKSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBnZXRwYXJhbSwgc2l6ZW9mKCpnZXRwYXJhbSkpCisJICAgIHx8IF9fcHV0X3VzZXIoZ2V0cGFyYW0zMi5wYXJhbSwgJmdldHBhcmFtLT5wYXJhbSkKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylnZXRwYXJhbTMyLnZhbHVlLCAmZ2V0cGFyYW0tPnZhbHVlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUjEyOF9HRVRQQVJBTSwgKHVuc2lnbmVkIGxvbmcpZ2V0cGFyYW0pOworfQorCitkcm1faW9jdGxfY29tcGF0X3QgKnIxMjhfY29tcGF0X2lvY3Rsc1tdID0geworCVtEUk1fUjEyOF9JTklUXSA9IGNvbXBhdF9yMTI4X2luaXQsCisJW0RSTV9SMTI4X0RFUFRIXSA9IGNvbXBhdF9yMTI4X2RlcHRoLAorCVtEUk1fUjEyOF9TVElQUExFXSA9IGNvbXBhdF9yMTI4X3N0aXBwbGUsCisJW0RSTV9SMTI4X0dFVFBBUkFNXSA9IGNvbXBhdF9yMTI4X2dldHBhcmFtLAorfTsKKworLyoqCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSAzMi1iaXQgcHJvY2VzcyBydW5uaW5nIHVuZGVyIGEgNjQtYml0IGtlcm5lbAorICogcGVyZm9ybXMgYW4gaW9jdGwgb24gL2Rldi9kcmkvY2FyZDxuPi4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworbG9uZyByMTI4X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbnIgPSBEUk1fSU9DVExfTlIoY21kKTsKKwlkcm1faW9jdGxfY29tcGF0X3QgKmZuID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSkKKwkJcmV0dXJuIGRybV9jb21wYXRfaW9jdGwoZmlscCwgY21kLCBhcmcpOworCisJaWYgKG5yIDwgRFJNX0NPTU1BTkRfQkFTRSArIERSTV9BUlJBWV9TSVpFKHIxMjhfY29tcGF0X2lvY3RscykpCisJCWZuID0gcjEyOF9jb21wYXRfaW9jdGxzW25yIC0gRFJNX0NPTU1BTkRfQkFTRV07CisKKwlsb2NrX2tlcm5lbCgpOwkJLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcjEyOF9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKaW5kZXggNTNhZjY5MS4uNDI2YTcxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yMTI4X3N0YXRlLmMKQEAgLTEzMDcsNyArMTMwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByMTI4X2RvX2NsZWFudXBfcGFnZWZsaXAoIGRybV9kZXZpY2VfdCAqZGV2ICkKK3N0YXRpYyBpbnQgcjEyOF9kb19jbGVhbnVwX3BhZ2VmbGlwKCBkcm1fZGV2aWNlX3QgKmRldiApCiB7CiAJZHJtX3IxMjhfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJRFJNX0RFQlVHKCAiXG4iICk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCmluZGV4IDdiOTgzZDkuLjE4ZTRlNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5jCkBAIC0xMDEsNiArMTAxLDkgQEAKIAkJLm1tYXAgPSBkcm1fbW1hcCwKIAkJLnBvbGwgPSBkcm1fcG9sbCwKIAkJLmZhc3luYyA9IGRybV9mYXN5bmMsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCQkuY29tcGF0X2lvY3RsID0gcmFkZW9uX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgogCX0sCiAJLnBjaV9kcml2ZXIgPSB7CiAJCS5uYW1lICAgICAgICAgID0gRFJJVkVSX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaCBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCmluZGV4IDU4MzcwOTguLjc3MWFhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2Rydi5oCkBAIC0zMTcsNiArMzE3LDkgQEAKIGV4dGVybiBpbnQgcmFkZW9uX3Bvc3Rpbml0KCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzICk7CiBleHRlcm4gaW50IHJhZGVvbl9wb3N0Y2xlYW51cCggc3RydWN0IGRybV9kZXZpY2UgKmRldiApOwogCitleHRlcm4gbG9uZyByYWRlb25fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKKwogLyogRmxhZ3MgZm9yIHN0YXRzLmJveGVzCiAgKi8KICNkZWZpbmUgUkFERU9OX0JPWF9ETUFfSURMRSAgICAgIDB4MQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faW9jMzIuYyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lvYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlNjEyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lvYzMyLmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qKgorICogXGZpbGUgcmFkZW9uX2lvYzMyLmMKKyAqCisgKiAzMi1iaXQgaW9jdGwgY29tcGF0aWJpbGl0eSByb3V0aW5lcyBmb3IgdGhlIFJhZGVvbiBEUk0uCisgKgorICogXGF1dGhvciBQYXVsIE1hY2tlcnJhcyA8cGF1bHVzQHNhbWJhLm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFBhdWwgTWFja2VycmFzIDIwMDUKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAicmFkZW9uX2RybS5oIgorI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pbml0MzIgeworCWludCBmdW5jOworCXUzMiBzYXJlYV9wcml2X29mZnNldDsKKwlpbnQgaXNfcGNpOworCWludCBjcF9tb2RlOworCWludCBnYXJ0X3NpemU7CisJaW50IHJpbmdfc2l6ZTsKKwlpbnQgdXNlY190aW1lb3V0OworCisJdW5zaWduZWQgaW50IGZiX2JwcDsKKwl1bnNpZ25lZCBpbnQgZnJvbnRfb2Zmc2V0LCBmcm9udF9waXRjaDsKKwl1bnNpZ25lZCBpbnQgYmFja19vZmZzZXQsIGJhY2tfcGl0Y2g7CisJdW5zaWduZWQgaW50IGRlcHRoX2JwcDsKKwl1bnNpZ25lZCBpbnQgZGVwdGhfb2Zmc2V0LCBkZXB0aF9waXRjaDsKKworCXUzMiBmYl9vZmZzZXQ7CisJdTMyIG1taW9fb2Zmc2V0OworCXUzMiByaW5nX29mZnNldDsKKwl1MzIgcmluZ19ycHRyX29mZnNldDsKKwl1MzIgYnVmZmVyc19vZmZzZXQ7CisJdTMyIGdhcnRfdGV4dHVyZXNfb2Zmc2V0OworfSBkcm1fcmFkZW9uX2luaXQzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yYWRlb25fY3BfaW5pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3JhZGVvbl9pbml0MzJfdCBpbml0MzI7CisJZHJtX3JhZGVvbl9pbml0X3QgX191c2VyICppbml0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbml0MzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGluaXQzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWluaXQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmluaXQpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGluaXQsIHNpemVvZigqaW5pdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZ1bmMsICZpbml0LT5mdW5jKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5zYXJlYV9wcml2X29mZnNldCwgJmluaXQtPnNhcmVhX3ByaXZfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5pc19wY2ksICZpbml0LT5pc19wY2kpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmNwX21vZGUsICZpbml0LT5jcF9tb2RlKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5nYXJ0X3NpemUsICZpbml0LT5nYXJ0X3NpemUpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnJpbmdfc2l6ZSwgJmluaXQtPnJpbmdfc2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIudXNlY190aW1lb3V0LCAmaW5pdC0+dXNlY190aW1lb3V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mYl9icHAsICZpbml0LT5mYl9icHApCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmZyb250X29mZnNldCwgJmluaXQtPmZyb250X29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZnJvbnRfcGl0Y2gsICZpbml0LT5mcm9udF9waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYmFja19vZmZzZXQsICZpbml0LT5iYWNrX29mZnNldCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuYmFja19waXRjaCwgJmluaXQtPmJhY2tfcGl0Y2gpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLmRlcHRoX2JwcCwgJmluaXQtPmRlcHRoX2JwcCkKKwkgICAgfHwgX19wdXRfdXNlcihpbml0MzIuZGVwdGhfb2Zmc2V0LCAmaW5pdC0+ZGVwdGhfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5kZXB0aF9waXRjaCwgJmluaXQtPmRlcHRoX3BpdGNoKQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5mYl9vZmZzZXQsICZpbml0LT5mYl9vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLm1taW9fb2Zmc2V0LCAmaW5pdC0+bW1pb19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnJpbmdfb2Zmc2V0LCAmaW5pdC0+cmluZ19vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW5pdDMyLnJpbmdfcnB0cl9vZmZzZXQsICZpbml0LT5yaW5nX3JwdHJfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5idWZmZXJzX29mZnNldCwgJmluaXQtPmJ1ZmZlcnNfb2Zmc2V0KQorCSAgICB8fCBfX3B1dF91c2VyKGluaXQzMi5nYXJ0X3RleHR1cmVzX29mZnNldCwKKwkJCSAgJmluaXQtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SQURFT05fQ1BfSU5JVCwgKHVuc2lnbmVkIGxvbmcpIGluaXQpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2NsZWFyMzIgeworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY2xlYXJfY29sb3I7CisJdW5zaWduZWQgaW50IGNsZWFyX2RlcHRoOworCXVuc2lnbmVkIGludCBjb2xvcl9tYXNrOworCXVuc2lnbmVkIGludCBkZXB0aF9tYXNrOyAgIC8qIG1pc25hbWVkIGZpZWxkOiAgc2hvdWxkIGJlIHN0ZW5jaWwgKi8KKwl1MzIJICAgICBkZXB0aF9ib3hlczsKK30gZHJtX3JhZGVvbl9jbGVhcjMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9jcF9jbGVhcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25fY2xlYXIzMl90IGNscjMyOworCWRybV9yYWRlb25fY2xlYXJfdCBfX3VzZXIgKmNscjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY2xyMzIsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGNscjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJY2xyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjbHIpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGNsciwgc2l6ZW9mKCpjbHIpKQorCSAgICB8fCBfX3B1dF91c2VyKGNscjMyLmZsYWdzLCAmY2xyLT5mbGFncykKKwkgICAgfHwgX19wdXRfdXNlcihjbHIzMi5jbGVhcl9jb2xvciwgJmNsci0+Y2xlYXJfY29sb3IpCisJICAgIHx8IF9fcHV0X3VzZXIoY2xyMzIuY2xlYXJfZGVwdGgsICZjbHItPmNsZWFyX2RlcHRoKQorCSAgICB8fCBfX3B1dF91c2VyKGNscjMyLmNvbG9yX21hc2ssICZjbHItPmNvbG9yX21hc2spCisJICAgIHx8IF9fcHV0X3VzZXIoY2xyMzIuZGVwdGhfbWFzaywgJmNsci0+ZGVwdGhfbWFzaykKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZyljbHIzMi5kZXB0aF9ib3hlcywKKwkJCSAgJmNsci0+ZGVwdGhfYm94ZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9DTEVBUiwgKHVuc2lnbmVkIGxvbmcpIGNscik7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fc3RpcHBsZTMyIHsKKwl1MzIgbWFzazsKK30gZHJtX3JhZGVvbl9zdGlwcGxlMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcmFkZW9uX2NwX3N0aXBwbGUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25fc3RpcHBsZTMyX3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopIGFyZzsKKwlkcm1fcmFkZW9uX3N0aXBwbGVfdCBfX3VzZXIgKnJlcXVlc3Q7CisJdTMyIG1hc2s7CisKKwlpZiAoZ2V0X3VzZXIobWFzaywgJmFyZ3AtPm1hc2spKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIoKHVuc2lnbmVkIGludCBfX3VzZXIgKikodW5zaWduZWQgbG9uZykgbWFzaywKKwkJCSAgJnJlcXVlc3QtPm1hc2spKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9TVElQUExFLCAodW5zaWduZWQgbG9uZykgcmVxdWVzdCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdGV4X2ltYWdlMzIgeworCXVuc2lnbmVkIGludCB4LCB5OwkJLyogQmxpdCBjb29yZGluYXRlcyAqLworCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OworCXUzMiBkYXRhOworfSBkcm1fcmFkZW9uX3RleF9pbWFnZTMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRybV9yYWRlb25fdGV4dHVyZTMyIHsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBwaXRjaDsKKwlpbnQgZm9ybWF0OworCWludCB3aWR0aDsJCQkvKiBUZXh0dXJlIGltYWdlIGNvb3JkaW5hdGVzICovCisJaW50IGhlaWdodDsKKwl1MzIgaW1hZ2U7Cit9IGRybV9yYWRlb25fdGV4dHVyZTMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9jcF90ZXh0dXJlKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcmFkZW9uX3RleHR1cmUzMl90IHJlcTMyOworCWRybV9yYWRlb25fdGV4dHVyZV90IF9fdXNlciAqcmVxdWVzdDsKKwlkcm1fcmFkZW9uX3RleF9pbWFnZTMyX3QgaW1nMzI7CisJZHJtX3JhZGVvbl90ZXhfaW1hZ2VfdCBfX3VzZXIgKmltYWdlOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChyZXEzMi5pbWFnZSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmltZzMyLCAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5pbWFnZSwKKwkJCSAgIHNpemVvZihpbWczMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpICsgc2l6ZW9mKCppbWFnZSkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwKKwkJICAgICAgIHNpemVvZigqcmVxdWVzdCkgKyBzaXplb2YoKmltYWdlKSkpCisJCXJldHVybiAtRUZBVUxUOworCWltYWdlID0gKGRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICopIChyZXF1ZXN0ICsgMSk7CisKKwlpZiAoX19wdXRfdXNlcihyZXEzMi5vZmZzZXQsICZyZXF1ZXN0LT5vZmZzZXQpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIucGl0Y2gsICZyZXF1ZXN0LT5waXRjaCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5mb3JtYXQsICZyZXF1ZXN0LT5mb3JtYXQpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIud2lkdGgsICZyZXF1ZXN0LT53aWR0aCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5oZWlnaHQsICZyZXF1ZXN0LT5oZWlnaHQpCisJICAgIHx8IF9fcHV0X3VzZXIoaW1hZ2UsICZyZXF1ZXN0LT5pbWFnZSkKKwkgICAgfHwgX19wdXRfdXNlcihpbWczMi54LCAmaW1hZ2UtPngpCisJICAgIHx8IF9fcHV0X3VzZXIoaW1nMzIueSwgJmltYWdlLT55KQorCSAgICB8fCBfX3B1dF91c2VyKGltZzMyLndpZHRoLCAmaW1hZ2UtPndpZHRoKQorCSAgICB8fCBfX3B1dF91c2VyKGltZzMyLmhlaWdodCwgJmltYWdlLT5oZWlnaHQpCisJICAgIHx8IF9fcHV0X3VzZXIoKGNvbnN0IHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpaW1nMzIuZGF0YSwKKwkJCSAgJmltYWdlLT5kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SQURFT05fVEVYVFVSRSwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX3ZlcnRleDJfMzIgeworCWludCBpZHg7CQkJLyogSW5kZXggb2YgdmVydGV4IGJ1ZmZlciAqLworCWludCBkaXNjYXJkOwkJCS8qIENsaWVudCBmaW5pc2hlZCB3aXRoIGJ1ZmZlcj8gKi8KKwlpbnQgbnJfc3RhdGVzOworCXUzMiBzdGF0ZTsKKwlpbnQgbnJfcHJpbXM7CisJdTMyIHByaW07Cit9IGRybV9yYWRlb25fdmVydGV4Ml8zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yYWRlb25fY3BfdmVydGV4MihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJZHJtX3JhZGVvbl92ZXJ0ZXgyXzMyX3QgcmVxMzI7CisJZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgX191c2VyICpyZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5pZHgsICZyZXF1ZXN0LT5pZHgpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIuZGlzY2FyZCwgJnJlcXVlc3QtPmRpc2NhcmQpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIubnJfc3RhdGVzLCAmcmVxdWVzdC0+bnJfc3RhdGVzKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLnN0YXRlLAorCQkJICAmcmVxdWVzdC0+c3RhdGUpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIubnJfcHJpbXMsICZyZXF1ZXN0LT5ucl9wcmltcykKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5wcmltLAorCQkJICAmcmVxdWVzdC0+cHJpbSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUkFERU9OX1ZFUlRFWDIsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9jbWRfYnVmZmVyMzIgeworCWludCBidWZzejsKKwl1MzIgYnVmOworCWludCBuYm94OworCXUzMiBib3hlczsKK30gZHJtX3JhZGVvbl9jbWRfYnVmZmVyMzJfdDsKKworc3RhdGljIGludCBjb21wYXRfcmFkZW9uX2NwX2NtZGJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcmFkZW9uX2NtZF9idWZmZXIzMl90IHJlcTMyOworCWRybV9yYWRlb25fY21kX2J1ZmZlcl90IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIuYnVmc3osICZyZXF1ZXN0LT5idWZzeikKKwkgICAgfHwgX19wdXRfdXNlcigodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylyZXEzMi5idWYsCisJCQkgICZyZXF1ZXN0LT5idWYpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIubmJveCwgJnJlcXVlc3QtPm5ib3gpCisJICAgIHx8IF9fcHV0X3VzZXIoKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIuYm94ZXMsCisJCQkgICZyZXF1ZXN0LT5ib3hlcykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGRybV9pb2N0bChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmlsZSwKKwkJCSBEUk1fSU9DVExfUkFERU9OX0NNREJVRiwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX2dldHBhcmFtMzIgeworCWludCBwYXJhbTsKKwl1MzIgdmFsdWU7Cit9IGRybV9yYWRlb25fZ2V0cGFyYW0zMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yYWRlb25fY3BfZ2V0cGFyYW0oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlkcm1fcmFkZW9uX2dldHBhcmFtMzJfdCByZXEzMjsKKwlkcm1fcmFkZW9uX2dldHBhcmFtX3QgX191c2VyICpyZXF1ZXN0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEzMiwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHJlcTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmVxdWVzdCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcmVxdWVzdCkpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcmVxdWVzdCwgc2l6ZW9mKCpyZXF1ZXN0KSkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5wYXJhbSwgJnJlcXVlc3QtPnBhcmFtKQorCSAgICB8fCBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLnZhbHVlLAorCQkJICAmcmVxdWVzdC0+dmFsdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9HRVRQQVJBTSwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCit0eXBlZGVmIHN0cnVjdCBkcm1fcmFkZW9uX21lbV9hbGxvYzMyIHsKKwlpbnQgcmVnaW9uOworCWludCBhbGlnbm1lbnQ7CisJaW50IHNpemU7CisJdTMyIHJlZ2lvbl9vZmZzZXQ7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZiIG9yIEdBUlQgKi8KK30gZHJtX3JhZGVvbl9tZW1fYWxsb2MzMl90OworCitzdGF0aWMgaW50IGNvbXBhdF9yYWRlb25fbWVtX2FsbG9jKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25fbWVtX2FsbG9jMzJfdCByZXEzMjsKKwlkcm1fcmFkZW9uX21lbV9hbGxvY190IF9fdXNlciAqcmVxdWVzdDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxMzIsICh2b2lkIF9fdXNlciAqKSBhcmcsIHNpemVvZihyZXEzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcXVlc3QgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnJlcXVlc3QpKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHJlcXVlc3QsIHNpemVvZigqcmVxdWVzdCkpCisJICAgIHx8IF9fcHV0X3VzZXIocmVxMzIucmVnaW9uLCAmcmVxdWVzdC0+cmVnaW9uKQorCSAgICB8fCBfX3B1dF91c2VyKHJlcTMyLmFsaWdubWVudCwgJnJlcXVlc3QtPmFsaWdubWVudCkKKwkgICAgfHwgX19wdXRfdXNlcihyZXEzMi5zaXplLCAmcmVxdWVzdC0+c2l6ZSkKKwkgICAgfHwgX19wdXRfdXNlcigoaW50IF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKXJlcTMyLnJlZ2lvbl9vZmZzZXQsCisJCQkgICZyZXF1ZXN0LT5yZWdpb25fb2Zmc2V0KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gZHJtX2lvY3RsKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlLAorCQkJIERSTV9JT0NUTF9SQURFT05fQUxMT0MsICh1bnNpZ25lZCBsb25nKSByZXF1ZXN0KTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3JhZGVvbl9pcnFfZW1pdDMyIHsKKwl1MzIgaXJxX3NlcTsKK30gZHJtX3JhZGVvbl9pcnFfZW1pdDMyX3Q7CisKK3N0YXRpYyBpbnQgY29tcGF0X3JhZGVvbl9pcnFfZW1pdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWRybV9yYWRlb25faXJxX2VtaXQzMl90IHJlcTMyOworCWRybV9yYWRlb25faXJxX2VtaXRfdCBfX3VzZXIgKnJlcXVlc3Q7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnJlcTMyLCAodm9pZCBfX3VzZXIgKikgYXJnLCBzaXplb2YocmVxMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXF1ZXN0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpyZXF1ZXN0KSk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKQorCSAgICB8fCBfX3B1dF91c2VyKChpbnQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpcmVxMzIuaXJxX3NlcSwKKwkJCSAgJnJlcXVlc3QtPmlycV9zZXEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkcm1faW9jdGwoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGUsCisJCQkgRFJNX0lPQ1RMX1JBREVPTl9JUlFfRU1JVCwgKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3QpOworfQorCitkcm1faW9jdGxfY29tcGF0X3QgKnJhZGVvbl9jb21wYXRfaW9jdGxzW10gPSB7CisJW0RSTV9SQURFT05fQ1BfSU5JVF0gPSBjb21wYXRfcmFkZW9uX2NwX2luaXQsCisJW0RSTV9SQURFT05fQ0xFQVJdID0gY29tcGF0X3JhZGVvbl9jcF9jbGVhciwKKwlbRFJNX1JBREVPTl9TVElQUExFXSA9IGNvbXBhdF9yYWRlb25fY3Bfc3RpcHBsZSwKKwlbRFJNX1JBREVPTl9URVhUVVJFXSA9IGNvbXBhdF9yYWRlb25fY3BfdGV4dHVyZSwKKwlbRFJNX1JBREVPTl9WRVJURVgyXSA9IGNvbXBhdF9yYWRlb25fY3BfdmVydGV4MiwKKwlbRFJNX1JBREVPTl9DTURCVUZdID0gY29tcGF0X3JhZGVvbl9jcF9jbWRidWYsCisJW0RSTV9SQURFT05fR0VUUEFSQU1dID0gY29tcGF0X3JhZGVvbl9jcF9nZXRwYXJhbSwKKwlbRFJNX1JBREVPTl9BTExPQ10gPSBjb21wYXRfcmFkZW9uX21lbV9hbGxvYywKKwlbRFJNX1JBREVPTl9JUlFfRU1JVF0gPSBjb21wYXRfcmFkZW9uX2lycV9lbWl0LAorfTsKKworLyoqCisgKiBDYWxsZWQgd2hlbmV2ZXIgYSAzMi1iaXQgcHJvY2VzcyBydW5uaW5nIHVuZGVyIGEgNjQtYml0IGtlcm5lbAorICogcGVyZm9ybXMgYW4gaW9jdGwgb24gL2Rldi9kcmkvY2FyZDxuPi4KKyAqCisgKiBccGFyYW0gZmlscCBmaWxlIHBvaW50ZXIuCisgKiBccGFyYW0gY21kIGNvbW1hbmQuCisgKiBccGFyYW0gYXJnIHVzZXIgYXJndW1lbnQuCisgKiBccmV0dXJuIHplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworbG9uZyByYWRlb25fY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGludCBuciA9IERSTV9JT0NUTF9OUihjbWQpOworCWRybV9pb2N0bF9jb21wYXRfdCAqZm4gPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFKQorCQlyZXR1cm4gZHJtX2NvbXBhdF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisKKwlpZiAobnIgPCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX0FSUkFZX1NJWkUocmFkZW9uX2NvbXBhdF9pb2N0bHMpKQorCQlmbiA9IHJhZGVvbl9jb21wYXRfaW9jdGxzW25yIC0gRFJNX0NPTU1BTkRfQkFTRV07CisKKwlsb2NrX2tlcm5lbCgpOwkJLyogWFhYIGZvciBub3cgKi8KKwlpZiAoZm4gIT0gTlVMTCkKKwkJcmV0ID0gKCpmbikoZmlscCwgY21kLCBhcmcpOworCWVsc2UKKwkJcmV0ID0gZHJtX2lvY3RsKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxwLCBjbWQsIGFyZyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2lycS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKaW5kZXggY2QyNWYyOC4uNDA0NzRhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25faXJxLmMKQEAgLTM1LDYgKzM1LDE0IEBACiAjaW5jbHVkZSAicmFkZW9uX2RybS5oIgogI2luY2x1ZGUgInJhZGVvbl9kcnYuaCIKIAorc3RhdGljIF9faW5saW5lX18gdTMyIHJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgdTMyIG1hc2spCit7CisJdTMyIGlycXMgPSBSQURFT05fUkVBRChSQURFT05fR0VOX0lOVF9TVEFUVVMpICYgbWFzazsKKwlpZiAoaXJxcykKKwkJUkFERU9OX1dSSVRFKFJBREVPTl9HRU5fSU5UX1NUQVRVUywgaXJxcyk7CisJcmV0dXJuIGlycXM7Cit9CisKIC8qIEludGVycnVwdHMgLSBVc2VkIGZvciBkZXZpY2Ugc3luY2hyb25pemF0aW9uIGFuZCBmbHVzaGluZyBpbiB0aGUKICAqIGZvbGxvd2luZyBjaXJjdW1zdGFuY2VzOgogICoKQEAgLTYzLDggKzcxLDggQEAKIAkvKiBPbmx5IGNvbnNpZGVyIHRoZSBiaXRzIHdlJ3JlIGludGVyZXN0ZWQgaW4gLSBvdGhlcnMgY291bGQgYmUgdXNlZAogCSAqIG91dHNpZGUgdGhlIERSTQogCSAqLwotCXN0YXQgPSBSQURFT05fUkVBRChSQURFT05fR0VOX0lOVF9TVEFUVVMpCi0JICAgICAmIChSQURFT05fU1dfSU5UX1RFU1QgfCBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCk7CisJc3RhdCA9IHJhZGVvbl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2LCAoUkFERU9OX1NXX0lOVF9URVNUX0FDSyB8IAorCQkJCQkJICBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkpOwogCWlmICghc3RhdCkKIAkJcmV0dXJuIElSUV9OT05FOwogCkBAIC04MCwxOSArODgsOSBAQAogCQlkcm1fdmJsX3NlbmRfc2lnbmFscyggZGV2ICk7CiAJfQogCi0JLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0cyB3ZSBoYW5kbGUgKi8KLQlSQURFT05fV1JJVEUoUkFERU9OX0dFTl9JTlRfU1RBVFVTLCBzdGF0KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgcmFkZW9uX2Fja25vd2xlZGdlX2lycXMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2KQotewotCXUzMiB0bXAgPSBSQURFT05fUkVBRCggUkFERU9OX0dFTl9JTlRfU1RBVFVTICkKLQkJJiAoUkFERU9OX1NXX0lOVF9URVNUX0FDSyB8IFJBREVPTl9DUlRDX1ZCTEFOS19TVEFUKTsKLQlpZiAodG1wKQotCQlSQURFT05fV1JJVEUoIFJBREVPTl9HRU5fSU5UX1NUQVRVUywgdG1wICk7Ci19Ci0KIHN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfaXJxKGRybV9kZXZpY2VfdCAqZGV2KQogewogCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNDEsNyArMTM5LDcgQEAKIAkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKIAl9CiAKLQlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyggZGV2X3ByaXYgKTsKKwlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdiwgUkFERU9OX0NSVENfVkJMQU5LX1NUQVQpOwogCiAJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfV0FJVF9JRExFOwogCkBAIC0yMTksNyArMjE3LDggQEAKICAgICAgIAlSQURFT05fV1JJVEUoIFJBREVPTl9HRU5fSU5UX0NOVEwsIDAgKTsKIAogCS8qIENsZWFyIGJpdHMgaWYgdGhleSdyZSBhbHJlYWR5IGhpZ2ggKi8KLQlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyggZGV2X3ByaXYgKTsKKwlyYWRlb25fYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdiwgKFJBREVPTl9TV19JTlRfVEVTVF9BQ0sgfAorCQkJCQkgICBSQURFT05fQ1JUQ19WQkxBTktfU1RBVCkpOwogfQogCiB2b2lkIHJhZGVvbl9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKCBkcm1fZGV2aWNlX3QgKmRldiApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhXzNkX3JlZy5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfM2RfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2MWJiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhXzNkX3JlZy5oCkBAIC0wLDAgKzEsMTY1MSBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBWSUFfM0RfUkVHX0gKKyNkZWZpbmUgVklBXzNEX1JFR19ICisjZGVmaW5lIEhDX1JFR19CQVNFICAgICAgICAgICAgIDB4MDQwMAorCisjZGVmaW5lIEhDX1JFR19UUkFOU19TUEFDRSAgICAgIDB4MDA0MAorCisjZGVmaW5lIEhDX1BhcmFOX01BU0sgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgSENfUGFyYV9NQVNLICAgICAgICAgICAgMHgwMGZmZmZmZgorI2RlZmluZSBIQ19TdWJBX01BU0sgICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhDX1N1YkFfU0hJRlQgICAgICAgICAgIDI0CisvKiBUcmFuc21pc3Npb24gU2V0dGluZworICovCisjZGVmaW5lIEhDX1JFR19UUkFOU19TRVQgICAgICAgIDB4MDAzYworI2RlZmluZSBIQ19QYXJhU3ViVHlwZV9NQVNLICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhDX1BhcmFUeXBlX01BU0sgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfUGFyYU9TX01BU0sgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19QYXJhQWRyX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX1BhcmFTdWJUeXBlX1NISUZUICAgIDI0CisjZGVmaW5lIEhDX1BhcmFUeXBlX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX1BhcmFPU19TSElGVCAgICAgICAgIDgKKyNkZWZpbmUgSENfUGFyYUFkcl9TSElGVCAgICAgICAgMAorCisjZGVmaW5lIEhDX1BhcmFUeXBlX0NtZFZkYXRhICAgIDB4MDAwMAorI2RlZmluZSBIQ19QYXJhVHlwZV9Ob3RUZXggICAgICAweDAwMDEKKyNkZWZpbmUgSENfUGFyYVR5cGVfVGV4ICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEhDX1BhcmFUeXBlX1BhbGV0dGUgICAgIDB4MDAwMworI2RlZmluZSBIQ19QYXJhVHlwZV9QcmVDUiAgICAgICAweDAwMTAKKyNkZWZpbmUgSENfUGFyYVR5cGVfQXV0byAgICAgICAgMHgwMGZlCisKKy8qIFRyYW5zbWlzc2lvbiBTcGFjZQorICovCisjZGVmaW5lIEhDX1JFR19IcGFyYTAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBIQ19SRUdfSHBhdGFBRiAgICAgICAgICAweDAyZmMKKworLyogUmVhZAorICovCisjZGVmaW5lIEhDX1JFR19IUkVuZ1N0ICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19SRUdfSFJGSUZPZW1wdHkgICAgICAweDAwMDQKKyNkZWZpbmUgSENfUkVHX0hSRklGT2Z1bGwgICAgICAgMHgwMDA4CisjZGVmaW5lIEhDX1JFR19IUkVyciAgICAgICAgICAgIDB4MDAwYworI2RlZmluZSBIQ19SRUdfRklGT3N0YXR1cyAgICAgICAweDAwMTAKKy8qIEhDX1JFR19IUkVuZ1N0ICAgICAgICAgIDB4MDAwMAorICovCisjZGVmaW5lIEhDX0hEQVNaQ19NQVNLICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSENfSFNHRU1JX01BU0sgICAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBIQ19ITEdFTUlTdF9NQVNLICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hDUlN0X01BU0sgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSENfSFNFMFN0X01BU0sgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBIQ19IU0UxU3RfTUFTSyAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhDX0hQRVN0X01BU0sgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFhFU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IQkVTdF9NQVNLICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX0hFMlN0X01BU0sgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSEUzU3RfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMQorLyogSENfUkVHX0hSRklGT2VtcHR5ICAgICAgMHgwMDA0CisgKi8KKyNkZWZpbmUgSENfSFJaRGVtcHR5X01BU0sgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IUlRYQWVtcHR5X01BU0sgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hSVFhEZW1wdHlfTUFTSyAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSFdaRGVtcHR5X01BU0sgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IV0NEZW1wdHlfTUFTSyAgICAgICAweDAwMDAwMDAxCisvKiBIQ19SRUdfSFJGSUZPZnVsbCAgICAgICAweDAwMDgKKyAqLworI2RlZmluZSBIQ19IUlpEZnVsbF9NQVNLICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hSVFhBZnVsbF9NQVNLICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFJUWERmdWxsX01BU0sgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IV1pEZnVsbF9NQVNLICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hXQ0RmdWxsX01BU0sgICAgICAgIDB4MDAwMDAwMDEKKy8qIEhDX1JFR19IUkVyciAgICAgICAgICAgIDB4MDAwYworICovCisjZGVmaW5lIEhDX0hBR1BDTUVycl9NQVNLICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgSENfSEFHUENNRXJyQ19NQVNLICAgICAgMHg3MDAwMDAwMAorLyogSENfUkVHX0ZJRk9zdGF0dXMgICAgICAgMHgwMDEwCisgKi8KKyNkZWZpbmUgSENfSFJGSUZPQVRhbGxfTUFTSyAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBIQ19IUkZJRk9BVGJ1c3lfTUFTSyAgICAweDQwMDAwMDAwCisjZGVmaW5lIEhDX0hSQVRGR01Eb19NQVNLICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSFJBVEZHTURpX01BU0sgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IUkFURlJaRF9NQVNLICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hSQVRGUlRYQV9NQVNLICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFJBVEZSVFhEX01BU0sgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IUkFURldaRF9NQVNLICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hSQVRGV0NEX01BU0sgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSFJBVFRYVEFHX01BU0sgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IUkFUVFhDSF9NQVNLICAgICAgICAweDAwMDAwMDAxCisKKy8qIEFHUCBDb21tYW5kIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hBR1BCc3RMICAgICAgICAweDAwNjAKKyNkZWZpbmUgSENfU3ViQV9IQUdQQmVuZEwgICAgICAgMHgwMDYxCisjZGVmaW5lIEhDX1N1YkFfSEFHUENNTlQgICAgICAgIDB4MDA2MgorI2RlZmluZSBIQ19TdWJBX0hBR1BCcEwgICAgICAgICAweDAwNjMKKyNkZWZpbmUgSENfU3ViQV9IQUdQQnBIICAgICAgICAgMHgwMDY0CisvKiBIQ19TdWJBX0hBR1BDTU5UICAgICAgICAweDAwNjIKKyAqLworI2RlZmluZSBIQ19IQUdQQ01OVF9NQVNLICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhDX0hDbWRFcnJDbHJfTUFTSyAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSENfSEFHUEJlbmRIX01BU0sgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IQUdQQnN0SF9NQVNLICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hBR1BCZW5kSF9TSElGVCAgICAgIDgKKyNkZWZpbmUgSENfSEFHUEJzdEhfU0hJRlQgICAgICAgMAorLyogSENfU3ViQV9IQUdQQnBMICAgICAgICAgMHgwMDYzCisgKi8KKyNkZWZpbmUgSENfSEFHUEJwTF9NQVNLICAgICAgICAgMHgwMGZmZmZmYworI2RlZmluZSBIQ19IQUdQQnBJRF9NQVNLICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hBR1BCcElEX1BBVVNFICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSEFHUEJwSURfSlVNUCAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19IQUdQQnBJRF9TVE9QICAgICAgICAweDAwMDAwMDAyCisvKiBIQ19TdWJBX0hBR1BCcEggICAgICAgICAweDAwNjQKKyAqLworI2RlZmluZSBIQ19IQUdQQnBIX01BU0sgICAgICAgICAweDAwZmZmZmZmCisKKy8qIE1pc2NlbGxhbmVvdXMgU2V0dGluZ3MKKyAqLworI2RlZmluZSBIQ19TdWJBX0hDbGlwVEIgICAgICAgICAweDAwNzAKKyNkZWZpbmUgSENfU3ViQV9IQ2xpcExSICAgICAgICAgMHgwMDcxCisjZGVmaW5lIEhDX1N1YkFfSEZQQ2xpcFRMICAgICAgIDB4MDA3MgorI2RlZmluZSBIQ19TdWJBX0hGUENsaXBCTCAgICAgICAweDAwNzMKKyNkZWZpbmUgSENfU3ViQV9IRlBDbGlwTEwgICAgICAgMHgwMDc0CisjZGVmaW5lIEhDX1N1YkFfSEZQQ2xpcFJMICAgICAgIDB4MDA3NQorI2RlZmluZSBIQ19TdWJBX0hGUENsaXBUQkggICAgICAweDAwNzYKKyNkZWZpbmUgSENfU3ViQV9IRlBDbGlwTFJIICAgICAgMHgwMDc3CisjZGVmaW5lIEhDX1N1YkFfSExQICAgICAgICAgICAgIDB4MDA3OAorI2RlZmluZSBIQ19TdWJBX0hMUFJGICAgICAgICAgICAweDAwNzkKKyNkZWZpbmUgSENfU3ViQV9IU29saWRDTCAgICAgICAgMHgwMDdhCisjZGVmaW5lIEhDX1N1YkFfSFBpeEdDICAgICAgICAgIDB4MDA3YgorI2RlZmluZSBIQ19TdWJBX0hTUFhZT1MgICAgICAgICAweDAwN2MKKyNkZWZpbmUgSENfU3ViQV9IVmVydGV4Q05UICAgICAgMHgwMDdkCisKKyNkZWZpbmUgSENfSENsaXBUX01BU0sgICAgICAgICAgMHgwMGZmZjAwMAorI2RlZmluZSBIQ19IQ2xpcFRfU0hJRlQgICAgICAgICAxMgorI2RlZmluZSBIQ19IQ2xpcEJfTUFTSyAgICAgICAgICAweDAwMDAwZmZmCisjZGVmaW5lIEhDX0hDbGlwQl9TSElGVCAgICAgICAgIDAKKyNkZWZpbmUgSENfSENsaXBMX01BU0sgICAgICAgICAgMHgwMGZmZjAwMAorI2RlZmluZSBIQ19IQ2xpcExfU0hJRlQgICAgICAgICAxMgorI2RlZmluZSBIQ19IQ2xpcFJfTUFTSyAgICAgICAgICAweDAwMDAwZmZmCisjZGVmaW5lIEhDX0hDbGlwUl9TSElGVCAgICAgICAgIDAKKyNkZWZpbmUgSENfSEZQQ2xpcEJIX01BU0sgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IRlBDbGlwQkhfU0hJRlQgICAgICA4CisjZGVmaW5lIEhDX0hGUENsaXBUSF9NQVNLICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEZQQ2xpcFRIX1NISUZUICAgICAgMAorI2RlZmluZSBIQ19IRlBDbGlwUkhfTUFTSyAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hGUENsaXBSSF9TSElGVCAgICAgIDgKKyNkZWZpbmUgSENfSEZQQ2xpcExIX01BU0sgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IRlBDbGlwTEhfU0hJRlQgICAgICAwCisjZGVmaW5lIEhDX0hTb2xpZENIX01BU0sgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFBpeEdDX01BU0sgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IU1BYT1NfTUFTSyAgICAgICAgICAweDAwZmZmMDAwCisjZGVmaW5lIEhDX0hTUFhPU19TSElGVCAgICAgICAgIDEyCisjZGVmaW5lIEhDX0hTUFlPU19NQVNLICAgICAgICAgIDB4MDAwMDBmZmYKKworLyogQ29tbWFuZAorICogQ29tbWFuZCBBCisgKi8KKyNkZWZpbmUgSENfSENtZEhlYWRlcl9NQVNLICAgICAgMHhmZTAwMDAwMAkvKjB4ZmZlMDAwMDAgKi8KKyNkZWZpbmUgSENfSEUzRmlyZV9NQVNLICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IUE1UeXBlX01BU0sgICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hFRmxhZ19NQVNLICAgICAgICAgIDB4MDAwMGUwMDAKKyNkZWZpbmUgSENfSFNoYWRpbmdfTUFTSyAgICAgICAgMHgwMDAwMWMwMAorI2RlZmluZSBIQ19IUE1WYWxpZE5fTUFTSyAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hQTEVORF9NQVNLICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSFZDeWNsZV9NQVNLICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVkN5Y2xlX1N0eWxlX01BU0sgICAweDAwMDAwMGMwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQ2hnQV9NQVNLICAgIDB4MDAwMDAwMzAKKyNkZWZpbmUgSENfSFZDeWNsZV9DaGdCX01BU0sgICAgMHgwMDAwMDAwYworI2RlZmluZSBIQ19IVkN5Y2xlX0NoZ0NfTUFTSyAgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hQTVR5cGVfUG9pbnQgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFBNVHlwZV9MaW5lICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IUE1UeXBlX1RyaSAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhDX0hQTVR5cGVfVHJpV0YgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgSENfSEVGbGFnX05vQUEgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IRUZsYWdfYWIgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhDX0hFRmxhZ19iYyAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSENfSEVGbGFnX2NhICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBIQ19IU2hhZGluZ19Tb2xpZCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hTaGFkaW5nX0ZsYXRBICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSENfSFNoYWRpbmdfRmxhdEIgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBIQ19IU2hhZGluZ19GbGF0QyAgICAgICAweDAwMDAwYzAwCisjZGVmaW5lIEhDX0hTaGFkaW5nX0dvdXJhdWQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSENfSFZDeWNsZV9GdWxsICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVkN5Y2xlX0FGUCAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hWQ3ljbGVfT25lICAgICAgICAgIDB4MDAwMDAwYzAKKyNkZWZpbmUgSENfSFZDeWNsZV9OZXdBICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVkN5Y2xlX0FBICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQUIgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFZDeWNsZV9BQyAgICAgICAgICAgMHgwMDAwMDAzMAorI2RlZmluZSBIQ19IVkN5Y2xlX05ld0IgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hWQ3ljbGVfQkEgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSFZDeWNsZV9CQiAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IVkN5Y2xlX0JDICAgICAgICAgICAweDAwMDAwMDBjCisjZGVmaW5lIEhDX0hWQ3ljbGVfTmV3QyAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFZDeWNsZV9DQSAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19IVkN5Y2xlX0NCICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hWQ3ljbGVfQ0MgICAgICAgICAgIDB4MDAwMDAwMDMKKworLyogQ29tbWFuZCBCCisgKi8KKyNkZWZpbmUgSENfSExQcnN0X01BU0sgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19ITExhc3RQX01BU0sgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhDX0hWUE1TS19NQVNLICAgICAgICAgIDB4MDAwMDdmODAKKyNkZWZpbmUgSENfSEJGYWNlX01BU0sgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBIQ19IMm5kMVZUX01BU0sgICAgICAgICAweDAwMDAwMDNmCisjZGVmaW5lIEhDX0hWUE1TS19YICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSENfSFZQTVNLX1kgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBIQ19IVlBNU0tfWiAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEhDX0hWUE1TS19XICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSFZQTVNLX0NkICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IVlBNU0tfQ3MgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hWUE1TS19TICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSFZQTVNLX1QgICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKiBFbmFibGUgU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSEVuYWJsZSAgICAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19IZW5UWEVudk1hcF9NQVNLICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhDX0hlblZlcnRleENOVF9NQVNLICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSENfSGVuQ1BVREFaX01BU0sgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBIQ19IZW5EQVNaV0NfTUFTSyAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhDX0hlbkZCQ3VsbF9NQVNLICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSGVuQ1dfTUFTSyAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IZW5BQV9NQVNLICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhDX0hlblNUX01BU0sgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSENfSGVuWlRfTUFTSyAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBIQ19IZW5aV19NQVNLICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEhDX0hlbkFUX01BU0sgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSGVuQVdfTUFTSyAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IZW5TUF9NQVNLICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hlbkxQX01BU0sgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSGVuVFhDSF9NQVNLICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IZW5UWE1QX01BU0sgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hlblRYUFBfTUFTSyAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSGVuVFhUUl9NQVNLICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IZW5DU19NQVNLICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hlbkZPR19NQVNLICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSGVuQUJMX01BU0sgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IZW5EVF9NQVNLICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIFogU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSFpXQkJhc0wgICAgICAgIDB4MDAxMAorI2RlZmluZSBIQ19TdWJBX0haV0JCYXNIICAgICAgICAweDAwMTEKKyNkZWZpbmUgSENfU3ViQV9IWldCVHlwZSAgICAgICAgMHgwMDEyCisjZGVmaW5lIEhDX1N1YkFfSFpCaWFzTCAgICAgICAgIDB4MDAxMworI2RlZmluZSBIQ19TdWJBX0haV0JlbmQgICAgICAgICAweDAwMTQKKyNkZWZpbmUgSENfU3ViQV9IWldUTUQgICAgICAgICAgMHgwMDE1CisjZGVmaW5lIEhDX1N1YkFfSFpXQ0RMICAgICAgICAgIDB4MDAxNgorI2RlZmluZSBIQ19TdWJBX0haV0NUQUdudW0gICAgICAweDAwMTcKKyNkZWZpbmUgSENfU3ViQV9IWkNZTnVtICAgICAgICAgMHgwMDE4CisjZGVmaW5lIEhDX1N1YkFfSFpXQ0ZpcmUgICAgICAgIDB4MDAxOQorLyogSENfU3ViQV9IWldCVHlwZQorICovCisjZGVmaW5lIEhDX0haV0JUeXBlX01BU0sgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSFpCaWFzZWRXQl9NQVNLICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIQ19IWk9ORWFzRkZfTUFTSyAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhDX0haT09ORWFzRkZfTUFTSyAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSENfSFpXQkZNX01BU0sgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IWldCTG9jX01BU0sgICAgICAgICAweDAwMDBjMDAwCisjZGVmaW5lIEhDX0haV0JQaXRfTUFTSyAgICAgICAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSFpXQkZNXzE2ICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IWldCRk1fMzIgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhDX0haV0JGTV8yNCAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSFpXQkxvY19Mb2NhbCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IWldCTG9jX1N5UyAgICAgICAgICAweDAwMDA0MDAwCisvKiBIQ19TdWJBX0haV0JlbmQKKyAqLworI2RlZmluZSBIQ19IWldCZW5kX01BU0sgICAgICAgICAweDAwZmZlMDAwCisjZGVmaW5lIEhDX0haQmlhc0hfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFpXQmVuZF9TSElGVCAgICAgICAgMTAKKy8qIEhDX1N1YkFfSFpXVE1ECisgKi8KKyNkZWZpbmUgSENfSFpXVE1EX01BU0sgICAgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBIQ19IRUJFQmlhc19NQVNLICAgICAgICAweDAwMDA3ZjAwCisjZGVmaW5lIEhDX0haTkZfTUFTSyAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFpXVE1EX05ldmVyUGFzcyAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IWldUTURfTFQgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9FUSAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSENfSFpXVE1EX0xFICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIQ19IWldUTURfR1QgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhDX0haV1RNRF9ORSAgICAgICAgICAgIDB4MDAwNTAwMDAKKyNkZWZpbmUgSENfSFpXVE1EX0dFICAgICAgICAgICAgMHgwMDA2MDAwMAorI2RlZmluZSBIQ19IWldUTURfQWxsUGFzcyAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hFQkVCaWFzX1NISUZUICAgICAgIDgKKy8qIEhDX1N1YkFfSFpXQ0RMICAgICAgICAgIDB4MDAxNgorICovCisjZGVmaW5lIEhDX0haV0NETF9NQVNLICAgICAgICAgIDB4MDBmZmZmZmYKKy8qIEhDX1N1YkFfSFpXQ1RBR251bSAgICAgIDB4MDAxNworICovCisjZGVmaW5lIEhDX0haV0NUQUdudW1fTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFpXQ1RBR251bV9TSElGVCAgICAgMTYKKyNkZWZpbmUgSENfSFpXQ0RIX01BU0sgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IWldDREhfU0hJRlQgICAgICAgICAwCisvKiBIQ19TdWJBX0haQ1lOdW0gICAgICAgICAweDAwMTgKKyAqLworI2RlZmluZSBIQ19IWkNZTnVtX01BU0sgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEhDX0haQ1lOdW1fU0hJRlQgICAgICAgIDE2CisjZGVmaW5lIEhDX0haV0NRV251bV9NQVNLICAgICAgIDB4MDAwMDNmZmYKKyNkZWZpbmUgSENfSFpXQ1FXbnVtX1NISUZUICAgICAgMAorLyogSENfU3ViQV9IWldDRmlyZSAgICAgICAgMHgwMDE5CisgKi8KKyNkZWZpbmUgSENfWldDRmlyZV9NQVNLICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IWldDUVdudW1MYXN0X01BU0sgICAweDAwMDAzZmZmCisjZGVmaW5lIEhDX0haV0NRV251bUxhc3RfU0hJRlQgIDAKKworLyogU3RlbmNpbCBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IU1RSRUYgICAgICAgICAgMHgwMDIzCisjZGVmaW5lIEhDX1N1YkFfSFNUTUQgICAgICAgICAgIDB4MDAyNAorLyogSENfU3ViQV9IU0JGTQorICovCisjZGVmaW5lIEhDX0hTQkZNX01BU0sgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSFNCTG9jX01BU0sgICAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IU0JQaXRfTUFTSyAgICAgICAgICAweDAwMDAzZmZmCisvKiBIQ19TdWJBX0hTVFJFRgorICovCisjZGVmaW5lIEhDX0hTVFJFRl9NQVNLICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFNUT1BNU0tfTUFTSyAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IU1RCTVNLX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hTVFJFRl9TSElGVCAgICAgICAgIDE2CisjZGVmaW5lIEhDX0hTVE9QTVNLX1NISUZUICAgICAgIDgKKy8qIEhDX1N1YkFfSFNUTUQKKyAqLworI2RlZmluZSBIQ19IU1RNRF9NQVNLICAgICAgICAgICAweDAwMDcwMDAwCisjZGVmaW5lIEhDX0hTVE9QU0ZfTUFTSyAgICAgICAgIDB4MDAwMDAxYzAKKyNkZWZpbmUgSENfSFNUT1BTUFpGX01BU0sgICAgICAgMHgwMDAwMDAzOAorI2RlZmluZSBIQ19IU1RPUFNQWlBfTUFTSyAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX0hTVE1EX05ldmVyUGFzcyAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFNUTURfTFQgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IU1RNRF9FUSAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhDX0hTVE1EX0xFICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSFNUTURfR1QgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBIQ19IU1RNRF9ORSAgICAgICAgICAgICAweDAwMDUwMDAwCisjZGVmaW5lIEhDX0hTVE1EX0dFICAgICAgICAgICAgIDB4MDAwNjAwMDAKKyNkZWZpbmUgSENfSFNUTURfQWxsUGFzcyAgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBIQ19IU1RPUFNGX0tFRVAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hTVE9QU0ZfWkVSTyAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSENfSFNUT1BTRl9SRVBMQUNFICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IU1RPUFNGX0lOQ1JTQVQgICAgICAweDAwMDAwMGMwCisjZGVmaW5lIEhDX0hTVE9QU0ZfREVDUlNBVCAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSFNUT1BTRl9JTlZFUlQgICAgICAgMHgwMDAwMDE0MAorI2RlZmluZSBIQ19IU1RPUFNGX0lOQ1IgICAgICAgICAweDAwMDAwMTgwCisjZGVmaW5lIEhDX0hTVE9QU0ZfREVDUiAgICAgICAgIDB4MDAwMDAxYzAKKyNkZWZpbmUgSENfSFNUT1BTUFpGX0tFRVAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfWkVSTyAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hTVE9QU1BaRl9SRVBMQUNFICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgSENfSFNUT1BTUFpGX0lOQ1JTQVQgICAgMHgwMDAwMDAxOAorI2RlZmluZSBIQ19IU1RPUFNQWkZfREVDUlNBVCAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhDX0hTVE9QU1BaRl9JTlZFUlQgICAgIDB4MDAwMDAwMjgKKyNkZWZpbmUgSENfSFNUT1BTUFpGX0lOQ1IgICAgICAgMHgwMDAwMDAzMAorI2RlZmluZSBIQ19IU1RPUFNQWkZfREVDUiAgICAgICAweDAwMDAwMDM4CisjZGVmaW5lIEhDX0hTVE9QU1BaUF9LRUVQICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFNUT1BTUFpQX1pFUk8gICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19IU1RPUFNQWlBfUkVQTEFDRSAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hTVE9QU1BaUF9JTkNSU0FUICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0RFQ1JTQVQgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19IU1RPUFNQWlBfSU5WRVJUICAgICAweDAwMDAwMDA1CisjZGVmaW5lIEhDX0hTVE9QU1BaUF9JTkNSICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgSENfSFNUT1BTUFpQX0RFQ1IgICAgICAgMHgwMDAwMDAwNworCisvKiBBbHBoYSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IQUJCYXNMICAgICAgICAgMHgwMDMwCisjZGVmaW5lIEhDX1N1YkFfSEFCQmFzSCAgICAgICAgIDB4MDAzMQorI2RlZmluZSBIQ19TdWJBX0hBQkZNICAgICAgICAgICAweDAwMzIKKyNkZWZpbmUgSENfU3ViQV9IQVRNRCAgICAgICAgICAgMHgwMDMzCisjZGVmaW5lIEhDX1N1YkFfSEFCTENzYXQgICAgICAgIDB4MDAzNAorI2RlZmluZSBIQ19TdWJBX0hBQkxDb3AgICAgICAgICAweDAwMzUKKyNkZWZpbmUgSENfU3ViQV9IQUJMQXNhdCAgICAgICAgMHgwMDM2CisjZGVmaW5lIEhDX1N1YkFfSEFCTEFvcCAgICAgICAgIDB4MDAzNworI2RlZmluZSBIQ19TdWJBX0hBQkxSQ2EgICAgICAgICAweDAwMzgKKyNkZWZpbmUgSENfU3ViQV9IQUJMUkZDYSAgICAgICAgMHgwMDM5CisjZGVmaW5lIEhDX1N1YkFfSEFCTFJDYmlhcyAgICAgIDB4MDAzYQorI2RlZmluZSBIQ19TdWJBX0hBQkxSQ2IgICAgICAgICAweDAwM2IKKyNkZWZpbmUgSENfU3ViQV9IQUJMUkZDYiAgICAgICAgMHgwMDNjCisjZGVmaW5lIEhDX1N1YkFfSEFCTFJBYSAgICAgICAgIDB4MDAzZAorI2RlZmluZSBIQ19TdWJBX0hBQkxSQWIgICAgICAgICAweDAwM2UKKy8qIEhDX1N1YkFfSEFCRk0KKyAqLworI2RlZmluZSBIQ19IQUJGTV9NQVNLICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIEhDX0hBQkxvY19NQVNLICAgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgSENfSEFCUGl0X01BU0sgICAgICAgICAgMHgwMDAwMDdmZgorLyogSENfU3ViQV9IQVRNRAorICovCisjZGVmaW5lIEhDX0hBVE1EX01BU0sgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgSENfSEFUUkVGX01BU0sgICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IQVRNRF9OZXZlclBhc3MgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hBVE1EX0xUICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgSENfSEFUTURfRVEgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBIQ19IQVRNRF9MRSAgICAgICAgICAgICAweDAwMDAwMzAwCisjZGVmaW5lIEhDX0hBVE1EX0dUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSENfSEFUTURfTkUgICAgICAgICAgICAgMHgwMDAwMDUwMAorI2RlZmluZSBIQ19IQVRNRF9HRSAgICAgICAgICAgICAweDAwMDAwNjAwCisjZGVmaW5lIEhDX0hBVE1EX0FsbFBhc3MgICAgICAgIDB4MDAwMDA3MDAKKy8qIEhDX1N1YkFfSEFCTENzYXQKKyAqLworI2RlZmluZSBIQ19IQUJMQ3NhdF9NQVNLICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hBQkxDYV9NQVNLICAgICAgICAgIDB4MDAwMGZjMDAKKyNkZWZpbmUgSENfSEFCTENhX0NfTUFTSyAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IQUJMQ2FfT1BDX01BU0sgICAgICAweDAwMDAzYzAwCisjZGVmaW5lIEhDX0hBQkxGQ2FfTUFTSyAgICAgICAgIDB4MDAwMDAzZjAKKyNkZWZpbmUgSENfSEFCTEZDYV9DX01BU0sgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBIQ19IQUJMRkNhX09QQ19NQVNLICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hBQkxDYmlhc19NQVNLICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSEFCTENiaWFzX0NfTUFTSyAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19IQUJMQ2JpYXNfT1BDX01BU0sgICAweDAwMDAwMDA3CisvKi0tIERlZmluZSB0aGUgaW5wdXQgY29sb3IuCisgKi8KKyNkZWZpbmUgSENfWENfQ3NyYyAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YQ19DZHN0ICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX1hDX0FzcmMgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfWENfQWRzdCAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19YQ19Gb2cgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhDX1hDX0hBQkxSQyAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgSENfWENfbWluU3JjRHN0ICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19YQ19tYXhTcmNEc3QgICAgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX1hDX21pbUFzcmNJbnZBZHN0ICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfWENfT1BDICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YQ19JbnZPUEMgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1hDX09QQ3A1ICAgICAgICAgICAgIDB4MDAwMDAwMjAKKy8qLS0gRGVmaW5lIHRoZSBpbnB1dCBBbHBoYQorICovCisjZGVmaW5lIEhDX1hBX09QQSAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfWEFfSW52T1BBICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19YQV9PUEFwNSAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhDX1hBXzAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfWEFfQXNyYyAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19YQV9BZHN0ICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX1hBX0ZvZyAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfWEFfbWluQXNyY0ZvZyAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19YQV9taW5Bc3JjQWRzdCAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIEhDX1hBX21heEFzcmNGb2cgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgSENfWEFfbWF4QXNyY0Fkc3QgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBIQ19YQV9IQUJMUkEgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX1hBX21pbkFzcmNJbnZBZHN0ICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfWEFfSEFCTEZSQSAgICAgICAgICAgMHgwMDAwMDAwOQorLyotLQorICovCisjZGVmaW5lIEhDX0hBQkxDYV9PUEMgICAgICAgICAgIChIQ19YQ19PUEMgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9JbnZPUEMgICAgICAgIChIQ19YQ19JbnZPUEMgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9PUENwNSAgICAgICAgIChIQ19YQ19PUENwNSA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0NzcmMgICAgICAgICAgKEhDX1hDX0NzcmMgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9DZHN0ICAgICAgICAgIChIQ19YQ19DZHN0IDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQ2FfQXNyYyAgICAgICAgICAoSENfWENfQXNyYyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTENhX0Fkc3QgICAgICAgICAgKEhDX1hDX0Fkc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9Gb2cgICAgICAgICAgIChIQ19YQ19Gb2cgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9IQUJMUkNhICAgICAgIChIQ19YQ19IQUJMUkMgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9taW5TcmNEc3QgICAgIChIQ19YQ19taW5TcmNEc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxDYV9tYXhTcmNEc3QgICAgIChIQ19YQ19tYXhTcmNEc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxGQ2FfT1BDICAgICAgICAgICAgICAoSENfWENfT1BDIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfSW52T1BDICAgICAgICAgICAoSENfWENfSW52T1BDIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfT1BDcDUgICAgICAgICAgICAoSENfWENfT1BDcDUgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9Dc3JjICAgICAgICAgICAgIChIQ19YQ19Dc3JjIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfQ2RzdCAgICAgICAgICAgICAoSENfWENfQ2RzdCA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkNhX0FzcmMgICAgICAgICAgICAgKEhDX1hDX0FzcmMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZDYV9BZHN0ICAgICAgICAgICAgIChIQ19YQ19BZHN0IDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfRm9nICAgICAgICAgICAgICAoSENfWENfRm9nIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfSEFCTFJDYSAgICAgICAgICAoSENfWENfSEFCTFJDIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfbWluU3JjRHN0ICAgICAgICAoSENfWENfbWluU3JjRHN0IDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfbWF4U3JjRHN0ICAgICAgICAoSENfWENfbWF4U3JjRHN0IDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQ2FfbWltQXNyY0ludkFkc3QgICAoSENfWENfbWltQXNyY0ludkFkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTENiaWFzX0hBQkxSQ2JpYXMgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IQUJMQ2JpYXNfQXNyYyAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hBQkxDYmlhc19BZHN0ICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSEFCTENiaWFzX0ZvZyAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUJMQ2JpYXNfQ2luICAgICAgICAweDAwMDAwMDA0CisvKiBIQ19TdWJBX0hBQkxDb3AgICAgICAgICAweDAwMzUKKyAqLworI2RlZmluZSBIQ19IQUJMZG90X01BU0sgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhDX0hBQkxDb3BfTUFTSyAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSENfSEFCTENiX01BU0sgICAgICAgICAgMHgwMDAwM2YwMAorI2RlZmluZSBIQ19IQUJMQ2JfQ19NQVNLICAgICAgICAweDAwMDAzMDAwCisjZGVmaW5lIEhDX0hBQkxDYl9PUENfTUFTSyAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSEFCTEZDYl9NQVNLICAgICAgICAgMHgwMDAwMDBmYworI2RlZmluZSBIQ19IQUJMRkNiX0NfTUFTSyAgICAgICAweDAwMDAwMGMwCisjZGVmaW5lIEhDX0hBQkxGQ2JfT1BDX01BU0sgICAgIDB4MDAwMDAwM2MKKyNkZWZpbmUgSENfSEFCTENzaGlmdF9NQVNLICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IQUJMQ2JfT1BDICAgICAgICAgICAoSENfWENfT1BDIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9JbnZPUEMgICAgICAgIChIQ19YQ19JbnZPUEMgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX09QQ3A1ICAgICAgICAgKEhDX1hDX09QQ3A1IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9Dc3JjICAgICAgICAgIChIQ19YQ19Dc3JjIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9DZHN0ICAgICAgICAgIChIQ19YQ19DZHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9Bc3JjICAgICAgICAgIChIQ19YQ19Bc3JjIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9BZHN0ICAgICAgICAgIChIQ19YQ19BZHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9Gb2cgICAgICAgICAgIChIQ19YQ19Gb2cgPDwgOCkKKyNkZWZpbmUgSENfSEFCTENiX0hBQkxSQ2EgICAgICAgKEhDX1hDX0hBQkxSQyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQ2JfbWluU3JjRHN0ICAgICAoSENfWENfbWluU3JjRHN0IDw8IDgpCisjZGVmaW5lIEhDX0hBQkxDYl9tYXhTcmNEc3QgICAgIChIQ19YQ19tYXhTcmNEc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEZDYl9PUEMgICAgICAgICAgICAgIChIQ19YQ19PUEMgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9JbnZPUEMgICAgICAgICAgIChIQ19YQ19JbnZPUEMgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9PUENwNSAgICAgICAgICAgIChIQ19YQ19PUENwNSA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0NzcmMgICAgICAgICAgICAgKEhDX1hDX0NzcmMgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9DZHN0ICAgICAgICAgICAgIChIQ19YQ19DZHN0IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQ2JfQXNyYyAgICAgICAgICAgICAoSENfWENfQXNyYyA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkNiX0Fkc3QgICAgICAgICAgICAgKEhDX1hDX0Fkc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9Gb2cgICAgICAgICAgICAgIChIQ19YQ19Gb2cgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9IQUJMUkNiICAgICAgICAgIChIQ19YQ19IQUJMUkMgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9taW5TcmNEc3QgICAgICAgIChIQ19YQ19taW5TcmNEc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9tYXhTcmNEc3QgICAgICAgIChIQ19YQ19tYXhTcmNEc3QgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZDYl9taW1Bc3JjSW52QWRzdCAgIChIQ19YQ19taW1Bc3JjSW52QWRzdCA8PCAyKQorLyogSENfU3ViQV9IQUJMQXNhdCAgICAgICAgMHgwMDM2CisgKi8KKyNkZWZpbmUgSENfSEFCTEFzYXRfTUFTSyAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IQUJMQWFfTUFTSyAgICAgICAgICAweDAwMDBmYzAwCisjZGVmaW5lIEhDX0hBQkxBYV9BX01BU0sgICAgICAgIDB4MDAwMGMwMDAKKyNkZWZpbmUgSENfSEFCTEFhX09QQV9NQVNLICAgICAgMHgwMDAwM2MwMAorI2RlZmluZSBIQ19IQUJMRkFhX01BU0sgICAgICAgICAweDAwMDAwM2YwCisjZGVmaW5lIEhDX0hBQkxGQWFfQV9NQVNLICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgSENfSEFCTEZBYV9PUEFfTUFTSyAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBIQ19IQUJMQWJpYXNfTUFTSyAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hBQkxBYmlhc19BX01BU0sgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSEFCTEFiaWFzX09QQV9NQVNLICAgMHgwMDAwMDAwNworI2RlZmluZSBIQ19IQUJMQWFfT1BBICAgICAgICAgICAoSENfWEFfT1BBIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfSW52T1BBICAgICAgICAoSENfWEFfSW52T1BBIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfT1BBcDUgICAgICAgICAoSENfWEFfT1BBcDUgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV8wICAgICAgICAgICAgIChIQ19YQV8wIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfQXNyYyAgICAgICAgICAoSENfWEFfQXNyYyA8PCAxMCkKKyNkZWZpbmUgSENfSEFCTEFhX0Fkc3QgICAgICAgICAgKEhDX1hBX0Fkc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9Gb2cgICAgICAgICAgIChIQ19YQV9Gb2cgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9taW5Bc3JjRm9nICAgIChIQ19YQV9taW5Bc3JjRm9nIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfbWluQXNyY0Fkc3QgICAoSENfWEFfbWluQXNyY0Fkc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9tYXhBc3JjRm9nICAgIChIQ19YQV9tYXhBc3JjRm9nIDw8IDEwKQorI2RlZmluZSBIQ19IQUJMQWFfbWF4QXNyY0Fkc3QgICAoSENfWEFfbWF4QXNyY0Fkc3QgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxBYV9IQUJMUkEgICAgICAgIChIQ19YQV9IQUJMUkEgPDwgMTApCisjZGVmaW5lIEhDX0hBQkxGQWFfT1BBICAgICAgICAgIChIQ19YQV9PUEEgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9JbnZPUEEgICAgICAgKEhDX1hBX0ludk9QQSA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX09QQXA1ICAgICAgICAoSENfWEFfT1BBcDUgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV8wICAgICAgICAgICAgKEhDX1hBXzAgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9Bc3JjICAgICAgICAgKEhDX1hBX0FzcmMgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9BZHN0ICAgICAgICAgKEhDX1hBX0Fkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9Gb2cgICAgICAgICAgKEhDX1hBX0ZvZyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX21pbkFzcmNGb2cgICAoSENfWEFfbWluQXNyY0ZvZyA8PCA0KQorI2RlZmluZSBIQ19IQUJMRkFhX21pbkFzcmNBZHN0ICAoSENfWEFfbWluQXNyY0Fkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9tYXhBc3JjRm9nICAgKEhDX1hBX21heEFzcmNGb2cgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9tYXhBc3JjQWRzdCAgKEhDX1hBX21heEFzcmNBZHN0IDw8IDQpCisjZGVmaW5lIEhDX0hBQkxGQWFfbWluQXNyY0ludkFkc3QgICAoSENfWEFfbWluQXNyY0ludkFkc3QgPDwgNCkKKyNkZWZpbmUgSENfSEFCTEZBYV9IQUJMRlJBICAgICAgICAgIChIQ19YQV9IQUJMRlJBIDw8IDQpCisjZGVmaW5lIEhDX0hBQkxBYmlhc19IQUJMUkFiaWFzIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0FzcmMgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19IQUJMQWJpYXNfQWRzdCAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hBQkxBYmlhc19Gb2cgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSEFCTEFiaWFzX0FhYSAgICAgICAgMHgwMDAwMDAwNAorLyogSENfU3ViQV9IQUJMQW9wICAgICAgICAgMHgwMDM3CisgKi8KKyNkZWZpbmUgSENfSEFCTEFvcF9NQVNLICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIQ19IQUJMQWJfTUFTSyAgICAgICAgICAweDAwMDAzZjAwCisjZGVmaW5lIEhDX0hBQkxBYl9PUEFfTUFTSyAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSEFCTEZBYl9NQVNLICAgICAgICAgMHgwMDAwMDBmYworI2RlZmluZSBIQ19IQUJMRkFiX09QQV9NQVNLICAgICAweDAwMDAwMDNjCisjZGVmaW5lIEhDX0hBQkxBc2hpZnRfTUFTSyAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSEFCTEFiX09QQSAgICAgICAgICAgKEhDX1hBX09QQSA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfSW52T1BBICAgICAgICAoSENfWEFfSW52T1BBIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9PUEFwNSAgICAgICAgIChIQ19YQV9PUEFwNSA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfMCAgICAgICAgICAgICAoSENfWEFfMCA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfQXNyYyAgICAgICAgICAoSENfWEFfQXNyYyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfQWRzdCAgICAgICAgICAoSENfWEFfQWRzdCA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfRm9nICAgICAgICAgICAoSENfWEFfRm9nIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9taW5Bc3JjRm9nICAgIChIQ19YQV9taW5Bc3JjRm9nIDw8IDgpCisjZGVmaW5lIEhDX0hBQkxBYl9taW5Bc3JjQWRzdCAgIChIQ19YQV9taW5Bc3JjQWRzdCA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfbWF4QXNyY0ZvZyAgICAoSENfWEFfbWF4QXNyY0ZvZyA8PCA4KQorI2RlZmluZSBIQ19IQUJMQWJfbWF4QXNyY0Fkc3QgICAoSENfWEFfbWF4QXNyY0Fkc3QgPDwgOCkKKyNkZWZpbmUgSENfSEFCTEFiX0hBQkxSQSAgICAgICAgKEhDX1hBX0hBQkxSQSA8PCA4KQorI2RlZmluZSBIQ19IQUJMRkFiX09QQSAgICAgICAgICAoSENfWEFfT1BBIDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfSW52T1BBICAgICAgIChIQ19YQV9JbnZPUEEgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9PUEFwNSAgICAgICAgKEhDX1hBX09QQXA1IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfMCAgICAgICAgICAgIChIQ19YQV8wIDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfQXNyYyAgICAgICAgIChIQ19YQV9Bc3JjIDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfQWRzdCAgICAgICAgIChIQ19YQV9BZHN0IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfRm9nICAgICAgICAgIChIQ19YQV9Gb2cgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9taW5Bc3JjRm9nICAgKEhDX1hBX21pbkFzcmNGb2cgPDwgMikKKyNkZWZpbmUgSENfSEFCTEZBYl9taW5Bc3JjQWRzdCAgKEhDX1hBX21pbkFzcmNBZHN0IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfbWF4QXNyY0ZvZyAgIChIQ19YQV9tYXhBc3JjRm9nIDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfbWF4QXNyY0Fkc3QgIChIQ19YQV9tYXhBc3JjQWRzdCA8PCAyKQorI2RlZmluZSBIQ19IQUJMRkFiX21pbkFzcmNJbnZBZHN0ICAgKEhDX1hBX21pbkFzcmNJbnZBZHN0IDw8IDIpCisjZGVmaW5lIEhDX0hBQkxGQWJfSEFCTEZSQSAgICAgICAgICAoSENfWEFfSEFCTEZSQSA8PCAyKQorLyogSENfU3ViQV9IQUJMUkFhICAgICAgICAgMHgwMDNkCisgKi8KKyNkZWZpbmUgSENfSEFCTFJBYV9NQVNLICAgICAgICAgMHgwMGZmMDAwMAorI2RlZmluZSBIQ19IQUJMUkZBYV9NQVNLICAgICAgICAweDAwMDBmZjAwCisjZGVmaW5lIEhDX0hBQkxSQWJpYXNfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSEFCTFJBYV9TSElGVCAgICAgICAgMTYKKyNkZWZpbmUgSENfSEFCTFJGQWFfU0hJRlQgICAgICAgOAorLyogSENfU3ViQV9IQUJMUkFiICAgICAgICAgMHgwMDNlCisgKi8KKyNkZWZpbmUgSENfSEFCTFJBYl9NQVNLICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IQUJMUkZBYl9NQVNLICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hBQkxSQWJfU0hJRlQgICAgICAgIDgKKworLyogRGVzdGluYXRpb24gU2V0dGluZworICovCisjZGVmaW5lIEhDX1N1YkFfSERCQmFzTCAgICAgICAgIDB4MDA0MAorI2RlZmluZSBIQ19TdWJBX0hEQkJhc0ggICAgICAgICAweDAwNDEKKyNkZWZpbmUgSENfU3ViQV9IREJGTSAgICAgICAgICAgMHgwMDQyCisjZGVmaW5lIEhDX1N1YkFfSEZCQk1TS0wgICAgICAgIDB4MDA0MworI2RlZmluZSBIQ19TdWJBX0hST1AgICAgICAgICAgICAweDAwNDQKKy8qIEhDX1N1YkFfSERCRk0gICAgICAgICAgIDB4MDA0MgorICovCisjZGVmaW5lIEhDX0hEQkZNX01BU0sgICAgICAgICAgIDB4MDAxZjAwMDAKKyNkZWZpbmUgSENfSERCTG9jX01BU0sgICAgICAgICAgMHgwMDAwYzAwMAorI2RlZmluZSBIQ19IREJQaXRfTUFTSyAgICAgICAgICAweDAwMDAzZmZmCisjZGVmaW5lIEhDX0hEQkZNX1JHQjU1NSAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSERCRk1fUkdCNTY1ICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IREJGTV9BUkdCNDQ0NCAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FSR0IxNTU1ICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSERCRk1fQkdSNTU1ICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBIQ19IREJGTV9CR1I1NjUgICAgICAgICAweDAwMDUwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FCR1I0NDQ0ICAgICAgIDB4MDAwNjAwMDAKKyNkZWZpbmUgSENfSERCRk1fQUJHUjE1NTUgICAgICAgMHgwMDA3MDAwMAorI2RlZmluZSBIQ19IREJGTV9BUkdCMDg4OCAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hEQkZNX0FSR0I4ODg4ICAgICAgIDB4MDAwOTAwMDAKKyNkZWZpbmUgSENfSERCRk1fQUJHUjA4ODggICAgICAgMHgwMDBhMDAwMAorI2RlZmluZSBIQ19IREJGTV9BQkdSODg4OCAgICAgICAweDAwMGIwMDAwCisjZGVmaW5lIEhDX0hEQkxvY19Mb2NhbCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSERCTG9jX1N5cyAgICAgICAgICAgMHgwMDAwNDAwMAorLyogSENfU3ViQV9IUk9QICAgICAgICAgICAgMHgwMDQ0CisgKi8KKyNkZWZpbmUgSENfSFJPUF9NQVNLICAgICAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IRkJCTVNLSF9NQVNLICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hST1BfQkxBQ0sgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFJPUF9EUG9uICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IUk9QX0RQbmEgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhDX0hST1BfUG4gICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgSENfSFJPUF9QRG5hICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBIQ19IUk9QX0RuICAgICAgICAgICAgICAweDAwMDAwNTAwCisjZGVmaW5lIEhDX0hST1BfRFB4ICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgSENfSFJPUF9EUGFuICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBIQ19IUk9QX0RQYSAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhDX0hST1BfRFB4biAgICAgICAgICAgIDB4MDAwMDA5MDAKKyNkZWZpbmUgSENfSFJPUF9EICAgICAgICAgICAgICAgMHgwMDAwMGEwMAorI2RlZmluZSBIQ19IUk9QX0RQbm8gICAgICAgICAgICAweDAwMDAwYjAwCisjZGVmaW5lIEhDX0hST1BfUCAgICAgICAgICAgICAgIDB4MDAwMDBjMDAKKyNkZWZpbmUgSENfSFJPUF9QRG5vICAgICAgICAgICAgMHgwMDAwMGQwMAorI2RlZmluZSBIQ19IUk9QX0RQbyAgICAgICAgICAgICAweDAwMDAwZTAwCisjZGVmaW5lIEhDX0hST1BfV0hJVEUgICAgICAgICAgIDB4MDAwMDBmMDAKKworLyogRm9nIFNldHRpbmcKKyAqLworI2RlZmluZSBIQ19TdWJBX0hGb2dMRiAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgSENfU3ViQV9IRm9nQ0wgICAgICAgICAgMHgwMDUxCisjZGVmaW5lIEhDX1N1YkFfSEZvZ0NIICAgICAgICAgIDB4MDA1MgorI2RlZmluZSBIQ19TdWJBX0hGb2dTdEwgICAgICAgICAweDAwNTMKKyNkZWZpbmUgSENfU3ViQV9IRm9nU3RIICAgICAgICAgMHgwMDU0CisjZGVmaW5lIEhDX1N1YkFfSEZvZ09PZE1GICAgICAgIDB4MDA1NQorI2RlZmluZSBIQ19TdWJBX0hGb2dPT2RFRiAgICAgICAweDAwNTYKKyNkZWZpbmUgSENfU3ViQV9IRm9nRW5kTCAgICAgICAgMHgwMDU3CisjZGVmaW5lIEhDX1N1YkFfSEZvZ0RlbnN0ICAgICAgIDB4MDA1OAorLyogSENfU3ViQV9Gb2dMRiAgICAgICAgICAgMHgwMDUwCisgKi8KKyNkZWZpbmUgSENfRm9nTEZfTUFTSyAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19Gb2dFcV9NQVNLICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0ZvZ01EX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgSENfRm9nTURfTG9jYWxGb2cgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfRm9nTURfTGluZWFyRm9nICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfRm9nTURfRXhwb25lbnRpYWxGb2cgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfRm9nTURfRXhwb25lbnRpYWwyRm9nIDB4MDAwMDAwMDUKKy8qICNkZWZpbmUgSENfRm9nTURfRm9nVGFibGUgICAgICAgMHgwMDAwMDAwMyAqLworCisvKiBIQ19TdWJBX0hGb2dEZW5zdCAgICAgICAgMHgwMDU4CisgKi8KKyNkZWZpbmUgSENfRm9nRGVuc3RfTUFTSyAgICAgICAgMHgwMDFmZmYwMAorI2RlZmluZSBIQ19Gb2dFbmRMX01BU0sgICAgICAgICAweDAwMDAwMGZmCisKKy8qIFRleHR1cmUgc3VidHlwZSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEhDX1N1YlR5cGVfVGV4MCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfU3ViVHlwZV9UZXgxICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19TdWJUeXBlX1RleEdlbmVyYWwgICAweDAwMDAwMGZlCisKKy8qIEF0dHJpYnV0ZSBvZiB0ZXh0dXJlIG4KKyAqLworI2RlZmluZSBIQ19TdWJBX0hUWG5MMEJhc0wgICAgICAweDAwMDAKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDFCYXNMICAgICAgMHgwMDAxCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwyQmFzTCAgICAgIDB4MDAwMgorI2RlZmluZSBIQ19TdWJBX0hUWG5MM0Jhc0wgICAgICAweDAwMDMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDRCYXNMICAgICAgMHgwMDA0CisjZGVmaW5lIEhDX1N1YkFfSFRYbkw1QmFzTCAgICAgIDB4MDAwNQorI2RlZmluZSBIQ19TdWJBX0hUWG5MNkJhc0wgICAgICAweDAwMDYKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDdCYXNMICAgICAgMHgwMDA3CisjZGVmaW5lIEhDX1N1YkFfSFRYbkw4QmFzTCAgICAgIDB4MDAwOAorI2RlZmluZSBIQ19TdWJBX0hUWG5MOUJhc0wgICAgICAweDAwMDkKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGFCYXNMICAgICAgMHgwMDBhCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxiQmFzTCAgICAgIDB4MDAwYgorI2RlZmluZSBIQ19TdWJBX0hUWG5MY0Jhc0wgICAgICAweDAwMGMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGRCYXNMICAgICAgMHgwMDBkCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxlQmFzTCAgICAgIDB4MDAwZQorI2RlZmluZSBIQ19TdWJBX0hUWG5MZkJhc0wgICAgICAweDAwMGYKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDEwQmFzTCAgICAgMHgwMDEwCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwxMUJhc0wgICAgIDB4MDAxMQorI2RlZmluZSBIQ19TdWJBX0hUWG5MMDEyQmFzSCAgICAweDAwMjAKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDM0NUJhc0ggICAgMHgwMDIxCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw2NzhCYXNIICAgIDB4MDAyMgorI2RlZmluZSBIQ19TdWJBX0hUWG5MOWFiQmFzSCAgICAweDAwMjMKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGNkZUJhc0ggICAgMHgwMDI0CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxmMTAxMUJhc0ggIDB4MDAyNQorI2RlZmluZSBIQ19TdWJBX0hUWG5MMFBpdCAgICAgICAweDAwMmIKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDFQaXQgICAgICAgMHgwMDJjCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwyUGl0ICAgICAgIDB4MDAyZAorI2RlZmluZSBIQ19TdWJBX0hUWG5MM1BpdCAgICAgICAweDAwMmUKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDRQaXQgICAgICAgMHgwMDJmCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw1UGl0ICAgICAgIDB4MDAzMAorI2RlZmluZSBIQ19TdWJBX0hUWG5MNlBpdCAgICAgICAweDAwMzEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDdQaXQgICAgICAgMHgwMDMyCisjZGVmaW5lIEhDX1N1YkFfSFRYbkw4UGl0ICAgICAgIDB4MDAzMworI2RlZmluZSBIQ19TdWJBX0hUWG5MOVBpdCAgICAgICAweDAwMzQKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGFQaXQgICAgICAgMHgwMDM1CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxiUGl0ICAgICAgIDB4MDAzNgorI2RlZmluZSBIQ19TdWJBX0hUWG5MY1BpdCAgICAgICAweDAwMzcKKyNkZWZpbmUgSENfU3ViQV9IVFhuTGRQaXQgICAgICAgMHgwMDM4CisjZGVmaW5lIEhDX1N1YkFfSFRYbkxlUGl0ICAgICAgIDB4MDAzOQorI2RlZmluZSBIQ19TdWJBX0hUWG5MZlBpdCAgICAgICAweDAwM2EKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDEwUGl0ICAgICAgMHgwMDNiCisjZGVmaW5lIEhDX1N1YkFfSFRYbkwxMVBpdCAgICAgIDB4MDAzYworI2RlZmluZSBIQ19TdWJBX0hUWG5MMF81V0UgICAgICAweDAwNGIKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDZfYldFICAgICAgMHgwMDRjCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxjXzExV0UgICAgIDB4MDA0ZAorI2RlZmluZSBIQ19TdWJBX0hUWG5MMF81SEUgICAgICAweDAwNTEKKyNkZWZpbmUgSENfU3ViQV9IVFhuTDZfYkhFICAgICAgMHgwMDUyCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxjXzExSEUgICAgIDB4MDA1MworI2RlZmluZSBIQ19TdWJBX0hUWG5MME9TICAgICAgICAweDAwNzcKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEIgICAgICAgICAgMHgwMDc4CisjZGVmaW5lIEhDX1N1YkFfSFRYbk1QTUQgICAgICAgIDB4MDA3OQorI2RlZmluZSBIQ19TdWJBX0hUWG5DTE9EdSAgICAgICAweDAwN2EKKyNkZWZpbmUgSENfU3ViQV9IVFhuRk0gICAgICAgICAgMHgwMDdiCisjZGVmaW5lIEhDX1N1YkFfSFRYblRSQ0ggICAgICAgIDB4MDA3YworI2RlZmluZSBIQ19TdWJBX0hUWG5UUkNMICAgICAgICAweDAwN2QKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJDICAgICAgICAgMHgwMDdlCisjZGVmaW5lIEhDX1N1YkFfSFRYblRSQUggICAgICAgIDB4MDA3ZgorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxDc2F0ICAgICAweDAwODAKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMQ29wICAgICAgMHgwMDgxCisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTE1QZm9nICAgIDB4MDA4MgorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxBc2F0ICAgICAweDAwODMKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMUkNhICAgICAgMHgwMDg1CisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTFJDYiAgICAgIDB4MDA4NgorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxSQ2MgICAgICAweDAwODcKKyNkZWZpbmUgSENfU3ViQV9IVFhuVEJMUkNiaWFzICAgMHgwMDg4CisjZGVmaW5lIEhDX1N1YkFfSFRYblRCTFJBYSAgICAgIDB4MDA4OQorI2RlZmluZSBIQ19TdWJBX0hUWG5UQkxSRm9nICAgICAweDAwOGEKKyNkZWZpbmUgSENfU3ViQV9IVFhuQnVtcE0wMCAgICAgMHgwMDkwCisjZGVmaW5lIEhDX1N1YkFfSFRYbkJ1bXBNMDEgICAgIDB4MDA5MQorI2RlZmluZSBIQ19TdWJBX0hUWG5CdW1wTTEwICAgICAweDAwOTIKKyNkZWZpbmUgSENfU3ViQV9IVFhuQnVtcE0xMSAgICAgMHgwMDkzCisjZGVmaW5lIEhDX1N1YkFfSFRYbkxTY2FsZSAgICAgIDB4MDA5NAorI2RlZmluZSBIQ19TdWJBX0hUWFNNRCAgICAgICAgICAweDAwMDAKKy8qIEhDX1N1YkFfSFRYbkwwMTJCYXNIICAgIDB4MDAyMAorICovCisjZGVmaW5lIEhDX0hUWG5MMEJhc0hfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYbkwxQmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTDJCYXNIX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5MMUJhc0hfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYbkwyQmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkwzNDVCYXNIICAgIDB4MDAyMQorICovCisjZGVmaW5lIEhDX0hUWG5MM0Jhc0hfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYbkw0QmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTDVCYXNIX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5MNEJhc0hfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYbkw1QmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkw2NzhCYXNIICAgIDB4MDAyMgorICovCisjZGVmaW5lIEhDX0hUWG5MNkJhc0hfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYbkw3QmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTDhCYXNIX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5MN0Jhc0hfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYbkw4QmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkw5YWJCYXNIICAgIDB4MDAyMworICovCisjZGVmaW5lIEhDX0hUWG5MOUJhc0hfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYbkxhQmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTGJCYXNIX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5MYUJhc0hfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYbkxiQmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkxjZGVCYXNIICAgIDB4MDAyNAorICovCisjZGVmaW5lIEhDX0hUWG5MY0Jhc0hfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYbkxkQmFzSF9NQVNLICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuTGVCYXNIX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5MZEJhc0hfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYbkxlQmFzSF9TSElGVCAgICAgMTYKKy8qIEhDX1N1YkFfSFRYbkxjZGVCYXNIICAgIDB4MDAyNQorICovCisjZGVmaW5lIEhDX0hUWG5MZkJhc0hfTUFTSyAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgSENfSFRYbkwxMEJhc0hfTUFTSyAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSFRYbkwxMUJhc0hfTUFTSyAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYbkwxMEJhc0hfU0hJRlQgICAgIDgKKyNkZWZpbmUgSENfSFRYbkwxMUJhc0hfU0hJRlQgICAgIDE2CisvKiBIQ19TdWJBX0hUWG5MMFBpdCAgICAgICAweDAwMmIKKyAqLworI2RlZmluZSBIQ19IVFhuTG5QaXRfTUFTSyAgICAgICAweDAwMDAzZmZmCisjZGVmaW5lIEhDX0hUWG5FblBpdF9NQVNLICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSFRYbkxuUGl0RV9NQVNLICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTG5QaXRFX1NISUZUICAgICAyMAorLyogSENfU3ViQV9IVFhuTDBfNVdFICAgICAgMHgwMDRiCisgKi8KKyNkZWZpbmUgSENfSFRYbkwwV0VfTUFTSyAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IVFhuTDFXRV9NQVNLICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hUWG5MMldFX01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSFRYbkwzV0VfTUFTSyAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBIQ19IVFhuTDRXRV9NQVNLICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hUWG5MNVdFX01BU0sgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkwxV0VfU0hJRlQgICAgICAgNAorI2RlZmluZSBIQ19IVFhuTDJXRV9TSElGVCAgICAgICA4CisjZGVmaW5lIEhDX0hUWG5MM1dFX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MNFdFX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5MNVdFX1NISUZUICAgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MNl9iV0UgICAgICAweDAwNGMKKyAqLworI2RlZmluZSBIQ19IVFhuTDZXRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MN1dFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkw4V0VfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTDlXRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MYVdFX01BU0sgICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkxiV0VfTUFTSyAgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTDdXRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MOFdFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkw5V0VfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkxhV0VfU0hJRlQgICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkxiV0VfU0hJRlQgICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkxjXzExV0UgICAgICAweDAwNGQKKyAqLworI2RlZmluZSBIQ19IVFhuTGNXRV9NQVNLICAgICAgICAweDAwMDAwMDBmCisjZGVmaW5lIEhDX0hUWG5MZFdFX01BU0sgICAgICAgIDB4MDAwMDAwZjAKKyNkZWZpbmUgSENfSFRYbkxlV0VfTUFTSyAgICAgICAgMHgwMDAwMGYwMAorI2RlZmluZSBIQ19IVFhuTGZXRV9NQVNLICAgICAgICAweDAwMDBmMDAwCisjZGVmaW5lIEhDX0hUWG5MMTBXRV9NQVNLICAgICAgIDB4MDAwZjAwMDAKKyNkZWZpbmUgSENfSFRYbkwxMVdFX01BU0sgICAgICAgMHgwMGYwMDAwMAorI2RlZmluZSBIQ19IVFhuTGRXRV9TSElGVCAgICAgICA0CisjZGVmaW5lIEhDX0hUWG5MZVdFX1NISUZUICAgICAgIDgKKyNkZWZpbmUgSENfSFRYbkxmV0VfU0hJRlQgICAgICAgMTIKKyNkZWZpbmUgSENfSFRYbkwxMFdFX1NISUZUICAgICAgMTYKKyNkZWZpbmUgSENfSFRYbkwxMVdFX1NISUZUICAgICAgMjAKKy8qIEhDX1N1YkFfSFRYbkwwXzVIRSAgICAgIDB4MDA1MQorICovCisjZGVmaW5lIEhDX0hUWG5MMEhFX01BU0sgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgSENfSFRYbkwxSEVfTUFTSyAgICAgICAgMHgwMDAwMDBmMAorI2RlZmluZSBIQ19IVFhuTDJIRV9NQVNLICAgICAgICAweDAwMDAwZjAwCisjZGVmaW5lIEhDX0hUWG5MM0hFX01BU0sgICAgICAgIDB4MDAwMGYwMDAKKyNkZWZpbmUgSENfSFRYbkw0SEVfTUFTSyAgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBIQ19IVFhuTDVIRV9NQVNLICAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5MMUhFX1NISUZUICAgICAgIDQKKyNkZWZpbmUgSENfSFRYbkwySEVfU0hJRlQgICAgICAgOAorI2RlZmluZSBIQ19IVFhuTDNIRV9TSElGVCAgICAgICAxMgorI2RlZmluZSBIQ19IVFhuTDRIRV9TSElGVCAgICAgICAxNgorI2RlZmluZSBIQ19IVFhuTDVIRV9TSElGVCAgICAgICAyMAorLyogSENfU3ViQV9IVFhuTDZfYkhFICAgICAgMHgwMDUyCisgKi8KKyNkZWZpbmUgSENfSFRYbkw2SEVfTUFTSyAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IVFhuTDdIRV9NQVNLICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hUWG5MOEhFX01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSFRYbkw5SEVfTUFTSyAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBIQ19IVFhuTGFIRV9NQVNLICAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hUWG5MYkhFX01BU0sgICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkw3SEVfU0hJRlQgICAgICAgNAorI2RlZmluZSBIQ19IVFhuTDhIRV9TSElGVCAgICAgICA4CisjZGVmaW5lIEhDX0hUWG5MOUhFX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MYUhFX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5MYkhFX1NISUZUICAgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MY18xMUhFICAgICAgMHgwMDUzCisgKi8KKyNkZWZpbmUgSENfSFRYbkxjSEVfTUFTSyAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IVFhuTGRIRV9NQVNLICAgICAgICAweDAwMDAwMGYwCisjZGVmaW5lIEhDX0hUWG5MZUhFX01BU0sgICAgICAgIDB4MDAwMDBmMDAKKyNkZWZpbmUgSENfSFRYbkxmSEVfTUFTSyAgICAgICAgMHgwMDAwZjAwMAorI2RlZmluZSBIQ19IVFhuTDEwSEVfTUFTSyAgICAgICAweDAwMGYwMDAwCisjZGVmaW5lIEhDX0hUWG5MMTFIRV9NQVNLICAgICAgIDB4MDBmMDAwMDAKKyNkZWZpbmUgSENfSFRYbkxkSEVfU0hJRlQgICAgICAgNAorI2RlZmluZSBIQ19IVFhuTGVIRV9TSElGVCAgICAgICA4CisjZGVmaW5lIEhDX0hUWG5MZkhFX1NISUZUICAgICAgIDEyCisjZGVmaW5lIEhDX0hUWG5MMTBIRV9TSElGVCAgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5MMTFIRV9TSElGVCAgICAgIDIwCisvKiBIQ19TdWJBX0hUWG5MME9TICAgICAgICAweDAwNzcKKyAqLworI2RlZmluZSBIQ19IVFhuTDBPU19NQVNLICAgICAgICAweDAwM2ZmMDAwCisjZGVmaW5lIEhDX0hUWG5MVm1heF9NQVNLICAgICAgIDB4MDAwMDBmYzAKKyNkZWZpbmUgSENfSFRYbkxWbWluX01BU0sgICAgICAgMHgwMDAwMDAzZgorI2RlZmluZSBIQ19IVFhuTDBPU19TSElGVCAgICAgICAxMgorI2RlZmluZSBIQ19IVFhuTFZtYXhfU0hJRlQgICAgICA2CisvKiBIQ19TdWJBX0hUWG5UQiAgICAgICAgICAweDAwNzgKKyAqLworI2RlZmluZSBIQ19IVFhuVEJfTUFTSyAgICAgICAgICAweDAwZjAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTFNlX01BU0sgICAgICAgIDB4MDAwMGUwMDAKKyNkZWZpbmUgSENfSFRYbkZMU3NfTUFTSyAgICAgICAgMHgwMDAwMWMwMAorI2RlZmluZSBIQ19IVFhuRkxUZV9NQVNLICAgICAgICAweDAwMDAwMzgwCisjZGVmaW5lIEhDX0hUWG5GTFRzX01BU0sgICAgICAgIDB4MDAwMDAwNzAKKyNkZWZpbmUgSENfSFRYbkZMRHNfTUFTSyAgICAgICAgMHgwMDAwMDAwZgorI2RlZmluZSBIQ19IVFhuVEJfTm9UQiAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQl9UQkNfUyAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCX1RCQ19UICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJfVEJfUyAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQl9UQl9UICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMU2VfTmVhcmVzdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxTZV9MaW5lYXIgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhDX0hUWG5GTFNlX05vbkxpbmVhciAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgSENfSFRYbkZMU2VfU2hhcnAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBIQ19IVFhuRkxTZV9GbGF0X0dhdXNzaWFuX0N1YmljIDB4MDAwMGMwMDAKKyNkZWZpbmUgSENfSFRYbkZMU3NfTmVhcmVzdCAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRkxTc19MaW5lYXIgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhDX0hUWG5GTFNzX05vbkxpbmVhciAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgSENfSFRYbkZMU3NfRmxhdF9HYXVzc2lhbl9DdWJpYyAweDAwMDAxODAwCisjZGVmaW5lIEhDX0hUWG5GTFRlX05lYXJlc3QgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMVGVfTGluZWFyICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IVFhuRkxUZV9Ob25MaW5lYXIgICAweDAwMDAwMTAwCisjZGVmaW5lIEhDX0hUWG5GTFRlX1NoYXJwICAgICAgIDB4MDAwMDAxODAKKyNkZWZpbmUgSENfSFRYbkZMVGVfRmxhdF9HYXVzc2lhbl9DdWJpYyAweDAwMDAwMzAwCisjZGVmaW5lIEhDX0hUWG5GTFRzX05lYXJlc3QgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZMVHNfTGluZWFyICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IVFhuRkxUc19Ob25MaW5lYXIgICAweDAwMDAwMDIwCisjZGVmaW5lIEhDX0hUWG5GTFRzX0ZsYXRfR2F1c3NpYW5fQ3ViaWMgMHgwMDAwMDA2MAorI2RlZmluZSBIQ19IVFhuRkxEc19UZXgwICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5GTERzX05lYXJlc3QgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfSFRYbkZMRHNfTGluZWFyICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IVFhuRkxEc19Ob25MaW5lYXIgICAweDAwMDAwMDAzCisjZGVmaW5lIEhDX0hUWG5GTERzX0RpdGhlciAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSFRYbkZMRHNfQ29uc3RMT0QgICAgMHgwMDAwMDAwNQorI2RlZmluZSBIQ19IVFhuRkxEc19BbmkgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEhDX0hUWG5GTERzX0FuaURpdGhlciAgIDB4MDAwMDAwMDcKKy8qIEhDX1N1YkFfSFRYbk1QTUQgICAgICAgIDB4MDA3OQorICovCisjZGVmaW5lIEhDX0hUWG5NUE1EX1NNQVNLICAgICAgIDB4MDAwNzAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfVE1BU0sgICAgICAgMHgwMDM4MDAwMAorI2RlZmluZSBIQ19IVFhuTE9ERFRmX01BU0sgICAgICAweDAwMDAwMDA3CisjZGVmaW5lIEhDX0hUWG5YWTJTVF9NQVNLICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFRYbk1QTURfVHNpbmdsZSAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9UY2xhbXAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1RyZXBlYXQgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfVG1pcnJvciAgICAgMHgwMDE4MDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9Ud3JhcCAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1NzaW5nbGUgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfU2NsYW1wICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIQ19IVFhuTVBNRF9TcmVwZWF0ICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhDX0hUWG5NUE1EX1NtaXJyb3IgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSENfSFRYbk1QTURfU3dyYXAgICAgICAgMHgwMDA0MDAwMAorLyogSENfU3ViQV9IVFhuQ0xPRHUgICAgICAgMHgwMDdhCisgKi8KKyNkZWZpbmUgSENfSFRYbkNMT0R1X01BU0sgICAgICAgMHgwMDBmZmMwMAorI2RlZmluZSBIQ19IVFhuQ0xPRGRfTUFTSyAgICAgICAweDAwMDAwM2ZmCisjZGVmaW5lIEhDX0hUWG5DTE9EdV9TSElGVCAgICAgIDEwCisvKiBIQ19TdWJBX0hUWG5GTSAgICAgICAgICAweDAwN2IKKyAqLworI2RlZmluZSBIQ19IVFhuRk1fTUFTSyAgICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5Mb2NfTUFTSyAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSFRYbkZNX0lOREVYICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuRk1fSW50ZW5zaXR5ICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9MdW0gICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0FscGhhICAgICAgICAgMHgwMDE4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fRFggICAgICAgICAgICAweDAwMjgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9BUkdCMTYgICAgICAgIDB4MDA4ODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0FSR0IzMiAgICAgICAgMHgwMDk4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQUJHUjE2ICAgICAgICAweDAwYTgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSMzIgICAgICAgIDB4MDBiODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkExNiAgICAgICAgMHgwMGM4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTMyICAgICAgICAweDAwZDgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBMTYgICAgICAgIDB4MDBlODAwMDAKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkEzMiAgICAgICAgMHgwMGY4MDAwMAorI2RlZmluZSBIQ19IVFhuRk1fQlVNUE1BUCAgICAgICAweDAwMzgwMDAwCisjZGVmaW5lIEhDX0hUWG5GTV9JbmRleDEgICAgICAgIChIQ19IVFhuRk1fSU5ERVggICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0luZGV4MiAgICAgICAgKEhDX0hUWG5GTV9JTkRFWCAgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fSW5kZXg0ICAgICAgICAoSENfSFRYbkZNX0lOREVYICAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9JbmRleDggICAgICAgIChIQ19IVFhuRk1fSU5ERVggICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1QxICAgICAgICAgICAgKEhDX0hUWG5GTV9JbnRlbnNpdHkgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fVDIgICAgICAgICAgICAoSENfSFRYbkZNX0ludGVuc2l0eSB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9UNCAgICAgICAgICAgIChIQ19IVFhuRk1fSW50ZW5zaXR5IHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1Q4ICAgICAgICAgICAgKEhDX0hUWG5GTV9JbnRlbnNpdHkgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fTDEgICAgICAgICAgICAoSENfSFRYbkZNX0x1bSAgICAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MMiAgICAgICAgICAgIChIQ19IVFhuRk1fTHVtICAgICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0w0ICAgICAgICAgICAgKEhDX0hUWG5GTV9MdW0gICAgICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fTDggICAgICAgICAgICAoSENfSFRYbkZNX0x1bSAgICAgICB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BTDQ0ICAgICAgICAgIChIQ19IVFhuRk1fTHVtICAgICAgIHwgMHgwMDA0MDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FMODggICAgICAgICAgKEhDX0hUWG5GTV9MdW0gICAgICAgfCAweDAwMDUwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQTEgICAgICAgICAgICAoSENfSFRYbkZNX0FscGhhICAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BMiAgICAgICAgICAgIChIQ19IVFhuRk1fQWxwaGEgICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0E0ICAgICAgICAgICAgKEhDX0hUWG5GTV9BbHBoYSAgICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQTggICAgICAgICAgICAoSENfSFRYbkZNX0FscGhhICAgICB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9EWDEgICAgICAgICAgIChIQ19IVFhuRk1fRFggICAgICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0RYMjMgICAgICAgICAgKEhDX0hUWG5GTV9EWCAgICAgICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fRFg0NSAgICAgICAgICAoSENfSFRYbkZNX0RYICAgICAgICB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9SR0I1NTUgICAgICAgIChIQ19IVFhuRk1fQVJHQjE2ICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQjU2NSAgICAgICAgKEhDX0hUWG5GTV9BUkdCMTYgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQVJHQjE1NTUgICAgICAoSENfSFRYbkZNX0FSR0IxNiAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BUkdCNDQ0NCAgICAgIChIQ19IVFhuRk1fQVJHQjE2ICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FSR0IwODg4ICAgICAgKEhDX0hUWG5GTV9BUkdCMzIgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQVJHQjg4ODggICAgICAoSENfSFRYbkZNX0FSR0IzMiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1I1NTUgICAgICAgIChIQ19IVFhuRk1fQUJHUjE2ICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUjU2NSAgICAgICAgKEhDX0hUWG5GTV9BQkdSMTYgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQUJHUjE1NTUgICAgICAoSENfSFRYbkZNX0FCR1IxNiAgICB8IDB4MDAwMjAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9BQkdSNDQ0NCAgICAgIChIQ19IVFhuRk1fQUJHUjE2ICAgIHwgMHgwMDAzMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0FCR1IwODg4ICAgICAgKEhDX0hUWG5GTV9BQkdSMzIgICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQUJHUjg4ODggICAgICAoSENfSFRYbkZNX0FCR1IzMiAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9SR0JBNTU1MCAgICAgIChIQ19IVFhuRk1fUkdCQTE2ICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkE1NTUxICAgICAgKEhDX0hUWG5GTV9SR0JBMTYgICAgfCAweDAwMDIwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fUkdCQTQ0NDQgICAgICAoSENfSFRYbkZNX1JHQkExNiAgICB8IDB4MDAwMzAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9SR0JBODg4MCAgICAgIChIQ19IVFhuRk1fUkdCQTMyICAgIHwgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1JHQkE4ODg4ICAgICAgKEhDX0hUWG5GTV9SR0JBMzIgICAgfCAweDAwMDEwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQkdSQTU1NTAgICAgICAoSENfSFRYbkZNX0JHUkExNiAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBNTU1MSAgICAgIChIQ19IVFhuRk1fQkdSQTE2ICAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX0JHUkE0NDQ0ICAgICAgKEhDX0hUWG5GTV9CR1JBMTYgICAgfCAweDAwMDMwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fQkdSQTg4ODAgICAgICAoSENfSFRYbkZNX0JHUkEzMiAgICB8IDB4MDAwMDAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9CR1JBODg4OCAgICAgIChIQ19IVFhuRk1fQkdSQTMyICAgIHwgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSENfSFRYbkZNX1ZVODggICAgICAgICAgKEhDX0hUWG5GTV9CVU1QTUFQICAgfCAweDAwMDAwMDAwKQorI2RlZmluZSBIQ19IVFhuRk1fTFZVNjU1ICAgICAgICAoSENfSFRYbkZNX0JVTVBNQVAgICB8IDB4MDAwMTAwMDApCisjZGVmaW5lIEhDX0hUWG5GTV9MVlU4ODggICAgICAgIChIQ19IVFhuRk1fQlVNUE1BUCAgIHwgMHgwMDAyMDAwMCkKKyNkZWZpbmUgSENfSFRYbkxvY19Mb2NhbCAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuTG9jX1N5cyAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX0hUWG5Mb2NfQUdQICAgICAgICAgIDB4MDAwMDAwMDMKKy8qIEhDX1N1YkFfSFRYblRSQUggICAgICAgIDB4MDA3ZgorICovCisjZGVmaW5lIEhDX0hUWG5UUkFIX01BU0sgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRYblRSQUxfTUFTSyAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFhuVEJBX01BU0sgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hUWG5UUkFIX1NISUZUICAgICAgIDE2CisjZGVmaW5lIEhDX0hUWG5UUkFMX1NISUZUICAgICAgIDgKKy8qIEhDX1N1YkFfSFRYblRCTENzYXQgICAgIDB4MDA4MAorICotLSBEZWZpbmUgdGhlIGlucHV0IHRleHR1cmUuCisgKi8KKyNkZWZpbmUgSENfWFRDX1RPUEMgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVENfSW52VE9QQyAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1hUQ19UT1BDcDUgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfWFRDX0NiaWFzICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19YVENfSW52Q2JpYXMgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1hUQ18wICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfWFRDX0RpZiAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19YVENfU3BlYyAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX1hUQ19UZXggICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfWFRDX0N1ciAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19YVENfQWRpZiAgICAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIEhDX1hUQ19Gb2cgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgSENfWFRDX0F0ZXggICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBIQ19YVENfQWN1ciAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX1hUQ19IVFhuVEJMUkMgICAgICAgIDB4MDAwMDAwMDkKKyNkZWZpbmUgSENfWFRDX0N0ZXhuZXh0ICAgICAgICAgMHgwMDAwMDAwYQorLyotLQorICovCisjZGVmaW5lIEhDX0hUWG5UQkxDc2F0X01BU0sgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENhX01BU0sgICAgICAgMHgwMDBmYzAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ2JfTUFTSyAgICAgICAweDAwMDAxZjgwCisjZGVmaW5lIEhDX0hUWG5UQkxDY19NQVNLICAgICAgIDB4MDAwMDAwM2YKKyNkZWZpbmUgSENfSFRYblRCTENhX1RPUEMgICAgICAgKEhDX1hUQ19UT1BDIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfSW52VE9QQyAgICAoSENfWFRDX0ludlRPUEMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9UT1BDcDUgICAgIChIQ19YVENfVE9QQ3A1IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfMCAgICAgICAgICAoSENfWFRDXzAgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9EaWYgICAgICAgIChIQ19YVENfRGlmIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfU3BlYyAgICAgICAoSENfWFRDX1NwZWMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9UZXggICAgICAgIChIQ19YVENfVGV4IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQ3VyICAgICAgICAoSENfWFRDX0N1ciA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX0FkaWYgICAgICAgKEhDX1hUQ19BZGlmIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfRm9nICAgICAgICAoSENfWFRDX0ZvZyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENhX0F0ZXggICAgICAgKEhDX1hUQ19BdGV4IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQWN1ciAgICAgICAoSENfWFRDX0FjdXIgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYV9IVFhuVEJMUkMgIChIQ19YVENfSFRYblRCTFJDIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2FfQ3RleG5leHQgICAoSENfWFRDX0N0ZXhuZXh0IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfVE9QQyAgICAgICAoSENfWFRDX1RPUEMgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0ludlRPUEMgICAgKEhDX1hUQ19JbnZUT1BDIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9UT1BDcDUgICAgIChIQ19YVENfVE9QQ3A1IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl8wICAgICAgICAgIChIQ19YVENfMCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfRGlmICAgICAgICAoSENfWFRDX0RpZiA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfU3BlYyAgICAgICAoSENfWFRDX1NwZWMgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX1RleCAgICAgICAgKEhDX1hUQ19UZXggPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0N1ciAgICAgICAgKEhDX1hUQ19DdXIgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0FkaWYgICAgICAgKEhDX1hUQ19BZGlmIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9Gb2cgICAgICAgIChIQ19YVENfRm9nIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxDYl9BdGV4ICAgICAgIChIQ19YVENfQXRleCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JfQWN1ciAgICAgICAoSENfWFRDX0FjdXIgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0hUWG5UQkxSQyAgKEhDX1hUQ19IVFhuVEJMUkMgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTENiX0N0ZXhuZXh0ICAgKEhDX1hUQ19DdGV4bmV4dCA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfVE9QQyAgICAgICAoSENfWFRDX1RPUEMgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0ludlRPUEMgICAgKEhDX1hUQ19JbnZUT1BDIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19UT1BDcDUgICAgIChIQ19YVENfVE9QQ3A1IDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY18wICAgICAgICAgIChIQ19YVENfMCA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfRGlmICAgICAgICAoSENfWFRDX0RpZiA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfU3BlYyAgICAgICAoSENfWFRDX1NwZWMgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX1RleCAgICAgICAgKEhDX1hUQ19UZXggPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0N1ciAgICAgICAgKEhDX1hUQ19DdXIgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0FkaWYgICAgICAgKEhDX1hUQ19BZGlmIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19Gb2cgICAgICAgIChIQ19YVENfRm9nIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxDY19BdGV4ICAgICAgIChIQ19YVENfQXRleCA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQ2NfQWN1ciAgICAgICAoSENfWFRDX0FjdXIgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0hUWG5UQkxSQyAgKEhDX1hUQ19IVFhuVEJMUkMgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTENjX0N0ZXhuZXh0ICAgKEhDX1hUQ19DdGV4bmV4dCA8PCAwKQorLyogSENfU3ViQV9IVFhuVEJMQ29wICAgICAgMHgwMDgxCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTGRvdF9NQVNLICAgICAgMHgwMGMwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ29wX01BU0sgICAgICAweDAwMzgwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19NQVNLICAgIDB4MDAwN2MwMDAKKyNkZWZpbmUgSENfSFRYblRCTENzaGlmdF9NQVNLICAgMHgwMDAwMTgwMAorI2RlZmluZSBIQ19IVFhuVEJMQW9wX01BU0sgICAgICAweDAwMDAwMzgwCisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19NQVNLICAgIDB4MDAwMDAwNzgKKyNkZWZpbmUgSENfSFRYblRCTEFzaGlmdF9NQVNLICAgMHgwMDAwMDAwMworI2RlZmluZSBIQ19IVFhuVEJMQ29wX0FkZCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfU3ViICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENvcF9NaW4gICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ29wX01heCAgICAgICAweDAwMTgwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxDb3BfTWFzayAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0NiaWFzICAgICAgICAgICAoSENfWFRDX0NiaWFzIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfSW52Q2JpYXMgICAgICAgIChIQ19YVENfSW52Q2JpYXMgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc18wICAgICAgICAgICAgICAgKEhDX1hUQ18wIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfRGlmICAgICAgICAgICAgIChIQ19YVENfRGlmIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfU3BlYyAgICAgICAgICAgIChIQ19YVENfU3BlYyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX1RleCAgICAgICAgICAgICAoSENfWFRDX1RleCA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0N1ciAgICAgICAgICAgICAoSENfWFRDX0N1ciA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0FkaWYgICAgICAgICAgICAoSENfWFRDX0FkaWYgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19Gb2cgICAgICAgICAgICAgKEhDX1hUQ19Gb2cgPDwgMTQpCisjZGVmaW5lIEhDX0hUWG5UQkxDYmlhc19BdGV4ICAgICAgICAgICAgKEhDX1hUQ19BdGV4IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQ2JpYXNfQWN1ciAgICAgICAgICAgIChIQ19YVENfQWN1ciA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENiaWFzX0hUWG5UQkxSQyAgICAgICAoSENfWFRDX0hUWG5UQkxSQyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTENzaGlmdF8xICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQ3NoaWZ0XzIgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhDX0hUWG5UQkxDc2hpZnRfTm8gICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSENfSFRYblRCTENzaGlmdF9Eb3RQICAgMHgwMDAwMTgwMAorLyo9KiBKb2huIFNoZW5nIFsyMDAzLjcuMThdIHRleHR1cmUgY29tYmluZSAqPSovCisjZGVmaW5lIEhDX0hUWG5UQkxET1QzICAgMHgwMDA4MDAwMAorI2RlZmluZSBIQ19IVFhuVEJMRE9UNCAgIDB4MDAwQzAwMDAKKworI2RlZmluZSBIQ19IVFhuVEJMQW9wX0FkZCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfU3ViICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgSENfSFRYblRCTEFvcF9NaW4gICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBIQ19IVFhuVEJMQW9wX01heCAgICAgICAweDAwMDAwMTgwCisjZGVmaW5lIEhDX0hUWG5UQkxBb3BfTWFzayAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX0ludiAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19BZGlmICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQWJpYXNfRm9nICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgSENfSFRYblRCTEFiaWFzX0FjdXIgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX0hUWG5UQkxBYmlhc19IVFhuVEJMUkFiaWFzICAgMHgwMDAwMDAxOAorI2RlZmluZSBIQ19IVFhuVEJMQWJpYXNfQXRleCAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSFRYblRCTEFzaGlmdF8xICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQXNoaWZ0XzIgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hUWG5UQkxBc2hpZnRfTm8gICAgIDB4MDAwMDAwMDIKKy8qICNkZWZpbmUgSENfSFRYblRCTEFzaGlmdF9Eb3RQICAgMHgwMDAwMDAwMyAqLworLyogSENfU3ViQV9IVFhuVEJMTVBGb2cgICAgMHgwMDgyCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX01BU0sgICAgMHgwMGUwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfMCAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxNUGZvZ19BZGlmICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX0ZvZyAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMTVBmb2dfQXRleCAgICAweDAwNjAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxNUGZvZ19BY3VyICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgSENfSFRYblRCTE1QZm9nX0dIVFhuVEJMUkZvZyAgICAweDAwYTAwMDAwCisvKiBIQ19TdWJBX0hUWG5UQkxBc2F0ICAgICAweDAwODMKKyAqLS0gRGVmaW5lIHRoZSB0ZXh0dXJlIGFscGhhIGlucHV0LgorICovCisjZGVmaW5lIEhDX1hUQV9UT1BBICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfWFRBX0ludlRPUEEgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBIQ19YVEFfVE9QQXA1ICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhDX1hUQV9BZGlmICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSENfWFRBX0ZvZyAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBIQ19YVEFfQWN1ciAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhDX1hUQV9IVFhuVEJMUkEgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfWFRBX0F0ZXggICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBIQ19YVEFfQXRleG5leHQgICAgICAgICAweDAwMDAwMDA1CisvKi0tCisgKi8KKyNkZWZpbmUgSENfSFRYblRCTEFzYXRfTUFTSyAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIQ19IVFhuVEJMQU1CX01BU0sgICAgICAweDAwNzAwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9NQVNLICAgICAgIDB4MDAwN2MwMDAKKyNkZWZpbmUgSENfSFRYblRCTEFiX01BU0sgICAgICAgMHgwMDAwMGY4MAorI2RlZmluZSBIQ19IVFhuVEJMQWNfTUFTSyAgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIEhDX0hUWG5UQkxBTUJfU0hJRlQgICAgIDIwCisjZGVmaW5lIEhDX0hUWG5UQkxBYV9UT1BBICAgICAgIChIQ19YVEFfVE9QQSA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTEFhX0ludlRPUEEgICAgKEhDX1hUQV9JbnZUT1BBIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfVE9QQXA1ICAgICAoSENfWFRBX1RPUEFwNSA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTEFhX0FkaWYgICAgICAgKEhDX1hUQV9BZGlmIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfRm9nICAgICAgICAoSENfWFRBX0ZvZyA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTEFhX0FjdXIgICAgICAgKEhDX1hUQV9BY3VyIDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfSFRYblRCTFJBICAoSENfWFRBX0hUWG5UQkxSQSA8PCAxNCkKKyNkZWZpbmUgSENfSFRYblRCTEFhX0F0ZXggICAgICAgKEhDX1hUQV9BdGV4IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWFfQXRleG5leHQgICAoSENfWFRBX0F0ZXhuZXh0IDw8IDE0KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfVE9QQSAgICAgICAoSENfWFRBX1RPUEEgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0ludlRPUEEgICAgKEhDX1hUQV9JbnZUT1BBIDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9UT1BBcDUgICAgIChIQ19YVEFfVE9QQXA1IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9BZGlmICAgICAgIChIQ19YVEFfQWRpZiA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfRm9nICAgICAgICAoSENfWFRBX0ZvZyA8PCA3KQorI2RlZmluZSBIQ19IVFhuVEJMQWJfQWN1ciAgICAgICAoSENfWFRBX0FjdXIgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0hUWG5UQkxSQSAgKEhDX1hUQV9IVFhuVEJMUkEgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFiX0F0ZXggICAgICAgKEhDX1hUQV9BdGV4IDw8IDcpCisjZGVmaW5lIEhDX0hUWG5UQkxBYl9BdGV4bmV4dCAgIChIQ19YVEFfQXRleG5leHQgPDwgNykKKyNkZWZpbmUgSENfSFRYblRCTEFjX1RPUEEgICAgICAgKEhDX1hUQV9UT1BBIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19JbnZUT1BBICAgIChIQ19YVEFfSW52VE9QQSA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfVE9QQXA1ICAgICAoSENfWFRBX1RPUEFwNSA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfQWRpZiAgICAgICAoSENfWFRBX0FkaWYgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0ZvZyAgICAgICAgKEhDX1hUQV9Gb2cgPDwgMCkKKyNkZWZpbmUgSENfSFRYblRCTEFjX0FjdXIgICAgICAgKEhDX1hUQV9BY3VyIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19IVFhuVEJMUkEgIChIQ19YVEFfSFRYblRCTFJBIDw8IDApCisjZGVmaW5lIEhDX0hUWG5UQkxBY19BdGV4ICAgICAgIChIQ19YVEFfQXRleCA8PCAwKQorI2RlZmluZSBIQ19IVFhuVEJMQWNfQXRleG5leHQgICAoSENfWFRBX0F0ZXhuZXh0IDw8IDApCisvKiBIQ19TdWJBX0hUWG5UQkxSQWEgICAgICAweDAwODkKKyAqLworI2RlZmluZSBIQ19IVFhuVEJMUkFhX01BU0sgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hUWG5UQkxSQWJfTUFTSyAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSFRYblRCTFJBY19NQVNLICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuVEJMUkFhX1NISUZUICAgICAxNgorI2RlZmluZSBIQ19IVFhuVEJMUkFiX1NISUZUICAgICA4CisjZGVmaW5lIEhDX0hUWG5UQkxSQWNfU0hJRlQgICAgIDAKKy8qIEhDX1N1YkFfSFRYblRCTFJGb2cgICAgIDB4MDA4YQorICovCisjZGVmaW5lIEhDX0hUWG5UQkxSRm9nX01BU0sgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSFRYblRCTFJBYmlhc19NQVNLICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IVFhuVEJMUkZvZ19TSElGVCAgICA4CisjZGVmaW5lIEhDX0hUWG5UQkxSQWJpYXNfU0hJRlQgIDAKKy8qIEhDX1N1YkFfSFRYbkxTY2FsZSAgICAgIDB4MDA5NAorICovCisjZGVmaW5lIEhDX0hUWG5MU2NhbGVfTUFTSyAgICAgIDB4MDAwN2ZjMDAKKyNkZWZpbmUgSENfSFRYbkxPZmZfTUFTSyAgICAgICAgMHgwMDAwMDFmZgorI2RlZmluZSBIQ19IVFhuTFNjYWxlX1NISUZUICAgICAxMAorLyogSENfU3ViQV9IVFhTTUQgICAgICAgICAgMHgwMDAwCisgKi8KKyNkZWZpbmUgSENfSFRYU01EX01BU0sgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBIQ19IVFhUTURfTUFTSyAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhDX0hUWE51bV9NQVNLICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgSENfSFRYVFJNRF9NQVNLICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBIQ19IVFhDSENMUl9NQVNLICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hUWE51bV9TSElGVCAgICAgICAgIDMKKworLyogVGV4dHVyZSBQYWxldHRlIG4KKyAqLworI2RlZmluZSBIQ19TdWJUeXBlX1RleFBhbGV0dGUwICAweDAwMDAwMDAwCisjZGVmaW5lIEhDX1N1YlR5cGVfVGV4UGFsZXR0ZTEgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSENfU3ViVHlwZV9Gb2dUYWJsZSAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19TdWJUeXBlX1N0aXBwbGUgICAgICAweDAwMDAwMDE0CisvKiBIQ19TdWJBX1RleFBhbGV0dGUwICAgICAweDAwMDAKKyAqLworI2RlZmluZSBIQ19IVFBuQV9NQVNLICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhDX0hUUG5SX01BU0sgICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSFRQbkdfTUFTSyAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IVFBuQl9NQVNLICAgICAgICAgICAweDAwMDAwMGZmCisvKiBIQ19TdWJBX0ZvZ1RhYmxlICAgICAgICAweDAwMTAKKyAqLworI2RlZmluZSBIQ19IRlBuM19NQVNLICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIEhDX0hGUG4yX01BU0sgICAgICAgICAgIDB4MDBmZjAwMDAKKyNkZWZpbmUgSENfSEZQbjFfTUFTSyAgICAgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IRlBuX01BU0sgICAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hGUG4zX1NISUZUICAgICAgICAgIDI0CisjZGVmaW5lIEhDX0hGUG4yX1NISUZUICAgICAgICAgIDE2CisjZGVmaW5lIEhDX0hGUG4xX1NISUZUICAgICAgICAgIDgKKworLyogQXV0byBUZXN0aW5nICYgU2VjdXJpdHkKKyAqLworI2RlZmluZSBIQ19TdWJBX0hlbkZJRk9BVCAgICAgICAweDAwMDAKKyNkZWZpbmUgSENfU3ViQV9IRkJEcmF3Rmlyc3QgICAgMHgwMDA0CisjZGVmaW5lIEhDX1N1YkFfSEZCQmFzTCAgICAgICAgIDB4MDAwNQorI2RlZmluZSBIQ19TdWJBX0hGQkRzdCAgICAgICAgICAweDAwMDYKKy8qIEhDX1N1YkFfSGVuRklGT0FUICAgICAgIDB4MDAwMAorICovCisjZGVmaW5lIEhDX0hlbkZJRk9BVF9NQVNLICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSENfSGVuR0VNSUxvY2tfTUFTSyAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBIQ19IZW5GQkFTd2FwX01BU0sgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhDX0hlbk9UX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSENfSGVuQ01EUV9NQVNLICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBIQ19IZW5UWENUU1VfTUFTSyAgICAgICAweDAwMDAwMDAxCisvKiBIQ19TdWJBX0hGQkRyYXdGaXJzdCAgICAweDAwMDQKKyAqLworI2RlZmluZSBIQ19IRkJEcmF3Rmlyc3RfTUFTSyAgICAweDAwMDAwODAwCisjZGVmaW5lIEhDX0hGQlF1ZXVlX01BU0sgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSENfSEZCTG9ja19NQVNLICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBIQ19IRU9GX01BU0sgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhDX0hGQkJhc0hfTUFTSyAgICAgICAgIDB4MDAwMDAwZmYKKworLyogR0VNSSBTZXR0aW5nCisgKi8KKyNkZWZpbmUgSENfU3ViQV9IVEFyYlJDTSAgICAgICAgMHgwMDA4CisjZGVmaW5lIEhDX1N1YkFfSFRBcmJSWiAgICAgICAgIDB4MDAwYQorI2RlZmluZSBIQ19TdWJBX0hUQXJiV1ogICAgICAgICAweDAwMGIKKyNkZWZpbmUgSENfU3ViQV9IVEFyYlJUWCAgICAgICAgMHgwMDBjCisjZGVmaW5lIEhDX1N1YkFfSFRBcmJSQ1cgICAgICAgIDB4MDAwZAorI2RlZmluZSBIQ19TdWJBX0hUQXJiRTIgICAgICAgICAweDAwMGUKKyNkZWZpbmUgSENfU3ViQV9IQXJiUlFDTSAgICAgICAgMHgwMDEwCisjZGVmaW5lIEhDX1N1YkFfSEFyYldRQ00gICAgICAgIDB4MDAxMQorI2RlZmluZSBIQ19TdWJBX0hHRU1JVG91dCAgICAgICAweDAwMjAKKyNkZWZpbmUgSENfU3ViQV9IRnRoUlRYRCAgICAgICAgMHgwMDQwCisjZGVmaW5lIEhDX1N1YkFfSEZ0aFJUWEEgICAgICAgIDB4MDA0NAorI2RlZmluZSBIQ19TdWJBX0hDTURRc3RMICAgICAgICAweDAwNTAKKyNkZWZpbmUgSENfU3ViQV9IQ01EUWVuZEwgICAgICAgMHgwMDUxCisjZGVmaW5lIEhDX1N1YkFfSENNRFFMZW4gICAgICAgIDB4MDA1MgorLyogSENfU3ViQV9IVEFyYlJDTSAgICAgICAgMHgwMDA4CisgKi8KKyNkZWZpbmUgSENfSFRBcmJSQ01fTUFTSyAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IVEFyYlJaICAgICAgICAgMHgwMDBhCisgKi8KKyNkZWZpbmUgSENfSFRBcmJSWl9NQVNLICAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IVEFyYldaICAgICAgICAgMHgwMDBiCisgKi8KKyNkZWZpbmUgSENfSFRBcmJXWl9NQVNLICAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IVEFyYlJUWCAgICAgICAgMHgwMDBjCisgKi8KKyNkZWZpbmUgSENfSFRBcmJSVFhfTUFTSyAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IVEFyYlJDVyAgICAgICAgMHgwMDBkCisgKi8KKyNkZWZpbmUgSENfSFRBcmJSQ1dfTUFTSyAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IVEFyYkUyICAgICAgICAgMHgwMDBlCisgKi8KKyNkZWZpbmUgSENfSFRBcmJFMl9NQVNLICAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IQXJiUlFDTSAgICAgICAgMHgwMDEwCisgKi8KKyNkZWZpbmUgSENfSFRBcmJSUUNNX01BU0sgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IQXJiV1FDTSAgICAgICAgMHgwMDExCisgKi8KKyNkZWZpbmUgSENfSEFyYldRQ01fTUFTSyAgICAgICAgMHgwMDAwZmZmZgorLyogSENfU3ViQV9IR0VNSVRvdXQgICAgICAgMHgwMDIwCisgKi8KKyNkZWZpbmUgSENfSEdFTUlUb3V0X01BU0sgICAgICAgMHgwMDBmMDAwMAorI2RlZmluZSBIQ19ITlBBcmJaQ19NQVNLICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIEhDX0hHRU1JVG91dF9TSElGVCAgICAgIDE2CisvKiBIQ19TdWJBX0hGdGhSVFhEICAgICAgICAweDAwNDAKKyAqLworI2RlZmluZSBIQ19IRnRoUlRYRF9NQVNLICAgICAgICAweDAwZmYwMDAwCisjZGVmaW5lIEhDX0hGdGhSWkRfTUFTSyAgICAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgSENfSEZ0aFdaRF9NQVNLICAgICAgICAgMHgwMDAwMDBmZgorI2RlZmluZSBIQ19IRnRoUlRYRF9TSElGVCAgICAgICAxNgorI2RlZmluZSBIQ19IRnRoUlpEX1NISUZUICAgICAgICA4CisvKiBIQ19TdWJBX0hGdGhSVFhBICAgICAgICAweDAwNDQKKyAqLworI2RlZmluZSBIQ19IRnRoUlRYQV9NQVNLICAgICAgICAweDAwMDAwMGZmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIERlZmluZSB0aGUgSGFsY3lvbiBJbnRlcm5hbCByZWdpc3RlciBhY2Nlc3MgY29uc3RhbnRzLiBGb3Igc2ltdWxhdG9yIG9ubHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDX1NJTUFfSEFHUEJzdEwgICAgICAgIDB4MDAwMAorI2RlZmluZSBIQ19TSU1BX0hBR1BCZW5kTCAgICAgICAweDAwMDEKKyNkZWZpbmUgSENfU0lNQV9IQUdQQ01OVCAgICAgICAgMHgwMDAyCisjZGVmaW5lIEhDX1NJTUFfSEFHUEJwTCAgICAgICAgIDB4MDAwMworI2RlZmluZSBIQ19TSU1BX0hBR1BCcEggICAgICAgICAweDAwMDQKKyNkZWZpbmUgSENfU0lNQV9IQ2xpcFRCICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEhDX1NJTUFfSENsaXBMUiAgICAgICAgIDB4MDAwNgorI2RlZmluZSBIQ19TSU1BX0hGUENsaXBUTCAgICAgICAweDAwMDcKKyNkZWZpbmUgSENfU0lNQV9IRlBDbGlwQkwgICAgICAgMHgwMDA4CisjZGVmaW5lIEhDX1NJTUFfSEZQQ2xpcExMICAgICAgIDB4MDAwOQorI2RlZmluZSBIQ19TSU1BX0hGUENsaXBSTCAgICAgICAweDAwMGEKKyNkZWZpbmUgSENfU0lNQV9IRlBDbGlwVEJIICAgICAgMHgwMDBiCisjZGVmaW5lIEhDX1NJTUFfSEZQQ2xpcExSSCAgICAgIDB4MDAwYworI2RlZmluZSBIQ19TSU1BX0hMUCAgICAgICAgICAgICAweDAwMGQKKyNkZWZpbmUgSENfU0lNQV9ITFBSRiAgICAgICAgICAgMHgwMDBlCisjZGVmaW5lIEhDX1NJTUFfSFNvbGlkQ0wgICAgICAgIDB4MDAwZgorI2RlZmluZSBIQ19TSU1BX0hQaXhHQyAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgSENfU0lNQV9IU1BYWU9TICAgICAgICAgMHgwMDExCisjZGVmaW5lIEhDX1NJTUFfSENtZEEgICAgICAgICAgIDB4MDAxMgorI2RlZmluZSBIQ19TSU1BX0hDbWRCICAgICAgICAgICAweDAwMTMKKyNkZWZpbmUgSENfU0lNQV9IRW5hYmxlICAgICAgICAgMHgwMDE0CisjZGVmaW5lIEhDX1NJTUFfSFpXQkJhc0wgICAgICAgIDB4MDAxNQorI2RlZmluZSBIQ19TSU1BX0haV0JCYXNIICAgICAgICAweDAwMTYKKyNkZWZpbmUgSENfU0lNQV9IWldCVHlwZSAgICAgICAgMHgwMDE3CisjZGVmaW5lIEhDX1NJTUFfSFpCaWFzTCAgICAgICAgIDB4MDAxOAorI2RlZmluZSBIQ19TSU1BX0haV0JlbmQgICAgICAgICAweDAwMTkKKyNkZWZpbmUgSENfU0lNQV9IWldUTUQgICAgICAgICAgMHgwMDFhCisjZGVmaW5lIEhDX1NJTUFfSFpXQ0RMICAgICAgICAgIDB4MDAxYgorI2RlZmluZSBIQ19TSU1BX0haV0NUQUdudW0gICAgICAweDAwMWMKKyNkZWZpbmUgSENfU0lNQV9IWkNZTnVtICAgICAgICAgMHgwMDFkCisjZGVmaW5lIEhDX1NJTUFfSFpXQ0ZpcmUgICAgICAgIDB4MDAxZQorLyogI2RlZmluZSBIQ19TSU1BX0hTQkJhc0wgICAgICAgICAweDAwMWQgKi8KKy8qICNkZWZpbmUgSENfU0lNQV9IU0JCYXNIICAgICAgICAgMHgwMDFlICovCisvKiAjZGVmaW5lIEhDX1NJTUFfSFNCRk0gICAgICAgICAgIDB4MDAxZiAqLworI2RlZmluZSBIQ19TSU1BX0hTVFJFRiAgICAgICAgICAweDAwMjAKKyNkZWZpbmUgSENfU0lNQV9IU1RNRCAgICAgICAgICAgMHgwMDIxCisjZGVmaW5lIEhDX1NJTUFfSEFCQmFzTCAgICAgICAgIDB4MDAyMgorI2RlZmluZSBIQ19TSU1BX0hBQkJhc0ggICAgICAgICAweDAwMjMKKyNkZWZpbmUgSENfU0lNQV9IQUJGTSAgICAgICAgICAgMHgwMDI0CisjZGVmaW5lIEhDX1NJTUFfSEFUTUQgICAgICAgICAgIDB4MDAyNQorI2RlZmluZSBIQ19TSU1BX0hBQkxDc2F0ICAgICAgICAweDAwMjYKKyNkZWZpbmUgSENfU0lNQV9IQUJMQ29wICAgICAgICAgMHgwMDI3CisjZGVmaW5lIEhDX1NJTUFfSEFCTEFzYXQgICAgICAgIDB4MDAyOAorI2RlZmluZSBIQ19TSU1BX0hBQkxBb3AgICAgICAgICAweDAwMjkKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkNhICAgICAgICAgMHgwMDJhCisjZGVmaW5lIEhDX1NJTUFfSEFCTFJGQ2EgICAgICAgIDB4MDAyYgorI2RlZmluZSBIQ19TSU1BX0hBQkxSQ2JpYXMgICAgICAweDAwMmMKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkNiICAgICAgICAgMHgwMDJkCisjZGVmaW5lIEhDX1NJTUFfSEFCTFJGQ2IgICAgICAgIDB4MDAyZQorI2RlZmluZSBIQ19TSU1BX0hBQkxSQWEgICAgICAgICAweDAwMmYKKyNkZWZpbmUgSENfU0lNQV9IQUJMUkFiICAgICAgICAgMHgwMDMwCisjZGVmaW5lIEhDX1NJTUFfSERCQmFzTCAgICAgICAgIDB4MDAzMQorI2RlZmluZSBIQ19TSU1BX0hEQkJhc0ggICAgICAgICAweDAwMzIKKyNkZWZpbmUgSENfU0lNQV9IREJGTSAgICAgICAgICAgMHgwMDMzCisjZGVmaW5lIEhDX1NJTUFfSEZCQk1TS0wgICAgICAgIDB4MDAzNAorI2RlZmluZSBIQ19TSU1BX0hST1AgICAgICAgICAgICAweDAwMzUKKyNkZWZpbmUgSENfU0lNQV9IRm9nTEYgICAgICAgICAgMHgwMDM2CisjZGVmaW5lIEhDX1NJTUFfSEZvZ0NMICAgICAgICAgIDB4MDAzNworI2RlZmluZSBIQ19TSU1BX0hGb2dDSCAgICAgICAgICAweDAwMzgKKyNkZWZpbmUgSENfU0lNQV9IRm9nU3RMICAgICAgICAgMHgwMDM5CisjZGVmaW5lIEhDX1NJTUFfSEZvZ1N0SCAgICAgICAgIDB4MDAzYQorI2RlZmluZSBIQ19TSU1BX0hGb2dPT2RNRiAgICAgICAweDAwM2IKKyNkZWZpbmUgSENfU0lNQV9IRm9nT09kRUYgICAgICAgMHgwMDNjCisjZGVmaW5lIEhDX1NJTUFfSEZvZ0VuZEwgICAgICAgIDB4MDAzZAorI2RlZmluZSBIQ19TSU1BX0hGb2dEZW5zdCAgICAgICAweDAwM2UKKy8qLS0tLSBzdGFydCBvZiB0ZXh0dXJlIDAgc2V0dGluZyAtLS0tCisgKi8KKyNkZWZpbmUgSENfU0lNQV9IVFgwTDBCYXNMICAgICAgMHgwMDQwCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxQmFzTCAgICAgIDB4MDA0MQorI2RlZmluZSBIQ19TSU1BX0hUWDBMMkJhc0wgICAgICAweDAwNDIKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDNCYXNMICAgICAgMHgwMDQzCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw0QmFzTCAgICAgIDB4MDA0NAorI2RlZmluZSBIQ19TSU1BX0hUWDBMNUJhc0wgICAgICAweDAwNDUKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDZCYXNMICAgICAgMHgwMDQ2CisjZGVmaW5lIEhDX1NJTUFfSFRYMEw3QmFzTCAgICAgIDB4MDA0NworI2RlZmluZSBIQ19TSU1BX0hUWDBMOEJhc0wgICAgICAweDAwNDgKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDlCYXNMICAgICAgMHgwMDQ5CisjZGVmaW5lIEhDX1NJTUFfSFRYMExhQmFzTCAgICAgIDB4MDA0YQorI2RlZmluZSBIQ19TSU1BX0hUWDBMYkJhc0wgICAgICAweDAwNGIKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGNCYXNMICAgICAgMHgwMDRjCisjZGVmaW5lIEhDX1NJTUFfSFRYMExkQmFzTCAgICAgIDB4MDA0ZAorI2RlZmluZSBIQ19TSU1BX0hUWDBMZUJhc0wgICAgICAweDAwNGUKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGZCYXNMICAgICAgMHgwMDRmCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxMEJhc0wgICAgIDB4MDA1MAorI2RlZmluZSBIQ19TSU1BX0hUWDBMMTFCYXNMICAgICAweDAwNTEKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDAxMkJhc0ggICAgMHgwMDUyCisjZGVmaW5lIEhDX1NJTUFfSFRYMEwzNDVCYXNIICAgIDB4MDA1MworI2RlZmluZSBIQ19TSU1BX0hUWDBMNjc4QmFzSCAgICAweDAwNTQKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDlhYkJhc0ggICAgMHgwMDU1CisjZGVmaW5lIEhDX1NJTUFfSFRYMExjZGVCYXNIICAgIDB4MDA1NgorI2RlZmluZSBIQ19TSU1BX0hUWDBMZjEwMTFCYXNIICAweDAwNTcKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDBQaXQgICAgICAgMHgwMDU4CisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxUGl0ICAgICAgIDB4MDA1OQorI2RlZmluZSBIQ19TSU1BX0hUWDBMMlBpdCAgICAgICAweDAwNWEKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDNQaXQgICAgICAgMHgwMDViCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw0UGl0ICAgICAgIDB4MDA1YworI2RlZmluZSBIQ19TSU1BX0hUWDBMNVBpdCAgICAgICAweDAwNWQKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDZQaXQgICAgICAgMHgwMDVlCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw3UGl0ICAgICAgIDB4MDA1ZgorI2RlZmluZSBIQ19TSU1BX0hUWDBMOFBpdCAgICAgICAweDAwNjAKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDlQaXQgICAgICAgMHgwMDYxCisjZGVmaW5lIEhDX1NJTUFfSFRYMExhUGl0ICAgICAgIDB4MDA2MgorI2RlZmluZSBIQ19TSU1BX0hUWDBMYlBpdCAgICAgICAweDAwNjMKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGNQaXQgICAgICAgMHgwMDY0CisjZGVmaW5lIEhDX1NJTUFfSFRYMExkUGl0ICAgICAgIDB4MDA2NQorI2RlZmluZSBIQ19TSU1BX0hUWDBMZVBpdCAgICAgICAweDAwNjYKKyNkZWZpbmUgSENfU0lNQV9IVFgwTGZQaXQgICAgICAgMHgwMDY3CisjZGVmaW5lIEhDX1NJTUFfSFRYMEwxMFBpdCAgICAgIDB4MDA2OAorI2RlZmluZSBIQ19TSU1BX0hUWDBMMTFQaXQgICAgICAweDAwNjkKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDBfNVdFICAgICAgMHgwMDZhCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw2X2JXRSAgICAgIDB4MDA2YgorI2RlZmluZSBIQ19TSU1BX0hUWDBMY18xMVdFICAgICAweDAwNmMKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDBfNUhFICAgICAgMHgwMDZkCisjZGVmaW5lIEhDX1NJTUFfSFRYMEw2X2JIRSAgICAgIDB4MDA2ZQorI2RlZmluZSBIQ19TSU1BX0hUWDBMY18xMUhFICAgICAweDAwNmYKKyNkZWZpbmUgSENfU0lNQV9IVFgwTDBPUyAgICAgICAgMHgwMDcwCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCICAgICAgICAgIDB4MDA3MQorI2RlZmluZSBIQ19TSU1BX0hUWDBNUE1EICAgICAgICAweDAwNzIKKyNkZWZpbmUgSENfU0lNQV9IVFgwQ0xPRHUgICAgICAgMHgwMDczCisjZGVmaW5lIEhDX1NJTUFfSFRYMEZNICAgICAgICAgIDB4MDA3NAorI2RlZmluZSBIQ19TSU1BX0hUWDBUUkNIICAgICAgICAweDAwNzUKKyNkZWZpbmUgSENfU0lNQV9IVFgwVFJDTCAgICAgICAgMHgwMDc2CisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCQyAgICAgICAgIDB4MDA3NworI2RlZmluZSBIQ19TSU1BX0hUWDBUUkFIICAgICAgICAweDAwNzgKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMQ3NhdCAgICAgMHgwMDc5CisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTENvcCAgICAgIDB4MDA3YQorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxNUGZvZyAgICAweDAwN2IKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMQXNhdCAgICAgMHgwMDdjCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTFJDYSAgICAgIDB4MDA3ZAorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxSQ2IgICAgICAweDAwN2UKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMUkNjICAgICAgMHgwMDdmCisjZGVmaW5lIEhDX1NJTUFfSFRYMFRCTFJDYmlhcyAgIDB4MDA4MAorI2RlZmluZSBIQ19TSU1BX0hUWDBUQkxSQWEgICAgICAweDAwODEKKyNkZWZpbmUgSENfU0lNQV9IVFgwVEJMUkZvZyAgICAgMHgwMDgyCisjZGVmaW5lIEhDX1NJTUFfSFRYMEJ1bXBNMDAgICAgIDB4MDA4MworI2RlZmluZSBIQ19TSU1BX0hUWDBCdW1wTTAxICAgICAweDAwODQKKyNkZWZpbmUgSENfU0lNQV9IVFgwQnVtcE0xMCAgICAgMHgwMDg1CisjZGVmaW5lIEhDX1NJTUFfSFRYMEJ1bXBNMTEgICAgIDB4MDA4NgorI2RlZmluZSBIQ19TSU1BX0hUWDBMU2NhbGUgICAgICAweDAwODcKKy8qLS0tLSBlbmQgb2YgdGV4dHVyZSAwIHNldHRpbmcgLS0tLSAgICAgIDB4MDA4ZgorICovCisjZGVmaW5lIEhDX1NJTUFfVFgwVFgxX09GRiAgICAgIDB4MDA1MAorLyotLS0tIHN0YXJ0IG9mIHRleHR1cmUgMSBzZXR0aW5nIC0tLS0KKyAqLworI2RlZmluZSBIQ19TSU1BX0hUWDFMMEJhc0wgICAgICAoSENfU0lNQV9IVFgwTDBCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMUJhc0wgICAgICAoSENfU0lNQV9IVFgwTDFCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMkJhc0wgICAgICAoSENfU0lNQV9IVFgwTDJCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMM0Jhc0wgICAgICAoSENfU0lNQV9IVFgwTDNCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNEJhc0wgICAgICAoSENfU0lNQV9IVFgwTDRCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNUJhc0wgICAgICAoSENfU0lNQV9IVFgwTDVCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNkJhc0wgICAgICAoSENfU0lNQV9IVFgwTDZCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMN0Jhc0wgICAgICAoSENfU0lNQV9IVFgwTDdCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMOEJhc0wgICAgICAoSENfU0lNQV9IVFgwTDhCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMOUJhc0wgICAgICAoSENfU0lNQV9IVFgwTDlCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMYUJhc0wgICAgICAoSENfU0lNQV9IVFgwTGFCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMYkJhc0wgICAgICAoSENfU0lNQV9IVFgwTGJCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY0Jhc0wgICAgICAoSENfU0lNQV9IVFgwTGNCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZEJhc0wgICAgICAoSENfU0lNQV9IVFgwTGRCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZUJhc0wgICAgICAoSENfU0lNQV9IVFgwTGVCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZkJhc0wgICAgICAoSENfU0lNQV9IVFgwTGZCYXNMICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMTBCYXNMICAgICAoSENfU0lNQV9IVFgwTDEwQmFzTCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDExQmFzTCAgICAgKEhDX1NJTUFfSFRYMEwxMUJhc0wgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwwMTJCYXNIICAgIChIQ19TSU1BX0hUWDBMMDEyQmFzSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDM0NUJhc0ggICAgKEhDX1NJTUFfSFRYMEwzNDVCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNjc4QmFzSCAgICAoSENfU0lNQV9IVFgwTDY3OEJhc0ggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw5YWJCYXNIICAgIChIQ19TSU1BX0hUWDBMOWFiQmFzSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGNkZUJhc0ggICAgKEhDX1NJTUFfSFRYMExjZGVCYXNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZjEwMTFCYXNIICAoSENfU0lNQV9IVFgwTGYxMDExQmFzSCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDBQaXQgICAgICAgKEhDX1NJTUFfSFRYMEwwUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMVBpdCAgICAgICAoSENfU0lNQV9IVFgwTDFQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUwyUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMMlBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDNQaXQgICAgICAgKEhDX1NJTUFfSFRYMEwzUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNFBpdCAgICAgICAoSENfU0lNQV9IVFgwTDRQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw1UGl0ICAgICAgIChIQ19TSU1BX0hUWDBMNVBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDZQaXQgICAgICAgKEhDX1NJTUFfSFRYMEw2UGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMN1BpdCAgICAgICAoSENfU0lNQV9IVFgwTDdQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUw4UGl0ICAgICAgIChIQ19TSU1BX0hUWDBMOFBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDlQaXQgICAgICAgKEhDX1NJTUFfSFRYMEw5UGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMYVBpdCAgICAgICAoSENfU0lNQV9IVFgwTGFQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxiUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMYlBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGNQaXQgICAgICAgKEhDX1NJTUFfSFRYMExjUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMZFBpdCAgICAgICAoSENfU0lNQV9IVFgwTGRQaXQgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxlUGl0ICAgICAgIChIQ19TSU1BX0hUWDBMZVBpdCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGZQaXQgICAgICAgKEhDX1NJTUFfSFRYMExmUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMTBQaXQgICAgICAoSENfU0lNQV9IVFgwTDEwUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMTFQaXQgICAgICAoSENfU0lNQV9IVFgwTDExUGl0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMMF81V0UgICAgICAoSENfU0lNQV9IVFgwTDBfNVdFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMNl9iV0UgICAgICAoSENfU0lNQV9IVFgwTDZfYldFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMY18xMVdFICAgICAoSENfU0lNQV9IVFgwTGNfMTFXRSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDBfNUhFICAgICAgKEhDX1NJTUFfSFRYMEwwXzVIRSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTDZfYkhFICAgICAgKEhDX1NJTUFfSFRYMEw2X2JIRSArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxTGNfMTFIRSAgICAgIChIQ19TSU1BX0hUWDBMY18xMUhFICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFMME9TICAgICAgICAoSENfU0lNQV9IVFgwTDBPUyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVEIgICAgICAgICAgKEhDX1NJTUFfSFRYMFRCICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFNUE1EICAgICAgICAoSENfU0lNQV9IVFgwTVBNRCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxQ0xPRHUgICAgICAgKEhDX1NJTUFfSFRYMENMT0R1ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFGTSAgICAgICAgICAoSENfU0lNQV9IVFgwRk0gKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRSQ0ggICAgICAgIChIQ19TSU1BX0hUWDBUUkNIICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUUkNMICAgICAgICAoSENfU0lNQV9IVFgwVFJDTCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVEJDICAgICAgICAgKEhDX1NJTUFfSFRYMFRCQyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxVFJBSCAgICAgICAgKEhDX1NJTUFfSFRYMFRSQUggKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxUQyAgICAgICAgIChIQ19TSU1BX0hUWDBMVEMgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxUQSAgICAgICAgIChIQ19TSU1BX0hUWDBMVEEgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTENzYXQgICAgIChIQ19TSU1BX0hUWDBUQkxDc2F0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxDb3AgICAgICAoSENfU0lNQV9IVFgwVEJMQ29wICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxNUGZvZyAgICAoSENfU0lNQV9IVFgwVEJMTVBmb2cgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMVRCTEFzYXQgICAgIChIQ19TSU1BX0hUWDBUQkxBc2F0ICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxSQ2EgICAgICAoSENfU0lNQV9IVFgwVEJMUkNhICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxSQ2IgICAgICAoSENfU0lNQV9IVFgwVEJMUkNiICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxSQ2MgICAgICAoSENfU0lNQV9IVFgwVEJMUkNjICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxSQ2JpYXMgICAoSENfU0lNQV9IVFgwVEJMUkNiaWFzICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxSQWEgICAgICAoSENfU0lNQV9IVFgwVEJMUkFhICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFUQkxSRm9nICAgICAoSENfU0lNQV9IVFgwVEJMUkZvZyArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxQnVtcE0wMCAgICAgKEhDX1NJTUFfSFRYMEJ1bXBNMDAgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUJ1bXBNMDEgICAgIChIQ19TSU1BX0hUWDBCdW1wTTAxICsgSENfU0lNQV9UWDBUWDFfT0ZGKQorI2RlZmluZSBIQ19TSU1BX0hUWDFCdW1wTTEwICAgICAoSENfU0lNQV9IVFgwQnVtcE0xMCArIEhDX1NJTUFfVFgwVFgxX09GRikKKyNkZWZpbmUgSENfU0lNQV9IVFgxQnVtcE0xMSAgICAgKEhDX1NJTUFfSFRYMEJ1bXBNMTEgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisjZGVmaW5lIEhDX1NJTUFfSFRYMUxTY2FsZSAgICAgIChIQ19TSU1BX0hUWDBMU2NhbGUgKyBIQ19TSU1BX1RYMFRYMV9PRkYpCisvKi0tLS0gZW5kIG9mIHRleHR1cmUgMSBzZXR0aW5nIC0tLS0gMHhhZgorICovCisjZGVmaW5lIEhDX1NJTUFfSFRYU01EICAgICAgICAgIDB4MDBiMAorI2RlZmluZSBIQ19TSU1BX0hlbkZJRk9BVCAgICAgICAweDAwYjEKKyNkZWZpbmUgSENfU0lNQV9IRkJEcmF3Rmlyc3QgICAgMHgwMGIyCisjZGVmaW5lIEhDX1NJTUFfSEZCQmFzTCAgICAgICAgIDB4MDBiMworI2RlZmluZSBIQ19TSU1BX0hUQXJiUkNNICAgICAgICAweDAwYjQKKyNkZWZpbmUgSENfU0lNQV9IVEFyYlJaICAgICAgICAgMHgwMGI1CisjZGVmaW5lIEhDX1NJTUFfSFRBcmJXWiAgICAgICAgIDB4MDBiNgorI2RlZmluZSBIQ19TSU1BX0hUQXJiUlRYICAgICAgICAweDAwYjcKKyNkZWZpbmUgSENfU0lNQV9IVEFyYlJDVyAgICAgICAgMHgwMGI4CisjZGVmaW5lIEhDX1NJTUFfSFRBcmJFMiAgICAgICAgIDB4MDBiOQorI2RlZmluZSBIQ19TSU1BX0hHRU1JVG91dCAgICAgICAweDAwYmEKKyNkZWZpbmUgSENfU0lNQV9IRnRoUlRYRCAgICAgICAgMHgwMGJiCisjZGVmaW5lIEhDX1NJTUFfSEZ0aFJUWEEgICAgICAgIDB4MDBiYworLyogRGVmaW5lIHRoZSB0ZXh0dXJlIHBhbGV0dGUgMAorICovCisjZGVmaW5lIEhDX1NJTUFfSFRQMCAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBIQ19TSU1BX0hUUDEgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgSENfU0lNQV9GT0dUQUJMRSAgICAgICAgMHgwMzAwCisjZGVmaW5lIEhDX1NJTUFfU1RJUFBMRSAgICAgICAgIDB4MDQwMAorI2RlZmluZSBIQ19TSU1BX0hFM0ZpcmUgICAgICAgICAweDA0NDAKKyNkZWZpbmUgSENfU0lNQV9UUkFOU19TRVQgICAgICAgMHgwNDQxCisjZGVmaW5lIEhDX1NJTUFfSFJFbmdTdCAgICAgICAgIDB4MDQ0MgorI2RlZmluZSBIQ19TSU1BX0hSRklGT2VtcHR5ICAgICAweDA0NDMKKyNkZWZpbmUgSENfU0lNQV9IUkZJRk9mdWxsICAgICAgMHgwNDQ0CisjZGVmaW5lIEhDX1NJTUFfSFJFcnIgICAgICAgICAgIDB4MDQ0NQorI2RlZmluZSBIQ19TSU1BX0ZJRk9zdGF0dXMgICAgICAweDA0NDYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRGVmaW5lIHRoZSBBR1AgY29tbWFuZCBoZWFkZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDX0FDTURfTUFTSyAgICAgICAgICAgIDB4ZmUwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9TVUJfTUFTSyAgICAgICAgMHgwYzAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0hDbWRBICAgICAgICAgICAweGVlMDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSENtZEIgICAgICAgICAgIDB4ZWMwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9IQ21kQyAgICAgICAgICAgMHhlYTAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0gxICAgICAgICAgICAgICAweGYwMDAwMDAwCisjZGVmaW5lIEhDX0FDTURfSDIgICAgICAgICAgICAgIDB4ZjIwMDAwMDAKKyNkZWZpbmUgSENfQUNNRF9IMyAgICAgICAgICAgICAgMHhmNDAwMDAwMAorI2RlZmluZSBIQ19BQ01EX0g0ICAgICAgICAgICAgICAweGY2MDAwMDAwCisKKyNkZWZpbmUgSENfQUNNRF9IMUlPX01BU0sgICAgICAgMHgwMDAwMDFmZgorI2RlZmluZSBIQ19BQ01EX0gySU8xX01BU0sgICAgICAweDAwMWZmMDAwCisjZGVmaW5lIEhDX0FDTURfSDJJTzJfTUFTSyAgICAgIDB4MDAwMDAxZmYKKyNkZWZpbmUgSENfQUNNRF9IMklPMV9TSElGVCAgICAgMTIKKyNkZWZpbmUgSENfQUNNRF9IMklPMl9TSElGVCAgICAgMAorI2RlZmluZSBIQ19BQ01EX0gzSU9fTUFTSyAgICAgICAweDAwMDAwMWZmCisjZGVmaW5lIEhDX0FDTURfSDNDT1VOVF9NQVNLICAgIDB4MDFmZmYwMDAKKyNkZWZpbmUgSENfQUNNRF9IM0NPVU5UX1NISUZUICAgMTIKKyNkZWZpbmUgSENfQUNNRF9INElEX01BU0sgICAgICAgMHgwMDAwMDFmZgorI2RlZmluZSBIQ19BQ01EX0g0Q09VTlRfTUFTSyAgICAweDAxZmZmZTAwCisjZGVmaW5lIEhDX0FDTURfSDRDT1VOVF9TSElGVCAgIDkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKiBEZWZpbmUgSGVhZGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSENfSEVBREVSMgkJMHhGMjEwRjExMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIERlZmluZSBEdW1teSBWYWx1ZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhDX0RVTU1ZCQkweENDQ0NDQ0NDCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqIERlZmluZSBmb3IgRE1BIHVzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhBTENZT05fSEVBREVSMiAgICAgMFhGMjEwRjExMAorI2RlZmluZSBIQUxDWU9OX0ZJUkVDTUQgICAgIDBYRUUxMDAwMDAKKyNkZWZpbmUgSEFMQ1lPTl9GSVJFTUFTSyAgICAwWEZGRjAwMDAwCisjZGVmaW5lIEhBTENZT05fQ01EQiAgICAgICAgMFhFQzAwMDAwMAorI2RlZmluZSBIQUxDWU9OX0NNREJNQVNLICAgIDBYRkZGRTAwMDAKKyNkZWZpbmUgSEFMQ1lPTl9TVUJfQUREUjAgICAwWDAwMDAwMDAwCisjZGVmaW5lIEhBTENZT05fSEVBREVSMU1BU0sgMFhGRkZGRkMwMAorI2RlZmluZSBIQUxDWU9OX0hFQURFUjEgICAgIDBYRjAwMDAwMDAKKyNkZWZpbmUgSENfU3ViQV9IQUdQQnN0TCAgICAgICAgMHgwMDYwCisjZGVmaW5lIEhDX1N1YkFfSEFHUEJlbmRMICAgICAgIDB4MDA2MQorI2RlZmluZSBIQ19TdWJBX0hBR1BDTU5UICAgICAgICAweDAwNjIKKyNkZWZpbmUgSENfU3ViQV9IQUdQQnBMICAgICAgICAgMHgwMDYzCisjZGVmaW5lIEhDX1N1YkFfSEFHUEJwSCAgICAgICAgIDB4MDA2NAorI2RlZmluZSBIQ19IQUdQQ01OVF9NQVNLICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhDX0hDbWRFcnJDbHJfTUFTSyAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSENfSEFHUEJlbmRIX01BU0sgICAgICAgMHgwMDAwZmYwMAorI2RlZmluZSBIQ19IQUdQQnN0SF9NQVNLICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIEhDX0hBR1BCZW5kSF9TSElGVCAgICAgIDgKKyNkZWZpbmUgSENfSEFHUEJzdEhfU0hJRlQgICAgICAgMAorI2RlZmluZSBIQ19IQUdQQnBMX01BU0sgICAgICAgICAweDAwZmZmZmZjCisjZGVmaW5lIEhDX0hBR1BCcElEX01BU0sgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgSENfSEFHUEJwSURfUEFVU0UgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIQ19IQUdQQnBJRF9KVU1QICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhDX0hBR1BCcElEX1NUT1AgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgSENfSEFHUEJwSF9NQVNLICAgICAgICAgMHgwMGZmZmZmZgorCisKKyNkZWZpbmUgVklBX1ZJREVPX0hFQURFUjUgICAgICAgMHhGRTA0MDAwMAorI2RlZmluZSBWSUFfVklERU9fSEVBREVSNiAgICAgICAweEZFMDUwMDAwCisjZGVmaW5lIFZJQV9WSURFT19IRUFERVI3ICAgICAgIDB4RkUwNjAwMDAKKyNkZWZpbmUgVklBX1ZJREVPTUFTSyAgICAgICAgICAgMHhGRkZGMDAwMAorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjgzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kbWEuYwpAQCAtMCwwICsxLDc0MSBAQAorLyogdmlhX2RtYS5jIC0tIERNQSBzdXBwb3J0IGZvciB0aGUgVklBIFVuaWNocm9tZS9Qcm8KKyAqIAorICogQ29weXJpZ2h0IDIwMDMgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBEaWdlbywgSW5jLiwgUGFsbyBBbHRvLCBDQSwgVS5TLkEuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogCisgKiBDb3B5cmlnaHQgMjAwNCBUaGUgVW5pY2hyb21lIHByb2plY3QuCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCAKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiAKKyAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgCisgKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6IAorICogICAgVHVuZ3N0ZW4gR3JhcGhpY3MsIAorICogICAgRXJkaSBDaGVuLCAKKyAqICAgIFRob21hcyBIZWxsc3Ryb20uCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJkcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorI2luY2x1ZGUgInZpYV8zZF9yZWcuaCIKKworI2RlZmluZSBDTURCVUZfQUxJR05NRU5UX1NJWkUgICAoMHgxMDApCisjZGVmaW5lIENNREJVRl9BTElHTk1FTlRfTUFTSyAgICgweDBmZikKKworLyogZGVmaW5lcyBmb3IgVklBIDNEIHJlZ2lzdGVycyAqLworI2RlZmluZSBWSUFfUkVHX1NUQVRVUyAgICAgICAgICAweDQwMAorI2RlZmluZSBWSUFfUkVHX1RSQU5TRVQgICAgICAgICAweDQzQworI2RlZmluZSBWSUFfUkVHX1RSQU5TUEFDRSAgICAgICAweDQ0MAorCisvKiBWSUFfUkVHX1NUQVRVUygweDQwMCk6IEVuZ2luZSBTdGF0dXMgKi8KKyNkZWZpbmUgVklBX0NNRF9SR1RSX0JVU1kgICAgICAgMHgwMDAwMDA4MAkvKiBDb21tYW5kIFJlZ3VsYXRvciBpcyBidXN5ICovCisjZGVmaW5lIFZJQV8yRF9FTkdfQlVTWSAgICAgICAgIDB4MDAwMDAwMDEJLyogMkQgRW5naW5lIGlzIGJ1c3kgKi8KKyNkZWZpbmUgVklBXzNEX0VOR19CVVNZICAgICAgICAgMHgwMDAwMDAwMgkvKiAzRCBFbmdpbmUgaXMgYnVzeSAqLworI2RlZmluZSBWSUFfVlJfUVVFVUVfQlVTWSAgICAgICAweDAwMDIwMDAwCS8qIFZpcnR1YWwgUXVldWUgaXMgYnVzeSAqLworCisjZGVmaW5lIFNldFJlZzJEQUdQKG5SZWcsIG5EYXRhKSB7CQkJCVwKKwkqKCh1aW50MzJfdCAqKSh2YikpID0gKChuUmVnKSA+PiAyKSB8IEhBTENZT05fSEVBREVSMTsJXAorCSooKHVpbnQzMl90ICopKHZiKSArIDEpID0gKG5EYXRhKTsJCQlcCisJdmIgPSAoKHVpbnQzMl90ICopdmIpICsgMjsJCQkJXAorCWRldl9wcml2LT5kbWFfbG93ICs9ODsJCQkJCVwKK30KKworI2RlZmluZSB2aWFfZmx1c2hfd3JpdGVfY29tYmluZSgpIERSTV9NRU1PUllCQVJSSUVSKCkgCisKKyNkZWZpbmUgVklBX09VVF9SSU5HX1FXKHcxLHcyKQkJCVwKKwkqdmIrKyA9ICh3MSk7CQkJCVwKKwkqdmIrKyA9ICh3Mik7CQkJCVwKKwlkZXZfcHJpdi0+ZG1hX2xvdyArPSA4OyAKKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9zdGFydChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KTsKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfcGF1c2UoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3Jlc2V0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpOworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXdpbmQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitzdGF0aWMgaW50IHZpYV93YWl0X2lkbGUoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdik7CitzdGF0aWMgdm9pZCB2aWFfcGFkX2NhY2hlKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IHF3b3Jkcyk7CisKKworLyoKKyAqIEZyZWUgc3BhY2UgaW4gY29tbWFuZCBidWZmZXIuCisgKi8KKworc3RhdGljIHVpbnQzMl90Cit2aWFfY21kYnVmX3NwYWNlKGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgCisJCSh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHI7CisJdWludDMyX3QgaHdfYWRkciA9ICooZGV2X3ByaXYtPmh3X2FkZHJfcHRyKSAtIGFncF9iYXNlOworCQorCXJldHVybiAoKGh3X2FkZHIgPD0gZGV2X3ByaXYtPmRtYV9sb3cpID8gCisJCShkZXZfcHJpdi0+ZG1hX2hpZ2ggKyBod19hZGRyIC0gZGV2X3ByaXYtPmRtYV9sb3cpIDogCisJCShod19hZGRyIC0gZGV2X3ByaXYtPmRtYV9sb3cpKTsKK30KKworLyoKKyAqIEhvdyBtdWNoIGRvZXMgdGhlIGNvbW1hbmQgcmVndWxhdG9yIGxhZyBiZWhpbmQ/CisgKi8KKworc3RhdGljIHVpbnQzMl90Cit2aWFfY21kYnVmX2xhZyhkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisJdWludDMyX3QgYWdwX2Jhc2UgPSBkZXZfcHJpdi0+ZG1hX29mZnNldCArIAorCQkodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOworCXVpbnQzMl90IGh3X2FkZHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cikgLSBhZ3BfYmFzZTsKKwkKKwlyZXR1cm4gKChod19hZGRyIDw9IGRldl9wcml2LT5kbWFfbG93KSA/IAorCQkoZGV2X3ByaXYtPmRtYV9sb3cgLSBod19hZGRyKSA6IAorCQkoZGV2X3ByaXYtPmRtYV93cmFwICsgZGV2X3ByaXYtPmRtYV9sb3cgLSBod19hZGRyKSk7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBzaXplIGZpdHMgaW4gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdhaXQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQKK3ZpYV9jbWRidWZfd2FpdChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKKwl1aW50MzJfdCBjdXJfYWRkciwgaHdfYWRkciwgbmV4dF9hZGRyOworCXZvbGF0aWxlIHVpbnQzMl90ICpod19hZGRyX3B0cjsKKwl1aW50MzJfdCBjb3VudDsKKwlod19hZGRyX3B0ciA9IGRldl9wcml2LT5od19hZGRyX3B0cjsKKwljdXJfYWRkciA9IGRldl9wcml2LT5kbWFfbG93OworCW5leHRfYWRkciA9IGN1cl9hZGRyICsgc2l6ZSArIDUxMioxMDI0OworCWNvdW50ID0gMTAwMDAwMDsKKwlkbyB7CisJICAgICAgICBod19hZGRyID0gKmh3X2FkZHJfcHRyIC0gYWdwX2Jhc2U7CisJCWlmIChjb3VudC0tID09IDApIHsKKwkJCURSTV9FUlJPUigidmlhX2NtZGJ1Zl93YWl0IHRpbWVkIG91dCBodyAleCBjdXJfYWRkciAleCBuZXh0X2FkZHIgJXhcbiIsCisJCQkJICBod19hZGRyLCBjdXJfYWRkciwgbmV4dF9hZGRyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gd2hpbGUgKChjdXJfYWRkciA8IGh3X2FkZHIpICYmIChuZXh0X2FkZHIgPj0gaHdfYWRkcikpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBDaGVja3Mgd2hldGhlciBidWZmZXIgaGVhZCBoYXMgcmVhY2ggdGhlIGVuZC4gUmV3aW5kIHRoZSByaW5nIGJ1ZmZlcgorICogd2hlbiBuZWNlc3NhcnkuCisgKgorICogUmV0dXJucyB2aXJ0dWFsIHBvaW50ZXIgdG8gcmluZyBidWZmZXIuCisgKi8KKworc3RhdGljIGlubGluZSB1aW50MzJfdCAqdmlhX2NoZWNrX2RtYShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworCWlmICgoZGV2X3ByaXYtPmRtYV9sb3cgKyBzaXplICsgNCpDTURCVUZfQUxJR05NRU5UX1NJWkUpID4gZGV2X3ByaXYtPmRtYV9oaWdoKSB7CisJCXZpYV9jbWRidWZfcmV3aW5kKGRldl9wcml2KTsKKwl9CisJaWYgKHZpYV9jbWRidWZfd2FpdChkZXZfcHJpdiwgc2l6ZSkgIT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gKHVpbnQzMl90ICopIChkZXZfcHJpdi0+ZG1hX3B0ciArIGRldl9wcml2LT5kbWFfbG93KTsKK30KKworaW50IHZpYV9kbWFfY2xlYW51cChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKwkJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0KKwkJCShkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0KSB7CisJCQl2aWFfY21kYnVmX3Jlc2V0KGRldl9wcml2KTsKKworCQkJZHJtX2NvcmVfaW9yZW1hcGZyZWUoJmRldl9wcml2LT5yaW5nLm1hcCwgZGV2KTsKKwkJCWRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPSBOVUxMOworCQl9CisKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfaW5pdGlhbGl6ZShkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkgIGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsCisJCQkgIGRybV92aWFfZG1hX2luaXRfdCAqIGluaXQpCit7CisJaWYgKCFkZXZfcHJpdiB8fCAhZGV2X3ByaXYtPm1taW8pIHsKKwkJRFJNX0VSUk9SKCJ2aWFfZG1hX2luaXQgY2FsbGVkIGJlZm9yZSB2aWFfbWFwX2luaXRcbiIpOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ICE9IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgYWdhaW4gd2l0aG91dCBjYWxsaW5nIGNsZWFudXBcbiIsCisJCQkgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJaWYgKCFkZXYtPmFncCB8fCAhZGV2LT5hZ3AtPmJhc2UpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBhZ3AgbWVtb3J5IGF2YWlsYWJsZVxuIiwgCisJCQkgIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJfQorCisJZGV2X3ByaXYtPnJpbmcubWFwLm9mZnNldCA9IGRldi0+YWdwLT5iYXNlICsgaW5pdC0+b2Zmc2V0OworCWRldl9wcml2LT5yaW5nLm1hcC5zaXplID0gaW5pdC0+c2l6ZTsKKwlkZXZfcHJpdi0+cmluZy5tYXAudHlwZSA9IDA7CisJZGV2X3ByaXYtPnJpbmcubWFwLmZsYWdzID0gMDsKKwlkZXZfcHJpdi0+cmluZy5tYXAubXRyciA9IDA7CisKKwlkcm1fY29yZV9pb3JlbWFwKCZkZXZfcHJpdi0+cmluZy5tYXAsIGRldik7CisKKwlpZiAoZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZSA9PSBOVUxMKSB7CisJCXZpYV9kbWFfY2xlYW51cChkZXYpOworCQlEUk1fRVJST1IoImNhbiBub3QgaW9yZW1hcCB2aXJ0dWFsIGFkZHJlc3MgZm9yIgorCQkJICAiIHJpbmcgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIERSTV9FUlIoRU5PTUVNKTsKKwl9CisKKwlkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID0gZGV2X3ByaXYtPnJpbmcubWFwLmhhbmRsZTsKKworCWRldl9wcml2LT5kbWFfcHRyID0gZGV2X3ByaXYtPnJpbmcudmlydHVhbF9zdGFydDsKKwlkZXZfcHJpdi0+ZG1hX2xvdyA9IDA7CisJZGV2X3ByaXYtPmRtYV9oaWdoID0gaW5pdC0+c2l6ZTsKKwlkZXZfcHJpdi0+ZG1hX3dyYXAgPSBpbml0LT5zaXplOworCWRldl9wcml2LT5kbWFfb2Zmc2V0ID0gaW5pdC0+b2Zmc2V0OworCWRldl9wcml2LT5sYXN0X3BhdXNlX3B0ciA9IE5VTEw7CisJZGV2X3ByaXYtPmh3X2FkZHJfcHRyID0gZGV2X3ByaXYtPm1taW8tPmhhbmRsZSArIGluaXQtPnJlZ19wYXVzZV9hZGRyOworCisJdmlhX2NtZGJ1Zl9zdGFydChkZXZfcHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfZG1hX2luaXRfdCBpbml0OworCWludCByZXRjb2RlID0gMDsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChpbml0LCAoZHJtX3ZpYV9kbWFfaW5pdF90ICopIGRhdGEsCisJCQkJIHNpemVvZihpbml0KSk7CisKKwlzd2l0Y2ggKGluaXQuZnVuYykgeworCWNhc2UgVklBX0lOSVRfRE1BOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXRjb2RlID0gRFJNX0VSUihFUEVSTSk7CisJCWVsc2UKKwkJCXJldGNvZGUgPSB2aWFfaW5pdGlhbGl6ZShkZXYsIGRldl9wcml2LCAmaW5pdCk7CisJCWJyZWFrOworCWNhc2UgVklBX0NMRUFOVVBfRE1BOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXRjb2RlID0gRFJNX0VSUihFUEVSTSk7CisJCWVsc2UKKwkJCXJldGNvZGUgPSB2aWFfZG1hX2NsZWFudXAoZGV2KTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgVklBX0RNQV9JTklUSUFMSVpFRDoKKwkJcmV0Y29kZSA9IChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ICE9IE5VTEwpID8gCisJCQkwOiBEUk1fRVJSKCBFRkFVTFQgKTsKKwkgICAgICAgIGJyZWFrOworCWRlZmF1bHQ6CisJCXJldGNvZGUgPSBEUk1fRVJSKEVJTlZBTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXRjb2RlOworfQorCisKKworc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfY21kYnVmZmVyKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXY7CisJdWludDMyX3QgKnZiOworCWludCByZXQ7CisKKwlkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKGRldl9wcml2LT5yaW5nLnZpcnR1YWxfc3RhcnQgPT0gTlVMTCkgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRob3V0IGluaXRpYWxpemluZyBBR1AgcmluZyBidWZmZXIuXG4iLAorCQkJICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOworCX0KKworCWlmIChjbWQtPnNpemUgPiBWSUFfUENJX0JVRl9TSVpFKSB7CisJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CisJfSAKKworCisJaWYgKERSTV9DT1BZX0ZST01fVVNFUihkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5idWYsIGNtZC0+c2l6ZSkpCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisKKwkvKgorCSAqIFJ1bm5pbmcgdGhpcyBmdW5jdGlvbiBvbiBBR1AgbWVtb3J5IGlzIGRlYWQgc2xvdy4gVGhlcmVmb3JlCisJICogd2UgcnVuIGl0IG9uIGEgdGVtcG9yYXJ5IGNhY2hlYWJsZSBzeXN0ZW0gbWVtb3J5IGJ1ZmZlciBhbmQKKwkgKiBjb3B5IGl0IHRvIEFHUCBtZW1vcnkgd2hlbiByZWFkeS4KKwkgKi8KKworCQkKKwlpZiAoKHJldCA9IHZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oKHVpbnQzMl90ICopZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+c2l6ZSwgZGV2LCAxKSkpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisgICAgICAgCQorCQorCXZiID0gdmlhX2NoZWNrX2RtYShkZXZfcHJpdiwgKGNtZC0+c2l6ZSA8IDB4MTAwKSA/IDB4MTAyIDogY21kLT5zaXplKTsKKwlpZiAodmIgPT0gTlVMTCkgeworCQlyZXR1cm4gRFJNX0VSUihFQUdBSU4pOworCX0KKworCW1lbWNweSh2YiwgZGV2X3ByaXYtPnBjaV9idWYsIGNtZC0+c2l6ZSk7CisJCisJZGV2X3ByaXYtPmRtYV9sb3cgKz0gY21kLT5zaXplOworCisJLyoKKwkgKiBTbWFsbCBzdWJtaXNzaW9ucyBzb21laG93IHN0YWxscyB0aGUgQ1BVLiAoQUdQIGNhY2hlIGVmZmVjdHM/KQorCSAqIHBhZCB0byBncmVhdGVyIHNpemUuCisJICovCisKKwlpZiAoY21kLT5zaXplIDwgMHgxMDApCisJICB2aWFfcGFkX2NhY2hlKGRldl9wcml2LCgweDEwMCAtIGNtZC0+c2l6ZSkgPj4gMyk7CisJdmlhX2NtZGJ1Zl9wYXVzZShkZXZfcHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9kcml2ZXJfZG1hX3F1aWVzY2VudChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmICghdmlhX3dhaXRfaWRsZShkZXZfcHJpdikpIHsKKwkJcmV0dXJuIERSTV9FUlIoRUJVU1kpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9mbHVzaF9pb2N0bChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCXJldHVybiB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZGV2KTsKK30KKworaW50IHZpYV9jbWRidWZmZXIoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fdmlhX2NtZGJ1ZmZlcl90IGNtZGJ1ZjsKKwlpbnQgcmV0OworCisJTE9DS19URVNUX1dJVEhfUkVUVVJOKCBkZXYsIGZpbHAgKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChjbWRidWYsIChkcm1fdmlhX2NtZGJ1ZmZlcl90ICopIGRhdGEsCisJCQkJIHNpemVvZihjbWRidWYpKTsKKworCURSTV9ERUJVRygidmlhIGNtZGJ1ZmZlciwgYnVmICVwIHNpemUgJWx1XG4iLCBjbWRidWYuYnVmLCBjbWRidWYuc2l6ZSk7CisKKwlyZXQgPSB2aWFfZGlzcGF0Y2hfY21kYnVmZmVyKGRldiwgJmNtZGJ1Zik7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitleHRlcm4gaW50IAordmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqZGV2LCBjb25zdCB1aW50MzJfdCAqIGJ1ZiwgdW5zaWduZWQgaW50IHNpemUpOworc3RhdGljIGludCB2aWFfZGlzcGF0Y2hfcGNpX2NtZGJ1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsCisJCQkJICAgICAgZHJtX3ZpYV9jbWRidWZmZXJfdCAqIGNtZCkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWludCByZXQ7CisKKwlpZiAoY21kLT5zaXplID4gVklBX1BDSV9CVUZfU0laRSkgeworCQlyZXR1cm4gRFJNX0VSUihFTk9NRU0pOworCX0gCisJaWYgKERSTV9DT1BZX0ZST01fVVNFUihkZXZfcHJpdi0+cGNpX2J1ZiwgY21kLT5idWYsIGNtZC0+c2l6ZSkpCisJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CisJCisJaWYgKChyZXQgPSB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKCh1aW50MzJfdCAqKWRldl9wcml2LT5wY2lfYnVmLCBjbWQtPnNpemUsIGRldiwgMCkpKSB7CisJCXJldHVybiByZXQ7CisJfQorCQorCXJldCA9IHZpYV9wYXJzZV9jb21tYW5kX3N0cmVhbShkZXYsIChjb25zdCB1aW50MzJfdCAqKWRldl9wcml2LT5wY2lfYnVmLCBjbWQtPnNpemUpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB2aWFfcGNpX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV92aWFfY21kYnVmZmVyX3QgY21kYnVmOworCWludCByZXQ7CisKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGNtZGJ1ZiwgKGRybV92aWFfY21kYnVmZmVyX3QgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGNtZGJ1ZikpOworCisJRFJNX0RFQlVHKCJ2aWFfcGNpX2NtZGJ1ZmZlciwgYnVmICVwIHNpemUgJWx1XG4iLCBjbWRidWYuYnVmLAorCQkgIGNtZGJ1Zi5zaXplKTsKKworCXJldCA9IHZpYV9kaXNwYXRjaF9wY2lfY21kYnVmZmVyKGRldiwgJmNtZGJ1Zik7CisJaWYgKHJldCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgKnZpYV9hbGlnbl9idWZmZXIoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdiwKKwkJCQkJIHVpbnQzMl90ICogdmIsIGludCBxd19jb3VudCkKK3sKKyAgICAgICAgZm9yICg7IHF3X2NvdW50ID4gMDsgLS1xd19jb3VudCkgeworCQlWSUFfT1VUX1JJTkdfUVcoSENfRFVNTVksIEhDX0RVTU1ZKTsKKwl9CisJcmV0dXJuIHZiOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW50ZXJuYWxseSBieSByaW5nIGJ1ZmZlciBtYW5nZW1lbnQgY29kZS4KKyAqCisgKiBSZXR1cm5zIHZpcnR1YWwgcG9pbnRlciB0byByaW5nIGJ1ZmZlci4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCAqdmlhX2dldF9kbWEoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwlyZXR1cm4gKHVpbnQzMl90ICopIChkZXZfcHJpdi0+ZG1hX3B0ciArIGRldl9wcml2LT5kbWFfbG93KTsKK30KKworLyoKKyAqIEhvb2tzIGEgc2VnbWVudCBvZiBkYXRhIGludG8gdGhlIHRhaWwgb2YgdGhlIHJpbmctYnVmZmVyIGJ5CisgKiBtb2RpZnlpbmcgdGhlIHBhdXNlIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBidWZmZXIgaXRzZWxmLiBJZgorICogdGhlIHJlZ3VsYXRvciBoYXMgYWxyZWFkeSBwYXVzZWQsIHJlc3RhcnQgaXQuCisgKi8KK3N0YXRpYyBpbnQgdmlhX2hvb2tfc2VnbWVudChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkgICAgdWludDMyX3QgcGF1c2VfYWRkcl9oaSwgdWludDMyX3QgcGF1c2VfYWRkcl9sbywKKwkJCSAgICBpbnQgbm9fcGNpX2ZpcmUpCit7CisJaW50IHBhdXNlZCwgY291bnQ7CisJdm9sYXRpbGUgdWludDMyX3QgKnBhdXNlZF9hdCA9IGRldl9wcml2LT5sYXN0X3BhdXNlX3B0cjsKKworCXZpYV9mbHVzaF93cml0ZV9jb21iaW5lKCk7CisJd2hpbGUoISAqKHZpYV9nZXRfZG1hKGRldl9wcml2KS0xKSk7CisJKmRldl9wcml2LT5sYXN0X3BhdXNlX3B0ciA9IHBhdXNlX2FkZHJfbG87CisJdmlhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKTsKKworCS8qCisJICogVGhlIGJlbG93IHN0YXRlbWVudCBpcyBpbnNlcnRlZCB0byByZWFsbHkgZm9yY2UgdGhlIGZsdXNoLgorCSAqIE5vdCBzdXJlIGl0IGlzIG5lZWRlZC4KKwkgKi8KKworCXdoaWxlKCEgKmRldl9wcml2LT5sYXN0X3BhdXNlX3B0cik7CisJZGV2X3ByaXYtPmxhc3RfcGF1c2VfcHRyID0gdmlhX2dldF9kbWEoZGV2X3ByaXYpIC0gMTsKKwl3aGlsZSghICpkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIpOworCisKKwlwYXVzZWQgPSAwOworCWNvdW50ID0gMjA7IAorCisJd2hpbGUgKCEocGF1c2VkID0gKFZJQV9SRUFEKDB4NDFjKSAmIDB4ODAwMDAwMDApKSAmJiBjb3VudC0tKTsKKwlpZiAoKGNvdW50IDw9IDgpICYmIChjb3VudCA+PSAwKSkgeworCQl1aW50MzJfdCByZ3RyLCBwdHI7CisJCXJndHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cik7CisJCXB0ciA9ICgoY2hhciAqKWRldl9wcml2LT5sYXN0X3BhdXNlX3B0ciAtIGRldl9wcml2LT5kbWFfcHRyKSArIAorCQkJZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyICsgNCAtIAorCQkJQ01EQlVGX0FMSUdOTUVOVF9TSVpFOworCQlpZiAocmd0ciA8PSBwdHIpIHsKKwkJCURSTV9FUlJPUigiQ29tbWFuZCByZWd1bGF0b3JcbnBhdXNlZCBhdCBjb3VudCAlZCwgYWRkcmVzcyAleCwgIgorCQkJCSAgIndoaWxlIGN1cnJlbnQgcGF1c2UgYWRkcmVzcyBpcyAleC5cbiIKKwkJCQkgICJQbGVhc2UgbWFpbCB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCSAgIjx1bmljaHJvbWUtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PlxuIiwKKwkJCQkgIGNvdW50LCByZ3RyLCBwdHIpOworCQl9CisJfQorCQkKKwlpZiAocGF1c2VkICYmICFub19wY2lfZmlyZSkgeworCSAgICAgICAgdWludDMyX3Qgcmd0cixwdHI7CisJCXVpbnQzMl90IHB0cl9sb3c7CisKKwkJY291bnQgPSAxMDAwMDAwOworCQl3aGlsZSAoKFZJQV9SRUFEKFZJQV9SRUdfU1RBVFVTKSAmIFZJQV9DTURfUkdUUl9CVVNZKSAmJiBjb3VudC0tKTsKKwkJCisJCXJndHIgPSAqKGRldl9wcml2LT5od19hZGRyX3B0cik7CisJCXB0ciA9ICgoY2hhciAqKXBhdXNlZF9hdCAtIGRldl9wcml2LT5kbWFfcHRyKSArIAorCQkJZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyICsgNDsKKwkJCisKKwkJcHRyX2xvdyA9IChwdHIgPiAzKkNNREJVRl9BTElHTk1FTlRfU0laRSkgPyAKKwkJCXB0ciAtIDMqQ01EQlVGX0FMSUdOTUVOVF9TSVpFIDogMDsKKwkJaWYgKHJndHIgPD0gcHRyICYmIHJndHIgPj0gcHRyX2xvdykgeworCQkJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNFVCwgKEhDX1BhcmFUeXBlX1ByZUNSIDw8IDE2KSk7CisJCQlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfaGkpOworCQkJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNQQUNFLCBwYXVzZV9hZGRyX2xvKTsKKwkJfSAKKwl9CisJcmV0dXJuIHBhdXNlZDsKK30KKworCisKK3N0YXRpYyBpbnQgdmlhX3dhaXRfaWRsZShkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2KQoreworCWludCBjb3VudCA9IDEwMDAwMDAwOworCXdoaWxlIChjb3VudC0tICYmIChWSUFfUkVBRChWSUFfUkVHX1NUQVRVUykgJgorCQkJICAgKFZJQV9DTURfUkdUUl9CVVNZIHwgVklBXzJEX0VOR19CVVNZIHwKKwkJCSAgICBWSUFfM0RfRU5HX0JVU1kpKSkgOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVpbnQzMl90ICp2aWFfYWxpZ25fY21kKGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYsIHVpbnQzMl90IGNtZF90eXBlLAorCQkJICAgICAgIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90ICpjbWRfYWRkcl9oaSwgCisJCQkgICAgICAgdWludDMyX3QgKmNtZF9hZGRyX2xvLAorCQkJICAgICAgIGludCBza2lwX3dhaXQpCit7CisJdWludDMyX3QgYWdwX2Jhc2U7CisJdWludDMyX3QgY21kX2FkZHIsIGFkZHJfbG8sIGFkZHJfaGk7CisJdWludDMyX3QgKnZiOworCXVpbnQzMl90IHF3X3BhZF9jb3VudDsKKworCWlmICghc2tpcF93YWl0KQorCQl2aWFfY21kYnVmX3dhaXQoZGV2X3ByaXYsIDIqQ01EQlVGX0FMSUdOTUVOVF9TSVpFKTsKKworCXZiID0gdmlhX2dldF9kbWEoZGV2X3ByaXYpOworCVZJQV9PVVRfUklOR19RVyggSENfSEVBREVSMiB8ICgoVklBX1JFR19UUkFOU0VUID4+IDIpIDw8IDEyKSB8CisJCQkgKFZJQV9SRUdfVFJBTlNQQUNFID4+IDIpLCBIQ19QYXJhVHlwZV9QcmVDUiA8PCAxNik7IAorCWFncF9iYXNlID0gZGV2X3ByaXYtPmRtYV9vZmZzZXQgKyAodWludDMyX3QpIGRldl9wcml2LT5hZ3BBZGRyOworCXF3X3BhZF9jb3VudCA9IChDTURCVUZfQUxJR05NRU5UX1NJWkUgPj4gMykgLQorCQkoKGRldl9wcml2LT5kbWFfbG93ICYgQ01EQlVGX0FMSUdOTUVOVF9NQVNLKSA+PiAzKTsKKworCQorCWNtZF9hZGRyID0gKGFkZHIpID8gYWRkciA6IAorCQlhZ3BfYmFzZSArIGRldl9wcml2LT5kbWFfbG93IC0gOCArIChxd19wYWRfY291bnQgPDwgMyk7CisJYWRkcl9sbyA9ICgoSENfU3ViQV9IQUdQQnBMIDw8IDI0KSB8IChjbWRfdHlwZSAmIEhDX0hBR1BCcElEX01BU0spIHwKKwkJICAgKGNtZF9hZGRyICYgSENfSEFHUEJwTF9NQVNLKSk7CisJYWRkcl9oaSA9ICgoSENfU3ViQV9IQUdQQnBIIDw8IDI0KSB8IChjbWRfYWRkciA+PiAyNCkpOworCisJdmIgPSB2aWFfYWxpZ25fYnVmZmVyKGRldl9wcml2LCB2YiwgcXdfcGFkX2NvdW50IC0gMSk7CisJVklBX09VVF9SSU5HX1FXKCpjbWRfYWRkcl9oaSA9IGFkZHJfaGksIAorCQkJKmNtZF9hZGRyX2xvID0gYWRkcl9sbyk7CisJcmV0dXJuIHZiOworfQorCisKKworCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX3N0YXJ0KGRybV92aWFfcHJpdmF0ZV90ICogZGV2X3ByaXYpCit7CisJdWludDMyX3QgcGF1c2VfYWRkcl9sbywgcGF1c2VfYWRkcl9oaTsKKwl1aW50MzJfdCBzdGFydF9hZGRyLCBzdGFydF9hZGRyX2xvOworCXVpbnQzMl90IGVuZF9hZGRyLCBlbmRfYWRkcl9sbzsKKwl1aW50MzJfdCBjb21tYW5kOworCXVpbnQzMl90IGFncF9iYXNlOworCisKKwlkZXZfcHJpdi0+ZG1hX2xvdyA9IDA7CisKKwlhZ3BfYmFzZSA9IGRldl9wcml2LT5kbWFfb2Zmc2V0ICsgKHVpbnQzMl90KSBkZXZfcHJpdi0+YWdwQWRkcjsKKwlzdGFydF9hZGRyID0gYWdwX2Jhc2U7CisJZW5kX2FkZHIgPSBhZ3BfYmFzZSArIGRldl9wcml2LT5kbWFfaGlnaDsKKworCXN0YXJ0X2FkZHJfbG8gPSAoKEhDX1N1YkFfSEFHUEJzdEwgPDwgMjQpIHwgKHN0YXJ0X2FkZHIgJiAweEZGRkZGRikpOworCWVuZF9hZGRyX2xvID0gKChIQ19TdWJBX0hBR1BCZW5kTCA8PCAyNCkgfCAoZW5kX2FkZHIgJiAweEZGRkZGRikpOworCWNvbW1hbmQgPSAoKEhDX1N1YkFfSEFHUENNTlQgPDwgMjQpIHwgKHN0YXJ0X2FkZHIgPj4gMjQpIHwKKwkJICAgKChlbmRfYWRkciAmIDB4ZmYwMDAwMDApID4+IDE2KSk7CisKKwlkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIgPSAKKwkJdmlhX2FsaWduX2NtZChkZXZfcHJpdiwgSENfSEFHUEJwSURfUEFVU0UsIDAsIAorCQkJICAgICAgJnBhdXNlX2FkZHJfaGksICYgcGF1c2VfYWRkcl9sbywgMSkgLSAxOworCisJdmlhX2ZsdXNoX3dyaXRlX2NvbWJpbmUoKTsKKwl3aGlsZSghICpkZXZfcHJpdi0+bGFzdF9wYXVzZV9wdHIpOworCisJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNFVCwgKEhDX1BhcmFUeXBlX1ByZUNSIDw8IDE2KSk7CisJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNQQUNFLCBjb21tYW5kKTsKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHN0YXJ0X2FkZHJfbG8pOworCVZJQV9XUklURShWSUFfUkVHX1RSQU5TUEFDRSwgZW5kX2FkZHJfbG8pOworCisJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNQQUNFLCBwYXVzZV9hZGRyX2hpKTsKKwlWSUFfV1JJVEUoVklBX1JFR19UUkFOU1BBQ0UsIHBhdXNlX2FkZHJfbG8pOworCisJVklBX1dSSVRFKFZJQV9SRUdfVFJBTlNQQUNFLCBjb21tYW5kIHwgSENfSEFHUENNTlRfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9wYWRfY2FjaGUoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgcXdvcmRzKQoreworCXVpbnQzMl90ICp2YjsKKworCXZpYV9jbWRidWZfd2FpdChkZXZfcHJpdiwgcXdvcmRzICsgMik7CisJdmIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdik7CisJVklBX09VVF9SSU5HX1FXKCBIQ19IRUFERVIyLCBIQ19QYXJhVHlwZV9Ob3RUZXggPDwgMTYpOworCXZpYV9hbGlnbl9idWZmZXIoZGV2X3ByaXYsdmIscXdvcmRzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZpYV9kdW1teV9iaXRibHQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl1aW50MzJfdCAqdmIgPSB2aWFfZ2V0X2RtYShkZXZfcHJpdik7CisJU2V0UmVnMkRBR1AoMHgwQywgKDAgfCAoMCA8PCAxNikpKTsKKwlTZXRSZWcyREFHUCgweDEwLCAwIHwgKDAgPDwgMTYpKTsKKwlTZXRSZWcyREFHUCgweDAsIDB4MSB8IDB4MjAwMCB8IDB4QUEwMDAwMDApOyAKK30KKworCitzdGF0aWMgdm9pZCB2aWFfY21kYnVmX2p1bXAoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBhZ3BfYmFzZTsKKwl1aW50MzJfdCBwYXVzZV9hZGRyX2xvLCBwYXVzZV9hZGRyX2hpOworCXVpbnQzMl90IGp1bXBfYWRkcl9sbywganVtcF9hZGRyX2hpOworCXZvbGF0aWxlIHVpbnQzMl90ICpsYXN0X3BhdXNlX3B0cjsKKwl1aW50MzJfdCBkbWFfbG93X3NhdmUxLCBkbWFfbG93X3NhdmUyOworCisJYWdwX2Jhc2UgPSBkZXZfcHJpdi0+ZG1hX29mZnNldCArICh1aW50MzJfdCkgZGV2X3ByaXYtPmFncEFkZHI7CisJdmlhX2FsaWduX2NtZChkZXZfcHJpdiwgIEhDX0hBR1BCcElEX0pVTVAsIDAsICZqdW1wX2FkZHJfaGksIAorCQkgICAgICAmanVtcF9hZGRyX2xvLCAwKTsKKwkKKwlkZXZfcHJpdi0+ZG1hX3dyYXAgPSBkZXZfcHJpdi0+ZG1hX2xvdzsKKworCisJLyoKKwkgKiBXcmFwIGNvbW1hbmQgYnVmZmVyIHRvIHRoZSBiZWdpbm5pbmcuCisJICovCisKKwlkZXZfcHJpdi0+ZG1hX2xvdyA9IDA7CisJaWYgKHZpYV9jbWRidWZfd2FpdChkZXZfcHJpdiwgQ01EQlVGX0FMSUdOTUVOVF9TSVpFKSAhPSAwKSB7CisJCURSTV9FUlJPUigidmlhX2NtZGJ1Zl9qdW1wIGZhaWxlZFxuIik7CisJfQorCisJdmlhX2R1bW15X2JpdGJsdChkZXZfcHJpdik7CisJdmlhX2R1bW15X2JpdGJsdChkZXZfcHJpdik7IAorCisJbGFzdF9wYXVzZV9wdHIgPSB2aWFfYWxpZ25fY21kKGRldl9wcml2LCAgSENfSEFHUEJwSURfUEFVU0UsIDAsICZwYXVzZV9hZGRyX2hpLCAKKwkJCQkgICAgICAgJnBhdXNlX2FkZHJfbG8sIDApIC0xOworCXZpYV9hbGlnbl9jbWQoZGV2X3ByaXYsICBIQ19IQUdQQnBJRF9QQVVTRSwgMCwgJnBhdXNlX2FkZHJfaGksIAorCQkgICAgICAmcGF1c2VfYWRkcl9sbywgMCk7CisKKwkqbGFzdF9wYXVzZV9wdHIgPSBwYXVzZV9hZGRyX2xvOworCWRtYV9sb3dfc2F2ZTEgPSBkZXZfcHJpdi0+ZG1hX2xvdzsKKworCS8qCisJICogTm93LCBzZXQgYSB0cmFwIHRoYXQgd2lsbCBwYXVzZSB0aGUgcmVndWxhdG9yIGlmIGl0IHRyaWVzIHRvIHJlcnVuIHRoZSBvbGQKKwkgKiBjb21tYW5kIGJ1ZmZlci4gKFdoaWNoIG1heSBoYXBwZW4gaWYgdmlhX2hvb2tfc2VnbWVudCBkZXRlY3MgYSBjb21tYW5kIHJlZ3VsYXRvciBwYXVzZQorCSAqIGFuZCByZWlzc3VlcyB0aGUganVtcCBjb21tYW5kIG92ZXIgUENJLCB3aGlsZSB0aGUgcmVndWxhdG9yIGhhcyBhbHJlYWR5IHRha2VuIHRoZSBqdW1wCisJICogYW5kIGFjdHVhbGx5IHBhdXNlZCBhdCB0aGUgY3VycmVudCBidWZmZXIgZW5kKS4KKwkgKiBUaGVyZSBhcHBlYXJzIHRvIGJlIG5vIG90aGVyIHdheSB0byBkZXRlY3QgdGhpcyBjb25kaXRpb24sIHNpbmNlIHRoZSBod19hZGRyX3BvaW50ZXIKKwkgKiBkb2VzIG5vdCBzZWVtIHRvIGdldCB1cGRhdGVkIGltbWVkaWF0ZWx5IHdoZW4gYSBqdW1wIG9jY3Vycy4KKwkgKi8KKworCWxhc3RfcGF1c2VfcHRyID0gdmlhX2FsaWduX2NtZChkZXZfcHJpdiwgIEhDX0hBR1BCcElEX1BBVVNFLCAwLCAmcGF1c2VfYWRkcl9oaSwgCisJCQkJICAgICAgICZwYXVzZV9hZGRyX2xvLCAwKSAtMTsKKwl2aWFfYWxpZ25fY21kKGRldl9wcml2LCAgSENfSEFHUEJwSURfUEFVU0UsIDAsICZwYXVzZV9hZGRyX2hpLCAKKwkJICAgICAgJnBhdXNlX2FkZHJfbG8sIDApOworCSpsYXN0X3BhdXNlX3B0ciA9IHBhdXNlX2FkZHJfbG87CisKKwlkbWFfbG93X3NhdmUyID0gZGV2X3ByaXYtPmRtYV9sb3c7CisJZGV2X3ByaXYtPmRtYV9sb3cgPSBkbWFfbG93X3NhdmUxOwkKKwl2aWFfaG9va19zZWdtZW50KCBkZXZfcHJpdiwganVtcF9hZGRyX2hpLCBqdW1wX2FkZHJfbG8sIDApOworCWRldl9wcml2LT5kbWFfbG93ID0gZG1hX2xvd19zYXZlMjsKKwl2aWFfaG9va19zZWdtZW50KCBkZXZfcHJpdiwgcGF1c2VfYWRkcl9oaSwgcGF1c2VfYWRkcl9sbywgMCk7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9yZXdpbmQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl2aWFfY21kYnVmX2p1bXAoZGV2X3ByaXYpOyAKK30KKworc3RhdGljIHZvaWQgdmlhX2NtZGJ1Zl9mbHVzaChkcm1fdmlhX3ByaXZhdGVfdCAqIGRldl9wcml2LCB1aW50MzJfdCBjbWRfdHlwZSkKK3sKKwl1aW50MzJfdCBwYXVzZV9hZGRyX2xvLCBwYXVzZV9hZGRyX2hpOworCisJdmlhX2FsaWduX2NtZChkZXZfcHJpdiwgY21kX3R5cGUsIDAsICZwYXVzZV9hZGRyX2hpLCAmcGF1c2VfYWRkcl9sbywgMCk7CisJdmlhX2hvb2tfc2VnbWVudCggZGV2X3ByaXYsIHBhdXNlX2FkZHJfaGksIHBhdXNlX2FkZHJfbG8sIDApOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfcGF1c2UoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl2aWFfY21kYnVmX2ZsdXNoKGRldl9wcml2LCBIQ19IQUdQQnBJRF9QQVVTRSk7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9jbWRidWZfcmVzZXQoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl2aWFfY21kYnVmX2ZsdXNoKGRldl9wcml2LCBIQ19IQUdQQnBJRF9TVE9QKTsKKwl2aWFfd2FpdF9pZGxlKGRldl9wcml2KTsKK30KKworLyoKKyAqIFVzZXIgaW50ZXJmYWNlIHRvIHRoZSBzcGFjZSBhbmQgbGFnIGZ1bmN0aW9ucy4KKyAqLworCitpbnQgCit2aWFfY21kYnVmX3NpemUoRFJNX0lPQ1RMX0FSR1MpCit7CisJRFJNX0RFVklDRTsKKwlkcm1fdmlhX2NtZGJ1Zl9zaXplX3QgZF9zaXo7CisJaW50IHJldCA9IDA7CisJdWludDMyX3QgdG1wX3NpemUsIGNvdW50OworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdjsKKworCURSTV9ERUJVRygidmlhIGNtZGJ1Zl9zaXplXG4iKTsKKwlMT0NLX1RFU1RfV0lUSF9SRVRVUk4oIGRldiwgZmlscCApOworCisJZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChkZXZfcHJpdi0+cmluZy52aXJ0dWFsX3N0YXJ0ID09IE5VTEwpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aG91dCBpbml0aWFsaXppbmcgQUdQIHJpbmcgYnVmZmVyLlxuIiwKKwkJCSAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoZF9zaXosIChkcm1fdmlhX2NtZGJ1Zl9zaXplX3QgKikgZGF0YSwKKwkJCQkgc2l6ZW9mKGRfc2l6KSk7CisKKworCWNvdW50ID0gMTAwMDAwMDsKKwl0bXBfc2l6ZSA9IGRfc2l6LnNpemU7CisJc3dpdGNoKGRfc2l6LmZ1bmMpIHsKKwljYXNlIFZJQV9DTURCVUZfU1BBQ0U6CisJCXdoaWxlICgoKHRtcF9zaXplID0gdmlhX2NtZGJ1Zl9zcGFjZShkZXZfcHJpdikpIDwgZF9zaXouc2l6ZSkgJiYgY291bnQtLSkgeworCQkJaWYgKCFkX3Npei53YWl0KSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFjb3VudCkgeworCQkJRFJNX0VSUk9SKCJWSUFfQ01EQlVGX1NQQUNFIHRpbWVkIG91dC5cbiIpOworCQkJcmV0ID0gRFJNX0VSUihFQUdBSU4pOworCQl9CisJCWJyZWFrOworCWNhc2UgVklBX0NNREJVRl9MQUc6CisJCXdoaWxlICgoKHRtcF9zaXplID0gdmlhX2NtZGJ1Zl9sYWcoZGV2X3ByaXYpKSA+IGRfc2l6LnNpemUpICYmIGNvdW50LS0pIHsKKwkJCWlmICghZF9zaXoud2FpdCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghY291bnQpIHsKKwkJCURSTV9FUlJPUigiVklBX0NNREJVRl9MQUcgdGltZWQgb3V0LlxuIik7CisJCQlyZXQgPSBEUk1fRVJSKEVBR0FJTik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gRFJNX0VSUihFRkFVTFQpOworCX0KKwlkX3Npei5zaXplID0gdG1wX3NpemU7CisKKwlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fdmlhX2NtZGJ1Zl9zaXplX3QgKikgZGF0YSwgZF9zaXosCisJCQkgICAgICAgc2l6ZW9mKGRfc2l6KSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4OGM5YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RybS5oCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IDE5OTgtMjAwMyBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAwMS0yMDAzIFMzIEdyYXBoaWNzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfVklBX0RSTV9IXworI2RlZmluZSBfVklBX0RSTV9IXworCisvKiBXQVJOSU5HOiBUaGVzZSBkZWZpbmVzIG11c3QgYmUgdGhlIHNhbWUgYXMgd2hhdCB0aGUgWHNlcnZlciB1c2VzLgorICogaWYgeW91IGNoYW5nZSB0aGVtLCB5b3UgbXVzdCBjaGFuZ2UgdGhlIGRlZmluZXMgaW4gdGhlIFhzZXJ2ZXIuCisgKi8KKworI2lmbmRlZiBfVklBX0RFRklORVNfCisjZGVmaW5lIF9WSUFfREVGSU5FU18KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSAidmlhX2RybWNsaWVudC5oIgorI2VuZGlmCisKKyNkZWZpbmUgVklBX05SX1NBUkVBX0NMSVBSRUNUUyAJCTgKKyNkZWZpbmUgVklBX05SX1hWTUNfUE9SVFMgICAgICAgICAgICAgICAxMAorI2RlZmluZSBWSUFfTlJfWFZNQ19MT0NLUyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVklBX01BWF9DQUNIRUxJTkVfU0laRSAgICAgICAgICA2NAorI2RlZmluZSBYVk1DTE9DS1BUUihzYVByaXYsbG9ja05vKQkJCQkJXAorCSgodm9sYXRpbGUgZHJtX2h3X2xvY2tfdCAqKSgoKCgodW5zaWduZWQgbG9uZykgKHNhUHJpdiktPlh2TUNMb2NrQXJlYSkgKyBcCisJCQkJICAgICAgKFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgLSAxKSkgJglcCisJCQkJICAgICB+KFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgLSAxKSkgKwlcCisJCQkJICAgIFZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUqKGxvY2tObykpKQorCisvKiBFYWNoIHJlZ2lvbiBpcyBhIG1pbmltdW0gb2YgNjRrLCBhbmQgdGhlcmUgYXJlIGF0IG1vc3QgNjQgb2YgdGhlbS4KKyAqLworI2RlZmluZSBWSUFfTlJfVEVYX1JFR0lPTlMgNjQKKyNkZWZpbmUgVklBX0xPR19NSU5fVEVYX1JFR0lPTl9TSVpFIDE2CisjZW5kaWYKKworI2RlZmluZSBWSUFfVVBMT0FEX1RFWDBJTUFHRSAgMHgxCS8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBWSUFfVVBMT0FEX1RFWDFJTUFHRSAgMHgyCS8qIGhhbmRsZWQgY2xpZW50c2lkZSAqLworI2RlZmluZSBWSUFfVVBMT0FEX0NUWCAgICAgICAgMHg0CisjZGVmaW5lIFZJQV9VUExPQURfQlVGRkVSUyAgICAweDgKKyNkZWZpbmUgVklBX1VQTE9BRF9URVgwICAgICAgIDB4MTAKKyNkZWZpbmUgVklBX1VQTE9BRF9URVgxICAgICAgIDB4MjAKKyNkZWZpbmUgVklBX1VQTE9BRF9DTElQUkVDVFMgIDB4NDAKKyNkZWZpbmUgVklBX1VQTE9BRF9BTEwgICAgICAgIDB4ZmYKKworLyogVklBIHNwZWNpZmljIGlvY3RscyAqLworI2RlZmluZSBEUk1fVklBX0FMTE9DTUVNCTB4MDAKKyNkZWZpbmUgRFJNX1ZJQV9GUkVFTUVNCSAgICAgICAgMHgwMQorI2RlZmluZSBEUk1fVklBX0FHUF9JTklUCTB4MDIKKyNkZWZpbmUgRFJNX1ZJQV9GQl9JTklUCSAgICAgICAgMHgwMworI2RlZmluZSBEUk1fVklBX01BUF9JTklUCTB4MDQKKyNkZWZpbmUgRFJNX1ZJQV9ERUNfRlVURVggICAgICAgMHgwNQorI2RlZmluZSBOT1RfVVNFRAorI2RlZmluZSBEUk1fVklBX0RNQV9JTklUCTB4MDcKKyNkZWZpbmUgRFJNX1ZJQV9DTURCVUZGRVIJMHgwOAorI2RlZmluZSBEUk1fVklBX0ZMVVNICSAgICAgICAgMHgwOQorI2RlZmluZSBEUk1fVklBX1BDSUNNRAkgICAgICAgIDB4MGEKKyNkZWZpbmUgRFJNX1ZJQV9DTURCVUZfU0laRQkweDBiCisjZGVmaW5lIE5PVF9VU0VECisjZGVmaW5lIERSTV9WSUFfV0FJVF9JUlEgICAgICAgIDB4MGQKKworI2RlZmluZSBEUk1fSU9DVExfVklBX0FMTE9DTUVNCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfQUxMT0NNRU0sIGRybV92aWFfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRlJFRU1FTQkgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0ZSRUVNRU0sIGRybV92aWFfbWVtX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQUdQX0lOSVQJICBEUk1fSU9XUihEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9BR1BfSU5JVCwgZHJtX3ZpYV9hZ3BfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9GQl9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRkJfSU5JVCwgZHJtX3ZpYV9mYl90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX01BUF9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfTUFQX0lOSVQsIGRybV92aWFfaW5pdF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RFQ19GVVRFWCAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0RFQ19GVVRFWCwgZHJtX3ZpYV9mdXRleF90KQorI2RlZmluZSBEUk1fSU9DVExfVklBX0RNQV9JTklUCSAgRFJNX0lPV1IoRFJNX0NPTU1BTkRfQkFTRSArIERSTV9WSUFfRE1BX0lOSVQsIGRybV92aWFfZG1hX2luaXRfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9DTURCVUZGRVIJICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9DTURCVUZGRVIsIGRybV92aWFfY21kYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfRkxVU0gJICBEUk1fSU8oICBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9GTFVTSCkKKyNkZWZpbmUgRFJNX0lPQ1RMX1ZJQV9QQ0lDTUQJICBEUk1fSU9XKCBEUk1fQ09NTUFORF9CQVNFICsgRFJNX1ZJQV9QQ0lDTUQsIGRybV92aWFfY21kYnVmZmVyX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfQ01EQlVGX1NJWkUgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX0NNREJVRl9TSVpFLCBcCisJCQkJCSAgICBkcm1fdmlhX2NtZGJ1Zl9zaXplX3QpCisjZGVmaW5lIERSTV9JT0NUTF9WSUFfV0FJVF9JUlEgICAgRFJNX0lPV1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fVklBX1dBSVRfSVJRLCBkcm1fdmlhX2lycXdhaXRfdCkKKworLyogSW5kaWNlcyBpbnRvIGJ1Zi5TZXR1cCB3aGVyZSB2YXJpb3VzIGJpdHMgb2Ygc3RhdGUgYXJlIG1pcnJvcmVkIHBlcgorICogY29udGV4dCBhbmQgcGVyIGJ1ZmZlci4gIFRoZXNlIGNhbiBiZSBmaXJlZCBhdCB0aGUgY2FyZCBhcyBhIHVuaXQsCisgKiBvciBpbiBhIHBpZWNld2lzZSBmYXNoaW9uIGFzIHJlcXVpcmVkLgorICovCisKKyNkZWZpbmUgVklBX1RFWF9TRVRVUF9TSVpFIDgKKworLyogRmxhZ3MgZm9yIGNsZWFyIGlvY3RsCisgKi8KKyNkZWZpbmUgVklBX0ZST05UICAgMHgxCisjZGVmaW5lIFZJQV9CQUNLICAgIDB4MgorI2RlZmluZSBWSUFfREVQVEggICAweDQKKyNkZWZpbmUgVklBX1NURU5DSUwgMHg4CisjZGVmaW5lIFZJREVPIDAKKyNkZWZpbmUgQUdQIDEKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBvZmZzZXQ7CisJdWludDMyX3Qgc2l6ZTsKK30gZHJtX3ZpYV9hZ3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBzaXplOworfSBkcm1fdmlhX2ZiX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBjb250ZXh0OworCXVpbnQzMl90IHR5cGU7CisJdWludDMyX3Qgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfSBkcm1fdmlhX21lbV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9pbml0IHsKKwllbnVtIHsKKwkJVklBX0lOSVRfTUFQID0gMHgwMSwKKwkJVklBX0NMRUFOVVBfTUFQID0gMHgwMgorCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgc2FyZWFfcHJpdl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmYl9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBtbWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFncEFkZHI7Cit9IGRybV92aWFfaW5pdF90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9mdXRleCB7CisJZW51bSB7CisJCVZJQV9GVVRFWF9XQUlUID0gMHgwMCwKKwkJVklBX0ZVVEVYX1dBS0UgPSAwWDAxCisJfSBmdW5jOworCXVpbnQzMl90IG1zOworCXVpbnQzMl90IGxvY2s7CisJdWludDMyX3QgdmFsOworfSBkcm1fdmlhX2Z1dGV4X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2RtYV9pbml0IHsKKwllbnVtIHsKKwkJVklBX0lOSVRfRE1BID0gMHgwMSwKKwkJVklBX0NMRUFOVVBfRE1BID0gMHgwMiwKKyAgICAgICAgICAgICAgICBWSUFfRE1BX0lOSVRJQUxJWkVEID0gMHgwMworCX0gZnVuYzsKKworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHJlZ19wYXVzZV9hZGRyOworfSBkcm1fdmlhX2RtYV9pbml0X3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX2NtZGJ1ZmZlciB7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKK30gZHJtX3ZpYV9jbWRidWZmZXJfdDsKKworLyogV2FybmluZzogSWYgeW91IGNoYW5nZSB0aGUgU0FSRUEgc3RydWN0dXJlIHlvdSBtdXN0IGNoYW5nZSB0aGUgWHNlcnZlcgorICogc3RydWN0dXJlIGFzIHdlbGwgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2RybV92aWFfdGV4X3JlZ2lvbiB7CisJdW5zaWduZWQgY2hhciBuZXh0LCBwcmV2OwkvKiBpbmRpY2VzIHRvIGZvcm0gYSBjaXJjdWxhciBMUlUgICovCisJdW5zaWduZWQgY2hhciBpblVzZTsJLyogb3duZWQgYnkgYSBjbGllbnQsIG9yIGZyZWU/ICovCisJaW50IGFnZTsJCS8qIHRyYWNrZWQgYnkgY2xpZW50cyB0byB1cGRhdGUgbG9jYWwgTFJVJ3MgKi8KK30gZHJtX3ZpYV90ZXhfcmVnaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9kcm1fdmlhX3NhcmVhIHsKKwl1bnNpZ25lZCBpbnQgZGlydHk7CisJdW5zaWduZWQgaW50IG5ib3g7CisJZHJtX2NsaXBfcmVjdF90IGJveGVzW1ZJQV9OUl9TQVJFQV9DTElQUkVDVFNdOworCWRybV92aWFfdGV4X3JlZ2lvbl90IHRleExpc3RbVklBX05SX1RFWF9SRUdJT05TICsgMV07CisJaW50IHRleEFnZTsJCS8qIGxhc3QgdGltZSB0ZXh0dXJlIHdhcyB1cGxvYWRlZCAqLworCWludCBjdHhPd25lcjsJCS8qIGxhc3QgY29udGV4dCB0byB1cGxvYWQgc3RhdGUgKi8KKwlpbnQgdmVydGV4UHJpbTsKKworCS8qCisJICogQmVsb3cgaXMgZm9yIFh2TUMuCisJICogV2Ugd2FudCB0aGUgbG9jayBpbnRlZ2VycyBhbG9uZSBvbiwgYW5kIGFsaWduZWQgdG8sIGEgY2FjaGUgbGluZS4KKwkgKiBUaGVyZWZvcmUgdGhpcyBzb21ld2hhdCBzdHJhbmdlIGNvbnN0cnVjdC4KKwkgKi8KKworCWNoYXIgWHZNQ0xvY2tBcmVhW1ZJQV9NQVhfQ0FDSEVMSU5FX1NJWkUgKiAoVklBX05SX1hWTUNfTE9DS1MgKyAxKV07CisKKwl1bnNpZ25lZCBpbnQgWHZNQ0Rpc3BsYXlpbmdbVklBX05SX1hWTUNfUE9SVFNdOworCXVuc2lnbmVkIGludCBYdk1DU3ViUGljT25bVklBX05SX1hWTUNfUE9SVFNdOworCXVuc2lnbmVkIGludCBYdk1DQ3R4Tm9HcmFiYmVkOwkvKiBMYXN0IGNvbnRleHQgdG8gaG9sZCBkZWNvZGVyICovCisKK30gZHJtX3ZpYV9zYXJlYV90OworCit0eXBlZGVmIHN0cnVjdCBfZHJtX3ZpYV9jbWRidWZfc2l6ZSB7CisJZW51bSB7CisJCVZJQV9DTURCVUZfU1BBQ0UgPSAweDAxLAorCQlWSUFfQ01EQlVGX0xBRyA9IDB4MDIKKwl9IGZ1bmM7CisJaW50IHdhaXQ7CisJdWludDMyX3Qgc2l6ZTsKK30gZHJtX3ZpYV9jbWRidWZfc2l6ZV90OworCit0eXBlZGVmIGVudW0geworCVZJQV9JUlFfQUJTT0xVVEUgPSAweDAsCisJVklBX0lSUV9SRUxBVElWRSA9IDB4MSwKKwlWSUFfSVJRX1NJR05BTCA9IDB4MTAwMDAwMDAsCisJVklBX0lSUV9GT1JDRV9TRVFVRU5DRSA9IDB4MjAwMDAwMDAKK30gdmlhX2lycV9zZXFfdHlwZV90OworCisjZGVmaW5lIFZJQV9JUlFfRkxBR1NfTUFTSyAweEYwMDAwMDAwCisKK3N0cnVjdCBkcm1fdmlhX3dhaXRfaXJxX3JlcXVlc3R7CisJdW5zaWduZWQgaXJxOworCXZpYV9pcnFfc2VxX3R5cGVfdCB0eXBlOworCXVpbnQzMl90IHNlcXVlbmNlOworCXVpbnQzMl90IHNpZ25hbDsKK307CisKK3R5cGVkZWYgdW5pb24gZHJtX3ZpYV9pcnF3YWl0IHsKKwlzdHJ1Y3QgZHJtX3ZpYV93YWl0X2lycV9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IGRybV93YWl0X3ZibGFua19yZXBseSByZXBseTsKK30gZHJtX3ZpYV9pcnF3YWl0X3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK2ludCB2aWFfZmJfaW5pdChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX21lbV9hbGxvYyhEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX21lbV9mcmVlKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfYWdwX2luaXQoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV9tYXBfaW5pdChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX2RlY29kZXJfZnV0ZXgoRFJNX0lPQ1RMX0FSR1MpOworaW50IHZpYV9kbWFfaW5pdChEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX2ZsdXNoX2lvY3RsKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfcGNpX2NtZGJ1ZmZlcihEUk1fSU9DVExfQVJHUyk7CitpbnQgdmlhX2NtZGJ1Zl9zaXplKERSTV9JT0NUTF9BUkdTKTsKK2ludCB2aWFfd2FpdF9pcnEoRFJNX0lPQ1RMX0FSR1MpOworCisjZW5kaWYKKyNlbmRpZgkJCQkvKiBfVklBX0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzVlZWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKworI2luY2x1ZGUgImRybV9wY2lpZHMuaCIKKworc3RhdGljIGludCBwb3N0aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBvbiBtaW5vciAlZDogJXNcbiIsCisJCSBEUklWRVJfTkFNRSwKKwkJIERSSVZFUl9NQUpPUiwKKwkJIERSSVZFUl9NSU5PUiwKKwkJIERSSVZFUl9QQVRDSExFVkVMLAorCQkgRFJJVkVSX0RBVEUsIGRldi0+cHJpbWFyeS5taW5vciwgcGNpX3ByZXR0eV9uYW1lKGRldi0+cGRldikKKwkgICAgKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZXJzaW9uKGRybV92ZXJzaW9uX3QgKiB2ZXJzaW9uKQoreworCWludCBsZW47CisKKwl2ZXJzaW9uLT52ZXJzaW9uX21ham9yID0gRFJJVkVSX01BSk9SOworCXZlcnNpb24tPnZlcnNpb25fbWlub3IgPSBEUklWRVJfTUlOT1I7CisJdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsID0gRFJJVkVSX1BBVENITEVWRUw7CisJRFJNX0NPUFkodmVyc2lvbi0+bmFtZSwgRFJJVkVSX05BTUUpOworCURSTV9DT1BZKHZlcnNpb24tPmRhdGUsIERSSVZFUl9EQVRFKTsKKwlEUk1fQ09QWSh2ZXJzaW9uLT5kZXNjLCBEUklWRVJfREVTQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lpZGxpc3RbXSA9IHsKKwl2aWFkcnZfUENJX0lEUworfTsKKworc3RhdGljIGRybV9pb2N0bF9kZXNjX3QgaW9jdGxzW10gPSB7CisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0FMTE9DTUVNKV0gPSB7dmlhX21lbV9hbGxvYywgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZSRUVNRU0pXSA9IHt2aWFfbWVtX2ZyZWUsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9BR1BfSU5JVCldID0ge3ZpYV9hZ3BfaW5pdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0ZCX0lOSVQpXSA9IHt2aWFfZmJfaW5pdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX01BUF9JTklUKV0gPSB7dmlhX21hcF9pbml0LCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfREVDX0ZVVEVYKV0gPSB7dmlhX2RlY29kZXJfZnV0ZXgsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9ETUFfSU5JVCldID0ge3ZpYV9kbWFfaW5pdCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX0NNREJVRkZFUildID0ge3ZpYV9jbWRidWZmZXIsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9GTFVTSCldID0ge3ZpYV9mbHVzaF9pb2N0bCwgMSwgMH0sCisJW0RSTV9JT0NUTF9OUihEUk1fVklBX1BDSUNNRCldID0ge3ZpYV9wY2lfY21kYnVmZmVyLCAxLCAwfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9WSUFfQ01EQlVGX1NJWkUpXSA9IHt2aWFfY21kYnVmX3NpemUsIDEsIDB9LAorCVtEUk1fSU9DVExfTlIoRFJNX1ZJQV9XQUlUX0lSUSldID0ge3ZpYV93YWl0X2lycSwgMSwgMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RyaXZlciBkcml2ZXIgPSB7CisJLmRyaXZlcl9mZWF0dXJlcyA9CisJICAgIERSSVZFUl9VU0VfQUdQIHwgRFJJVkVSX1VTRV9NVFJSIHwgRFJJVkVSX0hBVkVfSVJRIHwKKwkgICAgRFJJVkVSX0lSUV9TSEFSRUQgfCBEUklWRVJfSVJRX1ZCTCwKKwkuY29udGV4dF9jdG9yID0gdmlhX2luaXRfY29udGV4dCwKKwkuY29udGV4dF9kdG9yID0gdmlhX2ZpbmFsX2NvbnRleHQsCisJLnZibGFua193YWl0ID0gdmlhX2RyaXZlcl92Ymxhbmtfd2FpdCwKKwkuaXJxX3ByZWluc3RhbGwgPSB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsLAorCS5pcnFfcG9zdGluc3RhbGwgPSB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbCwKKwkuaXJxX3VuaW5zdGFsbCA9IHZpYV9kcml2ZXJfaXJxX3VuaW5zdGFsbCwKKwkuaXJxX2hhbmRsZXIgPSB2aWFfZHJpdmVyX2lycV9oYW5kbGVyLAorCS5kbWFfcXVpZXNjZW50ID0gdmlhX2RyaXZlcl9kbWFfcXVpZXNjZW50LAorCS5yZWNsYWltX2J1ZmZlcnMgPSBkcm1fY29yZV9yZWNsYWltX2J1ZmZlcnMsCisJLmdldF9tYXBfb2ZzID0gZHJtX2NvcmVfZ2V0X21hcF9vZnMsCisJLmdldF9yZWdfb2ZzID0gZHJtX2NvcmVfZ2V0X3JlZ19vZnMsCisJLnBvc3Rpbml0ID0gcG9zdGluaXQsCisJLnZlcnNpb24gPSB2ZXJzaW9uLAorCS5pb2N0bHMgPSBpb2N0bHMsCisJLm51bV9pb2N0bHMgPSBEUk1fQVJSQVlfU0laRShpb2N0bHMpLAorCS5mb3BzID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9wZW4gPSBkcm1fb3BlbiwKKwkJLnJlbGVhc2UgPSBkcm1fcmVsZWFzZSwKKwkJLmlvY3RsID0gZHJtX2lvY3RsLAorCQkubW1hcCA9IGRybV9tbWFwLAorCQkucG9sbCA9IGRybV9wb2xsLAorCQkuZmFzeW5jID0gZHJtX2Zhc3luYywKKwkJfSwKKwkucGNpX2RyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkJLmlkX3RhYmxlID0gcGNpaWRsaXN0LAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZpYV9pbml0KHZvaWQpCit7CisJdmlhX2luaXRfY29tbWFuZF92ZXJpZmllcigpOworCXJldHVybiBkcm1faW5pdCgmZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZpYV9leGl0KHZvaWQpCit7CisJZHJtX2V4aXQoJmRyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHZpYV9pbml0KTsKK21vZHVsZV9leGl0KHZpYV9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWFhOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHJ2LmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9WSUFfRFJWX0hfCisjZGVmaW5lIF9WSUFfRFJWX0hfCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiVklBIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkidmlhIgorI2RlZmluZSBEUklWRVJfREVTQwkJIlZJQSBVbmljaHJvbWUgLyBQcm8iCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNTA1MjMiCisKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkyCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJNgorI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkzCisKKyNpbmNsdWRlICJ2aWFfdmVyaWZpZXIuaCIKKworI2RlZmluZSBWSUFfUENJX0JVRl9TSVpFIDYwMDAwCisjZGVmaW5lIFZJQV9GSVJFX0JVRl9TSVpFICAxMDI0CisjZGVmaW5lIFZJQV9OVU1fSVJRUyAyCisKKworCit0eXBlZGVmIHN0cnVjdCBkcm1fdmlhX3JpbmdfYnVmZmVyIHsKKwlkcm1fbWFwX3QgbWFwOworCWNoYXIgKnZpcnR1YWxfc3RhcnQ7Cit9IGRybV92aWFfcmluZ19idWZmZXJfdDsKKwordHlwZWRlZiB1aW50MzJfdCBtYXNrYXJyYXlfdFs1XTsKKwordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9pcnEgeworCWF0b21pY190IGlycV9yZWNlaXZlZDsKKwl1aW50MzJfdCBwZW5kaW5nX21hc2s7CisJdWludDMyX3QgZW5hYmxlX21hc2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaXJxX3F1ZXVlOworfSBkcm1fdmlhX2lycV90OworCQordHlwZWRlZiBzdHJ1Y3QgZHJtX3ZpYV9wcml2YXRlIHsKKwlkcm1fdmlhX3NhcmVhX3QgKnNhcmVhX3ByaXY7CisJZHJtX21hcF90ICpzYXJlYTsKKwlkcm1fbWFwX3QgKmZiOworCWRybV9tYXBfdCAqbW1pbzsKKwl1bnNpZ25lZCBsb25nIGFncEFkZHI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgZGVjb2Rlcl9xdWV1ZVtWSUFfTlJfWFZNQ19MT0NLU107CisJY2hhciAqZG1hX3B0cjsKKwl1bnNpZ25lZCBpbnQgZG1hX2xvdzsKKwl1bnNpZ25lZCBpbnQgZG1hX2hpZ2g7CisJdW5zaWduZWQgaW50IGRtYV9vZmZzZXQ7CisJdWludDMyX3QgZG1hX3dyYXA7CisJdm9sYXRpbGUgdWludDMyX3QgKmxhc3RfcGF1c2VfcHRyOworCXZvbGF0aWxlIHVpbnQzMl90ICpod19hZGRyX3B0cjsKKwlkcm1fdmlhX3JpbmdfYnVmZmVyX3QgcmluZzsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgbGFzdF92Ymxhbms7CisgICAgICAgIGludCBsYXN0X3ZibGFua192YWxpZDsKKyAgICAgICAgdW5zaWduZWQgdXNlY19wZXJfdmJsYW5rOworCWRybV92aWFfc3RhdGVfdCBoY19zdGF0ZTsKKwljaGFyIHBjaV9idWZbVklBX1BDSV9CVUZfU0laRV07CisJY29uc3QgdWludDMyX3QgKmZpcmVfb2Zmc2V0c1tWSUFfRklSRV9CVUZfU0laRV07CisJdWludDMyX3QgbnVtX2ZpcmVfb2Zmc2V0czsKKwlpbnQgcHJvX2dyb3VwX2E7CisJZHJtX3ZpYV9pcnFfdCB2aWFfaXJxc1tWSUFfTlVNX0lSUVNdOworCXVuc2lnbmVkIG51bV9pcnFzOworCW1hc2thcnJheV90ICppcnFfbWFza3M7CisJdWludDMyX3QgaXJxX2VuYWJsZV9tYXNrOyAKKwl1aW50MzJfdCBpcnFfcGVuZGluZ19tYXNrOwkKK30gZHJtX3ZpYV9wcml2YXRlX3Q7CisKKy8qIFZJQSBNTUlPIHJlZ2lzdGVyIGFjY2VzcyAqLworI2RlZmluZSBWSUFfQkFTRSAoKGRldl9wcml2LT5tbWlvKSkKKworI2RlZmluZSBWSUFfUkVBRChyZWcpCQlEUk1fUkVBRDMyKFZJQV9CQVNFLCByZWcpCisjZGVmaW5lIFZJQV9XUklURShyZWcsdmFsKQlEUk1fV1JJVEUzMihWSUFfQkFTRSwgcmVnLCB2YWwpCisjZGVmaW5lIFZJQV9SRUFEOChyZWcpCQlEUk1fUkVBRDgoVklBX0JBU0UsIHJlZykKKyNkZWZpbmUgVklBX1dSSVRFOChyZWcsdmFsKQlEUk1fV1JJVEU4KFZJQV9CQVNFLCByZWcsIHZhbCkKKworZXh0ZXJuIGludCB2aWFfaW5pdF9jb250ZXh0KGRybV9kZXZpY2VfdCAqIGRldiwgaW50IGNvbnRleHQpOworZXh0ZXJuIGludCB2aWFfZmluYWxfY29udGV4dChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBjb250ZXh0KTsKKworZXh0ZXJuIGludCB2aWFfZG9fY2xlYW51cF9tYXAoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiBpbnQgdmlhX21hcF9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSk7CisKK2V4dGVybiBpcnFyZXR1cm5fdCB2aWFfZHJpdmVyX2lycV9oYW5kbGVyKERSTV9JUlFfQVJHUyk7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOworZXh0ZXJuIHZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CisKK2V4dGVybiBpbnQgdmlhX2RtYV9jbGVhbnVwKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gdm9pZCB2aWFfaW5pdF9jb21tYW5kX3ZlcmlmaWVyKHZvaWQpOworZXh0ZXJuIGludCB2aWFfZHJpdmVyX2RtYV9xdWllc2NlbnQoZHJtX2RldmljZV90ICogZGV2KTsKK2V4dGVybiB2b2lkIHZpYV9pbml0X2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCB2aWFfY2xlYW51cF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgdmlhX3JlbGVhc2VfZnV0ZXgoZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCBpbnQgY29udGV4dCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9kcy5jIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYzZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycCwgSW5jLiwgSHNpbkNodSwgVGFpd2FuLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInZpYV9kcy5oIgorZXh0ZXJuIHVuc2lnbmVkIGludCBWSUFfREVCVUc7CisKK3NldF90ICp2aWFfc2V0SW5pdCh2b2lkKQoreworCWludCBpOworCXNldF90ICpzZXQ7CisJc2V0ID0gKHNldF90ICopIGRybV9hbGxvYyhzaXplb2Yoc2V0X3QpLCBEUk1fTUVNX0RSSVZFUik7CisJZm9yIChpID0gMDsgaSA8IFNFVF9TSVpFOyBpKyspIHsKKwkJc2V0LT5saXN0W2ldLmZyZWVfbmV4dCA9IGkgKyAxOworCQlzZXQtPmxpc3RbaV0uYWxsb2NfbmV4dCA9IC0xOworCX0KKwlzZXQtPmxpc3RbU0VUX1NJWkUgLSAxXS5mcmVlX25leHQgPSAtMTsKKwlzZXQtPmZyZWUgPSAwOworCXNldC0+YWxsb2MgPSAtMTsKKwlzZXQtPnRyYWNlID0gLTE7CisJcmV0dXJuIHNldDsKK30KKworaW50IHZpYV9zZXRBZGQoc2V0X3QgKiBzZXQsIElURU1fVFlQRSBpdGVtKQoreworCWludCBmcmVlID0gc2V0LT5mcmVlOworCWlmIChmcmVlICE9IC0xKSB7CisJCXNldC0+bGlzdFtmcmVlXS52YWwgPSBpdGVtOworCQlzZXQtPmZyZWUgPSBzZXQtPmxpc3RbZnJlZV0uZnJlZV9uZXh0OworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KKwlzZXQtPmxpc3RbZnJlZV0uYWxsb2NfbmV4dCA9IHNldC0+YWxsb2M7CisJc2V0LT5hbGxvYyA9IGZyZWU7CisJc2V0LT5saXN0W2ZyZWVdLmZyZWVfbmV4dCA9IC0xOworCXJldHVybiAxOworfQorCitpbnQgdmlhX3NldERlbChzZXRfdCAqIHNldCwgSVRFTV9UWVBFIGl0ZW0pCit7CisJaW50IGFsbG9jID0gc2V0LT5hbGxvYzsKKwlpbnQgcHJldiA9IC0xOworCisJd2hpbGUgKGFsbG9jICE9IC0xKSB7CisJCWlmIChzZXQtPmxpc3RbYWxsb2NdLnZhbCA9PSBpdGVtKSB7CisJCQlpZiAocHJldiAhPSAtMSkKKwkJCQlzZXQtPmxpc3RbcHJldl0uYWxsb2NfbmV4dCA9CisJCQkJICAgIHNldC0+bGlzdFthbGxvY10uYWxsb2NfbmV4dDsKKwkJCWVsc2UKKwkJCQlzZXQtPmFsbG9jID0gc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0OworCQkJYnJlYWs7CisJCX0KKwkJcHJldiA9IGFsbG9jOworCQlhbGxvYyA9IHNldC0+bGlzdFthbGxvY10uYWxsb2NfbmV4dDsKKwl9CisKKwlpZiAoYWxsb2MgPT0gLTEpCisJCXJldHVybiAwOworCisJc2V0LT5saXN0W2FsbG9jXS5mcmVlX25leHQgPSBzZXQtPmZyZWU7CisJc2V0LT5mcmVlID0gYWxsb2M7CisJc2V0LT5saXN0W2FsbG9jXS5hbGxvY19uZXh0ID0gLTE7CisKKwlyZXR1cm4gMTsKK30KKworLyogc2V0Rmlyc3QgLT4gc2V0QWRkIC0+IHNldE5leHQgaXMgd3JvbmcgKi8KKworaW50IHZpYV9zZXRGaXJzdChzZXRfdCAqIHNldCwgSVRFTV9UWVBFICogaXRlbSkKK3sKKwlpZiAoc2V0LT5hbGxvYyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkqaXRlbSA9IHNldC0+bGlzdFtzZXQtPmFsbG9jXS52YWw7CisJc2V0LT50cmFjZSA9IHNldC0+bGlzdFtzZXQtPmFsbG9jXS5hbGxvY19uZXh0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCB2aWFfc2V0TmV4dChzZXRfdCAqIHNldCwgSVRFTV9UWVBFICogaXRlbSkKK3sKKwlpZiAoc2V0LT50cmFjZSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwkqaXRlbSA9IHNldC0+bGlzdFtzZXQtPnRyYWNlXS52YWw7CisJc2V0LT50cmFjZSA9IHNldC0+bGlzdFtzZXQtPnRyYWNlXS5hbGxvY19uZXh0OworCisJcmV0dXJuIDE7Cit9CisKK2ludCB2aWFfc2V0RGVzdHJveShzZXRfdCAqIHNldCkKK3sKKwlkcm1fZnJlZShzZXQsIHNpemVvZihzZXRfdCksIERSTV9NRU1fRFJJVkVSKTsKKworCXJldHVybiAxOworfQorCisjZGVmaW5lIElTRlJFRShicHRyKSAoKGJwdHIpLT5mcmVlKQorCisjZGVmaW5lIGZwcmludGYoZm10LCBhcmcuLi4pIGRve313aGlsZSgwKQorCittZW1IZWFwX3QgKnZpYV9tbUluaXQoaW50IG9mcywgaW50IHNpemUpCit7CisJUE1lbUJsb2NrIGJsb2NrczsKKworCWlmIChzaXplIDw9IDApCisJCXJldHVybiAwOworCisJYmxvY2tzID0gKFRNZW1CbG9jayAqKSBkcm1fY2FsbG9jKDEsIHNpemVvZihUTWVtQmxvY2spLCBEUk1fTUVNX0RSSVZFUik7CisKKwlpZiAoYmxvY2tzKSB7CisJCWJsb2Nrcy0+b2ZzID0gb2ZzOworCQlibG9ja3MtPnNpemUgPSBzaXplOworCQlibG9ja3MtPmZyZWUgPSAxOworCQlyZXR1cm4gKG1lbUhlYXBfdCAqKSBibG9ja3M7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgVE1lbUJsb2NrICpTbGljZUJsb2NrKFRNZW1CbG9jayAqIHAsCisJCQkgICAgIGludCBzdGFydG9mcywgaW50IHNpemUsCisJCQkgICAgIGludCByZXNlcnZlZCwgaW50IGFsaWdubWVudCkKK3sKKwlUTWVtQmxvY2sgKm5ld2Jsb2NrOworCisJLyogYnJlYWsgbGVmdCAqLworCWlmIChzdGFydG9mcyA+IHAtPm9mcykgeworCQluZXdibG9jayA9CisJCSAgICAoVE1lbUJsb2NrICopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksCisJCQkJCSAgICAgRFJNX01FTV9EUklWRVIpOworCQluZXdibG9jay0+b2ZzID0gc3RhcnRvZnM7CisJCW5ld2Jsb2NrLT5zaXplID0gcC0+c2l6ZSAtIChzdGFydG9mcyAtIHAtPm9mcyk7CisJCW5ld2Jsb2NrLT5mcmVlID0gMTsKKwkJbmV3YmxvY2stPm5leHQgPSBwLT5uZXh0OworCQlwLT5zaXplIC09IG5ld2Jsb2NrLT5zaXplOworCQlwLT5uZXh0ID0gbmV3YmxvY2s7CisJCXAgPSBuZXdibG9jazsKKwl9CisKKwkvKiBicmVhayByaWdodCAqLworCWlmIChzaXplIDwgcC0+c2l6ZSkgeworCQluZXdibG9jayA9CisJCSAgICAoVE1lbUJsb2NrICopIGRybV9jYWxsb2MoMSwgc2l6ZW9mKFRNZW1CbG9jayksCisJCQkJCSAgICAgRFJNX01FTV9EUklWRVIpOworCQluZXdibG9jay0+b2ZzID0gc3RhcnRvZnMgKyBzaXplOworCQluZXdibG9jay0+c2l6ZSA9IHAtPnNpemUgLSBzaXplOworCQluZXdibG9jay0+ZnJlZSA9IDE7CisJCW5ld2Jsb2NrLT5uZXh0ID0gcC0+bmV4dDsKKwkJcC0+c2l6ZSA9IHNpemU7CisJCXAtPm5leHQgPSBuZXdibG9jazsKKwl9CisKKwkvKiBwID0gbWlkZGxlIGJsb2NrICovCisJcC0+YWxpZ24gPSBhbGlnbm1lbnQ7CisJcC0+ZnJlZSA9IDA7CisJcC0+cmVzZXJ2ZWQgPSByZXNlcnZlZDsKKwlyZXR1cm4gcDsKK30KKworUE1lbUJsb2NrIHZpYV9tbUFsbG9jTWVtKG1lbUhlYXBfdCAqIGhlYXAsIGludCBzaXplLCBpbnQgYWxpZ24yLAorCQkJIGludCBzdGFydFNlYXJjaCkKK3sKKwlpbnQgbWFzaywgc3RhcnRvZnMsIGVuZG9mczsKKwlUTWVtQmxvY2sgKnA7CisKKwlpZiAoIWhlYXAgfHwgYWxpZ24yIDwgMCB8fCBzaXplIDw9IDApCisJCXJldHVybiBOVUxMOworCisJbWFzayA9ICgxIDw8IGFsaWduMikgLSAxOworCXN0YXJ0b2ZzID0gMDsKKwlwID0gKFRNZW1CbG9jayAqKSBoZWFwOworCisJd2hpbGUgKHApIHsKKwkJaWYgKElTRlJFRShwKSkgeworCQkJc3RhcnRvZnMgPSAocC0+b2ZzICsgbWFzaykgJiB+bWFzazsKKworCQkJaWYgKHN0YXJ0b2ZzIDwgc3RhcnRTZWFyY2gpCisJCQkJc3RhcnRvZnMgPSBzdGFydFNlYXJjaDsKKworCQkJZW5kb2ZzID0gc3RhcnRvZnMgKyBzaXplOworCisJCQlpZiAoZW5kb2ZzIDw9IChwLT5vZnMgKyBwLT5zaXplKSkKKwkJCQlicmVhazsKKwkJfQorCisJCXAgPSBwLT5uZXh0OworCX0KKworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwID0gU2xpY2VCbG9jayhwLCBzdGFydG9mcywgc2l6ZSwgMCwgbWFzayArIDEpOworCXAtPmhlYXAgPSBoZWFwOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBKb2luMkJsb2NrcyhUTWVtQmxvY2sgKiBwKQoreworCWlmIChwLT5mcmVlICYmIHAtPm5leHQgJiYgcC0+bmV4dC0+ZnJlZSkgeworCQlUTWVtQmxvY2sgKnEgPSBwLT5uZXh0OworCQlwLT5zaXplICs9IHEtPnNpemU7CisJCXAtPm5leHQgPSBxLT5uZXh0OworCQlkcm1fZnJlZShxLCBzaXplb2YoVE1lbUJsb2NrKSwgRFJNX01FTV9EUklWRVIpOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdmlhX21tRnJlZU1lbShQTWVtQmxvY2sgYikKK3sKKwlUTWVtQmxvY2sgKnAsICpwcmV2OworCisJaWYgKCFiKQorCQlyZXR1cm4gMDsKKworCWlmICghYi0+aGVhcCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIm5vIGhlYXBcbiIpOworCisJCXJldHVybiAtMTsKKwl9CisKKwlwID0gYi0+aGVhcDsKKwlwcmV2ID0gTlVMTDsKKworCXdoaWxlIChwICYmIHAgIT0gYikgeworCQlwcmV2ID0gcDsKKwkJcCA9IHAtPm5leHQ7CisJfQorCisJaWYgKCFwIHx8IHAtPmZyZWUgfHwgcC0+cmVzZXJ2ZWQpIHsKKwkJaWYgKCFwKQorCQkJZnByaW50ZihzdGRlcnIsICJibG9jayBub3QgZm91bmQgaW4gaGVhcFxuIik7CisJCWVsc2UgaWYgKHAtPmZyZWUpCisJCQlmcHJpbnRmKHN0ZGVyciwgImJsb2NrIGFscmVhZHkgZnJlZVxuIik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiYmxvY2sgaXMgcmVzZXJ2ZWRcbiIpOworCisJCXJldHVybiAtMTsKKwl9CisKKwlwLT5mcmVlID0gMTsKKwlKb2luMkJsb2NrcyhwKTsKKworCWlmIChwcmV2KQorCQlKb2luMkJsb2NrcyhwcmV2KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfZHMuaCBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5YzdmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2RzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAwIFNpbGljb24gSW50ZWdyYXRlZCBTeXN0ZW1zIENvcnAsIEluYy4sIEhzaW5DaHUsIFRhaXdhbi4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWSUEsIFMzIEdSQVBISUNTLCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfdmlhX2RzX2hfCisjZGVmaW5lIF92aWFfZHNfaF8KKworI2luY2x1ZGUgImRybVAuaCIKKworLyogU2V0IERhdGEgU3RydWN0dXJlICovCisjZGVmaW5lIFNFVF9TSVpFIDUwMDAKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBJVEVNX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlJVEVNX1RZUEUgdmFsOworCWludCBhbGxvY19uZXh0LCBmcmVlX25leHQ7Cit9IGxpc3RfaXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGFsbG9jOworCWludCBmcmVlOworCWludCB0cmFjZTsKKwlsaXN0X2l0ZW1fdCBsaXN0W1NFVF9TSVpFXTsKK30gc2V0X3Q7CisKK3NldF90ICp2aWFfc2V0SW5pdCh2b2lkKTsKK2ludCB2aWFfc2V0QWRkKHNldF90ICogc2V0LCBJVEVNX1RZUEUgaXRlbSk7CitpbnQgdmlhX3NldERlbChzZXRfdCAqIHNldCwgSVRFTV9UWVBFIGl0ZW0pOworaW50IHZpYV9zZXRGaXJzdChzZXRfdCAqIHNldCwgSVRFTV9UWVBFICogaXRlbSk7CitpbnQgdmlhX3NldE5leHQoc2V0X3QgKiBzZXQsIElURU1fVFlQRSAqIGl0ZW0pOworaW50IHZpYV9zZXREZXN0cm95KHNldF90ICogc2V0KTsKKworI2VuZGlmCisKKyNpZm5kZWYgTU1fSU5DCisjZGVmaW5lIE1NX0lOQworCitzdHJ1Y3QgbWVtX2Jsb2NrX3QgeworCXN0cnVjdCBtZW1fYmxvY2tfdCAqbmV4dDsKKwlzdHJ1Y3QgbWVtX2Jsb2NrX3QgKmhlYXA7CisJaW50IG9mcywgc2l6ZTsKKwlpbnQgYWxpZ247CisJaW50IGZyZWU6MTsKKwlpbnQgcmVzZXJ2ZWQ6MTsKK307Cit0eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2tfdCBUTWVtQmxvY2s7Cit0eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2tfdCAqUE1lbUJsb2NrOworCisvKiBhIGhlYXAgaXMganVzdCB0aGUgZmlyc3QgYmxvY2sgaW4gYSBjaGFpbiAqLwordHlwZWRlZiBzdHJ1Y3QgbWVtX2Jsb2NrX3QgbWVtSGVhcF90OworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbW1CbG9ja1NpemUoUE1lbUJsb2NrIGIpCit7CisJcmV0dXJuIGItPnNpemU7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBtbU9mZnNldChQTWVtQmxvY2sgYikKK3sKKwlyZXR1cm4gYi0+b2ZzOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIG1tTWFya1Jlc2VydmVkKFBNZW1CbG9jayBiKQoreworCWItPnJlc2VydmVkID0gMTsKK30KKworLyoKKyAqIGlucHV0OiB0b3RhbCBzaXplIGluIGJ5dGVzCisgKiByZXR1cm46IGEgaGVhcCBwb2ludGVyIGlmIE9LLCBOVUxMIGlmIGVycm9yCisgKi8KK21lbUhlYXBfdCAqdmlhX21tSW5pdChpbnQgb2ZzLCBpbnQgc2l6ZSk7CisKK1BNZW1CbG9jayB2aWFfbW1BbGxvY01lbShtZW1IZWFwX3QgKiBoZWFwLCBpbnQgc2l6ZSwgaW50IGFsaWduMiwKKwkJCSBpbnQgc3RhcnRTZWFyY2gpOworCisvKgorICogRnJlZSBibG9jayBzdGFydHMgYXQgb2Zmc2V0CisgKiBpbnB1dDogcG9pbnRlciB0byBhIGJsb2NrCisgKiByZXR1cm46IDAgaWYgT0ssIC0xIGlmIGVycm9yCisgKi8KK2ludCB2aWFfbW1GcmVlTWVtKFBNZW1CbG9jayBiKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDI3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9pcnEuYwpAQCAtMCwwICsxLDMzOSBAQAorLyogdmlhX2lycS5jCisgKgorICogQ29weXJpZ2h0IDIwMDQgQkVBTSBMdGQuCisgKiBDb3B5cmlnaHQgMjAwMiBUdW5nc3RlbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIEhlbGxzdHJvbS4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIEJFQU0gTFRELCBUVU5HU1RFTiBHUkFQSElDUyAgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCisgKiBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6CisgKiAgICBUZXJyeSBCYXJuYWJ5IDx0ZXJyeTFAYmVhbS5sdGQudWs+CisgKiAgICBLZWl0aCBXaGl0d2VsbCA8a2VpdGhAdHVuZ3N0ZW5ncmFwaGljcy5jb20+CisgKiAgICBUaG9tYXMgSGVsbHN0cm9tIDx1bmljaHJvbWVAc2hpcG1haWwub3JnPgorICoKKyAqIFRoaXMgY29kZSBwcm92aWRlcyBzdGFuZGFyZCBEUk0gYWNjZXNzIHRvIHRoZSBWaWEgVW5pY2hyb21lIC8gUHJvIFZlcnRpY2FsIGJsYW5rCisgKiBpbnRlcnJ1cHQsIGFzIHdlbGwgYXMgYW4gaW5mcmFzdHJ1Y3R1cmUgdG8gaGFuZGxlIG90aGVyIGludGVycnVwdHMgb2YgdGhlIGNoaXAuCisgKiBUaGUgcmVmcmVzaCByYXRlIGlzIGFsc28gY2FsY3VsYXRlZCBmb3IgdmlkZW8gcGxheWJhY2sgc3luYyBwdXJwb3Nlcy4KKyAqLworCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgImRybS5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisKKyNkZWZpbmUgVklBX1JFR19JTlRFUlJVUFQgICAgICAgMHgyMDAKKworLyogVklBX1JFR19JTlRFUlJVUFQgKi8KKyNkZWZpbmUgVklBX0lSUV9HTE9CQUwgICAgICAgICAgKDEgPDwgMzEpCisjZGVmaW5lIFZJQV9JUlFfVkJMQU5LX0VOQUJMRSAgICgxIDw8IDE5KQorI2RlZmluZSBWSUFfSVJRX1ZCTEFOS19QRU5ESU5HICAoMSA8PCAzKQorI2RlZmluZSBWSUFfSVJRX0hRVjBfRU5BQkxFICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgVklBX0lSUV9IUVYxX0VOQUJMRSAgICAgKDEgPDwgMjUpCisjZGVmaW5lIFZJQV9JUlFfSFFWMF9QRU5ESU5HICAgICgxIDw8IDkpCisjZGVmaW5lIFZJQV9JUlFfSFFWMV9QRU5ESU5HICAgICgxIDw8IDEwKQorCisvKgorICogRGV2aWNlLXNwZWNpZmljIElSUXMgZ28gaGVyZS4gVGhpcyB0eXBlIG1pZ2h0IG5lZWQgdG8gYmUgZXh0ZW5kZWQgd2l0aAorICogdGhlIHJlZ2lzdGVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBJUlEgY29udHJvbCByZWdpc3RlcnMuCisgKiBDdXJyZW50bHkgd2UgYWN0aXZhdGUgdGhlIEhRViBpbnRlcnJ1cHRzIG9mICBVbmljaHJvbWUgUHJvIGdyb3VwIEEuIAorICovCisKK3N0YXRpYyBtYXNrYXJyYXlfdCB2aWFfcHJvX2dyb3VwX2FfaXJxc1tdID0geworCXtWSUFfSVJRX0hRVjBfRU5BQkxFLCBWSUFfSVJRX0hRVjBfUEVORElORywgMHgwMDAwMDNEMCwgMHgwMDAwODAxMCwgMHgwMDAwMDAwMCB9LAorCXtWSUFfSVJRX0hRVjFfRU5BQkxFLCBWSUFfSVJRX0hRVjFfUEVORElORywgMHgwMDAwMTNEMCwgMHgwMDAwODAxMCwgMHgwMDAwMDAwMCB9fTsKK3N0YXRpYyBpbnQgdmlhX251bV9wcm9fZ3JvdXBfYSA9IHNpemVvZih2aWFfcHJvX2dyb3VwX2FfaXJxcykvc2l6ZW9mKG1hc2thcnJheV90KTsKKworc3RhdGljIG1hc2thcnJheV90IHZpYV91bmljaHJvbWVfaXJxc1tdID0ge307CitzdGF0aWMgaW50IHZpYV9udW1fdW5pY2hyb21lID0gc2l6ZW9mKHZpYV91bmljaHJvbWVfaXJxcykvc2l6ZW9mKG1hc2thcnJheV90KTsKKworCitzdGF0aWMgdW5zaWduZWQgdGltZV9kaWZmKHN0cnVjdCB0aW1ldmFsICpub3csc3RydWN0IHRpbWV2YWwgKnRoZW4pIAoreworICAgIHJldHVybiAobm93LT50dl91c2VjID49IHRoZW4tPnR2X3VzZWMpID8KKyAgICAgICAgbm93LT50dl91c2VjIC0gdGhlbi0+dHZfdXNlYyA6CisgICAgICAgIDEwMDAwMDAgLSAodGhlbi0+dHZfdXNlYyAtIG5vdy0+dHZfdXNlYyk7Cit9CisKK2lycXJldHVybl90IHZpYV9kcml2ZXJfaXJxX2hhbmRsZXIoRFJNX0lSUV9BUkdTKQoreworCWRybV9kZXZpY2VfdCAqZGV2ID0gKGRybV9kZXZpY2VfdCAqKSBhcmc7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHN0YXR1czsKKwlpbnQgaGFuZGxlZCA9IDA7CisJc3RydWN0IHRpbWV2YWwgY3VyX3ZibGFuazsKKwlkcm1fdmlhX2lycV90ICpjdXJfaXJxID0gZGV2X3ByaXYtPnZpYV9pcnFzOworCWludCBpOworCisJc3RhdHVzID0gVklBX1JFQUQoVklBX1JFR19JTlRFUlJVUFQpOworCWlmIChzdGF0dXMgJiBWSUFfSVJRX1ZCTEFOS19QRU5ESU5HKSB7CisJCWF0b21pY19pbmMoJmRldi0+dmJsX3JlY2VpdmVkKTsKKyAgICAgICAgICAgICAgICBpZiAoIShhdG9taWNfcmVhZCgmZGV2LT52YmxfcmVjZWl2ZWQpICYgMHgwRikpIHsKKwkJCWRvX2dldHRpbWVvZmRheSgmY3VyX3ZibGFuayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV2X3ByaXYtPmxhc3RfdmJsYW5rX3ZhbGlkKSB7CisJCQkJZGV2X3ByaXYtPnVzZWNfcGVyX3ZibGFuayA9IAorCQkJCQl0aW1lX2RpZmYoICZjdXJfdmJsYW5rLCZkZXZfcHJpdi0+bGFzdF92YmxhbmspID4+IDQ7CisJCQl9CisJCQlkZXZfcHJpdi0+bGFzdF92YmxhbmsgPSBjdXJfdmJsYW5rOworCQkJZGV2X3ByaXYtPmxhc3RfdmJsYW5rX3ZhbGlkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEoYXRvbWljX3JlYWQoJmRldi0+dmJsX3JlY2VpdmVkKSAmIDB4RkYpKSB7CisJCQlEUk1fREVCVUcoIlVTIHBlciB2YmxhbmsgaXM6ICV1XG4iLAorCQkJCWRldl9wcml2LT51c2VjX3Blcl92YmxhbmspOworCQl9CisJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKKwkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoZGV2KTsKKwkJaGFuZGxlZCA9IDE7CisJfQorCQorCisJZm9yIChpPTA7IGk8ZGV2X3ByaXYtPm51bV9pcnFzOyArK2kpIHsKKwkJaWYgKHN0YXR1cyAmIGN1cl9pcnEtPnBlbmRpbmdfbWFzaykgeworCQkJYXRvbWljX2luYyggJmN1cl9pcnEtPmlycV9yZWNlaXZlZCApOworCQkJRFJNX1dBS0VVUCggJmN1cl9pcnEtPmlycV9xdWV1ZSApOworCQkJaGFuZGxlZCA9IDE7CisJCX0KKwkJY3VyX2lycSsrOworCX0KKwkKKwkvKiBBY2tub3dsZWdlIGludGVycnVwdHMgKi8KKwlWSUFfV1JJVEUoVklBX1JFR19JTlRFUlJVUFQsIHN0YXR1cyk7CisKKworCWlmIChoYW5kbGVkKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJZWxzZQorCQlyZXR1cm4gSVJRX05PTkU7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdmlhZHJ2X2Fja25vd2xlZGdlX2lycXMoZHJtX3ZpYV9wcml2YXRlX3QgKiBkZXZfcHJpdikKK3sKKwl1MzIgc3RhdHVzOworCisJaWYgKGRldl9wcml2KSB7CisJCS8qIEFja25vd2xlZ2UgaW50ZXJydXB0cyAqLworCQlzdGF0dXMgPSBWSUFfUkVBRChWSUFfUkVHX0lOVEVSUlVQVCk7CisJCVZJQV9XUklURShWSUFfUkVHX0lOVEVSUlVQVCwgc3RhdHVzIHwgCisJCQkgIGRldl9wcml2LT5pcnFfcGVuZGluZ19tYXNrKTsKKwl9Cit9CisKK2ludCB2aWFfZHJpdmVyX3ZibGFua193YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY3VyX3ZibGFuazsKKwlpbnQgcmV0ID0gMDsKKworCURSTV9ERUJVRygidmlhZHJ2X3ZibGFua193YWl0XG4iKTsKKwlpZiAoIWRldl9wcml2KSB7CisJCURSTV9FUlJPUigiJXMgY2FsbGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZpYWRydl9hY2tub3dsZWRnZV9pcnFzKGRldl9wcml2KTsKKworCS8qIEFzc3VtZSB0aGF0IHRoZSB1c2VyIGhhcyBtaXNzZWQgdGhlIGN1cnJlbnQgc2VxdWVuY2UgbnVtYmVyCisJICogYnkgYWJvdXQgYSBkYXkgcmF0aGVyIHRoYW4gc2hlIHdhbnRzIHRvIHdhaXQgZm9yIHllYXJzCisJICogdXNpbmcgdmVydGljYWwgYmxhbmtzLi4uCisJICovCisKKwlEUk1fV0FJVF9PTihyZXQsIGRldi0+dmJsX3F1ZXVlLCAzICogRFJNX0haLAorCQkgICAgKCgoY3VyX3ZibGFuayA9IGF0b21pY19yZWFkKCZkZXYtPnZibF9yZWNlaXZlZCkpIC0KKwkJICAgICAgKnNlcXVlbmNlKSA8PSAoMSA8PCAyMykpKTsKKwkKKwkqc2VxdWVuY2UgPSBjdXJfdmJsYW5rOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgCit2aWFfZHJpdmVyX2lycV93YWl0KGRybV9kZXZpY2VfdCAqIGRldiwgdW5zaWduZWQgaW50IGlycSwgaW50IGZvcmNlX3NlcXVlbmNlLAorCQkgICAgdW5zaWduZWQgaW50ICpzZXF1ZW5jZSkKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY3VyX2lycV9zZXF1ZW5jZTsKKwlkcm1fdmlhX2lycV90ICpjdXJfaXJxID0gZGV2X3ByaXYtPnZpYV9pcnFzOworCWludCByZXQgPSAwOworCW1hc2thcnJheV90ICptYXNrcyA9IGRldl9wcml2LT5pcnFfbWFza3M7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWlmIChpcnEgPj0gZGV2X3ByaXYtPm51bV9pcnFzICkgeworCQlEUk1fRVJST1IoIiVzIFRyeWluZyB0byB3YWl0IG9uIHVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCQkKKwljdXJfaXJxICs9IGlycTsKKworCWlmIChtYXNrc1tpcnFdWzJdICYmICFmb3JjZV9zZXF1ZW5jZSkgeworCQlEUk1fV0FJVF9PTihyZXQsIGN1cl9pcnEtPmlycV9xdWV1ZSwgMyAqIERSTV9IWiwKKwkJCSAgICAoKFZJQV9SRUFEKG1hc2tzW2lycV1bMl0pICYgbWFza3NbaXJxXVszXSkgPT0gbWFza3NbaXJxXVs0XSkpOworCQljdXJfaXJxX3NlcXVlbmNlID0gYXRvbWljX3JlYWQoJmN1cl9pcnEtPmlycV9yZWNlaXZlZCk7CisJfSBlbHNlIHsKKwkJRFJNX1dBSVRfT04ocmV0LCBjdXJfaXJxLT5pcnFfcXVldWUsIDMgKiBEUk1fSFosCisJCQkgICAgKCgoY3VyX2lycV9zZXF1ZW5jZSA9IGF0b21pY19yZWFkKCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQpKSAtCisJCQkgICAgICAqc2VxdWVuY2UpIDw9ICgxIDw8IDIzKSkpOwkJCisJfQorCSpzZXF1ZW5jZSA9IGN1cl9pcnFfc2VxdWVuY2U7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogZHJtX2RtYS5oIGhvb2tzCisgKi8KKwordm9pZCB2aWFfZHJpdmVyX2lycV9wcmVpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgc3RhdHVzOworCWRybV92aWFfaXJxX3QgKmN1cl9pcnEgPSBkZXZfcHJpdi0+dmlhX2lycXM7CisJaW50IGk7CisKKwlEUk1fREVCVUcoImRyaXZlcl9pcnFfcHJlaW5zdGFsbDogZGV2X3ByaXY6ICVwXG4iLCBkZXZfcHJpdik7CisJaWYgKGRldl9wcml2KSB7CisKKwkJZGV2X3ByaXYtPmlycV9lbmFibGVfbWFzayA9IFZJQV9JUlFfVkJMQU5LX0VOQUJMRTsKKwkJZGV2X3ByaXYtPmlycV9wZW5kaW5nX21hc2sgPSBWSUFfSVJRX1ZCTEFOS19QRU5ESU5HOworCisJCWRldl9wcml2LT5pcnFfbWFza3MgPSAoZGV2X3ByaXYtPnByb19ncm91cF9hKSA/CisJCQl2aWFfcHJvX2dyb3VwX2FfaXJxcyA6IHZpYV91bmljaHJvbWVfaXJxczsKKwkJZGV2X3ByaXYtPm51bV9pcnFzID0gKGRldl9wcml2LT5wcm9fZ3JvdXBfYSkgPworCQkJdmlhX251bV9wcm9fZ3JvdXBfYSA6IHZpYV9udW1fdW5pY2hyb21lOworCQkKKwkJZm9yKGk9MDsgaSA8IGRldl9wcml2LT5udW1faXJxczsgKytpKSB7CisJCQlhdG9taWNfc2V0KCZjdXJfaXJxLT5pcnFfcmVjZWl2ZWQsIDApOworCQkJY3VyX2lycS0+ZW5hYmxlX21hc2sgPSBkZXZfcHJpdi0+aXJxX21hc2tzW2ldWzBdOyAKKwkJCWN1cl9pcnEtPnBlbmRpbmdfbWFzayA9IGRldl9wcml2LT5pcnFfbWFza3NbaV1bMV07CisJCQlEUk1fSU5JVF9XQUlUUVVFVUUoICZjdXJfaXJxLT5pcnFfcXVldWUgKTsKKwkJCWRldl9wcml2LT5pcnFfZW5hYmxlX21hc2sgfD0gY3VyX2lycS0+ZW5hYmxlX21hc2s7CisJCQlkZXZfcHJpdi0+aXJxX3BlbmRpbmdfbWFzayB8PSBjdXJfaXJxLT5wZW5kaW5nX21hc2s7CisJCQljdXJfaXJxKys7CisJCQkKKwkJCURSTV9ERUJVRygiSW5pdGlhbGl6aW5nIElSUSAlZFxuIiwgaSk7CisJCX0KKwkJCQorCSAgICAgICAgZGV2X3ByaXYtPmxhc3RfdmJsYW5rX3ZhbGlkID0gMDsKKworCQkvLyBDbGVhciBWU3luYyBpbnRlcnJ1cHQgcmVncworCQlzdGF0dXMgPSBWSUFfUkVBRChWSUFfUkVHX0lOVEVSUlVQVCk7CisJCVZJQV9XUklURShWSUFfUkVHX0lOVEVSUlVQVCwgc3RhdHVzICYgCisJCQkgIH4oZGV2X3ByaXYtPmlycV9lbmFibGVfbWFzaykpOworCQkKKwkJLyogQ2xlYXIgYml0cyBpZiB0aGV5J3JlIGFscmVhZHkgaGlnaCAqLworCQl2aWFkcnZfYWNrbm93bGVkZ2VfaXJxcyhkZXZfcHJpdik7CisJfQorfQorCit2b2lkIHZpYV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgc3RhdHVzOworCisJRFJNX0RFQlVHKCJ2aWFfZHJpdmVyX2lycV9wb3N0aW5zdGFsbFxuIik7CisJaWYgKGRldl9wcml2KSB7CisJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKKwkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgfCBWSUFfSVJRX0dMT0JBTAorCQkJICB8IGRldl9wcml2LT5pcnFfZW5hYmxlX21hc2spOworCisJCS8qIFNvbWUgbWFnaWMsIG9oIGZvciBzb21lIGRhdGEgc2hlZXRzICEgKi8KKworCQlWSUFfV1JJVEU4KDB4ODNkNCwgMHgxMSk7CisJCVZJQV9XUklURTgoMHg4M2Q1LCBWSUFfUkVBRDgoMHg4M2Q1KSB8IDB4MzApOworCQkKKwl9Cit9CisKK3ZvaWQgdmlhX2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldikKK3sKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1MzIgc3RhdHVzOworCisJRFJNX0RFQlVHKCJkcml2ZXJfaXJxX3VuaW5zdGFsbClcbiIpOworCWlmIChkZXZfcHJpdikgeworCisJCS8qIFNvbWUgbW9yZSBtYWdpYywgb2ggZm9yIHNvbWUgZGF0YSBzaGVldHMgISAqLworCisJCVZJQV9XUklURTgoMHg4M2Q0LCAweDExKTsKKwkJVklBX1dSSVRFOCgweDgzZDUsIFZJQV9SRUFEOCgweDgzZDUpICYgfjB4MzApOworCisJCXN0YXR1cyA9IFZJQV9SRUFEKFZJQV9SRUdfSU5URVJSVVBUKTsKKwkJVklBX1dSSVRFKFZJQV9SRUdfSU5URVJSVVBULCBzdGF0dXMgJiAKKwkJCSAgfihWSUFfSVJRX1ZCTEFOS19FTkFCTEUgfCBkZXZfcHJpdi0+aXJxX2VuYWJsZV9tYXNrKSk7CisJfQorfQorCitpbnQgdmlhX3dhaXRfaXJxKERSTV9JT0NUTF9BUkdTKQoreworCWRybV9maWxlX3QgKnByaXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZHJtX2RldmljZV90ICpkZXYgPSBwcml2LT5oZWFkLT5kZXY7CisJZHJtX3ZpYV9pcnF3YWl0X3QgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopZGF0YTsKKwlkcm1fdmlhX2lycXdhaXRfdCBpcnF3YWl0OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlpbnQgcmV0ID0gMDsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fdmlhX2lycV90ICpjdXJfaXJxID0gZGV2X3ByaXYtPnZpYV9pcnFzOworCWludCBmb3JjZV9zZXF1ZW5jZTsKKworCWlmICghZGV2LT5pcnEpCisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaXJxd2FpdCwgYXJncCwgc2l6ZW9mKGlycXdhaXQpKTsKKwlpZiAoaXJxd2FpdC5yZXF1ZXN0LmlycSA+PSBkZXZfcHJpdi0+bnVtX2lycXMpIHsKKwkJRFJNX0VSUk9SKCIlcyBUcnlpbmcgdG8gd2FpdCBvbiB1bmtub3duIGlycSAlZFxuIiwgX19GVU5DVElPTl9fLCAKKwkJCSAgaXJxd2FpdC5yZXF1ZXN0LmlycSk7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCisJY3VyX2lycSArPSBpcnF3YWl0LnJlcXVlc3QuaXJxOworCisJc3dpdGNoIChpcnF3YWl0LnJlcXVlc3QudHlwZSAmIH5WSUFfSVJRX0ZMQUdTX01BU0spIHsKKwljYXNlIFZJQV9JUlFfUkVMQVRJVkU6CisJCWlycXdhaXQucmVxdWVzdC5zZXF1ZW5jZSArPSBhdG9taWNfcmVhZCgmY3VyX2lycS0+aXJxX3JlY2VpdmVkKTsKKwkJaXJxd2FpdC5yZXF1ZXN0LnR5cGUgJj0gfl9EUk1fVkJMQU5LX1JFTEFUSVZFOworCWNhc2UgVklBX0lSUV9BQlNPTFVURToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlpZiAoaXJxd2FpdC5yZXF1ZXN0LnR5cGUgJiBWSUFfSVJRX1NJR05BTCkgeworCQlEUk1fRVJST1IoIiVzIFNpZ25hbHMgb24gVmlhIElSUXMgbm90IGltcGxlbWVudGVkIHlldC5cbiIsIAorCQkJICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWZvcmNlX3NlcXVlbmNlID0gKGlycXdhaXQucmVxdWVzdC50eXBlICYgVklBX0lSUV9GT1JDRV9TRVFVRU5DRSk7CisKKwlyZXQgPSB2aWFfZHJpdmVyX2lycV93YWl0KGRldiwgaXJxd2FpdC5yZXF1ZXN0LmlycSwgZm9yY2Vfc2VxdWVuY2UsCisJCQkJICAmaXJxd2FpdC5yZXF1ZXN0LnNlcXVlbmNlKTsKKwlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJaXJxd2FpdC5yZXBseS50dmFsX3NlYyA9IG5vdy50dl9zZWM7CisJaXJxd2FpdC5yZXBseS50dmFsX3VzZWMgPSBub3cudHZfdXNlYzsKKworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoYXJncCwgaXJxd2FpdCwgc2l6ZW9mKGlycXdhaXQpKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTgyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tYXAuYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk4LTIwMDMgVklBIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDEtMjAwMyBTMyBHcmFwaGljcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVklBLCBTMyBHUkFQSElDUywgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKworc3RhdGljIGludCB2aWFfZG9faW5pdF9tYXAoZHJtX2RldmljZV90ICogZGV2LCBkcm1fdmlhX2luaXRfdCAqIGluaXQpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2OworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWRldl9wcml2ID0gZHJtX2FsbG9jKHNpemVvZihkcm1fdmlhX3ByaXZhdGVfdCksIERSTV9NRU1fRFJJVkVSKTsKKwlpZiAoZGV2X3ByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZGV2X3ByaXYsIDAsIHNpemVvZihkcm1fdmlhX3ByaXZhdGVfdCkpOworCisJRFJNX0dFVFNBUkVBKCk7CisJaWYgKCFkZXZfcHJpdi0+c2FyZWEpIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBzYXJlYSFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJdmlhX2RvX2NsZWFudXBfbWFwKGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9wcml2LT5mYiA9IGRybV9jb3JlX2ZpbmRtYXAoZGV2LCBpbml0LT5mYl9vZmZzZXQpOworCWlmICghZGV2X3ByaXYtPmZiKSB7CisJCURSTV9FUlJPUigiY291bGQgbm90IGZpbmQgZnJhbWVidWZmZXIhXG4iKTsKKwkJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopZGV2X3ByaXY7CisJCXZpYV9kb19jbGVhbnVwX21hcChkZXYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X3ByaXYtPm1taW8gPSBkcm1fY29yZV9maW5kbWFwKGRldiwgaW5pdC0+bW1pb19vZmZzZXQpOworCWlmICghZGV2X3ByaXYtPm1taW8pIHsKKwkJRFJNX0VSUk9SKCJjb3VsZCBub3QgZmluZCBtbWlvIHJlZ2lvbiFcbiIpOworCQlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwkJdmlhX2RvX2NsZWFudXBfbWFwKGRldik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9wcml2LT5zYXJlYV9wcml2ID0KKwkgICAgKGRybV92aWFfc2FyZWFfdCAqKSAoKHU4ICopIGRldl9wcml2LT5zYXJlYS0+aGFuZGxlICsKKwkJCQkgaW5pdC0+c2FyZWFfcHJpdl9vZmZzZXQpOworCisJZGV2X3ByaXYtPmFncEFkZHIgPSBpbml0LT5hZ3BBZGRyOworCisJdmlhX2luaXRfZnV0ZXgoIGRldl9wcml2ICk7CisJZGV2X3ByaXYtPnByb19ncm91cF9hID0gKGRldi0+cGRldi0+ZGV2aWNlID09IDB4MzExOCk7CisKKwlkZXYtPmRldl9wcml2YXRlID0gKHZvaWQgKilkZXZfcHJpdjsKKwlyZXR1cm4gMDsKK30KKworaW50IHZpYV9kb19jbGVhbnVwX21hcChkcm1fZGV2aWNlX3QgKiBkZXYpCit7CisJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKKworCQlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJCXZpYV9kbWFfY2xlYW51cChkZXYpOworCisJCWRybV9mcmVlKGRldl9wcml2LCBzaXplb2YoZHJtX3ZpYV9wcml2YXRlX3QpLCBEUk1fTUVNX0RSSVZFUik7CisJCWRldi0+ZGV2X3ByaXZhdGUgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgdmlhX21hcF9pbml0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3ZpYV9pbml0X3QgaW5pdDsKKworCURSTV9ERUJVRygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5pdCwgKGRybV92aWFfaW5pdF90ICopIGRhdGEsIHNpemVvZihpbml0KSk7CisKKwlzd2l0Y2ggKGluaXQuZnVuYykgeworCWNhc2UgVklBX0lOSVRfTUFQOgorCQlyZXR1cm4gdmlhX2RvX2luaXRfbWFwKGRldiwgJmluaXQpOworCWNhc2UgVklBX0NMRUFOVVBfTUFQOgorCQlyZXR1cm4gdmlhX2RvX2NsZWFudXBfbWFwKGRldik7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfbW0uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyNzEyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiZHJtUC5oIgorI2luY2x1ZGUgInZpYV9kcm0uaCIKKyNpbmNsdWRlICJ2aWFfZHJ2LmgiCisjaW5jbHVkZSAidmlhX2RzLmgiCisjaW5jbHVkZSAidmlhX21tLmgiCisKKyNkZWZpbmUgTUFYX0NPTlRFWFQgMTAwCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgdXNlZDsKKwlpbnQgY29udGV4dDsKKwlzZXRfdCAqc2V0c1syXTsJCS8qIDAgZm9yIGZyYW1lIGJ1ZmZlciwgMSBmb3IgQUdQICwgMiBmb3IgU3lzdGVtICovCit9IHZpYV9jb250ZXh0X3Q7CisKK3N0YXRpYyB2aWFfY29udGV4dF90IGdsb2JhbF9wcHJpdltNQVhfQ09OVEVYVF07CisKK3N0YXRpYyBpbnQgdmlhX2FncF9hbGxvYyhkcm1fdmlhX21lbV90ICogbWVtKTsKK3N0YXRpYyBpbnQgdmlhX2FncF9mcmVlKGRybV92aWFfbWVtX3QgKiBtZW0pOworc3RhdGljIGludCB2aWFfZmJfYWxsb2MoZHJtX3ZpYV9tZW1fdCAqIG1lbSk7CitzdGF0aWMgaW50IHZpYV9mYl9mcmVlKGRybV92aWFfbWVtX3QgKiBtZW0pOworCitzdGF0aWMgaW50IGFkZF9hbGxvY19zZXQoaW50IGNvbnRleHQsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWludCBpLCByZXR2YWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUOyBpKyspIHsKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmIGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpIHsKKwkJCXJldHZhbCA9IHZpYV9zZXRBZGQoZ2xvYmFsX3Bwcml2W2ldLnNldHNbdHlwZV0sIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZGVsX2FsbG9jX3NldChpbnQgY29udGV4dCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGksIHJldHZhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmIGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpIHsKKwkJCXJldHZhbCA9IHZpYV9zZXREZWwoZ2xvYmFsX3Bwcml2W2ldLnNldHNbdHlwZV0sIHZhbCk7CisJCQlicmVhazsKKwkJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogYWdwIG1lbW9yeSBtYW5hZ2VtZW50ICovCitzdGF0aWMgbWVtSGVhcF90ICpBZ3BIZWFwID0gTlVMTDsKKworaW50IHZpYV9hZ3BfaW5pdChEUk1fSU9DVExfQVJHUykKK3sKKwlkcm1fdmlhX2FncF90IGFncDsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChhZ3AsIChkcm1fdmlhX2FncF90ICopIGRhdGEsIHNpemVvZihhZ3ApKTsKKworCUFncEhlYXAgPSB2aWFfbW1Jbml0KGFncC5vZmZzZXQsIGFncC5zaXplKTsKKworCURSTV9ERUJVRygib2Zmc2V0ID0gJWx1LCBzaXplID0gJWx1IiwgKHVuc2lnbmVkIGxvbmcpYWdwLm9mZnNldCwgKHVuc2lnbmVkIGxvbmcpYWdwLnNpemUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGZiIG1lbW9yeSBtYW5hZ2VtZW50ICovCitzdGF0aWMgbWVtSGVhcF90ICpGQkhlYXAgPSBOVUxMOworCitpbnQgdmlhX2ZiX2luaXQoRFJNX0lPQ1RMX0FSR1MpCit7CisJZHJtX3ZpYV9mYl90IGZiOworCisJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGZiLCAoZHJtX3ZpYV9mYl90ICopIGRhdGEsIHNpemVvZihmYikpOworCisJRkJIZWFwID0gdmlhX21tSW5pdChmYi5vZmZzZXQsIGZiLnNpemUpOworCisJRFJNX0RFQlVHKCJvZmZzZXQgPSAlbHUsIHNpemUgPSAlbHUiLCAodW5zaWduZWQgbG9uZylmYi5vZmZzZXQsICh1bnNpZ25lZCBsb25nKWZiLnNpemUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWFfaW5pdF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9DT05URVhUOyBpKyspCisJCWlmIChnbG9iYWxfcHByaXZbaV0udXNlZCAmJgorCQkgICAgKGdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID09IGNvbnRleHQpKQorCQkJYnJlYWs7CisKKwlpZiAoaSA+PSBNQVhfQ09OVEVYVCkgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykgeworCQkJaWYgKCFnbG9iYWxfcHByaXZbaV0udXNlZCkgeworCQkJCWdsb2JhbF9wcHJpdltpXS5jb250ZXh0ID0gY29udGV4dDsKKwkJCQlnbG9iYWxfcHByaXZbaV0udXNlZCA9IDE7CisJCQkJZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF0gPSB2aWFfc2V0SW5pdCgpOworCQkJCWdsb2JhbF9wcHJpdltpXS5zZXRzWzFdID0gdmlhX3NldEluaXQoKTsKKwkJCQlEUk1fREVCVUcoImluaXQgYWxsb2NhdGlvbiBzZXQsIHNvY2tldD0lZCwiCisJCQkJCSAgIiBjb250ZXh0ID0gJWRcbiIsIGksIGNvbnRleHQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKChpID49IE1BWF9DT05URVhUKSB8fCAoZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF0gPT0gTlVMTCkgfHwKKwkJICAgIChnbG9iYWxfcHByaXZbaV0uc2V0c1sxXSA9PSBOVUxMKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworaW50IHZpYV9maW5hbF9jb250ZXh0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjb250ZXh0KQorewkKKyAgICAgICAgaW50IGk7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGRldi0+ZGV2X3ByaXZhdGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTlRFWFQ7IGkrKykKKwkJaWYgKGdsb2JhbF9wcHJpdltpXS51c2VkICYmCisJCSAgICAoZ2xvYmFsX3Bwcml2W2ldLmNvbnRleHQgPT0gY29udGV4dCkpCisJCQlicmVhazsKKworCWlmIChpIDwgTUFYX0NPTlRFWFQpIHsKKwkJc2V0X3QgKnNldDsKKwkJSVRFTV9UWVBFIGl0ZW07CisJCWludCByZXR2YWw7CisKKwkJRFJNX0RFQlVHKCJmaW5kIHNvY2tldCAlZCwgY29udGV4dCA9ICVkXG4iLCBpLCBjb250ZXh0KTsKKworCQkvKiBWaWRlbyBNZW1vcnkgKi8KKwkJc2V0ID0gZ2xvYmFsX3Bwcml2W2ldLnNldHNbMF07CisJCXJldHZhbCA9IHZpYV9zZXRGaXJzdChzZXQsICZpdGVtKTsKKwkJd2hpbGUgKHJldHZhbCkgeworCQkJRFJNX0RFQlVHKCJmcmVlIHZpZGVvIG1lbW9yeSAweCVseFxuIiwgaXRlbSk7CisJCQl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGl0ZW0pOworCQkJcmV0dmFsID0gdmlhX3NldE5leHQoc2V0LCAmaXRlbSk7CisJCX0KKwkJdmlhX3NldERlc3Ryb3koc2V0KTsKKworCQkvKiBBR1AgTWVtb3J5ICovCisJCXNldCA9IGdsb2JhbF9wcHJpdltpXS5zZXRzWzFdOworCQlyZXR2YWwgPSB2aWFfc2V0Rmlyc3Qoc2V0LCAmaXRlbSk7CisJCXdoaWxlIChyZXR2YWwpIHsKKwkJCURSTV9ERUJVRygiZnJlZSBhZ3AgbWVtb3J5IDB4JWx4XG4iLCBpdGVtKTsKKwkJCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgaXRlbSk7CisJCQlyZXR2YWwgPSB2aWFfc2V0TmV4dChzZXQsICZpdGVtKTsKKwkJfQorCQl2aWFfc2V0RGVzdHJveShzZXQpOworCQlnbG9iYWxfcHByaXZbaV0udXNlZCA9IDA7CisJfQorCXZpYV9yZWxlYXNlX2Z1dGV4KGRldl9wcml2LCBjb250ZXh0KTsgCisJCisJCQkKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKwkvKiBMaW51eCBzcGVjaWZpYyB1bnRpbCBjb250ZXh0IHRyYWNraW5nIGNvZGUgZ2V0cyBwb3J0ZWQgdG8gQlNEICovCisJLyogTGFzdCBjb250ZXh0LCBwZXJmb3JtIGNsZWFudXAgKi8KKwlpZiAoZGV2LT5jdHhfY291bnQgPT0gMSAmJiBkZXYtPmRldl9wcml2YXRlKSB7CisJICAgICAgICBEUk1fREVCVUcoIkxhc3QgQ29udGV4dFxuIik7CisJCWlmIChkZXYtPmlycSkKKwkJCWRybV9pcnFfdW5pbnN0YWxsKGRldik7CisKKwkJdmlhX2NsZWFudXBfZnV0ZXgoZGV2X3ByaXYpOworCQl2aWFfZG9fY2xlYW51cF9tYXAoZGV2KTsKKwl9CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitpbnQgdmlhX21lbV9hbGxvYyhEUk1fSU9DVExfQVJHUykKK3sKKwlkcm1fdmlhX21lbV90IG1lbTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChtZW0sIChkcm1fdmlhX21lbV90ICopIGRhdGEsIHNpemVvZihtZW0pKTsKKworCXN3aXRjaCAobWVtLnR5cGUpIHsKKwljYXNlIFZJREVPOgorCQlpZiAodmlhX2ZiX2FsbG9jKCZtZW0pIDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEUk1fQ09QWV9UT19VU0VSX0lPQ1RMKChkcm1fdmlhX21lbV90ICopIGRhdGEsIG1lbSwKKwkJCQkgICAgICAgc2l6ZW9mKG1lbSkpOworCQlyZXR1cm4gMDsKKwljYXNlIEFHUDoKKwkJaWYgKHZpYV9hZ3BfYWxsb2MoJm1lbSkgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV92aWFfbWVtX3QgKikgZGF0YSwgbWVtLAorCQkJCSAgICAgICBzaXplb2YobWVtKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IHZpYV9mYl9hbGxvYyhkcm1fdmlhX21lbV90ICogbWVtKQoreworCWRybV92aWFfbW1fdCBmYjsKKwlQTWVtQmxvY2sgYmxvY2s7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIUZCSGVhcCkKKwkJcmV0dXJuIC0xOworCisJZmIuc2l6ZSA9IG1lbS0+c2l6ZTsKKwlmYi5jb250ZXh0ID0gbWVtLT5jb250ZXh0OworCisJYmxvY2sgPSB2aWFfbW1BbGxvY01lbShGQkhlYXAsIGZiLnNpemUsIDUsIDApOworCWlmIChibG9jaykgeworCQlmYi5vZmZzZXQgPSBibG9jay0+b2ZzOworCQlmYi5mcmVlID0gKHVuc2lnbmVkIGxvbmcpYmxvY2s7CisJCWlmICghYWRkX2FsbG9jX3NldChmYi5jb250ZXh0LCBWSURFTywgZmIuZnJlZSkpIHsKKwkJCURSTV9ERUJVRygiYWRkaW5nIHRvIGFsbG9jYXRpb24gc2V0IGZhaWxzXG4iKTsKKwkJCXZpYV9tbUZyZWVNZW0oKFBNZW1CbG9jaykgZmIuZnJlZSk7CisJCQlyZXR2YWwgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCWZiLm9mZnNldCA9IDA7CisJCWZiLnNpemUgPSAwOworCQlmYi5mcmVlID0gMDsKKwkJcmV0dmFsID0gLTE7CisJfQorCisJbWVtLT5vZmZzZXQgPSBmYi5vZmZzZXQ7CisJbWVtLT5pbmRleCA9IGZiLmZyZWU7CisKKwlEUk1fREVCVUcoImFsbG9jIGZiLCBzaXplID0gJWQsIG9mZnNldCA9ICVkXG4iLCBmYi5zaXplLAorCQkgIChpbnQpZmIub2Zmc2V0KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2FncF9hbGxvYyhkcm1fdmlhX21lbV90ICogbWVtKQoreworCWRybV92aWFfbW1fdCBhZ3A7CisJUE1lbUJsb2NrIGJsb2NrOworCWludCByZXR2YWwgPSAwOworCisJaWYgKCFBZ3BIZWFwKQorCQlyZXR1cm4gLTE7CisKKwlhZ3Auc2l6ZSA9IG1lbS0+c2l6ZTsKKwlhZ3AuY29udGV4dCA9IG1lbS0+Y29udGV4dDsKKworCWJsb2NrID0gdmlhX21tQWxsb2NNZW0oQWdwSGVhcCwgYWdwLnNpemUsIDUsIDApOworCWlmIChibG9jaykgeworCQlhZ3Aub2Zmc2V0ID0gYmxvY2stPm9mczsKKwkJYWdwLmZyZWUgPSAodW5zaWduZWQgbG9uZylibG9jazsKKwkJaWYgKCFhZGRfYWxsb2Nfc2V0KGFncC5jb250ZXh0LCBBR1AsIGFncC5mcmVlKSkgeworCQkJRFJNX0RFQlVHKCJhZGRpbmcgdG8gYWxsb2NhdGlvbiBzZXQgZmFpbHNcbiIpOworCQkJdmlhX21tRnJlZU1lbSgoUE1lbUJsb2NrKSBhZ3AuZnJlZSk7CisJCQlyZXR2YWwgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCWFncC5vZmZzZXQgPSAwOworCQlhZ3Auc2l6ZSA9IDA7CisJCWFncC5mcmVlID0gMDsKKwl9CisKKwltZW0tPm9mZnNldCA9IGFncC5vZmZzZXQ7CisJbWVtLT5pbmRleCA9IGFncC5mcmVlOworCisJRFJNX0RFQlVHKCJhbGxvYyBhZ3AsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWRcbiIsIGFncC5zaXplLAorCQkgICh1bnNpZ25lZCBpbnQpYWdwLm9mZnNldCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHZpYV9tZW1fZnJlZShEUk1fSU9DVExfQVJHUykKK3sKKwlkcm1fdmlhX21lbV90IG1lbTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChtZW0sIChkcm1fdmlhX21lbV90ICopIGRhdGEsIHNpemVvZihtZW0pKTsKKworCXN3aXRjaCAobWVtLnR5cGUpIHsKKworCWNhc2UgVklERU86CisJCWlmICh2aWFfZmJfZnJlZSgmbWVtKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgQUdQOgorCQlpZiAodmlhX2FncF9mcmVlKCZtZW0pID09IDApCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2ZiX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSkKK3sKKwlkcm1fdmlhX21tX3QgZmI7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIUZCSGVhcCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJZmIuZnJlZSA9IG1lbS0+aW5kZXg7CisJZmIuY29udGV4dCA9IG1lbS0+Y29udGV4dDsKKworCWlmICghZmIuZnJlZSkgeworCQlyZXR1cm4gLTE7CisKKwl9CisKKwl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGZiLmZyZWUpOworCisJaWYgKCFkZWxfYWxsb2Nfc2V0KGZiLmNvbnRleHQsIFZJREVPLCBmYi5mcmVlKSkgeworCQlyZXR2YWwgPSAtMTsKKwl9CisKKwlEUk1fREVCVUcoImZyZWUgZmIsIGZyZWUgPSAlbGRcbiIsIGZiLmZyZWUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB2aWFfYWdwX2ZyZWUoZHJtX3ZpYV9tZW1fdCAqIG1lbSkKK3sKKwlkcm1fdmlhX21tX3QgYWdwOworCisJaW50IHJldHZhbCA9IDA7CisKKwlhZ3AuZnJlZSA9IG1lbS0+aW5kZXg7CisJYWdwLmNvbnRleHQgPSBtZW0tPmNvbnRleHQ7CisKKwlpZiAoIWFncC5mcmVlKQorCQlyZXR1cm4gLTE7CisKKwl2aWFfbW1GcmVlTWVtKChQTWVtQmxvY2spIGFncC5mcmVlKTsKKworCWlmICghZGVsX2FsbG9jX3NldChhZ3AuY29udGV4dCwgQUdQLCBhZ3AuZnJlZSkpIHsKKwkJcmV0dmFsID0gLTE7CisJfQorCisJRFJNX0RFQlVHKCJmcmVlIGFncCwgZnJlZSA9ICVsZFxuIiwgYWdwLmZyZWUpOworCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vdmlhX21tLmggYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1N2VmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3ZpYV9tbS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAzIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAyMDAxLTIwMDMgUzMgR3JhcGhpY3MsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFZJQSwgUzMgR1JBUEhJQ1MsIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF92aWFfZHJtX21tX2hfCisjZGVmaW5lIF92aWFfZHJtX21tX2hfCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgY29udGV4dDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZyZWU7Cit9IGRybV92aWFfbW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOworCXZvaWQgKnZpcnR1YWw7Cit9IGRybV92aWFfZG1hX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MjNiMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZlcmlmaWVyLmMKQEAgLTAsMCArMSwxMDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDQgVGhlIFVuaWNocm9tZSBQcm9qZWN0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIEhlbGxzdHJvbS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQorICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKKyAqIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1IoUyksIEFORC9PUiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IFRob21hcyBIZWxsc3Ryb20gMjAwNCwgMjAwNS4KKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1c2luZyBkb2NzIG9idGFpbmVkIHVuZGVyIE5EQSBmcm9tIFZJQSBJbmMuCisgKgorICogRG9uJ3QgcnVuIHRoaXMgY29kZSBkaXJlY3RseSBvbiBhbiBBR1AgYnVmZmVyLiBEdWUgdG8gY2FjaGUgcHJvYmxlbXMgaXQgd2lsbAorICogYmUgdmVyeSBzbG93LgorICovCisKKworI2luY2x1ZGUgInZpYV8zZF9yZWcuaCIKKyNpbmNsdWRlICJkcm1QLmgiCisjaW5jbHVkZSAiZHJtLmgiCisjaW5jbHVkZSAidmlhX2RybS5oIgorI2luY2x1ZGUgInZpYV92ZXJpZmllci5oIgorI2luY2x1ZGUgInZpYV9kcnYuaCIKKwordHlwZWRlZiBlbnVteworCXN0YXRlX2NvbW1hbmQsCisJc3RhdGVfaGVhZGVyMiwKKwlzdGF0ZV9oZWFkZXIxLAorCXN0YXRlX3ZoZWFkZXI1LAorCXN0YXRlX3ZoZWFkZXI2LAorCXN0YXRlX2Vycm9yCit9IHZlcmlmaWVyX3N0YXRlX3Q7CisKKwordHlwZWRlZiBlbnVteworCW5vX2NoZWNrID0gMCwKKwljaGVja19mb3JfaGVhZGVyMiwKKwljaGVja19mb3JfaGVhZGVyMSwKKwljaGVja19mb3JfaGVhZGVyMl9lcnIsCisJY2hlY2tfZm9yX2hlYWRlcjFfZXJyLAorCWNoZWNrX2Zvcl9maXJlLAorCWNoZWNrX3pfYnVmZmVyX2FkZHIwLAorCWNoZWNrX3pfYnVmZmVyX2FkZHIxLAorCWNoZWNrX3pfYnVmZmVyX2FkZHJfbW9kZSwKKwljaGVja19kZXN0aW5hdGlvbl9hZGRyMCwKKwljaGVja19kZXN0aW5hdGlvbl9hZGRyMSwKKwljaGVja19kZXN0aW5hdGlvbl9hZGRyX21vZGUsCisJY2hlY2tfZm9yX2R1bW15LAorCWNoZWNrX2Zvcl9kZCwKKwljaGVja190ZXh0dXJlX2FkZHIwLAorCWNoZWNrX3RleHR1cmVfYWRkcjEsCisJY2hlY2tfdGV4dHVyZV9hZGRyMiwKKwljaGVja190ZXh0dXJlX2FkZHIzLAorCWNoZWNrX3RleHR1cmVfYWRkcjQsCisJY2hlY2tfdGV4dHVyZV9hZGRyNSwKKwljaGVja190ZXh0dXJlX2FkZHI2LAorCWNoZWNrX3RleHR1cmVfYWRkcjcsCisJY2hlY2tfdGV4dHVyZV9hZGRyOCwKKwljaGVja190ZXh0dXJlX2FkZHJfbW9kZSwKKwljaGVja19mb3JfdmVydGV4X2NvdW50LAorCWNoZWNrX251bWJlcl90ZXh1bml0cywKKwlmb3JiaWRkZW5fY29tbWFuZAorfWhhemFyZF90OworCisvKgorICogQXNzb2NpYXRlcyBlYWNoIGhhemFyZCBhYm92ZSB3aXRoIGEgcG9zc2libGUgbXVsdGktY29tbWFuZAorICogc2VxdWVuY2UuIEZvciBleGFtcGxlIGFuIGFkZHJlc3MgdGhhdCBpcyBzcGxpdCBvdmVyIG11bHRpcGxlCisgKiBjb21tYW5kcyBhbmQgdGhhdCBuZWVkcyB0byBiZSBjaGVja2VkIGF0IHRoZSBmaXJzdCBjb21tYW5kIAorICogdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGFueSBwYXJ0IG9mIHRoZSBhZGRyZXNzLgorICovCisKK3N0YXRpYyBkcm1fdmlhX3NlcXVlbmNlX3Qgc2Vxc1tdID0geyAKKwlub19zZXF1ZW5jZSwKKwlub19zZXF1ZW5jZSwKKwlub19zZXF1ZW5jZSwKKwlub19zZXF1ZW5jZSwKKwlub19zZXF1ZW5jZSwKKwlub19zZXF1ZW5jZSwKKwl6X2FkZHJlc3MsCisJel9hZGRyZXNzLAorCXpfYWRkcmVzcywKKwlkZXN0X2FkZHJlc3MsCisJZGVzdF9hZGRyZXNzLAorCWRlc3RfYWRkcmVzcywKKwlub19zZXF1ZW5jZSwKKwlub19zZXF1ZW5jZSwKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwl0ZXhfYWRkcmVzcywKKwlub19zZXF1ZW5jZQorfTsKKyAgICAKK3R5cGVkZWYgc3RydWN0eworCXVuc2lnbmVkIGludCBjb2RlOworCWhhemFyZF90IGh6OworfSBoel9pbml0X3Q7CisKKworCitzdGF0aWMgaHpfaW5pdF90IGluaXRfdGFibGUxW10gPSB7CisJezB4ZjIsIGNoZWNrX2Zvcl9oZWFkZXIyX2Vycn0sCisJezB4ZjAsIGNoZWNrX2Zvcl9oZWFkZXIxX2Vycn0sCisJezB4ZWUsIGNoZWNrX2Zvcl9maXJlfSwKKwl7MHhjYywgY2hlY2tfZm9yX2R1bW15fSwKKwl7MHhkZCwgY2hlY2tfZm9yX2RkfSwKKwl7MHgwMCwgbm9fY2hlY2t9LAorCXsweDEwLCBjaGVja196X2J1ZmZlcl9hZGRyMH0sCisJezB4MTEsIGNoZWNrX3pfYnVmZmVyX2FkZHIxfSwKKwl7MHgxMiwgY2hlY2tfel9idWZmZXJfYWRkcl9tb2RlfSwKKwl7MHgxMywgbm9fY2hlY2t9LAorCXsweDE0LCBub19jaGVja30sCisJezB4MTUsIG5vX2NoZWNrfSwKKwl7MHgyMywgbm9fY2hlY2t9LAorCXsweDI0LCBub19jaGVja30sCisJezB4MzMsIG5vX2NoZWNrfSwKKwl7MHgzNCwgbm9fY2hlY2t9LAorCXsweDM1LCBub19jaGVja30sCisJezB4MzYsIG5vX2NoZWNrfSwKKwl7MHgzNywgbm9fY2hlY2t9LAorCXsweDM4LCBub19jaGVja30sCisJezB4MzksIG5vX2NoZWNrfSwKKwl7MHgzQSwgbm9fY2hlY2t9LAorCXsweDNCLCBub19jaGVja30sCisJezB4M0MsIG5vX2NoZWNrfSwKKwl7MHgzRCwgbm9fY2hlY2t9LAorCXsweDNFLCBub19jaGVja30sCisJezB4NDAsIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHIwfSwKKwl7MHg0MSwgY2hlY2tfZGVzdGluYXRpb25fYWRkcjF9LAorCXsweDQyLCBjaGVja19kZXN0aW5hdGlvbl9hZGRyX21vZGV9LAorCXsweDQzLCBub19jaGVja30sCisJezB4NDQsIG5vX2NoZWNrfSwKKwl7MHg1MCwgbm9fY2hlY2t9LAorCXsweDUxLCBub19jaGVja30sCisJezB4NTIsIG5vX2NoZWNrfSwKKwl7MHg1Mywgbm9fY2hlY2t9LAorCXsweDU0LCBub19jaGVja30sCisJezB4NTUsIG5vX2NoZWNrfSwKKwl7MHg1Niwgbm9fY2hlY2t9LAorCXsweDU3LCBub19jaGVja30sCisJezB4NTgsIG5vX2NoZWNrfSwKKwl7MHg3MCwgbm9fY2hlY2t9LAorCXsweDcxLCBub19jaGVja30sCisJezB4NzgsIG5vX2NoZWNrfSwKKwl7MHg3OSwgbm9fY2hlY2t9LAorCXsweDdBLCBub19jaGVja30sCisJezB4N0IsIG5vX2NoZWNrfSwKKwl7MHg3Qywgbm9fY2hlY2t9LAorCXsweDdELCBjaGVja19mb3JfdmVydGV4X2NvdW50fQorfTsKKworICAgCisJCSAgICAgICAKK3N0YXRpYyBoel9pbml0X3QgaW5pdF90YWJsZTJbXSA9IHsKKwl7MHhmMiwgY2hlY2tfZm9yX2hlYWRlcjJfZXJyfSwKKwl7MHhmMCwgY2hlY2tfZm9yX2hlYWRlcjFfZXJyfSwKKwl7MHhlZSwgY2hlY2tfZm9yX2ZpcmV9LAorCXsweGNjLCBjaGVja19mb3JfZHVtbXl9LAorCXsweDAwLCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwMSwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDIsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDAzLCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwNCwgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDUsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDA2LCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgwNywgY2hlY2tfdGV4dHVyZV9hZGRyMH0sCisJezB4MDgsIGNoZWNrX3RleHR1cmVfYWRkcjB9LAorCXsweDA5LCBjaGVja190ZXh0dXJlX2FkZHIwfSwKKwl7MHgyMCwgY2hlY2tfdGV4dHVyZV9hZGRyMX0sCisJezB4MjEsIGNoZWNrX3RleHR1cmVfYWRkcjF9LAorCXsweDIyLCBjaGVja190ZXh0dXJlX2FkZHIxfSwKKwl7MHgyMywgY2hlY2tfdGV4dHVyZV9hZGRyNH0sCisJezB4MkIsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDJDLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgyRCwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MkUsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDJGLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgzMCwgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MzEsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDMyLCBjaGVja190ZXh0dXJlX2FkZHIzfSwKKwl7MHgzMywgY2hlY2tfdGV4dHVyZV9hZGRyM30sCisJezB4MzQsIGNoZWNrX3RleHR1cmVfYWRkcjN9LAorCXsweDRCLCBjaGVja190ZXh0dXJlX2FkZHI1fSwKKwl7MHg0QywgY2hlY2tfdGV4dHVyZV9hZGRyNn0sCisJezB4NTEsIGNoZWNrX3RleHR1cmVfYWRkcjd9LAorCXsweDUyLCBjaGVja190ZXh0dXJlX2FkZHI4fSwKKwl7MHg3NywgY2hlY2tfdGV4dHVyZV9hZGRyMn0sCisJezB4NzgsIG5vX2NoZWNrfSwKKwl7MHg3OSwgbm9fY2hlY2t9LAorCXsweDdBLCBub19jaGVja30sCisJezB4N0IsIGNoZWNrX3RleHR1cmVfYWRkcl9tb2RlfSwKKwl7MHg3Qywgbm9fY2hlY2t9LAorCXsweDdELCBub19jaGVja30sCisJezB4N0UsIG5vX2NoZWNrfSwKKwl7MHg3Riwgbm9fY2hlY2t9LAorCXsweDgwLCBub19jaGVja30sCisJezB4ODEsIG5vX2NoZWNrfSwKKwl7MHg4Miwgbm9fY2hlY2t9LAorCXsweDgzLCBub19jaGVja30sCisJezB4ODUsIG5vX2NoZWNrfSwKKwl7MHg4Niwgbm9fY2hlY2t9LAorCXsweDg3LCBub19jaGVja30sCisJezB4ODgsIG5vX2NoZWNrfSwKKwl7MHg4OSwgbm9fY2hlY2t9LAorCXsweDhBLCBub19jaGVja30sCisJezB4OTAsIG5vX2NoZWNrfSwKKwl7MHg5MSwgbm9fY2hlY2t9LAorCXsweDkyLCBub19jaGVja30sCisJezB4OTMsIG5vX2NoZWNrfQorfTsKKworc3RhdGljIGh6X2luaXRfdCBpbml0X3RhYmxlM1tdID0geworCXsweGYyLCBjaGVja19mb3JfaGVhZGVyMl9lcnJ9LAorCXsweGYwLCBjaGVja19mb3JfaGVhZGVyMV9lcnJ9LAorCXsweGNjLCBjaGVja19mb3JfZHVtbXl9LAorCXsweDAwLCBjaGVja19udW1iZXJfdGV4dW5pdHN9Cit9OworICAgCisJCSAgICAgICAKK3N0YXRpYyBoYXphcmRfdCB0YWJsZTFbMjU2XTsgCitzdGF0aWMgaGF6YXJkX3QgdGFibGUyWzI1Nl07IAorc3RhdGljIGhhemFyZF90IHRhYmxlM1syNTZdOyAKKworCisKK3N0YXRpYyBfX2lubGluZV9fIGludAorZWF0X3dvcmRzKGNvbnN0IHVpbnQzMl90ICoqYnVmLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwgdW5zaWduZWQgbnVtX3dvcmRzKQoreworCWlmICgoKmJ1ZiAtIGJ1Zl9lbmQpID49IG51bV93b3JkcykgeworCQkqYnVmICs9IG51bV93b3JkczsKKwkJcmV0dXJuIDA7CisJfSAKKwlEUk1fRVJST1IoIklsbGVnYWwgdGVybWluYXRpb24gb2YgRE1BIGNvbW1hbmQgYnVmZmVyXG4iKTsKKwlyZXR1cm4gMTsKK30KKworCisvKgorICogUGFydGlhbGx5IHN0b2xlbiBmcm9tIGRybV9tZW1vcnkuaAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGRybV9tYXBfdCAqCit2aWFfZHJtX2xvb2t1cF9hZ3BfbWFwIChkcm1fdmlhX3N0YXRlX3QgKnNlcSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgCisJCQlkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWRybV9tYXBfbGlzdF90ICpyX2xpc3Q7CisJZHJtX21hcF90ICptYXAgPSBzZXEtPm1hcF9jYWNoZTsKKworCWlmIChtYXAgJiYgbWFwLT5vZmZzZXQgPD0gb2Zmc2V0ICYmIChvZmZzZXQgKyBzaXplKSA8PSAobWFwLT5vZmZzZXQgKyBtYXAtPnNpemUpKSB7CisJCXJldHVybiBtYXA7CisJfQorCQkKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkZXYtPm1hcGxpc3QtPmhlYWQpIHsKKwkJcl9saXN0ID0gKGRybV9tYXBfbGlzdF90ICopIGxpc3Q7CisJCW1hcCA9IHJfbGlzdC0+bWFwOworCQlpZiAoIW1hcCkKKwkJCWNvbnRpbnVlOworCQlpZiAobWFwLT5vZmZzZXQgPD0gb2Zmc2V0ICYmIChvZmZzZXQgKyBzaXplKSA8PSAobWFwLT5vZmZzZXQgKyBtYXAtPnNpemUpICYmIAorCQkgICAgIShtYXAtPmZsYWdzICYgX0RSTV9SRVNUUklDVEVEKSAmJiAobWFwLT50eXBlID09IF9EUk1fQUdQKSkgeworCQkJc2VxLT5tYXBfY2FjaGUgPSBtYXA7CisJCQlyZXR1cm4gbWFwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiBSZXF1aXJlIHRoYXQgYWxsIEFHUCB0ZXh0dXJlIGxldmVscyByZXNpZGUgaW4gdGhlIHNhbWUgQUdQIG1hcCB3aGljaCBzaG91bGQgCisgKiBiZSBtYXBwYWJsZSBieSB0aGUgY2xpZW50LiBUaGlzIGlzIG5vdCBhIGJpZyByZXN0cmljdGlvbi4KKyAqIEZJWE1FOiBUbyBhY3R1YWxseSBlbmZvcmNlIHRoaXMgc2VjdXJpdHkgcG9saWN5IHN0cmljdGx5LCBkcm1fcm1tYXAgCisgKiB3b3VsZCBoYXZlIHRvIHdhaXQgZm9yIGRtYSBxdWllc2NlbnQgYmVmb3JlIHJlbW92aW5nIGFuIEFHUCBtYXAuIAorICogVGhlIHZpYV9kcm1fbG9va3VwX2FncF9tYXAgY2FsbCBpbiByZWFsaXR5IHNlZW1zIHRvIHRha2UKKyAqIHZlcnkgbGl0dGxlIENQVSB0aW1lLgorICovCisKKworc3RhdGljIF9faW5saW5lX18gaW50CitmaW5pc2hfY3VycmVudF9zZXF1ZW5jZShkcm1fdmlhX3N0YXRlX3QgKmN1cl9zZXEpIAoreworCXN3aXRjaChjdXJfc2VxLT51bmZpbmlzaGVkKSB7CisJY2FzZSB6X2FkZHJlc3M6CisJCURSTV9ERUJVRygiWiBCdWZmZXIgc3RhcnQgYWRkcmVzcyBpcyAweCV4XG4iLCBjdXJfc2VxLT56X2FkZHIpOworCQlicmVhazsKKwljYXNlIGRlc3RfYWRkcmVzczoKKwkJRFJNX0RFQlVHKCJEZXN0aW5hdGlvbiBzdGFydCBhZGRyZXNzIGlzIDB4JXhcbiIsIGN1cl9zZXEtPmRfYWRkcik7CisJCWJyZWFrOworCWNhc2UgdGV4X2FkZHJlc3M6CisJCWlmIChjdXJfc2VxLT5hZ3BfdGV4dHVyZSkgewkJCSAKKwkJCXVuc2lnbmVkIHN0YXJ0ID0gY3VyX3NlcS0+dGV4X2xldmVsX2xvW2N1cl9zZXEtPnRleHR1cmVdOworCQkJdW5zaWduZWQgZW5kID0gY3VyX3NlcS0+dGV4X2xldmVsX2hpW2N1cl9zZXEtPnRleHR1cmVdOworCQkJdW5zaWduZWQgbG9uZyBsbz1+MCwgaGk9MCwgdG1wOworCQkJdWludDMyX3QgKmFkZHIsICpwaXRjaCwgKmhlaWdodCwgdGV4OworCQkJdW5zaWduZWQgaTsKKworCQkJaWYgKGVuZCA+IDkpIGVuZCA9IDk7CisJCQlpZiAoc3RhcnQgPiA5KSBzdGFydCA9IDk7CisKKwkJCWFkZHIgPSYoY3VyX3NlcS0+dF9hZGRyW3RleCA9IGN1cl9zZXEtPnRleHR1cmVdW3N0YXJ0XSk7CisJCQlwaXRjaCA9ICYoY3VyX3NlcS0+cGl0Y2hbdGV4XVtzdGFydF0pOworCQkJaGVpZ2h0ID0gJihjdXJfc2VxLT5oZWlnaHRbdGV4XVtzdGFydF0pOworCisJCQlmb3IgKGk9c3RhcnQ7IGk8PSBlbmQ7ICsraSkgeworCQkJCXRtcCA9ICphZGRyKys7CisJCQkJaWYgKHRtcCA8IGxvKSBsbyA9IHRtcDsKKwkJCQl0bXAgKz0gKCpoZWlnaHQrKyA8PCAqcGl0Y2grKyk7CisJCQkJaWYgKHRtcCA+IGhpKSBoaSA9IHRtcDsKKwkJCX0KKworCQkJaWYgKCEgdmlhX2RybV9sb29rdXBfYWdwX21hcCAoY3VyX3NlcSwgbG8sIGhpIC0gbG8sIGN1cl9zZXEtPmRldikpIHsKKwkJCQlEUk1fRVJST1IoIkFHUCB0ZXh0dXJlIGlzIG5vdCBpbiBhbGxvd2VkIG1hcFxuIik7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCX0JCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwljdXJfc2VxLT51bmZpbmlzaGVkID0gbm9fc2VxdWVuY2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCAKK2ludmVzdGlnYXRlX2hhemFyZCggdWludDMyX3QgY21kLCBoYXphcmRfdCBoeiwgZHJtX3ZpYV9zdGF0ZV90ICpjdXJfc2VxKQoreworCXJlZ2lzdGVyIHVpbnQzMl90IHRtcCwgKnRtcF9hZGRyOworCisJaWYgKGN1cl9zZXEtPnVuZmluaXNoZWQgJiYgKGN1cl9zZXEtPnVuZmluaXNoZWQgIT0gc2Vxc1toel0pKSB7CisJCWludCByZXQ7CisJCWlmICgocmV0ID0gZmluaXNoX2N1cnJlbnRfc2VxdWVuY2UoY3VyX3NlcSkpKSByZXR1cm4gcmV0OworCX0KKworCXN3aXRjaChoeikgeworCWNhc2UgY2hlY2tfZm9yX2hlYWRlcjI6CisJCWlmIChjbWQgPT0gSEFMQ1lPTl9IRUFERVIyKSByZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja19mb3JfaGVhZGVyMToKKwkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSA9PSBIQUxDWU9OX0hFQURFUjEpIHJldHVybiAxOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Zvcl9oZWFkZXIyX2VycjoKKwkJaWYgKGNtZCA9PSBIQUxDWU9OX0hFQURFUjIpIHJldHVybiAxOworCQlEUk1fRVJST1IoIklsbGVnYWwgRE1BIEhBTENZT05fSEVBREVSMiBjb21tYW5kXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBjaGVja19mb3JfaGVhZGVyMV9lcnI6CisJCWlmICgoY21kICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgPT0gSEFMQ1lPTl9IRUFERVIxKSByZXR1cm4gMTsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIERNQSBIQUxDWU9OX0hFQURFUjEgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgY2hlY2tfZm9yX2ZpcmU6CisJCWlmICgoY21kICYgSEFMQ1lPTl9GSVJFTUFTSykgPT0gSEFMQ1lPTl9GSVJFQ01EKSByZXR1cm4gMTsgCisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgSEFMQ1lPTl9GSVJFQ01EIGNvbW1hbmRcbiIpOworCQlicmVhazsKKwljYXNlIGNoZWNrX2Zvcl9kdW1teToKKwkJaWYgKEhDX0RVTU1ZID09IGNtZCkgcmV0dXJuIDA7CisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgSENfRFVNTVkgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgY2hlY2tfZm9yX2RkOgorCQlpZiAoMHhkZGRkZGRkZCA9PSBjbWQpIHJldHVybiAwOworCQlEUk1fRVJST1IoIklsbGVnYWwgRE1BIDB4ZGRkZGRkZGQgY29tbWFuZFxuIik7CisJCWJyZWFrOworCWNhc2UgY2hlY2tfel9idWZmZXJfYWRkcjA6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB6X2FkZHJlc3M7CisJCWN1cl9zZXEtPnpfYWRkciA9IChjdXJfc2VxLT56X2FkZHIgJiAweEZGMDAwMDAwKSB8CisJCQkoY21kICYgMHgwMEZGRkZGRik7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfel9idWZmZXJfYWRkcjE6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB6X2FkZHJlc3M7CisJCWN1cl9zZXEtPnpfYWRkciA9IChjdXJfc2VxLT56X2FkZHIgJiAweDAwRkZGRkZGKSB8CisJCQkoKGNtZCAmIDB4RkYpIDw8IDI0KTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja196X2J1ZmZlcl9hZGRyX21vZGU6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB6X2FkZHJlc3M7CisJCWlmICgoY21kICYgMHgwMDAwQzAwMCkgPT0gMCkgcmV0dXJuIDA7CisJCURSTV9FUlJPUigiQXR0ZW1wdCB0byBwbGFjZSBaIGJ1ZmZlciBpbiBzeXN0ZW0gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIDI7CisJY2FzZSBjaGVja19kZXN0aW5hdGlvbl9hZGRyMDoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IGRlc3RfYWRkcmVzczsKKwkJY3VyX3NlcS0+ZF9hZGRyID0gKGN1cl9zZXEtPmRfYWRkciAmIDB4RkYwMDAwMDApIHwKKwkJCShjbWQgJiAweDAwRkZGRkZGKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja19kZXN0aW5hdGlvbl9hZGRyMToKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IGRlc3RfYWRkcmVzczsKKwkJY3VyX3NlcS0+ZF9hZGRyID0gKGN1cl9zZXEtPmRfYWRkciAmIDB4MDBGRkZGRkYpIHwKKwkJCSgoY21kICYgMHhGRikgPDwgMjQpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX2Rlc3RpbmF0aW9uX2FkZHJfbW9kZToKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IGRlc3RfYWRkcmVzczsKKwkJaWYgKChjbWQgJiAweDAwMDBDMDAwKSA9PSAwKSByZXR1cm4gMDsKKwkJRFJNX0VSUk9SKCJBdHRlbXB0IHRvIHBsYWNlIDNEIGRyYXdpbmcgYnVmZmVyIGluIHN5c3RlbSBtZW1vcnlcbiIpOworCQlyZXR1cm4gMjsJICAgIAorCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyMDoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHRleF9hZGRyZXNzOworCQl0bXAgPSAoY21kID4+IDI0KTsKKwkJdG1wX2FkZHIgPSAmY3VyX3NlcS0+dF9hZGRyW2N1cl9zZXEtPnRleHR1cmVdW3RtcF07CisJCSp0bXBfYWRkciA9ICgqdG1wX2FkZHIgJiAweEZGMDAwMDAwKSB8IChjbWQgJiAweDAwRkZGRkZGKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHIxOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcCA9ICgoY21kID4+IDI0KSAtIDB4MjApOworCQl0bXAgKz0gdG1wIDw8IDE7CisJCXRtcF9hZGRyID0gJmN1cl9zZXEtPnRfYWRkcltjdXJfc2VxLT50ZXh0dXJlXVt0bXBdOworCQkqdG1wX2FkZHIgPSAoKnRtcF9hZGRyICYgMHgwMEZGRkZGRikgfCAoKGNtZCAmIDB4RkYpIDw8IDI0KTsKKwkJdG1wX2FkZHIrKzsKKwkJKnRtcF9hZGRyID0gKCp0bXBfYWRkciAmIDB4MDBGRkZGRkYpIHwgKChjbWQgJiAweEZGMDApIDw8IDE2KTsKKwkJdG1wX2FkZHIrKzsKKwkJKnRtcF9hZGRyID0gKCp0bXBfYWRkciAmIDB4MDBGRkZGRkYpIHwgKChjbWQgJiAweEZGMDAwMCkgPDwgOCk7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyMjoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHRleF9hZGRyZXNzOworCQljdXJfc2VxLT50ZXhfbGV2ZWxfbG9bdG1wID0gY3VyX3NlcS0+dGV4dHVyZV0gPSBjbWQgJiAweDNGOworCQljdXJfc2VxLT50ZXhfbGV2ZWxfaGlbdG1wXSA9IChjbWQgJiAweEZDMCkgPj4gNjsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHIzOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcCA9ICgoY21kID4+IDI0KSAtIDB4MkIpOworCQljdXJfc2VxLT5waXRjaFtjdXJfc2VxLT50ZXh0dXJlXVt0bXBdID0gKGNtZCAmIDB4MDBGMDAwMDApID4+IDIwOworCQlpZiAoIXRtcCAmJiAoY21kICYgMHgwMDBGRkZGRikpIHsKKwkJCURSTV9FUlJPUigiVW5pbXBsZW1lbnRlZCB0ZXh0dXJlIGxldmVsIDAgcGl0Y2ggbW9kZS5cbiIpOworCQkJcmV0dXJuIDI7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHI0OgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcF9hZGRyID0gJmN1cl9zZXEtPnRfYWRkcltjdXJfc2VxLT50ZXh0dXJlXVs5XTsKKwkJKnRtcF9hZGRyID0gKCp0bXBfYWRkciAmIDB4MDBGRkZGRkYpIHwgKChjbWQgJiAweEZGKSA8PCAyNCk7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyNToKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcjY6CisJCWN1cl9zZXEtPnVuZmluaXNoZWQgPSB0ZXhfYWRkcmVzczsKKwkJLyoKKwkJICogVGV4dHVyZSB3aWR0aC4gV2UgZG9uJ3QgY2FyZSBzaW5jZSB3ZSBoYXZlIHRoZSBwaXRjaC4KKwkJICovICAKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja190ZXh0dXJlX2FkZHI3OgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCXRtcF9hZGRyID0gJihjdXJfc2VxLT5oZWlnaHRbY3VyX3NlcS0+dGV4dHVyZV1bMF0pOworCQl0bXBfYWRkcls1XSA9IDEgPDwgKChjbWQgJiAweDAwRjAwMDAwKSA+PiAyMCk7CisJCXRtcF9hZGRyWzRdID0gMSA8PCAoKGNtZCAmIDB4MDAwRjAwMDApID4+IDE2KTsKKwkJdG1wX2FkZHJbM10gPSAxIDw8ICgoY21kICYgMHgwMDAwRjAwMCkgPj4gMTIpOworCQl0bXBfYWRkclsyXSA9IDEgPDwgKChjbWQgJiAweDAwMDAwRjAwKSA+PiA4KTsKKwkJdG1wX2FkZHJbMV0gPSAxIDw8ICgoY21kICYgMHgwMDAwMDBGMCkgPj4gNCk7CisJCXRtcF9hZGRyWzBdID0gMSA8PCAoY21kICYgMHgwMDAwMDAwRik7CisJCXJldHVybiAwOworCWNhc2UgY2hlY2tfdGV4dHVyZV9hZGRyODoKKwkJY3VyX3NlcS0+dW5maW5pc2hlZCA9IHRleF9hZGRyZXNzOworCQl0bXBfYWRkciA9ICYoY3VyX3NlcS0+aGVpZ2h0W2N1cl9zZXEtPnRleHR1cmVdWzBdKTsKKwkJdG1wX2FkZHJbOV0gPSAxIDw8ICgoY21kICYgMHgwMDAwRjAwMCkgPj4gMTIpOworCSAgICAgICAgdG1wX2FkZHJbOF0gPSAxIDw8ICgoY21kICYgMHgwMDAwMEYwMCkgPj4gOCk7CisJCXRtcF9hZGRyWzddID0gMSA8PCAoKGNtZCAmIDB4MDAwMDAwRjApID4+IDQpOworCQl0bXBfYWRkcls2XSA9IDEgPDwgKGNtZCAmIDB4MDAwMDAwMEYpOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX3RleHR1cmVfYWRkcl9tb2RlOgorCQljdXJfc2VxLT51bmZpbmlzaGVkID0gdGV4X2FkZHJlc3M7CisJCWlmICggMiA9PSAodG1wID0gY21kICYgMHgwMDAwMDAwMykpIHsKKwkJCURSTV9FUlJPUigiQXR0ZW1wdCB0byBmZXRjaCB0ZXh0dXJlIGZyb20gc3lzdGVtIG1lbW9yeS5cbiIpOyAKKwkJCXJldHVybiAyOworCQl9CisJCWN1cl9zZXEtPmFncF90ZXh0dXJlID0gKHRtcCA9PSAzKTsKKwkJY3VyX3NlcS0+dGV4X3BhbGV0dGVfc2l6ZVtjdXJfc2VxLT50ZXh0dXJlXSA9IAorCQkJKGNtZCA+PiAxNikgJiAweDAwMDAwMDAwNzsKKwkJcmV0dXJuIDA7CisJY2FzZSBjaGVja19mb3JfdmVydGV4X2NvdW50OgorCQljdXJfc2VxLT52ZXJ0ZXhfY291bnQgPSBjbWQgJiAweDAwMDBGRkZGOworCQlyZXR1cm4gMDsKKwljYXNlIGNoZWNrX251bWJlcl90ZXh1bml0czoKKwkgICAgICAgIGN1cl9zZXEtPm11bHRpdGV4ID0gKGNtZCA+PiAzKSAmIDE7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiSWxsZWdhbCBETUEgZGF0YTogMHgleFxuIiwgY21kKTsKKwkJcmV0dXJuIDI7CisJfQorCXJldHVybiAyOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIGludAordmlhX2NoZWNrX3ByaW1fbGlzdCh1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQsCisJCSAgICBkcm1fdmlhX3N0YXRlX3QgKmN1cl9zZXEpCit7CisJZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV92aWFfcHJpdmF0ZV90ICopIGN1cl9zZXEtPmRldi0+ZGV2X3ByaXZhdGU7CisJdWludDMyX3QgYV9maXJlLCBiY21kICwgZHdfY291bnQ7CisJaW50IHJldCA9IDA7CisJaW50IGhhdmVfZmlyZTsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKworCXdoaWxlKGJ1ZiA8IGJ1Zl9lbmQpIHsKKwkgICAgICAgIGhhdmVfZmlyZSA9IDA7CisJCWlmICgoYnVmX2VuZCAtIGJ1ZikgPCAyKSB7CisJCQlEUk1fRVJST1IoIlVuZXhwZWN0ZWQgdGVybWluYXRpb24gb2YgcHJpbWl0aXZlIGxpc3QuXG4iKTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKCpidWYgJiBIQ19BQ01EX01BU0spICE9IEhDX0FDTURfSENtZEIpIGJyZWFrOworCQliY21kID0gKmJ1ZisrOworCQlpZiAoKCpidWYgJiBIQ19BQ01EX01BU0spICE9IEhDX0FDTURfSENtZEEpIHsKKwkJCURSTV9FUlJPUigiRXhwZWN0ZWQgVmVydGV4IExpc3QgQSBjb21tYW5kLCBnb3QgMHgleFxuIiwKKwkJCQkgICpidWYpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWFfZmlyZSA9ICpidWYrKyB8IEhDX0hQTEVORF9NQVNLIHwgSENfSFBNVmFsaWROX01BU0sgfCBIQ19IRTNGaXJlX01BU0s7CQorCQorCQkvKgorCQkgKiBIb3cgbWFueSBkd29yZHMgcGVyIHZlcnRleCA/CisJCSAqLyAKKwkJCisJCWlmIChjdXJfc2VxLT5hZ3AgJiYgKChiY21kICYgKDB4RiA8PCAxMSkpID09IDApKSB7CisJCQlEUk1fRVJST1IoIklsbGVnYWwgQiBjb21tYW5kIHZlcnRleCBkYXRhIGZvciBBR1AuXG4iKTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfSAKKworCQlkd19jb3VudCA9IDA7CisJCWlmIChiY21kICYgKDEgPDwgNykpIGR3X2NvdW50ICs9IChjdXJfc2VxLT5tdWx0aXRleCkgPyAyOjE7CisJCWlmIChiY21kICYgKDEgPDwgOCkpIGR3X2NvdW50ICs9IChjdXJfc2VxLT5tdWx0aXRleCkgPyAyOjE7CisJCWlmIChiY21kICYgKDEgPDwgOSkpIGR3X2NvdW50Kys7CisJCWlmIChiY21kICYgKDEgPDwgMTApKSBkd19jb3VudCsrOworCQlpZiAoYmNtZCAmICgxIDw8IDExKSkgZHdfY291bnQrKzsKKwkJaWYgKGJjbWQgJiAoMSA8PCAxMikpIGR3X2NvdW50Kys7CisJCWlmIChiY21kICYgKDEgPDwgMTMpKSBkd19jb3VudCsrOworCQlpZiAoYmNtZCAmICgxIDw8IDE0KSkgZHdfY291bnQrKzsKKworCQl3aGlsZShidWYgPCBidWZfZW5kKSB7CisJCQlpZiAoKmJ1ZiA9PSBhX2ZpcmUpIHsKKwkJCQlpZiAoZGV2X3ByaXYtPm51bV9maXJlX29mZnNldHMgPj0gVklBX0ZJUkVfQlVGX1NJWkUpIHsKKwkJCQkJRFJNX0VSUk9SKCJGaXJlIG9mZnNldCBidWZmZXIgZnVsbC5cbiIpOworCQkJCQlyZXQgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZGV2X3ByaXYtPmZpcmVfb2Zmc2V0c1tkZXZfcHJpdi0+bnVtX2ZpcmVfb2Zmc2V0cysrXSA9IGJ1ZjsKKwkJCSAgICAgICAgaGF2ZV9maXJlID0gMTsKKwkJCQlidWYrKzsKKwkJCQlpZiAoYnVmIDwgYnVmX2VuZCAmJiAqYnVmID09IGFfZmlyZSkgCisJCQkJCWJ1ZisrOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCgqYnVmID09IEhBTENZT05fSEVBREVSMikgfHwgCisJCQkgICAgKCgqYnVmICYgSEFMQ1lPTl9GSVJFTUFTSykgPT0gSEFMQ1lPTl9GSVJFQ01EKSkgeworCQkJCURSTV9FUlJPUigiTWlzc2luZyBWZXJ0ZXggRmlyZSBjb21tYW5kLCAiCisJCQkJCSAgIlN0cmF5IFZlcnRleCBGaXJlIGNvbW1hbmQgIG9yIHZlcmlmaWVyICIKKwkJCQkJICAibG9zdCBzeW5jLlxuIik7CisJCQkJcmV0ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgocmV0ID0gZWF0X3dvcmRzKCZidWYsIGJ1Zl9lbmQsIGR3X2NvdW50KSkpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJ1ZiA+PSBidWZfZW5kICYmICFoYXZlX2ZpcmUpIHsKKwkJCURSTV9FUlJPUigiTWlzc2luZyBWZXJ0ZXggRmlyZSBjb21tYW5kIG9yIHZlcmlmaWVyICIKKwkJCQkgICJsb3N0IHN5bmMuXG4iKTsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoY3VyX3NlcS0+YWdwICYmICgoYnVmIC0gY3VyX3NlcS0+YnVmX3N0YXJ0KSAmIDB4MDEpKSB7CisJCQlEUk1fRVJST1IoIkFHUCBQcmltaXRpdmUgbGlzdCBlbmQgbWlzYWxpZ25lZC5cbiIpOworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSAKKwkqYnVmZmVyID0gYnVmOworCXJldHVybiByZXQ7Cit9CisKKworCQkgICAgICAgCisKKworc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAordmlhX2NoZWNrX2hlYWRlcjIoIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCwgCisJCSAgIGRybV92aWFfc3RhdGVfdCAqaGNfc3RhdGUpCit7CisJdWludDMyX3QgY21kOworCWludCBoel9tb2RlOworCWhhemFyZF90IGh6OworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCWNvbnN0IGhhemFyZF90ICpoel90YWJsZTsKKworCisJaWYgKChidWZfZW5kIC0gYnVmKSA8IDIpIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIHRlcm1pbmF0aW9uIG9mIERNQSBIQUxDWU9OX0hFQURFUjIgc2VxdWVuY2UuXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKwlidWYrKzsKKwljbWQgPSAoKmJ1ZisrICYgMHhGRkZGMDAwMCkgPj4gMTY7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBIQ19QYXJhVHlwZV9DbWRWZGF0YToKKwkJaWYgKHZpYV9jaGVja19wcmltX2xpc3QoJmJ1ZiwgYnVmX2VuZCwgaGNfc3RhdGUgKSkgCisJCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJCSpidWZmZXIgPSBidWY7CisJCXJldHVybiBzdGF0ZV9jb21tYW5kOworCWNhc2UgSENfUGFyYVR5cGVfTm90VGV4OgorCQloel90YWJsZSA9IHRhYmxlMTsKKwkJYnJlYWs7CisJY2FzZSBIQ19QYXJhVHlwZV9UZXg6CisJCWhjX3N0YXRlLT50ZXh0dXJlID0gMDsKKwkJaHpfdGFibGUgPSB0YWJsZTI7CisJCWJyZWFrOworCWNhc2UgKEhDX1BhcmFUeXBlX1RleCB8IChIQ19TdWJUeXBlX1RleDEgPDwgOCkpOgorCQloY19zdGF0ZS0+dGV4dHVyZSA9IDE7CisJCWh6X3RhYmxlID0gdGFibGUyOworCQlicmVhazsKKwljYXNlIChIQ19QYXJhVHlwZV9UZXggfCAoSENfU3ViVHlwZV9UZXhHZW5lcmFsIDw8IDgpKToKKwkJaHpfdGFibGUgPSB0YWJsZTM7CisJCWJyZWFrOworCWNhc2UgSENfUGFyYVR5cGVfQXV0bzoKKwkJaWYgKGVhdF93b3JkcygmYnVmLCBidWZfZW5kLCAyKSkKKwkJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkJKmJ1ZmZlciA9IGJ1ZjsKKwkJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7CisJY2FzZSAoSENfUGFyYVR5cGVfUGFsZXR0ZSB8IChIQ19TdWJUeXBlX1N0aXBwbGUgPDwgOCkpOgorCQlpZiAoZWF0X3dvcmRzKCZidWYsIGJ1Zl9lbmQsIDMyKSkKKwkJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkJKmJ1ZmZlciA9IGJ1ZjsKKwkJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7CisJY2FzZSAoSENfUGFyYVR5cGVfUGFsZXR0ZSB8IChIQ19TdWJUeXBlX1RleFBhbGV0dGUwIDw8IDgpKToKKwljYXNlIChIQ19QYXJhVHlwZV9QYWxldHRlIHwgKEhDX1N1YlR5cGVfVGV4UGFsZXR0ZTEgPDwgOCkpOgorCQlEUk1fRVJST1IoIlRleHR1cmUgcGFsZXR0ZXMgYXJlIHJlamVjdGVkIGJlY2F1c2Ugb2YgIgorCQkJICAibGFjayBvZiBpbmZvIGhvdyB0byBkZXRlcm1pbmUgdGhlaXIgc2l6ZS5cbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJY2FzZSAoSENfUGFyYVR5cGVfUGFsZXR0ZSB8IChIQ19TdWJUeXBlX0ZvZ1RhYmxlIDw8IDgpKToKKwkJRFJNX0VSUk9SKCJGb2cgZmFjdG9yIHBhbGV0dGVzIGFyZSByZWplY3RlZCBiZWNhdXNlIG9mICIKKwkJCSAgImxhY2sgb2YgaW5mbyBob3cgdG8gZGV0ZXJtaW5lIHRoZWlyIHNpemUuXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCWRlZmF1bHQ6CisKKwkJLyoKKwkJICogVGhlcmUgYXJlIHNvbWUgdW5pbXBsZW1lbnRlZCBIQ19QYXJhVHlwZXMgaGVyZSwgdGhhdAorCQkgKiBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGlmIHRoZSBNZXNhIGRyaXZlciBpcyBleHRlbmRlZC4KKwkJICovCisKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIG9yIHVuaW1wbGVtZW50ZWQgSEFMQ1lPTl9IRUFERVIyICIKKwkJCSAgIkRNQSBzdWJjb21tYW5kOiAweCV4LiBQcmV2aW91cyBkd29yZDogMHgleFxuIiwgCisJCQkgIGNtZCwgKihidWYgLTIpKTsKKwkJKmJ1ZmZlciA9IGJ1ZjsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKworCXdoaWxlKGJ1ZiA8IGJ1Zl9lbmQpIHsKKwkJY21kID0gKmJ1ZisrOworCQlpZiAoKGh6ID0gaHpfdGFibGVbY21kID4+IDI0XSkpIHsKKwkJCWlmICgoaHpfbW9kZSA9IGludmVzdGlnYXRlX2hhemFyZChjbWQsIGh6LCBoY19zdGF0ZSkpKSB7CisJCQkJaWYgKGh6X21vZGUgPT0gMSkgeworCQkJCQlidWYtLTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkJCX0KKwkJfSBlbHNlIGlmIChoY19zdGF0ZS0+dW5maW5pc2hlZCAmJiAKKwkJCSAgIGZpbmlzaF9jdXJyZW50X3NlcXVlbmNlKGhjX3N0YXRlKSkgeworCQkJcmV0dXJuIHN0YXRlX2Vycm9yOworCQl9CisJfQorCWlmIChoY19zdGF0ZS0+dW5maW5pc2hlZCAmJiBmaW5pc2hfY3VycmVudF9zZXF1ZW5jZShoY19zdGF0ZSkpIHsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfcGFyc2VfaGVhZGVyMiggZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQsCisJCSAgIGludCAqZmlyZV9jb3VudCkKK3sKKwl1aW50MzJfdCBjbWQ7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisJY29uc3QgdWludDMyX3QgKm5leHRfZmlyZTsgCisJaW50IGJ1cnN0ID0gMDsKKworCW5leHRfZmlyZSA9IGRldl9wcml2LT5maXJlX29mZnNldHNbKmZpcmVfY291bnRdOworCWJ1ZisrOworCWNtZCA9ICgqYnVmICYgMHhGRkZGMDAwMCkgPj4gMTY7CisJVklBX1dSSVRFKEhDX1JFR19UUkFOU19TRVQgKyBIQ19SRUdfQkFTRSwgKmJ1ZisrKTsKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBIQ19QYXJhVHlwZV9DbWRWZGF0YToKKwkJd2hpbGUgKChidWYgPCBidWZfZW5kKSAmJgorCQkgICAgICAgKCpmaXJlX2NvdW50IDwgZGV2X3ByaXYtPm51bV9maXJlX29mZnNldHMpICYmIAorCQkgICAgICAgKCpidWYgJiBIQ19BQ01EX01BU0spID09IEhDX0FDTURfSENtZEIgKSB7CisJCQl3aGlsZShidWYgPD0gbmV4dF9maXJlKSB7CisJCQkJVklBX1dSSVRFKEhDX1JFR19UUkFOU19TUEFDRSArIEhDX1JFR19CQVNFICsgKGJ1cnN0ICYgNjMpLCAqYnVmKyspOworCQkJCWJ1cnN0ICs9IDQ7CisJCQl9CisJCQlpZiAoICggYnVmIDwgYnVmX2VuZCApICYmICgoKmJ1ZiAmIEhBTENZT05fRklSRU1BU0spID09IEhBTENZT05fRklSRUNNRCkpCisJCQkJYnVmKys7CisKKwkJCWlmICgrKygqZmlyZV9jb3VudCkgPCBkZXZfcHJpdi0+bnVtX2ZpcmVfb2Zmc2V0cykgCisJCQkJbmV4dF9maXJlID0gZGV2X3ByaXYtPmZpcmVfb2Zmc2V0c1sqZmlyZV9jb3VudF07CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd2hpbGUoYnVmIDwgYnVmX2VuZCkgeworCQkJCisJCQlpZiAoICpidWYgPT0gSENfSEVBREVSMiB8fAorCQkJICAgICAoKmJ1ZiAmIEhBTENZT05fSEVBREVSMU1BU0spID09IEhBTENZT05fSEVBREVSMSAgfHwKKwkJCSAgICAgKCpidWYgJiBWSUFfVklERU9NQVNLKSA9PSBWSUFfVklERU9fSEVBREVSNSB8fAorCQkJICAgICAoKmJ1ZiAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI2ICkgYnJlYWs7CisJCQkKKwkJCVZJQV9XUklURShIQ19SRUdfVFJBTlNfU1BBQ0UgKyBIQ19SRUdfQkFTRSArIChidXJzdCAmIDYzKSwgKmJ1ZisrKTsKKwkJCWJ1cnN0ICs9NDsKKwkJfQorCX0KKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworfQorCisKKworc3RhdGljIF9faW5saW5lX18gaW50Cit2ZXJpZnlfbW1pb19hZGRyZXNzKCB1aW50MzJfdCBhZGRyZXNzKQoreworCWlmICgoYWRkcmVzcyA+IDB4M0ZGKSAmJiAoYWRkcmVzcyA8IDB4QzAwICkpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIFZJREVPIERNQSBjb21tYW5kLiAiCisJCQkgICJBdHRlbXB0IHRvIGFjY2VzcyAzRC0gb3IgY29tbWFuZCBidXJzdCBhcmVhLlxuIik7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoKGFkZHJlc3MgPiAweENGRikgJiYgKGFkZHJlc3MgPCAweDEzMDApKSB7CisJCURSTV9FUlJPUigiSW52YWxpZCBWSURFTyBETUEgY29tbWFuZC4gIgorCQkJICAiQXR0ZW1wdCB0byBhY2Nlc3MgUENJIERNQSBhcmVhLlxuIik7CisJCXJldHVybiAxOwkJCisJfSBlbHNlIGlmIChhZGRyZXNzID4gMHgxM0ZGICkgeworCQlEUk1fRVJST1IoIkludmFsaWQgVklERU8gRE1BIGNvbW1hbmQuICIKKwkJCSAgIkF0dGVtcHQgdG8gYWNjZXNzIFZHQSByZWdpc3RlcnMuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3ZlcmlmeV92aWRlb190YWlsKCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQsIHVpbnQzMl90IGR3b3JkcykgCit7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisKKwlpZiAoYnVmX2VuZCAtIGJ1ZiA8IGR3b3JkcykgeworCQlEUk1fRVJST1IoIklsbGVnYWwgdGVybWluYXRpb24gb2YgdmlkZW8gY29tbWFuZC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJd2hpbGUgKGR3b3Jkcy0tKSB7CisJCWlmICgqYnVmKyspIHsKKwkJCURSTV9FUlJPUigiSWxsZWdhbCB2aWRlbyBjb21tYW5kIHRhaWwuXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIDA7Cit9CisJCQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfY2hlY2tfaGVhZGVyMSggdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kICkKK3sKKwl1aW50MzJfdCBjbWQ7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisJdmVyaWZpZXJfc3RhdGVfdCByZXQgPSBzdGF0ZV9jb21tYW5kOworCisJd2hpbGUgKGJ1ZiA8IGJ1Zl9lbmQpIHsKKwkJY21kID0gKmJ1ZjsKKwkJaWYgKChjbWQgPiAoKDB4M0ZGID4+IDIpIHwgSEFMQ1lPTl9IRUFERVIxKSkgJiYKKwkJICAgIChjbWQgPCAoKDB4QzAwID4+IDIpIHwgSEFMQ1lPTl9IRUFERVIxKSkpIHsJCQkKKwkJCWlmICgoY21kICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgIT0gSEFMQ1lPTl9IRUFERVIxKSAKKwkJCQlicmVhazsKKwkJCURSTV9FUlJPUigiSW52YWxpZCBIQUxDWU9OX0hFQURFUjEgY29tbWFuZC4gIgorCQkJCSAgIkF0dGVtcHQgdG8gYWNjZXNzIDNELSBvciBjb21tYW5kIGJ1cnN0IGFyZWEuXG4iKTsKKwkJCXJldCA9IHN0YXRlX2Vycm9yOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoY21kID4gKCgweENGRiA+PiAyKSB8IEhBTENZT05fSEVBREVSMSkpIHsKKwkJCWlmICgoY21kICYgSEFMQ1lPTl9IRUFERVIxTUFTSykgIT0gSEFMQ1lPTl9IRUFERVIxKSAKKwkJCQlicmVhazsKKwkJCURSTV9FUlJPUigiSW52YWxpZCBIQUxDWU9OX0hFQURFUjEgY29tbWFuZC4gIgorCQkJCSAgIkF0dGVtcHQgdG8gYWNjZXNzIFZHQSByZWdpc3RlcnMuXG4iKTsKKwkJCXJldCA9IHN0YXRlX2Vycm9yOworCQkJYnJlYWs7CQkJCisJCX0gZWxzZSB7CQkJCisJCQlidWYgKz0gMjsKKwkJfQorCX0KKwkqYnVmZmVyID0gYnVmOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9wYXJzZV9oZWFkZXIxKCBkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYsIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCApCit7CisJcmVnaXN0ZXIgdWludDMyX3QgY21kOworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCisJd2hpbGUgKGJ1ZiA8IGJ1Zl9lbmQpIHsKKwkJY21kID0gKmJ1ZjsKKwkJaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSAhPSBIQUxDWU9OX0hFQURFUjEpIGJyZWFrOworCQlWSUFfV1JJVEUoIChjbWQgJiB+SEFMQ1lPTl9IRUFERVIxTUFTSykgPDwgMiwgKisrYnVmKTsgCisJCWJ1ZisrOworCX0KKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfY2hlY2tfdmhlYWRlcjUoIHVpbnQzMl90IGNvbnN0ICoqYnVmZmVyLCBjb25zdCB1aW50MzJfdCAqYnVmX2VuZCApCit7CisJdWludDMyX3QgZGF0YTsKKwljb25zdCB1aW50MzJfdCAqYnVmID0gKmJ1ZmZlcjsKKworCWlmIChidWZfZW5kIC0gYnVmIDwgNCkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgdGVybWluYXRpb24gb2YgdmlkZW8gaGVhZGVyNSBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKworCWRhdGEgPSAqYnVmKysgJiB+VklBX1ZJREVPTUFTSzsKKwlpZiAodmVyaWZ5X21taW9fYWRkcmVzcyhkYXRhKSkKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCisJZGF0YSA9ICpidWYrKzsKKwlpZiAoKmJ1ZisrICE9IDB4MDBGNTAwMDApIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIGhlYWRlcjUgaGVhZGVyIGRhdGFcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWlmICgqYnVmKysgIT0gMHgwMDAwMDAwMCkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgaGVhZGVyNSBoZWFkZXIgZGF0YVxuIik7CisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwl9CisJaWYgKGVhdF93b3JkcygmYnVmLCBidWZfZW5kLCBkYXRhKSkgCisJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwlpZiAoKGRhdGEgJiAzKSAmJiB2ZXJpZnlfdmlkZW9fdGFpbCgmYnVmLCBidWZfZW5kLCA0IC0gKGRhdGEgJiAzKSkpIAorCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gc3RhdGVfY29tbWFuZDsKKwkgICAgICAgCit9IAorCitzdGF0aWMgX19pbmxpbmVfXyB2ZXJpZmllcl9zdGF0ZV90Cit2aWFfcGFyc2VfdmhlYWRlcjUoIGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgdWludDMyX3QgY29uc3QgKipidWZmZXIsIGNvbnN0IHVpbnQzMl90ICpidWZfZW5kICkKK3sKKyAgdWludDMyX3QgYWRkciwgY291bnQsIGk7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisJCisJYWRkciA9ICpidWYrKyAmIH5WSUFfVklERU9NQVNLOworCWkgPSBjb3VudCA9ICpidWY7CisJYnVmICs9IDM7CisJd2hpbGUoaS0tKSB7CisJCVZJQV9XUklURShhZGRyLCAqYnVmKyspOworCX0KKwlpZiAoY291bnQgJiAzKSBidWYgKz0gNCAtIChjb3VudCAmIDMpOworCSpidWZmZXIgPSBidWY7CisJcmV0dXJuIHN0YXRlX2NvbW1hbmQ7CSAgICAgICAKK30gCisKKworc3RhdGljIF9faW5saW5lX18gdmVyaWZpZXJfc3RhdGVfdAordmlhX2NoZWNrX3ZoZWFkZXI2KCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgKQoreworCXVpbnQzMl90IGRhdGE7CisJY29uc3QgdWludDMyX3QgKmJ1ZiA9ICpidWZmZXI7CisJdWludDMyX3QgaTsKKworCisJaWYgKGJ1Zl9lbmQgLSBidWYgPCA0KSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCB0ZXJtaW5hdGlvbiBvZiB2aWRlbyBoZWFkZXI2IGNvbW1hbmRcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWJ1ZisrOworCWRhdGEgPSAqYnVmKys7CisJaWYgKCpidWYrKyAhPSAweDAwRjYwMDAwKSB7CisJCURSTV9FUlJPUigiSWxsZWdhbCBoZWFkZXI2IGhlYWRlciBkYXRhXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKwlpZiAoKmJ1ZisrICE9IDB4MDAwMDAwMDApIHsKKwkJRFJNX0VSUk9SKCJJbGxlZ2FsIGhlYWRlcjYgaGVhZGVyIGRhdGFcbiIpOworCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJfQorCWlmICgoYnVmX2VuZCAtIGJ1ZikgPCAoZGF0YSA8PCAxKSkgeworCQlEUk1fRVJST1IoIklsbGVnYWwgdGVybWluYXRpb24gb2YgdmlkZW8gaGVhZGVyNiBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIHN0YXRlX2Vycm9yOworCX0KKwlmb3IgKGk9MDsgaTxkYXRhOyArK2kpIHsKKwkJaWYgKHZlcmlmeV9tbWlvX2FkZHJlc3MoKmJ1ZisrKSkKKwkJCXJldHVybiBzdGF0ZV9lcnJvcjsKKwkJYnVmKys7CisJfQorCWRhdGEgPDw9IDE7CisJaWYgKChkYXRhICYgMykgJiYgdmVyaWZ5X3ZpZGVvX3RhaWwoJmJ1ZiwgYnVmX2VuZCwgNCAtIChkYXRhICYgMykpKQorCQlyZXR1cm4gc3RhdGVfZXJyb3I7CisJKmJ1ZmZlciA9IGJ1ZjsKKwlyZXR1cm4gc3RhdGVfY29tbWFuZDsKK30gCisKK3N0YXRpYyBfX2lubGluZV9fIHZlcmlmaWVyX3N0YXRlX3QKK3ZpYV9wYXJzZV92aGVhZGVyNiggZHJtX3ZpYV9wcml2YXRlX3QgKmRldl9wcml2LCB1aW50MzJfdCBjb25zdCAqKmJ1ZmZlciwgY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgKQoreworCisgIHVpbnQzMl90IGFkZHIsIGNvdW50LCBpOworCWNvbnN0IHVpbnQzMl90ICpidWYgPSAqYnVmZmVyOworCisJaSA9IGNvdW50ID0gKisrYnVmOworCWJ1ZiArPSAzOworCXdoaWxlKGktLSkgeworCQlhZGRyID0gKmJ1ZisrOworCQlWSUFfV1JJVEUoYWRkciwgKmJ1ZisrKTsKKwl9CisJY291bnQgPDw9IDE7CisJaWYgKGNvdW50ICYgMykgYnVmICs9IDQgLSAoY291bnQgJiAzKTsKKwkqYnVmZmVyID0gYnVmOworCXJldHVybiBzdGF0ZV9jb21tYW5kOworfSAKKworCisKK2ludCAKK3ZpYV92ZXJpZnlfY29tbWFuZF9zdHJlYW0oY29uc3QgdWludDMyX3QgKiBidWYsIHVuc2lnbmVkIGludCBzaXplLCBkcm1fZGV2aWNlX3QgKmRldiwKKwkJCSAgaW50IGFncCkKK3sKKworCWRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1fdmlhX3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCWRybV92aWFfc3RhdGVfdCAqaGNfc3RhdGUgPSAmZGV2X3ByaXYtPmhjX3N0YXRlOworCWRybV92aWFfc3RhdGVfdCBzYXZlZF9zdGF0ZSA9ICpoY19zdGF0ZTsKKwl1aW50MzJfdCBjbWQ7CisJY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgPSBidWYgKyAoIHNpemUgPj4gMiApOworCXZlcmlmaWVyX3N0YXRlX3Qgc3RhdGUgPSBzdGF0ZV9jb21tYW5kOworCWludCBwcm9fZ3JvdXBfYSA9IGRldl9wcml2LT5wcm9fZ3JvdXBfYTsKKwkKKwloY19zdGF0ZS0+ZGV2ID0gZGV2OworCWhjX3N0YXRlLT51bmZpbmlzaGVkID0gbm9fc2VxdWVuY2U7CisJaGNfc3RhdGUtPm1hcF9jYWNoZSA9IE5VTEw7CisJaGNfc3RhdGUtPmFncCA9IGFncDsKKwloY19zdGF0ZS0+YnVmX3N0YXJ0ID0gYnVmOworCWRldl9wcml2LT5udW1fZmlyZV9vZmZzZXRzID0gMDsKKworCXdoaWxlIChidWYgPCBidWZfZW5kKSB7CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIHN0YXRlX2hlYWRlcjI6CisJCSAgc3RhdGUgPSB2aWFfY2hlY2tfaGVhZGVyMiggJmJ1ZiwgYnVmX2VuZCwgaGNfc3RhdGUgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2hlYWRlcjE6CisJCQlzdGF0ZSA9IHZpYV9jaGVja19oZWFkZXIxKCAmYnVmLCBidWZfZW5kICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV92aGVhZGVyNToKKwkJCXN0YXRlID0gdmlhX2NoZWNrX3ZoZWFkZXI1KCAmYnVmLCBidWZfZW5kICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV92aGVhZGVyNjoKKwkJCXN0YXRlID0gdmlhX2NoZWNrX3ZoZWFkZXI2KCAmYnVmLCBidWZfZW5kICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV9jb21tYW5kOgorCQkJaWYgKEhBTENZT05fSEVBREVSMiA9PSAoY21kID0gKmJ1ZikpIAorCQkJCXN0YXRlID0gc3RhdGVfaGVhZGVyMjsKKwkJCWVsc2UgaWYgKChjbWQgJiBIQUxDWU9OX0hFQURFUjFNQVNLKSA9PSBIQUxDWU9OX0hFQURFUjEpIAorCQkJCXN0YXRlID0gc3RhdGVfaGVhZGVyMTsKKwkJCWVsc2UgaWYgKHByb19ncm91cF9hICYmIChjbWQgJiBWSUFfVklERU9NQVNLKSA9PSBWSUFfVklERU9fSEVBREVSNSkKKwkJCQlzdGF0ZSA9IHN0YXRlX3ZoZWFkZXI1OworCQkJZWxzZSBpZiAocHJvX2dyb3VwX2EgJiYgKGNtZCAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI2KQorCQkJCXN0YXRlID0gc3RhdGVfdmhlYWRlcjY7CisJCQllbHNlIHsKKwkJCQlEUk1fRVJST1IoIkludmFsaWQgLyBVbmltcGxlbWVudGVkIERNQSBIRUFERVIgY29tbWFuZC4gMHgleFxuIiwKKwkJCQkJICBjbWQpOworCQkJCXN0YXRlID0gc3RhdGVfZXJyb3I7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV9lcnJvcjoKKwkJZGVmYXVsdDoKKwkJCSpoY19zdGF0ZSA9IHNhdmVkX3N0YXRlOworCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsJCQkKKwkJfQorCX0JCisJaWYgKHN0YXRlID09IHN0YXRlX2Vycm9yKSB7CisJCSpoY19zdGF0ZSA9IHNhdmVkX3N0YXRlOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IAordmlhX3BhcnNlX2NvbW1hbmRfc3RyZWFtKGRybV9kZXZpY2VfdCAqZGV2LCBjb25zdCB1aW50MzJfdCAqIGJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCit7CisKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwl1aW50MzJfdCBjbWQ7CisJY29uc3QgdWludDMyX3QgKmJ1Zl9lbmQgPSBidWYgKyAoIHNpemUgPj4gMiApOworCXZlcmlmaWVyX3N0YXRlX3Qgc3RhdGUgPSBzdGF0ZV9jb21tYW5kOworCWludCBmaXJlX2NvdW50ID0gMDsKKwkKKwl3aGlsZSAoYnVmIDwgYnVmX2VuZCkgeworCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBzdGF0ZV9oZWFkZXIyOgorCQkgIHN0YXRlID0gdmlhX3BhcnNlX2hlYWRlcjIoIGRldl9wcml2LCAmYnVmLCBidWZfZW5kLCAmZmlyZV9jb3VudCApOworCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfaGVhZGVyMToKKwkJCXN0YXRlID0gdmlhX3BhcnNlX2hlYWRlcjEoIGRldl9wcml2LCAmYnVmLCBidWZfZW5kICk7CisJCQlicmVhazsKKwkJY2FzZSBzdGF0ZV92aGVhZGVyNToKKwkJCXN0YXRlID0gdmlhX3BhcnNlX3ZoZWFkZXI1KCBkZXZfcHJpdiwgJmJ1ZiwgYnVmX2VuZCApOworCQkJYnJlYWs7CisJCWNhc2Ugc3RhdGVfdmhlYWRlcjY6CisJCQlzdGF0ZSA9IHZpYV9wYXJzZV92aGVhZGVyNiggZGV2X3ByaXYsICZidWYsIGJ1Zl9lbmQgKTsKKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2NvbW1hbmQ6CisJCQlpZiAoSEFMQ1lPTl9IRUFERVIyID09IChjbWQgPSAqYnVmKSkgCisJCQkJc3RhdGUgPSBzdGF0ZV9oZWFkZXIyOworCQkJZWxzZSBpZiAoKGNtZCAmIEhBTENZT05fSEVBREVSMU1BU0spID09IEhBTENZT05fSEVBREVSMSkgCisJCQkJc3RhdGUgPSBzdGF0ZV9oZWFkZXIxOworCQkJZWxzZSBpZiAoKGNtZCAmIFZJQV9WSURFT01BU0spID09IFZJQV9WSURFT19IRUFERVI1KQorCQkJCXN0YXRlID0gc3RhdGVfdmhlYWRlcjU7CisJCQllbHNlIGlmICgoY21kICYgVklBX1ZJREVPTUFTSykgPT0gVklBX1ZJREVPX0hFQURFUjYpCisJCQkJc3RhdGUgPSBzdGF0ZV92aGVhZGVyNjsKKwkJCWVsc2UgeworCQkJCURSTV9FUlJPUigiSW52YWxpZCAvIFVuaW1wbGVtZW50ZWQgRE1BIEhFQURFUiBjb21tYW5kLiAweCV4XG4iLAorCQkJCQkgIGNtZCk7CisJCQkJc3RhdGUgPSBzdGF0ZV9lcnJvcjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIHN0YXRlX2Vycm9yOgorCQlkZWZhdWx0OgorCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsJCQkKKwkJfQorCX0JCisJaWYgKHN0YXRlID09IHN0YXRlX2Vycm9yKSB7CisJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CisJfQorCXJldHVybiAwOworfQorCisKKworc3RhdGljIHZvaWQgCitzZXR1cF9oYXphcmRfdGFibGUoaHpfaW5pdF90IGluaXRfdGFibGVbXSwgaGF6YXJkX3QgdGFibGVbXSwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IoaT0wOyBpPDI1NjsgKytpKSB7CisJCXRhYmxlW2ldID0gZm9yYmlkZGVuX2NvbW1hbmQ7CisJfQorCisJZm9yKGk9MDsgaTxzaXplOyArK2kpIHsKKwkJdGFibGVbaW5pdF90YWJsZVtpXS5jb2RlXSA9IGluaXRfdGFibGVbaV0uaHo7CisJfQorfQorCit2b2lkIAordmlhX2luaXRfY29tbWFuZF92ZXJpZmllciggdm9pZCApCit7CisJc2V0dXBfaGF6YXJkX3RhYmxlKGluaXRfdGFibGUxLCB0YWJsZTEsIHNpemVvZihpbml0X3RhYmxlMSkgLyBzaXplb2YoaHpfaW5pdF90KSk7CisJc2V0dXBfaGF6YXJkX3RhYmxlKGluaXRfdGFibGUyLCB0YWJsZTIsIHNpemVvZihpbml0X3RhYmxlMikgLyBzaXplb2YoaHpfaW5pdF90KSk7CisJc2V0dXBfaGF6YXJkX3RhYmxlKGluaXRfdGFibGUzLCB0YWJsZTMsIHNpemVvZihpbml0X3RhYmxlMykgLyBzaXplb2YoaHpfaW5pdF90KSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3ZpYV92ZXJpZmllci5oIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGUxMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2RybS92aWFfdmVyaWZpZXIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDQgVGhlIFVuaWNocm9tZSBQcm9qZWN0LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCisgKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucworICogb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIFVOSUNIUk9NRSBQUk9KRUNULCBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3I6IFRob21hcyBIZWxsc3Ry9m0gMjAwNC4KKyAqLworCisjaWZuZGVmIF9WSUFfVkVSSUZJRVJfSF8KKyNkZWZpbmUgX1ZJQV9WRVJJRklFUl9IXworCit0eXBlZGVmIGVudW17CisJbm9fc2VxdWVuY2UgPSAwLCAKKwl6X2FkZHJlc3MsCisJZGVzdF9hZGRyZXNzLAorCXRleF9hZGRyZXNzCit9ZHJtX3ZpYV9zZXF1ZW5jZV90OworCisKKwordHlwZWRlZiBzdHJ1Y3R7CisJdW5zaWduZWQgdGV4dHVyZTsKKwl1aW50MzJfdCB6X2FkZHI7IAorCXVpbnQzMl90IGRfYWRkcjsgCisgICAgICAgIHVpbnQzMl90IHRfYWRkclsyXVsxMF07CisJdWludDMyX3QgcGl0Y2hbMl1bMTBdOworCXVpbnQzMl90IGhlaWdodFsyXVsxMF07CisJdWludDMyX3QgdGV4X2xldmVsX2xvWzJdOyAKKwl1aW50MzJfdCB0ZXhfbGV2ZWxfaGlbMl07CisJdWludDMyX3QgdGV4X3BhbGV0dGVfc2l6ZVsyXTsKKwlkcm1fdmlhX3NlcXVlbmNlX3QgdW5maW5pc2hlZDsKKwlpbnQgYWdwX3RleHR1cmU7CisJaW50IG11bHRpdGV4OworCWRybV9kZXZpY2VfdCAqZGV2OworCWRybV9tYXBfdCAqbWFwX2NhY2hlOworCXVpbnQzMl90IHZlcnRleF9jb3VudDsKKwlpbnQgYWdwOworCWNvbnN0IHVpbnQzMl90ICpidWZfc3RhcnQ7Cit9IGRybV92aWFfc3RhdGVfdDsKKworZXh0ZXJuIGludCB2aWFfdmVyaWZ5X2NvbW1hbmRfc3RyZWFtKGNvbnN0IHVpbnQzMl90ICogYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwgCisJCQkJICAgICBkcm1fZGV2aWNlX3QgKmRldiwgaW50IGFncCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS92aWFfdmlkZW8uYyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhNjFjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vdmlhX3ZpZGVvLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA1IFRob21hcyBIZWxsc3Ryb20uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCisgKiBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SKFMpLCBBTkQvT1IgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICogQXV0aG9yOiBUaG9tYXMgSGVsbHN0cm9tIDIwMDUuCisgKgorICogVmlkZW8gYW5kIFh2TUMgcmVsYXRlZCBmdW5jdGlvbnMuCisgKi8KKworI2luY2x1ZGUgImRybVAuaCIKKyNpbmNsdWRlICJ2aWFfZHJtLmgiCisjaW5jbHVkZSAidmlhX2Rydi5oIgorCit2b2lkCit2aWFfaW5pdF9mdXRleChkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlEUk1fREVCVUcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChpID0gMDsgaSA8IFZJQV9OUl9YVk1DX0xPQ0tTOyArK2kpIHsKKwkJRFJNX0lOSVRfV0FJVFFVRVVFKCYoZGV2X3ByaXYtPmRlY29kZXJfcXVldWVbaV0pKTsKKwkJWFZNQ0xPQ0tQVFIoZGV2X3ByaXYtPnNhcmVhX3ByaXYsIGkpLT5sb2NrID0gMDsKKwl9Cit9CisKK3ZvaWQKK3ZpYV9jbGVhbnVwX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdikKK3sKK30JCisKK3ZvaWQKK3ZpYV9yZWxlYXNlX2Z1dGV4KGRybV92aWFfcHJpdmF0ZV90ICpkZXZfcHJpdiwgaW50IGNvbnRleHQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdm9sYXRpbGUgaW50ICpsb2NrOworCisJZm9yIChpPTA7IGkgPCBWSUFfTlJfWFZNQ19MT0NLUzsgKytpKSB7CisJICAgICAgICBsb2NrID0gKGludCAqKSBYVk1DTE9DS1BUUihkZXZfcHJpdi0+c2FyZWFfcHJpdiwgaSk7CisJCWlmICggKF9EUk1fTE9DS0lOR19DT05URVhUKCAqbG9jayApID09IGNvbnRleHQpKSB7CisJCQlpZiAoX0RSTV9MT0NLX0lTX0hFTEQoICpsb2NrICkgJiYgKCpsb2NrICYgX0RSTV9MT0NLX0NPTlQpKSB7CisJCQkJRFJNX1dBS0VVUCggJihkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtpXSkpOworCQkJfQorCQkJKmxvY2sgPSAwOworCQl9CisJfQkKK30JCisKK2ludCAKK3ZpYV9kZWNvZGVyX2Z1dGV4KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX3ZpYV9mdXRleF90IGZ4OworCXZvbGF0aWxlIGludCAqbG9jazsKKwlkcm1fdmlhX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSAoZHJtX3ZpYV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKKwlkcm1fdmlhX3NhcmVhX3QgKnNBUHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OworCWludCByZXQgPSAwOworCisJRFJNX0RFQlVHKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChmeCwgKGRybV92aWFfZnV0ZXhfdCAqKSBkYXRhLCBzaXplb2YoZngpKTsKKworCWlmIChmeC5sb2NrID4gVklBX05SX1hWTUNfTE9DS1MpCisJCXJldHVybiAtRUZBVUxUOworCisJbG9jayA9IChpbnQgKilYVk1DTE9DS1BUUihzQVByaXYsIGZ4LmxvY2spOworCisJc3dpdGNoIChmeC5mdW5jKSB7CisJY2FzZSBWSUFfRlVURVhfV0FJVDoKKwkJRFJNX1dBSVRfT04ocmV0LCBkZXZfcHJpdi0+ZGVjb2Rlcl9xdWV1ZVtmeC5sb2NrXSwKKwkJCSAgICAoZngubXMgLyAxMCkgKiAoRFJNX0haIC8gMTAwKSwgKmxvY2sgIT0gZngudmFsKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIFZJQV9GVVRFWF9XQUtFOgorCQlEUk1fV0FLRVVQKCYoZGV2X3ByaXYtPmRlY29kZXJfcXVldWVbZngubG9ja10pKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHMxNjIwLmMgYi9kcml2ZXJzL2NoYXIvZHMxNjIwLmMKaW5kZXggN2RlZjZhZC4uNjJjZGEyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RzMTYyMC5jCisrKyBiL2RyaXZlcnMvY2hhci9kczE2MjAuYwpAQCAtMTYzLDggKzE2Myw3IEBACiAJbmV0d2luZGVyX2RzMTYyMF9yZXNldCgpOwogCW5ldHdpbmRlcl91bmxvY2soJmZsYWdzKTsKIAotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dCgyKTsKKwltc2xlZXAoMjApOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRzMTYyMF9pbihpbnQgY21kLCBpbnQgYml0cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9mdGFwZS9jb21wcmVzc29yL3pmdGFwZS1jb21wcmVzcy5jIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKaW5kZXggMjIwYTIyNy4uNjVmZmMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKKysrIGIvZHJpdmVycy9jaGFyL2Z0YXBlL2NvbXByZXNzb3IvemZ0YXBlLWNvbXByZXNzLmMKQEAgLTExNzYsOCArMTE3Niw4IEBACiAgICAgICAgIH0KICNlbHNlIC8qICFNT0RVTEUgKi8KIAkvKiBwcmludCBhIHNob3J0IG5vLW5vbnNlbnNlIGJvb3QgbWVzc2FnZSAqLwotCXByaW50aygiemZ0YXBlIGNvbXByZXNzb3IgdjEuMDBhIDk3MDUxNFxuIik7Ci0JcHJpbnRrKCJGb3IgdXNlIHdpdGggIiBGVEFQRV9WRVJTSU9OICJcbiIpOworCXByaW50ayhLRVJOX0lORk8gInpmdGFwZSBjb21wcmVzc29yIHYxLjAwYSA5NzA1MTRcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkZvciB1c2Ugd2l0aCAiIEZUQVBFX1ZFUlNJT04gIlxuIik7CiAjZW5kaWYgLyogTU9EVUxFICovCiAJVFJBQ0UoZnRfdF9pbmZvLCAiemZ0X2NvbXByZXNzb3JfaW5pdCBAIDB4JXAiLCB6ZnRfY29tcHJlc3Nvcl9pbml0KTsKIAlUUkFDRShmdF90X2luZm8sICJpbnN0YWxsaW5nIGNvbXByZXNzb3IgZm9yIHpmdGFwZSAuLi4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ocGV0LmMgYi9kcml2ZXJzL2NoYXIvaHBldC5jCmluZGV4IDVlYzczMmUuLjc2MmZhNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ocGV0LmMKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtODM0LDcgKzgzNCw3IEBACiAJcHJpbnRrKCJcbiIpOwogCiAJbnMgPSBocGV0cC0+aHBfcGVyaW9kOwkvKiBmZW1wdG9zZWNvbmRzLCAxMF4tMTUgKi8KLQlkb19kaXYobnMsIDEwMDAwMDApOwkvKiBjb252ZXJ0IHRvIG5hbm9zZWNvbmRzLCAxMF4tOSAqLworCW5zIC89IDEwMDAwMDA7CQkvKiBjb252ZXJ0IHRvIG5hbm9zZWNvbmRzLCAxMF4tOSAqLwogCXByaW50ayhLRVJOX0lORk8gImhwZXQlZDogJWxkbnMgdGljaywgJWQgJWQtYml0IHRpbWVyc1xuIiwKIAkJaHBldHAtPmhwX3doaWNoLCBucywgaHBldHAtPmhwX250aW1lciwKIAkJY2FwICYgSFBFVF9DT1VOVEVSX1NJWkVfTUFTSyA/IDY0IDogMzIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwppbmRleCA4OGNkODU4Li5jZGRiNzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYwpAQCAtMjIsNiArMjIsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNDAsNyArNDEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaHZjb25zb2xlLmg+Ci0jaW5jbHVkZSA8YXNtL3Zpby5oPgogCiAjZGVmaW5lIEhWQ19NQUpPUgkyMjkKICNkZWZpbmUgSFZDX01JTk9SCTAKQEAgLTYxLDE2ICs2MSwyMSBAQAogICovCiAjZGVmaW5lIEhWQ19BTExPQ19UVFlfQURBUFRFUlMJOAogCi1zdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKmh2Y19kcml2ZXI7Ci0jaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCi1zdGF0aWMgaW50IHN5c3JxX3ByZXNzZWQ7Ci0jZW5kaWYKLQogI2RlZmluZSBOX09VVEJVRgkxNgogI2RlZmluZSBOX0lOQlVGCQkxNgogCiAjZGVmaW5lIF9fQUxJR05FRF9fCV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDgpKSkKIAorc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpodmNfZHJpdmVyOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqaHZjX3Rhc2s7CisKKy8qIFBpY2tzIHVwIGxhdGUga2lja3MgYWZ0ZXIgbGlzdCB3YWxrIGJ1dCBiZWZvcmUgc2NoZWR1bGUoKSAqLworc3RhdGljIGludCBodmNfa2lja2VkOworCisjaWZkZWYgQ09ORklHX01BR0lDX1NZU1JRCitzdGF0aWMgaW50IHN5c3JxX3ByZXNzZWQ7CisjZW5kaWYKKwogc3RydWN0IGh2Y19zdHJ1Y3QgewogCXNwaW5sb2NrX3QgbG9jazsKIAlpbnQgaW5kZXg7CkBAIC04MCwxMSArODUsMTEgQEAKIAljaGFyIG91dGJ1ZltOX09VVEJVRl0gX19BTElHTkVEX187CiAJaW50IG5fb3V0YnVmOwogCXVpbnQzMl90IHZ0ZXJtbm87CisJc3RydWN0IGh2X29wcyAqb3BzOwogCWludCBpcnFfcmVxdWVzdGVkOwogCWludCBpcnE7CiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0OwogCXN0cnVjdCBrb2JqZWN0IGtvYmo7IC8qIHJlZiBjb3VudCAmIGh2Y19zdHJ1Y3QgbGlmZXRpbWUgKi8KLQlzdHJ1Y3QgdmlvX2RldiAqdmRldjsKIH07CiAKIC8qIGR5bmFtaWMgbGlzdCBvZiBodmNfc3RydWN0IGluc3RhbmNlcyAqLwpAQCAtOTcsNDggKzEwMiwxMSBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhodmNfc3RydWN0c19sb2NrKTsKIAogLyoKLSAqIEluaXRpYWwgY29uc29sZSB2dGVybW5vcyBmb3IgY29uc29sZSBBUEkgdXNhZ2UgcHJpb3IgdG8gZnVsbCBjb25zb2xlCi0gKiBpbml0aWFsaXphdGlvbi4gIEFueSB2dHkgYWRhcHRlciBvdXRzaWRlIHRoaXMgcmFuZ2Ugd2lsbCBub3QgaGF2ZSB1c2FibGUKLSAqIGNvbnNvbGUgaW50ZXJmYWNlcyBidXQgY2FuIHN0aWxsIGJlIHVzZWQgYXMgYSB0dHkgZGV2aWNlLiAgVGhpcyBoYXMgdG8gYmUKLSAqIHN0YXRpYyBiZWNhdXNlIGttYWxsb2Mgd2lsbCBub3Qgd29yayBkdXJpbmcgZWFybHkgY29uc29sZSBpbml0LgorICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGFzc2lnbiBhIHR0eS0+aW5kZXggdmFsdWUgdG8gYSBodmNfc3RydWN0IGJhc2VkCisgKiB1cG9uIG9yZGVyIG9mIGV4cG9zdXJlIHZpYSBodmNfcHJvYmUoKSwgd2hlbiB3ZSBjYW4gbm90IG1hdGNoIGl0IHRvCisgKiBhIGNvbnNvbGUgY2FuaWRhdGUgcmVnaXN0ZXJlZCB3aXRoIGh2Y19pbnN0YW50aWF0ZSgpLgogICovCi1zdGF0aWMgdWludDMyX3QgdnRlcm1ub3NbTUFYX05SX0hWQ19DT05TT0xFU107Ci0KLS8qIFVzZWQgZm9yIGFjY291bnRpbmcgcHVycG9zZXMgKi8KLXN0YXRpYyBpbnQgbnVtX3Z0ZXJtcyA9IDA7Ci0KLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh2Y190YXNrOwotCi0vKgotICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIHR0eS0+aW5kZXggdmFsdWUgdG8gYSBodmNfc3RydWN0IGJhc2VkCi0gKiB1cG9uIG9yZGVyIG9mIGV4cG9zdXJlIHZpYSBodmNfcHJvYmUoKS4KLSAqLwotc3RhdGljIGludCBodmNfY291bnQgPSAtMTsKLQotLyogUGlja3MgdXAgbGF0ZSBraWNrcyBhZnRlciBsaXN0IHdhbGsgYnV0IGJlZm9yZSBzY2hlZHVsZSgpICovCi1zdGF0aWMgaW50IGh2Y19raWNrZWQ7Ci0KLS8qIFdha2UgdGhlIHNsZWVwaW5nIGtodmNkICovCi1zdGF0aWMgdm9pZCBodmNfa2ljayh2b2lkKQotewotCWh2Y19raWNrZWQgPSAxOwotCXdha2VfdXBfcHJvY2VzcyhodmNfdGFzayk7Ci19Ci0KLS8qCi0gKiBOT1RFOiBUaGlzIEFQSSBpc24ndCB1c2VkIGlmIHRoZSBjb25zb2xlIGFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0IGludGVycnVwdHMuCi0gKiBJbiB0aGlzIGNhc2UgdGhlIGNvbnNvbGUgaXMgcG9sbCBkcml2ZW4uCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBodmNfaGFuZGxlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWh2Y19raWNrKCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZCBodmNfdW50aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCWh2Y19raWNrKCk7Ci19CitzdGF0aWMgaW50IGxhc3RfaHZjID0gLTE7CiAKIC8qCiAgKiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggZWl0aGVyIHRoZSBodmNfc3RydWNzdF9sb2NrIG9yIHRoZSBodmNfc3RydWN0CkBAIC0xNjgsNiArMTM2LDE3OCBAQAogCXJldHVybiBocDsKIH0KIAorCisvKgorICogSW5pdGlhbCBjb25zb2xlIHZ0ZXJtbm9zIGZvciBjb25zb2xlIEFQSSB1c2FnZSBwcmlvciB0byBmdWxsIGNvbnNvbGUKKyAqIGluaXRpYWxpemF0aW9uLiAgQW55IHZ0eSBhZGFwdGVyIG91dHNpZGUgdGhpcyByYW5nZSB3aWxsIG5vdCBoYXZlIHVzYWJsZQorICogY29uc29sZSBpbnRlcmZhY2VzIGJ1dCBjYW4gc3RpbGwgYmUgdXNlZCBhcyBhIHR0eSBkZXZpY2UuICBUaGlzIGhhcyB0byBiZQorICogc3RhdGljIGJlY2F1c2Uga21hbGxvYyB3aWxsIG5vdCB3b3JrIGR1cmluZyBlYXJseSBjb25zb2xlIGluaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaHZfb3BzICpjb25zX29wc1tNQVhfTlJfSFZDX0NPTlNPTEVTXTsKK3N0YXRpYyB1aW50MzJfdCB2dGVybW5vc1tNQVhfTlJfSFZDX0NPTlNPTEVTXSA9CisJe1swIC4uLiBNQVhfTlJfSFZDX0NPTlNPTEVTIC0gMV0gPSAtMX07CisKKy8qCisgKiBDb25zb2xlIEFQSXMsIE5PVCBUVFkuICBUaGVzZSBBUElzIGFyZSBhdmFpbGFibGUgaW1tZWRpYXRlbHkgd2hlbgorICogaHZjX2NvbnNvbGVfc2V0dXAoKSBmaW5kcyBhZGFwdGVycy4KKyAqLworCit2b2lkIGh2Y19jb25zb2xlX3ByaW50KHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYiwgdW5zaWduZWQgY291bnQpCit7CisJY2hhciBjWzE2XSBfX0FMSUdORURfXzsKKwl1bnNpZ25lZCBpID0gMCwgbiA9IDA7CisJaW50IHIsIGRvbmVjciA9IDAsIGluZGV4ID0gY28tPmluZGV4OworCisJLyogQ29uc29sZSBhY2Nlc3MgYXR0ZW1wdCBvdXRzaWRlIG9mIGFjY2VwdGFibGUgY29uc29sZSByYW5nZS4gKi8KKwlpZiAoaW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuOworCisJLyogVGhpcyBjb25zb2xlIGFkYXB0ZXIgd2FzIHJlbW92ZWQgc28gaXQgaXMgbm90IHVzZWFibGUuICovCisJaWYgKHZ0ZXJtbm9zW2luZGV4XSA8IDApCisJCXJldHVybjsKKworCXdoaWxlIChjb3VudCA+IDAgfHwgaSA+IDApIHsKKwkJaWYgKGNvdW50ID4gMCAmJiBpIDwgc2l6ZW9mKGMpKSB7CisJCQlpZiAoYltuXSA9PSAnXG4nICYmICFkb25lY3IpIHsKKwkJCQljW2krK10gPSAnXHInOworCQkJCWRvbmVjciA9IDE7CisJCQl9IGVsc2UgeworCQkJCWNbaSsrXSA9IGJbbisrXTsKKwkJCQlkb25lY3IgPSAwOworCQkJCS0tY291bnQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyID0gY29uc19vcHNbaW5kZXhdLT5wdXRfY2hhcnModnRlcm1ub3NbaW5kZXhdLCBjLCBpKTsKKwkJCWlmIChyIDwgMCkgeworCQkJCS8qIHRocm93IGF3YXkgY2hhcnMgb24gZXJyb3IgKi8KKwkJCQlpID0gMDsKKwkJCX0gZWxzZSBpZiAociA+IDApIHsKKwkJCQlpIC09IHI7CisJCQkJaWYgKGkgPiAwKQorCQkJCQltZW1tb3ZlKGMsIGMrciwgaSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQoreworCWlmICh2dGVybW5vc1tjLT5pbmRleF0gPT0gLTEpCisJCXJldHVybiBOVUxMOworCisJKmluZGV4ID0gYy0+aW5kZXg7CisJcmV0dXJuIGh2Y19kcml2ZXI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGh2Y19jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3sKKwlpZiAoY28tPmluZGV4IDwgMCB8fCBjby0+aW5kZXggPj0gTUFYX05SX0hWQ19DT05TT0xFUykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAodnRlcm1ub3NbY28tPmluZGV4XSA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNvbnNvbGUgaHZjX2Nvbl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImh2YyIsCisJLndyaXRlCQk9IGh2Y19jb25zb2xlX3ByaW50LAorCS5kZXZpY2UJCT0gaHZjX2NvbnNvbGVfZGV2aWNlLAorCS5zZXR1cAkJPSBodmNfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKK307CisKKy8qCisgKiBFYXJseSBjb25zb2xlIGluaXRpYWxpemF0aW9uLiAgUHJlY2VlZHMgZHJpdmVyIGluaXRpYWxpemF0aW9uLgorICoKKyAqICgxKSB3ZSBhcmUgZmlyc3QsIGFuZCB0aGUgdXNlciBzcGVjaWZpZWQgYW5vdGhlciBkcml2ZXIKKyAqIC0tIGluZGV4IHdpbGwgcmVtYWluIC0xCisgKiAoMikgd2UgYXJlIGZpcnN0IGFuZCB0aGUgdXNlciBzcGVjaWZpZWQgbm8gZHJpdmVyCisgKiAtLSBpbmRleCB3aWxsIGJlIHNldCB0byAwLCB0aGVuIHdlIHdpbGwgZmFpbCBzZXR1cC4KKyAqICgzKSAgd2UgYXJlIGZpcnN0IGFuZCB0aGUgdXNlciBzcGVjaWZpZWQgb3VyIGRyaXZlcgorICogLS0gaW5kZXggd2lsbCBiZSBzZXQgdG8gdXNlciBzcGVjaWZpZWQgZHJpdmVyLCBhbmQgd2Ugd2lsbCBmYWlsCisgKiAoNCkgd2UgYXJlIGFmdGVyIGRyaXZlciwgYW5kIHRoaXMgaW5pdGNhbGwgd2lsbCByZWdpc3RlciB1cworICogLS0gaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBkcml2ZXIgdGhlbiB0aGUgY29uc29sZSB3aWxsIG1hdGNoCisgKgorICogTm90ZSB0aGF0IGZvciBjYXNlcyAyIGFuZCAzLCB3ZSB3aWxsIG1hdGNoIGxhdGVyIHdoZW4gdGhlIGlvIGRyaXZlcgorICogY2FsbHMgaHZjX2luc3RhbnRpYXRlKCkgYW5kIGNhbGwgcmVnaXN0ZXIgYWdhaW4uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGh2Y19jb25zb2xlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9jb25zb2xlKCZodmNfY29uX2RyaXZlcik7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGh2Y19jb25zb2xlX2luaXQpOworCisvKgorICogaHZjX2luc3RhbnRpYXRlKCkgaXMgYW4gZWFybHkgY29uc29sZSBkaXNjb3ZlcnkgbWV0aG9kIHdoaWNoIGxvY2F0ZXMKKyAqIGNvbnNvbGVzICogcHJpb3IgdG8gdGhlIHZpbyBzdWJzeXN0ZW0gZGlzY292ZXJpbmcgdGhlbS4gIEhvdHBsdWdnZWQKKyAqIHZ0eSBhZGFwdGVycyBkbyBOT1QgZ2V0IGFuIGh2Y19pbnN0YW50aWF0ZSgpIGNhbGxiYWNrIHNpbmNlIHRoZXkKKyAqIGFwcGVhciBhZnRlciBlYXJseSBjb25zb2xlIGluaXQuCisgKi8KK2ludCBodmNfaW5zdGFudGlhdGUodWludDMyX3QgdnRlcm1ubywgaW50IGluZGV4LCBzdHJ1Y3QgaHZfb3BzICpvcHMpCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwOworCisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodnRlcm1ub3NbaW5kZXhdICE9IC0xKQorCQlyZXR1cm4gLTE7CisKKwkvKiBtYWtlIHN1cmUgbm8gbm8gdHR5IGhhcyBiZWVuIHJlZ2lzdGVyZCBpbiB0aGlzIGluZGV4ICovCisJaHAgPSBodmNfZ2V0X2J5X2luZGV4KGluZGV4KTsKKwlpZiAoaHApIHsKKwkJa29iamVjdF9wdXQoJmhwLT5rb2JqKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZ0ZXJtbm9zW2luZGV4XSA9IHZ0ZXJtbm87CisJY29uc19vcHNbaW5kZXhdID0gb3BzOworCisJLyogcmVzZXJ2ZSBhbGwgaW5kaWNlcyB1cHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBpbmRleCAqLworCWlmIChsYXN0X2h2YyA8IGluZGV4KQorCQlsYXN0X2h2YyA9IGluZGV4OworCisJLyogaWYgdGhpcyBpbmRleCBpcyB3aGF0IHRoZSB1c2VyIHJlcXVlc3RlZCwgdGhlbiByZWdpc3RlcgorCSAqIG5vdyAoc2V0dXAgd29uJ3QgZmFpbCBhdCB0aGlzIHBvaW50KS4gIEl0J3Mgb2sgdG8ganVzdAorCSAqIGNhbGwgcmVnaXN0ZXIgYWdhaW4gaWYgcHJldmlvdXNseSAuc2V0dXAgZmFpbGVkLgorCSAqLworCWlmIChpbmRleCA9PSBodmNfY29uX2RyaXZlci5pbmRleCkKKwkJcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGh2Y19pbnN0YW50aWF0ZSk7CisKKy8qIFdha2UgdGhlIHNsZWVwaW5nIGtodmNkICovCitzdGF0aWMgdm9pZCBodmNfa2ljayh2b2lkKQoreworCWh2Y19raWNrZWQgPSAxOworCXdha2VfdXBfcHJvY2VzcyhodmNfdGFzayk7Cit9CisKK3N0YXRpYyBpbnQgaHZjX3BvbGwoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKTsKKworLyoKKyAqIE5PVEU6IFRoaXMgQVBJIGlzbid0IHVzZWQgaWYgdGhlIGNvbnNvbGUgYWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgaW50ZXJydXB0cy4KKyAqIEluIHRoaXMgY2FzZSB0aGUgY29uc29sZSBpcyBwb2xsIGRyaXZlbi4KKyAqLworc3RhdGljIGlycXJldHVybl90IGh2Y19oYW5kbGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogaWYgaHZjX3BvbGwgcmVxdWVzdCBhIHJlcG9sbCwgdGhlbiBraWNrIHRoZSBodmNkIHRocmVhZCAqLworCWlmIChodmNfcG9sbChkZXZfaW5zdGFuY2UpKQorCQlodmNfa2ljaygpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgaHZjX3VudGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlodmNfa2ljaygpOworfQorCiAvKgogICogVGhlIFRUWSBpbnRlcmZhY2Ugd29uJ3QgYmUgdXNlZCB1bnRpbCBhZnRlciB0aGUgdmlvIGxheWVyIGhhcyBleHBvc2VkIHRoZSB2dHkKICAqIGFkYXB0ZXIgdG8gdGhlIGtlcm5lbC4KQEAgLTMyOSw3ICs0NjksNyBAQAogewogCWludCBuOwogCi0JbiA9IGh2Y19wdXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGhwLT5vdXRidWYsIGhwLT5uX291dGJ1Zik7CisJbiA9IGhwLT5vcHMtPnB1dF9jaGFycyhocC0+dnRlcm1ubywgaHAtPm91dGJ1ZiwgaHAtPm5fb3V0YnVmKTsKIAlpZiAobiA8PSAwKSB7CiAJCWlmIChuID09IDApCiAJCQlyZXR1cm47CkBAIC00NjcsNyArNjA3LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJbiA9IGh2Y19nZXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGJ1ZiwgY291bnQpOworCQluID0gaHAtPm9wcy0+Z2V0X2NoYXJzKGhwLT52dGVybW5vLCBidWYsIGNvdW50KTsKIAkJaWYgKG4gPD0gMCkgewogCQkJLyogSGFuZ3VwIHRoZSB0dHkgd2hlbiBkaXNjb25uZWN0ZWQgZnJvbSBob3N0ICovCiAJCQlpZiAobiA9PSAtRVBJUEUpIHsKQEAgLTQ3OSwxNCArNjE5LDE3IEBACiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQotCQkJLyogSGFuZGxlIHRoZSBTeXNScSBIYWNrICovCi0JCQlpZiAoYnVmW2ldID09ICdceDBmJykgewkvKiBeTyAtLSBzaG91bGQgc3VwcG9ydCBhIHNlcXVlbmNlICovCi0JCQkJc3lzcnFfcHJlc3NlZCA9IDE7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKHN5c3JxX3ByZXNzZWQpIHsKLQkJCQloYW5kbGVfc3lzcnEoYnVmW2ldLCBOVUxMLCB0dHkpOwotCQkJCXN5c3JxX3ByZXNzZWQgPSAwOwotCQkJCWNvbnRpbnVlOworCQkJaWYgKGhwLT5pbmRleCA9PSBodmNfY29uX2RyaXZlci5pbmRleCkgeworCQkJCS8qIEhhbmRsZSB0aGUgU3lzUnEgSGFjayAqLworCQkJCS8qIFhYWCBzaG91bGQgc3VwcG9ydCBhIHNlcXVlbmNlICovCisJCQkJaWYgKGJ1ZltpXSA9PSAnXHgwZicpIHsJLyogXk8gKi8KKwkJCQkJc3lzcnFfcHJlc3NlZCA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSBpZiAoc3lzcnFfcHJlc3NlZCkgeworCQkJCQloYW5kbGVfc3lzcnEoYnVmW2ldLCBOVUxMLCB0dHkpOworCQkJCQlzeXNycV9wcmVzc2VkID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQogCQkJfQogI2VuZGlmIC8qIENPTkZJR19NQUdJQ19TWVNSUSAqLwogCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBidWZbaV0sIDApOwpAQCAtNDk3LDggKzY0MCw4IEBACiAKIAkJLyoKIAkJICogQWNjb3VudCBmb3IgdGhlIHRvdGFsIGFtb3VudCByZWFkIGluIG9uZSBsb29wLCBhbmQgaWYgYWJvdmUKLQkJICogNjQgYnl0ZXMsIHdlIGRvIGEgcXVpY2sgc2NoZWR1bGUgbG9vcCB0byBsZXQgdGhlIHR0eSBncm9rIHRoZQotCQkgKiBkYXRhIGFuZCBldmVudHVhbGx5IHRocm90dGxlIHVzLgorCQkgKiA2NCBieXRlcywgd2UgZG8gYSBxdWljayBzY2hlZHVsZSBsb29wIHRvIGxldCB0aGUgdHR5IGdyb2sKKwkJICogdGhlIGRhdGEgYW5kIGV2ZW50dWFsbHkgdGhyb3R0bGUgdXMuCiAJCSAqLwogCQlyZWFkX3RvdGFsICs9IG47CiAJCWlmIChyZWFkX3RvdGFsID49IDY0KSB7CkBAIC01NDIsNyArNjg1LDYgQEAKIAkJaWYgKGNwdXNfZW1wdHkoY3B1c19pbl94bW9uKSkgewogCQkJc3Bpbl9sb2NrKCZodmNfc3RydWN0c19sb2NrKTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoaHAsICZodmNfc3RydWN0cywgbmV4dCkgewotCQkJCS8qaHAgPSBsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBodmNfc3RydWN0LCAqIG5leHQpOyAqLwogCQkJCXBvbGxfbWFzayB8PSBodmNfcG9sbChocCk7CiAJCQl9CiAJCQlzcGluX3VubG9jaygmaHZjX3N0cnVjdHNfbG9jayk7CkBAIC01NzcsMTQgKzcxOSw2IEBACiAJLmNoYXJzX2luX2J1ZmZlciA9IGh2Y19jaGFyc19pbl9idWZmZXIsCiB9OwogCi1jaGFyIGh2Y19kcml2ZXJfbmFtZVtdID0gImh2Y19jb25zb2xlIjsKLQotc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGh2Y19kcml2ZXJfdGFibGVbXSBfX2RldmluaXRkYXRhPSB7Ci0JeyJzZXJpYWwiLCAiaHZ0ZXJtMSJ9LAotCXsgTlVMTCwgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCBodmNfZHJpdmVyX3RhYmxlKTsKLQogLyogY2FsbGJhY2sgd2hlbiB0aGUga2JvamVjdCByZWYgY291bnQgcmVhY2hlcyB6ZXJvLiAqLwogc3RhdGljIHZvaWQgZGVzdHJveV9odmNfc3RydWN0KHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewpAQCAtNjA2LDQxICs3NDAsNTEgQEAKIAkucmVsZWFzZSA9IGRlc3Ryb3lfaHZjX3N0cnVjdCwKIH07CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IGh2Y19wcm9iZSgKLQkJc3RydWN0IHZpb19kZXYgKmRldiwKLQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkKQorc3RydWN0IGh2Y19zdHJ1Y3QgX19kZXZpbml0ICpodmNfYWxsb2ModWludDMyX3QgdnRlcm1ubywgaW50IGlycSwKKwkJCQkJc3RydWN0IGh2X29wcyAqb3BzKQogewogCXN0cnVjdCBodmNfc3RydWN0ICpocDsKLQotCS8qIHByb2JlZCB3aXRoIGludmFsaWQgcGFyYW1ldGVycy4gKi8KLQlpZiAoIWRldiB8fCAhaWQpCi0JCXJldHVybiAtRVBFUk07CisJaW50IGk7CiAKIAlocCA9IGttYWxsb2Moc2l6ZW9mKCpocCksIEdGUF9LRVJORUwpOwogCWlmICghaHApCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCW1lbXNldChocCwgMHgwMCwgc2l6ZW9mKCpocCkpOwotCWhwLT52dGVybW5vID0gZGV2LT51bml0X2FkZHJlc3M7Ci0JaHAtPnZkZXYgPSBkZXY7Ci0JaHAtPnZkZXYtPmRldi5kcml2ZXJfZGF0YSA9IGhwOwotCWhwLT5pcnEgPSBkZXYtPmlycTsKKworCWhwLT52dGVybW5vID0gdnRlcm1ubzsKKwlocC0+aXJxID0gaXJxOworCWhwLT5vcHMgPSBvcHM7CiAKIAlrb2JqZWN0X2luaXQoJmhwLT5rb2JqKTsKIAlocC0+a29iai5rdHlwZSA9ICZodmNfa29ial90eXBlOwogCiAJc3Bpbl9sb2NrX2luaXQoJmhwLT5sb2NrKTsKIAlzcGluX2xvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOwotCWhwLT5pbmRleCA9ICsraHZjX2NvdW50OworCisJLyoKKwkgKiBmaW5kIGluZGV4IHRvIHVzZToKKwkgKiBzZWUgaWYgdGhpcyB2dGVybSBpZCBtYXRjaGVzIG9uZSByZWdpc3RlcmVkIGZvciBjb25zb2xlLgorCSAqLworCWZvciAoaT0wOyBpIDwgTUFYX05SX0hWQ19DT05TT0xFUzsgaSsrKQorCQlpZiAodnRlcm1ub3NbaV0gPT0gaHAtPnZ0ZXJtbm8pCisJCQlicmVhazsKKworCS8qIG5vIG1hdGNoaW5nIHNsb3QsIGp1c3QgdXNlIGEgY291bnRlciAqLworCWlmIChpID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCisJCWkgPSArK2xhc3RfaHZjOworCisJaHAtPmluZGV4ID0gaTsKKwogCWxpc3RfYWRkX3RhaWwoJihocC0+bmV4dCksICZodmNfc3RydWN0cyk7CiAJc3Bpbl91bmxvY2soJmh2Y19zdHJ1Y3RzX2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGhwOwogfQorRVhQT1JUX1NZTUJPTChodmNfYWxsb2MpOwogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBodmNfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpCitpbnQgX19kZXZleGl0IGh2Y19yZW1vdmUoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKQogewotCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IGRldi0+ZGV2LmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGtvYmplY3QgKmtvYmpwOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CkBAIC02NzMsMjMgKzgxNywxNCBAQAogCQl0dHlfaGFuZ3VwKHR0eSk7CiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlvX2RyaXZlciBodmNfdmlvX2RyaXZlciA9IHsKLQkubmFtZQkJPSBodmNfZHJpdmVyX25hbWUsCi0JLmlkX3RhYmxlCT0gaHZjX2RyaXZlcl90YWJsZSwKLQkucHJvYmUJCT0gaHZjX3Byb2JlLAotCS5yZW1vdmUJCT0gaHZjX3JlbW92ZSwKLX07CitFWFBPUlRfU1lNQk9MKGh2Y19yZW1vdmUpOwogCiAvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24uICBGb2xsb3cgY29uc29sZSBpbml0aWFsaXphdGlvbi4gIFRoaXMgaXMgd2hlcmUgdGhlIFRUWQogICogaW50ZXJmYWNlcyBzdGFydCB0byBiZWNvbWUgYXZhaWxhYmxlLiAqLwogaW50IF9faW5pdCBodmNfaW5pdCh2b2lkKQogewotCWludCByYzsKLQotCS8qIFdlIG5lZWQgbW9yZSB0aGFuIG51bV92dGVybXMgYWRhcHRlcnMgZHVlIHRvIGhvdHBsdWcgYWRkaXRpb25zLiAqLworCS8qIFdlIG5lZWQgbW9yZSB0aGFuIGh2Y19jb3VudCBhZGFwdGVycyBkdWUgdG8gaG90cGx1ZyBhZGRpdGlvbnMuICovCiAJaHZjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoSFZDX0FMTE9DX1RUWV9BREFQVEVSUyk7Ci0JLyogaHZjX2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIobnVtX3Z0ZXJtcyk7ICovCiAJaWYgKCFodmNfZHJpdmVyKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNzE2LDExNiArODUxLDIwIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCS8qIFJlZ2lzdGVyIGFzIGEgdmlvIGRldmljZSB0byByZWNlaXZlIGNhbGxiYWNrcyAqLwotCXJjID0gdmlvX3JlZ2lzdGVyX2RyaXZlcigmaHZjX3Zpb19kcml2ZXIpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQorbW9kdWxlX2luaXQoaHZjX2luaXQpOwogCi0vKiBUaGlzIGlzbid0IHBhcnRpY3VsYXJpbHkgbmVjZXNzYXJ5IGR1ZSB0byB0aGlzIGJlaW5nIGEgY29uc29sZSBkcml2ZXIgYnV0IGl0Ci0gKiBpcyBuaWNlIHRvIGJlIHRob3JvdWdoICovCisvKiBUaGlzIGlzbid0IHBhcnRpY3VsYXJpbHkgbmVjZXNzYXJ5IGR1ZSB0byB0aGlzIGJlaW5nIGEgY29uc29sZSBkcml2ZXIKKyAqIGJ1dCBpdCBpcyBuaWNlIHRvIGJlIHRob3JvdWdoLgorICovCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHZjX2V4aXQodm9pZCkKIHsKIAlrdGhyZWFkX3N0b3AoaHZjX3Rhc2spOwogCi0JdmlvX3VucmVnaXN0ZXJfZHJpdmVyKCZodmNfdmlvX2RyaXZlcik7CiAJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKGh2Y19kcml2ZXIpOwogCS8qIHJldHVybiB0dHlfc3RydWN0IGluc3RhbmNlcyBhbGxvY2F0ZWQgaW4gaHZjX2luaXQoKS4gKi8KIAlwdXRfdHR5X2RyaXZlcihodmNfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX2NvbnNvbGUoJmh2Y19jb25fZHJpdmVyKTsKIH0KLQotLyoKLSAqIENvbnNvbGUgQVBJcywgTk9UIFRUWS4gIFRoZXNlIEFQSXMgYXJlIGF2YWlsYWJsZSBpbW1lZGlhdGVseSB3aGVuCi0gKiBodmNfY29uc29sZV9zZXR1cCgpIGZpbmRzIGFkYXB0ZXJzLgotICovCi0KLS8qCi0gKiBodmNfaW5zdGFudGlhdGUoKSBpcyBhbiBlYXJseSBjb25zb2xlIGRpc2NvdmVyeSBtZXRob2Qgd2hpY2ggbG9jYXRlcyBjb25zb2xlcwotICogcHJpb3IgdG8gdGhlIHZpbyBzdWJzeXN0ZW0gZGlzY292ZXJpbmcgdGhlbS4gIEhvdHBsdWdnZWQgdnR5IGFkYXB0ZXJzIGRvIE5PVAotICogZ2V0IGFuIGh2Y19pbnN0YW50aWF0ZSgpIGNhbGxiYWNrIHNpbmNlIHRoZSBhcHBlYXIgYWZ0ZXIgZWFybHkgY29uc29sZSBpbml0LgotICovCi1pbnQgaHZjX2luc3RhbnRpYXRlKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpbmRleCkKLXsKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE1BWF9OUl9IVkNfQ09OU09MRVMpCi0JCXJldHVybiAtMTsKLQotCWlmICh2dGVybW5vc1tpbmRleF0gIT0gLTEpCi0JCXJldHVybiAtMTsKLQotCXZ0ZXJtbm9zW2luZGV4XSA9IHZ0ZXJtbm87Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaHZjX2NvbnNvbGVfcHJpbnQoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpiLCB1bnNpZ25lZCBjb3VudCkKLXsKLQljaGFyIGNbMTZdIF9fQUxJR05FRF9fOwotCXVuc2lnbmVkIGkgPSAwLCBuID0gMDsKLQlpbnQgciwgZG9uZWNyID0gMDsKLQotCS8qIENvbnNvbGUgYWNjZXNzIGF0dGVtcHQgb3V0c2lkZSBvZiBhY2NlcHRhYmxlIGNvbnNvbGUgcmFuZ2UuICovCi0JaWYgKGNvLT5pbmRleCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQotCQlyZXR1cm47Ci0KLQkvKiBUaGlzIGNvbnNvbGUgYWRhcHRlciB3YXMgcmVtb3ZlZCBzbyBpdCBpcyBub3QgdXNlYWJsZS4gKi8KLQlpZiAodnRlcm1ub3NbY28tPmluZGV4XSA8IDApCi0JCXJldHVybjsKLQotCXdoaWxlIChjb3VudCA+IDAgfHwgaSA+IDApIHsKLQkJaWYgKGNvdW50ID4gMCAmJiBpIDwgc2l6ZW9mKGMpKSB7Ci0JCQlpZiAoYltuXSA9PSAnXG4nICYmICFkb25lY3IpIHsKLQkJCQljW2krK10gPSAnXHInOwotCQkJCWRvbmVjciA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWNbaSsrXSA9IGJbbisrXTsKLQkJCQlkb25lY3IgPSAwOwotCQkJCS0tY291bnQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyID0gaHZjX3B1dF9jaGFycyh2dGVybW5vc1tjby0+aW5kZXhdLCBjLCBpKTsKLQkJCWlmIChyIDwgMCkgewotCQkJCS8qIHRocm93IGF3YXkgY2hhcnMgb24gZXJyb3IgKi8KLQkJCQlpID0gMDsKLQkJCX0gZWxzZSBpZiAociA+IDApIHsKLQkJCQlpIC09IHI7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQltZW1tb3ZlKGMsIGMrciwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqaHZjX2NvbnNvbGVfZGV2aWNlKHN0cnVjdCBjb25zb2xlICpjLCBpbnQgKmluZGV4KQotewotCSppbmRleCA9IGMtPmluZGV4OwotCXJldHVybiBodmNfZHJpdmVyOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBodmNfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBjb25zb2xlIGh2Y19jb25fZHJpdmVyID0gewotCS5uYW1lCQk9ICJodmMiLAotCS53cml0ZQkJPSBodmNfY29uc29sZV9wcmludCwKLQkuZGV2aWNlCQk9IGh2Y19jb25zb2xlX2RldmljZSwKLQkuc2V0dXAJCT0gaHZjX2NvbnNvbGVfc2V0dXAsCi0JLmZsYWdzCQk9IENPTl9QUklOVEJVRkZFUiwKLQkuaW5kZXgJCT0gLTEsCi19OwotCi0vKiBFYXJseSBjb25zb2xlIGluaXRpYWxpemF0aW9uLiAgUHJlY2VlZHMgZHJpdmVyIGluaXRpYWxpemF0aW9uLiAqLwotc3RhdGljIGludCBfX2luaXQgaHZjX2NvbnNvbGVfaW5pdCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpPTA7IGk8TUFYX05SX0hWQ19DT05TT0xFUzsgaSsrKQotCQl2dGVybW5vc1tpXSA9IC0xOwotCW51bV92dGVybXMgPSBodmNfZmluZF92dHlzKCk7Ci0JcmVnaXN0ZXJfY29uc29sZSgmaHZjX2Nvbl9kcml2ZXIpOwotCXJldHVybiAwOwotfQotY29uc29sZV9pbml0Y2FsbChodmNfY29uc29sZV9pbml0KTsKLQotbW9kdWxlX2luaXQoaHZjX2luaXQpOwogbW9kdWxlX2V4aXQoaHZjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2Y192aW8uYyBiL2RyaXZlcnMvY2hhci9odmNfdmlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiYjkxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9odmNfdmlvLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiB2aW8gZHJpdmVyIGludGVyZmFjZSB0byBodmNfY29uc29sZS5jCisgKgorICogVGhpcyBjb2RlIHdhcyBtb3ZlZCBoZXJlIHRvIGFsbG93IHRoZSByZW1haW5nIGNvZGUgdG8gYmUgcmV1c2VkIGFzIGEKKyAqIGdlbmVyaWMgcG9sbGluZyBtb2RlIHdpdGggc2VtaS1yZWxpYWJsZSB0cmFuc3BvcnQgZHJpdmVyIGNvcmUgdG8gdGhlCisgKiBjb25zb2xlIGFuZCB0dHkgc3Vic3lzdGVtcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEFudG9uIEJsYW5jaGFyZCA8YW50b25AYXUuaWJtLmNvbT4sIElCTQorICogQ29weXJpZ2h0IChDKSAyMDAxIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAYXUuaWJtLmNvbT4sIElCTQorICogQ29weXJpZ2h0IChDKSAyMDA0IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4sIElCTSBDb3JwLgorICogQ29weXJpZ2h0IChDKSAyMDA0IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEFkZGl0aW9uYWwgQXV0aG9yKHMpOgorICogIFJ5YW4gUy4gQXJub2xkIDxyc2FAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2h2Y29uc29sZS5oPgorI2luY2x1ZGUgPGFzbS92aW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCitjaGFyIGh2Y19kcml2ZXJfbmFtZVtdID0gImh2Y19jb25zb2xlIjsKKworc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIGh2Y19kcml2ZXJfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsic2VyaWFsIiwgImh2dGVybTEifSwKKwl7IE5VTEwsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHZpbywgaHZjX2RyaXZlcl90YWJsZSk7CisKK3N0YXRpYyBpbnQgZmlsdGVyZWRfZ2V0X2NoYXJzKHVpbnQzMl90IHZ0ZXJtbm8sIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZ290OworCWludCBpOworCisJZ290ID0gaHZjX2dldF9jaGFycyh2dGVybW5vLCBidWYsIGNvdW50KTsKKworCS8qCisJICogV29yayBhcm91bmQgYSBIViBidWcgd2hlcmUgaXQgZ2l2ZXMgdXMgYSBudWxsCisJICogYWZ0ZXIgZXZlcnkgXHIuICAtLSBwYXVsdXMKKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgZ290OyArK2kpIHsKKwkJaWYgKGJ1ZltpXSA9PSAwICYmIGJ1ZltpLTFdID09ICdccicpIHsKKwkJCS0tZ290OworCQkJaWYgKGkgPCBnb3QpCisJCQkJbWVtbW92ZSgmYnVmW2ldLCAmYnVmW2krMV0sCisJCQkJCWdvdCAtIGkpOworCQl9CisJfQorCXJldHVybiBnb3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHZfb3BzIGh2Y19nZXRfcHV0X29wcyA9IHsKKwkuZ2V0X2NoYXJzID0gZmlsdGVyZWRfZ2V0X2NoYXJzLAorCS5wdXRfY2hhcnMgPSBodmNfcHV0X2NoYXJzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaHZjX3Zpb19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGh2Y19zdHJ1Y3QgKmhwOworCisJLyogcHJvYmVkIHdpdGggaW52YWxpZCBwYXJhbWV0ZXJzLiAqLworCWlmICghdmRldiB8fCAhaWQpCisJCXJldHVybiAtRVBFUk07CisKKwlocCA9IGh2Y19hbGxvYyh2ZGV2LT51bml0X2FkZHJlc3MsIHZkZXYtPmlycSwgJmh2Y19nZXRfcHV0X29wcyk7CisJaWYgKElTX0VSUihocCkpCisJCXJldHVybiBQVFJfRVJSKGhwKTsKKwlkZXZfc2V0X2RydmRhdGEoJnZkZXYtPmRldiwgaHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGh2Y192aW9fcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2KQoreworCXN0cnVjdCBodmNfc3RydWN0ICpocCA9IGRldl9nZXRfZHJ2ZGF0YSgmdmRldi0+ZGV2KTsKKworCXJldHVybiBodmNfcmVtb3ZlKGhwKTsKK30KKworc3RhdGljIHN0cnVjdCB2aW9fZHJpdmVyIGh2Y192aW9fZHJpdmVyID0geworCS5uYW1lCQk9IGh2Y19kcml2ZXJfbmFtZSwKKwkuaWRfdGFibGUJPSBodmNfZHJpdmVyX3RhYmxlLAorCS5wcm9iZQkJPSBodmNfdmlvX3Byb2JlLAorCS5yZW1vdmUJCT0gaHZjX3Zpb19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgaHZjX3Zpb19pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJLyogUmVnaXN0ZXIgYXMgYSB2aW8gZGV2aWNlIHRvIHJlY2VpdmUgY2FsbGJhY2tzICovCisJcmMgPSB2aW9fcmVnaXN0ZXJfZHJpdmVyKCZodmNfdmlvX2RyaXZlcik7CisKKwlyZXR1cm4gcmM7Cit9Cittb2R1bGVfaW5pdChodmNfdmlvX2luaXQpOyAvKiBhZnRlciBkcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyAqLworCitzdGF0aWMgdm9pZCBodmNfdmlvX2V4aXQodm9pZCkKK3sKKwl2aW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmh2Y192aW9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGh2Y192aW9fZXhpdCk7CisKKy8qIHRoZSBkZXZpY2UgdHJlZSBvcmRlciBkZWZpbmVzIG91ciBudW1iZXJpbmcgKi8KK3N0YXRpYyBpbnQgaHZjX2ZpbmRfdnR5cyh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdnR5OworCWludCBudW1fZm91bmQgPSAwOworCisJZm9yICh2dHkgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidnR5Iik7IHZ0eSAhPSBOVUxMOworCQkJdnR5ID0gb2ZfZmluZF9ub2RlX2J5X25hbWUodnR5LCAidnR5IikpIHsKKwkJdWludDMyX3QgKnZ0ZXJtbm87CisKKwkJLyogV2UgaGF2ZSBzdGF0aWNhbGx5IGRlZmluZWQgc3BhY2UgZm9yIG9ubHkgYSBjZXJ0YWluIG51bWJlcgorCQkgKiBvZiBjb25zb2xlIGFkYXB0ZXJzLgorCQkgKi8KKwkJaWYgKG51bV9mb3VuZCA+PSBNQVhfTlJfSFZDX0NPTlNPTEVTKQorCQkJYnJlYWs7CisKKwkJdnRlcm1ubyA9ICh1aW50MzJfdCAqKWdldF9wcm9wZXJ0eSh2dHksICJyZWciLCBOVUxMKTsKKwkJaWYgKCF2dGVybW5vKQorCQkJY29udGludWU7CisKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKHZ0eSwgImh2dGVybTEiKSkgeworCQkJaHZjX2luc3RhbnRpYXRlKCp2dGVybW5vLCBudW1fZm91bmQsICZodmNfZ2V0X3B1dF9vcHMpOworCQkJKytudW1fZm91bmQ7CisJCX0KKwl9CisKKwlyZXR1cm4gbnVtX2ZvdW5kOworfQorY29uc29sZV9pbml0Y2FsbChodmNfZmluZF92dHlzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odnNpLmMgYi9kcml2ZXJzL2NoYXIvaHZzaS5jCmluZGV4IGYxZjExOTIuLmEyMmFhOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odnNpLmMKKysrIGIvZHJpdmVycy9jaGFyL2h2c2kuYwpAQCAtMjkxLDE1ICsyOTEsMTMgQEAKIAlkdW1wX2hleChwYWNrZXQsIGhlYWRlci0+bGVuKTsKIH0KIAotLyogY2FuJ3QgdXNlIGh2Y19nZXRfY2hhcnMgYmVjYXVzZSB0aGF0IHN0cmlwcyBDUnMgKi8KIHN0YXRpYyBpbnQgaHZzaV9yZWFkKHN0cnVjdCBodnNpX3N0cnVjdCAqaHAsIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgZ290OwogCi0JaWYgKHBscGFyX2hjYWxsKEhfR0VUX1RFUk1fQ0hBUiwgaHAtPnZ0ZXJtbm8sIDAsIDAsIDAsICZnb3QsCi0JCQkodW5zaWduZWQgbG9uZyAqKWJ1ZiwgKHVuc2lnbmVkIGxvbmcgKilidWYrMSkgPT0gSF9TdWNjZXNzKQotCQlyZXR1cm4gZ290OwotCXJldHVybiAwOworCWdvdCA9IGh2Y19nZXRfY2hhcnMoaHAtPnZ0ZXJtbm8sIGJ1ZiwgY291bnQpOworCisJcmV0dXJuIGdvdDsKIH0KIAogc3RhdGljIHZvaWQgaHZzaV9yZWN2X2NvbnRyb2woc3RydWN0IGh2c2lfc3RydWN0ICpocCwgdWludDhfdCAqcGFja2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS5jCmluZGV4IDdlNmFjMTQuLjM0ODA1MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20uYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tLmMKQEAgLTU3OSw3ICs1NzksNyBAQAogCiAJLyogUHJvYmUgZm9yIEludGVsLCBBTUQgUk5HcyAqLwogCWZvcl9lYWNoX3BjaV9kZXYocGRldikgewotCQllbnQgPSBwY2lfbWF0Y2hfZGV2aWNlIChybmdfcGNpX3RibCwgcGRldik7CisJCWVudCA9IHBjaV9tYXRjaF9pZChybmdfcGNpX3RibCwgcGRldik7CiAJCWlmIChlbnQpIHsKIAkJCXJuZ19vcHMgPSAmcm5nX3ZlbmRvcl9vcHNbZW50LT5kcml2ZXJfZGF0YV07CiAJCQlnb3RvIG1hdGNoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2k4ay5jIGIvZHJpdmVycy9jaGFyL2k4ay5jCmluZGV4IGE4MTE5NzYuLjZjNGIzZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pOGsuYworKysgYi9kcml2ZXJzL2NoYXIvaThrLmMKQEAgLTIwLDEzICsyMCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9hcG1fYmlvcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2k4ay5oPgogCi0jZGVmaW5lIEk4S19WRVJTSU9OCQkiMS4xMyAxNC8wNS8yMDAyIgorI2RlZmluZSBJOEtfVkVSU0lPTgkJIjEuMTQgMjEvMDIvMjAwNSIKIAogI2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKICNkZWZpbmUgSThLX1NNTV9QT1dFUl9TVEFUVVMJMHgwMDY5CkBAIC0zNCw3ICszNSw4IEBACiAjZGVmaW5lIEk4S19TTU1fR0VUX0ZBTgkJMHgwMGEzCiAjZGVmaW5lIEk4S19TTU1fR0VUX1NQRUVECTB4MDJhMwogI2RlZmluZSBJOEtfU01NX0dFVF9URU1QCTB4MTBhMwotI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRwkweGZmYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfREVMTF9TSUcxCTB4ZmVhMworI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRzIJMHhmZmEzCiAjZGVmaW5lIEk4S19TTU1fQklPU19WRVJTSU9OCTB4MDBhNgogCiAjZGVmaW5lIEk4S19GQU5fTVVMVAkJMzAKQEAgLTUyLDE4ICs1NCw3IEBACiAKICNkZWZpbmUgSThLX1RFTVBFUkFUVVJFX0JVRwkxCiAKLSNkZWZpbmUgREVMTF9TSUdOQVRVUkUJCSJEZWxsIENvbXB1dGVyIgotCi1zdGF0aWMgY2hhciAqc3VwcG9ydGVkX21vZGVsc1tdID0gewotICAgICJJbnNwaXJvbiIsCi0gICAgIkxhdGl0dWRlIiwKLSAgICBOVUxMCi19OwotCi1zdGF0aWMgY2hhciBzeXN0ZW1fdmVuZG9yWzQ4XSA9ICI/IjsKLXN0YXRpYyBjaGFyIHByb2R1Y3RfbmFtZSBbNDhdID0gIj8iOwotc3RhdGljIGNoYXIgYmlvc192ZXJzaW9uIFs0XSAgPSAiPyI7Ci1zdGF0aWMgY2hhciBzZXJpYWxfbnVtYmVyWzE2XSA9ICI/IjsKK3N0YXRpYyBjaGFyIGJpb3NfdmVyc2lvbls0XTsKIAogTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgYWNjZXNzaW5nIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcyIpOwpAQCAtNzMsNiArNjQsMTAgQEAKIG1vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgbG9hZGluZyB3aXRob3V0IGNoZWNraW5nIGZvciBzdXBwb3J0ZWQgbW9kZWxzIik7CiAKK3N0YXRpYyBpbnQgaWdub3JlX2RtaTsKK21vZHVsZV9wYXJhbShpZ25vcmVfZG1pLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2RtaSwgIkNvbnRpbnVlIHByb2JpbmcgaGFyZHdhcmUgZXZlbiBpZiBETUkgZGF0YSBkb2VzIG5vdCBtYXRjaCIpOworCiBzdGF0aWMgaW50IHJlc3RyaWN0ZWQ7CiBtb2R1bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKQEAgLTgxLDY5ICs3Niw2OSBAQAogbW9kdWxlX3BhcmFtKHBvd2VyX3N0YXR1cywgYm9vbCwgMDYwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3N0YXR1cywgIlJlcG9ydCBwb3dlciBzdGF0dXMgaW4gL3Byb2MvaThrIik7CiAKLXN0YXRpYyBzc2l6ZV90IGk4a19yZWFkKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IGk4a19pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LAogCQkgICAgIHVuc2lnbmVkIGxvbmcpOwogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpOGtfZm9wcyA9IHsKLSAgICAucmVhZAk9IGk4a19yZWFkLAotICAgIC5pb2N0bAk9IGk4a19pb2N0bCwKKwkub3BlbgkJPSBpOGtfb3Blbl9mcywKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorCS5pb2N0bAkJPSBpOGtfaW9jdGwsCiB9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgaW50IGVheDsKLSAgICB1bnNpZ25lZCBpbnQgZWJ4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1bnNpZ25lZCBpbnQgZWN4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1bnNpZ25lZCBpbnQgZWR4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1bnNpZ25lZCBpbnQgZXNpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSAgICB1bnNpZ25lZCBpbnQgZWRpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLX0gU01NUmVnaXN0ZXJzOworc3RydWN0IHNtbV9yZWdzIHsKKwl1bnNpZ25lZCBpbnQgZWF4OworCXVuc2lnbmVkIGludCBlYnggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlY3ggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlZHggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlc2kgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCXVuc2lnbmVkIGludCBlZGkgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHU4CXR5cGU7Ci0gICAgdTgJbGVuZ3RoOwotICAgIHUxNgloYW5kbGU7Ci19IERNSUhlYWRlcjsKK3N0YXRpYyBpbmxpbmUgY2hhciAqaThrX2dldF9kbWlfZGF0YShpbnQgZmllbGQpCit7CisJcmV0dXJuIGRtaV9nZXRfc3lzdGVtX2luZm8oZmllbGQpID8gOiAiTi9BIjsKK30KIAogLyoKICAqIENhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBKb25hdGhhbiBCdXp6YXJkLgogICovCi1zdGF0aWMgaW50IGk4a19zbW0oU01NUmVnaXN0ZXJzICpyZWdzKQorc3RhdGljIGludCBpOGtfc21tKHN0cnVjdCBzbW1fcmVncyAqcmVncykKIHsKLSAgICBpbnQgcmM7Ci0gICAgaW50IGVheCA9IHJlZ3MtPmVheDsKKwlpbnQgcmM7CisJaW50IGVheCA9IHJlZ3MtPmVheDsKIAotICAgIGFzbSgicHVzaGwgJSVlYXhcblx0IiBcCi0JIm1vdmwgMCglJWVheCksJSVlZHhcblx0IiBcCi0JInB1c2ggJSVlZHhcblx0IiBcCi0JIm1vdmwgNCglJWVheCksJSVlYnhcblx0IiBcCi0JIm1vdmwgOCglJWVheCksJSVlY3hcblx0IiBcCi0JIm1vdmwgMTIoJSVlYXgpLCUlZWR4XG5cdCIgXAotCSJtb3ZsIDE2KCUlZWF4KSwlJWVzaVxuXHQiIFwKLQkibW92bCAyMCglJWVheCksJSVlZGlcblx0IiBcCi0JInBvcGwgJSVlYXhcblx0IiBcCi0JIm91dCAlJWFsLCQweGIyXG5cdCIgXAotCSJvdXQgJSVhbCwkMHg4NFxuXHQiIFwKLQkieGNoZ2wgJSVlYXgsKCUlZXNwKVxuXHQiCi0JIm1vdmwgJSVlYngsNCglJWVheClcblx0IiBcCi0JIm1vdmwgJSVlY3gsOCglJWVheClcblx0IiBcCi0JIm1vdmwgJSVlZHgsMTIoJSVlYXgpXG5cdCIgXAotCSJtb3ZsICUlZXNpLDE2KCUlZWF4KVxuXHQiIFwKLQkibW92bCAlJWVkaSwyMCglJWVheClcblx0IiBcCi0JInBvcGwgJSVlZHhcblx0IiBcCi0JIm1vdmwgJSVlZHgsMCglJWVheClcblx0IiBcCi0JImxhaGZcblx0IiBcCi0JInNocmwgJDgsJSVlYXhcblx0IiBcCi0JImFuZGwgJDEsJSVlYXhcbiIgXAotCTogIj1hIiAocmMpCi0JOiAiYSIgKHJlZ3MpCi0JOiAiJWVieCIsICIlZWN4IiwgIiVlZHgiLCAiJWVzaSIsICIlZWRpIiwgIm1lbW9yeSIpOworCWFzbSgicHVzaGwgJSVlYXhcblx0IgorCSAgICAibW92bCAwKCUlZWF4KSwlJWVkeFxuXHQiCisJICAgICJwdXNoICUlZWR4XG5cdCIKKwkgICAgIm1vdmwgNCglJWVheCksJSVlYnhcblx0IgorCSAgICAibW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiCisJICAgICJtb3ZsIDEyKCUlZWF4KSwlJWVkeFxuXHQiCisJICAgICJtb3ZsIDE2KCUlZWF4KSwlJWVzaVxuXHQiCisJICAgICJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiCisJICAgICJwb3BsICUlZWF4XG5cdCIKKwkgICAgIm91dCAlJWFsLCQweGIyXG5cdCIKKwkgICAgIm91dCAlJWFsLCQweDg0XG5cdCIKKwkgICAgInhjaGdsICUlZWF4LCglJWVzcClcblx0IgorCSAgICAibW92bCAlJWVieCw0KCUlZWF4KVxuXHQiCisJICAgICJtb3ZsICUlZWN4LDgoJSVlYXgpXG5cdCIKKwkgICAgIm1vdmwgJSVlZHgsMTIoJSVlYXgpXG5cdCIKKwkgICAgIm1vdmwgJSVlc2ksMTYoJSVlYXgpXG5cdCIKKwkgICAgIm1vdmwgJSVlZGksMjAoJSVlYXgpXG5cdCIKKwkgICAgInBvcGwgJSVlZHhcblx0IgorCSAgICAibW92bCAlJWVkeCwwKCUlZWF4KVxuXHQiCisJICAgICJsYWhmXG5cdCIKKwkgICAgInNocmwgJDgsJSVlYXhcblx0IgorCSAgICAiYW5kbCAkMSwlJWVheFxuIjoiPWEiKHJjKQorCSAgICA6ICAgICJhIihyZWdzKQorCSAgICA6ICAgICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7CiAKLSAgICBpZiAoKHJjICE9IDApIHx8ICgocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYpIHx8IChyZWdzLT5lYXggPT0gZWF4KSkgewotCXJldHVybiAtRUlOVkFMOwotICAgIH0KKwlpZiAocmMgIT0gMCB8fCAocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYgfHwgcmVncy0+ZWF4ID09IGVheCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE1MiwyNCArMTQ3LDkgQEAKICAqLwogc3RhdGljIGludCBpOGtfZ2V0X2Jpb3NfdmVyc2lvbih2b2lkKQogewotICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICAgaW50IHJjOworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9CSU9TX1ZFUlNJT04sIH07CiAKLSAgICByZWdzLmVheCA9IEk4S19TTU1fQklPU19WRVJTSU9OOwotICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewotCXJldHVybiByYzsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVncy5lYXg7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBtYWNoaW5lIGlkLgotICovCi1zdGF0aWMgaW50IGk4a19nZXRfc2VyaWFsX251bWJlcih1bnNpZ25lZCBjaGFyICpidWZmKQotewotICAgIHN0cmxjcHkoYnVmZiwgc2VyaWFsX251bWJlciwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IHJlZ3MuZWF4OwogfQogCiAvKgpAQCAtMTc3LDI0ICsxNTcsMjIgQEAKICAqLwogc3RhdGljIGludCBpOGtfZ2V0X2ZuX3N0YXR1cyh2b2lkKQogewotICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICAgaW50IHJjOworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9GTl9TVEFUVVMsIH07CisJaW50IHJjOwogCi0gICAgcmVncy5lYXggPSBJOEtfU01NX0ZOX1NUQVRVUzsKLSAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKLQlyZXR1cm4gcmM7Ci0gICAgfQorCWlmICgocmMgPSBpOGtfc21tKCZyZWdzKSkgPCAwKQorCQlyZXR1cm4gcmM7CiAKLSAgICBzd2l0Y2ggKChyZWdzLmVheCA+PiBJOEtfRk5fU0hJRlQpICYgSThLX0ZOX01BU0spIHsKLSAgICBjYXNlIEk4S19GTl9VUDoKLQlyZXR1cm4gSThLX1ZPTF9VUDsKLSAgICBjYXNlIEk4S19GTl9ET1dOOgotCXJldHVybiBJOEtfVk9MX0RPV047Ci0gICAgY2FzZSBJOEtfRk5fTVVURToKLQlyZXR1cm4gSThLX1ZPTF9NVVRFOwotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIDA7Ci0gICAgfQorCXN3aXRjaCAoKHJlZ3MuZWF4ID4+IEk4S19GTl9TSElGVCkgJiBJOEtfRk5fTUFTSykgeworCWNhc2UgSThLX0ZOX1VQOgorCQlyZXR1cm4gSThLX1ZPTF9VUDsKKwljYXNlIEk4S19GTl9ET1dOOgorCQlyZXR1cm4gSThLX1ZPTF9ET1dOOworCWNhc2UgSThLX0ZOX01VVEU6CisJCXJldHVybiBJOEtfVk9MX01VVEU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogfQogCiAvKgpAQCAtMjAyLDIwICsxODAsMTMgQEAKICAqLwogc3RhdGljIGludCBpOGtfZ2V0X3Bvd2VyX3N0YXR1cyh2b2lkKQogewotICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICAgaW50IHJjOworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9QT1dFUl9TVEFUVVMsIH07CisJaW50IHJjOwogCi0gICAgcmVncy5lYXggPSBJOEtfU01NX1BPV0VSX1NUQVRVUzsKLSAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKLQlyZXR1cm4gcmM7Ci0gICAgfQorCWlmICgocmMgPSBpOGtfc21tKCZyZWdzKSkgPCAwKQorCQlyZXR1cm4gcmM7CiAKLSAgICBzd2l0Y2ggKHJlZ3MuZWF4ICYgMHhmZikgewotICAgIGNhc2UgSThLX1BPV0VSX0FDOgotCXJldHVybiBJOEtfQUM7Ci0gICAgZGVmYXVsdDoKLQlyZXR1cm4gSThLX0JBVFRFUlk7Ci0gICAgfQorCXJldHVybiAocmVncy5lYXggJiAweGZmKSA9PSBJOEtfUE9XRVJfQUMgPyBJOEtfQUMgOiBJOEtfQkFUVEVSWTsKIH0KIAogLyoKQEAgLTIyMywxNiArMTk0LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCiB7Ci0gICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgICBpbnQgcmM7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9GQU4sIH07CiAKLSAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX0ZBTjsKLSAgICByZWdzLmVieCA9IGZhbiAmIDB4ZmY7Ci0gICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7Ci0JcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJldHVybiAocmVncy5lYXggJiAweGZmKTsKKwlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7CisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7CiB9CiAKIC8qCkBAIC0yNDAsMTYgKzIwNSwxMCBAQAogICovCiBzdGF0aWMgaW50IGk4a19nZXRfZmFuX3NwZWVkKGludCBmYW4pCiB7Ci0gICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgICBpbnQgcmM7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9TUEVFRCwgfTsKIAotICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfU1BFRUQ7Ci0gICAgcmVncy5lYnggPSBmYW4gJiAweGZmOwotICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewotCXJldHVybiByYzsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIEk4S19GQU5fTVVMVDsKKwlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7CisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiAocmVncy5lYXggJiAweGZmZmYpICogSThLX0ZBTl9NVUxUOwogfQogCiAvKgpAQCAtMjU3LDUzMiArMjE2LDMxOCBAQAogICovCiBzdGF0aWMgaW50IGk4a19zZXRfZmFuKGludCBmYW4sIGludCBzcGVlZCkKIHsKLSAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwotICAgIGludCByYzsKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fU0VUX0ZBTiwgfTsKIAotICAgIHNwZWVkID0gKHNwZWVkIDwgMCkgPyAwIDogKChzcGVlZCA+IEk4S19GQU5fTUFYKSA/IEk4S19GQU5fTUFYIDogc3BlZWQpOworCXNwZWVkID0gKHNwZWVkIDwgMCkgPyAwIDogKChzcGVlZCA+IEk4S19GQU5fTUFYKSA/IEk4S19GQU5fTUFYIDogc3BlZWQpOworCXJlZ3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOwogCi0gICAgcmVncy5lYXggPSBJOEtfU01NX1NFVF9GQU47Ci0gICAgcmVncy5lYnggPSAoZmFuICYgMHhmZikgfCAoc3BlZWQgPDwgOCk7Ci0gICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7Ci0JcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHJldHVybiAoaThrX2dldF9mYW5fc3RhdHVzKGZhbikpOworCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogaThrX2dldF9mYW5fc3RhdHVzKGZhbik7CiB9CiAKIC8qCiAgKiBSZWFkIHRoZSBjcHUgdGVtcGVyYXR1cmUuCiAgKi8KLXN0YXRpYyBpbnQgaThrX2dldF9jcHVfdGVtcCh2b2lkKQorc3RhdGljIGludCBpOGtfZ2V0X3RlbXAoaW50IHNlbnNvcikKIHsKLSAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwotICAgIGludCByYzsKLSAgICBpbnQgdGVtcDsKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX1RFTVAsIH07CisJaW50IHJjOworCWludCB0ZW1wOwogCiAjaWZkZWYgSThLX1RFTVBFUkFUVVJFX0JVRwotICAgIHN0YXRpYyBpbnQgcHJldiA9IDA7CisJc3RhdGljIGludCBwcmV2OwogI2VuZGlmCisJcmVncy5lYnggPSBzZW5zb3IgJiAweGZmOworCWlmICgocmMgPSBpOGtfc21tKCZyZWdzKSkgPCAwKQorCQlyZXR1cm4gcmM7CiAKLSAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX1RFTVA7Ci0gICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7Ci0JcmV0dXJuIHJjOwotICAgIH0KLSAgICB0ZW1wID0gcmVncy5lYXggJiAweGZmOworCXRlbXAgPSByZWdzLmVheCAmIDB4ZmY7CiAKICNpZmRlZiBJOEtfVEVNUEVSQVRVUkVfQlVHCi0gICAgLyoKLSAgICAgKiBTb21ldGltZXMgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciByZXR1cm5zIDB4OTksIHdoaWNoIGlzIG91dCBvZiByYW5nZS4KLSAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIChvbmNlKSB0aGUgcHJldmlvdXMgY2FjaGVkIHZhbHVlLiBGb3IgZXhhbXBsZToKLSAgICAgIyAxMDAzNjU1MTM3IDAwMDAwMDU4IDAwMDA1YTRiCi0gICAgICMgMTAwMzY1NTEzOCAwMDAwMDA5OSAwMDAwM2E4MCA8LS0tIDB4OTkgPSAxNTMgZGVncmVlcwotICAgICAjIDEwMDM2NTUxMzkgMDAwMDAwNTQgMDAwMDVjNTIKLSAgICAgKi8KLSAgICBpZiAodGVtcCA+IEk4S19NQVhfVEVNUCkgewotCXRlbXAgPSBwcmV2OwotCXByZXYgPSBJOEtfTUFYX1RFTVA7Ci0gICAgfSBlbHNlIHsKLQlwcmV2ID0gdGVtcDsKLSAgICB9CisJLyoKKwkgKiBTb21ldGltZXMgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciByZXR1cm5zIDB4OTksIHdoaWNoIGlzIG91dCBvZiByYW5nZS4KKwkgKiBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIChvbmNlKSB0aGUgcHJldmlvdXMgY2FjaGVkIHZhbHVlLiBGb3IgZXhhbXBsZToKKwkgIyAxMDAzNjU1MTM3IDAwMDAwMDU4IDAwMDA1YTRiCisJICMgMTAwMzY1NTEzOCAwMDAwMDA5OSAwMDAwM2E4MCA8LS0tIDB4OTkgPSAxNTMgZGVncmVlcworCSAjIDEwMDM2NTUxMzkgMDAwMDAwNTQgMDAwMDVjNTIKKwkgKi8KKwlpZiAodGVtcCA+IEk4S19NQVhfVEVNUCkgeworCQl0ZW1wID0gcHJldjsKKwkJcHJldiA9IEk4S19NQVhfVEVNUDsKKwl9IGVsc2UgeworCQlwcmV2ID0gdGVtcDsKKwl9CiAjZW5kaWYKIAotICAgIHJldHVybiB0ZW1wOworCXJldHVybiB0ZW1wOwogfQogCi1zdGF0aWMgaW50IGk4a19nZXRfZGVsbF9zaWduYXR1cmUodm9pZCkKK3N0YXRpYyBpbnQgaThrX2dldF9kZWxsX3NpZ25hdHVyZShpbnQgcmVxX2ZuKQogewotICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gICAgaW50IHJjOworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gcmVxX2ZuLCB9OworCWludCByYzsKIAotICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfREVMTF9TSUc7Ci0gICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7Ci0JcmV0dXJuIHJjOwotICAgIH0KKwlpZiAoKHJjID0gaThrX3NtbSgmcmVncykpIDwgMCkKKwkJcmV0dXJuIHJjOwogCi0gICAgaWYgKChyZWdzLmVheCA9PSAxMTQ1NjUxNTI3KSAmJiAocmVncy5lZHggPT0gMTE0NTM5MjIwNCkpIHsKLQlyZXR1cm4gMDsKLSAgICB9IGVsc2UgewotCXJldHVybiAtMTsKLSAgICB9CisJcmV0dXJuIHJlZ3MuZWF4ID09IDExNDU2NTE1MjcgJiYgcmVncy5lZHggPT0gMTE0NTM5MjIwNCA/IDAgOiAtMTsKIH0KIAogc3RhdGljIGludCBpOGtfaW9jdGwoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotICAgIGludCB2YWw7Ci0gICAgaW50IHNwZWVkOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmZlsxNl07Ci0gICAgaW50IF9fdXNlciAqYXJncCA9IChpbnQgX191c2VyICopYXJnOworCWludCB2YWwgPSAwOworCWludCBzcGVlZDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZbMTZdOworCWludCBfX3VzZXIgKmFyZ3AgPSAoaW50IF9fdXNlciAqKWFyZzsKIAotICAgIGlmICghYXJncCkKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWFyZ3ApCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIEk4S19CSU9TX1ZFUlNJT046Ci0JdmFsID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKLQlicmVhazsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSThLX0JJT1NfVkVSU0lPTjoKKwkJdmFsID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKKwkJYnJlYWs7CiAKLSAgICBjYXNlIEk4S19NQUNISU5FX0lEOgotCW1lbXNldChidWZmLCAwLCAxNik7Ci0JdmFsID0gaThrX2dldF9zZXJpYWxfbnVtYmVyKGJ1ZmYpOwotCWJyZWFrOworCWNhc2UgSThLX01BQ0hJTkVfSUQ6CisJCW1lbXNldChidWZmLCAwLCAxNik7CisJCXN0cmxjcHkoYnVmZiwgaThrX2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9TRVJJQUwpLCBzaXplb2YoYnVmZikpOworCQlicmVhazsKIAotICAgIGNhc2UgSThLX0ZOX1NUQVRVUzoKLQl2YWwgPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOwotCWJyZWFrOworCWNhc2UgSThLX0ZOX1NUQVRVUzoKKwkJdmFsID0gaThrX2dldF9mbl9zdGF0dXMoKTsKKwkJYnJlYWs7CiAKLSAgICBjYXNlIEk4S19QT1dFUl9TVEFUVVM6Ci0JdmFsID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsKLQlicmVhazsKKwljYXNlIEk4S19QT1dFUl9TVEFUVVM6CisJCXZhbCA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CisJCWJyZWFrOwogCi0gICAgY2FzZSBJOEtfR0VUX1RFTVA6Ci0JdmFsID0gaThrX2dldF9jcHVfdGVtcCgpOwotCWJyZWFrOworCWNhc2UgSThLX0dFVF9URU1QOgorCQl2YWwgPSBpOGtfZ2V0X3RlbXAoMCk7CisJCWJyZWFrOwogCi0gICAgY2FzZSBJOEtfR0VUX1NQRUVEOgotCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKLQkgICAgcmV0dXJuIC1FRkFVTFQ7CisJY2FzZSBJOEtfR0VUX1NQRUVEOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJdmFsID0gaThrX2dldF9mYW5fc3BlZWQodmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIEk4S19HRVRfRkFOOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJdmFsID0gaThrX2dldF9mYW5fc3RhdHVzKHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBJOEtfU0VUX0ZBTjoKKwkJaWYgKHJlc3RyaWN0ZWQgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdwICsgMSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJdmFsID0gaThrX3NldF9mYW4odmFsLCBzcGVlZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXZhbCA9IGk4a19nZXRfZmFuX3NwZWVkKHZhbCk7Ci0JYnJlYWs7CiAKLSAgICBjYXNlIEk4S19HRVRfRkFOOgotCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKLQkgICAgcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXZhbCA9IGk4a19nZXRfZmFuX3N0YXR1cyh2YWwpOwotCWJyZWFrOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOwogCi0gICAgY2FzZSBJOEtfU0VUX0ZBTjoKLQlpZiAocmVzdHJpY3RlZCAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCSAgICByZXR1cm4gLUVQRVJNOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKSB7Ci0JICAgIHJldHVybiAtRUZBVUxUOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdwKzEsIHNpemVvZihpbnQpKSkgewotCSAgICByZXR1cm4gLUVGQVVMVDsKLQl9Ci0JdmFsID0gaThrX3NldF9mYW4odmFsLCBzcGVlZCk7Ci0JYnJlYWs7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEk4S19CSU9TX1ZFUlNJT046CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQorCQlicmVhazsKKwljYXNlIEk4S19NQUNISU5FX0lEOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGJ1ZmYsIDE2KSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0gICAgaWYgKHZhbCA8IDApIHsKLQlyZXR1cm4gdmFsOwotICAgIH0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgY2FzZSBJOEtfQklPU19WRVJTSU9OOgotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgNCkpIHsKLQkgICAgcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOwogCX0KLQlicmVhazsKLSAgICBjYXNlIEk4S19NQUNISU5FX0lEOgotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYnVmZiwgMTYpKSB7Ci0JICAgIHJldHVybiAtRUZBVUxUOwotCX0KLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgc2l6ZW9mKGludCkpKSB7Ci0JICAgIHJldHVybiAtRUZBVUxUOwotCX0KLQlicmVhazsKLSAgICB9CiAKLSAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmb3IgL3Byb2MvaThrLgogICovCi1zdGF0aWMgaW50IGk4a19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywgaW50IGxlbmd0aCkKK3N0YXRpYyBpbnQgaThrX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewotICAgIGludCBuLCBmbl9rZXksIGNwdV90ZW1wLCBhY19wb3dlcjsKLSAgICBpbnQgbGVmdF9mYW4sIHJpZ2h0X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRfc3BlZWQ7CisJaW50IGZuX2tleSwgY3B1X3RlbXAsIGFjX3Bvd2VyOworCWludCBsZWZ0X2ZhbiwgcmlnaHRfZmFuLCBsZWZ0X3NwZWVkLCByaWdodF9zcGVlZDsKIAotICAgIGNwdV90ZW1wICAgICA9IGk4a19nZXRfY3B1X3RlbXAoKTsJCQkvKiAxMTEwMCC1cyAqLwotICAgIGxlZnRfZmFuICAgICA9IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCC1cyAqLwotICAgIHJpZ2h0X2ZhbiAgICA9IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgtXMgKi8KLSAgICBsZWZ0X3NwZWVkICAgPSBpOGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCC1cyAqLwotICAgIHJpZ2h0X3NwZWVkICA9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCC1cyAqLwotICAgIGZuX2tleSAgICAgICA9IGk4a19nZXRfZm5fc3RhdHVzKCk7CQkJLyogICA3NTAgtXMgKi8KLSAgICBpZiAocG93ZXJfc3RhdHVzKSB7Ci0JYWNfcG93ZXIgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOwkJLyogMTQ3MDAgtXMgKi8KLSAgICB9IGVsc2UgewotCWFjX3Bvd2VyID0gLTE7Ci0gICAgfQorCWNwdV90ZW1wCT0gaThrX2dldF90ZW1wKDApOwkJCS8qIDExMTAwILVzICovCisJbGVmdF9mYW4JPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZBTl9MRUZUKTsJLyogICA1ODAgtXMgKi8KKwlyaWdodF9mYW4JPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwILVzICovCisJbGVmdF9zcGVlZAk9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwILVzICovCisJcmlnaHRfc3BlZWQJPSBpOGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgtXMgKi8KKwlmbl9rZXkJCT0gaThrX2dldF9mbl9zdGF0dXMoKTsJCQkvKiAgIDc1MCC1cyAqLworCWlmIChwb3dlcl9zdGF0dXMpCisJCWFjX3Bvd2VyID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsJCS8qIDE0NzAwILVzICovCisJZWxzZQorCQlhY19wb3dlciA9IC0xOwogCi0gICAgLyoKLSAgICAgKiBJbmZvOgotICAgICAqCi0gICAgICogMSkgIEZvcm1hdCB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQotICAgICAqIDIpICBCSU9TIHZlcnNpb24KLSAgICAgKiAzKSAgQklPUyBtYWNoaW5lIElECi0gICAgICogNCkgIENwdSB0ZW1wZXJhdHVyZQotICAgICAqIDUpICBMZWZ0IGZhbiBzdGF0dXMKLSAgICAgKiA2KSAgUmlnaHQgZmFuIHN0YXR1cwotICAgICAqIDcpICBMZWZ0IGZhbiBzcGVlZAotICAgICAqIDgpICBSaWdodCBmYW4gc3BlZWQKLSAgICAgKiA5KSAgQUMgcG93ZXIKLSAgICAgKiAxMCkgRm4gS2V5IHN0YXR1cwotICAgICAqLwotICAgIG4gPSBzcHJpbnRmKGJ1ZmZlciwgIiVzICVzICVzICVkICVkICVkICVkICVkICVkICVkXG4iLAotCQlJOEtfUFJPQ19GTVQsCi0JCWJpb3NfdmVyc2lvbiwKLQkJc2VyaWFsX251bWJlciwKLQkJY3B1X3RlbXAsCi0JCWxlZnRfZmFuLAotCQlyaWdodF9mYW4sCi0JCWxlZnRfc3BlZWQsCi0JCXJpZ2h0X3NwZWVkLAotCQlhY19wb3dlciwKLQkJZm5fa2V5KTsKLQotICAgIHJldHVybiBuOwotfQotCi1zdGF0aWMgc3NpemVfdCBpOGtfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgbG9mZl90ICpmcG9zKQotewotICAgIGludCBuOwotICAgIGNoYXIgaW5mb1sxMjhdOwotCi0gICAgbiA9IGk4a19nZXRfaW5mbyhpbmZvLCBOVUxMLCAwLCAxMjgpOwotICAgIGlmIChuIDw9IDApIHsKLQlyZXR1cm4gbjsKLSAgICB9Ci0KLSAgICBpZiAoKmZwb3MgPj0gbikgewotCXJldHVybiAwOwotICAgIH0KLQotICAgIGlmICgoKmZwb3MgKyBsZW4pID49IG4pIHsKLQlsZW4gPSBuIC0gKmZwb3M7Ci0gICAgfQotCi0gICAgaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGluZm8sIGxlbikgIT0gMCkgewotCXJldHVybiAtRUZBVUxUOwotICAgIH0KLQotICAgICpmcG9zICs9IGxlbjsKLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgY2hhciogX19pbml0IHN0cmluZ190cmltKGNoYXIgKnMsIGludCBzaXplKQotewotICAgIGludCBsZW47Ci0gICAgY2hhciAqcDsKLQotICAgIGlmICgobGVuID0gc3RybGVuKHMpKSA+IHNpemUpIHsKLQlsZW4gPSBzaXplOwotICAgIH0KLQotICAgIGZvciAocD1zK2xlbi0xOyBsZW4gJiYgKCpwPT0nICcpOyBsZW4tLSxwLS0pIHsKLQkqcCA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qIERNSSBjb2RlLCBzdG9sZW4gZnJvbSBhcmNoL2kzODYva2VybmVsL2RtaV9zY2FuLmMgKi8KLQotLyoKLSAqIHw8LS0gZG1pLT5sZW5ndGggLS0+fAotICogfCAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ZG1pIGhlYWRlciAgICBzPU4gIHwgc3RyaW5nMSxcMCwgLi4uLCBzdHJpbmdOLFwwLCAuLi4sIFwwCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKi8KLXN0YXRpYyBjaGFyKiBfX2luaXQgZG1pX3N0cmluZyhETUlIZWFkZXIgKmRtaSwgdTggcykKLXsKLSAgICB1OCAqcDsKLQotICAgIGlmICghcykgewotCXJldHVybiAiIjsKLSAgICB9Ci0gICAgcy0tOwotCi0gICAgcCA9ICh1OCAqKWRtaSArIGRtaS0+bGVuZ3RoOwotICAgIHdoaWxlIChzID4gMCkgewotCXAgKz0gc3RybGVuKHApOwotCXArKzsKLQlzLS07Ci0gICAgfQotCi0gICAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBkbWlfZGVjb2RlKERNSUhlYWRlciAqZG1pKQotewotICAgIHU4ICpkYXRhID0gKHU4ICopIGRtaTsKLSAgICBjaGFyICpwOwotCi0jaWZkZWYgSThLX0RFQlVHCi0gICAgaW50IGk7Ci0gICAgcHJpbnRrKCIlMDh4ICIsIChpbnQpZGF0YSk7Ci0gICAgZm9yIChpPTA7IGk8ZGF0YVsxXSAmJiBpPDY0OyBpKyspIHsKLQlwcmludGsoIiUwMnggIiwgZGF0YVtpXSk7Ci0gICAgfQotICAgIHByaW50aygiXG4iKTsKLSNlbmRpZgotCi0gICAgc3dpdGNoIChkbWktPnR5cGUpIHsKLSAgICBjYXNlICAwOgkvKiBCSU9TIEluZm9ybWF0aW9uICovCi0JcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNV0pOwotCWlmICgqcCkgewotCSAgICBzdHJsY3B5KGJpb3NfdmVyc2lvbiwgcCwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOwotCSAgICBzdHJpbmdfdHJpbShiaW9zX3ZlcnNpb24sIHNpemVvZihiaW9zX3ZlcnNpb24pKTsKLQl9Ci0JYnJlYWs7CQotICAgIGNhc2UgMToJLyogU3lzdGVtIEluZm9ybWF0aW9uICovCi0JcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNF0pOwotCWlmICgqcCkgewotCSAgICBzdHJsY3B5KHN5c3RlbV92ZW5kb3IsIHAsIHNpemVvZihzeXN0ZW1fdmVuZG9yKSk7Ci0JICAgIHN0cmluZ190cmltKHN5c3RlbV92ZW5kb3IsIHNpemVvZihzeXN0ZW1fdmVuZG9yKSk7Ci0JfQotCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzVdKTsKLQlpZiAoKnApIHsKLQkgICAgc3RybGNweShwcm9kdWN0X25hbWUsIHAsIHNpemVvZihwcm9kdWN0X25hbWUpKTsKLQkgICAgc3RyaW5nX3RyaW0ocHJvZHVjdF9uYW1lLCBzaXplb2YocHJvZHVjdF9uYW1lKSk7Ci0JfQotCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzddKTsKLQlpZiAoKnApIHsKLQkgICAgc3RybGNweShzZXJpYWxfbnVtYmVyLCBwLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOwotCSAgICBzdHJpbmdfdHJpbShzZXJpYWxfbnVtYmVyLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOwotCX0KLQlicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSwgdm9pZCAoKmZuKShETUlIZWFkZXIqKSkKLXsKLSAgICB1OCAqYnVmOwotICAgIHU4ICpkYXRhOwotICAgIERNSUhlYWRlciAqZG1pOwotICAgIGludCBpID0gMTsKLQotICAgIGJ1ZiA9IGlvcmVtYXAoYmFzZSwgbGVuKTsKLSAgICBpZiAoYnVmID09IE5VTEwpIHsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIGRhdGEgPSBidWY7Ci0KLSAgICAvKgotICAgICAqIFN0b3Agd2hlbiB3ZSBzZWUgYWwgdGhlIGl0ZW1zIHRoZSB0YWJsZSBjbGFpbWVkIHRvIGhhdmUKLSAgICAgKiBvciB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlIChhbHNvIGhhcHBlbnMpCi0gICAgICovCi0gICAgd2hpbGUgKChpPG51bSkgJiYgKChkYXRhLWJ1ZikgPCBsZW4pKSB7Ci0JZG1pID0gKERNSUhlYWRlciAqKWRhdGE7CiAJLyoKLQkgKiBBdm9pZCBtaXNwYXJzaW5nIGNydWQgaWYgdGhlIGxlbmd0aCBvZiB0aGUgbGFzdAotCSAqIHJlY29yZCBpcyBjcmFwCisJICogSW5mbzoKKwkgKgorCSAqIDEpICBGb3JtYXQgdmVyc2lvbiAodGhpcyB3aWxsIGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykKKwkgKiAyKSAgQklPUyB2ZXJzaW9uCisJICogMykgIEJJT1MgbWFjaGluZSBJRAorCSAqIDQpICBDcHUgdGVtcGVyYXR1cmUKKwkgKiA1KSAgTGVmdCBmYW4gc3RhdHVzCisJICogNikgIFJpZ2h0IGZhbiBzdGF0dXMKKwkgKiA3KSAgTGVmdCBmYW4gc3BlZWQKKwkgKiA4KSAgUmlnaHQgZmFuIHNwZWVkCisJICogOSkgIEFDIHBvd2VyCisJICogMTApIEZuIEtleSBzdGF0dXMKIAkgKi8KLQlpZiAoKGRhdGEtYnVmK2RtaS0+bGVuZ3RoKSA+PSBsZW4pIHsKLQkgICAgYnJlYWs7Ci0JfQotCWZuKGRtaSk7Ci0JZGF0YSArPSBkbWktPmxlbmd0aDsKLQkvKgotCSAqIERvbid0IGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBkYXRhIGlmIHRoZXJlIGlzCi0JICogc3R1ZmYgbG9va2luZyBsaWtlIHN0cmluZyBmaWxsIHBhc3QgdGhlIGVuZAotCSAqLwotCXdoaWxlICgoKGRhdGEtYnVmKSA8IGxlbikgJiYgKCpkYXRhIHx8IGRhdGFbMV0pKSB7Ci0JICAgIGRhdGErKzsKLQl9Ci0JZGF0YSArPSAyOwotCWkrKzsKLSAgICB9Ci0gICAgaW91bm1hcChidWYpOwotCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiJXMgJXMgJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCQkgIEk4S19QUk9DX0ZNVCwKKwkJCSAgYmlvc192ZXJzaW9uLAorCQkJICBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX1NFUklBTCkgPyA6ICJOL0EiLAorCQkJICBjcHVfdGVtcCwKKwkJCSAgbGVmdF9mYW4sIHJpZ2h0X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRfc3BlZWQsCisJCQkgIGFjX3Bvd2VyLCBmbl9rZXkpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBkbWlfaXRlcmF0ZSh2b2lkICgqZGVjb2RlKShETUlIZWFkZXIgKikpCitzdGF0aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXVuc2lnbmVkIGNoYXIgYnVmWzIwXTsKLQl2b2lkIF9faW9tZW0gKnAgPSBpb3JlbWFwKDB4ZTAwMDAsIDB4MjAwMDApLCAqcTsKLQotCWlmICghcCkKLQkJcmV0dXJuIC0xOwotCi0JZm9yIChxID0gcDsgcSA8IHAgKyAweDIwMDAwOyBxICs9IDE2KSB7Ci0JCW1lbWNweV9mcm9taW8oYnVmLCBxLCAyMCk7Ci0JCWlmIChtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCkgewotCQkJdTE2IG51bSAgPSBidWZbMTNdPDw4ICB8IGJ1ZlsxMl07Ci0JCQl1MTYgbGVuICA9IGJ1ZiBbN108PDggIHwgYnVmIFs2XTsKLQkJCXUzMiBiYXNlID0gYnVmWzExXTw8MjQgfCBidWZbMTBdPDwxNiB8IGJ1Zls5XTw8OCB8IGJ1Zls4XTsKLSNpZmRlZiBJOEtfREVCVUcKLQkJCXByaW50ayhLRVJOX0lORk8gIkRNSSAlZC4lZCBwcmVzZW50LlxuIiwKLQkJCSAgIGJ1ZlsxNF0+PjQsIGJ1ZlsxNF0mMHgwRik7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlZCBzdHJ1Y3R1cmVzIG9jY3VweWluZyAlZCBieXRlcy5cbiIsCi0JCQkgICBidWZbMTNdPDw4IHwgYnVmWzEyXSwKLQkJCSAgIGJ1ZiBbN108PDggfCBidWZbNl0pOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1JIHRhYmxlIGF0IDB4JTA4WC5cbiIsCi0JCQkgICBidWZbMTFdPDwyNCB8IGJ1ZlsxMF08PDE2IHwgYnVmWzldPDw4IHwgYnVmWzhdKTsKLSNlbmRpZgotCQkJaWYgKGRtaV90YWJsZShiYXNlLCBsZW4sIG51bSwgZGVjb2RlKT09MCkgewotCQkJCWlvdW5tYXAocCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JaW91bm1hcChwKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGk4a19wcm9jX3Nob3csIE5VTEwpOwogfQotLyogZW5kIG9mIERNSSBjb2RlICovCiAKLS8qCi0gKiBHZXQgRE1JIGluZm9ybWF0aW9uLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpOGtfZG1pX3Byb2JlKHZvaWQpCi17Ci0gICAgY2hhciAqKnA7Ci0KLSAgICBpZiAoZG1pX2l0ZXJhdGUoZG1pX2RlY29kZSkgIT0gMCkgewotCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBETUkgaW5mb3JtYXRpb25cbiIpOwotCXJldHVybiAtRU5PREVWOwotICAgIH0KLQotICAgIGlmIChzdHJuY21wKHN5c3RlbV92ZW5kb3IsREVMTF9TSUdOQVRVUkUsc3RybGVuKERFTExfU0lHTkFUVVJFKSkgIT0gMCkgewotCXByaW50ayhLRVJOX0lORk8gImk4azogbm90IHJ1bm5pbmcgb24gYSBEZWxsIHN5c3RlbVxuIik7Ci0JcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotCi0gICAgZm9yIChwPXN1cHBvcnRlZF9tb2RlbHM7IDsgcCsrKSB7Ci0JaWYgKCEqcCkgewotCSAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IHVuc3VwcG9ydGVkIG1vZGVsOiAlc1xuIiwgcHJvZHVjdF9uYW1lKTsKLQkgICAgcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChzdHJuY21wKHByb2R1Y3RfbmFtZSwqcCxzdHJsZW4oKnApKSA9PSAwKSB7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KK3N0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRkYXRhIGk4a19kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIExhdGl0dWRlIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDIiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJJbnNwaXJvbiIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSAyIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKIAogLyoKICAqIFByb2JlIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBzdXBwb3J0ZWQgbGFwdG9wLgogICovCiBzdGF0aWMgaW50IF9faW5pdCBpOGtfcHJvYmUodm9pZCkKIHsKLSAgICBjaGFyIGJ1ZmZbNF07Ci0gICAgaW50IHZlcnNpb247Ci0gICAgaW50IHNtbV9mb3VuZCA9IDA7CisJY2hhciBidWZmWzRdOworCWludCB2ZXJzaW9uOwogCi0gICAgLyoKLSAgICAgKiBHZXQgRE1JIGluZm9ybWF0aW9uCi0gICAgICovCi0gICAgaWYgKGk4a19kbWlfcHJvYmUoKSAhPSAwKSB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB2ZW5kb3I9JXMsIG1vZGVsPSVzLCB2ZXJzaW9uPSVzXG4iLAotCSAgICAgICBzeXN0ZW1fdmVuZG9yLCBwcm9kdWN0X25hbWUsIGJpb3NfdmVyc2lvbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBHZXQgU01NIERlbGwgc2lnbmF0dXJlCi0gICAgICovCi0gICAgaWYgKGk4a19nZXRfZGVsbF9zaWduYXR1cmUoKSAhPSAwKSB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bmFibGUgdG8gZ2V0IFNNTSBEZWxsIHNpZ25hdHVyZVxuIik7Ci0gICAgfSBlbHNlIHsKLQlzbW1fZm91bmQgPSAxOwotICAgIH0KLQotICAgIC8qCi0gICAgICogR2V0IFNNTSBCSU9TIHZlcnNpb24uCi0gICAgICovCi0gICAgdmVyc2lvbiA9IGk4a19nZXRfYmlvc192ZXJzaW9uKCk7Ci0gICAgaWYgKHZlcnNpb24gPD0gMCkgewotCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBTTU0gQklPUyB2ZXJzaW9uXG4iKTsKLSAgICB9IGVsc2UgewotCXNtbV9mb3VuZCA9IDE7Ci0JYnVmZlswXSA9ICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmY7Ci0JYnVmZlsxXSA9ICh2ZXJzaW9uID4+ICA4KSAmIDB4ZmY7Ci0JYnVmZlsyXSA9ICh2ZXJzaW9uKSAgICAgICAmIDB4ZmY7Ci0JYnVmZlszXSA9ICdcMCc7CiAJLyoKLQkgKiBJZiBETUkgQklPUyB2ZXJzaW9uIGlzIHVua25vd24gdXNlIFNNTSBCSU9TIHZlcnNpb24uCisJICogR2V0IERNSSBpbmZvcm1hdGlvbgogCSAqLwotCWlmIChiaW9zX3ZlcnNpb25bMF0gPT0gJz8nKSB7Ci0JICAgIHN0cmNweShiaW9zX3ZlcnNpb24sIGJ1ZmYpOworCWlmICghZG1pX2NoZWNrX3N5c3RlbShpOGtfZG1pX3RhYmxlKSkgeworCQlpZiAoIWlnbm9yZV9kbWkgJiYgIWZvcmNlKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiBub3QgcnVubmluZyBvbiBhIHN1cHBvcnRlZCBEZWxsIHN5c3RlbS5cbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJpOGs6IHZlbmRvcj0lcywgbW9kZWw9JXMsIHZlcnNpb249JXNcbiIsCisJCQlpOGtfZ2V0X2RtaV9kYXRhKERNSV9TWVNfVkVORE9SKSwKKwkJCWk4a19nZXRfZG1pX2RhdGEoRE1JX1BST0RVQ1RfTkFNRSksCisJCQlpOGtfZ2V0X2RtaV9kYXRhKERNSV9CSU9TX1ZFUlNJT04pKTsKIAl9CisKKwlzdHJsY3B5KGJpb3NfdmVyc2lvbiwgaThrX2dldF9kbWlfZGF0YShETUlfQklPU19WRVJTSU9OKSwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOworCiAJLyoKLQkgKiBDaGVjayBpZiB0aGUgdHdvIHZlcnNpb25zIG1hdGNoLgorCSAqIEdldCBTTU0gRGVsbCBzaWduYXR1cmUKIAkgKi8KLQlpZiAoc3RybmNtcChidWZmLGJpb3NfdmVyc2lvbixzaXplb2YoYmlvc192ZXJzaW9uKSkgIT0gMCkgewotCSAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IEJJT1MgdmVyc2lvbiBtaXNtYXRjaDogJXMgIT0gJXNcbiIsCi0JCSAgIGJ1ZmYsIGJpb3NfdmVyc2lvbik7CisJaWYgKGk4a19nZXRfZGVsbF9zaWduYXR1cmUoSThLX1NNTV9HRVRfREVMTF9TSUcxKSAmJgorCSAgICBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKEk4S19TTU1fR0VUX0RFTExfU0lHMikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpOGs6IHVuYWJsZSB0byBnZXQgU01NIERlbGwgc2lnbmF0dXJlXG4iKTsKKwkJaWYgKCFmb3JjZSkKKwkJCXJldHVybiAtRU5PREVWOwogCX0KLSAgICB9CiAKLSAgICBpZiAoIXNtbV9mb3VuZCAmJiAhZm9yY2UpIHsKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICB9CisJLyoKKwkgKiBHZXQgU01NIEJJT1MgdmVyc2lvbi4KKwkgKi8KKwl2ZXJzaW9uID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKKwlpZiAodmVyc2lvbiA8PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImk4azogdW5hYmxlIHRvIGdldCBTTU0gQklPUyB2ZXJzaW9uXG4iKTsKKwl9IGVsc2UgeworCQlidWZmWzBdID0gKHZlcnNpb24gPj4gMTYpICYgMHhmZjsKKwkJYnVmZlsxXSA9ICh2ZXJzaW9uID4+IDgpICYgMHhmZjsKKwkJYnVmZlsyXSA9ICh2ZXJzaW9uKSAmIDB4ZmY7CisJCWJ1ZmZbM10gPSAnXDAnOworCQkvKgorCQkgKiBJZiBETUkgQklPUyB2ZXJzaW9uIGlzIHVua25vd24gdXNlIFNNTSBCSU9TIHZlcnNpb24uCisJCSAqLworCQlpZiAoIWRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfVkVSU0lPTikpCisJCQlzdHJsY3B5KGJpb3NfdmVyc2lvbiwgYnVmZiwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOwogCi0gICAgcmV0dXJuIDA7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSB0d28gdmVyc2lvbnMgbWF0Y2guCisJCSAqLworCQlpZiAoc3RybmNtcChidWZmLCBiaW9zX3ZlcnNpb24sIHNpemVvZihiaW9zX3ZlcnNpb24pKSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaThrOiBCSU9TIHZlcnNpb24gbWlzbWF0Y2g6ICVzICE9ICVzXG4iLAorCQkJCWJ1ZmYsIGJpb3NfdmVyc2lvbik7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBNT0RVTEUKLXN0YXRpYwotI2VuZGlmCi1pbnQgX19pbml0IGk4a19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpOGtfaW5pdCh2b2lkKQogewotICAgIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pOGs7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKIAotICAgIC8qIEFyZSB3ZSBydW5uaW5nIG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCi0gICAgaWYgKGk4a19wcm9iZSgpICE9IDApIHsKLQlyZXR1cm4gLUVOT0RFVjsKLSAgICB9CisJLyogQXJlIHdlIHJ1bm5pbmcgb24gYW4gc3VwcG9ydGVkIGxhcHRvcD8gKi8KKwlpZiAoaThrX3Byb2JlKCkpCisJCXJldHVybiAtRU5PREVWOwogCi0gICAgLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KLSAgICBwcm9jX2k4ayA9IGNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImk4ayIsIDAsIE5VTEwsIGk4a19nZXRfaW5mbyk7Ci0gICAgaWYgKCFwcm9jX2k4aykgewotCXJldHVybiAtRU5PRU5UOwotICAgIH0KLSAgICBwcm9jX2k4ay0+cHJvY19mb3BzID0gJmk4a19mb3BzOwotICAgIHByb2NfaThrLT5vd25lciA9IFRISVNfTU9EVUxFOworCS8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5ICovCisJcHJvY19pOGsgPSBjcmVhdGVfcHJvY19lbnRyeSgiaThrIiwgMCwgTlVMTCk7CisJaWYgKCFwcm9jX2k4aykKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKLSAgICBwcmludGsoS0VSTl9JTkZPCi0JICAgIkRlbGwgbGFwdG9wIFNNTSBkcml2ZXIgdiVzIE1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKVxuIiwKLQkgICBJOEtfVkVSU0lPTik7CisJcHJvY19pOGstPnByb2NfZm9wcyA9ICZpOGtfZm9wczsKKwlwcm9jX2k4ay0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotICAgIHJldHVybiAwOworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgIkRlbGwgbGFwdG9wIFNNTSBkcml2ZXIgdiVzIE1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKVxuIiwKKwkgICAgICAgSThLX1ZFUlNJT04pOworCisJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBNT0RVTEUKLWludCBpbml0X21vZHVsZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGk4a19leGl0KHZvaWQpCiB7Ci0gICAgcmV0dXJuIGk4a19pbml0KCk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOwogfQogCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0gICAgLyogUmVtb3ZlIHRoZSBwcm9jIGVudHJ5ICovCi0gICAgcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOwotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiaThrOiBtb2R1bGUgdW5sb2FkZWRcbiIpOwotfQotI2VuZGlmCi0KLS8qIGVuZCBvZiBmaWxlICovCittb2R1bGVfaW5pdChpOGtfaW5pdCk7Cittb2R1bGVfZXhpdChpOGtfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmMKaW5kZXggZmQyOTlkNi4uY2I4ZjQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuYwpAQCAtOTcsNyArOTcsNyBAQAogLy9zdGF0aWMgVUNIQVIgY3Q0NFtdPXsgMiwgQlRILCAgICAgMHgyQywwICAgICAgICAgICAgICAgICAgIH07IC8vIE1TIFBJTkcKIC8vc3RhdGljIFVDSEFSIGN0NDVbXT17IDEsIEJUSCwgICAgIDB4MkQgICAgICAgICAgICAgICAgICAgICB9OyAvLyBIT1RFTkFCCiAvL3N0YXRpYyBVQ0hBUiBjdDQ2W109eyAxLCBCVEgsICAgICAweDJFICAgICAgICAgICAgICAgICAgICAgfTsgLy8gSE9URFNBQgotc3RhdGljIFVDSEFSIGN0NDdbXSA9IHsgNywgQlRILCAgICAgMHgyRiwwLDAsMCwwLDAsMCAgICAgICAgIH07IC8vIFVOSVggRkxBR1MKKy8vc3RhdGljIFVDSEFSIGN0NDdbXT17IDcsIEJUSCwgICAgIDB4MkYsMCwwLDAsMCwwLDAgICAgICAgICB9OyAvLyBVTklYIEZMQUdTCiAvL3N0YXRpYyBVQ0hBUiBjdDQ4W109eyAxLCBCVEgsICAgICAweDMwICAgICAgICAgICAgICAgICAgICAgfTsgLy8gRFNSRkxPV0VOQUIKIC8vc3RhdGljIFVDSEFSIGN0NDlbXT17IDEsIEJUSCwgICAgIDB4MzEgICAgICAgICAgICAgICAgICAgICB9OyAvLyBEU1JGTE9XRFNBQgogLy9zdGF0aWMgVUNIQVIgY3Q1MFtdPXsgMSwgQlRILCAgICAgMHgzMiAgICAgICAgICAgICAgICAgICAgIH07IC8vIERUUkZMT1dFTkFCCkBAIC0xNjIsNiArMTYyLDcgQEAKIC8vIFRoaXMgcm91dGluZSBzZXRzIHRoZSBwYXJhbWV0ZXJzIG9mIGNvbW1hbmQgNDcgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZQogLy8gYXBwcm9wcmlhdGUgc3RydWN0dXJlLgogLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNpZiAwCiBjbWRTeW50YXhQdHIKIGkyY21kVW5peEZsYWdzKHVuc2lnbmVkIHNob3J0IGlmbGFnLHVuc2lnbmVkIHNob3J0IGNmbGFnLHVuc2lnbmVkIHNob3J0IGxmbGFnKQogewpAQCAtMTc1LDYgKzE3Niw3IEBACiAJcENNLT5jbWRbNl0gPSAodW5zaWduZWQgY2hhcikgKGxmbGFnID4+IDgpOwogCXJldHVybiBwQ007CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gRnVuY3Rpb246ICAgaTJjbWRCYXVkRGVmKHdoaWNoLCByYXRlKQpAQCAtMTg3LDcgKzE4OSw3IEBACiAvLyBUaGlzIHJvdXRpbmUgc2V0cyB0aGUgcGFyYW1ldGVycyBvZiBjb21tYW5kcyA1NCBvciA1NSAoYWNjb3JkaW5nIHRvIHRoZQogLy8gYXJndW1lbnQgd2hpY2gpLCBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdHVyZS4KIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1jbWRTeW50YXhQdHIKK3N0YXRpYyBjbWRTeW50YXhQdHIKIGkyY21kQmF1ZERlZihpbnQgd2hpY2gsIHVuc2lnbmVkIHNob3J0IHJhdGUpCiB7CiAJY21kU3ludGF4UHRyIHBDTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuaCBiL2RyaXZlcnMvY2hhci9pcDIvaTJjbWQuaAppbmRleCBjNDE3MjhhLi5iYWE0ZTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2kyY21kLmgKKysrIGIvZHJpdmVycy9jaGFyL2lwMi9pMmNtZC5oCkBAIC02NCwxNiArNjQsNiBAQAogCQkJCQkJLy8gZGlyZWN0bHkgZnJvbSB1c2VyLWxldmVsCiAjZGVmaW5lIFZBUiAweDEwICAgICAgICAvLyBUaGlzIGNvbW1hbmQgaXMgb2YgdmFyaWFibGUgbGVuZ3RoIQogCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIGkyY21kLmMKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJvdXRpbmUgdG8gc2V0IHVwIHBhcmFtZXRlcnMgZm9yIHRoZSAiZGVmaW5lIGhvdC1rZXkgc2VxdWVuY2UiIGNvbW1hbmQuIFNpbmNlCi0vLyB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciB0byBhc3NpZ24sIHdlIG11c3QgdXNlIGEgZnVuY3Rpb24gcmF0aGVyCi0vLyB0aGFuIGEgbWFjcm8gKHVzZWQgdXN1YWxseSkuCi0vLwotZXh0ZXJuIGNtZFN5bnRheFB0ciBpMmNtZFVuaXhGbGFncyhVU0hPUlQgaWZsYWcsVVNIT1JUIGNmbGFnLFVTSE9SVCBsZmxhZyk7Ci1leHRlcm4gY21kU3ludGF4UHRyIGkyY21kQmF1ZERlZihpbnQgd2hpY2gsIFVTSE9SVCByYXRlKTsKLQogLy8gRGVjbGFyYXRpb25zIGZvciB0aGUgZ2xvYmFsIGFycmF5cyB1c2VkIHRvIGJlYXIgdGhlIGNvbW1hbmRzIGFuZCB0aGVpcgogLy8gYXJndW1lbnRzLgogLy8KQEAgLTQzMyw2ICs0MjMsNyBAQAogI2RlZmluZSBDTURfSE9UX0VOQUIgKGNtZFN5bnRheFB0cikoY3Q0NSkgLy8gRW5hYmxlIEhvdC1rZXkgY2hlY2tpbmcKICNkZWZpbmUgQ01EX0hPVF9EU0FCIChjbWRTeW50YXhQdHIpKGN0NDYpIC8vIERpc2FibGUgSG90LWtleSBjaGVja2luZwogCisjaWYgMAogLy8gQ09NTUFORCA0NzogU2VuZCBQcm90b2NvbCBpbmZvIHZpYSBVbml4IGZsYWdzOgogLy8gaWZsYWcgPSBVbml4IHR0eSB0X2lmbGFnCiAvLyBjZmxhZyA9IFVuaXggdHR5IHRfY2ZsYWcKQEAgLTQ0MSw2ICs0MzIsNyBAQAogLy8gd2l0aGluIHRoZXNlIGZsYWdzCiAvLwogI2RlZmluZSBDTURfVU5JWF9GTEFHUyhpZmxhZyxjZmxhZyxsZmxhZykgaTJjbWRVbml4RmxhZ3MoaWZsYWcsY2ZsYWcsbGZsYWcpCisjZW5kaWYgIC8qICAwICAqLwogCiAjZGVmaW5lIENNRF9EU1JGTF9FTkFCICAoY21kU3ludGF4UHRyKShjdDQ4KSAvLyBFbmFibGUgIERTUiByZWNlaXZlciBjdHJsCiAjZGVmaW5lIENNRF9EU1JGTF9EU0FCICAoY21kU3ludGF4UHRyKShjdDQ5KSAvLyBEaXNhYmxlIERTUiByZWNlaXZlciBjdHJsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAybWFpbi5jIGIvZHJpdmVycy9jaGFyL2lwMm1haW4uYwppbmRleCAzYjgzMTRiLi5jZjBjZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAybWFpbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDJtYWluLmMKQEAgLTI2OTEsMTYgKzI2OTEsNiBAQAogCQlwQ2gtPmZsYWdzCXw9IEFTWU5DX0NIRUNLX0NEOwogCX0KIAotI2lmZGVmIFhYWAotZG9fZmxhZ3NfdGhpbmc6CS8vIFRoaXMgaXMgYSB0ZXN0LCB3ZSBkb24ndCBkbyB0aGUgZmxhZ3MgdGhpbmcKLQkKLQlpZiAoIChjZmxhZyAmIENSVFNDVFMpICkgewotCQljZmxhZyB8PSAwMTQwMDAwMDAwMDA7Ci0JfQotCWkyUXVldWVDb21tYW5kcyhQVFlQRV9CWVBBU1MsIHBDaCwgMTAwLCAxLCAKLQkJCQlDTURfVU5JWF9GTEFHUyhpZmxhZyxjZmxhZyxsZmxhZykpOwotI2VuZGlmCi0JCQogc2VydmljZV9pdDoKIAlpMkRyYWluT3V0cHV0KCBwQ2gsIDEwMCApOwkJCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX2RldmludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCmluZGV4IDg4ZDFhZDYuLmUwYTUzNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfZGV2aW50Zi5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KIAogI2RlZmluZSBJUE1JX0RFVklOVEZfVkVSU0lPTiAidjMzIgogCkBAIC01MDAsMTAgKzUwMSwyMDUgQEAKIAlyZXR1cm4gcnY7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgY29udGFpbnMgY29kZSBmb3Igc3VwcG9ydGluZyAzMi1iaXQgY29tcGF0aWJsZQorICogaW9jdGxzIG9uIDY0LWJpdCBrZXJuZWxzLiAgVGhpcyBhbGxvd3MgcnVubmluZyAzMi1iaXQgYXBwcyBvbiB0aGUKKyAqIDY0LWJpdCBrZXJuZWwKKyAqLworI2RlZmluZSBDT01QQVRfSVBNSUNUTF9TRU5EX0NPTU1BTkQJXAorCV9JT1IoSVBNSV9JT0NfTUFHSUMsIDEzLCBzdHJ1Y3QgY29tcGF0X2lwbWlfcmVxKQorI2RlZmluZSBDT01QQVRfSVBNSUNUTF9TRU5EX0NPTU1BTkRfU0VUVElNRQlcCisJX0lPUihJUE1JX0lPQ19NQUdJQywgMjEsIHN0cnVjdCBjb21wYXRfaXBtaV9yZXFfc2V0dGltZSkKKyNkZWZpbmUgQ09NUEFUX0lQTUlDVExfUkVDRUlWRV9NU0cJXAorCV9JT1dSKElQTUlfSU9DX01BR0lDLCAxMiwgc3RydWN0IGNvbXBhdF9pcG1pX3JlY3YpCisjZGVmaW5lIENPTVBBVF9JUE1JQ1RMX1JFQ0VJVkVfTVNHX1RSVU5DCVwKKwlfSU9XUihJUE1JX0lPQ19NQUdJQywgMTEsIHN0cnVjdCBjb21wYXRfaXBtaV9yZWN2KQorCitzdHJ1Y3QgY29tcGF0X2lwbWlfbXNnIHsKKwl1OAkJbmV0Zm47CisJdTgJCWNtZDsKKwl1MTYJCWRhdGFfbGVuOworCWNvbXBhdF91cHRyX3QJZGF0YTsKK307CisKK3N0cnVjdCBjb21wYXRfaXBtaV9yZXEgeworCWNvbXBhdF91cHRyX3QJCWFkZHI7CisJY29tcGF0X3VpbnRfdAkJYWRkcl9sZW47CisJY29tcGF0X2xvbmdfdAkJbXNnaWQ7CisJc3RydWN0IGNvbXBhdF9pcG1pX21zZwltc2c7Cit9OworCitzdHJ1Y3QgY29tcGF0X2lwbWlfcmVjdiB7CisJY29tcGF0X2ludF90CQlyZWN2X3R5cGU7CisJY29tcGF0X3VwdHJfdAkJYWRkcjsKKwljb21wYXRfdWludF90CQlhZGRyX2xlbjsKKwljb21wYXRfbG9uZ190CQltc2dpZDsKKwlzdHJ1Y3QgY29tcGF0X2lwbWlfbXNnCW1zZzsKK307CisKK3N0cnVjdCBjb21wYXRfaXBtaV9yZXFfc2V0dGltZSB7CisJc3RydWN0IGNvbXBhdF9pcG1pX3JlcQlyZXE7CisJY29tcGF0X2ludF90CQlyZXRyaWVzOworCWNvbXBhdF91aW50X3QJCXJldHJ5X3RpbWVfbXM7Cit9OworCisvKgorICogRGVmaW5lIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgY29weWluZyBJUE1JIGRhdGEKKyAqLworc3RhdGljIGxvbmcgZ2V0X2NvbXBhdF9pcG1pX21zZyhzdHJ1Y3QgaXBtaV9tc2cgKnA2NCwKKwkJCQlzdHJ1Y3QgY29tcGF0X2lwbWlfbXNnIF9fdXNlciAqcDMyKQoreworCWNvbXBhdF91cHRyX3QgdG1wOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHAzMiwgc2l6ZW9mKCpwMzIpKSB8fAorCQkJX19nZXRfdXNlcihwNjQtPm5ldGZuLCAmcDMyLT5uZXRmbikgfHwKKwkJCV9fZ2V0X3VzZXIocDY0LT5jbWQsICZwMzItPmNtZCkgfHwKKwkJCV9fZ2V0X3VzZXIocDY0LT5kYXRhX2xlbiwgJnAzMi0+ZGF0YV9sZW4pIHx8CisJCQlfX2dldF91c2VyKHRtcCwgJnAzMi0+ZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworCXA2NC0+ZGF0YSA9IGNvbXBhdF9wdHIodG1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgcHV0X2NvbXBhdF9pcG1pX21zZyhzdHJ1Y3QgaXBtaV9tc2cgKnA2NCwKKwkJCQlzdHJ1Y3QgY29tcGF0X2lwbWlfbXNnIF9fdXNlciAqcDMyKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgcDMyLCBzaXplb2YoKnAzMikpIHx8CisJCQlfX3B1dF91c2VyKHA2NC0+bmV0Zm4sICZwMzItPm5ldGZuKSB8fAorCQkJX19wdXRfdXNlcihwNjQtPmNtZCwgJnAzMi0+Y21kKSB8fAorCQkJX19wdXRfdXNlcihwNjQtPmRhdGFfbGVuLCAmcDMyLT5kYXRhX2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBnZXRfY29tcGF0X2lwbWlfcmVxKHN0cnVjdCBpcG1pX3JlcSAqcDY0LAorCQkJCXN0cnVjdCBjb21wYXRfaXBtaV9yZXEgX191c2VyICpwMzIpCit7CisKKwljb21wYXRfdXB0cl90CXRtcDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwMzIsIHNpemVvZigqcDMyKSkgfHwKKwkJCV9fZ2V0X3VzZXIodG1wLCAmcDMyLT5hZGRyKSB8fAorCQkJX19nZXRfdXNlcihwNjQtPmFkZHJfbGVuLCAmcDMyLT5hZGRyX2xlbikgfHwKKwkJCV9fZ2V0X3VzZXIocDY0LT5tc2dpZCwgJnAzMi0+bXNnaWQpIHx8CisJCQlnZXRfY29tcGF0X2lwbWlfbXNnKCZwNjQtPm1zZywgJnAzMi0+bXNnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcDY0LT5hZGRyID0gY29tcGF0X3B0cih0bXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBnZXRfY29tcGF0X2lwbWlfcmVxX3NldHRpbWUoc3RydWN0IGlwbWlfcmVxX3NldHRpbWUgKnA2NCwKKwkJc3RydWN0IGNvbXBhdF9pcG1pX3JlcV9zZXR0aW1lIF9fdXNlciAqcDMyKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwMzIsIHNpemVvZigqcDMyKSkgfHwKKwkJCWdldF9jb21wYXRfaXBtaV9yZXEoJnA2NC0+cmVxLCAmcDMyLT5yZXEpIHx8CisJCQlfX2dldF91c2VyKHA2NC0+cmV0cmllcywgJnAzMi0+cmV0cmllcykgfHwKKwkJCV9fZ2V0X3VzZXIocDY0LT5yZXRyeV90aW1lX21zLCAmcDMyLT5yZXRyeV90aW1lX21zKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGdldF9jb21wYXRfaXBtaV9yZWN2KHN0cnVjdCBpcG1pX3JlY3YgKnA2NCwKKwkJCQkgc3RydWN0IGNvbXBhdF9pcG1pX3JlY3YgX191c2VyICpwMzIpCit7CisJY29tcGF0X3VwdHJfdCB0bXA7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcDMyLCBzaXplb2YoKnAzMikpIHx8CisJCQlfX2dldF91c2VyKHA2NC0+cmVjdl90eXBlLCAmcDMyLT5yZWN2X3R5cGUpIHx8CisJCQlfX2dldF91c2VyKHRtcCwgJnAzMi0+YWRkcikgfHwKKwkJCV9fZ2V0X3VzZXIocDY0LT5hZGRyX2xlbiwgJnAzMi0+YWRkcl9sZW4pIHx8CisJCQlfX2dldF91c2VyKHA2NC0+bXNnaWQsICZwMzItPm1zZ2lkKSB8fAorCQkJZ2V0X2NvbXBhdF9pcG1pX21zZygmcDY0LT5tc2csICZwMzItPm1zZykpCisJCXJldHVybiAtRUZBVUxUOworCXA2NC0+YWRkciA9IGNvbXBhdF9wdHIodG1wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgcHV0X2NvbXBhdF9pcG1pX3JlY3Yoc3RydWN0IGlwbWlfcmVjdiAqcDY0LAorCQkJCSBzdHJ1Y3QgY29tcGF0X2lwbWlfcmVjdiBfX3VzZXIgKnAzMikKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHAzMiwgc2l6ZW9mKCpwMzIpKSB8fAorCQkJX19wdXRfdXNlcihwNjQtPnJlY3ZfdHlwZSwgJnAzMi0+cmVjdl90eXBlKSB8fAorCQkJX19wdXRfdXNlcihwNjQtPmFkZHJfbGVuLCAmcDMyLT5hZGRyX2xlbikgfHwKKwkJCV9fcHV0X3VzZXIocDY0LT5tc2dpZCwgJnAzMi0+bXNnaWQpIHx8CisJCQlwdXRfY29tcGF0X2lwbWlfbXNnKCZwNjQtPm1zZywgJnAzMi0+bXNnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIYW5kbGUgY29tcGF0aWJpbGl0eSBpb2N0bHMKKyAqLworc3RhdGljIGxvbmcgY29tcGF0X2lwbWlfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGVwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJjOworCXN0cnVjdCBpcG1pX2ZpbGVfcHJpdmF0ZSAqcHJpdiA9IGZpbGVwLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBDT01QQVRfSVBNSUNUTF9TRU5EX0NPTU1BTkQ6CisJeworCQlzdHJ1Y3QgaXBtaV9yZXEJcnA7CisKKwkJaWYgKGdldF9jb21wYXRfaXBtaV9yZXEoJnJwLCBjb21wYXRfcHRyKGFyZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIGhhbmRsZV9zZW5kX3JlcShwcml2LT51c2VyLCAmcnAsCisJCQkJcHJpdi0+ZGVmYXVsdF9yZXRyaWVzLAorCQkJCXByaXYtPmRlZmF1bHRfcmV0cnlfdGltZV9tcyk7CisJfQorCWNhc2UgQ09NUEFUX0lQTUlDVExfU0VORF9DT01NQU5EX1NFVFRJTUU6CisJeworCQlzdHJ1Y3QgaXBtaV9yZXFfc2V0dGltZQlzcDsKKworCQlpZiAoZ2V0X2NvbXBhdF9pcG1pX3JlcV9zZXR0aW1lKCZzcCwgY29tcGF0X3B0cihhcmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiBoYW5kbGVfc2VuZF9yZXEocHJpdi0+dXNlciwgJnNwLnJlcSwKKwkJCQlzcC5yZXRyaWVzLCBzcC5yZXRyeV90aW1lX21zKTsKKwl9CisJY2FzZSBDT01QQVRfSVBNSUNUTF9SRUNFSVZFX01TRzoKKwljYXNlIENPTVBBVF9JUE1JQ1RMX1JFQ0VJVkVfTVNHX1RSVU5DOgorCXsKKwkJc3RydWN0IGlwbWlfcmVjdiAgICpwcmVjdjY0LCByZWN2NjQ7CisKKwkJaWYgKGdldF9jb21wYXRfaXBtaV9yZWN2KCZyZWN2NjQsIGNvbXBhdF9wdHIoYXJnKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlwcmVjdjY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHJlY3Y2NCkpOworCQlpZiAoY29weV90b191c2VyKHByZWN2NjQsICZyZWN2NjQsIHNpemVvZihyZWN2NjQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJjID0gaXBtaV9pb2N0bChmaWxlcC0+Zl9kZW50cnktPmRfaW5vZGUsIGZpbGVwLAorCQkJCSgoY21kID09IENPTVBBVF9JUE1JQ1RMX1JFQ0VJVkVfTVNHKQorCQkJCSA/IElQTUlDVExfUkVDRUlWRV9NU0cKKwkJCQkgOiBJUE1JQ1RMX1JFQ0VJVkVfTVNHX1RSVU5DKSwKKwkJCQkobG9uZykgcHJlY3Y2NCk7CisJCWlmIChyYyAhPSAwKQorCQkJcmV0dXJuIHJjOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVjdjY0LCBwcmVjdjY0LCBzaXplb2YocmVjdjY0KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAocHV0X2NvbXBhdF9pcG1pX3JlY3YoJnJlY3Y2NCwgY29tcGF0X3B0cihhcmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiByYzsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIGlwbWlfaW9jdGwoZmlsZXAtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlcCwgY21kLCBhcmcpOworCX0KK30KKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcG1pX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5pb2N0bAkJPSBpcG1pX2lvY3RsLAorI2lmZGVmIENPTkZJR19DT01QQVQKKwkuY29tcGF0X2lvY3RsICAgPSBjb21wYXRfaXBtaV9pb2N0bCwKKyNlbmRpZgogCS5vcGVuCQk9IGlwbWlfb3BlbiwKIAkucmVsZWFzZQk9IGlwbWlfcmVsZWFzZSwKIAkuZmFzeW5jCQk9IGlwbWlfZmFzeW5jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9tc2doYW5kbGVyLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwppbmRleCAwYzgxNjUyLi5lMTZjMTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX21zZ2hhbmRsZXIuYwpAQCAtNTQsNyArNTQsOSBAQAogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcG1pX3Jvb3QgPSBOVUxMOworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXBtaV9yb290ID0gTlVMTDsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAjZGVmaW5lIE1BWF9FVkVOVFNfSU5fUVVFVUUJMjUKIApAQCAtMTI0LDExICsxMjYsMTMgQEAKIAl1bnNpZ25lZCBjaGFyIHByb3RvY29sOwogfTsKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdHJ1Y3QgaXBtaV9wcm9jX2VudHJ5CiB7CiAJY2hhciAgICAgICAgICAgICAgICAgICAqbmFtZTsKIAlzdHJ1Y3QgaXBtaV9wcm9jX2VudHJ5ICpuZXh0OwogfTsKKyNlbmRpZgogCiAjZGVmaW5lIElQTUlfSVBNQl9OVU1fU0VRCTY0CiAjZGVmaW5lIElQTUlfTUFYX0NIQU5ORUxTICAgICAgIDgKQEAgLTE1NiwxMCArMTYwLDEzIEBACiAJc3RydWN0IGlwbWlfc21pX2hhbmRsZXJzICpoYW5kbGVyczsKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgKnNlbmRfaW5mbzsKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJLyogQSBsaXN0IG9mIHByb2MgZW50cmllcyBmb3IgdGhpcyBpbnRlcmZhY2UuICBUaGlzIGRvZXMgbm90CiAJICAgbmVlZCBhIGxvY2ssIG9ubHkgb25lIHRocmVhZCBjcmVhdGVzIGl0IGFuZCBvbmx5IG9uZSB0aHJlYWQKIAkgICBkZXN0cm95cyBpdC4gKi8KKwlzcGlubG9ja190ICAgICAgICAgICAgIHByb2NfZW50cnlfbG9jazsKIAlzdHJ1Y3QgaXBtaV9wcm9jX2VudHJ5ICpwcm9jX2VudHJpZXM7CisjZW5kaWYKIAogCS8qIEEgdGFibGUgb2Ygc2VxdWVuY2UgbnVtYmVycyBmb3IgdGhpcyBpbnRlcmZhY2UuICBXZSB1c2UgdGhlCiAgICAgICAgICAgIHNlcXVlbmNlIG51bWJlcnMgZm9yIElQTUIgbWVzc2FnZXMgdGhhdCBnbyBvdXQgb2YgdGhlCkBAIC0xMDgxLDggKzEwODgsOCBAQAogCQlsb25nICAgICAgICAgICAgICAgICAgc2VxaWQ7CiAJCWludCAgICAgICAgICAgICAgICAgICBicm9hZGNhc3QgPSAwOwogCi0JCWlmIChhZGRyLT5jaGFubmVsID4gSVBNSV9OVU1fQ0hBTk5FTFMpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRmLT5jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJaWYgKGFkZHItPmNoYW5uZWwgPj0gSVBNSV9NQVhfQ0hBTk5FTFMpIHsKKwkJICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaW50Zi0+Y291bnRlcl9sb2NrLCBmbGFncyk7CiAJCQlpbnRmLT5zZW50X2ludmFsaWRfY29tbWFuZHMrKzsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGYtPmNvdW50ZXJfbG9jaywgZmxhZ3MpOwogCQkJcnYgPSAtRUlOVkFMOwpAQCAtMTQ3MCw4ICsxNDc3LDkgQEAKIAkJCSAgICByZWFkX3Byb2NfdCAqcmVhZF9wcm9jLCB3cml0ZV9wcm9jX3QgKndyaXRlX3Byb2MsCiAJCQkgICAgdm9pZCAqZGF0YSwgc3RydWN0IG1vZHVsZSAqb3duZXIpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICAqZmlsZTsKIAlpbnQgICAgICAgICAgICAgICAgICAgIHJ2ID0gMDsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAgKmZpbGU7CiAJc3RydWN0IGlwbWlfcHJvY19lbnRyeSAqZW50cnk7CiAKIAkvKiBDcmVhdGUgYSBsaXN0IGVsZW1lbnQuICovCkBAIC0xNDk3LDEwICsxNTA1LDEzIEBACiAJCWZpbGUtPndyaXRlX3Byb2MgPSB3cml0ZV9wcm9jOwogCQlmaWxlLT5vd25lciA9IG93bmVyOwogCisJCXNwaW5fbG9jaygmc21pLT5wcm9jX2VudHJ5X2xvY2spOwogCQkvKiBTdGljayBpdCBvbiB0aGUgbGlzdC4gKi8KIAkJZW50cnktPm5leHQgPSBzbWktPnByb2NfZW50cmllczsKIAkJc21pLT5wcm9jX2VudHJpZXMgPSBlbnRyeTsKKwkJc3Bpbl91bmxvY2soJnNtaS0+cHJvY19lbnRyeV9sb2NrKTsKIAl9CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogCXJldHVybiBydjsKIH0KQEAgLTE1MDksNiArMTUyMCw3IEBACiB7CiAJaW50IHJ2ID0gMDsKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJc3ByaW50ZihzbWktPnByb2NfZGlyX25hbWUsICIlZCIsIG51bSk7CiAJc21pLT5wcm9jX2RpciA9IHByb2NfbWtkaXIoc21pLT5wcm9jX2Rpcl9uYW1lLCBwcm9jX2lwbWlfcm9vdCk7CiAJaWYgKCFzbWktPnByb2NfZGlyKQpAQCAtMTUzMSwxNCArMTU0MywxNyBAQAogCQlydiA9IGlwbWlfc21pX2FkZF9wcm9jX2VudHJ5KHNtaSwgInZlcnNpb24iLAogCQkJCQkgICAgIHZlcnNpb25fZmlsZV9yZWFkX3Byb2MsIE5VTEwsCiAJCQkJCSAgICAgc21pLCBUSElTX01PRFVMRSk7CisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KIAogCXJldHVybiBydjsKIH0KIAogc3RhdGljIHZvaWQgcmVtb3ZlX3Byb2NfZW50cmllcyhpcG1pX3NtaV90IHNtaSkKIHsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXN0cnVjdCBpcG1pX3Byb2NfZW50cnkgKmVudHJ5OwogCisJc3Bpbl9sb2NrKCZzbWktPnByb2NfZW50cnlfbG9jayk7CiAJd2hpbGUgKHNtaS0+cHJvY19lbnRyaWVzKSB7CiAJCWVudHJ5ID0gc21pLT5wcm9jX2VudHJpZXM7CiAJCXNtaS0+cHJvY19lbnRyaWVzID0gZW50cnktPm5leHQ7CkBAIC0xNTQ3LDcgKzE1NjIsOSBAQAogCQlrZnJlZShlbnRyeS0+bmFtZSk7CiAJCWtmcmVlKGVudHJ5KTsKIAl9CisJc3Bpbl91bmxvY2soJnNtaS0+cHJvY19lbnRyeV9sb2NrKTsKIAlyZW1vdmVfcHJvY19lbnRyeShzbWktPnByb2NfZGlyX25hbWUsIHByb2NfaXBtaV9yb290KTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogfQogCiBzdGF0aWMgaW50CkBAIC0xNjk0LDYgKzE3MTEsOSBAQAogCQkJCW5ld19pbnRmLT5zZXFfdGFibGVbal0uc2VxaWQgPSAwOwogCQkJfQogCQkJbmV3X2ludGYtPmN1cnJfc2VxID0gMDsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCQkJc3Bpbl9sb2NrX2luaXQoJihuZXdfaW50Zi0+cHJvY19lbnRyeV9sb2NrKSk7CisjZW5kaWYKIAkJCXNwaW5fbG9ja19pbml0KCYobmV3X2ludGYtPndhaXRpbmdfbXNnc19sb2NrKSk7CiAJCQlJTklUX0xJU1RfSEVBRCgmKG5ld19pbnRmLT53YWl0aW5nX21zZ3MpKTsKIAkJCXNwaW5fbG9ja19pbml0KCYobmV3X2ludGYtPmV2ZW50c19sb2NrKSk7CkBAIC0yNzQ3LDE2ICsyNzY3LDEzIEBACiAgICB0aGUgcXVldWUgYW5kIHRoaXMgc2lsbGluZXNzIGNhbiBnbyBhd2F5LiAqLwogI2RlZmluZSBJUE1JX1JFUVVFU1RfRVZfVElNRQkoMTAwMCAvIChJUE1JX1RJTUVPVVRfVElNRSkpCiAKLXN0YXRpYyB2b2xhdGlsZSBpbnQgc3RvcF9vcGVyYXRpb24gPSAwOwotc3RhdGljIHZvbGF0aWxlIGludCB0aW1lcl9zdG9wcGVkID0gMDsKK3N0YXRpYyBhdG9taWNfdCBzdG9wX29wZXJhdGlvbjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdGlja3NfdG9fcmVxX2V2ID0gSVBNSV9SRVFVRVNUX0VWX1RJTUU7CiAKIHN0YXRpYyB2b2lkIGlwbWlfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaWYgKHN0b3Bfb3BlcmF0aW9uKSB7Ci0JCXRpbWVyX3N0b3BwZWQgPSAxOworCWlmIChhdG9taWNfcmVhZCgmc3RvcF9vcGVyYXRpb24pKQogCQlyZXR1cm47Ci0JfQogCiAJdGlja3NfdG9fcmVxX2V2LS07CiAJaWYgKHRpY2tzX3RvX3JlcV9ldiA9PSAwKSB7CkBAIC0yNzY2LDggKzI3ODMsNyBAQAogCiAJaXBtaV90aW1lb3V0X2hhbmRsZXIoSVBNSV9USU1FT1VUX1RJTUUpOwogCi0JaXBtaV90aW1lci5leHBpcmVzICs9IElQTUlfVElNRU9VVF9KSUZGSUVTOwotCWFkZF90aW1lcigmaXBtaV90aW1lcik7CisJbW9kX3RpbWVyKCZpcG1pX3RpbWVyLCBqaWZmaWVzICsgSVBNSV9USU1FT1VUX0pJRkZJRVMpOwogfQogCiAKQEAgLTMwODksNiArMzEwNSw3IEBACiAJCWlwbWlfaW50ZXJmYWNlc1tpXSA9IE5VTEw7CiAJfQogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlwcm9jX2lwbWlfcm9vdCA9IHByb2NfbWtkaXIoImlwbWkiLCBOVUxMKTsKIAlpZiAoIXByb2NfaXBtaV9yb290KSB7CiAJICAgIHByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBjcmVhdGUgSVBNSSBwcm9jIGRpciIpOwpAQCAtMzA5Niw2ICszMTEzLDcgQEAKIAl9CiAKIAlwcm9jX2lwbWlfcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAJaW5pdF90aW1lcigmaXBtaV90aW1lcik7CiAJaXBtaV90aW1lci5kYXRhID0gMDsKQEAgLTMxMzAsMTMgKzMxNDgsMTIgQEAKIAogCS8qIFRlbGwgdGhlIHRpbWVyIHRvIHN0b3AsIHRoZW4gd2FpdCBmb3IgaXQgdG8gc3RvcC4gIFRoaXMgYXZvaWRzCiAJICAgcHJvYmxlbXMgd2l0aCByYWNlIGNvbmRpdGlvbnMgcmVtb3ZpbmcgdGhlIHRpbWVyIGhlcmUuICovCi0Jc3RvcF9vcGVyYXRpb24gPSAxOwotCXdoaWxlICghdGltZXJfc3RvcHBlZCkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JfQorCWF0b21pY19pbmMoJnN0b3Bfb3BlcmF0aW9uKTsKKwlkZWxfdGltZXJfc3luYygmaXBtaV90aW1lcik7CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUwogCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfaXBtaV9yb290LT5uYW1lLCAmcHJvY19yb290KTsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAJaW5pdGlhbGl6ZWQgPSAwOwogCkBAIC0zMTc3LDQgKzMxOTQsNSBAQAogRVhQT1JUX1NZTUJPTChpcG1pX3NldF9teV9MVU4pOwogRVhQT1JUX1NZTUJPTChpcG1pX2dldF9teV9MVU4pOwogRVhQT1JUX1NZTUJPTChpcG1pX3NtaV9hZGRfcHJvY19lbnRyeSk7CitFWFBPUlRfU1lNQk9MKHByb2NfaXBtaV9yb290KTsKIEVYUE9SVF9TWU1CT0woaXBtaV91c2VyX3NldF9ydW5fdG9fY29tcGxldGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3Bvd2Vyb2ZmLmMKaW5kZXggY2I1Y2RjNi4uZjk1MWMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJvZmYuYwpAQCAtMzEsMTAgKzMxLDEzIEBACiAgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwotI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAjaW5jbHVkZSA8bGludXgvaXBtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lwbWlfc21pLmg+CiAKQEAgLTQ0LDYgKzQ3LDE4IEBACiAvKiBXaGVyZSB0byB3ZSBpbnNlcnQgb3VyIHBvd2Vyb2ZmIGZ1bmN0aW9uPyAqLwogZXh0ZXJuIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOwogCisvKiBEZWZpbml0aW9ucyBmb3IgY29udHJvbGxpbmcgcG93ZXIgb2ZmIChpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGl0KS4gIEl0CisgKiBjb252ZW5pZW50bHkgbWF0Y2hlcyB0aGUgSVBNSSBjaGFzc2lzIGNvbnRyb2wgdmFsdWVzLiAqLworI2RlZmluZSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTgkJMAkvKiBwb3dlciBkb3duLCB0aGUgZGVmYXVsdC4gKi8KKyNkZWZpbmUgSVBNSV9DSEFTU0lTX1BPV0VSX0NZQ0xFCTB4MDIJLyogcG93ZXIgY3ljbGUgKi8KKworLyogdGhlIElQTUkgZGF0YSBjb21tYW5kICovCitzdGF0aWMgaW50IHBvd2Vyb2ZmX2NvbnRyb2wgPSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjsKKworLyogcGFyYW1ldGVyIGRlZmluaXRpb24gdG8gYWxsb3cgdXNlciB0byBmbGFnIHBvd2VyIGN5Y2xlICovCittb2R1bGVfcGFyYW0ocG93ZXJvZmZfY29udHJvbCwgaW50LCBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTik7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2Vyb2ZmX2NvbnRyb2wsICIgU2V0IHRvIDIgdG8gZW5hYmxlIHBvd2VyIGN5Y2xlIGluc3RlYWQgb2YgcG93ZXIgZG93bi4gUG93ZXIgY3ljbGUgaXMgY29udGluZ2VudCBvbiBoYXJkd2FyZSBzdXBwb3J0LCBvdGhlcndpc2UgaXQgZGVmYXVsdHMgYmFjayB0byBwb3dlciBkb3duLiIpOworCiAvKiBTdHVmZiBmcm9tIHRoZSBnZXQgZGV2aWNlIGlkIGNvbW1hbmQuICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG1mZ19pZDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJvZF9pZDsKQEAgLTc1LDEwICs5MCwxMCBAQAogCiBzdGF0aWMgdm9pZCByZWNlaXZlX2hhbmRsZXIoc3RydWN0IGlwbWlfcmVjdl9tc2cgKnJlY3ZfbXNnLCB2b2lkICpoYW5kbGVyX2RhdGEpCiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSAqc2VtID0gcmVjdl9tc2ctPnVzZXJfbXNnX2RhdGE7CisJc3RydWN0IGNvbXBsZXRpb24gKmNvbXAgPSByZWN2X21zZy0+dXNlcl9tc2dfZGF0YTsKIAotCWlmIChzZW0pCi0JCXVwKHNlbSk7CisJaWYgKGNvbXApCisJCWNvbXBsZXRlKGNvbXApOwogfQogCiBzdGF0aWMgc3RydWN0IGlwbWlfdXNlcl9obmRsIGlwbWlfcG93ZXJvZmZfaGFuZGxlciA9CkBAIC05MSwyNyArMTA2LDI3IEBACiAJCQkJCSAgc3RydWN0IGlwbWlfYWRkciAgICAgICAqYWRkciwKIAkJCQkJICBzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICpzZW5kX21zZykKIHsKLQlpbnQgICAgICAgICAgICAgIHJ2OwotCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCWludCAgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CiAKLQlzZW1hX2luaXQgKCZzZW0sIDApOworCWluaXRfY29tcGxldGlvbigmY29tcCk7CiAKLQlydiA9IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh1c2VyLCBhZGRyLCAwLCBzZW5kX21zZywgJnNlbSwKKwlydiA9IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh1c2VyLCBhZGRyLCAwLCBzZW5kX21zZywgJmNvbXAsCiAJCQkJICAgICAgJmhhbHRfc21pX21zZywgJmhhbHRfcmVjdl9tc2csIDApOwogCWlmIChydikKIAkJcmV0dXJuIHJ2OwogCi0JZG93biAoJnNlbSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7CiAKIAlyZXR1cm4gaGFsdF9yZWN2X21zZy5tc2cuZGF0YVswXTsKIH0KIAotLyogV2UgYXJlIGluIHJ1bi10by1jb21wbGV0aW9uIG1vZGUsIG5vIHNlbWFwaG9yZSBpcyBkZXNpcmVkLiAqLworLyogV2UgYXJlIGluIHJ1bi10by1jb21wbGV0aW9uIG1vZGUsIG5vIGNvbXBsZXRpb24gaXMgZGVzaXJlZC4gKi8KIHN0YXRpYyBpbnQgaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUoaXBtaV91c2VyX3QgICAgICAgICAgICB1c2VyLAogCQkJCSAgIHN0cnVjdCBpcG1pX2FkZHIgICAgICAgKmFkZHIsCiAJCQkJICAgc3RydWN0IGtlcm5lbF9pcG1pX21zZyAqc2VuZF9tc2cpCiB7Ci0JaW50ICAgICAgICAgICAgICBydjsKKwlpbnQgcnY7CiAKIAlydiA9IGlwbWlfcmVxdWVzdF9zdXBwbHlfbXNncyh1c2VyLCBhZGRyLCAwLCBzZW5kX21zZywgTlVMTCwKIAkJCQkgICAgICAmaGFsdF9zbWlfbXNnLCAmaGFsdF9yZWN2X21zZywgMCk7CkBAIC0zNDksMjYgKzM2NCwzOCBAQAogICAgICAgICBzbWlfYWRkci5jaGFubmVsID0gSVBNSV9CTUNfQ0hBTk5FTDsKICAgICAgICAgc21pX2FkZHIubHVuID0gMDsKIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlcmluZyBkb3duIHZpYSBJUE1JIGNoYXNzaXMgY29udHJvbCBjb21tYW5kXG4iKTsKKyBwb3dlcmN5Y2xlZmFpbGVkOgorCXByaW50ayhLRVJOX0lORk8gUEZYICJQb3dlcmluZyAlcyB2aWEgSVBNSSBjaGFzc2lzIGNvbnRyb2wgY29tbWFuZFxuIiwKKwkJKChwb3dlcm9mZl9jb250cm9sICE9IElQTUlfQ0hBU1NJU19QT1dFUl9DWUNMRSkgPyAiZG93biIgOiAiY3ljbGUiKSk7CiAKIAkvKgogCSAqIFBvd2VyIGRvd24KIAkgKi8KIAlzZW5kX21zZy5uZXRmbiA9IElQTUlfTkVURk5fQ0hBU1NJU19SRVFVRVNUOwogCXNlbmRfbXNnLmNtZCA9IElQTUlfQ0hBU1NJU19DT05UUk9MX0NNRDsKLQlkYXRhWzBdID0gMDsgLyogUG93ZXIgZG93biAqLworCWRhdGFbMF0gPSBwb3dlcm9mZl9jb250cm9sOwogCXNlbmRfbXNnLmRhdGEgPSBkYXRhOwogCXNlbmRfbXNnLmRhdGFfbGVuID0gc2l6ZW9mKGRhdGEpOwogCXJ2ID0gaXBtaV9yZXF1ZXN0X2luX3JjX21vZGUodXNlciwKIAkJCQkgICAgIChzdHJ1Y3QgaXBtaV9hZGRyICopICZzbWlfYWRkciwKIAkJCQkgICAgICZzZW5kX21zZyk7CiAJaWYgKHJ2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBzZW5kIGNoYXNzaXMgcG93ZXJkb3duIG1lc3NhZ2UsIgotCQkgICAgICAgIiBJUE1JIGVycm9yIDB4JXhcbiIsIHJ2KTsKLQkJZ290byBvdXQ7CisJCXN3aXRjaCAocG93ZXJvZmZfY29udHJvbCkgeworCQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEU6CisJCQkJLyogcG93ZXIgY3ljbGUgZmFpbGVkLCBkZWZhdWx0IHRvIHBvd2VyIGRvd24gKi8KKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gc2VuZCBjaGFzc2lzIHBvd2VyICIgXAorCQkJCQkiY3ljbGUgbWVzc2FnZSwgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCQkJcG93ZXJvZmZfY29udHJvbCA9IElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOworCQkJCWdvdG8gcG93ZXJjeWNsZWZhaWxlZDsKKworCQkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjoKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIHNlbmQgY2hhc3NpcyBwb3dlciAiIFwKKwkJCQkJImRvd24gbWVzc2FnZSwgSVBNSSBlcnJvciAweCV4XG4iLCBydik7CisJCQkJYnJlYWs7CisJCX0KIAl9CiAKLSBvdXQ6CiAJcmV0dXJuOwogfQogCkBAIC00MzAsNyArNDU3LDggQEAKIAlpZiAocmVhZHkpCiAJCXJldHVybjsKIAotCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpZl9udW0sICZpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIsIE5VTEwsICZpcG1pX3VzZXIpOworCXJ2ID0gaXBtaV9jcmVhdGVfdXNlcihpZl9udW0sICZpcG1pX3Bvd2Vyb2ZmX2hhbmRsZXIsIE5VTEwsCisJCQkgICAgICAmaXBtaV91c2VyKTsKIAlpZiAocnYpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY291bGQgbm90IGNyZWF0ZSBJUE1JIHVzZXIsIGVycm9yICVkXG4iLAogCQkgICAgICAgcnYpOwpAQCAtNTA5LDIxICs1MzcsODQgQEAKIH07CiAKIAorI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiBkaXNwbGF5cyBwcm9wZXJ0aWVzIHRvIHByb2MgKi8KK3N0YXRpYyBpbnQgcHJvY19yZWFkX2NoYXNzY3RybChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LAorCQkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFx0WyAwPXBvd2VyZG93biAyPXBvd2VyY3ljbGUgXVxuIiwKKwkJCXBvd2Vyb2ZmX2NvbnRyb2wpOworfQorCisvKiBwcm9jZXNzIHByb3BlcnR5IHdyaXRlcyBmcm9tIHByb2MgKi8KK3N0YXRpYyBpbnQgcHJvY193cml0ZV9jaGFzc2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgICAgICAgICAgcnYgPSBjb3VudDsKKwl1bnNpZ25lZCBpbnQgbmV3dmFsID0gMDsKKworCXNzY2FuZihidWZmZXIsICIlZCIsICZuZXd2YWwpOworCXN3aXRjaCAobmV3dmFsKSB7CisJCWNhc2UgSVBNSV9DSEFTU0lTX1BPV0VSX0NZQ0xFOgorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggInBvd2VyIGN5Y2xlIGlzIG5vdyBlbmFibGVkXG4iKTsKKwkJCXBvd2Vyb2ZmX2NvbnRyb2wgPSBuZXd2YWw7CisJCQlicmVhazsKKworCQljYXNlIElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOgorCQkJcG93ZXJvZmZfY29udHJvbCA9IElQTUlfQ0hBU1NJU19QT1dFUl9ET1dOOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBydjsKK30KKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCiAvKgogICogU3RhcnR1cCBhbmQgc2h1dGRvd24gZnVuY3Rpb25zLgogICovCiBzdGF0aWMgaW50IGlwbWlfcG93ZXJvZmZfaW5pdCAodm9pZCkKIHsKLQlpbnQgcnY7CisJaW50ICAgICAgICAgICAgICAgICAgIHJ2OworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZmlsZTsKIAogCXByaW50ayAoIkNvcHlyaWdodCAoQykgMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlIC0iCiAJCSIgSVBNSSBQb3dlcmRvd24gdmlhIHN5c19yZWJvb3QgdmVyc2lvbiAiCiAJCUlQTUlfUE9XRVJPRkZfVkVSU0lPTiAiLlxuIik7CiAKLQlydiA9IGlwbWlfc21pX3dhdGNoZXJfcmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKLQlpZiAocnYpCi0JCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZWdpc3RlciBTTUkgd2F0Y2hlcjogJWRcbiIsIHJ2KTsKKwlzd2l0Y2ggKHBvd2Vyb2ZmX2NvbnRyb2wpIHsKKwkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfQ1lDTEU6CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiUG93ZXIgY3ljbGUgaXMgZW5hYmxlZC5cbiIpOworCQkJYnJlYWs7CiAKKwkJY2FzZSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjoKKwkJZGVmYXVsdDoKKwkJCXBvd2Vyb2ZmX2NvbnRyb2wgPSBJUE1JX0NIQVNTSVNfUE9XRVJfRE9XTjsKKwkJCWJyZWFrOworCX0KKworCXJ2ID0gaXBtaV9zbWlfd2F0Y2hlcl9yZWdpc3Rlcigmc21pX3dhdGNoZXIpOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVnaXN0ZXIgU01JIHdhdGNoZXI6ICVkXG4iLCBydik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWZpbGUgPSBjcmVhdGVfcHJvY19lbnRyeSgicG93ZXJvZmZfY29udHJvbCIsIDAsIHByb2NfaXBtaV9yb290KTsKKwlpZiAoIWZpbGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGNyZWF0ZSBwcm9jIHBvd2VyIGNvbnRyb2xcbiIpOworCX0gZWxzZSB7CisJCWZpbGUtPm5saW5rID0gMTsKKwkJZmlsZS0+cmVhZF9wcm9jID0gcHJvY19yZWFkX2NoYXNzY3RybDsKKwkJZmlsZS0+d3JpdGVfcHJvYyA9IHByb2Nfd3JpdGVfY2hhc3NjdHJsOworCQlmaWxlLT5vd25lciA9IFRISVNfTU9EVUxFOworCX0KKyNlbmRpZgorCisgb3V0X2VycjoKIAlyZXR1cm4gcnY7CiB9CiAKQEAgLTUzMiw2ICs2MjMsMTAgQEAKIHsKIAlpbnQgcnY7CiAKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJwb3dlcm9mZl9jb250cm9sIiwgcHJvY19pcG1pX3Jvb3QpOworI2VuZGlmCisKIAlpcG1pX3NtaV93YXRjaGVyX3VucmVnaXN0ZXIoJnNtaV93YXRjaGVyKTsKIAogCWlmIChyZWFkeSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jIGIvZHJpdmVycy9jaGFyL2lzaWNvbS5jCmluZGV4IDYwMWM3ZmMuLjFiYmY1MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pc2ljb20uYworKysgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKQEAgLTE3NTYsNyArMTc1Niw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfaW9yZWdpb24odm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlZ2lzdGVyX2lvcmVnaW9uKHZvaWQpCiB7CiAJaW50IGNvdW50LCBkb25lPTA7CiAJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgewpAQCAtMTc3MSw3ICsxNzcxLDcgQEAKIAlyZXR1cm4gZG9uZTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfaW9yZWdpb24odm9pZCkKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfaW9yZWdpb24odm9pZCkKIHsKIAlpbnQgY291bnQ7CiAJZm9yIChjb3VudD0wOyBjb3VudCA8IEJPQVJEX0NPVU5UOyBjb3VudCsrICkgCkBAIC0xODAzLDcgKzE4MDMsNyBAQAogCS50aW9jbXNldAk9IGlzaWNvbV90aW9jbXNldCwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2RyaXZlcnModm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlZ2lzdGVyX2RyaXZlcnModm9pZCkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTE4MzQsNyArMTgzNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB1bnJlZ2lzdGVyX2RyaXZlcnModm9pZCkKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfZHJpdmVycyh2b2lkKQogewogCWludCBlcnJvciA9IHR0eV91bnJlZ2lzdGVyX2RyaXZlcihpc2ljb21fbm9ybWFsKTsKIAlpZiAoZXJyb3IpCkBAIC0xODQyLDcgKzE4NDIsNyBAQAogCXB1dF90dHlfZHJpdmVyKGlzaWNvbV9ub3JtYWwpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9pc3Iodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJlZ2lzdGVyX2lzcih2b2lkKQogewogCWludCBjb3VudCwgZG9uZT0wOwogCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CkBAIC0xODgzLDcgKzE4ODMsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgaXNpY29tX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzaWNvbV9pbml0KHZvaWQpCiB7CiAJaW50IGNhcmQsIGNoYW5uZWwsIGJhc2U7CiAJc3RydWN0IGlzaV9wb3J0ICogcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwppbmRleCBjMDJhMjFkLi41MmEwNzNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKKysrIGIvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCkBAIC00MDcsNyArNDA3LDYgQEAKIH07CiAKIHN0YXRpYyBpbnQJc3RsaV9laXNhbWVtcHNpemUgPSBzaXplb2Yoc3RsaV9laXNhbWVtcHJvYmVhZGRycykgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci1pbnQJCXN0bGlfZWlzYXByb2JlID0gU1RMSV9FSVNBUFJPQkU7CiAKIC8qCiAgKglEZWZpbmUgdGhlIFN0YWxsaW9uIFBDSSB2ZW5kb3IgYW5kIGRldmljZSBJRHMuCkBAIC00Njg1LDcgKzQ2ODQsNyBAQAogI2lmZGVmIE1PRFVMRQogCXN0bGlfYXJnYnJkcygpOwogI2VuZGlmCi0JaWYgKHN0bGlfZWlzYXByb2JlKQorCWlmIChTVExJX0VJU0FQUk9CRSkKIAkJc3RsaV9maW5kZWlzYWJyZHMoKTsKICNpZmRlZiBDT05GSUdfUENJCiAJc3RsaV9maW5kcGNpYnJkcygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IGUzMDg1YjIuLjQyMTg3MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTIzLDcgKzIzLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yNzMsNiArMjc2LDQwIEBACiAJcmV0dXJuIG1tYXBfbWVtKGZpbGUsIHZtYSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorLyoKKyAqIFJlYWQgbWVtb3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9sZCBrZXJuZWwuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHJlYWRfb2xkbWVtKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgcGZuLCBvZmZzZXQ7CisJc2l6ZV90IHJlYWQgPSAwLCBjc2l6ZTsKKwlpbnQgcmMgPSAwOworCisJd2hpbGUgKGNvdW50KSB7CisJCXBmbiA9ICpwcG9zIC8gUEFHRV9TSVpFOworCQlpZiAocGZuID4gc2F2ZWRfbWF4X3BmbikKKwkJCXJldHVybiByZWFkOworCisJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSgqcHBvcyAlIFBBR0VfU0laRSk7CisJCWlmIChjb3VudCA+IFBBR0VfU0laRSAtIG9mZnNldCkKKwkJCWNzaXplID0gUEFHRV9TSVpFIC0gb2Zmc2V0OworCQllbHNlCisJCQljc2l6ZSA9IGNvdW50OworCisJCXJjID0gY29weV9vbGRtZW1fcGFnZShwZm4sIGJ1ZiwgY3NpemUsIG9mZnNldCwgMSk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWJ1ZiArPSBjc2l6ZTsKKwkJKnBwb3MgKz0gY3NpemU7CisJCXJlYWQgKz0gY3NpemU7CisJCWNvdW50IC09IGNzaXplOworCX0KKwlyZXR1cm4gcmVhZDsKK30KKyNlbmRpZgorCiBleHRlcm4gbG9uZyB2cmVhZChjaGFyICpidWYsIGNoYXIgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwogZXh0ZXJuIGxvbmcgdndyaXRlKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiAKQEAgLTcyMSw2ICs3NTgsNyBAQAogI2RlZmluZSByZWFkX2Z1bGwgICAgICAgcmVhZF96ZXJvCiAjZGVmaW5lIG9wZW5fbWVtCW9wZW5fcG9ydAogI2RlZmluZSBvcGVuX2ttZW0Jb3Blbl9tZW0KKyNkZWZpbmUgb3Blbl9vbGRtZW0Jb3Blbl9tZW0KIAogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSBtZW1vcnlfbHNlZWssCkBAIC03NzAsNiArODA4LDEzIEBACiAJLndyaXRlCQk9IHdyaXRlX2Z1bGwsCiB9OwogCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9sZG1lbV9mb3BzID0geworCS5yZWFkCT0gcmVhZF9vbGRtZW0sCisJLm9wZW4JPSBvcGVuX29sZG1lbSwKK307CisjZW5kaWYKKwogc3RhdGljIHNzaXplX3Qga21zZ193cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLAogCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTgyNSw2ICs4NzAsMTEgQEAKIAkJY2FzZSAxMToKIAkJCWZpbHAtPmZfb3AgPSAma21zZ19mb3BzOwogCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwkJY2FzZSAxMjoKKwkJCWZpbHAtPmZfb3AgPSAmb2xkbWVtX2ZvcHM7CisJCQlicmVhazsKKyNlbmRpZgogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC04NTQsNiArOTA0LDkgQEAKIAl7OCwgInJhbmRvbSIsICBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZyYW5kb21fZm9wc30sCiAJezksICJ1cmFuZG9tIiwgU19JUlVHTyB8IFNfSVdVU1IsICAgICAgICAgICAmdXJhbmRvbV9mb3BzfSwKIAl7MTEsImttc2ciLCAgICBTX0lSVUdPIHwgU19JV1VTUiwgICAgICAgICAgICZrbXNnX2ZvcHN9LAorI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJezEyLCJvbGRtZW0iLCAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAsICZvbGRtZW1fZm9wc30sCisjZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKm1lbV9jbGFzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9taXNjLmMgYi9kcml2ZXJzL2NoYXIvbWlzYy5jCmluZGV4IDMxMTVkMzEuLjkzMWVmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9taXNjLmMKKysrIGIvZHJpdmVycy9jaGFyL21pc2MuYwpAQCAtNjYsOCArNjYsNiBAQAogZXh0ZXJuIGludCBydGNfRFA4NTcwQV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBydGNfTUs0OFQwOF9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBwbXVfZGV2aWNlX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IHRvc2hfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgaThrX2luaXQodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIHZvaWQgKm1pc2Nfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKQEAgLTMxMSwxNSArMzA5LDYgQEAKICNpZmRlZiBDT05GSUdfQlZNRTYwMDAKIAlydGNfRFA4NTcwQV9pbml0KCk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotCXBtdV9kZXZpY2VfaW5pdCgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1RPU0hJQkEKLQl0b3NoX2luaXQoKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19JOEsKLQlpOGtfaW5pdCgpOwotI2VuZGlmCiAJaWYgKHJlZ2lzdGVyX2NocmRldihNSVNDX01BSk9SLCJtaXNjIiwmbWlzY19mb3BzKSkgewogCQlwcmludGsoInVuYWJsZSB0byBnZXQgbWFqb3IgJWQgZm9yIG1pc2MgZGV2aWNlc1xuIiwKIAkJICAgICAgIE1JU0NfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21veGEuYyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKaW5kZXggN2MyNGZiZS4uOTVmNzA0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21veGEuYworKysgYi9kcml2ZXJzL2NoYXIvbW94YS5jCkBAIC00NTEsNyArNDUxLDcgQEAKIAkJaW50IG4gPSAoc2l6ZW9mKG1veGFfcGNpYnJkcykgLyBzaXplb2YobW94YV9wY2licmRzWzBdKSkgLSAxOwogCQlpID0gMDsKIAkJd2hpbGUgKGkgPCBuKSB7Ci0JCQl3aGlsZSAoKHAgPSBwY2lfZmluZF9kZXZpY2UobW94YV9wY2licmRzW2ldLnZlbmRvciwgbW94YV9wY2licmRzW2ldLmRldmljZSwgcCkpIT1OVUxMKQorCQkJd2hpbGUgKChwID0gcGNpX2dldF9kZXZpY2UobW94YV9wY2licmRzW2ldLnZlbmRvciwgbW94YV9wY2licmRzW2ldLmRldmljZSwgcCkpIT1OVUxMKQogCQkJewogCQkJCWlmIChwY2lfZW5hYmxlX2RldmljZShwKSkKIAkJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCmluZGV4IGFiMDBmNTEuLjYxM2FlZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jCkBAIC0xMDcsOCArMTA3LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3BfbG9jaywgZmxhZ3MpOwogfQogCi12b2lkIGRzcDM3ODBJX1dyaXRlR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB1bnNpZ25lZCB1SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdWNWYWx1ZSkKK3N0YXRpYyB2b2lkIGRzcDM3ODBJX1dyaXRlR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLCB1bnNpZ25lZCB1SW5kZXgsCisJCQkJIHVuc2lnbmVkIGNoYXIgdWNWYWx1ZSkKIHsKIAlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbDsKIAlEU1BfSVNBX1NMQVZFX0NPTlRST0wgclNsYXZlQ29udHJvbF9TYXZlOwpAQCAtMTQxLDYgKzE0MSw3IEBACiAKIH0KIAorI2lmIDAKIHVuc2lnbmVkIGNoYXIgZHNwMzc4MElfUmVhZEdlbkNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB1SW5kZXgpCiB7CkBAIC0xNjcsNiArMTY4LDcgQEAKIAogCXJldHVybiB1Y1ZhbHVlOwogfQorI2VuZGlmICAvKiAgMCAgKi8KIAogaW50IGRzcDM3ODBJX0VuYWJsZURTUChEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICogcFNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcElycU1hcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKaW5kZXggM2U3ZDAyMC4uMjcwNDMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKKysrIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmgKQEAgLTMzOCwxMCArMzM4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIpOwogdm9pZCBkc3AzNzgwSV9Xcml0ZU1zYUNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB1bE1zYUFkZHIsIHVuc2lnbmVkIHNob3J0IHVzVmFsdWUpOwotdm9pZCBkc3AzNzgwSV9Xcml0ZUdlbkNmZyh1bnNpZ25lZCBzaG9ydCB1c0RzcEJhc2VJTywgdW5zaWduZWQgdUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHVjVmFsdWUpOwotdW5zaWduZWQgY2hhciBkc3AzNzgwSV9SZWFkR2VuQ2ZnKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHVJbmRleCk7CiBpbnQgZHNwMzc4MElfR2V0SVBDU291cmNlKHVuc2lnbmVkIHNob3J0IHVzRHNwQmFzZUlPLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcHVzSVBDU291cmNlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmMKaW5kZXggYWI2NTBjZC4uZDZjNzJlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYworKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jCkBAIC0yNDIsMjAgKzI0MiwxNCBAQAogewogCWludCByZXR2YWwgPSAwOwogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQogCXN0cnVjdCByZXNvdXJjZSAqcHJlczsKLSNlbmRpZgogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKIAkJInRwMzc4MGk6OnRwMzc4MElfQ2xhaW1SZXNvdXJjZXMgZW50cnkgcEJERGF0YSAlcFxuIiwgcEJERGF0YSk7CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw0LDApCiAJcHJlcyA9IHJlcXVlc3RfcmVnaW9uKHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8sIDE2LCAibXdhdmVfMzc4MGkiKTsKIAlpZiAoIHByZXMgPT0gTlVMTCApIHJldHZhbCA9IC1FSU87Ci0jZWxzZQotCXJldHZhbCA9IGNoZWNrX3JlZ2lvbihwU2V0dGluZ3MtPnVzRHNwQmFzZUlPLCAxNik7Ci0JaWYgKCFyZXR2YWwpIHJlcXVlc3RfcmVnaW9uKHBTZXR0aW5ncy0+dXNEc3BCYXNlSU8sIDE2LCAibXdhdmVfMzc4MGkiKTsKLSNlbmRpZgorCiAJaWYgKHJldHZhbCkgewogCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfQ2xhaW1SZXNvdXJjZXM6IEVycm9yOiBDb3VsZCBub3QgY2xhaW0gSS9PIHJlZ2lvbiBzdGFydGluZyBhdCAleFxuIiwgcFNldHRpbmdzLT51c0RzcEJhc2VJTyk7CiAJCXJldHZhbCA9IC1FSU87CkBAIC0yOTIsNyArMjg2LDcgQEAKIGludCB0cDM3ODBJX0VuYWJsZURTUChUSElOS1BBRF9CRF9EQVRBICogcEJERGF0YSkKIHsKIAlEU1BfMzc4MElfQ09ORklHX1NFVFRJTkdTICpwU2V0dGluZ3MgPSAmcEJERGF0YS0+ckRzcFNldHRpbmdzOwotCUJPT0xFQU4gYkRTUFBvd2VyZWRVcCA9IEZBTFNFLCBiRFNQRW5hYmxlZCA9IEZBTFNFLCBiSW50ZXJydXB0QWxsb2NhdGVkID0gRkFMU0U7CisJQk9PTEVBTiBiRFNQUG93ZXJlZFVwID0gRkFMU0UsIGJJbnRlcnJ1cHRBbGxvY2F0ZWQgPSBGQUxTRTsKIAogCVBSSU5US18yKFRSQUNFX1RQMzc4MEksICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUCBlbnRyeSBwQkREYXRhICVwXG4iLCBwQkREYXRhKTsKIApAQCAtMzk3LDggKzM5MSw2IEBACiAJaWYgKGRzcDM3ODBJX0VuYWJsZURTUChwU2V0dGluZ3MsIHNfYXVzVGhpbmtwYWRJcnFUb0ZpZWxkLCBzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZCkpIHsKIAkJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IGRzcDc4ODBJX0VuYWJsZURTUCgpIGZhaWxlZFxuIik7CiAJCWdvdG8gZXhpdF9jbGVhbnVwOwotCX0gZWxzZSB7Ci0JCWJEU1BFbmFibGVkID0gVFJVRTsKIAl9CiAKIAlFbmFibGVTUkFNKHBCRERhdGEpOwpAQCAtNDExLDggKzQwMyw2IEBACiAKIGV4aXRfY2xlYW51cDoKIAlQUklOVEtfRVJST1IoInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBDbGVhbmluZyB1cFxuIik7Ci0JaWYgKGJEU1BFbmFibGVkKQotCQlkc3AzNzgwSV9EaXNhYmxlRFNQKHBTZXR0aW5ncyk7CiAJaWYgKGJEU1BQb3dlcmVkVXApCiAJCXNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoRkFMU0UpOwogCWlmIChiSW50ZXJydXB0QWxsb2NhdGVkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl90dHkuYyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCmluZGV4IGVkYmE1YTMuLjA5MTAzYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC03NzAsMTAgKzc3MCw4IEBACiAJCX0KIAkJaWYgKGMgPT0gJ1xuJykgewogCQkJaWYgKExfRUNITyh0dHkpIHx8IExfRUNIT05MKHR0eSkpIHsKLQkJCQlpZiAodHR5LT5yZWFkX2NudCA+PSBOX1RUWV9CVUZfU0laRS0xKSB7CisJCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkKIAkJCQkJcHV0X2NoYXIoJ1xhJywgdHR5KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KIAkJCQlvcG9zdCgnXG4nLCB0dHkpOwogCQkJfQogCQkJZ290byBoYW5kbGVfbmV3bGluZTsKQEAgLTc5MCwxMCArNzg4LDggQEAKIAkJCSAqIFhYWCBhcmUgRU9MX0NIQVIgYW5kIEVPTDJfQ0hBUiBlY2hvZWQ/IT8KIAkJCSAqLwogCQkJaWYgKExfRUNITyh0dHkpKSB7Ci0JCQkJaWYgKHR0eS0+cmVhZF9jbnQgPj0gTl9UVFlfQlVGX1NJWkUtMSkgeworCQkJCWlmICh0dHktPnJlYWRfY250ID49IE5fVFRZX0JVRl9TSVpFLTEpCiAJCQkJCXB1dF9jaGFyKCdcYScsIHR0eSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9CiAJCQkJLyogUmVjb3JkIHRoZSBjb2x1bW4gb2YgZmlyc3QgY2Fub24gY2hhci4gKi8KIAkJCQlpZiAodHR5LT5jYW5vbl9oZWFkID09IHR0eS0+cmVhZF9oZWFkKQogCQkJCQl0dHktPmNhbm9uX2NvbHVtbiA9IHR0eS0+Y29sdW1uOwpAQCAtODYyLDEyICs4NTgsOSBAQAogCSAqIHRoYXQgZXJhc2UgY2hhcmFjdGVycyB3aWxsIGJlIGhhbmRsZWQuICBPdGhlciBleGNlc3MKIAkgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgYmVlcGVkLgogCSAqLwotCWlmICh0dHktPmljYW5vbiAmJiAhdHR5LT5jYW5vbl9kYXRhKQotCQlyZXR1cm4gTl9UVFlfQlVGX1NJWkU7Ci0KLQlpZiAobGVmdCA+IDApCi0JCXJldHVybiBsZWZ0OwotCXJldHVybiAwOworCWlmIChsZWZ0IDw9IDApCisJCWxlZnQgPSB0dHktPmljYW5vbiAmJiAhdHR5LT5jYW5vbl9kYXRhOworCXJldHVybiBsZWZ0OwogfQogCiAvKioKQEAgLTE0NzMsMTMgKzE0NjYsMTcgQEAKIAkJCWlmICh0dHktPmRyaXZlci0+Zmx1c2hfY2hhcnMpCiAJCQkJdHR5LT5kcml2ZXItPmZsdXNoX2NoYXJzKHR0eSk7CiAJCX0gZWxzZSB7Ci0JCQljID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYiwgbnIpOwotCQkJaWYgKGMgPCAwKSB7Ci0JCQkJcmV0dmFsID0gYzsKLQkJCQlnb3RvIGJyZWFrX291dDsKKwkJCXdoaWxlIChuciA+IDApIHsKKwkJCQljID0gdHR5LT5kcml2ZXItPndyaXRlKHR0eSwgYiwgbnIpOworCQkJCWlmIChjIDwgMCkgeworCQkJCQlyZXR2YWwgPSBjOworCQkJCQlnb3RvIGJyZWFrX291dDsKKwkJCQl9CisJCQkJaWYgKCFjKQorCQkJCQlicmVhazsKKwkJCQliICs9IGM7CisJCQkJbnIgLT0gYzsKIAkJCX0KLQkJCWIgKz0gYzsKLQkJCW5yIC09IGM7CiAJCX0KIAkJaWYgKCFucikKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL252cmFtLmMgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwppbmRleCBmNjNhM2ZkLi4xYWY3MzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbnZyYW0uYworKysgYi9kcml2ZXJzL2NoYXIvbnZyYW0uYwpAQCAtMjExLDEyICsyMTEsMTMgQEAKIAlyZXR1cm4gcnY7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBfX252cmFtX3NldF9jaGVja3N1bSh2b2lkKQogewogCW1hY2hfc2V0X2NoZWNrc3VtKCk7CiB9CiAKKyNpZiAwCiB2b2lkCiBudnJhbV9zZXRfY2hlY2tzdW0odm9pZCkKIHsKQEAgLTIyNiw2ICsyMjcsNyBAQAogCV9fbnZyYW1fc2V0X2NoZWNrc3VtKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIH0KKyNlbmRpZiAgLyogIDAgICovCiAKIC8qCiAgKiBUaGUgYXJlIHRoZSBmaWxlIG9wZXJhdGlvbiBmdW5jdGlvbiBmb3IgdXNlciBhY2Nlc3MgdG8gL2Rldi9udnJhbQpAQCAtOTIxLDYgKzkyMyw0IEBACiBFWFBPUlRfU1lNQk9MKG52cmFtX3dyaXRlX2J5dGUpOwogRVhQT1JUX1NZTUJPTChfX252cmFtX2NoZWNrX2NoZWNrc3VtKTsKIEVYUE9SVF9TWU1CT0wobnZyYW1fY2hlY2tfY2hlY2tzdW0pOwotRVhQT1JUX1NZTUJPTChfX252cmFtX3NldF9jaGVja3N1bSk7Ci1FWFBPUlRfU1lNQk9MKG52cmFtX3NldF9jaGVja3N1bSk7CiBNT0RVTEVfQUxJQVNfTUlTQ0RFVihOVlJBTV9NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKaW5kZXggMWM4ZDg2Ni4uN2EwYzc0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTcxLDcgKzcxLDYgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9oZGxjLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTU4MSw3ICs1ODAsNyBAQAogCiAgICAgLyogSW50ZXJydXB0IHNldHVwICovCiAgICAgbGluay0+aXJxLkF0dHJpYnV0ZXMgPSBJUlFfVFlQRV9FWENMVVNJVkU7Ci0gICAgbGluay0+aXJxLklSUUluZm8xICAgPSBJUlFfSU5GTzJfVkFMSUQgfCBJUlFfTEVWRUxfSUQ7CisgICAgbGluay0+aXJxLklSUUluZm8xICAgPSBJUlFfTEVWRUxfSUQ7CiAgICAgbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogICAgIAogICAgIGxpbmstPmNvbmYuQXR0cmlidXRlcyA9IDA7CkBAIC01OTMsMTEgKzU5Miw2IEBACiAgICAgZGV2X2xpc3QgPSBsaW5rOwogCiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbWdzbHBjX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC0zMDgxLDEzICszMDc1LDIxIEBACiAJfQogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgbWdzbHBjX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDJjNSwgMHgwMDUwKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgbWdzbHBjX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBtZ3NscGNfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAic3luY2xpbmtfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBtZ3NscGNfYXR0YWNoLAorCS5ldmVudAkJPSBtZ3NscGNfZXZlbnQsCiAJLmRldGFjaAkJPSBtZ3NscGNfZGV0YWNoLAorCS5pZF90YWJsZQk9IG1nc2xwY19pZHMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIG1nc2xwY19vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggNDYwYjVkNC4uNmIxMWQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAgKiBzYW1wbGVzIHRvIGF2b2lkIHdhc3RpbmcgQ1BVIHRpbWUgYW5kIHJlZHVjZSBsb2NrIGNvbnRlbnRpb24uCiAgKi8KIAotc3RhdGljIGludCB0cmlja2xlX3RocmVzaCA9IElOUFVUX1BPT0xfV09SRFMgKiAyODsKK3N0YXRpYyBpbnQgdHJpY2tsZV90aHJlc2ggX19yZWFkX21vc3RseSA9IElOUFVUX1BPT0xfV09SRFMgKiAyODsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgdHJpY2tsZV9jb3VudCkgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL2Z1bmMuaCBiL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCmluZGV4IGU4ZjM4NjAuLjAxOTg3YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vZnVuYy5oCkBAIC0xNDcsNyArMTQ3LDYgQEAKIGV4dGVybiBpbnQgICAgcmlvX3BjaWNvcHkoY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBuKTsKIGV4dGVybiBpbnQgcmlvX21pbm9yIChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiBpbnQgcmlvX2lzbW9kZW0gKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwotZXh0ZXJuIHZvaWQgcmlvX3VkZWxheSAoaW50IHVzZWNzKTsKIAogZXh0ZXJuIHZvaWQgcmlvX3N0YXJ0X2NhcmRfcnVubmluZyAoc3RydWN0IEhvc3QgKiBIb3N0UCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMgYi9kcml2ZXJzL2NoYXIvcmlvL3Jpb19saW51eC5jCmluZGV4IDc2Mzg5M2UuLmQ3ZDQ4NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yaW8vcmlvX2xpbnV4LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9fbGludXguYwpAQCAtMzU0LDExICszNTQsNiBAQAogfQogCiAKLXZvaWQgcmlvX3VkZWxheSAoaW50IHVzZWNzKQotewotICB1ZGVsYXkgKHVzZWNzKTsKLX0KLQogc3RhdGljIGludCByaW9fc2V0X3JlYWxfdGVybWlvcyAodm9pZCAqcHRyKQogewogICBpbnQgcnYsIG1vZGVtOwpAQCAtMTEwMCw3ICsxMDk1LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKICAgICAvKiBGaXJzdCBsb29rIGZvciB0aGUgSkVUIGRldmljZXM6ICovCi0gICAgd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlIChQQ0lfVkVORE9SX0lEX1NQRUNJQUxJWCwgCisgICAgd2hpbGUgKChwZGV2ID0gcGNpX2dldF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RFVklDRV9JRF9TUEVDSUFMSVhfU1hfWElPX0lPOCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGV2KSkpIHsKICAgICAgICBpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIGNvbnRpbnVlOwpAQCAtMTE3NCw3ICsxMTY5LDcgQEAKICAgKi8KIAogICAgIC8qIFRoZW4gbG9vayBmb3IgdGhlIG9sZGVyIFJJTy9QQ0kgZGV2aWNlczogKi8KLSAgICB3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UgKFBDSV9WRU5ET1JfSURfU1BFQ0lBTElYLCAKKyAgICB3aGlsZSAoKHBkZXYgPSBwY2lfZ2V0X2RldmljZSAoUENJX1ZFTkRPUl9JRF9TUEVDSUFMSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1NQRUNJQUxJWF9SSU8sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRldikpKSB7CiAgICAgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yaW8vcmlvaW5pdC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKaW5kZXggZGNhOTQxZS4uODk4YTEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9pbml0LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CkBAIC0xNTYwLDE0ICsxNTYxLDE0IEBACiAJCQkJCSAgSU5URVJSVVBUX0RJU0FCTEUgfCBCWVRFX09QRVJBVElPTiB8CiAJCQkJCSAgU0xPV19MSU5LUyB8IFNMT1dfQVRfQlVTKTsKIAkJCVdCWVRFKERwUmFtUC0+RHBSZXNldFRwdSwgMHhGRik7Ci0JCQlyaW9fdWRlbGF5ICgzKTsKKwkJCXVkZWxheSgzKTsKIAogCQkJcmlvX2RwcmludGsgKFJJT19ERUJVR19JTklULCAgIlJJT0hvc3RSZXNldDogRG9uJ3Qga25vdyBpZiBpdCB3b3JrZWQuIFRyeSByZXNldCBhZ2FpblxuIik7CiAJCQlXQllURShEcFJhbVAtPkRwQ29udHJvbCwgIEJPT1RfRlJPTV9SQU0gfCBFWFRFUk5BTF9CVVNfT0ZGIHwKIAkJCQkJICBJTlRFUlJVUFRfRElTQUJMRSB8IEJZVEVfT1BFUkFUSU9OIHwKIAkJCQkJICBTTE9XX0xJTktTIHwgU0xPV19BVF9CVVMpOwogCQkJV0JZVEUoRHBSYW1QLT5EcFJlc2V0VHB1LCAweEZGKTsKLQkJCXJpb191ZGVsYXkgKDMpOworCQkJdWRlbGF5KDMpOwogCQkJYnJlYWs7CiAjaWZkZWYgRlVUVVJFX1JFTEVBU0UKIAljYXNlIFJJT19FSVNBOgpAQCAtMTU5OSw3ICsxNjAwLDcgQEAKIAkJRHBSYW1QLT5EcENvbnRyb2wgID0gUklPX1BDSV9CT09UX0ZST01fUkFNOwogCQlEcFJhbVAtPkRwUmVzZXRJbnQgPSAweEZGOwogCQlEcFJhbVAtPkRwUmVzZXRUcHUgPSAweEZGOwotCQlyaW9fdWRlbGF5ICgxMDApOworCQl1ZGVsYXkoMTAwKTsKIAkJLyogZm9yIChpPTA7IGk8NjAwMDsgaSsrKTsgICovCiAJCS8qIHN1c3BlbmQoIDMgKTsgKi8KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R0eS5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW90dHkuYwppbmRleCBkYjY1NTAwLi43OGEzMjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvdHR5LmMKQEAgLTUyNCwxNiArNTI0LDE2IEBACiAJcmVnaXN0ZXIgdWludCBTeXNQb3J0ID0gZGV2OwogCXN0cnVjdCB0dHlzdGF0aWNzICp0cDsJCS8qIHBvaW50ZXIgdG8gb3VyIHR0eXN0cnVjdCAqLwogI2VuZGlmCi0Jc3RydWN0IFBvcnQgKlBvcnRQID1wdHI7CS8qIHBvaW50ZXIgdG8gdGhlIHBvcnQgc3RydWN0dXJlICovCisJc3RydWN0IFBvcnQgKlBvcnRQID0gcHRyOwkvKiBwb2ludGVyIHRvIHRoZSBwb3J0IHN0cnVjdHVyZSAqLwogCWludCBkZWxldGVkID0gMDsKIAlpbnQJdHJ5ID0gLTE7IC8qIERpc2FibGUgdGhlIHRpbWVvdXRzIGJ5IHNldHRpbmcgdGhlbSB0byAtMSAqLwogCWludAlyZXBlYXRfdGhpcyA9IC0xOyAvKiBDb25ncmF0cyB0byB0aG9zZSBoYXZpbmcgMTUgeWVhcnMgb2YgCiAJCQkJICAgICB1cHRpbWUhIChZb3UgZ2V0IHRvIGJyZWFrIHRoZSBkcml2ZXIuKSAqLwotCWxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBNb2RlbTsKLQlpbnQgcnYgPTA7CisJaW50IHJ2ID0gMDsKIAkKIAlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgInBvcnQgY2xvc2UgU3lzUG9ydCAlZFxuIixQb3J0UC0+UG9ydE51bSk7CiAKQEAgLTYyMCw3ICs2MjAsNyBAQAogCQlpZiAocmVwZWF0X3RoaXMgLS0gPD0gMCkgewogCQkJcnYgPSAtRUlOVFI7CiAJCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIldhaXRpbmcgZm9yIG5vdCBpZGxlIGNsb3NlZCBicm9rZW4gYnkgc2lnbmFsXG4iKTsKLQkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSApOyAKKwkJCVJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsIEZDTE9TRSk7CiAJCQlnb3RvIGNsb3NlX2VuZDsKIAkJfQogCQlyaW9fZHByaW50ayAoUklPX0RFQlVHX1RUWSwgIkNhbGxpbmcgdGltZW91dCB0byBmbHVzaCBpbiBjbG9zaW5nXG4iKTsKQEAgLTY1NiwxNCArNjU2LDEyIEBACiAJCWdvdG8gY2xvc2VfZW5kOwogCX0KIAotCQotCiAJLyogQ2FuJ3QgY2FsbCBSSU9TaG9ydENvbW1hbmQgd2l0aCB0aGUgcG9ydCBsb2NrZWQuICovCiAJcmlvX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJlBvcnRQLT5wb3J0U2VtLCBmbGFncyk7CiAKIAlpZiAoUklPU2hvcnRDb21tYW5kKHAsIFBvcnRQLCBDTE9TRSwgMSwgMCkgPT0gUklPX0ZBSUwpIHsKLQkgIFJJT1ByZWVtcHRpdmVDbWQocCwgUG9ydFAsRkNMT1NFKTsKLQkgIGdvdG8gY2xvc2VfZW5kOworCQlSSU9QcmVlbXB0aXZlQ21kKHAsIFBvcnRQLCBGQ0xPU0UpOworCQlnb3RvIGNsb3NlX2VuZDsKIAl9CiAKIAlpZiAoIWRlbGV0ZWQpCkBAIC02OTgsNyArNjk2LDYgQEAKICovCiAJUG9ydFAtPkNvbmZpZyAmPSB+KFJJT19DVFNGTE9XfFJJT19SVFNGTE9XKTsKIAotCiAjaWZkZWYgU1RBVFMKIAlQb3J0UC0+U3RhdC5DbG9zZUNudCsrOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMgYi9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKaW5kZXggNWJjYmViMC4uZjQ2M2Q2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JvY2tldC5jCisrKyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwpAQCAtMTYxLDYgKzE2MSw2NCBAQAogCVVQQ0lfQUlPUF9JTlRSX0JJVF8zCiB9OwogCitzdGF0aWMgQnl0ZV90IFJEYXRhW1JEQVRBU0laRV0gPSB7CisJMHgwMCwgMHgwOSwgMHhmNiwgMHg4MiwKKwkweDAyLCAweDA5LCAweDg2LCAweGZiLAorCTB4MDQsIDB4MDksIDB4MDAsIDB4MGEsCisJMHgwNiwgMHgwOSwgMHgwMSwgMHgwYSwKKwkweDA4LCAweDA5LCAweDhhLCAweDEzLAorCTB4MGEsIDB4MDksIDB4YzUsIDB4MTEsCisJMHgwYywgMHgwOSwgMHg4NiwgMHg4NSwKKwkweDBlLCAweDA5LCAweDIwLCAweDBhLAorCTB4MTAsIDB4MDksIDB4MjEsIDB4MGEsCisJMHgxMiwgMHgwOSwgMHg0MSwgMHhmZiwKKwkweDE0LCAweDA5LCAweDgyLCAweDAwLAorCTB4MTYsIDB4MDksIDB4ODIsIDB4N2IsCisJMHgxOCwgMHgwOSwgMHg4YSwgMHg3ZCwKKwkweDFhLCAweDA5LCAweDg4LCAweDgxLAorCTB4MWMsIDB4MDksIDB4ODYsIDB4N2EsCisJMHgxZSwgMHgwOSwgMHg4NCwgMHg4MSwKKwkweDIwLCAweDA5LCAweDgyLCAweDdjLAorCTB4MjIsIDB4MDksIDB4MGEsIDB4MGEKK307CisKK3N0YXRpYyBCeXRlX3QgUlJlZ0RhdGFbUlJFR0RBVEFTSVpFXSA9IHsKKwkweDAwLCAweDA5LCAweGY2LCAweDgyLAkvKiAwMDogU3RvcCBSeCBwcm9jZXNzb3IgKi8KKwkweDA4LCAweDA5LCAweDhhLCAweDEzLAkvKiAwNDogVHggc29mdHdhcmUgZmxvdyBjb250cm9sICovCisJMHgwYSwgMHgwOSwgMHhjNSwgMHgxMSwJLyogMDg6IFhPTiBjaGFyICovCisJMHgwYywgMHgwOSwgMHg4NiwgMHg4NSwJLyogMGM6IFhBTlkgKi8KKwkweDEyLCAweDA5LCAweDQxLCAweGZmLAkvKiAxMDogUnggbWFzayBjaGFyICovCisJMHgxNCwgMHgwOSwgMHg4MiwgMHgwMCwJLyogMTQ6IENvbXBhcmUvSWdub3JlICMwICovCisJMHgxNiwgMHgwOSwgMHg4MiwgMHg3YiwJLyogMTg6IENvbXBhcmUgIzEgKi8KKwkweDE4LCAweDA5LCAweDhhLCAweDdkLAkvKiAxYzogQ29tcGFyZSAjMiAqLworCTB4MWEsIDB4MDksIDB4ODgsIDB4ODEsCS8qIDIwOiBJbnRlcnJ1cHQgIzEgKi8KKwkweDFjLCAweDA5LCAweDg2LCAweDdhLAkvKiAyNDogSWdub3JlL1JlcGxhY2UgIzEgKi8KKwkweDFlLCAweDA5LCAweDg0LCAweDgxLAkvKiAyODogSW50ZXJydXB0ICMyICovCisJMHgyMCwgMHgwOSwgMHg4MiwgMHg3YywJLyogMmM6IElnbm9yZS9SZXBsYWNlICMyICovCisJMHgyMiwgMHgwOSwgMHgwYSwgMHgwYQkvKiAzMDogUnggRklGTyBFbmFibGUgKi8KK307CisKK3N0YXRpYyBDT05UUk9MTEVSX1Qgc0NvbnRyb2xsZXJbQ1RMX1NJWkVdID0geworCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19LAorCXstMSwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIHswLCAwLCAwLCAwfSwKKwkgezAsIDAsIDAsIDB9LCB7LTEsIC0xLCAtMSwgLTF9LCB7MCwgMCwgMCwgMH19Cit9OworCitzdGF0aWMgQnl0ZV90IHNCaXRNYXBDbHJUYmxbOF0gPSB7CisJMHhmZSwgMHhmZCwgMHhmYiwgMHhmNywgMHhlZiwgMHhkZiwgMHhiZiwgMHg3ZgorfTsKKworc3RhdGljIEJ5dGVfdCBzQml0TWFwU2V0VGJsWzhdID0geworCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAKK307CisKK3N0YXRpYyBpbnQgc0Nsb2NrUHJlc2NhbGUgPSAweDE0OworCiAvKgogICogIExpbmUgbnVtYmVyIGlzIHRoZSB0dHlTSXggbnVtYmVyICh4KSwgdGhlIE1pbm9yIG51bWJlci4gIFdlIAogICogIGFzc2lnbiB0aGVtIHNlcXVlbnRpYWxseSwgc3RhcnRpbmcgYXQgemVyby4gIFRoZSBmb2xsb3dpbmcgCkBAIC0xNzcsNiArMjM1LDI2IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBHZXRMaW5lTnVtYmVyKGludCBjdHJsLCBpbnQgYWlvcCwgaW50IGNoKTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFNldExpbmVOdW1iZXIoaW50IGN0cmwsIGludCBhaW9wLCBpbnQgY2gpOwogc3RhdGljIHZvaWQgcnBfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitzdGF0aWMgaW50IHNJbml0Q2hhbihDT05UUk9MTEVSX1QgKiBDdGxQLCBDSEFOTkVMX1QgKiBDaFAsIGludCBBaW9wTnVtLAorCQkgICAgIGludCBDaGFuTnVtKTsKK3N0YXRpYyB2b2lkIHNTZXRJbnRlcmZhY2VNb2RlKENIQU5ORUxfVCAqIENoUCwgQnl0ZV90IG1vZGUpOworc3RhdGljIHZvaWQgc0ZsdXNoUnhGSUZPKENIQU5ORUxfVCAqIENoUCk7CitzdGF0aWMgdm9pZCBzRmx1c2hUeEZJRk8oQ0hBTk5FTF9UICogQ2hQKTsKK3N0YXRpYyB2b2lkIHNFbkludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpOworc3RhdGljIHZvaWQgc0Rpc0ludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpOworc3RhdGljIHZvaWQgc01vZGVtUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IGNoYW4sIGludCBvbik7CitzdGF0aWMgdm9pZCBzUENJTW9kZW1SZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgY2hhbiwgaW50IG9uKTsKK3N0YXRpYyBpbnQgc1dyaXRlVHhQcmlvQnl0ZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBEYXRhKTsKK3N0YXRpYyBpbnQgc1BDSUluaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sCisJCQkgICAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJCSAgICAgIFdvcmRJT190IENvbmZpZ0lPLCBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LAorCQkJICAgICAgaW50IFBlcmlvZGljT25seSwgaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yLAorCQkJICAgICAgaW50IFVQQ0lSaW5nSW5kKTsKK3N0YXRpYyBpbnQgc0luaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sIEJ5dGVJT190IE11ZGJhY0lPLAorCQkJICAgQnl0ZUlPX3QgKiBBaW9wSU9MaXN0LCBpbnQgQWlvcElPTGlzdFNpemUsCisJCQkgICBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LCBpbnQgUGVyaW9kaWNPbmx5KTsKK3N0YXRpYyBpbnQgc1JlYWRBaW9wSUQoQnl0ZUlPX3QgaW8pOworc3RhdGljIGludCBzUmVhZEFpb3BOdW1DaGFuKFdvcmRJT190IGlvKTsKIAogI2lmZGVmIE1PRFVMRQogTU9EVUxFX0FVVEhPUigiVGhlb2RvcmUgVHMnbyIpOwpAQCAtMTc5OCw3ICsxODc2LDcgQEAKICAqICBpbml0J3MgYWlvcGljIGFuZCBzZXJpYWwgcG9ydCBoYXJkd2FyZS4KICAqICBJbnB1dHM6ICBpIGlzIHRoZSBib2FyZCBudW1iZXIgKDAtbikKICAqLwotX19pbml0IGludCByZWdpc3Rlcl9QQ0koaW50IGksIHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgX19pbml0IGludCByZWdpc3Rlcl9QQ0koaW50IGksIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IG51bV9haW9wcywgYWlvcCwgbWF4X251bV9haW9wcywgbnVtX2NoYW4sIGNoYW47CiAJdW5zaWduZWQgaW50IGFpb3Bpb1tNQVhfQUlPUFNfUEVSX0JPQVJEXTsKQEAgLTI0NTMsNzIgKzI1MzEsNiBAQAogfQogI2VuZGlmCiAKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFIDEKLSNlbmRpZgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIDAKLSNlbmRpZgotCi1zdGF0aWMgQnl0ZV90IFJEYXRhW1JEQVRBU0laRV0gPSB7Ci0JMHgwMCwgMHgwOSwgMHhmNiwgMHg4MiwKLQkweDAyLCAweDA5LCAweDg2LCAweGZiLAotCTB4MDQsIDB4MDksIDB4MDAsIDB4MGEsCi0JMHgwNiwgMHgwOSwgMHgwMSwgMHgwYSwKLQkweDA4LCAweDA5LCAweDhhLCAweDEzLAotCTB4MGEsIDB4MDksIDB4YzUsIDB4MTEsCi0JMHgwYywgMHgwOSwgMHg4NiwgMHg4NSwKLQkweDBlLCAweDA5LCAweDIwLCAweDBhLAotCTB4MTAsIDB4MDksIDB4MjEsIDB4MGEsCi0JMHgxMiwgMHgwOSwgMHg0MSwgMHhmZiwKLQkweDE0LCAweDA5LCAweDgyLCAweDAwLAotCTB4MTYsIDB4MDksIDB4ODIsIDB4N2IsCi0JMHgxOCwgMHgwOSwgMHg4YSwgMHg3ZCwKLQkweDFhLCAweDA5LCAweDg4LCAweDgxLAotCTB4MWMsIDB4MDksIDB4ODYsIDB4N2EsCi0JMHgxZSwgMHgwOSwgMHg4NCwgMHg4MSwKLQkweDIwLCAweDA5LCAweDgyLCAweDdjLAotCTB4MjIsIDB4MDksIDB4MGEsIDB4MGEKLX07Ci0KLXN0YXRpYyBCeXRlX3QgUlJlZ0RhdGFbUlJFR0RBVEFTSVpFXSA9IHsKLQkweDAwLCAweDA5LCAweGY2LCAweDgyLAkvKiAwMDogU3RvcCBSeCBwcm9jZXNzb3IgKi8KLQkweDA4LCAweDA5LCAweDhhLCAweDEzLAkvKiAwNDogVHggc29mdHdhcmUgZmxvdyBjb250cm9sICovCi0JMHgwYSwgMHgwOSwgMHhjNSwgMHgxMSwJLyogMDg6IFhPTiBjaGFyICovCi0JMHgwYywgMHgwOSwgMHg4NiwgMHg4NSwJLyogMGM6IFhBTlkgKi8KLQkweDEyLCAweDA5LCAweDQxLCAweGZmLAkvKiAxMDogUnggbWFzayBjaGFyICovCi0JMHgxNCwgMHgwOSwgMHg4MiwgMHgwMCwJLyogMTQ6IENvbXBhcmUvSWdub3JlICMwICovCi0JMHgxNiwgMHgwOSwgMHg4MiwgMHg3YiwJLyogMTg6IENvbXBhcmUgIzEgKi8KLQkweDE4LCAweDA5LCAweDhhLCAweDdkLAkvKiAxYzogQ29tcGFyZSAjMiAqLwotCTB4MWEsIDB4MDksIDB4ODgsIDB4ODEsCS8qIDIwOiBJbnRlcnJ1cHQgIzEgKi8KLQkweDFjLCAweDA5LCAweDg2LCAweDdhLAkvKiAyNDogSWdub3JlL1JlcGxhY2UgIzEgKi8KLQkweDFlLCAweDA5LCAweDg0LCAweDgxLAkvKiAyODogSW50ZXJydXB0ICMyICovCi0JMHgyMCwgMHgwOSwgMHg4MiwgMHg3YywJLyogMmM6IElnbm9yZS9SZXBsYWNlICMyICovCi0JMHgyMiwgMHgwOSwgMHgwYSwgMHgwYQkvKiAzMDogUnggRklGTyBFbmFibGUgKi8KLX07Ci0KLUNPTlRST0xMRVJfVCBzQ29udHJvbGxlcltDVExfU0laRV0gPSB7Ci0Jey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAotCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0sCi0Jey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAotCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0sCi0Jey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAotCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0sCi0Jey0xLCAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgezAsIDAsIDAsIDB9LAotCSB7MCwgMCwgMCwgMH0sIHstMSwgLTEsIC0xLCAtMX0sIHswLCAwLCAwLCAwfX0KLX07Ci0KLUJ5dGVfdCBzQml0TWFwQ2xyVGJsWzhdID0gewotCTB4ZmUsIDB4ZmQsIDB4ZmIsIDB4ZjcsIDB4ZWYsIDB4ZGYsIDB4YmYsIDB4N2YKLX07Ci0KLUJ5dGVfdCBzQml0TWFwU2V0VGJsWzhdID0gewotCTB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAKLX07Ci0KLWludCBzQ2xvY2tQcmVzY2FsZSA9IDB4MTQ7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEZ1bmN0aW9uOiBzSW5pdENvbnRyb2xsZXIKIFB1cnBvc2U6ICBJbml0aWFsaXphdGlvbiBvZiBjb250cm9sbGVyIGdsb2JhbCByZWdpc3RlcnMgYW5kIGNvbnRyb2xsZXIKQEAgLTI1NTQsMjIgKzI1NjYsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICBGUkVRXzRIWiAtIDQgSGVydHoKICAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIEZyZXF1ZW5jeSBwYXJhbWV0ZXIgaXMKICAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZSRVFfRElTLgotICAgICAgICAgIGludCBQZXJpb2RpY09ubHk6IFRSVUUgaWYgYWxsIGludGVycnVwdHMgZXhjZXB0IHRoZSBwZXJpb2RpYworICAgICAgICAgIGludCBQZXJpb2RpY09ubHk6IDEgaWYgYWxsIGludGVycnVwdHMgZXhjZXB0IHRoZSBwZXJpb2RpYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCBhcmUgdG8gYmUgYmxvY2tlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBpcyBib3RoIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBpcyBib3RoIHRoZSBwZXJpb2RpYyBpbnRlcnJ1cHQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhbm5lbCBpbnRlcnJ1cHRzIGFyZSBhbGxvd2VkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIElSUU51bSBpcyBzZXQgdG8gMCB0aGUgUGVyaW9kaWNPbmx5IHBhcmFtZXRlciBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJpZGRlbiwgaXQgaXMgZm9yY2VkIHRvIGEgdmFsdWUgb2YgRkFMU0UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmlkZGVuLCBpdCBpcyBmb3JjZWQgdG8gYSB2YWx1ZSBvZiAwLgogUmV0dXJuOiAgIGludDogTnVtYmVyIG9mIEFJT1BzIG9uIHRoZSBjb250cm9sbGVyLCBvciBDVExJRF9OVUxMIGlmIGNvbnRyb2xsZXIKICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIGZhaWxlZC4KIAogQ29tbWVudHM6CiAgICAgICAgICAgSWYgcGVyaW9kaWMgaW50ZXJydXB0cyBhcmUgdG8gYmUgZGlzYWJsZWQgYnV0IEFJT1AgaW50ZXJydXB0cwotICAgICAgICAgIGFyZSBhbGxvd2VkLCBzZXQgRnJlcXVlbmN5IHRvIEZSRVFfRElTIGFuZCBQZXJpb2RpY09ubHkgdG8gRkFMU0UuCisgICAgICAgICAgYXJlIGFsbG93ZWQsIHNldCBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byAwLgogCiAgICAgICAgICAgSWYgaW50ZXJydXB0cyBhcmUgdG8gYmUgY29tcGxldGVseSBkaXNhYmxlZCBzZXQgSVJRTnVtIHRvIDAuCiAKLSAgICAgICAgICBTZXR0aW5nIEZyZXF1ZW5jeSB0byBGUkVRX0RJUyBhbmQgUGVyaW9kaWNPbmx5IHRvIFRSVUUgaXMgYW4KKyAgICAgICAgICBTZXR0aW5nIEZyZXF1ZW5jeSB0byBGUkVRX0RJUyBhbmQgUGVyaW9kaWNPbmx5IHRvIDEgaXMgYW4KICAgICAgICAgICBpbnZhbGlkIGNvbWJpbmF0aW9uLgogCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiBnbG9iYWwgaW50ZXJydXB0IG1vZGVzLApAQCAtMjU4OSw5ICsyNjAxLDkgQEAKICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGFsbCBBSU9QcyBvbiB0aGUgY29udHJvbGxlciBhcmUgZGlzYWJsZWQsCiAgICAgICAgICAgdGhleSBjYW4gYmUgZW5hYmxlZCB3aXRoIHNFbkFpb3AoKS4KICovCi1pbnQgc0luaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sIEJ5dGVJT190IE11ZGJhY0lPLAotCQkgICAgQnl0ZUlPX3QgKiBBaW9wSU9MaXN0LCBpbnQgQWlvcElPTGlzdFNpemUsIGludCBJUlFOdW0sCi0JCSAgICBCeXRlX3QgRnJlcXVlbmN5LCBpbnQgUGVyaW9kaWNPbmx5KQorc3RhdGljIGludCBzSW5pdENvbnRyb2xsZXIoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IEN0bE51bSwgQnl0ZUlPX3QgTXVkYmFjSU8sCisJCQkgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsIGludCBBaW9wSU9MaXN0U2l6ZSwKKwkJCSAgIGludCBJUlFOdW0sIEJ5dGVfdCBGcmVxdWVuY3ksIGludCBQZXJpb2RpY09ubHkpCiB7CiAJaW50IGk7CiAJQnl0ZUlPX3QgaW87CkBAIC0yNjg3LDIyICsyNjk5LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgRlJFUV80SFogLSA0IEhlcnR6CiAgICAgICAgICAgICAgICAgICAgSWYgSVJRTnVtIGlzIHNldCB0byAwIHRoZSBGcmVxdWVuY3kgcGFyYW1ldGVyIGlzCiAgICAgICAgICAgICAgICAgICAgb3ZlcmlkZGVuLCBpdCBpcyBmb3JjZWQgdG8gYSB2YWx1ZSBvZiBGUkVRX0RJUy4KLSAgICAgICAgICBpbnQgUGVyaW9kaWNPbmx5OiBUUlVFIGlmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCB0aGUgcGVyaW9kaWMKKyAgICAgICAgICBpbnQgUGVyaW9kaWNPbmx5OiAxIGlmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCB0aGUgcGVyaW9kaWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgYXJlIHRvIGJlIGJsb2NrZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgaXMgYm90aCB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgaXMgYm90aCB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGNoYW5uZWwgaW50ZXJydXB0cyBhcmUgYWxsb3dlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBJUlFOdW0gaXMgc2V0IHRvIDAgdGhlIFBlcmlvZGljT25seSBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyaWRkZW4sIGl0IGlzIGZvcmNlZCB0byBhIHZhbHVlIG9mIEZBTFNFLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJpZGRlbiwgaXQgaXMgZm9yY2VkIHRvIGEgdmFsdWUgb2YgMC4KIFJldHVybjogICBpbnQ6IE51bWJlciBvZiBBSU9QcyBvbiB0aGUgY29udHJvbGxlciwgb3IgQ1RMSURfTlVMTCBpZiBjb250cm9sbGVyCiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBmYWlsZWQuCiAKIENvbW1lbnRzOgogICAgICAgICAgIElmIHBlcmlvZGljIGludGVycnVwdHMgYXJlIHRvIGJlIGRpc2FibGVkIGJ1dCBBSU9QIGludGVycnVwdHMKLSAgICAgICAgICBhcmUgYWxsb3dlZCwgc2V0IEZyZXF1ZW5jeSB0byBGUkVRX0RJUyBhbmQgUGVyaW9kaWNPbmx5IHRvIEZBTFNFLgorICAgICAgICAgIGFyZSBhbGxvd2VkLCBzZXQgRnJlcXVlbmN5IHRvIEZSRVFfRElTIGFuZCBQZXJpb2RpY09ubHkgdG8gMC4KIAogICAgICAgICAgIElmIGludGVycnVwdHMgYXJlIHRvIGJlIGNvbXBsZXRlbHkgZGlzYWJsZWQgc2V0IElSUU51bSB0byAwLgogCi0gICAgICAgICAgU2V0dGluZyBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byBUUlVFIGlzIGFuCisgICAgICAgICAgU2V0dGluZyBGcmVxdWVuY3kgdG8gRlJFUV9ESVMgYW5kIFBlcmlvZGljT25seSB0byAxIGlzIGFuCiAgICAgICAgICAgaW52YWxpZCBjb21iaW5hdGlvbi4KIAogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgZ2xvYmFsIGludGVycnVwdCBtb2RlcywKQEAgLTI3MjIsMTEgKzI3MzQsMTEgQEAKICAgICAgICAgICBBZnRlciB0aGlzIGZ1bmN0aW9uIGFsbCBBSU9QcyBvbiB0aGUgY29udHJvbGxlciBhcmUgZGlzYWJsZWQsCiAgICAgICAgICAgdGhleSBjYW4gYmUgZW5hYmxlZCB3aXRoIHNFbkFpb3AoKS4KICovCi1pbnQgc1BDSUluaXRDb250cm9sbGVyKENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBDdGxOdW0sCi0JCSAgICAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsIGludCBBaW9wSU9MaXN0U2l6ZSwKLQkJICAgICAgIFdvcmRJT190IENvbmZpZ0lPLCBpbnQgSVJRTnVtLCBCeXRlX3QgRnJlcXVlbmN5LAotCQkgICAgICAgaW50IFBlcmlvZGljT25seSwgaW50IGFsdENoYW5SaW5nSW5kaWNhdG9yLAotCQkgICAgICAgaW50IFVQQ0lSaW5nSW5kKQorc3RhdGljIGludCBzUENJSW5pdENvbnRyb2xsZXIoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IEN0bE51bSwKKwkJCSAgICAgIEJ5dGVJT190ICogQWlvcElPTGlzdCwgaW50IEFpb3BJT0xpc3RTaXplLAorCQkJICAgICAgV29yZElPX3QgQ29uZmlnSU8sIGludCBJUlFOdW0sIEJ5dGVfdCBGcmVxdWVuY3ksCisJCQkgICAgICBpbnQgUGVyaW9kaWNPbmx5LCBpbnQgYWx0Q2hhblJpbmdJbmRpY2F0b3IsCisJCQkgICAgICBpbnQgVVBDSVJpbmdJbmQpCiB7CiAJaW50IGk7CiAJQnl0ZUlPX3QgaW87CkBAIC0yNzg0LDcgKzI3OTYsNyBAQAogV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCiAKICovCi1pbnQgc1JlYWRBaW9wSUQoQnl0ZUlPX3QgaW8pCitzdGF0aWMgaW50IHNSZWFkQWlvcElEKEJ5dGVJT190IGlvKQogewogCUJ5dGVfdCBBaW9wSUQ7CQkvKiBJRCBieXRlIGZyb20gQUlPUCAqLwogCkBAIC0yODEwLDcgKzI4MjIsNyBAQAogICAgICAgICAgIEFJT1AsIG90aGVyd2lzZSBpdCBpcyBhbiA4IGNoYW5uZWwuCiBXYXJuaW5nczogTm8gY29udGV4dCBzd2l0Y2hlcyBhcmUgYWxsb3dlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBmdW5jdGlvbi4KICovCi1pbnQgc1JlYWRBaW9wTnVtQ2hhbihXb3JkSU9fdCBpbykKK3N0YXRpYyBpbnQgc1JlYWRBaW9wTnVtQ2hhbihXb3JkSU9fdCBpbykKIHsKIAlXb3JkX3QgeDsKIAlzdGF0aWMgQnl0ZV90IFJbNF0gPSB7IDB4MDAsIDB4MDAsIDB4MzQsIDB4MTIgfTsKQEAgLTI4MzQsMTUgKzI4NDYsMTUgQEAKICAgICAgICAgICBDSEFOTkVMX1QgKkNoUDsgUHRyIHRvIGNoYW5uZWwgc3RydWN0dXJlCiAgICAgICAgICAgaW50IEFpb3BOdW07IEFJT1AgbnVtYmVyIHdpdGhpbiBjb250cm9sbGVyCiAgICAgICAgICAgaW50IENoYW5OdW07IENoYW5uZWwgbnVtYmVyIHdpdGhpbiBBSU9QCi1SZXR1cm46ICAgaW50OiBUUlVFIGlmIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgRkFMU0UgaWYgaXQgZmFpbHMgYmVjYXVzZSBjaGFubmVsCitSZXR1cm46ICAgaW50OiAxIGlmIGluaXRpYWxpemF0aW9uIHN1Y2NlZWRlZCwgMCBpZiBpdCBmYWlscyBiZWNhdXNlIGNoYW5uZWwKICAgICAgICAgICAgICAgIG51bWJlciBleGNlZWRzIG51bWJlciBvZiBjaGFubmVscyBhdmFpbGFibGUgaW4gQUlPUC4KIENvbW1lbnRzOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhIGNoYW5uZWwgY2FuIGJlIHVzZWQuCiBXYXJuaW5nczogTm8gcmFuZ2UgY2hlY2tpbmcgb24gYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGlzIGRvbmUuCiAKICAgICAgICAgICBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgogKi8KLWludCBzSW5pdENoYW4oQ09OVFJPTExFUl9UICogQ3RsUCwgQ0hBTk5FTF9UICogQ2hQLCBpbnQgQWlvcE51bSwKLQkgICAgICBpbnQgQ2hhbk51bSkKK3N0YXRpYyBpbnQgc0luaXRDaGFuKENPTlRST0xMRVJfVCAqIEN0bFAsIENIQU5ORUxfVCAqIENoUCwgaW50IEFpb3BOdW0sCisJCSAgICAgaW50IENoYW5OdW0pCiB7CiAJaW50IGk7CiAJV29yZElPX3QgQWlvcElPOwpAQCAtMjg1Myw3ICsyODY1LDcgQEAKIAlpbnQgYnJkOTYwMDsKIAogCWlmIChDaGFuTnVtID49IEN0bFAtPkFpb3BOdW1DaGFuW0Fpb3BOdW1dKQotCQlyZXR1cm4gKEZBTFNFKTsJLyogZXhjZWVkcyBudW0gY2hhbnMgaW4gQUlPUCAqLworCQlyZXR1cm4gMDsJLyogZXhjZWVkcyBudW0gY2hhbnMgaW4gQUlPUCAqLwogCiAJLyogQ2hhbm5lbCwgQUlPUCwgYW5kIGNvbnRyb2xsZXIgaWRlbnRpZmllcnMgKi8KIAlDaFAtPkN0bFAgPSBDdGxQOwpAQCAtMjk2OCw3ICsyOTgwLDcgQEAKIAlDaFAtPlR4UHJpb0J1ZiA9IENoT2ZmICsgX1RYUF9CVUY7CiAJc0VuUnhQcm9jZXNzb3IoQ2hQKTsJLyogc3RhcnQgdGhlIFJ4IHByb2Nlc3NvciAqLwogCi0JcmV0dXJuIChUUlVFKTsKKwlyZXR1cm4gMTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjk4OSw3ICszMDAxLDcgQEAKICAgICAgICAgICBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYSBkZWxheSBvZiA0IHVTIGlzIHJlcXVpcmVkIHRvIGVuc3VyZQogICAgICAgICAgIHRoYXQgdGhlIHJlY2VpdmUgcHJvY2Vzc29yIGlzIG5vIGxvbmdlciBwcm9jZXNzaW5nIHRoaXMgY2hhbm5lbC4KICovCi12b2lkIHNTdG9wUnhQcm9jZXNzb3IoQ0hBTk5FTF9UICogQ2hQKQorc3RhdGljIHZvaWQgc1N0b3BSeFByb2Nlc3NvcihDSEFOTkVMX1QgKiBDaFApCiB7CiAJQnl0ZV90IFJbNF07CiAKQEAgLTMwMTQsMTggKzMwMjYsMTggQEAKICAgICAgICAgICB0aGlzIGZ1bmN0aW9uLgogV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCiAqLwotdm9pZCBzRmx1c2hSeEZJRk8oQ0hBTk5FTF9UICogQ2hQKQorc3RhdGljIHZvaWQgc0ZsdXNoUnhGSUZPKENIQU5ORUxfVCAqIENoUCkKIHsKIAlpbnQgaTsKIAlCeXRlX3QgQ2g7CQkvKiBjaGFubmVsIG51bWJlciB3aXRoaW4gQUlPUCAqLwotCWludCBSeEZJRk9FbmFibGVkOwkvKiBUUlVFIGlmIFJ4IEZJRk8gZW5hYmxlZCAqLworCWludCBSeEZJRk9FbmFibGVkOwkvKiAxIGlmIFJ4IEZJRk8gZW5hYmxlZCAqLwogCiAJaWYgKHNHZXRSeENudChDaFApID09IDApCS8qIFJ4IEZJRk8gZW1wdHkgKi8KIAkJcmV0dXJuOwkJLyogZG9uJ3QgbmVlZCB0byBmbHVzaCAqLwogCi0JUnhGSUZPRW5hYmxlZCA9IEZBTFNFOworCVJ4RklGT0VuYWJsZWQgPSAwOwogCWlmIChDaFAtPlJbMHgzMl0gPT0gMHgwOCkgewkvKiBSeCBGSUZPIGlzIGVuYWJsZWQgKi8KLQkJUnhGSUZPRW5hYmxlZCA9IFRSVUU7CisJCVJ4RklGT0VuYWJsZWQgPSAxOwogCQlzRGlzUnhGSUZPKENoUCk7CS8qIGRpc2FibGUgaXQgKi8KIAkJZm9yIChpID0gMDsgaSA8IDIwMDAgLyAyMDA7IGkrKykJLyogZGVsYXkgMiB1UyB0byBhbGxvdyBwcm9jIHRvIGRpc2FibGUgRklGTyAqLwogCQkJc0luQihDaFAtPkludENoYW4pOwkvKiBkZXBlbmRzIG9uIGJ1cyBpL28gdGltaW5nICovCkBAIC0zMDU2LDE4ICszMDY4LDE4IEBACiAgICAgICAgICAgdGhpcyBmdW5jdGlvbi4KIFdhcm5pbmdzOiBObyBjb250ZXh0IHN3aXRjaGVzIGFyZSBhbGxvd2VkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGZ1bmN0aW9uLgogKi8KLXZvaWQgc0ZsdXNoVHhGSUZPKENIQU5ORUxfVCAqIENoUCkKK3N0YXRpYyB2b2lkIHNGbHVzaFR4RklGTyhDSEFOTkVMX1QgKiBDaFApCiB7CiAJaW50IGk7CiAJQnl0ZV90IENoOwkJLyogY2hhbm5lbCBudW1iZXIgd2l0aGluIEFJT1AgKi8KLQlpbnQgVHhFbmFibGVkOwkJLyogVFJVRSBpZiB0cmFuc21pdHRlciBlbmFibGVkICovCisJaW50IFR4RW5hYmxlZDsJCS8qIDEgaWYgdHJhbnNtaXR0ZXIgZW5hYmxlZCAqLwogCiAJaWYgKHNHZXRUeENudChDaFApID09IDApCS8qIFR4IEZJRk8gZW1wdHkgKi8KIAkJcmV0dXJuOwkJLyogZG9uJ3QgbmVlZCB0byBmbHVzaCAqLwogCi0JVHhFbmFibGVkID0gRkFMU0U7CisJVHhFbmFibGVkID0gMDsKIAlpZiAoQ2hQLT5UeENvbnRyb2xbM10gJiBUWF9FTkFCTEUpIHsKLQkJVHhFbmFibGVkID0gVFJVRTsKKwkJVHhFbmFibGVkID0gMTsKIAkJc0Rpc1RyYW5zbWl0KENoUCk7CS8qIGRpc2FibGUgdHJhbnNtaXR0ZXIgKi8KIAl9CiAJc1N0b3BSeFByb2Nlc3NvcihDaFApOwkvKiBzdG9wIFJ4IHByb2Nlc3NvciAqLwpAQCAtMzA5Niw3ICszMTA4LDcgQEAKIAogV2FybmluZ3M6IE5vIGNvbnRleHQgc3dpdGNoZXMgYXJlIGFsbG93ZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb24uCiAqLwotaW50IHNXcml0ZVR4UHJpb0J5dGUoQ0hBTk5FTF9UICogQ2hQLCBCeXRlX3QgRGF0YSkKK3N0YXRpYyBpbnQgc1dyaXRlVHhQcmlvQnl0ZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBEYXRhKQogewogCUJ5dGVfdCBEV0J1Zls0XTsJLyogYnVmZmVyIGZvciBkb3VibGUgd29yZCB3cml0ZXMgKi8KIAlXb3JkX3QgKldvcmRQdHI7CS8qIG11c3QgYmUgZmFyIGJlY2F1c2UgV2luIFNTICE9IERTICovCkBAIC0zMTU4LDcgKzMxNzAsNyBAQAogICAgICAgICAgIGVuYWJsZSBjaGFubmVsIGludGVycnVwdHMuICBUaGlzIHdvdWxkIGFsbG93IHRoZSBnbG9iYWwgaW50ZXJydXB0CiAgICAgICAgICAgc3RhdHVzIHJlZ2lzdGVyIHRvIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIEFJT1BzIG5lZWQgc2VydmljZS4KICovCi12b2lkIHNFbkludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpCitzdGF0aWMgdm9pZCBzRW5JbnRlcnJ1cHRzKENIQU5ORUxfVCAqIENoUCwgV29yZF90IEZsYWdzKQogewogCUJ5dGVfdCBNYXNrOwkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KIApAQCAtMzIwMiw3ICszMjE0LDcgQEAKICAgICAgICAgICB0aGlzIGNoYW5uZWwncyBiaXQgZnJvbSBiZWluZyBzZXQgaW4gdGhlIEFJT1AncyBJbnRlcnJ1cHQgQ2hhbm5lbAogICAgICAgICAgIFJlZ2lzdGVyLgogKi8KLXZvaWQgc0Rpc0ludGVycnVwdHMoQ0hBTk5FTF9UICogQ2hQLCBXb3JkX3QgRmxhZ3MpCitzdGF0aWMgdm9pZCBzRGlzSW50ZXJydXB0cyhDSEFOTkVMX1QgKiBDaFAsIFdvcmRfdCBGbGFncykKIHsKIAlCeXRlX3QgTWFzazsJCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCiAKQEAgLTMyMTgsNyArMzIzMCw3IEBACiAJfQogfQogCi12b2lkIHNTZXRJbnRlcmZhY2VNb2RlKENIQU5ORUxfVCAqIENoUCwgQnl0ZV90IG1vZGUpCitzdGF0aWMgdm9pZCBzU2V0SW50ZXJmYWNlTW9kZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBtb2RlKQogewogCXNPdXRCKENoUC0+Q3RsUC0+QWlvcElPWzJdLCAobW9kZSAmIDB4MTgpIHwgQ2hQLT5DaGFuTnVtKTsKIH0KQEAgLTMyMjcsNyArMzIzOSw3IEBACiAgKiAgTm90IGFuIG9mZmljaWFsIFNTQ0kgZnVuY3Rpb24sIGJ1dCBob3cgdG8gcmVzZXQgUm9ja2V0TW9kZW1zLgogICogIElTQSBidXMgdmVyc2lvbgogICovCi12b2lkIHNNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pCitzdGF0aWMgdm9pZCBzTW9kZW1SZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgY2hhbiwgaW50IG9uKQogewogCUJ5dGVJT190IGFkZHI7CiAJQnl0ZV90IHZhbDsKQEAgLTMyNTIsNyArMzI2NCw3IEBACiAgKiAgTm90IGFuIG9mZmljaWFsIFNTQ0kgZnVuY3Rpb24sIGJ1dCBob3cgdG8gcmVzZXQgUm9ja2V0TW9kZW1zLgogICogIFBDSSBidXMgdmVyc2lvbgogICovCi12b2lkIHNQQ0lNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pCitzdGF0aWMgdm9pZCBzUENJTW9kZW1SZXNldChDT05UUk9MTEVSX1QgKiBDdGxQLCBpbnQgY2hhbiwgaW50IG9uKQogewogCUJ5dGVJT190IGFkZHI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmggYi9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oCmluZGV4IDgwMjY4NzIuLjNhOGJjYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmgKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApAQCAtMTEzMCw0NiArMTEzMCw2IEBACiAqLwogI2RlZmluZSBzV3JpdGVUeEJ5dGUoSU8sREFUQSkgc091dEIoSU8sREFUQSkKIAotaW50IHNJbml0Q29udHJvbGxlcihDT05UUk9MTEVSX1QgKiBDdGxQLAotCQkgICAgaW50IEN0bE51bSwKLQkJICAgIEJ5dGVJT190IE11ZGJhY0lPLAotCQkgICAgQnl0ZUlPX3QgKiBBaW9wSU9MaXN0LAotCQkgICAgaW50IEFpb3BJT0xpc3RTaXplLAotCQkgICAgaW50IElSUU51bSwgQnl0ZV90IEZyZXF1ZW5jeSwgaW50IFBlcmlvZGljT25seSk7Ci0KLWludCBzUENJSW5pdENvbnRyb2xsZXIoQ09OVFJPTExFUl9UICogQ3RsUCwKLQkJICAgICAgIGludCBDdGxOdW0sCi0JCSAgICAgICBCeXRlSU9fdCAqIEFpb3BJT0xpc3QsCi0JCSAgICAgICBpbnQgQWlvcElPTGlzdFNpemUsCi0JCSAgICAgICBXb3JkSU9fdCBDb25maWdJTywKLQkJICAgICAgIGludCBJUlFOdW0sCi0JCSAgICAgICBCeXRlX3QgRnJlcXVlbmN5LAotCQkgICAgICAgaW50IFBlcmlvZGljT25seSwKLQkJICAgICAgIGludCBhbHRDaGFuUmluZ0luZGljYXRvciwgaW50IFVQQ0lSaW5nSW5kKTsKLQotaW50IHNSZWFkQWlvcElEKEJ5dGVJT190IGlvKTsKLWludCBzUmVhZEFpb3BOdW1DaGFuKFdvcmRJT190IGlvKTsKLWludCBzSW5pdENoYW4oQ09OVFJPTExFUl9UICogQ3RsUCwKLQkgICAgICBDSEFOTkVMX1QgKiBDaFAsIGludCBBaW9wTnVtLCBpbnQgQ2hhbk51bSk7Ci1CeXRlX3Qgc0dldFJ4RXJyU3RhdHVzKENIQU5ORUxfVCAqIENoUCk7Ci12b2lkIHNTdG9wUnhQcm9jZXNzb3IoQ0hBTk5FTF9UICogQ2hQKTsKLXZvaWQgc1N0b3BTV0luRmxvd0N0bChDSEFOTkVMX1QgKiBDaFApOwotdm9pZCBzRmx1c2hSeEZJRk8oQ0hBTk5FTF9UICogQ2hQKTsKLXZvaWQgc0ZsdXNoVHhGSUZPKENIQU5ORUxfVCAqIENoUCk7Ci1pbnQgc1dyaXRlVHhQcmlvQnl0ZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBEYXRhKTsKLXZvaWQgc0VuSW50ZXJydXB0cyhDSEFOTkVMX1QgKiBDaFAsIFdvcmRfdCBGbGFncyk7Ci12b2lkIHNEaXNJbnRlcnJ1cHRzKENIQU5ORUxfVCAqIENoUCwgV29yZF90IEZsYWdzKTsKLXZvaWQgc01vZGVtUmVzZXQoQ09OVFJPTExFUl9UICogQ3RsUCwgaW50IGNoYW4sIGludCBvbik7Ci12b2lkIHNQQ0lNb2RlbVJlc2V0KENPTlRST0xMRVJfVCAqIEN0bFAsIGludCBjaGFuLCBpbnQgb24pOwotdm9pZCBzU2V0SW50ZXJmYWNlTW9kZShDSEFOTkVMX1QgKiBDaFAsIEJ5dGVfdCBtb2RlKTsKLQotZXh0ZXJuIEJ5dGVfdCBSW1JEQVRBU0laRV07Ci1leHRlcm4gQ09OVFJPTExFUl9UIHNDb250cm9sbGVyW0NUTF9TSVpFXTsKLWV4dGVybiBCeXRlX3Qgc0lSUU1hcFsxNl07Ci1leHRlcm4gQnl0ZV90IHNCaXRNYXBDbHJUYmxbOF07Ci1leHRlcm4gQnl0ZV90IHNCaXRNYXBTZXRUYmxbOF07Ci1leHRlcm4gaW50IHNDbG9ja1ByZXNjYWxlOwotCiAvKgogICogQmVnaW4gTGludXggc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIHRoZSBSb2NrZXRwb3J0IGRyaXZlcgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ydGMuYyBiL2RyaXZlcnMvY2hhci9ydGMuYwppbmRleCBmZjRmMDk4Li5kOGY5ZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcnRjLmMKKysrIGIvZHJpdmVycy9jaGFyL3J0Yy5jCkBAIC03OCw2ICs3OCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC04OTQsNyArODk1LDYgQEAKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKICNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX21pcHNfXykKIAl1bnNpZ25lZCBpbnQgeWVhciwgY3RybDsKLQl1bnNpZ25lZCBsb25nIHVpcF93YXRjaGRvZzsKIAljaGFyICpndWVzcyA9IE5VTEw7CiAjZW5kaWYKICNpZmRlZiBfX3NwYXJjX18KQEAgLTEwMDAsMTIgKzEwMDAsOCBAQAogCS8qIEVhY2ggb3BlcmF0aW5nIHN5c3RlbSBvbiBhbiBBbHBoYSB1c2VzIGl0cyBvd24gZXBvY2guCiAJICAgTGV0J3MgdHJ5IHRvIGd1ZXNzIHdoaWNoIG9uZSB3ZSBhcmUgdXNpbmcgbm93LiAqLwogCQotCXVpcF93YXRjaGRvZyA9IGppZmZpZXM7CiAJaWYgKHJ0Y19pc191cGRhdGluZygpICE9IDApCi0JCXdoaWxlIChqaWZmaWVzIC0gdWlwX3dhdGNoZG9nIDwgMipIWi8xMDApIHsgCi0JCQliYXJyaWVyKCk7Ci0JCQljcHVfcmVsYXgoKTsKLQkJfQorCQltc2xlZXAoMjApOwogCQogCXNwaW5fbG9ja19pcnEoJnJ0Y19sb2NrKTsKIAl5ZWFyID0gQ01PU19SRUFEKFJUQ19ZRUFSKTsKQEAgLTEyMTMsNyArMTIwOSw2IEBACiAKIHZvaWQgcnRjX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKIHsKLQl1bnNpZ25lZCBsb25nIHVpcF93YXRjaGRvZyA9IGppZmZpZXM7CiAJdW5zaWduZWQgY2hhciBjdHJsOwogI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KIAl1bnNpZ25lZCBpbnQgcmVhbF95ZWFyOwpAQCAtMTIyMSw3ICsxMjE2LDcgQEAKIAogCS8qCiAJICogcmVhZCBSVEMgb25jZSBhbnkgdXBkYXRlIGluIHByb2dyZXNzIGlzIGRvbmUuIFRoZSB1cGRhdGUKLQkgKiBjYW4gdGFrZSBqdXN0IG92ZXIgMm1zLiBXZSB3YWl0IDEwIHRvIDIwbXMuIFRoZXJlIGlzIG5vIG5lZWQgdG8KKwkgKiBjYW4gdGFrZSBqdXN0IG92ZXIgMm1zLiBXZSB3YWl0IDIwbXMuIFRoZXJlIGlzIG5vIG5lZWQgdG8KIAkgKiB0byBwb2xsLXdhaXQgKHVwIHRvIDFzIC0gZWVjY2NoKSBmb3IgdGhlIGZhbGxpbmcgZWRnZSBvZiBSVENfVUlQLgogCSAqIElmIHlvdSBuZWVkIHRvIGtub3cgKmV4YWN0bHkqIHdoZW4gYSBzZWNvbmQgaGFzIHN0YXJ0ZWQsIGVuYWJsZQogCSAqIHBlcmlvZGljIHVwZGF0ZSBjb21wbGV0ZSBpbnRlcnJ1cHRzLCAodmlhIGlvY3RsKSBhbmQgdGhlbiAKQEAgLTEyMzAsMTAgKzEyMjUsNyBAQAogCSAqLwogCiAJaWYgKHJ0Y19pc191cGRhdGluZygpICE9IDApCi0JCXdoaWxlIChqaWZmaWVzIC0gdWlwX3dhdGNoZG9nIDwgMipIWi8xMDApIHsKLQkJCWJhcnJpZXIoKTsKLQkJCWNwdV9yZWxheCgpOwotCQl9CisJCW1zbGVlcCgyMCk7CiAKIAkvKgogCSAqIE9ubHkgdGhlIHZhbHVlcyB0aGF0IHdlIHJlYWQgZnJvbSB0aGUgUlRDIGFyZSBzZXQuIFdlIGxlYXZlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3lzcnEuYyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCmluZGV4IGY1OWY3Y2IuLjEyZDU2M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeXNycS5jCisrKyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIApAQCAtOTQsNiArOTUsMjEgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1ZUICovCiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKKy8qIGNyYXNoZHVtcCBzeXNycSBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfY3Jhc2hkdW1wKGludCBrZXksIHN0cnVjdCBwdF9yZWdzICpwdF9yZWdzLAorCQkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJY3Jhc2hfa2V4ZWMocHRfcmVncyk7Cit9CitzdGF0aWMgc3RydWN0IHN5c3JxX2tleV9vcCBzeXNycV9jcmFzaGR1bXBfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfY3Jhc2hkdW1wLAorCS5oZWxwX21zZwk9ICJDcmFzaGR1bXAiLAorCS5hY3Rpb25fbXNnCT0gIlRyaWdnZXIgYSBjcmFzaGR1bXAiLAorCS5lbmFibGVfbWFzawk9IFNZU1JRX0VOQUJMRV9EVU1QLAorfTsKKyNlbmRpZgorCiAvKiByZWJvb3Qgc3lzcnEgaGFuZGxlciAqLwogc3RhdGljIHZvaWQgc3lzcnFfaGFuZGxlX3JlYm9vdChpbnQga2V5LCBzdHJ1Y3QgcHRfcmVncyAqcHRfcmVncywKIAkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KSAKQEAgLTIxMiw3ICsyMjgsNyBAQAogCiBzdGF0aWMgdm9pZCBtb29tX2NhbGxiYWNrKHZvaWQgKmlnbm9yZWQpCiB7Ci0Jb3V0X29mX21lbW9yeShHRlBfS0VSTkVMKTsKKwlvdXRfb2ZfbWVtb3J5KEdGUF9LRVJORUwsIDApOwogfQogCiBzdGF0aWMgREVDTEFSRV9XT1JLKG1vb21fd29yaywgbW9vbV9jYWxsYmFjaywgTlVMTCk7CkBAIC0yNzMsOCArMjg5LDEyIEBACiAJCSBpdCBpcyBoYW5kbGVkIHNwZWNpYWxseSBvbiB0aGUgc3BhcmMKIAkJIGFuZCB3aWxsIG5ldmVyIGFycml2ZSAqLwogLyogYiAqLwkmc3lzcnFfcmVib290X29wLAotLyogYyAqLyBOVUxMLAotLyogZCAqLwlOVUxMLAorI2lmZGVmIENPTkZJR19LRVhFQworLyogYyAqLyAmc3lzcnFfY3Jhc2hkdW1wX29wLAorI2Vsc2UKKy8qIGMgKi8JTlVMTCwKKyNlbmRpZgorLyogZCAqLyBOVUxMLAogLyogZSAqLwkmc3lzcnFfdGVybV9vcCwKIC8qIGYgKi8JJnN5c3JxX21vb21fb3AsCiAvKiBnICovCU5VTEwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGIwMjE5LmMgYi9kcml2ZXJzL2NoYXIvdGIwMjE5LmMKaW5kZXggNTQxM2YyOS4uZWI3MDU4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RiMDIxOS5jCisrKyBiL2RyaXZlcnMvY2hhci90YjAyMTkuYwpAQCAtMjQsNiArMjQsOCBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS92cjQxeHgvZ2l1Lmg+CisjaW5jbHVkZSA8YXNtL3ZyNDF4eC90YjAyMTkuaD4KIAogTU9EVUxFX0FVVEhPUigiWW9pY2hpIFl1YXNhIDx5dWFzYUBoaC5paWo0dS5vci5qcD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVEFOQkFDIFRCMDIxOSBiYXNlIGJvYXJkIGRyaXZlciIpOwpAQCAtMjY2LDYgKzI2OCwyMSBAQAogCXRiMDIxOV93cml0ZShUQjAyMTlfUkVTRVQsIDApOwogfQogCitzdGF0aWMgdm9pZCB0YjAyMTlfcGNpX2lycV9pbml0KHZvaWQpCit7CisJLyogUENJIFNsb3QgMSAqLworCXZyNDF4eF9zZXRfaXJxX3RyaWdnZXIoVEIwMjE5X1BDSV9TTE9UMV9QSU4sIElSUV9UUklHR0VSX0xFVkVMLCBJUlFfU0lHTkFMX1RIUk9VR0gpOworCXZyNDF4eF9zZXRfaXJxX2xldmVsKFRCMDIxOV9QQ0lfU0xPVDFfUElOLCBJUlFfTEVWRUxfTE9XKTsKKworCS8qIFBDSSBTbG90IDIgKi8KKwl2cjQxeHhfc2V0X2lycV90cmlnZ2VyKFRCMDIxOV9QQ0lfU0xPVDJfUElOLCBJUlFfVFJJR0dFUl9MRVZFTCwgSVJRX1NJR05BTF9USFJPVUdIKTsKKwl2cjQxeHhfc2V0X2lycV9sZXZlbChUQjAyMTlfUENJX1NMT1QyX1BJTiwgSVJRX0xFVkVMX0xPVyk7CisKKwkvKiBQQ0kgU2xvdCAzICovCisJdnI0MXh4X3NldF9pcnFfdHJpZ2dlcihUQjAyMTlfUENJX1NMT1QzX1BJTiwgSVJRX1RSSUdHRVJfTEVWRUwsIElSUV9TSUdOQUxfVEhST1VHSCk7CisJdnI0MXh4X3NldF9pcnFfbGV2ZWwoVEIwMjE5X1BDSV9TTE9UM19QSU4sIElSUV9MRVZFTF9MT1cpOworfQorCiBzdGF0aWMgaW50IHRiMDIxOV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldHZhbDsKQEAgLTI5Miw2ICszMDksOCBAQAogCW9sZF9tYWNoaW5lX3Jlc3RhcnQgPSBfbWFjaGluZV9yZXN0YXJ0OwogCV9tYWNoaW5lX3Jlc3RhcnQgPSB0YjAyMTlfcmVzdGFydDsKIAorCXRiMDIxOV9wY2lfaXJxX2luaXQoKTsKKwogCWlmIChtYWpvciA9PSAwKSB7CiAJCW1ham9yID0gcmV0dmFsOwogCQlwcmludGsoS0VSTl9JTkZPICJUQjAyMTk6IG1ham9yIG51bWJlciAlZFxuIiwgbWFqb3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpcGFyLmMgYi9kcml2ZXJzL2NoYXIvdGlwYXIuYwppbmRleCA2NTkzMzVkOC4uZWM3OGQyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RpcGFyLmMKKysrIGIvZHJpdmVycy9jaGFyL3RpcGFyLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogc3RhdGljIGludCBfX2luaXQKIHRpcGFyX3NldHVwKGNoYXIgKnN0cikKIHsKLQlpbnQgaW50c1syXTsKKwlpbnQgaW50c1szXTsKIAogCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90b3NoaWJhLmMgYi9kcml2ZXJzL2NoYXIvdG9zaGliYS5jCmluZGV4IDU4ZTIxZmUuLjBjNmY1MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90b3NoaWJhLmMKKysrIGIvZHJpdmVycy9jaGFyL3Rvc2hpYmEuYwpAQCAtNzMsMTYgKzczLDIwIEBACiAKICNkZWZpbmUgVE9TSF9NSU5PUl9ERVYgMTgxCiAKLXN0YXRpYyBpbnQgdG9zaF9pZCA9IDB4MDAwMDsKLXN0YXRpYyBpbnQgdG9zaF9iaW9zID0gMHgwMDAwOwotc3RhdGljIGludCB0b3NoX2RhdGUgPSAweDAwMDA7Ci1zdGF0aWMgaW50IHRvc2hfc2NpID0gMHgwMDAwOwotc3RhdGljIGludCB0b3NoX2ZhbiA9IDA7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBCdXp6YXJkIDxqb25hdGhhbkBidXp6YXJkLm9yZy51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVG9zaGliYSBsYXB0b3AgU01NIGRyaXZlciIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInRvc2hpYmEiKTsKIAotc3RhdGljIGludCB0b3NoX2ZuID0gMDsKK3N0YXRpYyBpbnQgdG9zaF9mbjsKK21vZHVsZV9wYXJhbV9uYW1lZChmbiwgdG9zaF9mbiwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm4sICJVc2VyIHNwZWNpZmllZCBGbiBrZXkgZGV0ZWN0aW9uIHBvcnQiKTsKIAotbW9kdWxlX3BhcmFtKHRvc2hfZm4sIGludCwgMCk7Ci0KK3N0YXRpYyBpbnQgdG9zaF9pZDsKK3N0YXRpYyBpbnQgdG9zaF9iaW9zOworc3RhdGljIGludCB0b3NoX2RhdGU7CitzdGF0aWMgaW50IHRvc2hfc2NpOworc3RhdGljIGludCB0b3NoX2ZhbjsKIAogc3RhdGljIGludCB0b3NoX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCiAJdW5zaWduZWQgbG9uZyk7CkBAIC0zNTksNyArMzYzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CiAKIAlpZCA9ICgweDEwMCooaW50KSBpc2FfcmVhZGIoMHhmZmZmZSkpKygoaW50KSBpc2FfcmVhZGIoMHhmZmZmYSkpOwotCQorCiAJLyogZG8gd2UgaGF2ZSBhIFNDVFRhYmxlIG1hY2hpbmUgaWRlbnRpY2F0aW9uIG51bWJlciBvbiBvdXIgaGFuZHMgKi8KIAogCWlmIChpZD09MHhmYzJmKSB7CkBAIC00MjQsNyArNDI4LDcgQEAKIAl9CiAKIAkvKiBjYWxsIHRoZSBUb3NoaWJhIFNDSSBzdXBwb3J0IGNoZWNrIHJvdXRpbmUgKi8KLQkKKwogCXJlZ3MuZWF4ID0gMHhmMGYwOwogCXJlZ3MuZWJ4ID0gMHgwMDAwOwogCXJlZ3MuZWN4ID0gMHgwMDAwOwpAQCAtNDQwLDcgKzQ0NCw3IEBACiAJLyogaWYgd2UgZ2V0IHRoaXMgZmFyIHRoZW4gd2UgYXJlIHJ1bm5pbmcgb24gYSBUb3NoaWJhIChwcm9iYWJseSkhICovCiAKIAl0b3NoX3NjaSA9IHJlZ3MuZWR4ICYgMHhmZmZmOwotCQorCiAJLyogbmV4dCBnZXQgdGhlIG1hY2hpbmUgSUQgb2YgdGhlIGN1cnJlbnQgbGFwdG9wICovCiAKIAl0b3NoX2lkID0gdG9zaF9nZXRfbWFjaGluZV9pZCgpOwpAQCAtNDc1LDE2ICs0NzksMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9faW5pdCB0b3NoX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHRvc2hpYmFfaW5pdCh2b2lkKQogewogCWludCByZXR2YWw7CiAJLyogYXJlIHdlIHJ1bm5pbmcgb24gYSBUb3NoaWJhIGxhcHRvcCAqLwogCi0JaWYgKHRvc2hfcHJvYmUoKSE9MCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKHRvc2hfcHJvYmUoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcmludGsoS0VSTl9JTkZPICJUb3NoaWJhIFN5c3RlbSBNYW5hZ21lbnQgTW9kZSBkcml2ZXIgdiIKLQkJVE9TSF9WRVJTSU9OIlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiVG9zaGliYSBTeXN0ZW0gTWFuYWdtZW50IE1vZGUgZHJpdmVyIHYiIFRPU0hfVkVSU0lPTiAiXG4iKTsKIAogCS8qIHNldCB0aGUgcG9ydCB0byB1c2UgZm9yIEZuIHN0YXR1cyBpZiBub3Qgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyICovCiAJaWYgKHRvc2hfZm49PTB4MDApCkBAIC00OTIsMTIgKzQ5NSwxMiBAQAogCiAJLyogcmVnaXN0ZXIgdGhlIGRldmljZSBmaWxlICovCiAJcmV0dmFsID0gbWlzY19yZWdpc3RlcigmdG9zaF9kZXZpY2UpOwotCWlmKHJldHZhbCA8IDApCisJaWYgKHJldHZhbCA8IDApCiAJCXJldHVybiByZXR2YWw7CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCS8qIHJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5ICovCi0JaWYoY3JlYXRlX3Byb2NfaW5mb19lbnRyeSgidG9zaGliYSIsIDAsIE5VTEwsIHRvc2hfZ2V0X2luZm8pID09IE5VTEwpeworCWlmIChjcmVhdGVfcHJvY19pbmZvX2VudHJ5KCJ0b3NoaWJhIiwgMCwgTlVMTCwgdG9zaF9nZXRfaW5mbykgPT0gTlVMTCkgewogCQltaXNjX2RlcmVnaXN0ZXIoJnRvc2hfZGV2aWNlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtNTA2LDI3ICs1MDksMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIE1PRFVMRQotaW50IGluaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgdG9zaGliYV9leGl0KHZvaWQpCiB7Ci0JcmV0dXJuIHRvc2hfaW5pdCgpOwotfQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JLyogcmVtb3ZlIHRoZSBwcm9jIGVudHJ5ICovCi0KIAlyZW1vdmVfcHJvY19lbnRyeSgidG9zaGliYSIsIE5VTEwpOwotCi0JLyogdW5yZWdpc3RlciB0aGUgZGV2aWNlIGZpbGUgKi8KLQogCW1pc2NfZGVyZWdpc3RlcigmdG9zaF9kZXZpY2UpOwogfQotI2VuZGlmCiAKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9QQVJNX0RFU0ModG9zaF9mbiwgIlVzZXIgc3BlY2lmaWVkIEZuIGtleSBkZXRlY3Rpb24gcG9ydCIpOwotTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQnV6emFyZCA8am9uYXRoYW5AYnV6emFyZC5vcmcudWs+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlRvc2hpYmEgbGFwdG9wIFNNTSBkcml2ZXIiKTsKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ0b3NoaWJhIik7Cittb2R1bGVfaW5pdCh0b3NoaWJhX2luaXQpOworbW9kdWxlX2V4aXQodG9zaGliYV9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmMKaW5kZXggOGNlNTA4Yi4uMDQ5ZDEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiAKICAqIE5vdGUsIHRoZSBUUE0gY2hpcCBpcyBub3QgaW50ZXJydXB0IGRyaXZlbiAob25seSBwb2xsaW5nKQogICogYW5kIGNhbiBoYXZlIHZlcnkgbG9uZyB0aW1lb3V0cyAobWludXRlcyEpLiBIZW5jZSB0aGUgdW51c3VhbAotICogY2FsbHMgdG8gc2NoZWR1bGVfdGltZW91dC4KKyAqIGNhbGxzIHRvIG1zbGVlcC4KICAqCiAgKi8KIApAQCAtMjgsMTkgKzI4LDE2IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlICJ0cG0uaCIKIAotI2RlZmluZQlUUE1fTUlOT1IJCQkyMjQJLyogb2ZmaWNpYWxseSBhc3NpZ25lZCAqLwotCi0jZGVmaW5lCVRQTV9CVUZTSVpFCQkJMjA0OAotCi0vKiBQQ0kgY29uZmlndXJhdGlvbiBhZGRyZXNzZXMgKi8KLSNkZWZpbmUJUENJX0dFTl9QTUNPTl8xCQkJMHhBMAotI2RlZmluZQlQQ0lfR0VOMV9ERUMJCQkweEU0Ci0jZGVmaW5lCVBDSV9MUENfRU4JCQkweEU2Ci0jZGVmaW5lCVBDSV9HRU4yX0RFQwkJCTB4RUMKK2VudW0gdHBtX2NvbnN0IHsKKwlUUE1fTUlOT1IgPSAyMjQsCS8qIG9mZmljaWFsbHkgYXNzaWduZWQgKi8KKwlUUE1fQlVGU0laRSA9IDIwNDgsCisJVFBNX05VTV9ERVZJQ0VTID0gMjU2LAorCVRQTV9OVU1fTUFTS19FTlRSSUVTID0gVFBNX05VTV9ERVZJQ0VTIC8gKDggKiBzaXplb2YoaW50KSkKK307CiAKIHN0YXRpYyBMSVNUX0hFQUQodHBtX2NoaXBfbGlzdCk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRyaXZlcl9sb2NrKTsKLXN0YXRpYyBpbnQgZGV2X21hc2tbMzJdOworc3RhdGljIGludCBkZXZfbWFza1tUUE1fTlVNX01BU0tfRU5UUklFU107CiAKIHN0YXRpYyB2b2lkIHVzZXJfcmVhZGVyX3RpbWVvdXQodW5zaWduZWQgbG9uZyBwdHIpCiB7CkBAIC01Miw5MiArNDksMTcgQEAKIAl1cCgmY2hpcC0+YnVmZmVyX211dGV4KTsKIH0KIAotdm9pZCB0cG1fdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgcHRyKQotewotCWludCAqZXhwID0gKGludCAqKSBwdHI7Ci0JKmV4cCA9IDE7Ci19Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKHRwbV90aW1lX2V4cGlyZWQpOwotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgTFBDIGJ1cyBhbmQgZW5hYmxlIHRoZSBUUE0gcG9ydHMKLSAqLwotaW50IHRwbV9scGNfYnVzX2luaXQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHUxNiBiYXNlKQotewotCXUzMiBscGNlbmFibGUsIHRtcDsKLQlpbnQgaXNfbHBjbSA9IDA7Ci0KLQlzd2l0Y2ggKHBjaV9kZXYtPnZlbmRvcikgewotCWNhc2UgUENJX1ZFTkRPUl9JRF9JTlRFTDoKLQkJc3dpdGNoIChwY2lfZGV2LT5kZXZpY2UpIHsKLQkJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTI6Ci0JCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzEyOgotCQkJaXNfbHBjbSA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBpbml0IElDSCAoZW5hYmxlIExQQykgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4xX0RFQywgJmxwY2VuYWJsZSk7Ci0JCWxwY2VuYWJsZSB8PSAweDIwMDAwMDAwOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4xX0RFQywgbHBjZW5hYmxlKTsKLQotCQlpZiAoaXNfbHBjbSkgewotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4xX0RFQywKLQkJCQkJICAgICAgJmxwY2VuYWJsZSk7Ci0JCQlpZiAoKGxwY2VuYWJsZSAmIDB4MjAwMDAwMDApID09IDApIHsKLQkJCQlkZXZfZXJyKCZwY2lfZGV2LT5kZXYsCi0JCQkJCSJjYW5ub3QgZW5hYmxlIExQQ1xuIik7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQl9Ci0JCX0KLQotCQkvKiBpbml0aWFsaXplIFRQTSByZWdpc3RlcnMgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4yX0RFQywgJnRtcCk7Ci0KLQkJaWYgKCFpc19scGNtKQotCQkJdG1wID0gKHRtcCAmIDB4RkZGRjAwMDApIHwgKGJhc2UgJiAweEZGRjApOwotCQllbHNlCi0JCQl0bXAgPQotCQkJICAgICh0bXAgJiAweEZGRkYwMDAwKSB8IChiYXNlICYgMHhGRkYwKSB8Ci0JCQkgICAgMHgwMDAwMDAwMTsKLQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU4yX0RFQywgdG1wKTsKLQotCQlpZiAoaXNfbHBjbSkgewotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIFBDSV9HRU5fUE1DT05fMSwKLQkJCQkJICAgICAgJnRtcCk7Ci0JCQl0bXAgfD0gMHgwMDAwMDAwNDsJLyogZW5hYmxlIENMS1JVTiAqLwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfR0VOX1BNQ09OXzEsCi0JCQkJCSAgICAgICB0bXApOwotCQl9Ci0JCXRwbV93cml0ZV9pbmRleCgweDBELCAweDU1KTsJLyogdW5sb2NrIDRGICovCi0JCXRwbV93cml0ZV9pbmRleCgweDBBLCAweDAwKTsJLyogaW50IGRpc2FibGUgKi8KLQkJdHBtX3dyaXRlX2luZGV4KDB4MDgsIGJhc2UpOwkvKiBiYXNlIGFkZHIgbG8gKi8KLQkJdHBtX3dyaXRlX2luZGV4KDB4MDksIChiYXNlICYgMHhGRjAwKSA+PiA4KTsJLyogYmFzZSBhZGRyIGhpICovCi0JCXRwbV93cml0ZV9pbmRleCgweDBELCAweEFBKTsJLyogbG9jayA0RiAqLwotCQlicmVhazsKLQljYXNlIFBDSV9WRU5ET1JfSURfQU1EOgotCQkvKiBub3RoaW5nIHlldCAqLwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwodHBtX2xwY19idXNfaW5pdCk7Ci0KIC8qCiAgKiBJbnRlcm5hbCBrZXJuZWwgaW50ZXJmYWNlIHRvIHRyYW5zbWl0IFRQTSBjb21tYW5kcwogICovCiBzdGF0aWMgc3NpemVfdCB0cG1fdHJhbnNtaXQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCBjaGFyICpidWYsCiAJCQkgICAgc2l6ZV90IGJ1ZnNpeikKIHsKLQlzc2l6ZV90IGxlbjsKKwlzc2l6ZV90IHJjOwogCXUzMiBjb3VudDsKLQlfX2JlMzIgKm5hdGl2ZV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3RvcDsKIAotCW5hdGl2ZV9zaXplID0gKF9fZm9yY2UgX19iZTMyICopIChidWYgKyAyKTsKLQljb3VudCA9IGJlMzJfdG9fY3B1KCpuYXRpdmVfc2l6ZSk7CisJY291bnQgPSBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKikgKGJ1ZiArIDIpKSk7CiAKIAlpZiAoY291bnQgPT0gMCkKIAkJcmV0dXJuIC1FTk9EQVRBOwpAQCAtMTQ5LDUzICs3MSw0OSBAQAogCiAJZG93bigmY2hpcC0+dHBtX211dGV4KTsKIAotCWlmICgobGVuID0gY2hpcC0+dmVuZG9yLT5zZW5kKGNoaXAsICh1OCAqKSBidWYsIGNvdW50KSkgPCAwKSB7CisJaWYgKChyYyA9IGNoaXAtPnZlbmRvci0+c2VuZChjaGlwLCAodTggKikgYnVmLCBjb3VudCkpIDwgMCkgewogCQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsCi0JCQkidHBtX3RyYW5zbWl0OiB0cG1fc2VuZDogZXJyb3IgJXpkXG4iLCBsZW4pOwotCQlyZXR1cm4gbGVuOworCQkJInRwbV90cmFuc21pdDogdHBtX3NlbmQ6IGVycm9yICV6ZFxuIiwgcmMpOworCQlnb3RvIG91dDsKIAl9CiAKLQlkb3duKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOwotCWNoaXAtPnRpbWVfZXhwaXJlZCA9IDA7Ci0JaW5pdF90aW1lcigmY2hpcC0+ZGV2aWNlX3RpbWVyKTsKLQljaGlwLT5kZXZpY2VfdGltZXIuZnVuY3Rpb24gPSB0cG1fdGltZV9leHBpcmVkOwotCWNoaXAtPmRldmljZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDIgKiA2MCAqIEhaOwotCWNoaXAtPmRldmljZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZjaGlwLT50aW1lX2V4cGlyZWQ7Ci0JYWRkX3RpbWVyKCZjaGlwLT5kZXZpY2VfdGltZXIpOwotCXVwKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOwotCisJc3RvcCA9IGppZmZpZXMgKyAyICogNjAgKiBIWjsKIAlkbyB7CiAJCXU4IHN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyAxKTsKIAkJaWYgKChzdGF0dXMgJiBjaGlwLT52ZW5kb3ItPnJlcV9jb21wbGV0ZV9tYXNrKSA9PQogCQkgICAgY2hpcC0+dmVuZG9yLT5yZXFfY29tcGxldGVfdmFsKSB7Ci0JCQlkb3duKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOwotCQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+ZGV2aWNlX3RpbWVyKTsKLQkJCXVwKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOwogCQkJZ290byBvdXRfcmVjdjsKIAkJfQotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoVFBNX1RJTUVPVVQpOworCisJCWlmICgoc3RhdHVzID09IGNoaXAtPnZlbmRvci0+cmVxX2NhbmNlbGVkKSkgeworCQkJZGV2X2VycigmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiT3BlcmF0aW9uIENhbmNlbGVkXG4iKTsKKwkJCXJjID0gLUVDQU5DRUxFRDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbXNsZWVwKFRQTV9USU1FT1VUKTsJLyogQ0hFQ0sgKi8KIAkJcm1iKCk7Ci0JfSB3aGlsZSAoIWNoaXAtPnRpbWVfZXhwaXJlZCk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgc3RvcCkpOwogCiAKIAljaGlwLT52ZW5kb3ItPmNhbmNlbChjaGlwKTsKLQlkZXZfZXJyKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJUaW1lIGV4cGlyZWRcbiIpOwotCXVwKCZjaGlwLT50cG1fbXV0ZXgpOwotCXJldHVybiAtRUlPOworCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIk9wZXJhdGlvbiBUaW1lZCBvdXRcbiIpOworCXJjID0gLUVUSU1FOworCWdvdG8gb3V0OwogCiBvdXRfcmVjdjoKLQlsZW4gPSBjaGlwLT52ZW5kb3ItPnJlY3YoY2hpcCwgKHU4ICopIGJ1ZiwgYnVmc2l6KTsKLQlpZiAobGVuIDwgMCkKKwlyYyA9IGNoaXAtPnZlbmRvci0+cmVjdihjaGlwLCAodTggKikgYnVmLCBidWZzaXopOworCWlmIChyYyA8IDApCiAJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwKLQkJCSJ0cG1fdHJhbnNtaXQ6IHRwbV9yZWN2OiBlcnJvciAlemRcbiIsIGxlbik7CisJCQkidHBtX3RyYW5zbWl0OiB0cG1fcmVjdjogZXJyb3IgJXpkXG4iLCByYyk7CitvdXQ6CiAJdXAoJmNoaXAtPnRwbV9tdXRleCk7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gcmM7CiB9CiAKICNkZWZpbmUgVFBNX0RJR0VTVF9TSVpFIDIwCiAjZGVmaW5lIENBUF9QQ1JfUkVTVUxUX1NJWkUgMTgKLXN0YXRpYyB1OCBjYXBfcGNyW10gPSB7CitzdGF0aWMgY29uc3QgdTggY2FwX3BjcltdID0gewogCTAsIDE5MywJCQkvKiBUUE1fVEFHX1JRVV9DT01NQU5EICovCiAJMCwgMCwgMCwgMjIsCQkvKiBsZW5ndGggKi8KIAkwLCAwLCAwLCAxMDEsCQkvKiBUUE1fT1JEX0dldENhcGFiaWxpdHkgKi8KQEAgLTIwNSw3NSArMTIzLDk0IEBACiB9OwogCiAjZGVmaW5lIFJFQURfUENSX1JFU1VMVF9TSVpFIDMwCi1zdGF0aWMgdTggcGNycmVhZFtdID0geworc3RhdGljIGNvbnN0IHU4IHBjcnJlYWRbXSA9IHsKIAkwLCAxOTMsCQkJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLwogCTAsIDAsIDAsIDE0LAkJLyogbGVuZ3RoICovCiAJMCwgMCwgMCwgMjEsCQkvKiBUUE1fT1JEX1BjclJlYWQgKi8KIAkwLCAwLCAwLCAwCQkvKiBQQ1IgaW5kZXggKi8KIH07CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfcGNycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzc2l6ZV90IHRwbV9zaG93X3BjcnMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY2hhciAqYnVmKQogewogCXU4IGRhdGFbUkVBRF9QQ1JfUkVTVUxUX1NJWkVdOwogCXNzaXplX3QgbGVuOwotCWludCBpLCBqLCBpbmRleCwgbnVtX3BjcnM7CisJaW50IGksIGosIG51bV9wY3JzOworCV9fYmUzMiBpbmRleDsKIAljaGFyICpzdHIgPSBidWY7CiAKIAlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPQotCSAgICBwY2lfZ2V0X2RydmRhdGEoY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldikpOworCSAgICBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCW1lbWNweShkYXRhLCBjYXBfcGNyLCBzaXplb2YoY2FwX3BjcikpOwogCWlmICgobGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsIGRhdGEsIHNpemVvZihkYXRhKSkpCi0JICAgIDwgQ0FQX1BDUl9SRVNVTFRfU0laRSkKLQkJcmV0dXJuIGxlbjsKKwkgICAgPCBDQVBfUENSX1JFU1VMVF9TSVpFKSB7CisJCWRldl9kYmcoJmNoaXAtPnBjaV9kZXYtPmRldiwgIkEgVFBNIGVycm9yICglZCkgb2NjdXJyZWQgIgorCQkJCSJhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIFBDUlNcbiIsCisJCQliZTMyX3RvX2NwdSgqKChfX2JlMzIgKikgKGRhdGEgKyA2KSkpKTsKKwkJcmV0dXJuIDA7CisJfQogCi0JbnVtX3BjcnMgPSBiZTMyX3RvX2NwdSgqKChfX2ZvcmNlIF9fYmUzMiAqKSAoZGF0YSArIDE0KSkpOworCW51bV9wY3JzID0gYmUzMl90b19jcHUoKigoX19iZTMyICopIChkYXRhICsgMTQpKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3BjcnM7IGkrKykgewogCQltZW1jcHkoZGF0YSwgcGNycmVhZCwgc2l6ZW9mKHBjcnJlYWQpKTsKIAkJaW5kZXggPSBjcHVfdG9fYmUzMihpKTsKIAkJbWVtY3B5KGRhdGEgKyAxMCwgJmluZGV4LCA0KTsKIAkJaWYgKChsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgZGF0YSwgc2l6ZW9mKGRhdGEpKSkKLQkJICAgIDwgUkVBRF9QQ1JfUkVTVUxUX1NJWkUpCi0JCQlyZXR1cm4gbGVuOworCQkgICAgPCBSRUFEX1BDUl9SRVNVTFRfU0laRSl7CisJCQlkZXZfZGJnKCZjaGlwLT5wY2lfZGV2LT5kZXYsICJBIFRQTSBlcnJvciAoJWQpIG9jY3VycmVkIgorCQkJCSIgYXR0ZW1wdGluZyB0byByZWFkIFBDUiAlZCBvZiAlZFxuIiwKKwkJCQliZTMyX3RvX2NwdSgqKChfX2JlMzIgKikgKGRhdGEgKyA2KSkpLCBpLCBudW1fcGNycyk7CisJCQlnb3RvIG91dDsKKwkJfQogCQlzdHIgKz0gc3ByaW50ZihzdHIsICJQQ1ItJTAyZDogIiwgaSk7CiAJCWZvciAoaiA9IDA7IGogPCBUUE1fRElHRVNUX1NJWkU7IGorKykKIAkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiUwMlggIiwgKihkYXRhICsgMTAgKyBqKSk7CiAJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7CiAJfQorb3V0OgogCXJldHVybiBzdHIgLSBidWY7CiB9Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihwY3JzLCBTX0lSVUdPLCBzaG93X3BjcnMsIE5VTEwpOworRVhQT1JUX1NZTUJPTF9HUEwodHBtX3Nob3dfcGNycyk7CiAKICNkZWZpbmUgIFJFQURfUFVCRUtfUkVTVUxUX1NJWkUgMzE0Ci1zdGF0aWMgdTggcmVhZHB1YmVrW10gPSB7CitzdGF0aWMgY29uc3QgdTggcmVhZHB1YmVrW10gPSB7CiAJMCwgMTkzLAkJCS8qIFRQTV9UQUdfUlFVX0NPTU1BTkQgKi8KIAkwLCAwLCAwLCAzMCwJCS8qIGxlbmd0aCAqLwogCTAsIDAsIDAsIDEyNCwJCS8qIFRQTV9PUkRfUmVhZFB1YmVrICovCiB9OwogCi1zdGF0aWMgc3NpemVfdCBzaG93X3B1YmVrKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3NzaXplX3QgdHBtX3Nob3dfcHViZWsoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNoYXIgKmJ1ZikKIHsKLQl1OCBkYXRhW1JFQURfUFVCRUtfUkVTVUxUX1NJWkVdOworCXU4ICpkYXRhOwogCXNzaXplX3QgbGVuOwotCV9fYmUzMiAqbmF0aXZlX3ZhbDsKLQlpbnQgaTsKKwlpbnQgaSwgcmM7CiAJY2hhciAqc3RyID0gYnVmOwogCiAJc3RydWN0IHRwbV9jaGlwICpjaGlwID0KLQkgICAgcGNpX2dldF9kcnZkYXRhKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpKTsKKwkgICAgcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CiAJaWYgKGNoaXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlkYXRhID0ga21hbGxvYyhSRUFEX1BVQkVLX1JFU1VMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCiAJbWVtY3B5KGRhdGEsIHJlYWRwdWJlaywgc2l6ZW9mKHJlYWRwdWJlaykpOwogCW1lbXNldChkYXRhICsgc2l6ZW9mKHJlYWRwdWJlayksIDAsIDIwKTsJLyogemVybyBub25jZSAqLwogCi0JaWYgKChsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgZGF0YSwgc2l6ZW9mKGRhdGEpKSkgPAotCSAgICBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFKQotCQlyZXR1cm4gbGVuOworCWlmICgobGVuID0gdHBtX3RyYW5zbWl0KGNoaXAsIGRhdGEsIFJFQURfUFVCRUtfUkVTVUxUX1NJWkUpKSA8CisJICAgIFJFQURfUFVCRUtfUkVTVUxUX1NJWkUpIHsKKwkJZGV2X2RiZygmY2hpcC0+cGNpX2Rldi0+ZGV2LCAiQSBUUE0gZXJyb3IgKCVkKSBvY2N1cnJlZCAiCisJCQkJImF0dGVtcHRpbmcgdG8gcmVhZCB0aGUgUFVCRUtcbiIsCisJCQkgICAgYmUzMl90b19jcHUoKigoX19iZTMyICopIChkYXRhICsgNikpKSk7CisJCXJjID0gMDsKKwkJZ290byBvdXQ7CisJfQogCiAJLyogCiAJICAgaWdub3JlIGhlYWRlciAxMCBieXRlcwpAQCAtMjg2LDggKzIyMyw2IEBACiAJICAgaWdub3JlIGNoZWNrc3VtIDIwIGJ5dGVzCiAJICovCiAKLQluYXRpdmVfdmFsID0gKF9fZm9yY2UgX19iZTMyICopIChkYXRhICsgMzQpOwotCiAJc3RyICs9CiAJICAgIHNwcmludGYoc3RyLAogCQkgICAgIkFsZ29yaXRobTogJTAyWCAlMDJYICUwMlggJTAyWFxuRW5jc2NoZW1lOiAlMDJYICUwMlhcbiIKQEAgLTI5OCwyMSArMjMzLDIzIEBACiAJCSAgICBkYXRhWzE1XSwgZGF0YVsxNl0sIGRhdGFbMTddLCBkYXRhWzIyXSwgZGF0YVsyM10sCiAJCSAgICBkYXRhWzI0XSwgZGF0YVsyNV0sIGRhdGFbMjZdLCBkYXRhWzI3XSwgZGF0YVsyOF0sCiAJCSAgICBkYXRhWzI5XSwgZGF0YVszMF0sIGRhdGFbMzFdLCBkYXRhWzMyXSwgZGF0YVszM10sCi0JCSAgICBiZTMyX3RvX2NwdSgqbmF0aXZlX3ZhbCkKLQkgICAgKTsKKwkJICAgIGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAoZGF0YSArIDM0KSkpKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlzdHIgKz0gc3ByaW50ZihzdHIsICIlMDJYICIsIGRhdGFbaSArIDM5XSk7CisJCXN0ciArPSBzcHJpbnRmKHN0ciwgIiUwMlggIiwgZGF0YVtpICsgMzhdKTsKIAkJaWYgKChpICsgMSkgJSAxNiA9PSAwKQogCQkJc3RyICs9IHNwcmludGYoc3RyLCAiXG4iKTsKIAl9Ci0JcmV0dXJuIHN0ciAtIGJ1ZjsKKwlyYyA9IHN0ciAtIGJ1ZjsKK291dDoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBERVZJQ0VfQVRUUihwdWJlaywgU19JUlVHTywgc2hvd19wdWJlaywgTlVMTCk7CitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fc2hvd19wdWJlayk7CiAKICNkZWZpbmUgQ0FQX1ZFUl9SRVNVTFRfU0laRSAxOAotc3RhdGljIHU4IGNhcF92ZXJzaW9uW10gPSB7CitzdGF0aWMgY29uc3QgdTggY2FwX3ZlcnNpb25bXSA9IHsKIAkwLCAxOTMsCQkJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLwogCTAsIDAsIDAsIDE4LAkJLyogbGVuZ3RoICovCiAJMCwgMCwgMCwgMTAxLAkJLyogVFBNX09SRF9HZXRDYXBhYmlsaXR5ICovCkBAIC0zMjEsNyArMjU4LDcgQEAKIH07CiAKICNkZWZpbmUgQ0FQX01BTlVGQUNUVVJFUl9SRVNVTFRfU0laRSAxOAotc3RhdGljIHU4IGNhcF9tYW51ZmFjdHVyZXJbXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBjYXBfbWFudWZhY3R1cmVyW10gPSB7CiAJMCwgMTkzLAkJCS8qIFRQTV9UQUdfUlFVX0NPTU1BTkQgKi8KIAkwLCAwLCAwLCAyMiwJCS8qIGxlbmd0aCAqLwogCTAsIDAsIDAsIDEwMSwJCS8qIFRQTV9PUkRfR2V0Q2FwYWJpbGl0eSAqLwpAQCAtMzMwLDE0ICsyNjcsMTUgQEAKIAkwLCAwLCAxLCAzCiB9OwogCi1zdGF0aWMgc3NpemVfdCBzaG93X2NhcHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3NpemVfdCB0cG1fc2hvd19jYXBzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNoYXIgKmJ1ZikKIHsKLQl1OCBkYXRhW1JFQURfUFVCRUtfUkVTVUxUX1NJWkVdOworCXU4IGRhdGFbc2l6ZW9mKGNhcF9tYW51ZmFjdHVyZXIpXTsKIAlzc2l6ZV90IGxlbjsKIAljaGFyICpzdHIgPSBidWY7CiAKIAlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPQotCSAgICBwY2lfZ2V0X2RydmRhdGEoY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBjaV9kZXYsIGRldikpOworCSAgICBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKIAlpZiAoY2hpcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMzQ4LDcgKzI4Niw3IEBACiAJCXJldHVybiBsZW47CiAKIAlzdHIgKz0gc3ByaW50ZihzdHIsICJNYW51ZmFjdHVyZXI6IDB4JXhcbiIsCi0JCSAgICAgICBiZTMyX3RvX2NwdSgqKGRhdGEgKyAxNCkpKTsKKwkJICAgICAgIGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAoZGF0YSArIDE0KSkpKTsKIAogCW1lbWNweShkYXRhLCBjYXBfdmVyc2lvbiwgc2l6ZW9mKGNhcF92ZXJzaW9uKSk7CiAKQEAgLTM2Myw4ICszMDEsMjAgQEAKIAogCXJldHVybiBzdHIgLSBidWY7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0cG1fc2hvd19jYXBzKTsKIAotc3RhdGljIERFVklDRV9BVFRSKGNhcHMsIFNfSVJVR08sIHNob3dfY2FwcywgTlVMTCk7Citzc2l6ZV90IHRwbV9zdG9yZV9jYW5jZWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmIChjaGlwID09IE5VTEwpCisJCXJldHVybiAwOworCisJY2hpcC0+dmVuZG9yLT5jYW5jZWwoY2hpcCk7CisJcmV0dXJuIGNvdW50OworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBtX3N0b3JlX2NhbmNlbCk7CisKIAogLyoKICAqIERldmljZSBmaWxlIHN5c3RlbSBpbnRlcmZhY2UgdG8gdGhlIFRQTQpAQCAtNDIyLDI0ICszNzIsMTUgQEAKIGludCB0cG1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAogCXNwaW5fbG9jaygmZHJpdmVyX2xvY2spOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CiAJY2hpcC0+bnVtX29wZW5zLS07Ci0Jc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKLQotCWRvd24oJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7Ci0JaWYgKHRpbWVyX3BlbmRpbmcoJmNoaXAtPnVzZXJfcmVhZF90aW1lcikpCi0JCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJmNoaXAtPnVzZXJfcmVhZF90aW1lcik7Ci0JZWxzZSBpZiAodGltZXJfcGVuZGluZygmY2hpcC0+ZGV2aWNlX3RpbWVyKSkKLQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+ZGV2aWNlX3RpbWVyKTsKLQl1cCgmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKLQotCWtmcmVlKGNoaXAtPmRhdGFfYnVmZmVyKTsKKwlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOwogCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7Ci0KIAlwY2lfZGV2X3B1dChjaGlwLT5wY2lfZGV2KTsKKwlrZnJlZShjaGlwLT5kYXRhX2J1ZmZlcik7CisJc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUzLDEwICszOTQsOCBAQAogCiAJLyogY2Fubm90IHBlcmZvcm0gYSB3cml0ZSB1bnRpbCB0aGUgcmVhZCBoYXMgY2xlYXJlZAogCSAgIGVpdGhlciB2aWEgdHBtX3JlYWQgb3IgYSB1c2VyX3JlYWRfdGltZXIgdGltZW91dCAqLwotCXdoaWxlIChhdG9taWNfcmVhZCgmY2hpcC0+ZGF0YV9wZW5kaW5nKSAhPSAwKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChUUE1fVElNRU9VVCk7Ci0JfQorCXdoaWxlIChhdG9taWNfcmVhZCgmY2hpcC0+ZGF0YV9wZW5kaW5nKSAhPSAwKQorCQltc2xlZXAoVFBNX1RJTUVPVVQpOwogCiAJZG93bigmY2hpcC0+YnVmZmVyX211dGV4KTsKIApAQCAtNDc2LDEzICs0MTUsNyBAQAogCXVwKCZjaGlwLT5idWZmZXJfbXV0ZXgpOwogCiAJLyogU2V0IGEgdGltZW91dCBieSB3aGljaCB0aGUgcmVhZGVyIG11c3QgY29tZSBjbGFpbSB0aGUgcmVzdWx0ICovCi0JZG93bigmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKLQlpbml0X3RpbWVyKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOwotCWNoaXAtPnVzZXJfcmVhZF90aW1lci5mdW5jdGlvbiA9IHVzZXJfcmVhZGVyX3RpbWVvdXQ7Ci0JY2hpcC0+dXNlcl9yZWFkX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2hpcDsKLQljaGlwLT51c2VyX3JlYWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoNjAgKiBIWik7Ci0JYWRkX3RpbWVyKCZjaGlwLT51c2VyX3JlYWRfdGltZXIpOwotCXVwKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOworCW1vZF90aW1lcigmY2hpcC0+dXNlcl9yZWFkX3RpbWVyLCBqaWZmaWVzICsgKDYwICogSFopKTsKIAogCXJldHVybiBpbl9zaXplOwogfQpAQCAtNDkzLDI5ICs0MjYsMTkgQEAKIAkJIHNpemVfdCBzaXplLCBsb2ZmX3QgKiBvZmYpCiB7CiAJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXRfc2l6ZSA9IC1FTk9EQVRBOworCWludCByZXRfc2l6ZTsKIAotCWlmIChhdG9taWNfcmVhZCgmY2hpcC0+ZGF0YV9wZW5kaW5nKSAhPSAwKSB7CS8qIFJlc3VsdCBhdmFpbGFibGUgKi8KLQkJZG93bigmY2hpcC0+dGltZXJfbWFuaXB1bGF0aW9uX211dGV4KTsKLQkJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKTsKLQkJdXAoJmNoaXAtPnRpbWVyX21hbmlwdWxhdGlvbl9tdXRleCk7CisJZGVsX3NpbmdsZXNob3RfdGltZXJfc3luYygmY2hpcC0+dXNlcl9yZWFkX3RpbWVyKTsKKwlyZXRfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGlwLT5kYXRhX3BlbmRpbmcpOworCWF0b21pY19zZXQoJmNoaXAtPmRhdGFfcGVuZGluZywgMCk7CisJaWYgKHJldF9zaXplID4gMCkgewkvKiByZWxheSBkYXRhICovCisJCWlmIChzaXplIDwgcmV0X3NpemUpCisJCQlyZXRfc2l6ZSA9IHNpemU7CiAKIAkJZG93bigmY2hpcC0+YnVmZmVyX211dGV4KTsKLQotCQlyZXRfc2l6ZSA9IGF0b21pY19yZWFkKCZjaGlwLT5kYXRhX3BlbmRpbmcpOwotCQlhdG9taWNfc2V0KCZjaGlwLT5kYXRhX3BlbmRpbmcsIDApOwotCi0JCWlmIChyZXRfc2l6ZSA9PSAwKQkvKiB0aW1lb3V0IGp1c3Qgb2NjdXJyZWQgKi8KLQkJCXJldF9zaXplID0gLUVUSU1FOwotCQllbHNlIGlmIChyZXRfc2l6ZSA+IDApIHsJLyogcmVsYXkgZGF0YSAqLwotCQkJaWYgKHNpemUgPCByZXRfc2l6ZSkKLQkJCQlyZXRfc2l6ZSA9IHNpemU7Ci0KLQkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIGJ1ZiwKLQkJCQkJIGNoaXAtPmRhdGFfYnVmZmVyLCByZXRfc2l6ZSkpIHsKLQkJCQlyZXRfc2l6ZSA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCX0KKwkJaWYgKGNvcHlfdG9fdXNlcgorCQkgICAgKCh2b2lkIF9fdXNlciAqKSBidWYsIGNoaXAtPmRhdGFfYnVmZmVyLCByZXRfc2l6ZSkpCisJCQlyZXRfc2l6ZSA9IC1FRkFVTFQ7CiAJCXVwKCZjaGlwLT5idWZmZXJfbXV0ZXgpOwogCX0KIApAQCAtNTQxLDE0ICs0NjQsMTMgQEAKIAogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKIAltaXNjX2RlcmVnaXN0ZXIoJmNoaXAtPnZlbmRvci0+bWlzY2Rldik7CisJa2ZyZWUoY2hpcC0+dmVuZG9yLT5taXNjZGV2Lm5hbWUpOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wdWJlayk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wY3JzKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX2NhcHMpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGNpX2Rldi0+ZGV2LmtvYmosIGNoaXAtPnZlbmRvci0+YXR0cl9ncm91cCk7CiAKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpX2Rldik7CiAKLQlkZXZfbWFza1tjaGlwLT5kZXZfbnVtIC8gMzJdICY9ICEoMSA8PCAoY2hpcC0+ZGV2X251bSAlIDMyKSk7CisJZGV2X21hc2tbY2hpcC0+ZGV2X251bSAvIFRQTV9OVU1fTUFTS19FTlRSSUVTIF0gJj0gISgxIDw8IChjaGlwLT5kZXZfbnVtICUgVFBNX05VTV9NQVNLX0VOVFJJRVMpKTsKIAogCWtmcmVlKGNoaXApOwogCkBAIC01OTAsMTAgKzUxMiw2IEBACiAJaWYgKGNoaXAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlzcGluX2xvY2soJmRyaXZlcl9sb2NrKTsKLQl0cG1fbHBjX2J1c19pbml0KHBjaV9kZXYsIGNoaXAtPnZlbmRvci0+YmFzZSk7Ci0Jc3Bpbl91bmxvY2soJmRyaXZlcl9sb2NrKTsKLQogCXJldHVybiAwOwogfQogCkBAIC02MDksNyArNTI3LDkgQEAKIGludCB0cG1fcmVnaXN0ZXJfaGFyZHdhcmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCiAJCQkgIHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljICplbnRyeSkKIHsKLQljaGFyIGRldm5hbWVbN107CisjZGVmaW5lIERFVk5BTUVfU0laRSA3CisKKwljaGFyICpkZXZuYW1lOwogCXN0cnVjdCB0cG1fY2hpcCAqY2hpcDsKIAlpbnQgaSwgajsKIApAQCAtNjIyLDE3ICs1NDIsMjEgQEAKIAogCWluaXRfTVVURVgoJmNoaXAtPmJ1ZmZlcl9tdXRleCk7CiAJaW5pdF9NVVRFWCgmY2hpcC0+dHBtX211dGV4KTsKLQlpbml0X01VVEVYKCZjaGlwLT50aW1lcl9tYW5pcHVsYXRpb25fbXV0ZXgpOwogCUlOSVRfTElTVF9IRUFEKCZjaGlwLT5saXN0KTsKIAorCWluaXRfdGltZXIoJmNoaXAtPnVzZXJfcmVhZF90aW1lcik7CisJY2hpcC0+dXNlcl9yZWFkX3RpbWVyLmZ1bmN0aW9uID0gdXNlcl9yZWFkZXJfdGltZW91dDsKKwljaGlwLT51c2VyX3JlYWRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjaGlwOworCiAJY2hpcC0+dmVuZG9yID0gZW50cnk7CiAKIAljaGlwLT5kZXZfbnVtID0gLTE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwlmb3IgKGkgPSAwOyBpIDwgVFBNX05VTV9NQVNLX0VOVFJJRVM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IDggKiBzaXplb2YoaW50KTsgaisrKQogCQkJaWYgKChkZXZfbWFza1tpXSAmICgxIDw8IGopKSA9PSAwKSB7Ci0JCQkJY2hpcC0+ZGV2X251bSA9IGkgKiAzMiArIGo7CisJCQkJY2hpcC0+ZGV2X251bSA9CisJCQkJICAgIGkgKiBUUE1fTlVNX01BU0tfRU5UUklFUyArIGo7CiAJCQkJZGV2X21hc2tbaV0gfD0gMSA8PCBqOwogCQkJCWdvdG8gZGV2X251bV9zZWFyY2hfY29tcGxldGU7CiAJCQl9CkBAIC02NDgsNyArNTcyLDggQEAKIAllbHNlCiAJCWNoaXAtPnZlbmRvci0+bWlzY2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKIAotCXNucHJpbnRmKGRldm5hbWUsIHNpemVvZihkZXZuYW1lKSwgIiVzJWQiLCAidHBtIiwgY2hpcC0+ZGV2X251bSk7CisJZGV2bmFtZSA9IGttYWxsb2MoREVWTkFNRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlzY25wcmludGYoZGV2bmFtZSwgREVWTkFNRV9TSVpFLCAiJXMlZCIsICJ0cG0iLCBjaGlwLT5kZXZfbnVtKTsKIAljaGlwLT52ZW5kb3ItPm1pc2NkZXYubmFtZSA9IGRldm5hbWU7CiAKIAljaGlwLT52ZW5kb3ItPm1pc2NkZXYuZGV2ID0gJihwY2lfZGV2LT5kZXYpOwpAQCAtNjY1LDMyICs1OTAsMjEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCisJc3Bpbl9sb2NrKCZkcml2ZXJfbG9jayk7CisKIAlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2hpcCk7CiAKIAlsaXN0X2FkZCgmY2hpcC0+bGlzdCwgJnRwbV9jaGlwX2xpc3QpOwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wdWJlayk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2lfZGV2LT5kZXYsICZkZXZfYXR0cl9wY3JzKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX2NhcHMpOworCXNwaW5fdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKKwlzeXNmc19jcmVhdGVfZ3JvdXAoJnBjaV9kZXYtPmRldi5rb2JqLCBjaGlwLT52ZW5kb3ItPmF0dHJfZ3JvdXApOwogCiAJcmV0dXJuIDA7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9yZWdpc3Rlcl9oYXJkd2FyZSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfdHBtKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3RwbSh2b2lkKQotewotCi19Ci0KLW1vZHVsZV9pbml0KGluaXRfdHBtKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfdHBtKTsKLQogTU9EVUxFX0FVVEhPUigiTGVlbmRlcnQgdmFuIERvb3JuIChsZWVuZGVydEB3YXRzb24uaWJtLmNvbSkiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVFBNIERyaXZlciIpOwogTU9EVUxFX1ZFUlNJT04oIjIuMCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaCBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKaW5kZXggZGUwYzc5Ni4uMzczYjQxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0uaAorKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCkBAIC0yNSwyMyArMjUsMzggQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KIAotI2RlZmluZSBUUE1fVElNRU9VVCBtc2Vjc190b19qaWZmaWVzKDUpCitlbnVtIHRwbV90aW1lb3V0IHsKKwlUUE1fVElNRU9VVCA9IDUsCS8qIG1zZWNzICovCit9OwogCiAvKiBUUE0gYWRkcmVzc2VzICovCi0jZGVmaW5lCVRQTV9BRERSCQkJMHg0RQotI2RlZmluZQlUUE1fREFUQQkJCTB4NEYKK2VudW0gdHBtX2FkZHIgeworCVRQTV9TVVBFUklPX0FERFIgPSAweDJFLAorCVRQTV9BRERSID0gMHg0RSwKK307CisKK2V4dGVybiBzc2l6ZV90IHRwbV9zaG93X3B1YmVrKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqKTsKK2V4dGVybiBzc2l6ZV90IHRwbV9zaG93X3BjcnMoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICopOworZXh0ZXJuIHNzaXplX3QgdHBtX3Nob3dfY2FwcyhzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKik7CitleHRlcm4gc3NpemVfdCB0cG1fc3RvcmVfY2FuY2VsKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqLCBzaXplX3QpOwogCiBzdHJ1Y3QgdHBtX2NoaXA7CiAKIHN0cnVjdCB0cG1fdmVuZG9yX3NwZWNpZmljIHsKIAl1OCByZXFfY29tcGxldGVfbWFzazsKIAl1OCByZXFfY29tcGxldGVfdmFsOworCXU4IHJlcV9jYW5jZWxlZDsKIAl1MTYgYmFzZTsJCS8qIFRQTSBiYXNlIGFkZHJlc3MgKi8KIAogCWludCAoKnJlY3YpIChzdHJ1Y3QgdHBtX2NoaXAgKiwgdTggKiwgc2l6ZV90KTsKIAlpbnQgKCpzZW5kKSAoc3RydWN0IHRwbV9jaGlwICosIHU4ICosIHNpemVfdCk7CiAJdm9pZCAoKmNhbmNlbCkgKHN0cnVjdCB0cG1fY2hpcCAqKTsKIAlzdHJ1Y3QgbWlzY2RldmljZSBtaXNjZGV2OworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJfZ3JvdXA7CiB9OwogCiBzdHJ1Y3QgdHBtX2NoaXAgewpAQCAtNTgsMjkgKzczLDI0IEBACiAKIAlzdHJ1Y3QgdGltZXJfbGlzdCB1c2VyX3JlYWRfdGltZXI7CS8qIHVzZXIgbmVlZHMgdG8gY2xhaW0gcmVzdWx0ICovCiAJc3RydWN0IHNlbWFwaG9yZSB0cG1fbXV0ZXg7CS8qIHRwbSBpcyBwcm9jZXNzaW5nICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgZGV2aWNlX3RpbWVyOwkvKiB0cG0gaXMgcHJvY2Vzc2luZyAqLwotCXN0cnVjdCBzZW1hcGhvcmUgdGltZXJfbWFuaXB1bGF0aW9uX211dGV4OwogCiAJc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgKnZlbmRvcjsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRwbV9yZWFkX2luZGV4KGludCBpbmRleCkKK3N0YXRpYyBpbmxpbmUgaW50IHRwbV9yZWFkX2luZGV4KGludCBiYXNlLCBpbnQgaW5kZXgpCiB7Ci0Jb3V0YihpbmRleCwgVFBNX0FERFIpOwotCXJldHVybiBpbmIoVFBNX0RBVEEpICYgMHhGRjsKKwlvdXRiKGluZGV4LCBiYXNlKTsKKwlyZXR1cm4gaW5iKGJhc2UrMSkgJiAweEZGOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHBtX3dyaXRlX2luZGV4KGludCBpbmRleCwgaW50IHZhbHVlKQorc3RhdGljIGlubGluZSB2b2lkIHRwbV93cml0ZV9pbmRleChpbnQgYmFzZSwgaW50IGluZGV4LCBpbnQgdmFsdWUpCiB7Ci0Jb3V0YihpbmRleCwgVFBNX0FERFIpOwotCW91dGIodmFsdWUgJiAweEZGLCBUUE1fREFUQSk7CisJb3V0YihpbmRleCwgYmFzZSk7CisJb3V0Yih2YWx1ZSAmIDB4RkYsIGJhc2UrMSk7CiB9CiAKLWV4dGVybiB2b2lkIHRwbV90aW1lX2V4cGlyZWQodW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gaW50IHRwbV9scGNfYnVzX2luaXQoc3RydWN0IHBjaV9kZXYgKiwgdTE2KTsKLQogZXh0ZXJuIGludCB0cG1fcmVnaXN0ZXJfaGFyZHdhcmUoc3RydWN0IHBjaV9kZXYgKiwKIAkJCQkgc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgKik7CiBleHRlcm4gaW50IHRwbV9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5jCmluZGV4IGY5MzMzZTcuLmNjMmNjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuYwpAQCAtMjIsMTcgKzIyLDIzIEBACiAjaW5jbHVkZSAidHBtLmgiCiAKIC8qIEF0bWVsIGRlZmluaXRpb25zICovCi0jZGVmaW5lCVRQTV9BVE1MX0JBU0UJCQkweDQwMAorZW51bSB0cG1fYXRtZWxfYWRkciB7CisJVFBNX0FUTUVMX0JBU0VfQUREUl9MTyA9IDB4MDgsCisJVFBNX0FUTUVMX0JBU0VfQUREUl9ISSA9IDB4MDkKK307CiAKIC8qIHdyaXRlIHN0YXR1cyBiaXRzICovCi0jZGVmaW5lCUFUTUxfU1RBVFVTX0FCT1JUCQkweDAxCi0jZGVmaW5lCUFUTUxfU1RBVFVTX0xBU1RCWVRFCQkweDA0Ci0KK2VudW0gdHBtX2F0bWVsX3dyaXRlX3N0YXR1cyB7CisJQVRNTF9TVEFUVVNfQUJPUlQgPSAweDAxLAorCUFUTUxfU1RBVFVTX0xBU1RCWVRFID0gMHgwNAorfTsKIC8qIHJlYWQgc3RhdHVzIGJpdHMgKi8KLSNkZWZpbmUJQVRNTF9TVEFUVVNfQlVTWQkJMHgwMQotI2RlZmluZQlBVE1MX1NUQVRVU19EQVRBX0FWQUlMCQkweDAyCi0jZGVmaW5lCUFUTUxfU1RBVFVTX1JFV1JJVEUJCTB4MDQKLQorZW51bSB0cG1fYXRtZWxfcmVhZF9zdGF0dXMgeworCUFUTUxfU1RBVFVTX0JVU1kgPSAweDAxLAorCUFUTUxfU1RBVFVTX0RBVEFfQVZBSUwgPSAweDAyLAorCUFUTUxfU1RBVFVTX1JFV1JJVEUgPSAweDA0LAorCUFUTUxfU1RBVFVTX1JFQURZID0gMHgwOAorfTsKIAogc3RhdGljIGludCB0cG1fYXRtbF9yZWN2KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggKiBidWYsIHNpemVfdCBjb3VudCkKIHsKQEAgLTEyMSwxMyArMTI3LDI5IEBACiAJLnJlbGVhc2UgPSB0cG1fcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBERVZJQ0VfQVRUUihwdWJlaywgU19JUlVHTywgdHBtX3Nob3dfcHViZWssIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHBjcnMsIFNfSVJVR08sIHRwbV9zaG93X3BjcnMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhcHMsIFNfSVJVR08sIHRwbV9zaG93X2NhcHMsIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNhbmNlbCwgU19JV1VTUiB8U19JV0dSUCwgTlVMTCwgdHBtX3N0b3JlX2NhbmNlbCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlKiBhdG1lbF9hdHRyc1tdID0geworCSZkZXZfYXR0cl9wdWJlay5hdHRyLAorCSZkZXZfYXR0cl9wY3JzLmF0dHIsCisJJmRldl9hdHRyX2NhcHMuYXR0ciwKKwkmZGV2X2F0dHJfY2FuY2VsLmF0dHIsCisJMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0bWVsX2F0dHJfZ3JwID0geyAuYXR0cnMgPSBhdG1lbF9hdHRycyB9OworCiBzdGF0aWMgc3RydWN0IHRwbV92ZW5kb3Jfc3BlY2lmaWMgdHBtX2F0bWVsID0gewogCS5yZWN2ID0gdHBtX2F0bWxfcmVjdiwKIAkuc2VuZCA9IHRwbV9hdG1sX3NlbmQsCiAJLmNhbmNlbCA9IHRwbV9hdG1sX2NhbmNlbCwKIAkucmVxX2NvbXBsZXRlX21hc2sgPSBBVE1MX1NUQVRVU19CVVNZIHwgQVRNTF9TVEFUVVNfREFUQV9BVkFJTCwKIAkucmVxX2NvbXBsZXRlX3ZhbCA9IEFUTUxfU1RBVFVTX0RBVEFfQVZBSUwsCi0JLmJhc2UgPSBUUE1fQVRNTF9CQVNFLAorCS5yZXFfY2FuY2VsZWQgPSBBVE1MX1NUQVRVU19SRUFEWSwKKwkuYXR0cl9ncm91cCA9ICZhdG1lbF9hdHRyX2dycCwKIAkubWlzY2RldiA9IHsgLmZvcHMgPSAmYXRtZWxfb3BzLCB9LAogfTsKIApAQCAtMTM2LDI3ICsxNTgsMjkgQEAKIHsKIAl1OCB2ZXJzaW9uWzRdOwogCWludCByYyA9IDA7CisJaW50IGxvLCBoaTsKIAogCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAodHBtX2xwY19idXNfaW5pdChwY2lfZGV2LCBUUE1fQVRNTF9CQVNFKSkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2VycjsKLQl9CisJbG8gPSB0cG1fcmVhZF9pbmRleChUUE1fQUREUiwgVFBNX0FUTUVMX0JBU0VfQUREUl9MTyk7CisJaGkgPSB0cG1fcmVhZF9pbmRleChUUE1fQUREUiwgVFBNX0FUTUVMX0JBU0VfQUREUl9ISSk7CisKKwl0cG1fYXRtZWwuYmFzZSA9IChoaTw8OCl8bG87CisJZGV2X2RiZyggJnBjaV9kZXYtPmRldiwgIk9wZXJhdGluZyB3aXRoIGJhc2U6IDB4JXhcbiIsIHRwbV9hdG1lbC5iYXNlKTsKIAogCS8qIHZlcmlmeSB0aGF0IGl0IGlzIGFuIEF0bWVsIHBhcnQgKi8KLQlpZiAodHBtX3JlYWRfaW5kZXgoNCkgIT0gJ0EnIHx8IHRwbV9yZWFkX2luZGV4KDUpICE9ICdUJwotCSAgICB8fCB0cG1fcmVhZF9pbmRleCg2KSAhPSAnTScgfHwgdHBtX3JlYWRfaW5kZXgoNykgIT0gJ0wnKSB7CisJaWYgKHRwbV9yZWFkX2luZGV4KFRQTV9BRERSLCA0KSAhPSAnQScgfHwgdHBtX3JlYWRfaW5kZXgoVFBNX0FERFIsIDUpICE9ICdUJworCSAgICB8fCB0cG1fcmVhZF9pbmRleChUUE1fQUREUiwgNikgIT0gJ00nIHx8IHRwbV9yZWFkX2luZGV4KFRQTV9BRERSLCA3KSAhPSAnTCcpIHsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCiAJLyogcXVlcnkgY2hpcCBmb3IgaXRzIHZlcnNpb24gbnVtYmVyICovCi0JaWYgKCh2ZXJzaW9uWzBdID0gdHBtX3JlYWRfaW5kZXgoMHgwMCkpICE9IDB4RkYpIHsKLQkJdmVyc2lvblsxXSA9IHRwbV9yZWFkX2luZGV4KDB4MDEpOwotCQl2ZXJzaW9uWzJdID0gdHBtX3JlYWRfaW5kZXgoMHgwMik7Ci0JCXZlcnNpb25bM10gPSB0cG1fcmVhZF9pbmRleCgweDAzKTsKKwlpZiAoKHZlcnNpb25bMF0gPSB0cG1fcmVhZF9pbmRleChUUE1fQUREUiwgMHgwMCkpICE9IDB4RkYpIHsKKwkJdmVyc2lvblsxXSA9IHRwbV9yZWFkX2luZGV4KFRQTV9BRERSLCAweDAxKTsKKwkJdmVyc2lvblsyXSA9IHRwbV9yZWFkX2luZGV4KFRQTV9BRERSLCAweDAyKTsKKwkJdmVyc2lvblszXSA9IHRwbV9yZWFkX2luZGV4KFRQTV9BRERSLCAweDAzKTsKIAl9IGVsc2UgewogCQlkZXZfaW5mbygmcGNpX2Rldi0+ZGV2LCAidmVyc2lvbiBxdWVyeSBmYWlsZWRcbiIpOwogCQlyYyA9IC1FTk9ERVY7CkBAIC0xODMsNiArMjA3LDcgQEAKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMTIpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0xQQyl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNkxQQyl9LAogCXswLH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fbnNjLmMKaW5kZXggOWNjZTgzM2EuLmI0MTI3MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX25zYy5jCkBAIC0yMiw0MyArMjIsNTIgQEAKICNpbmNsdWRlICJ0cG0uaCIKIAogLyogTmF0aW9uYWwgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUJVFBNX05TQ19CQVNFCQkJMHgzNjAKLSNkZWZpbmUJVFBNX05TQ19JUlEJCQkweDA3CitlbnVtIHRwbV9uc2NfYWRkcnsKKwlUUE1fTlNDX0lSUSA9IDB4MDcsCisJVFBNX05TQ19CQVNFMF9ISSA9IDB4NjAsCisJVFBNX05TQ19CQVNFMF9MTyA9IDB4NjEsCisJVFBNX05TQ19CQVNFMV9ISSA9IDB4NjIsCisJVFBNX05TQ19CQVNFMV9MTyA9IDB4NjMKK307CiAKLSNkZWZpbmUJTlNDX0xETl9JTkRFWAkJCTB4MDcKLSNkZWZpbmUJTlNDX1NJRF9JTkRFWAkJCTB4MjAKLSNkZWZpbmUJTlNDX0xEQ19JTkRFWAkJCTB4MzAKLSNkZWZpbmUJTlNDX0RJT19JTkRFWAkJCTB4NjAKLSNkZWZpbmUJTlNDX0NJT19JTkRFWAkJCTB4NjIKLSNkZWZpbmUJTlNDX0lSUV9JTkRFWAkJCTB4NzAKLSNkZWZpbmUJTlNDX0lUU19JTkRFWAkJCTB4NzEKK2VudW0gdHBtX25zY19pbmRleCB7CisJTlNDX0xETl9JTkRFWCA9IDB4MDcsCisJTlNDX1NJRF9JTkRFWCA9IDB4MjAsCisJTlNDX0xEQ19JTkRFWCA9IDB4MzAsCisJTlNDX0RJT19JTkRFWCA9IDB4NjAsCisJTlNDX0NJT19JTkRFWCA9IDB4NjIsCisJTlNDX0lSUV9JTkRFWCA9IDB4NzAsCisJTlNDX0lUU19JTkRFWCA9IDB4NzEKK307CiAKLSNkZWZpbmUJTlNDX1NUQVRVUwkJCTB4MDEKLSNkZWZpbmUJTlNDX0NPTU1BTkQJCQkweDAxCi0jZGVmaW5lCU5TQ19EQVRBCQkJMHgwMAorZW51bSB0cG1fbnNjX3N0YXR1c19sb2MgeworCU5TQ19TVEFUVVMgPSAweDAxLAorCU5TQ19DT01NQU5EID0gMHgwMSwKKwlOU0NfREFUQSA9IDB4MDAKK307CiAKIC8qIHN0YXR1cyBiaXRzICovCi0jZGVmaW5lCU5TQ19TVEFUVVNfT0JGCQkJMHgwMQkvKiBvdXRwdXQgYnVmZmVyIGZ1bGwgKi8KLSNkZWZpbmUJTlNDX1NUQVRVU19JQkYJCQkweDAyCS8qIGlucHV0IGJ1ZmZlciBmdWxsICovCi0jZGVmaW5lCU5TQ19TVEFUVVNfRjAJCQkweDA0CS8qIEYwICovCi0jZGVmaW5lCU5TQ19TVEFUVVNfQTIJCQkweDA4CS8qIEEyICovCi0jZGVmaW5lCU5TQ19TVEFUVVNfUkRZCQkJMHgxMAkvKiByZWFkeSB0byByZWNlaXZlIGNvbW1hbmQgKi8KLSNkZWZpbmUJTlNDX1NUQVRVU19JQlIJCQkweDIwCS8qIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSAqLworZW51bSB0cG1fbnNjX3N0YXR1cyB7CisJTlNDX1NUQVRVU19PQkYgPSAweDAxLAkvKiBvdXRwdXQgYnVmZmVyIGZ1bGwgKi8KKwlOU0NfU1RBVFVTX0lCRiA9IDB4MDIsCS8qIGlucHV0IGJ1ZmZlciBmdWxsICovCisJTlNDX1NUQVRVU19GMCA9IDB4MDQsCS8qIEYwICovCisJTlNDX1NUQVRVU19BMiA9IDB4MDgsCS8qIEEyICovCisJTlNDX1NUQVRVU19SRFkgPSAweDEwLAkvKiByZWFkeSB0byByZWNlaXZlIGNvbW1hbmQgKi8KKwlOU0NfU1RBVFVTX0lCUiA9IDB4MjAJLyogcmVhZHkgdG8gcmVjZWl2ZSBkYXRhICovCit9OwogCiAvKiBjb21tYW5kIGJpdHMgKi8KLSNkZWZpbmUJTlNDX0NPTU1BTkRfTk9STUFMCQkweDAxCS8qIG5vcm1hbCBtb2RlICovCi0jZGVmaW5lCU5TQ19DT01NQU5EX0VPQwkJCTB4MDMKLSNkZWZpbmUJTlNDX0NPTU1BTkRfQ0FOQ0VMCQkweDIyCi0KK2VudW0gdHBtX25zY19jbWRfbW9kZSB7CisJTlNDX0NPTU1BTkRfTk9STUFMID0gMHgwMSwJLyogbm9ybWFsIG1vZGUgKi8KKwlOU0NfQ09NTUFORF9FT0MgPSAweDAzLAorCU5TQ19DT01NQU5EX0NBTkNFTCA9IDB4MjIKK307CiAvKgogICogV2FpdCBmb3IgYSBjZXJ0YWluIHN0YXR1cyB0byBhcHBlYXIKICAqLwogc3RhdGljIGludCB3YWl0X2Zvcl9zdGF0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggbWFzaywgdTggdmFsLCB1OCAqIGRhdGEpCiB7Ci0JaW50IGV4cGlyZWQgPSAwOwotCXN0cnVjdCB0aW1lcl9saXN0IHN0YXR1c190aW1lciA9Ci0JICAgIFRJTUVSX0lOSVRJQUxJWkVSKHRwbV90aW1lX2V4cGlyZWQsIGppZmZpZXMgKyAxMCAqIEhaLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpICZleHBpcmVkKTsKKwl1bnNpZ25lZCBsb25nIHN0b3A7CiAKIAkvKiBzdGF0dXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIGNoZWNrICovCiAJKmRhdGEgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgTlNDX1NUQVRVUyk7CkBAIC02NiwxNyArNzUsMTQgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiB3YWl0IGZvciBzdGF0dXMgKi8KLQlhZGRfdGltZXIoJnN0YXR1c190aW1lcik7CisJc3RvcCA9IGppZmZpZXMgKyAxMCAqIEhaOwogCWRvIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KFRQTV9USU1FT1VUKTsKKwkJbXNsZWVwKFRQTV9USU1FT1VUKTsKIAkJKmRhdGEgPSBpbmIoY2hpcC0+dmVuZG9yLT5iYXNlICsgMSk7Ci0JCWlmICgoKmRhdGEgJiBtYXNrKSA9PSB2YWwpIHsKLQkJCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJnN0YXR1c190aW1lcik7CisJCWlmICgoKmRhdGEgJiBtYXNrKSA9PSB2YWwpCiAJCQlyZXR1cm4gMDsKLQkJfQogCX0KLQl3aGlsZSAoIWV4cGlyZWQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSk7CiAKIAlyZXR1cm4gLUVCVVNZOwogfQpAQCAtODQsMTAgKzkwLDcgQEAKIHN0YXRpYyBpbnQgbnNjX3dhaXRfZm9yX3JlYWR5KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKIHsKIAlpbnQgc3RhdHVzOwotCWludCBleHBpcmVkID0gMDsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0dXNfdGltZXIgPQotCSAgICBUSU1FUl9JTklUSUFMSVpFUih0cG1fdGltZV9leHBpcmVkLCBqaWZmaWVzICsgMTAwLAotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpICZleHBpcmVkKTsKKwl1bnNpZ25lZCBsb25nIHN0b3A7CiAKIAkvKiBzdGF0dXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIGNoZWNrICovCiAJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19TVEFUVVMpOwpAQCAtOTcsMTkgKzEwMCwxNiBAQAogCQlyZXR1cm4gMDsKIAogCS8qIHdhaXQgZm9yIHN0YXR1cyAqLwotCWFkZF90aW1lcigmc3RhdHVzX3RpbWVyKTsKKwlzdG9wID0gamlmZmllcyArIDEwMDsKIAlkbyB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChUUE1fVElNRU9VVCk7CisJCW1zbGVlcChUUE1fVElNRU9VVCk7CiAJCXN0YXR1cyA9IGluYihjaGlwLT52ZW5kb3ItPmJhc2UgKyBOU0NfU1RBVFVTKTsKIAkJaWYgKHN0YXR1cyAmIE5TQ19TVEFUVVNfT0JGKQogCQkJc3RhdHVzID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKTsKLQkJaWYgKHN0YXR1cyAmIE5TQ19TVEFUVVNfUkRZKSB7Ci0JCQlkZWxfc2luZ2xlc2hvdF90aW1lcl9zeW5jKCZzdGF0dXNfdGltZXIpOworCQlpZiAoc3RhdHVzICYgTlNDX1NUQVRVU19SRFkpCiAJCQlyZXR1cm4gMDsKLQkJfQogCX0KLQl3aGlsZSAoIWV4cGlyZWQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSk7CiAKIAlkZXZfaW5mbygmY2hpcC0+cGNpX2Rldi0+ZGV2LCAid2FpdCBmb3IgcmVhZHkgZmFpbGVkXG4iKTsKIAlyZXR1cm4gLUVCVVNZOwpAQCAtMTUwLDcgKzE1MCw4IEBACiAJCSpwID0gaW5iKGNoaXAtPnZlbmRvci0+YmFzZSArIE5TQ19EQVRBKTsKIAl9CiAKLQlpZiAoKGRhdGEgJiBOU0NfU1RBVFVTX0YwKSA9PSAwKSB7CisJaWYgKChkYXRhICYgTlNDX1NUQVRVU19GMCkgPT0gMCAmJgorCSh3YWl0X2Zvcl9zdGF0KGNoaXAsIE5TQ19TVEFUVVNfRjAsIE5TQ19TVEFUVVNfRjAsICZkYXRhKSA8IDApKSB7CiAJCWRldl9lcnIoJmNoaXAtPnBjaV9kZXYtPmRldiwgIkYwIG5vdCBzZXRcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0yMjgsMTAwICsyMjksOTUgQEAKIAkucmVsZWFzZSA9IHRwbV9yZWxlYXNlLAogfTsKIAorc3RhdGljIERFVklDRV9BVFRSKHB1YmVrLCBTX0lSVUdPLCB0cG1fc2hvd19wdWJlaywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocGNycywgU19JUlVHTywgdHBtX3Nob3dfcGNycywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FwcywgU19JUlVHTywgdHBtX3Nob3dfY2FwcywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoY2FuY2VsLCBTX0lXVVNSfFNfSVdHUlAsIE5VTEwsIHRwbV9zdG9yZV9jYW5jZWwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIG5zY19hdHRyc1tdID0geworCSZkZXZfYXR0cl9wdWJlay5hdHRyLAorCSZkZXZfYXR0cl9wY3JzLmF0dHIsCisJJmRldl9hdHRyX2NhcHMuYXR0ciwKKwkmZGV2X2F0dHJfY2FuY2VsLmF0dHIsCisJMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG5zY19hdHRyX2dycCA9IHsgLmF0dHJzID0gbnNjX2F0dHJzIH07CisKIHN0YXRpYyBzdHJ1Y3QgdHBtX3ZlbmRvcl9zcGVjaWZpYyB0cG1fbnNjID0gewogCS5yZWN2ID0gdHBtX25zY19yZWN2LAogCS5zZW5kID0gdHBtX25zY19zZW5kLAogCS5jYW5jZWwgPSB0cG1fbnNjX2NhbmNlbCwKIAkucmVxX2NvbXBsZXRlX21hc2sgPSBOU0NfU1RBVFVTX09CRiwKIAkucmVxX2NvbXBsZXRlX3ZhbCA9IE5TQ19TVEFUVVNfT0JGLAotCS5iYXNlID0gVFBNX05TQ19CQVNFLAorCS5yZXFfY2FuY2VsZWQgPSBOU0NfU1RBVFVTX1JEWSwKKwkuYXR0cl9ncm91cCA9ICZuc2NfYXR0cl9ncnAsCiAJLm1pc2NkZXYgPSB7IC5mb3BzID0gJm5zY19vcHMsIH0sCi0JCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB0cG1fbnNjX2luaXQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQogewogCWludCByYyA9IDA7CisJaW50IGxvLCBoaTsKKwlpbnQgbnNjQWRkckJhc2UgPSBUUE1fQUREUjsKKwogCiAJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQogCQlyZXR1cm4gLUVJTzsKIAotCWlmICh0cG1fbHBjX2J1c19pbml0KHBjaV9kZXYsIFRQTV9OU0NfQkFTRSkpIHsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIG91dF9lcnI7Ci0JfQorCS8qIHNlbGVjdCBQTSBjaGFubmVsIDEgKi8KKwl0cG1fd3JpdGVfaW5kZXgobnNjQWRkckJhc2UsTlNDX0xETl9JTkRFWCwgMHgxMik7CiAKIAkvKiB2ZXJpZnkgdGhhdCBpdCBpcyBhIE5hdGlvbmFsIHBhcnQgKFNJRCkgKi8KLQlpZiAodHBtX3JlYWRfaW5kZXgoTlNDX1NJRF9JTkRFWCkgIT0gMHhFRikgewotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2VycjsKKwlpZiAodHBtX3JlYWRfaW5kZXgoVFBNX0FERFIsIE5TQ19TSURfSU5ERVgpICE9IDB4RUYpIHsKKwkJbnNjQWRkckJhc2UgPSAodHBtX3JlYWRfaW5kZXgoVFBNX1NVUEVSSU9fQUREUiwgMHgyQyk8PDgpfAorCQkJKHRwbV9yZWFkX2luZGV4KFRQTV9TVVBFUklPX0FERFIsIDB4MkIpJjB4RkUpOworCQlpZiAodHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsIE5TQ19TSURfSU5ERVgpICE9IDB4RjYpIHsKKwkJCXJjID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQogCX0KIAorCWhpID0gdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsIFRQTV9OU0NfQkFTRTBfSEkpOworCWxvID0gdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsIFRQTV9OU0NfQkFTRTBfTE8pOworCXRwbV9uc2MuYmFzZSA9IChoaTw8OCkgfCBsbzsKKwogCWRldl9kYmcoJnBjaV9kZXYtPmRldiwgIk5TQyBUUE0gZGV0ZWN0ZWRcbiIpOwogCWRldl9kYmcoJnBjaV9kZXYtPmRldiwKIAkJIk5TQyBMRE4gMHgleCwgU0lEIDB4JXgsIFNSSUQgMHgleFxuIiwKLQkJdHBtX3JlYWRfaW5kZXgoMHgwNyksIHRwbV9yZWFkX2luZGV4KDB4MjApLAotCQl0cG1fcmVhZF9pbmRleCgweDI3KSk7CisJCXRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4MDcpLCB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweDIwKSwKKwkJdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHgyNykpOwogCWRldl9kYmcoJnBjaV9kZXYtPmRldiwKIAkJIk5TQyBTSU9DRjEgMHgleCBTSU9DRjUgMHgleCBTSU9DRjYgMHgleCBTSU9DRjggMHgleFxuIiwKLQkJdHBtX3JlYWRfaW5kZXgoMHgyMSksIHRwbV9yZWFkX2luZGV4KDB4MjUpLAotCQl0cG1fcmVhZF9pbmRleCgweDI2KSwgdHBtX3JlYWRfaW5kZXgoMHgyOCkpOworCQl0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweDIxKSwgdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHgyNSksCisJCXRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4MjYpLCB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweDI4KSk7CiAJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LCAiTlNDIElPIEJhc2UwIDB4JXhcbiIsCi0JCSh0cG1fcmVhZF9pbmRleCgweDYwKSA8PCA4KSB8IHRwbV9yZWFkX2luZGV4KDB4NjEpKTsKKwkJKHRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4NjApIDw8IDgpIHwgdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHg2MSkpOwogCWRldl9kYmcoJnBjaV9kZXYtPmRldiwgIk5TQyBJTyBCYXNlMSAweCV4XG4iLAotCQkodHBtX3JlYWRfaW5kZXgoMHg2MikgPDwgOCkgfCB0cG1fcmVhZF9pbmRleCgweDYzKSk7CisJCSh0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweDYyKSA8PCA4KSB8IHRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4NjMpKTsKIAlkZXZfZGJnKCZwY2lfZGV2LT5kZXYsICJOU0MgSW50ZXJydXB0IG51bWJlciBhbmQgd2FrZXVwIDB4JXhcbiIsCi0JCXRwbV9yZWFkX2luZGV4KDB4NzApKTsKKwkJdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHg3MCkpOwogCWRldl9kYmcoJnBjaV9kZXYtPmRldiwgIk5TQyBJUlEgdHlwZSBzZWxlY3QgMHgleFxuIiwKLQkJdHBtX3JlYWRfaW5kZXgoMHg3MSkpOworCQl0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweDcxKSk7CiAJZGV2X2RiZygmcGNpX2Rldi0+ZGV2LAogCQkiTlNDIERNQSBjaGFubmVsIHNlbGVjdDAgMHgleCwgc2VsZWN0MSAweCV4XG4iLAotCQl0cG1fcmVhZF9pbmRleCgweDc0KSwgdHBtX3JlYWRfaW5kZXgoMHg3NSkpOworCQl0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweDc0KSwgdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHg3NSkpOwogCWRldl9kYmcoJnBjaV9kZXYtPmRldiwKIAkJIk5TQyBDb25maWcgIgogCQkiMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwKLQkJdHBtX3JlYWRfaW5kZXgoMHhGMCksIHRwbV9yZWFkX2luZGV4KDB4RjEpLAotCQl0cG1fcmVhZF9pbmRleCgweEYyKSwgdHBtX3JlYWRfaW5kZXgoMHhGMyksCi0JCXRwbV9yZWFkX2luZGV4KDB4RjQpLCB0cG1fcmVhZF9pbmRleCgweEY1KSwKLQkJdHBtX3JlYWRfaW5kZXgoMHhGNiksIHRwbV9yZWFkX2luZGV4KDB4RjcpLAotCQl0cG1fcmVhZF9pbmRleCgweEY4KSwgdHBtX3JlYWRfaW5kZXgoMHhGOSkpOworCQl0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweEYwKSwgdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHhGMSksCisJCXRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4RjIpLCB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweEYzKSwKKwkJdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHhGNCksIHRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4RjUpLAorCQl0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweEY2KSwgdHBtX3JlYWRfaW5kZXgobnNjQWRkckJhc2UsMHhGNyksCisJCXRwbV9yZWFkX2luZGV4KG5zY0FkZHJCYXNlLDB4RjgpLCB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwweEY5KSk7CiAKIAlkZXZfaW5mbygmcGNpX2Rldi0+ZGV2LAotCQkgIk5TQyBQQzIxMTAwIFRQTSByZXZpc2lvbiAlZFxuIiwKLQkJIHRwbV9yZWFkX2luZGV4KDB4MjcpICYgMHgxRik7Ci0KLQlpZiAodHBtX3JlYWRfaW5kZXgoTlNDX0xEQ19JTkRFWCkgPT0gMCkKLQkJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwgIjogTlNDIFRQTSBub3QgYWN0aXZlXG4iKTsKLQotCS8qIHNlbGVjdCBQTSBjaGFubmVsIDEgKi8KLQl0cG1fd3JpdGVfaW5kZXgoTlNDX0xETl9JTkRFWCwgMHgxMik7Ci0JdHBtX3JlYWRfaW5kZXgoTlNDX0xETl9JTkRFWCk7Ci0KLQkvKiBkaXNhYmxlIHRoZSBEUE0gbW9kdWxlICovCi0JdHBtX3dyaXRlX2luZGV4KE5TQ19MRENfSU5ERVgsIDApOwotCXRwbV9yZWFkX2luZGV4KE5TQ19MRENfSU5ERVgpOwotCi0JLyogc2V0IHRoZSBkYXRhIHJlZ2lzdGVyIGJhc2UgYWRkcmVzc2VzICovCi0JdHBtX3dyaXRlX2luZGV4KE5TQ19ESU9fSU5ERVgsIFRQTV9OU0NfQkFTRSA+PiA4KTsKLQl0cG1fd3JpdGVfaW5kZXgoTlNDX0RJT19JTkRFWCArIDEsIFRQTV9OU0NfQkFTRSk7Ci0JdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCk7Ci0JdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCArIDEpOwotCi0JLyogc2V0IHRoZSBjb21tYW5kIHJlZ2lzdGVyIGJhc2UgYWRkcmVzc2VzICovCi0JdHBtX3dyaXRlX2luZGV4KE5TQ19DSU9fSU5ERVgsIChUUE1fTlNDX0JBU0UgKyAxKSA+PiA4KTsKLQl0cG1fd3JpdGVfaW5kZXgoTlNDX0NJT19JTkRFWCArIDEsIChUUE1fTlNDX0JBU0UgKyAxKSk7Ci0JdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCk7Ci0JdHBtX3JlYWRfaW5kZXgoTlNDX0RJT19JTkRFWCArIDEpOwotCi0JLyogc2V0IHRoZSBpbnRlcnJ1cHQgbnVtYmVyIHRvIGJlIHVzZWQgZm9yIHRoZSBob3N0IGludGVyZmFjZSAqLwotCXRwbV93cml0ZV9pbmRleChOU0NfSVJRX0lOREVYLCBUUE1fTlNDX0lSUSk7Ci0JdHBtX3dyaXRlX2luZGV4KE5TQ19JVFNfSU5ERVgsIDB4MDApOwotCXRwbV9yZWFkX2luZGV4KE5TQ19JUlFfSU5ERVgpOworCQkgIk5TQyBUUE0gcmV2aXNpb24gJWRcbiIsCisJCSB0cG1fcmVhZF9pbmRleChuc2NBZGRyQmFzZSwgMHgyNykgJiAweDFGKTsKIAogCS8qIGVuYWJsZSB0aGUgRFBNIG1vZHVsZSAqLwotCXRwbV93cml0ZV9pbmRleChOU0NfTERDX0lOREVYLCAweDAxKTsKLQl0cG1fcmVhZF9pbmRleChOU0NfTERDX0lOREVYKTsKKwl0cG1fd3JpdGVfaW5kZXgobnNjQWRkckJhc2UsIE5TQ19MRENfSU5ERVgsIDB4MDEpOwogCiAJaWYgKChyYyA9IHRwbV9yZWdpc3Rlcl9oYXJkd2FyZShwY2lfZGV2LCAmdHBtX25zYykpIDwgMCkKIAkJZ290byBvdXRfZXJyOwpAQCAtMzM5LDYgKzMzNSw5IEBACiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzApfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMTIpfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzEpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMCl9LAogCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0xQQyl9LAogCXswLH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKaW5kZXggY2M0YjQzYi4uNmU0YmUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pby5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwpAQCAtOTQsNiArOTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0yMTgwLDEyICsyMTgxLDExIEBACiAJcmV0dXJuIHR0eV9zZXRfbGRpc2ModHR5LCBsZGlzYyk7CiB9CiAKLXN0YXRpYyBpbnQgc2VuZF9icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgZHVyYXRpb24pCitzdGF0aWMgaW50IHNlbmRfYnJlYWsoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGR1cmF0aW9uKQogewogCXR0eS0+ZHJpdmVyLT5icmVha19jdGwodHR5LCAtMSk7CiAJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoZHVyYXRpb24pOwogCX0KIAl0dHktPmRyaXZlci0+YnJlYWtfY3RsKHR0eSwgMCk7CiAJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQpAQCAtMjM2NiwxMCArMjM2NiwxMCBAQAogCQkJICogYWxsIGJ5IGFueW9uZT8KIAkJCSAqLwogCQkJaWYgKCFhcmcpCi0JCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBIWi80KTsKKwkJCQlyZXR1cm4gc2VuZF9icmVhayh0dHksIDI1MCk7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBUQ1NCUktQOgkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCQotCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBhcmcgPyBhcmcqKEhaLzEwKSA6IEhaLzQpOworCQkJcmV0dXJuIHNlbmRfYnJlYWsodHR5LCBhcmcgPyBhcmcqMTAwIDogMjUwKTsKIAogCQljYXNlIFRJT0NNR0VUOgogCQkJcmV0dXJuIHR0eV90aW9jbWdldCh0dHksIGZpbGUsIHApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCmluZGV4IDU4NTk3OTkuLmYxOWNmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvY3RsLmMKQEAgLTQ3NiwxMSArNDc2LDExIEBACiAJCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKIAkJCXN3aXRjaCAoYXJnKSB7CiAJCQljYXNlIFRDSUZMVVNIOgotCQkJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQorCQkJCWlmIChsZCAmJiBsZC0+Zmx1c2hfYnVmZmVyKQogCQkJCQlsZC0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRDSU9GTFVTSDoKLQkJCQlpZiAobGQtPmZsdXNoX2J1ZmZlcikKKwkJCQlpZiAobGQgJiYgbGQtPmZsdXNoX2J1ZmZlcikKIAkJCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOwogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQkJY2FzZSBUQ09GTFVTSDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dF9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKaW5kZXggODk3MTQ4NC4uMWQ0NGY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0X2lvY3RsLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTM4Niw3ICszODcsNyBAQAogCQlpZiAoIXBlcm0pCiAJCQlyZXR1cm4gLUVQRVJNOwogCQlpZiAoYXJnKQotCQkJYXJnID0gMTE5MzE4MiAvIGFyZzsKKwkJCWFyZyA9IENMT0NLX1RJQ0tfUkFURSAvIGFyZzsKIAkJa2RfbWtzb3VuZChhcmcsIDApOwogCQlyZXR1cm4gMDsKIApAQCAtNDAzLDcgKzQwNCw3IEBACiAJCXRpY2tzID0gSFogKiAoKGFyZyA+PiAxNikgJiAweGZmZmYpIC8gMTAwMDsKIAkJY291bnQgPSB0aWNrcyA/IChhcmcgJiAweGZmZmYpIDogMDsKIAkJaWYgKGNvdW50KQotCQkJY291bnQgPSAxMTkzMTgyIC8gY291bnQ7CisJCQljb3VudCA9IENMT0NLX1RJQ0tfUkFURSAvIGNvdW50OwogCQlrZF9ta3NvdW5kKGNvdW50LCB0aWNrcyk7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pOHh4X3Rjby5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMKaW5kZXggYjE0ZDY0Mi4uNWQwN2VlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2k4eHhfdGNvLmMKQEAgLTQwMSw3ICs0MDEsNyBAQAogCSAqLwogCiAJd2hpbGUgKChkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZGV2KSkgIT0gTlVMTCkgewotCQlpZiAocGNpX21hdGNoX2RldmljZShpOHh4X3Rjb19wY2lfdGJsLCBkZXYpKSB7CisJCWlmIChwY2lfbWF0Y2hfaWQoaTh4eF90Y29fcGNpX3RibCwgZGV2KSkgewogCQkJaTh4eF90Y29fcGNpID0gZGV2OwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHAyMDAwX3dkdC5jIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMKaW5kZXggNGU5OGMyMS4uNGIwMzk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDIwMDBfd2R0LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWlmICh0ZXN0X2JpdChXRFRfT0tfVE9fQ0xPU0UsICZ3ZHRfc3RhdHVzKSkgewogCQl3ZHRfZGlzYWJsZSgpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0NSSVQgIldBVENIRE9HOiBEZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZGx5IC0gIgorCQlwcmludGsoS0VSTl9DUklUICJXQVRDSERPRzogRGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHkgLSAiCiAJCQkJCSJ0aW1lciB3aWxsIG5vdCBzdG9wXG4iKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHA0eHhfd2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaXhwNHh4X3dkdC5jCmluZGV4IDgyMzk2ZTAuLjgzZGYzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9peHA0eHhfd2R0LmMKKysrIGIvZHJpdmVycy9jaGFyL3dhdGNoZG9nL2l4cDR4eF93ZHQuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJaWYgKHRlc3RfYml0KFdEVF9PS19UT19DTE9TRSwgJndkdF9zdGF0dXMpKSB7CiAJCXdkdF9kaXNhYmxlKCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiV0FUQ0hET0c6IERldmljZSBjbG9zZWQgdW5leHBlY3RkbHkgLSAiCisJCXByaW50ayhLRVJOX0NSSVQgIldBVENIRE9HOiBEZXZpY2UgY2xvc2VkIHVuZXhwZWN0ZWRseSAtICIKIAkJCQkJInRpbWVyIHdpbGwgbm90IHN0b3BcbiIpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggYmY2MmRmZS4uN2E3ODU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC04NjksNyArODY5LDcgQEAKICAqCWNwdWZyZXFfc3VzcGVuZCAtIGxldCB0aGUgbG93IGxldmVsIGRyaXZlciBwcmVwYXJlIGZvciBzdXNwZW5kCiAgKi8KIAotc3RhdGljIGludCBjcHVmcmVxX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNkZXYsIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbnQgY3B1ZnJlcV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzZGV2LCBwbV9tZXNzYWdlX3QgcG1zZykKIHsKIAlpbnQgY3B1ID0gc3lzZGV2LT5pZDsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCX0KIAogCWlmIChjcHVmcmVxX2RyaXZlci0+c3VzcGVuZCkgewotCQlyZXQgPSBjcHVmcmVxX2RyaXZlci0+c3VzcGVuZChjcHVfcG9saWN5LCBzdGF0ZSk7CisJCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5zdXNwZW5kKGNwdV9wb2xpY3ksIHBtc2cpOwogCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImNwdWZyZXE6IHN1c3BlbmQgZmFpbGVkIGluIC0+c3VzcGVuZCAiCiAJCQkJCSJzdGVwIG9uIENQVSAldVxuIiwgY3B1X3BvbGljeS0+Y3B1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLWFlcy5jCmluZGV4IGVkNzA4YjQuLjcxNDA3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2stYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay1hZXMuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgInBhZGxvY2suaCIKIApAQCAtNTksOCArNjAsMTIgQEAKICNkZWZpbmUgQUVTX0VYVEVOREVEX0tFWV9TSVpFX0IJKEFFU19FWFRFTkRFRF9LRVlfU0laRSAqIHNpemVvZih1aW50MzJfdCkpCiAKIHN0cnVjdCBhZXNfY3R4IHsKLQl1aW50MzJfdCBlX2RhdGFbQUVTX0VYVEVOREVEX0tFWV9TSVpFKzRdOwotCXVpbnQzMl90IGRfZGF0YVtBRVNfRVhURU5ERURfS0VZX1NJWkUrNF07CisJdWludDMyX3QgZV9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CisJdWludDMyX3QgZF9kYXRhW0FFU19FWFRFTkRFRF9LRVlfU0laRV07CisJc3RydWN0IHsKKwkJc3RydWN0IGN3b3JkIGVuY3J5cHQ7CisJCXN0cnVjdCBjd29yZCBkZWNyeXB0OworCX0gY3dvcmQ7CiAJdWludDMyX3QgKkU7CiAJdWludDMyX3QgKkQ7CiAJaW50IGtleV9sZW5ndGg7CkBAIC0yODAsMTAgKzI4NSwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZXNfY3R4ICphZXNfY3R4KHZvaWQgKmN0eCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBhZXNfY3R4ICopQUxJR04oKHVuc2lnbmVkIGxvbmcpY3R4LCBQQURMT0NLX0FMSUdOTUVOVCk7Cit9CisKIHN0YXRpYyBpbnQKIGFlc19zZXRfa2V5KHZvaWQgKmN0eF9hcmcsIGNvbnN0IHVpbnQ4X3QgKmluX2tleSwgdW5zaWduZWQgaW50IGtleV9sZW4sIHVpbnQzMl90ICpmbGFncykKIHsKLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKIAl1aW50MzJfdCBpLCB0LCB1LCB2LCB3OwogCXVpbnQzMl90IFBbQUVTX0VYVEVOREVEX0tFWV9TSVpFXTsKIAl1aW50MzJfdCByb3VuZHM7CkBAIC0yOTUsMjUgKzMwNSwzNiBAQAogCiAJY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKIAorCS8qCisJICogSWYgdGhlIGhhcmR3YXJlIGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZyB0aGUgZXh0ZW5kZWQga2V5CisJICogaXRzZWxmIHdlIG11c3Qgc3VwcGx5IHRoZSBwbGFpbiBrZXkgZm9yIGJvdGggZW5jcnlwdGlvbgorCSAqIGFuZCBkZWNyeXB0aW9uLgorCSAqLwogCWN0eC0+RSA9IGN0eC0+ZV9kYXRhOwotCWN0eC0+RCA9IGN0eC0+ZF9kYXRhOwotCi0JLyogRW5zdXJlIDE2LUJ5dGVzIGFsaWdubWVudGF0aW9uIG9mIGtleXMgZm9yIFZJQSBQYWRMb2NrLiAqLwotCWlmICgoaW50KShjdHgtPmVfZGF0YSkgJiAweDBGKQotCQljdHgtPkUgKz0gNCAtICgoKGludCkoY3R4LT5lX2RhdGEpICYgMHgwRikgLyBzaXplb2YgKGN0eC0+ZV9kYXRhWzBdKSk7Ci0KLQlpZiAoKGludCkoY3R4LT5kX2RhdGEpICYgMHgwRikKLQkJY3R4LT5EICs9IDQgLSAoKChpbnQpKGN0eC0+ZF9kYXRhKSAmIDB4MEYpIC8gc2l6ZW9mIChjdHgtPmRfZGF0YVswXSkpOworCWN0eC0+RCA9IGN0eC0+ZV9kYXRhOwogCiAJRV9LRVlbMF0gPSB1aW50MzJfdF9pbiAoaW5fa2V5KTsKIAlFX0tFWVsxXSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyA0KTsKIAlFX0tFWVsyXSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyA4KTsKIAlFX0tFWVszXSA9IHVpbnQzMl90X2luIChpbl9rZXkgKyAxMik7CiAKKwkvKiBQcmVwYXJlIGNvbnRyb2wgd29yZHMuICovCisJbWVtc2V0KCZjdHgtPmN3b3JkLCAwLCBzaXplb2YoY3R4LT5jd29yZCkpOworCisJY3R4LT5jd29yZC5kZWNyeXB0LmVuY2RlYyA9IDE7CisJY3R4LT5jd29yZC5lbmNyeXB0LnJvdW5kcyA9IDEwICsgKGtleV9sZW4gLSAxNikgLyA0OworCWN0eC0+Y3dvcmQuZGVjcnlwdC5yb3VuZHMgPSBjdHgtPmN3b3JkLmVuY3J5cHQucm91bmRzOworCWN0eC0+Y3dvcmQuZW5jcnlwdC5rc2l6ZSA9IChrZXlfbGVuIC0gMTYpIC8gODsKKwljdHgtPmN3b3JkLmRlY3J5cHQua3NpemUgPSBjdHgtPmN3b3JkLmVuY3J5cHQua3NpemU7CisKIAkvKiBEb24ndCBnZW5lcmF0ZSBleHRlbmRlZCBrZXlzIGlmIHRoZSBoYXJkd2FyZSBjYW4gZG8gaXQuICovCiAJaWYgKGFlc19od19leHRrZXlfYXZhaWxhYmxlKGtleV9sZW4pKQogCQlyZXR1cm4gMDsKIAorCWN0eC0+RCA9IGN0eC0+ZF9kYXRhOworCWN0eC0+Y3dvcmQuZW5jcnlwdC5rZXlnZW4gPSAxOworCWN0eC0+Y3dvcmQuZGVjcnlwdC5rZXlnZW4gPSAxOworCiAJc3dpdGNoIChrZXlfbGVuKSB7CiAJY2FzZSAxNjoKIAkJdCA9IEVfS0VZWzNdOwpAQCAtMzY5LDEwICszOTAsOSBAQAogCiAvKiA9PT09PT0gRW5jcnlwdGlvbi9kZWNyeXB0aW9uIHJvdXRpbmVzID09PT09PSAqLwogCi0vKiBUaGlzIGlzIHRoZSByZWFsIGNhbGwgdG8gUGFkTG9jay4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotcGFkbG9ja194Y3J5cHRfZWNiKHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHVpbnQ4X3QgKmtleSwKLQkJICAgdm9pZCAqY29udHJvbF93b3JkLCB1aW50MzJfdCBjb3VudCkKKy8qIFRoZXNlIGFyZSB0aGUgcmVhbCBjYWxsIHRvIFBhZExvY2suICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGFkbG9ja194Y3J5cHRfZWNiKGNvbnN0IHU4ICppbnB1dCwgdTggKm91dHB1dCwgdm9pZCAqa2V5LAorCQkJCSAgICAgIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50KQogewogCWFzbSB2b2xhdGlsZSAoInB1c2hmbDsgcG9wZmwiKTsJCS8qIGVuZm9yY2Uga2V5IHJlbG9hZC4gKi8KIAlhc20gdm9sYXRpbGUgKCIuYnl0ZSAweGYzLDB4MGYsMHhhNywweGM4IgkvKiByZXAgeGNyeXB0ZWNiICovCkBAIC0zODAsNjAgKzQwMCw3MCBAQAogCQkgICAgICA6ICJkIihjb250cm9sX3dvcmQpLCAiYiIoa2V5KSwgImMiKGNvdW50KSk7CiB9CiAKLXN0YXRpYyB2b2lkCi1hZXNfcGFkbG9jayh2b2lkICpjdHhfYXJnLCB1aW50OF90ICpvdXRfYXJnLCBjb25zdCB1aW50OF90ICppbl9hcmcsIGludCBlbmNkZWMpCitzdGF0aWMgaW5saW5lIHU4ICpwYWRsb2NrX3hjcnlwdF9jYmMoY29uc3QgdTggKmlucHV0LCB1OCAqb3V0cHV0LCB2b2lkICprZXksCisJCQkJICAgICB1OCAqaXYsIHZvaWQgKmNvbnRyb2xfd29yZCwgdTMyIGNvdW50KQogewotCS8qIERvbid0IGJsaW5kbHkgbW9kaWZ5IHRoaXMgc3RydWN0dXJlIC0gdGhlIGl0ZW1zIG11c3QgCi0JICAgZml0IG9uIDE2LUJ5dGVzIGJvdW5kYXJpZXMhICovCi0Jc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEgewotCQl1aW50OF90IGJ1ZltBRVNfQkxPQ0tfU0laRV07Ci0JCXVuaW9uIGN3b3JkIGN3b3JkOwotCX07Ci0KLQlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gY3R4X2FyZzsKLQljaGFyIGJpZ2J1ZltzaXplb2Yoc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEpICsgMTZdOwotCXN0cnVjdCBwYWRsb2NrX3hjcnlwdF9kYXRhICpkYXRhOwotCXZvaWQgKmtleTsKLQotCS8qIFBsYWNlICdkYXRhJyBhdCB0aGUgZmlyc3QgMTYtQnl0ZXMgYWxpZ25lZCBhZGRyZXNzIGluICdiaWdidWYnLiAqLwotCWlmICgoKGxvbmcpYmlnYnVmKSAmIDB4MEYpCi0JCWRhdGEgPSAodm9pZCopKGJpZ2J1ZiArIDE2IC0gKChsb25nKWJpZ2J1ZiAmIDB4MEYpKTsKLQllbHNlCi0JCWRhdGEgPSAodm9pZCopYmlnYnVmOwotCi0JLyogUHJlcGFyZSBDb250cm9sIHdvcmQuICovCi0JbWVtc2V0IChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHBhZGxvY2tfeGNyeXB0X2RhdGEpKTsKLQlkYXRhLT5jd29yZC5iLmVuY2RlYyA9ICFlbmNkZWM7CS8qIGluIHRoZSByZXN0IG9mIGNyeXB0b2FwaSBFTkM9MS9ERUM9MCAqLwotCWRhdGEtPmN3b3JkLmIucm91bmRzID0gMTAgKyAoY3R4LT5rZXlfbGVuZ3RoIC0gMTYpIC8gNDsKLQlkYXRhLT5jd29yZC5iLmtzaXplID0gKGN0eC0+a2V5X2xlbmd0aCAtIDE2KSAvIDg7Ci0KLQkvKiBJcyB0aGUgaGFyZHdhcmUgY2FwYWJsZSB0byBnZW5lcmF0ZSB0aGUgZXh0ZW5kZWQga2V5PyAqLwotCWlmICghYWVzX2h3X2V4dGtleV9hdmFpbGFibGUoY3R4LT5rZXlfbGVuZ3RoKSkKLQkJZGF0YS0+Y3dvcmQuYi5rZXlnZW4gPSAxOwotCi0JLyogY3R4LT5FIHN0YXJ0cyB3aXRoIGEgcGxhaW4ga2V5IC0gaWYgdGhlIGhhcmR3YXJlIGlzIGNhcGFibGUKLQkgICB0byBnZW5lcmF0ZSB0aGUgZXh0ZW5kZWQga2V5IGl0c2VsZiB3ZSBtdXN0IHN1cHBseQotCSAgIHRoZSBwbGFpbiBrZXkgZm9yIGJvdGggRW5jcnlwdGlvbiBhbmQgRGVjcnlwdGlvbi4gKi8KLQlpZiAoZW5jZGVjID09IENSWVBUT19ESVJfRU5DUllQVCB8fCBkYXRhLT5jd29yZC5iLmtleWdlbiA9PSAwKQotCQlrZXkgPSBjdHgtPkU7Ci0JZWxzZQotCQlrZXkgPSBjdHgtPkQ7Ci0JCi0JbWVtY3B5KGRhdGEtPmJ1ZiwgaW5fYXJnLCBBRVNfQkxPQ0tfU0laRSk7Ci0JcGFkbG9ja194Y3J5cHRfZWNiKGRhdGEtPmJ1ZiwgZGF0YS0+YnVmLCBrZXksICZkYXRhLT5jd29yZCwgMSk7Ci0JbWVtY3B5KG91dF9hcmcsIGRhdGEtPmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOworCS8qIEVuZm9yY2Uga2V5IHJlbG9hZC4gKi8KKwlhc20gdm9sYXRpbGUgKCJwdXNoZmw7IHBvcGZsIik7CisJLyogcmVwIHhjcnlwdGNiYyAqLworCWFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4ZjMsMHgwZiwweGE3LDB4ZDAiCisJCSAgICAgIDogIitTIiAoaW5wdXQpLCAiK0QiIChvdXRwdXQpLCAiK2EiIChpdikKKwkJICAgICAgOiAiZCIgKGNvbnRyb2xfd29yZCksICJiIiAoa2V5KSwgImMiIChjb3VudCkpOworCXJldHVybiBpdjsKIH0KIAogc3RhdGljIHZvaWQKIGFlc19lbmNyeXB0KHZvaWQgKmN0eF9hcmcsIHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4pCiB7Ci0JYWVzX3BhZGxvY2soY3R4X2FyZywgb3V0LCBpbiwgQ1JZUFRPX0RJUl9FTkNSWVBUKTsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKKwlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91dCwgY3R4LT5FLCAmY3R4LT5jd29yZC5lbmNyeXB0LCAxKTsKIH0KIAogc3RhdGljIHZvaWQKIGFlc19kZWNyeXB0KHZvaWQgKmN0eF9hcmcsIHVpbnQ4X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4pCiB7Ci0JYWVzX3BhZGxvY2soY3R4X2FyZywgb3V0LCBpbiwgQ1JZUFRPX0RJUl9ERUNSWVBUKTsKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjdHhfYXJnKTsKKwlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91dCwgY3R4LT5ELCAmY3R4LT5jd29yZC5kZWNyeXB0LCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhZXNfZW5jcnlwdF9lY2IoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqb3V0LAorCQkJCSAgICBjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGFlc19jdHggKmN0eCA9IGFlc19jdHgoY3J5cHRvX3RmbV9jdHgoZGVzYy0+dGZtKSk7CisJcGFkbG9ja194Y3J5cHRfZWNiKGluLCBvdXQsIGN0eC0+RSwgJmN0eC0+Y3dvcmQuZW5jcnlwdCwKKwkJCSAgIG5ieXRlcyAvIEFFU19CTE9DS19TSVpFKTsKKwlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFlc19kZWNyeXB0X2VjYihjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pKTsKKwlwYWRsb2NrX3hjcnlwdF9lY2IoaW4sIG91dCwgY3R4LT5ELCAmY3R4LT5jd29yZC5kZWNyeXB0LAorCQkJICAgbmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpOworCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWVzX2VuY3J5cHRfY2JjKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywgdTggKm91dCwKKwkJCQkgICAgY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBhZXNfY3R4ICpjdHggPSBhZXNfY3R4KGNyeXB0b190Zm1fY3R4KGRlc2MtPnRmbSkpOworCXU4ICppdjsKKworCWl2ID0gcGFkbG9ja194Y3J5cHRfY2JjKGluLCBvdXQsIGN0eC0+RSwgZGVzYy0+aW5mbywKKwkJCQkmY3R4LT5jd29yZC5lbmNyeXB0LCBuYnl0ZXMgLyBBRVNfQkxPQ0tfU0laRSk7CisJbWVtY3B5KGRlc2MtPmluZm8sIGl2LCBBRVNfQkxPQ0tfU0laRSk7CisKKwlyZXR1cm4gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFlc19kZWNyeXB0X2NiYyhjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpvdXQsCisJCQkJICAgIGNvbnN0IHU4ICppbiwgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgYWVzX2N0eCAqY3R4ID0gYWVzX2N0eChjcnlwdG9fdGZtX2N0eChkZXNjLT50Zm0pKTsKKwlwYWRsb2NrX3hjcnlwdF9jYmMoaW4sIG91dCwgY3R4LT5ELCBkZXNjLT5pbmZvLCAmY3R4LT5jd29yZC5kZWNyeXB0LAorCQkJICAgbmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpOworCXJldHVybiBuYnl0ZXMgJiB+KEFFU19CTE9DS19TSVpFIC0gMSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnID0gewpAQCAtNDQxLDYgKzQ3MSw3IEBACiAJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAogCS5jcmFfYmxvY2tzaXplCQk9CUFFU19CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IGFlc19jdHgpLAorCS5jcmFfYWxpZ25tYXNrCQk9CVBBRExPQ0tfQUxJR05NRU5UIC0gMSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKIAkuY3JhX2xpc3QJCT0JTElTVF9IRUFEX0lOSVQoYWVzX2FsZy5jcmFfbGlzdCksCiAJLmNyYV91CQkJPQl7CkBAIC00NDksNyArNDgwLDExIEBACiAJCQkuY2lhX21heF9rZXlzaXplCT0JQUVTX01BWF9LRVlfU0laRSwKIAkJCS5jaWFfc2V0a2V5CSAgIAk9IAlhZXNfc2V0X2tleSwKIAkJCS5jaWFfZW5jcnlwdAkgCT0JYWVzX2VuY3J5cHQsCi0JCQkuY2lhX2RlY3J5cHQJICAJPQlhZXNfZGVjcnlwdAorCQkJLmNpYV9kZWNyeXB0CSAgCT0JYWVzX2RlY3J5cHQsCisJCQkuY2lhX2VuY3J5cHRfZWNiIAk9CWFlc19lbmNyeXB0X2VjYiwKKwkJCS5jaWFfZGVjcnlwdF9lY2IgIAk9CWFlc19kZWNyeXB0X2VjYiwKKwkJCS5jaWFfZW5jcnlwdF9jYmMgCT0JYWVzX2VuY3J5cHRfY2JjLAorCQkJLmNpYV9kZWNyeXB0X2NiYyAgCT0JYWVzX2RlY3J5cHRfY2JjLAogCQl9CiAJfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2suaCBiL2RyaXZlcnMvY3J5cHRvL3BhZGxvY2suaAppbmRleCA3YTUwMDYwLi4zY2YyYjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9wYWRsb2NrLmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcGFkbG9jay5oCkBAIC0xMywxOCArMTMsMTggQEAKICNpZm5kZWYgX0NSWVBUT19QQURMT0NLX0gKICNkZWZpbmUgX0NSWVBUT19QQURMT0NLX0gKIAorI2RlZmluZSBQQURMT0NLX0FMSUdOTUVOVCAxNgorCiAvKiBDb250cm9sIHdvcmQuICovCi11bmlvbiBjd29yZCB7Ci0JdWludDMyX3QgY3dvcmRbNF07Ci0Jc3RydWN0IHsKLQkJaW50IHJvdW5kczo0OwotCQlpbnQgYWxnbzozOwotCQlpbnQga2V5Z2VuOjE7Ci0JCWludCBpbnRlcm06MTsKLQkJaW50IGVuY2RlYzoxOwotCQlpbnQga3NpemU6MjsKLQl9IGI7Ci19Oworc3RydWN0IGN3b3JkIHsKKwlpbnQgX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKQorCQlyb3VuZHM6NCwKKwkJYWxnbzozLAorCQlrZXlnZW46MSwKKwkJaW50ZXJtOjEsCisJCWVuY2RlYzoxLAorCQlrc2l6ZToyOworfSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oUEFETE9DS19BTElHTk1FTlQpKSk7CiAKICNkZWZpbmUgUEZYCSJwYWRsb2NrOiAiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKaW5kZXggYTM0NTFjYi4uMzNiMTdjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKQEAgLTYxOCw4ICs2MTgsOCBAQAogCW5ld19lZml2YXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZWZpdmFyX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXNob3J0X25hbWUgfHwgIW5ld19lZml2YXIpICB7Ci0JCWlmIChzaG9ydF9uYW1lKSAgICAgICAga2ZyZWUoc2hvcnRfbmFtZSk7Ci0JCWlmIChuZXdfZWZpdmFyKSAgICAgICAga2ZyZWUobmV3X2VmaXZhcik7CisJCWtmcmVlKHNob3J0X25hbWUpOworCQlrZnJlZShuZXdfZWZpdmFyKTsKIAkJcmV0dXJuIDE7CiAJfQogCW1lbXNldChzaG9ydF9uYW1lLCAwLCBzaG9ydF9uYW1lX3NpemUrMSk7CkBAIC02NDQsNyArNjQ0LDggQEAKIAlrb2JqX3NldF9rc2V0X3MobmV3X2VmaXZhciwgdmFyc19zdWJzeXMpOwogCWtvYmplY3RfcmVnaXN0ZXIoJm5ld19lZml2YXItPmtvYmopOwogCi0Ja2ZyZWUoc2hvcnRfbmFtZSk7IHNob3J0X25hbWUgPSBOVUxMOworCWtmcmVlKHNob3J0X25hbWUpOworCXNob3J0X25hbWUgPSBOVUxMOwogCiAJc3Bpbl9sb2NrKCZlZml2YXJzX2xvY2spOwogCWxpc3RfYWRkKCZuZXdfZWZpdmFyLT5saXN0LCAmZWZpdmFyX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9wY2RwLmMgYi9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYwppbmRleCA4MzliNDRhLi41M2M5NWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vdmdhLmg+CiAjaW5jbHVkZSAicGNkcC5oIgogCiBzdGF0aWMgaW50IF9faW5pdApAQCAtNDAsMTAgKzQxLDI3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1zZXR1cF92Z2FfY29uc29sZShzdHJ1Y3QgcGNkcF92Z2EgKnZnYSkKK3NldHVwX3ZnYV9jb25zb2xlKHN0cnVjdCBwY2RwX2RldmljZSAqZGV2KQogewogI2lmIGRlZmluZWQoQ09ORklHX1ZUKSAmJiBkZWZpbmVkKENPTkZJR19WR0FfQ09OU09MRSkKLQlpZiAoZWZpX21lbV90eXBlKDB4QTAwMDApID09IEVGSV9DT05WRU5USU9OQUxfTUVNT1JZKSB7CisJdTggKmlmX3B0cjsKKworCWlmX3B0ciA9ICgodTggKilkZXYgKyBzaXplb2Yoc3RydWN0IHBjZHBfZGV2aWNlKSk7CisJaWYgKGlmX3B0clswXSA9PSBQQ0RQX0lGX1BDSSkgeworCQlzdHJ1Y3QgcGNkcF9pZl9wY2kgaWZfcGNpOworCisJCS8qIHN0cnVjdCBjb3B5IHNpbmNlIGlmcHRyIG1pZ2h0IG5vdCBiZSBjb3JyZWN0bHkgYWxpZ25lZCAqLworCisJCW1lbWNweSgmaWZfcGNpLCBpZl9wdHIsIHNpemVvZihpZl9wY2kpKTsKKworCQlpZiAoaWZfcGNpLnRyYW5zICYgUENEUF9QQ0lfVFJBTlNfSU9QT1JUKQorCQkJdmdhX2NvbnNvbGVfaW9iYXNlID0gaWZfcGNpLmlvcG9ydF90cmE7CisKKwkJaWYgKGlmX3BjaS50cmFucyAmIFBDRFBfUENJX1RSQU5TX01NSU8pCisJCQl2Z2FfY29uc29sZV9tZW1iYXNlID0gaWZfcGNpLm1taW9fdHJhOworCX0KKworCWlmIChlZmlfbWVtX3R5cGUodmdhX2NvbnNvbGVfbWVtYmFzZSArIDB4QTAwMDApID09IEVGSV9DT05WRU5USU9OQUxfTUVNT1JZKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUENEUDogVkdBIHNlbGVjdGVkLCBidXQgZnJhbWUgYnVmZmVyIGlzIG5vdCBNTUlPIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTk1LDcgKzExMyw3IEBACiAJICAgICBkZXYgPSAoc3RydWN0IHBjZHBfZGV2aWNlICopICgodTggKikgZGV2ICsgZGV2LT5sZW5ndGgpKSB7CiAJCWlmIChkZXYtPmZsYWdzICYgUENEUF9QUklNQVJZX0NPTlNPTEUpIHsKIAkJCWlmIChkZXYtPnR5cGUgPT0gUENEUF9DT05TT0xFX1ZHQSkgewotCQkJCXJldHVybiBzZXR1cF92Z2FfY29uc29sZSgoc3RydWN0IHBjZHBfdmdhICopIGRldik7CisJCQkJcmV0dXJuIHNldHVwX3ZnYV9jb25zb2xlKGRldik7CiAJCQl9CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL3BjZHAuaCBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5oCmluZGV4IDFkYzdjODguLmU3MmNjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5oCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvcGNkcC5oCkBAIC01MiwxMSArNTIsMzQgQEAKIAl1MzIJCQkJY2xvY2tfcmF0ZTsKIAl1OAkJCQlwY2lfcHJvZ19pbnRmYzsKIAl1OAkJCQlmbGFnczsKLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFBDRFBfSUZfUENJCTEKKworLyogcGNkcF9pZl9wY2kudHJhbnMgKi8KKyNkZWZpbmUgUENEUF9QQ0lfVFJBTlNfSU9QT1JUCTB4MDIKKyNkZWZpbmUgUENEUF9QQ0lfVFJBTlNfTU1JTwkweDAxCisKK3N0cnVjdCBwY2RwX2lmX3BjaSB7CisJdTgJCQlpbnRlcmNvbm5lY3Q7CisJdTgJCQlyZXNlcnZlZDsKKwl1MTYJCQlsZW5ndGg7CisJdTgJCQlzZWdtZW50OworCXU4CQkJYnVzOworCXU4CQkJZGV2OworCXU4CQkJZnVuOworCXUxNgkJCWRldl9pZDsKKwl1MTYJCQl2ZW5kb3JfaWQ7CisJdTMyCQkJYWNwaV9pbnRlcnJ1cHQ7CisJdTY0CQkJbW1pb190cmE7CisJdTY0CQkJaW9wb3J0X3RyYTsKKwl1OAkJCWZsYWdzOworCXU4CQkJdHJhbnM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiBzdHJ1Y3QgcGNkcF92Z2EgewogCXU4CQkJY291bnQ7CQkvKiBhZGRyZXNzIHNwYWNlIGRlc2NyaXB0b3JzICovCi19OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyogcGNkcF9kZXZpY2UuZmxhZ3MgKi8KICNkZWZpbmUgUENEUF9QUklNQVJZX0NPTlNPTEUJMQpAQCAtNjYsNyArODksOSBAQAogCXU4CQkJZmxhZ3M7CiAJdTE2CQkJbGVuZ3RoOwogCXUxNgkJCWVmaV9pbmRleDsKLX07CisJLyogbmV4dCBkYXRhIGlzIHBjZHBfaWZfcGNpIG9yIHBjZHBfaWZfYWNwaSAobm90IHlldCBzdXBwb3J0ZWQpICovCisJLyogbmV4dCBkYXRhIGlzIGRldmljZSBzcGVjaWZpYyB0eXBlIChjdXJyZW50bHkgb25seSBwY2RwX3ZnYSkgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIHN0cnVjdCBwY2RwIHsKIAl1OAkJCXNpZ25hdHVyZVs0XTsKQEAgLTgxLDQgKzEwNiw0IEBACiAJdTMyCQkJbnVtX3VhcnRzOwogCXN0cnVjdCBwY2RwX3VhcnQJdWFydFswXTsJLyogYWN0dWFsIHNpemUgaXMgbnVtX3VhcnRzICovCiAJLyogcmVtYWluZGVyIG9mIHRhYmxlIGlzIHBjZHBfZGV2aWNlIHN0cnVjdHVyZXMgKi8KLX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MGQ1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTAsMCArMSw0MjAgQEAKKyMKKyMgSTJDIFNlbnNvciBjaGlwIGRyaXZlcnMgY29uZmlndXJhdGlvbgorIworCittZW51ICJIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQiCisKK2NvbmZpZyBIV01PTgorCXRyaXN0YXRlICJIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2VzIGxldCB5b3UgbW9uaXRvciB0aGUgaGFyZHdhcmUgaGVhbHRoCisJICBvZiBhIHN5c3RlbS4gTW9zdCBtb2Rlcm4gbW90aGVyYm9hcmRzIGluY2x1ZGUgc3VjaCBhIGRldmljZS4gSXQKKwkgIGNhbiBpbmNsdWRlIHRlbXBlcmF0dXJlIHNlbnNvcnMsIHZvbHRhZ2Ugc2Vuc29ycywgZmFuIHNwZWVkCisJICBzZW5zb3JzIGFuZCB2YXJpb3VzIGFkZGl0aW9uYWwgZmVhdHVyZXMgc3VjaCBhcyB0aGUgYWJpbGl0eSB0bworCSAgY29udHJvbCB0aGUgc3BlZWQgb2YgdGhlIGZhbnMuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMjEKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyMSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDIxCisJICBhbmQgQURNMTAyMyBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogTWF4aW0gTUFYMTYxNyBhbmQgTUFYMTYxN0EsCisJICBHZW5lc3lzIExvZ2ljIEdMNTIzU00sIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NCwgVEkgVEhNQzEwLAorCSAgYW5kIHRoZSBYRU9OIHByb2Nlc3NvciBidWlsdC1pbiBzZW5zb3IuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjEuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEwMjUKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNQorCSAgYW5kIFBoaWxpcHMgTkUxNjE5IHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNS4KKworY29uZmlnIFNFTlNPUlNfQURNMTAyNgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDI2IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDI2CisJICBzZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNi4KKworY29uZmlnIFNFTlNPUlNfQURNMTAzMQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDMxCisJICBhbmQgQURNMTAzMCBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMzEuCisKK2NvbmZpZyBTRU5TT1JTX0FETTkyNDAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNOTI0MCBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNOTI0MCwKKwkgIERhbGxhcyBEUzE3ODAsIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MSBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkbTkyNDAuCisKK2NvbmZpZyBTRU5TT1JTX0FTQjEwMAorCXRyaXN0YXRlICJBc3VzIEFTQjEwMCBCYWNoIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBU0IxMDAgQmFjaCBzZW5zb3IKKwkgIGNoaXAgZm91bmQgb24gc29tZSBBc3VzIG1haW5ib2FyZHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFzYjEwMC4KKworY29uZmlnIFNFTlNPUlNfQVRYUDEKKwl0cmlzdGF0ZSAiQXR0YW5zaWMgQVRYUDEgVklEIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEF0dGFuc2ljIEFUWFAxIFZJRAorCSAgY29udHJvbGxlci4KKworCSAgSWYgeW91ciBib2FyZCBoYXZlIHN1Y2ggYSBjaGlwLCB5b3UgYXJlIGFibGUgdG8gY29udHJvbCB5b3VyIENQVQorCSAgY29yZSBhbmQgb3RoZXIgdm9sdGFnZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGF0eHAxLgorCitjb25maWcgU0VOU09SU19EUzE2MjEKKwl0cmlzdGF0ZSAiRGFsbGFzIFNlbWljb25kdWN0b3IgRFMxNjIxIGFuZCBEUzE2MjUiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRGFsbGFzIFNlbWljb25kdWN0b3IKKwkgIERTMTYyMSBhbmQgRFMxNjI1IHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgZHMxNjIxLgorCitjb25maWcgU0VOU09SU19GU0NIRVIKKwl0cmlzdGF0ZSAiRlNDIEhlcm1lcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKKwkgIENvbXB1dGVycyBIZXJtZXMgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBmc2NoZXIuCisKK2NvbmZpZyBTRU5TT1JTX0ZTQ1BPUworCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCisJICBDb21wdXRlcnMgUG9zZWlkb24gc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBmc2Nwb3MuCisKK2NvbmZpZyBTRU5TT1JTX0dMNTE4U00KKwl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUxOFNNIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUxOFNNCisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGdsNTE4c20uCisKK2NvbmZpZyBTRU5TT1JTX0dMNTIwU00KKwl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUyMFNNIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MjBTTQorCSAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBnbDUyMHNtLgorCitjb25maWcgU0VOU09SU19JVDg3CisJdHJpc3RhdGUgIklURSBJVDg3eHggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgSVRFIElUODd4eCBzZW5zb3IgY2hpcHMKKwkgIGFuZCBjbG9uZXM6IFNpUzk2MC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KKworY29uZmlnIFNFTlNPUlNfTE02MworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKKwkgIExNNjMgcmVtb3RlIGRpb2RlIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIHdpdGggaW50ZWdyYXRlZCBmYW4KKwkgIGNvbnRyb2wuICBTdWNoIGNoaXBzIGFyZSBmb3VuZCBvbiB0aGUgVHlhbiBTNDg4MiAoVGh1bmRlciBLOFFTIFBybykKKwkgIG1vdGhlcmJvYXJkLCBhbW9uZyBvdGhlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNjMuCisKK2NvbmZpZyBTRU5TT1JTX0xNNzUKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NQorCSAgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IERhbGxhcyBTZW1pY29uZHVjdG9yIERTNzUgYW5kIERTMTc3NSAoaW4KKwkgIDktYml0IHByZWNpc2lvbiBtb2RlKSwgYW5kIFRlbENvbSAobm93IE1pY3JvY2hpcCkgVENONzUuCisKKwkgIFRoZSBEUzc1IGFuZCBEUzE3NzUgaW4gMTAtIHRvIDEyLWJpdCBwcmVjaXNpb24gbW9kZXMgd2lsbCByZXF1aXJlCisJICBhIGZvcmNlIG1vZHVsZSBwYXJhbWV0ZXIuIFRoZSBkcml2ZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleHRyYQorCSAgcHJlY2lzaW9uIGFueWhvdy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG03NS4KKworY29uZmlnIFNFTlNPUlNfTE03NworCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzciCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3CisJICBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNzcuCisKK2NvbmZpZyBTRU5TT1JTX0xNNzgKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzgsCisJICBMTTc4LUogYW5kIExNNzkuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNzguCisKK2NvbmZpZyBTRU5TT1JTX0xNODAKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgwIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKKwkgIExNODAgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTgwLgorCitjb25maWcgU0VOU09SU19MTTgzCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKKwkgIExNODMgc2Vuc29yIGNoaXBzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTgzLgorCitjb25maWcgU0VOU09SU19MTTg1CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NSBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1CisJICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogQURUNzQ2MywgRU1DNkQxMDAsIEVNQzZEMTAyIGFuZCBBRE0xMDI3LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTg1LgorCitjb25maWcgU0VOU09SU19MTTg3CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NyIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKKwkgIHNlbnNvciBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG04Ny4KKworY29uZmlnIFNFTlNPUlNfTE05MAorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAgYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwLAorCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiBhbmQgTWF4aW0gTUFYNjY1NyBhbmQKKwkgIE1BWDY2NTggc2Vuc29yIGNoaXBzLgorCisJICBUaGUgQW5hbG9nIERldmljZXMgQURUNzQ2MSBzZW5zb3IgY2hpcCBpcyBhbHNvIHN1cHBvcnRlZCwgYnV0IG9ubHkKKwkgIGlmIGZvdW5kIGluIEFETTEwMzIgY29tcGF0aWJpbGl0eSBtb2RlLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTkwLgorCitjb25maWcgU0VOU09SU19MTTkyCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MiBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyCisJICBhbmQgTWF4aW0gTUFYNjYzNSBzZW5zb3IgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtOTIuCisKK2NvbmZpZyBTRU5TT1JTX01BWDE2MTkKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjE5IHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgorCitjb25maWcgU0VOU09SU19QQzg3MzYwCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKKwkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzZ4IFN1cGVyLUkvTyBjaGlwcy4KKwkgIFRoZSBQQzg3MzYwLCBQQzg3MzYzIGFuZCBQQzg3MzY0IG9ubHkgaGF2ZSBmYW4gbW9uaXRvcmluZyBhbmQKKwkgIGNvbnRyb2wuICBUaGUgUEM4NzM2NSBhbmQgUEM4NzM2NiBhZGRpdGlvbmFsbHkgaGF2ZSB2b2x0YWdlIGFuZAorCSAgdGVtcGVyYXR1cmUgbW9uaXRvcmluZy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcGM4NzM2MC4KKworY29uZmlnIFNFTlNPUlNfU0lTNTU5NQorCXRyaXN0YXRlICJTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLiBTaVM1NTk1IgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIHNlbnNvcnMgaW4KKwkgIFNpUzU1OTUgU291dGggQnJpZGdlcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2lzNTU5NS4KKworY29uZmlnIFNFTlNPUlNfU01TQzQ3TTEKKwl0cmlzdGF0ZSAiU01TQyBMUEM0N00xMHggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJc2VsZWN0IEkyQ19JU0EKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIGludGVncmF0ZWQgZmFuCisJICBtb25pdG9yaW5nIGFuZCBjb250cm9sIGNhcGFiaWxpdGllcyBvZiB0aGUgU01TQyBMUEM0N0IyN3gsCisJICBMUEM0N00xMHgsIExQQzQ3TTEzeCwgTFBDNDdNMTR4LCBMUEM0N00xNXggYW5kIExQQzQ3TTE5MiBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc21zYzQ3bTEuCisKK2NvbmZpZyBTRU5TT1JTX1NNU0M0N0IzOTcKKwl0cmlzdGF0ZSAiU01TQyBMUEM0N0IzOTctTkMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgU01TQyBMUEM0N0IzOTctTkMKKwkgIHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBzbXNjNDdiMzk3LgorCitjb25maWcgU0VOU09SU19WSUE2ODZBCisJdHJpc3RhdGUgIlZJQTY4NkEiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgUENJCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCisJICBWaWEgNjg2QS9CIFNvdXRoIEJyaWRnZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHZpYTY4NmEuCisKK2NvbmZpZyBTRU5TT1JTX1c4Mzc4MUQKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODM3ODFELCBXODM3ODJELCBXODM3ODNTLCBXODM2MjdIRiwgQXN1cyBBUzk5MTI3RiIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQworCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4eCBzZXJpZXMKKwkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MgYW5kIFc4MzYyN0hGLAorCSAgYW5kIHRoZSBzaW1pbGFyIEFzdXMgQVM5OTEyN0YuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc4MWQuCisKK2NvbmZpZyBTRU5TT1JTX1c4M0w3ODVUUworCXRyaXN0YXRlICJXaW5ib25kIFc4M0w3ODVUUy1TIgorCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBJMkNfU0VOU09SCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4M0w3ODVUUy1TCisJICBzZW5zb3IgY2hpcCwgd2hpY2ggaXMgdXNlZCBvbiB0aGUgQXN1cyBBN044WCwgYW1vbmcgb3RoZXIKKwkgIG1vdGhlcmJvYXJkcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzbDc4NXRzLgorCitjb25maWcgU0VOU09SU19XODM2MjdIRgorCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBXODM2OTdIRiIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSTJDX1NFTlNPUgorCXNlbGVjdCBJMkNfSVNBCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4MzZYNyBzZXJpZXMKKwkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBhbmQgdGhlIFc4MzY5N0hGCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHc4MzYyN2hmLgorCitjb25maWcgU0VOU09SU19XODM2MjdFSEYKKwl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdFSEYiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEkyQ19TRU5TT1IKKwlzZWxlY3QgSTJDX0lTQQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUKKwkgIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSBvZiB0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAuCisJICBPbmx5IGZhbiBhbmQgdGVtcGVyYXR1cmUgaW5wdXRzIGFyZSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCwgd2hpbGUKKwkgIHRoZSBjaGlwIGRvZXMgbXVjaCBtb3JlIHRoYW4gdGhhdC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3ZWhmLgorCitjb25maWcgSFdNT05fREVCVUdfQ0hJUAorCWJvb2wgIkhhcmR3YXJlIE1vbml0b3JpbmcgQ2hpcCBkZWJ1Z2dpbmcgbWVzc2FnZXMiCisJZGVwZW5kcyBvbiBIV01PTgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIEkyQyBjaGlwIGRyaXZlcnMgdG8gcHJvZHVjZSBhIGJ1bmNoIG9mCisJICBkZWJ1ZyBtZXNzYWdlcyB0byB0aGUgc3lzdGVtIGxvZy4gIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgaGF2aW5nCisJICBhIHByb2JsZW0gd2l0aCBJMkMgc3VwcG9ydCBhbmQgd2FudCB0byBzZWUgbW9yZSBvZiB3aGF0IGlzIGdvaW5nCisJICBvbi4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4MTQwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTAsMCArMSw0NCBAQAorIworIyBNYWtlZmlsZSBmb3Igc2Vuc29yIGNoaXAgZHJpdmVycy4KKyMKKworIyBhc2IxMDAsIHRoZW4gdzgzNzgxZCBnbyBmaXJzdCwgYXMgdGhleSBjYW4gb3ZlcnJpZGUgb3RoZXIgZHJpdmVycycgYWRkcmVzc2VzLgorb2JqLSQoQ09ORklHX1NFTlNPUlNfQVNCMTAwKQkrPSBhc2IxMDAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYpCSs9IHc4MzYyN2hmLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc4MUQpCSs9IHc4Mzc4MWQubworCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDIxKQkrPSBhZG0xMDIxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjUpCSs9IGFkbTEwMjUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNikJKz0gYWRtMTAyNi5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDMxKQkrPSBhZG0xMDMxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0FETTkyNDApCSs9IGFkbTkyNDAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQVRYUDEpCSs9IGF0eHAxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hFUikJKz0gZnNjaGVyLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0ZTQ1BPUykJKz0gZnNjcG9zLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0dMNTE4U00pCSs9IGdsNTE4c20ubworb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MjBTTSkJKz0gZ2w1MjBzbS5vCitvYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNjMpCSs9IGxtNjMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTc3KQkrPSBsbTc3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNNzgpCSs9IGxtNzgubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04MCkJKz0gbG04MC5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTgzKQkrPSBsbTgzLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNODUpCSs9IGxtODUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NykJKz0gbG04Ny5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTkwKQkrPSBsbTkwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCitvYmotJChDT05GSUdfU0VOU09SU19QQzg3MzYwKQkrPSBwYzg3MzYwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1NJUzU1OTUpCSs9IHNpczU1OTUubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NykrPSBzbXNjNDdiMzk3Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N00xKQkrPSBzbXNjNDdtMS5vCitvYmotJChDT05GSUdfU0VOU09SU19WSUE2ODZBKQkrPSB2aWE2ODZhLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4MzYyN0VIRikJKz0gdzgzNjI3ZWhmLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUykJKz0gdzgzbDc4NXRzLm8KKworaWZlcSAoJChDT05GSUdfSFdNT05fREVCVUdfQ0hJUCkseSkKK0VYVFJBX0NGTEFHUyArPSAtRERFQlVHCitlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDIxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyMS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2FkbTEwMjEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAyNS5jIGIvZHJpdmVycy9od21vbi9hZG0xMDI1LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjUuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9hZG0xMDI1LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FkbTEwMjYuYyBiL2RyaXZlcnMvaHdtb24vYWRtMTAyNi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDI2LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vYWRtMTAyNi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9hZG0xMDMxLmMgYi9kcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvYWRtMTAzMS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2FkbTEwMzEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvYWRtOTI0MC5jIGIvZHJpdmVycy9od21vbi9hZG05MjQwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2FkbTkyNDAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9hZG05MjQwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2FzYjEwMC5jIGIvZHJpdmVycy9od21vbi9hc2IxMDAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvYXNiMTAwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vYXNiMTAwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vYXR4cDEuYyBiL2RyaXZlcnMvaHdtb24vYXR4cDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNmODJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9hdHhwMS5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICAgIGF0eHAxLmMgLSBrZXJuZWwgbW9kdWxlIGZvciBzZXR0aW5nIENQVSBWSUQgYW5kIGdlbmVyYWwgcHVycG9zZQorICAgICAgICAgICAgICAgICAgICAgSS9PcyB1c2luZyB0aGUgQXR0YW5zaWMgQVRYUDEgY2hpcC4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3lzdGVtIHZvbHRhZ2VzIGNvbnRyb2wgdmlhIEF0dGFuc2ljIEFUWFAxIik7CitNT0RVTEVfVkVSU0lPTigiMC42LjIiKTsKK01PRFVMRV9BVVRIT1IoIlNlYmFzdGlhbiBXaXR0IDxzZS53aXR0QGdteC5uZXQ+Iik7CisKKyNkZWZpbmUgQVRYUDFfVklECTB4MDAKKyNkZWZpbmUgQVRYUDFfQ1ZJRAkweDAxCisjZGVmaW5lIEFUWFAxX0dQSU8xCTB4MDYKKyNkZWZpbmUgQVRYUDFfR1BJTzIJMHgwYQorI2RlZmluZSBBVFhQMV9WSURFTkEJMHgyMAorI2RlZmluZSBBVFhQMV9WSURNQVNLCTB4MWYKKyNkZWZpbmUgQVRYUDFfR1BJTzFNQVNLCTB4MGYKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHgzNywgMHg0ZSwgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKKworU0VOU09SU19JTlNNT0RfMShhdHhwMSk7CisKK3N0YXRpYyBpbnQgYXR4cDFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcHRlcik7CitzdGF0aWMgaW50IGF0eHAxX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQpOworc3RhdGljIHN0cnVjdCBhdHhwMV9kYXRhICogYXR4cDFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBhdHhwMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYXR4cDFfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYXR4cDEiLAorCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAorCS5hdHRhY2hfYWRhcHRlciA9IGF0eHAxX2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gYXR4cDFfZGV0YWNoX2NsaWVudCwKK307CisKK3N0cnVjdCBhdHhwMV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsKKwl1OCB2YWxpZDsKKwlzdHJ1Y3QgeworCQl1OCB2aWQ7CQkvKiBWSUQgb3V0cHV0IHJlZ2lzdGVyICovCisJCXU4IGNwdV92aWQ7IC8qIFZJRCBpbnB1dCBmcm9tIENQVSAqLworCQl1OCBncGlvMTsgICAvKiBHZW5lcmFsIHB1cnBvc2UgSS9PIHJlZ2lzdGVyIDEgKi8KKwkJdTggZ3BpbzI7ICAgLyogR2VuZXJhbCBwdXJwb3NlIEkvTyByZWdpc3RlciAyICovCisJfSByZWc7CisJdTggdnJtOwkJCS8qIERldGVjdGVkIENQVSBWUk0gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR4cDFfZGF0YSAqIGF0eHAxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGF0eHAxX2RhdGEgKmRhdGE7CisKKwljbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKChqaWZmaWVzIC0gZGF0YS0+bGFzdF91cGRhdGVkID4gSFopIHx8CisJICAgIChqaWZmaWVzIDwgZGF0YS0+bGFzdF91cGRhdGVkKSB8fAorCSAgICAhZGF0YS0+dmFsaWQpIHsKKworCQkvKiBVcGRhdGUgbG9jYWwgcmVnaXN0ZXIgZGF0YSAqLworCQlkYXRhLT5yZWcudmlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQVRYUDFfVklEKTsKKwkJZGF0YS0+cmVnLmNwdV92aWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBVFhQMV9DVklEKTsKKwkJZGF0YS0+cmVnLmdwaW8xID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQVRYUDFfR1BJTzEpOworCQlkYXRhLT5yZWcuZ3BpbzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBVFhQMV9HUElPMik7CisKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4oZGF0YSk7Cit9CisKKy8qIHN5cyBmaWxlIGZ1bmN0aW9ucyBmb3IgY3B1MF92aWQgKi8KK3N0YXRpYyBzc2l6ZV90IGF0eHAxX3Nob3d2Y29yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHNpemU7CisJc3RydWN0IGF0eHAxX2RhdGEgKmRhdGE7CisKKwlkYXRhID0gYXR4cDFfdXBkYXRlX2RldmljZShkZXYpOworCisJc2l6ZSA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHZpZF9mcm9tX3JlZyhkYXRhLT5yZWcudmlkICYgQVRYUDFfVklETUFTSywgZGF0YS0+dnJtKSk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgYXR4cDFfc3RvcmV2Y29yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXR4cDFfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCWNoYXIgdmlkOworCWNoYXIgY3ZpZDsKKwl1bnNpZ25lZCBpbnQgdmNvcmU7CisKKwljbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJZGF0YSA9IGF0eHAxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXZjb3JlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJdmNvcmUgLz0gMjU7CisJdmNvcmUgKj0gMjU7CisKKwkvKiBDYWxjdWxhdGUgVklEICovCisJdmlkID0gdmlkX3RvX3JlZyh2Y29yZSwgZGF0YS0+dnJtKTsKKworCWlmICh2aWQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiVklEIGNhbGN1bGF0aW9uIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogSWYgb3V0cHV0IGVuYWJsZWQsIHVzZSBjb250cm9sIHJlZ2lzdGVyIHZhbHVlLiBPdGhlcndpc2Ugb3JpZ2luYWwgQ1BVIFZJRCAqLworCWlmIChkYXRhLT5yZWcudmlkICYgQVRYUDFfVklERU5BKQorCQljdmlkID0gZGF0YS0+cmVnLnZpZCAmIEFUWFAxX1ZJRE1BU0s7CisJZWxzZQorCQljdmlkID0gZGF0YS0+cmVnLmNwdV92aWQ7CisKKwkvKiBOb3RoaW5nIGNoYW5nZWQsIGFib3J0aW5nICovCisJaWYgKHZpZCA9PSBjdmlkKQorCQlyZXR1cm4gY291bnQ7CisKKwlkZXZfZGJnKGRldiwgIlNldHRpbmcgVkNvcmUgdG8gJWQgbVYgKDB4JTAyeClcbiIsIHZjb3JlLCB2aWQpOworCisJLyogV3JpdGUgZXZlcnkgMjUgbVYgc3RlcCB0byBpbmNyZWFzZSBzdGFiaWxpdHkgKi8KKwlpZiAoY3ZpZCA+IHZpZCkgeworCQlmb3IgKDsgY3ZpZCA+PSB2aWQ7IGN2aWQtLSkgeworICAgICAgICAJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBVFhQMV9WSUQsIGN2aWQgfCBBVFhQMV9WSURFTkEpOworCQl9CisJfQorCWVsc2UgeworCQlmb3IgKDsgY3ZpZCA8PSB2aWQ7IGN2aWQrKykgeworICAgICAgICAJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBVFhQMV9WSUQsIGN2aWQgfCBBVFhQMV9WSURFTkEpOworCQl9CisJfQorCisJZGF0YS0+dmFsaWQgPSAwOworCisJcmV0dXJuIGNvdW50OworfQorCisvKiBDUFUgY29yZSByZWZlcmVuY2Ugdm9sdGFnZQorICAgIHVuaXQ6IG1pbGxpdm9sdAorKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTyB8IFNfSVdVU1IsIGF0eHAxX3Nob3d2Y29yZSwgYXR4cDFfc3RvcmV2Y29yZSk7CisKKy8qIHN5cyBmaWxlIGZ1bmN0aW9ucyBmb3IgR1BJTzEgKi8KK3N0YXRpYyBzc2l6ZV90IGF0eHAxX3Nob3dncGlvMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHNpemU7CisJc3RydWN0IGF0eHAxX2RhdGEgKmRhdGE7CisKKwlkYXRhID0gYXR4cDFfdXBkYXRlX2RldmljZShkZXYpOworCisJc2l6ZSA9IHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBkYXRhLT5yZWcuZ3BpbzEgJiBBVFhQMV9HUElPMU1BU0spOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0eHAxX3N0b3JlZ3BpbzEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhcipidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYXR4cDFfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCWNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlkYXRhID0gYXR4cDFfdXBkYXRlX2RldmljZShkZXYpOworCisJdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KTsKKworCXZhbHVlICY9IEFUWFAxX0dQSU8xTUFTSzsKKworCWlmICh2YWx1ZSAhPSAoZGF0YS0+cmVnLmdwaW8xICYgQVRYUDFfR1BJTzFNQVNLKSkgeworCQlkZXZfaW5mbyhkZXYsICJXcml0aW5nIDB4JXggdG8gR1BJTzEuXG4iLCB2YWx1ZSk7CisKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFUWFAxX0dQSU8xLCB2YWx1ZSk7CisKKwkJZGF0YS0+dmFsaWQgPSAwOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyogR1BJTzEgZGF0YSByZWdpc3RlcgorICAgIHVuaXQ6IEZvdXIgYml0IGFzIGhleCAoZS5nLiAweDBmKQorKi8KK3N0YXRpYyBERVZJQ0VfQVRUUihncGlvMSwgU19JUlVHTyB8IFNfSVdVU1IsIGF0eHAxX3Nob3dncGlvMSwgYXR4cDFfc3RvcmVncGlvMSk7CisKKy8qIHN5cyBmaWxlIGZ1bmN0aW9ucyBmb3IgR1BJTzIgKi8KK3N0YXRpYyBzc2l6ZV90IGF0eHAxX3Nob3dncGlvMihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IHNpemU7CisJc3RydWN0IGF0eHAxX2RhdGEgKmRhdGE7CisKKwlkYXRhID0gYXR4cDFfdXBkYXRlX2RldmljZShkZXYpOworCisJc2l6ZSA9IHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBkYXRhLT5yZWcuZ3BpbzIpOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0eHAxX3N0b3JlZ3BpbzIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGF0eHAxX2RhdGEgKmRhdGE7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisKKwljbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJZGF0YSA9IGF0eHAxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxNikgJiAweGZmOworCisJaWYgKHZhbHVlICE9IGRhdGEtPnJlZy5ncGlvMikgeworCQlkZXZfaW5mbyhkZXYsICJXcml0aW5nIDB4JXggdG8gR1BJTzEuXG4iLCB2YWx1ZSk7CisKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFUWFAxX0dQSU8yLCB2YWx1ZSk7CisKKwkJZGF0YS0+dmFsaWQgPSAwOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyogR1BJTzIgZGF0YSByZWdpc3RlcgorICAgIHVuaXQ6IEVpZ2h0IGJpdCBhcyBoZXggKGUuZy4gMHhmZikKKyovCitzdGF0aWMgREVWSUNFX0FUVFIoZ3BpbzIsIFNfSVJVR08gfCBTX0lXVVNSLCBhdHhwMV9zaG93Z3BpbzIsIGF0eHAxX3N0b3JlZ3BpbzIpOworCisKK3N0YXRpYyBpbnQgYXR4cDFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsICZhdHhwMV9kZXRlY3QpOworfTsKKworc3RhdGljIGludCBhdHhwMV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKiBuZXdfY2xpZW50OworCXN0cnVjdCBhdHhwMV9kYXRhICogZGF0YTsKKwlpbnQgZXJyID0gMDsKKwl1OCB0ZW1wOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlnb3RvIGV4aXQ7CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF0eHAxX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGF0eHAxX2RhdGEpKTsKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmYXR4cDFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIERldGVjdCBBVFhQMSwgY2hlY2tpbmcgaWYgdmVuZG9yIElEIHJlZ2lzdGVycyBhcmUgYWxsIHplcm8gKi8KKwlpZiAoISgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4M2UpID09IDApICYmCisJICAgICAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4M2YpID09IDApICYmCisJICAgICAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4ZmUpID09IDApICYmCisJICAgICAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4ZmYpID09IDApICkpIHsKKworCQkvKiBObyB2ZW5kb3IgSUQsIG5vdyBjaGVja2luZyBpZiByZWdpc3RlcnMgMHgxMCwweDExIChub24tZXhpc3RlbnQpCisJCSAqIHNob3dpbmcgdGhlIHNhbWUgYXMgcmVnaXN0ZXIgMHgwMCAqLworCQl0ZW1wID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4MDApOworCisJCWlmICghKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgxMCkgPT0gdGVtcCkgJiYKKwkJCSAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIDB4MTEpID09IHRlbXApICkpCisJCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwkvKiBHZXQgVlJNICovCisJZGF0YS0+dnJtID0gaTJjX3doaWNoX3ZybSgpOworCisJaWYgKChkYXRhLT52cm0gIT0gOTApICYmIChkYXRhLT52cm0gIT0gOTEpKSB7CisJCWRldl9lcnIoJm5ld19jbGllbnQtPmRldiwgIk5vdCBzdXBwb3J0aW5nIFZSTSAlZC4lZFxuIiwKKwkJCQlkYXRhLT52cm0gLyAxMCwgZGF0YS0+dnJtICUgMTApOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlzdHJuY3B5KG5ld19jbGllbnQtPm5hbWUsICJhdHhwMSIsIEkyQ19OQU1FX1NJWkUpOworCisJZGF0YS0+dmFsaWQgPSAwOworCisJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCk7CisKKwlpZiAoZXJyKQorCXsKKwkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiQXR0YWNoIGNsaWVudCBlcnJvci5cbiIpOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2dwaW8xKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2dwaW8yKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKKworCWRldl9pbmZvKCZuZXdfY2xpZW50LT5kZXYsICJVc2luZyBWUk06ICVkLiVkXG4iLAorCQkJIGRhdGEtPnZybSAvIDEwLCBkYXRhLT52cm0gJSAxMCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfTsKKworc3RhdGljIGludCBhdHhwMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50KQoreworCWludCBlcnI7CisKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCisJaWYgKGVycikKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZGV0YWNoIGNsaWVudC5cbiIpOworCWVsc2UKKwkJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCisJcmV0dXJuIGVycjsKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0eHAxX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmF0eHAxX2RyaXZlcik7Cit9OworCitzdGF0aWMgdm9pZCBfX2V4aXQgYXR4cDFfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhdHhwMV9kcml2ZXIpOworfTsKKworbW9kdWxlX2luaXQoYXR4cDFfaW5pdCk7Cittb2R1bGVfZXhpdChhdHhwMV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2RzMTYyMS5jIGIvZHJpdmVycy9od21vbi9kczE2MjEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZHMxNjIxLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZHMxNjIxLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY2hlci5jIGIvZHJpdmVycy9od21vbi9mc2NoZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZnNjaGVyLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZnNjaGVyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2ZzY3Bvcy5jIGIvZHJpdmVycy9od21vbi9mc2Nwb3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZnNjcG9zLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZnNjcG9zLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2dsNTE4c20uYyBiL2RyaXZlcnMvaHdtb24vZ2w1MThzbS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9nbDUxOHNtLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZ2w1MThzbS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9nbDUyMHNtLmMgYi9kcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvZ2w1MjBzbS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2dsNTIwc20uYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2l0ODcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9pdDg3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNjMuYyBiL2RyaXZlcnMvaHdtb24vbG02My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTYzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG02My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc1LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG03NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtNzUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG03NS5oIGIvZHJpdmVycy9od21vbi9sbTc1LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtNzUuaApyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTc1LmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtNzcuYyBiL2RyaXZlcnMvaHdtb24vbG03Ny5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTc3LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG03Ny5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTc4LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzguYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG03OC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtNzguYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04MC5jIGIvZHJpdmVycy9od21vbi9sbTgwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtODAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTgwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtODMuYyBiL2RyaXZlcnMvaHdtb24vbG04My5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTgzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG04My5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTg1LmMgYi9kcml2ZXJzL2h3bW9uL2xtODUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG04NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtODUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbG04Ny5jIGIvZHJpdmVycy9od21vbi9sbTg3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL2xtODcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9sbTg3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9sbTkwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vbG05MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9sbTkyLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvbG05Mi5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL2xtOTIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4MTYxOS5jIGIvZHJpdmVycy9od21vbi9tYXgxNjE5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL21heDE2MTkuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9tYXgxNjE5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjODczNjAuYyBiL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy9wYzg3MzYwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcGM4NzM2MC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9zaXM1NTk1LmMgYi9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvc2lzNTU5NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3NpczU1OTUuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvc21zYzQ3YjM5Ny5jIGIvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N2IzOTcuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaTJjL2NoaXBzL3Ntc2M0N20xLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWE2ODZhLmMgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjRkNDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi92aWE2ODZhLmMKQEAgLTAsMCArMSw4NzUgQEAKKy8qCisgICAgdmlhNjg2YS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcworCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZworCisgICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKwkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKKwkJCU1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCisJCQlhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+CisgICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldworICAgIDxqLnRlaEBpbmFtZS5jb20+IGFuZCBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+LikKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBTdXBwb3J0cyB0aGUgVmlhIFZUODJDNjg2QSwgVlQ4MkM2ODZCIHNvdXRoIGJyaWRnZXMuCisgICAgUmVwb3J0cyBhbGwgYXMgYSA2ODZBLgorICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCisgICB0aGUgZGV2aWNlIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2FkZHIgPSAwOworbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCisJCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7CisKKy8qIEFkZHJlc3NlcyB0byBzY2FuLgorICAgTm90ZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgSVNBIGFkZHJlc3MgdW50aWwgd2UgaGF2ZSBpbml0aWFsaXplZAorICAgb3VyIG1vZHVsZSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworU0VOU09SU19JTlNNT0RfMSh2aWE2ODZhKTsKKworLyoKKyAgIFRoZSBWaWEgNjg2YSBzb3V0aGJyaWRnZSBoYXMgYSBMTTc4LWxpa2UgY2hpcCBpbnRlZ3JhdGVkIG9uIHRoZSBzYW1lIElDLgorICAgVGhpcyBkcml2ZXIgaXMgYSBjdXN0b21pemVkIGNvcHkgb2YgbG03OC5jCisqLworCisvKiBNYW55IFZJQTY4NkEgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLworCisvKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLworI2RlZmluZSBWSUE2ODZBX0VYVEVOVAkJMHg4MAorI2RlZmluZSBWSUE2ODZBX0JBU0VfUkVHCTB4NzAKKyNkZWZpbmUgVklBNjg2QV9FTkFCTEVfUkVHCTB4NzQKKworLyogVGhlIFZJQTY4NkEgcmVnaXN0ZXJzICovCisvKiBpbnMgbnVtYmVyZWQgMC00ICovCisjZGVmaW5lIFZJQTY4NkFfUkVHX0lOX01BWChucikJKDB4MmIgKyAoKG5yKSAqIDIpKQorI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NSU4obnIpCSgweDJjICsgKChucikgKiAyKSkKKyNkZWZpbmUgVklBNjg2QV9SRUdfSU4obnIpCSgweDIyICsgKG5yKSkKKworLyogZmFucyBudW1iZXJlZCAxLTIgKi8KKyNkZWZpbmUgVklBNjg2QV9SRUdfRkFOX01JTihucikJKDB4M2EgKyAobnIpKQorI2RlZmluZSBWSUE2ODZBX1JFR19GQU4obnIpCSgweDI4ICsgKG5yKSkKKworLyogdGVtcHMgbnVtYmVyZWQgMS0zICovCitzdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUFtdCT0geyAweDIwLCAweDIxLCAweDFmIH07CitzdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUF9PVkVSW10JPSB7IDB4MzksIDB4M2QsIDB4MWQgfTsKK3N0YXRpYyBjb25zdCB1OCBWSUE2ODZBX1JFR19URU1QX0hZU1RbXQk9IHsgMHgzYSwgMHgzZSwgMHgxZSB9OworLyogYml0cyA3LTYgKi8KKyNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIKKy8qIDIgPSBiaXRzIDUtNCwgMyA9IGJpdHMgNy02ICovCisjZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMJMHg0OQorCisjZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMQkweDQxCisjZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMgkweDQyCisjZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJVgkweDQ3CisjZGVmaW5lIFZJQTY4NkFfUkVHX0NPTkZJRwkweDQwCisvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHNldHMgdGVtcCBpbnRlcnJ1cHQgbW9kZSAoYml0cyAxLTAgZm9yIHRlbXAxLAorIDMtMiBmb3IgdGVtcDIsIDUtNCBmb3IgdGVtcDMpLiAgTW9kZXMgYXJlOgorICAgIDAwIGludGVycnVwdCBzdGF5cyBhcyBsb25nIGFzIHZhbHVlIGlzIG91dC1vZi1yYW5nZQorICAgIDAxIGludGVycnVwdCBpcyBjbGVhcmVkIG9uY2UgcmVnaXN0ZXIgaXMgcmVhZCAoZGVmYXVsdCkKKyAgICAxMCBjb21wYXJhdG9yIG1vZGUtIGxpa2UgMDAsIGJ1dCBpZ25vcmVzIGh5c3RlcmVzaXMKKyAgICAxMSBzYW1lIGFzIDAwICovCisjZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTU9ERQkJMHg0YgorLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCisjZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX01BU0sJCTB4M0YKKyNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUwkweDAwCisKKy8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRworICAgdmFyaWFudHMuCisKKyoqKioqKioqKiBWT0xUQUdFIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKgorIEZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldyk6Cisgdm9sdGFnZWZhY3RvclswXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vIFZjY3AKKyB2b2x0YWdlZmFjdG9yWzFdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gKzIuNVYKKyB2b2x0YWdlZmFjdG9yWzJdPTEuNjcvMjYyODsgKDI2MjgvMS42Nz0xNTczLjcpICAgLy8gKzMuM1YKKyB2b2x0YWdlZmFjdG9yWzNdPTIuNi8yNjI4OyAgKDI2MjgvMi42MD0xMDEwLjgpICAgLy8gKzVWCisgdm9sdGFnZWZhY3Rvcls0XT02LjMvMjYyODsgICgyNjI4LzYuMzA9NDE3LjE0KSAgIC8vICsxMlYKKyBpbltpXT0oZGF0YVtpKzJdKjI1LjArMTMzKSp2b2x0YWdlZmFjdG9yW2ldOworIFRoYXQgaXM6Cisgdm9sdHMgPSAoMjUqcmVnVmFsKzEzMykqZmFjdG9yCisgcmVnVmFsID0gKHZvbHRzL2ZhY3Rvci0xMzMpLzI1CisgKFRoZXNlIGNvbnZlcnNpb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3CisgPGoudGVoQGluYW1lLmNvbT4pICovCitzdGF0aWMgaW5saW5lIHU4IElOX1RPX1JFRyhsb25nIHZhbCwgaW50IGluTnVtKQoreworCS8qIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LCB3ZSBtdWx0aXBseSBjb25zdGFudHMgYnkgMTAgKDEwMCBmb3IgKzEyVikuCisJICAgUm91bmRpbmcgaXMgZG9uZSAoMTIwNTAwIGlzIGFjdHVhbGx5IDEzMzAwMCAtIDEyNTAwKS4KKwkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQorCSAgIGJ5IGFuIGFkZGl0aW9uYWwgMTAwMDAgKDEwMDAwMCBmb3IgKzEyVik6IDEwMDAgZm9yIHZhbCBhbmQgMTAgKDEwMCkKKwkgICBmb3IgdGhlIGNvbnN0YW50cy4gKi8KKwlpZiAoaW5OdW0gPD0gMSkKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDIxMDI0IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7CisJZWxzZSBpZiAoaW5OdW0gPT0gMikKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDE1NzM3IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7CisJZWxzZSBpZiAoaW5OdW0gPT0gMykKKwkJcmV0dXJuICh1OCkKKwkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDEwMTA4IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7CisJZWxzZQorCQlyZXR1cm4gKHU4KQorCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogNDE3MTQgLSAxMjA1MDAwMCkgLyAyNTAwMDAwLCAwLCAyNTUpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgSU5fRlJPTV9SRUcodTggdmFsLCBpbnQgaW5OdW0pCit7CisJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KKwkgICBXZSBhbHNvIG11bHRpcGx5IHRoZW0gYnkgMTAwMCBiZWNhdXNlIHdlIHdhbnQgMC4wMDFWL2JpdCBmb3IgdGhlCisJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLworCWlmIChpbk51bSA8PSAxKQorCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDIxMDI0IC8gMikgLyAyMTAyNCk7CisJZWxzZSBpZiAoaW5OdW0gPT0gMikKKwkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAxNTczNyAvIDIpIC8gMTU3MzcpOworCWVsc2UgaWYgKGluTnVtID09IDMpCisJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKKwllbHNlCisJCXJldHVybiAobG9uZykgKCgyNTAwMDAwICogdmFsICsgMTMzMDAwMDAgKyA0MTcxNCAvIDIpIC8gNDE3MTQpOworfQorCisvKioqKioqKioqIEZBTiBSUE0gQ09OVkVSU0lPTlMgKioqKioqKiovCisvKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KKyBCdXQgdGhpcyBjaGlwIHNhdHVyYXRlcyBiYWNrIGF0IDAsIG5vdCBhdCAyNTUgbGlrZSBhbGwgdGhlIG90aGVyIGNoaXBzLgorIFNvLCAwIG1lYW5zIDAgUlBNICovCitzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCit7CisJaWYgKHJwbSA9PSAwKQorCQlyZXR1cm4gMDsKKwlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7CisJcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTUpOworfQorCisjZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTA/MDoodmFsKT09MjU1PzA6MTM1MDAwMC8oKHZhbCkqKGRpdikpKQorCisvKioqKioqKiogVEVNUCBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioqLworLyogbGluZWFyIGZpdHMgZnJvbSBIV01vbi5jcHAgKENvcHlyaWdodCAxOTk4LTIwMDAgSm9uYXRoYW4gVGVoIFNvb24gWWV3KQorICAgICAgaWYodGVtcDwxNjkpCisJICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKKyAgICAgIGVsc2UgaWYodGVtcD49MTY5ICYmIHRlbXA8PTIwMikKKwkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNTgyLTU4LjE2OworICAgICAgZWxzZQorCSAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOworCisgQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4KKyBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+KSBhIGJpdCBiZXR0ZXIuICBJdCBhbHNvIGdpdmUgbW9yZSByZWFzb25hYmxlCisgbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCisgSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CisgdGVtcCA9IDEuNjI1MDkzZS0xMCp2YWxeNSAtIDEuMDAxNjMyZS0wNyp2YWxeNCArIDIuNDU3NjUzZS0wNSp2YWxeMyAtCisJMi45Njc2MTllLTAzKnZhbF4yICsgMi4xNzUxNDRlLTAxKnZhbCAtIDcuMDkwMDY3ZSswLgorCisgKDIwMDAtMTAtMjUtIFJGRDogdGhhbmtzIHRvIFV3ZSBBbmRlcnNlbiA8dWFuZGVyc2VuQG1heWFoLmNvbT4gZm9yCisgZmluZGluZyBteSB0eXBvcyBpbiB0aGlzIGZvcm11bGEhKQorCisgQWxhcywgbm9uZSBvZiB0aGUgZWxlZ2FudCBmdW5jdGlvbi1maXQgc29sdXRpb25zIHdpbGwgd29yayBiZWNhdXNlIHdlCisgYXJlbid0IGFsbG93ZWQgdG8gdXNlIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwgYW5kIGRvaW5nIGl0IHdpdGgKKyBpbnRlZ2VycyBkb2Vzbid0IHByb3ZpZGUgZW5vdWdoIHByZWNpc2lvbi4gIFNvIHdlJ2xsIGRvIGJvcmluZyBvbGQKKyBsb29rLXVwIHRhYmxlIHN0dWZmLiAgVGhlIHVub2ZmaWNpYWwgZGF0YSAoc2VlIGJlbG93KSBoYXZlIGVmZmVjdGl2ZWx5CisgNy1iaXQgcmVzb2x1dGlvbiAodGhleSBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBkZWdyZWUpLiAgSSdtIGFzc3VtaW5nCisgdGhhdCB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gb2YgdGhlIGRldmljZSBpcyBtb25vdG9uaWMgYW5kIHNtb290aCwgc28gYQorIHNtb290aCBmdW5jdGlvbiBmaXQgdG8gdGhlIGRhdGEgd2lsbCBhbGxvdyB1cyB0byBnZXQgYmV0dGVyIHByZWNpc2lvbi4KKyBJIHVzZWQgdGhlIDV0aC1vcmRlciBwb2x5IGZpdCBkZXNjcmliZWQgYWJvdmUgYW5kIHNvbHZlZCBmb3IKKyBWSUEgcmVnaXN0ZXIgdmFsdWVzIDAtMjU1LiAgSSAqMTAgYmVmb3JlIHJvdW5kaW5nLCBzbyB3ZSBnZXQgdGVudGgtZGVncmVlCisgcHJlY2lzaW9uLiAgKEkgY291bGQgaGF2ZSBkb25lIGFsbCAxMDI0IHZhbHVlcyBmb3Igb3VyIDEwLWJpdCByZWFkaW5ncywKKyBidXQgdGhlIGZ1bmN0aW9uIGlzIHZlcnkgbGluZWFyIGluIHRoZSB1c2VmdWwgcmFuZ2UgKDAtODAgZGVnIEMpLCBzbworIHdlJ2xsIGp1c3QgdXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciAxMC1iaXQgcmVhZGluZ3MuKSAgU28sIHRlbXBMVVQKKyBpcyB0aGUgdGVtcCBhdCB2aWEgcmVnaXN0ZXIgdmFsdWVzIDAtMjU1OiAqLworc3RhdGljIGNvbnN0IGxvbmcgdGVtcExVVFtdID0KK3sgLTcwOSwgLTY4OCwgLTY2NywgLTY0NiwgLTYyNywgLTYwNywgLTU4OSwgLTU3MCwgLTU1MywgLTUzNiwgLTUxOSwKKwktNTAzLCAtNDg3LCAtNDcxLCAtNDU2LCAtNDQyLCAtNDI4LCAtNDE0LCAtNDAwLCAtMzg3LCAtMzc1LAorCS0zNjIsIC0zNTAsIC0zMzksIC0zMjcsIC0zMTYsIC0zMDUsIC0yOTUsIC0yODUsIC0yNzUsIC0yNjUsCisJLTI1NSwgLTI0NiwgLTIzNywgLTIyOSwgLTIyMCwgLTIxMiwgLTIwNCwgLTE5NiwgLTE4OCwgLTE4MCwKKwktMTczLCAtMTY2LCAtMTU5LCAtMTUyLCAtMTQ1LCAtMTM5LCAtMTMyLCAtMTI2LCAtMTIwLCAtMTE0LAorCS0xMDgsIC0xMDIsIC05NiwgLTkxLCAtODUsIC04MCwgLTc0LCAtNjksIC02NCwgLTU5LCAtNTQsIC00OSwKKwktNDQsIC0zOSwgLTM0LCAtMjksIC0yNSwgLTIwLCAtMTUsIC0xMSwgLTYsIC0yLCAzLCA3LCAxMiwgMTYsCisJMjAsIDI1LCAyOSwgMzMsIDM3LCA0MiwgNDYsIDUwLCA1NCwgNTksIDYzLCA2NywgNzEsIDc1LCA3OSwgODQsCisJODgsIDkyLCA5NiwgMTAwLCAxMDQsIDEwOSwgMTEzLCAxMTcsIDEyMSwgMTI1LCAxMzAsIDEzNCwgMTM4LAorCTE0MiwgMTQ2LCAxNTEsIDE1NSwgMTU5LCAxNjMsIDE2OCwgMTcyLCAxNzYsIDE4MSwgMTg1LCAxODksCisJMTkzLCAxOTgsIDIwMiwgMjA2LCAyMTEsIDIxNSwgMjE5LCAyMjQsIDIyOCwgMjMyLCAyMzcsIDI0MSwKKwkyNDUsIDI1MCwgMjU0LCAyNTksIDI2MywgMjY3LCAyNzIsIDI3NiwgMjgxLCAyODUsIDI5MCwgMjk0LAorCTI5OSwgMzAzLCAzMDcsIDMxMiwgMzE2LCAzMjEsIDMyNSwgMzMwLCAzMzQsIDMzOSwgMzQ0LCAzNDgsCisJMzUzLCAzNTcsIDM2MiwgMzY2LCAzNzEsIDM3NiwgMzgwLCAzODUsIDM5MCwgMzk1LCAzOTksIDQwNCwKKwk0MDksIDQxNCwgNDE5LCA0MjMsIDQyOCwgNDMzLCA0MzgsIDQ0MywgNDQ5LCA0NTQsIDQ1OSwgNDY0LAorCTQ2OSwgNDc1LCA0ODAsIDQ4NiwgNDkxLCA0OTcsIDUwMiwgNTA4LCA1MTQsIDUyMCwgNTI2LCA1MzIsCisJNTM4LCA1NDQsIDU1MSwgNTU3LCA1NjQsIDU3MSwgNTc4LCA1ODQsIDU5MiwgNTk5LCA2MDYsIDYxNCwKKwk2MjEsIDYyOSwgNjM3LCA2NDUsIDY1NCwgNjYyLCA2NzEsIDY4MCwgNjg5LCA2OTgsIDcwOCwgNzE4LAorCTcyOCwgNzM4LCA3NDksIDc1OSwgNzcwLCA3ODIsIDc5MywgODA1LCA4MTgsIDgzMCwgODQzLCA4NTYsCisJODcwLCA4ODMsIDg5OCwgOTEyLCA5MjcsIDk0MywgOTU4LCA5NzUsIDk5MSwgMTAwOCwgMTAyNiwgMTA0NCwKKwkxMDYyLCAxMDgxLCAxMTAxLCAxMTIxLCAxMTQxLCAxMTYyLCAxMTg0LCAxMjA2LCAxMjI5LCAxMjUyLAorCTEyNzYsIDEzMDEsIDEzMjYsIDEzNTIsIDEzNzgsIDE0MDYsIDE0MzQsIDE0NjIKK307CisKKy8qIHRoZSBvcmlnaW5hbCBMVVQgdmFsdWVzIGZyb20gQWxleCB2YW4gS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPgorICAgKGZvciB2aWEgcmVnaXN0ZXIgdmFsdWVzIDEyLTI0MCk6Cit7LTUwLC00OSwtNDcsLTQ1LC00MywtNDEsLTM5LC0zOCwtMzcsLTM1LC0zNCwtMzMsLTMyLC0zMSwKKy0zMCwtMjksLTI4LC0yNywtMjYsLTI1LC0yNCwtMjQsLTIzLC0yMiwtMjEsLTIwLC0yMCwtMTksLTE4LC0xNywtMTcsLTE2LC0xNSwKKy0xNSwtMTQsLTE0LC0xMywtMTIsLTEyLC0xMSwtMTEsLTEwLC05LC05LC04LC04LC03LC03LC02LC02LC01LC01LC00LC00LC0zLAorLTMsLTIsLTIsLTEsLTEsMCwwLDEsMSwxLDMsMywzLDQsNCw0LDUsNSw1LDYsNiw3LDcsOCw4LDksOSw5LDEwLDEwLDExLDExLDEyLAorMTIsMTIsMTMsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjEsMjIsMjIsCisyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNiwyNywyNywyNywyOCwyOCwyOSwyOSwzMCwzMCwzMCwzMSwzMSwzMiwzMiwzMywKKzMzLDM0LDM0LDM1LDM1LDM1LDM2LDM2LDM3LDM3LDM4LDM4LDM5LDM5LDQwLDQwLDQxLDQxLDQyLDQyLDQzLDQzLDQ0LDQ0LDQ1LAorNDUsNDYsNDYsNDcsNDgsNDgsNDksNDksNTAsNTEsNTEsNTIsNTIsNTMsNTMsNTQsNTUsNTUsNTYsNTcsNTcsNTgsNTksNTksNjAsCis2MSw2Miw2Miw2Myw2NCw2NSw2Niw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Myw4NCwKKzg1LDg2LDg4LDg5LDkxLDkyLDk0LDk2LDk3LDk5LDEwMSwxMDMsMTA1LDEwNywxMDksMTEwfTsKKworCisgSGVyZSdzIHRoZSByZXZlcnNlIExVVC4gIEkgZ290IGl0IGJ5IGRvaW5nIGEgNi10aCBvcmRlciBwb2x5IGZpdCAobmVlZGVkCisgYW4gZXh0cmEgdGVybSBmb3IgYSBnb29kIGZpdCB0byB0aGVzZSBpbnZlcnNlIGRhdGEhKSBhbmQgdGhlbgorIHNvbHZpbmcgZm9yIGVhY2ggdGVtcCB2YWx1ZSBmcm9tIC01MCB0byAxMTAgKHRoZSB1c2VhYmxlIHJhbmdlIGZvcgorIHRoaXMgY2hpcCkuICBIZXJlJ3MgdGhlIGZpdDoKKyB2aWFSZWdWYWwgPSAtMS4xNjAzNzBlLTEwKnZhbF42ICszLjE5MzY5M2UtMDgqdmFsXjUgLSAxLjQ2NDQ0N2UtMDYqdmFsXjQKKyAtIDIuNTI1NDUzZS0wNCp2YWxeMyArIDEuNDI0NTkzZS0wMip2YWxeMiArIDIuMTQ4OTQxZSswMCp2YWwgKzcuMjc1ODA4ZSswMSkKKyBOb3RlIHRoYXQgbj0xNjE6ICovCitzdGF0aWMgY29uc3QgdTggdmlhTFVUW10gPQoreyAxMiwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxOCwgMTgsIDE5LCAyMCwgMjAsIDIxLCAyMiwgMjMsCisJMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNSwgMzYsIDM3LCAzOSwgNDAsCisJNDEsIDQzLCA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MCwgNjIsIDY0LCA2NiwKKwk2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MiwgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKKwkxMDMsIDEwNSwgMTA3LCAxMTAsIDExMiwgMTE1LCAxMTcsIDExOSwgMTIyLCAxMjQsIDEyNiwgMTI5LAorCTEzMSwgMTM0LCAxMzYsIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ3LCAxNTAsIDE1MiwgMTU0LCAxNTYsCisJMTU4LCAxNjAsIDE2MiwgMTY0LCAxNjYsIDE2OCwgMTcwLCAxNzIsIDE3NCwgMTc2LCAxNzgsIDE4MCwKKwkxODIsIDE4MywgMTg1LCAxODcsIDE4OCwgMTkwLCAxOTIsIDE5MywgMTk1LCAxOTYsIDE5OCwgMTk5LAorCTIwMCwgMjAyLCAyMDMsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsCisJMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwKKwkyMjUsIDIyNiwgMjI2LCAyMjcsIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMiwgMjMyLAorCTIzMywgMjMzLCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzksCisJMjM5LCAyNDAKK307CisKKy8qIENvbnZlcnRpbmcgdGVtcHMgdG8gKDgtYml0KSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycworICAgTm8gaW50ZXJwb2xhdGlvbiBoZXJlLgorICAgVGhlICs1MCBpcyBiZWNhdXNlIHRoZSB0ZW1wcyBzdGFydCBhdCAtNTAgKi8KK3N0YXRpYyBpbmxpbmUgdTggVEVNUF9UT19SRUcobG9uZyB2YWwpCit7CisJcmV0dXJuIHZpYUxVVFt2YWwgPD0gLTUwMDAwID8gMCA6IHZhbCA+PSAxMTAwMDAgPyAxNjAgOgorCQkgICAgICAodmFsIDwgMCA/IHZhbCAtIDUwMCA6IHZhbCArIDUwMCkgLyAxMDAwICsgNTBdOworfQorCisvKiBmb3IgOC1iaXQgdGVtcGVyYXR1cmUgaHlzdCBhbmQgb3ZlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpICh0ZW1wTFVUWyh2YWwpXSAqIDEwMCkKKworLyogZm9yIDEwLWJpdCB0ZW1wZXJhdHVyZSByZWFkaW5ncyAqLworc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcxMCh1MTYgdmFsKQoreworCXUxNiBlaWdodEJpdHMgPSB2YWwgPj4gMjsKKwl1MTYgdHdvQml0cyA9IHZhbCAmIDM7CisKKwkvKiBubyBpbnRlcnBvbGF0aW9uIGZvciB0aGVzZSAqLworCWlmICh0d29CaXRzID09IDAgfHwgZWlnaHRCaXRzID09IDI1NSkKKwkJcmV0dXJuIFRFTVBfRlJPTV9SRUcoZWlnaHRCaXRzKTsKKworCS8qIGRvIHNvbWUgbGluZWFyIGludGVycG9sYXRpb24gKi8KKwlyZXR1cm4gKHRlbXBMVVRbZWlnaHRCaXRzXSAqICg0IC0gdHdvQml0cykgKworCQl0ZW1wTFVUW2VpZ2h0Qml0cyArIDFdICogdHdvQml0cykgKiAyNTsKK30KKworI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKKyNkZWZpbmUgRElWX1RPX1JFRyh2YWwpICgodmFsKT09OD8zOih2YWwpPT00PzI6KHZhbCk9PTE/MDoxKQorCisvKiBGb3IgdGhlIFZJQTY4NkEsIHdlIG5lZWQgdG8ga2VlcCBzb21lIGRhdGEgaW4gbWVtb3J5LgorICAgVGhlIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldworICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLworc3RydWN0IHZpYTY4NmFfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OCBpbls1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggZmFuX21pblsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KKwl1OCB0ZW1wX292ZXJbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggdGVtcF9oeXN0WzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLworCXUxNiBhbGFybXM7CQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqc19icmlkZ2U7CS8qIHBvaW50ZXIgdG8gdGhlIChvbmx5KSB2aWE2ODZhICovCisKK3N0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOworc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCk7CitzdGF0aWMgaW50IHZpYTY4NmFfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIGlubGluZSBpbnQgdmlhNjg2YV9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKK3sKKwlyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCisJCQkJICAgICAgIHU4IHZhbHVlKQoreworCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCisKKy8qIDcgdm9sdGFnZSBzZW5zb3JzICovCitzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0sIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bbnJdLCBucikpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsLCBucik7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01JTihuciksCisJCQlkYXRhLT5pbl9taW5bbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCwgbnIpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NQVgobnIpLAorCQkJZGF0YS0+aW5fbWF4W25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisjZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNob3dfaW4oZGV2LCBidWYsIG9mZnNldCk7CQkJXAorfQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKKwlzaG93X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJXAorCXJldHVybiBzaG93X2luX21pbihkZXYsIGJ1Ziwgb2Zmc2V0KTsJCVwKK30JCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCisJc2hvd19pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2hvd19pbl9tYXgoZGV2LCBidWYsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2luX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBzZXRfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHNldF9pbl9tYXgoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19pbiMjb2Zmc2V0LCBOVUxMKTtcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAlcCisJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCitzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsIAlcCisJCXNob3dfaW4jI29mZnNldCMjX21heCwgc2V0X2luIyNvZmZzZXQjI19tYXgpOworCitzaG93X2luX29mZnNldCgwKTsKK3Nob3dfaW5fb2Zmc2V0KDEpOworc2hvd19pbl9vZmZzZXQoMik7CitzaG93X2luX29mZnNldCgzKTsKK3Nob3dfaW5fb2Zmc2V0KDQpOworCisvKiAzIHRlbXBlcmF0dXJlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHMTAoZGF0YS0+dGVtcFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfb3Zlcltucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9vdmVyW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfT1ZFUltucl0sCisJCQkgICAgZGF0YS0+dGVtcF9vdmVyW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgY291bnQsIGludCBucikgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfaHlzdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOworCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0hZU1RbbnJdLAorCQkJICAgIGRhdGEtPnRlbXBfaHlzdFtucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorI2RlZmluZSBzaG93X3RlbXBfb2Zmc2V0KG9mZnNldCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X3RlbXAoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9vdmVyKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK3Nob3dfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfdGVtcF9oeXN0KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19vdmVyIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9vdmVyKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzZXRfdGVtcF9oeXN0KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfIyNvZmZzZXQsIE5VTEwpO1wKK3N0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKKwkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3Zlciwgc2V0X3RlbXBfIyNvZmZzZXQjI19vdmVyKTsJXAorc3RhdGljIERFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCisJCXNob3dfdGVtcF8jI29mZnNldCMjX2h5c3QsIHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCk7CisKK3Nob3dfdGVtcF9vZmZzZXQoMSk7CitzaG93X3RlbXBfb2Zmc2V0KDIpOworc2hvd190ZW1wX29mZnNldCgzKTsKKworLyogMiBGYW5zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKKwkJCQlESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSApOworfQorc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCUZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKK30KK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CisJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pICk7Cit9CitzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOX01JTihucisxKSwgZGF0YS0+ZmFuX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50IG9sZDsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlvbGQgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOworCWRhdGEtPmZhbl9kaXZbbnJdID0gRElWX1RPX1JFRyh2YWwpOworCW9sZCA9IChvbGQgJiAweDBmKSB8IChkYXRhLT5mYW5fZGl2WzFdIDw8IDYpIHwgKGRhdGEtPmZhbl9kaXZbMF0gPDwgNCk7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJViwgb2xkKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2Zhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX21pbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNob3dfZmFuX2RpdihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJXAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIHNldF9mYW5fbWluKGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCit9CQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQlcCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAorewkJCQkJCQkJCVwKKwlyZXR1cm4gc2V0X2Zhbl9kaXYoZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKK30JCQkJCQkJCQlcCitzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X2Zhbl8jI29mZnNldCMjX21pbiwgc2V0X2Zhbl8jI29mZnNldCMjX21pbik7CVwKK3N0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAorCQlzaG93X2Zhbl8jI29mZnNldCMjX2Rpdiwgc2V0X2Zhbl8jI29mZnNldCMjX2Rpdik7CisKK3Nob3dfZmFuX29mZnNldCgxKTsKK3Nob3dfZmFuX29mZnNldCgyKTsKKworLyogQWxhcm1zICovCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIHsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7CisKKy8qIFRoZSBkcml2ZXIuIEkgY2hvb3NlIHRvIHVzZSB0eXBlIGkyY19kcml2ZXIsIGFzIGF0IGlzIGlkZW50aWNhbCB0byBib3RoCisgICBzbWJ1c19kcml2ZXIgYW5kIGlzYV9kcml2ZXIsIGFuZCBjbGllbnRzIGNvdWxkIGJlIG9mIGVpdGhlciBraW5kICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2aWE2ODZhIiwKKwkuaWQJCT0gSTJDX0RSSVZFUklEX1ZJQTY4NkEsCisJLmZsYWdzCQk9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyCT0gdmlhNjg2YV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAk9IHZpYTY4NmFfZGV0YWNoX2NsaWVudCwKK307CisKKworLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIGlzIGxvYWRlZCAqLworc3RhdGljIGludCB2aWE2ODZhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIShhZGFwdGVyLT5jbGFzcyAmIEkyQ19DTEFTU19IV01PTikpCisJCXJldHVybiAwOworCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHZpYTY4NmFfZGV0ZWN0KTsKK30KKworc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWNvbnN0IGNoYXIgY2xpZW50X25hbWVbXSA9ICJ2aWE2ODZhIjsKKwl1MTYgdmFsOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBwcm9iaW5nIHRoZSBJU0EgYnVzISEgICovCisJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+ZGV2LAorCQkidmlhNjg2YV9kZXRlY3QgY2FsbGVkIGZvciBhbiBJMkMgYnVzIGFkYXB0ZXI/IT9cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCisJaWYgKGZvcmNlX2FkZHIpCisJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgMHhGRjAwOworCisJaWYgKGZvcmNlX2FkZHIpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgImZvcmNpbmcgSVNBIGFkZHJlc3MgMHglMDRYXG4iLAorCQkJIGFkZHJlc3MpOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfQkFTRV9SRUcsIGFkZHJlc3MpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KKwkgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywgJnZhbCkpCisJCXJldHVybiAtRU5PREVWOworCWlmICghKHZhbCAmIDB4MDAwMSkpIHsKKwkJZGV2X3dhcm4oJmFkYXB0ZXItPmRldiwgImVuYWJsaW5nIHNlbnNvcnNcbiIpOworCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfRU5BQkxFX1JFRywKKwkJCQkJICB2YWwgfCAweDAwMDEpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogUmVzZXJ2ZSB0aGUgSVNBIHJlZ2lvbiAqLworCWlmICghcmVxdWVzdF9yZWdpb24oYWRkcmVzcywgVklBNjg2QV9FWFRFTlQsIHZpYTY4NmFfZHJpdmVyLm5hbWUpKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgInJlZ2lvbiAweCV4IGFscmVhZHkgaW4gdXNlIVxuIiwKKwkJCWFkZHJlc3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSksIEdGUF9LRVJORUwpKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIEVSUk9SMDsKKwl9CisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSk7CisKKwluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEobmV3X2NsaWVudCwgZGF0YSk7CisJbmV3X2NsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJbmV3X2NsaWVudC0+ZHJpdmVyID0gJnZpYTY4NmFfZHJpdmVyOworCW5ld19jbGllbnQtPmZsYWdzID0gMDsKKworCS8qIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzIGFuZCBwdXQgaW50byB0aGUgZ2xvYmFsIGxpc3QgKi8KKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIGNsaWVudF9uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCWRhdGEtPnZhbGlkID0gMDsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQorCQlnb3RvIEVSUk9SMzsKKworCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLworCXZpYTY4NmFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luNF9taW4pOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXgpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAxX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAyX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heF9oeXN0KTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjFfaW5wdXQpOworCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9pbnB1dCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX21pbik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOworCisJcmV0dXJuIDA7CisKK0VSUk9SMzoKKwlrZnJlZShkYXRhKTsKK0VSUk9SMDoKKwlyZWxlYXNlX3JlZ2lvbihhZGRyZXNzLCBWSUE2ODZBX0VYVEVOVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWxlYXNlX3JlZ2lvbihjbGllbnQtPmFkZHIsIFZJQTY4NkFfRVhURU5UKTsKKwlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBWSUE2ODZBLiBTZXQgbGltaXRzLCBldGMuICovCitzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdTggcmVnOworCisJLyogU3RhcnQgbW9uaXRvcmluZyAqLworCXJlZyA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRyk7CisJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0NPTkZJRywgKHJlZ3wweDAxKSYweDdGKTsKKworCS8qIENvbmZpZ3VyZSB0ZW1wIGludGVycnVwdCBtb2RlIGZvciBjb250aW51b3VzLWludGVycnVwdCBvcGVyYXRpb24gKi8KKwl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9NT0RFLAorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSkgJgorCQkJICAgICEoVklBNjg2QV9URU1QX01PREVfTUFTSyB8IFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMpKTsKK30KKworc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyBIWiArIEhaIC8gMikKKwkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0lOX01JTgorCQkJCQkJCSAgICAgKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKGkpKTsKKwkJfQorCQlmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykgeworCQkJZGF0YS0+ZmFuW2kgLSAxXSA9CisJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOKGkpKTsKKwkJCWRhdGEtPmZhbl9taW5baSAtIDFdID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJCSAgICAgVklBNjg2QV9SRUdfRkFOX01JTihpKSk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8PSAyOyBpKyspIHsKKwkJCWRhdGEtPnRlbXBbaV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkJIFZJQTY4NkFfUkVHX1RFTVBbaV0pIDw8IDI7CisJCQlkYXRhLT50ZW1wX292ZXJbaV0gPQorCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCSAgICAgICBWSUE2ODZBX1JFR19URU1QX09WRVJbaV0pOworCQkJZGF0YS0+dGVtcF9oeXN0W2ldID0KKwkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9IWVNUW2ldKTsKKwkJfQorCQkvKiBhZGQgaW4gbG93ZXIgMiBiaXRzCisJCSAgIHRlbXAxIHVzZXMgYml0cyA3LTYgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cxCisJCSAgIHRlbXAyIHVzZXMgYml0cyA1LTQgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cyMworCQkgICB0ZW1wMyB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKKwkJICovCisJCWRhdGEtPnRlbXBbMF0gfD0gKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCQkgICAgIFZJQTY4NkFfUkVHX1RFTVBfTE9XMSkKKwkJCQkgICYgMHhjMCkgPj4gNjsKKwkJZGF0YS0+dGVtcFsxXSB8PQorCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKKwkJICAgICAweDMwKSA+PiA0OworCQlkYXRhLT50ZW1wWzJdIHw9CisJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgorCQkgICAgIDB4YzApID4+IDY7CisKKwkJaSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJVik7CisJCWRhdGEtPmZhbl9kaXZbMF0gPSAoaSA+PiA0KSAmIDB4MDM7CisJCWRhdGEtPmZhbl9kaXZbMV0gPSBpID4+IDY7CisJCWRhdGEtPmFsYXJtcyA9CisJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgICBWSUE2ODZBX1JFR19BTEFSTTEpIHwKKwkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19BTEFSTTIpIDw8IDgpOworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdmlhNjg2YV9wY2lfaWRzW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNCkgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB2aWE2ODZhX3BjaV9pZHMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWE2ODZhX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJdTE2IHZhbDsKKwlpbnQgYWRkciA9IDA7CisKKwlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CisJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCisJCXJldHVybiAtRU5PREVWOworCisJYWRkciA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKKwlpZiAoYWRkciA9PSAwICYmIGZvcmNlX2FkZHIgPT0gMCkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImJhc2UgYWRkcmVzcyBub3Qgc2V0IC0gdXBncmFkZSBCSU9TICIKKwkJCSJvciB1c2UgZm9yY2VfYWRkcj0weGFkZHJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGZvcmNlX2FkZHIpCisJCWFkZHIgPSBmb3JjZV9hZGRyOwkvKiBzbyBkZXRlY3Qgd2lsbCBnZXQgY2FsbGVkICovCisKKwlpZiAoIWFkZHIpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJObyBWaWEgNjg2QSBzZW5zb3JzIGZvdW5kLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlub3JtYWxfaXNhWzBdID0gYWRkcjsKKworCXNfYnJpZGdlID0gcGNpX2Rldl9nZXQoZGV2KTsKKwlpZiAoaTJjX2FkZF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKSkgeworCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CisJCXNfYnJpZGdlID0gTlVMTDsKKwl9CisKKwkvKiBBbHdheXMgcmV0dXJuIGZhaWx1cmUgaGVyZS4gIFRoaXMgaXMgdG8gYWxsb3cgb3RoZXIgZHJpdmVycyB0byBiaW5kCisJICogdG8gdGhpcyBwY2kgZGV2aWNlLiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlCisJICogcGNpIGRldmljZSwgd2Ugb25seSB3YW50ZWQgdG8gcmVhZCBhcyBmZXcgcmVnaXN0ZXIgdmFsdWVzIGZyb20gaXQuCisJICovCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWE2ODZhX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInZpYTY4NmEiLAorCS5pZF90YWJsZQk9IHZpYTY4NmFfcGNpX2lkcywKKwkucHJvYmUJCT0gdmlhNjg2YV9wY2lfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzbV92aWE2ODZhX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNtX3ZpYTY4NmFfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKKwlpZiAoc19icmlkZ2UgIT0gTlVMTCkgeworCQlpMmNfZGVsX2RyaXZlcigmdmlhNjg2YV9kcml2ZXIpOworCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CisJCXNfYnJpZGdlID0gTlVMTDsKKwl9Cit9CisKK01PRFVMRV9BVVRIT1IoIkt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwgIgorCSAgICAgICJNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+ICIKKwkgICAgICAiYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgNjg2QSBTZW5zb3IgZGV2aWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtX3ZpYTY4NmFfaW5pdCk7Cittb2R1bGVfZXhpdChzbV92aWE2ODZhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdzgzNjI3ZWhmLmMgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy93ODM2MjdlaGYuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdzgzNjI3aGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvdzgzNjI3aGYuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi93ODM2MjdoZi5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy93ODM3ODFkLmMgYi9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9pMmMvY2hpcHMvdzgzNzgxZC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdzgzbDc4NXRzLmMgYi9kcml2ZXJzL2h3bW9uL3c4M2w3ODV0cy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2kyYy9jaGlwcy93ODNsNzg1dHMuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi93ODNsNzg1dHMuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28taXRlLmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuYwppbmRleCA2OGU5ZTY4Li5lNmNhZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1pdGUuYwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCWdvdG8gYmFpbG91dDsKIAl9CiAJc2RhbG8oYWRhcCk7Ci0JcHJpbnRrKCJ0ZXN0X2J1czoxIHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKKwlwcmludGsoInRlc3RfYnVzOjEgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAogCSAgICAgICBnZXRzZGEoYWRhcCkpOwogCWlmICggMCAhPSBnZXRzZGEoYWRhcCkgKSB7CiAJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSBzdHVjayBoaWdoIVxuIixuYW1lKTsKQEAgLTIyMSw3ICsyMjEsNyBAQAogCQlnb3RvIGJhaWxvdXQ7CiAJfQkJCiAJc2RhaGkoYWRhcCk7Ci0JcHJpbnRrKCJ0ZXN0X2J1czoyIHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKKwlwcmludGsoInRlc3RfYnVzOjIgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAogCSAgICAgICBnZXRzZGEoYWRhcCkpOwogCWlmICggMCA9PSBnZXRzZGEoYWRhcCkgKSB7CiAJCXByaW50aygidGVzdF9idXM6ICVzIFNEQSBzdHVjayBsb3chXG4iLG5hbWUpOwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJZ290byBiYWlsb3V0OwogCX0KIAlzY2xsbyhhZGFwKTsKLQlwcmludGsoInRlc3RfYnVzOjMgc2NsOiAlZCAgc2RhOiAlZCBcbiIsZ2V0c2NsKGFkYXApLAorCXByaW50aygidGVzdF9idXM6MyBzY2w6ICVkICBzZGE6ICVkXG4iLCBnZXRzY2woYWRhcCksCiAJICAgICAgIGdldHNkYShhZGFwKSk7CiAJaWYgKCAwICE9IGdldHNjbChhZGFwKSApIHsKIApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJCWdvdG8gYmFpbG91dDsKIAl9CiAJc2NsaGkoYWRhcCk7Ci0JcHJpbnRrKCJ0ZXN0X2J1czo0IHNjbDogJWQgIHNkYTogJWQgXG4iLGdldHNjbChhZGFwKSwKKwlwcmludGsoInRlc3RfYnVzOjQgc2NsOiAlZCAgc2RhOiAlZFxuIiwgZ2V0c2NsKGFkYXApLAogCSAgICAgICBnZXRzZGEoYWRhcCkpOwogCWlmICggMCA9PSBnZXRzY2woYWRhcCkgKSB7CiAJCXByaW50aygidGVzdF9idXM6ICVzIFNDTCBzdHVjayBsb3chXG4iLG5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwppbmRleCA0NWU2ZWZiMS4uMGFiN2UzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KIAkvKiAweDFmID0gRmFpbGVkLCBCdXNfRXJyLCBEZXZfRXJyLCBJbnRyLCBIb3N0X0J1c3kgKi8KIAlpZiAoKHRlbXAgPSAoMHgxZiAmIGluYl9wKFNNQkhTVFNUUykpKSAhPSAweDAwKSB7Ci0JCWRldl9kYmcoJkk4MDFfZGV2LT5kZXYsICJTTUJ1cyBidXN5ICglMDJ4KS4gUmVzZXR0aW5nLi4uIFxuIiwKKwkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIlNNQnVzIGJ1c3kgKCUwMngpLiBSZXNldHRpbmcuLi5cbiIsCiAJCQl0ZW1wKTsKIAkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CiAJCWlmICgodGVtcCA9ICgweDFmICYgaW5iX3AoU01CSFNUU1RTKSkpICE9IDB4MDApIHsKQEAgLTMxNSw3ICszMTUsNyBAQAogCQl9CiAJCWlmICh0ZW1wICYgZXJybWFzaykgewogCQkJZGV2X2RiZygmSTgwMV9kZXYtPmRldiwgIlNNQnVzIGJ1c3kgKCUwMngpLiAiCi0JCQkJIlJlc2V0dGluZy4uLiBcbiIsIHRlbXApOworCQkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQkJb3V0Yl9wKHRlbXAsIFNNQkhTVFNUUyk7CiAJCQlpZiAoKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgJiBlcnJtYXNrKSAhPSAweDAwKSB7CiAJCQkJZGV2X2VycigmSTgwMV9kZXYtPmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwMjAwMC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKaW5kZXggZWM5NDNjYS4uMTk1NmFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMKQEAgLTMzLDcgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KIAotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgkvKiBQaWNrIHVwIElYUDQyMDAwLXNwZWNpZmljIGJpdHMgKi8KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4JLyogUGljayB1cCBJWFAyMDAwLXNwZWNpZmljIGJpdHMgKi8KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGl4cDIwMDBfc2NsX3Bpbih2b2lkICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1rZXl3ZXN0LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYwppbmRleCAzNjNlNTQ1Li45NGFlODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWtleXdlc3QuYwpAQCAtNjk4LDcgKzY5OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNyZWF0ZV9pZmFjZV9tYWNpbyhzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitjcmVhdGVfaWZhY2VfbWFjaW8oc3RydWN0IG1hY2lvX2RldiogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlyZXR1cm4gY3JlYXRlX2lmYWNlKGRldi0+b2ZkZXYubm9kZSwgJmRldi0+b2ZkZXYuZGV2KTsKIH0KQEAgLTcxMCw3ICs3MTAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1jcmVhdGVfaWZhY2Vfb2ZfcGxhdGZvcm0oc3RydWN0IG9mX2RldmljZSogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorY3JlYXRlX2lmYWNlX29mX3BsYXRmb3JtKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJcmV0dXJuIGNyZWF0ZV9pZmFjZShkZXYtPm5vZGUsICZkZXYtPmRldik7CiB9CkBAIC03MjEsMTAgKzcyMSw5IEBACiAJcmV0dXJuIGRpc3Bvc2VfaWZhY2UoJmRldi0+ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpMmNfa2V5d2VzdF9tYXRjaFtdID0gCiB7CiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImkyYyIsCiAJLmNvbXBhdGlibGUJPSAia2V5d2VzdCIKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKaW5kZXggZDQxY2EzMS4uMDNjMjNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCkBAIC0yMCwxMyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpZmRlZiBDT05GSUdfRlNMX09DUAotI2luY2x1ZGUgPGFzbS9vY3AuaD4KLSNkZWZpbmUgRlNMX0kyQ19ERVZfU0VQQVJBVEVfREZTUlIgRlNfSTJDX1NFUEFSQVRFX0RGU1JSCi0jZGVmaW5lIEZTTF9JMkNfREVWX0NMT0NLXzUyMDAgRlNfSTJDX0NMT0NLXzUyMDAKLSNlbHNlCiAjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0yOTQsMjA0ICsyODgsNiBAQAogCS5yZXRyaWVzID0gMQogfTsKIAotI2lmZGVmIENPTkZJR19GU0xfT0NQCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBtcGNfaTJjX3Byb2JlKHN0cnVjdCBvY3BfZGV2aWNlICpvY3ApCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IG1wY19pMmMgKmkyYzsKLQotCWlmICghKGkyYyA9IGttYWxsb2Moc2l6ZW9mKCppMmMpLCBHRlBfS0VSTkVMKSkpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbXNldChpMmMsIDAsIHNpemVvZigqaTJjKSk7Ci0KLQlpMmMtPmlycSA9IG9jcC0+ZGVmLT5pcnE7Ci0JaTJjLT5mbGFncyA9ICgoc3RydWN0IG9jcF9mc19pMmNfZGF0YSAqKW9jcC0+ZGVmLT5hZGRpdGlvbnMpLT5mbGFnczsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPnF1ZXVlKTsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG9jcC0+ZGVmLT5wYWRkciwgTVBDX0kyQ19SRUdJT04sICJpMmMtbXBjIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtbXBjIC0gcmVzb3VyY2UgdW5hdmFpbGFibGVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpMmMtPmJhc2UgPSBpb3JlbWFwKG9jcC0+ZGVmLT5wYWRkciwgTVBDX0kyQ19SRUdJT04pOwotCi0JaWYgKCFpMmMtPmJhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtbXBjIC0gZmFpbGVkIHRvIG1hcCBjb250cm9sbGVyXG4iKTsKLQkJcmVzdWx0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsX21hcDsKLQl9Ci0KLQlpZiAoaTJjLT5pcnEgIT0gT0NQX0lSUV9OQSkKLQl7Ci0JCWlmICgocmVzdWx0ID0gcmVxdWVzdF9pcnEob2NwLT5kZWYtPmlycSwgbXBjX2kyY19pc3IsCi0JCQkJCSAgU0FfU0hJUlEsICJpMmMtbXBjIiwgaTJjKSkgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiaTJjLW1wYyAtIGZhaWxlZCB0byBhdHRhY2ggaW50ZXJydXB0XG4iKTsKLQkJCWdvdG8gZmFpbF9pcnE7Ci0JCX0KLQl9IGVsc2UKLQkJaTJjLT5pcnEgPSAwOwotCi0JbXBjX2kyY19zZXRjbG9jayhpMmMpOwotCW9jcF9zZXRfZHJ2ZGF0YShvY3AsIGkyYyk7Ci0KLQlpMmMtPmFkYXAgPSBtcGNfb3BzOwotCWkyY19zZXRfYWRhcGRhdGEoJmkyYy0+YWRhcCwgaTJjKTsKLQotCWlmICgocmVzdWx0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMmMtbXBjIC0gZmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKLQkJZ290byBmYWlsX2FkZDsKLQl9Ci0KLQlyZXR1cm4gcmVzdWx0OwotCi0gICAgICBmYWlsX2FkZDoKLQlpZiAob2NwLT5kZWYtPmlycSAhPSBPQ1BfSVJRX05BKQotCQlmcmVlX2lycShvY3AtPmRlZi0+aXJxLCAwKTsKLSAgICAgIGZhaWxfaXJxOgotCWlvdW5tYXAoaTJjLT5iYXNlKTsKLSAgICAgIGZhaWxfbWFwOgotCXJlbGVhc2VfbWVtX3JlZ2lvbihvY3AtPmRlZi0+cGFkZHIsIE1QQ19JMkNfUkVHSU9OKTsKLQlrZnJlZShpMmMpOwotCXJldHVybiByZXN1bHQ7Ci19Ci1zdGF0aWMgdm9pZCBfX2RldmV4aXQgbXBjX2kyY19yZW1vdmUoc3RydWN0IG9jcF9kZXZpY2UgKm9jcCkKLXsKLQlzdHJ1Y3QgbXBjX2kyYyAqaTJjID0gb2NwX2dldF9kcnZkYXRhKG9jcCk7Ci0JaTJjX2RlbF9hZGFwdGVyKCZpMmMtPmFkYXApOwotCW9jcF9zZXRfZHJ2ZGF0YShvY3AsIE5VTEwpOwotCi0JaWYgKG9jcC0+ZGVmLT5pcnEgIT0gT0NQX0lSUV9OQSkKLQkJZnJlZV9pcnEoaTJjLT5pcnEsIGkyYyk7Ci0JaW91bm1hcChpMmMtPmJhc2UpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihvY3AtPmRlZi0+cGFkZHIsIE1QQ19JMkNfUkVHSU9OKTsKLQlrZnJlZShpMmMpOwotfQotCi1zdGF0aWMgc3RydWN0IG9jcF9kZXZpY2VfaWQgbXBjX2lpY19pZHNbXSBfX2RldmluaXRkYXRhID0gewotCXsudmVuZG9yID0gT0NQX1ZFTkRPUl9GUkVFU0NBTEUsLmZ1bmN0aW9uID0gT0NQX0ZVTkNfSUlDfSwKLQl7LnZlbmRvciA9IE9DUF9WRU5ET1JfSU5WQUxJRH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2NwLCBtcGNfaWljX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2NwX2RyaXZlciBtcGNfaWljX2RyaXZlciA9IHsKLQkubmFtZSA9ICJpaWMiLAotCS5pZF90YWJsZSA9IG1wY19paWNfaWRzLAotCS5wcm9iZSA9IG1wY19pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1wY19pMmNfcmVtb3ZlKQotfTsKLQotc3RhdGljIGludCBfX2luaXQgaWljX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gb2NwX3JlZ2lzdGVyX2RyaXZlcigmbXBjX2lpY19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaWljX2V4aXQodm9pZCkKLXsKLQlvY3BfdW5yZWdpc3Rlcl9kcml2ZXIoJm1wY19paWNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoaWljX2luaXQpOwotbW9kdWxlX2V4aXQoaWljX2V4aXQpOwotI2Vsc2UKLXN0YXRpYyBpbnQgZnNsX2kyY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0JaW50IHJlc3VsdCA9IDA7Ci0Jc3RydWN0IG1wY19pMmMgKmkyYzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldmljZSk7Ci0Jc3RydWN0IGZzbF9pMmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHJlc291cmNlICpyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQotCXBkYXRhID0gKHN0cnVjdCBmc2xfaTJjX3BsYXRmb3JtX2RhdGEgKikgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlpZiAoIShpMmMgPSBrbWFsbG9jKHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltZW1zZXQoaTJjLCAwLCBzaXplb2YoKmkyYykpOwotCi0JaTJjLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwotCWkyYy0+ZmxhZ3MgPSBwZGF0YS0+ZGV2aWNlX2ZsYWdzOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyYy0+cXVldWUpOwotCi0JaTJjLT5iYXNlID0gaW9yZW1hcCgocGh5c19hZGRyX3Qpci0+c3RhcnQsIE1QQ19JMkNfUkVHSU9OKTsKLQotCWlmICghaTJjLT5iYXNlKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaTJjLW1wYyAtIGZhaWxlZCB0byBtYXAgY29udHJvbGxlclxuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9tYXA7Ci0JfQotCi0JaWYgKGkyYy0+aXJxICE9IDApCi0JCWlmICgocmVzdWx0ID0gcmVxdWVzdF9pcnEoaTJjLT5pcnEsIG1wY19pMmNfaXNyLAotCQkJCQkgIFNBX1NISVJRLCAiaTJjLW1wYyIsIGkyYykpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgImkyYy1tcGMgLSBmYWlsZWQgdG8gYXR0YWNoIGludGVycnVwdFxuIik7Ci0JCQlnb3RvIGZhaWxfaXJxOwotCQl9Ci0KLQltcGNfaTJjX3NldGNsb2NrKGkyYyk7Ci0JZGV2X3NldF9kcnZkYXRhKGRldmljZSwgaTJjKTsKLQotCWkyYy0+YWRhcCA9IG1wY19vcHM7Ci0JaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwLCBpMmMpOwotCWkyYy0+YWRhcC5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKLQlpZiAoKHJlc3VsdCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaTJjLW1wYyAtIGZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7Ci0JCWdvdG8gZmFpbF9hZGQ7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLQotICAgICAgZmFpbF9hZGQ6Ci0JaWYgKGkyYy0+aXJxICE9IDApCi0JCWZyZWVfaXJxKGkyYy0+aXJxLCBOVUxMKTsKLSAgICAgIGZhaWxfaXJxOgotCWlvdW5tYXAoaTJjLT5iYXNlKTsKLSAgICAgIGZhaWxfbWFwOgotCWtmcmVlKGkyYyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX07Ci0KLXN0YXRpYyBpbnQgZnNsX2kyY19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBtcGNfaTJjICppMmMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKLQotCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKLQlkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBOVUxMKTsKLQotCWlmIChpMmMtPmlycSAhPSAwKQotCQlmcmVlX2lycShpMmMtPmlycSwgaTJjKTsKLQotCWlvdW5tYXAoaTJjLT5iYXNlKTsKLQlrZnJlZShpMmMpOwotCXJldHVybiAwOwotfTsKLQotLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBmc2xfaTJjX2RyaXZlciA9IHsKLQkubmFtZSA9ICJmc2wtaTJjIiwKLQkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAotCS5wcm9iZSA9IGZzbF9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IGZzbF9pMmNfcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZnNsX2kyY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZnNsX2kyY19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZnNsX2kyY19leGl0KHZvaWQpCi17Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9pMmNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZnNsX2kyY19pbml0KTsKLW1vZHVsZV9leGl0KGZzbF9pMmNfZXhpdCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfRlNMX09DUCAqLwotCiBNT0RVTEVfQVVUSE9SKCJBZHJpYW4gQ294IDxhZHJpYW5AaHVtYm9sZHQuY28udWs+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04KICAgICAoIkkyQy1CdXMgYWRhcHRlciBmb3IgTVBDMTA3IGJyaWRnZSBhbmQgTVBDODI0eC84NXh4LzUyeHggcHJvY2Vzc29ycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCmluZGV4IDFmODBiYTkuLjZkMzRlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUgU01CdXMgaG9zdCBpcyByZWFkeSB0byBzdGFydCB0cmFuc21pdHRpbmcgKi8KIAlpZiAoKHRlbXAgPSBpbmJfcChTTUJIU1RTVFMpKSAhPSAweDAwKSB7CiAJCWRldl9kYmcoJnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYnVzeSAoJTAyeCkuICIKLQkJCSJSZXNldHRpbmcuLi4gXG4iLCB0ZW1wKTsKKwkJCSJSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQlvdXRiX3AodGVtcCwgU01CSFNUU1RTKTsKIAkJaWYgKCh0ZW1wID0gaW5iX3AoU01CSFNUU1RTKSkgIT0gMHgwMCkgewogCQkJZGV2X2VycigmcGlpeDRfYWRhcHRlci5kZXYsICJGYWlsZWQhICglMDJ4KVxuIiwgdGVtcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCmluZGV4IDJiNTkxMWMuLmJiZDVlNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNTU5NS5jCkBAIC0yMjgsNyArMjI4LDcgQEAKIAkvKiBNYWtlIHN1cmUgdGhlIFNNQnVzIGhvc3QgaXMgcmVhZHkgdG8gc3RhcnQgdHJhbnNtaXR0aW5nICovCiAJdGVtcCA9IHNpczU1OTVfcmVhZChTTUJfU1RTX0xPKSArIChzaXM1NTk1X3JlYWQoU01CX1NUU19ISSkgPDwgOCk7CiAJaWYgKHRlbXAgIT0gMHgwMCkgewotCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJTTUJ1cyBidXN5ICglMDR4KS4gUmVzZXR0aW5nLi4uIFxuIiwgdGVtcCk7CisJCWRldl9kYmcoJmFkYXAtPmRldiwgIlNNQnVzIGJ1c3kgKCUwNHgpLiBSZXNldHRpbmcuLi5cbiIsIHRlbXApOwogCQlzaXM1NTk1X3dyaXRlKFNNQl9TVFNfTE8sIHRlbXAgJiAweGZmKTsKIAkJc2lzNTU5NV93cml0ZShTTUJfU1RTX0hJLCB0ZW1wID4+IDgpOwogCQlpZiAoKHRlbXAgPSBzaXM1NTk1X3JlYWQoU01CX1NUU19MTykgKyAoc2lzNTU5NV9yZWFkKFNNQl9TVFNfSEkpIDw8IDgpKSAhPSAweDAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCBhMDk4MmRhLi40M2Y3MGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTEsNDA5ICsxLDEyIEBACiAjCi0jIEkyQyBTZW5zb3IgYW5kICJvdGhlciIgY2hpcCBjb25maWd1cmF0aW9uCisjIE1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIkhhcmR3YXJlIFNlbnNvcnMgQ2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSTJDCi0KIGNvbmZpZyBJMkNfU0VOU09SCiAJdHJpc3RhdGUKIAlkZWZhdWx0IG4KIAotY29uZmlnIFNFTlNPUlNfQURNMTAyMQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDIxIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTEwMjEgCi0JICBhbmQgQURNMTAyMyBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogTWF4aW0gTUFYMTYxNyBhbmQgTUFYMTYxN0EsCi0JICBHZW5lc3lzIExvZ2ljIEdMNTIzU00sIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NCwgVEkgVEhNQzEwLAotCSAgYW5kIHRoZSBYRU9OIHByb2Nlc3NvciBidWlsdC1pbiBzZW5zb3IuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGFkbTEwMjEuCi0KLWNvbmZpZyBTRU5TT1JTX0FETTEwMjUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTAyNSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURNMTAyNQotCSAgYW5kIFBoaWxpcHMgTkUxNjE5IHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNS4KLQotY29uZmlnIFNFTlNPUlNfQURNMTAyNgotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDI2IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDI2Ci0JICBzZW5zb3IgY2hpcC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYWRtMTAyNi4KLQotY29uZmlnIFNFTlNPUlNfQURNMTAzMQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRE0xMDMxIAotCSAgYW5kIEFETTEwMzAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZG0xMDMxLgotCi1jb25maWcgU0VOU09SU19BRE05MjQwCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTkyNDAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFETTkyNDAsCi0JICBEYWxsYXMgRFMxNzgwLCBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODEgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhZG05MjQwLgotCi1jb25maWcgU0VOU09SU19BU0IxMDAKLQl0cmlzdGF0ZSAiQXN1cyBBU0IxMDAgQmFjaCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQVNCMTAwIEJhY2ggc2Vuc29yCi0JICBjaGlwIGZvdW5kIG9uIHNvbWUgQXN1cyBtYWluYm9hcmRzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBhc2IxMDAuCi0KLWNvbmZpZyBTRU5TT1JTX0FUWFAxCi0JdHJpc3RhdGUgIkF0dGFuc2ljIEFUWFAxIFZJRCBjb250cm9sbGVyIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQXR0YW5zaWMgQVRYUDEgVklECi0JICBjb250cm9sbGVyLgotCi0JICBJZiB5b3VyIGJvYXJkIGhhdmUgc3VjaCBhIGNoaXAsIHlvdSBhcmUgYWJsZSB0byBjb250cm9sIHlvdXIgQ1BVCi0JICBjb3JlIGFuZCBvdGhlciB2b2x0YWdlcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgYXR4cDEuCi0KLWNvbmZpZyBTRU5TT1JTX0RTMTYyMQotCXRyaXN0YXRlICJEYWxsYXMgU2VtaWNvbmR1Y3RvciBEUzE2MjEgYW5kIERTMTYyNSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBEYWxsYXMgU2VtaWNvbmR1Y3RvcgotCSAgRFMxNjIxIGFuZCBEUzE2MjUgc2Vuc29yIGNoaXBzLiAKLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZHMxNjIxLgotCi1jb25maWcgU0VOU09SU19GU0NIRVIKLQl0cmlzdGF0ZSAiRlNDIEhlcm1lcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBGdWppdHN1IFNpZW1lbnMKLQkgIENvbXB1dGVycyBIZXJtZXMgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBmc2NoZXIuCi0KLWNvbmZpZyBTRU5TT1JTX0ZTQ1BPUwotCXRyaXN0YXRlICJGU0MgUG9zZWlkb24iCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgRnVqaXRzdSBTaWVtZW5zCi0JICBDb21wdXRlcnMgUG9zZWlkb24gc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBmc2Nwb3MuCi0KLWNvbmZpZyBTRU5TT1JTX0dMNTE4U00KLQl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUxOFNNIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgR2VuZXN5cyBMb2dpYyBHTDUxOFNNCi0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGdsNTE4c20uCi0KLWNvbmZpZyBTRU5TT1JTX0dMNTIwU00KLQl0cmlzdGF0ZSAiR2VuZXN5cyBMb2dpYyBHTDUyMFNNIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIEdlbmVzeXMgTG9naWMgR0w1MjBTTQotCSAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBnbDUyMHNtLgotCi1jb25maWcgU0VOU09SU19JVDg3Ci0JdHJpc3RhdGUgIklURSBJVDg3eHggYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgSVRFIElUODd4eCBzZW5zb3IgY2hpcHMKLQkgIGFuZCBjbG9uZXM6IFNpUzk2MC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KLQotY29uZmlnIFNFTlNPUlNfTE02MwotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNjMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNNjMgcmVtb3RlIGRpb2RlIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIHdpdGggaW50ZWdyYXRlZCBmYW4KLQkgIGNvbnRyb2wuICBTdWNoIGNoaXBzIGFyZSBmb3VuZCBvbiB0aGUgVHlhbiBTNDg4MiAoVGh1bmRlciBLOFFTIFBybykKLQkgIG1vdGhlcmJvYXJkLCBhbW9uZyBvdGhlcnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNjMuCi0KLWNvbmZpZyBTRU5TT1JTX0xNNzUKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03NQotCSAgc2Vuc29yIGNoaXBzIGFuZCBjbG9uZXM6IERhbGxhcyBTZW1pY29uZHVjdG9yIERTNzUgYW5kIERTMTc3NSAoaW4KLQkgIDktYml0IHByZWNpc2lvbiBtb2RlKSwgYW5kIFRlbENvbSAobm93IE1pY3JvY2hpcCkgVENONzUuCi0KLQkgIFRoZSBEUzc1IGFuZCBEUzE3NzUgaW4gMTAtIHRvIDEyLWJpdCBwcmVjaXNpb24gbW9kZXMgd2lsbCByZXF1aXJlCi0JICBhIGZvcmNlIG1vZHVsZSBwYXJhbWV0ZXIuIFRoZSBkcml2ZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleHRyYQotCSAgcHJlY2lzaW9uIGFueWhvdy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbG03NS4KLQotY29uZmlnIFNFTlNPUlNfTE03NwotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzciCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc3Ci0JICBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNzcuCi0KLWNvbmZpZyBTRU5TT1JTX0xNNzgKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzgsCi0JICBMTTc4LUogYW5kIExNNzkuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtNzguCi0KLWNvbmZpZyBTRU5TT1JTX0xNODAKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgwIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODAgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTgwLgotCi1jb25maWcgU0VOU09SU19MTTgzCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MyIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODMgc2Vuc29yIGNoaXBzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTgzLgotCi1jb25maWcgU0VOU09SU19MTTg1Ci0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NSBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTg1Ci0JICBzZW5zb3IgY2hpcHMgYW5kIGNsb25lczogQURUNzQ2MywgRU1DNkQxMDAsIEVNQzZEMTAyIGFuZCBBRE0xMDI3LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTg1LgotCi1jb25maWcgU0VOU09SU19MTTg3Ci0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04NyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODcKLQkgIHNlbnNvciBjaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgbG04Ny4KLQotY29uZmlnIFNFTlNPUlNfTE05MAotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTAgYW5kIGNvbXBhdGlibGVzIgotCWRlcGVuZHMgb24gSTJDCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkwLAotCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiBhbmQgTWF4aW0gTUFYNjY1NyBhbmQKLQkgIE1BWDY2NTggc2Vuc29yIGNoaXBzLgotCi0JICBUaGUgQW5hbG9nIERldmljZXMgQURUNzQ2MSBzZW5zb3IgY2hpcCBpcyBhbHNvIHN1cHBvcnRlZCwgYnV0IG9ubHkKLQkgIGlmIGZvdW5kIGluIEFETTEwMzIgY29tcGF0aWJpbGl0eSBtb2RlLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBsbTkwLgotCi1jb25maWcgU0VOU09SU19MTTkyCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05MiBhbmQgY29tcGF0aWJsZXMiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTkyCi0JICBhbmQgTWF4aW0gTUFYNjYzNSBzZW5zb3IgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGxtOTIuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2MTkKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYxOSBzZW5zb3IgY2hpcCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjE5IHNlbnNvciBjaGlwLgotCSAgCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgotCi1jb25maWcgU0VOU09SU19QQzg3MzYwCi0JdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgUEM4NzM2MCBmYW1pbHkiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBhY2Nlc3MgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcKLQkgIGZ1bmN0aW9ucyBvZiB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzZ4IFN1cGVyLUkvTyBjaGlwcy4KLQkgIFRoZSBQQzg3MzYwLCBQQzg3MzYzIGFuZCBQQzg3MzY0IG9ubHkgaGF2ZSBmYW4gbW9uaXRvcmluZyBhbmQKLQkgIGNvbnRyb2wuICBUaGUgUEM4NzM2NSBhbmQgUEM4NzM2NiBhZGRpdGlvbmFsbHkgaGF2ZSB2b2x0YWdlIGFuZAotCSAgdGVtcGVyYXR1cmUgbW9uaXRvcmluZy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgcGM4NzM2MC4KLQotY29uZmlnIFNFTlNPUlNfU01TQzQ3QjM5NwotCXRyaXN0YXRlICJTTVNDIExQQzQ3QjM5Ny1OQyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBTTVNDIExQQzQ3QjM5Ny1OQwotCSAgc2Vuc29yIGNoaXAuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N2IzOTcuCi0KLWNvbmZpZyBTRU5TT1JTX1NJUzU1OTUKLQl0cmlzdGF0ZSAiU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbXMgQ29ycC4gU2lTNTU5NSIKLQlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCi0JICBTaVM1NTk1IFNvdXRoIEJyaWRnZXMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNpczU1OTUuCi0KLWNvbmZpZyBTRU5TT1JTX1NNU0M0N00xCi0JdHJpc3RhdGUgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBpbnRlZ3JhdGVkIGZhbgotCSAgbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlIFNNU0MgTFBDNDdCMjd4LAotCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4IGFuZCBMUEM0N00xOTIgY2hpcHMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N20xLgotCi1jb25maWcgU0VOU09SU19WSUE2ODZBCi0JdHJpc3RhdGUgIlZJQTY4NkEiCi0JZGVwZW5kcyBvbiBJMkMgJiYgUENJCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBzZW5zb3JzIGluCi0JICBWaWEgNjg2QS9CIFNvdXRoIEJyaWRnZXMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHZpYTY4NmEuCi0KLWNvbmZpZyBTRU5TT1JTX1c4Mzc4MUQKLQl0cmlzdGF0ZSAiV2luYm9uZCBXODM3ODFELCBXODM3ODJELCBXODM3ODNTLCBXODM2MjdIRiwgQXN1cyBBUzk5MTI3RiIKLQlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc4eCBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4Mzc4MUQsIFc4Mzc4MkQsIFc4Mzc4M1MgYW5kIFc4MzYyN0hGLAotCSAgYW5kIHRoZSBzaW1pbGFyIEFzdXMgQVM5OTEyN0YuCi0JICAKLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHc4Mzc4MWQuCi0KLWNvbmZpZyBTRU5TT1JTX1c4M0w3ODVUUwotCXRyaXN0YXRlICJXaW5ib25kIFc4M0w3ODVUUy1TIgotCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBJMkNfU0VOU09SCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4M0w3ODVUUy1TCi0JICBzZW5zb3IgY2hpcCwgd2hpY2ggaXMgdXNlZCBvbiB0aGUgQXN1cyBBN044WCwgYW1vbmcgb3RoZXIKLQkgIG1vdGhlcmJvYXJkcy4KLQkgIAotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdzgzbDc4NXRzLgotCi1jb25maWcgU0VOU09SU19XODM2MjdIRgotCXRyaXN0YXRlICJXaW5ib25kIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBXODM2OTdIRiIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgSTJDX1NFTlNPUgotCXNlbGVjdCBJMkNfSVNBCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4MzZYNyBzZXJpZXMKLQkgIG9mIHNlbnNvciBjaGlwczogdGhlIFc4MzYyN0hGLCBXODM2MjdUSEYsIFc4MzYzN0hGLCBhbmQgdGhlIFc4MzY5N0hGCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHc4MzYyN2hmLgotCi1jb25maWcgU0VOU09SU19XODM2MjdFSEYKLQl0cmlzdGF0ZSAiV2luYm9uZCBXODM2MjdFSEYiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0Jc2VsZWN0IEkyQ19TRU5TT1IKLQlzZWxlY3QgSTJDX0lTQQotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBwcmVsaW1pbmFyeSBzdXBwb3J0IGZvciB0aGUgaGFyZHdhcmUKLQkgIG1vbml0b3JpbmcgZnVuY3Rpb25hbGl0eSBvZiB0aGUgV2luYm9uZCBXODM2MjdFSEYgU3VwZXItSS9PIGNoaXAuCi0JICBPbmx5IGZhbiBhbmQgdGVtcGVyYXR1cmUgaW5wdXRzIGFyZSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudCwgd2hpbGUKLQkgIHRoZSBjaGlwIGRvZXMgbXVjaCBtb3JlIHRoYW4gdGhhdC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgdzgzNjI3ZWhmLgotCi1lbmRtZW51Ci0KLW1lbnUgIk90aGVyIEkyQyBDaGlwIHN1cHBvcnQiCittZW51ICJNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMKIAogY29uZmlnIFNFTlNPUlNfRFMxMzM3CkBAIC01MDksNyArMTEyLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRwczY1MDEwLgogCi0KIGNvbmZpZyBTRU5TT1JTX000MVQwMAogCXRyaXN0YXRlICJTVCBNNDFUMDAgUlRDIGNoaXAiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUFBDMzIKQEAgLTUyMCwxMyArMTIyLDE2IEBACiAJICB3aWxsIGJlIGNhbGxlZCBtNDF0MDAuCiAKIGNvbmZpZyBTRU5TT1JTX01BWDY4NzUKLQl0cmlzdGF0ZSAiTUFYSU0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYNjg3NSBQb3dlciBzdXBwbHkgc3VwZXJ2aXNvciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1BWDY4NzUKLQkgIEVFUFJPTS1Qcm9ncmFtbWFibGUsIEhleC9RdWFkLCBQb3dlci1TdXBweSBTZXF1ZW5jZXJzL1N1cGVydmlzb3JzLgorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBNQVg2ODc1CisJICBFRVBST00tcHJvZ3JhbW1hYmxlLCBxdWFkIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIvc3VwZXJ2aXNvci4KIAotICAgICAgICAgIFRoaXMgcHJvdmlkZXMgYSBpbnRlcmZhY2UgdG8gcHJvZ3JhbSB0aGUgRUVQUk9NIGFuZCByZXNldCB0aGUgY2hpcC4KKwkgIFRoaXMgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHByb2dyYW0gdGhlIEVFUFJPTSBhbmQgcmVzZXQgdGhlIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGFsc28gc3VwcG9ydHMgdGhlIE1heGltIE1BWDY4NzQgaGV4IHBvd2VyLXN1cHBseQorCSAgc2VxdWVuY2VyL3N1cGVydmlzb3IgaWYgZm91bmQgYXQgYSBjb21wYXRpYmxlIGFkZHJlc3MuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1heDY4NzUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCmluZGV4IGI1ZTZkMmYuLmE4NzZkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0xLDUyICsxLDE2IEBACiAjCi0jIE1ha2VmaWxlIGZvciBzZW5zb3IgYW5kICJvdGhlciIgSTJDIGNoaXAgZHJpdmVycy4KKyMgTWFrZWZpbGUgZm9yIG1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycy4KICMKIAotIyBhc2IxMDAsIHRoZW4gdzgzNzgxZCBnbyBmaXJzdCwgYXMgdGhleSBjYW4gb3ZlcnJpZGUgb3RoZXIgZHJpdmVycycgYWRkcmVzc2VzLgotb2JqLSQoQ09ORklHX1NFTlNPUlNfQVNCMTAwKQkrPSBhc2IxMDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3SEYpCSs9IHc4MzYyN2hmLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc4MUQpCSs9IHc4Mzc4MWQubwotCi1vYmotJChDT05GSUdfU0VOU09SU19BRE0xMDIxKQkrPSBhZG0xMDIxLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjUpCSs9IGFkbTEwMjUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNikJKz0gYWRtMTAyNi5vCi1vYmotJChDT05GSUdfU0VOU09SU19BRE0xMDMxKQkrPSBhZG0xMDMxLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTkyNDApCSs9IGFkbTkyNDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQVRYUDEpCSs9IGF0eHAxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTMzNykJKz0gZHMxMzM3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTM3NCkJKz0gZHMxMzc0Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0VFUFJPTSkJKz0gZWVwcm9tLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ0hFUikJKz0gZnNjaGVyLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0ZTQ1BPUykJKz0gZnNjcG9zLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0dMNTE4U00pCSs9IGdsNTE4c20ubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfR0w1MjBTTSkJKz0gZ2w1MjBzbS5vCi1vYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNNjMpCSs9IGxtNjMubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03NSkJKz0gbG03NS5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTc3KQkrPSBsbTc3Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNNzgpCSs9IGxtNzgubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04MCkJKz0gbG04MC5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTgzKQkrPSBsbTgzLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNODUpCSs9IGxtODUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTE04NykJKz0gbG04Ny5vCi1vYmotJChDT05GSUdfU0VOU09SU19MTTkwKQkrPSBsbTkwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0xNOTIpCSs9IGxtOTIubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2ODc1KQkrPSBtYXg2ODc1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX000MVQwMCkJKz0gbTQxdDAwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1BDODczNjApCSs9IHBjODczNjAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENBOTUzOSkJKz0gcGNhOTUzOS5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQ0Y4NTc0KQkrPSBwY2Y4NTc0Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUlRDODU2NCkJKz0gcnRjODU2NC5vCi1vYmotJChDT05GSUdfU0VOU09SU19TSVM1NTk1KQkrPSBzaXM1NTk1Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcpKz0gc21zYzQ3YjM5Ny5vCi1vYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdNMSkJKz0gc21zYzQ3bTEubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVklBNjg2QSkJKz0gdmlhNjg2YS5vCi1vYmotJChDT05GSUdfU0VOU09SU19XODM2MjdFSEYpCSs9IHc4MzYyN2VoZi5vCi1vYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCi0KIG9iai0kKENPTkZJR19JU1AxMzAxX09NQVApCSs9IGlzcDEzMDFfb21hcC5vCiBvYmotJChDT05GSUdfVFBTNjUwMTApCQkrPSB0cHM2NTAxMC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL2F0eHAxLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9hdHhwMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY1OTdhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2F0eHAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLyoKLSAgICBhdHhwMS5jIC0ga2VybmVsIG1vZHVsZSBmb3Igc2V0dGluZyBDUFUgVklEIGFuZCBnZW5lcmFsIHB1cnBvc2UKLSAgICAgICAgICAgICAgICAgICAgIEkvT3MgdXNpbmcgdGhlIEF0dGFuc2ljIEFUWFAxIGNoaXAuCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLQotKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLXZpZC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlN5c3RlbSB2b2x0YWdlcyBjb250cm9sIHZpYSBBdHRhbnNpYyBBVFhQMSIpOwotTU9EVUxFX1ZFUlNJT04oIjAuNi4yIik7Ci1NT0RVTEVfQVVUSE9SKCJTZWJhc3RpYW4gV2l0dCA8c2Uud2l0dEBnbXgubmV0PiIpOwotCi0jZGVmaW5lIEFUWFAxX1ZJRAkweDAwCi0jZGVmaW5lIEFUWFAxX0NWSUQJMHgwMQotI2RlZmluZSBBVFhQMV9HUElPMQkweDA2Ci0jZGVmaW5lIEFUWFAxX0dQSU8yCTB4MGEKLSNkZWZpbmUgQVRYUDFfVklERU5BCTB4MjAKLSNkZWZpbmUgQVRYUDFfVklETUFTSwkweDFmCi0jZGVmaW5lIEFUWFAxX0dQSU8xTUFTSwkweDBmCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MzcsIDB4NGUsIEkyQ19DTElFTlRfRU5EIH07Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07Ci0KLVNFTlNPUlNfSU5TTU9EXzEoYXR4cDEpOwotCi1zdGF0aWMgaW50IGF0eHAxX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFkYXB0ZXIpOwotc3RhdGljIGludCBhdHhwMV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50KTsKLXN0YXRpYyBzdHJ1Y3QgYXR4cDFfZGF0YSAqIGF0eHAxX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYXR4cDFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGF0eHAxX2RyaXZlciA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gImF0eHAxIiwKLQkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKLQkuYXR0YWNoX2FkYXB0ZXIgPSBhdHhwMV9hdHRhY2hfYWRhcHRlciwKLQkuZGV0YWNoX2NsaWVudAk9IGF0eHAxX2RldGFjaF9jbGllbnQsCi19OwotCi1zdHJ1Y3QgYXR4cDFfZGF0YSB7Ci0Jc3RydWN0IGkyY19jbGllbnQgY2xpZW50OwotCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7Ci0JdTggdmFsaWQ7Ci0Jc3RydWN0IHsKLQkJdTggdmlkOwkJLyogVklEIG91dHB1dCByZWdpc3RlciAqLwotCQl1OCBjcHVfdmlkOyAvKiBWSUQgaW5wdXQgZnJvbSBDUFUgKi8KLQkJdTggZ3BpbzE7ICAgLyogR2VuZXJhbCBwdXJwb3NlIEkvTyByZWdpc3RlciAxICovCi0JCXU4IGdwaW8yOyAgIC8qIEdlbmVyYWwgcHVycG9zZSBJL08gcmVnaXN0ZXIgMiAqLwotCX0gcmVnOwotCXU4IHZybTsJCQkvKiBEZXRlY3RlZCBDUFUgVlJNICovCi19OwotCi1zdGF0aWMgc3RydWN0IGF0eHAxX2RhdGEgKiBhdHhwMV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBhdHhwMV9kYXRhICpkYXRhOwotCi0JY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCWRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICgoamlmZmllcyAtIGRhdGEtPmxhc3RfdXBkYXRlZCA+IEhaKSB8fAotCSAgICAoamlmZmllcyA8IGRhdGEtPmxhc3RfdXBkYXRlZCkgfHwKLQkgICAgIWRhdGEtPnZhbGlkKSB7Ci0KLQkJLyogVXBkYXRlIGxvY2FsIHJlZ2lzdGVyIGRhdGEgKi8KLQkJZGF0YS0+cmVnLnZpZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFUWFAxX1ZJRCk7Ci0JCWRhdGEtPnJlZy5jcHVfdmlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQVRYUDFfQ1ZJRCk7Ci0JCWRhdGEtPnJlZy5ncGlvMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFUWFAxX0dQSU8xKTsKLQkJZGF0YS0+cmVnLmdwaW8yID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgQVRYUDFfR1BJTzIpOwotCi0JCWRhdGEtPnZhbGlkID0gMTsKLQl9Ci0KLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuKGRhdGEpOwotfQotCi0vKiBzeXMgZmlsZSBmdW5jdGlvbnMgZm9yIGNwdTBfdmlkICovCi1zdGF0aWMgc3NpemVfdCBhdHhwMV9zaG93dmNvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWludCBzaXplOwotCXN0cnVjdCBhdHhwMV9kYXRhICpkYXRhOwotCi0JZGF0YSA9IGF0eHAxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQotCXNpemUgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+cmVnLnZpZCAmIEFUWFAxX1ZJRE1BU0ssIGRhdGEtPnZybSkpOwotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGF0eHAxX3N0b3JldmNvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGF0eHAxX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQljaGFyIHZpZDsKLQljaGFyIGN2aWQ7Ci0JdW5zaWduZWQgaW50IHZjb3JlOwotCi0JY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCWRhdGEgPSBhdHhwMV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQl2Y29yZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwotCXZjb3JlIC89IDI1OwotCXZjb3JlICo9IDI1OwotCi0JLyogQ2FsY3VsYXRlIFZJRCAqLwotCXZpZCA9IHZpZF90b19yZWcodmNvcmUsIGRhdGEtPnZybSk7Ci0KLQlpZiAodmlkIDwgMCkgewotCQlkZXZfZXJyKGRldiwgIlZJRCBjYWxjdWxhdGlvbiBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIElmIG91dHB1dCBlbmFibGVkLCB1c2UgY29udHJvbCByZWdpc3RlciB2YWx1ZS4gT3RoZXJ3aXNlIG9yaWdpbmFsIENQVSBWSUQgKi8KLQlpZiAoZGF0YS0+cmVnLnZpZCAmIEFUWFAxX1ZJREVOQSkKLQkJY3ZpZCA9IGRhdGEtPnJlZy52aWQgJiBBVFhQMV9WSURNQVNLOwotCWVsc2UKLQkJY3ZpZCA9IGRhdGEtPnJlZy5jcHVfdmlkOwotCi0JLyogTm90aGluZyBjaGFuZ2VkLCBhYm9ydGluZyAqLwotCWlmICh2aWQgPT0gY3ZpZCkKLQkJcmV0dXJuIGNvdW50OwotCi0JZGV2X2luZm8oZGV2LCAiU2V0dGluZyBWQ29yZSB0byAlZCBtViAoMHglMDJ4KVxuIiwgdmNvcmUsIHZpZCk7Ci0KLQkvKiBXcml0ZSBldmVyeSAyNSBtViBzdGVwIHRvIGluY3JlYXNlIHN0YWJpbGl0eSAqLwotCWlmIChjdmlkID4gdmlkKSB7Ci0JCWZvciAoOyBjdmlkID49IHZpZDsgY3ZpZC0tKSB7Ci0gICAgICAgIAkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFUWFAxX1ZJRCwgY3ZpZCB8IEFUWFAxX1ZJREVOQSk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWZvciAoOyBjdmlkIDw9IHZpZDsgY3ZpZCsrKSB7Ci0gICAgICAgIAkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFUWFAxX1ZJRCwgY3ZpZCB8IEFUWFAxX1ZJREVOQSk7Ci0JCX0KLQl9Ci0KLQlkYXRhLT52YWxpZCA9IDA7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qIENQVSBjb3JlIHJlZmVyZW5jZSB2b2x0YWdlCi0gICAgdW5pdDogbWlsbGl2b2x0Ci0qLwotc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPIHwgU19JV1VTUiwgYXR4cDFfc2hvd3Zjb3JlLCBhdHhwMV9zdG9yZXZjb3JlKTsKLQotLyogc3lzIGZpbGUgZnVuY3Rpb25zIGZvciBHUElPMSAqLwotc3RhdGljIHNzaXplX3QgYXR4cDFfc2hvd2dwaW8xKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlpbnQgc2l6ZTsKLQlzdHJ1Y3QgYXR4cDFfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSBhdHhwMV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQlzaXplID0gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGRhdGEtPnJlZy5ncGlvMSAmIEFUWFAxX0dQSU8xTUFTSyk7Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIHNzaXplX3QgYXR4cDFfc3RvcmVncGlvMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBhdHhwMV9kYXRhICpkYXRhOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JdW5zaWduZWQgaW50IHZhbHVlOwotCi0JY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCWRhdGEgPSBhdHhwMV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOwotCi0JdmFsdWUgJj0gQVRYUDFfR1BJTzFNQVNLOwotCi0JaWYgKHZhbHVlICE9IChkYXRhLT5yZWcuZ3BpbzEgJiBBVFhQMV9HUElPMU1BU0spKSB7Ci0JCWRldl9pbmZvKGRldiwgIldyaXRpbmcgMHgleCB0byBHUElPMS5cbiIsIHZhbHVlKTsKLQotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVRYUDFfR1BJTzEsIHZhbHVlKTsKLQotCQlkYXRhLT52YWxpZCA9IDA7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKiBHUElPMSBkYXRhIHJlZ2lzdGVyCi0gICAgdW5pdDogRm91ciBiaXQgYXMgaGV4IChlLmcuIDB4MGYpCi0qLwotc3RhdGljIERFVklDRV9BVFRSKGdwaW8xLCBTX0lSVUdPIHwgU19JV1VTUiwgYXR4cDFfc2hvd2dwaW8xLCBhdHhwMV9zdG9yZWdwaW8xKTsKLQotLyogc3lzIGZpbGUgZnVuY3Rpb25zIGZvciBHUElPMiAqLwotc3RhdGljIHNzaXplX3QgYXR4cDFfc2hvd2dwaW8yKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlpbnQgc2l6ZTsKLQlzdHJ1Y3QgYXR4cDFfZGF0YSAqZGF0YTsKLQotCWRhdGEgPSBhdHhwMV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQlzaXplID0gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGRhdGEtPnJlZy5ncGlvMik7Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIHNzaXplX3QgYXR4cDFfc3RvcmVncGlvMihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYXR4cDFfZGF0YSAqZGF0YTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXVuc2lnbmVkIGludCB2YWx1ZTsKLQotCWNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlkYXRhID0gYXR4cDFfdXBkYXRlX2RldmljZShkZXYpOwotCi0JdmFsdWUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KSAmIDB4ZmY7Ci0KLQlpZiAodmFsdWUgIT0gZGF0YS0+cmVnLmdwaW8yKSB7Ci0JCWRldl9pbmZvKGRldiwgIldyaXRpbmcgMHgleCB0byBHUElPMS5cbiIsIHZhbHVlKTsKLQotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQVRYUDFfR1BJTzIsIHZhbHVlKTsKLQotCQlkYXRhLT52YWxpZCA9IDA7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi0vKiBHUElPMiBkYXRhIHJlZ2lzdGVyCi0gICAgdW5pdDogRWlnaHQgYml0IGFzIGhleCAoZS5nLiAweGZmKQotKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihncGlvMiwgU19JUlVHTyB8IFNfSVdVU1IsIGF0eHAxX3Nob3dncGlvMiwgYXR4cDFfc3RvcmVncGlvMik7Ci0KLQotc3RhdGljIGludCBhdHhwMV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgJmF0eHAxX2RldGVjdCk7Ci19OwotCi1zdGF0aWMgaW50IGF0eHAxX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqIG5ld19jbGllbnQ7Ci0Jc3RydWN0IGF0eHAxX2RhdGEgKiBkYXRhOwotCWludCBlcnIgPSAwOwotCXU4IHRlbXA7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCi0JCWdvdG8gZXhpdDsKLQotCWlmICghKGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXR4cDFfZGF0YSksIEdGUF9LRVJORUwpKSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYXR4cDFfZGF0YSkpOwotCW5ld19jbGllbnQgPSAmZGF0YS0+Y2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKLQotCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwotCW5ld19jbGllbnQtPmRyaXZlciA9ICZhdHhwMV9kcml2ZXI7Ci0JbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwotCi0JLyogRGV0ZWN0IEFUWFAxLCBjaGVja2luZyBpZiB2ZW5kb3IgSUQgcmVnaXN0ZXJzIGFyZSBhbGwgemVybyAqLwotCWlmICghKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgzZSkgPT0gMCkgJiYKLQkgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgzZikgPT0gMCkgJiYKLQkgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHhmZSkgPT0gMCkgJiYKLQkgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHhmZikgPT0gMCkgKSkgewotCi0JCS8qIE5vIHZlbmRvciBJRCwgbm93IGNoZWNraW5nIGlmIHJlZ2lzdGVycyAweDEwLDB4MTEgKG5vbi1leGlzdGVudCkKLQkJICogc2hvd2luZyB0aGUgc2FtZSBhcyByZWdpc3RlciAweDAwICovCi0JCXRlbXAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgwMCk7Ci0KLQkJaWYgKCEoKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCAweDEwKSA9PSB0ZW1wKSAmJgotCQkJIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgMHgxMSkgPT0gdGVtcCkgKSkKLQkJCWdvdG8gZXhpdF9mcmVlOwotCX0KLQotCS8qIEdldCBWUk0gKi8KLQlkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7Ci0KLQlpZiAoKGRhdGEtPnZybSAhPSA5MCkgJiYgKGRhdGEtPnZybSAhPSA5MSkpIHsKLQkJZGV2X2VycigmbmV3X2NsaWVudC0+ZGV2LCAiTm90IHN1cHBvcnRpbmcgVlJNICVkLiVkXG4iLAotCQkJCWRhdGEtPnZybSAvIDEwLCBkYXRhLT52cm0gJSAxMCk7Ci0JCWdvdG8gZXhpdF9mcmVlOwotCX0KLQotCXN0cm5jcHkobmV3X2NsaWVudC0+bmFtZSwgImF0eHAxIiwgSTJDX05BTUVfU0laRSk7Ci0KLQlkYXRhLT52YWxpZCA9IDA7Ci0KLQlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQllcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKLQotCWlmIChlcnIpCi0JewotCQlkZXZfZXJyKCZuZXdfY2xpZW50LT5kZXYsICJBdHRhY2ggY2xpZW50IGVycm9yLlxuIik7Ci0JCWdvdG8gZXhpdF9mcmVlOwotCX0KLQotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZ3BpbzEpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZ3BpbzIpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOwotCi0JZGV2X2luZm8oJm5ld19jbGllbnQtPmRldiwgIlVzaW5nIFZSTTogJWQuJWRcbiIsCi0JCQkgZGF0YS0+dnJtIC8gMTAsIGRhdGEtPnZybSAlIDEwKTsKLQotCXJldHVybiAwOwotCi1leGl0X2ZyZWU6Ci0Ja2ZyZWUoZGF0YSk7Ci1leGl0OgotCXJldHVybiBlcnI7Ci19OwotCi1zdGF0aWMgaW50IGF0eHAxX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKiBjbGllbnQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7Ci0KLQlpZiAoZXJyKQotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBkZXRhY2ggY2xpZW50LlxuIik7Ci0JZWxzZQotCQlrZnJlZShpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7Ci0KLQlyZXR1cm4gZXJyOwotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXR4cDFfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYXR4cDFfZHJpdmVyKTsKLX07Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdHhwMV9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmF0eHAxX2RyaXZlcik7Ci19OwotCi1tb2R1bGVfaW5pdChhdHhwMV9pbml0KTsKLW1vZHVsZV9leGl0KGF0eHAxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwppbmRleCBhZGRmMGFkLi42ZWE0MTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwpAQCAtMTczLDkgKzE3Myw2IEBACiAJCQkJCSAgICB8IEkyQ19GVU5DX1NNQlVTX0JZVEUpKQogCQlnb3RvIGV4aXQ7CiAKLQkvKiBPSy4gRm9yIG5vdywgd2UgcHJlc3VtZSB3ZSBoYXZlIGEgdmFsaWQgY2xpZW50LiBXZSBub3cgY3JlYXRlIHRoZQotCSAgIGNsaWVudCBzdHJ1Y3R1cmUsIGV2ZW4gdGhvdWdoIHdlIGNhbm5vdCBmaWxsIGl0IGNvbXBsZXRlbHkgeWV0LgotCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGVlcHJvbV97cmVhZCx3cml0ZX1fdmFsdWUuICovCiAJaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlZXByb21fZGF0YSksIEdGUF9LRVJORUwpKSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL200MXQwMC5jCmluZGV4IDVlNDYzYzQ3Li43NzhkN2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJaW50CXJjOwogCiAJaWYgKChyYyA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpID09IDApIHsKLQkJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOworCQlrZnJlZShjbGllbnQpOwogCQl0YXNrbGV0X2tpbGwoJm00MXQwMF90YXNrbGV0KTsKIAl9CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jCmluZGV4IGZlNmIxNTAuLmM0ZjE0ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tYXg2ODc1LmMKQEAgLTM3LDcgKzM3LDggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiAKIC8qIEFkZHJlc3NlcyB0byBzY2FuICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0gezB4NTAsIDB4NTIsIEkyQ19DTElFTlRfRU5EfTsKKy8qIE5vIGFkZHJlc3Mgc2Nhbm5lZCBieSBkZWZhdWx0LCBhcyB0aGlzIGNvdWxkIGNvcnJ1cHQgc3RhbmRhcmQgRUVQUk9NUy4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7STJDX0NMSUVOVF9FTkR9Owogc3RhdGljIHVuc2lnbmVkIGludCBub3JtYWxfaXNhW10gPSB7STJDX0NMSUVOVF9JU0FfRU5EfTsKIAogLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KQEAgLTM2OSw2ICszNzAsOSBAQAogCW5ld19jbGllbnQtPmRyaXZlciA9ICZtYXg2ODc1X2RyaXZlcjsKIAluZXdfY2xpZW50LT5mbGFncyA9IDA7CiAKKwkvKiBQcmV2ZW50IDI0UkYwOCBjb3JydXB0aW9uICovCisJaTJjX3NtYnVzX3dyaXRlX3F1aWNrKG5ld19jbGllbnQsIDApOworCiAJLyogU2V0dXAgdGhlIHVzZXIgc2VjdGlvbiAqLwogCWRhdGEtPmJsb2Nrc1ttYXg2ODc1X2VlcHJvbV91c2VyXS50eXBlICAgID0gbWF4Njg3NV9lZXByb21fdXNlcjsKIAlkYXRhLT5ibG9ja3NbbWF4Njg3NV9lZXByb21fdXNlcl0uc2xpY2VzICA9IFVTRVJfRUVQUk9NX1NMSUNFUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCmluZGV4IGMwYWMwMWIuLjI4MGU5NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYwpAQCAtMTgsNyArMTgsNiBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCi0jdW5kZWYJREVCVUcKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDksMTEgKzQ4LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiVFBTNjUwMXggUG93ZXIgTWFuYWdlbWVudCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotLyogb25seSB0d28gYWRkcmVzc2VzIHBvc3NpYmxlICovCi0jZGVmaW5lCVRQU19CQVNFCTB4NDgKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7Ci0JVFBTX0JBU0UsCi0JSTJDX0NMSUVOVF9FTkQgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4NDgsIC8qIDB4NDksICovIEkyQ19DTElFTlRfRU5EIH07CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY19yYW5nZVtdID0geyBJMkNfQ0xJRU5UX0VORCB9OwogCiBJMkNfQ0xJRU5UX0lOU01PRDsKQEAgLTEwMiw3ICs5Nyw3IEBACiAJdTgJCQljaGdzdGF0dXMsIHJlZ3N0YXR1cywgY2hnY29uZjsKIAl1OAkJCW5tYXNrMSwgbm1hc2syOwogCi0JLyogcGx1cyBmb3VyIEdQSU9zLCBwcm9iYWJseSB1c2VkIHRvIHN3aXRjaCBwb3dlciAqLworCS8qIG5vdCBjdXJyZW50bHkgdHJhY2tpbmcgR1BJTyBzdGF0ZSAqLwogfTsKIAogI2RlZmluZQlQT1dFUl9QT0xMX0RFTEFZCW1zZWNzX3RvX2ppZmZpZXMoODAwKQpAQCAtMTM1LDcgKzEzMCw3IEBACiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX0NPVkVSKSA/ICIgdW5jb3ZlciIgOiAiIiwKIAkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfVVZMTykgPyAiIFVWTE8iIDogIiIsCiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX05PX0NIRykgPyAiIE5PX0NIRyIgOiAiIiwKLQkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfUEdfTEQwMikgPyAiIGxkMDFfYmFkIiA6ICIiLAorCQkocmVnc3RhdHVzICYgVFBTX1JFR19QR19MRDAyKSA/ICIgbGQwMl9iYWQiIDogIiIsCiAJCShyZWdzdGF0dXMgJiBUUFNfUkVHX1BHX0xEMDEpID8gIiBsZDAxX2JhZCIgOiAiIiwKIAkJKHJlZ3N0YXR1cyAmIFRQU19SRUdfUEdfTUFJTikgPyAiIG1haW5fYmFkIiA6ICIiLAogCQkocmVnc3RhdHVzICYgVFBTX1JFR19QR19DT1JFKSA/ICIgY29yZV9iYWQiIDogIiIpOwpAQCAtMTQzLDcgKzEzOCw3IEBACiAKIHN0YXRpYyB2b2lkIGRiZ19jaGdjb25mKGludCBwb3IsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgdTggY2hnY29uZmlnKQogewotCWNoYXIgKmhpYml0OworCWNvbnN0IGNoYXIgKmhpYml0OwogCiAJaWYgKHBvcikKIAkJaGliaXQgPSAoY2hnY29uZmlnICYgVFBTX0NIQVJHRV9QT1IpCkBAIC0yOTUsNyArMjkwLDcgQEAKIAlzZXFfcHJpbnRmKHMsICJkZWZncGlvICUwMnggbWFzazMgJTAyeFxuIiwgdmFsdWUsIHYyKTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHZhbHVlICYgKDEgPDwgKDQgK2kpKSkKKwkJaWYgKHZhbHVlICYgKDEgPDwgKDQgKyBpKSkpCiAJCQlzZXFfcHJpbnRmKHMsICIgIGdwaW8lZC1vdXQgJXNcbiIsIGkgKyAxLAogCQkJCSh2YWx1ZSAmICgxIDw8IGkpKSA/ICJsb3ciIDogImhpICIpOwogCQllbHNlCkBAIC00ODEsNyArNDc2LDcgQEAKIAlkZWJ1Z2ZzX3JlbW92ZSh0cHMtPmZpbGUpOwogCWlmIChpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpID09IDApCiAJCWtmcmVlKHRwcyk7Ci0JdGhlX3RwcyA9IDA7CisJdGhlX3RwcyA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUxNCw3ICs1MDksNiBAQAogCUlOSVRfV09SSygmdHBzLT53b3JrLCB0cHM2NTAxMF93b3JrLCB0cHMpOwogCXRwcy0+aXJxID0gLTE7CiAJdHBzLT5jbGllbnQuYWRkciA9IGFkZHJlc3M7Ci0JaTJjX3NldF9jbGllbnRkYXRhKCZ0cHMtPmNsaWVudCwgdHBzKTsKIAl0cHMtPmNsaWVudC5hZGFwdGVyID0gYnVzOwogCXRwcy0+Y2xpZW50LmRyaXZlciA9ICZ0cHM2NTAxMF9kcml2ZXI7CiAJc3RybGNweSh0cHMtPmNsaWVudC5uYW1lLCBEUklWRVJfTkFNRSwgSTJDX05BTUVfU0laRSk7CkBAIC01MjMsOSArNTE3LDcgQEAKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlkZXZfZGJnKCZidXMtPmRldiwgImNhbid0IGF0dGFjaCAlcyB0byBkZXZpY2UgJWQsIGVyciAlZFxuIiwKIAkJCQlEUklWRVJfTkFNRSwgYWRkcmVzcywgc3RhdHVzKTsKLWZhaWwxOgotCQlrZnJlZSh0cHMpOwotCQlyZXR1cm4gMDsKKwkJZ290byBmYWlsMTsKIAl9CiAKICNpZmRlZglDT05GSUdfQVJNCkBAIC01MzUsNyArNTI3LDcgQEAKIAkJdHBzLT5pcnEgPSBPTUFQX0dQSU9fSVJRKDU4KTsKIAkJb21hcF9yZXF1ZXN0X2dwaW8oNTgpOwogCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbig1OCwgMSk7Ci0JCW9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKDU4LCBPTUFQX0dQSU9fRkFMTElOR19FREdFKTsKKwkJc2V0X2lycV90eXBlKHRwcy0+aXJxLCBJUlFUX0ZBTExJTkcpOwogCX0KIAlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CiAJCXRwcy0+bW9kZWwgPSBUUFM2NTAxMDsKQEAgLTU0Myw3ICs1MzUsNyBAQAogCQl0cHMtPmlycSA9IE9NQVBfR1BJT19JUlEoT01BUF9NUFVJTygxKSk7CiAJCW9tYXBfcmVxdWVzdF9ncGlvKE9NQVBfTVBVSU8oMSkpOwogCQlvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihPTUFQX01QVUlPKDEpLCAxKTsKLQkJb21hcF9zZXRfZ3Bpb19lZGdlX2N0cmwoT01BUF9NUFVJTygxKSwgT01BUF9HUElPX0ZBTExJTkdfRURHRSk7CisJCXNldF9pcnFfdHlwZSh0cHMtPmlycSwgSVJRVF9GQUxMSU5HKTsKIAl9CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9oMygpKSB7CiAJCXRwcy0+bW9kZWwgPSBUUFM2NTAxMzsKQEAgLTYzMyw2ICs2MjUsOSBAQAogCXRwcy0+ZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoRFJJVkVSX05BTUUsIFNfSVJVR08sIE5VTEwsCiAJCQkJdHBzLCBERUJVR19GT1BTKTsKIAlyZXR1cm4gMDsKK2ZhaWwxOgorCWtmcmVlKHRwcyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHRwczY1MDEwX3NjYW5fYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYnVzKQpAQCAtNjQ1LDcgKzY0MCw2IEBACiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHBzNjUwMTBfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAidHBzNjUwMTAiLAotCS5pZAkJPSA4ODgsCQkvKiBGSVhNRSBhc3NpZ24gIm9mZmljaWFsIiB2YWx1ZSAqLwogCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAogCS5hdHRhY2hfYWRhcHRlcgk9IHRwczY1MDEwX3NjYW5fYnVzLAogCS5kZXRhY2hfY2xpZW50CT0gX19leGl0X3AodHBzNjUwMTBfZGV0YWNoX2NsaWVudCksCkBAIC03NDQsNyArNzM4LDcgQEAKIAlpZiAoIXRoZV90cHMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYobGVkID09IExFRDEpCisJaWYgKGxlZCA9PSBMRUQxKQogCQlvZmZzID0gMDsKIAllbHNlIHsKIAkJb2ZmcyA9IDI7CkBAIC03NTMsMTEgKzc0NywxMyBAQAogCiAJZG93bigmdGhlX3Rwcy0+bG9jayk7CiAKLQlkZXZfZGJnICgmdGhlX3Rwcy0+Y2xpZW50LmRldiwgImxlZCVpX29uICAgMHglMDJ4XG4iLCBsZWQsCi0JCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfTEVEMV9PTiArIG9mZnMpKTsKKwlwcl9kZWJ1ZygiJXM6IGxlZCVpX29uICAgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwgbGVkLAorCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwKKwkJCQlUUFNfTEVEMV9PTiArIG9mZnMpKTsKIAotCWRldl9kYmcgKCZ0aGVfdHBzLT5jbGllbnQuZGV2LCAibGVkJWlfcGVyICAweCUwMnhcbiIsIGxlZCwKLQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsIFRQU19MRUQxX1BFUiArIG9mZnMpKTsKKwlwcl9kZWJ1ZygiJXM6IGxlZCVpX3BlciAgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwgbGVkLAorCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwKKwkJCQlUUFNfTEVEMV9QRVIgKyBvZmZzKSk7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIE9GRjoKQEAgLTc3Myw3ICs3NjksNyBAQAogCQlsZWRfcGVyID0gMHgwOCB8ICgxIDw8IDcpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBXcm9uZyBtb2RlIHBhcmFtZXRlciBmb3IgdHBzNjUwMTBfc2V0X2xlZCgpXG4iLAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBXcm9uZyBtb2RlIHBhcmFtZXRlciBmb3Igc2V0X2xlZCgpXG4iLAogCQkgICAgICAgRFJJVkVSX05BTUUpOwogCQl1cCgmdGhlX3Rwcy0+bG9jayk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzg5LDcgKzc4NSw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCi0JZGV2X2RiZyAoJnRoZV90cHMtPmNsaWVudC5kZXYsICJsZWQlaV9vbiAgIDB4JTAyeFxuIiwgbGVkLAorCXByX2RlYnVnKCIlczogbGVkJWlfb24gICAweCUwMnhcbiIsIERSSVZFUl9OQU1FLCBsZWQsCiAJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfTEVEMV9PTiArIG9mZnMpKTsKIAogCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwKQEAgLTgwMiw4ICs3OTgsOSBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotCWRldl9kYmcgKCZ0aGVfdHBzLT5jbGllbnQuZGV2LCAibGVkJWlfcGVyICAweCUwMnhcbiIsIGxlZCwKLQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsIFRQU19MRUQxX1BFUiArIG9mZnMpKTsKKwlwcl9kZWJ1ZygiJXM6IGxlZCVpX3BlciAgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwgbGVkLAorCQlpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwKKwkJCQlUUFNfTEVEMV9QRVIgKyBvZmZzKSk7CiAKIAl1cCgmdGhlX3Rwcy0+bG9jayk7CiAKQEAgLTg3NCw3ICs4NzEsNyBAQAogCiAJaWYgKHN0YXR1cyAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gd3JpdGUgdmRjZGMxIHJlZ2lzdGVyXG4iLAotCQkgICAgICAgRFJJVkVSX05BTUUpOworCQkJRFJJVkVSX05BTUUpOwogCWVsc2UKIAkJcHJfZGVidWcoIiVzOiB2ZGNkYzEgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwKIAkJCWkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YSgmdGhlX3Rwcy0+Y2xpZW50LCBUUFNfVkRDREMxKSk7CkBAIC05MDAsMTQgKzg5NywxNCBAQAogCWRvd24oJnRoZV90cHMtPmxvY2spOwogCiAJcHJfZGVidWcoIiVzOiB2cmVnczEgMHglMDJ4XG4iLCBEUklWRVJfTkFNRSwKLQkJICAgICAgICBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwgVFBTX1ZSRUdTMSkpOworCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsIFRQU19WUkVHUzEpKTsKIAogCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoJnRoZV90cHMtPmNsaWVudCwKIAkJCVRQU19WUkVHUzEsIHZhbHVlKTsKIAogCWlmIChzdGF0dXMgIT0gMCkKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIHdyaXRlIHZyZWdzMSByZWdpc3RlclxuIiwKLQkJICAgICAgICBEUklWRVJfTkFNRSk7CisJCQlEUklWRVJfTkFNRSk7CiAJZWxzZQogCQlwcl9kZWJ1ZygiJXM6IHZyZWdzMSAweCUwMnhcbiIsIERSSVZFUl9OQU1FLAogCQkJaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKCZ0aGVfdHBzLT5jbGllbnQsIFRQU19WUkVHUzEpKTsKQEAgLTEwMDksNyArMTAwNiw3IEBACiAJCW1zbGVlcCgxMCk7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNKQorI2lmZGVmCUNPTkZJR19BUk0KIAlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CiAKIAkJLy8gRklYTUU6IE1vcmUgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gY29kZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jIGIvZHJpdmVycy9pMmMvY2hpcHMvdmlhNjg2YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdkOWI3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL3ZpYTY4NmEuYworKysgL2Rldi9udWxsCkBAIC0xLDg3NSArMCwwIEBACi0vKgotICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKLSAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwotCi0gICAgQ29weXJpZ2h0IChjKSAxOTk4IC0gMjAwMiAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKLQkJCU1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4sCi0JCQlhbmQgQm9iIERvdWdoZXJ0eSA8Ym9iZEBzdGFuZm9yZC5lZHU+Ci0gICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwotICAgIDxqLnRlaEBpbmFtZS5jb20+IGFuZCBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+LikKLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotKi8KLQotLyoKLSAgICBTdXBwb3J0cyB0aGUgVmlhIFZUODJDNjg2QSwgVlQ4MkM2ODZCIHNvdXRoIGJyaWRnZXMuCi0gICAgUmVwb3J0cyBhbGwgYXMgYSA2ODZBLgotICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1zZW5zb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLQotLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCi0gICB0aGUgZGV2aWNlIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2FkZHIgPSAwOwotbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCi0JCSAiSW5pdGlhbGl6ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBzZW5zb3JzIik7Ci0KLS8qIEFkZHJlc3NlcyB0byBzY2FuLgotICAgTm90ZSB0aGF0IHdlIGNhbid0IGRldGVybWluZSB0aGUgSVNBIGFkZHJlc3MgdW50aWwgd2UgaGF2ZSBpbml0aWFsaXplZAotICAgb3VyIG1vZHVsZSAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgSTJDX0NMSUVOVF9FTkQgfTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm9ybWFsX2lzYVtdID0geyAweDAwMDAsIEkyQ19DTElFTlRfSVNBX0VORCB9OwotCi0vKiBJbnNtb2QgcGFyYW1ldGVycyAqLwotU0VOU09SU19JTlNNT0RfMSh2aWE2ODZhKTsKLQotLyoKLSAgIFRoZSBWaWEgNjg2YSBzb3V0aGJyaWRnZSBoYXMgYSBMTTc4LWxpa2UgY2hpcCBpbnRlZ3JhdGVkIG9uIHRoZSBzYW1lIElDLgotICAgVGhpcyBkcml2ZXIgaXMgYSBjdXN0b21pemVkIGNvcHkgb2YgbG03OC5jCi0qLwotCi0vKiBNYW55IFZJQTY4NkEgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLwotCi0vKiBMZW5ndGggb2YgSVNBIGFkZHJlc3Mgc2VnbWVudCAqLwotI2RlZmluZSBWSUE2ODZBX0VYVEVOVAkJMHg4MAotI2RlZmluZSBWSUE2ODZBX0JBU0VfUkVHCTB4NzAKLSNkZWZpbmUgVklBNjg2QV9FTkFCTEVfUkVHCTB4NzQKLQotLyogVGhlIFZJQTY4NkEgcmVnaXN0ZXJzICovCi0vKiBpbnMgbnVtYmVyZWQgMC00ICovCi0jZGVmaW5lIFZJQTY4NkFfUkVHX0lOX01BWChucikJKDB4MmIgKyAoKG5yKSAqIDIpKQotI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NSU4obnIpCSgweDJjICsgKChucikgKiAyKSkKLSNkZWZpbmUgVklBNjg2QV9SRUdfSU4obnIpCSgweDIyICsgKG5yKSkKLQotLyogZmFucyBudW1iZXJlZCAxLTIgKi8KLSNkZWZpbmUgVklBNjg2QV9SRUdfRkFOX01JTihucikJKDB4M2EgKyAobnIpKQotI2RlZmluZSBWSUE2ODZBX1JFR19GQU4obnIpCSgweDI4ICsgKG5yKSkKLQotLyogdGVtcHMgbnVtYmVyZWQgMS0zICovCi1zdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUFtdCT0geyAweDIwLCAweDIxLCAweDFmIH07Ci1zdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUF9PVkVSW10JPSB7IDB4MzksIDB4M2QsIDB4MWQgfTsKLXN0YXRpYyBjb25zdCB1OCBWSUE2ODZBX1JFR19URU1QX0hZU1RbXQk9IHsgMHgzYSwgMHgzZSwgMHgxZSB9OwotLyogYml0cyA3LTYgKi8KLSNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIKLS8qIDIgPSBiaXRzIDUtNCwgMyA9IGJpdHMgNy02ICovCi0jZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMJMHg0OQotCi0jZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMQkweDQxCi0jZGVmaW5lIFZJQTY4NkFfUkVHX0FMQVJNMgkweDQyCi0jZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJVgkweDQ3Ci0jZGVmaW5lIFZJQTY4NkFfUkVHX0NPTkZJRwkweDQwCi0vKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHNldHMgdGVtcCBpbnRlcnJ1cHQgbW9kZSAoYml0cyAxLTAgZm9yIHRlbXAxLAotIDMtMiBmb3IgdGVtcDIsIDUtNCBmb3IgdGVtcDMpLiAgTW9kZXMgYXJlOgotICAgIDAwIGludGVycnVwdCBzdGF5cyBhcyBsb25nIGFzIHZhbHVlIGlzIG91dC1vZi1yYW5nZQotICAgIDAxIGludGVycnVwdCBpcyBjbGVhcmVkIG9uY2UgcmVnaXN0ZXIgaXMgcmVhZCAoZGVmYXVsdCkKLSAgICAxMCBjb21wYXJhdG9yIG1vZGUtIGxpa2UgMDAsIGJ1dCBpZ25vcmVzIGh5c3RlcmVzaXMKLSAgICAxMSBzYW1lIGFzIDAwICovCi0jZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVBfTU9ERQkJMHg0YgotLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCi0jZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX01BU0sJCTB4M0YKLSNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUwkweDAwCi0KLS8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRwotICAgdmFyaWFudHMuCi0KLSoqKioqKioqKiBWT0xUQUdFIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKgotIEZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldyk6Ci0gdm9sdGFnZWZhY3RvclswXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vIFZjY3AKLSB2b2x0YWdlZmFjdG9yWzFdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gKzIuNVYKLSB2b2x0YWdlZmFjdG9yWzJdPTEuNjcvMjYyODsgKDI2MjgvMS42Nz0xNTczLjcpICAgLy8gKzMuM1YKLSB2b2x0YWdlZmFjdG9yWzNdPTIuNi8yNjI4OyAgKDI2MjgvMi42MD0xMDEwLjgpICAgLy8gKzVWCi0gdm9sdGFnZWZhY3Rvcls0XT02LjMvMjYyODsgICgyNjI4LzYuMzA9NDE3LjE0KSAgIC8vICsxMlYKLSBpbltpXT0oZGF0YVtpKzJdKjI1LjArMTMzKSp2b2x0YWdlZmFjdG9yW2ldOwotIFRoYXQgaXM6Ci0gdm9sdHMgPSAoMjUqcmVnVmFsKzEzMykqZmFjdG9yCi0gcmVnVmFsID0gKHZvbHRzL2ZhY3Rvci0xMzMpLzI1Ci0gKFRoZXNlIGNvbnZlcnNpb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3Ci0gPGoudGVoQGluYW1lLmNvbT4pICovCi1zdGF0aWMgaW5saW5lIHU4IElOX1RPX1JFRyhsb25nIHZhbCwgaW50IGluTnVtKQotewotCS8qIFRvIGF2b2lkIGZsb2F0aW5nIHBvaW50LCB3ZSBtdWx0aXBseSBjb25zdGFudHMgYnkgMTAgKDEwMCBmb3IgKzEyVikuCi0JICAgUm91bmRpbmcgaXMgZG9uZSAoMTIwNTAwIGlzIGFjdHVhbGx5IDEzMzAwMCAtIDEyNTAwKS4KLQkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQotCSAgIGJ5IGFuIGFkZGl0aW9uYWwgMTAwMDAgKDEwMDAwMCBmb3IgKzEyVik6IDEwMDAgZm9yIHZhbCBhbmQgMTAgKDEwMCkKLQkgICBmb3IgdGhlIGNvbnN0YW50cy4gKi8KLQlpZiAoaW5OdW0gPD0gMSkKLQkJcmV0dXJuICh1OCkKLQkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDIxMDI0IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7Ci0JZWxzZSBpZiAoaW5OdW0gPT0gMikKLQkJcmV0dXJuICh1OCkKLQkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDE1NzM3IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7Ci0JZWxzZSBpZiAoaW5OdW0gPT0gMykKLQkJcmV0dXJuICh1OCkKLQkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDEwMTA4IC0gMTIwNTAwMCkgLyAyNTAwMDAsIDAsIDI1NSk7Ci0JZWxzZQotCQlyZXR1cm4gKHU4KQotCQkgICAgU0VOU09SU19MSU1JVCgodmFsICogNDE3MTQgLSAxMjA1MDAwMCkgLyAyNTAwMDAwLCAwLCAyNTUpOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgSU5fRlJPTV9SRUcodTggdmFsLCBpbnQgaW5OdW0pCi17Ci0JLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KLQkgICBXZSBhbHNvIG11bHRpcGx5IHRoZW0gYnkgMTAwMCBiZWNhdXNlIHdlIHdhbnQgMC4wMDFWL2JpdCBmb3IgdGhlCi0JICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLwotCWlmIChpbk51bSA8PSAxKQotCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDIxMDI0IC8gMikgLyAyMTAyNCk7Ci0JZWxzZSBpZiAoaW5OdW0gPT0gMikKLQkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAxNTczNyAvIDIpIC8gMTU3MzcpOwotCWVsc2UgaWYgKGluTnVtID09IDMpCi0JCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKLQllbHNlCi0JCXJldHVybiAobG9uZykgKCgyNTAwMDAwICogdmFsICsgMTMzMDAwMDAgKyA0MTcxNCAvIDIpIC8gNDE3MTQpOwotfQotCi0vKioqKioqKioqIEZBTiBSUE0gQ09OVkVSU0lPTlMgKioqKioqKiovCi0vKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KLSBCdXQgdGhpcyBjaGlwIHNhdHVyYXRlcyBiYWNrIGF0IDAsIG5vdCBhdCAyNTUgbGlrZSBhbGwgdGhlIG90aGVyIGNoaXBzLgotIFNvLCAwIG1lYW5zIDAgUlBNICovCi1zdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCi17Ci0JaWYgKHJwbSA9PSAwKQotCQlyZXR1cm4gMDsKLQlycG0gPSBTRU5TT1JTX0xJTUlUKHJwbSwgMSwgMTAwMDAwMCk7Ci0JcmV0dXJuIFNFTlNPUlNfTElNSVQoKDEzNTAwMDAgKyBycG0gKiBkaXYgLyAyKSAvIChycG0gKiBkaXYpLCAxLCAyNTUpOwotfQotCi0jZGVmaW5lIEZBTl9GUk9NX1JFRyh2YWwsZGl2KSAoKHZhbCk9PTA/MDoodmFsKT09MjU1PzA6MTM1MDAwMC8oKHZhbCkqKGRpdikpKQotCi0vKioqKioqKiogVEVNUCBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioqLwotLyogbGluZWFyIGZpdHMgZnJvbSBIV01vbi5jcHAgKENvcHlyaWdodCAxOTk4LTIwMDAgSm9uYXRoYW4gVGVoIFNvb24gWWV3KQotICAgICAgaWYodGVtcDwxNjkpCi0gICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC40MjctMzIuMDg7Ci0gICAgICBlbHNlIGlmKHRlbXA+PTE2OSAmJiB0ZW1wPD0yMDIpCi0gICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7Ci0gICAgICBlbHNlCi0gICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC45MjQtMTI3LjMzOwotCi0gQSBmaWZ0aC1vcmRlciBwb2x5bm9taWFsIGZpdHMgdGhlIHVub2ZmaWNpYWwgZGF0YSAocHJvdmlkZWQgYnkgQWxleCB2YW4KLSBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+KSBhIGJpdCBiZXR0ZXIuICBJdCBhbHNvIGdpdmUgbW9yZSByZWFzb25hYmxlCi0gbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCi0gSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6Ci0gdGVtcCA9IDEuNjI1MDkzZS0xMCp2YWxeNSAtIDEuMDAxNjMyZS0wNyp2YWxeNCArIDIuNDU3NjUzZS0wNSp2YWxeMyAtCi0gICAgICAgIDIuOTY3NjE5ZS0wMyp2YWxeMiArIDIuMTc1MTQ0ZS0wMSp2YWwgLSA3LjA5MDA2N2UrMC4KLQotICgyMDAwLTEwLTI1LSBSRkQ6IHRoYW5rcyB0byBVd2UgQW5kZXJzZW4gPHVhbmRlcnNlbkBtYXlhaC5jb20+IGZvcgotIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKLQotIEFsYXMsIG5vbmUgb2YgdGhlIGVsZWdhbnQgZnVuY3Rpb24tZml0IHNvbHV0aW9ucyB3aWxsIHdvcmsgYmVjYXVzZSB3ZQotIGFyZW4ndCBhbGxvd2VkIHRvIHVzZSBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsIGFuZCBkb2luZyBpdCB3aXRoCi0gaW50ZWdlcnMgZG9lc24ndCBwcm92aWRlIGVub3VnaCBwcmVjaXNpb24uICBTbyB3ZSdsbCBkbyBib3Jpbmcgb2xkCi0gbG9vay11cCB0YWJsZSBzdHVmZi4gIFRoZSB1bm9mZmljaWFsIGRhdGEgKHNlZSBiZWxvdykgaGF2ZSBlZmZlY3RpdmVseQotIDctYml0IHJlc29sdXRpb24gKHRoZXkgYXJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgZGVncmVlKS4gIEknbSBhc3N1bWluZwotIHRoYXQgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uIG9mIHRoZSBkZXZpY2UgaXMgbW9ub3RvbmljIGFuZCBzbW9vdGgsIHNvIGEKLSBzbW9vdGggZnVuY3Rpb24gZml0IHRvIHRoZSBkYXRhIHdpbGwgYWxsb3cgdXMgdG8gZ2V0IGJldHRlciBwcmVjaXNpb24uCi0gSSB1c2VkIHRoZSA1dGgtb3JkZXIgcG9seSBmaXQgZGVzY3JpYmVkIGFib3ZlIGFuZCBzb2x2ZWQgZm9yCi0gVklBIHJlZ2lzdGVyIHZhbHVlcyAwLTI1NS4gIEkgKjEwIGJlZm9yZSByb3VuZGluZywgc28gd2UgZ2V0IHRlbnRoLWRlZ3JlZQotIHByZWNpc2lvbi4gIChJIGNvdWxkIGhhdmUgZG9uZSBhbGwgMTAyNCB2YWx1ZXMgZm9yIG91ciAxMC1iaXQgcmVhZGluZ3MsCi0gYnV0IHRoZSBmdW5jdGlvbiBpcyB2ZXJ5IGxpbmVhciBpbiB0aGUgdXNlZnVsIHJhbmdlICgwLTgwIGRlZyBDKSwgc28KLSB3ZSdsbCBqdXN0IHVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgMTAtYml0IHJlYWRpbmdzLikgIFNvLCB0ZW1wTFVUCi0gaXMgdGhlIHRlbXAgYXQgdmlhIHJlZ2lzdGVyIHZhbHVlcyAwLTI1NTogKi8KLXN0YXRpYyBjb25zdCBsb25nIHRlbXBMVVRbXSA9Ci17IC03MDksIC02ODgsIC02NjcsIC02NDYsIC02MjcsIC02MDcsIC01ODksIC01NzAsIC01NTMsIC01MzYsIC01MTksCi0JLTUwMywgLTQ4NywgLTQ3MSwgLTQ1NiwgLTQ0MiwgLTQyOCwgLTQxNCwgLTQwMCwgLTM4NywgLTM3NSwKLQktMzYyLCAtMzUwLCAtMzM5LCAtMzI3LCAtMzE2LCAtMzA1LCAtMjk1LCAtMjg1LCAtMjc1LCAtMjY1LAotCS0yNTUsIC0yNDYsIC0yMzcsIC0yMjksIC0yMjAsIC0yMTIsIC0yMDQsIC0xOTYsIC0xODgsIC0xODAsCi0JLTE3MywgLTE2NiwgLTE1OSwgLTE1MiwgLTE0NSwgLTEzOSwgLTEzMiwgLTEyNiwgLTEyMCwgLTExNCwKLQktMTA4LCAtMTAyLCAtOTYsIC05MSwgLTg1LCAtODAsIC03NCwgLTY5LCAtNjQsIC01OSwgLTU0LCAtNDksCi0JLTQ0LCAtMzksIC0zNCwgLTI5LCAtMjUsIC0yMCwgLTE1LCAtMTEsIC02LCAtMiwgMywgNywgMTIsIDE2LAotCTIwLCAyNSwgMjksIDMzLCAzNywgNDIsIDQ2LCA1MCwgNTQsIDU5LCA2MywgNjcsIDcxLCA3NSwgNzksIDg0LAotCTg4LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDksIDExMywgMTE3LCAxMjEsIDEyNSwgMTMwLCAxMzQsIDEzOCwKLQkxNDIsIDE0NiwgMTUxLCAxNTUsIDE1OSwgMTYzLCAxNjgsIDE3MiwgMTc2LCAxODEsIDE4NSwgMTg5LAotCTE5MywgMTk4LCAyMDIsIDIwNiwgMjExLCAyMTUsIDIxOSwgMjI0LCAyMjgsIDIzMiwgMjM3LCAyNDEsCi0JMjQ1LCAyNTAsIDI1NCwgMjU5LCAyNjMsIDI2NywgMjcyLCAyNzYsIDI4MSwgMjg1LCAyOTAsIDI5NCwKLQkyOTksIDMwMywgMzA3LCAzMTIsIDMxNiwgMzIxLCAzMjUsIDMzMCwgMzM0LCAzMzksIDM0NCwgMzQ4LAotCTM1MywgMzU3LCAzNjIsIDM2NiwgMzcxLCAzNzYsIDM4MCwgMzg1LCAzOTAsIDM5NSwgMzk5LCA0MDQsCi0JNDA5LCA0MTQsIDQxOSwgNDIzLCA0MjgsIDQzMywgNDM4LCA0NDMsIDQ0OSwgNDU0LCA0NTksIDQ2NCwKLQk0NjksIDQ3NSwgNDgwLCA0ODYsIDQ5MSwgNDk3LCA1MDIsIDUwOCwgNTE0LCA1MjAsIDUyNiwgNTMyLAotCTUzOCwgNTQ0LCA1NTEsIDU1NywgNTY0LCA1NzEsIDU3OCwgNTg0LCA1OTIsIDU5OSwgNjA2LCA2MTQsCi0JNjIxLCA2MjksIDYzNywgNjQ1LCA2NTQsIDY2MiwgNjcxLCA2ODAsIDY4OSwgNjk4LCA3MDgsIDcxOCwKLQk3MjgsIDczOCwgNzQ5LCA3NTksIDc3MCwgNzgyLCA3OTMsIDgwNSwgODE4LCA4MzAsIDg0MywgODU2LAotCTg3MCwgODgzLCA4OTgsIDkxMiwgOTI3LCA5NDMsIDk1OCwgOTc1LCA5OTEsIDEwMDgsIDEwMjYsIDEwNDQsCi0JMTA2MiwgMTA4MSwgMTEwMSwgMTEyMSwgMTE0MSwgMTE2MiwgMTE4NCwgMTIwNiwgMTIyOSwgMTI1MiwKLQkxMjc2LCAxMzAxLCAxMzI2LCAxMzUyLCAxMzc4LCAxNDA2LCAxNDM0LCAxNDYyCi19OwotCi0vKiB0aGUgb3JpZ2luYWwgTFVUIHZhbHVlcyBmcm9tIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4KLSAgIChmb3IgdmlhIHJlZ2lzdGVyIHZhbHVlcyAxMi0yNDApOgotey01MCwtNDksLTQ3LC00NSwtNDMsLTQxLC0zOSwtMzgsLTM3LC0zNSwtMzQsLTMzLC0zMiwtMzEsCi0tMzAsLTI5LC0yOCwtMjcsLTI2LC0yNSwtMjQsLTI0LC0yMywtMjIsLTIxLC0yMCwtMjAsLTE5LC0xOCwtMTcsLTE3LC0xNiwtMTUsCi0tMTUsLTE0LC0xNCwtMTMsLTEyLC0xMiwtMTEsLTExLC0xMCwtOSwtOSwtOCwtOCwtNywtNywtNiwtNiwtNSwtNSwtNCwtNCwtMywKLS0zLC0yLC0yLC0xLC0xLDAsMCwxLDEsMSwzLDMsMyw0LDQsNCw1LDUsNSw2LDYsNyw3LDgsOCw5LDksOSwxMCwxMCwxMSwxMSwxMiwKLTEyLDEyLDEzLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIxLDIyLDIyLAotMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjYsMjcsMjcsMjcsMjgsMjgsMjksMjksMzAsMzAsMzAsMzEsMzEsMzIsMzIsMzMsCi0zMywzNCwzNCwzNSwzNSwzNSwzNiwzNiwzNywzNywzOCwzOCwzOSwzOSw0MCw0MCw0MSw0MSw0Miw0Miw0Myw0Myw0NCw0NCw0NSwKLTQ1LDQ2LDQ2LDQ3LDQ4LDQ4LDQ5LDQ5LDUwLDUxLDUxLDUyLDUyLDUzLDUzLDU0LDU1LDU1LDU2LDU3LDU3LDU4LDU5LDU5LDYwLAotNjEsNjIsNjIsNjMsNjQsNjUsNjYsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODMsODQsCi04NSw4Niw4OCw4OSw5MSw5Miw5NCw5Niw5Nyw5OSwxMDEsMTAzLDEwNSwxMDcsMTA5LDExMH07Ci0KLQotIEhlcmUncyB0aGUgcmV2ZXJzZSBMVVQuICBJIGdvdCBpdCBieSBkb2luZyBhIDYtdGggb3JkZXIgcG9seSBmaXQgKG5lZWRlZAotIGFuIGV4dHJhIHRlcm0gZm9yIGEgZ29vZCBmaXQgdG8gdGhlc2UgaW52ZXJzZSBkYXRhISkgYW5kIHRoZW4KLSBzb2x2aW5nIGZvciBlYWNoIHRlbXAgdmFsdWUgZnJvbSAtNTAgdG8gMTEwICh0aGUgdXNlYWJsZSByYW5nZSBmb3IKLSB0aGlzIGNoaXApLiAgSGVyZSdzIHRoZSBmaXQ6Ci0gdmlhUmVnVmFsID0gLTEuMTYwMzcwZS0xMCp2YWxeNiArMy4xOTM2OTNlLTA4KnZhbF41IC0gMS40NjQ0NDdlLTA2KnZhbF40Ci0gLSAyLjUyNTQ1M2UtMDQqdmFsXjMgKyAxLjQyNDU5M2UtMDIqdmFsXjIgKyAyLjE0ODk0MWUrMDAqdmFsICs3LjI3NTgwOGUrMDEpCi0gTm90ZSB0aGF0IG49MTYxOiAqLwotc3RhdGljIGNvbnN0IHU4IHZpYUxVVFtdID0KLXsgMTIsIDEyLCAxMywgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNywgMTgsIDE4LCAxOSwgMjAsIDIwLCAyMSwgMjIsIDIzLAotCTIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzUsIDM2LCAzNywgMzksIDQwLAotCTQxLCA0MywgNDUsIDQ2LCA0OCwgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjAsIDYyLCA2NCwgNjYsCi0JNjksIDcxLCA3MywgNzUsIDc3LCA3OSwgODIsIDg0LCA4NiwgODgsIDkxLCA5MywgOTUsIDk4LCAxMDAsCi0JMTAzLCAxMDUsIDEwNywgMTEwLCAxMTIsIDExNSwgMTE3LCAxMTksIDEyMiwgMTI0LCAxMjYsIDEyOSwKLQkxMzEsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0NywgMTUwLCAxNTIsIDE1NCwgMTU2LAotCTE1OCwgMTYwLCAxNjIsIDE2NCwgMTY2LCAxNjgsIDE3MCwgMTcyLCAxNzQsIDE3NiwgMTc4LCAxODAsCi0JMTgyLCAxODMsIDE4NSwgMTg3LCAxODgsIDE5MCwgMTkyLCAxOTMsIDE5NSwgMTk2LCAxOTgsIDE5OSwKLQkyMDAsIDIwMiwgMjAzLCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLAotCTIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMiwgMjIzLCAyMjQsCi0JMjI1LCAyMjYsIDIyNiwgMjI3LCAyMjgsIDIyOCwgMjI5LCAyMzAsIDIzMCwgMjMxLCAyMzIsIDIzMiwKLQkyMzMsIDIzMywgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM5LAotCTIzOSwgMjQwCi19OwotCi0vKiBDb252ZXJ0aW5nIHRlbXBzIHRvICg4LWJpdCkgaHlzdCBhbmQgb3ZlciByZWdpc3RlcnMKLSAgIE5vIGludGVycG9sYXRpb24gaGVyZS4KLSAgIFRoZSArNTAgaXMgYmVjYXVzZSB0aGUgdGVtcHMgc3RhcnQgYXQgLTUwICovCi1zdGF0aWMgaW5saW5lIHU4IFRFTVBfVE9fUkVHKGxvbmcgdmFsKQotewotCXJldHVybiB2aWFMVVRbdmFsIDw9IC01MDAwMCA/IDAgOiB2YWwgPj0gMTEwMDAwID8gMTYwIDoKLQkJICAgICAgKHZhbCA8IDAgPyB2YWwgLSA1MDAgOiB2YWwgKyA1MDApIC8gMTAwMCArIDUwXTsKLX0KLQotLyogZm9yIDgtYml0IHRlbXBlcmF0dXJlIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFRFTVBfRlJPTV9SRUcodmFsKSAodGVtcExVVFsodmFsKV0gKiAxMDApCi0KLS8qIGZvciAxMC1iaXQgdGVtcGVyYXR1cmUgcmVhZGluZ3MgKi8KLXN0YXRpYyBpbmxpbmUgbG9uZyBURU1QX0ZST01fUkVHMTAodTE2IHZhbCkKLXsKLQl1MTYgZWlnaHRCaXRzID0gdmFsID4+IDI7Ci0JdTE2IHR3b0JpdHMgPSB2YWwgJiAzOwotCi0JLyogbm8gaW50ZXJwb2xhdGlvbiBmb3IgdGhlc2UgKi8KLQlpZiAodHdvQml0cyA9PSAwIHx8IGVpZ2h0Qml0cyA9PSAyNTUpCi0JCXJldHVybiBURU1QX0ZST01fUkVHKGVpZ2h0Qml0cyk7Ci0KLQkvKiBkbyBzb21lIGxpbmVhciBpbnRlcnBvbGF0aW9uICovCi0JcmV0dXJuICh0ZW1wTFVUW2VpZ2h0Qml0c10gKiAoNCAtIHR3b0JpdHMpICsKLQkJdGVtcExVVFtlaWdodEJpdHMgKyAxXSAqIHR3b0JpdHMpICogMjU7Ci19Ci0KLSNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCi0jZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKLQotLyogRm9yIHRoZSBWSUE2ODZBLCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4KLSAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKLSAgIHZpYTY4NmEgY2xpZW50IGlzIGFsbG9jYXRlZC4gKi8KLXN0cnVjdCB2aWE2ODZhX2RhdGEgewotCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHVwZGF0ZV9sb2NrOwotCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KLQl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwotCi0JdTggaW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCi0JdTggaW5fbWluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQl1OCBmYW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXUxNiB0ZW1wWzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgMTAgYml0ICovCi0JdTggdGVtcF9vdmVyWzNdOwkvKiBSZWdpc3RlciB2YWx1ZSAqLwotCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KLQl1OCBmYW5fZGl2WzJdOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIHNoaWZ0ZWQgcmlnaHQgKi8KLQl1MTYgYWxhcm1zOwkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKnNfYnJpZGdlOwkvKiBwb2ludGVyIHRvIHRoZSAob25seSkgdmlhNjg2YSAqLwotCi1zdGF0aWMgaW50IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKLXN0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOwotc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHZpYTY4NmFfcmVhZF92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCi17Ci0JcmV0dXJuIChpbmJfcChjbGllbnQtPmFkZHIgKyByZWcpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZpYTY4NmFfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAotCQkJCSAgICAgICB1OCB2YWx1ZSkKLXsKLQlvdXRiX3AodmFsdWUsIGNsaWVudC0+YWRkciArIHJlZyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHZpYTY4NmFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7Ci0KLS8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotCi0vKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWluW25yXSwgbnIpKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewotCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0sIG5yKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBjb3VudCwgaW50IG5yKSB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT5pbl9taW5bbnJdID0gSU5fVE9fUkVHKHZhbCwgbnIpOwotCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLAotCQkJZGF0YS0+aW5fbWluW25yXSk7Ci0JdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgY291bnQsIGludCBucikgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0KLQlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKLQl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSwKLQkJCWRhdGEtPmluX21heFtucl0pOwotCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCi1zdGF0aWMgc3NpemVfdCAJCQkJCQkJXAotCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQkJXAotewkJCQkJCQkJXAotCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKLX0JCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IAkJCQkJCQlcCi0Jc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKLXsJCQkJCQkJCVwKLQlyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCi19CQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCAJCQkJCQkJXAotCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQlcCi0JcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOwkJXAotfQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAlcCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQlcCi17CQkJCQkJCQlcCi0JcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAotfQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2V0X2luIyNvZmZzZXQjI19tYXggKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAotewkJCQkJCQkJXAotCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKLX0JCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4jI29mZnNldCwgTlVMTCk7XAotc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAotCQlzaG93X2luIyNvZmZzZXQjI19taW4sIHNldF9pbiMjb2Zmc2V0IyNfbWluKTsJXAotc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLCAJXAotCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKLQotc2hvd19pbl9vZmZzZXQoMCk7Ci1zaG93X2luX29mZnNldCgxKTsKLXNob3dfaW5fb2Zmc2V0KDIpOwotc2hvd19pbl9vZmZzZXQoMyk7Ci1zaG93X2luX29mZnNldCg0KTsKLQotLyogMyB0ZW1wZXJhdHVyZXMgKi8KLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRzEwKGRhdGEtPnRlbXBbbnJdKSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfb3ZlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX2h5c3RbbnJdKSk7Ci19Ci1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgY291bnQsIGludCBucikgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCi0JZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPnRlbXBfb3Zlcltucl0gPSBURU1QX1RPX1JFRyh2YWwpOwotCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX09WRVJbbnJdLAotCQkJICAgIGRhdGEtPnRlbXBfb3Zlcltucl0pOwotCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JcmV0dXJuIGNvdW50OwotfQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKLQotCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT50ZW1wX2h5c3RbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKLQl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9IWVNUW25yXSwKLQkJCSAgICBkYXRhLT50ZW1wX2h5c3RbbnJdKTsKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLSNkZWZpbmUgc2hvd190ZW1wX29mZnNldChvZmZzZXQpCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAotewkJCQkJCQkJCVwKLQlyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCi1zaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93X3RlbXBfb3ZlcihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCi1zaG93X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfb3ZlciAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQlcCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAotewkJCQkJCQkJCVwKLQlyZXR1cm4gc2V0X3RlbXBfb3ZlcihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wXyMjb2Zmc2V0IyNfaHlzdCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgCQlcCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSAJCQkJXAotewkJCQkJCQkJCVwKLQlyZXR1cm4gc2V0X3RlbXBfaHlzdChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wXyMjb2Zmc2V0LCBOVUxMKTtcCi1zdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCi0JCXNob3dfdGVtcF8jI29mZnNldCMjX292ZXIsIHNldF90ZW1wXyMjb2Zmc2V0IyNfb3Zlcik7CVwKLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wIyNvZmZzZXQjI19tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAotCQlzaG93X3RlbXBfIyNvZmZzZXQjI19oeXN0LCBzZXRfdGVtcF8jI29mZnNldCMjX2h5c3QpOwotCi1zaG93X3RlbXBfb2Zmc2V0KDEpOwotc2hvd190ZW1wX29mZnNldCgyKTsKLXNob3dfdGVtcF9vZmZzZXQoMyk7Ci0KLS8qIDIgRmFucyAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewotCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sCi0JCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKLX0KLXN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQlGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Ci19Ci1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewotCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSApOwotfQotc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBjb3VudCwgaW50IG5yKSB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7Ci0KLQlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKHZhbCwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7Ci0JdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTl9NSU4obnIrMSksIGRhdGEtPmZhbl9taW5bbnJdKTsKLQl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgY291bnQsIGludCBucikgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCWludCBvbGQ7Ci0KLQlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0Jb2xkID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKLQlkYXRhLT5mYW5fZGl2W25yXSA9IERJVl9UT19SRUcodmFsKTsKLQlvbGQgPSAob2xkICYgMHgwZikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOwotCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7Ci0JdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLSNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93X2ZhbihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzaG93X2Zhbl9kaXYoZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzZXRfZmFuXyMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAJCVwKLQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzZXRfZmFuX21pbihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIAkJXAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKLXsJCQkJCQkJCQlcCi0JcmV0dXJuIHNldF9mYW5fZGl2KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0IC0gMSk7CQlcCi19CQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuXyMjb2Zmc2V0LCBOVUxMKTtcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKLQkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCi1zdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19kaXYsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKLQkJc2hvd19mYW5fIyNvZmZzZXQjI19kaXYsIHNldF9mYW5fIyNvZmZzZXQjI19kaXYpOwotCi1zaG93X2Zhbl9vZmZzZXQoMSk7Ci1zaG93X2Zhbl9vZmZzZXQoMik7Ci0KLS8qIEFsYXJtcyAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSB7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5hbGFybXMpOwotfQotc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwotCi0vKiBUaGUgZHJpdmVyLiBJIGNob29zZSB0byB1c2UgdHlwZSBpMmNfZHJpdmVyLCBhcyBhdCBpcyBpZGVudGljYWwgdG8gYm90aAotICAgc21idXNfZHJpdmVyIGFuZCBpc2FfZHJpdmVyLCBhbmQgY2xpZW50cyBjb3VsZCBiZSBvZiBlaXRoZXIga2luZCAqLwotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZpYTY4NmFfZHJpdmVyID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAidmlhNjg2YSIsCi0JLmlkCQk9IEkyQ19EUklWRVJJRF9WSUE2ODZBLAotCS5mbGFncwkJPSBJMkNfREZfTk9USUZZLAotCS5hdHRhY2hfYWRhcHRlcgk9IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIsCi0JLmRldGFjaF9jbGllbnQJPSB2aWE2ODZhX2RldGFjaF9jbGllbnQsCi19OwotCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQgKi8KLXN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaTJjX2RldGVjdChhZGFwdGVyLCAmYWRkcl9kYXRhLCB2aWE2ODZhX2RldGVjdCk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlhNjg2YV9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YTsKLQlpbnQgZXJyID0gMDsKLQljb25zdCBjaGFyIGNsaWVudF9uYW1lW10gPSAidmlhNjg2YSI7Ci0JdTE2IHZhbDsKLQotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcHJvYmluZyB0aGUgSVNBIGJ1cyEhICAqLwotCWlmICghaTJjX2lzX2lzYV9hZGFwdGVyKGFkYXB0ZXIpKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPmRldiwKLQkJInZpYTY4NmFfZGV0ZWN0IGNhbGxlZCBmb3IgYW4gSTJDIGJ1cyBhZGFwdGVyPyE/XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogODIzMSByZXF1aXJlcyBtdWx0aXBsZSBvZiAyNTYsIHdlIGVuZm9yY2UgdGhhdCBvbiA2ODYgYXMgd2VsbCAqLwotCWlmIChmb3JjZV9hZGRyKQotCQlhZGRyZXNzID0gZm9yY2VfYWRkciAmIDB4RkYwMDsKLQotCWlmIChmb3JjZV9hZGRyKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJmb3JjaW5nIElTQSBhZGRyZXNzIDB4JTA0WFxuIiwKLQkJCSBhZGRyZXNzKTsKLQkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzKSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9Ci0JICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0VOQUJMRV9SRUcsICZ2YWwpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoISh2YWwgJiAweDAwMDEpKSB7Ci0JCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJlbmFibGluZyBzZW5zb3JzXG4iKTsKLQkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQotCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNfYnJpZGdlLCBWSUE2ODZBX0VOQUJMRV9SRUcsCi0JCQkJCSAgdmFsIHwgMHgwMDAxKSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIFJlc2VydmUgdGhlIElTQSByZWdpb24gKi8KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5ULCB2aWE2ODZhX2RyaXZlci5uYW1lKSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJyZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsCi0JCQlhZGRyZXNzKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaWYgKCEoZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aWE2ODZhX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBFUlJPUjA7Ci0JfQotCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSkpOwotCi0JbmV3X2NsaWVudCA9ICZkYXRhLT5jbGllbnQ7Ci0JaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOwotCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwotCW5ld19jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOwotCW5ld19jbGllbnQtPmRyaXZlciA9ICZ2aWE2ODZhX2RyaXZlcjsKLQluZXdfY2xpZW50LT5mbGFncyA9IDA7Ci0KLQkvKiBGaWxsIGluIHRoZSByZW1haW5pbmcgY2xpZW50IGZpZWxkcyBhbmQgcHV0IGludG8gdGhlIGdsb2JhbCBsaXN0ICovCi0Jc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7Ci0KLQlkYXRhLT52YWxpZCA9IDA7Ci0JaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCS8qIFRlbGwgdGhlIEkyQyBsYXllciBhIG5ldyBjbGllbnQgaGFzIGFycml2ZWQgKi8KLQlpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKLQkJZ290byBFUlJPUjM7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBWSUE2ODZBIGNoaXAgKi8KLQl2aWE2ODZhX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwotCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9pbnB1dCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19pbnB1dCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX21pbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWluKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX21pbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWluKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21heCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfbWF4KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21heCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19pbnB1dCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXgpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMV9tYXhfaHlzdCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXhfaHlzdCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wM19tYXhfaHlzdCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX2lucHV0KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9taW4pOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9taW4pOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMl9kaXYpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKLQotCXJldHVybiAwOwotCi1FUlJPUjM6Ci0Ja2ZyZWUoZGF0YSk7Ci1FUlJPUjA6Ci0JcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgVklBNjg2QV9FWFRFTlQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgdmlhNjg2YV9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JaW50IGVycjsKLQotCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCSJDbGllbnQgZGVyZWdpc3RyYXRpb24gZmFpbGVkLCBjbGllbnQgbm90IGRldGFjaGVkLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmVsZWFzZV9yZWdpb24oY2xpZW50LT5hZGRyLCBWSUE2ODZBX0VYVEVOVCk7Ci0Ja2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHdlIGhhdmUgZm91bmQgYSBuZXcgVklBNjg2QS4gU2V0IGxpbWl0cywgZXRjLiAqLwotc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXU4IHJlZzsKLQotCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KLQlyZWcgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19DT05GSUcpOwotCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19DT05GSUcsIChyZWd8MHgwMSkmMHg3Rik7Ci0KLQkvKiBDb25maWd1cmUgdGVtcCBpbnRlcnJ1cHQgbW9kZSBmb3IgY29udGludW91cy1pbnRlcnJ1cHQgb3BlcmF0aW9uICovCi0JdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSwKLQkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUpICYKLQkJCSAgICAhKFZJQTY4NkFfVEVNUF9NT0RFX01BU0sgfCBWSUE2ODZBX1RFTVBfTU9ERV9DT05USU5VT1VTKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlhNjg2YV9kYXRhICp2aWE2ODZhX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWludCBpOwotCi0JZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCi0JICAgIHx8ICFkYXRhLT52YWxpZCkgewotCQlmb3IgKGkgPSAwOyBpIDw9IDQ7IGkrKykgewotCQkJZGF0YS0+aW5baV0gPQotCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOKGkpKTsKLQkJCWRhdGEtPmluX21pbltpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCi0JCQkJCQkJICAgICBWSUE2ODZBX1JFR19JTl9NSU4KLQkJCQkJCQkgICAgIChpKSk7Ci0JCQlkYXRhLT5pbl9tYXhbaV0gPQotCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01BWChpKSk7Ci0JCX0KLQkJZm9yIChpID0gMTsgaSA8PSAyOyBpKyspIHsKLQkJCWRhdGEtPmZhbltpIC0gMV0gPQotCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTihpKSk7Ci0JCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCi0JCQkJCQkgICAgIFZJQTY4NkFfUkVHX0ZBTl9NSU4oaSkpOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7Ci0JCQlkYXRhLT50ZW1wW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkJCSBWSUE2ODZBX1JFR19URU1QW2ldKSA8PCAyOwotCQkJZGF0YS0+dGVtcF9vdmVyW2ldID0KLQkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAotCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9PVkVSW2ldKTsKLQkJCWRhdGEtPnRlbXBfaHlzdFtpXSA9Ci0JCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtpXSk7Ci0JCX0KLQkJLyogYWRkIGluIGxvd2VyIDIgYml0cwotCQkgICB0ZW1wMSB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQotCQkgICB0ZW1wMiB1c2VzIGJpdHMgNS00IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMKLQkJICAgdGVtcDMgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCi0JCSAqLwotCQlkYXRhLT50ZW1wWzBdIHw9ICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAotCQkJCQkJICAgICBWSUE2ODZBX1JFR19URU1QX0xPVzEpCi0JCQkJICAmIDB4YzApID4+IDY7Ci0JCWRhdGEtPnRlbXBbMV0gfD0KLQkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0xPVzIzKSAmCi0JCSAgICAgMHgzMCkgPj4gNDsKLQkJZGF0YS0+dGVtcFsyXSB8PQotCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKLQkJICAgICAweGMwKSA+PiA2OwotCi0JCWkgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOwotCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOwotCQlkYXRhLT5mYW5fZGl2WzFdID0gaSA+PiA2OwotCQlkYXRhLT5hbGFybXMgPQotCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKLQkJCQkgICAgICAgVklBNjg2QV9SRUdfQUxBUk0xKSB8Ci0JCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQUxBUk0yKSA8PCA4KTsKLQkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKLQkJZGF0YS0+dmFsaWQgPSAxOwotCX0KLQotCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYTY4NmFfcGNpX2lkc1tdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNjg2XzQpIH0sCi0JeyAwLCB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdmlhNjg2YV9wY2lfaWRzKTsKLQotc3RhdGljIGludCBfX2RldmluaXQgdmlhNjg2YV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCXUxNiB2YWw7Ci0JaW50IGFkZHIgPSAwOwotCi0JaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQotCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFZJQTY4NkFfQkFTRV9SRUcsICZ2YWwpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWFkZHIgPSB2YWwgJiB+KFZJQTY4NkFfRVhURU5UIC0gMSk7Ci0JaWYgKGFkZHIgPT0gMCAmJiBmb3JjZV9hZGRyID09IDApIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJiYXNlIGFkZHJlc3Mgbm90IHNldCAtIHVwZ3JhZGUgQklPUyAiCi0JCQkib3IgdXNlIGZvcmNlX2FkZHI9MHhhZGRyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChmb3JjZV9hZGRyKQotCQlhZGRyID0gZm9yY2VfYWRkcjsJLyogc28gZGV0ZWN0IHdpbGwgZ2V0IGNhbGxlZCAqLwotCi0JaWYgKCFhZGRyKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiTm8gVmlhIDY4NkEgc2Vuc29ycyBmb3VuZC5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0Jbm9ybWFsX2lzYVswXSA9IGFkZHI7Ci0KLQlzX2JyaWRnZSA9IHBjaV9kZXZfZ2V0KGRldik7Ci0JaWYgKGkyY19hZGRfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcikpIHsKLQkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwotCQlzX2JyaWRnZSA9IE5VTEw7Ci0JfQotCi0JLyogQWx3YXlzIHJldHVybiBmYWlsdXJlIGhlcmUuICBUaGlzIGlzIHRvIGFsbG93IG90aGVyIGRyaXZlcnMgdG8gYmluZAotCSAqIHRvIHRoaXMgcGNpIGRldmljZS4gIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGhhdmUgY29udHJvbCBvdmVyIHRoZQotCSAqIHBjaSBkZXZpY2UsIHdlIG9ubHkgd2FudGVkIHRvIHJlYWQgYXMgZmV3IHJlZ2lzdGVyIHZhbHVlcyBmcm9tIGl0LgotCSAqLwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdmlhNjg2YV9wY2lfZHJpdmVyID0gewotCS5uYW1lCQk9ICJ2aWE2ODZhIiwKLQkuaWRfdGFibGUJPSB2aWE2ODZhX3BjaV9pZHMsCi0JLnByb2JlCQk9IHZpYTY4NmFfcGNpX3Byb2JlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgc21fdmlhNjg2YV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzbV92aWE2ODZhX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7Ci0JaWYgKHNfYnJpZGdlICE9IE5VTEwpIHsKLQkJaTJjX2RlbF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKTsKLQkJcGNpX2Rldl9wdXQoc19icmlkZ2UpOwotCQlzX2JyaWRnZSA9IE5VTEw7Ci0JfQotfQotCi1NT0RVTEVfQVVUSE9SKCJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sICIKLQkgICAgICAiTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAiCi0JICAgICAgImFuZCBCb2IgRG91Z2hlcnR5IDxib2JkQHN0YW5mb3JkLmVkdT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVklBIDY4NkEgU2Vuc29yIGRldmljZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1tb2R1bGVfaW5pdChzbV92aWE2ODZhX2luaXQpOwotbW9kdWxlX2V4aXQoc21fdmlhNjg2YV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCmluZGV4IDUxY2UyNjguLjRmZDRmNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlyZXMgPSBpZHJfZ2V0X25ldygmaTJjX2FkYXB0ZXJfaWRyLCBOVUxMLCAmaWQpOworCXJlcyA9IGlkcl9nZXRfbmV3KCZpMmNfYWRhcHRlcl9pZHIsIGFkYXAsICZpZCk7CiAJaWYgKHJlcyA8IDApIHsKIAkJaWYgKHJlcyA9PSAtRUFHQUlOKQogCQkJcmVzID0gLUVOT01FTTsKQEAgLTc2NSwyMCArNzY1LDE1IEBACiAKIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjX2dldF9hZGFwdGVyKGludCBpZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgKml0ZW07CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOwogCQogCWRvd24oJmNvcmVfbGlzdHMpOwotCWxpc3RfZm9yX2VhY2goaXRlbSwmYWRhcHRlcnMpIHsKLQkJYWRhcHRlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IGkyY19hZGFwdGVyLCBsaXN0KTsKLQkJaWYgKGlkID09IGFkYXB0ZXItPm5yICYmCi0JCSAgICB0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpIHsKLQkJCXVwKCZjb3JlX2xpc3RzKTsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0JfQorCWFkYXB0ZXIgPSAoc3RydWN0IGkyY19hZGFwdGVyICopaWRyX2ZpbmQoJmkyY19hZGFwdGVyX2lkciwgaWQpOworCWlmIChhZGFwdGVyICYmICF0cnlfbW9kdWxlX2dldChhZGFwdGVyLT5vd25lcikpCisJCWFkYXB0ZXIgPSBOVUxMOworCiAJdXAoJmNvcmVfbGlzdHMpOwotCXJldHVybiBOVUxMOworCXJldHVybiBhZGFwdGVyOwogfQogCiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9LY29uZmlnIGIvZHJpdmVycy9pZGUvS2NvbmZpZwppbmRleCAwMjczZjEyLi41ZjMzZGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWRlL0tjb25maWcKQEAgLTYwNiw2ICs2MDYsMTIgQEAKIAkgIDxodHRwOi8vd3d3Lml0ZS5jb20udHcvaWEvYnJpZWZfaXQ4MTcyYnNwLmh0bT47IHBpY3R1cmUgb2YgdGhlCiAJICBib2FyZCBhdCA8aHR0cDovL3d3dy5tdmlzdGEuY29tL3BhcnRuZXJzL3NlbWljb25kdWN0b3IvaXRlLmh0bWw+LgogCitjb25maWcgQkxLX0RFVl9JVDgyMVgKKwl0cmlzdGF0ZSAiSVQ4MjFYIElERSBzdXBwb3J0IgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIElURSA4MjExIElERSBjb250cm9sbGVyIGFuZCB0aGUKKwkgIElUIDgyMTIgSURFIFJBSUQgY29udHJvbGxlciBpbiBib3RoIFJBSUQgYW5kIHBhc3MtdGhyb3VnaCBtb2RlLgorCiBjb25maWcgQkxLX0RFVl9OUzg3NDE1CiAJdHJpc3RhdGUgIk5TODc0MTUgY2hpcHNldCBzdXBwb3J0IgogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL01ha2VmaWxlIGIvZHJpdmVycy9pZGUvTWFrZWZpbGUKaW5kZXggNWJlOGFkNmQuLmNjYTljMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWRlL01ha2VmaWxlCkBAIC0yMCw3ICsyMCw2IEBACiAjIENvcmUgSURFIGNvZGUgLSBtdXN0IGNvbWUgYmVmb3JlIGxlZ2FjeQogaWRlLWNvcmUtJChDT05GSUdfQkxLX0RFVl9JREVQQ0kpCSs9IHNldHVwLXBjaS5vCiBpZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERURNQSkJKz0gaWRlLWRtYS5vCi1pZGUtY29yZS0kKENPTkZJR19CTEtfREVWX0lERV9UQ1EpCSs9IGlkZS10Y3EubwogaWRlLWNvcmUtJChDT05GSUdfUFJPQ19GUykJCSs9IGlkZS1wcm9jLm8KIGlkZS1jb3JlLSQoQ09ORklHX0JMS19ERVZfSURFUE5QKQkrPSBpZGUtcG5wLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCAwYTMxY2ZkLi43NGFmN2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiAjaWYgVkVSQk9TRV9JREVfQ0RfRVJST1JTCiAJewogCQlpbnQgaTsKLQkJY29uc3QgY2hhciAqczsKKwkJY29uc3QgY2hhciAqcyA9ICJiYWQgc2Vuc2Uga2V5ISI7CiAJCWNoYXIgYnVmWzgwXTsKIAogCQlwcmludGsgKCJBVEFQSSBkZXZpY2UgJXM6XG4iLCBkcml2ZS0+bmFtZSk7CkBAIC00NDYsOCArNDQ2LDYgQEAKIAogCQlpZiAoc2Vuc2UtPnNlbnNlX2tleSA8IEFSWV9MRU4oc2Vuc2Vfa2V5X3RleHRzKSkKIAkJCXMgPSBzZW5zZV9rZXlfdGV4dHNbc2Vuc2UtPnNlbnNlX2tleV07Ci0JCWVsc2UKLQkJCXMgPSAiYmFkIHNlbnNlIGtleSEiOwogCiAJCXByaW50aygiJXMgLS0gKFNlbnNlIGtleT0weCUwMngpXG4iLCBzLCBzZW5zZS0+c2Vuc2Vfa2V5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRpc2suYyBiL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKaW5kZXggZDZmOTM0OC4uZjljMWFjYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtMTE5LDYgKzExOSwxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgbGJhX3NlY3RzLCBjaHNfc2VjdHMsIGhlYWQsIHRhaWw7CiAKKwkvKiBObyBub24tTEJBIGluZm8gLi4gc28gdmFsaWQhICovCisJaWYgKGlkLT5jeWxzID09IDApCisJCXJldHVybiAxOworCiAJLyoKIAkgKiBUaGUgQVRBIHNwZWMgdGVsbHMgbGFyZ2UgZHJpdmVzIHRvIHJldHVybgogCSAqIEMvSC9TID0gMTYzODMvMTYvNjMgaW5kZXBlbmRlbnQgb2YgdGhlaXIgc2l6ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYyBiL2RyaXZlcnMvaWRlL2lkZS1kbWEuYwppbmRleCAyZDJlZWZiLi4xZTE1MzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCkBAIC0xMzIsNyArMTMyLDYgQEAKIAl7ICJTQU1TVU5HIENELVJPTSBTQy0xNDhDIiwJIkFMTCIJCX0sCiAJeyAiU0FNU1VORyBDRC1ST00gU0MiLAkiQUxMIgkJfSwKIAl7ICJTYW5EaXNrIFNEUDNCLTY0IgksCSJBTEwiCQl9LAotCXsgIlNBTVNVTkcgQ0QtUk9NIFNOLTEyNCIsCSJBTEwiCQl9LAogCXsgIkFUQVBJIENELVJPTSBEUklWRSA0MFggTUFYSU1VTSIsCSJBTEwiCQl9LAogCXsgIl9ORUMgRFY1ODAwQSIsICAgICAgICAgICAgICAgIkFMTCIgICAgICAgICAgIH0sICAKIAl7IE5VTEwJCQksCU5VTEwJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCmluZGV4IDUzMDI0OTQuLmI0NDNiMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvcHMuYwpAQCAtMTE4MSw3ICsxMTgxLDggQEAKIAkJcHJlX3Jlc2V0KGRyaXZlKTsKIAkJU0VMRUNUX0RSSVZFKGRyaXZlKTsKIAkJdWRlbGF5ICgyMCk7Ci0JCWh3aWYtPk9VVEIoV0lOX1NSU1QsIElERV9DT01NQU5EX1JFRyk7CisJCWh3aWYtPk9VVEJTWU5DKGRyaXZlLCBXSU5fU1JTVCwgSURFX0NPTU1BTkRfUkVHKTsKKwkJbmRlbGF5KDQwMCk7CiAJCWh3Z3JvdXAtPnBvbGxfdGltZW91dCA9IGppZmZpZXMgKyBXQUlUX1dPUlNUQ0FTRTsKIAkJaHdncm91cC0+cG9sbGluZyA9IDE7CiAJCV9faWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmYXRhcGlfcmVzZXRfcG9sbGZ1bmMsIEhaLzIwLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwppbmRleCA2ODA2ZDQwLi5iMDlhNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCkBAIC00ODcsOCArNDg3LDcgQEAKIAl1OCBlcnIgPSAwOwogCiAJbG9jYWxfaXJxX3NldChmbGFncyk7Ci0JcHJpbnRrKCIlczogJXM6IHN0YXR1cz0weCUwMngiLCBkcml2ZS0+bmFtZSwgbXNnLCBzdGF0KTsKLQlwcmludGsoIiB7ICIpOworCXByaW50aygiJXM6ICVzOiBzdGF0dXM9MHglMDJ4IHsgIiwgZHJpdmUtPm5hbWUsIG1zZywgc3RhdCk7CiAJaWYgKHN0YXQgJiBCVVNZX1NUQVQpCiAJCXByaW50aygiQnVzeSAiKTsKIAllbHNlIHsKQEAgLTUwMCwxNSArNDk5LDEzIEBACiAJCWlmIChzdGF0ICYgSU5ERVhfU1RBVCkJcHJpbnRrKCJJbmRleCAiKTsKIAkJaWYgKHN0YXQgJiBFUlJfU1RBVCkJcHJpbnRrKCJFcnJvciAiKTsKIAl9Ci0JcHJpbnRrKCJ9Iik7Ci0JcHJpbnRrKCJcbiIpOworCXByaW50aygifVxuIik7CiAJaWYgKChzdGF0ICYgKEJVU1lfU1RBVHxFUlJfU1RBVCkpID09IEVSUl9TVEFUKSB7CiAJCWVyciA9IGh3aWYtPklOQihJREVfRVJST1JfUkVHKTsKLQkJcHJpbnRrKCIlczogJXM6IGVycm9yPTB4JTAyeCIsIGRyaXZlLT5uYW1lLCBtc2csIGVycik7Ci0JCXByaW50aygiIHsgIik7CisJCXByaW50aygiJXM6ICVzOiBlcnJvcj0weCUwMnggeyAiLCBkcml2ZS0+bmFtZSwgbXNnLCBlcnIpOwogCQlpZiAoZXJyICYgQUJSVF9FUlIpCXByaW50aygiRHJpdmVTdGF0dXNFcnJvciAiKTsKIAkJaWYgKGVyciAmIElDUkNfRVJSKQotCQkJcHJpbnRrKCJCYWQlcyAiLCAoZXJyICYgQUJSVF9FUlIpID8gIkNSQyIgOiAiU2VjdG9yIik7CisJCQlwcmludGsoKGVyciAmIEFCUlRfRVJSKSA/ICJCYWRDUkMgIiA6ICJCYWRTZWN0b3IgIik7CiAJCWlmIChlcnIgJiBFQ0NfRVJSKQlwcmludGsoIlVuY29ycmVjdGFibGVFcnJvciAiKTsKIAkJaWYgKGVyciAmIElEX0VSUikJcHJpbnRrKCJTZWN0b3JJZE5vdEZvdW5kICIpOwogCQlpZiAoZXJyICYgVFJLMF9FUlIpCXByaW50aygiVHJhY2taZXJvTm90Rm91bmQgIik7CkBAIC01NDYsOCArNTQzLDggQEAKIAkJCQlwcmludGsoIiwgc2VjdG9yPSVsbHUiLAogCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKUhXR1JPVVAoZHJpdmUpLT5ycS0+c2VjdG9yKTsKIAkJfQorCQlwcmludGsoIlxuIik7CiAJfQotCXByaW50aygiXG4iKTsKIAlpZGVfZHVtcF9vcGNvZGUoZHJpdmUpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvbGVnYWN5L2hkLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYwppbmRleCBlODg0Y2Q0Li4yNDIwMjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYworKysgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaGQuYwpAQCAtMTU2LDExICsxNTYsMTMgQEAKIAogCiAjaWYgKEhEX0RFTEFZID4gMCkKKworI2luY2x1ZGUgPGFzbS9pODI1My5oPgorCiB1bnNpZ25lZCBsb25nIGxhc3RfcmVxOwogCiB1bnNpZ25lZCBsb25nIHJlYWRfdGltZXIodm9pZCkKIHsKLSAgICAgICAgZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAl1bnNpZ25lZCBsb25nIHQsIGZsYWdzOwogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMgYi9kcml2ZXJzL2lkZS9sZWdhY3kvaWRlLWNzLmMKaW5kZXggZTIwMzI3ZS4uYWFjNTk3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvbGVnYWN5L2lkZS1jcy5jCisrKyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9pZGUtY3MuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTM0LDExICsxMzMsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmaWRlX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDU3LDEzICs0NTEsNDkgQEAKICAgICByZXR1cm4gMDsKIH0gLyogaWRlX2V2ZW50ICovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBpZGVfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9GVU5DX0lEKDQpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAzMiwgMHgwNzA0KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwYTQsIDB4MDAyZCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgyMDgwLCAweDAwMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA0NSwgMHgwNDAxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkNhcmF2ZWxsZSIsICJQU0MtSURFICIsICJQU0MwMDAiLCAweDhjMzYxMzdjLCAweGQwNjkzYWI4LCAweDI3NjhhOWYwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkNEUk9NIiwgIklERSIsICJNQ0QtNjAxcCIsIDB4MWI5MTc5Y2EsIDB4ZWRlODg5NTEsIDB4MGQ5MDJmNzQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiUENNQ0lBIiwgIklERSBDQVJEIiwgIkYxIiwgMHgyODFmMWM1ZCwgMHgxOTA3OTYwYywgMHhmN2ZkZThiOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFSR09TWSIsICJDRC1ST00iLCAweDc4ZjMwOGRjLCAweDY2NTM2NTkxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVJHT1NZIiwgIlBuUElERSIsIDB4NzhmMzA4ZGMsIDB4MGM2OTQ3MjgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDTkYgQ0QtTSIsICJDRC1ST00iLCAweDdkOTNiODUyLCAweDY2NTM2NTkxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ3JlYXRpdmUgVGVjaG5vbG9neSBMdGQuIiwgIlBDTUNJQSBDRC1ST00gSW50ZXJmYWNlIENhcmQiLCAweGZmOGM4YTQ1LCAweGZlODAyMGM0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24uIiwgIkRpZ2l0YWwgTW9iaWxlIE1lZGlhIENELVJPTSIsIDB4MTc2OTJhNjYsIDB4ZWYxZGNiZGUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFWFAiLCAiQ0QiLCAweDZmNThjOTgzLCAweGFhZTU5OTRmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRVhQICAgIiwgIkNELVJPTSIsIDB4MGE1YzUyZmQsIDB4NjY1MzY1OTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFWFAgICAiLCAiUG5QSURFIiwgMHgwYTVjNTJmZCwgMHgwYzY5NDcyOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkZSRUVDT00iLCAiUENDQVJELUlERSIsIDB4NTcxNGNiZjcsIDB4NDhlMGFiOGUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJQk0iLCAiSUJNMTdKU1NGUDIwIiwgMHhiNTY5YTZlNSwgMHhmMjUwODc1MyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklPIERBVEEiLCAiQ0JJREUyICAgICAgIiwgMHg1NDdlNjZkYywgMHg4NjcxMDQzYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklPIERBVEEiLCAiUENJREUiLCAweDU0N2U2NmRjLCAweDVjNWFiMTQ5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU8gREFUQSIsICJQQ0lERUlJIiwgMHg1NDdlNjZkYywgMHhiMzY2MjY3NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxPT0tNRUVUIiwgIkNCSURFMiAgICAgICIsIDB4ZTM3YmUyYjUsIDB4ODY3MTA0M2IpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIgIiwgIk5pbmphQVRBLSIsIDB4M2I2ZTIwYzgsIDB4ZWJlMGJkNzkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiQ0QtUk9NIiwgMHgyODFmMWM1ZCwgMHg2NjUzNjU5MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJQblBJREUiLCAweDI4MWYxYzVkLCAweDBjNjk0NzI4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU0hVVFRMRSBURUNITk9MT0dZIExURC4iLCAiUENDQVJELUlERS9BVEFQSSBBZGFwdGVyIiwgMHg0YTNmMGJhMCwgMHgzMjI1NjBlMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRPU0hJQkEiLCAiTUsyMDAxTVBMIiwgMHhiNDU4NWExYSwgMHgzNDg5ZTAwMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIldJVCIsICJJREUxNiIsIDB4MjQ0ZTU5OTQsIDB4M2UyMzI4NTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIlNUSSBGbGFzaCIsIDB4ZTRhMTMyMDkpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgaWRlX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBpZGVfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiaWRlLWNzIiwKIAl9LAogCS5hdHRhY2gJCT0gaWRlX2F0dGFjaCwKKwkuZXZlbnQJCT0gaWRlX2V2ZW50LAogCS5kZXRhY2gJCT0gaWRlX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBpZGVfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9pZGVfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9NYWtlZmlsZSBiL2RyaXZlcnMvaWRlL3BjaS9NYWtlZmlsZQppbmRleCA1NWU2ZTU1Li5hZjQ2MjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pZGUvcGNpL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiBvYmotJChDT05GSUdfQkxLX0RFVl9IUFQzNjYpCQkrPSBocHQzNjYubwogI29iai0kKENPTkZJR19CTEtfREVWX0hQVDM3WCkJCSs9IGhwdDM3eC5vCiBvYmotJChDT05GSUdfQkxLX0RFVl9JVDgxNzIpCQkrPSBpdDgxNzIubworb2JqLSQoQ09ORklHX0JMS19ERVZfSVQ4MjFYKQkJKz0gaXQ4MjF4Lm8KIG9iai0kKENPTkZJR19CTEtfREVWX05TODc0MTUpCQkrPSBuczg3NDE1Lm8KIG9iai0kKENPTkZJR19CTEtfREVWX09QVEk2MjEpCQkrPSBvcHRpNjIxLm8KIG9iai0kKENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCkJKz0gcGRjMjAyeHhfb2xkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9hbGltMTV4My5jIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKaW5kZXggNjdlZmIzOC4uNmNmNDkzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2FsaW0xNXgzLmMKQEAgLTU4Myw3ICs1ODMsNyBAQAogICoJYXBwcm9wcmlhdGUgYWxzbyBzZXRzIHVwIHRoZSAxNTMzIHNvdXRoYnJpZGdlLgogICovCiAgIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X2FsaTE1eDMgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfYWxpMTV4MyAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IHRtcGJ5dGU7CkBAIC02NzcsNyArNjc3LDcgQEAKICAqCUZJWE1FOiBmcm9icyBiaXRzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIG9uIG5ld2VyIEFMaSBkZXZpY2VhCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGF0YTY2X2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CiAJdW5zaWduZWQgaW50IGF0YTY2CT0gMDsKQEAgLTc0OCw3ICs3NDgsNyBAQAogICoJSW5pdGlhbGl6ZSB0aGUgSURFIHN0cnVjdHVyZSBzaWRlIG9mIHRoZSBBTGkgMTV4MyBkcml2ZXIuCiAgKi8KICAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfY29tbW9uX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2NvbW1vbl9hbGkxNXgzIChpZGVfaHdpZl90ICpod2lmKQogewogCWh3aWYtPmF1dG9kbWEgPSAwOwogCWh3aWYtPnR1bmVwcm9jID0gJmFsaTE1eDNfdHVuZV9kcml2ZTsKQEAgLTc5NCw3ICs3OTQsNyBAQAogICoJU3BhcmMgc3lzdGVtcwogICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAl1OCBpZGVpYywgaW5taXI7CiAJczggaXJxX3JvdXRpbmdfdGFibGVbXSA9IHsgLTEsICA5LCAzLCAxMCwgNCwgIDUsIDcsICA2LApAQCAtODQ3LDcgKzg0Nyw3IEBACiAgKgl0aGUgYWN0dWFsIHdvcmsuCiAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfZG1hX2FsaTE1eDMgKGlkZV9od2lmX3QgKmh3aWYsIHVuc2lnbmVkIGxvbmcgZG1hYmFzZSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2RtYV9hbGkxNXgzIChpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGRtYWJhc2UpCiB7CiAJaWYgKG01MjI5X3JldmlzaW9uIDwgMHgyMCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYyBiL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMKaW5kZXggNGUwZjEzZC4uODQ0YTZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYworKysgYi9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCkBAIC03Myw2ICs3Myw3IEBACiAJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfQ0s4MDRfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKIAl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1AwNF9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDUxX0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCisJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKIAl7IDAgfQogfTsKIApAQCAtMzA5LDcgKzMxMCw3IEBACiAgKiBhbmQgaW5pdGlhbGl6ZSBpdHMgZHJpdmUgaW5kZXBlbmRlbnQgcmVnaXN0ZXJzLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9hbWQ3NHh4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfYW1kNzR4eChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCXVuc2lnbmVkIGNoYXIgdDsKIAl1bnNpZ25lZCBpbnQgdTsKQEAgLTQxMyw3ICs0MTQsNyBAQAogCXJldHVybiBkZXYtPmlycTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9hbWQ3NHh4KGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2FtZDc0eHgoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlpbnQgaTsKIApAQCAtNDg5LDYgKzQ5MCw3IEBACiAJLyogMTMgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1DSzgwNCIpLAogCS8qIDE0ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQMDQiKSwKIAkvKiAxNSAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLU1DUDUxIiksCisJLyogMTYgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1NQ1A1NSIpLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgYW1kNzR4eF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCkBAIC01MjQsNiArNTI2LDcgQEAKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfQ0s4MDRfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMyB9LAogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1AwNF9JREUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE0IH0sCiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDUxX0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTUgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxNiB9LAogCXsgMCwgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kNzR4eF9wY2lfdGJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9jczU1MzAuYyBiL2RyaXZlcnMvaWRlL3BjaS9jczU1MzAuYwppbmRleCAwMzgxOTYxLi4wOTI2OWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvY3M1NTMwLmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL2NzNTUzMC5jCkBAIC0yMTcsNyArMjE3LDcgQEAKICAqCUluaXRpYWxpemUgdGhlIGNzNTUzMCBicmlkZ2UgZm9yIHJlbGlhYmxlIElERSBETUEgb3BlcmF0aW9uLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF9jczU1MzAgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfY3M1NTMwIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBwY2lfZGV2ICptYXN0ZXJfMCA9IE5VTEwsICpjczU1MzBfMCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTMwOCw3ICszMDgsNyBAQAogICoJcGVyZm9ybXMgY2hhbm5lbC1zcGVjaWZpYyBwcmUtaW5pdGlhbGl6YXRpb24gYmVmb3JlIGRyaXZlIHByb2JpbmcuCiAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9jczU1MzAgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2NzNTUzMCAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAl1bnNpZ25lZCBsb25nIGJhc2VyZWc7CiAJdTMyIGQwX3RpbWluZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvY3k4MmM2OTMuYyBiL2RyaXZlcnMvaWRlL3BjaS9jeTgyYzY5My5jCmluZGV4IDgwZDY3ZTkuLjVhMzM1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9jeTgyYzY5My5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9jeTgyYzY5My5jCkBAIC0zOTEsNyArMzkxLDcgQEAKIC8qCiAgKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgaW5pdCBhbmQgaXMgdXNlZCB0byBzZXR1cCB0aGUgY3k4MmM2OTMgY2hpcAogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2NoaXBzZXRfY3k4MmM2OTMoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9jeTgyYzY5MyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQogewogCWlmIChQQ0lfRlVOQyhkZXYtPmRldmZuKSAhPSAxKQogCQlyZXR1cm4gMDsKQEAgLTQ0Myw3ICs0NDMsNyBAQAogLyoKICAqIHRoZSBpbml0IGZ1bmN0aW9uIC0gY2FsbGVkIGZvciBlYWNoIGlkZSBjaGFubmVsIG9uY2UKICAqLwotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9jeTgyYzY5MyhpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9jeTgyYzY5MyhpZGVfaHdpZl90ICpod2lmKQogewogCWh3aWYtPmF1dG9kbWEgPSAwOwogCkBAIC00NjcsOSArNDY3LDkgQEAKIAlod2lmLT5kcml2ZXNbMV0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CiB9CiAKLXN0YXRpYyBfX2luaXRkYXRhIGlkZV9od2lmX3QgKnByaW1hcnk7CitzdGF0aWMgX19kZXZpbml0ZGF0YSBpZGVfaHdpZl90ICpwcmltYXJ5OwogCi12b2lkIF9faW5pdCBpbml0X2lvcHNfY3k4MmM2OTMoaWRlX2h3aWZfdCAqaHdpZikKK3ZvaWQgX19kZXZpbml0IGluaXRfaW9wc19jeTgyYzY5MyhpZGVfaHdpZl90ICpod2lmKQogewogCWlmIChQQ0lfRlVOQyhod2lmLT5wY2lfZGV2LT5kZXZmbikgPT0gMSkKIAkJcHJpbWFyeSA9IGh3aWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jIGIvZHJpdmVycy9pZGUvcGNpL2dlbmVyaWMuYwppbmRleCA0NTY1Y2MzLi5kYTQ2NTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9nZW5lcmljLmMKQEAgLTM5LDYgKzM5LDE3IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAorc3RhdGljIGludCBpZGVfZ2VuZXJpY19hbGw7CQkvKiBTZXQgdG8gY2xhaW0gYWxsIGRldmljZXMgKi8KKworc3RhdGljIGludCBfX2luaXQgaWRlX2dlbmVyaWNfYWxsX29uKGNoYXIgKnVudXNlZCkKK3sKKwlpZGVfZ2VuZXJpY19hbGwgPSAxOworCXByaW50ayhLRVJOX0lORk8gIklERSBnZW5lcmljIHdpbGwgY2xhaW0gYWxsIHVua25vd24gUENJIElERSBzdG9yYWdlIGNvbnRyb2xsZXJzLlxuIik7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFsbC1nZW5lcmljLWlkZSIsIGlkZV9nZW5lcmljX2FsbF9vbik7CisKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfZ2VuZXJpYyAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzd2l0Y2goaHdpZi0+cGNpX2Rldi0+ZGV2aWNlKSB7CkBAIC03OCw3OSArODksODUgQEAKIAogc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgZ2VuZXJpY19jaGlwc2V0c1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewkvKiAwICovCisJCS5uYW1lCQk9ICJVbmtub3duIiwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAorCQkuY2hhbm5lbHMJPSAyLAorCQkuYXV0b2RtYQk9IEFVVE9ETUEsCisJCS5ib290YWJsZQk9IE9OX0JPQVJELAorCX0sewkvKiAxICovCiAJCS5uYW1lCQk9ICJOUzg3NDEwIiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLAogCQkuYXV0b2RtYQk9IEFVVE9ETUEsCiAJCS5lbmFibGViaXRzCT0ge3sweDQzLDB4MDgsMHgwOH0sIHsweDQ3LDB4MDgsMHgwOH19LAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLSAgICAgICAgfSx7CS8qIDEgKi8KKyAgICAgICAgfSx7CS8qIDIgKi8KIAkJLm5hbWUJCT0gIlNBTVVSQUkiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gQVVUT0RNQSwKIAkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCi0JfSx7CS8qIDIgKi8KKwl9LHsJLyogMyAqLwogCQkubmFtZQkJPSAiSFQ2NTY1IiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLAogCQkuYXV0b2RtYQk9IEFVVE9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiAzICovCisJfSx7CS8qIDQgKi8KIAkJLm5hbWUJCT0gIlVNODY3M0YiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiA0ICovCisJfSx7CS8qIDUgKi8KIAkJLm5hbWUJCT0gIlVNODg4NkEiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9ETUEsCiAJCS5ib290YWJsZQk9IE9OX0JPQVJELAotCX0sewkvKiA1ICovCisJfSx7CS8qIDYgKi8KIAkJLm5hbWUJCT0gIlVNODg4NkJGIiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLAogCQkuYXV0b2RtYQk9IE5PRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogNiAqLworCX0sewkvKiA3ICovCiAJCS5uYW1lCQk9ICJISU5UX0lERSIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKIAkJLmF1dG9kbWEJPSBBVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogNyAqLworCX0sewkvKiA4ICovCiAJCS5uYW1lCQk9ICJWSUFfSURFIiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLAogCQkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKIAkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCi0JfSx7CS8qIDggKi8KKwl9LHsJLyogOSAqLwogCQkubmFtZQkJPSAiT1BUSTYyMVYiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9BVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogOSAqLworCX0sewkvKiAxMCAqLwogCQkubmFtZQkJPSAiVklBODIzN1NBVEEiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gQVVUT0RNQSwKIAkJLmJvb3RhYmxlCT0gT0ZGX0JPQVJELAotCX0sewkvKiAxMCAqLworCX0sewkvKiAxMSAqLwogCQkubmFtZSAJCT0gIlBpY2NvbG8wMTAyIiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9nZW5lcmljLAogCQkuY2hhbm5lbHMJPSAyLAogCQkuYXV0b2RtYQk9IE5PQVVUT0RNQSwKIAkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCi0JfSx7CS8qIDExICovCisJfSx7CS8qIDEyICovCiAJCS5uYW1lIAkJPSAiUGljY29sbzAxMDMiLAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2dlbmVyaWMsCiAJCS5jaGFubmVscwk9IDIsCiAJCS5hdXRvZG1hCT0gTk9BVVRPRE1BLAogCQkuYm9vdGFibGUJPSBPTl9CT0FSRCwKLQl9LHsJLyogMTIgKi8KKwl9LHsJLyogMTMgKi8KIAkJLm5hbWUgCQk9ICJQaWNjb2xvMDEwNSIsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfZ2VuZXJpYywKIAkJLmNoYW5uZWxzCT0gMiwKQEAgLTE3NCw2ICsxOTEsMTAgQEAKIAl1MTYgY29tbWFuZDsKIAlpbnQgcmV0ID0gLUVOT0RFVjsKIAorCS8qIERvbid0IHVzZSB0aGUgZ2VuZXJpYyBlbnRyeSB1bmxlc3MgaW5zdHJ1Y3RlZCB0byBkbyBzbyAqLworCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMCAmJiBpZGVfZ2VuZXJpY19hbGwgPT0gMCkKKwkJCWdvdG8gb3V0OworCiAJaWYgKGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfVU1DICYmCiAJICAgIGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkEgJiYKIAkgICAgKCEoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkpCkBAIC0xOTUsMjEgKzIxNiwyMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZ2VuZXJpY19wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX05TLCAgICAgUENJX0RFVklDRV9JRF9OU184NzQxMCwgICAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9TQU1VUkFJX0lERSwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDF9LAotCXsgUENJX1ZFTkRPUl9JRF9IT0xURUssIFBDSV9ERVZJQ0VfSURfSE9MVEVLXzY1NjUsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMn0sCi0JeyBQQ0lfVkVORE9SX0lEX1VNQywgICAgUENJX0RFVklDRV9JRF9VTUNfVU04NjczRiwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAzfSwKLQl7IFBDSV9WRU5ET1JfSURfVU1DLCAgICBQQ0lfREVWSUNFX0lEX1VNQ19VTTg4ODZBLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDR9LAotCXsgUENJX1ZFTkRPUl9JRF9VTUMsICAgIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkJGLCAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNX0sCi0JeyBQQ0lfVkVORE9SX0lEX0hJTlQsICAgUENJX0RFVklDRV9JRF9ISU5UX1ZYUFJPSUlfSURFLCAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA2fSwKLQl7IFBDSV9WRU5ET1JfSURfVklBLCAgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NjEsICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDd9LAotCXsgUENJX1ZFTkRPUl9JRF9PUFRJLCAgIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM1NTgsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOH0sCisJeyBQQ0lfVkVORE9SX0lEX05TLCAgICAgUENJX0RFVklDRV9JRF9OU184NzQxMCwgICAgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxfSwKKwl7IFBDSV9WRU5ET1JfSURfUENURUNILCBQQ0lfREVWSUNFX0lEX1BDVEVDSF9TQU1VUkFJX0lERSwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDJ9LAorCXsgUENJX1ZFTkRPUl9JRF9IT0xURUssIFBDSV9ERVZJQ0VfSURfSE9MVEVLXzY1NjUsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgM30sCisJeyBQQ0lfVkVORE9SX0lEX1VNQywgICAgUENJX0RFVklDRV9JRF9VTUNfVU04NjczRiwgICAgICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA0fSwKKwl7IFBDSV9WRU5ET1JfSURfVU1DLCAgICBQQ0lfREVWSUNFX0lEX1VNQ19VTTg4ODZBLCAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDV9LAorCXsgUENJX1ZFTkRPUl9JRF9VTUMsICAgIFBDSV9ERVZJQ0VfSURfVU1DX1VNODg4NkJGLCAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNn0sCisJeyBQQ0lfVkVORE9SX0lEX0hJTlQsICAgUENJX0RFVklDRV9JRF9ISU5UX1ZYUFJPSUlfSURFLCAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA3fSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCAgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NjEsICAgICAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDh9LAorCXsgUENJX1ZFTkRPUl9JRF9PUFRJLCAgIFBDSV9ERVZJQ0VfSURfT1BUSV84MkM1NTgsICAgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgOX0sCiAjaWZkZWYgQ09ORklHX0JMS19ERVZfSURFX1NBVEEKLQl7IFBDSV9WRU5ET1JfSURfVklBLAlQQ0lfREVWSUNFX0lEX1ZJQV84MjM3X1NBVEEsCSAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDl9LAorCXsgUENJX1ZFTkRPUl9JRF9WSUEsCVBDSV9ERVZJQ0VfSURfVklBXzgyMzdfU0FUQSwJICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTB9LAogI2VuZGlmCi0JeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE8sICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMH0sCi0JeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE9fMSwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMX0sCi0JeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE9fMiwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMn0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE8sICAgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMX0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE9fMSwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxMn0sCisJeyBQQ0lfVkVORE9SX0lEX1RPU0hJQkEsUENJX0RFVklDRV9JRF9UT1NISUJBX1BJQ0NPTE9fMiwgICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxM30sCisJLyogTXVzdCBjb21lIGxhc3QuIElmIHlvdSBhZGQgZW50cmllcyBhZGp1c3QgdGhpcyB0YWJsZSBhcHByb3ByaWF0ZWx5IGFuZCB0aGUgaW5pdF9vbmUgY29kZSAqLworCXsgUENJX0FOWV9JRCwJCVBDSV9BTllfSUQsCQkJICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX1NUT1JBR0VfSURFIDw8IDgsIDB4RkZGRkZGMDBVTCwgMH0sCiAJeyAwLCB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBnZW5lcmljX3BjaV90YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jIGIvZHJpdmVycy9pZGUvcGNpL2hwdDM2Ni5jCmluZGV4IGM4ZWUwYjguLjdiNjRkYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9ocHQzNjYuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvaHB0MzY2LmMKQEAgLTEwLDYgKzEwLDExIEBACiAgKiBkb25hdGlvbiBvZiBhbiBBQml0IEJQNiBtYWluYm9hcmQsIHByb2Nlc3NvciwgYW5kIG1lbW9yeSBhY2VsbGVyYXRlZAogICogZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQuCiAgKgorICoKKyAqIEhpZ2hwb2ludCBoYXZlIHRoZWlyIG93biBkcml2ZXIgKHNvdXJjZSBleGNlcHQgZm9yIHRoZSByYWlkIHBhcnQpCisgKiBhdmFpbGFibGUgZnJvbSBodHRwOi8vd3d3LmhpZ2hwb2ludC10ZWNoLmNvbS9ocHQzeHgtb3BlbnNvdXJjZS12MTMxLnRnegorICogVGhpcyBtYXkgYmUgdXNlZnVsIHRvIGFueW9uZSB3YW50aW5nIHRvIHdvcmsgb24gdGhlIG1haW5zdHJlYW0gaHB0IElERS4KKyAqCiAgKiBOb3RlIHRoYXQgZmluYWwgSFBUMzcwIHN1cHBvcnQgd2FzIGRvbmUgYnkgZm9yY2UgZXh0cmFjdGlvbiBvZiBHUEwuCiAgKgogICogLSBhZGQgZnVuY3Rpb24gZm9yIGdldHRpbmcvc2V0dGluZyBwb3dlciBzdGF0dXMgb2YgZHJpdmUKQEAgLTQ0Niw0NCArNDUxLDI5IEBACiAjZGVmaW5lIEZfTE9XX1BDSV81MAkweDJkCiAjZGVmaW5lIEZfTE9XX1BDSV82NgkweDQyCiAKLS8qIEZJWE1FOiBjb21wYXJlIHdpdGggZHJpdmVyJ3MgY29kZSBiZWZvcmUgcmVtb3ZpbmcgKi8KLSNpZiAwCi0JCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKSB7Ci0JCQl1OCBjYmw7Ci0JCQljYmwgPSBpbmIoaW9iYXNlICsgMHg3Yik7Ci0JCQlvdXRiKGNibCB8IDEsIGlvYmFzZSArIDB4N2IpOwotCQkJb3V0YihjYmwgJiB+MSwgaW9iYXNlICsgMHg3Yik7Ci0JCQljYmwgPSBpbmIoaW9iYXNlICsgMHg3YSk7Ci0JCQlwICs9IHNwcmludGYocCwgIkNhYmxlOiAgICAgICAgICBBVEEtJWQiCi0JCQkJCSIgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQS0lZFxuIiwKLQkJCQkoY2JsICYgMHgwMikgPyAzMyA6IDY2LAotCQkJCShjYmwgJiAweDAxKSA/IDMzIDogNjYpOwotCQkJcCArPSBzcHJpbnRmKHAsICJcbiIpOwotCQl9Ci0JCXsKLQkJCXU4IGMyLCBjMzsKLQkJCS8qIG9sZGVyIHJldnMgZG9uJ3QgaGF2ZSB0aGVzZSByZWdpc3RlcnMgbWFwcGVkIAotCQkJICogaW50byBpbyBzcGFjZSAqLwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQzLCAmYzApOwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDQ3LCAmYzEpOwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRiLCAmYzIpOwotCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDRmLCAmYzMpOworLyoKKyAqCUhvbGQgYWxsIHRoZSBoaWdocG9pbnQgcXVpcmtzIGFuZCByZXZpc2lvbiBpbmZvcm1hdGlvbiBpbiBvbmUKKyAqCXBsYWNlLgorICovCiAKLQkJCXAgKz0gc3ByaW50ZihwLCAiTW9kZTogICAgICAgICAgICVzICAgICAgICAgICAgICVzIgotCQkJCQkiICAgICAgICAgICAlcyAgICAgICAgICAgICAgJXNcbiIsCi0JCQkJKGMwICYgMHgxMCkgPyAiVURNQSIgOiAoYzAgJiAweDIwKSA/ICJETUEgIiA6IAotCQkJCQkoYzAgJiAweDgwKSA/ICJQSU8gIiA6ICJvZmYgIiwKLQkJCQkoYzEgJiAweDEwKSA/ICJVRE1BIiA6IChjMSAmIDB4MjApID8gIkRNQSAiIDoKLQkJCQkJKGMxICYgMHg4MCkgPyAiUElPICIgOiAib2ZmICIsCi0JCQkJKGMyICYgMHgxMCkgPyAiVURNQSIgOiAoYzIgJiAweDIwKSA/ICJETUEgIiA6Ci0JCQkJCShjMiAmIDB4ODApID8gIlBJTyAiIDogIm9mZiAiLAotCQkJCShjMyAmIDB4MTApID8gIlVETUEiIDogKGMzICYgMHgyMCkgPyAiRE1BICIgOgotCQkJCQkoYzMgJiAweDgwKSA/ICJQSU8gIiA6ICJvZmYgIik7Ci0JCX0KLQl9Ci0jZW5kaWYKK3N0cnVjdCBocHRfaW5mbworeworCXU4IG1heF9tb2RlOwkJLyogU3BlZWRzIGFsbG93ZWQgKi8KKwlpbnQgcmV2aXNpb247CQkvKiBDaGlwc2V0IHJldmlzaW9uICovCisJaW50IGZsYWdzOwkJLyogQ2hpcHNldCBwcm9wZXJ0aWVzICovCisjZGVmaW5lIFBMTF9NT0RFCTEKKyNkZWZpbmUgSVNfMzcyTgkJMgorCQkJCS8qIFNwZWVkIHRhYmxlICovCisJc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKnNwZWVkOworfTsKIAotc3RhdGljIHUzMiBocHRfcmV2aXNpb24gKHN0cnVjdCBwY2lfZGV2ICpkZXYpCisvKgorICoJVGhpcyB3YW50cyBmaXhpbmcgc28gdGhhdCB3ZSBkbyBldmVyeXRoaW5nIG5vdCBieSBjbGFzc3JldgorICoJKHdoaWNoIGJyZWFrcyBvbiB0aGUgbmV3ZXN0IGNoaXBzKSBidXQgYnkgY3JlYXRpbmcgYW4KKyAqCWVudW1lcmF0aW9uIG9mIGNoaXAgdmFyaWFudHMgYW5kIHVzaW5nIHRoYXQKKyAqLworCitzdGF0aWMgX19kZXZpbml0IHUzMiBocHRfcmV2aXNpb24gKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJdTMyIGNsYXNzX3JldjsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfQ0xBU1NfUkVWSVNJT04sICZjbGFzc19yZXYpOwpAQCAtNTA3LDM3ICs0OTcsMzMgQEAKIAlyZXR1cm4gY2xhc3NfcmV2OwogfQogCi1zdGF0aWMgdTMyIGhwdF9taW5pbXVtX3JldmlzaW9uIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcmV2aXNpb24pCi17Ci0JdW5zaWduZWQgaW50IGNsYXNzX3JldiA9IGhwdF9yZXZpc2lvbihkZXYpOwotCXJldmlzaW9uLS07Ci0JcmV0dXJuICgoaW50KSAoY2xhc3NfcmV2ID4gcmV2aXNpb24pID8gMSA6IDApOwotfQotCiBzdGF0aWMgaW50IGNoZWNrX2luX2RyaXZlX2xpc3RzKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqKmxpc3QpOwogCiBzdGF0aWMgdTggaHB0M3h4X3JhdGVtYXNrIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldgk9IEhXSUYoZHJpdmUpLT5wY2lfZGV2OworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCXU4IG1vZGUJCQk9IDA7CiAKLQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA4KSkgewkJLyogSFBUMzc0ICovCisJLyogRklYTUU6IFRPRE8gLSBtb3ZlIHRoaXMgdG8gc2V0IGluZm8tPm1vZGUgb25jZSBhdCBib290ICovCisKKwlpZiAoaW5mby0+cmV2aXNpb24gPj0gOCkgewkJLyogSFBUMzc0ICovCiAJCW1vZGUgPSAoSFBUMzc0X0FMTE9XX0FUQTEzM182KSA/IDQgOiAzOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA3KSkgewkvKiBIUFQzNzEgKi8KKwl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDcpIHsJLyogSFBUMzcxICovCiAJCW1vZGUgPSAoSFBUMzcxX0FMTE9XX0FUQTEzM182KSA/IDQgOiAzOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA2KSkgewkvKiBIUFQzMDIgKi8KKwl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDYpIHsJLyogSFBUMzAyICovCiAJCW1vZGUgPSAoSFBUMzAyX0FMTE9XX0FUQTEzM182KSA/IDQgOiAzOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA1KSkgewkvKiBIUFQzNzIgKi8KKwl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDUpIHsJLyogSFBUMzcyICovCiAJCW1vZGUgPSAoSFBUMzcyX0FMTE9XX0FUQTEzM182KSA/IDQgOiAzOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA0KSkgewkvKiBIUFQzNzBBICovCisJfSBlbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA0KSB7CS8qIEhQVDM3MEEgKi8KIAkJbW9kZSA9IChIUFQzNzBfQUxMT1dfQVRBMTAwXzUpID8gMyA6IDI7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKSB7CS8qIEhQVDM3MCAqLworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gMykgewkvKiBIUFQzNzAgKi8KIAkJbW9kZSA9IChIUFQzNzBfQUxMT1dfQVRBMTAwXzUpID8gMyA6IDI7CiAJCW1vZGUgPSAoY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIGJhZF9hdGEzMykpID8gMCA6IG1vZGU7CiAJfSBlbHNlIHsJCQkJLyogSFBUMzY2IGFuZCBIUFQzNjggKi8KIAkJbW9kZSA9IChjaGVja19pbl9kcml2ZV9saXN0cyhkcml2ZSwgYmFkX2F0YTMzKSkgPyAwIDogMjsKIAl9Ci0JaWYgKCFlaWdodHlfbmludHlfdGhyZWUoZHJpdmUpICYmIChtb2RlKSkKKwlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkgJiYgbW9kZSkKIAkJbW9kZSA9IG1pbihtb2RlLCAodTgpMSk7CiAJcmV0dXJuIG1vZGU7CiB9CkBAIC01NDksNyArNTM1LDggQEAKICAKIHN0YXRpYyB1OCBocHQzeHhfcmF0ZWZpbHRlciAoaWRlX2RyaXZlX3QgKmRyaXZlLCB1OCBzcGVlZCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBocHRfaW5mbyAqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdTggbW9kZQkJCT0gaHB0M3h4X3JhdGVtYXNrKGRyaXZlKTsKIAogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spCkBAIC01NjEsNyArNTQ4LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIDB4MDM6CiAJCQlzcGVlZCA9IG1pbihzcGVlZCwgKHU4KVhGRVJfVURNQV81KTsKLQkJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDUpKQorCQkJaWYgKGluZm8tPnJldmlzaW9uID49IDUpCiAJCQkJYnJlYWs7CiAJCQlpZiAoY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIGJhZF9hdGExMDBfNSkpCiAJCQkJc3BlZWQgPSBtaW4oc3BlZWQsICh1OClYRkVSX1VETUFfNCk7CkBAIC01NzEsNyArNTU4LDcgQEAKIAkvKgogCSAqIENIRUNLIE1FLCBEb2VzIHRoaXMgbmVlZCB0byBiZSBzZXQgdG8gNSA/PwogCSAqLwotCQkJaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgMykpCisJCQlpZiAoaW5mby0+cmV2aXNpb24gPj0gMykKIAkJCQlicmVhazsKIAkJCWlmICgoY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIGJhZF9hdGE2Nl80KSkgfHwKIAkJCSAgICAoIShIUFQzNjZfQUxMT1dfQVRBNjZfNCkpKQpAQCAtNTg1LDcgKzU3Miw3IEBACiAJLyoKIAkgKiBDSEVDSyBNRSwgRG9lcyB0aGlzIG5lZWQgdG8gYmUgc2V0IHRvIDUgPz8KIAkgKi8KLQkJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKQorCQkJaWYgKGluZm8tPnJldmlzaW9uID49IDMpCiAJCQkJYnJlYWs7CiAJCQlpZiAoY2hlY2tfaW5fZHJpdmVfbGlzdHMoZHJpdmUsIGJhZF9hdGEzMykpCiAJCQkJc3BlZWQgPSBtaW4oc3BlZWQsICh1OClYRkVSX01XX0RNQV8yKTsKQEAgLTYyNCwxMSArNjExLDEyIEBACiAKIHN0YXRpYyBpbnQgaHB0MzZ4X3R1bmVfY2hpcHNldChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXN0cnVjdCBocHRfaW5mbwkqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdTggc3BlZWQJCT0gaHB0M3h4X3JhdGVmaWx0ZXIoZHJpdmUsIHhmZXJzcGVlZCk7Ci0vLwl1OCBzcGVlZAkJPSBpZGVfcmF0ZV9maWx0ZXIoaHB0M3h4X3JhdGVtYXNrKGRyaXZlKSwgeGZlcnNwZWVkKTsKIAl1OCByZWd0aW1lCQk9IChkcml2ZS0+c2VsZWN0LmIudW5pdCAmIDB4MDEpID8gMHg0NCA6IDB4NDA7Ci0JdTggcmVnZmFzdAkJPSAoSFdJRihkcml2ZSktPmNoYW5uZWwpID8gMHg1NSA6IDB4NTE7CisJdTggcmVnZmFzdAkJPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDU1IDogMHg1MTsKIAl1OCBkcml2ZV9mYXN0CQk9IDA7CiAJdTMyIHJlZzEgPSAwLCByZWcyCT0gMDsKIApAQCAtNjM2LDE2ICs2MjQsMTEgQEAKIAkgKiBEaXNhYmxlIHRoZSAiZmFzdCBpbnRlcnJ1cHQiIHByZWRpY3Rpb24uCiAJICovCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCAmZHJpdmVfZmFzdCk7Ci0jaWYgMAotCWlmIChkcml2ZV9mYXN0ICYgMHgwMikKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgcmVnZmFzdCwgZHJpdmVfZmFzdCAmIH4weDIwKTsKLSNlbHNlCiAJaWYgKGRyaXZlX2Zhc3QgJiAweDgwKQogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCBkcml2ZV9mYXN0ICYgfjB4ODApOwotI2VuZGlmCiAKLQlyZWcyID0gcGNpX2J1c19jbG9ja19saXN0KHNwZWVkLAotCQkoc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKikgcGNpX2dldF9kcnZkYXRhKGRldikpOworCXJlZzIgPSBwY2lfYnVzX2Nsb2NrX2xpc3Qoc3BlZWQsIGluZm8tPnNwZWVkKTsKKwogCS8qCiAJICogRGlzYWJsZSBvbi1jaGlwIFBJTyBGSUZPL2J1ZmZlcgogCSAqICAodG8gYXZvaWQgcHJvYmxlbXMgaGFuZGxpbmcgSS9PIGVycm9ycyBsYXRlcikKQEAgLTY2NSwxMCArNjQ4LDExIEBACiAKIHN0YXRpYyBpbnQgaHB0MzcwX3R1bmVfY2hpcHNldChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OworCXN0cnVjdCBocHRfaW5mbwkqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdTggc3BlZWQJPSBocHQzeHhfcmF0ZWZpbHRlcihkcml2ZSwgeGZlcnNwZWVkKTsKLS8vCXU4IHNwZWVkCT0gaWRlX3JhdGVfZmlsdGVyKGhwdDN4eF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7Ci0JdTggcmVnZmFzdAk9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbCkgPyAweDU1IDogMHg1MTsKKwl1OCByZWdmYXN0CT0gKGRyaXZlLT5od2lmLT5jaGFubmVsKSA/IDB4NTUgOiAweDUxOwogCXU4IGRyaXZlX3BjaQk9IDB4NDAgKyAoZHJpdmUtPmRuICogNCk7CiAJdTggbmV3X2Zhc3QJPSAwLCBkcml2ZV9mYXN0ID0gMDsKIAl1MzIgbGlzdF9jb25mCT0gMCwgZHJpdmVfY29uZiA9IDA7CkBAIC02OTMsMTcgKzY3NywxMyBAQAogCWlmIChuZXdfZmFzdCAhPSBkcml2ZV9mYXN0KQogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCBuZXdfZmFzdCk7CiAKLQlsaXN0X2NvbmYgPSBwY2lfYnVzX2Nsb2NrX2xpc3Qoc3BlZWQsIAotCQkJCSAgICAgICAoc3RydWN0IGNoaXBzZXRfYnVzX2Nsb2NrX2xpc3RfZW50cnkgKikKLQkJCQkgICAgICAgcGNpX2dldF9kcnZkYXRhKGRldikpOworCWxpc3RfY29uZiA9IHBjaV9idXNfY2xvY2tfbGlzdChzcGVlZCwgaW5mby0+c3BlZWQpOwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCAmZHJpdmVfY29uZik7CiAJbGlzdF9jb25mID0gKGxpc3RfY29uZiAmIH5jb25mX21hc2spIHwgKGRyaXZlX2NvbmYgJiBjb25mX21hc2spOwogCQotCWlmIChzcGVlZCA8IFhGRVJfTVdfRE1BXzApIHsKKwlpZiAoc3BlZWQgPCBYRkVSX01XX0RNQV8wKQogCQlsaXN0X2NvbmYgJj0gfjB4ODAwMDAwMDA7IC8qIERpc2FibGUgb24tY2hpcCBQSU8gRklGTy9idWZmZXIgKi8KLQl9Ci0KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgZHJpdmVfcGNpLCBsaXN0X2NvbmYpOwogCiAJcmV0dXJuIGlkZV9jb25maWdfZHJpdmVfc3BlZWQoZHJpdmUsIHNwZWVkKTsKQEAgLTcxMSwxMCArNjkxLDExIEBACiAKIHN0YXRpYyBpbnQgaHB0MzcyX3R1bmVfY2hpcHNldChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHhmZXJzcGVlZCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2CT0gSFdJRihkcml2ZSktPnBjaV9kZXY7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBod2lmLT5wY2lfZGV2OworCXN0cnVjdCBocHRfaW5mbwkqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdTggc3BlZWQJPSBocHQzeHhfcmF0ZWZpbHRlcihkcml2ZSwgeGZlcnNwZWVkKTsKLS8vCXU4IHNwZWVkCT0gaWRlX3JhdGVfZmlsdGVyKGhwdDN4eF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7Ci0JdTggcmVnZmFzdAk9IChIV0lGKGRyaXZlKS0+Y2hhbm5lbCkgPyAweDU1IDogMHg1MTsKKwl1OCByZWdmYXN0CT0gKGRyaXZlLT5od2lmLT5jaGFubmVsKSA/IDB4NTUgOiAweDUxOwogCXU4IGRyaXZlX2Zhc3QJPSAwLCBkcml2ZV9wY2kgPSAweDQwICsgKGRyaXZlLT5kbiAqIDQpOwogCXUzMiBsaXN0X2NvbmYJPSAwLCBkcml2ZV9jb25mID0gMDsKIAl1MzIgY29uZl9tYXNrCT0gKHNwZWVkID49IFhGRVJfTVdfRE1BXzApID8gMHhjMDAwMDAwMCA6IDB4MzAwNzAwMDA7CkBAIC03MjYsMTAgKzcwNyw4IEBACiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCAmZHJpdmVfZmFzdCk7CiAJZHJpdmVfZmFzdCAmPSB+MHgwNzsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWdmYXN0LCBkcml2ZV9mYXN0KTsKLQkJCQkJCi0JbGlzdF9jb25mID0gcGNpX2J1c19jbG9ja19saXN0KHNwZWVkLAotCQkJKHN0cnVjdCBjaGlwc2V0X2J1c19jbG9ja19saXN0X2VudHJ5ICopCi0JCQkJCXBjaV9nZXRfZHJ2ZGF0YShkZXYpKTsKKworCWxpc3RfY29uZiA9IHBjaV9idXNfY2xvY2tfbGlzdChzcGVlZCwgaW5mby0+c3BlZWQpOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGRyaXZlX3BjaSwgJmRyaXZlX2NvbmYpOwogCWxpc3RfY29uZiA9IChsaXN0X2NvbmYgJiB+Y29uZl9tYXNrKSB8IChkcml2ZV9jb25mICYgY29uZl9tYXNrKTsKIAlpZiAoc3BlZWQgPCBYRkVSX01XX0RNQV8wKQpAQCAtNzQxLDE5ICs3MjAsMTQgQEAKIAogc3RhdGljIGludCBocHQzeHhfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIHU4IHNwZWVkKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYJPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGhwdF9pbmZvCSppbmZvCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAotCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDgpKQorCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KQogCQlyZXR1cm4gaHB0MzcyX3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOyAvKiBub3QgYSB0eXBvICovCi0jaWYgMAotCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwgNykpCi0JCWhwdDM3MV90dW5lX2NoaXBzZXQoZHJpdmUsIHNwZWVkKTsKLQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDYpKQotCQlocHQzMDJfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7Ci0jZW5kaWYKLQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDUpKQorCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDUpCiAJCXJldHVybiBocHQzNzJfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7Ci0JZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCAzKSkKKwllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKQogCQlyZXR1cm4gaHB0MzcwX3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOwogCWVsc2UJLyogaHB0MzY4OiBocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDIpICovCiAJCXJldHVybiBocHQzNnhfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CkBAIC03NzksOCArNzUzLDE0IEBACiBzdGF0aWMgaW50IGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEgKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAl1OCBzcGVlZCA9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIGhwdDN4eF9yYXRlbWFzayhkcml2ZSkpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaHB0X2luZm8JKmluZm8JPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOwogCi0JaWYgKCEoc3BlZWQpKQorCWlmICghc3BlZWQpCisJCXJldHVybiAwOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgdGltaW5ncyB3ZSBjYW4ndCBkbyBhIGxvdCAqLworCWlmIChpbmZvLT5zcGVlZCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAogCSh2b2lkKSBocHQzeHhfdHVuZV9jaGlwc2V0KGRyaXZlLCBzcGVlZCk7CkBAIC03OTQsNyArNzc0LDcgQEAKIAogc3RhdGljIHZvaWQgaHB0M3h4X2ludHJwcm9jIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZiA9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAogCWlmIChkcml2ZS0+cXVpcmtfbGlzdCkKIAkJcmV0dXJuOwpAQCAtODA0LDI0ICs3ODQsMjYgQEAKIAogc3RhdGljIHZvaWQgaHB0M3h4X21hc2twcm9jIChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBtYXNrKQogewotCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBIV0lGKGRyaXZlKS0+cGNpX2RldjsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGhwdF9pbmZvICppbmZvID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIAogCWlmIChkcml2ZS0+cXVpcmtfbGlzdCkgewotCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDMpKSB7CisJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSAzKSB7CiAJCQl1OCByZWc1YSA9IDA7CiAJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWEsICZyZWc1YSk7CiAJCQlpZiAoKChyZWc1YSAmIDB4MTApID4+IDQpICE9IG1hc2spCiAJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgbWFzayA/IChyZWc1YSB8IDB4MTApIDogKHJlZzVhICYgfjB4MTApKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChtYXNrKSB7Ci0JCQkJZGlzYWJsZV9pcnEoSFdJRihkcml2ZSktPmlycSk7CisJCQkJZGlzYWJsZV9pcnEoaHdpZi0+aXJxKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZW5hYmxlX2lycShIV0lGKGRyaXZlKS0+aXJxKTsKKwkJCQllbmFibGVfaXJxKGh3aWYtPmlycSk7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoSURFX0NPTlRST0xfUkVHKQotCQkJSFdJRihkcml2ZSktPk9VVEIobWFzayA/IChkcml2ZS0+Y3RsIHwgMikgOgorCQkJaHdpZi0+T1VUQihtYXNrID8gKGRyaXZlLT5jdGwgfCAyKSA6CiAJCQkJCQkgKGRyaXZlLT5jdGwgJiB+MiksCiAJCQkJCQkgSURFX0NPTlRST0xfUkVHKTsKIAl9CkBAIC04MjksMTIgKzgxMSwxMiBAQAogCiBzdGF0aWMgaW50IGhwdDM2Nl9jb25maWdfZHJpdmVfeGZlcl9yYXRlIChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0JaWRlX2h3aWZfdCAqaHdpZgk9IEhXSUYoZHJpdmUpOworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgaGRfZHJpdmVpZCAqaWQJPSBkcml2ZS0+aWQ7CiAKIAlkcml2ZS0+aW5pdF9zcGVlZCA9IDA7CiAKLQlpZiAoaWQgJiYgKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgZHJpdmUtPmF1dG9kbWEpIHsKKwlpZiAoKGlkLT5jYXBhYmlsaXR5ICYgMSkgJiYgZHJpdmUtPmF1dG9kbWEpIHsKIAogCQlpZiAoaWRlX3VzZV9kbWEoZHJpdmUpKSB7CiAJCQlpZiAoY29uZmlnX2NoaXBzZXRfZm9yX2RtYShkcml2ZSkpCkBAIC04NjgsMTUgKzg1MCw2IEBACiAJCWRyaXZlLT5uYW1lLCBfX0ZVTkNUSU9OX18sIHJlZzUwaCwgcmVnNTJoLCByZWc1YWgpOwogCWlmIChyZWc1YWggJiAweDEwKQogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCByZWc1YWggJiB+MHgxMCk7Ci0jaWYgMAotCS8qIGhvdyBhYm91dCB3ZSBmbHVzaCBhbmQgcmVzZXQsIG1tbWtheT8gKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUxLCAweDFGKTsKLQkvKiBmYWxsIHRocm91Z2ggdG8gYSByZXNldCAqLwotCWNhc2UgZG1hX3N0YXJ0OgotCWNhc2UgaWRlX2RtYV9lbmQ6Ci0JLyogcmVzZXQgdGhlIGNoaXBzIHN0YXRlIG92ZXIgYW5kIG92ZXIuLiAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTEsIDB4MTMpOwotI2VuZGlmCiAJcmV0dXJuIF9faWRlX2RtYV9sb3N0aXJxKGRyaXZlKTsKIH0KIApAQCAtOTE5LDcgKzg5Miw3IEBACiAJdTggZG1hX3N0YXQgPSAwLCBkbWFfY21kID0gMDsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCByZWdpbmZvLCAmYmZpZm8pOwotCXByaW50aygiJXM6ICVkIGJ5dGVzIGluIEZJRk9cbiIsIGRyaXZlLT5uYW1lLCBiZmlmbyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlZCBieXRlcyBpbiBGSUZPXG4iLCBkcml2ZS0+bmFtZSwgYmZpZm8pOwogCWhwdDM3MF9jbGVhcl9lbmdpbmUoZHJpdmUpOwogCS8qIGdldCBkbWEgY29tbWFuZCBtb2RlICovCiAJZG1hX2NtZCA9IGh3aWYtPklOQihod2lmLT5kbWFfY29tbWFuZCk7CkBAIC0xMDQ3LDE1ICsxMDIwLDYgQEAKIAogc3RhdGljIHZvaWQgaHB0M3h4X3Jlc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0jaWYgMAotCXVuc2lnbmVkIGxvbmcgaGlnaF8xNgk9IHBjaV9yZXNvdXJjZV9zdGFydChIV0lGKGRyaXZlKS0+cGNpX2RldiwgNCk7Ci0JdTggcmVzZXQJPSAoSFdJRihkcml2ZSktPmNoYW5uZWwpID8gMHg4MCA6IDB4NDA7Ci0JdTggcmVnNTloCT0gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCAweDU5LCAmcmVnNTloKTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSFdJRihkcml2ZSktPnBjaV9kZXYsIDB4NTksIHJlZzU5aHxyZXNldCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEhXSUYoZHJpdmUpLT5wY2lfZGV2LCAweDU5LCByZWc1OWgpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgaHB0M3h4X3RyaXN0YXRlIChpZGVfZHJpdmVfdCAqIGRyaXZlLCBpbnQgc3RhdGUpCkBAIC0xMDY1LDggKzEwMjksNiBAQAogCXU4IHJlZzU5aCA9IDAsIHJlc2V0CT0gKGh3aWYtPmNoYW5uZWwpID8gMHg4MCA6IDB4NDA7CiAJdTggcmVnWFhoID0gMCwgc3RhdGVfcmVnPSAoaHdpZi0+Y2hhbm5lbCkgPyAweDU3IDogMHg1MzsKIAotLy8JaHdpZi0+YnVzX3N0YXRlID0gc3RhdGU7Ci0KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NTksICZyZWc1OWgpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgc3RhdGVfcmVnLCAmcmVnWFhoKTsKIApAQCAtMTA5Myw3ICsxMDU1LDcgQEAKICNkZWZpbmUgVFJJU1RBVEVfQklUICAweDgwMDAKIHN0YXRpYyBpbnQgaHB0MzcwX2J1c3Byb2MoaWRlX2RyaXZlX3QgKiBkcml2ZSwgaW50IHN0YXRlKQogewotCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHBjaV9kZXYgKmRldgk9IGh3aWYtPnBjaV9kZXY7CiAJdTggdHJpc3RhdGUgPSAwLCByZXNldG1hc2sgPSAwLCBidXNfcmVnID0gMDsKIAl1MTYgdHJpX3JlZzsKQEAgLTExNDgsMzMgKzExMTAsNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9ocHQzN3goc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBocHQzNjZfY2xvY2tpbmcoaWRlX2h3aWZfdCAqaHdpZikKIHsKKwl1MzIgcmVnMQk9IDA7CisJc3RydWN0IGhwdF9pbmZvICppbmZvID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChod2lmLT5wY2lfZGV2LCAweDQwLCAmcmVnMSk7CisKKwkvKiBkZXRlY3QgYnVzIHNwZWVkIGJ5IGxvb2tpbmcgYXQgY29udHJvbCByZWcgdGltaW5nOiAqLworCXN3aXRjaCgocmVnMSA+PiA4KSAmIDcpIHsKKwkJY2FzZSA1OgorCQkJaW5mby0+c3BlZWQgPSBmb3J0eV9iYXNlX2hwdDM2NjsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQlpbmZvLT5zcGVlZCA9IHR3ZW50eV9maXZlX2Jhc2VfaHB0MzY2OworCQkJYnJlYWs7CisJCWNhc2UgNzoKKwkJZGVmYXVsdDoKKwkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzY2OworCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaHB0Mzd4X2Nsb2NraW5nKGlkZV9od2lmX3QgKmh3aWYpCit7CisJc3RydWN0IGhwdF9pbmZvICppbmZvID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIAlpbnQgYWRqdXN0LCBpOwogCXUxNiBmcmVxOwogCXUzMiBwbGw7CiAJdTggcmVnNWJoOwotCXU4IHJlZzVhaCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBkbWFiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgNCk7Ci0JdTggZGlkLCByaWQ7CQotCWludCBpc18zNzJuID0gMDsKIAkKLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NWEsICZyZWc1YWgpOwotCS8qIGludGVycnVwdCBmb3JjZSBlbmFibGUgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAocmVnNWFoICYgfjB4MTApKTsKLQotCWlmKGRtYWJhc2UpCi0JewotCQlkaWQgPSBpbmIoZG1hYmFzZSArIDB4MjIpOwotCQlyaWQgPSBpbmIoZG1hYmFzZSArIDB4MjgpOwotCQotCQlpZigoZGlkID09IDQgJiYgcmlkID09IDYpIHx8IChkaWQgPT0gNSAmJiByaWQgPiAxKSkKLQkJCWlzXzM3Mm4gPSAxOwotCX0KLQogCS8qCiAJICogZGVmYXVsdCB0byBwY2kgY2xvY2suIG1ha2Ugc3VyZSBNQTE1LzE2IGFyZSBzZXQgdG8gb3V0cHV0Ci0JICogdG8gcHJldmVudCBkcml2ZXMgaGF2aW5nIHByb2JsZW1zIHdpdGggNDAtcGluIGNhYmxlcy4KKwkgKiB0byBwcmV2ZW50IGRyaXZlcyBoYXZpbmcgcHJvYmxlbXMgd2l0aCA0MC1waW4gY2FibGVzLiBOZWVkZWQKKwkgKiBmb3Igc29tZSBkcml2ZXMgc3VjaCBhcyBJQk0tRFRMQSB3aGljaCB3aWxsIG5vdCBlbnRlciByZWFkeQorCSAqIHN0YXRlIG9uIHJlc2V0IHdoZW4gUERJQUcgaXMgYSBpbnB1dC4KKwkgKgorCSAqIFRvRG86IHNob3VsZCB3ZSBzZXQgMHgyMSB3aGVuIHVzaW5nIFBMTCBtb2RlID8KIAkgKi8KIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDViLCAweDIzKTsKIApAQCAtMTE5Nyw5ICsxMTcwLDcgQEAKIAkgKiBDdXJyZW50bHkgd2UgYWx3YXlzIHNldCB1cCB0aGUgUExMIGZvciB0aGUgMzcyTgogCSAqLwogCSAKLQlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKLQkKLQlpZihpc18zNzJuKQorCWlmKGluZm8tPmZsYWdzICYgSVNfMzcyTikKIAl7CiAJCXByaW50ayhLRVJOX0lORk8gImhwdDogSFBUMzcyTiBkZXRlY3RlZCwgdXNpbmcgMzcyTiB0aW1pbmcuXG4iKTsKIAkJaWYoZnJlcSA8IDB4NTUpCkBAIC0xMjI3LDM5ICsxMTk4LDM4IEBACiAJCQlwbGwgPSBGX0xPV19QQ0lfNjY7CiAJCiAJCWlmIChwbGwgPT0gRl9MT1dfUENJXzMzKSB7Ci0JCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDgpKQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3NCk7Ci0JCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgdGhpcnR5X3RocmVlX2Jhc2VfaHB0MzcyKTsKLQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw0KSkKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzBhKTsKKwkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KQorCQkJCWluZm8tPnNwZWVkID0gdGhpcnR5X3RocmVlX2Jhc2VfaHB0Mzc0OworCQkJZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gNSkKKwkJCQlpbmZvLT5zcGVlZCA9IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MjsKKwkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpCisJCQkJaW5mby0+c3BlZWQgPSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNzBhOwogCQkJZWxzZQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MCk7Ci0JCQlwcmludGsoIkhQVDM3WDogdXNpbmcgMzNNSHogUENJIGNsb2NrXG4iKTsKKwkJCQlpbmZvLT5zcGVlZCA9IHRoaXJ0eV90aHJlZV9iYXNlX2hwdDM3MDsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJIUFQzN1g6IHVzaW5nIDMzTUh6IFBDSSBjbG9ja1xuIik7CiAJCX0gZWxzZSBpZiAocGxsID09IEZfTE9XX1BDSV80MCkgewogCQkJLyogVW5zdXBwb3J0ZWQgKi8KIAkJfSBlbHNlIGlmIChwbGwgPT0gRl9MT1dfUENJXzUwKSB7Ci0JCQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDgpKQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7Ci0JCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzIpOwotCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDQpKQotCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7CisJCQlpZiAoaW5mby0+cmV2aXNpb24gPj0gOCkKKwkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcwYTsKKwkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDUpCisJCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MjsKKwkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpCisJCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MGE7CiAJCQllbHNlCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKLQkJCXByaW50aygiSFBUMzdYOiB1c2luZyA1ME1IeiBQQ0kgY2xvY2tcbiIpOworCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkhQVDM3WDogdXNpbmcgNTBNSHogUENJIGNsb2NrXG4iKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsOCkpCi0JCQl7CisJCQlpZiAoaW5mby0+cmV2aXNpb24gPj0gOCkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiSFBUMzd4OiA2Nk1IeiB0aW1pbmdzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIik7CiAJCQl9Ci0JCQllbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsNSkpCi0JCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgc2l4dHlfc2l4X2Jhc2VfaHB0MzcyKTsKLQkJCWVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiw0KSkKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBzaXh0eV9zaXhfYmFzZV9ocHQzNzBhKTsKKwkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDUpCisJCQkJaW5mby0+c3BlZWQgPSBzaXh0eV9zaXhfYmFzZV9ocHQzNzI7CisJCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA0KQorCQkJCWluZm8tPnNwZWVkID0gc2l4dHlfc2l4X2Jhc2VfaHB0MzcwYTsKIAkJCWVsc2UKLQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBzaXh0eV9zaXhfYmFzZV9ocHQzNzApOwotCQkJcHJpbnRrKCJIUFQzN1g6IHVzaW5nIDY2TUh6IFBDSSBjbG9ja1xuIik7CisJCQkJaW5mby0+c3BlZWQgPSBzaXh0eV9zaXhfYmFzZV9ocHQzNzA7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiSFBUMzdYOiB1c2luZyA2Nk1IeiBQQ0kgY2xvY2tcbiIpOwogCQl9CiAJfQogCQpAQCAtMTI2OSwxMSArMTIzOSwxOSBAQAogCSAqIHJlc3VsdCBpbiBzbG93IHJlYWRzIHdoZW4gdXNpbmcgYSAzM01IeiBQQ0kgY2xvY2suIHdlIGFsc28KIAkgKiBkb24ndCBsaWtlIHRvIHVzZSB0aGUgUExMIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBnbGl0Y2hlcwogCSAqIG9uIFBSU1QvU1JTVCB3aGVuIHRoZSBIUFQgc3RhdGUgZW5naW5lIGdldHMgcmVzZXQuCisJICoKKwkgKiBUb0RvOiBVc2UgNjZNSHogUExMIHdoZW4gQVRBMTMzIGRldmljZXMgYXJlIHByZXNlbnQgb24gYQorCSAqIDM3MiBkZXZpY2Ugc28gd2UgY2FuIGdldCBBVEExMzMgc3VwcG9ydAogCSAqLwotCWlmIChwY2lfZ2V0X2RydmRhdGEoZGV2KSkgCisJaWYgKGluZm8tPnNwZWVkKQogCQlnb3RvIGluaXRfaHB0MzdYX2RvbmU7CisKKwlpbmZvLT5mbGFncyB8PSBQTExfTU9ERTsKIAkKIAkvKgorCSAqIEZJWE1FOiBtYWtlIHRoaXMgd29yayBjb3JyZWN0bHksIGVzcCB3aXRoIDM3Mk4gYXMgcGVyCisJICogcmVmZXJlbmNlIGRyaXZlciBjb2RlLgorCSAqCiAJICogYWRqdXN0IFBMTCBiYXNlZCB1cG9uIFBDSSBjbG9jaywgZW5hYmxlIGl0LCBhbmQgd2FpdCBmb3IKIAkgKiBzdGFiaWxpemF0aW9uLgogCSAqLwpAQCAtMTI5OCwxNCArMTI3NiwxNCBAQAogCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDVjLCAKIAkJCQkJCSAgICAgICBwbGwgJiB+MHgxMDApOwogCQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWIsIDB4MjEpOwotCQkJCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsOCkpCi0JCQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIGZpZnR5X2Jhc2VfaHB0MzcwYSk7Ci0JCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDUpKQotCQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmaWZ0eV9iYXNlX2hwdDM3Mik7Ci0JCQkJZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDQpKQotCQkJCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSBmaWZ0eV9iYXNlX2hwdDM3MGEpOworCQkJCWlmIChpbmZvLT5yZXZpc2lvbiA+PSA4KQorCQkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcwYTsKKwkJCQllbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA1KQorCQkJCQlpbmZvLT5zcGVlZCA9IGZpZnR5X2Jhc2VfaHB0MzcyOworCQkJCWVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDQpCisJCQkJCWluZm8tPnNwZWVkID0gZmlmdHlfYmFzZV9ocHQzNzBhOwogCQkJCWVsc2UKLQkJCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZmlmdHlfYmFzZV9ocHQzNzBhKTsKKwkJCQkJaW5mby0+c3BlZWQgPSBmaWZ0eV9iYXNlX2hwdDM3MGE7CiAJCQkJcHJpbnRrKCJIUFQzN1g6IHVzaW5nIDUwTUh6IGludGVybmFsIFBMTFxuIik7CiAJCQkJZ290byBpbml0X2hwdDM3WF9kb25lOwogCQkJfQpAQCAtMTMxOCwxMCArMTI5NiwyMiBAQAogCX0gCiAKIGluaXRfaHB0MzdYX2RvbmU6CisJaWYgKCFpbmZvLT5zcGVlZCkKKwkJcHJpbnRrKEtFUk5fRVJSICJIUFQzN1glczogdW5rbm93biBidXMgdGltaW5nIFslZCAlZF0uXG4iLAorCQkJKGluZm8tPmZsYWdzICYgSVNfMzcyTik/Ik4iOiIiLCBwbGwsIGZyZXEpOwogCS8qIHJlc2V0IHN0YXRlIGVuZ2luZSAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NTAsIDB4MzcpOyAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDU0LCAweDM3KTsgCiAJdWRlbGF5KDEwMCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfaHB0Mzd4KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggcmVnNWFoOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDVhLCAmcmVnNWFoKTsKKwkvKiBpbnRlcnJ1cHQgZm9yY2UgZW5hYmxlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgKHJlZzVhaCAmIH4weDEwKSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMzgsNTkgKzEzMjgsMjcgQEAKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MSwgZHJpdmVfZmFzdCAmIH4weDgwKTsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAmcmVnMSk7CiAJCQkJCQkJCQkKLQkvKiBkZXRlY3QgYnVzIHNwZWVkIGJ5IGxvb2tpbmcgYXQgY29udHJvbCByZWcgdGltaW5nOiAqLwotCXN3aXRjaCgocmVnMSA+PiA4KSAmIDcpIHsKLQkJY2FzZSA1OgotCQkJcGNpX3NldF9kcnZkYXRhKGRldiwgKHZvaWQgKikgZm9ydHlfYmFzZV9ocHQzNjYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgOToKLQkJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsICh2b2lkICopIHR3ZW50eV9maXZlX2Jhc2VfaHB0MzY2KTsKLQkJCWJyZWFrOwotCQljYXNlIDc6Ci0JCWRlZmF1bHQ6Ci0JCQlwY2lfc2V0X2RydmRhdGEoZGV2LCAodm9pZCAqKSB0aGlydHlfdGhyZWVfYmFzZV9ocHQzNjYpOwotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFwY2lfZ2V0X2RydmRhdGEoZGV2KSkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiaHB0MzY2OiB1bmtub3duIGJ1cyB0aW1pbmcuXG4iKTsKLQkJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0JfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBpbml0X2NoaXBzZXRfaHB0MzY2KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaW50IHJldCA9IDA7Ci0JdTggdGVzdCA9IDA7Ci0KKwkvKiBGSVhNRTogTm90IHBvcnRhYmxlICovCiAJaWYgKGRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQpCiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9ST01fQUREUkVTUywKIAkJCWRldi0+cmVzb3VyY2VbUENJX1JPTV9SRVNPVVJDRV0uc3RhcnQgfCBQQ0lfUk9NX0FERFJFU1NfRU5BQkxFKTsKIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJnRlc3QpOwotCWlmICh0ZXN0ICE9IChMMV9DQUNIRV9CWVRFUyAvIDQpKQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLAotCQkJKEwxX0NBQ0hFX0JZVEVTIC8gNCkpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsIChMMV9DQUNIRV9CWVRFUyAvIDQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg3OCk7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsIDB4MDgpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NQVhfTEFULCAweDA4KTsKIAotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZ0ZXN0KTsKLQlpZiAodGVzdCAhPSAweDc4KQotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg3OCk7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9NSU5fR05ULCAmdGVzdCk7Ci0JaWYgKHRlc3QgIT0gMHgwOCkKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX01JTl9HTlQsIDB4MDgpOwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTUFYX0xBVCwgJnRlc3QpOwotCWlmICh0ZXN0ICE9IDB4MDgpCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9NQVhfTEFULCAweDA4KTsKLQotCWlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsIDMpKSB7CisJaWYgKGhwdF9yZXZpc2lvbihkZXYpID49IDMpCiAJCXJldCA9IGluaXRfaHB0Mzd4KGRldik7Ci0JfSBlbHNlIHsKLQkJcmV0ID1pbml0X2hwdDM2NihkZXYpOwotCX0KKwllbHNlCisJCXJldCA9IGluaXRfaHB0MzY2KGRldik7CisKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNDAwLDI3ICsxMzU4LDE2IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX2hwdDM2NihpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYJCT0gaHdpZi0+cGNpX2RldjsKKwlzdHJ1Y3QgaHB0X2luZm8gKmluZm8JCT0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKIAl1OCBhdGE2NiA9IDAsIHJlZ21hc2sJCT0gKGh3aWYtPmNoYW5uZWwpID8gMHgwMSA6IDB4MDI7Ci0JdTggZGlkLCByaWQ7Ci0JdW5zaWduZWQgbG9uZyBkbWFiYXNlCQk9IGh3aWYtPmRtYV9iYXNlOwotCWludCBpc18zNzJuID0gMDsKIAkKLQlpZihkbWFiYXNlKQotCXsKLQkJZGlkID0gaW5iKGRtYWJhc2UgKyAweDIyKTsKLQkJcmlkID0gaW5iKGRtYWJhc2UgKyAweDI4KTsKLQkKLQkJaWYoKGRpZCA9PSA0ICYmIHJpZCA9PSA2KSB8fCAoZGlkID09IDUgJiYgcmlkID4gMSkpCi0JCQlpc18zNzJuID0gMTsKLQl9Ci0JCQogCWh3aWYtPnR1bmVwcm9jCQkJPSAmaHB0M3h4X3R1bmVfZHJpdmU7CiAJaHdpZi0+c3BlZWRwcm9jCQkJPSAmaHB0M3h4X3R1bmVfY2hpcHNldDsKIAlod2lmLT5xdWlya3Byb2MJCQk9ICZocHQzeHhfcXVpcmtwcm9jOwogCWh3aWYtPmludHJwcm9jCQkJPSAmaHB0M3h4X2ludHJwcm9jOwogCWh3aWYtPm1hc2twcm9jCQkJPSAmaHB0M3h4X21hc2twcm9jOwogCQotCWlmKGlzXzM3Mm4pCisJaWYoaW5mby0+ZmxhZ3MgJiBJU18zNzJOKQogCQlod2lmLT5yd19kaXNrID0gJmhwdDM3Mm5fcndfZGlzazsKIAogCS8qCkBAIC0xNDI4LDcgKzEzNzUsNyBAQAogCSAqIGFkZHJlc3MgbGluZXMgdG8gYWNjZXNzIGFuIGV4dGVybmFsIGVlcHJvbS4gIFRvIHJlYWQgdmFsaWQKIAkgKiBjYWJsZSBkZXRlY3Qgc3RhdGUgdGhlIHBpbnMgbXVzdCBiZSBlbmFibGVkIGFzIGlucHV0cy4KIAkgKi8KLQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCA4KSAmJiBQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpIHsKKwlpZiAoaW5mby0+cmV2aXNpb24gPj0gOCAmJiAoUENJX0ZVTkMoZGV2LT5kZXZmbikgJiAxKSkgewogCQkvKgogCQkgKiBIUFQzNzQgUENJIGZ1bmN0aW9uIDEKIAkJICogLSBzZXQgYml0IDE1IG9mIHJlZyAweDUyIHRvIGVuYWJsZSBUQ0JMSUQgYXMgaW5wdXQKQEAgLTE0NDMsNyArMTM5MCw3IEBACiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1YSwgJmF0YTY2KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg1MiwgbWNyMyk7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIDB4NTYsIG1jcjYpOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LCAzKSkgeworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gMykgewogCQkvKgogCQkgKiBIUFQzNzAvMzcyIGFuZCAzNzQgcGNpZm4gMAogCQkgKiAtIGNsZWFyIGJpdCAwIG9mIDB4NWIgdG8gZW5hYmxlIFAvU0NCTElEIGFzIGlucHV0cwpAQCAtMTQ3MCw3ICsxNDE3LDcgQEAKIAkJaHdpZi0+c2VyaWFsaXplZCA9IGh3aWYtPm1hdGUtPnNlcmlhbGl6ZWQgPSAxOwogI2VuZGlmCiAKLQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDMpKSB7CisJaWYgKGluZm8tPnJldmlzaW9uID49IDMpIHsKIAkJdTggcmVnNWFoID0gMDsKIAkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NWEsIHJlZzVhaCAmIH4weDEwKTsKIAkJLyoKQEAgLTE0ODAsOCArMTQyNyw3IEBACiAJCSAqLwogCQlod2lmLT5yZXNldHByb2MJPSAmaHB0M3h4X3Jlc2V0OwogCQlod2lmLT5idXNwcm9jCT0gJmhwdDM3MF9idXNwcm9jOwotLy8JCWh3aWYtPmRyaXZlc1swXS5hdXRvdHVuZSA9IGh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7Ci0JfSBlbHNlIGlmIChocHRfbWluaW11bV9yZXZpc2lvbihkZXYsMikpIHsKKwl9IGVsc2UgaWYgKGluZm8tPnJldmlzaW9uID49IDIpIHsKIAkJaHdpZi0+cmVzZXRwcm9jCT0gJmhwdDN4eF9yZXNldDsKIAkJaHdpZi0+YnVzcHJvYwk9ICZocHQzeHhfdHJpc3RhdGU7CiAJfSBlbHNlIHsKQEAgLTE1MDIsMTggKzE0NDgsMTggQEAKIAkJaHdpZi0+dWRtYV9mb3VyID0gKChhdGE2NiAmIHJlZ21hc2spID8gMCA6IDEpOwogCWh3aWYtPmlkZV9kbWFfY2hlY2sgPSAmaHB0MzY2X2NvbmZpZ19kcml2ZV94ZmVyX3JhdGU7CiAKLQlpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDgpKSB7CisJaWYgKGluZm8tPnJldmlzaW9uID49IDgpIHsKIAkJaHdpZi0+aWRlX2RtYV90ZXN0X2lycSA9ICZocHQzNzRfaWRlX2RtYV90ZXN0X2lycTsKIAkJaHdpZi0+aWRlX2RtYV9lbmQgPSAmaHB0Mzc0X2lkZV9kbWFfZW5kOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDUpKSB7CisJfSBlbHNlIGlmIChpbmZvLT5yZXZpc2lvbiA+PSA1KSB7CiAJCWh3aWYtPmlkZV9kbWFfdGVzdF9pcnEgPSAmaHB0Mzc0X2lkZV9kbWFfdGVzdF9pcnE7CiAJCWh3aWYtPmlkZV9kbWFfZW5kID0gJmhwdDM3NF9pZGVfZG1hX2VuZDsKLQl9IGVsc2UgaWYgKGhwdF9taW5pbXVtX3JldmlzaW9uKGRldiwzKSkgeworCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gMykgewogCQlod2lmLT5kbWFfc3RhcnQgPSAmaHB0MzcwX2lkZV9kbWFfc3RhcnQ7CiAJCWh3aWYtPmlkZV9kbWFfZW5kID0gJmhwdDM3MF9pZGVfZG1hX2VuZDsKIAkJaHdpZi0+aWRlX2RtYV90aW1lb3V0ID0gJmhwdDM3MF9pZGVfZG1hX3RpbWVvdXQ7CiAJCWh3aWYtPmlkZV9kbWFfbG9zdGlycSA9ICZocHQzNzBfaWRlX2RtYV9sb3N0aXJxOwotCX0gZWxzZSBpZiAoaHB0X21pbmltdW1fcmV2aXNpb24oZGV2LDIpKQorCX0gZWxzZSBpZiAoaW5mby0+cmV2aXNpb24gPj0gMikKIAkJaHdpZi0+aWRlX2RtYV9sb3N0aXJxID0gJmhwdDM2Nl9pZGVfZG1hX2xvc3RpcnE7CiAJZWxzZQogCQlod2lmLT5pZGVfZG1hX2xvc3RpcnEgPSAmaHB0MzY2X2lkZV9kbWFfbG9zdGlycTsKQEAgLTE1MjYsNiArMTQ3Miw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2RtYV9ocHQzNjYoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgbG9uZyBkbWFiYXNlKQogeworCXN0cnVjdCBocHRfaW5mbwkqaW5mbwk9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CiAJdTggbWFzdGVyZG1hCT0gMCwgc2xhdmVkbWEgPSAwOwogCXU4IGRtYV9uZXcJPSAwLCBkbWFfb2xkID0gMDsKIAl1OCBwcmltYXJ5CT0gaHdpZi0+Y2hhbm5lbCA/IDB4NGIgOiAweDQzOwpAQCAtMTUzNSw4ICsxNDgyLDcgQEAKIAlpZiAoIWRtYWJhc2UpCiAJCXJldHVybjsKIAkJCi0JaWYocGNpX2dldF9kcnZkYXRhKGh3aWYtPnBjaV9kZXYpID09IE5VTEwpCi0JeworCWlmKGluZm8tPnNwZWVkID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB0OiBubyBrbm93biBJREUgdGltaW5ncywgZGlzYWJsaW5nIERNQS5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU1OSw2ICsxNTA1LDQwIEBACiAJaWRlX3NldHVwX2RtYShod2lmLCBkbWFiYXNlLCA4KTsKIH0KIAorLyoKKyAqCVdlICJib3Jyb3ciIHRoaXMgaG9vayBpbiBvcmRlciB0byBzZXQgdGhlIGRhdGEgc3RydWN0dXJlcworICoJdXAgZWFybHkgZW5vdWdoIGJlZm9yZSBkbWEgb3IgaW5pdF9od2lmIGNhbGxzIGFyZSBtYWRlLgorICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2lvcHNfaHB0MzY2KGlkZV9od2lmX3QgKmh3aWYpCit7CisJc3RydWN0IGhwdF9pbmZvICppbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhwdF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJdW5zaWduZWQgbG9uZyBkbWFiYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KGh3aWYtPnBjaV9kZXYsIDQpOworCXU4IGRpZCwgcmlkOworCisJaWYoaW5mbyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwdDM2Njogb3V0IG9mIG1lbW9yeS5cbiIpOworCQlyZXR1cm47CisJfQorCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGhwdF9pbmZvKSk7CisJaWRlX3NldF9od2lmZGF0YShod2lmLCBpbmZvKTsKKworCWlmKGRtYWJhc2UpIHsKKwkJZGlkID0gaW5iKGRtYWJhc2UgKyAweDIyKTsKKwkJcmlkID0gaW5iKGRtYWJhc2UgKyAweDI4KTsKKworCQlpZigoZGlkID09IDQgJiYgcmlkID09IDYpIHx8IChkaWQgPT0gNSAmJiByaWQgPiAxKSkKKwkJCWluZm8tPmZsYWdzIHw9IElTXzM3Mk47CisJfQorCisJaW5mby0+cmV2aXNpb24gPSBocHRfcmV2aXNpb24oaHdpZi0+cGNpX2Rldik7CisKKwlpZiAoaW5mby0+cmV2aXNpb24gPj0gMykKKwkJaHB0Mzd4X2Nsb2NraW5nKGh3aWYpOworCWVsc2UKKwkJaHB0MzY2X2Nsb2NraW5nKGh3aWYpOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBpbml0X3NldHVwX2hwdDM3NChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpZGVfcGNpX2RldmljZV90ICpkKQogewogCXN0cnVjdCBwY2lfZGV2ICpmaW5kZXYgPSBOVUxMOwpAQCAtMTY0Niw2ICsxNjI2LDcgQEAKIAkJLm5hbWUJCT0gIkhQVDM2NiIsCiAJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9ocHQzNjYsCiAJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfaHB0MzY2LAorCQkuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX2hwdDM2NiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNjYsCiAJCS5pbml0X2RtYQk9IGluaXRfZG1hX2hwdDM2NiwKIAkJLmNoYW5uZWxzCT0gMiwKQEAgLTE2NTYsNiArMTYzNyw3IEBACiAJCS5uYW1lCQk9ICJIUFQzNzJBIiwKIAkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM3eCwKIAkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfaHB0MzY2LAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKIAkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAogCQkuY2hhbm5lbHMJPSAyLApAQCAtMTY2NSw2ICsxNjQ3LDcgQEAKIAkJLm5hbWUJCT0gIkhQVDMwMiIsCiAJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9ocHQzN3gsCiAJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfaHB0MzY2LAorCQkuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX2hwdDM2NiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNjYsCiAJCS5pbml0X2RtYQk9IGluaXRfZG1hX2hwdDM2NiwKIAkJLmNoYW5uZWxzCT0gMiwKQEAgLTE2NzQsNiArMTY1Nyw3IEBACiAJCS5uYW1lCQk9ICJIUFQzNzEiLAogCQkuaW5pdF9zZXR1cAk9IGluaXRfc2V0dXBfaHB0Mzd4LAogCQkuaW5pdF9jaGlwc2V0CT0gaW5pdF9jaGlwc2V0X2hwdDM2NiwKKwkJLmluaXRfaW9wcwk9IGluaXRfaW9wc19ocHQzNjYsCiAJCS5pbml0X2h3aWYJPSBpbml0X2h3aWZfaHB0MzY2LAogCQkuaW5pdF9kbWEJPSBpbml0X2RtYV9ocHQzNjYsCiAJCS5jaGFubmVscwk9IDIsCkBAIC0xNjgzLDYgKzE2NjcsNyBAQAogCQkubmFtZQkJPSAiSFBUMzc0IiwKIAkJLmluaXRfc2V0dXAJPSBpbml0X3NldHVwX2hwdDM3NCwKIAkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9ocHQzNjYsCisJCS5pbml0X2lvcHMJPSBpbml0X2lvcHNfaHB0MzY2LAogCQkuaW5pdF9od2lmCT0gaW5pdF9od2lmX2hwdDM2NiwKIAkJLmluaXRfZG1hCT0gaW5pdF9kbWFfaHB0MzY2LAogCQkuY2hhbm5lbHMJPSAyLAkvKiA0ICovCkBAIC0xNjkyLDYgKzE2NzcsNyBAQAogCQkubmFtZQkJPSAiSFBUMzcyTiIsCiAJCS5pbml0X3NldHVwCT0gaW5pdF9zZXR1cF9ocHQzN3gsCiAJCS5pbml0X2NoaXBzZXQJPSBpbml0X2NoaXBzZXRfaHB0MzY2LAorCQkuaW5pdF9pb3BzCT0gaW5pdF9pb3BzX2hwdDM2NiwKIAkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9ocHQzNjYsCiAJCS5pbml0X2RtYQk9IGluaXRfZG1hX2hwdDM2NiwKIAkJLmNoYW5uZWxzCT0gMiwJLyogNCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL2l0ODE3Mi5jIGIvZHJpdmVycy9pZGUvcGNpL2l0ODE3Mi5jCmluZGV4IDYzMTkyN2MuLjkzNDYyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9pdDgxNzIuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvaXQ4MTcyLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdCBpbml0X2NoaXBzZXRfaXQ4MTcyIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2l0ODE3MiAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHByb2dpZjsKICAgICAKQEAgLTIzMCw3ICsyMzAsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfaXQ4MTcyIChpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9pdDgxNzIgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYqIGRldiA9IGh3aWYtPnBjaV9kZXY7CiAJdW5zaWduZWQgbG9uZyBjbWRCYXNlLCBjdHJsQmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS9pdDgyMXguYyBiL2RyaXZlcnMvaWRlL3BjaS9pdDgyMXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQwMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pZGUvcGNpL2l0ODIxeC5jCkBAIC0wLDAgKzEsODEyIEBACisKKy8qCisgKiBsaW51eC9kcml2ZXJzL2lkZS9wY2kvaXQ4MjF4LmMJCVZlcnNpb24gMC4wOQlEZWNlbWJlciAyMDA0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0CQlSZWQgSGF0IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIEJhc2VkIGluIHBhcnQgb24gdGhlIElURSB2ZW5kb3IgcHJvdmlkZWQgU0NTSSBkcml2ZXIuCisgKgorICogIERvY3VtZW50YXRpb24gYXZhaWxhYmxlIGZyb20KKyAqIAlodHRwOi8vd3d3Lml0ZS5jb20udHcvcGMvSVQ4MjEyRl9WMDQucGRmCisgKiAgU29tZSBvdGhlciBkb2N1bWVudHMgYXJlIE5EQS4KKyAqCisgKiAgVGhlIElURTgyMTIgaXNuJ3QgZXhhY3RseSBhIHN0YW5kYXJkIElERSBjb250cm9sbGVyLiBJdCBoYXMgdHdvCisgKiAgbW9kZXMuIEluIHBhc3MgdGhyb3VnaCBtb2RlIHRoZW4gaXQgaXMgYW4gSURFIGNvbnRyb2xsZXIuIEluIGl0cyBzbWFydAorICogIG1vZGUgaXRzIGFjdHVhbGx5IHF1aXRlIGEgY2FwYWJsZSBoYXJkd2FyZSByYWlkIGNvbnRyb2xsZXIgZGlzZ3Vpc2VkCisgKiAgYXMgYW4gSURFIGNvbnRyb2xsZXIuIFNtYXJ0IG1vZGUgb25seSB1bmRlcnN0YW5kcyBETUEgcmVhZC93cml0ZSBhbmQKKyAqICBpZGVudGlmeSwgbm9uZSBvZiB0aGUgZmFuY2llciBjb21tYW5kcyBhcHBseS4gVGhlIElUODIxMSBpcyBpZGVudGljYWwKKyAqICBpbiBvdGhlciByZXNwZWN0cyBidXQgbGFja3MgdGhlIHJhaWQgbW9kZS4KKyAqCisgKiAgRXJyYXRhOgorICogIG8JUmV2IDB4MTAgYWxzbyByZXF1aXJlcyBtYXN0ZXIvc2xhdmUgaG9sZCB0aGUgc2FtZSBETUEgdGltaW5ncyBhbmQKKyAqCWNhbm5vdCBkbyBBVEFQSSBNV0RNQS4KKyAqICBvCVRoZSBpZGVudGlmeSBkYXRhIGZvciByYWlkIHZvbHVtZXMgbGFja3MgQ0hTIGluZm8gKHRlY2huaWNhbGx5IG9rKQorICoJYnV0IGFsc28gZmFpbHMgdG8gc2V0IHRoZSBMQkEyOCBhbmQgb3RoZXIgYml0cy4gV2UgZml4IHRoZXNlIGluCisgKgl0aGUgSURFIHByb2JlIHF1aXJrIGNvZGUuCisgKiAgbwlJZiB5b3Ugd3JpdGUgTEJBNDggc2l6ZWQgSS9PJ3MgKGllID4gMjU2IHNlY3RvcikgaW4gc21hcnQgbW9kZQorICoJcmFpZCB0aGVuIHRoZSBjb250cm9sbGVyIGZpcm13YXJlIGRpZXMKKyAqICBvCVNtYXJ0IG1vZGUgd2l0aG91dCBSQUlEIGRvZXNuJ3QgY2xlYXIgYWxsIHRoZSBuZWNlc3NhcnkgaWRlbnRpZnkKKyAqCWJpdHMgdG8gcmVkdWNlIHRoZSBjb21tYW5kIHNldCB0byB0aGUgb25lIHVzZWQKKyAqCisgKiAgVGhpcyBoYXMgYSBmZXcgaW1wYWN0cyBvbiB0aGUgZHJpdmVyCisgKiAgLSBJbiBwYXNzIHRocm91Z2ggbW9kZSB3ZSBkbyBhbGwgdGhlIHdvcmsgeW91IHdvdWxkIGV4cGVjdAorICogIC0gSW4gc21hcnQgbW9kZSB0aGUgY2xvY2tpbmcgc2V0IHVwIGlzIGRvbmUgYnkgdGhlIGNvbnRyb2xsZXIgZ2VuZXJhbGx5CisgKiAgICBidXQgd2UgbXVzdCB3YXRjaCB0aGUgb3RoZXIgbGltaXRzIGFuZCBmaWx0ZXIuCisgKiAgLSBUaGVyZSBhcmUgYSBmZXcgZXh0cmEgdmVuZG9yIGNvbW1hbmRzIHRoYXQgYWN0dWFsbHkgdGFsayB0byB0aGUKKyAqICAgIGNvbnRyb2xsZXIgYnV0IG9ubHkgd29yayBQSU8gd2l0aCBubyBJUlEuCisgKgorICogIFZlbmRvciBhcmVhcyBvZiB0aGUgaWRlbnRpZnkgYmxvY2sgaW4gc21hcnQgbW9kZSBhcmUgdXNlZCBmb3IgdGhlCisgKiAgdGltaW5nIGFuZCBwb2xpY3kgc2V0IHVwLiBFYWNoIEhERCBpbiByYWlkIG1vZGUgYWxzbyBoYXMgYSBzZXJpYWwKKyAqICBibG9jayBvbiB0aGUgZGlzay4gVGhlIGhhcmR3YXJlIGV4dHJhIGNvbW1hbmRzIGFyZSBnZXQvc2V0IGNoaXAgc3RhdHVzLAorICogIHJlYnVpbGQsIGdldCByZWJ1aWxkIHN0YXR1cy4KKyAqCisgKiAgSW4gTGludXggdGhlIGRyaXZlciBzdXBwb3J0cyBwYXNzIHRocm91Z2ggbW9kZSBhcyBpZiB0aGUgZGV2aWNlIHdhcworICogIGp1c3QgYW5vdGhlciBJREUgY29udHJvbGxlci4gSWYgdGhlIHNtYXJ0IG1vZGUgaXMgcnVubmluZyB0aGVuCisgKiAgdm9sdW1lcyBhcmUgbWFuYWdlZCBieSB0aGUgY29udHJvbGxlciBmaXJtd2FyZSBhbmQgZWFjaCBJREUgImRpc2siCisgKiAgaXMgYSByYWlkIHZvbHVtZS4gRXZlbiBtb3JlIGN1dGUgLSB0aGUgY29udHJvbGxlciBjYW4gZG8gYXV0b21hdGVkCisgKiAgaG90cGx1ZyBhbmQgcmVidWlsZC4KKyAqCisgKiAgVGhlIHBhc3MgdGhyb3VnaCBjb250cm9sbGVyIGl0c2VsZiBpcyBhIGxpdHRsZSBkZW1lbnRlZC4gSXQgaGFzIGEKKyAqICBmbGF3IHRoYXQgaXQgaGFzIGEgc2luZ2xlIHNldCBvZiBQSU8vTVdETUEgdGltaW5ncyBwZXIgY2hhbm5lbCBzbworICogIG5vbiBVRE1BIGRldmljZXMgcmVzdHJpY3QgZWFjaCBvdGhlcnMgcGVyZm9ybWFuY2UuIEl0IGFsc28gaGFzIGEKKyAqICBzaW5nbGUgY2xvY2sgc291cmNlIHBlciBjaGFubmVsIHNvIG1peGVkIFVETUExMDAvMTMzIHBlcmZvcm1hbmNlCisgKiAgaXNuJ3QgcGVyZmVjdCBhbmQgd2UgaGF2ZSB0byBwaWNrIGEgY2xvY2suIFRoYW5rZnVsbHkgbm9uZSBvZiB0aGlzCisgKiAgbWF0dGVycyBpbiBzbWFydCBtb2RlLiBBVEFQSSBETUEgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgKgorICogIEl0IHNlZW1zIHRoZSBzbWFydCBtb2RlIGlzIGEgd2luIGZvciBSQUlEMS9SQUlEMTAgYnV0IG90aGVyd2lzZSBub3QuCisgKgorICogIFRPRE8KKyAqCS0JQVRBUEkgVURNQSBpcyBvayBidXQgbm90IE1XRE1BIGl0IHNlZW1zCisgKgktCVJBSUQgY29uZmlndXJhdGlvbiBpb2N0bHMKKyAqCS0JTW92ZSB0byBsaWJhdGEgb25jZSBpdCBncm93cyB1cAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pZGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RydWN0IGl0ODIxeF9kZXYKK3sKKwl1bnNpZ25lZCBpbnQgc21hcnQ6MSwJCS8qIEFyZSB3ZSBpbiBzbWFydCByYWlkIG1vZGUgKi8KKwkJdGltaW5nMTA6MTsJCS8qIFJldiAweDEwICovCisJdTgJY2xvY2tfbW9kZTsJCS8qIDAsIEFUQV81MCBvciBBVEFfNjYgKi8KKwl1OAl3YW50WzJdWzJdOwkJLyogTW9kZS9QcmkgbG9nIGZvciBtYXN0ZXIgc2xhdmUgKi8KKwkvKiBXZSBuZWVkIHRoZXNlIGZvciBzd2l0Y2hpbmcgdGhlIGNsb2NrIHdoZW4gRE1BIGdvZXMgb24vb2ZmCisJICAgVGhlIGhpZ2ggYnl0ZSBpcyB0aGUgNjZNaHogdGltaW5nICovCisJdTE2CXBpb1syXTsJCQkvKiBDYWNoZWQgUElPIHZhbHVlcyAqLworCXUxNgltd2RtYVsyXTsJCS8qIENhY2hlZCBNV0RNQSB2YWx1ZXMgKi8KKwl1MTYJdWRtYVsyXTsJCS8qIENhY2hlZCBVRE1BIHZhbHVlcyAocGVyIGRyaXZlKSAqLworfTsKKworI2RlZmluZSBBVEFfNjYJCTAKKyNkZWZpbmUgQVRBXzUwCQkxCisjZGVmaW5lIEFUQV9BTlkJCTIKKworI2RlZmluZSBVRE1BX09GRgkwCisjZGVmaW5lIE1XRE1BX09GRgkwCisKKy8qCisgKglXZSBhbGxvdyB1c2VycyB0byBmb3JjZSB0aGUgY2FyZCBpbnRvIG5vbiByYWlkIG1vZGUgd2l0aG91dAorICoJZmxhc2hpbmcgdGhlIGFsdGVybmF0aXZlIEJJT1MuIFRoaXMgaXMgYWxzbyBuZWNjZXNzYXJ5IHJpZ2h0IG5vdworICoJZm9yIGVtYmVkZGVkIHBsYXRmb3JtcyB0aGF0IGNhbm5vdCBydW4gYSBQQyBCSU9TIGJ1dCBhcmUgdXNpbmcgdGhpcworICoJZGV2aWNlLgorICovCisKK3N0YXRpYyBpbnQgaXQ4MjEyX25vcmFpZDsKKworLyoqCisgKglpdDgyMXhfcHJvZ3JhbQktCXByb2dyYW0gdGhlIFBJTy9NV0RNQSByZWdpc3RlcnMKKyAqCUBkcml2ZTogZHJpdmUgdG8gdHVuZQorICoKKyAqCVByb2dyYW0gdGhlIFBJTy9NV0RNQSB0aW1pbmcgZm9yIHRoaXMgY2hhbm5lbCBhY2NvcmRpbmcgdG8gdGhlCisgKgljdXJyZW50IGNsb2NrLgorICovCisKK3N0YXRpYyB2b2lkIGl0ODIxeF9wcm9ncmFtKGlkZV9kcml2ZV90ICpkcml2ZSwgdTE2IHRpbWluZykKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlpbnQgY2hhbm5lbCA9IGh3aWYtPmNoYW5uZWw7CisJdTggY29uZjsKKworCS8qIFByb2dyYW0gUElPL01XRE1BIHRpbWluZyBiaXRzICovCisJaWYoaXRkZXYtPmNsb2NrX21vZGUgPT0gQVRBXzY2KQorCQljb25mID0gdGltaW5nID4+IDg7CisJZWxzZQorCQljb25mID0gdGltaW5nICYgMHhGRjsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1NCArIDQgKiBjaGFubmVsLCBjb25mKTsKK30KKworLyoqCisgKglpdDgyMXhfcHJvZ3JhbV91ZG1hCS0JcHJvZ3JhbSB0aGUgVURNQSByZWdpc3RlcnMKKyAqCUBkcml2ZTogZHJpdmUgdG8gdHVuZQorICoKKyAqCVByb2dyYW0gdGhlIFVETUEgdGltaW5nIGZvciB0aGlzIGRyaXZlIGFjY29yZGluZyB0byB0aGUKKyAqCWN1cnJlbnQgY2xvY2suCisgKi8KKworc3RhdGljIHZvaWQgaXQ4MjF4X3Byb2dyYW1fdWRtYShpZGVfZHJpdmVfdCAqZHJpdmUsIHUxNiB0aW1pbmcpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CisJaW50IGNoYW5uZWwgPSBod2lmLT5jaGFubmVsOworCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJdTggY29uZjsKKworCS8qIFByb2dyYW0gVURNQSB0aW1pbmcgYml0cyAqLworCWlmKGl0ZGV2LT5jbG9ja19tb2RlID09IEFUQV82NikKKwkJY29uZiA9IHRpbWluZyA+PiA4OworCWVsc2UKKwkJY29uZiA9IHRpbWluZyAmIDB4RkY7CisJaWYoaXRkZXYtPnRpbWluZzEwID09IDApCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDU2ICsgNCAqIGNoYW5uZWwgKyB1bml0LCBjb25mKTsKKwllbHNlIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTYgKyA0ICogY2hhbm5lbCwgY29uZik7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDU2ICsgNCAqIGNoYW5uZWwgKyAxLCBjb25mKTsKKwl9Cit9CisKKworLyoqCisgKglpdDgyMXhfY2xvY2tfc3RyYXRlZ3kKKyAqCUBod2lmOiBoYXJkd2FyZSBpbnRlcmZhY2UKKyAqCisgKglTZWxlY3QgYmV0d2VlbiB0aGUgNTAgYW5kIDY2TWh6IGJhc2UgY2xvY2tzIHRvIGdldCB0aGUgYmVzdAorICoJcmVzdWx0cyBmb3IgdGhpcyBpbnRlcmZhY2UuCisgKi8KKworc3RhdGljIHZvaWQgaXQ4MjF4X2Nsb2NrX3N0cmF0ZWd5KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKworCXU4IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwlpZGVfZHJpdmVfdCAqcGFpciA9ICZod2lmLT5kcml2ZXNbMS11bml0XTsKKworCWludCBjbG9jaywgYWx0Y2xvY2s7CisJdTggdjsKKwlpbnQgc2VsID0gMDsKKworCWlmKGl0ZGV2LT53YW50WzBdWzBdID4gaXRkZXYtPndhbnRbMV1bMF0pIHsKKwkJY2xvY2sgPSBpdGRldi0+d2FudFswXVsxXTsKKwkJYWx0Y2xvY2sgPSBpdGRldi0+d2FudFsxXVsxXTsKKwl9IGVsc2UgeworCQljbG9jayA9IGl0ZGV2LT53YW50WzFdWzFdOworCQlhbHRjbG9jayA9IGl0ZGV2LT53YW50WzBdWzFdOworCX0KKworCS8qIE1hc3RlciBkb2Vzbid0IGNhcmUgZG9lcyB0aGUgc2xhdmUgPyAqLworCWlmKGNsb2NrID09IEFUQV9BTlkpCisJCWNsb2NrID0gYWx0Y2xvY2s7CisKKwkvKiBOb2JvZHkgY2FyZXMgLSBrZWVwIHRoZSBzYW1lIGNsb2NrICovCisJaWYoY2xvY2sgPT0gQVRBX0FOWSkKKwkJcmV0dXJuOworCS8qIE5vIGNoYW5nZSAqLworCWlmKGNsb2NrID09IGl0ZGV2LT5jbG9ja19tb2RlKQorCQlyZXR1cm47CisKKwkvKiBMb2FkIHRoaXMgaW50byB0aGUgY29udHJvbGxlciA/ICovCisJaWYoY2xvY2sgPT0gQVRBXzY2KQorCQlpdGRldi0+Y2xvY2tfbW9kZSA9IEFUQV82NjsKKwllbHNlIHsKKwkJaXRkZXYtPmNsb2NrX21vZGUgPSBBVEFfNTA7CisJCXNlbCA9IDE7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsICZ2KTsKKwl2ICY9IH4oMSA8PCAoMSArIGh3aWYtPmNoYW5uZWwpKTsKKwl2IHw9IHNlbCA8PCAoMSArIGh3aWYtPmNoYW5uZWwpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCB2KTsKKworCS8qCisJICoJUmVwcm9ncmFtIHRoZSBVRE1BL1BJTyBvZiB0aGUgcGFpciBkcml2ZSBmb3IgdGhlIHN3aXRjaAorCSAqCU1XRE1BIHdpbGwgYmUgZGVhbHQgd2l0aCBieSB0aGUgZG1hIHN3aXRjaGVyCisJICovCisJaWYocGFpciAmJiBpdGRldi0+dWRtYVsxLXVuaXRdICE9IFVETUFfT0ZGKSB7CisJCWl0ODIxeF9wcm9ncmFtX3VkbWEocGFpciwgaXRkZXYtPnVkbWFbMS11bml0XSk7CisJCWl0ODIxeF9wcm9ncmFtKHBhaXIsIGl0ZGV2LT5waW9bMS11bml0XSk7CisJfQorCS8qCisJICoJUmVwcm9ncmFtIHRoZSBVRE1BL1BJTyBvZiBvdXIgZHJpdmUgZm9yIHRoZSBzd2l0Y2guCisJICoJTVdETUEgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBkbWEgc3dpdGNoZXIKKwkgKi8KKwlpZihpdGRldi0+dWRtYVt1bml0XSAhPSBVRE1BX09GRikgeworCQlpdDgyMXhfcHJvZ3JhbV91ZG1hKGRyaXZlLCBpdGRldi0+dWRtYVt1bml0XSk7CisJCWl0ODIxeF9wcm9ncmFtKGRyaXZlLCBpdGRldi0+cGlvW3VuaXRdKTsKKwl9Cit9CisKKy8qKgorICoJaXQ4MjF4X3JhdGVtYXNrCS0JQ29tcHV0ZSBhdmFpbGFibGUgbW9kZXMKKyAqCUBkcml2ZTogSURFIGRyaXZlCisgKgorICoJQ29tcHV0ZSB0aGUgYXZhaWxhYmxlIHNwZWVkcyBmb3IgdGhlIGRldmljZXMgb24gdGhlIGludGVyZmFjZS4gVGhpcworICoJaXMgYWxsIG1vZGVzIHRvIEFUQTEzMyBjbGlwcGVkIGJ5IGRyaXZlIGNhYmxlIHNldHVwLgorICovCisKK3N0YXRpYyB1OCBpdDgyMXhfcmF0ZW1hc2sgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBtb2RlCT0gNDsKKwlpZiAoIWVpZ2h0eV9uaW50eV90aHJlZShkcml2ZSkpCisJCW1vZGUgPSBtaW4obW9kZSwgKHU4KTEpOworCXJldHVybiBtb2RlOworfQorCisvKioKKyAqCWl0ODIxeF90dW5lcHJvYwktCXR1bmUgYSBkcml2ZQorICoJQGRyaXZlOiBkcml2ZSB0byB0dW5lCisgKglAbW9kZV93YW50ZWQ6IHRoZSB0YXJnZXQgb3BlcmF0aW5nIG1vZGUKKyAqCisgKglMb2FkIHRoZSB0aW1pbmcgc2V0dGluZ3MgZm9yIHRoaXMgZGV2aWNlIG1vZGUgaW50byB0aGUKKyAqCWNvbnRyb2xsZXIuIEJ5IHRoZSB0aW1lIHdlIGFyZSBjYWxsZWQgdGhlIG1vZGUgaGFzIGJlZW4KKyAqCW1vZGlmaWVkIGFzIG5lY2Nlc3NhcnkgdG8gaGFuZGxlIHRoZSBhYnNlbmNlIG9mIHNlcGVyYXRlCisgKgltYXN0ZXIvc2xhdmUgdGltZXJzIGZvciBNV0RNQS9QSU8uCisgKgorICoJVGhpcyBjb2RlIGlzIG9ubHkgdXNlZCBpbiBwYXNzIHRocm91Z2ggbW9kZS4KKyAqLworCitzdGF0aWMgdm9pZCBpdDgyMXhfdHVuZXByb2MgKGlkZV9kcml2ZV90ICpkcml2ZSwgYnl0ZSBtb2RlX3dhbnRlZCkKK3sKKwlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCisJLyogU3BlYyBzYXlzIDg5IHJlZiBkcml2ZXIgdXNlcyA4OCAqLworCXN0YXRpYyB1MTYgcGlvW10JPSB7IDB4QUE4OCwgMHhBMzgyLCAweEExODEsIDB4MzMzMiwgMHgzMTIxIH07CisJc3RhdGljIHU4IHBpb193YW50W10gICAgPSB7IEFUQV82NiwgQVRBXzY2LCBBVEFfNjYsIEFUQV82NiwgQVRBX0FOWSB9OworCisJaWYoaXRkZXYtPnNtYXJ0KQorCQlyZXR1cm47CisKKwkvKiBXZSBwcmVmZXIgNjZNaHogY2xvY2sgZm9yIFBJTyAwLTMsIGRvbid0IGNhcmUgZm9yIFBJTzQgKi8KKwlpdGRldi0+d2FudFt1bml0XVsxXSA9IHBpb193YW50W21vZGVfd2FudGVkXTsKKwlpdGRldi0+d2FudFt1bml0XVswXSA9IDE7CS8qIFBJTyBpcyBsb3dlc3QgcHJpb3JpdHkgKi8KKwlpdGRldi0+cGlvW3VuaXRdID0gcGlvW21vZGVfd2FudGVkXTsKKwlpdDgyMXhfY2xvY2tfc3RyYXRlZ3koZHJpdmUpOworCWl0ODIxeF9wcm9ncmFtKGRyaXZlLCBpdGRldi0+cGlvW3VuaXRdKTsKK30KKworLyoqCisgKglpdDgyMXhfdHVuZV9td2RtYQktCXR1bmUgYSBjaGFubmVsIGZvciBNV0RNQQorICoJQGRyaXZlOiBkcml2ZSB0byBzZXQgdXAKKyAqCUBtb2RlX3dhbnRlZDogdGhlIHRhcmdldCBvcGVyYXRpbmcgbW9kZQorICoKKyAqCUxvYWQgdGhlIHRpbWluZyBzZXR0aW5ncyBmb3IgdGhpcyBkZXZpY2UgbW9kZSBpbnRvIHRoZQorICoJY29udHJvbGxlciB3aGVuIGRvaW5nIE1XRE1BIGluIHBhc3MgdGhyb3VnaCBtb2RlLiBUaGUgY2FsbGVyCisgKgltdXN0IG1hbmFnZSB0aGUgd2hvbGUgbGFjayBvZiBwZXIgZGV2aWNlIE1XRE1BL1BJTyB0aW1pbmdzIGFuZAorICoJdGhlIHNoYXJlZCBNV0RNQS9QSU8gdGltaW5nIHJlZ2lzdGVyLgorICovCisKK3N0YXRpYyB2b2lkIGl0ODIxeF90dW5lX213ZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgbW9kZV93YW50ZWQpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9ICh2b2lkICopaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCWludCBjaGFubmVsID0gaHdpZi0+Y2hhbm5lbDsKKwl1OCBjb25mOworCisJc3RhdGljIHUxNiBkbWFbXQk9IHsgMHg4ODY2LCAweDMyMjIsIDB4MzEyMSB9OworCXN0YXRpYyB1OCBtd2RtYV93YW50W10JPSB7IEFUQV9BTlksIEFUQV82NiwgQVRBX0FOWSB9OworCisJaXRkZXYtPndhbnRbdW5pdF1bMV0gPSBtd2RtYV93YW50W21vZGVfd2FudGVkXTsKKwlpdGRldi0+d2FudFt1bml0XVswXSA9IDI7CS8qIE1XRE1BIGlzIGxvdyBwcmlvcml0eSAqLworCWl0ZGV2LT5td2RtYVt1bml0XSA9IGRtYVttb2RlX3dhbnRlZF07CisJaXRkZXYtPnVkbWFbdW5pdF0gPSBVRE1BX09GRjsKKworCS8qIFVETUEgYml0cyBvZmYgLSBSZXZpc2lvbiAweDEwIGRvIHRoZW0gaW4gcGFpcnMgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCAmY29uZik7CisJaWYoaXRkZXYtPnRpbWluZzEwKQorCQljb25mIHw9IGNoYW5uZWwgPyAweDYwOiAweDE4OworCWVsc2UKKwkJY29uZiB8PSAxIDw8ICgzICsgMiAqIGNoYW5uZWwgKyB1bml0KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1MCwgY29uZik7CisKKwlpdDgyMXhfY2xvY2tfc3RyYXRlZ3koZHJpdmUpOworCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIHByb2dyYW0gdGhpcyA/ICovCisJLyogaXQ4MjF4X3Byb2dyYW0oZHJpdmUsIGl0ZGV2LT5td2RtYVt1bml0XSk7ICovCit9CisKKy8qKgorICoJaXQ4MjF4X3R1bmVfdWRtYQktCXR1bmUgYSBjaGFubmVsIGZvciBVRE1BCisgKglAZHJpdmU6IGRyaXZlIHRvIHNldCB1cAorICoJQG1vZGVfd2FudGVkOiB0aGUgdGFyZ2V0IG9wZXJhdGluZyBtb2RlCisgKgorICoJTG9hZCB0aGUgdGltaW5nIHNldHRpbmdzIGZvciB0aGlzIGRldmljZSBtb2RlIGludG8gdGhlCisgKgljb250cm9sbGVyIHdoZW4gZG9pbmcgVURNQSBtb2RlcyBpbiBwYXNzIHRocm91Z2guCisgKi8KKworc3RhdGljIHZvaWQgaXQ4MjF4X3R1bmVfdWRtYSAoaWRlX2RyaXZlX3QgKmRyaXZlLCBieXRlIG1vZGVfd2FudGVkKQoreworCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCWludCB1bml0ID0gZHJpdmUtPnNlbGVjdC5iLnVuaXQ7CisJaW50IGNoYW5uZWwgPSBod2lmLT5jaGFubmVsOworCXU4IGNvbmY7CisKKwlzdGF0aWMgdTE2IHVkbWFbXQk9IHsgMHg0NDMzLCAweDQyMzEsIDB4MzEyMSwgMHgyMTIxLCAweDExMTEsIDB4MjIxMSwgMHgxMTExIH07CisJc3RhdGljIHU4IHVkbWFfd2FudFtdCT0geyBBVEFfQU5ZLCBBVEFfNTAsIEFUQV9BTlksIEFUQV82NiwgQVRBXzY2LCBBVEFfNTAsIEFUQV82NiB9OworCisJaXRkZXYtPndhbnRbdW5pdF1bMV0gPSB1ZG1hX3dhbnRbbW9kZV93YW50ZWRdOworCWl0ZGV2LT53YW50W3VuaXRdWzBdID0gMzsJLyogVURNQSBpcyBoaWdoIHByaW9yaXR5ICovCisJaXRkZXYtPm13ZG1hW3VuaXRdID0gTVdETUFfT0ZGOworCWl0ZGV2LT51ZG1hW3VuaXRdID0gdWRtYVttb2RlX3dhbnRlZF07CisJaWYobW9kZV93YW50ZWQgPj0gNSkKKwkJaXRkZXYtPnVkbWFbdW5pdF0gfD0gMHg4MDgwOwkvKiBVRE1BIDUvNiBzZWxlY3Qgb24gKi8KKworCS8qIFVETUEgb24uIEFnYWluIHJldmlzaW9uIDB4MTAgbXVzdCBkbyB0aGUgcGFpciAqLworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4NTAsICZjb25mKTsKKwlpZihpdGRldi0+dGltaW5nMTApCisJCWNvbmYgJj0gY2hhbm5lbCA/IDB4OUY6IDB4RTc7CisJZWxzZQorCQljb25mICY9IH4gKDEgPDwgKDMgKyAyICogY2hhbm5lbCArIHVuaXQpKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaHdpZi0+cGNpX2RldiwgMHg1MCwgY29uZik7CisKKwlpdDgyMXhfY2xvY2tfc3RyYXRlZ3koZHJpdmUpOworCWl0ODIxeF9wcm9ncmFtX3VkbWEoZHJpdmUsIGl0ZGV2LT51ZG1hW3VuaXRdKTsKKworfQorCisvKioKKyAqCWNvbmZpZ19pdDgyMXhfY2hpcHNldF9mb3JfcGlvCS0Jc2V0IGRyaXZlIHRpbWluZ3MKKyAqCUBkcml2ZTogZHJpdmUgdG8gdHVuZQorICoJQHNwZWVkIHdlIHdhbnQKKyAqCisgKglDb21wdXRlIHRoZSBiZXN0IHBpbyBtb2RlIHdlIGNhbiBmb3IgYSBnaXZlbiBkZXZpY2UuIFdlIG11c3QKKyAqCXBpY2sgYSBzcGVlZCB0aGF0IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zIHdpdGggdGhlIG90aGVyIGRldmljZQorICoJb24gdGhlIGNhYmxlLgorICovCisKK3N0YXRpYyB2b2lkIGNvbmZpZ19pdDgyMXhfY2hpcHNldF9mb3JfcGlvIChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgc2V0X3NwZWVkKQoreworCXU4IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaWRlX2RyaXZlX3QgKnBhaXIgPSAmaHdpZi0+ZHJpdmVzWzEtdW5pdF07CisJdTggc3BlZWQgPSAwLCBzZXRfcGlvCT0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKGRyaXZlLCAyNTUsIDUsIE5VTEwpOworCXU4IHBhaXJfcGlvOworCisJLyogV2UgaGF2ZSB0byBkZWFsIHdpdGggdGhpcyBtZXNzIGluIHBhaXJzICovCisJaWYocGFpciAhPSBOVUxMKSB7CisJCXBhaXJfcGlvID0gaWRlX2dldF9iZXN0X3Bpb19tb2RlKHBhaXIsIDI1NSwgNSwgTlVMTCk7CisJCS8qIFRyaW0gUElPIHRvIHRoZSBzbG93ZXN0IG9mIHRoZSBtYXN0ZXIvc2xhdmUgKi8KKwkJaWYocGFpcl9waW8gPCBzZXRfcGlvKQorCQkJc2V0X3BpbyA9IHBhaXJfcGlvOworCX0KKwlpdDgyMXhfdHVuZXByb2MoZHJpdmUsIHNldF9waW8pOworCXNwZWVkID0gWEZFUl9QSU9fMCArIHNldF9waW87CisJLyogWFhYIC0gV2UgdHJpbSB0byB0aGUgbG93ZXN0IG9mIHRoZSBwYWlyIHNvIHRoZSBvdGhlciBkcml2ZQorCSAgIHdpbGwgYWx3YXlzIGJlIGZpbmUgYXQgdGhpcyBwb2ludCB1bnRpbCB3ZSBkbyBob3RwbHVnIHBhc3N0aHJ1ICovCisKKwlpZiAoc2V0X3NwZWVkKQorCQkodm9pZCkgaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOworfQorCisvKioKKyAqCWl0ODIxeF9kbWFfcmVhZAktCURNQSBob29rCisgKglAZHJpdmU6IGRyaXZlIGZvciBETUEKKyAqCisgKglUaGUgSVQ4MjF4IGhhcyBhIHNpbmdsZSB0aW1pbmcgcmVnaXN0ZXIgZm9yIE1XRE1BIGFuZCBmb3IgUElPCisgKglvcGVyYXRpb25zLiBBcyB3ZSBmbGlwIGJhY2sgYW5kIGZvcnRoIHdlIGhhdmUgdG8gcmVsb2FkIHRoZQorICoJY2xvY2suIEluIGFkZGl0aW9uIHRoZSByZXYgMHgxMCBkZXZpY2Ugb25seSB3b3JrcyBpZiB0aGUgc2FtZQorICoJdGltaW5nIHZhbHVlIGlzIGxvYWRlZCBpbnRvIHRoZSBtYXN0ZXIgYW5kIHNsYXZlIFVETUEgY2xvY2sKKyAqIAlzbyB3ZSBtdXN0IGFsc28gcmVsb2FkIHRoYXQuCisgKgorICoJRklYTUU6IHdlIGNvdWxkIGZpZ3VyZSBvdXQgaW4gYWR2YW5jZSBpZiB3ZSBuZWVkIHRvIGRvIHJlbG9hZHMKKyAqLworCitzdGF0aWMgdm9pZCBpdDgyMXhfZG1hX3N0YXJ0KGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJc3RydWN0IGl0ODIxeF9kZXYgKml0ZGV2ID0gaWRlX2dldF9od2lmZGF0YShod2lmKTsKKwlpbnQgdW5pdCA9IGRyaXZlLT5zZWxlY3QuYi51bml0OworCWlmKGl0ZGV2LT5td2RtYVt1bml0XSAhPSBNV0RNQV9PRkYpCisJCWl0ODIxeF9wcm9ncmFtKGRyaXZlLCBpdGRldi0+bXdkbWFbdW5pdF0pOworCWVsc2UgaWYoaXRkZXYtPnVkbWFbdW5pdF0gIT0gVURNQV9PRkYgJiYgaXRkZXYtPnRpbWluZzEwKQorCQlpdDgyMXhfcHJvZ3JhbV91ZG1hKGRyaXZlLCBpdGRldi0+dWRtYVt1bml0XSk7CisJaWRlX2RtYV9zdGFydChkcml2ZSk7Cit9CisKKy8qKgorICoJaXQ4MjF4X2RtYV93cml0ZQktCURNQSBob29rCisgKglAZHJpdmU6IGRyaXZlIGZvciBETUEgc3RvcAorICoKKyAqCVRoZSBJVDgyMXggaGFzIGEgc2luZ2xlIHRpbWluZyByZWdpc3RlciBmb3IgTVdETUEgYW5kIGZvciBQSU8KKyAqCW9wZXJhdGlvbnMuIEFzIHdlIGZsaXAgYmFjayBhbmQgZm9ydGggd2UgaGF2ZSB0byByZWxvYWQgdGhlCisgKgljbG9jay4KKyAqLworCitzdGF0aWMgaW50IGl0ODIxeF9kbWFfZW5kKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CisJaW50IHVuaXQgPSBkcml2ZS0+c2VsZWN0LmIudW5pdDsKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaXRkZXYgPSBpZGVfZ2V0X2h3aWZkYXRhKGh3aWYpOworCWludCByZXQgPSBfX2lkZV9kbWFfZW5kKGRyaXZlKTsKKwlpZihpdGRldi0+bXdkbWFbdW5pdF0gIT0gTVdETUFfT0ZGKQorCQlpdDgyMXhfcHJvZ3JhbShkcml2ZSwgaXRkZXYtPnBpb1t1bml0XSk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqCWl0ODIxeF90dW5lX2NoaXBzZXQJLQlzZXQgY29udHJvbGxlciB0aW1pbmdzCisgKglAZHJpdmU6IERyaXZlIHRvIHNldCB1cAorICoJQHhmZXJzcGVlZDogc3BlZWQgd2Ugd2FudCB0byBhY2hpZXZlCisgKgorICoJVHVuZSB0aGUgSVRFIGNoaXBzZXQgZm9yIHRoZSBkZXNpcmVkIG1vZGUuIElmIHdlIGNhbid0IGFjaGlldmUKKyAqCXRoZSBkZXNpcmVkIG1vZGUgdGhlbiB0dW5lIGZvciBhIGxvd2VyIG9uZSwgYnV0IHVsdGltYXRlbHkKKyAqCW1ha2UgdGhlIHRoaW5nIHdvcmsuCisgKi8KKworc3RhdGljIGludCBpdDgyMXhfdHVuZV9jaGlwc2V0IChpZGVfZHJpdmVfdCAqZHJpdmUsIGJ5dGUgeGZlcnNwZWVkKQoreworCisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CisJdTggc3BlZWQJCT0gaWRlX3JhdGVfZmlsdGVyKGl0ODIxeF9yYXRlbWFzayhkcml2ZSksIHhmZXJzcGVlZCk7CisKKwlpZighaXRkZXYtPnNtYXJ0KSB7CisJCXN3aXRjaChzcGVlZCkgeworCQkJY2FzZSBYRkVSX1BJT180OgorCQkJY2FzZSBYRkVSX1BJT18zOgorCQkJY2FzZSBYRkVSX1BJT18yOgorCQkJY2FzZSBYRkVSX1BJT18xOgorCQkJY2FzZSBYRkVSX1BJT18wOgorCQkJCWl0ODIxeF90dW5lcHJvYyhkcml2ZSwgKHNwZWVkIC0gWEZFUl9QSU9fMCkpOworCQkJCWJyZWFrOworCQkJLyogTVdETUEgdHVuaW5nIGlzIHJlYWxseSBoYXJkIGJlY2F1c2Ugb3VyIE1XRE1BIGFuZCBQSU8KKwkJCSAgIHRpbWluZ3MgYXJlIGtlcHQgaW4gdGhlIHNhbWUgcGxhY2UuIFdlIGNhbiBzd2l0Y2ggaW4gdGhlCisJCQkgICBob3N0IGRtYSBvbi9vZmYgY2FsbGJhY2tzICovCisJCQljYXNlIFhGRVJfTVdfRE1BXzI6CisJCQljYXNlIFhGRVJfTVdfRE1BXzE6CisJCQljYXNlIFhGRVJfTVdfRE1BXzA6CisJCQkJaXQ4MjF4X3R1bmVfbXdkbWEoZHJpdmUsIChzcGVlZCAtIFhGRVJfTVdfRE1BXzApKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWEZFUl9VRE1BXzY6CisJCQljYXNlIFhGRVJfVURNQV81OgorCQkJY2FzZSBYRkVSX1VETUFfNDoKKwkJCWNhc2UgWEZFUl9VRE1BXzM6CisJCQljYXNlIFhGRVJfVURNQV8yOgorCQkJY2FzZSBYRkVSX1VETUFfMToKKwkJCWNhc2UgWEZFUl9VRE1BXzA6CisJCQkJaXQ4MjF4X3R1bmVfdWRtYShkcml2ZSwgKHNwZWVkIC0gWEZFUl9VRE1BXzApKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJLyoKKwkgKglJbiBzbWFydCBtb2RlIHRoZSBjbG9ja2luZyBpcyBkb25lIGJ5IHRoZSBob3N0IGNvbnRyb2xsZXIKKwkgKiAJc25vb3BpbmcgdGhlIG1vZGUgd2UgcGlja2VkLiBUaGUgcmVzdCBvZiBpdCBpcyBub3Qgb3VyIHByb2JsZW0KKwkgKi8KKwlyZXR1cm4gaWRlX2NvbmZpZ19kcml2ZV9zcGVlZChkcml2ZSwgc3BlZWQpOworfQorCisvKioKKyAqCWNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEJLQljb25maWd1cmUgZm9yIERNQQorICoJQGRyaXZlOiBkcml2ZSB0byBjb25maWd1cmUKKyAqCisgKglDYWxsZWQgYnkgdGhlIElERSBsYXllciB3aGVuIGl0IHdhbnRzIHRoZSB0aW1pbmdzIHNldCB1cC4KKyAqLworCitzdGF0aWMgaW50IGNvbmZpZ19jaGlwc2V0X2Zvcl9kbWEgKGlkZV9kcml2ZV90ICpkcml2ZSkKK3sKKwl1OCBzcGVlZAk9IGlkZV9kbWFfc3BlZWQoZHJpdmUsIGl0ODIxeF9yYXRlbWFzayhkcml2ZSkpOworCisJY29uZmlnX2l0ODIxeF9jaGlwc2V0X2Zvcl9waW8oZHJpdmUsICFzcGVlZCk7CisJaXQ4MjF4X3R1bmVfY2hpcHNldChkcml2ZSwgc3BlZWQpOworCXJldHVybiBpZGVfZG1hX2VuYWJsZShkcml2ZSk7Cit9CisKKy8qKgorICoJaXQ4MjF4X2NvbmZpZ3VyZV9kcml2ZV9mb3JfZG1hCS0Jc2V0IHVwIGZvciBETUEgdHJhbnNmZXJzCisgKglAZHJpdmU6IGRyaXZlIHdlIGFyZSBnb2luZyB0byBzZXQgdXAKKyAqCisgKglTZXQgdXAgdGhlIGRyaXZlIGZvciBETUEsIHR1bmUgdGhlIGNvbnRyb2xsZXIgYW5kIGRyaXZlIGFzCisgKglyZXF1aXJlZC4gSWYgdGhlIGRyaXZlIGlzbid0IHN1aXRhYmxlIGZvciBETUEgb3Igd2UgaGl0CisgKglvdGhlciBwcm9ibGVtcyB0aGVuIHdlIHdpbGwgZHJvcCBkb3duIHRvIFBJTyBhbmQgc2V0IHVwCisgKglQSU8gYXBwcm9wcmlhdGVseQorICovCisKK3N0YXRpYyBpbnQgaXQ4MjF4X2NvbmZpZ19kcml2ZV9mb3JfZG1hIChpZGVfZHJpdmVfdCAqZHJpdmUpCit7CisJaWRlX2h3aWZfdCAqaHdpZgk9IGRyaXZlLT5od2lmOworCisJaWYgKGlkZV91c2VfZG1hKGRyaXZlKSkgeworCQlpZiAoY29uZmlnX2NoaXBzZXRfZm9yX2RtYShkcml2ZSkpCisJCQlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vbihkcml2ZSk7CisJfQorCWNvbmZpZ19pdDgyMXhfY2hpcHNldF9mb3JfcGlvKGRyaXZlLCAxKTsKKwlyZXR1cm4gaHdpZi0+aWRlX2RtYV9vZmZfcXVpZXRseShkcml2ZSk7Cit9CisKKy8qKgorICoJYXRhNjZfaXQ4MjF4CS0JY2hlY2sgZm9yIDgwIHBpbiBjYWJsZQorICoJQGh3aWY6IGludGVyZmFjZSB0byBjaGVjaworICoKKyAqCUNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgYW4gQVRBNjYgY2FwYWJsZSBjYWJsZSBvbiB0aGUKKyAqCWludGVyZmFjZS4gUHJvYmxlbWF0aWMgYXMgaXQgc2VlbXMgc29tZSBjYXJkcyBkb24ndCBoYXZlCisgKgl0aGUgbmVlZGVkIGxvZ2ljIG9uYm9hcmQuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgYXRhNjZfaXQ4MjF4KGlkZV9od2lmX3QgKmh3aWYpCit7CisJLyogVGhlIHJlZmVyZW5jZSBkcml2ZXIgYWxzbyBvbmx5IGRvZXMgZGlzayBzaWRlICovCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJaXQ4MjF4X2ZpeHVwCS0JcG9zdCBpbml0IGNhbGxiYWNrCisgKglAaHdpZjogaW50ZXJmYWNlCisgKgorICoJVGhpcyBjYWxsYmFjayBpcyBydW4gYWZ0ZXIgdGhlIGRyaXZlcyBoYXZlIGJlZW4gcHJvYmVkIGJ1dAorICoJYmVmb3JlIGFueXRoaW5nIGdldHMgYXR0YWNoZWQuIEl0IGFsbG93cyBkcml2ZXJzIHRvIGRvIGFueQorICoJZmluYWwgdHVuaW5nIHRoYXQgaXMgbmVlZGVkLCBvciBmaXh1cHMgdG8gd29yayBhcm91bmQgYnVncy4KKyAqLworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaXQ4MjF4X2ZpeHVwcyhpZGVfaHdpZl90ICpod2lmKQoreworCXN0cnVjdCBpdDgyMXhfZGV2ICppdGRldiA9IGlkZV9nZXRfaHdpZmRhdGEoaHdpZik7CisJaW50IGk7CisKKwlpZighaXRkZXYtPnNtYXJ0KSB7CisJCS8qCisJCSAqCUlmIHdlIGFyZSBpbiBwYXNzIHRocm91Z2ggbW9kZSB0aGVuIG5vdCBtdWNoCisJCSAqCW5lZWRzIHRvIGJlIGRvbmUsIGJ1dCB3ZSBkbyBib3RoZXIgdG8gY2xlYXIgdGhlCisJCSAqCUlSUSBtYXNrIGFzIHdlIG1heSB3ZWxsIGJlIGluIFBJTyAoZWcgcmV2IDB4MTApCisJCSAqCWZvciBub3cgYW5kIHdlIGtub3cgdW5tYXNraW5nIGlzIHNhZmUgb24gdGhpcyBjaGlwc2V0LgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKKwkJCWlmKGRyaXZlLT5wcmVzZW50KQorCQkJCWRyaXZlLT51bm1hc2sgPSAxOworCQl9CisJCXJldHVybjsKKwl9CisJLyoKKwkgKglQZXJmb3JtIGZpeHVwcyBvbiBzbWFydCBtb2RlLiBXZSBuZWVkIHRvICJsb3NlIiBzb21lCisJICoJY2FwYWJpbGl0aWVzIHRoZSBmaXJtd2FyZSBsYWNrcyBidXQgZG9lcyBub3QgZmlsdGVyLCBhbmQKKwkgKglhbHNvIHBhdGNoIHVwIHNvbWUgY2FwYWJpbGl0eSBiaXRzIHRoYXQgaXQgZm9yZ2V0cyB0byBzZXQKKwkgKglpbiBSQUlEIG1vZGUuCisJICovCisKKwlmb3IoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWRlX2RyaXZlX3QgKmRyaXZlID0gJmh3aWYtPmRyaXZlc1tpXTsKKwkJc3RydWN0IGhkX2RyaXZlaWQgKmlkOworCQl1MTYgKmlkYml0czsKKworCQlpZighZHJpdmUtPnByZXNlbnQpCisJCQljb250aW51ZTsKKwkJaWQgPSBkcml2ZS0+aWQ7CisJCWlkYml0cyA9ICh1MTYgKilkcml2ZS0+aWQ7CisKKwkJLyogQ2hlY2sgZm9yIFJBSUQgdiBuYXRpdmUgKi8KKwkJaWYoc3Ryc3RyKGlkLT5tb2RlbCwgIkludGVncmF0ZWQgVGVjaG5vbG9neSBFeHByZXNzIikpIHsKKwkJCS8qIEluIHJhaWQgbW9kZSB0aGUgaWRlbnQgYmxvY2sgaXMgc2xpZ2h0bHkgYnVnZ3kKKwkJCSAgIFdlIG5lZWQgdG8gc2V0IHRoZSBiaXRzIHNvIHRoYXQgdGhlIElERSBsYXllciBrbm93cworCQkJICAgTEJBMjguIExCQTQ4IGFuZCBETUEgYXIgdmFsaWQgKi8KKwkJCWlkLT5jYXBhYmlsaXR5IHw9IDM7CQkvKiBMQkEyOCwgRE1BICovCisJCQlpZC0+Y29tbWFuZF9zZXRfMiB8PSAweDA0MDA7CS8qIExCQTQ4IHZhbGlkICovCisJCQlpZC0+Y2ZzX2VuYWJsZV8yIHw9IDB4MDQwMDsJLyogTEJBNDggb24gKi8KKwkJCS8qIFJlcG9ydGluZyBsb2dpYyAqLworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElUODIxMiAlc1JBSUQgJWQgdm9sdW1lIiwKKwkJCQlkcml2ZS0+bmFtZSwKKwkJCQlpZGJpdHNbMTQ3XSA/ICJCb290YWJsZSAiOiIiLAorCQkJCWlkYml0c1sxMjldKTsKKwkJCQlpZihpZGJpdHNbMTI5XSAhPSAxKQorCQkJCQlwcmludGsoIiglZEsgc3RyaXBlKSIsIGlkYml0c1sxNDZdKTsKKwkJCQlwcmludGsoIi5cbiIpOworCQkJLyogTm93IHRoZSBjb3JlIGNvZGUgd2lsbCBoYXZlIHdyb25nbHkgZGVjaWRlZCBubyBETUEKKwkJCSAgIHNvIHdlIG5lZWQgdG8gZml4IHRoaXMgKi8KKwkJCWh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOworI2lmZGVmIENPTkZJR19JREVETUFfT05MWURJU0sKKwkJCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX2Rpc2spCisjZW5kaWYKKwkJCQlod2lmLT5pZGVfZG1hX2NoZWNrKGRyaXZlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vbiBSQUlEIHZvbHVtZS4gRml4dXBzIHRvIHN0b3AgdGhlIGNvcmUgY29kZQorCQkJICAgZG9pbmcgdW5zdXBwb3J0ZWQgdGhpbmdzICovCisJCQlpZC0+ZmllbGRfdmFsaWQgJj0gMTsKKwkJCWlkLT5xdWV1ZV9kZXB0aCA9IDA7CisJCQlpZC0+Y29tbWFuZF9zZXRfMSA9IDA7CisJCQlpZC0+Y29tbWFuZF9zZXRfMiAmPSAweEM0MDA7CisJCQlpZC0+Y2Zzc2UgJj0gMHhDMDAwOworCQkJaWQtPmNmc19lbmFibGVfMSA9IDA7CisJCQlpZC0+Y2ZzX2VuYWJsZV8yICY9IDB4QzQwMDsKKwkJCWlkLT5jc2ZfZGVmYXVsdCAmPSAweEMwMDA7CisJCQlpZC0+d29yZDEyNyA9IDA7CisJCQlpZC0+ZGxmID0gMDsKKwkJCWlkLT5jc2ZvID0gMDsKKwkJCWlkLT5jZmFfcG93ZXIgPSAwOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBlcmZvcm1pbmcgaWRlbnRpZnkgZml4dXBzLlxuIiwKKwkJCQlkcml2ZS0+bmFtZSk7CisJCX0KKwl9CisKK30KKworLyoqCisgKglpbml0X2h3aWZfaXQ4MjF4CS0Jc2V0IHVwIGh3aWYgc3RydWN0cworICoJQGh3aWY6IGludGVyZmFjZSB0byBzZXQgdXAKKyAqCisgKglXZSBkbyB0aGUgYmFzaWMgc2V0IHVwIG9mIHRoZSBpbnRlcmZhY2Ugc3RydWN0dXJlLiBUaGUgSVQ4MjEyCisgKglyZXF1aXJlcyBzZXZlcmFsIGN1c3RvbSBoYW5kbGVycyBzbyB3ZSBvdmVycmlkZSB0aGUgZGVmYXVsdAorICoJaWRlIERNQSBoYW5kbGVycyBhcHByb3ByaWF0ZWx5CisgKi8KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9pdDgyMXgoaWRlX2h3aWZfdCAqaHdpZikKK3sKKwlzdHJ1Y3QgaXQ4MjF4X2RldiAqaWRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpdDgyMXhfZGV2KSwgR0ZQX0tFUk5FTCk7CisJdTggY29uZjsKKworCWlmKGlkZXYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIml0ODIxeDogb3V0IG9mIG1lbW9yeSwgZmFsbGluZyBiYWNrIHRvIGxlZ2FjeSBiZWhhdmlvdXIuXG4iKTsKKwkJZ290byBmYWxsYmFjazsKKwl9CisJbWVtc2V0KGlkZXYsIDAsIHNpemVvZihzdHJ1Y3QgaXQ4MjF4X2RldikpOworCWlkZV9zZXRfaHdpZmRhdGEoaHdpZiwgaWRldik7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShod2lmLT5wY2lfZGV2LCAweDUwLCAmY29uZik7CisJaWYoY29uZiAmIDEpIHsKKwkJaWRldi0+c21hcnQgPSAxOworCQlod2lmLT5hdGFwaV9kbWEgPSAwOworCQkvKiBMb25nIEkvTydzIGFsdGhvdWdoIGFsbG93ZWQgaW4gTEJBNDggc3BhY2UgY2F1c2UgdGhlCisJCSAgIG9uYm9hcmQgZmlybXdhcmUgdG8gZW50ZXIgdGhlIHR3aWdobGlnaHQgem9uZSAqLworCQlod2lmLT5ycXNpemUgPSAyNTY7CisJfQorCisJLyogUHVsbCB0aGUgY3VycmVudCBjbG9ja3MgZnJvbSAweDUwIGFsc28gKi8KKwlpZiAoY29uZiAmICgxIDw8ICgxICsgaHdpZi0+Y2hhbm5lbCkpKQorCQlpZGV2LT5jbG9ja19tb2RlID0gQVRBXzUwOworCWVsc2UKKwkJaWRldi0+Y2xvY2tfbW9kZSA9IEFUQV82NjsKKworCWlkZXYtPndhbnRbMF1bMV0gPSBBVEFfQU5ZOworCWlkZXYtPndhbnRbMV1bMV0gPSBBVEFfQU5ZOworCisJLyoKKwkgKglOb3QgaW4gdGhlIGRvY3MgYnV0IGFjY29yZGluZyB0byB0aGUgcmVmZXJlbmNlIGRyaXZlcgorCSAqCXRoaXMgaXMgbmVjY2Vzc2FyeS4KKwkgKi8KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGh3aWYtPnBjaV9kZXYsIDB4MDgsICZjb25mKTsKKwlpZihjb25mID09IDB4MTApIHsKKwkJaWRldi0+dGltaW5nMTAgPSAxOworCQlod2lmLT5hdGFwaV9kbWEgPSAwOworCQlpZighaWRldi0+c21hcnQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpdDgyMXg6IFJldmlzaW9uIDB4MTAsIHdvcmthcm91bmRzIGFjdGl2YXRlZC5cbiIpOworCX0KKworCWh3aWYtPnNwZWVkcHJvYyA9ICZpdDgyMXhfdHVuZV9jaGlwc2V0OworCWh3aWYtPnR1bmVwcm9jCT0gJml0ODIxeF90dW5lcHJvYzsKKworCS8qIE1XRE1BL1BJTyBjbG9jayBzd2l0Y2hpbmcgZm9yIHBhc3MgdGhyb3VnaCBtb2RlICovCisJaWYoIWlkZXYtPnNtYXJ0KSB7CisJCWh3aWYtPmRtYV9zdGFydCA9ICZpdDgyMXhfZG1hX3N0YXJ0OworCQlod2lmLT5pZGVfZG1hX2VuZCA9ICZpdDgyMXhfZG1hX2VuZDsKKwl9CisKKwlod2lmLT5kcml2ZXNbMF0uYXV0b3R1bmUgPSAxOworCWh3aWYtPmRyaXZlc1sxXS5hdXRvdHVuZSA9IDE7CisKKwlpZiAoIWh3aWYtPmRtYV9iYXNlKQorCQlnb3RvIGZhbGxiYWNrOworCisJaHdpZi0+dWx0cmFfbWFzayA9IDB4N2Y7CisJaHdpZi0+bXdkbWFfbWFzayA9IDB4MDc7CisJaHdpZi0+c3dkbWFfbWFzayA9IDB4MDc7CisKKwlod2lmLT5pZGVfZG1hX2NoZWNrID0gJml0ODIxeF9jb25maWdfZHJpdmVfZm9yX2RtYTsKKwlpZiAoIShod2lmLT51ZG1hX2ZvdXIpKQorCQlod2lmLT51ZG1hX2ZvdXIgPSBhdGE2Nl9pdDgyMXgoaHdpZik7CisKKwkvKgorCSAqCVRoZSBCSU9TIG9mdGVuIGRvZXNuJ3Qgc2V0IHVwIERNQSBvbiB0aGlzIGNvbnRyb2xsZXIKKwkgKglzbyB3ZSBhbHdheXMgZG8gaXQuCisJICovCisKKwlod2lmLT5hdXRvZG1hID0gMTsKKwlod2lmLT5kcml2ZXNbMF0uYXV0b2RtYSA9IGh3aWYtPmF1dG9kbWE7CisJaHdpZi0+ZHJpdmVzWzFdLmF1dG9kbWEgPSBod2lmLT5hdXRvZG1hOworCXJldHVybjsKK2ZhbGxiYWNrOgorCWh3aWYtPmF1dG9kbWEgPSAwOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGl0ODIxMl9kaXNhYmxlX3JhaWQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiBSZXNldCBsb2NhbCBDUFUsIGFuZCBzZXQgQklPUyBub3QgcmVhZHkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDVFLCAweDAxKTsKKworCS8qIFNldCB0byBieXBhc3MgbW9kZSwgYW5kIHJlc2V0IFBDSSBidXMgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAweDAwKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwKKwkJCSAgICAgIFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX0lPIHwKKwkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHg0MCwgMHhBMEYzKTsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LDB4NEMsIDB4MDIwNDAyMDQpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4NDIsIDB4MzYpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAwKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgaW5pdF9jaGlwc2V0X2l0ODIxeChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworCXU4IGNvbmY7CisJc3RhdGljIGNoYXIgKm1vZGVbMl0gPSB7ICJwYXNzIHRocm91Z2giLCAic21hcnQiIH07CisKKwkvKiBGb3JjZSB0aGUgY2FyZCBpbnRvIGJ5cGFzcyBtb2RlIGlmIHNvIHJlcXVlc3RlZCAqLworCWlmIChpdDgyMTJfbm9yYWlkKSB7CisJCXByaW50ayhLRVJOX0lORk8gIml0ODIxMjogZm9yY2luZyBieXBhc3MgbW9kZS5cbiIpOworCQlpdDgyMTJfZGlzYWJsZV9yYWlkKGRldik7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgJmNvbmYpOworCXByaW50ayhLRVJOX0lORk8gIml0ODIxeDogY29udHJvbGxlciBpbiAlcyBtb2RlLlxuIiwgbW9kZVtjb25mICYgMV0pOworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgREVDTEFSRV9JVEVfREVWKG5hbWVfc3RyKQkJCVwKKwl7CQkJCQkJXAorCQkubmFtZQkJPSBuYW1lX3N0ciwJCVwKKwkJLmluaXRfY2hpcHNldAk9IGluaXRfY2hpcHNldF9pdDgyMXgsCVwKKwkJLmluaXRfaHdpZgk9IGluaXRfaHdpZl9pdDgyMXgsCVwKKwkJLmNoYW5uZWxzCT0gMiwJCQlcCisJCS5hdXRvZG1hCT0gQVVUT0RNQSwJCVwKKwkJLmJvb3RhYmxlCT0gT05fQk9BUkQsCQlcCisJCS5maXh1cAkgCT0gaXQ4MjF4X2ZpeHVwcwkJXAorCX0KKworc3RhdGljIGlkZV9wY2lfZGV2aWNlX3QgaXQ4MjF4X2NoaXBzZXRzW10gX19kZXZpbml0ZGF0YSA9IHsKKwkvKiAwICovIERFQ0xBUkVfSVRFX0RFVigiSVQ4MjEyIiksCit9OworCisvKioKKyAqCWl0ODIxeF9pbml0X29uZQktCXBjaSBsYXllciBkaXNjb3ZlcnkgZW50cnkKKyAqCUBkZXY6IFBDSSBkZXZpY2UKKyAqCUBpZDogaWRlbnQgdGFibGUgZW50cnkKKyAqCisgKglDYWxsZWQgYnkgdGhlIFBDSSBjb2RlIHdoZW4gaXQgZmluZHMgYW4gSVRFODIxeCBjb250cm9sbGVyLgorICoJV2UgdGhlbiB1c2UgdGhlIElERSBQQ0kgZ2VuZXJpYyBoZWxwZXIgdG8gZG8gbW9zdCBvZiB0aGUgd29yay4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpdDgyMXhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgJml0ODIxeF9jaGlwc2V0c1tpZC0+ZHJpdmVyX2RhdGFdKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGl0ODIxeF9wY2lfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0lURSwgUENJX0RFVklDRV9JRF9JVEVfODIxMSwgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDB9LAorCXsgUENJX1ZFTkRPUl9JRF9JVEUsIFBDSV9ERVZJQ0VfSURfSVRFXzgyMTIsICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwKKwl7IDAsIH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaXQ4MjF4X3BjaV90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lCQk9ICJJVEU4MjF4IElERSIsCisJLmlkX3RhYmxlCT0gaXQ4MjF4X3BjaV90YmwsCisJLnByb2JlCQk9IGl0ODIxeF9pbml0X29uZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGl0ODIxeF9pZGVfaW5pdCh2b2lkKQoreworCXJldHVybiBpZGVfcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXQ4MjF4X2lkZV9pbml0KTsKKworbW9kdWxlX3BhcmFtX25hbWVkKG5vcmFpZCwgaXQ4MjEyX25vcmFpZCwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaXQ4MjEyX25vcmFpZCwgIkZvcmNlIGNhcmQgaW50byBieXBhc3MgbW9kZSIpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQQ0kgZHJpdmVyIG1vZHVsZSBmb3IgdGhlIElURSA4MjF4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvbnM4NzQxNS5jIGIvZHJpdmVycy9pZGUvcGNpL25zODc0MTUuYwppbmRleCAyMDVhMzJmLi5mY2Q1MTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvbnM4NzQxNS5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9uczg3NDE1LmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiBfX2lkZV9kbWFfY2hlY2soZHJpdmUpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX25zODc0MTUgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX25zODc0MTUgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CiAJdW5zaWduZWQgaW50IGN0cmwsIHVzaW5nX2ludGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvb3B0aTYyMS5jIGIvZHJpdmVycy9pZGUvcGNpL29wdGk2MjEuYwppbmRleCBjZjRmZDkxLi43YTdjMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvb3B0aTYyMS5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9vcHRpNjIxLmMKQEAgLTMyNiw3ICszMjYsNyBAQAogLyoKICAqIGluaXRfaHdpZl9vcHRpNjIxKCkgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaHdpZiBmb3VuZCBhdCBib290LgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX29wdGk2MjEgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX29wdGk2MjEgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJaHdpZi0+YXV0b2RtYSA9IDA7CiAJaHdpZi0+ZHJpdmVzWzBdLmRyaXZlX2RhdGEgPSBQSU9fRE9OVF9LTk9XOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jIGIvZHJpdmVycy9pZGUvcGNpL3NjMTIwMC5jCmluZGV4IDNiYzNiZjEuLjEwNTkyY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zYzEyMDAuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvc2MxMjAwLmMKQEAgLTQ1OSw3ICs0NTksNyBAQAogICogVGhpcyBnZXRzIGludm9rZWQgYnkgdGhlIElERSBkcml2ZXIgb25jZSBmb3IgZWFjaCBjaGFubmVsLAogICogYW5kIHBlcmZvcm1zIGNoYW5uZWwtc3BlY2lmaWMgcHJlLWluaXRpYWxpemF0aW9uIGJlZm9yZSBkcml2ZSBwcm9iaW5nLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX3NjMTIwMCAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfc2MxMjAwIChpZGVfaHdpZl90ICpod2lmKQogewogCWlmIChod2lmLT5tYXRlKQogCQlod2lmLT5zZXJpYWxpemVkID0gaHdpZi0+bWF0ZS0+c2VyaWFsaXplZCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2VydmVyd29ya3MuYyBiL2RyaXZlcnMvaWRlL3BjaS9zZXJ2ZXJ3b3Jrcy5jCmluZGV4IDgyYTExMDMuLmM2ZjVmYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zZXJ2ZXJ3b3Jrcy5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zZXJ2ZXJ3b3Jrcy5jCkBAIC00NDIsNyArNDQyLDcgQEAKIAlyZXR1cm4gKGRldi0+aXJxKSA/IGRldi0+aXJxIDogMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfc3Z3a3Nfc3Z3a3MgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBhdGE2Nl9zdndrc19zdndrcyAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlyZXR1cm4gMTsKIH0KQEAgLTQ1NCw3ICs0NTQsNyBAQAogICogQml0IDE0IGNsZWFyID0gcHJpbWFyeSBJREUgY2hhbm5lbCBkb2VzIG5vdCBoYXZlIDgwLXBpbiBjYWJsZS4KICAqIEJpdCAxNCBzZXQgICA9IHByaW1hcnkgSURFIGNoYW5uZWwgaGFzIDgwLXBpbiBjYWJsZS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfc3Z3a3NfZGVsbCAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGF0YTY2X3N2d2tzX2RlbGwgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IGh3aWYtPnBjaV9kZXY7CiAJaWYgKGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RFTEwgJiYKQEAgLTQ3Miw3ICs0NzIsNyBAQAogICoKICAqIFdBUk5JTkc6IHRoaXMgb25seSB3b3JrcyBvbiBBbHBpbmUgaGFyZHdhcmUhCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGF0YTY2X3N2d2tzX2NvYmFsdCAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGF0YTY2X3N2d2tzX2NvYmFsdCAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIAlpZiAoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCkBAIC00ODMsNyArNDgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgYXRhNjZfc3Z3a3MgKGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdCBhdGE2Nl9zdndrcyAoaWRlX2h3aWZfdCAqaHdpZikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaHdpZi0+cGNpX2RldjsKIApAQCAtNTczLDcgKzU3Myw3IEBACiAJcmV0dXJuIGlkZV9zZXR1cF9wY2lfZGV2aWNlKGRldiwgZCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGluaXRfc2V0dXBfY3NiNiAoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfc2V0dXBfY3NiNiAoc3RydWN0IHBjaV9kZXYgKmRldiwgaWRlX3BjaV9kZXZpY2VfdCAqZCkKIHsKIAlpZiAoIShQQ0lfRlVOQyhkZXYtPmRldmZuKSAmIDEpKSB7CiAJCWQtPmJvb3RhYmxlID0gTkVWRVJfQk9BUkQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2w4MmMxMDUuYyBiL2RyaXZlcnMvaWRlL3BjaS9zbDgyYzEwNS5jCmluZGV4IDFkOTcwYTAuLmVhMDgwNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zbDgyYzEwNS5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zbDgyYzEwNS5jCkBAIC0zODYsNyArMzg2LDcgQEAKICAqIGNoYW5uZWwgMCBoZXJlIGF0IGxlYXN0LCBidXQgY2hhbm5lbCAxIGhhcyB0byBiZSBlbmFibGVkIGJ5CiAgKiBmaXJtd2FyZSBvciBhcmNoIGNvZGUuIFdlIHN0aWxsIHNldCBib3RoIHRvIDE2IGJpdHMgbW9kZS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaW5pdF9jaGlwc2V0X3NsODJjMTA1KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IGNoYXIgKm1zZykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF9zbDgyYzEwNShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICptc2cpCiB7CiAJdTMyIHZhbDsKIApAQCAtMzk5LDcgKzM5OSw3IEBACiAJcmV0dXJuIGRldi0+aXJxOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9kbWFfc2w4MmMxMDUoaWRlX2h3aWZfdCAqaHdpZiwgdW5zaWduZWQgbG9uZyBkbWFfYmFzZSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2RtYV9zbDgyYzEwNShpZGVfaHdpZl90ICpod2lmLCB1bnNpZ25lZCBsb25nIGRtYV9iYXNlKQogewogCXVuc2lnbmVkIGludCByZXY7CiAJdTggZG1hX3N0YXRlOwpAQCAtNDMxLDcgKzQzMSw3IEBACiAgKiBJbml0aWFsaXNlIHRoZSBjaGlwCiAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9zbDgyYzEwNShpZGVfaHdpZl90ICpod2lmKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGluaXRfaHdpZl9zbDgyYzEwNShpZGVfaHdpZl90ICpod2lmKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBod2lmLT5wY2lfZGV2OwogCXUzMiB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2xjOTBlNjYuYyBiL2RyaXZlcnMvaWRlL3BjaS9zbGM5MGU2Ni5jCmluZGV4IDdmYmYzNjMuLjUxMTJjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS9zbGM5MGU2Ni5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zbGM5MGU2Ni5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JREVETUEgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaHdpZl9zbGM5MGU2NiAoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfc2xjOTBlNjYgKGlkZV9od2lmX3QgKmh3aWYpCiB7CiAJdTggcmVnNDcgPSAwOwogCXU4IG1hc2sgPSBod2lmLT5jaGFubmVsID8gMHgwMSA6IDB4MDI7ICAvKiBiaXQwOlByaW1hcnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BjaS90cmlmbGV4LmMgYi9kcml2ZXJzL2lkZS9wY2kvdHJpZmxleC5jCmluZGV4IGExZGYyYmYuLmY5NmI1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS90cmlmbGV4LmMKKysrIGIvZHJpdmVycy9pZGUvcGNpL3RyaWZsZXguYwpAQCAtMTMwLDcgKzEzMCw3IEBACiAJcmV0dXJuIGh3aWYtPmlkZV9kbWFfb2ZmX3F1aWV0bHkoZHJpdmUpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9od2lmX3RyaWZsZXgoaWRlX2h3aWZfdCAqaHdpZikKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfdHJpZmxleChpZGVfaHdpZl90ICpod2lmKQogewogCWh3aWYtPnR1bmVwcm9jID0gJnRyaWZsZXhfdHVuZV9kcml2ZTsKIAlod2lmLT5zcGVlZHByb2MgPSAmdHJpZmxleF90dW5lX2NoaXBzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMgYi9kcml2ZXJzL2lkZS9wY2kvdmlhODJjeHh4LmMKaW5kZXggMDY5ZGJmZi4uYTRkMDk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvcGNpL3ZpYTgyY3h4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS92aWE4MmN4eHguYwpAQCAtNDE1LDcgKzQxNSw3IEBACiAgKglhbmQgaW5pdGlhbGl6ZSBpdHMgZHJpdmUgaW5kZXBlbmRlbnQgcmVnaXN0ZXJzLgogICovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGluaXRfY2hpcHNldF92aWE4MmN4eHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGluaXRfY2hpcHNldF92aWE4MmN4eHgoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqaXNhID0gTlVMTDsKIAl1OCB0LCB2OwpAQCAtNTc2LDcgKzU3Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2h3aWZfdmlhODJjeHh4KGlkZV9od2lmX3QgKmh3aWYpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9od2lmX3ZpYTgyY3h4eChpZGVfaHdpZl90ICpod2lmKQogewogCWludCBpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwppbmRleCA1NjlmMTY3Li5iZTBmY2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCisrKyBiL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKQEAgLTEzMjQsOSArMTMyNCw5IEBACiAJLyogWFhYIEZJWE1FOiBNZWRpYSBiYXkgc3R1ZmYgbmVlZCByZS1vcmdhbml6aW5nICovCiAJaWYgKG5wLT5wYXJlbnQgJiYgbnAtPnBhcmVudC0+bmFtZQogCSAgICAmJiBzdHJjYXNlY21wKG5wLT5wYXJlbnQtPm5hbWUsICJtZWRpYS1iYXkiKSA9PSAwKSB7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQogCQltZWRpYV9iYXlfc2V0X2lkZV9pbmZvcyhucC0+cGFyZW50LCBwbWlmLT5yZWdiYXNlLCBwbWlmLT5pcnEsIGh3aWYtPmluZGV4KTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTUFDX01FRElBQkFZICovCiAJCXBtaWYtPm1lZGlhYmF5ID0gMTsKIAkJaWYgKCFiaWRwKQogCQkJcG1pZi0+YWFwbF9idXNfaWQgPSAxOwpAQCAtMTM4MiwxMCArMTM4MiwxMCBAQAogCSAgICAgICBod2lmLT5pbmRleCwgbW9kZWxfbmFtZVtwbWlmLT5raW5kXSwgcG1pZi0+YWFwbF9idXNfaWQsCiAJICAgICAgIHBtaWYtPm1lZGlhYmF5ID8gIiAobWVkaWFiYXkpIiA6ICIiLCBod2lmLT5pcnEpOwogCQkJCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE1BQ19NRURJQUJBWQogCWlmIChwbWlmLT5tZWRpYWJheSAmJiBjaGVja19tZWRpYV9iYXlfYnlfYmFzZShwbWlmLT5yZWdiYXNlLCBNQl9DRCkgPT0gMCkKIAkJaHdpZi0+bm9wcm9iZSA9IDA7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE1BQ19NRURJQUJBWSAqLwogCiAJaHdpZi0+c2dfbWF4X25lbnRzID0gTUFYX0RDTURTOwogCkBAIC0xNDE5LDcgKzE0MTksNyBAQAogICogQXR0YWNoIHRvIGEgbWFjaW8gcHJvYmVkIGludGVyZmFjZQogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdAotcG1hY19pZGVfbWFjaW9fYXR0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitwbWFjX2lkZV9tYWNpb19hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgcmVnYmFzZTsKQEAgLTE2MzcsMjcgKzE2MzcsMTkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggcG1hY19pZGVfbWFjaW9fbWF0Y2hbXSA9IAorc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcG1hY19pZGVfbWFjaW9fbWF0Y2hbXSA9IAogewogCXsKIAkubmFtZSAJCT0gIklERSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7CiAJLm5hbWUgCQk9ICJBVEEiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImlkZSIsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXsKLQkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAogCS50eXBlCQk9ICJhdGEiLAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9zZXR1cC1wY2kuYyBiL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCmluZGV4IGU1MDE2NzUuLjc3ZGE4MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCisrKyBiL2RyaXZlcnMvaWRlL3NldHVwLXBjaS5jCkBAIC04NDcsNyArODQ3LDcgQEAKIAkJZCA9IGxpc3RfZW50cnkobCwgc3RydWN0IHBjaV9kcml2ZXIsIG5vZGUpOwogCQlpZihkLT5pZF90YWJsZSkKIAkJewotCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkID0gcGNpX21hdGNoX2RldmljZShkLT5pZF90YWJsZSwgZGV2KTsKKwkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCA9IHBjaV9tYXRjaF9pZChkLT5pZF90YWJsZSwgZGV2KTsKIAkJCWlmKGlkICE9IE5VTEwpCiAJCQl7CiAJCQkJaWYoZC0+cHJvYmUoZGV2LCBpZCkgPj0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZyBiL2RyaXZlcnMvaWVlZTEzOTQvS2NvbmZpZwppbmRleCA3ZDU4YWYxLi4yNTEwM2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L0tjb25maWcKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9LY29uZmlnCkBAIC02Niw2ICs2NiwxOCBAQAogCSAgd2l0aCBNYWNPU1ggYW5kIFdpblhQIElQLW92ZXItMTM5NCksIGVuYWJsZSB0aGlzIG9wdGlvbiBhbmQgdGhlCiAJICBldGgxMzk0IG9wdGlvbiBiZWxvdy4KIAorY29uZmlnIElFRUUxMzk0X0VYUE9SVF9GVUxMX0FQSQorCWJvb2wgIkV4cG9ydCBhbGwgc3ltYm9scyBvZiBpZWVlMTM5NCdzIEFQSSIKKwlkZXBlbmRzIG9uIElFRUUxMzk0CisJZGVmYXVsdCBuCisJaGVscAorCSAgRXhwb3J0IGFsbCBzeW1ib2xzIG9mIGllZWUxMzk0J3MgZHJpdmVyIHByb2dyYW1taW5nIGludGVyZmFjZSwgZXZlbgorCSAgdGhvc2UgdGhhdCBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBzdGFuZGFyZCBJRUVFIDEzOTQgZHJpdmVycy4KKworCSAgVGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBpbnRlcmZhY2UgdG8gdXNlcnNwYWNlIGFwcGxpY2F0aW9ucy4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBleHRlcm5hbGx5IGRldmVsb3BlZCBkcml2ZXJzIHRoYXQKKwkgIG1ha2UgZXh0ZW5kZWQgdXNlIG9mIGllZWUxMzk0J3MgQVBJLiBJdCBpcyBvdGhlcndpc2Ugc2FmZSB0byBzYXkgTi4KKwogY29tbWVudCAiRGV2aWNlIERyaXZlcnMiCiAJZGVwZW5kcyBvbiBJRUVFMTM5NAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5jIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IuYwppbmRleCAxYjk4Njg0Li4xNDk1NzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L2Nzci5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvY3NyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJob3N0cy5oIgogI2luY2x1ZGUgImllZWUxMzk0LmgiCiAjaW5jbHVkZSAiaGlnaGxldmVsLmgiCisjaW5jbHVkZSAiaWVlZTEzOTRfY29yZS5oIgogCiAvKiBNb2R1bGUgUGFyYW1ldGVycyAqLwogLyogdGhpcyBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgbWFwcGluZyBvZiB0aGUgRkNQIHJlZ2lzdGVycyAqLwpAQCAtMjMyLDcgKzIzMyw3IEBACiAJaG9zdC0+Y3NyLmdlbmVyYXRpb24gPSAyOwogCiAJYnVzX2luZm9bMV0gPSBfX2NvbnN0YW50X2NwdV90b19iZTMyKDB4MzEzMzM5MzQpOwotCWJ1c19pbmZvWzJdID0gY3B1X3RvX2JlMzIoKDEgPDwgQ1NSX0lSTUNfU0hJRlQpIHwKKwlidXNfaW5mb1syXSA9IGNwdV90b19iZTMyKChocHNiX2Rpc2FibGVfaXJtID8gMCA6IDEgPDwgQ1NSX0lSTUNfU0hJRlQpIHwKIAkJCQkgICgxIDw8IENTUl9DTUNfU0hJRlQpIHwKIAkJCQkgICgxIDw8IENTUl9JU0NfU0hJRlQpIHwKIAkJCQkgICgwIDw8IENTUl9CTUNfU0hJRlQpIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvY3NyMTIxMi5jIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMKaW5kZXggN2M0MzMwZS4uNjFkZGQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9jc3IxMjEyLmMKQEAgLTIwOSw3ICsyMDksMTUgQEAKIHsKIAlzdGF0aWMgY29uc3QgaW50IG1yX21hcFtdID0geyA0LCA2NCwgMTAyNCwgMCB9OwogCisjaWZkZWYgX19LRVJORUxfXworCUJVR19PTihtYXhfcm9tICYgfjB4Myk7CiAJY3NyLT5tYXhfcm9tID0gbXJfbWFwW21heF9yb21dOworI2Vsc2UKKwlpZiAobWF4X3JvbSAmIH4weDMpIC8qIGNhbGxlciBzdXBwbGllZCBpbnZhbGlkIGFyZ3VtZW50ICovCisJCWNzci0+bWF4X3JvbSA9IDA7CisJZWxzZQorCQljc3ItPm1heF9yb20gPSBtcl9tYXBbbWF4X3JvbV07CisjZW5kaWYKIAltZW1jcHkoY3NyLT5idXNfaW5mb19kYXRhLCBidXNfaW5mb19kYXRhLCBjc3ItPmJ1c19pbmZvX2xlbik7CiB9CiAKQEAgLTUzMywxMiArNTQxLDE1IEBACiAJc3RhdGljIGNvbnN0IGludCBwZFs0XSA9IHsgMCwgNCwgMTYsIDI1NiB9OwogCXN0YXRpYyBjb25zdCBpbnQgY3NbMTZdID0geyA0LCAyIH07CiAJc3RydWN0IGNzcjEyMTJfa2V5dmFsICprdjsKLQlpbnQgcGFsZXR0ZV9zaXplID0gcGRbcGFsZXR0ZV9kZXB0aF0gKiBjc1tjb2xvcl9zcGFjZV07CisJaW50IHBhbGV0dGVfc2l6ZTsKIAlpbnQgcGl4ZWxfc2l6ZSA9IChoc2NhbiAqIHZzY2FuICsgMykgJiB+MHgzOwogCi0JaWYgKChwYWxldHRlX2RlcHRoICYmICFwYWxldHRlKSB8fCAhcGl4ZWxzKQorCWlmICghcGl4ZWxzIHx8ICghcGFsZXR0ZSAmJiBwYWxldHRlX2RlcHRoKSB8fAorCSAgICAocGFsZXR0ZV9kZXB0aCAmIH4weDMpIHx8IChjb2xvcl9zcGFjZSAmIH4weGYpKQogCQlyZXR1cm4gTlVMTDsKIAorCXBhbGV0dGVfc2l6ZSA9IHBkW3BhbGV0dGVfZGVwdGhdICogY3NbY29sb3Jfc3BhY2VdOworCiAJa3YgPSBjc3IxMjEyX25ld19kZXNjcmlwdG9yX2xlYWYoMSwgMCwgTlVMTCwKIAkJCQkJIHBhbGV0dGVfc2l6ZSArIHBpeGVsX3NpemUgKwogCQkJCQkgQ1NSMTIxMl9JQ09OX0RFU0NSSVBUT1JfTEVBRl9PVkVSSEVBRCk7CkBAIC03NjAsOSArNzcxLDkgQEAKIAlzdHJ1Y3QgY3NyMTIxMl9jc3Jfcm9tX2NhY2hlICpjYWNoZTsKIAl1X2ludDY0X3QgY3NyX2FkZHI7CiAKLQlpZiAoIWNzciB8fCAhY3NyLT5vcHMtPmFsbG9jYXRlX2FkZHJfcmFuZ2UgfHwKLQkgICAgIWNzci0+b3BzLT5yZWxlYXNlX2FkZHIpCi0JCXJldHVybiBDU1IxMjEyX0VOT01FTTsKKwlpZiAoIWNzciB8fCAhY3NyLT5vcHMgfHwgIWNzci0+b3BzLT5hbGxvY2F0ZV9hZGRyX3JhbmdlIHx8CisJICAgICFjc3ItPm9wcy0+cmVsZWFzZV9hZGRyIHx8IGNzci0+bWF4X3JvbSA8IDEpCisJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKIAogCS8qIFJPTSBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBjc3ItPm1heF9yb20gKi8KIAlyb21zaXplID0gKHJvbXNpemUgKyAoY3NyLT5tYXhfcm9tIC0gMSkpICYgfihjc3ItPm1heF9yb20gLSAxKTsKQEAgLTExNDUsNiArMTE1Niw4IEBACiAKIAkJCS8qIE1ha2Ugc3VyZSB0aGUgRXh0ZW5kZWQgUk9NIGxlYWYgaXMgYSBtdWx0aXBsZSBvZgogCQkJICogbWF4X3JvbSBpbiBzaXplLiAqLworCQkJaWYgKGNzci0+bWF4X3JvbSA8IDEpCisJCQkJcmV0dXJuIENTUjEyMTJfRUlOVkFMOwogCQkJbGVhZl9zaXplID0gKGNhY2hlLT5sZW4gKyAoY3NyLT5tYXhfcm9tIC0gMSkpICYKIAkJCQl+KGNzci0+bWF4X3JvbSAtIDEpOwogCkBAIC0xNDA5LDcgKzE0MjIsNyBAQAogCXVfaW50MzJfdCAqY2FjaGVfcHRyOwogCXVfaW50MTZfdCBrdl9sZW4gPSAwOwogCi0JaWYgKCFjc3IgfHwgIWt2KQorCWlmICghY3NyIHx8ICFrdiB8fCBjc3ItPm1heF9yb20gPCAxKQogCQlyZXR1cm4gQ1NSMTIxMl9FSU5WQUw7CiAKIAkvKiBGaXJzdCBmaW5kIHdoaWNoIGNhY2hlIHRoZSBkYXRhIHNob3VsZCBiZSBpbiAob3IgZ28gaW4gaWYgbm90IHJlYWQKQEAgLTE1NzIsNyArMTU4NSw3IEBACiAJc3RydWN0IGNzcjEyMTJfZGVudHJ5ICpkZW50cnk7CiAJaW50IHJldDsKIAotCWlmICghY3NyIHx8ICFjc3ItPm9wcy0+YnVzX3JlYWQpCisJaWYgKCFjc3IgfHwgIWNzci0+b3BzIHx8ICFjc3ItPm9wcy0+YnVzX3JlYWQpCiAJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKIAogCXJldCA9IGNzcjEyMTJfcGFyc2VfYnVzX2luZm9fYmxvY2soY3NyKTsKQEAgLTE1ODEsOSArMTU5NCwxMyBAQAogCiAJaWYgKCFjc3ItPm9wcy0+Z2V0X21heF9yb20pCiAJCWNzci0+bWF4X3JvbSA9IG1yX21hcFswXTsJLyogZGVmYXVsdCB2YWx1ZSAqLwotCWVsc2UKLQkJY3NyLT5tYXhfcm9tID0gbXJfbWFwW2Nzci0+b3BzLT5nZXRfbWF4X3JvbShjc3ItPmJ1c19pbmZvX2RhdGEsCi0JCQkJCQkJICAgIGNzci0+cHJpdmF0ZSldOworCWVsc2UgeworCQlpbnQgaSA9IGNzci0+b3BzLT5nZXRfbWF4X3JvbShjc3ItPmJ1c19pbmZvX2RhdGEsCisJCQkJCSAgICAgIGNzci0+cHJpdmF0ZSk7CisJCWlmIChpICYgfjB4MykKKwkJCXJldHVybiBDU1IxMjEyX0VJTlZBTDsKKwkJY3NyLT5tYXhfcm9tID0gbXJfbWFwW2ldOworCX0KIAogCWNzci0+Y2FjaGVfaGVhZC0+bGF5b3V0X2hlYWQgPSBjc3ItPnJvb3Rfa3Y7CiAJY3NyLT5jYWNoZV9oZWFkLT5sYXlvdXRfdGFpbCA9IGNzci0+cm9vdF9rdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMgYi9kcml2ZXJzL2llZWUxMzk0L2RtYS5jCmluZGV4IDc1ODgxOWQuLmI3OWRkYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvZG1hLmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9kbWEuYwpAQCAtMTU4LDcgKzE1OCw3IEBACiAKIGRtYV9hZGRyX3QgZG1hX3JlZ2lvbl9vZmZzZXRfdG9fYnVzKHN0cnVjdCBkbWFfcmVnaW9uICpkbWEsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewotCXVuc2lnbmVkIGxvbmcgcmVtOworCXVuc2lnbmVkIGxvbmcgcmVtID0gMDsKIAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAmZG1hLT5zZ2xpc3RbZG1hX3JlZ2lvbl9maW5kKGRtYSwgb2Zmc2V0LCAmcmVtKV07CiAJcmV0dXJuIHNnX2RtYV9hZGRyZXNzKHNnKSArIHJlbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvZXRoMTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKaW5kZXggNjU0ZGE3Ni4uY2Q1M2MxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9ldGgxMzk0LmMKQEAgLTg5LDcgKzg5LDcgQEAKICNkZWZpbmUgVFJBQ0UoKSBwcmludGsoS0VSTl9FUlIgIiVzOiVzWyVkXSAtLS0tIFRSQUNFXG4iLCBkcml2ZXJfbmFtZSwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQotCSIkUmV2OiAxMjQ3ICQgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+IjsKKwkiJFJldjogMTI2NCAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CiAKIHN0cnVjdCBmcmFnbWVudF9pbmZvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC03MDYsNyArNzA2LDcgQEAKIAkJcmV0dXJuOwogCiAJZGV2ID0gaGktPmRldjsKLQlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2ID0gKHN0cnVjdCBldGgxMzk0X3ByaXYgKiluZXRkZXZfcHJpdihkZXYpOwogCiAJLyogUmVzZXQgb3VyIHByaXZhdGUgaG9zdCBkYXRhLCBidXQgbm90IG91ciBtdHUgKi8KIAluZXRpZl9zdG9wX3F1ZXVlIChkZXYpOwpAQCAtMTc3MCw3ICsxNzcwLDcgQEAKIHN0YXRpYyB2b2lkIGV0aGVyMTM5NF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBkcml2ZXJfbmFtZSk7Ci0Jc3RyY3B5IChpbmZvLT52ZXJzaW9uLCAiJFJldjogMTI0NyAkIik7CisJc3RyY3B5IChpbmZvLT52ZXJzaW9uLCAiJFJldjogMTI2NCAkIik7CiAJLyogRklYTUUgWFhYIHByb3ZpZGUgc2FuZSBidXNpbmZvICovCiAJc3RyY3B5IChpbmZvLT5idXNfaW5mbywgImllZWUxMzk0Iik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L2llZWUxMzk0X2NvcmUuYyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCmluZGV4IDJkOWE5YjcuLmIyNDhkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5jCkBAIC01Miw3ICs1Miw3IEBACiAvKgogICogRGlzYWJsZSB0aGUgbm9kZW1nciBkZXRlY3Rpb24gYW5kIGNvbmZpZyByb20gcmVhZGluZyBmdW5jdGlvbmFsaXR5LgogICovCi1zdGF0aWMgaW50IGRpc2FibGVfbm9kZW1nciA9IDA7CitzdGF0aWMgaW50IGRpc2FibGVfbm9kZW1ncjsKIG1vZHVsZV9wYXJhbShkaXNhYmxlX25vZGVtZ3IsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfbm9kZW1nciwgIkRpc2FibGUgbm9kZW1nciBmdW5jdGlvbmFsaXR5LiIpOwogCkBAIC01MjAsNiArNTIwLDkgQEAKIAogCWlmICghcGFja2V0LT5ub193YWl0ZXIgfHwgcGFja2V0LT5leHBlY3RfcmVzcG9uc2UpIHsKIAkJYXRvbWljX2luYygmcGFja2V0LT5yZWZjbnQpOworCQkvKiBTZXQgdGhlIGluaXRpYWwgInNlbmR0aW1lIiB0byAxMCBzZWNvbmRzIGZyb20gbm93LCB0bworCQkgICBwcmV2ZW50IHByZW1hdHVyZSBleHBpcnkuICBJZiBhIHBhY2tldCB0YWtlcyBtb3JlIHRoYW4KKwkJICAgMTAgc2Vjb25kcyB0byBoaXQgdGhlIHdpcmUsIHdlIGhhdmUgYmlnZ2VyIHByb2JsZW1zIDopICovCiAJCXBhY2tldC0+c2VuZHRpbWUgPSBqaWZmaWVzICsgMTAgKiBIWjsKIAkJc2tiX3F1ZXVlX3RhaWwoJmhvc3QtPnBlbmRpbmdfcGFja2V0X3F1ZXVlLCBwYWNrZXQtPnNrYik7CiAJfQpAQCAtMTA0MSwxMCArMTA0NCw4IEBACiAKIAl3aGlsZSAoMSkgewogCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZraHBzYnBrdF9zaWcpKSB7Ci0JCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKLQkJCQlyZWZyaWdlcmF0b3IoMCk7CisJCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQkJCWNvbnRpbnVlOwotCQkJfQogCQkJcHJpbnRrKCJraHBzYnBrdDogcmVjZWl2ZWQgdW5leHBlY3RlZCBzaWduYWw/IVxuIiApOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEyMjUsOSArMTIyNiw3IEBACiBFWFBPUlRfU1lNQk9MKGhwc2Jfc2V0X3BhY2tldF9jb21wbGV0ZV90YXNrKTsKIEVYUE9SVF9TWU1CT0woaHBzYl9hbGxvY19wYWNrZXQpOwogRVhQT1JUX1NZTUJPTChocHNiX2ZyZWVfcGFja2V0KTsKLUVYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BoeV9jb25maWcpOwogRVhQT1JUX1NZTUJPTChocHNiX3NlbmRfcGFja2V0KTsKLUVYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BhY2tldF9hbmRfd2FpdCk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfcmVzZXRfYnVzKTsKIEVYUE9SVF9TWU1CT0woaHBzYl9idXNfcmVzZXQpOwogRVhQT1JUX1NZTUJPTChocHNiX3NlbGZpZF9yZWNlaXZlZCk7CkBAIC0xMjM1LDYgKzEyMzQsMTAgQEAKIEVYUE9SVF9TWU1CT0woaHBzYl9wYWNrZXRfc2VudCk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfcGFja2V0X3JlY2VpdmVkKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGhwc2JfZGlzYWJsZV9pcm0pOworI2lmZGVmIENPTkZJR19JRUVFMTM5NF9FWFBPUlRfRlVMTF9BUEkKK0VYUE9SVF9TWU1CT0woaHBzYl9zZW5kX3BoeV9jb25maWcpOworRVhQT1JUX1NZTUJPTChocHNiX3NlbmRfcGFja2V0X2FuZF93YWl0KTsKKyNlbmRpZgogCiAvKiogaWVlZTEzOTRfdHJhbnNhY3Rpb25zLmMgKiovCiBFWFBPUlRfU1lNQk9MKGhwc2JfZ2V0X3RsYWJlbCk7CkBAIC0xMjY0LDkgKzEyNjcsMTEgQEAKIEVYUE9SVF9TWU1CT0woaHBzYl9zZXRfaG9zdGluZm9fa2V5KTsKIEVYUE9SVF9TWU1CT0woaHBzYl9nZXRfaG9zdGluZm9fYnlrZXkpOwogRVhQT1JUX1NZTUJPTChocHNiX3NldF9ob3N0aW5mbyk7CitFWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9ob3N0X3Jlc2V0KTsKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCiBFWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9hZGRfaG9zdCk7CiBFWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9yZW1vdmVfaG9zdCk7Ci1FWFBPUlRfU1lNQk9MKGhpZ2hsZXZlbF9ob3N0X3Jlc2V0KTsKKyNlbmRpZgogCiAvKiogbm9kZW1nci5jICoqLwogRVhQT1JUX1NZTUJPTChocHNiX25vZGVfZmlsbF9wYWNrZXQpOwpAQCAtMTI3NCw3ICsxMjc5LDkgQEAKIEVYUE9SVF9TWU1CT0woaHBzYl9yZWdpc3Rlcl9wcm90b2NvbCk7CiBFWFBPUlRfU1lNQk9MKGhwc2JfdW5yZWdpc3Rlcl9wcm90b2NvbCk7CiBFWFBPUlRfU1lNQk9MKGllZWUxMzk0X2J1c190eXBlKTsKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCiBFWFBPUlRfU1lNQk9MKG5vZGVtZ3JfZm9yX2VhY2hfaG9zdCk7CisjZW5kaWYKIAogLyoqIGNzci5jICoqLwogRVhQT1JUX1NZTUJPTChocHNiX3VwZGF0ZV9jb25maWdfcm9tKTsKQEAgLTEzMTEsMTkgKzEzMTgsMjEgQEAKIEVYUE9SVF9TWU1CT0woaHBzYl9pc29fcmVjdl9mbHVzaCk7CiAKIC8qKiBjc3IxMjEyLmMgKiovCitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfbmV3X2RpcmVjdG9yeSk7CitFWFBPUlRfU1lNQk9MKGNzcjEyMTJfYXR0YWNoX2tleXZhbF90b19kaXJlY3RvcnkpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX2RldGFjaF9rZXl2YWxfZnJvbV9kaXJlY3RvcnkpOworRVhQT1JUX1NZTUJPTChjc3IxMjEyX3JlbGVhc2Vfa2V5dmFsKTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9yZWFkKTsKK0VYUE9SVF9TWU1CT0woY3NyMTIxMl9wYXJzZV9rZXl2YWwpOworRVhQT1JUX1NZTUJPTChfY3NyMTIxMl9yZWFkX2tleXZhbCk7CitFWFBPUlRfU1lNQk9MKF9jc3IxMjEyX2Rlc3Ryb3lfa2V5dmFsKTsKKyNpZmRlZiBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJCiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfY3JlYXRlX2Nzcik7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfaW5pdF9sb2NhbF9jc3IpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19pbW1lZGlhdGUpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX25ld19kaXJlY3RvcnkpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2Fzc29jaWF0ZV9rZXl2YWwpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX2F0dGFjaF9rZXl2YWxfdG9fZGlyZWN0b3J5KTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9uZXdfc3RyaW5nX2Rlc2NyaXB0b3JfbGVhZik7Ci1FWFBPUlRfU1lNQk9MKGNzcjEyMTJfZGV0YWNoX2tleXZhbF9mcm9tX2RpcmVjdG9yeSk7Ci1FWFBPUlRfU1lNQk9MKGNzcjEyMTJfcmVsZWFzZV9rZXl2YWwpOwogRVhQT1JUX1NZTUJPTChjc3IxMjEyX2Rlc3Ryb3lfY3NyKTsKLUVYUE9SVF9TWU1CT0woY3NyMTIxMl9yZWFkKTsKIEVYUE9SVF9TWU1CT0woY3NyMTIxMl9nZW5lcmF0ZV9jc3JfaW1hZ2UpOwotRVhQT1JUX1NZTUJPTChjc3IxMjEyX3BhcnNlX2tleXZhbCk7CiBFWFBPUlRfU1lNQk9MKGNzcjEyMTJfcGFyc2VfY3NyKTsKLUVYUE9SVF9TWU1CT0woX2NzcjEyMTJfcmVhZF9rZXl2YWwpOwotRVhQT1JUX1NZTUJPTChfY3NyMTIxMl9kZXN0cm95X2tleXZhbCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvaWVlZTEzOTRfY29yZS5oIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmgKaW5kZXggNzNiZDhlZi4uMGIzMTQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmgKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9pZWVlMTM5NF9jb3JlLmgKQEAgLTM4LDggKzM4LDggQEAKIAogICAgICAgICAvKiBUaGVzZSBhcmUgY29yZSBpbnRlcm5hbC4gKi8KICAgICAgICAgc2lnbmVkIGNoYXIgdGxhYmVsOwotICAgICAgICBjaGFyIGFja19jb2RlOwotICAgICAgICBjaGFyIHRjb2RlOworCXNpZ25lZCBjaGFyIGFja19jb2RlOworCXVuc2lnbmVkIGNoYXIgdGNvZGU7CiAKICAgICAgICAgdW5zaWduZWQgZXhwZWN0X3Jlc3BvbnNlOjE7CiAgICAgICAgIHVuc2lnbmVkIG5vX3dhaXRlcjoxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pc28uYyBiL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmMKaW5kZXggZjA1NzU5MS4uNjE1NTQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pc28uYworKysgYi9kcml2ZXJzL2llZWUxMzk0L2lzby5jCkBAIC02MiwxMCArNjIsMTAgQEAKIAlpZiAoKGRtYV9tb2RlIDwgSFBTQl9JU09fRE1BX0RFRkFVTFQpIHx8IChkbWFfbW9kZSA+IEhQU0JfSVNPX0RNQV9QQUNLRVRfUEVSX0JVRkZFUikpCiAJCWRtYV9tb2RlPUhQU0JfSVNPX0RNQV9ERUZBVUxUOwogCisJaWYgKChpcnFfaW50ZXJ2YWwgPCAwKSB8fCAoaXJxX2ludGVydmFsID4gYnVmX3BhY2tldHMgLyA0KSkKKyAJCWlycV9pbnRlcnZhbCA9IGJ1Zl9wYWNrZXRzIC8gNDsKIAlpZiAoaXJxX2ludGVydmFsID09IDApICAgICAvKiByZWFsbHkgaW50ZXJydXB0IGZvciBlYWNoIHBhY2tldCovCiAJCWlycV9pbnRlcnZhbCA9IDE7Ci0JZWxzZSBpZiAoKGlycV9pbnRlcnZhbCA8IDApIHx8IChpcnFfaW50ZXJ2YWwgPiBidWZfcGFja2V0cyAvIDQpKQotIAkJaXJxX2ludGVydmFsID0gYnVmX3BhY2tldHMgLyA0OwogCiAJaWYgKGNoYW5uZWwgPCAtMSB8fCBjaGFubmVsID49IDY0KQogCQlyZXR1cm4gTlVMTDsKQEAgLTEwNiw2ICsxMDYsNyBAQAogCX0KIAogCWF0b21pY19zZXQoJmlzby0+b3ZlcmZsb3dzLCAwKTsKKwlpc28tPmJ5dGVzX2Rpc2NhcmRlZCA9IDA7CiAJaXNvLT5mbGFncyA9IDA7CiAJaXNvLT5wcmVidWZmZXIgPSAwOwogCkBAIC0yNDEsMTIgKzI0MiwxMiBAQAogCWlzby0+eG1pdF9jeWNsZSA9IGN5Y2xlOwogCiAJaWYgKHByZWJ1ZmZlciA8IDApCi0JCXByZWJ1ZmZlciA9IGlzby0+YnVmX3BhY2tldHM7CisJCXByZWJ1ZmZlciA9IGlzby0+YnVmX3BhY2tldHMgLSAxOwogCWVsc2UgaWYgKHByZWJ1ZmZlciA9PSAwKQogCQlwcmVidWZmZXIgPSAxOwogCi0JaWYgKHByZWJ1ZmZlciA+IGlzby0+YnVmX3BhY2tldHMpCi0JCXByZWJ1ZmZlciA9IGlzby0+YnVmX3BhY2tldHM7CisJaWYgKHByZWJ1ZmZlciA+PSBpc28tPmJ1Zl9wYWNrZXRzKQorCQlwcmVidWZmZXIgPSBpc28tPmJ1Zl9wYWNrZXRzIC0gMTsKIAogCWlzby0+cHJlYnVmZmVyID0gcHJlYnVmZmVyOwogCkBAIC0zOTUsNyArMzk2LDcgQEAKIH0KIAogdm9pZCBocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoc3RydWN0IGhwc2JfaXNvICppc28sIHUzMiBvZmZzZXQsIHUxNiBsZW4sCi0JCQkgICAgICB1MTYgY3ljbGUsIHU4IGNoYW5uZWwsIHU4IHRhZywgdTggc3kpCisJCQkgICAgICB1MTYgdG90YWxfbGVuLCB1MTYgY3ljbGUsIHU4IGNoYW5uZWwsIHU4IHRhZywgdTggc3kpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXNvLT5sb2NrLCBmbGFncyk7CkBAIC00MDMsMTAgKzQwNCwxMyBAQAogCWlmIChpc28tPm5fcmVhZHlfcGFja2V0cyA9PSBpc28tPmJ1Zl9wYWNrZXRzKSB7CiAJCS8qIG92ZXJmbG93ISAqLwogCQlhdG9taWNfaW5jKCZpc28tPm92ZXJmbG93cyk7CisJCS8qIFJlY29yZCBzaXplIG9mIHRoaXMgZGlzY2FyZGVkIHBhY2tldCAqLworCQlpc28tPmJ5dGVzX2Rpc2NhcmRlZCArPSB0b3RhbF9sZW47CiAJfSBlbHNlIHsKIAkJc3RydWN0IGhwc2JfaXNvX3BhY2tldF9pbmZvICppbmZvID0gJmlzby0+aW5mb3NbaXNvLT5wa3RfZG1hXTsKIAkJaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OwogCQlpbmZvLT5sZW4gPSBsZW47CisJCWluZm8tPnRvdGFsX2xlbiA9IHRvdGFsX2xlbjsKIAkJaW5mby0+Y3ljbGUgPSBjeWNsZTsKIAkJaW5mby0+Y2hhbm5lbCA9IGNoYW5uZWw7CiAJCWluZm8tPnRhZyA9IHRhZzsKQEAgLTQzNyw2ICs0NDEsMTcgQEAKIAogCQlpc28tPmZpcnN0X3BhY2tldCA9IChpc28tPmZpcnN0X3BhY2tldCsxKSAlIGlzby0+YnVmX3BhY2tldHM7CiAJCWlzby0+bl9yZWFkeV9wYWNrZXRzLS07CisKKwkJLyogcmVsZWFzZSBtZW1vcnkgZnJvbSBwYWNrZXRzIGRpc2NhcmRlZCB3aGVuIHF1ZXVlIHdhcyBmdWxsICAqLworCQlpZiAoaXNvLT5uX3JlYWR5X3BhY2tldHMgPT0gMCkgeyAvKiBSZWxlYXNlIG9ubHkgYWZ0ZXIgYWxsIHByaW9yIHBhY2tldHMgaGFuZGxlZCAqLworCQkJaWYgKGlzby0+Ynl0ZXNfZGlzY2FyZGVkICE9IDApIHsKKwkJCQlzdHJ1Y3QgaHBzYl9pc29fcGFja2V0X2luZm8gaW5mOworCQkJCWluZi50b3RhbF9sZW4gPSBpc28tPmJ5dGVzX2Rpc2NhcmRlZDsKKwkJCQlpc28tPmhvc3QtPmRyaXZlci0+aXNvY3RsKGlzbywgUkVDVl9SRUxFQVNFLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nKSAmaW5mKTsKKwkJCQlpc28tPmJ5dGVzX2Rpc2NhcmRlZCA9IDA7CisJCQl9CisJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNvLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJ2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9pc28uaCBiL2RyaXZlcnMvaWVlZTEzOTQvaXNvLmgKaW5kZXggZmI2NTRkOS4uM2VmYzYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9pc28uaAorKysgYi9kcml2ZXJzL2llZWUxMzk0L2lzby5oCkBAIC00Nyw2ICs0NywxNCBAQAogCS8qIDItYml0ICd0YWcnIGFuZCA0LWJpdCAnc3knIGZpZWxkcyBvZiB0aGUgaXNvY2hyb25vdXMgaGVhZGVyICovCiAJX191OCB0YWc7CiAJX191OCBzeTsKKworCS8qCisJICogbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwYWNrZXQgaW5jbHVkaW5nIGhlYWRlci90cmFpbGVyLgorCSAqIE1VU1QgYmUgYXQgc3RydWN0dXJlIGVuZCwgc2luY2UgdGhlIGZpcnN0IHBhcnQgb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgYWxzbyAKKwkgKiBkZWZpbmVkIGluIHJhdzEzOTQuaCAoaS5lLiBzdHJ1Y3QgcmF3MTM5NF9pc29fcGFja2V0X2luZm8pLCBpcyBjb3BpZWQgdG8gCisJICogdXNlcnNwYWNlIGFuZCBpcyBhY2Nlc3NlZCB0aGVyZSB0aHJvdWdoIGxpYnJhdzEzOTQuIAorCSAqLworCV9fdTE2IHRvdGFsX2xlbjsKIH07CiAKIGVudW0gaHBzYl9pc29fdHlwZSB7IEhQU0JfSVNPX1JFQ1YgPSAwLCBIUFNCX0lTT19YTUlUID0gMSB9OwpAQCAtMTExLDYgKzExOSw5IEBACiAJLyogaG93IG1hbnkgdGltZXMgdGhlIGJ1ZmZlciBoYXMgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCAqLwogCWF0b21pY190IG92ZXJmbG93czsKIAorCS8qIEN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIGxvc3QgaW4gZGlzY2FyZGVkIHBhY2tldHMgKi8KKwlpbnQgYnl0ZXNfZGlzY2FyZGVkOworCiAJLyogcHJpdmF0ZSBmbGFncyB0byB0cmFjayBpbml0aWFsaXphdGlvbiBwcm9ncmVzcyAqLwogI2RlZmluZSBIUFNCX0lTT19EUklWRVJfSU5JVCAgICAgKDE8PDApCiAjZGVmaW5lIEhQU0JfSVNPX0RSSVZFUl9TVEFSVEVEICAoMTw8MSkKQEAgLTE5Myw3ICsyMDQsNyBAQAogCiAvKiBjYWxsIGFmdGVyIGEgcGFja2V0IGhhcyBiZWVuIHJlY2VpdmVkIChpbnRlcnJ1cHQgY29udGV4dCBPSykgKi8KIHZvaWQgaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKHN0cnVjdCBocHNiX2lzbyAqaXNvLCB1MzIgb2Zmc2V0LCB1MTYgbGVuLAotCQkJICAgICAgdTE2IGN5Y2xlLCB1OCBjaGFubmVsLCB1OCB0YWcsIHU4IHN5KTsKKwkJCSAgICAgIHUxNiB0b3RhbF9sZW4sIHUxNiBjeWNsZSwgdTggY2hhbm5lbCwgdTggdGFnLCB1OCBzeSk7CiAKIC8qIGNhbGwgdG8gd2FrZSB3YWl0aW5nIHByb2Nlc3NlcyBhZnRlciBidWZmZXIgc3BhY2UgaGFzIG9wZW5lZCB1cC4gKi8KIHZvaWQgaHBzYl9pc29fd2FrZShzdHJ1Y3QgaHBzYl9pc28gKmlzbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCmluZGV4IDMyYWJiNmQuLmJlYmNjNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCisrKyBiL2RyaXZlcnMvaWVlZTEzOTQvbm9kZW1nci5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSAiY3NyLmgiCiAjaW5jbHVkZSAibm9kZW1nci5oIgogCi1zdGF0aWMgaW50IGlnbm9yZV9kcml2ZXJzID0gMDsKK3N0YXRpYyBpbnQgaWdub3JlX2RyaXZlcnM7CiBtb2R1bGVfcGFyYW0oaWdub3JlX2RyaXZlcnMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9kcml2ZXJzLCAiRGlzYWJsZSBhdXRvbWF0aWMgcHJvYmluZyBmb3IgZHJpdmVycy4iKTsKIApAQCAtMTUxMCw3ICsxNTEwLDcgQEAKIAogCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZoaS0+cmVzZXRfc2VtKSB8fAogCQkgICAgZG93bl9pbnRlcnJ1cHRpYmxlKCZub2RlbWdyX3NlcmlhbGl6ZSkpIHsKLQkJCWlmICh0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSkpCisJCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQogCQkJCWNvbnRpbnVlOwogCQkJcHJpbnRrKCJOb2RlTWdyOiByZWNlaXZlZCB1bmV4cGVjdGVkIHNpZ25hbD8hXG4iICk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYyBiL2RyaXZlcnMvaWVlZTEzOTQvb2hjaTEzOTQuYwppbmRleCAzNmUyNWFjLi5hNDg1ZjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L29oY2kxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9vaGNpMTM5NC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIHByaW50ayhsZXZlbCAiJXM6IGZ3LWhvc3QlZDogIiBmbXQgIlxuIiAsIE9IQ0kxMzk0X0RSSVZFUl9OQU1FLCBvaGNpLT5ob3N0LT5pZCAsICMjIGFyZ3MpCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KLQkiJFJldjogMTI1MCAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CisJIiRSZXY6IDEyOTkgJCBCZW4gQ29sbGlucyA8YmNvbGxpbnNAZGViaWFuLm9yZz4iOwogCiAvKiBNb2R1bGUgUGFyYW1ldGVycyAqLwogc3RhdGljIGludCBwaHlzX2RtYSA9IDE7CkBAIC00ODMsNyArNDgzLDkgQEAKIAkvKiBQdXQgc29tZSBkZWZhdWx0cyB0byB0aGVzZSB1bmRlZmluZWQgYnVzIG9wdGlvbnMgKi8KIAlidWYgPSByZWdfcmVhZChvaGNpLCBPSENJMTM5NF9CdXNPcHRpb25zKTsKIAlidWYgfD0gIDB4NjAwMDAwMDA7IC8qIEVuYWJsZSBDTUMgYW5kIElTQyAqLwotCWlmICghaHBzYl9kaXNhYmxlX2lybSkKKwlpZiAoaHBzYl9kaXNhYmxlX2lybSkKKwkJYnVmICY9IH4weDgwMDAwMDAwOworCWVsc2UKIAkJYnVmIHw9ICAweDgwMDAwMDAwOyAvKiBFbmFibGUgSVJNQyAqLwogCWJ1ZiAmPSB+MHgwMGZmMDAwMDsgLyogWFhYOiBTZXQgY3ljX2Nsa19hY2MgdG8gemVybyBmb3Igbm93ICovCiAJYnVmICY9IH4weDE4MDAwMDAwOyAvKiBEaXNhYmxlIFBNQyBhbmQgQk1DICovCkBAIC01MDMsOCArNTA1LDEyIEBACiAJcmVnX3dyaXRlKG9oY2ksIE9IQ0kxMzk0X0xpbmtDb250cm9sU2V0LAogCQkgIE9IQ0kxMzk0X0xpbmtDb250cm9sX0N5Y2xlVGltZXJFbmFibGUgfAogCQkgIE9IQ0kxMzk0X0xpbmtDb250cm9sX0N5Y2xlTWFzdGVyKTsKLQlzZXRfcGh5X3JlZ19tYXNrKG9oY2ksIDQsIFBIWV8wNF9MQ1RSTCB8Ci0JCQkgKGhwc2JfZGlzYWJsZV9pcm0gPyAwIDogUEhZXzA0X0NPTlRFTkRFUikpOworCWkgPSBnZXRfcGh5X3JlZyhvaGNpLCA0KSB8IFBIWV8wNF9MQ1RSTDsKKwlpZiAoaHBzYl9kaXNhYmxlX2lybSkKKwkJaSAmPSB+UEhZXzA0X0NPTlRFTkRFUjsKKwllbHNlCisJCWkgfD0gUEhZXzA0X0NPTlRFTkRFUjsKKwlzZXRfcGh5X3JlZyhvaGNpLCA0LCBpKTsKIAogCS8qIFNldCB1cCBzZWxmLWlkIGRtYSBidWZmZXIgKi8KIAlyZWdfd3JpdGUob2hjaSwgT0hDSTEzOTRfU2VsZklEQnVmZmVyLCBvaGNpLT5zZWxmaWRfYnVmX2J1cyk7CkBAIC0xNTY2LDYgKzE1NzIsMTAgQEAKIAogCXN0cnVjdCBkbWFfY21kICpuZXh0ID0gJnJlY3YtPmJsb2NrW25leHRfaV07CiAJc3RydWN0IGRtYV9jbWQgKnByZXYgPSAmcmVjdi0+YmxvY2tbcHJldl9pXTsKKwkKKwkvKiBpZ25vcmUgb3V0LW9mLXJhbmdlIHJlcXVlc3RzICovCisJaWYgKChibG9jayA8IDApIHx8IChibG9jayA+IHJlY3YtPm5ibG9ja3MpKQorCQlyZXR1cm47CiAKIAkvKiAnbmV4dCcgYmVjb21lcyB0aGUgbmV3IGVuZCBvZiB0aGUgRE1BIGNoYWluLAogCSAgIHNvIGRpc2FibGUgYnJhbmNoIGFuZCBlbmFibGUgaW50ZXJydXB0ICovCkBAIC0xNTkzLDE5ICsxNjAzLDggQEAKIHN0YXRpYyB2b2lkIG9oY2lfaXNvX3JlY3ZfYnVmZmVyZmlsbF9yZWxlYXNlKHN0cnVjdCBvaGNpX2lzb19yZWN2ICpyZWN2LAogCQkJCQkgICAgIHN0cnVjdCBocHNiX2lzb19wYWNrZXRfaW5mbyAqaW5mbykKIHsKLQlpbnQgbGVuOwotCiAJLyogcmVsZWFzZSB0aGUgbWVtb3J5IHdoZXJlIHRoZSBwYWNrZXQgd2FzICovCi0JbGVuID0gaW5mby0+bGVuOwotCi0JLyogYWRkIHRoZSB3YXN0ZWQgc3BhY2UgZm9yIHBhZGRpbmcgdG8gNCBieXRlcyAqLwotCWlmIChsZW4gJSA0KQotCQlsZW4gKz0gNCAtIChsZW4gJSA0KTsKLQotCS8qIGFkZCA4IGJ5dGVzIGZvciB0aGUgT0hDSSBETUEgZGF0YSBmb3JtYXQgb3ZlcmhlYWQgKi8KLQlsZW4gKz0gODsKLQotCXJlY3YtPnJlbGVhc2VkX2J5dGVzICs9IGxlbjsKKwlyZWN2LT5yZWxlYXNlZF9ieXRlcyArPSBpbmZvLT50b3RhbF9sZW47CiAKIAkvKiBoYXZlIHdlIHJlbGVhc2VkIGVub3VnaCBtZW1vcnkgZm9yIG9uZSBibG9jaz8gKi8KIAl3aGlsZSAocmVjdi0+cmVsZWFzZWRfYnl0ZXMgPiByZWN2LT5idWZfc3RyaWRlKSB7CkBAIC0xNjM3LDcgKzE2MzYsNyBAQAogCQkvKiBub3RlOiBwYWNrZXQgbGF5b3V0IGlzIGFzIHNob3duIGluIHNlY3Rpb24gMTAuNi4xLjEgb2YgdGhlIE9IQ0kgc3BlYyAqLwogCiAJCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0JCXVuc2lnbmVkIHNob3J0IGxlbiwgY3ljbGU7CisJCXVuc2lnbmVkIHNob3J0IGxlbiwgY3ljbGUsIHRvdGFsX2xlbjsKIAkJdW5zaWduZWQgY2hhciBjaGFubmVsLCB0YWcsIHN5OwogCiAJCXVuc2lnbmVkIGNoYXIgKnAgPSBpc28tPmRhdGFfYnVmLmt2aXJ0OwpAQCAtMTY4OCw5ICsxNjg3LDExIEBACiAJCS8qIGFkdmFuY2UgdG8geGZlclN0YXR1cy90aW1lU3RhbXAgKi8KIAkJcmVjdi0+ZG1hX29mZnNldCArPSBsZW47CiAKKwkJdG90YWxfbGVuID0gbGVuICsgODsgLyogOCBieXRlcyBoZWFkZXIrdHJhaWxlciBpbiBPSENJIHBhY2tldCAqLwogCQkvKiBwYXlsb2FkIGlzIHBhZGRlZCB0byA0IGJ5dGVzICovCiAJCWlmIChsZW4gJSA0KSB7CiAJCQlyZWN2LT5kbWFfb2Zmc2V0ICs9IDQgLSAobGVuJTQpOworCQkJdG90YWxfbGVuICs9IDQgLSAobGVuJTQpOwogCQl9CiAKIAkJLyogY2hlY2sgZm9yIHdyYXAtYXJvdW5kICovCkBAIC0xNzI0LDcgKzE3MjUsNyBAQAogCQkJcmVjdi0+ZG1hX29mZnNldCAtPSByZWN2LT5idWZfc3RyaWRlKnJlY3YtPm5ibG9ja3M7CiAJCX0KIAotCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIGxlbiwgY3ljbGUsIGNoYW5uZWwsIHRhZywgc3kpOworCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIGxlbiwgdG90YWxfbGVuLCBjeWNsZSwgY2hhbm5lbCwgdGFnLCBzeSk7CiAJfQogCiAJaWYgKHdha2UpCkBAIC0xODUwLDcgKzE4NTEsOCBAQAogCQkJdGFnID0gaGRyWzVdID4+IDY7CiAJCQlzeSA9IGhkcls0XSAmIDB4RjsKIAotCQkJaHBzYl9pc29fcGFja2V0X3JlY2VpdmVkKGlzbywgb2Zmc2V0LCBwYWNrZXRfbGVuLCBjeWNsZSwgY2hhbm5lbCwgdGFnLCBzeSk7CisJCQlocHNiX2lzb19wYWNrZXRfcmVjZWl2ZWQoaXNvLCBvZmZzZXQsIHBhY2tldF9sZW4sCisJCQkJCXJlY3YtPmJ1Zl9zdHJpZGUsIGN5Y2xlLCBjaGFubmVsLCB0YWcsIHN5KTsKIAkJfQogCiAJCS8qIHJlc2V0IHRoZSBETUEgZGVzY3JpcHRvciAqLwpAQCAtMzUzOCw4ICszNTQwLDggQEAKIAogc3RhdGljIGludCBvaGNpMTM5NF9wY2lfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotCXsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpZiAoX21hY2hpbmUgPT0gX01BQ0hfUG1hYykgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CiAKIAkJLyogUmUtZW5hYmxlIDEzOTQgKi8KQEAgLTM1NDcsNyArMzU0OSw3IEBACiAJCWlmIChvZl9ub2RlKQogCQkJcG1hY19jYWxsX2ZlYXR1cmUgKFBNQUNfRlRSXzEzOTRfRU5BQkxFLCBvZl9ub2RlLCAwLCAxKTsKIAl9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAogCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCkBAIC0zNTU3LDggKzM1NTksOCBAQAogCiBzdGF0aWMgaW50IG9oY2kxMzk0X3BjaV9zdXNwZW5kIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0JeworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKIAogCQkvKiBEaXNhYmxlIDEzOTQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcGNpbHlueC5jIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKaW5kZXggYmRiM2E4NS4uMzYwNzRlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKQEAgLTc2LDcgKzc2LDcgQEAKIAogCiAvKiBNb2R1bGUgUGFyYW1ldGVycyAqLwotc3RhdGljIGludCBza2lwX2VlcHJvbSA9IDA7CitzdGF0aWMgaW50IHNraXBfZWVwcm9tOwogbW9kdWxlX3BhcmFtKHNraXBfZWVwcm9tLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhza2lwX2VlcHJvbSwgIlVzZSBnZW5lcmljIGJ1cyBpbmZvIGJsb2NrIGluc3RlYWQgb2Ygc2VyaWFsIGVlcHJvbSAoZGVmYXVsdCA9IDApLiIpOwogCkBAIC0xNDIyLDcgKzE0MjIsNyBAQAogCQlpID0gZ2V0X3BoeV9yZWcobHlueCwgNCk7CiAJCWkgfD0gUEhZXzA0X0xDVFJMOwogCQlpZiAoaHBzYl9kaXNhYmxlX2lybSkKLQkJCWkgJj0gIVBIWV8wNF9DT05URU5ERVI7CisJCQlpICY9IH5QSFlfMDRfQ09OVEVOREVSOwogCQllbHNlCiAJCQlpIHw9IFBIWV8wNF9DT05URU5ERVI7CiAJCWlmIChpICE9IC0xKSBzZXRfcGh5X3JlZyhseW54LCA0LCBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWVlZTEzOTQvcmF3MTM5NC5jIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKaW5kZXggNzQxOWFmNC4uYjRmYTE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9yYXcxMzk0LmMKQEAgLTk4LDcgKzk4LDcgQEAKIAogc3RhdGljIHZvaWQgcXVldWVfY29tcGxldGVfY2Ioc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxKTsKIAotc3RhdGljIHN0cnVjdCBwZW5kaW5nX3JlcXVlc3QgKl9fYWxsb2NfcGVuZGluZ19yZXF1ZXN0KGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3QgcGVuZGluZ19yZXF1ZXN0ICpfX2FsbG9jX3BlbmRpbmdfcmVxdWVzdCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MpCiB7CiAJc3RydWN0IHBlbmRpbmdfcmVxdWVzdCAqcmVxOwogCkBAIC0yNTA2LDkgKzI1MDYsMTIgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnVwYWNrZXRzLCB1YWRkciwgc2l6ZW9mKHVwYWNrZXRzKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKHVwYWNrZXRzLm5fcGFja2V0cyA+IGhwc2JfaXNvX25fcmVhZHkoZmktPmlzb19oYW5kbGUpKQorCWlmICh1cGFja2V0cy5uX3BhY2tldHMgPj0gZmktPmlzb19oYW5kbGUtPmJ1Zl9wYWNrZXRzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh1cGFja2V0cy5uX3BhY2tldHMgPj0gaHBzYl9pc29fbl9yZWFkeShmaS0+aXNvX2hhbmRsZSkpCisJCXJldHVybiAtRUFHQUlOOworCiAJLyogZW5zdXJlIHVzZXItc3VwcGxpZWQgYnVmZmVyIGlzIGFjY2Vzc2libGUgYW5kIGJpZyBlbm91Z2ggKi8KIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdXBhY2tldHMuaW5mb3MsCiAJCQl1cGFja2V0cy5uX3BhY2tldHMgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9zYnAyLmMgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwppbmRleCAzMjM2OGYzLi5mZTNlMTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L3NicDIuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L3NicDIuYwpAQCAtODEsNyArODEsNyBAQAogI2luY2x1ZGUgInNicDIuaCIKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9fZGV2aW5pdGRhdGEgPQotCSIkUmV2OiAxMjE5ICQgQmVuIENvbGxpbnMgPGJjb2xsaW5zQGRlYmlhbi5vcmc+IjsKKwkiJFJldjogMTMwNiAkIEJlbiBDb2xsaW5zIDxiY29sbGluc0BkZWJpYW4ub3JnPiI7CiAKIC8qCiAgKiBNb2R1bGUgbG9hZCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKQEAgLTEwNCw3ICsxMDQsNyBAQAogICogZG93biB0byB1cyBhdCBhIHRpbWUgKGRlYnVnZ2luZykuIFRoaXMgbWlnaHQgYmUgbmVjZXNzYXJ5IGZvciB2ZXJ5CiAgKiBiYWRseSBiZWhhdmVkIHNicDIgZGV2aWNlcy4KICAqLwotc3RhdGljIGludCBzZXJpYWxpemVfaW8gPSAwOworc3RhdGljIGludCBzZXJpYWxpemVfaW87CiBtb2R1bGVfcGFyYW0oc2VyaWFsaXplX2lvLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzZXJpYWxpemVfaW8sICJTZXJpYWxpemUgYWxsIEkvTyBjb21pbmcgZG93biBmcm9tIHRoZSBzY3NpIGRyaXZlcnMgKGRlZmF1bHQgPSAwKSIpOwogCkBAIC0xNDUsNyArMTQ1LDcgQEAKICAqIHBsZWFzZSBzdWJtaXQgdGhlIGxvZ2dlZCBzYnAyX2Zpcm13YXJlX3JldmlzaW9uIHZhbHVlIG9mIHRoaXMgZGV2aWNlIHRvCiAgKiB0aGUgbGludXgxMzk0LWRldmVsIG1haWxpbmcgbGlzdC4KICAqLwotc3RhdGljIGludCBmb3JjZV9pbnF1aXJ5X2hhY2sgPSAwOworc3RhdGljIGludCBmb3JjZV9pbnF1aXJ5X2hhY2s7CiBtb2R1bGVfcGFyYW0oZm9yY2VfaW5xdWlyeV9oYWNrLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pbnF1aXJ5X2hhY2ssICJGb3JjZSBTQ1NJIGlucXVpcnkgaGFjayAoZGVmYXVsdCA9IDApIik7CiAKQEAgLTIxMTIsNiArMjExMiwxMDIgQEAKICAqLwogc3RhdGljIHZvaWQgc2JwMl9jaGVja19zYnAyX2NvbW1hbmQoc3RydWN0IHNjc2lfaWRfaW5zdGFuY2VfZGF0YSAqc2NzaV9pZCwgdW5jaGFyICpjbWQpCiB7CisJdW5jaGFyIG5ld19jbWRbMTZdOworCXU4IGRldmljZV90eXBlID0gU0JQMl9ERVZJQ0VfVFlQRSAoc2NzaV9pZC0+c2JwMl9kZXZpY2VfdHlwZV9hbmRfbHVuKTsKKworCVNCUDJfREVCVUcoInNicDJfY2hlY2tfc2JwMl9jb21tYW5kIik7CisKKwlzd2l0Y2ggKCpjbWQpIHsKKworCQljYXNlIFJFQURfNjoKKworCQkJaWYgKHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKGRldmljZV90eXBlKSkgeworCisJCQkJU0JQMl9ERUJVRygiQ29udmVydCBSRUFEXzYgdG8gUkVBRF8xMCIpOworCisJCQkJLyoKKwkJCQkgKiBOZWVkIHRvIHR1cm4gcmVhZF82IGludG8gcmVhZF8xMAorCQkJCSAqLworCQkJCW5ld19jbWRbMF0gPSAweDI4OworCQkJCW5ld19jbWRbMV0gPSAoY21kWzFdICYgMHhlMCk7CisJCQkJbmV3X2NtZFsyXSA9IDB4MDsKKwkJCQluZXdfY21kWzNdID0gKGNtZFsxXSAmIDB4MWYpOworCQkJCW5ld19jbWRbNF0gPSBjbWRbMl07CisJCQkJbmV3X2NtZFs1XSA9IGNtZFszXTsKKwkJCQluZXdfY21kWzZdID0gMHgwOworCQkJCW5ld19jbWRbN10gPSAweDA7CisJCQkJbmV3X2NtZFs4XSA9IGNtZFs0XTsKKwkJCQluZXdfY21kWzldID0gY21kWzVdOworCisJCQkJbWVtY3B5KGNtZCwgbmV3X2NtZCwgMTApOworCisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgV1JJVEVfNjoKKworCQkJaWYgKHNicDJfY29tbWFuZF9jb252ZXJzaW9uX2RldmljZV90eXBlKGRldmljZV90eXBlKSkgeworCisJCQkJU0JQMl9ERUJVRygiQ29udmVydCBXUklURV82IHRvIFdSSVRFXzEwIik7CisKKwkJCQkvKgorCQkJCSAqIE5lZWQgdG8gdHVybiB3cml0ZV82IGludG8gd3JpdGVfMTAKKwkJCQkgKi8KKwkJCQluZXdfY21kWzBdID0gMHgyYTsKKwkJCQluZXdfY21kWzFdID0gKGNtZFsxXSAmIDB4ZTApOworCQkJCW5ld19jbWRbMl0gPSAweDA7CisJCQkJbmV3X2NtZFszXSA9IChjbWRbMV0gJiAweDFmKTsKKwkJCQluZXdfY21kWzRdID0gY21kWzJdOworCQkJCW5ld19jbWRbNV0gPSBjbWRbM107CisJCQkJbmV3X2NtZFs2XSA9IDB4MDsKKwkJCQluZXdfY21kWzddID0gMHgwOworCQkJCW5ld19jbWRbOF0gPSBjbWRbNF07CisJCQkJbmV3X2NtZFs5XSA9IGNtZFs1XTsKKworCQkJCW1lbWNweShjbWQsIG5ld19jbWQsIDEwKTsKKworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VOU0U6CisKKwkJCWlmIChzYnAyX2NvbW1hbmRfY29udmVyc2lvbl9kZXZpY2VfdHlwZShkZXZpY2VfdHlwZSkpIHsKKworCQkJCVNCUDJfREVCVUcoIkNvbnZlcnQgTU9ERV9TRU5TRV82IHRvIE1PREVfU0VOU0VfMTAiKTsKKworCQkJCS8qCisJCQkJICogTmVlZCB0byB0dXJuIG1vZGVfc2Vuc2VfNiBpbnRvIG1vZGVfc2Vuc2VfMTAKKwkJCQkgKi8KKwkJCQluZXdfY21kWzBdID0gMHg1YTsKKwkJCQluZXdfY21kWzFdID0gY21kWzFdOworCQkJCW5ld19jbWRbMl0gPSBjbWRbMl07CisJCQkJbmV3X2NtZFszXSA9IDB4MDsKKwkJCQluZXdfY21kWzRdID0gMHgwOworCQkJCW5ld19jbWRbNV0gPSAweDA7CisJCQkJbmV3X2NtZFs2XSA9IDB4MDsKKwkJCQluZXdfY21kWzddID0gMHgwOworCQkJCW5ld19jbWRbOF0gPSBjbWRbNF07CisJCQkJbmV3X2NtZFs5XSA9IGNtZFs1XTsKKworCQkJCW1lbWNweShjbWQsIG5ld19jbWQsIDEwKTsKKworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIE1PREVfU0VMRUNUOgorCisJCQkvKgorCQkJICogVE9ETy4gUHJvYmFibHkgbmVlZCB0byBjaGFuZ2UgbW9kZSBzZWxlY3QgdG8gMTAgYnl0ZSB2ZXJzaW9uCisJCQkgKi8KKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOwogfQogCiAvKgpAQCAtMjE1Miw2ICsyMjQ4LDcgQEAKIAkJCQkgICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQogewogCXU4ICpzY3NpX2J1ZiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZlcjsKKwl1OCBkZXZpY2VfdHlwZSA9IFNCUDJfREVWSUNFX1RZUEUgKHNjc2lfaWQtPnNicDJfZGV2aWNlX3R5cGVfYW5kX2x1bik7CiAKIAlTQlAyX0RFQlVHKCJzYnAyX2NoZWNrX3NicDJfcmVzcG9uc2UiKTsKIApAQCAtMjE3Niw2ICsyMjczLDE0IEBACiAJCQl9CiAKIAkJCS8qCisJCQkgKiBDaGVjayBmb3IgU2ltcGxlIERpcmVjdCBBY2Nlc3MgRGV2aWNlIGFuZCBjaGFuZ2UgaXQgdG8gVFlQRV9ESVNLCisJCQkgKi8KKwkJCWlmICgoc2NzaV9idWZbMF0gJiAweDFmKSA9PSBUWVBFX1JCQykgeworCQkJCVNCUDJfREVCVUcoIkNoYW5naW5nIFRZUEVfUkJDIHRvIFRZUEVfRElTSyIpOworCQkJCXNjc2lfYnVmWzBdICY9IDB4ZTA7CisJCQl9CisKKwkJCS8qCiAJCQkgKiBGaXggYW5zaSByZXZpc2lvbiBhbmQgcmVzcG9uc2UgZGF0YSBmb3JtYXQKIAkJCSAqLwogCQkJc2NzaV9idWZbMl0gfD0gMjsKQEAgLTIxODMsNiArMjI4OCwyNyBAQAogCiAJCQlicmVhazsKIAorCQljYXNlIE1PREVfU0VOU0U6CisKKwkJCWlmIChzYnAyX2NvbW1hbmRfY29udmVyc2lvbl9kZXZpY2VfdHlwZShkZXZpY2VfdHlwZSkpIHsKKworCQkJCVNCUDJfREVCVUcoIk1vZGlmeSBtb2RlIHNlbnNlIHJlc3BvbnNlICgxMCBieXRlIHZlcnNpb24pIik7CisKKwkJCQlzY3NpX2J1ZlswXSA9IHNjc2lfYnVmWzFdOwkvKiBNb2RlIGRhdGEgbGVuZ3RoICovCisJCQkJc2NzaV9idWZbMV0gPSBzY3NpX2J1ZlsyXTsJLyogTWVkaXVtIHR5cGUgKi8KKwkJCQlzY3NpX2J1ZlsyXSA9IHNjc2lfYnVmWzNdOwkvKiBEZXZpY2Ugc3BlY2lmaWMgcGFyYW1ldGVyICovCisJCQkJc2NzaV9idWZbM10gPSBzY3NpX2J1Zls3XTsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGggKi8KKwkJCQltZW1jcHkoc2NzaV9idWYgKyA0LCBzY3NpX2J1ZiArIDgsIHNjc2lfYnVmWzBdKTsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBNT0RFX1NFTEVDVDoKKworCQkJLyoKKwkJCSAqIFRPRE8uIFByb2JhYmx5IG5lZWQgdG8gY2hhbmdlIG1vZGUgc2VsZWN0IHRvIDEwIGJ5dGUgdmVyc2lvbgorCQkJICovCisKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCX0KQEAgLTI1NTksOCArMjY4NSw3IEBACiBzdGF0aWMgaW50IHNicDJzY3NpX3NsYXZlX2NvbmZpZ3VyZSAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHNkZXYtPnJlcXVlc3RfcXVldWUsICg1MTIgLSAxKSk7Ci0Jc2Rldi0+dXNlXzEwX2Zvcl9ydyA9IDE7Ci0Jc2Rldi0+dXNlXzEwX2Zvcl9tcyA9IDE7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL0tjb25maWcgYi9kcml2ZXJzL2luZmluaWJhbmQvS2NvbmZpZwppbmRleCAzY2MzZmYwLi43OWM4ZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvS2NvbmZpZworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvS2NvbmZpZwpAQCAtNyw2ICs3LDE2IEBACiAJICBhbnkgcHJvdG9jb2xzIHlvdSB3aXNoIHRvIHVzZSBhcyB3ZWxsIGFzIGRyaXZlcnMgZm9yIHlvdXIKIAkgIEluZmluaUJhbmQgaGFyZHdhcmUuCiAKK2NvbmZpZyBJTkZJTklCQU5EX1VTRVJfVkVSQlMKKwl0cmlzdGF0ZSAiSW5maW5pQmFuZCB1c2Vyc3BhY2UgdmVyYnMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElORklOSUJBTkQKKwktLS1oZWxwLS0tCisJICBVc2Vyc3BhY2UgSW5maW5pQmFuZCB2ZXJicyBzdXBwb3J0LiAgVGhpcyBpcyB0aGUga2VybmVsIHNpZGUKKwkgIG9mIHVzZXJzcGFjZSB2ZXJicywgd2hpY2ggYWxsb3dzIHVzZXJzcGFjZSBwcm9jZXNzZXMgdG8KKwkgIGRpcmVjdGx5IGFjY2VzcyBJbmZpbmlCYW5kIGhhcmR3YXJlIGZvciBmYXN0LXBhdGgKKwkgIG9wZXJhdGlvbnMuICBZb3Ugd2lsbCBhbHNvIG5lZWQgbGliaWJ2ZXJicyBhbmQgYSBoYXJkd2FyZQorCSAgZHJpdmVyIGxpYnJhcnkgZnJvbSA8aHR0cDovL3d3dy5vcGVuaWIub3JnPi4KKwogc291cmNlICJkcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9NYWtlZmlsZSBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL01ha2VmaWxlCmluZGV4IGQyZGJmYjUuLmUxYTdjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL01ha2VmaWxlCkBAIC0xLDYgKzEsNyBAQAogRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUKIAotb2JqLSQoQ09ORklHX0lORklOSUJBTkQpICs9CWliX2NvcmUubyBpYl9tYWQubyBpYl9zYS5vIGliX3VtYWQubworb2JqLSQoQ09ORklHX0lORklOSUJBTkQpICs9CQlpYl9jb3JlLm8gaWJfbWFkLm8gaWJfc2EubyBpYl91bWFkLm8KK29iai0kKENPTkZJR19JTkZJTklCQU5EX1VTRVJfVkVSQlMpICs9CWliX3V2ZXJicy5vCiAKIGliX2NvcmUteSA6PQkJCXBhY2tlci5vIHVkX2hlYWRlci5vIHZlcmJzLm8gc3lzZnMubyBcCiAJCQkJZGV2aWNlLm8gZm1yX3Bvb2wubyBjYWNoZS5vCkBAIC0xMCwzICsxMSw1IEBACiBpYl9zYS15IDo9CQkJc2FfcXVlcnkubwogCiBpYl91bWFkLXkgOj0JCQl1c2VyX21hZC5vCisKK2liX3V2ZXJicy15IDo9CQkJdXZlcmJzX21haW4ubyB1dmVyYnNfY21kLm8gdXZlcmJzX21lbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9wYWNrZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3BhY2tlci5jCmluZGV4IDVmMTVmZWYuLmViNWZmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3BhY2tlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3BhY2tlci5jCkBAIC05Niw3ICs5Niw3IEBACiAJCQllbHNlCiAJCQkJdmFsID0gMDsKIAotCQkJbWFzayA9IGNwdV90b19iZTY0KCgoMXVsbCA8PCBkZXNjW2ldLnNpemVfYml0cykgLSAxKSA8PCBzaGlmdCk7CisJCQltYXNrID0gY3B1X3RvX2JlNjQoKH4wdWxsID4+ICg2NCAtIGRlc2NbaV0uc2l6ZV9iaXRzKSkgPDwgc2hpZnQpOwogCQkJYWRkciA9IChfX2JlNjQgKikgKChfX2JlMzIgKikgYnVmICsgZGVzY1tpXS5vZmZzZXRfd29yZHMpOwogCQkJKmFkZHIgPSAoKmFkZHIgJiB+bWFzaykgfCAoY3B1X3RvX2JlNjQodmFsKSAmIG1hc2spOwogCQl9IGVsc2UgewpAQCAtMTc2LDcgKzE3Niw3IEBACiAJCQlfX2JlNjQgKmFkZHI7CiAKIAkJCXNoaWZ0ID0gNjQgLSBkZXNjW2ldLm9mZnNldF9iaXRzIC0gZGVzY1tpXS5zaXplX2JpdHM7Ci0JCQltYXNrID0gKCgxdWxsIDw8IGRlc2NbaV0uc2l6ZV9iaXRzKSAtIDEpIDw8IHNoaWZ0OworCQkJbWFzayA9ICh+MHVsbCA+PiAoNjQgLSBkZXNjW2ldLnNpemVfYml0cykpIDw8IHNoaWZ0OwogCQkJYWRkciA9IChfX2JlNjQgKikgYnVmICsgZGVzY1tpXS5vZmZzZXRfd29yZHM7CiAJCQl2YWwgPSAoYmU2NF90b19jcHVwKGFkZHIpICYgbWFzaykgPj4gc2hpZnQ7CiAJCQl2YWx1ZV93cml0ZShkZXNjW2ldLnN0cnVjdF9vZmZzZXRfYnl0ZXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvc2FfcXVlcnkuYwppbmRleCAyNzZlMWE1Li41YTA4ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9zYV9xdWVyeS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3NhX3F1ZXJ5LmMKQEAgLTUwNyw3ICs1MDcsMTMgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRyX2xvY2ssIGZsYWdzKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCS8qCisJICogSXQncyBub3Qgc2FmZSB0byBkZXJlZmVyZW5jZSBxdWVyeSBhbnkgbW9yZSwgYmVjYXVzZSB0aGUKKwkgKiBzZW5kIG1heSBhbHJlYWR5IGhhdmUgY29tcGxldGVkIGFuZCBmcmVlZCB0aGUgcXVlcnkgaW4KKwkgKiBhbm90aGVyIGNvbnRleHQuICBTbyB1c2Ugd3Iud3JfaWQsIHdoaWNoIGhhcyBhIGNvcHkgb2YgdGhlCisJICogcXVlcnkncyBpZC4KKwkgKi8KKwlyZXR1cm4gcmV0ID8gcmV0IDogd3Iud3JfaWQ7CiB9CiAKIHN0YXRpYyB2b2lkIGliX3NhX3BhdGhfcmVjX2NhbGxiYWNrKHN0cnVjdCBpYl9zYV9xdWVyeSAqc2FfcXVlcnksCkBAIC01OTgsMTQgKzYwNCwxNSBAQAogCQlyZWMsIHF1ZXJ5LT5zYV9xdWVyeS5tYWQtPmRhdGEpOwogCiAJKnNhX3F1ZXJ5ID0gJnF1ZXJ5LT5zYV9xdWVyeTsKKwogCXJldCA9IHNlbmRfbWFkKCZxdWVyeS0+c2FfcXVlcnksIHRpbWVvdXRfbXMpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0IDwgMCkgewogCQkqc2FfcXVlcnkgPSBOVUxMOwogCQlrZnJlZShxdWVyeS0+c2FfcXVlcnkubWFkKTsKIAkJa2ZyZWUocXVlcnkpOwogCX0KIAotCXJldHVybiByZXQgPyByZXQgOiBxdWVyeS0+c2FfcXVlcnkuaWQ7CisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWJfc2FfcGF0aF9yZWNfZ2V0KTsKIApAQCAtNjc0LDE0ICs2ODEsMTUgQEAKIAkJcmVjLCBxdWVyeS0+c2FfcXVlcnkubWFkLT5kYXRhKTsKIAogCSpzYV9xdWVyeSA9ICZxdWVyeS0+c2FfcXVlcnk7CisKIAlyZXQgPSBzZW5kX21hZCgmcXVlcnktPnNhX3F1ZXJ5LCB0aW1lb3V0X21zKTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCA8IDApIHsKIAkJKnNhX3F1ZXJ5ID0gTlVMTDsKIAkJa2ZyZWUocXVlcnktPnNhX3F1ZXJ5Lm1hZCk7CiAJCWtmcmVlKHF1ZXJ5KTsKIAl9CiAKLQlyZXR1cm4gcmV0ID8gcmV0IDogcXVlcnktPnNhX3F1ZXJ5LmlkOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGliX3NhX21jbWVtYmVyX3JlY19xdWVyeSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczNDdmMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJicy5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogJElkOiB1dmVyYnMuaCAyNTU5IDIwMDUtMDYtMDYgMTk6NDM6MTZaIHJvbGFuZCAkCisgKi8KKworI2lmbmRlZiBVVkVSQlNfSAorI2RlZmluZSBVVkVSQlNfSAorCisvKiBJbmNsdWRlIGRldmljZS5oIGFuZCBmcy5oIHVudGlsIGNkZXYuaCBpcyBzZWxmLXN1ZmZpY2llbnQgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisKKyNpbmNsdWRlIDxpYl92ZXJicy5oPgorI2luY2x1ZGUgPGliX3VzZXJfdmVyYnMuaD4KKworc3RydWN0IGliX3V2ZXJic19kZXZpY2UgeworCWludAkJCQkJZGV2bnVtOworCXN0cnVjdCBjZGV2CQkJCWRldjsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlCQkJY2xhc3NfZGV2OworCXN0cnVjdCBpYl9kZXZpY2UJCSAgICAgICAqaWJfZGV2OworCWludAkJCQkJbnVtX2NvbXA7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgeworCXN0cnVjdCBrcmVmCQkJCXJlZjsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUJCSAgICAgICAqdXZlcmJzX2ZpbGU7CisJc3BpbmxvY2tfdAkJCQlsb2NrOworCWludAkJCQkJZmQ7CisJaW50CQkJCQlpc19hc3luYzsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJCXBvbGxfd2FpdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQkJZXZlbnRfbGlzdDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZmlsZSB7CisJc3RydWN0IGtyZWYJCQkJcmVmOworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlCQkgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgaWJfdWNvbnRleHQJCSAgICAgICAqdWNvbnRleHQ7CisJc3RydWN0IGliX2V2ZW50X2hhbmRsZXIJCQlldmVudF9oYW5kbGVyOworCXN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZQkgICAgICAgIGFzeW5jX2ZpbGU7CisJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlCSAgICAgICAgY29tcF9maWxlWzFdOworfTsKKworc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCB7CisJc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudF9kZXNjCWRlc2M7CisJc3RydWN0IGxpc3RfaGVhZAkJCWxpc3Q7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NvbXBfZXZlbnQgeworCXN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjCWRlc2M7CisJc3RydWN0IGxpc3RfaGVhZAkJCWxpc3Q7Cit9OworCitzdHJ1Y3QgaWJfdW9iamVjdF9tciB7CisJc3RydWN0IGliX3VvYmplY3QJCQl1b2JqOworCXN0cnVjdCBwYWdlCQkJICAgICAgICpwYWdlX2xpc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0CQkgICAgICAgKnNnX2xpc3Q7Cit9OworCitleHRlcm4gc3RydWN0IHNlbWFwaG9yZSBpYl91dmVyYnNfaWRyX211dGV4OworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX3BkX2lkcjsKK2V4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19tcl9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfbXdfaWRyOworZXh0ZXJuIHN0cnVjdCBpZHIgaWJfdXZlcmJzX2FoX2lkcjsKK2V4dGVybiBzdHJ1Y3QgaWRyIGliX3V2ZXJic19jcV9pZHI7CitleHRlcm4gc3RydWN0IGlkciBpYl91dmVyYnNfcXBfaWRyOworCit2b2lkIGliX3V2ZXJic19jb21wX2hhbmRsZXIoc3RydWN0IGliX2NxICpjcSwgdm9pZCAqY3FfY29udGV4dCk7Cit2b2lkIGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKTsKK3ZvaWQgaWJfdXZlcmJzX3FwX2V2ZW50X2hhbmRsZXIoc3RydWN0IGliX2V2ZW50ICpldmVudCwgdm9pZCAqY29udGV4dF9wdHIpOworCitpbnQgaWJfdW1lbV9nZXQoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqbWVtLAorCQl2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHdyaXRlKTsKK3ZvaWQgaWJfdW1lbV9yZWxlYXNlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKnVtZW0pOwordm9pZCBpYl91bWVtX3JlbGVhc2Vfb25fY2xvc2Uoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqdW1lbSk7CisKKyNkZWZpbmUgSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG5hbWUpCQkJCQlcCisJc3NpemVfdCBpYl91dmVyYnNfIyNuYW1lKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwJCVwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwJXAorCQkJCSBpbnQgb3V0X2xlbikKKworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X3BhcmFtcyk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZ2V0X2NvbnRleHQpOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKHF1ZXJ5X2RldmljZSk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocXVlcnlfcG9ydCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocXVlcnlfZ2lkKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChxdWVyeV9wa2V5KTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChhbGxvY19wZCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVhbGxvY19wZCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQocmVnX21yKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChkZXJlZ19tcik7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoY3JlYXRlX2NxKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChkZXN0cm95X2NxKTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChjcmVhdGVfcXApOworSUJfVVZFUkJTX0RFQ0xBUkVfQ01EKG1vZGlmeV9xcCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoZGVzdHJveV9xcCk7CitJQl9VVkVSQlNfREVDTEFSRV9DTUQoYXR0YWNoX21jYXN0KTsKK0lCX1VWRVJCU19ERUNMQVJFX0NNRChkZXRhY2hfbWNhc3QpOworCisjZW5kaWYgLyogVVZFUkJTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJiYmNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX2NtZC5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogdXZlcmJzX2NtZC5jIDI3MDggMjAwNS0wNi0yNCAxNzoyNzoyMVogcm9sYW5kICQKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInV2ZXJicy5oIgorCisjZGVmaW5lIElOSVRfVURBVEEodWRhdGEsIGlidWYsIG9idWYsIGlsZW4sIG9sZW4pCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJKHVkYXRhKS0+aW5idWYgID0gKHZvaWQgX191c2VyICopIChpYnVmKTsJCVwKKwkJKHVkYXRhKS0+b3V0YnVmID0gKHZvaWQgX191c2VyICopIChvYnVmKTsJCVwKKwkJKHVkYXRhKS0+aW5sZW4gID0gKGlsZW4pOwkJCQlcCisJCSh1ZGF0YSktPm91dGxlbiA9IChvbGVuKTsJCQkJXAorCX0gd2hpbGUgKDApCisKK3NzaXplX3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtcyhzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtcyAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BhcmFtc19yZXNwIHJlc3A7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCisJcmVzcC5udW1fY3FfZXZlbnRzID0gZmlsZS0+ZGV2aWNlLT5udW1fY29tcDsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsICZyZXNwLCBzaXplb2YgcmVzcCkpCisJICAgIHJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfZ2V0X2NvbnRleHQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfZ2V0X2NvbnRleHQgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19nZXRfY29udGV4dF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgICAgICAgICAgICppYmRldiA9IGZpbGUtPmRldmljZS0+aWJfZGV2OworCWludCBpOworCWludCByZXQgPSBpbl9sZW47CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwlmaWxlLT51Y29udGV4dCA9IGliZGV2LT5hbGxvY191Y29udGV4dChpYmRldiwgJnVkYXRhKTsKKwlpZiAoSVNfRVJSKGZpbGUtPnVjb250ZXh0KSkgeworCQlyZXQgPSBQVFJfRVJSKGZpbGUtPnVjb250ZXh0KTsKKwkJZmlsZS0+dWNvbnRleHQgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCWZpbGUtPnVjb250ZXh0LT5kZXZpY2UgPSBpYmRldjsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+dWNvbnRleHQtPnBkX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+bXJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5td19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmlsZS0+dWNvbnRleHQtPmNxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT51Y29udGV4dC0+cXBfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5zcnFfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmZpbGUtPnVjb250ZXh0LT5haF9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJcmVzcC5hc3luY19mZCA9IGZpbGUtPmFzeW5jX2ZpbGUuZmQ7CisJZm9yIChpID0gMDsgaSA8IGZpbGUtPmRldmljZS0+bnVtX2NvbXA7ICsraSkKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5jcV9mZF90YWIgKworCQkJCSBpICogc2l6ZW9mIChfX3UzMiksCisJCQkJICZmaWxlLT5jb21wX2ZpbGVbaV0uZmQsIHNpemVvZiAoX191MzIpKSkKKwkJCWdvdG8gZXJyOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKQorCQlnb3RvIGVycjsKKworCXJldHVybiBpbl9sZW47CisKK2VycjoKKwlpYmRldi0+ZGVhbGxvY191Y29udGV4dChmaWxlLT51Y29udGV4dCk7CisJZmlsZS0+dWNvbnRleHQgPSBOVUxMOworCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X2RldmljZV9yZXNwIHJlc3A7CisJc3RydWN0IGliX2RldmljZV9hdHRyICAgICAgICAgICAgICBhdHRyOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBpYl9xdWVyeV9kZXZpY2UoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZhdHRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXNwLmZ3X3ZlciAJCSAgICAgICA9IGF0dHIuZndfdmVyOworCXJlc3Aubm9kZV9ndWlkIAkJICAgICAgID0gYXR0ci5ub2RlX2d1aWQ7CisJcmVzcC5zeXNfaW1hZ2VfZ3VpZCAJICAgICAgID0gYXR0ci5zeXNfaW1hZ2VfZ3VpZDsKKwlyZXNwLm1heF9tcl9zaXplIAkgICAgICAgPSBhdHRyLm1heF9tcl9zaXplOworCXJlc3AucGFnZV9zaXplX2NhcCAJICAgICAgID0gYXR0ci5wYWdlX3NpemVfY2FwOworCXJlc3AudmVuZG9yX2lkIAkJICAgICAgID0gYXR0ci52ZW5kb3JfaWQ7CisJcmVzcC52ZW5kb3JfcGFydF9pZCAJICAgICAgID0gYXR0ci52ZW5kb3JfcGFydF9pZDsKKwlyZXNwLmh3X3ZlciAJCSAgICAgICA9IGF0dHIuaHdfdmVyOworCXJlc3AubWF4X3FwIAkJICAgICAgID0gYXR0ci5tYXhfcXA7CisJcmVzcC5tYXhfcXBfd3IgCQkgICAgICAgPSBhdHRyLm1heF9xcF93cjsKKwlyZXNwLmRldmljZV9jYXBfZmxhZ3MgCSAgICAgICA9IGF0dHIuZGV2aWNlX2NhcF9mbGFnczsKKwlyZXNwLm1heF9zZ2UgCQkgICAgICAgPSBhdHRyLm1heF9zZ2U7CisJcmVzcC5tYXhfc2dlX3JkIAkgICAgICAgPSBhdHRyLm1heF9zZ2VfcmQ7CisJcmVzcC5tYXhfY3EgCQkgICAgICAgPSBhdHRyLm1heF9jcTsKKwlyZXNwLm1heF9jcWUgCQkgICAgICAgPSBhdHRyLm1heF9jcWU7CisJcmVzcC5tYXhfbXIgCQkgICAgICAgPSBhdHRyLm1heF9tcjsKKwlyZXNwLm1heF9wZCAJCSAgICAgICA9IGF0dHIubWF4X3BkOworCXJlc3AubWF4X3FwX3JkX2F0b20gCSAgICAgICA9IGF0dHIubWF4X3FwX3JkX2F0b207CisJcmVzcC5tYXhfZWVfcmRfYXRvbSAJICAgICAgID0gYXR0ci5tYXhfZWVfcmRfYXRvbTsKKwlyZXNwLm1heF9yZXNfcmRfYXRvbSAJICAgICAgID0gYXR0ci5tYXhfcmVzX3JkX2F0b207CisJcmVzcC5tYXhfcXBfaW5pdF9yZF9hdG9tICAgICAgID0gYXR0ci5tYXhfcXBfaW5pdF9yZF9hdG9tOworCXJlc3AubWF4X2VlX2luaXRfcmRfYXRvbSAgICAgICA9IGF0dHIubWF4X2VlX2luaXRfcmRfYXRvbTsKKwlyZXNwLmF0b21pY19jYXAgCSAgICAgICA9IGF0dHIuYXRvbWljX2NhcDsKKwlyZXNwLm1heF9lZSAJCSAgICAgICA9IGF0dHIubWF4X2VlOworCXJlc3AubWF4X3JkZCAJCSAgICAgICA9IGF0dHIubWF4X3JkZDsKKwlyZXNwLm1heF9tdyAJCSAgICAgICA9IGF0dHIubWF4X213OworCXJlc3AubWF4X3Jhd19pcHY2X3FwIAkgICAgICAgPSBhdHRyLm1heF9yYXdfaXB2Nl9xcDsKKwlyZXNwLm1heF9yYXdfZXRoeV9xcCAJICAgICAgID0gYXR0ci5tYXhfcmF3X2V0aHlfcXA7CisJcmVzcC5tYXhfbWNhc3RfZ3JwIAkgICAgICAgPSBhdHRyLm1heF9tY2FzdF9ncnA7CisJcmVzcC5tYXhfbWNhc3RfcXBfYXR0YWNoICAgICAgID0gYXR0ci5tYXhfbWNhc3RfcXBfYXR0YWNoOworCXJlc3AubWF4X3RvdGFsX21jYXN0X3FwX2F0dGFjaCA9IGF0dHIubWF4X3RvdGFsX21jYXN0X3FwX2F0dGFjaDsKKwlyZXNwLm1heF9haCAJCSAgICAgICA9IGF0dHIubWF4X2FoOworCXJlc3AubWF4X2ZtciAJCSAgICAgICA9IGF0dHIubWF4X2ZtcjsKKwlyZXNwLm1heF9tYXBfcGVyX2ZtciAJICAgICAgID0gYXR0ci5tYXhfbWFwX3Blcl9mbXI7CisJcmVzcC5tYXhfc3JxIAkJICAgICAgID0gYXR0ci5tYXhfc3JxOworCXJlc3AubWF4X3NycV93ciAJICAgICAgID0gYXR0ci5tYXhfc3JxX3dyOworCXJlc3AubWF4X3NycV9zZ2UgCSAgICAgICA9IGF0dHIubWF4X3NycV9zZ2U7CisJcmVzcC5tYXhfcGtleXMgCQkgICAgICAgPSBhdHRyLm1heF9wa2V5czsKKwlyZXNwLmxvY2FsX2NhX2Fja19kZWxheSAgICAgICAgPSBhdHRyLmxvY2FsX2NhX2Fja19kZWxheTsKKwlyZXNwLnBoeXNfcG9ydF9jbnQJICAgICAgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPnBoeXNfcG9ydF9jbnQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcXVlcnlfcG9ydChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfcG9ydCAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnRfcmVzcCByZXNwOworCXN0cnVjdCBpYl9wb3J0X2F0dHIgICAgICAgICAgICAgIGF0dHI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXQgPSBpYl9xdWVyeV9wb3J0KGZpbGUtPmRldmljZS0+aWJfZGV2LCBjbWQucG9ydF9udW0sICZhdHRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXNwLnN0YXRlIAkgICAgID0gYXR0ci5zdGF0ZTsKKwlyZXNwLm1heF9tdHUgCSAgICAgPSBhdHRyLm1heF9tdHU7CisJcmVzcC5hY3RpdmVfbXR1ICAgICAgPSBhdHRyLmFjdGl2ZV9tdHU7CisJcmVzcC5naWRfdGJsX2xlbiAgICAgPSBhdHRyLmdpZF90YmxfbGVuOworCXJlc3AucG9ydF9jYXBfZmxhZ3MgID0gYXR0ci5wb3J0X2NhcF9mbGFnczsKKwlyZXNwLm1heF9tc2dfc3ogICAgICA9IGF0dHIubWF4X21zZ19zejsKKwlyZXNwLmJhZF9wa2V5X2NudHIgICA9IGF0dHIuYmFkX3BrZXlfY250cjsKKwlyZXNwLnFrZXlfdmlvbF9jbnRyICA9IGF0dHIucWtleV92aW9sX2NudHI7CisJcmVzcC5wa2V5X3RibF9sZW4gICAgPSBhdHRyLnBrZXlfdGJsX2xlbjsKKwlyZXNwLmxpZCAJICAgICA9IGF0dHIubGlkOworCXJlc3Auc21fbGlkIAkgICAgID0gYXR0ci5zbV9saWQ7CisJcmVzcC5sbWMgCSAgICAgPSBhdHRyLmxtYzsKKwlyZXNwLm1heF92bF9udW0gICAgICA9IGF0dHIubWF4X3ZsX251bTsKKwlyZXNwLnNtX3NsIAkgICAgID0gYXR0ci5zbV9zbDsKKwlyZXNwLnN1Ym5ldF90aW1lb3V0ICA9IGF0dHIuc3VibmV0X3RpbWVvdXQ7CisJcmVzcC5pbml0X3R5cGVfcmVwbHkgPSBhdHRyLmluaXRfdHlwZV9yZXBseTsKKwlyZXNwLmFjdGl2ZV93aWR0aCAgICA9IGF0dHIuYWN0aXZlX3dpZHRoOworCXJlc3AuYWN0aXZlX3NwZWVkICAgID0gYXR0ci5hY3RpdmVfc3BlZWQ7CisJcmVzcC5waHlzX3N0YXRlICAgICAgPSBhdHRyLnBoeXNfc3RhdGU7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcXVlcnlfZ2lkKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfZ2lkX3Jlc3AgcmVzcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisKKwlyZXQgPSBpYl9xdWVyeV9naWQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5wb3J0X251bSwgY21kLmluZGV4LAorCQkJICAgKHVuaW9uIGliX2dpZCAqKSByZXNwLmdpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19xdWVyeV9wa2V5KHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgaW50IGluX2xlbiwgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19xdWVyeV9wa2V5ICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfcXVlcnlfcGtleV9yZXNwIHJlc3A7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1zZXQoJnJlc3AsIDAsIHNpemVvZiByZXNwKTsKKworCXJldCA9IGliX3F1ZXJ5X3BrZXkoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5wb3J0X251bSwgY21kLmluZGV4LAorCQkJICAgICZyZXNwLnBrZXkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfYWxsb2NfcGQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIGludCBpbl9sZW4sIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGQgICAgICBjbWQ7CisJc3RydWN0IGliX3V2ZXJic19hbGxvY19wZF9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICAgICp1b2JqOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAgICpwZDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKG91dF9sZW4gPCBzaXplb2YgcmVzcCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlJTklUX1VEQVRBKCZ1ZGF0YSwgYnVmICsgc2l6ZW9mIGNtZCwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSArIHNpemVvZiByZXNwLAorCQkgICBpbl9sZW4gLSBzaXplb2YgY21kLCBvdXRfbGVuIC0gc2l6ZW9mIHJlc3ApOworCisJdW9iaiA9IGttYWxsb2Moc2l6ZW9mICp1b2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVvYmopCisJCXJldHVybiAtRU5PTUVNOworCisJdW9iai0+Y29udGV4dCA9IGZpbGUtPnVjb250ZXh0OworCisJcGQgPSBmaWxlLT5kZXZpY2UtPmliX2Rldi0+YWxsb2NfcGQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsCisJCQkJCSAgICBmaWxlLT51Y29udGV4dCwgJnVkYXRhKTsKKwlpZiAoSVNfRVJSKHBkKSkgeworCQlyZXQgPSBQVFJfRVJSKHBkKTsKKwkJZ290byBlcnI7CisJfQorCisJcGQtPmRldmljZSAgPSBmaWxlLT5kZXZpY2UtPmliX2RldjsKKwlwZC0+dW9iamVjdCA9IHVvYmo7CisJYXRvbWljX3NldCgmcGQtPnVzZWNudCwgMCk7CisKK3JldHJ5OgorCWlmICghaWRyX3ByZV9nZXQoJmliX3V2ZXJic19wZF9pZHIsIEdGUF9LRVJORUwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3BkOworCX0KKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfcGRfaWRyLCBwZCwgJnVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcGQ7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdW9iai0+bGlzdCwgJmZpbGUtPnVjb250ZXh0LT5wZF9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCW1lbXNldCgmcmVzcCwgMCwgc2l6ZW9mIHJlc3ApOworCXJlc3AucGRfaGFuZGxlID0gdW9iai0+aWQ7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfbGlzdDsKKwl9CisKKwlyZXR1cm4gaW5fbGVuOworCitlcnJfbGlzdDoKKyAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIHVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKK2Vycl9wZDoKKwlpYl9kZWFsbG9jX3BkKHBkKTsKKworZXJyOgorCWtmcmVlKHVvYmopOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2RlYWxsb2NfcGQoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBpbnQgaW5fbGVuLCBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RlYWxsb2NfcGQgY21kOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICpwZDsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAqdW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcGQgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3BkX2lkciwgY21kLnBkX2hhbmRsZSk7CisJaWYgKCFwZCB8fCBwZC0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKKwkJZ290byBvdXQ7CisKKwl1b2JqID0gcGQtPnVvYmplY3Q7CisKKwlyZXQgPSBpYl9kZWFsbG9jX3BkKHBkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19wZF9pZHIsIGNtZC5wZF9oYW5kbGUpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWtmcmVlKHVvYmopOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfcmVnX21yKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfcmVnX21yICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfcmVnX21yX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl91bWVtX29iamVjdCAgICAgICAqb2JqOworCXN0cnVjdCBpYl9wZCAgICAgICAgICAgICAgICAqcGQ7CisJc3RydWN0IGliX21yICAgICAgICAgICAgICAgICptcjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCWlmICgoY21kLnN0YXJ0ICYgflBBR0VfTUFTSykgIT0gKGNtZC5oY2FfdmEgJiB+UEFHRV9NQVNLKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvYmogPSBrbWFsbG9jKHNpemVvZiAqb2JqLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvYmotPnVvYmplY3QuY29udGV4dCA9IGZpbGUtPnVjb250ZXh0OworCisJLyoKKwkgKiBXZSBhc2sgZm9yIHdyaXRhYmxlIG1lbW9yeSBpZiBhbnkgYWNjZXNzIGZsYWdzIG90aGVyIHRoYW4KKwkgKiAicmVtb3RlIHJlYWQiIGFyZSBzZXQuICAiTG9jYWwgd3JpdGUiIGFuZCAicmVtb3RlIHdyaXRlIgorCSAqIG9idmlvdXNseSByZXF1aXJlIHdyaXRlIGFjY2Vzcy4gICJSZW1vdGUgYXRvbWljIiBjYW4gZG8KKwkgKiB0aGluZ3MgbGlrZSBmZXRjaCBhbmQgYWRkLCB3aGljaCB3aWxsIG1vZGlmeSBtZW1vcnksIGFuZAorCSAqICJNVyBiaW5kIiBjYW4gY2hhbmdlIHBlcm1pc3Npb25zIGJ5IGJpbmRpbmcgYSB3aW5kb3cuCisJICovCisJcmV0ID0gaWJfdW1lbV9nZXQoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsICZvYmotPnVtZW0sCisJCQkgICh2b2lkICopICh1bnNpZ25lZCBsb25nKSBjbWQuc3RhcnQsIGNtZC5sZW5ndGgsCisJCQkgICEhKGNtZC5hY2Nlc3NfZmxhZ3MgJiB+SUJfQUNDRVNTX1JFTU9URV9SRUFEKSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZnJlZTsKKworCW9iai0+dW1lbS52aXJ0X2Jhc2UgPSBjbWQuaGNhX3ZhOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlwZCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKKwlpZiAoIXBkIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3VwOworCX0KKworCWlmICghcGQtPmRldmljZS0+cmVnX3VzZXJfbXIpIHsKKwkJcmV0ID0gLUVOT1NZUzsKKwkJZ290byBlcnJfdXA7CisJfQorCisJbXIgPSBwZC0+ZGV2aWNlLT5yZWdfdXNlcl9tcihwZCwgJm9iai0+dW1lbSwgY21kLmFjY2Vzc19mbGFncywgJnVkYXRhKTsKKwlpZiAoSVNfRVJSKG1yKSkgeworCQlyZXQgPSBQVFJfRVJSKG1yKTsKKwkJZ290byBlcnJfdXA7CisJfQorCisJbXItPmRldmljZSAgPSBwZC0+ZGV2aWNlOworCW1yLT5wZCAgICAgID0gcGQ7CisJbXItPnVvYmplY3QgPSAmb2JqLT51b2JqZWN0OworCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOworCWF0b21pY19zZXQoJm1yLT51c2VjbnQsIDApOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5sa2V5ID0gbXItPmxrZXk7CisJcmVzcC5ya2V5ID0gbXItPnJrZXk7CisKK3JldHJ5OgorCWlmICghaWRyX3ByZV9nZXQoJmliX3V2ZXJic19tcl9pZHIsIEdGUF9LRVJORUwpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3VucmVnOworCX0KKworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfbXJfaWRyLCBtciwgJm9iai0+dW9iamVjdC5pZCk7CisKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCWdvdG8gcmV0cnk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5yZWc7CisKKwlyZXNwLm1yX2hhbmRsZSA9IG9iai0+dW9iamVjdC5pZDsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZvYmotPnVvYmplY3QubGlzdCwgJmZpbGUtPnVjb250ZXh0LT5tcl9saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UsCisJCQkgJnJlc3AsIHNpemVvZiByZXNwKSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl9saXN0OworCX0KKworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiBpbl9sZW47CisKK2Vycl9saXN0OgorCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2RlbCgmb2JqLT51b2JqZWN0Lmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCitlcnJfdW5yZWc6CisJaWJfZGVyZWdfbXIobXIpOworCitlcnJfdXA6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJaWJfdW1lbV9yZWxlYXNlKGZpbGUtPmRldmljZS0+aWJfZGV2LCAmb2JqLT51bWVtKTsKKworZXJyX2ZyZWU6CisJa2ZyZWUob2JqKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGliX3V2ZXJic19kZXJlZ19tcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19kZXJlZ19tciBjbWQ7CisJc3RydWN0IGliX21yICAgICAgICAgICAgICptcjsKKwlzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgICAgKm1lbW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCW1yID0gaWRyX2ZpbmQoJmliX3V2ZXJic19tcl9pZHIsIGNtZC5tcl9oYW5kbGUpOworCWlmICghbXIgfHwgbXItPnVvYmplY3QtPmNvbnRleHQgIT0gZmlsZS0+dWNvbnRleHQpCisJCWdvdG8gb3V0OworCisJbWVtb2JqID0gY29udGFpbmVyX29mKG1yLT51b2JqZWN0LCBzdHJ1Y3QgaWJfdW1lbV9vYmplY3QsIHVvYmplY3QpOworCisJcmV0ID0gaWJfZGVyZWdfbXIobXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX21yX2lkciwgY21kLm1yX2hhbmRsZSk7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9kZWwoJm1lbW9iai0+dW9iamVjdC5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWliX3VtZW1fcmVsZWFzZShmaWxlLT5kZXZpY2UtPmliX2RldiwgJm1lbW9iai0+dW1lbSk7CisJa2ZyZWUobWVtb2JqKTsKKworb3V0OgorCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2NyZWF0ZV9jcShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9jcSAgICAgIGNtZDsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9jcV9yZXNwIHJlc3A7CisJc3RydWN0IGliX3VkYXRhICAgICAgICAgICAgICAgICB1ZGF0YTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAgICAgKnVvYmo7CisJc3RydWN0IGliX2NxICAgICAgICAgICAgICAgICAgICpjcTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworCWlmIChvdXRfbGVuIDwgc2l6ZW9mIHJlc3ApCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJSU5JVF9VREFUQSgmdWRhdGEsIGJ1ZiArIHNpemVvZiBjbWQsCisJCSAgICh1bnNpZ25lZCBsb25nKSBjbWQucmVzcG9uc2UgKyBzaXplb2YgcmVzcCwKKwkJICAgaW5fbGVuIC0gc2l6ZW9mIGNtZCwgb3V0X2xlbiAtIHNpemVvZiByZXNwKTsKKworCWlmIChjbWQuZXZlbnRfaGFuZGxlciA+PSBmaWxlLT5kZXZpY2UtPm51bV9jb21wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXVvYmogPSBrbWFsbG9jKHNpemVvZiAqdW9iaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1b2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVvYmotPnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOworCXVvYmotPmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisKKwljcSA9IGZpbGUtPmRldmljZS0+aWJfZGV2LT5jcmVhdGVfY3EoZmlsZS0+ZGV2aWNlLT5pYl9kZXYsIGNtZC5jcWUsCisJCQkJCSAgICAgZmlsZS0+dWNvbnRleHQsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihjcSkpIHsKKwkJcmV0ID0gUFRSX0VSUihjcSk7CisJCWdvdG8gZXJyOworCX0KKworCWNxLT5kZXZpY2UgICAgICAgID0gZmlsZS0+ZGV2aWNlLT5pYl9kZXY7CisJY3EtPnVvYmplY3QgICAgICAgPSB1b2JqOworCWNxLT5jb21wX2hhbmRsZXIgID0gaWJfdXZlcmJzX2NvbXBfaGFuZGxlcjsKKwljcS0+ZXZlbnRfaGFuZGxlciA9IGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyOworCWNxLT5jcV9jb250ZXh0ICAgID0gZmlsZTsKKwlhdG9taWNfc2V0KCZjcS0+dXNlY250LCAwKTsKKworcmV0cnk6CisJaWYgKCFpZHJfcHJlX2dldCgmaWJfdXZlcmJzX2NxX2lkciwgR0ZQX0tFUk5FTCkpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfY3E7CisJfQorCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisJcmV0ID0gaWRyX2dldF9uZXcoJmliX3V2ZXJic19jcV9pZHIsIGNxLCAmdW9iai0+aWQpOworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jcTsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPmNxX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5jcV9oYW5kbGUgPSB1b2JqLT5pZDsKKwlyZXNwLmNxZSAgICAgICA9IGNxLT5jcWU7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlLAorCQkJICZyZXNwLCBzaXplb2YgcmVzcCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnJfbGlzdDsKKwl9CisKKwlyZXR1cm4gaW5fbGVuOworCitlcnJfbGlzdDoKKyAJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIHVvYmotPmlkKTsKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKK2Vycl9jcToKKwlpYl9kZXN0cm95X2NxKGNxKTsKKworZXJyOgorCWtmcmVlKHVvYmopOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3Eoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2Rlc3Ryb3lfY3EgY21kOworCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgICpjcTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICAgICAqdW9iajsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLmNxX2hhbmRsZSk7CisJaWYgKCFjcSB8fCBjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkKKwkJZ290byBvdXQ7CisKKwl1b2JqID0gY3EtPnVvYmplY3Q7CisKKwlyZXQgPSBpYl9kZXN0cm95X2NxKGNxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlkcl9yZW1vdmUoJmliX3V2ZXJic19jcV9pZHIsIGNtZC5jcV9oYW5kbGUpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworCWtmcmVlKHVvYmopOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KKworc3NpemVfdCBpYl91dmVyYnNfY3JlYXRlX3FwKHN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSwKKwkJCSAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwICAgICAgY21kOworCXN0cnVjdCBpYl91dmVyYnNfY3JlYXRlX3FwX3Jlc3AgcmVzcDsKKwlzdHJ1Y3QgaWJfdWRhdGEgICAgICAgICAgICAgICAgIHVkYXRhOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICAgICAqdW9iajsKKwlzdHJ1Y3QgaWJfcGQgICAgICAgICAgICAgICAgICAgKnBkOworCXN0cnVjdCBpYl9jcSAgICAgICAgICAgICAgICAgICAqc2NxLCAqcmNxOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgICAgICAqcXA7CisJc3RydWN0IGliX3FwX2luaXRfYXR0ciAgICAgICAgICBhdHRyOworCWludCByZXQ7CisKKwlpZiAob3V0X2xlbiA8IHNpemVvZiByZXNwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCUlOSVRfVURBVEEoJnVkYXRhLCBidWYgKyBzaXplb2YgY21kLAorCQkgICAodW5zaWduZWQgbG9uZykgY21kLnJlc3BvbnNlICsgc2l6ZW9mIHJlc3AsCisJCSAgIGluX2xlbiAtIHNpemVvZiBjbWQsIG91dF9sZW4gLSBzaXplb2YgcmVzcCk7CisKKwl1b2JqID0ga21hbGxvYyhzaXplb2YgKnVvYmosIEdGUF9LRVJORUwpOworCWlmICghdW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXBkICA9IGlkcl9maW5kKCZpYl91dmVyYnNfcGRfaWRyLCBjbWQucGRfaGFuZGxlKTsKKwlzY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLnNlbmRfY3FfaGFuZGxlKTsKKwlyY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgY21kLnJlY3ZfY3FfaGFuZGxlKTsKKworCWlmICghcGQgIHx8IHBkLT51b2JqZWN0LT5jb250ZXh0ICAhPSBmaWxlLT51Y29udGV4dCB8fAorCSAgICAhc2NxIHx8IHNjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCB8fAorCSAgICAhcmNxIHx8IHJjcS0+dW9iamVjdC0+Y29udGV4dCAhPSBmaWxlLT51Y29udGV4dCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl91cDsKKwl9CisKKwlhdHRyLmV2ZW50X2hhbmRsZXIgPSBpYl91dmVyYnNfcXBfZXZlbnRfaGFuZGxlcjsKKwlhdHRyLnFwX2NvbnRleHQgICAgPSBmaWxlOworCWF0dHIuc2VuZF9jcSAgICAgICA9IHNjcTsKKwlhdHRyLnJlY3ZfY3EgICAgICAgPSByY3E7CisJYXR0ci5zcnEgICAgICAgICAgID0gTlVMTDsKKwlhdHRyLnNxX3NpZ190eXBlICAgPSBjbWQuc3Ffc2lnX2FsbCA/IElCX1NJR05BTF9BTExfV1IgOiBJQl9TSUdOQUxfUkVRX1dSOworCWF0dHIucXBfdHlwZSAgICAgICA9IGNtZC5xcF90eXBlOworCisJYXR0ci5jYXAubWF4X3NlbmRfd3IgICAgID0gY21kLm1heF9zZW5kX3dyOworCWF0dHIuY2FwLm1heF9yZWN2X3dyICAgICA9IGNtZC5tYXhfcmVjdl93cjsKKwlhdHRyLmNhcC5tYXhfc2VuZF9zZ2UgICAgPSBjbWQubWF4X3NlbmRfc2dlOworCWF0dHIuY2FwLm1heF9yZWN2X3NnZSAgICA9IGNtZC5tYXhfcmVjdl9zZ2U7CisJYXR0ci5jYXAubWF4X2lubGluZV9kYXRhID0gY21kLm1heF9pbmxpbmVfZGF0YTsKKworCXVvYmotPnVzZXJfaGFuZGxlID0gY21kLnVzZXJfaGFuZGxlOworCXVvYmotPmNvbnRleHQgICAgID0gZmlsZS0+dWNvbnRleHQ7CisKKwlxcCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9xcChwZCwgJmF0dHIsICZ1ZGF0YSk7CisJaWYgKElTX0VSUihxcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihxcCk7CisJCWdvdG8gZXJyX3VwOworCX0KKworCXFwLT5kZXZpY2UgICAgIAkgID0gcGQtPmRldmljZTsKKwlxcC0+cGQgICAgICAgICAJICA9IHBkOworCXFwLT5zZW5kX2NxICAgIAkgID0gYXR0ci5zZW5kX2NxOworCXFwLT5yZWN2X2NxICAgIAkgID0gYXR0ci5yZWN2X2NxOworCXFwLT5zcnEJICAgICAgIAkgID0gYXR0ci5zcnE7CisJcXAtPnVvYmplY3QgICAgICAgPSB1b2JqOworCXFwLT5ldmVudF9oYW5kbGVyID0gYXR0ci5ldmVudF9oYW5kbGVyOworCXFwLT5xcF9jb250ZXh0ICAgID0gYXR0ci5xcF9jb250ZXh0OworCXFwLT5xcF90eXBlCSAgPSBhdHRyLnFwX3R5cGU7CisJYXRvbWljX2luYygmcGQtPnVzZWNudCk7CisJYXRvbWljX2luYygmYXR0ci5zZW5kX2NxLT51c2VjbnQpOworCWF0b21pY19pbmMoJmF0dHIucmVjdl9jcS0+dXNlY250KTsKKwlpZiAoYXR0ci5zcnEpCisJCWF0b21pY19pbmMoJmF0dHIuc3JxLT51c2VjbnQpOworCisJbWVtc2V0KCZyZXNwLCAwLCBzaXplb2YgcmVzcCk7CisJcmVzcC5xcG4gPSBxcC0+cXBfbnVtOworCityZXRyeToKKwlpZiAoIWlkcl9wcmVfZ2V0KCZpYl91dmVyYnNfcXBfaWRyLCBHRlBfS0VSTkVMKSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXN0cm95OworCX0KKworCXJldCA9IGlkcl9nZXRfbmV3KCZpYl91dmVyYnNfcXBfaWRyLCBxcCwgJnVvYmotPmlkKTsKKworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJZ290byByZXRyeTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZXN0cm95OworCisJcmVzcC5xcF9oYW5kbGUgPSB1b2JqLT5pZDsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ1b2JqLT5saXN0LCAmZmlsZS0+dWNvbnRleHQtPnFwX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgKHVuc2lnbmVkIGxvbmcpIGNtZC5yZXNwb25zZSwKKwkJCSAmcmVzcCwgc2l6ZW9mIHJlc3ApKSB7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2xpc3Q7CisJfQorCisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIGluX2xlbjsKKworZXJyX2xpc3Q6CisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPnVjb250ZXh0LT5sb2NrKTsKKworZXJyX2Rlc3Ryb3k6CisJaWJfZGVzdHJveV9xcChxcCk7CisKK2Vycl91cDoKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlrZnJlZSh1b2JqKTsKKwlyZXR1cm4gcmV0OworfQorCitzc2l6ZV90IGliX3V2ZXJic19tb2RpZnlfcXAoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19tb2RpZnlfcXAgY21kOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgKnFwOworCXN0cnVjdCBpYl9xcF9hdHRyICAgICAgICAgKmF0dHI7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJYXR0ciA9IGttYWxsb2Moc2l6ZW9mICphdHRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWF0dHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKKwlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWF0dHItPnFwX3N0YXRlIAkJICA9IGNtZC5xcF9zdGF0ZTsKKwlhdHRyLT5jdXJfcXBfc3RhdGUgCSAgPSBjbWQuY3VyX3FwX3N0YXRlOworCWF0dHItPnBhdGhfbXR1IAkJICA9IGNtZC5wYXRoX210dTsKKwlhdHRyLT5wYXRoX21pZ19zdGF0ZSAJICA9IGNtZC5wYXRoX21pZ19zdGF0ZTsKKwlhdHRyLT5xa2V5IAkJICA9IGNtZC5xa2V5OworCWF0dHItPnJxX3BzbiAJCSAgPSBjbWQucnFfcHNuOworCWF0dHItPnNxX3BzbiAJCSAgPSBjbWQuc3FfcHNuOworCWF0dHItPmRlc3RfcXBfbnVtIAkgID0gY21kLmRlc3RfcXBfbnVtOworCWF0dHItPnFwX2FjY2Vzc19mbGFncyAJICA9IGNtZC5xcF9hY2Nlc3NfZmxhZ3M7CisJYXR0ci0+cGtleV9pbmRleCAJICA9IGNtZC5wa2V5X2luZGV4OworCWF0dHItPmFsdF9wa2V5X2luZGV4IAkgID0gY21kLnBrZXlfaW5kZXg7CisJYXR0ci0+ZW5fc3FkX2FzeW5jX25vdGlmeSA9IGNtZC5lbl9zcWRfYXN5bmNfbm90aWZ5OworCWF0dHItPm1heF9yZF9hdG9taWMgCSAgPSBjbWQubWF4X3JkX2F0b21pYzsKKwlhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMgID0gY21kLm1heF9kZXN0X3JkX2F0b21pYzsKKwlhdHRyLT5taW5fcm5yX3RpbWVyIAkgID0gY21kLm1pbl9ybnJfdGltZXI7CisJYXR0ci0+cG9ydF9udW0gCQkgID0gY21kLnBvcnRfbnVtOworCWF0dHItPnRpbWVvdXQgCQkgID0gY21kLnRpbWVvdXQ7CisJYXR0ci0+cmV0cnlfY250IAkgID0gY21kLnJldHJ5X2NudDsKKwlhdHRyLT5ybnJfcmV0cnkgCSAgPSBjbWQucm5yX3JldHJ5OworCWF0dHItPmFsdF9wb3J0X251bSAJICA9IGNtZC5hbHRfcG9ydF9udW07CisJYXR0ci0+YWx0X3RpbWVvdXQgCSAgPSBjbWQuYWx0X3RpbWVvdXQ7CisKKwltZW1jcHkoYXR0ci0+YWhfYXR0ci5ncmguZGdpZC5yYXcsIGNtZC5kZXN0LmRnaWQsIDE2KTsKKwlhdHRyLT5haF9hdHRyLmdyaC5mbG93X2xhYmVsICAgICAgICA9IGNtZC5kZXN0LmZsb3dfbGFiZWw7CisJYXR0ci0+YWhfYXR0ci5ncmguc2dpZF9pbmRleCAgICAgICAgPSBjbWQuZGVzdC5zZ2lkX2luZGV4OworCWF0dHItPmFoX2F0dHIuZ3JoLmhvcF9saW1pdCAgICAgICAgID0gY21kLmRlc3QuaG9wX2xpbWl0OworCWF0dHItPmFoX2F0dHIuZ3JoLnRyYWZmaWNfY2xhc3MgICAgID0gY21kLmRlc3QudHJhZmZpY19jbGFzczsKKwlhdHRyLT5haF9hdHRyLmRsaWQgCSAgICAJICAgID0gY21kLmRlc3QuZGxpZDsKKwlhdHRyLT5haF9hdHRyLnNsICAgCSAgICAJICAgID0gY21kLmRlc3Quc2w7CisJYXR0ci0+YWhfYXR0ci5zcmNfcGF0aF9iaXRzIAkgICAgPSBjbWQuZGVzdC5zcmNfcGF0aF9iaXRzOworCWF0dHItPmFoX2F0dHIuc3RhdGljX3JhdGUgICAJICAgID0gY21kLmRlc3Quc3RhdGljX3JhdGU7CisJYXR0ci0+YWhfYXR0ci5haF9mbGFncyAJICAgIAkgICAgPSBjbWQuZGVzdC5pc19nbG9iYWwgPyBJQl9BSF9HUkggOiAwOworCWF0dHItPmFoX2F0dHIucG9ydF9udW0gCSAgICAJICAgID0gY21kLmRlc3QucG9ydF9udW07CisKKwltZW1jcHkoYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLmRnaWQucmF3LCBjbWQuYWx0X2Rlc3QuZGdpZCwgMTYpOworCWF0dHItPmFsdF9haF9hdHRyLmdyaC5mbG93X2xhYmVsICAgID0gY21kLmFsdF9kZXN0LmZsb3dfbGFiZWw7CisJYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLnNnaWRfaW5kZXggICAgPSBjbWQuYWx0X2Rlc3Quc2dpZF9pbmRleDsKKwlhdHRyLT5hbHRfYWhfYXR0ci5ncmguaG9wX2xpbWl0ICAgICA9IGNtZC5hbHRfZGVzdC5ob3BfbGltaXQ7CisJYXR0ci0+YWx0X2FoX2F0dHIuZ3JoLnRyYWZmaWNfY2xhc3MgPSBjbWQuYWx0X2Rlc3QudHJhZmZpY19jbGFzczsKKwlhdHRyLT5hbHRfYWhfYXR0ci5kbGlkIAkgICAgCSAgICA9IGNtZC5hbHRfZGVzdC5kbGlkOworCWF0dHItPmFsdF9haF9hdHRyLnNsICAgCSAgICAJICAgID0gY21kLmFsdF9kZXN0LnNsOworCWF0dHItPmFsdF9haF9hdHRyLnNyY19wYXRoX2JpdHMgICAgID0gY21kLmFsdF9kZXN0LnNyY19wYXRoX2JpdHM7CisJYXR0ci0+YWx0X2FoX2F0dHIuc3RhdGljX3JhdGUgICAgICAgPSBjbWQuYWx0X2Rlc3Quc3RhdGljX3JhdGU7CisJYXR0ci0+YWx0X2FoX2F0dHIuYWhfZmxhZ3MgCSAgICA9IGNtZC5hbHRfZGVzdC5pc19nbG9iYWwgPyBJQl9BSF9HUkggOiAwOworCWF0dHItPmFsdF9haF9hdHRyLnBvcnRfbnVtIAkgICAgPSBjbWQuYWx0X2Rlc3QucG9ydF9udW07CisKKwlyZXQgPSBpYl9tb2RpZnlfcXAocXAsIGF0dHIsIGNtZC5hdHRyX21hc2spOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaW5fbGVuOworCitvdXQ6CisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCWtmcmVlKGF0dHIpOworCisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBpYl91dmVyYnNfZGVzdHJveV9xcChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgIGludCBvdXRfbGVuKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9xcCBjbWQ7CisJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgKnFwOworCXN0cnVjdCBpYl91b2JqZWN0ICAgICAgICAgICp1b2JqOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZjbWQsIGJ1Ziwgc2l6ZW9mIGNtZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlxcCA9IGlkcl9maW5kKCZpYl91dmVyYnNfcXBfaWRyLCBjbWQucXBfaGFuZGxlKTsKKwlpZiAoIXFwIHx8IHFwLT51b2JqZWN0LT5jb250ZXh0ICE9IGZpbGUtPnVjb250ZXh0KQorCQlnb3RvIG91dDsKKworCXVvYmogPSBxcC0+dW9iamVjdDsKKworCXJldCA9IGliX2Rlc3Ryb3lfcXAocXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT51Y29udGV4dC0+bG9jayk7CisJbGlzdF9kZWwoJnVvYmotPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+dWNvbnRleHQtPmxvY2spOworCisJa2ZyZWUodW9iaik7CisKK291dDoKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogaW5fbGVuOworfQorCitzc2l6ZV90IGliX3V2ZXJic19hdHRhY2hfbWNhc3Qoc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBpbl9sZW4sCisJCQkgICAgICAgaW50IG91dF9sZW4pCit7CisJc3RydWN0IGliX3V2ZXJic19hdHRhY2hfbWNhc3QgY21kOworCXN0cnVjdCBpYl9xcCAgICAgICAgICAgICAgICAgKnFwOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgYnVmLCBzaXplb2YgY21kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkb3duKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXFwID0gaWRyX2ZpbmQoJmliX3V2ZXJic19xcF9pZHIsIGNtZC5xcF9oYW5kbGUpOworCWlmIChxcCAmJiBxcC0+dW9iamVjdC0+Y29udGV4dCA9PSBmaWxlLT51Y29udGV4dCkKKwkJcmV0ID0gaWJfYXR0YWNoX21jYXN0KHFwLCAodW5pb24gaWJfZ2lkICopIGNtZC5naWQsIGNtZC5tbGlkKTsKKworCXVwKCZpYl91dmVyYnNfaWRyX211dGV4KTsKKworCXJldHVybiByZXQgPyByZXQgOiBpbl9sZW47Cit9CisKK3NzaXplX3QgaWJfdXZlcmJzX2RldGFjaF9tY2FzdChzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGluX2xlbiwKKwkJCSAgICAgICBpbnQgb3V0X2xlbikKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2RldGFjaF9tY2FzdCBjbWQ7CisJc3RydWN0IGliX3FwICAgICAgICAgICAgICAgICAqcXA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCBidWYsIHNpemVvZiBjbWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgY21kLnFwX2hhbmRsZSk7CisJaWYgKHFwICYmIHFwLT51b2JqZWN0LT5jb250ZXh0ID09IGZpbGUtPnVjb250ZXh0KQorCQlyZXQgPSBpYl9kZXRhY2hfbWNhc3QocXAsICh1bmlvbiBpYl9naWQgKikgY21kLmdpZCwgY21kLm1saWQpOworCisJdXAoJmliX3V2ZXJic19pZHJfbXV0ZXgpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGluX2xlbjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmUwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogJElkOiB1dmVyYnNfbWFpbi5jIDI3MzMgMjAwNS0wNi0yOCAxOToxNDozNFogcm9sYW5kICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInV2ZXJicy5oIgorCitNT0RVTEVfQVVUSE9SKCJSb2xhbmQgRHJlaWVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkluZmluaUJhbmQgdXNlcnNwYWNlIHZlcmJzIGFjY2VzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCisjZGVmaW5lIElORklOSUJBTkRFVkVOVEZTX01BR0lDCTB4NDk0MjY1NzYJLyogIklCZXYiICovCisKK2VudW0geworCUlCX1VWRVJCU19NQUpPUiAgICAgICA9IDIzMSwKKwlJQl9VVkVSQlNfQkFTRV9NSU5PUiAgPSAxOTIsCisJSUJfVVZFUkJTX01BWF9ERVZJQ0VTID0gMzIKK307CisKKyNkZWZpbmUgSUJfVVZFUkJTX0JBU0VfREVWCU1LREVWKElCX1VWRVJCU19NQUpPUiwgSUJfVVZFUkJTX0JBU0VfTUlOT1IpCisKK0RFQ0xBUkVfTVVURVgoaWJfdXZlcmJzX2lkcl9tdXRleCk7CitERUZJTkVfSURSKGliX3V2ZXJic19wZF9pZHIpOworREVGSU5FX0lEUihpYl91dmVyYnNfbXJfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX213X2lkcik7CitERUZJTkVfSURSKGliX3V2ZXJic19haF9pZHIpOworREVGSU5FX0lEUihpYl91dmVyYnNfY3FfaWRyKTsKK0RFRklORV9JRFIoaWJfdXZlcmJzX3FwX2lkcik7CisKK3N0YXRpYyBzcGlubG9ja190IG1hcF9sb2NrOworc3RhdGljIERFQ0xBUkVfQklUTUFQKGRldl9tYXAsIElCX1VWRVJCU19NQVhfREVWSUNFUyk7CisKK3N0YXRpYyBzc2l6ZV90ICgqdXZlcmJzX2NtZF90YWJsZVtdKShzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkJICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgaW5fbGVuLAorCQkJCSAgICAgaW50IG91dF9sZW4pID0geworCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QQVJBTVNdICA9IGliX3V2ZXJic19xdWVyeV9wYXJhbXMsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0dFVF9DT05URVhUXSAgID0gaWJfdXZlcmJzX2dldF9jb250ZXh0LAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9ERVZJQ0VdICA9IGliX3V2ZXJic19xdWVyeV9kZXZpY2UsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1BPUlRdICAgID0gaWJfdXZlcmJzX3F1ZXJ5X3BvcnQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX0dJRF0gICAgID0gaWJfdXZlcmJzX3F1ZXJ5X2dpZCwKKwlbSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEtFWV0gICAgPSBpYl91dmVyYnNfcXVlcnlfcGtleSwKKwlbSUJfVVNFUl9WRVJCU19DTURfQUxMT0NfUERdICAgICAgPSBpYl91dmVyYnNfYWxsb2NfcGQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfUERdICAgID0gaWJfdXZlcmJzX2RlYWxsb2NfcGQsCisJW0lCX1VTRVJfVkVSQlNfQ01EX1JFR19NUl0gICAgICAgID0gaWJfdXZlcmJzX3JlZ19tciwKKwlbSUJfVVNFUl9WRVJCU19DTURfREVSRUdfTVJdICAgICAgPSBpYl91dmVyYnNfZGVyZWdfbXIsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0NSRUFURV9DUV0gICAgID0gaWJfdXZlcmJzX2NyZWF0ZV9jcSwKKwlbSUJfVVNFUl9WRVJCU19DTURfREVTVFJPWV9DUV0gICAgPSBpYl91dmVyYnNfZGVzdHJveV9jcSwKKwlbSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1FQXSAgICAgPSBpYl91dmVyYnNfY3JlYXRlX3FwLAorCVtJQl9VU0VSX1ZFUkJTX0NNRF9NT0RJRllfUVBdICAgICA9IGliX3V2ZXJic19tb2RpZnlfcXAsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfUVBdICAgID0gaWJfdXZlcmJzX2Rlc3Ryb3lfcXAsCisJW0lCX1VTRVJfVkVSQlNfQ01EX0FUVEFDSF9NQ0FTVF0gID0gaWJfdXZlcmJzX2F0dGFjaF9tY2FzdCwKKwlbSUJfVVNFUl9WRVJCU19DTURfREVUQUNIX01DQVNUXSAgPSBpYl91dmVyYnNfZGV0YWNoX21jYXN0LAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqdXZlcmJzX2V2ZW50X21udDsKKworc3RhdGljIHZvaWQgaWJfdXZlcmJzX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqZGV2aWNlKTsKK3N0YXRpYyB2b2lkIGliX3V2ZXJic19yZW1vdmVfb25lKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSk7CisKK3N0YXRpYyBpbnQgaWJfZGVhbGxvY191Y29udGV4dChzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQpCit7CisJc3RydWN0IGliX3VvYmplY3QgKnVvYmosICp0bXA7CisKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAwOworCisJZG93bigmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwkvKiBYWFggRnJlZSBBSHMgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5xcF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl9xcCAqcXAgPSBpZHJfZmluZCgmaWJfdXZlcmJzX3FwX2lkciwgdW9iai0+aWQpOworCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfcXBfaWRyLCB1b2JqLT5pZCk7CisJCWliX2Rlc3Ryb3lfcXAocXApOworCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJCWtmcmVlKHVvYmopOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5jcV9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl9jcSAqY3EgPSBpZHJfZmluZCgmaWJfdXZlcmJzX2NxX2lkciwgdW9iai0+aWQpOworCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfY3FfaWRyLCB1b2JqLT5pZCk7CisJCWliX2Rlc3Ryb3lfY3EoY3EpOworCQlsaXN0X2RlbCgmdW9iai0+bGlzdCk7CisJCWtmcmVlKHVvYmopOworCX0KKworCS8qIFhYWCBGcmVlIFNSUXMgKi8KKwkvKiBYWFggRnJlZSBNV3MgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh1b2JqLCB0bXAsICZjb250ZXh0LT5tcl9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBpYl9tciAqbXIgPSBpZHJfZmluZCgmaWJfdXZlcmJzX21yX2lkciwgdW9iai0+aWQpOworCQlzdHJ1Y3QgaWJfdW1lbV9vYmplY3QgKm1lbW9iajsKKworCQlpZHJfcmVtb3ZlKCZpYl91dmVyYnNfbXJfaWRyLCB1b2JqLT5pZCk7CisJCWliX2RlcmVnX21yKG1yKTsKKworCQltZW1vYmogPSBjb250YWluZXJfb2YodW9iaiwgc3RydWN0IGliX3VtZW1fb2JqZWN0LCB1b2JqZWN0KTsKKwkJaWJfdW1lbV9yZWxlYXNlX29uX2Nsb3NlKG1yLT5kZXZpY2UsICZtZW1vYmotPnVtZW0pOworCisJCWxpc3RfZGVsKCZ1b2JqLT5saXN0KTsKKwkJa2ZyZWUobWVtb2JqKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW9iaiwgdG1wLCAmY29udGV4dC0+cGRfbGlzdCwgbGlzdCkgeworCQlzdHJ1Y3QgaWJfcGQgKnBkID0gaWRyX2ZpbmQoJmliX3V2ZXJic19wZF9pZHIsIHVvYmotPmlkKTsKKwkJaWRyX3JlbW92ZSgmaWJfdXZlcmJzX3BkX2lkciwgdW9iai0+aWQpOworCQlpYl9kZWFsbG9jX3BkKHBkKTsKKwkJbGlzdF9kZWwoJnVvYmotPmxpc3QpOworCQlrZnJlZSh1b2JqKTsKKwl9CisKKwl1cCgmaWJfdXZlcmJzX2lkcl9tdXRleCk7CisKKwlyZXR1cm4gY29udGV4dC0+ZGV2aWNlLT5kZWFsbG9jX3Vjb250ZXh0KGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVsZWFzZV9maWxlKHN0cnVjdCBrcmVmICpyZWYpCit7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3RydWN0IGliX3V2ZXJic19maWxlLCByZWYpOworCisJbW9kdWxlX3B1dChmaWxlLT5kZXZpY2UtPmliX2Rldi0+b3duZXIpOworCWtmcmVlKGZpbGUpOworfQorCitzdGF0aWMgc3NpemVfdCBpYl91dmVyYnNfZXZlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdm9pZCAqZXZlbnQ7CisJaW50IGV2ZW50c3o7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKworCXdoaWxlIChsaXN0X2VtcHR5KCZmaWxlLT5ldmVudF9saXN0KSAmJiBmaWxlLT5mZCA+PSAwKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmZmlsZS0+bG9jayk7CisKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShmaWxlLT5wb2xsX3dhaXQsCisJCQkJCSAgICAgIWxpc3RfZW1wdHkoJmZpbGUtPmV2ZW50X2xpc3QpIHx8CisJCQkJCSAgICAgZmlsZS0+ZmQgPCAwKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwkJc3Bpbl9sb2NrX2lycSgmZmlsZS0+bG9jayk7CisJfQorCisJaWYgKGZpbGUtPmZkIDwgMCkgeworCQlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZmlsZS0+aXNfYXN5bmMpIHsKKwkJZXZlbnQgICA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LAorCQkJCSAgICAgc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCwgbGlzdCk7CisJCWV2ZW50c3ogPSBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnRfZGVzYyk7CisJfSBlbHNlIHsKKwkJZXZlbnQgICA9IGxpc3RfZW50cnkoZmlsZS0+ZXZlbnRfbGlzdC5uZXh0LAorCQkJCSAgICAgc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50LCBsaXN0KTsKKwkJZXZlbnRzeiA9IHNpemVvZiAoc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50X2Rlc2MpOworCX0KKworCWlmIChldmVudHN6ID4gY291bnQpIHsKKwkJcmV0ICAgPSAtRUlOVkFMOworCQlldmVudCA9IE5VTEw7CisJfSBlbHNlCisJCWxpc3RfZGVsKGZpbGUtPmV2ZW50X2xpc3QubmV4dCk7CisKKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworCisJaWYgKGV2ZW50KSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBldmVudCwgZXZlbnRzeikpCisJCQlyZXQgPSAtRUZBVUxUOworCQllbHNlCisJCQlyZXQgPSBldmVudHN6OworCX0KKworCWtmcmVlKGV2ZW50KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWJfdXZlcmJzX2V2ZW50X3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJCSBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdW5zaWduZWQgaW50IHBvbGxmbGFncyA9IDA7CisJc3RydWN0IGliX3V2ZXJic19ldmVudF9maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbHAsICZmaWxlLT5wb2xsX3dhaXQsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycSgmZmlsZS0+bG9jayk7CisJaWYgKGZpbGUtPmZkIDwgMCkKKwkJcG9sbGZsYWdzID0gUE9MTEVSUjsKKwllbHNlIGlmICghbGlzdF9lbXB0eSgmZmlsZS0+ZXZlbnRfbGlzdCkpCisJCXBvbGxmbGFncyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJc3Bpbl91bmxvY2tfaXJxKCZmaWxlLT5sb2NrKTsKKworCXJldHVybiBwb2xsZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkIGliX3V2ZXJic19ldmVudF9yZWxlYXNlKHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKnRtcDsKKworCXNwaW5fbG9ja19pcnEoJmZpbGUtPmxvY2spOworCWlmIChmaWxlLT5mZCAhPSAtMSkgeworCQlmaWxlLT5mZCA9IC0xOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cnksIHRtcCwgJmZpbGUtPmV2ZW50X2xpc3QpCisJCQlpZiAoZmlsZS0+aXNfYXN5bmMpCisJCQkJa2ZyZWUobGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGliX3V2ZXJic19hc3luY19ldmVudCwgbGlzdCkpOworCQkJZWxzZQorCQkJCWtmcmVlKGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudCwgbGlzdCkpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmZpbGUtPmxvY2spOworfQorCitzdGF0aWMgaW50IGliX3V2ZXJic19ldmVudF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2V2ZW50X2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlpYl91dmVyYnNfZXZlbnRfcmVsZWFzZShmaWxlKTsKKwlrcmVmX3B1dCgmZmlsZS0+dXZlcmJzX2ZpbGUtPnJlZiwgaWJfdXZlcmJzX3JlbGVhc2VfZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXZlcmJzX2V2ZW50X2ZvcHMgPSB7CisJLyoKKwkgKiBObyAub3duZXIgZmllbGQgc2luY2Ugd2UgYXJ0aWZpY2lhbGx5IGNyZWF0ZSBldmVudCBmaWxlcywKKwkgKiBzbyB0aGVyZSBpcyBubyBpbmNyZW1lbnQgdG8gdGhlIG1vZHVsZSByZWZlcmVuY2UgY291bnQgaW4KKwkgKiB0aGUgb3BlbiBwYXRoLiAgQWxsIGV2ZW50IGZpbGVzIGNvbWUgZnJvbSBhIHV2ZXJicyBjb21tYW5kCisJICogZmlsZSwgd2hpY2ggYWxyZWFkeSB0YWtlcyBhIG1vZHVsZSByZWZlcmVuY2UsIHNvIHRoaXMgaXMgT0suCisJICovCisJLnJlYWQgCSA9IGliX3V2ZXJic19ldmVudF9yZWFkLAorCS5wb2xsICAgID0gaWJfdXZlcmJzX2V2ZW50X3BvbGwsCisJLnJlbGVhc2UgPSBpYl91dmVyYnNfZXZlbnRfY2xvc2UKK307CisKK3ZvaWQgaWJfdXZlcmJzX2NvbXBfaGFuZGxlcihzdHJ1Y3QgaWJfY3EgKmNxLCB2b2lkICpjcV9jb250ZXh0KQoreworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAgICAgICAqZmlsZSA9IGNxX2NvbnRleHQ7CisJc3RydWN0IGliX3V2ZXJic19jb21wX2V2ZW50ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGZsYWdzOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZiAqZW50cnksIEdGUF9BVE9NSUMpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT5kZXNjLmNxX2hhbmRsZSA9IGNxLT51b2JqZWN0LT51c2VyX2hhbmRsZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmaWxlLT5jb21wX2ZpbGVbMF0ubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmZmlsZS0+Y29tcF9maWxlWzBdLmV2ZW50X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbGUtPmNvbXBfZmlsZVswXS5sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZpbGUtPmNvbXBfZmlsZVswXS5wb2xsX3dhaXQpOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfYXN5bmNfaGFuZGxlcihzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUsCisJCQkJICAgIF9fdTY0IGVsZW1lbnQsIF9fdTY0IGV2ZW50KQoreworCXN0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnQgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwllbnRyeSA9IGttYWxsb2Moc2l6ZW9mICplbnRyeSwgR0ZQX0FUT01JQyk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuOworCisJZW50cnktPmRlc2MuZWxlbWVudCAgICA9IGVsZW1lbnQ7CisJZW50cnktPmRlc2MuZXZlbnRfdHlwZSA9IGV2ZW50OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZpbGUtPmFzeW5jX2ZpbGUubG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmZmlsZS0+YXN5bmNfZmlsZS5ldmVudF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaWxlLT5hc3luY19maWxlLmxvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZmlsZS0+YXN5bmNfZmlsZS5wb2xsX3dhaXQpOworfQorCit2b2lkIGliX3V2ZXJic19jcV9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKQoreworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLAorCQkJCWV2ZW50LT5lbGVtZW50LmNxLT51b2JqZWN0LT51c2VyX2hhbmRsZSwKKwkJCQlldmVudC0+ZXZlbnQpOworfQorCit2b2lkIGliX3V2ZXJic19xcF9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudCAqZXZlbnQsIHZvaWQgKmNvbnRleHRfcHRyKQoreworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGNvbnRleHRfcHRyLAorCQkJCWV2ZW50LT5lbGVtZW50LnFwLT51b2JqZWN0LT51c2VyX2hhbmRsZSwKKwkJCQlldmVudC0+ZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgaWJfZXZlbnRfaGFuZGxlciAqaGFuZGxlciwKKwkJCQkgICAgc3RydWN0IGliX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUgPQorCQljb250YWluZXJfb2YoaGFuZGxlciwgc3RydWN0IGliX3V2ZXJic19maWxlLCBldmVudF9oYW5kbGVyKTsKKworCWliX3V2ZXJic19hc3luY19oYW5kbGVyKGZpbGUsIGV2ZW50LT5lbGVtZW50LnBvcnRfbnVtLCBldmVudC0+ZXZlbnQpOworfQorCitzdGF0aWMgaW50IGliX3V2ZXJic19ldmVudF9pbml0KHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKnV2ZXJic19maWxlKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCisJc3Bpbl9sb2NrX2luaXQoJmZpbGUtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT5ldmVudF9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmaWxlLT5wb2xsX3dhaXQpOworCWZpbGUtPnV2ZXJic19maWxlID0gdXZlcmJzX2ZpbGU7CisKKwlmaWxlLT5mZCA9IGdldF91bnVzZWRfZmQoKTsKKwlpZiAoZmlsZS0+ZmQgPCAwKQorCQlyZXR1cm4gZmlsZS0+ZmQ7CisKKwlmaWxwID0gZ2V0X2VtcHR5X2ZpbHAoKTsKKwlpZiAoIWZpbHApIHsKKwkJcHV0X3VudXNlZF9mZChmaWxlLT5mZCk7CisJCXJldHVybiAtRU5GSUxFOworCX0KKworCWZpbHAtPmZfb3AgCSAgID0gJnV2ZXJic19ldmVudF9mb3BzOworCWZpbHAtPmZfdmZzbW50IAkgICA9IG1udGdldCh1dmVyYnNfZXZlbnRfbW50KTsKKwlmaWxwLT5mX2RlbnRyeSAJICAgPSBkZ2V0KHV2ZXJic19ldmVudF9tbnQtPm1udF9yb290KTsKKwlmaWxwLT5mX21hcHBpbmcgICAgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOworCWZpbHAtPmZfZmxhZ3MgICAgICA9IE9fUkRPTkxZOworCWZpbHAtPmZfbW9kZSAgICAgICA9IEZNT0RFX1JFQUQ7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmlsZTsKKworCWZkX2luc3RhbGwoZmlsZS0+ZmQsIGZpbHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGliX3V2ZXJic193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGliX3V2ZXJic19jbWRfaGRyIGhkcjsKKworCWlmIChjb3VudCA8IHNpemVvZiBoZHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZoZHIsIGJ1Ziwgc2l6ZW9mIGhkcikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGhkci5pbl93b3JkcyAqIDQgIT0gY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhkci5jb21tYW5kIDwgMCB8fCBoZHIuY29tbWFuZCA+PSBBUlJBWV9TSVpFKHV2ZXJic19jbWRfdGFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZmlsZS0+dWNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKwkgICAgaGRyLmNvbW1hbmQgIT0gSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEFSQU1TICYmCisJICAgIGhkci5jb21tYW5kICE9IElCX1VTRVJfVkVSQlNfQ01EX0dFVF9DT05URVhUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB1dmVyYnNfY21kX3RhYmxlW2hkci5jb21tYW5kXShmaWxlLCBidWYgKyBzaXplb2YgaGRyLAorCQkJCQkgICAgIGhkci5pbl93b3JkcyAqIDQsIGhkci5vdXRfd29yZHMgKiA0KTsKK30KKworc3RhdGljIGludCBpYl91dmVyYnNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGliX3V2ZXJic19maWxlICpmaWxlID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFmaWxlLT51Y29udGV4dCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZWxzZQorCQlyZXR1cm4gZmlsZS0+ZGV2aWNlLT5pYl9kZXYtPm1tYXAoZmlsZS0+dWNvbnRleHQsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgaWJfdXZlcmJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKmRldiA9CisJCWNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSwgZGV2KTsKKwlzdHJ1Y3QgaWJfdXZlcmJzX2ZpbGUgKmZpbGU7CisJaW50IGkgPSAwOworCWludCByZXQ7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+aWJfZGV2LT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJZmlsZSA9IGttYWxsb2Moc2l6ZW9mICpmaWxlICsKKwkJICAgICAgIChkZXYtPm51bV9jb21wIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBpYl91dmVyYnNfZXZlbnRfZmlsZSksCisJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlsZS0+ZGV2aWNlID0gZGV2OworCWtyZWZfaW5pdCgmZmlsZS0+cmVmKTsKKworCWZpbGUtPnVjb250ZXh0ID0gTlVMTDsKKworCXJldCA9IGliX3V2ZXJic19ldmVudF9pbml0KCZmaWxlLT5hc3luY19maWxlLCBmaWxlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWZpbGUtPmFzeW5jX2ZpbGUuaXNfYXN5bmMgPSAxOworCisJa3JlZl9nZXQoJmZpbGUtPnJlZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fY29tcDsgKytpKSB7CisJCXJldCA9IGliX3V2ZXJic19ldmVudF9pbml0KCZmaWxlLT5jb21wX2ZpbGVbaV0sIGZpbGUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfYXN5bmM7CisJCWtyZWZfZ2V0KCZmaWxlLT5yZWYpOworCQlmaWxlLT5jb21wX2ZpbGVbaV0uaXNfYXN5bmMgPSAwOworCX0KKworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmlsZTsKKworCUlOSVRfSUJfRVZFTlRfSEFORExFUigmZmlsZS0+ZXZlbnRfaGFuZGxlciwgZGV2LT5pYl9kZXYsCisJCQkgICAgICBpYl91dmVyYnNfZXZlbnRfaGFuZGxlcik7CisJaWYgKGliX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIoJmZpbGUtPmV2ZW50X2hhbmRsZXIpKQorCQlnb3RvIGVycl9hc3luYzsKKworCXJldHVybiAwOworCitlcnJfYXN5bmM6CisJd2hpbGUgKGktLSkKKwkJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmNvbXBfZmlsZVtpXSk7CisKKwlpYl91dmVyYnNfZXZlbnRfcmVsZWFzZSgmZmlsZS0+YXN5bmNfZmlsZSk7CisKK2VycjoKKwlrcmVmX3B1dCgmZmlsZS0+cmVmLCBpYl91dmVyYnNfcmVsZWFzZV9maWxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaWJfdXZlcmJzX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBpYl91dmVyYnNfZmlsZSAqZmlsZSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgaTsKKworCWliX3VucmVnaXN0ZXJfZXZlbnRfaGFuZGxlcigmZmlsZS0+ZXZlbnRfaGFuZGxlcik7CisJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmFzeW5jX2ZpbGUpOworCWliX2RlYWxsb2NfdWNvbnRleHQoZmlsZS0+dWNvbnRleHQpOworCisJZm9yIChpID0gMDsgaSA8IGZpbGUtPmRldmljZS0+bnVtX2NvbXA7ICsraSkKKwkJaWJfdXZlcmJzX2V2ZW50X3JlbGVhc2UoJmZpbGUtPmNvbXBfZmlsZVtpXSk7CisKKwlrcmVmX3B1dCgmZmlsZS0+cmVmLCBpYl91dmVyYnNfcmVsZWFzZV9maWxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1dmVyYnNfZm9wcyA9IHsKKwkub3duZXIgCSA9IFRISVNfTU9EVUxFLAorCS53cml0ZSAJID0gaWJfdXZlcmJzX3dyaXRlLAorCS5vcGVuIAkgPSBpYl91dmVyYnNfb3BlbiwKKwkucmVsZWFzZSA9IGliX3V2ZXJic19jbG9zZQorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXZlcmJzX21tYXBfZm9wcyA9IHsKKwkub3duZXIgCSA9IFRISVNfTU9EVUxFLAorCS53cml0ZSAJID0gaWJfdXZlcmJzX3dyaXRlLAorCS5tbWFwICAgID0gaWJfdXZlcmJzX21tYXAsCisJLm9wZW4gCSA9IGliX3V2ZXJic19vcGVuLAorCS5yZWxlYXNlID0gaWJfdXZlcmJzX2Nsb3NlCit9OworCitzdGF0aWMgc3RydWN0IGliX2NsaWVudCB1dmVyYnNfY2xpZW50ID0geworCS5uYW1lICAgPSAidXZlcmJzIiwKKwkuYWRkICAgID0gaWJfdXZlcmJzX2FkZF9vbmUsCisJLnJlbW92ZSA9IGliX3V2ZXJic19yZW1vdmVfb25lCit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X2liZGV2KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYgPQorCQljb250YWluZXJfb2YoY2xhc3NfZGV2LCBzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSwgY2xhc3NfZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkZXYtPmliX2Rldi0+bmFtZSk7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoaWJkZXYsIFNfSVJVR08sIHNob3dfaWJkZXYsIE5VTEwpOworCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVsZWFzZV9jbGFzc19kZXYoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2KQoreworCXN0cnVjdCBpYl91dmVyYnNfZGV2aWNlICpkZXYgPQorCQljb250YWluZXJfb2YoY2xhc3NfZGV2LCBzdHJ1Y3QgaWJfdXZlcmJzX2RldmljZSwgY2xhc3NfZGV2KTsKKworCWNkZXZfZGVsKCZkZXYtPmRldik7CisJY2xlYXJfYml0KGRldi0+ZGV2bnVtLCBkZXZfbWFwKTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGNsYXNzIHV2ZXJic19jbGFzcyA9IHsKKwkubmFtZSAgICA9ICJpbmZpbmliYW5kX3ZlcmJzIiwKKwkucmVsZWFzZSA9IGliX3V2ZXJic19yZWxlYXNlX2NsYXNzX2RldgorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19hYmlfdmVyc2lvbihzdHJ1Y3QgY2xhc3MgKmNsYXNzLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElCX1VTRVJfVkVSQlNfQUJJX1ZFUlNJT04pOworfQorc3RhdGljIENMQVNTX0FUVFIoYWJpX3ZlcnNpb24sIFNfSVJVR08sIHNob3dfYWJpX3ZlcnNpb24sIE5VTEwpOworCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfYWRkX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKnV2ZXJic19kZXY7CisKKwlpZiAoIWRldmljZS0+YWxsb2NfdWNvbnRleHQpCisJCXJldHVybjsKKworCXV2ZXJic19kZXYgPSBrbWFsbG9jKHNpemVvZiAqdXZlcmJzX2RldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1dmVyYnNfZGV2KQorCQlyZXR1cm47CisKKwltZW1zZXQodXZlcmJzX2RldiwgMCwgc2l6ZW9mICp1dmVyYnNfZGV2KTsKKworCXNwaW5fbG9jaygmbWFwX2xvY2spOworCXV2ZXJic19kZXYtPmRldm51bSA9IGZpbmRfZmlyc3RfemVyb19iaXQoZGV2X21hcCwgSUJfVVZFUkJTX01BWF9ERVZJQ0VTKTsKKwlpZiAodXZlcmJzX2Rldi0+ZGV2bnVtID49IElCX1VWRVJCU19NQVhfREVWSUNFUykgeworCQlzcGluX3VubG9jaygmbWFwX2xvY2spOworCQlnb3RvIGVycjsKKwl9CisJc2V0X2JpdCh1dmVyYnNfZGV2LT5kZXZudW0sIGRldl9tYXApOworCXNwaW5fdW5sb2NrKCZtYXBfbG9jayk7CisKKwl1dmVyYnNfZGV2LT5pYl9kZXYgICA9IGRldmljZTsKKwl1dmVyYnNfZGV2LT5udW1fY29tcCA9IDE7CisKKwlpZiAoZGV2aWNlLT5tbWFwKQorCQljZGV2X2luaXQoJnV2ZXJic19kZXYtPmRldiwgJnV2ZXJic19tbWFwX2ZvcHMpOworCWVsc2UKKwkJY2Rldl9pbml0KCZ1dmVyYnNfZGV2LT5kZXYsICZ1dmVyYnNfZm9wcyk7CisJdXZlcmJzX2Rldi0+ZGV2Lm93bmVyID0gVEhJU19NT0RVTEU7CisJa29iamVjdF9zZXRfbmFtZSgmdXZlcmJzX2Rldi0+ZGV2LmtvYmosICJ1dmVyYnMlZCIsIHV2ZXJic19kZXYtPmRldm51bSk7CisJaWYgKGNkZXZfYWRkKCZ1dmVyYnNfZGV2LT5kZXYsIElCX1VWRVJCU19CQVNFX0RFViArIHV2ZXJic19kZXYtPmRldm51bSwgMSkpCisJCWdvdG8gZXJyOworCisJdXZlcmJzX2Rldi0+Y2xhc3NfZGV2LmNsYXNzID0gJnV2ZXJic19jbGFzczsKKwl1dmVyYnNfZGV2LT5jbGFzc19kZXYuZGV2ICAgPSBkZXZpY2UtPmRtYV9kZXZpY2U7CisJdXZlcmJzX2Rldi0+Y2xhc3NfZGV2LmRldnQgID0gdXZlcmJzX2Rldi0+ZGV2LmRldjsKKwlzbnByaW50Zih1dmVyYnNfZGV2LT5jbGFzc19kZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCAidXZlcmJzJWQiLCB1dmVyYnNfZGV2LT5kZXZudW0pOworCWlmIChjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJnV2ZXJic19kZXYtPmNsYXNzX2RldikpCisJCWdvdG8gZXJyX2NkZXY7CisKKwlpZiAoY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZ1dmVyYnNfZGV2LT5jbGFzc19kZXYsICZjbGFzc19kZXZpY2VfYXR0cl9pYmRldikpCisJCWdvdG8gZXJyX2NsYXNzOworCisJaWJfc2V0X2NsaWVudF9kYXRhKGRldmljZSwgJnV2ZXJic19jbGllbnQsIHV2ZXJic19kZXYpOworCisJcmV0dXJuOworCitlcnJfY2xhc3M6CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJnV2ZXJic19kZXYtPmNsYXNzX2Rldik7CisKK2Vycl9jZGV2OgorCWNkZXZfZGVsKCZ1dmVyYnNfZGV2LT5kZXYpOworCWNsZWFyX2JpdCh1dmVyYnNfZGV2LT5kZXZudW0sIGRldl9tYXApOworCitlcnI6CisJa2ZyZWUodXZlcmJzX2Rldik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBpYl91dmVyYnNfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGliX3V2ZXJic19kZXZpY2UgKnV2ZXJic19kZXYgPSBpYl9nZXRfY2xpZW50X2RhdGEoZGV2aWNlLCAmdXZlcmJzX2NsaWVudCk7CisKKwlpZiAoIXV2ZXJic19kZXYpCisJCXJldHVybjsKKworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZ1dmVyYnNfZGV2LT5jbGFzc19kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICp1dmVyYnNfZXZlbnRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiaW5maW5pYmFuZGV2ZW50OiIsIE5VTEwsCisJCQkgICAgIElORklOSUJBTkRFVkVOVEZTX01BR0lDKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHV2ZXJic19ldmVudF9mcyA9IHsKKwkvKiBObyBvd25lciBmaWVsZCBzbyBtb2R1bGUgY2FuIGJlIHVubG9hZGVkICovCisJLm5hbWUgICAgPSAiaW5maW5pYmFuZGV2ZW50ZnMiLAorCS5nZXRfc2IgID0gdXZlcmJzX2V2ZW50X2dldF9zYiwKKwkua2lsbF9zYiA9IGtpbGxfbGl0dGVyX3N1cGVyCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpYl91dmVyYnNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmbWFwX2xvY2spOworCisJcmV0ID0gcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihJQl9VVkVSQlNfQkFTRV9ERVYsIElCX1VWRVJCU19NQVhfREVWSUNFUywKKwkJCQkgICAgICJpbmZpbmliYW5kX3ZlcmJzIik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInVzZXJfdmVyYnM6IGNvdWxkbid0IHJlZ2lzdGVyIGRldmljZSBudW1iZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBjbGFzc19yZWdpc3RlcigmdXZlcmJzX2NsYXNzKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgY3JlYXRlIGNsYXNzIGluZmluaWJhbmRfdmVyYnNcbiIpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQorCisJcmV0ID0gY2xhc3NfY3JlYXRlX2ZpbGUoJnV2ZXJic19jbGFzcywgJmNsYXNzX2F0dHJfYWJpX3ZlcnNpb24pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2VyX3ZlcmJzOiBjb3VsZG4ndCBjcmVhdGUgYWJpX3ZlcnNpb24gYXR0cmlidXRlXG4iKTsKKwkJZ290byBvdXRfY2xhc3M7CisJfQorCisJcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdXZlcmJzX2V2ZW50X2ZzKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgcmVnaXN0ZXIgaW5maW5pYmFuZGV2ZW50ZnNcbiIpOworCQlnb3RvIG91dF9jbGFzczsKKwl9CisKKwl1dmVyYnNfZXZlbnRfbW50ID0ga2Vybl9tb3VudCgmdXZlcmJzX2V2ZW50X2ZzKTsKKwlpZiAoSVNfRVJSKHV2ZXJic19ldmVudF9tbnQpKSB7CisJCXJldCA9IFBUUl9FUlIodXZlcmJzX2V2ZW50X21udCk7CisJCXByaW50ayhLRVJOX0VSUiAidXNlcl92ZXJiczogY291bGRuJ3QgbW91bnQgaW5maW5pYmFuZGV2ZW50ZnNcbiIpOworCQlnb3RvIG91dF9mczsKKwl9CisKKwlyZXQgPSBpYl9yZWdpc3Rlcl9jbGllbnQoJnV2ZXJic19jbGllbnQpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1c2VyX3ZlcmJzOiBjb3VsZG4ndCByZWdpc3RlciBjbGllbnRcbiIpOworCQlnb3RvIG91dF9tbnQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9tbnQ6CisJbW50cHV0KHV2ZXJic19ldmVudF9tbnQpOworCitvdXRfZnM6CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ1dmVyYnNfZXZlbnRfZnMpOworCitvdXRfY2xhc3M6CisJY2xhc3NfdW5yZWdpc3RlcigmdXZlcmJzX2NsYXNzKTsKKworb3V0X2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oSUJfVVZFUkJTX0JBU0VfREVWLCBJQl9VVkVSQlNfTUFYX0RFVklDRVMpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGliX3V2ZXJic19jbGVhbnVwKHZvaWQpCit7CisJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJnV2ZXJic19jbGllbnQpOworCW1udHB1dCh1dmVyYnNfZXZlbnRfbW50KTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnV2ZXJic19ldmVudF9mcyk7CisJY2xhc3NfdW5yZWdpc3RlcigmdXZlcmJzX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oSUJfVVZFUkJTX0JBU0VfREVWLCBJQl9VVkVSQlNfTUFYX0RFVklDRVMpOworfQorCittb2R1bGVfaW5pdChpYl91dmVyYnNfaW5pdCk7Cittb2R1bGVfZXhpdChpYl91dmVyYnNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWVtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1NTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tZW0uYwpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqICRJZDogdXZlcmJzX21lbS5jIDI3NDMgMjAwNS0wNi0yOCAyMjoyNzo1OVogcm9sYW5kICQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidXZlcmJzLmgiCisKK3N0cnVjdCBpYl91bWVtX2FjY291bnRfd29yayB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IG1tX3N0cnVjdCAgKm1tOworCXVuc2lnbmVkIGxvbmcgICAgICBkaWZmOworfTsKKworCitzdGF0aWMgdm9pZCBfX2liX3VtZW1fcmVsZWFzZShzdHJ1Y3QgaWJfZGV2aWNlICpkZXYsIHN0cnVjdCBpYl91bWVtICp1bWVtLCBpbnQgZGlydHkpCit7CisJc3RydWN0IGliX3VtZW1fY2h1bmsgKmNodW5rLCAqdG1wOworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZ1bWVtLT5jaHVua19saXN0LCBsaXN0KSB7CisJCWRtYV91bm1hcF9zZyhkZXYtPmRtYV9kZXZpY2UsIGNodW5rLT5wYWdlX2xpc3QsCisJCQkgICAgIGNodW5rLT5uZW50cywgRE1BX0JJRElSRUNUSU9OQUwpOworCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5lbnRzOyArK2kpIHsKKwkJCWlmICh1bWVtLT53cml0YWJsZSAmJiBkaXJ0eSkKKwkJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKGNodW5rLT5wYWdlX2xpc3RbaV0ucGFnZSk7CisJCQlwdXRfcGFnZShjaHVuay0+cGFnZV9saXN0W2ldLnBhZ2UpOworCQl9CisKKwkJa2ZyZWUoY2h1bmspOworCX0KK30KKworaW50IGliX3VtZW1fZ2V0KHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKm1lbSwKKwkJdm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIGludCB3cml0ZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VfbGlzdDsKKwlzdHJ1Y3QgaWJfdW1lbV9jaHVuayAqY2h1bms7CisJdW5zaWduZWQgbG9uZyBsb2NrZWQ7CisJdW5zaWduZWQgbG9uZyBsb2NrX2xpbWl0OworCXVuc2lnbmVkIGxvbmcgY3VyX2Jhc2U7CisJdW5zaWduZWQgbG9uZyBucGFnZXM7CisJaW50IHJldCA9IDA7CisJaW50IG9mZjsKKwlpbnQgaTsKKworCWlmICghY2FuX2RvX21sb2NrKCkpCisJCXJldHVybiAtRVBFUk07CisKKwlwYWdlX2xpc3QgPSAoc3RydWN0IHBhZ2UgKiopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2VfbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW0tPnVzZXJfYmFzZSA9ICh1bnNpZ25lZCBsb25nKSBhZGRyOworCW1lbS0+bGVuZ3RoICAgID0gc2l6ZTsKKwltZW0tPm9mZnNldCAgICA9ICh1bnNpZ25lZCBsb25nKSBhZGRyICYgflBBR0VfTUFTSzsKKwltZW0tPnBhZ2Vfc2l6ZSA9IFBBR0VfU0laRTsKKwltZW0tPndyaXRhYmxlICA9IHdyaXRlOworCisJSU5JVF9MSVNUX0hFQUQoJm1lbS0+Y2h1bmtfbGlzdCk7CisKKwlucGFnZXMgPSBQQUdFX0FMSUdOKHNpemUgKyBtZW0tPm9mZnNldCkgPj4gUEFHRV9TSElGVDsKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlsb2NrZWQgICAgID0gbnBhZ2VzICsgY3VycmVudC0+bW0tPmxvY2tlZF92bTsKKwlsb2NrX2xpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1ciA+PiBQQUdFX1NISUZUOworCisJaWYgKChsb2NrZWQgPiBsb2NrX2xpbWl0KSAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWN1cl9iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGFkZHIgJiBQQUdFX01BU0s7CisKKwl3aGlsZSAobnBhZ2VzKSB7CisJCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCBjdXJfYmFzZSwKKwkJCQkgICAgIG1pbl90KGludCwgbnBhZ2VzLAorCQkJCQkgICBQQUdFX1NJWkUgLyBzaXplb2YgKHN0cnVjdCBwYWdlICopKSwKKwkJCQkgICAgIDEsICF3cml0ZSwgcGFnZV9saXN0LCBOVUxMKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWN1cl9iYXNlICs9IHJldCAqIFBBR0VfU0laRTsKKwkJbnBhZ2VzICAgLT0gcmV0OworCisJCW9mZiA9IDA7CisKKwkJd2hpbGUgKHJldCkgeworCQkJY2h1bmsgPSBrbWFsbG9jKHNpemVvZiAqY2h1bmsgKyBzaXplb2YgKHN0cnVjdCBzY2F0dGVybGlzdCkgKgorCQkJCQltaW5fdChpbnQsIHJldCwgSUJfVU1FTV9NQVhfUEFHRV9DSFVOSyksCisJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFjaHVuaykgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWNodW5rLT5uZW50cyA9IG1pbl90KGludCwgcmV0LCBJQl9VTUVNX01BWF9QQUdFX0NIVU5LKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bmVudHM7ICsraSkgeworCQkJCWNodW5rLT5wYWdlX2xpc3RbaV0ucGFnZSAgID0gcGFnZV9saXN0W2kgKyBvZmZdOworCQkJCWNodW5rLT5wYWdlX2xpc3RbaV0ub2Zmc2V0ID0gMDsKKwkJCQljaHVuay0+cGFnZV9saXN0W2ldLmxlbmd0aCA9IFBBR0VfU0laRTsKKwkJCX0KKworCQkJY2h1bmstPm5tYXAgPSBkbWFfbWFwX3NnKGRldi0+ZG1hX2RldmljZSwKKwkJCQkJCSAmY2h1bmstPnBhZ2VfbGlzdFswXSwKKwkJCQkJCSBjaHVuay0+bmVudHMsCisJCQkJCQkgRE1BX0JJRElSRUNUSU9OQUwpOworCQkJaWYgKGNodW5rLT5ubWFwIDw9IDApIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5lbnRzOyArK2kpCisJCQkJCXB1dF9wYWdlKGNodW5rLT5wYWdlX2xpc3RbaV0ucGFnZSk7CisJCQkJa2ZyZWUoY2h1bmspOworCisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcmV0IC09IGNodW5rLT5uZW50czsKKwkJCW9mZiArPSBjaHVuay0+bmVudHM7CisJCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+bGlzdCwgJm1lbS0+Y2h1bmtfbGlzdCk7CisJCX0KKworCQlyZXQgPSAwOworCX0KKworb3V0OgorCWlmIChyZXQgPCAwKQorCQlfX2liX3VtZW1fcmVsZWFzZShkZXYsIG1lbSwgMCk7CisJZWxzZQorCQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtID0gbG9ja2VkOworCisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlX2xpc3QpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpYl91bWVtX3JlbGVhc2Uoc3RydWN0IGliX2RldmljZSAqZGV2LCBzdHJ1Y3QgaWJfdW1lbSAqdW1lbSkKK3sKKwlfX2liX3VtZW1fcmVsZWFzZShkZXYsIHVtZW0sIDEpOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwljdXJyZW50LT5tbS0+bG9ja2VkX3ZtIC09CisJCVBBR0VfQUxJR04odW1lbS0+bGVuZ3RoICsgdW1lbS0+b2Zmc2V0KSA+PiBQQUdFX1NISUZUOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworfQorCitzdGF0aWMgdm9pZCBpYl91bWVtX2FjY291bnQodm9pZCAqd29ya19wdHIpCit7CisJc3RydWN0IGliX3VtZW1fYWNjb3VudF93b3JrICp3b3JrID0gd29ya19wdHI7CisKKwlkb3duX3dyaXRlKCZ3b3JrLT5tbS0+bW1hcF9zZW0pOworCXdvcmstPm1tLT5sb2NrZWRfdm0gLT0gd29yay0+ZGlmZjsKKwl1cF93cml0ZSgmd29yay0+bW0tPm1tYXBfc2VtKTsKKwltbXB1dCh3b3JrLT5tbSk7CisJa2ZyZWUod29yayk7Cit9CisKK3ZvaWQgaWJfdW1lbV9yZWxlYXNlX29uX2Nsb3NlKHN0cnVjdCBpYl9kZXZpY2UgKmRldiwgc3RydWN0IGliX3VtZW0gKnVtZW0pCit7CisJc3RydWN0IGliX3VtZW1fYWNjb3VudF93b3JrICp3b3JrOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJX19pYl91bWVtX3JlbGVhc2UoZGV2LCB1bWVtLCAxKTsKKworCW1tID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CisJaWYgKCFtbSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXZSBtYXkgYmUgY2FsbGVkIHdpdGggdGhlIG1tJ3MgbW1hcF9zZW0gYWxyZWFkeSBoZWxkLiAgVGhpcworCSAqIGNhbiBoYXBwZW4gd2hlbiBhIHVzZXJzcGFjZSBtdW5tYXAoKSBpcyB0aGUgY2FsbCB0aGF0IGRyb3BzCisJICogdGhlIGxhc3QgcmVmZXJlbmNlIHRvIG91ciBmaWxlIGFuZCBjYWxscyBvdXIgcmVsZWFzZQorCSAqIG1ldGhvZC4gIElmIHRoZXJlIGFyZSBtZW1vcnkgcmVnaW9ucyB0byBkZXN0cm95LCB3ZSdsbCBlbmQKKwkgKiB1cCBoZXJlIGFuZCBub3QgYmUgYWJsZSB0byB0YWtlIHRoZSBtbWFwX3NlbS4gIFRoZXJlZm9yZSB3ZQorCSAqIGRlZmVyIHRoZSB2bV9sb2NrZWQgYWNjb3VudGluZyB0byB0aGUgc3lzdGVtIHdvcmtxdWV1ZS4KKwkgKi8KKworCXdvcmsgPSBrbWFsbG9jKHNpemVvZiAqd29yaywgR0ZQX0tFUk5FTCk7CisJaWYgKCF3b3JrKQorCQlyZXR1cm47CisKKwlJTklUX1dPUksoJndvcmstPndvcmssIGliX3VtZW1fYWNjb3VudCwgd29yayk7CisJd29yay0+bW0gICA9IG1tOworCXdvcmstPmRpZmYgPSBQQUdFX0FMSUdOKHVtZW0tPmxlbmd0aCArIHVtZW0tPm9mZnNldCkgPj4gUEFHRV9TSElGVDsKKworCXNjaGVkdWxlX3dvcmsoJndvcmstPndvcmspOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3ZlcmJzLmMKaW5kZXggN2MwOGVkMC4uMjUxNmY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdmVyYnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS92ZXJicy5jCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQ3LDEwICs0OCwxMSBAQAogewogCXN0cnVjdCBpYl9wZCAqcGQ7CiAKLQlwZCA9IGRldmljZS0+YWxsb2NfcGQoZGV2aWNlKTsKKwlwZCA9IGRldmljZS0+YWxsb2NfcGQoZGV2aWNlLCBOVUxMLCBOVUxMKTsKIAogCWlmICghSVNfRVJSKHBkKSkgewotCQlwZC0+ZGV2aWNlID0gZGV2aWNlOworCQlwZC0+ZGV2aWNlICA9IGRldmljZTsKKwkJcGQtPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfc2V0KCZwZC0+dXNlY250LCAwKTsKIAl9CiAKQEAgLTc2LDggKzc4LDkgQEAKIAlhaCA9IHBkLT5kZXZpY2UtPmNyZWF0ZV9haChwZCwgYWhfYXR0cik7CiAKIAlpZiAoIUlTX0VSUihhaCkpIHsKLQkJYWgtPmRldmljZSA9IHBkLT5kZXZpY2U7Ci0JCWFoLT5wZCAgICAgPSBwZDsKKwkJYWgtPmRldmljZSAgPSBwZC0+ZGV2aWNlOworCQlhaC0+cGQgICAgICA9IHBkOworCQlhaC0+dW9iamVjdCA9IE5VTEw7CiAJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwogCX0KIApAQCAtMTIyLDcgKzEyNSw3IEBACiB7CiAJc3RydWN0IGliX3FwICpxcDsKIAotCXFwID0gcGQtPmRldmljZS0+Y3JlYXRlX3FwKHBkLCBxcF9pbml0X2F0dHIpOworCXFwID0gcGQtPmRldmljZS0+Y3JlYXRlX3FwKHBkLCBxcF9pbml0X2F0dHIsIE5VTEwpOwogCiAJaWYgKCFJU19FUlIocXApKSB7CiAJCXFwLT5kZXZpY2UgICAgIAkgID0gcGQtPmRldmljZTsKQEAgLTEzMCw2ICsxMzMsNyBAQAogCQlxcC0+c2VuZF9jcSAgICAJICA9IHFwX2luaXRfYXR0ci0+c2VuZF9jcTsKIAkJcXAtPnJlY3ZfY3EgICAgCSAgPSBxcF9pbml0X2F0dHItPnJlY3ZfY3E7CiAJCXFwLT5zcnEJICAgICAgIAkgID0gcXBfaW5pdF9hdHRyLT5zcnE7CisJCXFwLT51b2JqZWN0ICAgICAgID0gTlVMTDsKIAkJcXAtPmV2ZW50X2hhbmRsZXIgPSBxcF9pbml0X2F0dHItPmV2ZW50X2hhbmRsZXI7CiAJCXFwLT5xcF9jb250ZXh0ICAgID0gcXBfaW5pdF9hdHRyLT5xcF9jb250ZXh0OwogCQlxcC0+cXBfdHlwZQkgID0gcXBfaW5pdF9hdHRyLT5xcF90eXBlOwpAQCAtMTk3LDEwICsyMDEsMTEgQEAKIHsKIAlzdHJ1Y3QgaWJfY3EgKmNxOwogCi0JY3EgPSBkZXZpY2UtPmNyZWF0ZV9jcShkZXZpY2UsIGNxZSk7CisJY3EgPSBkZXZpY2UtPmNyZWF0ZV9jcShkZXZpY2UsIGNxZSwgTlVMTCwgTlVMTCk7CiAKIAlpZiAoIUlTX0VSUihjcSkpIHsKIAkJY3EtPmRldmljZSAgICAgICAgPSBkZXZpY2U7CisJCWNxLT51b2JqZWN0ICAgICAgID0gTlVMTDsKIAkJY3EtPmNvbXBfaGFuZGxlciAgPSBjb21wX2hhbmRsZXI7CiAJCWNxLT5ldmVudF9oYW5kbGVyID0gZXZlbnRfaGFuZGxlcjsKIAkJY3EtPmNxX2NvbnRleHQgICAgPSBjcV9jb250ZXh0OwpAQCAtMjQ1LDggKzI1MCw5IEBACiAJbXIgPSBwZC0+ZGV2aWNlLT5nZXRfZG1hX21yKHBkLCBtcl9hY2Nlc3NfZmxhZ3MpOwogCiAJaWYgKCFJU19FUlIobXIpKSB7Ci0JCW1yLT5kZXZpY2UgPSBwZC0+ZGV2aWNlOwotCQltci0+cGQgICAgID0gcGQ7CisJCW1yLT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwkJbXItPnBkICAgICAgPSBwZDsKKwkJbXItPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAkJYXRvbWljX3NldCgmbXItPnVzZWNudCwgMCk7CiAJfQpAQCAtMjY3LDggKzI3Myw5IEBACiAJCQkJICAgICBtcl9hY2Nlc3NfZmxhZ3MsIGlvdmFfc3RhcnQpOwogCiAJaWYgKCFJU19FUlIobXIpKSB7Ci0JCW1yLT5kZXZpY2UgPSBwZC0+ZGV2aWNlOwotCQltci0+cGQgICAgID0gcGQ7CisJCW1yLT5kZXZpY2UgID0gcGQtPmRldmljZTsKKwkJbXItPnBkICAgICAgPSBwZDsKKwkJbXItPnVvYmplY3QgPSBOVUxMOwogCQlhdG9taWNfaW5jKCZwZC0+dXNlY250KTsKIAkJYXRvbWljX3NldCgmbXItPnVzZWNudCwgMCk7CiAJfQpAQCAtMzQ0LDggKzM1MSw5IEBACiAKIAltdyA9IHBkLT5kZXZpY2UtPmFsbG9jX213KHBkKTsKIAlpZiAoIUlTX0VSUihtdykpIHsKLQkJbXctPmRldmljZSA9IHBkLT5kZXZpY2U7Ci0JCW13LT5wZCAgICAgPSBwZDsKKwkJbXctPmRldmljZSAgPSBwZC0+ZGV2aWNlOworCQltdy0+cGQgICAgICA9IHBkOworCQltdy0+dW9iamVjdCA9IE5VTEw7CiAJCWF0b21pY19pbmMoJnBkLT51c2VjbnQpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2F2LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwppbmRleCAwODViYWYzLi5kNThkY2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfYXYuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmMKaW5kZXggY2Q5ZWQ5NS4uMTU1N2E1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuYwpAQCAtNDMxLDYgKzQzMSwzNiBAQAogCQkJCSAgICAgIHRpbWVvdXQsIHN0YXR1cyk7CiB9CiAKK2ludCBtdGhjYV9jbWRfaW5pdChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCit7CisJc2VtYV9pbml0KCZkZXYtPmNtZC5oY3Jfc2VtLCAxKTsKKwlzZW1hX2luaXQoJmRldi0+Y21kLnBvbGxfc2VtLCAxKTsKKwlkZXYtPmNtZC51c2VfZXZlbnRzID0gMDsKKworCWRldi0+aGNyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArIE1USENBX0hDUl9CQVNFLAorCQkJICAgTVRIQ0FfSENSX1NJWkUpOworCWlmICghZGV2LT5oY3IpIHsKKwkJbXRoY2FfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBjb21tYW5kIHJlZ2lzdGVyLiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZXYtPmNtZC5wb29sID0gcGNpX3Bvb2xfY3JlYXRlKCJtdGhjYV9jbWQiLCBkZXYtPnBkZXYsCisJCQkJCU1USENBX01BSUxCT1hfU0laRSwKKwkJCQkJTVRIQ0FfTUFJTEJPWF9TSVpFLCAwKTsKKwlpZiAoIWRldi0+Y21kLnBvb2wpIHsKKwkJaW91bm1hcChkZXYtPmhjcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG10aGNhX2NtZF9jbGVhbnVwKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3sKKwlwY2lfcG9vbF9kZXN0cm95KGRldi0+Y21kLnBvb2wpOworCWlvdW5tYXAoZGV2LT5oY3IpOworfQorCiAvKgogICogU3dpdGNoIHRvIHVzaW5nIGV2ZW50cyB0byBpc3N1ZSBGVyBjb21tYW5kcyAoc2hvdWxkIGJlIGNhbGxlZCBhZnRlcgogICogZXZlbnQgcXVldWUgdG8gY29tbWFuZCBldmVudHMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQpLgpAQCAtNDg5LDYgKzUxOSwzMyBAQAogCXVwKCZkZXYtPmNtZC5wb2xsX3NlbSk7CiB9CiAKK3N0cnVjdCBtdGhjYV9tYWlsYm94ICptdGhjYV9hbGxvY19tYWlsYm94KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CisKKwltYWlsYm94ID0ga21hbGxvYyhzaXplb2YgKm1haWxib3gsIGdmcF9tYXNrKTsKKwlpZiAoIW1haWxib3gpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbWFpbGJveC0+YnVmID0gcGNpX3Bvb2xfYWxsb2MoZGV2LT5jbWQucG9vbCwgZ2ZwX21hc2ssICZtYWlsYm94LT5kbWEpOworCWlmICghbWFpbGJveC0+YnVmKSB7CisJCWtmcmVlKG1haWxib3gpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXR1cm4gbWFpbGJveDsKK30KKwordm9pZCBtdGhjYV9mcmVlX21haWxib3goc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCkKK3sKKwlpZiAoIW1haWxib3gpCisJCXJldHVybjsKKworCXBjaV9wb29sX2ZyZWUoZGV2LT5jbWQucG9vbCwgbWFpbGJveC0+YnVmLCBtYWlsYm94LT5kbWEpOworCWtmcmVlKG1haWxib3gpOworfQorCiBpbnQgbXRoY2FfU1lTX0VOKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cykKIHsKIAl1NjQgb3V0OwpAQCAtNTEzLDIwICs1NzAsMjAgQEAKIHN0YXRpYyBpbnQgbXRoY2FfbWFwX2NtZChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUxNiBvcCwgc3RydWN0IG10aGNhX2ljbSAqaWNtLAogCQkJIHU2NCB2aXJ0LCB1OCAqc3RhdHVzKQogewotCXUzMiAqaW5ib3g7Ci0JZG1hX2FkZHJfdCBpbmRtYTsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfaWNtX2l0ZXIgaXRlcjsKKwlfX2JlNjQgKnBhZ2VzOwogCWludCBsZzsKIAlpbnQgbmVudCA9IDA7CiAJaW50IGk7CiAJaW50IGVyciA9IDA7CiAJaW50IHRzID0gMCwgdGMgPSAwOwogCi0JaW5ib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwgJmluZG1hKTsKLQlpZiAoIWluYm94KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldChpbmJveCwgMCwgUEFHRV9TSVpFKTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW1lbXNldChtYWlsYm94LT5idWYsIDAsIE1USENBX01BSUxCT1hfU0laRSk7CisJcGFnZXMgPSBtYWlsYm94LT5idWY7CiAKIAlmb3IgKG10aGNhX2ljbV9maXJzdChpY20sICZpdGVyKTsKIAkgICAgICFtdGhjYV9pY21fbGFzdCgmaXRlcik7CkBAIC01NDYsMTkgKzYwMywxNyBAQAogCQl9CiAJCWZvciAoaSA9IDA7IGkgPCBtdGhjYV9pY21fc2l6ZSgmaXRlcikgLyAoMSA8PCBsZyk7ICsraSwgKytuZW50KSB7CiAJCQlpZiAodmlydCAhPSAtMSkgewotCQkJCSooKF9fYmU2NCAqKSAoaW5ib3ggKyBuZW50ICogNCkpID0KLQkJCQkJY3B1X3RvX2JlNjQodmlydCk7CisJCQkJcGFnZXNbbmVudCAqIDJdID0gY3B1X3RvX2JlNjQodmlydCk7CiAJCQkJdmlydCArPSAxIDw8IGxnOwogCQkJfQogCi0JCQkqKChfX2JlNjQgKikgKGluYm94ICsgbmVudCAqIDQgKyAyKSkgPQotCQkJCWNwdV90b19iZTY0KChtdGhjYV9pY21fYWRkcigmaXRlcikgKwotCQkJCQkgICAgIChpIDw8IGxnKSkgfCAobGcgLSAxMikpOworCQkJcGFnZXNbbmVudCAqIDIgKyAxXSA9IGNwdV90b19iZTY0KChtdGhjYV9pY21fYWRkcigmaXRlcikgKworCQkJCQkJCSAgIChpIDw8IGxnKSkgfCAobGcgLSAxMikpOwogCQkJdHMgKz0gMSA8PCAobGcgLSAxMCk7CiAJCQkrK3RjOwogCi0JCQlpZiAobmVudCA9PSBQQUdFX1NJWkUgLyAxNikgewotCQkJCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCBuZW50LCAwLCBvcCwKKwkJCWlmIChuZW50ID09IE1USENBX01BSUxCT1hfU0laRSAvIDE2KSB7CisJCQkJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBuZW50LCAwLCBvcCwKIAkJCQkJCUNNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CiAJCQkJaWYgKGVyciB8fCAqc3RhdHVzKQogCQkJCQlnb3RvIG91dDsKQEAgLTU2OCw3ICs2MjMsNyBAQAogCX0KIAogCWlmIChuZW50KQotCQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgbmVudCwgMCwgb3AsCisJCWVyciA9IG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgbmVudCwgMCwgb3AsCiAJCQkJQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKIAogCXN3aXRjaCAob3ApIHsKQEAgLTU4NSw3ICs2NDAsNyBAQAogCX0KIAogb3V0OgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsIGluYm94LCBpbmRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjA2LDggKzY2MSw4IEBACiAKIGludCBtdGhjYV9RVUVSWV9GVyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICpvdXRib3g7Ci0JZG1hX2FkZHJfdCBvdXRkbWE7CiAJaW50IGVyciA9IDA7CiAJdTggbGc7CiAKQEAgLTYyNSwxMiArNjgwLDEyIEBACiAjZGVmaW5lIFFVRVJZX0ZXX0VRX0FSTV9CQVNFX09GRlNFVCAgICAweDQwCiAjZGVmaW5lIFFVRVJZX0ZXX0VRX1NFVF9DSV9CQVNFX09GRlNFVCAweDQ4CiAKLQlvdXRib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFFVRVJZX0ZXX09VVF9TSVpFLCAmb3V0ZG1hKTsKLQlpZiAoIW91dGJveCkgewotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCAwLCAwLCBDTURfUVVFUllfRlcsCisJZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgMCwgMCwgQ01EX1FVRVJZX0ZXLAogCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiAKIAlpZiAoZXJyKQpAQCAtNjgxLDE1ICs3MzYsMTUgQEAKIAl9CiAKIG91dDoKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUVVFUllfRldfT1VUX1NJWkUsIG91dGJveCwgb3V0ZG1hKTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXRoY2FfRU5BQkxFX0xBTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTggaW5mbzsKIAl1MzIgKm91dGJveDsKLQlkbWFfYWRkcl90IG91dGRtYTsKIAlpbnQgZXJyID0gMDsKIAogI2RlZmluZSBFTkFCTEVfTEFNX09VVF9TSVpFICAgICAgICAgMHgxMDAKQEAgLTcwMCwxMSArNzU1LDEyIEBACiAjZGVmaW5lIEVOQUJMRV9MQU1fSU5GT19ISURERU5fRkxBRyAoMSA8PCA0KQogI2RlZmluZSBFTkFCTEVfTEFNX0lORk9fRUNDX01BU0sgICAgMHgzCiAKLQlvdXRib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIEVOQUJMRV9MQU1fT1VUX1NJWkUsICZvdXRkbWEpOwotCWlmICghb3V0Ym94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIDAsIDAsIENNRF9FTkFCTEVfTEFNLAorCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9FTkFCTEVfTEFNLAogCQkJICAgIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CiAKIAlpZiAoZXJyKQpAQCAtNzMzLDcgKzc4OSw3IEBACiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGV2LT5kZHJfZW5kKTsKIAogb3V0OgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBFTkFCTEVfTEFNX09VVF9TSVpFLCBvdXRib3gsIG91dGRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzQ0LDkgKzgwMCw5IEBACiAKIGludCBtdGhjYV9RVUVSWV9ERFIoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKQogeworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXU4IGluZm87CiAJdTMyICpvdXRib3g7Ci0JZG1hX2FkZHJfdCBvdXRkbWE7CiAJaW50IGVyciA9IDA7CiAKICNkZWZpbmUgUVVFUllfRERSX09VVF9TSVpFICAgICAgICAgMHgxMDAKQEAgLTc1NywxMSArODEzLDEyIEBACiAjZGVmaW5lIFFVRVJZX0REUl9JTkZPX0hJRERFTl9GTEFHICgxIDw8IDQpCiAjZGVmaW5lIFFVRVJZX0REUl9JTkZPX0VDQ19NQVNLICAgIDB4MwogCi0Jb3V0Ym94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBRVUVSWV9ERFJfT1VUX1NJWkUsICZvdXRkbWEpOwotCWlmICghb3V0Ym94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIDAsIDAsIENNRF9RVUVSWV9ERFIsCisJZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgMCwgMCwgQ01EX1FVRVJZX0REUiwKIAkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogCiAJaWYgKGVycikKQEAgLTc4NywxNSArODQ0LDE1IEBACiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZGV2LT5kZHJfZW5kKTsKIAogb3V0OgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBRVUVSWV9ERFJfT1VUX1NJWkUsIG91dGJveCwgb3V0ZG1hKTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXRoY2FfUVVFUllfREVWX0xJTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCQlzdHJ1Y3QgbXRoY2FfZGV2X2xpbSAqZGV2X2xpbSwgdTggKnN0YXR1cykKIHsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1MzIgKm91dGJveDsKLQlkbWFfYWRkcl90IG91dGRtYTsKIAl1OCBmaWVsZDsKIAl1MTYgc2l6ZTsKIAlpbnQgZXJyOwpAQCAtODYwLDExICs5MTcsMTIgQEAKICNkZWZpbmUgUVVFUllfREVWX0xJTV9MQU1SX09GRlNFVCAgICAgICAgICAgMHg5ZgogI2RlZmluZSBRVUVSWV9ERVZfTElNX01BWF9JQ01fU1pfT0ZGU0VUICAgICAweGEwCiAKLQlvdXRib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIFFVRVJZX0RFVl9MSU1fT1VUX1NJWkUsICZvdXRkbWEpOwotCWlmICghb3V0Ym94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW91dGJveCA9IG1haWxib3gtPmJ1ZjsKIAotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIDAsIDAsIENNRF9RVUVSWV9ERVZfTElNLAorCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9RVUVSWV9ERVZfTElNLAogCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiAKIAlpZiAoZXJyKQpAQCAtMTAyMCwxNSArMTA3OCwxNSBAQAogCX0KIAogb3V0OgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBRVUVSWV9ERVZfTElNX09VVF9TSVpFLCBvdXRib3gsIG91dGRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IG10aGNhX1FVRVJZX0FEQVBURVIoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkJc3RydWN0IG10aGNhX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICpvdXRib3g7Ci0JZG1hX2FkZHJfdCBvdXRkbWE7CiAJaW50IGVycjsKIAogI2RlZmluZSBRVUVSWV9BREFQVEVSX09VVF9TSVpFICAgICAgICAgICAgIDB4MTAwCkBAIC0xMDM3LDIzICsxMDk1LDI0IEBACiAjZGVmaW5lIFFVRVJZX0FEQVBURVJfUkVWSVNJT05fSURfT0ZGU0VUICAgMHgwOAogI2RlZmluZSBRVUVSWV9BREFQVEVSX0lOVEFfUElOX09GRlNFVCAgICAgIDB4MTAKIAotCW91dGJveCA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgUVVFUllfQURBUFRFUl9PVVRfU0laRSwgJm91dGRtYSk7Ci0JaWYgKCFvdXRib3gpCi0JCXJldHVybiAtRU5PTUVNOworCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJb3V0Ym94ID0gbWFpbGJveC0+YnVmOwogCi0JZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG91dGRtYSwgMCwgMCwgQ01EX1FVRVJZX0FEQVBURVIsCisJZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgMCwgMCwgQ01EX1FVRVJZX0FEQVBURVIsCiAJCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JTVRIQ0FfR0VUKGFkYXB0ZXItPnZlbmRvcl9pZCwgb3V0Ym94LCBRVUVSWV9BREFQVEVSX1ZFTkRPUl9JRF9PRkZTRVQpOwotCU1USENBX0dFVChhZGFwdGVyLT5kZXZpY2VfaWQsIG91dGJveCwgUVVFUllfQURBUFRFUl9ERVZJQ0VfSURfT0ZGU0VUKTsKKwlNVEhDQV9HRVQoYWRhcHRlci0+dmVuZG9yX2lkLCBvdXRib3gsICAgUVVFUllfQURBUFRFUl9WRU5ET1JfSURfT0ZGU0VUKTsKKwlNVEhDQV9HRVQoYWRhcHRlci0+ZGV2aWNlX2lkLCBvdXRib3gsICAgUVVFUllfQURBUFRFUl9ERVZJQ0VfSURfT0ZGU0VUKTsKIAlNVEhDQV9HRVQoYWRhcHRlci0+cmV2aXNpb25faWQsIG91dGJveCwgUVVFUllfQURBUFRFUl9SRVZJU0lPTl9JRF9PRkZTRVQpOwotCU1USENBX0dFVChhZGFwdGVyLT5pbnRhX3Bpbiwgb3V0Ym94LCBRVUVSWV9BREFQVEVSX0lOVEFfUElOX09GRlNFVCk7CisJTVRIQ0FfR0VUKGFkYXB0ZXItPmludGFfcGluLCBvdXRib3gsICAgIFFVRVJZX0FEQVBURVJfSU5UQV9QSU5fT0ZGU0VUKTsKIAogb3V0OgotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBRVUVSWV9ERVZfTElNX09VVF9TSVpFLCBvdXRib3gsIG91dGRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTA2MSw4ICsxMTIwLDggQEAKIAkJICAgc3RydWN0IG10aGNhX2luaXRfaGNhX3BhcmFtICpwYXJhbSwKIAkJICAgdTggKnN0YXR1cykKIHsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1MzIgKmluYm94OwotCWRtYV9hZGRyX3QgaW5kbWE7CiAJaW50IGVycjsKIAogI2RlZmluZSBJTklUX0hDQV9JTl9TSVpFICAgICAgICAgICAgIAkgMHgyMDAKQEAgLTExMDIsOSArMTE2MSwxMCBAQAogI2RlZmluZSAgSU5JVF9IQ0FfVUFSX1NDQVRDSF9CQVNFX09GRlNFVCAoSU5JVF9IQ0FfVUFSX09GRlNFVCArIDB4MTApCiAjZGVmaW5lICBJTklUX0hDQV9VQVJfQ1RYX0JBU0VfT0ZGU0VUICAgIChJTklUX0hDQV9VQVJfT0ZGU0VUICsgMHgxOCkKIAotCWluYm94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBJTklUX0hDQV9JTl9TSVpFLCAmaW5kbWEpOwotCWlmICghaW5ib3gpCi0JCXJldHVybiAtRU5PTUVNOworCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJaW5ib3ggPSBtYWlsYm94LT5idWY7CiAKIAltZW1zZXQoaW5ib3gsIDAsIElOSVRfSENBX0lOX1NJWkUpOwogCkBAIC0xMTY3LDEwICsxMjI3LDkgQEAKIAkJTVRIQ0FfUFVUKGluYm94LCBwYXJhbS0+dWFyY19iYXNlLCAgIElOSVRfSENBX1VBUl9DVFhfQkFTRV9PRkZTRVQpOwogCX0KIAotCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCAwLCAwLCBDTURfSU5JVF9IQ0EsCi0JCQlIWiwgc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIDAsIDAsIENNRF9JTklUX0hDQSwgSFosIHN0YXR1cyk7CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgSU5JVF9IQ0FfSU5fU0laRSwgaW5ib3gsIGluZG1hKTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMTc4LDggKzEyMzcsOCBAQAogCQkgIHN0cnVjdCBtdGhjYV9pbml0X2liX3BhcmFtICpwYXJhbSwKIAkJICBpbnQgcG9ydCwgdTggKnN0YXR1cykKIHsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1MzIgKmluYm94OwotCWRtYV9hZGRyX3QgaW5kbWE7CiAJaW50IGVycjsKIAl1MzIgZmxhZ3M7CiAKQEAgLTExOTksOSArMTI1OCwxMCBAQAogI2RlZmluZSBJTklUX0lCX05PREVfR1VJRF9PRkZTRVQgMHgxOAogI2RlZmluZSBJTklUX0lCX1NJX0dVSURfT0ZGU0VUICAgMHgyMAogCi0JaW5ib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIElOSVRfSUJfSU5fU0laRSwgJmluZG1hKTsKLQlpZiAoIWluYm94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCWluYm94ID0gbWFpbGJveC0+YnVmOwogCiAJbWVtc2V0KGluYm94LCAwLCBJTklUX0lCX0lOX1NJWkUpOwogCkBAIC0xMjIxLDEwICsxMjgxLDEwIEBACiAJTVRIQ0FfUFVUKGluYm94LCBwYXJhbS0+bm9kZV9ndWlkLCBJTklUX0lCX05PREVfR1VJRF9PRkZTRVQpOwogCU1USENBX1BVVChpbmJveCwgcGFyYW0tPnNpX2d1aWQsICAgSU5JVF9JQl9TSV9HVUlEX09GRlNFVCk7CiAKLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgcG9ydCwgMCwgQ01EX0lOSVRfSUIsCisJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwb3J0LCAwLCBDTURfSU5JVF9JQiwKIAkJCUNNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgSU5JVF9IQ0FfSU5fU0laRSwgaW5ib3gsIGluZG1hKTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMjQxLDggKzEzMDEsOCBAQAogaW50IG10aGNhX1NFVF9JQihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9zZXRfaWJfcGFyYW0gKnBhcmFtLAogCQkgaW50IHBvcnQsIHU4ICpzdGF0dXMpCiB7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTMyICppbmJveDsKLQlkbWFfYWRkcl90IGluZG1hOwogCWludCBlcnI7CiAJdTMyIGZsYWdzID0gMDsKIApAQCAtMTI1Myw5ICsxMzEzLDEwIEBACiAjZGVmaW5lIFNFVF9JQl9DQVBfTUFTS19PRkZTRVQgMHgwNAogI2RlZmluZSBTRVRfSUJfU0lfR1VJRF9PRkZTRVQgIDB4MDgKIAotCWluYm94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBTRVRfSUJfSU5fU0laRSwgJmluZG1hKTsKLQlpZiAoIWluYm94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCWluYm94ID0gbWFpbGJveC0+YnVmOwogCiAJbWVtc2V0KGluYm94LCAwLCBTRVRfSUJfSU5fU0laRSk7CiAKQEAgLTEyNjYsMTAgKzEzMjcsMTAgQEAKIAlNVEhDQV9QVVQoaW5ib3gsIHBhcmFtLT5jYXBfbWFzaywgU0VUX0lCX0NBUF9NQVNLX09GRlNFVCk7CiAJTVRIQ0FfUFVUKGluYm94LCBwYXJhbS0+c2lfZ3VpZCwgIFNFVF9JQl9TSV9HVUlEX09GRlNFVCk7CiAKLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgcG9ydCwgMCwgQ01EX1NFVF9JQiwKKwllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIHBvcnQsIDAsIENNRF9TRVRfSUIsCiAJCQlDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwogCi0JcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIElOSVRfSENBX0lOX1NJWkUsIGluYm94LCBpbmRtYSk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTI4MCwyMCArMTM0MSwyMiBAQAogCiBpbnQgbXRoY2FfTUFQX0lDTV9wYWdlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IGRtYV9hZGRyLCB1NjQgdmlydCwgdTggKnN0YXR1cykKIHsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAl1NjQgKmluYm94OwotCWRtYV9hZGRyX3QgaW5kbWE7CiAJaW50IGVycjsKIAotCWluYm94ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCAxNiwgJmluZG1hKTsKLQlpZiAoIWluYm94KQotCQlyZXR1cm4gLUVOT01FTTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCWluYm94ID0gbWFpbGJveC0+YnVmOwogCiAJaW5ib3hbMF0gPSBjcHVfdG9fYmU2NCh2aXJ0KTsKIAlpbmJveFsxXSA9IGNwdV90b19iZTY0KGRtYV9hZGRyKTsKIAotCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCAxLCAwLCBDTURfTUFQX0lDTSwgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIDEsIDAsIENNRF9NQVBfSUNNLAorCQkJQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKIAotCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCAxNiwgaW5ib3gsIGluZG1hKTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAogCWlmICghZXJyKQogCQltdGhjYV9kYmcoZGV2LCAiTWFwcGVkIHBhZ2UgYXQgJWxseCB0byAlbGx4IGZvciBJQ00uXG4iLApAQCAtMTMzOCw2OSArMTQwMSwyNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbXRoY2FfU1cySFdfTVBUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqbXB0X2VudHJ5LAoraW50IG10aGNhX1NXMkhXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICAgaW50IG1wdF9pbmRleCwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IGluZG1hOwotCWludCBlcnI7Ci0KLQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgbXB0X2VudHJ5LAotCQkJICAgICAgIE1USENBX01QVF9FTlRSWV9TSVpFLAotCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoaW5kbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCBtcHRfaW5kZXgsIDAsIENNRF9TVzJIV19NUFQsCi0JCQlDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwotCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIGluZG1hLAotCQkJIE1USENBX01QVF9FTlRSWV9TSVpFLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIG1wdF9pbmRleCwgMCwgQ01EX1NXMkhXX01QVCwKKwkJCSBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwogfQogCi1pbnQgbXRoY2FfSFcyU1dfTVBUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqbXB0X2VudHJ5LAoraW50IG10aGNhX0hXMlNXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICAgaW50IG1wdF9pbmRleCwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IG91dGRtYSA9IDA7Ci0JaW50IGVycjsKLQotCWlmIChtcHRfZW50cnkpIHsKLQkJb3V0ZG1hID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBtcHRfZW50cnksCi0JCQkJCU1USENBX01QVF9FTlRSWV9TSVpFLAotCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKG91dGRtYSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgb3V0ZG1hLCBtcHRfaW5kZXgsICFtcHRfZW50cnksCi0JCQkgICAgQ01EX0hXMlNXX01QVCwKLQkJCSAgICBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwotCi0JaWYgKG1wdF9lbnRyeSkKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIG91dGRtYSwKLQkJCQkgTVRIQ0FfTVBUX0VOVFJZX1NJWkUsCi0JCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3ggPyBtYWlsYm94LT5kbWEgOiAwLCBtcHRfaW5kZXgsCisJCQkgICAgICFtYWlsYm94LCBDTURfSFcyU1dfTVBULAorCQkJICAgICBDTURfVElNRV9DTEFTU19CLCBzdGF0dXMpOwogfQogCi1pbnQgbXRoY2FfV1JJVEVfTVRUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0ICptdHRfZW50cnksCitpbnQgbXRoY2FfV1JJVEVfTVRUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgICBpbnQgbnVtX210dCwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IGluZG1hOwotCWludCBlcnI7Ci0KLQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgbXR0X2VudHJ5LAotCQkJICAgICAgIChudW1fbXR0ICsgMikgKiA4LAotCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoaW5kbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCBudW1fbXR0LCAwLCBDTURfV1JJVEVfTVRULAotCQkJQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBpbmRtYSwKLQkJCSAobnVtX210dCArIDIpICogOCwgUENJX0RNQV9UT0RFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBudW1fbXR0LCAwLCBDTURfV1JJVEVfTVRULAorCQkJIENNRF9USU1FX0NMQVNTX0IsIHN0YXR1cyk7CiB9CiAKIGludCBtdGhjYV9TWU5DX1RQVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpCkBAIC0xNDE4LDkyICsxNDM4LDM4IEBACiAJCQkgMCwgQ01EX01BUF9FUSwgQ01EX1RJTUVfQ0xBU1NfQiwgc3RhdHVzKTsKIH0KIAotaW50IG10aGNhX1NXMkhXX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqZXFfY29udGV4dCwKK2ludCBtdGhjYV9TVzJIV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKQogewotCWRtYV9hZGRyX3QgaW5kbWE7Ci0JaW50IGVycjsKLQotCWluZG1hID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBlcV9jb250ZXh0LAotCQkJICAgICAgIE1USENBX0VRX0NPTlRFWFRfU0laRSwKLQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGluZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWQoZGV2LCBpbmRtYSwgZXFfbnVtLCAwLCBDTURfU1cySFdfRVEsCi0JCQlDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwotCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIGluZG1hLAotCQkJIE1USENBX0VRX0NPTlRFWFRfU0laRSwgUENJX0RNQV9UT0RFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBlcV9udW0sIDAsIENNRF9TVzJIV19FUSwKKwkJCSBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogfQogCi1pbnQgbXRoY2FfSFcyU1dfRVEoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICplcV9jb250ZXh0LAoraW50IG10aGNhX0hXMlNXX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgIGludCBlcV9udW0sIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBvdXRkbWEgPSAwOwotCWludCBlcnI7Ci0KLQlvdXRkbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIGVxX2NvbnRleHQsCi0JCQkJTVRIQ0FfRVFfQ09OVEVYVF9TSVpFLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihvdXRkbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsIGVxX251bSwgMCwKLQkJCSAgICBDTURfSFcyU1dfRVEsCi0JCQkgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBvdXRkbWEsCi0JCQkgTVRIQ0FfRVFfQ09OVEVYVF9TSVpFLAotCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgZXFfbnVtLCAwLAorCQkJICAgICBDTURfSFcyU1dfRVEsCisJCQkgICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7CiB9CiAKLWludCBtdGhjYV9TVzJIV19DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmNxX2NvbnRleHQsCitpbnQgbXRoY2FfU1cySFdfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgaW50IGNxX251bSwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IGluZG1hOwotCWludCBlcnI7Ci0KLQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgY3FfY29udGV4dCwKLQkJCSAgICAgICBNVEhDQV9DUV9DT05URVhUX1NJWkUsCi0JCQkgICAgICAgUENJX0RNQV9UT0RFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihpbmRtYSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbXRoY2FfY21kKGRldiwgaW5kbWEsIGNxX251bSwgMCwgQ01EX1NXMkhXX0NRLAorCXJldHVybiBtdGhjYV9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGNxX251bSwgMCwgQ01EX1NXMkhXX0NRLAogCQkJQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKLQotCXBjaV91bm1hcF9zaW5nbGUoZGV2LT5wZGV2LCBpbmRtYSwKLQkJCSBNVEhDQV9DUV9DT05URVhUX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXJldHVybiBlcnI7CiB9CiAKLWludCBtdGhjYV9IVzJTV19DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmNxX2NvbnRleHQsCitpbnQgbXRoY2FfSFcyU1dfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgaW50IGNxX251bSwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IG91dGRtYSA9IDA7Ci0JaW50IGVycjsKLQotCW91dGRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgY3FfY29udGV4dCwKLQkJCQlNVEhDQV9DUV9DT05URVhUX1NJWkUsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKG91dGRtYSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG91dGRtYSwgY3FfbnVtLCAwLAotCQkJICAgIENNRF9IVzJTV19DUSwKLQkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwotCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIG91dGRtYSwKLQkJCSBNVEhDQV9DUV9DT05URVhUX1NJWkUsCi0JCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCBjcV9udW0sIDAsCisJCQkgICAgIENNRF9IVzJTV19DUSwKKwkJCSAgICAgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIH0KIAogaW50IG10aGNhX01PRElGWV9RUChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCB0cmFucywgdTMyIG51bSwKLQkJICAgIGludCBpc19lZSwgdm9pZCAqcXBfY29udGV4dCwgdTMyIG9wdG1hc2ssCisJCSAgICBpbnQgaXNfZWUsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1MzIgb3B0bWFzaywKIAkJICAgIHU4ICpzdGF0dXMpCiB7CiAJc3RhdGljIGNvbnN0IHUxNiBvcFtdID0gewpAQCAtMTUyMCwzNiArMTQ4NiwzNCBAQAogCQlbTVRIQ0FfVFJBTlNfQU5ZMlJTVF0gICA9IENNRF9FUlIyUlNUX1FQRUUKIAl9OwogCXU4IG9wX21vZCA9IDA7Ci0KLQlkbWFfYWRkcl90IGluZG1hOworCWludCBteV9tYWlsYm94ID0gMDsKIAlpbnQgZXJyOwogCiAJaWYgKHRyYW5zIDwgMCB8fCB0cmFucyA+PSBBUlJBWV9TSVpFKG9wKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodHJhbnMgPT0gTVRIQ0FfVFJBTlNfQU5ZMlJTVCkgewotCQlpbmRtYSAgPSAwOwogCQlvcF9tb2QgPSAzOwkvKiBkb24ndCB3cml0ZSBvdXRib3gsIGFueS0+cmVzZXQgKi8KIAogCQkvKiBGb3IgZGVidWdnaW5nICovCi0JCXFwX2NvbnRleHQgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIE1USENBX1FQX0NPTlRFWFRfU0laRSwKLQkJCQkJCSAgJmluZG1hKTsKLQkJb3BfbW9kID0gMjsJLyogd3JpdGUgb3V0Ym94LCBhbnktPnJlc2V0ICovCisJCWlmICghbWFpbGJveCkgeworCQkJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwkJCWlmICghSVNfRVJSKG1haWxib3gpKSB7CisJCQkJbXlfbWFpbGJveCA9IDE7CisJCQkJb3BfbW9kICAgICA9IDI7CS8qIHdyaXRlIG91dGJveCwgYW55LT5yZXNldCAqLworCQkJfSBlbHNlCisJCQkJbWFpbGJveCA9IE5VTEw7CisJCX0KIAl9IGVsc2UgewotCQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgcXBfY29udGV4dCwKLQkJCQkgICAgICAgTVRIQ0FfUVBfQ09OVEVYVF9TSVpFLAotCQkJCSAgICAgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihpbmRtYSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQogCQlpZiAoMCkgewogCQkJaW50IGk7CiAJCQltdGhjYV9kYmcoZGV2LCAiRHVtcGluZyBRUCBjb250ZXh0OlxuIik7Ci0JCQlwcmludGsoIiAgb3B0IHBhcmFtIG1hc2s6ICUwOHhcbiIsIGJlMzJfdG9fY3B1cChxcF9jb250ZXh0KSk7CisJCQlwcmludGsoIiAgb3B0IHBhcmFtIG1hc2s6ICUwOHhcbiIsIGJlMzJfdG9fY3B1cChtYWlsYm94LT5idWYpKTsKIAkJCWZvciAoaSA9IDA7IGkgPCAweDEwMCAvIDQ7ICsraSkgewogCQkJCWlmIChpICUgOCA9PSAwKQogCQkJCQlwcmludGsoIiAgWyUwMnhdICIsIGkgKiA0KTsKLQkJCQlwcmludGsoIiAlMDh4IiwgYmUzMl90b19jcHUoKCh1MzIgKikgcXBfY29udGV4dClbaSArIDJdKSk7CisJCQkJcHJpbnRrKCIgJTA4eCIsCisJCQkJICAgICAgIGJlMzJfdG9fY3B1KCgodTMyICopIG1haWxib3gtPmJ1ZilbaSArIDJdKSk7CiAJCQkJaWYgKChpICsgMSkgJSA4ID09IDApCiAJCQkJCXByaW50aygiXG4iKTsKIAkJCX0KQEAgLTE1NTcsNTUgKzE1MjEsMzkgQEAKIAl9CiAKIAlpZiAodHJhbnMgPT0gTVRIQ0FfVFJBTlNfQU5ZMlJTVCkgewotCQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgMCwgaW5kbWEsICghIWlzX2VlIDw8IDI0KSB8IG51bSwKLQkJCQkgICAgb3BfbW9kLCBvcFt0cmFuc10sIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CisJCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBtYWlsYm94ID8gbWFpbGJveC0+ZG1hIDogMCwKKwkJCQkgICAgKCEhaXNfZWUgPDwgMjQpIHwgbnVtLCBvcF9tb2QsCisJCQkJICAgIG9wW3RyYW5zXSwgQ01EX1RJTUVfQ0xBU1NfQywgc3RhdHVzKTsKIAotCQlpZiAoMCkgeworCQlpZiAoMCAmJiBtYWlsYm94KSB7CiAJCQlpbnQgaTsKIAkJCW10aGNhX2RiZyhkZXYsICJEdW1waW5nIFFQIGNvbnRleHQ6XG4iKTsKLQkJCXByaW50aygiICUwOHhcbiIsIGJlMzJfdG9fY3B1cChxcF9jb250ZXh0KSk7CisJCQlwcmludGsoIiAlMDh4XG4iLCBiZTMyX3RvX2NwdXAobWFpbGJveC0+YnVmKSk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgMHgxMDAgLyA0OyArK2kpIHsKIAkJCQlpZiAoaSAlIDggPT0gMCkKIAkJCQkJcHJpbnRrKCJbJTAyeF0gIiwgaSAqIDQpOwotCQkJCXByaW50aygiICUwOHgiLCBiZTMyX3RvX2NwdSgoKHUzMiAqKSBxcF9jb250ZXh0KVtpICsgMl0pKTsKKwkJCQlwcmludGsoIiAlMDh4IiwKKwkJCQkgICAgICAgYmUzMl90b19jcHUoKCh1MzIgKikgbWFpbGJveC0+YnVmKVtpICsgMl0pKTsKIAkJCQlpZiAoKGkgKyAxKSAlIDggPT0gMCkKIAkJCQkJcHJpbnRrKCJcbiIpOwogCQkJfQogCQl9CiAKIAl9IGVsc2UKLQkJZXJyID0gbXRoY2FfY21kKGRldiwgaW5kbWEsICghIWlzX2VlIDw8IDI0KSB8IG51bSwKKwkJZXJyID0gbXRoY2FfY21kKGRldiwgbWFpbGJveC0+ZG1hLCAoISFpc19lZSA8PCAyNCkgfCBudW0sCiAJCQkJb3BfbW9kLCBvcFt0cmFuc10sIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CiAKLQlpZiAodHJhbnMgIT0gTVRIQ0FfVFJBTlNfQU5ZMlJTVCkKLQkJcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIGluZG1hLAotCQkJCSBNVEhDQV9RUF9DT05URVhUX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWVsc2UKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIE1USENBX1FQX0NPTlRFWFRfU0laRSwKLQkJCQkgICAgcXBfY29udGV4dCwgaW5kbWEpOworCWlmIChteV9tYWlsYm94KQorCQltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKKwogCXJldHVybiBlcnI7CiB9CiAKIGludCBtdGhjYV9RVUVSWV9RUChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBudW0sIGludCBpc19lZSwKLQkJICAgdm9pZCAqcXBfY29udGV4dCwgdTggKnN0YXR1cykKKwkJICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHU4ICpzdGF0dXMpCiB7Ci0JZG1hX2FkZHJfdCBvdXRkbWEgPSAwOwotCWludCBlcnI7Ci0KLQlvdXRkbWEgPSBwY2lfbWFwX3NpbmdsZShkZXYtPnBkZXYsIHFwX2NvbnRleHQsCi0JCQkJTVRIQ0FfUVBfQ09OVEVYVF9TSVpFLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihvdXRkbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZF9ib3goZGV2LCAwLCBvdXRkbWEsICghIWlzX2VlIDw8IDI0KSB8IG51bSwgMCwKLQkJCSAgICBDTURfUVVFUllfUVBFRSwKLQkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwotCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIG91dGRtYSwKLQkJCSBNVEhDQV9RUF9DT05URVhUX1NJWkUsCi0JCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiBtdGhjYV9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAoISFpc19lZSA8PCAyNCkgfCBudW0sIDAsCisJCQkgICAgIENNRF9RVUVSWV9RUEVFLCBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwogfQogCiBpbnQgbXRoY2FfQ09ORl9TUEVDSUFMX1FQKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxcG4sCkBAIC0xNjM1LDExICsxNTgzLDExIEBACiB9CiAKIGludCBtdGhjYV9NQURfSUZDKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGlnbm9yZV9ta2V5LCBpbnQgaWdub3JlX2JrZXksCi0JCSAgaW50IHBvcnQsIHN0cnVjdCBpYl93YyogaW5fd2MsIHN0cnVjdCBpYl9ncmgqIGluX2dyaCwKKwkJICBpbnQgcG9ydCwgc3RydWN0IGliX3djICppbl93Yywgc3RydWN0IGliX2dyaCAqaW5fZ3JoLAogCQkgIHZvaWQgKmluX21hZCwgdm9pZCAqcmVzcG9uc2VfbWFkLCB1OCAqc3RhdHVzKQogewotCXZvaWQgKmJveDsKLQlkbWFfYWRkcl90IGRtYTsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqaW5tYWlsYm94LCAqb3V0bWFpbGJveDsKKwl2b2lkICppbmJveDsKIAlpbnQgZXJyOwogCXUzMiBpbl9tb2RpZmllciA9IHBvcnQ7CiAJdTggb3BfbW9kaWZpZXIgPSAwOwpAQCAtMTY1MywxMSArMTYwMSwxOCBAQAogI2RlZmluZSBNQURfSUZDX1BLRVlfT0ZGU0VUICAgMHgxMGUKICNkZWZpbmUgTUFEX0lGQ19HUkhfT0ZGU0VUICAgIDB4MTQwCiAKLQlib3ggPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIE1BRF9JRkNfQk9YX1NJWkUsICZkbWEpOwotCWlmICghYm94KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpbm1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihpbm1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihpbm1haWxib3gpOworCWluYm94ID0gaW5tYWlsYm94LT5idWY7CiAKLQltZW1jcHkoYm94LCBpbl9tYWQsIDI1Nik7CisJb3V0bWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG91dG1haWxib3gpKSB7CisJCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIGlubWFpbGJveCk7CisJCXJldHVybiBQVFJfRVJSKG91dG1haWxib3gpOworCX0KKworCW1lbWNweShpbmJveCwgaW5fbWFkLCAyNTYpOwogCiAJLyoKIAkgKiBLZXkgY2hlY2sgdHJhcHMgY2FuJ3QgYmUgZ2VuZXJhdGVkIHVubGVzcyB3ZSBoYXZlIGluX3djIHRvCkBAIC0xNjcxLDk3ICsxNjI2LDY1IEBACiAJaWYgKGluX3djKSB7CiAJCXU4IHZhbDsKIAotCQltZW1zZXQoYm94ICsgMjU2LCAwLCAyNTYpOworCQltZW1zZXQoaW5ib3ggKyAyNTYsIDAsIDI1Nik7CiAKLQkJTVRIQ0FfUFVUKGJveCwgaW5fd2MtPnFwX251bSwgCSAgTUFEX0lGQ19NWV9RUE5fT0ZGU0VUKTsKLQkJTVRIQ0FfUFVUKGJveCwgaW5fd2MtPnNyY19xcCwgCSAgTUFEX0lGQ19SUVBOX09GRlNFVCk7CisJCU1USENBX1BVVChpbmJveCwgaW5fd2MtPnFwX251bSwgICAgIE1BRF9JRkNfTVlfUVBOX09GRlNFVCk7CisJCU1USENBX1BVVChpbmJveCwgaW5fd2MtPnNyY19xcCwgICAgIE1BRF9JRkNfUlFQTl9PRkZTRVQpOwogCiAJCXZhbCA9IGluX3djLT5zbCA8PCA0OwotCQlNVEhDQV9QVVQoYm94LCB2YWwsICAgICAgICAgICAgICAgTUFEX0lGQ19TTF9PRkZTRVQpOworCQlNVEhDQV9QVVQoaW5ib3gsIHZhbCwgICAgICAgICAgICAgICBNQURfSUZDX1NMX09GRlNFVCk7CiAKIAkJdmFsID0gaW5fd2MtPmRsaWRfcGF0aF9iaXRzIHwKIAkJCShpbl93Yy0+d2NfZmxhZ3MgJiBJQl9XQ19HUkggPyAweDgwIDogMCk7Ci0JCU1USENBX1BVVChib3gsIHZhbCwgICAgICAgICAgICAgICBNQURfSUZDX0dSSF9PRkZTRVQpOworCQlNVEhDQV9QVVQoaW5ib3gsIHZhbCwgICAgICAgICAgICAgICBNQURfSUZDX0dSSF9PRkZTRVQpOwogCi0JCU1USENBX1BVVChib3gsIGluX3djLT5zbGlkLCAgICAgICBNQURfSUZDX1JMSURfT0ZGU0VUKTsKLQkJTVRIQ0FfUFVUKGJveCwgaW5fd2MtPnBrZXlfaW5kZXgsIE1BRF9JRkNfUEtFWV9PRkZTRVQpOworCQlNVEhDQV9QVVQoaW5ib3gsIGluX3djLT5zbGlkLCAgICAgICBNQURfSUZDX1JMSURfT0ZGU0VUKTsKKwkJTVRIQ0FfUFVUKGluYm94LCBpbl93Yy0+cGtleV9pbmRleCwgTUFEX0lGQ19QS0VZX09GRlNFVCk7CiAKIAkJaWYgKGluX2dyaCkKLQkJCW1lbWNweSgodTggKikgYm94ICsgTUFEX0lGQ19HUkhfT0ZGU0VULCBpbl9ncmgsIDQwKTsKKwkJCW1lbWNweShpbmJveCArIE1BRF9JRkNfR1JIX09GRlNFVCwgaW5fZ3JoLCA0MCk7CiAKIAkJb3BfbW9kaWZpZXIgfD0gMHgxMDsKIAogCQlpbl9tb2RpZmllciB8PSBpbl93Yy0+c2xpZCA8PCAxNjsKIAl9CiAKLQllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgZG1hLCBkbWEgKyA1MTIsIGluX21vZGlmaWVyLCBvcF9tb2RpZmllciwKKwllcnIgPSBtdGhjYV9jbWRfYm94KGRldiwgaW5tYWlsYm94LT5kbWEsIG91dG1haWxib3gtPmRtYSwKKwkJCSAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsCiAJCQkgICAgQ01EX01BRF9JRkMsIENNRF9USU1FX0NMQVNTX0MsIHN0YXR1cyk7CiAKIAlpZiAoIWVyciAmJiAhKnN0YXR1cykKLQkJbWVtY3B5KHJlc3BvbnNlX21hZCwgYm94ICsgNTEyLCAyNTYpOworCQltZW1jcHkocmVzcG9uc2VfbWFkLCBvdXRtYWlsYm94LT5idWYsIDI1Nik7CiAKLQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgTUFEX0lGQ19CT1hfU0laRSwgYm94LCBkbWEpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIGlubWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgb3V0bWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IG10aGNhX1JFQURfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LCB2b2lkICptZ20sCi0JCSAgIHU4ICpzdGF0dXMpCitpbnQgbXRoY2FfUkVBRF9NR00oc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaW5kZXgsCisJCSAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKQogewotCWRtYV9hZGRyX3Qgb3V0ZG1hID0gMDsKLQlpbnQgZXJyOwotCi0Jb3V0ZG1hID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBtZ20sCi0JCQkJTVRIQ0FfTUdNX0VOVFJZX1NJWkUsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKG91dGRtYSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyID0gbXRoY2FfY21kX2JveChkZXYsIDAsIG91dGRtYSwgaW5kZXgsIDAsCi0JCQkgICAgQ01EX1JFQURfTUdNLAotCQkJICAgIENNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgb3V0ZG1hLAotCQkJIE1USENBX01HTV9FTlRSWV9TSVpFLAotCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gbXRoY2FfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgaW5kZXgsIDAsCisJCQkgICAgIENNRF9SRUFEX01HTSwgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIH0KIAotaW50IG10aGNhX1dSSVRFX01HTShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpbmRleCwgdm9pZCAqbWdtLAotCQkgICAgdTggKnN0YXR1cykKK2ludCBtdGhjYV9XUklURV9NR00oc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaW5kZXgsCisJCSAgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IGluZG1hOwotCWludCBlcnI7Ci0KLQlpbmRtYSA9IHBjaV9tYXBfc2luZ2xlKGRldi0+cGRldiwgbWdtLAotCQkJICAgICAgIE1USENBX01HTV9FTlRSWV9TSVpFLAotCQkJICAgICAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoaW5kbWEpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG10aGNhX2NtZChkZXYsIGluZG1hLCBpbmRleCwgMCwgQ01EX1dSSVRFX01HTSwKLQkJCUNNRF9USU1FX0NMQVNTX0EsIHN0YXR1cyk7Ci0KLQlwY2lfdW5tYXBfc2luZ2xlKGRldi0+cGRldiwgaW5kbWEsCi0JCQkgTVRIQ0FfTUdNX0VOVFJZX1NJWkUsIFBDSV9ETUFfVE9ERVZJQ0UpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIG10aGNhX2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5kZXgsIDAsIENNRF9XUklURV9NR00sCisJCQkgQ01EX1RJTUVfQ0xBU1NfQSwgc3RhdHVzKTsKIH0KIAotaW50IG10aGNhX01HSURfSEFTSChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmdpZCwgdTE2ICpoYXNoLAotCQkgICAgdTggKnN0YXR1cykKK2ludCBtdGhjYV9NR0lEX0hBU0goc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKKwkJICAgIHUxNiAqaGFzaCwgdTggKnN0YXR1cykKIHsKLQlkbWFfYWRkcl90IGluZG1hOwogCXU2NCBpbW07CiAJaW50IGVycjsKIAotCWluZG1hID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wZGV2LCBnaWQsIDE2LCBQQ0lfRE1BX1RPREVWSUNFKTsKLQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKGluZG1hKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtdGhjYV9jbWRfaW1tKGRldiwgaW5kbWEsICZpbW0sIDAsIDAsIENNRF9NR0lEX0hBU0gsCisJZXJyID0gbXRoY2FfY21kX2ltbShkZXYsIG1haWxib3gtPmRtYSwgJmltbSwgMCwgMCwgQ01EX01HSURfSEFTSCwKIAkJCSAgICBDTURfVElNRV9DTEFTU19BLCBzdGF0dXMpOwotCSpoYXNoID0gaW1tOwogCi0JcGNpX3VubWFwX3NpbmdsZShkZXYtPnBkZXYsIGluZG1hLCAxNiwgUENJX0RNQV9UT0RFVklDRSk7CisJKmhhc2ggPSBpbW07CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NtZC5oCmluZGV4IGFkZjAzOWIuLmVkNTE3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9jbWQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY21kLmgKQEAgLTM3LDggKzM3LDcgQEAKIAogI2luY2x1ZGUgPGliX3ZlcmJzLmg+CiAKLSNkZWZpbmUgTVRIQ0FfQ01EX01BSUxCT1hfQUxJR04gMTZVTAotI2RlZmluZSBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSAoTVRIQ0FfQ01EX01BSUxCT1hfQUxJR04gLSAxKQorI2RlZmluZSBNVEhDQV9NQUlMQk9YX1NJWkUgNDA5NgogCiBlbnVtIHsKIAkvKiBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHk6ICovCkBAIC0xMTIsNiArMTExLDExIEBACiAJREVWX0xJTV9GTEFHX1VEX01VTFRJICAgICAgICAgICA9IDEgPDwgMjEsCiB9OwogCitzdHJ1Y3QgbXRoY2FfbWFpbGJveCB7CisJZG1hX2FkZHJfdCBkbWE7CisJdm9pZCAgICAgICpidWY7Cit9OworCiBzdHJ1Y3QgbXRoY2FfZGV2X2xpbSB7CiAJaW50IG1heF9zcnFfc3o7CiAJaW50IG1heF9xcF9zejsKQEAgLTIzNSwxMSArMjM5LDE3IEBACiAJdTMyIGNhcF9tYXNrOwogfTsKIAoraW50IG10aGNhX2NtZF9pbml0KHN0cnVjdCBtdGhjYV9kZXYgKmRldik7Cit2b2lkIG10aGNhX2NtZF9jbGVhbnVwKHN0cnVjdCBtdGhjYV9kZXYgKmRldik7CiBpbnQgbXRoY2FfY21kX3VzZV9ldmVudHMoc3RydWN0IG10aGNhX2RldiAqZGV2KTsKIHZvaWQgbXRoY2FfY21kX3VzZV9wb2xsaW5nKHN0cnVjdCBtdGhjYV9kZXYgKmRldik7CiB2b2lkIG10aGNhX2NtZF9ldmVudChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUxNiB0b2tlbiwKIAkJICAgICB1OCAgc3RhdHVzLCB1NjQgb3V0X3BhcmFtKTsKIAorc3RydWN0IG10aGNhX21haWxib3ggKm10aGNhX2FsbG9jX21haWxib3goc3RydWN0IG10aGNhX2RldiAqZGV2LAorCQkJCQkgIHVuc2lnbmVkIGludCBnZnBfbWFzayk7Cit2b2lkIG10aGNhX2ZyZWVfbWFpbGJveChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94KTsKKwogaW50IG10aGNhX1NZU19FTihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU4ICpzdGF0dXMpOwogaW50IG10aGNhX1NZU19ESVMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9NQVBfRkEoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtICppY20sIHU4ICpzdGF0dXMpOwpAQCAtMjcwLDQxICsyODAsMzkgQEAKIGludCBtdGhjYV9VTk1BUF9JQ01fQVVYKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfU0VUX0lDTV9TSVpFKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IGljbV9zaXplLCB1NjQgKmF1eF9wYWdlcywKIAkJICAgICAgIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1NXMkhXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKm1wdF9lbnRyeSwKK2ludCBtdGhjYV9TVzJIV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgIGludCBtcHRfaW5kZXgsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX0hXMlNXX01QVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKm1wdF9lbnRyeSwKK2ludCBtdGhjYV9IVzJTV19NUFQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgIGludCBtcHRfaW5kZXgsIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1dSSVRFX01UVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHU2NCAqbXR0X2VudHJ5LAoraW50IG10aGNhX1dSSVRFX01UVChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICAgaW50IG51bV9tdHQsIHU4ICpzdGF0dXMpOwogaW50IG10aGNhX1NZTkNfVFBUKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfTUFQX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTY0IGV2ZW50X21hc2ssIGludCB1bm1hcCwKIAkJIGludCBlcV9udW0sIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX1NXMkhXX0VRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqZXFfY29udGV4dCwKK2ludCBtdGhjYV9TVzJIV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICBpbnQgZXFfbnVtLCB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9IVzJTV19FUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHZvaWQgKmVxX2NvbnRleHQsCitpbnQgbXRoY2FfSFcyU1dfRVEoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwKIAkJICAgaW50IGVxX251bSwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfU1cySFdfQ1Eoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICpjcV9jb250ZXh0LAoraW50IG10aGNhX1NXMkhXX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsCiAJCSAgIGludCBjcV9udW0sIHU4ICpzdGF0dXMpOwotaW50IG10aGNhX0hXMlNXX0NRKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdm9pZCAqY3FfY29udGV4dCwKK2ludCBtdGhjYV9IVzJTV19DUShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAogCQkgICBpbnQgY3FfbnVtLCB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9NT0RJRllfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgdHJhbnMsIHUzMiBudW0sCi0JCSAgICBpbnQgaXNfZWUsIHZvaWQgKnFwX2NvbnRleHQsIHUzMiBvcHRtYXNrLAorCQkgICAgaW50IGlzX2VlLCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTMyIG9wdG1hc2ssCiAJCSAgICB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9RVUVSWV9RUChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBudW0sIGludCBpc19lZSwKLQkJICAgdm9pZCAqcXBfY29udGV4dCwgdTggKnN0YXR1cyk7CisJCSAgIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LCB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9DT05GX1NQRUNJQUxfUVAoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgdHlwZSwgdTMyIHFwbiwKIAkJCSAgdTggKnN0YXR1cyk7CiBpbnQgbXRoY2FfTUFEX0lGQyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBpZ25vcmVfbWtleSwgaW50IGlnbm9yZV9ia2V5LAotCQkgIGludCBwb3J0LCBzdHJ1Y3QgaWJfd2MqIGluX3djLCBzdHJ1Y3QgaWJfZ3JoKiBpbl9ncmgsCisJCSAgaW50IHBvcnQsIHN0cnVjdCBpYl93YyAqaW5fd2MsIHN0cnVjdCBpYl9ncmggKmluX2dyaCwKIAkJICB2b2lkICppbl9tYWQsIHZvaWQgKnJlc3BvbnNlX21hZCwgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfUkVBRF9NR00oc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgaW5kZXgsIHZvaWQgKm1nbSwKLQkJICAgdTggKnN0YXR1cyk7Ci1pbnQgbXRoY2FfV1JJVEVfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LCB2b2lkICptZ20sCi0JCSAgICB1OCAqc3RhdHVzKTsKLWludCBtdGhjYV9NR0lEX0hBU0goc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICpnaWQsIHUxNiAqaGFzaCwKLQkJICAgIHU4ICpzdGF0dXMpOworaW50IG10aGNhX1JFQURfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LAorCQkgICBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveCwgdTggKnN0YXR1cyk7CitpbnQgbXRoY2FfV1JJVEVfTUdNKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IGluZGV4LAorCQkgICAgc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3gsIHU4ICpzdGF0dXMpOworaW50IG10aGNhX01HSURfSEFTSChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94LAorCQkgICAgdTE2ICpoYXNoLCB1OCAqc3RhdHVzKTsKIGludCBtdGhjYV9OT1Aoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1OCAqc3RhdHVzKTsKIAotI2RlZmluZSBNQUlMQk9YX0FMSUdOKHgpICgodm9pZCAqKSBBTElHTigodW5zaWduZWQgbG9uZykgKHgpLCBNVEhDQV9DTURfTUFJTEJPWF9BTElHTikpCi0KICNlbmRpZiAvKiBNVEhDQV9DTURfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2NxLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwppbmRleCAyYmYzNDdiLi5iNWFlYTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfY3EuYwpAQCAtMSw1ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMTcxLDYgKzE3MywxNyBAQAogCWNxZS0+b3duZXIgPSBNVEhDQV9DUV9FTlRSWV9PV05FUl9IVzsKIH0KIAorc3RhdGljIHZvaWQgZHVtcF9jcWUoc3RydWN0IG10aGNhX2RldiAqZGV2LCB2b2lkICpjcWVfcHRyKQoreworCV9fYmUzMiAqY3FlID0gY3FlX3B0cjsKKworCSh2b2lkKSBjcWU7CS8qIGF2b2lkIHdhcm5pbmcgaWYgbXRoY2FfZGJnIGNvbXBpbGVkIGF3YXkuLi4gKi8KKwltdGhjYV9kYmcoZGV2LCAiQ1FFIGNvbnRlbnRzICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJICBiZTMyX3RvX2NwdShjcWVbMF0pLCBiZTMyX3RvX2NwdShjcWVbMV0pLCBiZTMyX3RvX2NwdShjcWVbMl0pLAorCQkgIGJlMzJfdG9fY3B1KGNxZVszXSksIGJlMzJfdG9fY3B1KGNxZVs0XSksIGJlMzJfdG9fY3B1KGNxZVs1XSksCisJCSAgYmUzMl90b19jcHUoY3FlWzZdKSwgYmUzMl90b19jcHUoY3FlWzddKSk7Cit9CisKIC8qCiAgKiBpbmNyIGlzIGlnbm9yZWQgaW4gbmF0aXZlIEFyYmVsIChtZW0tZnJlZSkgbW9kZSwgc28gY3EtPmNvbnNfaW5kZXgKICAqIHNob3VsZCBiZSBjb3JyZWN0IGJlZm9yZSBjYWxsaW5nIHVwZGF0ZV9jb25zX2luZGV4KCkuCkBAIC0yODAsMTYgKzI5MywxMiBAQAogCWludCBkYmQ7CiAJdTMyIG5ld193cWU7CiAKLQlpZiAoMSAmJiBjcWUtPnN5bmRyb21lICE9IFNZTkRST01FX1dSX0ZMVVNIX0VSUikgewotCQlpbnQgajsKLQotCQltdGhjYV9kYmcoZGV2LCAiJXgvJWQ6IGVycm9yIENRRSAtPiBRUE4gJTA2eCwgV1FFIEAgJTA4eFxuIiwKLQkJCSAgY3EtPmNxbiwgY3EtPmNvbnNfaW5kZXgsIGJlMzJfdG9fY3B1KGNxZS0+bXlfcXBuKSwKLQkJCSAgYmUzMl90b19jcHUoY3FlLT53cWUpKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgODsgKytqKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgWyUyeF0gJTA4eFxuIiwKLQkJCSAgICAgICBqICogNCwgYmUzMl90b19jcHUoKCh1MzIgKikgY3FlKVtqXSkpOworCWlmIChjcWUtPnN5bmRyb21lID09IFNZTkRST01FX0xPQ0FMX1FQX09QX0VSUikgeworCQltdGhjYV9kYmcoZGV2LCAibG9jYWwgUVAgb3BlcmF0aW9uIGVyciAiCisJCQkgICIoUVBOICUwNngsIFdRRSBAICUwOHgsIENRTiAlMDZ4LCBpbmRleCAlZClcbiIsCisJCQkgIGJlMzJfdG9fY3B1KGNxZS0+bXlfcXBuKSwgYmUzMl90b19jcHUoY3FlLT53cWUpLAorCQkJICBjcS0+Y3FuLCBjcS0+Y29uc19pbmRleCk7CisJCWR1bXBfY3FlKGRldiwgY3FlKTsKIAl9CiAKIAkvKgpAQCAtMzc3LDE1ICszODYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wX2NxZShzdHJ1Y3QgbXRoY2FfY3FlICpjcWUpCi17Ci0JaW50IGo7Ci0KLQlmb3IgKGogPSAwOyBqIDwgODsgKytqKQotCQlwcmludGsoS0VSTl9ERUJVRyAiICBbJTJ4XSAlMDh4XG4iLAotCQkgICAgICAgaiAqIDQsIGJlMzJfdG9fY3B1KCgodTMyICopIGNxZSlbal0pKTsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgbXRoY2FfcG9sbF9vbmUoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkJCSBzdHJ1Y3QgbXRoY2FfY3EgKmNxLAogCQkJCSBzdHJ1Y3QgbXRoY2FfcXAgKipjdXJfcXAsCkBAIC00MTQsOCArNDE0LDcgQEAKIAkJbXRoY2FfZGJnKGRldiwgIiV4LyVkOiBDUUUgLT4gUVBOICUwNngsIFdRRSBAICUwOHhcbiIsCiAJCQkgIGNxLT5jcW4sIGNxLT5jb25zX2luZGV4LCBiZTMyX3RvX2NwdShjcWUtPm15X3FwbiksCiAJCQkgIGJlMzJfdG9fY3B1KGNxZS0+d3FlKSk7Ci0KLQkJZHVtcF9jcWUoY3FlKTsKKwkJZHVtcF9jcWUoZGV2LCBjcWUpOwogCX0KIAogCWlzX2Vycm9yID0gKGNxZS0+b3Bjb2RlICYgTVRIQ0FfRVJST1JfQ1FFX09QQ09ERV9NQVNLKSA9PQpAQCAtNjM4LDE5ICs2MzcsMTkgQEAKIAlpbnQgc2l6ZTsKIAogCWlmIChjcS0+aXNfZGlyZWN0KQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwKLQkJCQkgICAgKGNxLT5pYmNxLmNxZSArIDEpICogTVRIQ0FfQ1FfRU5UUllfU0laRSwKLQkJCQkgICAgY3EtPnF1ZXVlLmRpcmVjdC5idWYsCi0JCQkJICAgIHBjaV91bm1hcF9hZGRyKCZjcS0+cXVldWUuZGlyZWN0LAotCQkJCQkJICAgbWFwcGluZykpOworCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsCisJCQkJICAoY3EtPmliY3EuY3FlICsgMSkgKiBNVEhDQV9DUV9FTlRSWV9TSVpFLAorCQkJCSAgY3EtPnF1ZXVlLmRpcmVjdC5idWYsCisJCQkJICBwY2lfdW5tYXBfYWRkcigmY3EtPnF1ZXVlLmRpcmVjdCwKKwkJCQkJCSBtYXBwaW5nKSk7CiAJZWxzZSB7CiAJCXNpemUgPSAoY3EtPmliY3EuY3FlICsgMSkgKiBNVEhDQV9DUV9FTlRSWV9TSVpFOwogCQlmb3IgKGkgPSAwOyBpIDwgKHNpemUgKyBQQUdFX1NJWkUgLSAxKSAvIFBBR0VfU0laRTsgKytpKQogCQkJaWYgKGNxLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmKQotCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCi0JCQkJCQkgICAgY3EtPnF1ZXVlLnBhZ2VfbGlzdFtpXS5idWYsCi0JCQkJCQkgICAgcGNpX3VubWFwX2FkZHIoJmNxLT5xdWV1ZS5wYWdlX2xpc3RbaV0sCi0JCQkJCQkJCSAgIG1hcHBpbmcpKTsKKwkJCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkJCSAgY3EtPnF1ZXVlLnBhZ2VfbGlzdFtpXS5idWYsCisJCQkJCQkgIHBjaV91bm1hcF9hZGRyKCZjcS0+cXVldWUucGFnZV9saXN0W2ldLAorCQkJCQkJCQkgbWFwcGluZykpOwogCiAJCWtmcmVlKGNxLT5xdWV1ZS5wYWdlX2xpc3QpOwogCX0KQEAgLTY3MCw4ICs2NjksOCBAQAogCQlucGFnZXMgICAgICAgID0gMTsKIAkJc2hpZnQgICAgICAgICA9IGdldF9vcmRlcihzaXplKSArIFBBR0VfU0hJRlQ7CiAKLQkJY3EtPnF1ZXVlLmRpcmVjdC5idWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsCi0JCQkJCQkJICAgIHNpemUsICZ0KTsKKwkJY3EtPnF1ZXVlLmRpcmVjdC5idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LAorCQkJCQkJCSAgc2l6ZSwgJnQsIEdGUF9LRVJORUwpOwogCQlpZiAoIWNxLT5xdWV1ZS5kaXJlY3QuYnVmKQogCQkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTcwOSw3ICs3MDgsOCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7ICsraSkgewogCQkJY3EtPnF1ZXVlLnBhZ2VfbGlzdFtpXS5idWYgPQotCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLCAmdCk7CisJCQkJZG1hX2FsbG9jX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCQkJICAgJnQsIEdGUF9LRVJORUwpOwogCQkJaWYgKCFjcS0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZikKIAkJCQlnb3RvIGVycl9mcmVlOwogCkBAIC03NDMsMTAgKzc0MywxMSBAQAogfQogCiBpbnQgbXRoY2FfaW5pdF9jcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBuZW50LAorCQkgIHN0cnVjdCBtdGhjYV91Y29udGV4dCAqY3R4LCB1MzIgcGRuLAogCQkgIHN0cnVjdCBtdGhjYV9jcSAqY3EpCiB7CiAJaW50IHNpemUgPSBuZW50ICogTVRIQ0FfQ1FfRU5UUllfU0laRTsKLQl2b2lkICptYWlsYm94ID0gTlVMTDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfY3FfY29udGV4dCAqY3FfY29udGV4dDsKIAlpbnQgZXJyID0gLUVOT01FTTsKIAl1OCBzdGF0dXM7CkBAIC03NTQsNDUgKzc1NSw0OSBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAotCWNxLT5pYmNxLmNxZSA9IG5lbnQgLSAxOworCWNxLT5pYmNxLmNxZSAgPSBuZW50IC0gMTsKKwljcS0+aXNfa2VybmVsID0gIWN0eDsKIAogCWNxLT5jcW4gPSBtdGhjYV9hbGxvYygmZGV2LT5jcV90YWJsZS5hbGxvYyk7CiAJaWYgKGNxLT5jcW4gPT0gLTEpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewotCQljcS0+YXJtX3NuID0gMTsKLQogCQllcnIgPSBtdGhjYV90YWJsZV9nZXQoZGV2LCBkZXYtPmNxX3RhYmxlLnRhYmxlLCBjcS0+Y3FuKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX291dDsKIAotCQllcnIgPSAtRU5PTUVNOworCQlpZiAoY3EtPmlzX2tlcm5lbCkgeworCQkJY3EtPmFybV9zbiA9IDE7CiAKLQkJY3EtPnNldF9jaV9kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksCi0JCQkJCQkgICAgIGNxLT5jcW4sICZjcS0+c2V0X2NpX2RiKTsKLQkJaWYgKGNxLT5zZXRfY2lfZGJfaW5kZXggPCAwKQotCQkJZ290byBlcnJfb3V0X2ljbTsKKwkJCWVyciA9IC1FTk9NRU07CiAKLQkJY3EtPmFybV9kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9BUk0sCi0JCQkJCQkgIGNxLT5jcW4sICZjcS0+YXJtX2RiKTsKLQkJaWYgKGNxLT5hcm1fZGJfaW5kZXggPCAwKQotCQkJZ290byBlcnJfb3V0X2NpOworCQkJY3EtPnNldF9jaV9kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksCisJCQkJCQkJICAgICBjcS0+Y3FuLCAmY3EtPnNldF9jaV9kYik7CisJCQlpZiAoY3EtPnNldF9jaV9kYl9pbmRleCA8IDApCisJCQkJZ290byBlcnJfb3V0X2ljbTsKKworCQkJY3EtPmFybV9kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9BUk0sCisJCQkJCQkJICBjcS0+Y3FuLCAmY3EtPmFybV9kYik7CisJCQlpZiAoY3EtPmFybV9kYl9pbmRleCA8IDApCisJCQkJZ290byBlcnJfb3V0X2NpOworCQl9CiAJfQogCi0JbWFpbGJveCA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfY3FfY29udGV4dCkgKyBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KQotCQlnb3RvIGVycl9vdXRfbWFpbGJveDsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCWdvdG8gZXJyX291dF9hcm07CiAKLQljcV9jb250ZXh0ID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwljcV9jb250ZXh0ID0gbWFpbGJveC0+YnVmOwogCi0JZXJyID0gbXRoY2FfYWxsb2NfY3FfYnVmKGRldiwgc2l6ZSwgY3EpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF9tYWlsYm94OworCWlmIChjcS0+aXNfa2VybmVsKSB7CisJCWVyciA9IG10aGNhX2FsbG9jX2NxX2J1ZihkZXYsIHNpemUsIGNxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX291dF9tYWlsYm94OwogCi0JZm9yIChpID0gMDsgaSA8IG5lbnQ7ICsraSkKLQkJc2V0X2NxZV9odyhnZXRfY3FlKGNxLCBpKSk7CisJCWZvciAoaSA9IDA7IGkgPCBuZW50OyArK2kpCisJCQlzZXRfY3FlX2h3KGdldF9jcWUoY3EsIGkpKTsKKwl9CiAKIAlzcGluX2xvY2tfaW5pdCgmY3EtPmxvY2spOwogCWF0b21pY19zZXQoJmNxLT5yZWZjb3VudCwgMSk7CkBAIC04MDMsMTEgKzgwOCwxNCBAQAogCQkJCQkJICBNVEhDQV9DUV9TVEFURV9ESVNBUk1FRCB8CiAJCQkJCQkgIE1USENBX0NRX0ZMQUdfVFIpOwogCWNxX2NvbnRleHQtPnN0YXJ0ICAgICAgICAgICA9IGNwdV90b19iZTY0KDApOwotCWNxX2NvbnRleHQtPmxvZ3NpemVfdXNycGFnZSA9IGNwdV90b19iZTMyKChmZnMobmVudCkgLSAxKSA8PCAyNCB8Ci0JCQkJCQkgIGRldi0+ZHJpdmVyX3Vhci5pbmRleCk7CisJY3FfY29udGV4dC0+bG9nc2l6ZV91c3JwYWdlID0gY3B1X3RvX2JlMzIoKGZmcyhuZW50KSAtIDEpIDw8IDI0KTsKKwlpZiAoY3R4KQorCQljcV9jb250ZXh0LT5sb2dzaXplX3VzcnBhZ2UgfD0gY3B1X3RvX2JlMzIoY3R4LT51YXIuaW5kZXgpOworCWVsc2UKKwkJY3FfY29udGV4dC0+bG9nc2l6ZV91c3JwYWdlIHw9IGNwdV90b19iZTMyKGRldi0+ZHJpdmVyX3Vhci5pbmRleCk7CiAJY3FfY29udGV4dC0+ZXJyb3JfZXFuICAgICAgID0gY3B1X3RvX2JlMzIoZGV2LT5lcV90YWJsZS5lcVtNVEhDQV9FUV9BU1lOQ10uZXFuKTsKIAljcV9jb250ZXh0LT5jb21wX2VxbiAgICAgICAgPSBjcHVfdG9fYmUzMihkZXYtPmVxX3RhYmxlLmVxW01USENBX0VRX0NPTVBdLmVxbik7Ci0JY3FfY29udGV4dC0+cGQgICAgICAgICAgICAgID0gY3B1X3RvX2JlMzIoZGV2LT5kcml2ZXJfcGQucGRfbnVtKTsKKwljcV9jb250ZXh0LT5wZCAgICAgICAgICAgICAgPSBjcHVfdG9fYmUzMihwZG4pOwogCWNxX2NvbnRleHQtPmxrZXkgICAgICAgICAgICA9IGNwdV90b19iZTMyKGNxLT5tci5pYm1yLmxrZXkpOwogCWNxX2NvbnRleHQtPmNxbiAgICAgICAgICAgICA9IGNwdV90b19iZTMyKGNxLT5jcW4pOwogCkBAIC04MTYsNyArODI0LDcgQEAKIAkJY3FfY29udGV4dC0+c3RhdGVfZGIgPSBjcHVfdG9fYmUzMihjcS0+YXJtX2RiX2luZGV4KTsKIAl9CiAKLQllcnIgPSBtdGhjYV9TVzJIV19DUShkZXYsIGNxX2NvbnRleHQsIGNxLT5jcW4sICZzdGF0dXMpOworCWVyciA9IG10aGNhX1NXMkhXX0NRKGRldiwgbWFpbGJveCwgY3EtPmNxbiwgJnN0YXR1cyk7CiAJaWYgKGVycikgewogCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX0NRIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9tcjsKQEAgLTg0MCwyMiArODQ4LDI1IEBACiAKIAljcS0+Y29uc19pbmRleCA9IDA7CiAKLQlrZnJlZShtYWlsYm94KTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAogCXJldHVybiAwOwogCiBlcnJfb3V0X2ZyZWVfbXI6Ci0JbXRoY2FfZnJlZV9tcihkZXYsICZjcS0+bXIpOwotCW10aGNhX2ZyZWVfY3FfYnVmKGRldiwgY3EpOworCWlmIChjcS0+aXNfa2VybmVsKSB7CisJCW10aGNhX2ZyZWVfbXIoZGV2LCAmY3EtPm1yKTsKKwkJbXRoY2FfZnJlZV9jcV9idWYoZGV2LCBjcSk7CisJfQogCiBlcnJfb3V0X21haWxib3g6Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQorZXJyX291dF9hcm06CisJaWYgKGNxLT5pc19rZXJuZWwgJiYgbXRoY2FfaXNfbWVtZnJlZShkZXYpKQogCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9BUk0sIGNxLT5hcm1fZGJfaW5kZXgpOwogCiBlcnJfb3V0X2NpOgotCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpCisJaWYgKGNxLT5pc19rZXJuZWwgJiYgbXRoY2FfaXNfbWVtZnJlZShkZXYpKQogCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksIGNxLT5zZXRfY2lfZGJfaW5kZXgpOwogCiBlcnJfb3V0X2ljbToKQEAgLTg3MCwzMiArODgxLDMxIEBACiB2b2lkIG10aGNhX2ZyZWVfY3Eoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkgICBzdHJ1Y3QgbXRoY2FfY3EgKmNxKQogewotCXZvaWQgKm1haWxib3g7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CiAKIAltaWdodF9zbGVlcCgpOwogCi0JbWFpbGJveCA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfY3FfY29udGV4dCkgKyBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KSB7CisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKSB7CiAJCW10aGNhX3dhcm4oZGV2LCAiTm8gbWVtb3J5IGZvciBtYWlsYm94IHRvIGZyZWUgQ1EuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAotCWVyciA9IG10aGNhX0hXMlNXX0NRKGRldiwgTUFJTEJPWF9BTElHTihtYWlsYm94KSwgY3EtPmNxbiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfSFcyU1dfQ1EoZGV2LCBtYWlsYm94LCBjcS0+Y3FuLCAmc3RhdHVzKTsKIAlpZiAoZXJyKQogCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX0NRIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCWVsc2UgaWYgKHN0YXR1cykKLQkJbXRoY2Ffd2FybihkZXYsICJIVzJTV19DUSByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLAotCQkJICAgc3RhdHVzKTsKKwkJbXRoY2Ffd2FybihkZXYsICJIVzJTV19DUSByZXR1cm5lZCBzdGF0dXMgMHglMDJ4XG4iLCBzdGF0dXMpOwogCiAJaWYgKDApIHsKLQkJdTMyICpjdHggPSBNQUlMQk9YX0FMSUdOKG1haWxib3gpOworCQl1MzIgKmN0eCA9IG1haWxib3gtPmJ1ZjsKIAkJaW50IGo7CiAKIAkJcHJpbnRrKEtFUk5fRVJSICJjb250ZXh0IGZvciBDUU4gJXggKGNvbnMgaW5kZXggJXgsIG5leHQgc3cgJWQpXG4iLAotCQkgICAgICAgY3EtPmNxbiwgY3EtPmNvbnNfaW5kZXgsICEhbmV4dF9jcWVfc3coY3EpKTsKKwkJICAgICAgIGNxLT5jcW4sIGNxLT5jb25zX2luZGV4LAorCQkgICAgICAgY3EtPmlzX2tlcm5lbCA/ICEhbmV4dF9jcWVfc3coY3EpIDogMCk7CiAJCWZvciAoaiA9IDA7IGogPCAxNjsgKytqKQogCQkJcHJpbnRrKEtFUk5fRVJSICJbJTJ4XSAlMDh4XG4iLCBqICogNCwgYmUzMl90b19jcHUoY3R4W2pdKSk7CiAJfQpAQCAtOTEzLDE3ICs5MjMsMTggQEAKIAlhdG9taWNfZGVjKCZjcS0+cmVmY291bnQpOwogCXdhaXRfZXZlbnQoY3EtPndhaXQsICFhdG9taWNfcmVhZCgmY3EtPnJlZmNvdW50KSk7CiAKLQltdGhjYV9mcmVlX21yKGRldiwgJmNxLT5tcik7Ci0JbXRoY2FfZnJlZV9jcV9idWYoZGV2LCBjcSk7Ci0KLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7Ci0JCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX0FSTSwgICAgY3EtPmFybV9kYl9pbmRleCk7Ci0JCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX1NFVF9DSSwgY3EtPnNldF9jaV9kYl9pbmRleCk7Ci0JCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+Y3FfdGFibGUudGFibGUsIGNxLT5jcW4pOworCWlmIChjcS0+aXNfa2VybmVsKSB7CisJCW10aGNhX2ZyZWVfbXIoZGV2LCAmY3EtPm1yKTsKKwkJbXRoY2FfZnJlZV9jcV9idWYoZGV2LCBjcSk7CisJCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKKwkJCW10aGNhX2ZyZWVfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX0NRX0FSTSwgICAgY3EtPmFybV9kYl9pbmRleCk7CisJCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0ksIGNxLT5zZXRfY2lfZGJfaW5kZXgpOworCQl9CiAJfQogCisJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5jcV90YWJsZS50YWJsZSwgY3EtPmNxbik7CiAJbXRoY2FfZnJlZSgmZGV2LT5jcV90YWJsZS5hbGxvYywgY3EtPmNxbik7Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiB9CiAKIGludCBfX2RldmluaXQgbXRoY2FfaW5pdF9jcV90YWJsZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZGV2LmgKaW5kZXggZTNkNzllMi4uNWVjZGQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2Rldi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kZXYuaApAQCAtMSw1ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC00Niw4ICs0OCw4IEBACiAKICNkZWZpbmUgRFJWX05BTUUJImliX210aGNhIgogI2RlZmluZSBQRlgJCURSVl9OQU1FICI6ICIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMDYtcHJlIgotI2RlZmluZSBEUlZfUkVMREFURQkiTm92ZW1iZXIgOCwgMjAwNCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMDYiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJKdW5lIDIzLCAyMDA1IgogCiBlbnVtIHsKIAlNVEhDQV9GTEFHX0REUl9ISURERU4gPSAxIDw8IDEsCkBAIC05OCw2ICsxMDAsNyBAQAogfTsKIAogc3RydWN0IG10aGNhX2NtZCB7CisJc3RydWN0IHBjaV9wb29sICAgICAgICAgICpwb29sOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgdXNlX2V2ZW50czsKIAlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgICAgIGhjcl9zZW07CiAJc3RydWN0IHNlbWFwaG9yZSAJICBwb2xsX3NlbTsKQEAgLTM3Niw5ICszNzksMTUgQEAKIGludCBtdGhjYV91YXJfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIpOwogdm9pZCBtdGhjYV91YXJfZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhcik7CiAKLWludCBtdGhjYV9wZF9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpOworaW50IG10aGNhX3BkX2FsbG9jKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHByaXZpbGVnZWQsIHN0cnVjdCBtdGhjYV9wZCAqcGQpOwogdm9pZCBtdGhjYV9wZF9mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3BkICpwZCk7CiAKK3N0cnVjdCBtdGhjYV9tdHQgKm10aGNhX2FsbG9jX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBzaXplKTsKK3ZvaWQgbXRoY2FfZnJlZV9tdHQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfbXR0ICptdHQpOworaW50IG10aGNhX3dyaXRlX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9tdHQgKm10dCwKKwkJICAgIGludCBzdGFydF9pbmRleCwgdTY0ICpidWZmZXJfbGlzdCwgaW50IGxpc3RfbGVuKTsKK2ludCBtdGhjYV9tcl9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBwZCwgaW50IGJ1ZmZlcl9zaXplX3NoaWZ0LAorCQkgICB1NjQgaW92YSwgdTY0IHRvdGFsX3NpemUsIHUzMiBhY2Nlc3MsIHN0cnVjdCBtdGhjYV9tciAqbXIpOwogaW50IG10aGNhX21yX2FsbG9jX25vdHJhbnMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcGQsCiAJCQkgICB1MzIgYWNjZXNzLCBzdHJ1Y3QgbXRoY2FfbXIgKm1yKTsKIGludCBtdGhjYV9tcl9hbGxvY19waHlzKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHBkLApAQCAtNDA1LDYgKzQxNCw3IEBACiBpbnQgbXRoY2FfdGF2b3JfYXJtX2NxKHN0cnVjdCBpYl9jcSAqY3EsIGVudW0gaWJfY3Ffbm90aWZ5IG5vdGlmeSk7CiBpbnQgbXRoY2FfYXJiZWxfYXJtX2NxKHN0cnVjdCBpYl9jcSAqY3EsIGVudW0gaWJfY3Ffbm90aWZ5IG5vdGlmeSk7CiBpbnQgbXRoY2FfaW5pdF9jcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBuZW50LAorCQkgIHN0cnVjdCBtdGhjYV91Y29udGV4dCAqY3R4LCB1MzIgcGRuLAogCQkgIHN0cnVjdCBtdGhjYV9jcSAqY3EpOwogdm9pZCBtdGhjYV9mcmVlX2NxKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJICAgc3RydWN0IG10aGNhX2NxICpjcSk7CkBAIC00MzAsMTIgKzQ0MCwxNCBAQAogCQkgICBzdHJ1Y3QgbXRoY2FfY3EgKnJlY3ZfY3EsCiAJCSAgIGVudW0gaWJfcXBfdHlwZSB0eXBlLAogCQkgICBlbnVtIGliX3NpZ190eXBlIHNlbmRfcG9saWN5LAorCQkgICBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCiAJCSAgIHN0cnVjdCBtdGhjYV9xcCAqcXApOwogaW50IG10aGNhX2FsbG9jX3NxcChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCSAgICBzdHJ1Y3QgbXRoY2FfcGQgKnBkLAogCQkgICAgc3RydWN0IG10aGNhX2NxICpzZW5kX2NxLAogCQkgICAgc3RydWN0IG10aGNhX2NxICpyZWN2X2NxLAogCQkgICAgZW51bSBpYl9zaWdfdHlwZSBzZW5kX3BvbGljeSwKKwkJICAgIHN0cnVjdCBpYl9xcF9jYXAgKmNhcCwKIAkJICAgIGludCBxcG4sCiAJCSAgICBpbnQgcG9ydCwKIAkJICAgIHN0cnVjdCBtdGhjYV9zcXAgKnNxcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfZG9vcmJlbGwuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kb29yYmVsbC5oCmluZGV4IDgyMTAzOWEuLjUzNWZhZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kb29yYmVsbC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9kb29yYmVsbC5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9lcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMKaW5kZXggZjQ2ZDYxNS4uY2JjZjJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX2VxLmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogCQlQQUdFX1NJWkU7CiAJdTY0ICpkbWFfbGlzdCA9IE5VTEw7CiAJZG1hX2FkZHJfdCB0OwotCXZvaWQgKm1haWxib3ggPSBOVUxMOworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXN0cnVjdCBtdGhjYV9lcV9jb250ZXh0ICplcV9jb250ZXh0OwogCWludCBlcnIgPSAtRU5PTUVNOwogCWludCBpOwpAQCAtNDk0LDE3ICs0OTQsMTYgQEAKIAlpZiAoIWRtYV9saXN0KQogCQlnb3RvIGVycl9vdXRfZnJlZTsKIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAqZXFfY29udGV4dCArIE1USENBX0NNRF9NQUlMQk9YX0VYVFJBLAotCQkJICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1haWxib3gpCisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlnb3RvIGVycl9vdXRfZnJlZTsKLQllcV9jb250ZXh0ID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwllcV9jb250ZXh0ID0gbWFpbGJveC0+YnVmOwogCiAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7Ci0JCWVxLT5wYWdlX2xpc3RbaV0uYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LAotCQkJCQkJCSAgICBQQUdFX1NJWkUsICZ0KTsKKwkJZXEtPnBhZ2VfbGlzdFtpXS5idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LAorCQkJCQkJCSAgUEFHRV9TSVpFLCAmdCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZXEtPnBhZ2VfbGlzdFtpXS5idWYpCi0JCQlnb3RvIGVycl9vdXRfZnJlZTsKKwkJCWdvdG8gZXJyX291dF9mcmVlX3BhZ2VzOwogCiAJCWRtYV9saXN0W2ldID0gdDsKIAkJcGNpX3VubWFwX2FkZHJfc2V0KCZlcS0+cGFnZV9saXN0W2ldLCBtYXBwaW5nLCB0KTsKQEAgLTUxNyw3ICs1MTYsNyBAQAogCiAJZXEtPmVxbiA9IG10aGNhX2FsbG9jKCZkZXYtPmVxX3RhYmxlLmFsbG9jKTsKIAlpZiAoZXEtPmVxbiA9PSAtMSkKLQkJZ290byBlcnJfb3V0X2ZyZWU7CisJCWdvdG8gZXJyX291dF9mcmVlX3BhZ2VzOwogCiAJZXJyID0gbXRoY2FfbXJfYWxsb2NfcGh5cyhkZXYsIGRldi0+ZHJpdmVyX3BkLnBkX251bSwKIAkJCQkgIGRtYV9saXN0LCBQQUdFX1NISUZULCBucGFnZXMsCkBAIC01NDgsNyArNTQ3LDcgQEAKIAllcV9jb250ZXh0LT5pbnRyICAgICAgICAgICAgPSBpbnRyOwogCWVxX2NvbnRleHQtPmxrZXkgICAgICAgICAgICA9IGNwdV90b19iZTMyKGVxLT5tci5pYm1yLmxrZXkpOwogCi0JZXJyID0gbXRoY2FfU1cySFdfRVEoZGV2LCBlcV9jb250ZXh0LCBlcS0+ZXFuLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9TVzJIV19FUShkZXYsIG1haWxib3gsIGVxLT5lcW4sICZzdGF0dXMpOwogCWlmIChlcnIpIHsKIAkJbXRoY2Ffd2FybihkZXYsICJTVzJIV19FUSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKIAkJZ290byBlcnJfb3V0X2ZyZWVfbXI7CkBAIC01NjEsNyArNTYwLDcgQEAKIAl9CiAKIAlrZnJlZShkbWFfbGlzdCk7Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKIAllcS0+ZXFuX21hc2sgICA9IHN3YWIzMigxIDw8IGVxLT5lcW4pOwogCWVxLT5jb25zX2luZGV4ID0gMDsKQEAgLTU3OSwxNyArNTc4LDE5IEBACiAgZXJyX291dF9mcmVlX2VxOgogCW10aGNhX2ZyZWUoJmRldi0+ZXFfdGFibGUuYWxsb2MsIGVxLT5lcW4pOwogCi0gZXJyX291dF9mcmVlOgorIGVycl9vdXRfZnJlZV9wYWdlczoKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpCiAJCWlmIChlcS0+cGFnZV9saXN0W2ldLmJ1ZikKLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsCi0JCQkJCSAgICBlcS0+cGFnZV9saXN0W2ldLmJ1ZiwKLQkJCQkJICAgIHBjaV91bm1hcF9hZGRyKCZlcS0+cGFnZV9saXN0W2ldLAotCQkJCQkJCSAgIG1hcHBpbmcpKTsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCQkgIGVxLT5wYWdlX2xpc3RbaV0uYnVmLAorCQkJCQkgIHBjaV91bm1hcF9hZGRyKCZlcS0+cGFnZV9saXN0W2ldLAorCQkJCQkJCSBtYXBwaW5nKSk7CiAKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKKworIGVycl9vdXRfZnJlZToKIAlrZnJlZShlcS0+cGFnZV9saXN0KTsKIAlrZnJlZShkbWFfbGlzdCk7Ci0Ja2ZyZWUobWFpbGJveCk7CiAKICBlcnJfb3V0OgogCXJldHVybiBlcnI7CkBAIC01OTgsMjUgKzU5OSwyMiBAQAogc3RhdGljIHZvaWQgbXRoY2FfZnJlZV9lcShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCiAJCQkgIHN0cnVjdCBtdGhjYV9lcSAqZXEpCiB7Ci0Jdm9pZCAqbWFpbGJveCA9IE5VTEw7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CiAJaW50IG5wYWdlcyA9IChlcS0+bmVudCAqIE1USENBX0VRX0VOVFJZX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSAvCiAJCVBBR0VfU0laRTsKIAlpbnQgaTsKIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IG10aGNhX2VxX2NvbnRleHQpICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCiAJCXJldHVybjsKIAotCWVyciA9IG10aGNhX0hXMlNXX0VRKGRldiwgTUFJTEJPWF9BTElHTihtYWlsYm94KSwKLQkJCSAgICAgZXEtPmVxbiwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfSFcyU1dfRVEoZGV2LCBtYWlsYm94LCBlcS0+ZXFuLCAmc3RhdHVzKTsKIAlpZiAoZXJyKQogCQltdGhjYV93YXJuKGRldiwgIkhXMlNXX0VRIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCWlmIChzdGF0dXMpCi0JCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfRVEgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKLQkJCSAgIHN0YXR1cyk7CisJCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfRVEgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwgc3RhdHVzKTsKIAogCWRldi0+ZXFfdGFibGUuYXJtX21hc2sgJj0gfmVxLT5lcW5fbWFzazsKIApAQCAtNjI1LDcgKzYyMyw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBtdGhjYV9lcV9jb250ZXh0KSAvIDQ7ICsraSkgewogCQkJaWYgKGkgJSA0ID09IDApCiAJCQkJcHJpbnRrKCJbJTAyeF0gIiwgaSAqIDQpOwotCQkJcHJpbnRrKCIgJTA4eCIsIGJlMzJfdG9fY3B1cChNQUlMQk9YX0FMSUdOKG1haWxib3gpICsgaSAqIDQpKTsKKwkJCXByaW50aygiICUwOHgiLCBiZTMyX3RvX2NwdXAobWFpbGJveC0+YnVmICsgaSAqIDQpKTsKIAkJCWlmICgoaSArIDEpICUgNCA9PSAwKQogCQkJCXByaW50aygiXG4iKTsKIAkJfQpAQCAtNjM4LDcgKzYzNiw3IEBACiAJCQkJICAgIHBjaV91bm1hcF9hZGRyKCZlcS0+cGFnZV9saXN0W2ldLCBtYXBwaW5nKSk7CiAKIAlrZnJlZShlcS0+cGFnZV9saXN0KTsKLQlrZnJlZShtYWlsYm94KTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIH0KIAogc3RhdGljIHZvaWQgbXRoY2FfZnJlZV9pcnFzKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKQEAgLTcwOSw4ICs3MDcsNyBAQAogCQlpZiAobXRoY2FfbWFwX3JlZyhkZXYsICgocGNpX3Jlc291cmNlX2xlbihkZXYtPnBkZXYsIDApIC0gMSkgJgogCQkJCQlkZXYtPmZ3LmFyYmVsLmVxX2FybV9iYXNlKSArIDQsIDQsCiAJCQkJICAmZGV2LT5lcV9yZWdzLmFyYmVsLmVxX2FybSkpIHsKLQkJCW10aGNhX2VycihkZXYsICJDb3VsZG4ndCBtYXAgaW50ZXJydXB0IGNsZWFyIHJlZ2lzdGVyLCAiCi0JCQkJICAiYWJvcnRpbmcuXG4iKTsKKwkJCW10aGNhX2VycihkZXYsICJDb3VsZG4ndCBtYXAgRVEgYXJtIHJlZ2lzdGVyLCBhYm9ydGluZy5cbiIpOwogCQkJbXRoY2FfdW5tYXBfcmVnKGRldiwgKHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSAtIDEpICYKIAkJCQkJZGV2LT5mdy5hcmJlbC5jbHJfaW50X2Jhc2UsIE1USENBX0NMUl9JTlRfU0laRSwKIAkJCQkJZGV2LT5jbHJfYmFzZSk7CkBAIC03MjEsOCArNzE4LDcgQEAKIAkJCQkgIGRldi0+ZncuYXJiZWwuZXFfc2V0X2NpX2Jhc2UsCiAJCQkJICBNVEhDQV9FUV9TRVRfQ0lfU0laRSwKIAkJCQkgICZkZXYtPmVxX3JlZ3MuYXJiZWwuZXFfc2V0X2NpX2Jhc2UpKSB7Ci0JCQltdGhjYV9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIGludGVycnVwdCBjbGVhciByZWdpc3RlciwgIgotCQkJCSAgImFib3J0aW5nLlxuIik7CisJCQltdGhjYV9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIEVRIENJIHJlZ2lzdGVyLCBhYm9ydGluZy5cbiIpOwogCQkJbXRoY2FfdW5tYXBfcmVnKGRldiwgKChwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkgLSAxKSAmCiAJCQkJCSAgICAgIGRldi0+ZncuYXJiZWwuZXFfYXJtX2Jhc2UpICsgNCwgNCwKIAkJCQkJZGV2LT5lcV9yZWdzLmFyYmVsLmVxX2FybSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21haW4uYwppbmRleCBkNDA1OTAzLi4yZWY5MTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tYWluLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNjksNyArNzAsNyBAQAogI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCiAKIHN0YXRpYyBjb25zdCBjaGFyIG10aGNhX3ZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KLQkiaWJfbXRoY2E6IE1lbGxhbm94IEluZmluaUJhbmQgSENBIGRyaXZlciB2IgorCURSVl9OQU1FICI6IE1lbGxhbm94IEluZmluaUJhbmQgSENBIGRyaXZlciB2IgogCURSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CiAKIHN0YXRpYyBzdHJ1Y3QgbXRoY2FfcHJvZmlsZSBkZWZhdWx0X3Byb2ZpbGUgPSB7CkBAIC02NjQsNyArNjY1LDcgQEAKIAkJZ290byBlcnJfcGRfdGFibGVfZnJlZTsKIAl9CiAKLQllcnIgPSBtdGhjYV9wZF9hbGxvYyhkZXYsICZkZXYtPmRyaXZlcl9wZCk7CisJZXJyID0gbXRoY2FfcGRfYWxsb2MoZGV2LCAxLCAmZGV2LT5kcml2ZXJfcGQpOwogCWlmIChlcnIpIHsKIAkJbXRoY2FfZXJyKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgZHJpdmVyIFBELCAiCiAJCQkgICJhYm9ydGluZy5cbiIpOwpAQCAtOTI3LDEzICs5MjgsMTMgQEAKIAkgKi8KIAlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkgfHwKIAkgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSAhPSAxIDw8IDIwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgRENTLCBhYm9ydGluZy4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBEQ1MsIGFib3J0aW5nLlxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2Rpc2FibGVfcGRldjsKIAl9CiAJaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDIpICYgSU9SRVNPVVJDRV9NRU0pIHx8CiAJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikgIT0gMSA8PCAyMykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIFVBUiwgYWJvcnRpbmcuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgVUFSLCBhYm9ydGluZy5cbiIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycl9kaXNhYmxlX3BkZXY7CiAJfQpAQCAtMTAwNCwyNSArMTAwNSwxOCBAQAogCSAgICAhcGNpX2VuYWJsZV9tc2kocGRldikpCiAJCW1kZXYtPm10aGNhX2ZsYWdzIHw9IE1USENBX0ZMQUdfTVNJOwogCi0Jc2VtYV9pbml0KCZtZGV2LT5jbWQuaGNyX3NlbSwgMSk7Ci0Jc2VtYV9pbml0KCZtZGV2LT5jbWQucG9sbF9zZW0sIDEpOwotCW1kZXYtPmNtZC51c2VfZXZlbnRzID0gMDsKLQotCW1kZXYtPmhjciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApICsgTVRIQ0FfSENSX0JBU0UsIE1USENBX0hDUl9TSVpFKTsKLQlpZiAoIW1kZXYtPmhjcikgewotCQltdGhjYV9lcnIobWRldiwgIkNvdWxkbid0IG1hcCBjb21tYW5kIHJlZ2lzdGVyLCAiCi0JCQkgICJhYm9ydGluZy5cbiIpOwotCQllcnIgPSAtRU5PTUVNOworCWlmIChtdGhjYV9jbWRfaW5pdChtZGV2KSkgeworCQltdGhjYV9lcnIobWRldiwgIkZhaWxlZCB0byBpbml0IGNvbW1hbmQgaW50ZXJmYWNlLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl9mcmVlX2RldjsKIAl9CiAKIAllcnIgPSBtdGhjYV90dW5lX3BjaShtZGV2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9pb3VubWFwOworCQlnb3RvIGVycl9jbWQ7CiAKIAllcnIgPSBtdGhjYV9pbml0X2hjYShtZGV2KTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9pb3VubWFwOworCQlnb3RvIGVycl9jbWQ7CiAKIAlpZiAobWRldi0+ZndfdmVyIDwgbXRoY2FfaGNhX3RhYmxlW2lkLT5kcml2ZXJfZGF0YV0ubGF0ZXN0X2Z3KSB7CiAJCW10aGNhX3dhcm4obWRldiwgIkhDQSBGVyB2ZXJzaW9uICV4LiV4LiV4IGlzIG9sZCAoJXguJXguJXggaXMgY3VycmVudCkuXG4iLApAQCAtMTA3MCw4ICsxMDY0LDggQEAKIGVycl9jbG9zZToKIAltdGhjYV9jbG9zZV9oY2EobWRldik7CiAKLWVycl9pb3VubWFwOgotCWlvdW5tYXAobWRldi0+aGNyKTsKK2Vycl9jbWQ6CisJbXRoY2FfY21kX2NsZWFudXAobWRldik7CiAKIGVycl9mcmVlX2RldjoKIAlpZiAobWRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX01TSV9YKQpAQCAtMTExOCwxMCArMTExMiw4IEBACiAJCWlvdW5tYXAobWRldi0+a2FyKTsKIAkJbXRoY2FfdWFyX2ZyZWUobWRldiwgJm1kZXYtPmRyaXZlcl91YXIpOwogCQltdGhjYV9jbGVhbnVwX3Vhcl90YWJsZShtZGV2KTsKLQogCQltdGhjYV9jbG9zZV9oY2EobWRldik7Ci0KLQkJaW91bm1hcChtZGV2LT5oY3IpOworCQltdGhjYV9jbWRfY2xlYW51cChtZGV2KTsKIAogCQlpZiAobWRldi0+bXRoY2FfZmxhZ3MgJiBNVEhDQV9GTEFHX01TSV9YKQogCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKQEAgLTExNjMsNyArMTE1NSw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbXRoY2FfcGNpX3RhYmxlKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG10aGNhX2RyaXZlciA9IHsKLQkubmFtZQkJPSAiaWJfbXRoY2EiLAorCS5uYW1lCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQk9IG10aGNhX3BjaV90YWJsZSwKIAkucHJvYmUJCT0gbXRoY2FfaW5pdF9vbmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtdGhjYV9yZW1vdmVfb25lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21jZy5jCmluZGV4IDcwYTY1NTMuLjViZTdkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tY2cuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWNnLmMKQEAgLTY2LDIyICs2NiwyMyBAQAogICogZW50cnkgaW4gaGFzaCBjaGFpbiBhbmQgKm1nbSBob2xkcyBlbmQgb2YgaGFzaCBjaGFpbi4KICAqLwogc3RhdGljIGludCBmaW5kX21nbShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsCi0JCSAgICB1OCAqZ2lkLCBzdHJ1Y3QgbXRoY2FfbWdtICptZ20sCisJCSAgICB1OCAqZ2lkLCBzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWdtX21haWxib3gsCiAJCSAgICB1MTYgKmhhc2gsIGludCAqcHJldiwgaW50ICppbmRleCkKIHsKLQl2b2lkICptYWlsYm94OworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OworCXN0cnVjdCBtdGhjYV9tZ20gKm1nbSA9IG1nbV9tYWlsYm94LT5idWY7CiAJdTggKm1naWQ7CiAJaW50IGVycjsKIAl1OCBzdGF0dXM7CiAKLQltYWlsYm94ID0ga21hbGxvYygxNiArIE1USENBX0NNRF9NQUlMQk9YX0VYVFJBLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1haWxib3gpCisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZ2lkID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwltZ2lkID0gbWFpbGJveC0+YnVmOwogCiAJbWVtY3B5KG1naWQsIGdpZCwgMTYpOwogCi0JZXJyID0gbXRoY2FfTUdJRF9IQVNIKGRldiwgbWdpZCwgaGFzaCwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfTUdJRF9IQVNIKGRldiwgbWFpbGJveCwgaGFzaCwgJnN0YXR1cyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAJaWYgKHN0YXR1cykgewpAQCAtMTAzLDcgKzEwNCw3IEBACiAJKnByZXYgID0gLTE7CiAKIAlkbyB7Ci0JCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgKmluZGV4LCBtZ20sICZzdGF0dXMpOworCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsICppbmRleCwgbWdtX21haWxib3gsICZzdGF0dXMpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJCWlmIChzdGF0dXMpIHsKQEAgLTEyOSwxNCArMTMwLDE0IEBACiAJKmluZGV4ID0gLTE7CiAKICBvdXQ6Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IG10aGNhX211bHRpY2FzdF9hdHRhY2goc3RydWN0IGliX3FwICppYnFwLCB1bmlvbiBpYl9naWQgKmdpZCwgdTE2IGxpZCkKIHsKIAlzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYgPSB0b19tZGV2KGlicXAtPmRldmljZSk7Ci0Jdm9pZCAqbWFpbGJveDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfbWdtICptZ207CiAJdTE2IGhhc2g7CiAJaW50IGluZGV4LCBwcmV2OwpAQCAtMTQ1LDE1ICsxNDYsMTUgQEAKIAlpbnQgZXJyOwogCXU4IHN0YXR1czsKIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAqbWdtICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWdtID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCW1nbSA9IG1haWxib3gtPmJ1ZjsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+bWNnX3RhYmxlLnNlbSkpCiAJCXJldHVybiAtRUlOVFI7CiAKLQllcnIgPSBmaW5kX21nbShkZXYsIGdpZC0+cmF3LCBtZ20sICZoYXNoLCAmcHJldiwgJmluZGV4KTsKKwllcnIgPSBmaW5kX21nbShkZXYsIGdpZC0+cmF3LCBtYWlsYm94LCAmaGFzaCwgJnByZXYsICZpbmRleCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE3MCw3ICsxNzEsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIGluZGV4LCBtZ20sICZzdGF0dXMpOworCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIGluZGV4LCBtYWlsYm94LCAmc3RhdHVzKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdHVzKSB7CkBAIC0xOTUsNyArMTk2LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgaW5kZXgsIG1nbSwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgaW5kZXgsIG1haWxib3gsICZzdGF0dXMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCWlmIChzdGF0dXMpIHsKQEAgLTIwNiw3ICsyMDcsNyBAQAogCWlmICghbGluaykKIAkJZ290byBvdXQ7CiAKLQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsIHByZXYsIG1nbSwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCBwcmV2LCBtYWlsYm94LCAmc3RhdHVzKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAlpZiAoc3RhdHVzKSB7CkBAIC0yMTcsNyArMjE4LDcgQEAKIAogCW1nbS0+bmV4dF9naWRfaW5kZXggPSBjcHVfdG9fYmUzMihpbmRleCA8PCA1KTsKIAotCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIHByZXYsIG1nbSwgJnN0YXR1cyk7CisJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgcHJldiwgbWFpbGJveCwgJnN0YXR1cyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAJaWYgKHN0YXR1cykgewpAQCAtMjI3LDE0ICsyMjgsMTQgQEAKIAogIG91dDoKIAl1cCgmZGV2LT5tY2dfdGFibGUuc2VtKTsKLQlrZnJlZShtYWlsYm94KTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogCiBpbnQgbXRoY2FfbXVsdGljYXN0X2RldGFjaChzdHJ1Y3QgaWJfcXAgKmlicXAsIHVuaW9uIGliX2dpZCAqZ2lkLCB1MTYgbGlkKQogewogCXN0cnVjdCBtdGhjYV9kZXYgKmRldiA9IHRvX21kZXYoaWJxcC0+ZGV2aWNlKTsKLQl2b2lkICptYWlsYm94OworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXN0cnVjdCBtdGhjYV9tZ20gKm1nbTsKIAl1MTYgaGFzaDsKIAlpbnQgcHJldiwgaW5kZXg7CkBAIC0yNDIsMTUgKzI0MywxNSBAQAogCWludCBlcnI7CiAJdTggc3RhdHVzOwogCi0JbWFpbGJveCA9IGttYWxsb2Moc2l6ZW9mICptZ20gKyBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KQotCQlyZXR1cm4gLUVOT01FTTsKLQltZ20gPSBNQUlMQk9YX0FMSUdOKG1haWxib3gpOworCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJbWdtID0gbWFpbGJveC0+YnVmOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5tY2dfdGFibGUuc2VtKSkKIAkJcmV0dXJuIC1FSU5UUjsKIAotCWVyciA9IGZpbmRfbWdtKGRldiwgZ2lkLT5yYXcsIG1nbSwgJmhhc2gsICZwcmV2LCAmaW5kZXgpOworCWVyciA9IGZpbmRfbWdtKGRldiwgZ2lkLT5yYXcsIG1haWxib3gsICZoYXNoLCAmcHJldiwgJmluZGV4KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMjg1LDcgKzI4Niw3IEBACiAJbWdtLT5xcFtsb2NdICAgPSBtZ20tPnFwW2kgLSAxXTsKIAltZ20tPnFwW2kgLSAxXSA9IDA7CiAKLQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWdtLCAmc3RhdHVzKTsKKwllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWFpbGJveCwgJnN0YXR1cyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAJaWYgKHN0YXR1cykgewpAQCAtMzA0LDcgKzMwNSw3IEBACiAJCWlmIChiZTMyX3RvX2NwdShtZ20tPm5leHRfZ2lkX2luZGV4KSA+PiA1KSB7CiAJCQllcnIgPSBtdGhjYV9SRUFEX01HTShkZXYsCiAJCQkJCSAgICAgYmUzMl90b19jcHUobWdtLT5uZXh0X2dpZF9pbmRleCkgPj4gNSwKLQkJCQkJICAgICBtZ20sICZzdGF0dXMpOworCQkJCQkgICAgIG1haWxib3gsICZzdGF0dXMpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIAkJCWlmIChzdGF0dXMpIHsKQEAgLTMxNiw3ICszMTcsNyBAQAogCQl9IGVsc2UKIAkJCW1lbXNldChtZ20tPmdpZCwgMCwgMTYpOwogCi0JCWVyciA9IG10aGNhX1dSSVRFX01HTShkZXYsIGluZGV4LCBtZ20sICZzdGF0dXMpOworCQllcnIgPSBtdGhjYV9XUklURV9NR00oZGV2LCBpbmRleCwgbWFpbGJveCwgJnN0YXR1cyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJaWYgKHN0YXR1cykgewpAQCAtMzI3LDcgKzMyOCw3IEBACiAJfSBlbHNlIHsKIAkJLyogUmVtb3ZlIGVudHJ5IGZyb20gQU1HTSAqLwogCQlpbmRleCA9IGJlMzJfdG9fY3B1KG1nbS0+bmV4dF9naWRfaW5kZXgpID4+IDU7Ci0JCWVyciA9IG10aGNhX1JFQURfTUdNKGRldiwgcHJldiwgbWdtLCAmc3RhdHVzKTsKKwkJZXJyID0gbXRoY2FfUkVBRF9NR00oZGV2LCBwcmV2LCBtYWlsYm94LCAmc3RhdHVzKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdHVzKSB7CkBAIC0zMzgsNyArMzM5LDcgQEAKIAogCQltZ20tPm5leHRfZ2lkX2luZGV4ID0gY3B1X3RvX2JlMzIoaW5kZXggPDwgNSk7CiAKLQkJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgcHJldiwgbWdtLCAmc3RhdHVzKTsKKwkJZXJyID0gbXRoY2FfV1JJVEVfTUdNKGRldiwgcHJldiwgbWFpbGJveCwgJnN0YXR1cyk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dDsKIAkJaWYgKHN0YXR1cykgewpAQCAtMzUwLDcgKzM1MSw3IEBACiAKICBvdXQ6CiAJdXAoJmRldi0+bWNnX3RhYmxlLnNlbSk7Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKaW5kZXggNjM3YjMwZS4uMmE4NjQ2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQ3LDYgKzQ4LDE1IEBACiAJTVRIQ0FfVEFCTEVfQ0hVTktfU0laRSA9IDEgPDwgMTgKIH07CiAKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG11dGV4OworCXN0cnVjdCB7CisJCXU2NCAgICAgICAgICAgICAgICB1dmlydDsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0IG1lbTsKKwkJaW50ICAgICAgICAgICAgICAgIHJlZmNvdW50OworCX0gICAgICAgICAgICAgICAgcGFnZVswXTsKK307CisKIHZvaWQgbXRoY2FfZnJlZV9pY20oc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfaWNtICppY20pCiB7CiAJc3RydWN0IG10aGNhX2ljbV9jaHVuayAqY2h1bmssICp0bXA7CkBAIC0xNzksOSArMTg5LDE0IEBACiAKIHZvaWQgbXRoY2FfdGFibGVfcHV0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX2ljbV90YWJsZSAqdGFibGUsIGludCBvYmopCiB7Ci0JaW50IGkgPSAob2JqICYgKHRhYmxlLT5udW1fb2JqIC0gMSkpICogdGFibGUtPm9ial9zaXplIC8gTVRIQ0FfVEFCTEVfQ0hVTktfU0laRTsKKwlpbnQgaTsKIAl1OCBzdGF0dXM7CiAKKwlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwkJcmV0dXJuOworCisJaSA9IChvYmogJiAodGFibGUtPm51bV9vYmogLSAxKSkgKiB0YWJsZS0+b2JqX3NpemUgLyBNVEhDQV9UQUJMRV9DSFVOS19TSVpFOworCiAJZG93bigmdGFibGUtPm11dGV4KTsKIAogCWlmICgtLXRhYmxlLT5pY21baV0tPnJlZmNvdW50ID09IDApIHsKQEAgLTI1Niw2ICsyNzEsOSBAQAogewogCWludCBpOwogCisJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCisJCXJldHVybjsKKwogCWZvciAoaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSArPSBNVEhDQV9UQUJMRV9DSFVOS19TSVpFIC8gdGFibGUtPm9ial9zaXplKQogCQltdGhjYV90YWJsZV9wdXQoZGV2LCB0YWJsZSwgaSk7CiB9CkBAIC0zMzYsMTMgKzM1NCwxMzMgQEAKIAlrZnJlZSh0YWJsZSk7CiB9CiAKLXN0YXRpYyB1NjQgbXRoY2FfdWFyY192aXJ0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHBhZ2UpCitzdGF0aWMgdTY0IG10aGNhX3VhcmNfdmlydChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV91YXIgKnVhciwgaW50IHBhZ2UpCiB7CiAJcmV0dXJuIGRldi0+dWFyX3RhYmxlLnVhcmNfYmFzZSArCi0JCWRldi0+ZHJpdmVyX3Vhci5pbmRleCAqIGRldi0+dWFyX3RhYmxlLnVhcmNfc2l6ZSArCisJCXVhci0+aW5kZXggKiBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgKwogCQlwYWdlICogNDA5NjsKIH0KIAoraW50IG10aGNhX21hcF91c2VyX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkgICAgICBzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiLCBpbnQgaW5kZXgsIHU2NCB1YWRkcikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCBzdGF0dXM7CisJaW50IGk7CisKKwlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gZGV2LT51YXJfdGFibGUudWFyY19zaXplIC8gOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZkYl90YWItPm11dGV4KTsKKworCWkgPSBpbmRleCAvIE1USENBX0RCX1JFQ19QRVJfUEFHRTsKKworCWlmICgoZGJfdGFiLT5wYWdlW2ldLnJlZmNvdW50ID49IE1USENBX0RCX1JFQ19QRVJfUEFHRSkgICAgICAgfHwKKwkgICAgKGRiX3RhYi0+cGFnZVtpXS51dmlydCAmJiBkYl90YWItPnBhZ2VbaV0udXZpcnQgIT0gdWFkZHIpIHx8CisJICAgICh1YWRkciAmIDQwOTUpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkYl90YWItPnBhZ2VbaV0ucmVmY291bnQpIHsKKwkJKytkYl90YWItPnBhZ2VbaV0ucmVmY291bnQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1YWRkciAmIFBBR0VfTUFTSywgMSwgMSwgMCwKKwkJCSAgICAgJmRiX3RhYi0+cGFnZVtpXS5tZW0ucGFnZSwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZGJfdGFiLT5wYWdlW2ldLm1lbS5sZW5ndGggPSA0MDk2OworCWRiX3RhYi0+cGFnZVtpXS5tZW0ub2Zmc2V0ID0gdWFkZHIgJiB+UEFHRV9NQVNLOworCisJcmV0ID0gcGNpX21hcF9zZyhkZXYtPnBkZXYsICZkYl90YWItPnBhZ2VbaV0ubWVtLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAocmV0IDwgMCkgeworCQlwdXRfcGFnZShkYl90YWItPnBhZ2VbaV0ubWVtLnBhZ2UpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBtdGhjYV9NQVBfSUNNX3BhZ2UoZGV2LCBzZ19kbWFfYWRkcmVzcygmZGJfdGFiLT5wYWdlW2ldLm1lbSksCisJCQkJIG10aGNhX3VhcmNfdmlydChkZXYsIHVhciwgaSksICZzdGF0dXMpOworCWlmICghcmV0ICYmIHN0YXR1cykKKwkJcmV0ID0gLUVJTlZBTDsKKwlpZiAocmV0KSB7CisJCXBjaV91bm1hcF9zZyhkZXYtPnBkZXYsICZkYl90YWItPnBhZ2VbaV0ubWVtLCAxLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJcHV0X3BhZ2UoZGJfdGFiLT5wYWdlW2ldLm1lbS5wYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGJfdGFiLT5wYWdlW2ldLnV2aXJ0ICAgID0gdWFkZHI7CisJZGJfdGFiLT5wYWdlW2ldLnJlZmNvdW50ID0gMTsKKworb3V0OgorCXVwKCZkYl90YWItPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG10aGNhX3VubWFwX3VzZXJfZGIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsCisJCQkgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYiwgaW50IGluZGV4KQoreworCWlmICghbXRoY2FfaXNfbWVtZnJlZShkZXYpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFRvIG1ha2Ugb3VyIGJvb2trZWVwaW5nIHNpbXBsZXIsIHdlIGRvbid0IHVubWFwIERCCisJICogcGFnZXMgdW50aWwgd2UgY2xlYW4gdXAgdGhlIHdob2xlIGRiIHRhYmxlLgorCSAqLworCisJZG93bigmZGJfdGFiLT5tdXRleCk7CisKKwktLWRiX3RhYi0+cGFnZVtpbmRleCAvIE1USENBX0RCX1JFQ19QRVJfUEFHRV0ucmVmY291bnQ7CisKKwl1cCgmZGJfdGFiLT5tdXRleCk7Cit9CisKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICptdGhjYV9pbml0X3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiOworCWludCBucGFnZXM7CisJaW50IGk7CisKKwlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlucGFnZXMgPSBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgLyA0MDk2OworCWRiX3RhYiA9IGttYWxsb2Moc2l6ZW9mICpkYl90YWIgKyBucGFnZXMgKiBzaXplb2YgKmRiX3RhYi0+cGFnZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYl90YWIpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdF9NVVRFWCgmZGJfdGFiLT5tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7CisJCWRiX3RhYi0+cGFnZVtpXS5yZWZjb3VudCA9IDA7CisJCWRiX3RhYi0+cGFnZVtpXS51dmlydCAgICA9IDA7CisJfQorCisJcmV0dXJuIGRiX3RhYjsKK30KKwordm9pZCBtdGhjYV9jbGVhbnVwX3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkJICAgICAgIHN0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICpkYl90YWIpCit7CisJaW50IGk7CisJdTggc3RhdHVzOworCisJaWYgKCFtdGhjYV9pc19tZW1mcmVlKGRldikpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnVhcl90YWJsZS51YXJjX3NpemUgLyA0MDk2OyArK2kpIHsKKwkJaWYgKGRiX3RhYi0+cGFnZVtpXS51dmlydCkgeworCQkJbXRoY2FfVU5NQVBfSUNNKGRldiwgbXRoY2FfdWFyY192aXJ0KGRldiwgdWFyLCBpKSwgMSwgJnN0YXR1cyk7CisJCQlwY2lfdW5tYXBfc2coZGV2LT5wZGV2LCAmZGJfdGFiLT5wYWdlW2ldLm1lbSwgMSwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlwdXRfcGFnZShkYl90YWItPnBhZ2VbaV0ubWVtLnBhZ2UpOworCQl9CisJfQorfQorCiBpbnQgbXRoY2FfYWxsb2NfZGIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgdHlwZSwgdTMyIHFuLCB1MzIgKipkYikKIHsKIAlpbnQgZ3JvdXA7CkBAIC0zOTksNyArNTM3LDggQEAKIAl9CiAJbWVtc2V0KHBhZ2UtPmRiX3JlYywgMCwgNDA5Nik7CiAKLQlyZXQgPSBtdGhjYV9NQVBfSUNNX3BhZ2UoZGV2LCBwYWdlLT5tYXBwaW5nLCBtdGhjYV91YXJjX3ZpcnQoZGV2LCBpKSwgJnN0YXR1cyk7CisJcmV0ID0gbXRoY2FfTUFQX0lDTV9wYWdlKGRldiwgcGFnZS0+bWFwcGluZywKKwkJCQkgbXRoY2FfdWFyY192aXJ0KGRldiwgJmRldi0+ZHJpdmVyX3VhciwgaSksICZzdGF0dXMpOwogCWlmICghcmV0ICYmIHN0YXR1cykKIAkJcmV0ID0gLUVJTlZBTDsKIAlpZiAocmV0KSB7CkBAIC00NTMsNyArNTkyLDcgQEAKIAogCWlmIChiaXRtYXBfZW1wdHkocGFnZS0+dXNlZCwgTVRIQ0FfREJfUkVDX1BFUl9QQUdFKSAmJgogCSAgICBpID49IGRldi0+ZGJfdGFiLT5tYXhfZ3JvdXAxIC0gMSkgewotCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCBpKSwgMSwgJnN0YXR1cyk7CisJCW10aGNhX1VOTUFQX0lDTShkZXYsIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpLCAxLCAmc3RhdHVzKTsKIAogCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIDQwOTYsCiAJCQkJICBwYWdlLT5kYl9yZWMsIHBhZ2UtPm1hcHBpbmcpOwpAQCAtNTIyLDcgKzY2MSw3IEBACiAJCWlmICghYml0bWFwX2VtcHR5KGRldi0+ZGJfdGFiLT5wYWdlW2ldLnVzZWQsIE1USENBX0RCX1JFQ19QRVJfUEFHRSkpCiAJCQltdGhjYV93YXJuKGRldiwgIktlcm5lbCBVQVJDIHBhZ2UgJWQgbm90IGVtcHR5XG4iLCBpKTsKIAotCQltdGhjYV9VTk1BUF9JQ00oZGV2LCBtdGhjYV91YXJjX3ZpcnQoZGV2LCBpKSwgMSwgJnN0YXR1cyk7CisJCW10aGNhX1VOTUFQX0lDTShkZXYsIG10aGNhX3VhcmNfdmlydChkZXYsICZkZXYtPmRyaXZlcl91YXIsIGkpLCAxLCAmc3RhdHVzKTsKIAogCQlkbWFfZnJlZV9jb2hlcmVudCgmZGV2LT5wZGV2LT5kZXYsIDQwOTYsCiAJCQkJICBkZXYtPmRiX3RhYi0+cGFnZVtpXS5kYl9yZWMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21lbWZyZWUuaAppbmRleCBmZTdiZTJhLi40NzYxZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbWVtZnJlZS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9tZW1mcmVlLmgKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0xNDgsNyArMTQ5LDcgQEAKIAlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgbXV0ZXg7CiB9OwogCi1lbnVtIHsKK2VudW0gbXRoY2FfZGJfdHlwZSB7CiAJTVRIQ0FfREJfVFlQRV9JTlZBTElEICAgPSAweDAsCiAJTVRIQ0FfREJfVFlQRV9DUV9TRVRfQ0kgPSAweDEsCiAJTVRIQ0FfREJfVFlQRV9DUV9BUk0gICAgPSAweDIsCkBAIC0xNTgsNiArMTU5LDE3IEBACiAJTVRIQ0FfREJfVFlQRV9HUk9VUF9TRVAgPSAweDcKIH07CiAKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlOworc3RydWN0IG10aGNhX3VhcjsKKworaW50IG10aGNhX21hcF91c2VyX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3VhciAqdWFyLAorCQkgICAgICBzdHJ1Y3QgbXRoY2FfdXNlcl9kYl90YWJsZSAqZGJfdGFiLCBpbnQgaW5kZXgsIHU2NCB1YWRkcik7Cit2b2lkIG10aGNhX3VubWFwX3VzZXJfZGIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsCisJCQkgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYiwgaW50IGluZGV4KTsKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlICptdGhjYV9pbml0X3VzZXJfZGJfdGFiKHN0cnVjdCBtdGhjYV9kZXYgKmRldik7Cit2b2lkIG10aGNhX2NsZWFudXBfdXNlcl9kYl90YWIoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgbXRoY2FfdWFyICp1YXIsCisJCQkgICAgICAgc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYik7CisKIGludCBtdGhjYV9pbml0X2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogdm9pZCBtdGhjYV9jbGVhbnVwX2RiX3RhYihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYpOwogaW50IG10aGNhX2FsbG9jX2RiKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgaW50IHR5cGUsIHUzMiBxbiwgdTMyICoqZGIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX21yLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYwppbmRleCA4OTYwZmMyLi5jYmU1MGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfbXIuYwpAQCAtNDAsNiArNDAsMTIgQEAKICNpbmNsdWRlICJtdGhjYV9jbWQuaCIKICNpbmNsdWRlICJtdGhjYV9tZW1mcmVlLmgiCiAKK3N0cnVjdCBtdGhjYV9tdHQgeworCXN0cnVjdCBtdGhjYV9idWRkeSAqYnVkZHk7CisJaW50ICAgICAgICAgICAgICAgICBvcmRlcjsKKwl1MzIgICAgICAgICAgICAgICAgIGZpcnN0X3NlZzsKK307CisKIC8qCiAgKiBNdXN0IGJlIHBhY2tlZCBiZWNhdXNlIG10dF9zZWcgaXMgNjQgYml0cyBidXQgb25seSBhbGlnbmVkIHRvIDMyIGJpdHMuCiAgKi8KQEAgLTE3Myw4ICsxNzksOCBAQAogCWtmcmVlKGJ1ZGR5LT5iaXRzKTsKIH0KIAotc3RhdGljIHUzMiBtdGhjYV9hbGxvY19tdHQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgb3JkZXIsCi0JCQkgICBzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5KQorc3RhdGljIHUzMiBtdGhjYV9hbGxvY19tdHRfcmFuZ2Uoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgb3JkZXIsCisJCQkJIHN0cnVjdCBtdGhjYV9idWRkeSAqYnVkZHkpCiB7CiAJdTMyIHNlZyA9IG10aGNhX2J1ZGR5X2FsbG9jKGJ1ZGR5LCBvcmRlcik7CiAKQEAgLTE5MSwxNCArMTk3LDEwMiBAQAogCXJldHVybiBzZWc7CiB9CiAKLXN0YXRpYyB2b2lkIG10aGNhX2ZyZWVfbXR0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHNlZywgaW50IG9yZGVyLAotCQkJICAgc3RydWN0IG10aGNhX2J1ZGR5KiBidWRkeSkKK3N0YXRpYyBzdHJ1Y3QgbXRoY2FfbXR0ICpfX210aGNhX2FsbG9jX210dChzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIGludCBzaXplLAorCQkJCQkgICBzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5KQogewotCW10aGNhX2J1ZGR5X2ZyZWUoYnVkZHksIHNlZywgb3JkZXIpOworCXN0cnVjdCBtdGhjYV9tdHQgKm10dDsKKwlpbnQgaTsKIAotCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpCi0JCW10aGNhX3RhYmxlX3B1dF9yYW5nZShkZXYsIGRldi0+bXJfdGFibGUubXR0X3RhYmxlLCBzZWcsCi0JCQkJICAgICAgc2VnICsgKDEgPDwgb3JkZXIpIC0gMSk7CisJaWYgKHNpemUgPD0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwltdHQgPSBrbWFsbG9jKHNpemVvZiAqbXR0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10dCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltdHQtPmJ1ZGR5ID0gYnVkZHk7CisJbXR0LT5vcmRlciA9IDA7CisJZm9yIChpID0gTVRIQ0FfTVRUX1NFR19TSVpFIC8gODsgaSA8IHNpemU7IGkgPDw9IDEpCisJCSsrbXR0LT5vcmRlcjsKKworCW10dC0+Zmlyc3Rfc2VnID0gbXRoY2FfYWxsb2NfbXR0X3JhbmdlKGRldiwgbXR0LT5vcmRlciwgYnVkZHkpOworCWlmIChtdHQtPmZpcnN0X3NlZyA9PSAtMSkgeworCQlrZnJlZShtdHQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlyZXR1cm4gbXR0OworfQorCitzdHJ1Y3QgbXRoY2FfbXR0ICptdGhjYV9hbGxvY19tdHQoc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gX19tdGhjYV9hbGxvY19tdHQoZGV2LCBzaXplLCAmZGV2LT5tcl90YWJsZS5tdHRfYnVkZHkpOworfQorCit2b2lkIG10aGNhX2ZyZWVfbXR0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX210dCAqbXR0KQoreworCWlmICghbXR0KQorCQlyZXR1cm47CisKKwltdGhjYV9idWRkeV9mcmVlKG10dC0+YnVkZHksIG10dC0+Zmlyc3Rfc2VnLCBtdHQtPm9yZGVyKTsKKworCW10aGNhX3RhYmxlX3B1dF9yYW5nZShkZXYsIGRldi0+bXJfdGFibGUubXR0X3RhYmxlLAorCQkJICAgICAgbXR0LT5maXJzdF9zZWcsCisJCQkgICAgICBtdHQtPmZpcnN0X3NlZyArICgxIDw8IG10dC0+b3JkZXIpIC0gMSk7CisKKwlrZnJlZShtdHQpOworfQorCitpbnQgbXRoY2Ffd3JpdGVfbXR0KHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX210dCAqbXR0LAorCQkgICAgaW50IHN0YXJ0X2luZGV4LCB1NjQgKmJ1ZmZlcl9saXN0LCBpbnQgbGlzdF9sZW4pCit7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CisJdTY0ICptdHRfZW50cnk7CisJaW50IGVyciA9IDA7CisJdTggc3RhdHVzOworCWludCBpOworCisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKwltdHRfZW50cnkgPSBtYWlsYm94LT5idWY7CisKKwl3aGlsZSAobGlzdF9sZW4gPiAwKSB7CisJCW10dF9lbnRyeVswXSA9IGNwdV90b19iZTY0KGRldi0+bXJfdGFibGUubXR0X2Jhc2UgKworCQkJCQkgICBtdHQtPmZpcnN0X3NlZyAqIE1USENBX01UVF9TRUdfU0laRSArCisJCQkJCSAgIHN0YXJ0X2luZGV4ICogOCk7CisJCW10dF9lbnRyeVsxXSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBsaXN0X2xlbiAmJiBpIDwgTVRIQ0FfTUFJTEJPWF9TSVpFIC8gOCAtIDI7ICsraSkKKwkJCW10dF9lbnRyeVtpICsgMl0gPSBjcHVfdG9fYmU2NChidWZmZXJfbGlzdFtpXSB8CisJCQkJCQkgICAgICAgTVRIQ0FfTVRUX0ZMQUdfUFJFU0VOVCk7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhbiBvZGQgbnVtYmVyIG9mIGVudHJpZXMgdG8gd3JpdGUsIGFkZAorCQkgKiBvbmUgbW9yZSBkdW1teSBlbnRyeSBmb3IgZmlybXdhcmUgZWZmaWNpZW5jeS4KKwkJICovCisJCWlmIChpICYgMSkKKwkJCW10dF9lbnRyeVtpICsgMl0gPSAwOworCisJCWVyciA9IG10aGNhX1dSSVRFX01UVChkZXYsIG1haWxib3gsIChpICsgMSkgJiB+MSwgJnN0YXR1cyk7CisJCWlmIChlcnIpIHsKKwkJCW10aGNhX3dhcm4oZGV2LCAiV1JJVEVfTVRUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHN0YXR1cykgeworCQkJbXRoY2Ffd2FybihkZXYsICJXUklURV9NVFQgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKKwkJCQkgICBzdGF0dXMpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbGlzdF9sZW4gICAgLT0gaTsKKwkJc3RhcnRfaW5kZXggKz0gaTsKKwkJYnVmZmVyX2xpc3QgKz0gaTsKKwl9CisKK291dDoKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiB0YXZvcl9od19pbmRleF90b19rZXkodTMyIGluZCkKQEAgLTIzNyw5MSArMzMxLDE4IEBACiAJCXJldHVybiB0YXZvcl9rZXlfdG9faHdfaW5kZXgoa2V5KTsKIH0KIAotaW50IG10aGNhX21yX2FsbG9jX25vdHJhbnMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcGQsCi0JCQkgICB1MzIgYWNjZXNzLCBzdHJ1Y3QgbXRoY2FfbXIgKm1yKQoraW50IG10aGNhX21yX2FsbG9jKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHBkLCBpbnQgYnVmZmVyX3NpemVfc2hpZnQsCisJCSAgIHU2NCBpb3ZhLCB1NjQgdG90YWxfc2l6ZSwgdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX21yICptcikKIHsKLQl2b2lkICptYWlsYm94ID0gTlVMTDsKKwlzdHJ1Y3QgbXRoY2FfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbXRoY2FfbXB0X2VudHJ5ICptcHRfZW50cnk7CiAJdTMyIGtleTsKKwlpbnQgaTsKIAlpbnQgZXJyOwogCXU4IHN0YXR1czsKIAogCW1pZ2h0X3NsZWVwKCk7CiAKLQltci0+b3JkZXIgPSAtMTsKLQlrZXkgPSBtdGhjYV9hbGxvYygmZGV2LT5tcl90YWJsZS5tcHRfYWxsb2MpOwotCWlmIChrZXkgPT0gLTEpCi0JCXJldHVybiAtRU5PTUVNOwotCW1yLT5pYm1yLnJrZXkgPSBtci0+aWJtci5sa2V5ID0gaHdfaW5kZXhfdG9fa2V5KGRldiwga2V5KTsKLQotCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKLQkJZXJyID0gbXRoY2FfdGFibGVfZ2V0KGRldiwgZGV2LT5tcl90YWJsZS5tcHRfdGFibGUsIGtleSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXRfbXB0X2ZyZWU7Ci0JfQotCi0JbWFpbGJveCA9IGttYWxsb2Moc2l6ZW9mICptcHRfZW50cnkgKyBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dF90YWJsZTsKLQl9Ci0JbXB0X2VudHJ5ID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKLQotCW1wdF9lbnRyeS0+ZmxhZ3MgPSBjcHVfdG9fYmUzMihNVEhDQV9NUFRfRkxBR19TV19PV05TICAgICB8Ci0JCQkJICAgICAgIE1USENBX01QVF9GTEFHX01JTyAgICAgICAgIHwKLQkJCQkgICAgICAgTVRIQ0FfTVBUX0ZMQUdfUEhZU0lDQUwgICAgfAotCQkJCSAgICAgICBNVEhDQV9NUFRfRkxBR19SRUdJT04gICAgICB8Ci0JCQkJICAgICAgIGFjY2Vzcyk7Ci0JbXB0X2VudHJ5LT5wYWdlX3NpemUgPSAwOwotCW1wdF9lbnRyeS0+a2V5ICAgICAgID0gY3B1X3RvX2JlMzIoa2V5KTsKLQltcHRfZW50cnktPnBkICAgICAgICA9IGNwdV90b19iZTMyKHBkKTsKLQltcHRfZW50cnktPnN0YXJ0ICAgICA9IDA7Ci0JbXB0X2VudHJ5LT5sZW5ndGggICAgPSB+MFVMTDsKLQotCW1lbXNldCgmbXB0X2VudHJ5LT5sa2V5LCAwLAotCSAgICAgICBzaXplb2YgKm1wdF9lbnRyeSAtIG9mZnNldG9mKHN0cnVjdCBtdGhjYV9tcHRfZW50cnksIGxrZXkpKTsKLQotCWVyciA9IG10aGNhX1NXMkhXX01QVChkZXYsIG1wdF9lbnRyeSwKLQkJCSAgICAgIGtleSAmIChkZXYtPmxpbWl0cy5udW1fbXB0cyAtIDEpLAotCQkJICAgICAgJnN0YXR1cyk7Ci0JaWYgKGVycikgewotCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX01QVCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJZ290byBlcnJfb3V0X3RhYmxlOwotCX0gZWxzZSBpZiAoc3RhdHVzKSB7Ci0JCW10aGNhX3dhcm4oZGV2LCAiU1cySFdfTVBUIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCi0JCQkgICBzdGF0dXMpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9vdXRfdGFibGU7Ci0JfQotCi0Ja2ZyZWUobWFpbGJveCk7Ci0JcmV0dXJuIGVycjsKLQotZXJyX291dF90YWJsZToKLQlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKQotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPm1yX3RhYmxlLm1wdF90YWJsZSwga2V5KTsKLQotZXJyX291dF9tcHRfZnJlZToKLQltdGhjYV9mcmVlKCZkZXYtPm1yX3RhYmxlLm1wdF9hbGxvYywga2V5KTsKLQlrZnJlZShtYWlsYm94KTsKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgbXRoY2FfbXJfYWxsb2NfcGh5cyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBwZCwKLQkJCXU2NCAqYnVmZmVyX2xpc3QsIGludCBidWZmZXJfc2l6ZV9zaGlmdCwKLQkJCWludCBsaXN0X2xlbiwgdTY0IGlvdmEsIHU2NCB0b3RhbF9zaXplLAotCQkJdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX21yICptcikKLXsKLQl2b2lkICptYWlsYm94OwotCXU2NCAqbXR0X2VudHJ5OwotCXN0cnVjdCBtdGhjYV9tcHRfZW50cnkgKm1wdF9lbnRyeTsKLQl1MzIga2V5OwotCWludCBlcnIgPSAtRU5PTUVNOwotCXU4IHN0YXR1czsKLQlpbnQgaTsKLQotCW1pZ2h0X3NsZWVwKCk7CiAJV0FSTl9PTihidWZmZXJfc2l6ZV9zaGlmdCA+PSAzMik7CiAKIAlrZXkgPSBtdGhjYV9hbGxvYygmZGV2LT5tcl90YWJsZS5tcHRfYWxsb2MpOwpAQCAtMzM1LDc1ICszNTYsMzMgQEAKIAkJCWdvdG8gZXJyX291dF9tcHRfZnJlZTsKIAl9CiAKLQlmb3IgKGkgPSBNVEhDQV9NVFRfU0VHX1NJWkUgLyA4LCBtci0+b3JkZXIgPSAwOwotCSAgICAgaSA8IGxpc3RfbGVuOwotCSAgICAgaSA8PD0gMSwgKyttci0+b3JkZXIpCi0JCTsgLyogbm90aGluZyAqLwotCi0JbXItPmZpcnN0X3NlZyA9IG10aGNhX2FsbG9jX210dChkZXYsIG1yLT5vcmRlciwKLQkJCQkgICAgICAgCSZkZXYtPm1yX3RhYmxlLm10dF9idWRkeSk7Ci0JaWYgKG1yLT5maXJzdF9zZWcgPT0gLTEpCisJbWFpbGJveCA9IG10aGNhX2FsbG9jX21haWxib3goZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKSB7CisJCWVyciA9IFBUUl9FUlIobWFpbGJveCk7CiAJCWdvdG8gZXJyX291dF90YWJsZTsKLQotCS8qCi0JICogSWYgbGlzdF9sZW4gaXMgb2RkLCB3ZSBhZGQgb25lIG1vcmUgZHVtbXkgZW50cnkgZm9yCi0JICogZmlybXdhcmUgZWZmaWNpZW5jeS4KLQkgKi8KLQltYWlsYm94ID0ga21hbGxvYyhtYXgoc2l6ZW9mICptcHRfZW50cnksCi0JCQkgICAgICAoc2l6ZV90KSA4ICogKGxpc3RfbGVuICsgKGxpc3RfbGVuICYgMSkgKyAyKSkgKwotCQkJICBNVEhDQV9DTURfTUFJTEJPWF9FWFRSQSwKLQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYWlsYm94KQotCQlnb3RvIGVycl9vdXRfZnJlZV9tdHQ7Ci0KLQltdHRfZW50cnkgPSBNQUlMQk9YX0FMSUdOKG1haWxib3gpOwotCi0JbXR0X2VudHJ5WzBdID0gY3B1X3RvX2JlNjQoZGV2LT5tcl90YWJsZS5tdHRfYmFzZSArCi0JCQkJICAgbXItPmZpcnN0X3NlZyAqIE1USENBX01UVF9TRUdfU0laRSk7Ci0JbXR0X2VudHJ5WzFdID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbGlzdF9sZW47ICsraSkKLQkJbXR0X2VudHJ5W2kgKyAyXSA9IGNwdV90b19iZTY0KGJ1ZmZlcl9saXN0W2ldIHwKLQkJCQkJICAgICAgIE1USENBX01UVF9GTEFHX1BSRVNFTlQpOwotCWlmIChsaXN0X2xlbiAmIDEpIHsKLQkJbXR0X2VudHJ5W2kgKyAyXSA9IDA7Ci0JCSsrbGlzdF9sZW47CiAJfQotCi0JaWYgKDApIHsKLQkJbXRoY2FfZGJnKGRldiwgIkR1bXBpbmcgTVBUIGVudHJ5XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IGxpc3RfbGVuICsgMjsgKytpKQotCQkJcHJpbnRrKEtFUk5fRVJSICJbJTJkXSAlMDE2bGx4XG4iLAotCQkJICAgICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpIGJlNjRfdG9fY3B1KG10dF9lbnRyeVtpXSkpOwotCX0KLQotCWVyciA9IG10aGNhX1dSSVRFX01UVChkZXYsIG10dF9lbnRyeSwgbGlzdF9sZW4sICZzdGF0dXMpOwotCWlmIChlcnIpIHsKLQkJbXRoY2Ffd2FybihkZXYsICJXUklURV9NVFQgZmFpbGVkICglZClcbiIsIGVycik7Ci0JCWdvdG8gZXJyX291dF9tYWlsYm94X2ZyZWU7Ci0JfQotCWlmIChzdGF0dXMpIHsKLQkJbXRoY2Ffd2FybihkZXYsICJXUklURV9NVFQgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKLQkJCSAgIHN0YXR1cyk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX291dF9tYWlsYm94X2ZyZWU7Ci0JfQotCi0JbXB0X2VudHJ5ID0gTUFJTEJPWF9BTElHTihtYWlsYm94KTsKKwltcHRfZW50cnkgPSBtYWlsYm94LT5idWY7CiAKIAltcHRfZW50cnktPmZsYWdzID0gY3B1X3RvX2JlMzIoTVRIQ0FfTVBUX0ZMQUdfU1dfT1dOUyAgICAgfAogCQkJCSAgICAgICBNVEhDQV9NUFRfRkxBR19NSU8gICAgICAgICB8CiAJCQkJICAgICAgIE1USENBX01QVF9GTEFHX1JFR0lPTiAgICAgIHwKIAkJCQkgICAgICAgYWNjZXNzKTsKKwlpZiAoIW1yLT5tdHQpCisJCW1wdF9lbnRyeS0+ZmxhZ3MgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfTVBUX0ZMQUdfUEhZU0lDQUwpOwogCiAJbXB0X2VudHJ5LT5wYWdlX3NpemUgPSBjcHVfdG9fYmUzMihidWZmZXJfc2l6ZV9zaGlmdCAtIDEyKTsKIAltcHRfZW50cnktPmtleSAgICAgICA9IGNwdV90b19iZTMyKGtleSk7CiAJbXB0X2VudHJ5LT5wZCAgICAgICAgPSBjcHVfdG9fYmUzMihwZCk7CiAJbXB0X2VudHJ5LT5zdGFydCAgICAgPSBjcHVfdG9fYmU2NChpb3ZhKTsKIAltcHRfZW50cnktPmxlbmd0aCAgICA9IGNwdV90b19iZTY0KHRvdGFsX3NpemUpOworCiAJbWVtc2V0KCZtcHRfZW50cnktPmxrZXksIDAsCiAJICAgICAgIHNpemVvZiAqbXB0X2VudHJ5IC0gb2Zmc2V0b2Yoc3RydWN0IG10aGNhX21wdF9lbnRyeSwgbGtleSkpOwotCW1wdF9lbnRyeS0+bXR0X3NlZyAgID0gY3B1X3RvX2JlNjQoZGV2LT5tcl90YWJsZS5tdHRfYmFzZSArCi0JCQkJCSAgIG1yLT5maXJzdF9zZWcgKiBNVEhDQV9NVFRfU0VHX1NJWkUpOworCisJaWYgKG1yLT5tdHQpCisJCW1wdF9lbnRyeS0+bXR0X3NlZyA9CisJCQljcHVfdG9fYmU2NChkZXYtPm1yX3RhYmxlLm10dF9iYXNlICsKKwkJCQkgICAgbXItPm10dC0+Zmlyc3Rfc2VnICogTVRIQ0FfTVRUX1NFR19TSVpFKTsKIAogCWlmICgwKSB7CiAJCW10aGNhX2RiZyhkZXYsICJEdW1waW5nIE1QVCBlbnRyeSAlMDh4OlxuIiwgbXItPmlibXIubGtleSk7CkBAIC00MTYsNDUgKzM5NSw3MCBAQAogCQl9CiAJfQogCi0JZXJyID0gbXRoY2FfU1cySFdfTVBUKGRldiwgbXB0X2VudHJ5LAorCWVyciA9IG10aGNhX1NXMkhXX01QVChkZXYsIG1haWxib3gsCiAJCQkgICAgICBrZXkgJiAoZGV2LT5saW1pdHMubnVtX21wdHMgLSAxKSwKIAkJCSAgICAgICZzdGF0dXMpOwotCWlmIChlcnIpCisJaWYgKGVycikgewogCQltdGhjYV93YXJuKGRldiwgIlNXMkhXX01QVCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQllbHNlIGlmIChzdGF0dXMpIHsKKwkJZ290byBlcnJfb3V0X21haWxib3g7CisJfSBlbHNlIGlmIChzdGF0dXMpIHsKIAkJbXRoY2Ffd2FybihkZXYsICJTVzJIV19NUFQgcmV0dXJuZWQgc3RhdHVzIDB4JTAyeFxuIiwKIAkJCSAgIHN0YXR1cyk7CiAJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX291dF9tYWlsYm94OwogCX0KIAotCWtmcmVlKG1haWxib3gpOworCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiAKLWVycl9vdXRfbWFpbGJveF9mcmVlOgotCWtmcmVlKG1haWxib3gpOwotCi1lcnJfb3V0X2ZyZWVfbXR0OgotCW10aGNhX2ZyZWVfbXR0KGRldiwgbXItPmZpcnN0X3NlZywgbXItPm9yZGVyLCAmZGV2LT5tcl90YWJsZS5tdHRfYnVkZHkpOworZXJyX291dF9tYWlsYm94OgorCW10aGNhX2ZyZWVfbWFpbGJveChkZXYsIG1haWxib3gpOwogCiBlcnJfb3V0X3RhYmxlOgotCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpCi0JCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLCBrZXkpOworCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLCBrZXkpOwogCiBlcnJfb3V0X21wdF9mcmVlOgogCW10aGNhX2ZyZWUoJmRldi0+bXJfdGFibGUubXB0X2FsbG9jLCBrZXkpOwogCXJldHVybiBlcnI7CiB9CiAKLS8qIEZyZWUgbXIgb3IgZm1yICovCi1zdGF0aWMgdm9pZCBtdGhjYV9mcmVlX3JlZ2lvbihzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBsa2V5LCBpbnQgb3JkZXIsCi0JCQkgICAgICB1MzIgZmlyc3Rfc2VnLCBzdHJ1Y3QgbXRoY2FfYnVkZHkgKmJ1ZGR5KQoraW50IG10aGNhX21yX2FsbG9jX25vdHJhbnMoc3RydWN0IG10aGNhX2RldiAqZGV2LCB1MzIgcGQsCisJCQkgICB1MzIgYWNjZXNzLCBzdHJ1Y3QgbXRoY2FfbXIgKm1yKQogewotCWlmIChvcmRlciA+PSAwKQotCQltdGhjYV9mcmVlX210dChkZXYsIGZpcnN0X3NlZywgb3JkZXIsIGJ1ZGR5KTsKKwltci0+bXR0ID0gTlVMTDsKKwlyZXR1cm4gbXRoY2FfbXJfYWxsb2MoZGV2LCBwZCwgMTIsIDAsIH4wVUxMLCBhY2Nlc3MsIG1yKTsKK30KIAotCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpCi0JCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+bXJfdGFibGUubXB0X3RhYmxlLAotCQkJCWFyYmVsX2tleV90b19od19pbmRleChsa2V5KSk7CitpbnQgbXRoY2FfbXJfYWxsb2NfcGh5cyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHUzMiBwZCwKKwkJCXU2NCAqYnVmZmVyX2xpc3QsIGludCBidWZmZXJfc2l6ZV9zaGlmdCwKKwkJCWludCBsaXN0X2xlbiwgdTY0IGlvdmEsIHU2NCB0b3RhbF9zaXplLAorCQkJdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX21yICptcikKK3sKKwlpbnQgZXJyOworCisJbXItPm10dCA9IG10aGNhX2FsbG9jX210dChkZXYsIGxpc3RfbGVuKTsKKwlpZiAoSVNfRVJSKG1yLT5tdHQpKQorCQlyZXR1cm4gUFRSX0VSUihtci0+bXR0KTsKKworCWVyciA9IG10aGNhX3dyaXRlX210dChkZXYsIG1yLT5tdHQsIDAsIGJ1ZmZlcl9saXN0LCBsaXN0X2xlbik7CisJaWYgKGVycikgeworCQltdGhjYV9mcmVlX210dChkZXYsIG1yLT5tdHQpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IG10aGNhX21yX2FsbG9jKGRldiwgcGQsIGJ1ZmZlcl9zaXplX3NoaWZ0LCBpb3ZhLAorCQkJICAgICB0b3RhbF9zaXplLCBhY2Nlc3MsIG1yKTsKKwlpZiAoZXJyKQorCQltdGhjYV9mcmVlX210dChkZXYsIG1yLT5tdHQpOworCisJcmV0dXJuIGVycjsKK30KKworLyogRnJlZSBtciBvciBmbXIgKi8KK3N0YXRpYyB2b2lkIG10aGNhX2ZyZWVfcmVnaW9uKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIGxrZXkpCit7CisJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5tcl90YWJsZS5tcHRfdGFibGUsCisJCQlhcmJlbF9rZXlfdG9faHdfaW5kZXgobGtleSkpOwogCiAJbXRoY2FfZnJlZSgmZGV2LT5tcl90YWJsZS5tcHRfYWxsb2MsIGtleV90b19od19pbmRleChkZXYsIGxrZXkpKTsKIH0KQEAgLTQ3NiwxNSArNDgwLDE1IEBACiAJCW10aGNhX3dhcm4oZGV2LCAiSFcyU1dfTVBUIHJldHVybmVkIHN0YXR1cyAweCUwMnhcbiIsCiAJCQkgICBzdGF0dXMpOwogCi0JbXRoY2FfZnJlZV9yZWdpb24oZGV2LCBtci0+aWJtci5sa2V5LCBtci0+b3JkZXIsIG1yLT5maXJzdF9zZWcsCi0JCQkgICZkZXYtPm1yX3RhYmxlLm10dF9idWRkeSk7CisJbXRoY2FfZnJlZV9yZWdpb24oZGV2LCBtci0+aWJtci5sa2V5KTsKKwltdGhjYV9mcmVlX210dChkZXYsIG1yLT5tdHQpOwogfQogCiBpbnQgbXRoY2FfZm1yX2FsbG9jKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgdTMyIHBkLAogCQkgICAgdTMyIGFjY2Vzcywgc3RydWN0IG10aGNhX2ZtciAqbXIpCiB7CiAJc3RydWN0IG10aGNhX21wdF9lbnRyeSAqbXB0X2VudHJ5OwotCXZvaWQgKm1haWxib3g7CisJc3RydWN0IG10aGNhX21haWxib3ggKm1haWxib3g7CiAJdTY0IG10dF9zZWc7CiAJdTMyIGtleSwgaWR4OwogCXU4IHN0YXR1czsKQEAgLTUyMiwzMSArNTI2LDI0IEBACiAJCW1yLT5tZW0udGF2b3IubXB0ID0gZGV2LT5tcl90YWJsZS50YXZvcl9mbXIubXB0X2Jhc2UgKwogCQkgICAgICAgCXNpemVvZiAqKG1yLT5tZW0udGF2b3IubXB0KSAqIGlkeDsKIAotCWZvciAoaSA9IE1USENBX01UVF9TRUdfU0laRSAvIDgsIG1yLT5vcmRlciA9IDA7Ci0JICAgICBpIDwgbGlzdF9sZW47Ci0JICAgICBpIDw8PSAxLCArK21yLT5vcmRlcikKLQkJOyAvKiBub3RoaW5nICovCi0KLQltci0+Zmlyc3Rfc2VnID0gbXRoY2FfYWxsb2NfbXR0KGRldiwgbXItPm9yZGVyLAotCQkJCSAgICAgICAJZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5KTsKLQlpZiAobXItPmZpcnN0X3NlZyA9PSAtMSkKKwltci0+bXR0ID0gX19tdGhjYV9hbGxvY19tdHQoZGV2LCBsaXN0X2xlbiwgZGV2LT5tcl90YWJsZS5mbXJfbXR0X2J1ZGR5KTsKKwlpZiAoSVNfRVJSKG1yLT5tdHQpKQogCQlnb3RvIGVycl9vdXRfdGFibGU7CiAKLQltdHRfc2VnID0gbXItPmZpcnN0X3NlZyAqIE1USENBX01UVF9TRUdfU0laRTsKKwltdHRfc2VnID0gbXItPm10dC0+Zmlyc3Rfc2VnICogTVRIQ0FfTVRUX1NFR19TSVpFOwogCiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewogCQltci0+bWVtLmFyYmVsLm10dHMgPSBtdGhjYV90YWJsZV9maW5kKGRldi0+bXJfdGFibGUubXR0X3RhYmxlLAotCQkJCQkJICAgICAgbXItPmZpcnN0X3NlZyk7CisJCQkJCQkgICAgICBtci0+bXR0LT5maXJzdF9zZWcpOwogCQlCVUdfT04oIW1yLT5tZW0uYXJiZWwubXR0cyk7CiAJfSBlbHNlCiAJCW1yLT5tZW0udGF2b3IubXR0cyA9IGRldi0+bXJfdGFibGUudGF2b3JfZm1yLm10dF9iYXNlICsgbXR0X3NlZzsKIAotCW1haWxib3ggPSBrbWFsbG9jKHNpemVvZiAqbXB0X2VudHJ5ICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsCi0JCQkgIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKKwltYWlsYm94ID0gbXRoY2FfYWxsb2NfbWFpbGJveChkZXYsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIobWFpbGJveCkpCiAJCWdvdG8gZXJyX291dF9mcmVlX210dDsKIAotCW1wdF9lbnRyeSA9IE1BSUxCT1hfQUxJR04obWFpbGJveCk7CisJbXB0X2VudHJ5ID0gbWFpbGJveC0+YnVmOwogCiAJbXB0X2VudHJ5LT5mbGFncyA9IGNwdV90b19iZTMyKE1USENBX01QVF9GTEFHX1NXX09XTlMgICAgIHwKIAkJCQkgICAgICAgTVRIQ0FfTVBUX0ZMQUdfTUlPICAgICAgICAgfApAQCAtNTcxLDcgKzU2OCw3IEBACiAJCX0KIAl9CiAKLQllcnIgPSBtdGhjYV9TVzJIV19NUFQoZGV2LCBtcHRfZW50cnksCisJZXJyID0gbXRoY2FfU1cySFdfTVBUKGRldiwgbWFpbGJveCwKIAkJCSAgICAgIGtleSAmIChkZXYtPmxpbWl0cy5udW1fbXB0cyAtIDEpLAogCQkJICAgICAgJnN0YXR1cyk7CiAJaWYgKGVycikgewpAQCAtNTg1LDE5ICs1ODIsMTcgQEAKIAkJZ290byBlcnJfb3V0X21haWxib3hfZnJlZTsKIAl9CiAKLQlrZnJlZShtYWlsYm94KTsKKwltdGhjYV9mcmVlX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gMDsKIAogZXJyX291dF9tYWlsYm94X2ZyZWU6Ci0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKIGVycl9vdXRfZnJlZV9tdHQ6Ci0JbXRoY2FfZnJlZV9tdHQoZGV2LCBtci0+Zmlyc3Rfc2VnLCBtci0+b3JkZXIsCi0JCSAgICAgICBkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHkpOworCW10aGNhX2ZyZWVfbXR0KGRldiwgbXItPm10dCk7CiAKIGVycl9vdXRfdGFibGU6Ci0JaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkKLQkJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5tcl90YWJsZS5tcHRfdGFibGUsIGtleSk7CisJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5tcl90YWJsZS5tcHRfdGFibGUsIGtleSk7CiAKIGVycl9vdXRfbXB0X2ZyZWU6CiAJbXRoY2FfZnJlZSgmZGV2LT5tcl90YWJsZS5tcHRfYWxsb2MsIG1yLT5pYm1yLmxrZXkpOwpAQCAtNjA5LDggKzYwNCw5IEBACiAJaWYgKGZtci0+bWFwcykKIAkJcmV0dXJuIC1FQlVTWTsKIAotCW10aGNhX2ZyZWVfcmVnaW9uKGRldiwgZm1yLT5pYm1yLmxrZXksIGZtci0+b3JkZXIsIGZtci0+Zmlyc3Rfc2VnLAotCQkJICBkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHkpOworCW10aGNhX2ZyZWVfcmVnaW9uKGRldiwgZm1yLT5pYm1yLmxrZXkpOworCW10aGNhX2ZyZWVfbXR0KGRldiwgZm1yLT5tdHQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyNiw3ICs4MjIsOCBAQAogCWlmIChkZXYtPmxpbWl0cy5yZXNlcnZlZF9tdHRzKSB7CiAJCWkgPSBmbHMoZGV2LT5saW1pdHMucmVzZXJ2ZWRfbXR0cyAtIDEpOwogCi0JCWlmIChtdGhjYV9hbGxvY19tdHQoZGV2LCBpLCBkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHkpID09IC0xKSB7CisJCWlmIChtdGhjYV9hbGxvY19tdHRfcmFuZ2UoZGV2LCBpLAorCQkJCQkgIGRldi0+bXJfdGFibGUuZm1yX210dF9idWRkeSkgPT0gLTEpIHsKIAkJCW10aGNhX3dhcm4oZGV2LCAiTVRUIHRhYmxlIG9mIG9yZGVyICVkIGlzIHRvbyBzbWFsbC5cbiIsCiAJCQkJICBkZXYtPm1yX3RhYmxlLmZtcl9tdHRfYnVkZHktPm1heF9vcmRlcik7CiAJCQllcnIgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3BkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcGQuYwppbmRleCBlYTY2ODQ3Li5jMmM4OTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcGQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcGQuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTM3LDIzICszOCwyNyBAQAogCiAjaW5jbHVkZSAibXRoY2FfZGV2LmgiCiAKLWludCBtdGhjYV9wZF9hbGxvYyhzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpCitpbnQgbXRoY2FfcGRfYWxsb2Moc3RydWN0IG10aGNhX2RldiAqZGV2LCBpbnQgcHJpdmlsZWdlZCwgc3RydWN0IG10aGNhX3BkICpwZCkKIHsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCiAJbWlnaHRfc2xlZXAoKTsKIAorCXBkLT5wcml2aWxlZ2VkID0gcHJpdmlsZWdlZDsKKwogCWF0b21pY19zZXQoJnBkLT5zcXBfY291bnQsIDApOwogCXBkLT5wZF9udW0gPSBtdGhjYV9hbGxvYygmZGV2LT5wZF90YWJsZS5hbGxvYyk7CiAJaWYgKHBkLT5wZF9udW0gPT0gLTEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gbXRoY2FfbXJfYWxsb2Nfbm90cmFucyhkZXYsIHBkLT5wZF9udW0sCi0JCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9SRUFEIHwKLQkJCQkgICAgIE1USENBX01QVF9GTEFHX0xPQ0FMX1dSSVRFLAotCQkJCSAgICAgJnBkLT5udG1yKTsKLQlpZiAoZXJyKQotCQltdGhjYV9mcmVlKCZkZXYtPnBkX3RhYmxlLmFsbG9jLCBwZC0+cGRfbnVtKTsKKwlpZiAocHJpdmlsZWdlZCkgeworCQllcnIgPSBtdGhjYV9tcl9hbGxvY19ub3RyYW5zKGRldiwgcGQtPnBkX251bSwKKwkJCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9SRUFEIHwKKwkJCQkJICAgICBNVEhDQV9NUFRfRkxBR19MT0NBTF9XUklURSwKKwkJCQkJICAgICAmcGQtPm50bXIpOworCQlpZiAoZXJyKQorCQkJbXRoY2FfZnJlZSgmZGV2LT5wZF90YWJsZS5hbGxvYywgcGQtPnBkX251bSk7CisJfQogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTYxLDcgKzY2LDggQEAKIHZvaWQgbXRoY2FfcGRfZnJlZShzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYsIHN0cnVjdCBtdGhjYV9wZCAqcGQpCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQltdGhjYV9mcmVlX21yKGRldiwgJnBkLT5udG1yKTsKKwlpZiAocGQtPnByaXZpbGVnZWQpCisJCW10aGNhX2ZyZWVfbXIoZGV2LCAmcGQtPm50bXIpOwogCW10aGNhX2ZyZWUoJmRldi0+cGRfdGFibGUuYWxsb2MsIHBkLT5wZF9udW0pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCmluZGV4IDE1OWY0ZTYuLjdhNThjZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5jCkBAIC0xLDUgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMzMsOSArMzUsMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8aWJfc21pLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgIm10aGNhX2Rldi5oIgogI2luY2x1ZGUgIm10aGNhX2NtZC5oIgorI2luY2x1ZGUgIm10aGNhX3VzZXIuaCIKKyNpbmNsdWRlICJtdGhjYV9tZW1mcmVlLmgiCiAKIHN0YXRpYyBpbnQgbXRoY2FfcXVlcnlfZGV2aWNlKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LAogCQkJICAgICAgc3RydWN0IGliX2RldmljZV9hdHRyICpwcm9wcykKQEAgLTUyLDcgKzU3LDcgQEAKIAlpZiAoIWluX21hZCB8fCAhb3V0X21hZCkKIAkJZ290byBvdXQ7CiAKLQltZW1zZXQocHJvcHMsIDAsIHNpemVvZiBwcm9wcyk7CisJbWVtc2V0KHByb3BzLCAwLCBzaXplb2YgKnByb3BzKTsKIAogCXByb3BzLT5md192ZXIgICAgICAgICAgICAgID0gbWRldi0+ZndfdmVyOwogCkBAIC0yODMsNyArMjg4LDc4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBpYl9wZCAqbXRoY2FfYWxsb2NfcGQoc3RydWN0IGliX2RldmljZSAqaWJkZXYpCitzdGF0aWMgc3RydWN0IGliX3Vjb250ZXh0ICptdGhjYV9hbGxvY191Y29udGV4dChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkJCXN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCit7CisJc3RydWN0IG10aGNhX2FsbG9jX3Vjb250ZXh0X3Jlc3AgdXJlc3A7CisJc3RydWN0IG10aGNhX3Vjb250ZXh0ICAgICAgICAgICAqY29udGV4dDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisKKwltZW1zZXQoJnVyZXNwLCAwLCBzaXplb2YgdXJlc3ApOworCisJdXJlc3AucXBfdGFiX3NpemUgPSB0b19tZGV2KGliZGV2KS0+bGltaXRzLm51bV9xcHM7CisJaWYgKG10aGNhX2lzX21lbWZyZWUodG9fbWRldihpYmRldikpKQorCQl1cmVzcC51YXJjX3NpemUgPSB0b19tZGV2KGliZGV2KS0+dWFyX3RhYmxlLnVhcmNfc2l6ZTsKKwllbHNlCisJCXVyZXNwLnVhcmNfc2l6ZSA9IDA7CisKKwljb250ZXh0ID0ga21hbGxvYyhzaXplb2YgKmNvbnRleHQsIEdGUF9LRVJORUwpOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSBtdGhjYV91YXJfYWxsb2ModG9fbWRldihpYmRldiksICZjb250ZXh0LT51YXIpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoY29udGV4dCk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCisJY29udGV4dC0+ZGJfdGFiID0gbXRoY2FfaW5pdF91c2VyX2RiX3RhYih0b19tZGV2KGliZGV2KSk7CisJaWYgKElTX0VSUihjb250ZXh0LT5kYl90YWIpKSB7CisJCWVyciA9IFBUUl9FUlIoY29udGV4dC0+ZGJfdGFiKTsKKwkJbXRoY2FfdWFyX2ZyZWUodG9fbWRldihpYmRldiksICZjb250ZXh0LT51YXIpOworCQlrZnJlZShjb250ZXh0KTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwlpZiAoaWJfY29weV90b191ZGF0YSh1ZGF0YSwgJnVyZXNwLCBzaXplb2YgdXJlc3ApKSB7CisJCW10aGNhX2NsZWFudXBfdXNlcl9kYl90YWIodG9fbWRldihpYmRldiksICZjb250ZXh0LT51YXIsIGNvbnRleHQtPmRiX3RhYik7CisJCW10aGNhX3Vhcl9mcmVlKHRvX21kZXYoaWJkZXYpLCAmY29udGV4dC0+dWFyKTsKKwkJa2ZyZWUoY29udGV4dCk7CisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCX0KKworCXJldHVybiAmY29udGV4dC0+aWJ1Y29udGV4dDsKK30KKworc3RhdGljIGludCBtdGhjYV9kZWFsbG9jX3Vjb250ZXh0KHN0cnVjdCBpYl91Y29udGV4dCAqY29udGV4dCkKK3sKKwltdGhjYV9jbGVhbnVwX3VzZXJfZGJfdGFiKHRvX21kZXYoY29udGV4dC0+ZGV2aWNlKSwgJnRvX211Y29udGV4dChjb250ZXh0KS0+dWFyLAorCQkJCSAgdG9fbXVjb250ZXh0KGNvbnRleHQpLT5kYl90YWIpOworCW10aGNhX3Vhcl9mcmVlKHRvX21kZXYoY29udGV4dC0+ZGV2aWNlKSwgJnRvX211Y29udGV4dChjb250ZXh0KS0+dWFyKTsKKwlrZnJlZSh0b19tdWNvbnRleHQoY29udGV4dCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRoY2FfbW1hcF91YXIoc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpZiAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0ICE9IFBBR0VfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOworCisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIucGZuLAorCQkJICAgIFBBR0VfU0laRSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGliX3BkICptdGhjYV9hbGxvY19wZChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKKwkJCQkgICAgc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQogewogCXN0cnVjdCBtdGhjYV9wZCAqcGQ7CiAJaW50IGVycjsKQEAgLTI5MiwxMiArMzY4LDIwIEBACiAJaWYgKCFwZCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQllcnIgPSBtdGhjYV9wZF9hbGxvYyh0b19tZGV2KGliZGV2KSwgcGQpOworCWVyciA9IG10aGNhX3BkX2FsbG9jKHRvX21kZXYoaWJkZXYpLCAhY29udGV4dCwgcGQpOwogCWlmIChlcnIpIHsKIAkJa2ZyZWUocGQpOwogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KIAorCWlmIChjb250ZXh0KSB7CisJCWlmIChpYl9jb3B5X3RvX3VkYXRhKHVkYXRhLCAmcGQtPnBkX251bSwgc2l6ZW9mIChfX3UzMikpKSB7CisJCQltdGhjYV9wZF9mcmVlKHRvX21kZXYoaWJkZXYpLCBwZCk7CisJCQlrZnJlZShwZCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwkJfQorCX0KKwogCXJldHVybiAmcGQtPmlicGQ7CiB9CiAKQEAgLTMzNyw4ICs0MjEsMTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpYl9xcCAqbXRoY2FfY3JlYXRlX3FwKHN0cnVjdCBpYl9wZCAqcGQsCi0JCQkJICAgICBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICppbml0X2F0dHIpCisJCQkJICAgICBzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICppbml0X2F0dHIsCisJCQkJICAgICBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKQogeworCXN0cnVjdCBtdGhjYV9jcmVhdGVfcXAgdWNtZDsKIAlzdHJ1Y3QgbXRoY2FfcXAgKnFwOwogCWludCBlcnI7CiAKQEAgLTM0Nyw0MSArNDMzLDgyIEBACiAJY2FzZSBJQl9RUFRfVUM6CiAJY2FzZSBJQl9RUFRfVUQ6CiAJeworCQlzdHJ1Y3QgbXRoY2FfdWNvbnRleHQgKmNvbnRleHQ7CisKIAkJcXAgPSBrbWFsbG9jKHNpemVvZiAqcXAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXFwKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQkJcXAtPnNxLm1heCAgICA9IGluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3dyOwotCQlxcC0+cnEubWF4ICAgID0gaW5pdF9hdHRyLT5jYXAubWF4X3JlY3Zfd3I7Ci0JCXFwLT5zcS5tYXhfZ3MgPSBpbml0X2F0dHItPmNhcC5tYXhfc2VuZF9zZ2U7Ci0JCXFwLT5ycS5tYXhfZ3MgPSBpbml0X2F0dHItPmNhcC5tYXhfcmVjdl9zZ2U7CisJCWlmIChwZC0+dW9iamVjdCkgeworCQkJY29udGV4dCA9IHRvX211Y29udGV4dChwZC0+dW9iamVjdC0+Y29udGV4dCk7CisKKwkJCWlmIChpYl9jb3B5X2Zyb21fdWRhdGEoJnVjbWQsIHVkYXRhLCBzaXplb2YgdWNtZCkpCisJCQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CisKKwkJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksICZjb250ZXh0LT51YXIsCisJCQkJCQljb250ZXh0LT5kYl90YWIsCisJCQkJCQl1Y21kLnNxX2RiX2luZGV4LCB1Y21kLnNxX2RiX3BhZ2UpOworCQkJaWYgKGVycikgeworCQkJCWtmcmVlKHFwKTsKKwkJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQkJfQorCisJCQllcnIgPSBtdGhjYV9tYXBfdXNlcl9kYih0b19tZGV2KHBkLT5kZXZpY2UpLCAmY29udGV4dC0+dWFyLAorCQkJCQkJY29udGV4dC0+ZGJfdGFiLAorCQkJCQkJdWNtZC5ycV9kYl9pbmRleCwgdWNtZC5ycV9kYl9wYWdlKTsKKwkJCWlmIChlcnIpIHsKKwkJCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYocGQtPmRldmljZSksCisJCQkJCQkgICAgJmNvbnRleHQtPnVhciwKKwkJCQkJCSAgICBjb250ZXh0LT5kYl90YWIsCisJCQkJCQkgICAgdWNtZC5zcV9kYl9pbmRleCk7CisJCQkJa2ZyZWUocXApOworCQkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCQl9CisKKwkJCXFwLT5tci5pYm1yLmxrZXkgPSB1Y21kLmxrZXk7CisJCQlxcC0+c3EuZGJfaW5kZXggID0gdWNtZC5zcV9kYl9pbmRleDsKKwkJCXFwLT5ycS5kYl9pbmRleCAgPSB1Y21kLnJxX2RiX2luZGV4OworCQl9CiAKIAkJZXJyID0gbXRoY2FfYWxsb2NfcXAodG9fbWRldihwZC0+ZGV2aWNlKSwgdG9fbXBkKHBkKSwKIAkJCQkgICAgIHRvX21jcShpbml0X2F0dHItPnNlbmRfY3EpLAogCQkJCSAgICAgdG9fbWNxKGluaXRfYXR0ci0+cmVjdl9jcSksCiAJCQkJICAgICBpbml0X2F0dHItPnFwX3R5cGUsIGluaXRfYXR0ci0+c3Ffc2lnX3R5cGUsCi0JCQkJICAgICBxcCk7CisJCQkJICAgICAmaW5pdF9hdHRyLT5jYXAsIHFwKTsKKworCQlpZiAoZXJyICYmIHBkLT51b2JqZWN0KSB7CisJCQljb250ZXh0ID0gdG9fbXVjb250ZXh0KHBkLT51b2JqZWN0LT5jb250ZXh0KTsKKworCQkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KHBkLT5kZXZpY2UpLAorCQkJCQkgICAgJmNvbnRleHQtPnVhciwKKwkJCQkJICAgIGNvbnRleHQtPmRiX3RhYiwKKwkJCQkJICAgIHVjbWQuc3FfZGJfaW5kZXgpOworCQkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KHBkLT5kZXZpY2UpLAorCQkJCQkgICAgJmNvbnRleHQtPnVhciwKKwkJCQkJICAgIGNvbnRleHQtPmRiX3RhYiwKKwkJCQkJICAgIHVjbWQucnFfZGJfaW5kZXgpOworCQl9CisKIAkJcXAtPmlicXAucXBfbnVtID0gcXAtPnFwbjsKIAkJYnJlYWs7CiAJfQogCWNhc2UgSUJfUVBUX1NNSToKIAljYXNlIElCX1FQVF9HU0k6CiAJeworCQkvKiBEb24ndCBhbGxvdyB1c2Vyc3BhY2UgdG8gY3JlYXRlIHNwZWNpYWwgUVBzICovCisJCWlmIChwZC0+dW9iamVjdCkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCiAJCXFwID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBtdGhjYV9zcXApLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFxcCkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JCXFwLT5zcS5tYXggICAgPSBpbml0X2F0dHItPmNhcC5tYXhfc2VuZF93cjsKLQkJcXAtPnJxLm1heCAgICA9IGluaXRfYXR0ci0+Y2FwLm1heF9yZWN2X3dyOwotCQlxcC0+c3EubWF4X2dzID0gaW5pdF9hdHRyLT5jYXAubWF4X3NlbmRfc2dlOwotCQlxcC0+cnEubWF4X2dzID0gaW5pdF9hdHRyLT5jYXAubWF4X3JlY3Zfc2dlOwotCiAJCXFwLT5pYnFwLnFwX251bSA9IGluaXRfYXR0ci0+cXBfdHlwZSA9PSBJQl9RUFRfU01JID8gMCA6IDE7CiAKIAkJZXJyID0gbXRoY2FfYWxsb2Nfc3FwKHRvX21kZXYocGQtPmRldmljZSksIHRvX21wZChwZCksCiAJCQkJICAgICAgdG9fbWNxKGluaXRfYXR0ci0+c2VuZF9jcSksCiAJCQkJICAgICAgdG9fbWNxKGluaXRfYXR0ci0+cmVjdl9jcSksCi0JCQkJICAgICAgaW5pdF9hdHRyLT5zcV9zaWdfdHlwZSwKKwkJCQkgICAgICBpbml0X2F0dHItPnNxX3NpZ190eXBlLCAmaW5pdF9hdHRyLT5jYXAsCiAJCQkJICAgICAgcXAtPmlicXAucXBfbnVtLCBpbml0X2F0dHItPnBvcnRfbnVtLAogCQkJCSAgICAgIHRvX21zcXAocXApKTsKIAkJYnJlYWs7CkBAIC0zOTYsNDIgKzUyMywxMTUgQEAKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAl9CiAKLSAgICAgICAgaW5pdF9hdHRyLT5jYXAubWF4X2lubGluZV9kYXRhID0gMDsKKwlpbml0X2F0dHItPmNhcC5tYXhfaW5saW5lX2RhdGEgPSAwOworCWluaXRfYXR0ci0+Y2FwLm1heF9zZW5kX3dyICAgICA9IHFwLT5zcS5tYXg7CisJaW5pdF9hdHRyLT5jYXAubWF4X3JlY3Zfd3IgICAgID0gcXAtPnJxLm1heDsKKwlpbml0X2F0dHItPmNhcC5tYXhfc2VuZF9zZ2UgICAgPSBxcC0+c3EubWF4X2dzOworCWluaXRfYXR0ci0+Y2FwLm1heF9yZWN2X3NnZSAgICA9IHFwLT5ycS5tYXhfZ3M7CiAKIAlyZXR1cm4gJnFwLT5pYnFwOwogfQogCiBzdGF0aWMgaW50IG10aGNhX2Rlc3Ryb3lfcXAoc3RydWN0IGliX3FwICpxcCkKIHsKKwlpZiAocXAtPnVvYmplY3QpIHsKKwkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KHFwLT5kZXZpY2UpLAorCQkJCSAgICAmdG9fbXVjb250ZXh0KHFwLT51b2JqZWN0LT5jb250ZXh0KS0+dWFyLAorCQkJCSAgICB0b19tdWNvbnRleHQocXAtPnVvYmplY3QtPmNvbnRleHQpLT5kYl90YWIsCisJCQkJICAgIHRvX21xcChxcCktPnNxLmRiX2luZGV4KTsKKwkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KHFwLT5kZXZpY2UpLAorCQkJCSAgICAmdG9fbXVjb250ZXh0KHFwLT51b2JqZWN0LT5jb250ZXh0KS0+dWFyLAorCQkJCSAgICB0b19tdWNvbnRleHQocXAtPnVvYmplY3QtPmNvbnRleHQpLT5kYl90YWIsCisJCQkJICAgIHRvX21xcChxcCktPnJxLmRiX2luZGV4KTsKKwl9CiAJbXRoY2FfZnJlZV9xcCh0b19tZGV2KHFwLT5kZXZpY2UpLCB0b19tcXAocXApKTsKIAlrZnJlZShxcCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaWJfY3EgKm10aGNhX2NyZWF0ZV9jcShzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgaW50IGVudHJpZXMpCitzdGF0aWMgc3RydWN0IGliX2NxICptdGhjYV9jcmVhdGVfY3Eoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIGludCBlbnRyaWVzLAorCQkJCSAgICAgc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICAgc3RydWN0IGliX3VkYXRhICp1ZGF0YSkKIHsKKwlzdHJ1Y3QgbXRoY2FfY3JlYXRlX2NxIHVjbWQ7CiAJc3RydWN0IG10aGNhX2NxICpjcTsKIAlpbnQgbmVudDsKIAlpbnQgZXJyOwogCisJaWYgKGNvbnRleHQpIHsKKwkJaWYgKGliX2NvcHlfZnJvbV91ZGF0YSgmdWNtZCwgdWRhdGEsIHNpemVvZiB1Y21kKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCisJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYoaWJkZXYpLCAmdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIsCisJCQkJCXRvX211Y29udGV4dChjb250ZXh0KS0+ZGJfdGFiLAorCQkJCQl1Y21kLnNldF9kYl9pbmRleCwgdWNtZC5zZXRfZGJfcGFnZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJCWVyciA9IG10aGNhX21hcF91c2VyX2RiKHRvX21kZXYoaWJkZXYpLCAmdG9fbXVjb250ZXh0KGNvbnRleHQpLT51YXIsCisJCQkJCXRvX211Y29udGV4dChjb250ZXh0KS0+ZGJfdGFiLAorCQkJCQl1Y21kLmFybV9kYl9pbmRleCwgdWNtZC5hcm1fZGJfcGFnZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl91bm1hcF9zZXQ7CisJfQorCiAJY3EgPSBrbWFsbG9jKHNpemVvZiAqY3EsIEdGUF9LRVJORUwpOwotCWlmICghY3EpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICghY3EpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5tYXBfYXJtOworCX0KKworCWlmIChjb250ZXh0KSB7CisJCWNxLT5tci5pYm1yLmxrZXkgICAgPSB1Y21kLmxrZXk7CisJCWNxLT5zZXRfY2lfZGJfaW5kZXggPSB1Y21kLnNldF9kYl9pbmRleDsKKwkJY3EtPmFybV9kYl9pbmRleCAgICA9IHVjbWQuYXJtX2RiX2luZGV4OworCX0KIAogCWZvciAobmVudCA9IDE7IG5lbnQgPD0gZW50cmllczsgbmVudCA8PD0gMSkKIAkJOyAvKiBub3RoaW5nICovCiAKLQllcnIgPSBtdGhjYV9pbml0X2NxKHRvX21kZXYoaWJkZXYpLCBuZW50LCBjcSk7Ci0JaWYgKGVycikgewotCQlrZnJlZShjcSk7Ci0JCWNxID0gRVJSX1BUUihlcnIpOworCWVyciA9IG10aGNhX2luaXRfY3EodG9fbWRldihpYmRldiksIG5lbnQsCisJCQkgICAgY29udGV4dCA/IHRvX211Y29udGV4dChjb250ZXh0KSA6IE5VTEwsCisJCQkgICAgY29udGV4dCA/IHVjbWQucGRuIDogdG9fbWRldihpYmRldiktPmRyaXZlcl9wZC5wZF9udW0sCisJCQkgICAgY3EpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlpZiAoY29udGV4dCAmJiBpYl9jb3B5X3RvX3VkYXRhKHVkYXRhLCAmY3EtPmNxbiwgc2l6ZW9mIChfX3UzMikpKSB7CisJCW10aGNhX2ZyZWVfY3EodG9fbWRldihpYmRldiksIGNxKTsKKwkJZ290byBlcnJfZnJlZTsKIAl9CiAKIAlyZXR1cm4gJmNxLT5pYmNxOworCitlcnJfZnJlZToKKwlrZnJlZShjcSk7CisKK2Vycl91bm1hcF9hcm06CisJaWYgKGNvbnRleHQpCisJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihpYmRldiksICZ0b19tdWNvbnRleHQoY29udGV4dCktPnVhciwKKwkJCQkgICAgdG9fbXVjb250ZXh0KGNvbnRleHQpLT5kYl90YWIsIHVjbWQuYXJtX2RiX2luZGV4KTsKKworZXJyX3VubWFwX3NldDoKKwlpZiAoY29udGV4dCkKKwkJbXRoY2FfdW5tYXBfdXNlcl9kYih0b19tZGV2KGliZGV2KSwgJnRvX211Y29udGV4dChjb250ZXh0KS0+dWFyLAorCQkJCSAgICB0b19tdWNvbnRleHQoY29udGV4dCktPmRiX3RhYiwgdWNtZC5zZXRfZGJfaW5kZXgpOworCisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogc3RhdGljIGludCBtdGhjYV9kZXN0cm95X2NxKHN0cnVjdCBpYl9jcSAqY3EpCiB7CisJaWYgKGNxLT51b2JqZWN0KSB7CisJCW10aGNhX3VubWFwX3VzZXJfZGIodG9fbWRldihjcS0+ZGV2aWNlKSwKKwkJCQkgICAgJnRvX211Y29udGV4dChjcS0+dW9iamVjdC0+Y29udGV4dCktPnVhciwKKwkJCQkgICAgdG9fbXVjb250ZXh0KGNxLT51b2JqZWN0LT5jb250ZXh0KS0+ZGJfdGFiLAorCQkJCSAgICB0b19tY3EoY3EpLT5hcm1fZGJfaW5kZXgpOworCQltdGhjYV91bm1hcF91c2VyX2RiKHRvX21kZXYoY3EtPmRldmljZSksCisJCQkJICAgICZ0b19tdWNvbnRleHQoY3EtPnVvYmplY3QtPmNvbnRleHQpLT51YXIsCisJCQkJICAgIHRvX211Y29udGV4dChjcS0+dW9iamVjdC0+Y29udGV4dCktPmRiX3RhYiwKKwkJCQkgICAgdG9fbWNxKGNxKS0+c2V0X2NpX2RiX2luZGV4KTsKKwl9CiAJbXRoY2FfZnJlZV9jcSh0b19tZGV2KGNxLT5kZXZpY2UpLCB0b19tY3EoY3EpKTsKIAlrZnJlZShjcSk7CiAKQEAgLTU1OCw2ICs3NTgsNyBAQAogCQkJCSAgY29udmVydF9hY2Nlc3MoYWNjKSwgbXIpOwogCiAJaWYgKGVycikgeworCQlrZnJlZShwYWdlX2xpc3QpOwogCQlrZnJlZShtcik7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJfQpAQCAtNTY2LDYgKzc2Nyw4NyBAQAogCXJldHVybiAmbXItPmlibXI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWJfbXIgKm10aGNhX3JlZ191c2VyX21yKHN0cnVjdCBpYl9wZCAqcGQsIHN0cnVjdCBpYl91bWVtICpyZWdpb24sCisJCQkJICAgICAgIGludCBhY2MsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpCit7CisJc3RydWN0IG10aGNhX2RldiAqZGV2ID0gdG9fbWRldihwZC0+ZGV2aWNlKTsKKwlzdHJ1Y3QgaWJfdW1lbV9jaHVuayAqY2h1bms7CisJc3RydWN0IG10aGNhX21yICptcjsKKwl1NjQgKnBhZ2VzOworCWludCBzaGlmdCwgbiwgbGVuOworCWludCBpLCBqLCBrOworCWludCBlcnIgPSAwOworCisJc2hpZnQgPSBmZnMocmVnaW9uLT5wYWdlX3NpemUpIC0gMTsKKworCW1yID0ga21hbGxvYyhzaXplb2YgKm1yLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1yKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCW4gPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZyZWdpb24tPmNodW5rX2xpc3QsIGxpc3QpCisJCW4gKz0gY2h1bmstPm5lbnRzOworCisJbXItPm10dCA9IG10aGNhX2FsbG9jX210dChkZXYsIG4pOworCWlmIChJU19FUlIobXItPm10dCkpIHsKKwkJZXJyID0gUFRSX0VSUihtci0+bXR0KTsKKwkJZ290byBlcnI7CisJfQorCisJcGFnZXMgPSAodTY0ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2VzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX210dDsKKwl9CisKKwlpID0gbiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNodW5rLCAmcmVnaW9uLT5jaHVua19saXN0LCBsaXN0KQorCQlmb3IgKGogPSAwOyBqIDwgY2h1bmstPm5tYXA7ICsraikgeworCQkJbGVuID0gc2dfZG1hX2xlbigmY2h1bmstPnBhZ2VfbGlzdFtqXSkgPj4gc2hpZnQ7CisJCQlmb3IgKGsgPSAwOyBrIDwgbGVuOyArK2spIHsKKwkJCQlwYWdlc1tpKytdID0gc2dfZG1hX2FkZHJlc3MoJmNodW5rLT5wYWdlX2xpc3Rbal0pICsKKwkJCQkJcmVnaW9uLT5wYWdlX3NpemUgKiBrOworCQkJCS8qCisJCQkJICogQmUgZnJpZW5kbHkgdG8gV1JJVEVfTVRUIGNvbW1hbmQKKwkJCQkgKiBhbmQgbGVhdmUgdHdvIGVtcHR5IHNsb3RzIGZvciB0aGUKKwkJCQkgKiBpbmRleCBhbmQgcmVzZXJ2ZWQgZmllbGRzIG9mIHRoZQorCQkJCSAqIG1haWxib3guCisJCQkJICovCisJCQkJaWYgKGkgPT0gUEFHRV9TSVpFIC8gc2l6ZW9mICh1NjQpIC0gMikgeworCQkJCQllcnIgPSBtdGhjYV93cml0ZV9tdHQoZGV2LCBtci0+bXR0LAorCQkJCQkJCSAgICAgIG4sIHBhZ2VzLCBpKTsKKwkJCQkJaWYgKGVycikKKwkJCQkJCWdvdG8gbXR0X2RvbmU7CisJCQkJCW4gKz0gaTsKKwkJCQkJaSA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoaSkKKwkJZXJyID0gbXRoY2Ffd3JpdGVfbXR0KGRldiwgbXItPm10dCwgbiwgcGFnZXMsIGkpOworbXR0X2RvbmU6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlcyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfbXR0OworCisJZXJyID0gbXRoY2FfbXJfYWxsb2MoZGV2LCB0b19tcGQocGQpLT5wZF9udW0sIHNoaWZ0LCByZWdpb24tPnZpcnRfYmFzZSwKKwkJCSAgICAgcmVnaW9uLT5sZW5ndGgsIGNvbnZlcnRfYWNjZXNzKGFjYyksIG1yKTsKKworCWlmIChlcnIpCisJCWdvdG8gZXJyX210dDsKKworCXJldHVybiAmbXItPmlibXI7CisKK2Vycl9tdHQ6CisJbXRoY2FfZnJlZV9tdHQoZGV2LCBtci0+bXR0KTsKKworZXJyOgorCWtmcmVlKG1yKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCiBzdGF0aWMgaW50IG10aGNhX2RlcmVnX21yKHN0cnVjdCBpYl9tciAqbXIpCiB7CiAJc3RydWN0IG10aGNhX21yICptbXIgPSB0b19tbXIobXIpOwpAQCAtNjkwLDYgKzk3Miw4IEBACiAJaW50IGk7CiAKIAlzdHJsY3B5KGRldi0+aWJfZGV2Lm5hbWUsICJtdGhjYSVkIiwgSUJfREVWSUNFX05BTUVfTUFYKTsKKwlkZXYtPmliX2Rldi5vd25lciAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFOworCiAJZGV2LT5pYl9kZXYubm9kZV90eXBlICAgICAgICAgICAgPSBJQl9OT0RFX0NBOwogCWRldi0+aWJfZGV2LnBoeXNfcG9ydF9jbnQgICAgICAgID0gZGV2LT5saW1pdHMubnVtX3BvcnRzOwogCWRldi0+aWJfZGV2LmRtYV9kZXZpY2UgICAgICAgICAgID0gJmRldi0+cGRldi0+ZGV2OwpAQCAtNjk5LDYgKzk4Myw5IEBACiAJZGV2LT5pYl9kZXYubW9kaWZ5X3BvcnQgICAgICAgICAgPSBtdGhjYV9tb2RpZnlfcG9ydDsKIAlkZXYtPmliX2Rldi5xdWVyeV9wa2V5ICAgICAgICAgICA9IG10aGNhX3F1ZXJ5X3BrZXk7CiAJZGV2LT5pYl9kZXYucXVlcnlfZ2lkICAgICAgICAgICAgPSBtdGhjYV9xdWVyeV9naWQ7CisJZGV2LT5pYl9kZXYuYWxsb2NfdWNvbnRleHQgICAgICAgPSBtdGhjYV9hbGxvY191Y29udGV4dDsKKwlkZXYtPmliX2Rldi5kZWFsbG9jX3Vjb250ZXh0ICAgICA9IG10aGNhX2RlYWxsb2NfdWNvbnRleHQ7CisJZGV2LT5pYl9kZXYubW1hcCAgICAgICAgICAgICAgICAgPSBtdGhjYV9tbWFwX3VhcjsKIAlkZXYtPmliX2Rldi5hbGxvY19wZCAgICAgICAgICAgICA9IG10aGNhX2FsbG9jX3BkOwogCWRldi0+aWJfZGV2LmRlYWxsb2NfcGQgICAgICAgICAgID0gbXRoY2FfZGVhbGxvY19wZDsKIAlkZXYtPmliX2Rldi5jcmVhdGVfYWggICAgICAgICAgICA9IG10aGNhX2FoX2NyZWF0ZTsKQEAgLTcxMSw2ICs5OTgsNyBAQAogCWRldi0+aWJfZGV2LnBvbGxfY3EgICAgICAgICAgICAgID0gbXRoY2FfcG9sbF9jcTsKIAlkZXYtPmliX2Rldi5nZXRfZG1hX21yICAgICAgICAgICA9IG10aGNhX2dldF9kbWFfbXI7CiAJZGV2LT5pYl9kZXYucmVnX3BoeXNfbXIgICAgICAgICAgPSBtdGhjYV9yZWdfcGh5c19tcjsKKwlkZXYtPmliX2Rldi5yZWdfdXNlcl9tciAgICAgICAgICA9IG10aGNhX3JlZ191c2VyX21yOwogCWRldi0+aWJfZGV2LmRlcmVnX21yICAgICAgICAgICAgID0gbXRoY2FfZGVyZWdfbXI7CiAKIAlpZiAoZGV2LT5tdGhjYV9mbGFncyAmIE1USENBX0ZMQUdfRk1SKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfcHJvdmlkZXIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5oCmluZGV4IDYxOTcxMGYuLjFkMDMyNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9wcm92aWRlci5oCkBAIC0xLDUgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwNSBDaXNjbyBTeXN0ZW1zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNTQsMTggKzU1LDI2IEBACiAJaW50ICAgICAgICAgICBpbmRleDsKIH07CiAKK3N0cnVjdCBtdGhjYV91c2VyX2RiX3RhYmxlOworCitzdHJ1Y3QgbXRoY2FfdWNvbnRleHQgeworCXN0cnVjdCBpYl91Y29udGV4dCAgICAgICAgICBpYnVjb250ZXh0OworCXN0cnVjdCBtdGhjYV91YXIgICAgICAgICAgICB1YXI7CisJc3RydWN0IG10aGNhX3VzZXJfZGJfdGFibGUgKmRiX3RhYjsKK307CisKK3N0cnVjdCBtdGhjYV9tdHQ7CisKIHN0cnVjdCBtdGhjYV9tciB7Ci0Jc3RydWN0IGliX21yIGlibXI7Ci0JaW50IG9yZGVyOwotCXUzMiBmaXJzdF9zZWc7CisJc3RydWN0IGliX21yICAgICAgaWJtcjsKKwlzdHJ1Y3QgbXRoY2FfbXR0ICptdHQ7CiB9OwogCiBzdHJ1Y3QgbXRoY2FfZm1yIHsKLQlzdHJ1Y3QgaWJfZm1yIGlibXI7CisJc3RydWN0IGliX2ZtciAgICAgIGlibXI7CiAJc3RydWN0IGliX2Ztcl9hdHRyIGF0dHI7Ci0JaW50IG9yZGVyOwotCXUzMiBmaXJzdF9zZWc7Ci0JaW50IG1hcHM7CisJc3RydWN0IG10aGNhX210dCAgKm10dDsKKwlpbnQgICAgICAgICAgICAgICAgbWFwczsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgbXRoY2FfbXB0X2VudHJ5IF9faW9tZW0gKm1wdDsKQEAgLTgzLDYgKzkyLDcgQEAKIAl1MzIgICAgICAgICAgICAgcGRfbnVtOwogCWF0b21pY190ICAgICAgICBzcXBfY291bnQ7CiAJc3RydWN0IG10aGNhX21yIG50bXI7CisJaW50ICAgICAgICAgICAgIHByaXZpbGVnZWQ7CiB9OwogCiBzdHJ1Y3QgbXRoY2FfZXEgewpAQCAtMTY3LDYgKzE3Nyw3IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICBjcW47CiAJdTMyICAgICAgICAgICAgICAgICAgICBjb25zX2luZGV4OwogCWludCAgICAgICAgICAgICAgICAgICAgaXNfZGlyZWN0OworCWludCAgICAgICAgICAgICAgICAgICAgaXNfa2VybmVsOwogCiAJLyogTmV4dCBmaWVsZHMgYXJlIEFyYmVsIG9ubHkgKi8KIAlpbnQgICAgICAgICAgICAgICAgICAgIHNldF9jaV9kYl9pbmRleDsKQEAgLTIzNiw2ICsyNDcsMTEgQEAKIAlkbWFfYWRkcl90ICAgICAgaGVhZGVyX2RtYTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG10aGNhX3Vjb250ZXh0ICp0b19tdWNvbnRleHQoc3RydWN0IGliX3Vjb250ZXh0ICppYnVjb250ZXh0KQoreworCXJldHVybiBjb250YWluZXJfb2YoaWJ1Y29udGV4dCwgc3RydWN0IG10aGNhX3Vjb250ZXh0LCBpYnVjb250ZXh0KTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRoY2FfZm1yICp0b19tZm1yKHN0cnVjdCBpYl9mbXIgKmlibXIpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpYm1yLCBzdHJ1Y3QgbXRoY2FfZm1yLCBpYm1yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKaW5kZXggY2E3M2JhYi4uZjcxMjZiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L210aGNhL210aGNhX3FwLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDA0IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQ2LDcgKzQ3LDkgQEAKIAlNVEhDQV9NQVhfRElSRUNUX1FQX1NJWkUgPSA0ICogUEFHRV9TSVpFLAogCU1USENBX0FDS19SRVFfRlJFUSAgICAgICA9IDEwLAogCU1USENBX0ZMSUdIVF9MSU1JVCAgICAgICA9IDksCi0JTVRIQ0FfVURfSEVBREVSX1NJWkUgICAgID0gNzIgLyogbGFyZ2VzdCBVRCBoZWFkZXIgcG9zc2libGUgKi8KKwlNVEhDQV9VRF9IRUFERVJfU0laRSAgICAgPSA3MiwgLyogbGFyZ2VzdCBVRCBoZWFkZXIgcG9zc2libGUgKi8KKwlNVEhDQV9JTkxJTkVfSEVBREVSX1NJWkUgPSA0LCAgLyogZGF0YSBzZWdtZW50IG92ZXJoZWFkIGZvciBpbmxpbmUgKi8KKwlNVEhDQV9JTkxJTkVfQ0hVTktfU0laRSAgPSAxNiAgLyogaW5saW5lIGRhdGEgc2VnbWVudCBjaHVuayAqLwogfTsKIAogZW51bSB7CkBAIC0zNTcsNiArMzYwLDkgQEAKIAkJCQlbVURdICA9IChJQl9RUF9QS0VZX0lOREVYIHwKIAkJCQkJIElCX1FQX1BPUlQgICAgICAgfAogCQkJCQkgSUJfUVBfUUtFWSksCisJCQkJW1VDXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CisJCQkJCSBJQl9RUF9QT1JUICAgICAgIHwKKwkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyksCiAJCQkJW1JDXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CiAJCQkJCSBJQl9RUF9QT1JUICAgICAgIHwKIAkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyksCkBAIC0zNzgsNiArMzg0LDkgQEAKIAkJCQlbVURdICA9IChJQl9RUF9QS0VZX0lOREVYIHwKIAkJCQkJIElCX1FQX1BPUlQgICAgICAgfAogCQkJCQkgSUJfUVBfUUtFWSksCisJCQkJW1VDXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CisJCQkJCSBJQl9RUF9QT1JUICAgICAgIHwKKwkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyksCiAJCQkJW1JDXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CiAJCQkJCSBJQl9RUF9QT1JUICAgICAgIHwKIAkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyksCkBAIC0zODgsNiArMzk3LDExIEBACiAJCVtJQl9RUFNfUlRSXSAgID0gewogCQkJLnRyYW5zID0gTVRIQ0FfVFJBTlNfSU5JVDJSVFIsCiAJCQkucmVxX3BhcmFtID0geworCQkJCVtVQ10gID0gKElCX1FQX0FWICAgICAgICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfUEFUSF9NVFUgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9ERVNUX1FQTiAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX1JRX1BTTiAgICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDKSwKIAkJCQlbUkNdICA9IChJQl9RUF9BViAgICAgICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1BBVEhfTVRVICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfREVTVF9RUE4gICAgICAgICAgICB8CkBAIC0zOTgsNiArNDEyLDkgQEAKIAkJCS5vcHRfcGFyYW0gPSB7CiAJCQkJW1VEXSAgPSAoSUJfUVBfUEtFWV9JTkRFWCB8CiAJCQkJCSBJQl9RUF9RS0VZKSwKKwkJCQlbVUNdICA9IChJQl9RUF9BTFRfUEFUSCAgICAgfAorCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTIHwKKwkJCQkJIElCX1FQX1BLRVlfSU5ERVgpLAogCQkJCVtSQ10gID0gKElCX1FQX0FMVF9QQVRIICAgICB8CiAJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MgfAogCQkJCQkgSUJfUVBfUEtFWV9JTkRFWCksCkBAIC00MTMsNiArNDMwLDggQEAKIAkJCS50cmFucyA9IE1USENBX1RSQU5TX1JUUjJSVFMsCiAJCQkucmVxX3BhcmFtID0gewogCQkJCVtVRF0gID0gSUJfUVBfU1FfUFNOLAorCQkJCVtVQ10gID0gKElCX1FQX1NRX1BTTiAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX01BWF9RUF9SRF9BVE9NSUMpLAogCQkJCVtSQ10gID0gKElCX1FQX1RJTUVPVVQgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1JFVFJZX0NOVCAgICAgICAgIHwKIAkJCQkJIElCX1FQX1JOUl9SRVRSWSAgICAgICAgIHwKQEAgLTQyMyw2ICs0NDIsMTEgQEAKIAkJCS5vcHRfcGFyYW0gPSB7CiAJCQkJW1VEXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1FLRVkpLAorCQkJCVtVQ10gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9BTFRfUEFUSCAgICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfQUNDRVNTX0ZMQUdTICAgICAgICAgIHwKKwkJCQkJIElCX1FQX1BLRVlfSU5ERVggICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9QQVRIX01JR19TVEFURSksCiAJCQkJW1JDXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfApAQCAtNDQyLDYgKzQ2Niw5IEBACiAJCQkub3B0X3BhcmFtID0gewogCQkJCVtVRF0gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9RS0VZKSwKKwkJCQlbVUNdICA9IChJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfAorCQkJCQkgSUJfUVBfQUxUX1BBVEggICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKIAkJCQlbUkNdICA9IChJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfAogCQkJCQkgSUJfUVBfQUxUX1BBVEggICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFICAgICAgICB8CkBAIC00NjIsNiArNDg5LDEwIEBACiAJCQkub3B0X3BhcmFtID0gewogCQkJCVtVRF0gID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9RS0VZKSwKKwkJCQlbVUNdICA9IChJQl9RUF9DVVJfU1RBVEUgICAgICAgICAgICAgfAorCQkJCQkgSUJfUVBfQUxUX1BBVEggICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX0FDQ0VTU19GTEFHUyAgICAgICAgICB8CisJCQkJCSBJQl9RUF9QQVRIX01JR19TVEFURSksCiAJCQkJW1JDXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CiAJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfApAQCAtNDc2LDYgKzUwNywxNCBAQAogCQkJLm9wdF9wYXJhbSA9IHsKIAkJCQlbVURdICA9IChJQl9RUF9QS0VZX0lOREVYICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfUUtFWSksCisJCQkJW1VDXSAgPSAoSUJfUVBfQVYgICAgICAgICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX01BWF9RUF9SRF9BVE9NSUMgICAgICB8CisJCQkJCSBJQl9RUF9NQVhfREVTVF9SRF9BVE9NSUMgICAgfAorCQkJCQkgSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX0FMVF9QQVRIICAgICAgICAgICAgICB8CisJCQkJCSBJQl9RUF9BQ0NFU1NfRkxBR1MgICAgICAgICAgfAorCQkJCQkgSUJfUVBfUEtFWV9JTkRFWCAgICAgICAgICAgIHwKKwkJCQkJIElCX1FQX1BBVEhfTUlHX1NUQVRFKSwKIAkJCQlbUkNdICA9IChJQl9RUF9BViAgICAgICAgICAgICAgICAgICAgfAogCQkJCQkgSUJfUVBfVElNRU9VVCAgICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1JFVFJZX0NOVCAgICAgICAgICAgICB8CkBAIC01MDEsNiArNTQwLDcgQEAKIAkJCS5vcHRfcGFyYW0gPSB7CiAJCQkJW1VEXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX1FLRVkpLAorCQkJCVtVQ10gID0gKElCX1FQX0NVUl9TVEFURSksCiAJCQkJW1JDXSAgPSAoSUJfUVBfQ1VSX1NUQVRFICAgICAgICAgICAgIHwKIAkJCQkJIElCX1FQX01JTl9STlJfVElNRVIpLAogCQkJCVtNTFhdID0gKElCX1FQX0NVUl9TVEFURSAgICAgICAgICAgICB8CkBAIC01NTIsNyArNTkyLDcgQEAKIAlzdHJ1Y3QgbXRoY2FfZGV2ICpkZXYgPSB0b19tZGV2KGlicXAtPmRldmljZSk7CiAJc3RydWN0IG10aGNhX3FwICpxcCA9IHRvX21xcChpYnFwKTsKIAllbnVtIGliX3FwX3N0YXRlIGN1cl9zdGF0ZSwgbmV3X3N0YXRlOwotCXZvaWQgKm1haWxib3ggPSBOVUxMOworCXN0cnVjdCBtdGhjYV9tYWlsYm94ICptYWlsYm94OwogCXN0cnVjdCBtdGhjYV9xcF9wYXJhbSAqcXBfcGFyYW07CiAJc3RydWN0IG10aGNhX3FwX2NvbnRleHQgKnFwX2NvbnRleHQ7CiAJdTMyIHJlcV9wYXJhbSwgb3B0X3BhcmFtOwpAQCAtNjA5LDEwICs2NDksMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbWFpbGJveCA9IGttYWxsb2Moc2l6ZW9mICgqcXBfcGFyYW0pICsgTVRIQ0FfQ01EX01BSUxCT1hfRVhUUkEsIEdGUF9LRVJORUwpOwotCWlmICghbWFpbGJveCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcXBfcGFyYW0gPSBNQUlMQk9YX0FMSUdOKG1haWxib3gpOworCW1haWxib3ggPSBtdGhjYV9hbGxvY19tYWlsYm94KGRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJcXBfcGFyYW0gPSBtYWlsYm94LT5idWY7CiAJcXBfY29udGV4dCA9ICZxcF9wYXJhbS0+Y29udGV4dDsKIAltZW1zZXQocXBfcGFyYW0sIDAsIHNpemVvZiAqcXBfcGFyYW0pOwogCkBAIC02NTIsNyArNjkyLDExIEBACiAKIAkvKiBsZWF2ZSBhcmJlbF9zY2hlZF9xdWV1ZSBhcyAwICovCiAKLQlxcF9jb250ZXh0LT51c3JfcGFnZSAgID0gY3B1X3RvX2JlMzIoZGV2LT5kcml2ZXJfdWFyLmluZGV4KTsKKwlpZiAocXAtPmlicXAudW9iamVjdCkKKwkJcXBfY29udGV4dC0+dXNyX3BhZ2UgPQorCQkJY3B1X3RvX2JlMzIodG9fbXVjb250ZXh0KHFwLT5pYnFwLnVvYmplY3QtPmNvbnRleHQpLT51YXIuaW5kZXgpOworCWVsc2UKKwkJcXBfY29udGV4dC0+dXNyX3BhZ2UgPSBjcHVfdG9fYmUzMihkZXYtPmRyaXZlcl91YXIuaW5kZXgpOwogCXFwX2NvbnRleHQtPmxvY2FsX3FwbiAgPSBjcHVfdG9fYmUzMihxcC0+cXBuKTsKIAlpZiAoYXR0cl9tYXNrICYgSUJfUVBfREVTVF9RUE4pIHsKIAkJcXBfY29udGV4dC0+cmVtb3RlX3FwbiA9IGNwdV90b19iZTMyKGF0dHItPmRlc3RfcXBfbnVtKTsKQEAgLTY4Myw3ICs3MjcsNyBAQAogCWlmIChhdHRyX21hc2sgJiBJQl9RUF9BVikgewogCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5nX215bG1jICAgICA9IGF0dHItPmFoX2F0dHIuc3JjX3BhdGhfYml0cyAmIDB4N2Y7CiAJCXFwX2NvbnRleHQtPnByaV9wYXRoLnJsaWQgICAgICAgID0gY3B1X3RvX2JlMTYoYXR0ci0+YWhfYXR0ci5kbGlkKTsKLQkJcXBfY29udGV4dC0+cHJpX3BhdGguc3RhdGljX3JhdGUgPSAoISFhdHRyLT5haF9hdHRyLnN0YXRpY19yYXRlKSA8PCAzOworCQlxcF9jb250ZXh0LT5wcmlfcGF0aC5zdGF0aWNfcmF0ZSA9ICEhYXR0ci0+YWhfYXR0ci5zdGF0aWNfcmF0ZTsKIAkJaWYgKGF0dHItPmFoX2F0dHIuYWhfZmxhZ3MgJiBJQl9BSF9HUkgpIHsKIAkJCXFwX2NvbnRleHQtPnByaV9wYXRoLmdfbXlsbWMgfD0gMSA8PCA3OwogCQkJcXBfY29udGV4dC0+cHJpX3BhdGgubWdpZF9pbmRleCA9IGF0dHItPmFoX2F0dHIuZ3JoLnNnaWRfaW5kZXg7CkBAIC03MjQsOSArNzY4LDkgQEAKIAkJcXBfcGFyYW0tPm9wdF9wYXJhbV9tYXNrIHw9IGNwdV90b19iZTMyKE1USENBX1FQX09QVFBBUl9SRVRSWV9DT1VOVCk7CiAJfQogCi0JaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9ERVNUX1JEX0FUT01JQykgewotCQlxcF9jb250ZXh0LT5wYXJhbXMxIHw9IGNwdV90b19iZTMyKG1pbihhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMgPwotCQkJCQkJICAgICAgIGZmcyhhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMpIC0gMSA6IDAsCisJaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9RUF9SRF9BVE9NSUMpIHsKKwkJcXBfY29udGV4dC0+cGFyYW1zMSB8PSBjcHVfdG9fYmUzMihtaW4oYXR0ci0+bWF4X3JkX2F0b21pYyA/CisJCQkJCQkgICAgICAgZmZzKGF0dHItPm1heF9yZF9hdG9taWMpIC0gMSA6IDAsCiAJCQkJCQkgICAgICAgNykgPDwgMjEpOwogCQlxcF9wYXJhbS0+b3B0X3BhcmFtX21hc2sgfD0gY3B1X3RvX2JlMzIoTVRIQ0FfUVBfT1BUUEFSX1NSQV9NQVgpOwogCX0KQEAgLTc2NCwxMCArODA4LDEwIEBACiAJCXFwLT5hdG9taWNfcmRfZW4gPSBhdHRyLT5xcF9hY2Nlc3NfZmxhZ3M7CiAJfQogCi0JaWYgKGF0dHJfbWFzayAmIElCX1FQX01BWF9RUF9SRF9BVE9NSUMpIHsKKwlpZiAoYXR0cl9tYXNrICYgSUJfUVBfTUFYX0RFU1RfUkRfQVRPTUlDKSB7CiAJCXU4IHJyYV9tYXg7CiAKLQkJaWYgKHFwLT5yZXNwX2RlcHRoICYmICFhdHRyLT5tYXhfcmRfYXRvbWljKSB7CisJCWlmIChxcC0+cmVzcF9kZXB0aCAmJiAhYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljKSB7CiAJCQkvKgogCQkJICogTG93ZXJpbmcgb3VyIHJlc3BvbmRlciByZXNvdXJjZXMgdG8gemVyby4KIAkJCSAqIFR1cm4gb2ZmIFJETUEvYXRvbWljcyBhcyByZXNwb25kZXIuCkBAIC03NzgsNyArODIyLDcgQEAKIAkJCQkJCQkJTVRIQ0FfUVBfT1BUUEFSX1JBRSk7CiAJCX0KIAotCQlpZiAoIXFwLT5yZXNwX2RlcHRoICYmIGF0dHItPm1heF9yZF9hdG9taWMpIHsKKwkJaWYgKCFxcC0+cmVzcF9kZXB0aCAmJiBhdHRyLT5tYXhfZGVzdF9yZF9hdG9taWMpIHsKIAkJCS8qCiAJCQkgKiBJbmNyZWFzaW5nIG91ciByZXNwb25kZXIgcmVzb3VyY2VzIGZyb20KIAkJCSAqIHplcm8uICBUdXJuIG9uIFJETUEvYXRvbWljcyBhcyBhcHByb3ByaWF0ZS4KQEAgLTc5OSw3ICs4NDMsNyBAQAogCQl9CiAKIAkJZm9yIChycmFfbWF4ID0gMDsKLQkJICAgICAxIDw8IHJyYV9tYXggPCBhdHRyLT5tYXhfcmRfYXRvbWljICYmCisJCSAgICAgMSA8PCBycmFfbWF4IDwgYXR0ci0+bWF4X2Rlc3RfcmRfYXRvbWljICYmCiAJCQkgICAgIHJyYV9tYXggPCBkZXYtPnFwX3RhYmxlLnJkYl9zaGlmdDsKIAkJICAgICArK3JyYV9tYXgpCiAJCQk7IC8qIG5vdGhpbmcgKi8KQEAgLTgwNyw3ICs4NTEsNyBAQAogCQlxcF9jb250ZXh0LT5wYXJhbXMyICAgICAgfD0gY3B1X3RvX2JlMzIocnJhX21heCA8PCAyMSk7CiAJCXFwX3BhcmFtLT5vcHRfcGFyYW1fbWFzayB8PSBjcHVfdG9fYmUzMihNVEhDQV9RUF9PUFRQQVJfUlJBX01BWCk7CiAKLQkJcXAtPnJlc3BfZGVwdGggPSBhdHRyLT5tYXhfcmRfYXRvbWljOworCQlxcC0+cmVzcF9kZXB0aCA9IGF0dHItPm1heF9kZXN0X3JkX2F0b21pYzsKIAl9CiAKIAlxcF9jb250ZXh0LT5wYXJhbXMyIHw9IGNwdV90b19iZTMyKE1USENBX1FQX0JJVF9SU0MpOwpAQCAtODM1LDcgKzg3OSw3IEBACiAJfQogCiAJZXJyID0gbXRoY2FfTU9ESUZZX1FQKGRldiwgc3RhdGVfdGFibGVbY3VyX3N0YXRlXVtuZXdfc3RhdGVdLnRyYW5zLAotCQkJICAgICAgcXAtPnFwbiwgMCwgcXBfcGFyYW0sIDAsICZzdGF0dXMpOworCQkJICAgICAgcXAtPnFwbiwgMCwgbWFpbGJveCwgMCwgJnN0YXR1cyk7CiAJaWYgKHN0YXR1cykgewogCQltdGhjYV93YXJuKGRldiwgIm1vZGlmeSBRUCAlZCByZXR1cm5lZCBzdGF0dXMgJTAyeC5cbiIsCiAJCQkgICBzdGF0ZV90YWJsZVtjdXJfc3RhdGVdW25ld19zdGF0ZV0udHJhbnMsIHN0YXR1cyk7CkBAIC04NDUsNyArODg5LDcgQEAKIAlpZiAoIWVycikKIAkJcXAtPnN0YXRlID0gbmV3X3N0YXRlOwogCi0Ja2ZyZWUobWFpbGJveCk7CisJbXRoY2FfZnJlZV9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKIAlpZiAoaXNfc3FwKGRldiwgcXApKQogCQlzdG9yZV9hdHRycyh0b19tc3FwKHFwKSwgYXR0ciwgYXR0cl9tYXNrKTsKQEAgLTkxNyw2ICs5NjEsMTUgQEAKIAogCXFwLT5zZW5kX3dxZV9vZmZzZXQgPSBBTElHTihxcC0+cnEubWF4IDw8IHFwLT5ycS53cWVfc2hpZnQsCiAJCQkJICAgIDEgPDwgcXAtPnNxLndxZV9zaGlmdCk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB1c2Vyc3BhY2UgUVAsIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgdG8KKwkgKiBhbGxvY2F0ZSBhbnl0aGluZy4gIEFsbCB3ZSBuZWVkIGlzIHRvIGNhbGN1bGF0ZSB0aGUgV1FFCisJICogc2l6ZXMgYW5kIHRoZSBzZW5kX3dxZV9vZmZzZXQsIHNvIHdlJ3JlIGRvbmUgbm93LgorCSAqLworCWlmIChwZC0+aWJwZC51b2JqZWN0KQorCQlyZXR1cm4gMDsKKwogCXNpemUgPSBQQUdFX0FMSUdOKHFwLT5zZW5kX3dxZV9vZmZzZXQgKwogCQkJICAocXAtPnNxLm1heCA8PCBxcC0+c3Eud3FlX3NoaWZ0KSk7CiAKQEAgLTkzNCw3ICs5ODcsOCBAQAogCQkJbXRoY2FfZGJnKGRldiwgIkNyZWF0aW5nIGRpcmVjdCBRUCBvZiBzaXplICVkIChzaGlmdCAlZClcbiIsCiAJCQkJICBzaXplLCBzaGlmdCk7CiAKLQkJcXAtPnF1ZXVlLmRpcmVjdC5idWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChkZXYtPnBkZXYsIHNpemUsICZ0KTsKKwkJcXAtPnF1ZXVlLmRpcmVjdC5idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBzaXplLAorCQkJCQkJCSAgJnQsIEdGUF9LRVJORUwpOwogCQlpZiAoIXFwLT5xdWV1ZS5kaXJlY3QuYnVmKQogCQkJZ290byBlcnJfb3V0OwogCkBAIC05NzMsNyArMTAyNyw4IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytpKSB7CiAJCQlxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZiA9Ci0JCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQoZGV2LT5wZGV2LCBQQUdFX1NJWkUsICZ0KTsKKwkJCQlkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkgICAmdCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmKQogCQkJCWdvdG8gZXJyX291dF9mcmVlOwogCkBAIC05OTYsMTYgKzEwNTEsMTUgQEAKIAogIGVycl9vdXRfZnJlZToKIAlpZiAocXAtPmlzX2RpcmVjdCkgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZSwKLQkJCQkgICAgcXAtPnF1ZXVlLmRpcmVjdC5idWYsCi0JCQkJICAgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUuZGlyZWN0LCBtYXBwaW5nKSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc2l6ZSwgcXAtPnF1ZXVlLmRpcmVjdC5idWYsCisJCQkJICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLmRpcmVjdCwgbWFwcGluZykpOwogCX0gZWxzZQogCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKIAkJCWlmIChxcC0+cXVldWUucGFnZV9saXN0W2ldLmJ1ZikKLQkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgUEFHRV9TSVpFLAotCQkJCQkJICAgIHFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAotCQkJCQkJICAgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUucGFnZV9saXN0W2ldLAotCQkJCQkJCQkgICBtYXBwaW5nKSk7CisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBQQUdFX1NJWkUsCisJCQkJCQkgIHFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAorCQkJCQkJICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLnBhZ2VfbGlzdFtpXSwKKwkJCQkJCQkJIG1hcHBpbmcpKTsKIAogCQl9CiAKQEAgLTEwMTUsMTAgKzEwNjksMzIgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG10aGNhX2FsbG9jX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAorc3RhdGljIHZvaWQgbXRoY2FfZnJlZV93cWVfYnVmKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewotCWludCByZXQgPSAwOworCWludCBpOworCWludCBzaXplID0gUEFHRV9BTElHTihxcC0+c2VuZF93cWVfb2Zmc2V0ICsKKwkJCSAgICAgIChxcC0+c3EubWF4IDw8IHFwLT5zcS53cWVfc2hpZnQpKTsKKworCWlmIChxcC0+aXNfZGlyZWN0KSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgc2l6ZSwgcXAtPnF1ZXVlLmRpcmVjdC5idWYsCisJCQkJICBwY2lfdW5tYXBfYWRkcigmcXAtPnF1ZXVlLmRpcmVjdCwgbWFwcGluZykpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplIC8gUEFHRV9TSVpFOyArK2kpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZXYtPnBkZXYtPmRldiwgUEFHRV9TSVpFLAorCQkJCQkgIHFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAorCQkJCQkgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUucGFnZV9saXN0W2ldLAorCQkJCQkJCSBtYXBwaW5nKSk7CisJCX0KKwl9CisKKwlrZnJlZShxcC0+d3JpZCk7Cit9CisKK3N0YXRpYyBpbnQgbXRoY2FfbWFwX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAorCQkJICAgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQoreworCWludCByZXQ7CiAKIAlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CiAJCXJldCA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+cXBfdGFibGUucXBfdGFibGUsIHFwLT5xcG4pOwpAQCAtMTAyOSwzNSArMTEwNSwxNSBAQAogCQlpZiAocmV0KQogCQkJZ290byBlcnJfcXBjOwogCi0JCXJldCA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+cXBfdGFibGUucmRiX3RhYmxlLAotCQkJCSAgICAgIHFwLT5xcG4gPDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfZXFwYzsKKyAJCXJldCA9IG10aGNhX3RhYmxlX2dldChkZXYsIGRldi0+cXBfdGFibGUucmRiX3RhYmxlLAorIAkJCQkgICAgICBxcC0+cXBuIDw8IGRldi0+cXBfdGFibGUucmRiX3NoaWZ0KTsKKyAJCWlmIChyZXQpCisgCQkJZ290byBlcnJfZXFwYzsKIAotCQlxcC0+cnEuZGJfaW5kZXggPSBtdGhjYV9hbGxvY19kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsCi0JCQkJCQkgcXAtPnFwbiwgJnFwLT5ycS5kYik7Ci0JCWlmIChxcC0+cnEuZGJfaW5kZXggPCAwKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfcmRiOwotCQl9Ci0KLQkJcXAtPnNxLmRiX2luZGV4ID0gbXRoY2FfYWxsb2NfZGIoZGV2LCBNVEhDQV9EQl9UWVBFX1NRLAotCQkJCQkJIHFwLT5xcG4sICZxcC0+c3EuZGIpOwotCQlpZiAocXAtPnNxLmRiX2luZGV4IDwgMCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyX3JxX2RiOwotCQl9CiAJfQogCiAJcmV0dXJuIDA7CiAKLWVycl9ycV9kYjoKLQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9SUSwgcXAtPnJxLmRiX2luZGV4KTsKLQotZXJyX3JkYjoKLQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLnJkYl90YWJsZSwKLQkJCXFwLT5xcG4gPDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQpOwotCiBlcnJfZXFwYzoKIAltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLmVxcF90YWJsZSwgcXAtPnFwbik7CiAKQEAgLTEwNjcsMTYgKzExMjMsNDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBtdGhjYV91bm1hcF9tZW1mcmVlKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKKwkJCQlzdHJ1Y3QgbXRoY2FfcXAgKnFwKQoreworCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+cXBfdGFibGUucmRiX3RhYmxlLAorCQkJcXAtPnFwbiA8PCBkZXYtPnFwX3RhYmxlLnJkYl9zaGlmdCk7CisJbXRoY2FfdGFibGVfcHV0KGRldiwgZGV2LT5xcF90YWJsZS5lcXBfdGFibGUsIHFwLT5xcG4pOworCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+cXBfdGFibGUucXBfdGFibGUsIHFwLT5xcG4pOworfQorCitzdGF0aWMgaW50IG10aGNhX2FsbG9jX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBtdGhjYV9xcCAqcXApCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAobXRoY2FfaXNfbWVtZnJlZShkZXYpKSB7CisJCXFwLT5ycS5kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9SUSwKKwkJCQkJCSBxcC0+cXBuLCAmcXAtPnJxLmRiKTsKKwkJaWYgKHFwLT5ycS5kYl9pbmRleCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXFwLT5zcS5kYl9pbmRleCA9IG10aGNhX2FsbG9jX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9TUSwKKwkJCQkJCSBxcC0+cXBuLCAmcXAtPnNxLmRiKTsKKwkJaWYgKHFwLT5zcS5kYl9pbmRleCA8IDApCisJCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9SUSwgcXAtPnJxLmRiX2luZGV4KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBtdGhjYV9mcmVlX21lbWZyZWUoc3RydWN0IG10aGNhX2RldiAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBtdGhjYV9xcCAqcXApCiB7CiAJaWYgKG10aGNhX2lzX21lbWZyZWUoZGV2KSkgewogCQltdGhjYV9mcmVlX2RiKGRldiwgTVRIQ0FfREJfVFlQRV9TUSwgcXAtPnNxLmRiX2luZGV4KTsKIAkJbXRoY2FfZnJlZV9kYihkZXYsIE1USENBX0RCX1RZUEVfUlEsIHFwLT5ycS5kYl9pbmRleCk7Ci0JCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+cXBfdGFibGUucmRiX3RhYmxlLAotCQkJCXFwLT5xcG4gPDwgZGV2LT5xcF90YWJsZS5yZGJfc2hpZnQpOwotCQltdGhjYV90YWJsZV9wdXQoZGV2LCBkZXYtPnFwX3RhYmxlLmVxcF90YWJsZSwgcXAtPnFwbik7Ci0JCW10aGNhX3RhYmxlX3B1dChkZXYsIGRldi0+cXBfdGFibGUucXBfdGFibGUsIHFwLT5xcG4pOwogCX0KIH0KIApAQCAtMTEwOCwxMyArMTE4OSwyOCBAQAogCW10aGNhX3dxX2luaXQoJnFwLT5zcSk7CiAJbXRoY2Ffd3FfaW5pdCgmcXAtPnJxKTsKIAotCXJldCA9IG10aGNhX2FsbG9jX21lbWZyZWUoZGV2LCBxcCk7CisJcmV0ID0gbXRoY2FfbWFwX21lbWZyZWUoZGV2LCBxcCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IG10aGNhX2FsbG9jX3dxZV9idWYoZGV2LCBwZCwgcXApOwogCWlmIChyZXQpIHsKLQkJbXRoY2FfZnJlZV9tZW1mcmVlKGRldiwgcXApOworCQltdGhjYV91bm1hcF9tZW1mcmVlKGRldiwgcXApOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIHVzZXJzcGFjZSBRUCwgd2UncmUgZG9uZSBub3cuICBUaGUgZG9vcmJlbGxzCisJICogd2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGJ1ZmZlcnMgd2lsbCBiZSBpbml0aWFsaXplZCBpbgorCSAqIHVzZXJzcGFjZS4KKwkgKi8KKwlpZiAocGQtPmlicGQudW9iamVjdCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBtdGhjYV9hbGxvY19tZW1mcmVlKGRldiwgcXApOworCWlmIChyZXQpIHsKKwkJbXRoY2FfZnJlZV93cWVfYnVmKGRldiwgcXApOworCQltdGhjYV91bm1hcF9tZW1mcmVlKGRldiwgcXApOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTE0NywyMiArMTI0MywzOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtdGhjYV9hbGlnbl9xcF9zaXplKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwgc3RydWN0IG10aGNhX3FwICpxcCkKK3N0YXRpYyBpbnQgbXRoY2Ffc2V0X3FwX3NpemUoc3RydWN0IG10aGNhX2RldiAqZGV2LCBzdHJ1Y3QgaWJfcXBfY2FwICpjYXAsCisJCQkgICAgIHN0cnVjdCBtdGhjYV9xcCAqcXApCiB7Ci0JaW50IGk7CisJLyogU2FuaXR5IGNoZWNrIFFQIHNpemUgYmVmb3JlIHByb2NlZWRpbmcgKi8KKwlpZiAoY2FwLT5tYXhfc2VuZF93ciAgPiA2NTUzNiB8fCBjYXAtPm1heF9yZWN2X3dyICA+IDY1NTM2IHx8CisJICAgIGNhcC0+bWF4X3NlbmRfc2dlID4gNjQgICAgfHwgY2FwLT5tYXhfcmVjdl9zZ2UgPiA2NCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIW10aGNhX2lzX21lbWZyZWUoZGV2KSkKLQkJcmV0dXJuOworCWlmIChtdGhjYV9pc19tZW1mcmVlKGRldikpIHsKKwkJcXAtPnJxLm1heCA9IGNhcC0+bWF4X3JlY3Zfd3IgPworCQkJcm91bmR1cF9wb3dfb2ZfdHdvKGNhcC0+bWF4X3JlY3Zfd3IpIDogMDsKKwkJcXAtPnNxLm1heCA9IGNhcC0+bWF4X3NlbmRfd3IgPworCQkJcm91bmR1cF9wb3dfb2ZfdHdvKGNhcC0+bWF4X3NlbmRfd3IpIDogMDsKKwl9IGVsc2UgeworCQlxcC0+cnEubWF4ID0gY2FwLT5tYXhfcmVjdl93cjsKKwkJcXAtPnNxLm1heCA9IGNhcC0+bWF4X3NlbmRfd3I7CisJfQogCi0JZm9yIChpID0gMDsgMSA8PCBpIDwgcXAtPnJxLm1heDsgKytpKQotCQk7IC8qIG5vdGhpbmcgKi8KKwlxcC0+cnEubWF4X2dzID0gY2FwLT5tYXhfcmVjdl9zZ2U7CisJcXAtPnNxLm1heF9ncyA9IG1heF90KGludCwgY2FwLT5tYXhfc2VuZF9zZ2UsCisJCQkgICAgICBBTElHTihjYXAtPm1heF9pbmxpbmVfZGF0YSArIE1USENBX0lOTElORV9IRUFERVJfU0laRSwKKwkJCQkgICAgTVRIQ0FfSU5MSU5FX0NIVU5LX1NJWkUpIC8KKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IG10aGNhX2RhdGFfc2VnKSk7CiAKLQlxcC0+cnEubWF4ID0gMSA8PCBpOworCS8qCisJICogRm9yIE1MWCB0cmFuc3BvcnQgd2UgbmVlZCAyIGV4dHJhIFMvRyBlbnRyaWVzOgorCSAqIG9uZSBmb3IgdGhlIGhlYWRlciBhbmQgb25lIGZvciB0aGUgY2hlY2tzdW0gYXQgdGhlIGVuZAorCSAqLworCWlmICgocXAtPnRyYW5zcG9ydCA9PSBNTFggJiYgcXAtPnNxLm1heF9ncyArIDIgPiBkZXYtPmxpbWl0cy5tYXhfc2cpIHx8CisJICAgIHFwLT5zcS5tYXhfZ3MgPiBkZXYtPmxpbWl0cy5tYXhfc2cgfHwgcXAtPnJxLm1heF9ncyA+IGRldi0+bGltaXRzLm1heF9zZykKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKGkgPSAwOyAxIDw8IGkgPCBxcC0+c3EubWF4OyArK2kpCi0JCTsgLyogbm90aGluZyAqLwotCi0JcXAtPnNxLm1heCA9IDEgPDwgaTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IG10aGNhX2FsbG9jX3FwKHN0cnVjdCBtdGhjYV9kZXYgKmRldiwKQEAgLTExNzEsMTEgKzEyODQsMTQgQEAKIAkJICAgc3RydWN0IG10aGNhX2NxICpyZWN2X2NxLAogCQkgICBlbnVtIGliX3FwX3R5cGUgdHlwZSwKIAkJICAgZW51bSBpYl9zaWdfdHlwZSBzZW5kX3BvbGljeSwKKwkJICAgc3RydWN0IGliX3FwX2NhcCAqY2FwLAogCQkgICBzdHJ1Y3QgbXRoY2FfcXAgKnFwKQogewogCWludCBlcnI7CiAKLQltdGhjYV9hbGlnbl9xcF9zaXplKGRldiwgcXApOworCWVyciA9IG10aGNhX3NldF9xcF9zaXplKGRldiwgY2FwLCBxcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgSUJfUVBUX1JDOiBxcC0+dHJhbnNwb3J0ID0gUkM7IGJyZWFrOwpAQCAtMTIwOCwxNCArMTMyNCwxNyBAQAogCQkgICAgc3RydWN0IG10aGNhX2NxICpzZW5kX2NxLAogCQkgICAgc3RydWN0IG10aGNhX2NxICpyZWN2X2NxLAogCQkgICAgZW51bSBpYl9zaWdfdHlwZSBzZW5kX3BvbGljeSwKKwkJICAgIHN0cnVjdCBpYl9xcF9jYXAgKmNhcCwKIAkJICAgIGludCBxcG4sCiAJCSAgICBpbnQgcG9ydCwKIAkJICAgIHN0cnVjdCBtdGhjYV9zcXAgKnNxcCkKIHsKLQlpbnQgZXJyID0gMDsKIAl1MzIgbXFwbiA9IHFwbiAqIDIgKyBkZXYtPnFwX3RhYmxlLnNxcF9zdGFydCArIHBvcnQgLSAxOworCWludCBlcnI7CiAKLQltdGhjYV9hbGlnbl9xcF9zaXplKGRldiwgJnNxcC0+cXApOworCWVyciA9IG10aGNhX3NldF9xcF9zaXplKGRldiwgY2FwLCAmc3FwLT5xcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXNxcC0+aGVhZGVyX2J1Zl9zaXplID0gc3FwLT5xcC5zcS5tYXggKiBNVEhDQV9VRF9IRUFERVJfU0laRTsKIAlzcXAtPmhlYWRlcl9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmRldi0+cGRldi0+ZGV2LCBzcXAtPmhlYWRlcl9idWZfc2l6ZSwKQEAgLTEyNzQsOCArMTM5Myw2IEBACiAJCSAgIHN0cnVjdCBtdGhjYV9xcCAqcXApCiB7CiAJdTggc3RhdHVzOwotCWludCBzaXplOwotCWludCBpOwogCXN0cnVjdCBtdGhjYV9jcSAqc2VuZF9jcTsKIAlzdHJ1Y3QgbXRoY2FfY3EgKnJlY3ZfY3E7CiAKQEAgLTEzMDUsMzEgKzE0MjIsMjIgQEAKIAlpZiAocXAtPnN0YXRlICE9IElCX1FQU19SRVNFVCkKIAkJbXRoY2FfTU9ESUZZX1FQKGRldiwgTVRIQ0FfVFJBTlNfQU5ZMlJTVCwgcXAtPnFwbiwgMCwgTlVMTCwgMCwgJnN0YXR1cyk7CiAKLQltdGhjYV9jcV9jbGVhbihkZXYsIHRvX21jcShxcC0+aWJxcC5zZW5kX2NxKS0+Y3FuLCBxcC0+cXBuKTsKLQlpZiAocXAtPmlicXAuc2VuZF9jcSAhPSBxcC0+aWJxcC5yZWN2X2NxKQotCQltdGhjYV9jcV9jbGVhbihkZXYsIHRvX21jcShxcC0+aWJxcC5yZWN2X2NxKS0+Y3FuLCBxcC0+cXBuKTsKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB1c2Vyc3BhY2UgUVAsIHRoZSBidWZmZXJzLCBNUiwgQ1FzIGFuZCBzbyBvbgorCSAqIHdpbGwgYmUgY2xlYW5lZCB1cCBpbiB1c2Vyc3BhY2UsIHNvIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisJICogdW5yZWYgdGhlIG1lbS1mcmVlIHRhYmxlcyBhbmQgZnJlZSB0aGUgUVBOIGluIG91ciB0YWJsZS4KKwkgKi8KKwlpZiAoIXFwLT5pYnFwLnVvYmplY3QpIHsKKwkJbXRoY2FfY3FfY2xlYW4oZGV2LCB0b19tY3EocXAtPmlicXAuc2VuZF9jcSktPmNxbiwgcXAtPnFwbik7CisJCWlmIChxcC0+aWJxcC5zZW5kX2NxICE9IHFwLT5pYnFwLnJlY3ZfY3EpCisJCQltdGhjYV9jcV9jbGVhbihkZXYsIHRvX21jcShxcC0+aWJxcC5yZWN2X2NxKS0+Y3FuLCBxcC0+cXBuKTsKIAotCW10aGNhX2ZyZWVfbXIoZGV2LCAmcXAtPm1yKTsKLQotCXNpemUgPSBQQUdFX0FMSUdOKHFwLT5zZW5kX3dxZV9vZmZzZXQgKwotCQkJICAocXAtPnNxLm1heCA8PCBxcC0+c3Eud3FlX3NoaWZ0KSk7Ci0KLQlpZiAocXAtPmlzX2RpcmVjdCkgewotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGRldi0+cGRldiwgc2l6ZSwKLQkJCQkgICAgcXAtPnF1ZXVlLmRpcmVjdC5idWYsCi0JCQkJICAgIHBjaV91bm1hcF9hZGRyKCZxcC0+cXVldWUuZGlyZWN0LCBtYXBwaW5nKSk7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IHNpemUgLyBQQUdFX1NJWkU7ICsraSkgewotCQkJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYtPnBkZXYsIFBBR0VfU0laRSwKLQkJCQkJICAgIHFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0uYnVmLAotCQkJCQkgICAgcGNpX3VubWFwX2FkZHIoJnFwLT5xdWV1ZS5wYWdlX2xpc3RbaV0sCi0JCQkJCQkJICAgbWFwcGluZykpOwotCQl9CisJCW10aGNhX2ZyZWVfbXIoZGV2LCAmcXAtPm1yKTsKKwkJbXRoY2FfZnJlZV9tZW1mcmVlKGRldiwgcXApOworCQltdGhjYV9mcmVlX3dxZV9idWYoZGV2LCBxcCk7CiAJfQogCi0Ja2ZyZWUocXAtPndyaWQpOwotCi0JbXRoY2FfZnJlZV9tZW1mcmVlKGRldiwgcXApOworCW10aGNhX3VubWFwX21lbWZyZWUoZGV2LCBxcCk7CiAKIAlpZiAoaXNfc3FwKGRldiwgcXApKSB7CiAJCWF0b21pY19kZWMoJih0b19tcGQocXAtPmlicXAucGQpLT5zcXBfY291bnQpKTsKQEAgLTE1MjksNiArMTYzNywyNiBAQAogCiAJCQlicmVhazsKIAorCQljYXNlIFVDOgorCQkJc3dpdGNoICh3ci0+b3Bjb2RlKSB7CisJCQljYXNlIElCX1dSX1JETUFfV1JJVEU6CisJCQljYXNlIElCX1dSX1JETUFfV1JJVEVfV0lUSF9JTU06CisJCQkJKChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnICopIHdxZSktPnJhZGRyID0KKwkJCQkJY3B1X3RvX2JlNjQod3ItPndyLnJkbWEucmVtb3RlX2FkZHIpOworCQkJCSgoc3RydWN0IG10aGNhX3JhZGRyX3NlZyAqKSB3cWUpLT5ya2V5ID0KKwkJCQkJY3B1X3RvX2JlMzIod3ItPndyLnJkbWEucmtleSk7CisJCQkJKChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnICopIHdxZSktPnJlc2VydmVkID0gMDsKKwkJCQl3cWUgKz0gc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnKTsKKwkJCQlzaXplICs9IHNpemVvZiAoc3RydWN0IG10aGNhX3JhZGRyX3NlZykgLyAxNjsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBObyBleHRyYSBzZWdtZW50cyByZXF1aXJlZCBmb3Igc2VuZHMgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisKIAkJY2FzZSBVRDoKIAkJCSgoc3RydWN0IG10aGNhX3Rhdm9yX3VkX3NlZyAqKSB3cWUpLT5sa2V5ID0KIAkJCQljcHVfdG9fYmUzMih0b19tYWgod3ItPndyLnVkLmFoKS0+a2V5KTsKQEAgLTE4MTQsOSArMTk0MiwyOSBAQAogCQkJCQlzaXplb2YgKHN0cnVjdCBtdGhjYV9hdG9taWNfc2VnKTsKIAkJCQlicmVhazsKIAorCQkJY2FzZSBJQl9XUl9SRE1BX1JFQUQ6CiAJCQljYXNlIElCX1dSX1JETUFfV1JJVEU6CiAJCQljYXNlIElCX1dSX1JETUFfV1JJVEVfV0lUSF9JTU06Ci0JCQljYXNlIElCX1dSX1JETUFfUkVBRDoKKwkJCQkoKHN0cnVjdCBtdGhjYV9yYWRkcl9zZWcgKikgd3FlKS0+cmFkZHIgPQorCQkJCQljcHVfdG9fYmU2NCh3ci0+d3IucmRtYS5yZW1vdGVfYWRkcik7CisJCQkJKChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnICopIHdxZSktPnJrZXkgPQorCQkJCQljcHVfdG9fYmUzMih3ci0+d3IucmRtYS5ya2V5KTsKKwkJCQkoKHN0cnVjdCBtdGhjYV9yYWRkcl9zZWcgKikgd3FlKS0+cmVzZXJ2ZWQgPSAwOworCQkJCXdxZSArPSBzaXplb2YgKHN0cnVjdCBtdGhjYV9yYWRkcl9zZWcpOworCQkJCXNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnKSAvIDE2OworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qIE5vIGV4dHJhIHNlZ21lbnRzIHJlcXVpcmVkIGZvciBzZW5kcyAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFVDOgorCQkJc3dpdGNoICh3ci0+b3Bjb2RlKSB7CisJCQljYXNlIElCX1dSX1JETUFfV1JJVEU6CisJCQljYXNlIElCX1dSX1JETUFfV1JJVEVfV0lUSF9JTU06CiAJCQkJKChzdHJ1Y3QgbXRoY2FfcmFkZHJfc2VnICopIHdxZSktPnJhZGRyID0KIAkJCQkJY3B1X3RvX2JlNjQod3ItPndyLnJkbWEucmVtb3RlX2FkZHIpOwogCQkJCSgoc3RydWN0IG10aGNhX3JhZGRyX3NlZyAqKSB3cWUpLT5ya2V5ID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tdGhjYS9tdGhjYV91c2VyLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjRjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbXRoY2EvbXRoY2FfdXNlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBNVEhDQV9VU0VSX0gKKyNkZWZpbmUgTVRIQ0FfVVNFUl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKgorICogTWFrZSBzdXJlIHRoYXQgYWxsIHN0cnVjdHMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgcmVtYWluIGxhaWQgb3V0IHNvCisgKiB0aGF0IHRoZXkgcGFjayB0aGUgc2FtZSB3YXkgb24gMzItYml0IGFuZCA2NC1iaXQgYXJjaGl0ZWN0dXJlcyAodG8KKyAqIGF2b2lkIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIDMyLWJpdCB1c2Vyc3BhY2UgYW5kIDY0LWJpdCBrZXJuZWxzKS4KKyAqIEluIHBhcnRpY3VsYXIgZG8gbm90IHVzZSBwb2ludGVyIHR5cGVzIC0tIHBhc3MgcG9pbnRlcnMgaW4gX191NjQKKyAqIGluc3RlYWQuCisgKi8KKworc3RydWN0IG10aGNhX2FsbG9jX3Vjb250ZXh0X3Jlc3AgeworCV9fdTMyIHFwX3RhYl9zaXplOworCV9fdTMyIHVhcmNfc2l6ZTsKK307CisKK3N0cnVjdCBtdGhjYV9hbGxvY19wZF9yZXNwIHsKKwlfX3UzMiBwZG47CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgbXRoY2FfY3JlYXRlX2NxIHsKKwlfX3UzMiBsa2V5OworCV9fdTMyIHBkbjsKKwlfX3U2NCBhcm1fZGJfcGFnZTsKKwlfX3U2NCBzZXRfZGJfcGFnZTsKKwlfX3UzMiBhcm1fZGJfaW5kZXg7CisJX191MzIgc2V0X2RiX2luZGV4OworfTsKKworc3RydWN0IG10aGNhX2NyZWF0ZV9jcV9yZXNwIHsKKwlfX3UzMiBjcW47CisJX191MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgbXRoY2FfY3JlYXRlX3FwIHsKKwlfX3UzMiBsa2V5OworCV9fdTMyIHJlc2VydmVkOworCV9fdTY0IHNxX2RiX3BhZ2U7CisJX191NjQgcnFfZGJfcGFnZTsKKwlfX3UzMiBzcV9kYl9pbmRleDsKKwlfX3UzMiBycV9kYl9pbmRleDsKK307CisKKyNlbmRpZiAvKiBNVEhDQV9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3VzZXJfdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3VzZXJfdmVyYnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzYxMzcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfdXNlcl92ZXJicy5oCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1IENpc2NvIFN5c3RlbXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogJElkOiBpYl91c2VyX3ZlcmJzLmggMjcwOCAyMDA1LTA2LTI0IDE3OjI3OjIxWiByb2xhbmQgJAorICovCisKKyNpZm5kZWYgSUJfVVNFUl9WRVJCU19ICisjZGVmaW5lIElCX1VTRVJfVkVSQlNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIEluY3JlbWVudCB0aGlzIHZhbHVlIGlmIGFueSBjaGFuZ2VzIHRoYXQgYnJlYWsgdXNlcnNwYWNlIEFCSQorICogY29tcGF0aWJpbGl0eSBhcmUgbWFkZS4KKyAqLworI2RlZmluZSBJQl9VU0VSX1ZFUkJTX0FCSV9WRVJTSU9OCTEKKworZW51bSB7CisJSUJfVVNFUl9WRVJCU19DTURfUVVFUllfUEFSQU1TLAorCUlCX1VTRVJfVkVSQlNfQ01EX0dFVF9DT05URVhULAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX0RFVklDRSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QT1JULAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX0dJRCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9QS0VZLAorCUlCX1VTRVJfVkVSQlNfQ01EX0FMTE9DX1BELAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFQUxMT0NfUEQsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX0FILAorCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9RVUVSWV9BSCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX0FILAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFR19NUiwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9SRUdfU01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFUkVHX01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFUkVHX01SLAorCUlCX1VTRVJfVkVSQlNfQ01EX0FMTE9DX01XLAorCUlCX1VTRVJfVkVSQlNfQ01EX0JJTkRfTVcsCisJSUJfVVNFUl9WRVJCU19DTURfREVBTExPQ19NVywKKwlJQl9VU0VSX1ZFUkJTX0NNRF9DUkVBVEVfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUkVTSVpFX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFU1RST1lfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfUE9MTF9DUSwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QRUVLX0NRLAorCUlCX1VTRVJfVkVSQlNfQ01EX1JFUV9OT1RJRllfQ1EsCisJSUJfVVNFUl9WRVJCU19DTURfQ1JFQVRFX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX1FVRVJZX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX01PRElGWV9RUCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9ERVNUUk9ZX1FQLAorCUlCX1VTRVJfVkVSQlNfQ01EX1BPU1RfU0VORCwKKwlJQl9VU0VSX1ZFUkJTX0NNRF9QT1NUX1JFQ1YsCisJSUJfVVNFUl9WRVJCU19DTURfQVRUQUNIX01DQVNULAorCUlCX1VTRVJfVkVSQlNfQ01EX0RFVEFDSF9NQ0FTVAorfTsKKworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBzdHJ1Y3RzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHJlbWFpbiBsYWlkIG91dCBzbworICogdGhhdCB0aGV5IHBhY2sgdGhlIHNhbWUgd2F5IG9uIDMyLWJpdCBhbmQgNjQtYml0IGFyY2hpdGVjdHVyZXMgKHRvCisgKiBhdm9pZCBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiAzMi1iaXQgdXNlcnNwYWNlIGFuZCA2NC1iaXQga2VybmVscykuCisgKiBJbiBwYXJ0aWN1bGFyIGRvIG5vdCB1c2UgcG9pbnRlciB0eXBlcyAtLSBwYXNzIHBvaW50ZXJzIGluIF9fdTY0CisgKiBpbnN0ZWFkLgorICovCisKK3N0cnVjdCBpYl91dmVyYnNfYXN5bmNfZXZlbnRfZGVzYyB7CisJX191NjQgZWxlbWVudDsKKwlfX3UzMiBldmVudF90eXBlOwkvKiBlbnVtIGliX2V2ZW50X3R5cGUgKi8KKwlfX3UzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfY29tcF9ldmVudF9kZXNjIHsKKwlfX3U2NCBjcV9oYW5kbGU7Cit9OworCisvKgorICogQWxsIGNvbW1hbmRzIGZyb20gdXNlcnNwYWNlIHNob3VsZCBzdGFydCB3aXRoIGEgX191MzIgY29tbWFuZCBmaWVsZAorICogZm9sbG93ZWQgYnkgX191MTYgaW5fd29yZHMgYW5kIG91dF93b3JkcyBmaWVsZHMgKHdoaWNoIGdpdmUgdGhlCisgKiBsZW5ndGggb2YgdGhlIGNvbW1hbmQgYmxvY2sgYW5kIHJlc3BvbnNlIGJ1ZmZlciBpZiBhbnkgaW4gMzItYml0CisgKiB3b3JkcykuICBUaGUga2VybmVsIGRyaXZlciB3aWxsIHJlYWQgdGhlc2UgZmllbGRzIGZpcnN0IGFuZCByZWFkCisgKiB0aGUgcmVzdCBvZiB0aGUgY29tbWFuZCBzdHJ1Y3QgYmFzZWQgb24gdGhlc2UgdmFsdWUuCisgKi8KKworc3RydWN0IGliX3V2ZXJic19jbWRfaGRyIHsKKwlfX3UzMiBjb21tYW5kOworCV9fdTE2IGluX3dvcmRzOworCV9fdTE2IG91dF93b3JkczsKK307CisKKy8qCisgKiBObyBkcml2ZXJfZGF0YSBmb3IgInF1ZXJ5IHBhcmFtcyIgY29tbWFuZCwgc2luY2UgdGhpcyBpcyBpbnRlbmRlZAorICogdG8gYmUgYSBjb3JlIGZ1bmN0aW9uIHdpdGggbm8gcG9zc2libGUgZGV2aWNlIGRlcGVuZGVuY2UuCisgKi8KK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcGFyYW1zIHsKKwlfX3U2NCByZXNwb25zZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcGFyYW1zX3Jlc3AgeworCV9fdTMyIG51bV9jcV9ldmVudHM7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2dldF9jb250ZXh0IHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBjcV9mZF90YWI7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2dldF9jb250ZXh0X3Jlc3AgeworCV9fdTMyIGFzeW5jX2ZkOworCV9fdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9kZXZpY2UgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9kZXZpY2VfcmVzcCB7CisJX191NjQgZndfdmVyOworCV9fdTY0IG5vZGVfZ3VpZDsKKwlfX3U2NCBzeXNfaW1hZ2VfZ3VpZDsKKwlfX3U2NCBtYXhfbXJfc2l6ZTsKKwlfX3U2NCBwYWdlX3NpemVfY2FwOworCV9fdTMyIHZlbmRvcl9pZDsKKwlfX3UzMiB2ZW5kb3JfcGFydF9pZDsKKwlfX3UzMiBod192ZXI7CisJX191MzIgbWF4X3FwOworCV9fdTMyIG1heF9xcF93cjsKKwlfX3UzMiBkZXZpY2VfY2FwX2ZsYWdzOworCV9fdTMyIG1heF9zZ2U7CisJX191MzIgbWF4X3NnZV9yZDsKKwlfX3UzMiBtYXhfY3E7CisJX191MzIgbWF4X2NxZTsKKwlfX3UzMiBtYXhfbXI7CisJX191MzIgbWF4X3BkOworCV9fdTMyIG1heF9xcF9yZF9hdG9tOworCV9fdTMyIG1heF9lZV9yZF9hdG9tOworCV9fdTMyIG1heF9yZXNfcmRfYXRvbTsKKwlfX3UzMiBtYXhfcXBfaW5pdF9yZF9hdG9tOworCV9fdTMyIG1heF9lZV9pbml0X3JkX2F0b207CisJX191MzIgYXRvbWljX2NhcDsKKwlfX3UzMiBtYXhfZWU7CisJX191MzIgbWF4X3JkZDsKKwlfX3UzMiBtYXhfbXc7CisJX191MzIgbWF4X3Jhd19pcHY2X3FwOworCV9fdTMyIG1heF9yYXdfZXRoeV9xcDsKKwlfX3UzMiBtYXhfbWNhc3RfZ3JwOworCV9fdTMyIG1heF9tY2FzdF9xcF9hdHRhY2g7CisJX191MzIgbWF4X3RvdGFsX21jYXN0X3FwX2F0dGFjaDsKKwlfX3UzMiBtYXhfYWg7CisJX191MzIgbWF4X2ZtcjsKKwlfX3UzMiBtYXhfbWFwX3Blcl9mbXI7CisJX191MzIgbWF4X3NycTsKKwlfX3UzMiBtYXhfc3JxX3dyOworCV9fdTMyIG1heF9zcnFfc2dlOworCV9fdTE2IG1heF9wa2V5czsKKwlfX3U4ICBsb2NhbF9jYV9hY2tfZGVsYXk7CisJX191OCAgcGh5c19wb3J0X2NudDsKKwlfX3U4ICByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcG9ydCB7CisJX191NjQgcmVzcG9uc2U7CisJX191OCAgcG9ydF9udW07CisJX191OCAgcmVzZXJ2ZWRbN107CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BvcnRfcmVzcCB7CisJX191MzIgcG9ydF9jYXBfZmxhZ3M7CisJX191MzIgbWF4X21zZ19zejsKKwlfX3UzMiBiYWRfcGtleV9jbnRyOworCV9fdTMyIHFrZXlfdmlvbF9jbnRyOworCV9fdTMyIGdpZF90YmxfbGVuOworCV9fdTE2IHBrZXlfdGJsX2xlbjsKKwlfX3UxNiBsaWQ7CisJX191MTYgc21fbGlkOworCV9fdTggIHN0YXRlOworCV9fdTggIG1heF9tdHU7CisJX191OCAgYWN0aXZlX210dTsKKwlfX3U4ICBsbWM7CisJX191OCAgbWF4X3ZsX251bTsKKwlfX3U4ICBzbV9zbDsKKwlfX3U4ICBzdWJuZXRfdGltZW91dDsKKwlfX3U4ICBpbml0X3R5cGVfcmVwbHk7CisJX191OCAgYWN0aXZlX3dpZHRoOworCV9fdTggIGFjdGl2ZV9zcGVlZDsKKwlfX3U4ICBwaHlzX3N0YXRlOworCV9fdTggIHJlc2VydmVkWzNdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9naWQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTggIHBvcnRfbnVtOworCV9fdTggIGluZGV4OworCV9fdTggIHJlc2VydmVkWzZdOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19xdWVyeV9naWRfcmVzcCB7CisJX191OCAgZ2lkWzE2XTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcXVlcnlfcGtleSB7CisJX191NjQgcmVzcG9uc2U7CisJX191OCAgcG9ydF9udW07CisJX191OCAgaW5kZXg7CisJX191OCAgcmVzZXJ2ZWRbNl07CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3F1ZXJ5X3BrZXlfcmVzcCB7CisJX191MTYgcGtleTsKKwlfX3UxNiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfYWxsb2NfcGQgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19hbGxvY19wZF9yZXNwIHsKKwlfX3UzMiBwZF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2RlYWxsb2NfcGQgeworCV9fdTMyIHBkX2hhbmRsZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfcmVnX21yIHsKKwlfX3U2NCByZXNwb25zZTsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBsZW5ndGg7CisJX191NjQgaGNhX3ZhOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBhY2Nlc3NfZmxhZ3M7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX3JlZ19tcl9yZXNwIHsKKwlfX3UzMiBtcl9oYW5kbGU7CisJX191MzIgbGtleTsKKwlfX3UzMiBya2V5OworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXJlZ19tciB7CisJX191MzIgbXJfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3EgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIGNxZTsKKwlfX3UzMiBldmVudF9oYW5kbGVyOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfY3FfcmVzcCB7CisJX191MzIgY3FfaGFuZGxlOworCV9fdTMyIGNxZTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGVzdHJveV9jcSB7CisJX191MzIgY3FfaGFuZGxlOworfTsKKworc3RydWN0IGliX3V2ZXJic19jcmVhdGVfcXAgeworCV9fdTY0IHJlc3BvbnNlOworCV9fdTY0IHVzZXJfaGFuZGxlOworCV9fdTMyIHBkX2hhbmRsZTsKKwlfX3UzMiBzZW5kX2NxX2hhbmRsZTsKKwlfX3UzMiByZWN2X2NxX2hhbmRsZTsKKwlfX3UzMiBzcnFfaGFuZGxlOworCV9fdTMyIG1heF9zZW5kX3dyOworCV9fdTMyIG1heF9yZWN2X3dyOworCV9fdTMyIG1heF9zZW5kX3NnZTsKKwlfX3UzMiBtYXhfcmVjdl9zZ2U7CisJX191MzIgbWF4X2lubGluZV9kYXRhOworCV9fdTggIHNxX3NpZ19hbGw7CisJX191OCAgcXBfdHlwZTsKKwlfX3U4ICBpc19zcnE7CisJX191OCAgcmVzZXJ2ZWQ7CisJX191NjQgZHJpdmVyX2RhdGFbMF07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2NyZWF0ZV9xcF9yZXNwIHsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MzIgcXBuOworfTsKKworLyoKKyAqIFRoaXMgc3RydWN0IG5lZWRzIHRvIHJlbWFpbiBhIG11bHRpcGxlIG9mIDggYnl0ZXMgdG8ga2VlcCB0aGUKKyAqIGFsaWdubWVudCBvZiB0aGUgbW9kaWZ5IFFQIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBpYl91dmVyYnNfcXBfZGVzdCB7CisJX191OCAgZGdpZFsxNl07CisJX191MzIgZmxvd19sYWJlbDsKKwlfX3UxNiBkbGlkOworCV9fdTE2IHJlc2VydmVkOworCV9fdTggIHNnaWRfaW5kZXg7CisJX191OCAgaG9wX2xpbWl0OworCV9fdTggIHRyYWZmaWNfY2xhc3M7CisJX191OCAgc2w7CisJX191OCAgc3JjX3BhdGhfYml0czsKKwlfX3U4ICBzdGF0aWNfcmF0ZTsKKwlfX3U4ICBpc19nbG9iYWw7CisJX191OCAgcG9ydF9udW07Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX21vZGlmeV9xcCB7CisJc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IGRlc3Q7CisJc3RydWN0IGliX3V2ZXJic19xcF9kZXN0IGFsdF9kZXN0OworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UzMiBhdHRyX21hc2s7CisJX191MzIgcWtleTsKKwlfX3UzMiBycV9wc247CisJX191MzIgc3FfcHNuOworCV9fdTMyIGRlc3RfcXBfbnVtOworCV9fdTMyIHFwX2FjY2Vzc19mbGFnczsKKwlfX3UxNiBwa2V5X2luZGV4OworCV9fdTE2IGFsdF9wa2V5X2luZGV4OworCV9fdTggIHFwX3N0YXRlOworCV9fdTggIGN1cl9xcF9zdGF0ZTsKKwlfX3U4ICBwYXRoX210dTsKKwlfX3U4ICBwYXRoX21pZ19zdGF0ZTsKKwlfX3U4ICBlbl9zcWRfYXN5bmNfbm90aWZ5OworCV9fdTggIG1heF9yZF9hdG9taWM7CisJX191OCAgbWF4X2Rlc3RfcmRfYXRvbWljOworCV9fdTggIG1pbl9ybnJfdGltZXI7CisJX191OCAgcG9ydF9udW07CisJX191OCAgdGltZW91dDsKKwlfX3U4ICByZXRyeV9jbnQ7CisJX191OCAgcm5yX3JldHJ5OworCV9fdTggIGFsdF9wb3J0X251bTsKKwlfX3U4ICBhbHRfdGltZW91dDsKKwlfX3U4ICByZXNlcnZlZFsyXTsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfbW9kaWZ5X3FwX3Jlc3AgeworfTsKKworc3RydWN0IGliX3V2ZXJic19kZXN0cm95X3FwIHsKKwlfX3UzMiBxcF9oYW5kbGU7Cit9OworCitzdHJ1Y3QgaWJfdXZlcmJzX2F0dGFjaF9tY2FzdCB7CisJX191OCAgZ2lkWzE2XTsKKwlfX3UzMiBxcF9oYW5kbGU7CisJX191MTYgbWxpZDsKKwlfX3UxNiByZXNlcnZlZDsKKwlfX3U2NCBkcml2ZXJfZGF0YVswXTsKK307CisKK3N0cnVjdCBpYl91dmVyYnNfZGV0YWNoX21jYXN0IHsKKwlfX3U4ICBnaWRbMTZdOworCV9fdTMyIHFwX2hhbmRsZTsKKwlfX3UxNiBtbGlkOworCV9fdTE2IHJlc2VydmVkOworCV9fdTY0IGRyaXZlcl9kYXRhWzBdOworfTsKKworI2VuZGlmIC8qIElCX1VTRVJfVkVSQlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9pbmNsdWRlL2liX3ZlcmJzLmgKaW5kZXggY2YwMWYwNC4uZTViZDlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2luY2x1ZGUvaWJfdmVyYnMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaW5jbHVkZS9pYl92ZXJicy5oCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBUb3BzcGluIENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoYykgMjAwNCBWb2x0YWlyZSBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQ2lzY28gU3lzdGVtcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTQxLDcgKzQyLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKIHVuaW9uIGliX2dpZCB7CiAJdTgJcmF3WzE2XTsKQEAgLTU0NCw3ICs1NDgsNyBAQAogCWludAkJCW51bV9zZ2U7CiAJZW51bSBpYl93cl9vcGNvZGUJb3Bjb2RlOwogCWludAkJCXNlbmRfZmxhZ3M7Ci0JdTMyCQkJaW1tX2RhdGE7CisJX19iZTMyCQkJaW1tX2RhdGE7CiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJdTY0CXJlbW90ZV9hZGRyOwpAQCAtNjE4LDI5ICs2MjIsODYgQEAKIAl1OAlwYWdlX3NpemU7CiB9OwogCitzdHJ1Y3QgaWJfdWNvbnRleHQgeworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXBkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAltcl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJbXdfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlxcF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJc3JxX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAlhaF9saXN0OworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7Cit9OworCitzdHJ1Y3QgaWJfdW9iamVjdCB7CisJdTY0CQkJdXNlcl9oYW5kbGU7CS8qIGhhbmRsZSBnaXZlbiB0byB1cyBieSB1c2Vyc3BhY2UgKi8KKwlzdHJ1Y3QgaWJfdWNvbnRleHQgICAgICpjb250ZXh0OwkvKiBhc3NvY2lhdGVkIHVzZXIgY29udGV4dCAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJCS8qIGxpbmsgdG8gY29udGV4dCdzIGxpc3QgKi8KKwl1MzIJCQlpZDsJCS8qIGluZGV4IGludG8ga2VybmVsIGlkciAqLworfTsKKworc3RydWN0IGliX3VtZW0geworCXVuc2lnbmVkIGxvbmcJCXVzZXJfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQl2aXJ0X2Jhc2U7CisJc2l6ZV90CQkJbGVuZ3RoOworCWludAkJCW9mZnNldDsKKwlpbnQJCQlwYWdlX3NpemU7CisJaW50ICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU7CisJc3RydWN0IGxpc3RfaGVhZAljaHVua19saXN0OworfTsKKworc3RydWN0IGliX3VtZW1fY2h1bmsgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBuZW50czsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBubWFwOworCXN0cnVjdCBzY2F0dGVybGlzdCAgICAgIHBhZ2VfbGlzdFswXTsKK307CisKK3N0cnVjdCBpYl91ZGF0YSB7CisJdm9pZCBfX3VzZXIgKmluYnVmOworCXZvaWQgX191c2VyICpvdXRidWY7CisJc2l6ZV90ICAgICAgIGlubGVuOworCXNpemVfdCAgICAgICBvdXRsZW47Cit9OworCisjZGVmaW5lIElCX1VNRU1fTUFYX1BBR0VfQ0hVTksJCQkJCQlcCisJKChQQUdFX1NJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgaWJfdW1lbV9jaHVuaywgcGFnZV9saXN0KSkgLwlcCisJICgodm9pZCAqKSAmKChzdHJ1Y3QgaWJfdW1lbV9jaHVuayAqKSAwKS0+cGFnZV9saXN0WzFdIC0JXAorCSAgKHZvaWQgKikgJigoc3RydWN0IGliX3VtZW1fY2h1bmsgKikgMCktPnBhZ2VfbGlzdFswXSkpCisKK3N0cnVjdCBpYl91bWVtX29iamVjdCB7CisJc3RydWN0IGliX3VvYmplY3QJdW9iamVjdDsKKwlzdHJ1Y3QgaWJfdW1lbQkJdW1lbTsKK307CisKIHN0cnVjdCBpYl9wZCB7Ci0Jc3RydWN0IGliX2RldmljZSAqZGV2aWNlOwotCWF0b21pY190ICAgICAgICAgIHVzZWNudDsgLyogY291bnQgYWxsIHJlc291cmNlcyAqLworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICp1b2JqZWN0OworCWF0b21pY190ICAgICAgICAgIAl1c2VjbnQ7IC8qIGNvdW50IGFsbCByZXNvdXJjZXMgKi8KIH07CiAKIHN0cnVjdCBpYl9haCB7CiAJc3RydWN0IGliX2RldmljZQkqZGV2aWNlOwogCXN0cnVjdCBpYl9wZAkJKnBkOworCXN0cnVjdCBpYl91b2JqZWN0CSp1b2JqZWN0OwogfTsKIAogdHlwZWRlZiB2b2lkICgqaWJfY29tcF9oYW5kbGVyKShzdHJ1Y3QgaWJfY3EgKmNxLCB2b2lkICpjcV9jb250ZXh0KTsKIAogc3RydWN0IGliX2NxIHsKLQlzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2U7Ci0JaWJfY29tcF9oYW5kbGVyICAgY29tcF9oYW5kbGVyOwotCXZvaWQgICAgICAgICAgICAgKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgaWJfZXZlbnQgKiwgdm9pZCAqKTsKLQl2b2lkICogICAgICAgICAgICBjcV9jb250ZXh0OwotCWludCAgICAgICAgICAgICAgIGNxZTsKLQlhdG9taWNfdCAgICAgICAgICB1c2VjbnQ7IC8qIGNvdW50IG51bWJlciBvZiB3b3JrIHF1ZXVlcyAqLworCXN0cnVjdCBpYl9kZXZpY2UgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICp1b2JqZWN0OworCWliX2NvbXBfaGFuZGxlciAgIAljb21wX2hhbmRsZXI7CisJdm9pZCAgICAgICAgICAgICAgICAgICgqZXZlbnRfaGFuZGxlcikoc3RydWN0IGliX2V2ZW50ICosIHZvaWQgKik7CisJdm9pZCAqICAgICAgICAgICAgCWNxX2NvbnRleHQ7CisJaW50ICAgICAgICAgICAgICAgCWNxZTsKKwlhdG9taWNfdCAgICAgICAgICAJdXNlY250OyAvKiBjb3VudCBudW1iZXIgb2Ygd29yayBxdWV1ZXMgKi8KIH07CiAKIHN0cnVjdCBpYl9zcnEgewogCXN0cnVjdCBpYl9kZXZpY2UJKmRldmljZTsKKwlzdHJ1Y3QgaWJfdW9iamVjdAkqdW9iamVjdDsKIAlzdHJ1Y3QgaWJfcGQJCSpwZDsKIAl2b2lkCQkJKnNycV9jb250ZXh0OwogCWF0b21pY190CQl1c2VjbnQ7CkBAIC02NTIsNiArNzEzLDcgQEAKIAlzdHJ1Y3QgaWJfY3EJICAgICAgICpzZW5kX2NxOwogCXN0cnVjdCBpYl9jcQkgICAgICAgKnJlY3ZfY3E7CiAJc3RydWN0IGliX3NycQkgICAgICAgKnNycTsKKwlzdHJ1Y3QgaWJfdW9iamVjdCAgICAgICp1b2JqZWN0OwogCXZvaWQgICAgICAgICAgICAgICAgICAoKmV2ZW50X2hhbmRsZXIpKHN0cnVjdCBpYl9ldmVudCAqLCB2b2lkICopOwogCXZvaWQJCSAgICAgICAqcXBfY29udGV4dDsKIAl1MzIJCQlxcF9udW07CkBAIC02NTksMTYgKzcyMSwxOCBAQAogfTsKIAogc3RydWN0IGliX21yIHsKLQlzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2U7Ci0Jc3RydWN0IGliX3BkICAgICAqcGQ7Ci0JdTMyCQkgIGxrZXk7Ci0JdTMyCQkgIHJrZXk7Ci0JYXRvbWljX3QgICAgICAgICAgdXNlY250OyAvKiBjb3VudCBudW1iZXIgb2YgTVdzICovCisJc3RydWN0IGliX2RldmljZSAgKmRldmljZTsKKwlzdHJ1Y3QgaWJfcGQJICAqcGQ7CisJc3RydWN0IGliX3VvYmplY3QgKnVvYmplY3Q7CisJdTMyCQkgICBsa2V5OworCXUzMgkJICAgcmtleTsKKwlhdG9taWNfdAkgICB1c2VjbnQ7IC8qIGNvdW50IG51bWJlciBvZiBNV3MgKi8KIH07CiAKIHN0cnVjdCBpYl9tdyB7CiAJc3RydWN0IGliX2RldmljZQkqZGV2aWNlOwogCXN0cnVjdCBpYl9wZAkJKnBkOworCXN0cnVjdCBpYl91b2JqZWN0CSp1b2JqZWN0OwogCXUzMgkJCXJrZXk7CiB9OwogCkBAIC03MzcsNyArODAxLDE0IEBACiAJaW50CQkgICAgICAgICAgICgqbW9kaWZ5X3BvcnQpKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwKIAkJCQkJCSAgdTggcG9ydF9udW0sIGludCBwb3J0X21vZGlmeV9tYXNrLAogCQkJCQkJICBzdHJ1Y3QgaWJfcG9ydF9tb2RpZnkgKnBvcnRfbW9kaWZ5KTsKLQlzdHJ1Y3QgaWJfcGQgKiAgICAgICAgICAgICAoKmFsbG9jX3BkKShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UpOworCXN0cnVjdCBpYl91Y29udGV4dCAqICAgICAgICgqYWxsb2NfdWNvbnRleHQpKHN0cnVjdCBpYl9kZXZpY2UgKmRldmljZSwKKwkJCQkJCSAgICAgc3RydWN0IGliX3VkYXRhICp1ZGF0YSk7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpkZWFsbG9jX3Vjb250ZXh0KShzdHJ1Y3QgaWJfdWNvbnRleHQgKmNvbnRleHQpOworCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqbW1hcCkoc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisJc3RydWN0IGliX3BkICogICAgICAgICAgICAgKCphbGxvY19wZCkoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLAorCQkJCQkgICAgICAgc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJCQkgICAgICAgc3RydWN0IGliX3VkYXRhICp1ZGF0YSk7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpkZWFsbG9jX3BkKShzdHJ1Y3QgaWJfcGQgKnBkKTsKIAlzdHJ1Y3QgaWJfYWggKiAgICAgICAgICAgICAoKmNyZWF0ZV9haCkoc3RydWN0IGliX3BkICpwZCwKIAkJCQkJCXN0cnVjdCBpYl9haF9hdHRyICphaF9hdHRyKTsKQEAgLTc0Nyw3ICs4MTgsOCBAQAogCQkJCQkgICAgICAgc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHIpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdHJveV9haCkoc3RydWN0IGliX2FoICphaCk7CiAJc3RydWN0IGliX3FwICogICAgICAgICAgICAgKCpjcmVhdGVfcXApKHN0cnVjdCBpYl9wZCAqcGQsCi0JCQkJCQlzdHJ1Y3QgaWJfcXBfaW5pdF9hdHRyICpxcF9pbml0X2F0dHIpOworCQkJCQkJc3RydWN0IGliX3FwX2luaXRfYXR0ciAqcXBfaW5pdF9hdHRyLAorCQkJCQkJc3RydWN0IGliX3VkYXRhICp1ZGF0YSk7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCptb2RpZnlfcXApKHN0cnVjdCBpYl9xcCAqcXAsCiAJCQkJCQlzdHJ1Y3QgaWJfcXBfYXR0ciAqcXBfYXR0ciwKIAkJCQkJCWludCBxcF9hdHRyX21hc2spOwpAQCAtNzYyLDggKzgzNCw5IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpwb3N0X3JlY3YpKHN0cnVjdCBpYl9xcCAqcXAsCiAJCQkJCQlzdHJ1Y3QgaWJfcmVjdl93ciAqcmVjdl93ciwKIAkJCQkJCXN0cnVjdCBpYl9yZWN2X3dyICoqYmFkX3JlY3Zfd3IpOwotCXN0cnVjdCBpYl9jcSAqICAgICAgICAgICAgICgqY3JlYXRlX2NxKShzdHJ1Y3QgaWJfZGV2aWNlICpkZXZpY2UsCi0JCQkJCQlpbnQgY3FlKTsKKwlzdHJ1Y3QgaWJfY3EgKiAgICAgICAgICAgICAoKmNyZWF0ZV9jcSkoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLCBpbnQgY3FlLAorCQkJCQkJc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAorCQkJCQkJc3RydWN0IGliX3VkYXRhICp1ZGF0YSk7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0cm95X2NxKShzdHJ1Y3QgaWJfY3EgKmNxKTsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAoKnJlc2l6ZV9jcSkoc3RydWN0IGliX2NxICpjcSwgaW50ICpjcWUpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqcG9sbF9jcSkoc3RydWN0IGliX2NxICpjcSwgaW50IG51bV9lbnRyaWVzLApAQCAtNzgwLDYgKzg1MywxMCBAQAogCQkJCQkJICBpbnQgbnVtX3BoeXNfYnVmLAogCQkJCQkJICBpbnQgbXJfYWNjZXNzX2ZsYWdzLAogCQkJCQkJICB1NjQgKmlvdmFfc3RhcnQpOworCXN0cnVjdCBpYl9tciAqICAgICAgICAgICAgICgqcmVnX3VzZXJfbXIpKHN0cnVjdCBpYl9wZCAqcGQsCisJCQkJCQkgIHN0cnVjdCBpYl91bWVtICpyZWdpb24sCisJCQkJCQkgIGludCBtcl9hY2Nlc3NfZmxhZ3MsCisJCQkJCQkgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICgqcXVlcnlfbXIpKHN0cnVjdCBpYl9tciAqbXIsCiAJCQkJCSAgICAgICBzdHJ1Y3QgaWJfbXJfYXR0ciAqbXJfYXR0cik7CiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXJlZ19tcikoc3RydWN0IGliX21yICptcik7CkBAIC04MTcsNiArODk0LDcgQEAKIAkJCQkJCSAgc3RydWN0IGliX21hZCAqaW5fbWFkLAogCQkJCQkJICBzdHJ1Y3QgaWJfbWFkICpvdXRfbWFkKTsKIAorCXN0cnVjdCBtb2R1bGUgICAgICAgICAgICAgICAqb3duZXI7CiAJc3RydWN0IGNsYXNzX2RldmljZSAgICAgICAgICBjbGFzc19kZXY7CiAJc3RydWN0IGtvYmplY3QgICAgICAgICAgICAgICBwb3J0c19wYXJlbnQ7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICBwb3J0X2xpc3Q7CkBAIC04NTIsNiArOTMwLDE2IEBACiB2b2lkICBpYl9zZXRfY2xpZW50X2RhdGEoc3RydWN0IGliX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgaWJfY2xpZW50ICpjbGllbnQsCiAJCQkgdm9pZCAqZGF0YSk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGliX2NvcHlfZnJvbV91ZGF0YSh2b2lkICpkZXN0LCBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhLCBzaXplX3QgbGVuKQoreworCXJldHVybiBjb3B5X2Zyb21fdXNlcihkZXN0LCB1ZGF0YS0+aW5idWYsIGxlbikgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaWJfY29weV90b191ZGF0YShzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhLCB2b2lkICpzcmMsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGNvcHlfdG9fdXNlcih1ZGF0YS0+b3V0YnVmLCBzcmMsIGxlbikgPyAtRUZBVUxUIDogMDsKK30KKwogaW50IGliX3JlZ2lzdGVyX2V2ZW50X2hhbmRsZXIgIChzdHJ1Y3QgaWJfZXZlbnRfaGFuZGxlciAqZXZlbnRfaGFuZGxlcik7CiBpbnQgaWJfdW5yZWdpc3Rlcl9ldmVudF9oYW5kbGVyKHN0cnVjdCBpYl9ldmVudF9oYW5kbGVyICpldmVudF9oYW5kbGVyKTsKIHZvaWQgaWJfZGlzcGF0Y2hfZXZlbnQoc3RydWN0IGliX2V2ZW50ICpldmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKaW5kZXggNTU2MjY0Yi4uMzc0ZjQwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9ldmRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAKIHN0cnVjdCBldmRldiB7CiAJaW50IGV4aXN0OwpAQCAtMTQ1LDYgKzE0Niw0MSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCB7CisJc3RydWN0IGNvbXBhdF90aW1ldmFsIHRpbWU7CisJX191MTYgdHlwZTsKKwlfX3UxNiBjb2RlOworCV9fczMyIHZhbHVlOworfTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKyMgIGRlZmluZSBDT01QQVRfVEVTVCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKQorI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKKyMgIGRlZmluZSBDT01QQVRfVEVTVCBJU19JQTMyX1BST0NFU1MoaWE2NF90YXNrX3JlZ3MoY3VycmVudCkpCisjZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX1MzOTApCisjICBkZWZpbmUgQ09NUEFUX1RFU1QgdGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpCisjZWxzZQorIyAgZGVmaW5lIENPTVBBVF9URVNUIHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IGV2ZGV2X3dyaXRlX2NvbXBhdChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXZkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0IGV2ZW50OworCWludCByZXR2YWwgPSAwOworCisJd2hpbGUgKHJldHZhbCA8IGNvdW50KSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZXZlbnQsIGJ1ZmZlciArIHJldHZhbCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpbnB1dF9ldmVudChsaXN0LT5ldmRldi0+aGFuZGxlLmRldiwgZXZlbnQudHlwZSwgZXZlbnQuY29kZSwgZXZlbnQudmFsdWUpOworCQlyZXR2YWwgKz0gc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKwogc3RhdGljIHNzaXplX3QgZXZkZXZfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC0xNTMsNiArMTg5LDExIEBACiAKIAlpZiAoIWxpc3QtPmV2ZGV2LT5leGlzdCkgcmV0dXJuIC1FTk9ERVY7CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJaWYgKENPTVBBVF9URVNUKQorCQlyZXR1cm4gZXZkZXZfd3JpdGVfY29tcGF0KGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MpOworI2VuZGlmCisKIAl3aGlsZSAocmV0dmFsIDwgY291bnQpIHsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoJmV2ZW50LCBidWZmZXIgKyByZXR2YWwsIHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkKQEAgLTE2NCwxMSArMjA1LDU2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBzc2l6ZV90IGV2ZGV2X3JlYWRfY29tcGF0KHN0cnVjdCBmaWxlICogZmlsZSwgY2hhciBfX3VzZXIgKiBidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBldmRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXR2YWw7CisKKwlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxpc3QtPmhlYWQgPT0gbGlzdC0+dGFpbCAmJiBsaXN0LT5ldmRldi0+ZXhpc3QgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUobGlzdC0+ZXZkZXYtPndhaXQsCisJCWxpc3QtPmhlYWQgIT0gbGlzdC0+dGFpbCB8fCAoIWxpc3QtPmV2ZGV2LT5leGlzdCkpOworCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmICghbGlzdC0+ZXZkZXYtPmV4aXN0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlIChsaXN0LT5oZWFkICE9IGxpc3QtPnRhaWwgJiYgcmV0dmFsICsgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQpIDw9IGNvdW50KSB7CisJCXN0cnVjdCBpbnB1dF9ldmVudCAqZXZlbnQgPSAoc3RydWN0IGlucHV0X2V2ZW50ICopIGxpc3QtPmJ1ZmZlciArIGxpc3QtPnRhaWw7CisJCXN0cnVjdCBpbnB1dF9ldmVudF9jb21wYXQgZXZlbnRfY29tcGF0OworCQlldmVudF9jb21wYXQudGltZS50dl9zZWMgPSBldmVudC0+dGltZS50dl9zZWM7CisJCWV2ZW50X2NvbXBhdC50aW1lLnR2X3VzZWMgPSBldmVudC0+dGltZS50dl91c2VjOworCQlldmVudF9jb21wYXQudHlwZSA9IGV2ZW50LT50eXBlOworCQlldmVudF9jb21wYXQuY29kZSA9IGV2ZW50LT5jb2RlOworCQlldmVudF9jb21wYXQudmFsdWUgPSBldmVudC0+dmFsdWU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsICZldmVudF9jb21wYXQsCisJCQlzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50X2NvbXBhdCkpKSByZXR1cm4gLUVGQVVMVDsKKwkJbGlzdC0+dGFpbCA9IChsaXN0LT50YWlsICsgMSkgJiAoRVZERVZfQlVGRkVSX1NJWkUgLSAxKTsKKwkJcmV0dmFsICs9IHNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnRfY29tcGF0KTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKIHN0YXRpYyBzc2l6ZV90IGV2ZGV2X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldHZhbDsKIAorI2lmZGVmIENPTkZJR19DT01QQVQKKwlpZiAoQ09NUEFUX1RFU1QpCisJCXJldHVybiBldmRldl9yZWFkX2NvbXBhdChmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKyNlbmRpZgorCiAJaWYgKGNvdW50IDwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xODYsNyArMjcyLDcgQEAKIAogCXdoaWxlIChsaXN0LT5oZWFkICE9IGxpc3QtPnRhaWwgJiYgcmV0dmFsICsgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkgPD0gY291bnQpIHsKIAkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIgKyByZXR2YWwsIGxpc3QtPmJ1ZmZlciArIGxpc3QtPnRhaWwsCi0JCQkgc2l6ZW9mKHN0cnVjdCBpbnB1dF9ldmVudCkpKSByZXR1cm4gLUVGQVVMVDsKKwkJCXNpemVvZihzdHJ1Y3QgaW5wdXRfZXZlbnQpKSkgcmV0dXJuIC1FRkFVTFQ7CiAJCWxpc3QtPnRhaWwgPSAobGlzdC0+dGFpbCArIDEpICYgKEVWREVWX0JVRkZFUl9TSVpFIC0gMSk7CiAJCXJldHZhbCArPSBzaXplb2Yoc3RydWN0IGlucHV0X2V2ZW50KTsKIAl9CkBAIC0yMDMsNyArMjg5LDcgQEAKIAkJKGxpc3QtPmV2ZGV2LT5leGlzdCA/IDAgOiAoUE9MTEhVUCB8IFBPTExFUlIpKTsKIH0KIAotc3RhdGljIGludCBldmRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyBldmRldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGV2ZGV2ICpldmRldiA9IGxpc3QtPmV2ZGV2OwpAQCAtMjg1LDExMCArMzcxLDI2OCBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnRScgfHwgX0lPQ19ESVIoY21kKSAhPSBfSU9DX1JFQUQpCisJCQlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ0UnKQogCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5FVl9NQVgpID09IF9JT0NfTlIoRVZJT0NHQklUKDAsMCkpKSB7CisJCQlpZiAoX0lPQ19ESVIoY21kKSA9PSBfSU9DX1JFQUQpIHsKIAotCQkJCWxvbmcgKmJpdHM7Ci0JCQkJaW50IGxlbjsKKwkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5FVl9NQVgpID09IF9JT0NfTlIoRVZJT0NHQklUKDAsMCkpKSB7CiAKLQkJCQlzd2l0Y2ggKF9JT0NfTlIoY21kKSAmIEVWX01BWCkgewotCQkJCQljYXNlICAgICAgMDogYml0cyA9IGRldi0+ZXZiaXQ7ICBsZW4gPSBFVl9NQVg7ICBicmVhazsKLQkJCQkJY2FzZSBFVl9LRVk6IGJpdHMgPSBkZXYtPmtleWJpdDsgbGVuID0gS0VZX01BWDsgYnJlYWs7Ci0JCQkJCWNhc2UgRVZfUkVMOiBiaXRzID0gZGV2LT5yZWxiaXQ7IGxlbiA9IFJFTF9NQVg7IGJyZWFrOwotCQkJCQljYXNlIEVWX0FCUzogYml0cyA9IGRldi0+YWJzYml0OyBsZW4gPSBBQlNfTUFYOyBicmVhazsKLQkJCQkJY2FzZSBFVl9NU0M6IGJpdHMgPSBkZXYtPm1zY2JpdDsgbGVuID0gTVNDX01BWDsgYnJlYWs7Ci0JCQkJCWNhc2UgRVZfTEVEOiBiaXRzID0gZGV2LT5sZWRiaXQ7IGxlbiA9IExFRF9NQVg7IGJyZWFrOwotCQkJCQljYXNlIEVWX1NORDogYml0cyA9IGRldi0+c25kYml0OyBsZW4gPSBTTkRfTUFYOyBicmVhazsKLQkJCQkJY2FzZSBFVl9GRjogIGJpdHMgPSBkZXYtPmZmYml0OyAgbGVuID0gRkZfTUFYOyAgYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQkJCQlsb25nICpiaXRzOworCQkJCQlpbnQgbGVuOworCisJCQkJCXN3aXRjaCAoX0lPQ19OUihjbWQpICYgRVZfTUFYKSB7CisJCQkJCQljYXNlICAgICAgMDogYml0cyA9IGRldi0+ZXZiaXQ7ICBsZW4gPSBFVl9NQVg7ICBicmVhazsKKwkJCQkJCWNhc2UgRVZfS0VZOiBiaXRzID0gZGV2LT5rZXliaXQ7IGxlbiA9IEtFWV9NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9SRUw6IGJpdHMgPSBkZXYtPnJlbGJpdDsgbGVuID0gUkVMX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX0FCUzogYml0cyA9IGRldi0+YWJzYml0OyBsZW4gPSBBQlNfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfTVNDOiBiaXRzID0gZGV2LT5tc2NiaXQ7IGxlbiA9IE1TQ19NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9MRUQ6IGJpdHMgPSBkZXYtPmxlZGJpdDsgbGVuID0gTEVEX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX1NORDogYml0cyA9IGRldi0+c25kYml0OyBsZW4gPSBTTkRfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfRkY6ICBiaXRzID0gZGV2LT5mZmJpdDsgIGxlbiA9IEZGX01BWDsgIGJyZWFrOworCQkJCQkJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJbGVuID0gTkJJVFMobGVuKSAqIHNpemVvZihsb25nKTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKKwkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBiaXRzLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKIAkJCQl9Ci0JCQkJbGVuID0gTkJJVFMobGVuKSAqIHNpemVvZihsb25nKTsKLQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgYml0cywgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHS0VZKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlsZW4gPSBOQklUUyhLRVlfTUFYKSAqIHNpemVvZihsb25nKTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKKwkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPmtleSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47CisJCQkJfQorCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR0xFRCgwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJbGVuID0gTkJJVFMoTEVEX01BWCkgKiBzaXplb2YobG9uZyk7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5sZWQsIGxlbikgPyAtRUZBVUxUIDogbGVuOworCQkJCX0KKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dTTkQoMCkpKSB7CisJCQkJCWludCBsZW47CisJCQkJCWxlbiA9IE5CSVRTKFNORF9NQVgpICogc2l6ZW9mKGxvbmcpOworCQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOworCQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+c25kLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHTkFNRSgwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJaWYgKCFkZXYtPm5hbWUpIHJldHVybiAtRU5PRU5UOworCQkJCQlsZW4gPSBzdHJsZW4oZGV2LT5uYW1lKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5uYW1lLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHUEhZUygwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJaWYgKCFkZXYtPnBoeXMpIHJldHVybiAtRU5PRU5UOworCQkJCQlsZW4gPSBzdHJsZW4oZGV2LT5waHlzKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5waHlzLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHVU5JUSgwKSkpIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJaWYgKCFkZXYtPnVuaXEpIHJldHVybiAtRU5PRU5UOworCQkJCQlsZW4gPSBzdHJsZW4oZGV2LT51bmlxKSArIDE7CisJCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7CisJCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT51bmlxLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKKwkJCQl9CisKKwkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5BQlNfTUFYKSA9PSBfSU9DX05SKEVWSU9DR0FCUygwKSkpIHsKKworCQkJCQlpbnQgdCA9IF9JT0NfTlIoY21kKSAmIEFCU19NQVg7CisKKwkJCQkJYWJzLnZhbHVlID0gZGV2LT5hYnNbdF07CisJCQkJCWFicy5taW5pbXVtID0gZGV2LT5hYnNtaW5bdF07CisJCQkJCWFicy5tYXhpbXVtID0gZGV2LT5hYnNtYXhbdF07CisJCQkJCWFicy5mdXp6ID0gZGV2LT5hYnNmdXp6W3RdOworCQkJCQlhYnMuZmxhdCA9IGRldi0+YWJzZmxhdFt0XTsKKworCQkJCQlpZiAoY29weV90b191c2VyKHAsICZhYnMsIHNpemVvZihzdHJ1Y3QgaW5wdXRfYWJzaW5mbykpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCiAJCQl9CiAKLQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dLRVkoMCkpKSB7Ci0JCQkJaW50IGxlbjsKLQkJCQlsZW4gPSBOQklUUyhLRVlfTUFYKSAqIHNpemVvZihsb25nKTsKLQkJCQlpZiAobGVuID4gX0lPQ19TSVpFKGNtZCkpIGxlbiA9IF9JT0NfU0laRShjbWQpOwotCQkJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgZGV2LT5rZXksIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJfQorCQkJaWYgKF9JT0NfRElSKGNtZCkgPT0gX0lPQ19XUklURSkgewogCi0JCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHTEVEKDApKSkgewotCQkJCWludCBsZW47Ci0JCQkJbGVuID0gTkJJVFMoTEVEX01BWCkgKiBzaXplb2YobG9uZyk7Ci0JCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+bGVkLCBsZW4pID8gLUVGQVVMVCA6IGxlbjsKLQkJCX0KKwkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5BQlNfTUFYKSA9PSBfSU9DX05SKEVWSU9DU0FCUygwKSkpIHsKIAotCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1NORCgwKSkpIHsKLQkJCQlpbnQgbGVuOwotCQkJCWxlbiA9IE5CSVRTKFNORF9NQVgpICogc2l6ZW9mKGxvbmcpOwotCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnNuZCwgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQl9CisJCQkJCWludCB0ID0gX0lPQ19OUihjbWQpICYgQUJTX01BWDsKIAotCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR05BTUUoMCkpKSB7Ci0JCQkJaW50IGxlbjsKLQkJCQlpZiAoIWRldi0+bmFtZSkgcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJbGVuID0gc3RybGVuKGRldi0+bmFtZSkgKyAxOwotCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPm5hbWUsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJfQorCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmFicywgcCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1BIWVMoMCkpKSB7Ci0JCQkJaW50IGxlbjsKLQkJCQlpZiAoIWRldi0+cGh5cykgcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJbGVuID0gc3RybGVuKGRldi0+cGh5cykgKyAxOwotCQkJCWlmIChsZW4gPiBfSU9DX1NJWkUoY21kKSkgbGVuID0gX0lPQ19TSVpFKGNtZCk7Ci0JCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnBoeXMsIGxlbikgPyAtRUZBVUxUIDogbGVuOwotCQkJfQorCQkJCQlkZXYtPmFic1t0XSA9IGFicy52YWx1ZTsKKwkJCQkJZGV2LT5hYnNtaW5bdF0gPSBhYnMubWluaW11bTsKKwkJCQkJZGV2LT5hYnNtYXhbdF0gPSBhYnMubWF4aW11bTsKKwkJCQkJZGV2LT5hYnNmdXp6W3RdID0gYWJzLmZ1eno7CisJCQkJCWRldi0+YWJzZmxhdFt0XSA9IGFicy5mbGF0OwogCi0JCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHVU5JUSgwKSkpIHsKLQkJCQlpbnQgbGVuOwotCQkJCWlmICghZGV2LT51bmlxKSByZXR1cm4gLUVOT0VOVDsKLQkJCQlsZW4gPSBzdHJsZW4oZGV2LT51bmlxKSArIDE7Ci0JCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKLQkJCQlyZXR1cm4gY29weV90b191c2VyKHAsIGRldi0+dW5pcSwgbGVuKSA/IC1FRkFVTFQgOiBsZW47Ci0JCQl9Ci0KLQkJCWlmICgoX0lPQ19OUihjbWQpICYgfkFCU19NQVgpID09IF9JT0NfTlIoRVZJT0NHQUJTKDApKSkgewotCi0JCQkJaW50IHQgPSBfSU9DX05SKGNtZCkgJiBBQlNfTUFYOwotCi0JCQkJYWJzLnZhbHVlID0gZGV2LT5hYnNbdF07Ci0JCQkJYWJzLm1pbmltdW0gPSBkZXYtPmFic21pblt0XTsKLQkJCQlhYnMubWF4aW11bSA9IGRldi0+YWJzbWF4W3RdOwotCQkJCWFicy5mdXp6ID0gZGV2LT5hYnNmdXp6W3RdOwotCQkJCWFicy5mbGF0ID0gZGV2LT5hYnNmbGF0W3RdOwotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmYWJzLCBzaXplb2Yoc3RydWN0IGlucHV0X2Fic2luZm8pKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJaWYgKChfSU9DX05SKGNtZCkgJiB+QUJTX01BWCkgPT0gX0lPQ19OUihFVklPQ1NBQlMoMCkpKSB7Ci0KLQkJCQlpbnQgdCA9IF9JT0NfTlIoY21kKSAmIEFCU19NQVg7Ci0KLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmFicywgcCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkJZGV2LT5hYnNbdF0gPSBhYnMudmFsdWU7Ci0JCQkJZGV2LT5hYnNtaW5bdF0gPSBhYnMubWluaW11bTsKLQkJCQlkZXYtPmFic21heFt0XSA9IGFicy5tYXhpbXVtOwotCQkJCWRldi0+YWJzZnV6elt0XSA9IGFicy5mdXp6OwotCQkJCWRldi0+YWJzZmxhdFt0XSA9IGFicy5mbGF0OwotCi0JCQkJcmV0dXJuIDA7CisJCQkJCXJldHVybiAwOworCQkJCX0KIAkJCX0KIAl9CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisKKyNkZWZpbmUgQklUU19QRVJfTE9OR19DT01QQVQgKHNpemVvZihjb21wYXRfbG9uZ190KSAqIDgpCisjZGVmaW5lIE5CSVRTX0NPTVBBVCh4KSAoKCgoeCktMSkvQklUU19QRVJfTE9OR19DT01QQVQpKzEpCisjZGVmaW5lIE9GRl9DT01QQVQoeCkgICgoeCklQklUU19QRVJfTE9OR19DT01QQVQpCisjZGVmaW5lIEJJVF9DT01QQVQoeCkgICgxVUw8PE9GRl9DT01QQVQoeCkpCisjZGVmaW5lIExPTkdfQ09NUEFUKHgpICgoeCkvQklUU19QRVJfTE9OR19DT01QQVQpCisjZGVmaW5lIHRlc3RfYml0X2NvbXBhdChiaXQsIGFycmF5KSAoKGFycmF5W0xPTkdfQ09NUEFUKGJpdCldID4+IE9GRl9DT01QQVQoYml0KSkgJiAxKQorCisjaWZkZWYgX19CSUdfRU5ESUFOCisjZGVmaW5lIGJpdF90b191c2VyKGJpdCwgbWF4KSBcCitkbyB7IFwKKwlpbnQgaTsgXAorCWludCBsZW4gPSBOQklUU19DT01QQVQoKG1heCkpICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBcCisJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsgXAorCWZvciAoaSA9IDA7IGkgPCBsZW4gLyBzaXplb2YoY29tcGF0X2xvbmdfdCk7IGkrKykgXAorCQlpZiAoY29weV90b191c2VyKChjb21wYXRfbG9uZ190KikgcCArIGksIFwKKwkJCQkgKGNvbXBhdF9sb25nX3QqKSAoYml0KSArIGkgKyAxIC0gKChpICUgMikgPDwgMSksIFwKKwkJCQkgc2l6ZW9mKGNvbXBhdF9sb25nX3QpKSkgXAorCQkJcmV0dXJuIC1FRkFVTFQ7IFwKKwlyZXR1cm4gbGVuOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgYml0X3RvX3VzZXIoYml0LCBtYXgpIFwKK2RvIHsgXAorCWludCBsZW4gPSBOQklUU19DT01QQVQoKG1heCkpICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpOyBcCisJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsgXAorCXJldHVybiBjb3B5X3RvX3VzZXIocCwgKGJpdCksIGxlbikgPyAtRUZBVUxUIDogbGVuOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBsb25nIGV2ZGV2X2lvY3RsX2NvbXBhdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGV2ZGV2ICpldmRldiA9IGxpc3QtPmV2ZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IGV2ZGV2LT5oYW5kbGUuZGV2OworCXN0cnVjdCBpbnB1dF9hYnNpbmZvIGFiczsKKwl2b2lkIF9fdXNlciAqcCA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWlmICghZXZkZXYtPmV4aXN0KSByZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaCAoY21kKSB7CisKKwkJY2FzZSBFVklPQ0dWRVJTSU9OOgorCQljYXNlIEVWSU9DR0lEOgorCQljYXNlIEVWSU9DR0tFWUNPREU6CisJCWNhc2UgRVZJT0NTS0VZQ09ERToKKwkJY2FzZSBFVklPQ1NGRjoKKwkJY2FzZSBFVklPQ1JNRkY6CisJCWNhc2UgRVZJT0NHRUZGRUNUUzoKKwkJY2FzZSBFVklPQ0dSQUI6CisJCQlyZXR1cm4gZXZkZXZfaW9jdGwoZmlsZSwgY21kLCAodW5zaWduZWQgbG9uZykgcCk7CisKKwkJZGVmYXVsdDoKKworCQkJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdFJykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKF9JT0NfRElSKGNtZCkgPT0gX0lPQ19SRUFEKSB7CisKKwkJCQlpZiAoKF9JT0NfTlIoY21kKSAmIH5FVl9NQVgpID09IF9JT0NfTlIoRVZJT0NHQklUKDAsMCkpKSB7CisJCQkJCWxvbmcgKmJpdHM7CisJCQkJCWludCBtYXg7CisKKwkJCQkJc3dpdGNoIChfSU9DX05SKGNtZCkgJiBFVl9NQVgpIHsKKwkJCQkJCWNhc2UgICAgICAwOiBiaXRzID0gZGV2LT5ldmJpdDsgIG1heCA9IEVWX01BWDsgIGJyZWFrOworCQkJCQkJY2FzZSBFVl9LRVk6IGJpdHMgPSBkZXYtPmtleWJpdDsgbWF4ID0gS0VZX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX1JFTDogYml0cyA9IGRldi0+cmVsYml0OyBtYXggPSBSRUxfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfQUJTOiBiaXRzID0gZGV2LT5hYnNiaXQ7IG1heCA9IEFCU19NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9NU0M6IGJpdHMgPSBkZXYtPm1zY2JpdDsgbWF4ID0gTVNDX01BWDsgYnJlYWs7CisJCQkJCQljYXNlIEVWX0xFRDogYml0cyA9IGRldi0+bGVkYml0OyBtYXggPSBMRURfTUFYOyBicmVhazsKKwkJCQkJCWNhc2UgRVZfU05EOiBiaXRzID0gZGV2LT5zbmRiaXQ7IG1heCA9IFNORF9NQVg7IGJyZWFrOworCQkJCQkJY2FzZSBFVl9GRjogIGJpdHMgPSBkZXYtPmZmYml0OyAgbWF4ID0gRkZfTUFYOyAgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwkJCQkJfQorCQkJCQliaXRfdG9fdXNlcihiaXRzLCBtYXgpOworCQkJCX0KKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dLRVkoMCkpKQorCQkJCQliaXRfdG9fdXNlcihkZXYtPmtleSwgS0VZX01BWCk7CisKKwkJCQlpZiAoX0lPQ19OUihjbWQpID09IF9JT0NfTlIoRVZJT0NHTEVEKDApKSkKKwkJCQkJYml0X3RvX3VzZXIoZGV2LT5sZWQsIExFRF9NQVgpOworCisJCQkJaWYgKF9JT0NfTlIoY21kKSA9PSBfSU9DX05SKEVWSU9DR1NORCgwKSkpCisJCQkJCWJpdF90b191c2VyKGRldi0+c25kLCBTTkRfTUFYKTsKKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dOQU1FKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlpZiAoIWRldi0+bmFtZSkgcmV0dXJuIC1FTk9FTlQ7CisJCQkJCWxlbiA9IHN0cmxlbihkZXYtPm5hbWUpICsgMTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKKwkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPm5hbWUsIGxlbikgPyAtRUZBVUxUIDogbGVuOworCQkJCX0KKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dQSFlTKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlpZiAoIWRldi0+cGh5cykgcmV0dXJuIC1FTk9FTlQ7CisJCQkJCWxlbiA9IHN0cmxlbihkZXYtPnBoeXMpICsgMTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKKwkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnBoeXMsIGxlbikgPyAtRUZBVUxUIDogbGVuOworCQkJCX0KKworCQkJCWlmIChfSU9DX05SKGNtZCkgPT0gX0lPQ19OUihFVklPQ0dVTklRKDApKSkgeworCQkJCQlpbnQgbGVuOworCQkJCQlpZiAoIWRldi0+dW5pcSkgcmV0dXJuIC1FTk9FTlQ7CisJCQkJCWxlbiA9IHN0cmxlbihkZXYtPnVuaXEpICsgMTsKKwkJCQkJaWYgKGxlbiA+IF9JT0NfU0laRShjbWQpKSBsZW4gPSBfSU9DX1NJWkUoY21kKTsKKwkJCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCBkZXYtPnVuaXEsIGxlbikgPyAtRUZBVUxUIDogbGVuOworCQkJCX0KKworCQkJCWlmICgoX0lPQ19OUihjbWQpICYgfkFCU19NQVgpID09IF9JT0NfTlIoRVZJT0NHQUJTKDApKSkgeworCisJCQkJCWludCB0ID0gX0lPQ19OUihjbWQpICYgQUJTX01BWDsKKworCQkJCQlhYnMudmFsdWUgPSBkZXYtPmFic1t0XTsKKwkJCQkJYWJzLm1pbmltdW0gPSBkZXYtPmFic21pblt0XTsKKwkJCQkJYWJzLm1heGltdW0gPSBkZXYtPmFic21heFt0XTsKKwkJCQkJYWJzLmZ1enogPSBkZXYtPmFic2Z1enpbdF07CisJCQkJCWFicy5mbGF0ID0gZGV2LT5hYnNmbGF0W3RdOworCisJCQkJCWlmIChjb3B5X3RvX3VzZXIocCwgJmFicywgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChfSU9DX0RJUihjbWQpID09IF9JT0NfV1JJVEUpIHsKKworCQkJCWlmICgoX0lPQ19OUihjbWQpICYgfkFCU19NQVgpID09IF9JT0NfTlIoRVZJT0NTQUJTKDApKSkgeworCisJCQkJCWludCB0ID0gX0lPQ19OUihjbWQpICYgQUJTX01BWDsKKworCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmFicywgcCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9hYnNpbmZvKSkpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJCQlkZXYtPmFic1t0XSA9IGFicy52YWx1ZTsKKwkJCQkJZGV2LT5hYnNtaW5bdF0gPSBhYnMubWluaW11bTsKKwkJCQkJZGV2LT5hYnNtYXhbdF0gPSBhYnMubWF4aW11bTsKKwkJCQkJZGV2LT5hYnNmdXp6W3RdID0gYWJzLmZ1eno7CisJCQkJCWRldi0+YWJzZmxhdFt0XSA9IGFicy5mbGF0OworCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZkZXZfZm9wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkucmVhZCA9CQlldmRldl9yZWFkLApAQCAtMzk2LDcgKzY0MCwxMCBAQAogCS5wb2xsID0JCWV2ZGV2X3BvbGwsCiAJLm9wZW4gPQkJZXZkZXZfb3BlbiwKIAkucmVsZWFzZSA9CWV2ZGV2X3JlbGVhc2UsCi0JLmlvY3RsID0JZXZkZXZfaW9jdGwsCisJLnVubG9ja2VkX2lvY3RsID0gZXZkZXZfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwgPQlldmRldl9pb2N0bF9jb21wYXQsCisjZW5kaWYKIAkuZmFzeW5jID0JZXZkZXZfZmFzeW5jLAogCS5mbHVzaCA9CWV2ZGV2X2ZsdXNoCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9LY29uZmlnCmluZGV4IDFkOTNmNTAuLjc1MjRiZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L0tjb25maWcKQEAgLTQ5LDIyICs0OSw4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBlbXUxMGsxLWdwLgogCi1jb25maWcgR0FNRVBPUlRfVk9SVEVYCi0JdHJpc3RhdGUgIkF1cmVhbCBWb3J0ZXgsIFZvcnRleCAyIGdhbWVwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIEF1cmVhbCBWb3J0ZXggMSBvciAyICBjYXJkIGFuZCB3YW50Ci0JICB0byB1c2UgaXRzIGdhbWVwb3J0LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2b3J0ZXguCi0KIGNvbmZpZyBHQU1FUE9SVF9GTTgwMQogCXRyaXN0YXRlICJGb3J0ZU1lZGlhIEZNODAxIGdhbWVwb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAotY29uZmlnIEdBTUVQT1JUX0NTNDYxWAotCXRyaXN0YXRlICJDcnlzdGFsIFNvdW5kRnVzaW9uIGdhbWVwb3J0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kKLQogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L01ha2VmaWxlCmluZGV4IDUzNjdiNDIuLmI2ZjYwOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9NYWtlZmlsZQpAQCAtNSw5ICs1LDcgQEAKICMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KIAogb2JqLSQoQ09ORklHX0dBTUVQT1JUKQkJKz0gZ2FtZXBvcnQubwotb2JqLSQoQ09ORklHX0dBTUVQT1JUX0NTNDYxWCkJKz0gY3M0NjF4Lm8KIG9iai0kKENPTkZJR19HQU1FUE9SVF9FTVUxMEsxKQkrPSBlbXUxMGsxLWdwLm8KIG9iai0kKENPTkZJR19HQU1FUE9SVF9GTTgwMSkJKz0gZm04MDEtZ3Aubwogb2JqLSQoQ09ORklHX0dBTUVQT1JUX0w0KQkrPSBsaWdodG5pbmcubwogb2JqLSQoQ09ORklHX0dBTUVQT1JUX05TNTU4KQkrPSBuczU1OC5vCi1vYmotJChDT05GSUdfR0FNRVBPUlRfVk9SVEVYKQkrPSB2b3J0ZXgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9jczQ2MXguYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvY3M0NjF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDEzZmYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9jczQ2MXguYworKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotCVRoZSBhbGwgZGVmaW5lcyBhbmQgcGFydCBvZiBjb2RlIChzdWNoIGFzIGNzNDYxeF8qKSBhcmUKLQljb250cmlidXRlZCBmcm9tIEFMU0EgMC41Ljggc291cmNlcy4KLQlTZWUgaHR0cDovL3d3dy5hbHNhLXByb2plY3Qub3JnLyBmb3Igc291cmNlcwotCi0JVGVzdGVkIG9uIExpbnV4IDY4NiAyLjQuMC10ZXN0OSwgQUxTQSAwLjUuOGEgYW5kIENTNDYxMAotKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi1NT0RVTEVfQVVUSE9SKCJWaWN0b3IgS3JhcGl2aW4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyoKLQlUaGVzZSBvcHRpb25zIGFyZSBleHBlcmltZW50YWwKLQotI2RlZmluZSBDUzQ2MVhfRlVMTF9NQVAKLSovCi0KLQotI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NJUlJVUwotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NJUlJVUyAgICAgICAgICAgIDB4MTAxMwotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMCAgICAgICAweDYwMDEKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIgICAgICAgMHg2MDAzCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1ICAgICAgIDB4NjAwNAotI2VuZGlmCi0KLS8qIFJlZ2lzdGVycyAqLwotCi0jZGVmaW5lIEJBMF9KU1BUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDgwCi0jZGVmaW5lIEJBMF9KU0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDg0Ci0jZGVmaW5lIEJBMF9KU0MxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDg4Ci0jZGVmaW5lIEJBMF9KU0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDhDCi0jZGVmaW5lIEJBMF9KU0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEEwCi0KLS8qIEJpdHMgZm9yIEpTUFQgKi8KLQotI2RlZmluZSBKU1BUX0NBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBKU1BUX0NBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBKU1BUX0NCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBKU1BUX0NCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBKU1BUX0JBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBKU1BUX0JBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBKU1BUX0JCMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBKU1BUX0JCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKiBCaXRzIGZvciBKU0NUTCAqLwotCi0jZGVmaW5lIEpTQ1RMX1NQX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEpTQ1RMX1NQX1NMT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9TTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9GQVNUICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEpTQ1RMX1NQX0ZBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCi0jZGVmaW5lIEpTQ1RMX0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0KLS8qIERhdGEgcmVnaXN0ZXIgcGFpcnMgbWFza3MgKi8KLQotI2RlZmluZSBKU0MxX1kxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgotI2RlZmluZSBKU0MxX1gxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAotI2RlZmluZSBKU0MxX1kxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBKU0MxX1gxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSlNDMl9ZMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKLSNkZWZpbmUgSlNDMl9YMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKLSNkZWZpbmUgSlNDMl9ZMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSlNDMl9YMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Ci0KLS8qIEpTIEdQSU8gKi8KLQotI2RlZmluZSBKU0lPX0RBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBKU0lPX0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBKU0lPX0RCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBKU0lPX0RCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBKU0lPX0FYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBKU0lPX0FZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBKU0lPX0JYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBKU0lPX0JZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0vKgotICAgVGhlIGNhcmQgaW5pdGlhbGl6YXRpb24gY29kZSBpcyBvYmZ1c2NhdGVkOyB0aGUgbW9kdWxlIGNzNDYxeAotICAgbmVlZCB0byBiZSBsb2FkZWQgYWZ0ZXIgQUxTQSBtb2R1bGVzIGluaXRpYWxpemVkIGFuZCBzb21ldGhpbmcKLSAgIHBsYXllZCBvbiB0aGUgQ1MgNDYxMCBjaGlwIChzZWUgc291cmNlcyBmb3IgZGV0YWlscyBvZiBDUzQ2MTAKLSAgIGluaXRpYWxpemF0aW9uIGNvZGUgZnJvbSBBTFNBKQotKi8KLQotLyogQ2FyZCBzcGVjaWZpYyBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIENTNDYxWF9CQTBfU0laRSAgICAgICAgIDB4MjAwMAotI2RlZmluZSBDUzQ2MVhfQkExX0RBVEEwX1NJWkUgICAweDMwMDAKLSNkZWZpbmUgQ1M0NjFYX0JBMV9EQVRBMV9TSVpFICAgMHgzODAwCi0jZGVmaW5lIENTNDYxWF9CQTFfUFJHX1NJWkUgICAgIDB4NzAwMAotI2RlZmluZSBDUzQ2MVhfQkExX1JFR19TSVpFICAgICAweDAxMDAKLQotI2RlZmluZSBCQTFfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAotI2RlZmluZSBCQTFfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBCQTFfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBCQTFfU1BfUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAotCi0jZGVmaW5lIEJBMV9EV09SRF9TSVpFICAgICAgICAgICgxMyAqIDEwMjQgKyA1MTIpCi0jZGVmaW5lIEJBMV9NRU1PUllfQ09VTlQgICAgICAgIDMKLQotLyoKLSAgIE9ubHkgb25lIENTNDYxeCBjYXJkIGlzIHN0aWxsIHN1cHBvdGVkOyB0aGUgY29kZSByZXF1aXJlcwotICAgcmVkZXNpZ24gdG8gYXZvaWQgdGhpcyBsaW1pdGF0dWlvbi4KLSovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJhMF9hZGRyOwotc3RhdGljIHVuc2lnbmVkIGludCBfX2lvbWVtICpiYTA7Ci0KLSNpZmRlZiBDUzQ2MVhfRlVMTF9NQVAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJhMV9hZGRyOwotc3RhdGljIHVuaW9uIGJhMV90IHsKLSAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19pb21lbSAqZGF0YTA7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9faW9tZW0gKmRhdGExOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfX2lvbWVtICpwbWVtOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfX2lvbWVtICpyZWc7Ci0gICAgICAgIH0gbmFtZTsKLSAgICAgICAgdW5zaWduZWQgaW50IF9faW9tZW0gKmlkeFs0XTsKLX0gYmExOwotCi1zdGF0aWMgdm9pZCBjczQ2MXhfcG9rZSh1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLSAgICAgICAgd3JpdGVsKHZhbCwgJmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXVsocmVnID4+IDIpICYgMHgzZmZmXSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWsodW5zaWduZWQgbG9uZyByZWcpCi17Ci0gICAgICAgIHJldHVybiByZWFkbCgmYmExLmlkeFsocmVnID4+IDE2KSAmIDNdWyhyZWcgPj4gMikgJiAweDNmZmZdKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNzNDYxeF9wb2tlQkEwKHVuc2lnbmVkIGxvbmcgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotICAgICAgICB3cml0ZWwodmFsLCAmYmEwW3JlZyA+PiAyXSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWtCQTAodW5zaWduZWQgbG9uZyByZWcpCi17Ci0gICAgICAgIHJldHVybiByZWFkbCgmYmEwW3JlZyA+PiAyXSk7Ci19Ci0KLXN0YXRpYyBpbnQgY3M0NjF4X2ZyZWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGdhbWVwb3J0ICpwb3J0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaWYgKHBvcnQpCi0JICAgIGdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChwb3J0KTsKLQotCWlmIChiYTApIGlvdW5tYXAoYmEwKTsKLSNpZmRlZiBDUzQ2MVhfRlVMTF9NQVAKLQlpZiAoYmExLm5hbWUuZGF0YTApIGlvdW5tYXAoYmExLm5hbWUuZGF0YTApOwotCWlmIChiYTEubmFtZS5kYXRhMSkgaW91bm1hcChiYTEubmFtZS5kYXRhMSk7Ci0JaWYgKGJhMS5uYW1lLnBtZW0pICBpb3VubWFwKGJhMS5uYW1lLnBtZW0pOwotCWlmIChiYTEubmFtZS5yZWcpICAgaW91bm1hcChiYTEubmFtZS5yZWcpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNzNDYxeF9nYW1lcG9ydF90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0JY3M0NjF4X3Bva2VCQTAoQkEwX0pTUFQsIDB4RkYpOyAgLy9vdXRiKGdhbWVwb3J0LT5pbywgMHhGRik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGNzNDYxeF9nYW1lcG9ydF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0JcmV0dXJuIGNzNDYxeF9wZWVrQkEwKEJBMF9KU1BUKTsgLy9pbmIoZ2FtZXBvcnQtPmlvKTsKLX0KLQotc3RhdGljIGludCBjczQ2MXhfZ2FtZXBvcnRfY29va2VkX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCi17Ci0JdW5zaWduZWQganMxLCBqczIsIGpzdDsKLQotCWpzMSA9IGNzNDYxeF9wZWVrQkEwKEJBMF9KU0MxKTsKLQlqczIgPSBjczQ2MXhfcGVla0JBMChCQTBfSlNDMik7Ci0JanN0ID0gY3M0NjF4X3BlZWtCQTAoQkEwX0pTUFQpOwotCi0JKmJ1dHRvbnMgPSAofmpzdCA+PiA0KSAmIDB4MEY7Ci0KLQlheGVzWzBdID0gKChqczEgJiBKU0MxX1kxVl9NQVNLKSA+PiBKU0MxX1kxVl9TSElGVCkgJiAweEZGRkY7Ci0JYXhlc1sxXSA9ICgoanMxICYgSlNDMV9YMVZfTUFTSykgPj4gSlNDMV9YMVZfU0hJRlQpICYgMHhGRkZGOwotCWF4ZXNbMl0gPSAoKGpzMiAmIEpTQzJfWTJWX01BU0spID4+IEpTQzJfWTJWX1NISUZUKSAmIDB4RkZGRjsKLQlheGVzWzNdID0gKChqczIgJiBKU0MyX1gyVl9NQVNLKSA+PiBKU0MyX1gyVl9TSElGVCkgJiAweEZGRkY7Ci0KLQlmb3IoanN0PTA7anN0PDQ7Kytqc3QpCi0JCWlmKGF4ZXNbanN0XT09MHhGRkZGKSBheGVzW2pzdF0gPSAtMTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjczQ2MXhfZ2FtZXBvcnRfb3BlbihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBpbnQgbW9kZSkKLXsKLQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKLQkJY2FzZSBHQU1FUE9SVF9NT0RFX1JBVzoKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNzNDYxeF9wY2lfdGJsW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX0NJUlJVUywgMHg2MDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwIH0sIC8qIENpcnJ1cyBDUzQ2MTAgKi8KLQl7IFBDSV9WRU5ET1JfSURfQ0lSUlVTLCAweDYwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwgLyogQ2lycnVzIENTNDYxMiAqLwotCXsgUENJX1ZFTkRPUl9JRF9DSVJSVVMsIDB4NjAwNSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LCAvKiBDaXJydXMgQ1M0NjE1ICovCi0JeyAwLCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNDYxeF9wY2lfdGJsKTsKLQotc3RhdGljIGludCBfX2RldmluaXQgY3M0NjF4X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGdhbWVwb3J0KiBwb3J0OwotCi0JcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2MXg6IENhbm5vdCBlbmFibGUgUENJIGdhbWVwb3J0IChidXMgJWQsIGRldmZuICVkKSBlcnJvcj0lZFxuIiwKLQkJCXBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JYmEwX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0jaWZkZWYgQ1M0NjFYX0ZVTExfTUFQCi0JYmExX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7Ci0jZW5kaWYKLQlpZiAoYmEwX2FkZHIgPT0gMCB8fCBiYTBfYWRkciA9PSB+MAotI2lmZGVmIENTNDYxWF9GVUxMX01BUAotICAgICAgICAgICAgfHwgYmExX2FkZHIgPT0gMCB8fCBiYTFfYWRkciA9PSB+MAotI2VuZGlmCi0JICAgICkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0NjF4OiB3cm9uZyBhZGRyZXNzIC0gYmEwID0gMHglbHhcbiIsIGJhMF9hZGRyKTsKLSNpZmRlZiBDUzQ2MVhfRlVMTF9NQVAKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDYxeDogd3JvbmcgYWRkcmVzcyAtIGJhMSA9IDB4JWx4XG4iLCBiYTFfYWRkcik7Ci0jZW5kaWYKLQkJY3M0NjF4X2ZyZWUocGRldik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQotCWJhMCA9IGlvcmVtYXAoYmEwX2FkZHIsIENTNDYxWF9CQTBfU0laRSk7Ci0jaWZkZWYgQ1M0NjFYX0ZVTExfTUFQCi0JYmExLm5hbWUuZGF0YTAgPSBpb3JlbWFwKGJhMV9hZGRyICsgQkExX1NQX0RNRU0wLCBDUzQ2MVhfQkExX0RBVEEwX1NJWkUpOwotCWJhMS5uYW1lLmRhdGExID0gaW9yZW1hcChiYTFfYWRkciArIEJBMV9TUF9ETUVNMSwgQ1M0NjFYX0JBMV9EQVRBMV9TSVpFKTsKLQliYTEubmFtZS5wbWVtICA9IGlvcmVtYXAoYmExX2FkZHIgKyBCQTFfU1BfUE1FTSwgQ1M0NjFYX0JBMV9QUkdfU0laRSk7Ci0JYmExLm5hbWUucmVnICAgPSBpb3JlbWFwKGJhMV9hZGRyICsgQkExX1NQX1JFRywgQ1M0NjFYX0JBMV9SRUdfU0laRSk7Ci0KLQlpZiAoYmEwID09IE5VTEwgfHwgYmExLm5hbWUuZGF0YTAgPT0gTlVMTCB8fAotICAgICAgICAgICAgYmExLm5hbWUuZGF0YTEgPT0gTlVMTCB8fCBiYTEubmFtZS5wbWVtID09IE5VTEwgfHwKLSAgICAgICAgICAgIGJhMS5uYW1lLnJlZyA9PSBOVUxMKSB7Ci0JCWNzNDYxeF9mcmVlKHBkZXYpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9Ci0jZWxzZQotCWlmIChiYTAgPT0gTlVMTCkgewotCQljczQ2MXhfZnJlZShwZGV2KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotI2VuZGlmCi0KLQlpZiAoIShwb3J0ID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpKSkgewotCQlwcmludGsoS0VSTl9FUlIgImNzNDYxeDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJY3M0NjF4X2ZyZWUocGRldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwb3J0KTsKLQotCXBvcnQtPm9wZW4gPSBjczQ2MXhfZ2FtZXBvcnRfb3BlbjsKLQlwb3J0LT50cmlnZ2VyID0gY3M0NjF4X2dhbWVwb3J0X3RyaWdnZXI7Ci0JcG9ydC0+cmVhZCA9IGNzNDYxeF9nYW1lcG9ydF9yZWFkOwotCXBvcnQtPmNvb2tlZF9yZWFkID0gY3M0NjF4X2dhbWVwb3J0X2Nvb2tlZF9yZWFkOwotCi0JZ2FtZXBvcnRfc2V0X25hbWUocG9ydCwgIkNTNDE2eCIpOwotCWdhbWVwb3J0X3NldF9waHlzKHBvcnQsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShwZGV2KSk7Ci0JcG9ydC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7Ci0KLQljczQ2MXhfcG9rZUJBMChCQTBfSlNJTywgMHhGRik7IC8vID8KLQljczQ2MXhfcG9rZUJBMChCQTBfSlNDVEwsIEpTQ1RMX1NQX01FRElVTV9TTE9XKTsKLQotCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQocG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDYxeF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCWNzNDYxeF9mcmVlKHBkZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY3M0NjF4X3BjaV9kcml2ZXIgPSB7Ci0gICAgICAgIC5uYW1lID0gICAgICAgICAiQ1M0NjF4X2dhbWVwb3J0IiwKLSAgICAgICAgLmlkX3RhYmxlID0gICAgIGNzNDYxeF9wY2lfdGJsLAotICAgICAgICAucHJvYmUgPSAgICAgICAgY3M0NjF4X3BjaV9wcm9iZSwKLSAgICAgICAgLnJlbW92ZSA9ICAgICAgIF9fZGV2ZXhpdF9wKGNzNDYxeF9wY2lfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNzNDYxeF9pbml0KHZvaWQpCi17Ci0gICAgICAgIHJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjczQ2MXhfcGNpX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBjczQ2MXhfZXhpdCh2b2lkKQotewotICAgICAgICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDYxeF9wY2lfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoY3M0NjF4X2luaXQpOwotbW9kdWxlX2V4aXQoY3M0NjF4X2V4aXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMgYi9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L2dhbWVwb3J0LmMKaW5kZXggZTE1MmQwZi4uYWIwOWNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9nYW1lcG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvZ2FtZXBvcnQuYwpAQCAtMTcsMTEgKzE3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAvKiNpbmNsdWRlIDxhc20vaW8uaD4qLwogCkBAIC02MSwxMiArNjAsMTMgQEAKIAogI2lmIGRlZmluZWQoX19pMzg2X18pCiAKKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KKwogI2RlZmluZSBERUxUQSh4LHkpICAgICAgKCh5KS0oeCkrKCh5KTwoeCk/MTE5MzE4Mi9IWjowKSkKICNkZWZpbmUgR0VUX1RJTUUoeCkgICAgIGRvIHsgeCA9IGdldF90aW1lX3BpdCgpOyB9IHdoaWxlICgwKQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGdldF90aW1lX3BpdCh2b2lkKQogewotCWV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAKQEAgLTIzOCw4ICsyMzgsNyBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhnYW1lcG9ydF9ldmVudF9sb2NrKTsJLyogcHJvdGVjdHMgZ2FtZXBvcnRfZXZlbnRfbGlzdCAqLwogc3RhdGljIExJU1RfSEVBRChnYW1lcG9ydF9ldmVudF9saXN0KTsKIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChnYW1lcG9ydF93YWl0KTsKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oZ2FtZXBvcnRfZXhpdGVkKTsKLXN0YXRpYyBpbnQgZ2FtZXBvcnRfcGlkOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqZ2FtZXBvcnRfdGFzazsKIAogc3RhdGljIHZvaWQgZ2FtZXBvcnRfcXVldWVfZXZlbnQodm9pZCAqb2JqZWN0LCBzdHJ1Y3QgbW9kdWxlICpvd25lciwKIAkJCSAgICAgIGVudW0gZ2FtZXBvcnRfZXZlbnRfdHlwZSBldmVudF90eXBlKQpAQCAtMjUwLDEyICsyNDksMTIgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FtZXBvcnRfZXZlbnRfbG9jaywgZmxhZ3MpOwogCiAJLyoKLSAJICogU2NhbiBldmVudCBsaXN0IGZvciB0aGUgb3RoZXIgZXZlbnRzIGZvciB0aGUgc2FtZSBnYW1lcG9ydCBwb3J0LAorCSAqIFNjYW4gZXZlbnQgbGlzdCBmb3IgdGhlIG90aGVyIGV2ZW50cyBmb3IgdGhlIHNhbWUgZ2FtZXBvcnQgcG9ydCwKIAkgKiBzdGFydGluZyB3aXRoIHRoZSBtb3N0IHJlY2VudCBvbmUuIElmIGV2ZW50IGlzIHRoZSBzYW1lIHdlCiAJICogZG8gbm90IG5lZWQgYWRkIG5ldyBvbmUuIElmIGV2ZW50IGlzIG9mIGRpZmZlcmVudCB0eXBlIHdlCiAJICogbmVlZCB0byBhZGQgdGhpcyBldmVudCBhbmQgc2hvdWxkIG5vdCBsb29rIGZ1cnRoZXIgYmVjYXVzZQogCSAqIHdlIG5lZWQgdG8gcHJlc2V2ZSBzZXF1ZW5jZSBvZiBkaXN0aW5jdCBldmVudHMuCi0gCSAqLworCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShldmVudCwgJmdhbWVwb3J0X2V2ZW50X2xpc3QsIG5vZGUpIHsKIAkJaWYgKGV2ZW50LT5vYmplY3QgPT0gb2JqZWN0KSB7CiAJCQlpZiAoZXZlbnQtPnR5cGUgPT0gZXZlbnRfdHlwZSkKQEAgLTQzMiwyMCArNDMxLDE1IEBACiAKIHN0YXRpYyBpbnQgZ2FtZXBvcnRfdGhyZWFkKHZvaWQgKm5vdGhpbmcpCiB7Ci0JbG9ja19rZXJuZWwoKTsKLQlkYWVtb25pemUoImtnYW1lcG9ydGQiKTsKLQlhbGxvd19zaWduYWwoU0lHVEVSTSk7Ci0KIAlkbyB7CiAJCWdhbWVwb3J0X2hhbmRsZV9ldmVudHMoKTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGdhbWVwb3J0X3dhaXQsICFsaXN0X2VtcHR5KCZnYW1lcG9ydF9ldmVudF9saXN0KSk7Ci0JCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKLQl9IHdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZ2FtZXBvcnRfd2FpdCwKKwkJCWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCAhbGlzdF9lbXB0eSgmZ2FtZXBvcnRfZXZlbnRfbGlzdCkpOworCQl0cnlfdG9fZnJlZXplKCk7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CiAKIAlwcmludGsoS0VSTl9ERUJVRyAiZ2FtZXBvcnQ6IGtnYW1lcG9ydGQgZXhpdGluZ1xuIik7Ci0KLQl1bmxvY2tfa2VybmVsKCk7Ci0JY29tcGxldGVfYW5kX2V4aXQoJmdhbWVwb3J0X2V4aXRlZCwgMCk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtNzczLDkgKzc2NywxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBnYW1lcG9ydF9pbml0KHZvaWQpCiB7Ci0JaWYgKCEoZ2FtZXBvcnRfcGlkID0ga2VybmVsX3RocmVhZChnYW1lcG9ydF90aHJlYWQsIE5VTEwsIENMT05FX0tFUk5FTCkpKSB7CisJZ2FtZXBvcnRfdGFzayA9IGt0aHJlYWRfcnVuKGdhbWVwb3J0X3RocmVhZCwgTlVMTCwgImtnYW1lcG9ydGQiKTsKKwlpZiAoSVNfRVJSKGdhbWVwb3J0X3Rhc2spKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZ2FtZXBvcnQ6IEZhaWxlZCB0byBzdGFydCBrZ2FtZXBvcnRkXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gUFRSX0VSUihnYW1lcG9ydF90YXNrKTsKIAl9CiAKIAlnYW1lcG9ydF9idXMuZGV2X2F0dHJzID0gZ2FtZXBvcnRfZGV2aWNlX2F0dHJzOwpAQCAtNzg5LDggKzc4NCw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZ2FtZXBvcnRfZXhpdCh2b2lkKQogewogCWJ1c191bnJlZ2lzdGVyKCZnYW1lcG9ydF9idXMpOwotCWtpbGxfcHJvYyhnYW1lcG9ydF9waWQsIFNJR1RFUk0sIDEpOwotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmdhbWVwb3J0X2V4aXRlZCk7CisJa3RocmVhZF9zdG9wKGdhbWVwb3J0X3Rhc2spOwogfQogCiBtb2R1bGVfaW5pdChnYW1lcG9ydF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvbnM1NTguYwppbmRleCA3YzVjNjMxLi4xYWI1ZjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2dhbWVwb3J0L25zNTU4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC9uczU1OC5jCkBAIC0yNTgsMTggKzI1OCwxOCBAQAogewogCWludCBpID0gMDsKIAorCWlmIChwbnBfcmVnaXN0ZXJfZHJpdmVyKCZuczU1OF9wbnBfZHJpdmVyKSA+PSAwKQorCQlwbnBfcmVnaXN0ZXJlZCA9IDE7CisKIC8qCi0gKiBQcm9iZSBJU0EgcG9ydHMgZmlyc3Qgc28gdGhhdCBQblAgZ2V0cyB0byBjaG9vc2UgZnJlZSBwb3J0IGFkZHJlc3NlcwotICogbm90IG9jY3VwaWVkIGJ5IHRoZSBJU0EgcG9ydHMuCisgKiBQcm9iZSBJU0EgcG9ydHMgYWZ0ZXIgUG5QLCBzbyB0aGF0IFBuUCBwb3J0cyB0aGF0IGFyZSBhbHJlYWR5CisgKiBlbmFibGVkIGdldCBkZXRlY3RlZCBhcyBQblAuIFRoaXMgbWF5IGJlIHN1Ym9wdGltYWwgaW4gbXVsdGktZGV2aWNlCisgKiBjb25maWd1cmF0aW9ucywgYnV0IHNhdmVzIGhhc3NsZSB3aXRoIHNpbXBsZSBzZXR1cHMuCiAgKi8KIAogCXdoaWxlIChuczU1OF9pc2FfcG9ydGxpc3RbaV0pCiAJCW5zNTU4X2lzYV9wcm9iZShuczU1OF9pc2FfcG9ydGxpc3RbaSsrXSk7CiAKLQlpZiAocG5wX3JlZ2lzdGVyX2RyaXZlcigmbnM1NThfcG5wX2RyaXZlcikgPj0gMCkKLQkJcG5wX3JlZ2lzdGVyZWQgPSAxOwotCi0KIAlyZXR1cm4gKGxpc3RfZW1wdHkoJm5zNTU4X2xpc3QpICYmICFwbnBfcmVnaXN0ZXJlZCkgPyAtRU5PREVWIDogMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC92b3J0ZXguYyBiL2RyaXZlcnMvaW5wdXQvZ2FtZXBvcnQvdm9ydGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YjAzMDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC9nYW1lcG9ydC92b3J0ZXguYworKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogJElkOiB2b3J0ZXguYyx2IDEuNSAyMDAyLzA3LzAxIDE1OjM5OjMwIHZvanRlY2ggRXhwICQKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgVm9qdGVjaCBQYXZsaWsKLSAqCi0gKiAgQmFzZWQgb24gdGhlIHdvcmsgb2Y6Ci0gKglSYXltb25kIEluZ2xlcwotICovCi0KLS8qCi0gKiBUcmlkZW50IDREV2F2ZSBhbmQgQXVyZWFsIFZvcnRleCBnYW1lcG9ydCBkcml2ZXIgZm9yIExpbnV4Ci0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKgotICogU2hvdWxkIHlvdSBuZWVkIHRvIGNvbnRhY3QgbWUsIHRoZSBhdXRob3IsIHlvdSBjYW4gZG8gc28gZWl0aGVyIGJ5Ci0gKiBlLW1haWwgLSBtYWlsIHlvdXIgbWVzc2FnZSB0byA8dm9qdGVjaEB1Y3cuY3o+LCBvciBieSBwYXBlciBtYWlsOgotICogVm9qdGVjaCBQYXZsaWssIFNpbXVua292YSAxNTk0LCBQcmFndWUgOCwgMTgyIDAwIEN6ZWNoIFJlcHVibGljCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KLQotTU9EVUxFX0FVVEhPUigiVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAdWN3LmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBdXJlYWwgVm9ydGV4IGFuZCBWb3J0ZXgyIGdhbWVwb3J0IGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jZGVmaW5lIFZPUlRFWF9HQ1IJCTB4MGMJLyogR2FtZXBvcnQgY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZSBWT1JURVhfTEVHCQkweDA4CS8qIExlZ2FjeSBwb3J0IGxvY2F0aW9uICovCi0jZGVmaW5lIFZPUlRFWF9BWEQJCTB4MTAJLyogQXhlcyBzdGFydCAqLwotI2RlZmluZSBWT1JURVhfREFUQV9XQUlUCTIwCS8qIDIwIG1zICovCi0KLXN0cnVjdCB2b3J0ZXggewotCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmJhc2U7Ci0JdW5zaWduZWQgY2hhciBfX2lvbWVtICppbzsKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHZvcnRleF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCi17Ci0Jc3RydWN0IHZvcnRleCAqdm9ydGV4ID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKLQlyZXR1cm4gcmVhZGIodm9ydGV4LT5pbyArIFZPUlRFWF9MRUcpOwotfQotCi1zdGF0aWMgdm9pZCB2b3J0ZXhfdHJpZ2dlcihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0KQotewotCXN0cnVjdCB2b3J0ZXggKnZvcnRleCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7Ci0Jd3JpdGViKDB4ZmYsIHZvcnRleC0+aW8gKyBWT1JURVhfTEVHKTsKLX0KLQotc3RhdGljIGludCB2b3J0ZXhfY29va2VkX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCi17Ci0Jc3RydWN0IHZvcnRleCAqdm9ydGV4ID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKLQlpbnQgaTsKLQotCSpidXR0b25zID0gKH5yZWFkYih2b3J0ZXgtPmJhc2UgKyBWT1JURVhfTEVHKSA+PiA0KSAmIDB4ZjsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJYXhlc1tpXSA9IHJlYWR3KHZvcnRleC0+aW8gKyBWT1JURVhfQVhEICsgaSAqIHNpemVvZih1MzIpKTsKLQkJaWYgKGF4ZXNbaV0gPT0gMHgxZmZmKSBheGVzW2ldID0gLTE7Ci0JfQotCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZvcnRleF9vcGVuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCBtb2RlKQotewotCXN0cnVjdCB2b3J0ZXggKnZvcnRleCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQkJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKLQkJCXdyaXRlYigweDQwLCB2b3J0ZXgtPmlvICsgVk9SVEVYX0dDUik7Ci0JCQltc2xlZXAoVk9SVEVYX0RBVEFfV0FJVCk7Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBHQU1FUE9SVF9NT0RFX1JBVzoKLQkJCXdyaXRlYigweDAwLCB2b3J0ZXgtPmlvICsgVk9SVEVYX0dDUik7Ci0JCQlyZXR1cm4gMDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2RldmluaXQgdm9ydGV4X3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3Qgdm9ydGV4ICp2b3J0ZXg7Ci0Jc3RydWN0IGdhbWVwb3J0ICpwb3J0OwotCWludCBpOwotCi0Jdm9ydGV4ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHZvcnRleCksIEdGUF9LRVJORUwpOwotCXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7Ci0JaWYgKCF2b3J0ZXggfHwgIXBvcnQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2b3J0ZXg6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOwotCQlrZnJlZSh2b3J0ZXgpOwotCQlnYW1lcG9ydF9mcmVlX3BvcnQocG9ydCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCWlmICh+cGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgaSkgJiBJT1JFU09VUkNFX0lPKQotCQkJYnJlYWs7Ci0KLQlwY2lfZW5hYmxlX2RldmljZShkZXYpOwotCi0Jdm9ydGV4LT5kZXYgPSBkZXY7Ci0Jdm9ydGV4LT5nYW1lcG9ydCA9IHBvcnQ7Ci0Jdm9ydGV4LT5iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQodm9ydGV4LT5kZXYsIGkpLAotCQkJCXBjaV9yZXNvdXJjZV9sZW4odm9ydGV4LT5kZXYsIGkpKTsKLQl2b3J0ZXgtPmlvID0gdm9ydGV4LT5iYXNlICsgaWQtPmRyaXZlcl9kYXRhOwotCi0JcGNpX3NldF9kcnZkYXRhKGRldiwgdm9ydGV4KTsKLQotCXBvcnQtPnBvcnRfZGF0YSA9IHZvcnRleDsKLQlwb3J0LT5mdXp6ID0gNjQ7Ci0KLQlnYW1lcG9ydF9zZXRfbmFtZShwb3J0LCAiQVU4OHgwIik7Ci0JZ2FtZXBvcnRfc2V0X3BoeXMocG9ydCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGRldikpOwotCXBvcnQtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7Ci0JcG9ydC0+cmVhZCA9IHZvcnRleF9yZWFkOwotCXBvcnQtPnRyaWdnZXIgPSB2b3J0ZXhfdHJpZ2dlcjsKLQlwb3J0LT5jb29rZWRfcmVhZCA9IHZvcnRleF9jb29rZWRfcmVhZDsKLQlwb3J0LT5vcGVuID0gdm9ydGV4X29wZW47Ci0KLQlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KHBvcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2b3J0ZXhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHZvcnRleCAqdm9ydGV4ID0gcGNpX2dldF9kcnZkYXRhKGRldik7Ci0KLQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQodm9ydGV4LT5nYW1lcG9ydCk7Ci0JaW91bm1hcCh2b3J0ZXgtPmJhc2UpOwotCWtmcmVlKHZvcnRleCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2b3J0ZXhfaWRfdGFibGVbXSA9IHsKLQl7IDB4MTJlYiwgMHgwMDAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAweDExMDAwIH0sCi0JeyAweDEyZWIsIDB4MDAwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMHgyODgwMCB9LAotCXsgMCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdm9ydGV4X2RyaXZlciA9IHsKLQkubmFtZSA9CQkidm9ydGV4X2dhbWVwb3J0IiwKLQkuaWRfdGFibGUgPQl2b3J0ZXhfaWRfdGFibGUsCi0JLnByb2JlID0Jdm9ydGV4X3Byb2JlLAotCS5yZW1vdmUgPQlfX2RldmV4aXRfcCh2b3J0ZXhfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHZvcnRleF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZvcnRleF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdm9ydGV4X2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZvcnRleF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh2b3J0ZXhfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2b3J0ZXhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L2lucHV0LmMKaW5kZXggODNjNzdjOS4uN2M0YjRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvaW5wdXQuYwpAQCAtMjE5LDEwICsyMTksMjQgQEAKIAogaW50IGlucHV0X29wZW5fZGV2aWNlKHN0cnVjdCBpbnB1dF9oYW5kbGUgKmhhbmRsZSkKIHsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBoYW5kbGUtPmRldjsKKwlpbnQgZXJyOworCisJZXJyID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCWhhbmRsZS0+b3BlbisrOwotCWlmIChoYW5kbGUtPmRldi0+b3BlbikKLQkJcmV0dXJuIGhhbmRsZS0+ZGV2LT5vcGVuKGhhbmRsZS0+ZGV2KTsKLQlyZXR1cm4gMDsKKworCWlmICghZGV2LT51c2VycysrICYmIGRldi0+b3BlbikKKwkJZXJyID0gZGV2LT5vcGVuKGRldik7CisKKwlpZiAoZXJyKQorCQloYW5kbGUtPm9wZW4tLTsKKworCXVwKCZkZXYtPnNlbSk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgaW5wdXRfZmx1c2hfZGV2aWNlKHN0cnVjdCBpbnB1dF9oYW5kbGUqIGhhbmRsZSwgc3RydWN0IGZpbGUqIGZpbGUpCkBAIC0yMzUsMTAgKzI0OSwxNyBAQAogCiB2b2lkIGlucHV0X2Nsb3NlX2RldmljZShzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCiB7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGFuZGxlLT5kZXY7CisKIAlpbnB1dF9yZWxlYXNlX2RldmljZShoYW5kbGUpOwotCWlmIChoYW5kbGUtPmRldi0+Y2xvc2UpCi0JCWhhbmRsZS0+ZGV2LT5jbG9zZShoYW5kbGUtPmRldik7CisKKwlkb3duKCZkZXYtPnNlbSk7CisKKwlpZiAoIS0tZGV2LT51c2VycyAmJiBkZXYtPmNsb3NlKQorCQlkZXYtPmNsb3NlKGRldik7CiAJaGFuZGxlLT5vcGVuLS07CisKKwl1cCgmZGV2LT5zZW0pOwogfQogCiBzdGF0aWMgdm9pZCBpbnB1dF9saW5rX2hhbmRsZShzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpCkBAIC00MTUsNiArNDM2LDggQEAKIAogCXNldF9iaXQoRVZfU1lOLCBkZXYtPmV2Yml0KTsKIAorCWluaXRfTVVURVgoJmRldi0+c2VtKTsKKwogCS8qCiAJICogSWYgZGVsYXkgYW5kIHBlcmlvZCBhcmUgcHJlLXNldCBieSB0aGUgZHJpdmVyLCB0aGVuIGF1dG9yZXBlYXRpbmcKIAkgKiBpcyBoYW5kbGVkIGJ5IHRoZSBkcml2ZXIgaXRzZWxmIGFuZCB3ZSBkb24ndCBkbyBpdCBpbiBpbnB1dC5jLgpAQCAtNjc0LDYgKzY5Nyw4IEBACiAJcmV0dXJuIChjb3VudCA+IGNudCkgPyBjbnQgOiBjb3VudDsKIH0KIAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaW5wdXRfZmlsZW9wczsKKwogc3RhdGljIGludCBfX2luaXQgaW5wdXRfcHJvY19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKQEAgLTY4OCw2ICs3MTMsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZW50cnktPm93bmVyID0gVEhJU19NT0RVTEU7CisJaW5wdXRfZmlsZW9wcyA9ICplbnRyeS0+cHJvY19mb3BzOworCWVudHJ5LT5wcm9jX2ZvcHMgPSAmaW5wdXRfZmlsZW9wczsKIAllbnRyeS0+cHJvY19mb3BzLT5wb2xsID0gaW5wdXRfZGV2aWNlc19wb2xsOwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaGFuZGxlcnMiLCAwLCBwcm9jX2J1c19pbnB1dF9kaXIsIGlucHV0X2hhbmRsZXJzX3JlYWQsIE5VTEwpOwogCWlmIChlbnRyeSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveWRldi5jIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwppbmRleCAzOTc3NWZjLi5mZjhlMWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKQEAgLTI4NSw0OCArMjg1LDMzIEBACiAJCShQT0xMSU4gfCBQT0xMUkROT1JNKSA6IDApIHwgKGxpc3QtPmpveWRldi0+ZXhpc3QgPyAwIDogKFBPTExIVVAgfCBQT0xMRVJSKSk7CiB9CiAKLXN0YXRpYyBpbnQgam95ZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgam95ZGV2X2lvY3RsX2NvbW1vbihzdHJ1Y3Qgam95ZGV2ICpqb3lkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmdwKQogewotCXN0cnVjdCBqb3lkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgam95ZGV2ICpqb3lkZXYgPSBsaXN0LT5qb3lkZXY7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gam95ZGV2LT5oYW5kbGUuZGV2OwotCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBpLCBqOwogCi0JaWYgKCFqb3lkZXYtPmV4aXN0KSByZXR1cm4gLUVOT0RFVjsKLQogCXN3aXRjaCAoY21kKSB7CiAKIAkJY2FzZSBKU19TRVRfQ0FMOgogCQkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKCZqb3lkZXYtPmdsdWUuSlNfQ09SUiwgYXJncCwKLQkJCQlzaXplb2Yoc3RydWN0IEpTX0RBVEFfVFlQRSkpID8gLUVGQVVMVCA6IDA7CisJCQkJc2l6ZW9mKGpveWRldi0+Z2x1ZS5KU19DT1JSKSkgPyAtRUZBVUxUIDogMDsKIAkJY2FzZSBKU19HRVRfQ0FMOgogCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmam95ZGV2LT5nbHVlLkpTX0NPUlIsCi0JCQkJc2l6ZW9mKHN0cnVjdCBKU19EQVRBX1RZUEUpKSA/IC1FRkFVTFQgOiAwOworCQkJCXNpemVvZihqb3lkZXYtPmdsdWUuSlNfQ09SUikpID8gLUVGQVVMVCA6IDA7CiAJCWNhc2UgSlNfU0VUX1RJTUVPVVQ6Ci0JCQlyZXR1cm4gZ2V0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQsIChpbnQgX191c2VyICopIGFyZyk7CisJCQlyZXR1cm4gZ2V0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQsIChzMzIgX191c2VyICopIGFyZ3ApOwogCQljYXNlIEpTX0dFVF9USU1FT1VUOgotCQkJcmV0dXJuIHB1dF91c2VyKGpveWRldi0+Z2x1ZS5KU19USU1FT1VULCAoaW50IF9fdXNlciAqKSBhcmcpOwotCQljYXNlIEpTX1NFVF9USU1FTElNSVQ6Ci0JCQlyZXR1cm4gZ2V0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVMSU1JVCwgKGxvbmcgX191c2VyICopIGFyZyk7Ci0JCWNhc2UgSlNfR0VUX1RJTUVMSU1JVDoKLQkJCXJldHVybiBwdXRfdXNlcihqb3lkZXYtPmdsdWUuSlNfVElNRUxJTUlULCAobG9uZyBfX3VzZXIgKikgYXJnKTsKLQkJY2FzZSBKU19TRVRfQUxMOgotCQkJcmV0dXJuIGNvcHlfZnJvbV91c2VyKCZqb3lkZXYtPmdsdWUsIGFyZ3AsCi0JCQkJCQlzaXplb2Yoc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFKSkgPyAtRUZBVUxUIDogMDsKLQkJY2FzZSBKU19HRVRfQUxMOgotCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmam95ZGV2LT5nbHVlLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBKU19EQVRBX1NBVkVfVFlQRSkpID8gLUVGQVVMVCA6IDA7CisJCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVPVVQsIChzMzIgX191c2VyICopIGFyZ3ApOwogCiAJCWNhc2UgSlNJT0NHVkVSU0lPTjoKLQkJCXJldHVybiBwdXRfdXNlcihKU19WRVJTSU9OLCAoX191MzIgX191c2VyICopIGFyZyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoSlNfVkVSU0lPTiwgKF9fdTMyIF9fdXNlciAqKSBhcmdwKTsKIAkJY2FzZSBKU0lPQ0dBWEVTOgotCQkJcmV0dXJuIHB1dF91c2VyKGpveWRldi0+bmFicywgKF9fdTggX191c2VyICopIGFyZyk7CisJCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5uYWJzLCAoX191OCBfX3VzZXIgKikgYXJncCk7CiAJCWNhc2UgSlNJT0NHQlVUVE9OUzoKLQkJCXJldHVybiBwdXRfdXNlcihqb3lkZXYtPm5rZXksIChfX3U4IF9fdXNlciAqKSBhcmcpOworCQkJcmV0dXJuIHB1dF91c2VyKGpveWRldi0+bmtleSwgKF9fdTggX191c2VyICopIGFyZ3ApOwogCQljYXNlIEpTSU9DU0NPUlI6CiAJCQlpZiAoY29weV9mcm9tX3VzZXIoam95ZGV2LT5jb3JyLCBhcmdwLAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QganNfY29ycikgKiBqb3lkZXYtPm5hYnMpKQorCQkJCSAgICAgIHNpemVvZihqb3lkZXYtPmNvcnJbMF0pICogam95ZGV2LT5uYWJzKSkKIAkJCSAgICByZXR1cm4gLUVGQVVMVDsKIAkJCWZvciAoaSA9IDA7IGkgPCBqb3lkZXYtPm5hYnM7IGkrKykgewogCQkJCWogPSBqb3lkZXYtPmFic3BhbVtpXTsKQEAgLTMzNSw3ICszMjAsNyBAQAogCQkJcmV0dXJuIDA7CiAJCWNhc2UgSlNJT0NHQ09SUjoKIAkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgam95ZGV2LT5jb3JyLAotCQkJCQkJc2l6ZW9mKHN0cnVjdCBqc19jb3JyKSAqIGpveWRldi0+bmFicykgPyAtRUZBVUxUIDogMDsKKwkJCQkJCXNpemVvZihqb3lkZXYtPmNvcnJbMF0pICogam95ZGV2LT5uYWJzKSA/IC1FRkFVTFQgOiAwOwogCQljYXNlIEpTSU9DU0FYTUFQOgogCQkJaWYgKGNvcHlfZnJvbV91c2VyKGpveWRldi0+YWJzcGFtLCBhcmdwLCBzaXplb2YoX191OCkgKiAoQUJTX01BWCArIDEpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTM3MSw2ICszNTYsODQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0YXRpYyBsb25nIGpveWRldl9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBqb3lkZXZfbGlzdCAqbGlzdCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgam95ZGV2ICpqb3lkZXYgPSBsaXN0LT5qb3lkZXY7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJczMyIHRtcDMyOworCXN0cnVjdCBKU19EQVRBX1NBVkVfVFlQRV8zMiBkczMyOworCWludCBlcnI7CisKKwlpZiAoIWpveWRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOworCXN3aXRjaChjbWQpIHsKKwljYXNlIEpTX1NFVF9USU1FTElNSVQ6CisJCWVyciA9IGdldF91c2VyKHRtcDMyLCAoczMyIF9fdXNlciAqKSBhcmcpOworCQlpZiAoZXJyID09IDApCisJCQlqb3lkZXYtPmdsdWUuSlNfVElNRUxJTUlUID0gdG1wMzI7CisJCWJyZWFrOworCWNhc2UgSlNfR0VUX1RJTUVMSU1JVDoKKwkJdG1wMzIgPSBqb3lkZXYtPmdsdWUuSlNfVElNRUxJTUlUOworCQllcnIgPSBwdXRfdXNlcih0bXAzMiwgKHMzMiBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEpTX1NFVF9BTEw6CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZkczMyLCBhcmdwLAorCQkJCSAgICAgc2l6ZW9mKGRzMzIpKSA/IC1FRkFVTFQgOiAwOworCQlpZiAoZXJyID09IDApIHsKKwkJCWpveWRldi0+Z2x1ZS5KU19USU1FT1VUICAgID0gZHMzMi5KU19USU1FT1VUOworCQkJam95ZGV2LT5nbHVlLkJVU1kgICAgICAgICAgPSBkczMyLkJVU1k7CisJCQlqb3lkZXYtPmdsdWUuSlNfRVhQSVJFVElNRSA9IGRzMzIuSlNfRVhQSVJFVElNRTsKKwkJCWpveWRldi0+Z2x1ZS5KU19USU1FTElNSVQgID0gZHMzMi5KU19USU1FTElNSVQ7CisJCQlqb3lkZXYtPmdsdWUuSlNfU0FWRSAgICAgICA9IGRzMzIuSlNfU0FWRTsKKwkJCWpveWRldi0+Z2x1ZS5KU19DT1JSICAgICAgID0gZHMzMi5KU19DT1JSOworCQl9CisJCWJyZWFrOworCisJY2FzZSBKU19HRVRfQUxMOgorCQlkczMyLkpTX1RJTUVPVVQgICAgPSBqb3lkZXYtPmdsdWUuSlNfVElNRU9VVDsKKwkJZHMzMi5CVVNZICAgICAgICAgID0gam95ZGV2LT5nbHVlLkJVU1k7CisJCWRzMzIuSlNfRVhQSVJFVElNRSA9IGpveWRldi0+Z2x1ZS5KU19FWFBJUkVUSU1FOworCQlkczMyLkpTX1RJTUVMSU1JVCAgPSBqb3lkZXYtPmdsdWUuSlNfVElNRUxJTUlUOworCQlkczMyLkpTX1NBVkUgICAgICAgPSBqb3lkZXYtPmdsdWUuSlNfU0FWRTsKKwkJZHMzMi5KU19DT1JSICAgICAgID0gam95ZGV2LT5nbHVlLkpTX0NPUlI7CisKKwkJZXJyID0gY29weV90b191c2VyKGFyZ3AsICZkczMyLAorCQkJCQkgIHNpemVvZihkczMyKSkgPyAtRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSBqb3lkZXZfaW9jdGxfY29tbW9uKGpveWRldiwgY21kLCBhcmdwKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCisKK3N0YXRpYyBpbnQgam95ZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgam95ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGpveWRldiAqam95ZGV2ID0gbGlzdC0+am95ZGV2OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKCFqb3lkZXYtPmV4aXN0KSByZXR1cm4gLUVOT0RFVjsKKworCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBKU19TRVRfVElNRUxJTUlUOgorCQkJcmV0dXJuIGdldF91c2VyKGpveWRldi0+Z2x1ZS5KU19USU1FTElNSVQsIChsb25nIF9fdXNlciAqKSBhcmcpOworCQljYXNlIEpTX0dFVF9USU1FTElNSVQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoam95ZGV2LT5nbHVlLkpTX1RJTUVMSU1JVCwgKGxvbmcgX191c2VyICopIGFyZyk7CisJCWNhc2UgSlNfU0VUX0FMTDoKKwkJCXJldHVybiBjb3B5X2Zyb21fdXNlcigmam95ZGV2LT5nbHVlLCBhcmdwLAorCQkJCQkJc2l6ZW9mKGpveWRldi0+Z2x1ZSkpID8gLUVGQVVMVCA6IDA7CisJCWNhc2UgSlNfR0VUX0FMTDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmpveWRldi0+Z2x1ZSwKKwkJCQkJCXNpemVvZihqb3lkZXYtPmdsdWUpKSA/IC1FRkFVTFQgOiAwOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGpveWRldl9pb2N0bF9jb21tb24oam95ZGV2LCBjbWQsIGFyZ3ApOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgam95ZGV2X2ZvcHMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLnJlYWQgPQkJam95ZGV2X3JlYWQsCkBAIC0zNzksNiArNDQyLDkgQEAKIAkub3BlbiA9CQlqb3lkZXZfb3BlbiwKIAkucmVsZWFzZSA9CWpveWRldl9yZWxlYXNlLAogCS5pb2N0bCA9CWpveWRldl9pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCA9CWpveWRldl9jb21wYXRfaW9jdGwsCisjZW5kaWYKIAkuZmFzeW5jID0Jam95ZGV2X2Zhc3luYywKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2EzZC5jCmluZGV4IGFkMzlmZTQuLmJmMzRmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYTNkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hM2QuYwpAQCAtMTg1LDcgKzE4NSw3IEBACiAJYTNkLT5yZWFkcysrOwogCWlmIChhM2RfcmVhZF9wYWNrZXQoYTNkLT5nYW1lcG9ydCwgYTNkLT5sZW5ndGgsIGRhdGEpICE9IGEzZC0+bGVuZ3RoIHx8CiAJICAgIGRhdGFbMF0gIT0gYTNkLT5tb2RlIHx8IGEzZF9jc3VtKGRhdGEsIGEzZC0+bGVuZ3RoKSkKLQkgCWEzZC0+YmFkcysrOworCQlhM2QtPmJhZHMrKzsKIAllbHNlCiAJCWEzZF9yZWFkKGEzZCwgZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hZGkuYwppbmRleCA4M2Y2ZGFmLi4yNjU5NjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FkaS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYWRpLmMKQEAgLTgyLDcgKzgyLDcgQEAKIHN0YXRpYyBjaGFyIGFkaV93bWZfYWJzW10gPQl7IEFCU19XSEVFTCwgQUJTX0dBUywgQUJTX0JSQUtFLCBBQlNfSEFUMFgsIEFCU19IQVQwWSwgQUJTX0hBVDFYLCBBQlNfSEFUMVksIEFCU19IQVQyWCwgQUJTX0hBVDJZIH07CiAKIHN0YXRpYyBzaG9ydCBhZGlfd21ncGVfa2V5W10gPQl7IEJUTl9BLCBCVE5fQiwgQlROX0MsIEJUTl9YLCBCVE5fWSwgQlROX1osICBCVE5fVEwsIEJUTl9UUiwgQlROX1NUQVJULCBCVE5fTU9ERSwgQlROX1NFTEVDVCB9Owotc3RhdGljIHNob3J0IGFkaV93bWlfa2V5W10gPSAJeyBCVE5fVFJJR0dFUiwgIEJUTl9UT1AsIEJUTl9USFVNQiwgQlROX1RPUDIsIEJUTl9CQVNFLCBCVE5fQkFTRTIsIEJUTl9CQVNFMywgQlROX0JBU0U0LCBCVE5fRVhUUkEgfTsKK3N0YXRpYyBzaG9ydCBhZGlfd21pX2tleVtdID0JeyBCVE5fVFJJR0dFUiwgIEJUTl9UT1AsIEJUTl9USFVNQiwgQlROX1RPUDIsIEJUTl9CQVNFLCBCVE5fQkFTRTIsIEJUTl9CQVNFMywgQlROX0JBU0U0LCBCVE5fRVhUUkEgfTsKIHN0YXRpYyBzaG9ydCBhZGlfd21lZDNkX2tleVtdID0JeyBCVE5fVFJJR0dFUiwgQlROX1RIVU1CLCBCVE5fVEhVTUIyLCBCVE5fVE9QLCBCVE5fVE9QMiwgQlROX0JBU0UsIEJUTl9CQVNFMiB9Owogc3RhdGljIHNob3J0IGFkaV9jbTJfa2V5W10gPQl7IEJUTl8xLCBCVE5fMiwgQlROXzMsIEJUTl80LCBCVE5fNSwgQlROXzYsIEJUTl83LCBCVE5fOCB9OwogCkBAIC0xODMsNyArMTgzLDcgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgYWRpICphZGkgPSBwb3J0LT5hZGk7CiAKLSAJYWRpWzBdLmlkeCA9IGFkaVsxXS5pZHggPSAwOworCWFkaVswXS5pZHggPSBhZGlbMV0uaWR4ID0gMDsKIAogCWlmIChhZGlbMF0ucmV0IDw9IDAgfHwgYWRpWzFdLnJldCA8PSAwKSByZXR1cm47CiAJaWYgKGFkaVswXS5kYXRhWzBdICYgMHgyMCB8fCB+YWRpWzFdLmRhdGFbMF0gJiAweDIwKSByZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbWlqb3kuYwppbmRleCBjZjM2Y2E5Li4wMzM0NTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FtaWpveS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW1pam95LmMKQEAgLTUxLDcgKzUxLDggQEAKIAogX19vYnNvbGV0ZV9zZXR1cCgiYW1pam95PSIpOwogCi1zdGF0aWMgaW50IGFtaWpveV91c2VkWzJdID0geyAwLCAwIH07CitzdGF0aWMgaW50IGFtaWpveV91c2VkOworc3RhdGljIERFQ0xBUkVfTVVURVgoYW1pam95X3NlbSk7CiBzdGF0aWMgc3RydWN0IGlucHV0X2RldiBhbWlqb3lfZGV2WzJdOwogc3RhdGljIGNoYXIgKmFtaWpveV9waHlzWzJdID0geyAiYW1pam95L2lucHV0MCIsICJhbWlqb3kvaW5wdXQxIiB9OwogCkBAIC04NCwyNiArODUsMzAgQEAKIAogc3RhdGljIGludCBhbWlqb3lfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0JaW50ICp1c2VkID0gZGV2LT5wcml2YXRlOworCWludCBlcnI7CiAKLQlpZiAoKCp1c2VkKSsrKQotCQlyZXR1cm4gMDsKKwllcnIgPSBkb3duX2ludGVycnVwdGlibGUoJmFtaWpveV9zZW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhbWlqb3lfaW50ZXJydXB0LCAwLCAiYW1pam95IiwgYW1pam95X2ludGVycnVwdCkpIHsKLQkJKCp1c2VkKS0tOworCWlmICghYW1pam95X3VzZWQgJiYgcmVxdWVzdF9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhbWlqb3lfaW50ZXJydXB0LCAwLCAiYW1pam95IiwgYW1pam95X2ludGVycnVwdCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhbWlqb3kuYzogQ2FuJ3QgYWxsb2NhdGUgaXJxICVkXG4iLCBJUlFfQU1JR0FfVkVSVEIpOwotCQlyZXR1cm4gLUVCVVNZOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OwogCX0KIAotCXJldHVybiAwOworCWFtaWpveV91c2VkKys7CitvdXQ6CisJdXAoJmFtaWpveV9zZW0pOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGFtaWpveV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0JaW50ICp1c2VkID0gZGV2LT5wcml2YXRlOwotCi0JaWYgKCEtLSgqdXNlZCkpCisJZG93bigmYW1pam95c2VtKTsKKwlpZiAoIS0tYW1pam95X3VzZWQpCiAJCWZyZWVfaXJxKElSUV9BTUlHQV9WRVJUQiwgYW1pam95X2ludGVycnVwdCk7CisJdXAoJmFtaWpveV9zZW0pOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhbWlqb3lfaW5pdCh2b2lkKQpAQCAtMTM4LDggKzE0Myw2IEBACiAJCQlhbWlqb3lfZGV2W2ldLmlkLnByb2R1Y3QgPSAweDAwMDM7CiAJCQlhbWlqb3lfZGV2W2ldLmlkLnZlcnNpb24gPSAweDAxMDA7CiAKLQkJCWFtaWpveV9kZXZbaV0ucHJpdmF0ZSA9IGFtaWpveV91c2VkICsgaTsKLQogCQkJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGFtaWpveV9kZXYgKyBpKTsKIAkJCXByaW50ayhLRVJOX0lORk8gImlucHV0OiAlcyBhdCBqb3klZGRhdFxuIiwgYW1pam95X25hbWUsIGkpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9hbmFsb2cuYwppbmRleCA1MDRiN2Q1Li5jM2E1NzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2FuYWxvZy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svYW5hbG9nLmMKQEAgLTE0MCwxMiArMTQwLDE0IEBACiAgKi8KIAogI2lmZGVmIF9faTM4Nl9fCisKKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KKwogI2RlZmluZSBHRVRfVElNRSh4KQlkbyB7IGlmIChjcHVfaGFzX3RzYykgcmR0c2NsKHgpOyBlbHNlIHggPSBnZXRfdGltZV9waXQoKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgREVMVEEoeCx5KQkoY3B1X2hhc190c2MgPyAoKHkpIC0gKHgpKSA6ICgoeCkgLSAoeSkgKyAoKHgpIDwgKHkpID8gQ0xPQ0tfVElDS19SQVRFIC8gSFogOiAwKSkpCiAjZGVmaW5lIFRJTUVfTkFNRQkoY3B1X2hhc190c2M/IlRTQyI6IlBJVCIpCiBzdGF0aWMgdW5zaWduZWQgaW50IGdldF90aW1lX3BpdCh2b2lkKQogewotICAgICAgICBleHRlcm4gc3BpbmxvY2tfdCBpODI1M19sb2NrOwogICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2RiOS5jCmluZGV4IGNmZGQzYWMuLmZiZDNlZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZGI5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9kYjkuYwpAQCAtODcsNyArODcsNyBAQAogI2RlZmluZSBEQjlfTk9STUFMCQkweDBhCiAjZGVmaW5lIERCOV9OT1NFTEVDVAkJMHgwOAogCi0jZGVmaW5lIERCOV9NQVhfREVWSUNFUyAyCisjZGVmaW5lIERCOV9NQVhfREVWSUNFUwkJMgogCiAjZGVmaW5lIERCOV9HRU5FU0lTNl9ERUxBWQkxNAogI2RlZmluZSBEQjlfUkVGUkVTSF9USU1FCUhaLzEwMApAQCAtOTgsNiArOTgsNyBAQAogCXN0cnVjdCBwYXJkZXZpY2UgKnBkOwogCWludCBtb2RlOwogCWludCB1c2VkOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwogCWNoYXIgcGh5c1syXVszMl07CiB9OwogCkBAIC01MDMsNiArNTA0LDExIEBACiB7CiAJc3RydWN0IGRiOSAqZGI5ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBwYXJwb3J0ICpwb3J0ID0gZGI5LT5wZC0+cG9ydDsKKwlpbnQgZXJyOworCisJZXJyID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZkYjktPnNlbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmICghZGI5LT51c2VkKyspIHsKIAkJcGFycG9ydF9jbGFpbShkYjktPnBkKTsKQEAgLTUxNCw2ICs1MjAsNyBAQAogCQltb2RfdGltZXIoJmRiOS0+dGltZXIsIGppZmZpZXMgKyBEQjlfUkVGUkVTSF9USU1FKTsKIAl9CiAKKwl1cCgmZGI5LT5zZW0pOwogCXJldHVybiAwOwogfQogCkBAIC01MjIsMTIgKzUyOSwxNCBAQAogCXN0cnVjdCBkYjkgKmRiOSA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydCA9IGRiOS0+cGQtPnBvcnQ7CiAKKwlkb3duKCZkYjktPnNlbSk7CiAJaWYgKCEtLWRiOS0+dXNlZCkgewotCQlkZWxfdGltZXIoJmRiOS0+dGltZXIpOworCQlkZWxfdGltZXJfc3luYygmZGI5LT50aW1lcik7CiAJCXBhcnBvcnRfd3JpdGVfY29udHJvbChwb3J0LCAweDAwKTsKIAkJcGFycG9ydF9kYXRhX2ZvcndhcmQocG9ydCk7CiAJCXBhcnBvcnRfcmVsZWFzZShkYjktPnBkKTsKIAl9CisJdXAoJmRiOS0+c2VtKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkYjkgX19pbml0ICpkYjlfcHJvYmUoaW50ICpjb25maWcsIGludCBuYXJncykKQEAgLTU2MywxMiArNTcyLDEyIEBACiAJCX0KIAl9CiAKLQlpZiAoIShkYjkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGI5KSwgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoZGI5ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IGRiOSksIEdGUF9LRVJORUwpKSkgewogCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW1lbXNldChkYjksIDAsIHNpemVvZihzdHJ1Y3QgZGI5KSk7CiAKKwlpbml0X01VVEVYKCZkYjktPnNlbSk7CiAJZGI5LT5tb2RlID0gY29uZmlnWzFdOwogCWluaXRfdGltZXIoJmRiOS0+dGltZXIpOwogCWRiOS0+dGltZXIuZGF0YSA9IChsb25nKSBkYjk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dhbWVjb24uYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jCmluZGV4IDg3MzJmNTIuLjk1YmJkZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ2FtZWNvbi5jCkBAIC0xLDEyICsxLDEyIEBACiAvKgogICogTkVTLCBTTkVTLCBONjQsIE11bHRpU3lzdGVtLCBQU1ggZ2FtZXBhZCBkcml2ZXIgZm9yIExpbnV4CiAgKgotICogIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IAlWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgotICogIENvcHlyaWdodCAoYykgMjAwNCAJCVBldGVyIE5lbHNvbiA8cnVmdXMta2VybmVsQGhhY2tpc2gub3JnPgorICogIENvcHlyaWdodCAoYykgMTk5OS0yMDA0CVZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHN1c2UuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0CQlQZXRlciBOZWxzb24gPHJ1ZnVzLWtlcm5lbEBoYWNraXNoLm9yZz4KICAqCiAgKiAgQmFzZWQgb24gdGhlIHdvcmsgb2Y6Ci0gKiAgCUFuZHJlZSBCb3JybWFubgkJSm9obiBEYWhsc3Ryb20KLSAqICAJRGF2aWQgS3VkZXIJCU5hdGhhbiBIYW5kCisgKglBbmRyZWUgQm9ycm1hbm4JCUpvaG4gRGFobHN0cm9tCisgKglEYXZpZCBLdWRlcgkJTmF0aGFuIEhhbmQKICAqLwogCiAvKgpAQCAtODEsNiArODEsNyBAQAogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXVuc2lnbmVkIGNoYXIgcGFkc1tHQ19NQVggKyAxXTsKIAlpbnQgdXNlZDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKIAljaGFyIHBoeXNbNV1bMzJdOwogfTsKIApAQCAtNDMzLDcgKzQzNCw3IEBACiAJCWdjX3BzeF9yZWFkX3BhY2tldChnYywgZGF0YV9wc3gsIGRhdGEpOwogCiAJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkgCQlzd2l0Y2ggKGRhdGFbaV0pIHsKKwkJCXN3aXRjaCAoZGF0YVtpXSkgewogCiAJCQkJY2FzZSBHQ19QU1hfUlVNQkxFOgogCkBAIC01MDMsMjIgKzUwNCwzMyBAQAogc3RhdGljIGludCBnY19vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgZ2MgKmdjID0gZGV2LT5wcml2YXRlOworCWludCBlcnI7CisKKwllcnIgPSBkb3duX2ludGVycnVwdGlibGUoJmdjLT5zZW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlpZiAoIWdjLT51c2VkKyspIHsKIAkJcGFycG9ydF9jbGFpbShnYy0+cGQpOwogCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2woZ2MtPnBkLT5wb3J0LCAweDA0KTsKIAkJbW9kX3RpbWVyKCZnYy0+dGltZXIsIGppZmZpZXMgKyBHQ19SRUZSRVNIX1RJTUUpOwogCX0KKworCXVwKCZnYy0+c2VtKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZ2NfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewogCXN0cnVjdCBnYyAqZ2MgPSBkZXYtPnByaXZhdGU7CisKKwlkb3duKCZnYy0+c2VtKTsKIAlpZiAoIS0tZ2MtPnVzZWQpIHsKLQkJZGVsX3RpbWVyKCZnYy0+dGltZXIpOworCQlkZWxfdGltZXJfc3luYygmZ2MtPnRpbWVyKTsKIAkJcGFycG9ydF93cml0ZV9jb250cm9sKGdjLT5wZC0+cG9ydCwgMHgwMCk7CiAJCXBhcnBvcnRfcmVsZWFzZShnYy0+cGQpOwogCX0KKwl1cCgmZ2MtPnNlbSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZ2MgX19pbml0ICpnY19wcm9iZShpbnQgKmNvbmZpZywgaW50IG5hcmdzKQpAQCAtNTQyLDExICs1NTQsMTIgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKCEoZ2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ2MpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShnYyA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBnYyksIEdGUF9LRVJORUwpKSkgewogCQlwYXJwb3J0X3B1dF9wb3J0KHBwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW1lbXNldChnYywgMCwgc2l6ZW9mKHN0cnVjdCBnYykpOworCisJaW5pdF9NVVRFWCgmZ2MtPnNlbSk7CiAKIAlnYy0+cGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcCwgImdhbWVjb24iLCBOVUxMLCBOVUxMLCBOVUxMLCBQQVJQT1JUX0RFVl9FWENMLCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9nZjJrLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYwppbmRleCBhZDEzZjA5Li43ZDk2OTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dmMmsuYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZ2Yya19heGVzW2dmMmstPmlkXTsgaSsrKSB7CiAJCWdmMmstPmRldi5hYnNtYXhbZ2Yya19hYnNbaV1dID0gKGkgPCAyKSA/IGdmMmstPmRldi5hYnNbZ2Yya19hYnNbaV1dICogMiAtIDMyIDoKLQkgICAgICAJCSAgZ2Yyay0+ZGV2LmFic1tnZjJrX2Fic1swXV0gKyBnZjJrLT5kZXYuYWJzW2dmMmtfYWJzWzFdXSAtIDMyOworCQkJICBnZjJrLT5kZXYuYWJzW2dmMmtfYWJzWzBdXSArIGdmMmstPmRldi5hYnNbZ2Yya19hYnNbMV1dIC0gMzI7CiAJCWdmMmstPmRldi5hYnNtaW5bZ2Yya19hYnNbaV1dID0gMzI7CiAJCWdmMmstPmRldi5hYnNmdXp6W2dmMmtfYWJzW2ldXSA9IDg7CiAJCWdmMmstPmRldi5hYnNmbGF0W2dmMmtfYWJzW2ldXSA9IChpIDwgMikgPyAyNCA6IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2dyaXBfbXAuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCmluZGV4IDQyZTUwMDUuLjBkYTdiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svZ3JpcF9tcC5jCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkqcGFja2V0ID0gMDsKIAlyYXdfZGF0YSA9IGdhbWVwb3J0X3JlYWQoZ2FtZXBvcnQpOwogCWlmIChyYXdfZGF0YSAmIDEpCi0gCQlyZXR1cm4gSU9fUkVUUlk7CisJCXJldHVybiBJT19SRVRSWTsKIAogCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAJCXJhd19kYXRhID0gZ2FtZXBvcnRfcmVhZChnYW1lcG9ydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLW1haW4uYwppbmRleCAwMjhmMzUxLi5lMzFiN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS1tYWluLmMKQEAgLTc4LDYgKzc4LDcgQEAKIAl7IDB4MDYxYywgMHhjMGE0LCAiQUNUIExBQlMgRm9yY2UgUlMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuX3doZWVsLCBhYnNfd2hlZWwsIGZmX2lmb3JjZSB9LCAvLz8KIAl7IDB4MDZmOCwgMHgwMDAxLCAiR3VpbGxlbW90IFJhY2UgTGVhZGVyIEZvcmNlIEZlZWRiYWNrIiwJYnRuX3doZWVsLCBhYnNfd2hlZWwsIGZmX2lmb3JjZSB9LCAvLz8KIAl7IDB4MDZmOCwgMHgwMDA0LCAiR3VpbGxlbW90IEZvcmNlIEZlZWRiYWNrIFJhY2luZyBXaGVlbCIsCWJ0bl93aGVlbCwgYWJzX3doZWVsLCBmZl9pZm9yY2UgfSwgLy8/CisJeyAweDA2ZjgsIDB4MDAwNCwgIkd1bGxlbW90IEpldCBMZWFkZXIgM0QiLAkJCWJ0bl9qb3lzdGljaywgYWJzX2pveXN0aWNrLCBmZl9pZm9yY2UgfSwgLy8/CiAJeyAweDAwMDAsIDB4MDAwMCwgIlVua25vd24gSS1Gb3JjZSBEZXZpY2UgWyUwNHg6JTA0eF0iLAkJYnRuX2pveXN0aWNrLCBhYnNfam95c3RpY2ssIGZmX2lmb3JjZSB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtdXNiLmMKaW5kZXggNjE3YzBiMC4uNjM2OWEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9pZm9yY2UvaWZvcmNlLXVzYi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNlL2lmb3JjZS11c2IuYwpAQCAtMjI5LDYgKzIyOSw3IEBACiAJeyBVU0JfREVWSUNFKDB4MDYxYywgMHhjMGE0KSB9LCAgICAgICAgIC8qIEFDVCBMQUJTIEZvcmNlIFJTICovCiAJeyBVU0JfREVWSUNFKDB4MDZmOCwgMHgwMDAxKSB9LAkJLyogR3VpbGxlbW90IFJhY2UgTGVhZGVyIEZvcmNlIEZlZWRiYWNrICovCiAJeyBVU0JfREVWSUNFKDB4MDZmOCwgMHgwMDA0KSB9LAkJLyogR3VpbGxlbW90IEZvcmNlIEZlZWRiYWNrIFJhY2luZyBXaGVlbCAqLworCXsgVVNCX0RFVklDRSgweDA2ZjgsIDB4YTMwMikgfSwJCS8qIEd1aWxsZW1vdCBKZXQgTGVhZGVyIDNEICovCiAJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZWJhbGwuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2ViYWxsLmMKaW5kZXggZWMwYTJhNi4uYTQzNmYyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZWJhbGwuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlYmFsbC5jCkBAIC00LDggKzQsOCBAQAogICogIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFZvanRlY2ggUGF2bGlrCiAgKgogICogIEJhc2VkIG9uIHRoZSB3b3JrIG9mOgotICogIAlEYXZpZCBUaG9tcHNvbgotICogIAlKb3NlcGggS3JhaG4KKyAqCURhdmlkIFRob21wc29uCisgKglKb3NlcGggS3JhaG4KICAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZW9yYi5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay9zcGFjZW9yYi5jCmluZGV4IDg3NDM2N2IuLjAxZmQyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svc3BhY2VvcmIuYworKysgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3NwYWNlb3JiLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVm9qdGVjaCBQYXZsaWsKICAqCiAgKiAgQmFzZWQgb24gdGhlIHdvcmsgb2Y6Ci0gKiAgCURhdmlkIFRob21wc29uCisgKglEYXZpZCBUaG9tcHNvbgogICovCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3RtZGMuYyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jCmluZGV4IGFhZWU1MmMuLjllYjk5NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdG1kYy5jCkBAIC03OSw3ICs3OSw3IEBACiAJeyBCVE5fQSwgQlROX0IsIEJUTl9DLCBCVE5fWCwgQlROX1ksIEJUTl9aLCBCVE5fU1RBUlQsIEJUTl9TRUxFQ1QsIEJUTl9UTCwgQlROX1RSIH07CiBzdGF0aWMgc2hvcnQgdG1kY19idG5fam95W1RNRENfQlROXSA9CiAJeyBCVE5fVFJJR0dFUiwgQlROX1RIVU1CLCBCVE5fVE9QLCBCVE5fVE9QMiwgQlROX0JBU0UsIEJUTl9CQVNFMiwgQlROX1RIVU1CMiwgQlROX1BJTktJRSwKLSAJICBCVE5fQkFTRTMsIEJUTl9CQVNFNCwgQlROX0EsIEJUTl9CLCBCVE5fQywgQlROX1gsIEJUTl9ZLCBCVE5fWiB9OworCSAgQlROX0JBU0UzLCBCVE5fQkFTRTQsIEJUTl9BLCBCVE5fQiwgQlROX0MsIEJUTl9YLCBCVE5fWSwgQlROX1ogfTsKIHN0YXRpYyBzaG9ydCB0bWRjX2J0bl9mbVtUTURDX0JUTl0gPQogICAgICAgICB7IEJUTl9UUklHR0VSLCBCVE5fQywgQlROX0IsIEJUTl9BLCBCVE5fVEhVTUIsIEJUTl9YLCBCVE5fWSwgQlROX1osIEJUTl9UT1AsIEJUTl9UT1AyIH07CiBzdGF0aWMgc2hvcnQgdG1kY19idG5fYXRbVE1EQ19CVE5dID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svdHVyYm9ncmFmeC5jIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90dXJib2dyYWZ4LmMKaW5kZXggZGQ4OGI5Yy4uMjgxMDBkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9qb3lzdGljay90dXJib2dyYWZ4LmMKKysrIGIvZHJpdmVycy9pbnB1dC9qb3lzdGljay90dXJib2dyYWZ4LmMKQEAgLTg0LDYgKzg0LDcgQEAKIAljaGFyIHBoeXNbN11bMzJdOwogCWludCBzdGlja3M7CiAJaW50IHVzZWQ7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07CiB9ICp0Z2Z4X2Jhc2VbM107CiAKIC8qCkBAIC05OSw3ICsxMDAsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCiAJCWlmICh0Z2Z4LT5zdGlja3MgJiAoMSA8PCBpKSkgewogCi0gCQkJZGV2ID0gdGdmeC0+ZGV2ICsgaTsKKwkJCWRldiA9IHRnZngtPmRldiArIGk7CiAKIAkJCXBhcnBvcnRfd3JpdGVfZGF0YSh0Z2Z4LT5wZC0+cG9ydCwgfigxIDw8IGkpKTsKIAkJCWRhdGExID0gcGFycG9ydF9yZWFkX3N0YXR1cyh0Z2Z4LT5wZC0+cG9ydCkgXiAweDdmOwpAQCAtMTIyLDIzICsxMjMsMzQgQEAKIAogc3RhdGljIGludCB0Z2Z4X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgdGdmeCAqdGdmeCA9IGRldi0+cHJpdmF0ZTsKLSAgICAgICAgaWYgKCF0Z2Z4LT51c2VkKyspIHsKKwlzdHJ1Y3QgdGdmeCAqdGdmeCA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZXJyOworCisJZXJyID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZ0Z2Z4LT5zZW0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXRnZngtPnVzZWQrKykgewogCQlwYXJwb3J0X2NsYWltKHRnZngtPnBkKTsKIAkJcGFycG9ydF93cml0ZV9jb250cm9sKHRnZngtPnBkLT5wb3J0LCAweDA0KTsKLSAgICAgICAgICAgICAgICBtb2RfdGltZXIoJnRnZngtPnRpbWVyLCBqaWZmaWVzICsgVEdGWF9SRUZSRVNIX1RJTUUpOworCQltb2RfdGltZXIoJnRnZngtPnRpbWVyLCBqaWZmaWVzICsgVEdGWF9SRUZSRVNIX1RJTUUpOwogCX0KLSAgICAgICAgcmV0dXJuIDA7CisKKwl1cCgmdGdmeC0+c2VtKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdGdmeF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCB0Z2Z4ICp0Z2Z4ID0gZGV2LT5wcml2YXRlOwotICAgICAgICBpZiAoIS0tdGdmeC0+dXNlZCkgewotICAgICAgICAgICAgICAgIGRlbF90aW1lcigmdGdmeC0+dGltZXIpOworCXN0cnVjdCB0Z2Z4ICp0Z2Z4ID0gZGV2LT5wcml2YXRlOworCisJZG93bigmdGdmeC0+c2VtKTsKKwlpZiAoIS0tdGdmeC0+dXNlZCkgeworCQlkZWxfdGltZXJfc3luYygmdGdmeC0+dGltZXIpOwogCQlwYXJwb3J0X3dyaXRlX2NvbnRyb2wodGdmeC0+cGQtPnBvcnQsIDB4MDApOwotICAgICAgICAJcGFycG9ydF9yZWxlYXNlKHRnZngtPnBkKTsKKwkJcGFycG9ydF9yZWxlYXNlKHRnZngtPnBkKTsKIAl9CisJdXAoJnRnZngtPnNlbSk7CiB9CiAKIC8qCkBAIC0xNjYsMTEgKzE3OCwxMiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoISh0Z2Z4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRnZngpLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoISh0Z2Z4ID0ga2NhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRnZngpLCBHRlBfS0VSTkVMKSkpIHsKIAkJcGFycG9ydF9wdXRfcG9ydChwcCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQodGdmeCwgMCwgc2l6ZW9mKHN0cnVjdCB0Z2Z4KSk7CisKKwlpbml0X01VVEVYKCZ0Z2Z4LT5zZW0pOwogCiAJdGdmeC0+cGQgPSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZShwcCwgInR1cmJvZ3JhZngiLCBOVUxMLCBOVUxMLCBOVUxMLCBQQVJQT1JUX0RFVl9FWENMLCBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCmluZGV4IDgyZmFkOWEuLjRkNDk4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogewkJCQkJCQkJCQlcCiAJcmV0dXJuIGF0a2JkX2F0dHJfc2V0X2hlbHBlcihkLCBiLCBzLCBhdGtiZF9zZXRfIyNfbmFtZSk7CQlcCiB9CQkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdGtiZF9hdHRyXyMjX25hbWUgPSAJCQkJXAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0a2JkX2F0dHJfIyNfbmFtZSA9CQkJCVwKIAlfX0FUVFIoX25hbWUsIFNfSVdVU1IgfCBTX0lSVUdPLCBhdGtiZF9kb19zaG93XyMjX25hbWUsIGF0a2JkX2RvX3NldF8jI19uYW1lKTsKIAogQVRLQkRfREVGSU5FX0FUVFIoZXh0cmEpOwpAQCAtMzg4LDcgKzM4OCw3IEBACiAJCQl2YWx1ZSA9IGF0a2JkLT5yZWxlYXNlID8gMCA6CiAJCQkJKDEgKyAoIWF0a2JkLT5zb2Z0cmVwZWF0ICYmIHRlc3RfYml0KGF0a2JkLT5rZXljb2RlW2NvZGVdLCBhdGtiZC0+ZGV2LmtleSkpKTsKIAotCQkJc3dpdGNoICh2YWx1ZSkgeyAJLyogV29ya2Fyb3VuZCBUb3NoaWJhIGxhcHRvcCBtdWx0aXBsZSBrZXlwcmVzcyAqLworCQkJc3dpdGNoICh2YWx1ZSkgewkvKiBXb3JrYXJvdW5kIFRvc2hpYmEgbGFwdG9wIG11bHRpcGxlIGtleXByZXNzICovCiAJCQkJY2FzZSAwOgogCQkJCQlhdGtiZC0+bGFzdCA9IDA7CiAJCQkJCWJyZWFrOwpAQCAtODk0LDcgKzg5NCw3IEBACiAJaWYgKGF0a2JkLT53cml0ZSkgewogCQlwYXJhbVswXSA9ICh0ZXN0X2JpdChMRURfU0NST0xMTCwgYXRrYmQtPmRldi5sZWQpID8gMSA6IDApCiAJCSAgICAgICAgIHwgKHRlc3RfYml0KExFRF9OVU1MLCAgICBhdGtiZC0+ZGV2LmxlZCkgPyAyIDogMCkKLSAJCSAgICAgICAgIHwgKHRlc3RfYml0KExFRF9DQVBTTCwgICBhdGtiZC0+ZGV2LmxlZCkgPyA0IDogMCk7CisJCSAgICAgICAgIHwgKHRlc3RfYml0KExFRF9DQVBTTCwgICBhdGtiZC0+ZGV2LmxlZCkgPyA0IDogMCk7CiAKIAkJaWYgKGF0a2JkX3Byb2JlKGF0a2JkKSkKIAkJCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY29yZ2lrYmQuYwppbmRleCAwZjEyMjBhLi5hODU1MTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nvcmdpa2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jb3JnaWtiZC5jCkBAIC0zOSw2ICszOSw3IEBACiAjZGVmaW5lIENPUkdJX0tFWV9DQUxFTkRFUglLRVlfRjEKICNkZWZpbmUgQ09SR0lfS0VZX0FERFJFU1MJS0VZX0YyCiAjZGVmaW5lIENPUkdJX0tFWV9GTgkJS0VZX0YzCisjZGVmaW5lIENPUkdJX0tFWV9DQU5DRUwJS0VZX0Y0CiAjZGVmaW5lIENPUkdJX0tFWV9PRkYJCUtFWV9TVVNQRU5ECiAjZGVmaW5lIENPUkdJX0tFWV9FWE9LCQlLRVlfRjUKICNkZWZpbmUgQ09SR0lfS0VZX0VYQ0FOQ0VMCUtFWV9GNgpAQCAtNDYsNiArNDcsNyBAQAogI2RlZmluZSBDT1JHSV9LRVlfRVhKT0dVUAlLRVlfRjgKICNkZWZpbmUgQ09SR0lfS0VZX0pBUDEJCUtFWV9MRUZUQ1RSTAogI2RlZmluZSBDT1JHSV9LRVlfSkFQMgkJS0VZX0xFRlRBTFQKKyNkZWZpbmUgQ09SR0lfS0VZX01BSUwJCUtFWV9GMTAKICNkZWZpbmUgQ09SR0lfS0VZX09LCQlLRVlfRjExCiAjZGVmaW5lIENPUkdJX0tFWV9NRU5VCQlLRVlfRjEyCiAjZGVmaW5lIENPUkdJX0hJTkdFXzAJCUtFWV9LUDAKQEAgLTU5LDggKzYxLDggQEAKIAlLRVlfVEFCLCBLRVlfUSwgS0VZX0UsIEtFWV9ULCBLRVlfRywgS0VZX1UsIEtFWV9KLCBLRVlfSywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAzMy00OCAqLwogCUNPUkdJX0tFWV9DQUxFTkRFUiwgS0VZX1csIEtFWV9TLCBLRVlfRiwgS0VZX1YsIEtFWV9ILCBLRVlfTSwgS0VZX0wsIDAsIEtFWV9SSUdIVFNISUZULCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgIC8qIDQ5LTY0ICovCiAJQ09SR0lfS0VZX0FERFJFU1MsIEtFWV9BLCBLRVlfRCwgS0VZX0MsIEtFWV9CLCBLRVlfTiwgS0VZX0RPVCwgMCwgS0VZX0VOVEVSLCAwLCBLRVlfTEVGVFNISUZULCAwLCAwLCAwLCAwLCAwLCAJICAvKiA2NS04MCAqLwotCUtFWV9NQUlMLCBLRVlfWiwgS0VZX1gsIEtFWV9NSU5VUywgS0VZX1NQQUNFLCBLRVlfQ09NTUEsIDAsIEtFWV9VUCwgMCwgMCwgMCwgQ09SR0lfS0VZX0ZOLCAwLCAwLCAwLCAwLCAgICAgICAgICAgIC8qIDgxLTk2ICovCi0JS0VZX1NZU1JRLCBDT1JHSV9LRVlfSkFQMSwgQ09SR0lfS0VZX0pBUDIsIEtFWV9DQU5DRUwsIENPUkdJX0tFWV9PSywgQ09SR0lfS0VZX01FTlUsIEtFWV9MRUZULCBLRVlfRE9XTiwgS0VZX1JJR0hULCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgLyogOTctMTEyICovCisJQ09SR0lfS0VZX01BSUwsIEtFWV9aLCBLRVlfWCwgS0VZX01JTlVTLCBLRVlfU1BBQ0UsIEtFWV9DT01NQSwgMCwgS0VZX1VQLCAwLCAwLCAwLCBDT1JHSV9LRVlfRk4sIDAsIDAsIDAsIDAsICAgICAgICAgICAgLyogODEtOTYgKi8KKwlLRVlfU1lTUlEsIENPUkdJX0tFWV9KQVAxLCBDT1JHSV9LRVlfSkFQMiwgQ09SR0lfS0VZX0NBTkNFTCwgQ09SR0lfS0VZX09LLCBDT1JHSV9LRVlfTUVOVSwgS0VZX0xFRlQsIEtFWV9ET1dOLCBLRVlfUklHSFQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAvKiA5Ny0xMTIgKi8KIAlDT1JHSV9LRVlfT0ZGLCBDT1JHSV9LRVlfRVhPSywgQ09SR0lfS0VZX0VYQ0FOQ0VMLCBDT1JHSV9LRVlfRVhKT0dET1dOLCBDT1JHSV9LRVlfRVhKT0dVUCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAvKiAxMTMtMTI0ICovCiAJQ09SR0lfSElOR0VfMCwgQ09SR0lfSElOR0VfMSwgQ09SR0lfSElOR0VfMgkgIC8qIDEyNS0xMjcgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xra2JkLmMKaW5kZXggMjY5NGZmMi4uMDk4OTYzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sa2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbGtrYmQuYwpAQCAtMTUsMTAgKzE1LDEwIEBACiAgKiBpbmZvcm1hdGlvbiBnaXZlbiBiZWxvdywgSSB3aWxsIF9ub3RfIGJlIGxpYWJsZSEKICAqCiAgKiBSSjEwIHBpbm91dDoJCVRvIERFOToJCU9yIERCMjU6Ci0gKiAJMSAtIFJ4RCA8LS0tLT4JUGluIDMgKFR4RCkgPC0+CVBpbiAyIChUeEQpCi0gKiAJMiAtIEdORCA8LS0tLT4JUGluIDUgKEdORCkgPC0+CVBpbiA3IChHTkQpCi0gKiAJNCAtIFR4RCA8LS0tLT4JUGluIDIgKFJ4RCkgPC0+CVBpbiAzIChSeEQpCi0gKiAJMyAtICsxMlYgKGZyb20gSEREIGRyaXZlIGNvbm5lY3RvciksIERPTidUIGNvbm5lY3QgdG8gREU5IG9yIERCMjUhISEKKyAqCTEgLSBSeEQgPC0tLS0+CVBpbiAzIChUeEQpIDwtPglQaW4gMiAoVHhEKQorICoJMiAtIEdORCA8LS0tLT4JUGluIDUgKEdORCkgPC0+CVBpbiA3IChHTkQpCisgKgk0IC0gVHhEIDwtLS0tPglQaW4gMiAoUnhEKSA8LT4JUGluIDMgKFJ4RCkKKyAqCTMgLSArMTJWIChmcm9tIEhERCBkcml2ZSBjb25uZWN0b3IpLCBET04nVCBjb25uZWN0IHRvIERFOSBvciBEQjI1ISEhCiAgKgogICogUGluIG51bWJlcnMgZm9yIERFOSBhbmQgREIyNSBhcmUgbm90ZWQgb24gdGhlIHBsdWcgKHF1aXRlIHNtYWxsOikuIEZvcgogICogUkoxMCwgaXQncyBsaWtlIHRoaXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sb2NvbW9rYmQuYwppbmRleCBkM2U5ZGQ2Li44OTM1MjkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xvY29tb2tiZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG9jb21va2JkLmMKQEAgLTQyLDcgKzQyLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiTG9Db01vIGtleWJvYXJkIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0jZGVmaW5lIExPQ09NT0tCRF9OVU1LRVlTIAkxMjgKKyNkZWZpbmUgTE9DT01PS0JEX05VTUtFWVMJMTI4CiAKICNkZWZpbmUgS0VZX0FDVElWSVRZCQlLRVlfRjE2CiAjZGVmaW5lIEtFWV9DT05UQUNUCQlLRVlfRjE4CkBAIC02MSw3ICs2MSw3IEBACiAJS0VZX0csIEtFWV9GLCBLRVlfWCwgS0VZX1MsIDAsIDAsIDAsIDAsIDAsIDAsCQkJCS8qIDkwIC0gOTkgKi8KIAkwLCAwLCBLRVlfRE9ULCAwLCBLRVlfQ09NTUEsIEtFWV9OLCBLRVlfQiwgS0VZX0MsIEtFWV9aLCBLRVlfQSwJCS8qIDEwMCAtIDEwOSAqLwogCUtFWV9MRUZUU0hJRlQsIEtFWV9UQUIsIEtFWV9MRUZUQ1RSTCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJCS8qIDExMCAtIDExOSAqLwotCUtFWV9NLCBLRVlfU1BBQ0UsIEtFWV9WLCBLRVlfQVBPU1RST1BIRSwgS0VZX1NMQVNILCAwLCAwLCAwIAkJLyogMTIwIC0gMTI4ICovCisJS0VZX00sIEtFWV9TUEFDRSwgS0VZX1YsIEtFWV9BUE9TVFJPUEhFLCBLRVlfU0xBU0gsIDAsIDAsIDAJCS8qIDEyMCAtIDEyOCAqLwogfTsKIAogI2RlZmluZSBLQl9ST1dTCQkJMTYKQEAgLTgyLDcgKzgyLDcgQEAKIAlzdHJ1Y3QgbG9jb21vX2RldiAqbGRldjsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CiAJc3BpbmxvY2tfdCBsb2NrOwotCQorCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwogCkBAIC05NSw3ICs5NSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbG9jb21va2JkX2FjdGl2YXRlX2FsbCh1bnNpZ25lZCBsb25nIG1lbWJhc2UpCiB7CiAJdW5zaWduZWQgbG9uZyByOwotCQorCiAJbG9jb21vX3dyaXRlbCgwLCBtZW1iYXNlICsgTE9DT01PX0tTQyk7CiAJciA9IGxvY29tb19yZWFkbChtZW1iYXNlICsgTE9DT01PX0tJQyk7CiAJciAmPSAweEZFRkY7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAqLwogCiAvKiBTY2FuIHRoZSBoYXJkd2FyZSBrZXlib2FyZCBhbmQgcHVzaCBhbnkgY2hhbmdlcyB1cCB0aHJvdWdoIHRoZSBpbnB1dCBsYXllciAqLwotc3RhdGljIHZvaWQgbG9jb21va2JkX3NjYW5rZXlib2FyZChzdHJ1Y3QgbG9jb21va2JkICpsb2NvbW9rYmQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKSAKK3N0YXRpYyB2b2lkIGxvY29tb2tiZF9zY2Fua2V5Ym9hcmQoc3RydWN0IGxvY29tb2tiZCAqbG9jb21va2JkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBpbnQgcm93LCBjb2wsIHJvd2QsIHNjYW5jb2RlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAogCWlmIChyZWdzKQogCQlpbnB1dF9yZWdzKCZsb2NvbW9rYmQtPmlucHV0LCByZWdzKTsKLQkKKwogCWxvY29tb2tiZF9jaGFyZ2VfYWxsKG1lbWJhc2UpOwogCiAJbnVtX3ByZXNzZWQgPSAwOwpAQCAtMTQ2LDkgKzE0Niw5IEBACiAKIAkJbG9jb21va2JkX2FjdGl2YXRlX2NvbChtZW1iYXNlLCBjb2wpOwogCQl1ZGVsYXkoS0JfREVMQVkpOwotCQkgCisKIAkJcm93ZCA9IH5sb2NvbW9fcmVhZGwobWVtYmFzZSArIExPQ09NT19LSUIpOwotCQlmb3IgKHJvdyA9IDA7IHJvdyA8IEtCX1JPV1M7IHJvdysrICkgeworCQlmb3IgKHJvdyA9IDA7IHJvdyA8IEtCX1JPV1M7IHJvdysrKSB7CiAJCQlzY2FuY29kZSA9IFNDQU5DT0RFKGNvbCwgcm93KTsKIAkJCWlmIChyb3dkICYgS0JfUk9XTUFTSyhyb3cpKSB7CiAJCQkJbnVtX3ByZXNzZWQgKz0gMTsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY29tb2tiZC0+bG9jaywgZmxhZ3MpOwogfQogCi0vKiAKKy8qCiAgKiBMb0NvTW8ga2V5Ym9hcmQgaW50ZXJydXB0IGhhbmRsZXIuCiAgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBsb2NvbW9rYmRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0yMDUsOCArMjA1LDggQEAKIAltZW1zZXQobG9jb21va2JkLCAwLCBzaXplb2Yoc3RydWN0IGxvY29tb2tiZCkpOwogCiAJLyogdHJ5IGFuZCBjbGFpbSBtZW1vcnkgcmVnaW9uICovCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oKHVuc2lnbmVkIGxvbmcpIGRldi0+bWFwYmFzZSwgCi0JCQkJZGV2LT5sZW5ndGgsIAorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKCh1bnNpZ25lZCBsb25nKSBkZXYtPm1hcGJhc2UsCisJCQkJZGV2LT5sZW5ndGgsCiAJCQkJTE9DT01PX0RSSVZFUl9OQU1FKGRldikpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJcHJpbnRrKEtFUk5fRVJSICJsb2NvbW9rYmQ6IENhbid0IGFjcXVpcmUgYWNjZXNzIHRvIGlvIG1lbW9yeSBmb3Iga2V5Ym9hcmRcbiIpOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJbG9jb21va2JkLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGxvY29tb2tiZDsKIAogCWxvY29tb2tiZC0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRVApOwotCQorCiAJaW5pdF9pbnB1dF9kZXYoJmxvY29tb2tiZC0+aW5wdXQpOwogCWxvY29tb2tiZC0+aW5wdXQua2V5Y29kZSA9IGxvY29tb2tiZC0+a2V5Y29kZTsKIAlsb2NvbW9rYmQtPmlucHV0LmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwpAQCAtMjcxLDExICsyNzEsMTEgQEAKIHN0YXRpYyBpbnQgbG9jb21va2JkX3JlbW92ZShzdHJ1Y3QgbG9jb21vX2RldiAqZGV2KQogewogCXN0cnVjdCBsb2NvbW9rYmQgKmxvY29tb2tiZCA9IGxvY29tb19nZXRfZHJ2ZGF0YShkZXYpOwotCQorCiAJZnJlZV9pcnEoZGV2LT5pcnFbMF0sIGxvY29tb2tiZCk7CiAKIAlkZWxfdGltZXJfc3luYygmbG9jb21va2JkLT50aW1lcik7Ci0JCisKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmbG9jb21va2JkLT5pbnB1dCk7CiAJbG9jb21vX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbWFwbGVfa2V5Yi5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKaW5kZXggODU5ZWQ3Ny4uZWVjYmRlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9tYXBsZV9rZXliLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoJJElkOiBtYXBsZV9rZXliLmMsdiAxLjQgMjAwNC8wMy8yMiAwMToxODoxNSBsZXRoYWwgRXhwICQKLSAqIAlTRUdBIERyZWFtY2FzdCBrZXlib2FyZCBkcml2ZXIKKyAqCVNFR0EgRHJlYW1jYXN0IGtleWJvYXJkIGRyaXZlcgogICoJQmFzZWQgb24gZHJpdmVycy91c2IvdXNia2JkLmMKICAqLwogCkBAIC00MCw3ICs0MCw2IEBACiAJc3RydWN0IGlucHV0X2RldiBkZXY7CiAJdW5zaWduZWQgY2hhciBuZXdbOF07CiAJdW5zaWduZWQgY2hhciBvbGRbOF07Ci0JaW50IG9wZW47CiB9OwogCiAKQEAgLTk1LDIyICs5NCw2IEBACiAJfQogfQogCi0KLXN0YXRpYyBpbnQgZGNfa2JkX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBkY19rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKLQlrYmQtPm9wZW4rKzsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkY19rYmRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBkY19rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKLQlrYmQtPm9wZW4tLTsKLX0KLQotCiBzdGF0aWMgaW50IGRjX2tiZF9jb25uZWN0KHN0cnVjdCBtYXBsZV9kZXZpY2UgKmRldikKIHsKIAlpbnQgaTsKQEAgLTEzMyw5ICsxMTYsNiBAQAogCWNsZWFyX2JpdCgwLCBrYmQtPmRldi5rZXliaXQpOwogCiAJa2JkLT5kZXYucHJpdmF0ZSA9IGtiZDsKLQlrYmQtPmRldi5vcGVuID0gZGNfa2JkX29wZW47Ci0Ja2JkLT5kZXYuY2xvc2UgPSBkY19rYmRfY2xvc2U7Ci0Ja2JkLT5kZXYuZXZlbnQgPSBOVUxMOwogCiAJa2JkLT5kZXYubmFtZSA9IGRldi0+cHJvZHVjdF9uYW1lOwogCWtiZC0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfTUFQTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKaW5kZXggMTU4YzhlOC4uOTg3MTA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYwpAQCAtMjk4LDkgKzI5OCwxMSBAQAogCS8qIGNoZWNrIGlmIGFic21pbi9hYnNtYXgvYWJzZnV6ei9hYnNmbGF0IGFyZSBmaWxsZWQgYXMKIAkgKiB0b2xkIGluIERvY3VtZW50YXRpb24vaW5wdXQvaW5wdXQtcHJvZ3JhbW1pbmcudHh0ICovCiAJaWYgKHRlc3RfYml0KEVWX0FCUywgZGV2LT5ldmJpdCkpIHsKLQkJcmV0dmFsID0gdWlucHV0X3ZhbGlkYXRlX2Fic2JpdHMoZGV2KTsKLQkJaWYgKHJldHZhbCA8IDApCisJCWludCBlcnIgPSB1aW5wdXRfdmFsaWRhdGVfYWJzYml0cyhkZXYpOworCQlpZiAoZXJyIDwgMCkgeworCQkJcmV0dmFsID0gZXJyOwogCQkJa2ZyZWUoZGV2LT5uYW1lKTsKKwkJfQogCX0KIAogZXhpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L21vdXNlL01ha2VmaWxlCmluZGV4IGE3ODY0MTkuLmM0OTA5YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9NYWtlZmlsZQpAQCAtMTUsNCArMTUsNCBAQAogb2JqLSQoQ09ORklHX01PVVNFX0hJTCkJCSs9IGhpbF9wdHIubwogb2JqLSQoQ09ORklHX01PVVNFX1ZTWFhYQUEpCSs9IHZzeHh4YWEubwogCi1wc21vdXNlLW9ianMgIDo9IHBzbW91c2UtYmFzZS5vIGFscHMubyBsb2dpcHMycHAubyBzeW5hcHRpY3MubworcHNtb3VzZS1vYmpzICA6PSBwc21vdXNlLWJhc2UubyBhbHBzLm8gbG9naXBzMnBwLm8gc3luYXB0aWNzLm8gbGlmZWJvb2subwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwppbmRleCA3YmY0YmU3Li5hMTJlOTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYwpAQCAtMzAsMTAgKzMwLDExIEBACiAKICNkZWZpbmUgQUxQU19EVUFMUE9JTlQJMHgwMQogI2RlZmluZSBBTFBTX1dIRUVMCTB4MDIKLSNkZWZpbmUgQUxQU19GV19CSwkweDA0CisjZGVmaW5lIEFMUFNfRldfQktfMQkweDA0CiAjZGVmaW5lIEFMUFNfNEJUTgkweDA4CiAjZGVmaW5lIEFMUFNfT0xEUFJPVE8JMHgxMAogI2RlZmluZSBBTFBTX1BBU1MJMHgyMAorI2RlZmluZSBBTFBTX0ZXX0JLXzIJMHg0MAogCiBzdGF0aWMgc3RydWN0IGFscHNfbW9kZWxfaW5mbyBhbHBzX21vZGVsX2RhdGFbXSA9IHsKIAl7IHsgMHgzMywgMHgwMiwgMHgwYSB9LAkweDg4LCAweGY4LCBBTFBTX09MRFBST1RPIH0sCQkvKiBVTUFYLTUzMFQgKi8KQEAgLTQzLDExICs0NCwxMSBAQAogCXsgeyAweDYzLCAweDAyLCAweDE0IH0sCTB4ZjgsIDB4ZjgsIDAgfSwKIAl7IHsgMHg2MywgMHgwMiwgMHgyOCB9LAkweGY4LCAweGY4LCAwIH0sCiAJeyB7IDB4NjMsIDB4MDIsIDB4M2MgfSwJMHg4ZiwgMHg4ZiwgQUxQU19XSEVFTCB9LAkJLyogVG9zaGliYSBTYXRlbGxpdGUgUzI0MDAtMTAzICovCi0JeyB7IDB4NjMsIDB4MDIsIDB4NTAgfSwJMHhlZiwgMHhlZiwgQUxQU19GV19CSyB9LAkJLyogTkVDIFZlcnNhIEwzMjAgKi8KKwl7IHsgMHg2MywgMHgwMiwgMHg1MCB9LAkweGVmLCAweGVmLCBBTFBTX0ZXX0JLXzEgfSwJCS8qIE5FQyBWZXJzYSBMMzIwICovCiAJeyB7IDB4NjMsIDB4MDIsIDB4NjQgfSwJMHhmOCwgMHhmOCwgMCB9LAogCXsgeyAweDYzLCAweDAzLCAweGM4IH0sIDB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB9LAkJLyogRGVsbCBMYXRpdHVkZSBEODAwICovCiAJeyB7IDB4NzMsIDB4MDIsIDB4MGEgfSwJMHhmOCwgMHhmOCwgMCB9LAotCXsgeyAweDczLCAweDAyLCAweDE0IH0sCTB4ZjgsIDB4ZjgsIDAgfSwKKwl7IHsgMHg3MywgMHgwMiwgMHgxNCB9LAkweGY4LCAweGY4LCBBTFBTX0ZXX0JLXzIgfSwJCS8qIEFodGVjIExhcHRvcCAqLwogCXsgeyAweDIwLCAweDAyLCAweDBlIH0sCTB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UIH0sIC8qIFhYWCAqLwogCXsgeyAweDIyLCAweDAyLCAweDBhIH0sCTB4ZjgsIDB4ZjgsIEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UIH0sCiAJeyB7IDB4MjIsIDB4MDIsIDB4MTQgfSwgMHhmZiwgMHhmZiwgQUxQU19QQVNTIHwgQUxQU19EVUFMUE9JTlQgfSwgLyogRGVsbCBMYXRpdHVkZSBENjAwICovCkBAIC02MSwxMSArNjIsMTEgQEAKIAogLyoKICAqIEFMUFMgYWJvbHV0ZSBNb2RlIC0gbmV3IGZvcm1hdAotICogCi0gKiBieXRlIDA6ICAxICAgID8gICAgPyAgICA/ICAgIDEgICAgPyAgICA/ICAgID8gCisgKgorICogYnl0ZSAwOiAgMSAgICA/ICAgID8gICAgPyAgICAxICAgID8gICAgPyAgICA/CiAgKiBieXRlIDE6ICAwICAgeDYgICB4NSAgIHg0ICAgeDMgICB4MiAgIHgxICAgeDAKICAqIGJ5dGUgMjogIDAgICB4MTAgIHg5ICAgeDggICB4NyAgICA/ICBmaW4gIGdlcwotICogYnl0ZSAzOiAgMCAgIHk5ICAgeTggICB5NyAgICAxICAgIE0gICAgUiAgICBMIAorICogYnl0ZSAzOiAgMCAgIHk5ICAgeTggICB5NyAgICAxICAgIE0gICAgUiAgICBMCiAgKiBieXRlIDQ6ICAwICAgeTYgICB5NSAgIHk0ICAgeTMgICB5MiAgIHkxICAgeTAKICAqIGJ5dGUgNTogIDAgICB6NiAgIHo1ICAgejQgICB6MyAgIHoyICAgejEgICB6MAogICoKQEAgLTgxLDExICs4MiwxMiBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZwc21vdXNlLT5kZXY7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2MiA9ICZwcml2LT5kZXYyOwogCWludCB4LCB5LCB6LCBnZXMsIGZpbiwgbGVmdCwgcmlnaHQsIG1pZGRsZTsKKwlpbnQgYmFjayA9IDAsIGZvcndhcmQgPSAwOwogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwogCiAJaWYgKChwYWNrZXRbMF0gJiAweGM4KSA9PSAweDA4KSB7ICAgLyogMy1ieXRlIFBTLzIgcGFja2V0ICovCi0JCWlucHV0X3JlcG9ydF9rZXkoZGV2MiwgQlROX0xFRlQsICAgcGFja2V0WzBdICYgMSk7ICAgIAorCQlpbnB1dF9yZXBvcnRfa2V5KGRldjIsIEJUTl9MRUZULCAgIHBhY2tldFswXSAmIDEpOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldjIsIEJUTl9SSUdIVCwgIHBhY2tldFswXSAmIDIpOwogCQlpbnB1dF9yZXBvcnRfa2V5KGRldjIsIEJUTl9NSURETEUsIHBhY2tldFswXSAmIDQpOwogCQlpbnB1dF9yZXBvcnRfcmVsKGRldjIsIFJFTF9YLApAQCAtMTEyLDYgKzExNCwxOCBAQAogCQl6ID0gcGFja2V0WzVdOwogCX0KIAorCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfRldfQktfMSkgeworCQliYWNrID0gcGFja2V0WzJdICYgNDsKKwkJZm9yd2FyZCA9IHBhY2tldFswXSAmIDB4MTA7CisJfQorCisJaWYgKHByaXYtPmktPmZsYWdzICYgQUxQU19GV19CS18yKSB7CisJCWJhY2sgPSBwYWNrZXRbM10gJiA0OworCQlmb3J3YXJkID0gcGFja2V0WzJdICYgNDsKKwkJaWYgKChtaWRkbGUgPSBmb3J3YXJkICYmIGJhY2spKQorCQkJZm9yd2FyZCA9IGJhY2sgPSAwOworCX0KKwogCWdlcyA9IHBhY2tldFsyXSAmIDE7CiAJZmluID0gcGFja2V0WzJdICYgMjsKIApAQCAtMTU1LDEzICsxNjksMTIgQEAKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1BSRVNTVVJFLCB6KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCB6ID4gMCk7CiAKLQogCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfV0hFRUwpCiAJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsICgocGFja2V0WzBdID4+IDQpICYgMHgwNykgfCAoKHBhY2tldFsyXSA+PiAyKSAmIDB4MDgpKTsKIAotCWlmIChwcml2LT5pLT5mbGFncyAmIEFMUFNfRldfQkspIHsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9GT1JXQVJELCBwYWNrZXRbMF0gJiAweDEwKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCBwYWNrZXRbMl0gJiAweDA0KTsKKwlpZiAocHJpdi0+aS0+ZmxhZ3MgJiAoQUxQU19GV19CS18xIHwgQUxQU19GV19CS18yKSkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0ZPUldBUkQsIGZvcndhcmQpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0JBQ0ssIGJhY2spOwogCX0KIAogCWlucHV0X3N5bmMoZGV2KTsKQEAgLTI1Nyw3ICsyNzAsNiBAQAogc3RhdGljIGludCBhbHBzX3Bhc3N0aHJvdWdoX21vZGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGludCBlbmFibGUpCiB7CiAJc3RydWN0IHBzMmRldiAqcHMyZGV2ID0gJnBzbW91c2UtPnBzMmRldjsKLQl1bnNpZ25lZCBjaGFyIHBhcmFtWzNdOwogCWludCBjbWQgPSBlbmFibGUgPyBQU01PVVNFX0NNRF9TRVRTQ0FMRTIxIDogUFNNT1VTRV9DTURfU0VUU0NBTEUxMTsKIAogCWlmIChwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIGNtZCkgfHwKQEAgLTI2Nyw3ICsyNzksNyBAQAogCQlyZXR1cm4gLTE7CiAKIAkvKiB3ZSBtYXkgZ2V0IDMgbW9yZSBieXRlcywganVzdCBpZ25vcmUgdGhlbSAqLwotCXBzMl9jb21tYW5kKHBzMmRldiwgcGFyYW0sIDB4MDMwMCk7CisJcHMyX2RyYWluKHBzMmRldiwgMywgMTAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDI1LDcgKzQzNyw3IEBACiAJCXBzbW91c2UtPmRldi5yZWxiaXRbTE9ORyhSRUxfV0hFRUwpXSB8PSBCSVQoUkVMX1dIRUVMKTsKIAl9CiAKLQlpZiAocHJpdi0+aS0+ZmxhZ3MgJiBBTFBTX0ZXX0JLKSB7CisJaWYgKHByaXYtPmktPmZsYWdzICYgKEFMUFNfRldfQktfMSB8IEFMUFNfRldfQktfMikpIHsKIAkJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9GT1JXQVJEKV0gfD0gQklUKEJUTl9GT1JXQVJEKTsKIAkJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9CQUNLKV0gfD0gQklUKEJUTl9CQUNLKTsKIAl9CkBAIC00MzYsOCArNDQ4LDggQEAKIAlwcml2LT5kZXYyLmlkLmJ1c3R5cGUgPSBCVVNfSTgwNDI7CiAJcHJpdi0+ZGV2Mi5pZC52ZW5kb3IgPSAweDAwMDI7CiAJcHJpdi0+ZGV2Mi5pZC5wcm9kdWN0ID0gUFNNT1VTRV9BTFBTOwotCXByaXYtPmRldjIuaWQudmVyc2lvbiA9IDB4MDAwMDsgCi0JCisJcHJpdi0+ZGV2Mi5pZC52ZXJzaW9uID0gMHgwMDAwOworCiAJcHJpdi0+ZGV2Mi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CiAJcHJpdi0+ZGV2Mi5yZWxiaXRbTE9ORyhSRUxfWCldIHw9IEJJVChSRUxfWCkgfCBCSVQoUkVMX1kpOwogCXByaXYtPmRldjIua2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9SSUdIVCk7CkBAIC00NjEsMTcgKzQ3MywxNSBAQAogaW50IGFscHNfZGV0ZWN0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCBpbnQgc2V0X3Byb3BlcnRpZXMpCiB7CiAJaW50IHZlcnNpb247Ci0Jc3RydWN0IGFscHNfbW9kZWxfaW5mbyAqbW9kZWw7IAorCXN0cnVjdCBhbHBzX21vZGVsX2luZm8gKm1vZGVsOwogCiAJaWYgKCEobW9kZWwgPSBhbHBzX2dldF9tb2RlbChwc21vdXNlLCAmdmVyc2lvbikpKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKIAkJcHNtb3VzZS0+dmVuZG9yID0gIkFMUFMiOwotCQlpZiAobW9kZWwtPmZsYWdzICYgQUxQU19EVUFMUE9JTlQpIAotCQkJcHNtb3VzZS0+bmFtZSA9ICJEdWFsUG9pbnQgVG91Y2hQYWQiOwotCQllbHNlCi0JCQlwc21vdXNlLT5uYW1lID0gIkdsaWRlUG9pbnQiOworCQlwc21vdXNlLT5uYW1lID0gbW9kZWwtPmZsYWdzICYgQUxQU19EVUFMUE9JTlQgPworCQkJCSJEdWFsUG9pbnQgVG91Y2hQYWQiIDogIkdsaWRlUG9pbnQiOwogCQlwc21vdXNlLT5tb2RlbCA9IHZlcnNpb247CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbWltb3VzZS5jCmluZGV4IDdiYWEwOWMuLmU5OTQ4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYW1pbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2FtaW1vdXNlLmMKQEAgLTMzLDcgKzMzLDYgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQW1pZ2EgbW91c2UgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgYW1pbW91c2VfdXNlZCA9IDA7CiBzdGF0aWMgaW50IGFtaW1vdXNlX2xhc3R4LCBhbWltb3VzZV9sYXN0eTsKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGFtaW1vdXNlX2RldjsKIApAQCAtODEsMTYgKzgwLDEyIEBACiB7CiAJdW5zaWduZWQgc2hvcnQgam95MGRhdDsKIAotICAgICAgICBpZiAoYW1pbW91c2VfdXNlZCsrKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCiAJam95MGRhdCA9IGN1c3RvbS5qb3kwZGF0OwogCiAJYW1pbW91c2VfbGFzdHggPSBqb3kwZGF0ICYgMHhmZjsKIAlhbWltb3VzZV9sYXN0eSA9IGpveTBkYXQgPj4gODsKIAogCWlmIChyZXF1ZXN0X2lycShJUlFfQU1JR0FfVkVSVEIsIGFtaW1vdXNlX2ludGVycnVwdCwgMCwgImFtaW1vdXNlIiwgYW1pbW91c2VfaW50ZXJydXB0KSkgewotICAgICAgICAgICAgICAgIGFtaW1vdXNlX3VzZWQtLTsKICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImFtaW1vdXNlLmM6IENhbid0IGFsbG9jYXRlIGlycSAlZFxuIiwgSVJRX0FNSUdBX1ZFUlRCKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwogICAgICAgICB9CkBAIC0xMDAsOCArOTUsNyBAQAogCiBzdGF0aWMgdm9pZCBhbWltb3VzZV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0gICAgICAgIGlmICghLS1hbWltb3VzZV91c2VkKQotCQlmcmVlX2lycShJUlFfQU1JR0FfVkVSVEIsIGFtaW1vdXNlX2ludGVycnVwdCk7CisJZnJlZV9pcnEoSVJRX0FNSUdBX1ZFUlRCLCBhbWltb3VzZV9pbnRlcnJ1cHQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhbWltb3VzZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2lucG9ydC5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9pbnBvcnQuYwppbmRleCBjYTRlOTY4Li4xZjYyYzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2lucG9ydC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaW5wb3J0LmMKQEAgLTE3LDE4ICsxNywxOCBAQAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKKyAqCiAgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKQEAgLTg3LDI5ICs4NywyMyBAQAogCiBfX29ic29sZXRlX3NldHVwKCJpbnBvcnRfaXJxPSIpOwogCi1zdGF0aWMgaW50IGlucG9ydF91c2VkOwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgaW5wb3J0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogc3RhdGljIGludCBpbnBvcnRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0JaWYgKCFpbnBvcnRfdXNlZCsrKSB7Ci0JCWlmIChyZXF1ZXN0X2lycShpbnBvcnRfaXJxLCBpbnBvcnRfaW50ZXJydXB0LCAwLCAiaW5wb3J0IiwgTlVMTCkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCQlvdXRiKElOUE9SVF9SRUdfTU9ERSwgSU5QT1JUX0NPTlRST0xfUE9SVCk7Ci0JCW91dGIoSU5QT1JUX01PREVfSVJRIHwgSU5QT1JUX01PREVfQkFTRSwgSU5QT1JUX0RBVEFfUE9SVCk7Ci0JfQorCWlmIChyZXF1ZXN0X2lycShpbnBvcnRfaXJxLCBpbnBvcnRfaW50ZXJydXB0LCAwLCAiaW5wb3J0IiwgTlVMTCkpCisJCXJldHVybiAtRUJVU1k7CisJb3V0YihJTlBPUlRfUkVHX01PREUsIElOUE9SVF9DT05UUk9MX1BPUlQpOworCW91dGIoSU5QT1JUX01PREVfSVJRIHwgSU5QT1JUX01PREVfQkFTRSwgSU5QT1JUX0RBVEFfUE9SVCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaW5wb3J0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlpZiAoIS0taW5wb3J0X3VzZWQpIHsKLQkJb3V0YihJTlBPUlRfUkVHX01PREUsIElOUE9SVF9DT05UUk9MX1BPUlQpOwotCQlvdXRiKElOUE9SVF9NT0RFX0JBU0UsIElOUE9SVF9EQVRBX1BPUlQpOwotCQlmcmVlX2lycShpbnBvcnRfaXJxLCBOVUxMKTsKLQl9CisJb3V0YihJTlBPUlRfUkVHX01PREUsIElOUE9SVF9DT05UUk9MX1BPUlQpOworCW91dGIoSU5QT1JUX01PREVfQkFTRSwgSU5QT1JUX0RBVEFfUE9SVCk7CisJZnJlZV9pcnEoaW5wb3J0X2lycSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IGlucG9ydF9kZXYgPSB7CkBAIC0xMjAsMTEgKzExNCwxMSBAQAogCS5jbG9zZQk9IGlucG9ydF9jbG9zZSwKIAkubmFtZQk9IElOUE9SVF9OQU1FLAogCS5waHlzCT0gImlzYTAyM2MvaW5wdXQwIiwKLQkuaWQgPSB7IAotIAkJLmJ1c3R5cGUgPSBCVVNfSVNBLAotICAgICAgICAJLnZlbmRvciAgPSBJTlBPUlRfVkVORE9SLAotICAgICAgICAJLnByb2R1Y3QgPSAweDAwMDEsCi0gICAgICAgIAkudmVyc2lvbiA9IDB4MDEwMCwKKwkuaWQgPSB7CisJCS5idXN0eXBlID0gQlVTX0lTQSwKKwkJLnZlbmRvciAgPSBJTlBPUlRfVkVORE9SLAorCQkucHJvZHVjdCA9IDB4MDAwMSwKKwkJLnZlcnNpb24gPSAweDAxMDAsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDlkZjliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogRnVqaXRzdSBCLXNlcmllcyBMaWZlYm9vayBQUy8yIFRvdWNoU2NyZWVuIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBWb2p0ZWNoIFBhdmxpayA8dm9qdGVjaEBzdXNlLmN6PgorICogQ29weXJpZ2h0IChjKSAyMDA1IEtlbmFuIEVzYXUgPGtlbmFuLmVzYXVAY29uYW4uZGU+CisgKgorICogVG91Y2hTY3JlZW4gZGV0ZWN0aW9uLCBhYnNvbHV0ZSBtb2RlIHNldHRpbmcgYW5kIHBhY2tldCBsYXlvdXQgaXMgdGFrZW4gZnJvbQorICogSGFyYWxkIEhveWVyJ3MgZGVzY3JpcHRpb24gb2YgdGhlIGRldmljZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CisjaW5jbHVkZSA8bGludXgvbGlicHMyLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisKKyNpbmNsdWRlICJwc21vdXNlLmgiCisjaW5jbHVkZSAibGlmZWJvb2suaCIKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGxpZmVib29rX2RtaV90YWJsZVtdID0geworICAgICAgIHsKKyAgICAgICAgICAgICAgIC5pZGVudCA9ICJMaWZlYm9vayBCIiwKKyAgICAgICAgICAgICAgIC5tYXRjaGVzID0geworICAgICAgICAgICAgICAgICAgICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxJRkVCT09LIEIgU2VyaWVzIiksCisgICAgICAgICAgICAgICB9LAorICAgICAgIH0sCisgICAgICAgeyB9Cit9OworCisKK3N0YXRpYyBwc21vdXNlX3JldF90IGxpZmVib29rX3Byb2Nlc3NfYnl0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZwc21vdXNlLT5kZXY7CisKKwlpZiAocHNtb3VzZS0+cGt0Y250ICE9IDMpCisJCXJldHVybiBQU01PVVNFX0dPT0RfREFUQTsKKworCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKKworCS8qIGNhbGN1bGF0ZSBYIGFuZCBZICovCisJaWYgKChwYWNrZXRbMF0gJiAweDA4KSA9PSAweDAwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwKKwkJCQkgKHBhY2tldFsxXSB8ICgocGFja2V0WzBdICYgMHgzMCkgPDwgNCkpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAorCQkJCSAxMDI0IC0gKHBhY2tldFsyXSB8ICgocGFja2V0WzBdICYgMHhDMCkgPDwgMikpKTsKKwl9IGVsc2UgeworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsCisJCQkJKChwYWNrZXRbMF0gJiAweDEwKSA/IHBhY2tldFsxXSAtIDI1NiA6IHBhY2tldFsxXSkpOworCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksCisJCQkJIC0oaW50KSgocGFja2V0WzBdICYgMHgyMCkgPyBwYWNrZXRbMl0gLSAyNTYgOiBwYWNrZXRbMl0pKTsKKwl9CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIHBhY2tldFswXSAmIDB4MDEpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIHBhY2tldFswXSAmIDB4MDIpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIHBhY2tldFswXSAmIDB4MDQpOworCisJaW5wdXRfc3luYyhkZXYpOworCisJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7Cit9CisKK3N0YXRpYyBpbnQgbGlmZWJvb2tfYWJzb2x1dGVfbW9kZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKK3sKKwlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmcHNtb3VzZS0+cHMyZGV2OworCXVuc2lnbmVkIGNoYXIgcGFyYW07CisKKwlpZiAocHNtb3VzZV9yZXNldChwc21vdXNlKSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgICBFbmFibGUgYWJzb2x1dGUgb3V0cHV0IC0tIHBzMl9jb21tYW5kIGZhaWxzIGFsd2F5cyBidXQgaWYKKwkgICB5b3UgbGVhdmUgdGhpcyBjYWxsIG91dCB0aGUgdG91Y2hzcmVlbiB3aWxsIG5ldmVyIHNlbmQKKwkgICBhYnNvbHV0ZSBjb29yZGluYXRlcworCSovCisJcGFyYW0gPSAweDA3OworCXBzMl9jb21tYW5kKHBzMmRldiwgJnBhcmFtLCBQU01PVVNFX0NNRF9TRVRSRVMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxpZmVib29rX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbikKK3sKKwl1bnNpZ25lZCBjaGFyIHBhcmFtc1tdID0geyAwLCAxLCAyLCAyLCAzIH07CisKKwlpZiAocmVzb2x1dGlvbiA9PSAwIHx8IHJlc29sdXRpb24gPiA0MDApCisJCXJlc29sdXRpb24gPSA0MDA7CisKKwlwczJfY29tbWFuZCgmcHNtb3VzZS0+cHMyZGV2LCAmcGFyYW1zW3Jlc29sdXRpb24gLyAxMDBdLCBQU01PVVNFX0NNRF9TRVRSRVMpOworCXBzbW91c2UtPnJlc29sdXRpb24gPSA1MCA8PCBwYXJhbXNbcmVzb2x1dGlvbiAvIDEwMF07Cit9CisKK3N0YXRpYyB2b2lkIGxpZmVib29rX2Rpc2Nvbm5lY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKK30KKworaW50IGxpZmVib29rX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKQoreworICAgICAgICBpZiAoIWRtaV9jaGVja19zeXN0ZW0obGlmZWJvb2tfZG1pX3RhYmxlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKwlpZiAoc2V0X3Byb3BlcnRpZXMpIHsKKwkJcHNtb3VzZS0+dmVuZG9yID0gIkZ1aml0c3UiOworCQlwc21vdXNlLT5uYW1lID0gIkxpZmVib29rIFRvdWNoU2NyZWVuIjsKKwl9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBsaWZlYm9va19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCWlmIChsaWZlYm9va19hYnNvbHV0ZV9tb2RlKHBzbW91c2UpKQorCQlyZXR1cm4gLTE7CisKKwlwc21vdXNlLT5kZXYuZXZiaXRbMF0gPSBCSVQoRVZfQUJTKSB8IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CisJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9MRUZUKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9NSURETEUpIHwgQklUKEJUTl9SSUdIVCk7CisJcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9UT1VDSCldID0gQklUKEJUTl9UT1VDSCk7CisJcHNtb3VzZS0+ZGV2LnJlbGJpdFswXSA9IEJJVChSRUxfWCkgfCBCSVQoUkVMX1kpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZwc21vdXNlLT5kZXYsIEFCU19YLCAwLCAxMDI0LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcygmcHNtb3VzZS0+ZGV2LCBBQlNfWSwgMCwgMTAyNCwgMCwgMCk7CisKKwlwc21vdXNlLT5wcm90b2NvbF9oYW5kbGVyID0gbGlmZWJvb2tfcHJvY2Vzc19ieXRlOworCXBzbW91c2UtPnNldF9yZXNvbHV0aW9uID0gbGlmZWJvb2tfc2V0X3Jlc29sdXRpb247CisJcHNtb3VzZS0+ZGlzY29ubmVjdCA9IGxpZmVib29rX2Rpc2Nvbm5lY3Q7CisJcHNtb3VzZS0+cmVjb25uZWN0ICA9IGxpZmVib29rX2Fic29sdXRlX21vZGU7CisJcHNtb3VzZS0+cGt0c2l6ZSA9IDM7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMWMwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIEZ1aml0c3UgQi1zZXJpZXMgTGlmZWJvb2sgUFMvMiBUb3VjaFNjcmVlbiBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVm9qdGVjaCBQYXZsaWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0xJRkVCT09LX0gKKyNkZWZpbmUgX0xJRkVCT09LX0gKKworaW50IGxpZmVib29rX2RldGVjdChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgaW50IHNldF9wcm9wZXJ0aWVzKTsKK2ludCBsaWZlYm9va19pbml0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2libS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9sb2dpYm0uYwppbmRleCA3N2ViODNlLi44YjUyNDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2xvZ2libS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbG9naWJtLmMKQEAgLTE4LDE4ICsxOCwxOCBAQAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKKyAqCiAgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKQEAgLTc3LDE2ICs3NywxMSBAQAogCiBfX29ic29sZXRlX3NldHVwKCJsb2dpYm1faXJxPSIpOwogCi1zdGF0aWMgaW50IGxvZ2libV91c2VkID0gMDsKLQogc3RhdGljIGlycXJldHVybl90IGxvZ2libV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIHN0YXRpYyBpbnQgbG9naWJtX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCWlmIChsb2dpYm1fdXNlZCsrKQotCQlyZXR1cm4gMDsKIAlpZiAocmVxdWVzdF9pcnEobG9naWJtX2lycSwgbG9naWJtX2ludGVycnVwdCwgMCwgImxvZ2libSIsIE5VTEwpKSB7Ci0JCWxvZ2libV91c2VkLS07CiAJCXByaW50ayhLRVJOX0VSUiAibG9naWJtLmM6IENhbid0IGFsbG9jYXRlIGlycSAlZFxuIiwgbG9naWJtX2lycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtOTYsOCArOTEsNiBAQAogCiBzdGF0aWMgdm9pZCBsb2dpYm1fY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCWlmICgtLWxvZ2libV91c2VkKQotCQlyZXR1cm47CiAJb3V0YihMT0dJQk1fRElTQUJMRV9JUlEsIExPR0lCTV9DT05UUk9MX1BPUlQpOwogCWZyZWVfaXJxKGxvZ2libV9pcnEsIE5VTEwpOwogfQpAQCAtMTY3LDcgKzE2MCw3IEBACiAJb3V0YihMT0dJQk1fRElTQUJMRV9JUlEsIExPR0lCTV9DT05UUk9MX1BPUlQpOwogCiAJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZsb2dpYm1fZGV2KTsKLQkKKwogCXByaW50ayhLRVJOX0lORk8gImlucHV0OiBMb2dpdGVjaCBidXMgbW91c2UgYXQgJSN4IGlycSAlZFxuIiwgTE9HSUJNX0JBU0UsIGxvZ2libV9pcnEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL21hcGxlbW91c2UuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbWFwbGVtb3VzZS5jCmluZGV4IDEyZGMwZWYuLmU5MGM2MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvbWFwbGVtb3VzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbWFwbGVtb3VzZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqCSRJZDogbWFwbGVtb3VzZS5jLHYgMS4yIDIwMDQvMDMvMjIgMDE6MTg6MTUgbGV0aGFsIEV4cCAkCi0gKiAJU0VHQSBEcmVhbWNhc3QgbW91c2UgZHJpdmVyCisgKglTRUdBIERyZWFtY2FzdCBtb3VzZSBkcml2ZXIKICAqCUJhc2VkIG9uIGRyaXZlcnMvdXNiL3VzYm1vdXNlLmMKICAqLwogCkBAIC0xNSw4MCArMTUsNTEgQEAKIE1PRFVMRV9BVVRIT1IoIllBRUdBU0hJIFRha2VzaGkgPHRAa2VzaGkub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTRUdBIERyZWFtY2FzdCBtb3VzZSBkcml2ZXIiKTsKIAotc3RydWN0IGRjX21vdXNlIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2IGRldjsKLQlpbnQgb3BlbjsKLX07Ci0KLQogc3RhdGljIHZvaWQgZGNfbW91c2VfY2FsbGJhY2soc3RydWN0IG1hcGxlcSAqbXEpCiB7CiAJaW50IGJ1dHRvbnMsIHJlbHgsIHJlbHksIHJlbHo7CiAJc3RydWN0IG1hcGxlX2RldmljZSAqbWFwbGVkZXYgPSBtcS0+ZGV2OwotCXN0cnVjdCBkY19tb3VzZSAqbW91c2UgPSBtYXBsZWRldi0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZtb3VzZS0+ZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IG1hcGxlZGV2LT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgY2hhciAqcmVzID0gbXEtPnJlY3ZidWY7CiAKIAlidXR0b25zID0gfnJlc1s4XTsKLQlyZWx4PSoodW5zaWduZWQgc2hvcnQgKikocmVzKzEyKS01MTI7Ci0JcmVseT0qKHVuc2lnbmVkIHNob3J0ICopKHJlcysxNCktNTEyOwotCXJlbHo9Kih1bnNpZ25lZCBzaG9ydCAqKShyZXMrMTYpLTUxMjsKKwlyZWx4ID0gKih1bnNpZ25lZCBzaG9ydCAqKShyZXMgKyAxMikgLSA1MTI7CisJcmVseSA9ICoodW5zaWduZWQgc2hvcnQgKikocmVzICsgMTQpIC0gNTEyOworCXJlbHogPSAqKHVuc2lnbmVkIHNob3J0ICopKHJlcyArIDE2KSAtIDUxMjsKIAotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBidXR0b25zJjQpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBidXR0b25zJjkpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBidXR0b25zJjIpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBidXR0b25zICYgNCk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGJ1dHRvbnMgJiA5KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgYnV0dG9ucyAmIDIpOwogCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfWCwgICAgICByZWx4KTsKIAlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1ksICAgICAgcmVseSk7CiAJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgIHJlbHopOwogCWlucHV0X3N5bmMoZGV2KTsKIH0KIAotCi1zdGF0aWMgaW50IGRjX21vdXNlX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQotewotCXN0cnVjdCBkY19tb3VzZSAqbW91c2UgPSBkZXYtPnByaXZhdGU7Ci0JbW91c2UtPm9wZW4rKzsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgdm9pZCBkY19tb3VzZV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGRjX21vdXNlICptb3VzZSA9IGRldi0+cHJpdmF0ZTsKLQltb3VzZS0+b3Blbi0tOwotfQotCi0KIHN0YXRpYyBpbnQgZGNfbW91c2VfY29ubmVjdChzdHJ1Y3QgbWFwbGVfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBkYXRhID0gYmUzMl90b19jcHUoZGV2LT5kZXZpbmZvLmZ1bmN0aW9uX2RhdGFbMF0pOwotCXN0cnVjdCBkY19tb3VzZSAqbW91c2U7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCi0JaWYgKCEobW91c2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGNfbW91c2UpLCBHRlBfS0VSTkVMKSkpCisJaWYgKCEoaW5wdXRfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2RldiksIEdGUF9LRVJORUwpKSkKIAkJcmV0dXJuIC0xOwotCW1lbXNldChtb3VzZSwgMCwgc2l6ZW9mKHN0cnVjdCBkY19tb3VzZSkpOwogCi0JZGV2LT5wcml2YXRlX2RhdGEgPSBtb3VzZTsKKwlkZXYtPnByaXZhdGVfZGF0YSA9IGlucHV0X2RldjsKIAotCW1vdXNlLT5kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOwotCW1vdXNlLT5kZXYua2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7Ci0JbW91c2UtPmRldi5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKSB8IEJJVChSRUxfV0hFRUwpOworCW1lbXNldChpbnB1dF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgZGNfbW91c2UpKTsKKwlpbml0X2lucHV0X2RldihpbnB1dF9kZXYpOworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7CisJaW5wdXRfZGV2LT5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKSB8IEJJVChSRUxfV0hFRUwpOwogCi0JaW5pdF9pbnB1dF9kZXYoJm1vdXNlLT5kZXYpOworCWlucHV0X2Rldi0+bmFtZSA9IGRldi0+cHJvZHVjdF9uYW1lOworCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19NQVBMRTsKIAotCW1vdXNlLT5kZXYucHJpdmF0ZSA9IG1vdXNlOwotCW1vdXNlLT5kZXYub3BlbiA9IGRjX21vdXNlX29wZW47Ci0JbW91c2UtPmRldi5jbG9zZSA9IGRjX21vdXNlX2Nsb3NlOwotCW1vdXNlLT5kZXYuZXZlbnQgPSBOVUxMOwotCi0JbW91c2UtPmRldi5uYW1lID0gZGV2LT5wcm9kdWN0X25hbWU7Ci0JbW91c2UtPmRldi5pZC5idXN0eXBlID0gQlVTX01BUExFOwotCQotCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmbW91c2UtPmRldik7CisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CiAKIAltYXBsZV9nZXRjb25kX2NhbGxiYWNrKGRldiwgZGNfbW91c2VfY2FsbGJhY2ssIDEsIE1BUExFX0ZVTkNfTU9VU0UpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6IG1vdXNlKDB4JWx4KTogJXNcbiIsIGRhdGEsIG1vdXNlLT5kZXYubmFtZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6IG1vdXNlKDB4JWx4KTogJXNcbiIsIGRhdGEsIGlucHV0X2Rldi0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk2LDEwICs2NywxMCBAQAogCiBzdGF0aWMgdm9pZCBkY19tb3VzZV9kaXNjb25uZWN0KHN0cnVjdCBtYXBsZV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZGNfbW91c2UgKm1vdXNlID0gZGV2LT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gZGV2LT5wcml2YXRlX2RhdGE7CiAKLQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmbW91c2UtPmRldik7Ci0Ja2ZyZWUobW91c2UpOworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJa2ZyZWUoaW5wdXRfZGV2KTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BjMTEwcGFkLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BjMTEwcGFkLmMKaW5kZXggMGM3NDkxOC4uOTMzOTNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9wYzExMHBhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcGMxMTBwYWQuYwpAQCAtNCw3ICs0LDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBWb2p0ZWNoIFBhdmxpawogICoKICAqICBCYXNlZCBvbiB0aGUgd29yayBvZjoKLSAqCUFsYW4gQ294CVJvYmluIE8nTGVhcnkJCisgKglBbGFuIENveAlSb2JpbiBPJ0xlYXJ5CiAgKi8KIAogLyoKQEAgLTU2LDcgKzU2LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgaW5wdXRfZGV2IHBjMTEwcGFkX2RldjsKIHN0YXRpYyBpbnQgcGMxMTBwYWRfZGF0YVszXTsKIHN0YXRpYyBpbnQgcGMxMTBwYWRfY291bnQ7Ci1zdGF0aWMgaW50IHBjMTEwcGFkX3VzZWQ7CiAKIHN0YXRpYyBjaGFyICpwYzExMHBhZF9uYW1lID0gIklCTSBQQzExMCBUb3VjaFBhZCI7CiBzdGF0aWMgY2hhciAqcGMxMTBwYWRfcGh5cyA9ICJpc2ExNWUwL2lucHV0MCI7CkBAIC03NCw3ICs3Myw3IEBACiAKIAlpZiAocGMxMTBwYWRfY291bnQgPCAzKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCisKIAlpbnB1dF9yZWdzKCZwYzExMHBhZF9kZXYsIHJlZ3MpOwogCWlucHV0X3JlcG9ydF9rZXkoJnBjMTEwcGFkX2RldiwgQlROX1RPVUNILAogCQlwYzExMHBhZF9kYXRhWzBdICYgMHgwMSk7CkBAIC05MCwxNSArODksMTEgQEAKIAogc3RhdGljIHZvaWQgcGMxMTBwYWRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCWlmICghLS1wYzExMHBhZF91c2VkKQotCQlvdXRiKFBDMTEwUEFEX09GRiwgcGMxMTBwYWRfaW8gKyAyKTsKKwlvdXRiKFBDMTEwUEFEX09GRiwgcGMxMTBwYWRfaW8gKyAyKTsKIH0KIAogc3RhdGljIGludCBwYzExMHBhZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlpZiAocGMxMTBwYWRfdXNlZCsrKQotCQlyZXR1cm4gMDsKLQogCXBjMTEwcGFkX2ludGVycnVwdCgwLE5VTEwsTlVMTCk7CiAJcGMxMTBwYWRfaW50ZXJydXB0KDAsTlVMTCxOVUxMKTsKIAlwYzExMHBhZF9pbnRlcnJ1cHQoMCxOVUxMLE5VTEwpOwpAQCAtMTQ1LDcgKzE0MCw3IEBACiAKIAlwYzExMHBhZF9kZXYuYWJzbWF4W0FCU19YXSA9IDB4MWZmOwogCXBjMTEwcGFkX2Rldi5hYnNtYXhbQUJTX1ldID0gMHgwZmY7Ci0gICAgICAgIAorCiAJcGMxMTBwYWRfZGV2Lm9wZW4gPSBwYzExMHBhZF9vcGVuOwogICAgICAgICBwYzExMHBhZF9kZXYuY2xvc2UgPSBwYzExMHBhZF9jbG9zZTsKIApAQCAtMTU2LDE3ICsxNTEsMTcgQEAKIAlwYzExMHBhZF9kZXYuaWQucHJvZHVjdCA9IDB4MDAwMTsKIAlwYzExMHBhZF9kZXYuaWQudmVyc2lvbiA9IDB4MDEwMDsKIAotCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmcGMxMTBwYWRfZGV2KTsJCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZwYzExMHBhZF9kZXYpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIGF0ICUjeCBpcnEgJWRcbiIsCiAJCXBjMTEwcGFkX25hbWUsIHBjMTEwcGFkX2lvLCBwYzExMHBhZF9pcnEpOwotCQorCiAJcmV0dXJuIDA7CiB9Ci0gCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBwYzExMHBhZF9leGl0KHZvaWQpCiB7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnBjMTEwcGFkX2Rldik7CQorCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZwYzExMHBhZF9kZXYpOwogCiAJb3V0YihQQzExMFBBRF9PRkYsIHBjMTEwcGFkX2lvICsgMik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCmluZGV4IDAxOTAzNGIuLjE5Nzg1YTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJzeW5hcHRpY3MuaCIKICNpbmNsdWRlICJsb2dpcHMycHAuaCIKICNpbmNsdWRlICJhbHBzLmgiCisjaW5jbHVkZSAibGlmZWJvb2suaCIKIAogI2RlZmluZSBEUklWRVJfREVTQwkiUFMvMiBtb3VzZSBkcml2ZXIiCiAKQEAgLTMxLDEwICszMiw5IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHBzbW91c2VfbWF4X3Byb3RvID0gLTFVOworc3RhdGljIHVuc2lnbmVkIGludCBwc21vdXNlX21heF9wcm90byA9IFBTTU9VU0VfQVVUTzsKIHN0YXRpYyBpbnQgcHNtb3VzZV9zZXRfbWF4cHJvdG8oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCk7CiBzdGF0aWMgaW50IHBzbW91c2VfZ2V0X21heHByb3RvKGNoYXIgKmJ1ZmZlciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOwotc3RhdGljIGNoYXIgKnBzbW91c2VfcHJvdG9fYWJicmV2W10gPSB7IE5VTEwsICJiYXJlIiwgTlVMTCwgTlVMTCwgTlVMTCwgImltcHMiLCAiZXhwcyIsIE5VTEwsIE5VTEwsIE5VTEwgfTsKICNkZWZpbmUgcGFyYW1fY2hlY2tfcHJvdG9fYWJicmV2KG5hbWUsIHApCV9fcGFyYW1fY2hlY2sobmFtZSwgcCwgdW5zaWduZWQgaW50KQogI2RlZmluZSBwYXJhbV9zZXRfcHJvdG9fYWJicmV2CQkJcHNtb3VzZV9zZXRfbWF4cHJvdG8KICNkZWZpbmUgcGFyYW1fZ2V0X3Byb3RvX2FiYnJldgkJCXBzbW91c2VfZ2V0X21heHByb3RvCkBAIC01Nyw2ICs1Nyw3IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocmVzZXRhZnRlciwgcHNtb3VzZV9yZXNldGFmdGVyLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVzZXRhZnRlciwgIlJlc2V0IGRldmljZSBhZnRlciBzbyBtYW55IGJhZCBwYWNrZXRzICgwID0gbmV2ZXIpLiIpOwogCitQU01PVVNFX0RFRklORV9BVFRSKHByb3RvY29sKTsKIFBTTU9VU0VfREVGSU5FX0FUVFIocmF0ZSk7CiBQU01PVVNFX0RFRklORV9BVFRSKHJlc29sdXRpb24pOwogUFNNT1VTRV9ERUZJTkVfQVRUUihyZXNldGFmdGVyKTsKQEAgLTY3LDcgKzY4LDIzIEBACiBfX29ic29sZXRlX3NldHVwKCJwc21vdXNlX3Jlc2V0YWZ0ZXI9Iik7CiBfX29ic29sZXRlX3NldHVwKCJwc21vdXNlX3JhdGU9Iik7CiAKLXN0YXRpYyBjaGFyICpwc21vdXNlX3Byb3RvY29sc1tdID0geyAiTm9uZSIsICJQUy8yIiwgIlBTMisrIiwgIlRoaW5rUFMvMiIsICJHZW5QUy8yIiwgIkltUFMvMiIsICJJbUV4UFMvMiIsICJTeW5QUy8yIiwgIkFscHNQUy8yIiB9OworLyoKKyAqIHBzbW91c2Vfc2VtIHByb3RlY3RzIGFsbCBvcGVyYXRpb25zIGNoYW5naW5nIHN0YXRlIG9mIG1vdXNlCisgKiAoY29ubmVjdGluZywgZGlzY29ubmVjdGluZywgY2hhbmdpbmcgcmF0ZSBvciByZXNvbHV0aW9uIHZpYQorICogc3lzZnMpLiBXZSBjb3VsZCB1c2UgYSBwZXItZGV2aWNlIHNlbWFwaG9yZSBidXQgc2luY2UgdGhlcmUKKyAqIHJhcmVseSBtb3JlIHRoYW4gb25lIFBTLzIgbW91c2UgY29ubmVjdGVkIGFuZCBzaW5jZSBzZW1hcGhvcmUKKyAqIGlzIHRha2VuIGluICJzbG93IiBwYXRocyBpdCBpcyBub3Qgd29ydGggaXQuCisgKi8KK3N0YXRpYyBERUNMQVJFX01VVEVYKHBzbW91c2Vfc2VtKTsKKworc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgeworCWVudW0gcHNtb3VzZV90eXBlIHR5cGU7CisJY2hhciAqbmFtZTsKKwljaGFyICphbGlhczsKKwlpbnQgbWF4cHJvdG87CisJaW50ICgqZGV0ZWN0KShzdHJ1Y3QgcHNtb3VzZSAqLCBpbnQpOworCWludCAoKmluaXQpKHN0cnVjdCBwc21vdXNlICopOworfTsKIAogLyoKICAqIHBzbW91c2VfcHJvY2Vzc19ieXRlKCkgYW5hbHl6ZXMgdGhlIFBTLzIgZGF0YSBzdHJlYW0gYW5kIHJlcG9ydHMKQEAgLTQwNywxMiArNDI0LDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgcHMyYmFyZV9kZXRlY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGludCBzZXRfcHJvcGVydGllcykKIHsKLQlpZiAoIXBzbW91c2UtPnZlbmRvcikgcHNtb3VzZS0+dmVuZG9yID0gIkdlbmVyaWMiOwotCWlmICghcHNtb3VzZS0+bmFtZSkgcHNtb3VzZS0+bmFtZSA9ICJNb3VzZSI7CisJaWYgKHNldF9wcm9wZXJ0aWVzKSB7CisJCWlmICghcHNtb3VzZS0+dmVuZG9yKSBwc21vdXNlLT52ZW5kb3IgPSAiR2VuZXJpYyI7CisJCWlmICghcHNtb3VzZS0+bmFtZSkgcHNtb3VzZS0+bmFtZSA9ICJNb3VzZSI7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKKwogLyoKICAqIHBzbW91c2VfZXh0ZW5zaW9ucygpIHByb2JlcyBmb3IgYW55IGV4dGVuc2lvbnMgdG8gdGhlIGJhc2ljIFBTLzIgcHJvdG9jb2wKICAqIHRoZSBtb3VzZSBtYXkgaGF2ZS4KQEAgLTQyNCw2ICs0NDQsMTcgQEAKIAlpbnQgc3luYXB0aWNzX2hhcmR3YXJlID0gMDsKIAogLyoKKyAqIFdlIGFsd2F5cyBjaGVjayBmb3IgbGlmZWJvb2sgYmVjYXVzZSBpdCBkb2VzIG5vdCBkaXN0dXJiIG1vdXNlCisgKiAoaXQgb25seSBjaGVja3MgRE1JIGluZm9ybWF0aW9uKS4KKyAqLworCWlmIChsaWZlYm9va19kZXRlY3QocHNtb3VzZSwgc2V0X3Byb3BlcnRpZXMpID09IDApIHsKKwkJaWYgKG1heF9wcm90byA+IFBTTU9VU0VfSU1FWCkgeworCQkJaWYgKCFzZXRfcHJvcGVydGllcyB8fCBsaWZlYm9va19pbml0KHBzbW91c2UpID09IDApCisJCQkJcmV0dXJuIFBTTU9VU0VfTElGRUJPT0s7CisJCX0KKwl9CisKKy8qCiAgKiBUcnkgS2Vuc2luZ3RvbiBUaGlua2luZ01vdXNlICh3ZSB0cnkgZmlyc3QsIGJlY2F1c2Ugc3luYXB0aWNzIHByb2JlCiAgKiB1cHNldHMgdGhlIHRoaW5raW5nbW91c2UpLgogICovCkBAIC01MDYsNiArNTM3LDEwMyBAQAogCXJldHVybiBQU01PVVNFX1BTMjsKIH0KIAorc3RhdGljIHN0cnVjdCBwc21vdXNlX3Byb3RvY29sIHBzbW91c2VfcHJvdG9jb2xzW10gPSB7CisJeworCQkudHlwZQkJPSBQU01PVVNFX1BTMiwKKwkJLm5hbWUJCT0gIlBTLzIiLAorCQkuYWxpYXMJCT0gImJhcmUiLAorCQkubWF4cHJvdG8JPSAxLAorCQkuZGV0ZWN0CQk9IHBzMmJhcmVfZGV0ZWN0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX1BTMlBQLAorCQkubmFtZQkJPSAiUFMyKysiLAorCQkuYWxpYXMJCT0gImxvZ2l0ZWNoIiwKKwkJLmRldGVjdAkJPSBwczJwcF9pbml0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX1RISU5LUFMsCisJCS5uYW1lCQk9ICJUaGlua1BTLzIiLAorCQkuYWxpYXMJCT0gInRoaW5rcHMiLAorCQkuZGV0ZWN0CQk9IHRoaW5raW5nX2RldGVjdCwKKwl9LAorCXsKKwkJLnR5cGUJCT0gUFNNT1VTRV9HRU5QUywKKwkJLm5hbWUJCT0gIkdlblBTLzIiLAorCQkuYWxpYXMJCT0gImdlbml1cyIsCisJCS5kZXRlY3QJCT0gZ2VuaXVzX2RldGVjdCwKKwl9LAorCXsKKwkJLnR5cGUJCT0gUFNNT1VTRV9JTVBTLAorCQkubmFtZQkJPSAiSW1QUy8yIiwKKwkJLmFsaWFzCQk9ICJpbXBzIiwKKwkJLm1heHByb3RvCT0gMSwKKwkJLmRldGVjdAkJPSBpbnRlbGxpbW91c2VfZGV0ZWN0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX0lNRVgsCisJCS5uYW1lCQk9ICJJbUV4UFMvMiIsCisJCS5hbGlhcwkJPSAiZXhwcyIsCisJCS5tYXhwcm90bwk9IDEsCisJCS5kZXRlY3QJCT0gaW1fZXhwbG9yZXJfZGV0ZWN0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX1NZTkFQVElDUywKKwkJLm5hbWUJCT0gIlN5blBTLzIiLAorCQkuYWxpYXMJCT0gInN5bmFwdGljcyIsCisJCS5kZXRlY3QJCT0gc3luYXB0aWNzX2RldGVjdCwKKwkJLmluaXQJCT0gc3luYXB0aWNzX2luaXQsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfQUxQUywKKwkJLm5hbWUJCT0gIkFscHNQUy8yIiwKKwkJLmFsaWFzCQk9ICJhbHBzIiwKKwkJLmRldGVjdAkJPSBhbHBzX2RldGVjdCwKKwkJLmluaXQJCT0gYWxwc19pbml0LAorCX0sCisJeworCQkudHlwZQkJPSBQU01PVVNFX0xJRkVCT09LLAorCQkubmFtZQkJPSAiTEJQUy8yIiwKKwkJLmFsaWFzCQk9ICJsaWZlYm9vayIsCisJCS5pbml0CQk9IGxpZmVib29rX2luaXQsCisJfSwKKwl7CisJCS50eXBlCQk9IFBTTU9VU0VfQVVUTywKKwkJLm5hbWUJCT0gImF1dG8iLAorCQkuYWxpYXMJCT0gImFueSIsCisJCS5tYXhwcm90bwk9IDEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcHNtb3VzZV9wcm90b2NvbF9ieV90eXBlKGVudW0gcHNtb3VzZV90eXBlIHR5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwc21vdXNlX3Byb3RvY29scyk7IGkrKykKKwkJaWYgKHBzbW91c2VfcHJvdG9jb2xzW2ldLnR5cGUgPT0gdHlwZSkKKwkJCXJldHVybiAmcHNtb3VzZV9wcm90b2NvbHNbaV07CisKKwlXQVJOX09OKDEpOworCXJldHVybiAmcHNtb3VzZV9wcm90b2NvbHNbMF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcHNtb3VzZV9wcm90b2NvbF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgKnA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwc21vdXNlX3Byb3RvY29scyk7IGkrKykgeworCQlwID0gJnBzbW91c2VfcHJvdG9jb2xzW2ldOworCisJCWlmICgoc3RybGVuKHAtPm5hbWUpID09IGxlbiAmJiAhc3RybmNtcChwLT5uYW1lLCBuYW1lLCBsZW4pKSB8fAorCQkgICAgKHN0cmxlbihwLT5hbGlhcykgPT0gbGVuICYmICFzdHJuY21wKHAtPmFsaWFzLCBuYW1lLCBsZW4pKSkKKwkJCXJldHVybiAmcHNtb3VzZV9wcm90b2NvbHNbaV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKwogLyoKICAqIHBzbW91c2VfcHJvYmUoKSBwcm9iZXMgZm9yIGEgUFMvMiBtb3VzZS4KICAqLwpAQCAtNjUzLDMwICs3ODEsODQgQEAKIAogc3RhdGljIHZvaWQgcHNtb3VzZV9kaXNjb25uZWN0KHN0cnVjdCBzZXJpbyAqc2VyaW8pCiB7Ci0Jc3RydWN0IHBzbW91c2UgKnBzbW91c2UsICpwYXJlbnQ7CisJc3RydWN0IHBzbW91c2UgKnBzbW91c2UsICpwYXJlbnQgPSBOVUxMOwogCisJcHNtb3VzZSA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9wcm90b2NvbCk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3JhdGUpOwogCWRldmljZV9yZW1vdmVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yZXNvbHV0aW9uKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmVzZXRhZnRlcik7CiAKLQlwc21vdXNlID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8pOworCWRvd24oJnBzbW91c2Vfc2VtKTsKKwogCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfQ01EX01PREUpOwogCiAJaWYgKHNlcmlvLT5wYXJlbnQgJiYgc2VyaW8tPmlkLnR5cGUgPT0gU0VSSU9fUFNfUFNUSFJVKSB7CiAJCXBhcmVudCA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvLT5wYXJlbnQpOwotCQlpZiAocGFyZW50LT5wdF9kZWFjdGl2YXRlKQotCQkJcGFyZW50LT5wdF9kZWFjdGl2YXRlKHBhcmVudCk7CisJCXBzbW91c2VfZGVhY3RpdmF0ZShwYXJlbnQpOwogCX0KIAogCWlmIChwc21vdXNlLT5kaXNjb25uZWN0KQogCQlwc21vdXNlLT5kaXNjb25uZWN0KHBzbW91c2UpOwogCisJaWYgKHBhcmVudCAmJiBwYXJlbnQtPnB0X2RlYWN0aXZhdGUpCisJCXBhcmVudC0+cHRfZGVhY3RpdmF0ZShwYXJlbnQpOworCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JR05PUkUpOwogCiAJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnBzbW91c2UtPmRldik7CiAJc2VyaW9fY2xvc2Uoc2VyaW8pOwogCXNlcmlvX3NldF9kcnZkYXRhKHNlcmlvLCBOVUxMKTsKIAlrZnJlZShwc21vdXNlKTsKKworCWlmIChwYXJlbnQpCisJCXBzbW91c2VfYWN0aXZhdGUocGFyZW50KTsKKworCXVwKCZwc21vdXNlX3NlbSk7Cit9CisKK3N0YXRpYyBpbnQgcHNtb3VzZV9zd2l0Y2hfcHJvdG9jb2woc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHN0cnVjdCBwc21vdXNlX3Byb3RvY29sICpwcm90bykKK3sKKwltZW1zZXQoJnBzbW91c2UtPmRldiwgMCwgc2l6ZW9mKHN0cnVjdCBpbnB1dF9kZXYpKTsKKworCWluaXRfaW5wdXRfZGV2KCZwc21vdXNlLT5kZXYpOworCisJcHNtb3VzZS0+ZGV2LnByaXZhdGUgPSBwc21vdXNlOworCXBzbW91c2UtPmRldi5kZXYgPSAmcHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5kZXY7CisKKwlwc21vdXNlLT5kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOworCXBzbW91c2UtPmRldi5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTEVGVCkgfCBCSVQoQlROX01JRERMRSkgfCBCSVQoQlROX1JJR0hUKTsKKwlwc21vdXNlLT5kZXYucmVsYml0WzBdID0gQklUKFJFTF9YKSB8IEJJVChSRUxfWSk7CisKKwlwc21vdXNlLT5zZXRfcmF0ZSA9IHBzbW91c2Vfc2V0X3JhdGU7CisJcHNtb3VzZS0+c2V0X3Jlc29sdXRpb24gPSBwc21vdXNlX3NldF9yZXNvbHV0aW9uOworCXBzbW91c2UtPnByb3RvY29sX2hhbmRsZXIgPSBwc21vdXNlX3Byb2Nlc3NfYnl0ZTsKKwlwc21vdXNlLT5wa3RzaXplID0gMzsKKworCWlmIChwcm90byAmJiAocHJvdG8tPmRldGVjdCB8fCBwcm90by0+aW5pdCkpIHsKKwkJaWYgKHByb3RvLT5kZXRlY3QgJiYgcHJvdG8tPmRldGVjdChwc21vdXNlLCAxKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHByb3RvLT5pbml0ICYmIHByb3RvLT5pbml0KHBzbW91c2UpIDwgMCkKKwkJCXJldHVybiAtMTsKKworCQlwc21vdXNlLT50eXBlID0gcHJvdG8tPnR5cGU7CisJfQorCWVsc2UKKwkJcHNtb3VzZS0+dHlwZSA9IHBzbW91c2VfZXh0ZW5zaW9ucyhwc21vdXNlLCBwc21vdXNlX21heF9wcm90bywgMSk7CisKKwlzcHJpbnRmKHBzbW91c2UtPmRldm5hbWUsICIlcyAlcyAlcyIsCisJCXBzbW91c2VfcHJvdG9jb2xfYnlfdHlwZShwc21vdXNlLT50eXBlKS0+bmFtZSwgcHNtb3VzZS0+dmVuZG9yLCBwc21vdXNlLT5uYW1lKTsKKworCXBzbW91c2UtPmRldi5uYW1lID0gcHNtb3VzZS0+ZGV2bmFtZTsKKwlwc21vdXNlLT5kZXYucGh5cyA9IHBzbW91c2UtPnBoeXM7CisJcHNtb3VzZS0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfSTgwNDI7CisJcHNtb3VzZS0+ZGV2LmlkLnZlbmRvciA9IDB4MDAwMjsKKwlwc21vdXNlLT5kZXYuaWQucHJvZHVjdCA9IHBzbW91c2UtPnR5cGU7CisJcHNtb3VzZS0+ZGV2LmlkLnZlcnNpb24gPSBwc21vdXNlLT5tb2RlbDsKKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtNjg4LDYgKzg3MCw4IEBACiAJc3RydWN0IHBzbW91c2UgKnBzbW91c2UsICpwYXJlbnQgPSBOVUxMOwogCWludCByZXR2YWw7CiAKKwlkb3duKCZwc21vdXNlX3NlbSk7CisKIAkvKgogCSAqIElmIHRoaXMgaXMgYSBwYXNzLXRocm91Z2ggcG9ydCBkZWFjdGl2YXRlIHBhcmVudCBzbyB0aGUgZGV2aWNlCiAJICogY29ubmVjdGVkIHRvIHRoaXMgcG9ydCBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQKQEAgLTY5NywyMCArODgxLDE0IEBACiAJCXBzbW91c2VfZGVhY3RpdmF0ZShwYXJlbnQpOwogCX0KIAotCWlmICghKHBzbW91c2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpKSkgeworCWlmICghKHBzbW91c2UgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcHNtb3VzZSksIEdGUF9LRVJORUwpKSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKLQltZW1zZXQocHNtb3VzZSwgMCwgc2l6ZW9mKHN0cnVjdCBwc21vdXNlKSk7Ci0KIAlwczJfaW5pdCgmcHNtb3VzZS0+cHMyZGV2LCBzZXJpbyk7CiAJc3ByaW50Zihwc21vdXNlLT5waHlzLCAiJXMvaW5wdXQwIiwgc2VyaW8tPnBoeXMpOwotCXBzbW91c2UtPmRldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7Ci0JcHNtb3VzZS0+ZGV2LmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fTUlERExFKSB8IEJJVChCVE5fUklHSFQpOwotCXBzbW91c2UtPmRldi5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKTsKLQlwc21vdXNlLT5kZXYucHJpdmF0ZSA9IHBzbW91c2U7Ci0JcHNtb3VzZS0+ZGV2LmRldiA9ICZzZXJpby0+ZGV2OworCiAJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9JTklUSUFMSVpJTkcpOwogCiAJc2VyaW9fc2V0X2RydmRhdGEoc2VyaW8sIHBzbW91c2UpOwpAQCAtNzM0LDI1ICs5MTIsMTAgQEAKIAlwc21vdXNlLT5yZXNvbHV0aW9uID0gcHNtb3VzZV9yZXNvbHV0aW9uOwogCXBzbW91c2UtPnJlc2V0YWZ0ZXIgPSBwc21vdXNlX3Jlc2V0YWZ0ZXI7CiAJcHNtb3VzZS0+c21hcnRzY3JvbGwgPSBwc21vdXNlX3NtYXJ0c2Nyb2xsOwotCXBzbW91c2UtPnNldF9yYXRlID0gcHNtb3VzZV9zZXRfcmF0ZTsKLQlwc21vdXNlLT5zZXRfcmVzb2x1dGlvbiA9IHBzbW91c2Vfc2V0X3Jlc29sdXRpb247Ci0JcHNtb3VzZS0+cHJvdG9jb2xfaGFuZGxlciA9IHBzbW91c2VfcHJvY2Vzc19ieXRlOwotCXBzbW91c2UtPnBrdHNpemUgPSAzOwogCi0JcHNtb3VzZS0+dHlwZSA9IHBzbW91c2VfZXh0ZW5zaW9ucyhwc21vdXNlLCBwc21vdXNlX21heF9wcm90bywgMSk7Ci0KLQlzcHJpbnRmKHBzbW91c2UtPmRldm5hbWUsICIlcyAlcyAlcyIsCi0JCXBzbW91c2VfcHJvdG9jb2xzW3BzbW91c2UtPnR5cGVdLCBwc21vdXNlLT52ZW5kb3IsIHBzbW91c2UtPm5hbWUpOwotCi0JcHNtb3VzZS0+ZGV2Lm5hbWUgPSBwc21vdXNlLT5kZXZuYW1lOwotCXBzbW91c2UtPmRldi5waHlzID0gcHNtb3VzZS0+cGh5czsKLQlwc21vdXNlLT5kZXYuaWQuYnVzdHlwZSA9IEJVU19JODA0MjsKLQlwc21vdXNlLT5kZXYuaWQudmVuZG9yID0gMHgwMDAyOwotCXBzbW91c2UtPmRldi5pZC5wcm9kdWN0ID0gcHNtb3VzZS0+dHlwZTsKLQlwc21vdXNlLT5kZXYuaWQudmVyc2lvbiA9IHBzbW91c2UtPm1vZGVsOworCXBzbW91c2Vfc3dpdGNoX3Byb3RvY29sKHBzbW91c2UsIE5VTEwpOwogCiAJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZwc21vdXNlLT5kZXYpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzXG4iLCBwc21vdXNlLT5kZXZuYW1lLCBzZXJpby0+cGh5cyk7CiAKIAlwc21vdXNlX3NldF9zdGF0ZShwc21vdXNlLCBQU01PVVNFX0NNRF9NT0RFKTsKQEAgLTc2Miw2ICs5MjUsNyBAQAogCWlmIChwYXJlbnQgJiYgcGFyZW50LT5wdF9hY3RpdmF0ZSkKIAkJcGFyZW50LT5wdF9hY3RpdmF0ZShwYXJlbnQpOwogCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Byb3RvY29sKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJnNlcmlvLT5kZXYsICZwc21vdXNlX2F0dHJfcmF0ZSk7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZzZXJpby0+ZGV2LCAmcHNtb3VzZV9hdHRyX3Jlc29sdXRpb24pOwogCWRldmljZV9jcmVhdGVfZmlsZSgmc2VyaW8tPmRldiwgJnBzbW91c2VfYXR0cl9yZXNldGFmdGVyKTsKQEAgLTc3MSwxMCArOTM1LDExIEBACiAJcmV0dmFsID0gMDsKIAogb3V0OgotCS8qIElmIHRoaXMgaXMgYSBwYXNzLXRocm91Z2ggcG9ydCB0aGUgcGFyZW50IGF3YWl0cyB0byBiZSBhY3RpdmF0ZWQgKi8KKwkvKiBJZiB0aGlzIGlzIGEgcGFzcy10aHJvdWdoIHBvcnQgdGhlIHBhcmVudCBuZWVkcyB0byBiZSByZS1hY3RpdmF0ZWQgKi8KIAlpZiAocGFyZW50KQogCQlwc21vdXNlX2FjdGl2YXRlKHBhcmVudCk7CiAKKwl1cCgmcHNtb3VzZV9zZW0pOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTc5MSw2ICs5NTYsOCBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJZG93bigmcHNtb3VzZV9zZW0pOworCiAJaWYgKHNlcmlvLT5wYXJlbnQgJiYgc2VyaW8tPmlkLnR5cGUgPT0gU0VSSU9fUFNfUFNUSFJVKSB7CiAJCXBhcmVudCA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvLT5wYXJlbnQpOwogCQlwc21vdXNlX2RlYWN0aXZhdGUocGFyZW50KTsKQEAgLTgyMyw2ICs5OTAsNyBAQAogCWlmIChwYXJlbnQpCiAJCXBzbW91c2VfYWN0aXZhdGUocGFyZW50KTsKIAorCXVwKCZwc21vdXNlX3NlbSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC04OTMsMjYgKzEwNjEsMTA5IEBACiAKIAlpZiAoc2VyaW8tPmRydiAhPSAmcHNtb3VzZV9kcnYpIHsKIAkJcmV0dmFsID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VucGluOworCX0KKworCXJldHZhbCA9IGRvd25faW50ZXJydXB0aWJsZSgmcHNtb3VzZV9zZW0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VucGluOworCisJaWYgKHBzbW91c2UtPnN0YXRlID09IFBTTU9VU0VfSUdOT1JFKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VwOwogCX0KIAogCWlmIChzZXJpby0+cGFyZW50ICYmIHNlcmlvLT5pZC50eXBlID09IFNFUklPX1BTX1BTVEhSVSkgewogCQlwYXJlbnQgPSBzZXJpb19nZXRfZHJ2ZGF0YShzZXJpby0+cGFyZW50KTsKIAkJcHNtb3VzZV9kZWFjdGl2YXRlKHBhcmVudCk7CiAJfQorCiAJcHNtb3VzZV9kZWFjdGl2YXRlKHBzbW91c2UpOwogCiAJcmV0dmFsID0gaGFuZGxlcihwc21vdXNlLCBidWYsIGNvdW50KTsKIAotCXBzbW91c2VfYWN0aXZhdGUocHNtb3VzZSk7CisJaWYgKHJldHZhbCAhPSAtRU5PREVWKQorCQlwc21vdXNlX2FjdGl2YXRlKHBzbW91c2UpOworCiAJaWYgKHBhcmVudCkKIAkJcHNtb3VzZV9hY3RpdmF0ZShwYXJlbnQpOwogCi1vdXQ6Cisgb3V0X3VwOgorCXVwKCZwc21vdXNlX3NlbSk7Cisgb3V0X3VucGluOgogCXNlcmlvX3VucGluX2RyaXZlcihzZXJpbyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfcHJvdG9jb2woc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcHNtb3VzZV9wcm90b2NvbF9ieV90eXBlKHBzbW91c2UtPnR5cGUpLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3NldF9wcm90b2NvbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlcmlvICpzZXJpbyA9IHBzbW91c2UtPnBzMmRldi5zZXJpbzsKKwlzdHJ1Y3QgcHNtb3VzZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcHNtb3VzZV9wcm90b2NvbCAqcHJvdG87CisJaW50IHJldHJ5ID0gMDsKKworCWlmICghKHByb3RvID0gcHNtb3VzZV9wcm90b2NvbF9ieV9uYW1lKGJ1ZiwgY291bnQpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocHNtb3VzZS0+dHlwZSA9PSBwcm90by0+dHlwZSkKKwkJcmV0dXJuIGNvdW50OworCisJd2hpbGUgKHNlcmlvLT5jaGlsZCkgeworCQlpZiAoKytyZXRyeSA+IDMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInBzbW91c2U6IGZhaWxlZCB0byBkZXN0cm95IGNoaWxkIHBvcnQsIHByb3RvY29sIGNoYW5nZSBhYm9ydGVkLlxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXVwKCZwc21vdXNlX3NlbSk7CisJCXNlcmlvX3VucGluX2RyaXZlcihzZXJpbyk7CisJCXNlcmlvX3VucmVnaXN0ZXJfY2hpbGRfcG9ydChzZXJpbyk7CisJCXNlcmlvX3Bpbl9kcml2ZXJfdW5pbnRlcnJ1cHRpYmxlKHNlcmlvKTsKKwkJZG93bigmcHNtb3VzZV9zZW0pOworCisJCWlmIChzZXJpby0+ZHJ2ICE9ICZwc21vdXNlX2RydikKKwkJCXJldHVybiAtRU5PREVWOworCisJCWlmIChwc21vdXNlLT50eXBlID09IHByb3RvLT50eXBlKQorCQkJcmV0dXJuIGNvdW50OyAvKiBzd2l0Y2hlZCBieSBvdGhlciB0aHJlYWQgKi8KKwl9CisKKwlpZiAoc2VyaW8tPnBhcmVudCAmJiBzZXJpby0+aWQudHlwZSA9PSBTRVJJT19QU19QU1RIUlUpIHsKKwkJcGFyZW50ID0gc2VyaW9fZ2V0X2RydmRhdGEoc2VyaW8tPnBhcmVudCk7CisJCWlmIChwYXJlbnQtPnB0X2RlYWN0aXZhdGUpCisJCQlwYXJlbnQtPnB0X2RlYWN0aXZhdGUocGFyZW50KTsKKwl9CisKKwlpZiAocHNtb3VzZS0+ZGlzY29ubmVjdCkKKwkJcHNtb3VzZS0+ZGlzY29ubmVjdChwc21vdXNlKTsKKworCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSUdOT1JFKTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmcHNtb3VzZS0+ZGV2KTsKKworCXBzbW91c2Vfc2V0X3N0YXRlKHBzbW91c2UsIFBTTU9VU0VfSU5JVElBTElaSU5HKTsKKworCWlmIChwc21vdXNlX3N3aXRjaF9wcm90b2NvbChwc21vdXNlLCBwcm90bykgPCAwKSB7CisJCXBzbW91c2VfcmVzZXQocHNtb3VzZSk7CisJCS8qIGRlZmF1bHQgdG8gUFNNT1VTRV9QUzIgKi8KKwkJcHNtb3VzZV9zd2l0Y2hfcHJvdG9jb2wocHNtb3VzZSwgJnBzbW91c2VfcHJvdG9jb2xzWzBdKTsKKwl9CisKKwlwc21vdXNlX2luaXRpYWxpemUocHNtb3VzZSk7CisJcHNtb3VzZV9zZXRfc3RhdGUocHNtb3VzZSwgUFNNT1VTRV9DTURfTU9ERSk7CisKKwlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnBzbW91c2UtPmRldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzXG4iLCBwc21vdXNlLT5kZXZuYW1lLCBzZXJpby0+cGh5cyk7CisKKwlpZiAocGFyZW50ICYmIHBhcmVudC0+cHRfYWN0aXZhdGUpCisJCXBhcmVudC0+cHRfYWN0aXZhdGUocGFyZW50KTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3QgcHNtb3VzZV9hdHRyX3Nob3dfcmF0ZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwc21vdXNlLT5yYXRlKTsKQEAgLTk2OSwzNCArMTIyMCwyNiBAQAogCiBzdGF0aWMgaW50IHBzbW91c2Vfc2V0X21heHByb3RvKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7Ci0JaW50IGk7CisJc3RydWN0IHBzbW91c2VfcHJvdG9jb2wgKnByb3RvOwogCiAJaWYgKCF2YWwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFzdHJuY21wKHZhbCwgImFueSIsIDMpKSB7Ci0JCSooKHVuc2lnbmVkIGludCAqKWtwLT5hcmcpID0gLTFVOwotCQlyZXR1cm4gMDsKLQl9CisJcHJvdG8gPSBwc21vdXNlX3Byb3RvY29sX2J5X25hbWUodmFsLCBzdHJsZW4odmFsKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwc21vdXNlX3Byb3RvX2FiYnJldik7IGkrKykgewotCQlpZiAoIXBzbW91c2VfcHJvdG9fYWJicmV2W2ldKQotCQkJY29udGludWU7CisJaWYgKCFwcm90byB8fCAhcHJvdG8tPm1heHByb3RvKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoIXN0cm5jbXAodmFsLCBwc21vdXNlX3Byb3RvX2FiYnJldltpXSwgc3RybGVuKHBzbW91c2VfcHJvdG9fYWJicmV2W2ldKSkpIHsKLQkJCSooKHVuc2lnbmVkIGludCAqKWtwLT5hcmcpID0gaTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQorCSooKHVuc2lnbmVkIGludCAqKWtwLT5hcmcpID0gcHJvdG8tPnR5cGU7CiAKLQlyZXR1cm4gLUVJTlZBTDsJCQkJCVwKKwlyZXR1cm4gMDsJCQkJCVwKIH0KIAogc3RhdGljIGludCBwc21vdXNlX2dldF9tYXhwcm90byhjaGFyICpidWZmZXIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewotCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLAotCQkJcHNtb3VzZV9tYXhfcHJvdG8gPCBBUlJBWV9TSVpFKHBzbW91c2VfcHJvdG9fYWJicmV2KSA/Ci0JCQkJcHNtb3VzZV9wcm90b19hYmJyZXZbcHNtb3VzZV9tYXhfcHJvdG9dIDogImFueSIpOworCWludCB0eXBlID0gKigodW5zaWduZWQgaW50ICopa3AtPmFyZyk7CisKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgcHNtb3VzZV9wcm90b2NvbF9ieV90eXBlKHR5cGUpLT5uYW1lKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgcHNtb3VzZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oCmluZGV4IDc5ZTE3YTAuLjg2NjkxY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS5oCkBAIC03Nyw2ICs3Nyw4IEBACiAJUFNNT1VTRV9JTUVYLAogCVBTTU9VU0VfU1lOQVBUSUNTLAogCVBTTU9VU0VfQUxQUywKKwlQU01PVVNFX0xJRkVCT09LLAorCVBTTU9VU0VfQVVUTwkJLyogVGhpcyBvbmUgc2hvdWxkIGFsd2F5cyBiZSBsYXN0ICovCiB9OwogCiBpbnQgcHNtb3VzZV9zbGljZWRfY29tbWFuZChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgdW5zaWduZWQgY2hhciBjb21tYW5kKTsKQEAgLTk5LDcgKzEwMSw3IEBACiB7CQkJCQkJCQkJCVwKIAlyZXR1cm4gcHNtb3VzZV9hdHRyX3NldF9oZWxwZXIoZCwgYiwgcywgcHNtb3VzZV9hdHRyX3NldF8jI19uYW1lKTsJXAogfQkJCQkJCQkJCQlcCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcHNtb3VzZV9hdHRyXyMjX25hbWUgPSAJCQkJXAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBzbW91c2VfYXR0cl8jI19uYW1lID0JCQkJXAogCV9fQVRUUihfbmFtZSwgU19JV1VTUiB8IFNfSVJVR08sCQkJCQlcCiAJCXBzbW91c2VfZG9fc2hvd18jI19uYW1lLCBwc21vdXNlX2RvX3NldF8jI19uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9ycGNtb3VzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9ycGNtb3VzZS5jCmluZGV4IDcyODBmNjguLjhmZTEyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvcnBjbW91c2UuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL3JwY21vdXNlLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAliID0gKHNob3J0KSAoX19yYXdfcmVhZGwoMHhlMDMxMDAwMCkgXiAweDcwKTsKIAogCWR4ID0geCAtIHJwY21vdXNlX2xhc3R4OwotCWR5ID0geSAtIHJwY21vdXNlX2xhc3R5OyAKKwlkeSA9IHkgLSBycGNtb3VzZV9sYXN0eTsKIAogCXJwY21vdXNlX2xhc3R4ID0geDsKIAlycGNtb3VzZV9sYXN0eSA9IHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3ZzeHh4YWEuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCmluZGV4IGIyY2IxMDEuLmYwMjRiZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvdnN4eHhhYS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIERyaXZlciBmb3IJREVDIFZTWFhYLUFBIG1vdXNlIChob2NrZXktcHVjayBtb3VzZSwgYmFsbCBvciB0d28gcm9sbGVycykKLSAqIAkJREVDIFZTWFhYLUdBIG1vdXNlIChyZWN0YW5ndWxhciBtb3VzZSwgd2l0aCBiYWxsKQotICogCQlERUMgVlNYWFgtQUIgdGFibGV0IChkaWdpdGl6ZXIgd2l0aCBoYWlyIGNyb3NzIG9yIHN0eWx1cykKKyAqCQlERUMgVlNYWFgtR0EgbW91c2UgKHJlY3Rhbmd1bGFyIG1vdXNlLCB3aXRoIGJhbGwpCisgKgkJREVDIFZTWFhYLUFCIHRhYmxldCAoZGlnaXRpemVyIHdpdGggaGFpciBjcm9zcyBvciBzdHlsdXMpCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgYnkgSmFuLUJlbmVkaWN0IEdsYXcgPGpiZ2xhd0BsdWctb3dsLmRlPgogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2VkZXYuYwppbmRleCAwNjI4NDhhLi5jNjE5NGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlZGV2LmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZWRldi5jCkBAIC0yMjAsNiArMjIwLDcgQEAKIAlzdHJ1Y3QgbW91c2VkZXZfbGlzdCAqbGlzdDsKIAlzdHJ1Y3QgbW91c2VkZXZfbW90aW9uICpwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdha2VfcmVhZGVycyA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpc3QsICZtb3VzZWRldi0+bGlzdCwgbm9kZSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdC0+cGFja2V0X2xvY2ssIGZsYWdzKTsKQEAgLTI1NSwxMSArMjU2LDE0IEBACiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+cGFja2V0X2xvY2ssIGZsYWdzKTsKIAotCQlpZiAobGlzdC0+cmVhZHkpCisJCWlmIChsaXN0LT5yZWFkeSkgewogCQkJa2lsbF9mYXN5bmMoJmxpc3QtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOworCQkJd2FrZV9yZWFkZXJzID0gMTsKKwkJfQogCX0KIAotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbW91c2VkZXYtPndhaXQpOworCWlmICh3YWtlX3JlYWRlcnMpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbW91c2VkZXYtPndhaXQpOwogfQogCiBzdGF0aWMgdm9pZCBtb3VzZWRldl90b3VjaHBhZF90b3VjaChzdHJ1Y3QgbW91c2VkZXYgKm1vdXNlZGV2LCBpbnQgdmFsdWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKaW5kZXggNTkwMGRlMy4uYTliZjU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJc3RydWN0IGk4MDQyX3BvcnQgKnBvcnQgPSBzZXJpby0+cG9ydF9kYXRhOwogCiAJcG9ydC0+ZXhpc3RzID0gMDsKLQlzeW5jaHJvbml6ZV9rZXJuZWwoKTsKKwlzeW5jaHJvbml6ZV9zY2hlZCgpOwogCXBvcnQtPnNlcmlvID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vbGlicHMyLmMKaW5kZXggYzk3ODY1Ny4uZDRjOTkwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9saWJwczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2xpYnBzMi5jCkBAIC0yOSw2ICsyOSw3IEBACiAKIEVYUE9SVF9TWU1CT0wocHMyX2luaXQpOwogRVhQT1JUX1NZTUJPTChwczJfc2VuZGJ5dGUpOworRVhQT1JUX1NZTUJPTChwczJfZHJhaW4pOwogRVhQT1JUX1NZTUJPTChwczJfY29tbWFuZCk7CiBFWFBPUlRfU1lNQk9MKHBzMl9zY2hlZHVsZV9jb21tYW5kKTsKIEVYUE9SVF9TWU1CT0wocHMyX2hhbmRsZV9hY2spOwpAQCAtNDUsMTEgKzQ2LDExIEBACiAKIAogLyoKLSAqIHBzMl9zZW5kYnl0ZSgpIHNlbmRzIGEgYnl0ZSB0byB0aGUgbW91c2UsIGFuZCB3YWl0cyBmb3IgYWNrbm93bGVkZ2UuCi0gKiBJdCBkb2Vzbid0IGhhbmRsZSByZXRyYW5zbWlzc2lvbiwgdGhvdWdoIGl0IGNvdWxkIC0gYmVjYXVzZSB3aGVuIHRoZXJlIHdvdWxkCi0gKiBiZSBuZWVkIGZvciByZXRyYW5zbWlzc2lvbnMsIHRoZSBtb3VzZSBoYXMgdG8gYmUgcmVwbGFjZWQgYW55d2F5LgorICogcHMyX3NlbmRieXRlKCkgc2VuZHMgYSBieXRlIHRvIHRoZSBkZXZpY2UgYW5kIHdhaXRzIGZvciBhY2tub3dsZWRnZS4KKyAqIEl0IGRvZXNuJ3QgaGFuZGxlIHJldHJhbnNtaXNzaW9uLCB0aG91Z2ggaXQgY291bGQgLSBiZWNhdXNlIGlmIHRoZXJlCisgKiBpcyBhIG5lZWQgZm9yIHJldHJhbnNtaXNzaW9ucyBkZXZpY2UgaGFzIHRvIGJlIHJlcGxhY2VkIGFueXdheS4KICAqCi0gKiBwczJfc2VuZGJ5dGUoKSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MgY29udGV4dAorICogcHMyX3NlbmRieXRlKCkgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gYSBwcm9jZXNzIGNvbnRleHQuCiAgKi8KIAogaW50IHBzMl9zZW5kYnl0ZShzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgYnl0ZSwgaW50IHRpbWVvdXQpCkBAIC03Miw2ICs3Myw5MSBAQAogfQogCiAvKgorICogcHMyX2RyYWluKCkgd2FpdHMgZm9yIGRldmljZSB0byB0cmFuc21pdCByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzCisgKiBhbmQgZGlzY2FyZHMgdGhlbS4KKyAqLworCit2b2lkIHBzMl9kcmFpbihzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIGludCBtYXhieXRlcywgaW50IHRpbWVvdXQpCit7CisJaWYgKG1heGJ5dGVzID4gc2l6ZW9mKHBzMmRldi0+Y21kYnVmKSkgeworCQlXQVJOX09OKDEpOworCQltYXhieXRlcyA9IHNpemVvZihwczJkZXYtPmNtZGJ1Zik7CisJfQorCisJZG93bigmcHMyZGV2LT5jbWRfc2VtKTsKKworCXNlcmlvX3BhdXNlX3J4KHBzMmRldi0+c2VyaW8pOworCXBzMmRldi0+ZmxhZ3MgPSBQUzJfRkxBR19DTUQ7CisJcHMyZGV2LT5jbWRjbnQgPSBtYXhieXRlczsKKwlzZXJpb19jb250aW51ZV9yeChwczJkZXYtPnNlcmlvKTsKKworCXdhaXRfZXZlbnRfdGltZW91dChwczJkZXYtPndhaXQsCisJCQkgICAhKHBzMmRldi0+ZmxhZ3MgJiBQUzJfRkxBR19DTUQpLAorCQkJICAgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJdXAoJnBzMmRldi0+Y21kX3NlbSk7Cit9CisKKy8qCisgKiBwczJfaXNfa2V5Ym9hcmRfaWQoKSBjaGVja3MgcmVjZWl2ZWQgSUQgYnl0ZSBhZ2FpbnN0IHRoZSBsaXN0IG9mCisgKiBrbm93biBrZXlib2FyZCBJRHMuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgcHMyX2lzX2tleWJvYXJkX2lkKGNoYXIgaWRfYnl0ZSkKK3sKKwlzdGF0aWMgY2hhciBrZXlib2FyZF9pZHNbXSA9IHsKKwkJMHhhYiwJLyogUmVndWxhciBrZXlib2FyZHMJCSovCisJCTB4YWMsCS8qIE5DRCBTdW4ga2V5Ym9hcmQJCSovCisJCTB4MmIsCS8qIFRydXN0IGtleWJvYXJkLCB0cmFuc2xhdGVkCSovCisJCTB4NWQsCS8qIFRydXN0IGtleWJvYXJkCQkqLworCQkweDYwLAkvKiBOTUIgU0dJIGtleWJvYXJkLCB0cmFuc2xhdGVkICovCisJCTB4NDcsCS8qIE5NQiBTR0kga2V5Ym9hcmQJCSovCisJfTsKKworCXJldHVybiBtZW1jaHIoa2V5Ym9hcmRfaWRzLCBpZF9ieXRlLCBzaXplb2Yoa2V5Ym9hcmRfaWRzKSkgIT0gTlVMTDsKK30KKworLyoKKyAqIHBzMl9hZGp1c3RfdGltZW91dCgpIGlzIGNhbGxlZCBhZnRlciByZWNlaXZpbmcgMXN0IGJ5dGUgb2YgY29tbWFuZAorICogcmVzcG9uc2UgYW5kIHRyaWVzIHRvIHJlZHVjZSByZW1haW5pbmcgdGltZW91dCB0byBzcGVlZCB1cCBjb21tYW5kCisgKiBjb21wbGV0aW9uLgorICovCisKK3N0YXRpYyBpbnQgcHMyX2FkanVzdF90aW1lb3V0KHN0cnVjdCBwczJkZXYgKnBzMmRldiwgaW50IGNvbW1hbmQsIGludCB0aW1lb3V0KQoreworCXN3aXRjaCAoY29tbWFuZCkgeworCQljYXNlIFBTMl9DTURfUkVTRVRfQkFUOgorCQkJLyoKKwkJCSAqIERldmljZSBoYXMgc2VudCB0aGUgZmlyc3QgcmVzcG9uc2UgYnl0ZSBhZnRlcgorCQkJICogcmVzZXQgY29tbWFuZCwgcmVzZXQgaXMgdGh1cyBkb25lLCBzbyB3ZSBjYW4KKwkJCSAqIHNob3J0ZW4gdGhlIHRpbWVvdXQuCisJCQkgKiBUaGUgbmV4dCBieXRlIHdpbGwgY29tZSBzb29uIChrZXlib2FyZCkgb3Igbm90CisJCQkgKiBhdCBhbGwgKG1vdXNlKS4KKwkJCSAqLworCQkJaWYgKHRpbWVvdXQgPiBtc2Vjc190b19qaWZmaWVzKDEwMCkpCisJCQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFMyX0NNRF9HRVRJRDoKKwkJCS8qCisJCQkgKiBJZiBkZXZpY2UgYmVoaW5kIHRoZSBwb3J0IGlzIG5vdCBhIGtleWJvYXJkIHRoZXJlCisJCQkgKiB3b24ndCBiZSAybmQgYnl0ZSBvZiBJRCByZXNwb25zZS4KKwkJCSAqLworCQkJaWYgKCFwczJfaXNfa2V5Ym9hcmRfaWQocHMyZGV2LT5jbWRidWZbMV0pKSB7CisJCQkJc2VyaW9fcGF1c2VfcngocHMyZGV2LT5zZXJpbyk7CisJCQkJcHMyZGV2LT5mbGFncyA9IHBzMmRldi0+Y21kY250ID0gMDsKKwkJCQlzZXJpb19jb250aW51ZV9yeChwczJkZXYtPnNlcmlvKTsKKwkJCQl0aW1lb3V0ID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdGltZW91dDsKK30KKworLyoKICAqIHBzMl9jb21tYW5kKCkgc2VuZHMgYSBjb21tYW5kIGFuZCBpdHMgcGFyYW1ldGVycyB0byB0aGUgbW91c2UsCiAgKiB0aGVuIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UgYW5kIHB1dHMgaXQgaW4gdGhlIHBhcmFtIGFycmF5LgogICoKQEAgLTg2LDYgKzE3MiwxMSBAQAogCWludCByYyA9IC0xOwogCWludCBpOwogCisJaWYgKHJlY2VpdmUgPiBzaXplb2YocHMyZGV2LT5jbWRidWYpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtMTsKKwl9CisKIAlkb3duKCZwczJkZXYtPmNtZF9zZW0pOwogCiAJc2VyaW9fcGF1c2VfcngocHMyZGV2LT5zZXJpbyk7CkBAIC0xMDEsMTAgKzE5Miw5IEBACiAJICogQUNLaW5nIHRoZSByZXNldCBjb21tYW5kLCBhbmQgc28gaXQgY2FuIHRha2UgYSBsb25nCiAJICogdGltZSBiZWZvcmUgdGhlIEFDSyBhcnJyaXZlcy4KIAkgKi8KLQlpZiAoY29tbWFuZCAmIDB4ZmYpCi0JCWlmIChwczJfc2VuZGJ5dGUocHMyZGV2LCBjb21tYW5kICYgMHhmZiwKLQkJCWNvbW1hbmQgPT0gUFMyX0NNRF9SRVNFVF9CQVQgPyAxMDAwIDogMjAwKSkKLQkJCWdvdG8gb3V0OworCWlmIChwczJfc2VuZGJ5dGUocHMyZGV2LCBjb21tYW5kICYgMHhmZiwKKwkJCSBjb21tYW5kID09IFBTMl9DTURfUkVTRVRfQkFUID8gMTAwMCA6IDIwMCkpCisJCWdvdG8gb3V0OwogCiAJZm9yIChpID0gMDsgaSA8IHNlbmQ7IGkrKykKIAkJaWYgKHBzMl9zZW5kYnl0ZShwczJkZXYsIHBhcmFtW2ldLCAyMDApKQpAQCAtMTIwLDMzICsyMTAsNyBAQAogCiAJaWYgKHBzMmRldi0+Y21kY250ICYmIHRpbWVvdXQgPiAwKSB7CiAKLQkJaWYgKGNvbW1hbmQgPT0gUFMyX0NNRF9SRVNFVF9CQVQgJiYgdGltZW91dCA+IG1zZWNzX3RvX2ppZmZpZXMoMTAwKSkgewotCQkJLyoKLQkJCSAqIERldmljZSBoYXMgc2VudCB0aGUgZmlyc3QgcmVzcG9uc2UgYnl0ZQotCQkJICogYWZ0ZXIgYSByZXNldCBjb21tYW5kLCByZXNldCBpcyB0aHVzIGRvbmUsCi0JCQkgKiBzaG9ydGVuIHRoZSB0aW1lb3V0LiBUaGUgbmV4dCBieXRlIHdpbGwgY29tZQotCQkJICogc29vbiAoa2V5Ym9hcmQpIG9yIG5vdCBhdCBhbGwgKG1vdXNlKS4KLQkJCSAqLwotCQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKLQkJfQotCi0JCWlmIChjb21tYW5kID09IFBTMl9DTURfR0VUSUQgJiYKLQkJICAgIHBzMmRldi0+Y21kYnVmW3JlY2VpdmUgLSAxXSAhPSAweGFiICYmIC8qIFJlZ3VsYXIga2V5Ym9hcmRzICovCi0JCSAgICBwczJkZXYtPmNtZGJ1ZltyZWNlaXZlIC0gMV0gIT0gMHhhYyAmJiAvKiBOQ0QgU3VuIGtleWJvYXJkICovCi0JCSAgICBwczJkZXYtPmNtZGJ1ZltyZWNlaXZlIC0gMV0gIT0gMHgyYiAmJiAvKiBUcnVzdCBrZXlib2FyZCwgdHJhbnNsYXRlZCAqLwotCQkgICAgcHMyZGV2LT5jbWRidWZbcmVjZWl2ZSAtIDFdICE9IDB4NWQgJiYgLyogVHJ1c3Qga2V5Ym9hcmQgKi8KLQkJICAgIHBzMmRldi0+Y21kYnVmW3JlY2VpdmUgLSAxXSAhPSAweDYwICYmIC8qIE5NQiBTR0kga2V5Ym9hcmQsIHRyYW5zbGF0ZWQgKi8KLQkJICAgIHBzMmRldi0+Y21kYnVmW3JlY2VpdmUgLSAxXSAhPSAweDQ3KSB7IC8qIE5NQiBTR0kga2V5Ym9hcmQgKi8KLQkJCS8qCi0JCQkgKiBEZXZpY2UgYmVoaW5kIHRoZSBwb3J0IGlzIG5vdCBhIGtleWJvYXJkCi0JCQkgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhaXQgZm9yIHRoZSAybmQgYnl0ZQotCQkJICogb2YgSUQgcmVzcG9uc2UuCi0JCQkgKi8KLQkJCXNlcmlvX3BhdXNlX3J4KHBzMmRldi0+c2VyaW8pOwotCQkJcHMyZGV2LT5mbGFncyA9IHBzMmRldi0+Y21kY250ID0gMDsKLQkJCXNlcmlvX2NvbnRpbnVlX3J4KHBzMmRldi0+c2VyaW8pOwotCQl9Ci0KKwkJdGltZW91dCA9IHBzMl9hZGp1c3RfdGltZW91dChwczJkZXYsIGNvbW1hbmQsIHRpbWVvdXQpOwogCQl3YWl0X2V2ZW50X3RpbWVvdXQocHMyZGV2LT53YWl0LAogCQkJCSAgICEocHMyZGV2LT5mbGFncyAmIFBTMl9GTEFHX0NNRCksIHRpbWVvdXQpOwogCX0KQEAgLTE2MCw3ICsyMjQsNyBAQAogCiAJcmMgPSAwOwogCi1vdXQ6Cisgb3V0OgogCXNlcmlvX3BhdXNlX3J4KHBzMmRldi0+c2VyaW8pOwogCXBzMmRldi0+ZmxhZ3MgPSAwOwogCXNlcmlvX2NvbnRpbnVlX3J4KHBzMmRldi0+c2VyaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJpby5jCmluZGV4IGZlYWI0OTcuLmYzNjc2OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vc2VyaW8uYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcmlvLmMKQEAgLTMxLDEwICszMSw5IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKIE1PRFVMRV9BVVRIT1IoIlZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2VyaW8gYWJzdHJhY3Rpb24gY29yZSIpOwpAQCAtNDMsNiArNDIsNyBAQAogRVhQT1JUX1NZTUJPTChzZXJpb19pbnRlcnJ1cHQpOwogRVhQT1JUX1NZTUJPTChfX3NlcmlvX3JlZ2lzdGVyX3BvcnQpOwogRVhQT1JUX1NZTUJPTChzZXJpb191bnJlZ2lzdGVyX3BvcnQpOworRVhQT1JUX1NZTUJPTChzZXJpb191bnJlZ2lzdGVyX2NoaWxkX3BvcnQpOwogRVhQT1JUX1NZTUJPTChfX3NlcmlvX3VucmVnaXN0ZXJfcG9ydF9kZWxheWVkKTsKIEVYUE9SVF9TWU1CT0woX19zZXJpb19yZWdpc3Rlcl9kcml2ZXIpOwogRVhQT1JUX1NZTUJPTChzZXJpb191bnJlZ2lzdGVyX2RyaXZlcik7CkBAIC02OCw2ICs2OCwzNyBAQAogc3RhdGljIHZvaWQgc2VyaW9fcmVjb25uZWN0X3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbyk7CiBzdGF0aWMgdm9pZCBzZXJpb19kaXNjb25uZWN0X3BvcnQoc3RydWN0IHNlcmlvICpzZXJpbyk7CiAKK3N0YXRpYyBpbnQgc2VyaW9fY29ubmVjdF9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbywgc3RydWN0IHNlcmlvX2RyaXZlciAqZHJ2KQoreworCWludCByZXR2YWw7CisKKwlkb3duKCZzZXJpby0+ZHJ2X3NlbSk7CisJcmV0dmFsID0gZHJ2LT5jb25uZWN0KHNlcmlvLCBkcnYpOworCXVwKCZzZXJpby0+ZHJ2X3NlbSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNlcmlvX3JlY29ubmVjdF9kcml2ZXIoc3RydWN0IHNlcmlvICpzZXJpbykKK3sKKwlpbnQgcmV0dmFsID0gLTE7CisKKwlkb3duKCZzZXJpby0+ZHJ2X3NlbSk7CisJaWYgKHNlcmlvLT5kcnYgJiYgc2VyaW8tPmRydi0+cmVjb25uZWN0KQorCQlyZXR2YWwgPSBzZXJpby0+ZHJ2LT5yZWNvbm5lY3Qoc2VyaW8pOworCXVwKCZzZXJpby0+ZHJ2X3NlbSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBzZXJpb19kaXNjb25uZWN0X2RyaXZlcihzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQoreworCWRvd24oJnNlcmlvLT5kcnZfc2VtKTsKKwlpZiAoc2VyaW8tPmRydikKKwkJc2VyaW8tPmRydi0+ZGlzY29ubmVjdChzZXJpbyk7CisJdXAoJnNlcmlvLT5kcnZfc2VtKTsKK30KKwogc3RhdGljIGludCBzZXJpb19tYXRjaF9wb3J0KGNvbnN0IHN0cnVjdCBzZXJpb19kZXZpY2VfaWQgKmlkcywgc3RydWN0IHNlcmlvICpzZXJpbykKIHsKIAl3aGlsZSAoaWRzLT50eXBlIHx8IGlkcy0+cHJvdG8pIHsKQEAgLTkxLDcgKzEyMiw3IEBACiAKIAlpZiAoc2VyaW9fbWF0Y2hfcG9ydChkcnYtPmlkX3RhYmxlLCBzZXJpbykpIHsKIAkJc2VyaW8tPmRldi5kcml2ZXIgPSAmZHJ2LT5kcml2ZXI7Ci0JCWlmIChkcnYtPmNvbm5lY3Qoc2VyaW8sIGRydikpIHsKKwkJaWYgKHNlcmlvX2Nvbm5lY3RfZHJpdmVyKHNlcmlvLCBkcnYpKSB7CiAJCQlzZXJpby0+ZGV2LmRyaXZlciA9IE5VTEw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTM4LDggKzE2OSw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlcmlvX2V2ZW50X2xvY2spOwkvKiBwcm90ZWN0cyBzZXJpb19ldmVudF9saXN0ICovCiBzdGF0aWMgTElTVF9IRUFEKHNlcmlvX2V2ZW50X2xpc3QpOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNlcmlvX3dhaXQpOwotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihzZXJpb19leGl0ZWQpOwotc3RhdGljIGludCBzZXJpb19waWQ7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzZXJpb190YXNrOwogCiBzdGF0aWMgdm9pZCBzZXJpb19xdWV1ZV9ldmVudCh2b2lkICpvYmplY3QsIHN0cnVjdCBtb2R1bGUgKm93bmVyLAogCQkJICAgICAgZW51bSBzZXJpb19ldmVudF90eXBlIGV2ZW50X3R5cGUpCkBAIC0xNTAsMTIgKzE4MCwxMiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJpb19ldmVudF9sb2NrLCBmbGFncyk7CiAKIAkvKgotIAkgKiBTY2FuIGV2ZW50IGxpc3QgZm9yIHRoZSBvdGhlciBldmVudHMgZm9yIHRoZSBzYW1lIHNlcmlvIHBvcnQsCisJICogU2NhbiBldmVudCBsaXN0IGZvciB0aGUgb3RoZXIgZXZlbnRzIGZvciB0aGUgc2FtZSBzZXJpbyBwb3J0LAogCSAqIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgcmVjZW50IG9uZS4gSWYgZXZlbnQgaXMgdGhlIHNhbWUgd2UKIAkgKiBkbyBub3QgbmVlZCBhZGQgbmV3IG9uZS4gSWYgZXZlbnQgaXMgb2YgZGlmZmVyZW50IHR5cGUgd2UKIAkgKiBuZWVkIHRvIGFkZCB0aGlzIGV2ZW50IGFuZCBzaG91bGQgbm90IGxvb2sgZnVydGhlciBiZWNhdXNlCiAJICogd2UgbmVlZCB0byBwcmVzZXZlIHNlcXVlbmNlIG9mIGRpc3RpbmN0IGV2ZW50cy4KLSAJICovCisJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGV2ZW50LCAmc2VyaW9fZXZlbnRfbGlzdCwgbm9kZSkgewogCQlpZiAoZXZlbnQtPm9iamVjdCA9PSBvYmplY3QpIHsKIAkJCWlmIChldmVudC0+dHlwZSA9PSBldmVudF90eXBlKQpAQCAtMzM3LDIwICszNjcsMTUgQEAKIAogc3RhdGljIGludCBzZXJpb190aHJlYWQodm9pZCAqbm90aGluZykKIHsKLQlsb2NrX2tlcm5lbCgpOwotCWRhZW1vbml6ZSgia3NlcmlvZCIpOwotCWFsbG93X3NpZ25hbChTSUdURVJNKTsKLQogCWRvIHsKIAkJc2VyaW9faGFuZGxlX2V2ZW50cygpOwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2VyaW9fd2FpdCwgIWxpc3RfZW1wdHkoJnNlcmlvX2V2ZW50X2xpc3QpKTsKLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOwotCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzZXJpb193YWl0LAorCQkJa3RocmVhZF9zaG91bGRfc3RvcCgpIHx8ICFsaXN0X2VtcHR5KCZzZXJpb19ldmVudF9saXN0KSk7CisJCXRyeV90b19mcmVlemUoKTsKKwl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAogCXByaW50ayhLRVJOX0RFQlVHICJzZXJpbzoga3NlcmlvZCBleGl0aW5nXG4iKTsKLQotCXVubG9ja19rZXJuZWwoKTsKLQljb21wbGV0ZV9hbmRfZXhpdCgmc2VyaW9fZXhpdGVkLCAwKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC01NTcsNyArNTgyLDcgQEAKIHN0YXRpYyB2b2lkIHNlcmlvX3JlY29ubmVjdF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pCiB7CiAJZG8gewotCQlpZiAoIXNlcmlvLT5kcnYgfHwgIXNlcmlvLT5kcnYtPnJlY29ubmVjdCB8fCBzZXJpby0+ZHJ2LT5yZWNvbm5lY3Qoc2VyaW8pKSB7CisJCWlmIChzZXJpb19yZWNvbm5lY3RfZHJpdmVyKHNlcmlvKSkgewogCQkJc2VyaW9fZGlzY29ubmVjdF9wb3J0KHNlcmlvKTsKIAkJCXNlcmlvX2ZpbmRfZHJpdmVyKHNlcmlvKTsKIAkJCS8qIE9rLCBvbGQgY2hpbGRyZW4gYXJlIG5vdyBnb25lLCB3ZSBhcmUgZG9uZSAqLwpAQCAtNjMwLDYgKzY1NSwxOSBAQAogfQogCiAvKgorICogU2FmZWx5IHVucmVnaXN0ZXJzIGNoaWxkIHBvcnQgaWYgb25lIGlzIHByZXNlbnQuCisgKi8KK3ZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pCit7CisJZG93bigmc2VyaW9fc2VtKTsKKwlpZiAoc2VyaW8tPmNoaWxkKSB7CisJCXNlcmlvX2Rpc2Nvbm5lY3RfcG9ydChzZXJpby0+Y2hpbGQpOworCQlzZXJpb19kZXN0cm95X3BvcnQoc2VyaW8tPmNoaWxkKTsKKwl9CisJdXAoJnNlcmlvX3NlbSk7Cit9CisKKy8qCiAgKiBTdWJtaXRzIHJlZ2lzdGVyIHJlcXVlc3QgdG8ga3NlcmlvZCBmb3Igc3Vic2VxdWVudCBleGVjdXRpb24uCiAgKiBDYW4gYmUgdXNlZCB3aGVuIGl0IGlzIG5vdCBvYnZpb3VzIHdoZXRoZXIgdGhlIHNlcmlvX3NlbSBpcwogICogdGFrZW4gb3Igbm90IGFuZCB3aGVuIGRlbGF5ZWQgZXhlY3V0aW9uIGlzIGZlYXNpYmxlLgpAQCAtNjg2LDE1ICs3MjQsMTQgQEAKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gdG9fc2VyaW9fcG9ydChkZXYpOwogCXN0cnVjdCBzZXJpb19kcml2ZXIgKmRydiA9IHRvX3NlcmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKLQlyZXR1cm4gZHJ2LT5jb25uZWN0KHNlcmlvLCBkcnYpOworCXJldHVybiBzZXJpb19jb25uZWN0X2RyaXZlcihzZXJpbywgZHJ2KTsKIH0KIAogc3RhdGljIGludCBzZXJpb19kcml2ZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gdG9fc2VyaW9fcG9ydChkZXYpOwotCXN0cnVjdCBzZXJpb19kcml2ZXIgKmRydiA9IHRvX3NlcmlvX2RyaXZlcihkZXYtPmRyaXZlcik7CiAKLQlkcnYtPmRpc2Nvbm5lY3Qoc2VyaW8pOworCXNlcmlvX2Rpc2Nvbm5lY3RfZHJpdmVyKHNlcmlvKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzMwLDExICs3NjcsOSBAQAogCiBzdGF0aWMgdm9pZCBzZXJpb19zZXRfZHJ2KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBzZXJpb19kcml2ZXIgKmRydikKIHsKLQlkb3duKCZzZXJpby0+ZHJ2X3NlbSk7CiAJc2VyaW9fcGF1c2Vfcngoc2VyaW8pOwogCXNlcmlvLT5kcnYgPSBkcnY7CiAJc2VyaW9fY29udGludWVfcngoc2VyaW8pOwotCXVwKCZzZXJpby0+ZHJ2X3NlbSk7CiB9CiAKIHN0YXRpYyBpbnQgc2VyaW9fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKQEAgLTc5NCw3ICs4MjksNyBAQAogewogCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSB0b19zZXJpb19wb3J0KGRldik7CiAKLQlpZiAoIXNlcmlvLT5kcnYgfHwgIXNlcmlvLT5kcnYtPnJlY29ubmVjdCB8fCBzZXJpby0+ZHJ2LT5yZWNvbm5lY3Qoc2VyaW8pKSB7CisJaWYgKHNlcmlvX3JlY29ubmVjdF9kcml2ZXIoc2VyaW8pKSB7CiAJCS8qCiAJCSAqIERyaXZlciByZS1wcm9iaW5nIGNhbiB0YWtlIGEgd2hpbGUsIHNvIGJldHRlciBsZXQga3NlcmlvZAogCQkgKiBkZWFsIHdpdGggaXQuCkBAIC04NDgsOSArODgzLDEwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNlcmlvX2luaXQodm9pZCkKIHsKLQlpZiAoIShzZXJpb19waWQgPSBrZXJuZWxfdGhyZWFkKHNlcmlvX3RocmVhZCwgTlVMTCwgQ0xPTkVfS0VSTkVMKSkpIHsKKwlzZXJpb190YXNrID0ga3RocmVhZF9ydW4oc2VyaW9fdGhyZWFkLCBOVUxMLCAia3NlcmlvZCIpOworCWlmIChJU19FUlIoc2VyaW9fdGFzaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzZXJpbzogRmFpbGVkIHRvIHN0YXJ0IGtzZXJpb2RcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiBQVFJfRVJSKHNlcmlvX3Rhc2spOwogCX0KIAogCXNlcmlvX2J1cy5kZXZfYXR0cnMgPSBzZXJpb19kZXZpY2VfYXR0cnM7CkBAIC04NjYsOCArOTAyLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzZXJpb19leGl0KHZvaWQpCiB7CiAJYnVzX3VucmVnaXN0ZXIoJnNlcmlvX2J1cyk7Ci0Ja2lsbF9wcm9jKHNlcmlvX3BpZCwgU0lHVEVSTSwgMSk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmc2VyaW9fZXhpdGVkKTsKKwlrdGhyZWFkX3N0b3Aoc2VyaW9fdGFzayk7CiB9CiAKIG1vZHVsZV9pbml0KHNlcmlvX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbG8uYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxvLmMKaW5kZXggNTQ2Y2U1OS4uM2NkYzljYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbG8uYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Vsby5jCkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJCWlucHV0X3NldF9hYnNfcGFyYW1zKCZlbG8tPmRldiwgQUJTX1ksIDk2LCA0MDAwLCAwLCAwKTsKIAkJCWlucHV0X3NldF9hYnNfcGFyYW1zKCZlbG8tPmRldiwgQUJTX1BSRVNTVVJFLCAwLCAyNTUsIDAsIDApOwogCQkJYnJlYWs7Ci0JCQorCiAJCWNhc2UgMTogLyogNi1ieXRlIHByb3RvY29sICovCiAJCQlpbnB1dF9zZXRfYWJzX3BhcmFtcygmZWxvLT5kZXYsIEFCU19QUkVTU1VSRSwgMCwgMTUsIDAsIDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKaW5kZXggYWNiOTEzNy4uYmNmYTFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaDM2MDBfdHNfaW5wdXQuYwpAQCAtODksOSArODksOSBAQAogI2RlZmluZSBIMzYwMF9TQ0FOQ09ERV9RCTQJIC8qIDQgLT4gUSBidXR0b24gKi8KICNkZWZpbmUJSDM2MDBfU0NBTkNPREVfU1RBUlQJNQkgLyogNSAtPiBzdGFydCBtZW51ICovCiAjZGVmaW5lCUgzNjAwX1NDQU5DT0RFX1VQCTYJIC8qIDYgLT4gdXAgKi8KLSNkZWZpbmUgSDM2MDBfU0NBTkNPREVfUklHSFQJNyAJIC8qIDcgLT4gcmlnaHQgKi8KLSNkZWZpbmUgSDM2MDBfU0NBTkNPREVfTEVGVCAJOAkgLyogOCAtPiBsZWZ0ICovCi0jZGVmaW5lIEgzNjAwX1NDQU5DT0RFX0RPV04gCTkJIC8qIDkgLT4gZG93biAqLworI2RlZmluZSBIMzYwMF9TQ0FOQ09ERV9SSUdIVAk3CSAvKiA3IC0+IHJpZ2h0ICovCisjZGVmaW5lIEgzNjAwX1NDQU5DT0RFX0xFRlQJOAkgLyogOCAtPiBsZWZ0ICovCisjZGVmaW5lIEgzNjAwX1NDQU5DT0RFX0RPV04JOQkgLyogOSAtPiBkb3duICovCiAKIHN0YXRpYyBjaGFyICpoMzYwMF9uYW1lID0gIkgzNjAwIFRvdWNoU2NyZWVuIjsKIApAQCAtMTEzLDcgKzExMyw3IEBACiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhY3Rpb25fYnV0dG9uX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSAgICAgICAgaW50IGRvd24gPSAoR1BMUiAmIEdQSU9fQklUU1lfQUNUSU9OX0JVVFRPTikgPyAwIDogMTsKKwlpbnQgZG93biA9IChHUExSICYgR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OKSA/IDAgOiAxOwogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IChzdHJ1Y3QgaW5wdXRfZGV2ICopIGRldl9pZDsKIAogCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbnBvd2VyX2J1dHRvbl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIGludCBkb3duID0gKEdQTFIgJiBHUElPX0JJVFNZX05QT1dFUl9CVVRUT04pID8gMCA6IDE7CisJaW50IGRvd24gPSAoR1BMUiAmIEdQSU9fQklUU1lfTlBPV0VSX0JVVFRPTikgPyAwIDogMTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAoc3RydWN0IGlucHV0X2RldiAqKSBkZXZfaWQ7CiAKIAkvKgpAQCAtMTQ1LDggKzE0NSw4IEBACiBzdGF0aWMgaW50IGZsaXRlX2JyaWdodG5lc3MgPSAyNTsKIAogZW51bSBmbGl0ZV9wd3IgewotICAgICAgICBGTElURV9QV1JfT0ZGID0gMCwKLSAgICAgICAgRkxJVEVfUFdSX09OID0gMQorCUZMSVRFX1BXUl9PRkYgPSAwLAorCUZMSVRFX1BXUl9PTiA9IDEKIH07CiAKIC8qCkBAIC0xNTcsOSArMTU3LDkgQEAKIAlzdHJ1Y3QgaDM2MDBfZGV2ICp0cyA9IGRldi0+cHJpdmF0ZTsKIAogCS8qIE11c3QgYmUgaW4gdGhpcyBvcmRlciAqLwotICAgICAgIAl0cy0+c2VyaW8tPndyaXRlKHRzLT5zZXJpbywgMSk7CisJdHMtPnNlcmlvLT53cml0ZSh0cy0+c2VyaW8sIDEpOwogCXRzLT5zZXJpby0+d3JpdGUodHMtPnNlcmlvLCBwd3IpOwotICAgICAgCXRzLT5zZXJpby0+d3JpdGUodHMtPnNlcmlvLCBicmlnaHRuZXNzKTsKKwl0cy0+c2VyaW8tPndyaXRlKHRzLT5zZXJpbywgYnJpZ2h0bmVzcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2OSwyNiArMTY5LDI2IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gKHN0cnVjdCBpbnB1dF9kZXYgKikgZGF0YTsKIAotICAgICAgICBzd2l0Y2ggKHJlcSkgewotICAgICAgICBjYXNlIFBNX1NVU1BFTkQ6IC8qIGVudGVyIEQxLUQzICovCi0gICAgICAgICAgICAgICAgc3VzcGVuZGVkID0gMTsKLSAgICAgICAgICAgICAgICBoMzYwMF9mbGl0ZV9wb3dlcihkZXYsIEZMSVRFX1BXUl9PRkYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBNX0JMQU5LOgotICAgICAgICAgICAgICAgIGlmICghc3VzcGVuZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgaDM2MDBfZmxpdGVfcG93ZXIoZGV2LCBGTElURV9QV1JfT0ZGKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQTV9SRVNVTUU6ICAvKiBlbnRlciBEMCAqLwotICAgICAgICAgICAgICAgIC8qIHNhbWUgYXMgdW5ibGFuayAqLwotICAgICAgICBjYXNlIFBNX1VOQkxBTks6Ci0gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9pbml0U2VyaWFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoMzYwMF9mbGl0ZV9wb3dlcihkZXYsIEZMSVRFX1BXUl9PTik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisJc3dpdGNoIChyZXEpIHsKKwljYXNlIFBNX1NVU1BFTkQ6IC8qIGVudGVyIEQxLUQzICovCisJCXN1c3BlbmRlZCA9IDE7CisJCWgzNjAwX2ZsaXRlX3Bvd2VyKGRldiwgRkxJVEVfUFdSX09GRik7CisJCWJyZWFrOworCWNhc2UgUE1fQkxBTks6CisJCWlmICghc3VzcGVuZGVkKQorCQkJaDM2MDBfZmxpdGVfcG93ZXIoZGV2LCBGTElURV9QV1JfT0ZGKTsKKwkJYnJlYWs7CisJY2FzZSBQTV9SRVNVTUU6ICAvKiBlbnRlciBEMCAqLworCQkvKiBzYW1lIGFzIHVuYmxhbmsgKi8KKwljYXNlIFBNX1VOQkxBTks6CisJCWlmIChzdXNwZW5kZWQpIHsKKwkJCS8vaW5pdFNlcmlhbCgpOworCQkJc3VzcGVuZGVkID0gMDsKKwkJfQorCQloMzYwMF9mbGl0ZV9wb3dlcihkZXYsIEZMSVRFX1BXUl9PTik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC0xOTksMjUgKzE5OSwyNSBAQAogICovCiBzdGF0aWMgdm9pZCBoMzYwMHRzX3Byb2Nlc3NfcGFja2V0KHN0cnVjdCBoMzYwMF9kZXYgKnRzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSAgICAgICAgc3RydWN0IGlucHV0X2RldiAqZGV2ID0gJnRzLT5kZXY7CisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gJnRzLT5kZXY7CiAJc3RhdGljIGludCB0b3VjaGVkID0gMDsKIAlpbnQga2V5LCBkb3duID0gMDsKIAogCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKIAotICAgICAgICBzd2l0Y2ggKHRzLT5ldmVudCkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgQnV0dG9ucyAtIHJldHVybmVkIGFzIGEgc2luZ2xlIGJ5dGUKLSAgICAgICAgICAgICAgICAgICAgICAgIDcgNiA1IDQgMyAyIDEgMAotICAgICAgICAgICAgICAgICAgICAgICAgUyB4IHggeCBOIE4gTiBOCisJc3dpdGNoICh0cy0+ZXZlbnQpIHsKKwkJLyoKKwkJICAgQnV0dG9ucyAtIHJldHVybmVkIGFzIGEgc2luZ2xlIGJ5dGUKKwkJCTcgNiA1IDQgMyAyIDEgMAorCQkJUyB4IHggeCBOIE4gTiBOCiAKLSAgICAgICAgICAgICAgICAgICBTICAgICAgIHN3aXRjaCBzdGF0ZSAoIDA9cHJlc3NlZCAxPXJlbGVhc2VkKQotICAgICAgICAgICAgICAgICAgIHggICAgICAgVW51c2VkLgotICAgICAgICAgICAgICAgICAgIE5OTk4gICAgc3dpdGNoIG51bWJlciAwLTE1CisJCSAgIFMgICAgICAgc3dpdGNoIHN0YXRlICggMD1wcmVzc2VkIDE9cmVsZWFzZWQpCisJCSAgIHggICAgICAgVW51c2VkLgorCQkgICBOTk5OICAgIHN3aXRjaCBudW1iZXIgMC0xNQogCi0gICAgICAgICAgICAgICAgTm90ZTogVGhpcyBpcyB0cnVlIGZvciBub24gaW50ZXJydXB0IGdlbmVyYXRlZCBrZXkgZXZlbnRzLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgY2FzZSBLRVlCRF9JRDoKKwkJICAgTm90ZTogVGhpcyBpcyB0cnVlIGZvciBub24gaW50ZXJydXB0IGdlbmVyYXRlZCBrZXkgZXZlbnRzLgorCQkqLworCQljYXNlIEtFWUJEX0lEOgogCQkJZG93biA9ICh0cy0+YnVmWzBdICYgMHg4MCkgPyAwIDogMTsKIAogCQkJc3dpdGNoICh0cy0+YnVmWzBdICYgMHg3ZikgewpAQCAtMjI5LDQwICsyMjksNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAkJCQljYXNlIEgzNjAwX1NDQU5DT0RFX0NPTlRBQ1RTOgogCQkJCQlrZXkgPSBLRVlfUFJPRzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWJyZWFrOwogCQkJCWNhc2UgSDM2MDBfU0NBTkNPREVfUToKIAkJCQkJa2V5ID0gS0VZX1E7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWJyZWFrOwogCQkJCWNhc2UgSDM2MDBfU0NBTkNPREVfU1RBUlQ6CiAJCQkJCWtleSA9IEtFWV9QUk9HMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSBIMzYwMF9TQ0FOQ09ERV9VUDoKIAkJCQkJa2V5ID0gS0VZX1VQOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCQkJCQlicmVhazsKIAkJCQljYXNlIEgzNjAwX1NDQU5DT0RFX1JJR0hUOgogCQkJCQlrZXkgPSBLRVlfUklHSFQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWJyZWFrOwogCQkJCWNhc2UgSDM2MDBfU0NBTkNPREVfTEVGVDoKIAkJCQkJa2V5ID0gS0VZX0xFRlQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWJyZWFrOwogCQkJCWNhc2UgSDM2MDBfU0NBTkNPREVfRE9XTjoKIAkJCQkJa2V5ID0gS0VZX0RPV047Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCWtleSA9IDA7CiAJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KQotICAgICAgICAgICAgICAgICAgICAgICAgCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXksIGRvd24pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBOYXRpdmUgdG91Y2hzY3JlZW4gZXZlbnQgZGF0YSBpcyBmb3JtYXR0ZWQgYXMgc2hvd24gYmVsb3c6LQotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogICAgICArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgKiAgICAgIHwgWG1zYiAgfCBYbHNiICB8IFltc2IgIHwgWWxzYiAgfAotICAgICAgICAgICAgICAgICAqICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICogICAgICAgYnl0ZSAwICAgIDEgICAgICAgMiAgICAgICAzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgY2FzZSBUT1VDSFNfSUQ6CisJCQlpZiAoa2V5KQorCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXksIGRvd24pOworCQkJYnJlYWs7CisJCS8qCisJCSAqIE5hdGl2ZSB0b3VjaHNjcmVlbiBldmVudCBkYXRhIGlzIGZvcm1hdHRlZCBhcyBzaG93biBiZWxvdzotCisJCSAqCisJCSAqICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJCSAqICAgICAgfCBYbXNiICB8IFhsc2IgIHwgWW1zYiAgfCBZbHNiICB8CisJCSAqICAgICAgKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisJCSAqICAgICAgIGJ5dGUgMCAgICAxICAgICAgIDIgICAgICAgMworCQkgKi8KKwkJY2FzZSBUT1VDSFNfSUQ6CiAJCQlpZiAoIXRvdWNoZWQpIHsKIAkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCAxKTsKIAkJCQl0b3VjaGVkID0gMTsKQEAgLTI3MiwxOSArMjcyLDE5IEBACiAJCQkJdW5zaWduZWQgc2hvcnQgeCwgeTsKIAogCQkJCXggPSB0cy0+YnVmWzBdOyB4IDw8PSA4OyB4ICs9IHRzLT5idWZbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB0cy0+YnVmWzJdOyB5IDw8PSA4OyB5ICs9IHRzLT5idWZbM107CisJCQkJeSA9IHRzLT5idWZbMl07IHkgPDw9IDg7IHkgKz0gdHMtPmJ1ZlszXTsKIAotICAgICAgICAgICAgICAgICAgICAgICAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKKwkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIHgpOworCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgeSk7CiAJCQl9IGVsc2UgewotCQkgICAgICAgICAgICAgICAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMCk7CisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgMCk7CiAJCQkJdG91Y2hlZCA9IDA7CiAJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogU2VuZCBhIG5vbiBpbnB1dCBldmVudCBlbHNld2hlcmUgKi8KIAkJCWJyZWFrOwotICAgICAgICB9CisJfQogCiAJaW5wdXRfc3luYyhkZXYpOwogfQpAQCAtMjkzLDcgKzI5Myw3IEBACiAgKiBoMzYwMHRzX2V2ZW50KCkgaGFuZGxlcyBldmVudHMgZnJvbSB0aGUgaW5wdXQgbW9kdWxlLgogICovCiBzdGF0aWMgaW50IGgzNjAwdHNfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwKLQkJIAkgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKKwkJCSB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewogCXN0cnVjdCBoMzYwMF9kZXYgKnRzID0gZGV2LT5wcml2YXRlOwogCkBAIC0zMzIsNDEgKzMzMiw0MSBAQAogc3RhdGljIGlycXJldHVybl90IGgzNjAwdHNfaW50ZXJydXB0KHN0cnVjdCBzZXJpbyAqc2VyaW8sIHVuc2lnbmVkIGNoYXIgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotICAgICAgICBzdHJ1Y3QgaDM2MDBfZGV2ICp0cyA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKKwlzdHJ1Y3QgaDM2MDBfZGV2ICp0cyA9IHNlcmlvX2dldF9kcnZkYXRhKHNlcmlvKTsKIAogCS8qCi0gICAgICAgICAqIFdlIGhhdmUgYSBuZXcgZnJhbWUgY29taW5nIGluLgotICAgICAgICAgKi8KKwkgKiBXZSBoYXZlIGEgbmV3IGZyYW1lIGNvbWluZyBpbi4KKwkgKi8KIAlzd2l0Y2ggKHN0YXRlKSB7CiAJCWNhc2UgU1RBVEVfU09GOgotICAgICAgICAJCWlmIChkYXRhID09IENIQVJfU09GKQotICAgICAgICAgICAgICAgIAkJc3RhdGUgPSBTVEFURV9JRDsKKwkJCWlmIChkYXRhID09IENIQVJfU09GKQorCQkJCXN0YXRlID0gU1RBVEVfSUQ7CiAJCQlicmVhazsKLSAgICAgICAgCWNhc2UgU1RBVEVfSUQ6CisJCWNhc2UgU1RBVEVfSUQ6CiAJCQl0cy0+ZXZlbnQgPSAoZGF0YSAmIDB4ZjApID4+IDQ7CiAJCQl0cy0+bGVuID0gKGRhdGEgJiAweGYpOwogCQkJdHMtPmlkeCA9IDA7CiAJCQlpZiAodHMtPmV2ZW50ID49IE1BWF9JRCkgewogCQkJCXN0YXRlID0gU1RBVEVfU09GOwotICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworCQkJCWJyZWFrOwogCQkJfQogCQkJdHMtPmNoa3N1bSA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgCXN0YXRlID0gKHRzLT5sZW4gPiAwKSA/IFNUQVRFX0RBVEEgOiBTVEFURV9FT0Y7CisJCQlzdGF0ZSA9ICh0cy0+bGVuID4gMCkgPyBTVEFURV9EQVRBIDogU1RBVEVfRU9GOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfREFUQToKIAkJCXRzLT5jaGtzdW0gKz0gZGF0YTsKIAkJCXRzLT5idWZbdHMtPmlkeF09IGRhdGE7Ci0JCQlpZigrK3RzLT5pZHggPT0gdHMtPmxlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIAlzdGF0ZSA9IFNUQVRFX0VPRjsKKwkJCWlmICgrK3RzLT5pZHggPT0gdHMtPmxlbikKKwkJCQlzdGF0ZSA9IFNUQVRFX0VPRjsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFX0VPRjoKLSAgICAgICAgICAgICAgICAJc3RhdGUgPSBTVEFURV9TT0Y7Ci0gICAgICAgICAgICAgICAgCWlmIChkYXRhID09IENIQVJfRU9GIHx8IGRhdGEgPT0gdHMtPmNoa3N1bSkKKwkJCXN0YXRlID0gU1RBVEVfU09GOworCQkJaWYgKGRhdGEgPT0gQ0hBUl9FT0YgfHwgZGF0YSA9PSB0cy0+Y2hrc3VtKQogCQkJCWgzNjAwdHNfcHJvY2Vzc19wYWNrZXQodHMsIHJlZ3MpOwotICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgCXByaW50aygiRXJyb3IzXG4iKTsKLSAgICAgICAgICAgICAgICAJYnJlYWs7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiRXJyb3IzXG4iKTsKKwkJCWJyZWFrOwogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTM5MCwxMCArMzkwLDEwIEBACiAJaW5pdF9pbnB1dF9kZXYoJnRzLT5kZXYpOwogCiAJLyogRGV2aWNlIHNwZWNpZmljIHN0dWZmICovCi0gICAgICAgIHNldF9HUElPX0lSUV9lZGdlKEdQSU9fQklUU1lfQUNUSU9OX0JVVFRPTiwgR1BJT19CT1RIX0VER0VTKTsKLSAgICAgICAgc2V0X0dQSU9fSVJRX2VkZ2UoR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBHUElPX1JJU0lOR19FREdFKTsKKwlzZXRfR1BJT19JUlFfZWRnZShHUElPX0JJVFNZX0FDVElPTl9CVVRUT04sIEdQSU9fQk9USF9FREdFUyk7CisJc2V0X0dQSU9fSVJRX2VkZ2UoR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBHUElPX1JJU0lOR19FREdFKTsKIAotICAgICAgICBpZiAocmVxdWVzdF9pcnEoSVJRX0dQSU9fQklUU1lfQUNUSU9OX0JVVFRPTiwgYWN0aW9uX2J1dHRvbl9oYW5kbGVyLAorCWlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OLCBhY3Rpb25fYnV0dG9uX2hhbmRsZXIsCiAJCQlTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCB8IFNBX1NBTVBMRV9SQU5ET00sCiAJCQkiaDM2MDBfYWN0aW9uIiwgJnRzLT5kZXYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaDM2MDB0cy5jOiBDb3VsZCBub3QgYWxsb2NhdGUgQWN0aW9uIEJ1dHRvbiBJUlEhXG4iKTsKQEAgLTQwMSw3ICs0MDEsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotICAgICAgICBpZiAocmVxdWVzdF9pcnEoSVJRX0dQSU9fQklUU1lfTlBPV0VSX0JVVFRPTiwgbnBvd2VyX2J1dHRvbl9oYW5kbGVyLAorCWlmIChyZXF1ZXN0X2lycShJUlFfR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCBucG93ZXJfYnV0dG9uX2hhbmRsZXIsCiAJCQlTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCB8IFNBX1NBTVBMRV9SQU5ET00sCiAJCQkiaDM2MDBfc3VzcGVuZCIsICZ0cy0+ZGV2KSkgewogCQlmcmVlX2lycShJUlFfR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OLCAmdHMtPmRldik7CkBAIC00MzMsNyArNDMzLDcgQEAKIAogCXNwcmludGYodHMtPnBoeXMsICIlcy9pbnB1dDAiLCBzZXJpby0+cGh5cyk7CiAKLSAgICAgICAJdHMtPmRldi5ldmVudCA9IGgzNjAwdHNfZXZlbnQ7CisJdHMtPmRldi5ldmVudCA9IGgzNjAwdHNfZXZlbnQ7CiAJdHMtPmRldi5wcml2YXRlID0gdHM7CiAJdHMtPmRldi5uYW1lID0gaDM2MDBfbmFtZTsKIAl0cy0+ZGV2LnBoeXMgPSB0cy0+cGh5czsKQEAgLTQ0Niw4ICs0NDYsOCBAQAogCiAJZXJyID0gc2VyaW9fb3BlbihzZXJpbywgZHJ2KTsKIAlpZiAoZXJyKSB7Ci0gICAgICAgIAlmcmVlX2lycShJUlFfR1BJT19CSVRTWV9BQ1RJT05fQlVUVE9OLCB0cyk7Ci0gICAgICAgIAlmcmVlX2lycShJUlFfR1BJT19CSVRTWV9OUE9XRVJfQlVUVE9OLCB0cyk7CisJCWZyZWVfaXJxKElSUV9HUElPX0JJVFNZX0FDVElPTl9CVVRUT04sIHRzKTsKKwkJZnJlZV9pcnEoSVJRX0dQSU9fQklUU1lfTlBPV0VSX0JVVFRPTiwgdHMpOwogCQlzZXJpb19zZXRfZHJ2ZGF0YShzZXJpbywgTlVMTCk7CiAJCWtmcmVlKHRzKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWs3MTIuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWs3MTIuYwppbmRleCAyZDE0YTU3Li5hZmFhZWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21rNzEyLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9tazcxMi5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBmb3VuZCBpbiBHYXRld2F5IEFPTCBDb25uZWN0ZWQgVG91Y2hwYWQgY29tcHV0ZXJzLgogICoKICAqIERvY3VtZW50YXRpb24gZm9yIElDUyBNSzcxMiBjYW4gYmUgZm91bmQgYXQ6Ci0gKiAJaHR0cDovL3d3dy5pY3N0LmNvbS9wZGYvbWs3MTIucGRmCisgKglodHRwOi8vd3d3Lmljc3QuY29tL3BkZi9tazcxMi5wZGYKICAqLwogCiAvKgpAQCAtNzcsNyArNzcsNiBAQAogI2RlZmluZSBNSzcxMl9SRUFEX09ORV9QT0lOVAkJCTB4MjAKICNkZWZpbmUgTUs3MTJfUE9XRVJVUAkJCQkweDQwCiAKLXN0YXRpYyBpbnQgbWs3MTJfdXNlZCA9IDA7CiBzdGF0aWMgc3RydWN0IGlucHV0X2RldiBtazcxMl9kZXY7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1rNzEyX2xvY2spOwogCkBAIC0xMzAsMTcgKzEyOSwxNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1rNzEyX2xvY2ssIGZsYWdzKTsKIAotCWlmICghbWs3MTJfdXNlZCsrKSB7CisJb3V0YigwLCBtazcxMl9pbyArIE1LNzEyX0NPTlRST0wpOyAvKiBSZXNldCAqLwogCi0JCW91dGIoMCwgbWs3MTJfaW8gKyBNSzcxMl9DT05UUk9MKTsgLyogUmVzZXQgKi8KKwlvdXRiKE1LNzEyX0VOQUJMRV9JTlQgfCBNSzcxMl9JTlRfT05fQ09OVkVSU0lPTl9DT01QTEVURSB8CisJCU1LNzEyX0lOVF9PTl9DSEFOR0VfSU5fVE9VQ0hfU1RBVFVTIHwKKwkJTUs3MTJfRU5BQkxFX1BFUklPRElDX0NPTlZFUlNJT05TIHwKKwkJTUs3MTJfUE9XRVJVUCwgbWs3MTJfaW8gKyBNSzcxMl9DT05UUk9MKTsKIAotCQlvdXRiKE1LNzEyX0VOQUJMRV9JTlQgfCBNSzcxMl9JTlRfT05fQ09OVkVSU0lPTl9DT01QTEVURSB8Ci0JCQlNSzcxMl9JTlRfT05fQ0hBTkdFX0lOX1RPVUNIX1NUQVRVUyB8Ci0JCQlNSzcxMl9FTkFCTEVfUEVSSU9ESUNfQ09OVkVSU0lPTlMgfAotCQkJTUs3MTJfUE9XRVJVUCwgbWs3MTJfaW8gKyBNSzcxMl9DT05UUk9MKTsKLQotCQlvdXRiKDEwLCBtazcxMl9pbyArIE1LNzEyX1JBVEUpOyAvKiAxODcgcG9pbnRzIHBlciBzZWNvbmQgKi8KLQl9CisJb3V0YigxMCwgbWs3MTJfaW8gKyBNSzcxMl9SQVRFKTsgLyogMTg3IHBvaW50cyBwZXIgc2Vjb25kICovCiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtazcxMl9sb2NrLCBmbGFncyk7CiAKQEAgLTE1Myw4ICsxNDksNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1rNzEyX2xvY2ssIGZsYWdzKTsKIAotCWlmICghLS1tazcxMl91c2VkKQotCQlvdXRiKDAsIG1rNzEyX2lvICsgTUs3MTJfQ09OVFJPTCk7CisJb3V0YigwLCBtazcxMl9pbyArIE1LNzEyX0NPTlRST0wpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWs3MTJfbG9jaywgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5jIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5jCmluZGV4IDQwMzk1ZjUuLmFmYTQ2NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuYworKysgYi9kcml2ZXJzL2lzZG4vYWN0MjAwMC9jYXBpLmMKQEAgLTIyNCw2ICsyMjQsNyBAQAogLyoKICAqIFN3aXRjaCBWLjQyIG9uIG9yIG9mZgogICovCisjaWYgMAogaW50CiBhY3RjYXBpX21hbnVmYWN0dXJlcl9yZXFfdjQyKGFjdDIwMDBfY2FyZCAqY2FyZCwgdWxvbmcgYXJnKQogewpAQCAtMjQyLDYgKzI0Myw3IEBACiAJQUNUQ0FQSV9RVUVVRV9UWDsKICAgICAgICAgcmV0dXJuIDA7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCiAvKgogICogU2V0IGVycm9yLWhhbmRsZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuaCBiL2RyaXZlcnMvaXNkbi9hY3QyMDAwL2NhcGkuaAppbmRleCAwNGQyYmNkLi5mNmQ1ZjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vYWN0MjAwMC9jYXBpLmgKKysrIGIvZHJpdmVycy9pc2RuL2FjdDIwMDAvY2FwaS5oCkBAIC0zNTAsNyArMzUwLDYgQEAKIGV4dGVybiBpbnQgYWN0Y2FwaV9jaGtoZHIoYWN0MjAwMF9jYXJkICosIGFjdGNhcGlfbXNnaGRyICopOwogZXh0ZXJuIGludCBhY3RjYXBpX2xpc3Rlbl9yZXEoYWN0MjAwMF9jYXJkICopOwogZXh0ZXJuIGludCBhY3RjYXBpX21hbnVmYWN0dXJlcl9yZXFfbmV0KGFjdDIwMDBfY2FyZCAqKTsKLWV4dGVybiBpbnQgYWN0Y2FwaV9tYW51ZmFjdHVyZXJfcmVxX3Y0MihhY3QyMDAwX2NhcmQgKiwgdWxvbmcpOwogZXh0ZXJuIGludCBhY3RjYXBpX21hbnVmYWN0dXJlcl9yZXFfZXJyaChhY3QyMDAwX2NhcmQgKik7CiBleHRlcm4gaW50IGFjdGNhcGlfbWFudWZhY3R1cmVyX3JlcV9tc24oYWN0MjAwMF9jYXJkICopOwogZXh0ZXJuIGludCBhY3RjYXBpX2Nvbm5lY3RfcmVxKGFjdDIwMDBfY2FyZCAqLCBhY3QyMDAwX2NoYW4gKiwgY2hhciAqLCBjaGFyLCBpbnQsIGludCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9hdm1fY3MuYwppbmRleCBkYzAwYzg1Li5kYjliYWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2F2bV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYXZtX2NzLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE2MSwxMSArMTYwLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF2bWNzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDg2LDEzICs0ODAsMjMgQEAKICAgICByZXR1cm4gMDsKIH0gLyogYXZtY3NfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGF2bWNzX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVk0iLCAiSVNETi1Db250cm9sbGVyIEIxIiwgMHg5NWQ0MjAwOCwgMHg4NDVkYzMzNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFWTSIsICJNb2JpbGUgSVNETi1Db250cm9sbGVyIE0xIiwgMHg5NWQ0MjAwOCwgMHg4MWUxMDQzMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFWTSIsICJNb2JpbGUgSVNETi1Db250cm9sbGVyIE0yIiwgMHg5NWQ0MjAwOCwgMHgxOGU4NTU4YSksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGF2bWNzX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdm1jc19kcml2ZXIgPSB7CiAJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJLmRydgk9IHsKIAkJLm5hbWUJPSAiYXZtX2NzIiwKIAl9LAogCS5hdHRhY2gJPSBhdm1jc19hdHRhY2gsCisJLmV2ZW50CT0gYXZtY3NfZXZlbnQsCiAJLmRldGFjaAk9IGF2bWNzX2RldGFjaCwKKwkuaWRfdGFibGUgPSBhdm1jc19pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhdm1jc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxZG1hLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2IxZG1hLmMKaW5kZXggNTViZWQwMC4uOTFkZDA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9iMWRtYS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYjFkbWEuYwpAQCAtOTU1LDcgKzk1NSw3IEBACiBFWFBPUlRfU1lNQk9MKGIxZG1hX3NlbmRfbWVzc2FnZSk7CiBFWFBPUlRfU1lNQk9MKGIxZG1hY3RsX3JlYWRfcHJvYyk7CiAKLWludCBiMWRtYV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBiMWRtYV9pbml0KHZvaWQpCiB7CiAJY2hhciAqcDsKIAljaGFyIHJldlszMl07CkBAIC05NzIsNyArOTcyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBiMWRtYV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYjFkbWFfZXhpdCh2b2lkKQogewogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2M0LmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL2M0LmMKaW5kZXggZmE2YjkzYi4uNzI0YWFjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS9jNC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vYzQuYwpAQCAtODg1LDcgKzg4NSw3IEBACiB9CiAKIAotdm9pZCBjNF9yZXNldF9jdHIoc3RydWN0IGNhcGlfY3RyICpjdHJsKQorc3RhdGljIHZvaWQgYzRfcmVzZXRfY3RyKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAlhdm1jYXJkICpjYXJkID0gKChhdm1jdHJsX2luZm8gKikoY3RybC0+ZHJpdmVyZGF0YSkpLT5jYXJkOwogCWF2bWN0cmxfaW5mbyAqY2luZm87CkBAIC05MzMsNyArOTMzLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogCi12b2lkIGM0X3JlZ2lzdGVyX2FwcGwoc3RydWN0IGNhcGlfY3RyICpjdHJsLAorc3RhdGljIHZvaWQgYzRfcmVnaXN0ZXJfYXBwbChzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwsCiAJCQkJdTE2IGFwcGwsCiAJCQkJY2FwaV9yZWdpc3Rlcl9wYXJhbXMgKnJwKQogewpAQCAtOTc4LDcgKzk3OCw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBjNF9yZWxlYXNlX2FwcGwoc3RydWN0IGNhcGlfY3RyICpjdHJsLCB1MTYgYXBwbCkKK3N0YXRpYyB2b2lkIGM0X3JlbGVhc2VfYXBwbChzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwsIHUxNiBhcHBsKQogewogCWF2bWN0cmxfaW5mbyAqY2luZm8gPSAoYXZtY3RybF9pbmZvICopKGN0cmwtPmRyaXZlcmRhdGEpOwogCWF2bWNhcmQgKmNhcmQgPSBjaW5mby0+Y2FyZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vdDFpc2EuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9hdm0vdDFpc2EuYwppbmRleCBjYjlkOWNlLi4zYjcwMWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvYXZtL3QxaXNhLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL2F2bS90MWlzYS5jCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCB0MWlzYV9yZXNldF9jdHIoc3RydWN0IGNhcGlfY3RyICpjdHJsKQorc3RhdGljIHZvaWQgdDFpc2FfcmVzZXRfY3RyKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAlhdm1jdHJsX2luZm8gKmNpbmZvID0gKGF2bWN0cmxfaW5mbyAqKShjdHJsLT5kcml2ZXJkYXRhKTsKIAlhdm1jYXJkICpjYXJkID0gY2luZm8tPmNhcmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvZWljb24vZGFkYXB0ZXIuYyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kYWRhcHRlci5jCmluZGV4IDZlNTQ4YTIuLjg5NDk3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kYWRhcHRlci5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9laWNvbi9kYWRhcHRlci5jCkBAIC00NCw3ICs0NCw3IEBACiAgIEFycmF5IHRvIGhlbGQgYWRhcHRlciBpbmZvcm1hdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBERVNDUklQVE9SICBIYW5kbGVUYWJsZVtORVdfTUFYX0RFU0NSSVBUT1JTXTsKLWR3b3JkIEFkYXB0ZXJzID0gMDsgLyogTnVtYmVyIG9mIGFkYXB0ZXJzICovCitzdGF0aWMgZHdvcmQgQWRhcHRlcnMgPSAwOyAvKiBOdW1iZXIgb2YgYWRhcHRlcnMgKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNoYWRvdyBJRElfRElNQUlOVAogICBhbmQgJ3NoYWRvdycgZGVidWcgc3R1ZmYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9NYWtlZmlsZSBiL2RyaXZlcnMvaXNkbi9oaXNheC9NYWtlZmlsZQppbmRleCA4ZDZiYjU2Li4yOTNlMjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L01ha2VmaWxlCkBAIC0yMyw3ICsyMyw3IEBACiAjIE11bHRpcGFydCBvYmplY3RzLgogCiBoaXNheF9zdDU0ODEteSAJCQkJOj0gc3Q1NDgxX2luaXQubyBzdDU0ODFfdXNiLm8gc3Q1NDgxX2QubyBcCi0JCQkJCSAgIHN0NTQ4MV9iLm8gc3Q1NDgxX2hkbGMubworCQkJCQkgICBzdDU0ODFfYi5vCiAKIGhpc2F4LXkJICAJCQkJOj0gY29uZmlnLm8gaXNkbmwxLm8gdGVpLm8gaXNkbmwyLm8gaXNkbmwzLm8gXAogCQkgICAgIAkJCSAgIGxtZ3IubyBxOTMxLm8gY2FsbGMubyBmc20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2FtZDc5MzBfZm4uYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hbWQ3OTMwX2ZuLmMKaW5kZXggYzRmODYxYS4uOGFlMDhjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2FtZDc5MzBfZm4uYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvYW1kNzkzMF9mbi5jCkBAIC05Nyw3ICs5Nyw3IEBACiB9OwogCiAKLXZvaWQgLyogbWFjcm8gd1dvcmRBTUQgKi8KK3N0YXRpYyB2b2lkIC8qIG1hY3JvIHdXb3JkQU1EICovCiBXcml0ZVdvcmRBbWQ3OTMwKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgQllURSByZWcsIFdPUkQgdmFsKQogewogICAgICAgICB3Qnl0ZUFNRChjcywgMHgwMCwgcmVnKTsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICB3Qnl0ZUFNRChjcywgMHgwMSwgSElCWVRFKHZhbCkpOwogfQogCi1XT1JEIC8qIG1hY3JvIHJXb3JkQU1EICovCitzdGF0aWMgV09SRCAvKiBtYWNybyByV29yZEFNRCAqLwogUmVhZFdvcmRBbWQ3OTMwKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgQllURSByZWcpCiB7CiAgICAgICAgIFdPUkQgcmVzOwpAQCAtNjY1LDcgKzY2NSw3IEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogc2V0c3RhY2tfQW1kNzkzMChzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCkBAIC02NzYsNyArNjc2LDcgQEAKIH0KIAogCi12b2lkCitzdGF0aWMgdm9pZAogRENfQ2xvc2VfQW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpIHsKICAgICAgICAgaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQogCQlkZWJ1Z2wxKGNzLCAiQW1kNzkzMDogRENfQ2xvc2UgY2FsbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXN1c2NvbS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2FzdXNjb20uYwppbmRleCA3NTQ2ZTJlLi5hOThjNWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXN1c2NvbS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hc3VzY29tLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107CiAKLWNvbnN0IGNoYXIgKkFzdXNjb21fcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjE0LjIuNCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpBc3VzY29tX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4xNC4yLjQgJCI7CiAKICNkZWZpbmUgYnl0ZW91dChhZGRyLHZhbCkgb3V0Yih2YWwsYWRkcikKICNkZWZpbmUgYnl0ZWluKGFkZHIpIGluYihhZGRyKQpAQCAtMjM5LDcgKzIzOSw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19hc3VzY29tKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlpbnQgYnl0ZWNudCA9IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtX3BjaS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2F2bV9wY2kuYwppbmRleCA2ZmNiMmNmLi42MjU3OTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtX3BjaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1fcGNpLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCQlyZXR1cm4oTlVMTCk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiB3cml0ZV9jdHJsKHN0cnVjdCBCQ1N0YXRlICpiY3MsIGludCB3aGljaCkgewogCiAJaWYgKGJjcy0+Y3MtPmRlYnVnICYgTDFfREVCX0hTQ1gpCkBAIC0xOTMsNyArMTkzLDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtb2RlaGRsYyhzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBpbnQgbW9kZSwgaW50IGJjKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CkBAIC00NTEsNyArNDUxLDcgQEAKIAl9CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIEhETENfaXJxX21haW4oc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXVfaW50IHN0YXQ7CkBAIC00ODcsNyArNDg3LDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBoZGxjX2wybDEoc3RydWN0IFBTdGFjayAqc3QsIGludCBwciwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBCQ1N0YXRlICpiY3MgPSBzdC0+bDEuYmNzOwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogY2xvc2VfaGRsY3N0YXRlKHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJbW9kZWhkbGMoYmNzLCAwLCAwKTsKQEAgLTU3MCw3ICs1NzAsNyBAQAogCX0KIH0KIAotaW50CitzdGF0aWMgaW50CiBvcGVuX2hkbGNzdGF0ZShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJDX0ZMR19JTklULCAmYmNzLT5GbGFnKSkgewpAQCAtNTk4LDcgKzU5OCw3IEBACiAJcmV0dXJuICgwKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBzZXRzdGFja19oZGxjKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQogewogCWJjcy0+Y2hhbm5lbCA9IHN0LT5sMS5iYzsKQEAgLTYxMiw2ICs2MTIsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKKyNpZiAwCiB2b2lkIF9faW5pdAogY2xlYXJfcGVuZGluZ19oZGxjX2ludHMoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewpAQCAtNjQxLDggKzY0Miw5IEBACiAJCWRlYnVnbDEoY3MsICJIRExDIDIgVklOICV4IiwgdmFsKTsKIAl9CiB9CisjZW5kaWYgIC8qICAwICAqLwogCi12b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19pbml0CiBpbml0aGRsYyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJY3MtPmJjc1swXS5CQ19TZXRTdGFjayA9IHNldHN0YWNrX2hkbGM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvYXZtYTFfY3MuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jCmluZGV4IDY2M2EwYmYuLjBlMjI5OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9hdm1hMV9jcy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xODMsMTEgKzE4Miw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhdm1hMWNzX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNTAxLDEzICs0OTUsMjIgQEAKICAgICByZXR1cm4gMDsKIH0gLyogYXZtYTFjc19ldmVudCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYXZtYTFjc19pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVZNIiwgIklTRE4gQSIsIDB4OTVkNDIwMDgsIDB4YWRjOWQ0YmIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJU0ROIiwgIkNBUkQiLCAweDhkOTc2MWM4LCAweDAxYzVhYTdiKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgYXZtYTFjc19pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgYXZtYTFjc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJhdm1hMV9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGF2bWExY3NfYXR0YWNoLAorCS5ldmVudAkJPSBhdm1hMWNzX2V2ZW50LAogCS5kZXRhY2gJCT0gYXZtYTFjc19kZXRhY2gsCisJLmlkX3RhYmxlCT0gYXZtYTFjc19pZHMsCiB9OwogIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvYmttX2E0dC5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2JrbV9hNHQuYwppbmRleCBmNDEwZjYyLi5kY2IzMDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvYmttX2E0dC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9ia21fYTR0LmMKQEAgLTIzLDcgKzIzLDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107CiAKLWNvbnN0IGNoYXIgKmJrbV9hNHRfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjIyLjIuNCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpia21fYTR0X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4yMi4yLjQgJCI7CiAKIAogc3RhdGljIGlubGluZSB1X2NoYXIKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHJlbGVhc2VfaW9fYmttKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlpZiAoY3MtPmh3LmF4LmJhc2UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9ia21fYTguYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9ia21fYTguYwppbmRleCA5NGJiODNjLi41ZjIxYjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvYmttX2E4LmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2JrbV9hOC5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwogCi1jb25zdCBjaGFyIHNjdF9xdWFkcm9fcmV2aXNpb25bXSA9ICIkUmV2aXNpb246IDEuMjIuMi40ICQiOworc3RhdGljIGNvbnN0IGNoYXIgc2N0X3F1YWRyb19yZXZpc2lvbltdID0gIiRSZXZpc2lvbjogMS4yMi4yLjQgJCI7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzY3RfcXVhZHJvX3N1YnR5cGVzW10gPQogewpAQCAtMTkzLDcgKzE5Myw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19zY3RfcXVhZHJvKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlyZWxlYXNlX3JlZ2lvbihjcy0+aHcuYXguYmFzZSAmIDB4ZmZmZmZmYzAsIDEyOCk7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi1pbnQgX19pbml0CitzdGF0aWMgaW50IF9faW5pdAogc2N0X2FsbG9jX2lvKHVfaW50IGFkciwgdV9pbnQgbGVuKQogewogCWlmICghcmVxdWVzdF9yZWdpb24oYWRyLCBsZW4sICJzY2l0ZWwiKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2NhbGxjLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYwppbmRleCAwNDA2NWFiLi43YzU2YzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY2FsbGMuYwpAQCAtODc0LDcgKzg3NCw3IEBACiAJfSAKIH0KIAotc3RydWN0IENoYW5uZWwKK3N0YXRpYyBzdHJ1Y3QgQ2hhbm5lbAogKnNlbGVjdGZyZWVjaGFubmVsKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgYmNoKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IHN0LT5sMS5oYXJkd2FyZTsKQEAgLTE0MjksNyArMTQyOSw3IEBACiAJSGlTYXhfcHV0c3RhdHVzKGNoYW5wLT5jcywgIkNoIiwgIiVkIENBUElNU0cgJXMiLCBjaGFucC0+Y2hhbiwgdG1wYnVmKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGxsaV9nb3RfZmFjX3JlcShzdHJ1Y3QgQ2hhbm5lbCAqY2hhbnAsIGNhcGlfbXNnICpjbSkgewogCWlmICgoY20tPnBhcmFbMF0gIT0gMykgfHwgKGNtLT5wYXJhWzFdICE9IDApKQogCQlyZXR1cm47CkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGxsaV9nb3RfbWFudWZhY3R1cmVyKHN0cnVjdCBDaGFubmVsICpjaGFucCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBjYXBpX21zZyAqY20pIHsKIAlpZiAoKGNzLT50eXAgPT0gSVNETl9DVFlQRV9FTFNBKSB8fCAoY3MtPnR5cCA9PSBJU0ROX0NUWVBFX0VMU0FfUE5QKSB8fAogCQkoY3MtPnR5cCA9PSBJU0ROX0NUWVBFX0VMU0FfUENJKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2NvbmZpZy5jCmluZGV4IDE2NjNlZTYuLmM1NDJlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9jb25maWcuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvY29uZmlnLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogI2RlZmluZSBISVNBWF9JRFNJWkUgKEhJU0FYX01BWF9DQVJEUyo4KQogc3RhdGljIGNoYXIgSGlTYXhJRFtISVNBWF9JRFNJWkVdID0geyAwLCB9OwogCi1jaGFyICpIaVNheF9pZCA9IEhpU2F4SUQ7CitzdGF0aWMgY2hhciAqSGlTYXhfaWQgPSBIaVNheElEOwogI2lmZGVmIE1PRFVMRQogLyogVmFyaWFibGVzIGZvciBpbnNtb2QgKi8KIHN0YXRpYyBpbnQgdHlwZVtISVNBWF9NQVhfQ0FSRFNdID0geyAwLCB9OwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJcmV0dXJuIHJldjsKIH0KIAotdm9pZCBfX2luaXQgSGlTYXhWZXJzaW9uKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgSGlTYXhWZXJzaW9uKHZvaWQpCiB7CiAJY2hhciB0bXBbNjRdOwogCkBAIC02MDgsNiArNjA4LDcgQEAKIC8qCiAgKiBGaW5kIGNhcmQgd2l0aCBnaXZlbiBjYXJkIG51bWJlcgogICovCisjaWYgMAogc3RydWN0IElzZG5DYXJkU3RhdGUgKmhpc2F4X2dldF9jYXJkKGludCBjYXJkbnIpCiB7CiAJaWYgKChjYXJkbnIgPD0gbnJjYXJkcykgJiYgKGNhcmRuciA+IDApKQpAQCAtNjE1LDggKzYxNiw5IEBACiAJCQlyZXR1cm4gY2FyZHNbY2FyZG5yIC0gMV0uY3M7CiAJcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYgIC8qICAwICAqLwogCi1pbnQgSGlTYXhfcmVhZHN0YXR1cyh1X2NoYXIgX191c2VyICpidWYsIGludCBsZW4sIGludCBpZCwgaW50IGNoYW5uZWwpCitzdGF0aWMgaW50IEhpU2F4X3JlYWRzdGF0dXModV9jaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuLCBpbnQgaWQsIGludCBjaGFubmVsKQogewogCWludCBjb3VudCwgY250OwogCXVfY2hhciBfX3VzZXIgKnAgPSBidWY7CkBAIC03NjgsNyArNzcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBsbF9zdG9wKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKK3N0YXRpYyB2b2lkIGxsX3N0b3Aoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCWlzZG5fY3RybCBpYzsKIApAQCAtMTE4NCw3ICsxMTg2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIEhpU2F4X3NoaWZ0Y2FyZHMoaW50IGlkeCkKK3N0YXRpYyB2b2lkIEhpU2F4X3NoaWZ0Y2FyZHMoaW50IGlkeCkKIHsKIAlpbnQgaTsKIApAQCAtMTE5Miw3ICsxMTk0LDcgQEAKIAkJbWVtY3B5KCZjYXJkc1tpXSwgJmNhcmRzW2kgKyAxXSwgc2l6ZW9mKGNhcmRzW2ldKSk7CiB9CiAKLWludCBIaVNheF9pbml0aGFyZHdhcmUoaW50ICpidXN5X2ZsYWcpCitzdGF0aWMgaW50IEhpU2F4X2luaXRoYXJkd2FyZShpbnQgKmJ1c3lfZmxhZykKIHsKIAlpbnQgZm91bmRjYXJkcyA9IDA7CiAJaW50IGkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9kaXZhLmMKaW5kZXggMzk0ZDQ4MS4uYjYyZDZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2RpdmEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZGl2YS5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwogCi1jb25zdCBjaGFyICpEaXZhX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4zMy4yLjYgJCI7CitzdGF0aWMgY29uc3QgY2hhciAqRGl2YV9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuMzMuMi42ICQiOwogCiAjZGVmaW5lIGJ5dGVvdXQoYWRkcix2YWwpIG91dGIodmFsLGFkZHIpCiAjZGVmaW5lIGJ5dGVpbihhZGRyKSBpbmIoYWRkcikKQEAgLTcwNiw3ICs3MDYsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHJlbGVhc2VfaW9fZGl2YShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaW50IGJ5dGVjbnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2EuYwppbmRleCA0ZDdhMDI1Li4xMTBlOWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhLmMKQEAgLTMzLDEzICszMywxMyBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqQ2FyZFR5cGVbXTsKIAotY29uc3QgY2hhciAqRWxzYV9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDIuMzIuMi40ICQiOwotY29uc3QgY2hhciAqRWxzYV9UeXBlc1tdID0KK3N0YXRpYyBjb25zdCBjaGFyICpFbHNhX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4zMi4yLjQgJCI7CitzdGF0aWMgY29uc3QgY2hhciAqRWxzYV9UeXBlc1tdID0KIHsiTm9uZSIsICJQQyIsICJQQ0MtOCIsICJQQ0MtMTYiLCAiUENGIiwgIlBDRi1Qcm8iLAogICJQQ01DSUEiLCAiUVMgMTAwMCIsICJRUyAzMDAwIiwgIk1pY3JvbGluayBQQ0kiLCAiUVMgMzAwMCBQQ0kiLCAKICAiUENNQ0lBLUlQQUMiIH07CiAKLWNvbnN0IGNoYXIgKklUQUNWZXJbXSA9CitzdGF0aWMgY29uc3QgY2hhciAqSVRBQ1ZlcltdID0KIHsiPzA/IiwgIj8xPyIsICI/Mj8iLCAiPzM/IiwgIj80PyIsICJWMi4yIiwKICAiQjEiLCAiQTEifTsKIApAQCAtNDI1LDcgKzQyNSw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19lbHNhKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlpbnQgYnl0ZWNudCA9IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2FfY3MuYwppbmRleCBiZmMwMTMyLi42ZmM2ODY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9jcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbHNhX2NzLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIxMiwxMSArMjExLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0gICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmVsc2FfY3NfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC01MDgsMTMgKzUwMiwyMiBAQAogICAgIHJldHVybiAwOwogfSAvKiBlbHNhX2NzX2V2ZW50ICovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBlbHNhX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFTFNBIEFHIChBYWNoZW4sIEdlcm1hbnkpIiwgIk1pY3JvTGluayBJU0ROL01DICIsIDB4OTgzZGUyYzQsIDB4MzMzYmEyNTcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFTFNBIEdtYkgsIEFhY2hlbiIsICJNaWNyb0xpbmsgSVNETi9NQyAiLCAweDYzOWU1NzE4LCAweDMzM2JhMjU3KSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgZWxzYV9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgZWxzYV9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJlbHNhX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gZWxzYV9jc19hdHRhY2gsCisJLmV2ZW50CQk9IGVsc2FfY3NfZXZlbnQsCiAJLmRldGFjaAkJPSBlbHNhX2NzX2RldGFjaCwKKwkuaWRfdGFibGUJPSBlbHNhX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfZWxzYV9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2Vsc2Ffc2VyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYwppbmRleCA2ODljODMzLi44OThlYzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvZWxzYV9zZXIuYwpAQCAtMjM3LDcgKzIzNyw3IEBACiAjZW5kaWYKIH0KIAotaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQKIHdyaXRlX21vZGVtKHN0cnVjdCBCQ1N0YXRlICpiY3MpIHsKIAlpbnQgcmV0PTA7CiAJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gYmNzLT5jczsKQEAgLTI3NSw3ICsyNzUsNyBAQAogCXJldHVybihyZXQpOwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBtb2RlbV9maWxsKHN0cnVjdCBCQ1N0YXRlICpiY3MpIHsKIAkJCiAJaWYgKGJjcy0+dHhfc2tiKSB7CkBAIC00MjIsNyArNDIyLDcgQEAKIGV4dGVybiB2b2lkIG1vZGVoc2N4KHN0cnVjdCBCQ1N0YXRlICpiY3MsIGludCBtb2RlLCBpbnQgYmMpOwogZXh0ZXJuIHZvaWQgaHNjeF9sMmwxKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgcHIsIHZvaWQgKmFyZyk7CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBjbG9zZV9lbHNhc3RhdGUoc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAltb2RlaHNjeChiY3MsIDAsIGJjcy0+Y2hhbm5lbCk7CkBAIC00NDIsNyArNDQyLDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtb2RlbV93cml0ZV9jbWQoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikgewogCWludCBjb3VudCwgZnA7CiAJdV9jaGFyICptc2cgPSBidWY7CkBAIC00NzIsNyArNDcyLDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtb2RlbV9zZXRfaW5pdChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpIHsKIAlpbnQgdGltZW91dDsKIApAQCAtNTIxLDcgKzUyMSw3IEBACiAJdWRlbGF5KFJDVl9ERUxBWSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtb2RlbV9zZXRfZGlhbChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBvdXRnb2luZykgewogCWludCB0aW1lb3V0OwogI2RlZmluZSBSQ1ZfREVMQVkgMjAwMDAJCkBAIC01NDMsNyArNTQzLDcgQEAKIAl1ZGVsYXkoUkNWX0RFTEFZKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG1vZGVtX2wybDEoc3RydWN0IFBTdGFjayAqc3QsIGludCBwciwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBCQ1N0YXRlICpiY3MgPSBzdC0+bDEuYmNzOwpAQCAtNTc5LDcgKzU3OSw3IEBACiAJfQogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHNldHN0YWNrX2Vsc2Eoc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAKQEAgLTYxNCw3ICs2MTQsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBpbml0X21vZGVtKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykgewogCiAJY3MtPmJjc1swXS5CQ19TZXRTdGFjayA9IHNldHN0YWNrX2Vsc2E7CkBAIC02NDEsNyArNjQxLDcgQEAKIAltb2RlbV9zZXRfaW5pdChjcyk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNlX21vZGVtKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykgewogCiAJY3MtPmh3LmVsc2EuTUZsYWcgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2VudGVybm93LmggYi9kcml2ZXJzL2lzZG4vaGlzYXgvZW50ZXJub3cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyZWVjNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZW50ZXJub3cuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIDIwMDEvMTAvMDIKLSAqCi0gKiBlbnRlcm5vdy5oICAgSGVhZGVyLWZpbGUgaW5jbHVkZWQgYnkKLSAqICAgICAgICAgICAgICBlbnRlcm5vd19wY2kuYwotICoKLSAqIEF1dGhvciAgICAgICBDaHJpc3RvcGggRXJzZmVsZCA8aW5mb0Bmb3JtdWxhLW4uZGU+Ci0gKiAgICAgICAgICAgICAgRm9ybXVsYS1uIEV1cm9wZSBBRyAod3d3LmZvcm11bGEtbi5jb20pCi0gKiAgICAgICAgICAgICAgcHJldmlvdXNseSBHZXJkZXMgQUcKLSAqCi0gKgotICogICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyAoYykgdW5kZXIgR05VIFBVQkxJQyBMSUNFTlNFCi0gKi8KLQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGF0YXR5cGVzIGFuZCBtYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jZGVmaW5lIEJZVEUJCQkJCQkJdW5zaWduZWQgY2hhcgotI2RlZmluZSBXT1JECQkJCQkJCXVuc2lnbmVkIGludAotI2RlZmluZSBISUJZVEUodykJCQkJCQkoKHVuc2lnbmVkIGNoYXIpKCh3ICYgMHhmZjAwKSAvIDI1NikpCi0jZGVmaW5lIExPQllURSh3KQkJCQkJCSgodW5zaWduZWQgY2hhcikodyAmIDB4MDBmZikpCi0jZGVmaW5lIEluQnl0ZShhZGRyKQkJCQkJCWluYihhZGRyKQotI2RlZmluZSBPdXRCeXRlKGFkZHIsdmFsKQkJCQkJb3V0Yih2YWwsYWRkcikKLQotCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGNhcmQtc3BlY2lmaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIGb8ciBQb3dlcklTRE4gUENJICovCi0jZGVmaW5lIFRKX0FNRF9JUlEgCQkJCQkJMHgyMAotI2RlZmluZSBUSl9MRUQxIAkJCQkJCTB4NDAKLSNkZWZpbmUgVEpfTEVEMiAJCQkJCQkweDgwCi0KLQotLyogRGFzIEZlbnN0ZXIgenVtIEFNRC4uLgotICogQWIgQWRyZXNzZSBody5uamV0LmJhc2UgKyBUSl9BTURfUE9SVCB3ZXJkZW4gdm9tIEFNRCBqZXdlaWxzIDggQml0IGluCi0gKiBkZW4gVGlnZXJKZXQgaS9vLVJhdW0gZ2VtYXBwdAotICogLT4gMHgwMSBkZXMgQU1EIGJlaSBody5uamV0LmJhc2UgKyAwQzQgKi8KLSNkZWZpbmUgVEpfQU1EX1BPUlQJCQkJCQkweEMwCi0KLQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi1CWVRFIFJlYWRCeXRlQW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIEJZVEUgb2Zmc2V0KTsKLXZvaWQgV3JpdGVCeXRlQW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIEJZVEUgb2Zmc2V0LCBCWVRFIHZhbHVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9lbnRlcm5vd19wY2kuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9lbnRlcm5vd19wY2kuYwppbmRleCAxY2M0ZDExLi4zMzQxY2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvZW50ZXJub3dfcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2VudGVybm93X3BjaS5jCkBAIC02NSw3ICs2NSw2IEBACiAjaW5jbHVkZSAiaXNhYy5oIgogI2luY2x1ZGUgImlzZG5sMS5oIgogI2luY2x1ZGUgImFtZDc5MzBfZm4uaCIKLSNpbmNsdWRlICJlbnRlcm5vdy5oIgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC03NCw1OCArNzMsNzIgQEAKIAogCiAKLWNvbnN0IGNoYXIgKmVudGVybm93X3BjaV9yZXYgPSAiJFJldmlzaW9uOiAxLjEuNC41ICQiOworc3RhdGljIGNvbnN0IGNoYXIgKmVudGVybm93X3BjaV9yZXYgPSAiJFJldmlzaW9uOiAxLjEuNC41ICQiOworCisKKy8qIGb8ciBQb3dlcklTRE4gUENJICovCisjZGVmaW5lIFRKX0FNRF9JUlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBUSl9MRUQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVEpfTEVEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisKKworLyogRGFzIEZlbnN0ZXIgenVtIEFNRC4uLgorICogQWIgQWRyZXNzZSBody5uamV0LmJhc2UgKyBUSl9BTURfUE9SVCB3ZXJkZW4gdm9tIEFNRCBqZXdlaWxzIDggQml0IGluCisgKiBkZW4gVGlnZXJKZXQgaS9vLVJhdW0gZ2VtYXBwdAorICogLT4gMHgwMSBkZXMgQU1EIGJlaSBody5uamV0LmJhc2UgKyAwQzQgKi8KKyNkZWZpbmUgVEpfQU1EX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwCisKIAogCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKiogSS9PLUludGVyZmFjZSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCiAKIC8qIGNzLT5yZWFkaXNhYywgbWFjcm8gckJ5dGVBTUQgKi8KLUJZVEUKLVJlYWRCeXRlQW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIEJZVEUgb2Zmc2V0KQorc3RhdGljIHVuc2lnbmVkIGNoYXIKK1JlYWRCeXRlQW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQogewogCS8qIGRpcmVrdGVzIFJlZ2lzdGVyICovCiAJaWYob2Zmc2V0IDwgOCkKLQkJcmV0dXJuIChJbkJ5dGUoY3MtPmh3Lm5qZXQuaXNhYyArIDQqb2Zmc2V0KSk7CisJCXJldHVybiAoaW5iKGNzLT5ody5uamV0LmlzYWMgKyA0Km9mZnNldCkpOwogCiAJLyogaW5kaXJla3RlcyBSZWdpc3RlciAqLwogCWVsc2UgewotCQlPdXRCeXRlKGNzLT5ody5uamV0LmlzYWMgKyA0KkFNRF9DUiwgb2Zmc2V0KTsKLQkJcmV0dXJuKEluQnl0ZShjcy0+aHcubmpldC5pc2FjICsgNCpBTURfRFIpKTsKKwkJb3V0YihvZmZzZXQsIGNzLT5ody5uamV0LmlzYWMgKyA0KkFNRF9DUik7CisJCXJldHVybihpbmIoY3MtPmh3Lm5qZXQuaXNhYyArIDQqQU1EX0RSKSk7CiAJfQogfQogCiAvKiBjcy0+d3JpdGVpc2FjLCBtYWNybyB3Qnl0ZUFNRCAqLwotdm9pZAotV3JpdGVCeXRlQW1kNzkzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIEJZVEUgb2Zmc2V0LCBCWVRFIHZhbHVlKQorc3RhdGljIHZvaWQKK1dyaXRlQnl0ZUFtZDc5MzAoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgY2hhciB2YWx1ZSkKIHsKIAkvKiBkaXJla3RlcyBSZWdpc3RlciAqLwogCWlmKG9mZnNldCA8IDgpCi0JCU91dEJ5dGUoY3MtPmh3Lm5qZXQuaXNhYyArIDQqb2Zmc2V0LCB2YWx1ZSk7CisJCW91dGIodmFsdWUsIGNzLT5ody5uamV0LmlzYWMgKyA0Km9mZnNldCk7CiAKIAkvKiBpbmRpcmVrdGVzIFJlZ2lzdGVyICovCiAJZWxzZSB7Ci0JCU91dEJ5dGUoY3MtPmh3Lm5qZXQuaXNhYyArIDQqQU1EX0NSLCBvZmZzZXQpOwotCQlPdXRCeXRlKGNzLT5ody5uamV0LmlzYWMgKyA0KkFNRF9EUiwgdmFsdWUpOworCQlvdXRiKG9mZnNldCwgY3MtPmh3Lm5qZXQuaXNhYyArIDQqQU1EX0NSKTsKKwkJb3V0Yih2YWx1ZSwgY3MtPmh3Lm5qZXQuaXNhYyArIDQqQU1EX0RSKTsKIAl9CiB9CiAKIAotdm9pZAotZW5wY2lfc2V0SXJxTWFzayhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIEJZVEUgdmFsKSB7CitzdGF0aWMgdm9pZAorZW5wY2lfc2V0SXJxTWFzayhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHVuc2lnbmVkIGNoYXIgdmFsKSB7CiAgICAgICAgIGlmICghdmFsKQotCSAgICAgICAgT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlK05FVEpFVF9JUlFNQVNLMSwgMHgwMCk7CisJICAgICAgICBvdXRiKDB4MDAsIGNzLT5ody5uamV0LmJhc2UrTkVUSkVUX0lSUU1BU0sxKTsKICAgICAgICAgZWxzZQotCSAgICAgICAgT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlK05FVEpFVF9JUlFNQVNLMSwgVEpfQU1EX0lSUSk7CisJICAgICAgICBvdXRiKFRKX0FNRF9JUlEsIGNzLT5ody5uamV0LmJhc2UrTkVUSkVUX0lSUU1BU0sxKTsKIH0KIAogCi1zdGF0aWMgQllURSBkdW1teXJyKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IGNoYW4sIEJZVEUgb2ZmKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtbXlycihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBjaGFuLCB1bnNpZ25lZCBjaGFyIG9mZikKIHsKICAgICAgICAgcmV0dXJuKDUpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1teXdyKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IGNoYW4sIEJZVEUgb2ZmLCBCWVRFIHZhbHVlKQorc3RhdGljIHZvaWQgZHVtbXl3cihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBjaGFuLCB1bnNpZ25lZCBjaGFyIG9mZiwgdW5zaWduZWQgY2hhciB2YWx1ZSkKIHsKIAogfQpAQCAtMTQyLDE4ICsxNTUsMTggQEAKIAogCS8qIFJlc2V0IG9uLCAoYWxzbyBmb3IgQU1EKSAqLwogCWNzLT5ody5uamV0LmN0cmxfcmVnID0gMHgwNzsKLQlPdXRCeXRlKGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfQ1RSTCwgY3MtPmh3Lm5qZXQuY3RybF9yZWcpOworCW91dGIoY3MtPmh3Lm5qZXQuY3RybF9yZWcsIGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfQ1RSTCk7CiAJbWRlbGF5KDIwKTsKIAkvKiBSZXNldCBvZmYgKi8KIAljcy0+aHcubmpldC5jdHJsX3JlZyA9IDB4MzA7Ci0JT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0NUUkwsIGNzLT5ody5uamV0LmN0cmxfcmVnKTsKKwlvdXRiKGNzLT5ody5uamV0LmN0cmxfcmVnLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0NUUkwpOwogCS8qIDIwbXMgZGVsYXkgKi8KIAltZGVsYXkoMjApOwogCWNzLT5ody5uamV0LmF1eGQgPSAwOyAgLy8gTEVELXN0YXR1cwogCWNzLT5ody5uamV0LmRtYWN0cmwgPSAwOwotCU91dEJ5dGUoY3MtPmh3Lm5qZXQuYmFzZSArIE5FVEpFVF9BVVhDVFJMLCB+VEpfQU1EX0lSUSk7Ci0JT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0lSUU1BU0sxLCBUSl9BTURfSVJRKTsKLQlPdXRCeXRlKGNzLT5ody5uamV0LmF1eGEsIGNzLT5ody5uamV0LmF1eGQpOyAvLyBMRUQgb2ZmCisJb3V0Yih+VEpfQU1EX0lSUSwgY3MtPmh3Lm5qZXQuYmFzZSArIE5FVEpFVF9BVVhDVFJMKTsKKwlvdXRiKFRKX0FNRF9JUlEsIGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfSVJRTUFTSzEpOworCW91dGIoY3MtPmh3Lm5qZXQuYXV4ZCwgY3MtPmh3Lm5qZXQuYXV4YSk7IC8vIExFRCBvZmYKIH0KIAogCkBAIC0xNjEsNyArMTc0LDcgQEAKIGVucGNpX2NhcmRfbXNnKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IG10LCB2b2lkICphcmcpCiB7CiAJdV9sb25nIGZsYWdzOwotICAgICAgICBCWVRFICpjaGFuOworICAgICAgICB1bnNpZ25lZCBjaGFyICpjaGFuOwogCiAJaWYgKGNzLT5kZWJ1ZyAmIEwxX0RFQl9JU0FDKQogCQlkZWJ1Z2wxKGNzLCAiZW50ZXI6bm93IFBDSTogY2FyZF9tc2c6IDB4JTA0WCIsIG10KTsKQEAgLTE4NywxNiArMjAwLDE2IEBACiAgICAgICAgICAgICAgICAgY2FzZSBNRExfQVNTSUdOOgogICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVJIGFzc2lnbmVkLCBMRUQxIG9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICBjcy0+aHcubmpldC5hdXhkID0gVEpfQU1EX0lSUSA8PCAxOwotICAgICAgICAgICAgICAgICAgICAgICAgT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEsIGNzLT5ody5uamV0LmF1eGQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Yihjcy0+aHcubmpldC5hdXhkLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNRExfUkVNT1ZFOgogICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVJIHJlbW92ZWQsIExFRHMgb2ZmICovCiAJICAgICAgICAgICAgICAgIGNzLT5ody5uamV0LmF1eGQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEsIDB4MDApOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0YigweDAwLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNRExfQkNfQVNTSUdOOgogICAgICAgICAgICAgICAgICAgICAgICAgLyogYWN0aXZhdGUgQi1jaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuID0gKEJZVEUgKilhcmc7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuID0gKHVuc2lnbmVkIGNoYXIgKilhcmc7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKIAkJICAgICAgICAgICAgICAgIGRlYnVnbDEoY3MsICJlbnRlcjpub3cgUENJOiBhc3NpZ24gcGh5cy4gQkMgJWQgaW4gQU1EIExNUjEiLCAqY2hhbik7CkBAIC0yMDQsMTEgKzIxNywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmRjLmFtZDc5MzAucGhfY29tbWFuZChjcywgKGNzLT5kYy5hbWQ3OTMwLmxtcjEgfCAoKmNoYW4gKyAxKSksICJNRExfQkNfQVNTSUdOIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdCBsZWFzdCBvbmUgYi1jaGFubmVsIGluIHVzZSwgTEVEIDIgb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGNzLT5ody5uamV0LmF1eGQgfD0gVEpfQU1EX0lSUSA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEsIGNzLT5ody5uamV0LmF1eGQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0Yihjcy0+aHcubmpldC5hdXhkLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNRExfQkNfUkVMRUFTRToKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlYWN0aXZhdGUgQi1jaGFubmVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuID0gKEJZVEUgKilhcmc7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuID0gKHVuc2lnbmVkIGNoYXIgKilhcmc7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcy0+ZGVidWcgJiBMMV9ERUJfSVNBQykKIAkJICAgICAgICAgICAgICAgIGRlYnVnbDEoY3MsICJlbnRlcjpub3cgUENJOiByZWxlYXNlIHBoeXMuIEJDICVkIGluIEFtZCBMTVIxIiwgKmNoYW4pOwpAQCAtMjE3LDcgKzIzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBiLWNoYW5uZWwgYWN0aXZlIC0+IExFRDIgb2ZmICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjcy0+ZGMuYW1kNzkzMC5sbXIxICYgMykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmh3Lm5qZXQuYXV4ZCAmPSB+KFRKX0FNRF9JUlEgPDwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dEJ5dGUoY3MtPmh3Lm5qZXQuYmFzZSArIE5FVEpFVF9BVVhEQVRBLCBjcy0+aHcubmpldC5hdXhkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Yihjcy0+aHcubmpldC5hdXhkLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWERBVEEpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTIzMSwxMSArMjQ0LDExIEBACiBlbnBjaV9pbnRlcnJ1cHQoaW50IGludG5vLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGRldl9pZDsKLQlCWVRFIHMwdmFsLCBzMXZhbCwgaXI7CisJdW5zaWduZWQgY2hhciBzMHZhbCwgczF2YWwsIGlyOwogCXVfbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+bG9jaywgZmxhZ3MpOwotCXMxdmFsID0gSW5CeXRlKGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfSVJRU1RBVDEpOworCXMxdmFsID0gaW5iKGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfSVJRU1RBVDEpOwogCiAgICAgICAgIC8qIEFNRCB0aHJldyBhbiBpbnRlcnJ1cHQgKi8KIAlpZiAoIShzMXZhbCAmIFRKX0FNRF9JUlEpKSB7CkBAIC0yNDUsMTMgKzI1OCwxMyBAQAogCQlzMXZhbCA9IDE7CiAJfSBlbHNlCiAJCXMxdmFsID0gMDsKLQlzMHZhbCA9IEluQnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0lSUVNUQVQwKTsKKwlzMHZhbCA9IGluYihjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0lSUVNUQVQwKTsKIAlpZiAoKHMwdmFsIHwgczF2YWwpPT0wKSB7IC8vIHNoYXJlZCBJUlEKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0gCiAJaWYgKHMwdmFsKQotCQlPdXRCeXRlKGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfSVJRU1RBVDAsIHMwdmFsKTsKKwkJb3V0YihzMHZhbCwgY3MtPmh3Lm5qZXQuYmFzZSArIE5FVEpFVF9JUlFTVEFUMCk7CiAKIAkvKiBETUEtSW50ZXJydXB0OiBCLWNoYW5uZWwtc3R1ZmYgKi8KIAkvKiBzZXQgYml0cyBpbiBzdmFsIHRvIGluZGljYXRlIHdoaWNoIHBhZ2UgaXMgZnJlZSAqLwpAQCAtMzQyLDIwICszNTUsMjAgQEAKIAogCQkvKiBSZXNldCBhbiAqLwogCQljcy0+aHcubmpldC5jdHJsX3JlZyA9IDB4MDc7ICAvLyBnZeRuZGVydCB2b24gMHhmZgotCQlPdXRCeXRlKGNzLT5ody5uamV0LmJhc2UgKyBORVRKRVRfQ1RSTCwgY3MtPmh3Lm5qZXQuY3RybF9yZWcpOworCQlvdXRiKGNzLT5ody5uamV0LmN0cmxfcmVnLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0NUUkwpOwogCQkvKiAyMCBtcyBQYXVzZSAqLwogCQltZGVsYXkoMjApOwogCiAJCWNzLT5ody5uamV0LmN0cmxfcmVnID0gMHgzMDsgIC8qIFJlc2V0IE9mZiBhbmQgc3RhdHVzIHJlYWQgY2xlYXIgKi8KLQkJT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0NUUkwsIGNzLT5ody5uamV0LmN0cmxfcmVnKTsKKwkJb3V0Yihjcy0+aHcubmpldC5jdHJsX3JlZywgY3MtPmh3Lm5qZXQuYmFzZSArIE5FVEpFVF9DVFJMKTsKIAkJbWRlbGF5KDEwKTsKIAogCQljcy0+aHcubmpldC5hdXhkID0gMHgwMDsgLy8gd2FyIDB4YzAKIAkJY3MtPmh3Lm5qZXQuZG1hY3RybCA9IDA7CiAKLQkJT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0FVWENUUkwsIH5USl9BTURfSVJRKTsKLQkJT3V0Qnl0ZShjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0lSUU1BU0sxLCBUSl9BTURfSVJRKTsKLQkJT3V0Qnl0ZShjcy0+aHcubmpldC5hdXhhLCBjcy0+aHcubmpldC5hdXhkKTsKKwkJb3V0Yih+VEpfQU1EX0lSUSwgY3MtPmh3Lm5qZXQuYmFzZSArIE5FVEpFVF9BVVhDVFJMKTsKKwkJb3V0YihUSl9BTURfSVJRLCBjcy0+aHcubmpldC5iYXNlICsgTkVUSkVUX0lSUU1BU0sxKTsKKwkJb3V0Yihjcy0+aHcubmpldC5hdXhkLCBjcy0+aHcubmpldC5hdXhhKTsKIAogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvZ2F6ZWwuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9nYXplbC5jCmluZGV4IDI0YTA1YTQuLjM1MmI0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9nYXplbC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9nYXplbC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwotY29uc3QgY2hhciAqZ2F6ZWxfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjE5LjIuNCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpnYXplbF9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDIuMTkuMi40ICQiOwogCiAjZGVmaW5lIFI2NDcgICAgICAxCiAjZGVmaW5lIFI2ODUgICAgICAyCkBAIC0zMTcsNyArMzE3LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KLXZvaWQKKworc3RhdGljIHZvaWQKIHJlbGVhc2VfaW9fZ2F6ZWwoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXVuc2lnbmVkIGludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmM0czhzX2wxLmMKaW5kZXggYmExZDAyOC4uNzMzMzM3N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmM0czhzX2wxLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmYzRzOHNfbDEuYwpAQCAtMzEyLDcgKzMxMiw3IEBACiAvKiBmdW5jdGlvbiB0byByZWFkIGNyaXRpY2FsIGNvdW50ZXIgcmVnaXN0ZXJzIHRoYXQgICAqLwogLyogbWF5IGJlIHVkcGF0ZWQgYnkgdGhlIGNoaXAgZHVyaW5nIHJlYWQgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9sYXRpbGUgdV9jaGFyCitzdGF0aWMgdV9jaGFyCiBSZWFkX2hmYzhfc3RhYmxlKGhmYzRzOHNfaHcgKiBodywgaW50IHJlZykKIHsKIAl1X2NoYXIgcmVmODsKQEAgLTMyNCw3ICszMjQsNyBAQAogCXJldHVybiBpbjg7CiB9CiAKLXN0YXRpYyB2b2xhdGlsZSBpbnQKK3N0YXRpYyBpbnQKIFJlYWRfaGZjMTZfc3RhYmxlKGhmYzRzOHNfaHcgKiBodywgaW50IHJlZykKIHsKIAlpbnQgcmVmMTY7CkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogZGlzYWJsZS9lbmFibGUgaGFyZHdhcmUgaW4gbnQgb3IgdGUgbW9kZSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIGhmY19oYXJkd2FyZV9lbmFibGUoaGZjNHM4c19odyAqIGh3LCBpbnQgZW5hYmxlLCBpbnQgbnRfbW9kZSkKIHsKIAl1X2xvbmcgZmxhZ3M7CkBAIC0xNDY1LDcgKzE0NjUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGRpc2FibGUgbWVtb3J5IG1hcHBlZCBwb3J0cyAvIGlvIHBvcnRzICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIHJlbGVhc2VfcGNpX3BvcnRzKGhmYzRzOHNfaHcgKiBodykKIHsKIAlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaHctPnBkZXYsIFBDSV9DT01NQU5ELCAwKTsKQEAgLTE0ODEsNyArMTQ4MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBlbmFibGUgbWVtb3J5IG1hcHBlZCBwb3J0cyAvIGlvIHBvcnRzICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCitzdGF0aWMgdm9pZAogZW5hYmxlX3BjaV9wb3J0cyhoZmM0czhzX2h3ICogaHcpCiB7CiAjaWZkZWYgQ09ORklHX0hJU0FYX0hGQzRTOFNfUENJTUVNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiZHMwLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiZHMwLmMKaW5kZXggZWJlYTNmZS4uN2NmODc3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY18yYmRzMC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfMmJkczAuYwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCWRlYnVnbDEoY3MsInNlbmRfZGF0YSAlZCBibG9ja2VkIiwgYmNzLT5jaGFubmVsKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG1haW5fcmVjXzJiZHMwKHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gYmNzLT5jczsKQEAgLTM5OSw3ICszOTksNyBAQAogCXJldHVybjsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG1vZGVfMmJzMChzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBpbnQgbW9kZSwgaW50IGJjKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CkBAIC01MDUsNyArNTA1LDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBjbG9zZV8yYnMwKHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJbW9kZV8yYnMwKGJjcywgMCwgYmNzLT5jaGFubmVsKTsKQEAgLTUzNCw3ICs1MzQsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLWludAorc3RhdGljIGludAogc2V0c3RhY2tfMmIoc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJYmNzLT5jaGFubmVsID0gc3QtPmwxLmJjOwpAQCAtMTAwNCw3ICsxMDA0LDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBzZXRzdGFja19oZmNkKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJc3QtPmwxLmwxaHcgPSBIRkNEX2wxaHc7CkBAIC0xMDE1LDcgKzEwMTUsNyBAQAogewogfQogCi11bnNpZ25lZCBpbnQgX19pbml0CitzdGF0aWMgdW5zaWduZWQgaW50IF9faW5pdAogKmluaXRfc2VuZF9oZmNkKGludCBjbnQpCiB7CiAJaW50IGksICpzZW5kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY18yYnMwLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiczAuYwppbmRleCBiYjM3NmYzLi5mOTc4YTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiczAuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjXzJiczAuYwpAQCAtNTIsNyArNTIsNyBAQAogCQlyZXR1cm4gKHRvKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBHZXRGcmVlRmlmb0J5dGVzKHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJaW50IHM7CkBAIC02Niw3ICs2Niw3IEBACiAJcmV0dXJuIChzKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBSZWFkWlJlZyhzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCB1X2NoYXIgcmVnKQogewogCWludCB2YWw7CkBAIC0zOTQsNyArMzk0LDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtb2RlX2hmYyhzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBpbnQgbW9kZSwgaW50IGJjKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CkBAIC01MDcsNyArNTA3LDcgQEAKIH0KIAogCi12b2lkCitzdGF0aWMgdm9pZAogY2xvc2VfaGZjc3RhdGUoc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAltb2RlX2hmYyhiY3MsIDAsIGJjcy0+Y2hhbm5lbCk7CkBAIC01MzcsNyArNTM3LDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHNldHN0YWNrX2hmYyhzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAliY3MtPmNoYW5uZWwgPSBzdC0+bDEuYmM7CkBAIC01NTEsNyArNTUxLDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi12b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19pbml0CiBpbml0X3NlbmQoc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfcGNpLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3BjaS5jCmluZGV4IGMyZGI1MjYuLjgzMzdiMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19wY2kuYwpAQCAtNzAsNyArNzAsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGZyZWUgaGFyZHdhcmUgcmVzb3VyY2VzIHVzZWQgYnkgZHJpdmVyICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIHJlbGVhc2VfaW9faGZjcGNpKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlwcmludGsoS0VSTl9JTkZPICJIaVNheDogcmVsZWFzZSBoZmNwY2kgYXQgJXBcbiIsCkBAIC0zOTQsNyArMzk0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogY2hlY2sgZm9yIHRyYW5zcGFyZW50IHJlY2VpdmUgZGF0YSBhbmQgcmVhZCBtYXggb25lIHRocmVzaG9sZCBzaXplIGlmIGF2YWlsICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludAorc3RhdGljIGludAogaGZjcGNpX2VtcHR5X2ZpZm9fdHJhbnMoc3RydWN0IEJDU3RhdGUgKmJjcywgYnpmaWZvX3R5cGUgKiBieiwgdV9jaGFyICogYmRhdGEpCiB7CiAJdW5zaWduZWQgc2hvcnQgKnoxciwgKnoycjsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBCLWNoYW5uZWwgbWFpbiByZWNlaXZlIHJvdXRpbmUgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIG1haW5fcmVjX2hmY3BjaShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CkBAIC0xMjQ0LDcgKzEyNDQsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogY2FsbGVkIGR1cmluZyBpbml0IHNldHRpbmcgbDEgc3RhY2sgcG9pbnRlciAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIHNldHN0YWNrX2hmY3BjaShzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXN0LT5sMS5sMWh3ID0gSEZDUENJX2wxaHc7CkBAIC0xMjY4LDcgKzEyNjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGFjdGl2YXRlL2RlYWN0aXZhdGUgaGFyZHdhcmUgZm9yIHNlbGVjdGVkIGNoYW5uZWxzIGFuZCBtb2RlICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIG1vZGVfaGZjcGNpKHN0cnVjdCBCQ1N0YXRlICpiY3MsIGludCBtb2RlLCBpbnQgYmMpCiB7CiAJc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gYmNzLT5jczsKQEAgLTE1NzksNyArMTU3OSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBjYWxsZWQgZm9yIGNhcmQgaW5pdCBtZXNzYWdlICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19pbml0CiBpbml0aGZjcGNpKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAljcy0+YmNzWzBdLkJDX1NldFN0YWNrID0gc2V0c3RhY2tfMmI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3BjaS5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19wY2kuaAppbmRleCA0ZGYwMzZlZC4uOWVmMjk4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19wY2kuaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3BjaS5oCkBAIC0yMzIsNSArMjMyLDQgQEAKICNkZWZpbmUgUmVhZF9oZmMoYSxiKSAoKigoKHVfY2hhciAqKWEtPmh3LmhmY3BjaS5wY2lfaW8pK2IpKQogCiBleHRlcm4gdm9pZCBtYWluX2lycV9oY3BjaShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKTsKLWV4dGVybiB2b2lkIGluaXRoZmNwY2koc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKIGV4dGVybiB2b2lkIHJlbGVhc2VoZmNwY2koc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfc3guYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfc3guYwppbmRleCBhMzA3ZmNiLi5mMjdjMTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3N4LmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19zeC5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBmcmVlIGhhcmR3YXJlIHJlc291cmNlcyB1c2VkIGJ5IGRyaXZlciAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNlX2lvX2hmY3N4KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAljcy0+aHcuaGZjc3guaW50X20yID0gMDsJLyogaW50ZXJydXB0IG91dHB1dCBvZmYgISAqLwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEItY2hhbm5lbCBtYWluIHJlY2VpdmUgcm91dGluZSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCitzdGF0aWMgdm9pZAogbWFpbl9yZWNfaGZjc3goc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAlzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSBiY3MtPmNzOwpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIGNhbGxlZCBkdXJpbmcgaW5pdCBzZXR0aW5nIGwxIHN0YWNrIHBvaW50ZXIgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBzZXRzdGFja19oZmNzeChzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXN0LT5sMS5sMWh3ID0gSEZDU1hfbDFodzsKQEAgLTEwMjcsNyArMTAyNyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogYWN0aXZhdGUvZGVhY3RpdmF0ZSBoYXJkd2FyZSBmb3Igc2VsZWN0ZWQgY2hhbm5lbHMgYW5kIG1vZGUgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkCitzdGF0aWMgdm9pZAogbW9kZV9oZmNzeChzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBpbnQgbW9kZSwgaW50IGJjKQogewogCXN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyA9IGJjcy0+Y3M7CkBAIC0xMzI4LDcgKzEzMjgsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogY2FsbGVkIGZvciBjYXJkIGluaXQgbWVzc2FnZSAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBfX2RldmluaXQKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAogaW5pdGhmY3N4KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAljcy0+c2V0c3RhY2tfZCA9IHNldHN0YWNrX2hmY3N4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19zeC5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY19zeC5oCmluZGV4IDEyZjU0MTUuLjY3OTJmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfc3guaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3N4LmgKQEAgLTE5Myw1ICsxOTMsNCBAQAogfTsKIAogZXh0ZXJuIHZvaWQgbWFpbl9pcnFfaGZjc3goc3RydWN0IEJDU3RhdGUgKmJjcyk7Ci1leHRlcm4gdm9pZCBpbml0aGZjc3goc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKIGV4dGVybiB2b2lkIHJlbGVhc2VoZmNzeChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfdXNiLmMKaW5kZXggZmZkNzRiOC4uZTJjM2FmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5jCkBAIC02MCw3ICs2MCw3IEBACiAjaW5jbHVkZSAiaGlzYXhfZGVidWcuaCIKIHN0YXRpYyB1X2ludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgdWludCwgMCk7Ci1pbnQgaGZjX2RlYnVnOworc3RhdGljIGludCBoZmNfZGVidWc7CiAjZW5kaWYKIAogCkBAIC04NSw3ICs4NSw3IEBACiAqICAgVmVuZG9ySUQsIFByb2R1Y3RJRCwgRGV2aWNlbmFtZSwgTEVEX1NDSEVNRSwKICogICBMRUQncyBCaXRNYXNrIGluIEhGQ1VTQl9QX0RBVEEgUmVnaXN0ZXIgOiBMRURfVVNCLCBMRURfUzAsIExFRF9CMSwgTEVEX0IyCiAqLwotdmVuZG9yX2RhdGEgdmRhdGFbXSA9IHsKK3N0YXRpYyB2ZW5kb3JfZGF0YSB2ZGF0YVtdID0gewogCS8qIENvbG9nbmVDaGlwIEV2YWwgVEEgKi8KIAl7MHgwOTU5LCAweDJiZDAsICJJU0ROIFVTQiBUQSAoQ29sb2duZSBDaGlwIEhGQy1TIFVTQiBiYXNlZCkiLAogCSBMRURfT0ZGLCB7NCwgMCwgMiwgMX0KQEAgLTExMzcsNyArMTEzNyw3IEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogaGZjX3VzYl9sMmwxKHN0cnVjdCBoaXNheF9pZiAqbXlfaGlzYXhfaWYsIGludCBwciwgdm9pZCAqYXJnKQogewogCXVzYl9maWZvICpmaWZvID0gbXlfaGlzYXhfaWYtPnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuaAppbmRleCBiMTcxNjAwLi4yODBkZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5oCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfdXNiLmgKQEAgLTE2OCw3ICsxNjgsNyBAQAogKiAzIGVudHJpZXMgYXJlIHRoZSBjb25maWd1cmF0aW9uIG51bWJlciwgdGhlIG1pbmltdW0gaW50ZXJ2YWwgZm9yCiAqIEludGVycnVwdCBlbmRwb2ludHMgJiBib29sZWFuIGlmIEUtY2hhbm5lbCBsb2dnaW5nIHBvc3NpYmxlCiAqLwotaW50IHZhbGlkY29uZltdWzE5XSA9IHsKK3N0YXRpYyBpbnQgdmFsaWRjb25mW11bMTldID0gewogCS8vIElOVCBpbiwgSVNPIG91dCBjb25maWcKIAl7RVBfTlVMLCBFUF9JTlQsIEVQX05VTCwgRVBfSU5ULCBFUF9OVUwsIEVQX0lOVCwgRVBfTk9QLCBFUF9JTlQsCiAJIEVQX0lTTywgRVBfTlVMLCBFUF9JU08sIEVQX05VTCwgRVBfSVNPLCBFUF9OVUwsIEVQX05VTCwgRVBfTlVMLApAQCAtMTg3LDcgKzE4Nyw3IEBACiB9OwogCiAvLyBzdHJpbmcgZGVzY3JpcHRpb24gb2YgY2hvc2VuIGNvbmZpZwotY2hhciAqY29uZl9zdHJbXSA9IHsKK3N0YXRpYyBjaGFyICpjb25mX3N0cltdID0gewogCSI0IEludGVycnVwdCBJTiArIDMgSXNvY2hyb24gT1VUIiwKIAkiMyBJbnRlcnJ1cHQgSU4gKyAzIElzb2Nocm9uIE9VVCIsCiAJIjQgSXNvY2hyb24gSU4gKyAzIElzb2Nocm9uIE9VVCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjc2NhcmQuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNzY2FyZC5jCmluZGV4IDZmYzU1ZmUuLjg2YWIxYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNzY2FyZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNzY2FyZC5jCkBAIC01Miw3ICs1Miw3IEBACiAqLwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19oZmNzKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlyZWxlYXNlMmJkczAoY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hpc2F4LmggYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaAppbmRleCBkYzU3OTE3Li4xN2NmNzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGlzYXguaApAQCAtMTI3MSw3ICsxMjcxLDYgQEAKIHZvaWQgaW5pdF9iY3N0YXRlKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IGJjKTsKIAogdm9pZCBzZXRzdGFja19IaVNheChzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKLXVuc2lnbmVkIGludCByYW5kb21fcmkodm9pZCk7CiB2b2lkIEhpU2F4X2FkZGxpc3Qoc3RydWN0IElzZG5DYXJkU3RhdGUgKnNwLCBzdHJ1Y3QgUFN0YWNrICpzdCk7CiB2b2lkIEhpU2F4X3JtbGlzdChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqc3AsIHN0cnVjdCBQU3RhY2sgKnN0KTsKIApAQCAtMTMxNSwxNSArMTMxNCwxMSBAQAogdm9pZCBMb2dGcmFtZShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHVfY2hhciAqIHAsIGludCBzaXplKTsKIHZvaWQgZGxvZ2ZyYW1lKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGRpcik7CiB2b2lkIGllY3B5KHVfY2hhciAqIGRlc3QsIHVfY2hhciAqIGllc3RhcnQsIGludCBpZW9mZnNldCk7Ci0jaWZkZWYgSVNETl9DSElQX0lTQUMKLXZvaWQgc2V0c3RhY2tfaXNhYyhzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKLSNlbmRpZgkvKiBJU0ROX0NISVBfSVNBQyAqLwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogI2RlZmluZSBIWkRFTEFZKGppZmZzKSB7aW50IHRvdXQgPSBqaWZmczsgd2hpbGUgKHRvdXQtLSkgdWRlbGF5KDEwMDAwMDAvSFopO30KIAogaW50IGxsX3J1bihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBhZGRmZWF0dXJlcyk7Ci12b2lkIGxsX3N0b3Aoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKIGludCBDYWxsY05ldyh2b2lkKTsKIHZvaWQgQ2FsbGNGcmVlKHZvaWQpOwogaW50IENhbGxjTmV3Q2hhbihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hzY3guYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9oc2N4LmMKaW5kZXggNWJiYmUzZS4uNjZkYmFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hzY3guYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaHNjeC5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBjbG9zZV9oc2N4c3RhdGUoc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAltb2RlaHNjeChiY3MsIDAsIGJjcy0+Y2hhbm5lbCk7CkBAIC0yMDMsNyArMjAzLDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHNldHN0YWNrX2hzY3goc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJYmNzLT5jaGFubmVsID0gc3QtPmwxLmJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2ljYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2ljYy5jCmluZGV4IGRjZjMxZjguLmI0Y2E1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pY2MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaWNjLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogI2VuZGlmCiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBpY2NfZW1wdHlfZmlmbyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBjb3VudCkKIHsKIAl1X2NoYXIgKnB0cjsKQEAgLTU2MywxMyArNTYzLDEzIEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogc2V0c3RhY2tfaWNjKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJc3QtPmwxLmwxaHcgPSBJQ0NfbDFodzsKIH0KIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBEQ19DbG9zZV9pY2Moc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKSB7CiAJaWYgKGNzLT5kYy5pY2MubW9uX3J4KSB7CiAJCWtmcmVlKGNzLT5kYy5pY2MubW9uX3J4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pcGFjeC5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lwYWN4LmMKaW5kZXggNjQ4NWUyMy4uZWZiYTJmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lwYWN4LmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lwYWN4LmMKQEAgLTM2LDggKzM2LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjaWNfaW50KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CiBzdGF0aWMgdm9pZCBkY2hfbDJsMShzdHJ1Y3QgUFN0YWNrICpzdCwgaW50IHByLCB2b2lkICphcmcpOwogc3RhdGljIHZvaWQgZGJ1c3lfdGltZXJfaGFuZGxlcihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpOwotc3RhdGljIHZvaWQgaXBhY3hfbmV3X3BoKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7Ci1zdGF0aWMgdm9pZCBkY2hfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKIHN0YXRpYyB2b2lkIGRjaF9lbXB0eV9maWZvKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgaW50IGNvdW50KTsKIHN0YXRpYyB2b2lkIGRjaF9maWxsX2ZpZm8oc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBkY2hfaW50KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CkBAIC0yMzIsODEgKzIzMCw2IEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTDEgc3RhdGUgbWFjaGluZSBpbnRlcm1lZGlhdGUgbGF5ZXIgdG8gaXNkbmwxIG1vZHVsZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGF0aWMgdm9pZAotaXBhY3hfbmV3X3BoKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKLXsKLQlzd2l0Y2ggKGNzLT5kYy5pc2FjLnBoX3N0YXRlKSB7Ci0JCWNhc2UgKElQQUNYX0lORF9SRVMpOgotCQkJcGhfY29tbWFuZChjcywgSVBBQ1hfQ01EX0RJKTsKLQkJCWwxX21zZyhjcywgSFdfUkVTRVQgfCBJTkRJQ0FUSU9OLCBOVUxMKTsKLQkJCWJyZWFrOwotICAgICAgCi0JCWNhc2UgKElQQUNYX0lORF9EQyk6Ci0JCQlsMV9tc2coY3MsIEhXX0RFQUNUSVZBVEUgfCBDT05GSVJNLCBOVUxMKTsKLQkJCWJyZWFrOwotICAgICAgCi0JCWNhc2UgKElQQUNYX0lORF9EUik6Ci0JCQlsMV9tc2coY3MsIEhXX0RFQUNUSVZBVEUgfCBJTkRJQ0FUSU9OLCBOVUxMKTsKLQkJCWJyZWFrOwotICAgICAgCi0JCWNhc2UgKElQQUNYX0lORF9QVSk6Ci0JCQlsMV9tc2coY3MsIEhXX1BPV0VSVVAgfCBDT05GSVJNLCBOVUxMKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgKElQQUNYX0lORF9SU1kpOgotCQkJbDFfbXNnKGNzLCBIV19SU1lOQyB8IElORElDQVRJT04sIE5VTEwpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAoSVBBQ1hfSU5EX0FSKToKLQkJCWwxX21zZyhjcywgSFdfSU5GTzIgfCBJTkRJQ0FUSU9OLCBOVUxMKTsKLQkJCWJyZWFrOwotICAgICAgCi0JCWNhc2UgKElQQUNYX0lORF9BSTgpOgotCQkJbDFfbXNnKGNzLCBIV19JTkZPNF9QOCB8IElORElDQVRJT04sIE5VTEwpOwotCQkJYnJlYWs7Ci0gICAgICAKLQkJY2FzZSAoSVBBQ1hfSU5EX0FJMTApOgotCQkJbDFfbXNnKGNzLCBIV19JTkZPNF9QMTAgfCBJTkRJQ0FUSU9OLCBOVUxMKTsKLQkJCWJyZWFrOwotICAgICAgCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gYm90dG9tIGhhbGYgaGFuZGxlciBmb3IgRCBjaGFubmVsCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0YXRpYyB2b2lkCi1kY2hfYmgoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQotewotCXN0cnVjdCBQU3RhY2sgKnN0OwotCQotCWlmICghY3MpIHJldHVybjsKLSAgCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEX0NMRUFSQlVTWSwgJmNzLT5ldmVudCkpIHsKLQkJaWYgKGNzLT5kZWJ1ZykgZGVidWdsMShjcywgIkQtQ2hhbm5lbCBCdXN5IGNsZWFyZWQiKTsKLQkJZm9yIChzdCA9IGNzLT5zdGxpc3Q7IHN0OyBzdCA9IHN0LT5uZXh0KSB7Ci0JCQlzdC0+bDEubDFsMihzdCwgUEhfUEFVU0UgfCBDT05GSVJNLCBOVUxMKTsKLQkJfQotCX0KLSAgCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEX1JDVkJVRlJFQURZLCAmY3MtPmV2ZW50KSkgewotCQlEQ2hhbm5lbF9wcm9jX3Jjdihjcyk7Ci0gIH0gIAotICAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KERfWE1UQlVGUkVBRFksICZjcy0+ZXZlbnQpKSB7Ci0JCURDaGFubmVsX3Byb2NfeG10KGNzKTsKLSAgfSAgCi0gIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRF9MMVNUQVRFQ0hBTkdFLCAmY3MtPmV2ZW50KSkgewotICAgIGlwYWN4X25ld19waChjcyk7Ci0gIH0gIAotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEZpbGwgYnVmZmVyIGZyb20gcmVjZWl2ZSBGSUZPCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIApAQCAtOTkxLDE0ICs5MTQsNSBAQAogCX0KIH0KIAotCi12b2lkIF9fZGV2aW5pdAotc2V0dXBfaXBhY3goc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQotewotCUlOSVRfV09SSygmY3MtPnRxdWV1ZSwgKHZvaWQgKikodm9pZCAqKSBkY2hfYmgsIGNzKTsKLQljcy0+ZGJ1c3l0aW1lci5mdW5jdGlvbiA9ICh2b2lkICopIGRidXN5X3RpbWVyX2hhbmRsZXI7Ci0JY3MtPmRidXN5dGltZXIuZGF0YSA9IChsb25nKSBjczsKLQlpbml0X3RpbWVyKCZjcy0+ZGJ1c3l0aW1lcik7Ci19CiAvLy0tLS0tLS0tLS0tLS0tLS0tIGVuZCBvZiBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FjLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNhYy5jCmluZGV4IDIwYjk0OTkuLjg1ZTA2M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FjLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzYWMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAjZW5kaWYKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGlzYWNfZW1wdHlfZmlmbyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBjb3VudCkKIHsKIAl1X2NoYXIgKnB0cjsKQEAgLTU2MywxMyArNTYzLDEzIEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogc2V0c3RhY2tfaXNhYyhzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXN0LT5sMS5sMWh3ID0gSVNBQ19sMWh3OwogfQogCi12b2lkIAorc3RhdGljIHZvaWQKIERDX0Nsb3NlX2lzYWMoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKSB7CiAJaWYgKGNzLT5kYy5pc2FjLm1vbl9yeCkgewogCQlrZnJlZShjcy0+ZGMuaXNhYy5tb25fcngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzYXIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FyLmMKaW5kZXggZWUwODEzMjEuLjY0MmE4N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2FyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzYXIuYwpAQCAtMjEsMTMgKzIxLDEzIEBACiAjZGVmaW5lIEVUWAkweDAzCiAKICNkZWZpbmUgRkFYTU9EQ05UCTEzCi1jb25zdAl1X2NoYXIJZmF4bW9kdWxhdGlvbltdID0gezMsMjQsNDgsNzIsNzMsNzQsOTYsOTcsOTgsMTIxLDEyMiwxNDUsMTQ2fTsKK3N0YXRpYyBjb25zdAl1X2NoYXIJZmF4bW9kdWxhdGlvbltdID0gezMsMjQsNDgsNzIsNzMsNzQsOTYsOTcsOTgsMTIxLDEyMiwxNDUsMTQ2fTsKIHN0YXRpYwl1X2ludAltb2RtYXNrID0gMHgxZmZmOwogc3RhdGljCWludAlmcm1fZXh0cmFfZGVsYXkgPSAyOwogc3RhdGljCWludAlwYXJhX1RPQSA9IDY7Ci1jb25zdCAgIHVfY2hhciAgKkZDMV9DTURbXSA9IHsiRkFFIiwgIkZUUyIsICJGUlMiLCAiRlRNIiwgIkZSTSIsICJGVEgiLCAiRlJIIiwgIkNUUkwiIH07CitzdGF0aWMgY29uc3QgICB1X2NoYXIgICpGQzFfQ01EW10gPSB7IkZBRSIsICJGVFMiLCAiRlJTIiwgIkZUTSIsICJGUk0iLCAiRlRIIiwgIkZSSCIsICJDVFJMIiB9OwogCi12b2lkIGlzYXJfc2V0dXAoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKK3N0YXRpYyB2b2lkIGlzYXJfc2V0dXAoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKTsKIHN0YXRpYyB2b2lkIGlzYXJfcHVtcF9jbWQoc3RydWN0IEJDU3RhdGUgKmJjcywgdV9jaGFyIGNtZCwgdV9jaGFyIHBhcmEpOwogc3RhdGljIHZvaWQgbGxfZGVsaXZlcl9mYXhzdGF0KHN0cnVjdCBCQ1N0YXRlICpiY3MsIHVfY2hhciBzdGF0dXMpOwogCkBAIC00NSw3ICs0NSw3IEBACiB9CiAKIAotaW50CitzdGF0aWMgaW50CiBzZW5kbXNnKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgdV9jaGFyIGhpcywgdV9jaGFyIGNyZWcsIHVfY2hhciBsZW4sCiAJdV9jaGFyICptc2cpCiB7CkBAIC04NSw3ICs4NSw3IEBACiB9CiAKIC8qIENhbGwgb25seSB3aXRoIElSUSBkaXNhYmxlZCAhISEgKi8KLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHJjdl9tYm94KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgc3RydWN0IGlzYXJfcmVnICppcmVnLCB1X2NoYXIgKm1zZykKIHsKIAlpbnQgaTsKQEAgLTExNCw3ICsxMTQsNyBAQAogfQogCiAvKiBDYWxsIG9ubHkgd2l0aCBJUlEgZGlzYWJsZWQgISEhICovCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBnZXRfaXJxX2luZm9zKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgc3RydWN0IGlzYXJfcmVnICppcmVnKQogewogCWlyZWctPmlpcyA9IGNzLT5CQ19SZWFkX1JlZyhjcywgMSwgSVNBUl9JSVMpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiAjZW5kaWYKIH0KIAotaW50CitzdGF0aWMgaW50CiB3YWl0cmVjbXNnKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgdV9jaGFyICpsZW4sCiAJdV9jaGFyICptc2csIGludCBtYXhkZWxheSkKIHsKQEAgLTE4NSw3ICsxODUsNyBAQAogCXJldHVybih2ZXIpOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGlzYXJfbG9hZF9maXJtd2FyZShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHVfY2hhciBfX3VzZXIgKmJ1ZikKIHsKIAlpbnQgcmV0LCBzaXplLCBjbnQsIGRlYnVnOwpAQCAtNzM5LDcgKzczOSw3IEBACiAJfQogfQogCi1pbmxpbmUKK3N0YXRpYyBpbmxpbmUKIHN0cnVjdCBCQ1N0YXRlICpzZWxfYmNzX2lzYXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1X2NoYXIgZHBhdGgpCiB7CiAJaWYgKCghZHBhdGgpIHx8IChkcGF0aCA9PSAzKSkKQEAgLTc1MSw3ICs3NTEsNyBAQAogCXJldHVybihOVUxMKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHNlbmRfZnJhbWVzKHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJaWYgKGJjcy0+dHhfc2tiKSB7CkBAIC04MDYsNyArODA2LDcgQEAKIAl9CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGNoZWNrX3NlbmQoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCB1X2NoYXIgcmRtKQogewogCXN0cnVjdCBCQ1N0YXRlICpiY3M7CkBAIC04MjgsMTEgKzgyOCwxMyBAQAogCQogfQogCi1jb25zdCBjaGFyICpkbXJpbFtdID0geyJOTyBTUEVFRCIsICIxMjAwLzc1IiwgIk5PREVGMiIsICI3NS8xMjAwIiwgIk5PREVGNCIsCi0JCQkiMzAwIiwgIjYwMCIsICIxMjAwIiwgIjI0MDAiLCAiNDgwMCIsICI3MjAwIiwKLQkJCSI5NjAwbnQiLCAiOTYwMHQiLCAiMTIwMDAiLCAiMTQ0MDAiLCAiV1JPTkcifTsKLWNvbnN0IGNoYXIgKmRtcmltW10gPSB7Ik5PIE1PRCIsICJOTyBERUYiLCAiVjMyL1YzMmIiLCAiVjIyIiwgIlYyMSIsCi0JCQkiQmVsbDEwMyIsICJWMjMiLCAiQmVsbDIwMiIsICJWMTciLCAiVjI5IiwgIlYyN3RlciJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKmRtcmlsW10gPSB7Ik5PIFNQRUVEIiwgIjEyMDAvNzUiLCAiTk9ERUYyIiwgIjc1LzEyMDAiLAorCQkJCSJOT0RFRjQiLCAiMzAwIiwgIjYwMCIsICIxMjAwIiwgIjI0MDAiLAorCQkJCSI0ODAwIiwgIjcyMDAiLCAiOTYwMG50IiwgIjk2MDB0IiwgIjEyMDAwIiwKKwkJCQkiMTQ0MDAiLCAiV1JPTkcifTsKK3N0YXRpYyBjb25zdCBjaGFyICpkbXJpbVtdID0geyJOTyBNT0QiLCAiTk8gREVGIiwgIlYzMi9WMzJiIiwgIlYyMiIsICJWMjEiLAorCQkJCSJCZWxsMTAzIiwgIlYyMyIsICJCZWxsMjAyIiwgIlYxNyIsICJWMjkiLAorCQkJCSJWMjd0ZXIifTsKIAogc3RhdGljIHZvaWQKIGlzYXJfcHVtcF9zdGF0dXNfcnNwKHN0cnVjdCBCQ1N0YXRlICpiY3MsIHN0cnVjdCBpc2FyX3JlZyAqaXJlZykgewpAQCAtMTM4OCw3ICsxMzkwLDcgQEAKIAl1ZGVsYXkoMTAwMCk7CiB9CiAKLWludAorc3RhdGljIGludAogbW9kZWlzYXIoc3RydWN0IEJDU3RhdGUgKmJjcywgaW50IG1vZGUsIGludCBiYykKIHsKIAlzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSBiY3MtPmNzOwpAQCAtMTU2Miw3ICsxNTY0LDcgQEAKIAkJc2VuZG1zZyhjcywgZHBzIHwgSVNBUl9ISVNfUFVNUENUUkwsIGN0cmwsIG5vbSwgJnAxKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGlzYXJfc2V0dXAoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXVfY2hhciBtc2c7CkBAIC0xNTgyLDcgKzE1ODQsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGlzYXJfbDJsMShzdHJ1Y3QgUFN0YWNrICpzdCwgaW50IHByLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IEJDU3RhdGUgKmJjcyA9IHN0LT5sMS5iY3M7CkBAIC0xNjgxLDcgKzE2ODMsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGNsb3NlX2lzYXJzdGF0ZShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQogewogCW1vZGVpc2FyKGJjcywgMCwgYmNzLT5jaGFubmVsKTsKQEAgLTE3MDMsNyArMTcwNSw3IEBACiAJZGVsX3RpbWVyKCZiY3MtPmh3LmlzYXIuZnRpbWVyKTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBvcGVuX2lzYXJzdGF0ZShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJDX0ZMR19JTklULCAmYmNzLT5GbGFnKSkgewpAQCAtMTcyNSw3ICsxNzI3LDcgQEAKIAlyZXR1cm4gKDApOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHNldHN0YWNrX2lzYXIoc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJYmNzLT5jaGFubmVsID0gc3QtPmwxLmJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMS5jCmluZGV4IDRkMDhkMjcuLmJhYjM1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwxLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogCXZhX2VuZChhcmdzKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIEwxYWN0aXZhdGVkKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlzdHJ1Y3QgUFN0YWNrICpzdDsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIEwxZGVhY3RpdmF0ZWQoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCXN0cnVjdCBQU3RhY2sgKnN0OwpAQCAtMjc5LDcgKzI3OSw4IEBACiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDFfUFVMTF9SRVEsICZzdC0+bDEuRmxhZ3MpKQogCQlzdC0+bDEubDFsMihzdCwgUEhfUFVMTCB8IENPTkZJUk0sIE5VTEwpOwogCWlmICghdGVzdF9iaXQoQkNfRkxHX0FDVElWLCAmYmNzLT5GbGFnKSkgewotCQlpZiAoIXRlc3RfYml0KEJDX0ZMR19CVVNZLCAmYmNzLT5GbGFnKSAmJiAoIXNrYl9xdWV1ZV9sZW4oJmJjcy0+c3F1ZXVlKSkpIHsKKwkJaWYgKCF0ZXN0X2JpdChCQ19GTEdfQlVTWSwgJmJjcy0+RmxhZykgJiYKKwkJICAgIHNrYl9xdWV1ZV9lbXB0eSgmYmNzLT5zcXVldWUpKSB7CiAJCQlzdC0+bDIubDJsMShzdCwgUEhfREVBQ1RJVkFURSB8IENPTkZJUk0sIE5VTEwpOwogCQl9CiAJfQpAQCAtMzcwLDcgKzM3MSw3IEBACiAKICNpZmRlZiBMMkZSQU1FX0RFQlVHCQkvKiBwc2EgKi8KIAotY2hhciAqCitzdGF0aWMgY2hhciAqCiBsMmNtZCh1X2NoYXIgY21kKQogewogCXN3aXRjaCAoY21kICYgfjB4MTApIHsKQEAgLTQwNCw3ICs0MDUsNyBAQAogCiBzdGF0aWMgY2hhciB0bXBkZWJbMzJdOwogCi1jaGFyICoKK3N0YXRpYyBjaGFyICoKIGwyZnJhbWVzKHVfY2hhciAqIHB0cikKIHsKIAlzd2l0Y2ggKHB0clsyXSAmIH4weDEwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwyLmMKaW5kZXggZDMxMWI1Zi4uMTYxNWMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDIuYwpAQCAtMTA4LDcgKzEwOCw4IEBACiBzdGF0aWMgdm9pZAogc2V0X3BlZXJfYnVzeShzdHJ1Y3QgTGF5ZXIyICpsMikgewogCXRlc3RfYW5kX3NldF9iaXQoRkxHX1BFRVJfQlVTWSwgJmwyLT5mbGFnKTsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmbDItPmlfcXVldWUpIHx8IHNrYl9xdWV1ZV9sZW4oJmwyLT51aV9xdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmwyLT5pX3F1ZXVlKSB8fAorCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZsMi0+dWlfcXVldWUpKQogCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MMkJMT0NLLCAmbDItPmZsYWcpOwogfQogCkBAIC0xNDIsNyArMTQzLDcgQEAKIAlyZXR1cm4gY250OwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBmcmVld2luKHN0cnVjdCBQU3RhY2sgKnN0KQogewogCWZyZWV3aW4xKCZzdC0+bDIpOwpAQCAtMTU3LDcgKzE1OCw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzZGwyIGZyZWVkICVkIHNrYnVmZnMgaW4gcmVsZWFzZVxuIiwgY250KTsKIH0KIAotaW5saW5lIHVuc2lnbmVkIGludAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKIGNhbnNlbmQoc3RydWN0IFBTdGFjayAqc3QpCiB7CiAJdW5zaWduZWQgaW50IHAxOwpAQCAtMTY5LDcgKzE3MCw3IEBACiAJcmV0dXJuICgocDEgPCBzdC0+bDIud2luZG93KSAmJiAhdGVzdF9iaXQoRkxHX1BFRVJfQlVTWSwgJnN0LT5sMi5mbGFnKSk7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGNsZWFyX2V4Y2VwdGlvbihzdHJ1Y3QgTGF5ZXIyICpsMikKIHsKIAl0ZXN0X2FuZF9jbGVhcl9iaXQoRkxHX0FDS19QRU5ELCAmbDItPmZsYWcpOwpAQCAtMTc4LDcgKzE3OSw3IEBACiAJY2xlYXJfcGVlcl9idXN5KGwyKTsKIH0KIAotaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQKIGwyaGVhZGVyc2l6ZShzdHJ1Y3QgTGF5ZXIyICpsMiwgaW50IHVpKQogewogCXJldHVybiAoKCh0ZXN0X2JpdChGTEdfTU9EMTI4LCAmbDItPmZsYWcpICYmICghdWkpKSA/IDIgOiAxKSArCkBAIC0yMjMsNDAgKzIyNCwzMSBAQAogCiAjZGVmaW5lIGVucXVldWVfdWkoYSwgYikgZW5xdWV1ZV9zdXBlcihhLCBiKQogCi1pbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIGludAogSXNVSSh1X2NoYXIgKiBkYXRhKQogewogCXJldHVybiAoKGRhdGFbMF0gJiAweGVmKSA9PSBVSSk7CiB9CiAKLWlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiBJc1VBKHVfY2hhciAqIGRhdGEpCiB7CiAJcmV0dXJuICgoZGF0YVswXSAmIDB4ZWYpID09IFVBKTsKIH0KIAotaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQKIElzRE0odV9jaGFyICogZGF0YSkKIHsKIAlyZXR1cm4gKChkYXRhWzBdICYgMHhlZikgPT0gRE0pOwogfQogCi1pbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIGludAogSXNESVNDKHVfY2hhciAqIGRhdGEpCiB7CiAJcmV0dXJuICgoZGF0YVswXSAmIDB4ZWYpID09IERJU0MpOwogfQogCi1pbmxpbmUgaW50Ci1Jc1JSKHVfY2hhciAqIGRhdGEsIHN0cnVjdCBQU3RhY2sgKnN0KQotewotCWlmICh0ZXN0X2JpdChGTEdfTU9EMTI4LCAmc3QtPmwyLmZsYWcpKQotCQlyZXR1cm4gKGRhdGFbMF0gPT0gUlIpOwotCWVsc2UKLQkJcmV0dXJuICgoZGF0YVswXSAmIDB4ZikgPT0gMSk7Ci19Ci0KLWlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiBJc1NGcmFtZSh1X2NoYXIgKiBkYXRhLCBzdHJ1Y3QgUFN0YWNrICpzdCkKIHsKIAlyZWdpc3RlciB1X2NoYXIgZCA9ICpkYXRhOwpAQCAtMjY2LDcgKzI1OCw3IEBACiAJcmV0dXJuKCgoZCAmIDB4ZjMpID09IDEpICYmICgoZCAmIDB4MGMpICE9IDB4MGMpKTsKIH0KIAotaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQKIElzU0FCTUUodV9jaGFyICogZGF0YSwgc3RydWN0IFBTdGFjayAqc3QpCiB7CiAJdV9jaGFyIGQgPSBkYXRhWzBdICYgfjB4MTA7CkBAIC0yNzQsMjUgKzI2NiwyNSBAQAogCXJldHVybiAodGVzdF9iaXQoRkxHX01PRDEyOCwgJnN0LT5sMi5mbGFnKSA/IGQgPT0gU0FCTUUgOiBkID09IFNBQk0pOwogfQogCi1pbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIGludAogSXNSRUoodV9jaGFyICogZGF0YSwgc3RydWN0IFBTdGFjayAqc3QpCiB7CiAJcmV0dXJuICh0ZXN0X2JpdChGTEdfTU9EMTI4LCAmc3QtPmwyLmZsYWcpID8gZGF0YVswXSA9PSBSRUogOiAoZGF0YVswXSAmIDB4ZikgPT0gUkVKKTsKIH0KIAotaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQKIElzRlJNUih1X2NoYXIgKiBkYXRhKQogewogCXJldHVybiAoKGRhdGFbMF0gJiAweGVmKSA9PSBGUk1SKTsKIH0KIAotaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQKIElzUk5SKHVfY2hhciAqIGRhdGEsIHN0cnVjdCBQU3RhY2sgKnN0KQogewogCXJldHVybiAodGVzdF9iaXQoRkxHX01PRDEyOCwgJnN0LT5sMi5mbGFnKSA/IGRhdGFbMF0gPT0gUk5SIDogKGRhdGFbMF0gJiAweGYpID09IFJOUik7CiB9CiAKLWludAorc3RhdGljIGludAogaWZyYW1lX2Vycm9yKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBpID0gbDJhZGRyc2l6ZSgmc3QtPmwyKSArICh0ZXN0X2JpdChGTEdfTU9EMTI4LCAmc3QtPmwyLmZsYWcpID8gMiA6IDEpOwpAQCAtMzE1LDcgKzMwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAorc3RhdGljIGludAogc3VwZXJfZXJyb3Ioc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHNrYi0+bGVuICE9IGwyYWRkcnNpemUoJnN0LT5sMikgKwpAQCAtMzI1LDcgKzMxNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAorc3RhdGljIGludAogdW5udW1fZXJyb3Ioc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBza19idWZmICpza2IsIGludCB3YW50cnNwKQogewogCWludCByc3AgPSAoKnNrYi0+ZGF0YSAmIDB4MikgPj4gMTsKQEAgLTM0MSw3ICszMzMsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIFVJX2Vycm9yKHN0cnVjdCBQU3RhY2sgKnN0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCByc3AgPSAqc2tiLT5kYXRhICYgMHgyOwpAQCAtMzU3LDcgKzM0OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludAorc3RhdGljIGludAogRlJNUl9lcnJvcihzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgaGVhZGVycyA9IGwyYWRkcnNpemUoJnN0LT5sMikgKyAxOwpAQCAtNDQ0LDUxICs0MzYsNDQgQEAKIAllbnF1ZXVlX3N1cGVyKHN0LCBza2IpOwogfQogCi1pbmxpbmUgdV9jaGFyCitzdGF0aWMgaW5saW5lIHVfY2hhcgogZ2V0X1BvbGxGbGFnKHN0cnVjdCBQU3RhY2sgKiBzdCwgc3RydWN0IHNrX2J1ZmYgKiBza2IpCiB7CiAJcmV0dXJuIChza2ItPmRhdGFbbDJhZGRyc2l6ZSgmKHN0LT5sMikpXSAmIDB4MTApOwogfQogCi1pbmxpbmUgdm9pZAotRnJlZVNrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWRldl9rZnJlZV9za2Ioc2tiKTsKLX0KLQotCi1pbmxpbmUgdV9jaGFyCitzdGF0aWMgaW5saW5lIHVfY2hhcgogZ2V0X1BvbGxGbGFnRnJlZShzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1X2NoYXIgUEY7CiAKIAlQRiA9IGdldF9Qb2xsRmxhZyhzdCwgc2tiKTsKLQlGcmVlU2tiKHNrYik7CisJZGV2X2tmcmVlX3NrYihza2IpOwogCXJldHVybiAoUEYpOwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBzdGFydF90MjAwKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgaSkKIHsKIAlGc21BZGRUaW1lcigmc3QtPmwyLnQyMDAsIHN0LT5sMi5UMjAwLCBFVl9MMl9UMjAwLCBOVUxMLCBpKTsKIAl0ZXN0X2FuZF9zZXRfYml0KEZMR19UMjAwX1JVTiwgJnN0LT5sMi5mbGFnKTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogcmVzdGFydF90MjAwKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgaSkKIHsKIAlGc21SZXN0YXJ0VGltZXIoJnN0LT5sMi50MjAwLCBzdC0+bDIuVDIwMCwgRVZfTDJfVDIwMCwgTlVMTCwgaSk7CiAJdGVzdF9hbmRfc2V0X2JpdChGTEdfVDIwMF9SVU4sICZzdC0+bDIuZmxhZyk7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHN0b3BfdDIwMChzdHJ1Y3QgUFN0YWNrICpzdCwgaW50IGkpCiB7CiAJaWYodGVzdF9hbmRfY2xlYXJfYml0KEZMR19UMjAwX1JVTiwgJnN0LT5sMi5mbGFnKSkKIAkJRnNtRGVsVGltZXIoJnN0LT5sMi50MjAwLCBpKTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogc3Q1X2RsX3JlbGVhc2VfbDJsMyhzdHJ1Y3QgUFN0YWNrICpzdCkKIHsKIAkJaW50IHByOwpAQCAtNTAxLDcgKzQ4Niw3IEBACiAJCXN0LT5sMi5sMmwzKHN0LCBwciwgTlVMTCk7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGxhcGJfZGxfcmVsZWFzZV9sMmwzKHN0cnVjdCBQU3RhY2sgKnN0LCBpbnQgZikKIHsKIAkJaWYgKHRlc3RfYml0KEZMR19MQVBCLCAmc3QtPmwyLmZsYWcpKQpAQCAtNzcwLDcgKzc1NSw3IEBACiAJCXN0LT5sMi5sMmwzKHN0LCBETF9FU1RBQkxJU0ggfCBJTkRJQ0FUSU9OLCBOVUxMKTsKIAogCWlmICgoU1RfTDJfNz09c3RhdGUpIHx8IChTVF9MMl84ID09IHN0YXRlKSkKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnN0LT5sMi5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnN0LT5sMi5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKIAkJCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgUkVRVUVTVCwgTlVMTCk7CiB9CiAKQEAgLTgwMiw3ICs3ODcsNyBAQAogCQlsMl9tZGxfZXJyb3JfdWEoZmksIGV2ZW50LCBhcmcpOwogCQlyZXR1cm47CiAJfQotCUZyZWVTa2Ioc2tiKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMR19QRU5EX1JFTCwgJnN0LT5sMi5mbGFnKSkKIAkJbDJfZGlzY29ubmVjdChmaSwgZXZlbnQsIGFyZyk7CkBAIC04MjYsNyArODExLDcgQEAKIAlpZiAocHIgIT0gLTEpCiAJCXN0LT5sMi5sMmwzKHN0LCBwciwgTlVMTCk7CiAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmc3QtPmwyLmlfcXVldWUpICYmIGNhbnNlbmQoc3QpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzdC0+bDIuaV9xdWV1ZSkgJiYgY2Fuc2VuZChzdCkpCiAJCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgUkVRVUVTVCwgTlVMTCk7CiB9CiAKQEAgLTg0MCw3ICs4MjUsNyBAQAogCQlsMl9tZGxfZXJyb3JfdWEoZmksIGV2ZW50LCBhcmcpOwogCQlyZXR1cm47CiAJfQotCUZyZWVTa2Ioc2tiKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKIAlzdG9wX3QyMDAoc3QsIDYpOwogCWxhcGJfZGxfcmVsZWFzZV9sMmwzKHN0LCBDT05GSVJNKTsKQEAgLTg4OSw3ICs4NzQsNyBAQAogCX0KIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogZW5xdWlyeV9jcihzdHJ1Y3QgUFN0YWNrICpzdCwgdV9jaGFyIHR5cCwgdV9jaGFyIGNyLCB1X2NoYXIgcGYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTkxMiw3ICs4OTcsNyBAQAogCWVucXVldWVfc3VwZXIoc3QsIHNrYik7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGVucXVpcnlfcmVzcG9uc2Uoc3RydWN0IFBTdGFjayAqc3QpCiB7CiAJaWYgKHRlc3RfYml0KEZMR19PV05fQlVTWSwgJnN0LT5sMi5mbGFnKSkKQEAgLTkyMiw3ICs5MDcsNyBAQAogCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfQUNLX1BFTkQsICZzdC0+bDIuZmxhZyk7CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHRyYW5zbWl0X2VucXVpcnkoc3RydWN0IFBTdGFjayAqc3QpCiB7CiAJaWYgKHRlc3RfYml0KEZMR19PV05fQlVTWSwgJnN0LT5sMi5mbGFnKSkKQEAgLTEwMDQsNyArOTg5LDcgQEAKIAkJUG9sbEZsYWcgPSAoc2tiLT5kYXRhWzBdICYgMHgxMCk7CiAJCW5yID0gKHNrYi0+ZGF0YVswXSA+PiA1KSAmIDB4NzsKIAl9Ci0JRnJlZVNrYihza2IpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKIAogCWlmIChQb2xsRmxhZykgewogCQlpZiAocnNwKQpAQCAtMTAzMCw3ICsxMDE1LDcgQEAKIAkJCWlmKHR5cCAhPSBSUikgRnNtRGVsVGltZXIoJnN0LT5sMi50MjAzLCA5KTsKIAkJCXJlc3RhcnRfdDIwMChzdCwgMTIpOwogCQl9Ci0JCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIuaV9xdWV1ZSkgJiYgKHR5cCA9PSBSUikpCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzdC0+bDIuaV9xdWV1ZSkgJiYgKHR5cCA9PSBSUikpCiAJCQlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IFJFUVVFU1QsIE5VTEwpOwogCX0gZWxzZQogCQlucmVycm9ycmVjb3ZlcnkoZmkpOwpAQCAtMTA0Nyw3ICsxMDMyLDcgQEAKIAlpZiAoIXRlc3RfYml0KEZMR19MM19JTklULCAmc3QtPmwyLmZsYWcpKQogCQlza2JfcXVldWVfdGFpbCgmc3QtPmwyLmlfcXVldWUsIHNrYik7CiAJZWxzZQotCQlGcmVlU2tiKHNrYik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwOTMsNyArMTA3OCw3IEBACiAJCW5yID0gKHNrYi0+ZGF0YVtpXSA+PiA1KSAmIDB4NzsKIAl9CiAJaWYgKHRlc3RfYml0KEZMR19PV05fQlVTWSwgJmwyLT5mbGFnKSkgewotCQlGcmVlU2tiKHNrYik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJaWYoUG9sbEZsYWcpIGVucXVpcnlfcmVzcG9uc2Uoc3QpOwogCX0gZWxzZSBpZiAobDItPnZyID09IG5zKSB7CiAJCShsMi0+dnIpKys7CkBAIC0xMTExLDcgKzEwOTYsNyBAQAogCQlzdC0+bDIubDJsMyhzdCwgRExfREFUQSB8IElORElDQVRJT04sIHNrYik7CiAJfSBlbHNlIHsKIAkJLyogbihzKSE9dihyKSAqLwotCQlGcmVlU2tiKHNrYik7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJaWYgKHRlc3RfYW5kX3NldF9iaXQoRkxHX1JFSkVYQywgJmwyLT5mbGFnKSkgewogCQkJaWYgKFBvbGxGbGFnKQogCQkJCWVucXVpcnlfcmVzcG9uc2Uoc3QpOwpAQCAtMTEzNiw3ICsxMTIxLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIuaV9xdWV1ZSkgJiYgKGZpLT5zdGF0ZSA9PSBTVF9MMl83KSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3QtPmwyLmlfcXVldWUpICYmIChmaS0+c3RhdGUgPT0gU1RfTDJfNykpCiAJCXN0LT5sMi5sMmwxKHN0LCBQSF9QVUxMIHwgUkVRVUVTVCwgTlVMTCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGTEdfQUNLX1BFTkQsICZzdC0+bDIuZmxhZykpCiAJCWVucXVpcnlfY3Ioc3QsIFJSLCBSU1AsIDApOwpAQCAtMTE1NCw3ICsxMTM5LDcgQEAKIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTDNfSU5JVCwgJnN0LT5sMi5mbGFnKTsKIAl9IGVsc2UKIAkJRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzQpOwotCWlmIChza2JfcXVldWVfbGVuKCZzdC0+bDIudWlfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzdC0+bDIudWlfcXVldWUpKQogCQl0eF91aShzdCk7CiB9CiAKQEAgLTEzMDksNyArMTI5NCw3IEBACiAJCXNrYiA9IGFsbG9jX3NrYihvc2tiLT5sZW4gKyBpLCBHRlBfQVRPTUlDKTsKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLCBpKSwgaGVhZGVyLCBpKTsKIAkJbWVtY3B5KHNrYl9wdXQoc2tiLCBvc2tiLT5sZW4pLCBvc2tiLT5kYXRhLCBvc2tiLT5sZW4pOwotCQlGcmVlU2tiKG9za2IpOworCQlkZXZfa2ZyZWVfc2tiKG9za2IpOwogCX0KIAlzdC0+bDIubDJsMShzdCwgUEhfUFVMTCB8IElORElDQVRJT04sIHNrYik7CiAJdGVzdF9hbmRfY2xlYXJfYml0KEZMR19BQ0tfUEVORCwgJnN0LT5sMi5mbGFnKTsKQEAgLTEzMTcsNyArMTMwMiw3IEBACiAJCUZzbURlbFRpbWVyKCZzdC0+bDIudDIwMywgMTMpOwogCQlGc21BZGRUaW1lcigmc3QtPmwyLnQyMDAsIHN0LT5sMi5UMjAwLCBFVl9MMl9UMjAwLCBOVUxMLCAxMSk7CiAJfQotCWlmIChza2JfcXVldWVfbGVuKCZsMi0+aV9xdWV1ZSkgJiYgY2Fuc2VuZChzdCkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmwyLT5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKIAkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIH0KIApAQCAtMTM0OSw3ICsxMzM0LDcgQEAKIAkJUG9sbEZsYWcgPSAoc2tiLT5kYXRhWzBdICYgMHgxMCk7CiAJCW5yID0gKHNrYi0+ZGF0YVswXSA+PiA1KSAmIDB4NzsKIAl9Ci0JRnJlZVNrYihza2IpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKIAogCWlmIChyc3AgJiYgUG9sbEZsYWcpIHsKIAkJaWYgKGxlZ2FsbnIoc3QsIG5yKSkgewpAQCAtMTM2Myw3ICsxMzQ4LDcgQEAKIAkJCX0KIAkJCWludm9rZV9yZXRyYW5zbWlzc2lvbihzdCwgbnIpOwogCQkJRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOwotCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJmwyLT5pX3F1ZXVlKSAmJiBjYW5zZW5kKHN0KSkKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZsMi0+aV9xdWV1ZSkgJiYgY2Fuc2VuZChzdCkpCiAJCQkJc3QtPmwyLmwybDEoc3QsIFBIX1BVTEwgfCBSRVFVRVNULCBOVUxMKTsKIAkJfSBlbHNlCiAJCQlucmVycm9ycmVjb3ZlcnkoZmkpOwpAQCAtMTM5MSw3ICsxMzc2LDcgQEAKIAkJZXN0YWJsaXNobGluayhmaSk7CiAJCXRlc3RfYW5kX2NsZWFyX2JpdChGTEdfTDNfSU5JVCwgJnN0LT5sMi5mbGFnKTsKIAl9Ci0JRnJlZVNrYihza2IpOworCWRldl9rZnJlZV9za2Ioc2tiKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NTUsNyArMTY0MCw3IEBACiAJCQkJZGF0YXAgKz0gbGVuOwogCQkJZWxzZSB7CiAJCQkJRnNtRXZlbnQoJnN0LT5sMi5sMm0sIEVWX0wyX0ZSQU1FX0VSUk9SLCAodm9pZCAqKSAnTicpOwotCQkJCUZyZWVTa2Ioc2tiKTsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0dXJuOwogCQkJfQogCQkJaWYgKCEoKmRhdGFwICYgMSkpIHsJLyogSS1GcmFtZSAqLwpAQCAtMTY4NCwxNiArMTY2OSwxNiBAQAogCQkJCQlyZXQgPSBGc21FdmVudCgmc3QtPmwyLmwybSwgRVZfTDJfRlJNUiwgc2tiKTsKIAkJCX0gZWxzZSB7CiAJCQkJRnNtRXZlbnQoJnN0LT5sMi5sMm0sIEVWX0wyX0ZSQU1FX0VSUk9SLCAodm9pZCAqKSAnTCcpOwotCQkJCUZyZWVTa2Ioc2tiKTsKKwkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJcmV0ID0gMDsKIAkJCX0KIAkJCWlmKGMpIHsKLQkJCQlGcmVlU2tiKHNrYik7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCUZzbUV2ZW50KCZzdC0+bDIubDJtLCBFVl9MMl9GUkFNRV9FUlJPUiwgKHZvaWQgKikobG9uZyljKTsKIAkJCQlyZXQgPSAwOwogCQkJfQogCQkJaWYgKHJldCkKLQkJCQlGcmVlU2tiKHNrYik7CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgKFBIX1BVTEwgfCBDT05GSVJNKToKIAkJCUZzbUV2ZW50KCZzdC0+bDIubDJtLCBFVl9MMl9BQ0tfUFVMTCwgYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDMuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9pc2RubDMuYwppbmRleCBmNTcxYjVkLi5jOTkxN2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXNkbmwzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2lzZG5sMy5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAkJCQkhdGVzdF9iaXQoRkxHX1BUUCwgJnAtPnN0LT5sMi5mbGFnKSkgewogCQkJCWlmIChwLT5kZWJ1ZykKIAkJCQkJbDNfZGVidWcocC0+c3QsICJyZWxlYXNlX2wzX3Byb2Nlc3M6IGxhc3QgcHJvY2VzcyIpOwotCQkJCWlmICghc2tiX3F1ZXVlX2xlbigmcC0+c3QtPmwzLnNxdWV1ZSkpIHsKKwkJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZwLT5zdC0+bDMuc3F1ZXVlKSkgewogCQkJCQlpZiAocC0+ZGVidWcpCiAJCQkJCQlsM19kZWJ1ZyhwLT5zdCwgInJlbGVhc2VfbDNfcHJvY2VzczogcmVsZWFzZSBsaW5rIik7CiAJCQkJCWlmIChwLT5zdC0+cHJvdG9jb2wgIT0gSVNETl9QVFlQRV9OSTEpCkBAIC0zOTAsNyArMzkwLDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBpc2RubDNfdHJhbnMoc3RydWN0IFBTdGFjayAqc3QsIGludCBwciwgdm9pZCAqYXJnKSB7CiAJc3QtPmwzLmwzbDIoc3QsIHByLCBhcmcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2lzdXJmLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXN1cmYuYwppbmRleCBhZjUxNzFkLi4zMzc0N2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXN1cmYuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaXN1cmYuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19pc3VyZihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJcmVsZWFzZV9yZWdpb24oY3MtPmh3LmlzdXJmLnJlc2V0LCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9peDFfbWljcm8uYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9peDFfbWljcm8uYwppbmRleCBiODQzYjc1Li45MDhhN2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvaXgxX21pY3JvLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2l4MV9taWNyby5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSAiaXNkbmwxLmgiCiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwotY29uc3QgY2hhciAqaXgxX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4xMi4yLjQgJCI7CitzdGF0aWMgY29uc3QgY2hhciAqaXgxX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4xMi4yLjQgJCI7CiAKICNkZWZpbmUgYnl0ZW91dChhZGRyLHZhbCkgb3V0Yih2YWwsYWRkcikKICNkZWZpbmUgYnl0ZWluKGFkZHIpIGluYihhZGRyKQpAQCAtMTYyLDcgKzE2Miw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19peDFtaWNybyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaWYgKGNzLT5ody5peDEuY2ZnX3JlZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9qYWRlLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZS5jCmluZGV4IGYwNWQ1MjcuLjM2M2FlMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9qYWRlLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L2phZGUuYwpAQCAtNzQsNyArNzQsNyBAQAogCiAKIAotdm9pZAorc3RhdGljIHZvaWQKIG1vZGVqYWRlKHN0cnVjdCBCQ1N0YXRlICpiY3MsIGludCBtb2RlLCBpbnQgYmMpCiB7CiAgICAgc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzID0gYmNzLT5jczsKQEAgLTE5MCw3ICsxOTAsNyBAQAogICAgIH0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGNsb3NlX2phZGVzdGF0ZShzdHJ1Y3QgQkNTdGF0ZSAqYmNzKQogewogICAgIG1vZGVqYWRlKGJjcywgMCwgYmNzLT5jaGFubmVsKTsKQEAgLTI0Myw3ICsyNDMsNyBAQAogfQogCiAKLWludAorc3RhdGljIGludAogc2V0c3RhY2tfamFkZShzdHJ1Y3QgUFN0YWNrICpzdCwgc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAliY3MtPmNoYW5uZWwgPSBzdC0+bDEuYmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZS5oIGIvZHJpdmVycy9pc2RuL2hpc2F4L2phZGUuaAppbmRleCBmYTI5NDQ0Li4yOTA1NWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvamFkZS5oCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9qYWRlLmgKQEAgLTEyOCw3ICsxMjgsNiBAQAogI2RlZmluZQlqYWRlX1RYQVVESU9DSDJDRkcJCQkJMHgxQQogCiBleHRlcm4gaW50IEphZGVWZXJzaW9uKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcywgY2hhciAqcyk7Ci1leHRlcm4gdm9pZCBtb2RlamFkZShzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCBpbnQgbW9kZSwgaW50IGJjKTsKIGV4dGVybiB2b2lkIGNsZWFyX3BlbmRpbmdfamFkZV9pbnRzKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcyk7CiBleHRlcm4gdm9pZCBpbml0amFkZShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvbDNfMXRyNi5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L2wzXzF0cjYuYwppbmRleCBkNmMxYzhmLi5jNWMzNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvbDNfMXRyNi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9sM18xdHI2LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiBleHRlcm4gY2hhciAqSGlTYXhfZ2V0cmV2KGNvbnN0IGNoYXIgKnJldmlzaW9uKTsKLWNvbnN0IGNoYXIgKmwzXzF0cjZfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjE1LjIuMyAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpsM18xdHI2X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4xNS4yLjMgJCI7CiAKICNkZWZpbmUgTXNnSGVhZChwdHIsIGNyZWYsIG10eSwgZGlzKSBcCiAJKnB0cisrID0gZGlzOyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvbDNkc3MxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbDNkc3MxLmMKaW5kZXggZWM5MjMwOC4uYTZkMmFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2wzZHNzMS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9sM2RzczEuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCiBleHRlcm4gY2hhciAqSGlTYXhfZ2V0cmV2KGNvbnN0IGNoYXIgKnJldmlzaW9uKTsKLWNvbnN0IGNoYXIgKmRzczFfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjMyLjIuMyAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpkc3MxX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4zMi4yLjMgJCI7CiAKICNkZWZpbmUgRVhUX0JFQVJFUl9DQVBTIDEKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2wzbmkxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbDNuaTEuYwppbmRleCAzYWIzYTU0Li5mNzA0MWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvbDNuaTEuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbDNuaTEuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAKIGV4dGVybiBjaGFyICpIaVNheF9nZXRyZXYoY29uc3QgY2hhciAqcmV2aXNpb24pOwotY29uc3QgY2hhciAqbmkxX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi44LjIuMyAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpuaTFfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjguMi4zICQiOwogCiAjZGVmaW5lIEVYVF9CRUFSRVJfQ0FQUyAxCiAKQEAgLTI2NjUsNyArMjY2NSw3IEBACiAJbDNuaTFfU2VuZFNwaWQoIHBjLCBwciwgYXJnLCAyMCApOwogfQogCi12b2lkIGwzbmkxX3NwaWRfZXBpZCggc3RydWN0IGwzX3Byb2Nlc3MgKnBjLCB1X2NoYXIgcHIsIHZvaWQgKmFyZyApCitzdGF0aWMgdm9pZCBsM25pMV9zcGlkX2VwaWQoIHN0cnVjdCBsM19wcm9jZXNzICpwYywgdV9jaGFyIHByLCB2b2lkICphcmcgKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBhcmc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9taWMuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9taWMuYwppbmRleCAzYWM0NDg0Li5mZTExZjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvbWljLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L21pYy5jCkBAIC0xOCw3ICsxOCw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwogCi1jb25zdCBjaGFyICptaWNfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjEyLjIuNCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICptaWNfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjEyLjIuNCAkIjsKIAogI2RlZmluZSBieXRlb3V0KGFkZHIsdmFsKSBvdXRiKHZhbCxhZGRyKQogI2RlZmluZSBieXRlaW4oYWRkcikgaW5iKGFkZHIpCkBAIC0xNTcsNyArMTU3LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNlX2lvX21pYyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaW50IGJ5dGVjbnQgPSA4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L25ldGpldC5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L25ldGpldC5jCmluZGV4IGZlNjFkMjYuLjk0ZGEwM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9uZXRqZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbmV0amV0LmMKQEAgLTI1LDggKzI1LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJuZXRqZXQuaCIKIAotY29uc3QgY2hhciAqTkVUamV0X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4yOS4yLjQgJCI7Ci0KIC8qIEludGVyZmFjZSBmdW5jdGlvbnMgKi8KIAogdV9jaGFyCkBAIC02Niw3ICs2NCw3IEBACiAJb3V0c2IoY3MtPmh3Lm5qZXQuaXNhYywgZGF0YSwgc2l6ZSk7CiB9CiAKLXZvaWQgZmlsbF9tZW0oc3RydWN0IEJDU3RhdGUgKmJjcywgdV9pbnQgKnBvcywgdV9pbnQgY250LCBpbnQgY2hhbiwgdV9jaGFyIGZpbGwpCitzdGF0aWMgdm9pZCBmaWxsX21lbShzdHJ1Y3QgQkNTdGF0ZSAqYmNzLCB1X2ludCAqcG9zLCB1X2ludCBjbnQsIGludCBjaGFuLCB1X2NoYXIgZmlsbCkKIHsKIAl1X2ludCBtYXNrPTB4MDAwMDAwZmYsIHZhbCA9IDAsICpwPXBvczsKIAl1X2ludCBpOwpAQCAtODUsNyArODMsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG1vZGVfdGlnZXIoc3RydWN0IEJDU3RhdGUgKmJjcywgaW50IG1vZGUsIGludCBiYykKIHsKIAlzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MgPSBiY3MtPmNzOwpAQCAtODUyLDcgKzg1MCw3IEBACiB9CiAKIAotdm9pZAorc3RhdGljIHZvaWQKIGNsb3NlX3RpZ2Vyc3RhdGUoc3RydWN0IEJDU3RhdGUgKmJjcykKIHsKIAltb2RlX3RpZ2VyKGJjcywgMCwgYmNzLT5jaGFubmVsKTsKQEAgLTkwMCw3ICs4OTgsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLWludAorc3RhdGljIGludAogc2V0c3RhY2tfdGlnZXIoc3RydWN0IFBTdGFjayAqc3QsIHN0cnVjdCBCQ1N0YXRlICpiY3MpCiB7CiAJYmNzLT5jaGFubmVsID0gc3QtPmwxLmJjOwpAQCAtOTY2LDcgKzk2NCw3IEBACiAJY3MtPmJjc1sxXS5CQ19DbG9zZSA9IGNsb3NlX3RpZ2Vyc3RhdGU7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNldGlnZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCWlmIChjcy0+YmNzWzBdLmh3LnRpZ2VyLnNlbmQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9uaWNjeS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L25pY2N5LmMKaW5kZXggY2Y3N2Q4My4uNjhhMjE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L25pY2N5LmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L25pY2N5LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pc2FwbnAuaD4KIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107Ci1jb25zdCBjaGFyICpuaWNjeV9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuMjEuMi40ICQiOworc3RhdGljIGNvbnN0IGNoYXIgKm5pY2N5X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4yMS4yLjQgJCI7CiAKICNkZWZpbmUgYnl0ZW91dChhZGRyLHZhbCkgb3V0Yih2YWwsYWRkcikKICNkZWZpbmUgYnl0ZWluKGFkZHIpIGluYihhZGRyKQpAQCAtMTc4LDcgKzE3OCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19uaWNjeShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaWYgKGNzLT5zdWJ0eXAgPT0gTklDQ1lfUENJKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvbmpfcy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L25qX3MuYwppbmRleCBmZDY2NDY5Li5hN2QzY2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvbmpfcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9ual9zLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcHBfZGVmcy5oPgogI2luY2x1ZGUgIm5ldGpldC5oIgogCi1jb25zdCBjaGFyICpORVRqZXRfU19yZXZpc2lvbiA9ICIkUmV2aXNpb246IDIuMTMuMi40ICQiOworc3RhdGljIGNvbnN0IGNoYXIgKk5FVGpldF9TX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4xMy4yLjQgJCI7CiAKIHN0YXRpYyB1X2NoYXIgZHVtbXlycihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MsIGludCBjaGFuLCB1X2NoYXIgb2ZmKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L25qX3UuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9ual91LmMKaW5kZXggM2Q2NDQxZS4uMWFlN2NhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L25qX3UuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvbmpfdS5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KICNpbmNsdWRlICJuZXRqZXQuaCIKIAotY29uc3QgY2hhciAqTkVUamV0X1VfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjE0LjIuMyAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpORVRqZXRfVV9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDIuMTQuMi4zICQiOwogCiBzdGF0aWMgdV9jaGFyIGR1bW15cnIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgY2hhbiwgdV9jaGFyIG9mZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvcTkzMS5jCmluZGV4IDE3MGZjZDQuLmFiZWNhYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9xOTMxLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3E5MzEuYwpAQCAtNTE2LDcgKzUxNiw3IEBACiAJe0NBVVNFX1VzZXJJbmZvRGlzY2FyZGVkLCAiVXNlciBJbmZvIERpc2NhcmRlZCJ9CiB9OwogCi1pbnQgY2F1c2VfMXRyNl9sZW4gPSAoc2l6ZW9mKGNhdXNlXzF0cjYpIC8gc2l6ZW9mKHN0cnVjdCBNZXNzYWdlVHlwZSkpOworc3RhdGljIGludCBjYXVzZV8xdHI2X2xlbiA9IChzaXplb2YoY2F1c2VfMXRyNikgLyBzaXplb2Yoc3RydWN0IE1lc3NhZ2VUeXBlKSk7CiAKIHN0YXRpYyBpbnQKIHByY2F1c2VfMXRyNihjaGFyICpkZXN0LCB1X2NoYXIgKiBwKQpAQCAtOTM1LDcgKzkzNSw3IEBACiAJcmV0dXJuIChkcCAtIGRlc3QpOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHByZmFjaWxpdHkoY2hhciAqZGVzdCwgdV9jaGFyICogcCkKIHsKIAljaGFyICpkcCA9IGRlc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvczBib3guYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zMGJveC5jCmluZGV4IGYzYzQ4MTMuLjdiNjMwODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zMGJveC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zMGJveC5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAiaXNkbmwxLmgiCiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwotY29uc3QgY2hhciAqczBib3hfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjYuMi40ICQiOworc3RhdGljIGNvbnN0IGNoYXIgKnMwYm94X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi42LjIuNCAkIjsKIAogc3RhdGljIGlubGluZSB2b2lkCiB3cml0ZXJlZyh1bnNpZ25lZCBpbnQgcGFkciwgc2lnbmVkIGludCBhZGRyLCB1X2NoYXIgb2ZmLCB1X2NoYXIgdmFsKSB7CkBAIC0xODMsNyArMTgzLDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNlX2lvX3MwYm94KHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlyZWxlYXNlX3JlZ2lvbihjcy0+aHcudGVsZXMzLmNmZ19yZWcsIDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NhcGhpci5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NhcGhpci5jCmluZGV4IDllNmQzZDYuLjgyMTc3NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zYXBoaXIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2FwaGlyLmMKQEAgLTE3MSw3ICsxNzEsNyBAQAogCW1vZF90aW1lcigmY3MtPmh3LnNhcGhpci50aW1lciwgamlmZmllcysxKkhaKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHJlbGVhc2VfaW9fc2FwaGlyKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAlieXRlb3V0KGNzLT5ody5zYXBoaXIuY2ZnX3JlZyArIElSUV9SRUcsIDB4ZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlci5jCmluZGV4IDgzOTBmMTYuLjhjMDQ0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyLmMKQEAgLTUxLDkgKzUxLDkgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107CiAKLWNvbnN0IGNoYXIgKlNlZGxiYXVlcl9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuMzQuMi42ICQiOworc3RhdGljIGNvbnN0IGNoYXIgKlNlZGxiYXVlcl9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuMzQuMi42ICQiOwogCi1jb25zdCBjaGFyICpTZWRsYmF1ZXJfVHlwZXNbXSA9CitzdGF0aWMgY29uc3QgY2hhciAqU2VkbGJhdWVyX1R5cGVzW10gPQogCXsiTm9uZSIsICJzcGVlZCBjYXJkL3dpbiIsICJzcGVlZCBzdGFyIiwgInNwZWVkIGZheCsiLAogCSJzcGVlZCB3aW4gSUkgLyBJU0ROIFBDLzEwNCIsICJzcGVlZCBzdGFyIElJIiwgInNwZWVkIHBjaSIsCiAJInNwZWVkIGZheCsgcHlyYW1pZCIsICJzcGVlZCBmYXgrIHBjaSIsICJIU1QgU2FwaGlyIElJSSJ9OwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19zZWRsYmF1ZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCWludCBieXRlY250ID0gODsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zZWRsYmF1ZXJfY3MuYwppbmRleCA0NDk2NTEyLi5jNmI1YmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc2VkbGJhdWVyX2NzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3NlZGxiYXVlcl9jcy5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMjYsMTEgKzIyNSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZzZWRsYmF1ZXJfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC02MTYsMTMgKzYxMCwyNyBAQAogICAgIHJldHVybiAwOwogfSAvKiBzZWRsYmF1ZXJfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNlZGxiYXVlcl9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjM0KCJTRURMQkFVRVIiLCAic3BlZWQgc3RhciBJSSIsICJWIDMuMSIsICIoYykgOTMgLSA5OCBjYiAiLCAweDgxZmI3OWY1LCAweGYzNjEyZTFkLCAweDZiOTVjNzhhLCAweDUwZDQxNDljKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlNFRExCQVVFUiIsICJJU0ROLUFkYXB0ZXIiLCAiNEQ2NyIsIDB4ODFmYjc5ZjUsIDB4ZTRlOWJjMTIsIDB4Mzk3YjdlOTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiU0VETEJBVUVSIiwgIklTRE4tQWRhcHRlciIsICI0RDk4IiwgMHg4MWZiNzlmNSwgMHhlNGU5YmMxMiwgMHgyZTVjN2ZjZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJTRURMQkFVRVIiLCAiSVNETi1BZGFwdGVyIiwgIiAoQykgOTMtOTQgVksiLCAweDgxZmI3OWY1LCAweGU0ZTliYzEyLCAweDhkYjE0M2ZlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIlNFRExCQVVFUiIsICJJU0ROLUFkYXB0ZXIiLCAiIChjKSA5My05NSBWSyIsIDB4ODFmYjc5ZjUsIDB4ZTRlOWJjMTIsIDB4YjM5MWFiNGMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJIU1QgSGlnaCBTb2Z0IFRlY2ggR21iSCIsICJTYXBoaXIgSUkgQiIsIDB4ZDc5ZTBiODQsIDB4MjFkMDgzYWUpLAorLyoJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCgiU0VETEJBVUVSIiwgMHg4MWZiNzlmNSksICovIC8qIHRvbyBnZW5lcmljKi8KKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgc2VkbGJhdWVyX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBzZWRsYmF1ZXJfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAic2VkbGJhdWVyX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gc2VkbGJhdWVyX2F0dGFjaCwKKwkuZXZlbnQJCT0gc2VkbGJhdWVyX2V2ZW50LAogCS5kZXRhY2gJCT0gc2VkbGJhdWVyX2RldGFjaCwKKwkuaWRfdGFibGUJPSBzZWRsYmF1ZXJfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9zZWRsYmF1ZXJfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zcG9ydHN0ZXIuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zcG9ydHN0ZXIuYwppbmRleCAxMzI4NDBiLi5jZGYzNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3BvcnRzdGVyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3Nwb3J0c3Rlci5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSAiaXNkbmwxLmgiCiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwotY29uc3QgY2hhciAqc3BvcnRzdGVyX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4xNi4yLjQgJCI7CitzdGF0aWMgY29uc3QgY2hhciAqc3BvcnRzdGVyX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4xNi4yLjQgJCI7CiAKICNkZWZpbmUgYnl0ZW91dChhZGRyLHZhbCkgb3V0Yih2YWwsYWRkcikKICNkZWZpbmUgYnl0ZWluKGFkZHIpIGluYihhZGRyKQpAQCAtMTMyLDcgKzEzMiw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb19zcG9ydHN0ZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCWludCBpLCBhZHI7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAl9CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZXNldF9zcG9ydHN0ZXIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzKQogewogCWNzLT5ody5zcHQucmVzX2lycSB8PSBTUE9SVFNURVJfUkVTRVQ7IC8qIFJlc2V0IE9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxLmggYi9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxLmgKaW5kZXggZTgxNzdiMC4uMGZkYTVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3N0NTQ4MS5oCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODEuaApAQCAtNDUwLDEyICs0NTAsOCBAQAogCQkJICAgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpOwogdm9pZCBzdDU0ODFfcmVsZWFzZV9pc29jcGlwZXMoc3RydWN0IHVyYiogdXJiWzJdKTsKIAotaW50ICBzdDU0ODFfaXNvY19mbGF0dGVuKHN0cnVjdCB1cmIgKnVyYik7CiB2b2lkIHN0NTQ4MV91c2JfcGlwZV9yZXNldChzdHJ1Y3Qgc3Q1NDgxX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCSAgICB1X2NoYXIgcGlwZSwgY3RybF9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KTsKLXZvaWQgc3Q1NDgxX3VzYl9jdHJsX21zZyhzdHJ1Y3Qgc3Q1NDgxX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgdTggcmVxdWVzdCwgdTggcmVxdWVzdHR5cGUsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgIGN0cmxfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCk7CiB2b2lkIHN0NTQ4MV91c2JfZGV2aWNlX2N0cmxfbXNnKHN0cnVjdCBzdDU0ODFfYWRhcHRlciAqYWRhcHRlciwKIAkJCSB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsCiAJCQkgY3RybF9jb21wbGV0ZV90IGNvbXBsZXRlLCB2b2lkICpjb250ZXh0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfaGRsYy5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3N0NTQ4MV9oZGxjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGY0MmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3N0NTQ4MV9oZGxjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODAgKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgU1Q1NDgxIFVTQiBJU0ROIG1vZGVtCi0gKgotICogQXV0aG9yICAgICAgIEZyb2RlIElzYWtzZW4KLSAqIENvcHlyaWdodCAgICAyMDAxIGJ5IEZyb2RlIElzYWtzZW4gICAgICA8ZmlzYWtzZW5AYmV3YW4uY29tPgotICogICAgICAgICAgICAgIDIwMDEgYnkgS2FpIEdlcm1hc2NoZXdza2kgIDxrYWkuZ2VybWFzY2hld3NraUBnbXguZGU+Ci0gKiAKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KLSNpbmNsdWRlICJzdDU0ODFfaGRsYy5oIgotCi0KLWVudW0gewotCUhETENfRkFTVF9JRExFLEhETENfR0VUX0ZMQUdfQjAsSERMQ19HRVRGTEFHX0IxQTYsSERMQ19HRVRGTEFHX0I3LAotCUhETENfR0VUX0RBVEEsSERMQ19GQVNUX0ZMQUcKLX07Ci0KLWVudW0gewotCUhETENfU0VORF9EQVRBLEhETENfU0VORF9DUkMxLEhETENfU0VORF9GQVNUX0ZMQUcsCi0JSERMQ19TRU5EX0ZJUlNUX0ZMQUcsSERMQ19TRU5EX0NSQzIsSERMQ19TRU5EX0NMT1NJTkdfRkxBRywKLQlIRExDX1NFTkRfSURMRTEsSERMQ19TRU5EX0ZBU1RfSURMRSxIRExDX1NFTkRGTEFHX0IwLAotCUhETENfU0VOREZMQUdfQjFBNixIRExDX1NFTkRGTEFHX0I3LFNUT1BQRUQKLX07Ci0KLXZvaWQgCi1oZGxjX3Jjdl9pbml0KHN0cnVjdCBoZGxjX3ZhcnMgKmhkbGMsIGludCBkb19hZGFwdDU2KQotewotICAgCWhkbGMtPmJpdF9zaGlmdCA9IDA7Ci0JaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JaGRsYy0+ZGF0YV9iaXRzID0gMDsKLQloZGxjLT5mZmJpdF9zaGlmdCA9IDA7Ci0JaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDA7Ci0JaGRsYy0+c3RhdGUgPSBIRExDX0dFVF9EQVRBOwotCWhkbGMtPmRvX2FkYXB0NTYgPSBkb19hZGFwdDU2OwotCWhkbGMtPmRjaGFubmVsID0gMDsKLQloZGxjLT5jcmMgPSAwOwotCWhkbGMtPmNiaW4gPSAwOwotCWhkbGMtPnNoaWZ0X3JlZyA9IDA7Ci0JaGRsYy0+ZmZ2YWx1ZSA9IDA7Ci0JaGRsYy0+ZHN0cG9zID0gMDsKLX0KLQotdm9pZCAKLWhkbGNfb3V0X2luaXQoc3RydWN0IGhkbGNfdmFycyAqaGRsYywgaW50IGlzX2RfY2hhbm5lbCwgaW50IGRvX2FkYXB0NTYpCi17Ci0gICAJaGRsYy0+Yml0X3NoaWZ0ID0gMDsKLQloZGxjLT5oZGxjX2JpdHMxID0gMDsKLQloZGxjLT5kYXRhX2JpdHMgPSAwOwotCWhkbGMtPmZmYml0X3NoaWZ0ID0gMDsKLQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMDsKLQloZGxjLT5kb19jbG9zaW5nID0gMDsKLQloZGxjLT5mZnZhbHVlID0gMDsKLQlpZiAoaXNfZF9jaGFubmVsKSB7Ci0JCWhkbGMtPmRjaGFubmVsID0gMTsKLQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfRklSU1RfRkxBRzsKLQl9IGVsc2UgewotCQloZGxjLT5kY2hhbm5lbCA9IDA7Ci0JCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZBU1RfRkxBRzsKLQkJaGRsYy0+ZmZ2YWx1ZSA9IDB4N2U7Ci0JfSAKLQloZGxjLT5jYmluID0gMHg3ZTsKLQloZGxjLT5iaXRfc2hpZnQgPSAwOwotCWlmKGRvX2FkYXB0NTYpewotCQloZGxjLT5kb19hZGFwdDU2ID0gMTsJCQotCQloZGxjLT5kYXRhX2JpdHMgPSAwOwotCQloZGxjLT5zdGF0ZSA9IEhETENfU0VOREZMQUdfQjA7Ci0JfSBlbHNlIHsKLQkJaGRsYy0+ZG9fYWRhcHQ1NiA9IDA7CQkKLQkJaGRsYy0+ZGF0YV9iaXRzID0gODsKLQl9Ci0JaGRsYy0+c2hpZnRfcmVnID0gMDsKLX0KLQotLyoKLSAgaGRsY19kZWNvZGUgLSBkZWNvZGVzIEhETEMgZnJhbWVzIGZyb20gYSB0cmFuc3BhcmVudCBiaXQgc3RyZWFtLgotCi0gIFRoZSBzb3VyY2UgYnVmZmVyIGlzIHNjYW5uZWQgZm9yIHZhbGlkIEhETEMgZnJhbWVzIGxvb2tpbmcgZm9yCi0gIGZsYWdzICgwMTExMTExMCkgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgZnJhbWUuIElmIHRoZSBzdGFydCBvZgotICB0aGUgZnJhbWUgaXMgZm91bmQsIHRoZSBiaXQgc3R1ZmZpbmcgaXMgcmVtb3ZlZCAoMCBhZnRlciA1IDEncykuCi0gIFdoZW4gYSBuZXcgZmxhZyBpcyBmb3VuZCwgdGhlIGNvbXBsZXRlIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkCi0gIGFuZCB0aGUgQ1JDIGlzIGNoZWNrZWQuCi0gIElmIGEgdmFsaWQgZnJhbWUgaXMgZm91bmQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmcmFtZSBsZW5ndGggCi0gIGV4Y2x1ZGluZyB0aGUgQ1JDIHdpdGggdGhlIGJpdCBIRExDX0VORF9PRl9GUkFNRSBzZXQuCi0gIElmIHRoZSBiZWdpbm5pbmcgb2YgYSB2YWxpZCBmcmFtZSBpcyBmb3VuZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMKLSAgdGhlIGxlbmd0aC4gCi0gIElmIGEgZnJhbWluZyBlcnJvciBpcyBmb3VuZCAodG9vIG1hbnkgMXMgYW5kIG5vdCBhIGZsYWcpIHRoZSBmdW5jdGlvbiAKLSAgcmV0dXJucyB0aGUgbGVuZ3RoIHdpdGggdGhlIGJpdCBIRExDX0ZSQU1JTkdfRVJST1Igc2V0LgotICBJZiBhIENSQyBlcnJvciBpcyBmb3VuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIHdpdGggdGhlCi0gIGJpdCBIRExDX0NSQ19FUlJPUiBzZXQuCi0gIElmIHRoZSBmcmFtZSBsZW5ndGggZXhjZWVkcyB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHNpemUsIHRoZSBmdW5jdGlvbgotICByZXR1cm5zIHRoZSBsZW5ndGggd2l0aCB0aGUgYml0IEhETENfTEVOR1RIX0VSUk9SIHNldC4KLQotICBzcmMgLSBzb3VyY2UgYnVmZmVyCi0gIHNsZW4gLSBzb3VyY2UgYnVmZmVyIGxlbmd0aAotICBjb3VudCAtIG51bWJlciBvZiBieXRlcyByZW1vdmVkIChkZWNvZGVkKSBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyCi0gIGRzdCBfIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICBkc2l6ZSAtIGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplCi0gIHJldHVybnMgLSBudW1iZXIgb2YgZGVjb2RlZCBieXRlcyBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGFuZCBzdGF0dXMKLSAgZmxhZy4KLSAqLwotaW50IGhkbGNfZGVjb2RlKHN0cnVjdCBoZGxjX3ZhcnMgKmhkbGMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKLQkJaW50IHNsZW4sIGludCAqY291bnQsIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzaXplKQotewotCWludCBzdGF0dXM9MDsKLQotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZhc3RfZmxhZ1tdPXsKLQkJMHgwMCwweDAwLDB4MDAsMHgyMCwweDMwLDB4MzgsMHgzYywweDNlLDB4M2YKLQl9OwotCi0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmFzdF9mbGFnX3ZhbHVlW109ewotCQkweDAwLDB4N2UsMHhmYywweGY5LDB4ZjMsMHhlNywweGNmLDB4OWYsMHgzZgotCX07Ci0KLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmYXN0X2Fib3J0W109ewotCQkweDAwLDB4MDAsMHg4MCwweGMwLDB4ZTAsMHhmMCwweGY4LDB4ZmMsMHhmZSwweGZmCi0JfTsKLQotCSpjb3VudCA9IHNsZW47Ci0KLQl3aGlsZShzbGVuID4gMCl7Ci0JCWlmKGhkbGMtPmJpdF9zaGlmdD09MCl7Ci0JCQloZGxjLT5jYmluID0gKnNyYysrOwotCQkJc2xlbi0tOwotCQkJaGRsYy0+Yml0X3NoaWZ0ID0gODsKLQkJCWlmKGhkbGMtPmRvX2FkYXB0NTYpewotCQkJCWhkbGMtPmJpdF9zaGlmdCAtLTsKLQkJCX0KLQkJfQotCi0JCXN3aXRjaChoZGxjLT5zdGF0ZSl7Ci0JCWNhc2UgU1RPUFBFRDoKLQkJCXJldHVybiAwOwotCQljYXNlIEhETENfRkFTVF9JRExFOgotCQkJaWYoaGRsYy0+Y2JpbiA9PSAweGZmKXsKLQkJCQloZGxjLT5iaXRfc2hpZnQgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaGRsYy0+c3RhdGUgPSBIRExDX0dFVF9GTEFHX0IwOwotCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQloZGxjLT5iaXRfc2hpZnQgPSA4OwotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19HRVRfRkxBR19CMDoKLQkJCWlmKCEoaGRsYy0+Y2JpbiAmIDB4ODApKSB7Ci0JCQkJaGRsYy0+c3RhdGUgPSBIRExDX0dFVEZMQUdfQjFBNjsKLQkJCQloZGxjLT5oZGxjX2JpdHMxID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYoIWhkbGMtPmRvX2FkYXB0NTYpewotCQkJCQlpZigrK2hkbGMtPmhkbGNfYml0czEgPj04ICkgaWYoaGRsYy0+Yml0X3NoaWZ0PT0xKQotCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0ZBU1RfSURMRTsKLQkJCQl9Ci0JCQl9Ci0JCQloZGxjLT5jYmluPDw9MTsKLQkJCWhkbGMtPmJpdF9zaGlmdCAtLTsKLQkJCWJyZWFrOwotCQljYXNlIEhETENfR0VURkxBR19CMUE2OgotCQkJaWYoaGRsYy0+Y2JpbiAmIDB4ODApewotCQkJCWhkbGMtPmhkbGNfYml0czErKzsKLQkJCQlpZihoZGxjLT5oZGxjX2JpdHMxPT02KXsKLQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0dFVEZMQUdfQjc7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQloZGxjLT5oZGxjX2JpdHMxID0gMDsKLQkJCX0KLQkJCWhkbGMtPmNiaW48PD0xOwotCQkJaGRsYy0+Yml0X3NoaWZ0IC0tOwotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19HRVRGTEFHX0I3OgotCQkJaWYoaGRsYy0+Y2JpbiAmIDB4ODApIHsKLQkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0ZMQUdfQjA7Ci0JCQl9IGVsc2UgewotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19HRVRfREFUQTsKLQkJCQloZGxjLT5jcmMgPSAweGZmZmY7Ci0JCQkJaGRsYy0+c2hpZnRfcmVnID0gMDsKLQkJCQloZGxjLT5oZGxjX2JpdHMxID0gMDsKLQkJCQloZGxjLT5kYXRhX2JpdHMgPSAwOwotCQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAwOwotCQkJfQotCQkJaGRsYy0+Y2Jpbjw8PTE7Ci0JCQloZGxjLT5iaXRfc2hpZnQgLS07Ci0JCQlicmVhazsKLQkJY2FzZSBIRExDX0dFVF9EQVRBOgotCQkJaWYoaGRsYy0+Y2JpbiAmIDB4ODApewotCQkJCWhkbGMtPmhkbGNfYml0czErKzsKLQkJCQlzd2l0Y2goaGRsYy0+aGRsY19iaXRzMSl7Ci0JCQkJY2FzZSA2OgotCQkJCQlicmVhazsKLQkJCQljYXNlIDc6Ci0JCQkJCWlmKGhkbGMtPmRhdGFfcmVjZWl2ZWQpIHsKLQkJCQkJCS8vIGJhZCBmcmFtZQotCQkJCQkJc3RhdHVzID0gLUhETENfRlJBTUlOR19FUlJPUjsKLQkJCQkJfQotCQkJCQlpZighaGRsYy0+ZG9fYWRhcHQ1Nil7Ci0JCQkJCQlpZihoZGxjLT5jYmluPT1mYXN0X2Fib3J0W2hkbGMtPmJpdF9zaGlmdCsxXSl7Ci0JCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0ZBU1RfSURMRTsKLQkJCQkJCQloZGxjLT5iaXRfc2hpZnQ9MTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19HRVRfRkxBR19CMDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQloZGxjLT5zaGlmdF9yZWc+Pj0xOwotCQkJCQloZGxjLT5zaGlmdF9yZWcgfD0gMHg4MDsKLQkJCQkJaGRsYy0+ZGF0YV9iaXRzKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoKGhkbGMtPmhkbGNfYml0czEpewotCQkJCWNhc2UgNToKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2OgotCQkJCQlpZihoZGxjLT5kYXRhX3JlY2VpdmVkKXsKLQkJCQkJCWlmIChoZGxjLT5kc3Rwb3MgPCAyKSB7Ci0JCQkJCQkJc3RhdHVzID0gLUhETENfRlJBTUlOR19FUlJPUjsKLQkJCQkJCX0gZWxzZSBpZiAoaGRsYy0+Y3JjICE9IDB4ZjBiOCl7Ci0JCQkJCQkJLy8gY3JjIGVycm9yCi0JCQkJCQkJc3RhdHVzID0gLUhETENfQ1JDX0VSUk9SOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyByZW1vdmUgQ1JDCi0JCQkJCQkJaGRsYy0+ZHN0cG9zIC09IDI7Ci0JCQkJCQkJLy8gZ29vZCBmcmFtZQotCQkJCQkJCXN0YXR1cyA9IGhkbGMtPmRzdHBvczsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQloZGxjLT5jcmMgPSAweGZmZmY7Ci0JCQkJCWhkbGMtPnNoaWZ0X3JlZyA9IDA7Ci0JCQkJCWhkbGMtPmRhdGFfYml0cyA9IDA7Ci0JCQkJCWlmKCFoZGxjLT5kb19hZGFwdDU2KXsKLQkJCQkJCWlmKGhkbGMtPmNiaW49PWZhc3RfZmxhZ1toZGxjLT5iaXRfc2hpZnRdKXsKLQkJCQkJCQloZGxjLT5mZnZhbHVlID0gZmFzdF9mbGFnX3ZhbHVlW2hkbGMtPmJpdF9zaGlmdF07Ci0JCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0ZBU1RfRkxBRzsKLQkJCQkJCQloZGxjLT5mZmJpdF9zaGlmdCA9IGhkbGMtPmJpdF9zaGlmdDsKLQkJCQkJCQloZGxjLT5iaXRfc2hpZnQgPSAxOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0RBVEE7Ci0JCQkJCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0RBVEE7Ci0JCQkJCQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQloZGxjLT5zaGlmdF9yZWc+Pj0xOwotCQkJCQloZGxjLT5kYXRhX2JpdHMrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwotCQkJfQotCQkJaWYgKHN0YXR1cykgewotCQkJCWhkbGMtPmRzdHBvcyA9IDA7Ci0JCQkJKmNvdW50IC09IHNsZW47Ci0JCQkJaGRsYy0+Y2JpbiA8PD0gMTsKLQkJCQloZGxjLT5iaXRfc2hpZnQtLTsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQkJaWYoaGRsYy0+ZGF0YV9iaXRzPT04KXsKLQkJCQloZGxjLT5kYXRhX2JpdHMgPSAwOwotCQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAxOwotCQkJCWhkbGMtPmNyYyA9IGNyY19jY2l0dF9ieXRlKGhkbGMtPmNyYywgaGRsYy0+c2hpZnRfcmVnKTsKLQotCQkJCS8vIGdvb2QgYnl0ZSByZWNlaXZlZAotCQkJCWlmIChkc2l6ZS0tKSB7Ci0JCQkJCWRzdFtoZGxjLT5kc3Rwb3MrK10gPSBoZGxjLT5zaGlmdF9yZWc7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZnJhbWUgdG9vIGxvbmcKLQkJCQkJc3RhdHVzID0gLUhETENfTEVOR1RIX0VSUk9SOwotCQkJCQloZGxjLT5kc3Rwb3MgPSAwOwotCQkJCX0KLQkJCX0KLQkJCWhkbGMtPmNiaW4gPDw9IDE7Ci0JCQloZGxjLT5iaXRfc2hpZnQtLTsKLQkJCWJyZWFrOwotCQljYXNlIEhETENfRkFTVF9GTEFHOgotCQkJaWYoaGRsYy0+Y2Jpbj09aGRsYy0+ZmZ2YWx1ZSl7Ci0JCQkJaGRsYy0+Yml0X3NoaWZ0ID0gMDsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYoaGRsYy0+Y2JpbiA9PSAweGZmKXsKLQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0ZBU1RfSURMRTsKLQkJCQkJaGRsYy0+Yml0X3NoaWZ0PTA7Ci0JCQkJfSBlbHNlIGlmKGhkbGMtPmZmYml0X3NoaWZ0PT04KXsKLQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0dFVEZMQUdfQjc7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhkbGMtPnNoaWZ0X3JlZyA9IGZhc3RfYWJvcnRbaGRsYy0+ZmZiaXRfc2hpZnQtMV07Ci0JCQkJCWhkbGMtPmhkbGNfYml0czEgPSBoZGxjLT5mZmJpdF9zaGlmdC0yOwotCQkJCQlpZihoZGxjLT5oZGxjX2JpdHMxPDApaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQkJCWhkbGMtPmRhdGFfYml0cyA9IGhkbGMtPmZmYml0X3NoaWZ0LTE7Ci0JCQkJCWhkbGMtPnN0YXRlID0gSERMQ19HRVRfREFUQTsKLQkJCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDA7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQkqY291bnQgLT0gc2xlbjsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAgaGRsY19lbmNvZGUgLSBlbmNvZGVzIEhETEMgZnJhbWVzIHRvIGEgdHJhbnNwYXJlbnQgYml0IHN0cmVhbS4KLQotICBUaGUgYml0IHN0cmVhbSBzdGFydHMgd2l0aCBhIGJlZ2lubmluZyBmbGFnICgwMTExMTExMCkuIEFmdGVyCi0gIHRoYXQgZWFjaCBieXRlIGlzIGFkZGVkIHRvIHRoZSBiaXQgc3RyZWFtIHdpdGggYml0IHN0dWZmaW5nIGFkZGVkCi0gICgwIGFmdGVyIDUgMSdzKS4KLSAgV2hlbiB0aGUgbGFzdCBieXRlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciwgdGhlCi0gIENSQyAoMiBieXRlcyBpcyBhZGRlZCkgYW5kIHRoZSBmcmFtZSB0ZXJtaW5hdGVzIHdpdGggdGhlIGVuZGluZyBmbGFnLgotICBGb3IgdGhlIGRjaGFubmVsLCB0aGUgaWRsZSBjaGFyYWN0ZXIgKGFsbCAxJ3MpIGlzIGFsc28gYWRkZWQgYXQgdGhlIGVuZC4KLSAgSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBlbXB0eSBzb3VyY2UgYnVmZmVyIChzbGVuPTApLCBmbGFncyBvcgotICBpZGxlIGNoYXJhY3RlciB3aWxsIGJlIGdlbmVyYXRlZC4KLSAKLSAgc3JjIC0gc291cmNlIGJ1ZmZlcgotICBzbGVuIC0gc291cmNlIGJ1ZmZlciBsZW5ndGgKLSAgY291bnQgLSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCAoZW5jb2RlZCkgZnJvbSBzb3VyY2UgYnVmZmVyCi0gIGRzdCBfIGRlc3RpbmF0aW9uIGJ1ZmZlcgotICBkc2l6ZSAtIGRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplCi0gIHJldHVybnMgLSBudW1iZXIgb2YgZW5jb2RlZCBieXRlcyBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0qLwotaW50IGhkbGNfZW5jb2RlKHN0cnVjdCBoZGxjX3ZhcnMgKmhkbGMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgCi0JCXVuc2lnbmVkIHNob3J0IHNsZW4sIGludCAqY291bnQsCi0JCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzaXplKQotewotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHhmYXN0X2ZsYWdfdmFsdWVbXSA9IHsKLQkJMHg3ZSwweDNmLDB4OWYsMHhjZiwweGU3LDB4ZjMsMHhmOSwweGZjLDB4N2UKLQl9OwotCi0JaW50IGxlbiA9IDA7Ci0KLQkqY291bnQgPSBzbGVuOwotCi0Jd2hpbGUgKGRzaXplID4gMCkgewotCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTApewkKLQkJCWlmKHNsZW4gJiYgIWhkbGMtPmRvX2Nsb3NpbmcpewotCQkJCWhkbGMtPnNoaWZ0X3JlZyA9ICpzcmMrKzsKLQkJCQlzbGVuLS07Ci0JCQkJaWYgKHNsZW4gPT0gMCkgCi0JCQkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAxOyAgLyogY2xvc2luZyBzZXF1ZW5jZSwgQ1JDICsgZmxhZyhzKSAqLwotCQkJCWhkbGMtPmJpdF9zaGlmdCA9IDg7Ci0JCQl9IGVsc2UgewotCQkJCWlmKGhkbGMtPnN0YXRlID09IEhETENfU0VORF9EQVRBKXsKLQkJCQkJaWYoaGRsYy0+ZGF0YV9yZWNlaXZlZCl7Ci0JCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9DUkMxOwotCQkJCQkJaGRsYy0+Y3JjIF49IDB4ZmZmZjsKLQkJCQkJCWhkbGMtPmJpdF9zaGlmdCA9IDg7Ci0JCQkJCQloZGxjLT5zaGlmdF9yZWcgPSBoZGxjLT5jcmMgJiAweGZmOwotCQkJCQl9IGVsc2UgaWYoIWhkbGMtPmRvX2FkYXB0NTYpewotCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfRkFTVF9GTEFHOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRGTEFHX0IwOwotCQkJCQl9Ci0JCQkJfQotCQkJICAKLQkJCX0KLQkJfQotCi0JCXN3aXRjaChoZGxjLT5zdGF0ZSl7Ci0JCWNhc2UgU1RPUFBFRDoKLQkJCXdoaWxlIChkc2l6ZS0tKQotCQkJCSpkc3QrKyA9IDB4ZmY7Ci0JCSAgCi0JCQlyZXR1cm4gZHNpemU7Ci0JCWNhc2UgSERMQ19TRU5EX0ZBU1RfRkxBRzoKLQkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAwOwotCQkJaWYoc2xlbiA9PSAwKXsKLQkJCQkqZHN0KysgPSBoZGxjLT5mZnZhbHVlOwotCQkJCWxlbisrOwotCQkJCWRzaXplLS07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTgpewotCQkJCWhkbGMtPmNiaW4gPSBoZGxjLT5mZnZhbHVlPj4oOC1oZGxjLT5kYXRhX2JpdHMpOwotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0RBVEE7Ci0JCQkJaGRsYy0+Y3JjID0gMHhmZmZmOwotCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwotCQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAxOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19TRU5ERkxBR19CMDoKLQkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAwOwotCQkJaGRsYy0+Y2JpbiA8PD0gMTsKLQkJCWhkbGMtPmRhdGFfYml0cysrOwotCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQloZGxjLT5zdGF0ZSA9IEhETENfU0VOREZMQUdfQjFBNjsKLQkJCWJyZWFrOwotCQljYXNlIEhETENfU0VOREZMQUdfQjFBNjoKLQkJCWhkbGMtPmNiaW4gPDw9IDE7Ci0JCQloZGxjLT5kYXRhX2JpdHMrKzsKLQkJCWhkbGMtPmNiaW4rKzsKLQkJCWlmKCsraGRsYy0+aGRsY19iaXRzMSA9PSA2KQotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5ERkxBR19CNzsKLQkJCWJyZWFrOwotCQljYXNlIEhETENfU0VOREZMQUdfQjc6Ci0JCQloZGxjLT5jYmluIDw8PSAxOwotCQkJaGRsYy0+ZGF0YV9iaXRzKys7Ci0JCQlpZihzbGVuID09IDApewotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5ERkxBR19CMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmKGhkbGMtPmJpdF9zaGlmdD09OCl7Ci0JCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfREFUQTsKLQkJCQloZGxjLT5jcmMgPSAweGZmZmY7Ci0JCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBIRExDX1NFTkRfRklSU1RfRkxBRzoKLQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAxOwotCQkJaWYoaGRsYy0+ZGF0YV9iaXRzPT04KXsKLQkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9EQVRBOwotCQkJCWhkbGMtPmNyYyA9IDB4ZmZmZjsKLQkJCQloZGxjLT5oZGxjX2JpdHMxID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWhkbGMtPmNiaW4gPDw9IDE7Ci0JCQloZGxjLT5kYXRhX2JpdHMrKzsKLQkJCWlmKGhkbGMtPnNoaWZ0X3JlZyAmIDB4MDEpCi0JCQkJaGRsYy0+Y2JpbisrOwotCQkJaGRsYy0+c2hpZnRfcmVnID4+PSAxOwotCQkJaGRsYy0+Yml0X3NoaWZ0LS07Ci0JCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTApewotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0RBVEE7Ci0JCQkJaGRsYy0+Y3JjID0gMHhmZmZmOwotCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19TRU5EX0RBVEE6Ci0JCQloZGxjLT5jYmluIDw8PSAxOwotCQkJaGRsYy0+ZGF0YV9iaXRzKys7Ci0JCQlpZihoZGxjLT5oZGxjX2JpdHMxID09IDUpewotCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaGRsYy0+Yml0X3NoaWZ0PT04KXsKLQkJCQloZGxjLT5jcmMgPSBjcmNfY2NpdHRfYnl0ZShoZGxjLT5jcmMsIGhkbGMtPnNoaWZ0X3JlZyk7Ci0JCQl9Ci0JCQlpZihoZGxjLT5zaGlmdF9yZWcgJiAweDAxKXsKLQkJCQloZGxjLT5oZGxjX2JpdHMxKys7Ci0JCQkJaGRsYy0+Y2JpbisrOwotCQkJCWhkbGMtPnNoaWZ0X3JlZyA+Pj0gMTsKLQkJCQloZGxjLT5iaXRfc2hpZnQtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQkJaGRsYy0+c2hpZnRfcmVnID4+PSAxOwotCQkJCWhkbGMtPmJpdF9zaGlmdC0tOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19TRU5EX0NSQzE6Ci0JCQloZGxjLT5jYmluIDw8PSAxOwotCQkJaGRsYy0+ZGF0YV9iaXRzKys7Ci0JCQlpZihoZGxjLT5oZGxjX2JpdHMxID09IDUpewotCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYoaGRsYy0+c2hpZnRfcmVnICYgMHgwMSl7Ci0JCQkJaGRsYy0+aGRsY19iaXRzMSsrOwotCQkJCWhkbGMtPmNiaW4rKzsKLQkJCQloZGxjLT5zaGlmdF9yZWcgPj49IDE7Ci0JCQkJaGRsYy0+Yml0X3NoaWZ0LS07Ci0JCQl9IGVsc2UgewotCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwotCQkJCWhkbGMtPnNoaWZ0X3JlZyA+Pj0gMTsKLQkJCQloZGxjLT5iaXRfc2hpZnQtLTsKLQkJCX0KLQkJCWlmKGhkbGMtPmJpdF9zaGlmdD09MCl7Ci0JCQkJaGRsYy0+c2hpZnRfcmVnID0gKGhkbGMtPmNyYyA+PiA4KTsKLQkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9DUkMyOwotCQkJCWhkbGMtPmJpdF9zaGlmdCA9IDg7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBIRExDX1NFTkRfQ1JDMjoKLQkJCWhkbGMtPmNiaW4gPDw9IDE7Ci0JCQloZGxjLT5kYXRhX2JpdHMrKzsKLQkJCWlmKGhkbGMtPmhkbGNfYml0czEgPT0gNSl7Ci0JCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihoZGxjLT5zaGlmdF9yZWcgJiAweDAxKXsKLQkJCQloZGxjLT5oZGxjX2JpdHMxKys7Ci0JCQkJaGRsYy0+Y2JpbisrOwotCQkJCWhkbGMtPnNoaWZ0X3JlZyA+Pj0gMTsKLQkJCQloZGxjLT5iaXRfc2hpZnQtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQkJaGRsYy0+c2hpZnRfcmVnID4+PSAxOwotCQkJCWhkbGMtPmJpdF9zaGlmdC0tOwotCQkJfQotCQkJaWYoaGRsYy0+Yml0X3NoaWZ0PT0wKXsKLQkJCQloZGxjLT5zaGlmdF9yZWcgPSAweDdlOwotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0NMT1NJTkdfRkxBRzsKLQkJCQloZGxjLT5iaXRfc2hpZnQgPSA4OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19TRU5EX0NMT1NJTkdfRkxBRzoKLQkJCWhkbGMtPmNiaW4gPDw9IDE7Ci0JCQloZGxjLT5kYXRhX2JpdHMrKzsKLQkJCWlmKGhkbGMtPmhkbGNfYml0czEgPT0gNSl7Ci0JCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZihoZGxjLT5zaGlmdF9yZWcgJiAweDAxKXsKLQkJCQloZGxjLT5jYmluKys7Ci0JCQl9Ci0JCQloZGxjLT5zaGlmdF9yZWcgPj49IDE7Ci0JCQloZGxjLT5iaXRfc2hpZnQtLTsKLQkJCWlmKGhkbGMtPmJpdF9zaGlmdD09MCl7Ci0JCQkJaGRsYy0+ZmZ2YWx1ZSA9IHhmYXN0X2ZsYWdfdmFsdWVbaGRsYy0+ZGF0YV9iaXRzXTsKLQkJCQlpZihoZGxjLT5kY2hhbm5lbCl7Ci0JCQkJCWhkbGMtPmZmdmFsdWUgPSAweDdlOwotCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9JRExFMTsKLQkJCQkJaGRsYy0+Yml0X3NoaWZ0ID0gOC1oZGxjLT5kYXRhX2JpdHM7Ci0JCQkJCWlmKGhkbGMtPmJpdF9zaGlmdD09MCkKLQkJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZBU1RfSURMRTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZighaGRsYy0+ZG9fYWRhcHQ1Nil7Ci0JCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9GQVNUX0ZMQUc7Ci0JCQkJCQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5ERkxBR19CMDsKLQkJCQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAwOwotCQkJCQl9Ci0JCQkJCS8vIEZpbmlzaGVkIHdpdGggdGhpcyBmcmFtZSwgc2VuZCBmbGFncwotCQkJCQlpZiAoZHNpemUgPiAxKSBkc2l6ZSA9IDE7IAotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEhETENfU0VORF9JRExFMToKLQkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAwOwotCQkJaGRsYy0+Y2JpbiA8PD0gMTsKLQkJCWhkbGMtPmNiaW4rKzsKLQkJCWhkbGMtPmRhdGFfYml0cysrOwotCQkJaGRsYy0+Yml0X3NoaWZ0LS07Ci0JCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTApewotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZBU1RfSURMRTsKLQkJCQloZGxjLT5iaXRfc2hpZnQgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSERMQ19TRU5EX0ZBU1RfSURMRToKLQkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAwOwotCQkJaGRsYy0+Y2JpbiA9IDB4ZmY7Ci0JCQloZGxjLT5kYXRhX2JpdHMgPSA4OwotCQkJaWYoaGRsYy0+Yml0X3NoaWZ0ID09IDgpewotCQkJCWhkbGMtPmNiaW4gPSAweDdlOwotCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZJUlNUX0ZMQUc7Ci0JCQl9IGVsc2UgewotCQkJCSpkc3QrKyA9IGhkbGMtPmNiaW47Ci0JCQkJaGRsYy0+Yml0X3NoaWZ0ID0gaGRsYy0+ZGF0YV9iaXRzID0gMDsKLQkJCQlsZW4rKzsKLQkJCQlkc2l6ZSA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWlmKGhkbGMtPmRvX2FkYXB0NTYpewotCQkJaWYoaGRsYy0+ZGF0YV9iaXRzPT03KXsKLQkJCQloZGxjLT5jYmluIDw8PSAxOwotCQkJCWhkbGMtPmNiaW4rKzsKLQkJCQloZGxjLT5kYXRhX2JpdHMrKzsKLQkJCX0KLQkJfQotCQlpZihoZGxjLT5kYXRhX2JpdHM9PTgpewotCQkJKmRzdCsrID0gaGRsYy0+Y2JpbjsKLQkJCWhkbGMtPmRhdGFfYml0cyA9IDA7Ci0JCQlsZW4rKzsKLQkJCWRzaXplLS07Ci0JCX0KLQl9Ci0JKmNvdW50IC09IHNsZW47Ci0KLQlyZXR1cm4gbGVuOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX2hkbGMuaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfaGRsYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU0MzJmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfaGRsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgU1Q1NDgxIFVTQiBJU0ROIG1vZGVtCi0gKgotICogQXV0aG9yICAgICAgIEZyb2RlIElzYWtzZW4KLSAqIENvcHlyaWdodCAgICAyMDAxIGJ5IEZyb2RlIElzYWtzZW4gICAgICA8ZmlzYWtzZW5AYmV3YW4uY29tPgotICogICAgICAgICAgICAgIDIwMDEgYnkgS2FpIEdlcm1hc2NoZXdza2kgIDxrYWkuZ2VybWFzY2hld3NraUBnbXguZGU+Ci0gKiAKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKgotICovCi0KLSNpZm5kZWYgX19TVDU0ODFfSERMQ19IX18KLSNkZWZpbmUgX19TVDU0ODFfSERMQ19IX18KLQotc3RydWN0IGhkbGNfdmFycyB7Ci0gIAlpbnQgYml0X3NoaWZ0OyAKLQlpbnQgaGRsY19iaXRzMTsKLQlpbnQgZGF0YV9iaXRzOwotCWludCBmZmJpdF9zaGlmdDsgLy8gZW5jb2Rpbmcgb25seQotCWludCBzdGF0ZTsKLQlpbnQgZHN0cG9zOwotCi0JaW50IGRhdGFfcmVjZWl2ZWQ6MTsgLy8gc2V0IGlmIHRyYW5zZmVycmluZyBkYXRhCi0JaW50IGRjaGFubmVsOjE7IC8vIHNldCBpZiBEIGNoYW5uZWwgKHNlbmQgaWRsZSBpbnN0ZWFkIG9mIGZsYWdzKQotCWludCBkb19hZGFwdDU2OjE7IC8vIHNldCBpZiA1NksgYWRhcHRhdGlvbgotICAgICAgICBpbnQgZG9fY2xvc2luZzoxOyAvLyBzZXQgaWYgaW4gY2xvc2luZyBwaGFzZSAobmVlZCB0byBzZW5kIENSQyArIGZsYWcKLQotCXVuc2lnbmVkIHNob3J0IGNyYzsKLQotCXVuc2lnbmVkIGNoYXIgY2JpbjsgCi0JdW5zaWduZWQgY2hhciBzaGlmdF9yZWc7Ci0JdW5zaWduZWQgY2hhciBmZnZhbHVlOwotCQotfTsKLQotCi0vKgotICBUaGUgcmV0dXJuIHZhbHVlIGZyb20gaGRsY19kZWNvZGUgaXMKLSAgdGhlIGZyYW1lIGxlbmd0aCwgMCBpZiBubyBjb21wbGV0ZSBmcmFtZSB3YXMgZGVjb2RlZCwKLSAgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIKLSovCi0KLSNkZWZpbmUgSERMQ19GUkFNSU5HX0VSUk9SICAgICAxCi0jZGVmaW5lIEhETENfQ1JDX0VSUk9SICAgICAgICAgMgotI2RlZmluZSBIRExDX0xFTkdUSF9FUlJPUiAgICAgIDMKLQotdm9pZCAKLWhkbGNfcmN2X2luaXQoc3RydWN0IGhkbGNfdmFycyAqaGRsYywgaW50IGRvX2FkYXB0NTYpOwotCi1pbnQKLWhkbGNfZGVjb2RlKHN0cnVjdCBoZGxjX3ZhcnMgKmhkbGMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNsZW4saW50ICpjb3VudCwgCi0JICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzaXplKTsKLQotdm9pZCAKLWhkbGNfb3V0X2luaXQoc3RydWN0IGhkbGNfdmFycyAqaGRsYyxpbnQgaXNfZF9jaGFubmVsLGludCBkb19hZGFwdDU2KTsKLQotaW50IAotaGRsY19lbmNvZGUoc3RydWN0IGhkbGNfdmFycyAqaGRsYyxjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsdW5zaWduZWQgc2hvcnQgc2xlbixpbnQgKmNvdW50LAotCSAgICB1bnNpZ25lZCBjaGFyICpkc3QsaW50IGRzaXplKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX3VzYi5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3N0NTQ4MV91c2IuYwppbmRleCAyMzY5MTgwLi5hYjYyMjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvc3Q1NDgxX3VzYi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC9zdDU0ODFfdXNiLmMKQEAgLTE1LDYgKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSAic3Q1NDgxLmgiCiAKK3N0YXRpYyBpbnQgc3Q1NDgxX2lzb2NfZmxhdHRlbihzdHJ1Y3QgdXJiICp1cmIpOworCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBjb250cm9sIHBpcGUKICAqLwpAQCAtNTUsOSArNTcsOSBAQAogICogQXN5bmNocm9ub3VzIGVuZHBvaW50IDAgcmVxdWVzdCAoYXN5bmMgdmVyc2lvbiBvZiB1c2JfY29udHJvbF9tc2cpLgogICogVGhlIHJlcXVlc3Qgd2lsbCBiZSBxdWV1ZWQgdXAgaW4gYSBGSUZPIGlmIHRoZSBlbmRwb2ludCBpcyBidXN5LgogICovCi12b2lkIHVzYl9jdHJsX21zZyhzdHJ1Y3Qgc3Q1NDgxX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgdTggcmVxdWVzdCwgdTggcmVxdWVzdHR5cGUsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgIGN0cmxfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIHVzYl9jdHJsX21zZyhzdHJ1Y3Qgc3Q1NDgxX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgdTggcmVxdWVzdCwgdTggcmVxdWVzdHR5cGUsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAorCQkJIGN0cmxfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3Qgc3Q1NDgxX2N0cmwgKmN0cmwgPSAmYWRhcHRlci0+Y3RybDsKIAlpbnQgd19pbmRleDsKQEAgLTU3MSw3ICs1NzMsNyBAQAogICogTWFrZSB0aGUgdHJhbnNmZXJfYnVmZmVyIGNvbnRpZ3VvdXMgYnkKICAqIGNvcHlpbmcgZnJvbSB0aGUgaXNvIGRlc2NyaXB0b3JzIGlmIG5lY2Vzc2FyeS4gCiAgKi8KLWludCBzdDU0ODFfaXNvY19mbGF0dGVuKHN0cnVjdCB1cmIgKnVyYikKK3N0YXRpYyBpbnQgc3Q1NDgxX2lzb2NfZmxhdHRlbihzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKnBpcGQsKnBlbmQ7CiAJdW5zaWduZWQgY2hhciAqc3JjLCpkc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVpLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVpLmMKaW5kZXggMDgyNzI2ZC4uY2ViMGRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWkuYwpAQCAtNzQsNyArNzQsNyBAQAogCSJFVl9UMjAyIiwKIH07CiAKLXVuc2lnbmVkIGludAorc3RhdGljIHVuc2lnbmVkIGludAogcmFuZG9tX3JpKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZWludC5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVpbnQuYwppbmRleCBlZjg5ODRjLi5hMmIxODE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZWludC5jCisrKyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlaW50LmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107CiAKLWNvbnN0IGNoYXIgKlRlbGVJbnRfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjE2LjIuNSAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICpUZWxlSW50X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS4xNi4yLjUgJCI7CiAKICNkZWZpbmUgYnl0ZW91dChhZGRyLHZhbCkgb3V0Yih2YWwsYWRkcikKICNkZWZpbmUgYnl0ZWluKGFkZHIpIGluYihhZGRyKQpAQCAtMjAzLDcgKzIwMyw3IEBACiAJYWRkX3RpbWVyKCZjcy0+aHcuaGZjLnRpbWVyKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHJlbGVhc2VfaW9fVGVsZUludChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJZGVsX3RpbWVyKCZjcy0+aHcuaGZjLnRpbWVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlczAuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlczAuYwppbmRleCA1ZWM1ZWMzLi4yYjdkZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXMwLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzMC5jCkBAIC0yMyw3ICsyMyw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwogCi1jb25zdCBjaGFyICp0ZWxlczBfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjE1LjIuNCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICp0ZWxlczBfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAyLjE1LjIuNCAkIjsKIAogI2RlZmluZSBURUxFU19JT01FTV9TSVpFCTB4NDAwCiAjZGVmaW5lIGJ5dGVvdXQoYWRkcix2YWwpIG91dGIodmFsLGFkZHIpCkBAIC0xODMsNyArMTgzLDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNlX2lvX3RlbGVzMChzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaWYgKGNzLT5ody50ZWxlczAuY2ZnX3JlZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlczMuYyBiL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlczMuYwppbmRleCBjNWIxZjY1Li5hZGVhYWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXMzLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzMy5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAiaXNkbmwxLmgiCiAKIGV4dGVybiBjb25zdCBjaGFyICpDYXJkVHlwZVtdOwotY29uc3QgY2hhciAqdGVsZXMzX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4xOS4yLjQgJCI7CitzdGF0aWMgY29uc3QgY2hhciAqdGVsZXMzX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4xOS4yLjQgJCI7CiAKICNkZWZpbmUgYnl0ZW91dChhZGRyLHZhbCkgb3V0Yih2YWwsYWRkcikKICNkZWZpbmUgYnl0ZWluKGFkZHIpIGluYihhZGRyKQpAQCAtMTU0LDcgKzE1NCw3IEBACiAJCXJlbGVhc2VfcmVnaW9uKGNzLT5ody50ZWxlczMuaHNjeFsxXSArIDMyLCAzMik7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiByZWxlYXNlX2lvX3RlbGVzMyhzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaWYgKGNzLT50eXAgPT0gSVNETl9DVFlQRV9URUxFU1BDTUNJQSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzX2NzLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYwppbmRleCA2M2U4ZTIwLi4wZGRlZjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdGVsZXNfY3MuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTkzLDExICsxOTIsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0gICAgICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLSAgICAgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICAgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdGVsZXNfY3NfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC00ODksMTMgKzQ4MywyMSBAQAogICAgIHJldHVybiAwOwogfSAvKiB0ZWxlc19jc19ldmVudCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgdGVsZXNfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRFTEVTIiwgIlMwL1BDIiwgMHg2N2I1MGVhZSwgMHhlOWU3MDExOSksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB0ZWxlc19pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgdGVsZXNfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAidGVsZXNfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSB0ZWxlc19hdHRhY2gsCisJLmV2ZW50CQk9IHRlbGVzX2NzX2V2ZW50LAogCS5kZXRhY2gJCT0gdGVsZXNfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHRlbGVzX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdGVsZXNfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oaXNheC90ZWxlc3BjaS5jIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzcGNpLmMKaW5kZXggMDY2MWM2Yy4uZTJiYjRmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzcGNpLmMKKysrIGIvZHJpdmVycy9pc2RuL2hpc2F4L3RlbGVzcGNpLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogZXh0ZXJuIGNvbnN0IGNoYXIgKkNhcmRUeXBlW107Ci1jb25zdCBjaGFyICp0ZWxlc3BjaV9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDIuMjMuMi4zICQiOworc3RhdGljIGNvbnN0IGNoYXIgKnRlbGVzcGNpX3JldmlzaW9uID0gIiRSZXZpc2lvbjogMi4yMy4yLjMgJCI7CiAKICNkZWZpbmUgWk9SQU5fUE9fUlFfUEVOCTB4MDIwMDAwMDAKICNkZWZpbmUgWk9SQU5fUE9fV1IJMHgwMDgwMDAwMApAQCAtMjU3LDcgKzI1Nyw3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9pb190ZWxlc3BjaShzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCiB7CiAJaW91bm1hcChjcy0+aHcudGVsZXMwLm1lbWJhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L3c2NjkyLmMgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdzY2OTIuYwppbmRleCBkMmI2YjhlLi43YmFmOGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGlzYXgvdzY2OTIuYworKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvdzY2OTIuYwpAQCAtNDEsNyArNDEsNyBAQAogCiBleHRlcm4gY29uc3QgY2hhciAqQ2FyZFR5cGVbXTsKIAotY29uc3QgY2hhciAqdzY2OTJfcmV2aXNpb24gPSAiJFJldmlzaW9uOiAxLjE4LjIuNCAkIjsKK3N0YXRpYyBjb25zdCBjaGFyICp3NjY5Ml9yZXZpc2lvbiA9ICIkUmV2aXNpb246IDEuMTguMi40ICQiOwogCiAjZGVmaW5lIERCVVNZX1RJTUVSX1ZBTFVFIDgwCiAKQEAgLTg4MCw3ICs4ODAsNyBAQAogCXJldHVybiAoMCk7CiB9CiAKLXZvaWQgcmVzZXRXNjY5MihzdHJ1Y3QgSXNkbkNhcmRTdGF0ZSAqY3MpCitzdGF0aWMgdm9pZCByZXNldFc2NjkyKHN0cnVjdCBJc2RuQ2FyZFN0YXRlICpjcykKIHsKIAljcy0+d3JpdGVXNjY5MihjcywgV19EX0NUTCwgV19EX0NUTF9TUlNUKTsKIAltZGVsYXkoMTApOwpAQCAtOTAyLDcgKzkwMiw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBpbml0VzY2OTIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgcGFydCkKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0VzY2OTIoc3RydWN0IElzZG5DYXJkU3RhdGUgKmNzLCBpbnQgcGFydCkKIHsKIAlpZiAocGFydCAmIDEpIHsKIAkJY3MtPnNldHN0YWNrX2QgPSBzZXRzdGFja19XNjY5MjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeWNhcGkuYwppbmRleCA4ZWUyNWIyLi4xZmQzZDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHljYXBpLmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5Y2FwaS5jCkBAIC00Miw2ICs0Miw4IEBACiAKIHN0YXRpYyBoeWNhcGlfYXBwbCBoeWNhcGlfYXBwbGljYXRpb25zW0NBUElfTUFYQVBQTF07CiAKK3N0YXRpYyB1MTYgaHljYXBpX3NlbmRfbWVzc2FnZShzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwsIHN0cnVjdCBza19idWZmICpza2IpOworCiBzdGF0aWMgaW5saW5lIGludCBfaHljYXBpX2FwcENoZWNrKGludCBhcHBfaWQsIGludCBjdHJsX25vKQogewogCWlmKChjdHJsX25vIDw9IDApIHx8IChjdHJsX25vID4gQ0FQSV9NQVhDT05UUikgfHwgKGFwcF9pZCA8PSAwKSB8fApAQCAtNTcsNyArNTksNyBAQAogS2VybmVsLUNhcGkgY2FsbGJhY2sgcmVzZXRfY3RyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAKIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBoeWNhcGlfcmVzZXRfY3RyKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAloeWNhcGljdHJsX2luZm8gKmNpbmZvID0gY3RybC0+ZHJpdmVyZGF0YTsKQEAgLTczLDcgKzc1LDcgQEAKIEtlcm5lbC1DYXBpIGNhbGxiYWNrIHJlbW92ZV9jdHIKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgIAogCi12b2lkIAorc3RhdGljIHZvaWQKIGh5Y2FwaV9yZW1vdmVfY3RyKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAlpbnQgaTsKQEAgLTIxNSw3ICsyMTcsNyBAQAogVGhlIGFwcGxpY2F0aW9uIGlzIHJlY29yZGVkIGluIHRoZSBpbnRlcm5hbCBsaXN0LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBoeWNhcGlfcmVnaXN0ZXJfYXBwbChzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwsIF9fdTE2IGFwcGwsIAogCQkgICAgIGNhcGlfcmVnaXN0ZXJfcGFyYW1zICpycCkKIHsKQEAgLTI5MSw3ICsyOTMsNyBAQAogcmVnaXN0cmF0aW9uIGF0IGNvbnRyb2xsZXItbGV2ZWwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAKK3N0YXRpYyB2b2lkCiBoeWNhcGlfcmVsZWFzZV9hcHBsKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgX191MTYgYXBwbCkKIHsKIAlpbnQgY2hrOwpAQCAtMzY0LDcgKzM2Niw3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTE2IGh5Y2FwaV9zZW5kX21lc3NhZ2Uoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHUxNiBoeWNhcGlfc2VuZF9tZXNzYWdlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlfX3UxNiBhcHBsX2lkOwogCWludCBfbGVuLCBfbGVuMjsKQEAgLTQzNyw4ICs0MzksOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBoeWNhcGlfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKK3N0YXRpYyBpbnQgaHljYXBpX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCBzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwpCiB7CiAJaHljYXBpY3RybF9pbmZvICpjaW5mbyA9IChoeWNhcGljdHJsX2luZm8gKikoY3RybC0+ZHJpdmVyZGF0YSk7CiAJaHlzZG5fY2FyZCAqY2FyZCA9IGNpbmZvLT5jYXJkOwpAQCAtNDg1LDcgKzQ4Nyw3IEBACiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1pbnQgaHljYXBpX2xvYWRfZmlybXdhcmUoc3RydWN0IGNhcGlfY3RyICpjdHJsLCBjYXBpbG9hZGRhdGEgKmRhdGEpCitzdGF0aWMgaW50IGh5Y2FwaV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBjYXBpX2N0ciAqY3RybCwgY2FwaWxvYWRkYXRhICpkYXRhKQogewogI2lmZGVmIEhZQ0FQSV9QUklOVEZOQU1FUwogCXByaW50ayhLRVJOX05PVElDRSAiaHljYXBpX2xvYWRfZmlybXdhcmVcbiIpOyAgICAKQEAgLTQ5NCw3ICs0OTYsNyBAQAogfQogCiAKLWNoYXIgKmh5Y2FwaV9wcm9jaW5mbyhzdHJ1Y3QgY2FwaV9jdHIgKmN0cmwpCitzdGF0aWMgY2hhciAqaHljYXBpX3Byb2NpbmZvKHN0cnVjdCBjYXBpX2N0ciAqY3RybCkKIHsKIAloeWNhcGljdHJsX2luZm8gKmNpbmZvID0gKGh5Y2FwaWN0cmxfaW5mbyAqKShjdHJsLT5kcml2ZXJkYXRhKTsKICNpZmRlZiBIWUNBUElfUFJJTlRGTkFNRVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9ib290LmMgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fYm9vdC5jCmluZGV4IDZjMDQyODEuLjdiZmJhMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9ib290LmMKKysrIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2Jvb3QuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogIHRvIGJlIGNhbGxlZCBhdCBzdGFydCBvZiBQT0YgZmlsZSByZWFkaW5nLCAgICAgICAqLwogLyogIGJlZm9yZSBzdGFydGluZyBhbnkgZGVjcnlwdGlvbiBvbiBhbnkgUE9GIHJlY29yZC4gKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBTdGFydERlY3J5cHRpb24oc3RydWN0IGJvb3RfZGF0YSAqYm9vdCkKIHsKIAlib290LT5DcnlwdG9yID0gQ1JZUFRfU1RBUlRURVJNOwpAQCAtNjYsNyArNjYsNyBAQAogLyogICAgICAgdG8gSEkgYW5kIExPIGJvb3QgbG9hZGVyIGFuZCAoYWxsKSBzZXEgdGFncywgYmVjYXVzZSAgKi8KIC8qICAgICAgIGdsb2JhbCBDcnlwdG9yIGlzIHN0YXJ0ZWQgZm9yIHdob2xlIFBPRi4gICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZAorc3RhdGljIHZvaWQKIERlY3J5cHRCdWYoc3RydWN0IGJvb3RfZGF0YSAqYm9vdCwgaW50IGNudCkKIHsKIAl1Y2hhciAqYnVmcCA9IGJvb3QtPmJ1Zi5Cb290QnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2RlZnMuaCBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9kZWZzLmgKaW5kZXggNGNlZTI2ZS4uNDMyZjZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2RlZnMuaAorKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fZGVmcy5oCkBAIC0yMjcsNyArMjI3LDYgQEAKIC8qKioqKioqKioqKioqKioqKi8KIC8qIGV4cG9ydGVkIHZhcnMgKi8KIC8qKioqKioqKioqKioqKioqKi8KLWV4dGVybiBpbnQgY2FyZG1heDsJCS8qIG51bWJlciBvZiBmb3VuZCBjYXJkcyAqLwogZXh0ZXJuIGh5c2RuX2NhcmQgKmNhcmRfcm9vdDsJLyogcG9pbnRlciB0byBmaXJzdCBjYXJkICovCiAKIApAQCAtMjQ0LDcgKzI0Myw2IEBACiAvKiBoeXNkbl9wcm9jbG9nLmMgKi8KIGV4dGVybiBpbnQgaHlzZG5fcHJvY2xvZ19pbml0KGh5c2RuX2NhcmQgKik7CS8qIGluaXQgcHJvYyBsb2cgZW50cnkgKi8KIGV4dGVybiB2b2lkIGh5c2RuX3Byb2Nsb2dfcmVsZWFzZShoeXNkbl9jYXJkICopOwkvKiBkZWluaXQgcHJvYyBsb2cgZW50cnkgKi8KLWV4dGVybiB2b2lkIHB1dF9sb2dfYnVmZmVyKGh5c2RuX2NhcmQgKiwgY2hhciAqKTsJLyogb3V0cHV0IGxvZyBkYXRhICovCiBleHRlcm4gdm9pZCBoeXNkbl9hZGRsb2coaHlzZG5fY2FyZCAqLCBjaGFyICosLi4uKTsJLyogb3V0cHV0IGRhdGEgdG8gbG9nICovCiBleHRlcm4gdm9pZCBoeXNkbl9jYXJkX2VycmxvZyhoeXNkbl9jYXJkICosIHRFcnJMb2dFbnRyeSAqLCBpbnQpOwkvKiBvdXRwdXQgY2FyZCBsb2cgKi8KIApAQCAtMjc4LDE2ICsyNzYsNiBAQAogZXh0ZXJuIGludCBoeWNhcGlfY2FwaV9jcmVhdGUoaHlzZG5fY2FyZCAqKTsJLyogY3JlYXRlIGEgbmV3IGNhcGkgZGV2aWNlICovCiBleHRlcm4gaW50IGh5Y2FwaV9jYXBpX3JlbGVhc2UoaHlzZG5fY2FyZCAqKTsJLyogZGVsZXRlIHRoZSBkZXZpY2UgKi8KIGV4dGVybiBpbnQgaHljYXBpX2NhcGlfc3RvcChoeXNkbl9jYXJkICpjYXJkKTsgICAvKiBzdXNwZW5kICovCi1leHRlcm4gaW50IGh5Y2FwaV9sb2FkX2Zpcm13YXJlKHN0cnVjdCBjYXBpX2N0ciAqLCBjYXBpbG9hZGRhdGEgKik7Ci1leHRlcm4gdm9pZCBoeWNhcGlfcmVzZXRfY3RyKHN0cnVjdCBjYXBpX2N0ciAqKTsKLWV4dGVybiB2b2lkIGh5Y2FwaV9yZW1vdmVfY3RyKHN0cnVjdCBjYXBpX2N0ciAqKTsKLWV4dGVybiB2b2lkIGh5Y2FwaV9yZWdpc3Rlcl9hcHBsKHN0cnVjdCBjYXBpX2N0ciAqLCBfX3UxNiBhcHBsLAotCQkJCSBjYXBpX3JlZ2lzdGVyX3BhcmFtcyAqKTsKLWV4dGVybiB2b2lkIGh5Y2FwaV9yZWxlYXNlX2FwcGwoc3RydWN0IGNhcGlfY3RyICosIF9fdTE2IGFwcGwpOwotZXh0ZXJuIHUxNiAgaHljYXBpX3NlbmRfbWVzc2FnZShzdHJ1Y3QgY2FwaV9jdHIgKiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gY2hhciAqaHljYXBpX3Byb2NpbmZvKHN0cnVjdCBjYXBpX2N0ciAqKTsKLWV4dGVybiBpbnQgaHljYXBpX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKLQkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCBzdHJ1Y3QgY2FwaV9jdHIgKmNhcmQpOwogZXh0ZXJuIHZvaWQgaHljYXBpX3J4X2NhcGlwa3QoaHlzZG5fY2FyZCAqIGNhcmQsIHVjaGFyICogYnVmLCB3b3JkIGxlbik7CiBleHRlcm4gdm9pZCBoeWNhcGlfdHhfY2FwaWFjayhoeXNkbl9jYXJkICogY2FyZCk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmh5Y2FwaV90eF9jYXBpZ2V0KGh5c2RuX2NhcmQgKmNhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2luaXQuYyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9pbml0LmMKaW5kZXggNWNhYzJiZi4uMTJjODEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX2luaXQuYworKysgYi9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5faW5pdC5jCkBAIC0zNCw3ICszNCw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBjaGFyICpoeXNkbl9pbml0X3JldmlzaW9uID0gIiRSZXZpc2lvbjogMS42LjYuNiAkIjsKLWludCBjYXJkbWF4OwkJCS8qIG51bWJlciBvZiBmb3VuZCBjYXJkcyAqLworc3RhdGljIGludCBjYXJkbWF4OwkJLyogbnVtYmVyIG9mIGZvdW5kIGNhcmRzICovCiBoeXNkbl9jYXJkICpjYXJkX3Jvb3QgPSBOVUxMOwkvKiBwb2ludGVyIHRvIGZpcnN0IGNhcmQgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jIGIvZHJpdmVycy9pc2RuL2h5c2RuL2h5c2RuX3Byb2Nsb2cuYwppbmRleCA4ZWYyYjdjLi40ZDU3MDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaHlzZG4vaHlzZG5fcHJvY2xvZy5jCisrKyBiL2RyaXZlcnMvaXNkbi9oeXNkbi9oeXNkbl9wcm9jbG9nLmMKQEAgLTIyLDYgKzIyLDggQEAKIC8qIHRoZSBwcm9jIHN1YmRpciBmb3IgdGhlIGludGVyZmFjZSBpcyBkZWZpbmVkIGluIHRoZSBwcm9jY29uZiBtb2R1bGUgKi8KIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmh5c2RuX3Byb2NfZW50cnk7CiAKK3N0YXRpYyB2b2lkIHB1dF9sb2dfYnVmZmVyKGh5c2RuX2NhcmQgKiBjYXJkLCBjaGFyICpjcCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogc3RydWN0dXJlIGtlZXBpbmcgYXNjaWkgbG9nIGZvciBkZXZpY2Ugb3V0cHV0ICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkzLDcgKzk1LDcgQEAKIC8qIG9wZW5lZCBmb3IgcmVhZCBnb3QgdGhlIGNvbnRlbnRzLiAgICAgICAgKi8KIC8qIEZsdXNoZXMgYnVmZmVycyBub3QgbG9uZ2VyIGluIHVzZS4gICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBwdXRfbG9nX2J1ZmZlcihoeXNkbl9jYXJkICogY2FyZCwgY2hhciAqY3ApCiB7CiAJc3RydWN0IGxvZ19kYXRhICppYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9hdWRpby5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmMKaW5kZXggNTM1MDgzNi4uMmNjNTZkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmMKQEAgLTM5MiwxNiArMzkyLDYgQEAKIH0KIAogaW50Ci1pc2RuX2F1ZGlvXzJhZHBjbV9mbHVzaChhZHBjbV9zdGF0ZSAqIHMsIHVuc2lnbmVkIGNoYXIgKm91dCkKLXsKLQlpbnQgb2xlbiA9IDA7Ci0KLQlpZiAocy0+bmxlZnQpCi0JCWlzZG5fYXVkaW9fcHV0X2JpdHMoMCwgOCAtIHMtPm5sZWZ0LCBzLCAmb3V0LCAmb2xlbik7Ci0JcmV0dXJuIG9sZW47Ci19Ci0KLWludAogaXNkbl9hdWRpb194bGF3MmFkcGNtKGFkcGNtX3N0YXRlICogcywgaW50IGZtdCwgdW5zaWduZWQgY2hhciAqaW4sCiAJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGxlbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9hdWRpby5oIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmgKaW5kZXggNWE5NzdiMi4uMDEzYzM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmgKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2F1ZGlvLmgKQEAgLTM1LDcgKzM1LDYgQEAKIGV4dGVybiBhZHBjbV9zdGF0ZSAqaXNkbl9hdWRpb19hZHBjbV9pbml0KGFkcGNtX3N0YXRlICosIGludCk7CiBleHRlcm4gaW50IGlzZG5fYXVkaW9fYWRwY20yeGxhdyhhZHBjbV9zdGF0ZSAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwogZXh0ZXJuIGludCBpc2RuX2F1ZGlvX3hsYXcyYWRwY20oYWRwY21fc3RhdGUgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQgaXNkbl9hdWRpb18yYWRwY21fZmx1c2goYWRwY21fc3RhdGUgKiBzLCB1bnNpZ25lZCBjaGFyICpvdXQpOwogZXh0ZXJuIHZvaWQgaXNkbl9hdWRpb19jYWxjX2R0bWYobW9kZW1faW5mbyAqLCB1bnNpZ25lZCBjaGFyICosIGludCwgaW50KTsKIGV4dGVybiB2b2lkIGlzZG5fYXVkaW9fZXZhbF9kdG1mKG1vZGVtX2luZm8gKik7CiBkdG1mX3N0YXRlICppc2RuX2F1ZGlvX2R0bWZfaW5pdChkdG1mX3N0YXRlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCmluZGV4IGM0MDZkZjYuLmVlYmNiMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKQEAgLTY3LDcgKzY3LDcgQEAKIHN0YXRpYyBpbnQgaXNkbl93cml0ZWJ1Zl9zdHViKGludCwgaW50LCBjb25zdCB1X2NoYXIgX191c2VyICosIGludCk7CiBzdGF0aWMgdm9pZCBzZXRfZ2xvYmFsX2ZlYXR1cmVzKHZvaWQpOwogc3RhdGljIGludCBpc2RuX3dpbGRtYXQoY2hhciAqcywgY2hhciAqcCk7Ci0KK3N0YXRpYyBpbnQgaXNkbl9hZGRfY2hhbm5lbHMoaXNkbl9kcml2ZXJfdCAqZCwgaW50IGRydmlkeCwgaW50IG4sIGludCBhZGRpbmcpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGlzZG5fbG9ja19kcml2ZXIoaXNkbl9kcml2ZXJfdCAqZHJ2KQpAQCAtMzg4LDcgKzM4OCw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pc2RuL2NhcGljbWQuaD4KIAotaW50CitzdGF0aWMgaW50CiBpc2RuX2NhcGlfcmVjX2hsX21zZyhjYXBpX21zZyAqY20pIHsKIAkKIAlpbnQgZGk7CkBAIC0xOTIzLDcgKzE5MjMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludAorc3RhdGljIGludAogaXNkbl9hZGRfY2hhbm5lbHMoaXNkbl9kcml2ZXJfdCAqZCwgaW50IGRydmlkeCwgaW50IG4sIGludCBhZGRpbmcpCiB7CiAJaW50IGosIGssIG07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmggYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmgKaW5kZXggODA4MTM1Yy4uZTI3ZTljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uaApAQCAtNDEsNyArNDEsNiBAQAogZXh0ZXJuIGludCAgaXNkbl93cml0ZWJ1Zl9za2Jfc3R1YihpbnQsIGludCwgaW50LCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIGV4dGVybiBpbnQgIHJlZ2lzdGVyX2lzZG4oaXNkbl9pZiAqIGkpOwogZXh0ZXJuIGludCAgaXNkbl9tc25jbXAoIGNvbnN0IGNoYXIgKiwgIGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gaW50ICBpc2RuX2FkZF9jaGFubmVscyhpc2RuX2RyaXZlcl90ICosIGludCwgaW50LCBpbnQpOwogI2lmIGRlZmluZWQoSVNETl9ERUJVR19ORVRfRFVNUCkgfHwgZGVmaW5lZChJU0ROX0RFQlVHX01PREVNX0RVTVApCiBleHRlcm4gdm9pZCBpc2RuX2R1bXBwa3QoY2hhciAqLCB1X2NoYXIgKiwgaW50LCBpbnQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29uY2FwLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29uY2FwLmMKaW5kZXggODNhNGY1MzguLjAxOTNiNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb25jYXAuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29uY2FwLmMKQEAgLTM5LDcgKzM5LDcgQEAKICAgICovCiAKIAotaW50IGlzZG5fY29uY2FwX2RsX2RhdGFfcmVxKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNvbmNhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgaXNkbl9jb25jYXBfZGxfZGF0YV9yZXEoc3RydWN0IGNvbmNhcF9wcm90byAqY29uY2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gY29uY2FwIC0+IG5ldF9kZXY7CiAJaXNkbl9uZXRfZGV2ICpuZCA9ICgoaXNkbl9uZXRfbG9jYWwgKikgbmRldi0+cHJpdiktPm5ldGRldjsKQEAgLTU4LDcgKzU4LDcgQEAKIH0KIAogCi1pbnQgaXNkbl9jb25jYXBfZGxfY29ubmVjdF9yZXEoc3RydWN0IGNvbmNhcF9wcm90byAqY29uY2FwKQorc3RhdGljIGludCBpc2RuX2NvbmNhcF9kbF9jb25uZWN0X3JlcShzdHJ1Y3QgY29uY2FwX3Byb3RvICpjb25jYXApCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBjb25jYXAgLT4gbmV0X2RldjsKIAlpc2RuX25ldF9sb2NhbCAqbHAgPSAoaXNkbl9uZXRfbG9jYWwgKikgbmRldi0+cHJpdjsKQEAgLTcxLDcgKzcxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaXNkbl9jb25jYXBfZGxfZGlzY29ubl9yZXEoc3RydWN0IGNvbmNhcF9wcm90byAqY29uY2FwKQorc3RhdGljIGludCBpc2RuX2NvbmNhcF9kbF9kaXNjb25uX3JlcShzdHJ1Y3QgY29uY2FwX3Byb3RvICpjb25jYXApCiB7CiAJSVgyNURFQlVHKCAiaXNkbl9jb25jYXBfZGxfZGlzY29ubl9yZXE6ICVzIFxuIiwgY29uY2FwIC0+IG5ldF9kZXYgLT4gbmFtZSk7CiAKQEAgLTg1LDE1ICs4NSw2IEBACiAJJmlzZG5fY29uY2FwX2RsX2Rpc2Nvbm5fcmVxCiB9OwogCi1zdHJ1Y3QgY29uY2FwX2RldmljZV9vcHMgaXNkbl9jb25jYXBfZGVtYW5kX2RpYWxfZG9wcyA9IHsKLQlOVUxMLCAvKiBzZXQgdGhpcyBmaXJzdCBlbnRyeSB0byBzb21ldGhpbmcgbGlrZSAmaXNkbl9uZXRfc3RhcnRfeG1pdCwKLQkJIGJ1dCB0aGUgZW50cnkgcGFydCBvZiB0aGUgY3VycmVudCBpc2RuX25ldF9zdGFydF94bWl0IG11c3QgYmUKLQkJIHNlcGFyYXRlZCBmaXJzdC4gKi8KLQkvKiBubyBjb25uZWN0aW9uIGNvbnRyb2wgZm9yIGRlbWFuZCBkaWFsIHNlbWFudGljcyAqLwotCU5VTEwsCi0JTlVMTCwKLX07Ci0KIC8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJldHRlciBnbyBpbnRvIGEgZGVkaWNhdGVkIHNvdXJjZSBmaWxlIHN1Y2ggdGhhdAogICAgdGhpcyBzb3VyY2VmaWxlIGRvZXMgbm90IG5lZWQgdG8gaW5jbHVkZSBhbnkgcHJvdG9jb2wgc3BlY2lmaWMgaGVhZGVyCiAgICBmaWxlcy4gRm9yIG5vdzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb25jYXAuaCBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb25jYXAuaAppbmRleCAzMDZlYjE4Li42YWM3ZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29uY2FwLmgKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbmNhcC5oCkBAIC04LDcgKzgsNiBAQAogICovCiAKIGV4dGVybiBzdHJ1Y3QgY29uY2FwX2RldmljZV9vcHMgaXNkbl9jb25jYXBfcmVsaWFibGVfZGxfZG9wczsKLWV4dGVybiBzdHJ1Y3QgY29uY2FwX2RldmljZV9vcHMgaXNkbl9jb25jYXBfZGVtYW5kX2RpYWxfZG9wczsKIGV4dGVybiBzdHJ1Y3QgY29uY2FwX3Byb3RvICogaXNkbl9jb25jYXBfbmV3KCBpbnQgKTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKaW5kZXggZTJiNzkwZS4uZjMwZThlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiAKIC8qIFByb3RvdHlwZXMgKi8KIAotaW50IGlzZG5fbmV0X2ZvcmNlX2RpYWxfbHAoaXNkbl9uZXRfbG9jYWwgKik7CitzdGF0aWMgaW50IGlzZG5fbmV0X2ZvcmNlX2RpYWxfbHAoaXNkbl9uZXRfbG9jYWwgKik7CiBzdGF0aWMgaW50IGlzZG5fbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CiAKIHN0YXRpYyB2b2lkIGlzZG5fbmV0X2Npc2NvaGRsY2tfY29ubmVjdGVkKGlzZG5fbmV0X2xvY2FsICpscCk7CkBAIC0zMTIsNyArMzEyLDcgQEAKICAqIFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV2ZXJ5IHNlY29uZCwgc2ltcGx5IHJlc2V0IHRoZQogICogYnl0ZS1jb3VudGVyIG9mIHRoZSBpbnRlcmZhY2UgYWZ0ZXIgY29weWluZyBpdCB0byB0aGUgY3BzLXZhcmlhYmxlLgogICovCi11bnNpZ25lZCBsb25nIGxhc3RfamlmZmllcyA9IC1IWjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllcyA9IC1IWjsKIAogdm9pZAogaXNkbl9uZXRfYXV0b2h1cCh2b2lkKQpAQCAtMTEzMSw3ICsxMTMxLDcgQEAKIH0KIAogCi12b2lkIGlzZG5fbmV0X3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKiBuZGV2KQorc3RhdGljIHZvaWQgaXNkbl9uZXRfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqIG5kZXYpCiB7CiAJaXNkbl9uZXRfbG9jYWwgKmxwID0gKGlzZG5fbmV0X2xvY2FsICopIG5kZXYtPnByaXY7CiAKQEAgLTE0MjQsNyArMTQyNCw3IEBACiB9CiAKIC8qIGNpc2NvIGhkbGNrIGRldmljZSBwcml2YXRlIGlvY3RscyAqLwotaW50CitzdGF0aWMgaW50CiBpc2RuX2Npc2NvaGRsY2tfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewogCWlzZG5fbmV0X2xvY2FsICpscCA9IChpc2RuX25ldF9sb2NhbCAqKSBkZXYtPnByaXY7CkBAIC0yNDYxLDcgKzI0NjEsNyBAQAogICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgdXNlcmxldmVsLXJvdXRpbmUgYmVsb3cgb3IKICAqIGZyb20gaXNkbl9uZXRfc3RhcnRfeG1pdCgpLgogICovCi1pbnQKK3N0YXRpYyBpbnQKIGlzZG5fbmV0X2ZvcmNlX2RpYWxfbHAoaXNkbl9uZXRfbG9jYWwgKiBscCkKIHsKIAlpZiAoKCEobHAtPmZsYWdzICYgSVNETl9ORVRfQ09OTkVDVEVEKSkgJiYgIWxwLT5kaWFsc3RhdGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuYwppbmRleCBlMjEwMDdlLi5iMzdlZjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmMKKysrIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGlzZG5fdHR5X2NsZWFudXBfeG1pdChtb2RlbV9pbmZvICogaW5mbykKIHsKIAlza2JfcXVldWVfcHVyZ2UoJmluZm8tPnhtaXRfcXVldWUpOwpAQCAtNTYwLDcgKzU2MCw3IEBACiAvKgogICogcmV0dXJuIHRoZSB1c2FnZSBjYWxjdWxhdGVkIGJ5IHNpIGFuZCBsYXllciAyIHByb3RvY29sCiAgKi8KLWludAorc3RhdGljIGludAogaXNkbl9jYWxjX3VzYWdlKGludCBzaSwgaW50IGwyKQogewogCWludCB1c2cgPSBJU0ROX1VTQUdFX01PREVNOwpAQCAtMTIyMyw3ICsxMjIzLDcgQEAKIAkJdG90YWwgKz0gYzsKIAl9CiAJYXRvbWljX2RlYygmaW5mby0+eG1pdF9sb2NrKTsKLQlpZiAoKGluZm8tPnhtaXRfY291bnQpIHx8IChza2JfcXVldWVfbGVuKCZpbmZvLT54bWl0X3F1ZXVlKSkpIHsKKwlpZiAoKGluZm8tPnhtaXRfY291bnQpIHx8ICFza2JfcXVldWVfZW1wdHkoJmluZm8tPnhtaXRfcXVldWUpKSB7CiAJCWlmIChtLT5tZG1yZWdbUkVHX0RYTVRdICYgQklUX0RYTVQpIHsKIAkJCWlzZG5fdHR5X3NlbmRkb3duKGluZm8pOwogCQkJaXNkbl90dHlfdGludChpbmZvKTsKQEAgLTEyODQsNyArMTI4NCw3IEBACiAKIAlpZiAoaXNkbl90dHlfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiaXNkbl90dHlfZmx1c2hfY2hhcnMiKSkKIAkJcmV0dXJuOwotCWlmICgoaW5mby0+eG1pdF9jb3VudCkgfHwgKHNrYl9xdWV1ZV9sZW4oJmluZm8tPnhtaXRfcXVldWUpKSkKKwlpZiAoKGluZm8tPnhtaXRfY291bnQpIHx8ICFza2JfcXVldWVfZW1wdHkoJmluZm8tPnhtaXRfcXVldWUpKQogCQlpc2RuX3RpbWVyX2N0cmwoSVNETl9USU1FUl9NT0RFTVhNSVQsIDEpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmggYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5LmgKaW5kZXggMjQyM2E3Zi4uOWYwZmE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eS5oCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHkuaApAQCAtMTA5LDcgKzEwOSw2IEBACiBleHRlcm4gdm9pZCBpc2RuX3R0eV9leGl0KHZvaWQpOwogZXh0ZXJuIHZvaWQgaXNkbl90dHlfcmVhZG1vZGVtKHZvaWQpOwogZXh0ZXJuIGludCAgaXNkbl90dHlfZmluZF9pY2FsbChpbnQsIGludCwgc2V0dXBfcGFybSAqKTsKLWV4dGVybiB2b2lkIGlzZG5fdHR5X2NsZWFudXBfeG1pdChtb2RlbV9pbmZvICopOwogZXh0ZXJuIGludCAgaXNkbl90dHlfc3RhdF9jYWxsYmFjayhpbnQsIGlzZG5fY3RybCAqKTsKIGV4dGVybiBpbnQgIGlzZG5fdHR5X3Jjdl9za2IoaW50LCBpbnQsIGludCwgc3RydWN0IHNrX2J1ZmYgKik7CiBleHRlcm4gaW50ICBpc2RuX3R0eV9jYXBpX2ZhY2lsaXR5KGNhcGlfbXNnICpjbSk7IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eWZheC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3R0eWZheC5jCmluZGV4IGNlMmMzZWYuLmE5NDNkMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl90dHlmYXguYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fdHR5ZmF4LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCX0KIH0KIAotaW50CitzdGF0aWMgaW50CiBpc2RuX3R0eV9mYXhfY29tbWFuZDEobW9kZW1faW5mbyAqIGluZm8sIGlzZG5fY3RybCAqIGMpCiB7CiAJc3RhdGljIGNoYXIgKm1zZ1tdID0KQEAgLTMxNiw3ICszMTYsNyBAQAogICogUGFyc2UgQVQrRi4uIEZBWCBjbGFzcyAxIGNvbW1hbmRzCiAgKi8KIAotaW50CitzdGF0aWMgaW50CiBpc2RuX3R0eV9jbWRfRkNMQVNTMShjaGFyICoqcCwgbW9kZW1faW5mbyAqIGluZm8pCiB7CiAJc3RhdGljIGNoYXIgKmNtZFtdID0KQEAgLTQwOCw3ICs0MDgsNyBAQAogICogUGFyc2UgQVQrRi4uIEZBWCBjbGFzcyAyIGNvbW1hbmRzCiAgKi8KIAotaW50CitzdGF0aWMgaW50CiBpc2RuX3R0eV9jbWRfRkNMQVNTMihjaGFyICoqcCwgbW9kZW1faW5mbyAqIGluZm8pCiB7CiAJYXRlbXUgKm0gPSAmaW5mby0+ZW11OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX3gyNWlmYWNlLmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5feDI1aWZhY2UuYwppbmRleCA0YWI3NjAwLi5lZGYxNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5feDI1aWZhY2UuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5feDI1aWZhY2UuYwpAQCAtNDAsMTUgKzQwLDE1IEBACiAKIAogLyogaXMgbm93IGluIGhlYWRlciBmaWxlIChleHRlcm4pOiBzdHJ1Y3QgY29uY2FwX3Byb3RvICogaXNkbl94MjVpZmFjZV9wcm90b19uZXcodm9pZCk7ICovCi12b2lkIGlzZG5feDI1aWZhY2VfcHJvdG9fZGVsKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICogKTsKLWludCBpc2RuX3gyNWlmYWNlX3Byb3RvX2Nsb3NlKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICogKTsKLWludCBpc2RuX3gyNWlmYWNlX3Byb3RvX3Jlc3RhcnQoIHN0cnVjdCBjb25jYXBfcHJvdG8gKiwKLQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKiwKLQkJCQkgc3RydWN0IGNvbmNhcF9kZXZpY2Vfb3BzICopOwotaW50IGlzZG5feDI1aWZhY2VfeG1pdCggc3RydWN0IGNvbmNhcF9wcm90byAqLCBzdHJ1Y3Qgc2tfYnVmZiAqICk7Ci1pbnQgaXNkbl94MjVpZmFjZV9yZWNlaXZlKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICosIHN0cnVjdCBza19idWZmICogKTsKLWludCBpc2RuX3gyNWlmYWNlX2Nvbm5lY3RfaW5kKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICogKTsKLWludCBpc2RuX3gyNWlmYWNlX2Rpc2Nvbm5faW5kKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICogKTsKK3N0YXRpYyB2b2lkIGlzZG5feDI1aWZhY2VfcHJvdG9fZGVsKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICogKTsKK3N0YXRpYyBpbnQgaXNkbl94MjVpZmFjZV9wcm90b19jbG9zZSggc3RydWN0IGNvbmNhcF9wcm90byAqICk7CitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfcHJvdG9fcmVzdGFydCggc3RydWN0IGNvbmNhcF9wcm90byAqLAorCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCQlzdHJ1Y3QgY29uY2FwX2RldmljZV9vcHMgKik7CitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfeG1pdCggc3RydWN0IGNvbmNhcF9wcm90byAqLCBzdHJ1Y3Qgc2tfYnVmZiAqICk7CitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfcmVjZWl2ZSggc3RydWN0IGNvbmNhcF9wcm90byAqLCBzdHJ1Y3Qgc2tfYnVmZiAqICk7CitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfY29ubmVjdF9pbmQoIHN0cnVjdCBjb25jYXBfcHJvdG8gKiApOworc3RhdGljIGludCBpc2RuX3gyNWlmYWNlX2Rpc2Nvbm5faW5kKCBzdHJ1Y3QgY29uY2FwX3Byb3RvICogKTsKIAogCiBzdGF0aWMgc3RydWN0IGNvbmNhcF9wcm90b19vcHMgaXgyNV9wb3BzID0gewpAQCAtMTAyLDcgKzEwMiw3IEBACiAKIC8qIGNsb3NlIHRoZSB4MjVpZmFjZSBlbmNhcHN1bGF0aW9uIHByb3RvY29sIAogICovCi1pbnQgaXNkbl94MjVpZmFjZV9wcm90b19jbG9zZShzdHJ1Y3QgY29uY2FwX3Byb3RvICpjcHJvdCl7CitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfcHJvdG9fY2xvc2Uoc3RydWN0IGNvbmNhcF9wcm90byAqY3Byb3QpewogCiAJaXgyNV9wZGF0YV90ICp0bXA7CiAgICAgICAgIGludCByZXQgPSAwOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAKIC8qIERlbGV0ZSB0aGUgeDI1aWZhY2UgZW5jYXBzdWxhdGlvbiBwcm90b2NvbCBpbnN0YW5jZQogICovCi12b2lkIGlzZG5feDI1aWZhY2VfcHJvdG9fZGVsKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90KXsKK3N0YXRpYyB2b2lkIGlzZG5feDI1aWZhY2VfcHJvdG9fZGVsKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90KXsKIAogCWl4MjVfcGRhdGFfdCAqIHRtcDsKICAKQEAgLTE1OCw5ICsxNTgsOSBAQAogCiAvKiAocmUtKWluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgeDI1aWZhY2UgZW5jYXBzdWxhdGlvbgogICovCi1pbnQgaXNkbl94MjVpZmFjZV9wcm90b19yZXN0YXJ0KHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90LAotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCAKLQkJCQlzdHJ1Y3QgY29uY2FwX2RldmljZV9vcHMgKmRvcHMpCitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfcHJvdG9fcmVzdGFydChzdHJ1Y3QgY29uY2FwX3Byb3RvICpjcHJvdCwKKwkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJCXN0cnVjdCBjb25jYXBfZGV2aWNlX29wcyAqZG9wcykKIHsKIAlpeDI1X3BkYXRhX3QgKiBwZGEgPSBjcHJvdCAtPiBwcm90b19kYXRhIDsKIAl1bG9uZyBmbGFnczsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiAvKiBkZWxpdmVyIGEgZGxfZGF0YSBmcmFtZSByZWNlaXZlZCBmcm9tIGk0bCBITCBkcml2ZXIgdG8gdGhlIG5ldHdvcmsgbGF5ZXIgCiAgKi8KLWludCBpc2RuX3gyNWlmYWNlX3JlY2VpdmUoc3RydWN0IGNvbmNhcF9wcm90byAqY3Byb3QsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfcmVjZWl2ZShzdHJ1Y3QgY29uY2FwX3Byb3RvICpjcHJvdCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKICAgCUlYMjVERUJVRyggImlzZG5feDI1aWZhY2VfcmVjZWl2ZSAlcyBcbiIsIE1ZX0RFVk5BTUUoY3Byb3QtPm5ldF9kZXYpICk7CiAJaWYgKCAoIChpeDI1X3BkYXRhX3QqKSAoY3Byb3QtPnByb3RvX2RhdGEpICkgCkBAIC0yMDYsNyArMjA2LDcgQEAKIAogLyogYSBjb25uZWN0aW9uIHNldCB1cCBpcyBpbmRpY2F0ZWQgYnkgbG93ZXIgbGF5ZXIgCiAgKi8KLWludCBpc2RuX3gyNWlmYWNlX2Nvbm5lY3RfaW5kKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90KQorc3RhdGljIGludCBpc2RuX3gyNWlmYWNlX2Nvbm5lY3RfaW5kKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90KQogewogCXN0cnVjdCBza19idWZmICogc2tiID0gZGV2X2FsbG9jX3NrYigxKTsKIAllbnVtIHdhbl9zdGF0ZXMgKnN0YXRlX3AgCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkKIC8qIGEgZGlzY29ubmVjdCBpcyBpbmRpY2F0ZWQgYnkgbG93ZXIgbGF5ZXIgCiAgKi8KLWludCBpc2RuX3gyNWlmYWNlX2Rpc2Nvbm5faW5kKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90KQorc3RhdGljIGludCBpc2RuX3gyNWlmYWNlX2Rpc2Nvbm5faW5kKHN0cnVjdCBjb25jYXBfcHJvdG8gKmNwcm90KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJZW51bSB3YW5fc3RhdGVzICpzdGF0ZV9wIApAQCAtMjY0LDcgKzI2NCw3IEBACiAvKiBwcm9jZXNzIGEgZnJhbWUgaGFuZGVkIG92ZXIgdG8gdXMgZnJvbSBsaW51eCBuZXR3b3JrIGxheWVyLiBGaXJzdCBieXRlCiAgICBzZW1hbnRpY3MgYXMgZGVmaW5lZCBpbiBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcveDI1LWlmYWNlLnR4dAogICAgKi8KLWludCBpc2RuX3gyNWlmYWNlX3htaXQoc3RydWN0IGNvbmNhcF9wcm90byAqY3Byb3QsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGlzZG5feDI1aWZhY2VfeG1pdChzdHJ1Y3QgY29uY2FwX3Byb3RvICpjcHJvdCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1bnNpZ25lZCBjaGFyIGZpcnN0Ynl0ZSA9IHNrYi0+ZGF0YVswXTsKIAllbnVtIHdhbl9zdGF0ZXMgKnN0YXRlID0gJigoaXgyNV9wZGF0YV90KiljcHJvdC0+cHJvdG9fZGF0YSktPnN0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2ljbi9pY24uYyBiL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMKaW5kZXggOWZjMGMxZS4uZTBkMWIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2ljbi9pY24uYworKysgYi9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jCkBAIC0zMDQsMTIgKzMwNCwxMiBAQAogCWlzZG5fY3RybCBjbWQ7CiAKIAlpZiAoIShjYXJkLT5zbmRjb3VudFtjaGFubmVsXSB8fCBjYXJkLT54c2tiW2NoYW5uZWxdIHx8Ci0JICAgICAgc2tiX3F1ZXVlX2xlbigmY2FyZC0+c3BxdWV1ZVtjaGFubmVsXSkpKQorCSAgICAgICFza2JfcXVldWVfZW1wdHkoJmNhcmQtPnNwcXVldWVbY2hhbm5lbF0pKSkKIAkJcmV0dXJuOwogCWlmIChpY25fdHJ5bWFwbG9ja19jaGFubmVsKGNhcmQsIG1jaCkpIHsKIAkJd2hpbGUgKHNiZnJlZSAmJiAKIAkJICAgICAgIChjYXJkLT5zbmRjb3VudFtjaGFubmVsXSB8fAotCQkJc2tiX3F1ZXVlX2xlbigmY2FyZC0+c3BxdWV1ZVtjaGFubmVsXSkgfHwKKwkJCSFza2JfcXVldWVfZW1wdHkoJmNhcmQtPnNwcXVldWVbY2hhbm5lbF0pIHx8CiAJCQljYXJkLT54c2tiW2NoYW5uZWxdKSkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJCWlmIChjYXJkLT54bWl0X2xvY2tbY2hhbm5lbF0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9wY2JpdC9jYWxsYmFja3MuYyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9jYWxsYmFja3MuYwppbmRleCA2OTJlYzcyLi5mMTUxZjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vcGNiaXQvY2FsbGJhY2tzLmMKKysrIGIvZHJpdmVycy9pc2RuL3BjYml0L2NhbGxiYWNrcy5jCkBAIC0xMjUsMjMgKzEyNSw2IEBACiAKIAogLyoKLSAqIERpc2Nvbm5lY3QgcmVjZWl2ZWQgKGFjdHVhbGx5IFJFTEVBU0UgQ09NUExFVEUpIAotICogVGhpcyBtZWFucyB3ZSB3ZXJlIG5vdCBhYmxlIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIHdpdGggcmVtb3RlCi0gKiBJbmZvcm0gdGhlIGJpZyBib3NzIGFib3ZlCi0gKi8KLXZvaWQgY2Jfb3V0XzMoc3RydWN0IHBjYml0X2RldiAqIGRldiwgc3RydWN0IHBjYml0X2NoYW4qIGNoYW4sCi0JICAgICAgc3RydWN0IGNhbGxiX2RhdGEgKmRhdGEpIAotewotICAgICAgICBpc2RuX2N0cmwgaWN0bDsKLQotICAgICAgICBpY3RsLmNvbW1hbmQgPSBJU0ROX1NUQVRfREhVUDsKLSAgICAgICAgaWN0bC5kcml2ZXI9ZGV2LT5pZDsKLSAgICAgICAgaWN0bC5hcmc9Y2hhbi0+aWQ7Ci0gICAgICAgIGRldi0+ZGV2X2lmLT5zdGF0Y2FsbGIoJmljdGwpOwotfQotCi0KLS8qCiAgKiBJbmNvbWluZyBjYWxsIHJlY2VpdmVkCiAgKiBpbmZvcm0gdXNlcgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vcGNiaXQvY2FsbGJhY2tzLmggYi9kcml2ZXJzL2lzZG4vcGNiaXQvY2FsbGJhY2tzLmgKaW5kZXggZjUxMGRjNS4uMTdhYTBmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3BjYml0L2NhbGxiYWNrcy5oCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9jYWxsYmFja3MuaApAQCAtMTksOSArMTksNiBAQAogZXh0ZXJuIHZvaWQgY2Jfb3V0XzIoc3RydWN0IHBjYml0X2RldiAqIGRldiwgc3RydWN0IHBjYml0X2NoYW4qIGNoYW4sIAogCQkgICAgIHN0cnVjdCBjYWxsYl9kYXRhICpkYXRhKTsKIAotZXh0ZXJuIHZvaWQgY2Jfb3V0XzMoc3RydWN0IHBjYml0X2RldiAqIGRldiwgc3RydWN0IHBjYml0X2NoYW4qIGNoYW4sIAotCQkgICAgIHN0cnVjdCBjYWxsYl9kYXRhICpkYXRhKTsKLQogZXh0ZXJuIHZvaWQgY2JfaW5fMShzdHJ1Y3QgcGNiaXRfZGV2ICogZGV2LCBzdHJ1Y3QgcGNiaXRfY2hhbiogY2hhbiwgCiAJCSAgICBzdHJ1Y3QgY2FsbGJfZGF0YSAqZGF0YSk7CiBleHRlcm4gdm9pZCBjYl9pbl8yKHN0cnVjdCBwY2JpdF9kZXYgKiBkZXYsIHN0cnVjdCBwY2JpdF9jaGFuKiBjaGFuLCAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9wY2JpdC9jYXBpLmMgYi9kcml2ZXJzL2lzZG4vcGNiaXQvY2FwaS5jCmluZGV4IDI5ZWIwM2EuLmJlZjMyMWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vcGNiaXQvY2FwaS5jCisrKyBiL2RyaXZlcnMvaXNkbi9wY2JpdC9jYXBpLmMKQEAgLTYyNywxNiArNjI3LDYgQEAKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBjYXBpX2RlY29kZV9kaXNjX2NvbmYoc3RydWN0IHBjYml0X2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgICAgIHVzaG9ydCBlcnJjb2RlOwotCi0gICAgICAgIGVycmNvZGUgPSAqKCh1c2hvcnQqKSBza2ItPmRhdGEpOwotICAgICAgICBza2JfcHVsbChza2IsIDIpOwotCi0gICAgICAgIHJldHVybiBlcnJjb2RlOyAgICAgICAgICAgICAgICAKLX0KLQogI2lmZGVmIERFQlVHCiBpbnQgY2FwaV9kZWNvZGVfZGVidWdfMTg4KHVfY2hhciAqaGRyLCB1c2hvcnQgaGRybGVuKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3BjYml0L2NhcGkuaCBiL2RyaXZlcnMvaXNkbi9wY2JpdC9jYXBpLmgKaW5kZXggMThlNmFhMy4uZGY4ZTczYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3BjYml0L2NhcGkuaAorKysgYi9kcml2ZXJzL2lzZG4vcGNiaXQvY2FwaS5oCkBAIC01NCw3ICs1NCw2IEBACiAKIC8qIENvbm5lY3Rpb24gVGVybWluYXRpb24gKi8KIGV4dGVybiBpbnQgY2FwaV9kaXNjX3JlcSh1c2hvcnQgY2FsbHJlZiwgc3RydWN0IHNrX2J1ZmYgKipza2IsIHVfY2hhciBjYXVzZSk7Ci1leHRlcm4gaW50IGNhcGlfZGVjb2RlX2Rpc2NfY29uZihzdHJ1Y3QgcGNiaXRfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGV4dGVybiBpbnQgY2FwaV9kZWNvZGVfZGlzY19pbmQoc3RydWN0IHBjYml0X2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludCBjYXBpX2Rpc2NfcmVzcChzdHJ1Y3QgcGNiaXRfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKipza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jIGIvZHJpdmVycy9pc2RuL3BjYml0L2Rydi5jCmluZGV4IGU5OGY5YzQuLjVkZTg2MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9wY2JpdC9kcnYuYworKysgYi9kcml2ZXJzL2lzZG4vcGNiaXQvZHJ2LmMKQEAgLTU2LDEwICs1NiwxMCBAQAogICogcHJvdG90eXBlcwogICovCiAKLWludCBwY2JpdF9jb21tYW5kKGlzZG5fY3RybCogY3RsKTsKLWludCBwY2JpdF9zdGF0KHVfY2hhciBfX3VzZXIgKiBidWYsIGludCBsZW4sIGludCwgaW50KTsKLWludCBwY2JpdF94bWl0KGludCBkcml2ZXIsIGludCBjaGFuLCBpbnQgYWNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBwY2JpdF93cml0ZWNtZChjb25zdCB1X2NoYXIgX191c2VyICosIGludCwgaW50LCBpbnQpOworc3RhdGljIGludCBwY2JpdF9jb21tYW5kKGlzZG5fY3RybCogY3RsKTsKK3N0YXRpYyBpbnQgcGNiaXRfc3RhdCh1X2NoYXIgX191c2VyICogYnVmLCBpbnQgbGVuLCBpbnQsIGludCk7CitzdGF0aWMgaW50IHBjYml0X3htaXQoaW50IGRyaXZlciwgaW50IGNoYW4sIGludCBhY2ssIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBwY2JpdF93cml0ZWNtZChjb25zdCB1X2NoYXIgX191c2VyICosIGludCwgaW50LCBpbnQpOwogCiBzdGF0aWMgaW50IHNldF9wcm90b2NvbF9ydW5uaW5nKHN0cnVjdCBwY2JpdF9kZXYgKiBkZXYpOwogCkBAIC0yMzgsNyArMjM4LDcgQEAKIH0KICNlbmRpZgogCi1pbnQgcGNiaXRfY29tbWFuZChpc2RuX2N0cmwqIGN0bCkKK3N0YXRpYyBpbnQgcGNiaXRfY29tbWFuZChpc2RuX2N0cmwqIGN0bCkKIHsKIAlzdHJ1Y3QgcGNiaXRfZGV2ICAqZGV2OwogCXN0cnVjdCBwY2JpdF9jaGFuICpjaGFuOwpAQCAtMzMwLDcgKzMzMCw3IEBACiB9CiAjZW5kaWYKIAotaW50IHBjYml0X3htaXQoaW50IGRyaXZlciwgaW50IGNobnVtLCBpbnQgYWNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBwY2JpdF94bWl0KGludCBkcml2ZXIsIGludCBjaG51bSwgaW50IGFjaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1c2hvcnQgaGRybGVuOwogCWludCByZWZudW0sIGxlbjsKQEAgLTM4OSw3ICszODksNyBAQAogCXJldHVybiBsZW47CiB9CiAKLWludCBwY2JpdF93cml0ZWNtZChjb25zdCB1X2NoYXIgX191c2VyICpidWYsIGludCBsZW4sIGludCBkcml2ZXIsIGludCBjaGFubmVsKQorc3RhdGljIGludCBwY2JpdF93cml0ZWNtZChjb25zdCB1X2NoYXIgX191c2VyICpidWYsIGludCBsZW4sIGludCBkcml2ZXIsIGludCBjaGFubmVsKQogewogCXN0cnVjdCBwY2JpdF9kZXYgKiBkZXY7CiAJaW50IGksIGo7CkBAIC03MTMsNyArNzEzLDcgQEAKIHN0YXRpYyBpbnQgc3RhdF9zdCA9IDA7CiBzdGF0aWMgaW50IHN0YXRfZW5kID0gMDsKIAotaW50IHBjYml0X3N0YXQodV9jaGFyIF9fdXNlciAqYnVmLCBpbnQgbGVuLCBpbnQgZHJpdmVyLCBpbnQgY2hhbm5lbCkKK3N0YXRpYyBpbnQgcGNiaXRfc3RhdCh1X2NoYXIgX191c2VyICpidWYsIGludCBsZW4sIGludCBkcml2ZXIsIGludCBjaGFubmVsKQogewogCWludCBzdGF0X2NvdW50OwogCXN0YXRfY291bnQgPSBzdGF0X2VuZCAtIHN0YXRfc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvTWFrZWZpbGUgYi9kcml2ZXJzL2lzZG4vc2MvTWFrZWZpbGUKaW5kZXggOWNjNDc0Yy4uMGYyYjdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3NjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9NYWtlZmlsZQpAQCAtNiw1ICs2LDUgQEAKIAogIyBNdWx0aXBhcnQgb2JqZWN0cy4KIAotc2MteQkJCQk6PSBzaG1lbS5vIGluaXQubyBkZWJ1Zy5vIHBhY2tldC5vIGNvbW1hbmQubyBldmVudC5vIFwKK3NjLXkJCQkJOj0gc2htZW0ubyBpbml0Lm8gcGFja2V0Lm8gY29tbWFuZC5vIGV2ZW50Lm8gXAogCQkgICAJCSAgIGlvY3RsLm8gaW50ZXJydXB0Lm8gbWVzc2FnZS5vIHRpbWVyLm8JCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvY29tbWFuZC5jIGIvZHJpdmVycy9pc2RuL3NjL2NvbW1hbmQuYwppbmRleCBiMmM0ZWFjLi4xOWYyZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvY29tbWFuZC5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9jb21tYW5kLmMKQEAgLTIyLDE0ICsyMiwxNCBAQAogI2luY2x1ZGUgImNhcmQuaCIKICNpbmNsdWRlICJzY2lvYy5oIgogCi1pbnQgZGlhbChpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsLCBzZXR1cF9wYXJtIHNldHVwKTsKLWludCBoYW5ndXAoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbCk7Ci1pbnQgYW5zd2VyKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGNoYW5uZWwpOwotaW50IGNscmVheihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsKTsKLWludCBzZXRlYXooaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbCwgY2hhciAqKTsKLWludCBzZXRsMihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotaW50IHNldGwzKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1pbnQgYWNjZXB0YihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsKTsKK3N0YXRpYyBpbnQgZGlhbChpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsLCBzZXR1cF9wYXJtIHNldHVwKTsKK3N0YXRpYyBpbnQgaGFuZ3VwKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGNoYW5uZWwpOworc3RhdGljIGludCBhbnN3ZXIoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbCk7CitzdGF0aWMgaW50IGNscmVheihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsKTsKK3N0YXRpYyBpbnQgc2V0ZWF6KGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGNoYW5uZWwsIGNoYXIgKik7CitzdGF0aWMgaW50IHNldGwyKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IHNldGwzKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGFjY2VwdGIoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbCk7CiAKIGV4dGVybiBpbnQgY2luc3Q7CiBleHRlcm4gYm9hcmQgKnNjX2FkYXB0ZXJbXTsKQEAgLTE0OCw1NiArMTQ4LDYgQEAKIH0KIAogLyoKLSAqIENvbmZpcm0gb3VyIGFiaWxpdHkgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYm9hcmQuICBUaGlzIHRlc3QgYXNzdW1lcyBubwotICogb3RoZXIgbWVzc2FnZSBhY3Rpdml0eSBpcyBwcmVzZW50Ci0gKi8KLWludCBsb29wYmFjayhpbnQgY2FyZCkgCi17Ci0KLQlpbnQgc3RhdHVzOwotCXN0YXRpYyBjaGFyIHRlc3Rtc2dbXSA9ICJUZXN0IE1lc3NhZ2UiOwotCVJzcE1lc3NhZ2UgcnNwbXNnOwotCi0JaWYoIUlTX1ZBTElEX0NBUkQoY2FyZCkpIHsKLQkJcHJfZGVidWcoIkludmFsaWQgcGFyYW06ICVkIGlzIG5vdCBhIHZhbGlkIGNhcmQgaWRcbiIsIGNhcmQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlwcl9kZWJ1ZygiJXM6IFNlbmRpbmcgbG9vcGJhY2sgbWVzc2FnZVxuIiwKLQkJc2NfYWRhcHRlcltjYXJkXS0+ZGV2aWNlbmFtZSk7Ci0KLQkvKgotCSAqIFNlbmQgdGhlIGxvb3BiYWNrIG1lc3NhZ2UgdG8gY29uZmlybSB0aGF0IG1lbW9yeSB0cmFuc2ZlciBpcwotCSAqIG9wZXJhdGlvbmFsCi0JICovCi0Jc3RhdHVzID0gc2VuZF9hbmRfcmVjZWl2ZShjYXJkLCBDTVBJRCwgY21SZXFUeXBlMSwKLQkJCQkgIGNtUmVxQ2xhc3MwLAotCQkJCSAgY21SZXFNc2dMcGJrLAotCQkJCSAgMCwKLQkJCQkgICh1bnNpZ25lZCBjaGFyKSBzdHJsZW4odGVzdG1zZyksCi0JCQkJICAodW5zaWduZWQgY2hhciAqKXRlc3Rtc2csCi0JCQkJICAmcnNwbXNnLCBTQVJfVElNRU9VVCk7Ci0KLQotCWlmICghc3RhdHVzKSB7Ci0JCXByX2RlYnVnKCIlczogTG9vcGJhY2sgbWVzc2FnZSBzdWNjZXNzZnVsbHkgc2VudFxuIiwKLQkJCXNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUpOwotCQlpZihzdHJjbXAocnNwbXNnLm1zZ19kYXRhLmJ5dGVfYXJyYXksIHRlc3Rtc2cpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IExvb3BiYWNrIHJldHVybiAhPSBzZW50XG4iLAotCQkJCXNjX2FkYXB0ZXJbY2FyZF0tPmRldmljZW5hbWUpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQlwcl9kZWJ1ZygiJXM6IFNlbmQgbG9vcGJhY2sgbWVzc2FnZSBmYWlsZWRcbiIsCi0JCQlzY19hZGFwdGVyW2NhcmRdLT5kZXZpY2VuYW1lKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi19Ci0KLS8qCiAgKiBzdGFydCB0aGUgb25ib2FyZCBmaXJtd2FyZQogICovCiBpbnQgc3RhcnRwcm9jKGludCBjYXJkKSAKQEAgLTIyMiwxNiArMTcyLDEwIEBACiB9CiAKIAotaW50IGxvYWRwcm9jKGludCBjYXJkLCBjaGFyICpkYXRhKSAKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLQogLyoKICAqIERpYWxzIHRoZSBudW1iZXIgcGFzc2VkIGluIAogICovCi1pbnQgZGlhbChpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsLCBzZXR1cF9wYXJtIHNldHVwKSAKK3N0YXRpYyBpbnQgZGlhbChpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsLCBzZXR1cF9wYXJtIHNldHVwKQogewogCWludCBzdGF0dXM7CiAJY2hhciBQaG9uZVs0OF07CkBAIC0yNjEsNyArMjA1LDcgQEAKIC8qCiAgKiBBbnN3ZXIgYW4gaW5jb21pbmcgY2FsbCAKICAqLwotaW50IGFuc3dlcihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsKSAKK3N0YXRpYyBpbnQgYW5zd2VyKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGNoYW5uZWwpCiB7CiAJaWYoIUlTX1ZBTElEX0NBUkQoY2FyZCkpIHsKIAkJcHJfZGVidWcoIkludmFsaWQgcGFyYW06ICVkIGlzIG5vdCBhIHZhbGlkIGNhcmQgaWRcbiIsIGNhcmQpOwpAQCAtMjgyLDcgKzIyNiw3IEBACiAvKgogICogSGFuZ3VwIHVwIHRoZSBjYWxsIG9uIHNwZWNpZmllZCBjaGFubmVsCiAgKi8KLWludCBoYW5ndXAoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkgCitzdGF0aWMgaW50IGhhbmd1cChpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsKQogewogCWludCBzdGF0dXM7CiAKQEAgLTMwNSw3ICsyNDksNyBAQAogLyoKICAqIFNldCB0aGUgbGF5ZXIgMiBwcm90b2NvbCAoWC4yNSwgSERMQywgUmF3KQogICovCi1pbnQgc2V0bDIoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgYXJnKSAKK3N0YXRpYyBpbnQgc2V0bDIoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCBzdGF0dXMgPTA7CiAJaW50IHByb3RvY29sLGNoYW5uZWw7CkBAIC0zNDAsNyArMjg0LDcgQEAKIC8qCiAgKiBTZXQgdGhlIGxheWVyIDMgcHJvdG9jb2wKICAqLwotaW50IHNldGwzKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGNoYW5uZWwpIAorc3RhdGljIGludCBzZXRsMyhpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBjaGFubmVsKQogewogCWludCBwcm90b2NvbCA9IGNoYW5uZWwgPj4gODsKIApAQCAtMzU1LDcgKzI5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhY2NlcHRiKGludCBjYXJkLCB1bnNpZ25lZCBsb25nIGNoYW5uZWwpCitzdGF0aWMgaW50IGFjY2VwdGIoaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbCkKIHsKIAlpZighSVNfVkFMSURfQ0FSRChjYXJkKSkgewogCQlwcl9kZWJ1ZygiSW52YWxpZCBwYXJhbTogJWQgaXMgbm90IGEgdmFsaWQgY2FyZCBpZFxuIiwgY2FyZCk7CkBAIC0zNzQsNyArMzE4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNscmVheihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGNscmVheihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaWYoIUlTX1ZBTElEX0NBUkQoY2FyZCkpIHsKIAkJcHJfZGVidWcoIkludmFsaWQgcGFyYW06ICVkIGlzIG5vdCBhIHZhbGlkIGNhcmQgaWRcbiIsIGNhcmQpOwpAQCAtMzg4LDcgKzMzMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzZXRlYXooaW50IGNhcmQsIHVuc2lnbmVkIGxvbmcgYXJnLCBjaGFyICpudW0pCitzdGF0aWMgaW50IHNldGVheihpbnQgY2FyZCwgdW5zaWduZWQgbG9uZyBhcmcsIGNoYXIgKm51bSkKIHsKIAlpZighSVNfVkFMSURfQ0FSRChjYXJkKSkgewogCQlwcl9kZWJ1ZygiSW52YWxpZCBwYXJhbTogJWQgaXMgbm90IGEgdmFsaWQgY2FyZCBpZFxuIiwgY2FyZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vc2MvZGVidWcuYyBiL2RyaXZlcnMvaXNkbi9zYy9kZWJ1Zy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTk5MmE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaXNkbi9zYy9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogJElkOiBkZWJ1Zy5jLHYgMS41LjYuMSAyMDAxLzA5LzIzIDIyOjI0OjU5IGthaSBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiAgU3BlbGxDYXN0ZXIgVGVsZWNvbW11bmljYXRpb25zIEluYy4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCi0gKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgotICoKLSAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgY29udGFjdCBncGwtaW5mb0BzcGVsbGNhc3QuY29tIG9yIHdyaXRlOgotICoKLSAqICAgICBTcGVsbENhc3RlciBUZWxlY29tbXVuaWNhdGlvbnMgSW5jLgotICogICAgIDU2MjEgRmluY2ggQXZlbnVlIEVhc3QsIFVuaXQgIzMKLSAqICAgICBTY2FyYm9yb3VnaCwgT250YXJpbyAgQ2FuYWRhCi0gKiAgICAgTTFCIDJUOQotICogICAgICsxICg0MTYpIDI5Ny04NTY1Ci0gKiAgICAgKzEgKDQxNikgMjk3LTY0MzMgRmFjc2ltaWxlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotCi1pbnQgZGJnX2xldmVsID0gMDsKLXN0YXRpYyBjaGFyIGRiZ19mdW5jbmFtZVsyNTVdOwotCi12b2lkIGRiZ19lbmRmdW5jKHZvaWQpCi17Ci0JaWYgKGRiZ19sZXZlbCkgewotCQlwcmludGsoIjwtLSBMZWF2aW5nIGZ1bmN0aW9uICVzXG4iLCBkYmdfZnVuY25hbWUpOwotCQlzdHJjcHkoZGJnX2Z1bmNuYW1lLCAiIik7Ci0JfQotfQotCi12b2lkIGRiZ19mdW5jKGNoYXIgKmZ1bmMpCi17Ci0Jc3RyY3B5KGRiZ19mdW5jbmFtZSwgZnVuYyk7Ci0JaWYoZGJnX2xldmVsKQotCQlwcmludGsoIi0tPiBFbnRlcmluZyBmdW5jdGlvbiAlc1xuIiwgZGJnX2Z1bmNuYW1lKTsKLX0KLQotaW5saW5lIHZvaWQgcHVsbHBob25lKGNoYXIgKmRuLCBjaGFyICpzdHIpCi17Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUoZG5baV0gIT0gJywnKQotCQlzdHJbaV0gPSBkbltpXSwgaSsrOwotCXN0cltpXSA9IDB4MDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9pbml0LmMgYi9kcml2ZXJzL2lzZG4vc2MvaW5pdC5jCmluZGV4IGVmZWZlZGUuLjQwYjBkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9zYy9pbml0LmMKKysrIGIvZHJpdmVycy9pc2RuL3NjL2luaXQuYwpAQCAtMjAsOSArMjAsOSBAQAogaW50IGNpbnN0OwogCiBzdGF0aWMgY2hhciBkZXZuYW1lW10gPSAic2NYIjsKLWNvbnN0IGNoYXIgdmVyc2lvbltdID0gIjIuMGIxIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXSA9ICIyLjBiMSI7CiAKLWNvbnN0IGNoYXIgKmJvYXJkbmFtZVtdID0geyAiRGF0YUNvbW11dGUvQlJJIiwgIkRhdGFDb21tdXRlL1BSSSIsICJUZWxlQ29tbXV0ZS9CUkkiIH07CitzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRuYW1lW10gPSB7ICJEYXRhQ29tbXV0ZS9CUkkiLCAiRGF0YUNvbW11dGUvUFJJIiwgIlRlbGVDb21tdXRlL0JSSSIgfTsKIAogLyogaW5zbW9kIHNldCBwYXJhbWV0ZXJzICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGlvW10gPSB7MCwwLDAsMH07CkBAIC0zNSwyNiArMzUsMTMgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShyYW0sIGludCwgTlVMTCwgMCk7CiBtb2R1bGVfcGFyYW0oZG9fcmVzZXQsIGJvb2wsIDApOwogCi1zdGF0aWMgaW50IHN1cF9pcnFbXSA9IHsgMTEsIDEwLCA5LCA1LCAxMiwgMTQsIDcsIDMsIDQsIDYgfTsKLSNkZWZpbmUgTUFYX0lSUVMJMTAKLQogZXh0ZXJuIGlycXJldHVybl90IGludGVycnVwdF9oYW5kbGVyKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiBpbnQgc25kcGt0KGludCwgaW50LCBpbnQsIHN0cnVjdCBza19idWZmICopOwogZXh0ZXJuIGludCBjb21tYW5kKGlzZG5fY3RybCAqKTsKIGV4dGVybiBpbnQgaW5kaWNhdGVfc3RhdHVzKGludCwgaW50LCB1bG9uZywgY2hhciopOwogZXh0ZXJuIGludCByZXNldChpbnQpOwogCi1pbnQgaWRlbnRpZnlfYm9hcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50KTsKLQotaW50IGlycV9zdXBwb3J0ZWQoaW50IGlycV94KQotewotCWludCBpOwotCWZvcihpPTAgOyBpIDwgTUFYX0lSUVMgOyBpKyspIHsKLQkJaWYoc3VwX2lycVtpXSA9PSBpcnFfeCkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbnQgaWRlbnRpZnlfYm9hcmQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50KTsKIAogc3RhdGljIGludCBfX2luaXQgc2NfaW5pdCh2b2lkKQogewpAQCAtNDU0LDcgKzQ0MSw3IEBACiAJcHJfaW5mbygiU3BlbGxDYXN0ZXIgSVNBIElTRE4gQWRhcHRlciBEcml2ZXIgVW5sb2FkZWQuXG4iKTsKIH0KIAotaW50IGlkZW50aWZ5X2JvYXJkKHVuc2lnbmVkIGxvbmcgcmFtYmFzZSwgdW5zaWduZWQgaW50IGlvYmFzZSkgCitzdGF0aWMgaW50IGlkZW50aWZ5X2JvYXJkKHVuc2lnbmVkIGxvbmcgcmFtYmFzZSwgdW5zaWduZWQgaW50IGlvYmFzZSkKIHsKIAl1bnNpZ25lZCBpbnQgcGdwb3J0OwogCXVuc2lnbmVkIGxvbmcgc2lnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3NjL2ludGVycnVwdC5jIGIvZHJpdmVycy9pc2RuL3NjL2ludGVycnVwdC5jCmluZGV4IGU1ZTE2NGEuLjg2MzFkMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9zYy9pbnRlcnJ1cHQuYworKysgYi9kcml2ZXJzL2lzZG4vc2MvaW50ZXJydXB0LmMKQEAgLTMxLDcgKzMxLDcgQEAKIGV4dGVybiBpbnQgY2luc3Q7CiBleHRlcm4gYm9hcmQgKnNjX2FkYXB0ZXJbXTsKIAotaW50IGdldF9jYXJkX2Zyb21faXJxKGludCBpcnEpCitzdGF0aWMgaW50IGdldF9jYXJkX2Zyb21faXJxKGludCBpcnEpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9pb2N0bC5jIGIvZHJpdmVycy9pc2RuL3NjL2lvY3RsLmMKaW5kZXggMTM3MWE5OS4uMzMxNGE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3NjL2lvY3RsLmMKKysrIGIvZHJpdmVycy9pc2RuL3NjL2lvY3RsLmMKQEAgLTE0LDcgKzE0LDYgQEAKIAogZXh0ZXJuIGludCBpbmRpY2F0ZV9zdGF0dXMoaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcsIGNoYXIgKik7CiBleHRlcm4gaW50IHN0YXJ0cHJvYyhpbnQpOwotZXh0ZXJuIGludCBsb2FkcHJvYyhpbnQsIGNoYXIgKnJlY29yZCk7CiBleHRlcm4gaW50IHJlc2V0KGludCk7CiBleHRlcm4gaW50IHNlbmRfYW5kX3JlY2VpdmUoaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGNoYXIsdW5zaWduZWQgY2hhciwKIAkJdW5zaWduZWQgY2hhcix1bnNpZ25lZCBjaGFyLCAKQEAgLTIzLDcgKzIyLDcgQEAKIGV4dGVybiBib2FyZCAqc2NfYWRhcHRlcltdOwogCiAKLWludCBHZXRTdGF0dXMoaW50IGNhcmQsIGJvYXJkSW5mbyAqKTsKK3N0YXRpYyBpbnQgR2V0U3RhdHVzKGludCBjYXJkLCBib2FyZEluZm8gKik7CiAKIC8qCiAgKiBQcm9jZXNzIHByaXZhdGUgSU9DVEwgbWVzc2FnZXMgKHR5cGljYWxseSBmcm9tIHNjY3RybCkKQEAgLTQyOCw3ICs0MjcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgR2V0U3RhdHVzKGludCBjYXJkLCBib2FyZEluZm8gKmJpKQorc3RhdGljIGludCBHZXRTdGF0dXMoaW50IGNhcmQsIGJvYXJkSW5mbyAqYmkpCiB7CiAJUnNwTWVzc2FnZSByY3Ztc2c7CiAJaW50IGksIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9wYWNrZXQuYyBiL2RyaXZlcnMvaXNkbi9zYy9wYWNrZXQuYwppbmRleCA4ZTNmYWMzLi5mNTBkZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvcGFja2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL3NjL3BhY2tldC5jCkBAIC0yMTMsMTkgKzIxMywzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwcmludF9za2IoaW50IGNhcmQsY2hhciAqc2tiX3AsIGludCBsZW4pewotCWludCBpLGRhdGE7Ci0JcHJfZGVidWcoIiVzOiBkYXRhIGF0IDB4JXggbGVuOiAweCV4XG4iLCBzY19hZGFwdGVyW2NhcmRdLT5kZXZpY2VuYW1lLAotCQkJc2tiX3AsbGVuKTsKLQlmb3IoaT0xO2k8PWxlbjtpKyssc2tiX3ArKyl7Ci0JCWRhdGEgPSAoaW50KSAoMHhmZiAmICgqc2tiX3ApKTsKLQkJcHJfZGVidWcoIiVzOiBkYXRhID0gIDB4JXgiLCBzY19hZGFwdGVyW2NhcmRdLT5kZXZpY2VuYW1lLGRhdGEpOwotCQlpZighKGklNCkpCi0JCQlwcl9kZWJ1ZygiICIpOwotCQlpZighKGklMzIpKQotCQkJcHJfZGVidWcoIlxuIik7Ci0JfQotCXByX2RlYnVnKCJcbiIpOwotCXJldHVybiAwOwotfQkJCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9zaG1lbS5jIGIvZHJpdmVycy9pc2RuL3NjL3NobWVtLmMKaW5kZXggN2JjMmRmYS4uMjQ4NTQ4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9zYy9zaG1lbS5jCisrKyBiL2RyaXZlcnMvaXNkbi9zYy9zaG1lbS5jCkBAIC0xMDgsNiArMTA4LDcgQEAKIAkJc2NfYWRhcHRlcltjYXJkXS0+cmFtYmFzZSArICgodW5zaWduZWQgbG9uZykgc3JjICUweDQwMDApLCAodW5zaWduZWQgbG9uZykgZGVzdCk7ICovCiB9CiAKKyNpZiAwCiB2b2lkIG1lbXNldF9zaG1lbShpbnQgY2FyZCwgdm9pZCAqZGVzdCwgaW50IGMsIHNpemVfdCBuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNDEsMyArMTQyLDQgQEAKIAkJKChzY19hZGFwdGVyW2NhcmRdLT5zaG1lbV9tYWdpYyArIGNoICogU1JBTV9QQUdFU0laRSk+PjE0KXwweDgwKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzY19hZGFwdGVyW2NhcmRdLT5sb2NrLCBmbGFncyk7CiB9CisjZW5kaWYgIC8qICAwICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL3NjL3RpbWVyLmMgYi9kcml2ZXJzL2lzZG4vc2MvdGltZXIuYwppbmRleCA3MTBkMGY0Li5hY2VkMTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vc2MvdGltZXIuYworKysgYi9kcml2ZXJzL2lzZG4vc2MvdGltZXIuYwpAQCAtMzIsNyArMzIsNyBAQAogLyoKICAqIFdyaXRlIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gdGhlIEkvTyBwb3J0cyBmb2xsb3dpbmcgYSByZXNldAogICovCi12b2lkIHNldHVwX3BvcnRzKGludCBjYXJkKQorc3RhdGljIHZvaWQgc2V0dXBfcG9ydHMoaW50IGNhcmQpCiB7CiAKIAlvdXRiKChzY19hZGFwdGVyW2NhcmRdLT5yYW1iYXNlID4+IDEyKSwgc2NfYWRhcHRlcltjYXJkXS0+aW9wb3J0W0VYUF9CQVNFXSk7CkBAIC0xMjksMTkgKzEyOSwzIEBACiAJCWNlUmVxUGh5U3RhdHVzLDAsMCxOVUxMKTsKIH0KIAotLyoKLSAqIFdoZW4gaW4gdHJhY2UgbW9kZSwgdGhpcyBjYWxsYmFjayBpcyB1c2VkIHRvIHN3YXAgdGhlIHdvcmtpbmcgc2hhcmVkCi0gKiBSQU0gcGFnZSB0byB0aGUgdHJhY2UgcGFnZShzKSBhbmQgcHJvY2VzcyBhbGwgcmVjZWl2ZWQgbWVzc2FnZXMuIEl0Ci0gKiBtdXN0IGJlIGNhbGxlZCBvZnRlbiBlbm91Z2ggdG8gZ2V0IGFsbCBvZiB0aGUgbWVzc2FnZXMgb3V0IG9mIFJBTSBiZWZvcmUKLSAqIGl0IGxvb3BzIGFyb3VuZC4KLSAqIFRyYWNlIG1lc3NhZ2VzIGFyZSBcbiB0ZXJtaW5hdGVkIHN0cmluZ3MuCi0gKiBXZSBvdXRwdXQgdGhlIG1lc3NhZ2VzIGluIDY0IGJ5dGUgY2h1bmtzIHRocm91Z2ggcmVhZHN0YXQuIEVhY2ggY2h1bmsKLSAqIGlzIHNjYW5uZWQgZm9yIGEgXG4gZm9sbG93ZWQgYnkgYSB0aW1lIHN0YW1wLiBJZiB0aGUgdGltZXJzdGFtcCBpcyBvbGRlcgotICogdGhhbiB0aGUgY3VycmVudCB0aW1lLCBzY2FubmluZyBzdG9wcyBhbmQgdGhlIHBhZ2UgYW5kIG9mZnNldCBhcmUgcmVjb3JkZWQKLSAqIGFzIHRoZSBzdGFydGluZyBwb2ludCB0aGUgbmV4dCB0aW1lIHRoZSB0cmFjZSB0aW1lciBpcyBjYWxsZWQuIFRoZSBmaW5hbAotICogc3RlcCBpcyB0byByZXN0b3JlIHRoZSB3b3JraW5nIHBhZ2UgYW5kIHJlc2V0IHRoZSB0aW1lci4KLSAqLwotdm9pZCB0cmFjZV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JLyogbm90IGltcGxlbWVudGVkICovCi19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwppbmRleCA4YTcxMTdhLi45MTY5MWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKQEAgLTg2LDMzICs4NiwxOCBAQAogCSAgb24gdGhlICJTTVUiIHN5c3RlbSBjb250cm9sIGNoaXAgd2hpY2ggcmVwbGFjZXMgdGhlIG9sZCBQTVUuCiAJICBJZiB5b3UgZG9uJ3Qga25vdywgc2F5IFkuCiAKLWNvbmZpZyBQTUFDX1BCT09LCi0JYm9vbCAiUG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0IGZvciBQb3dlckJvb2tzIgotCWRlcGVuZHMgb24gQURCX1BNVQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcHV0dGluZyBhIFBvd2VyQm9vayB0byBzbGVlcDsgaXQgYWxzbwotCSAgZW5hYmxlcyBtZWRpYSBiYXkgc3VwcG9ydC4gIFBvd2VyIG1hbmFnZW1lbnQgd29ya3Mgb24gdGhlCi0JICBQQjI0MDAvMzQwMC8zNTAwLCBXYWxsc3RyZWV0LCBMb21iYXJkLCBhbmQgQnJvbnplIFBvd2VyQm9vayBHMyBhbmQKLQkgIHRoZSBUaXRhbml1bSBQb3dlcmJvb2sgRzQsIGFzIHdlbGwgYXMgdGhlIGlCb29rcy4gIFlvdSBzaG91bGQgZ2V0Ci0JICB0aGUgcG93ZXIgbWFuYWdlbWVudCBkYWVtb24sIHBtdWQsIHRvIG1ha2UgaXQgd29yayBhbmQgeW91IG11c3QgaGF2ZQotCSAgdGhlIC9kZXYvcG11IGRldmljZSAoc2VlIHRoZSBwbXVkIFJFQURNRSkuCi0KLQkgIEdldCBwbXVkIGZyb20gPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3BwY2xpbnV4L3BtdWQvPi4KLQotCSAgSWYgeW91IGhhdmUgYSBQb3dlckJvb2ssIHlvdSBzaG91bGQgc2F5IFkgaGVyZS4KLQotCSAgWW91IG1heSBhbHNvIHdhbnQgdG8gY29tcGlsZSB0aGUgZG1hIHNvdW5kIGRyaXZlciBhcyBhIG1vZHVsZSBhbmQKLQkgIGhhdmUgaXQgYXV0b2xvYWRlZC4gVGhlIGFjdCBvZiByZW1vdmluZyB0aGUgbW9kdWxlIHNodXRzIGRvd24gdGhlCi0JICBzb3VuZCBoYXJkd2FyZSBmb3IgbW9yZSBwb3dlciBzYXZpbmdzLgotCi1jb25maWcgUE0KLQlib29sCi0JZGVwZW5kcyBvbiBQUENfUE1BQyAmJiBBREJfUE1VICYmIFBNQUNfUEJPT0sKLQlkZWZhdWx0IHkKLQogY29uZmlnIFBNQUNfQVBNX0VNVQogCXRyaXN0YXRlICJBUE0gZW11bGF0aW9uIgotCWRlcGVuZHMgb24gUE1BQ19QQk9PSworCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgUFBDMzIgJiYgUE0KKworY29uZmlnIFBNQUNfTUVESUFCQVkKKwlib29sICJTdXBwb3J0IFBvd2VyQm9vayBob3Rzd2FwIG1lZGlhIGJheSIKKwlkZXBlbmRzIG9uIFBQQ19QTUFDICYmIFBQQzMyCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBvbGRlciBQb3dlckJvb2sncyBob3Rzd2FwIG1lZGlhIGJheQorCSAgdGhhdCBjYW4gY29udGFpbnMgYmF0dGVyaWVzLCBmbG9wcHkgZHJpdmVzLCBvciBJREUgZGV2aWNlcy4gUENJCisJICBkZXZpY2VzIGFyZSBub3QgZnVsbHkgc3VwcG9ydGVkIGluIHRoZSBiYXkgYXMgSSBuZXZlciBoYWQgb25lIHRvCisJICB0cnkgd2l0aAogCiAjIG1hZGUgYSBzZXBhcmF0ZSBvcHRpb24gc2luY2UgYmFja2xpZ2h0IG1heSBlbmQgdXAgYmVlaW5nIHVzZWQKICMgb24gbm9uLXBvd2VyYm9vayBtYWNoaW5lcyAoYnV0IG9ubHkgb24gUE1VIGJhc2VkIG9uZXMgQUZBSUspCkBAIC0xMjYsMTMgKzExMSw2IEBACiAJICBldmVudHM7IGFsc28sIHRoZSBQb3dlckJvb2sgYnV0dG9uIGRldmljZSB3aWxsIGJlIGVuYWJsZWQgc28geW91IGNhbgogCSAgY2hhbmdlIHRoZSBzY3JlZW4gYnJpZ2h0bmVzcy4KIAotY29uZmlnIE1BQ19TRVJJQUwKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgUG93ZXJNYWMgc2VyaWFsIHBvcnRzIChPQlNPTEVURSBEUklWRVIpIgotCWRlcGVuZHMgb24gUFBDX1BNQUMgJiYgQlJPS0VOCi0JaGVscAotCSAgVGhpcyBkcml2ZXIgaXMgb2Jzb2xldGUuIFVzZSBDT05GSUdfU0VSSUFMX1BNQUNaSUxPRyBpbgotCSAgIkNoYXJhY3RlciBkZXZpY2VzIC0tPiBTZXJpYWwgZHJpdmVycyAtLT4gUG93ZXJNYWMgejg1YzMwIiBvcHRpb24uCi0KIGNvbmZpZyBBREJfTUFDSU8KIAlib29sICJJbmNsdWRlIE1hY0lPIChDSFJQKSBBREIgZHJpdmVyIgogCWRlcGVuZHMgb24gQURCICYmIFBQQ19DSFJQICYmICFQUENfUE1BQzY0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9NYWtlZmlsZSBiL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCmluZGV4IGMzYTQ3MDUuLjIzNjI5MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCkBAIC00LDEwICs0LDkgQEAKIAogIyBFYWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGVuYWJsZXMgYSBsaXN0IG9mIGZpbGVzLgogCi1vYmotJChDT05GSUdfUFBDX1BNQUMpCQkrPSBtYWNpb19hc2ljLm8KK29iai0kKENPTkZJR19QUENfUE1BQykJCSs9IG1hY2lvX2FzaWMubyBtYWNpb19zeXNmcy5vCiAKLW9iai0kKENPTkZJR19QTUFDX1BCT09LKQkrPSBtZWRpYWJheS5vCi1vYmotJChDT05GSUdfTUFDX1NFUklBTCkJKz0gbWFjc2VyaWFsLm8KK29iai0kKENPTkZJR19QTUFDX01FRElBQkFZKQkrPSBtZWRpYWJheS5vCiBvYmotJChDT05GSUdfTUFDX0VNVU1PVVNFQlROKQkrPSBtYWNfaGlkLm8KIG9iai0kKENPTkZJR19JTlBVVF9BREJISUQpCSs9IGFkYmhpZC5vCiBvYmotJChDT05GSUdfQU5TTENEKQkJKz0gYW5zLWxjZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9hZGIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCmluZGV4IDQ5M2UyYWYuLmMwZGMxZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL2FkYi5jCkBAIC05MCw3ICs5MCw3IEBACiBzdGF0aWMgaW50IGF1dG9wb2xsX2RldnM7CiBpbnQgX19hZGJfcHJvYmVfc3luYzsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGFkYl9ub3RpZnlfc2xlZXAoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOwogc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgYWRiX3NsZWVwX25vdGlmaWVyID0gewogCWFkYl9ub3RpZnlfc2xlZXAsCkBAIC0zMjAsOSArMzIwLDkgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogbm8gQURCIGludGVyZmFjZSBkZXRlY3RlZFxuIik7CiAJCWFkYl9jb250cm9sbGVyID0gTlVMTDsKIAl9IGVsc2UgewotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJCXBtdV9yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcigmYWRiX3NsZWVwX25vdGlmaWVyKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogI2lmZGVmIENPTkZJR19QUEMKIAkJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxQb3dlckJvb2sxOTk4IikgfHwKIAkJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpCkBAIC0zMzcsNyArMzM3LDcgQEAKIAogX19pbml0Y2FsbChhZGJfaW5pdCk7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogLyoKICAqIG5vdGlmeSBjbGllbnRzIGJlZm9yZSBzbGVlcCBhbmQgcmVzZXQgYnVzIGFmdGVyd2FyZHMKICAqLwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJfQogCXJldHVybiBQQk9PS19TTEVFUF9PSzsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgaW50CiBkb19hZGJfcmVzZXRfYnVzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKaW5kZXggZDBiZGE3ZS4uMWVlMDAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwpAQCAtMzMsNyArMzMsNyBAQAogewogCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgbWFjaW9fZHJpdmVyICogbWFjaW9fZHJ2ID0gdG9fbWFjaW9fZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IG9mX21hdGNoICogbWF0Y2hlcyA9IG1hY2lvX2Rydi0+bWF0Y2hfdGFibGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG1hdGNoZXMgPSBtYWNpb19kcnYtPm1hdGNoX3RhYmxlOwogCiAJaWYgKCFtYXRjaGVzKSAKIAkJcmV0dXJuIDA7CkBAIC02Niw3ICs2Niw3IEBACiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAlzdHJ1Y3QgbWFjaW9fZHJpdmVyICpkcnY7CiAJc3RydWN0IG1hY2lvX2RldiAqbWFjaW9fZGV2OwotCWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAKIAlkcnYgPSB0b19tYWNpb19kcml2ZXIoZGV2LT5kcml2ZXIpOwogCW1hY2lvX2RldiA9IHRvX21hY2lvX2RldmljZShkZXYpOwpAQCAtMTI2LDExICsxMjYsODUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtYWNpb19ob3RwbHVnIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBtYWNpb19kZXYgKiBtYWNpb19kZXY7CisJc3RydWN0IG9mX2RldmljZSAqIG9mOworCWNoYXIgKnNjcmF0Y2gsICpjb21wYXQ7CisJaW50IGkgPSAwOworCWludCBsZW5ndGggPSAwOworCWludCBjcGxlbiwgc2VlbiA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltYWNpb19kZXYgPSB0b19tYWNpb19kZXZpY2UoZGV2KTsKKwlpZiAoIW1hY2lvX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZiA9ICZtYWNpb19kZXYtPm9mZGV2OworCXNjcmF0Y2ggPSBidWZmZXI7CisKKwkvKiBzdHVmZiB3ZSB3YW50IHRvIHBhc3MgdG8gL3NiaW4vaG90cGx1ZyAqLworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsICJPRl9OQU1FPSVzIiwKKwkgICAgICAgICAgICAgICAgICAgICBvZi0+bm9kZS0+bmFtZSk7CisJaWYgKChidWZmZXJfc2l6ZSAtIGxlbmd0aCA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCisJCXJldHVybiAtRU5PTUVNOworCSsrbGVuZ3RoOworCXNjcmF0Y2ggKz0gbGVuZ3RoOworCisJZW52cFtpKytdID0gc2NyYXRjaDsKKwlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwgIk9GX1RZUEU9JXMiLAorCSAgICAgICAgICAgICAgICAgICAgIG9mLT5ub2RlLT50eXBlKTsKKwlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJKytsZW5ndGg7CisJc2NyYXRjaCArPSBsZW5ndGg7CisKKyAgICAgICAgLyogU2luY2UgdGhlIGNvbXBhdGlibGUgZmllbGQgY2FuIGNvbnRhaW4gcHJldHR5IG11Y2ggYW55dGhpbmcKKyAgICAgICAgICogaXQncyBub3QgcmVhbGx5IGxlZ2FsIHRvIHNwbGl0IGl0IG91dCB3aXRoIGNvbW1hcy4gV2Ugc3BsaXQgaXQKKyAgICAgICAgICogdXAgdXNpbmcgYSBudW1iZXIgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluc3RlYWQuICovCisKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwl3aGlsZSAoY29tcGF0ICYmIGNwbGVuID4gMCkgeworCQlpbnQgbDsKKyAgICAgICAgICAgICAgICBlbnZwW2krK10gPSBzY3JhdGNoOworCQlsZW5ndGggKz0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSAtIGxlbmd0aCwKKwkJICAgICAgICAgICAgICAgICAgICAgIk9GX0NPTVBBVElCTEVfJWQ9JXMiLCBzZWVuLCBjb21wYXQpOworCQlpZiAoKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlsZW5ndGgrKzsKKwkJc2NyYXRjaCArPSBsZW5ndGg7CisJCWwgPSBzdHJsZW4gKGNvbXBhdCkgKyAxOworCQljb21wYXQgKz0gbDsKKwkJY3BsZW4gLT0gbDsKKwkJc2VlbisrOworCX0KKworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoICs9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUgLSBsZW5ndGgsCisJICAgICAgICAgICAgICAgICAgICAgIk9GX0NPTVBBVElCTEVfTj0lZCIsIHNlZW4pOworCWlmICgoYnVmZmVyX3NpemUgLSBsZW5ndGggPD0gMCkgfHwgKGkgPj0gbnVtX2VudnApKQorCQlyZXR1cm4gLUVOT01FTTsKKwkrK2xlbmd0aDsKKwlzY3JhdGNoICs9IGxlbmd0aDsKKworCWVudnBbaV0gPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBtYWNpb19kZXZfYXR0cnNbXTsKKwogc3RydWN0IGJ1c190eXBlIG1hY2lvX2J1c190eXBlID0gewogICAgICAgIC5uYW1lCT0gIm1hY2lvIiwKICAgICAgICAubWF0Y2gJPSBtYWNpb19idXNfbWF0Y2gsCisgICAgICAgLmhvdHBsdWcgPSBtYWNpb19ob3RwbHVnLAogICAgICAgIC5zdXNwZW5kCT0gbWFjaW9fZGV2aWNlX3N1c3BlbmQsCiAgICAgICAgLnJlc3VtZQk9IG1hY2lvX2RldmljZV9yZXN1bWUsCisgICAgICAgLmRldl9hdHRycyA9IG1hY2lvX2Rldl9hdHRycywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1hY2lvX2J1c19kcml2ZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fc3lzZnMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMjJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX3N5c2ZzLmMKQEAgLTAsMCArMSw1MCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKworCisjZGVmaW5lIG1hY2lvX2NvbmZpZ19vZl9hdHRyKGZpZWxkLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitmaWVsZCMjX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKyAgICAgICAgICAgICAgY2hhciAqYnVmKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1hY2lvX2RldiAqbWRldiA9IHRvX21hY2lvX2RldmljZSAoZGV2KTsJCQlcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgZm9ybWF0X3N0cmluZywgbWRldi0+b2ZkZXYubm9kZS0+ZmllbGQpOwlcCit9CisKK3N0YXRpYyBzc2l6ZV90Citjb21wYXRpYmxlX3Nob3cgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZjsKKwljaGFyICpjb21wYXQ7CisJaW50IGNwbGVuOworCWludCBsZW5ndGggPSAwOworCisJb2YgPSAmdG9fbWFjaW9fZGV2aWNlIChkZXYpLT5vZmRldjsKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwlpZiAoIWNvbXBhdCkgeworCQkqYnVmID0gJ1wwJzsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChjcGxlbiA+IDApIHsKKwkJaW50IGw7CisJCWxlbmd0aCArPSBzcHJpbnRmIChidWYsICIlc1xuIiwgY29tcGF0KTsKKwkJYnVmICs9IGxlbmd0aDsKKwkJbCA9IHN0cmxlbiAoY29tcGF0KSArIDE7CisJCWNvbXBhdCArPSBsOworCQljcGxlbiAtPSBsOworCX0KKworCXJldHVybiBsZW5ndGg7Cit9CisKK21hY2lvX2NvbmZpZ19vZl9hdHRyIChuYW1lLCAiJXNcbiIpOworbWFjaW9fY29uZmlnX29mX2F0dHIgKHR5cGUsICIlc1xuIik7CisKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlIG1hY2lvX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhuYW1lKSwKKwlfX0FUVFJfUk8odHlwZSksCisJX19BVFRSX1JPKGNvbXBhdGlibGUpLAorCV9fQVRUUl9OVUxMCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjc2VyaWFsLmMgYi9kcml2ZXJzL21hY2ludG9zaC9tYWNzZXJpYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlM2FjNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNzZXJpYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDMwMzYgKzAsMCBAQAotLyoKLSAqIG1hY3NlcmlhbC5jOiBTZXJpYWwgcG9ydCBkcml2ZXIgZm9yIFBvd2VyIE1hY2ludG9zaGVzLgotICoKLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3NidXMvY2hhci9zdW5zZXJpYWwuYyBieSBQYXVsIE1hY2tlcnJhcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMgKFBhdWwuTWFja2VycmFzQGNzLmFudS5lZHUuYXUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICoKLSAqIFJlY2VpdmUgRE1BIGNvZGUgYnkgVGFrYXNoaSBPZSA8dG9lQHVubHNlcnZlLnVubC5lZHU+LgotICoKLSAqICRJZDogbWFjc2VyaWFsLmMsdiAxLjI0LjIuNCAxOTk5LzEwLzE5IDA0OjM2OjQyIHBhdWx1cyBFeHAgJAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLSNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2lmZGVmIENPTkZJR19TRVJJQUxfQ09OU09MRQotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLQotI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWRiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG11Lmg+Ci0jaWZkZWYgQ09ORklHX0tHREIKLSNpbmNsdWRlIDxhc20va2dkYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8YXNtL2RiZG1hLmg+Ci0KLSNpbmNsdWRlICJtYWNzZXJpYWwuaCIKLQotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi1zdGF0aWMgaW50IHNlcmlhbF9ub3RpZnlfc2xlZXAoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciAqc2VsZiwgaW50IHdoZW4pOwotc3RhdGljIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgc2VyaWFsX3NsZWVwX25vdGlmaWVyID0gewotCXNlcmlhbF9ub3RpZnlfc2xlZXAsCi0JU0xFRVBfTEVWRUxfTUlTQywKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBTVVBQT1JUX1NFUklBTF9ETUEKLSNkZWZpbmUgTUFDU0VSSUFMX1ZFUlNJT04JIjIuMCIKLQotLyoKLSAqIEl0IHdvdWxkIGJlIG5pY2UgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgZXZlcnl0aGluZyB0aGF0Ci0gKiBkZXBlbmRzIG9uIE5VTV9TRVJJQUwsIHNvIHdlIGNvdWxkIHN1cHBvcnQgYW55IG51bWJlciBvZgotICogWjg1MzBzLCBidXQgZm9yIG5vdy4uLgotICovCi0jZGVmaW5lIE5VTV9TRVJJQUwJMgkJLyogTWF4IG51bWJlciBvZiBaUyBjaGlwcyBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgTlVNX0NIQU5ORUxTCShOVU1fU0VSSUFMICogMikJLyogMiBjaGFubmVscyBwZXIgY2hpcCAqLwotCi0vKiBPbiBQb3dlck1hY3MsIHRoZSBoYXJkd2FyZSB0YWtlcyBjYXJlIG9mIHRoZSBTQ0MgcmVjb3ZlcnkgdGltZSwKLSAgIGJ1dCB3ZSBuZWVkIHRoZSBlaWVpbyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYWNjZXNzZXMgb2NjdXIKLSAgIGluIHRoZSBvcmRlciB3ZSB3YW50LiAqLwotI2RlZmluZSBSRUNPVkVSWV9ERUxBWQllaWVpbygpCi0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKLQotc3RydWN0IG1hY196c2NoYW5uZWwgenNfY2hhbm5lbHNbTlVNX0NIQU5ORUxTXTsKLQotc3RydWN0IG1hY19zZXJpYWwgenNfc29mdFtOVU1fQ0hBTk5FTFNdOwotaW50IHpzX2NoYW5uZWxzX2ZvdW5kOwotc3RydWN0IG1hY19zZXJpYWwgKnpzX2NoYWluOwkvKiBsaXN0IG9mIGFsbCBjaGFubmVscyAqLwotCi1zdHJ1Y3QgdHR5X3N0cnVjdCB6c190dHlzW05VTV9DSEFOTkVMU107Ci0KLXN0YXRpYyBpbnQgaXNfcG93ZXJib29rOwotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCi1zdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyY29uczsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0tHREIKLXN0cnVjdCBtYWNfenNjaGFubmVsICp6c19rZ2RiY2hhbjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjY19pbml0dGFiW10gPSB7Ci0JOSwgIDB4ODAsCS8qIHJlc2V0IEEgc2lkZSAoQ0hSQSkgKi8KLQkxMywgMCwJCS8qIHNldCBiYXVkIHJhdGUgZGl2aXNvciAqLwotCTEyLCAxLAotCTE0LCAxLAkJLyogYmF1ZCByYXRlIGdlbiBlbmFibGUsIHNyYz1ydHhjIChCUkVOQUJMKSAqLwotCTExLCAweDUwLAkvKiBjbG9ja3MgPSBiciBnZW4gKFJDQlIgfCBUQ0JSKSAqLwotCTUsICAweDZhLAkvKiB0eCA4IGJpdHMsIGFzc2VydCBSVFMgKFR4OCB8IFR4RU5BQiB8IFJUUykgKi8KLQk0LCAgMHg0NCwJLyogeDE2IGNsb2NrLCAxIHN0b3AgKFNCMSB8IFgxNkNMSykqLwotCTMsICAweGMxLAkvKiByeCBlbmFibGUsIDggYml0cyAoUnhFTkFCTEUgfCBSeDgpKi8KLX07Ci0jZW5kaWYKLSNkZWZpbmUgWlNfQ0xPQ0sgICAgICAgICAzNjg2NDAwIAkvKiBaODUzMCBSVHhDIGlucHV0IGNsb2NrIHJhdGUgKi8KLQotLyogc2VyaWFsIHN1YnR5cGUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgU0VSSUFMX1RZUEVfTk9STUFMCTEKLQotLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgbGVmdCBpbiB4bWl0IGJ1ZmZlciBiZWZvcmUgd2UgYXNrIGZvciBtb3JlICovCi0jZGVmaW5lIFdBS0VVUF9DSEFSUyAyNTYKLQotLyoKLSAqIERlYnVnZ2luZy4KLSAqLwotI3VuZGVmIFNFUklBTF9ERUJVR19JTlRSCi0jdW5kZWYgU0VSSUFMX0RFQlVHX09QRU4KLSN1bmRlZiBTRVJJQUxfREVCVUdfRkxPVwotI3VuZGVmIFNFUklBTF9ERUJVR19QT1dFUgotI3VuZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotI3VuZGVmIFNFUklBTF9ERUJVR19TVE9QCi0jdW5kZWYgU0VSSUFMX0RFQlVHX0JBVURTCi0KLSNkZWZpbmUgUlNfU1RST0JFX1RJTUUgMTAKLSNkZWZpbmUgUlNfSVNSX1BBU1NfTElNSVQgMjU2Ci0KLSNkZWZpbmUgX0lOTElORV8gaW5saW5lCi0KLSNpZmRlZiBTRVJJQUxfREVCVUdfT1BFTgotI2RlZmluZSBPUE5EQkcoZm10LCBhcmcuLi4pCXByaW50ayhLRVJOX0RFQlVHIGZtdCAsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIE9QTkRCRyhmbXQsIGFyZy4uLikJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0jaWZkZWYgU0VSSUFMX0RFQlVHX1BPV0VSCi0jZGVmaW5lIFBXUkRCRyhmbXQsIGFyZy4uLikJcHJpbnRrKEtFUk5fREVCVUcgZm10ICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgUFdSREJHKGZtdCwgYXJnLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNpZmRlZiBTRVJJQUxfREVCVUdfQkFVRFMKLSNkZWZpbmUgQkFVREJHKGZtdCwgYXJnLi4uKQlwcmludGsoZm10ICwgIyMgYXJnKQotI2Vsc2UKLSNkZWZpbmUgQkFVREJHKGZtdCwgYXJnLi4uKQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgcHJvYmVfc2Njcyh2b2lkKTsKLXN0YXRpYyB2b2lkIGNoYW5nZV9zcGVlZChzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbywgc3RydWN0IHRlcm1pb3MgKm9sZCk7Ci1zdGF0aWMgdm9pZCByc193YWl0X3VudGlsX3NlbnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHRpbWVvdXQpOwotc3RhdGljIGludCBzZXRfc2NjX3Bvd2VyKHN0cnVjdCBtYWNfc2VyaWFsICogaW5mbywgaW50IHN0YXRlKTsKLXN0YXRpYyBpbnQgc2V0dXBfc2NjKHN0cnVjdCBtYWNfc2VyaWFsICogaW5mbyk7Ci1zdGF0aWMgdm9pZCBkYmRtYV9yZXNldCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqZG1hKTsKLXN0YXRpYyB2b2lkIGRiZG1hX2ZsdXNoKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpkbWEpOwotc3RhdGljIGlycXJldHVybl90IHJzX3R4ZG1hX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCByc19yeGRtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgdm9pZCBkbWFfaW5pdChzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8pOwotc3RhdGljIHZvaWQgcnhkbWFfc3RhcnQoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvLCBpbnQgY3Vycik7Ci1zdGF0aWMgdm9pZCByeGRtYV90b190dHkoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKTsKLQotLyoKLSAqIHRtcF9idWYgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBidWZmZXIgYnkgc2VyaWFsX3dyaXRlLiAgV2UgbmVlZCB0bwotICogbG9jayBpdCBpbiBjYXNlIHRoZSBjb3B5X2Zyb21fdXNlciBibG9ja3Mgd2hpbGUgc3dhcHBpbmcgaW4gYSBwYWdlLAotICogYW5kIHNvbWUgb3RoZXIgcHJvZ3JhbSB0cmllcyB0byBkbyBhIHNlcmlhbCB3cml0ZSBhdCB0aGUgc2FtZSB0aW1lLgotICogU2luY2UgdGhlIGxvY2sgd2lsbCBvbmx5IGNvbWUgdW5kZXIgY29udGVudGlvbiB3aGVuIHRoZSBzeXN0ZW0gaXMKLSAqIHN3YXBwaW5nIGFuZCBhdmFpbGFibGUgbWVtb3J5IGlzIGxvdywgaXQgbWFrZXMgc2Vuc2UgdG8gc2hhcmUgb25lCi0gKiBidWZmZXIgYWNyb3NzIGFsbCB0aGUgc2VyaWFsIHBvcnRzLCBzaW5jZSBpdCBzaWduaWZpY2FudGx5IHNhdmVzCi0gKiBtZW1vcnkgaWYgbGFyZ2UgbnVtYmVycyBvZiBzZXJpYWwgcG9ydHMgYXJlIG9wZW4uCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICp0bXBfYnVmOwotc3RhdGljIERFQ0xBUkVfTVVURVgodG1wX2J1Zl9zZW0pOwotCi0KLXN0YXRpYyBpbmxpbmUgaW50IF9fcG1hYwotc2VyaWFsX3BhcmFub2lhX2NoZWNrKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLAotCQkgICAgICBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpyb3V0aW5lKQotewotI2lmZGVmIFNFUklBTF9QQVJBTk9JQV9DSEVDSwotCXN0YXRpYyBjb25zdCBjaGFyIGJhZG1hZ2ljW10gPSBLRVJOX1dBUk5JTkcKLQkJIldhcm5pbmc6IGJhZCBtYWdpYyBudW1iZXIgZm9yIHNlcmlhbCBzdHJ1Y3QgJXMgaW4gJXNcbiI7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgYmFkaW5mb1tdID0gS0VSTl9XQVJOSU5HCi0JCSJXYXJuaW5nOiBudWxsIG1hY19zZXJpYWwgZm9yICVzIGluICVzXG4iOwotCi0JaWYgKCFpbmZvKSB7Ci0JCXByaW50ayhiYWRpbmZvLCBuYW1lLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChpbmZvLT5tYWdpYyAhPSBTRVJJQUxfTUFHSUMpIHsKLQkJcHJpbnRrKGJhZG1hZ2ljLCBuYW1lLCByb3V0aW5lKTsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIAotICogUmVhZGluZyBhbmQgd3JpdGluZyBaODUzMCByZWdpc3RlcnMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBfX3BtYWMgcmVhZF96c3JlZyhzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkJICAgICAgdW5zaWduZWQgY2hhciByZWcpCi17Ci0JdW5zaWduZWQgY2hhciByZXR2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogV2UgaGF2ZSB0byBtYWtlIHRoaXMgYXRvbWljLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHJlZyAhPSAwKSB7Ci0JCSpjaGFubmVsLT5jb250cm9sID0gcmVnOwotCQlSRUNPVkVSWV9ERUxBWTsKLQl9Ci0JcmV0dmFsID0gKmNoYW5uZWwtPmNvbnRyb2w7Ci0JUkVDT1ZFUllfREVMQVk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BtYWMgd3JpdGVfenNyZWcoc3RydWN0IG1hY196c2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICAgICAgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHJlZyAhPSAwKSB7Ci0JCSpjaGFubmVsLT5jb250cm9sID0gcmVnOwotCQlSRUNPVkVSWV9ERUxBWTsKLQl9Ci0JKmNoYW5uZWwtPmNvbnRyb2wgPSB2YWx1ZTsKLQlSRUNPVkVSWV9ERUxBWTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgX19wbWFjIHJlYWRfenNkYXRhKHN0cnVjdCBtYWNfenNjaGFubmVsICpjaGFubmVsKQotewotCXVuc2lnbmVkIGNoYXIgcmV0dmFsOwotCi0JcmV0dmFsID0gKmNoYW5uZWwtPmRhdGE7Ci0JUkVDT1ZFUllfREVMQVk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3pzZGF0YShzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQl1bnNpZ25lZCBjaGFyIHZhbHVlKQotewotCSpjaGFubmVsLT5kYXRhID0gdmFsdWU7Ci0JUkVDT1ZFUllfREVMQVk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9hZF96c3JlZ3Moc3RydWN0IG1hY196c2NoYW5uZWwgKmNoYW5uZWwsCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqcmVncykKLXsKLQlaU19DTEVBUkVSUihjaGFubmVsKTsKLQlaU19DTEVBUkZJRk8oY2hhbm5lbCk7Ci0JLyogTG9hZCAnZW0gdXAgKi8KLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSNCwgcmVnc1tSNF0pOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIxMCwgcmVnc1tSMTBdKTsKLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSMywgcmVnc1tSM10gJiB+UnhFTkFCTEUpOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFI1LCByZWdzW1I1XSAmIH5UeEVOQUIpOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIxLCByZWdzW1IxXSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjksIHJlZ3NbUjldKTsKLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSMTEsIHJlZ3NbUjExXSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjEyLCByZWdzW1IxMl0pOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIxMywgcmVnc1tSMTNdKTsKLQl3cml0ZV96c3JlZyhjaGFubmVsLCBSMTQsIHJlZ3NbUjE0XSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjE1LCByZWdzW1IxNV0pOwotCXdyaXRlX3pzcmVnKGNoYW5uZWwsIFIzLCByZWdzW1IzXSk7Ci0Jd3JpdGVfenNyZWcoY2hhbm5lbCwgUjUsIHJlZ3NbUjVdKTsKLQlyZXR1cm47Ci19Ci0KLS8qIFNldHMgb3IgY2xlYXJzIERUUi9SVFMgb24gdGhlIHJlcXVlc3RlZCBsaW5lICovCi1zdGF0aWMgaW5saW5lIHZvaWQgenNfcnRzZHRyKHN0cnVjdCBtYWNfc2VyaWFsICpzcywgaW50IHNldCkKLXsKLQlpZiAoc2V0KQotCQlzcy0+Y3VycmVnc1s1XSB8PSAoUlRTIHwgRFRSKTsKLQllbHNlCi0JCXNzLT5jdXJyZWdzWzVdICY9IH4oUlRTIHwgRFRSKTsKLQl3cml0ZV96c3JlZyhzcy0+enNfY2hhbm5lbCwgNSwgc3MtPmN1cnJlZ3NbNV0pOwotCXJldHVybjsKLX0KLQotLyogVXRpbGl0eSByb3V0aW5lcyBmb3IgdGhlIFppbG9nICovCi1zdGF0aWMgaW5saW5lIGludCBnZXRfenNiYXVkKHN0cnVjdCBtYWNfc2VyaWFsICpzcykKLXsKLQlzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbm5lbCA9IHNzLT56c19jaGFubmVsOwotCWludCBicmc7Ci0KLQlpZiAoKHNzLT5jdXJyZWdzW1IxMV0gJiBUQ0JSKSA9PSAwKSB7Ci0JCS8qIGhpZ2hlciByYXRlcyBkb24ndCB1c2UgdGhlIGJhdWQgcmF0ZSBnZW5lcmF0b3IgKi8KLQkJcmV0dXJuIChzcy0+Y3VycmVnc1tSNF0gJiBYMzJDTEspPyBaU19DTE9DSy8zMjogWlNfQ0xPQ0svMTY7Ci0JfQotCS8qIFRoZSBiYXVkIHJhdGUgaXMgc3BsaXQgdXAgYmV0d2VlbiB0d28gOC1iaXQgcmVnaXN0ZXJzIGluCi0JICogd2hhdCBpcyB0ZXJtZWQgJ0JSRyB0aW1lIGNvbnN0YW50JyBmb3JtYXQgaW4gbXkgZG9jcyBmb3IKLQkgKiB0aGUgY2hpcCwgaXQgaXMgYSBmdW5jdGlvbiBvZiB0aGUgY2xrIHJhdGUgdGhlIGNoaXAgaXMKLQkgKiByZWNlaXZpbmcgd2hpY2ggaGFwcGVucyB0byBiZSBjb25zdGFudC4KLQkgKi8KLQlicmcgPSAocmVhZF96c3JlZyhjaGFubmVsLCAxMykgPDwgOCk7Ci0JYnJnIHw9IHJlYWRfenNyZWcoY2hhbm5lbCwgMTIpOwotCXJldHVybiBCUkdfVE9fQlBTKGJyZywgKFpTX0NMT0NLLyhzcy0+Y2xrX2Rpdmlzb3IpKSk7Ci19Ci0KLS8qIE9uIHJlY2VpdmUsIHRoaXMgY2xlYXJzIGVycm9ycyBhbmQgdGhlIHJlY2VpdmVyIGludGVycnVwdHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByc19yZWN2X2NsZWFyKHN0cnVjdCBtYWNfenNjaGFubmVsICp6c2MpCi17Ci0Jd3JpdGVfenNyZWcoenNjLCAwLCBFUlJfUkVTKTsKLQl3cml0ZV96c3JlZyh6c2MsIDAsIFJFU19IX0lVUyk7IC8qIFhYWCB0aGlzIGlzIHVubmVjZXNzYXJ5ICovCi19Ci0KLS8qCi0gKiBSZXNldCBhIERlc2NyaXB0b3ItQmFzZWQgRE1BIGNoYW5uZWwuCi0gKi8KLXN0YXRpYyB2b2lkIGRiZG1hX3Jlc2V0KHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpkbWEpCi17Ci0JaW50IGk7Ci0KLQlvdXRfbGUzMigmZG1hLT5jb250cm9sLCAoV0FLRXxGTFVTSHxQQVVTRXxSVU4pIDw8IDE2KTsKLQotCS8qCi0JICogWWVzIHRoaXMgbG9va3MgcGVjdWxpYXIsIGJ1dCBhcHBhcmVudGx5IGl0IG5lZWRzIHRvIGJlIHRoaXMKLQkgKiB3YXkgb24gc29tZSBtYWNoaW5lcy4gIChXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgREJETUEKLQkgKiBlbmdpbmUgaGFzIGFjdHVhbGx5IGdvdCB0aGUgd3JpdGUgYWJvdmUgYW5kIHJlc3BvbmRlZAotCSAqIHRvIGl0LiAtIHBhdWx1cykKLQkgKi8KLQlmb3IgKGkgPSAyMDA7IGkgPiAwOyAtLWkpCi0JCWlmIChsZF9sZTMyKCZkbWEtPnN0YXR1cykgJiBSVU4pCi0JCQl1ZGVsYXkoMSk7Ci19Ci0KLS8qCi0gKiBUZWxscyBhIERCRE1BIGNoYW5uZWwgdG8gc3RvcCBhbmQgd3JpdGUgYW55IGJ1ZmZlcmVkIGRhdGEKLSAqIGl0IG1pZ2h0IGhhdmUgdG8gbWVtb3J5LgotICovCi1zdGF0aWMgX0lOTElORV8gdm9pZCBkYmRtYV9mbHVzaCh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqZG1hKQotewotCWludCBpID0gMDsKLQotCW91dF9sZTMyKCZkbWEtPmNvbnRyb2wsIChGTFVTSCA8PCAxNikgfCBGTFVTSCk7Ci0Jd2hpbGUgKCgoaW5fbGUzMigmZG1hLT5zdGF0dXMpICYgRkxVU0gpICE9IDApICYmIChpKysgPCAxMDApKQotCQl1ZGVsYXkoMSk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogSGVyZSBzdGFydHMgdGhlIGludGVycnVwdCBoYW5kbGluZyByb3V0aW5lcy4gIEFsbCBvZiB0aGUgZm9sbG93aW5nCi0gKiBzdWJyb3V0aW5lcyBhcmUgZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBhcmUgZm9sZGVkIGludG8KLSAqIHJzX2ludGVycnVwdCgpLiAgVGhleSB3ZXJlIHNlcGFyYXRlZCBvdXQgZm9yIHJlYWRhYmlsaXR5J3Mgc2FrZS4KLSAqCi0gKiAJCQkJLSBUZWQgVHMnbyAodHl0c29AbWl0LmVkdSksIDctTWFyLTkzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgdG8gc2NoZWR1bGUKLSAqIHByb2Nlc3NpbmcgaW4gdGhlIHNvZnR3YXJlIGludGVycnVwdCBwb3J0aW9uIG9mIHRoZSBkcml2ZXIuCi0gKi8KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHJzX3NjaGVkX2V2ZW50KHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLAotCQkJCSAgaW50IGV2ZW50KQotewotCWluZm8tPmV2ZW50IHw9IDEgPDwgZXZlbnQ7Ci0Jc2NoZWR1bGVfd29yaygmaW5mby0+dHF1ZXVlKTsKLX0KLQotLyogV29yayBvdXQgdGhlIGZsYWcgdmFsdWUgZm9yIGEgejg1MzAgc3RhdHVzIHZhbHVlLiAqLwotc3RhdGljIF9JTkxJTkVfIGludCBzdGF0X3RvX2ZsYWcoaW50IHN0YXQpCi17Ci0JaW50IGZsYWc7Ci0KLQlpZiAoc3RhdCAmIFJ4X09WUikgewotCQlmbGFnID0gVFRZX09WRVJSVU47Ci0JfSBlbHNlIGlmIChzdGF0ICYgRlJNX0VSUikgewotCQlmbGFnID0gVFRZX0ZSQU1FOwotCX0gZWxzZSBpZiAoc3RhdCAmIFBBUl9FUlIpIHsKLQkJZmxhZyA9IFRUWV9QQVJJVFk7Ci0JfSBlbHNlCi0JCWZsYWcgPSAwOwotCXJldHVybiBmbGFnOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX2NoYXJzKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLAotCQkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7Ci0JdW5zaWduZWQgY2hhciBjaCwgc3RhdCwgZmxhZzsKLQotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSAhPSAwKSB7Ci0KLQkJc3RhdCA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgUjEpOwotCQljaCA9IHJlYWRfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwpOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQkJaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkgewotCQkJaWYgKGNoID09IDB4MDMgfHwgY2ggPT0gJyQnKQotCQkJCWJyZWFrcG9pbnQoKTsKLQkJCWlmIChzdGF0ICYgKFJ4X09WUnxGUk1fRVJSfFBBUl9FUlIpKQotCQkJCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIEVSUl9SRVMpOwotCQkJcmV0dXJuOwotCQl9Ci0jZW5kaWYKLQkJaWYgKCF0dHkpCi0JCQljb250aW51ZTsKLQkJaWYgKHR0eS0+ZmxpcC5jb3VudCA+PSBUVFlfRkxJUEJVRl9TSVpFKQotCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQotCQlpZiAodHR5LT5mbGlwLmNvdW50ID49IFRUWV9GTElQQlVGX1NJWkUpIHsKLQkJCXN0YXRpYyBpbnQgZmxpcF9idWZfb3ZmOwotCQkJaWYgKCsrZmxpcF9idWZfb3ZmIDw9IDEpCi0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRkIuIG92ZXJmbG93OiAlZFxuIiwKLQkJCQkJCSAgICBmbGlwX2J1Zl9vdmYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdHR5LT5mbGlwLmNvdW50Kys7Ci0JCXsKLQkJCXN0YXRpYyBpbnQgZmxpcF9tYXhfY250OwotCQkJaWYgKGZsaXBfbWF4X2NudCA8IHR0eS0+ZmxpcC5jb3VudCkKLQkJCQlmbGlwX21heF9jbnQgPSB0dHktPmZsaXAuY291bnQ7Ci0JCX0KLQkJZmxhZyA9IHN0YXRfdG9fZmxhZyhzdGF0KTsKLQkJaWYgKGZsYWcpCi0JCQkvKiByZXNldCB0aGUgZXJyb3IgaW5kaWNhdGlvbiAqLwotCQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCwgRVJSX1JFUyk7Ci0JCSp0dHktPmZsaXAuZmxhZ19idWZfcHRyKysgPSBmbGFnOwotCQkqdHR5LT5mbGlwLmNoYXJfYnVmX3B0cisrID0gY2g7Ci0JfQotCWlmICh0dHkpCi0JCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYW5zbWl0X2NoYXJzKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvKQotewotCWlmICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFR4X0JVRl9FTVApID09IDApCi0JCXJldHVybjsKLQlpbmZvLT50eF9hY3RpdmUgPSAwOwotCi0JaWYgKGluZm8tPnhfY2hhciAmJiAhaW5mby0+cG93ZXJfd2FpdCkgewotCQkvKiBTZW5kIG5leHQgY2hhciAqLwotCQl3cml0ZV96c2RhdGEoaW5mby0+enNfY2hhbm5lbCwgaW5mby0+eF9jaGFyKTsKLQkJaW5mby0+eF9jaGFyID0gMDsKLQkJaW5mby0+dHhfYWN0aXZlID0gMTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgoaW5mby0+eG1pdF9jbnQgPD0gMCkgfHwgaW5mby0+dHR5LT5zdG9wcGVkIHx8IGluZm8tPnR4X3N0b3BwZWQKLQkgICAgfHwgaW5mby0+cG93ZXJfd2FpdCkgewotCQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwLCBSRVNfVHhfUCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBTZW5kIGNoYXIgKi8KLQl3cml0ZV96c2RhdGEoaW5mby0+enNfY2hhbm5lbCwgaW5mby0+eG1pdF9idWZbaW5mby0+eG1pdF90YWlsKytdKTsKLQlpbmZvLT54bWl0X3RhaWwgPSBpbmZvLT54bWl0X3RhaWwgJiAoU0VSSUFMX1hNSVRfU0laRS0xKTsKLQlpbmZvLT54bWl0X2NudC0tOwotCWluZm8tPnR4X2FjdGl2ZSA9IDE7Ci0KLQlpZiAoaW5mby0+eG1pdF9jbnQgPCBXQUtFVVBfQ0hBUlMpCi0JCXJzX3NjaGVkX2V2ZW50KGluZm8sIFJTX0VWRU5UX1dSSVRFX1dBS0VVUCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvd2VydXBfZG9uZSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKikgZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpbmZvLT5wb3dlcl93YWl0ID0gMDsKLQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBfSU5MSU5FXyB2b2lkIHN0YXR1c19oYW5kbGUoc3RydWN0IG1hY19zZXJpYWwgKmluZm8pCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0KLQkvKiBHZXQgc3RhdHVzIGZyb20gUmVhZCBSZWdpc3RlciAwICovCi0Jc3RhdHVzID0gcmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKTsKLQotCS8qIENoZWNrIGZvciBEQ0QgdHJhbnNpdGlvbnMgKi8KLQlpZiAoKChzdGF0dXMgXiBpbmZvLT5yZWFkX3JlZ196ZXJvKSAmIERDRCkgIT0gMAotCSAgICAmJiBpbmZvLT50dHkgJiYgIUNfQ0xPQ0FMKGluZm8tPnR0eSkpIHsKLQkJaWYgKHN0YXR1cyAmIERDRCkgewotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwotCQl9IGVsc2UgewotCQkJaWYgKGluZm8tPnR0eSkKLQkJCQl0dHlfaGFuZ3VwKGluZm8tPnR0eSk7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBmb3IgQ1RTIHRyYW5zaXRpb25zICovCi0JaWYgKGluZm8tPnR0eSAmJiBDX0NSVFNDVFMoaW5mby0+dHR5KSkgewotCQkvKgotCQkgKiBGb3Igc29tZSByZWFzb24sIG9uIHRoZSBQb3dlciBNYWNpbnRvc2gsCi0JCSAqIGl0IHNlZW1zIHRoYXQgdGhlIENUUyBiaXQgaXMgMSB3aGVuIENUUyBpcwotCQkgKiAqbmVnYXRlZCogYW5kIDAgd2hlbiBpdCBpcyBhc3NlcnRlZC4KLQkJICogVGhlIERDRCBiaXQgZG9lc24ndCBzZWVtIHRvIGJlIGludmVydGVkCi0JCSAqIGxpa2UgdGhpcy4KLQkJICovCi0JCWlmICgoc3RhdHVzICYgQ1RTKSA9PSAwKSB7Ci0JCQlpZiAoaW5mby0+dHhfc3RvcHBlZCkgewotI2lmZGVmIFNFUklBTF9ERUJVR19GTE9XCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNUUyB1cFxuIik7Ci0jZW5kaWYKLQkJCQlpbmZvLT50eF9zdG9wcGVkID0gMDsKLQkJCQlpZiAoIWluZm8tPnR4X2FjdGl2ZSkKLQkJCQkJdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX0ZMT1cKLQkJCXByaW50ayhLRVJOX0RFQlVHICJDVFMgZG93blxuIik7Ci0jZW5kaWYKLQkJCWluZm8tPnR4X3N0b3BwZWQgPSAxOwotCQl9Ci0JfQotCi0JLyogQ2xlYXIgc3RhdHVzIGNvbmRpdGlvbi4uLiAqLwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19FWFRfSU5UKTsKLQlpbmZvLT5yZWFkX3JlZ196ZXJvID0gc3RhdHVzOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByZWNlaXZlX3NwZWNpYWxfZG1hKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvKQotewotCXVuc2lnbmVkIGNoYXIgc3RhdCwgZmxhZzsKLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqcmQgPSAmaW5mby0+cngtPmRtYTsKLQlpbnQgd2hlcmUgPSBSWF9CVUZfU0laRTsKLQotCXNwaW5fbG9jaygmaW5mby0+cnhfZG1hX2xvY2spOwotCWlmICgobGRfbGUzMigmcmQtPnN0YXR1cykgJiBBQ1RJVkUpICE9IDApCi0JCWRiZG1hX2ZsdXNoKHJkKTsKLQlpZiAoaW5fbGUzMigmcmQtPmNtZHB0cikKLQkgICAgPT0gdmlydF90b19idXMoaW5mby0+cnhfY21kc1tpbmZvLT5yeF9jYnVmXSArIDEpKQotCQl3aGVyZSAtPSBpbl9sZTE2KCZpbmZvLT5yeC0+cmVzX2NvdW50KTsKLQl3aGVyZS0tOwotCi0Jc3RhdCA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgUjEpOwotCi0JZmxhZyA9IHN0YXRfdG9fZmxhZyhzdGF0KTsKLQlpZiAoZmxhZykgewotCQlpbmZvLT5yeF9mbGFnX2J1ZltpbmZvLT5yeF9jYnVmXVt3aGVyZV0gPSBmbGFnOwotCQkvKiByZXNldCB0aGUgZXJyb3IgaW5kaWNhdGlvbiAqLwotCQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwLCBFUlJfUkVTKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmaW5mby0+cnhfZG1hX2xvY2spOwotfQotCi0vKgotICogVGhpcyBpcyB0aGUgc2VyaWFsIGRyaXZlcidzIGdlbmVyaWMgaW50ZXJydXB0IHJvdXRpbmUKLSAqLwotc3RhdGljIGlycXJldHVybl90IHJzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSBkZXZfaWQ7Ci0JdW5zaWduZWQgY2hhciB6c19pbnRyZWc7Ci0JaW50IHNoaWZ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGhhbmRsZWQgPSAwOwotCi0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBaSUxPR19JTklUSUFMSVpFRCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicnNfaW50ZXJydXB0OiBpcnEgJWQsIHBvcnQgbm90ICIKLQkJCQkgICAgImluaXRpYWxpemVkXG4iLCBpcnEpOwotCQlkaXNhYmxlX2lycShpcnEpOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCi0JLyogTk9URTogVGhlIHJlYWQgcmVnaXN0ZXIgMywgd2hpY2ggaG9sZHMgdGhlIGlycSBzdGF0dXMsCi0JICogICAgICAgZG9lcyBzbyBmb3IgYm90aCBjaGFubmVscyBvbiBlYWNoIGNoaXAuICBBbHRob3VnaAotCSAqICAgICAgIHRoZSBzdGF0dXMgdmFsdWUgaXRzZWxmIG11c3QgYmUgcmVhZCBmcm9tIHRoZSBBCi0JICogICAgICAgY2hhbm5lbCBhbmQgaXMgb25seSB2YWxpZCB3aGVuIHJlYWQgZnJvbSBjaGFubmVsIEEuCi0JICogICAgICAgWWVzLi4uIGJyb2tlbiBoYXJkd2FyZS4uLgotCSAqLwotI2RlZmluZSBDSEFOX0lSUU1BU0sgKENIQlJ4SVAgfCBDSEJUeElQIHwgQ0hCRVhUKQotCi0JaWYgKGluZm8tPnpzX2NoYW5fYSA9PSBpbmZvLT56c19jaGFubmVsKQotCQlzaGlmdCA9IDM7CS8qIENoYW5uZWwgQSAqLwotCWVsc2UKLQkJc2hpZnQgPSAwOwkvKiBDaGFubmVsIEIgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JZm9yICg7OykgewotCQl6c19pbnRyZWcgPSByZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5fYSwgMykgPj4gc2hpZnQ7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX0lOVFIKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJzX2ludGVycnVwdDogaXJxICVkLCB6c19pbnRyZWcgMHgleFxuIiwKLQkJICAgICAgIGlycSwgKGludCl6c19pbnRyZWcpOwotI2VuZGlmCi0KLQkJaWYgKCh6c19pbnRyZWcgJiBDSEFOX0lSUU1BU0spID09IDApCi0JCQlicmVhazsKLQkJaGFuZGxlZCA9IDE7Ci0KLQkJaWYgKHpzX2ludHJlZyAmIENIQlJ4SVApIHsKLQkJCS8qIElmIHdlIGFyZSBkb2luZyBETUEsIHdlIG9ubHkgYXNrIGZvciBpbnRlcnJ1cHRzCi0JCQkgICBvbiBjaGFyYWN0ZXJzIHdpdGggZXJyb3JzIG9yIHNwZWNpYWwgY29uZGl0aW9ucy4gKi8KLQkJCWlmIChpbmZvLT5kbWFfaW5pdHRlZCkKLQkJCQlyZWNlaXZlX3NwZWNpYWxfZG1hKGluZm8pOwotCQkJZWxzZQotCQkJCXJlY2VpdmVfY2hhcnMoaW5mbywgcmVncyk7Ci0JCX0KLQkJaWYgKHpzX2ludHJlZyAmIENIQlR4SVApCi0JCQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQkJaWYgKHpzX2ludHJlZyAmIENIQkVYVCkKLQkJCXN0YXR1c19oYW5kbGUoaW5mbyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKLX0KLQotLyogVHJhbnNtaXQgRE1BIGludGVycnVwdCAtIG5vdCB1c2VkIGF0IHByZXNlbnQgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCByc190eGRtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiBSZWNlaXZlIERNQSBpbnRlcnJ1cHQuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCByc19yeGRtYV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSBkZXZfaWQ7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2Q7Ci0KLQlpZiAoIWluZm8tPmRtYV9pbml0dGVkKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0Jc3Bpbl9sb2NrKCZpbmZvLT5yeF9kbWFfbG9jayk7Ci0JLyogRmlyc3QsIGNvbmZpcm0gdGhhdCB0aGlzIGludGVycnVwdCBpcywgaW5kZWVkLCBjb21pbmcgKi8KLQkvKiBmcm9tIFJ4IERNQSAqLwotCWNkID0gaW5mby0+cnhfY21kc1tpbmZvLT5yeF9jYnVmXSArIDI7Ci0JaWYgKChpbl9sZTE2KCZjZC0+eGZlcl9zdGF0dXMpICYgKFJVTiB8IEFDVElWRSkpICE9IChSVU4gfCBBQ1RJVkUpKSB7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5yeF9kbWFfbG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JaWYgKGluZm8tPnJ4X2ZidWYgIT0gUlhfTk9fRkJVRikgewotCQlpbmZvLT5yeF9jYnVmID0gaW5mby0+cnhfZmJ1ZjsKLQkJaWYgKCsraW5mby0+cnhfZmJ1ZiA9PSBpbmZvLT5yeF9uYnVmKQotCQkJaW5mby0+cnhfZmJ1ZiA9IDA7Ci0JCWlmIChpbmZvLT5yeF9mYnVmID09IGluZm8tPnJ4X3VidWYpCi0JCQlpbmZvLT5yeF9mYnVmID0gUlhfTk9fRkJVRjsKLQl9Ci0Jc3Bpbl91bmxvY2soJmluZm8tPnJ4X2RtYV9sb2NrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBIZXJlIGVuZHMgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgcm91dGluZXMuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcnNfc3RvcCgpIGFuZCByc19zdGFydCgpCi0gKgotICogVGhpcyByb3V0aW5lcyBhcmUgY2FsbGVkIGJlZm9yZSBzZXR0aW5nIG9yIHJlc2V0dGluZyB0dHktPnN0b3BwZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIHZvaWQgcnNfc3RvcChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19TVE9QCi0JcHJpbnRrKEtFUk5fREVCVUcgInJzX3N0b3AgJWxkLi4uLlxuIiwKLQkgICAgICAgdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7Ci0jZW5kaWYKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfc3RvcCIpKQotCQlyZXR1cm47Ci0KLSNpZiAwCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoaW5mby0+Y3VycmVnc1s1XSAmIFR4RU5BQikgewotCQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeEVOQUI7Ci0JCWluZm8tPnBlbmRyZWdzWzVdICY9IH5UeEVOQUI7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIGluZm8tPmN1cnJlZ3NbNV0pOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgcnNfc3RhcnQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotI2lmZGVmIFNFUklBTF9ERUJVR19TVE9QCi0JcHJpbnRrKEtFUk5fREVCVUcgInJzX3N0YXJ0ICVsZC4uLi5cbiIsIAotCSAgICAgICB0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19zdGFydCIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotI2lmIDAKLQlpZiAoaW5mby0+eG1pdF9jbnQgJiYgaW5mby0+eG1pdF9idWYgJiYgIShpbmZvLT5jdXJyZWdzWzVdICYgVHhFTkFCKSkgewotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4RU5BQjsKLQkJaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQl9Ci0jZWxzZQotCWlmIChpbmZvLT54bWl0X2NudCAmJiBpbmZvLT54bWl0X2J1ZiAmJiAhaW5mby0+dHhfYWN0aXZlKSB7Ci0JCXRyYW5zbWl0X2NoYXJzKGluZm8pOwotCX0KLSNlbmRpZgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbAkqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSBwcml2YXRlXzsKLQlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwotCi0JdHR5ID0gaW5mby0+dHR5OwotCWlmICghdHR5KQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJTX0VWRU5UX1dSSVRFX1dBS0VVUCwgJmluZm8tPmV2ZW50KSkKLQkJdHR5X3dha2V1cCh0dHkpOwotfQotCi1zdGF0aWMgaW50IHN0YXJ0dXAoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKQotewotCWludCBkZWxheTsKLQotCU9QTkRCRygic3RhcnR1cCgpICh0dHlTJWQsIGlycSAlZClcbiIsIGluZm8tPmxpbmUsIGluZm8tPmlycSk7Ci0gCi0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpIHsKLQkJT1BOREJHKCIgLT4gYWxyZWFkeSBpbml0ZWRcbiIpOwotIAkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFpbmZvLT54bWl0X2J1ZikgewotCQlpbmZvLT54bWl0X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFpbmZvLT54bWl0X2J1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCU9QTkRCRygic3RhcnRpbmcgdXAgdHR5UyVkIChpcnEgJWQpLi4uXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5pcnEpOwotCi0JZGVsYXkgPSBzZXRfc2NjX3Bvd2VyKGluZm8sIDEpOwotCi0Jc2V0dXBfc2NjKGluZm8pOwotCi0JaWYgKGRlbGF5KSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJLyogZGVsYXkgaXMgaW4gbXMgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJaW5mby0+cG93ZXJfd2FpdCA9IDE7Ci0JCW1vZF90aW1lcigmaW5mby0+cG93ZXJ1cF90aW1lciwKLQkJCSAgamlmZmllcyArIChkZWxheSAqIEhaICsgOTk5KSAvIDEwMDApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JT1BOREJHKCJlbmFibGluZyBJUlEgb24gdHR5UyVkIChpcnEgJWQpLi4uXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5pcnEpOwotCi0JaW5mby0+ZmxhZ3MgfD0gWklMT0dfSU5JVElBTElaRUQ7Ci0JZW5hYmxlX2lycShpbmZvLT5pcnEpOwotCWlmIChpbmZvLT5kbWFfaW5pdHRlZCkgewotCQllbmFibGVfaXJxKGluZm8tPnJ4X2RtYV9pcnEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgX0lOTElORV8gdm9pZCByeGRtYV9zdGFydChzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8sIGludCBjdXJyKQotewotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICpyZCA9ICZpbmZvLT5yeC0+ZG1hOwotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNkID0gaW5mby0+cnhfY21kc1tjdXJyXTsKLQotLy9wcmludGsoS0VSTl9ERUJVRyAiU0NDOiByeGRtYV9zdGFydFxuIik7Ci0KLQlzdF9sZTMyKCZyZC0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhjZCkpOwotCW91dF9sZTMyKCZyZC0+Y29udHJvbCwgKFJVTiA8PCAxNikgfCBSVU4pOwotfQotCi1zdGF0aWMgdm9pZCByeGRtYV90b190dHkoc3RydWN0IG1hY19zZXJpYWwgKmluZm8pCi17Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QJKnR0eSA9IGluZm8tPnR0eTsKLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqcmQgPSAmaW5mby0+cngtPmRtYTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXNpZHVlLCBhdmFpbGFibGUsIHNwYWNlLCBkb19xdWV1ZTsKLQotCWlmICghdHR5KQotCQlyZXR1cm47Ci0KLQlkb19xdWV1ZSA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnJ4X2RtYV9sb2NrLCBmbGFncyk7Ci1tb3JlOgotCXNwYWNlID0gVFRZX0ZMSVBCVUZfU0laRSAtIHR0eS0+ZmxpcC5jb3VudDsKLQlpZiAoIXNwYWNlKSB7Ci0JCWRvX3F1ZXVlKys7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXNpZHVlID0gMDsKLQlpZiAoaW5mby0+cnhfdWJ1ZiA9PSBpbmZvLT5yeF9jYnVmKSB7Ci0JCWlmICgobGRfbGUzMigmcmQtPnN0YXR1cykgJiBBQ1RJVkUpICE9IDApIHsKLQkJCWRiZG1hX2ZsdXNoKHJkKTsKLQkJCWlmIChpbl9sZTMyKCZyZC0+Y21kcHRyKQotCQkJICAgID09IHZpcnRfdG9fYnVzKGluZm8tPnJ4X2NtZHNbaW5mby0+cnhfY2J1Zl0rMSkpCi0JCQkJcmVzaWR1ZSA9IGluX2xlMTYoJmluZm8tPnJ4LT5yZXNfY291bnQpOwotCQl9Ci0JfQotCWF2YWlsYWJsZSA9IFJYX0JVRl9TSVpFIC0gcmVzaWR1ZSAtIGluZm8tPnJ4X2RvbmVfYnl0ZXM7Ci0JaWYgKGF2YWlsYWJsZSA+IHNwYWNlKQotCQlhdmFpbGFibGUgPSBzcGFjZTsKLQlpZiAoYXZhaWxhYmxlKSB7Ci0JCW1lbWNweSh0dHktPmZsaXAuY2hhcl9idWZfcHRyLAotCQkgICAgICAgaW5mby0+cnhfY2hhcl9idWZbaW5mby0+cnhfdWJ1Zl0gKyBpbmZvLT5yeF9kb25lX2J5dGVzLAotCQkgICAgICAgYXZhaWxhYmxlKTsKLQkJbWVtY3B5KHR0eS0+ZmxpcC5mbGFnX2J1Zl9wdHIsCi0JCSAgICAgICBpbmZvLT5yeF9mbGFnX2J1ZltpbmZvLT5yeF91YnVmXSArIGluZm8tPnJ4X2RvbmVfYnl0ZXMsCi0JCSAgICAgICBhdmFpbGFibGUpOwotCQl0dHktPmZsaXAuY2hhcl9idWZfcHRyICs9IGF2YWlsYWJsZTsKLQkJdHR5LT5mbGlwLmNvdW50ICs9IGF2YWlsYWJsZTsKLQkJdHR5LT5mbGlwLmZsYWdfYnVmX3B0ciArPSBhdmFpbGFibGU7Ci0JCW1lbXNldChpbmZvLT5yeF9mbGFnX2J1ZltpbmZvLT5yeF91YnVmXSArIGluZm8tPnJ4X2RvbmVfYnl0ZXMsCi0JCSAgICAgICAwLCBhdmFpbGFibGUpOwotCQlpbmZvLT5yeF9kb25lX2J5dGVzICs9IGF2YWlsYWJsZTsKLQkJZG9fcXVldWUrKzsKLQl9Ci0JaWYgKGluZm8tPnJ4X2RvbmVfYnl0ZXMgPT0gUlhfQlVGX1NJWkUpIHsKLQkJdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2QgPSBpbmZvLT5yeF9jbWRzW2luZm8tPnJ4X3VidWZdOwotCi0JCWlmIChpbmZvLT5yeF91YnVmID09IGluZm8tPnJ4X2NidWYpCi0JCQlnb3RvIG91dDsKLQkJLyogbWFyayByeF9jaGFyX2J1ZltyeF91YnVmXSBmcmVlICovCi0JCXN0X2xlMTYoJmNkLT5jb21tYW5kLCBEQkRNQV9OT1ApOwotCQljZCsrOwotCQlzdF9sZTMyKCZjZC0+Y21kX2RlcCwgMCk7Ci0JCXN0X2xlMzIoKHVuc2lnbmVkIGludCAqKSZjZC0+cmVzX2NvdW50LCAwKTsKLQkJY2QrKzsKLQkJc3RfbGUxNigmY2QtPnhmZXJfc3RhdHVzLCAwKTsKLQotCQlpZiAoaW5mby0+cnhfZmJ1ZiA9PSBSWF9OT19GQlVGKSB7Ci0JCQlpbmZvLT5yeF9mYnVmID0gaW5mby0+cnhfdWJ1ZjsKLQkJCWlmICghKGxkX2xlMzIoJnJkLT5zdGF0dXMpICYgQUNUSVZFKSkgewotCQkJCWRiZG1hX3Jlc2V0KCZpbmZvLT5yeC0+ZG1hKTsKLQkJCQlyeGRtYV9zdGFydChpbmZvLCBpbmZvLT5yeF91YnVmKTsKLQkJCQlpbmZvLT5yeF9jYnVmID0gaW5mby0+cnhfdWJ1ZjsKLQkJCX0KLQkJfQotCQlpbmZvLT5yeF9kb25lX2J5dGVzID0gMDsKLQkJaWYgKCsraW5mby0+cnhfdWJ1ZiA9PSBpbmZvLT5yeF9uYnVmKQotCQkJaW5mby0+cnhfdWJ1ZiA9IDA7Ci0JCWlmIChpbmZvLT5yeF9mYnVmID09IGluZm8tPnJ4X3VidWYpCi0JCQlpbmZvLT5yeF9mYnVmID0gUlhfTk9fRkJVRjsKLQkJZ290byBtb3JlOwotCX0KLW91dDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5yeF9kbWFfbG9jaywgZmxhZ3MpOwotCWlmIChkb19xdWV1ZSkKLQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLX0KLQotc3RhdGljIHZvaWQgcG9sbF9yeGRtYSh1bnNpZ25lZCBsb25nIHByaXZhdGVfKQotewotCXN0cnVjdCBtYWNfc2VyaWFsCSppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopIHByaXZhdGVfOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyeGRtYV90b190dHkoaW5mbyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnJ4X2RtYV9sb2NrLCBmbGFncyk7Ci0JbW9kX3RpbWVyKCZpbmZvLT5wb2xsX2RtYV90aW1lciwgUlhfRE1BX1RJTUVSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5yeF9kbWFfbG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfaW5pdChzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8pCi17Ci0JaW50IGksIHNpemU7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqY2Q7Ci0JdW5zaWduZWQgY2hhciAqcDsKLQotCWluZm8tPnJ4X25idWYgPSA4OwotCi0JLyogdmFyaW91cyBtZW0gc2V0IHVwICovCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSAqICgzICogaW5mby0+cnhfbmJ1ZiArIDIpCi0JCSsgKFJYX0JVRl9TSVpFICogMiArIHNpemVvZigqaW5mby0+cnhfY21kcykKLQkJICAgKyBzaXplb2YoKmluZm8tPnJ4X2NoYXJfYnVmKSArIHNpemVvZigqaW5mby0+cnhfZmxhZ19idWYpKQotCQkqIGluZm8tPnJ4X25idWY7Ci0JaW5mby0+ZG1hX3ByaXYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQlpZiAoaW5mby0+ZG1hX3ByaXYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCW1lbXNldChpbmZvLT5kbWFfcHJpdiwgMCwgc2l6ZSk7Ci0KLQlpbmZvLT5yeF9jbWRzID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKiopaW5mby0+ZG1hX3ByaXY7Ci0JaW5mby0+cnhfY2hhcl9idWYgPSAodW5zaWduZWQgY2hhciAqKikgKGluZm8tPnJ4X2NtZHMgKyBpbmZvLT5yeF9uYnVmKTsKLQlpbmZvLT5yeF9mbGFnX2J1ZiA9IGluZm8tPnJ4X2NoYXJfYnVmICsgaW5mby0+cnhfbmJ1ZjsKLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgKGluZm8tPnJ4X2ZsYWdfYnVmICsgaW5mby0+cnhfbmJ1Zik7Ci0JZm9yIChpID0gMDsgaSA8IGluZm8tPnJ4X25idWY7IGkrKywgcCArPSBSWF9CVUZfU0laRSkKLQkJaW5mby0+cnhfY2hhcl9idWZbaV0gPSBwOwotCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5yeF9uYnVmOyBpKyssIHAgKz0gUlhfQlVGX1NJWkUpCi0JCWluZm8tPnJ4X2ZsYWdfYnVmW2ldID0gcDsKLQotCS8qIGEgYml0IG9mIERNQSBwcm9ncmFtbWluZyAqLwotCWNkID0gaW5mby0+cnhfY21kc1swXSA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopIERCRE1BX0FMSUdOKHApOwotCXN0X2xlMTYoJmNkLT5jb21tYW5kLCBEQkRNQV9OT1ApOwotCWNkKys7Ci0Jc3RfbGUxNigmY2QtPnJlcV9jb3VudCwgUlhfQlVGX1NJWkUpOwotCXN0X2xlMTYoJmNkLT5jb21tYW5kLCBJTlBVVF9NT1JFKTsKLQlzdF9sZTMyKCZjZC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGluZm8tPnJ4X2NoYXJfYnVmWzBdKSk7Ci0JY2QrKzsKLQlzdF9sZTE2KCZjZC0+cmVxX2NvdW50LCA0KTsKLQlzdF9sZTE2KCZjZC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IElOVFJfQUxXQVlTKTsKLQlzdF9sZTMyKCZjZC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGNkLTIpKTsKLQlzdF9sZTMyKCZjZC0+Y21kX2RlcCwgREJETUFfU1RPUCk7Ci0JZm9yIChpID0gMTsgaSA8IGluZm8tPnJ4X25idWY7IGkrKykgewotCQlpbmZvLT5yeF9jbWRzW2ldID0gKytjZDsKLQkJc3RfbGUxNigmY2QtPmNvbW1hbmQsIERCRE1BX05PUCk7Ci0JCWNkKys7Ci0JCXN0X2xlMTYoJmNkLT5yZXFfY291bnQsIFJYX0JVRl9TSVpFKTsKLQkJc3RfbGUxNigmY2QtPmNvbW1hbmQsIElOUFVUX01PUkUpOwotCQlzdF9sZTMyKCZjZC0+cGh5X2FkZHIsIHZpcnRfdG9fYnVzKGluZm8tPnJ4X2NoYXJfYnVmW2ldKSk7Ci0JCWNkKys7Ci0JCXN0X2xlMTYoJmNkLT5yZXFfY291bnQsIDQpOwotCQlzdF9sZTE2KCZjZC0+Y29tbWFuZCwgU1RPUkVfV09SRCB8IElOVFJfQUxXQVlTKTsKLQkJc3RfbGUzMigmY2QtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhjZC0yKSk7Ci0JCXN0X2xlMzIoJmNkLT5jbWRfZGVwLCBEQkRNQV9TVE9QKTsKLQl9Ci0JY2QrKzsKLQlzdF9sZTE2KCZjZC0+Y29tbWFuZCwgREJETUFfTk9QIHwgQlJfQUxXQVlTKTsKLQlzdF9sZTMyKCZjZC0+Y21kX2RlcCwgdmlydF90b19idXMoaW5mby0+cnhfY21kc1swXSkpOwotCi0JLyogc2V0dXAgRE1BIHRvIG91ciBsaWtpbmcgKi8KLQlkYmRtYV9yZXNldCgmaW5mby0+cngtPmRtYSk7Ci0Jc3RfbGUzMigmaW5mby0+cngtPmRtYS5pbnRyX3NlbCwgMHgxMDAwMSk7Ci0Jc3RfbGUzMigmaW5mby0+cngtPmRtYS5icl9zZWwsIDB4MTAwMDEpOwotCW91dF9sZTMyKCZpbmZvLT5yeC0+ZG1hLndhaXRfc2VsLCAweDEwMDAxKTsKLQotCS8qIHNldCB2YXJpb3VzIGZsYWdzICovCi0JaW5mby0+cnhfdWJ1ZiA9IDA7Ci0JaW5mby0+cnhfY2J1ZiA9IDA7Ci0JaW5mby0+cnhfZmJ1ZiA9IGluZm8tPnJ4X3VidWYgKyAxOwotCWlmIChpbmZvLT5yeF9mYnVmID09IGluZm8tPnJ4X25idWYpCi0JCWluZm8tPnJ4X2ZidWYgPSBSWF9OT19GQlVGOwotCWluZm8tPnJ4X2RvbmVfYnl0ZXMgPSAwOwotCi0JLyogc2V0dXAgcG9sbGluZyAqLwotCWluaXRfdGltZXIoJmluZm8tPnBvbGxfZG1hX3RpbWVyKTsKLQlpbmZvLT5wb2xsX2RtYV90aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJnBvbGxfcnhkbWE7Ci0JaW5mby0+cG9sbF9kbWFfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluZm87Ci0KLQlpbmZvLT5kbWFfaW5pdHRlZCA9IDE7Ci19Ci0KLS8qCi0gKiBGaXhaZXJvQnVnLi4uLldvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgU0NDIHJlY2V2aW5nIGNoYW5uZWwuCi0gKiBUYWtlbiBmcm9tIERhcndpbiBjb2RlLCAxNSBTZXB0LiAyMDAwICAtRGFuTQotICoKLSAqIFRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgcHJldmVudHMgYSBwcm9ibGVtIHRoYXQgaXMgc2VlbiB3aXRoIE8nSGFyZSBBU0lDcwotICogKG1vc3QgdmVyc2lvbnMgLS0gYWxzbyB3aXRoIHNvbWUgSGVhdGhyb3cgYW5kIEh5ZHJhIEFTSUNzKSB3aGVyZSBhIHplcm8KLSAqIGF0IHRoZSBpbnB1dCB0byB0aGUgcmVjZWl2ZXIgYmVjb21lcyAnc3R1Y2snIGFuZCBsb2NrcyB1cCB0aGUgcmVjZWl2ZXIuCi0gKiBUaGlzIHByb2JsZW0gY2FuIG9jY3VyIGFzIGEgcmVzdWx0IG9mIGEgemVybyBiaXQgYXQgdGhlIHJlY2VpdmVyIGlucHV0Ci0gKiBjb2luY2lkZW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOgotICoKLSAqCVRoZSBTQ0MgaXMgaW5pdGlhbGl6ZWQgKGhhcmR3YXJlIG9yIHNvZnR3YXJlKS4KLSAqCUEgZnJhbWluZyBlcnJvciBpcyBkZXRlY3RlZC4KLSAqCVRoZSBjbG9ja2luZyBvcHRpb24gY2hhbmdlcyBmcm9tIHN5bmNocm9ub3VzIG9yIFgxIGFzeW5jaHJvbm91cwotICoJCWNsb2NraW5nIHRvIFgxNiwgWDMyLCBvciBYNjQgYXN5bmNocm9ub3VzIGNsb2NraW5nLgotICoJVGhlIGRlY29kaW5nIG1vZGUgaXMgY2hhbmdlZCBhbW9uZyBOUlosIE5SWkksIEZNMCwgb3IgRk0xLgotICoKLSAqIFRoaXMgd29ya2Fyb3VuZCBhdHRlbXB0cyB0byByZWNvdmVyIGZyb20gdGhlIGxvY2t1cCBjb25kaXRpb24gYnkgcGxhY2luZwotICogdGhlIFNDQyBpbiBzeW5jaHJvbm91cyBsb29wYmFjayBtb2RlIHdpdGggYSBmYXN0IGNsb2NrIGJlZm9yZSBwcm9ncmFtbWluZwotICogYW55IG9mIHRoZSBhc3luY2hyb25vdXMgbW9kZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGZpeF96ZXJvX2J1Z19zY2Moc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKQotewotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksCi0JCSAgICAoaW5mby0+enNfY2hhbm5lbCA9PSBpbmZvLT56c19jaGFuX2E/IENIUkE6IENIUkIpKTsKLQl1ZGVsYXkoMTApOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksCi0JCSAgICAoKGluZm8tPnpzX2NoYW5uZWwgPT0gaW5mby0+enNfY2hhbl9hPyBDSFJBOiBDSFJCKSB8IE5WKSk7Ci0KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA0LCAoWDFDTEsgfCBFWFRTWU5DKSk7Ci0KLQkvKiBJIHRoaW5rIHRoaXMgaXMgd3JvbmcuLi4uYnV0LCBJIGp1c3QgY29weWluZyBjb2RlLi4uLgotCSovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMywgKDggJiB+UnhFTkFCTEUpKTsKLQotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsICg4ICYgflR4RU5BQikpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksIE5WKTsJLyogRGlkbid0IHdlIGFscmVhZHkgZG8gdGhpcz8gKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxMSwgKFJDQlIgfCBUQ0JSKSk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTIsIDApOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEzLCAwKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxNCwgKExPT1BCQUsgfCBTU0JSKSk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTQsIChMT09QQkFLIHwgU1NCUiB8IEJSRU5BQkwpKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAzLCAoOCB8IFJ4RU5BQkxFKSk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCwgUkVTX0VYVF9JTlQpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19FWFRfSU5UKTsJLyogdG8ga2lsbCBzb21lIHRpbWUgKi8KLQotCS8qIFRoZSBjaGFubmVsIHNob3VsZCBiZSBPSyBub3csIGJ1dCBpdCBpcyBwcm9iYWJseSByZWNlaXZpbmcKLQkgKiBsb29wYmFjayBnYXJiYWdlLgotCSAqIFN3aXRjaCB0byBhc3luY2hyb25vdXMgbW9kZSwgZGlzYWJsZSB0aGUgcmVjZWl2ZXIsCi0JICogYW5kIGRpc2NhcmQgZXZlcnl0aGluZyBpbiB0aGUgcmVjZWl2ZSBidWZmZXIuCi0JICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgOSwgTlYpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDQsIFBBUl9FTkEpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDMsICg4ICYgflJ4RU5BQkxFKSk7Ci0KLQl3aGlsZSAocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSB7Ci0JCSh2b2lkKXJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgOCk7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19FWFRfSU5UKTsKLQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCwgRVJSX1JFUyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNldHVwX3NjYyhzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCU9QTkRCRygic2V0dGluZyB1cCB0dHlTJWQgU0NDLi4uXG4iLCBpbmZvLT5saW5lKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBOaWNlIGJ1Z2d5IEhXIC4uLiAqLwotCWZpeF96ZXJvX2J1Z19zY2MoaW5mbyk7Ci0KLQkvKgotCSAqIFJlc2V0IHRoZSBjaGlwLgotCSAqLwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksCi0JCSAgICAoaW5mby0+enNfY2hhbm5lbCA9PSBpbmZvLT56c19jaGFuX2E/IENIUkE6IENIUkIpKTsKLQl1ZGVsYXkoMTApOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDksIDApOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgcmVjZWl2ZSBGSUZPLgotCSAqLwotCVpTX0NMRUFSRklGTyhpbmZvLT56c19jaGFubmVsKTsKLQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IDE7Ci0KLQkvKgotCSAqIFJlc2V0IERNQXMKLQkgKi8KLQlpZiAoaW5mby0+aGFzX2RtYSkKLQkJZG1hX2luaXQoaW5mbyk7Ci0KLQkvKgotCSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXJzLgotCSAqLwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIEVSUl9SRVMpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDAsIFJFU19IX0lVUyk7Ci0KLQkvKgotCSAqIFR1cm4gb24gUlRTIGFuZCBEVFIuCi0JICovCi0JaWYgKCFpbmZvLT5pc19pcmRhKQotCQl6c19ydHNkdHIoaW5mbywgMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIGVuYWJsZSBzZXF1ZW5jaW5nIGFuZCBpbnRlcnJ1cHRzCi0JICovCi0JaWYgKCFpbmZvLT5kbWFfaW5pdHRlZCkgewotCQkvKiBpbnRlcnJ1cHQgb24gZXh0L3N0YXR1cyBjaGFuZ2VzLCBhbGwgcmVjZWl2ZWQgY2hhcnMsCi0JCSAgIHRyYW5zbWl0IHJlYWR5ICovCi0JCWluZm8tPmN1cnJlZ3NbMV0gPSAoaW5mby0+Y3VycmVnc1sxXSAmIH4weDE4KQotCQkJCXwgKEVYVF9JTlRfRU5BQiB8IElOVF9BTExfUnggfCBUeElOVF9FTkFCKTsKLQl9IGVsc2UgewotCQkvKiBpbnRlcnJ1cHQgb24gZXh0L3N0YXR1cyBjaGFuZ2VzLCBXL1JlcSBwaW4gaXMKLQkJICAgcmVjZWl2ZSBETUEgcmVxdWVzdCAqLwotCQlpbmZvLT5jdXJyZWdzWzFdID0gKGluZm8tPmN1cnJlZ3NbMV0gJiB+KDB4MTggfCBUeElOVF9FTkFCKSkKLQkJCQl8IChFWFRfSU5UX0VOQUIgfCBXVF9SRFlfUlQgfCBXVF9GTl9SRFlGTik7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEsIGluZm8tPmN1cnJlZ3NbMV0pOwotCQkvKiBlbmFibGUgVy9SZXEgcGluICovCi0JCWluZm8tPmN1cnJlZ3NbMV0gfD0gV1RfUkRZX0VOQUI7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEsIGluZm8tPmN1cnJlZ3NbMV0pOwotCQkvKiBlbmFibGUgaW50ZXJydXB0cyBvbiB0cmFuc21pdCByZWFkeSBhbmQgcmVjZWl2ZSBlcnJvcnMgKi8KLQkJaW5mby0+Y3VycmVnc1sxXSB8PSBJTlRfRVJSX1J4IHwgVHhJTlRfRU5BQjsKLQl9Ci0JaW5mby0+cGVuZHJlZ3NbMV0gPSBpbmZvLT5jdXJyZWdzWzFdOwotCWluZm8tPmN1cnJlZ3NbM10gfD0gKFJ4RU5BQkxFIHwgUng4KTsKLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0JaW5mby0+Y3VycmVnc1s1XSB8PSAoVHhFTkFCIHwgVHg4KTsKLQlpbmZvLT5wZW5kcmVnc1s1XSA9IGluZm8tPmN1cnJlZ3NbNV07Ci0JaW5mby0+Y3VycmVnc1s5XSB8PSAoTlYgfCBNSUUpOwotCWluZm8tPnBlbmRyZWdzWzldID0gaW5mby0+Y3VycmVnc1s5XTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAzLCBpbmZvLT5jdXJyZWdzWzNdKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA5LCBpbmZvLT5jdXJyZWdzWzldKTsKLQotCWlmIChpbmZvLT50dHkpCi0JCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQlpbmZvLT54bWl0X2NudCA9IGluZm8tPnhtaXRfaGVhZCA9IGluZm8tPnhtaXRfdGFpbCA9IDA7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIFNldCB0aGUgc3BlZWQgb2YgdGhlIHNlcmlhbCBwb3J0Ci0JICovCi0JY2hhbmdlX3NwZWVkKGluZm8sIDApOwotCi0JLyogU2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBSUjAgKi8KLQlpbmZvLT5yZWFkX3JlZ196ZXJvID0gcmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKTsKLQotCWlmIChpbmZvLT5kbWFfaW5pdHRlZCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+cnhfZG1hX2xvY2ssIGZsYWdzKTsKLQkJcnhkbWFfc3RhcnQoaW5mbywgMCk7Ci0JCWluZm8tPnBvbGxfZG1hX3RpbWVyLmV4cGlyZXMgPSBSWF9ETUFfVElNRVI7Ci0JCWFkZF90aW1lcigmaW5mby0+cG9sbF9kbWFfdGltZXIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5yeF9kbWFfbG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGhpcyByb3V0aW5lIHdpbGwgc2h1dGRvd24gYSBzZXJpYWwgcG9ydDsgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIGFuZAotICogRFRSIGlzIGRyb3BwZWQgaWYgdGhlIGhhbmd1cCBvbiBjbG9zZSB0ZXJtaW8gZmxhZyBpcyBvbi4KLSAqLwotc3RhdGljIHZvaWQgc2h1dGRvd24oc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvKQotewotCU9QTkRCRygiU2h1dHRpbmcgZG93biBzZXJpYWwgcG9ydCAlZCAoaXJxICVkKS4uLi5cbiIsIGluZm8tPmxpbmUsCi0JICAgICAgIGluZm8tPmlycSk7Ci0KLQlpZiAoIShpbmZvLT5mbGFncyAmIFpJTE9HX0lOSVRJQUxJWkVEKSkgewotCQlPUE5EQkcoIihhbHJlYWR5IHNodXRkb3duKVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaW5mby0+aGFzX2RtYSkgewotCQlkZWxfdGltZXIoJmluZm8tPnBvbGxfZG1hX3RpbWVyKTsKLQkJZGJkbWFfcmVzZXQoaW5mby0+dHhfZG1hKTsKLQkJZGJkbWFfcmVzZXQoJmluZm8tPnJ4LT5kbWEpOwotCQlkaXNhYmxlX2lycShpbmZvLT50eF9kbWFfaXJxKTsKLQkJZGlzYWJsZV9pcnEoaW5mby0+cnhfZG1hX2lycSk7Ci0JfQotCWRpc2FibGVfaXJxKGluZm8tPmlycSk7Ci0KLQlpbmZvLT5wZW5kcmVnc1sxXSA9IGluZm8tPmN1cnJlZ3NbMV0gPSAwOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDEsIDApOwkvKiBubyBpbnRlcnJ1cHRzICovCi0KLQlpbmZvLT5jdXJyZWdzWzNdICY9IH5SeEVOQUJMRTsKLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMywgaW5mby0+Y3VycmVnc1szXSk7Ci0KLQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeEVOQUI7Ci0JaWYgKCFpbmZvLT50dHkgfHwgQ19IVVBDTChpbmZvLT50dHkpKQotCQlpbmZvLT5jdXJyZWdzWzVdICY9IH5EVFI7Ci0JaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIGluZm8tPmN1cnJlZ3NbNV0pOwotCi0JaWYgKGluZm8tPnR0eSkKLQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKLQotCXNldF9zY2NfcG93ZXIoaW5mbywgMCk7Ci0KLQlpZiAoaW5mby0+eG1pdF9idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbmZvLT54bWl0X2J1Zik7Ci0JCWluZm8tPnhtaXRfYnVmID0gMDsKLQl9Ci0KLQlpZiAoaW5mby0+aGFzX2RtYSAmJiBpbmZvLT5kbWFfcHJpdikgewotCQlrZnJlZShpbmZvLT5kbWFfcHJpdik7Ci0JCWluZm8tPmRtYV9wcml2ID0gTlVMTDsKLQkJaW5mby0+ZG1hX2luaXR0ZWQgPSAwOwotCX0KLQotCW1lbXNldChpbmZvLT5jdXJyZWdzLCAwLCBzaXplb2YoaW5mby0+Y3VycmVncykpOwotCW1lbXNldChpbmZvLT5wZW5kcmVncywgMCwgc2l6ZW9mKGluZm8tPnBlbmRyZWdzKSk7Ci0KLQlpbmZvLT5mbGFncyAmPSB+WklMT0dfSU5JVElBTElaRUQ7Ci19Ci0KLS8qCi0gKiBUdXJuIHBvd2VyIG9uIG9yIG9mZiB0byB0aGUgU0NDIGFuZCBhc3NvY2lhdGVkIHN0dWZmCi0gKiAocG9ydCBkcml2ZXJzLCBtb2RlbSwgSVIgcG9ydCwgZXRjLikKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgd2Ugc2hvdWxkIHdhaXQgYmVmb3JlCi0gKiB0cnlpbmcgdG8gdXNlIHRoZSBwb3J0LgotICovCi1zdGF0aWMgaW50IHNldF9zY2NfcG93ZXIoc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvLCBpbnQgc3RhdGUpCi17Ci0JaW50IGRlbGF5ID0gMDsKLQotCWlmIChzdGF0ZSkgewotCQlQV1JEQkcoInR0eVMlZDogcG93ZXJpbmcgdXAgaGFyZHdhcmVcbiIsIGluZm8tPmxpbmUpOwotCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCVBNQUNfRlRSX1NDQ19FTkFCTEUsCi0JCQlpbmZvLT5kZXZfbm9kZSwgaW5mby0+cG9ydF90eXBlLCAxKTsKLQkJaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKSB7Ci0JCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCQlQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCi0JCQkJaW5mby0+ZGV2X25vZGUsIDAsIDEpOwotCQkJZGVsYXkgPSAyNTAwOwkvKiB3YWl0IGZvciAyLjVzIGJlZm9yZSB1c2luZyAqLwotCQl9IGVsc2UgaWYgKGluZm8tPmlzX2lyZGEpCi0JCQltZGVsYXkoNTApOwkvKiBEbyBiZXR0ZXIgaGVyZSBvbmNlIHRoZSBwcm9ibGVtcwotCQkJICAgICAgICAgICAgICAgICAqIHdpdGggYmxvY2tpbmcgaGF2ZSBiZWVuIGlyb25lZCBvdXQKLQkJCSAgICAgICAgICAgICAgICAgKi8KLQl9IGVsc2UgewotCQkvKiBUT0RPOiBNYWtlIHRoYXQgZGVwZW5kIG9uIGEgdGltZXIsIGRvbid0IHBvd2VyIGRvd24KLQkJICogaW1tZWRpYXRlbHkKLQkJICovCi0JCVBXUkRCRygidHR5UyVkOiBzaHV0dGluZyBkb3duIGhhcmR3YXJlXG4iLCBpbmZvLT5saW5lKTsKLQkJaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKSB7Ci0JCQlQV1JEQkcoInR0eVMlZDogc2h1dHRpbmcgZG93biBtb2RlbVxuIiwgaW5mby0+bGluZSk7Ci0JCQlwbWFjX2NhbGxfZmVhdHVyZSgKLQkJCQlQTUFDX0ZUUl9NT0RFTV9FTkFCTEUsCi0JCQkJaW5mby0+ZGV2X25vZGUsIDAsIDApOwotCQl9Ci0JCXBtYWNfY2FsbF9mZWF0dXJlKAotCQkJUE1BQ19GVFJfU0NDX0VOQUJMRSwKLQkJCWluZm8tPmRldl9ub2RlLCBpbmZvLT5wb3J0X3R5cGUsIDApOwotCX0KLQlyZXR1cm4gZGVsYXk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlyZGFfcnRzX3B1bHNlcyhzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbywgaW50IHcpCi17Ci0JdWRlbGF5KHcpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQik7Ci0JdWRlbGF5KDIpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQiB8IFJUUyk7Ci0JdWRlbGF5KDgpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQik7Ci0JdWRlbGF5KDQpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIFR4OCB8IFR4RU5BQiB8IFJUUyk7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIGlyZGEgY29kZWMgb24gdGhlIGltYWMgdG8gdGhlIHNwZWNpZmllZCBiYXVkIHJhdGUuCi0gKi8KLXN0YXRpYyB2b2lkIGlyZGFfc2V0dXAoc3RydWN0IG1hY19zZXJpYWwgKmluZm8pCi17Ci0JaW50IGNvZGUsIHNwZWVkLCB0OwotCi0Jc3BlZWQgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRDsKLQlpZiAoc3BlZWQgPCBCMjQwMCB8fCBzcGVlZCA+IEIxMTUyMDApCi0JCXJldHVybjsKLQljb2RlID0gMHg0ZCArIEIxMTUyMDAgLSBzcGVlZDsKLQotCS8qIGRpc2FibGUgc2VyaWFsIGludGVycnVwdHMgYW5kIHJlY2VpdmUgRE1BICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMSwgaW5mby0+Y3VycmVnc1sxXSAmIH4weDlmKTsKLQotCS8qIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGRyYWluICovCi0JdCA9IDEwMDAwOwotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFR4X0JVRl9FTVApID09IDAKLQkgICAgICAgfHwgKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMSkgJiBBTExfU05UKSA9PSAwKSB7Ci0JCWlmICgtLXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmFuc21pdHRlciBkaWRuJ3QgZHJhaW5cbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotCXVkZWxheSgxMDApOwotCi0JLyogc2V0IHRvIDggYml0cywgbm8gcGFyaXR5LCAxOTIwMCBiYXVkLCBSVFMgb24sIERUUiBvZmYgKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA0LCBYMTZDTEsgfCBTQjEpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDExLCBUQ0JSIHwgUkNCUik7Ci0JdCA9IEJQU19UT19CUkcoMTkyMDAsIFpTX0NMT0NLLzE2KTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxMiwgdCk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTMsIHQgPj4gOCk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMTQsIEJSRU5BQkwpOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDMsIFJ4OCB8IFJ4RU5BQkxFKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBUeDggfCBUeEVOQUIgfCBSVFMpOwotCi0JLyogc2V0IFR4RCBsb3cgZm9yIH4xMDR1cyBhbmQgcHVsc2UgUlRTICovCi0JdWRlbGF5KDEwMDApOwotCXdyaXRlX3pzZGF0YShpbmZvLT56c19jaGFubmVsLCAweGZlKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgMTUwKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgMTgwKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgNTApOwotCXVkZWxheSgxMDApOwotCi0JLyogYXNzZXJ0IERUUiwgd2FpdCAzMG1zLCB0YWxrIHRvIHRoZSBjaGlwICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgVHg4IHwgVHhFTkFCIHwgUlRTIHwgRFRSKTsKLQltZGVsYXkoMzApOwotCXdoaWxlIChyZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDApICYgUnhfQ0hfQVYpCi0JCXJlYWRfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwpOwotCi0Jd3JpdGVfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwsIDEpOwotCXQgPSAxMDAwOwotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSA9PSAwKSB7Ci0JCWlmICgtLXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIHRpbWVkIG91dCBvbiAxc3QgYnl0ZVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQl1ZGVsYXkoMTApOwotCX0KLQl0ID0gcmVhZF96c2RhdGEoaW5mby0+enNfY2hhbm5lbCk7Ci0JaWYgKHQgIT0gNCkKLQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIDFzdCBieXRlID0gJXhcbiIsIHQpOwotCi0Jd3JpdGVfenNkYXRhKGluZm8tPnpzX2NoYW5uZWwsIGNvZGUpOwotCXQgPSAxMDAwOwotCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFJ4X0NIX0FWKSA9PSAwKSB7Ci0JCWlmICgtLXQgPD0gMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIHRpbWVkIG91dCBvbiAybmQgYnl0ZVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQl1ZGVsYXkoMTApOwotCX0KLQl0ID0gcmVhZF96c2RhdGEoaW5mby0+enNfY2hhbm5lbCk7Ci0JaWYgKHQgIT0gY29kZSkKLQkJcHJpbnRrKEtFUk5fRVJSICJpcmRhX3NldHVwIDJuZCBieXRlID0gJXggKCV4KVxuIiwgdCwgY29kZSk7Ci0KLQkvKiBEcm9wIERUUiBhZ2FpbiBhbmQgZG8gc29tZSBtb3JlIFJUUyBwdWxzZXMgKi8KLSBvdXQ6Ci0JdWRlbGF5KDEwMCk7Ci0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgVHg4IHwgVHhFTkFCIHwgUlRTKTsKLQlpcmRhX3J0c19wdWxzZXMoaW5mbywgODApOwotCi0JLyogV2Ugc2hvdWxkIGJlIHJpZ2h0IHRvIGdvIG5vdy4gIFdlIGFzc3VtZSB0aGF0IGxvYWRfenNyZWdzCi0JICAgd2lsbCBnZXQgY2FsbGVkIHNvb24gdG8gbG9hZCB1cCB0aGUgY29ycmVjdCBiYXVkIHJhdGUgZXRjLiAqLwotCWluZm8tPmN1cnJlZ3NbNV0gPSAoaW5mby0+Y3VycmVnc1s1XSB8IFJUUykgJiB+RFRSOwotCWluZm8tPnBlbmRyZWdzWzVdID0gaW5mby0+Y3VycmVnc1s1XTsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBVQVJUIGRpdmlzb3IgcmVnaXN0ZXJzIHRvIG1hdGNoCi0gKiB0aGUgc3BlY2lmaWVkIGJhdWQgcmF0ZSBmb3IgYSBzZXJpYWwgcG9ydC4KLSAqLwotc3RhdGljIHZvaWQgY2hhbmdlX3NwZWVkKHN0cnVjdCBtYWNfc2VyaWFsICppbmZvLCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCi17Ci0JdW5zaWduZWQgY2ZsYWc7Ci0JaW50CWJpdHM7Ci0JaW50CWJyZywgYmF1ZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpbmZvLT50dHkgfHwgIWluZm8tPnR0eS0+dGVybWlvcykKLQkJcmV0dXJuOwotCi0JY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKGluZm8tPnR0eSk7Ci0JaWYgKGJhdWQgPT0gMCkgewotCQlpZiAob2xkX3Rlcm1pb3MpIHsKLQkJCWluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+Q0JBVUQ7Ci0JCQlpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpOwotCQkJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+dHR5KTsKLQkJfQotCQllbHNlCi0JCQliYXVkID0gaW5mby0+enNfYmF1ZDsKLQl9Ci0JaWYgKGJhdWQgPiAyMzA0MDApCi0JCWJhdWQgPSAyMzA0MDA7Ci0JZWxzZSBpZiAoYmF1ZCA9PSAwKQotCQliYXVkID0gMzg0MDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWluZm8tPnpzX2JhdWQgPSBiYXVkOwotCWluZm8tPmNsa19kaXZpc29yID0gMTY7Ci0KLQlCQVVEQkcoS0VSTl9ERUJVRyAic2V0IHNwZWVkIHRvICVkIGJkcywgIiwgYmF1ZCk7Ci0KLQlzd2l0Y2ggKGJhdWQpIHsKLQljYXNlIFpTX0NMT0NLLzE2OgkvKiAyMzA0MDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgxNkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQljYXNlIFpTX0NMT0NLLzMyOgkvKiAxMTUyMDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgzMkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbmZvLT5jdXJyZWdzWzRdID0gWDE2Q0xLOwotCQlpbmZvLT5jdXJyZWdzWzExXSA9IFRDQlIgfCBSQ0JSOwotCQlicmcgPSBCUFNfVE9fQlJHKGJhdWQsIFpTX0NMT0NLL2luZm8tPmNsa19kaXZpc29yKTsKLQkJaW5mby0+Y3VycmVnc1sxMl0gPSAoYnJnICYgMjU1KTsKLQkJaW5mby0+Y3VycmVnc1sxM10gPSAoKGJyZyA+PiA4KSAmIDI1NSk7Ci0JCWluZm8tPmN1cnJlZ3NbMTRdID0gQlJFTkFCTDsKLQl9Ci0KLQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLwotCWluZm8tPmN1cnJlZ3NbM10gJj0gflJ4TkJJVFNfTUFTSzsKLQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeE5CSVRTX01BU0s7Ci0Jc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng1OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NTsKLQkJQkFVREJHKCI1IGJpdHMsICIpOwotCQliaXRzID0gNzsKLQkJYnJlYWs7Ci0JY2FzZSBDUzY6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng2OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NjsKLQkJQkFVREJHKCI2IGJpdHMsICIpOwotCQliaXRzID0gODsKLQkJYnJlYWs7Ci0JY2FzZSBDUzc6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng3OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NzsKLQkJQkFVREJHKCI3IGJpdHMsICIpOwotCQliaXRzID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSBDUzg6Ci0JZGVmYXVsdDogLyogZGVmYXVsdHMgdG8gOCBiaXRzICovCi0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng4OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4ODsKLQkJQkFVREJHKCI4IGJpdHMsICIpOwotCQliaXRzID0gMTA7Ci0JCWJyZWFrOwotCX0KLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0JaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCi0JaW5mby0+Y3VycmVnc1s0XSAmPSB+KFNCX01BU0sgfCBQQVJfRU5BIHwgUEFSX0VWRU4pOwotCWlmIChjZmxhZyAmIENTVE9QQikgewotCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFNCMjsKLQkJYml0cysrOwotCQlCQVVEQkcoIjIgc3RvcCwgIik7Ci0JfSBlbHNlIHsKLQkJaW5mby0+Y3VycmVnc1s0XSB8PSBTQjE7Ci0JCUJBVURCRygiMSBzdG9wLCAiKTsKLQl9Ci0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWJpdHMrKzsKLSAJCWluZm8tPmN1cnJlZ3NbNF0gfD0gUEFSX0VOQTsKLQkJQkFVREJHKCJwYXJpdHksICIpOwotCX0KLQlpZiAoIShjZmxhZyAmIFBBUk9ERCkpIHsKLQkJaW5mby0+Y3VycmVnc1s0XSB8PSBQQVJfRVZFTjsKLQl9Ci0JaW5mby0+cGVuZHJlZ3NbNF0gPSBpbmZvLT5jdXJyZWdzWzRdOwotCi0JaWYgKCEoY2ZsYWcgJiBDTE9DQUwpKSB7Ci0JCWlmICghKGluZm8tPmN1cnJlZ3NbMTVdICYgRENESUUpKQotCQkJaW5mby0+cmVhZF9yZWdfemVybyA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCk7Ci0JCWluZm8tPmN1cnJlZ3NbMTVdIHw9IERDRElFOwotCX0gZWxzZQotCQlpbmZvLT5jdXJyZWdzWzE1XSAmPSB+RENESUU7Ci0JaWYgKGNmbGFnICYgQ1JUU0NUUykgewotCQlpbmZvLT5jdXJyZWdzWzE1XSB8PSBDVFNJRTsKLQkJaWYgKChyZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDApICYgQ1RTKSAhPSAwKQotCQkJaW5mby0+dHhfc3RvcHBlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJaW5mby0+Y3VycmVnc1sxNV0gJj0gfkNUU0lFOwotCQlpbmZvLT50eF9zdG9wcGVkID0gMDsKLQl9Ci0JaW5mby0+cGVuZHJlZ3NbMTVdID0gaW5mby0+Y3VycmVnc1sxNV07Ci0KLQkvKiBDYWxjIHRpbWVvdXQgdmFsdWUuIFRoaXMgaXMgcHJldHR5IGJyb2tlbiB3aXRoIGhpZ2ggYmF1ZCByYXRlcyB3aXRoIEhaPTEwMC4KLQkgICBUaGlzIGNvZGUgd291bGQgbG92ZSBhIGxhcmdlciBIWiBhbmQgYSA+MSBmaWZvIHNpemUsIGJ1dCB0aGlzIGlzIG5vdAotCSAgIGEgcHJpb3JpdHkuIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSA+SFovMgotCSAqLwotCWluZm8tPnRpbWVvdXQgPSAoKGluZm8tPnhtaXRfZmlmb19zaXplKkhaKmJpdHMpIC8gYmF1ZCk7Ci0JaW5mby0+dGltZW91dCArPSBIWi81MCsxOwkvKiBBZGQgLjAyIHNlY29uZHMgb2Ygc2xvcCAqLwotCi0JQkFVREJHKCJ0aW1lb3V0PSVkLyVkcywgYmFzZTolZFxuIiwgKGludClpbmZvLT50aW1lb3V0LCAoaW50KUhaLAotCSAgICAgICAoaW50KWluZm8tPmJhdWRfYmFzZSk7Ci0KLQkvKiBzZXQgdGhlIGlyZGEgY29kZWMgdG8gdGhlIHJpZ2h0IHJhdGUgKi8KLQlpZiAoaW5mby0+aXNfaXJkYSkKLQkJaXJkYV9zZXR1cChpbmZvKTsKLQotCS8qIExvYWQgdXAgdGhlIG5ldyB2YWx1ZXMgKi8KLQlsb2FkX3pzcmVncyhpbmZvLT56c19jaGFubmVsLCBpbmZvLT5jdXJyZWdzKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcnNfZmx1c2hfY2hhcnMoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfZmx1c2hfY2hhcnMiKSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoIShpbmZvLT54bWl0X2NudCA8PSAwIHx8IHR0eS0+c3RvcHBlZCB8fCBpbmZvLT50eF9zdG9wcGVkIHx8Ci0JICAgICAgIWluZm8tPnhtaXRfYnVmKSkKLQkJLyogRW5hYmxlIHRyYW5zbWl0dGVyICovCi0JCXRyYW5zbWl0X2NoYXJzKGluZm8pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGludCByc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSwKLQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQotewotCWludAljLCByZXQgPSAwOwotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZSIpKQotCQlyZXR1cm4gMDsKLQotCWlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQljID0gbWluX3QoaW50LCBjb3VudCwgbWluKFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDEsCi0JCQkJCSAgU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfaGVhZCkpOwotCQlpZiAoYyA8PSAwKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKLQkJfQotCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7Ci0JCWluZm8tPnhtaXRfaGVhZCA9ICgoaW5mby0+eG1pdF9oZWFkICsgYykgJgotCQkJCSAgIChTRVJJQUxfWE1JVF9TSVpFLTEpKTsKLQkJaW5mby0+eG1pdF9jbnQgKz0gYzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlidWYgKz0gYzsKLQkJY291bnQgLT0gYzsKLQkJcmV0ICs9IGM7Ci0JfQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGluZm8tPnhtaXRfY250ICYmICF0dHktPnN0b3BwZWQgJiYgIWluZm8tPnR4X3N0b3BwZWQKLQkgICAgJiYgIWluZm8tPnR4X2FjdGl2ZSkKLQkJdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQJcmV0OwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc193cml0ZV9yb29tIikpCi0JCXJldHVybiAwOwotCXJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7Ci0JaWYgKHJldCA8IDApCi0JCXJldCA9IDA7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKXR0eS0+ZHJpdmVyX2RhdGE7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2NoYXJzX2luX2J1ZmZlciIpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gaW5mby0+eG1pdF9jbnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzX2ZsdXNoX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19mbHVzaF9idWZmZXIiKSkKLQkJcmV0dXJuOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl0dHlfd2FrZXVwKHR0eSk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX3Rocm90dGxlKCkKLSAqIAotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgdXBwZXItbGF5ZXIgdHR5IGxheWVyIHRvIHNpZ25hbCB0aGF0Ci0gKiBpbmNvbWluZyBjaGFyYWN0ZXJzIHNob3VsZCBiZSB0aHJvdHRsZWQuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotc3RhdGljIHZvaWQgcnNfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jaWZkZWYgU0VSSUFMX0RFQlVHX1RIUk9UVExFCi0JcHJpbnRrKEtFUk5fREVCVUcgInRocm90dGxlICVsZC4uLi5cbiIsdHR5LT5sZGlzYy5jaGFyc19pbl9idWZmZXIodHR5KSk7Ci0jZW5kaWYKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfdGhyb3R0bGUiKSkKLQkJcmV0dXJuOwotCi0JaWYgKElfSVhPRkYodHR5KSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlpbmZvLT54X2NoYXIgPSBTVE9QX0NIQVIodHR5KTsKLQkJaWYgKCFpbmZvLT50eF9hY3RpdmUpCi0JCQl0cmFuc21pdF9jaGFycyhpbmZvKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChDX0NSVFNDVFModHR5KSkgewotCQkvKgotCQkgKiBIZXJlIHdlIHdhbnQgdG8gdHVybiBvZmYgdGhlIFJUUyBsaW5lLiAgT24gTWFjaW50b3NoZXMsCi0JCSAqIHRoZSBleHRlcm5hbCBzZXJpYWwgcG9ydHMgdXNpbmcgYSBESU4tOCBvciBESU4tOQotCQkgKiBjb25uZWN0b3Igb25seSBoYXZlIHRoZSBEVFIgbGluZSAod2hpY2ggaXMgdXN1YWxseQotCQkgKiB3aXJlZCB0byBib3RoIFJUUyBhbmQgRFRSIG9uIGFuIGV4dGVybmFsIG1vZGVtIGluCi0JCSAqIHRoZSBjYWJsZSkuICBSVFMgZG9lc24ndCBnbyBvdXQgdG8gdGhlIHNlcmlhbCBwb3J0Ci0JCSAqIHNvY2tldCwgaXQgYWN0cyBhcyBhbiBvdXRwdXQgZW5hYmxlIGZvciB0aGUgdHJhbnNtaXQKLQkJICogZGF0YSBsaW5lLiAgU28gaW4gdGhpcyBjYXNlIHdlIGRvbid0IGRyb3AgUlRTLgotCQkgKgotCQkgKiBNYWNzIHdpdGggaW50ZXJuYWwgbW9kZW1zIGdlbmVyYWxseSBkbyBoYXZlIGJvdGggUlRTCi0JCSAqIGFuZCBEVFIgd2lyZWQgdG8gdGhlIG1vZGVtLCBzbyBpbiB0aGF0IGNhc2Ugd2UgZG8KLQkJICogZHJvcCBSVFMuCi0JCSAqLwotCQlpZiAoaW5mby0+aXNfaW50ZXJuYWxfbW9kZW0pIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCQlpbmZvLT5jdXJyZWdzWzVdICY9IH5SVFM7Ci0JCQlpbmZvLT5wZW5kcmVnc1s1XSAmPSB+UlRTOwotCQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgaW5mby0+Y3VycmVnc1s1XSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCX0KLQl9Ci0JCi0jaWZkZWYgQ0RUUkNUUwotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDRFRSQ1RTKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWluZm8tPmN1cnJlZ3NbNV0gJj0gfkRUUjsKLQkJaW5mby0+cGVuZHJlZ3NbNV0gJj0gfkRUUjsKLQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgaW5mby0+Y3VycmVnc1s1XSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0jZW5kaWYgLyogQ0RUUkNUUyAqLwotfQotCi1zdGF0aWMgdm9pZCByc191bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIFNFUklBTF9ERUJVR19USFJPVFRMRQotCXByaW50ayhLRVJOX0RFQlVHICJ1bnRocm90dGxlICVzOiAlZC4uLi5cbiIsCi0JCQl0dHktPmxkaXNjLmNoYXJzX2luX2J1ZmZlcih0dHkpKTsKLSNlbmRpZgotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc191bnRocm90dGxlIikpCi0JCXJldHVybjsKLQotCWlmIChJX0lYT0ZGKHR0eSkpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGluZm8tPnhfY2hhcikKLQkJCWluZm8tPnhfY2hhciA9IDA7Ci0JCWVsc2UgewotCQkJaW5mby0+eF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOwotCQkJaWYgKCFpbmZvLT50eF9hY3RpdmUpCi0JCQkJdHJhbnNtaXRfY2hhcnMoaW5mbyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCX0KLQotCWlmIChDX0NSVFNDVFModHR5KSAmJiBpbmZvLT5pc19pbnRlcm5hbF9tb2RlbSkgewotCQkvKiBBc3NlcnQgUlRTIGxpbmUgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJaW5mby0+Y3VycmVnc1s1XSB8PSBSVFM7Ci0JCWluZm8tPnBlbmRyZWdzWzVdIHw9IFJUUzsKLQkJd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgNSwgaW5mby0+Y3VycmVnc1s1XSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLSNpZmRlZiBDRFRSQ1RTCi0JaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENEVFJDVFMpIHsKLQkJLyogQXNzZXJ0IERUUiBsaW5lICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JCWluZm8tPmN1cnJlZ3NbNV0gfD0gRFRSOwotCQlpbmZvLT5wZW5kcmVnc1s1XSB8PSBEVFI7Ci0JCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDUsIGluZm8tPmN1cnJlZ3NbNV0pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX2lvY3RsKCkgYW5kIGZyaWVuZHMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLXN0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCBtYWNfc2VyaWFsICogaW5mbywKLQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqIHJldGluZm8pCi17Ci0Jc3RydWN0IHNlcmlhbF9zdHJ1Y3QgdG1wOwotICAKLQlpZiAoIXJldGluZm8pCi0JCXJldHVybiAtRUZBVUxUOwotCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7Ci0JdG1wLnR5cGUgPSBpbmZvLT50eXBlOwotCXRtcC5saW5lID0gaW5mby0+bGluZTsKLQl0bXAucG9ydCA9IGluZm8tPnBvcnQ7Ci0JdG1wLmlycSA9IGluZm8tPmlycTsKLQl0bXAuZmxhZ3MgPSBpbmZvLT5mbGFnczsKLQl0bXAuYmF1ZF9iYXNlID0gaW5mby0+YmF1ZF9iYXNlOwotCXRtcC5jbG9zZV9kZWxheSA9IGluZm8tPmNsb3NlX2RlbGF5OwotCXRtcC5jbG9zaW5nX3dhaXQgPSBpbmZvLT5jbG9zaW5nX3dhaXQ7Ci0JdG1wLmN1c3RvbV9kaXZpc29yID0gaW5mby0+Y3VzdG9tX2Rpdmlzb3I7Ci0JaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCZ0bXAsc2l6ZW9mKCpyZXRpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldF9zZXJpYWxfaW5mbyhzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8sCi0JCQkgICBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKiBuZXdfaW5mbykKLXsKLQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOwotCXN0cnVjdCBtYWNfc2VyaWFsIG9sZF9pbmZvOwotCWludCAJCQlyZXR2YWwgPSAwOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdfc2VyaWFsLG5ld19pbmZvLHNpemVvZihuZXdfc2VyaWFsKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCW9sZF9pbmZvID0gKmluZm87Ci0KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpIHx8Ci0JCSAgICAobmV3X3NlcmlhbC50eXBlICE9IGluZm8tPnR5cGUpIHx8Ci0JCSAgICAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwKLQkJICAgICgobmV3X3NlcmlhbC5mbGFncyAmIH5aSUxPR19VU1JfTUFTSykgIT0KLQkJICAgICAoaW5mby0+ZmxhZ3MgJiB+WklMT0dfVVNSX01BU0spKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5aSUxPR19VU1JfTUFTSykgfAotCQkJICAgICAgIChuZXdfc2VyaWFsLmZsYWdzICYgWklMT0dfVVNSX01BU0spKTsKLQkJaW5mby0+Y3VzdG9tX2Rpdmlzb3IgPSBuZXdfc2VyaWFsLmN1c3RvbV9kaXZpc29yOwotCQlnb3RvIGNoZWNrX2FuZF9leGl0OwotCX0KLQotCWlmIChpbmZvLT5jb3VudCA+IDEpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQkvKgotCSAqIE9LLCBwYXN0IHRoaXMgcG9pbnQsIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgaGFzIGJlZW4gZG9uZS4KLQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGFydCBtYWtpbmcgY2hhbmdlcy4uLi4uCi0JICovCi0KLQlpbmZvLT5iYXVkX2Jhc2UgPSBuZXdfc2VyaWFsLmJhdWRfYmFzZTsKLQlpbmZvLT5mbGFncyA9ICgoaW5mby0+ZmxhZ3MgJiB+WklMT0dfRkxBR1MpIHwKLQkJCShuZXdfc2VyaWFsLmZsYWdzICYgWklMT0dfRkxBR1MpKTsKLQlpbmZvLT50eXBlID0gbmV3X3NlcmlhbC50eXBlOwotCWluZm8tPmNsb3NlX2RlbGF5ID0gbmV3X3NlcmlhbC5jbG9zZV9kZWxheTsKLQlpbmZvLT5jbG9zaW5nX3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdDsKLQotY2hlY2tfYW5kX2V4aXQ6Ci0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpCi0JCXJldHZhbCA9IHNldHVwX3NjYyhpbmZvKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKgotICogZ2V0X2xzcl9pbmZvIC0gZ2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyIGluZm8KLSAqCi0gKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsKCkgdG8gZ2V0IGluZm8gd2hlbiB0aGUgVUFSVCBwaHlzaWNhbGx5Ci0gKiAJICAgIGlzIGVtcHRpZWQuICBPbiBidXMgdHlwZXMgbGlrZSBSUzQ4NSwgdGhlIHRyYW5zbWl0dGVyIG11c3QKLSAqIAkgICAgcmVsZWFzZSB0aGUgYnVzIGFmdGVyIHRyYW5zbWl0dGluZy4gVGhpcyBtdXN0IGJlIGRvbmUgd2hlbgotICogCSAgICB0aGUgdHJhbnNtaXQgc2hpZnQgcmVnaXN0ZXIgaXMgZW1wdHksIG5vdCBiZSBkb25lIHdoZW4gdGhlCi0gKiAJICAgIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgaXMgZW1wdHkuICBUaGlzIGZ1bmN0aW9uYWxpdHkKLSAqIAkgICAgYWxsb3dzIGFuIFJTNDg1IGRyaXZlciB0byBiZSB3cml0dGVuIGluIHVzZXIgc3BhY2UuIAotICovCi1zdGF0aWMgaW50IGdldF9sc3JfaW5mbyhzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8sIHVuc2lnbmVkIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gcmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0Jc3RhdHVzID0gKHN0YXR1cyAmIFR4X0JVRl9FTVApPyBUSU9DU0VSX1RFTVQ6IDA7Ci0JcmV0dXJuIHB1dF91c2VyKHN0YXR1cyx2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBjaGFyIGNvbnRyb2wsIHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQlpZiAoaW5mby0+a2dkYl9jaGFubmVsKQotCQlyZXR1cm4gLUVOT0RFVjsKLSNlbmRpZgotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCBfX0ZVTkNUSU9OX18pKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0lPX0VSUk9SKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWNvbnRyb2wgPSBpbmZvLT5jdXJyZWdzWzVdOwotCXN0YXR1cyA9IHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAgICAoKGNvbnRyb2wgJiBSVFMpID8gVElPQ01fUlRTOiAwKQotCQl8ICgoY29udHJvbCAmIERUUikgPyBUSU9DTV9EVFI6IDApCi0JCXwgKChzdGF0dXMgICYgRENEKSA/IFRJT0NNX0NBUjogMCkKLQkJfCAoKHN0YXR1cyAgJiBDVFMpID8gMDogVElPQ01fQ1RTKTsKLX0KLQotc3RhdGljIGludCByc190aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqIGluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKil0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGludCBhcmcsIGJpdHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgX19GVU5DVElPTl9fKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCXJldHVybiAtRUlPOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQlpZiAoc2V0ICYgVElPQ01fUlRTKQotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFJUUzsKLQlpZiAoc2V0ICYgVElPQ01fRFRSKQotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IERUUjsKLQlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCi0JCWluZm8tPmN1cnJlZ3NbNV0gJj0gflJUUzsKLQlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCi0JCWluZm8tPmN1cnJlZ3NbNV0gJj0gfkRUUjsKLQotCWluZm8tPnBlbmRyZWdzWzVdID0gaW5mby0+Y3VycmVnc1s1XTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiByc19icmVhayAtIHR1cm4gdHJhbnNtaXQgYnJlYWsgY29uZGl0aW9uIG9uL29mZgotICovCi1zdGF0aWMgdm9pZCByc19icmVhayhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgYnJlYWtfc3RhdGUpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm8gPSAoc3RydWN0IG1hY19zZXJpYWwgKikgdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19icmVhayIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWlmIChicmVha19zdGF0ZSA9PSAtMSkKLQkJaW5mby0+Y3VycmVnc1s1XSB8PSBTTkRfQlJLOwotCWVsc2UKLQkJaW5mby0+Y3VycmVnc1s1XSAmPSB+U05EX0JSSzsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCA1LCBpbmZvLT5jdXJyZWdzWzVdKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgcnNfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0jZW5kaWYKLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX2lvY3RsIikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKChjbWQgIT0gVElPQ0dTRVJJQUwpICYmIChjbWQgIT0gVElPQ1NTRVJJQUwpICYmCi0JICAgIChjbWQgIT0gVElPQ1NFUkNPTkZJRykgJiYgKGNtZCAhPSBUSU9DU0VSR1NUUlVDVCkpIHsKLQkJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQkgICAgcmV0dXJuIC1FSU87Ci0JfQotCi0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBUSU9DR1NFUklBTDoKLQkJCXJldHVybiBnZXRfc2VyaWFsX2luZm8oaW5mbywKLQkJCQkJKHN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOwotCQljYXNlIFRJT0NTU0VSSUFMOgotCQkJcmV0dXJuIHNldF9zZXJpYWxfaW5mbyhpbmZvLAotCQkJCQkoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICopIGFyZyk7Ci0JCWNhc2UgVElPQ1NFUkdFVExTUjogLyogR2V0IGxpbmUgc3RhdHVzIHJlZ2lzdGVyICovCi0JCQlyZXR1cm4gZ2V0X2xzcl9pbmZvKGluZm8sICh1bnNpZ25lZCBpbnQgKikgYXJnKTsKLQotCQljYXNlIFRJT0NTRVJHU1RSVUNUOgotCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IG1hY19zZXJpYWwgX191c2VyICopIGFyZywKLQkJCQkJIGluZm8sIHNpemVvZihzdHJ1Y3QgbWFjX3NlcmlhbCkpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJcmV0dXJuIDA7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcnNfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHRlcm1pb3MgKm9sZF90ZXJtaW9zKQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQlpbnQgd2FzX3N0b3BwZWQ7Ci0KLQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKQotCQlyZXR1cm47Ci0Jd2FzX3N0b3BwZWQgPSBpbmZvLT50eF9zdG9wcGVkOwotCi0JY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKLQotCWlmICh3YXNfc3RvcHBlZCAmJiAhaW5mby0+dHhfc3RvcHBlZCkgewotCQl0dHktPmh3X3N0b3BwZWQgPSAwOwotCQlyc19zdGFydCh0dHkpOwotCX0KLX0KLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogcnNfY2xvc2UoKQotICogCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHNlcmlhbCBwb3J0IGdldHMgY2xvc2VkLgotICogV2FpdCBmb3IgdGhlIGxhc3QgcmVtYWluaW5nIGRhdGEgdG8gYmUgc2VudC4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi1zdGF0aWMgdm9pZCByc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbHApCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpbmZvIHx8IHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJyc19jbG9zZSIpKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eV9odW5nX3VwX3AoZmlscCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQotCi0JT1BOREJHKCJyc19jbG9zZSB0dHlTJWQsIGNvdW50ID0gJWRcbiIsIGluZm8tPmxpbmUsIGluZm8tPmNvdW50KTsKLQlpZiAoKHR0eS0+Y291bnQgPT0gMSkgJiYgKGluZm8tPmNvdW50ICE9IDEpKSB7Ci0JCS8qCi0JCSAqIFVoLCBvaC4gIHR0eS0+Y291bnQgaXMgMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdHR5Ci0JCSAqIHN0cnVjdHVyZSB3aWxsIGJlIGZyZWVkLiAgSW5mby0+Y291bnQgc2hvdWxkIGFsd2F5cwotCQkgKiBiZSBvbmUgaW4gdGhlc2UgY29uZGl0aW9ucy4gIElmIGl0J3MgZ3JlYXRlciB0aGFuCi0JCSAqIG9uZSwgd2UndmUgZ290IHJlYWwgcHJvYmxlbXMsIHNpbmNlIGl0IG1lYW5zIHRoZQotCQkgKiBzZXJpYWwgcG9ydCB3b24ndCBiZSBzaHV0ZG93bi4KLQkJICovCi0JCXByaW50ayhLRVJOX0VSUiAicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudDsgdHR5LT5jb3VudCAiCi0JCQkJImlzIDEsIGluZm8tPmNvdW50IGlzICVkXG4iLCBpbmZvLT5jb3VudCk7Ci0JCWluZm8tPmNvdW50ID0gMTsKLQl9Ci0JaWYgKC0taW5mby0+Y291bnQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAicnNfY2xvc2U6IGJhZCBzZXJpYWwgcG9ydCBjb3VudCBmb3IgIgotCQkJCSJ0dHlTJWQ6ICVkXG4iLCBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0JCWluZm8tPmNvdW50ID0gMDsKLQl9Ci0JaWYgKGluZm8tPmNvdW50KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlpbmZvLT5mbGFncyB8PSBaSUxPR19DTE9TSU5HOwotCS8qCi0JICogTm93IHdlIHdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gY2xlYXI7IGFuZCB3ZSBub3RpZnkgCi0JICogdGhlIGxpbmUgZGlzY2lwbGluZSB0byBvbmx5IHByb2Nlc3MgWE9OL1hPRkYgY2hhcmFjdGVycy4KLQkgKi8KLQlPUE5EQkcoIndhaXRpbmcgZW5kIG9mIFR4Li4uICh0aW1lb3V0OiVkKVxuIiwgaW5mby0+Y2xvc2luZ193YWl0KTsKLQl0dHktPmNsb3NpbmcgPSAxOwotCWlmIChpbmZvLT5jbG9zaW5nX3dhaXQgIT0gWklMT0dfQ0xPU0lOR19XQUlUX05PTkUpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+Y2xvc2luZ193YWl0KTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKgotCSAqIEF0IHRoaXMgcG9pbnQgd2Ugc3RvcCBhY2NlcHRpbmcgaW5wdXQuICBUbyBkbyB0aGlzLCB3ZQotCSAqIGRpc2FibGUgdGhlIHJlY2VpdmVyIGFuZCByZWNlaXZlIGludGVycnVwdHMuCi0JICovCi0JaW5mby0+Y3VycmVnc1szXSAmPSB+UnhFTkFCTEU7Ci0JaW5mby0+cGVuZHJlZ3NbM10gPSBpbmZvLT5jdXJyZWdzWzNdOwotCXdyaXRlX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDMsIGluZm8tPmN1cnJlZ3NbM10pOwotCWluZm8tPmN1cnJlZ3NbMV0gJj0gfigweDE4KTsJLyogZGlzYWJsZSBhbnkgcnggaW50cyAqLwotCWluZm8tPnBlbmRyZWdzWzFdID0gaW5mby0+Y3VycmVnc1sxXTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCAxLCBpbmZvLT5jdXJyZWdzWzFdKTsKLQlaU19DTEVBUkZJRk8oaW5mby0+enNfY2hhbm5lbCk7Ci0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpIHsKLQkJLyoKLQkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFNDQyB0cmFuc21pdHRlcgotCQkgKiBoYXMgY29tcGxldGVseSBkcmFpbmVkLgotCQkgKi8KLQkJT1BOREJHKCJ3YWl0aW5nIGVuZCBvZiBSeC4uLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKLQkJcnNfd2FpdF91bnRpbF9zZW50KHR0eSwgaW5mby0+dGltZW91dCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JfQotCi0Jc2h1dGRvd24oaW5mbyk7Ci0JLyogcmVzdG9yZSBmbGFncyBub3cgc2luY2Ugc2h1dGRvd24oKSB3aWxsIGhhdmUgZGlzYWJsZWQgdGhpcyBwb3J0J3MKLQkgICBzcGVjaWZpYyBpcnFzICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCi0JCXR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIodHR5KTsKLQl0dHlfbGRpc2NfZmx1c2godHR5KTsKLQl0dHktPmNsb3NpbmcgPSAwOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT50dHkgPSAwOwotCi0JaWYgKGluZm8tPmJsb2NrZWRfb3BlbikgewotCQlpZiAoaW5mby0+Y2xvc2VfZGVsYXkpIHsKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoaW5mby0+Y2xvc2VfZGVsYXkpKTsKLQkJfQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Ci0JfQotCWluZm8tPmZsYWdzICY9IH4oWklMT0dfTk9STUFMX0FDVElWRXxaSUxPR19DTE9TSU5HKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPmNsb3NlX3dhaXQpOwotfQotCi0vKgotICogcnNfd2FpdF91bnRpbF9zZW50KCkgLS0tIHdhaXQgdW50aWwgdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5Ci0gKi8KLXN0YXRpYyB2b2lkIHJzX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9IChzdHJ1Y3QgbWFjX3NlcmlhbCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzLCBjaGFyX3RpbWU7Ci0KLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX3dhaXRfdW50aWxfc2VudCIpKQotCQlyZXR1cm47Ci0KLS8qCXByaW50aygicnNfd2FpdF91bnRpbF9zZW50LCB0aW1lb3V0OiVkLCB0dHlfc3RvcHBlZDolZCwgdHhfc3RvcHBlZDolZFxuIiwKLQkJCXRpbWVvdXQsIHR0eS0+c3RvcHBlZCwgaW5mby0+dHhfc3RvcHBlZCk7Ci0qLwotCW9yaWdfamlmZmllcyA9IGppZmZpZXM7Ci0JLyoKLQkgKiBTZXQgdGhlIGNoZWNrIGludGVydmFsIHRvIGJlIDEvNSBvZiB0aGUgZXN0aW1hdGVkIHRpbWUgdG8KLQkgKiBzZW5kIGEgc2luZ2xlIGNoYXJhY3RlciwgYW5kIG1ha2UgaXQgYXQgbGVhc3QgMS4gIFRoZSBjaGVjawotCSAqIGludGVydmFsIHNob3VsZCBhbHNvIGJlIGxlc3MgdGhhbiB0aGUgdGltZW91dC4KLQkgKi8KLQlpZiAoaW5mby0+dGltZW91dCA8PSBIWi81MCkgewotCQlwcmludGsoS0VSTl9JTkZPICJtYWNzZXJpYWw6IGludmFsaWQgaW5mby0+dGltZW91dD0lZFxuIiwKLQkJCQkgICAgaW5mby0+dGltZW91dCk7Ci0JCWluZm8tPnRpbWVvdXQgPSBIWi81MCsxOwotCX0KLQotCWNoYXJfdGltZSA9IChpbmZvLT50aW1lb3V0IC0gSFovNTApIC8gaW5mby0+eG1pdF9maWZvX3NpemU7Ci0JY2hhcl90aW1lID0gY2hhcl90aW1lIC8gNTsKLQlpZiAoY2hhcl90aW1lID4gSFopIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFjc2VyaWFsOiBjaGFyX3RpbWUgJWxkID5IWiAhISFcbiIsCi0JCQkJICAgIGNoYXJfdGltZSk7Ci0JCWNoYXJfdGltZSA9IDE7Ci0JfSBlbHNlIGlmIChjaGFyX3RpbWUgPT0gMCkKLQkJY2hhcl90aW1lID0gMTsKLQlpZiAodGltZW91dCkKLQkJY2hhcl90aW1lID0gbWluX3QodW5zaWduZWQgbG9uZywgY2hhcl90aW1lLCB0aW1lb3V0KTsKLQl3aGlsZSAoKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMSkgJiBBTExfU05UKSA9PSAwKSB7Ci0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MoY2hhcl90aW1lKSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlpZiAodGltZW91dCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIG9yaWdfamlmZmllcyArIHRpbWVvdXQpKQotCQkJYnJlYWs7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotfQotCi0vKgotICogcnNfaGFuZ3VwKCkgLS0tIGNhbGxlZCBieSB0dHlfaGFuZ3VwKCkgd2hlbiBhIGhhbmd1cCBpcyBzaWduYWxlZC4KLSAqLwotc3RhdGljIHZvaWQgcnNfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IG1hY19zZXJpYWwgKiBpbmZvID0gKHN0cnVjdCBtYWNfc2VyaWFsICopdHR5LT5kcml2ZXJfZGF0YTsKLQotCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfaGFuZ3VwIikpCi0JCXJldHVybjsKLQotCXJzX2ZsdXNoX2J1ZmZlcih0dHkpOwotCXNodXRkb3duKGluZm8pOwotCWluZm8tPmV2ZW50ID0gMDsKLQlpbmZvLT5jb3VudCA9IDA7Ci0JaW5mby0+ZmxhZ3MgJj0gflpJTE9HX05PUk1BTF9BQ1RJVkU7Ci0JaW5mby0+dHR5ID0gMDsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmluZm8tPm9wZW5fd2FpdCk7Ci19Ci0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHJzX29wZW4oKSBhbmQgZnJpZW5kcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLXN0YXRpYyBpbnQgYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCwKLQkJCSAgIHN0cnVjdCBtYWNfc2VyaWFsICppbmZvKQotewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7Ci0JaW50CQlyZXR2YWw7Ci0JaW50CQlkb19jbG9jYWwgPSAwOwotCi0JLyoKLQkgKiBJZiB0aGUgZGV2aWNlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY2xvc2VkLCB0aGVuIGJsb2NrCi0JICogdW50aWwgaXQncyBkb25lLCBhbmQgdGhlbiB0cnkgYWdhaW4uCi0JICovCi0JaWYgKGluZm8tPmZsYWdzICYgWklMT0dfQ0xPU0lORykgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZpbmZvLT5jbG9zZV93YWl0KTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JLyoKLQkgKiBJZiBub24tYmxvY2tpbmcgbW9kZSBpcyBzZXQsIG9yIHRoZSBwb3J0IGlzIG5vdCBlbmFibGVkLAotCSAqIHRoZW4gbWFrZSB0aGUgY2hlY2sgdXAgZnJvbnQgYW5kIHRoZW4gZXhpdC4KLQkgKi8KLQlpZiAoKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB8fAotCSAgICAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpKSB7Ci0JCWluZm8tPmZsYWdzIHw9IFpJTE9HX05PUk1BTF9BQ1RJVkU7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCWRvX2Nsb2NhbCA9IDE7Ci0KLQkvKgotCSAqIEJsb2NrIHdhaXRpbmcgZm9yIHRoZSBjYXJyaWVyIGRldGVjdCBhbmQgdGhlIGxpbmUgdG8gYmVjb21lCi0JICogZnJlZSAoaS5lLiwgbm90IGluIHVzZSBieSB0aGUgY2FsbG91dCkuICBXaGlsZSB3ZSBhcmUgaW4KLQkgKiB0aGlzIGxvb3AsIGluZm8tPmNvdW50IGlzIGRyb3BwZWQgYnkgb25lLCBzbyB0aGF0Ci0JICogcnNfY2xvc2UoKSBrbm93cyB3aGVuIHRvIGZyZWUgdGhpbmdzLiAgV2UgcmVzdG9yZSBpdCB1cG9uCi0JICogZXhpdCwgZWl0aGVyIG5vcm1hbCBvciBhYm5vcm1hbC4KLQkgKi8KLQlyZXR2YWwgPSAwOwotCWFkZF93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlPUE5EQkcoImJsb2NrX3RpbF9yZWFkeSBiZWZvcmUgYmxvY2s6IHR0eVMlZCwgY291bnQgPSAlZFxuIiwKLQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotCXNwaW5fbG9ja19pcnEoJmluZm8tPmxvY2spOwotCWlmICghdHR5X2h1bmdfdXBfcChmaWxwKSkgCi0JCWluZm8tPmNvdW50LS07Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5sb2NrKTsKLQlpbmZvLT5ibG9ja2VkX29wZW4rKzsKLQl3aGlsZSAoMSkgewotCQlzcGluX2xvY2tfaXJxKCZpbmZvLT5sb2NrKTsKLQkJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgJiYKLQkJICAgICFpbmZvLT5pc19pcmRhKQotCQkJenNfcnRzZHRyKGluZm8sIDEpOwotCQlzcGluX3VubG9ja19pcnEoJmluZm8tPmxvY2spOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAotCQkgICAgIShpbmZvLT5mbGFncyAmIFpJTE9HX0lOSVRJQUxJWkVEKSkgewotCQkJcmV0dmFsID0gLUVBR0FJTjsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghKGluZm8tPmZsYWdzICYgWklMT0dfQ0xPU0lORykgJiYKLQkJICAgIChkb19jbG9jYWwgfHwgKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCkgJiBEQ0QpKSkKLQkJCWJyZWFrOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0JCU9QTkRCRygiYmxvY2tfdGlsX3JlYWR5IGJsb2NraW5nOiB0dHlTJWQsIGNvdW50ID0gJWRcbiIsCi0JCSAgICAgICBpbmZvLT5saW5lLCBpbmZvLT5jb3VudCk7Ci0JCXNjaGVkdWxlKCk7Ci0JfQotCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5vcGVuX3dhaXQsICZ3YWl0KTsKLQlpZiAoIXR0eV9odW5nX3VwX3AoZmlscCkpCi0JCWluZm8tPmNvdW50Kys7Ci0JaW5mby0+YmxvY2tlZF9vcGVuLS07Ci0JT1BOREJHKCJibG9ja190aWxfcmVhZHkgYWZ0ZXIgYmxvY2tpbmc6IHR0eVMlZCwgY291bnQgPSAlZFxuIiwKLQkgICAgICAgaW5mby0+bGluZSwgaW5mby0+Y291bnQpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JaW5mby0+ZmxhZ3MgfD0gWklMT0dfTk9STUFMX0FDVElWRTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBzZXJpYWwgcG9ydCBpcyBvcGVuZWQuICBJdAotICogZW5hYmxlcyBpbnRlcnJ1cHRzIGZvciBhIHNlcmlhbCBwb3J0LCBsaW5raW5nIGluIGl0cyBaSUxPRyBzdHJ1Y3R1cmUgaW50bwotICogdGhlIElSUSBjaGFpbi4gICBJdCBhbHNvIHBlcmZvcm1zIHRoZSBzZXJpYWwtc3BlY2lmaWMKLSAqIGluaXRpYWxpemF0aW9uIGZvciB0aGUgdHR5IHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIGludCByc19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlscCkKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbAkqaW5mbzsKLQlpbnQgCQkJcmV0dmFsLCBsaW5lOwotCXVuc2lnbmVkIGxvbmcJCXBhZ2U7Ci0KLQlsaW5lID0gdHR5LT5pbmRleDsKLQlpZiAoKGxpbmUgPCAwKSB8fCAobGluZSA+PSB6c19jaGFubmVsc19mb3VuZCkpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWluZm8gPSB6c19zb2Z0ICsgbGluZTsKLQotI2lmZGVmIENPTkZJR19LR0RCCi0JaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkgewotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0jZW5kaWYKLQlpZiAoc2VyaWFsX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInJzX29wZW4iKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JT1BOREJHKCJyc19vcGVuICVzLCBjb3VudCA9ICVkLCB0dHk9JXBcbiIsIHR0eS0+bmFtZSwKLQkgICAgICAgaW5mby0+Y291bnQsIHR0eSk7Ci0KLQlpbmZvLT5jb3VudCsrOwotCXR0eS0+ZHJpdmVyX2RhdGEgPSBpbmZvOwotCWluZm8tPnR0eSA9IHR0eTsKLQotCWlmICghdG1wX2J1ZikgewotCQlwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAoIXBhZ2UpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKHRtcF9idWYpCi0JCQlmcmVlX3BhZ2UocGFnZSk7Ci0JCWVsc2UKLQkJCXRtcF9idWYgPSAodW5zaWduZWQgY2hhciAqKSBwYWdlOwotCX0KLQotCS8qCi0JICogSWYgdGhlIHBvcnQgaXMgdGhlIG1pZGRsZSBvZiBjbG9zaW5nLCBiYWlsIG91dCBub3cKLQkgKi8KLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fAotCSAgICAoaW5mby0+ZmxhZ3MgJiBaSUxPR19DTE9TSU5HKSkgewotCQlpZiAoaW5mby0+ZmxhZ3MgJiBaSUxPR19DTE9TSU5HKQotCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaW5mby0+Y2xvc2Vfd2FpdCk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCS8qCi0JICogU3RhcnQgdXAgc2VyaWFsIHBvcnQKLQkgKi8KLQotCXJldHZhbCA9IHN0YXJ0dXAoaW5mbyk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXJldHZhbCA9IGJsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOwotCWlmIChyZXR2YWwpIHsKLQkJT1BOREJHKCJyc19vcGVuIHJldHVybmluZyBhZnRlciBibG9ja190aWxfcmVhZHkgd2l0aCAlZFxuIiwKLQkJCXJldHZhbCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9DT05TT0xFCi0JaWYgKHNlcmNvbnMuY2ZsYWcgJiYgc2VyY29ucy5pbmRleCA9PSBsaW5lKSB7Ci0JCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IHNlcmNvbnMuY2ZsYWc7Ci0JCXNlcmNvbnMuY2ZsYWcgPSAwOwotCQljaGFuZ2Vfc3BlZWQoaW5mbywgMCk7Ci0JfQotI2VuZGlmCi0KLQlPUE5EQkcoInJzX29wZW4gJXMgc3VjY2Vzc2Z1bC4uLlxuIiwgdHR5LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRmluYWxseSwgcm91dGluZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwgZHJpdmVyLiAqLwotCi1zdGF0aWMgdm9pZCBzaG93X3NlcmlhbF92ZXJzaW9uKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUG93ZXJNYWMgWjg1MzAgc2VyaWFsIGRyaXZlciB2ZXJzaW9uICIgTUFDU0VSSUFMX1ZFUlNJT04gIlxuIik7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIG9uZSBjaGFubmVsLCBib3RoIHRoZSBtYWNfc2VyaWFsIGFuZCBtYWNfenNjaGFubmVsCi0gKiBzdHJ1Y3RzLiAgV2UgdXNlIHRoZSBkZXZfbm9kZSBmaWVsZCBvZiB0aGUgbWFjX3NlcmlhbCBzdHJ1Y3QuCi0gKi8KLXN0YXRpYyBpbnQKLWNoYW5faW5pdChzdHJ1Y3QgbWFjX3NlcmlhbCAqenNzLCBzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqenNfY2hhbiwKLQkgIHN0cnVjdCBtYWNfenNjaGFubmVsICp6c19jaGFuX2EpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpjaCA9IHpzcy0+ZGV2X25vZGU7Ci0JY2hhciAqY29ubjsKLQlpbnQgbGVuOwotCXN0cnVjdCBzbG90X25hbWVzX3Byb3AgewotCQlpbnQJY291bnQ7Ci0JCWNoYXIJbmFtZVsxXTsKLQl9ICpzbG90czsKLQotCXpzcy0+aXJxID0gY2gtPmludHJzWzBdLmxpbmU7Ci0JenNzLT5oYXNfZG1hID0gMDsKLSNpZiAhZGVmaW5lZChDT05GSUdfS0dEQikgJiYgZGVmaW5lZChTVVBQT1JUX1NFUklBTF9ETUEpCi0JaWYgKGNoLT5uX2FkZHJzID49IDMgJiYgY2gtPm5faW50cnMgPT0gMykKLQkJenNzLT5oYXNfZG1hID0gMTsKLSNlbmRpZgotCXpzcy0+ZG1hX2luaXR0ZWQgPSAwOwotCi0JenNfY2hhbi0+Y29udHJvbCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopCi0JCWlvcmVtYXAoY2gtPmFkZHJzWzBdLmFkZHJlc3MsIDB4MTAwMCk7Ci0JenNfY2hhbi0+ZGF0YSA9IHpzX2NoYW4tPmNvbnRyb2wgKyAweDEwOwotCXNwaW5fbG9ja19pbml0KCZ6c19jaGFuLT5sb2NrKTsKLQl6c19jaGFuLT5wYXJlbnQgPSB6c3M7Ci0JenNzLT56c19jaGFubmVsID0genNfY2hhbjsKLQl6c3MtPnpzX2NoYW5fYSA9IHpzX2NoYW5fYTsKLQotCS8qIHNldHVwIG1pc2MgdmFyYXJpYWJsZXMgKi8KLQl6c3MtPmtnZGJfY2hhbm5lbCA9IDA7Ci0KLQkvKiBGb3Igbm93LCB3ZSBhc3N1bWUgeW91IGVpdGhlciBoYXZlIGEgc2xvdC1uYW1lcyBwcm9wZXJ0eQotCSAqIHdpdGggIk1vZGVtIiBpbiBpdCwgb3IgeW91ciBjaGFubmVsIGlzIGNvbXBhdGlibGUgd2l0aAotCSAqICJjb2JhbHQiLiBNaWdodCBuZWVkIGFkZGl0aW9uYWwgZml4dXBzCi0JICovCi0JenNzLT5pc19pbnRlcm5hbF9tb2RlbSA9IGRldmljZV9pc19jb21wYXRpYmxlKGNoLCAiY29iYWx0Iik7Ci0JY29ubiA9IGdldF9wcm9wZXJ0eShjaCwgIkFBUEwsY29ubmVjdG9yIiwgJmxlbik7Ci0JenNzLT5pc19pcmRhID0gY29ubiAmJiAoc3RyY21wKGNvbm4sICJpbmZyYXJlZCIpID09IDApOwotCXpzcy0+cG9ydF90eXBlID0gUE1BQ19TQ0NfQVNZTkM7Ci0JLyogMTk5OSBQb3dlcmJvb2sgRzMgaGFzIHNsb3QtbmFtZXMgcHJvcGVydHkgaW5zdGVhZCAqLwotCXNsb3RzID0gKHN0cnVjdCBzbG90X25hbWVzX3Byb3AgKilnZXRfcHJvcGVydHkoY2gsICJzbG90LW5hbWVzIiwgJmxlbik7Ci0JaWYgKHNsb3RzICYmIHNsb3RzLT5jb3VudCA+IDApIHsKLQkJaWYgKHN0cmNtcChzbG90cy0+bmFtZSwgIklyREEiKSA9PSAwKQotCQkJenNzLT5pc19pcmRhID0gMTsKLQkJZWxzZSBpZiAoc3RyY21wKHNsb3RzLT5uYW1lLCAiTW9kZW0iKSA9PSAwKQotCQkJenNzLT5pc19pbnRlcm5hbF9tb2RlbSA9IDE7Ci0JfQotCWlmICh6c3MtPmlzX2lyZGEpCi0JCXpzcy0+cG9ydF90eXBlID0gUE1BQ19TQ0NfSVJEQTsKLQlpZiAoenNzLT5pc19pbnRlcm5hbF9tb2RlbSkgewotCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIGkyY19tb2RlbSA9IGZpbmRfZGV2aWNlcygiaTJjLW1vZGVtIik7Ci0JCWlmIChpMmNfbW9kZW0pIHsKLQkJCWNoYXIqIG1pZCA9IGdldF9wcm9wZXJ0eShpMmNfbW9kZW0sICJtb2RlbS1pZCIsIE5VTEwpOwotCQkJaWYgKG1pZCkgc3dpdGNoKCptaWQpIHsKLQkJCWNhc2UgMHgwNCA6Ci0JCQljYXNlIDB4MDUgOgotCQkJY2FzZSAweDA3IDoKLQkJCWNhc2UgMHgwOCA6Ci0JCQljYXNlIDB4MGIgOgotCQkJY2FzZSAweDBjIDoKLQkJCQl6c3MtPnBvcnRfdHlwZSA9IFBNQUNfU0NDX0kyUzE7Ci0JCQl9Ci0JCQlwcmludGsoS0VSTl9JTkZPICJtYWNzZXJpYWw6IGkyYy1tb2RlbSBkZXRlY3RlZCwgaWQ6ICVkXG4iLAotCQkJCW1pZCA/ICgqbWlkKSA6IDApOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAibWFjc2VyaWFsOiBzZXJpYWwgbW9kZW0gZGV0ZWN0ZWRcbiIpOwotCQl9Ci0JfQotCi0Jd2hpbGUgKHpzcy0+aGFzX2RtYSkgewotCQl6c3MtPmRtYV9wcml2ID0gTlVMTDsKLQkJLyogaXQgc2VlbXMgdGhhdCB0aGUgbGFzdCB0d28gYWRkcmVzc2VzIGFyZSB0aGUKLQkJICAgRE1BIGNvbnRyb2xsZXJzICovCi0JCXpzcy0+dHhfZG1hID0gKHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzICopCi0JCQlpb3JlbWFwKGNoLT5hZGRyc1tjaC0+bl9hZGRycyAtIDJdLmFkZHJlc3MsIDB4MTAwKTsKLQkJenNzLT5yeCA9ICh2b2xhdGlsZSBzdHJ1Y3QgbWFjX2RtYSAqKQotCQkJaW9yZW1hcChjaC0+YWRkcnNbY2gtPm5fYWRkcnMgLSAxXS5hZGRyZXNzLCAweDEwMCk7Ci0JCXpzcy0+dHhfZG1hX2lycSA9IGNoLT5pbnRyc1sxXS5saW5lOwotCQl6c3MtPnJ4X2RtYV9pcnEgPSBjaC0+aW50cnNbMl0ubGluZTsKLQkJc3Bpbl9sb2NrX2luaXQoJnpzcy0+cnhfZG1hX2xvY2spOwotCQlicmVhazsKLQl9Ci0KLQlpbml0X3RpbWVyKCZ6c3MtPnBvd2VydXBfdGltZXIpOwotCXpzcy0+cG93ZXJ1cF90aW1lci5mdW5jdGlvbiA9IHBvd2VydXBfZG9uZTsKLQl6c3MtPnBvd2VydXBfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB6c3M7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiAvcHJvYyBmcyByb3V0aW5lcy4gVE9ETzogQWRkIHN0YXR1cyBsaW5lcyAmIGVycm9yIHN0YXRzCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1saW5lX2luZm8oY2hhciAqYnVmLCBzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbykKLXsKLQlpbnQJCXJldD0wOwotCXVuc2lnbmVkIGNoYXIqIGNvbm5lY3RvcjsKLQlpbnQgbGVucDsKLQotCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVkOiBwb3J0OjB4JVggaXJxOiVkIiwgaW5mby0+bGluZSwgaW5mby0+cG9ydCwgaW5mby0+aXJxKTsKLQotCWNvbm5lY3RvciA9IGdldF9wcm9wZXJ0eShpbmZvLT5kZXZfbm9kZSwgIkFBUEwsY29ubmVjdG9yIiwgJmxlbnApOwotCWlmIChjb25uZWN0b3IpCi0JCXJldCs9c3ByaW50ZihidWYrcmV0LCIgY29uOiVzICIsIGNvbm5lY3Rvcik7Ci0JaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKSB7Ci0JCWlmICghY29ubmVjdG9yKQotCQkJcmV0Kz1zcHJpbnRmKGJ1ZityZXQsIiBjb246Iik7Ci0JCXJldCs9c3ByaW50ZihidWYrcmV0LCIlcyIsICIgKGludGVybmFsIG1vZGVtKSIpOwotCX0KLQlpZiAoaW5mby0+aXNfaXJkYSkgewotCQlpZiAoIWNvbm5lY3RvcikKLQkJCXJldCs9c3ByaW50ZihidWYrcmV0LCIgY29uOiIpOwotCQlyZXQrPXNwcmludGYoYnVmK3JldCwiJXMiLCAiIChJckRBKSIpOwotCX0KLQlyZXQrPXNwcmludGYoYnVmK3JldCwiXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBtYWNzZXJpYWxfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCi0JCSBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgbCwgbGVuID0gMDsKLQlvZmZfdAliZWdpbiA9IDA7Ci0Jc3RydWN0IG1hY19zZXJpYWwgKmluZm87Ci0KLQlsZW4gKz0gc3ByaW50ZihwYWdlLCAic2VyaW5mbzoxLjAgZHJpdmVyOiIgTUFDU0VSSUFMX1ZFUlNJT04gIlxuIik7Ci0JZm9yIChpbmZvID0genNfY2hhaW47IGluZm8gJiYgbGVuIDwgNDAwMDsgaW5mbyA9IGluZm8tPnpzX25leHQpIHsKLQkJbCA9IGxpbmVfaW5mbyhwYWdlICsgbGVuLCBpbmZvKTsKLQkJbGVuICs9IGw7Ci0JCWlmIChsZW4rYmVnaW4gPiBvZmYrY291bnQpCi0JCQlnb3RvIGRvbmU7Ci0JCWlmIChsZW4rYmVnaW4gPCBvZmYpIHsKLQkJCWJlZ2luICs9IGxlbjsKLQkJCWxlbiA9IDA7Ci0JCX0KLQl9Ci0JKmVvZiA9IDE7Ci1kb25lOgotCWlmIChvZmYgPj0gbGVuK2JlZ2luKQotCQlyZXR1cm4gMDsKLQkqc3RhcnQgPSBwYWdlICsgKG9mZi1iZWdpbik7Ci0JcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7Ci19Ci0KLS8qIEFzayB0aGUgUFJPTSBob3cgbWFueSBaODUzMHMgd2UgaGF2ZSBhbmQgaW5pdGlhbGl6ZSB0aGVpciB6c19jaGFubmVscyAqLwotc3RhdGljIHZvaWQKLXByb2JlX3NjY3Modm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgKmNoOwotCXN0cnVjdCBtYWNfc2VyaWFsICoqcHA7Ci0JaW50IG4sIGNoaXAsIG5jaGFuOwotCXN0cnVjdCBtYWNfenNjaGFubmVsICp6c19jaGFuOwotCWludCBjaGFuX2FfaW5kZXg7Ci0KLQluID0gMDsKLQlwcCA9ICZ6c19jaGFpbjsKLQl6c19jaGFuID0genNfY2hhbm5lbHM7Ci0JZm9yIChkZXYgPSBmaW5kX2RldmljZXMoImVzY2MiKTsgZGV2ICE9IDA7IGRldiA9IGRldi0+bmV4dCkgewotCQluY2hhbiA9IDA7Ci0JCWNoaXAgPSBuOwotCQlpZiAobiA+PSBOVU1fQ0hBTk5FTFMpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNvcnJ5LCBjYW4ndCB1c2UgJXM6IG5vIG1vcmUgIgotCQkJCQkgICAgImNoYW5uZWxzXG4iLCBkZXYtPmZ1bGxfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQljaGFuX2FfaW5kZXggPSAwOwotCQlmb3IgKGNoID0gZGV2LT5jaGlsZDsgY2ggIT0gMDsgY2ggPSBjaC0+c2libGluZykgewotCQkJaWYgKG5jaGFuID49IDIpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTQ0M6IE9ubHkgMiBjaGFubmVscyBwZXIgIgotCQkJCQkiY2hpcCBhcmUgc3VwcG9ydGVkXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjaC0+bl9hZGRycyA8IDEgfHwgKGNoIC0+bl9pbnRycyA8IDEpKSB7Ci0JCQkJcHJpbnRrKCJDYW4ndCB1c2UgJXM6ICVkIGFkZHJzICVkIGludHJzXG4iLAotCQkJCSAgICAgIGNoLT5mdWxsX25hbWUsIGNoLT5uX2FkZHJzLCBjaC0+bl9pbnRycyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFRoZSBjaGFubmVsIHdpdGggdGhlIGhpZ2hlciBhZGRyZXNzCi0JCQkgICB3aWxsIGJlIHRoZSBBIHNpZGUuICovCi0JCQlpZiAobmNoYW4gPiAwICYmCi0JCQkgICAgY2gtPmFkZHJzWzBdLmFkZHJlc3MKLQkJCSAgICA+IHpzX3NvZnRbbi0xXS5kZXZfbm9kZS0+YWRkcnNbMF0uYWRkcmVzcykKLQkJCQljaGFuX2FfaW5kZXggPSAxOwotCi0JCQkvKiBtaW5pbWFsIGluaXRpYWxpemF0aW9uIGZvciBub3cgKi8KLQkJCXpzX3NvZnRbbl0uZGV2X25vZGUgPSBjaDsKLQkJCSpwcCA9ICZ6c19zb2Z0W25dOwotCQkJcHAgPSAmenNfc29mdFtuXS56c19uZXh0OwotCQkJKytuY2hhbjsKLQkJCSsrbjsKLQkJfQotCQlpZiAobmNoYW4gPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIHNldCB1cCBBIHNpZGUgKi8KLQkJaWYgKGNoYW5faW5pdCgmenNfc29mdFtjaGlwICsgY2hhbl9hX2luZGV4XSwgenNfY2hhbiwgenNfY2hhbikpCi0JCQljb250aW51ZTsKLQkJKyt6c19jaGFuOwotCi0JCS8qIHNldCB1cCBCIHNpZGUsIGlmIGl0IGV4aXN0cyAqLwotCQlpZiAobmNoYW4gPiAxKQotCQkJaWYgKGNoYW5faW5pdCgmenNfc29mdFtjaGlwICsgMSAtIGNoYW5fYV9pbmRleF0sCi0JCQkJICB6c19jaGFuLCB6c19jaGFuIC0gMSkpCi0JCQkJY29udGludWU7Ci0JCSsrenNfY2hhbjsKLQl9Ci0JKnBwID0gMDsKLQotCXpzX2NoYW5uZWxzX2ZvdW5kID0gbjsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotCWlmIChuKQotCQlwbXVfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoJnNlcmlhbF9zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KLX0KLQotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzZXJpYWxfb3BzID0gewotCS5vcGVuID0gcnNfb3BlbiwKLQkuY2xvc2UgPSByc19jbG9zZSwKLQkud3JpdGUgPSByc193cml0ZSwKLQkuZmx1c2hfY2hhcnMgPSByc19mbHVzaF9jaGFycywKLQkud3JpdGVfcm9vbSA9IHJzX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9IHJzX2NoYXJzX2luX2J1ZmZlciwKLQkuZmx1c2hfYnVmZmVyID0gcnNfZmx1c2hfYnVmZmVyLAotCS5pb2N0bCA9IHJzX2lvY3RsLAotCS50aHJvdHRsZSA9IHJzX3Rocm90dGxlLAotCS51bnRocm90dGxlID0gcnNfdW50aHJvdHRsZSwKLQkuc2V0X3Rlcm1pb3MgPSByc19zZXRfdGVybWlvcywKLQkuc3RvcCA9IHJzX3N0b3AsCi0JLnN0YXJ0ID0gcnNfc3RhcnQsCi0JLmhhbmd1cCA9IHJzX2hhbmd1cCwKLQkuYnJlYWtfY3RsID0gcnNfYnJlYWssCi0JLndhaXRfdW50aWxfc2VudCA9IHJzX3dhaXRfdW50aWxfc2VudCwKLQkucmVhZF9wcm9jID0gbWFjc2VyaWFsX3JlYWRfcHJvYywKLQkudGlvY21nZXQgPSByc190aW9jbWdldCwKLQkudGlvY21zZXQgPSByc190aW9jbXNldCwKLX07Ci0KLXN0YXRpYyBpbnQgbWFjc2VyaWFsX2luaXQodm9pZCkKLXsKLQlpbnQgY2hhbm5lbCwgaTsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbzsKLQotCS8qIEZpbmQgb3V0IGhvdyBtYW55IFo4NTMwIFNDQ3Mgd2UgaGF2ZSAqLwotCWlmICh6c19jaGFpbiA9PSAwKQotCQlwcm9iZV9zY2NzKCk7Ci0KLQlzZXJpYWxfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcih6c19jaGFubmVsc19mb3VuZCk7Ci0JaWYgKCFzZXJpYWxfZHJpdmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIFhYWCBhc3N1bWUgaXQncyBhIHBvd2VyYm9vayBpZiB3ZSBoYXZlIGEgdmlhLXBtdQotCSAqIAotCSAqIFRoaXMgaXMgT0sgZm9yIGNvcmU5OSBtYWNoaW5lcyBhcyB3ZWxsLgotCSAqLwotCWlzX3Bvd2VyYm9vayA9IGZpbmRfZGV2aWNlcygidmlhLXBtdSIpICE9IDA7Ci0KLQkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIGVhY2ggb25lCi0JICogV2UgYWxzbyByZXF1ZXN0IHRoZSBPRiByZXNvdXJjZXMgaGVyZSBhcyBwcm9iZV9zY2NzKCkKLQkgKiBtaWdodCBiZSBjYWxsZWQgdG9vIGVhcmx5IGZvciB0aGF0Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IHpzX2NoYW5uZWxzX2ZvdW5kOyArK2kpIHsKLQkJc3RydWN0IGRldmljZV9ub2RlKiBjaCA9IHpzX3NvZnRbaV0uZGV2X25vZGU7Ci0JCWlmICghcmVxdWVzdF9PRl9yZXNvdXJjZShjaCwgMCwgTlVMTCkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWFjc2VyaWFsOiBjYW4ndCByZXF1ZXN0IElPIHJlc291cmNlICFcbiIpOwotCQkJcHV0X3R0eV9kcml2ZXIoc2VyaWFsX2RyaXZlcik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlpZiAoenNfc29mdFtpXS5oYXNfZG1hKSB7Ci0JCQlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoY2gsIGNoLT5uX2FkZHJzIC0gMiwgIiAodHggZG1hKSIpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJtYWNzZXJpYWw6IGNhbid0IHJlcXVlc3QgVFggRE1BIHJlc291cmNlICFcbiIpOwotCQkJCXpzX3NvZnRbaV0uaGFzX2RtYSA9IDA7Ci0JCQkJZ290byBub19kbWE7Ci0JCQl9Ci0JCQlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoY2gsIGNoLT5uX2FkZHJzIC0gMSwgIiAocnggZG1hKSIpKSB7Ci0JCQkJcmVsZWFzZV9PRl9yZXNvdXJjZShjaCwgY2gtPm5fYWRkcnMgLSAyKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgIm1hY3NlcmlhbDogY2FuJ3QgcmVxdWVzdCBSWCBETUEgcmVzb3VyY2UgIVxuIik7Ci0JCQkJenNfc29mdFtpXS5oYXNfZG1hID0gMDsKLQkJCQlnb3RvIG5vX2RtYTsKLQkJCX0KLQkJCWlmIChyZXF1ZXN0X2lycSh6c19zb2Z0W2ldLnR4X2RtYV9pcnEsIHJzX3R4ZG1hX2lycSwgMCwKLQkJCQkJIlNDQy10eGRtYSIsICZ6c19zb2Z0W2ldKSkKLQkJCQlwcmludGsoS0VSTl9FUlIgIm1hY3NlcmlhbDogY2FuJ3QgZ2V0IGlycSAlZFxuIiwKLQkJCQkgICAgICAgenNfc29mdFtpXS50eF9kbWFfaXJxKTsKLQkJCWRpc2FibGVfaXJxKHpzX3NvZnRbaV0udHhfZG1hX2lycSk7Ci0JCQlpZiAocmVxdWVzdF9pcnEoenNfc29mdFtpXS5yeF9kbWFfaXJxLCByc19yeGRtYV9pcnEsIDAsCi0JCQkJCSJTQ0MtcnhkbWEiLCAmenNfc29mdFtpXSkpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJtYWNzZXJpYWw6IGNhbid0IGdldCBpcnEgJWRcbiIsCi0JCQkJICAgICAgIHpzX3NvZnRbaV0ucnhfZG1hX2lycSk7Ci0JCQlkaXNhYmxlX2lycSh6c19zb2Z0W2ldLnJ4X2RtYV9pcnEpOwotCQl9Ci1ub19kbWE6CQkKLQkJaWYgKHJlcXVlc3RfaXJxKHpzX3NvZnRbaV0uaXJxLCByc19pbnRlcnJ1cHQsIDAsCi0JCQkJIlNDQyIsICZ6c19zb2Z0W2ldKSkKLQkJCXByaW50ayhLRVJOX0VSUiAibWFjc2VyaWFsOiBjYW4ndCBnZXQgaXJxICVkXG4iLAotCQkJICAgICAgIHpzX3NvZnRbaV0uaXJxKTsKLQkJZGlzYWJsZV9pcnEoenNfc29mdFtpXS5pcnEpOwotCX0KLQotCXNob3dfc2VyaWFsX3ZlcnNpb24oKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCi0JLyogTm90IGFsbCBvZiB0aGlzIGlzIGV4YWN0bHkgcmlnaHQgZm9yIHVzLiAqLwotCi0Jc2VyaWFsX2RyaXZlci0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlzZXJpYWxfZHJpdmVyLT5kcml2ZXJfbmFtZSA9ICJtYWNzZXJpYWwiOwotCXNlcmlhbF9kcml2ZXItPmRldmZzX25hbWUgPSAidHRzLyI7Ci0Jc2VyaWFsX2RyaXZlci0+bmFtZSA9ICJ0dHlTIjsKLQlzZXJpYWxfZHJpdmVyLT5tYWpvciA9IFRUWV9NQUpPUjsKLQlzZXJpYWxfZHJpdmVyLT5taW5vcl9zdGFydCA9IDY0OwotCXNlcmlhbF9kcml2ZXItPnR5cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMOwotCXNlcmlhbF9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUw7Ci0Jc2VyaWFsX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOwotCXNlcmlhbF9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0KLQkJQjM4NDAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKLQlzZXJpYWxfZHJpdmVyLT5mbGFncyA9IFRUWV9EUklWRVJfUkVBTF9SQVc7Ci0JdHR5X3NldF9vcGVyYXRpb25zKHNlcmlhbF9kcml2ZXIsICZzZXJpYWxfb3BzKTsKLQotCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpKQotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBjb3VsZG4ndCByZWdpc3RlciBzZXJpYWwgZHJpdmVyXG4iKTsKLQotCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB6c19jaGFubmVsc19mb3VuZDsgKytjaGFubmVsKSB7Ci0jaWZkZWYgQ09ORklHX0tHREIKLQkJaWYgKHpzX3NvZnRbY2hhbm5lbF0ua2dkYl9jaGFubmVsKSB7Ci0JCQlrZ2RiX2ludGVycnVwdGlibGUoMSk7Ci0JCQljb250aW51ZTsKLQkJfQotI2VuZGlmCi0JCXpzX3NvZnRbY2hhbm5lbF0uY2xrX2Rpdmlzb3IgPSAxNjsKLS8qIC0tIHdlIGFyZSBub3Qgc3VyZSB0aGUgU0NDIGlzIHBvd2VyZWQgT04gYXQgdGhpcyBwb2ludAotIAkJenNfc29mdFtjaGFubmVsXS56c19iYXVkID0gZ2V0X3pzYmF1ZCgmenNfc29mdFtjaGFubmVsXSk7Ci0qLwotCQl6c19zb2Z0W2NoYW5uZWxdLnpzX2JhdWQgPSAzODQwMDsKLQotCQkvKiBJZiBjb25zb2xlIHNlcmlhbCBsaW5lLCB0aGVuIGVuYWJsZSBpbnRlcnJ1cHRzLiAqLwotCQlpZiAoenNfc29mdFtjaGFubmVsXS5pc19jb25zKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJtYWNzZXJpYWw6IGNvbnNvbGUgbGluZSwgZW5hYmxpbmcgIgotCQkJCQkiaW50ZXJydXB0ICVkXG4iLCB6c19zb2Z0W2NoYW5uZWxdLmlycSk7Ci0JCQlwYW5pYygibWFjc2VyaWFsOiBjb25zb2xlIG5vdCBzdXBwb3J0ZWQgeWV0ICEiKTsKLQkJCXdyaXRlX3pzcmVnKHpzX3NvZnRbY2hhbm5lbF0uenNfY2hhbm5lbCwgUjEsCi0JCQkJICAgIChFWFRfSU5UX0VOQUIgfCBJTlRfQUxMX1J4IHwgVHhJTlRfRU5BQikpOwotCQkJd3JpdGVfenNyZWcoenNfc29mdFtjaGFubmVsXS56c19jaGFubmVsLCBSOSwKLQkJCQkgICAgKE5WIHwgTUlFKSk7Ci0JCX0KLQl9Ci0KLQlmb3IgKGluZm8gPSB6c19jaGFpbiwgaSA9IDA7IGluZm87IGluZm8gPSBpbmZvLT56c19uZXh0LCBpKyspCi0JewotCQl1bnNpZ25lZCBjaGFyKiBjb25uZWN0b3I7Ci0JCWludCBsZW5wOwotCi0jaWZkZWYgQ09ORklHX0tHREIKLQkJaWYgKGluZm8tPmtnZGJfY2hhbm5lbCkgewotCQkJY29udGludWU7Ci0JCX0KLSNlbmRpZgotCQlpbmZvLT5tYWdpYyA9IFNFUklBTF9NQUdJQzsKLQkJaW5mby0+cG9ydCA9IChpbnQpIGluZm8tPnpzX2NoYW5uZWwtPmNvbnRyb2w7Ci0JCWluZm8tPmxpbmUgPSBpOwotCQlpbmZvLT50dHkgPSAwOwotCQlpbmZvLT5jdXN0b21fZGl2aXNvciA9IDE2OwotCQlpbmZvLT50aW1lb3V0ID0gMDsKLQkJaW5mby0+Y2xvc2VfZGVsYXkgPSA1MDsKLQkJaW5mby0+Y2xvc2luZ193YWl0ID0gMzAwMDsKLQkJaW5mby0+eF9jaGFyID0gMDsKLQkJaW5mby0+ZXZlbnQgPSAwOwotCQlpbmZvLT5jb3VudCA9IDA7Ci0JCWluZm8tPmJsb2NrZWRfb3BlbiA9IDA7Ci0JCUlOSVRfV09SSygmaW5mby0+dHF1ZXVlLCBkb19zb2Z0aW50LCBpbmZvKTsKLQkJc3Bpbl9sb2NrX2luaXQoJmluZm8tPmxvY2spOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5vcGVuX3dhaXQpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jbG9zZV93YWl0KTsKLQkJaW5mby0+dGltZW91dCA9IEhaOwotCQlwcmludGsoS0VSTl9JTkZPICJ0dHklMDJkIGF0IDB4JTA4eCAoaXJxID0gJWQpIiwgaW5mby0+bGluZSwgCi0JCQlpbmZvLT5wb3J0LCBpbmZvLT5pcnEpOwotCQlwcmludGsoIiBpcyBhIFo4NTMwIEVTQ0MiKTsKLQkJY29ubmVjdG9yID0gZ2V0X3Byb3BlcnR5KGluZm8tPmRldl9ub2RlLCAiQUFQTCxjb25uZWN0b3IiLCAmbGVucCk7Ci0JCWlmIChjb25uZWN0b3IpCi0JCQlwcmludGsoIiwgcG9ydCA9ICVzIiwgY29ubmVjdG9yKTsKLQkJaWYgKGluZm8tPmlzX2ludGVybmFsX21vZGVtKQotCQkJcHJpbnRrKCIgKGludGVybmFsIG1vZGVtKSIpOwotCQlpZiAoaW5mby0+aXNfaXJkYSkKLQkJCXByaW50aygiIChJckRBKSIpOwotCQlwcmludGsoIlxuIik7Ci0gCX0KLQl0bXBfYnVmID0gMDsKLQotCXJldHVybiAwOwotfQotCi12b2lkIG1hY3NlcmlhbF9jbGVhbnVwKHZvaWQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbzsKLQotCWZvciAoaW5mbyA9IHpzX2NoYWluLCBpID0gMDsgaW5mbzsgaW5mbyA9IGluZm8tPnpzX25leHQsIGkrKykKLQkJc2V0X3NjY19wb3dlcihpbmZvLCAwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCB6c19jaGFubmVsc19mb3VuZDsgKytpKSB7Ci0JCWZyZWVfaXJxKHpzX3NvZnRbaV0uaXJxLCAmenNfc29mdFtpXSk7Ci0JCWlmICh6c19zb2Z0W2ldLmhhc19kbWEpIHsKLQkJCWZyZWVfaXJxKHpzX3NvZnRbaV0udHhfZG1hX2lycSwgJnpzX3NvZnRbaV0pOwotCQkJZnJlZV9pcnEoenNfc29mdFtpXS5yeF9kbWFfaXJxLCAmenNfc29mdFtpXSk7Ci0JCX0KLQkJcmVsZWFzZV9PRl9yZXNvdXJjZSh6c19zb2Z0W2ldLmRldl9ub2RlLCAwKTsKLQkJaWYgKHpzX3NvZnRbaV0uaGFzX2RtYSkgewotCQkJc3RydWN0IGRldmljZV9ub2RlKiBjaCA9IHpzX3NvZnRbaV0uZGV2X25vZGU7Ci0JCQlyZWxlYXNlX09GX3Jlc291cmNlKGNoLCBjaC0+bl9hZGRycyAtIDIpOwotCQkJcmVsZWFzZV9PRl9yZXNvdXJjZShjaCwgY2gtPm5fYWRkcnMgLSAxKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0JdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOwotCXB1dF90dHlfZHJpdmVyKHNlcmlhbF9kcml2ZXIpOwotCi0JaWYgKHRtcF9idWYpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSB0bXBfYnVmKTsKLQkJdG1wX2J1ZiA9IDA7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKLQlpZiAoenNfY2hhbm5lbHNfZm91bmQpCi0JCXBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZzZXJpYWxfc2xlZXBfbm90aWZpZXIpOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCi19Ci0KLW1vZHVsZV9pbml0KG1hY3NlcmlhbF9pbml0KTsKLW1vZHVsZV9leGl0KG1hY3NlcmlhbF9jbGVhbnVwKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotI2lmIDAKLS8qCi0gKiByZWdpc3Rlcl9zZXJpYWwgYW5kIHVucmVnaXN0ZXJfc2VyaWFsIGFsbG93cyBmb3Igc2VyaWFsIHBvcnRzIHRvIGJlCi0gKiBjb25maWd1cmVkIGF0IHJ1bi10aW1lLCB0byBzdXBwb3J0IFBDTUNJQSBtb2RlbXMuCi0gKi8KLS8qIFBvd2VyTWFjOiBVbnVzZWQgYXQgdGhpcyB0aW1lLCBqdXN0IGhlcmUgdG8gbWFrZSB0aGluZ3MgbGluay4gKi8KLWludCByZWdpc3Rlcl9zZXJpYWwoc3RydWN0IHNlcmlhbF9zdHJ1Y3QgKnJlcSkKLXsKLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQgdW5yZWdpc3Rlcl9zZXJpYWwoaW50IGxpbmUpCi17Ci0JcmV0dXJuOwotfQotI2VuZGlmCi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFNlcmlhbCBjb25zb2xlIGRyaXZlcgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUKLQotLyoKLSAqCVByaW50IGEgc3RyaW5nIHRvIHRoZSBzZXJpYWwgcG9ydCB0cnlpbmcgbm90IHRvIGRpc3R1cmIKLSAqCWFueSBwb3NzaWJsZSByZWFsIHVzZSBvZiB0aGUgcG9ydC4uLgotICovCi1zdGF0aWMgdm9pZCBzZXJpYWxfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY28sIGNvbnN0IGNoYXIgKnMsCi0JCQkJIHVuc2lnbmVkIGNvdW50KQotewotCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0genNfc29mdCArIGNvLT5pbmRleDsKLQlpbnQgaTsKLQotCS8qIFR1cm4gb2YgaW50ZXJydXB0cyBhbmQgZW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCBSMSwgaW5mby0+Y3VycmVnc1sxXSAmIH5UeElOVF9FTkFCKTsKLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCBSNSwgaW5mby0+Y3VycmVnc1s1XSB8IFR4RU5BQiB8IFJUUyB8IERUUik7Ci0KLQlmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCS8qIFdhaXQgZm9yIHRoZSB0cmFuc21pdCBidWZmZXIgdG8gZW1wdHkuICovCi0JCXdoaWxlICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIFR4X0JVRl9FTVApID09IDApIHsKLQkJCWVpZWlvKCk7Ci0JCX0KLQotCQl3cml0ZV96c2RhdGEoaW5mby0+enNfY2hhbm5lbCwgc1tpXSk7Ci0JCWlmIChzW2ldID09IDEwKSB7Ci0JCQl3aGlsZSAoKHJlYWRfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgMCkgJiBUeF9CVUZfRU1QKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKQotCQkJCWVpZWlvKCk7Ci0KLQkJCXdyaXRlX3pzZGF0YShpbmZvLT56c19jaGFubmVsLCAxMyk7Ci0JCX0KLQl9Ci0KLQkvKiBSZXN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlIHJlZ2lzdGVycy4gKi8KLQl3cml0ZV96c3JlZyhpbmZvLT56c19jaGFubmVsLCBSMSwgaW5mby0+Y3VycmVnc1sxXSk7Ci0JLyogRG9uJ3QgZGlzYWJsZSB0aGUgdHJhbnNtaXR0ZXIuICovCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqc2VyaWFsX2RyaXZlcjsKLQotc3RhdGljIHN0cnVjdCB0dHlfZHJpdmVyICpzZXJpYWxfY29uc29sZV9kZXZpY2Uoc3RydWN0IGNvbnNvbGUgKmMsIGludCAqaW5kZXgpCi17Ci0JKmluZGV4ID0gYy0+aW5kZXg7Ci0JcmV0dXJuIHNlcmlhbF9kcml2ZXI7Ci19Ci0KLS8qCi0gKglTZXR1cCBpbml0aWFsIGJhdWQvYml0cy9wYXJpdHkuIFdlIGRvIHR3byB0aGluZ3MgaGVyZToKLSAqCS0gY29uc3RydWN0IGEgY2ZsYWcgc2V0dGluZyBmb3IgdGhlIGZpcnN0IHJzX29wZW4oKQotICoJLSBpbml0aWFsaXplIHRoZSBzZXJpYWwgcG9ydAotICoJUmV0dXJuIG5vbi16ZXJvIGlmIHdlIGRpZG4ndCBmaW5kIGEgc2VyaWFsIHBvcnQuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHNlcmlhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKLXsKLQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbzsKLQlpbnQJYmF1ZCA9IDM4NDAwOwotCWludAliaXRzID0gODsKLQlpbnQJcGFyaXR5ID0gJ24nOwotCWludAljZmxhZyA9IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7Ci0JaW50CWJyZzsKLQljaGFyCSpzOwotCWxvbmcJZmxhZ3M7Ci0KLQkvKiBGaW5kIG91dCBob3cgbWFueSBaODUzMCBTQ0NzIHdlIGhhdmUgKi8KLQlpZiAoenNfY2hhaW4gPT0gMCkKLQkJcHJvYmVfc2NjcygpOwotCi0JaWYgKHpzX2NoYWluID09IDApCi0JCXJldHVybiAtMTsKLQotCS8qIERvIHdlIGhhdmUgdGhlIGRldmljZSBhc2tlZCBmb3I/ICovCi0JaWYgKGNvLT5pbmRleCA+PSB6c19jaGFubmVsc19mb3VuZCkKLQkJcmV0dXJuIC0xOwotCWluZm8gPSB6c19zb2Z0ICsgY28tPmluZGV4OwotCi0Jc2V0X3NjY19wb3dlcihpbmZvLCAxKTsKLQotCS8qIFJlc2V0IHRoZSBjaGFubmVsICovCi0Jd3JpdGVfenNyZWcoaW5mby0+enNfY2hhbm5lbCwgUjksIENIUkEpOwotCi0JaWYgKG9wdGlvbnMpIHsKLQkJYmF1ZCA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMsIE5VTEwsIDEwKTsKLQkJcyA9IG9wdGlvbnM7Ci0JCXdoaWxlKCpzID49ICcwJyAmJiAqcyA8PSAnOScpCi0JCQlzKys7Ci0JCWlmICgqcykKLQkJCXBhcml0eSA9ICpzKys7Ci0JCWlmICgqcykKLQkJCWJpdHMgICA9ICpzIC0gJzAnOwotCX0KLQotCS8qCi0JICoJTm93IGNvbnN0cnVjdCBhIGNmbGFnIHNldHRpbmcuCi0JICovCi0Jc3dpdGNoKGJhdWQpIHsKLQljYXNlIDEyMDA6Ci0JCWNmbGFnIHw9IEIxMjAwOwotCQlicmVhazsKLQljYXNlIDI0MDA6Ci0JCWNmbGFnIHw9IEIyNDAwOwotCQlicmVhazsKLQljYXNlIDQ4MDA6Ci0JCWNmbGFnIHw9IEI0ODAwOwotCQlicmVhazsKLQljYXNlIDk2MDA6Ci0JCWNmbGFnIHw9IEI5NjAwOwotCQlicmVhazsKLQljYXNlIDE5MjAwOgotCQljZmxhZyB8PSBCMTkyMDA7Ci0JCWJyZWFrOwotCWNhc2UgNTc2MDA6Ci0JCWNmbGFnIHw9IEI1NzYwMDsKLQkJYnJlYWs7Ci0JY2FzZSAxMTUyMDA6Ci0JCWNmbGFnIHw9IEIxMTUyMDA7Ci0JCWJyZWFrOwotCWNhc2UgMzg0MDA6Ci0JZGVmYXVsdDoKLQkJY2ZsYWcgfD0gQjM4NDAwOwotCQlicmVhazsKLQl9Ci0Jc3dpdGNoKGJpdHMpIHsKLQljYXNlIDc6Ci0JCWNmbGFnIHw9IENTNzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIDg6Ci0JCWNmbGFnIHw9IENTODsKLQkJYnJlYWs7Ci0JfQotCXN3aXRjaChwYXJpdHkpIHsKLQljYXNlICdvJzogY2FzZSAnTyc6Ci0JCWNmbGFnIHw9IFBBUkVOQiB8IFBBUk9ERDsKLQkJYnJlYWs7Ci0JY2FzZSAnZSc6IGNhc2UgJ0UnOgotCQljZmxhZyB8PSBQQVJFTkI7Ci0JCWJyZWFrOwotCX0KLQljby0+Y2ZsYWcgPSBjZmxhZzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0gICAgICAgIG1lbXNldChpbmZvLT5jdXJyZWdzLCAwLCBzaXplb2YoaW5mby0+Y3VycmVncykpOwotCi0JaW5mby0+enNfYmF1ZCA9IGJhdWQ7Ci0JaW5mby0+Y2xrX2Rpdmlzb3IgPSAxNjsKLQlzd2l0Y2ggKGluZm8tPnpzX2JhdWQpIHsKLQljYXNlIFpTX0NMT0NLLzE2OgkvKiAyMzA0MDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgxNkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQljYXNlIFpTX0NMT0NLLzMyOgkvKiAxMTUyMDAgKi8KLQkJaW5mby0+Y3VycmVnc1s0XSA9IFgzMkNMSzsKLQkJaW5mby0+Y3VycmVnc1sxMV0gPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpbmZvLT5jdXJyZWdzWzRdID0gWDE2Q0xLOwotCQlpbmZvLT5jdXJyZWdzWzExXSA9IFRDQlIgfCBSQ0JSOwotCQlicmcgPSBCUFNfVE9fQlJHKGluZm8tPnpzX2JhdWQsIFpTX0NMT0NLL2luZm8tPmNsa19kaXZpc29yKTsKLQkJaW5mby0+Y3VycmVnc1sxMl0gPSAoYnJnICYgMjU1KTsKLQkJaW5mby0+Y3VycmVnc1sxM10gPSAoKGJyZyA+PiA4KSAmIDI1NSk7Ci0JCWluZm8tPmN1cnJlZ3NbMTRdID0gQlJFTkFCTDsKLQl9Ci0KLQkvKiBieXRlIHNpemUgYW5kIHBhcml0eSAqLwotCWluZm8tPmN1cnJlZ3NbM10gJj0gflJ4TkJJVFNfTUFTSzsKLQlpbmZvLT5jdXJyZWdzWzVdICY9IH5UeE5CSVRTX01BU0s7Ci0Jc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7Ci0JY2FzZSBDUzU6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng1OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NTsKLQkJYnJlYWs7Ci0JY2FzZSBDUzY6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng2OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NjsKLQkJYnJlYWs7Ci0JY2FzZSBDUzc6Ci0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng3OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4NzsKLQkJYnJlYWs7Ci0JY2FzZSBDUzg6Ci0JZGVmYXVsdDogLyogZGVmYXVsdHMgdG8gOCBiaXRzICovCi0JCWluZm8tPmN1cnJlZ3NbM10gfD0gUng4OwotCQlpbmZvLT5jdXJyZWdzWzVdIHw9IFR4ODsKLQkJYnJlYWs7Ci0JfQotICAgICAgICBpbmZvLT5jdXJyZWdzWzVdIHw9IFR4RU5BQiB8IFJUUyB8IERUUjsKLQlpbmZvLT5wZW5kcmVnc1szXSA9IGluZm8tPmN1cnJlZ3NbM107Ci0JaW5mby0+cGVuZHJlZ3NbNV0gPSBpbmZvLT5jdXJyZWdzWzVdOwotCi0JaW5mby0+Y3VycmVnc1s0XSAmPSB+KFNCX01BU0sgfCBQQVJfRU5BIHwgUEFSX0VWRU4pOwotCWlmIChjZmxhZyAmIENTVE9QQikgewotCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFNCMjsKLQl9IGVsc2UgewotCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFNCMTsKLQl9Ci0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWluZm8tPmN1cnJlZ3NbNF0gfD0gUEFSX0VOQTsKLQkJaWYgKCEoY2ZsYWcgJiBQQVJPREQpKSB7Ci0JCQlpbmZvLT5jdXJyZWdzWzRdIHw9IFBBUl9FVkVOOwotCQl9Ci0JfQotCWluZm8tPnBlbmRyZWdzWzRdID0gaW5mby0+Y3VycmVnc1s0XTsKLQotCWlmICghKGNmbGFnICYgQ0xPQ0FMKSkgewotCQlpZiAoIShpbmZvLT5jdXJyZWdzWzE1XSAmIERDRElFKSkKLQkJCWluZm8tPnJlYWRfcmVnX3plcm8gPSByZWFkX3pzcmVnKGluZm8tPnpzX2NoYW5uZWwsIDApOwotCQlpbmZvLT5jdXJyZWdzWzE1XSB8PSBEQ0RJRTsKLQl9IGVsc2UKLQkJaW5mby0+Y3VycmVnc1sxNV0gJj0gfkRDRElFOwotCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKLQkJaW5mby0+Y3VycmVnc1sxNV0gfD0gQ1RTSUU7Ci0JCWlmICgocmVhZF96c3JlZyhpbmZvLT56c19jaGFubmVsLCAwKSAmIENUUykgIT0gMCkKLQkJCWluZm8tPnR4X3N0b3BwZWQgPSAxOwotCX0gZWxzZSB7Ci0JCWluZm8tPmN1cnJlZ3NbMTVdICY9IH5DVFNJRTsKLQkJaW5mby0+dHhfc3RvcHBlZCA9IDA7Ci0JfQotCWluZm8tPnBlbmRyZWdzWzE1XSA9IGluZm8tPmN1cnJlZ3NbMTVdOwotCi0JLyogTG9hZCB1cCB0aGUgbmV3IHZhbHVlcyAqLwotCWxvYWRfenNyZWdzKGluZm8tPnpzX2NoYW5uZWwsIGluZm8tPmN1cnJlZ3MpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJjb25zID0gewotCS5uYW1lCQk9ICJ0dHlTIiwKLQkud3JpdGUJCT0gc2VyaWFsX2NvbnNvbGVfd3JpdGUsCi0JLmRldmljZQkJPSBzZXJpYWxfY29uc29sZV9kZXZpY2UsCi0JLnNldHVwCQk9IHNlcmlhbF9jb25zb2xlX3NldHVwLAotCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsCi0JLmluZGV4CQk9IC0xLAotfTsKLQotLyoKLSAqCVJlZ2lzdGVyIGNvbnNvbGUuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBtYWNfc2NjX2NvbnNvbGVfaW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX2NvbnNvbGUoJnNlcmNvbnMpOwotfQotY29uc29sZV9pbml0Y2FsbChtYWNfc2NjX2NvbnNvbGVfaW5pdCk7Ci0KLSNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU0VSSUFMX0NPTlNPTEUgKi8KLQotI2lmZGVmIENPTkZJR19LR0RCCi0vKiBUaGVzZSBhcmUgZm9yIHJlY2VpdmluZyBhbmQgc2VuZGluZyBjaGFyYWN0ZXJzIHVuZGVyIHRoZSBrZ2RiCi0gKiBzb3VyY2UgbGV2ZWwga2VybmVsIGRlYnVnZ2VyLgotICovCi12b2lkIHB1dERlYnVnQ2hhcihjaGFyIGtnZGJfY2hhcikKLXsKLQlzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbiA9IHpzX2tnZGJjaGFuOwotCXdoaWxlICgocmVhZF96c3JlZyhjaGFuLCAwKSAmIFR4X0JVRl9FTVApID09IDApCi0JCXVkZWxheSg1KTsKLQl3cml0ZV96c2RhdGEoY2hhbiwga2dkYl9jaGFyKTsKLX0KLQotY2hhciBnZXREZWJ1Z0NoYXIodm9pZCkKLXsKLQlzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqY2hhbiA9IHpzX2tnZGJjaGFuOwotCXdoaWxlKChyZWFkX3pzcmVnKGNoYW4sIDApICYgUnhfQ0hfQVYpID09IDApCi0JCWVpZWlvKCk7IC8qYmFycmllcigpOyovCi0JcmV0dXJuIHJlYWRfenNkYXRhKGNoYW4pOwotfQotCi12b2lkIGtnZGJfaW50ZXJydXB0aWJsZShpbnQgeWVzKQotewotCXN0cnVjdCBtYWNfenNjaGFubmVsICpjaGFuID0genNfa2dkYmNoYW47Ci0JaW50IG9uZSwgbmluZTsKLQluaW5lID0gcmVhZF96c3JlZyhjaGFuLCA5KTsKLQlpZiAoeWVzID09IDEpIHsKLQkJb25lID0gRVhUX0lOVF9FTkFCfElOVF9BTExfUng7Ci0JCW5pbmUgfD0gTUlFOwotCQlwcmludGsoInR1cm5pbmcgc2VyaWFsIGludHMgb25cbiIpOwotCX0gZWxzZSB7Ci0JCW9uZSA9IFJ4SU5UX0RJU0FCOwotCQluaW5lICY9IH5NSUU7Ci0JCXByaW50aygidHVybmluZyBzZXJpYWwgaW50cyBvZmZcbiIpOwotCX0KLQl3cml0ZV96c3JlZyhjaGFuLCAxLCBvbmUpOwotCXdyaXRlX3pzcmVnKGNoYW4sIDksIG5pbmUpOwotfQotCi0vKiBUaGlzIHNldHMgdXAgdGhlIHNlcmlhbCBwb3J0IHdlJ3JlIHVzaW5nLCBhbmQgdHVybnMgb24KLSAqIGludGVycnVwdHMgZm9yIHRoYXQgY2hhbm5lbCwgc28ga2dkYiBpcyB1c2FibGUgb25jZSB3ZSdyZSBkb25lLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQga2dkYl9jaGFuaW5pdChzdHJ1Y3QgbWFjX3pzY2hhbm5lbCAqbXMsIGludCBpbnRzb24sIGludCBicHMpCi17Ci0JaW50IGJyZzsKLQlpbnQgaSwgeDsKLQl2b2xhdGlsZSBjaGFyICpzY2NjID0gbXMtPmNvbnRyb2w7Ci0JYnJnID0gQlBTX1RPX0JSRyhicHMsIFpTX0NMT0NLLzE2KTsKLQlwcmludGsoInNldHRpbmcgYnBzIG9uIGtnZGIgbGluZSB0byAlZCBbYnJnPSV4XVxuIiwgYnBzLCBicmcpOwotCWZvciAoaSA9IDIwMDAwOyBpICE9IDA7IC0taSkgewotCQl4ID0gKnNjY2M7IGVpZWlvKCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2NjX2luaXR0YWIpOyArK2kpIHsKLQkJd3JpdGVfenNyZWcobXMsIHNjY19pbml0dGFiW2ldLCBzY2NfaW5pdHRhYltpKzFdKTsKLQkJaSsrOwotCX0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYXQgYm9vdCB0aW1lIHRvIHByaW1lIHRoZSBrZ2RiIHNlcmlhbCBkZWJ1Z2dpbmcKLSAqIHNlcmlhbCBsaW5lLiAgVGhlICd0dHlfbnVtJyBhcmd1bWVudCBpcyAwIGZvciAvZGV2L3R0eWEgYW5kIDEKLSAqIGZvciAvZGV2L3R0eWIgd2hpY2ggaXMgZGV0ZXJtaW5lZCBpbiBzZXR1cF9hcmNoKCkgZnJvbSB0aGUKLSAqIGJvb3QgY29tbWFuZCBsaW5lIGZsYWdzLgotICogWFhYIGF0IHRoZSBtb21lbnQgcHJvYmFibHkgb25seSBjaGFubmVsIEEgd2lsbCB3b3JrCi0gKi8KLXZvaWQgX19pbml0IHpzX2tnZGJfaG9vayhpbnQgdHR5X251bSkKLXsKLQkvKiBGaW5kIG91dCBob3cgbWFueSBaODUzMCBTQ0NzIHdlIGhhdmUgKi8KLQlpZiAoenNfY2hhaW4gPT0gMCkKLQkJcHJvYmVfc2NjcygpOwotCi0Jc2V0X3NjY19wb3dlcigmenNfc29mdFt0dHlfbnVtXSwgMSk7Ci0KLQl6c19rZ2RiY2hhbiA9IHpzX3NvZnRbdHR5X251bV0uenNfY2hhbm5lbDsKLQl6c19zb2Z0W3R0eV9udW1dLmNoYW5nZV9uZWVkZWQgPSAwOwotCXpzX3NvZnRbdHR5X251bV0uY2xrX2Rpdmlzb3IgPSAxNjsKLQl6c19zb2Z0W3R0eV9udW1dLnpzX2JhdWQgPSAzODQwMDsKLQl6c19zb2Z0W3R0eV9udW1dLmtnZGJfY2hhbm5lbCA9IDE7ICAgICAvKiBUaGlzIHJ1bnMga2dkYiAqLwotCi0JLyogVHVybiBvbiB0cmFuc21pdHRlci9yZWNlaXZlciBhdCA4LWJpdHMvY2hhciAqLwotICAgICAgICBrZ2RiX2NoYW5pbml0KHpzX3NvZnRbdHR5X251bV0uenNfY2hhbm5lbCwgMSwgMzg0MDApOwotCXByaW50aygiS0dEQjogb24gY2hhbm5lbCAlZCBpbml0aWFsaXplZFxuIiwgdHR5X251bSk7Ci0Jc2V0X2RlYnVnX3RyYXBzKCk7IC8qIGluaXQgc3R1YiAqLwotfQotI2VuZGlmIC8qIGlmZGVmIENPTkZJR19LR0RCICovCi0KLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotLyoKLSAqIG5vdGlmeSBjbGllbnRzIGJlZm9yZSBzbGVlcCBhbmQgcmVzZXQgYnVzIGFmdGVyd2FyZHMKLSAqLwotaW50Ci1zZXJpYWxfbm90aWZ5X3NsZWVwKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQotewotCWludCBpOwotCi0Jc3dpdGNoICh3aGVuKSB7Ci0JY2FzZSBQQk9PS19TTEVFUF9SRVFVRVNUOgotCWNhc2UgUEJPT0tfU0xFRVBfUkVKRUNUOgotCQlicmVhazsKLQotCWNhc2UgUEJPT0tfU0xFRVBfTk9XOgotCQlmb3IgKGk9MDsgaTx6c19jaGFubmVsc19mb3VuZDsgaSsrKSB7Ci0JCQlzdHJ1Y3QgbWFjX3NlcmlhbCAqaW5mbyA9ICZ6c19zb2Z0W2ldOwotCQkJaWYgKGluZm8tPmZsYWdzICYgWklMT0dfSU5JVElBTElaRUQpIHsKLQkJCQlzaHV0ZG93bihpbmZvKTsKLQkJCQlpbmZvLT5mbGFncyB8PSBaSUxPR19TTEVFUElORzsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIFBCT09LX1dBS0U6Ci0JCWZvciAoaT0wOyBpPHpzX2NoYW5uZWxzX2ZvdW5kOyBpKyspIHsKLQkJCXN0cnVjdCBtYWNfc2VyaWFsICppbmZvID0gJnpzX3NvZnRbaV07Ci0JCQlpZiAoaW5mby0+ZmxhZ3MgJiBaSUxPR19TTEVFUElORykgewotCQkJCWluZm8tPmZsYWdzICY9IH5aSUxPR19TTEVFUElORzsKLQkJCQlzdGFydHVwKGluZm8pOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUEJPT0tfU0xFRVBfT0s7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY3NlcmlhbC5oIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjc2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGUxMWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvbWFjc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoKLSAqIG1hY3NlcmlhbC5oOiBEZWZpbml0aW9ucyBmb3IgdGhlIE1hY2ludG9zaCBaODUzMCBzZXJpYWwgZHJpdmVyLgotICoKLSAqIEFkYXB0ZWQgZnJvbSBkcml2ZXJzL3NidXMvY2hhci9zdW5zZXJpYWwuaCBieSBQYXVsIE1hY2tlcnJhcy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGF1bCBNYWNrZXJyYXMgKFBhdWwuTWFja2VycmFzQGNzLmFudS5lZHUuYXUpCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQotICovCi0jaWZuZGVmIF9NQUNTRVJJQUxfSAotI2RlZmluZSBfTUFDU0VSSUFMX0gKLQotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNkZWZpbmUgTlVNX1pTUkVHUyAgICAxNgotCi1zdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB7Ci0JaW50CXR5cGU7Ci0JaW50CWxpbmU7Ci0JaW50CXBvcnQ7Ci0JaW50CWlycTsKLQlpbnQJZmxhZ3M7Ci0JaW50CXhtaXRfZmlmb19zaXplOwotCWludAljdXN0b21fZGl2aXNvcjsKLQlpbnQJYmF1ZF9iYXNlOwotCXVuc2lnbmVkIHNob3J0CWNsb3NlX2RlbGF5OwotCWNoYXIJcmVzZXJ2ZWRfY2hhclsyXTsKLQlpbnQJaHViNjsKLQl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQ7IC8qIHRpbWUgdG8gd2FpdCBiZWZvcmUgY2xvc2luZyAqLwotCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDI7IC8qIG5vIGxvbmdlciB1c2VkLi4uICovCi0JaW50CXJlc2VydmVkWzRdOwotfTsKLQotLyoKLSAqIEZvciB0aGUgY2xvc2Ugd2FpdCB0aW1lcywgMCBtZWFucyB3YWl0IGZvcmV2ZXIgZm9yIHNlcmlhbCBwb3J0IHRvCi0gKiBmbHVzaCBpdHMgb3V0cHV0LiAgNjU1MzUgbWVhbnMgZG9uJ3Qgd2FpdCBhdCBhbGwuCi0gKi8KLSNkZWZpbmUgWklMT0dfQ0xPU0lOR19XQUlUX0lORgkwCi0jZGVmaW5lIFpJTE9HX0NMT1NJTkdfV0FJVF9OT05FCTY1NTM1Ci0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgWklMT0dfc3RydWN0IChhbmQgc2VyaWFsX3N0cnVjdCkgZmxhZ3MgZmllbGQKLSAqLwotI2RlZmluZSBaSUxPR19IVVBfTk9USUZZCTB4MDAwMQkvKiBOb3RpZnkgZ2V0dHkgb24gaGFuZ3VwcyBhbmQgY2xvc2VzIAotCQkJCSAgIAkgKiBvbiB0aGUgY2FsbG91dCBwb3J0ICovCi0jZGVmaW5lIFpJTE9HX0ZPVVJQT1JUIAkJMHgwMDAyCS8qIFNldCBPVTEsIE9VVDIgcGVyIEFTVCBGb3VycG9ydCBzZXR0aW5ncyAqLwotI2RlZmluZSBaSUxPR19TQUsJCTB4MDAwNAkvKiBTZWN1cmUgQXR0ZW50aW9uIEtleSAoT3JhbmdlIGJvb2spICovCi0jZGVmaW5lIFpJTE9HX1NQTElUX1RFUk1JT1MJMHgwMDA4CS8qIFNlcGFyYXRlIHRlcm1pb3MgZm9yIGRpYWxpbi9jYWxsb3V0ICovCi0KLSNkZWZpbmUgWklMT0dfU1BEX01BU0sJCTB4MDAzMAotI2RlZmluZSBaSUxPR19TUERfSEkJCTB4MDAxMAkvKiBVc2UgNTYwMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KLQotI2RlZmluZSBaSUxPR19TUERfVkhJCQkweDAwMjAgIC8qIFVzZSAxMTUyMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KLSNkZWZpbmUgWklMT0dfU1BEX0NVU1QJCTB4MDAzMCAgLyogVXNlIHVzZXItc3BlY2lmaWVkIGRpdmlzb3IgKi8KLQotI2RlZmluZSBaSUxPR19TS0lQX1RFU1QJCTB4MDA0MAkvKiBTa2lwIFVBUlQgdGVzdCBkdXJpbmcgYXV0b2NvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgWklMT0dfQVVUT19JUlEgCQkweDAwODAJLyogRG8gYXV0b21hdGljIElSUSBkdXJpbmcgYXV0b2NvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgWklMT0dfU0VTU0lPTl9MT0NLT1VUCTB4MDEwMAkvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gc2Vzc2lvbiAqLwotI2RlZmluZSBaSUxPR19QR1JQX0xPQ0tPVVQJMHgwMjAwCS8qIExvY2sgb3V0IGN1YSBvcGVucyBiYXNlZCBvbiBwZ3JwICovCi0jZGVmaW5lIFpJTE9HX0NBTExPVVRfTk9IVVAJMHgwNDAwCS8qIERvbid0IGRvIGhhbmd1cHMgZm9yIGN1YSBkZXZpY2UgKi8KLQotI2RlZmluZSBaSUxPR19GTEFHUwkJMHgwRkZGCS8qIFBvc3NpYmxlIGxlZ2FsIFpJTE9HIGZsYWdzICovCi0jZGVmaW5lIFpJTE9HX1VTUl9NQVNLCQkweDA0MzAJLyogTGVnYWwgZmxhZ3MgdGhhdCBub24tcHJpdmlsZWdlZAotCQkJCQkgKiB1c2VycyBjYW4gc2V0IG9yIHJlc2V0ICovCi0KLS8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSBrZXJuZWwvY2hyX2Rydi9zZXJpYWwuYyAqLwotI2RlZmluZSBaSUxPR19JTklUSUFMSVpFRAkweDgwMDAwMDAwIC8qIFNlcmlhbCBwb3J0IHdhcyBpbml0aWFsaXplZCAqLwotI2RlZmluZSBaSUxPR19DQUxMT1VUX0FDVElWRQkweDQwMDAwMDAwIC8qIENhbGwgb3V0IGRldmljZSBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgWklMT0dfTk9STUFMX0FDVElWRQkweDIwMDAwMDAwIC8qIE5vcm1hbCBkZXZpY2UgaXMgYWN0aXZlICovCi0jZGVmaW5lIFpJTE9HX0JPT1RfQVVUT0NPTkYJMHgxMDAwMDAwMCAvKiBBdXRvY29uZmlndXJlIHBvcnQgb24gYm9vdHVwICovCi0jZGVmaW5lIFpJTE9HX0NMT1NJTkcJCTB4MDgwMDAwMDAgLyogU2VyaWFsIHBvcnQgaXMgY2xvc2luZyAqLwotI2RlZmluZSBaSUxPR19DVFNfRkxPVwkJMHgwNDAwMDAwMCAvKiBEbyBDVFMgZmxvdyBjb250cm9sICovCi0jZGVmaW5lIFpJTE9HX0NIRUNLX0NECQkweDAyMDAwMDAwIC8qIGkuZS4sIENMT0NBTCAqLwotI2RlZmluZSBaSUxPR19TTEVFUElORwkJMHgwMTAwMDAwMCAvKiBoYXZlIHNodXQgaXQgZG93biBmb3Igc2xlZXAgKi8KLQotLyogU29mdHdhcmUgc3RhdGUgcGVyIGNoYW5uZWwgKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLS8qCi0gKiBUaGlzIGlzIG91ciBpbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGVhY2ggc2VyaWFsIHBvcnQncyBzdGF0ZS4KLSAqIAotICogTWFueSBmaWVsZHMgYXJlIHBhcmFsbGVsZWQgYnkgdGhlIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBzZXJpYWxfc3RydWN0Ci0gKiBzdHJ1Y3R1cmUuCi0gKgotICogRm9yIGRlZmluaXRpb25zIG9mIHRoZSBmbGFncyBmaWVsZCwgc2VlIHR0eS5oCi0gKi8KLQotc3RydWN0IG1hY19zZXJpYWw7Ci0KLXN0cnVjdCBtYWNfenNjaGFubmVsIHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKgljb250cm9sOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqCWRhdGE7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQkvKiBVc2VkIGZvciBkZWJ1Z2dpbmcgKi8KLQlzdHJ1Y3QgbWFjX3NlcmlhbCoJcGFyZW50OwotfTsKLQotc3RydWN0IG1hY19kbWEgewotCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9yZWdzCWRtYTsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydAkJcmVzX2NvdW50OwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0CQljb21tYW5kOwotCXZvbGF0aWxlIHVuc2lnbmVkIGludAkJYnVmX2FkZHI7Ci19OwotCi1zdHJ1Y3QgbWFjX3NlcmlhbCB7Ci0Jc3RydWN0IG1hY19zZXJpYWwgKnpzX25leHQ7CS8qIEZvciBJUlEgc2VydmljaW5nIGNoYWluICovCi0Jc3RydWN0IG1hY196c2NoYW5uZWwgKnpzX2NoYW5uZWw7IC8qIENoYW5uZWwgcmVnaXN0ZXJzICovCi0Jc3RydWN0IG1hY196c2NoYW5uZWwgKnpzX2NoYW5fYTsJLyogQSBzaWRlIHJlZ2lzdGVycyAqLwotCXVuc2lnbmVkIGNoYXIgcmVhZF9yZWdfemVybzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIGRldl9ub2RlOwotCXNwaW5sb2NrX3QgbG9jazsKLQotCWNoYXIgc29mdF9jYXJyaWVyOyAgLyogVXNlIHNvZnQgY2FycmllciBvbiB0aGlzIGNoYW5uZWwgKi8KLQljaGFyIGJyZWFrX2Fib3J0OyAgIC8qIElzIHNlcmlhbCBjb25zb2xlIGluLCBzbyBwcm9jZXNzIGJyay9hYnJ0ICovCi0JY2hhciBrZ2RiX2NoYW5uZWw7ICAvKiBLZ2RiIGlzIHJ1bm5pbmcgb24gdGhpcyBjaGFubmVsICovCi0JY2hhciBpc19jb25zOyAgICAgICAvKiBJcyB0aGlzIG91ciBjb25zb2xlLiAqLwotCWNoYXIgaXNfaW50ZXJuYWxfbW9kZW07IC8qIGlzIGNvbm5lY3RlZCB0byBhbiBpbnRlcm5hbCBtb2RlbSAqLwotCWNoYXIgaXNfaXJkYTsJCS8qIGlzIGNvbm5lY3RlZCB0byBhbiBJckRBIGNvZGVjICovCi0JaW50IHBvcnRfdHlwZTsJCS8qIFBvcnQgdHlwZSBmb3IgcG1hY19mZWF0dXJlICovCi0JdW5zaWduZWQgY2hhciB0eF9hY3RpdmU7IC8qIGNoYXJhY3RlciBpcyBiZWluZyB4bWl0dGVkICovCi0JdW5zaWduZWQgY2hhciB0eF9zdG9wcGVkOyAvKiBvdXRwdXQgaXMgc3VzcGVuZGVkICovCi0JdW5zaWduZWQgY2hhciBwb3dlcl93YWl0OyAvKiB3YWl0aW5nIGZvciBwb3dlci11cCBkZWxheSB0byBleHBpcmUgKi8KLQotCS8qIFdlIG5lZWQgdG8ga25vdyB0aGUgY3VycmVudCBjbG9jayBkaXZpc29yCi0JICogdG8gcmVhZCB0aGUgYnBzIHJhdGUgdGhlIGNoaXAgaGFzIGN1cnJlbnRseQotCSAqIGxvYWRlZC4KLQkgKi8KLQl1bnNpZ25lZCBjaGFyIGNsa19kaXZpc29yOyAgLyogTWF5IGJlIDEsIDE2LCAzMiwgb3IgNjQgKi8KLQlpbnQgenNfYmF1ZDsKLQotCS8qIEN1cnJlbnQgd3JpdGUgcmVnaXN0ZXIgdmFsdWVzICovCi0JdW5zaWduZWQgY2hhciBjdXJyZWdzW05VTV9aU1JFR1NdOwotCi0JLyogVmFsdWVzIHdlIG5lZWQgdG8gc2V0IG5leHQgb3Bwb3J0dW5pdHkgKi8KLQl1bnNpZ25lZCBjaGFyIHBlbmRyZWdzW05VTV9aU1JFR1NdOwotCi0JY2hhciBjaGFuZ2VfbmVlZGVkOwotCi0JaW50CQkJbWFnaWM7Ci0JaW50CQkJYmF1ZF9iYXNlOwotCWludAkJCXBvcnQ7Ci0JaW50CQkJaXJxOwotCWludAkJCWZsYWdzOyAJCS8qIGRlZmluZWQgaW4gdHR5LmggKi8KLQlpbnQJCQl0eXBlOyAJCS8qIFVBUlQgdHlwZSAqLwotCXN0cnVjdCB0dHlfc3RydWN0IAkqdHR5OwotCWludAkJCXJlYWRfc3RhdHVzX21hc2s7Ci0JaW50CQkJaWdub3JlX3N0YXR1c19tYXNrOwotCWludAkJCXRpbWVvdXQ7Ci0JaW50CQkJeG1pdF9maWZvX3NpemU7Ci0JaW50CQkJY3VzdG9tX2Rpdmlzb3I7Ci0JaW50CQkJeF9jaGFyOwkvKiB4b24veG9mZiBjaGFyYWN0ZXIgKi8KLQlpbnQJCQljbG9zZV9kZWxheTsKLQl1bnNpZ25lZCBzaG9ydAkJY2xvc2luZ193YWl0OwotCXVuc2lnbmVkIHNob3J0CQljbG9zaW5nX3dhaXQyOwotCXVuc2lnbmVkIGxvbmcJCWV2ZW50OwotCXVuc2lnbmVkIGxvbmcJCWxhc3RfYWN0aXZlOwotCWludAkJCWxpbmU7Ci0JaW50CQkJY291bnQ7CSAgICAvKiAjIG9mIGZkIG9uIGRldmljZSAqLwotCWludAkJCWJsb2NrZWRfb3BlbjsgLyogIyBvZiBibG9ja2VkIG9wZW5zICovCi0JdW5zaWduZWQgY2hhciAJCSp4bWl0X2J1ZjsKLQlpbnQJCQl4bWl0X2hlYWQ7Ci0JaW50CQkJeG1pdF90YWlsOwotCWludAkJCXhtaXRfY250OwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0cXVldWU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJb3Blbl93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90CWNsb3NlX3dhaXQ7Ci0KLQl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncyAqdHhfZG1hOwotCWludAkJCXR4X2RtYV9pcnE7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqdHhfY21kczsKLQl2b2xhdGlsZSBzdHJ1Y3QgbWFjX2RtYSAqcng7Ci0JaW50IAkJCXJ4X2RtYV9pcnE7Ci0Jdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqKnJ4X2NtZHM7Ci0JdW5zaWduZWQgY2hhcgkJKipyeF9jaGFyX2J1ZjsKLQl1bnNpZ25lZCBjaGFyCQkqKnJ4X2ZsYWdfYnVmOwotI2RlZmluZQlSWF9CVUZfU0laRQkyNTYKLQlpbnQJCQlyeF9uYnVmOwotCWludAkJCXJ4X2RvbmVfYnl0ZXM7Ci0JaW50CQkJcnhfdWJ1ZjsKLQlpbnQJCQlyeF9mYnVmOwotI2RlZmluZQlSWF9OT19GQlVGCSgtMSkKLQlpbnQJCQlyeF9jYnVmOwotCXNwaW5sb2NrX3QJCXJ4X2RtYV9sb2NrOwotCWludAkJCWhhc19kbWE7Ci0JaW50CQkJZG1hX2luaXR0ZWQ7Ci0Jdm9pZAkJCSpkbWFfcHJpdjsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlwb2xsX2RtYV90aW1lcjsKLSNkZWZpbmUgUlhfRE1BX1RJTUVSCShqaWZmaWVzICsgMTAqSFovMTAwMCkKLQotCXN0cnVjdCB0aW1lcl9saXN0CXBvd2VydXBfdGltZXI7Ci19OwotCi0KLSNkZWZpbmUgU0VSSUFMX01BR0lDIDB4NTMwMQotCi0vKgotICogVGhlIHNpemUgb2YgdGhlIHNlcmlhbCB4bWl0IGJ1ZmZlciBpcyAxIHBhZ2UsIG9yIDQwOTYgYnl0ZXMKLSAqLwotI2RlZmluZSBTRVJJQUxfWE1JVF9TSVpFIDQwOTYKLQotLyoKLSAqIEV2ZW50cyBhcmUgdXNlZCB0byBzY2hlZHVsZSB0aGluZ3MgdG8gaGFwcGVuIGF0IHRpbWVyLWludGVycnVwdAotICogdGltZSwgaW5zdGVhZCBvZiBhdCBycyBpbnRlcnJ1cHQgdGltZS4KLSAqLwotI2RlZmluZSBSU19FVkVOVF9XUklURV9XQUtFVVAJMAotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCi0vKiBDb252ZXJzaW9uIHJvdXRpbmVzIHRvL2Zyb20gYnJnIHRpbWUgY29uc3RhbnRzIGZyb20vdG8gYml0cwotICogcGVyIHNlY29uZC4KLSAqLwotI2RlZmluZSBCUkdfVE9fQlBTKGJyZywgZnJlcSkgKChmcmVxKSAvIDIgLyAoKGJyZykgKyAyKSkKLSNkZWZpbmUgQlBTX1RPX0JSRyhicHMsIGZyZXEpICgoKChmcmVxKSArIChicHMpKSAvICgyICogKGJwcykpKSAtIDIpCi0KLS8qIFRoZSBaaWxvZyByZWdpc3RlciBzZXQgKi8KLQotI2RlZmluZQlGTEFHCTB4N2UKLQotLyogV3JpdGUgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlSMAkwCQkvKiBSZWdpc3RlciBzZWxlY3RzICovCi0jZGVmaW5lCVIxCTEKLSNkZWZpbmUJUjIJMgotI2RlZmluZQlSMwkzCi0jZGVmaW5lCVI0CTQKLSNkZWZpbmUJUjUJNQotI2RlZmluZQlSNgk2Ci0jZGVmaW5lCVI3CTcKLSNkZWZpbmUJUjgJOAotI2RlZmluZQlSOQk5Ci0jZGVmaW5lCVIxMAkxMAotI2RlZmluZQlSMTEJMTEKLSNkZWZpbmUJUjEyCTEyCi0jZGVmaW5lCVIxMwkxMwotI2RlZmluZQlSMTQJMTQKLSNkZWZpbmUJUjE1CTE1Ci0KLSNkZWZpbmUJTlVMTENPREUJMAkvKiBOdWxsIENvZGUgKi8KLSNkZWZpbmUJUE9JTlRfSElHSAkweDgJLyogU2VsZWN0IHVwcGVyIGhhbGYgb2YgcmVnaXN0ZXJzICovCi0jZGVmaW5lCVJFU19FWFRfSU5UCTB4MTAJLyogUmVzZXQgRXh0LiBTdGF0dXMgSW50ZXJydXB0cyAqLwotI2RlZmluZQlTRU5EX0FCT1JUCTB4MTgJLyogSERMQyBBYm9ydCAqLwotI2RlZmluZQlSRVNfUnhJTlRfRkMJMHgyMAkvKiBSZXNldCBSeElOVCBvbiBGaXJzdCBDaGFyYWN0ZXIgKi8KLSNkZWZpbmUJUkVTX1R4X1AJMHgyOAkvKiBSZXNldCBUeElOVCBQZW5kaW5nICovCi0jZGVmaW5lCUVSUl9SRVMJCTB4MzAJLyogRXJyb3IgUmVzZXQgKi8KLSNkZWZpbmUJUkVTX0hfSVVTCTB4MzgJLyogUmVzZXQgaGlnaGVzdCBJVVMgKi8KLQotI2RlZmluZQlSRVNfUnhfQ1JDCTB4NDAJLyogUmVzZXQgUnggQ1JDIENoZWNrZXIgKi8KLSNkZWZpbmUJUkVTX1R4X0NSQwkweDgwCS8qIFJlc2V0IFR4IENSQyBDaGVja2VyICovCi0jZGVmaW5lCVJFU19FT01fTAkweEMwCS8qIFJlc2V0IEVPTSBsYXRjaCAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAxICovCi0KLSNkZWZpbmUJRVhUX0lOVF9FTkFCCTB4MQkvKiBFeHQgSW50IEVuYWJsZSAqLwotI2RlZmluZQlUeElOVF9FTkFCCTB4MgkvKiBUeCBJbnQgRW5hYmxlICovCi0jZGVmaW5lCVBBUl9TUEVDCTB4NAkvKiBQYXJpdHkgaXMgc3BlY2lhbCBjb25kaXRpb24gKi8KLQotI2RlZmluZQlSeElOVF9ESVNBQgkwCS8qIFJ4IEludCBEaXNhYmxlICovCi0jZGVmaW5lCVJ4SU5UX0ZDRVJSCTB4OAkvKiBSeCBJbnQgb24gRmlyc3QgQ2hhcmFjdGVyIE9ubHkgb3IgRXJyb3IgKi8KLSNkZWZpbmUJSU5UX0FMTF9SeAkweDEwCS8qIEludCBvbiBhbGwgUnggQ2hhcmFjdGVycyBvciBlcnJvciAqLwotI2RlZmluZQlJTlRfRVJSX1J4CTB4MTgJLyogSW50IG9uIGVycm9yIG9ubHkgKi8KLQotI2RlZmluZQlXVF9SRFlfUlQJMHgyMAkvKiBXL1JlcSByZWZsZWN0cyByZWN2IGlmIDEsIHhtaXQgaWYgMCAqLwotI2RlZmluZQlXVF9GTl9SRFlGTgkweDQwCS8qIFcvUmVxIHBpbiBpcyBETUEgcmVxdWVzdCBpZiAxLCB3YWl0IGlmIDAgKi8KLSNkZWZpbmUJV1RfUkRZX0VOQUIJMHg4MAkvKiBFbmFibGUgVy9SZXEgcGluICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyICMyIChJbnRlcnJ1cHQgVmVjdG9yKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAzICovCi0KLSNkZWZpbmUJUnhFTkFCTEUJMHgxCS8qIFJ4IEVuYWJsZSAqLwotI2RlZmluZQlTWU5DX0xfSU5ICTB4MgkvKiBTeW5jIENoYXJhY3RlciBMb2FkIEluaGliaXQgKi8KLSNkZWZpbmUJQUREX1NNCQkweDQJLyogQWRkcmVzcyBTZWFyY2ggTW9kZSAoU0RMQykgKi8KLSNkZWZpbmUJUnhDUkNfRU5BQgkweDgJLyogUnggQ1JDIEVuYWJsZSAqLwotI2RlZmluZQlFTlRfSE0JCTB4MTAJLyogRW50ZXIgSHVudCBNb2RlICovCi0jZGVmaW5lCUFVVE9fRU5BQgkweDIwCS8qIEF1dG8gRW5hYmxlcyAqLwotI2RlZmluZQlSeDUJCTB4MAkvKiBSeCA1IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lCVJ4NwkJMHg0MAkvKiBSeCA3IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lCVJ4NgkJMHg4MAkvKiBSeCA2IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lCVJ4OAkJMHhjMAkvKiBSeCA4IEJpdHMvQ2hhcmFjdGVyICovCi0jZGVmaW5lIFJ4TkJJVFNfTUFTSwkweGMwCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDQgKi8KLQotI2RlZmluZQlQQVJfRU5BCQkweDEJLyogUGFyaXR5IEVuYWJsZSAqLwotI2RlZmluZQlQQVJfRVZFTgkweDIJLyogUGFyaXR5IEV2ZW4vT2RkKiAqLwotCi0jZGVmaW5lCVNZTkNfRU5BQgkwCS8qIFN5bmMgTW9kZXMgRW5hYmxlICovCi0jZGVmaW5lCVNCMQkJMHg0CS8qIDEgc3RvcCBiaXQvY2hhciAqLwotI2RlZmluZQlTQjE1CQkweDgJLyogMS41IHN0b3AgYml0cy9jaGFyICovCi0jZGVmaW5lCVNCMgkJMHhjCS8qIDIgc3RvcCBiaXRzL2NoYXIgKi8KLSNkZWZpbmUgU0JfTUFTSwkJMHhjCi0KLSNkZWZpbmUJTU9OU1lOQwkJMAkvKiA4IEJpdCBTeW5jIGNoYXJhY3RlciAqLwotI2RlZmluZQlCSVNZTkMJCTB4MTAJLyogMTYgYml0IHN5bmMgY2hhcmFjdGVyICovCi0jZGVmaW5lCVNETEMJCTB4MjAJLyogU0RMQyBNb2RlICgwMTExMTExMCBTeW5jIEZsYWcpICovCi0jZGVmaW5lCUVYVFNZTkMJCTB4MzAJLyogRXh0ZXJuYWwgU3luYyBNb2RlICovCi0KLSNkZWZpbmUJWDFDTEsJCTB4MAkvKiB4MSBjbG9jayBtb2RlICovCi0jZGVmaW5lCVgxNkNMSwkJMHg0MAkvKiB4MTYgY2xvY2sgbW9kZSAqLwotI2RlZmluZQlYMzJDTEsJCTB4ODAJLyogeDMyIGNsb2NrIG1vZGUgKi8KLSNkZWZpbmUJWDY0Q0xLCQkweEMwCS8qIHg2NCBjbG9jayBtb2RlICovCi0jZGVmaW5lIFhDTEtfTUFTSwkweEMwCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDUgKi8KLQotI2RlZmluZQlUeENSQ19FTkFCCTB4MQkvKiBUeCBDUkMgRW5hYmxlICovCi0jZGVmaW5lCVJUUwkJMHgyCS8qIFJUUyAqLwotI2RlZmluZQlTRExDX0NSQwkweDQJLyogU0RMQy9DUkMtMTYgKi8KLSNkZWZpbmUJVHhFTkFCCQkweDgJLyogVHggRW5hYmxlICovCi0jZGVmaW5lCVNORF9CUksJCTB4MTAJLyogU2VuZCBCcmVhayAqLwotI2RlZmluZQlUeDUJCTB4MAkvKiBUeCA1IGJpdHMgKG9yIGxlc3MpL2NoYXJhY3RlciAqLwotI2RlZmluZQlUeDcJCTB4MjAJLyogVHggNyBiaXRzL2NoYXJhY3RlciAqLwotI2RlZmluZQlUeDYJCTB4NDAJLyogVHggNiBiaXRzL2NoYXJhY3RlciAqLwotI2RlZmluZQlUeDgJCTB4NjAJLyogVHggOCBiaXRzL2NoYXJhY3RlciAqLwotI2RlZmluZSBUeE5CSVRTX01BU0sJMHg2MAotI2RlZmluZQlEVFIJCTB4ODAJLyogRFRSICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDYgKFN5bmMgYml0cyAwLTcvU0RMQyBBZGRyZXNzIEZpZWxkKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciA3IChTeW5jIGJpdHMgOC0xNS9TRExDIDAxMTExMTEwKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciA3JyAoU29tZSBlbmhhbmNlZCBmZWF0dXJlIGNvbnRyb2wpICovCi0jZGVmaW5lCUVORVhSRUFECTB4NDAJLyogRW5hYmxlIHJlYWQgb2Ygc29tZSB3cml0ZSByZWdpc3RlcnMgKi8KLQotLyogV3JpdGUgUmVnaXN0ZXIgOCAodHJhbnNtaXQgYnVmZmVyKSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciA5IChNYXN0ZXIgaW50ZXJydXB0IGNvbnRyb2wpICovCi0jZGVmaW5lCVZJUwkxCS8qIFZlY3RvciBJbmNsdWRlcyBTdGF0dXMgKi8KLSNkZWZpbmUJTlYJMgkvKiBObyBWZWN0b3IgKi8KLSNkZWZpbmUJRExDCTQJLyogRGlzYWJsZSBMb3dlciBDaGFpbiAqLwotI2RlZmluZQlNSUUJOAkvKiBNYXN0ZXIgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZQlTVEFUSEkJMHgxMAkvKiBTdGF0dXMgaGlnaCAqLwotI2RlZmluZQlOT1JFU0VUCTAJLyogTm8gcmVzZXQgb24gd3JpdGUgdG8gUjkgKi8KLSNkZWZpbmUJQ0hSQgkweDQwCS8qIFJlc2V0IGNoYW5uZWwgQiAqLwotI2RlZmluZQlDSFJBCTB4ODAJLyogUmVzZXQgY2hhbm5lbCBBICovCi0jZGVmaW5lCUZIV1JFUwkweGMwCS8qIEZvcmNlIGhhcmR3YXJlIHJlc2V0ICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDEwIChtaXNjIGNvbnRyb2wgYml0cykgKi8KLSNkZWZpbmUJQklUNgkxCS8qIDYgYml0LzhiaXQgc3luYyAqLwotI2RlZmluZQlMT09QTU9ERSAyCS8qIFNETEMgTG9vcCBtb2RlICovCi0jZGVmaW5lCUFCVU5ERVIJNAkvKiBBYm9ydC9mbGFnIG9uIFNETEMgeG1pdCB1bmRlcnJ1biAqLwotI2RlZmluZQlNQVJLSURMRSA4CS8qIE1hcmsvZmxhZyBvbiBpZGxlICovCi0jZGVmaW5lCUdBT1AJMHgxMAkvKiBHbyBhY3RpdmUgb24gcG9sbCAqLwotI2RlZmluZQlOUloJMAkvKiBOUlogbW9kZSAqLwotI2RlZmluZQlOUlpJCTB4MjAJLyogTlJaSSBtb2RlICovCi0jZGVmaW5lCUZNMQkweDQwCS8qIEZNMSAodHJhbnNpdGlvbiA9IDEpICovCi0jZGVmaW5lCUZNMAkweDYwCS8qIEZNMCAodHJhbnNpdGlvbiA9IDApICovCi0jZGVmaW5lCUNSQ1BTCTB4ODAJLyogQ1JDIFByZXNldCBJL08gKi8KLQotLyogV3JpdGUgUmVnaXN0ZXIgMTEgKENsb2NrIE1vZGUgY29udHJvbCkgKi8KLSNkZWZpbmUJVFJ4Q1hUCTAJLyogVFJ4QyA9IFh0YWwgb3V0cHV0ICovCi0jZGVmaW5lCVRSeENUQwkxCS8qIFRSeEMgPSBUcmFuc21pdCBjbG9jayAqLwotI2RlZmluZQlUUnhDQlIJMgkvKiBUUnhDID0gQlIgR2VuZXJhdG9yIE91dHB1dCAqLwotI2RlZmluZQlUUnhDRFAJMwkvKiBUUnhDID0gRFBMTCBvdXRwdXQgKi8KLSNkZWZpbmUJVFJ4Q09JCTQJLyogVFJ4QyBPL0kgKi8KLSNkZWZpbmUJVENSVHhDUAkwCS8qIFRyYW5zbWl0IGNsb2NrID0gUlR4QyBwaW4gKi8KLSNkZWZpbmUJVENUUnhDUAk4CS8qIFRyYW5zbWl0IGNsb2NrID0gVFJ4QyBwaW4gKi8KLSNkZWZpbmUJVENCUgkweDEwCS8qIFRyYW5zbWl0IGNsb2NrID0gQlIgR2VuZXJhdG9yIG91dHB1dCAqLwotI2RlZmluZQlUQ0RQTEwJMHgxOAkvKiBUcmFuc21pdCBjbG9jayA9IERQTEwgb3V0cHV0ICovCi0jZGVmaW5lCVJDUlR4Q1AJMAkvKiBSZWNlaXZlIGNsb2NrID0gUlR4QyBwaW4gKi8KLSNkZWZpbmUJUkNUUnhDUAkweDIwCS8qIFJlY2VpdmUgY2xvY2sgPSBUUnhDIHBpbiAqLwotI2RlZmluZQlSQ0JSCTB4NDAJLyogUmVjZWl2ZSBjbG9jayA9IEJSIEdlbmVyYXRvciBvdXRwdXQgKi8KLSNkZWZpbmUJUkNEUExMCTB4NjAJLyogUmVjZWl2ZSBjbG9jayA9IERQTEwgb3V0cHV0ICovCi0jZGVmaW5lCVJUeENYCTB4ODAJLyogUlR4QyBYdGFsL05vIFh0YWwgKi8KLQotLyogV3JpdGUgUmVnaXN0ZXIgMTIgKGxvd2VyIGJ5dGUgb2YgYmF1ZCByYXRlIGdlbmVyYXRvciB0aW1lIGNvbnN0YW50KSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAxMyAodXBwZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIHRpbWUgY29uc3RhbnQpICovCi0KLS8qIFdyaXRlIFJlZ2lzdGVyIDE0IChNaXNjIGNvbnRyb2wgYml0cykgKi8KLSNkZWZpbmUJQlJFTkFCTAkxCS8qIEJhdWQgcmF0ZSBnZW5lcmF0b3IgZW5hYmxlICovCi0jZGVmaW5lCUJSU1JDCTIJLyogQmF1ZCByYXRlIGdlbmVyYXRvciBzb3VyY2UgKi8KLSNkZWZpbmUJRFRSUkVRCTQJLyogRFRSL1JlcXVlc3QgZnVuY3Rpb24gKi8KLSNkZWZpbmUJQVVUT0VDSE8gOAkvKiBBdXRvIEVjaG8gKi8KLSNkZWZpbmUJTE9PUEJBSwkweDEwCS8qIExvY2FsIGxvb3BiYWNrICovCi0jZGVmaW5lCVNFQVJDSAkweDIwCS8qIEVudGVyIHNlYXJjaCBtb2RlICovCi0jZGVmaW5lCVJNQwkweDQwCS8qIFJlc2V0IG1pc3NpbmcgY2xvY2sgKi8KLSNkZWZpbmUJRElTRFBMTAkweDYwCS8qIERpc2FibGUgRFBMTCAqLwotI2RlZmluZQlTU0JSCTB4ODAJLyogU2V0IERQTEwgc291cmNlID0gQlIgZ2VuZXJhdG9yICovCi0jZGVmaW5lCVNTUlR4QwkweGEwCS8qIFNldCBEUExMIHNvdXJjZSA9IFJUeEMgKi8KLSNkZWZpbmUJU0ZNTQkweGMwCS8qIFNldCBGTSBtb2RlICovCi0jZGVmaW5lCVNOUlpJCTB4ZTAJLyogU2V0IE5SWkkgbW9kZSAqLwotCi0vKiBXcml0ZSBSZWdpc3RlciAxNSAoZXh0ZXJuYWwvc3RhdHVzIGludGVycnVwdCBjb250cm9sKSAqLwotI2RlZmluZQlFTjg1QzMwCTEJLyogRW5hYmxlIHNvbWUgODVjMzAtZW5oYW5jZWQgcmVnaXN0ZXJzICovCi0jZGVmaW5lCVpDSUUJMgkvKiBaZXJvIGNvdW50IElFICovCi0jZGVmaW5lCUVOU1RGSUZPIDQJLyogRW5hYmxlIHN0YXR1cyBGSUZPIChTRExDKSAqLwotI2RlZmluZQlEQ0RJRQk4CS8qIERDRCBJRSAqLwotI2RlZmluZQlTWU5DSUUJMHgxMAkvKiBTeW5jL2h1bnQgSUUgKi8KLSNkZWZpbmUJQ1RTSUUJMHgyMAkvKiBDVFMgSUUgKi8KLSNkZWZpbmUJVHhVSUUJMHg0MAkvKiBUeCBVbmRlcnJ1bi9FT00gSUUgKi8KLSNkZWZpbmUJQlJLSUUJMHg4MAkvKiBCcmVhay9BYm9ydCBJRSAqLwotCi0KLS8qIFJlYWQgUmVnaXN0ZXIgMCAqLwotI2RlZmluZQlSeF9DSF9BVgkweDEJLyogUnggQ2hhcmFjdGVyIEF2YWlsYWJsZSAqLwotI2RlZmluZQlaQ09VTlQJCTB4MgkvKiBaZXJvIGNvdW50ICovCi0jZGVmaW5lCVR4X0JVRl9FTVAJMHg0CS8qIFR4IEJ1ZmZlciBlbXB0eSAqLwotI2RlZmluZQlEQ0QJCTB4OAkvKiBEQ0QgKi8KLSNkZWZpbmUJU1lOQ19IVU5UCTB4MTAJLyogU3luYy9odW50ICovCi0jZGVmaW5lCUNUUwkJMHgyMAkvKiBDVFMgKi8KLSNkZWZpbmUJVHhFT00JCTB4NDAJLyogVHggdW5kZXJydW4gKi8KLSNkZWZpbmUJQlJLX0FCUlQJMHg4MAkvKiBCcmVhay9BYm9ydCAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDEgKi8KLSNkZWZpbmUJQUxMX1NOVAkJMHgxCS8qIEFsbCBzZW50ICovCi0vKiBSZXNpZHVlIERhdGEgZm9yIDggUnggYml0cy9jaGFyIHByb2dyYW1tZWQgKi8KLSNkZWZpbmUJUkVTMwkJMHg4CS8qIDAvMyAqLwotI2RlZmluZQlSRVM0CQkweDQJLyogMC80ICovCi0jZGVmaW5lCVJFUzUJCTB4YwkvKiAwLzUgKi8KLSNkZWZpbmUJUkVTNgkJMHgyCS8qIDAvNiAqLwotI2RlZmluZQlSRVM3CQkweGEJLyogMC83ICovCi0jZGVmaW5lCVJFUzgJCTB4NgkvKiAwLzggKi8KLSNkZWZpbmUJUkVTMTgJCTB4ZQkvKiAxLzggKi8KLSNkZWZpbmUJUkVTMjgJCTB4MAkvKiAyLzggKi8KLS8qIFNwZWNpYWwgUnggQ29uZGl0aW9uIEludGVycnVwdHMgKi8KLSNkZWZpbmUJUEFSX0VSUgkJMHgxMAkvKiBQYXJpdHkgZXJyb3IgKi8KLSNkZWZpbmUJUnhfT1ZSCQkweDIwCS8qIFJ4IE92ZXJydW4gRXJyb3IgKi8KLSNkZWZpbmUJRlJNX0VSUgkJMHg0MAkvKiBDUkMvRnJhbWluZyBFcnJvciAqLwotI2RlZmluZQlFTkRfRlIJCTB4ODAJLyogRW5kIG9mIEZyYW1lIChTRExDKSAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDIgKGNoYW5uZWwgYiBvbmx5KSAtIEludGVycnVwdCB2ZWN0b3IgKi8KLSNkZWZpbmUJQ0hCX1R4X0VNUFRZCTB4MDAKLSNkZWZpbmUJQ0hCX0VYVF9TVEFUCTB4MDIKLSNkZWZpbmUJQ0hCX1J4X0FWQUlMCTB4MDQKLSNkZWZpbmUJQ0hCX1NQRUNJQUwJMHgwNgotI2RlZmluZQlDSEFfVHhfRU1QVFkJMHgwOAotI2RlZmluZQlDSEFfRVhUX1NUQVQJMHgwYQotI2RlZmluZQlDSEFfUnhfQVZBSUwJMHgwYwotI2RlZmluZQlDSEFfU1BFQ0lBTAkweDBlCi0jZGVmaW5lCVNUQVRVU19NQVNLCTB4MDYKLQotLyogUmVhZCBSZWdpc3RlciAzIChpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlcikgY2ggYSBvbmx5ICovCi0jZGVmaW5lCUNIQkVYVAkweDEJCS8qIENoYW5uZWwgQiBFeHQvU3RhdCBJUCAqLwotI2RlZmluZQlDSEJUeElQCTB4MgkJLyogQ2hhbm5lbCBCIFR4IElQICovCi0jZGVmaW5lCUNIQlJ4SVAJMHg0CQkvKiBDaGFubmVsIEIgUnggSVAgKi8KLSNkZWZpbmUJQ0hBRVhUCTB4OAkJLyogQ2hhbm5lbCBBIEV4dC9TdGF0IElQICovCi0jZGVmaW5lCUNIQVR4SVAJMHgxMAkJLyogQ2hhbm5lbCBBIFR4IElQICovCi0jZGVmaW5lCUNIQVJ4SVAJMHgyMAkJLyogQ2hhbm5lbCBBIFJ4IElQICovCi0KLS8qIFJlYWQgUmVnaXN0ZXIgOCAocmVjZWl2ZSBkYXRhIHJlZ2lzdGVyKSAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDEwICAobWlzYyBzdGF0dXMgYml0cykgKi8KLSNkZWZpbmUJT05MT09QCTIJCS8qIE9uIGxvb3AgKi8KLSNkZWZpbmUJTE9PUFNFTkQgMHgxMAkJLyogTG9vcCBzZW5kaW5nICovCi0jZGVmaW5lCUNMSzJNSVMJMHg0MAkJLyogVHdvIGNsb2NrcyBtaXNzaW5nICovCi0jZGVmaW5lCUNMSzFNSVMJMHg4MAkJLyogT25lIGNsb2NrIG1pc3NpbmcgKi8KLQotLyogUmVhZCBSZWdpc3RlciAxMiAobG93ZXIgYnl0ZSBvZiBiYXVkIHJhdGUgZ2VuZXJhdG9yIGNvbnN0YW50KSAqLwotCi0vKiBSZWFkIFJlZ2lzdGVyIDEzICh1cHBlciBieXRlIG9mIGJhdWQgcmF0ZSBnZW5lcmF0b3IgY29uc3RhbnQpICovCi0KLS8qIFJlYWQgUmVnaXN0ZXIgMTUgKHZhbHVlIG9mIFdSIDE1KSAqLwotCi0vKiBNaXNjIG1hY3JvcyAqLwotI2RlZmluZSBaU19DTEVBUkVSUihjaGFubmVsKSAgICAod3JpdGVfenNyZWcoY2hhbm5lbCwgMCwgRVJSX1JFUykpCi0jZGVmaW5lIFpTX0NMRUFSRklGTyhjaGFubmVsKSAgIGRvIHsgdm9sYXRpbGUgdW5zaWduZWQgY2hhciBnYXJiYWdlOyBcCi0JCQkJICAgICBnYXJiYWdlID0gcmVhZF96c2RhdGEoY2hhbm5lbCk7IFwKLQkJCQkgICAgIGdhcmJhZ2UgPSByZWFkX3pzZGF0YShjaGFubmVsKTsgXAotCQkJCSAgICAgZ2FyYmFnZSA9IHJlYWRfenNkYXRhKGNoYW5uZWwpOyBcCi0JCQkJfSB3aGlsZSgwKQotCi0jZW5kaWYgLyogIShfTUFDU0VSSUFMX0gpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvbWVkaWFiYXkuYwppbmRleCA0YmU3MDllLi43YzE2YzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tZWRpYWJheS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL21lZGlhYmF5LmMKQEAgLTY0Miw3ICs2NDIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgbWVkaWFfYmF5X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgbWVkaWFfYmF5X2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgbWVkaWFfYmF5X2luZm8qIGJheTsKIAl1MzIgX19pb21lbSAqcmVnYmFzZTsKQEAgLTc5NywyMyArNzk3LDIwIEBACiAgKiBUaGVyZWZvcmUgd2UgZG8gaXQgYWxsIGJ5IHBvbGxpbmcgdGhlIG1lZGlhIGJheSBvbmNlIGVhY2ggdGljay4KICAqLwogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIG1lZGlhX2JheV9tYXRjaFtdID0KK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1lZGlhX2JheV9tYXRjaFtdID0KIHsKIAl7CiAJLm5hbWUJCT0gIm1lZGlhLWJheSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAogCS5jb21wYXRpYmxlCT0gImtleWxhcmdvLW1lZGlhLWJheSIsCiAJLmRhdGEJCT0gJmtleWxhcmdvX21iX29wcywKIAl9LAogCXsKIAkubmFtZQkJPSAibWVkaWEtYmF5IiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCiAJLmNvbXBhdGlibGUJPSAiaGVhdGhyb3ctbWVkaWEtYmF5IiwKIAkuZGF0YQkJPSAmaGVhdGhyb3dfbWJfb3BzLAogCX0sCiAJewogCS5uYW1lCQk9ICJtZWRpYS1iYXkiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKIAkuY29tcGF0aWJsZQk9ICJvaGFyZS1tZWRpYS1iYXkiLAogCS5kYXRhCQk9ICZvaGFyZV9tYl9vcHMsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX2FkdDc0NnguYwppbmRleCA1YmExOTBjLi5jOWNhMTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV9hZHQ3NDZ4LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fYWR0NzQ2eC5jCkBAIC0zMjgsOSArMzI4LDcgQEAKIAlzdHJ1Y3QgdGhlcm1vc3RhdCogdGggPSBhcmc7CiAKIAl3aGlsZSgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOwotCisJCXRyeV90b19mcmVlemUoKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUoMjAwMCk7CiAKICNpZm5kZWYgREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwppbmRleCBmZWI0ZTI0Li43MDNlMzE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fcG03Mi5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3BtNzIuYwpAQCAtMTIwLDYgKzEyMCw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KIAogI2luY2x1ZGUgInRoZXJtX3BtNzIuaCIKIApAQCAtMTk4Niw3ICsxOTg3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgZmN1X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgZmN1X29mX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJaW50IHJjOwogCkBAIC0yMDA5LDEyICsyMDEwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggZmN1X29mX21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZjdV9tYXRjaFtdID0gCiB7CiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gImZjdSIsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKQEAgLTIwMjIsNyArMjAyMSw3IEBACiBzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBmY3Vfb2ZfcGxhdGZvcm1fZHJpdmVyID0gCiB7CiAJLm5hbWUgCQk9ICJ0ZW1wZXJhdHVyZSIsCi0JLm1hdGNoX3RhYmxlCT0gZmN1X29mX21hdGNoLAorCS5tYXRjaF90YWJsZQk9IGZjdV9tYXRjaCwKIAkucHJvYmUJCT0gZmN1X29mX3Byb2JlLAogCS5yZW1vdmUJCT0gZmN1X29mX3JlbW92ZQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3RoZXJtX3dpbmR0dW5uZWwuYwppbmRleCA2MTQwMGYwLi5jYmI3MmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC90aGVybV93aW5kdHVubmVsLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdGhlcm1fd2luZHR1bm5lbC5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KIAogI2RlZmluZSBMT0dfVEVNUAkJMAkJCS8qIGNvbnRpbm91c2x5IGxvZyB0ZW1wZXJhdHVyZSAqLwogCkBAIC00NTAsNyArNDUxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQKLXRoZXJtX29mX3Byb2JlKCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2ggKQordGhlcm1fb2ZfcHJvYmUoIHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2ggKQogewogCXJldHVybiBpMmNfYWRkX2RyaXZlciggJmc0ZmFuX2RyaXZlciApOwogfQpAQCAtNDYxLDkgKzQ2Miw4IEBACiAJcmV0dXJuIGkyY19kZWxfZHJpdmVyKCAmZzRmYW5fZHJpdmVyICk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggdGhlcm1fb2ZfbWF0Y2hbXSA9IHt7CitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0aGVybV9vZl9tYXRjaFtdID0ge3sKIAkubmFtZQkJPSAiZmFuIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCiAJLmNvbXBhdGlibGUJPSAiYWRtMTAzMCIKICAgICB9LCB7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwppbmRleCBiOTQxZWUyLi40YTBhMGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCkBAIC02Myw2ICs2MywxMCBAQAogI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQzMyCisjaW5jbHVkZSA8YXNtL29wZW5fcGljLmg+CisjZW5kaWYKKwogLyogU29tZSBjb21waWxlIG9wdGlvbnMgKi8KICN1bmRlZiBTVVNQRU5EX1VTRVNfUE1VCiAjZGVmaW5lIERFQlVHX1NMRUVQCkBAIC0xNTEsMTAgKzE1NSwxMCBAQAogc3RhdGljIHU4IHBtdV9pbnRyX21hc2s7CiBzdGF0aWMgaW50IHBtdV92ZXJzaW9uOwogc3RhdGljIGludCBkcm9wX2ludGVycnVwdHM7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgb3B0aW9uX2xpZF93YWtldXAgPSAxOwogc3RhdGljIGludCBzbGVlcF9pbl9wcm9ncmVzczsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXN5bmNfcmVxX2xvY2tzOwogc3RhdGljIHVuc2lnbmVkIGludCBwbXVfaXJxX3N0YXRzWzExXTsKIApAQCAtMTY0LDcgKzE2OCw2IEBACiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BtdV9vcHRpb25zOwogc3RhdGljIGludCBvcHRpb25fc2VydmVyX21vZGU7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogaW50IHBtdV9iYXR0ZXJ5X2NvdW50OwogaW50IHBtdV9jdXJfYmF0dGVyeTsKIHVuc2lnbmVkIGludCBwbXVfcG93ZXJfZmxhZ3M7CkBAIC0xNzIsNyArMTc1LDYgQEAKIHN0YXRpYyBpbnQgcXVlcnlfYmF0dF90aW1lciA9IEJBVFRFUllfUE9MTElOR19DT1VOVDsKIHN0YXRpYyBzdHJ1Y3QgYWRiX3JlcXVlc3QgYmF0dF9yZXE7CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BtdV9iYXR0W1BNVV9NQVhfQkFUVEVSSUVTXTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfQURCSElEKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDX0JBQ0tMSUdIVCkKIGV4dGVybiBpbnQgZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0OwpAQCAtMjA2LDExICsyMDgsOSBAQAogc3RhdGljIGludCBwbXVfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwogc3RhdGljIGludCBwbXVfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwogI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiBzdGF0aWMgdm9pZCBwbXVfcGFzc19pbnRyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOwogc3RhdGljIGludCBwcm9jX2dldF9iYXR0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KIHN0YXRpYyBpbnQgcHJvY19yZWFkX29wdGlvbnMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKIHN0YXRpYyBpbnQgcHJvY193cml0ZV9vcHRpb25zKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLApAQCAtNDAzLDggKzQwMywxMiBAQAogCiAJYnJpZ2h0X3JlcV8xLmNvbXBsZXRlID0gMTsKIAlicmlnaHRfcmVxXzIuY29tcGxldGUgPSAxOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJYmF0dF9yZXEuY29tcGxldGUgPSAxOworCisjaWZkZWYgQ09ORklHX1BQQzMyCisJaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCkKKwkJb3BlbnBpY19zZXRfaXJxX3ByaW9yaXR5KHZpYXMtPmludHJzWzBdLmxpbmUsCisJCQkJCSBPUEVOUElDX1BSSU9SSVRZX0RFRkFVTFQgKyAxKTsKICNlbmRpZgogCiAJaWYgKHJlcXVlc3RfaXJxKHZpYXMtPmludHJzWzBdLmxpbmUsIHZpYV9wbXVfaW50ZXJydXB0LCAwLCAiVklBLVBNVSIsCkBAIC00NTgsNyArNDYyLDcgQEAKIAlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmcG11X2JhY2tsaWdodF9jb250cm9sbGVyLCBOVUxMLCAicG11Iik7CiAjZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QUEMzMgogICAJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNDAwLzI0MDAiKSB8fAogICAJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNTAwIikpIHsKIAkJaW50IG1iID0gcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfR0VUX01CX0lORk8sCkBAIC00ODYsMjAgKzQ5MCwxOSBAQAogCQkJCXBtdV9iYXR0ZXJpZXNbMV0uZmxhZ3MgfD0gUE1VX0JBVFRfVFlQRV9TTUFSVDsKIAkJfQogCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLworCiAJLyogQ3JlYXRlIC9wcm9jL3BtdSAqLwogCXByb2NfcG11X3Jvb3QgPSBwcm9jX21rZGlyKCJwbXUiLCBOVUxMKTsKIAlpZiAocHJvY19wbXVfcm9vdCkgewotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0JCWludCBpOworCQlsb25nIGk7CiAKIAkJZm9yIChpPTA7IGk8cG11X2JhdHRlcnlfY291bnQ7IGkrKykgewogCQkJY2hhciB0aXRsZVsxNl07Ci0JCQlzcHJpbnRmKHRpdGxlLCAiYmF0dGVyeV8lZCIsIGkpOworCQkJc3ByaW50Zih0aXRsZSwgImJhdHRlcnlfJWxkIiwgaSk7CiAJCQlwcm9jX3BtdV9iYXR0W2ldID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSh0aXRsZSwgMCwgcHJvY19wbXVfcm9vdCwKIAkJCQkJCXByb2NfZ2V0X2JhdHQsICh2b2lkICopaSk7CiAJCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAJCXByb2NfcG11X2luZm8gPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgMCwgcHJvY19wbXVfcm9vdCwKIAkJCQkJcHJvY19nZXRfaW5mbywgTlVMTCk7CkBAIC02MTksOCArNjIyLDYgQEAKIAlwbXVfd2FpdF9jb21wbGV0ZSgmcmVxKTsKIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0KIC8qIFRoaXMgbmV3IHZlcnNpb24gb2YgdGhlIGNvZGUgZm9yIDI0MDAvMzQwMC8zNTAwIHBvd2VyYm9va3MKICAqIGlzIGluc3BpcmVkIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIGluIGdrcmVsbG0tcG11CiAgKi8KQEAgLTgwMyw4ICs4MDQsNiBAQAogCQkJMiwgUE1VX1NNQVJUX0JBVFRFUllfU1RBVEUsIHBtdV9jdXJfYmF0dGVyeSsxKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCi0KIHN0YXRpYyBpbnQgX19wbWFjCiBwcm9jX2dldF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQpAQCAtODEzLDExICs4MTIsOSBAQAogCiAJcCArPSBzcHJpbnRmKHAsICJQTVUgZHJpdmVyIHZlcnNpb24gICAgIDogJWRcbiIsIFBNVV9EUklWRVJfVkVSU0lPTik7CiAJcCArPSBzcHJpbnRmKHAsICJQTVUgZmlybXdhcmUgdmVyc2lvbiAgIDogJTAyeFxuIiwgcG11X3ZlcnNpb24pOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJcCArPSBzcHJpbnRmKHAsICJBQyBQb3dlciAgICAgICAgICAgICAgIDogJWRcbiIsCiAJCSgocG11X3Bvd2VyX2ZsYWdzICYgUE1VX1BXUl9BQ19QUkVTRU5UKSAhPSAwKSk7CiAJcCArPSBzcHJpbnRmKHAsICJCYXR0ZXJ5IGNvdW50ICAgICAgICAgIDogJWRcbiIsIHBtdV9iYXR0ZXJ5X2NvdW50KTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiAJcmV0dXJuIHAgLSBwYWdlOwogfQpAQCAtODQ5LDEyICs4NDYsMTEgQEAKIAlyZXR1cm4gcCAtIHBhZ2U7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogc3RhdGljIGludCBfX3BtYWMKIHByb2NfZ2V0X2JhdHQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGJhdG51bSA9IChpbnQpZGF0YTsKKwlsb25nIGJhdG51bSA9IChsb25nKWRhdGE7CiAJY2hhciAqcCA9IHBhZ2U7CiAJCiAJcCArPSBzcHJpbnRmKHAsICJcbiIpOwpAQCAtODczLDcgKzg2OSw2IEBACiAKIAlyZXR1cm4gcCAtIHBhZ2U7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KIAogc3RhdGljIGludCBfX3BtYWMKIHByb2NfcmVhZF9vcHRpb25zKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLApAQCAtODgxLDExICs4NzYsMTEgQEAKIHsKIAljaGFyICpwID0gcGFnZTsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCAmJgogCSAgICBwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TTEVFUF9TVEFURSxOVUxMLDAsLTEpID49IDApCiAJCXAgKz0gc3ByaW50ZihwLCAibGlkX3dha2V1cD0lZFxuIiwgb3B0aW9uX2xpZF93YWtldXApOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYKIAlpZiAocG11X2tpbmQgPT0gUE1VX0tFWUxBUkdPX0JBU0VEKQogCQlwICs9IHNwcmludGYocCwgInNlcnZlcl9tb2RlPSVkXG4iLCBvcHRpb25fc2VydmVyX21vZGUpOwogCkBAIC05MjIsMTIgKzkxNywxMiBAQAogCSoodmFsKyspID0gMDsKIAl3aGlsZSgqdmFsID09ICcgJykKIAkJdmFsKys7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIAlpZiAocG11X2tpbmQgPT0gUE1VX0tFWUxBUkdPX0JBU0VEICYmCiAJICAgIHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NMRUVQX1NUQVRFLE5VTEwsMCwtMSkgPj0gMCkKIAkJaWYgKCFzdHJjbXAobGFiZWwsICJsaWRfd2FrZXVwIikpCiAJCQlvcHRpb25fbGlkX3dha2V1cCA9ICgoKnZhbCkgPT0gJzEnKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmCiAJaWYgKHBtdV9raW5kID09IFBNVV9LRVlMQVJHT19CQVNFRCAmJiAhc3RyY21wKGxhYmVsLCAic2VydmVyX21vZGUiKSkgewogCQlpbnQgbmV3X3ZhbHVlOwogCQluZXdfdmFsdWUgPSAoKCp2YWwpID09ICcxJyk7CkBAIC0xNDIyLDcgKzE0MTcsNiBAQAogCX0KIAkvKiBUaWNrIGludGVycnVwdCAqLwogCWVsc2UgaWYgKCgxIDw8IHBpcnEpICYgUE1VX0lOVF9USUNLKSB7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKIAkJLyogRW52aXJvbmVtZW50IG9yIHRpY2sgaW50ZXJydXB0LCBxdWVyeSBiYXR0ZXJpZXMgKi8KIAkJaWYgKHBtdV9iYXR0ZXJ5X2NvdW50KSB7CiAJCQlpZiAoKC0tcXVlcnlfYmF0dF90aW1lcikgPT0gMCkgewpAQCAtMTQzNyw3ICsxNDMxLDYgQEAKIAkJcG11X3Bhc3NfaW50cihkYXRhLCBsZW4pOwogCX0gZWxzZSB7CiAJICAgICAgIHBtdV9wYXNzX2ludHIoZGF0YSwgbGVuKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCX0KIAlnb3RvIG5leHQ7CiB9CkBAIC0yMDUyLDcgKzIwNDUsNyBAQAogCXJldHVybiAtMTsKIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAKIHN0YXRpYyBMSVNUX0hFQUQoc2xlZXBfbm90aWZpZXJzKTsKIApAQCAtMjcwNSw2ICsyNjk4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiAvKgogICogU3VwcG9ydCBmb3IgL2Rldi9wbXUgZGV2aWNlCiAgKi8KQEAgLTI4ODQsMTEgKzI4NzksMTEgQEAKIHBtdV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCiAJCSAgICAgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQogewotCXN0cnVjdCBwbXVfcHJpdmF0ZSAqcHAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJX191MzIgX191c2VyICphcmdwID0gKF9fdTMyIF9fdXNlciAqKWFyZzsKLQlpbnQgZXJyb3I7CisJaW50IGVycm9yID0gLUVJTlZBTDsKIAogCXN3aXRjaCAoY21kKSB7CisjaWZkZWYgQ09ORklHX1BNCiAJY2FzZSBQTVVfSU9DX1NMRUVQOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTI5MTAsMTIgKzI5MDUsMTMgQEAKIAkJCWVycm9yID0gLUVOT1NZUzsKIAkJfQogCQlzbGVlcF9pbl9wcm9ncmVzcyA9IDA7Ci0JCXJldHVybiBlcnJvcjsKKwkJYnJlYWs7CiAJY2FzZSBQTVVfSU9DX0NBTl9TTEVFUDoKIAkJaWYgKHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NMRUVQX1NUQVRFLE5VTEwsMCwtMSkgPCAwKQogCQkJcmV0dXJuIHB1dF91c2VyKDAsIGFyZ3ApOwogCQllbHNlCiAJCQlyZXR1cm4gcHV0X3VzZXIoMSwgYXJncCk7CisjZW5kaWYgLyogQ09ORklHX1BNICovCiAKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKIAkvKiBCYWNrbGlnaHQgc2hvdWxkIGhhdmUgaXRzIG93biBkZXZpY2Ugb3IgZ28gdmlhCkBAIC0yOTM2LDExICsyOTMyLDEzIEBACiAJCWVycm9yID0gZ2V0X3VzZXIodmFsdWUsIGFyZ3ApOwogCQlpZiAoIWVycm9yKQogCQkJZXJyb3IgPSBzZXRfYmFja2xpZ2h0X2xldmVsKHZhbHVlKTsKLQkJcmV0dXJuIGVycm9yOworCQlicmVhazsKIAl9CiAjaWZkZWYgQ09ORklHX0lOUFVUX0FEQkhJRAogCWNhc2UgUE1VX0lPQ19HUkFCX0JBQ0tMSUdIVDogeworCQlzdHJ1Y3QgcG11X3ByaXZhdGUgKnBwID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJCWlmIChwcC0+YmFja2xpZ2h0X2xvY2tlcikKIAkJCXJldHVybiAwOwogCQlwcC0+YmFja2xpZ2h0X2xvY2tlciA9IDE7CkBAIC0yOTU2LDcgKzI5NTQsNyBAQAogCWNhc2UgUE1VX0lPQ19IQVNfQURCOgogCQlyZXR1cm4gcHV0X3VzZXIocG11X2hhc19hZGIsIGFyZ3ApOwogCX0KLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBtdV9kZXZpY2VfZm9wcyBfX3BtYWNkYXRhID0gewpAQCAtMjk3MiwxNCArMjk3MCwxNiBAQAogCVBNVV9NSU5PUiwgInBtdSIsICZwbXVfZGV2aWNlX2ZvcHMKIH07CiAKLXZvaWQgcG11X2RldmljZV9pbml0KHZvaWQpCitzdGF0aWMgaW50IHBtdV9kZXZpY2VfaW5pdCh2b2lkKQogewogCWlmICghdmlhKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCWlmIChtaXNjX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAidmlhLXBtdTogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlLlxuIik7CisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KK2RldmljZV9pbml0Y2FsbChwbXVfZGV2aWNlX2luaXQpOworCiAKICNpZmRlZiBERUJVR19TTEVFUAogc3RhdGljIGlubGluZSB2b2lkICBfX3BtYWMKQEAgLTMxNDcsMTIgKzMxNDcsMTIgQEAKIEVYUE9SVF9TWU1CT0wocG11X2kyY19zdGRzdWJfd3JpdGUpOwogRVhQT1JUX1NZTUJPTChwbXVfaTJjX3NpbXBsZV9yZWFkKTsKIEVYUE9SVF9TWU1CT0wocG11X2kyY19zaW1wbGVfd3JpdGUpOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiBFWFBPUlRfU1lNQk9MKHBtdV9yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcik7CiBFWFBPUlRfU1lNQk9MKHBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKTsKIEVYUE9SVF9TWU1CT0wocG11X2VuYWJsZV9pcmxlZCk7CiBFWFBPUlRfU1lNQk9MKHBtdV9iYXR0ZXJ5X2NvdW50KTsKIEVYUE9SVF9TWU1CT0wocG11X2JhdHRlcmllcyk7CiBFWFBPUlRfU1lNQk9MKHBtdV9wb3dlcl9mbGFncyk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2EvbWNhLWxlZ2FjeS5jIGIvZHJpdmVycy9tY2EvbWNhLWxlZ2FjeS5jCmluZGV4IGFmNTYzMTMuLjBjN2JmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNhL21jYS1sZWdhY3kuYworKysgYi9kcml2ZXJzL21jYS9tY2EtbGVnYWN5LmMKQEAgLTE4MCw3ICsxODAsNiBAQAogCiAJcmV0dXJuIGluZm8ubWNhX2RldjsKIH0KLUVYUE9SVF9TWU1CT0wobWNhX2ZpbmRfZGV2aWNlX2J5X3Nsb3QpOwogCiAvKioKICAqCW1jYV9yZWFkX3N0b3JlZF9wb3MgLSByZWFkIFBPUyByZWdpc3RlciBmcm9tIGJvb3QgZGF0YQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCmluZGV4IDBjMWI4NTIuLjc4NTgwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYworKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKQEAgLTYzLDYgKzYzLDcgQEAKIAl1bnNpZ25lZCBucl9wcmlvcml0eV9ncm91cHM7CiAJc3RydWN0IGxpc3RfaGVhZCBwcmlvcml0eV9ncm91cHM7CiAJdW5zaWduZWQgcGdfaW5pdF9yZXF1aXJlZDsJLyogcGdfaW5pdCBuZWVkcyBjYWxsaW5nPyAqLworCXVuc2lnbmVkIHBnX2luaXRfaW5fcHJvZ3Jlc3M7CS8qIE9ubHkgb25lIHBnX2luaXQgYWxsb3dlZCBhdCBvbmNlICovCiAKIAl1bnNpZ25lZCBucl92YWxpZF9wYXRoczsJLyogVG90YWwgbnVtYmVyIG9mIHVzYWJsZSBwYXRocyAqLwogCXN0cnVjdCBwZ3BhdGggKmN1cnJlbnRfcGdwYXRoOwpAQCAtNzIsNyArNzMsNyBAQAogCiAJdW5zaWduZWQgcXVldWVfaW87CQkvKiBNdXN0IHdlIHF1ZXVlIGFsbCBJL08/ICovCiAJdW5zaWduZWQgcXVldWVfaWZfbm9fcGF0aDsJLyogUXVldWUgSS9PIGlmIGxhc3QgcGF0aCBmYWlscz8gKi8KLQl1bnNpZ25lZCBzdXNwZW5kZWQ7CQkvKiBIYXMgZG0gY29yZSBzdXNwZW5kZWQgb3VyIEkvTz8gKi8KKwl1bnNpZ25lZCBzYXZlZF9xdWV1ZV9pZl9ub19wYXRoOy8qIFNhdmVkIHN0YXRlIGR1cmluZyBzdXNwZW5zaW9uICovCiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHJvY2Vzc19xdWV1ZWRfaW9zOwogCXN0cnVjdCBiaW9fbGlzdCBxdWV1ZWRfaW9zOwpAQCAtMzA0LDExICszMDUsMTIgQEAKIAkJbS0+cXVldWVfc2l6ZS0tOwogCiAJaWYgKChwZ3BhdGggJiYgbS0+cXVldWVfaW8pIHx8Ci0JICAgICghcGdwYXRoICYmIG0tPnF1ZXVlX2lmX25vX3BhdGggJiYgIW0tPnN1c3BlbmRlZCkpIHsKKwkgICAgKCFwZ3BhdGggJiYgbS0+cXVldWVfaWZfbm9fcGF0aCkpIHsKIAkJLyogUXVldWUgZm9yIHRoZSBkYWVtb24gdG8gcmVzdWJtaXQgKi8KIAkJYmlvX2xpc3RfYWRkKCZtLT5xdWV1ZWRfaW9zLCBiaW8pOwogCQltLT5xdWV1ZV9zaXplKys7Ci0JCWlmIChtLT5wZ19pbml0X3JlcXVpcmVkIHx8ICFtLT5xdWV1ZV9pbykKKwkJaWYgKChtLT5wZ19pbml0X3JlcXVpcmVkICYmICFtLT5wZ19pbml0X2luX3Byb2dyZXNzKSB8fAorCQkgICAgIW0tPnF1ZXVlX2lvKQogCQkJcXVldWVfd29yayhrbXVsdGlwYXRoZCwgJm0tPnByb2Nlc3NfcXVldWVkX2lvcyk7CiAJCXBncGF0aCA9IE5VTEw7CiAJCXIgPSAwOwpAQCAtMzMzLDggKzMzNSw5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwogCisJbS0+c2F2ZWRfcXVldWVfaWZfbm9fcGF0aCA9IG0tPnF1ZXVlX2lmX25vX3BhdGg7CiAJbS0+cXVldWVfaWZfbm9fcGF0aCA9IHF1ZXVlX2lmX25vX3BhdGg7Ci0JaWYgKCFtLT5xdWV1ZV9pZl9ub19wYXRoKQorCWlmICghbS0+cXVldWVfaWZfbm9fcGF0aCAmJiBtLT5xdWV1ZV9zaXplKQogCQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKQEAgLTM3OSwyNSArMzgyLDMxIEBACiB7CiAJc3RydWN0IG11bHRpcGF0aCAqbSA9IChzdHJ1Y3QgbXVsdGlwYXRoICopIGRhdGE7CiAJc3RydWN0IGh3X2hhbmRsZXIgKmh3aCA9ICZtLT5od19oYW5kbGVyOwotCXN0cnVjdCBwZ3BhdGggKnBncGF0aDsKLQl1bnNpZ25lZCBpbml0X3JlcXVpcmVkLCBtdXN0X3F1ZXVlID0gMDsKKwlzdHJ1Y3QgcGdwYXRoICpwZ3BhdGggPSBOVUxMOworCXVuc2lnbmVkIGluaXRfcmVxdWlyZWQgPSAwLCBtdXN0X3F1ZXVlID0gMTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKIAorCWlmICghbS0+cXVldWVfc2l6ZSkKKwkJZ290byBvdXQ7CisKIAlpZiAoIW0tPmN1cnJlbnRfcGdwYXRoKQogCQlfX2Nob29zZV9wZ3BhdGgobSk7CiAKIAlwZ3BhdGggPSBtLT5jdXJyZW50X3BncGF0aDsKIAotCWlmICgocGdwYXRoICYmIG0tPnF1ZXVlX2lvKSB8fAotCSAgICAoIXBncGF0aCAmJiBtLT5xdWV1ZV9pZl9ub19wYXRoICYmICFtLT5zdXNwZW5kZWQpKQotCQltdXN0X3F1ZXVlID0gMTsKKwlpZiAoKHBncGF0aCAmJiAhbS0+cXVldWVfaW8pIHx8CisJICAgICghcGdwYXRoICYmICFtLT5xdWV1ZV9pZl9ub19wYXRoKSkKKwkJbXVzdF9xdWV1ZSA9IDA7CiAKLQlpbml0X3JlcXVpcmVkID0gbS0+cGdfaW5pdF9yZXF1aXJlZDsKLQlpZiAoaW5pdF9yZXF1aXJlZCkKKwlpZiAobS0+cGdfaW5pdF9yZXF1aXJlZCAmJiAhbS0+cGdfaW5pdF9pbl9wcm9ncmVzcykgewogCQltLT5wZ19pbml0X3JlcXVpcmVkID0gMDsKKwkJbS0+cGdfaW5pdF9pbl9wcm9ncmVzcyA9IDE7CisJCWluaXRfcmVxdWlyZWQgPSAxOworCX0KIAorb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm0tPmxvY2ssIGZsYWdzKTsKIAogCWlmIChpbml0X3JlcXVpcmVkKQpAQCAtNzUyLDYgKzc2MSw4IEBACiBzdGF0aWMgdm9pZCBtdWx0aXBhdGhfZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBtdWx0aXBhdGggKm0gPSAoc3RydWN0IG11bHRpcGF0aCAqKSB0aS0+cHJpdmF0ZTsKKworCWZsdXNoX3dvcmtxdWV1ZShrbXVsdGlwYXRoZCk7CiAJZnJlZV9tdWx0aXBhdGgobSk7CiB9CiAKQEAgLTc2NSw2ICs3NzYsOSBAQAogCXN0cnVjdCBtcGF0aF9pbyAqbXBpbzsKIAlzdHJ1Y3QgbXVsdGlwYXRoICptID0gKHN0cnVjdCBtdWx0aXBhdGggKikgdGktPnByaXZhdGU7CiAKKwlpZiAoYmlvX2JhcnJpZXIoYmlvKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJbXBpbyA9IG1lbXBvb2xfYWxsb2MobS0+bXBpb19wb29sLCBHRlBfTk9JTyk7CiAJZG1fYmlvX3JlY29yZCgmbXBpby0+ZGV0YWlscywgYmlvKTsKIApAQCAtODM3LDcgKzg1MSw3IEBACiAJcGdwYXRoLT5wYXRoLmlzX2FjdGl2ZSA9IDE7CiAKIAltLT5jdXJyZW50X3BncGF0aCA9IE5VTEw7Ci0JaWYgKCFtLT5ucl92YWxpZF9wYXRocysrKQorCWlmICghbS0+bnJfdmFsaWRfcGF0aHMrKyAmJiBtLT5xdWV1ZV9zaXplKQogCQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zKTsKIAogCXF1ZXVlX3dvcmsoa211bHRpcGF0aGQsICZtLT50cmlnZ2VyX2V2ZW50KTsKQEAgLTk2MywxMiArOTc3LDEzIEBACiAJCWJ5cGFzc19wZyhtLCBwZywgMSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbS0+bG9jaywgZmxhZ3MpOwotCWlmICghZXJyX2ZsYWdzKQotCQltLT5xdWV1ZV9pbyA9IDA7Ci0JZWxzZSB7CisJaWYgKGVycl9mbGFncykgewogCQltLT5jdXJyZW50X3BncGF0aCA9IE5VTEw7CiAJCW0tPmN1cnJlbnRfcGcgPSBOVUxMOwotCX0KKwl9IGVsc2UgaWYgKCFtLT5wZ19pbml0X3JlcXVpcmVkKQorCQltLT5xdWV1ZV9pbyA9IDA7CisKKwltLT5wZ19pbml0X2luX3Byb2dyZXNzID0gMDsKIAlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CiB9CkBAIC05ODgsOSArMTAwMywxMiBAQAogCWlmICgoZXJyb3IgPT0gLUVXT1VMREJMT0NLKSAmJiBiaW9fcndfYWhlYWQoYmlvKSkKIAkJcmV0dXJuIGVycm9yOwogCisJaWYgKGVycm9yID09IC1FT1BOT1RTVVBQKQorCQlyZXR1cm4gZXJyb3I7CisKIAlzcGluX2xvY2soJm0tPmxvY2spOwogCWlmICghbS0+bnJfdmFsaWRfcGF0aHMpIHsKLQkJaWYgKCFtLT5xdWV1ZV9pZl9ub19wYXRoIHx8IG0tPnN1c3BlbmRlZCkgeworCQlpZiAoIW0tPnF1ZXVlX2lmX25vX3BhdGgpIHsKIAkJCXNwaW5fdW5sb2NrKCZtLT5sb2NrKTsKIAkJCXJldHVybiAtRUlPOwogCQl9IGVsc2UgewpAQCAtMTA1MSwyNyArMTA2OSwyNyBAQAogCiAvKgogICogU3VzcGVuZCBjYW4ndCBjb21wbGV0ZSB1bnRpbCBhbGwgdGhlIEkvTyBpcyBwcm9jZXNzZWQgc28gaWYKLSAqIHRoZSBsYXN0IHBhdGggZmFpbGVkIHdlIHdpbGwgbm93IGVycm9yIGFueSBxdWV1ZWQgSS9PLgorICogdGhlIGxhc3QgcGF0aCBmYWlscyB3ZSBtdXN0IGVycm9yIGFueSByZW1haW5pbmcgSS9PLgorICogTm90ZSB0aGF0IGlmIHRoZSBmcmVlemVfYmRldiBmYWlscyB3aGlsZSBzdXNwZW5kaW5nLCB0aGUKKyAqIHF1ZXVlX2lmX25vX3BhdGggc3RhdGUgaXMgbG9zdCAtIHVzZXJzcGFjZSBzaG91bGQgcmVzZXQgaXQuCiAgKi8KIHN0YXRpYyB2b2lkIG11bHRpcGF0aF9wcmVzdXNwZW5kKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBtdWx0aXBhdGggKm0gPSAoc3RydWN0IG11bHRpcGF0aCAqKSB0aS0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm0tPmxvY2ssIGZsYWdzKTsKLQltLT5zdXNwZW5kZWQgPSAxOwotCWlmIChtLT5xdWV1ZV9pZl9ub19wYXRoKQotCQlxdWV1ZV93b3JrKGttdWx0aXBhdGhkLCAmbS0+cHJvY2Vzc19xdWV1ZWRfaW9zKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CisJcXVldWVfaWZfbm9fcGF0aChtLCAwKTsKIH0KIAorLyoKKyAqIFJlc3RvcmUgdGhlIHF1ZXVlX2lmX25vX3BhdGggc2V0dGluZy4KKyAqLwogc3RhdGljIHZvaWQgbXVsdGlwYXRoX3Jlc3VtZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlzdHJ1Y3QgbXVsdGlwYXRoICptID0gKHN0cnVjdCBtdWx0aXBhdGggKikgdGktPnByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtLT5sb2NrLCBmbGFncyk7Ci0JbS0+c3VzcGVuZGVkID0gMDsKKwltLT5xdWV1ZV9pZl9ub19wYXRoID0gbS0+c2F2ZWRfcXVldWVfaWZfbm9fcGF0aDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtLT5sb2NrLCBmbGFncyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZDEuYyBiL2RyaXZlcnMvbWQvZG0tcmFpZDEuYwppbmRleCA2ZTNjZjdlLi4xMjAzMWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQxLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkMS5jCkBAIC0xMDYwLDYgKzEwNjAsNyBAQAogCX0KIAogCXRpLT5wcml2YXRlID0gbXM7CisgCXRpLT5zcGxpdF9pbyA9IG1zLT5yaC5yZWdpb25fc2l6ZTsKIAogCXIgPSBrY29weWRfY2xpZW50X2NyZWF0ZShETV9JT19QQUdFUywgJm1zLT5rY29weWRfY2xpZW50KTsKIAlpZiAocikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmMgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwppbmRleCA3ZTY5MWFiLi5hYjU0Zjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwpAQCAtNzc3LDcgKzc3Nyw3IEBACiAKIAkvKiBGdWxsIHNuYXBzaG90cyBhcmUgbm90IHVzYWJsZSAqLwogCWlmICghcy0+dmFsaWQpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU87CiAKIAkvKgogCSAqIFdyaXRlIHRvIHNuYXBzaG90IC0gaGlnaGVyIGxldmVsIHRha2VzIGNhcmUgb2YgUlcvUk8KQEAgLTkzMSw2ICs5MzEsMTAgQEAKIAkJaWYgKCFzbmFwLT52YWxpZCkKIAkJCWNvbnRpbnVlOwogCisJCS8qIE5vdGhpbmcgdG8gZG8gaWYgd3JpdGluZyBiZXlvbmQgZW5kIG9mIHNuYXBzaG90ICovCisJCWlmIChiaW8tPmJpX3NlY3RvciA+PSBkbV90YWJsZV9nZXRfc2l6ZShzbmFwLT50YWJsZSkpCisJCQljb250aW51ZTsKKwogCQlkb3duX3dyaXRlKCZzbmFwLT5sb2NrKTsKIAogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IDE4ZTliOTkuLmE1YTRjMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTk0Myw2ICs5NDMsNyBAQAogRVhQT1JUX1NZTUJPTChkbV9nZXRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0woZG1fcHV0X2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2V2ZW50KTsKK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X3NpemUpOwogRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfbW9kZSk7CiBFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX3B1dCk7CiBFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggZjZiMDM5NS4uNTRmYWJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCS8qIGVycm9yIHRoZSBpbyBhbmQgYmFpbCBvdXQgKi8KIAkJc3RydWN0IGRtX2lvICppbyA9IHRpby0+aW87CiAJCWZyZWVfdGlvKHRpby0+aW8tPm1kLCB0aW8pOwotCQlkZWNfcGVuZGluZyhpbywgLUVJTyk7CisJCWRlY19wZW5kaW5nKGlvLCByKTsKIAkJYmlvX3B1dChjbG9uZSk7CiAJfQogfQpAQCAtOTY2LDIzICs5NjYsMjAgQEAKICAqLwogaW50IGRtX3N3YXBfdGFibGUoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kLCBzdHJ1Y3QgZG1fdGFibGUgKnRhYmxlKQogewotCWludCByOworCWludCByID0gLUVJTlZBTDsKIAogCWRvd25fd3JpdGUoJm1kLT5sb2NrKTsKIAogCS8qIGRldmljZSBtdXN0IGJlIHN1c3BlbmRlZCAqLwotCWlmICghdGVzdF9iaXQoRE1GX1NVU1BFTkRFRCwgJm1kLT5mbGFncykpIHsKLQkJdXBfd3JpdGUoJm1kLT5sb2NrKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9CisJaWYgKCF0ZXN0X2JpdChETUZfU1VTUEVOREVELCAmbWQtPmZsYWdzKSkKKwkJZ290byBvdXQ7CiAKIAlfX3VuYmluZChtZCk7CiAJciA9IF9fYmluZChtZCwgdGFibGUpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKIAorb3V0OgogCXVwX3dyaXRlKCZtZC0+bG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHI7CiB9CiAKIC8qCkBAIC0xMDU1LDE0ICsxMDUyLDE3IEBACiAJaWYgKHRlc3RfYml0KERNRl9CTE9DS19JTywgJm1kLT5mbGFncykpCiAJCWdvdG8gb3V0X3JlYWRfdW5sb2NrOwogCi0JZXJyb3IgPSBfX2xvY2tfZnMobWQpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfcmVhZF91bmxvY2s7Ci0KIAltYXAgPSBkbV9nZXRfdGFibGUobWQpOwogCWlmIChtYXApCisJCS8qIFRoaXMgZG9lcyBub3QgZ2V0IHJldmVydGVkIGlmIHRoZXJlJ3MgYW4gZXJyb3IgbGF0ZXIuICovCiAJCWRtX3RhYmxlX3ByZXN1c3BlbmRfdGFyZ2V0cyhtYXApOwogCisJZXJyb3IgPSBfX2xvY2tfZnMobWQpOworCWlmIChlcnJvcikgeworCQlkbV90YWJsZV9wdXQobWFwKTsKKwkJZ290byBvdXRfcmVhZF91bmxvY2s7CisJfQorCiAJdXBfcmVhZCgmbWQtPmxvY2spOwogCiAJLyoKQEAgLTExMjEsNyArMTEyMSw2IEBACiAJcmV0dXJuIDA7CiAKIG91dF91bmZyZWV6ZToKLQkvKiBGSVhNRSBVbmRvIGRtX3RhYmxlX3ByZXN1c3BlbmRfdGFyZ2V0cyAqLwogCV9fdW5sb2NrX2ZzKG1kKTsKIAljbGVhcl9iaXQoRE1GX0JMT0NLX0lPLCAmbWQtPmZsYWdzKTsKIG91dF93cml0ZV91bmxvY2s6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL21kLmMgYi9kcml2ZXJzL21kL21kLmMKaW5kZXggMGM2YjViNi4uNGEwYzU3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC5jCisrKyBiL2RyaXZlcnMvbWQvbWQuYwpAQCAtMzM4LDYgKzMzOCw3IEBACiAKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmRldi0+bWRkZXYtPnBlbmRpbmdfd3JpdGVzKSkKIAkJd2FrZV91cCgmcmRldi0+bWRkZXYtPnNiX3dhaXQpOworCWJpb19wdXQoYmlvKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk3Niw4ICsyOTc3LDcgQEAKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodGhyZWFkLT53cXVldWUsCiAJCQkJCQkgdGVzdF9iaXQoVEhSRUFEX1dBS0VVUCwgJnRocmVhZC0+ZmxhZ3MpLAogCQkJCQkJIHRocmVhZC0+dGltZW91dCk7Ci0JCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJY2xlYXJfYml0KFRIUkVBRF9XQUtFVVAsICZ0aHJlYWQtPmZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1jb21tb24uYwppbmRleCA4NGE0OWQyLi5hYjdhMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1jb21tb24uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGlyLWNvbW1vbi5jLHYgMS44IDIwMDUvMDIvMjIgMTI6Mjg6NDAga3JheGVsIEV4cCAkCisgKiAkSWQ6IGlyLWNvbW1vbi5jLHYgMS4xMSAyMDA1LzA3LzA3IDE0OjQ0OjQzIG1jaGVoYWIgRXhwICQKICAqCiAgKiBzb21lIGNvbW1vbiBzdHJ1Y3RzIGFuZCBmdW5jdGlvbnMgdG8gaGFuZGxlIGluZnJhcmVkIHJlbW90ZXMgdmlhCiAgKiBpbnB1dCBsYXllciAuLi4KQEAgLTQ2LDc5ICs0Niw0OSBAQAogLyogc2VlIGh0dHA6Ly91c2Vycy5wYW5kb3JhLmJlL25lbnlhL2VsZWN0cm9uaWNzL3JjNS9jb2RlczAwLmh0bSAqLwogLyogdXNlZCBieSBvbGQgKGJsYWNrKSBIYXVwcGF1Z2UgcmVtb3RlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcmM1X3R2W0lSX0tFWVRBQl9TSVpFXSA9IHsKLQlbIDB4MDAgXSA9IEtFWV9LUDAsICAgICAgICAgICAgIC8vIDAKLQlbIDB4MDEgXSA9IEtFWV9LUDEsICAgICAgICAgICAgIC8vIDEKLQlbIDB4MDIgXSA9IEtFWV9LUDIsICAgICAgICAgICAgIC8vIDIKLQlbIDB4MDMgXSA9IEtFWV9LUDMsICAgICAgICAgICAgIC8vIDMKLQlbIDB4MDQgXSA9IEtFWV9LUDQsICAgICAgICAgICAgIC8vIDQKLQlbIDB4MDUgXSA9IEtFWV9LUDUsICAgICAgICAgICAgIC8vIDUKLQlbIDB4MDYgXSA9IEtFWV9LUDYsICAgICAgICAgICAgIC8vIDYKLQlbIDB4MDcgXSA9IEtFWV9LUDcsICAgICAgICAgICAgIC8vIDcKLQlbIDB4MDggXSA9IEtFWV9LUDgsICAgICAgICAgICAgIC8vIDgKLQlbIDB4MDkgXSA9IEtFWV9LUDksICAgICAgICAgICAgIC8vIDkKKwkvKiBLZXlzIDAgdG8gOSAqLworCVsgMHgwMCBdID0gS0VZX0tQMCwKKwlbIDB4MDEgXSA9IEtFWV9LUDEsCisJWyAweDAyIF0gPSBLRVlfS1AyLAorCVsgMHgwMyBdID0gS0VZX0tQMywKKwlbIDB4MDQgXSA9IEtFWV9LUDQsCisJWyAweDA1IF0gPSBLRVlfS1A1LAorCVsgMHgwNiBdID0gS0VZX0tQNiwKKwlbIDB4MDcgXSA9IEtFWV9LUDcsCisJWyAweDA4IF0gPSBLRVlfS1A4LAorCVsgMHgwOSBdID0gS0VZX0tQOSwKIAotCVsgMHgwYiBdID0gS0VZX0NIQU5ORUwsICAgICAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gKGphcGFuOiAxMSkKLQlbIDB4MGMgXSA9IEtFWV9QT1dFUiwgICAgICAgICAgIC8vIHN0YW5kYnkKLQlbIDB4MGQgXSA9IEtFWV9NVVRFLCAgICAgICAgICAgIC8vIG11dGUgLyBkZW11dGUKLQlbIDB4MGYgXSA9IEtFWV9UViwgICAgICAgICAgICAgIC8vIGRpc3BsYXkKLQlbIDB4MTAgXSA9IEtFWV9WT0xVTUVVUCwgICAgICAgIC8vIHZvbHVtZSArCi0JWyAweDExIF0gPSBLRVlfVk9MVU1FRE9XTiwgICAgICAvLyB2b2x1bWUgLQotCVsgMHgxMiBdID0gS0VZX0JSSUdIVE5FU1NVUCwgICAgLy8gYnJpZ2h0bmVzcyArCi0JWyAweDEzIF0gPSBLRVlfQlJJR0hUTkVTU0RPV04sICAvLyBicmlnaHRuZXNzIC0KLQlbIDB4MWUgXSA9IEtFWV9TRUFSQ0gsICAgICAgICAgIC8vIHNlYXJjaCArCi0JWyAweDIwIF0gPSBLRVlfQ0hBTk5FTFVQLCAgICAgICAvLyBjaGFubmVsIC8gcHJvZ3JhbSArCi0JWyAweDIxIF0gPSBLRVlfQ0hBTk5FTERPV04sICAgICAvLyBjaGFubmVsIC8gcHJvZ3JhbSAtCi0JWyAweDIyIF0gPSBLRVlfQ0hBTk5FTCwgICAgICAgICAvLyBhbHQgLyBjaGFubmVsCi0JWyAweDIzIF0gPSBLRVlfTEFOR1VBR0UsICAgICAgICAvLyAxc3QgLyAybmQgbGFuZ3VhZ2UKLQlbIDB4MjYgXSA9IEtFWV9TTEVFUCwgICAgICAgICAgIC8vIHNsZWVwdGltZXIKLQlbIDB4MmUgXSA9IEtFWV9NRU5VLCAgICAgICAgICAgIC8vIDJuZCBjb250cm9scyAoVVNBOiBtZW51KQotCVsgMHgzMCBdID0gS0VZX1BBVVNFLCAgICAgICAgICAgLy8gcGF1c2UKLQlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsICAgICAgICAgIC8vIHJld2luZAotCVsgMHgzMyBdID0gS0VZX0dPVE8sICAgICAgICAgICAgLy8gZ28gdG8KLQlbIDB4MzUgXSA9IEtFWV9QTEFZLCAgICAgICAgICAgIC8vIHBsYXkKLQlbIDB4MzYgXSA9IEtFWV9TVE9QLCAgICAgICAgICAgIC8vIHN0b3AKLQlbIDB4MzcgXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8vIHJlY29yZGluZwotCVsgMHgzYyBdID0gS0VZX1RFWFQsICAgICAgICAgICAgLy8gdGVsZXRleHQgc3VibW9kZSAoSmFwYW46IDEyKQotCVsgMHgzZCBdID0gS0VZX1NVU1BFTkQsICAgICAgICAgLy8gc3lzdGVtIHN0YW5kYnkKKwlbIDB4MGIgXSA9IEtFWV9DSEFOTkVMLAkJLyogY2hhbm5lbCAvIHByb2dyYW0gKGphcGFuOiAxMSkgKi8KKwlbIDB4MGMgXSA9IEtFWV9QT1dFUiwJCS8qIHN0YW5kYnkgKi8KKwlbIDB4MGQgXSA9IEtFWV9NVVRFLAkJLyogbXV0ZSAvIGRlbXV0ZSAqLworCVsgMHgwZiBdID0gS0VZX1RWLAkJLyogZGlzcGxheSAqLworCVsgMHgxMCBdID0gS0VZX1ZPTFVNRVVQLAorCVsgMHgxMSBdID0gS0VZX1ZPTFVNRURPV04sCisJWyAweDEyIF0gPSBLRVlfQlJJR0hUTkVTU1VQLAorCVsgMHgxMyBdID0gS0VZX0JSSUdIVE5FU1NET1dOLAorCVsgMHgxZSBdID0gS0VZX1NFQVJDSCwJCS8qIHNlYXJjaCArICovCisJWyAweDIwIF0gPSBLRVlfQ0hBTk5FTFVQLAkvKiBjaGFubmVsIC8gcHJvZ3JhbSArICovCisJWyAweDIxIF0gPSBLRVlfQ0hBTk5FTERPV04sCS8qIGNoYW5uZWwgLyBwcm9ncmFtIC0gKi8KKwlbIDB4MjIgXSA9IEtFWV9DSEFOTkVMLAkJLyogYWx0IC8gY2hhbm5lbCAqLworCVsgMHgyMyBdID0gS0VZX0xBTkdVQUdFLAkvKiAxc3QgLyAybmQgbGFuZ3VhZ2UgKi8KKwlbIDB4MjYgXSA9IEtFWV9TTEVFUCwJCS8qIHNsZWVwdGltZXIgKi8KKwlbIDB4MmUgXSA9IEtFWV9NRU5VLAkJLyogMm5kIGNvbnRyb2xzIChVU0E6IG1lbnUpICovCisJWyAweDMwIF0gPSBLRVlfUEFVU0UsCisJWyAweDMyIF0gPSBLRVlfUkVXSU5ELAorCVsgMHgzMyBdID0gS0VZX0dPVE8sCisJWyAweDM1IF0gPSBLRVlfUExBWSwKKwlbIDB4MzYgXSA9IEtFWV9TVE9QLAorCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwJCS8qIHJlY29yZGluZyAqLworCVsgMHgzYyBdID0gS0VZX1RFWFQsICAgIAkvKiB0ZWxldGV4dCBzdWJtb2RlIChKYXBhbjogMTIpICovCisJWyAweDNkIF0gPSBLRVlfU1VTUEVORCwJCS8qIHN5c3RlbSBzdGFuZGJ5ICovCiAKLSNpZiAwIC8qIEZJWE1FICovCi0JWyAweDBhIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyAxLzIvMyBkaWdpdHMgKGphcGFuOiAxMCkKLQlbIDB4MGUgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIFAuUC4gKHBlcnNvbmFsIHByZWZlcmVuY2UpCi0JWyAweDE0IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBjb2xvdXIgc2F0dXJhdGlvbiArCi0JWyAweDE1IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBjb2xvdXIgc2F0dXJhdGlvbiAtCi0JWyAweDE2IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBiYXNzICsKLQlbIDB4MTcgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGJhc3MgLQotCVsgMHgxOCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdHJlYmxlICsKLQlbIDB4MTkgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIHRyZWJsZSAtCi0JWyAweDFhIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBiYWxhbmNlIHJpZ2h0Ci0JWyAweDFiIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBiYWxhbmNlIGxlZnQKLQlbIDB4MWMgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNvbnRyYXN0ICsKLQlbIDB4MWQgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGNvbnRyYXN0IC0KLQlbIDB4MWYgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIHRpbnQvaHVlICsKLQlbIDB4MjQgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIHNwYWNpYWwgc3RlcmVvIG9uL29mZgotCVsgMHgyNSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gbW9ubyAvIHN0ZXJlbyAoVVNBKQotCVsgMHgyNyBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdGludCAvIGh1ZSAtCi0JWyAweDI4IF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBSRiBzd2l0Y2gvUElQIHNlbGVjdAotCVsgMHgyOSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdm90ZQotCVsgMHgyYSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdGltZWQgcGFnZS9jaGFubmVsIGNsY2sKLQlbIDB4MmIgXSA9IEtFWV9SRVNFUlZFRCwgICAgICAgIC8vIGluY3JlbWVudCAoVVNBKQotCVsgMHgyYyBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gZGVjcmVtZW50IChVU0EpCi0JWyAweDJkIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLwotCVsgMHgyZiBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gUElQIHNoaWZ0Ci0JWyAweDMxIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBlcmFzZQotCVsgMHgzNCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gd2luZAotCVsgMHgzOCBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gZXh0ZXJuYWwgMQotCVsgMHgzOSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gZXh0ZXJuYWwgMgotCVsgMHgzYSBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gUElQIGRpc3BsYXkgbW9kZQotCVsgMHgzYiBdID0gS0VZX1JFU0VSVkVELCAgICAgICAgLy8gdmlldyBkYXRhIG1vZGUgLyBhZHZhbmNlCi0JWyAweDNlIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBjcmlzcGVuZXIgb24vb2ZmCi0JWyAweDNmIF0gPSBLRVlfUkVTRVJWRUQsICAgICAgICAvLyBzeXN0ZW0gc2VsZWN0Ci0jZW5kaWYKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc19yYzVfdHYpOwogCiAvKiBUYWJsZSBmb3IgTGVhZHRlayBXaW5mYXN0IFJlbW90ZSBDb250cm9scyAtIHVzZWQgYnkgYm90aCBidHR2IGFuZCBjeDg4ICovCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc193aW5mYXN0W0lSX0tFWVRBQl9TSVpFXSA9IHsKKwkvKiBLZXlzIDAgdG8gOSAqLworCVsgMTggXSA9IEtFWV9LUDAsCiAJWyAgNSBdID0gS0VZX0tQMSwKIAlbICA2IF0gPSBLRVlfS1AyLAogCVsgIDcgXSA9IEtFWV9LUDMsCkBAIC0xMjgsMzkgKzk4LDMxIEBACiAJWyAxMyBdID0gS0VZX0tQNywKIAlbIDE0IF0gPSBLRVlfS1A4LAogCVsgMTUgXSA9IEtFWV9LUDksCi0JWyAxOCBdID0gS0VZX0tQMCwKIAogCVsgIDAgXSA9IEtFWV9QT1dFUiwKLQlbIDI3IF0gPSBLRVlfTEFOR1VBR0UsICAvL01UUyBidXR0b24KLQlbICAyIF0gPSBLRVlfVFVORVIsICAgICAvLyBUVi9GTQorCVsgIDIgXSA9IEtFWV9UVU5FUiwJCS8qIFRWL0ZNICovCiAJWyAzMCBdID0gS0VZX1ZJREVPLAotCVsgMjIgXSA9IEtFWV9JTkZPLCAgICAgIC8vZGlzcGxheSBidXR0b24KIAlbICA0IF0gPSBLRVlfVk9MVU1FVVAsCiAJWyAgOCBdID0gS0VZX1ZPTFVNRURPV04sCiAJWyAxMiBdID0gS0VZX0NIQU5ORUxVUCwKIAlbIDE2IF0gPSBLRVlfQ0hBTk5FTERPV04sCi0JWyAgMyBdID0gS0VZX1pPT00sICAgICAgLy8gZnVsbHNjcmVlbgotCVsgMzEgXSA9IEtFWV9TVUJUSVRMRSwgIC8vIGNsb3NlZCBjYXB0aW9uL3RlbGV0ZXh0CisJWyAgMyBdID0gS0VZX1pPT00sCQkvKiBmdWxsc2NyZWVuICovCisJWyAzMSBdID0gS0VZX1NVQlRJVExFLAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KIAlbIDMyIF0gPSBLRVlfU0xFRVAsCi0JWyA0MSBdID0gS0VZX1NFQVJDSCwgICAgLy9ib3NzIGtleQogCVsgMjAgXSA9IEtFWV9NVVRFLAogCVsgNDMgXSA9IEtFWV9SRUQsCiAJWyA0NCBdID0gS0VZX0dSRUVOLAogCVsgNDUgXSA9IEtFWV9ZRUxMT1csCiAJWyA0NiBdID0gS0VZX0JMVUUsCi0JWyAyNCBdID0gS0VZX0tQUExVUywgICAgLy9maW5lIHR1bmUgKwotCVsgMjUgXSA9IEtFWV9LUE1JTlVTLCAgIC8vZmluZSB0dW5lIC0KLQlbIDQyIF0gPSBLRVlfQU5HTEUsICAgICAvL3BpY3R1cmUgaW4gcGljdHVyZQotCVsgMzMgXSA9IEtFWV9LUERPVCwKKwlbIDI0IF0gPSBLRVlfS1BQTFVTLAkJLyogZmluZSB0dW5lICsgKi8KKwlbIDI1IF0gPSBLRVlfS1BNSU5VUywJCS8qIGZpbmUgdHVuZSAtICovCisgICAgICAgIFsgMzMgXSA9IEtFWV9LUERPVCwKIAlbIDE5IF0gPSBLRVlfS1BFTlRFUiwKLQlbIDE3IF0gPSBLRVlfQUdBSU4sICAgICAvL3JlY2FsbAogCVsgMzQgXSA9IEtFWV9CQUNLLAogCVsgMzUgXSA9IEtFWV9QTEFZUEFVU0UsCiAJWyAzNiBdID0gS0VZX05FWFQsCi0JWyAzNyBdID0gS0VZX1QsICAgICAgICAgLy90aW1lIHNoaWZ0aW5nCiAJWyAzOCBdID0gS0VZX1NUT1AsCi0JWyAzOSBdID0gS0VZX1JFQ09SRCwKLQlbIDQwIF0gPSBLRVlfU0hVRkZMRSAgICAvL3NuYXBzaG90CisJWyAzOSBdID0gS0VZX1JFQ09SRAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3dpbmZhc3QpOwogCkBAIC0xNzQsNDUgKzEzNiw5NyBAQAogICogc2xpZ2h0bHkgZGlmZmVyZW50IHZlcnNpb25zKSwgc2hpcHBlZCB3aXRoIGN4ODgraXZ0diBjYXJkcy4KICAqIGFsbW9zdCByYzUgY29kaW5nLCBidXQgc29tZSBub24tc3RhbmRhcmQga2V5cyAqLwogSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfaGF1cHBhdWdlX25ld1tJUl9LRVlUQUJfU0laRV0gPSB7Ci0JWyAweDAwIF0gPSBLRVlfS1AwLCAgICAgICAgICAgICAvLyAwCi0JWyAweDAxIF0gPSBLRVlfS1AxLCAgICAgICAgICAgICAvLyAxCi0JWyAweDAyIF0gPSBLRVlfS1AyLCAgICAgICAgICAgICAvLyAyCi0JWyAweDAzIF0gPSBLRVlfS1AzLCAgICAgICAgICAgICAvLyAzCi0JWyAweDA0IF0gPSBLRVlfS1A0LCAgICAgICAgICAgICAvLyA0Ci0JWyAweDA1IF0gPSBLRVlfS1A1LCAgICAgICAgICAgICAvLyA1Ci0JWyAweDA2IF0gPSBLRVlfS1A2LCAgICAgICAgICAgICAvLyA2Ci0JWyAweDA3IF0gPSBLRVlfS1A3LCAgICAgICAgICAgICAvLyA3Ci0JWyAweDA4IF0gPSBLRVlfS1A4LCAgICAgICAgICAgICAvLyA4Ci0JWyAweDA5IF0gPSBLRVlfS1A5LCAgICAgICAgICAgICAvLyA5Ci0JWyAweDBiIF0gPSBLRVlfUkVELCAgICAgICAgICAgICAvLyByZWQgYnV0dG9uCi0JWyAweDBjIF0gPSBLRVlfT1BUSU9OLCAgICAgICAgICAvLyBibGFjayBrZXkgd2l0aG91dCB0ZXh0Ci0JWyAweDBkIF0gPSBLRVlfTUVOVSwgICAgICAgICAgICAvLyBtZW51Ci0JWyAweDBmIF0gPSBLRVlfTVVURSwgICAgICAgICAgICAvLyBtdXRlCi0JWyAweDEwIF0gPSBLRVlfVk9MVU1FVVAsICAgICAgICAvLyB2b2x1bWUgKwotCVsgMHgxMSBdID0gS0VZX1ZPTFVNRURPV04sICAgICAgLy8gdm9sdW1lIC0KLQlbIDB4MWUgXSA9IEtFWV9ORVhULCAgICAgICAgICAgIC8vIHNraXAgPnwKLQlbIDB4MWYgXSA9IEtFWV9FWElULCAgICAgICAgICAgIC8vIGJhY2svZXhpdAotCVsgMHgyMCBdID0gS0VZX0NIQU5ORUxVUCwgICAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gKwotCVsgMHgyMSBdID0gS0VZX0NIQU5ORUxET1dOLCAgICAgLy8gY2hhbm5lbCAvIHByb2dyYW0gLQotCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsICAgICAgICAgLy8gc291cmNlIChvbGQgYmxhY2sgcmVtb3RlKQotCVsgMHgyNCBdID0gS0VZX1BSRVZJT1VTLCAgICAgICAgLy8gcmVwbGF5IHw8Ci0JWyAweDI1IF0gPSBLRVlfRU5URVIsICAgICAgICAgICAvLyBPSwotCVsgMHgyNiBdID0gS0VZX1NMRUVQLCAgICAgICAgICAgLy8gbWluaW1pemUgKG9sZCBibGFjayByZW1vdGUpCi0JWyAweDI5IF0gPSBLRVlfQkxVRSwgICAgICAgICAgICAvLyBibHVlIGtleQotCVsgMHgyZSBdID0gS0VZX0dSRUVOLCAgICAgICAgICAgLy8gZ3JlZW4gYnV0dG9uCi0JWyAweDMwIF0gPSBLRVlfUEFVU0UsICAgICAgICAgICAvLyBwYXVzZQotCVsgMHgzMiBdID0gS0VZX1JFV0lORCwgICAgICAgICAgLy8gYmFja3dhcmQgPDwKLQlbIDB4MzQgXSA9IEtFWV9GQVNURk9SV0FSRCwgICAgIC8vIGZvcndhcmQgPj4KLQlbIDB4MzUgXSA9IEtFWV9QTEFZLCAgICAgICAgICAgIC8vIHBsYXkKLQlbIDB4MzYgXSA9IEtFWV9TVE9QLCAgICAgICAgICAgIC8vIHN0b3AKLQlbIDB4MzcgXSA9IEtFWV9SRUNPUkQsICAgICAgICAgIC8vIHJlY29yZGluZwotCVsgMHgzOCBdID0gS0VZX1lFTExPVywgICAgICAgICAgLy8geWVsbG93IGtleQotCVsgMHgzYiBdID0gS0VZX1NFTEVDVCwgICAgICAgICAgLy8gdG9wIHJpZ2h0IGJ1dHRvbgotCVsgMHgzYyBdID0gS0VZX1pPT00sICAgICAgICAgICAgLy8gZnVsbAotCVsgMHgzZCBdID0gS0VZX1BPV0VSLCAgICAgICAgICAgLy8gc3lzdGVtIHBvd2VyIChncmVlbiBidXR0b24pCisJLyogS2V5cyAwIHRvIDkgKi8KKwlbIDB4MDAgXSA9IEtFWV9LUDAsCisJWyAweDAxIF0gPSBLRVlfS1AxLAorCVsgMHgwMiBdID0gS0VZX0tQMiwKKwlbIDB4MDMgXSA9IEtFWV9LUDMsCisJWyAweDA0IF0gPSBLRVlfS1A0LAorCVsgMHgwNSBdID0gS0VZX0tQNSwKKwlbIDB4MDYgXSA9IEtFWV9LUDYsCisJWyAweDA3IF0gPSBLRVlfS1A3LAorCVsgMHgwOCBdID0gS0VZX0tQOCwKKwlbIDB4MDkgXSA9IEtFWV9LUDksCisKKwlbIDB4MGEgXSA9IEtFWV9URVhULCAgICAgIAkvKiBrZXlwYWQgYXN0ZXJpc2sgYXMgd2VsbCAqLworCVsgMHgwYiBdID0gS0VZX1JFRCwJCS8qIHJlZCBidXR0b24gKi8KKwlbIDB4MGMgXSA9IEtFWV9SQURJTywKKwlbIDB4MGQgXSA9IEtFWV9NRU5VLAorCVsgMHgwZSBdID0gS0VZX1NVQlRJVExFLAkvKiBhbHNvIHRoZSAjIGtleSAqLworCVsgMHgwZiBdID0gS0VZX01VVEUsCisJWyAweDEwIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweDExIF0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbIDB4MTIgXSA9IEtFWV9QUkVWSU9VUywJLyogcHJldmlvdXMgY2hhbm5lbCAqLworCVsgMHgxNCBdID0gS0VZX1VQLAorCVsgMHgxNSBdID0gS0VZX0RPV04sCisJWyAweDE2IF0gPSBLRVlfTEVGVCwKKwlbIDB4MTcgXSA9IEtFWV9SSUdIVCwKKwlbIDB4MTggXSA9IEtFWV9WSURFTywJCS8qIFZpZGVvcyAqLworCVsgMHgxOSBdID0gS0VZX0FVRElPLAkJLyogTXVzaWMgKi8KKwkvKiAweDFhOiBQaWN0dXJlcyAtIHByZXN1bWUgdGhpcyBtZWFucworCSAgICJNdWx0aW1lZGlhIEhvbWUgUGxhdGZvcm0iIC0KKwkgICBubyAiUElDVFVSRVMiIGtleSBpbiBpbnB1dC5oCisJICovCisJWyAweDFhIF0gPSBLRVlfTUhQLAorCisJWyAweDFiIF0gPSBLRVlfRVBHLAkJLyogR3VpZGUgKi8KKwlbIDB4MWMgXSA9IEtFWV9UViwKKwlbIDB4MWUgXSA9IEtFWV9ORVhUU09ORywJLyogc2tpcCA+fCAqLworCVsgMHgxZiBdID0gS0VZX0VYSVQsCQkvKiBiYWNrL2V4aXQgKi8KKwlbIDB4MjAgXSA9IEtFWV9DSEFOTkVMVVAsCS8qIGNoYW5uZWwgLyBwcm9ncmFtICsgKi8KKwlbIDB4MjEgXSA9IEtFWV9DSEFOTkVMRE9XTiwJLyogY2hhbm5lbCAvIHByb2dyYW0gLSAqLworCVsgMHgyMiBdID0gS0VZX0NIQU5ORUwsCQkvKiBzb3VyY2UgKG9sZCBibGFjayByZW1vdGUpICovCisJWyAweDI0IF0gPSBLRVlfUFJFVklPVVNTT05HLAkvKiByZXBsYXkgfDwgKi8KKwlbIDB4MjUgXSA9IEtFWV9FTlRFUiwJCS8qIE9LICovCisJWyAweDI2IF0gPSBLRVlfU0xFRVAsCQkvKiBtaW5pbWl6ZSAob2xkIGJsYWNrIHJlbW90ZSkgKi8KKwlbIDB4MjkgXSA9IEtFWV9CTFVFLAkJLyogYmx1ZSBrZXkgKi8KKwlbIDB4MmUgXSA9IEtFWV9HUkVFTiwJCS8qIGdyZWVuIGJ1dHRvbiAqLworCVsgMHgzMCBdID0gS0VZX1BBVVNFLAkJLyogcGF1c2UgKi8KKwlbIDB4MzIgXSA9IEtFWV9SRVdJTkQsCQkvKiBiYWNrd2FyZCA8PCAqLworCVsgMHgzNCBdID0gS0VZX0ZBU1RGT1JXQVJELAkvKiBmb3J3YXJkID4+ICovCisJWyAweDM1IF0gPSBLRVlfUExBWSwKKwlbIDB4MzYgXSA9IEtFWV9TVE9QLAorCVsgMHgzNyBdID0gS0VZX1JFQ09SRCwJCS8qIHJlY29yZGluZyAqLworCVsgMHgzOCBdID0gS0VZX1lFTExPVywJCS8qIHllbGxvdyBrZXkgKi8KKwlbIDB4M2IgXSA9IEtFWV9TRUxFQ1QsCQkvKiB0b3AgcmlnaHQgYnV0dG9uICovCisJWyAweDNjIF0gPSBLRVlfWk9PTSwJCS8qIGZ1bGwgKi8KKwlbIDB4M2QgXSA9IEtFWV9QT1dFUiwJCS8qIHN5c3RlbSBwb3dlciAoZ3JlZW4gYnV0dG9uKSAqLwogfTsKIEVYUE9SVF9TWU1CT0woaXJfY29kZXNfaGF1cHBhdWdlX25ldyk7CiAKK0lSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3BpeGVsdmlld1tJUl9LRVlUQUJfU0laRV0gPSB7CisJWyAgMiBdID0gS0VZX0tQMCwKKwlbICAxIF0gPSBLRVlfS1AxLAorCVsgMTEgXSA9IEtFWV9LUDIsCisJWyAyNyBdID0gS0VZX0tQMywKKwlbICA1IF0gPSBLRVlfS1A0LAorCVsgIDkgXSA9IEtFWV9LUDUsCisJWyAyMSBdID0gS0VZX0tQNiwKKwlbICA2IF0gPSBLRVlfS1A3LAorCVsgMTAgXSA9IEtFWV9LUDgsCisJWyAxOCBdID0gS0VZX0tQOSwKKworCVsgIDMgXSA9IEtFWV9UVU5FUiwJCS8qIFRWL0ZNICovCisJWyAgNyBdID0gS0VZX1NFQVJDSCwJCS8qIHNjYW4gKi8KKwlbIDI4IF0gPSBLRVlfWk9PTSwJCS8qIGZ1bGwgc2NyZWVuICovCisJWyAzMCBdID0gS0VZX1BPV0VSLAorCVsgMjMgXSA9IEtFWV9WT0xVTUVET1dOLAorCVsgMzEgXSA9IEtFWV9WT0xVTUVVUCwKKwlbIDIwIF0gPSBLRVlfQ0hBTk5FTERPV04sCisJWyAyMiBdID0gS0VZX0NIQU5ORUxVUCwKKwlbIDI0IF0gPSBLRVlfTVVURSwKKworCVsgIDAgXSA9IEtFWV9MSVNULAkJLyogc291cmNlICovCisJWyAxOSBdID0gS0VZX0lORk8sCQkvKiBsb29wICovCisJWyAxNiBdID0gS0VZX0xBU1QsCQkvKiArMTAwICovCisJWyAxMyBdID0gS0VZX0NMRUFSLAkJLyogcmVzZXQgKi8KKwlbIDEyIF0gPSBCVE5fUklHSFQsCQkvKiBmdW4rKyAqLworCVsgIDQgXSA9IEJUTl9MRUZULAkJLyogZnVuLS0gKi8KKwlbIDE0IF0gPSBLRVlfR09UTywJCS8qIGZ1bmN0aW9uICovCisJWyAxNSBdID0gS0VZX1NUT1AsCQkvKiBmcmVlemUgKi8KK307CitFWFBPUlRfU1lNQk9MKGlyX2NvZGVzX3BpeGVsdmlldyk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyB2b2lkIGlyX2lucHV0X2tleV9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXIpCkBAIC0yNzYsMTAgKzI5MCw2IEBACiAJCWlyLT5rZXlwcmVzc2VkID0gMTsKIAkJaXJfaW5wdXRfa2V5X2V2ZW50KGRldixpcik7CiAJfQotI2lmIDAKLQkvKiBtYXliZSBkbyBzb21ldGhpbmcgbGlrZSB0aGlzID8/PyAqLwotCWlucHV0X2V2ZW50KGEsIEVWX0lSLCBpci0+aXJfdHlwZSwgaXItPmlyX3Jhdyk7Ci0jZW5kaWYKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM3OSwzICszODksNCBAQAogICogYy1iYXNpYy1vZmZzZXQ6IDgKICAqIEVuZDoKICAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCmluZGV4IDUwZThiODYuLmNkNTgyOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jCkBAIC02MiwxMyArNjIsMTUgQEAKIGludCBzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZShzdHJ1Y3Qgc2FhNzE0Nl9kZXYgKmRldiwgaW50IG5vYnVzeWxvb3ApCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyOwogCiAJLyogd2FpdCBmb3IgcmVnaXN0ZXJzIHRvIGJlIHByb2dyYW1tZWQgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2FhNzE0Nl9yZWFkKGRldiwgTUMyKSAmIDIpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi8yMCkpIHsKKwkJZXJyID0gdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEhaLzIwKTsKKwkJaWYgKHNhYTcxNDZfcmVhZChkZXYsIE1DMikgJiAyKQorCQkJYnJlYWs7CisJCWlmIChlcnIpIHsKIAkJCURFQl9TKCgidGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIHJlZ2lzdGVycyBnZXR0aW5nIHByb2dyYW1tZWRcbiIpKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CkBAIC03OSwxMCArODEsMTEgQEAKIAkvKiB3YWl0IGZvciB0cmFuc2ZlciB0byBjb21wbGV0ZSAqLwogCXN0YXJ0ID0gamlmZmllczsKIAl3aGlsZSAoMSkgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgSFovNCk7CiAJCWlmICghKHNhYTcxNDZfcmVhZChkZXYsIFBTUikgJiBTUENJX0RFQklfUykpCiAJCQlicmVhazsKIAkJc2FhNzE0Nl9yZWFkKGRldiwgTUMyKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBIWi80KSkgeworCQlpZiAoZXJyKSB7CiAJCQlERUJfUygoInRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciB0cmFuc2ZlciBjb21wbGV0aW9uXG4iKSk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQpAQCAtNTEyLDcgKzUxNSw3IEBACiAJZXh0LT5kcml2ZXIucmVtb3ZlID0gc2FhNzE0Nl9yZW1vdmVfb25lOwogCiAJcHJpbnRrKCJzYWE3MTQ2OiByZWdpc3RlciBleHRlbnNpb24gJyVzJy5cbiIsZXh0LT5uYW1lKTsKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZleHQtPmRyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmV4dC0+ZHJpdmVyKTsKIH0KIAogaW50IHNhYTcxNDZfdW5yZWdpc3Rlcl9leHRlbnNpb24oc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uKiBleHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jCmluZGV4IGNiODI2YzkuLmMwNGZkMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jCkBAIC00MDMsNyArNDAzLDcgQEAKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CiAKLXZvaWQgdnZfY2FsbGJhY2soc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhdHVzKQorc3RhdGljIHZvaWQgdnZfY2FsbGJhY2soc3RydWN0IHNhYTcxNDZfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgc3RhdHVzKQogewogCXUzMiBpc3IgPSBzdGF0dXM7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwppbmRleCA0OTgzZTFiLi4zZjBlYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKQEAgLTI3LDkgKzI3LDkgQEAKIAogY29tbWVudCAiU3VwcG9ydGVkIFVTQiBBZGFwdGVycyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFVTQgorc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvS2NvbmZpZyIKLXNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnIgogCiBjb21tZW50ICJTdXBwb3J0ZWQgRmxleENvcElJIChCMkMyKSBBZGFwdGVycyIKQEAgLTQwLDYgKzQwLDEwIEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvS2NvbmZpZyIKIAorY29tbWVudCAiU3VwcG9ydGVkIFBsdXRvMiBBZGFwdGVycyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQorc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvS2NvbmZpZyIKKwogY29tbWVudCAiU3VwcG9ydGVkIERWQiBGcm9udGVuZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKaW5kZXggNTIwZmMzOS4uYTdhZDA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKQEAgLTIsNCArMiw0IEBACiAjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIG11bHRpbWVkaWEgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLW9iai15ICAgICAgICA6PSBkdmItY29yZS8gZnJvbnRlbmRzLyB0dHBjaS8gdHR1c2ItZGVjLyB0dHVzYi1idWRnZXQvIGIyYzIvIGJ0OHh4LyBkaWJ1c2IvIGNpbmVyZ3lUMi8KK29iai15ICAgICAgICA6PSBkdmItY29yZS8gZnJvbnRlbmRzLyB0dHBjaS8gdHR1c2ItZGVjLyB0dHVzYi1idWRnZXQvIGIyYzIvIGJ0OHh4LyBjaW5lcmd5VDIvIGR2Yi11c2IvIHBsdXRvMi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvS2NvbmZpZwppbmRleCA5OWJkNjc1Li5kNzQxN2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9LY29uZmlnCkBAIC02LDYgKzYsNyBAQAogCXNlbGVjdCBEVkJfTVQzMTIKIAlzZWxlY3QgRFZCX05YVDIwMDIKIAlzZWxlY3QgRFZCX1NUVjAyOTcKKwlzZWxlY3QgRFZCX0JDTTM1MTAKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgZGlnaXRhbCBUViByZWNlaXZlciBjaGlwIG1hZGUgYnkgQjJDMiBJbmMuIGluY2x1ZGVkIGluCiAJICBUZWNobmlzYXRzIFBDSSBjYXJkcyBhbmQgVVNCIGJveGVzLgpAQCAtMzQsMTcgKzM1LDMgQEAKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhlIG1vZHVsZSBvcHRpb24gdG8gY29udHJvbCBkZWJ1ZyBtZXNzYWdlcwogCSAgb2YgYWxsIEIyQzIgRmxleENvcCBkcml2ZXJzLgotCi1jb25maWcgRFZCX0IyQzJfU0tZU1RBUgotCXRyaXN0YXRlICJCMkMyL1RlY2huaXNhdCBBaXIvU2t5L0NhYmxlU3RhciAyIFBDSSIKLQlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQotCXNlbGVjdCBEVkJfU1RWMDI5OQotCXNlbGVjdCBEVkJfTVQzNTIKLQlzZWxlY3QgRFZCX01UMzEyCi0Jc2VsZWN0IERWQl9OWFQyMDAyCi0JaGVscAotCSAgU3VwcG9ydCBmb3IgdGhlIFNreXN0YXIyIFBDSSBEVkIgY2FyZCBieSBUZWNobmlzYXQsIHdoaWNoCi0JICBpcyBlcXVpcHBlZCB3aXRoIHRoZSBGbGV4Q29wSUkgY2hpcHNldCBieSBCMkMyLCBhbmQKLQkgIGZvciB0aGUgQjJDMi9CQlRJIEFpcjJQQy1BVFNDIGNhcmQuCi0KLQkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9NYWtlZmlsZQppbmRleCA3NzAzODEyLi4xYTFjM2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvTWFrZWZpbGUKQEAgLTksNiArOSw0IEBACiBiMmMyLWZsZXhjb3AtdXNiLW9ianMgPSBmbGV4Y29wLXVzYi5vCiBvYmotJChDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9VU0IpICs9IGIyYzItZmxleGNvcC11c2IubwogCi1vYmotJChDT05GSUdfRFZCX0IyQzJfU0tZU1RBUikgKz0gc2t5c3RhcjIubwotCiBFWFRSQV9DRkxBR1MgPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1jb21tb24uaAppbmRleCA3NzNkMTU4Li5hOTQ5MTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWNvbW1vbi5oCkBAIC0xMDgsNiArMTA4LDggQEAKIGludCAgZmxleGNvcF9kZXZpY2VfaW5pdGlhbGl6ZShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UqKTsKIHZvaWQgZmxleGNvcF9kZXZpY2VfZXhpdChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKIAordm9pZCBmbGV4Y29wX3Jlc2V0X2Jsb2NrXzMwMChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjKTsKKwogLyogZnJvbSBmbGV4Y29wLWRtYS5jICovCiBpbnQgZmxleGNvcF9kbWFfYWxsb2NhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCB1MzIgc2l6ZSk7CiB2b2lkIGZsZXhjb3BfZG1hX2ZyZWUoc3RydWN0IGZsZXhjb3BfZG1hICpkbWEpOwpAQCAtMTE1LDcgKzExNyw4IEBACiBpbnQgZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgZmxleGNvcF9kbWFfaW5kZXhfdCBubywgaW50IG9ub2ZmKTsKIGludCBmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7CiBpbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZik7Ci1pbnQgZmxleGNvcF9kbWFfY29uZmlnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIHN0cnVjdCBmbGV4Y29wX2RtYSAqZG1hLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4KTsKK2ludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCk7CitpbnQgZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgZmxleGNvcF9kbWFfYWRkcl9pbmRleF90IGluZGV4LCBpbnQgb25vZmYpOwogaW50IGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IGN5Y2xlcyk7CiBpbnQgZmxleGNvcF9kbWFfY29uZmlnX3BhY2tldF9jb3VudChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IHBhY2tldHMpOwogCkBAIC0xNTEsNiArMTU0LDcgQEAKIC8qIGZyb20gZmxleGNvcC1taXNjLmMgKi8KIHZvaWQgZmxleGNvcF9kZXRlcm1pbmVfcmV2aXNpb24oc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyk7CiB2b2lkIGZsZXhjb3BfZGV2aWNlX25hbWUoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyxjb25zdCBjaGFyICpwcmVmaXgsY29uc3QgY2hhciAqc3VmZml4KTsKK3ZvaWQgZmxleGNvcF9kdW1wX3JlZyhzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2liaV9yZWdpc3RlciByZWcsIGludCBudW0pOwogCiAvKiBmcm9tIGZsZXhjb3AtaHctZmlsdGVyLmMgKi8KIGludCBmbGV4Y29wX3BpZF9mZWVkX2NvbnRyb2woc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkLCBpbnQgb25vZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWRtYS5jCmluZGV4IDhkMjcwNjAuLmNmNGVkMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1kbWEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZG1hLmMKQEAgLTM3LDIyICszNyw5MCBAQAogfQogRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9mcmVlKTsKIAotaW50IGZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK2ludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywKKwkJc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCkKIHsKLQlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisJZmxleGNvcF9pYmlfdmFsdWUgdjB4MCx2MHg0LHYweGM7CisJdjB4MC5yYXcgPSB2MHg0LnJhdyA9IHYweGMucmF3ID0gMDsKIAotCWlmIChubyAmIEZDX0RNQV8xKQotCQl2LmN0cmxfMjA4LkRNQTFfVGltZXJfRW5hYmxlX3NpZyA9IG9ub2ZmOworCXYweDAuZG1hXzB4MC5kbWFfYWRkcmVzczAgICAgICAgID0gZG1hLT5kbWFfYWRkcjAgPj4gMjsKKwl2MHhjLmRtYV8weGMuZG1hX2FkZHJlc3MxICAgICAgICA9IGRtYS0+ZG1hX2FkZHIxID4+IDI7CisJdjB4NC5kbWFfMHg0X3dyaXRlLmRtYV9hZGRyX3NpemUgPSBkbWEtPnNpemUgLyA0OwogCi0JaWYgKG5vICYgRkNfRE1BXzIpCi0JCXYuY3RybF8yMDguRE1BMl9UaW1lcl9FbmFibGVfc2lnID0gb25vZmY7CisJaWYgKChkbWFfaWR4ICYgRkNfRE1BXzEpID09IGRtYV9pZHgpIHsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMDAsdjB4MCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDA0LHYweDQpOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwYyx2MHhjKTsKKwl9IGVsc2UgaWYgKChkbWFfaWR4ICYgRkNfRE1BXzIpID09IGRtYV9pZHgpIHsKKwkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMTAsdjB4MCk7CisJCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDE0LHYweDQpOworCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxYyx2MHhjKTsKKwl9IGVsc2UgeworCQllcnIoImVpdGhlciBETUExIG9yIERNQTIgY2FuIGJlIGNvbmZpZ3VyZWQgYXQgdGhlIHdpdGhpbiBvbmUgZmxleGNvcF9kbWFfY29uZmlnIGNhbGwuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycSk7CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZyk7CiAKLWludCBmbGV4Y29wX2RtYV9jb250cm9sX3NpemVfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKKy8qIHN0YXJ0IHRoZSBETUEgdHJhbnNmZXJzLCBidXQgbm90IHRoZSBETUEgSVJRcyAqLworaW50IGZsZXhjb3BfZG1hX3hmZXJfY29udHJvbChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsCisJCWZsZXhjb3BfZG1hX2FkZHJfaW5kZXhfdCBpbmRleCwKKwkJaW50IG9ub2ZmKQoreworCWZsZXhjb3BfaWJpX3ZhbHVlIHYweDAsdjB4YzsKKwlmbGV4Y29wX2liaV9yZWdpc3RlciByMHgwLHIweGM7CisKKwlpZiAoKGRtYV9pZHggJiBGQ19ETUFfMSkgPT0gZG1hX2lkeCkgeworCQlyMHgwID0gZG1hMV8wMDA7CisJCXIweGMgPSBkbWExXzAwYzsKKwl9IGVsc2UgaWYgKChkbWFfaWR4ICYgRkNfRE1BXzIpID09IGRtYV9pZHgpIHsKKwkJcjB4MCA9IGRtYTJfMDEwOworCQlyMHhjID0gZG1hMl8wMWM7CisJfSBlbHNlIHsKKwkJZXJyKCJlaXRoZXIgdHJhbnNmZXIgRE1BMSBvciBETUEyIGNhbiBiZSBzdGFydGVkIHdpdGhpbiBvbmUgZmxleGNvcF9kbWFfeGZlcl9jb250cm9sIGNhbGwuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXYweDAgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIweDApOworCXYweGMgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIweGMpOworCisJZGViX3JkdW1wKCJyZWc6ICUwM3g6ICV4XG4iLHIweDAsdjB4MC5yYXcpOworCWRlYl9yZHVtcCgicmVnOiAlMDN4OiAleFxuIixyMHhjLHYweGMucmF3KTsKKworCWlmIChpbmRleCAmIEZDX0RNQV9TVUJBRERSXzApCisJCXYweDAuZG1hXzB4MC5kbWFfMHN0YXJ0ID0gb25vZmY7CisKKwlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8xKQorCQl2MHhjLmRtYV8weGMuZG1hXzFzdGFydCA9IG9ub2ZmOworCisJZmMtPndyaXRlX2liaV9yZWcoZmMscjB4MCx2MHgwKTsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyMHhjLHYweGMpOworCisJZGViX3JkdW1wKCJyZWc6ICUwM3g6ICV4XG4iLHIweDAsdjB4MC5yYXcpOworCWRlYl9yZHVtcCgicmVnOiAlMDN4OiAleFxuIixyMHhjLHYweGMucmF3KTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKTsKKworc3RhdGljIGludCBmbGV4Y29wX2RtYV9yZW1hcChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsCisJCWludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwYyA6IGRtYTJfMDFjOworCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOworCWRlYl9pbmZvKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCXYuZG1hXzB4Yy5yZW1hcF9lbmFibGUgPSBvbm9mZjsKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOworCXJldHVybiAwOworfQorCitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IG5vLAorCQlpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOwogCkBAIC02Nyw3NSArMTM1LDY0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEpOwogCi1pbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sIGludCBvbm9mZikKK2ludCBmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLAorCQlmbGV4Y29wX2RtYV9pbmRleF90IG5vLAorCQlpbnQgb25vZmYpCiB7CiAJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsY3RybF8yMDgpOwogCiAJaWYgKG5vICYgRkNfRE1BXzEpCisJCXYuY3RybF8yMDguRE1BMV9UaW1lcl9FbmFibGVfc2lnID0gb25vZmY7CisKKwlpZiAobm8gJiBGQ19ETUFfMikKKwkJdi5jdHJsXzIwOC5ETUEyX1RpbWVyX0VuYWJsZV9zaWcgPSBvbm9mZjsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LHYpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycSk7CisKKy8qIDEgY3ljbGVzID0gMS45NyBtc2VjICovCitpbnQgZmxleGNvcF9kbWFfY29uZmlnX3RpbWVyKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwKKwkJdTggY3ljbGVzKQoreworCWZsZXhjb3BfaWJpX3JlZ2lzdGVyIHIgPSAoZG1hX2lkeCAmIEZDX0RNQV8xKSA/IGRtYTFfMDA0IDogZG1hMl8wMTQ7CisJZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMscik7CisKKwlmbGV4Y29wX2RtYV9yZW1hcChmYyxkbWFfaWR4LDApOworCisJZGViX2luZm8oIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisJdi5kbWFfMHg0X3dyaXRlLmRtYXRpbWVyID0gY3ljbGVzOworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcik7CisKKy8qIHBhY2tldCBJUlEgZG9lcyBub3QgZXhpc3QgaW4gRkNJSSBvciBGQ0lJYiAtIGFjY29yZGluZyB0byBkYXRhIGJvb2sgYW5kIHRlc3RzICovCitpbnQgZmxleGNvcF9kbWFfY29udHJvbF9wYWNrZXRfaXJxKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3Qgbm8sCisJCWludCBvbm9mZikKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxjdHJsXzIwOCk7CisKKwlkZWJfcmR1bXAoInJlZzogJTAzeDogJXhcbiIsY3RybF8yMDgsdi5yYXcpOworCWlmIChubyAmIEZDX0RNQV8xKQogCQl2LmN0cmxfMjA4LkRNQTFfU2l6ZV9JUlFfRW5hYmxlX3NpZyA9IG9ub2ZmOwogCiAJaWYgKG5vICYgRkNfRE1BXzIpCiAJCXYuY3RybF8yMDguRE1BMl9TaXplX0lSUV9FbmFibGVfc2lnID0gb25vZmY7CiAKIAlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCx2KTsKKwlkZWJfcmR1bXAoInJlZzogJTAzeDogJXhcbiIsY3RybF8yMDgsdi5yYXcpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbnRyb2xfcGFja2V0X2lycSk7CiAKLWludCBmbGV4Y29wX2RtYV9jb25maWcoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYywgc3RydWN0IGZsZXhjb3BfZG1hICpkbWEsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCxmbGV4Y29wX2RtYV9hZGRyX2luZGV4X3QgaW5kZXgpCi17Ci0KLQlmbGV4Y29wX2liaV92YWx1ZSB2MHgwLHYweDQsdjB4YzsKLQl2MHgwLnJhdyA9IHYweDQucmF3ID0gdjB4Yy5yYXcgPSAwOwotCi0JdjB4MC5kbWFfMHgwLmRtYV9hZGRyZXNzMCAgICAgICAgPSBkbWEtPmRtYV9hZGRyMCA+PiAyOwotCXYweGMuZG1hXzB4Yy5kbWFfYWRkcmVzczEgICAgICAgID0gZG1hLT5kbWFfYWRkcjEgPj4gMjsKLQl2MHg0LmRtYV8weDRfd3JpdGUuZG1hX2FkZHJfc2l6ZSA9IGRtYS0+c2l6ZSAvIDQ7Ci0KLQlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8wKQotCQl2MHgwLmRtYV8weDAuZG1hXzBzdGFydCA9IDE7Ci0KLQlpZiAoaW5kZXggJiBGQ19ETUFfU1VCQUREUl8xKQotCQl2MHhjLmRtYV8weGMuZG1hXzFzdGFydCA9IDE7Ci0KLQlpZiAoZG1hX2lkeCAmIEZDX0RNQV8xKSB7Ci0JCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTFfMDAwLHYweDApOwotCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWExXzAwNCx2MHg0KTsKLQkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMV8wMGMsdjB4Yyk7Ci0JfSBlbHNlIHsgLyogKGRtYV9pZHggJiBGQ19ETUFfMikgKi8KLQkJZmMtPndyaXRlX2liaV9yZWcoZmMsZG1hMl8wMTAsdjB4MCk7Ci0JCWZjLT53cml0ZV9pYmlfcmVnKGZjLGRtYTJfMDE0LHYweDQpOwotCQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxkbWEyXzAxYyx2MHhjKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZmxleGNvcF9kbWFfY29uZmlnKTsKLQotc3RhdGljIGludCBmbGV4Y29wX2RtYV9yZW1hcChzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIGludCBvbm9mZikKLXsKLQlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwYyA6IGRtYTJfMDFjOwotCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwotCXYuZG1hXzB4Yy5yZW1hcF9lbmFibGUgPSBvbm9mZjsKLQlmYy0+d3JpdGVfaWJpX3JlZyhmYyxyLHYpOwotCXJldHVybiAwOwotfQotCi0vKiAxIGN5Y2xlcyA9IDEuOTcgbXNlYyAqLwotaW50IGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcihzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjLCBmbGV4Y29wX2RtYV9pbmRleF90IGRtYV9pZHgsIHU4IGN5Y2xlcykKLXsKLQlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwNCA6IGRtYTJfMDE0OwotCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwotCi0JZmxleGNvcF9kbWFfcmVtYXAoZmMsZG1hX2lkeCwwKTsKLQotCXYuZG1hXzB4NF93cml0ZS5kbWF0aW1lciA9IGN5Y2xlcyA+PiAxOwotCWZjLT53cml0ZV9pYmlfcmVnKGZjLHIsdik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGZsZXhjb3BfZG1hX2NvbmZpZ190aW1lcik7Ci0KLWludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwgdTggcGFja2V0cykKK2ludCBmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsCisJCWZsZXhjb3BfZG1hX2luZGV4X3QgZG1hX2lkeCwKKwkJdTggcGFja2V0cykKIHsKIAlmbGV4Y29wX2liaV9yZWdpc3RlciByID0gKGRtYV9pZHggJiBGQ19ETUFfMSkgPyBkbWExXzAwNCA6IGRtYTJfMDE0OwogCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwppbmRleCA3MWJlNDAwLi4wNDEwY2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtZmUtdHVuZXIuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgInN0djAyOTkuaCIKICNpbmNsdWRlICJtdDM1Mi5oIgogI2luY2x1ZGUgIm54dDIwMDIuaCIKKyNpbmNsdWRlICJiY20zNTEwLmgiCiAjaW5jbHVkZSAic3R2MDI5Ny5oIgogI2luY2x1ZGUgIm10MzEyLmgiCiAKQEAgLTI4NSwyMSArMjg2LDI1IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHNhbXN1bmdfdGR0YzkyNTFkaDBfY29uZmlnID0gewotCiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAotCS5kZW1vZF9pbml0ID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAorCS5kZW1vZF9pbml0ICAgID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAorCS5wbGxfc2V0ICAgICAgID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBueHQyMDAyX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQorc3RhdGljIGludCBmbGV4Y29wX2ZlX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQogewogCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmZS0+ZHZiLT5wcml2OwogCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlKGZ3LCBuYW1lLCBmYy0+ZGV2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBueHQyMDAyX2NvbmZpZyBzYW1zdW5nX3RibXZfY29uZmlnID0gewotCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKLQkucmVxdWVzdF9maXJtd2FyZSA9IG54dDIwMDJfcmVxdWVzdF9maXJtd2FyZSwKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGEsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBmbGV4Y29wX2ZlX3JlcXVlc3RfZmlybXdhcmUsCit9OworCitzdGF0aWMgc3RydWN0IGJjbTM1MTBfY29uZmlnIGFpcjJwY19hdHNjX2ZpcnN0X2dlbl9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBmLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gZmxleGNvcF9mZV9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIAogc3RhdGljIGludCBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCkBAIC0zNTQsMTEgKzM1OSwxNiBAQAogCQlmYy0+ZGV2X3R5cGUgICAgICAgICAgPSBGQ19BSVJfRFZCOwogCQlpbmZvKCJmb3VuZCB0aGUgbXQzNTIgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCi0JLyogdHJ5IHRoZSBhaXIgYXRzYyAobnh0MjAwMikgKi8KKwkvKiB0cnkgdGhlIGFpciBhdHNjIDJuZCBnZW5lcmF0aW9uIChueHQyMDAyKSAqLwogCWlmICgoZmMtPmZlID0gbnh0MjAwMl9hdHRhY2goJnNhbXN1bmdfdGJtdl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7Ci0JCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9BVFNDOworCQlmYy0+ZGV2X3R5cGUgICAgICAgICAgPSBGQ19BSVJfQVRTQzI7CiAJCWluZm8oImZvdW5kIHRoZSBueHQyMDAyIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLHNhbXN1bmdfdGJtdl9jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCisJLyogdHJ5IHRoZSBhaXIgYXRzYyAxbmQgZ2VuZXJhdGlvbiAoYmNtMzUxMCkvcGFuYXNvbmljIGN0MTBzICovCisJaWYgKChmYy0+ZmUgPSBiY20zNTEwX2F0dGFjaCgmYWlyMnBjX2F0c2NfZmlyc3RfZ2VuX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKKwkJZmMtPmRldl90eXBlICAgICAgICAgID0gRkNfQUlSX0FUU0MxOworCQlpbmZvKCJmb3VuZCB0aGUgYmNtMzUxMCBhdCBpMmMgYWRkcmVzczogMHglMDJ4IixhaXIycGNfYXRzY19maXJzdF9nZW5fY29uZmlnLmRlbW9kX2FkZHJlc3MpOworCX0gZWxzZQogCS8qIHRyeSB0aGUgY2FibGUgZHZiIChzdHYwMjk3KSAqLwogCWlmICgoZmMtPmZlID0gc3R2MDI5N19hdHRhY2goJmFscHNfdGRlZTRfc3R2MDI5N19jb25maWcsICZmYy0+aTJjX2FkYXAsIDB4ZjgpKSAhPSBOVUxMKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgID0gRkNfQ0FCTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaHctZmlsdGVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtaHctZmlsdGVyLmMKaW5kZXggMmJhZjQzZC4uNzVjZjIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWh3LWZpbHRlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1ody1maWx0ZXIuYwpAQCAtMTAsNiArMTAsOCBAQAogc3RhdGljIHZvaWQgZmxleGNvcF9yY3ZfZGF0YV9jdHJsKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBvbm9mZikKIHsKIAlmbGV4Y29wX3NldF9pYmlfdmFsdWUoY3RybF8yMDgsUmN2X0RhdGFfc2lnLG9ub2ZmKTsKKworCWRlYl90cygicmN2X2RhdGEgaXMgbm93OiAnJXMnXG4iLG9ub2ZmID8gIm9uIiA6ICJvZmYiKTsKIH0KIAogdm9pZCBmbGV4Y29wX3NtY19jdHJsKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGludCBvbm9mZikKQEAgLTE1MSw3ICsxNTMsNyBAQAogewogCWludCBtYXhfcGlkX2ZpbHRlciA9IDYgKyBmYy0+aGFzXzMyX2h3X3BpZF9maWx0ZXIqMzI7CiAKLQlmYy0+ZmVlZGNvdW50ICs9IG9ub2ZmID8gMSA6IC0xOworCWZjLT5mZWVkY291bnQgKz0gb25vZmYgPyAxIDogLTE7IC8qIHRoZSBudW1iZXIgb2YgUElEcy9GZWVkIGN1cnJlbnRseSByZXF1ZXN0ZWQgKi8KIAlpZiAoZHZiZG14ZmVlZC0+aW5kZXggPj0gbWF4X3BpZF9maWx0ZXIpCiAJCWZjLT5leHRyYV9mZWVkY291bnQgKz0gb25vZmYgPyAxIDogLTE7CiAKQEAgLTE3OCw4ICsxODAsMTQgQEAKIAkvKiBpZiBpdCB3YXMgdGhlIGZpcnN0IG9yIGxhc3QgZmVlZCByZXF1ZXN0IGNoYW5nZSB0aGUgc3RyZWFtLXN0YXR1cyAqLwogCWlmIChmYy0+ZmVlZGNvdW50ID09IG9ub2ZmKSB7CiAJCWZsZXhjb3BfcmN2X2RhdGFfY3RybChmYyxvbm9mZik7Ci0JCWlmIChmYy0+c3RyZWFtX2NvbnRyb2wpCisJCWlmIChmYy0+c3RyZWFtX2NvbnRyb2wpIC8qIGRldmljZSBzcGVjaWZpYyBzdHJlYW0gY29udHJvbCAqLwogCQkJZmMtPnN0cmVhbV9jb250cm9sKGZjLG9ub2ZmKTsKKworCQkvKiBmZWVkaW5nIHN0b3BwZWQgLT4gcmVzZXQgdGhlIGZsZXhjb3AgZmlsdGVyKi8KKwkJaWYgKG9ub2ZmID09IDApIHsKKwkJCWZsZXhjb3BfcmVzZXRfYmxvY2tfMzAwKGZjKTsKKwkJCWZsZXhjb3BfaHdfZmlsdGVyX2luaXQoZmMpOworCQl9CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtbWlzYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLW1pc2MuYwppbmRleCAxOWUwNmRhLi4zYTA4ZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtbWlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1taXNjLmMKQEAgLTQ1LDExICs0NSwxMiBAQAogCiBjb25zdCBjaGFyICpmbGV4Y29wX2RldmljZV9uYW1lc1tdID0gewogCSJVbmtvd24gZGV2aWNlIiwKLQkiQWlyU3RhciAyIERWQi1UIiwKLQkiQWlyU3RhciAyIEFUU0MiLAotCSJTa3lTdGFyIDIgRFZCLVMiLAotCSJTa3lTdGFyIDIgRFZCLVMgKG9sZCB2ZXJzaW9uKSIsCi0JIkNhYmxlU3RhciAyIERWQi1DIiwKKwkiQWlyMlBDL0FpclN0YXIgMiBEVkItVCIsCisJIkFpcjJQQy9BaXJTdGFyIDIgQVRTQyAxc3QgZ2VuZXJhdGlvbiIsCisJIkFpcjJQQy9BaXJTdGFyIDIgQVRTQyAybmQgZ2VuZXJhdGlvbiIsCisJIlNreTJQQy9Ta3lTdGFyIDIgRFZCLVMiLAorCSJTa3kyUEMvU2t5U3RhciAyIERWQi1TIChvbGQgdmVyc2lvbikiLAorCSJDYWJsZTJQQy9DYWJsZVN0YXIgMiBEVkItQyIsCiB9OwogCiBjb25zdCBjaGFyICpmbGV4Y29wX2J1c19uYW1lc1tdID0gewpAQCAtNjQsMyArNjUsMTUgQEAKIAkJCWZsZXhjb3BfZGV2aWNlX25hbWVzW2ZjLT5kZXZfdHlwZV0sZmxleGNvcF9idXNfbmFtZXNbZmMtPmJ1c190eXBlXSwKIAkJCWZsZXhjb3BfcmV2aXNpb25fbmFtZXNbZmMtPnJldl0sc3VmZml4KTsKIH0KKwordm9pZCBmbGV4Y29wX2R1bXBfcmVnKHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMsIGZsZXhjb3BfaWJpX3JlZ2lzdGVyIHJlZywgaW50IG51bSkKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2OworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQl2ID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxyZWcrNCppKTsKKwkJZGViX3JkdW1wKCIweCUwM3g6ICUwOHgsICIscmVnKzQqaSwgdi5yYXcpOworCX0KKwlkZWJfcmR1bXAoIlxuIik7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhjb3BfZHVtcF9yZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXBjaS5jCmluZGV4IGVkNzE3YzAuLjJmNzZlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKQEAgLTEzLDYgKzEzLDEwIEBACiBtb2R1bGVfcGFyYW0oZW5hYmxlX3BpZF9maWx0ZXJpbmcsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9waWRfZmlsdGVyaW5nLCAiZW5hYmxlIGhhcmR3YXJlIHBpZCBmaWx0ZXJpbmc6IHN1cHBvcnRlZCB2YWx1ZXM6IDAgKGZ1bGx0cyksIDEiKTsKIAorc3RhdGljIGludCBpcnFfY2hrX2ludHY7Cittb2R1bGVfcGFyYW0oaXJxX2Noa19pbnR2LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcnFfY2hrX2ludHYsICJzZXQgdGhlIGludGVydmFsIGZvciBJUlEgd2F0Y2hkb2cgKGN1cnJlbnRseSBqdXN0IGRlYnVnZ2luZykuIik7CisKICNpZmRlZiBDT05GSUdfRFZCX0IyQzJfRkxFWENPUF9ERUJVRwogI2RlZmluZSBkcHJpbnRrKGxldmVsLGFyZ3MuLi4pIFwKIAlkbyB7IGlmICgoZGVidWcgJiBsZXZlbCkpIHByaW50ayhhcmdzKTsgfSB3aGlsZSAoMCkKQEAgLTI2LDYgKzMwLDcgQEAKICNkZWZpbmUgZGViX3JlZyhhcmdzLi4uKSAgIGRwcmludGsoMHgwMixhcmdzKQogI2RlZmluZSBkZWJfdHMoYXJncy4uLikgICAgZHByaW50aygweDA0LGFyZ3MpCiAjZGVmaW5lIGRlYl9pcnEoYXJncy4uLikgICBkcHJpbnRrKDB4MDgsYXJncykKKyNkZWZpbmUgZGViX2NoayhhcmdzLi4uKSAgIGRwcmludGsoMHgxMCxhcmdzKQogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKQEAgLTU2LDYgKzYxLDEwIEBACiAKIAlzcGlubG9ja190IGlycV9sb2NrOwogCisJdW5zaWduZWQgbG9uZyBsYXN0X2lycTsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBpcnFfY2hlY2tfd29yazsKKwogCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmNfZGV2OwogfTsKIApAQCAtODgsMTggKzk3LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZsZXhjb3BfcGNpICpmY19wY2kgPSBkYXRhOworCXN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMgPSBmY19wY2ktPmZjX2RldjsKKworCWZsZXhjb3BfaWJpX3ZhbHVlIHYgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLHNyYW1fZGVzdF9yZWdfNzE0KTsKKworCWZsZXhjb3BfZHVtcF9yZWcoZmNfcGNpLT5mY19kZXYsZG1hMV8wMDAsNCk7CisKKwlpZiAodi5zcmFtX2Rlc3RfcmVnXzcxNC5uZXRfb3ZmbG93X2Vycm9yKQorCQlkZWJfY2hrKCJzcmFtIG5ldF9vdmZsb3dfZXJyb3JcbiIpOworCWlmICh2LnNyYW1fZGVzdF9yZWdfNzE0Lm1lZGlhX292Zmxvd19lcnJvcikKKwkJZGViX2Noaygic3JhbSBtZWRpYV9vdmZsb3dfZXJyb3JcbiIpOworCWlmICh2LnNyYW1fZGVzdF9yZWdfNzE0LmNhaV9vdmZsb3dfZXJyb3IpCisJCWRlYl9jaGsoInNyYW0gY2FpX292Zmxvd19lcnJvclxuIik7CisJaWYgKHYuc3JhbV9kZXN0X3JlZ183MTQuY2FpX292Zmxvd19lcnJvcikKKwkJZGViX2Noaygic3JhbSBjYWlfb3ZmbG93X2Vycm9yXG4iKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZmNfcGNpLT5pcnFfY2hlY2tfd29yaywKKwkJCW1zZWNzX3RvX2ppZmZpZXMoaXJxX2Noa19pbnR2IDwgMTAwID8gMTAwIDogaXJxX2Noa19pbnR2KSk7Cit9CisKIC8qIFdoZW4gUElEIGZpbHRlcmluZyBpcyB0dXJuZWQgb24sIHdlIHVzZSB0aGUgdGltZXIgSVJRLCBiZWNhdXNlIHNtYWxsIGFtb3VudHMKICAqIG9mIGRhdGEgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIHVzZXIgc3BhY2UgaW5zdGFudGx5IGFzIHdlbGwuIFdoZW4gUElECiAgKiBmaWx0ZXJpbmcgaXMgdHVybmVkIG9mZiwgd2UgdXNlIHRoZSBwYWdlLWNoYW5nZS1JUlEgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBmbGV4Y29wX3BjaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCBmbGV4Y29wX3BjaV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgZmxleGNvcF9wY2kgKmZjX3BjaSA9IGRldl9pZDsKIAlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmNfcGNpLT5mY19kZXY7Ci0JZmxleGNvcF9pYmlfdmFsdWUgdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsaXJxXzIwYyk7CisJZmxleGNvcF9pYmlfdmFsdWUgdjsKIAlpcnFyZXR1cm5fdCByZXQgPSBJUlFfSEFORExFRDsKIAogCXNwaW5fbG9ja19pcnEoJmZjX3BjaS0+aXJxX2xvY2spOwogCisJdiA9IGZjLT5yZWFkX2liaV9yZWcoZmMsaXJxXzIwYyk7CisKKyAgIC8qIGVycm9ycyAqLworCWlmICh2LmlycV8yMGMuRGF0YV9yZWNlaXZlcl9lcnJvcikKKwkJZGViX2NoaygiZGF0YSByZWNlaXZlciBlcnJvclxuIik7CisJaWYgKHYuaXJxXzIwYy5Db250aW51aXR5X2Vycm9yX2ZsYWcpCisJCWRlYl9jaGsoIkNvbnR1bnVpdHkgZXJyb3IgZmxhZyBpcyBzZXRcbiIpOworCWlmICh2LmlycV8yMGMuTExDX1NOQVBfRkxBR19zZXQpCisJCWRlYl9jaGsoIkxMQ19TTkFQX0ZMQUdfc2V0IGlzIHNldFxuIik7CisJaWYgKHYuaXJxXzIwYy5UcmFuc3BvcnRfRXJyb3IpCisJCWRlYl9jaGsoIlRyYW5zcG9ydCBlcnJvclxuIik7CisKKwlpZiAoKGZjX3BjaS0+Y291bnQgJSAxMDAwKSA9PSAwKQorCQlkZWJfY2hrKCIlZCB2YWxpZCBpcnEgdG9vayBwbGFjZSBzbyBmYXJcbiIsZmNfcGNpLT5jb3VudCk7CisKIAlpZiAodi5pcnFfMjBjLkRNQTFfSVJRX1N0YXR1cyA9PSAxKSB7CiAJCWlmIChmY19wY2ktPmFjdGl2ZV9kbWExX2FkZHIgPT0gMCkKIAkJCWZsZXhjb3BfcGFzc19kbXhfcGFja2V0cyhmY19wY2ktPmZjX2RldixmY19wY2ktPmRtYVswXS5jcHVfYWRkcjAsZmNfcGNpLT5kbWFbMF0uc2l6ZSAvIDE4OCk7CkBAIC0xMTUsOCArMTYxLDkgQEAKIAkJCWZjLT5yZWFkX2liaV9yZWcoZmMsZG1hMV8wMDgpLmRtYV8weDguZG1hX2N1cl9hZGRyIDw8IDI7CiAJCXUzMiBjdXJfcG9zID0gY3VyX2FkZHIgLSBmY19wY2ktPmRtYVswXS5kbWFfYWRkcjA7CiAKLQkJZGViX2lycSgiaXJxOiAlMDh4IGN1cl9hZGRyOiAlMDh4OiBjdXJfcG9zOiAlMDh4LCBsYXN0X2N1cl9wb3M6ICUwOHggIiwKLQkJCQl2LnJhdyxjdXJfYWRkcixjdXJfcG9zLGZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MpOworCQlkZWJfaXJxKCIldSBpcnE6ICUwOHggY3VyX2FkZHI6ICUwOHg6IGN1cl9wb3M6ICUwOHgsIGxhc3RfY3VyX3BvczogJTA4eCAiLAorCQkJCWppZmZpZXNfdG9fdXNlY3MoamlmZmllcyAtIGZjX3BjaS0+bGFzdF9pcnEpLHYucmF3LGN1cl9hZGRyLGN1cl9wb3MsZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3Bvcyk7CisJCWZjX3BjaS0+bGFzdF9pcnEgPSBqaWZmaWVzOwogCiAJCS8qIGJ1ZmZlciBlbmQgd2FzIHJlYWNoZWQsIHJlc3RhcnRlZCBmcm9tIHRoZSBiZWdpbm5pbmcKIAkJICogcGFzcyB0aGUgZGF0YSBmcm9tIGxhc3RfY3VyX3BvcyB0byB0aGUgYnVmZmVyIGVuZCB0byB0aGUgZGVtdXgKQEAgLTEyNyw3ICsxNzQsNiBAQAogCQkJCQlmY19wY2ktPmRtYVswXS5jcHVfYWRkcjAgKyBmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zLAogCQkJCQkoZmNfcGNpLT5kbWFbMF0uc2l6ZSoyKSAtIGZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MpOwogCQkJZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcyA9IDA7Ci0JCQlmY19wY2ktPmNvdW50ID0gMDsKIAkJfQogCiAJCWlmIChjdXJfcG9zID4gZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcykgewpAQCAtMTM5LDE2ICsxODUsMTQgQEAKIAkJZGViX2lycSgiXG4iKTsKIAogCQlmY19wY2ktPmxhc3RfZG1hMV9jdXJfcG9zID0gY3VyX3BvczsKLQl9IGVsc2UKKwkJZmNfcGNpLT5jb3VudCsrOworCX0gZWxzZSB7CisJCWRlYl9pcnEoImlzciBmb3IgZmxleGNvcCBjYWxsZWQsIGFwcGFyZW50bHkgd2l0aG91dCByZWFzb24gKCUwOHgpXG4iLHYucmF3KTsKIAkJcmV0ID0gSVJRX05PTkU7CisJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZmY19wY2ktPmlycV9sb2NrKTsKIAotLyogcGFja2V0IGNvdW50IHdvdWxkIGJlIGlkZWFsIGZvciBodyBmaWx0ZXJpbmcsIGJ1dCBpdCBpc24ndCB3b3JraW5nLiBFaXRoZXIKLSAqIHRoZSBkYXRhIGJvb2sgaXMgd3JvbmcsIG9yIEknbSB1bmFibGUgdG8gcmVhZCBpdCBjb3JyZWN0bHkgKi8KLQotLyoJaWYgKHYuaXJxXzIwYy5ETUExX1NpemVfSVJRX1N0YXR1cyA9PSAxKSB7IHBhY2tldCBjb3VudGVyICovCi0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTYsMzAgKzIwMCwzNSBAQAogewogCXN0cnVjdCBmbGV4Y29wX3BjaSAqZmNfcGNpID0gZmMtPmJ1c19zcGVjaWZpYzsKIAlpZiAob25vZmYpIHsKLQkJZmxleGNvcF9kbWFfY29uZmlnKGZjLCZmY19wY2ktPmRtYVswXSxGQ19ETUFfMSxGQ19ETUFfU1VCQUREUl8wIHwgRkNfRE1BX1NVQkFERFJfMSk7Ci0JCWZsZXhjb3BfZG1hX2NvbmZpZyhmYywmZmNfcGNpLT5kbWFbMV0sRkNfRE1BXzIsRkNfRE1BX1NVQkFERFJfMCB8IEZDX0RNQV9TVUJBRERSXzEpOwotCQlmbGV4Y29wX2RtYV9jb25maWdfdGltZXIoZmMsRkNfRE1BXzEsMSk7CisJCWZsZXhjb3BfZG1hX2NvbmZpZyhmYywmZmNfcGNpLT5kbWFbMF0sRkNfRE1BXzEpOworCQlmbGV4Y29wX2RtYV9jb25maWcoZmMsJmZjX3BjaS0+ZG1hWzFdLEZDX0RNQV8yKTsKIAotCQlpZiAoZmNfcGNpLT5mY19kZXYtPnBpZF9maWx0ZXJpbmcpIHsKLQkJCWZjX3BjaS0+bGFzdF9kbWExX2N1cl9wb3MgPSAwOwotCQkJZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoZmMsRkNfRE1BXzEsMSk7Ci0JCX0gZWxzZSB7Ci0JCQlmY19wY2ktPmFjdGl2ZV9kbWExX2FkZHIgPSAwOwotCQkJZmxleGNvcF9kbWFfY29udHJvbF9zaXplX2lycShmYyxGQ19ETUFfMSwxKTsKLQkJfQorCQlmbGV4Y29wX2RtYV9jb25maWdfdGltZXIoZmMsRkNfRE1BXzEsMCk7CiAKLS8qCQlmbGV4Y29wX2RtYV9jb25maWdfcGFja2V0X2NvdW50KGZjLEZDX0RNQV8xLDB4YzApOwotCQlmbGV4Y29wX2RtYV9jb250cm9sX3BhY2tldF9pcnEoZmMsRkNfRE1BXzEsMSk7ICovCisJCWZsZXhjb3BfZG1hX3hmZXJfY29udHJvbChmYyxGQ19ETUFfMSxGQ19ETUFfU1VCQUREUl8wIHwgRkNfRE1BX1NVQkFERFJfMSwxKTsKKwkJZGViX2lycSgiRE1BIHhmZXIgZW5hYmxlZFxuIik7CiAKLQkJZGViX2lycSgiaXJxcyBlbmFibGVkXG4iKTsKKwkJZmNfcGNpLT5sYXN0X2RtYTFfY3VyX3BvcyA9IDA7CisJCWZsZXhjb3BfZG1hX2NvbnRyb2xfdGltZXJfaXJxKGZjLEZDX0RNQV8xLDEpOworCQlkZWJfaXJxKCJJUlEgZW5hYmxlZFxuIik7CisKKy8vCQlmY19wY2ktPmFjdGl2ZV9kbWExX2FkZHIgPSAwOworLy8JCWZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEoZmMsRkNfRE1BXzEsMSk7CisKKwkJaWYgKGlycV9jaGtfaW50diA+IDApCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZjX3BjaS0+aXJxX2NoZWNrX3dvcmssCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoaXJxX2Noa19pbnR2IDwgMTAwID8gMTAwIDogaXJxX2Noa19pbnR2KSk7CiAJfSBlbHNlIHsKLQkJaWYgKGZjX3BjaS0+ZmNfZGV2LT5waWRfZmlsdGVyaW5nKQotCQkJZmxleGNvcF9kbWFfY29udHJvbF90aW1lcl9pcnEoZmMsRkNfRE1BXzEsMCk7Ci0JCWVsc2UKLQkJCWZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEoZmMsRkNfRE1BXzEsMCk7CisJCWlmIChpcnFfY2hrX2ludHYgPiAwKQorCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZmNfcGNpLT5pcnFfY2hlY2tfd29yayk7CiAKLS8vCQlmbGV4Y29wX2RtYV9jb250cm9sX3BhY2tldF9pcnEoZmMsRkNfRE1BXzEsMCk7Ci0JCWRlYl9pcnEoImlycXMgZGlzYWJsZWRcbiIpOworCQlmbGV4Y29wX2RtYV9jb250cm9sX3RpbWVyX2lycShmYyxGQ19ETUFfMSwwKTsKKwkJZGViX2lycSgiSVJRIGRpc2FibGVkXG4iKTsKKworLy8JCWZsZXhjb3BfZG1hX2NvbnRyb2xfc2l6ZV9pcnEoZmMsRkNfRE1BXzEsMCk7CisKKwkJZmxleGNvcF9kbWFfeGZlcl9jb250cm9sKGZjLEZDX0RNQV8xLEZDX0RNQV9TVUJBRERSXzAgfCBGQ19ETUFfU1VCQUREUl8xLDApOworCQlkZWJfaXJxKCJETUEgeGZlciBkaXNhYmxlZFxuIik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xOTgsNiArMjQ3LDcgQEAKIAlmbGV4Y29wX3NyYW1fc2V0X2Rlc3QoZmNfcGNpLT5mY19kZXYsRkNfU1JBTV9ERVNUX0NBTyAgIHwgRkNfU1JBTV9ERVNUX0NBSSwgRkNfU1JBTV9ERVNUX1RBUkdFVF9ETUEyKTsKIAogCWZjX3BjaS0+aW5pdF9zdGF0ZSB8PSBGQ19QQ0lfRE1BX0lOSVQ7CisKIAlnb3RvIHN1Y2Nlc3M7CiBkbWExX2ZyZWU6CiAJZmxleGNvcF9kbWFfZnJlZSgmZmNfcGNpLT5kbWFbMF0pOwpAQCAtMjQ0LDcgKzI5NCw3IEBACiAKIAlwY2lfc2V0X2RydmRhdGEoZmNfcGNpLT5wZGV2LCBmY19wY2kpOwogCi0JaWYgKChyZXQgPSByZXF1ZXN0X2lycShmY19wY2ktPnBkZXYtPmlycSwgZmxleGNvcF9wY2lfaXJxLAorCWlmICgocmV0ID0gcmVxdWVzdF9pcnEoZmNfcGNpLT5wZGV2LT5pcnEsIGZsZXhjb3BfcGNpX2lzciwKIAkJCQkJU0FfU0hJUlEsIERSSVZFUl9OQU1FLCBmY19wY2kpKSAhPSAwKQogCQlnb3RvIGVycl9wY2lfaW91bm1hcDsKIApAQCAtMzI0LDYgKzM3NCw4IEBACiAJaWYgKChyZXQgPSBmbGV4Y29wX3BjaV9kbWFfaW5pdChmY19wY2kpKSAhPSAwKQogCQlnb3RvIGVycl9mY19leGl0OwogCisJSU5JVF9XT1JLKCZmY19wY2ktPmlycV9jaGVja193b3JrLCBmbGV4Y29wX3BjaV9pcnFfY2hlY2tfd29yaywgZmNfcGNpKTsKKwogCWdvdG8gc3VjY2VzczsKIGVycl9mY19leGl0OgogCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOwpAQCAtMzUwLDE3ICs0MDIsMTcgQEAKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGZsZXhjb3BfcGNpX3RibFtdID0gewogCXsgUENJX0RFVklDRSgweDEzZDAsIDB4MjEwMykgfSwKLS8qCXsgUENJX0RFVklDRSgweDEzZDAsIDB4MjIwMCkgfSwgUENJIEZsZXhDb3BJSUkgPyAqLworLyoJeyBQQ0lfREVWSUNFKDB4MTNkMCwgMHgyMjAwKSB9LCA/ICovCiAJeyB9LAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGZsZXhjb3BfcGNpX3RibCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBmbGV4Y29wX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiVGVjaG5pc2F0L0IyQzIgRmxleENvcCBJSS9JSWIvSUlJIFBDSSIsCisJLm5hbWUgICAgID0gImIyYzJfZmxleGNvcF9wY2kiLAogCS5pZF90YWJsZSA9IGZsZXhjb3BfcGNpX3RibCwKLQkucHJvYmUgPSBmbGV4Y29wX3BjaV9wcm9iZSwKLQkucmVtb3ZlID0gZmxleGNvcF9wY2lfcmVtb3ZlLAorCS5wcm9iZSAgICA9IGZsZXhjb3BfcGNpX3Byb2JlLAorCS5yZW1vdmUgICA9IGZsZXhjb3BfcGNpX3JlbW92ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGZsZXhjb3BfcGNpX21vZHVsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcmVnLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcmVnLmgKaW5kZXggNWUxMzFiZS4uNGFlMWViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXJlZy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1yZWcuaApAQCAtMjEsNyArMjEsOCBAQAogdHlwZWRlZiBlbnVtIHsKIAlGQ19VTksgPSAwLAogCUZDX0FJUl9EVkIsCi0JRkNfQUlSX0FUU0MsCisJRkNfQUlSX0FUU0MxLAorCUZDX0FJUl9BVFNDMiwKIAlGQ19TS1ksCiAJRkNfU0tZX09MRCwKIAlGQ19DQUJMRSwKQEAgLTM1LDU1NSArMzYsMjEgQEAKIGV4dGVybiBjb25zdCBjaGFyICpmbGV4Y29wX2RldmljZV9uYW1lc1tdOwogCiAvKiBGbGV4Q29wIElCSSBSZWdpc3RlcnMgKi8KKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwkjaW5jbHVkZSAiZmxleGNvcF9pYmlfdmFsdWVfbGUuaCIKKyNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCSNpbmNsdWRlICJmbGV4Y29wX2liaV92YWx1ZV9iZS5oIgorI2Vsc2UKKwkjZXJyb3Igbm8gZW5kaWFuIGRlZmluZWQKKyNlbmRpZgogCi0vKiBmbGV4Y29wX2liaV9yZWcgLSBhIGh1Z2UgdW5pb24gcmVwcmVzZW50aW5nIHRoZSByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgdW5pb24gewotCXUzMiByYXc7Ci0KLS8qIERNQSAweDAwMCB0byAweDAxYwotICogRE1BMSAweDAwMCB0byAweDAwYwotICogRE1BMiAweDAxMCB0byAweDAxYwotICovCi0Jc3RydWN0IHsKLQkJdTMyIGRtYV8wc3RhcnQgICAgICAgIDogMTsgICAvKiBzZXQ6IGRhdGEgd2lsbCBiZSBkZWxpdmVyZWQgdG8gZG1hMV9hZGRyZXNzMCAqLwotICAgICAgICB1MzIgZG1hXzBOb191cGRhdGUgICAgOiAxOyAgIC8qIHNldDogZG1hMV9jdXJfYWRkcmVzcyB3aWxsIGJlIHVwZGF0ZWQsIHVuc2V0OiBubyB1cGRhdGUgKi8KLSAgICAgICAgdTMyIGRtYV9hZGRyZXNzMCAgICAgIDozMDsgICAvKiBwaHlzaWNhbC92aXJ0dWFsIGhvc3QgbWVtb3J5IGFkZHJlc3MwIERNQSAqLwotCX0gZG1hXzB4MDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBETUFfbWF4cGFja2V0cyAgICA6IDg7ICAgLyogKHJlbWFwcGVkKSBQQ0kgRE1BMSBQYWNrZXQgQ291bnQgSW50ZXJydXB0LiBUaGlzIHZhcmlhYmxlCi0JCQkJCQkJCQkJaXMgYWJsZSB0byBiZSByZWFkIGFuZCB3cml0dGVuIHdoaWxlIGJpdCgxKSBvZiByZWdpc3RlcgotCQkJCQkJCQkJCTB4MDBjIChyZW1hcF9lbmFibGUpIGlzIHNldC4gVGhpcyB2YXJpYWJsZSByZXByZXNlbnRzCi0JCQkJCQkJCQkJdGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byB0aGUgUENJCi0JCQkJCQkJCQkJaG9zdCB1c2luZyBQQ0kgRE1BMSBiZWZvcmUgYW4gaW50ZXJydXB0IHRvIHRoZSBQQ0kgaXMKLQkJCQkJCQkJCQlhc3NlcnRlZC4gVGhpcyBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbmFibGVkIHVzaW5nIGJpdCgyMCkKLQkJCQkJCQkJCQlvZiByZWdpc3RlciAweDIwOC4gTj0wIGRpc2FibGVzIHRoZSBJUlEuICovCi0JCXUzMiBkbWFfYWRkcl9zaXplICAgICA6MjQ7ICAgLyogc2l6ZSBvZiBtZW1vcnkgYnVmZmVyIGluIERXT1JEcyAoYnl0ZXNpemUgLyA0KSBmb3IgRE1BICovCi0JfSBkbWFfMHg0X3JlbWFwOwotCi0Jc3RydWN0IHsKLQkJdTMyIGRtYTF0aW1lciAgICAgICAgIDogNzsgICAvKiByZWFkaW5nIFBDSSBETUExIHRpbWVyIC4uLiB3aGVuIHJlbWFwX2VuYWJsZSBpcyAwICovCi0JCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDE7Ci0JCXUzMiBkbWFfYWRkcl9zaXplICAgICA6MjQ7Ci0JfSBkbWFfMHg0X3JlYWQ7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiAxOwotCQl1MzIgZG1hdGltZXIgICAgICAgICAgOiA3OyAgIC8qIHdyaXRpbmcgUENJIERNQTEgdGltZXIgLi4uIHdoZW4gcmVtYXBfZW5hYmxlIGlzIDAgKi8KLQkJdTMyIGRtYV9hZGRyX3NpemUgICAgIDoyNDsKLQl9IGRtYV8weDRfd3JpdGU7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiAyOwotCQl1MzIgZG1hX2N1cl9hZGRyICAgICAgOjMwOyAgIC8qIGN1cnJlbnQgcGh5c2ljYWwgaG9zdCBtZW1vcnkgYWRkcmVzcyBwb2ludGVyIGZvciBETUEgKi8KLQl9IGRtYV8weDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgZG1hXzFzdGFydCAgICAgICAgOiAxOyAgIC8qIHNldDogZGF0YSB3aWxsIGJlIGRlbGl2ZXJlZCB0byBkbWFfYWRkcmVzczEsIHdoZW4gZG1hX2FkZHJlc3MwIGlzIGZ1bGwgKi8KLQkJdTMyIHJlbWFwX2VuYWJsZSAgICAgIDogMTsgICAvKiByZW1hcCBlbmFibGUgZm9yIDB4MHg0KDc6MCkgKi8KLQkJdTMyIGRtYV9hZGRyZXNzMSAgICAgIDozMDsgICAvKiBQaHlzaWNhbC92aXJ0dWFsIGFkZHJlc3MgMSBvbiBETUEgKi8KLQl9IGRtYV8weGM7Ci0KLS8qIFR3by13aXJlIFNlcmlhbCBNYXN0ZXIgYW5kIENsb2NrIDB4MTAwLTB4MTEwICovCi0Jc3RydWN0IHsKLS8vCQl1MzIgc2xhdmVfdHJhbnNtaXR0ZXIgOiAxOyAgIC8qID8/PyovCi0JCXUzMiBjaGlwYWRkciAgICAgICAgICA6IDc7ICAgLyogdHdvLWxpbmUgc2VyaWFsIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBzbGF2ZSAqLwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiAxOwotCQl1MzIgYmFzZWFkZHIgICAgICAgICAgOiA4OyAgIC8qIGFkZHJlc3Mgb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSByZWFkL3dyaXRlIG9wZXJhdGlvbiAqLwotCQl1MzIgZGF0YTFfcmVnICAgICAgICAgOiA4OyAgIC8qIGZpcnN0IGJ5dGUgaW4gdHdvLWxpbmUgc2VyaWFsIHJlYWQvd3JpdGUgb3BlcmF0aW9uICovCi0JCXUzMiB3b3JraW5nX3N0YXJ0ICAgICA6IDE7ICAvKiB3aGVuIGRvaW5nIGEgd3JpdGUgb3BlcmF0aW9uIHRoaXMgaW5kaWNhdG9yIGlzIDAgd2hlbiByZWFkeQotCQkJCQkJCQkJICAqIHNldCB0byAxIHdoZW4gZG9pbmcgYSB3cml0ZSBvcGVyYXRpb24gKi8KLQkJdTMyIHR3b1dTX3J3ICAgICAgICAgIDogMTsgICAvKiByZWFkL3dyaXRlIGluZGljYXRvciAoMSA9IHJlYWQsIDAgd3JpdGUpICovCi0JCXUzMiB0b3RhbF9ieXRlcyAgICAgICA6IDI7ICAgLyogbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gZWFjaCB0d28tbGluZSBzZXJpYWwgdHJhbnNhY3Rpb24gKDAgPSAxIGJ5dGUsIDExID0gNGJ5dGUpKi8KLQkJdTMyIHR3b1dTX3BvcnRfcmVnICAgIDogMjsgICAvKiBwb3J0IHNlbGVjdGlvbjogMDEgLSBGcm9udCBFbmQvRGVtb2QsIDEwIC0gRUVQUk9NLCAxMSAtIFR1bmVyICovCi0JCXUzMiBub19iYXNlX2FkZHJfYWNrX2Vycm9yIDogMTsgICAvKiB3cml0aW5nOiB3cml0ZS1yZXE6IGZyYW1lIGlzIHByb2R1Y2VkIHcvbyBiYXNlYWRkciwgcmVhZC1yZXE6IHJlYWQtY3ljbGVzIHcvbwotCQkJCQkJCQkJICAqIHByZWNlZGluZyBhZGRyZXNzIGFzc2lnbm1lbnQgd3JpdGUgZnJhbWUKLQkJCQkJCQkJCSAgKiBBQ0tfRVJST1IgPSAxIHdoZW4gbm8gQUNLIGZyb20gc2xhdmUgaW4gdGhlIGxhc3QgdHJhbnNhY3Rpb24gKi8KLQkJdTMyIHN0X2RvbmUgICAgICAgICAgIDogMTsgICAvKiBpbmRpY2F0b3IgZm9yIHRyYW5zYWN0aW9uIGlzIGRvbmUgKi8KLQl9IHR3X3NtX2NfMTAwOwotCi0Jc3RydWN0IHsKLQkJdTMyIGRhdGEyX3JlZyAgICAgICAgIDogODsgICAvKiAybmQgZGF0YSBieXRlICovCi0JCXUzMiBkYXRhM19yZWcgICAgICAgICA6IDg7ICAgLyogM3JkIGRhdGEgYnl0ZSAqLwotCQl1MzIgZGF0YTRfcmVnICAgICAgICAgOiA4OyAgIC8qIDR0aCBkYXRhIGJ5dGUgKi8KLQkJdTMyIGV4bGljaXRfc3RvcHMgICAgIDogMTsgICAvKiB3aGVuIHNldCwgdHJhbnNhY3Rpb25zIGFyZSBwcm9kdWNlZCB3L28gdHJhaWxpbmcgU1RPUCBmbGFnLCB0aGVuIHNlbmQgaXNvbGF0ZWQgU1RPUCBmbGFncyAqLwotCQl1MzIgZm9yY2Vfc3RvcCAgICAgICAgOiAxOyAgIC8qIGlzb2xhdGVkIHN0b3AgZmxhZyAqLwotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiA2OwotCX0gdHdfc21fY18xMDQ7Ci0KLS8qIENsb2NrLiBUaGUgcmVnaXN0ZXIgYWxsb3dzIHRoZSBGQ0lJSSB0byBjb252ZXJ0IGFuIGluY29taW5nIE1hc3RlciBjbG9jawotICogKE1DTEspIHNpZ25hbCBpbnRvIGEgbG93ZXIgZnJlcXVlbmN5IGNsb2NrIHRocm91Z2ggdGhlIHVzZSBvZiBhIExvd0NvdW50ZXIKLSAqIChUTE8pIGFuZCBhIEhpZ2gtIENvdW50ZXIgKFRISSkuIFRoZSB0aW1lIGNvdW50cyBmb3IgVEhJIGFuZCBUTE8gYXJlCi0gKiBtZWFzdXJlZCBpbiBNQ0xLOyBlYWNoIGNvdW50IHJlcHJlc2VudHMgNCBNQ0xLIGlucHV0IGNsb2NrIGN5Y2xlcy4KLSAqCi0gKiBUaGUgZGVmYXVsdCBvdXRwdXQgZm9yIHBvcnQgIzEgaXMgc2V0IGZvciBGcm9udCBFbmQgRGVtb2QgY29tbXVuaWNhdGlvbi4gKDB4MTA4KQotICogVGhlIGRlZmF1bHQgb3V0cHV0IGZvciBwb3J0ICMyIGlzIHNldCBmb3IgRUVQUk9NIGNvbW11bmljYXRpb24uICgweDEwYykKLSAqIFRoZSBkZWZhdWx0IG91dHB1dCBmb3IgcG9ydCAjMyBpcyBzZXQgZm9yIFR1bmVyIGNvbW11bmljYXRpb24uICgweDExMCkKLSAqLwotCXN0cnVjdCB7Ci0JCXUzMiB0aGkxICAgICAgICAgICAgICA6IDY7ICAgLyogVGhpIGZvciBwb3J0ICMxIChkZWY6IDEwMDExMGI7IDM4KSAqLwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiAyOwotCQl1MzIgdGxvMSAgICAgICAgICAgICAgOiA1OyAgIC8qIFRsbyBmb3IgcG9ydCAjMSAoZGVmOiAxMTEwMGI7IDI4KSAqLwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOjE5OwotCX0gdHdfc21fY18xMDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgdGhpMSAgICAgICAgICAgICAgOiA2OyAgIC8qIFRoaSBmb3IgcG9ydCAjMiAoZGVmOiAxMTEwMDFiOyA1NykgKi8KLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMjsKLQkJdTMyIHRsbzEgICAgICAgICAgICAgIDogNTsgICAvKiBUbG8gZm9yIHBvcnQgIzIgKGRlZjogMTExMDBiOyAyOCkgKi8KLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDoxOTsKLQl9IHR3X3NtX2NfMTBjOwotCi0Jc3RydWN0IHsKLQkJdTMyIHRoaTEgICAgICAgICAgICAgIDogNjsgICAvKiBUaGkgZm9yIHBvcnQgIzMgKGRlZjogMTExMDAxYjsgNTcpICovCi0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDI7Ci0JCXUzMiB0bG8xICAgICAgICAgICAgICA6IDU7ICAgLyogVGxvIGZvciBwb3J0ICMzIChkZWY6IDExMTAwYjsgMjgpICovCi0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6MTk7Ci0JfSB0d19zbV9jXzExMDsKLQotLyogTE5CIFN3aXRjaCBGcmVxdWVuY3kgMHgyMDAKLSAqIENsb2NrIHRoYXQgY3JlYXRlcyB0aGUgTE5CIHN3aXRjaCB0b25lLiBUaGUgZGVmYXVsdCBpcyBzZXQgdG8gaGF2ZSBhIGZpeGVkCi0gKiBsb3cgb3V0cHV0IChub3Qgb3NjaWxsYXRpbmcpIHRvIHRoZSBMTkJfQ1RMIGxpbmUuCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgTE5CX0NUTEhpZ2hDb3VudF9zaWcgOjE1OyAvKiBJdCBpcyB0aGUgbnVtYmVyIG9mIHByZS1zY2FsZWQgY2xvY2sgY3ljbGVzIHRoYXQgd2lsbCBiZSBsb3cuICovCi0JCXUzMiBMTkJfQ1RMTG93Q291bnRfc2lnICA6MTU7IC8qIEZvciBleGFtcGxlLCB0byBvYnRhaW4gYSAyMktIeiBvdXRwdXQgZ2l2ZW4gYSA0NSBNaHogTWFzdGVyCi0JCQkJCQkJCQkJQ2xvY2sgc2lnbmFsIChNQ0xLKSwgc2V0IFByZVNjYWxhcj0wMSBhbmQgTG93Q291bnRlciB2YWx1ZSB0byAweDFmZi4gKi8KLQkJdTMyIExOQl9DVExQcmVzY2FsZXJfc2lnIDogMjsgLyogcHJlLXNjYWxlciBkaXZpZGVzIE1DTEs6IDAwIChubyBkaXZpc2lvbiksIDAxIGJ5IDIsIDEwIGJ5IDQsIDExIGJ5IDEyICovCi0JfSBsbmJfc3dpdGNoX2ZyZXFfMjAwOwotCi0vKiBBQ1BJLCBQZXJpcGhlcmFsIFJlc2V0LCBMTkIgUG9sYXJpdHkKLSAqIEFDUEkgcG93ZXIgY29uc2VydmF0aW9uIG1vZGUsIExOQiBwb2xhcml0eSBzZWxlY3Rpb24gKGxvdyBvciBoaWdoIHZvbHRhZ2UpLAotICogYW5kIHBlcmlwaGVyYWwgcmVzZXQuCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgQUNQSTFfc2lnICAgICAgICAgOiAxOyAgIC8qIHR1cm4gb2YgdGhlIHBvd2VyIG9mIHR1bmVyIGFuZCBMTkIsIG5vdCBpbXBsZW1lbnRlZCBpbiBGQ0lJSSAqLwotCQl1MzIgQUNQSTNfc2lnICAgICAgICAgOiAxOyAgIC8qIHR1cm4gb2YgcG93ZXIgb2YgdGhlIGNvbXBsZXRlIHNhdGVsaXRlIHJlY2VpdmVyIGJvYXJkIChleGNlcHQgRkNJSUkpICovCi0JCXUzMiBMTkJfTF9IX3NpZyAgICAgICA6IDE7ICAgLyogbG93IG9yIGhpZ2ggdm9sdGFnZSBmb3IgTE5CLiAoMCA9IGxvdywgMSA9IGhpZ2gpICovCi0JCXUzMiBQZXJfcmVzZXRfc2lnICAgICA6IDE7ICAgLyogbWlzYy4gaW5pdCByZXNldCAoZGVmYXVsdDogMSksIHRvIHJlc2V0IHNldCB0byBsb3cgYW5kIGJhY2sgdG8gaGlnaCAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOjIwOwotCQl1MzIgUmV2X05fc2lnX3JldmlzaW9uX2hpIDogNDsvKiAweGMgaW4gY2FzZSBvZiBGQ0lJSSAqLwotCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMSA6IDI7Ci0JCXUzMiBSZXZfTl9zaWdfY2FwcyAgICA6IDE7ICAgLyogaWYgMSwgRkNJSUkgaGFzIDMyIFBJRC0gYW5kIE1BQy1maWx0ZXJzIGFuZCBpcyBjYXBhYmxlIG9mIElQIG11bHRpY2FzdCAqLwotCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMiA6IDE7Ci0JfSBtaXNjXzIwNDsKLQotLyogQ29udHJvbCBhbmQgU3RhdHVzIDB4MjA4IHRvIDB4MjFjICovCi0vKiBHcm9zcyBlbmFibGUgYW5kIGRpc2FibGUgY29udHJvbCAqLwotCXN0cnVjdCB7Ci0JCXUzMiBTdHJlYW0xX2ZpbHRlcl9zaWcgOiAxOyAgLyogU3RyZWFtMSBQSUQgZmlsdGVyaW5nICovCi0JCXUzMiBTdHJlYW0yX2ZpbHRlcl9zaWcgOiAxOyAgLyogU3RyZWFtMiBQSUQgZmlsdGVyaW5nICovCi0JCXUzMiBQQ1JfZmlsdGVyX3NpZyAgICA6IDE7ICAgLyogUENSIFBJRCBmaWx0ZXIgKi8KLQkJdTMyIFBNVF9maWx0ZXJfc2lnICAgIDogMTsgICAvKiBQTVQgUElEIGZpbHRlciAqLwotCi0JCXUzMiBFTU1fZmlsdGVyX3NpZyAgICA6IDE7ICAgLyogRU1NIFBJRCBmaWx0ZXIgKi8KLQkJdTMyIEVDTV9maWx0ZXJfc2lnICAgIDogMTsgICAvKiBFQ00gUElEIGZpbHRlciAqLwotCQl1MzIgTnVsbF9maWx0ZXJfc2lnICAgOiAxOyAgIC8qIEZpbHRlcnMgbnVsbCBwYWNrZXRzLCBQSUQ9MHgxZmZmLiAqLwotCQl1MzIgTWFza19maWx0ZXJfc2lnICAgOiAxOyAgIC8qIG1hc2sgUElEIGZpbHRlciAqLwotCi0JCXUzMiBXQU5fRW5hYmxlX3NpZyAgICA6IDE7ICAgLyogV0FOIG91dHB1dCBsaW5lIHRocm91Z2ggVjggbWVtb3J5IHNwYWNlIGlzIGFjdGl2YXRlZC4gKi8KLQkJdTMyIFdBTl9DQV9FbmFibGVfc2lnIDogMTsgICAvKiBub3QgaW4gRkNJSUkgKi8KLQkJdTMyIENBX0VuYWJsZV9zaWcgICAgIDogMTsgICAvKiBub3QgaW4gRkNJSUkgKi8KLQkJdTMyIFNNQ19FbmFibGVfc2lnICAgIDogMTsgICAvKiBDSSBzdHJlYW0gZGF0YSAoQ0FJKSBnb2VzIGRpcmVjdGx5IHRvIHRoZSBzbWFydCBjYXJkIGludGYgKG9wcG9zZWQgSUJJIDB4NjAwIG9yIFNDLWNtZCBidWYpLiAqLwotCi0JCXUzMiBQZXJfQ0FfRW5hYmxlX3NpZyA6IDE7ICAgLyogbm90IGluIEZDSUlJICovCi0JCXUzMiBNdWx0aTJfRW5hYmxlX3NpZyA6IDE7ICAgLyogPyAqLwotCQl1MzIgTUFDX2ZpbHRlcl9Nb2RlX3NpZyA6IDE7IC8qIChNQUNfZmlsdGVyX2VuYWJsZSkgR2xvYmFsbHkgZW5hYmxlcyBNQUMgZmlsdGVycyBmb3IgTmV0IFBJRCBmaWx0ZXJlcy4gKi8KLQkJdTMyIFJjdl9EYXRhX3NpZyAgICAgIDogMTsgICAvKiBQSUQgZmlsdGVyaW5nIG1vZHVsZSBlbmFibGUuIFdoZW4gdGhpcyBiaXQgaXMgYSBvbmUsIHRoZSBQSUQgZmlsdGVyIHdpbGwKLQkJCQkJCQkJCQlleGFtaW5lIGFuZCBwcm9jZXNzIHBhY2tldHMgYWNjb3JkaW5nIHRvIGFsbCBvdGhlciAoaW5kaXZpZHVhbCkgUElECi0JCQkJCQkJCQkJZmlsdGVyaW5nIGNvbnRyb2xzLiBJZiBpdCBhIHplcm8sIG5vIHBhY2tldCBwcm9jZXNzaW5nIG9mIGFueSBraW5kIHdpbGwKLQkJCQkJCQkJCQl0YWtlIHBsYWNlLiBBbGwgZGF0YSBmcm9tIHRoZSB0dW5lciB3aWxsIGJlIHRocm93biBhd2F5LiAqLwotCi0JCXUzMiBETUExX0lSUV9FbmFibGVfc2lnIDogMTsgLyogV2hlbiBzZXQsIGEgRFdPUkQgY291bnRlciBpcyBlbmFibGVkIG9uIFBDSSBETUExIHRoYXQgYXNzZXJ0cyB0aGUgUENJCi0JCQkJCQkJCQkgICogaW50ZXJydXB0IGFmdGVyIHRoZSBzcGVjaWZpZWQgY291bnQgZm9yIGZpbGxpbmcgdGhlIGJ1ZmZlci4gKi8KLQkJdTMyIERNQTFfVGltZXJfRW5hYmxlX3NpZyA6IDE7IC8qIFdoZW4gc2V0LCBhIHRpbWVyIGlzIGVuYWJsZWQgb24gUENJIERNQTEgdGhhdCBhc3NlcnRzIHRoZSBQQ0kgaW50ZXJydXB0Ci0JCQkJCQkJCQkJCWFmdGVyIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lLiAqLwotCQl1MzIgRE1BMl9JUlFfRW5hYmxlX3NpZyA6IDE7ICAgLyogc2FtZSBhcyBETUExX0lSUV9FbmFibGVfc2lnIGJ1dCBmb3IgRE1BMiAqLwotCQl1MzIgRE1BMl9UaW1lcl9FbmFibGVfc2lnIDogMTsgICAvKiBzYW1lIGFzIERNQTFfVGltZXJfRW5hYmxlX3NpZyBidXQgZm9yIERNQTIgKi8KLQotCQl1MzIgRE1BMV9TaXplX0lSUV9FbmFibGVfc2lnIDogMTsgLyogV2hlbiBzZXQsIGEgcGFja2V0IGNvdW50IGRldGVjdG9yIGlzIGVuYWJsZWQgb24gUENJIERNQTEgdGhhdCBhc3NlcnRzIHRoZSBQQ0kgaW50ZXJydXB0LiAqLwotCQl1MzIgRE1BMl9TaXplX0lSUV9FbmFibGVfc2lnIDogMTsgLyogV2hlbiBzZXQsIGEgcGFja2V0CWNvdW50IGRldGVjdG9yIGlzIGVuYWJsZWQgb24gUENJIERNQTIgdGhhdCBhc3NlcnRzIHRoZSBQQ0kgaW50ZXJydXB0LiAqLwotCQl1MzIgTWFpbGJveF9mcm9tX1Y4X0VuYWJsZV9zaWc6IDE7IC8qIFdoZW4gc2V0LCB3cml0ZXMgdG8gdGhlIG1haWxib3ggcmVnaXN0ZXIgcHJvZHVjZSBhbiBpbnRlcnJ1cHQgdG8gdGhlCi0JCQkJCQkJCQkJCVBDSSBob3N0IHRvIGluZGljYXRlIHRoYXQgbWFpbGJveCBkYXRhIGlzIGF2YWlsYWJsZS4gKi8KLQotCQl1MzIgdW51c2VkICAgICAgICAgICAgOiA5OwotCX0gY3RybF8yMDg7Ci0KLS8qIEdlbmVyYWwgc3RhdHVzLiBXaGVuIGEgUENJIGludGVycnVwdCBvY2N1cnMsIHRoaXMgcmVnaXN0ZXIgaXMgcmVhZCB0bwotICogZGlzY292ZXIgdGhlIHJlYXNvbiBmb3IgdGhlIGludGVycnVwdC4KLSAqLwotCXN0cnVjdCB7Ci0JCXUzMiBETUExX0lSUV9TdGF0dXMgICA6IDE7ICAgLyogV2hlbiBzZXQoMSkgdGhlIERNQTEgY291bnRlciBoYWQgZ2VuZXJhdGVkIGFuIElSUS4gUmVhZCBPbmx5LiAqLwotCQl1MzIgRE1BMV9UaW1lcl9TdGF0dXMgOiAxOyAgIC8qIFdoZW4gc2V0KDEpIHRoZSBETUExIHRpbWVyIGhhZCBnZW5lcmF0ZWQgYW4gSVJRLiBSZWFkIE9ubHkuICovCi0JCXUzMiBETUEyX0lSUV9TdGF0dXMgICA6IDE7ICAgLyogV2hlbiBzZXQoMSkgdGhlIERNQTIgY291bnRlciBoYWQgZ2VuZXJhdGVkIGFuIElSUS4gUmVhZCBPbmx5LiAqLwotCQl1MzIgRE1BMl9UaW1lcl9TdGF0dXMgOiAxOyAgIC8qIFdoZW4gc2V0KDEpIHRoZSBETUEyIHRpbWVyIGhhZCBnZW5lcmF0ZWQgYW4gSVJRLiBSZWFkIE9ubHkuICovCi0JCXUzMiBETUExX1NpemVfSVJRX1N0YXR1cyA6IDE7IC8qIChSZWFkIG9ubHkpLiBUaGlzIHJlZ2lzdGVyIGlzIHJlYWQgYWZ0ZXIgYW4gaW50ZXJydXB0IHRvICovCi0JCXUzMiBETUEyX1NpemVfSVJRX1N0YXR1cyA6IDE7IC8qIGZpbmQgb3V0IHdoeSB3ZSBoYWQgYW4gSVJRLiBSZWFkaW5nIHRoaXMgcmVnaXN0ZXIgd2lsbCBjbGVhciB0aGlzIGJpdC4gUGFja2V0IGNvdW50Ki8KLQkJdTMyIE1haWxib3hfZnJvbV9WOF9TdGF0dXNfc2lnOiAxOyAvKiBTYW1lIGFzIGFib3ZlLiBSZWFkaW5nIHRoaXMgcmVnaXN0ZXIgd2lsbCBjbGVhciB0aGlzIGJpdC4gKi8KLQkJdTMyIERhdGFfcmVjZWl2ZXJfZXJyb3IgOiAxOyAvKiAxIGluZGljYXRlIGFuIGVycm9yIGluIHRoZSByZWNlaXZlciBGcm9udCBFbmQgKFR1bmVyIG1vZHVsZSkgKi8KLQkJdTMyIENvbnRpbnVpdHlfZXJyb3JfZmxhZyA6IDE7ICAgLyogMSBpbmRpY2F0ZXMgYSBjb250aW51aXR5IGVycm9yIGluIHRoZSBUUyBzdHJlYW0uICovCi0JCXUzMiBMTENfU05BUF9GTEFHX3NldCA6IDE7ICAgLyogMSBpbmRpY2F0ZXMgdGhhdCB0aGUgTENDX1NOQVBfRkxBRyB3YXMgc2V0LiAqLwotCQl1MzIgVHJhbnNwb3J0X0Vycm9yICAgOiAxOyAgIC8qICBXaGVuIHNldCBpbmRpY2F0ZXMgdGhhdCBhbiB1bmV4cGVjdGVkIHBhY2tldCB3YXMgcmVjZWl2ZWQuICovCi0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6MjE7Ci0JfSBpcnFfMjBjOwotCi0KLS8qIFNvZnR3YXJlIHJlc2V0IHJlZ2lzdGVyICovCi0Jc3RydWN0IHsKLQkJdTMyIHJlc2V0X2Jsb2NrcyAgICAgIDogODsgICAvKiBFbmFibGVkIHdoZW4gQmxvY2tfcmVzZXRfZW5hYmxlID0gMHhCMiBhbmQgMHgyMDggYml0cyAxNTo4ID0gMHgwMC4KLQkJCQkJCQkJCQlFYWNoIGJpdCBsb2NhdGlvbiByZXByZXNlbnRzIGEgMHgxMDAgYmxvY2sgb2YgcmVnaXN0ZXJzLiBXcml0aW5nCi0JCQkJCQkJCQkJYSBvbmUgaW4gYSBiaXQgbG9jYXRpb24gcmVzZXRzIHRoYXQgYmxvY2sgb2YgcmVnaXN0ZXJzIGFuZCB0aGUgbG9naWMKLQkJCQkJCQkJCQl0aGF0IGl0IGNvbnRyb2xzLiAqLwotCQl1MzIgQmxvY2tfcmVzZXRfZW5hYmxlIDogODsgIC8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDB4QjIgd2hlbiB0aGUgcmVnaXN0ZXIgaXMgd3JpdHRlbi4gKi8KLQkJdTMyIFNwZWNpYWxfY29udHJvbHMgIDoxNjsgICAvKiBBc3NlcnRzIFJlc2V0X1Y4ID0+IDB4QzI1ODsgVHVybnMgb24gcGNpIGVuY3J5cHRpb24gPT4gMHhDMjVBOwotCQkJCQkJCQkJCVR1cm5zIG9mZiBwY2kgZW5jcnlwdGlvbiA9PiAweEMyNTkgTm90ZTogcGNpX2VuY3J5cHRpb24gZGVmYXVsdAotCQkJCQkJCQkJCWF0IHBvd2VyLXVwIGlzIE9OLiAqLwotCX0gc3dfcmVzZXRfMjEwOwotCi0Jc3RydWN0IHsKLQkJdTMyIHZ1YXJ0X29lX3NpZyAgICAgIDogMTsgICAvKiBXaGVuIGNsZWFyLCB0aGUgVjggcHJvY2Vzc29yIGhhcyBzb2xlIGNvbnRyb2wgb2YgdGhlIHNlcmlhbCBVQVJUCi0JCQkJCQkJCQkJKFJTLTIzMiBTbWFydCBDYXJkIGludGVyZmFjZSkuIFdoZW4gc2V0LCB0aGUgSUJJIGludGVyZmFjZQotCQkJCQkJCQkJCWRlZmluZWQgYnkgcmVnaXN0ZXIgMHg2MDAgY29udHJvbHMgdGhlIHNlcmlhbCBVQVJULiAqLwotCQl1MzIgdjJXU19vZV9zaWcgICAgICAgOiAxOyAgIC8qIFdoZW4gY2xlYXIsIHRoZSBWOCBwcm9jZXNzb3IgaGFzIGRpcmVjdCBjb250cm9sIG9mIHRoZSBUd28tbGluZQotCQkJCQkJCQkJCVNlcmlhbCBNYXN0ZXIgRUVQUk9NIHRhcmdldC4gV2hlbiBzZXQsIHRoZSBUd28tbGluZSBTZXJpYWwgTWFzdGVyCi0JCQkJCQkJCQkJRUVQUk9NIHRhcmdldCBpbnRlcmZhY2UgaXMgY29udHJvbGxlZCBieSBJQkkgcmVnaXN0ZXIgMHgxMDAuICovCi0JCXUzMiBoYWx0X1Y4X3NpZyAgICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIGNvbnRpZ3VvdXMgd2FpdCBzdGF0ZXMgYXJlIGFwcGxpZWQgdG8gdGhlIFY4LXNwYWNlCi0JCQkJCQkJCQkJYnVzIG1hc3RlcnMuIE9uY2UgdGhpcyBzaWduYWwgaXMgY2xlYXJlZCwgbm9ybWFsIFY4LXNwYWNlCi0JCQkJCQkJCQkJb3BlcmF0aW9ucyByZXN1bWUuICovCi0JCXUzMiBzZWN0aW9uX3BrZ19lbmFibGVfc2lnOiAxOyAvKiBXaGVuIHNldCwgdGhpcyBzaWduYWwgZW5hYmxlcyB0aGUgZnJvbnQgZW5kIHRyYW5zbGF0aW9uIGNpcmN1aXRyeQotCQkJCQkJCQkJCSAgdG8gcHJvY2VzcyBzZWN0aW9uIHBhY2tlZCB0cmFuc3BvcnQgc3RyZWFtcy4gKi8KLQkJdTMyIHMycF9zZWxfc2lnICAgICAgIDogMTsgICAvKiBTZXJpYWwgdG8gcGFyYWxsZWwgY29udmVyc2lvbi4gV2hlbiBzZXQsIHBvbGFyaXplZCB0cmFuc3BvcnQgZGF0YQotCQkJCQkJCQkJCXdpdGhpbiB0aGUgRmxleENvcDMgZnJvbnQgZW5kIGNpcmN1aXRyeSBpcyBjb252ZXJ0ZWQgZnJvbSBhIHNlcmlhbAotCQkJCQkJCQkJCXN0cmVhbSBpbnRvIHBhcmFsbGVsIGRhdGEgYmVmb3JlIGRvd25zdHJlYW0gcHJvY2Vzc2luZyBvdGhlcndpc2UKLQkJCQkJCQkJCQlpbnRlcnByZXRzIHRoZSBkYXRhLiAqLwotCQl1MzIgdW51c2VkMSAgICAgICAgICAgOiAzOwotCQl1MzIgcG9sYXJpdHlfUFNfQ0xLX3NpZzogMTsgIC8qIFRoaXMgc2lnbmFsIGlzIHVzZWQgdG8gaW52ZXJ0IHRoZSBpbnB1dCBwb2xhcml0eSBvZiB0aGUgdHJhbnBvcnQKLQkJCQkJCQkJCQlzdHJlYW0gQ0xPQ0sgc2lnbmFsIGJlZm9yZSBhbnkgcHJvY2Vzc2luZyBvY2N1cnMgb24gdGhlIHRyYW5zcG9ydAotCQkJCQkJCQkJCXN0cmVhbSB3aXRoaW4gRmxleENvcDMuICovCi0JCXUzMiBwb2xhcml0eV9QU19WQUxJRF9zaWc6IDE7IC8qIFRoaXMgc2lnbmFsIGlzIHVzZWQgdG8gaW52ZXJ0IHRoZSBpbnB1dCBwb2xhcml0eSBvZiB0aGUgdHJhbnBvcnQKLQkJCQkJCQkJCQlzdHJlYW0gVkFMSUQgc2lnbmFsIGJlZm9yZSBhbnkgcHJvY2Vzc2luZyBvY2N1cnMgb24gdGhlIHRyYW5zcG9ydAotCQkJCQkJCQkJCXN0cmVhbSB3aXRoaW4gRmxleENvcDMuICovCi0JCXUzMiBwb2xhcml0eV9QU19TWU5DX3NpZzogMTsgLyogVGhpcyBzaWduYWwgaXMgdXNlZCB0byBpbnZlcnQgdGhlIGlucHV0IHBvbGFyaXR5IG9mIHRoZSB0cmFucG9ydAotCQkJCQkJCQkJCXN0cmVhbSBTWU5DIHNpZ25hbCBiZWZvcmUgYW55IHByb2Nlc3Npbmcgb2NjdXJzIG9uIHRoZSB0cmFuc3BvcnQKLQkJCQkJCQkJCQlzdHJlYW0gd2l0aGluIEZsZXhDb3AzLiAqLwotCQl1MzIgcG9sYXJpdHlfUFNfRVJSX3NpZzogMTsgIC8qIFRoaXMgc2lnbmFsIGlzIHVzZWQgdG8gaW52ZXJ0IHRoZSBpbnB1dCBwb2xhcml0eSBvZiB0aGUgdHJhbnBvcnQKLQkJCQkJCQkJCQlzdHJlYW0gRVJST1Igc2lnbmFsIGJlZm9yZSBhbnkgcHJvY2Vzc2luZyBvY2N1cnMgb24gdGhlIHRyYW5zcG9ydAotCQkJCQkJCQkJCXN0cmVhbSB3aXRoaW4gRmxleENvcDMuICovCi0JCXUzMiB1bnVzZWQyICAgICAgICAgICA6MjA7Ci0JfSBtaXNjXzIxNDsKLQotLyogTWFpbGJveCBmcm9tIFY4IHRvIGhvc3QgKi8KLQlzdHJ1Y3QgewotCQl1MzIgTWFpbGJveF9mcm9tX1Y4ICAgOjMyOyAgIC8qIFdoZW4gdGhpcyByZWdpc3RlciBpcyB3cml0dGVuIGJ5IGVpdGhlciB0aGUgVjggcHJvY2Vzc29yIG9yIGJ5IGFuCi0JCQkJCQkJCQkJZW5kIGhvc3QsIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgdG8gdGhlIFBDSSBob3N0IHRvIGluZGljYXRlCi0JCQkJCQkJCQkJdGhhdCBtYWlsYm94IGRhdGEgaXMgYXZhaWxhYmxlLiBSZWFkaW5nIHJlZ2lzdGVyIDIwYyB3aWxsIGNsZWFyCi0JCQkJCQkJCQkJdGhlIElSUS4gKi8KLQl9IG1ib3hfdjhfdG9faG9zdF8yMTg7Ci0KLS8qIE1haWxib3ggZnJvbSBob3N0IHRvIHY4IE1haWxib3hfdG9fVjgKLSAqIE1haWxib3hfdG9fVjggbWFpbGJveCBzdG9yYWdlIHJlZ2lzdGVyCi0gKiB1c2VkIHRvIHNlbmQgbWVzc2FnZXMgZnJvbSBQQ0kgdG8gVjguIFdyaXRpbmcgdG8gdGhpcyByZWdpc3RlciB3aWxsIHNlbmQgYW4KLSAqIElSUSB0byB0aGUgVjguIFRoZW4gaXQgY2FuIHJlYWQgdGhlIGRhdGEgZnJvbSBoZXJlLiBSZWFkaW5nIHRoaXMgcmVnaXN0ZXIKLSAqIHdpbGwgY2xlYXIgdGhlIElSUS4gSWYgdGhlIFY4IGlzIGhhbHRlZCBhbmQgYml0IDMxIG9mIHRoaXMgcmVnaXN0ZXIgaXMgc2V0LAotICogdGhlbiB0aGlzIHJlZ2lzdGVyIGlzIHVzZWQgaW5zdGVhZCBhcyBhIGRpcmVjdCBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZQotICogVjhzcGFjZSBtZW1vcnkuCi0gKi8KLQlzdHJ1Y3QgewotCQl1MzIgc3lzcmFtYWNjZXNzX2RhdGEgOiA4OyAgIC8qIERhdGEgYnl0ZSB3cml0dGVuIG9yIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgaW4gVjggU3lzUkFNLiAqLwotCQl1MzIgc3lzcmFtYWNjZXNzX2FkZHIgOjE1OyAgIC8qIDE1IGJpdCBhZGRyZXNzIHVzZWQgdG8gYWNjZXNzIFY4IFN5cy1SQU0uICovCi0JCXUzMiB1bnVzZWQgICAgICAgICAgICA6IDc7Ci0JCXUzMiBzeXNyYW1hY2Nlc3Nfd3JpdGU6IDE7ICAgLyogV3JpdGUgZmxhZyB1c2VkIHRvIGxhdGNoIGRhdGEgaW50byB0aGUgVjggU3lzUkFNLiAqLwotCQl1MzIgc3lzcmFtYWNjZXNzX2J1c211c3RlcjogMTsgLyogU2V0dGluZyB0aGlzIGJpdCB3aGVuIHRoZSBWOCBpcyBoYWx0ZWQgYXQgMHgyMTQgQml0KDIpIGFsbG93cwotCQkJCQkJCQkJCSAgdGhpcyBJQkkgcmVnaXN0ZXIgaW50ZXJmYWNlIHRvIGRpcmVjdGx5IGRyaXZlIHRoZSBWOC1zcGFjZSBtZW1vcnkuICovCi0JfSBtYm94X2hvc3RfdG9fdjhfMjFjOwotCi0KLS8qIFBJRHMsIFRyYW5zbGF0aW9uIEJpdCwgU01DIEZpbHRlciBTZWxlY3QgMHgzMDAgdG8gMHgzMWMgKi8KLQlzdHJ1Y3QgewotCQl1MzIgU3RyZWFtMV9QSUQgICAgICAgOjEzOyAgIC8qIFByaW1hcnkgdXNlIGlzIHJlY2VpdmluZyBOZXQgZGF0YSwgc28gdGhlc2UgMTMgYml0cyBub3JtYWxseQotCQkJCQkJCQkJCWhvbGQgdGhlIFBJRCB2YWx1ZSBmb3IgdGhlIGRlc2lyZWQgbmV0d29yayBzdHJlYW0uICovCi0JCXUzMiBTdHJlYW0xX3RyYW5zICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIE5ldCB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIE5ldCBkYXRhIGZlcnJpZWQgaW4gVFMgcGFja2V0cy4gKi8KLQkJdTMyIE1BQ19NdWx0aWNhc3RfZmlsdGVyIDogMTsgICAvKiBXaGVuIGNsZWFyLCBtdWx0aWNhc3QgTUFDIGZpbHRlcmluZyBpcyBub3QgYWxsb3dlZCBmb3IgU3RyZWFtMSBhbmQgUElEX24gZmlsdGVycy4gKi8KLQkJdTMyIGRlYnVnX2ZsYWdfcGlkX3NhdmVkIDogMTsKLQkJdTMyIFN0cmVhbTJfUElEICAgICAgIDoxMzsgICAvKiAxMyBiaXRzIGZvciBTdHJlYW0gMiBQSUQgZmlsdGVyIHZhbHVlLiBHZW5lcmFsIHVzZS4gKi8KLQkJdTMyIFN0cmVhbTJfdHJhbnMgICAgIDogMTsgICAvKiBXaGVuIHNldCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlIGRhdGEgZmVycmllZCBpbgotCQkJCQkJCQkJCVN0cmVhbTJfUElEIFRTIHBhY2tldHMuICovCi0JCXUzMiBkZWJ1Z19mbGFnX3dyaXRlX3N0YXR1czAwIDogMTsKLQkJdTMyIGRlYnVnX2ZpZm9fcHJvYmxlbSA6IDE7Ci0JfSBwaWRfZmlsdGVyXzMwMDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBQQ1JfUElEICAgICAgICAgICA6MTM7ICAgLyogUENSIHN0cmVhbSBQSUQgZmlsdGVyIHZhbHVlLiBQcmltYXJ5IHVzZSBpcyBQcm9ncmFtIENsb2NrIFJlZmVyZW5jZSBzdHJlYW0gZmlsdGVyaW5nLiAqLwotCQl1MzIgUENSX3RyYW5zICAgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlc2UgcGFja2V0cy4gKi8KLQkJdTMyIGRlYnVnX292ZXJydW4zICAgIDogMTsKLQkJdTMyIGRlYnVnX292ZXJydW4yICAgIDogMTsKLQkJdTMyIFBNVF9QSUQgICAgICAgICAgIDoxMzsgICAvKiBzdHJlYW0gUElEIGZpbHRlciB2YWx1ZS4gUHJpbWFyeSB1c2UgaXMgUHJvZ3JhbSBNYW5hZ2VtZW50IFRhYmxlIHNlZ21lbnQgZmlsdGVyaW5nLiAqLwotCQl1MzIgUE1UX3RyYW5zICAgICAgICAgOiAxOyAgIC8qIFdoZW4gc2V0LCBUYWJsZXMvQ0FJIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgdGhlc2UgcGFja2V0cy4gKi8KLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDogMjsKLQl9IHBpZF9maWx0ZXJfMzA0OwotCi0Jc3RydWN0IHsKLQkJdTMyIEVNTV9QSUQgICAgICAgICAgIDoxMzsgICAvKiBFTU0gUElEIGZpbHRlciB2YWx1ZS4gUHJpbWFyeSB1c2UgaXMgRW50aXRsZW1lbnQgTWFuYWdlbWVudCBNZXNzYWdpbmcgZm9yCi0JCQkJCQkJCQkJY29uZGl0aW9uYWwgYWNjZXNzLXJlbGF0ZWQgZGF0YS4gKi8KLQkJdTMyIEVNTV90cmFucyAgICAgICAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCi0JCXUzMiBFTU1fZmlsdGVyXzQgICAgICA6IDE7ICAgLyogV2hlbiBzZXQgd2lsbCBwYXNzIG9ubHkgRU1NIGRhdGEgcG9zc2Vzc2luZyB0aGUgc2FtZSBJRCBjb2RlIGFzIHRoZQotCQkJCQkJCQkJCWZpcnN0IGZvdXIgYnl0ZXMgKDMyIGJpdHMpIG9mIHRoZSBlbmQtdXNlciBzIDYtYnl0ZSBTbWFydCBDYXJkIElEIG51bWJlciBTZWxlY3QgKi8KLQkJdTMyIEVNTV9maWx0ZXJfNiAgICAgIDogMTsgICAvKiBXaGVuIHNldCB3aWxsIHBhc3Mgb25seSBFTU0gZGF0YSBwb3NzZXNzaW5nIHRoZSBzYW1lIDYtYnl0ZSBjb2RlIGFzIHRoZSBlbmQtdXNlcnMKLQkJCQkJCQkJCQljb21wbGV0ZSA2LWJ5dGUgU21hcnQgQ2FyZCBJRCBudW1iZXIuICovCi0JCXUzMiBFQ01fUElEICAgICAgICAgICA6MTM7ICAgLyogRUNNIFBJRCBmaWx0ZXIgdmFsdWUuIFByaW1hcnkgdXNlIGlzIEVudGl0bGVtZW50IENvbnRyb2wgTWVzc2FnaW5nIGZvciBjb25kaXRpb25hbAotCQkJCQkJCQkJCWFjY2Vzcy1yZWxhdGVkIGRhdGEuICovCi0JCXUzMiBFQ01fdHJhbnMgICAgICAgICA6IDE7ICAgLyogV2hlbiBzZXQsIFRhYmxlcy9DQUkgdHJhbnNsYXRpb24gd2lsbCB0YWtlIHBsYWNlIGZvciB0aGVzZSBwYWNrZXRzLiAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiAyOwotCX0gcGlkX2ZpbHRlcl8zMDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgR3JvdXBfUElEICAgICA6MTM7ICAgLyogUElEIHZhbHVlIGZvciBncm91cCBmaWx0ZXJpbmcuICovCi0JCXUzMiBHcm91cF90cmFucyAgIDogMTsgICAvKiBXaGVuIHNldCwgVGFibGVzL0NBSSB0cmFuc2xhdGlvbiB3aWxsIHRha2UgcGxhY2UgZm9yIHRoZXNlIHBhY2tldHMuICovCi0JCXUzMiB1bnVzZWQxICAgICAgIDogMjsKLQkJdTMyIEdyb3VwX21hc2sgICAgOjEzOyAgIC8qIE1hc2sgdmFsdWUgdXNlZCBpbiBsb2dpY2FsICJhbmQiIGVxdWF0aW9uIHRoYXQgZGVmaW5lcyBncm91cCBmaWx0ZXJpbmcgKi8KLQkJdTMyIHVudXNlZDIgICAgICAgOiAzOwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8wXzc7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgbmV0X21hc3Rlcl9yZWFkIDoxNzsKLQkJdTMyIHVudXNlZCAgICAgICAgOjE1OwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8xOwotCi0Jc3RydWN0IHsKLQkJdTMyIG5ldF9tYXN0ZXJfd3JpdGUgOjE3OwotCQl1MzIgdW51c2VkICAgICAgICA6MTU7Ci0JfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzI7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgbmV4dF9uZXRfbWFzdGVyX3dyaXRlIDoxNzsKLQkJdTMyIHVudXNlZCAgICAgICAgOjE1OwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8zOwotCi0Jc3RydWN0IHsKLQkJdTMyIHVudXNlZDEgICAgICAgOiAxOwotCQl1MzIgc3RhdGVfd3JpdGUgICA6MTA7Ci0JCXUzMiByZXNlcnZlZDEgICAgIDogNjsgICAvKiBkZWZhdWx0OiAwMDAxMDAgKi8KLQkJdTMyIHN0YWNrX3JlYWQgICAgOjEwOwotCQl1MzIgcmVzZXJ2ZWQyICAgICA6IDU7ICAgLyogZGVmYXVsdDogMDAxMDAgKi8KLQl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBzdGFja19jbnQgICAgIDoxMDsKLQkJdTMyIHVudXNlZCAgICAgICAgOjIyOwotCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF81OwotCi0Jc3RydWN0IHsKLQkJdTMyIHBpZF9mc21fc2F2ZV9yZWcwIDogMjsKLQkJdTMyIHBpZF9mc21fc2F2ZV9yZWcxIDogMjsKLQkJdTMyIHBpZF9mc21fc2F2ZV9yZWcyIDogMjsKLQkJdTMyIHBpZF9mc21fc2F2ZV9yZWczIDogMjsKLQkJdTMyIHBpZF9mc21fc2F2ZV9yZWc0IDogMjsKLQkJdTMyIHBpZF9mc21fc2F2ZV9yZWczMDAgOiAyOwotCQl1MzIgd3JpdGVfc3RhdHVzMSA6IDI7Ci0JCXUzMiB3cml0ZV9zdGF0dXM0IDogMjsKLQkJdTMyIGRhdGFfc2l6ZV9yZWcgOjEyOwotCQl1MzIgdW51c2VkICAgICAgICA6IDQ7Ci0JfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzY7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgaW5kZXhfcmVnICAgICAgICAgOiA1OyAgIC8qIChJbmRleCBwb2ludGVyKSBQb2ludHMgYXQgYW4gaW50ZXJuYWwgUElEbiByZWdpc3Rlci4gQSBiaW5hcnkgY29kZQotCQkJCQkJCQkJCXJlcHJlc2VudGluZyBvbmUgb2YgMzIgaW50ZXJuYWwgUElEbiByZWdpc3RlcnMgYXMgd2VsbCBhcyBpdHMKLQkJCQkJCQkJCQljb3JyZXNwb25kaW5nIGludGVybmFsIE1BQ19sb3duIHJlZ2lzdGVyLiAqLwotCQl1MzIgZXh0cmFfaW5kZXhfcmVnICAgOiAzOyAgIC8qIFRoaXMgdmVjdG9yIGlzIHVzZWQgdG8gc2VsZWN0IGJldHdlZW4gc2V0cyBvZiBkZWJ1ZyBzaWduYWxzIHJvdXRlZCB0byByZWdpc3RlciAweDMwYy4gKi8KLQkJdTMyIEFCX3NlbGVjdCAgICAgICAgIDogMTsgICAvKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggMHgzMWMuIHJlYWQvd3JpdGUgdG8gdGhlIE1BQ19oaWdoQSBvciBNQUNfaGlnaEIgcmVnaXN0ZXIKLQkJCQkJCQkJCQkwPU1BQ19oaWdoQiByZWdpc3RlciwgMT1NQUNfaGlnaEEgKi8KLQkJdTMyIHBhc3NfYWxsdGFibGVzICAgIDogMTsgICAvKiAxPU5ldCBwYWNrZXRzIGFyZSBub3QgZmlsdGVyZWQgYWdhaW5zdCB0aGUgTmV0d29yayBUYWJsZSBJRCBmb3VuZCBpbiByZWdpc3RlciAweDQwMC4KLQkJCQkJCQkJCQlBbGwgdHlwZXMgb2YgbmV0d29ya3MgKERWQiwgQVRTQywgSVNEQikgYXJlIHBhc3NlZC4gKi8KLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDoyMjsKLQl9IGluZGV4X3JlZ18zMTA7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgUElEICAgICAgICAgICAgICAgOjEzOyAgIC8qIFBJRCB2YWx1ZSAqLwotCQl1MzIgUElEX3RyYW5zICAgICAgICAgOiAxOyAgIC8qIHRyYW5zbGF0aW9uIHdpbGwgdGFrZSBwbGFjZSBmb3IgcGFja2V0cyBmaWx0ZXJlZCAqLwotCQl1MzIgUElEX2VuYWJsZV9iaXQgICAgOiAxOyAgIC8qIFdoZW4gc2V0IHRoaXMgUElEIGZpbHRlciBpcyBlbmFibGVkICovCi0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6MTc7Ci0JfSBwaWRfbl9yZWdfMzE0OwotCi0Jc3RydWN0IHsKLQkJdTMyIEE0X2J5dGUgICAgICAgICAgIDogODsKLQkJdTMyIEE1X2J5dGUgICAgICAgICAgIDogODsKLQkJdTMyIEE2X2J5dGUgICAgICAgICAgIDogODsKLQkJdTMyIEVuYWJsZV9iaXQgICAgICAgIDogMTsgICAvKiBlbmFibGVkICgxKSBvciBkaXNhYmxlZCAoMSkgKi8KLQkJdTMyIEhpZ2hBQl9iaXQgICAgICAgIDogMTsgICAvKiB1c2UgTUFDX2hpZ2hBICgxKSBvciBNQUNfaGlnaEIgKDApIGFzIE1TQiAqLwotCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgOiA2OwotCX0gbWFjX2xvd19yZWdfMzE4OwotCi0Jc3RydWN0IHsKLQkJdTMyIEExX2J5dGUgICAgICAgICAgIDogODsKLQkJdTMyIEEyX2J5dGUgICAgICAgICAgIDogODsKLQkJdTMyIEEzX2J5dGUgICAgICAgICAgIDogODsKLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDogODsKLQl9IG1hY19oaWdoX3JlZ18zMWM7Ci0KLS8qIFRhYmxlLCBTTUNJRCxNQUNEZXN0aW5hdGlvbiBGaWx0ZXJzIDB4NDAwIHRvIDB4NDFjICovCi0Jc3RydWN0IHsKLQkJdTMyIHJlc2VydmVkICAgICAgICAgIDoxNjsKICNkZWZpbmUgZmNfZGF0YV9UYWdfSURfRFZCICAweDNlCiAjZGVmaW5lIGZjX2RhdGFfVGFnX0lEX0FUU0MgMHgzZgogI2RlZmluZSBmY19kYXRhX1RhZ19JRF9JRFNCIDB4OGIKLQkJdTMyIGRhdGFfVGFnX0lEICAgICAgIDoxNjsKLQl9IGRhdGFfdGFnXzQwMDsKIAotCXN0cnVjdCB7Ci0JCXUzMiBDYXJkX0lEYnl0ZTYgICAgICA6IDg7Ci0JCXUzMiBDYXJkX0lEYnl0ZTUgICAgICA6IDg7Ci0JCXUzMiBDYXJkX0lEYnl0ZTQgICAgICA6IDg7Ci0JCXUzMiBDYXJkX0lEYnl0ZTMgICAgICA6IDg7Ci0JfSBjYXJkX2lkXzQwODsKLQotCXN0cnVjdCB7Ci0JCXUzMiBDYXJkX0lEYnl0ZTIgICAgICA6IDg7Ci0JCXUzMiBDYXJkX0lEYnl0ZTEgICAgICA6IDg7Ci0JfSBjYXJkX2lkXzQwYzsKLQotCS8qIGhvbGRpbmcgdGhlIHVuaXF1ZSBtYWMgYWRkcmVzcyBvZiB0aGUgcmVjZWl2ZXIgd2hpY2ggaG91c2VzIHRoZSBGbGV4Q29wSUlJICovCi0Jc3RydWN0IHsKLQkJdTMyIE1BQzEgICAgICAgICAgICAgIDogODsKLQkJdTMyIE1BQzIgICAgICAgICAgICAgIDogODsKLQkJdTMyIE1BQzMgICAgICAgICAgICAgIDogODsKLQkJdTMyIE1BQzYgICAgICAgICAgICAgIDogODsKLQl9IG1hY19hZGRyZXNzXzQxODsKLQotCXN0cnVjdCB7Ci0JCXUzMiBNQUM3ICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiBNQUM4ICAgICAgICAgICAgICA6IDg7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDE2OwotCX0gbWFjX2FkZHJlc3NfNDFjOwotCi0Jc3RydWN0IHsKLQkJdTMyIHRyYW5zbWl0dGVyX2RhdGFfYnl0ZSA6IDg7Ci0JCXUzMiBSZWNlaXZlRGF0YVJlYWR5ICA6IDE7Ci0JCXUzMiBSZWNlaXZlQnl0ZUZyYW1lRXJyb3I6IDE7Ci0JCXUzMiB0eGJ1ZmZlbXB0eSAgICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6MjE7Ci0JfSBjaV82MDA7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgcGlfZCAgICAgICAgICAgICAgOiA4OwotCQl1MzIgcGlfaGEgICAgICAgICAgICAgOjIwOwotCQl1MzIgcGlfcncgICAgICAgICAgICAgOiAxOwotCQl1MzIgcGlfY29tcG9uZW50X3JlZyAgOiAzOwotCX0gcGlfNjA0OwotCi0Jc3RydWN0IHsKLQkJdTMyIHNlcmlhbFJlc2V0ICAgICAgIDogMTsKLQkJdTMyIG9uY2VjeWNsZV9yZWFkICAgIDogMTsKLQkJdTMyIFRpbWVyX1JlYWRfcmVxICAgIDogMTsKLQkJdTMyIFRpbWVyX0xvYWRfcmVxICAgIDogMTsKLQkJdTMyIHRpbWVyX2RhdGEgICAgICAgIDogNzsKLQkJdTMyIHVudXNlZCAgICAgICAgICAgIDogMTsgLyogPz8/IG5vdCBtZW50aW9uZWQgaW4gZGF0YSBib29rICovCi0JCXUzMiBUaW1lcl9hZGRyICAgICAgICA6IDU7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDM7Ci0JCXUzMiBwY21jaWFfYV9tb2RfcHdyX24gOiAxOwotCQl1MzIgcGNtY2lhX2JfbW9kX3B3cl9uIDogMTsKLQkJdTMyIGNvbmZpZ19Eb25lX3N0YXQgIDogMTsKLQkJdTMyIGNvbmZpZ19Jbml0X3N0YXQgIDogMTsKLQkJdTMyIGNvbmZpZ19Qcm9nX24gICAgIDogMTsKLQkJdTMyIGNvbmZpZ193cl9uICAgICAgIDogMTsKLQkJdTMyIGNvbmZpZ19jc19uICAgICAgIDogMTsKLQkJdTMyIGNvbmZpZ19jY2xrICAgICAgIDogMTsKLQkJdTMyIHBpX0NpTWF4X0lSUV9uICAgIDogMTsKLQkJdTMyIHBpX3RpbWVvdXRfc3RhdHVzIDogMTsKLQkJdTMyIHBpX3dhaXRfbiAgICAgICAgIDogMTsKLQkJdTMyIHBpX2J1c3lfbiAgICAgICAgIDogMTsKLQl9IHBpXzYwODsKLQotCXN0cnVjdCB7Ci0JCXUzMiBQSUQgICAgICAgICAgICAgICA6MTM7Ci0JCXUzMiBrZXlfZW5hYmxlICAgICAgICA6IDE7CiAjZGVmaW5lIGZjX2tleV9jb2RlX2RlZmF1bHQgMHgxCiAjZGVmaW5lIGZjX2tleV9jb2RlX2V2ZW4gICAgMHgyCiAjZGVmaW5lIGZjX2tleV9jb2RlX29kZCAgICAgMHgzCi0JCXUzMiBrZXlfY29kZSAgICAgICAgICA6IDI7Ci0JCXUzMiBrZXlfYXJyYXlfY29sICAgICA6IDM7Ci0JCXUzMiBrZXlfYXJyYXlfcm93ICAgICA6IDU7Ci0JCXUzMiBkdmJfZW4gICAgICAgICAgICA6IDE7IC8qIDA9VFMgYnlwYXNzZXMgdGhlIERlc2NyYW1ibGVyICovCi0JCXUzMiByd19mbGFnICAgICAgICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6IDY7Ci0JfSBkdmJfcmVnXzYwYzsKLQotLyogU1JBTSBhbmQgT3V0cHV0IERlc3RpbmF0aW9uIDB4NzAwIHRvIDB4NzE0ICovCi0Jc3RydWN0IHsKLQkJdTMyIHNyYW1fYWRkciAgICAgICAgIDoxNTsKLQkJdTMyIHNyYW1fcncgICAgICAgICAgIDogMTsgICAvKiAwPXdyaXRlLCAxPXJlYWQgKi8KLQkJdTMyIHNyYW1fZGF0YSAgICAgICAgIDogODsKLQkJdTMyIHNjX3hmZXJfYml0ICAgICAgIDogMTsKLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogMzsKLQkJdTMyIG9lX3Bpbl9yZWcgICAgICAgIDogMTsKLQkJdTMyIGNlX3Bpbl9yZWcgICAgICAgIDogMTsKLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogMTsKLQkJdTMyIHN0YXJ0X3NyYW1faWJpICAgIDogMTsKLQl9IHNyYW1fY3RybF9yZWdfNzAwOwotCi0Jc3RydWN0IHsKLQkJdTMyIG5ldF9hZGRyX3JlYWQgICAgIDoxNjsKLQkJdTMyIG5ldF9hZGRyX3dyaXRlICAgIDoxNjsKLQl9IG5ldF9idWZfcmVnXzcwNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBjYWlfcmVhZCAgICAgICAgICA6MTE7Ci0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDU7Ci0JCXUzMiBjYWlfd3JpdGUgICAgICAgICA6MTE7Ci0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDY7Ci0JCXUzMiBjYWlfY250ICAgICAgICAgICA6IDQ7Ci0JfSBjYWlfYnVmX3JlZ183MDg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgY2FvX3JlYWQgICAgICAgICAgOjExOwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA1OwotCQl1MzIgY2FwX3dyaXRlICAgICAgICAgOjExOwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiA2OwotCQl1MzIgY2FvX2NudCAgICAgICAgICAgOiA0OwotCX0gY2FvX2J1Zl9yZWdfNzBjOwotCi0Jc3RydWN0IHsKLQkJdTMyIG1lZGlhX3JlYWQgICAgICAgIDoxMTsKLQkJdTMyIHJlc2VydmVkMSAgICAgICAgIDogNTsKLQkJdTMyIG1lZGlhX3dyaXRlICAgICAgIDoxMTsKLQkJdTMyIHJlc2VydmVkMiAgICAgICAgIDogNjsKLQkJdTMyIG1lZGlhX2NudCAgICAgICAgIDogNDsKLQl9IG1lZGlhX2J1Zl9yZWdfNzEwOwotCi0Jc3RydWN0IHsKLQkJdTMyIE5FVF9EZXN0ICAgICAgICAgIDogMjsKLQkJdTMyIENBSV9EZXN0ICAgICAgICAgIDogMjsKLQkJdTMyIENBT19EZXN0ICAgICAgICAgIDogMjsKLQkJdTMyIE1FRElBX0Rlc3QgICAgICAgIDogMjsKLQkJdTMyIG5ldF9vdmZsb3dfZXJyb3IgIDogMTsKLQkJdTMyIG1lZGlhX292Zmxvd19lcnJvciA6IDE7Ci0JCXUzMiBjYWlfb3ZmbG93X2Vycm9yICA6IDE7Ci0JCXUzMiBjYW9fb3ZmbG93X2Vycm9yICA6IDE7Ci0JCXUzMiBjdHJsX3VzYl93YW4gICAgICA6IDE7Ci0JCXUzMiBjdHJsX3NyYW1kbWEgICAgICA6IDE7Ci0JCXUzMiBjdHJsX21heGltdW1maWxsICA6IDE7Ci0JCXUzMiByZXNlcnZlZCAgICAgICAgICA6MTc7Ci0JfSBzcmFtX2Rlc3RfcmVnXzcxNDsKLQotCXN0cnVjdCB7Ci0JCXUzMiBuZXRfY250ICAgICAgICAgICA6MTI7Ci0JCXUzMiByZXNlcnZlZDEgICAgICAgICA6IDQ7Ci0JCXUzMiBuZXRfYWRkcl9yZWFkICAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZDIgICAgICAgICA6IDM7Ci0JCXUzMiBuZXRfYWRkcl93cml0ZSAgICA6IDE7Ci0JCXUzMiByZXNlcnZlZDMgICAgICAgICA6MTE7Ci0JfSBuZXRfYnVmX3JlZ183MTg7Ci0KLQlzdHJ1Y3QgewotCQl1MzIgd2FuX3NwZWVkX3NpZyAgICAgOiAyOwotCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgOiA2OwotCQl1MzIgd2FuX3dhaXRfc3RhdGUgICAgOiA4OwotCQl1MzIgc3JhbV9jaGlwICAgICAgICAgOiAyOwotCQl1MzIgc3JhbV9tZW1tYXAgICAgICAgOiAyOwotCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgOiA0OwotCQl1MzIgd2FuX3BrdF9mcmFtZSAgICAgOiA0OwotCQl1MzIgcmVzZXJ2ZWQzICAgICAgICAgOiA0OwotCX0gd2FuX2N0cmxfcmVnXzcxYzsKLX0gZmxleGNvcF9pYmlfdmFsdWU7CiAKIGV4dGVybiBmbGV4Y29wX2liaV92YWx1ZSBpYmlfemVybzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCmluZGV4IDAxMTM0NDkuLjBhNzhiYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtdXNiLmMKQEAgLTU0NSw3ICs1NDUsNyBAQAogLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGZsZXhjb3BfdXNiX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIlRlY2huaXNhdC9CMkMyIEZsZXhDb3AgSUkvSUliL0lJSSBVU0IiLAorCS5uYW1lCQk9ICJiMmMyX2ZsZXhjb3BfdXNiIiwKIAkucHJvYmUJCT0gZmxleGNvcF91c2JfcHJvYmUsCiAJLmRpc2Nvbm5lY3QgPSBmbGV4Y29wX3VzYl9kaXNjb25uZWN0LAogCS5pZF90YWJsZQk9IGZsZXhjb3BfdXNiX3RhYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwppbmRleCA4YjVkMTRkLi4xMjg3M2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwpAQCAtNDYsNyArNDYsNyBAQAogCiBpbnQgYjJjMl9mbGV4Y29wX2RlYnVnOwogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBiMmMyX2ZsZXhjb3BfZGVidWcsICBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1ZyBsZXZlbCAoMT1pbmZvLDI9dHVuZXIsND1pMmMsOD10cywxNj1zcmFtICh8LWFibGUpKS4iIERFQlNUQVRVUyk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnIGxldmVsICgxPWluZm8sMj10dW5lciw0PWkyYyw4PXRzLDE2PXNyYW0sMzI9cmVnICh8LWFibGUpKS4iIERFQlNUQVRVUyk7CiAjdW5kZWYgREVCU1RBVFVTCiAKIC8qIGdsb2JhbCB6ZXJvIGZvciBpYmkgdmFsdWVzICovCkBAIC0xNzMsOSArMTczLDIwIEBACiAJZmMtPndyaXRlX2liaV9yZWcoZmMsY3RybF8yMDgsaWJpX3plcm8pOwogCiAJdjIxMC5yYXcgPSAwOwotCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrcyA9IDB4ZmY7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfMDAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja18xMDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzIwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfMzAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja180MDAgPSAxOworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzUwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAucmVzZXRfYmxvY2tfNjAwID0gMTsKKwl2MjEwLnN3X3Jlc2V0XzIxMC5yZXNldF9ibG9ja183MDAgPSAxOwogCXYyMTAuc3dfcmVzZXRfMjEwLkJsb2NrX3Jlc2V0X2VuYWJsZSA9IDB4YjI7CisKKwl2MjEwLnN3X3Jlc2V0XzIxMC5TcGVjaWFsX2NvbnRyb2xzID0gMHhjMjU5OworCiAJZmMtPndyaXRlX2liaV9yZWcoZmMsc3dfcmVzZXRfMjEwLHYyMTApOworCW1zbGVlcCgxKTsKIAogLyogcmVzZXQgdGhlIHBlcmlwaGljYWwgZGV2aWNlcyAqLwogCkBAIC0xODYsNiArMTk3LDI1IEBACiAJZmMtPndyaXRlX2liaV9yZWcoZmMsbWlzY18yMDQsdjIwNCk7CiB9CiAKK3ZvaWQgZmxleGNvcF9yZXNldF9ibG9ja18zMDAoc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYykKK3sKKwlmbGV4Y29wX2liaV92YWx1ZSB2MjA4X3NhdmUgPSBmYy0+cmVhZF9pYmlfcmVnKGZjLGN0cmxfMjA4KSwKKwkJCQkJICB2MjEwID0gZmMtPnJlYWRfaWJpX3JlZyhmYyxzd19yZXNldF8yMTApOworCisJZGViX3JkdW1wKCIyMDg6ICUwOHgsIDIxMDogJTA4eFxuIix2MjA4X3NhdmUucmF3LHYyMTAucmF3KTsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLGN0cmxfMjA4LGliaV96ZXJvKTsKKworCXYyMTAuc3dfcmVzZXRfMjEwLnJlc2V0X2Jsb2NrXzMwMCA9IDE7CisJdjIxMC5zd19yZXNldF8yMTAuQmxvY2tfcmVzZXRfZW5hYmxlID0gMHhiMjsKKworCWZjLT53cml0ZV9pYmlfcmVnKGZjLHN3X3Jlc2V0XzIxMCx2MjEwKTsKKwltc2xlZXAoMSk7CisKKwlmYy0+d3JpdGVfaWJpX3JlZyhmYyxjdHJsXzIwOCx2MjA4X3NhdmUpOworfQorRVhQT1JUX1NZTUJPTChmbGV4Y29wX3Jlc2V0X2Jsb2NrXzMwMCk7CisKIHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmxleGNvcF9kZXZpY2Vfa21hbGxvYyhzaXplX3QgYnVzX3NwZWNpZmljX2xlbikKIHsKIAl2b2lkICpidXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5oCmluZGV4IGNhYTM0M2EuLjBjZWJlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC5oCkBAIC0yNiw1ICsyNiw2IEBACiAjZGVmaW5lIGRlYl9pMmMoYXJncy4uLikgICBkcHJpbnRrKDB4MDQsYXJncykKICNkZWZpbmUgZGViX3RzKGFyZ3MuLi4pICAgIGRwcmludGsoMHgwOCxhcmdzKQogI2RlZmluZSBkZWJfc3JhbShhcmdzLi4uKSAgZHByaW50aygweDEwLGFyZ3MpCisjZGVmaW5lIGRlYl9yZHVtcChhcmdzLi4uKSAgZHByaW50aygweDIwLGFyZ3MpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wX2liaV92YWx1ZV9iZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wX2liaV92YWx1ZV9iZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOWE2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3BfaWJpX3ZhbHVlX2JlLmgKQEAgLTAsMCArMSw0NTggQEAKKy8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpbnV4IGRyaXZlciBmb3IgZGlnaXRhbCBUViBkZXZpY2VzIGVxdWlwcGVkIHdpdGggQjJDMiBGbGV4Y29wSUkoYikvSUlJCisgKgorICogcmVnaXN0ZXIgZGVzY3JpcHRpb25zCisgKgorICogc2VlIGZsZXhjb3AuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICovCisKKy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgdGhpbmdzIGhlcmUuICovCisjaWZuZGVmIF9fRkxFWENPUF9JQklfVkFMVUVfSU5DTFVERURfXworI2RlZmluZSBfX0ZMRVhDT1BfSUJJX1ZBTFVFX0lOQ0xVREVEX18KKwordHlwZWRlZiB1bmlvbiB7CisJdTMyIHJhdzsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfYWRkcmVzczAgICAgICAgICAgICAgICAgICAgOjMwOworCQl1MzIgZG1hXzBOb191cGRhdGUgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRtYV8wc3RhcnQgICAgICAgICAgICAgICAgICAgICA6IDE7CisJfSBkbWFfMHgwOworCisJc3RydWN0IHsKKwkJdTMyIGRtYV9hZGRyX3NpemUgICAgICAgICAgICAgICAgICA6MjQ7CisJCXUzMiBETUFfbWF4cGFja2V0cyAgICAgICAgICAgICAgICAgOiA4OworCX0gZG1hXzB4NF9yZW1hcDsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfYWRkcl9zaXplICAgICAgICAgICAgICAgICAgOjI0OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRtYTF0aW1lciAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJfSBkbWFfMHg0X3JlYWQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwkJdTMyIGRtYXRpbWVyICAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gZG1hXzB4NF93cml0ZTsKKworCXN0cnVjdCB7CisJCXUzMiBkbWFfY3VyX2FkZHIgICAgICAgICAgICAgICAgICAgOjMwOworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwl9IGRtYV8weDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hX2FkZHJlc3MxICAgICAgICAgICAgICAgICAgIDozMDsKKwkJdTMyIHJlbWFwX2VuYWJsZSAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfMXN0YXJ0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gZG1hXzB4YzsKKworCXN0cnVjdCB7CisJCXUzMiBzdF9kb25lICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgbm9fYmFzZV9hZGRyX2Fja19lcnJvciAgICAgICAgIDogMTsKKwkJdTMyIHR3b1dTX3BvcnRfcmVnICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0b3RhbF9ieXRlcyAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdHdvV1NfcncgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHdvcmtpbmdfc3RhcnQgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkYXRhMV9yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgYmFzZWFkZHIgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjaGlwYWRkciAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCX0gdHdfc21fY18xMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIGZvcmNlX3N0b3AgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBleGxpY2l0X3N0b3BzICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGF0YTRfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGRhdGEzX3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBkYXRhMl9yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gdHdfc21fY18xMDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDoxOTsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdGhpMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IHR3X3NtX2NfMTA4OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6MTk7CisJCXUzMiB0bG8xICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJfSB0d19zbV9jXzEwYzsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOjE5OworCQl1MzIgdGxvMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0aGkxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCX0gdHdfc21fY18xMTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgTE5CX0NUTFByZXNjYWxlcl9zaWcgICAgICAgICAgIDogMjsKKwkJdTMyIExOQl9DVExMb3dDb3VudF9zaWcgICAgICAgICAgICA6MTU7CisJCXUzMiBMTkJfQ1RMSGlnaENvdW50X3NpZyAgICAgICAgICAgOjE1OworCX0gbG5iX3N3aXRjaF9mcmVxXzIwMDsKKworCXN0cnVjdCB7CisJCXUzMiBSZXZfTl9zaWdfcmVzZXJ2ZWQyICAgICAgICAgICAgOiAxOworCQl1MzIgUmV2X05fc2lnX2NhcHMgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFJldl9OX3NpZ19yZXNlcnZlZDEgICAgICAgICAgICA6IDI7CisJCXUzMiBSZXZfTl9zaWdfcmV2aXNpb25faGkgICAgICAgICAgOiA0OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoyMDsKKwkJdTMyIFBlcl9yZXNldF9zaWcgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBMTkJfTF9IX3NpZyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgQUNQSTNfc2lnICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEFDUEkxX3NpZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJfSBtaXNjXzIwNDsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA5OworCQl1MzIgTWFpbGJveF9mcm9tX1Y4X0VuYWJsZV9zaWcgICAgIDogMTsKKwkJdTMyIERNQTJfU2l6ZV9JUlFfRW5hYmxlX3NpZyAgICAgICA6IDE7CisJCXUzMiBETUExX1NpemVfSVJRX0VuYWJsZV9zaWcgICAgICAgOiAxOworCQl1MzIgRE1BMl9UaW1lcl9FbmFibGVfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfSVJRX0VuYWJsZV9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1RpbWVyX0VuYWJsZV9zaWcgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9JUlFfRW5hYmxlX3NpZyAgICAgICAgICAgIDogMTsKKwkJdTMyIFJjdl9EYXRhX3NpZyAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBNQUNfZmlsdGVyX01vZGVfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgTXVsdGkyX0VuYWJsZV9zaWcgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBlcl9DQV9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBTTUNfRW5hYmxlX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgQ0FfRW5hYmxlX3NpZyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFdBTl9DQV9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBXQU5fRW5hYmxlX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTWFza19maWx0ZXJfc2lnICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE51bGxfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFQ01fZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRU1NX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBNVF9maWx0ZXJfc2lnICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQQ1JfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgU3RyZWFtMl9maWx0ZXJfc2lnICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTFfZmlsdGVyX3NpZyAgICAgICAgICAgICA6IDE7CisJfSBjdHJsXzIwODsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjIxOworCQl1MzIgVHJhbnNwb3J0X0Vycm9yICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIExMQ19TTkFQX0ZMQUdfc2V0ICAgICAgICAgICAgICA6IDE7CisJCXUzMiBDb250aW51aXR5X2Vycm9yX2ZsYWcgICAgICAgICAgOiAxOworCQl1MzIgRGF0YV9yZWNlaXZlcl9lcnJvciAgICAgICAgICAgIDogMTsKKwkJdTMyIE1haWxib3hfZnJvbV9WOF9TdGF0dXNfc2lnICAgICA6IDE7CisJCXUzMiBETUEyX1NpemVfSVJRX1N0YXR1cyAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9TaXplX0lSUV9TdGF0dXMgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfVGltZXJfU3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX0lSUV9TdGF0dXMgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMV9UaW1lcl9TdGF0dXMgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfSVJRX1N0YXR1cyAgICAgICAgICAgICAgICA6IDE7CisJfSBpcnFfMjBjOworCisJc3RydWN0IHsKKwkJdTMyIFNwZWNpYWxfY29udHJvbHMgICAgICAgICAgICAgICA6MTY7CisJCXUzMiBCbG9ja19yZXNldF9lbmFibGUgICAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXRfYmxvY2tfNzAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzYwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja181MDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNDAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzMwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18yMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfMTAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzAwMCAgICAgICAgICAgICAgICA6IDE7CisJfSBzd19yZXNldF8yMTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkMiAgICAgICAgICAgICAgICAgICAgICAgIDoyMDsKKwkJdTMyIHBvbGFyaXR5X1BTX0VSUl9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBwb2xhcml0eV9QU19TWU5DX3NpZyAgICAgICAgICAgOiAxOworCQl1MzIgcG9sYXJpdHlfUFNfVkFMSURfc2lnICAgICAgICAgIDogMTsKKwkJdTMyIHBvbGFyaXR5X1BTX0NMS19zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQxICAgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgczJwX3NlbF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHNlY3Rpb25fcGtnX2VuYWJsZV9zaWcgICAgICAgICA6IDE7CisJCXUzMiBoYWx0X1Y4X3NpZyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdjJXU19vZV9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHZ1YXJ0X29lX3NpZyAgICAgICAgICAgICAgICAgICA6IDE7CisJfSBtaXNjXzIxNDsKKworCXN0cnVjdCB7CisJCXUzMiBNYWlsYm94X2Zyb21fVjggICAgICAgICAgICAgICAgOjMyOworCX0gbWJveF92OF90b19ob3N0XzIxODsKKworCXN0cnVjdCB7CisJCXUzMiBzeXNyYW1hY2Nlc3NfYnVzbXVzdGVyICAgICAgICAgOiAxOworCQl1MzIgc3lzcmFtYWNjZXNzX3dyaXRlICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDc7CisJCXUzMiBzeXNyYW1hY2Nlc3NfYWRkciAgICAgICAgICAgICAgOjE1OworCQl1MzIgc3lzcmFtYWNjZXNzX2RhdGEgICAgICAgICAgICAgIDogODsKKwl9IG1ib3hfaG9zdF90b192OF8yMWM7CisKKwlzdHJ1Y3QgeworCQl1MzIgZGVidWdfZmlmb19wcm9ibGVtICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX2ZsYWdfd3JpdGVfc3RhdHVzMDAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0yX3RyYW5zICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgU3RyZWFtMl9QSUQgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIGRlYnVnX2ZsYWdfcGlkX3NhdmVkICAgICAgICAgICA6IDE7CisJCXUzMiBNQUNfTXVsdGljYXN0X2ZpbHRlciAgICAgICAgICAgOiAxOworCQl1MzIgU3RyZWFtMV90cmFucyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTFfUElEICAgICAgICAgICAgICAgICAgICA6MTM7CisJfSBwaWRfZmlsdGVyXzMwMDsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgUE1UX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBNVF9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBkZWJ1Z19vdmVycnVuMiAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGVidWdfb3ZlcnJ1bjMgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBDUl90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQQ1JfUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCX0gcGlkX2ZpbHRlcl8zMDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIEVDTV90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFQ01fUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgRU1NX2ZpbHRlcl82ICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfNCAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFTU1fdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRU1NX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwl9IHBpZF9maWx0ZXJfMzA4OworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZDIgICAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBHcm91cF9tYXNrICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgdW51c2VkMSAgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIEdyb3VwX3RyYW5zICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBHcm91cF9QSUQgICAgICAgICAgICAgICAgICAgICAgOjEzOworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8wXzc7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwkJdTMyIG5ldF9tYXN0ZXJfcmVhZCAgICAgICAgICAgICAgICA6MTc7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzE7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwkJdTMyIG5ldF9tYXN0ZXJfd3JpdGUgICAgICAgICAgICAgICA6MTc7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzI7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwkJdTMyIG5leHRfbmV0X21hc3Rlcl93cml0ZSAgICAgICAgICA6MTc7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzM7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHN0YWNrX3JlYWQgICAgICAgICAgICAgICAgICAgICA6MTA7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgc3RhdGVfd3JpdGUgICAgICAgICAgICAgICAgICAgIDoxMDsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDoyMjsKKwkJdTMyIHN0YWNrX2NudCAgICAgICAgICAgICAgICAgICAgICA6MTA7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzU7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIGRhdGFfc2l6ZV9yZWcgICAgICAgICAgICAgICAgICA6MTI7CisJCXUzMiB3cml0ZV9zdGF0dXM0ICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgd3JpdGVfc3RhdHVzMSAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWczMDAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnNCAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzMgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWcyICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMSAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzAgICAgICAgICAgICAgIDogMjsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfNjsKKworCXN0cnVjdCB7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjIyOworCQl1MzIgcGFzc19hbGx0YWJsZXMgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEFCX3NlbGVjdCAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBleHRyYV9pbmRleF9yZWcgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgaW5kZXhfcmVnICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwl9IGluZGV4X3JlZ18zMTA7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNzsKKwkJdTMyIFBJRF9lbmFibGVfYml0ICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBQSURfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwl9IHBpZF9uX3JlZ18zMTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIEhpZ2hBQl9iaXQgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFbmFibGVfYml0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgQTZfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEE1X2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBNF9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2xvd19yZWdfMzE4OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBM19ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTJfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEExX2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBtYWNfaGlnaF9yZWdfMzFjOworCisJc3RydWN0IHsKKwkJdTMyIGRhdGFfVGFnX0lEICAgICAgICAgICAgICAgICAgICA6MTY7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE2OworCX0gZGF0YV90YWdfNDAwOworCisJc3RydWN0IHsKKwkJdTMyIENhcmRfSURieXRlMyAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTQgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGU1ICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNiAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBjYXJkX2lkXzQwODsKKworCXN0cnVjdCB7CisJCXUzMiBDYXJkX0lEYnl0ZTEgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGUyICAgICAgICAgICAgICAgICAgIDogODsKKwl9IGNhcmRfaWRfNDBjOworCisJc3RydWN0IHsKKwkJdTMyIE1BQzYgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBtYWNfYWRkcmVzc180MTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNjsKKwkJdTMyIE1BQzggICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2FkZHJlc3NfNDFjOworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MjE7CisJCXUzMiB0eGJ1ZmZlbXB0eSAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUmVjZWl2ZUJ5dGVGcmFtZUVycm9yICAgICAgICAgIDogMTsKKwkJdTMyIFJlY2VpdmVEYXRhUmVhZHkgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB0cmFuc21pdHRlcl9kYXRhX2J5dGUgICAgICAgICAgOiA4OworCX0gY2lfNjAwOworCisJc3RydWN0IHsKKwkJdTMyIHBpX2NvbXBvbmVudF9yZWcgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBwaV9ydyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfaGEgICAgICAgICAgICAgICAgICAgICAgICAgIDoyMDsKKwkJdTMyIHBpX2QgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBwaV82MDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgcGlfYnVzeV9uICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX3dhaXRfbiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV90aW1lb3V0X3N0YXR1cyAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfQ2lNYXhfSVJRX24gICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19jY2xrICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfY3NfbiAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX3dyX24gICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19Qcm9nX24gICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfSW5pdF9zdGF0ICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX0RvbmVfc3RhdCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBjbWNpYV9iX21vZF9wd3JfbiAgICAgICAgICAgICA6IDE7CisJCXUzMiBwY21jaWFfYV9tb2RfcHdyX24gICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIFRpbWVyX2FkZHIgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdGltZXJfZGF0YSAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIFRpbWVyX0xvYWRfcmVxICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBUaW1lcl9SZWFkX3JlcSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgb25jZWN5Y2xlX3JlYWQgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHNlcmlhbFJlc2V0ICAgICAgICAgICAgICAgICAgICA6IDE7CisJfSBwaV82MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHJ3X2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkdmJfZW4gICAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIga2V5X2FycmF5X3JvdyAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGtleV9hcnJheV9jb2wgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBrZXlfY29kZSAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIga2V5X2VuYWJsZSAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJfSBkdmJfcmVnXzYwYzsKKworCXN0cnVjdCB7CisJCXUzMiBzdGFydF9zcmFtX2liaSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNlX3Bpbl9yZWcgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBvZV9waW5fcmVnICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIHNjX3hmZXJfYml0ICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzcmFtX2RhdGEgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgc3JhbV9ydyAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHNyYW1fYWRkciAgICAgICAgICAgICAgICAgICAgICA6MTU7CisJfSBzcmFtX2N0cmxfcmVnXzcwMDsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfYWRkcl93cml0ZSAgICAgICAgICAgICAgICAgOjE2OworCQl1MzIgbmV0X2FkZHJfcmVhZCAgICAgICAgICAgICAgICAgIDoxNjsKKwl9IG5ldF9idWZfcmVnXzcwNDsKKworCXN0cnVjdCB7CisJCXUzMiBjYWlfY250ICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIGNhaV93cml0ZSAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgY2FpX3JlYWQgICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwl9IGNhaV9idWZfcmVnXzcwODsKKworCXN0cnVjdCB7CisJCXUzMiBjYW9fY250ICAgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIGNhcF93cml0ZSAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgY2FvX3JlYWQgICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwl9IGNhb19idWZfcmVnXzcwYzsKKworCXN0cnVjdCB7CisJCXUzMiBtZWRpYV9jbnQgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIG1lZGlhX3dyaXRlICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgbWVkaWFfcmVhZCAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwl9IG1lZGlhX2J1Zl9yZWdfNzEwOworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTc7CisJCXUzMiBjdHJsX21heGltdW1maWxsICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY3RybF9zcmFtZG1hICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGN0cmxfdXNiX3dhbiAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjYW9fb3ZmbG93X2Vycm9yICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2FpX292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIG1lZGlhX292Zmxvd19lcnJvciAgICAgICAgICAgICA6IDE7CisJCXUzMiBuZXRfb3ZmbG93X2Vycm9yICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTUVESUFfRGVzdCAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIENBT19EZXN0ICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBDQUlfRGVzdCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgTkVUX0Rlc3QgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwl9IHNyYW1fZGVzdF9yZWdfNzE0OworCisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkMyAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJCXUzMiBuZXRfYWRkcl93cml0ZSAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgbmV0X2NudCAgICAgICAgICAgICAgICAgICAgICAgIDoxMjsKKwl9IG5ldF9idWZfcmVnXzcxODsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZDMgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgd2FuX3BrdF9mcmFtZSAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJCXUzMiBzcmFtX21lbW1hcCAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgc3JhbV9jaGlwICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHdhbl93YWl0X3N0YXRlICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgd2FuX3NwZWVkX3NpZyAgICAgICAgICAgICAgICAgIDogMjsKKwl9IHdhbl9jdHJsX3JlZ183MWM7Cit9IGZsZXhjb3BfaWJpX3ZhbHVlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfbGUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcF9pYmlfdmFsdWVfbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWYyMzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wX2liaV92YWx1ZV9sZS5oCkBAIC0wLDAgKzEsNDU4IEBACisvKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBsaW51eCBkcml2ZXIgZm9yIGRpZ2l0YWwgVFYgZGV2aWNlcyBlcXVpcHBlZCB3aXRoIEIyQzIgRmxleGNvcElJKGIpL0lJSQorICoKKyAqIHJlZ2lzdGVyIGRlc2NyaXB0aW9ucworICoKKyAqIHNlZSBmbGV4Y29wLmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqLworCisvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IHRoaW5ncyBoZXJlLiAqLworI2lmbmRlZiBfX0ZMRVhDT1BfSUJJX1ZBTFVFX0lOQ0xVREVEX18KKyNkZWZpbmUgX19GTEVYQ09QX0lCSV9WQUxVRV9JTkNMVURFRF9fCisKK3R5cGVkZWYgdW5pb24geworCXUzMiByYXc7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hXzBzdGFydCAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRtYV8wTm9fdXBkYXRlICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfYWRkcmVzczAgICAgICAgICAgICAgICAgICAgOjMwOworCX0gZG1hXzB4MDsKKworCXN0cnVjdCB7CisJCXUzMiBETUFfbWF4cGFja2V0cyAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwl9IGRtYV8weDRfcmVtYXA7CisKKwlzdHJ1Y3QgeworCQl1MzIgZG1hMXRpbWVyICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWFfYWRkcl9zaXplICAgICAgICAgICAgICAgICAgOjI0OworCX0gZG1hXzB4NF9yZWFkOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkbWF0aW1lciAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgZG1hX2FkZHJfc2l6ZSAgICAgICAgICAgICAgICAgIDoyNDsKKwl9IGRtYV8weDRfd3JpdGU7CisKKwlzdHJ1Y3QgeworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIGRtYV9jdXJfYWRkciAgICAgICAgICAgICAgICAgICA6MzA7CisJfSBkbWFfMHg4OworCisJc3RydWN0IHsKKwkJdTMyIGRtYV8xc3RhcnQgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZW1hcF9lbmFibGUgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZG1hX2FkZHJlc3MxICAgICAgICAgICAgICAgICAgIDozMDsKKwl9IGRtYV8weGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2hpcGFkZHIgICAgICAgICAgICAgICAgICAgICAgIDogNzsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBiYXNlYWRkciAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZGF0YTFfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIHdvcmtpbmdfc3RhcnQgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB0d29XU19ydyAgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdG90YWxfYnl0ZXMgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHR3b1dTX3BvcnRfcmVnICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBub19iYXNlX2FkZHJfYWNrX2Vycm9yICAgICAgICAgOiAxOworCQl1MzIgc3RfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwl9IHR3X3NtX2NfMTAwOworCisJc3RydWN0IHsKKwkJdTMyIGRhdGEyX3JlZyAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBkYXRhM19yZWcgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgZGF0YTRfcmVnICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIGV4bGljaXRfc3RvcHMgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBmb3JjZV9zdG9wICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IHR3X3NtX2NfMTA0OworCisJc3RydWN0IHsKKwkJdTMyIHRoaTEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiByZXNlcnZlZDEgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgdGxvMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6MTk7CisJfSB0d19zbV9jXzEwODsKKworCXN0cnVjdCB7CisJCXUzMiB0aGkxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHRsbzEgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOjE5OworCX0gdHdfc21fY18xMGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgdGhpMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB0bG8xICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDoxOTsKKwl9IHR3X3NtX2NfMTEwOworCisJc3RydWN0IHsKKwkJdTMyIExOQl9DVExIaWdoQ291bnRfc2lnICAgICAgICAgICA6MTU7CisJCXUzMiBMTkJfQ1RMTG93Q291bnRfc2lnICAgICAgICAgICAgOjE1OworCQl1MzIgTE5CX0NUTFByZXNjYWxlcl9zaWcgICAgICAgICAgIDogMjsKKwl9IGxuYl9zd2l0Y2hfZnJlcV8yMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgQUNQSTFfc2lnICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEFDUEkzX3NpZyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBMTkJfTF9IX3NpZyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUGVyX3Jlc2V0X3NpZyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MjA7CisJCXUzMiBSZXZfTl9zaWdfcmV2aXNpb25faGkgICAgICAgICAgOiA0OworCQl1MzIgUmV2X05fc2lnX3Jlc2VydmVkMSAgICAgICAgICAgIDogMjsKKwkJdTMyIFJldl9OX3NpZ19jYXBzICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBSZXZfTl9zaWdfcmVzZXJ2ZWQyICAgICAgICAgICAgOiAxOworCX0gbWlzY18yMDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgU3RyZWFtMV9maWx0ZXJfc2lnICAgICAgICAgICAgIDogMTsKKwkJdTMyIFN0cmVhbTJfZmlsdGVyX3NpZyAgICAgICAgICAgICA6IDE7CisJCXUzMiBQQ1JfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUE1UX2ZpbHRlcl9zaWcgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfc2lnICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFQ01fZmlsdGVyX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTnVsbF9maWx0ZXJfc2lnICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE1hc2tfZmlsdGVyX3NpZyAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBXQU5fRW5hYmxlX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgV0FOX0NBX0VuYWJsZV9zaWcgICAgICAgICAgICAgIDogMTsKKwkJdTMyIENBX0VuYWJsZV9zaWcgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBTTUNfRW5hYmxlX3NpZyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUGVyX0NBX0VuYWJsZV9zaWcgICAgICAgICAgICAgIDogMTsKKwkJdTMyIE11bHRpMl9FbmFibGVfc2lnICAgICAgICAgICAgICA6IDE7CisJCXUzMiBNQUNfZmlsdGVyX01vZGVfc2lnICAgICAgICAgICAgOiAxOworCQl1MzIgUmN2X0RhdGFfc2lnICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfSVJRX0VuYWJsZV9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1RpbWVyX0VuYWJsZV9zaWcgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9JUlFfRW5hYmxlX3NpZyAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTJfVGltZXJfRW5hYmxlX3NpZyAgICAgICAgICA6IDE7CisJCXUzMiBETUExX1NpemVfSVJRX0VuYWJsZV9zaWcgICAgICAgOiAxOworCQl1MzIgRE1BMl9TaXplX0lSUV9FbmFibGVfc2lnICAgICAgIDogMTsKKwkJdTMyIE1haWxib3hfZnJvbV9WOF9FbmFibGVfc2lnICAgICA6IDE7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA5OworCX0gY3RybF8yMDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgRE1BMV9JUlFfU3RhdHVzICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfVGltZXJfU3RhdHVzICAgICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX0lSUV9TdGF0dXMgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRE1BMl9UaW1lcl9TdGF0dXMgICAgICAgICAgICAgIDogMTsKKwkJdTMyIERNQTFfU2l6ZV9JUlFfU3RhdHVzICAgICAgICAgICA6IDE7CisJCXUzMiBETUEyX1NpemVfSVJRX1N0YXR1cyAgICAgICAgICAgOiAxOworCQl1MzIgTWFpbGJveF9mcm9tX1Y4X1N0YXR1c19zaWcgICAgIDogMTsKKwkJdTMyIERhdGFfcmVjZWl2ZXJfZXJyb3IgICAgICAgICAgICA6IDE7CisJCXUzMiBDb250aW51aXR5X2Vycm9yX2ZsYWcgICAgICAgICAgOiAxOworCQl1MzIgTExDX1NOQVBfRkxBR19zZXQgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFRyYW5zcG9ydF9FcnJvciAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjIxOworCX0gaXJxXzIwYzsKKworCXN0cnVjdCB7CisJCXUzMiByZXNldF9ibG9ja18wMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfMTAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzIwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja18zMDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNDAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2V0X2Jsb2NrXzUwMCAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNldF9ibG9ja182MDAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXRfYmxvY2tfNzAwICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEJsb2NrX3Jlc2V0X2VuYWJsZSAgICAgICAgICAgICA6IDg7CisJCXUzMiBTcGVjaWFsX2NvbnRyb2xzICAgICAgICAgICAgICAgOjE2OworCX0gc3dfcmVzZXRfMjEwOworCisJc3RydWN0IHsKKwkJdTMyIHZ1YXJ0X29lX3NpZyAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB2MldTX29lX3NpZyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgaGFsdF9WOF9zaWcgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHNlY3Rpb25fcGtnX2VuYWJsZV9zaWcgICAgICAgICA6IDE7CisJCXUzMiBzMnBfc2VsX3NpZyAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgdW51c2VkMSAgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwkJdTMyIHBvbGFyaXR5X1BTX0NMS19zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiBwb2xhcml0eV9QU19WQUxJRF9zaWcgICAgICAgICAgOiAxOworCQl1MzIgcG9sYXJpdHlfUFNfU1lOQ19zaWcgICAgICAgICAgIDogMTsKKwkJdTMyIHBvbGFyaXR5X1BTX0VSUl9zaWcgICAgICAgICAgICA6IDE7CisJCXUzMiB1bnVzZWQyICAgICAgICAgICAgICAgICAgICAgICAgOjIwOworCX0gbWlzY18yMTQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgTWFpbGJveF9mcm9tX1Y4ICAgICAgICAgICAgICAgIDozMjsKKwl9IG1ib3hfdjhfdG9faG9zdF8yMTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3lzcmFtYWNjZXNzX2RhdGEgICAgICAgICAgICAgIDogODsKKwkJdTMyIHN5c3JhbWFjY2Vzc19hZGRyICAgICAgICAgICAgICA6MTU7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgc3lzcmFtYWNjZXNzX3dyaXRlICAgICAgICAgICAgIDogMTsKKwkJdTMyIHN5c3JhbWFjY2Vzc19idXNtdXN0ZXIgICAgICAgICA6IDE7CisJfSBtYm94X2hvc3RfdG9fdjhfMjFjOworCisJc3RydWN0IHsKKwkJdTMyIFN0cmVhbTFfUElEICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBTdHJlYW0xX3RyYW5zICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgTUFDX011bHRpY2FzdF9maWx0ZXIgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX2ZsYWdfcGlkX3NhdmVkICAgICAgICAgICA6IDE7CisJCXUzMiBTdHJlYW0yX1BJRCAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgU3RyZWFtMl90cmFucyAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGRlYnVnX2ZsYWdfd3JpdGVfc3RhdHVzMDAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19maWZvX3Byb2JsZW0gICAgICAgICAgICAgOiAxOworCX0gcGlkX2ZpbHRlcl8zMDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgUENSX1BJRCAgICAgICAgICAgICAgICAgICAgICAgIDoxMzsKKwkJdTMyIFBDUl90cmFucyAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBkZWJ1Z19vdmVycnVuMyAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgZGVidWdfb3ZlcnJ1bjIgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFBNVF9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBQTVRfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwl9IHBpZF9maWx0ZXJfMzA0OworCisJc3RydWN0IHsKKwkJdTMyIEVNTV9QSUQgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBFTU1fdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgRU1NX2ZpbHRlcl80ICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIEVNTV9maWx0ZXJfNiAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBFQ01fUElEICAgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgRUNNX3RyYW5zICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJfSBwaWRfZmlsdGVyXzMwODsKKworCXN0cnVjdCB7CisJCXUzMiBHcm91cF9QSUQgICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgR3JvdXBfdHJhbnMgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBHcm91cF9tYXNrICAgICAgICAgICAgICAgICAgICAgOjEzOworCQl1MzIgdW51c2VkMiAgICAgICAgICAgICAgICAgICAgICAgIDogMzsKKwl9IHBpZF9maWx0ZXJfMzBjX2V4dF9pbmRfMF83OworCisJc3RydWN0IHsKKwkJdTMyIG5ldF9tYXN0ZXJfcmVhZCAgICAgICAgICAgICAgICA6MTc7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjE1OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8xOworCisJc3RydWN0IHsKKwkJdTMyIG5ldF9tYXN0ZXJfd3JpdGUgICAgICAgICAgICAgICA6MTc7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjE1OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8yOworCisJc3RydWN0IHsKKwkJdTMyIG5leHRfbmV0X21hc3Rlcl93cml0ZSAgICAgICAgICA6MTc7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjE1OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF8zOworCisJc3RydWN0IHsKKwkJdTMyIHVudXNlZDEgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzdGF0ZV93cml0ZSAgICAgICAgICAgICAgICAgICAgOjEwOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIHN0YWNrX3JlYWQgICAgICAgICAgICAgICAgICAgICA6MTA7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiA1OworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF80OworCisJc3RydWN0IHsKKwkJdTMyIHN0YWNrX2NudCAgICAgICAgICAgICAgICAgICAgICA6MTA7CisJCXUzMiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgOjIyOworCX0gcGlkX2ZpbHRlcl8zMGNfZXh0X2luZF81OworCisJc3RydWN0IHsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWcwICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnMSAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzIgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHBpZF9mc21fc2F2ZV9yZWczICAgICAgICAgICAgICA6IDI7CisJCXUzMiBwaWRfZnNtX3NhdmVfcmVnNCAgICAgICAgICAgICAgOiAyOworCQl1MzIgcGlkX2ZzbV9zYXZlX3JlZzMwMCAgICAgICAgICAgIDogMjsKKwkJdTMyIHdyaXRlX3N0YXR1czEgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiB3cml0ZV9zdGF0dXM0ICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgZGF0YV9zaXplX3JlZyAgICAgICAgICAgICAgICAgIDoxMjsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJfSBwaWRfZmlsdGVyXzMwY19leHRfaW5kXzY7CisKKwlzdHJ1Y3QgeworCQl1MzIgaW5kZXhfcmVnICAgICAgICAgICAgICAgICAgICAgIDogNTsKKwkJdTMyIGV4dHJhX2luZGV4X3JlZyAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBBQl9zZWxlY3QgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGFzc19hbGx0YWJsZXMgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICA6MjI7CisJfSBpbmRleF9yZWdfMzEwOworCisJc3RydWN0IHsKKwkJdTMyIFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBQSURfdHJhbnMgICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgUElEX2VuYWJsZV9iaXQgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTc7CisJfSBwaWRfbl9yZWdfMzE0OworCisJc3RydWN0IHsKKwkJdTMyIEE0X2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBBNV9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTZfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEVuYWJsZV9iaXQgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBIaWdoQUJfYml0ICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwl9IG1hY19sb3dfcmVnXzMxODsKKworCXN0cnVjdCB7CisJCXUzMiBBMV9ieXRlICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQTJfYnl0ZSAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIEEzX2J5dGUgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2hpZ2hfcmVnXzMxYzsKKworCXN0cnVjdCB7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOjE2OworCQl1MzIgZGF0YV9UYWdfSUQgICAgICAgICAgICAgICAgICAgIDoxNjsKKwl9IGRhdGFfdGFnXzQwMDsKKworCXN0cnVjdCB7CisJCXUzMiBDYXJkX0lEYnl0ZTYgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgQ2FyZF9JRGJ5dGU1ICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlNCAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBDYXJkX0lEYnl0ZTMgICAgICAgICAgICAgICAgICAgOiA4OworCX0gY2FyZF9pZF80MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgQ2FyZF9JRGJ5dGUyICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIENhcmRfSURieXRlMSAgICAgICAgICAgICAgICAgICA6IDg7CisJfSBjYXJkX2lkXzQwYzsKKworCXN0cnVjdCB7CisJCXUzMiBNQUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgTUFDMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogODsKKwkJdTMyIE1BQzMgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCX0gbWFjX2FkZHJlc3NfNDE4OworCisJc3RydWN0IHsKKwkJdTMyIE1BQzcgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDg7CisJCXUzMiBNQUM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoxNjsKKwl9IG1hY19hZGRyZXNzXzQxYzsKKworCXN0cnVjdCB7CisJCXUzMiB0cmFuc21pdHRlcl9kYXRhX2J5dGUgICAgICAgICAgOiA4OworCQl1MzIgUmVjZWl2ZURhdGFSZWFkeSAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFJlY2VpdmVCeXRlRnJhbWVFcnJvciAgICAgICAgICA6IDE7CisJCXUzMiB0eGJ1ZmZlbXB0eSAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgIDoyMTsKKwl9IGNpXzYwMDsKKworCXN0cnVjdCB7CisJCXUzMiBwaV9kICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgcGlfaGEgICAgICAgICAgICAgICAgICAgICAgICAgIDoyMDsKKwkJdTMyIHBpX3J3ICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV9jb21wb25lbnRfcmVnICAgICAgICAgICAgICAgOiAzOworCX0gcGlfNjA0OworCisJc3RydWN0IHsKKwkJdTMyIHNlcmlhbFJlc2V0ICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBvbmNlY3ljbGVfcmVhZCAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgVGltZXJfUmVhZF9yZXEgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFRpbWVyX0xvYWRfcmVxICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiB0aW1lcl9kYXRhICAgICAgICAgICAgICAgICAgICAgOiA3OworCQl1MzIgdW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIFRpbWVyX2FkZHIgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgcGNtY2lhX2FfbW9kX3B3cl9uICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBjbWNpYV9iX21vZF9wd3JfbiAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfRG9uZV9zdGF0ICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX0luaXRfc3RhdCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19Qcm9nX24gICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjb25maWdfd3JfbiAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY29uZmlnX2NzX24gICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGNvbmZpZ19jY2xrICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV9DaU1heF9JUlFfbiAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgcGlfdGltZW91dF9zdGF0dXMgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHBpX3dhaXRfbiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBwaV9idXN5X24gICAgICAgICAgICAgICAgICAgICAgOiAxOworCX0gcGlfNjA4OworCisJc3RydWN0IHsKKwkJdTMyIFBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MTM7CisJCXUzMiBrZXlfZW5hYmxlICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIga2V5X2NvZGUgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIGtleV9hcnJheV9jb2wgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBrZXlfYXJyYXlfcm93ICAgICAgICAgICAgICAgICAgOiA1OworCQl1MzIgZHZiX2VuICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJ3X2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgOiA2OworCX0gZHZiX3JlZ182MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgc3JhbV9hZGRyICAgICAgICAgICAgICAgICAgICAgIDoxNTsKKwkJdTMyIHNyYW1fcncgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzcmFtX2RhdGEgICAgICAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgc2NfeGZlcl9iaXQgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDM7CisJCXUzMiBvZV9waW5fcmVnICAgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2VfcGluX3JlZyAgICAgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMiAgICAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBzdGFydF9zcmFtX2liaSAgICAgICAgICAgICAgICAgOiAxOworCX0gc3JhbV9jdHJsX3JlZ183MDA7CisKKwlzdHJ1Y3QgeworCQl1MzIgbmV0X2FkZHJfcmVhZCAgICAgICAgICAgICAgICAgIDoxNjsKKwkJdTMyIG5ldF9hZGRyX3dyaXRlICAgICAgICAgICAgICAgICA6MTY7CisJfSBuZXRfYnVmX3JlZ183MDQ7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2FpX3JlYWQgICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBjYWlfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIGNhaV9jbnQgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJfSBjYWlfYnVmX3JlZ183MDg7CisKKwlzdHJ1Y3QgeworCQl1MzIgY2FvX3JlYWQgICAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBjYXBfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIGNhb19jbnQgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJfSBjYW9fYnVmX3JlZ183MGM7CisKKwlzdHJ1Y3QgeworCQl1MzIgbWVkaWFfcmVhZCAgICAgICAgICAgICAgICAgICAgIDoxMTsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDU7CisJCXUzMiBtZWRpYV93cml0ZSAgICAgICAgICAgICAgICAgICAgOjExOworCQl1MzIgcmVzZXJ2ZWQyICAgICAgICAgICAgICAgICAgICAgIDogNjsKKwkJdTMyIG1lZGlhX2NudCAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJfSBtZWRpYV9idWZfcmVnXzcxMDsKKworCXN0cnVjdCB7CisJCXUzMiBORVRfRGVzdCAgICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgQ0FJX0Rlc3QgICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIENBT19EZXN0ICAgICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiBNRURJQV9EZXN0ICAgICAgICAgICAgICAgICAgICAgOiAyOworCQl1MzIgbmV0X292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIG1lZGlhX292Zmxvd19lcnJvciAgICAgICAgICAgICA6IDE7CisJCXUzMiBjYWlfb3ZmbG93X2Vycm9yICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY2FvX292Zmxvd19lcnJvciAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIGN0cmxfdXNiX3dhbiAgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiBjdHJsX3NyYW1kbWEgICAgICAgICAgICAgICAgICAgOiAxOworCQl1MzIgY3RybF9tYXhpbXVtZmlsbCAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICA6MTc7CisJfSBzcmFtX2Rlc3RfcmVnXzcxNDsKKworCXN0cnVjdCB7CisJCXUzMiBuZXRfY250ICAgICAgICAgICAgICAgICAgICAgICAgOjEyOworCQl1MzIgcmVzZXJ2ZWQxICAgICAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIG5ldF9hZGRyX3JlYWQgICAgICAgICAgICAgICAgICA6IDE7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiAzOworCQl1MzIgbmV0X2FkZHJfd3JpdGUgICAgICAgICAgICAgICAgIDogMTsKKwkJdTMyIHJlc2VydmVkMyAgICAgICAgICAgICAgICAgICAgICA6MTE7CisJfSBuZXRfYnVmX3JlZ183MTg7CisKKwlzdHJ1Y3QgeworCQl1MzIgd2FuX3NwZWVkX3NpZyAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHJlc2VydmVkMSAgICAgICAgICAgICAgICAgICAgICA6IDY7CisJCXUzMiB3YW5fd2FpdF9zdGF0ZSAgICAgICAgICAgICAgICAgOiA4OworCQl1MzIgc3JhbV9jaGlwICAgICAgICAgICAgICAgICAgICAgIDogMjsKKwkJdTMyIHNyYW1fbWVtbWFwICAgICAgICAgICAgICAgICAgICA6IDI7CisJCXUzMiByZXNlcnZlZDIgICAgICAgICAgICAgICAgICAgICAgOiA0OworCQl1MzIgd2FuX3BrdF9mcmFtZSAgICAgICAgICAgICAgICAgIDogNDsKKwkJdTMyIHJlc2VydmVkMyAgICAgICAgICAgICAgICAgICAgICA6IDQ7CisJfSB3YW5fY3RybF9yZWdfNzFjOworfSBmbGV4Y29wX2liaV92YWx1ZTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL3NreXN0YXIyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL3NreXN0YXIyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmM0YzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9za3lzdGFyMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY0NCArMCwwIEBACi0vKgotICogc2t5c3RhcjIuYyAtIGRyaXZlciBmb3IgdGhlIFRlY2huaXNhdCBTa3lTdGFyMiBQQ0kgRFZCIGNhcmQKLSAqICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgRmxleENvcElJIGJ5IEIyQzIsSW5jLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAgVmFkaW0gQ2F0YW5hLCBza3lzdGFyQG1vbGRvdmEuY2MKLSAqCi0gKiBGSVg6IERJU0VRQyBUb25lIEJ1cnN0IGluIGZsZXhjb3BfZGlzZXFjX2lvY3RsKCkKLSAqIEZJWDogRlVMTCBzb2Z0IERpU0VxQyBmb3Igc2t5c3RhcjIgKEZsZXhDb3BJSSByZXYgMTMwKSBWUDMxMCBlcXVpcHBlZAotICogICAgIFZpbmNlbnpvIERpIE1hc3NhLCBoYXdrLml0IGF0IHRpc2NhbGluZXQuaXQKLSAqCi0gKiBDb252ZXJ0ZWQgdG8gTGludXggY29kaW5nIHN0eWxlCi0gKiBNaXNjIHJlb3JnYW5pemF0aW9uLCBwb2xpc2hpbmcsIHJlc3R5bGluZwotICogICAgIFJvYmVydG8gUmFndXNhLCBza3lzdGFyMi1jNWI4IGF0IHJvYmVydG9yYWd1c2EgZG90IGl0Ci0gKgotICogQWRkZWQgaGFyZHdhcmUgZmlsdGVyaW5nIHN1cHBvcnQsCi0gKiAgICAgTmlrbGFzIFBlaW5lY2tlLCBwZWluZWNrZSBhdCBnZHYudW5pLWhhbm5vdmVyLmRlCi0gKgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMQotICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotCi0jaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvZHZiL2RteC5oPgotI2luY2x1ZGUgImR2Yl9kZW11eC5oIgotI2luY2x1ZGUgImRteGRldi5oIgotI2luY2x1ZGUgImR2Yl9maWx0ZXIuaCIKLSNpbmNsdWRlICJkdmJkZXYuaCIKLSNpbmNsdWRlICJkZW11eC5oIgotI2luY2x1ZGUgImR2Yl9uZXQuaCIKLSNpbmNsdWRlICJzdHYwMjk5LmgiCi0jaW5jbHVkZSAibXQzNTIuaCIKLSNpbmNsdWRlICJtdDMxMi5oIgotI2luY2x1ZGUgIm54dDIwMDIuaCIKLQotc3RhdGljIGludCBkZWJ1ZzsKLXN0YXRpYyBpbnQgZW5hYmxlX2h3X2ZpbHRlcnMgPSAyOwotCi1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0IGRlYnVnZ2luZyBsZXZlbCAoMCA9IGRlZmF1bHQsIDEgPSBtb3N0IG1lc3NhZ2VzLCAyID0gYWxsIG1lc3NhZ2VzKS4iKTsKLW1vZHVsZV9wYXJhbShlbmFibGVfaHdfZmlsdGVycywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2h3X2ZpbHRlcnMsICJlbmFibGUgaGFyZHdhcmUgZmlsdGVyczogc3VwcG9ydGVkIHZhbHVlczogMCAobm9uZSksIDEsIDIiKTsKLQotI2RlZmluZSBkcHJpbnRrKHguLi4pCWRvIHsgaWYgKGRlYnVnPj0xKSBwcmludGsoeCk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGRkcHJpbnRrKHguLi4pCWRvIHsgaWYgKGRlYnVnPj0yKSBwcmludGsoeCk7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgU0laRV9PRl9CVUZfRE1BMQkweDNhYzAwCi0jZGVmaW5lIFNJWkVfT0ZfQlVGX0RNQTIJMHg3NTgKLQotI2RlZmluZSBNQVhfTl9IV19GSUxURVJTCSg2KzMyKQotI2RlZmluZSBOX1BJRF9TTE9UUwkJMjU2Ci0KLXN0cnVjdCBkbWFxIHsKLQl1MzIgYnVzX2FkZHI7Ci0JdTMyIGhlYWQ7Ci0JdTMyIHRhaWw7Ci0JdTMyIGJ1ZmZlcl9zaXplOwotCXU4ICpidWZmZXI7Ci19OwotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDkpCi0jZGVmaW5lIF9faW9tZW0KLSNlbmRpZgotCi1zdHJ1Y3QgYWRhcHRlciB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0KLQl1OCBjYXJkX3JldmlzaW9uOwotCXUzMiBiMmMyX3JldmlzaW9uOwotCXUzMiBwaWRfZmlsdGVyX21heDsKLQl1MzIgbWFjX2ZpbHRlcl9tYXg7Ci0JdTMyIGlycTsKLQl2b2lkIF9faW9tZW0gKmlvX21lbTsKLQl1bnNpZ25lZCBsb25nIGlvX3BvcnQ7Ci0JdTggbWFjX2FkZHJbOF07Ci0JdTMyIGR3X3NyYW1fdHlwZTsKLQotCXN0cnVjdCBkdmJfYWRhcHRlciBkdmJfYWRhcHRlcjsKLQlzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OwotCXN0cnVjdCBkbXhkZXYgZG14ZGV2OwotCXN0cnVjdCBkbXhfZnJvbnRlbmQgaHdfZnJvbnRlbmQ7Ci0Jc3RydWN0IGRteF9mcm9udGVuZCBtZW1fZnJvbnRlbmQ7Ci0Jc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOwotCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKLQotCXN0cnVjdCBzZW1hcGhvcmUgaTJjX3NlbTsKLQotCXN0cnVjdCBkbWFxIGRtYXExOwotCXN0cnVjdCBkbWFxIGRtYXEyOwotCi0JdTMyIGRtYV9jdHJsOwotCXUzMiBkbWFfc3RhdHVzOwotCi0JaW50IGNhcHR1cmluZzsKLQotCXNwaW5sb2NrX3QgbG9jazsKLQotCWludCB1c2VhYmxlX2h3X2ZpbHRlcnM7Ci0JdTE2IGh3X3BpZHNbTUFYX05fSFdfRklMVEVSU107Ci0JdTE2IHBpZF9saXN0W05fUElEX1NMT1RTXTsKLQlpbnQgcGlkX3JjW05fUElEX1NMT1RTXTsJLy8gcmVmIGNvdW50ZXJzIGZvciB0aGUgcGlkcwotCWludCBwaWRfY291bnQ7Ci0JaW50IHdob2xlX2JhbmR3aWR0aF9jb3VudDsKLQl1MzIgbWFjX2ZpbHRlcjsKLQotCXN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlOwotCWludCAoKmZlX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci19OwotCi0jZGVmaW5lIHdyaXRlX3JlZ19kdyhhZGFwdGVyLHJlZyx2YWx1ZSkgd3JpdGVsKHZhbHVlLCBhZGFwdGVyLT5pb19tZW0gKyByZWcpCi0jZGVmaW5lIHJlYWRfcmVnX2R3KGFkYXB0ZXIscmVnKSByZWFkbChhZGFwdGVyLT5pb19tZW0gKyByZWcpCi0KLXN0YXRpYyB2b2lkIHdyaXRlX3JlZ19iaXRmaWVsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIHJlZywgdTMyIHplcm9tYXNrLCB1MzIgb3J2YWx1ZSkKLXsKLQl1MzIgdG1wOwotCi0JdG1wID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgcmVnKTsKLQl0bXAgPSAodG1wICYgfnplcm9tYXNrKSB8IG9ydmFsdWU7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIHJlZywgdG1wKTsKLX0KLQotLyogaTJjIGZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBpMmNfbWFpbl93cml0ZV9mb3JfZmxleDIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjb21tYW5kLCB1OCAqYnVmLCBpbnQgcmV0cmllcykKLXsKLQlpbnQgaTsKLQl1MzIgdmFsdWU7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDAsIDApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDEwMCwgY29tbWFuZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmV0cmllczsgaSsrKSB7Ci0JCXZhbHVlID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgxMDApOwotCi0JCWlmICgodmFsdWUgJiAweDQwMDAwMDAwKSA9PSAwKSB7Ci0JCQlpZiAoKHZhbHVlICYgMHg4MTAwMDAwMCkgPT0gMHg4MDAwMDAwMCkgewotCQkJCWlmIChidWYgIT0gMCkKLQkJCQkJKmJ1ZiA9ICh2YWx1ZSA+PiAweDEwKSAmIDB4ZmY7Ci0KLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDEwMCwgMCk7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDAsIGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGRldmljZSA9IDB4MTAwMDAwMDAgZm9yIHR1bmVyLCAweDIwMDAwMDAwIGZvciBlZXByb20gKi8KLXN0YXRpYyB2b2lkIGkyY19tYWluX3NldHVwKHUzMiBkZXZpY2UsIHUzMiBjaGlwX2FkZHIsIHU4IG9wLCB1OCBhZGRyLCB1MzIgdmFsdWUsIHUzMiBsZW4sIHUzMiAqY29tbWFuZCkKLXsKLQkqY29tbWFuZCA9IGRldmljZSB8ICgobGVuIC0gMSkgPDwgMjYpIHwgKHZhbHVlIDw8IDE2KSB8IChhZGRyIDw8IDgpIHwgY2hpcF9hZGRyOwotCi0JaWYgKG9wICE9IDApCi0JCSpjb21tYW5kID0gKmNvbW1hbmQgfCAweDAzMDAwMDAwOwotCWVsc2UKLQkJKmNvbW1hbmQgPSAqY29tbWFuZCB8IDB4MDEwMDAwMDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleF9pMmNfcmVhZDQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkZXZpY2UsIHUzMiBjaGlwX2FkZHIsIHUxNiBhZGRyLCB1OCAqYnVmLCB1OCBsZW4pCi17Ci0JdTMyIGNvbW1hbmQ7Ci0JdTMyIHZhbHVlOwotCi0JaW50IHJlc3VsdCwgaTsKLQotCWkyY19tYWluX3NldHVwKGRldmljZSwgY2hpcF9hZGRyLCAxLCBhZGRyLCAwLCBsZW4sICZjb21tYW5kKTsKLQotCXJlc3VsdCA9IGkyY19tYWluX3dyaXRlX2Zvcl9mbGV4MihhZGFwdGVyLCBjb21tYW5kLCBidWYsIDEwMDAwMCk7Ci0KLQlpZiAoKHJlc3VsdCAmIDB4ZmYpICE9IDApIHsKLQkJaWYgKGxlbiA+IDEpIHsKLQkJCXZhbHVlID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgxMDQpOwotCi0JCQlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlidWZbaV0gPSB2YWx1ZSAmIDB4ZmY7Ci0JCQkJdmFsdWUgPSB2YWx1ZSA+PiA4OwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBmbGV4X2kyY193cml0ZTQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkZXZpY2UsIHUzMiBjaGlwX2FkZHIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1OCBsZW4pCi17Ci0JdTMyIGNvbW1hbmQ7Ci0JdTMyIHZhbHVlOwotCWludCBpOwotCi0JaWYgKGxlbiA+IDEpIHsKLQkJdmFsdWUgPSAwOwotCi0JCWZvciAoaSA9IGxlbjsgaSA+IDE7IGktLSkgewotCQkJdmFsdWUgPSB2YWx1ZSA8PCA4OwotCQkJdmFsdWUgPSB2YWx1ZSB8IGJ1ZltpIC0gMV07Ci0JCX0KLQotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgxMDQsIHZhbHVlKTsKLQl9Ci0KLQlpMmNfbWFpbl9zZXR1cChkZXZpY2UsIGNoaXBfYWRkciwgMCwgYWRkciwgYnVmWzBdLCBsZW4sICZjb21tYW5kKTsKLQotCXJldHVybiBpMmNfbWFpbl93cml0ZV9mb3JfZmxleDIoYWRhcHRlciwgY29tbWFuZCwgTlVMTCwgMTAwMDAwKTsKLX0KLQotc3RhdGljIHZvaWQgZml4Y2hpcGFkZHIodTMyIGRldmljZSwgdTMyIGJ1cywgdTMyIGFkZHIsIHUzMiAqcmV0KQotewotCWlmIChkZXZpY2UgPT0gMHgyMDAwMDAwMCkKLQkJKnJldCA9IGJ1cyB8ICgoYWRkciA+PiA4KSAmIDMpOwotCWVsc2UKLQkJKnJldCA9IGJ1czsKLX0KLQotc3RhdGljIHUzMiBmbGV4X2kyY19yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZGV2aWNlLCB1MzIgYnVzLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQl1MzIgY2hpcGFkZHI7Ci0JdTMyIGJ5dGVzX3RvX3RyYW5zZmVyOwotCXU4ICpzdGFydDsKLQotCWRkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlzdGFydCA9IGJ1ZjsKLQotCXdoaWxlIChsZW4gIT0gMCkgewotCQlieXRlc190b190cmFuc2ZlciA9IGxlbjsKLQotCQlpZiAoYnl0ZXNfdG9fdHJhbnNmZXIgPiA0KQotCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSA0OwotCi0JCWZpeGNoaXBhZGRyKGRldmljZSwgYnVzLCBhZGRyLCAmY2hpcGFkZHIpOwotCi0JCWlmIChmbGV4X2kyY19yZWFkNChhZGFwdGVyLCBkZXZpY2UsIGNoaXBhZGRyLCBhZGRyLCBidWYsIGJ5dGVzX3RvX3RyYW5zZmVyKSA9PSAwKQotCQkJcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotCi0JCWJ1ZiA9IGJ1ZiArIGJ5dGVzX3RvX3RyYW5zZmVyOwotCQlhZGRyID0gYWRkciArIGJ5dGVzX3RvX3RyYW5zZmVyOwotCQlsZW4gPSBsZW4gLSBieXRlc190b190cmFuc2ZlcjsKLQl9OwotCi0JcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotfQotCi1zdGF0aWMgdTMyIGZsZXhfaTJjX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZGV2aWNlLCB1MzIgYnVzLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQl1MzIgY2hpcGFkZHI7Ci0JdTMyIGJ5dGVzX3RvX3RyYW5zZmVyOwotCXU4ICpzdGFydDsKLQotCWRkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlzdGFydCA9IGJ1ZjsKLQotCXdoaWxlIChsZW4gIT0gMCkgewotCQlieXRlc190b190cmFuc2ZlciA9IGxlbjsKLQotCQlpZiAoYnl0ZXNfdG9fdHJhbnNmZXIgPiA0KQotCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSA0OwotCi0JCWZpeGNoaXBhZGRyKGRldmljZSwgYnVzLCBhZGRyLCAmY2hpcGFkZHIpOwotCi0JCWlmIChmbGV4X2kyY193cml0ZTQoYWRhcHRlciwgZGV2aWNlLCBjaGlwYWRkciwgYWRkciwgYnVmLCBieXRlc190b190cmFuc2ZlcikgPT0gMCkKLQkJCXJldHVybiBidWYgLSBzdGFydDsKLQotCQlidWYgPSBidWYgKyBieXRlc190b190cmFuc2ZlcjsKLQkJYWRkciA9IGFkZHIgKyBieXRlc190b190cmFuc2ZlcjsKLQkJbGVuID0gbGVuIC0gYnl0ZXNfdG9fdHJhbnNmZXI7Ci0JfQotCi0JcmV0dXJuIGJ1ZiAtIHN0YXJ0OwotfQotCi1zdGF0aWMgaW50IG1hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciogYWRhcHRlciwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKnRtcCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7Ci0JaW50IGksIHJldCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ0bXAtPmkyY19zZW0pKQotCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCi0JZGRwcmludGsoIiVzOiAlZCBtZXNzYWdlcyB0byB0cmFuc2ZlclxuIiwgX19GVU5DVElPTl9fLCBudW0pOwotCi0JCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlkZHByaW50aygibWVzc2FnZSAlZDogZmxhZ3M9MHgleCwgYWRkcj0weCV4LCBidWY9MHgleCwgbGVuPSVkIFxuIiwgaSwKLQkJCSBtc2dzW2ldLmZsYWdzLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uYnVmWzBdLCBtc2dzW2ldLmxlbik7Ci0JfQotCi0JLy8gcmVhZCBjb21tYW5kCi0JaWYgKChudW0gPT0gMikgJiYgKG1zZ3NbMF0uZmxhZ3MgPT0gMCkgJiYgKG1zZ3NbMV0uZmxhZ3MgPT0gSTJDX01fUkQpICYmIChtc2dzWzBdLmJ1ZiAhPSBOVUxMKSAmJiAobXNnc1sxXS5idWYgIT0gTlVMTCkpIHsKLQotCQlyZXQgPSBmbGV4X2kyY19yZWFkKHRtcCwgMHgxMDAwMDAwMCwgbXNnc1swXS5hZGRyLCBtc2dzWzBdLmJ1ZlswXSwgbXNnc1sxXS5idWYsIG1zZ3NbMV0ubGVuKTsKLQotCQl1cCgmdG1wLT5pMmNfc2VtKTsKLQotCQlpZiAocmV0ICE9IG1zZ3NbMV0ubGVuKSB7Ci0JCQlkcHJpbnRrKCIlczogcmVhZCBlcnJvciAhXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQkJZHByaW50aygibWVzc2FnZSAlZDogZmxhZ3M9MHgleCwgYWRkcj0weCV4LCBidWY9MHgleCwgbGVuPSVkIFxuIiwgaSwKLQkJCQkgICAgICAgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5hZGRyLCBtc2dzW2ldLmJ1ZlswXSwgbXNnc1tpXS5sZW4pOwotCQl9Ci0KLQkJCXJldHVybiAtRVJFTU9URUlPOwotCQl9Ci0KLQkJcmV0dXJuIG51bTsKLQl9Ci0JLy8gd3JpdGUgY29tbWFuZAotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCi0JCWlmICgobXNnc1tpXS5mbGFncyAhPSAwKSB8fCAobXNnc1tpXS5idWYgPT0gTlVMTCkgfHwgKG1zZ3NbaV0ubGVuIDwgMikpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlyZXQgPSBmbGV4X2kyY193cml0ZSh0bXAsIDB4MTAwMDAwMDAsIG1zZ3NbaV0uYWRkciwgbXNnc1tpXS5idWZbMF0sICZtc2dzW2ldLmJ1ZlsxXSwgbXNnc1tpXS5sZW4gLSAxKTsKLQotCQl1cCgmdG1wLT5pMmNfc2VtKTsKLQotCQlpZiAocmV0ICE9IG1zZ3NbMF0ubGVuIC0gMSkgewotCQkJZHByaW50aygiJXM6IHdyaXRlIGVycm9yICVpICFcbiIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLQotCQkJZHByaW50aygibWVzc2FnZSAlZDogZmxhZ3M9MHgleCwgYWRkcj0weCV4LCBidWZbMF09MHgleCwgbGVuPSVkIFxuIiwgaSwKLQkJCSAgICAgICBtc2dzW2ldLmZsYWdzLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uYnVmWzBdLCBtc2dzW2ldLmxlbik7Ci0KLQkJCXJldHVybiAtRVJFTU9URUlPOwotCQl9Ci0KLQkJcmV0dXJuIG51bTsKLQl9Ci0KLQlwcmludGsoIiVzOiB1bmtub3duIGNvbW1hbmQgZm9ybWF0ICFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyogU1JBTSAoU2t5c3RhcjIgcmV2Mi4zIGhhcyBvbmUgIklTU0kgSVM2MUxWMjU2IiBjaGlwIG9uIGJvYXJkLAotICAgYnV0IGl0IHNlZW1zIHRoYXQgRmxleENvcElJIGNhbiB3b3JrIHdpdGggbW9yZSB0aGFuIG9uZSBjaGlwKSAqLwotc3RhdGljIHZvaWQgc3JhbV9zZXRfbmV0X2Rlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4IGRlc3QpCi17Ci0JdTMyIHRtcDsKLQotCXVkZWxheSgxMDAwKTsKLQotCXRtcCA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxNCkgJiAweGZmZmZmZmZjKSB8IChkZXN0ICYgMyk7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCi0JdWRlbGF5KDEwMDApOwotCi0JLyogcmV0dXJuIHZhbHVlIGlzIG5ldmVyIHVzZWQ/ICovCi0vKglyZXR1cm4gdG1wOyAqLwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3NldF9jYWlfZGVzdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggZGVzdCkKLXsKLQl1MzIgdG1wOwotCi0JdWRlbGF5KDEwMDApOwotCi0JdG1wID0gKHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0KSAmIDB4ZmZmZmZmZjMpIHwgKChkZXN0ICYgMykgPDwgMik7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0JdWRlbGF5KDEwMDApOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzE0LCB0bXApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQotCXVkZWxheSgxMDAwKTsKLQotCS8qIHJldHVybiB2YWx1ZSBpcyBuZXZlciB1c2VkPyAqLwotLyoJcmV0dXJuIHRtcDsgKi8KLX0KLQotc3RhdGljIHZvaWQgc3JhbV9zZXRfY2FvX2Rlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4IGRlc3QpCi17Ci0JdTMyIHRtcDsKLQotCXVkZWxheSgxMDAwKTsKLQotCXRtcCA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxNCkgJiAweGZmZmZmZmNmKSB8ICgoZGVzdCAmIDMpIDw8IDQpOwotCi0JdWRlbGF5KDEwMDApOwotCXVkZWxheSgxMDAwKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KLS8qCXJldHVybiB0bXA7ICovCi19Ci0KLXN0YXRpYyB2b2lkIHNyYW1fc2V0X21lZGlhX2Rlc3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4IGRlc3QpCi17Ci0JdTMyIHRtcDsKLQotCXVkZWxheSgxMDAwKTsKLQotCXRtcCA9IChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxNCkgJiAweGZmZmZmZjNmKSB8ICgoZGVzdCAmIDMpIDw8IDYpOwotCi0JdWRlbGF5KDEwMDApOwotCXVkZWxheSgxMDAwKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxNCwgdG1wKTsKLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MTQsIHRtcCk7Ci0KLQl1ZGVsYXkoMTAwMCk7Ci0KLQkvKiByZXR1cm4gdmFsdWUgaXMgbmV2ZXIgdXNlZD8gKi8KLS8qCXJldHVybiB0bXA7ICovCi19Ci0KLS8qIFNSQU0gbWVtb3J5IGlzIGFjY2Vzc2VkIHRocm91Z2ggYSBidWZmZXIgcmVnaXN0ZXIgaW4gdGhlIEZsZXhDb3AKLSAgIGNoaXAgKDB4NzAwKS4gVGhpcyByZWdpc3RlciBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gICAgYml0cyAwLTE0ICA6IGFkZHJlc3MKLSAgICBiaXQgIDE1ICAgIDogcmVhZC93cml0ZSBmbGFnCi0gICAgYml0cyAxNi0yMyA6IDgtYml0IHdvcmQgdG8gd3JpdGUKLSAgICBiaXRzIDI0LTI3IDogPSA0Ci0gICAgYml0cyAyOC0yOSA6IG1lbW9yeSBiYW5rIHNlbGVjdG9yCi0gICAgYml0ICAzMSAgICA6IGJ1c3kgZmxhZwotKi8KLXN0YXRpYyB2b2lkIGZsZXhfc3JhbV93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGJhbmssIHUzMiBhZGRyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCWludCBpLCByZXRyaWVzOwotCXUzMiBjb21tYW5kOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWNvbW1hbmQgPSBiYW5rIHwgYWRkciB8IDB4MDQwMDAwMDAgfCAoKmJ1ZiA8PCAweDEwKTsKLQotCQlyZXRyaWVzID0gMjsKLQotCQl3aGlsZSAoKChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcwMCkgJiAweDgwMDAwMDAwKSAhPSAwKSAmJiAocmV0cmllcyA+IDApKSB7Ci0JCQltZGVsYXkoMSk7Ci0JCQlyZXRyaWVzLS07Ci0JCX07Ci0KLQkJaWYgKHJldHJpZXMgPT0gMCkKLQkJCXByaW50aygiJXM6IFNSQU0gdGltZW91dFxuIiwgX19GVU5DVElPTl9fKTsKLQotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MDAsIGNvbW1hbmQpOwotCi0JCWJ1ZisrOwotCQlhZGRyKys7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmbGV4X3NyYW1fcmVhZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGJhbmssIHUzMiBhZGRyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCWludCBpLCByZXRyaWVzOwotCXUzMiBjb21tYW5kLCB2YWx1ZTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQljb21tYW5kID0gYmFuayB8IGFkZHIgfCAweDA0MDA4MDAwOwotCi0JCXJldHJpZXMgPSAxMDAwMDsKLQotCQl3aGlsZSAoKChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcwMCkgJiAweDgwMDAwMDAwKSAhPSAwKSAmJiAocmV0cmllcyA+IDApKSB7Ci0JCQltZGVsYXkoMSk7Ci0JCQlyZXRyaWVzLS07Ci0JCX07Ci0KLQkJaWYgKHJldHJpZXMgPT0gMCkKLQkJCXByaW50aygiJXM6IFNSQU0gdGltZW91dFxuIiwgX19GVU5DVElPTl9fKTsKLQotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MDAsIGNvbW1hbmQpOwotCi0JCXJldHJpZXMgPSAxMDAwMDsKLQotCQl3aGlsZSAoKChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcwMCkgJiAweDgwMDAwMDAwKSAhPSAwKSAmJiAocmV0cmllcyA+IDApKSB7Ci0JCQltZGVsYXkoMSk7Ci0JCQlyZXRyaWVzLS07Ci0JCX07Ci0KLQkJaWYgKHJldHJpZXMgPT0gMCkKLQkJCXByaW50aygiJXM6IFNSQU0gdGltZW91dFxuIiwgX19GVU5DVElPTl9fKTsKLQotCQl2YWx1ZSA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4NzAwKSA+PiAweDEwOwotCi0JCSpidWYgPSAodmFsdWUgJiAweGZmKTsKLQotCQlhZGRyKys7Ci0JCWJ1ZisrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3JhbV93cml0ZV9jaHVuayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHU4ICpidWYsIHUxNiBsZW4pCi17Ci0JdTMyIGJhbms7Ci0KLQliYW5rID0gMDsKLQotCWlmIChhZGFwdGVyLT5kd19zcmFtX3R5cGUgPT0gMHgyMDAwMCkgewotCQliYW5rID0gKGFkZHIgJiAweDE4MDAwKSA8PCAweDBkOwotCX0KLQotCWlmIChhZGFwdGVyLT5kd19zcmFtX3R5cGUgPT0gMHgwMDAwMCkgewotCQlpZiAoKGFkZHIgPj4gMHgwZikgPT0gMCkKLQkJCWJhbmsgPSAweDIwMDAwMDAwOwotCQllbHNlCi0JCQliYW5rID0gMHgxMDAwMDAwMDsKLQl9Ci0KLQlmbGV4X3NyYW1fd3JpdGUoYWRhcHRlciwgYmFuaywgYWRkciAmIDB4N2ZmZiwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3JlYWRfY2h1bmsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1MTYgbGVuKQotewotCXUzMiBiYW5rOwotCi0JYmFuayA9IDA7Ci0KLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MjAwMDApIHsKLQkJYmFuayA9IChhZGRyICYgMHgxODAwMCkgPDwgMHgwZDsKLQl9Ci0KLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MDAwMDApIHsKLQkJaWYgKChhZGRyID4+IDB4MGYpID09IDApCi0JCQliYW5rID0gMHgyMDAwMDAwMDsKLQkJZWxzZQotCQkJYmFuayA9IDB4MTAwMDAwMDA7Ci0JfQotCi0JZmxleF9zcmFtX3JlYWQoYWRhcHRlciwgYmFuaywgYWRkciAmIDB4N2ZmZiwgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3JlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCXUzMiBsZW5ndGg7Ci0KLQl3aGlsZSAobGVuICE9IDApIHsKLQkJbGVuZ3RoID0gbGVuOwotCi0JCS8vIGNoZWNrIGlmIHRoZSBhZGRyZXNzIHJhbmdlIGJlbG9uZ3MgdG8gdGhlIHNhbWUgCi0JCS8vIDMySyBtZW1vcnkgY2hpcC4gSWYgbm90LCB0aGUgZGF0YSBpcyByZWFkIGZyb20gCi0JCS8vIG9uZSBjaGlwIGF0IGEgdGltZS4KLQkJaWYgKChhZGRyID4+IDB4MGYpICE9ICgoYWRkciArIGxlbiAtIDEpID4+IDB4MGYpKSB7Ci0JCQlsZW5ndGggPSAoKChhZGRyID4+IDB4MGYpICsgMSkgPDwgMHgwZikgLSBhZGRyOwotCQl9Ci0KLQkJc3JhbV9yZWFkX2NodW5rKGFkYXB0ZXIsIGFkZHIsIGJ1ZiwgbGVuZ3RoKTsKLQotCQlhZGRyID0gYWRkciArIGxlbmd0aDsKLQkJYnVmID0gYnVmICsgbGVuZ3RoOwotCQlsZW4gPSBsZW4gLSBsZW5ndGg7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzcmFtX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggKmJ1ZiwgdTMyIGxlbikKLXsKLQl1MzIgbGVuZ3RoOwotCi0Jd2hpbGUgKGxlbiAhPSAwKSB7Ci0JCWxlbmd0aCA9IGxlbjsKLQotCQkvLyBjaGVjayBpZiB0aGUgYWRkcmVzcyByYW5nZSBiZWxvbmdzIHRvIHRoZSBzYW1lIAotCQkvLyAzMksgbWVtb3J5IGNoaXAuIElmIG5vdCwgdGhlIGRhdGEgaXMgd3JpdHRlbiB0bwotCQkvLyBvbmUgY2hpcCBhdCBhIHRpbWUuCi0JCWlmICgoYWRkciA+PiAweDBmKSAhPSAoKGFkZHIgKyBsZW4gLSAxKSA+PiAweDBmKSkgewotCQkJbGVuZ3RoID0gKCgoYWRkciA+PiAweDBmKSArIDEpIDw8IDB4MGYpIC0gYWRkcjsKLQkJfQotCi0JCXNyYW1fd3JpdGVfY2h1bmsoYWRhcHRlciwgYWRkciwgYnVmLCBsZW5ndGgpOwotCi0JCWFkZHIgPSBhZGRyICsgbGVuZ3RoOwotCQlidWYgPSBidWYgKyBsZW5ndGg7Ci0JCWxlbiA9IGxlbiAtIGxlbmd0aDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNyYW1fc2V0X3NpemUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBtYXNrKQotewotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDcxYywgKG1hc2sgfCAofjB4MzAwMDAgJiByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxYykpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNyYW1faW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1MzIgdG1wOwotCi0JdG1wID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHg3MWMpOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjLCAxKTsKLQotCWlmIChyZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxYykgIT0gMCkgewotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHg3MWMsIHRtcCk7Ci0KLQkJYWRhcHRlci0+ZHdfc3JhbV90eXBlID0gdG1wICYgMHgzMDAwMDsKLQotCQlkZHByaW50aygiJXM6IGR3X3NyYW1fdHlwZSA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmR3X3NyYW1fdHlwZSk7Ci0KLQl9IGVsc2UgewotCi0JCWFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9IDB4MTAwMDA7Ci0KLQkJZGRwcmludGsoIiVzOiBkd19zcmFtX3R5cGUgPSAleFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kd19zcmFtX3R5cGUpOwotCX0KLQotCS8qIHJldHVybiB2YWx1ZSBpcyBuZXZlciB1c2VkPyAqLwotLyoJcmV0dXJuIGFkYXB0ZXItPmR3X3NyYW1fdHlwZTsgKi8KLX0KLQotc3RhdGljIGludCBzcmFtX3Rlc3RfbG9jYXRpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBtYXNrLCB1MzIgYWRkcikKLXsKLQl1OCB0bXAxLCB0bXAyOwotCi0JZHByaW50aygiJXM6IG1hc2sgPSAleCwgYWRkciA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIG1hc2ssIGFkZHIpOwotCi0Jc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCBtYXNrKTsKLQlzcmFtX2luaXQoYWRhcHRlcik7Ci0KLQl0bXAyID0gMHhhNTsKLQl0bXAxID0gMHg0ZjsKLQotCXNyYW1fd3JpdGUoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOwotCXNyYW1fd3JpdGUoYWRhcHRlciwgYWRkciArIDQsICZ0bXAxLCAxKTsKLQotCXRtcDIgPSAwOwotCi0JbWRlbGF5KDIwKTsKLQotCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7Ci0Jc3JhbV9yZWFkKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKLQotCWRwcmludGsoIiVzOiB3cm90ZSAweGE1LCByZWFkIDB4JTJ4XG4iLCBfX0ZVTkNUSU9OX18sIHRtcDIpOwotCi0JaWYgKHRtcDIgIT0gMHhhNSkKLQkJcmV0dXJuIDA7Ci0KLQl0bXAyID0gMHg1YTsKLQl0bXAxID0gMHhmNDsKLQotCXNyYW1fd3JpdGUoYWRhcHRlciwgYWRkciwgJnRtcDIsIDEpOwotCXNyYW1fd3JpdGUoYWRhcHRlciwgYWRkciArIDQsICZ0bXAxLCAxKTsKLQotCXRtcDIgPSAwOwotCi0JbWRlbGF5KDIwKTsKLQotCXNyYW1fcmVhZChhZGFwdGVyLCBhZGRyLCAmdG1wMiwgMSk7Ci0Jc3JhbV9yZWFkKGFkYXB0ZXIsIGFkZHIsICZ0bXAyLCAxKTsKLQotCWRwcmludGsoIiVzOiB3cm90ZSAweDVhLCByZWFkIDB4JTJ4XG4iLCBfX0ZVTkNUSU9OX18sIHRtcDIpOwotCi0JaWYgKHRtcDIgIT0gMHg1YSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHUzMiBzcmFtX2xlbmd0aChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MTAwMDApCi0JCXJldHVybiAzMjc2ODsJLy8gIDMySwotCWlmIChhZGFwdGVyLT5kd19zcmFtX3R5cGUgPT0gMHgwMDAwMCkKLQkJcmV0dXJuIDY1NTM2OwkvLyAgNjRLICAgICAgICAKLQlpZiAoYWRhcHRlci0+ZHdfc3JhbV90eXBlID09IDB4MjAwMDApCi0JCXJldHVybiAxMzEwNzI7CS8vIDEyOEsKLQotCXJldHVybiAzMjc2ODsJCS8vIDMySwotfQotCi0vKiBGbGV4Y29wSUkgY2FuIHdvcmsgd2l0aCAzMkssIDY0SyBvciAxMjhLIG9mIGV4dGVybmFsIFNSQU0gbWVtb3J5LgotICAgIC0gZm9yIDEyOEsgdGhlcmUgYXJlIDR4MzJLIGNoaXBzIGF0IGJhbmsgMCwxLDIsMy4KLSAgICAtIGZvciAgNjRLIHRoZXJlIGFyZSAyeDMySyBjaGlwcyBhdCBiYW5rIDEsMi4KLSAgICAtIGZvciAgMzJLIHRoZXJlIGlzIG9uZSAzMksgY2hpcCBhdCBiYW5rIDAuCi0KLSAgIEZsZXhDb3Agd29ya3Mgb25seSB3aXRoIG9uZSBiYW5rIGF0IGEgdGltZS4gVGhlIGJhbmsgaXMgc2VsZWN0ZWQKLSAgIGJ5IGJpdHMgMjgtMjkgb2YgdGhlIDB4NzAwIHJlZ2lzdGVyLgotICAKLSAgIGJhbmsgMCBjb3ZlcnMgYWRkcmVzc2VzIDB4MDAwMDAtMHgwN2ZmZgotICAgYmFuayAxIGNvdmVycyBhZGRyZXNzZXMgMHgwODAwMC0weDBmZmZmCi0gICBiYW5rIDIgY292ZXJzIGFkZHJlc3NlcyAweDEwMDAwLTB4MTdmZmYKLSAgIGJhbmsgMyBjb3ZlcnMgYWRkcmVzc2VzIDB4MTgwMDAtMHgxZmZmZgotKi8KLXN0YXRpYyBpbnQgc3JhbV9kZXRlY3RfZm9yX2ZsZXgyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXUzMiB0bXAsIHRtcDIsIHRtcDM7Ci0KLQlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQl0bXAgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwOCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4LCAwKTsKLQotCXRtcDIgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxYyk7Ci0KLQlkcHJpbnRrKCIlczogdG1wMiA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIHRtcDIpOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjLCAxKTsKLQotCXRtcDMgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDcxYyk7Ci0KLQlkcHJpbnRrKCIlczogdG1wMyA9ICV4XG4iLCBfX0ZVTkNUSU9OX18sIHRtcDMpOwotCi0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NzFjLCB0bXAyKTsKLQotCS8vIGNoZWNrIGZvciBpbnRlcm5hbCBTUkFNID8/PwotCXRtcDMtLTsKLQlpZiAodG1wMyAhPSAwKSB7Ci0JCXNyYW1fc2V0X3NpemUoYWRhcHRlciwgMHgxMDAwMCk7Ci0JCXNyYW1faW5pdChhZGFwdGVyKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4LCB0bXApOwotCi0JCWRwcmludGsoIiVzOiBzcmFtIHNpemUgPSAzMktcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJcmV0dXJuIDMyOwotCX0KLQotCWlmIChzcmFtX3Rlc3RfbG9jYXRpb24oYWRhcHRlciwgMHgyMDAwMCwgMHgxODAwMCkgIT0gMCkgewotCQlzcmFtX3NldF9zaXplKGFkYXB0ZXIsIDB4MjAwMDApOwotCQlzcmFtX2luaXQoYWRhcHRlcik7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKLQotCQlkcHJpbnRrKCIlczogc3JhbSBzaXplID0gMTI4S1xuIiwgX19GVU5DVElPTl9fKTsKLQotCQlyZXR1cm4gMTI4OwotCX0KLQotCWlmIChzcmFtX3Rlc3RfbG9jYXRpb24oYWRhcHRlciwgMHgwMDAwMCwgMHgxMDAwMCkgIT0gMCkgewotCQlzcmFtX3NldF9zaXplKGFkYXB0ZXIsIDB4MDAwMDApOwotCQlzcmFtX2luaXQoYWRhcHRlcik7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdG1wKTsKLQotCQlkcHJpbnRrKCIlczogc3JhbSBzaXplID0gNjRLXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCXJldHVybiA2NDsKLQl9Ci0KLQlpZiAoc3JhbV90ZXN0X2xvY2F0aW9uKGFkYXB0ZXIsIDB4MTAwMDAsIDB4MDAwMDApICE9IDApIHsKLQkJc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDEwMDAwKTsKLQkJc3JhbV9pbml0KGFkYXB0ZXIpOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDgsIHRtcCk7Ci0KLQkJZHByaW50aygiJXM6IHNyYW0gc2l6ZSA9IDMyS1xuIiwgX19GVU5DVElPTl9fKTsKLQotCQlyZXR1cm4gMzI7Ci0JfQotCi0Jc3JhbV9zZXRfc2l6ZShhZGFwdGVyLCAweDEwMDAwKTsKLQlzcmFtX2luaXQoYWRhcHRlcik7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjA4LCB0bXApOwotCi0JZHByaW50aygiJXM6IFNSQU0gZGV0ZWN0aW9uIGZhaWxlZC4gU2V0IHRvIDMySyBcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2xsX2RldGVjdF9zcmFtX3NpemUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3JhbV9kZXRlY3RfZm9yX2ZsZXgyKGFkYXB0ZXIpOwotfQotCi0vKiBFRVBST00gKFNreXN0YXIyIGhhcyBvbmUgIjI0TEMwOEIiIGNoaXAgb24gYm9hcmQpICovCi0vKgotc3RhdGljIGludCBlZXByb21fd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLCB1OCAqYnVmLCB1MTYgbGVuKQotewotCXJldHVybiBmbGV4X2kyY193cml0ZShhZGFwdGVyLCAweDIwMDAwMDAwLCAweDUwLCBhZGRyLCBidWYsIGxlbik7Ci19Ci0qLwotCi1zdGF0aWMgaW50IGVlcHJvbV9yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgYWRkciwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQlyZXR1cm4gZmxleF9pMmNfcmVhZChhZGFwdGVyLCAweDIwMDAwMDAwLCAweDUwLCBhZGRyLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyB1OCBjYWxjX2xyYyh1OCAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXU4IHN1bTsKLQotCXN1bSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCXN1bSA9IHN1bSBeIGJ1ZltpXTsKLQotCXJldHVybiBzdW07Ci19Ci0KLXN0YXRpYyBpbnQgZWVwcm9tX2xyY19yZWFkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTMyIGxlbiwgdTggKmJ1ZiwgaW50IHJldHJpZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmV0cmllczsgaSsrKSB7Ci0JCWlmIChlZXByb21fcmVhZChhZGFwdGVyLCBhZGRyLCBidWYsIGxlbikgPT0gbGVuKSB7Ci0JCQlpZiAoY2FsY19scmMoYnVmLCBsZW4gLSAxKSA9PSBidWZbbGVuIC0gMV0pCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLXN0YXRpYyBpbnQgZWVwcm9tX2xyY193cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBsZW4sIHU4ICp3YnVmLCB1OCAqcmJ1ZiwgaW50IHJldHJpZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmV0cmllczsgaSsrKSB7Ci0JCWlmIChlZXByb21fd3JpdGUoYWRhcHRlciwgYWRkciwgd2J1ZiwgbGVuKSA9PSBsZW4pIHsKLQkJCWlmIChlZXByb21fbHJjX3JlYWQoYWRhcHRlciwgYWRkciwgbGVuLCByYnVmLCByZXRyaWVzKSA9PSAxKQotCQkJCXJldHVybiAxOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0qLwotCi0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSB1c2VkIHRvIHVubG9jayBTa3lTdGFyMiBjYXJkcy4gKi8KLQotLyoKLXN0YXRpYyBpbnQgZWVwcm9tX3dyaXRlS2V5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqa2V5LCB1MzIgbGVuKQotewotCXU4IHJidWZbMjBdOwotCXU4IHdidWZbMjBdOwotCi0JaWYgKGxlbiAhPSAxNikKLQkJcmV0dXJuIDA7Ci0KLQltZW1jcHkod2J1Ziwga2V5LCBsZW4pOwotCi0Jd2J1ZlsxNl0gPSAwOwotCXdidWZbMTddID0gMDsKLQl3YnVmWzE4XSA9IDA7Ci0Jd2J1ZlsxOV0gPSBjYWxjX2xyYyh3YnVmLCAxOSk7Ci0KLQlyZXR1cm4gZWVwcm9tX2xyY193cml0ZShhZGFwdGVyLCAweDNlNCwgMjAsIHdidWYsIHJidWYsIDQpOwotfQotCi1zdGF0aWMgaW50IGVlcHJvbV9yZWFkS2V5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqa2V5LCB1MzIgbGVuKQotewotCXU4IGJ1ZlsyMF07Ci0KLQlpZiAobGVuICE9IDE2KQotCQlyZXR1cm4gMDsKLQotCWlmIChlZXByb21fbHJjX3JlYWQoYWRhcHRlciwgMHgzZTQsIDIwLCBidWYsIDQpID09IDApCi0JCXJldHVybiAwOwotCi0JbWVtY3B5KGtleSwgYnVmLCBsZW4pOwotCi0JcmV0dXJuIDE7Ci19Ci0qLwotCi1zdGF0aWMgaW50IGVlcHJvbV9nZXRfbWFjX2FkZHIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGNoYXIgdHlwZSwgdTggKm1hYykKLXsKLQl1OCB0bXBbOF07Ci0KLQlpZiAoZWVwcm9tX2xyY19yZWFkKGFkYXB0ZXIsIDB4M2Y4LCA4LCB0bXAsIDQpICE9IDApIHsKLQkJaWYgKHR5cGUgIT0gMCkgewotCQkJbWFjWzBdID0gdG1wWzBdOwotCQkJbWFjWzFdID0gdG1wWzFdOwotCQkJbWFjWzJdID0gdG1wWzJdOwotCQkJbWFjWzNdID0gMHhmZTsKLQkJCW1hY1s0XSA9IDB4ZmY7Ci0JCQltYWNbNV0gPSB0bXBbM107Ci0JCQltYWNbNl0gPSB0bXBbNF07Ci0JCQltYWNbN10gPSB0bXBbNV07Ci0KLQkJfSBlbHNlIHsKLQotCQkJbWFjWzBdID0gdG1wWzBdOwotCQkJbWFjWzFdID0gdG1wWzFdOwotCQkJbWFjWzJdID0gdG1wWzJdOwotCQkJbWFjWzNdID0gdG1wWzNdOwotCQkJbWFjWzRdID0gdG1wWzRdOwotCQkJbWFjWzVdID0gdG1wWzVdOwotCQl9Ci0KLQkJcmV0dXJuIDE7Ci0KLQl9IGVsc2UgewotCi0JCWlmICh0eXBlID09IDApIHsKLQkJCW1lbXNldChtYWMsIDAsIDYpOwotCi0JCX0gZWxzZSB7Ci0KLQkJCW1lbXNldChtYWMsIDAsIDgpOwotCQl9Ci0KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKgotc3RhdGljIGNoYXIgZWVwcm9tX3NldF9tYWNfYWRkcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgY2hhciB0eXBlLCB1OCAqbWFjKQotewotCXU4IHRtcFs4XTsKLQotCWlmICh0eXBlICE9IDApIHsKLQkJdG1wWzBdID0gbWFjWzBdOwotCQl0bXBbMV0gPSBtYWNbMV07Ci0JCXRtcFsyXSA9IG1hY1syXTsKLQkJdG1wWzNdID0gbWFjWzVdOwotCQl0bXBbNF0gPSBtYWNbNl07Ci0JCXRtcFs1XSA9IG1hY1s3XTsKLQotCX0gZWxzZSB7Ci0KLQkJdG1wWzBdID0gbWFjWzBdOwotCQl0bXBbMV0gPSBtYWNbMV07Ci0JCXRtcFsyXSA9IG1hY1syXTsKLQkJdG1wWzNdID0gbWFjWzNdOwotCQl0bXBbNF0gPSBtYWNbNF07Ci0JCXRtcFs1XSA9IG1hY1s1XTsKLQl9Ci0KLQl0bXBbNl0gPSAwOwotCXRtcFs3XSA9IGNhbGNfbHJjKHRtcCwgNyk7Ci0KLQlpZiAoZWVwcm9tX3dyaXRlKGFkYXB0ZXIsIDB4M2Y4LCB0bXAsIDgpID09IDgpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0qLwotCi0vKiBQSUQgZmlsdGVyICovCi0KLS8qIGV2ZXJ5IGZsZXhjb3AgaGFzIDYgImxvd2VyIiBodyBQSUQgZmlsdGVycyAgICAgKi8KLS8qIHRoZXNlIGFyZSBlbmFibGVkIGJ5IHNldHRpbmcgYml0cyAwLTUgb2YgMHgyMDggKi8KLS8qIGZvciB0aGUgMzIgYWRkaXRpb25hbCBmaWx0ZXJzIHdlIGhhdmUgdG8gc2VsZWN0IG9uZSAqLwotLyogb2YgdGhlbSB0aHJvdWdoIDB4MzEwIGFuZCBtb2RpZnkgdGhyb3VnaCAweDMxNCAqLwotLyogb3A6IDA9ZGlzYWJsZSwgMT1lbmFibGUgKi8KLXN0YXRpYyB2b2lkIGZpbHRlcl9lbmFibGVfaHdfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgaWQsIHU4IG9wKQotewotCWRwcmludGsoIiVzOiBpZD0lZCBvcD0lZFxuIiwgX19GVU5DVElPTl9fLCBpZCwgb3ApOwotCWlmIChpZCA8PSA1KSB7Ci0JCXUzMiBtYXNrID0gKDB4MDAwMDAwMDEgPDwgaWQpOwotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIG1hc2ssIG9wID8gbWFzayA6IDApOwotCX0gZWxzZSB7Ci0JCS8qIHNlbGVjdCAqLwotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgzMTAsIDB4MWYsIChpZCAtIDYpICYgMHgxZik7Ci0JCS8qIG1vZGlmeSAqLwotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgzMTQsIDB4MDAwMDYwMDAsIG9wID8gMHgwMDAwNDAwMCA6IDApOwotCX0KLX0KLQotLyogdGhpcyBzZXRzIHRoZSBQSUQgdGhhdCBzaG91bGQgcGFzcyB0aGUgc3BlY2lmaWVkIGZpbHRlciAqLwotc3RhdGljIHZvaWQgcGlkX3NldF9od19waWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBpZCwgdTE2IHBpZCkKLXsKLQlkcHJpbnRrKCIlczogaWQ9JWQgIHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBpZCwgcGlkKTsKLQlpZiAoaWQgPD0gNSkgewotCQl1MzIgYWRyID0gMHgzMDAgKyAoKGlkICYgNikgPDwgMSk7Ci0JCWludCBzaGlmdCA9IChpZCAmIDEpID8gMTYgOiAwOwotCQlkcHJpbnRrKCIlczogaWQ9JWQgIGFkZHI9JXggJWMgIHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBpZCwgYWRyLCAoaWQgJiAxKSA/ICdoJyA6ICdsJywgcGlkKTsKLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIGFkciwgKDB4N2ZmZikgPDwgc2hpZnQsIChwaWQgJiAweDFmZmYpIDw8IHNoaWZ0KTsKLQl9IGVsc2UgewotCQkvKiBzZWxlY3QgKi8KLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MzEwLCAweDFmLCAoaWQgLSA2KSAmIDB4MWYpOwotCQkvKiBtb2RpZnkgKi8KLQkJd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MzE0LCAweDFmZmYsIHBpZCAmIDB4MWZmZik7Ci0JfQotfQotCi0KLS8qCi1zdGF0aWMgdm9pZCBmaWx0ZXJfZW5hYmxlX251bGxfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0JZHByaW50aygiJXM6IG9wPSV4XG4iLCBfX0ZVTkNUSU9OX18sIG9wKTsKLQotCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDIwOCwgMHgwMDAwMDA0MCwgb3A/MHgwMDAwMDA0MDowKTsKLX0KLSovCi0KLXN0YXRpYyB2b2lkIGZpbHRlcl9lbmFibGVfbWFza19maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvcCkKLXsKLQlkcHJpbnRrKCIlczogb3A9JXhcbiIsIF9fRlVOQ1RJT05fXywgb3ApOwotCi0Jd3JpdGVfcmVnX2JpdGZpZWxkKGFkYXB0ZXIsIDB4MjA4LCAweDAwMDAwMDgwLCBvcCA/IDB4MDAwMDAwODAgOiAwKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjdHJsX2VuYWJsZV9tYWMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvcCkKLXsKLQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDQwMDAsIG9wID8gMHgwMDAwNDAwMCA6IDApOwotfQotCi1zdGF0aWMgaW50IGNhX3NldF9tYWNfZHN0X2FkZHJfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCAqbWFjKQotewotCXUzMiB0bXAxLCB0bXAyOwotCi0JdG1wMSA9IChtYWNbM10gPDwgMHgxOCkgfCAobWFjWzJdIDw8IDB4MTApIHwgKG1hY1sxXSA8PCAweDA4KSB8IG1hY1swXTsKLQl0bXAyID0gKG1hY1s1XSA8PCAweDA4KSB8IG1hY1s0XTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDQxOCwgdG1wMSk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4NDFjLCB0bXAyKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotc3RhdGljIHZvaWQgc2V0X2lnbm9yZV9tYWNfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBvcCkKLXsKLQlpZiAob3AgIT0gMCkgewotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDQwMDAsIDApOwotCQlhZGFwdGVyLT5tYWNfZmlsdGVyID0gMTsKLQl9IGVsc2UgewotCQlpZiAoYWRhcHRlci0+bWFjX2ZpbHRlciAhPSAwKSB7Ci0JCQlhZGFwdGVyLT5tYWNfZmlsdGVyID0gMDsKLQkJCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDIwOCwgMHgwMDAwNDAwMCwgMHgwMDAwNDAwMCk7Ci0JCX0KLQl9Ci19Ci0qLwotCi0vKgotc3RhdGljIHZvaWQgY2hlY2tfbnVsbF9maWx0ZXJfZW5hYmxlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWZpbHRlcl9lbmFibGVfbnVsbF9maWx0ZXIoYWRhcHRlciwgMSk7Ci0JZmlsdGVyX2VuYWJsZV9tYXNrX2ZpbHRlcihhZGFwdGVyLCAxKTsKLX0KLSovCi0KLXN0YXRpYyB2b2lkIHBpZF9zZXRfZ3JvdXBfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCXUzMiB2YWx1ZTsKLQotCWRwcmludGsoIiVzOiBwaWQ9JXhcbiIsIF9fRlVOQ1RJT05fXywgcGlkKTsKLQl2YWx1ZSA9IChwaWQgJiAweDNmZmYpIHwgKHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MzBjKSAmIDB4ZmZmZjAwMDApOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDMwYywgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBwaWRfc2V0X2dyb3VwX21hc2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBwaWQpCi17Ci0JdTMyIHZhbHVlOwotCi0JZHByaW50aygiJXM6IHBpZD0leFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCXZhbHVlID0gKChwaWQgJiAweDNmZmYpIDw8IDB4MTApIHwgKHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MzBjKSAmIDB4ZmZmZik7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MzBjLCB2YWx1ZSk7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IHBpZF9nZXRfZ3JvdXBfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXJldHVybiByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDMwYykgJiAweDAwMDAxZmZmOwotfQotCi1zdGF0aWMgaW50IHBpZF9nZXRfZ3JvdXBfbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gKHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MzBjKSA+PiAweDEwKSYgMHgwMDAwMWZmZjsKLX0KLSovCi0KLS8qCi1zdGF0aWMgdm9pZCByZXNldF9oYXJkd2FyZV9waWRfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXBpZF9zZXRfc3RyZWFtMV9waWQoYWRhcHRlciwgMHgxZmZmKTsKLQotCXBpZF9zZXRfc3RyZWFtMl9waWQoYWRhcHRlciwgMHgxZmZmKTsKLQlmaWx0ZXJfZW5hYmxlX3N0cmVhbTJfZmlsdGVyKGFkYXB0ZXIsIDApOwotCi0JcGlkX3NldF9wY3JfcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0JZmlsdGVyX2VuYWJsZV9wY3JfZmlsdGVyKGFkYXB0ZXIsIDApOwotCi0JcGlkX3NldF9wbXRfcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0JZmlsdGVyX2VuYWJsZV9wbXRfZmlsdGVyKGFkYXB0ZXIsIDApOwotCi0JcGlkX3NldF9lY21fcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0JZmlsdGVyX2VuYWJsZV9lY21fZmlsdGVyKGFkYXB0ZXIsIDApOwotCi0JcGlkX3NldF9lbW1fcGlkKGFkYXB0ZXIsIDB4MWZmZik7Ci0JZmlsdGVyX2VuYWJsZV9lbW1fZmlsdGVyKGFkYXB0ZXIsIDApOwotfQotKi8KLQotc3RhdGljIHZvaWQgaW5pdF9waWRzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWludCBpOwotCi0JYWRhcHRlci0+cGlkX2NvdW50ID0gMDsKLQlhZGFwdGVyLT53aG9sZV9iYW5kd2lkdGhfY291bnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51c2VhYmxlX2h3X2ZpbHRlcnM7IGkrKykgewotCQlkcHJpbnRrKCIlczogc2V0dGluZyBmaWx0ZXIgJWQgdG8gMHgxZmZmXG4iLCBfX0ZVTkNUSU9OX18sIGkpOwotCQlhZGFwdGVyLT5od19waWRzW2ldID0gMHgxZmZmOwotCQlwaWRfc2V0X2h3X3BpZChhZGFwdGVyLCBpLCAweDFmZmYpOwotfQotCi0JcGlkX3NldF9ncm91cF9waWQoYWRhcHRlciwgMCk7Ci0JcGlkX3NldF9ncm91cF9tYXNrKGFkYXB0ZXIsIDB4MWZlMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wZW5fd2hvbGVfYmFuZHdpZHRoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCWRwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKLQlwaWRfc2V0X2dyb3VwX3BpZChhZGFwdGVyLCAwKTsKLQlwaWRfc2V0X2dyb3VwX21hc2soYWRhcHRlciwgMCk7Ci0vKgotCWZpbHRlcl9lbmFibGVfbWFza19maWx0ZXIoYWRhcHRlciwgMSk7Ci0qLwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV93aG9sZV9iYW5kd2lkdGgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCXBpZF9zZXRfZ3JvdXBfcGlkKGFkYXB0ZXIsIDApOwotCXBpZF9zZXRfZ3JvdXBfbWFzayhhZGFwdGVyLCAweDFmZTApOwotLyoKLQlmaWx0ZXJfZW5hYmxlX21hc2tfZmlsdGVyKGFkYXB0ZXIsIDEpOwotKi8KLX0KLQotc3RhdGljIHZvaWQgd2hvbGVfYmFuZHdpZHRoX2luYyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpZiAoYWRhcHRlci0+d2hvbGVfYmFuZHdpZHRoX2NvdW50KysgPT0gMCkKLQkJb3Blbl93aG9sZV9iYW5kd2lkdGgoYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdob2xlX2JhbmR3aWR0aF9kZWMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKC0tYWRhcHRlci0+d2hvbGVfYmFuZHdpZHRoX2NvdW50IDw9IDApCi0JCWNsb3NlX3dob2xlX2JhbmR3aWR0aChhZGFwdGVyKTsKLX0KLQotLyogVGhlIHNwZWNpZmllZCBQSUQgaGFzIHRvIGJlIGxldCB0aHJvdWdoIHRoZQotICAgaHcgZmlsdGVycy4KLSAgIFdlIHRyeSB0byBhbGxvY2F0ZSBhbiBoYXJkd2FyZSBmaWx0ZXIgYW5kIG9wZW4gd2hvbGUKLSAgIGJhbmR3aWR0aCB3aGVuIGFsbG9jYXRpb24gaXMgaW1wb3NzaWJsZS4KLSAgIEFsbCBwaWRzPD0weDFmIHBhc3MgdGhyb3VnaCB0aGUgZ3JvdXAgZmlsdGVyLgotICAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCi1zdGF0aWMgaW50IGFkZF9od19waWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBwaWQpCi17Ci0JaW50IGk7Ci0KLQlkcHJpbnRrKCIlczogcGlkPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBpZCk7Ci0KLQlpZiAocGlkIDw9IDB4MWYpCi0JCXJldHVybiAxOwotCi0JLyogd2UgY2FuJ3QgdXNlIGEgZmlsdGVyIGZvciAweDIwMDAsIHNvIG5vIHNlYXJjaCAqLwotCWlmIChwaWQgIT0gMHgyMDAwKSB7Ci0JCS8qIGZpbmQgYW4gdW51c2VkIGhhcmR3YXJlIGZpbHRlciAqLwotCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzOyBpKyspIHsKLQkJCWRwcmludGsoIiVzOiBwaWQ9JWQgc2VhcmNoaW5nIHNsb3Q9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkLCBpKTsKLQkJCWlmIChhZGFwdGVyLT5od19waWRzW2ldID09IDB4MWZmZikgewotCQkJCWRwcmludGsoIiVzOiBwaWQ9JWQgc2xvdD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQsIGkpOwotCQkJCWFkYXB0ZXItPmh3X3BpZHNbaV0gPSBwaWQ7Ci0JCQkJcGlkX3NldF9od19waWQoYWRhcHRlciwgaSwgcGlkKTsKLQkJCQlmaWx0ZXJfZW5hYmxlX2h3X2ZpbHRlcihhZGFwdGVyLCBpLCAxKTsKLQkJcmV0dXJuIDE7Ci0JfQotCX0KLQl9Ci0JLyogaWYgd2UgaGF2ZSBub3QgdXNlZCBhIGZpbHRlciwgdGhpcyBwaWQgZGVwZW5kcyBvbiB3aG9sZSBiYW5kd2lkdGggKi8KLQlkcHJpbnRrKCIlczogcGlkPSVkIHdob2xlX2JhbmR3aWR0aFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCXdob2xlX2JhbmR3aWR0aF9pbmMoYWRhcHRlcik7Ci0JCXJldHVybiAxOwotCX0KLQotLyogcmV0dXJucyAtMSBpZiB0aGUgcGlkIHdhcyBub3QgcHJlc2VudCBpbiB0aGUgZmlsdGVycyAqLwotc3RhdGljIGludCByZW1vdmVfaHdfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWludCBpOwotCi0JZHByaW50aygiJXM6IHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCi0JaWYgKHBpZCA8PSAweDFmKQotCQlyZXR1cm4gMTsKLQotCS8qIHdlIGNhbid0IHVzZSBhIGZpbHRlciBmb3IgMHgyMDAwLCBzbyBubyBzZWFyY2ggKi8KLQlpZiAocGlkICE9IDB4MjAwMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzOyBpKyspIHsKLQkJCWRwcmludGsoIiVzOiBwaWQ9JWQgc2VhcmNoaW5nIHNsb3Q9JWRcbiIsIF9fRlVOQ1RJT05fXywgcGlkLCBpKTsKLQkJCWlmIChhZGFwdGVyLT5od19waWRzW2ldID09IHBpZCkgewkvLyBmaW5kIHRoZSBwaWQgc2xvdAotCQkJCWRwcmludGsoIiVzOiBwaWQ9JWQgc2xvdD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQsIGkpOwotCQkJCWFkYXB0ZXItPmh3X3BpZHNbaV0gPSAweDFmZmY7Ci0JCQkJcGlkX3NldF9od19waWQoYWRhcHRlciwgaSwgMHgxZmZmKTsKLQkJCQlmaWx0ZXJfZW5hYmxlX2h3X2ZpbHRlcihhZGFwdGVyLCBpLCAwKTsKLQkJcmV0dXJuIDE7Ci0JfQotCX0KLQl9Ci0JLyogaWYgd2UgaGF2ZSBub3QgdXNlZCBhIGZpbHRlciwgdGhpcyBwaWQgZGVwZW5kZWQgb24gd2hvbGUgYmFuZHdpdGggKi8KLQlkcHJpbnRrKCIlczogcGlkPSVkIHdob2xlX2JhbmR3aWR0aFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCXdob2xlX2JhbmR3aWR0aF9kZWMoYWRhcHRlcik7Ci0JCXJldHVybiAxOwotCX0KLQotLyogQWRkcyBhIFBJRCB0byB0aGUgZmlsdGVycy4KLSAgIEFkZGluZyBhIHBpZCBtb3JlIHRoYW4gb25jZSBpcyBwb3NzaWJsZSwgd2Uga2VlcCByZWZlcmVuY2UgY291bnRzLgotICAgV2hvbGUgc3RyZWFtIGF2YWlsYWJsZSB0aHJvdWdoIHBpZD09MHgyMDAwLgotICAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICovCi1zdGF0aWMgaW50IGFkZF9waWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBwaWQpCi17Ci0JaW50IGk7Ci0KLQlkcHJpbnRrKCIlczogcGlkPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHBpZCk7Ci0KLQlpZiAocGlkID4gMHgxZmZlICYmIHBpZCAhPSAweDIwMDApCi0JCXJldHVybiAtMTsKLQotCS8vIGNoZWNrIGlmIHRoZSBwaWQgaXMgYWxyZWFkeSBwcmVzZW50Ci0JZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnBpZF9jb3VudDsgaSsrKQotCQlpZiAoYWRhcHRlci0+cGlkX2xpc3RbaV0gPT0gcGlkKSB7Ci0JCQlhZGFwdGVyLT5waWRfcmNbaV0rKzsJLy8gaW5jcmVtZW50IHJlZiBjb3VudGVyCi0JCXJldHVybiAxOwotCQl9Ci0KLQlpZiAoYWRhcHRlci0+cGlkX2NvdW50ID09IE5fUElEX1NMT1RTKQotCQlyZXR1cm4gLTE7CS8vIG5vIG1vcmUgcGlkcyBjYW4gYmUgYWRkZWQKLQlhZGFwdGVyLT5waWRfbGlzdFthZGFwdGVyLT5waWRfY291bnRdID0gcGlkOwkvLyByZWdpc3RlciBwaWQKLQlhZGFwdGVyLT5waWRfcmNbYWRhcHRlci0+cGlkX2NvdW50XSA9IDE7Ci0JYWRhcHRlci0+cGlkX2NvdW50Kys7Ci0JLy8gaGFyZHdhcmUgc2V0dGluZwotCWFkZF9od19waWQoYWRhcHRlciwgcGlkKTsKLQotCQkJcmV0dXJuIDE7Ci0JCX0KLQotLyogUmVtb3ZlcyBhIFBJRCBmcm9tIHRoZSBmaWx0ZXJzLiAqLwotc3RhdGljIGludCByZW1vdmVfcGlkKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCWludCBpOwotCi0JZHByaW50aygiJXM6IHBpZD0lZFxuIiwgX19GVU5DVElPTl9fLCBwaWQpOwotCi0JaWYgKHBpZCA+IDB4MWZmZSAmJiBwaWQgIT0gMHgyMDAwKQotCQlyZXR1cm4gLTE7Ci0KLQkvLyBjaGVjayBpZiB0aGUgcGlkIGlzIHByZXNlbnQgKGl0IG11c3QgYmUhKQotCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5waWRfY291bnQ7IGkrKykgewotCQlpZiAoYWRhcHRlci0+cGlkX2xpc3RbaV0gPT0gcGlkKSB7Ci0JCQlhZGFwdGVyLT5waWRfcmNbaV0tLTsKLQkJCWlmIChhZGFwdGVyLT5waWRfcmNbaV0gPD0gMCkgewotCQkJCS8vIHJlbW92ZSBmcm9tIHRoZSBsaXN0Ci0JCQkJYWRhcHRlci0+cGlkX2NvdW50LS07Ci0JCQkJYWRhcHRlci0+cGlkX2xpc3RbaV09YWRhcHRlci0+cGlkX2xpc3RbYWRhcHRlci0+cGlkX2NvdW50XTsKLQkJCQlhZGFwdGVyLT5waWRfcmNbaV0gPSBhZGFwdGVyLT5waWRfcmNbYWRhcHRlci0+cGlkX2NvdW50XTsKLQkJCQkvLyBoYXJkd2FyZSBzZXR0aW5nCi0JCQkJcmVtb3ZlX2h3X3BpZChhZGFwdGVyLCBwaWQpOwotCQkJfQotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLQotLyogZG1hICYgaXJxICovCi1zdGF0aWMgdm9pZCBjdHJsX2VuYWJsZV9zbWMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvcCkKLXsKLQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDA4MDAsIG9wID8gMHgwMDAwMDgwMCA6IDApOwotfQotCi1zdGF0aWMgdm9pZCBkbWFfZW5hYmxlX2Rpc2FibGVfaXJxKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZmxhZzEsIHUzMiBmbGFnMiwgdTMyIGZsYWczKQotewotCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgJiAweDAwMGYwMDAwOwotCi0JaWYgKGZsYWcxID09IDApIHsKLQkJaWYgKGZsYWcyID09IDApCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsICYgfjB4MDAwMTAwMDA7Ci0JCWVsc2UKLQkJCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgfCAweDAwMDEwMDAwOwotCi0JCWlmIChmbGFnMyA9PSAwKQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCAmIH4weDAwMDIwMDAwOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsIHwgMHgwMDAyMDAwMDsKLQotCX0gZWxzZSB7Ci0KLQkJaWYgKGZsYWcyID09IDApCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsICYgfjB4MDAwNDAwMDA7Ci0JCWVsc2UKLQkJCWFkYXB0ZXItPmRtYV9jdHJsID0gYWRhcHRlci0+ZG1hX2N0cmwgfCAweDAwMDQwMDAwOwotCi0JCWlmIChmbGFnMyA9PSAwKQotCQkJYWRhcHRlci0+ZG1hX2N0cmwgPSBhZGFwdGVyLT5kbWFfY3RybCAmIH4weDAwMDgwMDAwOwotCQllbHNlCi0JCQlhZGFwdGVyLT5kbWFfY3RybCA9IGFkYXB0ZXItPmRtYV9jdHJsIHwgMHgwMDA4MDAwMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGlycV9kbWFfZW5hYmxlX2Rpc2FibGVfaXJxKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgb3ApCi17Ci0JdTMyIHZhbHVlOwotCi0JdmFsdWUgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwOCkgJiAweGZmZjBmZmZmOwotCi0JaWYgKG9wICE9IDApCi0JCXZhbHVlID0gdmFsdWUgfCAoYWRhcHRlci0+ZG1hX2N0cmwgJiAweDAwMGYwMDAwKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgdmFsdWUpOwotfQotCi0vKiBGbGV4Q29wSUkgaGFzIDIgZG1hIGNoYW5uZWxzLiBETUExIGlzIHVzZWQgdG8gdHJhbnNmZXIgVFMgZGF0YSB0bwotICAgc3lzdGVtIG1lbW9yeS4KLQotICAgVGhlIERNQTEgYnVmZmVyIGlzIGRpdmlkZWQgaW4gMiBzdWJidWZmZXJzIG9mIGVxdWFsIHNpemUuCi0gICBGbGV4Q29wSUkgd2lsbCB0cmFuc2ZlciBUUyBkYXRhIHRvIG9uZSBzdWJidWZmZXIsIHNpZ25hbCBhbiBpbnRlcnJ1cHQKLSAgIHdoZW4gdGhlIHN1YmJ1ZmZlciBpcyBmdWxsIGFuZCBjb250aW51ZSBmaWxsaWcgdGhlIHNlY29uZCBzdWJidWZmZXIuCi0KLSAgIEZvciBETUExOgotICAgICAgIHN1YmJ1ZmZlciBzaXplIGluIDMyLWJpdCB3b3JkcyBpcyBzdG9yZWQgaW4gdGhlIGZpcnN0IDI0IGJpdHMgb2YKLSAgICAgICByZWdpc3RlciAweDAwNC4gVGhlIGxhc3QgOCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDA0IGNvbnRhaW4gdGhlIG51bWJlcgotICAgICAgIG9mIHN1YmJ1ZmZlcnMuCi0gICAgICAgCi0gICAgICAgdGhlIGZpcnN0IDMwIGJpdHMgb2YgcmVnaXN0ZXIgMHgwMDAgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QKLSAgICAgICBzdWJidWZmZXIuIFRoZSBsYXN0IDIgYml0cyBjb250YWluIDAsIHdoZW4gZG1hMSBpcyBkaXNhYmxlZCBhbmQgMSwKLSAgICAgICB3aGVuIGRtYTEgaXMgZW5hYmxlZC4KLQotICAgICAgIHRoZSBmaXJzdCAzMCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDBjIGNvbnRhaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY29uZAotICAgICAgIHN1YmJ1ZmZlci4gdGhlIGxhc3QgMiBiaXRzIGNvbnRhaW4gMS4KLQotICAgICAgIHJlZ2lzdGVyIDB4MDA4IHdpbGwgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ViYnVmZmVyIHRoYXQgd2FzIGZpbGxlZAotICAgICAgIHdpdGggVFMgZGF0YSwgd2hlbiBGbGV4Q29wSUkgd2lsbCBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQuCi0KLSAgIEZvciBETUEyOgotICAgICAgIHN1YmJ1ZmZlciBzaXplIGluIDMyLWJpdCB3b3JkcyBpcyBzdG9yZWQgaW4gdGhlIGZpcnN0IDI0IGJpdHMgb2YKLSAgICAgICByZWdpc3RlciAweDAxNC4gVGhlIGxhc3QgOCBiaXRzIG9mIHJlZ2lzdGVyIDB4MDE0IGNvbnRhaW4gdGhlIG51bWJlcgotICAgICAgIG9mIHN1YmJ1ZmZlcnMuCi0gICAgICAgCi0gICAgICAgdGhlIGZpcnN0IDMwIGJpdHMgb2YgcmVnaXN0ZXIgMHgwMTAgY29udGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QKLSAgICAgICBzdWJidWZmZXIuICBUaGUgbGFzdCAyIGJpdHMgY29udGFpbiAwLCB3aGVuIGRtYTEgaXMgZGlzYWJsZWQgYW5kIDEsCi0gICAgICAgd2hlbiBkbWExIGlzIGVuYWJsZWQuCi0KLSAgICAgICB0aGUgZmlyc3QgMzAgYml0cyBvZiByZWdpc3RlciAweDAxYyBjb250YWluIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWNvbmQKLSAgICAgICBzdWJidWZmZXIuIHRoZSBsYXN0IDIgYml0cyBjb250YWluIDEuCi0KLSAgICAgICByZWdpc3RlciAweDAxOCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3ViYnVmZmVyIHRoYXQgd2FzIGZpbGxlZAotICAgICAgIHdpdGggVFMgZGF0YSwgd2hlbiBGbGV4Q29wSUkgZ2VuZXJhdGVzIGFuIGludGVycnVwdC4KLSovCi1zdGF0aWMgaW50IGRtYV9pbml0X2RtYShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGRtYV9jaGFubmVsKQotewotCXUzMiBzdWJidWZmZXJzLCBzdWJidWZzaXplLCBzdWJidWYwLCBzdWJidWYxOwotCi0JaWYgKGRtYV9jaGFubmVsID09IDApIHsKLQkJZHByaW50aygiJXM6IEluaXRpYWxpemluZyBETUExIGNoYW5uZWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJc3ViYnVmZmVycyA9IDI7Ci0KLQkJc3ViYnVmc2l6ZSA9ICgoKGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC8gMikgLyA0KSA8PCA4KSB8IHN1YmJ1ZmZlcnM7Ci0KLQkJc3ViYnVmMCA9IGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICYgMHhmZmZmZmZmYzsKLQotCQlzdWJidWYxID0gKChhZGFwdGVyLT5kbWFxMS5idXNfYWRkciArIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC8gMikgJiAweGZmZmZmZmZjKSB8IDE7Ci0KLQkJZHByaW50aygiJXM6IGZpcnN0IHN1YmJ1ZmZlciBhZGRyZXNzID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCBzdWJidWYwKTsKLQkJdWRlbGF5KDEwMDApOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMDAsIHN1YmJ1ZjApOwotCi0JCWRwcmludGsoIiVzOiBzdWJidWZmZXIgc2l6ZSA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgKHN1YmJ1ZnNpemUgPj4gOCkgKiA0KTsKLQkJdWRlbGF5KDEwMDApOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMDQsIHN1YmJ1ZnNpemUpOwotCi0JCWRwcmludGsoIiVzOiBzZWNvbmQgc3ViYnVmZmVyIGFkZHJlc3MgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIHN1YmJ1ZjEpOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwYywgc3ViYnVmMSk7Ci0KLQkJZHByaW50aygiJXM6IGNvdW50ZXIgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICYgMHhmZmZmZmZmYyk7Ci0JCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwOCwgYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgJiAweGZmZmZmZmZjKTsKLQkJdWRlbGF5KDEwMDApOwotCi0JCWRtYV9lbmFibGVfZGlzYWJsZV9pcnEoYWRhcHRlciwgMCwgMSwgc3ViYnVmZmVycyA/IDEgOiAwKTsKLQotCQlpcnFfZG1hX2VuYWJsZV9kaXNhYmxlX2lycShhZGFwdGVyLCAxKTsKLQotCQlzcmFtX3NldF9tZWRpYV9kZXN0KGFkYXB0ZXIsIDEpOwotCQlzcmFtX3NldF9uZXRfZGVzdChhZGFwdGVyLCAxKTsKLQkJc3JhbV9zZXRfY2FpX2Rlc3QoYWRhcHRlciwgMik7Ci0JCXNyYW1fc2V0X2Nhb19kZXN0KGFkYXB0ZXIsIDIpOwotCX0KLQotCWlmIChkbWFfY2hhbm5lbCA9PSAxKSB7Ci0JCWRwcmludGsoIiVzOiBJbml0aWFsaXppbmcgRE1BMiBjaGFubmVsXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JCXN1YmJ1ZmZlcnMgPSAyOwotCi0JCXN1YmJ1ZnNpemUgPSAoKChhZGFwdGVyLT5kbWFxMi5idWZmZXJfc2l6ZSAvIDIpIC8gNCkgPDwgOCkgfCBzdWJidWZmZXJzOwotCi0JCXN1YmJ1ZjAgPSBhZGFwdGVyLT5kbWFxMi5idXNfYWRkciAmIDB4ZmZmZmZmZmM7Ci0KLQkJc3ViYnVmMSA9ICgoYWRhcHRlci0+ZG1hcTIuYnVzX2FkZHIgKyBhZGFwdGVyLT5kbWFxMi5idWZmZXJfc2l6ZSAvIDIpICYgMHhmZmZmZmZmYykgfCAxOwotCi0JCWRwcmludGsoIiVzOiBmaXJzdCBzdWJidWZmZXIgYWRkcmVzcyA9IDB4JXhcbiIsIF9fRlVOQ1RJT05fXywgc3ViYnVmMCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDEwLCBzdWJidWYwKTsKLQotCQlkcHJpbnRrKCIlczogc3ViYnVmZmVyIHNpemUgPSAweCV4XG4iLCBfX0ZVTkNUSU9OX18sIChzdWJidWZzaXplID4+IDgpICogNCk7Ci0JCXVkZWxheSgxMDAwKTsKLQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDE0LCBzdWJidWZzaXplKTsKLQotCQlkcHJpbnRrKCIlczogc2Vjb25kIGJ1ZmZlciBhZGRyZXNzID0gMHgleFxuIiwgX19GVU5DVElPTl9fLCBzdWJidWYxKTsKLQkJdWRlbGF5KDEwMDApOwotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMWMsIHN1YmJ1ZjEpOwotCi0JCXNyYW1fc2V0X2NhaV9kZXN0KGFkYXB0ZXIsIDIpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBvcCkKLXsKLQlpZiAob3AgPT0gMCkgewotCQl3cml0ZV9yZWdfYml0ZmllbGQoYWRhcHRlciwgMHgyMDgsIDB4MDAwMDgwMDAsIDApOwotCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyAmIH4weDAwMDAwMDA0OwotCX0gZWxzZSB7Ci0JCXdyaXRlX3JlZ19iaXRmaWVsZChhZGFwdGVyLCAweDIwOCwgMHgwMDAwODAwMCwgMHgwMDAwODAwMCk7Ci0JCWFkYXB0ZXItPmRtYV9zdGF0dXMgPSBhZGFwdGVyLT5kbWFfc3RhdHVzIHwgMHgwMDAwMDAwNDsKLQl9Ci19Ci0KLS8qIGJpdCAwIG9mIGRtYV9tYXNrIGlzIHNldCB0byAxIGlmIGRtYTEgY2hhbm5lbCBoYXMgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZAotICAgYml0IDEgb2YgZG1hX21hc2sgaXMgc2V0IHRvIDEgaWYgZG1hMiBjaGFubmVsIGhhcyB0byBiZSBlbmFibGVkL2Rpc2FibGVkCi0qLwotc3RhdGljIHZvaWQgZG1hX3N0YXJ0X3N0b3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkbWFfbWFzaywgaW50IHN0YXJ0X3N0b3ApCi17Ci0JdTMyIGRtYV9lbmFibGUsIGRtYTFfZW5hYmxlLCBkbWEyX2VuYWJsZTsKLQotCWRwcmludGsoIiVzOiBkbWFfbWFzaz0leFxuIiwgX19GVU5DVElPTl9fLCBkbWFfbWFzayk7Ci0KLQlpZiAoc3RhcnRfc3RvcCA9PSAxKSB7Ci0JCWRwcmludGsoIiVzOiBzdGFydGluZyBkbWFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQkJZG1hMV9lbmFibGUgPSAwOwotCQlkbWEyX2VuYWJsZSA9IDA7Ci0KLQkJaWYgKCgoZG1hX21hc2sgJiAxKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSA9PSAwKSAmJiAoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgIT0gMCkpIHsKLQkJCWFkYXB0ZXItPmRtYV9zdGF0dXMgPSBhZGFwdGVyLT5kbWFfc3RhdHVzIHwgMTsKLQkJCWRtYTFfZW5hYmxlID0gMTsKLQkJfQotCi0JCWlmICgoKGRtYV9tYXNrICYgMikgIT0gMCkgJiYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMikgPT0gMCkgJiYgKGFkYXB0ZXItPmRtYXEyLmJ1c19hZGRyICE9IDApKSB7Ci0JCQlhZGFwdGVyLT5kbWFfc3RhdHVzID0gYWRhcHRlci0+ZG1hX3N0YXR1cyB8IDI7Ci0JCQlkbWEyX2VuYWJsZSA9IDE7Ci0JCX0KLQkJLy8gZW5hYmxlIGRtYTEgYW5kIGRtYTIKLQkJaWYgKChkbWExX2VuYWJsZSA9PSAxKSAmJiAoZG1hMl9lbmFibGUgPT0gMSkpIHsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwMCwgYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgfCAxKTsKLQkJCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDAwYywgKGFkYXB0ZXItPmRtYXExLmJ1c19hZGRyICsgYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUgLyAyKSB8IDEpOwotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDEwLCBhZGFwdGVyLT5kbWFxMi5idXNfYWRkciB8IDEpOwotCi0JCQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBlbmFibGUgZG1hMQotCQlpZiAoKGRtYTFfZW5hYmxlID09IDEpICYmIChkbWEyX2VuYWJsZSA9PSAwKSkgewotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDAwLCBhZGFwdGVyLT5kbWFxMS5idXNfYWRkciB8IDEpOwotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDBjLCAoYWRhcHRlci0+ZG1hcTEuYnVzX2FkZHIgKyBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAvIDIpIHwgMSk7Ci0KLQkJCWN0cmxfZW5hYmxlX3JlY2VpdmVfZGF0YShhZGFwdGVyLCAxKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGVuYWJsZSBkbWEyCi0JCWlmICgoZG1hMV9lbmFibGUgPT0gMCkgJiYgKGRtYTJfZW5hYmxlID09IDEpKSB7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMTAsIGFkYXB0ZXItPmRtYXEyLmJ1c19hZGRyIHwgMSk7Ci0KLQkJCWN0cmxfZW5hYmxlX3JlY2VpdmVfZGF0YShhZGFwdGVyLCAxKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHN0YXJ0IGRtYQotCQlpZiAoKGRtYTFfZW5hYmxlID09IDApICYmIChkbWEyX2VuYWJsZSA9PSAwKSkgewotCQkJY3RybF9lbmFibGVfcmVjZWl2ZV9kYXRhKGFkYXB0ZXIsIDEpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCX0gZWxzZSB7Ci0KLQkJZHByaW50aygiJXM6IHN0b3BwaW5nIGRtYVxuIiwgX19GVU5DVElPTl9fKTsKLQotCQlkbWFfZW5hYmxlID0gYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDB4MDAwMDAwMDM7Ci0KLQkJaWYgKCgoZG1hX21hc2sgJiAxKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAxKSAhPSAwKSkgewotCQkJZG1hX2VuYWJsZSA9IGRtYV9lbmFibGUgJiAweGZmZmZmZmZlOwotCQl9Ci0KLQkJaWYgKCgoZG1hX21hc2sgJiAyKSAhPSAwKSAmJiAoKGFkYXB0ZXItPmRtYV9zdGF0dXMgJiAyKSAhPSAwKSkgewotCQkJZG1hX2VuYWJsZSA9IGRtYV9lbmFibGUgJiAweGZmZmZmZmZkOwotCQl9Ci0JCS8vc3RvcCBkbWEKLQkJaWYgKChkbWFfZW5hYmxlID09IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDQpICE9IDApKSB7Ci0JCQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMCk7Ci0KLQkJCXVkZWxheSgzMDAwKTsKLQkJfQotCQkvL2Rpc2FibGUgZG1hMQotCQlpZiAoKChkbWFfbWFzayAmIDEpICE9IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDEpICE9IDApICYmIChhZGFwdGVyLT5kbWFxMS5idXNfYWRkciAhPSAwKSkgewotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDAwLCBhZGFwdGVyLT5kbWFxMS5idXNfYWRkcik7Ci0JCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgwMGMsIChhZGFwdGVyLT5kbWFxMS5idXNfYWRkciArIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC8gMikgfCAxKTsKLQotCQkJYWRhcHRlci0+ZG1hX3N0YXR1cyA9IGFkYXB0ZXItPmRtYV9zdGF0dXMgJiB+MHgwMDAwMDAwMTsKLQkJfQotCQkvL2Rpc2FibGUgZG1hMgotCQlpZiAoKChkbWFfbWFzayAmIDIpICE9IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDIpICE9IDApICYmIChhZGFwdGVyLT5kbWFxMi5idXNfYWRkciAhPSAwKSkgewotCQkJd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MDEwLCBhZGFwdGVyLT5kbWFxMi5idXNfYWRkcik7Ci0KLQkJCWFkYXB0ZXItPmRtYV9zdGF0dXMgPSBhZGFwdGVyLT5kbWFfc3RhdHVzICYgfjB4MDAwMDAwMDI7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9wZW5fc3RyZWFtKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MTYgcGlkKQotewotCXUzMiBkbWFfbWFzazsKLQotCSsrYWRhcHRlci0+Y2FwdHVyaW5nOwotCi0JZmlsdGVyX2VuYWJsZV9tYXNrX2ZpbHRlcihhZGFwdGVyLCAxKTsKLQotCWFkZF9waWQoYWRhcHRlciwgcGlkKTsKLQotCWRwcmludGsoIiVzOiBhZGFwdGVyLT5kbWFfc3RhdHVzPSV4XG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmRtYV9zdGF0dXMpOwotCi0JaWYgKChhZGFwdGVyLT5kbWFfc3RhdHVzICYgNykgIT0gNykgewotCQlkbWFfbWFzayA9IDA7Ci0KLQkJaWYgKCgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDB4MTAwMDAwMDApICE9IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDEpID09IDApKSB7Ci0JCQlkbWFfbWFzayA9IGRtYV9tYXNrIHwgMTsKLQotCQkJYWRhcHRlci0+ZG1hcTEuaGVhZCA9IDA7Ci0JCQlhZGFwdGVyLT5kbWFxMS50YWlsID0gMDsKLQotCQkJbWVtc2V0KGFkYXB0ZXItPmRtYXExLmJ1ZmZlciwgMCwgYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemUpOwotCQl9Ci0KLQkJaWYgKCgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDB4MjAwMDAwMDApICE9IDApICYmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDIpID09IDApKSB7Ci0JCQlkbWFfbWFzayA9IGRtYV9tYXNrIHwgMjsKLQotCQkJYWRhcHRlci0+ZG1hcTIuaGVhZCA9IDA7Ci0JCQlhZGFwdGVyLT5kbWFxMi50YWlsID0gMDsKLQkJfQotCi0JCWlmIChkbWFfbWFzayAhPSAwKSB7Ci0JCQlpcnFfZG1hX2VuYWJsZV9kaXNhYmxlX2lycShhZGFwdGVyLCAxKTsKLQotCQkJZG1hX3N0YXJ0X3N0b3AoYWRhcHRlciwgZG1hX21hc2ssIDEpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV9zdHJlYW0oc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBwaWQpCi17Ci0JaWYgKGFkYXB0ZXItPmNhcHR1cmluZyA+IDApCi0JCS0tYWRhcHRlci0+Y2FwdHVyaW5nOwotCi0JZHByaW50aygiJXM6IGRtYV9zdGF0dXM9JXhcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+ZG1hX3N0YXR1cyk7Ci0KLQlpZiAoYWRhcHRlci0+Y2FwdHVyaW5nID09IDApIHsKLQkJdTMyIGRtYV9tYXNrID0gMDsKLQotCWlmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDEpICE9IDApCi0JCWRtYV9tYXNrID0gZG1hX21hc2sgfCAweDAwMDAwMDAxOwotCWlmICgoYWRhcHRlci0+ZG1hX3N0YXR1cyAmIDIpICE9IDApCi0JCWRtYV9tYXNrID0gZG1hX21hc2sgfCAweDAwMDAwMDAyOwotCi0JaWYgKGRtYV9tYXNrICE9IDApIHsKLQkJCWRtYV9zdGFydF9zdG9wKGFkYXB0ZXIsIGRtYV9tYXNrLCAwKTsKLQl9Ci0JfQotCXJlbW92ZV9waWQoYWRhcHRlciwgcGlkKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZXJydXB0X3NlcnZpY2VfZG1hMShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSAmYWRhcHRlci0+ZGVtdXg7Ci0KLQlpbnQgbl9jdXJfZG1hX2NvdW50ZXI7Ci0JdTMyIG5fbnVtX2J5dGVzX3BhcnNlZDsKLQl1MzIgbl9udW1fbmV3X2J5dGVzX3RyYW5zZmVycmVkOwotCXUzMiBkd19kZWZhdWx0X3BhY2tldF9zaXplID0gMTg4OwotCXU4IGdiX3RtcF9idWZmZXJbMTg4XTsKLQl1OCAqcGJfZG1hX2J1Zl9jdXJfcG9zOwotCi0Jbl9jdXJfZG1hX2NvdW50ZXIgPSByZWFkbChhZGFwdGVyLT5pb19tZW0gKyAweDAwOCkgLSBhZGFwdGVyLT5kbWFxMS5idXNfYWRkcjsKLQluX2N1cl9kbWFfY291bnRlciA9IChuX2N1cl9kbWFfY291bnRlciAvIGR3X2RlZmF1bHRfcGFja2V0X3NpemUpICogZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZTsKLQotCWlmICgobl9jdXJfZG1hX2NvdW50ZXIgPCAwKSB8fCAobl9jdXJfZG1hX2NvdW50ZXIgPiBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSkpIHsKLQkJZHByaW50aygiJXM6IGRtYSBjb3VudGVyIG91dHNpZGUgZG1hIGJ1ZmZlclxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KLQotCWFkYXB0ZXItPmRtYXExLmhlYWQgPSBuX2N1cl9kbWFfY291bnRlcjsKLQotCWlmIChhZGFwdGVyLT5kbWFxMS50YWlsIDw9IG5fY3VyX2RtYV9jb3VudGVyKSB7Ci0JCW5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZCA9IG5fY3VyX2RtYV9jb3VudGVyIC0gYWRhcHRlci0+ZG1hcTEudGFpbDsKLQotCX0gZWxzZSB7Ci0KLQkJbl9udW1fbmV3X2J5dGVzX3RyYW5zZmVycmVkID0gKGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC0gYWRhcHRlci0+ZG1hcTEudGFpbCkgKyBuX2N1cl9kbWFfY291bnRlcjsKLQl9Ci0KLQlkZHByaW50aygiJXM6IG5fY3VyX2RtYV9jb3VudGVyID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgbl9jdXJfZG1hX2NvdW50ZXIpOwotCWRkcHJpbnRrKCIlczogZG1hcTEudGFpbCAgICAgICAgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBhZGFwdGVyLT5kbWFxMS50YWlsKTsKLQlkZHByaW50aygiJXM6IGJ5dGVzX3RyYW5zZmVycmVkID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgbl9udW1fbmV3X2J5dGVzX3RyYW5zZmVycmVkKTsKLQotCWlmIChuX251bV9uZXdfYnl0ZXNfdHJhbnNmZXJyZWQgPCBkd19kZWZhdWx0X3BhY2tldF9zaXplKQotCQlyZXR1cm47Ci0KLQluX251bV9ieXRlc19wYXJzZWQgPSAwOwotCi0Jd2hpbGUgKG5fbnVtX2J5dGVzX3BhcnNlZCA8IG5fbnVtX25ld19ieXRlc190cmFuc2ZlcnJlZCkgewotCQlwYl9kbWFfYnVmX2N1cl9wb3MgPSBhZGFwdGVyLT5kbWFxMS5idWZmZXIgKyBhZGFwdGVyLT5kbWFxMS50YWlsOwotCi0JCWlmIChhZGFwdGVyLT5kbWFxMS5idWZmZXIgKyBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSA8IGFkYXB0ZXItPmRtYXExLmJ1ZmZlciArIGFkYXB0ZXItPmRtYXExLnRhaWwgKyAxODgpIHsKLQkJCW1lbWNweShnYl90bXBfYnVmZmVyLCBhZGFwdGVyLT5kbWFxMS5idWZmZXIgKyBhZGFwdGVyLT5kbWFxMS50YWlsLAotCQkJICAgICAgIGFkYXB0ZXItPmRtYXExLmJ1ZmZlcl9zaXplIC0gYWRhcHRlci0+ZG1hcTEudGFpbCk7Ci0JCQltZW1jcHkoZ2JfdG1wX2J1ZmZlciArIChhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAtIGFkYXB0ZXItPmRtYXExLnRhaWwpLCBhZGFwdGVyLT5kbWFxMS5idWZmZXIsCi0JCQkgICAgICAgKDE4OCAtIChhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSAtIGFkYXB0ZXItPmRtYXExLnRhaWwpKSk7Ci0KLQkJCXBiX2RtYV9idWZfY3VyX3BvcyA9IGdiX3RtcF9idWZmZXI7Ci0JCX0KLQotCQlpZiAoYWRhcHRlci0+Y2FwdHVyaW5nICE9IDApIHsKLQkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cyhkdmJkbXgsIHBiX2RtYV9idWZfY3VyX3BvcywgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZSAvIDE4OCk7Ci0JCX0KLQotCQluX251bV9ieXRlc19wYXJzZWQgPSBuX251bV9ieXRlc19wYXJzZWQgKyBkd19kZWZhdWx0X3BhY2tldF9zaXplOwotCi0JCWFkYXB0ZXItPmRtYXExLnRhaWwgPSBhZGFwdGVyLT5kbWFxMS50YWlsICsgZHdfZGVmYXVsdF9wYWNrZXRfc2l6ZTsKLQotCQlpZiAoYWRhcHRlci0+ZG1hcTEudGFpbCA+PSBhZGFwdGVyLT5kbWFxMS5idWZmZXJfc2l6ZSkKLQkJCWFkYXB0ZXItPmRtYXExLnRhaWwgPSBhZGFwdGVyLT5kbWFxMS50YWlsIC0gYWRhcHRlci0+ZG1hcTEuYnVmZmVyX3NpemU7Ci0JfTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZXJydXB0X3NlcnZpY2VfZG1hMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlwcmludGsoIiVzOlxuIiwgX19GVU5DVElPTl9fKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGlzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCBhZGFwdGVyICp0bXAgPSBkZXZfaWQ7Ci0KLQl1MzIgdmFsdWU7Ci0KLQlkZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwotCi0Jc3Bpbl9sb2NrX2lycSgmdG1wLT5sb2NrKTsKLQotCWlmICgwID09ICgodmFsdWUgPSByZWFkX3JlZ19kdyh0bXAsIDB4MjBjKSkgJiAweDBmKSkgewotCQlzcGluX3VubG9ja19pcnEoJnRtcC0+bG9jayk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0JCi0Jd2hpbGUgKHZhbHVlICE9IDApIHsKLQkJaWYgKCh2YWx1ZSAmIDB4MDMpICE9IDApCi0JCQlpbnRlcnJ1cHRfc2VydmljZV9kbWExKHRtcCk7Ci0JCWlmICgodmFsdWUgJiAweDBjKSAhPSAwKQotCQkJaW50ZXJydXB0X3NlcnZpY2VfZG1hMih0bXApOwotCQl2YWx1ZSA9IHJlYWRfcmVnX2R3KHRtcCwgMHgyMGMpICYgMHgwZjsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnEoJnRtcC0+bG9jayk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IGluaXRfZG1hX3F1ZXVlX29uZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGRtYXEgKmRtYXEsCi0JCQkgICAgICBpbnQgc2l6ZSwgaW50IGRtYXFfb2Zmc2V0KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwotCi0JZG1hcS0+aGVhZCA9IDA7Ci0JZG1hcS0+dGFpbCA9IDA7Ci0KLQlkbWFxLT5idWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplICsgMHg4MCwgJmRtYV9hZGRyKTsKLQlpZiAoIWRtYXEtPmJ1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkbWFxLT5idXNfYWRkciA9IGRtYV9hZGRyOwotCWRtYXEtPmJ1ZmZlcl9zaXplID0gc2l6ZTsKLQotCWRtYV9pbml0X2RtYShhZGFwdGVyLCBkbWFxX29mZnNldCk7Ci0KLQlkZHByaW50aygiJXM6IGFsbG9jYXRlZCBkbWEgYnVmZmVyIGF0IDB4JXAsIGxlbmd0aD0lZFxuIiwKLQkJIF9fRlVOQ1RJT05fXywgZG1hcS0+YnVmZmVyLCBzaXplKTsKLQotCXJldHVybiAwOwotCX0KLQotc3RhdGljIGludCBpbml0X2RtYV9xdWV1ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgZG1hcSAqZG1hcTsKLQkJdTMyIGRtYV9zdGF0dXM7Ci0JCWludCBzaXplOwotCX0gZG1hcV9kZXNjW10gPSB7Ci0JCXsgJmFkYXB0ZXItPmRtYXExLCAweDEwMDAwMDAwLCBTSVpFX09GX0JVRl9ETUExIH0sCi0JCXsgJmFkYXB0ZXItPmRtYXEyLCAweDIwMDAwMDAwLCBTSVpFX09GX0JVRl9ETUEyIH0KLQl9LCAqcCA9IGRtYXFfZGVzYzsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyssIHArKykgewotCQlpZiAoaW5pdF9kbWFfcXVldWVfb25lKGFkYXB0ZXIsIHAtPmRtYXEsIHAtPnNpemUsIGkpIDwgMCkKLQkJCWFkYXB0ZXItPmRtYV9zdGF0dXMgJj0gfnAtPmRtYV9zdGF0dXM7Ci0JCWVsc2UKLQkJCWFkYXB0ZXItPmRtYV9zdGF0dXMgfD0gcC0+ZG1hX3N0YXR1czsKLQl9Ci0JcmV0dXJuIChhZGFwdGVyLT5kbWFfc3RhdHVzICYgMHgzMDAwMDAwMCkgPyAwIDogLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9kbWFfcXVldWVfb25lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgZG1hcSAqZG1hcSkKLXsKLQlpZiAoZG1hcS0+YnVmZmVyKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgZG1hcS0+YnVmZmVyX3NpemUgKyAweDgwLAotCQkJCSAgICBkbWFxLT5idWZmZXIsIGRtYXEtPmJ1c19hZGRyKTsKLQkJbWVtc2V0KGRtYXEsIDAsIHNpemVvZigqZG1hcSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZnJlZV9kbWFfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IGRtYXEgKmRtYXFbXSA9IHsKLQkJJmFkYXB0ZXItPmRtYXExLAotCQkmYWRhcHRlci0+ZG1hcTIsCi0JCU5VTEwKLQl9LCAqKnA7Ci0KLQlmb3IgKHAgPSBkbWFxOyAqcDsgcCsrKQotCQlmcmVlX2RtYV9xdWV1ZV9vbmUoYWRhcHRlciwgKnApOwotCX0KLQotc3RhdGljIHZvaWQgcmVsZWFzZV9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQotCWlvdW5tYXAoYWRhcHRlci0+aW9fbWVtKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOwotCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAxKTsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9hZGFwdGVyX29iamVjdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlkcHJpbnRrKCIlczpcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQljbG9zZV9zdHJlYW0oYWRhcHRlciwgMCk7Ci0JCWZyZWVfaXJxKGFkYXB0ZXItPmlycSwgYWRhcHRlcik7Ci0JZnJlZV9kbWFfcXVldWUoYWRhcHRlcik7Ci0JcmVsZWFzZV9hZGFwdGVyKGFkYXB0ZXIpOwotCWtmcmVlKGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2t5c3RhcjJfcGNpX2RyaXZlcjsKLQotc3RhdGljIGludCBjbGFpbV9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKLQl1MTYgdmFyOwotCWludCByZXQ7Ci0KLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMSwgc2t5c3RhcjJfcGNpX2RyaXZlci5uYW1lKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgc2t5c3RhcjJfcGNpX2RyaXZlci5uYW1lKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfcGNpX3JlbGVhc2VfMTsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmFkYXB0ZXItPmNhcmRfcmV2aXNpb24pOwotCi0JZHByaW50aygiJXM6IGNhcmQgcmV2aXNpb24gJXggXG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmNhcmRfcmV2aXNpb24pOwotCi0JcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3BjaV9yZWxlYXNlXzA7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCA0LCAmdmFyKTsKLQotCWlmICgodmFyICYgNCkgPT0gMCkKLQkJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlhZGFwdGVyLT5pb19wb3J0ID0gcGRldi0+cmVzb3VyY2VbMV0uc3RhcnQ7Ci0KLQlhZGFwdGVyLT5pb19tZW0gPSBpb3JlbWFwKHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCAweDgwMCk7Ci0KLQlpZiAoIWFkYXB0ZXItPmlvX21lbSkgewotCQlkcHJpbnRrKCIlczogY2FuIG5vdCBtYXAgaW8gbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGVycl9wY2lfZGlzYWJsZTsKLQl9Ci0KLQlkcHJpbnRrKCIlczogaW8gbWVtb3J5IG1hcGVkIGF0ICVwXG4iLCBfX0ZVTkNUSU9OX18sIGFkYXB0ZXItPmlvX21lbSk7Ci0KLQlyZXQgPSAxOwotb3V0OgotCXJldHVybiByZXQ7Ci0KLWVycl9wY2lfZGlzYWJsZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci1lcnJfcGNpX3JlbGVhc2VfMDoKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7Ci1lcnJfcGNpX3JlbGVhc2VfMToKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMSk7Ci0JZ290byBvdXQ7Ci19Ci0KLS8qCi1zdGF0aWMgaW50IHNsbF9yZXNldF9mbGV4Y29wKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQotewotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgMCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjEwLCAweGIyZmYpOwotCi0JcmV0dXJuIDA7Ci19Ci0qLwotCi1zdGF0aWMgdm9pZCBkZWNpZGVfaG93X21hbnlfaHdfZmlsdGVycyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgaHdfZmlsdGVyczsKLQlpbnQgbW9kX29wdGlvbl9od19maWx0ZXJzOwotCi0JLy8gRmxleENvcCBJSWIgJiBJSUkgaGF2ZSA2KzMyIGh3IGZpbHRlcnMgICAgCi0JLy8gRmxleENvcCBJSSBoYXMgNiBodyBmaWx0ZXJzLCBldmVyeSBvdGhlciBzaG91bGQgaGF2ZSBhdCBsZWFzdCA2Ci0Jc3dpdGNoIChhZGFwdGVyLT5iMmMyX3JldmlzaW9uKSB7Ci0JY2FzZSAweDgyOgkJLyogSUkgKi8KLQkJaHdfZmlsdGVycyA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgMHhjMzoJCS8qIElJQiAqLwotCQlod19maWx0ZXJzID0gNiArIDMyOwotCQlicmVhazsKLQljYXNlIDB4YzA6CQkvKiBJSUkgKi8KLQkJaHdfZmlsdGVycyA9IDYgKyAzMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaHdfZmlsdGVycyA9IDY7Ci0JCWJyZWFrOwotCX0KLQlwcmludGsoIiVzOiB0aGUgY2hpcCBoYXMgJWkgaGFyZHdhcmUgZmlsdGVycyIsIF9fRklMRV9fLCBod19maWx0ZXJzKTsKLQotCW1vZF9vcHRpb25faHdfZmlsdGVycyA9IDA7Ci0JaWYgKGVuYWJsZV9od19maWx0ZXJzID49IDEpCi0JCW1vZF9vcHRpb25faHdfZmlsdGVycyArPSA2OwotCWlmIChlbmFibGVfaHdfZmlsdGVycyA+PSAyKQotCQltb2Rfb3B0aW9uX2h3X2ZpbHRlcnMgKz0gMzI7Ci0KLQlpZiAobW9kX29wdGlvbl9od19maWx0ZXJzID49IGh3X2ZpbHRlcnMpIHsKLQkJYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzID0gaHdfZmlsdGVyczsKLQl9IGVsc2UgewotCQlhZGFwdGVyLT51c2VhYmxlX2h3X2ZpbHRlcnMgPSBtb2Rfb3B0aW9uX2h3X2ZpbHRlcnM7Ci0JCXByaW50aygiLCBidXQgb25seSAlZCB3aWxsIGJlIHVzZWQgYmVjYXVzZSBvZiBtb2R1bGUgb3B0aW9uIiwgbW9kX29wdGlvbl9od19maWx0ZXJzKTsKLQl9Ci0JcHJpbnRrKCJcbiIpOwotCWRwcmludGsoIiVzOiB1c2VhYmxlX2hhcmR3YXJlX2ZpbHRlcnMgc2V0IHRvICVpXG4iLCBfX0ZJTEVfXywgYWRhcHRlci0+dXNlYWJsZV9od19maWx0ZXJzKTsKLX0KLQotc3RhdGljIGludCBkcml2ZXJfaW5pdGlhbGl6ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKLQl1MzIgdG1wOwotCWludCByZXQgPSAtRU5PTUVNOwotCi0JYWRhcHRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGFwdGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGFwdGVyKSB7Ci0JCWRwcmludGsoIiVzOiBvdXQgb2YgbWVtb3J5IVxuIiwgX19GVU5DVElPTl9fKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtc2V0KGFkYXB0ZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWRhcHRlcikpOwotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsYWRhcHRlcik7Ci0KLQlhZGFwdGVyLT5wZGV2ID0gcGRldjsKLQlhZGFwdGVyLT5pcnEgPSBwZGV2LT5pcnE7Ci0KLQlyZXQgPSBjbGFpbV9hZGFwdGVyKGFkYXB0ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9rZnJlZTsKLQotCWlycV9kbWFfZW5hYmxlX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDApOwotCi0JcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpc3IsIDB4NDAwMDAwMCwgIlNreXN0YXIyIiwgYWRhcHRlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZHByaW50aygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnE9JWQgIVxuIiwgX19GVU5DVElPTl9fLCBwZGV2LT5pcnEpOwotCQlnb3RvIGVycl9yZWxlYXNlX2FkYXB0ZXI7Ci0JfQotCi0JcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgyMDgpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgMCk7Ci0Jd3JpdGVfcmVnX2R3KGFkYXB0ZXIsIDB4MjEwLCAweGIyZmYpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwOCwgMHg0MCk7Ci0KLQlyZXQgPSBpbml0X2RtYV9xdWV1ZShhZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZnJlZV9pcnE7Ci0KLQlhZGFwdGVyLT5iMmMyX3JldmlzaW9uID0gKHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MjA0KSA+PiAweDE4KTsKLQotCXN3aXRjaCAoYWRhcHRlci0+YjJjMl9yZXZpc2lvbikgewotCWNhc2UgMHg4MjoKLQkJcHJpbnRrKCIlczogRmxleENvcElJKHJldi4xMzApIGNoaXAgZm91bmRcbiIsIF9fRklMRV9fKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGMzOgotCQlwcmludGsoIiVzOiBGbGV4Q29wSUlCKHJldi4xOTUpIGNoaXAgZm91bmRcbiIsIF9fRklMRV9fKTsKLQkJYnJlYWs7Ci0JY2FzZSAweGMwOgotCQlwcmludGsoIiVzOiBGbGV4Q29wSUlJKHJldi4xOTIpIGNoaXAgZm91bmRcbiIsIF9fRklMRV9fKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCIlczogVGhlIHJldmlzaW9uIG9mIHRoZSBGbGV4Q29wIGNoaXAgb24geW91ciBjYXJkIGlzICVkXG4iLCBfX0ZJTEVfXywgYWRhcHRlci0+YjJjMl9yZXZpc2lvbik7Ci0JCXByaW50aygiJXM6IFRoaXMgZHJpdmVyIHdvcmtzIG9ubHkgd2l0aCBGbGV4Q29wSUkocmV2LjEzMCksIEZsZXhDb3BJSUIocmV2LjE5NSkgYW5kIEZsZXhDb3BJSUkocmV2LjE5MikuXG4iLCBfX0ZJTEVfXyk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2ZyZWVfZG1hX3F1ZXVlOwotCQl9Ci0KLQlkZWNpZGVfaG93X21hbnlfaHdfZmlsdGVycyhhZGFwdGVyKTsKLQotCWluaXRfcGlkcyhhZGFwdGVyKTsKLQotCXRtcCA9IHJlYWRfcmVnX2R3KGFkYXB0ZXIsIDB4MjA0KTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwNCwgMCk7Ci0JbWRlbGF5KDIwKTsKLQotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDIwNCwgdG1wKTsKLQltZGVsYXkoMTApOwotCi0JdG1wID0gcmVhZF9yZWdfZHcoYWRhcHRlciwgMHgzMDgpOwotCXdyaXRlX3JlZ19kdyhhZGFwdGVyLCAweDMwOCwgMHg0MDAwIHwgdG1wKTsKLQotCWFkYXB0ZXItPmR3X3NyYW1fdHlwZSA9IDB4MTAwMDA7Ci0KLQlzbGxfZGV0ZWN0X3NyYW1fc2l6ZShhZGFwdGVyKTsKLQotCWRwcmludGsoIiVzIHNyYW0gbGVuZ3RoID0gJWQsIHNyYW0gdHlwZT0gJXhcbiIsIF9fRlVOQ1RJT05fXywgc3JhbV9sZW5ndGgoYWRhcHRlciksIGFkYXB0ZXItPmR3X3NyYW1fdHlwZSk7Ci0KLQlzcmFtX3NldF9tZWRpYV9kZXN0KGFkYXB0ZXIsIDEpOwotCXNyYW1fc2V0X25ldF9kZXN0KGFkYXB0ZXIsIDEpOwotCi0JY3RybF9lbmFibGVfc21jKGFkYXB0ZXIsIDApOwotCi0Jc3JhbV9zZXRfY2FpX2Rlc3QoYWRhcHRlciwgMik7Ci0Jc3JhbV9zZXRfY2FvX2Rlc3QoYWRhcHRlciwgMik7Ci0KLQlkbWFfZW5hYmxlX2Rpc2FibGVfaXJxKGFkYXB0ZXIsIDEsIDAsIDApOwotCi0JaWYgKGVlcHJvbV9nZXRfbWFjX2FkZHIoYWRhcHRlciwgMCwgYWRhcHRlci0+bWFjX2FkZHIpICE9IDApIHsKLQkJcHJpbnRrKCIlcyBNQUMgYWRkcmVzcyA9ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBcbiIsIF9fRlVOQ1RJT05fXywgYWRhcHRlci0+bWFjX2FkZHJbMF0sCi0JCSAgICAgICBhZGFwdGVyLT5tYWNfYWRkclsxXSwgYWRhcHRlci0+bWFjX2FkZHJbMl0sIGFkYXB0ZXItPm1hY19hZGRyWzNdLCBhZGFwdGVyLT5tYWNfYWRkcls0XSwgYWRhcHRlci0+bWFjX2FkZHJbNV0sCi0JCSAgICAgICBhZGFwdGVyLT5tYWNfYWRkcls2XSwgYWRhcHRlci0+bWFjX2FkZHJbN10KLQkJICAgICk7Ci0KLQkJY2Ffc2V0X21hY19kc3RfYWRkcl9maWx0ZXIoYWRhcHRlciwgYWRhcHRlci0+bWFjX2FkZHIpOwotCQljdHJsX2VuYWJsZV9tYWMoYWRhcHRlciwgMSk7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLQotZXJyX2ZyZWVfZG1hX3F1ZXVlOgotCWZyZWVfZG1hX3F1ZXVlKGFkYXB0ZXIpOwotZXJyX2ZyZWVfaXJxOgotCWZyZWVfaXJxKHBkZXYtPmlycSwgYWRhcHRlcik7Ci1lcnJfcmVsZWFzZV9hZGFwdGVyOgotCXJlbGVhc2VfYWRhcHRlcihhZGFwdGVyKTsKLWVycl9rZnJlZToKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0Ja2ZyZWUoYWRhcHRlcik7Ci0JZ290byBvdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRyaXZlcl9oYWx0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaXJxX2RtYV9lbmFibGVfZGlzYWJsZV9pcnEoYWRhcHRlciwgMCk7Ci0KLQljdHJsX2VuYWJsZV9yZWNlaXZlX2RhdGEoYWRhcHRlciwgMCk7Ci0KLQlmcmVlX2FkYXB0ZXJfb2JqZWN0KGFkYXB0ZXIpOwotCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGR2Yl9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKLXsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKSBkdmJkbXgtPnByaXY7Ci0KLQlkcHJpbnRrKCIlczogUElEPSVkLCB0eXBlPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGR2YmRteGZlZWQtPnBpZCwgZHZiZG14ZmVlZC0+dHlwZSk7Ci0KLQlvcGVuX3N0cmVhbShhZGFwdGVyLCBkdmJkbXhmZWVkLT5waWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHZiX3N0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCi17Ci0Jc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKikgZHZiZG14LT5wcml2OwotCi0JZHByaW50aygiJXM6IFBJRD0lZCwgdHlwZT0lZFxuIiwgX19GVU5DVElPTl9fLCBkdmJkbXhmZWVkLT5waWQsIGR2YmRteGZlZWQtPnR5cGUpOwotCi0JY2xvc2Vfc3RyZWFtKGFkYXB0ZXIsIGR2YmRteGZlZWQtPnBpZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogbG5iIGNvbnRyb2wgKi8KLXN0YXRpYyB2b2lkIHNldF90dW5lcl90b25lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCB0b25lKQotewotCXUxNiB3el9oYWxmX3BlcmlvZF9mb3JfNDVfbWh6W10gPSB7IDB4MDFmZiwgMHgwMTU0LCAweDAwZmYsIDB4MDBjYyB9OwotCXUxNiBheDsKLQotCWRwcmludGsoIiVzOiAldVxuIiwgX19GVU5DVElPTl9fLCB0b25lKTsKLQotCXN3aXRjaCAodG9uZSkgewotCWNhc2UgMToKLQkJYXggPSB3el9oYWxmX3BlcmlvZF9mb3JfNDVfbWh6WzBdOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWF4ID0gd3pfaGFsZl9wZXJpb2RfZm9yXzQ1X21oelsxXTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlheCA9IHd6X2hhbGZfcGVyaW9kX2Zvcl80NV9taHpbMl07Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJYXggPSB3el9oYWxmX3BlcmlvZF9mb3JfNDVfbWh6WzNdOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWF4ID0gMDsKLQl9Ci0KLQlpZiAoYXggIT0gMCkgewotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDAsICgoYXggPDwgMHgwZikgKyAoYXggJiAweDdmZmYpKSB8IDB4NDAwMDAwMDApOwotCi0JfSBlbHNlIHsKLQotCQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDAsIDB4NDBmZjgwMDApOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2V0X3R1bmVyX3BvbGFyaXR5KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1OCBwb2xhcml0eSkKLXsKLQl1MzIgdmFyOwotCi0JZHByaW50aygiJXMgOiBwb2xhcml0eSA9ICV1IFxuIiwgX19GVU5DVElPTl9fLCBwb2xhcml0eSk7Ci0KLQl2YXIgPSByZWFkX3JlZ19kdyhhZGFwdGVyLCAweDIwNCk7Ci0KLQlpZiAocG9sYXJpdHkgPT0gMCkgewotCQlkcHJpbnRrKCIlczogTE5CIHBvd2VyIG9mZlxuIiwgX19GVU5DVElPTl9fKTsKLQkJdmFyID0gdmFyIHwgMTsKLQl9OwotCi0JaWYgKHBvbGFyaXR5ID09IDEpIHsKLQkJdmFyID0gdmFyICYgfjE7Ci0JCXZhciA9IHZhciAmIH40OwotCX07Ci0KLQlpZiAocG9sYXJpdHkgPT0gMikgewotCQl2YXIgPSB2YXIgJiB+MTsKLQkJdmFyID0gdmFyIHwgNDsKLQl9Ci0KLQl3cml0ZV9yZWdfZHcoYWRhcHRlciwgMHgyMDQsIHZhcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2VxY19zZW5kX2JpdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGRhdGEpCi17Ci0Jc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMSk7Ci0JdWRlbGF5KGRhdGEgPyA1MDAgOiAxMDAwKTsKLQlzZXRfdHVuZXJfdG9uZShhZGFwdGVyLCAwKTsKLQl1ZGVsYXkoZGF0YSA/IDEwMDAgOiA1MDApOwotfQotCi0KLXN0YXRpYyB2b2lkIGRpc2VxY19zZW5kX2J5dGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBkYXRhKQotCQl7Ci0JaW50IGksIHBhciA9IDEsIGQ7Ci0KLQlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgewotCQlkID0gKGRhdGEgPj4gaSkgJiAxOwotCQlwYXIgXj0gZDsKLQkJZGlzZXFjX3NlbmRfYml0KGFkYXB0ZXIsIGQpOwotCX0KLQotCWRpc2VxY19zZW5kX2JpdChhZGFwdGVyLCBwYXIpOwotCQl9Ci0KLQotc3RhdGljIGludCBzZW5kX2Rpc2VxY19tc2coc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBsZW4sIHU4ICptc2csIHVuc2lnbmVkIGxvbmcgYnVyc3QpCi17Ci0JaW50IGk7Ci0KLQlzZXRfdHVuZXJfdG9uZShhZGFwdGVyLCAwKTsKLQltZGVsYXkoMTYpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlkaXNlcWNfc2VuZF9ieXRlKGFkYXB0ZXIsIG1zZ1tpXSk7Ci0KLQltZGVsYXkoMTYpOwotCi0JaWYgKGJ1cnN0ICE9IC0xKSB7Ci0JCWlmIChidXJzdCkKLQkJCWRpc2VxY19zZW5kX2J5dGUoYWRhcHRlciwgMHhmZik7Ci0JCWVsc2UgewotCQkJc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMSk7Ci0JCQl1ZGVsYXkoMTI1MDApOwotCQkJc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMCk7Ci0JCX0KLQkJbXNsZWVwKDIwKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmbGV4Y29wX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlzd2l0Y2godG9uZSkgewotCQljYXNlIFNFQ19UT05FX09OOgotCQkJc2V0X3R1bmVyX3RvbmUoYWRhcHRlciwgMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCQlzZXRfdHVuZXJfdG9uZShhZGFwdGVyLCAwKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKiBjbWQpCi0JCXsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQkJCXNlbmRfZGlzZXFjX21zZyhhZGFwdGVyLCBjbWQtPm1zZ19sZW4sIGNtZC0+bXNnLCAwKTsKLQotCXJldHVybiAwOwotCQl9Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZCkKLXsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlzZW5kX2Rpc2VxY19tc2coYWRhcHRlciwgMCwgTlVMTCwgbWluaWNtZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmbGV4Y29wX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCi0JCXsKLQlzdHJ1Y3QgYWRhcHRlciogYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciopIGZlLT5kdmItPnByaXY7Ci0KLQlkcHJpbnRrKCIlczogRkVfU0VUX1ZPTFRBR0VcbiIsIF9fRlVOQ1RJT05fXyk7Ci0KLQlzd2l0Y2ggKHZvbHRhZ2UpIHsKLQljYXNlIFNFQ19WT0xUQUdFXzEzOgotCQlkcHJpbnRrKCIlczogU0VDX1ZPTFRBR0VfMTMsICV4XG4iLCBfX0ZVTkNUSU9OX18sIFNFQ19WT0xUQUdFXzEzKTsKLQkJc2V0X3R1bmVyX3BvbGFyaXR5KGFkYXB0ZXIsIDEpOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgU0VDX1ZPTFRBR0VfMTg6Ci0JCWRwcmludGsoIiVzOiBTRUNfVk9MVEFHRV8xOCwgJXhcbiIsIF9fRlVOQ1RJT05fXywgU0VDX1ZPTFRBR0VfMTgpOwotCQlzZXRfdHVuZXJfcG9sYXJpdHkoYWRhcHRlciwgMik7Ci0JCQlyZXR1cm4gMDsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl9Ci0KLXN0YXRpYyBpbnQgZmxleGNvcF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKLQkJewotCXN0cnVjdCBhZGFwdGVyKiBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyKikgZmUtPmR2Yi0+cHJpdjsKLQotCWRwcmludGsoIiVzOiBGRV9TTEVFUFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXNldF90dW5lcl9wb2xhcml0eShhZGFwdGVyLCAwKTsKLQotCWlmIChhZGFwdGVyLT5mZV9zbGVlcCkgcmV0dXJuIGFkYXB0ZXItPmZlX3NsZWVwKGZlKTsKLQlyZXR1cm4gMDsKLQkJfQotCi1zdGF0aWMgdTMyIGZsZXhjb3BfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotCQl7Ci0JcHJpbnRrKCJmbGV4Y29wX2kyY19mdW5jXG4iKTsKLQotCXJldHVybiBJMkNfRlVOQ19JMkM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAgICBmbGV4Y29wX2FsZ28gPSB7Ci0JLm5hbWUJCT0gImZsZXhjb3AgaTJjIGFsZ29yaXRobSIsCi0JLmlkCQk9IEkyQ19BTEdPX0JJVCwKLQkubWFzdGVyX3hmZXIJPSBtYXN0ZXJfeGZlciwKLQkuZnVuY3Rpb25hbGl0eQk9IGZsZXhjb3BfaTJjX2Z1bmMsCi19OwotCi0KLQotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyIHNyYXRlLCB1MzIgcmF0aW8pCi17Ci0JdTggYWNsayA9IDA7Ci0JdTggYmNsayA9IDA7Ci0KLQlpZiAoc3JhdGUgPCAxNTAwMDAwKSB7IGFjbGsgPSAweGI3OyBiY2xrID0gMHg0NzsgfQotCWVsc2UgaWYgKHNyYXRlIDwgMzAwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NGI7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDcwMDAwMDApIHsgYWNsayA9IDB4Yjc7IGJjbGsgPSAweDRmOyB9Ci0JZWxzZSBpZiAoc3JhdGUgPCAxNDAwMDAwMCkgeyBhY2xrID0gMHhiNzsgYmNsayA9IDB4NTM7IH0KLQllbHNlIGlmIChzcmF0ZSA8IDMwMDAwMDAwKSB7IGFjbGsgPSAweGI2OyBiY2xrID0gMHg1MzsgfQotCWVsc2UgaWYgKHNyYXRlIDwgNDUwMDAwMDApIHsgYWNsayA9IDB4YjQ7IGJjbGsgPSAweDUxOyB9Ci0KLQlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgxMywgYWNsayk7Ci0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MTQsIGJjbGspOwotCXN0djAyOTlfd3JpdGVyZWcgKGZlLCAweDFmLCAocmF0aW8gPj4gMTYpICYgMHhmZik7Ci0Jc3R2MDI5OV93cml0ZXJlZyAoZmUsIDB4MjAsIChyYXRpbyA+PiAgOCkgJiAweGZmKTsKLQlzdHYwMjk5X3dyaXRlcmVnIChmZSwgMHgyMSwgKHJhdGlvICAgICAgKSAmIDB4ZjApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Ftc3VuZ190Ym11MjQxMTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCi17Ci0JdTggYnVmWzRdOwotCXUzMiBkaXY7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OwotCXN0cnVjdCBhZGFwdGVyKiBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyKikgZmUtPmR2Yi0+cHJpdjsKLQotCWRpdiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTI1OwotCi0JYnVmWzBdID0gKGRpdiA+PiA4KSAmIDB4N2Y7Ci0JYnVmWzFdID0gZGl2ICYgMHhmZjsKLQlidWZbMl0gPSAweDg0OyAgLy8gMHhDNAotCWJ1ZlszXSA9IDB4MDg7Ci0KLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwKSBidWZbM10gfD0gMHgxMDsKLQotCWlmIChpMmNfdHJhbnNmZXIgKCZhZGFwdGVyLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBzYW1zdW5nX3RibXUyNDExMl9pbml0dGFiW10gPSB7Ci0JICAgICAweDAxLCAweDE1LAotCSAgICAgMHgwMiwgMHgzMCwKLQkgICAgIDB4MDMsIDB4MDAsCi0JICAgICAweDA0LCAweDdELAotCSAgICAgMHgwNSwgMHgzNSwKLQkgICAgIDB4MDYsIDB4MDIsCi0JICAgICAweDA3LCAweDAwLAotCSAgICAgMHgwOCwgMHhDMywKLQkgICAgIDB4MEMsIDB4MDAsCi0JICAgICAweDBELCAweDgxLAotCSAgICAgMHgwRSwgMHgyMywKLQkgICAgIDB4MEYsIDB4MTIsCi0JICAgICAweDEwLCAweDdFLAotCSAgICAgMHgxMSwgMHg4NCwKLQkgICAgIDB4MTIsIDB4QjksCi0JICAgICAweDEzLCAweDg4LAotCSAgICAgMHgxNCwgMHg4OSwKLQkgICAgIDB4MTUsIDB4QzksCi0JICAgICAweDE2LCAweDAwLAotCSAgICAgMHgxNywgMHg1QywKLQkgICAgIDB4MTgsIDB4MDAsCi0JICAgICAweDE5LCAweDAwLAotCSAgICAgMHgxQSwgMHgwMCwKLQkgICAgIDB4MUMsIDB4MDAsCi0JICAgICAweDFELCAweDAwLAotCSAgICAgMHgxRSwgMHgwMCwKLQkgICAgIDB4MUYsIDB4M0EsCi0JICAgICAweDIwLCAweDJFLAotCSAgICAgMHgyMSwgMHg4MCwKLQkgICAgIDB4MjIsIDB4RkYsCi0JICAgICAweDIzLCAweEMxLAotCSAgICAgMHgyOCwgMHgwMCwKLQkgICAgIDB4MjksIDB4MUUsCi0JICAgICAweDJBLCAweDE0LAotCSAgICAgMHgyQiwgMHgwRiwKLQkgICAgIDB4MkMsIDB4MDksCi0JICAgICAweDJELCAweDA1LAotCSAgICAgMHgzMSwgMHgxRiwKLQkgICAgIDB4MzIsIDB4MTksCi0JICAgICAweDMzLCAweEZFLAotCSAgICAgMHgzNCwgMHg5MywKLQkgICAgIDB4ZmYsIDB4ZmYsCi0JCQl9OwotCi1zdGF0aWMgc3RydWN0IHN0djAyOTlfY29uZmlnIHNhbXN1bmdfdGJtdTI0MTEyX2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCi0JLmluaXR0YWIgPSBzYW1zdW5nX3RibXUyNDExMl9pbml0dGFiLAotCS5tY2xrID0gODgwMDAwMDBVTCwKLQkuaW52ZXJ0ID0gMCwKLQkuZW5oYW5jZWRfdHVuaW5nID0gMCwKLQkuc2tpcF9yZWluaXQgPSAwLAotCS5sb2NrX291dHB1dCA9IFNUVjAyMjlfTE9DS09VVFBVVF9MSywKLQkudm9sdDEzX29wMF9vcDEgPSBTVFYwMjk5X1ZPTFQxM19PUDEsCi0JLm1pbl9kZWxheV9tcyA9IDEwMCwKLQkuc2V0X3N5bWJvbF9yYXRlID0gc2Ftc3VuZ190Ym11MjQxMTJfc2V0X3N5bWJvbF9yYXRlLAotICAgCS5wbGxfc2V0ID0gc2Ftc3VuZ190Ym11MjQxMTJfcGxsX3NldCwKLX07Ci0KLQotCi1zdGF0aWMgaW50IG54dDIwMDJfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpCi17Ci0Jc3RydWN0IGFkYXB0ZXIqIGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIqKSBmZS0+ZHZiLT5wcml2OwotCi0JcmV0dXJuIHJlcXVlc3RfZmlybXdhcmUoZncsIG5hbWUsICZhZGFwdGVyLT5wZGV2LT5kZXYpOwotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgbnh0MjAwMl9jb25maWcgc2Ftc3VuZ190Ym12X2NvbmZpZyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MEEsCi0JLnJlcXVlc3RfZmlybXdhcmUgPSBueHQyMDAyX3JlcXVlc3RfZmlybXdhcmUsCi19OwotCi1zdGF0aWMgaW50IHNhbXN1bmdfdGR0YzkyNTFkaDBfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKLXsKLQlzdGF0aWMgdTggbXQzNTJfY2xvY2tfY29uZmlnIFtdID0geyAweDg5LCAweDE4LCAweDJkIH07Ci0Jc3RhdGljIHU4IG10MzUyX3Jlc2V0IFtdID0geyAweDUwLCAweDgwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2FkY19jdGxfMV9jZmcgW10gPSB7IDB4OEUsIDB4NDAgfTsKLQlzdGF0aWMgdTggbXQzNTJfYWdjX2NmZyBbXSA9IHsgMHg2NywgMHgyOCwgMHhhMSB9OwotCXN0YXRpYyB1OCBtdDM1Ml9jYXB0X3JhbmdlX2NmZ1tdID0geyAweDc1LCAweDMyIH07Ci0KLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2xvY2tfY29uZmlnLCBzaXplb2YobXQzNTJfY2xvY2tfY29uZmlnKSk7Ci0JdWRlbGF5KDIwMDApOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yZXNldCwgc2l6ZW9mKG10MzUyX3Jlc2V0KSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX2FkY19jdGxfMV9jZmcsIHNpemVvZihtdDM1Ml9hZGNfY3RsXzFfY2ZnKSk7Ci0KLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWdjX2NmZywgc2l6ZW9mKG10MzUyX2FnY19jZmcpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2FwdF9yYW5nZV9jZmcsIHNpemVvZihtdDM1Ml9jYXB0X3JhbmdlX2NmZykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1ZikKLXsKLQl1MzIgZGl2OwotCXVuc2lnbmVkIGNoYXIgYnMgPSAwOwotCi0JI2RlZmluZSBJRl9GUkVRVUVOQ1l4NiAyMTcgICAgLyogNiAqIDM2LjE2NjY2NjY2NjY3TUh6ICovCi0JZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKLQotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0ODAwMDAwMCAmJiBwYXJhbXMtPmZyZXF1ZW5jeSA8PSAxNTQwMDAwMDApIGJzID0gMHgwOTsKLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gMTYxMDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDQzOTAwMDAwMCkgYnMgPSAweDBhOwotCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0NDcwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gODYzMDAwMDAwKSBicyA9IDB4MDg7Ci0KLQlwbGxidWZbMF0gPSAweGMyOyAvLyBOb3RlOiBub24tbGludXggc3RhbmRhcmQgUExMIGkyYyBhZGRyZXNzCi0JcGxsYnVmWzFdID0gZGl2ID4+IDg7Ci0gICAJcGxsYnVmWzJdID0gZGl2ICYgMHhmZjsKLSAgIAlwbGxidWZbM10gPSAweGNjOwotICAgCXBsbGJ1Zls0XSA9IGJzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHNhbXN1bmdfdGR0YzkyNTFkaDBfY29uZmlnID0gewotCi0JLmRlbW9kX2FkZHJlc3MgPSAweDBmLAotCS5kZW1vZF9pbml0ID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAotICAgCS5wbGxfc2V0ID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAotfTsKLQotc3RhdGljIGludCBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCi17Ci0JdTggYnVmWzRdOwotCXUzMiBkaXY7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OwotCXN0cnVjdCBhZGFwdGVyKiBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyKikgZmUtPmR2Yi0+cHJpdjsKLQotCWRpdiA9IChwYXJhbXMtPmZyZXF1ZW5jeSArICgxMjUvMikpIC8gMTI1OwotCi0JYnVmWzBdID0gKGRpdiA+PiA4KSAmIDB4N2Y7Ci0JYnVmWzFdID0gKGRpdiA+PiAwKSAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4NCB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOwotCWJ1ZlszXSA9IDB4ODA7Ci0KLQlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTUwMDAwKQotCQlidWZbM10gfD0gMHgwMjsKLQotCWlmIChpMmNfdHJhbnNmZXIgKCZhZGFwdGVyLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQzMTJfY29uZmlnIHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcgPSB7Ci0KLQkuZGVtb2RfYWRkcmVzcyA9IDB4MGUsCi0gICAJLnBsbF9zZXQgPSBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldCwKLX07Ci0KLQotCi0KLXN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGFkYXB0ZXIgKnNreXN0YXIyKQotewotCXN3aXRjaChza3lzdGFyMi0+cGRldi0+ZGV2aWNlKSB7Ci0JY2FzZSAweDIxMDM6IC8vIFRlY2huaXNhdCBTa3lzdGFyMiBPUiBUZWNobmlzYXQgQWlyc3RhcjIgKERWQi1UIG9yIEFUU0MpCi0KLQkJLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBOZXh0d2F2ZSBueHQyMDAyIGZvciBBVFNDIHN1cHBvcnQgCi0JCXNreXN0YXIyLT5mZSA9IG54dDIwMDJfYXR0YWNoKCZzYW1zdW5nX3RibXZfY29uZmlnLCAmc2t5c3RhcjItPmkyY19hZGFwKTsKLQkJaWYgKHNreXN0YXIyLT5mZSAhPSBOVUxMKSB7Ci0JCQlza3lzdGFyMi0+ZmVfc2xlZXAgPSBza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXA7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXAgPSBmbGV4Y29wX3NsZWVwOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyB0cnkgdGhlIHNreXN0YXIyIHYyLjYgZmlyc3QgKHN0djAyOTkvU2Ftc3VuZyB0Ym11MjQxMTIoc2wxOTM1KSkKLQkJc2t5c3RhcjItPmZlID0gc3R2MDI5OV9hdHRhY2goJnNhbXN1bmdfdGJtdTI0MTEyX2NvbmZpZywgJnNreXN0YXIyLT5pMmNfYWRhcCk7Ci0JCWlmIChza3lzdGFyMi0+ZmUgIT0gTlVMTCkgewotCQkJc2t5c3RhcjItPmZlLT5vcHMtPnNldF92b2x0YWdlID0gZmxleGNvcF9zZXRfdm9sdGFnZTsKLQkJCXNreXN0YXIyLT5mZV9zbGVlcCA9IHNreXN0YXIyLT5mZS0+b3BzLT5zbGVlcDsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5zbGVlcCA9IGZsZXhjb3Bfc2xlZXA7Ci0JCQlicmVhazsKLX0KLQotCQkvLyB0cnkgdGhlIGFpcnN0YXIyIChtdDM1Mi9TYW1zdW5nIHRkdGM5MjUxZGgwKD8/KSkKLQkJc2t5c3RhcjItPmZlID0gbXQzNTJfYXR0YWNoKCZzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZywgJnNreXN0YXIyLT5pMmNfYWRhcCk7Ci0JCWlmIChza3lzdGFyMi0+ZmUgIT0gTlVMTCkgewotCQkJc2t5c3RhcjItPmZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21pbiA9IDQ3NDAwMDAwMDsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9tYXggPSA4NTgwMDAwMDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8vIHRyeSB0aGUgc2t5c3RhcjIgdjIuMyAodnAzMTAvU2Ftc3VuZyB0YmR1MTgxMzIodHNhNTA1OSkpCi0JCXNreXN0YXIyLT5mZSA9IHZwMzEwX2F0dGFjaCgmc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX2NvbmZpZywgJnNreXN0YXIyLT5pMmNfYWRhcCk7Ci0JCWlmIChza3lzdGFyMi0+ZmUgIT0gTlVMTCkgewotCQkJc2t5c3RhcjItPmZlLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBmbGV4Y29wX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBmbGV4Y29wX2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJc2t5c3RhcjItPmZlLT5vcHMtPnNldF90b25lID0gZmxleGNvcF9zZXRfdG9uZTsKLQkJCXNreXN0YXIyLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7Ci0JCQlza3lzdGFyMi0+ZmVfc2xlZXAgPSBza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXA7Ci0JCQlza3lzdGFyMi0+ZmUtPm9wcy0+c2xlZXAgPSBmbGV4Y29wX3NsZWVwOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHNreXN0YXIyLT5mZSA9PSBOVUxMKSB7Ci0JCXByaW50aygic2t5c3RhcjI6IEEgZnJvbnRlbmQgZHJpdmVyIHdhcyBub3QgZm91bmQgZm9yIGRldmljZSAlMDR4LyUwNHggc3Vic3lzdGVtICUwNHgvJTA0eFxuIiwKLQkJICAgICAgIHNreXN0YXIyLT5wZGV2LT52ZW5kb3IsCi0JCSAgICAgICBza3lzdGFyMi0+cGRldi0+ZGV2aWNlLAotCQkgICAgICAgc2t5c3RhcjItPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCi0JCSAgICAgICBza3lzdGFyMi0+cGRldi0+c3Vic3lzdGVtX2RldmljZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmc2t5c3RhcjItPmR2Yl9hZGFwdGVyLCBza3lzdGFyMi0+ZmUpKSB7Ci0JCQlwcmludGsoInNreXN0YXIyOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoc2t5c3RhcjItPmZlLT5vcHMtPnJlbGVhc2UpCi0JCQkJc2t5c3RhcjItPmZlLT5vcHMtPnJlbGVhc2Uoc2t5c3RhcjItPmZlKTsKLQkJCXNreXN0YXIyLT5mZSA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLQotc3RhdGljIGludCBza3lzdGFyMl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcjsKLQlzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyOwotCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4OwotCXN0cnVjdCBkbXhfZGVtdXggKmRteDsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQotCWlmICghcGRldikKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSBkcml2ZXJfaW5pdGlhbGl6ZShwZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQlhZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWR2Yl9hZGFwdGVyID0gJmFkYXB0ZXItPmR2Yl9hZGFwdGVyOwotCi0JcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoZHZiX2FkYXB0ZXIsIHNreXN0YXIyX3BjaV9kcml2ZXIubmFtZSwKLQkJCQkgICBUSElTX01PRFVMRSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKCIlczogRXJyb3IgcmVnaXN0ZXJpbmcgRFZCIGFkYXB0ZXJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gZXJyX2hhbHQ7Ci0JfQotCi0JZHZiX2FkYXB0ZXItPnByaXYgPSBhZGFwdGVyOwotCi0KLQlpbml0X01VVEVYKCZhZGFwdGVyLT5pMmNfc2VtKTsKLQotCi0JbWVtc2V0KCZhZGFwdGVyLT5pMmNfYWRhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlcikpOwotCXN0cmNweShhZGFwdGVyLT5pMmNfYWRhcC5uYW1lLCAiU2t5U3RhcjIiKTsKLQotCWkyY19zZXRfYWRhcGRhdGEoJmFkYXB0ZXItPmkyY19hZGFwLCBhZGFwdGVyKTsKLQotI2lmZGVmIEkyQ19BREFQX0NMQVNTX1RWX0RJR0lUQUwKLQlhZGFwdGVyLT5pMmNfYWRhcC5jbGFzcyAJICAgID0gSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTDsKLSNlbHNlCi0JYWRhcHRlci0+aTJjX2FkYXAuY2xhc3MgCSAgICA9IEkyQ19DTEFTU19UVl9ESUdJVEFMOwotI2VuZGlmCi0JYWRhcHRlci0+aTJjX2FkYXAuYWxnbyAgICAgICAgICAgICAgPSAmZmxleGNvcF9hbGdvOwotCWFkYXB0ZXItPmkyY19hZGFwLmFsZ29fZGF0YSAgICAgICAgID0gTlVMTDsKLQlhZGFwdGVyLT5pMmNfYWRhcC5pZCAgICAgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVDsKLQotCXJldCA9IGkyY19hZGRfYWRhcHRlcigmYWRhcHRlci0+aTJjX2FkYXApOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9kdmJfdW5yZWdpc3RlcjsKLQotCWR2YmRlbXV4ID0gJmFkYXB0ZXItPmRlbXV4OwotCi0JZHZiZGVtdXgtPnByaXYgPSBhZGFwdGVyOwotCWR2YmRlbXV4LT5maWx0ZXJudW0gPSBOX1BJRF9TTE9UUzsKLQlkdmJkZW11eC0+ZmVlZG51bSA9IE5fUElEX1NMT1RTOwotCWR2YmRlbXV4LT5zdGFydF9mZWVkID0gZHZiX3N0YXJ0X2ZlZWQ7Ci0JZHZiZGVtdXgtPnN0b3BfZmVlZCA9IGR2Yl9zdG9wX2ZlZWQ7Ci0JZHZiZGVtdXgtPndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOwotCWR2YmRlbXV4LT5kbXguY2FwYWJpbGl0aWVzID0gKERNWF9UU19GSUxURVJJTkcgfCBETVhfU0VDVElPTl9GSUxURVJJTkcgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7Ci0KLQlyZXQgPSBkdmJfZG14X2luaXQoJmFkYXB0ZXItPmRlbXV4KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfaTJjX2RlbDsKLQotCWRteCA9ICZkdmJkZW11eC0+ZG14OwotCi0JYWRhcHRlci0+aHdfZnJvbnRlbmQuc291cmNlID0gRE1YX0ZST05URU5EXzA7Ci0JYWRhcHRlci0+ZG14ZGV2LmZpbHRlcm51bSA9IE5fUElEX1NMT1RTOwotCWFkYXB0ZXItPmRteGRldi5kZW11eCA9IGRteDsKLQlhZGFwdGVyLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKLQotCXJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmYWRhcHRlci0+ZG14ZGV2LCAmYWRhcHRlci0+ZHZiX2FkYXB0ZXIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9kbXhfcmVsZWFzZTsKLQotCXJldCA9IGRteC0+YWRkX2Zyb250ZW5kKGRteCwgJmFkYXB0ZXItPmh3X2Zyb250ZW5kKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfZG14ZGV2X3JlbGVhc2U7Ci0KLQlhZGFwdGVyLT5tZW1fZnJvbnRlbmQuc291cmNlID0gRE1YX01FTU9SWV9GRTsKLQotCXJldCA9IGRteC0+YWRkX2Zyb250ZW5kKGRteCwgJmFkYXB0ZXItPm1lbV9mcm9udGVuZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3JlbW92ZV9od19mcm9udGVuZDsKLQotCXJldCA9IGRteC0+Y29ubmVjdF9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5od19mcm9udGVuZCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3JlbW92ZV9tZW1fZnJvbnRlbmQ7Ci0KLQlkdmJfbmV0X2luaXQoJmFkYXB0ZXItPmR2Yl9hZGFwdGVyLCAmYWRhcHRlci0+ZHZibmV0LCAmZHZiZGVtdXgtPmRteCk7Ci0KLQlmcm9udGVuZF9pbml0KGFkYXB0ZXIpOwotb3V0OgotCXJldHVybiByZXQ7Ci0KLWVycl9yZW1vdmVfbWVtX2Zyb250ZW5kOgotCWR2YmRlbXV4LT5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LCAmYWRhcHRlci0+bWVtX2Zyb250ZW5kKTsKLWVycl9yZW1vdmVfaHdfZnJvbnRlbmQ6Ci0JZHZiZGVtdXgtPmRteC5yZW1vdmVfZnJvbnRlbmQoJmR2YmRlbXV4LT5kbXgsICZhZGFwdGVyLT5od19mcm9udGVuZCk7Ci1lcnJfZG14ZGV2X3JlbGVhc2U6Ci0JZHZiX2RteGRldl9yZWxlYXNlKCZhZGFwdGVyLT5kbXhkZXYpOwotZXJyX2RteF9yZWxlYXNlOgotCWR2Yl9kbXhfcmVsZWFzZSgmYWRhcHRlci0+ZGVtdXgpOwotZXJyX2kyY19kZWw6Ci0JaTJjX2RlbF9hZGFwdGVyKCZhZGFwdGVyLT5pMmNfYWRhcCk7Ci1lcnJfZHZiX3VucmVnaXN0ZXI6Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmYWRhcHRlci0+ZHZiX2FkYXB0ZXIpOwotZXJyX2hhbHQ6Ci0JZHJpdmVyX2hhbHQocGRldik7Ci0JZ290byBvdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHNreXN0YXIyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eDsKLQlzdHJ1Y3QgZG14X2RlbXV4ICpkbXg7Ci0KLQlpZiAoIWFkYXB0ZXIpCi0JCXJldHVybjsKLQotCQlkdmJfbmV0X3JlbGVhc2UoJmFkYXB0ZXItPmR2Ym5ldCk7Ci0JCWR2YmRlbXV4ID0gJmFkYXB0ZXItPmRlbXV4OwotCWRteCA9ICZkdmJkZW11eC0+ZG14OwotCi0JZG14LT5jbG9zZShkbXgpOwotCWRteC0+cmVtb3ZlX2Zyb250ZW5kKGRteCwgJmFkYXB0ZXItPmh3X2Zyb250ZW5kKTsKLQlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZhZGFwdGVyLT5tZW1fZnJvbnRlbmQpOwotCi0JCWR2Yl9kbXhkZXZfcmVsZWFzZSgmYWRhcHRlci0+ZG14ZGV2KTsKLQlkdmJfZG14X3JlbGVhc2UoZHZiZGVtdXgpOwotCi0JaWYgKGFkYXB0ZXItPmZlICE9IE5VTEwpCi0JCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGFkYXB0ZXItPmZlKTsKLQotCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmFkYXB0ZXItPmR2Yl9hZGFwdGVyKTsKLQotCQkJaTJjX2RlbF9hZGFwdGVyKCZhZGFwdGVyLT5pMmNfYWRhcCk7Ci0KLQkJZHJpdmVyX2hhbHQocGRldik7Ci0JfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2t5c3RhcjJfcGNpX3RibFtdID0gewotCXsweDAwMDAxM2QwLCAweDAwMDAyMTAzLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLS8qCXsweDAwMDAxM2QwLCAweDAwMDAyMjAwLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwgVU5ERUZJTkVEIEhBUkRXQVJFIC0gbWFpbCBsaW51eHR2Lm9yZyBsaXN0ICovCS8vRkNJSUkKLQl7MCx9LAotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNreXN0YXIyX3BjaV90YmwpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2t5c3RhcjJfcGNpX2RyaXZlciA9IHsKLQkubmFtZSA9ICJTa3lTdGFyMiIsCi0JLmlkX3RhYmxlID0gc2t5c3RhcjJfcGNpX3RibCwKLQkucHJvYmUgPSBza3lzdGFyMl9wcm9iZSwKLQkucmVtb3ZlID0gc2t5c3RhcjJfcmVtb3ZlLAotfTsKLQotc3RhdGljIGludCBza3lzdGFyMl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNreXN0YXIyX3BjaV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBza3lzdGFyMl9jbGVhbnVwKHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZza3lzdGFyMl9wY2lfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2t5c3RhcjJfaW5pdCk7Ci1tb2R1bGVfZXhpdChza3lzdGFyMl9jbGVhbnVwKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJUZWNobmlzYXQgU2t5U3RhcjIgRFZCIFBDSSBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKaW5kZXggMTMzOTkxMi4uMDdhMGIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKQEAgLTI1OCwxMCArMjU4LDEwIEBACiAJaWYgKGRlYnVnICYmICh2ZXJib3NlID4gNCkpIHsKIAkJdTggaTsKIAkJaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCQlkcHJpbnRrKCIlcyB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJCWRwcmludGsoIiVzIHdyaXRpbmcgWyAiLCBfX0ZVTkNUSU9OX18pOwogCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJCWRwcmludGsoIiAlMDJ4IiwgZGF0YVtpXSk7Ci0JCQlkcHJpbnRrKCJcbiIpOworCQkJCWRwcmludGsoIiUwMnggIiwgZGF0YVtpXSk7CisJCQlkcHJpbnRrKCJdXG4iKTsKIAkJfQogCX0KIAlmb3IgKGNudCA9IDA7IGNudCA8IDI7IGNudCsrKSB7CkBAIC0zMjAsMTAgKzMyMCwyOSBAQAogfQogRVhQT1JUX1NZTUJPTChyZWFkX2RzdCk7CiAKK3N0YXRpYyBpbnQgZHN0X3NldF9wb2xhcml6YXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZS0+dm9sdGFnZSkgeworCQljYXNlIFNFQ19WT0xUQUdFXzEzOgkvLyB2ZXJ0aWNhbAorCQkJcHJpbnRrKCIlczogUG9sYXJpemF0aW9uPVtWZXJ0aWNhbF1cbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHg0MDsgIC8vMQorCQkJYnJlYWs7CisKKwkJY2FzZSBTRUNfVk9MVEFHRV8xODoJLy8gaG9yaXpvbnRhbAorCQkJcHJpbnRrKCIlczogUG9sYXJpemF0aW9uPVtIb3Jpem9udGFsXVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4NDA7ICAvLyAwCisJCQlicmVhazsKKworCQljYXNlIFNFQ19WT0xUQUdFX09GRjoKKworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZHN0X3NldF9mcmVxKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1MzIgZnJlcSkKIHsKLQl1OCAqdmFsOwotCiAJc3RhdGUtPmZyZXF1ZW5jeSA9IGZyZXE7CiAJaWYgKGRlYnVnID4gNCkKIAkJZHByaW50aygiJXM6IHNldCBGcmVxdWVuY3kgJXVcbiIsIF9fRlVOQ1RJT05fXywgZnJlcSk7CkBAIC0zMzIsNDYgKzM1MSwzMCBAQAogCQlmcmVxID0gZnJlcSAvIDEwMDA7CiAJCWlmIChmcmVxIDwgOTUwIHx8IGZyZXEgPiAyMTUwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKLQkJdmFsWzJdID0gKGZyZXEgPj4gOCkgJiAweDdmOwotCQl2YWxbM10gPSAodTgpIGZyZXE7Ci0JCXZhbFs0XSA9IDE7Ci0JCXZhbFs4XSAmPSB+NDsKLQkJaWYgKGZyZXEgPCAxNTMxKQotCQkJdmFsWzhdIHw9IDQ7CisKKwkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiA4KTsKKwkJc3RhdGUtPnR4X3R1bmFbM10gPSAodTgpIGZyZXE7CisJCXN0YXRlLT50eF90dW5hWzRdID0gMHgwMTsKKwkJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4MDQ7CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykgeworCQkJaWYgKGZyZXEgPCAxNTMxKQorCQkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4MDQ7CisJCX0KKwogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKIAkJZnJlcSA9IGZyZXEgLyAxMDAwOwogCQlpZiAoZnJlcSA8IDEzNzAwMCB8fCBmcmVxID4gODU4MDAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKLQkJdmFsWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKLQkJdmFsWzNdID0gKGZyZXEgPj4gOCkgJiAweGZmOwotCQl2YWxbNF0gPSAodTgpIGZyZXE7Ci0JCXZhbFs1XSA9IDA7Ci0JCXN3aXRjaCAoc3RhdGUtPmJhbmR3aWR0aCkgewotCQljYXNlIEJBTkRXSURUSF82X01IWjoKLQkJCXZhbFs2XSA9IDY7Ci0JCQlicmVhazsKIAotCQljYXNlIEJBTkRXSURUSF83X01IWjoKLQkJY2FzZSBCQU5EV0lEVEhfQVVUTzoKLQkJCXZhbFs2XSA9IDc7Ci0JCQlicmVhazsKKwkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOworCQlzdGF0ZS0+dHhfdHVuYVszXSA9IChmcmVxID4+IDgpICYgMHhmZjsKKwkJc3RhdGUtPnR4X3R1bmFbNF0gPSAodTgpIGZyZXE7CiAKLQkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6Ci0JCQl2YWxbNl0gPSA4OwotCQkJYnJlYWs7Ci0JCX0KLQotCQl2YWxbN10gPSAwOwotCQl2YWxbOF0gPSAwOwogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7Ci0JCS8qIGd1ZXNzIHRpbGwgd2lsbCBnZXQgb25lICovCi0JCWZyZXEgPSBmcmVxIC8gMTAwMDsKLQkJdmFsID0gJnN0YXRlLT50eF90dW5hWzBdOwotCQl2YWxbMl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOwotCQl2YWxbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7Ci0JCXZhbFs0XSA9ICh1OCkgZnJlcTsKKwkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOworCQlzdGF0ZS0+dHhfdHVuYVszXSA9IChmcmVxID4+IDgpICYgMHhmZjsKKwkJc3RhdGUtPnR4X3R1bmFbNF0gPSAodTgpIGZyZXE7CisKIAl9IGVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CkBAIC0zNzksNTEgKzM4Miw1OCBAQAogCiBzdGF0aWMgaW50IGRzdF9zZXRfYmFuZHdpZHRoKHN0cnVjdCBkc3Rfc3RhdGUqIHN0YXRlLCBmZV9iYW5kd2lkdGhfdCBiYW5kd2lkdGgpCiB7Ci0JdTggKnZhbDsKLQogCXN0YXRlLT5iYW5kd2lkdGggPSBiYW5kd2lkdGg7CiAKIAlpZiAoc3RhdGUtPmRzdF90eXBlICE9IERTVF9UWVBFX0lTX1RFUlIpCiAJCXJldHVybiAwOwogCi0JdmFsID0gJnN0YXRlLT50eF90dW5hWzBdOwogCXN3aXRjaCAoYmFuZHdpZHRoKSB7Ci0JY2FzZSBCQU5EV0lEVEhfNl9NSFo6Ci0JCXZhbFs2XSA9IDY7Ci0JCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCWlmIChzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19DQSkKKwkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDY7CisJCQllbHNlIHsKKwkJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9IDB4MDY7CisJCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQkJfQorCQkJYnJlYWs7CiAKLQljYXNlIEJBTkRXSURUSF83X01IWjoKLQkJdmFsWzZdID0gNzsKLQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0NBKQorCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwNzsKKwkJCWVsc2UgeworCQkJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwNzsKKwkJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9IDB4MDA7CisJCQl9CisJCQlicmVhazsKIAotCWNhc2UgQkFORFdJRFRIXzhfTUhaOgotCQl2YWxbNl0gPSA4OwotCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6CisJCQlpZiAoc3RhdGUtPmRzdF9od19jYXAgJiBEU1RfVFlQRV9IQVNfQ0EpCisJCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDA4OworCQkJZWxzZSB7CisJCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAweDA4OworCQkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsKKwkJCX0KKwkJCWJyZWFrOwogCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHN0X3NldF9pbnZlcnNpb24oc3RydWN0IGRzdF9zdGF0ZSogc3RhdGUsIGZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbikKIHsKLQl1OCAqdmFsOwotCiAJc3RhdGUtPmludmVyc2lvbiA9IGludmVyc2lvbjsKLQotCXZhbCA9ICZzdGF0ZS0+dHhfdHVuYVswXTsKLQotCXZhbFs4XSAmPSB+MHg4MDsKLQogCXN3aXRjaCAoaW52ZXJzaW9uKSB7Ci0JY2FzZSBJTlZFUlNJT05fT0ZGOgotCQlicmVhazsKLQljYXNlIElOVkVSU0lPTl9PTjoKLQkJdmFsWzhdIHw9IDB4ODA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQljYXNlIElOVkVSU0lPTl9PRkY6CS8vIEludmVyc2lvbiA9IE5vcm1hbAorCQkJc3RhdGUtPnR4X3R1bmFbOF0gJj0gfjB4ODA7CisJCQlicmVhazsKKworCQljYXNlIElOVkVSU0lPTl9PTjoKKwkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4ODA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQ3OCw2ICs0ODgsNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorCitzdGF0aWMgaW50IGRzdF9zZXRfbW9kdWxhdGlvbihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb24pCit7CisJaWYgKHN0YXRlLT5kc3RfdHlwZSAhPSBEU1RfVFlQRV9JU19DQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlzdGF0ZS0+bW9kdWxhdGlvbiA9IG1vZHVsYXRpb247CisJc3dpdGNoIChtb2R1bGF0aW9uKSB7CisJCWNhc2UgUUFNXzE2OgorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDEwOworCQkJYnJlYWs7CisKKwkJY2FzZSBRQU1fMzI6CisJCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MjA7CisJCQlicmVhazsKKworCQljYXNlIFFBTV82NDoKKwkJCXN0YXRlLT50eF90dW5hWzhdID0gMHg0MDsKKwkJCWJyZWFrOworCisJCWNhc2UgUUFNXzEyODoKKwkJCXN0YXRlLT50eF90dW5hWzhdID0gMHg4MDsKKwkJCWJyZWFrOworCisJCWNhc2UgUUFNXzI1NjoKKwkJCXN0YXRlLT50eF90dW5hWzhdID0gMHgwMDsKKwkJCWJyZWFrOworCisJCWNhc2UgUVBTSzoKKwkJY2FzZSBRQU1fQVVUTzoKKwkJY2FzZSBWU0JfODoKKwkJY2FzZSBWU0JfMTY6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgZmVfbW9kdWxhdGlvbl90IGRzdF9nZXRfbW9kdWxhdGlvbihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1vZHVsYXRpb247Cit9CisKKwogdTggZHN0X2NoZWNrX3N1bSh1OCAqIGJ1ZiwgdTMyIGxlbikKIHsKIAl1MzIgaTsKQEAgLTU3Nyw3ICs2MzMsNyBAQAogCQkuZGV2aWNlX2lkID0gIjIwMDEwM0EiLAogCQkub2Zmc2V0ID0gMCwKIAkJLmRzdF90eXBlID0gIERTVF9UWVBFX0lTX1NBVCwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfU1lNRElWIHwgRFNUX1RZUEVfSEFTX0ZXXzEsCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xIHwgRFNUX1RZUEVfSEFTX09CU19SRUdTLAogCQkuZHN0X2ZlYXR1cmUgPSAwCiAJfSwJLyoJb2Jzb2xldGUJKi8KIApAQCAtNjI2LDcgKzY4Miw3IEBACiAJCS5kZXZpY2VfaWQgPSAiRFNUTUNJIiwKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1NBVCwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxELAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfRldfQlVJTEQgfCBEU1RfVFlQRV9IQVNfSU5DX0NPVU5ULAogCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfQ0EgfCBEU1RfVFlQRV9IQVNfRElTRVFDMyB8IERTVF9UWVBFX0hBU19ESVNFUUM0CiAJCQkJCQkJfCBEU1RfVFlQRV9IQVNfTU9UTyB8IERTVF9UWVBFX0hBU19NQUMKIAl9LApAQCAtODcyLDcgKzkyOCw3IEBACiB7CiAJaW50IHJldHZhbDsKIAl1OCBnZXRfc2lnbmFsW10gPSB7IDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmIgfTsKLQorCWRwcmludGsoIiVzOiBHZXR0aW5nIFNpZ25hbCBzdHJlbmd0aCBhbmQgb3RoZXIgcGFyYW1ldGVyc1xuIiwgX19GVU5DVElPTl9fKTsKIAlpZiAoKHN0YXRlLT5kaXNlcV9mbGFncyAmIEFUVEVNUFRfVFVORSkgPT0gMCkgewogCQlzdGF0ZS0+ZGVjb2RlX2xvY2sgPSBzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoID0gc3RhdGUtPmRlY29kZV9zbnIgPSAwOwogCQlyZXR1cm4gMDsKQEAgLTk1NCwxNSArMTAxMCw4IEBACiAJc3RhdGUtPmRlY29kZV9mcmVxID0gKChzdGF0ZS0+cnhfdHVuYVsyXSAmIDB4N2YpIDw8IDgpICsgc3RhdGUtPnJ4X3R1bmFbM107CiAKIAlzdGF0ZS0+ZGVjb2RlX2xvY2sgPSAxOwotCS8qCi0JICAgZHN0LT5kZWNvZGVfbjEgPSAoZHN0LT5yeF90dW5hWzRdIDw8IDgpICsKLQkgICAoZHN0LT5yeF90dW5hWzVdKTsKLQotCSAgIGRzdC0+ZGVjb2RlX24yID0gKGRzdC0+cnhfdHVuYVs4XSA8PCA4KSArCi0JICAgKGRzdC0+cnhfdHVuYVs3XSk7Ci0JICovCiAJc3RhdGUtPmRpc2VxX2ZsYWdzIHw9IEhBU19MT0NLOwotCS8qIGRzdC0+Y3VyX2ppZmYgPSBqaWZmaWVzOyAqLworCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTEwOTgsNyArMTE0NywxMSBAQAogCiAJc3dpdGNoICh0b25lKSB7CiAJCWNhc2UgU0VDX1RPTkVfT0ZGOgotCQkJc3RhdGUtPnR4X3R1bmFbMl0gPSAweGZmOworCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQorCQkJICAgIHN0YXRlLT50eF90dW5hWzJdID0gMHgwMDsKKwkJCWVsc2UKKwkJCSAgICBzdGF0ZS0+dHhfdHVuYVsyXSA9IDB4ZmY7CisKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0VDX1RPTkVfT046CkBAIC0xMTQ1LDcgKzExOTgsOCBAQAogCXN0YXRpYyB1OCBpbmlfdHZjaV90dW5hW10gPSB7IDksIDAsIDMsIDB4YjYsIDEsIDcsIDB4MCwgMHgwLCAwLCAwIH07CiAJc3RhdGljIHU4IGluaV9jYWJmdGFfdHVuYVtdID0geyAwLCAwLCAzLCAweGI2LCAxLCA3LCAweDAsIDB4MCwgMCwgMCB9OwogCXN0YXRpYyB1OCBpbmlfY2FiY2lfdHVuYVtdID0geyA5LCAwLCAzLCAweGI2LCAxLCA3LCAweDAsIDB4MCwgMCwgMCB9OwotCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT047CisvLwlzdGF0ZS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX09OOworCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwogCXN0YXRlLT52b2x0YWdlID0gU0VDX1ZPTFRBR0VfMTM7CiAJc3RhdGUtPnRvbmUgPSBTRUNfVE9ORV9PRkY7CiAJc3RhdGUtPnN5bWJvbF9yYXRlID0gMjk0NzMwMDA7CkBAIC0xMTc0LDcgKzEyMjgsNyBAQAogCiAJKnN0YXR1cyA9IDA7CiAJaWYgKHN0YXRlLT5kaXNlcV9mbGFncyAmIEhBU19MT0NLKSB7Ci0JCWRzdF9nZXRfc2lnbmFsKHN0YXRlKTsKKy8vCQlkc3RfZ2V0X3NpZ25hbChzdGF0ZSk7CS8vIGRvbid0IHJlcXVpcmUoPykgdG8gYXNrIE1DVQogCQlpZiAoc3RhdGUtPmRlY29kZV9sb2NrKQogCQkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSyB8IEZFX0hBU19TSUdOQUwgfCBGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX1ZJVEVSQkk7CiAJfQpAQCAtMTIwOCwyMCArMTI2MiwyNSBAQAogCiAJZHN0X3NldF9mcmVxKHN0YXRlLCBwLT5mcmVxdWVuY3kpOwogCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiU2V0IEZyZXF1ZW5jeSA9IFslZF1cbiIsIHAtPmZyZXF1ZW5jeSk7CisJCWRwcmludGsoIlNldCBGcmVxdWVuY3k9WyVkXVxuIiwgcC0+ZnJlcXVlbmN5KTsKIAotCWRzdF9zZXRfaW52ZXJzaW9uKHN0YXRlLCBwLT5pbnZlcnNpb24pOworLy8JZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7CiAJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKKwkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX09CU19SRUdTKQorCQkJZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7CisKIAkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOwogCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CisJCWRzdF9zZXRfcG9sYXJpemF0aW9uKHN0YXRlKTsKIAkJaWYgKHZlcmJvc2UgPiA0KQotCQkJZHByaW50aygiU2V0IFN5bWJvbHJhdGUgPSBbJWRdXG4iLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCQkJZHByaW50aygiU2V0IFN5bWJvbHJhdGU9WyVkXVxuIiwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKIAogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKIAkJZHN0X3NldF9iYW5kd2lkdGgoc3RhdGUsIHAtPnUub2ZkbS5iYW5kd2lkdGgpOwogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CiAJCWRzdF9zZXRfZmVjKHN0YXRlLCBwLT51LnFhbS5mZWNfaW5uZXIpOwogCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucWFtLnN5bWJvbF9yYXRlKTsKKwkJZHN0X3NldF9tb2R1bGF0aW9uKHN0YXRlLCBwLT51LnFhbS5tb2R1bGF0aW9uKTsKIAl9CiAJZHN0X3dyaXRlX3R1bmEoZmUpOwogCkBAIC0xMjMzLDggKzEyOTIsMTEgQEAKIAlzdHJ1Y3QgZHN0X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCiAJcC0+ZnJlcXVlbmN5ID0gc3RhdGUtPmRlY29kZV9mcmVxOwotCXAtPmludmVyc2lvbiA9IHN0YXRlLT5pbnZlcnNpb247CisvLwlwLT5pbnZlcnNpb24gPSBzdGF0ZS0+aW52ZXJzaW9uOwogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19PQlNfUkVHUykKKwkJCXAtPmludmVyc2lvbiA9IHN0YXRlLT5pbnZlcnNpb247CisKIAkJcC0+dS5xcHNrLnN5bWJvbF9yYXRlID0gc3RhdGUtPnN5bWJvbF9yYXRlOwogCQlwLT51LnFwc2suZmVjX2lubmVyID0gZHN0X2dldF9mZWMoc3RhdGUpOwogCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpIHsKQEAgLTEyNDIsNyArMTMwNCw4IEBACiAJfSBlbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpIHsKIAkJcC0+dS5xYW0uc3ltYm9sX3JhdGUgPSBzdGF0ZS0+c3ltYm9sX3JhdGU7CiAJCXAtPnUucWFtLmZlY19pbm5lciA9IGRzdF9nZXRfZmVjKHN0YXRlKTsKLQkJcC0+dS5xYW0ubW9kdWxhdGlvbiA9IFFBTV9BVVRPOworLy8JCXAtPnUucWFtLm1vZHVsYXRpb24gPSBRQU1fQVVUTzsKKwkJcC0+dS5xYW0ubW9kdWxhdGlvbiA9IGRzdF9nZXRfbW9kdWxhdGlvbihzdGF0ZSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY2EuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCmluZGV4IGQ3ODE1MDQuLmJmYWFjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAiZHN0X2NhLmgiCiAjaW5jbHVkZSAiZHN0X2NvbW1vbi5oIgogCi1zdGF0aWMgdW5zaWduZWQgaW50IHZlcmJvc2UgPSAxOworc3RhdGljIHVuc2lnbmVkIGludCB2ZXJib3NlID0gNTsKIG1vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh2ZXJib3NlLCAidmVyYm9zZSBzdGFydHVwIG1lc3NhZ2VzLCBkZWZhdWx0IGlzIDEgKHllcykiKTsKIApAQCAtMjk1LDM0ICsyOTUsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfZW41MDIyMV90YWcoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyKQorc3RhdGljIGludCBoYW5kbGVfZHN0X3RhZyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHUzMiBsZW5ndGgpCiB7CiAJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX1NFU1NJT04pIHsKIAkJaHdfYnVmZmVyLT5tc2dbMl0gPSBwX2NhX21lc3NhZ2UtPm1zZ1sxXTsJCS8qCQlNU0IJCQkqLwogCQlod19idWZmZXItPm1zZ1szXSA9IHBfY2FfbWVzc2FnZS0+bXNnWzJdOwkJLyoJCUxTQgkJCSovCiAJfQogCWVsc2UgeworCQlod19idWZmZXItPm1zZ1swXSA9IChsZW5ndGggJiAweGZmKSArIDc7CisJCWh3X2J1ZmZlci0+bXNnWzFdID0gMHg0MDsKIAkJaHdfYnVmZmVyLT5tc2dbMl0gPSAweDAzOwogCQlod19idWZmZXItPm1zZ1szXSA9IDB4MDA7CisJCWh3X2J1ZmZlci0+bXNnWzRdID0gMHgwMzsKKwkJaHdfYnVmZmVyLT5tc2dbNV0gPSBsZW5ndGggJiAweGZmOworCQlod19idWZmZXItPm1zZ1s2XSA9IDB4MDA7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlYnVnXzg4MjBfYnVmZmVyKHN0cnVjdCBjYV9tc2cgKmh3X2J1ZmZlcikKKworc3RhdGljIGludCB3cml0ZV90b184ODIwKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IGxlbmd0aCwgdTggcmVwbHkpCiB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlkcHJpbnRrKCIlczpEZWJ1Zz1bIiwgX19GVU5DVElPTl9fKTsKLQlmb3IgKGkgPSAwOyBpIDwgKGh3X2J1ZmZlci0+bXNnWzBdICsgMSk7IGkrKykKLQkJZHByaW50aygiICUwMngiLCBod19idWZmZXItPm1zZ1tpXSk7Ci0JZHByaW50aygiXVxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3cml0ZV90b184ODIwKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IHJlcGx5KQotewotCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgaHdfYnVmZmVyLT5tc2csIChod19idWZmZXItPmxlbmd0aCArIDEpLCBod19idWZmZXItPm1zZywgcmVwbHkpKSA8IDApIHsKKwlpZiAoKGRzdF9wdXRfY2koc3RhdGUsIGh3X2J1ZmZlci0+bXNnLCBsZW5ndGgsIGh3X2J1ZmZlci0+bXNnLCByZXBseSkpIDwgMCkgewogCQlkcHJpbnRrKCIlczogRFNULUNJIENvbW1hbmQgZmFpbGVkLlxuIiwgX19GVU5DVElPTl9fKTsKIAkJZHByaW50aygiJXM6IFJlc2V0dGluZyBEU1QuXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZGNfcmVzZXRfc3RhdGUoc3RhdGUpOwpAQCAtMzM0LDIzNCArMzI4LDE0MSBAQAogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgY2Ffc2V0X3BtdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IHJlcGx5LCB1OCBxdWVyeSkKK3UzMiBhc25fMV9kZWNvZGUodTggKmFzbl8xX2FycmF5KQogewotCXUzMiBod19vZmZzZXQsIGJ1Zl9vZmZzZXQsIGksIGs7Ci0JdTMyIHByb2dyYW1faW5mb19sZW5ndGggPSAwLCBlc19pbmZvX2xlbmd0aCA9IDAsIGxlbmd0aCA9IDAsIHdvcmRzID0gMDsKLQl1OCBmb3VuZF9wcm9nX2NhX2Rlc2MgPSAwLCBmb3VuZF9zdHJlYW1fY2FfZGVzYyA9IDAsIGVycm9yX2NvbmRpdGlvbiA9IDAsIGh3X2J1ZmZlcl9sZW5ndGggPSAwOworCXU4IGxlbmd0aF9maWVsZCA9IDAsIHdvcmRfY291bnQgPSAwLCBjb3VudCA9IDA7CisJdTMyIGxlbmd0aCA9IDA7CiAKLQlpZiAodmVyYm9zZSA+IDMpCi0JCWRwcmludGsoIiVzLCBwX2NhX21lc3NhZ2UgbGVuZ3RoICVkICgweCV4KVxuIiwgX19GVU5DVElPTl9fLHBfY2FfbWVzc2FnZS0+bGVuZ3RoLHBfY2FfbWVzc2FnZS0+bGVuZ3RoICk7Ci0KLQloYW5kbGVfZW41MDIyMV90YWcoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyKTsJCQkvKglFTjUwMjIxIHRhZwkJKi8KLQotCS8qCUhhbmRsZSB0aGUgbGVuZ3RoIGZpZWxkICh2YXJpYWJsZSkJKi8KLQlpZiAoIShwX2NhX21lc3NhZ2UtPm1zZ1szXSAmIDB4ODApKSB7CQkJCS8qCUxlbmd0aCA9IDEJCSovCi0JCWxlbmd0aCA9IHBfY2FfbWVzc2FnZS0+bXNnWzNdICYgMHg3ZjsKLQkJd29yZHMgPSAwOwkJCQkJCS8qCWRvbWkncyBzdWdnZXN0aW9uCSovCi0JfQotCWVsc2UgewkJCQkJCQkJLyoJTGVuZ3RoID0gd29yZHMJCSovCi0JCXdvcmRzID0gcF9jYV9tZXNzYWdlLT5tc2dbM10gJiAweDdmOwotCQlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkrKykgewotCQkJbGVuZ3RoID0gbGVuZ3RoIDw8IDg7Ci0JCQlsZW5ndGggPSBsZW5ndGggfCBwX2NhX21lc3NhZ2UtPm1zZ1s0ICsgaV07CisJbGVuZ3RoX2ZpZWxkID0gYXNuXzFfYXJyYXlbMF07CisJZHByaW50aygiJXM6IExlbmd0aCBmaWVsZD1bJTAyeF1cbiIsIF9fRlVOQ1RJT05fXywgbGVuZ3RoX2ZpZWxkKTsKKwlpZiAobGVuZ3RoX2ZpZWxkIDwgMHg4MCkgeworCQlsZW5ndGggPSBsZW5ndGhfZmllbGQgJiAweDdmOworCQlkcHJpbnRrKCIlczogTGVuZ3RoPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgpOworCX0gZWxzZSB7CisJCXdvcmRfY291bnQgPSBsZW5ndGhfZmllbGQgJiAweDdmOworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB3b3JkX2NvdW50OyBjb3VudCsrKSB7CisJCQlsZW5ndGggPSAobGVuZ3RoIHwgYXNuXzFfYXJyYXlbY291bnQgKyAxXSkgPDwgODsKKwkJCWRwcmludGsoIiVzOiBMZW5ndGg9WyUwNHhdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CiAJCX0KIAl9Ci0JaWYgKHZlcmJvc2UgPiA0KSB7Ci0JCWRwcmludGsoIiVzOkxlbmd0aD1bJWQgKDB4JXgpXSwgV29yZHM9WyVkXVxuIiwgX19GVU5DVElPTl9fLCBsZW5ndGgsbGVuZ3RoLCB3b3Jkcyk7CisJcmV0dXJuIGxlbmd0aDsKK30KIAotCQkvKglEZWJ1ZyBJbnB1dCBzdHJpbmcJCSovCi0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCWRwcmludGsoIiAlMDJ4IiwgcF9jYV9tZXNzYWdlLT5tc2dbaV0pOwotCQlkcHJpbnRrKCJdXG4iKTsKLQl9Ci0KLQlod19vZmZzZXQgPSA3OwotCWJ1Zl9vZmZzZXQgPSB3b3JkcyArIDQ7Ci0KLQkvKgkJUHJvZ3JhbSBIZWFkZXIJCQkqLwotCWlmICh2ZXJib3NlID4gNCkKLQkJZHByaW50aygiXG4lczpQcm9ncmFtIEhlYWRlcj1bIiwgX19GVU5DVElPTl9fKTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKLQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJZHByaW50aygiICUwMngiLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XSk7Ci0JCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKzsKLQl9Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCJdXG4iKTsKLQotCXByb2dyYW1faW5mb19sZW5ndGggPSAwOwotCXByb2dyYW1faW5mb19sZW5ndGggPSAoKChwcm9ncmFtX2luZm9fbGVuZ3RoIHwgcF9jYV9tZXNzYWdlLT5tc2dbd29yZHMgKyA4XSkgJiAweDBmKSA8PCA4KSB8IHBfY2FfbWVzc2FnZS0+bXNnW3dvcmRzICsgOV07Ci0JaWYgKHZlcmJvc2UgPiA0KQotCQlkcHJpbnRrKCIlczpQcm9ncmFtIGluZm8gTGVuZ3RoPVslZF1bJTAyeF0sIGh3X29mZnNldD1bJWRdLCBidWZfb2Zmc2V0PVslZF0gXG4iLAotCQkJX19GVU5DVElPTl9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoLCBwcm9ncmFtX2luZm9fbGVuZ3RoLCBod19vZmZzZXQsIGJ1Zl9vZmZzZXQpOwotCi0JaWYgKHByb2dyYW1faW5mb19sZW5ndGggJiYgKHByb2dyYW1faW5mb19sZW5ndGggPCAyNTYpKSB7CS8qCUlmIHByb2dyYW1faW5mb19sZW5ndGgJCSovCi0JCWh3X2J1ZmZlci0+bXNnWzExXSA9IGh3X2J1ZmZlci0+bXNnWzExXSAmIDB4MGY7CQkvKglyZXEgb25seSA0IGJpdHMJCQkqLwotCQlod19idWZmZXItPm1zZ1sxMl0gPSBod19idWZmZXItPm1zZ1sxMl0gKyAxOwkJLyoJaW5jcmVtZW50ISBBU0lDIGJ1ZyEJCSovCi0KLQkJaWYgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAxXSA9PSAweDA5KSB7CS8qCUNoZWNrIENBIGRlc2NyaXB0b3IJCSovCi0JCQlmb3VuZF9wcm9nX2NhX2Rlc2MgPSAxOwotCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCWRwcmludGsoIiVzOiBGb3VuZCBDQSBkZXNjcmlwdG9yIEAgUHJvZ3JhbSBsZXZlbFxuIiwgX19GVU5DVElPTl9fKTsKLQkJfQotCi0JCWlmIChmb3VuZF9wcm9nX2NhX2Rlc2MpIHsJCQkJLyoJQ29tbWFuZCBvbmx5IGlmIENBIGRlc2NyaXB0b3IJKi8KLQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOwkvKglDQSBQTVQgY29tbWFuZCBJRAkqLwotCQkJaHdfb2Zmc2V0KyssIGJ1Zl9vZmZzZXQrKywgaHdfYnVmZmVyX2xlbmd0aCsrOwotCQl9Ci0KLQkJLyoJCQlQcm9ncmFtIGRlc2NyaXB0b3JzCQkJCSovCi0JCWlmICh2ZXJib3NlID4gNCkgewotCQkJZHByaW50aygiJXM6KioqKioqKioqKj5idWZfb2Zmc2V0PVslZF0sIGh3X29mZnNldD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zl9vZmZzZXQsIGh3X29mZnNldCk7Ci0JCQlkcHJpbnRrKCIlczpQcm9ncmFtIGRlc2NyaXB0b3JzPVsiLCBfX0ZVTkNUSU9OX18pOwotCQl9Ci0JCXdoaWxlIChwcm9ncmFtX2luZm9fbGVuZ3RoICYmICFlcnJvcl9jb25kaXRpb24pIHsJCS8qCUNvcHkgcHJvZyBkZXNjcmlwdG9ycwkqLwotCQkJaWYgKHByb2dyYW1faW5mb19sZW5ndGggPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgewkvKglFcnJvciBzaXR1YXRpb24JCSovCi0JCQkJZHByaW50ayAoIiVzOlwiV0FSTklOR1wiIExlbmd0aCBlcnJvciwgbGluZT1bJWRdLCBwcm9nX2luZm9fbGVuZ3RoPVslZF1cbiIsCi0JCQkJCQkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIHByb2dyYW1faW5mb19sZW5ndGgpOwotCQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIEJhaWxpbmcgb3V0IG9mIHBvc3NpYmxlIGxvb3BcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQkJZXJyb3JfY29uZGl0aW9uID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0XSA9IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOwotCQkJZHByaW50aygiICUwMngiLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XSk7Ci0JCQlod19vZmZzZXQrKywgYnVmX29mZnNldCsrLCBod19idWZmZXJfbGVuZ3RoKyssIHByb2dyYW1faW5mb19sZW5ndGgtLTsKLQkJfQotCQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJCWRwcmludGsoIl1cbiIpOwotCQkJZHByaW50aygiJXM6KioqKioqKioqKj5idWZfb2Zmc2V0PVslZF0sIGh3X29mZnNldD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGJ1Zl9vZmZzZXQsIGh3X29mZnNldCk7Ci0JCX0KLQkJaWYgKGZvdW5kX3Byb2dfY2FfZGVzYykgewotCQkJaWYgKCFyZXBseSkgewotCQkJCWh3X2J1ZmZlci0+bXNnWzEzXSA9IDB4MDE7CQkvKglPSyBkZXNjcmFtYmxpbmcJCQkqLwotCQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQkJZHByaW50aygiQ0EgUE1UIENvbW1hbmQgPSBPSyBEZXNjcmFtYmxpbmdcbiIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaHdfYnVmZmVyLT5tc2dbMTNdID0gMHgwMjsJCS8qCU9rIE1NSQkJCQkqLwotCQkJCWlmICh2ZXJib3NlID4gMSkKLQkJCQkJZHByaW50aygiQ0EgUE1UIENvbW1hbmQgPSBPayBNTUlcbiIpOwotCQkJfQotCQkJaWYgKHF1ZXJ5KSB7Ci0JCQkJaHdfYnVmZmVyLT5tc2dbMTNdID0gMHgwMzsJCS8qCVF1ZXJ5CQkJCSovCi0JCQkJaWYgKHZlcmJvc2UgPiAxKQotCQkJCQlkcHJpbnRrKCJDQSBQTVQgQ29tbWFuZCA9IENBIFBNVCBxdWVyeVxuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWh3X2J1ZmZlci0+bXNnWzExXSA9IGh3X2J1ZmZlci0+bXNnWzExXSAmIDB4ZjA7CQkvKglEb24ndCB3cml0ZSB0byBBU0lDCQkqLwotCQlod19idWZmZXItPm1zZ1sxMl0gPSBod19idWZmZXItPm1zZ1sxMl0gPSAweDAwOwotCX0KLQlpZiAodmVyYm9zZSA+IDQpCi0JCWRwcmludGsoIiVzOioqKioqKioqKio+cF9jYV9tZXNzYWdlLT5sZW5ndGg9WyVkXSwgYnVmX29mZnNldD1bJWRdLCBod19vZmZzZXQ9WyVkXVxuIiwKLQkJCQkJX19GVU5DVElPTl9fLCBwX2NhX21lc3NhZ2UtPmxlbmd0aCwgYnVmX29mZnNldCwgaHdfb2Zmc2V0KTsKLQotCXdoaWxlICgoYnVmX29mZnNldCAgPCBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgICYmICFlcnJvcl9jb25kaXRpb24pIHsKLQkJLyoJQmFpbCBvdXQgaW4gY2FzZSBvZiBhbiBpbmRlZmluaXRlIGxvb3AJCSovCi0JCWlmICgoZXNfaW5mb19sZW5ndGggPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkgfHwgKGJ1Zl9vZmZzZXQgPiBwX2NhX21lc3NhZ2UtPmxlbmd0aCkpIHsKLQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIExlbmd0aCBlcnJvciwgbGluZT1bJWRdLCBwcm9nX2luZm9fbGVuZ3RoPVslZF0sIGJ1Zl9vZmZzZXQ9WyVkXVxuIiwKLQkJCQkJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoLCBidWZfb2Zmc2V0KTsKLQotCQkJZHByaW50aygiJXM6XCJXQVJOSU5HXCIgQmFpbGluZyBvdXQgb2YgcG9zc2libGUgbG9vcFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWVycm9yX2NvbmRpdGlvbiA9IDE7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qCQlTdHJlYW0gSGVhZGVyCQkJCSovCi0KLQkJZm9yIChrID0gMDsgayA8IDU7IGsrKykgewotCQkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0ICsga10gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsga107Ci0JCX0KLQotCQllc19pbmZvX2xlbmd0aCA9IDA7Ci0JCWVzX2luZm9fbGVuZ3RoID0gKGVzX2luZm9fbGVuZ3RoIHwgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAzXSAmIDB4MGYpKSA8PCA4IHwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDRdOwotCi0JCWlmICh2ZXJib3NlID4gNCkgewotCQkJZHByaW50aygiXG4lczotLS0tLT5TdHJlYW0gaGVhZGVyPVslMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQkJcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDBdLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgMV0sCi0JCQkJcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDJdLCBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0ICsgM10sCi0JCQkJcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDRdKTsKLQotCQkJZHByaW50aygiJXM6LS0tLS0+U3RyZWFtIHR5cGU9WyUwMnhdLCBlcyBsZW5ndGg9WyVkICgweCV4KV0sIENoYXJzPVslMDJ4XSBbJTAyeF0sIGJ1Zl9vZmZzZXQ9WyVkXVxuIiwgX19GVU5DVElPTl9fLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAwXSwgZXNfaW5mb19sZW5ndGgsIGVzX2luZm9fbGVuZ3RoLAotCQkJCXBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAzXSwgcF9jYV9tZXNzYWdlLT5tc2dbYnVmX29mZnNldCArIDRdLCBidWZfb2Zmc2V0KTsKLQkJfQotCi0JCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldCArIDNdICY9IDB4MGY7CQkJLyoJcmVxIG9ubHkgNCBiaXRzCQkJKi8KLQotCQlpZiAoZm91bmRfcHJvZ19jYV9kZXNjKSB7Ci0JCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgKyAzXSA9IDB4MDA7Ci0JCQlod19idWZmZXItPm1zZ1tod19vZmZzZXQgKyA0XSA9IDB4MDA7Ci0JCX0KLQotCQlod19vZmZzZXQgKz0gNSwgYnVmX29mZnNldCArPSA1LCBod19idWZmZXJfbGVuZ3RoICs9IDU7Ci0KLQkJLyoJCUNoZWNrIGZvciBDQSBkZXNjcmlwdG9yCQkJKi8KLQkJaWYgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgKyAxXSA9PSAweDA5KSB7Ci0JCQlpZiAodmVyYm9zZSA+IDQpCi0JCQkJZHByaW50aygiJXM6Rm91bmQgQ0EgZGVzY3JpcHRvciBAIFN0cmVhbSBsZXZlbFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWZvdW5kX3N0cmVhbV9jYV9kZXNjID0gMTsKLQkJfQotCi0JCS8qCQlFUyBkZXNjcmlwdG9ycwkJCQkqLwotCi0JCWlmIChlc19pbmZvX2xlbmd0aCAmJiAhZXJyb3JfY29uZGl0aW9uICYmICFmb3VuZF9wcm9nX2NhX2Rlc2MgJiYgZm91bmRfc3RyZWFtX2NhX2Rlc2MpIHsKLS8vCQkJaWYgKCFjYV9wbXRfZG9uZSkgewotCQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsJLyoJQ0EgUE1UIGNtZChlcykJKi8KLQkJCQlpZiAodmVyYm9zZSA+IDQpCi0JCQkJCXByaW50aygiJXM6LS0tLS0+Q0EgUE1UIENvbW1hbmQgSUQ9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdKTsKLS8vCQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKywgZXNfaW5mb19sZW5ndGgtLSwgY2FfcG10X2RvbmUgPSAxOwotCQkJCWh3X29mZnNldCsrLCBidWZfb2Zmc2V0KyssIGh3X2J1ZmZlcl9sZW5ndGgrKywgZXNfaW5mb19sZW5ndGgtLTsKLS8vCQkJfQotCQkJaWYgKHZlcmJvc2UgPiA0KQotCQkJCWRwcmludGsoIiVzOi0tLS0tPkVTIGRlc2NyaXB0b3JzPVsiLCBfX0ZVTkNUSU9OX18pOwotCi0JCQl3aGlsZSAoZXNfaW5mb19sZW5ndGggJiYgIWVycm9yX2NvbmRpdGlvbikgewkvKglFUyBkZXNjcmlwdG9ycwkJCSovCi0JCQkJaWYgKChlc19pbmZvX2xlbmd0aCA+IHBfY2FfbWVzc2FnZS0+bGVuZ3RoKSB8fCAoYnVmX29mZnNldCA+IHBfY2FfbWVzc2FnZS0+bGVuZ3RoKSkgewotCQkJCQlpZiAodmVyYm9zZSA+IDQpIHsKLQkJCQkJCWRwcmludGsoIiVzOlwiV0FSTklOR1wiIEVTIExlbmd0aCBlcnJvciwgbGluZT1bJWRdLCBlc19pbmZvX2xlbmd0aD1bJWRdLCBidWZfb2Zmc2V0PVslZF1cbiIsCi0JCQkJCQkJCQkJX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXNfaW5mb19sZW5ndGgsIGJ1Zl9vZmZzZXQpOwotCi0JCQkJCQlkcHJpbnRrKCIlczpcIldBUk5JTkdcIiBCYWlsaW5nIG91dCBvZiBwb3NzaWJsZSBsb29wXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJCQl9Ci0JCQkJCWVycm9yX2NvbmRpdGlvbiA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWh3X2J1ZmZlci0+bXNnW2h3X29mZnNldF0gPSBwX2NhX21lc3NhZ2UtPm1zZ1tidWZfb2Zmc2V0XTsKLQkJCQlpZiAodmVyYm9zZSA+IDMpCi0JCQkJCWRwcmludGsoIiUwMnggIiwgaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0XSk7Ci0JCQkJaHdfb2Zmc2V0KyssIGJ1Zl9vZmZzZXQrKywgaHdfYnVmZmVyX2xlbmd0aCsrLCBlc19pbmZvX2xlbmd0aC0tOwotCQkJfQotCQkJZm91bmRfc3RyZWFtX2NhX2Rlc2MgPSAwOwkJCS8qCXVuc2V0IGZvciBuZXcgc3RyZWFtcwkJKi8KLQkJCWRwcmludGsoIl1cbiIpOwotCQl9Ci0JfQotCi0JLyoJCU1DVSBNYWdpYyB3b3JkcwkJCQkJKi8KLQotCWh3X2J1ZmZlcl9sZW5ndGggKz0gNzsKLQlod19idWZmZXItPm1zZ1swXSA9IGh3X2J1ZmZlcl9sZW5ndGg7Ci0JaHdfYnVmZmVyLT5tc2dbMV0gPSA2NDsKLQlod19idWZmZXItPm1zZ1s0XSA9IDM7Ci0JaHdfYnVmZmVyLT5tc2dbNV0gPSBod19idWZmZXItPm1zZ1swXSAtIDc7Ci0JaHdfYnVmZmVyLT5tc2dbNl0gPSAwOwotCi0KLQkvKiAgICAgIEZpeCBsZW5ndGggICAgICAqLwotCWh3X2J1ZmZlci0+bGVuZ3RoID0gaHdfYnVmZmVyLT5tc2dbMF07Ci0KLQlwdXRfY2hlY2tzdW0oJmh3X2J1ZmZlci0+bXNnWzBdLCBod19idWZmZXItPm1zZ1swXSk7Ci0JLyogICAgICBEbyB0aGUgYWN0dWFsIHdyaXRlICAgICAqLwotCWlmICh2ZXJib3NlID4gNCkgewotCQlkcHJpbnRrKCIlczo9PT09PT09PT09PT09PT09PT09PT09REVCVUdHSU5HPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWRwcmludGsoIiVzOiBBY3R1YWwgTGVuZ3RoPVslZF1cbiIsIF9fRlVOQ1RJT05fXywgaHdfYnVmZmVyX2xlbmd0aCk7Ci0JfQotCS8qICAgICAgT25seSBmb3IgZGVidWdnaW5nISAgICAgKi8KLQlpZiAodmVyYm9zZSA+IDIpCi0JCWRlYnVnXzg4MjBfYnVmZmVyKGh3X2J1ZmZlcik7Ci0JaWYgKHZlcmJvc2UgPiAzKQotCQlkcHJpbnRrKCIlczogUmVwbHkgPSBbJWRdXG4iLCBfX0ZVTkNUSU9OX18sIHJlcGx5KTsKLQl3cml0ZV90b184ODIwKHN0YXRlLCBod19idWZmZXIsIHJlcGx5KTsKK3N0YXRpYyBpbnQgaW5pdF9idWZmZXIodTggKmJ1ZmZlciwgdTMyIGxlbmd0aCkKK3sKKwl1MzIgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCWJ1ZmZlcltpXSA9IDA7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkZWJ1Z19zdHJpbmcodTggKm1zZywgdTMyIGxlbmd0aCwgdTMyIG9mZnNldCkKK3sKKwl1MzIgaTsKKworCWRwcmludGsoIiBTdHJpbmc9WyAiKTsKKwlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykKKwkJZHByaW50aygiJTAyeCAiLCBtc2dbaV0pOworCWRwcmludGsoIl1cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weV9zdHJpbmcodTggKmRlc3RpbmF0aW9uLCB1OCAqc291cmNlLCB1MzIgZGVzdF9vZmZzZXQsIHUzMiBzb3VyY2Vfb2Zmc2V0LCB1MzIgbGVuZ3RoKQoreworCXUzMiBpOworCWRwcmludGsoIiVzOiBDb3B5aW5nIFsiLCBfX0ZVTkNUSU9OX18pOworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQlkZXN0aW5hdGlvbltpICsgZGVzdF9vZmZzZXRdID0gc291cmNlW2kgKyBzb3VyY2Vfb2Zmc2V0XTsKKwkJZHByaW50aygiICUwMngiLCBzb3VyY2VbaSArIHNvdXJjZV9vZmZzZXRdKTsKKwl9CisJZHByaW50aygiXVxuIik7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBtb2RpZnlfNF9iaXRzKHU4ICptZXNzYWdlLCB1MzIgcG9zKQoreworCW1lc3NhZ2VbcG9zXSAmPSAweDBmOworCisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGNhX3NldF9wbXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyLCB1OCByZXBseSwgdTggcXVlcnkpCit7CisJdTMyIGxlbmd0aCA9IDAsIGNvdW50ID0gMDsKKwl1OCBhc25fMV93b3JkcywgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoOworCXUxNiBwcm9ncmFtX2luZm9fbGVuZ3RoID0gMCwgZXNfaW5mb19sZW5ndGggPSAwOworCXUzMiBod19vZmZzZXQgPSAwLCBidWZfb2Zmc2V0ID0gMCwgaTsKKwl1OCBkc3RfdGFnX2xlbmd0aDsKKworCWxlbmd0aCA9IGFzbl8xX2RlY29kZSgmcF9jYV9tZXNzYWdlLT5tc2dbM10pOworCWRwcmludGsoIiVzOiBDQSBNZXNzYWdlIGxlbmd0aD1bJWRdXG4iLCBfX0ZVTkNUSU9OX18sIGxlbmd0aCk7CisJZHByaW50aygiJXM6IEFTTi4xICIsIF9fRlVOQ1RJT05fXyk7CisJZGVidWdfc3RyaW5nKCZwX2NhX21lc3NhZ2UtPm1zZ1s0XSwgbGVuZ3RoLCAwKTsgLy8gbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgdGFnIGFuZCBsZW5ndGgKKworCWluaXRfYnVmZmVyKGh3X2J1ZmZlci0+bXNnLCBsZW5ndGgpOworCWhhbmRsZV9kc3RfdGFnKHN0YXRlLCBwX2NhX21lc3NhZ2UsIGh3X2J1ZmZlciwgbGVuZ3RoKTsKKworCWh3X29mZnNldCA9IDc7CisJYXNuXzFfd29yZHMgPSAxOyAvLyBqdXN0IGEgaGFjayB0byB0ZXN0LCBzaG91bGQgY29tcHV0ZSB0aGlzIG9uZQorCWJ1Zl9vZmZzZXQgPSAzOworCXByb2dyYW1faGVhZGVyX2xlbmd0aCA9IDY7CisJZHN0X3RhZ19sZW5ndGggPSA3OworCisvLwlkZWJ1Z190d2luaGFuX2NhX3BhcmFtcyhzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIHJlcGx5LCBxdWVyeSwgbGVuZ3RoLCBod19vZmZzZXQsIGJ1Zl9vZmZzZXQpOworLy8JZHByaW50aygiJXM6IFByb2dyYW0gSGVhZGVyKEJVRikiLCBfX0ZVTkNUSU9OX18pOworLy8JZGVidWdfc3RyaW5nKCZwX2NhX21lc3NhZ2UtPm1zZ1s0XSwgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoLCAwKTsKKy8vCWRwcmludGsoIiVzOiBDb3B5aW5nIFByb2dyYW0gaGVhZGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCWNvcHlfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBwX2NhX21lc3NhZ2UtPm1zZywgaHdfb2Zmc2V0LCAoYnVmX29mZnNldCArIGFzbl8xX3dvcmRzKSwgcHJvZ3JhbV9oZWFkZXJfbGVuZ3RoKTsKKwlidWZfb2Zmc2V0ICs9IHByb2dyYW1faGVhZGVyX2xlbmd0aCwgaHdfb2Zmc2V0ICs9IHByb2dyYW1faGVhZGVyX2xlbmd0aDsKKwltb2RpZnlfNF9iaXRzKGh3X2J1ZmZlci0+bXNnLCAoaHdfb2Zmc2V0IC0gMikpOworCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19JTkNfQ09VTlQpIHsJLy8gd29ya2Fyb3VuZAorCQlkcHJpbnRrKCIlczogUHJvYmFibHkgYW4gQVNJQyBidWcgISEhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIChod19vZmZzZXQgKyBwcm9ncmFtX2hlYWRlcl9sZW5ndGgpLCAwKTsKKwkJaHdfYnVmZmVyLT5tc2dbaHdfb2Zmc2V0IC0gMV0gKz0gMTsKKwl9CisKKy8vCWRwcmludGsoIiVzOiBQcm9ncmFtIEhlYWRlcihIVyksIENvdW50PVslZF0iLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKy8vCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgaHdfb2Zmc2V0LCAwKTsKKworCXByb2dyYW1faW5mb19sZW5ndGggPSAgKChwcm9ncmFtX2luZm9fbGVuZ3RoIHwgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgLSAxXSAmIDB4MGYpKSA8PCA4KSB8IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOworCWRwcmludGsoIiVzOiBQcm9ncmFtIGluZm8gbGVuZ3RoPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCBwcm9ncmFtX2luZm9fbGVuZ3RoKTsKKwlpZiAocHJvZ3JhbV9pbmZvX2xlbmd0aCkgeworCQljb3VudCA9IGNvcHlfc3RyaW5nKGh3X2J1ZmZlci0+bXNnLCBwX2NhX21lc3NhZ2UtPm1zZywgaHdfb2Zmc2V0LCAoYnVmX29mZnNldCArIDEpLCAocHJvZ3JhbV9pbmZvX2xlbmd0aCArIDEpICk7IC8vIGNvcHkgbmV4dCBlbGVtLCBub3QgY3VycmVudAorCQlidWZfb2Zmc2V0ICs9IGNvdW50LCBod19vZmZzZXQgKz0gY291bnQ7CisvLwkJZHByaW50aygiJXM6IFByb2dyYW0gbGV2ZWwgIiwgX19GVU5DVElPTl9fKTsKKy8vCQlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIGh3X29mZnNldCwgMCk7CisJfQorCisJYnVmX29mZnNldCArPSAxOy8vIGh3X29mZnNldCArPSAxOworCWZvciAoaSA9IGJ1Zl9vZmZzZXQ7IGkgPCBsZW5ndGg7IGkrKykgeworLy8JCWRwcmludGsoIiVzOiBTdHJlYW0gSGVhZGVyICIsIF9fRlVOQ1RJT05fXyk7CisJCWNvdW50ID0gY29weV9zdHJpbmcoaHdfYnVmZmVyLT5tc2csIHBfY2FfbWVzc2FnZS0+bXNnLCBod19vZmZzZXQsIGJ1Zl9vZmZzZXQsIDUpOworCQltb2RpZnlfNF9iaXRzKGh3X2J1ZmZlci0+bXNnLCAoaHdfb2Zmc2V0ICsgMykpOworCisJCWh3X29mZnNldCArPSA1LCBidWZfb2Zmc2V0ICs9IDUsIGkgKz0gNDsKKy8vCQlkZWJ1Z19zdHJpbmcoaHdfYnVmZmVyLT5tc2csIGh3X29mZnNldCwgKGh3X29mZnNldCAtIDUpKTsKKwkJZXNfaW5mb19sZW5ndGggPSAoKGVzX2luZm9fbGVuZ3RoIHwgKHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXQgLSAxXSAmIDB4MGYpKSA8PCA4KSB8IHBfY2FfbWVzc2FnZS0+bXNnW2J1Zl9vZmZzZXRdOworCQlkcHJpbnRrKCIlczogRVMgaW5mbyBsZW5ndGg9WyUwMnhdXG4iLCBfX0ZVTkNUSU9OX18sIGVzX2luZm9fbGVuZ3RoKTsKKwkJaWYgKGVzX2luZm9fbGVuZ3RoKSB7CisJCQkvLyBjb3B5IGRlc2NyaXB0b3JzIEAgU1RSRUFNIGxldmVsCisJCQlkcHJpbnRrKCIlczogRGVzY3JpcHRvcnMgQCBTVFJFQU0gbGV2ZWwuLi4hISEgXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisKKwl9CisJaHdfYnVmZmVyLT5tc2dbbGVuZ3RoICsgZHN0X3RhZ19sZW5ndGhdID0gZHN0X2NoZWNrX3N1bShod19idWZmZXItPm1zZywgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoKSk7CisvLwlkcHJpbnRrKCIlczogVG90YWwgbGVuZ3RoPVslZF0sIENoZWNrc3VtPVslMDJ4XVxuIiwgX19GVU5DVElPTl9fLCAobGVuZ3RoICsgZHN0X3RhZ19sZW5ndGgpLCBod19idWZmZXItPm1zZ1tsZW5ndGggKyBkc3RfdGFnX2xlbmd0aF0pOworCWRlYnVnX3N0cmluZyhod19idWZmZXItPm1zZywgKGxlbmd0aCArIGRzdF90YWdfbGVuZ3RoICsgMSksIDApOwkvLyBkc3QgdGFncyBhbHNvCisJd3JpdGVfdG9fODgyMChzdGF0ZSwgaHdfYnVmZmVyLCAobGVuZ3RoICsgZHN0X3RhZ19sZW5ndGggKyAxKSwgcmVwbHkpOwkvLyBjaGVja3N1bQorCisJcmV0dXJuIDA7Cit9CisKKwogLyoJQm9hcmQgc3VwcG9ydHMgQ0EgUE1UIHJlcGx5ID8JCSovCiBzdGF0aWMgaW50IGRzdF9jaGVja19jYV9wbXQoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBjYV9tc2cgKnBfY2FfbWVzc2FnZSwgc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyKQogewpAQCAtNjA1LDcgKzUwNiw3IEBACiAJc3RydWN0IGNhX21zZyAqaHdfYnVmZmVyOwogCiAJaWYgKChod19idWZmZXIgPSAoc3RydWN0IGNhX21zZyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX21zZyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaWYgKHZlcmJvc2UgPiAzKQpAQCAtNjMwLDggKzUzMSwxMCBAQAogCQlzd2l0Y2ggKGNvbW1hbmQpIHsKIAkJCWNhc2UgQ0FfUE1UOgogCQkJCWlmICh2ZXJib3NlID4gMykKKy8vCQkJCQlkcHJpbnRrKCJDb21tYW5kID0gU0VORF9DQV9QTVRcbiIpOwogCQkJCQlkcHJpbnRrKCJDb21tYW5kID0gU0VORF9DQV9QTVRcbiIpOwotCQkJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIDApKSA8IDApIHsKKy8vCQkJCWlmICgoY2Ffc2V0X3BtdChzdGF0ZSwgcF9jYV9tZXNzYWdlLCBod19idWZmZXIsIDAsIDApKSA8IDApIHsKKwkJCQlpZiAoKGNhX3NldF9wbXQoc3RhdGUsIHBfY2FfbWVzc2FnZSwgaHdfYnVmZmVyLCAwLCAwKSkgPCAwKSB7CS8vIGNvZGUgc2ltcGxpZmljYXRpb24gc3RhcnRlZAogCQkJCQlkcHJpbnRrKCIlczogLS0+Q0FfUE1UIEZhaWxlZCAhXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQpAQCAtNjY0LDcgKzU2Nyw3IEBACiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CiAJCQkJaWYgKHZlcmJvc2UgPiAzKQotCQkJCQlwcmludGsoIiVzOiAtLT5DQV9BUFBfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJZHByaW50aygiJXM6IC0tPkNBX0FQUF9JTkZPX0VOUVVJUlkgU3VjY2VzcyAhXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTY4MSwxNyArNTg0LDE3IEBACiAJc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlOwogCiAJaWYgKChwX2NhX21lc3NhZ2UgPSAoc3RydWN0IGNhX21zZyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX21zZyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWRwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlpZiAoKHBfY2Ffc2xvdF9pbmZvID0gKHN0cnVjdCBjYV9zbG90X2luZm8gKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9zbG90X2luZm8pLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaWYgKChwX2NhX2NhcHMgPSAoc3RydWN0IGNhX2NhcHMgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9jYXBzKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKLQkJcHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZHByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCmluZGV4IDBiM2RhMjkuLmVmNTMyYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKQEAgLTQ3LDYgKzQ3LDggQEAKICNkZWZpbmUgRFNUX1RZUEVfSEFTX0ZXXzIJMTYKICNkZWZpbmUgRFNUX1RZUEVfSEFTX0ZXXzMJMzIKICNkZWZpbmUgRFNUX1RZUEVfSEFTX0ZXX0JVSUxECTY0CisjZGVmaW5lIERTVF9UWVBFX0hBU19PQlNfUkVHUwkxMjgKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX0lOQ19DT1VOVAkyNTYKIAogLyoJQ2FyZCBjYXBhYmlsaXR5IGxpc3QJKi8KIApAQCAtMTEwLDYgKzExMiw3IEBACiAJdTMyIGRzdF9od19jYXA7CiAJdTggZHN0X2Z3X3ZlcnNpb247CiAJZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZDsKKwlmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsKIAl1OCBtZXNzYWdlc1syNTZdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCmluZGV4IDk2YzU3ZmQuLjdkOGIzY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKQEAgLTY5OSw2ICs2OTksOCBAQAogCWZvciAobj0wOyBsZW4+MCAmJiBuPChsZW4vc2l6ZW9mKHJjX2V2ZW50c1swXSkpOyBuKyspIHsKIAkJaW50IGk7CiAKKy8qCQlkcHJpbnRrKDEsInJjX2V2ZW50c1slZF0udmFsdWUgPSAleCwgdHlwZT0leFxuIixuLGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSkscmNfZXZlbnRzW25dLnR5cGUpOyovCisKIAkJaWYgKHJjX2V2ZW50c1tuXS50eXBlID09IENJTkVSR1lUMl9SQ19FVkVOVF9UWVBFX05FQyAmJgogCQkgICAgcmNfZXZlbnRzW25dLnZhbHVlID09IH4wKQogCQl7CkBAIC03MTQsNyArNzE2LDcgQEAKIAkJCWNpbmVyZ3l0Mi0+cmNfaW5wdXRfZXZlbnQgPSBLRVlfTUFYOwogCQkJZm9yIChpPTA7IGk8c2l6ZW9mKHJjX2tleXMpL3NpemVvZihyY19rZXlzWzBdKTsgaSs9MykgewogCQkJCWlmIChyY19rZXlzW2krMF0gPT0gcmNfZXZlbnRzW25dLnR5cGUgJiYKLQkJCQkgICAgcmNfa2V5c1tpKzFdID09IHJjX2V2ZW50c1tuXS52YWx1ZSkKKwkJCQkgICAgcmNfa2V5c1tpKzFdID09IGxlMzJfdG9fY3B1KHJjX2V2ZW50c1tuXS52YWx1ZSkpCiAJCQkJewogCQkJCQljaW5lcmd5dDItPnJjX2lucHV0X2V2ZW50ID0gcmNfa2V5c1tpKzJdOwogCQkJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGZjNzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1jb25maWcgRFZCX0RJQlVTQgotCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKHNlZSBoZWxwIGZvciBhIGNvbXBsZXRlIGRldmljZSBsaXN0KSIKLQlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFVTQgotCXNlbGVjdCBGV19MT0FERVIKLQlzZWxlY3QgRFZCX0RJQjMwMDBNQgotCXNlbGVjdCBEVkJfRElCMzAwME1DCi0Jc2VsZWN0IERWQl9NVDM1MgotCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFVTQiAxLjEgYW5kIDIuMCBEVkItVCBkZXZpY2VzIGJhc2VkIG9uIHJlZmVyZW5jZSBkZXNpZ25zIG1hZGUgYnkKLQkgIERpQmNvbSAoaHR0cDovL3d3dy5kaWJjb20uZnIpIGFuZCBDJkUuCi0KLQkgIERldmljZXMgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyOgotCi0JICAgIFR3aW5oYW5EVFYgVVNCLVRlciAoVlA3MDQxKQotCQlUd2luaGFuRFRWIE1hZ2ljIEJveCAoVlA3MDQxZSkKLQkgICAgS1dvcmxkL0pldFdheS9BRFNUZWNoIFYtU3RyZWFtIFhQRVJUIERUViAtIERWQi1UIFVTQjEuMSBhbmQgVVNCMi4wCi0JICAgIEhhbWEgRFZCLVQgVVNCLUJveAotCSAgICBEaUJjb20gcmVmZXJlbmNlIGRldmljZXMgKG5vbi1wdWJsaWMpCi0JICAgIFVsdGltYSBFbGVjdHJvbmljL0FydGVjIFQxIFVTQiBUVkJPWAotCSAgICBDb21wcm8gVmlkZW9tYXRlIERWQi1VMjAwMCAtIERWQi1UIFVTQgotCSAgICBHcmFuZHRlYyBEVkItVCBVU0IKLQkgICAgQXZlcm1lZGlhIEF2ZXJUViBEVkJUIFVTQgotCSAgICBBcnRlYyBUMSBVU0IxLjEgYW5kIFVTQjIuMCBib3hlcwotCSAgICBZYWt1bW8vVHlwaG9vbiBEVkItVCBVU0IyLjAKLQkgICAgSGFuZnRlayBVTVQtMDEwIFVTQjIuMAotCSAgICBIYXVwcGF1Z2UgV2luVFYgTk9WQS1UIFVTQjIKLQotCSAgVGhlIFZQNzA0MSBzZWVtcyB0byBiZSBpZGVudGljYWwgdG8gIkNUUyBQb3J0YWJsZSIgKENoaW5lc2UKLQkgIFRlbGV2aXNpb24gU3lzdGVtKS4KLQotCSAgVGhlc2UgZGV2aWNlcyBjYW4gYmUgdW5kZXJzdG9vZCBhcyBidWRnZXQgb25lcywgdGhleSAib25seSIgZGVsaXZlcgotCSAgKGEgcGFydCBvZikgdGhlIE1QRUcyIHRyYW5zcG9ydCBzdHJlYW0uCi0KLQkgIEEgZmlybXdhcmUgaXMgbmVlZGVkIHRvIGdldCB0aGUgZGV2aWNlIHdvcmtpbmcuIFNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZGlidXNiCi0JICBkZXRhaWxzLgotCi0JICBTYXkgWSBpZiB5b3Ugb3duIHN1Y2ggYSBkZXZpY2UgYW5kIHdhbnQgdG8gdXNlIGl0LiBZb3Ugc2hvdWxkIGJ1aWxkIGl0IGFzCi0JICBhIG1vZHVsZS4KLQotY29uZmlnIERWQl9ESUJVU0JfTUlTREVTSUdORURfREVWSUNFUwotCWJvb2wgIkVuYWJsZSBzdXBwb3J0IGZvciBzb21lIG1pc2Rlc2lnbmVkIChzZWUgaGVscCkgZGV2aWNlcywgd2hpY2ggaWRlbnRpZnkgd2l0aCB3cm9uZyBJRHMiCi0JZGVwZW5kcyBvbiBEVkJfRElCVVNCCi0JaGVscAotCSAgU29tZWhvdyBBcnRlYy9VbHRpbWEgRWxlY3Ryb25pYyBmb3Jnb3QgdG8gcHJvZ3JhbSB0aGUgZWVwcm9tIG9mIHNvbWUgb2YgdGhlaXIKLQkgIFVTQjEuMS9VU0IyLjAgZGV2aWNlcy4KLQkgIFNvIGNvbWVzIHRoYXQgdGhleSBpZGVudGlmeSB3aXRoIHRoZSBkZWZhdWx0IFZlbmRvciBhbmQgUHJvZHVjdCBJRCBvZiB0aGUgQ3lwcmVzcwotCSAgQ1k3QzY0NjEzIChBTjIyMzUpIG9yIEN5cHJlc3MgRlgyLgotCi0JICBBZmZlY3RlZCBkZXZpY2UgSURzOgotCSAgICAweDA1NzQ6MHgyMjM1IChBcnRlYyBUMSBVU0IxLjEsIGNvbGQpCi0JICAgIDB4MDRiNDoweDg2MTMgKEFydGVjIFQxIFVTQjIuMCwgY29sZCkKLQkgICAgMHgwNTc0OjB4MTAwMiAoQXJ0ZWMgVDEgVVNCMi4wLCB3YXJtKQotCSAgICAweDA1NzQ6MHgyMTMxIChhZ2VkIERpQmNvbSBVU0IxLjEgdGVzdCBkZXZpY2UpCi0KLQkgIFNheSBZIGlmIHlvdXIgZGV2aWNlIGhhcyBvbmUgb2YgdGhlIG1lbnRpb25lZCBJRHMuCi0KLWNvbmZpZyBEVkJfRElCQ09NX0RFQlVHCi0JYm9vbCAiRW5hYmxlIGV4dGVuZGVkIGRlYnVnIHN1cHBvcnQgZm9yIERpQmNvbSBVU0IgZGV2aWNlIgotCWRlcGVuZHMgb24gRFZCX0RJQlVTQgotCWhlbHAKLQkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBkZWJ1Z2luZy4gU2VlIG1vZGluZm8gZHZiLWRpYnVzYiBmb3IKLQkgIGRlYnVnIGxldmVscy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0MWM1MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1kdmItZGlidXNiLW9ianMgPSBkdmItZGlidXNiLWNvcmUubyBcCi0JZHZiLWRpYnVzYi1kdmIubyBcCi0JZHZiLWRpYnVzYi1mZS1pMmMubyBcCi0JZHZiLWRpYnVzYi1maXJtd2FyZS5vIFwKLQlkdmItZGlidXNiLXJlbW90ZS5vIFwKLQlkdmItZGlidXNiLXVzYi5vIFwKLQlkdmItZmUtZHR0MjAwdS5vCi0KLW9iai0kKENPTkZJR19EVkJfRElCVVNCKSArPSBkdmItZGlidXNiLm8KLQotRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvZHZiLWRpYnVzYi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvZHZiLWRpYnVzYi1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjM1ZjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8qCi0gKiBEcml2ZXIgZm9yIG1vYmlsZSBVU0IgQnVkZ2V0IERWQi1UIGRldmljZXMgYmFzZWQgb24gcmVmZXJlbmNlIAotICogZGVzaWduIG1hZGUgYnkgRGlCY29tIChodHRwOi8vd3d3LmRpYmNvbS5mci8pCi0gKiAKLSAqIGR2Yi1kaWJ1c2ItY29yZS5jCi0gKiAKLSAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQotICogCi0gKiBiYXNlZCBvbiBHUEwgY29kZSBmcm9tIERpQmNvbSwgd2hpY2ggaGFzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgQW1hdXJ5IERlbW9sIGZvciBEaUJjb20gKGFkZW1vbEBkaWJjb20uZnIpCi0gKgotICogUmVtb3RlIGNvbnRyb2wgY29kZSBhZGRlZCBieSBEYXZpZCBNYXR0aGV3cyAoZG1AcHJvbGluZ3VhLmNvLnVrKQotICogCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KLSAqCi0gKiBBY2tub3dsZWRnZW1lbnRzCi0gKiAKLSAqICBBbWF1cnkgRGVtb2wgKGFkZW1vbEBkaWJjb20uZnIpIGZyb20gRGlCY29tIGZvciBwcm92aWRpbmcgc3BlY3MgYW5kIGRyaXZlcgotICogIHNvdXJjZXMsIG9uIHdoaWNoIHRoaXMgZHJpdmVyIChhbmQgdGhlIGRpYjMwMDBtYi9tYy9wIGZyb250ZW5kcykgYXJlIGJhc2VkLgotICogCi0gKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmRpYnVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgotICovCi0jaW5jbHVkZSAiZHZiLWRpYnVzYi5oIgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLQotLyogZGVidWcgKi8KLWludCBkdmJfZGlidXNiX2RlYnVnOwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBkdmJfZGlidXNiX2RlYnVnLCAgaW50LCAwNjQ0KTsKLQotI2lmZGVmIENPTkZJR19EVkJfRElCQ09NX0RFQlVHCi0jZGVmaW5lIERCU1RBVFVTICIiCi0jZWxzZQotI2RlZmluZSBEQlNUQVRVUyAiIChkZWJ1Z2dpbmcgaXMgbm90IGVuYWJsZWQpIgotI2VuZGlmCi1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLDI9eGZlciw0PWFsb3Rtb3JlLDg9dHMsMTY9ZXJyLDMyPXJjICh8LWFibGUpKS4iIERCU1RBVFVTKTsKLSN1bmRlZiBEQlNUQVRVUwotCi1zdGF0aWMgaW50IHBpZF9wYXJzZTsKLW1vZHVsZV9wYXJhbShwaWRfcGFyc2UsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBpZF9wYXJzZSwgImVuYWJsZSBwaWQgcGFyc2luZyAoZmlsdGVyaW5nKSB3aGVuIHJ1bm5pbmcgYXQgVVNCMi4wIik7Ci0KLXN0YXRpYyBpbnQgcmNfcXVlcnlfaW50ZXJ2YWwgPSAxMDA7Ci1tb2R1bGVfcGFyYW0ocmNfcXVlcnlfaW50ZXJ2YWwsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJjX3F1ZXJ5X2ludGVydmFsLCAiaW50ZXJ2YWwgaW4gbXNlY3MgZm9yIHJlbW90ZSBjb250cm9sIHF1ZXJ5IChkZWZhdWx0OiAxMDA7IG1pbjogNDApIik7Ci0KLXN0YXRpYyBpbnQgcmNfa2V5X3JlcGVhdF9jb3VudCA9IDI7Ci1tb2R1bGVfcGFyYW0ocmNfa2V5X3JlcGVhdF9jb3VudCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocmNfa2V5X3JlcGVhdF9jb3VudCwgImhvdyBtYW55IGtleSByZXBlYXRzIHdpbGwgYmUgZHJvcHBlZCBiZWZvcmUgcGFzc2luZyB0aGUga2V5IGV2ZW50IGFnYWluIChkZWZhdWx0OiAyKSIpOwotCi0vKiBWZW5kb3IgSURzICovCi0jZGVmaW5lIFVTQl9WSURfQURTVEVDSAkJCQkJCTB4MDZlMQotI2RlZmluZSBVU0JfVklEX0FOQ0hPUgkJCQkJCTB4MDU0NwotI2RlZmluZSBVU0JfVklEX0FWRVJNRURJQQkJCQkJMHgxNGFhCi0jZGVmaW5lIFVTQl9WSURfQ09NUFJPCQkJCQkJMHgxODViCi0jZGVmaW5lIFVTQl9WSURfQ09NUFJPX1VOSwkJCQkJMHgxNDVmCi0jZGVmaW5lIFVTQl9WSURfQ1lQUkVTUwkJCQkJCTB4MDRiNAotI2RlZmluZSBVU0JfVklEX0RJQkNPTQkJCQkJCTB4MTBiOAotI2RlZmluZSBVU0JfVklEX0VNUElBCQkJCQkJMHhlYjFhCi0jZGVmaW5lIFVTQl9WSURfR1JBTkRURUMJCQkJCTB4NTAzMgotI2RlZmluZSBVU0JfVklEX0hBTkZURUsJCQkJCQkweDE1ZjQKLSNkZWZpbmUgVVNCX1ZJRF9IQVVQUEFVR0UJCQkJCTB4MjA0MAotI2RlZmluZSBVU0JfVklEX0hZUEVSX1BBTFRFSwkJCQkweDEwMjUKLSNkZWZpbmUgVVNCX1ZJRF9JTUNfTkVUV09SS1MJCQkJMHgxM2QzCi0jZGVmaW5lIFVTQl9WSURfVFdJTkhBTgkJCQkJCTB4MTgyMgotI2RlZmluZSBVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDCQkJMHgwNWQ4Ci0KLS8qIFByb2R1Y3QgSURzICovCi0jZGVmaW5lIFVTQl9QSURfQURTVEVDSF9VU0IyX0NPTEQJCQkweGEzMzMKLSNkZWZpbmUgVVNCX1BJRF9BRFNURUNIX1VTQjJfV0FSTQkJCTB4YTMzNAotI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQl9DT0xECQkweDAwMDEKLSNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfV0FSTQkJMHgwMDAyCi0jZGVmaW5lIFVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX0NPTEQJCTB4ZDAwMAotI2RlZmluZSBVU0JfUElEX0NPTVBST19EVkJVMjAwMF9XQVJNCQkweGQwMDEKLSNkZWZpbmUgVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfVU5LX0NPTEQJMHgwMTBjCi0jZGVmaW5lIFVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX1VOS19XQVJNCTB4MDEwZAotI2RlZmluZSBVU0JfUElEX0RJQkNPTV9NT0QzMDAwX0NPTEQJCQkweDBiYjgKLSNkZWZpbmUgVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9XQVJNCQkJMHgwYmI5Ci0jZGVmaW5lIFVTQl9QSURfRElCQ09NX01PRDMwMDFfQ09MRAkJCTB4MGJjNgotI2RlZmluZSBVU0JfUElEX0RJQkNPTV9NT0QzMDAxX1dBUk0JCQkweDBiYzcKLSNkZWZpbmUgVVNCX1BJRF9ESUJDT01fQU5DSE9SXzIxMzVfQ09MRAkJMHgyMTMxCi0jZGVmaW5lIFVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfQ09MRAkJMHgwZmEwCi0jZGVmaW5lIFVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfV0FSTQkJMHgwZmExCi0jZGVmaW5lIFVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fQ09MRAkJCTB4MTdkZQotI2RlZmluZSBVU0JfUElEX0tXT1JMRF9WU1RSRUFNX1dBUk0JCQkweDE3ZGYKLSNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzA0MV9DT0xECQkJMHgzMjAxCi0jZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDFfV0FSTQkJCTB4MzIwMgotI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9DT0xECQkJMHg4MTA1Ci0jZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX1dBUk0JCQkweDgxMDYKLSNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQJMHg4MTA3Ci0jZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX0FOMjIzNV9XQVJNCTB4ODEwOAotI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9BTkNIT1JfQ09MRAkweDIyMzUKLSNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfVVNCMl9DT0xECQkweDgxMDkKLSNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfVVNCMl9GWF9DT0xECTB4ODYxMwotI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9VU0IyX0ZYX1dBUk0JMHgxMDAyCi0jZGVmaW5lIFVTQl9QSURfVU5LX0hZUEVSX1BBTFRFS19DT0xECQkweDAwNWUKLSNkZWZpbmUgVVNCX1BJRF9VTktfSFlQRVJfUEFMVEVLX1dBUk0JCTB4MDA1ZgotI2RlZmluZSBVU0JfUElEX0hBTkZURUtfVU1UXzAxMF9DT0xECQkweDAwMDEKLSNkZWZpbmUgVVNCX1BJRF9IQU5GVEVLX1VNVF8wMTBfV0FSTQkJMHgwMDE1Ci0jZGVmaW5lIFVTQl9QSURfWUFLVU1PX0RUVDIwMFVfQ09MRAkJCTB4MDIwMQotI2RlZmluZSBVU0JfUElEX1lBS1VNT19EVFQyMDBVX1dBUk0JCQkweDAzMDEKLSNkZWZpbmUgVVNCX1BJRF9XSU5UVl9OT1ZBX1RfVVNCMl9DT0xECQkweDkzMDAKLSNkZWZpbmUgVVNCX1BJRF9XSU5UVl9OT1ZBX1RfVVNCMl9XQVJNCQkweDkzMDEKLQotLyogVVNCIERyaXZlciBzdHVmZgotICogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHRoaXMgZHJpdmVyIGlzIHdvcmtpbmcgd2l0aAotICoKLSAqIEFUVEVOVElPTjogTmV2ZXIgZXZlciBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoaXMgdGFibGUsIHRoZSBwYXJ0aWN1bGFyIAotICogZGV2aWNlcyBkZXBlbmQgb24gdGhpcyBvcmRlciAKLSAqCi0gKiBFYWNoIGVudHJ5IGlzIHVzZWQgYXMgYSByZWZlcmVuY2UgaW4gdGhlIGRldmljZV9zdHJ1Y3QuIEN1cnJlbnRseSB0aGlzIGlzIAotICogdGhlIG9ubHkgbm9uLXJlZHVuZGFudCB3YXkgb2YgYXNzaWduaW5nIFVTQiBpZHMgdG8gYWN0dWFsIGRldmljZXMgSSdtIGF3YXJlIAotICogb2YsIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgcGxhY2UgaW4gdGhlIGNvZGUgd2hlcmUgdGhlIGFzc2lnbm1lbnQgb2YgCi0gKiB2ZW5kb3IgYW5kIHByb2R1Y3QgaWQgaXMgZG9uZSwgaGVyZS4KLSAqLwotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRpYl90YWJsZSBbXSA9IHsKLS8qIDAwICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwJCVVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX0NPTEQpfSwKLS8qIDAxICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwJCVVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX1dBUk0pfSwKLS8qIDAyICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwJCVVTQl9QSURfWUFLVU1PX0RUVDIwMFVfQ09MRCkgfSwKLS8qIDAzICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwJCVVTQl9QSURfWUFLVU1PX0RUVDIwMFVfV0FSTSkgfSwKLQotLyogMDQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQ09NUFJPLAkJVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfQ09MRCkgfSwKLS8qIDA1ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0NPTVBSTywJCVVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX1dBUk0pIH0sCi0vKiAwNiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9DT01QUk9fVU5LLAlVU0JfUElEX0NPTVBST19EVkJVMjAwMF9VTktfQ09MRCkgfSwKLS8qIDA3ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwJCVVTQl9QSURfRElCQ09NX01PRDMwMDBfQ09MRCkgfSwKLS8qIDA4ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwJCVVTQl9QSURfRElCQ09NX01PRDMwMDBfV0FSTSkgfSwKLS8qIDA5ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwJCVVTQl9QSURfRElCQ09NX01PRDMwMDFfQ09MRCkgfSwKLS8qIDEwICovCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwJCVVTQl9QSURfRElCQ09NX01PRDMwMDFfV0FSTSkgfSwKLS8qIDExICovCXsgVVNCX0RFVklDRShVU0JfVklEX0VNUElBLAkJCVVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fQ09MRCkgfSwKLS8qIDEyICovCXsgVVNCX0RFVklDRShVU0JfVklEX0VNUElBLAkJCVVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fV0FSTSkgfSwKLS8qIDEzICovCXsgVVNCX0RFVklDRShVU0JfVklEX0dSQU5EVEVDLAkJVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9DT0xEKSB9LAotLyogMTQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfR1JBTkRURUMsCQlVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX1dBUk0pIH0sCi0vKiAxNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9HUkFORFRFQywJCVVTQl9QSURfRElCQ09NX01PRDMwMDBfQ09MRCkgfSwKLS8qIDE2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0dSQU5EVEVDLAkJVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9XQVJNKSB9LAotLyogMTcgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSFlQRVJfUEFMVEVLLAlVU0JfUElEX1VOS19IWVBFUl9QQUxURUtfQ09MRCkgfSwKLS8qIDE4ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0hZUEVSX1BBTFRFSywJVVNCX1BJRF9VTktfSFlQRVJfUEFMVEVLX1dBUk0pIH0sCi0vKiAxOSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9JTUNfTkVUV09SS1MsCVVTQl9QSURfVFdJTkhBTl9WUDcwNDFfQ09MRCkgfSwKLS8qIDIwICovCXsgVVNCX0RFVklDRShVU0JfVklEX0lNQ19ORVRXT1JLUywJVVNCX1BJRF9UV0lOSEFOX1ZQNzA0MV9XQVJNKSB9LAotLyogMjEgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVFdJTkhBTiwgCQlVU0JfUElEX1RXSU5IQU5fVlA3MDQxX0NPTEQpIH0sCi0vKiAyMiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9UV0lOSEFOLCAJCVVTQl9QSURfVFdJTkhBTl9WUDcwNDFfV0FSTSkgfSwKLS8qIDIzICovCXsgVVNCX0RFVklDRShVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDLCBVU0JfUElEX1VMVElNQV9UVkJPWF9DT0xEKSB9LAotLyogMjQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMsIFVTQl9QSURfVUxUSU1BX1RWQk9YX1dBUk0pIH0sCi0vKiAyNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQpIH0sCi0vKiAyNiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X1dBUk0pIH0sCi0vKiAyNyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywJVVNCX1BJRF9VTFRJTUFfVFZCT1hfVVNCMl9DT0xEKSB9LAotCQotLyogMjggKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFORlRFSywJCVVTQl9QSURfSEFORlRFS19VTVRfMDEwX0NPTEQpIH0sCi0vKiAyOSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQU5GVEVLLAkJVVNCX1BJRF9IQU5GVEVLX1VNVF8wMTBfV0FSTSkgfSwKLQotLyogMzAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLAkJVVNCX1BJRF9XSU5UVl9OT1ZBX1RfVVNCMl9DT0xEKSB9LAotLyogMzEgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFVUFBBVUdFLAkJVVNCX1BJRF9XSU5UVl9OT1ZBX1RfVVNCMl9XQVJNKSB9LAotLyogMzIgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQURTVEVDSCwJCVVTQl9QSURfQURTVEVDSF9VU0IyX0NPTEQpIH0sCi0vKiAzMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BRFNURUNILAkJVVNCX1BJRF9BRFNURUNIX1VTQjJfV0FSTSkgfSwKLS8qIAotICogYWN0aXZhdGUgdGhlIGZvbGxvd2luZyBkZWZpbmUgd2hlbiB5b3UgaGF2ZSBvbmUgb2YgdGhlIGRldmljZXMgYW5kIHdhbnQgdG8gCi0gKiBidWlsZCBpdCBmcm9tIGJ1aWxkLTIuNiBpbiBkdmIta2VybmVsCi0gKi8KLS8vICNkZWZpbmUgQ09ORklHX0RWQl9ESUJVU0JfTUlTREVTSUdORURfREVWSUNFUwotI2lmZGVmIENPTkZJR19EVkJfRElCVVNCX01JU0RFU0lHTkVEX0RFVklDRVMKLS8qIDM0ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FOQ0hPUiwJCVVTQl9QSURfVUxUSU1BX1RWQk9YX0FOQ0hPUl9DT0xEKSB9LAotLyogMzUgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQ1lQUkVTUywJCVVTQl9QSURfVUxUSU1BX1RWQk9YX1VTQjJfRlhfQ09MRCkgfSwKLS8qIDM2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FOQ0hPUiwJCVVTQl9QSURfVUxUSU1BX1RWQk9YX1VTQjJfRlhfV0FSTSkgfSwKLS8qIDM3ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FOQ0hPUiwJCVVTQl9QSURfRElCQ09NX0FOQ0hPUl8yMTM1X0NPTEQpIH0sCi0jZW5kaWYKLQkJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgZGliX3RhYmxlKTsKLQotc3RhdGljIHN0cnVjdCBkaWJ1c2JfdXNiX2NvbnRyb2xsZXIgZGlidXNiX3VzYl9jdHJsW10gPSB7Ci0JeyAubmFtZSA9ICJDeXByZXNzIEFOMjEzNSIsIC5jcHVfY3NfcmVnaXN0ZXIgPSAweDdmOTIgfSwKLQl7IC5uYW1lID0gIkN5cHJlc3MgQU4yMjM1IiwgLmNwdV9jc19yZWdpc3RlciA9IDB4N2Y5MiB9LAotCXsgLm5hbWUgPSAiQ3lwcmVzcyBGWDIiLCAgICAuY3B1X2NzX3JlZ2lzdGVyID0gMHhlNjAwIH0sCi19OwotCi1zdHJ1Y3QgZGlidXNiX3R1bmVyIGRpYnVzYl90dW5lcltdID0gewotCXsgRElCVVNCX1RVTkVSX0NBQkxFX1RIT01TT04sIAotCSAgMHg2MSAKLQl9LAotCXsgRElCVVNCX1RVTkVSX0NPRkRNX1BBTkFTT05JQ19FTlY1N0gxWEQ1LAotCSAgMHg2MCAKLQl9LAotCXsgRElCVVNCX1RVTkVSX0NBQkxFX0xHX1REVFBfRTEwMlAsCi0JICAweDYxCi0JfSwKLQl7IERJQlVTQl9UVU5FUl9DT0ZETV9QQU5BU09OSUNfRU5WNzdIMTFENSwKLQkgIDB4NjAKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkaWJ1c2JfZGVtb2QgZGlidXNiX2RlbW9kW10gPSB7Ci0JeyBESUJVU0JfRElCMzAwME1CLAotCSAgMTYsCi0JICB7IDB4OCwgMCB9LAotCX0sCi0JeyBESUJVU0JfRElCMzAwME1DLAotCSAgMzIsCi0JICB7IDB4OSwgMHhhLCAweGIsIDB4YyB9LCAKLQl9LAotCXsgRElCVVNCX01UMzUyLAotCSAgMjU0LAotCSAgeyAweGYsIDAgfSwgCi0JfSwKLQl7IERUVDIwMFVfRkUsCi0JICA4LAotCSAgeyAweGZmLDAgfSwgLyogdGhlcmUgaXMgbm8gaTJjIGJ1cyBpbiB0aGlzIGRldmljZSAqLwotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGlidXNiX2RldmljZV9jbGFzcyBkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbXSA9IHsKLQl7IC5pZCA9IERJQlVTQjFfMSwgLnVzYl9jdHJsID0gJmRpYnVzYl91c2JfY3RybFswXSwKLQkgIC5maXJtd2FyZSA9ICJkdmItZGlidXNiLTUuMC4wLjExLmZ3IiwKLQkgIC5waXBlX2NtZCA9IDB4MDEsIC5waXBlX2RhdGEgPSAweDAyLCAKLQkgIC51cmJfY291bnQgPSA3LCAudXJiX2J1ZmZlcl9zaXplID0gNDA5NiwKLQkgIERJQlVTQl9SQ19ORUNfUFJPVE9DT0wsCi0JICAmZGlidXNiX2RlbW9kW0RJQlVTQl9ESUIzMDAwTUJdLAotCSAgJmRpYnVzYl90dW5lcltESUJVU0JfVFVORVJfQ0FCTEVfVEhPTVNPTl0sCi0JfSwKLQl7IERJQlVTQjFfMV9BTjIyMzUsICZkaWJ1c2JfdXNiX2N0cmxbMV0sCi0JICAiZHZiLWRpYnVzYi1hbjIyMzUtMS5mdyIsCi0JICAweDAxLCAweDAyLCAKLQkgIDcsIDQwOTYsCi0JICBESUJVU0JfUkNfTkVDX1BST1RPQ09MLAotCSAgJmRpYnVzYl9kZW1vZFtESUJVU0JfRElCMzAwME1CXSwKLQkgICZkaWJ1c2JfdHVuZXJbRElCVVNCX1RVTkVSX0NBQkxFX1RIT01TT05dLAotCX0sCi0JeyBESUJVU0IyXzAsJmRpYnVzYl91c2JfY3RybFsyXSwKLQkgICJkdmItZGlidXNiLTYuMC4wLjUuZnciLAotCSAgMHgwMSwgMHgwNiwgCi0JICA3LCA0MDk2LAotCSAgRElCVVNCX1JDX05FQ19QUk9UT0NPTCwKLQkgICZkaWJ1c2JfZGVtb2RbRElCVVNCX0RJQjMwMDBNQ10sCi0JICAmZGlidXNiX3R1bmVyW0RJQlVTQl9UVU5FUl9DT0ZETV9QQU5BU09OSUNfRU5WNTdIMVhENV0sCi0JfSwKLQl7IFVNVDJfMCwgJmRpYnVzYl91c2JfY3RybFsyXSwKLQkgICJkdmItZGlidXNiLXVtdC0yLmZ3IiwKLQkgIDB4MDEsIDB4MDYsCi0JICAyMCwgNTEyLAotCSAgRElCVVNCX1JDX05PLAotCSAgJmRpYnVzYl9kZW1vZFtESUJVU0JfTVQzNTJdLAotCSAgJmRpYnVzYl90dW5lcltESUJVU0JfVFVORVJfQ0FCTEVfTEdfVERUUF9FMTAyUF0sCi0JfSwKLQl7IERJQlVTQjJfMEIsJmRpYnVzYl91c2JfY3RybFsyXSwKLQkgICJkdmItZGlidXNiLWFkc3RlY2gtdXNiMi0xLmZ3IiwKLQkgIDB4MDEsIDB4MDYsCi0JICA3LCA0MDk2LAotCSAgRElCVVNCX1JDX05FQ19QUk9UT0NPTCwKLQkgICZkaWJ1c2JfZGVtb2RbRElCVVNCX0RJQjMwMDBNQl0sCi0JICAmZGlidXNiX3R1bmVyW0RJQlVTQl9UVU5FUl9DQUJMRV9USE9NU09OXSwKLQl9LAotCXsgTk9WQVRfVVNCMiwmZGlidXNiX3VzYl9jdHJsWzJdLAotCSAgImR2Yi1kaWJ1c2Itbm92YS10LTEuZnciLAotCSAgMHgwMSwgMHgwNiwKLQkgIDcsIDQwOTYsCi0JICBESUJVU0JfUkNfSEFVUFBBVUdFX1BST1RPLAotCSAgJmRpYnVzYl9kZW1vZFtESUJVU0JfRElCMzAwME1DXSwKLQkgICZkaWJ1c2JfdHVuZXJbRElCVVNCX1RVTkVSX0NPRkRNX1BBTkFTT05JQ19FTlY1N0gxWEQ1XSwKLQl9LAotCXsgRFRUMjAwVSwmZGlidXNiX3VzYl9jdHJsWzJdLAotCSAgImR2Yi1kdHQyMDB1LTEuZnciLAotCSAgMHgwMSwgMHgwMiwKLQkgIDcsIDQwOTYsCi0JICBESUJVU0JfUkNfTk8sCi0JICAmZGlidXNiX2RlbW9kW0RUVDIwMFVfRkVdLAotCSAgTlVMTCwgLyogbm8gZXhwbGljaXQgdHVuZXIvcGxsLXByb2dyYW1taW5nIG5lY2Vzc2FyeSAoaXQgaGFzIHRoZSBFTlY1N0gxWEQ1KSAqLwotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGRpYnVzYl91c2JfZGV2aWNlIGRpYnVzYl9kZXZpY2VzW10gPSB7Ci0JewkiVHdpbmhhbkRUViBVU0IxLjEgLyBNYWdpYyBCb3ggLyBIQU1BIFVTQjEuMSBEVkItVCBkZXZpY2UiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjFfMV0sCi0JCXsgJmRpYl90YWJsZVsxOV0sICZkaWJfdGFibGVbMjFdLCBOVUxMfSwKLQkJeyAmZGliX3RhYmxlWzIwXSwgJmRpYl90YWJsZVsyMl0sIE5VTEx9LAotCX0sCi0JewkiS1dvcmxkIFYtU3RyZWFtIFhQRVJUIERUViAtIERWQi1UIFVTQjEuMSIsCi0JCSZkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbRElCVVNCMV8xXSwKLQkJeyAmZGliX3RhYmxlWzExXSwgTlVMTCB9LAotCQl7ICZkaWJfdGFibGVbMTJdLCBOVUxMIH0sCi0JfSwKLQl7CSJHcmFuZHRlYyBVU0IxLjEgRFZCLVQiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjFfMV0sCi0JCXsgJmRpYl90YWJsZVsxM10sICZkaWJfdGFibGVbMTVdLCBOVUxMIH0sCi0JCXsgJmRpYl90YWJsZVsxNF0sICZkaWJfdGFibGVbMTZdLCBOVUxMIH0sCi0JfSwKLQl7CSJEaUJjb20gVVNCMS4xIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24gKE1PRDMwMDApIiwKLQkJJmRpYnVzYl9kZXZpY2VfY2xhc3Nlc1tESUJVU0IxXzFdLAotCQl7ICZkaWJfdGFibGVbN10sICBOVUxMIH0sCi0JCXsgJmRpYl90YWJsZVs4XSwgIE5VTEwgfSwKLQl9LAotCXsJIkFydGVjIFQxIFVTQjEuMSBUVkJPWCB3aXRoIEFOMjEzNSIsCi0JCSZkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbRElCVVNCMV8xXSwKLQkJeyAmZGliX3RhYmxlWzIzXSwgTlVMTCB9LAotCQl7ICZkaWJfdGFibGVbMjRdLCBOVUxMIH0sCi0JfSwKLQl7CSJBcnRlYyBUMSBVU0IxLjEgVFZCT1ggd2l0aCBBTjIyMzUiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjFfMV9BTjIyMzVdLAotCQl7ICZkaWJfdGFibGVbMjVdLCBOVUxMIH0sCi0JCXsgJmRpYl90YWJsZVsyNl0sIE5VTEwgfSwKLQl9LAotCXsJIkF2ZXJtZWRpYSBBdmVyVFYgRFZCVCBVU0IxLjEiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjFfMV0sCi0JCXsgJmRpYl90YWJsZVswXSwgIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzFdLCAgTlVMTCB9LAotCX0sCi0JewkiQ29tcHJvIFZpZGVvbWF0ZSBEVkItVTIwMDAgLSBEVkItVCBVU0IxLjEgKHBsZWFzZSBjb25maXJtIHRvIGxpbnV4LWR2YikiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjFfMV0sCi0JCXsgJmRpYl90YWJsZVs0XSwgJmRpYl90YWJsZVs2XSwgTlVMTH0sCi0JCXsgJmRpYl90YWJsZVs1XSwgTlVMTCB9LAotCX0sCi0JewkiVW5rb3duIFVTQjEuMSBEVkItVCBkZXZpY2UgPz8/PyBwbGVhc2UgcmVwb3J0IHRoZSBuYW1lIHRvIHRoZSBhdXRob3IiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjFfMV0sCi0JCXsgJmRpYl90YWJsZVsxN10sIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzE4XSwgTlVMTCB9LAotCX0sCi0JewkiRGlCY29tIFVTQjIuMCBEVkItVCByZWZlcmVuY2UgZGVzaWduIChNT0QzMDAwUCkiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW0RJQlVTQjJfMF0sCi0JCXsgJmRpYl90YWJsZVs5XSwgIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzEwXSwgTlVMTCB9LAotCX0sCi0JewkiQXJ0ZWMgVDEgVVNCMi4wIFRWQk9YIChwbGVhc2UgcmVwb3J0IHRoZSB3YXJtIElEKSIsCi0JCSZkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbRElCVVNCMl8wXSwKLQkJeyAmZGliX3RhYmxlWzI3XSwgTlVMTCB9LAotCQl7IE5VTEwgfSwKLQl9LAotCXsJIkhhdXBwYXVnZSBXaW5UViBOT1ZBLVQgVVNCMiIsCi0JCSZkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbTk9WQVRfVVNCMl0sCi0JCXsgJmRpYl90YWJsZVszMF0sIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzMxXSwgTlVMTCB9LAotCX0sCi0JewkiRFRUMjAwVSAoWWFrdW1vL0hhbWEvVHlwaG9vbikgRFZCLVQgVVNCMi4wIiwKLQkJJmRpYnVzYl9kZXZpY2VfY2xhc3Nlc1tEVFQyMDBVXSwKLQkJeyAmZGliX3RhYmxlWzJdLCBOVUxMIH0sCi0JCXsgJmRpYl90YWJsZVszXSwgTlVMTCB9LAotCX0sCQotCXsJIkhhbmZ0ZWsgVU1ULTAxMCBEVkItVCBVU0IyLjAiLAotCQkmZGlidXNiX2RldmljZV9jbGFzc2VzW1VNVDJfMF0sCi0JCXsgJmRpYl90YWJsZVsyOF0sIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzI5XSwgTlVMTCB9LAotCX0sCQotCXsJIktXb3JsZC9BRFNUZWNoIEluc3RhbnQgRFZCLVQgVVNCIDIuMCIsCi0JCSZkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbRElCVVNCMl8wQl0sCi0JCXsgJmRpYl90YWJsZVszMl0sIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzMzXSwgTlVMTCB9LCAvKiBkZXZpY2UgSUQgd2l0aCBkZWZhdWx0IERJQlVTQjJfMC1maXJtd2FyZSAqLwotCX0sCi0jaWZkZWYgQ09ORklHX0RWQl9ESUJVU0JfTUlTREVTSUdORURfREVWSUNFUwotCXsJIkFydGVjIFQxIFVTQjEuMSBUVkJPWCB3aXRoIEFOMjIzNSAobWlzZGVzaWduZWQpIiwKLQkJJmRpYnVzYl9kZXZpY2VfY2xhc3Nlc1tESUJVU0IxXzFfQU4yMjM1XSwKLQkJeyAmZGliX3RhYmxlWzM0XSwgTlVMTCB9LAotCQl7IE5VTEwgfSwKLQl9LAotCXsJIkFydGVjIFQxIFVTQjIuMCBUVkJPWCB3aXRoIEZYMiBJRHMgKG1pc2Rlc2lnbmVkLCBwbGVhc2UgcmVwb3J0IHRoZSB3YXJtIElEKSIsCi0JCSZkaWJ1c2JfZGV2aWNlX2NsYXNzZXNbRFRUMjAwVV0sCi0JCXsgJmRpYl90YWJsZVszNV0sIE5VTEwgfSwKLQkJeyAmZGliX3RhYmxlWzM2XSwgTlVMTCB9LCAvKiB1bmRlZmluZWQsIGl0IGNvdWxkIGJlIHRoYXQgdGhlIGRldmljZSB3aWxsIGdldCBhbm90aGVyIFVTQiBJRCBpbiB3YXJtIHN0YXRlICovCi0JfSwKLQl7CSJEaUJjb20gVVNCMS4xIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24gKE1PRDMwMDApIHdpdGggQU4yMTM1IGRlZmF1bHQgSURzIiwKLQkJJmRpYnVzYl9kZXZpY2VfY2xhc3Nlc1tESUJVU0IxXzFdLAotCQl7ICZkaWJfdGFibGVbMzddLCBOVUxMIH0sCi0JCXsgTlVMTCB9LAotCX0sCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBpbnQgZGlidXNiX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlkZWJfaW5mbygiaW5pdF9zdGF0ZSBiZWZvcmUgZXhpdGluZyBldmVyeXRoaW5nOiAleFxuIixkaWItPmluaXRfc3RhdGUpOwotCWRpYnVzYl9yZW1vdGVfZXhpdChkaWIpOwotCWRpYnVzYl9mZV9leGl0KGRpYik7Ci0JZGlidXNiX2kyY19leGl0KGRpYik7Ci0JZGlidXNiX2R2Yl9leGl0KGRpYik7Ci0JZGlidXNiX3VyYl9leGl0KGRpYik7Ci0JZGViX2luZm8oImluaXRfc3RhdGUgc2hvdWxkIGJlIHplcm8gbm93OiAleFxuIixkaWItPmluaXRfc3RhdGUpOwotCWRpYi0+aW5pdF9zdGF0ZSA9IERJQlVTQl9TVEFURV9JTklUOwotCWtmcmVlKGRpYik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGlidXNiX2luaXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzZW1hX2luaXQoJmRpYi0+dXNiX3NlbSwgMSk7Ci0Jc2VtYV9pbml0KCZkaWItPmkyY19zZW0sIDEpOwotCi0JZGliLT5pbml0X3N0YXRlID0gRElCVVNCX1NUQVRFX0lOSVQ7Ci0JCi0JaWYgKChyZXQgPSBkaWJ1c2JfdXJiX2luaXQoZGliKSkgfHwKLQkJKHJldCA9IGRpYnVzYl9kdmJfaW5pdChkaWIpKSB8fCAKLQkJKHJldCA9IGRpYnVzYl9pMmNfaW5pdChkaWIpKSkgewotCQlkaWJ1c2JfZXhpdChkaWIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICgocmV0ID0gZGlidXNiX2ZlX2luaXQoZGliKSkpCi0JCWVycigiY291bGQgbm90IGluaXRpYWxpemUgYSBmcm9udGVuZC4iKTsKLQkKLQlpZiAoKHJldCA9IGRpYnVzYl9yZW1vdGVfaW5pdChkaWIpKSkKLQkJZXJyKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSByZW1vdGUgY29udHJvbC4iKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSAqIGRpYnVzYl9kZXZpY2VfY2xhc3NfcXVpcmsoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSAqZGV2KQotewotCWludCBpOwotCi0JLyogUXVpcmsgZm9yIHRoZSBLd29ybGQvQURTVGVjaCBJbnN0YW50IFVTQjIuMCBkZXZpY2UuIEl0IGhhcyB0aGUgc2FtZSBVU0IKLQkgKiBJRHMgbGlrZSB0aGUgVVNCMS4xIEtXb3JsZCBhZnRlciBsb2FkaW5nIHRoZSBmaXJtd2FyZS4gV2hpY2ggaXMgYSBiYWQKLQkgKiBpZGVhIGFuZCBtYWtlIHRoaXMgcXVpcmsgbmVjZXNzYXJ5LgotCSAqLwotCWlmIChkZXYtPmRldl9jbC0+aWQgPT0gRElCVVNCMV8xICYmIHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7Ci0JCWluZm8oInRoaXMgc2VlbXMgdG8gYmUgdGhlIEt3b3JsZC9BRFNUZWNoIEluc3RhbnQgVVNCMi4wIGRldmljZSBvciBlcXVhbC4iKTsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihkaWJ1c2JfZGV2aWNlcykvc2l6ZW9mKHN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSk7IGkrKykgewotCQkJaWYgKGRpYnVzYl9kZXZpY2VzW2ldLmRldl9jbC0+aWQgPT0gRElCVVNCMl8wQikgewotCQkJCWRldiA9ICZkaWJ1c2JfZGV2aWNlc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiBkZXY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZGlidXNiX3VzYl9kZXZpY2UgKiBkaWJ1c2JfZmluZF9kZXZpY2UgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LGludCAqY29sZCkKLXsKLQlpbnQgaSxqOwotCXN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSAqZGV2ID0gTlVMTDsKLQkqY29sZCA9IC0xOwotCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihkaWJ1c2JfZGV2aWNlcykvc2l6ZW9mKHN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSk7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgRElCVVNCX0lEX01BWF9OVU0gJiYgZGlidXNiX2RldmljZXNbaV0uY29sZF9pZHNbal0gIT0gTlVMTDsgaisrKSB7Ci0JCQlkZWJfaW5mbygiY2hlY2sgZm9yIGNvbGQgJXggJXhcbiIsZGlidXNiX2RldmljZXNbaV0uY29sZF9pZHNbal0tPmlkVmVuZG9yLCBkaWJ1c2JfZGV2aWNlc1tpXS5jb2xkX2lkc1tqXS0+aWRQcm9kdWN0KTsKLQkJCWlmIChkaWJ1c2JfZGV2aWNlc1tpXS5jb2xkX2lkc1tqXS0+aWRWZW5kb3IgPT0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgJiYKLQkJCQlkaWJ1c2JfZGV2aWNlc1tpXS5jb2xkX2lkc1tqXS0+aWRQcm9kdWN0ID09IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkgewotCQkJCSpjb2xkID0gMTsKLQkJCQlkZXYgPSAmZGlidXNiX2RldmljZXNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGV2ICE9IE5VTEwpCi0JCQlicmVhazsKLQotCQlmb3IgKGogPSAwOyBqIDwgRElCVVNCX0lEX01BWF9OVU0gJiYgZGlidXNiX2RldmljZXNbaV0ud2FybV9pZHNbal0gIT0gTlVMTDsgaisrKSB7Ci0JCQlkZWJfaW5mbygiY2hlY2sgZm9yIHdhcm0gJXggJXhcbiIsZGlidXNiX2RldmljZXNbaV0ud2FybV9pZHNbal0tPmlkVmVuZG9yLCBkaWJ1c2JfZGV2aWNlc1tpXS53YXJtX2lkc1tqXS0+aWRQcm9kdWN0KTsKLQkJCWlmIChkaWJ1c2JfZGV2aWNlc1tpXS53YXJtX2lkc1tqXS0+aWRWZW5kb3IgPT0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgJiYKLQkJCQlkaWJ1c2JfZGV2aWNlc1tpXS53YXJtX2lkc1tqXS0+aWRQcm9kdWN0ID09IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSkgewotCQkJCSpjb2xkID0gMDsKLQkJCQlkZXYgPSAmZGlidXNiX2RldmljZXNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoZGV2ICE9IE5VTEwpCi0JCWRldiA9IGRpYnVzYl9kZXZpY2VfY2xhc3NfcXVpcmsodWRldixkZXYpOwotCi0JcmV0dXJuIGRldjsKLX0KLQotLyoKLSAqIFVTQiAKLSAqLwotc3RhdGljIGludCBkaWJ1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIAotCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCXN0cnVjdCB1c2JfZGlidXNiICpkaWIgPSBOVUxMOwotCXN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSAqZGliZGV2ID0gTlVMTDsKLQkKLQlpbnQgcmV0ID0gLUVOT01FTSxjb2xkPTA7Ci0KLQlpZiAoKGRpYmRldiA9IGRpYnVzYl9maW5kX2RldmljZSh1ZGV2LCZjb2xkKSkgPT0gTlVMTCkgewotCQllcnIoInNvbWV0aGluZyB3ZW50IHZlcnkgd3JvbmcsICIKLQkJCQkidW5rbm93biBwcm9kdWN0IElEOiAlLjR4IixsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JCi0JaWYgKGNvbGQgPT0gMSkgewotCQlpbmZvKCJmb3VuZCBhICclcycgaW4gY29sZCBzdGF0ZSwgd2lsbCB0cnkgdG8gbG9hZCBhIGZpcm13YXJlIixkaWJkZXYtPm5hbWUpOwotCQlyZXQgPSBkaWJ1c2JfbG9hZGZpcm13YXJlKHVkZXYsZGliZGV2KTsKLQl9IGVsc2UgewotCQlpbmZvKCJmb3VuZCBhICclcycgaW4gd2FybSBzdGF0ZS4iLGRpYmRldi0+bmFtZSk7Ci0JCWRpYiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfZGlidXNiKSxHRlBfS0VSTkVMKTsKLQkJaWYgKGRpYiA9PSBOVUxMKSB7Ci0JCQllcnIoIm5vIG1lbW9yeSIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQltZW1zZXQoZGliLDAsc2l6ZW9mKHN0cnVjdCB1c2JfZGlidXNiKSk7Ci0JCQotCQlkaWItPnVkZXYgPSB1ZGV2OwotCQlkaWItPmRpYmRldiA9IGRpYmRldjsKLQotCQkvKiBzdG9yZSBwYXJhbWV0ZXJzIHRvIHN0cnVjdHVyZXMgKi8KLQkJZGliLT5yY19xdWVyeV9pbnRlcnZhbCA9IHJjX3F1ZXJ5X2ludGVydmFsOwotCQlkaWItPnBpZF9wYXJzZSA9IHBpZF9wYXJzZTsKLQkJZGliLT5yY19rZXlfcmVwZWF0X2NvdW50ID0gcmNfa2V5X3JlcGVhdF9jb3VudDsKLQotCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRpYik7Ci0JCQotCQlyZXQgPSBkaWJ1c2JfaW5pdChkaWIpOwotCX0KLQkKLQlpZiAocmV0ID09IDApCi0JCWluZm8oIiVzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhbmQgY29ubmVjdGVkLiIsZGliZGV2LT5uYW1lKTsKLQllbHNlIAotCQlpbmZvKCIlcyBlcnJvciB3aGlsZSBsb2FkaW5nIGRyaXZlciAoJWQpIixkaWJkZXYtPm5hbWUscmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBkaWJ1c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQljb25zdCBjaGFyICpuYW1lID0gRFJJVkVSX0RFU0M7Ci0JCi0JdXNiX3NldF9pbnRmZGF0YShpbnRmLE5VTEwpOwotCWlmIChkaWIgIT0gTlVMTCAmJiBkaWItPmRpYmRldiAhPSBOVUxMKSB7Ci0JCW5hbWUgPSBkaWItPmRpYmRldi0+bmFtZTsKLQkJZGlidXNiX2V4aXQoZGliKTsKLQl9Ci0JaW5mbygiJXMgc3VjY2Vzc2Z1bGx5IGRlaW5pdGlhbGl6ZWQgYW5kIGRpc2Nvbm5lY3RlZC4iLG5hbWUpOwotCQotfQotCi0vKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCi1zdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZGlidXNiX2RyaXZlciA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gRFJJVkVSX0RFU0MsCi0JLnByb2JlIAkJPSBkaWJ1c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSBkaWJ1c2JfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUgCT0gZGliX3RhYmxlLAotfTsKLQotLyogbW9kdWxlIHN0dWZmICovCi1zdGF0aWMgaW50IF9faW5pdCB1c2JfZGlidXNiX2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZkaWJ1c2JfZHJpdmVyKSkpIHsKLQkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2RpYnVzYl9leGl0KHZvaWQpCi17Ci0JLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCi0JdXNiX2RlcmVnaXN0ZXIoJmRpYnVzYl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCAodXNiX2RpYnVzYl9pbml0KTsKLW1vZHVsZV9leGl0ICh1c2JfZGlidXNiX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwotTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZHZiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGI0MzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZHZiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIGR2Yi1kaWJ1c2ItZHZiLmMgaXMgcGFydCBvZiB0aGUgZHJpdmVyIGZvciBtb2JpbGUgVVNCIEJ1ZGdldCBEVkItVCBkZXZpY2VzIAotICogYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbiBtYWRlIGJ5IERpQmNvbSAoaHR0cDovL3d3dy5kaWJjb20uZnIvKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQotICoKLSAqIHNlZSBkdmItZGlidXNiLWNvcmUuYyBmb3IgbW9yZSBjb3B5cmlnaHQgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBpbml0aWFsaXppbmcgYW5kIGhhbmRsaW5nIHRoZSAKLSAqIGxpbnV4LWR2YiBBUEkuCi0gKi8KLSNpbmNsdWRlICJkdmItZGlidXNiLmgiCi0KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLXN0YXRpYyB1MzIgdXJiX2NvbXBsX2NvdW50OwotCi0vKgotICogTVBFRzIgVFMgRFZCIHN0dWZmIAotICovCi12b2lkIGRpYnVzYl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHRyZWdzKQotewotCXN0cnVjdCB1c2JfZGlidXNiICpkaWIgPSB1cmItPmNvbnRleHQ7Ci0KLQlkZWJfdHMoInVyYiBjb21wbGV0ZSBmZWVkY291bnQ6ICVkLCBzdGF0dXM6ICVkLCBsZW5ndGg6ICVkXG4iLGRpYi0+ZmVlZGNvdW50LHVyYi0+c3RhdHVzLAotCQkJdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCXVyYl9jb21wbF9jb3VudCsrOwotCWlmICh1cmJfY29tcGxfY291bnQgJSAxMDAwID09IDApCi0JCWRlYl9pbmZvKCIlZCB1cmJzIGNvbXBsZXRlZCBzbyBmYXIuXG4iLHVyYl9jb21wbF9jb3VudCk7Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JCWNhc2UgMDogICAgICAgICAvKiBzdWNjZXNzICovCi0JCWNhc2UgLUVUSU1FRE9VVDogICAgLyogTkFLICovCi0JCQlicmVhazsKLQkJY2FzZSAtRUNPTk5SRVNFVDogICAvKiBraWxsICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJY2FzZSAtRVNIVVRET1dOOgotCQkJcmV0dXJuOwotCQlkZWZhdWx0OiAgICAgICAgLyogZXJyb3IgKi8KLQkJCWRlYl90cygidXJiIGNvbXBsZXRpdGlvbiBlcnJvciAlZC4iLCB1cmItPnN0YXR1cyk7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAoZGliLT5mZWVkY291bnQgPiAwICYmIHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKLQkJaWYgKGRpYi0+aW5pdF9zdGF0ZSAmIERJQlVTQl9TVEFURV9EVkIpCi0JCQlkdmJfZG14X3N3ZmlsdGVyKCZkaWItPmRlbXV4LCAodTgqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcix1cmItPmFjdHVhbF9sZW5ndGgpOwotCX0gZWxzZSAKLQkJZGViX3RzKCJVUkIgZHJvcHBlZCBiZWNhdXNlIG9mIGZlZWRjb3VudC5cbiIpOwotCi0JdXNiX3N1Ym1pdF91cmIodXJiLEdGUF9BVE9NSUMpOwotfQotCi1zdGF0aWMgaW50IGRpYnVzYl9jdHJsX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkLCBpbnQgb25vZmYpIAotewotCXN0cnVjdCB1c2JfZGlidXNiICpkaWIgPSBkdmJkbXhmZWVkLT5kZW11eC0+cHJpdjsKLQlpbnQgbmV3ZmVlZGNvdW50OwotCQotCWlmIChkaWIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQluZXdmZWVkY291bnQgPSBkaWItPmZlZWRjb3VudCArIChvbm9mZiA/IDEgOiAtMSk7Ci0KLQkvKiAKLQkgKiBzdG9wIGZlZWQgYmVmb3JlIHNldHRpbmcgYSBuZXcgcGlkIGlmIHRoZXJlIHdpbGwgYmUgbm8gcGlkIGFueW1vcmUgCi0JICovCi0JaWYgKG5ld2ZlZWRjb3VudCA9PSAwKSB7Ci0JCWRlYl90cygic3RvcCBmZWVkaW5nXG4iKTsKLQkJaWYgKGRpYi0+eGZlcl9vcHMuZmlmb19jdHJsICE9IE5VTEwpIHsKLQkJCWlmIChkaWItPnhmZXJfb3BzLmZpZm9fY3RybChkaWItPmZlLDApKSB7Ci0JCQkJZXJyKCJlcnJvciB3aGlsZSBpbmhpYml0aW5nIGZpZm8uIik7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQl9Ci0JCX0KLQkJZGlidXNiX3N0cmVhbWluZyhkaWIsMCk7Ci0JfQotCQotCWRpYi0+ZmVlZGNvdW50ID0gbmV3ZmVlZGNvdW50OwotCi0JLyogYWN0aXZhdGUgdGhlIHBpZCBvbiB0aGUgZGV2aWNlIHNwZWNpZmljIHBpZF9maWx0ZXIgKi8KLQlkZWJfdHMoInNldHRpbmcgcGlkOiAlNWQgJTA0eCBhdCBpbmRleCAlZCAnJXMnXG4iLGR2YmRteGZlZWQtPnBpZCxkdmJkbXhmZWVkLT5waWQsZHZiZG14ZmVlZC0+aW5kZXgsb25vZmYgPyAib24iIDogIm9mZiIpOwotCWlmIChkaWItPnBpZF9wYXJzZSAmJiBkaWItPnhmZXJfb3BzLnBpZF9jdHJsICE9IE5VTEwpCi0JCWRpYi0+eGZlcl9vcHMucGlkX2N0cmwoZGliLT5mZSxkdmJkbXhmZWVkLT5pbmRleCxkdmJkbXhmZWVkLT5waWQsb25vZmYpOwotCi0JLyogCi0JICogc3RhcnQgdGhlIGZlZWQgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IHBpZCB0byBzZXQgYW5kIHRoZXJlIGlzIHN0aWxsIGEgcGlkCi0JICogZm9yIHJlY2VwdGlvbi4KLQkgKi8KLQlpZiAoZGliLT5mZWVkY291bnQgPT0gb25vZmYgJiYgZGliLT5mZWVkY291bnQgPiAwKSB7Ci0KLQkJZGViX3RzKCJjb250cm9sbGluZyBwaWQgcGFyc2VyXG4iKTsKLQkJaWYgKGRpYi0+eGZlcl9vcHMucGlkX3BhcnNlICE9IE5VTEwpIHsKLQkJCWlmIChkaWItPnhmZXJfb3BzLnBpZF9wYXJzZShkaWItPmZlLGRpYi0+cGlkX3BhcnNlKSA8IDApIHsKLQkJCQllcnIoImNvdWxkIG5vdCBoYW5kbGUgcGlkX3BhcnNlciIpOwotCQkJfQotCQl9Ci0JCQotCQlkZWJfdHMoInN0YXJ0IGZlZWRpbmdcbiIpOwotCQlpZiAoZGliLT54ZmVyX29wcy5maWZvX2N0cmwgIT0gTlVMTCkgewotCQkJaWYgKGRpYi0+eGZlcl9vcHMuZmlmb19jdHJsKGRpYi0+ZmUsMSkpIHsKLQkJCQllcnIoImVycm9yIHdoaWxlIGVuYWJsaW5nIGZpZm8uIik7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQl9Ci0JCX0KLQkJZGlidXNiX3N0cmVhbWluZyhkaWIsMSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRpYnVzYl9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKLXsKLQlkZWJfdHMoInN0YXJ0IHBpZDogMHglMDR4LCBmZWVkdHlwZTogJWRcbiIsIGR2YmRteGZlZWQtPnBpZCxkdmJkbXhmZWVkLT50eXBlKTsKLQlyZXR1cm4gZGlidXNiX2N0cmxfZmVlZChkdmJkbXhmZWVkLDEpOwotfQotCi1zdGF0aWMgaW50IGRpYnVzYl9zdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQotewotCWRlYl90cygic3RvcCBwaWQ6IDB4JTA0eCwgZmVlZHR5cGU6ICVkXG4iLCBkdmJkbXhmZWVkLT5waWQsIGR2YmRteGZlZWQtPnR5cGUpOwotCXJldHVybiBkaWJ1c2JfY3RybF9mZWVkKGR2YmRteGZlZWQsMCk7Ci19Ci0KLWludCBkaWJ1c2JfZHZiX2luaXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpbnQgcmV0OwotCi0JdXJiX2NvbXBsX2NvdW50ID0gMDsKLQotCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmRpYi0+YWRhcHRlciwgRFJJVkVSX0RFU0MsCi0JCQlUSElTX01PRFVMRSkpIDwgMCkgewotCQlkZWJfaW5mbygiZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgZmFpbGVkOiBlcnJvciAlZCIsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlkaWItPmFkYXB0ZXIucHJpdiA9IGRpYjsKLQkKLS8qIGkyYyBpcyBkb25lIGluIGRpYnVzYl9pMmNfaW5pdCAqLwotCQotCWRpYi0+ZGVtdXguZG14LmNhcGFiaWxpdGllcyA9IERNWF9UU19GSUxURVJJTkcgfCBETVhfU0VDVElPTl9GSUxURVJJTkc7Ci0KLQlkaWItPmRlbXV4LnByaXYgPSAodm9pZCAqKWRpYjsKLQkvKiBnZXQgcGlkY291bnQgZnJvbSBkZW1vZCAqLwotCWRpYi0+ZGVtdXguZmVlZG51bSA9IGRpYi0+ZGVtdXguZmlsdGVybnVtID0gMjU1OwotCWRpYi0+ZGVtdXguc3RhcnRfZmVlZCA9IGRpYnVzYl9zdGFydF9mZWVkOwotCWRpYi0+ZGVtdXguc3RvcF9mZWVkID0gZGlidXNiX3N0b3BfZmVlZDsKLQlkaWItPmRlbXV4LndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOwotCWlmICgocmV0ID0gZHZiX2RteF9pbml0KCZkaWItPmRlbXV4KSkgPCAwKSB7Ci0JCWVycigiZHZiX2RteF9pbml0IGZhaWxlZDogZXJyb3IgJWQiLHJldCk7Ci0JCWdvdG8gZXJyX2RteDsKLQl9Ci0KLQlkaWItPmRteGRldi5maWx0ZXJudW0gPSBkaWItPmRlbXV4LmZpbHRlcm51bTsKLQlkaWItPmRteGRldi5kZW11eCA9ICZkaWItPmRlbXV4LmRteDsKLQlkaWItPmRteGRldi5jYXBhYmlsaXRpZXMgPSAwOwotCWlmICgocmV0ID0gZHZiX2RteGRldl9pbml0KCZkaWItPmRteGRldiwgJmRpYi0+YWRhcHRlcikpIDwgMCkgewotCQllcnIoImR2Yl9kbXhkZXZfaW5pdCBmYWlsZWQ6IGVycm9yICVkIixyZXQpOwotCQlnb3RvIGVycl9kbXhfZGV2OwotCX0KLQotCWR2Yl9uZXRfaW5pdCgmZGliLT5hZGFwdGVyLCAmZGliLT5kdmJfbmV0LCAmZGliLT5kZW11eC5kbXgpOwotCi0JZ290byBzdWNjZXNzOwotZXJyX2RteF9kZXY6Ci0JZHZiX2RteF9yZWxlYXNlKCZkaWItPmRlbXV4KTsKLWVycl9kbXg6Ci0JZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZGliLT5hZGFwdGVyKTsKLWVycjoKLQlyZXR1cm4gcmV0Owotc3VjY2VzczoKLQlkaWItPmluaXRfc3RhdGUgfD0gRElCVVNCX1NUQVRFX0RWQjsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGRpYnVzYl9kdmJfZXhpdChzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliKQotewotCWlmIChkaWItPmluaXRfc3RhdGUgJiBESUJVU0JfU1RBVEVfRFZCKSB7Ci0JCWRpYi0+aW5pdF9zdGF0ZSAmPSB+RElCVVNCX1NUQVRFX0RWQjsKLQkJZGViX2luZm8oInVucmVnaXN0ZXJpbmcgRFZCIHBhcnRcbiIpOwotCQlkdmJfbmV0X3JlbGVhc2UoJmRpYi0+ZHZiX25ldCk7Ci0JCWRpYi0+ZGVtdXguZG14LmNsb3NlKCZkaWItPmRlbXV4LmRteCk7Ci0JCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZGliLT5kbXhkZXYpOwotCQlkdmJfZG14X3JlbGVhc2UoJmRpYi0+ZGVtdXgpOwotCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkaWItPmFkYXB0ZXIpOwotCX0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLWZlLWkyYy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmUtaTJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzFiODguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmUtaTJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODIgKzAsMCBAQAotLyoKLSAqIGR2Yi1kaWJ1c2ItZmUtaTJjLmMgaXMgcGFydCBvZiB0aGUgZHJpdmVyIGZvciBtb2JpbGUgVVNCIEJ1ZGdldCBEVkItVCBkZXZpY2VzCi0gKiBiYXNlZCBvbiByZWZlcmVuY2UgZGVzaWduIG1hZGUgYnkgRGlCY29tIChodHRwOi8vd3d3LmRpYmNvbS5mci8pCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCi0gKgotICogc2VlIGR2Yi1kaWJ1c2ItY29yZS5jIGZvciBtb3JlIGNvcHlyaWdodCBkZXRhaWxzLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGF0dGFjaGluZywgaW5pdGlhbGl6aW5nIG9mIGFuIGFwcHJvcHJpYXRlCi0gKiBkZW1vZHVsYXRvci9mcm9udGVuZC4gSTJDLXN0dWZmIGlzIGFsc28gbG9jYXRlZCBoZXJlLgotICoKLSAqLwotI2luY2x1ZGUgImR2Yi1kaWJ1c2IuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotCi1zdGF0aWMgaW50IGRpYnVzYl9pMmNfbXNnKHN0cnVjdCB1c2JfZGlidXNiICpkaWIsIHU4IGFkZHIsCi0JCQkgIHU4ICp3YnVmLCB1MTYgd2xlbiwgdTggKnJidWYsIHUxNiBybGVuKQotewotCXU4IHNuZGJ1Zlt3bGVuKzRdOyAvKiBsZWFkKDEpIGRldmFkZHIsZGlyZWN0aW9uKDEpIGFkZHIoMikgZGF0YSh3bGVuKSAobGVuKDIpICh3aGVuIHJlYWRpbmcpKSAqLwotCS8qIHdyaXRlIG9ubHkgPyAqLwotCWludCB3byA9IChyYnVmID09IE5VTEwgfHwgcmxlbiA9PSAwKSwKLQkJbGVuID0gMiArIHdsZW4gKyAod28gPyAwIDogMik7Ci0KLQlzbmRidWZbMF0gPSB3byA/IERJQlVTQl9SRVFfSTJDX1dSSVRFIDogRElCVVNCX1JFUV9JMkNfUkVBRDsKLQlzbmRidWZbMV0gPSAoYWRkciA8PCAxKSB8ICh3byA/IDAgOiAxKTsKLQotCW1lbWNweSgmc25kYnVmWzJdLHdidWYsd2xlbik7Ci0KLQlpZiAoIXdvKSB7Ci0JCXNuZGJ1Zlt3bGVuKzJdID0gKHJsZW4gPj4gOCkgJiAweGZmOwotCQlzbmRidWZbd2xlbiszXSA9IHJsZW4gJiAweGZmOwotCX0KLQotCXJldHVybiBkaWJ1c2JfcmVhZHdyaXRlX3VzYihkaWIsc25kYnVmLGxlbixyYnVmLHJsZW4pOwotfQotCi0vKgotICogSTJDIG1hc3RlciB4ZmVyIGZ1bmN0aW9uCi0gKi8KLXN0YXRpYyBpbnQgZGlidXNiX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCxzdHJ1Y3QgaTJjX21zZyAqbXNnLGludCBudW0pCi17Ci0Jc3RydWN0IHVzYl9kaWJ1c2IgKmRpYiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Ci0JaW50IGk7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkaWItPmkyY19zZW0pIDwgMCkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlpZiAobnVtID4gMikKLQkJd2FybigibW9yZSB0aGFuIDIgaTJjIG1lc3NhZ2VzIGF0IGEgdGltZSBpcyBub3QgaGFuZGxlZCB5ZXQuIFRPRE8uIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJLyogd3JpdGUvcmVhZCByZXF1ZXN0ICovCi0JCWlmIChpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7Ci0JCQlpZiAoZGlidXNiX2kyY19tc2coZGliLCBtc2dbaV0uYWRkciwgbXNnW2ldLmJ1Zixtc2dbaV0ubGVuLAotCQkJCQkJbXNnW2krMV0uYnVmLG1zZ1tpKzFdLmxlbikgPCAwKQotCQkJCWJyZWFrOwotCQkJaSsrOwotCQl9IGVsc2UKLQkJCWlmIChkaWJ1c2JfaTJjX21zZyhkaWIsIG1zZ1tpXS5hZGRyLCBtc2dbaV0uYnVmLG1zZ1tpXS5sZW4sTlVMTCwwKSA8IDApCi0JCQkJYnJlYWs7Ci0JfQotCi0JdXAoJmRpYi0+aTJjX3NlbSk7Ci0JcmV0dXJuIGk7Ci19Ci0KLXN0YXRpYyB1MzIgZGlidXNiX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gSTJDX0ZVTkNfSTJDOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gZGlidXNiX2FsZ28gPSB7Ci0JLm5hbWUJCQk9ICJEaUJjb20gVVNCIGkyYyBhbGdvcml0aG0iLAotCS5pZAkJCQk9IEkyQ19BTEdPX0JJVCwKLQkubWFzdGVyX3hmZXIJPSBkaWJ1c2JfaTJjX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkJPSBkaWJ1c2JfaTJjX2Z1bmMsCi19OwotCi1zdGF0aWMgaW50IGRpYnVzYl9nZW5lcmFsX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpOwotc3RhdGljIHU4IGRpYnVzYl9nZW5lcmFsX3BsbF9hZGRyKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKLXN0YXRpYyBpbnQgZGlidXNiX2dlbmVyYWxfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IHBsbF9idWZbNV0pOwotc3RhdGljIGludCBkaWJ1c2JfZ2VuZXJhbF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTggcGxsX2J1Zls1XSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIG10MzUyX2hhbmZ0ZWtfdW10XzAxMF9jb25maWcgPSB7Ci0JLmRlbW9kX2FkZHJlc3MgPSAweDFlLAotCS5kZW1vZF9pbml0ID0gZGlidXNiX2dlbmVyYWxfZGVtb2RfaW5pdCwKLQkucGxsX3NldCA9IGRpYnVzYl9nZW5lcmFsX3BsbF9zZXQsCi19OwotCi1zdGF0aWMgaW50IGRpYnVzYl90dW5lcl9xdWlyayhzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliKQotewotCXN3aXRjaCAoZGliLT5kaWJkZXYtPmRldl9jbC0+aWQpIHsKLQkJY2FzZSBESUJVU0IxXzE6IC8qIHNvbWUgdGhlc2UgZGV2aWNlIGhhdmUgdGhlIEVOVjc3SDExRDUgYW5kIHNvbWUgdGhlIFRIT01TT04gQ0FCTEUgKi8KLQkJY2FzZSBESUJVU0IxXzFfQU4yMjM1OiB7IC8qIGFjdHVhbGx5IGl0cyB0aGlzIGRldmljZSwgYnV0IGluIHdhcm0gc3RhdGUgdGhleSBhcmUgaW5kaXN0aW5ndWlzaGFibGUgKi8KLQkJCXN0cnVjdCBkaWJ1c2JfdHVuZXIgKnQ7Ci0JCQl1OCBiWzJdID0geyAwLDAgfSAsYjJbMV07Ci0JCQlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7Ci0JCQkJeyAuZmxhZ3MgPSAwLCAuYnVmID0gYiwgLmxlbiA9IDIgfSwKLQkJCQl7IC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYjIsIC5sZW4gPSAxfSwKLQkJCX07Ci0KLQkJCXQgPSAmZGlidXNiX3R1bmVyW0RJQlVTQl9UVU5FUl9DT0ZETV9QQU5BU09OSUNfRU5WNzdIMTFENV07Ci0KLQkJCW1zZ1swXS5hZGRyID0gbXNnWzFdLmFkZHIgPSB0LT5wbGxfYWRkcjsKLQotCQkJaWYgKGRpYi0+eGZlcl9vcHMudHVuZXJfcGFzc19jdHJsICE9IE5VTEwpCi0JCQkJZGliLT54ZmVyX29wcy50dW5lcl9wYXNzX2N0cmwoZGliLT5mZSwxLHQtPnBsbF9hZGRyKTsKLQkJCWRpYnVzYl9pMmNfeGZlcigmZGliLT5pMmNfYWRhcCxtc2csMik7Ci0JCQlpZiAoZGliLT54ZmVyX29wcy50dW5lcl9wYXNzX2N0cmwgIT0gTlVMTCkKLQkJCQlkaWItPnhmZXJfb3BzLnR1bmVyX3Bhc3NfY3RybChkaWItPmZlLDAsdC0+cGxsX2FkZHIpOwotCi0JCQlpZiAoYjJbMF0gPT0gMHhmZSkKLQkJCQlpbmZvKCJ0aGlzIGRldmljZSBoYXMgdGhlIFRob21zb24gQ2FibGUgb25ib2FyZC4gV2hpY2ggaXMgZGVmYXVsdC4iKTsKLQkJCWVsc2UgewotCQkJCWRpYi0+dHVuZXIgPSB0OwotCQkJCWluZm8oInRoaXMgZGV2aWNlIGhhcyB0aGUgUGFuYXNvbmljIEVOVjc3SDExRDUgb25ib2FyZC4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2JfZmVfaW5pdChzdHJ1Y3QgdXNiX2RpYnVzYiogZGliKQotewotCXN0cnVjdCBkaWIzMDAwX2NvbmZpZyBkZW1vZF9jZmc7Ci0JaW50IGk7Ci0KLQlpZiAoZGliLT5pbml0X3N0YXRlICYgRElCVVNCX1NUQVRFX0kyQykgewotCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRpYi0+ZGliZGV2LT5kZXZfY2wtPmRlbW9kLT5pMmNfYWRkcnMpIC8gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICYmCi0JCQkJZGliLT5kaWJkZXYtPmRldl9jbC0+ZGVtb2QtPmkyY19hZGRyc1tpXSAhPSAwOyBpKyspIHsKLQotCQkJZGVtb2RfY2ZnLmRlbW9kX2FkZHJlc3MgPSBkaWItPmRpYmRldi0+ZGV2X2NsLT5kZW1vZC0+aTJjX2FkZHJzW2ldOwotCQkJZGVtb2RfY2ZnLnBsbF9hZGRyID0gZGlidXNiX2dlbmVyYWxfcGxsX2FkZHI7Ci0JCQlkZW1vZF9jZmcucGxsX3NldCA9IGRpYnVzYl9nZW5lcmFsX3BsbF9zZXQ7Ci0JCQlkZW1vZF9jZmcucGxsX2luaXQgPSBkaWJ1c2JfZ2VuZXJhbF9wbGxfaW5pdDsKLQotCQkJZGViX2luZm8oImRlbW9kIGlkOiAlZCAlZFxuIixkaWItPmRpYmRldi0+ZGV2X2NsLT5kZW1vZC0+aWQsRFRUMjAwVV9GRSk7Ci0KLQkJCXN3aXRjaCAoZGliLT5kaWJkZXYtPmRldl9jbC0+ZGVtb2QtPmlkKSB7Ci0JCQkJY2FzZSBESUJVU0JfRElCMzAwME1COgotCQkJCQlkaWItPmZlID0gZGliMzAwMG1iX2F0dGFjaCgmZGVtb2RfY2ZnLCZkaWItPmkyY19hZGFwLCZkaWItPnhmZXJfb3BzKTsKLQkJCQlicmVhazsKLQkJCQljYXNlIERJQlVTQl9ESUIzMDAwTUM6Ci0JCQkJCWRpYi0+ZmUgPSBkaWIzMDAwbWNfYXR0YWNoKCZkZW1vZF9jZmcsJmRpYi0+aTJjX2FkYXAsJmRpYi0+eGZlcl9vcHMpOwotCQkJCWJyZWFrOwotCQkJCWNhc2UgRElCVVNCX01UMzUyOgotCQkJCQltdDM1Ml9oYW5mdGVrX3VtdF8wMTBfY29uZmlnLmRlbW9kX2FkZHJlc3MgPSBkaWItPmRpYmRldi0+ZGV2X2NsLT5kZW1vZC0+aTJjX2FkZHJzW2ldOwotCQkJCQlkaWItPmZlID0gbXQzNTJfYXR0YWNoKCZtdDM1Ml9oYW5mdGVrX3VtdF8wMTBfY29uZmlnLCAmZGliLT5pMmNfYWRhcCk7Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSBEVFQyMDBVX0ZFOgotCQkJCQlkaWItPmZlID0gZHR0MjAwdV9mZV9hdHRhY2goZGliLCZkaWItPnhmZXJfb3BzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChkaWItPmZlICE9IE5VTEwpIHsKLQkJCQlpbmZvKCJmb3VuZCBkZW1vZHVsYXRvciBhdCBpMmMgYWRkcmVzcyAweCV4IixkaWItPmRpYmRldi0+ZGV2X2NsLT5kZW1vZC0+aTJjX2FkZHJzW2ldKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBpZiBhIGZyb250ZW5kIHdhcyBmb3VuZCAqLwotCQlpZiAoZGliLT5mZSAhPSBOVUxMKSB7Ci0JCQlpZiAoZGliLT5mZS0+b3BzLT5zbGVlcCAhPSBOVUxMKQotCQkJCWRpYi0+ZmVfc2xlZXAgPSBkaWItPmZlLT5vcHMtPnNsZWVwOwotCQkJZGliLT5mZS0+b3BzLT5zbGVlcCA9IGRpYnVzYl9od19zbGVlcDsKLQotCQkJaWYgKGRpYi0+ZmUtPm9wcy0+aW5pdCAhPSBOVUxMICkKLQkJCQlkaWItPmZlX2luaXQgPSBkaWItPmZlLT5vcHMtPmluaXQ7Ci0JCQlkaWItPmZlLT5vcHMtPmluaXQgPSBkaWJ1c2JfaHdfd2FrZXVwOwotCi0JCQkvKiBzZXR0aW5nIHRoZSBkZWZhdWx0IHR1bmVyICovCi0JCQlkaWItPnR1bmVyID0gZGliLT5kaWJkZXYtPmRldl9jbC0+dHVuZXI7Ci0KLQkJCS8qIGNoZWNrIHdoaWNoIHR1bmVyIGlzIG1vdW50ZWQgb24gdGhpcyBkZXZpY2UsIGluIGNhc2UgdGhpcyBpcyB1bnN1cmUgKi8KLQkJCWRpYnVzYl90dW5lcl9xdWlyayhkaWIpOwotCQl9Ci0JfQotCWlmIChkaWItPmZlID09IE5VTEwpIHsKLQkJZXJyKCJBIGZyb250ZW5kIGRyaXZlciB3YXMgbm90IGZvdW5kIGZvciBkZXZpY2UgJyVzJy4iLAotCQkgICAgICAgZGliLT5kaWJkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UgewotCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZkaWItPmFkYXB0ZXIsIGRpYi0+ZmUpKSB7Ci0JCQllcnIoIkZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQuIik7Ci0JCQlpZiAoZGliLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCWRpYi0+ZmUtPm9wcy0+cmVsZWFzZShkaWItPmZlKTsKLQkJCWRpYi0+ZmUgPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRpYnVzYl9mZV9leGl0KHN0cnVjdCB1c2JfZGlidXNiICpkaWIpCi17Ci0JaWYgKGRpYi0+ZmUgIT0gTlVMTCkKLQkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoZGliLT5mZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2JfaTJjX2luaXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWRpYi0+YWRhcHRlci5wcml2ID0gZGliOwotCi0Jc3RybmNweShkaWItPmkyY19hZGFwLm5hbWUsZGliLT5kaWJkZXYtPm5hbWUsSTJDX05BTUVfU0laRSk7Ci0jaWZkZWYgSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTAotCWRpYi0+aTJjX2FkYXAuY2xhc3MgPSBJMkNfQURBUF9DTEFTU19UVl9ESUdJVEFMLAotI2Vsc2UKLQlkaWItPmkyY19hZGFwLmNsYXNzID0gSTJDX0NMQVNTX1RWX0RJR0lUQUwsCi0jZW5kaWYKLQlkaWItPmkyY19hZGFwLmFsZ28JCT0gJmRpYnVzYl9hbGdvOwotCWRpYi0+aTJjX2FkYXAuYWxnb19kYXRhID0gTlVMTDsKLQlkaWItPmkyY19hZGFwLmlkCQk9IEkyQ19BTEdPX0JJVDsKLQotCWkyY19zZXRfYWRhcGRhdGEoJmRpYi0+aTJjX2FkYXAsIGRpYik7Ci0KLQlpZiAoKHJldCA9IGkyY19hZGRfYWRhcHRlcigmZGliLT5pMmNfYWRhcCkpIDwgMCkKLQkJZXJyKCJjb3VsZCBub3QgYWRkIGkyYyBhZGFwdGVyIik7Ci0KLQlkaWItPmluaXRfc3RhdGUgfD0gRElCVVNCX1NUQVRFX0kyQzsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBkaWJ1c2JfaTJjX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpZiAoZGliLT5pbml0X3N0YXRlICYgRElCVVNCX1NUQVRFX0kyQykKLQkJaTJjX2RlbF9hZGFwdGVyKCZkaWItPmkyY19hZGFwKTsKLQlkaWItPmluaXRfc3RhdGUgJj0gfkRJQlVTQl9TVEFURV9JMkM7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogcGxsIHN0dWZmLCBtYXliZSByZW1vdmVkIHNvb24gKHRoeCB0byBHZXJkL0FuZHJldyBpbiBhZHZhbmNlKSAqLwotc3RhdGljIGludCB0aG9tc29uX2NhYmxlX2V1X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXAsIHU4IHBsbGJ1Zls0XSkKLXsKLQl1MzIgdGZyZXEgPSAoZmVwLT5mcmVxdWVuY3kgKyAzNjEyNTAwMCkgLyA2MjUwMDsKLQlpbnQgdnUscDAscDEscDI7Ci0KLQlpZiAoZmVwLT5mcmVxdWVuY3kgPiA0MDMyNTAwMDApCi0JCXZ1ID0gMSwgcDIgPSAxLCBwMSA9IDAsIHAwID0gMTsKLQllbHNlIGlmIChmZXAtPmZyZXF1ZW5jeSA+IDExNTc1MDAwMCkKLQkJdnUgPSAwLCBwMiA9IDEsIHAxID0gMSwgcDAgPSAwOwotCWVsc2UgaWYgKGZlcC0+ZnJlcXVlbmN5ID4gNDQyNTAwMDApCi0JCXZ1ID0gMCwgcDIgPSAwLCBwMSA9IDEsIHAwID0gMTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcGxsYnVmWzBdID0gKHRmcmVxID4+IDgpICYgMHg3ZjsKLQlwbGxidWZbMV0gPSB0ZnJlcSAmIDB4ZmY7Ci0JcGxsYnVmWzJdID0gMHg4ZTsKLQlwbGxidWZbM10gPSAodnUgPDwgNykgfCAocDIgPDwgMikgfCAocDEgPDwgMSkgfCBwMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwYW5hc29uaWNfY29mZG1fZW52NTdoMXhkNV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwLCB1OCBwbGxidWZbNF0pCi17Ci0JdTMyIGZyZXFfa2h6ID0gZmVwLT5mcmVxdWVuY3kgLyAxMDAwOwotCXUzMiB0ZnJlcSA9ICgoZnJlcV9raHogKyAzNjEyNSkqNiArIDUwMCkgLyAxMDAwOwotCXU4IFRBLCBUMjEwLCBSMjEwLCBjdHJsMSwgY3AyMTAsIHA0MzIxOwotCWlmIChmcmVxX2toeiA+IDg1ODAwMCkgewotCQllcnIoImZyZXF1ZW5jeSBjYW5ub3QgYmUgbGFyZ2VyIHRoYW4gODU4IE1Iei4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLy8gY29udG9sIGRhdGEgMSA6IDEgfCBUL0E9MSB8IFQyLFQxLFQwID0gMCwwLDAgfCBSMixSMSxSMCA9IDAsMSwwCi0JVEEgPSAxOwotCVQyMTAgPSAwOwotCVIyMTAgPSAweDI7Ci0JY3RybDEgPSAoMSA8PCA3KSB8IChUQSA8PCA2KSB8IChUMjEwIDw8IDMpIHwgUjIxMDsKLQotLy8gKioqKioqKiogICAgQ0hBUkdFIFBVTVAgQ09ORklHIHZzIFJGIEZSRVFVRU5DSUVTICAgICAqKioqKioqKioqKioqKioqKgotCWlmIChmcmVxX2toeiA8IDQ3MDAwMCkKLQkJY3AyMTAgPSAyOyAgLy8gVkhGIExvdyBhbmQgSGlnaCBiYW5kIGNoIEUxMiB0byBFNCB0byBFMTIKLQllbHNlIGlmIChmcmVxX2toeiA8IDUyNjAwMCkKLQkJY3AyMTAgPSA0OyAgLy8gVUhGIGJhbmQgQ2ggRTIxIHRvIEUyNwotCWVsc2UgLy8gaWYgKGZyZXEgPCA4NjIwMDAwMDApCi0JCWNwMjEwID0gNTsgIC8vIFVIRiBiYW5kIGNoIEUyOCB0byBFNjkKLQotLy8qKioqKioqKioqKioqKioqKioqKiogICAgQlcgc2VsZWN0ICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JaWYgKGZyZXFfa2h6IDwgMTUzMDAwKQotCQlwNDMyMSAgPSAxOyAvLyBCVyBzZWxlY3RlZCBmb3IgVkhGIGxvdwotCWVsc2UgaWYgKGZyZXFfa2h6IDwgNDcwMDAwKQotCQlwNDMyMSAgPSAyOyAvLyBCVyBzZWxlY3RlZCBmb3IgVkhGIGhpZ2ggRTUgdG8gRTEyCi0JZWxzZSAvLyBpZiAoZnJlcSA8IDg2MjAwMDAwMCkKLQkJcDQzMjEgID0gNDsgLy8gQlcgc2VsZWN0aW9uIGZvciBVSEYgRTIxIHRvIEU2OQotCi0JcGxsYnVmWzBdID0gKHRmcmVxID4+IDgpICYgMHhmZjsKLQlwbGxidWZbMV0gPSAodGZyZXEgPj4gMCkgJiAweGZmOwotCXBsbGJ1ZlsyXSA9IDB4ZmYgJiBjdHJsMTsKLQlwbGxidWZbM10gPSAgKGNwMjEwIDw8IDUpIHwgKHA0MzIxKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICoJCQkgICAgNwk2CQk1CTQJMwkyCTEJMAotICogQWRkcmVzcyBCeXRlICAgICAgICAgICAgIDEJMQkJMAkwCTAJTUExCU1BMAlSL35XPTAKLSAqCi0gKiBQcm9ncmFtIGRpdmlkZXIgYnl0ZSAxICAgMAluMTQJCW4xMwluMTIJbjExCW4xMAluOQluOAotICogUHJvZ3JhbSBkaXZpZGVyIGJ5dGUgMgluNwluNgkJbjUJbjQJbjMJbjIJbjEJbjAKLSAqCi0gKiBDb250cm9sIGJ5dGUgMSAgICAgICAgICAgMQlUL0E9MQlUMglUMQlUMAlSMglSMQlSMAotICogICAgICAgICAgICAgICAgICAgICAgICAgIDEJVC9BPTAJMAkwCUFUQwlBTDIJQUwxCUFMMAotICoKLSAqIENvbnRyb2wgYnl0ZSAyICAgICAgICAgICBDUDIJQ1AxCQlDUDAJQlM1CUJTNAlCUzMJQlMyCUJTMQotICoKLSAqIE1BMC8xID0gcHJvZ3JhbW1hYmxlIGFkZHJlc3MgYml0cwotICogUi9+VyAgPSByZWFkL3dyaXRlIGJpdCAoMCBmb3Igd3JpdGluZykKLSAqIE4xNC0wID0gcHJvZ3JhbW1hYmxlIExPIGZyZXF1ZW5jeQotICoKLSAqIFQvQSAgID0gdGVzdCBBR0MgYml0ICgwID0gbmV4dCA2IGJpdHMgQUdDIHNldHRpbmcsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgMSA9IG5leHQgNiBiaXRzIHRlc3QgYW5kIHJlZmVyZW5jZSBkaXZpZGVyIHJhdGlvIHNldHRpbmdzKQotICogVDItMCAgPSB0ZXN0IGJpdHMKLSAqIFIyLTAgID0gcmVmZXJlbmNlIGRpdmlkZXIgcmF0aW8gYW5kIHByb2dyYW1tYWJsZSBmcmVxdWVuY3kgc3RlcAotICogQVRDICAgPSBBR0MgY3VycmVudCBzZXR0aW5nIGFuZCB0aW1lIGNvbnN0YW50Ci0gKiAgICAgICAgIEFUQyA9IDA6IEFHQyBjdXJyZW50ID0gMjIwbkEsIEFHQyB0aW1lIGNvbnN0YW50ID0gMnMKLSAqICAgICAgICAgQVRDID0gMTogQUdDIGN1cnJlbnQgPSA5dUEsIEFHQyB0aW1lIGNvbnN0YW50ID0gNTBtcwotICogQUwyLTAgPSBBR0MgdGFrZS1vdmVyIHBvaW50IGJpdHMKLSAqIENQMi0wID0gY2hhcmdlIHB1bXAgY3VycmVudAotICogQlM1LTEgPSBQTU9TIHBvcnRzIGNvbnRyb2wgYml0czsKLSAqICAgICAgICAgICAgIEJTbiA9IDAgY29ycmVzcG9uZGluZyBwb3J0IGlzIG9mZiwgaGlnaC1pbXBlZGFuY2Ugc3RhdGUgKGF0IHBvd2VyLW9uKQotICogICAgICAgICAgICAgQlNuID0gMSBjb3JyZXNwb25kaW5nIHBvcnQgaXMgb24KLSAqLwotc3RhdGljIGludCBwYW5hc29uaWNfY29mZG1fZW52NzdoMTFkNV90ZGE2NjUwX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IHBsbGJ1Zls0XSkKLXsKLQlwbGxidWZbMF0gPSAweDBiOwotCXBsbGJ1ZlsxXSA9IDB4ZjU7Ci0JcGxsYnVmWzJdID0gMHg4NTsKLQlwbGxidWZbM10gPSAweGFiOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBhbmFzb25pY19jb2ZkbV9lbnY3N2gxMWQ1X3RkYTY2NTBfc2V0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCx1OCBwbGxidWZbNF0pCi17Ci0JaW50IHR1bmVyX2ZyZXF1ZW5jeSA9IDA7Ci0JdTggYmFuZCwgY3AsIGZpbHRlcjsKLQotCS8vIGRldGVybWluZSBjaGFyZ2UgcHVtcAotCXR1bmVyX2ZyZXF1ZW5jeSA9IGZlcC0+ZnJlcXVlbmN5ICsgMzYxNjYwMDA7Ci0JaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg3MDAwMDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxMzAwMDAwMDApCi0JCWNwID0gMzsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAxNjAwMDAwMDApCi0JCWNwID0gNTsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAyMDAwMDAwMDApCi0JCWNwID0gNjsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCAyOTAwMDAwMDApCi0JCWNwID0gMzsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0MjAwMDAwMDApCi0JCWNwID0gNTsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA0ODAwMDAwMDApCi0JCWNwID0gNjsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA2MjAwMDAwMDApCi0JCWNwID0gMzsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4MzAwMDAwMDApCi0JCWNwID0gNTsKLQllbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA4OTUwMDAwMDApCi0JCWNwID0gNzsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLy8gZGV0ZXJtaW5lIGJhbmQKLQlpZiAoZmVwLT5mcmVxdWVuY3kgPCA0OTAwMDAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZWxzZSBpZiAoZmVwLT5mcmVxdWVuY3kgPCAxNjEwMDAwMDApCi0JCWJhbmQgPSAxOwotCWVsc2UgaWYgKGZlcC0+ZnJlcXVlbmN5IDwgNDQ0MDAwMDAwKQotCQliYW5kID0gMjsKLQllbHNlIGlmIChmZXAtPmZyZXF1ZW5jeSA8IDg2MTAwMDAwMCkKLQkJYmFuZCA9IDQ7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8vIHNldHVwIFBMTCBmaWx0ZXIKLQlzd2l0Y2ggKGZlcC0+dS5vZmRtLmJhbmR3aWR0aCkgewotCQljYXNlIEJBTkRXSURUSF82X01IWjoKLQkJY2FzZSBCQU5EV0lEVEhfN19NSFo6Ci0JCQlmaWx0ZXIgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQkFORFdJRFRIXzhfTUhaOgotCQkJZmlsdGVyID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLy8gY2FsY3VsYXRlIGRpdmlzb3IKLQkvLyAoKDM2MTY2MDAwKygoMTAwMDAwMC82KS8yKSkgKyBGaW5wdXQpLygxMDAwMDAwLzYpCi0JdHVuZXJfZnJlcXVlbmN5ID0gKCgoZmVwLT5mcmVxdWVuY3kgLyAxMDAwKSAqIDYpICsgMjE3NDk2KSAvIDEwMDA7Ci0KLQkvLyBzZXR1cCB0dW5lciBidWZmZXIKLQlwbGxidWZbMF0gPSAodHVuZXJfZnJlcXVlbmN5ID4+IDgpICYgMHg3ZjsKLQlwbGxidWZbMV0gPSB0dW5lcl9mcmVxdWVuY3kgJiAweGZmOwotCXBsbGJ1ZlsyXSA9IDB4Y2E7Ci0JcGxsYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKgkJCSAgICA3CTYJNQk0CTMJMgkxCTAKLSAqIEFkZHJlc3MgQnl0ZSAgICAgICAgICAgICAxCTEJMAkwCTAJTUExCU1BMAlSL35XPTAKLSAqCi0gKiBQcm9ncmFtIGRpdmlkZXIgYnl0ZSAxICAgMAluMTQJbjEzCW4xMgluMTEJbjEwCW45CW44Ci0gKiBQcm9ncmFtIGRpdmlkZXIgYnl0ZSAyCW43CW42CW41CW40CW4zCW4yCW4xCW4wCi0gKgotICogQ29udHJvbCBieXRlICAgICAgICAgICAgIDEJQ1AJVDIJVDEJVDAJUlNBCVJTQglPUwotICoKLSAqIEJhbmQgU3dpdGNoIGJ5dGUgICAgICAgICBYCVgJWAlQNAlQMwlQMglQMQlQMAotICoKLSAqIEF1eGlsaWFyeSBieXRlICAgICAgICAgICBBVEMJQUwyCUFMMQlBTDAJMAkwCTAJMAotICoKLSAqIEFkZHJlc3M6IE1BMQlNQTAJQWRkcmVzcwotICogICAgICAgICAgMAkwCWMwCi0gKiAgICAgICAgICAwCTEJYzIgKGFsd2F5cyB2YWxpZCkKLSAqICAgICAgICAgIDEJMAljNAotICogICAgICAgICAgMQkxCWM2Ci0gKi8KLXN0YXRpYyBpbnQgbGdfdGR0cF9lMTAycF90dWE2MDM0KHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogZmVwLCB1OCBwbGxidWZbNF0pCi17Ci0JdTMyIGRpdjsKLQl1OCBwMjEwLCBwMzsKLQotI2RlZmluZSBUVU5FUl9NVUwgNjI1MDAKLQotCWRpdiA9IChmZXAtPmZyZXF1ZW5jeSArIDM2MTI1MDAwICsgVFVORVJfTVVMIC8gMikgLyBUVU5FUl9NVUw7Ci0vLwlkaXYgPSAoKGZlcC0+ZnJlcXVlbmN5LzEwMDAgKyAzNjE2NikgKiA2KSAvIDEwMDA7Ci0KLQlpZiAoZmVwLT5mcmVxdWVuY3kgPCAxNzQ1MDAwMDApCi0JCXAyMTAgPSAxOyAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZHRwX2UxMDJwCi0JZWxzZSBpZiAoZmVwLT5mcmVxdWVuY3kgPCAyMzAwMDAwMDApIC8vIFZIRgotCQlwMjEwID0gMjsKLQllbHNlCi0JCXAyMTAgPSA0OwotCi0JaWYgKGZlcC0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfN19NSFopCi0JCXAzID0gMDsKLQllbHNlCi0JCXAzID0gMTsKLQotCXBsbGJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwotCXBsbGJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JcGxsYnVmWzJdID0gMHhjZTsKLS8vCXBsbGJ1ZlsyXSA9IDB4Y2M7Ci0JcGxsYnVmWzNdID0gKHAzIDw8IDMpIHwgcDIxMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxnX3RkdHBfZTEwMnBfbXQzNTJfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdGF0aWMgdTggbXQzNTJfY2xvY2tfY29uZmlnW10gPSB7IDB4ODksIDB4YjgsIDB4MmQgfTsKLQlzdGF0aWMgdTggbXQzNTJfcmVzZXRbXSA9IHsgMHg1MCwgMHg4MCB9OwotCXN0YXRpYyB1OCBtdDM1Ml9tY2xrX3JhdGlvW10gPSB7IDB4OGIsIDB4MDAgfTsKLQlzdGF0aWMgdTggbXQzNTJfYWRjX2N0bF8xX2NmZ1tdID0geyAweDhFLCAweDQwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2FnY19jZmdbXSA9IHsgMHg2NywgMHgxMCwgMHhhMCB9OwotCi0Jc3RhdGljIHU4IG10MzUyX3NlY19hZ2NfY2ZnMVtdID0geyAweDZhLCAweGZmIH07Ci0Jc3RhdGljIHU4IG10MzUyX3NlY19hZ2NfY2ZnMltdID0geyAweDZkLCAweGZmIH07Ci0Jc3RhdGljIHU4IG10MzUyX3NlY19hZ2NfY2ZnM1tdID0geyAweDcwLCAweDQwIH07Ci0Jc3RhdGljIHU4IG10MzUyX3NlY19hZ2NfY2ZnNFtdID0geyAweDdiLCAweDAzIH07Ci0Jc3RhdGljIHU4IG10MzUyX3NlY19hZ2NfY2ZnNVtdID0geyAweDdkLCAweDBmIH07Ci0KLQlzdGF0aWMgdTggbXQzNTJfYWNxX2N0bFtdID0geyAweDUzLCAweDUwIH07Ci0Jc3RhdGljIHU4IG10MzUyX2lucHV0X2ZyZXFfMVtdID0geyAweDU2LCAweDMxLCAweDA2IH07Ci0KLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfY2xvY2tfY29uZmlnLCBzaXplb2YobXQzNTJfY2xvY2tfY29uZmlnKSk7Ci0JdWRlbGF5KDIwMDApOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9yZXNldCwgc2l6ZW9mKG10MzUyX3Jlc2V0KSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX21jbGtfcmF0aW8sIHNpemVvZihtdDM1Ml9tY2xrX3JhdGlvKSk7Ci0KLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWRjX2N0bF8xX2NmZywgc2l6ZW9mKG10MzUyX2FkY19jdGxfMV9jZmcpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWdjX2NmZywgc2l6ZW9mKG10MzUyX2FnY19jZmcpKTsKLQotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9zZWNfYWdjX2NmZzEsIHNpemVvZihtdDM1Ml9zZWNfYWdjX2NmZzEpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfc2VjX2FnY19jZmcyLCBzaXplb2YobXQzNTJfc2VjX2FnY19jZmcyKSk7Ci0JbXQzNTJfd3JpdGUoZmUsIG10MzUyX3NlY19hZ2NfY2ZnMywgc2l6ZW9mKG10MzUyX3NlY19hZ2NfY2ZnMykpOwotCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9zZWNfYWdjX2NmZzQsIHNpemVvZihtdDM1Ml9zZWNfYWdjX2NmZzQpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfc2VjX2FnY19jZmc1LCBzaXplb2YobXQzNTJfc2VjX2FnY19jZmc1KSk7Ci0KLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfYWNxX2N0bCwgc2l6ZW9mKG10MzUyX2FjcV9jdGwpKTsKLQltdDM1Ml93cml0ZShmZSwgbXQzNTJfaW5wdXRfZnJlcV8xLCBzaXplb2YobXQzNTJfaW5wdXRfZnJlcV8xKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkaWJ1c2JfZ2VuZXJhbF9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQotewotCXN0cnVjdCB1c2JfZGlidXNiKiBkaWIgPSAoc3RydWN0IHVzYl9kaWJ1c2IqKSBmZS0+ZHZiLT5wcml2OwotCXN3aXRjaCAoZGliLT5kaWJkZXYtPmRldl9jbC0+aWQpIHsKLQkJY2FzZSBVTVQyXzA6Ci0JCQlyZXR1cm4gbGdfdGR0cF9lMTAycF9tdDM1Ml9kZW1vZF9pbml0KGZlKTsKLQkJZGVmYXVsdDogLyogb3RoZXIgZGV2aWNlIGNsYXNzZXMgZG8gbm90IGhhdmUgZGV2aWNlIHNwZWNpZmljIGRlbW9kIGluaXRzICovCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBkaWJ1c2JfZ2VuZXJhbF9wbGxfYWRkcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3QgdXNiX2RpYnVzYiogZGliID0gKHN0cnVjdCB1c2JfZGlidXNiKikgZmUtPmR2Yi0+cHJpdjsKLQlyZXR1cm4gZGliLT50dW5lci0+cGxsX2FkZHI7Ci19Ci0KLXN0YXRpYyBpbnQgZGlidXNiX3BsbF9pMmNfaGVscGVyKHN0cnVjdCB1c2JfZGlidXNiICpkaWIsIHU4IHBsbF9idWZbNV0sIHU4IGJ1Zls0XSkKLXsKLQlpZiAocGxsX2J1ZiA9PSBOVUxMKSB7Ci0JCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsKLQkJCS5hZGRyID0gZGliLT50dW5lci0+cGxsX2FkZHIsCi0JCQkuZmxhZ3MgPSAwLAotCQkJLmJ1ZiA9IGJ1ZiwKLQkJCS5sZW4gPSBzaXplb2YoYnVmKQotCQl9OwotCQlpZiAoaTJjX3RyYW5zZmVyICgmZGliLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKLQkJCXJldHVybiAtRUlPOwotCQltc2xlZXAoMSk7Ci0JfSBlbHNlIHsKLQkJcGxsX2J1ZlswXSA9IGRpYi0+dHVuZXItPnBsbF9hZGRyIDw8IDE7Ci0JCW1lbWNweSgmcGxsX2J1ZlsxXSxidWYsNCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZGlidXNiX2dlbmVyYWxfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCXU4IHBsbF9idWZbNV0pCi17Ci0Jc3RydWN0IHVzYl9kaWJ1c2IqIGRpYiA9IChzdHJ1Y3QgdXNiX2RpYnVzYiopIGZlLT5kdmItPnByaXY7Ci0JdTggYnVmWzRdOwotCWludCByZXQ9MDsKLQlzd2l0Y2ggKGRpYi0+dHVuZXItPmlkKSB7Ci0JCWNhc2UgRElCVVNCX1RVTkVSX0NPRkRNX1BBTkFTT05JQ19FTlY3N0gxMUQ1OgotCQkJcmV0ID0gcGFuYXNvbmljX2NvZmRtX2Vudjc3aDExZDVfdGRhNjY1MF9pbml0KGZlLGJ1Zik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gZGlidXNiX3BsbF9pMmNfaGVscGVyKGRpYixwbGxfYnVmLGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgZGlidXNiX2dlbmVyYWxfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXAsIHU4IHBsbF9idWZbNV0pCi17Ci0Jc3RydWN0IHVzYl9kaWJ1c2IqIGRpYiA9IChzdHJ1Y3QgdXNiX2RpYnVzYiopIGZlLT5kdmItPnByaXY7Ci0JdTggYnVmWzRdOwotCWludCByZXQ9MDsKLQotCXN3aXRjaCAoZGliLT50dW5lci0+aWQpIHsKLQkJY2FzZSBESUJVU0JfVFVORVJfQ0FCTEVfVEhPTVNPTjoKLQkJCXJldCA9IHRob21zb25fY2FibGVfZXVfcGxsX3NldChmZXAsIGJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBESUJVU0JfVFVORVJfQ09GRE1fUEFOQVNPTklDX0VOVjU3SDFYRDU6Ci0JCQlyZXQgPSBwYW5hc29uaWNfY29mZG1fZW52NTdoMXhkNV9wbGxfc2V0KGZlcCwgYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIERJQlVTQl9UVU5FUl9DQUJMRV9MR19URFRQX0UxMDJQOgotCQkJcmV0ID0gbGdfdGR0cF9lMTAycF90dWE2MDM0KGZlcCwgYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIERJQlVTQl9UVU5FUl9DT0ZETV9QQU5BU09OSUNfRU5WNzdIMTFENToKLQkJCXJldCA9IHBhbmFzb25pY19jb2ZkbV9lbnY3N2gxMWQ1X3RkYTY2NTBfc2V0KGZlcCxidWYpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl3YXJuKCJubyBwbGwgcHJvZ3JhbW1pbmcgcm91dGluZSBmb3VuZCBmb3IgdHVuZXIgJWQuXG4iLGRpYi0+dHVuZXItPmlkKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCQlicmVhazsKLQl9Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIGRpYnVzYl9wbGxfaTJjX2hlbHBlcihkaWIscGxsX2J1ZixidWYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmlybXdhcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLWZpcm13YXJlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGJhNDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItZmlybXdhcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBkdmItZGlidXNiLWZpcm13YXJlLmMgaXMgcGFydCBvZiB0aGUgZHJpdmVyIGZvciBtb2JpbGUgVVNCIEJ1ZGdldCBEVkItVCBkZXZpY2VzIAotICogYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbiBtYWRlIGJ5IERpQmNvbSAoaHR0cDovL3d3dy5kaWJjb20uZnIvKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQotICoKLSAqIHNlZSBkdmItZGlidXNiLWNvcmUuYyBmb3IgbW9yZSBjb3B5cmlnaHQgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBkb3dubG9hZGluZyB0aGUgZmlybXdhcmUgdG8gdGhlIGRldmljZS4KLSAqLwotI2luY2x1ZGUgImR2Yi1kaWJ1c2IuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLS8qCi0gKiBsb2FkIGEgZmlybXdhcmUgcGFja2V0IHRvIHRoZSBkZXZpY2UgCi0gKi8KLXN0YXRpYyBpbnQgZGlidXNiX3dyaXRlbWVtKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LHUxNiBhZGRyLHU4ICpkYXRhLCB1OCBsZW4pCi17Ci0JcmV0dXJuIHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwwKSwKLQkJCTB4YTAsIFVTQl9UWVBFX1ZFTkRPUiwgYWRkciwgMHgwMCwgZGF0YSwgbGVuLCA1MDAwKTsKLX0KLQotaW50IGRpYnVzYl9sb2FkZmlybXdhcmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSAqZGliZGV2KQotewotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOwotCXUxNiBhZGRyOwotCXU4ICpiLCpwOwotCWludCByZXQgPSAwLGk7Ci0JCi0JaWYgKChyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZGliZGV2LT5kZXZfY2wtPmZpcm13YXJlLCAmdWRldi0+ZGV2KSkgIT0gMCkgewotCQllcnIoImRpZCBub3QgZmluZCB0aGUgZmlybXdhcmUgZmlsZS4gKCVzKSAiCi0JCQkiUGxlYXNlIHNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2R2Yi8gZm9yIG1vcmUgZGV0YWlscyBvbiBmaXJtd2FyZS1wcm9ibGVtcy4iLAotCQkJZGliZGV2LT5kZXZfY2wtPmZpcm13YXJlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpbmZvKCJkb3dubG9hZGluZyBmaXJtd2FyZSBmcm9tIGZpbGUgJyVzJy4iLGRpYmRldi0+ZGV2X2NsLT5maXJtd2FyZSk7Ci0JCi0JcCA9IGttYWxsb2MoZnctPnNpemUsR0ZQX0tFUk5FTCk7CQotCWlmIChwICE9IE5VTEwpIHsKLQkJdTggcmVzZXQ7Ci0JCS8qCi0JCSAqIHlvdSBjYW5ub3QgdXNlIHRoZSBmdy0+ZGF0YSBhcyBidWZmZXIgZm9yIAotCQkgKiB1c2JfY29udHJvbF9tc2csIGEgbmV3IGJ1ZmZlciBoYXMgdG8gYmUKLQkJICogY3JlYXRlZAotCQkgKi8KLQkJbWVtY3B5KHAsZnctPmRhdGEsZnctPnNpemUpOwotCi0JCS8qIHN0b3AgdGhlIENQVSAqLwotCQlyZXNldCA9IDE7Ci0JCWlmICgocmV0ID0gZGlidXNiX3dyaXRlbWVtKHVkZXYsZGliZGV2LT5kZXZfY2wtPnVzYl9jdHJsLT5jcHVfY3NfcmVnaXN0ZXIsJnJlc2V0LDEpKSAhPSAxKSAKLQkJCWVycigiY291bGQgbm90IHN0b3AgdGhlIFVTQiBjb250cm9sbGVyIENQVS4iKTsKLQkJZm9yKGkgPSAwOyBwW2krM10gPT0gMCAmJiBpIDwgZnctPnNpemU7ICkgeyAKLQkJCWIgPSAodTggKikgJnBbaV07Ci0JCQlhZGRyID0gKigodTE2ICopICZiWzFdKTsKLQotCQkJcmV0ID0gZGlidXNiX3dyaXRlbWVtKHVkZXYsYWRkciwmYls0XSxiWzBdKTsKLQkJCi0JCQlpZiAocmV0ICE9IGJbMF0pIHsKLQkJCQllcnIoImVycm9yIHdoaWxlIHRyYW5zZmVycmluZyBmaXJtd2FyZSAiCi0JCQkJCSIodHJhbnNmZXJyZWQgc2l6ZTogJWQsIGJsb2NrIHNpemU6ICVkKSIsCi0JCQkJCXJldCxiWzBdKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaSArPSA1ICsgYlswXTsKLQkJfQotCQkvKiBsZW5ndGggaW4gcmV0ICovCi0JCWlmIChyZXQgPiAwKQotCQkJcmV0ID0gMDsKLQkJLyogcmVzdGFydCB0aGUgQ1BVICovCi0JCXJlc2V0ID0gMDsKLQkJaWYgKHJldCB8fCBkaWJ1c2Jfd3JpdGVtZW0odWRldixkaWJkZXYtPmRldl9jbC0+dXNiX2N0cmwtPmNwdV9jc19yZWdpc3RlciwmcmVzZXQsMSkgIT0gMSkgewotCQkJZXJyKCJjb3VsZCBub3QgcmVzdGFydCB0aGUgVVNCIGNvbnRyb2xsZXIgQ1BVLiIpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJfQotCi0JCWtmcmVlKHApOwotCX0gZWxzZSB7IAotCQlyZXQgPSAtRU5PTUVNOwotCX0KLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvZHZiLWRpYnVzYi1yZW1vdGUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLXJlbW90ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM4YjE1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLXJlbW90ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qCi0gKiBkdmItZGlidXNiLXJlbW90ZS5jIGlzIHBhcnQgb2YgdGhlIGRyaXZlciBmb3IgbW9iaWxlIFVTQiBCdWRnZXQgRFZCLVQgZGV2aWNlcwotICogYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbiBtYWRlIGJ5IERpQmNvbSAoaHR0cDovL3d3dy5kaWJjb20uZnIvKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQotICoKLSAqIHNlZSBkdmItZGlidXNiLWNvcmUuYyBmb3IgbW9yZSBjb3B5cmlnaHQgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIGZvciBoYW5kbGluZyB0aGUgZXZlbnQgZGV2aWNlIG9uIHRoZSBzb2Z0d2FyZQotICogc2lkZSBhbmQgdGhlIHJlbW90ZSBjb250cm9sIG9uIHRoZSBoYXJkd2FyZSBzaWRlLgotICovCi0jaW5jbHVkZSAiZHZiLWRpYnVzYi5oIgotCi0vKiBUYWJsZSB0byBtYXAgcmF3IGtleSBjb2RlcyB0byBrZXkgZXZlbnRzLiAgVGhpcyBzaG91bGQgbm90IGJlIGhhcmQtd2lyZWQKLSAgIGludG8gdGhlIGtlcm5lbC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsgdTggYzAsIGMxLCBjMjsgdWludDMyX3Qga2V5OyB9IG5lY19yY19rZXlzIFtdID0KLXsKLQkvKiBLZXkgY29kZXMgZm9yIHRoZSBsaXR0bGUgQXJ0ZWMgVDEvVHdpbmhhbi9IQU1BLyByZW1vdGUuICovCi0JeyAweDAwLCAweGZmLCAweDE2LCBLRVlfUE9XRVIgfSwKLQl7IDB4MDAsIDB4ZmYsIDB4MTAsIEtFWV9NVVRFIH0sCi0JeyAweDAwLCAweGZmLCAweDAzLCBLRVlfMSB9LAotCXsgMHgwMCwgMHhmZiwgMHgwMSwgS0VZXzIgfSwKLQl7IDB4MDAsIDB4ZmYsIDB4MDYsIEtFWV8zIH0sCi0JeyAweDAwLCAweGZmLCAweDA5LCBLRVlfNCB9LAotCXsgMHgwMCwgMHhmZiwgMHgxZCwgS0VZXzUgfSwKLQl7IDB4MDAsIDB4ZmYsIDB4MWYsIEtFWV82IH0sCi0JeyAweDAwLCAweGZmLCAweDBkLCBLRVlfNyB9LAotCXsgMHgwMCwgMHhmZiwgMHgxOSwgS0VZXzggfSwKLQl7IDB4MDAsIDB4ZmYsIDB4MWIsIEtFWV85IH0sCi0JeyAweDAwLCAweGZmLCAweDE1LCBLRVlfMCB9LAotCXsgMHgwMCwgMHhmZiwgMHgwNSwgS0VZX0NIQU5ORUxVUCB9LAotCXsgMHgwMCwgMHhmZiwgMHgwMiwgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweDAwLCAweGZmLCAweDFlLCBLRVlfVk9MVU1FVVAgfSwKLQl7IDB4MDAsIDB4ZmYsIDB4MGEsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweDAwLCAweGZmLCAweDExLCBLRVlfUkVDT1JEIH0sCi0JeyAweDAwLCAweGZmLCAweDE3LCBLRVlfRkFWT1JJVEVTIH0sIC8qIEhlYXJ0IHN5bWJvbCAtIENoYW5uZWwgbGlzdC4gKi8KLQl7IDB4MDAsIDB4ZmYsIDB4MTQsIEtFWV9QTEFZIH0sCi0JeyAweDAwLCAweGZmLCAweDFhLCBLRVlfU1RPUCB9LAotCXsgMHgwMCwgMHhmZiwgMHg0MCwgS0VZX1JFV0lORCB9LAotCXsgMHgwMCwgMHhmZiwgMHgxMiwgS0VZX0ZBU1RGT1JXQVJEIH0sCi0JeyAweDAwLCAweGZmLCAweDBlLCBLRVlfUFJFVklPVVMgfSwgLyogUmVjYWxsIC0gUHJldmlvdXMgY2hhbm5lbC4gKi8KLQl7IDB4MDAsIDB4ZmYsIDB4NGMsIEtFWV9QQVVTRSB9LAotCXsgMHgwMCwgMHhmZiwgMHg0ZCwgS0VZX1NDUkVFTiB9LCAvKiBGdWxsIHNjcmVlbiBtb2RlLiAqLwotCXsgMHgwMCwgMHhmZiwgMHg1NCwgS0VZX0FVRElPIH0sIC8qIE1UUyAtIFN3aXRjaCB0byBzZWNvbmRhcnkgYXVkaW8uICovCi0JLyogYWRkaXRpb25hbCBrZXlzIFR3aW5IYW4gVmlzaW9uUGx1cywgdGhlIEFydGVjIHNlZW1pbmdseSBub3QgaGF2ZSAqLwotCXsgMHgwMCwgMHhmZiwgMHgwYywgS0VZX0NBTkNFTCB9LCAvKiBDYW5jZWwgKi8KLQl7IDB4MDAsIDB4ZmYsIDB4MWMsIEtFWV9FUEcgfSwgLyogRVBHICovCi0JeyAweDAwLCAweGZmLCAweDAwLCBLRVlfVEFCIH0sIC8qIFRhYiAqLwotCXsgMHgwMCwgMHhmZiwgMHg0OCwgS0VZX0lORk8gfSwgLyogUHJldmlldyAqLwotCXsgMHgwMCwgMHhmZiwgMHgwNCwgS0VZX0xJU1QgfSwgLyogUmVjb3JkTGlzdCAqLwotCXsgMHgwMCwgMHhmZiwgMHgwZiwgS0VZX1RFWFQgfSwgLyogVGVsZXRleHQgKi8KLQkvKiBLZXkgY29kZXMgZm9yIHRoZSBLV29ybGQvQURTVGVjaC9KZXRXYXkgcmVtb3RlLiAqLwotCXsgMHg4NiwgMHg2YiwgMHgxMiwgS0VZX1BPV0VSIH0sCi0JeyAweDg2LCAweDZiLCAweDBmLCBLRVlfU0VMRUNUIH0sIC8qIHNvdXJjZSAqLwotCXsgMHg4NiwgMHg2YiwgMHgwYywgS0VZX1VOS05PV04gfSwgLyogc2NhbiAqLwotCXsgMHg4NiwgMHg2YiwgMHgwYiwgS0VZX0VQRyB9LAotCXsgMHg4NiwgMHg2YiwgMHgxMCwgS0VZX01VVEUgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MDEsIEtFWV8xIH0sCi0JeyAweDg2LCAweDZiLCAweDAyLCBLRVlfMiB9LAotCXsgMHg4NiwgMHg2YiwgMHgwMywgS0VZXzMgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MDQsIEtFWV80IH0sCi0JeyAweDg2LCAweDZiLCAweDA1LCBLRVlfNSB9LAotCXsgMHg4NiwgMHg2YiwgMHgwNiwgS0VZXzYgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MDcsIEtFWV83IH0sCi0JeyAweDg2LCAweDZiLCAweDA4LCBLRVlfOCB9LAotCXsgMHg4NiwgMHg2YiwgMHgwOSwgS0VZXzkgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MGEsIEtFWV8wIH0sCi0JeyAweDg2LCAweDZiLCAweDE4LCBLRVlfWk9PTSB9LAotCXsgMHg4NiwgMHg2YiwgMHgxYywgS0VZX1VOS05PV04gfSwgLyogcHJldmlldyAqLwotCXsgMHg4NiwgMHg2YiwgMHgxMywgS0VZX1VOS05PV04gfSwgLyogc25hcCAqLwotCXsgMHg4NiwgMHg2YiwgMHgwMCwgS0VZX1VORE8gfSwKLQl7IDB4ODYsIDB4NmIsIDB4MWQsIEtFWV9SRUNPUkQgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MGQsIEtFWV9TVE9QIH0sCi0JeyAweDg2LCAweDZiLCAweDBlLCBLRVlfUEFVU0UgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MTYsIEtFWV9QTEFZIH0sCi0JeyAweDg2LCAweDZiLCAweDExLCBLRVlfQkFDSyB9LAotCXsgMHg4NiwgMHg2YiwgMHgxOSwgS0VZX0ZPUldBUkQgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MTQsIEtFWV9VTktOT1dOIH0sIC8qIHBpcCAqLwotCXsgMHg4NiwgMHg2YiwgMHgxNSwgS0VZX0VTQyB9LAotCXsgMHg4NiwgMHg2YiwgMHgxYSwgS0VZX1VQIH0sCi0JeyAweDg2LCAweDZiLCAweDFlLCBLRVlfRE9XTiB9LAotCXsgMHg4NiwgMHg2YiwgMHgxZiwgS0VZX0xFRlQgfSwKLQl7IDB4ODYsIDB4NmIsIDB4MWIsIEtFWV9SSUdIVCB9LAotfTsKLQotLyogSGF1cHBhdWdlIE5PVkEtVCBVU0IyIGtleXMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeyB1MTYgcmF3OyB1aW50MzJfdCBrZXk7IH0gaGF1cHBfcmNfa2V5cyBbXSA9IHsKLQl7IDB4ZGRmLCBLRVlfR09UTyB9LAotCXsgMHhkZWYsIEtFWV9QT1dFUiB9LAotCXsgMHhjZTcsIEtFWV9UViB9LAotCXsgMHhjYzcsIEtFWV9WSURFTyB9LAotCXsgMHhjY2YsIEtFWV9BVURJTyB9LAotCXsgMHhjZDcsIEtFWV9NRURJQSB9LAotCXsgMHhjZGYsIEtFWV9FUEcgfSwKLQl7IDB4Y2E3LCBLRVlfVVAgfSwKLQl7IDB4YzY3LCBLRVlfUkFESU8gfSwKLQl7IDB4Y2I3LCBLRVlfTEVGVCB9LAotCXsgMHhkMmYsIEtFWV9PSyB9LAotCXsgMHhjYmYsIEtFWV9SSUdIVCB9LAotCXsgMHhjZmYsIEtFWV9CQUNLIH0sCi0JeyAweGNhZiwgS0VZX0RPV04gfSwKLQl7IDB4YzZmLCBLRVlfTUVOVSB9LAotCXsgMHhjODcsIEtFWV9WT0xVTUVVUCB9LAotCXsgMHhjOGYsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweGM5NywgS0VZX0NIQU5ORUwgfSwKLQl7IDB4YzdmLCBLRVlfTVVURSB9LAotCXsgMHhkMDcsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4ZDBmLCBLRVlfQ0hBTk5FTERPV04gfSwKLQl7IDB4ZGJmLCBLRVlfUkVDT1JEIH0sCi0JeyAweGRiNywgS0VZX1NUT1AgfSwKLQl7IDB4ZDk3LCBLRVlfUkVXSU5EIH0sCi0JeyAweGRhZiwgS0VZX1BMQVkgfSwKLQl7IDB4ZGE3LCBLRVlfRkFTVEZPUldBUkQgfSwKLQl7IDB4ZDI3LCBLRVlfTEFTVCB9LCAvKiBTa2lwIGJhY2t3YXJkcyAqLwotCXsgMHhkODcsIEtFWV9QQVVTRSB9LAotCXsgMHhjZjcsIEtFWV9ORVhUIH0sCi0JeyAweGMwNywgS0VZXzAgfSwKLQl7IDB4YzBmLCBLRVlfMSB9LAotCXsgMHhjMTcsIEtFWV8yIH0sCi0JeyAweGMxZiwgS0VZXzMgfSwKLQl7IDB4YzI3LCBLRVlfNCB9LAotCXsgMHhjMmYsIEtFWV81IH0sCi0JeyAweGMzNywgS0VZXzYgfSwKLQl7IDB4YzNmLCBLRVlfNyB9LAotCXsgMHhjNDcsIEtFWV84IH0sCi0JeyAweGM0ZiwgS0VZXzkgfSwKLQl7IDB4YzU3LCBLRVlfS1BBU1RFUklTSyB9LAotCXsgMHhjNzcsIEtFWV9HUkFWRSB9LCAvKiAjICovCi0JeyAweGM1ZiwgS0VZX1JFRCB9LAotCXsgMHhkNzcsIEtFWV9HUkVFTiB9LAotCXsgMHhkYzcsIEtFWV9ZRUxMT1cgfSwKLQl7IDB4ZDRmLCBLRVlfQkxVRX0sCi19OwotCi1zdGF0aWMgaW50IGRpYnVzYl9rZXkyZXZlbnRfbmVjKHN0cnVjdCB1c2JfZGlidXNiICpkaWIsdTggcmJbNV0pCi17Ci0JaW50IGk7Ci0Jc3dpdGNoIChyYlswXSkgewotCQljYXNlIERJQlVTQl9SQ19ORUNfS0VZX1BSRVNTRUQ6Ci0JCQkvKiByYlsxLTNdIGlzIHRoZSBhY3R1YWwga2V5LCByYls0XSBpcyBhIGNoZWNrc3VtICovCi0JCQlkZWJfcmMoInJhdyBrZXkgY29kZSAweCUwMngsIDB4JTAyeCwgMHglMDJ4LCAweCUwMnhcbiIsCi0JCQkJcmJbMV0sIHJiWzJdLCByYlszXSwgcmJbNF0pOwotCi0JCQlpZiAoKDB4ZmYgLSByYlszXSkgIT0gcmJbNF0pIHsKLQkJCQlkZWJfcmMoInJlbW90ZSBjb250cm9sIGNoZWNrc3VtIGZhaWxlZC5cbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSByYXcga2V5IGNvZGUuICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG5lY19yY19rZXlzKS9zaXplb2YobmVjX3JjX2tleXNbMF0pOyBpKyspIHsKLQkJCQlpZiAobmVjX3JjX2tleXNbaV0uYzAgPT0gcmJbMV0gJiYKLQkJCQkJbmVjX3JjX2tleXNbaV0uYzEgPT0gcmJbMl0gJiYKLQkJCQkJbmVjX3JjX2tleXNbaV0uYzIgPT0gcmJbM10pIHsKLQotCQkJCQlkaWItPmxhc3RfZXZlbnQgPSBuZWNfcmNfa2V5c1tpXS5rZXk7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIERJQlVTQl9SQ19ORUNfS0VZX1JFUEVBVEVEOgotCQkJLyogcmJbMV0uLnJiWzRdIGFyZSBhbHdheXMgemVyby4qLwotCQkJLyogUmVwZWF0cyBvZnRlbiBzZWVtIHRvIG9jY3VyIHNvIGZvciB0aGUgbW9tZW50IGp1c3QgaWdub3JlIHRoaXMuICovCi0JCQlyZXR1cm4gMDsKLQkJY2FzZSBESUJVU0JfUkNfTkVDX0VNUFRZOiAvKiBObyAobW9yZSkgcmVtb3RlIGNvbnRyb2wga2V5cy4gKi8KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgZGlidXNiX2tleTJldmVudF9oYXVwcGF1Z2Uoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYix1OCByYls0XSkKLXsKLQl1MTYgcmF3OwotCWludCBpLHN0YXRlOwotCXN3aXRjaCAocmJbMF0pIHsKLQkJY2FzZSBESUJVU0JfUkNfSEFVUFBBVUdFX0tFWV9QUkVTU0VEOgotCQkJcmF3ID0gKChyYlsxXSAmIDB4MGYpIDw8IDgpIHwgcmJbMl07Ci0KLQkJCXN0YXRlID0gISEocmJbMV0gJiAweDQwKTsKLQotCQkJZGViX3JjKCJyYXcga2V5IGNvZGUgMHglMDJ4LCAweCUwMngsIDB4JTAyeCB0byAlMDR4IHN0YXRlOiAlZFxuIixyYlsxXSxyYlsyXSxyYlszXSxyYXcsc3RhdGUpOwotCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihoYXVwcF9yY19rZXlzKS9zaXplb2YoaGF1cHBfcmNfa2V5c1swXSk7IGkrKykgewotCQkJCWlmIChoYXVwcF9yY19rZXlzW2ldLnJhdyA9PSByYXcpIHsKLQkJCQkJaWYgKGRpYi0+bGFzdF9ldmVudCA9PSBoYXVwcF9yY19rZXlzW2ldLmtleSAmJgotCQkJCQkJZGliLT5sYXN0X3N0YXRlID09IHN0YXRlKSB7Ci0JCQkJCQlkZWJfcmMoImtleSByZXBlYXRcbiIpOwotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkaWItPmxhc3RfZXZlbnQgPSBoYXVwcF9yY19rZXlzW2ldLmtleTsKLQkJCQkJCWRpYi0+bGFzdF9zdGF0ZSA9IHN0YXRlOwotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQljYXNlIERJQlVTQl9SQ19IQVVQUEFVR0VfS0VZX0VNUFRZOgotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIHJlbW90ZSBjb250cm9sIGFuZCBmZWVkIHRoZSBhcHByb3ByaWF0ZSBldmVudC4KLSAqIE5FQyBwcm90b2NvbCBpcyB1c2VkIGZvciByZW1vdGUgY29udHJvbHMKLSAqLwotc3RhdGljIGludCBkaWJ1c2JfcmVhZF9yZW1vdGVfY29udHJvbChzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliKQotewotCXU4IGJbMV0gPSB7IERJQlVTQl9SRVFfUE9MTF9SRU1PVEUgfSwgcmJbNV07Ci0JaW50IHJldCxldmVudCA9IDA7Ci0KLQlpZiAoKHJldCA9IGRpYnVzYl9yZWFkd3JpdGVfdXNiKGRpYixiLDEscmIsNSkpKQotCQlyZXR1cm4gcmV0OwotCi0Jc3dpdGNoIChkaWItPmRpYmRldi0+ZGV2X2NsLT5yZW1vdGVfdHlwZSkgewotCQljYXNlIERJQlVTQl9SQ19ORUNfUFJPVE9DT0w6Ci0JCQlldmVudCA9IGRpYnVzYl9rZXkyZXZlbnRfbmVjKGRpYixyYik7Ci0JCQlicmVhazsKLQkJY2FzZSBESUJVU0JfUkNfSEFVUFBBVUdFX1BST1RPOgotCQkJZXZlbnQgPSBkaWJ1c2Jfa2V5MmV2ZW50X2hhdXBwYXVnZShkaWIscmIpOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JLyoga2V5IHJlcGVhdCAqLwotCWlmIChldmVudCA9PSAwKQotCQlpZiAoKytkaWItPnJlcGVhdF9rZXlfY291bnQgPCBkaWItPnJjX2tleV9yZXBlYXRfY291bnQpIHsKLQkJCWRlYl9yYygia2V5IHJlcGVhdCBkcm9wcGVkLiAoJWQpXG4iLGRpYi0+cmVwZWF0X2tleV9jb3VudCk7Ci0JCQlldmVudCA9IC0xOyAvKiBza2lwIHRoaXMga2V5IHJlcGVhdCAqLwotCQl9Ci0KLQlpZiAoZXZlbnQgPT0gMSB8fCBldmVudCA9PSAwKSB7Ci0JCWRlYl9yYygiVHJhbnNsYXRlZCBrZXkgMHglMDR4XG4iLGV2ZW50KTsKLQotCQkvKiBTaWduYWwgZG93biBhbmQgdXAgZXZlbnRzIGZvciB0aGlzIGtleS4gKi8KLQkJaW5wdXRfcmVwb3J0X2tleSgmZGliLT5yY19pbnB1dF9kZXYsIGRpYi0+bGFzdF9ldmVudCwgMSk7Ci0JCWlucHV0X3JlcG9ydF9rZXkoJmRpYi0+cmNfaW5wdXRfZGV2LCBkaWItPmxhc3RfZXZlbnQsIDApOwotCQlpbnB1dF9zeW5jKCZkaWItPnJjX2lucHV0X2Rldik7Ci0KLQkJaWYgKGV2ZW50ID09IDEpCi0JCQlkaWItPnJlcGVhdF9rZXlfY291bnQgPSAwOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogUmVtb3RlLWNvbnRyb2wgcG9sbCBmdW5jdGlvbiAtIGNhbGxlZCBldmVyeSBkaWItPnJjX3F1ZXJ5X2ludGVydmFsIG1zIHRvIHNlZQotICAgd2hldGhlciB0aGUgcmVtb3RlIGNvbnRyb2wgaGFzIHJlY2VpdmVkIGFueXRoaW5nLiAqLwotc3RhdGljIHZvaWQgZGlidXNiX3JlbW90ZV9xdWVyeSh2b2lkICpkYXRhKQotewotCXN0cnVjdCB1c2JfZGlidXNiICpkaWIgPSAoc3RydWN0IHVzYl9kaWJ1c2IgKikgZGF0YTsKLQkvKiBUT0RPOiBuZWVkIGEgbG9jayBoZXJlLiAgV2UgY2FuIHNpbXBseSBza2lwIGNoZWNraW5nIGZvciB0aGUgcmVtb3RlIGNvbnRyb2wKLQkgICBpZiB3ZSdyZSBidXN5LiAqLwotCWRpYnVzYl9yZWFkX3JlbW90ZV9jb250cm9sKGRpYik7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkaWItPnJjX3F1ZXJ5X3dvcmssCi0JCQkgICAgICBtc2Vjc190b19qaWZmaWVzKGRpYi0+cmNfcXVlcnlfaW50ZXJ2YWwpKTsKLX0KLQotaW50IGRpYnVzYl9yZW1vdGVfaW5pdChzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliKQotewotCWludCBpOwotCi0JaWYgKGRpYi0+ZGliZGV2LT5kZXZfY2wtPnJlbW90ZV90eXBlID09IERJQlVTQl9SQ19OTykKLQkJcmV0dXJuIDA7Ci0JCi0JLyogSW5pdGlhbGlzZSB0aGUgcmVtb3RlLWNvbnRyb2wgc3RydWN0dXJlcy4qLwotCWluaXRfaW5wdXRfZGV2KCZkaWItPnJjX2lucHV0X2Rldik7Ci0KLQlkaWItPnJjX2lucHV0X2Rldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpOwotCWRpYi0+cmNfaW5wdXRfZGV2LmtleWNvZGVzaXplID0gc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotCWRpYi0+cmNfaW5wdXRfZGV2LmtleWNvZGVtYXggPSBLRVlfTUFYOwotCWRpYi0+cmNfaW5wdXRfZGV2Lm5hbWUgPSBEUklWRVJfREVTQyAiIHJlbW90ZSBjb250cm9sIjsKLQotCXN3aXRjaCAoZGliLT5kaWJkZXYtPmRldl9jbC0+cmVtb3RlX3R5cGUpIHsKLQkJY2FzZSBESUJVU0JfUkNfTkVDX1BST1RPQ09MOgotCQkJZm9yIChpPTA7IGk8c2l6ZW9mKG5lY19yY19rZXlzKS9zaXplb2YobmVjX3JjX2tleXNbMF0pOyBpKyspCi0JCQkJc2V0X2JpdChuZWNfcmNfa2V5c1tpXS5rZXksIGRpYi0+cmNfaW5wdXRfZGV2LmtleWJpdCk7Ci0JCQlicmVhazsKLQkJY2FzZSBESUJVU0JfUkNfSEFVUFBBVUdFX1BST1RPOgotCQkJZm9yIChpPTA7IGk8c2l6ZW9mKGhhdXBwX3JjX2tleXMpL3NpemVvZihoYXVwcF9yY19rZXlzWzBdKTsgaSsrKQotCQkJCXNldF9iaXQoaGF1cHBfcmNfa2V5c1tpXS5rZXksIGRpYi0+cmNfaW5wdXRfZGV2LmtleWJpdCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQotCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZkaWItPnJjX2lucHV0X2Rldik7Ci0KLQlJTklUX1dPUksoJmRpYi0+cmNfcXVlcnlfd29yaywgZGlidXNiX3JlbW90ZV9xdWVyeSwgZGliKTsKLQotCS8qIFN0YXJ0IHRoZSByZW1vdGUtY29udHJvbCBwb2xsaW5nLiAqLwotCWlmIChkaWItPnJjX3F1ZXJ5X2ludGVydmFsIDwgNDApCi0JCWRpYi0+cmNfcXVlcnlfaW50ZXJ2YWwgPSAxMDA7IC8qIGRlZmF1bHQgKi8KLQotCWluZm8oInNjaGVkdWxlIHJlbW90ZSBxdWVyeSBpbnRlcnZhbCB0byAlZCBtc2Vjcy4iLGRpYi0+cmNfcXVlcnlfaW50ZXJ2YWwpOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGliLT5yY19xdWVyeV93b3JrLG1zZWNzX3RvX2ppZmZpZXMoZGliLT5yY19xdWVyeV9pbnRlcnZhbCkpOwotCi0JZGliLT5pbml0X3N0YXRlIHw9IERJQlVTQl9TVEFURV9SRU1PVEU7Ci0JCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2JfcmVtb3RlX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpZiAoZGliLT5kaWJkZXYtPmRldl9jbC0+cmVtb3RlX3R5cGUgPT0gRElCVVNCX1JDX05PKQotCQlyZXR1cm4gMDsKLQotCWlmIChkaWItPmluaXRfc3RhdGUgJiBESUJVU0JfU1RBVEVfUkVNT1RFKSB7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmRpYi0+cmNfcXVlcnlfd29yayk7Ci0JCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZkaWItPnJjX2lucHV0X2Rldik7Ci0JfQotCWRpYi0+aW5pdF9zdGF0ZSAmPSB+RElCVVNCX1NUQVRFX1JFTU9URTsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZGlidXNiLXVzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItdXNiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MmYwNTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2ItdXNiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoKLSAqIGR2Yi1kaWJ1c2ItdXNiLmMgaXMgcGFydCBvZiB0aGUgZHJpdmVyIGZvciBtb2JpbGUgVVNCIEJ1ZGdldCBEVkItVCBkZXZpY2VzCi0gKiBiYXNlZCBvbiByZWZlcmVuY2UgZGVzaWduIG1hZGUgYnkgRGlCY29tIChodHRwOi8vd3d3LmRpYmNvbS5mci8pCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCi0gKgotICogc2VlIGR2Yi1kaWJ1c2ItY29yZS5jIGZvciBtb3JlIGNvcHlyaWdodCBkZXRhaWxzLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGluaXRpYWxpemluZyBhbmQgaGFuZGxpbmcgdGhlCi0gKiB1c2Igc3BlY2lmaWMgc3R1ZmYuCi0gKi8KLSNpbmNsdWRlICJkdmItZGlidXNiLmgiCi0KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLWludCBkaWJ1c2JfcmVhZHdyaXRlX3VzYihzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliLCB1OCAqd2J1ZiwgdTE2IHdsZW4sIHU4ICpyYnVmLAotCQl1MTYgcmxlbikKLXsKLQlpbnQgYWN0bGVuLHJldCA9IC1FTk9NRU07Ci0KLQlpZiAod2J1ZiA9PSBOVUxMIHx8IHdsZW4gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKHJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmZGliLT51c2Jfc2VtKSkpCi0JCXJldHVybiByZXQ7Ci0KLQlkZWJ1Z19kdW1wKHdidWYsd2xlbik7Ci0KLQlyZXQgPSB1c2JfYnVsa19tc2coZGliLT51ZGV2LHVzYl9zbmRidWxrcGlwZShkaWItPnVkZXYsCi0JCQlkaWItPmRpYmRldi0+ZGV2X2NsLT5waXBlX2NtZCksIHdidWYsd2xlbiwmYWN0bGVuLAotCQkJRElCVVNCX0kyQ19USU1FT1VUKTsKLQotCWlmIChyZXQpCi0JCWVycigiYnVsayBtZXNzYWdlIGZhaWxlZDogJWQgKCVkLyVkKSIscmV0LHdsZW4sYWN0bGVuKTsKLQllbHNlCi0JCXJldCA9IGFjdGxlbiAhPSB3bGVuID8gLTEgOiAwOwotCi0JLyogYW4gYW5zd2VyIGlzIGV4cGVjdGVkLCBhbmQgbm8gZXJyb3IgYmVmb3JlICovCi0JaWYgKCFyZXQgJiYgcmJ1ZiAmJiBybGVuKSB7Ci0JCXJldCA9IHVzYl9idWxrX21zZyhkaWItPnVkZXYsdXNiX3JjdmJ1bGtwaXBlKGRpYi0+dWRldiwKLQkJCQlkaWItPmRpYmRldi0+ZGV2X2NsLT5waXBlX2NtZCkscmJ1ZixybGVuLCZhY3RsZW4sCi0JCQkJRElCVVNCX0kyQ19USU1FT1VUKTsKLQotCQlpZiAocmV0KQotCQkJZXJyKCJyZWN2IGJ1bGsgbWVzc2FnZSBmYWlsZWQ6ICVkIixyZXQpOwotCQllbHNlIHsKLQkJCWRlYl9hbG90KCJybGVuOiAlZFxuIixybGVuKTsKLQkJCWRlYnVnX2R1bXAocmJ1ZixhY3RsZW4pOwotCQl9Ci0JfQotCi0JdXAoJmRpYi0+dXNiX3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIEN5cHJlc3MgY29udHJvbHMKLSAqLwotaW50IGRpYnVzYl93cml0ZV91c2Ioc3RydWN0IHVzYl9kaWJ1c2IgKmRpYiwgdTggKmJ1ZiwgdTE2IGxlbikKLXsKLQlyZXR1cm4gZGlidXNiX3JlYWR3cml0ZV91c2IoZGliLGJ1ZixsZW4sTlVMTCwwKTsKLX0KLQotI2lmIDAKLS8qCi0gKiAjaWYgMCdpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXMgdGhleSBhcmUgbm90IGluIHVzZSBfbm93XywKLSAqIGJ1dCBwcm9iYWJseSB3aWxsIGJlIHNvbWV0aW1lLgotICovCi0vKgotICogZG8gbm90IHVzZSB0aGlzLCBqdXN0IGEgd29ya2Fyb3VuZCBmb3IgYSBidWcsCi0gKiB3aGljaCB3aWxsIGhvcGVmdWxseSBuZXZlciBvY2N1ciA6KS4KLSAqLwotaW50IGRpYnVzYl9pbnRlcnJ1cHRfcmVhZF9sb29wKHN0cnVjdCB1c2JfZGlidXNiICpkaWIpCi17Ci0JdTggYlsxXSA9IHsgRElCVVNCX1JFUV9JTlRSX1JFQUQgfTsKLQlyZXR1cm4gZGlidXNiX3dyaXRlX3VzYihkaWIsYiwxKTsKLX0KLSNlbmRpZgotCi0vKgotICogaW9jdGwgZm9yIHRoZSBmaXJtd2FyZQotICovCi1zdGF0aWMgaW50IGRpYnVzYl9pb2N0bF9jbWQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYiwgdTggY21kLCB1OCAqcGFyYW0sIGludCBwbGVuKQotewotCXU4IGJbMzRdOwotCWludCBzaXplID0gcGxlbiA+IDMyID8gMzIgOiBwbGVuOwotCW1lbXNldChiLDAsMzQpOwotCWJbMF0gPSBESUJVU0JfUkVRX1NFVF9JT0NUTDsKLQliWzFdID0gY21kOwotCi0JaWYgKHNpemUgPiAwKQotCQltZW1jcHkoJmJbMl0scGFyYW0sc2l6ZSk7Ci0KLQlyZXR1cm4gZGlidXNiX3dyaXRlX3VzYihkaWIsYiwzNCk7IC8vMitzaXplKTsKLX0KLQotLyoKLSAqIGlvY3RsIGZvciBwb3dlciBjb250cm9sCi0gKi8KLWludCBkaWJ1c2JfaHdfd2FrZXVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQotewotCXN0cnVjdCB1c2JfZGlidXNiICpkaWIgPSAoc3RydWN0IHVzYl9kaWJ1c2IgKikgZmUtPmR2Yi0+cHJpdjsKLQl1OCBiWzFdID0geyBESUJVU0JfSU9DVExfUE9XRVJfV0FLRVVQIH07Ci0JZGViX2luZm8oImRpYnVzYi1kZXZpY2UgaXMgZ2V0dGluZyB1cC5cbiIpOwotCi0Jc3dpdGNoIChkaWItPmRpYmRldi0+ZGV2X2NsLT5pZCkgewotCQljYXNlIERUVDIwMFU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRpYnVzYl9pb2N0bF9jbWQoZGliLERJQlVTQl9JT0NUTF9DTURfUE9XRVJfTU9ERSwgYiwxKTsKLQkJCWJyZWFrOwotCX0KLQotCWlmIChkaWItPmZlX2luaXQpCi0JCXJldHVybiBkaWItPmZlX2luaXQoZmUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2JfaHdfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCi17Ci0Jc3RydWN0IHVzYl9kaWJ1c2IgKmRpYiA9IChzdHJ1Y3QgdXNiX2RpYnVzYiAqKSBmZS0+ZHZiLT5wcml2OwotCXU4IGJbMV0gPSB7IERJQlVTQl9JT0NUTF9QT1dFUl9TTEVFUCB9OwotCWRlYl9pbmZvKCJkaWJ1c2ItZGV2aWNlIGlzIGdvaW5nIHRvIGJlZC5cbiIpOwotCS8qIHdvcmthcm91bmQsIHNvbWV0aGluZyBpcyB3cm9uZywgd2hlbiBkaWJ1c2IgMS4xIGRldmljZSBhcmUgZ29pbmcgdG8gYmVkIHRvbyBsYXRlICovCi0Jc3dpdGNoIChkaWItPmRpYmRldi0+ZGV2X2NsLT5pZCkgewotCQljYXNlIERJQlVTQjFfMToKLQkJY2FzZSBOT1ZBVF9VU0IyOgotCQljYXNlIERUVDIwMFU6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRpYnVzYl9pb2N0bF9jbWQoZGliLERJQlVTQl9JT0NUTF9DTURfUE9XRVJfTU9ERSwgYiwxKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAoZGliLT5mZV9zbGVlcCkKLQkJcmV0dXJuIGRpYi0+ZmVfc2xlZXAoZmUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2Jfc2V0X3N0cmVhbWluZ19tb2RlKHN0cnVjdCB1c2JfZGlidXNiICpkaWIsdTggbW9kZSkKLXsKLQl1OCBiWzJdID0geyBESUJVU0JfUkVRX1NFVF9TVFJFQU1JTkdfTU9ERSwgbW9kZSB9OwotCXJldHVybiBkaWJ1c2JfcmVhZHdyaXRlX3VzYihkaWIsYiwyLE5VTEwsMCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGlidXNiX3VyYl9raWxsKHN0cnVjdCB1c2JfZGlidXNiICpkaWIpCi17Ci0JaW50IGk7Ci1kZWJfaW5mbygidHJ5aW5nIHRvIGtpbGwgdXJic1xuIik7Ci0JaWYgKGRpYi0+aW5pdF9zdGF0ZSAmIERJQlVTQl9TVEFURV9VUkJfU1VCTUlUKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBkaWItPmRpYmRldi0+ZGV2X2NsLT51cmJfY291bnQ7IGkrKykgewotCQkJZGViX2luZm8oImtpbGxpbmcgVVJCIG5vLiAlZC5cbiIsaSk7Ci0KLQkJCS8qIHN0b3AgdGhlIFVSQiAqLwotCQkJdXNiX2tpbGxfdXJiKGRpYi0+dXJiX2xpc3RbaV0pOwotCQl9Ci0JfSBlbHNlCi0JZGViX2luZm8oIiBVUkJzIG5vdCBraWxsZWQuXG4iKTsKLQlkaWItPmluaXRfc3RhdGUgJj0gfkRJQlVTQl9TVEFURV9VUkJfU1VCTUlUOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRpYnVzYl91cmJfc3VibWl0KHN0cnVjdCB1c2JfZGlidXNiICpkaWIpCi17Ci0JaW50IGkscmV0OwotCWlmIChkaWItPmluaXRfc3RhdGUgJiBESUJVU0JfU1RBVEVfVVJCX0lOSVQpIHsKLQkJZm9yIChpID0gMDsgaSA8IGRpYi0+ZGliZGV2LT5kZXZfY2wtPnVyYl9jb3VudDsgaSsrKSB7Ci0JCQlkZWJfaW5mbygic3VibWl0dGluZyBVUkIgbm8uICVkXG4iLGkpOwotCQkJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihkaWItPnVyYl9saXN0W2ldLEdGUF9BVE9NSUMpKSkgewotCQkJCWVycigiY291bGQgbm90IHN1Ym1pdCBidWZmZXIgdXJiIG5vLiAlZCAtIGdldCB0aGVtIGFsbCBiYWNrXG4iLGkpOwotCQkJCWRpYnVzYl91cmJfa2lsbChkaWIpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCQlkaWItPmluaXRfc3RhdGUgfD0gRElCVVNCX1NUQVRFX1VSQl9TVUJNSVQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2Jfc3RyZWFtaW5nKHN0cnVjdCB1c2JfZGlidXNiICpkaWIsaW50IG9ub2ZmKQotewotCWlmIChvbm9mZikKLQkJZGlidXNiX3VyYl9zdWJtaXQoZGliKTsKLQllbHNlCi0JCWRpYnVzYl91cmJfa2lsbChkaWIpOwotCi0Jc3dpdGNoIChkaWItPmRpYmRldi0+ZGV2X2NsLT5pZCkgewotCQljYXNlIERJQlVTQjJfMDoKLQkJY2FzZSBESUJVU0IyXzBCOgotCQljYXNlIE5PVkFUX1VTQjI6Ci0JCWNhc2UgVU1UMl8wOgotCQkJaWYgKG9ub2ZmKQotCQkJCXJldHVybiBkaWJ1c2JfaW9jdGxfY21kKGRpYixESUJVU0JfSU9DVExfQ01EX0VOQUJMRV9TVFJFQU0sTlVMTCwwKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZGlidXNiX2lvY3RsX2NtZChkaWIsRElCVVNCX0lPQ1RMX0NNRF9ESVNBQkxFX1NUUkVBTSxOVUxMLDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2JfdXJiX2luaXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpbnQgaSxidWZzaXplLGRlZl9waWRfcGFyc2UgPSAxOwotCi0JLyoKLQkgKiB3aGVuIHJlbG9hZGluZyB0aGUgZHJpdmVyIHcvbyByZXBsdWdnaW5nIHRoZSBkZXZpY2UKLQkgKiBhIHRpbWVvdXQgb2NjdXJlcywgdGhpcyBoZWxwcwotCSAqLwotCXVzYl9jbGVhcl9oYWx0KGRpYi0+dWRldix1c2Jfc25kYnVsa3BpcGUoZGliLT51ZGV2LGRpYi0+ZGliZGV2LT5kZXZfY2wtPnBpcGVfY21kKSk7Ci0JdXNiX2NsZWFyX2hhbHQoZGliLT51ZGV2LHVzYl9yY3ZidWxrcGlwZShkaWItPnVkZXYsZGliLT5kaWJkZXYtPmRldl9jbC0+cGlwZV9jbWQpKTsKLQl1c2JfY2xlYXJfaGFsdChkaWItPnVkZXYsdXNiX3JjdmJ1bGtwaXBlKGRpYi0+dWRldixkaWItPmRpYmRldi0+ZGV2X2NsLT5waXBlX2RhdGEpKTsKLQotCS8qIGFsbG9jYXRlIHRoZSBhcnJheSBmb3IgdGhlIGRhdGEgdHJhbnNmZXIgVVJCcyAqLwotCWRpYi0+dXJiX2xpc3QgPSBrbWFsbG9jKGRpYi0+ZGliZGV2LT5kZXZfY2wtPnVyYl9jb3VudCpzaXplb2Yoc3RydWN0IHVyYiAqKSxHRlBfS0VSTkVMKTsKLQlpZiAoZGliLT51cmJfbGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoZGliLT51cmJfbGlzdCwwLGRpYi0+ZGliZGV2LT5kZXZfY2wtPnVyYl9jb3VudCpzaXplb2Yoc3RydWN0IHVyYiAqKSk7Ci0KLQlkaWItPmluaXRfc3RhdGUgfD0gRElCVVNCX1NUQVRFX1VSQl9MSVNUOwotCi0JYnVmc2l6ZSA9IGRpYi0+ZGliZGV2LT5kZXZfY2wtPnVyYl9jb3VudCpkaWItPmRpYmRldi0+ZGV2X2NsLT51cmJfYnVmZmVyX3NpemU7Ci0JZGViX2luZm8oImFsbG9jYXRlICVkIGJ5dGVzIGFzIGJ1ZmZlcnNpemUgZm9yIGFsbCBVUkJzXG4iLGJ1ZnNpemUpOwotCS8qIGFsbG9jYXRlIHRoZSBhY3R1YWwgYnVmZmVyIGZvciB0aGUgVVJCcyAqLwotCWlmICgoZGliLT5idWZmZXIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChOVUxMLGJ1ZnNpemUsJmRpYi0+ZG1hX2hhbmRsZSkpID09IE5VTEwpIHsKLQkJZGViX2luZm8oIm5vdCBlbm91Z2ggbWVtb3J5LlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlkZWJfaW5mbygiYWxsb2NhdGlvbiBjb21wbGV0ZVxuIik7Ci0JbWVtc2V0KGRpYi0+YnVmZmVyLDAsYnVmc2l6ZSk7Ci0KLQlkaWItPmluaXRfc3RhdGUgfD0gRElCVVNCX1NUQVRFX1VSQl9CVUY7Ci0KLQkvKiBhbGxvY2F0ZSBhbmQgc3VibWl0IHRoZSBVUkJzICovCi0JZm9yIChpID0gMDsgaSA8IGRpYi0+ZGliZGV2LT5kZXZfY2wtPnVyYl9jb3VudDsgaSsrKSB7Ci0JCWlmICghKGRpYi0+dXJiX2xpc3RbaV0gPSB1c2JfYWxsb2NfdXJiKDAsR0ZQX0FUT01JQykpKSB7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCXVzYl9maWxsX2J1bGtfdXJiKCBkaWItPnVyYl9saXN0W2ldLCBkaWItPnVkZXYsCi0JCQkJdXNiX3JjdmJ1bGtwaXBlKGRpYi0+dWRldixkaWItPmRpYmRldi0+ZGV2X2NsLT5waXBlX2RhdGEpLAotCQkJCSZkaWItPmJ1ZmZlcltpKmRpYi0+ZGliZGV2LT5kZXZfY2wtPnVyYl9idWZmZXJfc2l6ZV0sCi0JCQkJZGliLT5kaWJkZXYtPmRldl9jbC0+dXJiX2J1ZmZlcl9zaXplLAotCQkJCWRpYnVzYl91cmJfY29tcGxldGUsIGRpYik7Ci0KLQkJZGliLT51cmJfbGlzdFtpXS0+dHJhbnNmZXJfZmxhZ3MgPSAwOwotCi0JCWRpYi0+aW5pdF9zdGF0ZSB8PSBESUJVU0JfU1RBVEVfVVJCX0lOSVQ7Ci0JfQotCi0JLyogZGliLT5waWRfcGFyc2UgaGVyZSBjb250YWlucyB0aGUgdmFsdWUgb2YgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgKi8KLQkvKiBkZWNpZGUgaWYgcGlkIHBhcnNpbmcgY2FuIGJlIGRlYWN0aXZhdGVkOgotCSAqIGlzIHBvc3NpYmxlIChieSBkZXZpY2UgdHlwZSkgYW5kIHdhbnRlZCAoYnkgdXNlcikKLQkgKi8KLQlzd2l0Y2ggKGRpYi0+ZGliZGV2LT5kZXZfY2wtPmlkKSB7Ci0JCWNhc2UgRElCVVNCMl8wOgotCQljYXNlIERJQlVTQjJfMEI6Ci0JCQlpZiAoZGliLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCAmJiAhZGliLT5waWRfcGFyc2UpIHsKLQkJCQlkZWZfcGlkX3BhcnNlID0gMDsKLQkJCQlpbmZvKCJydW5uaW5nIGF0IEhJR0ggc3BlZWQsIHdpbGwgZGVsaXZlciB0aGUgY29tcGxldGUgVFMuIik7Ci0JCQl9IGVsc2UKLQkJCQlpbmZvKCJ3aWxsIHVzZSBwaWRfcGFyc2luZy4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCS8qIGZyb20gaGVyZSBvbiBpdCBjb250YWlucyB0aGUgZGV2aWNlIGFuZCB1c2VyIGRlY2lzaW9uICovCi0JZGliLT5waWRfcGFyc2UgPSBkZWZfcGlkX3BhcnNlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBkaWJ1c2JfdXJiX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYikKLXsKLQlpbnQgaTsKLQotCWRpYnVzYl91cmJfa2lsbChkaWIpOwotCi0JaWYgKGRpYi0+aW5pdF9zdGF0ZSAmIERJQlVTQl9TVEFURV9VUkJfTElTVCkgewotCQlmb3IgKGkgPSAwOyBpIDwgZGliLT5kaWJkZXYtPmRldl9jbC0+dXJiX2NvdW50OyBpKyspIHsKLQkJCWlmIChkaWItPnVyYl9saXN0W2ldICE9IE5VTEwpIHsKLQkJCQlkZWJfaW5mbygiZnJlZWluZyBVUkIgbm8uICVkLlxuIixpKTsKLQkJCQkvKiBmcmVlIHRoZSBVUkJzICovCi0JCQkJdXNiX2ZyZWVfdXJiKGRpYi0+dXJiX2xpc3RbaV0pOwotCQkJfQotCQl9Ci0JCS8qIGZyZWUgdGhlIHVyYiBhcnJheSAqLwotCQlrZnJlZShkaWItPnVyYl9saXN0KTsKLQkJZGliLT5pbml0X3N0YXRlICY9IH5ESUJVU0JfU1RBVEVfVVJCX0xJU1Q7Ci0JfQotCi0JaWYgKGRpYi0+aW5pdF9zdGF0ZSAmIERJQlVTQl9TVEFURV9VUkJfQlVGKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KE5VTEwsCi0JCQlkaWItPmRpYmRldi0+ZGV2X2NsLT51cmJfYnVmZmVyX3NpemUqZGliLT5kaWJkZXYtPmRldl9jbC0+dXJiX2NvdW50LAotCQkJZGliLT5idWZmZXIsZGliLT5kbWFfaGFuZGxlKTsKLQotCWRpYi0+aW5pdF9zdGF0ZSAmPSB+RElCVVNCX1NUQVRFX1VSQl9CVUY7Ci0JZGliLT5pbml0X3N0YXRlICY9IH5ESUJVU0JfU1RBVEVfVVJCX0lOSVQ7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvZHZiLWRpYnVzYi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1kaWJ1c2IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2NWI2NC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kaWJ1c2IvZHZiLWRpYnVzYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qCi0gKiBkdmItZGlidXNiLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICoJcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KLSAqCi0gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgZHZiLWRpYnVzYi1jb3JlLmMgLgotICovCi0jaWZuZGVmIF9fRFZCX0RJQlVTQl9IX18KLSNkZWZpbmUgX19EVkJfRElCVVNCX0hfXwotCi0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLQotI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgotI2luY2x1ZGUgImR2Yl9kZW11eC5oIgotI2luY2x1ZGUgImR2Yl9uZXQuaCIKLSNpbmNsdWRlICJkbXhkZXYuaCIKLQotI2luY2x1ZGUgImRpYjMwMDAuaCIKLSNpbmNsdWRlICJtdDM1Mi5oIgotCi0vKiBkZWJ1ZyAqLwotI2lmZGVmIENPTkZJR19EVkJfRElCQ09NX0RFQlVHCi0jZGVmaW5lIGRwcmludGsobGV2ZWwsYXJncy4uLikgXAotCSAgICBkbyB7IGlmICgoZHZiX2RpYnVzYl9kZWJ1ZyAmIGxldmVsKSkgeyBwcmludGsoYXJncyk7IH0gfSB3aGlsZSAoMCkKLQotI2RlZmluZSBkZWJ1Z19kdW1wKGIsbCkge1wKLQlpbnQgaTsgXAotCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspIGRlYl94ZmVyKCIlMDJ4ICIsIGJbaV0pOyBcCi0JZGViX3hmZXIoIlxuIik7XAotfQotCi0jZWxzZQotI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pCi0jZGVmaW5lIGRlYnVnX2R1bXAoYixsKQotI2VuZGlmCi0KLWV4dGVybiBpbnQgZHZiX2RpYnVzYl9kZWJ1ZzsKLQotLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4zIgotI2RlZmluZSBEUklWRVJfREVTQyAiRGlCY29tIGJhc2VkIFVTQiBCdWRnZXQgRFZCLVQgZGV2aWNlIgotI2RlZmluZSBEUklWRVJfQVVUSE9SICJQYXRyaWNrIEJvZXR0Y2hlciwgcGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSIKLQotI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKDB4MDEsYXJncykKLSNkZWZpbmUgZGViX3hmZXIoYXJncy4uLikgZHByaW50aygweDAyLGFyZ3MpCi0jZGVmaW5lIGRlYl9hbG90KGFyZ3MuLi4pIGRwcmludGsoMHgwNCxhcmdzKQotI2RlZmluZSBkZWJfdHMoYXJncy4uLikgICBkcHJpbnRrKDB4MDgsYXJncykKLSNkZWZpbmUgZGViX2VycihhcmdzLi4uKSAgZHByaW50aygweDEwLGFyZ3MpCi0jZGVmaW5lIGRlYl9yYyhhcmdzLi4uKSAgIGRwcmludGsoMHgyMCxhcmdzKQotCi0vKiBnZW5lcmljIGxvZyBtZXRob2RzIC0gdGFrZW4gZnJvbSB1c2IuaCAqLwotI3VuZGVmIGVycgotI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgICAgICJkdmItZGlidXNiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQotI3VuZGVmIGluZm8KLSNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAgICAiZHZiLWRpYnVzYjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKLSN1bmRlZiB3YXJuCi0jZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImR2Yi1kaWJ1c2I6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCi0KLXN0cnVjdCBkaWJ1c2JfdXNiX2NvbnRyb2xsZXIgewotCWNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qIG5hbWUgb2YgdGhlIHVzYiBjb250cm9sbGVyICovCi0JdTE2IGNwdV9jc19yZWdpc3RlcjsgICAgLyogbmVlZHMgdG8gYmUgcmVzdGFydGVkLCB3aGVuIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBkb3dubG9hZGVkLiAqLwotfTsKLQotdHlwZWRlZiBlbnVtIHsKLQlESUJVU0IxXzEgPSAwLAotCURJQlVTQjFfMV9BTjIyMzUsCi0JRElCVVNCMl8wLAotCVVNVDJfMCwKLQlESUJVU0IyXzBCLAotCU5PVkFUX1VTQjIsCi0JRFRUMjAwVSwKLX0gZGlidXNiX2NsYXNzX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JRElCVVNCX1RVTkVSX0NBQkxFX1RIT01TT04gPSAwLAotCURJQlVTQl9UVU5FUl9DT0ZETV9QQU5BU09OSUNfRU5WNTdIMVhENSwKLQlESUJVU0JfVFVORVJfQ0FCTEVfTEdfVERUUF9FMTAyUCwKLQlESUJVU0JfVFVORVJfQ09GRE1fUEFOQVNPTklDX0VOVjc3SDExRDUsCi19IGRpYnVzYl90dW5lcl90OwotCi10eXBlZGVmIGVudW0gewotCURJQlVTQl9ESUIzMDAwTUIgPSAwLAotCURJQlVTQl9ESUIzMDAwTUMsCi0JRElCVVNCX01UMzUyLAotCURUVDIwMFVfRkUsCi19IGRpYnVzYl9kZW1vZHVsYXRvcl90OwotCi10eXBlZGVmIGVudW0gewotCURJQlVTQl9SQ19OTyA9IDAsCi0JRElCVVNCX1JDX05FQ19QUk9UT0NPTCwKLQlESUJVU0JfUkNfSEFVUFBBVUdFX1BST1RPLAotfSBkaWJ1c2JfcmVtb3RlX3Q7Ci0KLXN0cnVjdCBkaWJ1c2JfdHVuZXIgewotCWRpYnVzYl90dW5lcl90IGlkOwotCi0JdTggcGxsX2FkZHI7ICAgICAgIC8qIHR1bmVyIGkyYyBhZGRyZXNzICovCi19OwotZXh0ZXJuIHN0cnVjdCBkaWJ1c2JfdHVuZXIgZGlidXNiX3R1bmVyW107Ci0KLSNkZWZpbmUgRElCVVNCX1BPU1NJQkxFX0kyQ19BRERSX05VTSA0Ci1zdHJ1Y3QgZGlidXNiX2RlbW9kIHsKLQlkaWJ1c2JfZGVtb2R1bGF0b3JfdCBpZDsKLQotCWludCBwaWRfZmlsdGVyX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgLyogY291bnRlciBvZiB0aGUgaW50ZXJuYWwgcGlkX2ZpbHRlciAqLwotCXU4IGkyY19hZGRyc1tESUJVU0JfUE9TU0lCTEVfSTJDX0FERFJfTlVNXTsgLyogbGlzdCBvZiBwb3NzaWJsZSBpMmMgYWRkcmVzc2VzIG9mIHRoZSBkZW1vZCAqLwotfTsKLQotI2RlZmluZSBESUJVU0JfTUFYX1RVTkVSX05VTSAyCi1zdHJ1Y3QgZGlidXNiX2RldmljZV9jbGFzcyB7Ci0JZGlidXNiX2NsYXNzX3QgaWQ7Ci0KLQljb25zdCBzdHJ1Y3QgZGlidXNiX3VzYl9jb250cm9sbGVyICp1c2JfY3RybDsgLyogdXNiIGNvbnRyb2xsZXIgKi8KLQljb25zdCBjaGFyICpmaXJtd2FyZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFsaWQgZmlybXdhcmUgZmlsZW5hbWVzICovCi0KLQlpbnQgcGlwZV9jbWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCBwaXBlIChyZWFkL3dyaXRlKSAqLwotCWludCBwaXBlX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkYXRhIHBpcGUgKi8KLQotCWludCB1cmJfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGF0YSBVUkJzIHRvIGJlIHN1Ym1pdHRlZCAqLwotCWludCB1cmJfYnVmZmVyX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciBlYWNoIFVSQiAqLwotCi0JZGlidXNiX3JlbW90ZV90IHJlbW90ZV90eXBlOyAgICAgICAgICAgICAgICAgIC8qIGRvZXMgdGhpcyBkZXZpY2UgaGF2ZSBhIGlyLXJlY2VpdmVyICovCi0KLQlzdHJ1Y3QgZGlidXNiX2RlbW9kICpkZW1vZDsgICAgICAgICAgICAgICAgICAgLyogd2hpY2ggZGVtb2R1bGF0b3IgaXMgbW91bnQgKi8KLQlzdHJ1Y3QgZGlidXNiX3R1bmVyICp0dW5lcjsgICAgICAgICAgICAgICAgICAgLyogd2hpY2ggdHVuZXIgY2FuIGJlIGZvdW5kIGhlcmUgKi8KLX07Ci0KLSNkZWZpbmUgRElCVVNCX0lEX01BWF9OVU0gMTUKLXN0cnVjdCBkaWJ1c2JfdXNiX2RldmljZSB7Ci0JY29uc3QgY2hhciAqbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFsIG5hbWUgb2YgdGhlIGJveCAqLwotCXN0cnVjdCBkaWJ1c2JfZGV2aWNlX2NsYXNzICpkZXZfY2w7ICAgICAgICAgICAgICAgLyogd2hpY2ggZGlidXNiX2RldmljZV9jbGFzcyBpcyB0aGlzIGRldmljZSBwYXJ0IG9mICovCi0KLQlzdHJ1Y3QgdXNiX2RldmljZV9pZCAqY29sZF9pZHNbRElCVVNCX0lEX01BWF9OVU1dOyAvKiBsaXN0IG9mIFVTQiBpZHMgd2hlbiB0aGlzIGRldmljZSBpcyBhdCBwcmUgZmlybXdhcmUgc3RhdGUgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZV9pZCAqd2FybV9pZHNbRElCVVNCX0lEX01BWF9OVU1dOyAvKiBsaXN0IG9mIFVTQiBpZHMgd2hlbiB0aGlzIGRldmljZSBpcyBhdCBwb3N0IGZpcm13YXJlIHN0YXRlICovCi19OwotCi0vKiBhIFBJRCBmb3IgdGhlIHBpZF9maWx0ZXIgbGlzdCwgd2hlbiBpbiB1c2UgKi8KLXN0cnVjdCBkaWJ1c2JfcGlkCi17Ci0JaW50IGluZGV4OwotCXUxNiBwaWQ7Ci0JaW50IGFjdGl2ZTsKLX07Ci0KLXN0cnVjdCB1c2JfZGlidXNiIHsKLQkvKiB1c2IgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZSAqIHVkZXY7Ci0KLQlzdHJ1Y3QgZGlidXNiX3VzYl9kZXZpY2UgKiBkaWJkZXY7Ci0KLSNkZWZpbmUgRElCVVNCX1NUQVRFX0lOSVQgICAgICAgMHgwMDAKLSNkZWZpbmUgRElCVVNCX1NUQVRFX1VSQl9MSVNUICAgMHgwMDEKLSNkZWZpbmUgRElCVVNCX1NUQVRFX1VSQl9CVUYgICAgMHgwMDIKLSNkZWZpbmUgRElCVVNCX1NUQVRFX1VSQl9JTklUCTB4MDA0Ci0jZGVmaW5lIERJQlVTQl9TVEFURV9EVkIgICAgICAgIDB4MDA4Ci0jZGVmaW5lIERJQlVTQl9TVEFURV9JMkMgICAgICAgIDB4MDEwCi0jZGVmaW5lIERJQlVTQl9TVEFURV9SRU1PVEUJCTB4MDIwCi0jZGVmaW5lIERJQlVTQl9TVEFURV9VUkJfU1VCTUlUIDB4MDQwCi0JaW50IGluaXRfc3RhdGU7Ci0KLQlpbnQgZmVlZGNvdW50OwotCXN0cnVjdCBkaWJfZmVfeGZlcl9vcHMgeGZlcl9vcHM7Ci0KLQlzdHJ1Y3QgZGlidXNiX3R1bmVyICp0dW5lcjsKLQotCXN0cnVjdCB1cmIgKip1cmJfbGlzdDsKLQl1OCAqYnVmZmVyOwotCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKLQotCS8qIEkyQyAqLwotCXN0cnVjdCBpMmNfYWRhcHRlciBpMmNfYWRhcDsKLQotCS8qIGxvY2tpbmcgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIHVzYl9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZSBpMmNfc2VtOwotCi0JLyogZHZiICovCi0Jc3RydWN0IGR2Yl9hZGFwdGVyIGFkYXB0ZXI7Ci0Jc3RydWN0IGRteGRldiBkbXhkZXY7Ci0Jc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKLQlzdHJ1Y3QgZHZiX25ldCBkdmJfbmV0OwotCXN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlOwotCi0JaW50ICgqZmVfc2xlZXApIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOwotCWludCAoKmZlX2luaXQpIChzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOwotCi0JLyogcmVtb3RlIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgaW5wdXRfZGV2IHJjX2lucHV0X2RldjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmNfcXVlcnlfd29yazsKLQlpbnQgbGFzdF9ldmVudDsKLQlpbnQgbGFzdF9zdGF0ZTsgLyogZm9yIEhhdXBwYXVnZSBSQyBwcm90b2NvbCAqLwotCWludCByZXBlYXRfa2V5X2NvdW50OwotCWludCByY19rZXlfcmVwZWF0X2NvdW50OyAvKiBtb2R1bGUgcGFyYW1ldGVyICovCi0KLQkvKiBtb2R1bGUgcGFyYW1ldGVycyAqLwotCWludCBwaWRfcGFyc2U7Ci0JaW50IHJjX3F1ZXJ5X2ludGVydmFsOwotfTsKLQotLyogY29tbW9ubHkgdXNlZCBmdW5jdGlvbnMgaW4gdGhlIHNlcGFyYXRlZCBmaWxlcyAqLwotCi0vKiBkdmItZGlidXNiLWZpcm13YXJlLmMgKi8KLWludCBkaWJ1c2JfbG9hZGZpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgZGlidXNiX3VzYl9kZXZpY2UgKmRpYmRldik7Ci0KLS8qIGR2Yi1kaWJ1c2ItcmVtb3RlLmMgKi8KLWludCBkaWJ1c2JfcmVtb3RlX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYik7Ci1pbnQgZGlidXNiX3JlbW90ZV9pbml0KHN0cnVjdCB1c2JfZGlidXNiICpkaWIpOwotCi0vKiBkdmItZGlidXNiLWZlLWkyYy5jICovCi1pbnQgZGlidXNiX2ZlX2luaXQoc3RydWN0IHVzYl9kaWJ1c2IqIGRpYik7Ci1pbnQgZGlidXNiX2ZlX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKmRpYik7Ci1pbnQgZGlidXNiX2kyY19pbml0KHN0cnVjdCB1c2JfZGlidXNiICpkaWIpOwotaW50IGRpYnVzYl9pMmNfZXhpdChzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliKTsKLQotLyogZHZiLWRpYnVzYi1kdmIuYyAqLwotdm9pZCBkaWJ1c2JfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncyk7Ci1pbnQgZGlidXNiX2R2Yl9pbml0KHN0cnVjdCB1c2JfZGlidXNiICpkaWIpOwotaW50IGRpYnVzYl9kdmJfZXhpdChzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliKTsKLQotLyogZHZiLWRpYnVzYi11c2IuYyAqLwotaW50IGRpYnVzYl9yZWFkd3JpdGVfdXNiKHN0cnVjdCB1c2JfZGlidXNiICpkaWIsIHU4ICp3YnVmLCB1MTYgd2xlbiwgdTggKnJidWYsCi0JdTE2IHJsZW4pOwotaW50IGRpYnVzYl93cml0ZV91c2Ioc3RydWN0IHVzYl9kaWJ1c2IgKmRpYiwgdTggKmJ1ZiwgdTE2IGxlbik7Ci0KLWludCBkaWJ1c2JfaHdfd2FrZXVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKik7Ci1pbnQgZGlidXNiX2h3X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKik7Ci1pbnQgZGlidXNiX3NldF9zdHJlYW1pbmdfbW9kZShzdHJ1Y3QgdXNiX2RpYnVzYiAqLHU4KTsKLWludCBkaWJ1c2Jfc3RyZWFtaW5nKHN0cnVjdCB1c2JfZGlidXNiICosaW50KTsKLQotaW50IGRpYnVzYl91cmJfaW5pdChzdHJ1Y3QgdXNiX2RpYnVzYiAqKTsKLWludCBkaWJ1c2JfdXJiX2V4aXQoc3RydWN0IHVzYl9kaWJ1c2IgKik7Ci0KLS8qIGR2Yi1mZS1kdHQyMDB1LmMgKi8KLXN0cnVjdCBkdmJfZnJvbnRlbmQqIGR0dDIwMHVfZmVfYXR0YWNoKHN0cnVjdCB1c2JfZGlidXNiICosc3RydWN0IGRpYl9mZV94ZmVyX29wcyAqKTsKLQotLyogaTJjIGFuZCB0cmFuc2ZlciBzdHVmZiAqLwotI2RlZmluZSBESUJVU0JfSTJDX1RJTUVPVVQJCQkJNTAwMAotCi0vKgotICogcHJvdG9jb2wgb2YgYWxsIGRpYnVzYiByZWxhdGVkIGRldmljZXMKLSAqLwotCi0vKgotICogYnVsayBtc2cgdG8vZnJvbSBlbmRwb2ludCAweDAxCi0gKgotICogZ2VuZXJhbCBzdHJ1Y3R1cmU6Ci0gKiByZXF1ZXN0X2J5dGUgcGFyYW1ldGVyX2J5dGVzCi0gKi8KLQotI2RlZmluZSBESUJVU0JfUkVRX1NUQVJUX1JFQUQJCQkweDAwCi0jZGVmaW5lIERJQlVTQl9SRVFfU1RBUlRfREVNT0QJCQkweDAxCi0KLS8qCi0gKiBpMmMgcmVhZAotICogYnVsayB3cml0ZTogMHgwMiAoKDdiaXQgaTJjX2FkZHIgPDwgMSkgJiAweDAxKSByZWdpc3Rlcl9ieXRlcyBsZW5ndGhfd29yZAotICogYnVsayByZWFkOiAgYnl0ZV9idWZmZXIgKGxlbmd0aF93b3JkIGJ5dGVzKQotICovCi0jZGVmaW5lIERJQlVTQl9SRVFfSTJDX1JFQUQJCQkweDAyCi0KLS8qCi0gKiBpMmMgd3JpdGUKLSAqIGJ1bGsgd3JpdGU6IDB4MDMgKDdiaXQgaTJjX2FkZHIgPDwgMSkgcmVnaXN0ZXJfYnl0ZXMgdmFsdWVfYnl0ZXMKLSAqLwotI2RlZmluZSBESUJVU0JfUkVRX0kyQ19XUklURQkJCTB4MDMKLQotLyoKLSAqIHBvbGxpbmcgdGhlIHZhbHVlIG9mIHRoZSByZW1vdGUgY29udHJvbAotICogYnVsayB3cml0ZTogMHgwNAotICogYnVsayByZWFkOiAgYnl0ZV9idWZmZXIgKDUgYnl0ZXMpCi0gKgotICogZmlyc3QgYnl0ZSBvZiBieXRlX2J1ZmZlciBzaG93cyB0aGUgc3RhdHVzICgweDAwLCAweDAxLCAweDAyKQotICovCi0jZGVmaW5lIERJQlVTQl9SRVFfUE9MTF9SRU1PVEUJCQkweDA0Ci0KLSNkZWZpbmUgRElCVVNCX1JDX05FQ19FTVBUWQkJCQkweDAwCi0jZGVmaW5lIERJQlVTQl9SQ19ORUNfS0VZX1BSRVNTRUQJCTB4MDEKLSNkZWZpbmUgRElCVVNCX1JDX05FQ19LRVlfUkVQRUFURUQJCTB4MDIKLQotLyogYWRkaXRpb25hbCBzdGF0dXMgdmFsdWVzIGZvciBIYXVwcGF1Z2UgUmVtb3RlIENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgRElCVVNCX1JDX0hBVVBQQVVHRV9LRVlfUFJFU1NFRAkweDAxCi0jZGVmaW5lIERJQlVTQl9SQ19IQVVQUEFVR0VfS0VZX0VNUFRZCTB4MDMKLQotLyogc3RyZWFtaW5nIG1vZGU6Ci0gKiBidWxrIHdyaXRlOiAweDA1IG1vZGVfYnl0ZQotICoKLSAqIG1vZGVfYnl0ZSBpcyBtb3N0bHkgMHgwMAotICovCi0jZGVmaW5lIERJQlVTQl9SRVFfU0VUX1NUUkVBTUlOR19NT0RFCTB4MDUKLQotLyogaW50ZXJydXB0IHRoZSBpbnRlcm5hbCByZWFkIGxvb3AsIHdoZW4gYmxvY2tpbmcgKi8KLSNkZWZpbmUgRElCVVNCX1JFUV9JTlRSX1JFQUQJCQkweDA2Ci0KLS8qIGlvIGNvbnRyb2wKLSAqIDB4MDcgY21kX2J5dGUgcGFyYW1fYnl0ZXMKLSAqCi0gKiBwYXJhbV9ieXRlcyBjYW4gYmUgdXAgdG8gMzIgYnl0ZXMKLSAqCi0gKiBjbWRfYnl0ZSBmdW5jdGlvbiAgICBwYXJhbWV0ZXIgbmFtZQotICogMHgwMCAgICAgcG93ZXIgbW9kZQotICogICAgICAgICAgICAgICAgICAgICAgMHgwMCAgICAgIHNsZWVwCi0gKiAgICAgICAgICAgICAgICAgICAgICAweDAxICAgICAgd2FrZXVwCi0gKgotICogMHgwMSAgICAgZW5hYmxlIHN0cmVhbWluZwotICogMHgwMiAgICAgZGlzYWJsZSBzdHJlYW1pbmcKLSAqCi0gKgotICovCi0jZGVmaW5lIERJQlVTQl9SRVFfU0VUX0lPQ1RMCQkJMHgwNwotCi0vKiBJT0NUTCBjb21tYW5kcyAqLwotCi0vKiBjaGFuZ2UgdGhlIHBvd2VyIG1vZGUgaW4gZmlybXdhcmUgKi8KLSNkZWZpbmUgRElCVVNCX0lPQ1RMX0NNRF9QT1dFUl9NT0RFCQkweDAwCi0jZGVmaW5lIERJQlVTQl9JT0NUTF9QT1dFUl9TTEVFUAkJCTB4MDAKLSNkZWZpbmUgRElCVVNCX0lPQ1RMX1BPV0VSX1dBS0VVUAkJCTB4MDEKLQotLyogbW9kaWZ5IHN0cmVhbWluZyBvZiB0aGUgRlgyICovCi0jZGVmaW5lIERJQlVTQl9JT0NUTF9DTURfRU5BQkxFX1NUUkVBTQkweDAxCi0jZGVmaW5lIERJQlVTQl9JT0NUTF9DTURfRElTQUJMRV9TVFJFQU0JMHgwMgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RpYnVzYi9kdmItZmUtZHR0MjAwdS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1mZS1kdHQyMDB1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzJhYTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZGlidXNiL2R2Yi1mZS1kdHQyMDB1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoKLSAqIGR2Yi1kdHQyMDB1LWZlLmMgaXMgYSBkcml2ZXIgd2hpY2ggaW1wbGVtZW50cyB0aGUgZnJvbnRlbmQtcGFydCBvZiB0aGUKLSAqIFlha3Vtby9UeXBob29uL0hhbWEgVVNCMi4wIGJveGVzLiBJdCBpcyBoYXJkLXdpcmVkIHRvIHRoZSBkaWJ1c2ItZHJpdmVyIGFzCi0gKiBpdCB1c2VzIHRoZSB1c2ItdHJhbnNmZXIgZnVuY3Rpb25zIGRpcmVjdGx5IChtYXliZSBjcmVhdGluZyBhCi0gKiBnZW5lcmljLWR2Yi11c2ItbGliIGZvciBhbGwgdXNiLWRyaXZlcnMgd2lsbCBiZSByZWR1Y2Ugc29tZSBtb3JlIGNvZGUuKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4KLSAqCi0gKiBzZWUgZHZiLWRpYnVzYi1jb3JlLmMgZm9yIGNvcHlyaWdodCBkZXRhaWxzLgotICovCi0KLS8qIGd1ZXNzZWQgcHJvdG9jb2wgZGVzY3JpcHRpb24gKHJldmVyc2UgZW5naW5lZXJlZCk6Ci0gKiByZWFkCi0gKiAgMDAgLSBVU0IgdHlwZSAweDAyIGZvciB1c2IyLjAsIDB4MDEgZm9yIHVzYjEuMQotICogIDgxIC0gPFRTX0xPQ0s+IDxjdXJyZW50IGZyZXF1ZW5jeSBkaXZpZGVkIGJ5IDI1MDAwMD4KLSAqICA4MiAtIGNyYXNoIC0gZG8gbm90IHRvdWNoCi0gKiAgODMgLSBjcmFzaCAtIGRvIG5vdCB0b3VjaAotICogIDg0IC0gcmVtb3RlIGNvbnRyb2wKLSAqICA4NSAtIGNyYXNoIC0gZG8gbm90IHRvdWNoIChPSywgc3RvcCB0ZXN0aW5nIGhlcmUpCi0gKiAgODggLSBsb2NraW5nIDIgYnl0ZXMgKDB4ODAgMHg0MCA9PSBubyBzaWduYWwsIDB4ODkgMHgyMCA9PSBuaWNlIHNpZ25hbCkKLSAqICA4OSAtIG5vaXNlLXRvLXNpZ25hbAotICoJOGEgLSB1bmtvd24gMSBieXRlIC0gc2lnbmFsX3N0cmVuZ3RoCi0gKiAgOGMgLSBiZXIgPz8/Ci0gKiAgOGQgLSBiZXIKLSAqICA4ZSAtIHVuYwotICoKLSAqIHdyaXRlCi0gKiAgMDIgLSBiYW5kd2lkdGgKLSAqICAwMyAtIGZyZXF1ZW5jeSAoZGl2aWRlZCBieSAyNTAwMDApCi0gKiAgMDQgLSBwaWQgdGFibGUgKGluZGV4IHBpZCg3OjApIHBpZCgxMjo4KSkKLSAqICAwNSAtIHJlc2V0IHRoZSBwaWQgdGFibGUKLSAqICAwOCAtIGRlbW9kIHRyYW5zZmVyIGVuYWJsZWQgb3Igbm90IChGWDIgdHJhbnNmZXIgaXMgZW5hYmxlZCBieSBkZWZhdWx0KQotICovCi0KLSNpbmNsdWRlICJkdmItZGlidXNiLmgiCi0jaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCi0KLXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlIHsKLQlzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliOwotCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIGZlcDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwotfTsKLQotI2RlZmluZSBtb2FuKHdoaWNoLHdoYXQpIGluZm8oInVuZXhwZWN0ZWQgdmFsdWUgaW4gJyVzJyBmb3IgY21kICclMDJ4JyAtIHBsZWFzZSByZXBvcnQgdG8gbGludXgtZHZiQGxpbnV4dHYub3JnIix3aGljaCx3aGF0KQotCi1zdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0KQotewotCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3WzFdID0geyAweDgxIH07Ci0JdTggYnJbM10gPSB7IDAgfTsKLS8vCXU4IGJkZWJbNV0gPSB7IDAgfTsKLQotCWRpYnVzYl9yZWFkd3JpdGVfdXNiKHN0YXRlLT5kaWIsYncsMSxiciwzKTsKLQlzd2l0Y2ggKGJyWzBdKSB7Ci0JCWNhc2UgMHgwMToKLQkJCSpzdGF0ID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwgRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU1lOQyB8IEZFX0hBU19MT0NLOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMDoKLQkJCSpzdGF0ID0gMDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbW9hbigiYnJbMF0iLDB4ODEpOwotCQkJYnJlYWs7Ci0JfQotCi0vLwlid1swXSA9IDB4ODg7Ci0vLwlkaWJ1c2JfcmVhZHdyaXRlX3VzYihzdGF0ZS0+ZGliLGJ3LDEsYmRlYiw1KTsKLQotLy8JZGViX2luZm8oIiUwMng6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIixid1swXSxiZGViWzBdLGJkZWJbMV0sYmRlYlsyXSxiZGViWzNdLGJkZWJbNF0pOwotCi0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqYmVyKQotewotCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3WzFdID0geyAweDhkIH07Ci0JKmJlciA9IDA7Ci0JZGlidXNiX3JlYWR3cml0ZV91c2Ioc3RhdGUtPmRpYixidywxLCh1OCopIGJlciwgMyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHR0MjAwdV9mZV9yZWFkX3VuY19ibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiAqdW5jKQotewotCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJ3WzFdID0geyAweDhjIH07Ci0JKnVuYyA9IDA7Ci0JZGlidXNiX3JlYWR3cml0ZV91c2Ioc3RhdGUtPmRpYixidywxLCh1OCopIHVuYywgMyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHR0MjAwdV9mZV9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzdHJlbmd0aCkKLXsKLQlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1OCBid1sxXSA9IHsgMHg4YSB9OwotCXU4IGI7Ci0JZGlidXNiX3JlYWR3cml0ZV91c2Ioc3RhdGUtPmRpYixidywxLCZiLCAxKTsKLQkqc3RyZW5ndGggPSAoYiA8PCA4KSB8IGI7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHR0MjAwdV9mZV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCi17Ci0Jc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTggYndbMV0gPSB7IDB4ODkgfTsKLQl1OCBiclsxXSA9IHsgMCB9OwotCWRpYnVzYl9yZWFkd3JpdGVfdXNiKHN0YXRlLT5kaWIsYncsMSxiciwxKTsKLQkqc25yID0gKCgweGZmIC0gYnJbMF0pIDw8IDgpIHwgKDB4ZmYgLSBiclswXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHR0MjAwdV9mZV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQotewotCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJbXSA9IHsgMHgwMSB9OwotCXJldHVybiBkaWJ1c2Jfd3JpdGVfdXNiKHN0YXRlLT5kaWIsYiwxKTsKLX0KLQotc3RhdGljIGludCBkdHQyMDB1X2ZlX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQotewotCXJldHVybiBkdHQyMDB1X2ZlX2luaXQoZmUpOwotfQotCi1zdGF0aWMgaW50IGR0dDIwMHVfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqdHVuZSkKLXsKLQl0dW5lLT5taW5fZGVsYXlfbXMgPSAxNTAwOwotCXR1bmUtPnN0ZXBfc2l6ZSA9IDE2NjY2NzsKLQl0dW5lLT5tYXhfZHJpZnQgPSAxNjY2NjcgKiAyOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGR0dDIwMHVfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAotCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCi17Ci0Jc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdTE2IGZyZXEgPSBmZXAtPmZyZXF1ZW5jeSAvIDI1MDAwMDsKLQl1OCBidyxid2J1ZlsyXSA9IHsgMHgwMywgMCB9LCBmcmVxYnVmWzNdID0geyAweDAyLCAwLCAwIH07Ci0KLQlzd2l0Y2ggKGZlcC0+dS5vZmRtLmJhbmR3aWR0aCkgewotCQljYXNlIEJBTkRXSURUSF84X01IWjogYncgPSA4OyBicmVhazsKLQkJY2FzZSBCQU5EV0lEVEhfN19NSFo6IGJ3ID0gNzsgYnJlYWs7Ci0JCWNhc2UgQkFORFdJRFRIXzZfTUhaOiBidyA9IDY7IGJyZWFrOwotCQljYXNlIEJBTkRXSURUSF9BVVRPOiByZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGViX2luZm8oInNldF9mcm9udGVuZFxuIik7Ci0KLQlid2J1ZlsxXSA9IGJ3OwotCWRpYnVzYl93cml0ZV91c2Ioc3RhdGUtPmRpYixid2J1ZiwyKTsKLQotCWZyZXFidWZbMV0gPSBmcmVxICYgMHhmZjsKLQlmcmVxYnVmWzJdID0gKGZyZXEgPj4gOCkgJiAweGZmOwotCWRpYnVzYl93cml0ZV91c2Ioc3RhdGUtPmRpYixmcmVxYnVmLDMpOwotCi0JbWVtY3B5KCZzdGF0ZS0+ZmVwLGZlcCxzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkdHQyMDB1X2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQotewotCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCW1lbWNweShmZXAsJnN0YXRlLT5mZXAsc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkdHQyMDB1X2ZlX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi17Ci0Jc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0Ja2ZyZWUoc3RhdGUpOwotfQotCi1zdGF0aWMgaW50IGR0dDIwMHVfcGlkX2NvbnRyb2woc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsaW50IGluZGV4LCBpbnQgcGlkLGludCBvbm9mZikKLXsKLQlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1OCBiX3BpZFs0XTsKLQlwaWQgPSBvbm9mZiA/IHBpZCA6IDA7Ci0KLQliX3BpZFswXSA9IDB4MDQ7Ci0JYl9waWRbMV0gPSBpbmRleDsKLQliX3BpZFsyXSA9IHBpZCAmIDB4ZmY7Ci0JYl9waWRbM10gPSAocGlkID4+IDgpICYgMHhmZjsKLQotCWRpYnVzYl93cml0ZV91c2Ioc3RhdGUtPmRpYixiX3BpZCw0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkdHQyMDB1X2ZpZm9fY29udHJvbChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmKQotewotCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGJfc3RyZWFtaW5nWzJdID0geyAweDA4LCBvbm9mZiB9OwotCXU4IGJfcnN0X3BpZFsxXSA9IHsgMHgwNSB9OwotCi0JZGlidXNiX3dyaXRlX3VzYihzdGF0ZS0+ZGliLGJfc3RyZWFtaW5nLDIpOwotCi0JaWYgKCFvbm9mZikKLQkJZGlidXNiX3dyaXRlX3VzYihzdGF0ZS0+ZGliLGJfcnN0X3BpZCwxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGR0dDIwMHVfZmVfb3BzOwotCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kKiBkdHQyMDB1X2ZlX2F0dGFjaChzdHJ1Y3QgdXNiX2RpYnVzYiAqZGliLCBzdHJ1Y3QgZGliX2ZlX3hmZXJfb3BzICp4ZmVyX29wcykKLXsKLQlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSogc3RhdGUgPSBOVUxMOwotCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KLQlzdGF0ZSA9IChzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlKSk7Ci0KLQlkZWJfaW5mbygiYXR0YWNoaW5nIGZyb250ZW5kIGR0dDIwMHVcbiIpOwotCi0Jc3RhdGUtPmRpYiA9IGRpYjsKLQotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmZHR0MjAwdV9mZV9vcHM7Ci0Jc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKLQotCXhmZXJfb3BzLT5maWZvX2N0cmwgPSBkdHQyMDB1X2ZpZm9fY29udHJvbDsKLQl4ZmVyX29wcy0+cGlkX2N0cmwgPSBkdHQyMDB1X3BpZF9jb250cm9sOwotCi0JZ290byBzdWNjZXNzOwotZXJyb3I6Ci0JcmV0dXJuIE5VTEw7Ci1zdWNjZXNzOgotCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwotfQotCi1zdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHR0MjAwdV9mZV9vcHMgPSB7Ci0JLmluZm8gPSB7Ci0JCS5uYW1lCQkJPSAiRFRUMjAwVSAoWWFrdW1vL1R5cGhvb24vSGFtYSkgRFZCLVQiLAotCQkudHlwZQkJCT0gRkVfT0ZETSwKLQkJLmZyZXF1ZW5jeV9taW4JCT0gNDQyNTAwMDAsCi0JCS5mcmVxdWVuY3lfbWF4CQk9IDg2NzI1MDAwMCwKLQkJLmZyZXF1ZW5jeV9zdGVwc2l6ZQk9IDI1MDAwMCwKLQkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAotCQkJCUZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfCBGRV9DQU5fRkVDXzNfNCB8Ci0JCQkJRkVfQ0FOX0ZFQ181XzYgfCBGRV9DQU5fRkVDXzdfOCB8IEZFX0NBTl9GRUNfQVVUTyB8Ci0JCQkJRkVfQ0FOX1FQU0sgfCBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8IEZFX0NBTl9RQU1fQVVUTyB8Ci0JCQkJRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAotCQkJCUZFX0NBTl9HVUFSRF9JTlRFUlZBTF9BVVRPIHwKLQkJCQlGRV9DQU5fUkVDT1ZFUiB8Ci0JCQkJRkVfQ0FOX0hJRVJBUkNIWV9BVVRPLAotCX0sCi0KLQkucmVsZWFzZSA9IGR0dDIwMHVfZmVfcmVsZWFzZSwKLQotCS5pbml0ID0gZHR0MjAwdV9mZV9pbml0LAotCS5zbGVlcCA9IGR0dDIwMHVfZmVfc2xlZXAsCi0KLQkuc2V0X2Zyb250ZW5kID0gZHR0MjAwdV9mZV9zZXRfZnJvbnRlbmQsCi0JLmdldF9mcm9udGVuZCA9IGR0dDIwMHVfZmVfZ2V0X2Zyb250ZW5kLAotCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGR0dDIwMHVfZmVfZ2V0X3R1bmVfc2V0dGluZ3MsCi0KLQkucmVhZF9zdGF0dXMgPSBkdHQyMDB1X2ZlX3JlYWRfc3RhdHVzLAotCS5yZWFkX2JlciA9IGR0dDIwMHVfZmVfcmVhZF9iZXIsCi0JLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHR0MjAwdV9mZV9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKLQkucmVhZF9zbnIgPSBkdHQyMDB1X2ZlX3JlYWRfc25yLAotCS5yZWFkX3VjYmxvY2tzID0gZHR0MjAwdV9mZV9yZWFkX3VuY19ibG9ja3MsCi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYwppbmRleCBjMjI1ZGU3Li42ODA1MGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kbXhkZXYuYwpAQCAtNDIsMTIgKzQyLDYgQEAKIAogI2RlZmluZSBkcHJpbnRrCWlmIChkZWJ1ZykgcHJpbnRrCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRteGRldl9maWx0ZXIgKgotZHZiX2RteGRldl9maWxlX3RvX2ZpbHRlcihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gKHN0cnVjdCBkbXhkZXZfZmlsdGVyICopIGZpbGUtPnByaXZhdGVfZGF0YTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGR2Yl9kbXhkZXZfYnVmZmVyX2luaXQoc3RydWN0IGRteGRldl9idWZmZXIgKmJ1ZmZlcikKIHsKIAlidWZmZXItPmRhdGE9TlVMTDsKQEAgLTY2OSw4ICs2NjMsMTAgQEAKIAogCQlyZXQgPSBmaWx0ZXItPmZlZWQudHMtPnN0YXJ0X2ZpbHRlcmluZyhmaWx0ZXItPmZlZWQudHMpOwogCi0JCWlmIChyZXQgPCAwKQorCQlpZiAocmV0IDwgMCkgeworCQkJZG14ZGV2LT5kZW11eC0+cmVsZWFzZV90c19mZWVkKGRteGRldi0+ZGVtdXgsICp0c2ZlZWQpOwogCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJCWJyZWFrOwogCX0KQEAgLTg0Miw3ICs4MzgsNyBAQAogc3RhdGljIHNzaXplX3QKIGR2Yl9kZW11eF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyPWR2Yl9kbXhkZXZfZmlsZV90b19maWx0ZXIoZmlsZSk7CisJc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlcj0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWludCByZXQ9MDsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRteGRldmZpbHRlci0+bXV0ZXgpKQpAQCAtODYzLDcgKzg1OSw3IEBACiBzdGF0aWMgaW50IGR2Yl9kZW11eF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBhcmcpCiB7Ci0Jc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlcj1kdmJfZG14ZGV2X2ZpbGVfdG9fZmlsdGVyKGZpbGUpOworCXN0cnVjdCBkbXhkZXZfZmlsdGVyICpkbXhkZXZmaWx0ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGRteGRldiAqZG14ZGV2PWRteGRldmZpbHRlci0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgYXJnPSh1bnNpZ25lZCBsb25nKSBwYXJnOwogCWludCByZXQ9MDsKQEAgLTk2MCw3ICs5NTYsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGR2Yl9kZW11eF9wb2xsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKLQlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZHZiX2RteGRldl9maWxlX3RvX2ZpbHRlcihmaWxlKTsKKwlzdHJ1Y3QgZG14ZGV2X2ZpbHRlciAqZG14ZGV2ZmlsdGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAogCWlmICghZG14ZGV2ZmlsdGVyKQpAQCAtOTg1LDcgKzk4MSw3IEBACiAKIHN0YXRpYyBpbnQgZHZiX2RlbXV4X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlciA9IGR2Yl9kbXhkZXZfZmlsZV90b19maWx0ZXIoZmlsZSk7CisJc3RydWN0IGRteGRldl9maWx0ZXIgKmRteGRldmZpbHRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZG14ZGV2ICpkbXhkZXYgPSBkbXhkZXZmaWx0ZXItPmRldjsKIAogCXJldHVybiBkdmJfZG14ZGV2X2ZpbHRlcl9mcmVlKGRteGRldiwgZG14ZGV2ZmlsdGVyKTsKQEAgLTExMDksNyArMTEwNSw2IEBACiAJCWR2Yl9kbXhkZXZfZmlsdGVyX3N0YXRlX3NldCgmZG14ZGV2LT5maWx0ZXJbaV0sIERNWERFVl9TVEFURV9GUkVFKTsKIAkJZG14ZGV2LT5kdnJbaV0uZGV2PWRteGRldjsKIAkJZG14ZGV2LT5kdnJbaV0uYnVmZmVyLmRhdGE9TlVMTDsKLQkJZHZiX2RteGRldl9maWx0ZXJfc3RhdGVfc2V0KCZkbXhkZXYtPmZpbHRlcltpXSwgRE1YREVWX1NUQVRFX0ZSRUUpOwogCQlkdmJfZG14ZGV2X2R2cl9zdGF0ZV9zZXQoJmRteGRldi0+ZHZyW2ldLCBETVhERVZfU1RBVEVfRlJFRSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGQxOTMwMWQuLmE4YmM4NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC0zNSwxMiArMzUsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKICNpbmNsdWRlICJkdmJkZXYuaCIKIAorLy8gI2RlZmluZSBERUJVR19MT0NLTE9TUyAxCisKIHN0YXRpYyBpbnQgZHZiX2Zyb250ZW5kX2RlYnVnOwogc3RhdGljIGludCBkdmJfc2h1dGRvd25fdGltZW91dCA9IDU7CiBzdGF0aWMgaW50IGR2Yl9mb3JjZV9hdXRvX2ludmVyc2lvbjsKQEAgLTExMiw2ICsxMTUsNyBAQAogCWludCBleGl0OwogCWludCB3YWtldXA7CiAJZmVfc3RhdHVzX3Qgc3RhdHVzOworCWZlX3NlY190b25lX21vZGVfdCB0b25lOwogfTsKIAogCkBAIC0zMjcsNyArMzMxLDggQEAKIAkJcmV0dXJuIDE7CiAKIAlpZiAoZmVwcml2LT5kdmJkZXYtPndyaXRlcnMgPT0gMSkKLQkJaWYgKGppZmZpZXMgLSBmZXByaXYtPnJlbGVhc2VfamlmZmllcyA+IGR2Yl9zaHV0ZG93bl90aW1lb3V0ICogSFopCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGZlcHJpdi0+cmVsZWFzZV9qaWZmaWVzICsKKwkJCQkJZHZiX3NodXRkb3duX3RpbWVvdXQgKiBIWikpCiAJCQlyZXR1cm4gMTsKIAogCXJldHVybiAwOwpAQCAtMzg5LDggKzM5NCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZmVwcml2LT5zZW0pKQogCQkJYnJlYWs7CkBAIC00MzMsOSArNDM3LDI2IEBACiAJCQkvKiB3ZSdyZSB0dW5lZCwgYW5kIHRoZSBsb2NrIGlzIHN0aWxsIGdvb2QuLi4gKi8KIAkJCWlmIChzICYgRkVfSEFTX0xPQ0spCiAJCQkJY29udGludWU7Ci0JCQllbHNlIHsKLQkJCQkvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2ssCi0JCQkJICogbmVlZCB0byB6aWd6YWcgKi8KKwkJCWVsc2UgeyAvKiBpZiB3ZSBfV0VSRV8gdHVuZWQsIGJ1dCBub3cgZG9uJ3QgaGF2ZSBhIGxvY2sgKi8KKyNpZmRlZiBERUJVR19MT0NLTE9TUworCQkJCS8qIGZpcnN0IG9mIGFsbCB0cnkgc2V0dGluZyB0aGUgdG9uZSBhZ2FpbiBpZiBpdCB3YXMgb24gLSB0aGlzCisJCQkJICogc29tZXRpbWVzIHdvcmtzIGFyb3VuZCBwcm9ibGVtcyB3aXRoIG5vaXN5IHBvd2VyIHN1cHBsaWVzICovCisJCQkJaWYgKGZlLT5vcHMtPnNldF90b25lICYmIChmZXByaXYtPnRvbmUgPT0gU0VDX1RPTkVfT04pKSB7CisJCQkJCWZlLT5vcHMtPnNldF90b25lKGZlLCBmZXByaXYtPnRvbmUpOworCQkJCQltZGVsYXkoMTAwKTsKKwkJCQkJcyA9IDA7CisJCQkJCWZlLT5vcHMtPnJlYWRfc3RhdHVzKGZlLCAmcyk7CisJCQkJCWlmIChzICYgRkVfSEFTX0xPQ0spIHsKKwkJCQkJCXByaW50aygiRFZCJWk6IExvY2sgd2FzIGxvc3QsIGJ1dCByZWdhaW5lZCBieSBzZXR0aW5nICIKKwkJCQkJCSAgICAgICAidGhlIHRvbmUuIFRoaXMgbWF5IGluZGljYXRlIHlvdXIgcG93ZXIgc3VwcGx5ICIKKwkJCQkJCSAgICAgICAiaXMgbm9pc3kvc2xpZ2h0bHkgaW5jb21wYXRhYmxlIHdpdGggdGhpcyBEVkItUyAiCisJCQkJCQkgICAgICAgImFkYXB0ZXJcbiIsIGZlLT5kdmItPm51bSk7CisJCQkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9UVU5FRDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQkJLyogc29tZSBvdGhlciByZWFzb24gZm9yIGxvc2luZyB0aGUgbG9jayAtIHN0YXJ0IHppZ3phZ2dpbmcgKi8KIAkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9aSUdaQUdfRkFTVDsKIAkJCQlmZXByaXYtPnN0YXJ0ZWRfYXV0b19zdGVwID0gZmVwcml2LT5hdXRvX3N0ZXA7CiAJCQkJY2hlY2tfd3JhcHBlZCA9IDA7CkBAIC02MjUsMTEgKzY0NiwyMSBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIEZFX1JFQURfU1RBVFVTOgotCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgKGZlX3N0YXR1c190KikgcGFyZyk7Ci0JCWJyZWFrOworCWNhc2UgRkVfUkVBRF9TVEFUVVM6IHsKKwkJZmVfc3RhdHVzX3QqIHN0YXR1cyA9IHBhcmc7CiAKKwkJLyogaWYgcmV0dW5lIHdhcyByZXF1ZXN0ZWQgYnV0IGhhc24ndCBvY2N1cmVkIHlldCwgcHJldmVudAorCQkgKiB0aGF0IHVzZXIgZ2V0IHNpZ25hbCBzdGF0ZSBmcm9tIHByZXZpb3VzIHR1bmluZyAqLworCQlpZihmZXByaXYtPnN0YXRlID09IEZFU1RBVEVfUkVUVU5FKSB7CisJCQllcnI9MDsKKwkJCSpzdGF0dXMgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCisJCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgc3RhdHVzKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgRkVfUkVBRF9CRVI6CiAJCWlmIChmZS0+b3BzLT5yZWFkX2JlcikKIAkJCWVyciA9IGZlLT5vcHMtPnJlYWRfYmVyKGZlLCAoX191MzIqKSBwYXJnKTsKQEAgLTY4MCw2ICs3MTEsNyBAQAogCQkJZXJyID0gZmUtPm9wcy0+c2V0X3RvbmUoZmUsIChmZV9zZWNfdG9uZV9tb2RlX3QpIHBhcmcpOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOworCQkJZmVwcml2LT50b25lID0gKGZlX3NlY190b25lX21vZGVfdCkgcGFyZzsKIAkJfQogCQlicmVhazsKIApAQCAtODgyLDYgKzkxNCw3IEBACiAJaW5pdF9NVVRFWCAoJmZlcHJpdi0+ZXZlbnRzLnNlbSk7CiAJZmUtPmR2YiA9IGR2YjsKIAlmZXByaXYtPmludmVyc2lvbiA9IElOVkVSU0lPTl9PRkY7CisJZmVwcml2LT50b25lID0gU0VDX1RPTkVfT0ZGOwogCiAJcHJpbnRrICgiRFZCOiByZWdpc3RlcmluZyBmcm9udGVuZCAlaSAoJXMpLi4uXG4iLAogCQlmZS0+ZHZiLT5udW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCmluZGV4IGQyYjAyMTcuLjljMmMxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5oCkBAIC00MCwyOCArNDAsNiBAQAogCiAjaW5jbHVkZSAiZHZiZGV2LmgiCiAKLS8qIEZJWE1FOiBNb3ZlIHRvIGkyYy1pZC5oICovCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9TUDg4NzAJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0NYMjI3MDAJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0FUNzZDNjUxCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9DWDI0MTEwCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9DWDIyNzAyCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9ESUIzMDAwTUIJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0RTVAkJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX0RVTU1ZCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9MNjQ3ODEJSTJDX0RSSVZFUklEX0VYUDIKLSNkZWZpbmUgSTJDX0RSSVZFUklEX0RWQkZFX01UMzEyCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9NVDM1MglJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfTlhUNjAwMAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfU1A4ODdYCUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9TVFYwMjk5CUkyQ19EUklWRVJJRF9FWFAyCi0jZGVmaW5lIEkyQ19EUklWRVJJRF9EVkJGRV9UREExMDA0WAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVERBODA4MwlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVkVTMTgyMAlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVkVTMVg5MwlJMkNfRFJJVkVSSURfRVhQMgotI2RlZmluZSBJMkNfRFJJVkVSSURfRFZCRkVfVERBODBYWAlJMkNfRFJJVkVSSURfRVhQMgotCi0KIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyB7CiAgICAgICAgIGludCBtaW5fZGVsYXlfbXM7CiAgICAgICAgIGludCBzdGVwX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyZTViMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtMCwwICsxLDExOSBAQAorY29uZmlnIERWQl9VU0IKKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdmFyaW91cyBVU0IgRFZCIGRldmljZXMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBVU0IKKwlzZWxlY3QgRldfTE9BREVSCisJaGVscAorCSAgQnkgZW5hYmxpbmcgdGhpcyB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNob29zZSB0aGUgdmFyaW91cyBzdXBwb3J0ZWQKKwkgIFVTQjEuMSBhbmQgVVNCMi4wIERWQiBkZXZpY2VzLgorCisJICBBbG1vc3QgZXZlcnkgVVNCIGRldmljZSBuZWVkcyBhIGZpcm13YXJlLCBwbGVhc2UgbG9vayBpbnRvCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYj4uCisKKwkgIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIFVTQiBkZXZpY2VzIHNlZSB0aGUgTGludXhUViBEVkIgV2lraToKKwkgIDxodHRwOi8vd3d3LmxpbnV4dHYub3JnL3dpa2kvaW5kZXgucGhwL0RWQl9VU0I+CisKKwkgIFNheSBZIGlmIHlvdSBvd24gYSBVU0IgRFZCIGRldmljZS4KKworY29uZmlnIERWQl9VU0JfREVCVUcKKwlib29sICJFbmFibGUgZXh0ZW5kZWQgZGVidWcgc3VwcG9ydCBmb3IgYWxsIERWQi1VU0IgZGV2aWNlcyIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwloZWxwCisJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZGVidWdnaW5nLiBTZWUgbW9kaW5mbyBkdmItdXNiIChhbmQgdGhlCisJICBhcHByb3ByaWF0ZSBkcml2ZXJzKSBmb3IgZGVidWcgbGV2ZWxzLgorCitjb25maWcgRFZCX1VTQl9BODAwCisJdHJpc3RhdGUgIkFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCIDIuMCAoQTgwMCkiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUIzMDAwTUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEFWZXJNZWRpYSBBdmVyVFYgRFZCLVQgVVNCIDIuMCAoQTgwMCkgcmVjZWl2ZXIuCisKK2NvbmZpZyBEVkJfVVNCX0RJQlVTQl9NQgorCXRyaXN0YXRlICJEaUJjb20gVVNCIERWQi1UIGRldmljZXMgKGJhc2VkIG9uIHRoZSBEaUIzMDAwTS1CKSAoc2VlIGhlbHAgZm9yIGRldmljZSBsaXN0KSIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0RJQjMwMDBNQgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFVTQiAxLjEgYW5kIDIuMCBEVkItVCByZWNlaXZlcnMgYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbnMgbWFkZSBieQorCSAgRGlCY29tICg8aHR0cDovL3d3dy5kaWJjb20uZnI+KSBlcXVpcHBlZCB3aXRoIGEgRGlCMzAwME0tQiBkZW1vZHVsYXRvci4KKworCSAgRGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXI6CisJICAgIFR3aW5oYW5EVFYgVVNCLVRlciAoVlA3MDQxKQorCSAgICBUd2luaGFuRFRWIE1hZ2ljIEJveCAoVlA3MDQxZSkKKwkgICAgS1dvcmxkL0pldFdheS9BRFNUZWNoIFYtU3RyZWFtIFhQRVJUIERUViAtIERWQi1UIFVTQjEuMSBhbmQgVVNCMi4wCisJICAgIEhhbWEgRFZCLVQgVVNCMS4xLUJveAorCSAgICBEaUJjb20gVVNCMS4xIHJlZmVyZW5jZSBkZXZpY2VzIChub24tcHVibGljKQorCSAgICBVbHRpbWEgRWxlY3Ryb25pYy9BcnRlYyBUMSBVU0IgVFZCT1gKKwkgICAgQ29tcHJvIFZpZGVvbWF0ZSBEVkItVTIwMDAgLSBEVkItVCBVU0IKKwkgICAgR3JhbmR0ZWMgRFZCLVQgVVNCCisJICAgIEF2ZXJtZWRpYSBBdmVyVFYgRFZCVCBVU0IxLjEKKwkgICAgQXJ0ZWMgVDEgVVNCMS4xIGJveGVzCisKKwkgIFRoZSBWUDcwNDEgc2VlbXMgdG8gYmUgaWRlbnRpY2FsIHRvICJDVFMgUG9ydGFibGUiIChDaGluZXNlCisJICBUZWxldmlzaW9uIFN5c3RlbSkuCisKKwkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuIFlvdSBzaG91bGQgYnVpbGQgaXQgYXMKKwkgIGEgbW9kdWxlLgorCitjb25maWcgRFZCX1VTQl9ESUJVU0JfTUMKKwl0cmlzdGF0ZSAiRGlCY29tIFVTQiBEVkItVCBkZXZpY2VzIChiYXNlZCBvbiB0aGUgRGlCMzAwME0tQy9QKSAoc2VlIGhlbHAgZm9yIGRldmljZSBsaXN0KSIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0RJQjMwMDBNQworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIDIuMCBEVkItVCByZWNlaXZlcnMgYmFzZWQgb24gcmVmZXJlbmNlIGRlc2lnbnMgbWFkZSBieQorCSAgRGlCY29tICg8aHR0cDovL3d3dy5kaWJjb20uZnI+KSBlcXVpcHBlZCB3aXRoIGEgRGlCMzAwME0tQy9QIGRlbW9kdWxhdG9yLgorCisJICBEZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjoKKwkgICAgRGlCY29tIFVTQjIuMCByZWZlcmVuY2UgZGV2aWNlcyAobm9uLXB1YmxpYykKKwkgICAgQXJ0ZWMgVDEgVVNCMi4wIGJveGVzCisKKwkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuIFlvdSBzaG91bGQgYnVpbGQgaXQgYXMKKwkgIGEgbW9kdWxlLgorCitjb25maWcgRFZCX1VTQl9VTVRfMDEwCisJdHJpc3RhdGUgIkhhbmZUZWsgVU1ULTAxMCBEVkItVCBVU0IyLjAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwlzZWxlY3QgRFZCX0RJQjMwMDBNQworCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgSGFuZlRlayBVTVQtMDEwIFVTQjIuMCBzdGljay1zaXplZCBEVkItVCByZWNlaXZlci4KKworY29uZmlnIERWQl9VU0JfQ1hVU0IKKwl0cmlzdGF0ZSAiTWVkaW9uIE1EOTU3MDAgaHlicmlkIFVTQjIuMCAoQ29uZXhhbnQpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9DWDIyNzAyCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBNZWRpb24gTUQ5NTcwMCBoeWJyaWQgVVNCMi4wIGRldmljZS4gQ3VycmVudGx5CisJICBvbmx5IHRoZSBEVkItVCBwYXJ0IGlzIHN1cHBvcnRlZC4KKworY29uZmlnIERWQl9VU0JfRElHSVRWCisJdHJpc3RhdGUgIk5lYnVsYSBFbGVjdHJvbmljcyB1RGlnaVRWIERWQi1UIFVTQjIuMCBzdXBwb3J0IgorCWRlcGVuZHMgb24gRFZCX1VTQgorCXNlbGVjdCBEVkJfTlhUNjAwMAorCXNlbGVjdCBEVkJfTVQzNTIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIE5lYnVsYSBFbGVjdHJvbmljcyB1RGlnaXRWIFVTQjIuMCBEVkItVCByZWNlaXZlci4KKworY29uZmlnIERWQl9VU0JfVlA3MDQ1CisJdHJpc3RhdGUgIlR3aW5oYW5EVFYgQWxwaGEvTWFnaWNCb3hJSSBhbmQgRE5UViB0aW55VVNCMiBEVkItVCBVU0IyLjAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlCisJICAgIFR3aW5oYW5EVFYgQWxwaGEgKHN0aWNrKSAoVlAtNzA0NSksCisJCVR3aW5oYW5EVFYgTWFnaWNCb3ggSUkgKFZQLTcwNDYpIGFuZAorCQlEaWdpdGFsTm93IFRpbnlVU0IgMiBEVkItdCBEVkItVCBVU0IyLjAgcmVjZWl2ZXJzLgorCitjb25maWcgRFZCX1VTQl9OT1ZBX1RfVVNCMgorCXRyaXN0YXRlICJIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIHVzYjIgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEVkJfVVNCCisJc2VsZWN0IERWQl9ESUIzMDAwTUMKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCisKK2NvbmZpZyBEVkJfVVNCX0RUVDIwMFUKKwl0cmlzdGF0ZSAiV2lkZVZpZXcgV1QtMjAwVSBhbmQgV1QtMjIwVSAocGVuKSBEVkItVCBVU0IyLjAgc3VwcG9ydCAoWWFrdW1vL0hhbWEvVHlwaG9vbi9ZdWFuKSIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlIFdpZGVWaWV3L1lha3Vtby9IYW1hL1R5cGhvb24vWXVhbiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCisKKwkgIFRoZSByZWNlaXZlcnMgYXJlIGFsc28ga25vd24gYXMgRFRUMjAwVSAoWWFrdW1vKSBhbmQgVUIzMDAgKFl1YW4pLgorCisJICBUaGUgV1QtMjIwVSBhbmQgaXRzIGNsb25lcyBhcmUgcGVuLXNpemVkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2ZDg3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAorZHZiLXVzYi1vYmpzID0gZHZiLXVzYi1maXJtd2FyZS5vIGR2Yi11c2ItaW5pdC5vIGR2Yi11c2ItdXJiLm8gZHZiLXVzYi1pMmMubyBkdmItdXNiLWR2Yi5vIGR2Yi11c2ItcmVtb3RlLm8KK29iai0kKENPTkZJR19EVkJfVVNCKSArPSBkdmItdXNiLm8KKworZHZiLXVzYi12cDcwNDUtb2JqcyA9IHZwNzA0NS5vIHZwNzA0NS1mZS5vCitvYmotJChDT05GSUdfRFZCX1VTQl9WUDcwNDUpICs9IGR2Yi11c2ItdnA3MDQ1Lm8KKworZHZiLXVzYi1kdHQyMDB1LW9ianMgPSBkdHQyMDB1Lm8gZHR0MjAwdS1mZS5vCitvYmotJChDT05GSUdfRFZCX1VTQl9EVFQyMDBVKSArPSBkdmItdXNiLWR0dDIwMHUubworCitkdmItdXNiLWRpYnVzYi1jb21tb24tb2JqcyA9IGRpYnVzYi1jb21tb24ubworCitkdmItdXNiLWE4MDAtb2JqcyA9IGE4MDAubworb2JqLSQoQ09ORklHX0RWQl9VU0JfQTgwMCkgKz0gZHZiLXVzYi1kaWJ1c2ItY29tbW9uLm8gZHZiLXVzYi1hODAwLm8KKworZHZiLXVzYi1kaWJ1c2ItbWItb2JqcyA9IGRpYnVzYi1tYi5vCitvYmotJChDT05GSUdfRFZCX1VTQl9ESUJVU0JfTUIpICs9IGR2Yi11c2ItZGlidXNiLWNvbW1vbi5vIGR2Yi11c2ItZGlidXNiLW1iLm8KKworZHZiLXVzYi1kaWJ1c2ItbWMtb2JqcyA9IGRpYnVzYi1tYy5vCitvYmotJChDT05GSUdfRFZCX1VTQl9ESUJVU0JfTUMpICs9IGR2Yi11c2ItZGlidXNiLWNvbW1vbi5vIGR2Yi11c2ItZGlidXNiLW1jLm8KKworZHZiLXVzYi1ub3ZhLXQtdXNiMi1vYmpzID0gbm92YS10LXVzYjIubworb2JqLSQoQ09ORklHX0RWQl9VU0JfTk9WQV9UX1VTQjIpICs9IGR2Yi11c2ItZGlidXNiLWNvbW1vbi5vIGR2Yi11c2Itbm92YS10LXVzYjIubworCitkdmItdXNiLXVtdC0wMTAtb2JqcyA9IHVtdC0wMTAubworb2JqLSQoQ09ORklHX0RWQl9VU0JfVU1UXzAxMCkgKz0gZHZiLXVzYi1kaWJ1c2ItY29tbW9uLm8gZHZiLXVzYi11bXQtMDEwLm8KKworZHZiLXVzYi1kaWdpdHYtb2JqcyA9IGRpZ2l0di5vCitvYmotJChDT05GSUdfRFZCX1VTQl9ESUdJVFYpICs9IGR2Yi11c2ItZGlnaXR2Lm8KKworZHZiLXVzYi1jeHVzYi1vYmpzID0gY3h1c2Iubworb2JqLSQoQ09ORklHX0RWQl9VU0JfQ1hVU0IpICs9IGR2Yi11c2ItY3h1c2IubworCitFWFRSQV9DRkxBR1MgPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlLyAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hODAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmY2MyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYTgwMC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBEVkIgVVNCIGZyYW1ld29yayBjb21wbGlhbnQgTGludXggZHJpdmVyIGZvciB0aGUgQVZlck1lZGlhIEF2ZXJUViBEVkItVAorICogVVNCMi4wIChBODAwKSBEVkItVCByZWNlaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICogVGhhbmtzIHRvCisgKiAgIC0gQVZlck1lZGlhIHdobyBraW5kbHkgcHJvdmlkZWQgaW5mb3JtYXRpb24gYW5kCisgKiAgIC0gR2xlbiBIYXJyaXMgd2hvIHN1ZmZlcmVkIGZyb20gbXkgbWlzdGFrZXMgZHVyaW5nIGRldmVsb3BtZW50LgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZGlidXNiLmgiCisKK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAocmM9MSAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworI2RlZmluZSBkZWJfcmMoYXJncy4uLikgICBkcHJpbnRrKGRlYnVnLDB4MDEsYXJncykKKworc3RhdGljIGludCBhODAwX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJLyogZG8gbm90aGluZyBmb3IgdGhlIEFWZXJNZWRpYSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcmNfa2V5IGE4MDBfcmNfa2V5c1tdID0geworCXsgMHgwMiwgMHgwMSwgS0VZX1BST0cxIH0sICAgICAgIC8qIFNPVVJDRSAqLworCXsgMHgwMiwgMHgwMCwgS0VZX1BPV0VSIH0sICAgICAgIC8qIFBPV0VSICovCisJeyAweDAyLCAweDA1LCBLRVlfMSB9LCAgICAgICAgICAgLyogMSAqLworCXsgMHgwMiwgMHgwNiwgS0VZXzIgfSwgICAgICAgICAgIC8qIDIgKi8KKwl7IDB4MDIsIDB4MDcsIEtFWV8zIH0sICAgICAgICAgICAvKiAzICovCisJeyAweDAyLCAweDA5LCBLRVlfNCB9LCAgICAgICAgICAgLyogNCAqLworCXsgMHgwMiwgMHgwYSwgS0VZXzUgfSwgICAgICAgICAgIC8qIDUgKi8KKwl7IDB4MDIsIDB4MGIsIEtFWV82IH0sICAgICAgICAgICAvKiA2ICovCisJeyAweDAyLCAweDBkLCBLRVlfNyB9LCAgICAgICAgICAgLyogNyAqLworCXsgMHgwMiwgMHgwZSwgS0VZXzggfSwgICAgICAgICAgIC8qIDggKi8KKwl7IDB4MDIsIDB4MGYsIEtFWV85IH0sICAgICAgICAgICAvKiA5ICovCisJeyAweDAyLCAweDEyLCBLRVlfTEVGVCB9LCAgICAgICAgLyogTCAvIERJU1BMQVkgKi8KKwl7IDB4MDIsIDB4MTEsIEtFWV8wIH0sICAgICAgICAgICAvKiAwICovCisJeyAweDAyLCAweDEzLCBLRVlfUklHSFQgfSwgICAgICAgLyogUiAvIENIIFJUTiAqLworCXsgMHgwMiwgMHgxNywgS0VZX1BST0cyIH0sICAgICAgIC8qIFNOQVAgU0hPVCAqLworCXsgMHgwMiwgMHgxMCwgS0VZX1BST0czIH0sICAgICAgIC8qIDE2LUNIIFBSRVYgKi8KKwl7IDB4MDIsIDB4MDMsIEtFWV9DSEFOTkVMVVAgfSwgICAvKiBDSCBVUCAqLworCXsgMHgwMiwgMHgxZSwgS0VZX1ZPTFVNRURPV04gfSwgIC8qIFZPTCBET1dOICovCisJeyAweDAyLCAweDBjLCBLRVlfWk9PTSB9LCAgICAgICAgLyogRlVMTCBTQ1JFRU4gKi8KKwl7IDB4MDIsIDB4MWYsIEtFWV9WT0xVTUVVUCB9LCAgICAvKiBWT0wgVVAgKi8KKwl7IDB4MDIsIDB4MDIsIEtFWV9DSEFOTkVMRE9XTiB9LCAvKiBDSCBET1dOICovCisJeyAweDAyLCAweDE0LCBLRVlfTVVURSB9LCAgICAgICAgLyogTVVURSAqLworCXsgMHgwMiwgMHgwOCwgS0VZX0FVRElPIH0sICAgICAgIC8qIEFVRElPICovCisJeyAweDAyLCAweDE5LCBLRVlfUkVDT1JEIH0sICAgICAgLyogUkVDT1JEICovCisJeyAweDAyLCAweDE4LCBLRVlfUExBWSB9LCAgICAgICAgLyogUExBWSAqLworCXsgMHgwMiwgMHgxYiwgS0VZX1NUT1AgfSwgICAgICAgIC8qIFNUT1AgKi8KKwl7IDB4MDIsIDB4MWEsIEtFWV9QTEFZUEFVU0UgfSwgICAvKiBUSU1FU0hJRlQgLyBQQVVTRSAqLworCXsgMHgwMiwgMHgxZCwgS0VZX0JBQ0sgfSwgICAgICAgIC8qIDw8IC8gUkVEICovCisJeyAweDAyLCAweDFjLCBLRVlfRk9SV0FSRCB9LCAgICAgLyogPj4gLyBZRUxMT1cgKi8KKwl7IDB4MDIsIDB4MDMsIEtFWV9URVhUIH0sICAgICAgICAvKiBURUxFVEVYVCAqLworCXsgMHgwMiwgMHgwMSwgS0VZX0ZJUlNUIH0sICAgICAgIC8qIHw8PCAvIEdSRUVOICovCisJeyAweDAyLCAweDAwLCBLRVlfTEFTVCB9LCAgICAgICAgLyogPj58IC8gQkxVRSAqLworCXsgMHgwMiwgMHgwNCwgS0VZX0VQRyB9LCAgICAgICAgIC8qIEVQRyAqLworCXsgMHgwMiwgMHgxNSwgS0VZX01FTlUgfSwgICAgICAgIC8qIE1FTlUgKi8KKworCXsgMHgwMywgMHgwMywgS0VZX0NIQU5ORUxVUCB9LCAgIC8qIENIIFVQICovCisJeyAweDAzLCAweDAyLCBLRVlfQ0hBTk5FTERPV04gfSwgLyogQ0ggRE9XTiAqLworCXsgMHgwMywgMHgwMSwgS0VZX0ZJUlNUIH0sICAgICAgIC8qIHw8PCAvIEdSRUVOICovCisJeyAweDAzLCAweDAwLCBLRVlfTEFTVCB9LCAgICAgICAgLyogPj58IC8gQkxVRSAqLworCit9OworCitpbnQgYTgwMF9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCit7CisJdTgga2V5WzVdOworCWlmICh1c2JfY29udHJvbF9tc2coZC0+dWRldix1c2JfcmN2Y3RybHBpcGUoZC0+dWRldiwwKSwKKwkJCQkweDA0LCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX0lOLCAwLCAwLCBrZXksIDUsCisJCQkJMjAwMCkgIT0gNSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBjYWxsIHRoZSB1bml2ZXJzYWwgTkVDIHJlbW90ZSBwcm9jZXNzb3IsIHRvIGZpbmQgb3V0IHRoZSBrZXkncyBzdGF0ZSBhbmQgZXZlbnQgKi8KKwlkdmJfdXNiX25lY19yY19rZXlfdG9fZXZlbnQoZCxrZXksZXZlbnQsc3RhdGUpOworCWlmIChrZXlbMF0gIT0gMCkKKwkJZGViX3JjKCJrZXk6ICV4ICV4ICV4ICV4ICV4XG4iLGtleVswXSxrZXlbMV0sa2V5WzJdLGtleVszXSxrZXlbNF0pOworCXJldHVybiAwOworfQorCisvKiBVU0IgRHJpdmVyIHN0dWZmICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBhODAwX3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgYTgwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmE4MDBfcHJvcGVydGllcyxUSElTX01PRFVMRSk7Cit9CisKKy8qIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBJRCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGE4MDBfdGFibGUgW10gPSB7CisvKiAwMCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BVkVSTUVESUEsICAgICBVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQjJfQ09MRCkgfSwKKy8qIDAxICovCXsgVVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwgICAgIFVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCMl9XQVJNKSB9LAorCQkJeyB9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgYTgwMF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGE4MDBfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgfCBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKworCS5maXJtd2FyZSA9ICJkdmItdXNiLWF2ZXJ0di1hODAwLTAyLmZ3IiwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAorCisJLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwsCisJLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKKwkucGlkX2ZpbHRlcl9jdHJsICA9IGRpYnVzYl9waWRfZmlsdGVyX2N0cmwsCisJLnBvd2VyX2N0cmwgICAgICAgPSBhODAwX3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1jX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWNfdHVuZXJfYXR0YWNoLAorCisJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAorCS5yY19rZXlfbWFwICAgICAgID0gYTgwMF9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRShhODAwX3JjX2tleXMpLAorCS5yY19xdWVyeSAgICAgICAgID0gYTgwMF9yY19xdWVyeSwKKworCS5pMmNfYWxnbyAgICAgICAgID0gJmRpYnVzYl9pMmNfYWxnbywKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA3LAorCQkuZW5kcG9pbnQgPSAweDA2LAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgICAiQVZlck1lZGlhIEF2ZXJUViBEVkItVCBVU0IgMi4wIChBODAwKSIsCisJCQl7ICZhODAwX3RhYmxlWzBdLCBOVUxMIH0sCisJCQl7ICZhODAwX3RhYmxlWzFdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGE4MDBfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZHZiX3VzYl9hODAwIiwKKwkucHJvYmUJCT0gYTgwMF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlCT0gYTgwMF90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgYTgwMF9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJaWYgKChyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmE4MDBfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhODAwX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmE4MDBfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKGE4MDBfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGE4MDBfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVZlck1lZGlhIEF2ZXJUViBEVkItVCBVU0IgMi4wIChBODAwKSIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTFiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qIERWQiBVU0IgY29tcGxpYW50IGxpbnV4IGRyaXZlciBmb3IgQ29uZXhhbnQgVVNCIHJlZmVyZW5jZSBkZXNpZ24uCisgKgorICogVGhlIENvbmV4YW50IHJlZmVyZW5jZSBkZXNpZ24gSSBzYXcgb24gdGhlaXIgd2Vic2l0ZSB3YXMgb25seSBmb3IgYW5hbG9ndWUKKyAqIGNhcHR1cmluZyAodXNpbmcgdGhlIGN4MjU4NDIpLiBUaGUgYm94IEkgdG9vayB0byB3cml0ZSB0aGlzIGRyaXZlciAocmV2ZXJzZQorICogZW5naW5lZXJlZCkgaXMgdGhlIG9uZSBsYWJlbGVkIE1lZGlvbiBNRDk1NzAwLiBJbiBhZGRpdGlvbiB0byB0aGUgY3gyNTg0MgorICogZm9yIGFuYWxvZ3VlIGNhcHR1cmluZyBpdCBhbHNvIGhhcyBhIGN4MjI3MDIgRFZCLVQgZGVtb2R1bGF0b3Igb24gdGhlIG1haW4KKyAqIGJvYXJkLiBCZXNpZGVzIGl0IGhhcyBhIGF0aXJlbW90ZSAoWDEwKSBhbmQgYSBVU0IyLjAgaHViIG9uYm9hcmQuCisgKgorICogTWF5YmUgaXQgaXMgYSBsaXR0bGUgYml0IHByZW1hdHVyZSB0byBjYWxsIHRoaXMgZHJpdmVyIGN4dXNiLCBidXQgSSBhc3N1bWUKKyAqIHRoZSBVU0IgcHJvdG9jb2wgaXMgaWRlbnRpY2FsIG9yIGF0IGxlYXN0IGluaGVyaXRlZCBmcm9tIHRoZSByZWZlcmVuY2UKKyAqIGRlc2lnbiwgc28gaXQgY2FuIGJlIHJldXNlZCBmb3IgdGhlICJhbmFsb2d1ZS1vbmx5IiBkZXZpY2UgKGlmIGl0IHdpbGwKKyAqIGFwcGVhciBhdCBhbGwpLgorICoKKyAqIFRPRE86IGNoZWNrIGlmIHRoZSBjeDI1ODQwLWRyaXZlciAoZnJvbSBpdnR2KSBjYW4gYmUgdXNlZCBmb3IgdGhlIGFuYWxvZ3VlCisgKiBwYXJ0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiY3h1c2IuaCIKKworI2luY2x1ZGUgImN4MjI3MDIuaCIKKworLyogZGVidWcgKi8KK2ludCBkdmJfdXNiX2N4dXNiX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfY3h1c2JfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1yYyAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworCitzdGF0aWMgaW50IGN4dXNiX2N0cmxfbXNnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwKKwkJdTggY21kLCB1OCAqd2J1ZiwgaW50IHdsZW4sIHU4ICpyYnVmLCBpbnQgcmxlbikKK3sKKwlpbnQgd28gPSAocmJ1ZiA9PSBOVUxMIHx8IHJsZW4gPT0gMCk7IC8qIHdyaXRlLW9ubHkgKi8KKwl1OCBzbmRidWZbMSt3bGVuXTsKKwltZW1zZXQoc25kYnVmLDAsMSt3bGVuKTsKKworCXNuZGJ1ZlswXSA9IGNtZDsKKwltZW1jcHkoJnNuZGJ1ZlsxXSx3YnVmLHdsZW4pOworCWlmICh3bykKKwkJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsc25kYnVmLDErd2xlbik7CisJZWxzZQorCQlkdmJfdXNiX2dlbmVyaWNfcncoZCxzbmRidWYsMSt3bGVuLHJidWYscmxlbiwwKTsKKworCXJldHVybiAwOworfQorCisvKiBJMkMgKi8KK3N0YXRpYyB2b2lkIGN4dXNiX3NldF9pMmNfcGF0aChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGVudW0gY3h1c2JfaTJjX3BhdGhlcyBwYXRoKQoreworCXN0cnVjdCBjeHVzYl9zdGF0ZSAqc3QgPSBkLT5wcml2OworCXU4IG9bMl0saTsKKworCWlmIChwYXRoID09IHN0LT5jdXJfaTJjX3BhdGgpCisJCXJldHVybjsKKworCW9bMF0gPSBJT0NUTF9TRVRfSTJDX1BBVEg7CisJc3dpdGNoIChwYXRoKSB7CisJCWNhc2UgUEFUSF9DWDIyNzAyOgorCQkJb1sxXSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBQQVRIX1RVTkVSX09USEVSOgorCQkJb1sxXSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycigidW5rb3duIGkyYyBwYXRoIik7CisJCQlyZXR1cm47CisJfQorCWN4dXNiX2N0cmxfbXNnKGQsQ01EX0lPQ1RMLG8sMiwmaSwxKTsKKworCWlmIChpICE9IDB4MDEpCisJCWRlYl9pbmZvKCJpMmNfcGF0aCBzZXR0aW5nIGZhaWxlZC5cbiIpOworCisJc3QtPmN1cl9pMmNfcGF0aCA9IHBhdGg7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2JfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLHN0cnVjdCBpMmNfbXNnIG1zZ1tdLGludCBudW0pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlpbnQgaTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmQtPmkyY19zZW0pIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAobnVtID4gMikKKwkJd2FybigibW9yZSB0aGFuIDIgaTJjIG1lc3NhZ2VzIGF0IGEgdGltZSBpcyBub3QgaGFuZGxlZCB5ZXQuIFRPRE8uIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKworCQlzd2l0Y2ggKG1zZ1tpXS5hZGRyKSB7CisJCQljYXNlIDB4NjM6CisJCQkJY3h1c2Jfc2V0X2kyY19wYXRoKGQsUEFUSF9DWDIyNzAyKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJY3h1c2Jfc2V0X2kyY19wYXRoKGQsUEFUSF9UVU5FUl9PVEhFUik7CisJCQkJYnJlYWs7CisJCX0KKworCQkvKiByZWFkIHJlcXVlc3QgKi8KKwkJaWYgKGkrMSA8IG51bSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJCXU4IG9idWZbMyttc2dbaV0ubGVuXSwgaWJ1ZlsxK21zZ1tpKzFdLmxlbl07CisJCQlvYnVmWzBdID0gbXNnW2ldLmxlbjsKKwkJCW9idWZbMV0gPSBtc2dbaSsxXS5sZW47CisJCQlvYnVmWzJdID0gbXNnW2ldLmFkZHI7CisJCQltZW1jcHkoJm9idWZbM10sbXNnW2ldLmJ1Zixtc2dbaV0ubGVuKTsKKworCQkJaWYgKGN4dXNiX2N0cmxfbXNnKGQsIENNRF9JMkNfUkVBRCwKKwkJCQkJCW9idWYsIDMrbXNnW2ldLmxlbiwKKwkJCQkJCWlidWYsIDErbXNnW2krMV0ubGVuKSA8IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChpYnVmWzBdICE9IDB4MDgpCisJCQkJZGViX2luZm8oImkyYyByZWFkIGNvdWxkIGhhdmUgYmVlbiBmYWlsZWRcbiIpOworCisJCQltZW1jcHkobXNnW2krMV0uYnVmLCZpYnVmWzFdLG1zZ1tpKzFdLmxlbik7CisKKwkJCWkrKzsKKwkJfSBlbHNlIHsgLyogd3JpdGUgKi8KKwkJCXU4IG9idWZbMittc2dbaV0ubGVuXSwgaWJ1ZjsKKwkJCW9idWZbMF0gPSBtc2dbaV0uYWRkcjsKKwkJCW9idWZbMV0gPSBtc2dbaV0ubGVuOworCQkJbWVtY3B5KCZvYnVmWzJdLG1zZ1tpXS5idWYsbXNnW2ldLmxlbik7CisKKwkJCWlmIChjeHVzYl9jdHJsX21zZyhkLENNRF9JMkNfV1JJVEUsIG9idWYsIDIrbXNnW2ldLmxlbiwgJmlidWYsMSkgPCAwKQorCQkJCWJyZWFrOworCQkJaWYgKGlidWYgIT0gMHgwOCkKKwkJCQlkZWJfaW5mbygiaTJjIHdyaXRlIGNvdWxkIGhhdmUgYmVlbiBmYWlsZWRcbiIpOworCQl9CisJfQorCisJdXAoJmQtPmkyY19zZW0pOworCXJldHVybiBpOworfQorCitzdGF0aWMgdTMyIGN4dXNiX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gY3h1c2JfaTJjX2FsZ28gPSB7CisJLm5hbWUgICAgICAgICAgPSAiQ29uZXhhbnQgVVNCIEkyQyBhbGdvcml0aG0iLAorCS5pZCAgICAgICAgICAgID0gSTJDX0FMR09fQklULAorCS5tYXN0ZXJfeGZlciAgID0gY3h1c2JfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBjeHVzYl9pMmNfZnVuYywKK307CisKK3N0YXRpYyBpbnQgY3h1c2JfcG93ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeHVzYl9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKK3sKKwl1OCBidWZbMl0gPSB7IDB4MDMsIDB4MDAgfTsKKwlpZiAob25vZmYpCisJCWN4dXNiX2N0cmxfbXNnKGQsMHgzNiwgYnVmLCAyLCBOVUxMLCAwKTsKKwllbHNlCisJCWN4dXNiX2N0cmxfbXNnKGQsMHgzNywgTlVMTCwgMCwgTlVMTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGN4MjI3MDJfY29uZmlnIGN4dXNiX2N4MjI3MDJfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKKworCS5vdXRwdXRfbW9kZSA9IENYMjI3MDJfUEFSQUxMRUxfT1VUUFVULAorCisJLnBsbF9pbml0ID0gZHZiX3VzYl9wbGxfaW5pdF9pMmMsCisJLnBsbF9zZXQgID0gZHZiX3VzYl9wbGxfc2V0X2kyYywKK307CisKKy8qIENhbGxiYWNrcyBmb3IgRFZCIFVTQiAqLworc3RhdGljIGludCBjeHVzYl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXU4IGJwbGxbNF0gPSB7IDB4MGIsIDB4ZGMsIDB4OWMsIDB4YTAgfTsKKwlkLT5wbGxfYWRkciA9IDB4NjE7CisJbWVtY3B5KGQtPnBsbF9pbml0LGJwbGwsNCk7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9mbWQxMjE2bWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3h1c2JfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBidWZbMl0gPSB7IDB4MDMsIDB4MDAgfTsKKwl1OCBiID0gMDsKKworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LDAsMCkgPCAwKQorCQllcnIoInNldCBpbnRlcmZhY2UgdG8gYWx0cz0wIGZhaWxlZCIpOworCisJY3h1c2JfY3RybF9tc2coZCwweGRlLCZiLDAsTlVMTCwwKTsKKwljeHVzYl9zZXRfaTJjX3BhdGgoZCxQQVRIX1RVTkVSX09USEVSKTsKKwljeHVzYl9jdHJsX21zZyhkLENNRF9QT1dFUl9PRkYsIE5VTEwsIDAsICZiLCAxKTsKKworCWlmICh1c2Jfc2V0X2ludGVyZmFjZShkLT51ZGV2LDAsNikgPCAwKQorCQllcnIoInNldCBpbnRlcmZhY2UgZmFpbGVkIik7CisKKwljeHVzYl9jdHJsX21zZyhkLDB4MzYsIGJ1ZiwgMiwgTlVMTCwgMCk7CisJY3h1c2Jfc2V0X2kyY19wYXRoKGQsUEFUSF9DWDIyNzAyKTsKKwljeHVzYl9jdHJsX21zZyhkLENNRF9QT1dFUl9PTiwgTlVMTCwgMCwgJmIsIDEpOworCisJaWYgKChkLT5mZSA9IGN4MjI3MDJfYXR0YWNoKCZjeHVzYl9jeDIyNzAyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyogRFZCIFVTQiBEcml2ZXIgc3R1ZmYgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGN4dXNiX3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgY3h1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZjeHVzYl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGN4dXNiX3RhYmxlIFtdID0geworCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9NRURJT04sIFVTQl9QSURfTUVESU9OX01EOTU3MDApIH0sCisJCXt9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgY3h1c2JfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBjeHVzYl9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGN4dXNiX3N0YXRlKSwKKworCS5zdHJlYW1pbmdfY3RybCAgID0gY3h1c2Jfc3RyZWFtaW5nX2N0cmwsCisJLnBvd2VyX2N0cmwgICAgICAgPSBjeHVzYl9wb3dlcl9jdHJsLAorCS5mcm9udGVuZF9hdHRhY2ggID0gY3h1c2JfZnJvbnRlbmRfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfdHVuZXJfYXR0YWNoLAorCisJLmkyY19hbGdvICAgICAgICAgPSAmY3h1c2JfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkudXJiID0geworCQkudHlwZSA9IERWQl9VU0JfSVNPQywKKwkJLmNvdW50ID0gNSwKKwkJLmVuZHBvaW50ID0gMHgwMiwKKwkJLnUgPSB7CisJCQkuaXNvYyA9IHsKKwkJCQkuZnJhbWVzcGVydXJiID0gMzIsCisJCQkJLmZyYW1lc2l6ZSA9IDk0MCwKKwkJCQkuaW50ZXJ2YWwgPSA1LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJNZWRpb24gTUQ5NTcwMCAoTURVU0JUVi1IWUJSSUQpIiwKKwkJCXsgTlVMTCB9LAorCQkJeyAmY3h1c2JfdGFibGVbMF0sIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY3h1c2JfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZHZiX3VzYl9jeHVzYiIsCisJLnByb2JlCQk9IGN4dXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSBjeHVzYl90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgY3h1c2JfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZjeHVzYl9kcml2ZXIpKSkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIscmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGN4dXNiX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJmN4dXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChjeHVzYl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCAoY3h1c2JfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBDb25leGFudCBVU0IyLjAgaHlicmlkIHJlZmVyZW5jZSBkZXNpZ24iKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAtYWxwaGEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc5MDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX0RWQl9VU0JfQ1hVU0JfSF8KKyNkZWZpbmUgX0RWQl9VU0JfQ1hVU0JfSF8KKworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggImRpZ2l0diIKKyNpbmNsdWRlICJkdmItdXNiLmgiCisKK2V4dGVybiBpbnQgZHZiX3VzYl9jeHVzYl9kZWJ1ZzsKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfY3h1c2JfZGVidWcsMHgwMSxhcmdzKQorCisvKiB1c2IgY29tbWFuZHMgLSBzb21lIG9mIGl0IGFyZSBndWVzc2VzLCBkb24ndCBoYXZlIGEgcmVmZXJlbmNlIHlldCAqLworI2RlZmluZSBDTURfSTJDX1dSSVRFICAgIDB4MDgKKyNkZWZpbmUgQ01EX0kyQ19SRUFEICAgICAweDA5CisKKyNkZWZpbmUgQ01EX0lPQ1RMICAgICAgICAweDBlCisjZGVmaW5lICAgIElPQ1RMX1NFVF9JMkNfUEFUSCAweDAyCisKKyNkZWZpbmUgQ01EX1BPV0VSX09GRiAgICAweDUwCisjZGVmaW5lIENNRF9QT1dFUl9PTiAgICAgMHg1MQorCitlbnVtIGN4dXNiX2kyY19wYXRoZXMgeworCVBBVEhfVU5ERUYgICAgICAgPSAweDAwLAorCVBBVEhfQ1gyMjcwMiAgICAgPSAweDAxLAorCVBBVEhfVFVORVJfT1RIRVIgPSAweDAyLAorfTsKKworc3RydWN0IGN4dXNiX3N0YXRlIHsKKwllbnVtIGN4dXNiX2kyY19wYXRoZXMgY3VyX2kyY19wYXRoOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjYyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1jb21tb24uYwpAQCAtMCwwICsxLDI3MiBAQAorLyogQ29tbW9uIG1ldGhvZHMgZm9yIGRpYnVzYi1iYXNlZC1yZWNlaXZlcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpbmNsdWRlICJkaWJ1c2IuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8gKHwtYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pIGRwcmludGsoZGVidWcsMHgwMSxhcmdzKQorCisvKiBjb21tb24gc3R1ZmYgdXNlZCBieSB0aGUgZGlmZmVyZW50IGRpYnVzYiBtb2R1bGVzICovCitpbnQgZGlidXNiX3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCWlmIChkLT5wcml2ICE9IE5VTEwpIHsKKwkJc3RydWN0IGRpYl9mZV94ZmVyX29wcyAqb3BzID0gZC0+cHJpdjsKKwkJaWYgKG9wcy0+Zmlmb19jdHJsICE9IE5VTEwpCisJCQlpZiAob3BzLT5maWZvX2N0cmwoZC0+ZmUsb25vZmYpKSB7CisJCQkJZXJyKCJlcnJvciB3aGlsZSBjb250cm9sbGluZyB0aGUgZmlmbyBvZiB0aGUgZGVtb2QuIik7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2Jfc3RyZWFtaW5nX2N0cmwpOworCitpbnQgZGlidXNiX3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKwlpZiAoZC0+cHJpdiAhPSBOVUxMKSB7CisJCXN0cnVjdCBkaWJfZmVfeGZlcl9vcHMgKm9wcyA9IGQtPnByaXY7CisJCWlmIChkLT5waWRfZmlsdGVyaW5nICYmIG9wcy0+cGlkX2N0cmwgIT0gTlVMTCkKKwkJCW9wcy0+cGlkX2N0cmwoZC0+ZmUsaW5kZXgscGlkLG9ub2ZmKTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRpYnVzYl9waWRfZmlsdGVyKTsKKworaW50IGRpYnVzYl9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJaWYgKGQtPnByaXYgIT0gTlVMTCkgeworCQlzdHJ1Y3QgZGliX2ZlX3hmZXJfb3BzICpvcHMgPSBkLT5wcml2OworCQlpZiAob3BzLT5waWRfcGFyc2UgIT0gTlVMTCkKKwkJCWlmIChvcHMtPnBpZF9wYXJzZShkLT5mZSxvbm9mZikgPCAwKQorCQkJCWVycigiY291bGQgbm90IGhhbmRsZSBwaWRfcGFyc2VyIik7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsKTsKKworaW50IGRpYnVzYl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgaW50IG9ub2ZmKQoreworCXU4IGJbM107CisJaW50IHJldDsKKwliWzBdID0gRElCVVNCX1JFUV9TRVRfSU9DVEw7CisJYlsxXSA9IERJQlVTQl9JT0NUTF9DTURfUE9XRVJfTU9ERTsKKwliWzJdID0gb25vZmYgPyBESUJVU0JfSU9DVExfUE9XRVJfV0FLRVVQIDogRElCVVNCX0lPQ1RMX1BPV0VSX1NMRUVQOworCXJldCA9IGR2Yl91c2JfZ2VuZXJpY193cml0ZShkLGIsMyk7CisJbXNsZWVwKDEwKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2JfcG93ZXJfY3RybCk7CisKK2ludCBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggYlsyXTsKKwliWzBdID0gRElCVVNCX1JFUV9TRVRfSU9DVEw7CisJYlsxXSA9IG9ub2ZmID8gRElCVVNCX0lPQ1RMX0NNRF9FTkFCTEVfU1RSRUFNIDogRElCVVNCX0lPQ1RMX0NNRF9ESVNBQkxFX1NUUkVBTTsKKworCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLGIsMyk7CisKKwlyZXR1cm4gZGlidXNiX3N0cmVhbWluZ19jdHJsKGQsb25vZmYpOworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwpOworCitpbnQgZGlidXNiMl8wX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJaWYgKG9ub2ZmKSB7CisJCXU4IGJbM10gPSB7IERJQlVTQl9SRVFfU0VUX0lPQ1RMLCBESUJVU0JfSU9DVExfQ01EX1BPV0VSX01PREUsIERJQlVTQl9JT0NUTF9QT1dFUl9XQUtFVVAgfTsKKwkJcmV0dXJuIGR2Yl91c2JfZ2VuZXJpY193cml0ZShkLGIsMyk7CisJfSBlbHNlCisJCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2IyXzBfcG93ZXJfY3RybCk7CisKK3N0YXRpYyBpbnQgZGlidXNiX2kyY19tc2coc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBhZGRyLAorCQkJICB1OCAqd2J1ZiwgdTE2IHdsZW4sIHU4ICpyYnVmLCB1MTYgcmxlbikKK3sKKwl1OCBzbmRidWZbd2xlbis0XTsgLyogbGVhZCgxKSBkZXZhZGRyLGRpcmVjdGlvbigxKSBhZGRyKDIpIGRhdGEod2xlbikgKGxlbigyKSAod2hlbiByZWFkaW5nKSkgKi8KKwkvKiB3cml0ZSBvbmx5ID8gKi8KKwlpbnQgd28gPSAocmJ1ZiA9PSBOVUxMIHx8IHJsZW4gPT0gMCksCisJCWxlbiA9IDIgKyB3bGVuICsgKHdvID8gMCA6IDIpOworCisJc25kYnVmWzBdID0gd28gPyBESUJVU0JfUkVRX0kyQ19XUklURSA6IERJQlVTQl9SRVFfSTJDX1JFQUQ7CisJc25kYnVmWzFdID0gKGFkZHIgPDwgMSkgfCAod28gPyAwIDogMSk7CisKKwltZW1jcHkoJnNuZGJ1ZlsyXSx3YnVmLHdsZW4pOworCisJaWYgKCF3bykgeworCQlzbmRidWZbd2xlbisyXSA9IChybGVuID4+IDgpICYgMHhmZjsKKwkJc25kYnVmW3dsZW4rM10gPSBybGVuICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gZHZiX3VzYl9nZW5lcmljX3J3KGQsc25kYnVmLGxlbixyYnVmLHJsZW4sMCk7Cit9CisKKy8qCisgKiBJMkMgbWFzdGVyIHhmZXIgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBkaWJ1c2JfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLHN0cnVjdCBpMmNfbXNnIG1zZ1tdLGludCBudW0pCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlpbnQgaTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmQtPmkyY19zZW0pIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAobnVtID4gMikKKwkJd2FybigibW9yZSB0aGFuIDIgaTJjIG1lc3NhZ2VzIGF0IGEgdGltZSBpcyBub3QgaGFuZGxlZCB5ZXQuIFRPRE8uIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJLyogd3JpdGUvcmVhZCByZXF1ZXN0ICovCisJCWlmIChpKzEgPCBudW0gJiYgKG1zZ1tpKzFdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCQlpZiAoZGlidXNiX2kyY19tc2coZCwgbXNnW2ldLmFkZHIsIG1zZ1tpXS5idWYsbXNnW2ldLmxlbiwKKwkJCQkJCW1zZ1tpKzFdLmJ1Zixtc2dbaSsxXS5sZW4pIDwgMCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJfSBlbHNlCisJCQlpZiAoZGlidXNiX2kyY19tc2coZCwgbXNnW2ldLmFkZHIsIG1zZ1tpXS5idWYsbXNnW2ldLmxlbixOVUxMLDApIDwgMCkKKwkJCQlicmVhazsKKwl9CisKKwl1cCgmZC0+aTJjX3NlbSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1MzIgZGlidXNiX2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDOworfQorCitzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkaWJ1c2JfaTJjX2FsZ28gPSB7CisJLm5hbWUgICAgICAgICAgPSAiRGlCY29tIFVTQiBJMkMgYWxnb3JpdGhtIiwKKwkuaWQgICAgICAgICAgICA9IEkyQ19BTEdPX0JJVCwKKwkubWFzdGVyX3hmZXIgICA9IGRpYnVzYl9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IGRpYnVzYl9pMmNfZnVuYywKK307CitFWFBPUlRfU1lNQk9MKGRpYnVzYl9pMmNfYWxnbyk7CisKK2ludCBkaWJ1c2JfcmVhZF9lZXByb21fYnl0ZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IG9mZnMsIHU4ICp2YWwpCit7CisJdTggd2J1ZlsxXSA9IHsgb2ZmcyB9OworCXJldHVybiBkaWJ1c2JfaTJjX21zZyhkLCAweDUwLCB3YnVmLCAxLCB2YWwsIDEpOworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2JfcmVhZF9lZXByb21fYnl0ZSk7CisKK2ludCBkaWJ1c2JfZGliMzAwMG1jX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IGRpYjMwMDBfY29uZmlnIGRlbW9kX2NmZzsKKwlzdHJ1Y3QgZGlidXNiX3N0YXRlICpzdCA9IGQtPnByaXY7CisKKwlkZW1vZF9jZmcucGxsX3NldCA9IGR2Yl91c2JfcGxsX3NldF9pMmM7CisJZGVtb2RfY2ZnLnBsbF9pbml0ID0gZHZiX3VzYl9wbGxfaW5pdF9pMmM7CisKKwlmb3IgKGRlbW9kX2NmZy5kZW1vZF9hZGRyZXNzID0gMHg4OyBkZW1vZF9jZmcuZGVtb2RfYWRkcmVzcyA8IDB4ZDsgZGVtb2RfY2ZnLmRlbW9kX2FkZHJlc3MrKykKKwkJaWYgKChkLT5mZSA9IGRpYjMwMDBtY19hdHRhY2goJmRlbW9kX2NmZywmZC0+aTJjX2FkYXAsJnN0LT5vcHMpKSAhPSBOVUxMKSB7CisJCQlkLT50dW5lcl9wYXNzX2N0cmwgPSBzdC0+b3BzLnR1bmVyX3Bhc3NfY3RybDsKKwkJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KK0VYUE9SVF9TWU1CT0woZGlidXNiX2RpYjMwMDBtY19mcm9udGVuZF9hdHRhY2gpOworCitpbnQgZGlidXNiX2RpYjMwMDBtY190dW5lcl9hdHRhY2ggKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjA7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9lbnY1N2gxeGQ1OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkaWJ1c2JfZGliMzAwMG1jX3R1bmVyX2F0dGFjaCk7CisKKy8qCisgKiBjb21tb24gcmVtb3RlIGNvbnRyb2wgc3R1ZmYKKyAqLworc3RydWN0IGR2Yl91c2JfcmNfa2V5IGRpYnVzYl9yY19rZXlzW10gPSB7CisJLyogS2V5IGNvZGVzIGZvciB0aGUgbGl0dGxlIEFydGVjIFQxL1R3aW5oYW4vSEFNQS8gcmVtb3RlLiAqLworCXsgMHgwMCwgMHgxNiwgS0VZX1BPV0VSIH0sCisJeyAweDAwLCAweDEwLCBLRVlfTVVURSB9LAorCXsgMHgwMCwgMHgwMywgS0VZXzEgfSwKKwl7IDB4MDAsIDB4MDEsIEtFWV8yIH0sCisJeyAweDAwLCAweDA2LCBLRVlfMyB9LAorCXsgMHgwMCwgMHgwOSwgS0VZXzQgfSwKKwl7IDB4MDAsIDB4MWQsIEtFWV81IH0sCisJeyAweDAwLCAweDFmLCBLRVlfNiB9LAorCXsgMHgwMCwgMHgwZCwgS0VZXzcgfSwKKwl7IDB4MDAsIDB4MTksIEtFWV84IH0sCisJeyAweDAwLCAweDFiLCBLRVlfOSB9LAorCXsgMHgwMCwgMHgxNSwgS0VZXzAgfSwKKwl7IDB4MDAsIDB4MDUsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MDAsIDB4MDIsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwMCwgMHgxZSwgS0VZX1ZPTFVNRVVQIH0sCisJeyAweDAwLCAweDBhLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMCwgMHgxMSwgS0VZX1JFQ09SRCB9LAorCXsgMHgwMCwgMHgxNywgS0VZX0ZBVk9SSVRFUyB9LCAvKiBIZWFydCBzeW1ib2wgLSBDaGFubmVsIGxpc3QuICovCisJeyAweDAwLCAweDE0LCBLRVlfUExBWSB9LAorCXsgMHgwMCwgMHgxYSwgS0VZX1NUT1AgfSwKKwl7IDB4MDAsIDB4NDAsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MDAsIDB4MTIsIEtFWV9GQVNURk9SV0FSRCB9LAorCXsgMHgwMCwgMHgwZSwgS0VZX1BSRVZJT1VTIH0sIC8qIFJlY2FsbCAtIFByZXZpb3VzIGNoYW5uZWwuICovCisJeyAweDAwLCAweDRjLCBLRVlfUEFVU0UgfSwKKwl7IDB4MDAsIDB4NGQsIEtFWV9TQ1JFRU4gfSwgLyogRnVsbCBzY3JlZW4gbW9kZS4gKi8KKwl7IDB4MDAsIDB4NTQsIEtFWV9BVURJTyB9LCAvKiBNVFMgLSBTd2l0Y2ggdG8gc2Vjb25kYXJ5IGF1ZGlvLiAqLworCS8qIGFkZGl0aW9uYWwga2V5cyBUd2luSGFuIFZpc2lvblBsdXMsIHRoZSBBcnRlYyBzZWVtaW5nbHkgbm90IGhhdmUgKi8KKwl7IDB4MDAsIDB4MGMsIEtFWV9DQU5DRUwgfSwgLyogQ2FuY2VsICovCisJeyAweDAwLCAweDFjLCBLRVlfRVBHIH0sIC8qIEVQRyAqLworCXsgMHgwMCwgMHgwMCwgS0VZX1RBQiB9LCAvKiBUYWIgKi8KKwl7IDB4MDAsIDB4NDgsIEtFWV9JTkZPIH0sIC8qIFByZXZpZXcgKi8KKwl7IDB4MDAsIDB4MDQsIEtFWV9MSVNUIH0sIC8qIFJlY29yZExpc3QgKi8KKwl7IDB4MDAsIDB4MGYsIEtFWV9URVhUIH0sIC8qIFRlbGV0ZXh0ICovCisJLyogS2V5IGNvZGVzIGZvciB0aGUgS1dvcmxkL0FEU1RlY2gvSmV0V2F5IHJlbW90ZS4gKi8KKwl7IDB4ODYsIDB4MTIsIEtFWV9QT1dFUiB9LAorCXsgMHg4NiwgMHgwZiwgS0VZX1NFTEVDVCB9LCAvKiBzb3VyY2UgKi8KKwl7IDB4ODYsIDB4MGMsIEtFWV9VTktOT1dOIH0sIC8qIHNjYW4gKi8KKwl7IDB4ODYsIDB4MGIsIEtFWV9FUEcgfSwKKwl7IDB4ODYsIDB4MTAsIEtFWV9NVVRFIH0sCisJeyAweDg2LCAweDAxLCBLRVlfMSB9LAorCXsgMHg4NiwgMHgwMiwgS0VZXzIgfSwKKwl7IDB4ODYsIDB4MDMsIEtFWV8zIH0sCisJeyAweDg2LCAweDA0LCBLRVlfNCB9LAorCXsgMHg4NiwgMHgwNSwgS0VZXzUgfSwKKwl7IDB4ODYsIDB4MDYsIEtFWV82IH0sCisJeyAweDg2LCAweDA3LCBLRVlfNyB9LAorCXsgMHg4NiwgMHgwOCwgS0VZXzggfSwKKwl7IDB4ODYsIDB4MDksIEtFWV85IH0sCisJeyAweDg2LCAweDBhLCBLRVlfMCB9LAorCXsgMHg4NiwgMHgxOCwgS0VZX1pPT00gfSwKKwl7IDB4ODYsIDB4MWMsIEtFWV9VTktOT1dOIH0sIC8qIHByZXZpZXcgKi8KKwl7IDB4ODYsIDB4MTMsIEtFWV9VTktOT1dOIH0sIC8qIHNuYXAgKi8KKwl7IDB4ODYsIDB4MDAsIEtFWV9VTkRPIH0sCisJeyAweDg2LCAweDFkLCBLRVlfUkVDT1JEIH0sCisJeyAweDg2LCAweDBkLCBLRVlfU1RPUCB9LAorCXsgMHg4NiwgMHgwZSwgS0VZX1BBVVNFIH0sCisJeyAweDg2LCAweDE2LCBLRVlfUExBWSB9LAorCXsgMHg4NiwgMHgxMSwgS0VZX0JBQ0sgfSwKKwl7IDB4ODYsIDB4MTksIEtFWV9GT1JXQVJEIH0sCisJeyAweDg2LCAweDE0LCBLRVlfVU5LTk9XTiB9LCAvKiBwaXAgKi8KKwl7IDB4ODYsIDB4MTUsIEtFWV9FU0MgfSwKKwl7IDB4ODYsIDB4MWEsIEtFWV9VUCB9LAorCXsgMHg4NiwgMHgxZSwgS0VZX0RPV04gfSwKKwl7IDB4ODYsIDB4MWYsIEtFWV9MRUZUIH0sCisJeyAweDg2LCAweDFiLCBLRVlfUklHSFQgfSwKK307CitFWFBPUlRfU1lNQk9MKGRpYnVzYl9yY19rZXlzKTsKKworaW50IGRpYnVzYl9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCit7CisJdTgga2V5WzVdLGNtZCA9IERJQlVTQl9SRVFfUE9MTF9SRU1PVEU7CisJZHZiX3VzYl9nZW5lcmljX3J3KGQsJmNtZCwxLGtleSw1LDApOworCWR2Yl91c2JfbmVjX3JjX2tleV90b19ldmVudChkLGtleSxldmVudCxzdGF0ZSk7CisJaWYgKGtleVswXSAhPSAwKQorCQlkZWJfaW5mbygia2V5OiAleCAleCAleCAleCAleFxuIixrZXlbMF0sa2V5WzFdLGtleVsyXSxrZXlbM10sa2V5WzRdKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZGlidXNiX3JjX3F1ZXJ5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOGI1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCkBAIC0wLDAgKzEsMzUwIEBACisvKiBEVkIgVVNCIGNvbXBsaWFudCBsaW51eCBkcml2ZXIgZm9yIG1vYmlsZSBEVkItVCBVU0IgZGV2aWNlcyBiYXNlZCBvbgorICogcmVmZXJlbmNlIGRlc2lnbnMgbWFkZSBieSBEaUJjb20gKGh0dHA6Ly93d3cuZGliY29tLmZyLykgKERpQjMwMDBNLUIpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICogYmFzZWQgb24gR1BMIGNvZGUgZnJvbSBEaUJjb20sIHdoaWNoIGhhcworICogQ29weXJpZ2h0IChDKSAyMDA0IEFtYXVyeSBEZW1vbCBmb3IgRGlCY29tIChhZGVtb2xAZGliY29tLmZyKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZGlidXNiLmgiCisKK3N0YXRpYyBpbnQgZGlidXNiX2RpYjMwMDBtYl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXN0cnVjdCBkaWIzMDAwX2NvbmZpZyBkZW1vZF9jZmc7CisJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBkLT5wcml2OworCisJZGVtb2RfY2ZnLmRlbW9kX2FkZHJlc3MgPSAweDg7CisJZGVtb2RfY2ZnLnBsbF9zZXQgPSBkdmJfdXNiX3BsbF9zZXRfaTJjOworCWRlbW9kX2NmZy5wbGxfaW5pdCA9IGR2Yl91c2JfcGxsX2luaXRfaTJjOworCisJaWYgKChkLT5mZSA9IGRpYjMwMDBtYl9hdHRhY2goJmRlbW9kX2NmZywmZC0+aTJjX2FkYXAsJnN0LT5vcHMpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWQtPnR1bmVyX3Bhc3NfY3RybCA9IHN0LT5vcHMudHVuZXJfcGFzc19jdHJsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjE7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90dWE2MDEweHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNvbWUgb2YgdGhlIEFydGVjIDEuMSBkZXZpY2UgYXJlbid0IGVxdWlwcGVkIHdpdGggdGhlIGRlZmF1bHQgdHVuZXIKKyAqIChUaG9tc29uIENhYmxlKSwgYnV0IHdpdGggYSBQYW5hc29uaWMgRU5WNzdIMTFENS4gIFRoaXMgZnVuY3Rpb24gZmlndXJlcworICogdGhpcyBvdXQuICovCitzdGF0aWMgaW50IGRpYnVzYl90dW5lcl9wcm9iZV9hbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBiWzJdID0geyAwLDAgfSwgYjJbMV07CisJaW50IHJldCA9IDA7CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7IC5mbGFncyA9IDAsICAgICAgICAuYnVmID0gYiwgIC5sZW4gPSAyIH0sCisJCXsgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBiMiwgLmxlbiA9IDEgfSwKKwl9OworCisJLyogdGhlIFBhbmFzb25pYyBzaXRzIG9uIEkyQyBhZGRyYXNzIDB4NjAsIHRoZSBUaG9tc29uIG9uIDB4NjEgKi8KKwltc2dbMF0uYWRkciA9IG1zZ1sxXS5hZGRyID0gMHg2MDsKKworCWlmIChkLT50dW5lcl9wYXNzX2N0cmwpCisJCWQtPnR1bmVyX3Bhc3NfY3RybChkLT5mZSwxLG1zZ1swXS5hZGRyKTsKKworCWlmIChpMmNfdHJhbnNmZXIgKCZkLT5pMmNfYWRhcCwgbXNnLCAyKSAhPSAyKSB7CisJCWVycigidHVuZXIgaTJjIHdyaXRlIGZhaWxlZC4iKTsKKwkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisKKwlpZiAoZC0+dHVuZXJfcGFzc19jdHJsKQorCQlkLT50dW5lcl9wYXNzX2N0cmwoZC0+ZmUsMCxtc2dbMF0uYWRkcik7CisKKwlpZiAoYjJbMF0gPT0gMHhmZSkgeworCQlpbmZvKCJ0aGlzIGRldmljZSBoYXMgdGhlIFRob21zb24gQ2FibGUgb25ib2FyZC4gV2hpY2ggaXMgZGVmYXVsdC4iKTsKKwkJZGlidXNiX3Rob21zb25fdHVuZXJfYXR0YWNoKGQpOworCX0gZWxzZSB7CisJCXU4IGJwbGxbNF0gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKKwkJaW5mbygidGhpcyBkZXZpY2UgaGFzIHRoZSBQYW5hc29uaWMgRU5WNzdIMTFENSBvbmJvYXJkLiIpOworCQlkLT5wbGxfYWRkciA9IDB4NjA7CisJCW1lbWNweShkLT5wbGxfaW5pdCxicGxsLDQpOworCQlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3RkYTY2NXg7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogVVNCIERyaXZlciBzdHVmZiAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZGlidXNiMV8xX3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkaWJ1c2IxXzFfYW4yMjM1X3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkaWJ1c2IyXzBiX3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgZGlidXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJaWYgKGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwmZGlidXNiMV8xX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDAgfHwKKwkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IxXzFfYW4yMjM1X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDAgfHwKKwkJZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2IyXzBiX3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpID09IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBJRCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRpYnVzYl9kaWIzMDAwbWJfdGFibGUgW10gPSB7CisvKiAwMCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywJCVVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX0NPTEQpfSwKKy8qIDAxICovCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLAkJVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0JfV0FSTSl9LAorLyogMDIgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQ09NUFJPLAkJVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfQ09MRCkgfSwKKy8qIDAzICovCXsgVVNCX0RFVklDRShVU0JfVklEX0NPTVBSTywJCVVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX1dBUk0pIH0sCisvKiAwNCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9DT01QUk9fVU5LLAlVU0JfUElEX0NPTVBST19EVkJVMjAwMF9VTktfQ09MRCkgfSwKKy8qIDA1ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwJCVVTQl9QSURfRElCQ09NX01PRDMwMDBfQ09MRCkgfSwKKy8qIDA2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0RJQkNPTSwJCVVTQl9QSURfRElCQ09NX01PRDMwMDBfV0FSTSkgfSwKKy8qIDA3ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0VNUElBLAkJCVVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fQ09MRCkgfSwKKy8qIDA4ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0VNUElBLAkJCVVTQl9QSURfS1dPUkxEX1ZTVFJFQU1fV0FSTSkgfSwKKy8qIDA5ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0dSQU5EVEVDLAkJVVNCX1BJRF9HUkFORFRFQ19EVkJUX1VTQl9DT0xEKSB9LAorLyogMTAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfR1JBTkRURUMsCQlVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX1dBUk0pIH0sCisvKiAxMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9HUkFORFRFQywJCVVTQl9QSURfRElCQ09NX01PRDMwMDBfQ09MRCkgfSwKKy8qIDEyICovCXsgVVNCX0RFVklDRShVU0JfVklEX0dSQU5EVEVDLAkJVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9XQVJNKSB9LAorLyogMTMgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSFlQRVJfUEFMVEVLLAlVU0JfUElEX1VOS19IWVBFUl9QQUxURUtfQ09MRCkgfSwKKy8qIDE0ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0hZUEVSX1BBTFRFSywJVVNCX1BJRF9VTktfSFlQRVJfUEFMVEVLX1dBUk0pIH0sCisvKiAxNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLAlVU0JfUElEX1RXSU5IQU5fVlA3MDQxX0NPTEQpIH0sCisvKiAxNiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLAlVU0JfUElEX1RXSU5IQU5fVlA3MDQxX1dBUk0pIH0sCisvKiAxNyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9UV0lOSEFOLAkJVVNCX1BJRF9UV0lOSEFOX1ZQNzA0MV9DT0xEKSB9LAorLyogMTggKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVFdJTkhBTiwJCVVTQl9QSURfVFdJTkhBTl9WUDcwNDFfV0FSTSkgfSwKKy8qIDE5ICovCXsgVVNCX0RFVklDRShVU0JfVklEX1VMVElNQV9FTEVDVFJPTklDLCBVU0JfUElEX1VMVElNQV9UVkJPWF9DT0xEKSB9LAorLyogMjAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMsIFVTQl9QSURfVUxUSU1BX1RWQk9YX1dBUk0pIH0sCisvKiAyMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X0NPTEQpIH0sCisvKiAyMiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X1dBUk0pIH0sCisvKiAyMyAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9BRFNURUNILAkJVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRCkgfSwKKworLyogZGV2aWNlIElEIHdpdGggZGVmYXVsdCBESUJVU0IyXzAtZmlybXdhcmUgYW5kIHdpdGggdGhlIGhhY2tlZCBmaXJtd2FyZSAqLworLyogMjQgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQURTVEVDSCwJCVVTQl9QSURfQURTVEVDSF9VU0IyX1dBUk0pIH0sCisvKiAyNSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9LWUUsCQkJVVNCX1BJRF9LWUVfRFZCX1RfQ09MRCkgfSwKKy8qIDI2ICovCXsgVVNCX0RFVklDRShVU0JfVklEX0tZRSwJCQlVU0JfUElEX0tZRV9EVkJfVF9XQVJNKSB9LAorCisvLyAjZGVmaW5lIERWQl9VU0JfRElCVVNCX01CX0ZBVUxUWV9VU0JfSURzCisKKyNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcworLyogMjcgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfQU5DSE9SLAkJVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU5DSE9SX0NPTEQpIH0sCisjZW5kaWYKKwkJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRpYnVzYl9kaWIzMDAwbWJfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkaWJ1c2IxXzFfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgfCBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS5waWRfZmlsdGVyX2NvdW50ID0gMTYsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0FOMjEzNSwKKworCS5maXJtd2FyZSA9ICJkdmItdXNiLWRpYnVzYi01LjAuMC4xMS5mdyIsCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKKworCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiX3N0cmVhbWluZ19jdHJsLAorCS5waWRfZmlsdGVyICAgICAgID0gZGlidXNiX3BpZF9maWx0ZXIsCisJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAorCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiX3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl90dW5lcl9wcm9iZV9hbmRfYXR0YWNoLAorCisJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAorCS5yY19rZXlfbWFwICAgICAgID0gZGlidXNiX3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSA2MywgLyogd293LCB0aGF0IGlzIHVnbHkgLi4uIEkgd2FudCB0byBsb2FkIGl0IHRvIHRoZSBkcml2ZXIgZHluYW1pY2FsbHkgKi8KKwkucmNfcXVlcnkgICAgICAgICA9IGRpYnVzYl9yY19xdWVyeSwKKworCS5pMmNfYWxnbyAgICAgICAgID0gJmRpYnVzYl9pMmNfYWxnbywKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA3LAorCQkuZW5kcG9pbnQgPSAweDAyLAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDksCisJLmRldmljZXMgPSB7CisJCXsJIkFWZXJNZWRpYSBBdmVyVFYgRFZCVCBVU0IxLjEiLAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVswXSwgIE5VTEwgfSwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMV0sICBOVUxMIH0sCisJCX0sCisJCXsJIkNvbXBybyBWaWRlb21hdGUgRFZCLVUyMDAwIC0gRFZCLVQgVVNCMS4xIChwbGVhc2UgY29uZmlybSB0byBsaW51eC1kdmIpIiwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMl0sICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzRdLCBOVUxMfSwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbM10sIE5VTEwgfSwKKwkJfSwKKwkJewkiRGlCY29tIFVTQjEuMSBEVkItVCByZWZlcmVuY2UgZGVzaWduIChNT0QzMDAwKSIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzVdLCAgTlVMTCB9LAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVs2XSwgIE5VTEwgfSwKKwkJfSwKKwkJewkiS1dvcmxkIFYtU3RyZWFtIFhQRVJUIERUViAtIERWQi1UIFVTQjEuMSIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzddLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzhdLCBOVUxMIH0sCisJCX0sCisJCXsJIkdyYW5kdGVjIFVTQjEuMSBEVkItVCIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzldLCAgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTFdLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzEwXSwgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTJdLCBOVUxMIH0sCisJCX0sCisJCXsJIlVua293biBVU0IxLjEgRFZCLVQgZGV2aWNlID8/Pz8gcGxlYXNlIHJlcG9ydCB0aGUgbmFtZSB0byB0aGUgYXV0aG9yIiwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTNdLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzE0XSwgTlVMTCB9LAorCQl9LAorCQl7CSJUd2luaGFuRFRWIFVTQi1UZXIgVVNCMS4xIC8gTWFnaWMgQm94IEkgLyBIQU1BIFVTQjEuMSBEVkItVCBkZXZpY2UiLAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsxNV0sICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzE3XSwgTlVMTH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzE2XSwgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMThdLCBOVUxMfSwKKwkJfSwKKwkJewkiQXJ0ZWMgVDEgVVNCMS4xIFRWQk9YIHdpdGggQU4yMTM1IiwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMTldLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzIwXSwgTlVMTCB9LAorCQl9LAorCQl7CSJWaWRlb1dhbGtlciBEVkItVCBVU0IiLAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyNV0sIE5VTEwgfSwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjZdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZGlidXNiMV8xX2FuMjIzNV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiB8IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisJLnBpZF9maWx0ZXJfY291bnQgPSAxNiwKKworCS51c2JfY3RybCA9IENZUFJFU1NfQU4yMjM1LAorCisJLmZpcm13YXJlID0gImR2Yi11c2ItZGlidXNiLWFuMjIzNS0wMS5mdyIsCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKKworCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiX3N0cmVhbWluZ19jdHJsLAorCS5waWRfZmlsdGVyICAgICAgID0gZGlidXNiX3BpZF9maWx0ZXIsCisJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAorCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiX3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1iX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl90dW5lcl9wcm9iZV9hbmRfYXR0YWNoLAorCisJLnJjX2ludGVydmFsICAgICAgPSBERUZBVUxUX1JDX0lOVEVSVkFMLAorCS5yY19rZXlfbWFwICAgICAgID0gZGlidXNiX3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSA2MywgLyogd293LCB0aGF0IGlzIHVnbHkgLi4uIEkgd2FudCB0byBsb2FkIGl0IHRvIHRoZSBkcml2ZXIgZHluYW1pY2FsbHkgKi8KKwkucmNfcXVlcnkgICAgICAgICA9IGRpYnVzYl9yY19xdWVyeSwKKworCS5pMmNfYWxnbyAgICAgICAgID0gJmRpYnVzYl9pMmNfYWxnbywKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA3LAorCQkuZW5kcG9pbnQgPSAweDAyLAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gNDA5NiwKKwkJCX0KKwkJfQorCX0sCisKKyNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcworCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKyNlbHNlCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorI2VuZGlmCisJLmRldmljZXMgPSB7CisJCXsJIkFydGVjIFQxIFVTQjEuMSBUVkJPWCB3aXRoIEFOMjIzNSIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzIwXSwgTlVMTCB9LAorCQkJeyAmZGlidXNiX2RpYjMwMDBtYl90YWJsZVsyMV0sIE5VTEwgfSwKKwkJfSwKKyNpZmRlZiBEVkJfVVNCX0RJQlVTQl9NQl9GQVVMVFlfVVNCX0lEcworCQl7CSJBcnRlYyBUMSBVU0IxLjEgVFZCT1ggd2l0aCBBTjIyMzUgKGZhdWx0eSBVU0IgSURzKSIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI3XSwgTlVMTCB9LAorCQkJeyBOVUxMIH0sCisJCX0sCisjZW5kaWYKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkaWJ1c2IyXzBiX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0hBU19QSURfRklMVEVSIHwgRFZCX1VTQl9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGIHwgRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKwkucGlkX2ZpbHRlcl9jb3VudCA9IDMyLAorCisJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCisKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1hZHN0ZWNoLXVzYjItMDIuZnciLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCisKKwkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKKwkucGlkX2ZpbHRlciAgICAgICA9IGRpYnVzYl9waWRfZmlsdGVyLAorCS5waWRfZmlsdGVyX2N0cmwgID0gZGlidXNiX3BpZF9maWx0ZXJfY3RybCwKKwkucG93ZXJfY3RybCAgICAgICA9IGRpYnVzYjJfMF9wb3dlcl9jdHJsLAorCS5mcm9udGVuZF9hdHRhY2ggID0gZGlidXNiX2RpYjMwMDBtYl9mcm9udGVuZF9hdHRhY2gsCisJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWJ1c2JfdGhvbXNvbl90dW5lcl9hdHRhY2gsCisKKwkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJLnJjX2tleV9tYXAgICAgICAgPSBkaWJ1c2JfcmNfa2V5cywKKwkucmNfa2V5X21hcF9zaXplICA9IDYzLCAvKiB3b3csIHRoYXQgaXMgdWdseSAuLi4gSSB3YW50IHRvIGxvYWQgaXQgdG8gdGhlIGRyaXZlciBkeW5hbWljYWxseSAqLworCS5yY19xdWVyeSAgICAgICAgID0gZGlidXNiX3JjX3F1ZXJ5LAorCisJLmkyY19hbGdvICAgICAgICAgPSAmZGlidXNiX2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDYsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJewkiS1dvcmxkL0FEU1RlY2ggSW5zdGFudCBEVkItVCBVU0IgMi4wIiwKKwkJCXsgJmRpYnVzYl9kaWIzMDAwbWJfdGFibGVbMjNdLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1iX3RhYmxlWzI0XSwgTlVMTCB9LAorCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkaWJ1c2JfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZHZiX3VzYl9kaWJ1c2JfbWIiLAorCS5wcm9iZQkJPSBkaWJ1c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZQk9IGRpYnVzYl9kaWIzMDAwbWJfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGRpYnVzYl9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisJaWYgKChyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmRpYnVzYl9kcml2ZXIpKSkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZCIscmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRpYnVzYl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZkaWJ1c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQgKGRpYnVzYl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCAoZGlidXNiX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgRGlCY29tIFVTQiBEVkItVCBkZXZpY2VzIChEaUIzMDAwTS1CIGJhc2VkKSIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkYWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1jLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIERWQiBVU0IgY29tcGxpYW50IGxpbnV4IGRyaXZlciBmb3IgbW9iaWxlIERWQi1UIFVTQiBkZXZpY2VzIGJhc2VkIG9uCisgKiByZWZlcmVuY2UgZGVzaWducyBtYWRlIGJ5IERpQmNvbSAoaHR0cDovL3d3dy5kaWJjb20uZnIvKSAoRGlCMzAwME0tQy9QKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICoKKyAqIGJhc2VkIG9uIEdQTCBjb2RlIGZyb20gRGlCY29tLCB3aGljaCBoYXMKKyAqIENvcHlyaWdodCAoQykgMjAwNCBBbWF1cnkgRGVtb2wgZm9yIERpQmNvbSAoYWRlbW9sQGRpYmNvbS5mcikKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworI2luY2x1ZGUgImRpYnVzYi5oIgorCisvKiBVU0IgRHJpdmVyIHN0dWZmICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkaWJ1c2JfbWNfcHJvcGVydGllczsKKworc3RhdGljIGludCBkaWJ1c2JfbWNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCZkaWJ1c2JfbWNfcHJvcGVydGllcyxUSElTX01PRFVMRSk7Cit9CisKKy8qIGRvIG5vdCBjaGFuZ2UgdGhlIG9yZGVyIG9mIHRoZSBJRCB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRpYnVzYl9kaWIzMDAwbWNfdGFibGUgW10gPSB7CisvKiAwMCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sCQlVU0JfUElEX0RJQkNPTV9NT0QzMDAxX0NPTEQpIH0sCisvKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sCQlVU0JfUElEX0RJQkNPTV9NT0QzMDAxX1dBUk0pIH0sCisvKiAwMiAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9VTFRJTUFfRUxFQ1RST05JQywJVVNCX1BJRF9VTFRJTUFfVFZCT1hfVVNCMl9DT0xEKSB9LAorCQkJeyB9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgZGlidXNiX2RpYjMwMDBtY190YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGRpYnVzYl9tY19wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfUElEX0ZJTFRFUl9DQU5fQkVfVFVSTkVEX09GRiB8IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisJLnBpZF9maWx0ZXJfY291bnQgPSAzMiwKKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLWRpYnVzYi02LjAuMC44LmZ3IiwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBkaWJ1c2Jfc3RhdGUpLAorCisJLnN0cmVhbWluZ19jdHJsICAgPSBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwsCisJLnBpZF9maWx0ZXIgICAgICAgPSBkaWJ1c2JfcGlkX2ZpbHRlciwKKwkucGlkX2ZpbHRlcl9jdHJsICA9IGRpYnVzYl9waWRfZmlsdGVyX2N0cmwsCisJLnBvd2VyX2N0cmwgICAgICAgPSBkaWJ1c2IyXzBfcG93ZXJfY3RybCwKKwkuZnJvbnRlbmRfYXR0YWNoICA9IGRpYnVzYl9kaWIzMDAwbWNfZnJvbnRlbmRfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gZGlidXNiX2RpYjMwMDBtY190dW5lcl9hdHRhY2gsCisKKwkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJLnJjX2tleV9tYXAgICAgICAgPSBkaWJ1c2JfcmNfa2V5cywKKwkucmNfa2V5X21hcF9zaXplICA9IDYzLCAvKiBGSVhNRSAqLworCS5yY19xdWVyeSAgICAgICAgID0gZGlidXNiX3JjX3F1ZXJ5LAorCisJLmkyY19hbGdvICAgICAgICAgPSAmZGlidXNiX2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDYsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJEaUJjb20gVVNCMi4wIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24gKE1PRDMwMDBQKSIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1jX3RhYmxlWzBdLCBOVUxMIH0sCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1jX3RhYmxlWzFdLCBOVUxMIH0sCisJCX0sCisJCXsgICAiQXJ0ZWMgVDEgVVNCMi4wIFRWQk9YIChwbGVhc2UgcmVwb3J0IHRoZSB3YXJtIElEKSIsCisJCQl7ICZkaWJ1c2JfZGliMzAwMG1jX3RhYmxlWzJdLCBOVUxMIH0sCisJCQl7IE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZGlidXNiX21jX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImR2Yl91c2JfZGlidXNiX21jIiwKKwkucHJvYmUJCT0gZGlidXNiX21jX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKKwkuaWRfdGFibGUJPSBkaWJ1c2JfZGliMzAwMG1jX3RhYmxlLAorfTsKKworLyogbW9kdWxlIHN0dWZmICovCitzdGF0aWMgaW50IF9faW5pdCBkaWJ1c2JfbWNfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZkaWJ1c2JfbWNfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkaWJ1c2JfbWNfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmZGlidXNiX21jX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChkaWJ1c2JfbWNfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGRpYnVzYl9tY19tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIERpQmNvbSBVU0IyLjAgRFZCLVQgKERpQjMwMDBNLUMvUCBiYXNlZCkgZGV2aWNlcyIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMWY2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIEhlYWRlciBmaWxlIGZvciBhbGwgZGlidXNiLWJhc2VkLXJlY2VpdmVycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqCVNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAqLworI2lmbmRlZiBfRFZCX1VTQl9ESUJVU0JfSF8KKyNkZWZpbmUgX0RWQl9VU0JfRElCVVNCX0hfCisKKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkaWJ1c2IiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCisjaW5jbHVkZSAiZGliMzAwMC5oIgorCisvKgorICogcHJvdG9jb2wgb2YgYWxsIGRpYnVzYiByZWxhdGVkIGRldmljZXMKKyAqLworCisvKgorICogYnVsayBtc2cgdG8vZnJvbSBlbmRwb2ludCAweDAxCisgKgorICogZ2VuZXJhbCBzdHJ1Y3R1cmU6CisgKiByZXF1ZXN0X2J5dGUgcGFyYW1ldGVyX2J5dGVzCisgKi8KKworI2RlZmluZSBESUJVU0JfUkVRX1NUQVJUX1JFQUQJCQkweDAwCisjZGVmaW5lIERJQlVTQl9SRVFfU1RBUlRfREVNT0QJCQkweDAxCisKKy8qCisgKiBpMmMgcmVhZAorICogYnVsayB3cml0ZTogMHgwMiAoKDdiaXQgaTJjX2FkZHIgPDwgMSkgJiAweDAxKSByZWdpc3Rlcl9ieXRlcyBsZW5ndGhfd29yZAorICogYnVsayByZWFkOiAgYnl0ZV9idWZmZXIgKGxlbmd0aF93b3JkIGJ5dGVzKQorICovCisjZGVmaW5lIERJQlVTQl9SRVFfSTJDX1JFQUQJCQkweDAyCisKKy8qCisgKiBpMmMgd3JpdGUKKyAqIGJ1bGsgd3JpdGU6IDB4MDMgKDdiaXQgaTJjX2FkZHIgPDwgMSkgcmVnaXN0ZXJfYnl0ZXMgdmFsdWVfYnl0ZXMKKyAqLworI2RlZmluZSBESUJVU0JfUkVRX0kyQ19XUklURQkJCTB4MDMKKworLyoKKyAqIHBvbGxpbmcgdGhlIHZhbHVlIG9mIHRoZSByZW1vdGUgY29udHJvbAorICogYnVsayB3cml0ZTogMHgwNAorICogYnVsayByZWFkOiAgYnl0ZV9idWZmZXIgKDUgYnl0ZXMpCisgKi8KKyNkZWZpbmUgRElCVVNCX1JFUV9QT0xMX1JFTU9URSAgICAgICAweDA0CisKKy8qIGFkZGl0aW9uYWwgc3RhdHVzIHZhbHVlcyBmb3IgSGF1cHBhdWdlIFJlbW90ZSBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIERJQlVTQl9SQ19IQVVQUEFVR0VfS0VZX1BSRVNTRUQJMHgwMQorI2RlZmluZSBESUJVU0JfUkNfSEFVUFBBVUdFX0tFWV9FTVBUWQkweDAzCisKKy8qIHN0cmVhbWluZyBtb2RlOgorICogYnVsayB3cml0ZTogMHgwNSBtb2RlX2J5dGUKKyAqCisgKiBtb2RlX2J5dGUgaXMgbW9zdGx5IDB4MDAKKyAqLworI2RlZmluZSBESUJVU0JfUkVRX1NFVF9TVFJFQU1JTkdfTU9ERQkweDA1CisKKy8qIGludGVycnVwdCB0aGUgaW50ZXJuYWwgcmVhZCBsb29wLCB3aGVuIGJsb2NraW5nICovCisjZGVmaW5lIERJQlVTQl9SRVFfSU5UUl9SRUFECQkJMHgwNgorCisvKiBpbyBjb250cm9sCisgKiAweDA3IGNtZF9ieXRlIHBhcmFtX2J5dGVzCisgKgorICogcGFyYW1fYnl0ZXMgY2FuIGJlIHVwIHRvIDMyIGJ5dGVzCisgKgorICogY21kX2J5dGUgZnVuY3Rpb24gICAgcGFyYW1ldGVyIG5hbWUKKyAqIDB4MDAgICAgIHBvd2VyIG1vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgIDB4MDAgICAgICBzbGVlcAorICogICAgICAgICAgICAgICAgICAgICAgMHgwMSAgICAgIHdha2V1cAorICoKKyAqIDB4MDEgICAgIGVuYWJsZSBzdHJlYW1pbmcKKyAqIDB4MDIgICAgIGRpc2FibGUgc3RyZWFtaW5nCisgKgorICoKKyAqLworI2RlZmluZSBESUJVU0JfUkVRX1NFVF9JT0NUTAkJCTB4MDcKKworLyogSU9DVEwgY29tbWFuZHMgKi8KKworLyogY2hhbmdlIHRoZSBwb3dlciBtb2RlIGluIGZpcm13YXJlICovCisjZGVmaW5lIERJQlVTQl9JT0NUTF9DTURfUE9XRVJfTU9ERQkJMHgwMAorI2RlZmluZSBESUJVU0JfSU9DVExfUE9XRVJfU0xFRVAJCQkweDAwCisjZGVmaW5lIERJQlVTQl9JT0NUTF9QT1dFUl9XQUtFVVAJCQkweDAxCisKKy8qIG1vZGlmeSBzdHJlYW1pbmcgb2YgdGhlIEZYMiAqLworI2RlZmluZSBESUJVU0JfSU9DVExfQ01EX0VOQUJMRV9TVFJFQU0JMHgwMQorI2RlZmluZSBESUJVU0JfSU9DVExfQ01EX0RJU0FCTEVfU1RSRUFNCTB4MDIKKworc3RydWN0IGRpYnVzYl9zdGF0ZSB7CisJc3RydWN0IGRpYl9mZV94ZmVyX29wcyBvcHM7CisKKwkvKiBmb3IgUkM1IHJlbW90ZSBjb250cm9sICovCisJaW50IG9sZF90b2dnbGU7CisJaW50IGxhc3RfcmVwZWF0X2NvdW50OworfTsKKworZXh0ZXJuIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGRpYnVzYl9pMmNfYWxnbzsKKworZXh0ZXJuIGludCBkaWJ1c2JfZGliMzAwMG1jX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CitleHRlcm4gaW50IGRpYnVzYl9kaWIzMDAwbWNfdHVuZXJfYXR0YWNoIChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CisKK2V4dGVybiBpbnQgZGlidXNiX3N0cmVhbWluZ19jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCBpbnQpOworZXh0ZXJuIGludCBkaWJ1c2JfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgaW50LCB1MTYsIGludCk7CitleHRlcm4gaW50IGRpYnVzYl9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIGludCk7CitleHRlcm4gaW50IGRpYnVzYl9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCBpbnQpOworZXh0ZXJuIGludCBkaWJ1c2IyXzBfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIGludCk7CitleHRlcm4gaW50IGRpYnVzYjJfMF9wb3dlcl9jdHJsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCBpbnQpOworCisjZGVmaW5lIERFRkFVTFRfUkNfSU5URVJWQUwgMTUwCisvLyNkZWZpbmUgREVGQVVMVF9SQ19JTlRFUlZBTCAxMDAwMDAKKworZXh0ZXJuIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBkaWJ1c2JfcmNfa2V5c1tdOworZXh0ZXJuIGludCBkaWJ1c2JfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHUzMiAqLCBpbnQgKik7CitleHRlcm4gaW50IGRpYnVzYl9yZWFkX2VlcHJvbV9ieXRlKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCB1OCwgdTggKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2NzZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0wLDAgKzEsMjYxIEBACisvKiBEVkIgVVNCIGNvbXBsaWFudCBsaW51eCBkcml2ZXIgZm9yIE5lYnVsYSBFbGVjdHJvbmljcyB1RGlnaVRWIERWQi1UIFVTQjIuMAorICogcmVjZWl2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICogcGFydGx5IGJhc2VkIG9uIHRoZSBTREsgcHVibGlzaGVkIGJ5IE5lYnVsYSBFbGVjdHJvbmljcworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZGlnaXR2LmgiCisKKyNpbmNsdWRlICJtdDM1Mi5oIgorI2luY2x1ZGUgIm54dDYwMDAuaCIKKworLyogZGVidWcgKi8KK2ludCBkdmJfdXNiX2RpZ2l0dl9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX2RpZ2l0dl9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPXJjIChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKK3N0YXRpYyBpbnQgZGlnaXR2X2N0cmxfbXNnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwKKwkJdTggY21kLCB1OCB2diwgdTggKndidWYsIGludCB3bGVuLCB1OCAqcmJ1ZiwgaW50IHJsZW4pCit7CisJaW50IHdvID0gKHJidWYgPT0gTlVMTCB8fCBybGVuID09IDApOyAvKiB3cml0ZS1vbmx5ICovCisJdTggc25kYnVmWzddLHJjdmJ1Zls3XTsKKwltZW1zZXQoc25kYnVmLDAsNyk7IG1lbXNldChyY3ZidWYsMCw3KTsKKworCXNuZGJ1ZlswXSA9IGNtZDsKKwlzbmRidWZbMV0gPSB2djsKKwlzbmRidWZbMl0gPSB3byA/IHdsZW4gOiBybGVuOworCisJaWYgKCF3bykgeworCQltZW1jcHkoJnNuZGJ1ZlszXSx3YnVmLHdsZW4pOworCQlkdmJfdXNiX2dlbmVyaWNfd3JpdGUoZCxzbmRidWYsNyk7CisJfSBlbHNlIHsKKwkJZHZiX3VzYl9nZW5lcmljX3J3KGQsc25kYnVmLDcscmN2YnVmLDcsMTApOworCQltZW1jcHkocmJ1ZiwmcmN2YnVmWzNdLHJsZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSTJDICovCitzdGF0aWMgaW50IGRpZ2l0dl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsc3RydWN0IGkyY19tc2cgbXNnW10saW50IG51bSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCBpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZC0+aTJjX3NlbSkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmIChudW0gPiAyKQorCQl3YXJuKCJtb3JlIHRoYW4gMiBpMmMgbWVzc2FnZXMgYXQgYSB0aW1lIGlzIG5vdCBoYW5kbGVkIHlldC4gVE9ETy4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQkvKiB3cml0ZS9yZWFkIHJlcXVlc3QgKi8KKwkJaWYgKGkrMSA8IG51bSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJCWlmIChkaWdpdHZfY3RybF9tc2coZCwgVVNCX1JFQURfQ09GRE0sIG1zZ1tpXS5idWZbMF0sIE5VTEwsIDAsCisJCQkJCQltc2dbaSsxXS5idWYsbXNnW2krMV0ubGVuKSA8IDApCisJCQkJYnJlYWs7CisJCQlpKys7CisJCX0gZWxzZQorCQkJaWYgKGRpZ2l0dl9jdHJsX21zZyhkLFVTQl9XUklURV9DT0ZETSwgbXNnW2ldLmJ1ZlswXSwKKwkJCQkJCSZtc2dbaV0uYnVmWzFdLG1zZ1tpXS5sZW4tMSxOVUxMLDApIDwgMCkKKwkJCQlicmVhazsKKwl9CisKKwl1cCgmZC0+aTJjX3NlbSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1MzIgZGlnaXR2X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gZGlnaXR2X2kyY19hbGdvID0geworCS5uYW1lICAgICAgICAgID0gIk5lYnVsYSBEaWdpVFYgVVNCIEkyQyBhbGdvcml0aG0iLAorCS5pZCAgICAgICAgICAgID0gSTJDX0FMR09fQklULAorCS5tYXN0ZXJfeGZlciAgID0gZGlnaXR2X2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5ID0gZGlnaXR2X2kyY19mdW5jLAorfTsKKworLyogQ2FsbGJhY2tzIGZvciBEVkIgVVNCICovCitzdGF0aWMgaW50IGRpZ2l0dl9pZGVudGlmeV9zdGF0ZSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdAorCQlkdmJfdXNiX3Byb3BlcnRpZXMgKnByb3BzLCBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKipkZXNjLAorCQlpbnQgKmNvbGQpCit7CisJKmNvbGQgPSB1ZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIgPT0gMCAmJiB1ZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0ID09IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlnaXR2X210MzUyX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RhdGljIHU4IHJlc2V0X2J1ZltdID0geyAweDg5LCAweDM4LCAgMHg4YSwgMHgyZCwgMHg1MCwgMHg4MCB9OworCXN0YXRpYyB1OCBpbml0X2J1ZltdID0geyAweDY4LCAweGEwLCAgMHg4ZSwgMHg0MCwgIDB4NTMsIDB4NTAsCisJCQkweDY3LCAweDIwLCAgMHg3ZCwgMHgwMSwgIDB4N2MsIDB4MDAsICAweDdhLCAweDAwLAorCQkJMHg3OSwgMHgyMCwgIDB4NTcsIDB4MDUsICAweDU2LCAweDMxLCAgMHg4OCwgMHgwZiwKKwkJCTB4NzUsIDB4MzIgfTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlc2V0X2J1Zik7IGkgKz0gMikKKwkJbXQzNTJfd3JpdGUoZmUsICZyZXNldF9idWZbaV0sIDIpOworCisJbXNsZWVwKDEpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9idWYpOyBpICs9IDIpCisJCW10MzUyX3dyaXRlKGZlLCAmaW5pdF9idWZbaV0sIDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGRpZ2l0dl9tdDM1Ml9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDAsIC8qIGlnbm9yZWQgYnkgdGhlIGRpZ2l0diBhbnl3YXkgKi8KKwkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9tdDM1Ml9kZW1vZF9pbml0LAorCS5wbGxfc2V0ID0gZHZiX3VzYl9wbGxfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBueHQ2MDAwX2NvbmZpZyBkaWdpdHZfbnh0NjAwMF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDAsIC8qIGlnbm9yZWQgYnkgdGhlIGRpZ2l0diBhbnl3YXkgKi8KKwkuY2xvY2tfaW52ZXJzaW9uID0gMHgwLAorCisJLnBsbF9pbml0ID0gTlVMTCwKKwkucGxsX3NldCA9IE5VTEwsCit9OworCitzdGF0aWMgaW50IGRpZ2l0dl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWlmICgoZC0+ZmUgPSBtdDM1Ml9hdHRhY2goJmRpZ2l0dl9tdDM1Ml9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCisJCXJldHVybiAwOworCWlmICgoZC0+ZmUgPSBueHQ2MDAwX2F0dGFjaCgmZGlnaXR2X254dDYwMDBfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CisKKwkJd2Fybigibnh0NjAwMCBzdXBwb3J0IGlzIG5vdCBkb25lIHlldCwgaW4gZmFjdCB5b3UgYXJlIG9uZSBvZiB0aGUgZmlyc3QgIgorCQkJCSJwZXJzb24gd2hvIHdhbnRzIHRvIHVzZSB0aGlzIGRldmljZSBpbiBMaW51eC4gUGxlYXNlIHJlcG9ydCB0byAiCisJCQkJImxpbnV4LWR2YkBsaW51eHR2Lm9yZyIpOworCisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBkaWdpdHZfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5wbGxfYWRkciA9IDB4NjA7CisJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90ZGVkNDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBkaWdpdHZfcmNfa2V5c1tdID0geworCXsgMHgwMCwgMHgxNiwgS0VZX1BPV0VSIH0sIC8qIGR1bW15IGtleSAqLworfTsKKworLyogVE9ETyBpcyBpdCByZWFsbHkgdGhlIE5FQyBwcm90b2NvbCA/ICovCitpbnQgZGlnaXR2X3JjX3F1ZXJ5KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTMyICpldmVudCwgaW50ICpzdGF0ZSkKK3sKKwl1OCBrZXlbNV07CisKKwlkaWdpdHZfY3RybF9tc2coZCxVU0JfUkVBRF9SRU1PVEUsMCxOVUxMLDAsJmtleVsxXSw0KTsKKwkvKiBUT0RPIHN0YXRlLCBtYXliZSBpdCBpcyBWViA/ICovCisJaWYgKGtleVsxXSAhPSAwKQorCQlrZXlbMF0gPSAweDAxOyAvKiBpZiBzb21ldGhpbmcgaXMgaW5zaWRlIHRoZSBidWZmZXIsIHNpbXVsYXRlIGtleSBwcmVzcyAqLworCisJLyogY2FsbCB0aGUgdW5pdmVyc2FsIE5FQyByZW1vdGUgcHJvY2Vzc29yLCB0byBmaW5kIG91dCB0aGUga2V5J3Mgc3RhdGUgYW5kIGV2ZW50ICovCisJZHZiX3VzYl9uZWNfcmNfa2V5X3RvX2V2ZW50KGQsa2V5LGV2ZW50LHN0YXRlKTsKKwlpZiAoa2V5WzBdICE9IDApCisJCWRlYl9yYygia2V5OiAleCAleCAleCAleCAleFxuIixrZXlbMF0sa2V5WzFdLGtleVsyXSxrZXlbM10sa2V5WzRdKTsKKwlyZXR1cm4gMDsKK30KKworLyogRFZCIFVTQiBEcml2ZXIgc3R1ZmYgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGRpZ2l0dl9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IGRpZ2l0dl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmRpZ2l0dl9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGRpZ2l0dl90YWJsZSBbXSA9IHsKKwkJeyBVU0JfREVWSUNFKFVTQl9WSURfQU5DSE9SLCBVU0JfUElEX05FQlVMQV9ESUdJVFYpIH0sCisJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGRpZ2l0dl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGRpZ2l0dl9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLWRpZ2l0di0wMS5mdyIsCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IDAsCisKKwkuZnJvbnRlbmRfYXR0YWNoICA9IGRpZ2l0dl9mcm9udGVuZF9hdHRhY2gsCisJLnR1bmVyX2F0dGFjaCAgICAgPSBkaWdpdHZfdHVuZXJfYXR0YWNoLAorCisJLnJjX2ludGVydmFsICAgICAgPSAxMDAwLAorCS5yY19rZXlfbWFwICAgICAgID0gZGlnaXR2X3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGRpZ2l0dl9yY19rZXlzKSwKKwkucmNfcXVlcnkgICAgICAgICA9IGRpZ2l0dl9yY19xdWVyeSwKKworCS5pZGVudGlmeV9zdGF0ZSAgID0gZGlnaXR2X2lkZW50aWZ5X3N0YXRlLAorCisJLmkyY19hbGdvICAgICAgICAgPSAmZGlnaXR2X2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJOZWJ1bGEgRWxlY3Ryb25pY3MgdURpZ2lUViBEVkItVCBVU0IyLjApIiwKKwkJCXsgJmRpZ2l0dl90YWJsZVswXSwgTlVMTCB9LAorCQkJeyBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGRpZ2l0dl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJkdmJfdXNiX2RpZ2l0diIsCisJLnByb2JlCQk9IGRpZ2l0dl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCisJLmlkX3RhYmxlCT0gZGlnaXR2X3RhYmxlLAorfTsKKworLyogbW9kdWxlIHN0dWZmICovCitzdGF0aWMgaW50IF9faW5pdCBkaWdpdHZfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZkaWdpdHZfZHJpdmVyKSkpIHsKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWQiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkaWdpdHZfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmZGlnaXR2X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0IChkaWdpdHZfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQgKGRpZ2l0dl9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE5lYnVsYSBFbGVjdHJvbmljcyB1RGlnaVRWIERWQi1UIFVTQjIuMCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMC1hbHBoYSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3ZWU0MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBfRFZCX1VTQl9ESUdJVFZfSF8KKyNkZWZpbmUgX0RWQl9VU0JfRElHSVRWX0hfCisKKyNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkaWdpdHYiCisjaW5jbHVkZSAiZHZiLXVzYi5oIgorCitleHRlcm4gaW50IGR2Yl91c2JfZGlnaXR2X2RlYnVnOworI2RlZmluZSBkZWJfcmMoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfZGlnaXR2X2RlYnVnLDB4MDEsYXJncykKKworLyogcHJvdG9jb2wgKGZyb20gdXNibG9nZ2luZyBhbmQgdGhlIFNESzoKKyAqCisgKiBBbHdheXMgNyBieXRlcyBidWxrIG1lc3NhZ2UocykgZm9yIGNvbnRyb2xsaW5nCisgKgorICogRmlyc3QgYnl0ZSBkZXNjcmliZXMgdGhlIGNvbW1hbmQuIFJlYWRzIGFyZSAyIGNvbnNlY3V0aXZlIHRyYW5zZmVyIChhcyBhbHdheXMpLgorICoKKyAqIEdlbmVyYWwgc3RydWN0dXJlOgorICoKKyAqIHdyaXRlIG9yIGZpcnN0IG1lc3NhZ2Ugb2YgYSByZWFkOgorICogPGNtZGJ5dGU+IFZWIDxsZW4+IEIwIEIxIEIyIEIzCisgKgorICogc2Vjb25kIG1lc3NhZ2Ugb2YgYSByZWFkCisgKiA8Y21kYnl0ZT4gVlYgPGxlbj4gUjAgUjEgUjIgUjMKKyAqCisgKiB3aGVyZWFzIDAgPCBsZW4gPD0gNAorICoKKyAqIEkyQyBhZGRyZXNzIGlzIHN0b3JlZCBzb21ld2hlcmUgaW5zaWRlIHRoZSBkZXZpY2UuCisgKgorICogMHgwMSByZWFkIGZyb20gRUVQUk9NCisgKiAgVlYgPSBvZmZzZXQ7IEIqID0gMDsgUiogPSB2YWx1ZShzKQorICoKKyAqIDB4MDIgcmVhZCByZWdpc3RlciBvZiB0aGUgQ09GRE0KKyAqICBWViA9IHJlZ2lzdGVyOyBCKiA9IDA7IFIqID0gdmFsdWUocykKKyAqCisgKiAweDA1IHdyaXRlIHJlZ2lzdGVyIG9mIHRoZSBDT0ZETQorICogIFZWID0gcmVnaXN0ZXI7IEIqID0gdmFsdWUocyk7CisgKgorICogMHgwNiB3cml0ZSB0byB0aGUgdHVuZXIgKG9ubHkgZm9yIE5YVDYwMDApCisgKiAgVlYgPSAwOyBCKiA9IFBMTCBkYXRhOyBsZW4gPSA0OworICoKKyAqIDB4MDMgcmVhZCByZW1vdGUgY29udHJvbAorICogIFZWID0gMDsgQiogPSAwOyBsZW4gPSA0OyBSKiA9IGtleQorICoKKyAqIDB4MDcgd3JpdGUgdG8gdGhlIHJlbW90ZSAoZG9uJ3Qga25vdyB3aHkgb25lIHNob3VsZCB0aGlzLCByZXNldHRpbmcgPykKKyAqICBWViA9IDA7IEIqID0ga2V5OyBsZW4gPSA0OworICoKKyAqIDB4MDggd3JpdGUgcmVtb3RlIHR5cGUKKyAqICBWViA9IDA7IEJbMF0gPSAweDAxLCBsZW4gPSA0CisgKgorICogMHgwOSB3cml0ZSBkZXZpY2UgaW5pdAorICogIFRPRE8KKyAqLworI2RlZmluZSBVU0JfUkVBRF9FRVBST00gICAgICAgICAxCisKKyNkZWZpbmUgVVNCX1JFQURfQ09GRE0gICAgICAgICAgMgorI2RlZmluZSBVU0JfV1JJVEVfQ09GRE0gICAgICAgICA1CisKKyNkZWZpbmUgVVNCX1dSSVRFX1RVTkVSICAgICAgICAgNgorCisjZGVmaW5lIFVTQl9SRUFEX1JFTU9URSAgICAgICAgIDMKKyNkZWZpbmUgVVNCX1dSSVRFX1JFTU9URSAgICAgICAgNworI2RlZmluZSBVU0JfV1JJVEVfUkVNT1RFX1RZUEUgICA4CisKKyNkZWZpbmUgVVNCX0RFVl9JTklUICAgICAgICAgICAgOQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMjUyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiBGcm9udGVuZCBwYXJ0IG9mIHRoZSBMaW51eCBkcml2ZXIgZm9yIHRoZSBXaWRlVmlldy8gWWFrdW1vLyBIYW1hLworICogVHlwaG9vbi8gWXVhbiBEVkItVCBVU0IyLjAgcmVjZWl2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZHR0MjAwdS5oIgorCitzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSB7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkOworCisJZmVfc3RhdHVzX3Qgc3RhdDsKKworCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBmZXA7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKK307CisKK3N0YXRpYyBpbnQgZHR0MjAwdV9mZV9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QgKnN0YXQpCit7CisJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggc3QgPSBHRVRfVFVORV9TVEFUVVMsIGJbM107CisKKwlkdmJfdXNiX2dlbmVyaWNfcncoc3RhdGUtPmQsJnN0LDEsYiwzLDApOworCisJc3dpdGNoIChiWzBdKSB7CisJCWNhc2UgMHgwMToKKwkJCSpzdGF0ID0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSIHwKKwkJCQlGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX0xPQ0s7CisJCQlicmVhazsKKwkJY2FzZSAweDAwOiAvKiBwZW5kaW5nICovCisJCQkqc3RhdCA9IEZFX1RJTUVET1VUOyAvKiBkdXJpbmcgc2V0X2Zyb250ZW5kICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSAweDAyOiAvKiBmYWlsZWQgKi8KKwkJCSpzdGF0ID0gMDsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKmJlcikKK3sKKwlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidyA9IEdFVF9WSVRfRVJSX0NOVCxiWzNdOworCWR2Yl91c2JfZ2VuZXJpY19ydyhzdGF0ZS0+ZCwmYncsMSxiLDMsMCk7CisJKmJlciA9IChiWzBdIDw8IDE2KSB8IChiWzFdIDw8IDgpIHwgYlsyXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfdW5jX2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICp1bmMpCit7CisJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYncgPSBHRVRfUlNfVU5DT1JfQkxLX0NOVCxiWzJdOworCisJZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLGIsMiwwKTsKKwkqdW5jID0gKGJbMF0gPDwgOCkgfCBiWzFdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiAqc3RyZW5ndGgpCit7CisJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYncgPSBHRVRfQUdDLCBiOworCWR2Yl91c2JfZ2VuZXJpY19ydyhzdGF0ZS0+ZCwmYncsMSwmYiwxLDApOworCSpzdHJlbmd0aCA9IChiIDw8IDgpIHwgYjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdHQyMDB1X2ZlX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidyA9IEdFVF9TTlIsYnI7CisJZHZiX3VzYl9nZW5lcmljX3J3KHN0YXRlLT5kLCZidywxLCZiciwxLDApOworCSpzbnIgPSB+KChiciA8PCA4KSB8IGJyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdHQyMDB1X2ZlX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYiA9IFNFVF9JTklUOworCXJldHVybiBkdmJfdXNiX2dlbmVyaWNfd3JpdGUoc3RhdGUtPmQsJmIsMSk7Cit9CisKK3N0YXRpYyBpbnQgZHR0MjAwdV9mZV9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlyZXR1cm4gZHR0MjAwdV9mZV9pbml0KGZlKTsKK30KKworc3RhdGljIGludCBkdHQyMDB1X2ZlX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCit7CisJdHVuZS0+bWluX2RlbGF5X21zID0gMTUwMDsKKwl0dW5lLT5zdGVwX3NpemUgPSAwOworCXR1bmUtPm1heF9kcmlmdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHR0MjAwdV9mZV9zZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlpbnQgaTsKKwlmZV9zdGF0dXNfdCBzdDsKKwl1MTYgZnJlcSA9IGZlcC0+ZnJlcXVlbmN5IC8gMjUwMDAwOworCXU4IGJ3YnVmWzJdID0geyBTRVRfQkFORFdJRFRILCAwIH0sZnJlcWJ1ZlszXSA9IHsgU0VUX1JGX0ZSRVEsIDAsIDAgfTsKKworCXN3aXRjaCAoZmVwLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOiBid2J1ZlsxXSA9IDg7IGJyZWFrOworCQljYXNlIEJBTkRXSURUSF83X01IWjogYndidWZbMV0gPSA3OyBicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6IGJ3YnVmWzFdID0gNjsgYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIX0FVVE86IHJldHVybiAtRU9QTk9UU1VQUDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWR2Yl91c2JfZ2VuZXJpY193cml0ZShzdGF0ZS0+ZCxid2J1ZiwyKTsKKworCWZyZXFidWZbMV0gPSBmcmVxICYgMHhmZjsKKwlmcmVxYnVmWzJdID0gKGZyZXEgPj4gOCkgJiAweGZmOworCWR2Yl91c2JfZ2VuZXJpY193cml0ZShzdGF0ZS0+ZCxmcmVxYnVmLDMpOworCisJZm9yIChpID0gMDsgaSA8IDMwOyBpKyspIHsKKwkJbXNsZWVwKDIwKTsKKwkJZHR0MjAwdV9mZV9yZWFkX3N0YXR1cyhmZSwgJnN0KTsKKwkJaWYgKHN0ICYgRkVfVElNRURPVVQpCisJCQljb250aW51ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdHQyMDB1X2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCW1lbWNweShmZXAsJnN0YXRlLT5mZXAsc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkdHQyMDB1X2ZlX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGR0dDIwMHVfZmVfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHR0MjAwdV9mZV9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIGR0dDIwMHVfZmVfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSogc3RhdGUgPSBOVUxMOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IChzdHJ1Y3QgZHR0MjAwdV9mZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKHN0cnVjdCBkdHQyMDB1X2ZlX3N0YXRlKSk7CisKKwlkZWJfaW5mbygiYXR0YWNoaW5nIGZyb250ZW5kIGR0dDIwMHVcbiIpOworCisJc3RhdGUtPmQgPSBkOworCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZkdHQyMDB1X2ZlX29wczsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCisJZ290byBzdWNjZXNzOworZXJyb3I6CisJcmV0dXJuIE5VTEw7CitzdWNjZXNzOgorCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHR0MjAwdV9mZV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lCQkJPSAiV2lkZVZpZXcgVVNCIERWQi1UIiwKKwkJLnR5cGUJCQk9IEZFX09GRE0sCisJCS5mcmVxdWVuY3lfbWluCQk9IDQ0MjUwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSA4NjcyNTAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAyNTAwMDAsCisJCS5jYXBzID0gRkVfQ0FOX0lOVkVSU0lPTl9BVVRPIHwKKwkJCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJCUZFX0NBTl9RUFNLIHwgRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNX0FVVE8gfAorCQkJCUZFX0NBTl9UUkFOU01JU1NJT05fTU9ERV9BVVRPIHwKKwkJCQlGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CisJCQkJRkVfQ0FOX1JFQ09WRVIgfAorCQkJCUZFX0NBTl9ISUVSQVJDSFlfQVVUTywKKwl9LAorCisJLnJlbGVhc2UgPSBkdHQyMDB1X2ZlX3JlbGVhc2UsCisKKwkuaW5pdCA9IGR0dDIwMHVfZmVfaW5pdCwKKwkuc2xlZXAgPSBkdHQyMDB1X2ZlX3NsZWVwLAorCisJLnNldF9mcm9udGVuZCA9IGR0dDIwMHVfZmVfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSBkdHQyMDB1X2ZlX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBkdHQyMDB1X2ZlX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gZHR0MjAwdV9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSBkdHQyMDB1X2ZlX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGR0dDIwMHVfZmVfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gZHR0MjAwdV9mZV9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IGR0dDIwMHVfZmVfcmVhZF91bmNfYmxvY2tzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkYmE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKiBEVkIgVVNCIGxpYnJhcnkgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlIFdpZGVWaWV3LyBZYWt1bW8vIEhhbWEvCisgKiBUeXBob29uLyBZdWFuIERWQi1UIFVTQjIuMCByZWNlaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKKyAqCisgKiBUaGFua3MgdG8gU3RldmUgQ2hhbmcgZnJvbSBXaWRlVmlldyBmb3IgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHRoZSBXVC0yMjBVLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZHR0MjAwdS5oIgorCisvKiBkZWJ1ZyAqLworaW50IGR2Yl91c2JfZHR0MjAwdV9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX2R0dDIwMHVfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLHhmZXI9MiAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworCitzdGF0aWMgaW50IGR0dDIwMHVfcG93ZXJfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKK3sKKwl1OCBiID0gU0VUX0lOSVQ7CisKKwlpZiAob25vZmYpCisJCWR2Yl91c2JfZ2VuZXJpY193cml0ZShkLCZiLDIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHR0MjAwdV9zdHJlYW1pbmdfY3RybChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBvbm9mZikKK3sKKwl1OCBiX3N0cmVhbWluZ1syXSA9IHsgU0VUX1NUUkVBTUlORywgb25vZmYgfTsKKwl1OCBiX3JzdF9waWQgPSBSRVNFVF9QSURfRklMVEVSOworCisJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsYl9zdHJlYW1pbmcsMik7CisKKwlpZiAob25vZmYgPT0gMCkKKwkJZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsJmJfcnN0X3BpZCwxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdHQyMDB1X3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKK3sKKwl1OCBiX3BpZFs0XTsKKwlwaWQgPSBvbm9mZiA/IHBpZCA6IDA7CisKKwliX3BpZFswXSA9IFNFVF9QSURfRklMVEVSOworCWJfcGlkWzFdID0gaW5kZXg7CisJYl9waWRbMl0gPSBwaWQgJiAweGZmOworCWJfcGlkWzNdID0gKHBpZCA+PiA4KSAmIDB4MWY7CisKKwlyZXR1cm4gZHZiX3VzYl9nZW5lcmljX3dyaXRlKGQsYl9waWQsNCk7Cit9CisKKy8qIHJlbW90ZSBjb250cm9sICovCisvKiBrZXkgbGlzdCBmb3IgdGhlIHRpbnkgcmVtb3RlIGNvbnRyb2wgKFlha3VtbywgZG9uJ3Qga25vdyBhYm91dCB0aGUgb3RoZXJzKSAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBkdHQyMDB1X3JjX2tleXNbXSA9IHsKKwl7IDB4ODAsIDB4MDEsIEtFWV9NVVRFIH0sCisJeyAweDgwLCAweDAyLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4ODAsIDB4MDMsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDgwLCAweDA0LCBLRVlfMSB9LAorCXsgMHg4MCwgMHgwNSwgS0VZXzIgfSwKKwl7IDB4ODAsIDB4MDYsIEtFWV8zIH0sCisJeyAweDgwLCAweDA3LCBLRVlfNCB9LAorCXsgMHg4MCwgMHgwOCwgS0VZXzUgfSwKKwl7IDB4ODAsIDB4MDksIEtFWV82IH0sCisJeyAweDgwLCAweDBhLCBLRVlfNyB9LAorCXsgMHg4MCwgMHgwYywgS0VZX1pPT00gfSwKKwl7IDB4ODAsIDB4MGQsIEtFWV8wIH0sCisJeyAweDgwLCAweDBlLCBLRVlfU0VMRUNUIH0sCisJeyAweDgwLCAweDEyLCBLRVlfUE9XRVIgfSwKKwl7IDB4ODAsIDB4MWEsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4ODAsIDB4MWIsIEtFWV84IH0sCisJeyAweDgwLCAweDFlLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4ODAsIDB4MWYsIEtFWV85IH0sCit9OworCitzdGF0aWMgaW50IGR0dDIwMHVfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQoreworCXU4IGtleVs1XSxjbWQgPSBHRVRfUkNfQ09ERTsKKwlkdmJfdXNiX2dlbmVyaWNfcncoZCwmY21kLDEsa2V5LDUsMCk7CisJZHZiX3VzYl9uZWNfcmNfa2V5X3RvX2V2ZW50KGQsa2V5LGV2ZW50LHN0YXRlKTsKKwlpZiAoa2V5WzBdICE9IDApCisJCWRlYl9pbmZvKCJrZXk6ICV4ICV4ICV4ICV4ICV4XG4iLGtleVswXSxrZXlbMV0sa2V5WzJdLGtleVszXSxrZXlbNF0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR0dDIwMHVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5mZSA9IGR0dDIwMHVfZmVfYXR0YWNoKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBkdHQyMDB1X3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyB3dDIyMHVfcHJvcGVydGllczsKKworc3RhdGljIGludCBkdHQyMDB1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmR0dDIwMHVfcHJvcGVydGllcyxUSElTX01PRFVMRSkgPT0gMCB8fAorCQlkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnd0MjIwdV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZHR0MjAwdV91c2JfdGFibGUgW10gPSB7CisvLwkJeyBVU0JfREVWSUNFKDB4MDRiNCwweDg2MTMpIH0sCisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX0RUVDIwMFVfQ09MRCkgfSwKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfV0lERVZJRVcsIFVTQl9QSURfRFRUMjAwVV9XQVJNKSB9LAorCQl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9XSURFVklFVywgVVNCX1BJRF9XVDIyMFVfQ09MRCkgIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX1dJREVWSUVXLCBVU0JfUElEX1dUMjIwVV9XQVJNKSAgfSwKKwkgICAgeyAwIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGR0dDIwMHVfdXNiX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZHR0MjAwdV9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9IQVNfUElEX0ZJTFRFUiB8IERWQl9VU0JfTkVFRF9QSURfRklMVEVSSU5HLAorCS5waWRfZmlsdGVyX2NvdW50ID0gMTUsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1kdHQyMDB1LTAxLmZ3IiwKKworCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCisJLnN0cmVhbWluZ19jdHJsICA9IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwsCisJLnBpZF9maWx0ZXIgICAgICA9IGR0dDIwMHVfcGlkX2ZpbHRlciwKKwkuZnJvbnRlbmRfYXR0YWNoID0gZHR0MjAwdV9mcm9udGVuZF9hdHRhY2gsCisKKwkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAorCS5yY19rZXlfbWFwICAgICAgPSBkdHQyMDB1X3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoZHR0MjAwdV9yY19rZXlzKSwKKwkucmNfcXVlcnkgICAgICAgID0gZHR0MjAwdV9yY19xdWVyeSwKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAubmFtZSA9ICJXaWRlVmlldy9ZdWFuL1lha3Vtby9IYW1hL1R5cGhvb24gRFZCLVQgVVNCMi4wIChXVC0yMDBVKSIsCisJCSAgLmNvbGRfaWRzID0geyAmZHR0MjAwdV91c2JfdGFibGVbMF0sIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVsxXSwgTlVMTCB9LAorCQl9LAorCQl7IDAgfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyB3dDIyMHVfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX05FRURfUElEX0ZJTFRFUklORywKKwkucGlkX2ZpbHRlcl9jb3VudCA9IDE1LAorCisJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCisJLmZpcm13YXJlID0gImR2Yi11c2Itd3QyMjB1LTAxLmZ3IiwKKworCS5wb3dlcl9jdHJsICAgICAgPSBkdHQyMDB1X3Bvd2VyX2N0cmwsCisJLnN0cmVhbWluZ19jdHJsICA9IGR0dDIwMHVfc3RyZWFtaW5nX2N0cmwsCisJLnBpZF9maWx0ZXIgICAgICA9IGR0dDIwMHVfcGlkX2ZpbHRlciwKKwkuZnJvbnRlbmRfYXR0YWNoID0gZHR0MjAwdV9mcm9udGVuZF9hdHRhY2gsCisKKwkucmNfaW50ZXJ2YWwgICAgID0gMzAwLAorCS5yY19rZXlfbWFwICAgICAgPSBkdHQyMDB1X3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSA9IEFSUkFZX1NJWkUoZHR0MjAwdV9yY19rZXlzKSwKKwkucmNfcXVlcnkgICAgICAgID0gZHR0MjAwdV9yY19xdWVyeSwKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAubmFtZSA9ICJXaWRlVmlldyBXVC0yMjBVIFBlblR5cGUgUmVjZWl2ZXIgKGFuZCBjbG9uZXMpIiwKKwkJICAuY29sZF9pZHMgPSB7ICZkdHQyMDB1X3VzYl90YWJsZVsyXSwgTlVMTCB9LAorCQkgIC53YXJtX2lkcyA9IHsgJmR0dDIwMHVfdXNiX3RhYmxlWzNdLCBOVUxMIH0sCisJCX0sCisJCXsgMCB9LAorCX0KK307CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkdHQyMDB1X3VzYl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJkdmJfdXNiX2R0dDIwMHUiLAorCS5wcm9iZSAJCT0gZHR0MjAwdV91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZSAJPSBkdHQyMDB1X3VzYl90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgZHR0MjAwdV91c2JfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZkdHQyMDB1X3VzYl9kcml2ZXIpKSkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuICglZCkiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkdHQyMDB1X3VzYl9tb2R1bGVfZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgZnJvbSB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZkdHQyMDB1X3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChkdHQyMDB1X3VzYl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChkdHQyMDB1X3VzYl9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBXaWRlVmlldy9ZYWt1bW8vSGFtYS9UeXBob29uIERWQi1UIFVTQjIuMCBkZXZpY2VzIik7CitNT0RVTEVfVkVSU0lPTigiMS4wIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMWYzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R0dDIwMHUuaApAQCAtMCwwICsxLDU2IEBACisvKiBDb21tb24gaGVhZGVyIGZpbGUgb2YgTGludXggZHJpdmVyIGZvciB0aGUgV2lkZVZpZXcvIFlha3Vtby8gSGFtYS8KKyAqIFR5cGhvb24vIFl1YW4gRFZCLVQgVVNCMi4wIHJlY2VpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaWZuZGVmIF9EVkJfVVNCX0RUVDIwMFVfSF8KKyNkZWZpbmUgX0RWQl9VU0JfRFRUMjAwVV9IXworCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAiZHR0MjAwdSIKKyNpbmNsdWRlICJkdmItdXNiLmgiCisKK2V4dGVybiBpbnQgZHZiX3VzYl9kdHQyMDB1X2RlYnVnOworI2RlZmluZSBkZWJfaW5mbyhhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfZHR0MjAwdV9kZWJ1ZywweDAxLGFyZ3MpCisjZGVmaW5lIGRlYl94ZmVyKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl9kdHQyMDB1X2RlYnVnLDB4MDIsYXJncykKKworLyogZ3Vlc3NlZCBwcm90b2NvbCBkZXNjcmlwdGlvbiAocmV2ZXJzZSBlbmdpbmVlcmVkKToKKyAqIHJlYWQKKyAqICAwMCAtIFVTQiB0eXBlIDB4MDIgZm9yIHVzYjIuMCwgMHgwMSBmb3IgdXNiMS4xCisgKiAgODggLSBsb2NraW5nIDIgYnl0ZXMgKDB4ODAgMHg0MCA9PSBubyBzaWduYWwsIDB4ODkgMHgyMCA9PSBuaWNlIHNpZ25hbCkKKyAqLworCisjZGVmaW5lIEdFVF9TUEVFRCAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgR0VUX1RVTkVfU1RBVFVTICAgICAgMHg4MQorI2RlZmluZSBHRVRfUkNfQ09ERSAgICAgICAgICAweDg0CisjZGVmaW5lIEdFVF9DT05GSUdVUkFUSU9OICAgIDB4ODgKKyNkZWZpbmUgR0VUX0FHQyAgICAgICAgICAgICAgMHg4OQorI2RlZmluZSBHRVRfU05SICAgICAgICAgICAgICAweDhhCisjZGVmaW5lIEdFVF9WSVRfRVJSX0NOVCAgICAgIDB4OGMKKyNkZWZpbmUgR0VUX1JTX0VSUl9DTlQgICAgICAgMHg4ZAorI2RlZmluZSBHRVRfUlNfVU5DT1JfQkxLX0NOVCAweDhlCisKKy8qIHdyaXRlCisgKiAgMDEgLSBpbml0CisgKiAgMDIgLSBmcmVxdWVuY3kgKGRpdmlkZWQgYnkgMjUwMDAwKQorICogIDAzIC0gYmFuZHdpZHRoCisgKiAgMDQgLSBwaWQgdGFibGUgKGluZGV4IHBpZCg3OjApIHBpZCgxMjo4KSkKKyAqICAwNSAtIHJlc2V0IHRoZSBwaWQgdGFibGUKKyAqICAwOCAtIHRyYW5zZmVyIHN3aXRjaAorICovCisKKyNkZWZpbmUgU0VUX0lOSVQgICAgICAgICAweDAxCisjZGVmaW5lIFNFVF9SRl9GUkVRICAgICAgMHgwMgorI2RlZmluZSBTRVRfQkFORFdJRFRIICAgIDB4MDMKKyNkZWZpbmUgU0VUX1BJRF9GSUxURVIgICAweDA0CisjZGVmaW5lIFJFU0VUX1BJRF9GSUxURVIgMHgwNQorI2RlZmluZSBTRVRfU1RSRUFNSU5HICAgIDB4MDgKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiBkdHQyMDB1X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzAwNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWNvbW1vbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIGR2Yi11c2ItY29tbW9uLmggaXMgcGFydCBvZiB0aGUgRFZCIFVTQiBsaWJyYXJ5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICogc2VlIGR2Yi11c2ItaW5pdC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKgorICogYSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHByb3RvdHlwZXMgYW5kIHR5cGVzIGZvciBpbnRlcm5hbCB1c2Ugb2YgdGhlIGR2Yi11c2ItbGliCisgKi8KKyNpZm5kZWYgX0RWQl9VU0JfQ09NTU9OX0hfCisjZGVmaW5lIF9EVkJfVVNCX0NPTU1PTl9IXworCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAiZHZiLXVzYiIKKyNpbmNsdWRlICJkdmItdXNiLmgiCisKK2V4dGVybiBpbnQgZHZiX3VzYl9kZWJ1ZzsKK2V4dGVybiBpbnQgZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmc7CisKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDEsYXJncykKKyNkZWZpbmUgZGViX3hmZXIoYXJncy4uLikgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDIsYXJncykKKyNkZWZpbmUgZGViX3BsbChhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDQsYXJncykKKyNkZWZpbmUgZGViX3RzKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MDgsYXJncykKKyNkZWZpbmUgZGViX2VycihhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MTAsYXJncykKKyNkZWZpbmUgZGViX3JjKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4MjAsYXJncykKKyNkZWZpbmUgZGViX2Z3KGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4NDAsYXJncykKKyNkZWZpbmUgZGViX21lbShhcmdzLi4uKSAgZHByaW50ayhkdmJfdXNiX2RlYnVnLDB4ODAsYXJncykKKworLyogY29tbW9ubHkgdXNlZCAgbWV0aG9kcyAqLworZXh0ZXJuIGludCB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworZXh0ZXJuIGludCBkdmJfdXNiX3VyYl9zdWJtaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICopOworZXh0ZXJuIGludCBkdmJfdXNiX3VyYl9raWxsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKTsKK2V4dGVybiBpbnQgZHZiX3VzYl91cmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CitleHRlcm4gaW50IGR2Yl91c2JfdXJiX2V4aXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICopOworCitleHRlcm4gaW50IGR2Yl91c2JfaTJjX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICopOworZXh0ZXJuIGludCBkdmJfdXNiX2kyY19leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKTsKKworZXh0ZXJuIGludCBkdmJfdXNiX2R2Yl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKTsKK2V4dGVybiBpbnQgZHZiX3VzYl9kdmJfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CisKK2V4dGVybiBpbnQgZHZiX3VzYl9mZV9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKTsKK2V4dGVybiBpbnQgZHZiX3VzYl9mZV9leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKTsKKworZXh0ZXJuIGludCBkdmJfdXNiX3JlbW90ZV9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqKTsKK2V4dGVybiBpbnQgZHZiX3VzYl9yZW1vdGVfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTFmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIGR2Yi11c2ItZHZiLmMgaXMgcGFydCBvZiB0aGUgRFZCIFVTQiBsaWJyYXJ5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICogc2VlIGR2Yi11c2ItaW5pdC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBoYW5kbGluZyB0aGUKKyAqIGxpbnV4LWR2YiBBUEkuCisgKi8KKyNpbmNsdWRlICJkdmItdXNiLWNvbW1vbi5oIgorCitzdGF0aWMgaW50IGR2Yl91c2JfY3RybF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCwgaW50IG9ub2ZmKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGR2YmRteGZlZWQtPmRlbXV4LT5wcml2OworCWludCBuZXdmZWVkY291bnQscmV0OworCisJaWYgKGQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwluZXdmZWVkY291bnQgPSBkLT5mZWVkY291bnQgKyAob25vZmYgPyAxIDogLTEpOworCisJLyoKKwkgKiBzdG9wIGZlZWQgYmVmb3JlIHNldHRpbmcgYSBuZXcgcGlkIGlmIHRoZXJlIHdpbGwgYmUgbm8gcGlkIGFueW1vcmUKKwkgKi8KKwlpZiAobmV3ZmVlZGNvdW50ID09IDApIHsKKwkJZGViX3RzKCJzdG9wIGZlZWRpbmdcbiIpOworCisJCWlmIChkLT5wcm9wcy5zdHJlYW1pbmdfY3RybCAhPSBOVUxMKQorCQkJaWYgKChyZXQgPSBkLT5wcm9wcy5zdHJlYW1pbmdfY3RybChkLDApKSkKKwkJCQllcnIoImVycm9yIHdoaWxlIHN0b3BwaW5nIHN0cmVhbS4iKTsKKworCQlkdmJfdXNiX3VyYl9raWxsKGQpOworCX0KKworCWQtPmZlZWRjb3VudCA9IG5ld2ZlZWRjb3VudDsKKworCS8qIGFjdGl2YXRlIHRoZSBwaWQgb24gdGhlIGRldmljZSBzcGVjaWZpYyBwaWRfZmlsdGVyICovCisJZGViX3RzKCJzZXR0aW5nIHBpZDogJTVkICUwNHggYXQgaW5kZXggJWQgJyVzJ1xuIixkdmJkbXhmZWVkLT5waWQsZHZiZG14ZmVlZC0+cGlkLGR2YmRteGZlZWQtPmluZGV4LG9ub2ZmID8gIm9uIiA6ICJvZmYiKTsKKwlpZiAoZC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfSEFTX1BJRF9GSUxURVIgJiYKKwkJZC0+cGlkX2ZpbHRlcmluZyAmJgorCQlkLT5wcm9wcy5waWRfZmlsdGVyICE9IE5VTEwpCisJCWQtPnByb3BzLnBpZF9maWx0ZXIoZCxkdmJkbXhmZWVkLT5pbmRleCxkdmJkbXhmZWVkLT5waWQsb25vZmYpOworCisJLyogc3RhcnQgdGhlIGZlZWQgaWYgdGhpcyB3YXMgdGhlIGZpcnN0IGZlZWQgYW5kIHRoZXJlIGlzIHN0aWxsIGEgZmVlZAorCSAqIGZvciByZWNlcHRpb24uCisJICovCisJaWYgKGQtPmZlZWRjb3VudCA9PSBvbm9mZiAmJiBkLT5mZWVkY291bnQgPiAwKSB7CisKKwkJZGViX3RzKCJjb250cm9sbGluZyBwaWQgcGFyc2VyXG4iKTsKKwkJaWYgKGQtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0hBU19QSURfRklMVEVSICYmCisJCQlkLT5wcm9wcy5jYXBzICYgRFZCX1VTQl9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGICYmCisJCQlkLT5wcm9wcy5waWRfZmlsdGVyX2N0cmwgIT0gTlVMTCkKKwkJCWlmIChkLT5wcm9wcy5waWRfZmlsdGVyX2N0cmwoZCxkLT5waWRfZmlsdGVyaW5nKSA8IDApCisJCQkJZXJyKCJjb3VsZCBub3QgaGFuZGxlIHBpZF9wYXJzZXIiKTsKKworCQlkZWJfdHMoInN0YXJ0IGZlZWRpbmdcbiIpOworCQlpZiAoZC0+cHJvcHMuc3RyZWFtaW5nX2N0cmwgIT0gTlVMTCkKKwkJCWlmIChkLT5wcm9wcy5zdHJlYW1pbmdfY3RybChkLDEpKSB7CisJCQkJZXJyKCJlcnJvciB3aGlsZSBlbmFibGluZyBmaWZvLiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfQorCisJCWR2Yl91c2JfdXJiX3N1Ym1pdChkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX3VzYl9zdGFydF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlkZWJfdHMoInN0YXJ0IHBpZDogMHglMDR4LCBmZWVkdHlwZTogJWRcbiIsIGR2YmRteGZlZWQtPnBpZCxkdmJkbXhmZWVkLT50eXBlKTsKKwlyZXR1cm4gZHZiX3VzYl9jdHJsX2ZlZWQoZHZiZG14ZmVlZCwxKTsKK30KKworc3RhdGljIGludCBkdmJfdXNiX3N0b3BfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCit7CisJZGViX3RzKCJzdG9wIHBpZDogMHglMDR4LCBmZWVkdHlwZTogJWRcbiIsIGR2YmRteGZlZWQtPnBpZCwgZHZiZG14ZmVlZC0+dHlwZSk7CisJcmV0dXJuIGR2Yl91c2JfY3RybF9mZWVkKGR2YmRteGZlZWQsMCk7Cit9CisKK2ludCBkdmJfdXNiX2R2Yl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmZC0+ZHZiX2FkYXAsIGQtPmRlc2MtPm5hbWUsCisJCQlkLT5vd25lcikpIDwgMCkgeworCQlkZWJfaW5mbygiZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgZmFpbGVkOiBlcnJvciAlZCIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKwlkLT5kdmJfYWRhcC5wcml2ID0gZDsKKworCWlmIChkLT5wcm9wcy5yZWFkX21hY19hZGRyZXNzKSB7CisJCWlmIChkLT5wcm9wcy5yZWFkX21hY19hZGRyZXNzKGQsZC0+ZHZiX2FkYXAucHJvcG9zZWRfbWFjKSA9PSAwKQorCQkJaW5mbygiTUFDIGFkZHJlc3M6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IixkLT5kdmJfYWRhcC5wcm9wb3NlZF9tYWNbMF0sCisJCQkJCWQtPmR2Yl9hZGFwLnByb3Bvc2VkX21hY1sxXSxkLT5kdmJfYWRhcC5wcm9wb3NlZF9tYWNbMl0sCisJCQkJCWQtPmR2Yl9hZGFwLnByb3Bvc2VkX21hY1szXSxkLT5kdmJfYWRhcC5wcm9wb3NlZF9tYWNbNF0sCisJCQkJCWQtPmR2Yl9hZGFwLnByb3Bvc2VkX21hY1s1XSk7CisJCWVsc2UKKwkJCWVycigiTUFDIGFkZHJlc3MgcmVhZGluZyBmYWlsZWQuIik7CisJfQorCisKKwlkLT5kZW11eC5kbXguY2FwYWJpbGl0aWVzID0gRE1YX1RTX0ZJTFRFUklORyB8IERNWF9TRUNUSU9OX0ZJTFRFUklORzsKKwlkLT5kZW11eC5wcml2ID0gZDsKKworCWQtPmRlbXV4LmZlZWRudW0gPSBkLT5kZW11eC5maWx0ZXJudW0gPSBkLT5tYXhfZmVlZF9jb3VudDsKKwlkLT5kZW11eC5zdGFydF9mZWVkID0gZHZiX3VzYl9zdGFydF9mZWVkOworCWQtPmRlbXV4LnN0b3BfZmVlZCAgPSBkdmJfdXNiX3N0b3BfZmVlZDsKKwlkLT5kZW11eC53cml0ZV90b19kZWNvZGVyID0gTlVMTDsKKwlpZiAoKHJldCA9IGR2Yl9kbXhfaW5pdCgmZC0+ZGVtdXgpKSA8IDApIHsKKwkJZXJyKCJkdmJfZG14X2luaXQgZmFpbGVkOiBlcnJvciAlZCIscmV0KTsKKwkJZ290byBlcnJfZG14OworCX0KKworCWQtPmRteGRldi5maWx0ZXJudW0gPSBkLT5kZW11eC5maWx0ZXJudW07CisJZC0+ZG14ZGV2LmRlbXV4ID0gJmQtPmRlbXV4LmRteDsKKwlkLT5kbXhkZXYuY2FwYWJpbGl0aWVzID0gMDsKKwlpZiAoKHJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmZC0+ZG14ZGV2LCAmZC0+ZHZiX2FkYXApKSA8IDApIHsKKwkJZXJyKCJkdmJfZG14ZGV2X2luaXQgZmFpbGVkOiBlcnJvciAlZCIscmV0KTsKKwkJZ290byBlcnJfZG14X2RldjsKKwl9CisKKwlkdmJfbmV0X2luaXQoJmQtPmR2Yl9hZGFwLCAmZC0+ZHZiX25ldCwgJmQtPmRlbXV4LmRteCk7CisKKwlnb3RvIHN1Y2Nlc3M7CitlcnJfZG14X2RldjoKKwlkdmJfZG14X3JlbGVhc2UoJmQtPmRlbXV4KTsKK2Vycl9kbXg6CisJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZC0+ZHZiX2FkYXApOworZXJyOgorCXJldHVybiByZXQ7CitzdWNjZXNzOgorCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfRFZCOworCXJldHVybiAwOworfQorCitpbnQgZHZiX3VzYl9kdmJfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9EVkIpIHsKKwkJZGViX2luZm8oInVucmVnaXN0ZXJpbmcgRFZCIHBhcnRcbiIpOworCQlkdmJfbmV0X3JlbGVhc2UoJmQtPmR2Yl9uZXQpOworCQlkLT5kZW11eC5kbXguY2xvc2UoJmQtPmRlbXV4LmRteCk7CisJCWR2Yl9kbXhkZXZfcmVsZWFzZSgmZC0+ZG14ZGV2KTsKKwkJZHZiX2RteF9yZWxlYXNlKCZkLT5kZW11eCk7CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmQtPmR2Yl9hZGFwKTsKKwkJZC0+c3RhdGUgJj0gfkRWQl9VU0JfU1RBVEVfRFZCOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfdXNiX2ZlX3dha2V1cChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OworCisJaWYgKGQtPnByb3BzLnBvd2VyX2N0cmwpCisJCWQtPnByb3BzLnBvd2VyX2N0cmwoZCwxKTsKKworCWlmIChkLT5mZV9pbml0KQorCQlkLT5mZV9pbml0KGZlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl91c2JfZmVfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gZmUtPmR2Yi0+cHJpdjsKKworCWlmIChkLT5mZV9zbGVlcCkKKwkJZC0+ZmVfc2xlZXAoZmUpOworCisJaWYgKGQtPnByb3BzLnBvd2VyX2N0cmwpCisJCWQtPnByb3BzLnBvd2VyX2N0cmwoZCwwKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHZiX3VzYl9mZV9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSogZCkKK3sKKwlpZiAoZC0+cHJvcHMuZnJvbnRlbmRfYXR0YWNoID09IE5VTEwpIHsKKwkJZXJyKCJzdHJhbmdlICclcycgZG9lc24ndCB3YW50IHRvIGF0dGFjaCBhIGZyb250ZW5kLiIsZC0+ZGVzYy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWQtPnByb3BzLmZyb250ZW5kX2F0dGFjaChkKTsKKworCS8qIHJlLWFzc2lnbiBzbGVlcCBhbmQgd2FrZXVwIGZ1bmN0aW9ucyAqLworCWlmIChkLT5mZSAhPSBOVUxMKSB7CisJCWQtPmZlX2luaXQgPSBkLT5mZS0+b3BzLT5pbml0OyAgIGQtPmZlLT5vcHMtPmluaXQgID0gZHZiX3VzYl9mZV93YWtldXA7CisJCWQtPmZlX3NsZWVwID0gZC0+ZmUtPm9wcy0+c2xlZXA7IGQtPmZlLT5vcHMtPnNsZWVwID0gZHZiX3VzYl9mZV9zbGVlcDsKKworCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZkLT5kdmJfYWRhcCwgZC0+ZmUpKSB7CisJCQllcnIoIkZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQuIik7CisJCQlpZiAoZC0+ZmUtPm9wcy0+cmVsZWFzZSkKKwkJCQlkLT5mZS0+b3BzLT5yZWxlYXNlKGQtPmZlKTsKKwkJCWQtPmZlID0gTlVMTDsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfSBlbHNlCisJCWVycigibm8gZnJvbnRlbmQgd2FzIGF0dGFjaGVkIGJ5ICclcyciLGQtPmRlc2MtPm5hbWUpOworCisJaWYgKGQtPnByb3BzLnR1bmVyX2F0dGFjaCAhPSBOVUxMKQorCQlkLT5wcm9wcy50dW5lcl9hdHRhY2goZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGR2Yl91c2JfZmVfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaWYgKGQtPmZlICE9IE5VTEwpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGQtPmZlKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1maXJtd2FyZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NGUzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1maXJtd2FyZS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiBkdmItdXNiLWZpcm13YXJlLmMgaXMgcGFydCBvZiB0aGUgRFZCIFVTQiBsaWJyYXJ5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICogc2VlIGR2Yi11c2ItaW5pdC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgZG93bmxvYWRpbmcgdGhlIGZpcm13YXJlIHRvIEN5cHJlc3MgRlggMSBhbmQgMiBiYXNlZCBkZXZpY2VzLgorICoKKyAqIEZJWE1FOiBUaGlzIHBhcnQgZG9lcyBhY3R1YWxseSBub3QgYmVsb25nIHRvIGR2Yi11c2IsIGJ1dCB0byB0aGUgdXNiLXN1YnN5c3RlbS4KKyAqLworI2luY2x1ZGUgImR2Yi11c2ItY29tbW9uLmgiCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCitzdHJ1Y3QgdXNiX2N5cHJlc3NfY29udHJvbGxlciB7CisJaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7ICAgICAgIC8qIG5hbWUgb2YgdGhlIHVzYiBjb250cm9sbGVyICovCisJdTE2IGNwdV9jc19yZWdpc3RlcjsgICAgLyogbmVlZHMgdG8gYmUgcmVzdGFydGVkLCB3aGVuIHRoZSBmaXJtd2FyZSBoYXMgYmVlbiBkb3dubG9hZGVkLiAqLworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfY3lwcmVzc19jb250cm9sbGVyIGN5cHJlc3NbXSA9IHsKKwl7IC5pZCA9IENZUFJFU1NfQU4yMTM1LCAubmFtZSA9ICJDeXByZXNzIEFOMjEzNSIsIC5jcHVfY3NfcmVnaXN0ZXIgPSAweDdmOTIgfSwKKwl7IC5pZCA9IENZUFJFU1NfQU4yMjM1LCAubmFtZSA9ICJDeXByZXNzIEFOMjIzNSIsIC5jcHVfY3NfcmVnaXN0ZXIgPSAweDdmOTIgfSwKKwl7IC5pZCA9IENZUFJFU1NfRlgyLCAgICAubmFtZSA9ICJDeXByZXNzIEZYMiIsICAgIC5jcHVfY3NfcmVnaXN0ZXIgPSAweGU2MDAgfSwKK307CisKKy8qCisgKiBsb2FkIGEgZmlybXdhcmUgcGFja2V0IHRvIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIGludCB1c2JfY3lwcmVzc193cml0ZW1lbShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldix1MTYgYWRkcix1OCAqZGF0YSwgdTggbGVuKQoreworCXJldHVybiB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsMCksCisJCQkweGEwLCBVU0JfVFlQRV9WRU5ET1IsIGFkZHIsIDB4MDAsIGRhdGEsIGxlbiwgNSpIWik7Cit9CisKK2ludCB1c2JfY3lwcmVzc19sb2FkX2Zpcm13YXJlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHR5cGUpCit7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisJdTE2IGFkZHI7CisJdTggKmIsKnA7CisJaW50IHJldCA9IDAsaTsKKworCWlmICgocmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCAmdWRldi0+ZGV2KSkgIT0gMCkgeworCQllcnIoImRpZCBub3QgZmluZCB0aGUgZmlybXdhcmUgZmlsZS4gKCVzKSAiCisJCQkiUGxlYXNlIHNlZSBsaW51eC9Eb2N1bWVudGF0aW9uL2R2Yi8gZm9yIG1vcmUgZGV0YWlscyBvbiBmaXJtd2FyZS1wcm9ibGVtcy4iLAorCQkJZmlsZW5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluZm8oImRvd25sb2FkaW5nIGZpcm13YXJlIGZyb20gZmlsZSAnJXMnIHRvIHRoZSAnJXMnIixmaWxlbmFtZSxjeXByZXNzW3R5cGVdLm5hbWUpOworCisJcCA9IGttYWxsb2MoZnctPnNpemUsR0ZQX0tFUk5FTCk7CisJaWYgKHAgIT0gTlVMTCkgeworCQl1OCByZXNldDsKKwkJLyoKKwkJICogeW91IGNhbm5vdCB1c2UgdGhlIGZ3LT5kYXRhIGFzIGJ1ZmZlciBmb3IKKwkJICogdXNiX2NvbnRyb2xfbXNnLCBhIG5ldyBidWZmZXIgaGFzIHRvIGJlCisJCSAqIGNyZWF0ZWQKKwkJICovCisJCW1lbWNweShwLGZ3LT5kYXRhLGZ3LT5zaXplKTsKKworCQkvKiBzdG9wIHRoZSBDUFUgKi8KKwkJcmVzZXQgPSAxOworCQlpZiAoKHJldCA9IHVzYl9jeXByZXNzX3dyaXRlbWVtKHVkZXYsY3lwcmVzc1t0eXBlXS5jcHVfY3NfcmVnaXN0ZXIsJnJlc2V0LDEpKSAhPSAxKQorCQkJZXJyKCJjb3VsZCBub3Qgc3RvcCB0aGUgVVNCIGNvbnRyb2xsZXIgQ1BVLiIpOworCQlmb3IoaSA9IDA7IHBbaSszXSA9PSAwICYmIGkgPCBmdy0+c2l6ZTsgKSB7CisJCQliID0gKHU4ICopICZwW2ldOworCQkJYWRkciA9IGNwdV90b19sZTE2KCAqKCh1MTYgKikgJmJbMV0pICk7CisKKwkJCWRlYl9mdygid3JpdGluZyB0byBhZGRyZXNzIDB4JTA0eCAoYnVmZmVyOiAweCUwMnglMDJ4KVxuIixhZGRyLGJbMV0sYlsyXSk7CisKKwkJCXJldCA9IHVzYl9jeXByZXNzX3dyaXRlbWVtKHVkZXYsYWRkciwmYls0XSxiWzBdKTsKKworCQkJaWYgKHJldCAhPSBiWzBdKSB7CisJCQkJZXJyKCJlcnJvciB3aGlsZSB0cmFuc2ZlcnJpbmcgZmlybXdhcmUgIgorCQkJCQkiKHRyYW5zZmVycmVkIHNpemU6ICVkLCBibG9jayBzaXplOiAlZCkiLAorCQkJCQlyZXQsYlswXSk7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkgKz0gNSArIGJbMF07CisJCX0KKwkJLyogbGVuZ3RoIGluIHJldCAqLworCQlpZiAocmV0ID4gMCkKKwkJCXJldCA9IDA7CisJCS8qIHJlc3RhcnQgdGhlIENQVSAqLworCQlyZXNldCA9IDA7CisJCWlmIChyZXQgfHwgdXNiX2N5cHJlc3Nfd3JpdGVtZW0odWRldixjeXByZXNzW3R5cGVdLmNwdV9jc19yZWdpc3RlciwmcmVzZXQsMSkgIT0gMSkgeworCQkJZXJyKCJjb3VsZCBub3QgcmVzdGFydCB0aGUgVVNCIGNvbnRyb2xsZXIgQ1BVLiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCisJCWtmcmVlKHApOworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9NRU07CisJfQorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBhOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiBkdmItdXNiLWkyYy5jIGlzIHBhcnQgb2YgdGhlIERWQiBVU0IgbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKKyAqIHNlZSBkdmItdXNiLWluaXQuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIChkZS0paW5pdGlhbGl6aW5nIGFuIEkyQyBhZGFwdGVyLgorICovCisjaW5jbHVkZSAiZHZiLXVzYi1jb21tb24uaCIKKworaW50IGR2Yl91c2JfaTJjX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCByZXQgPSAwOworCisJaWYgKCEoZC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIpKQorCQlyZXR1cm4gMDsKKworCWlmIChkLT5wcm9wcy5pMmNfYWxnbyA9PSBOVUxMKSB7CisJCWVycigibm8gaTJjIGFsZ29yaXRobSBzcGVjaWZpZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RybmNweShkLT5pMmNfYWRhcC5uYW1lLGQtPmRlc2MtPm5hbWUsSTJDX05BTUVfU0laRSk7CisjaWZkZWYgSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTAorCWQtPmkyY19hZGFwLmNsYXNzID0gSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTCwKKyNlbHNlCisJZC0+aTJjX2FkYXAuY2xhc3MgPSBJMkNfQ0xBU1NfVFZfRElHSVRBTCwKKyNlbmRpZgorCWQtPmkyY19hZGFwLmFsZ28gICAgICA9IGQtPnByb3BzLmkyY19hbGdvOworCWQtPmkyY19hZGFwLmFsZ29fZGF0YSA9IE5VTEw7CisJZC0+aTJjX2FkYXAuaWQgICAgICAgID0gSTJDX0FMR09fQklUOworCisJaTJjX3NldF9hZGFwZGF0YSgmZC0+aTJjX2FkYXAsIGQpOworCisJaWYgKChyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmQtPmkyY19hZGFwKSkgPCAwKQorCQllcnIoImNvdWxkIG5vdCBhZGQgaTJjIGFkYXB0ZXIiKTsKKworCWQtPnN0YXRlIHw9IERWQl9VU0JfU1RBVEVfSTJDOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGR2Yl91c2JfaTJjX2V4aXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfSTJDKQorCQlpMmNfZGVsX2FkYXB0ZXIoJmQtPmkyY19hZGFwKTsKKwlkLT5zdGF0ZSAmPSB+RFZCX1VTQl9TVEFURV9JMkM7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkdmJfdXNiX3BsbF9pbml0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBkLT5wbGxfYWRkciwgLmZsYWdzID0gMCwgLmJ1ZiA9IGQtPnBsbF9pbml0LCAubGVuID0gNCB9OworCWludCByZXQgPSAwOworCisJLyogaWYgdGhlcmUgaXMgbm90aGluZyB0byBpbml0aWFsaXplICovCisJaWYgKGQtPnBsbF9pbml0WzBdID09IDB4MDAgJiYgZC0+cGxsX2luaXRbMV0gPT0gMHgwMCAmJgorCQlkLT5wbGxfaW5pdFsyXSA9PSAweDAwICYmIGQtPnBsbF9pbml0WzNdID09IDB4MDApCisJCXJldHVybiAwOworCisJaWYgKGQtPnR1bmVyX3Bhc3NfY3RybCkKKwkJZC0+dHVuZXJfcGFzc19jdHJsKGZlLDEsZC0+cGxsX2FkZHIpOworCisJZGViX3BsbCgicGxsIGluaXQ6ICV4XG4iLGQtPnBsbF9hZGRyKTsKKwlkZWJfcGxsKCJwbGwtYnVmOiAleCAleCAleCAleFxuIixkLT5wbGxfaW5pdFswXSxkLT5wbGxfaW5pdFsxXSwKKwkJCWQtPnBsbF9pbml0WzJdLGQtPnBsbF9pbml0WzNdKTsKKworCWlmIChpMmNfdHJhbnNmZXIgKCZkLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQllcnIoInR1bmVyIGkyYyB3cml0ZSBmYWlsZWQgZm9yIHBsbF9pbml0LiIpOworCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKwltc2xlZXAoMSk7CisKKwlpZiAoZC0+dHVuZXJfcGFzc19jdHJsKQorCQlkLT50dW5lcl9wYXNzX2N0cmwoZmUsMCxkLT5wbGxfYWRkcik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHZiX3VzYl9wbGxfaW5pdF9pMmMpOworCitpbnQgZHZiX3VzYl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCwgdTggYls1XSkKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OworCisJZGViX3BsbCgicGxsIGFkZHI6ICV4LCBmcmVxOiAlZCAlcFxuIixkLT5wbGxfYWRkcixmZXAtPmZyZXF1ZW5jeSxkLT5wbGxfZGVzYyk7CisKKwliWzBdID0gZC0+cGxsX2FkZHIgPDwgMTsKKwlkdmJfcGxsX2NvbmZpZ3VyZShkLT5wbGxfZGVzYywmYlsxXSxmZXAtPmZyZXF1ZW5jeSxmZXAtPnUub2ZkbS5iYW5kd2lkdGgpOworCisJZGViX3BsbCgicGxsLWJ1ZjogJXggJXggJXggJXggJXhcbiIsYlswXSxiWzFdLGJbMl0sYlszXSxiWzRdKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkdmJfdXNiX3BsbF9zZXQpOworCitpbnQgZHZiX3VzYl9wbGxfc2V0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gZmUtPmR2Yi0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKwl1OCBiWzVdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBkLT5wbGxfYWRkciwgLmZsYWdzID0gMCwgLmJ1ZiA9ICZiWzFdLCAubGVuID0gNCB9OworCisJZHZiX3VzYl9wbGxfc2V0KGZlLGZlcCxiKTsKKworCWlmIChkLT50dW5lcl9wYXNzX2N0cmwpCisJCWQtPnR1bmVyX3Bhc3NfY3RybChmZSwxLGQtPnBsbF9hZGRyKTsKKworCWlmIChpMmNfdHJhbnNmZXIgKCZkLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQllcnIoInR1bmVyIGkyYyB3cml0ZSBmYWlsZWQgZm9yIHBsbF9zZXQuIik7CisJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCW1zbGVlcCgxKTsKKworCWlmIChkLT50dW5lcl9wYXNzX2N0cmwpCisJCWQtPnR1bmVyX3Bhc3NfY3RybChmZSwwLGQtPnBsbF9hZGRyKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl91c2JfcGxsX3NldF9pMmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NGQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTAsMCArMSw4OSBAQAorLyogZHZiLXVzYi1pZHMuaCBpcyBwYXJ0IG9mIHRoZSBEVkIgVVNCIGxpYnJhcnkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpIHNlZQorICogZHZiLXVzYi1pbml0LmMgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KKyAqCisgKiBhIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgZGVmaW5lJ3MgZm9yIHRoZSBVU0IgZGV2aWNlIHN1cHBvcnRlZCBieSB0aGUKKyAqIHZhcmlvdXMgZHJpdmVycy4KKyAqLworI2lmbmRlZiBfRFZCX1VTQl9JRFNfSF8KKyNkZWZpbmUgX0RWQl9VU0JfSURTX0hfCisKKy8qIFZlbmRvciBJRHMgKi8KKyNkZWZpbmUgVVNCX1ZJRF9BRFNURUNICQkJCQkJMHgwNmUxCisjZGVmaW5lIFVTQl9WSURfQU5DSE9SCQkJCQkJMHgwNTQ3CisjZGVmaW5lIFVTQl9WSURfV0lERVZJRVcJCQkJCTB4MTRhYQorI2RlZmluZSBVU0JfVklEX0FWRVJNRURJQQkJCQkJMHgwN2NhCisjZGVmaW5lIFVTQl9WSURfQ09NUFJPCQkJCQkJMHgxODViCisjZGVmaW5lIFVTQl9WSURfQ09NUFJPX1VOSwkJCQkJMHgxNDVmCisjZGVmaW5lIFVTQl9WSURfQ1lQUkVTUwkJCQkJCTB4MDRiNAorI2RlZmluZSBVU0JfVklEX0RJQkNPTQkJCQkJCTB4MTBiOAorI2RlZmluZSBVU0JfVklEX0RWSUNPCQkJCQkJMHgwZmU5CisjZGVmaW5lIFVTQl9WSURfRU1QSUEJCQkJCQkweGViMWEKKyNkZWZpbmUgVVNCX1ZJRF9HUkFORFRFQwkJCQkJMHg1MDMyCisjZGVmaW5lIFVTQl9WSURfSEFORlRFSwkJCQkJCTB4MTVmNAorI2RlZmluZSBVU0JfVklEX0hBVVBQQVVHRQkJCQkJMHgyMDQwCisjZGVmaW5lIFVTQl9WSURfSFlQRVJfUEFMVEVLCQkJCTB4MTAyNQorI2RlZmluZSBVU0JfVklEX0tZRQkJCQkJCQkweDA0NTgKKyNkZWZpbmUgVVNCX1ZJRF9NRURJT04JCQkJCQkweDE2NjAKKyNkZWZpbmUgVVNCX1ZJRF9WSVNJT05QTFVTCQkJCQkweDEzZDMKKyNkZWZpbmUgVVNCX1ZJRF9UV0lOSEFOCQkJCQkJMHgxODIyCisjZGVmaW5lIFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMJCQkweDA1ZDgKKworLyogUHJvZHVjdCBJRHMgKi8KKyNkZWZpbmUgVVNCX1BJRF9BRFNURUNIX1VTQjJfQ09MRAkJCTB4YTMzMworI2RlZmluZSBVU0JfUElEX0FEU1RFQ0hfVVNCMl9XQVJNCQkJMHhhMzM0CisjZGVmaW5lIFVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCX0NPTEQJCTB4MDAwMQorI2RlZmluZSBVU0JfUElEX0FWRVJNRURJQV9EVkJUX1VTQl9XQVJNCQkweDAwMDIKKyNkZWZpbmUgVVNCX1BJRF9BVkVSTUVESUFfRFZCVF9VU0IyX0NPTEQJMHhhODAwCisjZGVmaW5lIFVTQl9QSURfQVZFUk1FRElBX0RWQlRfVVNCMl9XQVJNCTB4YTgwMQorI2RlZmluZSBVU0JfUElEX0NPTVBST19EVkJVMjAwMF9DT0xECQkweGQwMDAKKyNkZWZpbmUgVVNCX1BJRF9DT01QUk9fRFZCVTIwMDBfV0FSTQkJMHhkMDAxCisjZGVmaW5lIFVTQl9QSURfQ09NUFJPX0RWQlUyMDAwX1VOS19DT0xECTB4MDEwYworI2RlZmluZSBVU0JfUElEX0NPTVBST19EVkJVMjAwMF9VTktfV0FSTQkweDAxMGQKKyNkZWZpbmUgVVNCX1BJRF9ESUJDT01fTU9EMzAwMF9DT0xECQkJMHgwYmI4CisjZGVmaW5lIFVTQl9QSURfRElCQ09NX01PRDMwMDBfV0FSTQkJCTB4MGJiOQorI2RlZmluZSBVU0JfUElEX0RJQkNPTV9NT0QzMDAxX0NPTEQJCQkweDBiYzYKKyNkZWZpbmUgVVNCX1BJRF9ESUJDT01fTU9EMzAwMV9XQVJNCQkJMHgwYmM3CisjZGVmaW5lIFVTQl9QSURfRElCQ09NX0FOQ0hPUl8yMTM1X0NPTEQJCTB4MjEzMQorI2RlZmluZSBVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX0NPTEQJCTB4MGZhMAorI2RlZmluZSBVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX1dBUk0JCTB4MGZhMQorI2RlZmluZSBVU0JfUElEX0tXT1JMRF9WU1RSRUFNX0NPTEQJCQkweDE3ZGUKKyNkZWZpbmUgVVNCX1BJRF9LV09STERfVlNUUkVBTV9XQVJNCQkJMHgxN2RmCisjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDFfQ09MRAkJCTB4MzIwMQorI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDQxX1dBUk0JCQkweDMyMDIKKyNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzA0NV9DT0xECQkJMHgzMjA1CisjZGVmaW5lIFVTQl9QSURfVFdJTkhBTl9WUDcwNDVfV0FSTQkJCTB4MzIwNgorI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfQ09MRAkJCTB4MzIyMworI2RlZmluZSBVU0JfUElEX0ROVFZfVElOWVVTQjJfV0FSTQkJCTB4MzIyNAorI2RlZmluZSBVU0JfUElEX1RXSU5IQU5fVlA3MDIxX0NPTEQJCQkweDMyMDcKKyNkZWZpbmUgVVNCX1BJRF9UV0lOSEFOX1ZQNzAyMV9XQVJNCQkJMHgzMjA4CisjZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX0NPTEQJCQkweDgxMDUKKyNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfV0FSTQkJCTB4ODEwNgorI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9BTjIyMzVfQ09MRAkweDgxMDcKKyNkZWZpbmUgVVNCX1BJRF9VTFRJTUFfVFZCT1hfQU4yMjM1X1dBUk0JMHg4MTA4CisjZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX0FOQ0hPUl9DT0xECTB4MjIzNQorI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9VU0IyX0NPTEQJCTB4ODEwOQorI2RlZmluZSBVU0JfUElEX1VMVElNQV9UVkJPWF9VU0IyX0ZYX0NPTEQJMHg4NjEzCisjZGVmaW5lIFVTQl9QSURfVUxUSU1BX1RWQk9YX1VTQjJfRlhfV0FSTQkweDEwMDIKKyNkZWZpbmUgVVNCX1BJRF9VTktfSFlQRVJfUEFMVEVLX0NPTEQJCTB4MDA1ZQorI2RlZmluZSBVU0JfUElEX1VOS19IWVBFUl9QQUxURUtfV0FSTQkJMHgwMDVmCisjZGVmaW5lIFVTQl9QSURfSEFORlRFS19VTVRfMDEwX0NPTEQJCTB4MDAwMQorI2RlZmluZSBVU0JfUElEX0hBTkZURUtfVU1UXzAxMF9XQVJNCQkweDAwMTUKKyNkZWZpbmUgVVNCX1BJRF9EVFQyMDBVX0NPTEQJCQkJMHgwMjAxCisjZGVmaW5lIFVTQl9QSURfRFRUMjAwVV9XQVJNCQkJCTB4MDMwMQorI2RlZmluZSBVU0JfUElEX1dUMjIwVV9DT0xECQkJCQkweDAyMjIKKyNkZWZpbmUgVVNCX1BJRF9XVDIyMFVfV0FSTQkJCQkJMHgwMjIxCisjZGVmaW5lIFVTQl9QSURfV0lOVFZfTk9WQV9UX1VTQjJfQ09MRAkJMHg5MzAwCisjZGVmaW5lIFVTQl9QSURfV0lOVFZfTk9WQV9UX1VTQjJfV0FSTQkJMHg5MzAxCisjZGVmaW5lIFVTQl9QSURfTkVCVUxBX0RJR0lUVgkJCQkweDAyMDEKKyNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9MR1oyMDEJCTB4ZGIwMAorI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX1RINzU3OQkJMHhkYjEwCisjZGVmaW5lIFVTQl9QSURfRFZJQ09fQkxVRUJJUkRfTEdEVAkJCTB4ZDgyMAorI2RlZmluZSBVU0JfUElEX0RWSUNPX0JMVUVCSVJEX0xHWjIwMV8xCQkweGRiMDEKKyNkZWZpbmUgVVNCX1BJRF9EVklDT19CTFVFQklSRF9USDc1NzlfMgkJMHhkYjExCisjZGVmaW5lIFVTQl9QSURfTUVESU9OX01EOTU3MDAJCQkJMHgwOTMyCisjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX0NPTEQJCQkJMHg3MDFlCisjZGVmaW5lIFVTQl9QSURfS1lFX0RWQl9UX1dBUk0JCQkJMHg3MDFmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWluaXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmMGMwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pbml0LmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBEVkIgVVNCIGxpYnJhcnkgLSBwcm92aWRlcyBhIGdlbmVyaWMgaW50ZXJmYWNlIGZvciBhIERWQiBVU0IgZGV2aWNlIGRyaXZlci4KKyAqCisgKiBkdmItdXNiLWluaXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZHZiLXVzYi1jb21tb24uaCIKKworLyogZGVidWcgKi8KK2ludCBkdmJfdXNiX2RlYnVnOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGR2Yl91c2JfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLHhmZXI9MixwbGw9NCx0cz04LGVycj0xNixyYz0zMixmdz02NCAob3ItYWJsZSkpLiIgRFZCX1VTQl9ERUJVR19TVEFUVVMpOworCitpbnQgZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9yY19wb2xsaW5nLCBkdmJfdXNiX2Rpc2FibGVfcmNfcG9sbGluZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzYWJsZV9yY19wb2xsaW5nLCAiZGlzYWJsZSByZW1vdGUgY29udHJvbCBwb2xsaW5nIChkZWZhdWx0OiAwKS4iKTsKKworLyogZ2VuZXJhbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKi8KK2ludCBkdmJfdXNiX2V4aXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWRlYl9pbmZvKCJzdGF0ZSBiZWZvcmUgZXhpdGluZyBldmVyeXRoaW5nOiAleFxuIixkLT5zdGF0ZSk7CisJZHZiX3VzYl9yZW1vdGVfZXhpdChkKTsKKwlkdmJfdXNiX2ZlX2V4aXQoZCk7CisJZHZiX3VzYl9pMmNfZXhpdChkKTsKKwlkdmJfdXNiX2R2Yl9leGl0KGQpOworCWR2Yl91c2JfdXJiX2V4aXQoZCk7CisJZGViX2luZm8oInN0YXRlIHNob3VsZCBiZSB6ZXJvIG5vdzogJXhcbiIsZC0+c3RhdGUpOworCWQtPnN0YXRlID0gRFZCX1VTQl9TVEFURV9JTklUOworCWtmcmVlKGQtPnByaXYpOworCWtmcmVlKGQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl91c2JfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaW50IHJldCA9IDA7CisKKwlzZW1hX2luaXQoJmQtPnVzYl9zZW0sIDEpOworCXNlbWFfaW5pdCgmZC0+aTJjX3NlbSwgMSk7CisKKwlkLT5zdGF0ZSA9IERWQl9VU0JfU1RBVEVfSU5JVDsKKworLyogY2hlY2sgdGhlIGNhcGFiaWxpdGVzIGFuZCBzZXQgYXBwcm9wcmlhdGUgdmFyaWFibGVzICovCisKKy8qIHNwZWVkIC0gd2hlbiBydW5uaW5nIGF0IEZVTEwgc3BlZWQgd2UgbmVlZCBhIEhXIFBJRCBmaWx0ZXIgKi8KKwlpZiAoZC0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwgJiYgIShkLT5wcm9wcy5jYXBzICYgRFZCX1VTQl9IQVNfUElEX0ZJTFRFUikpIHsKKwkJZXJyKCJUaGlzIFVTQjIuMCBkZXZpY2UgY2Fubm90IGJlIHJ1biBvbiBhIFVTQjEuMSBwb3J0LiAoaXQgbGFja3MgYSBoYXJkd2FyZSBQSUQgZmlsdGVyKSIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGQtPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMICYmIGQtPnByb3BzLmNhcHMgJiBEVkJfVVNCX0hBU19QSURfRklMVEVSKSB8fAorCQkoZC0+cHJvcHMuY2FwcyAmIERWQl9VU0JfTkVFRF9QSURfRklMVEVSSU5HKSkgeworCQlpbmZvKCJ3aWxsIHVzZSB0aGUgZGV2aWNlJ3MgaGFyZHdhcmUgUElEIGZpbHRlciAodGFibGUgY291bnQ6ICVkKS4iLGQtPnByb3BzLnBpZF9maWx0ZXJfY291bnQpOworCQlkLT5waWRfZmlsdGVyaW5nID0gMTsKKwkJZC0+bWF4X2ZlZWRfY291bnQgPSBkLT5wcm9wcy5waWRfZmlsdGVyX2NvdW50OworCX0gZWxzZSB7CisJCWluZm8oIndpbGwgcGFzcyB0aGUgY29tcGxldGUgTVBFRzIgdHJhbnNwb3J0IHN0cmVhbSB0byB0aGUgc29mdHdhcmUgZGVtdXhlci4iKTsKKwkJZC0+cGlkX2ZpbHRlcmluZyA9IDA7CisJCWQtPm1heF9mZWVkX2NvdW50ID0gMjU1OworCX0KKworCWlmIChkLT5wcm9wcy5wb3dlcl9jdHJsKQorCQlkLT5wcm9wcy5wb3dlcl9jdHJsKGQsMSk7CisKKwlpZiAoKHJldCA9IGR2Yl91c2JfdXJiX2luaXQoZCkpIHx8CisJCShyZXQgPSBkdmJfdXNiX2R2Yl9pbml0KGQpKSB8fAorCQkocmV0ID0gZHZiX3VzYl9pMmNfaW5pdChkKSkgfHwKKwkJKHJldCA9IGR2Yl91c2JfZmVfaW5pdChkKSkpIHsKKwkJZHZiX3VzYl9leGl0KGQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICgocmV0ID0gZHZiX3VzYl9yZW1vdGVfaW5pdChkKSkpCisJCWVycigiY291bGQgbm90IGluaXRpYWxpemUgcmVtb3RlIGNvbnRyb2wuIik7CisKKwlpZiAoZC0+cHJvcHMucG93ZXJfY3RybCkKKwkJZC0+cHJvcHMucG93ZXJfY3RybChkLDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRldGVybWluZSB0aGUgbmFtZSBhbmQgdGhlIHN0YXRlIG9mIHRoZSBqdXN0IGZvdW5kIFVTQiBkZXZpY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKiBkdmJfdXNiX2ZpbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgKnByb3BzLCBpbnQgKmNvbGQpCit7CisJaW50IGksajsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKmRlc2MgPSBOVUxMOworCSpjb2xkID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHMtPm51bV9kZXZpY2VfZGVzY3M7IGkrKykgeworCisJCWZvciAoaiA9IDA7IGogPCBEVkJfVVNCX0lEX01BWF9OVU0gJiYgcHJvcHMtPmRldmljZXNbaV0uY29sZF9pZHNbal0gIT0gTlVMTDsgaisrKSB7CisJCQlkZWJfaW5mbygiY2hlY2sgZm9yIGNvbGQgJXggJXhcbiIscHJvcHMtPmRldmljZXNbaV0uY29sZF9pZHNbal0tPmlkVmVuZG9yLCBwcm9wcy0+ZGV2aWNlc1tpXS5jb2xkX2lkc1tqXS0+aWRQcm9kdWN0KTsKKwkJCWlmIChwcm9wcy0+ZGV2aWNlc1tpXS5jb2xkX2lkc1tqXS0+aWRWZW5kb3IgID09IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICYmCisJCQkJcHJvcHMtPmRldmljZXNbaV0uY29sZF9pZHNbal0tPmlkUHJvZHVjdCA9PSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKKwkJCQkqY29sZCA9IDE7CisJCQkJZGVzYyA9ICZwcm9wcy0+ZGV2aWNlc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChkZXNjICE9IE5VTEwpCisJCQlicmVhazsKKworCQlmb3IgKGogPSAwOyBqIDwgRFZCX1VTQl9JRF9NQVhfTlVNICYmIHByb3BzLT5kZXZpY2VzW2ldLndhcm1faWRzW2pdICE9IE5VTEw7IGorKykgeworCQkJZGViX2luZm8oImNoZWNrIGZvciB3YXJtICV4ICV4XG4iLHByb3BzLT5kZXZpY2VzW2ldLndhcm1faWRzW2pdLT5pZFZlbmRvciwgcHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkUHJvZHVjdCk7CisJCQlpZiAocHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkVmVuZG9yID09IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpICYmCisJCQkJcHJvcHMtPmRldmljZXNbaV0ud2FybV9pZHNbal0tPmlkUHJvZHVjdCA9PSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKKwkJCQkqY29sZCA9IDA7CisJCQkJZGVzYyA9ICZwcm9wcy0+ZGV2aWNlc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChkZXNjICE9IE5VTEwgJiYgcHJvcHMtPmlkZW50aWZ5X3N0YXRlICE9IE5VTEwpCisJCXByb3BzLT5pZGVudGlmeV9zdGF0ZSh1ZGV2LHByb3BzLCZkZXNjLGNvbGQpOworCisJcmV0dXJuIGRlc2M7Cit9CisKKy8qCisgKiBVU0IKKyAqLworaW50IGR2Yl91c2JfZGV2aWNlX2luaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgKnByb3BzLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gTlVMTDsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKmRlc2MgPSBOVUxMOworCisJaW50IHJldCA9IC1FTk9NRU0sY29sZD0wOworCisJaWYgKChkZXNjID0gZHZiX3VzYl9maW5kX2RldmljZSh1ZGV2LHByb3BzLCZjb2xkKSkgPT0gTlVMTCkgeworCQlkZWJfZXJyKCJzb21ldGhpbmcgd2VudCB2ZXJ5IHdyb25nLCBkZXZpY2Ugd2FzIG5vdCBmb3VuZCBpbiBjdXJyZW50IGRldmljZSBsaXN0IC0gbGV0J3Mgc2VlIHdoYXQgY29tZXMgbmV4dC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY29sZCkgeworCQlpbmZvKCJmb3VuZCBhICclcycgaW4gY29sZCBzdGF0ZSwgd2lsbCB0cnkgdG8gbG9hZCBhIGZpcm13YXJlIixkZXNjLT5uYW1lKTsKKwkJcmV0ID0gdXNiX2N5cHJlc3NfbG9hZF9maXJtd2FyZSh1ZGV2LHByb3BzLT5maXJtd2FyZSxwcm9wcy0+dXNiX2N0cmwpOworCX0gZWxzZSB7CisJCWluZm8oImZvdW5kIGEgJyVzJyBpbiB3YXJtIHN0YXRlLiIsZGVzYy0+bmFtZSk7CisJCWQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UpLEdGUF9LRVJORUwpOworCQlpZiAoZCA9PSBOVUxMKSB7CisJCQllcnIoIm5vIG1lbW9yeSBmb3IgJ3N0cnVjdCBkdmJfdXNiX2RldmljZSciKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbWVtc2V0KGQsMCxzaXplb2Yoc3RydWN0IGR2Yl91c2JfZGV2aWNlKSk7CisKKwkJZC0+dWRldiA9IHVkZXY7CisJCW1lbWNweSgmZC0+cHJvcHMscHJvcHMsc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMpKTsKKwkJZC0+ZGVzYyA9IGRlc2M7CisJCWQtPm93bmVyID0gb3duZXI7CisKKwkJaWYgKGQtPnByb3BzLnNpemVfb2ZfcHJpdiA+IDApIHsKKwkJCWQtPnByaXYgPSBrbWFsbG9jKGQtPnByb3BzLnNpemVfb2ZfcHJpdixHRlBfS0VSTkVMKTsKKwkJCWlmIChkLT5wcml2ID09IE5VTEwpIHsKKwkJCQllcnIoIm5vIG1lbW9yeSBmb3IgcHJpdiBpbiAnc3RydWN0IGR2Yl91c2JfZGV2aWNlJyIpOworCQkJCWtmcmVlKGQpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbWVtc2V0KGQtPnByaXYsMCxkLT5wcm9wcy5zaXplX29mX3ByaXYpOworCQl9CisKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBkKTsKKworCQlyZXQgPSBkdmJfdXNiX2luaXQoZCk7CisJfQorCisJaWYgKHJldCA9PSAwKQorCQlpbmZvKCIlcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIGNvbm5lY3RlZC4iLGRlc2MtPm5hbWUpOworCWVsc2UKKwkJaW5mbygiJXMgZXJyb3Igd2hpbGUgbG9hZGluZyBkcml2ZXIgKCVkKSIsZGVzYy0+bmFtZSxyZXQpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl91c2JfZGV2aWNlX2luaXQpOworCit2b2lkIGR2Yl91c2JfZGV2aWNlX2V4aXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwljb25zdCBjaGFyICpuYW1lID0gImdlbmVyaWMgRFZCLVVTQiBtb2R1bGUiOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLE5VTEwpOworCWlmIChkICE9IE5VTEwgJiYgZC0+ZGVzYyAhPSBOVUxMKSB7CisJCW5hbWUgPSBkLT5kZXNjLT5uYW1lOworCQlkdmJfdXNiX2V4aXQoZCk7CisJfQorCWluZm8oIiVzIHN1Y2Nlc3NmdWxseSBkZWluaXRpYWxpemVkIGFuZCBkaXNjb25uZWN0ZWQuIixuYW1lKTsKKworfQorRVhQT1JUX1NZTUJPTChkdmJfdXNiX2RldmljZV9leGl0KTsKKworLyogbW9kdWxlIHN0dWZmICovCitzdGF0aWMgaW50IF9faW5pdCBkdmJfdXNiX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkdmJfdXNiX21vZHVsZV9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0IChkdmJfdXNiX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0IChkdmJfdXNiX21vZHVsZV9leGl0KTsKKworTU9EVUxFX1ZFUlNJT04oIjAuMyIpOworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkEgbGlicmFyeSBtb2R1bGUgY29udGFpbmluZyBjb21tb25seSB1c2VkIFVTQiBhbmQgRFZCIGZ1bmN0aW9uIFVTQiBEVkIgZGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXJlbW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzgwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItcmVtb3RlLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qIGR2Yi11c2ItcmVtb3RlLmMgaXMgcGFydCBvZiB0aGUgRFZCIFVTQiBsaWJyYXJ5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICogc2VlIGR2Yi11c2ItaW5pdC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIHRoZSB0aGUgaW5wdXQtZGV2aWNlIGFuZCBmb3IgaGFuZGxpbmcgcmVtb3RlLWNvbnRyb2wtcXVlcmllcy4KKyAqLworI2luY2x1ZGUgImR2Yi11c2ItY29tbW9uLmgiCisKKy8qIFJlbW90ZS1jb250cm9sIHBvbGwgZnVuY3Rpb24gLSBjYWxsZWQgZXZlcnkgZGliLT5yY19xdWVyeV9pbnRlcnZhbCBtcyB0byBzZWUKKyAqIHdoZXRoZXIgdGhlIHJlbW90ZSBjb250cm9sIGhhcyByZWNlaXZlZCBhbnl0aGluZy4KKyAqCisgKiBUT0RPOiBGaXggdGhlIHJlcGVhdCByYXRlIG9mIHRoZSBpbnB1dCBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGR2Yl91c2JfcmVhZF9yZW1vdGVfY29udHJvbCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGRhdGE7CisJdTMyIGV2ZW50OworCWludCBzdGF0ZTsKKworCS8qIFRPRE86IG5lZWQgYSBsb2NrIGhlcmUuICBXZSBjYW4gc2ltcGx5IHNraXAgY2hlY2tpbmcgZm9yIHRoZSByZW1vdGUgY29udHJvbAorCSAgIGlmIHdlJ3JlIGJ1c3kuICovCisKKwkvKiB3aGVuIHRoZSBwYXJhbWV0ZXIgaGFzIGJlZW4gc2V0IHRvIDEgdmlhIHN5c2ZzIHdoaWxlIHRoZSBkcml2ZXIgd2FzIHJ1bm5pbmcgKi8KKwlpZiAoZHZiX3VzYl9kaXNhYmxlX3JjX3BvbGxpbmcpCisJCXJldHVybjsKKworCWlmIChkLT5wcm9wcy5yY19xdWVyeShkLCZldmVudCwmc3RhdGUpKSB7CisJCWVycigiZXJyb3Igd2hpbGUgcXVlcnlpbmcgZm9yIGFuIHJlbW90ZSBjb250cm9sIGV2ZW50LiIpOworCQlnb3RvIHNjaGVkdWxlOworCX0KKworCisJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFJFTU9URV9OT19LRVlfUFJFU1NFRDoKKwkJCWJyZWFrOworCQljYXNlIFJFTU9URV9LRVlfUFJFU1NFRDoKKwkJCWRlYl9yYygia2V5IHByZXNzZWRcbiIpOworCQkJZC0+bGFzdF9ldmVudCA9IGV2ZW50OworCQljYXNlIFJFTU9URV9LRVlfUkVQRUFUOgorCQkJZGViX3JjKCJrZXkgcmVwZWF0ZWRcbiIpOworCQkJaW5wdXRfZXZlbnQoJmQtPnJjX2lucHV0X2RldiwgRVZfS0VZLCBkLT5sYXN0X2V2ZW50LCAxKTsKKwkJCWlucHV0X2V2ZW50KCZkLT5yY19pbnB1dF9kZXYsIEVWX0tFWSwgZC0+bGFzdF9ldmVudCwgMCk7CisJCQlpbnB1dF9zeW5jKCZkLT5yY19pbnB1dF9kZXYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisKKy8qIGltcHJvdmVkIHJlcGVhdCBoYW5kbGluZyA/Pz8KKwlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgUkVNT1RFX05PX0tFWV9QUkVTU0VEOgorCQkJZGViX3JjKCJOTyBLRVkgUFJFU1NFRFxuIik7CisJCQlpZiAoZC0+bGFzdF9zdGF0ZSAhPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQpIHsKKwkJCQlkZWJfcmMoInJlbGVhc2luZyBldmVudCAlZFxuIixkLT5sYXN0X2V2ZW50KTsKKwkJCQlpbnB1dF9ldmVudCgmZC0+cmNfaW5wdXRfZGV2LCBFVl9LRVksIGQtPmxhc3RfZXZlbnQsIDApOworCQkJCWlucHV0X3N5bmMoJmQtPnJjX2lucHV0X2Rldik7CisJCQl9CisJCQlkLT5sYXN0X3N0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCQkJZC0+bGFzdF9ldmVudCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBSRU1PVEVfS0VZX1BSRVNTRUQ6CisJCQlkZWJfcmMoIktFWSBQUkVTU0VEXG4iKTsKKwkJCWRlYl9yYygicHJlc3NpbmcgZXZlbnQgJWRcbiIsZXZlbnQpOworCisJCQlpbnB1dF9ldmVudCgmZC0+cmNfaW5wdXRfZGV2LCBFVl9LRVksIGV2ZW50LCAxKTsKKwkJCWlucHV0X3N5bmMoJmQtPnJjX2lucHV0X2Rldik7CisKKwkJCWQtPmxhc3RfZXZlbnQgPSBldmVudDsKKwkJCWQtPmxhc3Rfc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7CisJCQlicmVhazsKKwkJY2FzZSBSRU1PVEVfS0VZX1JFUEVBVDoKKwkJCWRlYl9yYygiS0VZX1JFUEVBVFxuIik7CisJCQlpZiAoZC0+bGFzdF9zdGF0ZSAhPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQpIHsKKwkJCQlkZWJfcmMoInJlcGVhdGluZyBldmVudCAlZFxuIixkLT5sYXN0X2V2ZW50KTsKKwkJCQlpbnB1dF9ldmVudCgmZC0+cmNfaW5wdXRfZGV2LCBFVl9LRVksIGQtPmxhc3RfZXZlbnQsIDIpOworCQkJCWlucHV0X3N5bmMoJmQtPnJjX2lucHV0X2Rldik7CisJCQkJZC0+bGFzdF9zdGF0ZSA9IFJFTU9URV9LRVlfUkVQRUFUOworCQkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorKi8KKworc2NoZWR1bGU6CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkLT5yY19xdWVyeV93b3JrLG1zZWNzX3RvX2ppZmZpZXMoZC0+cHJvcHMucmNfaW50ZXJ2YWwpKTsKK30KKworaW50IGR2Yl91c2JfcmVtb3RlX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCBpOworCWlmIChkLT5wcm9wcy5yY19rZXlfbWFwID09IE5VTEwgfHwKKwkJZC0+cHJvcHMucmNfcXVlcnkgPT0gTlVMTCB8fAorCQlkdmJfdXNiX2Rpc2FibGVfcmNfcG9sbGluZykKKwkJcmV0dXJuIDA7CisKKwkvKiBJbml0aWFsaXNlIHRoZSByZW1vdGUtY29udHJvbCBzdHJ1Y3R1cmVzLiovCisJaW5pdF9pbnB1dF9kZXYoJmQtPnJjX2lucHV0X2Rldik7CisKKwlkLT5yY19pbnB1dF9kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlkLT5yY19pbnB1dF9kZXYua2V5Y29kZXNpemUgPSBzaXplb2YodW5zaWduZWQgY2hhcik7CisJZC0+cmNfaW5wdXRfZGV2LmtleWNvZGVtYXggPSBLRVlfTUFYOworCWQtPnJjX2lucHV0X2Rldi5uYW1lID0gIklSLXJlY2VpdmVyIGluc2lkZSBhbiBVU0IgRFZCIHJlY2VpdmVyIjsKKworCS8qIHNldCB0aGUgYml0cyBmb3IgdGhlIGtleXMgKi8KKwlkZWJfcmMoImtleSBtYXAgc2l6ZTogJWRcbiIsZC0+cHJvcHMucmNfa2V5X21hcF9zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMucmNfa2V5X21hcF9zaXplOyBpKyspIHsKKwkJZGViX3JjKCJzZXR0aW5nIGJpdCBmb3IgZXZlbnQgJWQgaXRlbSAlZFxuIixkLT5wcm9wcy5yY19rZXlfbWFwW2ldLmV2ZW50LCBpKTsKKwkJc2V0X2JpdChkLT5wcm9wcy5yY19rZXlfbWFwW2ldLmV2ZW50LCBkLT5yY19pbnB1dF9kZXYua2V5Yml0KTsKKwl9CisKKwkvKiBTdGFydCB0aGUgcmVtb3RlLWNvbnRyb2wgcG9sbGluZy4gKi8KKwlpZiAoZC0+cHJvcHMucmNfaW50ZXJ2YWwgPCA0MCkKKwkJZC0+cHJvcHMucmNfaW50ZXJ2YWwgPSAxMDA7IC8qIGRlZmF1bHQgKi8KKworCS8qIHNldHRpbmcgdGhlc2UgdHdvIHZhbHVlcyB0byBub24temVybywgd2UgaGF2ZSB0byBtYW5hZ2Uga2V5IHJlcGVhdHMgKi8KKwlkLT5yY19pbnB1dF9kZXYucmVwW1JFUF9QRVJJT0RdID0gZC0+cHJvcHMucmNfaW50ZXJ2YWw7CisJZC0+cmNfaW5wdXRfZGV2LnJlcFtSRVBfREVMQVldICA9IGQtPnByb3BzLnJjX2ludGVydmFsICsgMTUwOworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZkLT5yY19pbnB1dF9kZXYpOworCisJSU5JVF9XT1JLKCZkLT5yY19xdWVyeV93b3JrLCBkdmJfdXNiX3JlYWRfcmVtb3RlX2NvbnRyb2wsIGQpOworCisJaW5mbygic2NoZWR1bGUgcmVtb3RlIHF1ZXJ5IGludGVydmFsIHRvICVkIG1zZWNzLiIsZC0+cHJvcHMucmNfaW50ZXJ2YWwpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZC0+cmNfcXVlcnlfd29yayxtc2Vjc190b19qaWZmaWVzKGQtPnByb3BzLnJjX2ludGVydmFsKSk7CisKKwlkLT5zdGF0ZSB8PSBEVkJfVVNCX1NUQVRFX1JFTU9URTsKKworCXJldHVybiAwOworfQorCitpbnQgZHZiX3VzYl9yZW1vdGVfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9SRU1PVEUpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZC0+cmNfcXVlcnlfd29yayk7CisJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZkLT5yY19pbnB1dF9kZXYpOworCX0KKwlkLT5zdGF0ZSAmPSB+RFZCX1VTQl9TVEFURV9SRU1PVEU7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRFZCX1VTQl9SQ19ORUNfRU1QVFkgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFZCX1VTQl9SQ19ORUNfS0VZX1BSRVNTRUQgICAgIDB4MDEKKyNkZWZpbmUgRFZCX1VTQl9SQ19ORUNfS0VZX1JFUEVBVEVEICAgIDB4MDIKK2ludCBkdmJfdXNiX25lY19yY19rZXlfdG9fZXZlbnQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLAorCQl1OCBrZXlidWZbNV0sIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCit7CisJaW50IGk7CisJc3RydWN0IGR2Yl91c2JfcmNfa2V5ICprZXltYXAgPSBkLT5wcm9wcy5yY19rZXlfbWFwOworCSpldmVudCA9IDA7CisJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCXN3aXRjaCAoa2V5YnVmWzBdKSB7CisJCWNhc2UgRFZCX1VTQl9SQ19ORUNfRU1QVFk6CisJCQlicmVhazsKKwkJY2FzZSBEVkJfVVNCX1JDX05FQ19LRVlfUFJFU1NFRDoKKwkJCWlmICgodTgpIH5rZXlidWZbMV0gIT0ga2V5YnVmWzJdIHx8CisJCQkJKHU4KSB+a2V5YnVmWzNdICE9IGtleWJ1Zls0XSkgeworCQkJCWRlYl9lcnIoInJlbW90ZSBjb250cm9sIGNoZWNrc3VtIGZhaWxlZC5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU2VlIGlmIHdlIGNhbiBtYXRjaCB0aGUgcmF3IGtleSBjb2RlLiAqLworCQkJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQorCQkJCWlmIChrZXltYXBbaV0uY3VzdG9tID09IGtleWJ1ZlsxXSAmJgorCQkJCQlrZXltYXBbaV0uZGF0YSA9PSBrZXlidWZbM10pIHsKKwkJCQkJKmV2ZW50ID0ga2V5bWFwW2ldLmV2ZW50OworCQkJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWRlYl9lcnIoImtleSBtYXBwaW5nIGZhaWxlZCAtIG5vIGFwcHJvcHJpYXRlIGtleSBmb3VuZCBpbiBrZXltYXBwaW5nXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIERWQl9VU0JfUkNfTkVDX0tFWV9SRVBFQVRFRDoKKwkJCSpzdGF0ZSA9IFJFTU9URV9LRVlfUkVQRUFUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZWJfZXJyKCJ1bmtvd24gdHlwZSBvZiByZW1vdGUgc3RhdHVzOiAlZFxuIixrZXlidWZbMF0pOworCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkdmJfdXNiX25lY19yY19rZXlfdG9fZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1Nzk5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qIGR2Yi11c2ItdXJiLmMgaXMgcGFydCBvZiB0aGUgRFZCIFVTQiBsaWJyYXJ5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICogc2VlIGR2Yi11c2ItaW5pdC5jIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBoYW5kbGluZyB0aGUKKyAqIFVTQiBhbmQgVVJCIHN0dWZmLgorICovCisjaW5jbHVkZSAiZHZiLXVzYi1jb21tb24uaCIKKworaW50IGR2Yl91c2JfZ2VuZXJpY19ydyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4ICp3YnVmLCB1MTYgd2xlbiwgdTggKnJidWYsCisJdTE2IHJsZW4sIGludCBkZWxheV9tcykKK3sKKwlpbnQgYWN0bGVuLHJldCA9IC1FTk9NRU07CisKKwlpZiAoZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPT0gMCkgeworCQllcnIoImVuZHBvaW50IGZvciBnZW5lcmljIGNvbnRyb2wgbm90IHNwZWNpZmllZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdidWYgPT0gTlVMTCB8fCB3bGVuID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmQtPnVzYl9zZW0pKSkKKwkJcmV0dXJuIHJldDsKKworCWRlYl94ZmVyKCI+Pj4gIik7CisJZGVidWdfZHVtcCh3YnVmLHdsZW4sZGViX3hmZXIpOworCisJcmV0ID0gdXNiX2J1bGtfbXNnKGQtPnVkZXYsdXNiX3NuZGJ1bGtwaXBlKGQtPnVkZXYsCisJCQlkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCksIHdidWYsd2xlbiwmYWN0bGVuLAorCQkJMjAwMCk7CisKKwlpZiAocmV0KQorCQllcnIoImJ1bGsgbWVzc2FnZSBmYWlsZWQ6ICVkICglZC8lZCkiLHJldCx3bGVuLGFjdGxlbik7CisJZWxzZQorCQlyZXQgPSBhY3RsZW4gIT0gd2xlbiA/IC0xIDogMDsKKworCS8qIGFuIGFuc3dlciBpcyBleHBlY3RlZCwgYW5kIG5vIGVycm9yIGJlZm9yZSAqLworCWlmICghcmV0ICYmIHJidWYgJiYgcmxlbikgeworCQlpZiAoZGVsYXlfbXMpCisJCQltc2xlZXAoZGVsYXlfbXMpOworCisJCXJldCA9IHVzYl9idWxrX21zZyhkLT51ZGV2LHVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LAorCQkJCWQtPnByb3BzLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50KSxyYnVmLHJsZW4sJmFjdGxlbiwKKwkJCQkyMDAwKTsKKworCQlpZiAocmV0KQorCQkJZXJyKCJyZWN2IGJ1bGsgbWVzc2FnZSBmYWlsZWQ6ICVkIixyZXQpOworCQllbHNlIHsKKwkJCWRlYl94ZmVyKCI8PDwgIik7CisJCQlkZWJ1Z19kdW1wKHJidWYsYWN0bGVuLGRlYl94ZmVyKTsKKwkJfQorCX0KKworCXVwKCZkLT51c2Jfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkdmJfdXNiX2dlbmVyaWNfcncpOworCitpbnQgZHZiX3VzYl9nZW5lcmljX3dyaXRlKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggKmJ1ZiwgdTE2IGxlbikKK3sKKwlyZXR1cm4gZHZiX3VzYl9nZW5lcmljX3J3KGQsYnVmLGxlbixOVUxMLDAsMCk7Cit9CitFWFBPUlRfU1lNQk9MKGR2Yl91c2JfZ2VuZXJpY193cml0ZSk7CisKKworLyogVVJCIHN0dWZmIGZvciBzdHJlYW1pbmcgKi8KK3N0YXRpYyB2b2lkIGR2Yl91c2JfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1cmItPmNvbnRleHQ7CisJaW50IHB0eXBlID0gdXNiX3BpcGV0eXBlKHVyYi0+cGlwZSk7CisJaW50IGk7CisJdTggKmI7CisKKwlkZWJfdHMoIiclcycgdXJiIGNvbXBsZXRlZC4gZmVlZGNvdW50OiAlZCwgc3RhdHVzOiAlZCwgbGVuZ3RoOiAlZC8lZCwgcGFja19udW06ICVkLCBlcnJvcnM6ICVkXG4iLAorCQkJcHR5cGUgPT0gUElQRV9JU09DSFJPTk9VUyA/ICJpc29jIiA6ICJidWxrIiwgZC0+ZmVlZGNvdW50LAorCQkJdXJiLT5zdGF0dXMsdXJiLT5hY3R1YWxfbGVuZ3RoLHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMsdXJiLT5lcnJvcl9jb3VudCk7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJCWNhc2UgMDogICAgICAgICAvKiBzdWNjZXNzICovCisJCWNhc2UgLUVUSU1FRE9VVDogICAgLyogTkFLICovCisJCQlicmVhazsKKwkJY2FzZSAtRUNPTk5SRVNFVDogICAvKiBraWxsICovCisJCWNhc2UgLUVOT0VOVDoKKwkJY2FzZSAtRVNIVVRET1dOOgorCQkJcmV0dXJuOworCQlkZWZhdWx0OiAgICAgICAgLyogZXJyb3IgKi8KKwkJCWRlYl90cygidXJiIGNvbXBsZXRpdGlvbiBlcnJvciAlZC4iLCB1cmItPnN0YXR1cyk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoZC0+ZmVlZGNvdW50ID4gMCkgeworCQlpZiAoZC0+c3RhdGUgJiBEVkJfVVNCX1NUQVRFX0RWQikgeworCQkJc3dpdGNoIChwdHlwZSkgeworCQkJCWNhc2UgUElQRV9JU09DSFJPTk9VUzoKKwkJCQkJYiA9ICh1OCAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJCQkJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7IGkrKykgeworCQkJCQkJaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzICE9IDApCisJCQkJCQkJZGViX3RzKCJpc28gZnJhbWUgZGVzY3JpcHRvciBoYXMgYW4gZXJyb3I6ICVkXG4iLHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKKwkJCQkJCWVsc2UgaWYgKHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCA+IDApIHsKKwkJCQkJCQkJZHZiX2RteF9zd2ZpbHRlcigmZC0+ZGVtdXgsYiArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0LAorCQkJCQkJCQkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCk7CisJCQkJCQkJfQorCQkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPSAwOworCQkJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJCQkJfQorCQkJCQlkZWJ1Z19kdW1wKGIsMjAsZGViX3RzKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQSVBFX0JVTEs6CisJCQkJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKQorCQkJCQkJZHZiX2RteF9zd2ZpbHRlcigmZC0+ZGVtdXgsICh1OCAqKSB1cmItPnRyYW5zZmVyX2J1ZmZlcix1cmItPmFjdHVhbF9sZW5ndGgpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQllcnIoInVua293biBlbmRwb2ludCB0eXBlIGluIGNvbXBsZXRpdGlvbiBoYW5kbGVyLiIpOworCQkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKwl1c2Jfc3VibWl0X3VyYih1cmIsR0ZQX0FUT01JQyk7Cit9CisKK2ludCBkdmJfdXNiX3VyYl9raWxsKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgZC0+dXJic19zdWJtaXR0ZWQ7IGkrKykgeworCQlkZWJfdHMoImtpbGxpbmcgVVJCIG5vLiAlZC5cbiIsaSk7CisKKwkJLyogc3RvcCB0aGUgVVJCICovCisJCXVzYl9raWxsX3VyYihkLT51cmJfbGlzdFtpXSk7CisJfQorCWQtPnVyYnNfc3VibWl0dGVkID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50IGR2Yl91c2JfdXJiX3N1Ym1pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaW50IGkscmV0OworCWZvciAoaSA9IDA7IGkgPCBkLT51cmJzX2luaXRpYWxpemVkOyBpKyspIHsKKwkJZGViX3RzKCJzdWJtaXR0aW5nIFVSQiBuby4gJWRcbiIsaSk7CisJCWlmICgocmV0ID0gdXNiX3N1Ym1pdF91cmIoZC0+dXJiX2xpc3RbaV0sR0ZQX0FUT01JQykpKSB7CisJCQllcnIoImNvdWxkIG5vdCBzdWJtaXQgVVJCIG5vLiAlZCAtIGdldCB0aGVtIGFsbCBiYWNrIixpKTsKKwkJCWR2Yl91c2JfdXJiX2tpbGwoZCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWQtPnVyYnNfc3VibWl0dGVkKys7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl91c2JfZnJlZV9zdHJlYW1fYnVmZmVycyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9VUkJfQlVGKSB7CisJCXdoaWxlIChkLT5idWZfbnVtKSB7CisJCQlkLT5idWZfbnVtLS07CisJCQlkZWJfbWVtKCJmcmVlaW5nIGJ1ZmZlciAlZFxuIixkLT5idWZfbnVtKTsKKwkJCXVzYl9idWZmZXJfZnJlZShkLT51ZGV2LCBkLT5idWZfc2l6ZSwKKwkJCQkJZC0+YnVmX2xpc3RbZC0+YnVmX251bV0sIGQtPmRtYV9hZGRyW2QtPmJ1Zl9udW1dKTsKKwkJfQorCQlrZnJlZShkLT5idWZfbGlzdCk7CisJCWtmcmVlKGQtPmRtYV9hZGRyKTsKKwl9CisKKwlkLT5zdGF0ZSAmPSB+RFZCX1VTQl9TVEFURV9VUkJfQlVGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHZiX3VzYl9hbGxvY2F0ZV9zdHJlYW1fYnVmZmVycyhzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIGludCBudW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlkLT5idWZfbnVtID0gMDsKKwlkLT5idWZfc2l6ZSA9IHNpemU7CisKKwlkZWJfbWVtKCJhbGwgaW4gYWxsIEkgd2lsbCB1c2UgJWx1IGJ5dGVzIGZvciBzdHJlYW1pbmdcbiIsbnVtKnNpemUpOworCisJaWYgKChkLT5idWZfbGlzdCA9IGttYWxsb2MobnVtKnNpemVvZih1OCAqKSwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKChkLT5kbWFfYWRkciA9IGttYWxsb2MobnVtKnNpemVvZihkbWFfYWRkcl90KSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJa2ZyZWUoZC0+YnVmX2xpc3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGQtPmJ1Zl9saXN0LDAsbnVtKnNpemVvZih1OCAqKSk7CisJbWVtc2V0KGQtPmRtYV9hZGRyLDAsbnVtKnNpemVvZihkbWFfYWRkcl90KSk7CisKKwlkLT5zdGF0ZSB8PSBEVkJfVVNCX1NUQVRFX1VSQl9CVUY7CisKKwlmb3IgKGQtPmJ1Zl9udW0gPSAwOyBkLT5idWZfbnVtIDwgbnVtOyBkLT5idWZfbnVtKyspIHsKKwkJZGViX21lbSgiYWxsb2NhdGluZyBidWZmZXIgJWRcbiIsZC0+YnVmX251bSk7CisJCWlmICgoIGQtPmJ1Zl9saXN0W2QtPmJ1Zl9udW1dID0KKwkJCQkJdXNiX2J1ZmZlcl9hbGxvYyhkLT51ZGV2LCBzaXplLCBTTEFCX0FUT01JQywKKwkJCQkJJmQtPmRtYV9hZGRyW2QtPmJ1Zl9udW1dKSApID09IE5VTEwpIHsKKwkJCWRlYl9tZW0oIm5vdCBlbm91Z2ggbWVtb3J5IGZvciB1cmItYnVmZmVyIGFsbG9jYXRpb24uXG4iKTsKKwkJCWR2Yl91c2JfZnJlZV9zdHJlYW1fYnVmZmVycyhkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWRlYl9tZW0oImJ1ZmZlciAlZDogJXAgKGRtYTogJWQpXG4iLGQtPmJ1Zl9udW0sZC0+YnVmX2xpc3RbZC0+YnVmX251bV0sZC0+ZG1hX2FkZHJbZC0+YnVmX251bV0pOworCQltZW1zZXQoZC0+YnVmX2xpc3RbZC0+YnVmX251bV0sMCxzaXplKTsKKwl9CisJZGViX21lbSgiYWxsb2NhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl91c2JfYnVsa191cmJfaW5pdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJaW50IGk7CisKKwlpZiAoKGkgPSBkdmJfdXNiX2FsbG9jYXRlX3N0cmVhbV9idWZmZXJzKGQsZC0+cHJvcHMudXJiLmNvdW50LAorCQkJCQlkLT5wcm9wcy51cmIudS5idWxrLmJ1ZmZlcnNpemUpKSA8IDApCisJCXJldHVybiBpOworCisJLyogYWxsb2NhdGUgdGhlIFVSQnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZC0+cHJvcHMudXJiLmNvdW50OyBpKyspIHsKKwkJaWYgKChkLT51cmJfbGlzdFtpXSA9IHVzYl9hbGxvY191cmIoMCxHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXVzYl9maWxsX2J1bGtfdXJiKCBkLT51cmJfbGlzdFtpXSwgZC0+dWRldiwKKwkJCQl1c2JfcmN2YnVsa3BpcGUoZC0+dWRldixkLT5wcm9wcy51cmIuZW5kcG9pbnQpLAorCQkJCWQtPmJ1Zl9saXN0W2ldLAorCQkJCWQtPnByb3BzLnVyYi51LmJ1bGsuYnVmZmVyc2l6ZSwKKwkJCQlkdmJfdXNiX3VyYl9jb21wbGV0ZSwgZCk7CisKKwkJZC0+dXJiX2xpc3RbaV0tPnRyYW5zZmVyX2ZsYWdzID0gMDsKKwkJZC0+dXJic19pbml0aWFsaXplZCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfdXNiX2lzb2NfdXJiX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCBpLGo7CisKKwlpZiAoKGkgPSBkdmJfdXNiX2FsbG9jYXRlX3N0cmVhbV9idWZmZXJzKGQsZC0+cHJvcHMudXJiLmNvdW50LAorCQkJCQlkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc2l6ZSpkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc3BlcnVyYikpIDwgMCkKKwkJcmV0dXJuIGk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgVVJCcyAqLworCWZvciAoaSA9IDA7IGkgPCBkLT5wcm9wcy51cmIuY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdXJiICp1cmI7CisJCWludCBmcmFtZV9vZmZzZXQgPSAwOworCQlpZiAoKGQtPnVyYl9saXN0W2ldID0KKwkJCQkJdXNiX2FsbG9jX3VyYihkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc3BlcnVyYixHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXVyYiA9IGQtPnVyYl9saXN0W2ldOworCisJCXVyYi0+ZGV2ID0gZC0+dWRldjsKKwkJdXJiLT5jb250ZXh0ID0gZDsKKwkJdXJiLT5jb21wbGV0ZSA9IGR2Yl91c2JfdXJiX2NvbXBsZXRlOworCQl1cmItPnBpcGUgPSB1c2JfcmN2aXNvY3BpcGUoZC0+dWRldixkLT5wcm9wcy51cmIuZW5kcG9pbnQpOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCXVyYi0+aW50ZXJ2YWwgPSBkLT5wcm9wcy51cmIudS5pc29jLmludGVydmFsOworCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNwZXJ1cmI7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGQtPmJ1Zl9zaXplOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IGQtPmJ1Zl9saXN0W2ldOworCQl1cmItPnRyYW5zZmVyX2RtYSA9IGQtPmRtYV9hZGRyW2ldOworCisJCWZvciAoaiA9IDA7IGogPCBkLT5wcm9wcy51cmIudS5pc29jLmZyYW1lc3BlcnVyYjsgaisrKSB7CisJCQl1cmItPmlzb19mcmFtZV9kZXNjW2pdLm9mZnNldCA9IGZyYW1lX29mZnNldDsKKwkJCXVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ubGVuZ3RoID0gZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNpemU7CisJCQlmcmFtZV9vZmZzZXQgKz0gZC0+cHJvcHMudXJiLnUuaXNvYy5mcmFtZXNpemU7CisJCX0KKworCQlkLT51cmJzX2luaXRpYWxpemVkKys7CisJfQorCXJldHVybiAwOworCit9CisKK2ludCBkdmJfdXNiX3VyYl9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwkvKgorCSAqIHdoZW4gcmVsb2FkaW5nIHRoZSBkcml2ZXIgdy9vIHJlcGx1Z2dpbmcgdGhlIGRldmljZQorCSAqIHNvbWV0aW1lcyBhIHRpbWVvdXQgb2NjdXJlcywgdGhpcyBoZWxwcworCSAqLworCWlmIChkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCAhPSAwKSB7CisJCXVzYl9jbGVhcl9oYWx0KGQtPnVkZXYsdXNiX3NuZGJ1bGtwaXBlKGQtPnVkZXYsZC0+cHJvcHMuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQpKTsKKwkJdXNiX2NsZWFyX2hhbHQoZC0+dWRldix1c2JfcmN2YnVsa3BpcGUoZC0+dWRldixkLT5wcm9wcy5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCkpOworCX0KKwl1c2JfY2xlYXJfaGFsdChkLT51ZGV2LHVzYl9yY3ZidWxrcGlwZShkLT51ZGV2LGQtPnByb3BzLnVyYi5lbmRwb2ludCkpOworCisJLyogYWxsb2NhdGUgdGhlIGFycmF5IGZvciB0aGUgZGF0YSB0cmFuc2ZlciBVUkJzICovCisJZC0+dXJiX2xpc3QgPSBrbWFsbG9jKGQtPnByb3BzLnVyYi5jb3VudCAqIHNpemVvZihzdHJ1Y3QgdXJiICopLEdGUF9LRVJORUwpOworCWlmIChkLT51cmJfbGlzdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZC0+dXJiX2xpc3QsMCxkLT5wcm9wcy51cmIuY291bnQgKiBzaXplb2Yoc3RydWN0IHVyYiAqKSk7CisJZC0+c3RhdGUgfD0gRFZCX1VTQl9TVEFURV9VUkJfTElTVDsKKworCXN3aXRjaCAoZC0+cHJvcHMudXJiLnR5cGUpIHsKKwkJY2FzZSBEVkJfVVNCX0JVTEs6CisJCQlyZXR1cm4gZHZiX3VzYl9idWxrX3VyYl9pbml0KGQpOworCQljYXNlIERWQl9VU0JfSVNPQzoKKwkJCXJldHVybiBkdmJfdXNiX2lzb2NfdXJiX2luaXQoZCk7CisJCWRlZmF1bHQ6CisJCQllcnIoInVua293biBVUkItdHlwZSBmb3IgZGF0YSB0cmFuc2Zlci4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworaW50IGR2Yl91c2JfdXJiX2V4aXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCBpOworCisJZHZiX3VzYl91cmJfa2lsbChkKTsKKworCWlmIChkLT5zdGF0ZSAmIERWQl9VU0JfU1RBVEVfVVJCX0xJU1QpIHsKKwkJZm9yIChpID0gMDsgaSA8IGQtPnVyYnNfaW5pdGlhbGl6ZWQ7IGkrKykgeworCQkJaWYgKGQtPnVyYl9saXN0W2ldICE9IE5VTEwpIHsKKwkJCQlkZWJfbWVtKCJmcmVlaW5nIFVSQiBuby4gJWQuXG4iLGkpOworCQkJCS8qIGZyZWUgdGhlIFVSQnMgKi8KKwkJCQl1c2JfZnJlZV91cmIoZC0+dXJiX2xpc3RbaV0pOworCQkJfQorCQl9CisJCWQtPnVyYnNfaW5pdGlhbGl6ZWQgPSAwOworCQkvKiBmcmVlIHRoZSB1cmIgYXJyYXkgKi8KKwkJa2ZyZWUoZC0+dXJiX2xpc3QpOworCQlkLT5zdGF0ZSAmPSB+RFZCX1VTQl9TVEFURV9VUkJfTElTVDsKKwl9CisKKwlkdmJfdXNiX2ZyZWVfc3RyZWFtX2J1ZmZlcnMoZCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDU2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaApAQCAtMCwwICsxLDMyOSBAQAorLyogZHZiLXVzYi5oIGlzIHBhcnQgb2YgdGhlIERWQiBVU0IgbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtNSBQYXRyaWNrIEJvZXR0Y2hlciAocGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZSkKKyAqIHNlZSBkdmItdXNiLWluaXQuYyBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorICoKKyAqIHRoZSBoZWFkZXJmaWxlLCBhbGwgZHZiLXVzYi1kcml2ZXJzIGhhdmUgdG8gaW5jbHVkZS4KKyAqLworI2lmbmRlZiBfX0RWQl9VU0JfSF9fCisjZGVmaW5lIF9fRFZCX1VTQl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJkdmJfZGVtdXguaCIKKyNpbmNsdWRlICJkdmJfbmV0LmgiCisjaW5jbHVkZSAiZG14ZGV2LmgiCisKKyNpbmNsdWRlICJkdmItcGxsLmgiCisKKyNpbmNsdWRlICJkdmItdXNiLWlkcy5oIgorCisvKiBkZWJ1ZyAqLworI2lmZGVmIENPTkZJR19EVkJfVVNCX0RFQlVHCisjZGVmaW5lIGRwcmludGsodmFyLGxldmVsLGFyZ3MuLi4pIFwKKwkgICAgZG8geyBpZiAoKHZhciAmIGxldmVsKSkgeyBwcmludGsoYXJncyk7IH0gfSB3aGlsZSAoMCkKKworI2RlZmluZSBkZWJ1Z19kdW1wKGIsbCxmdW5jKSB7XAorCWludCBsb29wXzsgXAorCWZvciAobG9vcF8gPSAwOyBsb29wXyA8IGw7IGxvb3BfKyspIGZ1bmMoIiUwMnggIiwgYltsb29wX10pOyBcCisJZnVuYygiXG4iKTtcCit9CisjZGVmaW5lIERWQl9VU0JfREVCVUdfU1RBVFVTCisjZWxzZQorI2RlZmluZSBkcHJpbnRrKGFyZ3MuLi4pCisjZGVmaW5lIGRlYnVnX2R1bXAoYixsLGZ1bmMpCisKKyNkZWZpbmUgRFZCX1VTQl9ERUJVR19TVEFUVVMgIiAoZGVidWdnaW5nIGlzIG5vdCBlbmFibGVkKSIKKworI2VuZGlmCisKKy8qIGdlbmVyaWMgbG9nIG1ldGhvZHMgLSB0YWtlbiBmcm9tIHVzYi5oICovCisjaWZuZGVmIERWQl9VU0JfTE9HX1BSRUZJWAorICNkZWZpbmUgRFZCX1VTQl9MT0dfUFJFRklYICJkdmItdXNiIChwbGVhc2UgZGVmaW5lIGEgbG9nIHByZWZpeCkiCisjZW5kaWYKKworI3VuZGVmIGVycgorI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgICAgIERWQl9VU0JfTE9HX1BSRUZJWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI3VuZGVmIGluZm8KKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAgICBEVkJfVVNCX0xPR19QUkVGSVggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyN1bmRlZiB3YXJuCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgRFZCX1VTQl9MT0dfUFJFRklYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisKKy8qKgorICogc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIC0gbmFtZSBhbmQgaXRzIGFjY29yZGluZyBVU0IgSURzCisgKiBAbmFtZTogcmVhbCBuYW1lIG9mIHRoZSBib3gsIHJlZ2FyZGxlc3Mgd2hpY2ggRFZCIFVTQiBkZXZpY2UgY2xhc3MgaXMgaW4gdXNlCisgKiBAY29sZF9pZHM6IGFycmF5IG9mIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdoaWNoIGRlc2NyaWJlIHRoZSBkZXZpY2UgaW4KKyAqICBwcmUtZmlybXdhcmUgc3RhdGUKKyAqIEB3YXJtX2lkczogYXJyYXkgb2Ygc3RydWN0IHVzYl9kZXZpY2VfaWQgd2hpY2ggZGVzY3JpYmUgdGhlIGRldmljZSBpbgorICogIHBvc3QtZmlybXdhcmUgc3RhdGUKKyAqCisgKiBFYWNoIERWQiBVU0IgZGV2aWNlIGNsYXNzIGNhbiBoYXZlIG9uZSBvciBtb3JlIGFjdHVhbCBkZXZpY2VzLCB0aGlzIHN0cnVjdAorICogYXNzaWducyBhIG5hbWUgdG8gaXQuCisgKi8KK3N0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKworI2RlZmluZSBEVkJfVVNCX0lEX01BWF9OVU0gMTUKKwlzdHJ1Y3QgdXNiX2RldmljZV9pZCAqY29sZF9pZHNbRFZCX1VTQl9JRF9NQVhfTlVNXTsKKwlzdHJ1Y3QgdXNiX2RldmljZV9pZCAqd2FybV9pZHNbRFZCX1VTQl9JRF9NQVhfTlVNXTsKK307CisKKy8qKgorICogc3RydWN0IGR2Yl91c2JfcmNfa2V5IC0gYSByZW1vdGUgY29udHJvbCBrZXkgYW5kIGl0cyBpbnB1dC1ldmVudAorICogQGN1c3RvbTogdGhlIHZlbmRvci9jdXN0b20gcGFydCBvZiB0aGUga2V5CisgKiBAZGF0YTogdGhlIGFjdHVhbCBrZXkgcGFydAorICogQGV2ZW50OiB0aGUgaW5wdXQgZXZlbnQgYXNzaWduZWQgdG8ga2V5IGlkZW50aWZpZWQgYnkgY3VzdG9tIGFuZCBkYXRhCisgKi8KK3N0cnVjdCBkdmJfdXNiX3JjX2tleSB7CisJdTggY3VzdG9tLGRhdGE7CisJdTMyIGV2ZW50OworfTsKKworc3RydWN0IGR2Yl91c2JfZGV2aWNlOworCisvKioKKyAqIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgLSBwcm9wZXJ0aWVzIG9mIGEgZHZiLXVzYi1kZXZpY2UKKyAqIEBjYXBzOiBjYXBhYmlsaXRlcyBvZiB0aGUgRFZCIFVTQiBkZXZpY2UuCisgKiBAcGlkX2ZpbHRlcl9jb3VudDogbnVtYmVyIG9mIFBJRCBmaWx0ZXIgcG9zaXRpb24gaW4gdGhlIG9wdGlvbmFsIGhhcmR3YXJlCisgKiAgUElELWZpbHRlci4KKyAqCisgKiBAdXNiX2N0cmw6IHdoaWNoIFVTQiBkZXZpY2Utc2lkZSBjb250cm9sbGVyIGlzIGluIHVzZS4gTmVlZGVkIGZvciBmaXJtd2FyZQorICogIGRvd25sb2FkLgorICogQGZpcm13YXJlOiBuYW1lIG9mIHRoZSBmaXJtd2FyZSBmaWxlLgorICoKKyAqIEBzaXplX29mX3ByaXY6IGhvdyBtYW55IGJ5dGVzIHNoYWxsIGJlIGFsbG9jYXRlZCBmb3IgdGhlIHByaXZhdGUgZmllbGQKKyAqICBvZiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UuCisgKgorICogQHBvd2VyX2N0cmw6IGNhbGxlZCB0byBlbmFibGUvZGlzYWJsZSBwb3dlciBvZiB0aGUgZGV2aWNlLgorICogQHN0cmVhbWluZ19jcnRsOiBjYWxsZWQgdG8gc3RhcnQgYW5kIHN0b3AgdGhlIE1QRUcyLVRTIHN0cmVhbWluZyBvZiB0aGUKKyAqICBkZXZpY2UgKG5vdCBVUkIgc3VibWl0dGluZy9raWxsaW5nKS4KKyAqIEBwaWRfZmlsdGVyX2N0cmw6IGNhbGxlZCB0byBlbi9kaXNhYmxlIHRoZSBQSUQgZmlsdGVyLCBpZiBhbnkuCisgKiBAcGlkX2ZpbHRlcjogY2FsbGVkIHRvIHNldC91bnNldCBhIFBJRCBmb3IgZmlsdGVyaW5nLgorICoKKyAqIEByZWFkX21hY19hZGRyZXNzOiBjYWxsZWQgdG8gcmVhZCB0aGUgTUFDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKyAqCisgKiBAZnJvbnRlbmRfYXR0YWNoOiBjYWxsZWQgdG8gYXR0YWNoIHRoZSBwb3NzaWJsZSBmcm9udGVuZHMgKGZpbGwgZmUtZmllbGQKKyAqICBvZiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UpLgorICogQHR1bmVyX2F0dGFjaDogY2FsbGVkIHRvIGF0dGFjaCB0aGUgY29ycmVjdCB0dW5lciBhbmQgdG8gZmlsbCBwbGxfYWRkciwKKyAqICBwbGxfZGVzYyBhbmQgcGxsX2luaXRfYnVmIG9mIHN0cnVjdCBkdmJfdXNiX2RldmljZSkuCisgKiBAaWRlbnRpZnlfc3RhdGU6IGNhbGxlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXRlIChjb2xkIG9yIHdhcm0pLCB3aGVuIGl0CisgKiAgaXMgbm90IGRpc3Rpbmd1aXNoYWJsZSBieSB0aGUgVVNCIElEcy4KKyAqCisgKiBAcmNfa2V5X21hcDogYSBoYXJkLXdpcmVkIGFycmF5IG9mIHN0cnVjdCBkdmJfdXNiX3JjX2tleSAoTlVMTCB0byBkaXNhYmxlCisgKiAgcmVtb3RlIGNvbnRyb2wgaGFuZGxpbmcpLgorICogQHJjX2tleV9tYXBfc2l6ZTogbnVtYmVyIG9mIGl0ZW1zIGluIEByY19rZXlfbWFwLgorICogQHJjX3F1ZXJ5OiBjYWxsZWQgdG8gcXVlcnkgYW4gZXZlbnQgZXZlbnQuCisgKiBAcmNfaW50ZXJ2YWw6IHRpbWUgaW4gbXMgYmV0d2VlbiB0d28gcXVlcmllcy4KKyAqCisgKiBAaTJjX2FsZ286IGkyY19hbGdvcml0aG0gaWYgdGhlIGRldmljZSBoYXMgSTJDb3ZlclVTQi4KKyAqCisgKiBAZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQ6IG1vc3Qgb2YgdGhlIERWQiBVU0IgZGV2aWNlcyBoYXZlIGEgZ2VuZXJpYworICogIGVuZHBvaW50IHdoaWNoIHJlY2VpdmVkIGNvbnRyb2wgbWVzc2FnZXMgd2l0aCBidWxrIHRyYW5zZmVycy4gV2hlbiB0aGlzCisgKiAgaXMgbm9uLXplcm8sIG9uZSBjYW4gdXNlIGR2Yl91c2JfZ2VuZXJpY19ydyBhbmQgZHZiX3VzYl9nZW5lcmljX3dyaXRlLQorICogIGhlbHBlciBmdW5jdGlvbnMuCisgKgorICogQHVyYjogZGVzY3JpYmVzIHRoZSBraW5kIG9mIFVTQiB0cmFuc2ZlciB1c2VkIGZvciBNUEVHMi1UUy1zdHJlYW1pbmcuCisgKiAgQ3VycmVudGx5IG9ubHkgQlVMSyBpcyBpbXBsZW1lbnRlZAorICoKKyAqIEBudW1fZGV2aWNlX2Rlc2NzOiBudW1iZXIgb2Ygc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIGluIEBkZXZpY2VzCisgKiBAZGV2aWNlczogYXJyYXkgb2Ygc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uIGNvbXBhdGlibGVzIHdpdGggdGhlc2UKKyAqICBwcm9wZXJ0aWVzLgorICovCitzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIHsKKworI2RlZmluZSBEVkJfVVNCX0hBU19QSURfRklMVEVSICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBEVkJfVVNCX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgMHgwMgorI2RlZmluZSBEVkJfVVNCX05FRURfUElEX0ZJTFRFUklORyAgICAgICAgICAgMHgwNAorI2RlZmluZSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSICAgICAgICAgICAgMHgwOAorCWludCBjYXBzOworCWludCBwaWRfZmlsdGVyX2NvdW50OworCisjZGVmaW5lIENZUFJFU1NfQU4yMTM1ICAwCisjZGVmaW5lIENZUFJFU1NfQU4yMjM1ICAxCisjZGVmaW5lIENZUFJFU1NfRlgyICAgICAyCisJaW50IHVzYl9jdHJsOworCWNvbnN0IGNoYXIgKmZpcm13YXJlOworCisJaW50IHNpemVfb2ZfcHJpdjsKKworCWludCAoKnBvd2VyX2N0cmwpIChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgaW50KTsKKwlpbnQgKCpzdHJlYW1pbmdfY3RybCkgKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCBpbnQpOworCWludCAoKnBpZF9maWx0ZXJfY3RybCkgKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqLCBpbnQpOworCWludCAoKnBpZF9maWx0ZXIpIChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgaW50LCB1MTYsIGludCk7CisKKwlpbnQgKCpyZWFkX21hY19hZGRyZXNzKSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHU4IFtdKTsKKwlpbnQgKCpmcm9udGVuZF9hdHRhY2gpIChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKik7CisJaW50ICgqdHVuZXJfYXR0YWNoKSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICopOworCisJaW50ICgqaWRlbnRpZnlfc3RhdGUpIChzdHJ1Y3QgdXNiX2RldmljZSAqLCBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzICosCisJCQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gKiosIGludCAqKTsKKworLyogcmVtb3RlIGNvbnRyb2wgcHJvcGVydGllcyAqLworI2RlZmluZSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQgICAgICAweDAwCisjZGVmaW5lIFJFTU9URV9LRVlfUFJFU1NFRCAgICAgICAgIDB4MDEKKyNkZWZpbmUgUkVNT1RFX0tFWV9SRVBFQVQgICAgICAgICAgMHgwMgorCXN0cnVjdCBkdmJfdXNiX3JjX2tleSAqcmNfa2V5X21hcDsKKwlpbnQgcmNfa2V5X21hcF9zaXplOworCWludCAoKnJjX3F1ZXJ5KSAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHUzMiAqLCBpbnQgKik7CisJaW50IHJjX2ludGVydmFsOworCisJc3RydWN0IGkyY19hbGdvcml0aG0gKmkyY19hbGdvOworCisJaW50IGdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50OworCisJc3RydWN0IHsKKyNkZWZpbmUgRFZCX1VTQl9CVUxLICAxCisjZGVmaW5lIERWQl9VU0JfSVNPQyAgMgorCQlpbnQgdHlwZTsKKwkJaW50IGNvdW50OworCQlpbnQgZW5kcG9pbnQ7CisKKwkJdW5pb24geworCQkJc3RydWN0IHsKKwkJCQlpbnQgYnVmZmVyc2l6ZTsgLyogcGVyIFVSQiAqLworCQkJfSBidWxrOworCQkJc3RydWN0IHsKKwkJCQlpbnQgZnJhbWVzcGVydXJiOworCQkJCWludCBmcmFtZXNpemU7CisJCQkJaW50IGludGVydmFsOworCQkJfSBpc29jOworCQl9IHU7CisJfSB1cmI7CisKKwlpbnQgbnVtX2RldmljZV9kZXNjczsKKwlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfZGVzY3JpcHRpb24gZGV2aWNlc1s5XTsKK307CisKKworLyoqCisgKiBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgLSBvYmplY3Qgb2YgYSBEVkIgVVNCIGRldmljZQorICogQHByb3BzOiBjb3B5IG9mIHRoZSBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIHRoaXMgZGV2aWNlIGJlbG9uZ3MgdG8uCisgKiBAZGVzYzogcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgc3RydWN0IGR2Yl91c2JfZGV2aWNlX2Rlc2NyaXB0aW9uLgorICogQHN0YXRlOiBpbml0aWFsaXphdGlvbiBhbmQgcnVudGltZSBzdGF0ZSBvZiB0aGUgZGV2aWNlLgorICoKKyAqIEB1ZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBzdHJ1Y3QgdXNiX2RldmljZS4KKyAqIEB1cmJfbGlzdDogYXJyYXkgb2YgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cnVjdCB1cmIgZm9yIHRoZSBNUEVHMi1UUy0KKyAqICBzdHJlYW1pbmcuCisgKgorICogQGJ1Zl9udW06IG51bWJlciBvZiBidWZmZXIgYWxsb2NhdGVkLgorICogQGJ1Zl9zaXplOiBzaXplIG9mIGVhY2ggYnVmZmVyIGluIGJ1Zl9saXN0LgorICogQGJ1Zl9saXN0OiBhcnJheSBjb250YWluaW5nIGFsbCBhbGxvY2F0ZSBidWZmZXJzIGZvciBzdHJlYW1pbmcuCisgKiBAZG1hX2FkZHI6IGxpc3Qgb2YgZG1hX2FkZHJfdCBmb3IgZWFjaCBidWZmZXIgaW4gYnVmX2xpc3QuCisgKgorICogQHVyYnNfaW5pdGlhbGl6ZWQ6IG51bWJlciBvZiBVUkJzIGluaXRpYWxpemVkLgorICogQHVyYnNfc3VibWl0dGVkOiBudW1iZXIgb2YgVVJCcyBzdWJtaXR0ZWQuCisgKgorICogQGZlZWRjb3VudDogbnVtYmVyIG9mIHJlcWVzdGVkIGZlZWRzICh1c2VkIGZvciBzdHJlYW1pbmctYWN0aXZhdGlvbikKKyAqIEBwaWRfZmlsdGVyaW5nOiBpcyBoYXJkd2FyZSBwaWRfZmlsdGVyaW5nIHVzZWQgb3Igbm90LgorICoKKyAqIEB1c2Jfc2VtOiBzZW1hcGhvcmUgb2YgVVNCIGNvbnRyb2wgbWVzc2FnZXMgKHJlYWRpbmcgbmVlZHMgdHdvIG1lc3NhZ2VzKQorICogQGkyY19zZW06IHNlbWFwaG9yZSBmb3IgaTJjLXRyYW5zZmVycworICoKKyAqIEBpMmNfYWRhcDogZGV2aWNlJ3MgaTJjX2FkYXB0ZXIgaWYgaXQgdXNlcyBJMkNvdmVyVVNCCisgKiBAcGxsX2FkZHI6IEkyQyBhZGRyZXNzIG9mIHRoZSB0dW5lciBmb3IgcHJvZ3JhbW1pbmcKKyAqIEBwbGxfaW5pdDogYXJyYXkgY29udGFpbmluZyB0aGUgaW5pdGlhbGl6YXRpb24gYnVmZmVyCisgKiBAcGxsX2Rlc2M6IHBvaW50ZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHN0cnVjdCBkdmJfcGxsX2Rlc2MKKyAqCisgKiBAdHVuZXJfcGFzc19jdHJsOiBjYWxsZWQgdG8gKGRlKWFjdGl2YXRlIHR1bmVyIHBhc3N0aHJ1IG9mIHRoZSBkZW1vZCBvciB0aGUgYm9hcmQKKyAqCisgKiBAZHZiX2FkYXA6IGRldmljZSdzIGR2Yl9hZGFwdGVyLgorICogQGRteGRldjogZGV2aWNlJ3MgZG14ZGV2LgorICogQGRlbXV4OiBkZXZpY2UncyBzb2Z0d2FyZSBkZW11eGVyLgorICogQGR2Yl9uZXQ6IGRldmljZSdzIGR2Yl9uZXQgaW50ZXJmYWNlcy4KKyAqIEBkdmJfZnJvbnRlbmQ6IGRldmljZSdzIGZyb250ZW5kLgorICogQG1heF9mZWVkX2NvdW50OiBob3cgbWFueSBmZWVkcyBjYW4gYmUgaGFuZGxlZCBzaW11bHRhbmVvdXNseSBieSB0aGlzCisgKiAgZGV2aWNlCisgKiBAZmVfc2xlZXA6IHJlcm91dGVkIGZyb250ZW5kLXNsZWVwIGZ1bmN0aW9uLgorICogQGZlX2luaXQ6IHJlcm91dGVkIGZyb250ZW5kLWluaXQgKHdha2V1cCkgZnVuY3Rpb24uCisgKiBAcmNfaW5wdXRfZGV2OiBpbnB1dCBkZXZpY2UgZm9yIHRoZSByZW1vdGUgY29udHJvbC4KKyAqIEByY19xdWVyeV93b3JrOiBzdHJ1Y3Qgd29ya19zdHJ1Y3QgZnJlcXVlbnQgcmMgcXVlcmllcworICogQGxhc3RfZXZlbnQ6IGxhc3QgdHJpZ2dlcmVkIGV2ZW50CisgKiBAbGFzdF9zdGF0ZTogbGFzdCBzdGF0ZSAobm8sIHByZXNzZWQsIHJlcGVhdCkKKyAqIEBvd25lcjogb3duZXIgb2YgdGhlIGR2Yl9hZGFwdGVyCisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhIG9mIHRoZSBhY3R1YWwgZHJpdmVyIChhbGxvY2F0ZSBieSBkdmItdXNiLCBzaXplIGRlZmluZWQKKyAqICBpbiBzaXplX29mX3ByaXYgb2YgZHZiX3VzYl9wcm9wZXJ0aWVzKS4KKyAqLworc3RydWN0IGR2Yl91c2JfZGV2aWNlIHsKKwlzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIHByb3BzOworCXN0cnVjdCBkdmJfdXNiX2RldmljZV9kZXNjcmlwdGlvbiAqZGVzYzsKKworI2RlZmluZSBEVkJfVVNCX1NUQVRFX0lOSVQgICAgICAgIDB4MDAwCisjZGVmaW5lIERWQl9VU0JfU1RBVEVfVVJCX0xJU1QgICAgMHgwMDEKKyNkZWZpbmUgRFZCX1VTQl9TVEFURV9VUkJfQlVGICAgICAweDAwMgorI2RlZmluZSBEVkJfVVNCX1NUQVRFX0RWQiAgICAgICAgIDB4MDA0CisjZGVmaW5lIERWQl9VU0JfU1RBVEVfSTJDICAgICAgICAgMHgwMDgKKyNkZWZpbmUgRFZCX1VTQl9TVEFURV9SRU1PVEUgICAgICAweDAxMAorI2RlZmluZSBEVkJfVVNCX1NUQVRFX1VSQl9TVUJNSVQgIDB4MDIwCisJaW50IHN0YXRlOworCisJLyogdXNiICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVyYiAqKnVyYl9saXN0OworCisJaW50IGJ1Zl9udW07CisJdW5zaWduZWQgbG9uZyBidWZfc2l6ZTsKKwl1OCAqKmJ1Zl9saXN0OworCWRtYV9hZGRyX3QgKmRtYV9hZGRyOworCisJaW50IHVyYnNfaW5pdGlhbGl6ZWQ7CisJaW50IHVyYnNfc3VibWl0dGVkOworCisJaW50IGZlZWRjb3VudDsKKwlpbnQgcGlkX2ZpbHRlcmluZzsKKworCS8qIGxvY2tpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHVzYl9zZW07CisKKwkvKiBpMmMgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGkyY19zZW07CisJc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOworCisJLyogdHVuZXIgcHJvZ3JhbW1pbmcgaW5mb3JtYXRpb24gKi8KKwl1OCBwbGxfYWRkcjsKKwl1OCBwbGxfaW5pdFs0XTsKKwlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKKwlpbnQgKCp0dW5lcl9wYXNzX2N0cmwpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgaW50LCB1OCk7CisKKwkvKiBkdmIgKi8KKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgZHZiX2FkYXA7CisJc3RydWN0IGRteGRldiBkbXhkZXY7CisJc3RydWN0IGR2Yl9kZW11eCBkZW11eDsKKwlzdHJ1Y3QgZHZiX25ldCBkdmJfbmV0OworCXN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlOworCWludCBtYXhfZmVlZF9jb3VudDsKKworCWludCAoKmZlX3NsZWVwKSAoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKKwlpbnQgKCpmZV9pbml0KSAgKHN0cnVjdCBkdmJfZnJvbnRlbmQgKik7CisKKwkvKiByZW1vdGUgY29udHJvbCAqLworCXN0cnVjdCBpbnB1dF9kZXYgcmNfaW5wdXRfZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCByY19xdWVyeV93b3JrOworCXUzMiBsYXN0X2V2ZW50OworCWludCBsYXN0X3N0YXRlOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwl2b2lkICpwcml2OworfTsKKworZXh0ZXJuIGludCBkdmJfdXNiX2RldmljZV9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICosIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgKiwgc3RydWN0IG1vZHVsZSAqKTsKK2V4dGVybiB2b2lkIGR2Yl91c2JfZGV2aWNlX2V4aXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKy8qIHRoZSBnZW5lcmljIHJlYWQvd3JpdGUgbWV0aG9kIGZvciBkZXZpY2UgY29udHJvbCAqLworZXh0ZXJuIGludCBkdmJfdXNiX2dlbmVyaWNfcncoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHU4ICosIHUxNiwgdTggKiwgdTE2LGludCk7CitleHRlcm4gaW50IGR2Yl91c2JfZ2VuZXJpY193cml0ZShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgdTggKiwgdTE2KTsKKworLyogY29tbW9ubHkgdXNlZCByZW1vdGUgY29udHJvbCBwYXJzaW5nICovCitleHRlcm4gaW50IGR2Yl91c2JfbmVjX3JjX2tleV90b19ldmVudChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKiwgdThbXSwgdTMyICosIGludCAqKTsKKworLyogY29tbW9ubHkgdXNlZCBwbGwgaW5pdCBhbmQgc2V0IGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBkdmJfdXNiX3BsbF9pbml0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICopOworZXh0ZXJuIGludCBkdmJfdXNiX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKiwgdThbXSk7CitleHRlcm4gaW50IGR2Yl91c2JfcGxsX3NldF9pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL25vdmEtdC11c2IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YTkyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2Ivbm92YS10LXVzYjIuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogRFZCIFVTQiBmcmFtZXdvcmsgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlIEhhdXBwYXVnZSBXaW5UVi1OT1ZBLVQgdXNiMgorICogRFZCLVQgcmVjZWl2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpbmNsdWRlICJkaWJ1c2IuaCIKKworc3RhdGljIGludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPXJjLDI9ZWVwcm9tICh8LWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKKworI2RlZmluZSBkZWJfcmMoYXJncy4uLikgZHByaW50ayhkZWJ1ZywweDAxLGFyZ3MpCisjZGVmaW5lIGRlYl9lZShhcmdzLi4uKSBkcHJpbnRrKGRlYnVnLDB4MDIsYXJncykKKworLyogSGF1cHBhdWdlIE5PVkEtVCBVU0IyIGtleXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgaGF1cHBfcmNfa2V5cyBbXSA9IHsKKwl7IDB4MWUsIDB4MDAsIEtFWV8wIH0sCisJeyAweDFlLCAweDAxLCBLRVlfMSB9LAorCXsgMHgxZSwgMHgwMiwgS0VZXzIgfSwKKwl7IDB4MWUsIDB4MDMsIEtFWV8zIH0sCisJeyAweDFlLCAweDA0LCBLRVlfNCB9LAorCXsgMHgxZSwgMHgwNSwgS0VZXzUgfSwKKwl7IDB4MWUsIDB4MDYsIEtFWV82IH0sCisJeyAweDFlLCAweDA3LCBLRVlfNyB9LAorCXsgMHgxZSwgMHgwOCwgS0VZXzggfSwKKwl7IDB4MWUsIDB4MDksIEtFWV85IH0sCisJeyAweDFlLCAweDBhLCBLRVlfS1BBU1RFUklTSyB9LAorCXsgMHgxZSwgMHgwYiwgS0VZX1JFRCB9LAorCXsgMHgxZSwgMHgwYywgS0VZX1JBRElPIH0sCisJeyAweDFlLCAweDBkLCBLRVlfTUVOVSB9LAorCXsgMHgxZSwgMHgwZSwgS0VZX0dSQVZFIH0sIC8qICMgKi8KKwl7IDB4MWUsIDB4MGYsIEtFWV9NVVRFIH0sCisJeyAweDFlLCAweDEwLCBLRVlfVk9MVU1FVVAgfSwKKwl7IDB4MWUsIDB4MTEsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDFlLCAweDEyLCBLRVlfQ0hBTk5FTCB9LAorCXsgMHgxZSwgMHgxNCwgS0VZX1VQIH0sCisJeyAweDFlLCAweDE1LCBLRVlfRE9XTiB9LAorCXsgMHgxZSwgMHgxNiwgS0VZX0xFRlQgfSwKKwl7IDB4MWUsIDB4MTcsIEtFWV9SSUdIVCB9LAorCXsgMHgxZSwgMHgxOCwgS0VZX1ZJREVPIH0sCisJeyAweDFlLCAweDE5LCBLRVlfQVVESU8gfSwKKwl7IDB4MWUsIDB4MWEsIEtFWV9NRURJQSB9LAorCXsgMHgxZSwgMHgxYiwgS0VZX0VQRyB9LAorCXsgMHgxZSwgMHgxYywgS0VZX1RWIH0sCisJeyAweDFlLCAweDFlLCBLRVlfTkVYVCB9LAorCXsgMHgxZSwgMHgxZiwgS0VZX0JBQ0sgfSwKKwl7IDB4MWUsIDB4MjAsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MWUsIDB4MjEsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgxZSwgMHgyNCwgS0VZX0xBU1QgfSwgLyogU2tpcCBiYWNrd2FyZHMgKi8KKwl7IDB4MWUsIDB4MjUsIEtFWV9PSyB9LAorCXsgMHgxZSwgMHgyOSwgS0VZX0JMVUV9LAorCXsgMHgxZSwgMHgyZSwgS0VZX0dSRUVOIH0sCisJeyAweDFlLCAweDMwLCBLRVlfUEFVU0UgfSwKKwl7IDB4MWUsIDB4MzIsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MWUsIDB4MzQsIEtFWV9GQVNURk9SV0FSRCB9LAorCXsgMHgxZSwgMHgzNSwgS0VZX1BMQVkgfSwKKwl7IDB4MWUsIDB4MzYsIEtFWV9TVE9QIH0sCisJeyAweDFlLCAweDM3LCBLRVlfUkVDT1JEIH0sCisJeyAweDFlLCAweDM4LCBLRVlfWUVMTE9XIH0sCisJeyAweDFlLCAweDNiLCBLRVlfR09UTyB9LAorCXsgMHgxZSwgMHgzZCwgS0VZX1BPV0VSIH0sCit9OworCisvKiBGaXJtd2FyZSBidWc/IHNvbWV0aW1lcywgd2hlbiBhIG5ldyBrZXkgaXMgcHJlc3NlZCwgdGhlIHByZXZpb3VzIHByZXNzZWQga2V5CisgKiBpcyBkZWxpdmVyZWQuIE5vIHdvcmthcm91bmQgeWV0LCBtYXliZSBhIG5ldyBmaXJtd2FyZS4KKyAqLworc3RhdGljIGludCBub3ZhX3RfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQoreworCXU4IGtleVs1XSxjbWRbMl0gPSB7IERJQlVTQl9SRVFfUE9MTF9SRU1PVEUsIDB4MzUgfSwgZGF0YSx0b2dnbGUsY3VzdG9tOworCXUxNiByYXc7CisJaW50IGk7CisJc3RydWN0IGRpYnVzYl9zdGF0ZSAqc3QgPSBkLT5wcml2OworCisJZHZiX3VzYl9nZW5lcmljX3J3KGQsY21kLDIsa2V5LDUsMCk7CisKKwkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CisJc3dpdGNoIChrZXlbMF0pIHsKKwkJY2FzZSBESUJVU0JfUkNfSEFVUFBBVUdFX0tFWV9QUkVTU0VEOgorCQkJcmF3ID0gKChrZXlbMV0gPDwgOCkgfCBrZXlbMl0pID4+IDM7CisJCQl0b2dnbGUgPSAhIShyYXcgJiAweDgwMCk7CisJCQlkYXRhID0gcmF3ICYgMHgzZjsKKwkJCWN1c3RvbSA9IChyYXcgPj4gNikgJiAweDFmOworCisJCQlkZWJfcmMoInJhdyBrZXkgY29kZSAweCUwMngsIDB4JTAyeCwgMHglMDJ4IHRvIGM6ICUwMnggZDogJTAyeCB0b2dnbGU6ICVkXG4iLGtleVsxXSxrZXlbMl0sa2V5WzNdLGN1c3RvbSxkYXRhLHRvZ2dsZSk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhhdXBwX3JjX2tleXMpOyBpKyspIHsKKwkJCQlkZWJfcmMoImM6ICV4LCBkOiAleFxuIixoYXVwcF9yY19rZXlzW2ldLmRhdGEsaGF1cHBfcmNfa2V5c1tpXS5jdXN0b20pOworCQkJCWlmIChoYXVwcF9yY19rZXlzW2ldLmRhdGEgPT0gZGF0YSAmJgorCQkJCQloYXVwcF9yY19rZXlzW2ldLmN1c3RvbSA9PSBjdXN0b20pIHsKKwkJCQkJKmV2ZW50ID0gaGF1cHBfcmNfa2V5c1tpXS5ldmVudDsKKwkJCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9QUkVTU0VEOworCQkJCQlpZiAoc3QtPm9sZF90b2dnbGUgPT0gdG9nZ2xlKSB7CisJCQkJCQlpZiAoc3QtPmxhc3RfcmVwZWF0X2NvdW50KysgPCAyKQorCQkJCQkJCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXN0LT5sYXN0X3JlcGVhdF9jb3VudCA9IDA7CisJCQkJCQlzdC0+b2xkX3RvZ2dsZSA9IHRvZ2dsZTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIERJQlVTQl9SQ19IQVVQUEFVR0VfS0VZX0VNUFRZOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbm92YV90X3JlYWRfbWFjX2FkZHJlc3MgKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggbWFjWzZdKQoreworCWludCBpOworCXU4IGI7CisKKwltYWNbMF0gPSAweDAwOworCW1hY1sxXSA9IDB4MGQ7CisJbWFjWzJdID0gMHhmZTsKKworCS8qIHRoaXMgaXMgYSBjb21wbGV0ZSBndWVzcywgYnV0IHdvcmtzIGZvciBteSBib3ggKi8KKwlmb3IgKGkgPSAxMzY7IGkgPCAxMzk7IGkrKykgeworCQlkaWJ1c2JfcmVhZF9lZXByb21fYnl0ZShkLGksICZiKTsKKworCQltYWNbNSAtIChpIC0gMTM2KV0gPSBiOworCisvKgkJZGViX2VlKCIlMDJ4ICIsYik7CisJCWlmICgoaSsxKSAlIDE2ID09IDApCisJCQlkZWJfZWUoIlxuIik7Ki8KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogVVNCIERyaXZlciBzdHVmZiAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgbm92YV90X3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgbm92YV90X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGR2Yl91c2JfZGV2aWNlX2luaXQoaW50Ziwmbm92YV90X3Byb3BlcnRpZXMsVEhJU19NT0RVTEUpOworfQorCisvKiBkbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgSUQgdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBub3ZhX3RfdGFibGUgW10gPSB7CisvKiAwMCAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsICAgICBVU0JfUElEX1dJTlRWX05PVkFfVF9VU0IyX0NPTEQpIH0sCisvKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQVVQUEFVR0UsICAgICBVU0JfUElEX1dJTlRWX05PVkFfVF9VU0IyX1dBUk0pIH0sCisJCQl7IH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBub3ZhX3RfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfcHJvcGVydGllcyBub3ZhX3RfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSEFTX1BJRF9GSUxURVIgfCBEVkJfVVNCX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYgfCBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCS5waWRfZmlsdGVyX2NvdW50ID0gMzIsCisKKwkudXNiX2N0cmwgPSBDWVBSRVNTX0ZYMiwKKwkuZmlybXdhcmUgPSAiZHZiLXVzYi1ub3ZhLXQtdXNiMi0wMS5mdyIsCisKKwkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgZGlidXNiX3N0YXRlKSwKKworCS5zdHJlYW1pbmdfY3RybCAgID0gZGlidXNiMl8wX3N0cmVhbWluZ19jdHJsLAorCS5waWRfZmlsdGVyICAgICAgID0gZGlidXNiX3BpZF9maWx0ZXIsCisJLnBpZF9maWx0ZXJfY3RybCAgPSBkaWJ1c2JfcGlkX2ZpbHRlcl9jdHJsLAorCS5wb3dlcl9jdHJsICAgICAgID0gZGlidXNiMl8wX3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSBkaWJ1c2JfZGliMzAwMG1jX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IGRpYnVzYl9kaWIzMDAwbWNfdHVuZXJfYXR0YWNoLAorCS5yZWFkX21hY19hZGRyZXNzID0gbm92YV90X3JlYWRfbWFjX2FkZHJlc3MsCisKKwkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkucmNfa2V5X21hcCAgICAgICA9IGhhdXBwX3JjX2tleXMsCisJLnJjX2tleV9tYXBfc2l6ZSAgPSBBUlJBWV9TSVpFKGhhdXBwX3JjX2tleXMpLAorCS5yY19xdWVyeSAgICAgICAgID0gbm92YV90X3JjX3F1ZXJ5LAorCisJLmkyY19hbGdvICAgICAgICAgPSAmZGlidXNiX2kyY19hbGdvLAorCisJLmdlbmVyaWNfYnVsa19jdHJsX2VuZHBvaW50ID0gMHgwMSwKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDYsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgICJIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIHVzYjIiLAorCQkJeyAmbm92YV90X3RhYmxlWzBdLCBOVUxMIH0sCisJCQl7ICZub3ZhX3RfdGFibGVbMV0sIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbm92YV90X2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImR2Yl91c2Jfbm92YV90X3VzYjIiLAorCS5wcm9iZQkJPSBub3ZhX3RfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZQk9IG5vdmFfdF90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgbm92YV90X21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3Rlcigmbm92YV90X2RyaXZlcikpKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIixyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbm92YV90X21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJm5vdmFfdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAobm92YV90X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0IChub3ZhX3RfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGF1cHBhdWdlIFdpblRWLU5PVkEtVCB1c2IyIik7CitNT0RVTEVfVkVSU0lPTigiMS4wIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdW10LTAxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTJhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwpAQCAtMCwwICsxLDE2MiBAQAorLyogRFZCIFVTQiBmcmFtZXdvcmsgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlIEhhbmZUZWsgVU1ULTAxMCBVU0IyLjAKKyAqIERWQi1UIHJlY2VpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaW5jbHVkZSAiZGlidXNiLmgiCisKKyNpbmNsdWRlICJtdDM1Mi5oIgorCitzdGF0aWMgaW50IHVtdF9tdDM1Ml9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0YXRpYyB1OCBtdDM1Ml9jbG9ja19jb25maWdbXSA9IHsgMHg4OSwgMHhiOCwgMHgyZCB9OworCXN0YXRpYyB1OCBtdDM1Ml9yZXNldFtdID0geyAweDUwLCAweDgwIH07CisJc3RhdGljIHU4IG10MzUyX21jbGtfcmF0aW9bXSA9IHsgMHg4YiwgMHgwMCB9OworCXN0YXRpYyB1OCBtdDM1Ml9hZGNfY3RsXzFfY2ZnW10gPSB7IDB4OEUsIDB4NDAgfTsKKwlzdGF0aWMgdTggbXQzNTJfYWdjX2NmZ1tdID0geyAweDY3LCAweDEwLCAweGEwIH07CisKKwlzdGF0aWMgdTggbXQzNTJfc2VjX2FnY19jZmcxW10gPSB7IDB4NmEsIDB4ZmYgfTsKKwlzdGF0aWMgdTggbXQzNTJfc2VjX2FnY19jZmcyW10gPSB7IDB4NmQsIDB4ZmYgfTsKKwlzdGF0aWMgdTggbXQzNTJfc2VjX2FnY19jZmczW10gPSB7IDB4NzAsIDB4NDAgfTsKKwlzdGF0aWMgdTggbXQzNTJfc2VjX2FnY19jZmc0W10gPSB7IDB4N2IsIDB4MDMgfTsKKwlzdGF0aWMgdTggbXQzNTJfc2VjX2FnY19jZmc1W10gPSB7IDB4N2QsIDB4MGYgfTsKKworCXN0YXRpYyB1OCBtdDM1Ml9hY3FfY3RsW10gPSB7IDB4NTMsIDB4NTAgfTsKKwlzdGF0aWMgdTggbXQzNTJfaW5wdXRfZnJlcV8xW10gPSB7IDB4NTYsIDB4MzEsIDB4MDYgfTsKKworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9jbG9ja19jb25maWcsIHNpemVvZihtdDM1Ml9jbG9ja19jb25maWcpKTsKKwl1ZGVsYXkoMjAwMCk7CisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX3Jlc2V0LCBzaXplb2YobXQzNTJfcmVzZXQpKTsKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfbWNsa19yYXRpbywgc2l6ZW9mKG10MzUyX21jbGtfcmF0aW8pKTsKKworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZGNfY3RsXzFfY2ZnLCBzaXplb2YobXQzNTJfYWRjX2N0bF8xX2NmZykpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hZ2NfY2ZnLCBzaXplb2YobXQzNTJfYWdjX2NmZykpOworCisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX3NlY19hZ2NfY2ZnMSwgc2l6ZW9mKG10MzUyX3NlY19hZ2NfY2ZnMSkpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9zZWNfYWdjX2NmZzIsIHNpemVvZihtdDM1Ml9zZWNfYWdjX2NmZzIpKTsKKwltdDM1Ml93cml0ZShmZSwgbXQzNTJfc2VjX2FnY19jZmczLCBzaXplb2YobXQzNTJfc2VjX2FnY19jZmczKSk7CisJbXQzNTJfd3JpdGUoZmUsIG10MzUyX3NlY19hZ2NfY2ZnNCwgc2l6ZW9mKG10MzUyX3NlY19hZ2NfY2ZnNCkpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9zZWNfYWdjX2NmZzUsIHNpemVvZihtdDM1Ml9zZWNfYWdjX2NmZzUpKTsKKworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9hY3FfY3RsLCBzaXplb2YobXQzNTJfYWNxX2N0bCkpOworCW10MzUyX3dyaXRlKGZlLCBtdDM1Ml9pbnB1dF9mcmVxXzEsIHNpemVvZihtdDM1Ml9pbnB1dF9mcmVxXzEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVtdF9tdDM1Ml9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCXN0cnVjdCBtdDM1Ml9jb25maWcgdW10X2NvbmZpZzsKKworCW1lbXNldCgmdW10X2NvbmZpZywwLHNpemVvZihzdHJ1Y3QgbXQzNTJfY29uZmlnKSk7CisJdW10X2NvbmZpZy5kZW1vZF9pbml0ID0gdW10X210MzUyX2RlbW9kX2luaXQ7CisJdW10X2NvbmZpZy5kZW1vZF9hZGRyZXNzID0gMHhmOworCXVtdF9jb25maWcucGxsX3NldCA9IGR2Yl91c2JfcGxsX3NldDsKKworCWQtPmZlID0gbXQzNTJfYXR0YWNoKCZ1bXRfY29uZmlnLCAmZC0+aTJjX2FkYXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdW10X3R1bmVyX2F0dGFjaCAoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWQtPnBsbF9hZGRyID0gMHg2MTsKKwlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3R1YTYwMzQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIFVTQiBEcml2ZXIgc3R1ZmYgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIHVtdF9wcm9wZXJ0aWVzOworCitzdGF0aWMgaW50IHVtdF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWlmIChkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnVtdF9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogZG8gbm90IGNoYW5nZSB0aGUgb3JkZXIgb2YgdGhlIElEIHRhYmxlICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdW10X3RhYmxlIFtdID0geworLyogMDAgKi8JeyBVU0JfREVWSUNFKFVTQl9WSURfSEFORlRFSywJCVVTQl9QSURfSEFORlRFS19VTVRfMDEwX0NPTEQpIH0sCisvKiAwMSAqLwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9IQU5GVEVLLAkJVVNCX1BJRF9IQU5GVEVLX1VNVF8wMTBfV0FSTSkgfSwKKwkJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHVtdF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIHVtdF9wcm9wZXJ0aWVzID0geworCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLXVtdC0wMTAtMDIuZnciLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IGRpYnVzYl9zdGF0ZSksCisKKwkuc3RyZWFtaW5nX2N0cmwgICA9IGRpYnVzYjJfMF9zdHJlYW1pbmdfY3RybCwKKwkucG93ZXJfY3RybCAgICAgICA9IGRpYnVzYl9wb3dlcl9jdHJsLAorCS5mcm9udGVuZF9hdHRhY2ggID0gdW10X210MzUyX2Zyb250ZW5kX2F0dGFjaCwKKwkudHVuZXJfYXR0YWNoICAgICA9IHVtdF90dW5lcl9hdHRhY2gsCisKKwkuaTJjX2FsZ28gICAgICAgICA9ICZkaWJ1c2JfaTJjX2FsZ28sCisKKwkuZ2VuZXJpY19idWxrX2N0cmxfZW5kcG9pbnQgPSAweDAxLAorCS8qIHBhcmFtZXRlciBmb3IgdGhlIE1QRUcyLWRhdGEgdHJhbnNmZXIgKi8KKwkudXJiID0geworCQkudHlwZSA9IERWQl9VU0JfQlVMSywKKwkJLmNvdW50ID0gMjAsCisJCS5lbmRwb2ludCA9IDB4MDYsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA1MTIsCisJCQl9CisJCX0KKwl9LAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQl7CSJIYW5mdGVrIFVNVC0wMTAgRFZCLVQgVVNCMi4wIiwKKwkJCXsgJnVtdF90YWJsZVswXSwgTlVMTCB9LAorCQkJeyAmdW10X3RhYmxlWzFdLCBOVUxMIH0sCisJCX0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHVtdF9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJkdmJfdXNiX3VtdF8wMTAiLAorCS5wcm9iZQkJPSB1bXRfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZQk9IHVtdF90YWJsZSwKK307CisKKy8qIG1vZHVsZSBzdHVmZiAqLworc3RhdGljIGludCBfX2luaXQgdW10X21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdW10X2RyaXZlcikpKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIixyZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW10X21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnVtdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCAodW10X21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0ICh1bXRfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBIYW5mVGVrIFVNVCAwMTAgVVNCMi4wIERWQi1UIGRldmljZSIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc0NmVkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LWZlLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qIERWQiBmcm9udGVuZCBwYXJ0IG9mIHRoZSBMaW51eCBkcml2ZXIgZm9yIFR3aW5oYW5EVFYgQWxwaGEvTWFnaWNCb3hJSSBVU0IyLjAKKyAqIERWQi1UIHJlY2VpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFBhdHJpY2sgQm9ldHRjaGVyIChwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlKQorICoKKyAqIFRoYW5rcyB0byBUd2luaGFuIHdobyBraW5kbHkgcHJvdmlkZWQgaGFyZHdhcmUgYW5kIGluZm9ybWF0aW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICoKKyAqLworI2luY2x1ZGUgInZwNzA0NS5oIgorCisvKiBJdCBpcyBhIFphcmxpbmsgTVQzNTIgd2l0aGluIGEgU2Ftc3VuZyBUdW5lciAoRE5PUzQwNFpIMTAyQSkgLSAwNDA5MjkgLSBBQVQKKyAqCisgKiBQcm9ncmFtbWluZyBpcyBoaWRkZW4gaW5zaWRlIHRoZSBmaXJtd2FyZSwgc28gc2V0X2Zyb250ZW5kIGlzIHZlcnkgZWFzeS4KKyAqIEV2ZW4gdGhvdWdoIHRoZXJlIGlzIGEgRmlybXdhcmUgY29tbWFuZCB0aGF0IG9uZSBjYW4gdXNlIHRvIGFjY2VzcyB0aGUgZGVtb2QKKyAqIHZpYSBpdHMgcmVnaXN0ZXJzLiBUaGlzIGlzIHVzZWQgZm9yIHN0YXR1cyBpbmZvcm1hdGlvbi4KKyAqLworCitzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlIHsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZlOworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKK307CisKKworc3RhdGljIGludCB2cDcwNDVfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBzMCA9IHZwNzA0NV9yZWFkX3JlZyhzdGF0ZS0+ZCwweDAwKSwKKwkgICBzMSA9IHZwNzA0NV9yZWFkX3JlZyhzdGF0ZS0+ZCwweDAxKSwKKwkgICBzMyA9IHZwNzA0NV9yZWFkX3JlZyhzdGF0ZS0+ZCwweDAzKTsKKworCSpzdGF0dXMgPSAwOworCWlmIChzMCAmICgxIDw8IDQpKQorCQkqc3RhdHVzIHw9IEZFX0hBU19DQVJSSUVSOworCWlmIChzMCAmICgxIDw8IDEpKQorCQkqc3RhdHVzIHw9IEZFX0hBU19WSVRFUkJJOworCWlmIChzMCAmICgxIDw8IDUpKQorCQkqc3RhdHVzIHw9IEZFX0hBU19MT0NLOworCWlmIChzMSAmICgxIDw8IDEpKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCWlmIChzMyAmICgxIDw8IDYpKQorCQkqc3RhdHVzIHw9IEZFX0hBU19TSUdOQUw7CisKKwlpZiAoKCpzdGF0dXMgJiAoRkVfSEFTX0NBUlJJRVIgfCBGRV9IQVNfVklURVJCSSB8IEZFX0hBU19TWU5DKSkgIT0KKwkJCShGRV9IQVNfQ0FSUklFUiB8IEZFX0hBU19WSVRFUkJJIHwgRkVfSEFTX1NZTkMpKQorCQkqc3RhdHVzICY9IH5GRV9IQVNfTE9DSzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzA0NV9mZV9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyICpiZXIpCit7CisJc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwkqYmVyID0gKHZwNzA0NV9yZWFkX3JlZyhzdGF0ZS0+ZCwgMHgwRCkgPDwgMTYpIHwKKwkgICAgICAgKHZwNzA0NV9yZWFkX3JlZyhzdGF0ZS0+ZCwgMHgwRSkgPDwgOCkgfAorCSAgICAgICAgdnA3MDQ1X3JlYWRfcmVnKHN0YXRlLT5kLCAweDBGKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwNDVfZmVfcmVhZF91bmNfYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKnVuYykKK3sKKwlzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCSp1bmMgPSAodnA3MDQ1X3JlYWRfcmVnKHN0YXRlLT5kLCAweDEwKSA8PCA4KSB8CisJCSAgICB2cDcwNDVfcmVhZF9yZWcoc3RhdGUtPmQsIDB4MTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzA0NV9mZV9yZWFkX3NpZ25hbF9zdHJlbmd0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUxNiBzaWduYWwgPSAodnA3MDQ1X3JlYWRfcmVnKHN0YXRlLT5kLCAweDE0KSA8PCA4KSB8CisJCXZwNzA0NV9yZWFkX3JlZyhzdGF0ZS0+ZCwgMHgxNSk7CisKKwkqc3RyZW5ndGggPSB+c2lnbmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzA0NV9mZV9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBfc25yID0gdnA3MDQ1X3JlYWRfcmVnKHN0YXRlLT5kLCAweDA5KTsKKwkqc25yID0gKF9zbnIgPDwgOCkgfCBfc25yOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzA0NV9mZV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzA0NV9mZV9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDcwNDVfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqdHVuZSkKK3sKKwl0dW5lLT5taW5fZGVsYXlfbXMgPSA4MDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDQ1X2ZlX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXN0cnVjdCB2cDcwNDVfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggYnVmWzVdOworCXUzMiBmcmVxID0gZmVwLT5mcmVxdWVuY3kgLyAxMDAwOworCisJYnVmWzBdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKKwlidWZbMV0gPSAoZnJlcSA+PiAgOCkgJiAweGZmOworCWJ1ZlsyXSA9ICBmcmVxICAgICAgICAmIDB4ZmY7CisJYnVmWzNdID0gMDsKKworCXN3aXRjaCAoZmVwLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOiBidWZbNF0gPSA4OyBicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfN19NSFo6IGJ1Zls0XSA9IDc7IGJyZWFrOworCQljYXNlIEJBTkRXSURUSF82X01IWjogYnVmWzRdID0gNjsgYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIX0FVVE86IHJldHVybiAtRU9QTk9UU1VQUDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZwNzA0NV91c2Jfb3Aoc3RhdGUtPmQsTE9DS19UVU5FUl9DT01NQU5ELGJ1Ziw1LE5VTEwsMCwyMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwNzA0NV9mZV9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA3MDQ1X2ZlX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlrZnJlZShzdGF0ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB2cDcwNDVfZmVfb3BzOworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICogdnA3MDQ1X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCit7CisJc3RydWN0IHZwNzA0NV9mZV9zdGF0ZSAqcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cDcwNDVfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCW1lbXNldChzLDAsc2l6ZW9mKHN0cnVjdCB2cDcwNDVfZmVfc3RhdGUpKTsKKworCXMtPmQgPSBkOworCXMtPmZlLm9wcyA9ICZ2cDcwNDVfZmVfb3BzOworCXMtPmZlLmRlbW9kdWxhdG9yX3ByaXYgPSBzOworCisJZ290byBzdWNjZXNzOworZXJyb3I6CisJcmV0dXJuIE5VTEw7CitzdWNjZXNzOgorCXJldHVybiAmcy0+ZmU7Cit9CisKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHZwNzA0NV9mZV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lCQkJPSAiVHdpbmhhbiBWUDcwNDUvNDYgVVNCIERWQi1UIiwKKwkJLnR5cGUJCQk9IEZFX09GRE0sCisJCS5mcmVxdWVuY3lfbWluCQk9IDQ0MjUwMDAwLAorCQkuZnJlcXVlbmN5X21heAkJPSA4NjcyNTAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUJPSAxMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8CisJCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJCQlGRV9DQU5fUVBTSyB8IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwgRkVfQ0FOX1FBTV9BVVRPIHwKKwkJCQlGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8CisJCQkJRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkJCUZFX0NBTl9SRUNPVkVSIHwKKwkJCQlGRV9DQU5fSElFUkFSQ0hZX0FVVE8sCisJfSwKKworCS5yZWxlYXNlID0gdnA3MDQ1X2ZlX3JlbGVhc2UsCisKKwkuaW5pdCA9IHZwNzA0NV9mZV9pbml0LAorCS5zbGVlcCA9IHZwNzA0NV9mZV9zbGVlcCwKKworCS5zZXRfZnJvbnRlbmQgPSB2cDcwNDVfZmVfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSB2cDcwNDVfZmVfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IHZwNzA0NV9mZV9nZXRfdHVuZV9zZXR0aW5ncywKKworCS5yZWFkX3N0YXR1cyA9IHZwNzA0NV9mZV9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSB2cDcwNDVfZmVfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gdnA3MDQ1X2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IHZwNzA0NV9mZV9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IHZwNzA0NV9mZV9yZWFkX3VuY19ibG9ja3MsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjOTVmNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmMKQEAgLTAsMCArMSwyODggQEAKKy8qIERWQiBVU0IgY29tcGxpYW50IExpbnV4IGRyaXZlciBmb3IgdGhlCisgKiAgLSBUd2luaGFuRFRWIEFscGhhL01hZ2ljQm94SUkgVVNCMi4wIERWQi1UIHJlY2VpdmVyCisgKiAgLSBEaWdpdGFsTm93IFRpbnlVU0IyIERWQi10IHJlY2VpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICogVGhhbmtzIHRvIFR3aW5oYW4gd2hvIGtpbmRseSBwcm92aWRlZCBoYXJkd2FyZSBhbmQgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpbmNsdWRlICJ2cDcwNDUuaCIKKworLyogZGVidWcgKi8KK2ludCBkdmJfdXNiX3ZwNzA0NV9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX3ZwNzA0NV9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJzZXQgZGVidWdnaW5nIGxldmVsICgxPWluZm8seGZlcj0yLHJjPTQgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKKworaW50IHZwNzA0NV91c2Jfb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCBjbWQsIHU4ICpvdXQsIGludCBvdXRsZW4sIHU4ICppbiwgaW50IGlubGVuLCBpbnQgbXNlYykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1OCBpbmJ1ZlsxMl0gPSB7IDAgfSwgb3V0YnVmWzIwXSA9IHsgMCB9OworCisJb3V0YnVmWzBdID0gY21kOworCisJaWYgKG91dGxlbiA+IDE5KQorCQlvdXRsZW4gPSAxOTsKKworCWlmIChpbmxlbiA+IDExKQorCQlpbmxlbiA9IDExOworCisJaWYgKG91dCAhPSBOVUxMICYmIG91dGxlbiA+IDApCisJCW1lbWNweSgmb3V0YnVmWzFdLCBvdXQsIG91dGxlbik7CisKKwlkZWJfeGZlcigib3V0IGJ1ZmZlcjogIik7CisJZGVidWdfZHVtcChvdXRidWYsb3V0bGVuKzEsZGViX3hmZXIpOworCisJaWYgKChyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmQtPnVzYl9zZW0pKSkKKwkJcmV0dXJuIHJldDsKKworCWlmICh1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCXVzYl9zbmRjdHJscGlwZShkLT51ZGV2LDApLAorCQkJVEhfQ09NTUFORF9PVVQsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULCAwLCAwLAorCQkJb3V0YnVmLCAyMCwgMjAwMCkgIT0gMjApIHsKKwkJZXJyKCJVU0IgY29udHJvbCBtZXNzYWdlICdvdXQnIHdlbnQgd3JvbmcuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gdW5sb2NrOworCX0KKworCW1zbGVlcChtc2VjKTsKKworCWlmICh1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCXVzYl9yY3ZjdHJscGlwZShkLT51ZGV2LDApLAorCQkJVEhfQ09NTUFORF9JTiwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwgMCwgMCwKKwkJCWluYnVmLCAxMiwgMjAwMCkgIT0gMTIpIHsKKwkJZXJyKCJVU0IgY29udHJvbCBtZXNzYWdlICdpbicgd2VudCB3cm9uZy4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byB1bmxvY2s7CisJfQorCisJZGViX3hmZXIoImluIGJ1ZmZlcjogIik7CisJZGVidWdfZHVtcChpbmJ1ZiwxMixkZWJfeGZlcik7CisKKwlpZiAoaW4gIT0gTlVMTCAmJiBpbmxlbiA+IDApCisJCW1lbWNweShpbiwmaW5idWZbMV0saW5sZW4pOworCit1bmxvY2s6CisJdXAoJmQtPnVzYl9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKwordTggdnA3MDQ1X3JlYWRfcmVnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVnKQoreworCXU4IG9idWZbMl0gPSB7IDAgfSx2OworCW9idWZbMV0gPSByZWc7CisKKwl2cDcwNDVfdXNiX29wKGQsVFVORVJfUkVHX1JFQUQsb2J1ZiwyLCZ2LDEsMzApOworCisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDQ1X3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggdiA9IG9ub2ZmOworCXJldHVybiB2cDcwNDVfdXNiX29wKGQsU0VUX1RVTkVSX1BPV0VSLCZ2LDEsTlVMTCwwLDE1MCk7Cit9CisKKy8qIHJlbW90ZSBjb250cm9sIHN0dWZmICovCisKKy8qIFRoZSBrZXltYXBwaW5nIHN0cnVjdC4gU29tZWhvdyB0aGlzIHNob3VsZCBiZSBsb2FkZWQgdG8gdGhlIGRyaXZlciwgYnV0CisgKiBjdXJyZW50bHkgaXQgaXMgaGFyZGNvZGVkLiAqLworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSB2cDcwNDVfcmNfa2V5c1tdID0geworCXsgMHgwMCwgMHgxNiwgS0VZX1BPV0VSIH0sCisJeyAweDAwLCAweDEwLCBLRVlfTVVURSB9LAorCXsgMHgwMCwgMHgwMywgS0VZXzEgfSwKKwl7IDB4MDAsIDB4MDEsIEtFWV8yIH0sCisJeyAweDAwLCAweDA2LCBLRVlfMyB9LAorCXsgMHgwMCwgMHgwOSwgS0VZXzQgfSwKKwl7IDB4MDAsIDB4MWQsIEtFWV81IH0sCisJeyAweDAwLCAweDFmLCBLRVlfNiB9LAorCXsgMHgwMCwgMHgwZCwgS0VZXzcgfSwKKwl7IDB4MDAsIDB4MTksIEtFWV84IH0sCisJeyAweDAwLCAweDFiLCBLRVlfOSB9LAorCXsgMHgwMCwgMHgxNSwgS0VZXzAgfSwKKwl7IDB4MDAsIDB4MDUsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MDAsIDB4MDIsIEtFWV9DSEFOTkVMRE9XTiB9LAorCXsgMHgwMCwgMHgxZSwgS0VZX1ZPTFVNRVVQIH0sCisJeyAweDAwLCAweDBhLCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwMCwgMHgxMSwgS0VZX1JFQ09SRCB9LAorCXsgMHgwMCwgMHgxNywgS0VZX0ZBVk9SSVRFUyB9LCAvKiBIZWFydCBzeW1ib2wgLSBDaGFubmVsIGxpc3QuICovCisJeyAweDAwLCAweDE0LCBLRVlfUExBWSB9LAorCXsgMHgwMCwgMHgxYSwgS0VZX1NUT1AgfSwKKwl7IDB4MDAsIDB4NDAsIEtFWV9SRVdJTkQgfSwKKwl7IDB4MDAsIDB4MTIsIEtFWV9GQVNURk9SV0FSRCB9LAorCXsgMHgwMCwgMHgwZSwgS0VZX1BSRVZJT1VTIH0sIC8qIFJlY2FsbCAtIFByZXZpb3VzIGNoYW5uZWwuICovCisJeyAweDAwLCAweDRjLCBLRVlfUEFVU0UgfSwKKwl7IDB4MDAsIDB4NGQsIEtFWV9TQ1JFRU4gfSwgLyogRnVsbCBzY3JlZW4gbW9kZS4gKi8KKwl7IDB4MDAsIDB4NTQsIEtFWV9BVURJTyB9LCAvKiBNVFMgLSBTd2l0Y2ggdG8gc2Vjb25kYXJ5IGF1ZGlvLiAqLworCXsgMHgwMCwgMHgwYywgS0VZX0NBTkNFTCB9LCAvKiBDYW5jZWwgKi8KKwl7IDB4MDAsIDB4MWMsIEtFWV9FUEcgfSwgLyogRVBHICovCisJeyAweDAwLCAweDAwLCBLRVlfVEFCIH0sIC8qIFRhYiAqLworCXsgMHgwMCwgMHg0OCwgS0VZX0lORk8gfSwgLyogUHJldmlldyAqLworCXsgMHgwMCwgMHgwNCwgS0VZX0xJU1QgfSwgLyogUmVjb3JkTGlzdCAqLworCXsgMHgwMCwgMHgwZiwgS0VZX1RFWFQgfSAvKiBUZWxldGV4dCAqLworfTsKKworc3RhdGljIGludCB2cDcwNDVfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQoreworCXU4IGtleTsKKwlpbnQgaTsKKwl2cDcwNDVfdXNiX29wKGQsUkNfVkFMX1JFQUQsTlVMTCwwLCZrZXksMSwyMCk7CisKKwlkZWJfcmMoInJlbW90ZSBxdWVyeSBrZXk6ICV4ICVkXG4iLGtleSxrZXkpOworCisJaWYgKGtleSA9PSAweDQ0KSB7CisJCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNpemVvZih2cDcwNDVfcmNfa2V5cykvc2l6ZW9mKHN0cnVjdCBkdmJfdXNiX3JjX2tleSk7IGkrKykKKwkJaWYgKHZwNzA0NV9yY19rZXlzW2ldLmRhdGEgPT0ga2V5KSB7CisJCQkqc3RhdGUgPSBSRU1PVEVfS0VZX1BSRVNTRUQ7CisJCQkqZXZlbnQgPSB2cDcwNDVfcmNfa2V5c1tpXS5ldmVudDsKKwkJCWJyZWFrOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA3MDQ1X3JlYWRfZWVwcm9tKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCx1OCAqYnVmLCBpbnQgbGVuLCBpbnQgb2Zmc2V0KQoreworCWludCBpID0gMDsKKwl1OCB2LGJyWzJdOworCWZvciAoaT0wOyBpIDwgbGVuOyBpKyspIHsKKwkJdiA9IG9mZnNldCArIGk7CisJCXZwNzA0NV91c2Jfb3AoZCxHRVRfRUVfVkFMVUUsJnYsMSxiciwyLDUpOworCQlidWZbaV0gPSBiclsxXTsKKwl9CisJZGViX2luZm8oIlZQNzA0NSBFRVBST00gcmVhZCAob2ZmczogJWQsIGxlbjogJWQpIDogIixvZmZzZXQsIGkpOworCWRlYnVnX2R1bXAoYnVmLGksZGViX2luZm8pOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdnA3MDQ1X3JlYWRfbWFjX2FkZHIoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLHU4IG1hY1s2XSkKK3sKKwlyZXR1cm4gdnA3MDQ1X3JlYWRfZWVwcm9tKGQsbWFjLCA2LCBNQUNfMF9BRERSKTsKK30KKworc3RhdGljIGludCB2cDcwNDVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwl1OCBidWZbMjU1XSA9IHsgMCB9OworCisJdnA3MDQ1X3VzYl9vcChkLFZFTkRPUl9TVFJJTkdfUkVBRCxOVUxMLDAsYnVmLDIwLDApOworCWJ1ZlsxMF0gPSAnXDAnOworCWRlYl9pbmZvKCJmaXJtd2FyZSBzYXlzOiAlcyAiLGJ1Zik7CisKKwl2cDcwNDVfdXNiX29wKGQsUFJPRFVDVF9TVFJJTkdfUkVBRCxOVUxMLDAsYnVmLDIwLDApOworCWJ1ZlsxMF0gPSAnXDAnOworCWRlYl9pbmZvKCIlcyAiLGJ1Zik7CisKKwl2cDcwNDVfdXNiX29wKGQsRldfVkVSU0lPTl9SRUFELE5VTEwsMCxidWYsMjAsMCk7CisJYnVmWzEwXSA9ICdcMCc7CisJZGViX2luZm8oInYlc1xuIixidWYpOworCisvKglEdW1wIHRoZSBFRVBST00gKi8KKy8qCXZwNzA0NV9yZWFkX2VlcHJvbShkLGJ1ZiwgMjU1LCBGWDJfSURfQUREUik7ICovCisKKwlkLT5mZSA9IHZwNzA0NV9mZV9hdHRhY2goZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgdnA3MDQ1X3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgdnA3MDQ1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJnZwNzA0NV9wcm9wZXJ0aWVzLFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHZwNzA0NV91c2JfdGFibGUgW10gPSB7CisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX1ZJU0lPTlBMVVMsIFVTQl9QSURfVFdJTkhBTl9WUDcwNDVfQ09MRCkgfSwKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfVklTSU9OUExVUywgVVNCX1BJRF9UV0lOSEFOX1ZQNzA0NV9XQVJNKSB9LAorCSAgICB7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9WSVNJT05QTFVTLCBVU0JfUElEX0ROVFZfVElOWVVTQjJfQ09MRCkgfSwKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfVklTSU9OUExVUywgVVNCX1BJRF9ETlRWX1RJTllVU0IyX1dBUk0pIH0sCisJICAgIHsgMCB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCB2cDcwNDVfdXNiX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgdnA3MDQ1X3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSAwLAorCisJLnVzYl9jdHJsID0gQ1lQUkVTU19GWDIsCisJLmZpcm13YXJlID0gImR2Yi11c2ItdnA3MDQ1LTAxLmZ3IiwKKworCS5wb3dlcl9jdHJsICAgICAgID0gdnA3MDQ1X3Bvd2VyX2N0cmwsCisJLmZyb250ZW5kX2F0dGFjaCAgPSB2cDcwNDVfZnJvbnRlbmRfYXR0YWNoLAorCS5yZWFkX21hY19hZGRyZXNzID0gdnA3MDQ1X3JlYWRfbWFjX2FkZHIsCisKKwkucmNfaW50ZXJ2YWwgICAgICA9IDQwMCwKKwkucmNfa2V5X21hcCAgICAgICA9IHZwNzA0NV9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRSh2cDcwNDVfcmNfa2V5cyksCisJLnJjX3F1ZXJ5ICAgICAgICAgPSB2cDcwNDVfcmNfcXVlcnksCisKKwkvKiBwYXJhbWV0ZXIgZm9yIHRoZSBNUEVHMi1kYXRhIHRyYW5zZmVyICovCisJLnVyYiA9IHsKKwkJLnR5cGUgPSBEVkJfVVNCX0JVTEssCisJCS5jb3VudCA9IDcsCisJCS5lbmRwb2ludCA9IDB4MDIsCisJCS51ID0geworCQkJLmJ1bGsgPSB7CisJCQkJLmJ1ZmZlcnNpemUgPSA0MDk2LAorCQkJfQorCQl9CisJfSwKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkuZGV2aWNlcyA9IHsKKwkJeyAubmFtZSA9ICJUd2luaGFuIFVTQjIuMCBEVkItVCByZWNlaXZlciAoVHdpbmhhbkRUViBBbHBoYS9NYWdpY0JveCBJSSkiLAorCQkgIC5jb2xkX2lkcyA9IHsgJnZwNzA0NV91c2JfdGFibGVbMF0sIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZ2cDcwNDVfdXNiX3RhYmxlWzFdLCBOVUxMIH0sCisJCX0sCisJCXsgLm5hbWUgPSAiRGlnaXRhbE5vdyBUaW55VVNCIDIgRFZCLXQgUmVjZWl2ZXIiLAorCQkgIC5jb2xkX2lkcyA9IHsgJnZwNzA0NV91c2JfdGFibGVbMl0sIE5VTEwgfSwKKwkJICAud2FybV9pZHMgPSB7ICZ2cDcwNDVfdXNiX3RhYmxlWzNdLCBOVUxMIH0sCisJCX0sCisJCXsgMCB9LAorCX0KK307CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB2cDcwNDVfdXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImR2Yl91c2JfdnA3MDQ1IiwKKwkucHJvYmUgCQk9IHZwNzA0NV91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZSAJPSB2cDcwNDVfdXNiX3RhYmxlLAorfTsKKworLyogbW9kdWxlIHN0dWZmICovCitzdGF0aWMgaW50IF9faW5pdCB2cDcwNDVfdXNiX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdDsKKwlpZiAoKHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdnA3MDQ1X3VzYl9kcml2ZXIpKSkgeworCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQuICglZCkiLHJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2cDcwNDVfdXNiX21vZHVsZV9leGl0KHZvaWQpCit7CisJLyogZGVyZWdpc3RlciB0aGlzIGRyaXZlciBmcm9tIHRoZSBVU0Igc3Vic3lzdGVtICovCisJdXNiX2RlcmVnaXN0ZXIoJnZwNzA0NV91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodnA3MDQ1X3VzYl9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdCh2cDcwNDVfdXNiX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgVHdpbmhhbiBNYWdpY0JveC9BbHBoYSBhbmQgRE5UViB0aW55VVNCMiBEVkItVCBVU0IyLjAiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZTIxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIENvbW1vbiBoZWFkZXItZmlsZSBvZiB0aGUgTGludXggZHJpdmVyIGZvciB0aGUgVHdpbmhhbkRUViBBbHBoYS9NYWdpY0JveElJCisgKiBVU0IyLjAgRFZCLVQgcmVjZWl2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUGF0cmljayBCb2V0dGNoZXIgKHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUpCisgKgorICogVGhhbmtzIHRvIFR3aW5oYW4gd2hvIGtpbmRseSBwcm92aWRlZCBoYXJkd2FyZSBhbmQgaW5mb3JtYXRpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpZm5kZWYgX0RWQl9VU0JfVlA3MDQ1X0hfCisjZGVmaW5lIF9EVkJfVVNCX1ZQNzA0NV9IXworCisjZGVmaW5lIERWQl9VU0JfTE9HX1BSRUZJWCAidnA3MDQ1IgorI2luY2x1ZGUgImR2Yi11c2IuaCIKKworZXh0ZXJuIGludCBkdmJfdXNiX3ZwNzA0NV9kZWJ1ZzsKKyNkZWZpbmUgZGViX2luZm8oYXJncy4uLikgZHByaW50ayhkdmJfdXNiX3ZwNzA0NV9kZWJ1ZywweDAxLGFyZ3MpCisjZGVmaW5lIGRlYl94ZmVyKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl92cDcwNDVfZGVidWcsMHgwMixhcmdzKQorI2RlZmluZSBkZWJfcmMoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfdnA3MDQ1X2RlYnVnLDB4MDQsYXJncykKKworLyogdnA3MDQ1IGNvbW1hbmRzICovCisKKy8qIFR3aW5oYW4gVmVuZG9yIHJlcXVlc3RzICovCisjZGVmaW5lIFRIX0NPTU1BTkRfSU4gICAgICAgICAgICAgICAgICAgICAweEMwCisjZGVmaW5lIFRIX0NPTU1BTkRfT1VUICAgICAgICAgICAgICAgICAgICAweEMxCisKKy8qIGNvbW1hbmQgYnl0ZXMgKi8KKyNkZWZpbmUgVFVORVJfUkVHX1JFQUQgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgVFVORVJfUkVHX1dSSVRFICAgICAgICAgICAgICAgICAgIDB4MDQKKworI2RlZmluZSBSQ19WQUxfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgMHgwNQorICNkZWZpbmUgUkNfTk9fS0VZICAgICAgICAgICAgICAgICAgICAgICAgMHg0NAorCisjZGVmaW5lIFNFVF9UVU5FUl9QT1dFUiAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIENIRUNLX1RVTkVSX1BPV0VSICAgICAgICAgICAgICAgICAweDEyCisgI2RlZmluZSBUdW5lcl9Qb3dlcl9PTiAgICAgICAgICAgICAgICAgICAxCisgI2RlZmluZSBUdW5lcl9Qb3dlcl9PRkYgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgR0VUX1VTQl9TUEVFRCAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyAjZGVmaW5lIFVTQl9TUEVFRF9MT1cgICAgICAgICAgICAgICAgICAgIDAKKyAjZGVmaW5lIFVTQl9TUEVFRF9GVUxMICAgICAgICAgICAgICAgICAgIDEKKyAjZGVmaW5lIFVTQl9TUEVFRF9ISUdIICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBMT0NLX1RVTkVSX0NPTU1BTkQgICAgICAgICAgICAgICAgMHgwOQorCisjZGVmaW5lIFRVTkVSX1NJR05BTF9SRUFEICAgICAgICAgICAgICAgICAweDBBCisKKy8qIEZYMiBlZXByb20gKi8KKyNkZWZpbmUgU0VUX0VFX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgR0VUX0VFX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgIDB4MTEKKyAjZGVmaW5lIEZYMl9JRF9BRERSICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyAjZGVmaW5lIFZJRF9NU0JfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyAjZGVmaW5lIFZJRF9MU0JfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyAjZGVmaW5lIFBJRF9NU0JfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MDQKKyAjZGVmaW5lIFBJRF9MU0JfQUREUiAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyAjZGVmaW5lIE1BQ18wX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyAjZGVmaW5lIE1BQ18xX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDgKKyAjZGVmaW5lIE1BQ18yX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyAjZGVmaW5lIE1BQ18zX0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MGEKKyAjZGVmaW5lIE1BQ180X0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MGIKKyAjZGVmaW5lIE1BQ181X0FERFIgICAgICAgICAgICAgICAgICAgICAgIDB4MGMKKworI2RlZmluZSBSRVNFVF9GWDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMworCisjZGVmaW5lIEZXX1ZFUlNJT05fUkVBRCAgICAgICAgICAgICAgICAgICAweDBCCisjZGVmaW5lIFZFTkRPUl9TVFJJTkdfUkVBRCAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIFBST0RVQ1RfU1RSSU5HX1JFQUQgICAgICAgICAgICAgICAweDBECisjZGVmaW5lIEZXX0JDRF9WRVJTSU9OX1JFQUQgICAgICAgICAgICAgICAweDE0CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICogdnA3MDQ1X2ZlX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpOworZXh0ZXJuIGludCB2cDcwNDVfdXNiX29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggY21kLCB1OCAqb3V0LCBpbnQgb3V0bGVuLCB1OCAqaW4sIGludCBpbmxlbixpbnQgbXNlYyk7CitleHRlcm4gdTggdnA3MDQ1X3JlYWRfcmVnKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVnKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCmluZGV4IDc1ZmI1NTYuLmQ4NDdjNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCkBAIC00MCw2ICs0MCwxMiBAQAogCWhlbHAKIAkgIEEgRFZCLVMgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAorY29uZmlnIERWQl9TNUgxNDIwCisJdHJpc3RhdGUgIlNhbXN1bmcgUzVIMTQyMCBiYXNlZCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFCisJaGVscAorCSAgQSBEVkItUyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCiBjb21tZW50ICJEVkItVCAodGVycmVzdHJpYWwpIGZyb250ZW5kcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAKQEAgLTE3Myw0ICsxNzksMTkgQEAKIAkgIEFuIEFUU0MgOFZTQiBhbmQgUUFNNjQvMjU2IHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudAogCSAgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCitjb25maWcgRFZCX0JDTTM1MTAKKwl0cmlzdGF0ZSAiQnJvYWRjb20gQkNNMzUxMCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFCisJc2VsZWN0IEZXX0xPQURFUgorCWhlbHAKKwkgIEFuIEFUU0MgOFZTQi8xNlZTQiBhbmQgUUFNNjQvMjU2IHR1bmVyIG1vZHVsZS4gU2F5IFkgd2hlbiB5b3Ugd2FudCB0bworCSAgc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCitjb25maWcgRFZCX0xHRFQzMzAyCisJdHJpc3RhdGUgIkxHRFQzMzAyIGJhc2VkIChEVmlDTyBGdXNpb25IRFRWMyBHb2xkKSIKKwlkZXBlbmRzIG9uIERWQl9DT1JFCisJaGVscAorCSAgQW4gQVRTQyA4VlNCIGFuZCBRQU02NC8yNTYgdHVuZXIgbW9kdWxlLiBTYXkgWSB3aGVuIHlvdSB3YW50CisJICB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQppbmRleCA3Zjg3ODQ4Li5kZTVlMjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCkBAIC0yOCwzICsyOCw2IEBACiBvYmotJChDT05GSUdfRFZCX05YVDIwMDIpICs9IG54dDIwMDIubwogb2JqLSQoQ09ORklHX0RWQl9PUjUxMjExKSArPSBvcjUxMjExLm8KIG9iai0kKENPTkZJR19EVkJfT1I1MTEzMikgKz0gb3I1MTEzMi5vCitvYmotJChDT05GSUdfRFZCX0JDTTM1MTApICs9IGJjbTM1MTAubworb2JqLSQoQ09ORklHX0RWQl9TNUgxNDIwKSArPSBzNWgxNDIwLm8KK29iai0kKENPTkZJR19EVkJfTEdEVDMzMDIpICs9IGxnZHQzMzAyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9iY20zNTEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZmRjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5jCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIEJyb2FkY29tIEJDTTM1MTAgQVRTQyBkZW1vZHVsYXRvciAoMXN0IGdlbmVyYXRpb24gQWlyMlBDKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEtNSwgQjJDMiBpbmMuCisgKgorICogIEdQTC9MaW51eCBkcml2ZXIgd3JpdHRlbiBieSBQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgImhhcmQtY29kZWQiIHRvIGJlIHVzZWQgd2l0aCB0aGUgMXN0IGdlbmVyYXRpb24gb2YKKyAqICBUZWNobmlzYXQvQjJDMidzIEFpcjJQQyBBVFNDIFBDSS9VU0IgY2FyZHMvYm94ZXMuIFRoZSBwbGwtcHJvZ3JhbW1pbmcKKyAqICAoUGFuYXNvbmljIENUMTBTKSBpcyBsb2NhdGVkIGhlcmUsIHdoaWNoIGlzIGFjdHVhbGx5IHdyb25nLiBVbmxlc3MgdGhlcmUgaXMKKyAqICBhbm90aGVyIGRldmljZSB3aXRoIGEgQkNNMzUxMCwgdGhpcyBpcyBubyBwcm9ibGVtLgorICoKKyAqICBUaGUgZHJpdmVyIHdvcmtzIGFsc28gd2l0aCBRQU02NCBEVkItQywgYnV0IGhhZCBhbiB1bnJlYXNvbmFibGUgaGlnaAorICogIFVOQy4gKFRlc3RlZCB3aXRoIHRoZSBBaXIyUEMgQVRTQyAxc3QgZ2VuZXJhdGlvbikKKyAqCisgKiAgWW91J2xsIG5lZWQgYSBmaXJtd2FyZSBmb3IgdGhpcyBkcml2ZXIgaW4gb3JkZXIgdG8gZ2V0IGl0IHJ1bm5pbmcuIEl0IGlzCisgKiAgY2FsbGVkICJkdmItZmUtYmNtMzUxMC0wMS5mdyIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcworICogQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJiY20zNTEwLmgiCisjaW5jbHVkZSAiYmNtMzUxMF9wcml2LmgiCisKK3N0cnVjdCBiY20zNTEwX3N0YXRlIHsKKworCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKKwljb25zdCBzdHJ1Y3QgYmNtMzUxMF9jb25maWcqIGNvbmZpZzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOworCisJLyogZGVtb2R1bGF0b3IgcHJpdmF0ZSBkYXRhICovCisJc3RydWN0IHNlbWFwaG9yZSBoYWJfc2VtOworCXU4IGZpcm13YXJlX2xvYWRlZDoxOworCisJdW5zaWduZWQgbG9uZyBuZXh0X3N0YXR1c19jaGVjazsKKwl1bnNpZ25lZCBsb25nIHN0YXR1c19jaGVja19pbnRlcnZhbDsKKwlzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX3N0YXR1czEgc3RhdHVzMTsKKwlzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX3N0YXR1czIgc3RhdHVzMjsKK307CisKK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLDI9aTJjICh8LWFibGUpKS4iKTsKKworI2RlZmluZSBkcHJpbnRrKGxldmVsLHguLi4pIGlmIChsZXZlbCAmIGRlYnVnKSBwcmludGsoeCkKKyNkZWZpbmUgZGJ1Zm91dChiLGwsbSkge1wKKwkgICAgaW50IGk7IFwKKwkgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgXAorCSAgICAgICAgbSgiJTAyeCAiLGJbaV0pOyBcCit9CisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pIGRwcmludGsoMHgwMSxhcmdzKQorI2RlZmluZSBkZWJfaTJjKGFyZ3MuLi4pICBkcHJpbnRrKDB4MDIsYXJncykKKyNkZWZpbmUgZGViX2hhYihhcmdzLi4uKSAgZHByaW50aygweDA0LGFyZ3MpCisKKy8qIHRyYW5zZmVyIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBiY20zNTEwX3dyaXRlYnl0ZXMgKHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdGF0ZSwgdTggcmVnLCB1OCAqYnVmLCB1OCBsZW4pCit7CisJdTggYlsyNTZdOworCWludCBlcnI7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIC5mbGFncyA9IDAsIC5idWYgPSBiLCAubGVuID0gbGVuICsgMSB9OworCisJYlswXSA9IHJlZzsKKwltZW1jcHkoJmJbMV0sYnVmLGxlbik7CisKKwlkZWJfaTJjKCJpMmMgd3IgJTAyeDogIixyZWcpOworCWRidWZvdXQoYnVmLGxlbixkZWJfaTJjKTsKKwlkZWJfaTJjKCJcbiIpOworCisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisKKwkJZGViX2luZm8oIiVzOiBpMmMgd3JpdGUgZXJyb3IgKGFkZHIgJTAyeCwgcmVnICUwMngsIGVyciA9PSAlaSlcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIHJlZywgIGVycik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfcmVhZGJ5dGVzIChzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgdTggKmJ1ZiwgdTggbGVuKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgICAgICAgIC5idWYgPSAmcmVnLCAubGVuID0gMSB9LAorCQl7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSBidWYsICAubGVuID0gbGVuIH0KKwl9OworCWludCBlcnI7CisKKwltZW1zZXQoYnVmLDAsbGVuKTsKKworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyIChzdGF0ZS0+aTJjLCBtc2csIDIpKSAhPSAyKSB7CisJCWRlYl9pbmZvKCIlczogaTJjIHJlYWQgZXJyb3IgKGFkZHIgJTAyeCwgcmVnICUwMngsIGVyciA9PSAlaSlcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsIHJlZywgIGVycik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlkZWJfaTJjKCJpMmMgcmQgJTAyeDogIixyZWcpOworCWRidWZvdXQoYnVmLGxlbixkZWJfaTJjKTsKKwlkZWJfaTJjKCJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF93cml0ZUIoc3RydWN0IGJjbTM1MTBfc3RhdGUgKnN0YXRlLCB1OCByZWcsIGJjbTM1MTBfcmVnaXN0ZXJfdmFsdWUgdikKK3sKKwlyZXR1cm4gYmNtMzUxMF93cml0ZWJ5dGVzKHN0YXRlLHJlZywmdi5yYXcsMSk7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF9yZWFkQihzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSAqc3RhdGUsIHU4IHJlZywgYmNtMzUxMF9yZWdpc3Rlcl92YWx1ZSAqdikKK3sKKwlyZXR1cm4gYmNtMzUxMF9yZWFkYnl0ZXMoc3RhdGUscmVnLCZ2LT5yYXcsMSk7Cit9CisKKy8qIEhvc3QgQWNjZXNzIEJ1ZmZlciB0cmFuc2ZlcnMgKi8KK3N0YXRpYyBpbnQgYmNtMzUxMF9oYWJfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdCwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwliY20zNTEwX3JlZ2lzdGVyX3ZhbHVlIHY7CisJaW50IHJldCxpOworCisJdi5IQUJBRFJfYTYuSEFCQURSID0gMDsKKwlpZiAoKHJldCA9IGJjbTM1MTBfd3JpdGVCKHN0LDB4YTYsdikpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKHJldCA9IGJjbTM1MTBfcmVhZEIoc3QsMHhhNywmdikpIDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWJ1ZltpXSA9IHYuSEFCREFUQV9hNzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF9oYWJfc2VuZF9yZXF1ZXN0KHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdCwgdTggKmJ1ZiwgaW50IGxlbikKK3sKKwliY20zNTEwX3JlZ2lzdGVyX3ZhbHVlIHYsaGFiOworCWludCByZXQsaTsKKwl1bnNpZ25lZCBsb25nIHQ7CisKKy8qIENoZWNrIGlmIGFueSBwcmV2aW91cyBIQUIgcmVxdWVzdCBzdGlsbCBuZWVkcyB0byBiZSBzZXJ2aWNlZCBieSB0aGUKKyAqIEFxdWlzaXRpb24gUHJvY2Vzc29yIGJlZm9yZSBzZW5kaW5nIG5ldyByZXF1ZXN0ICovCisJaWYgKChyZXQgPSBiY20zNTEwX3JlYWRCKHN0LDB4YTgsJnYpKSA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHYuSEFCU1RBVF9hOC5IQUJSKSB7CisJCWRlYl9pbmZvKCJIQUIgaXMgcnVubmluZyBhbHJlYWR5IC0gY2xlYXJpbmcgaXQuXG4iKTsKKwkJdi5IQUJTVEFUX2E4LkhBQlIgPSAwOworCQliY20zNTEwX3dyaXRlQihzdCwweGE4LHYpOworLy8JCXJldHVybiAtRUJVU1k7CisJfQorCisvKiBTZW5kIHRoZSBzdGFydCBIQUIgQWRkcmVzcyAoYXV0b21hdGljYWxseSBpbmNyZW1lbnRlZCBhZnRlciB3cml0ZSBvZgorICogSEFCREFUQSkgYW5kIHdyaXRlIHRoZSBIQUIgRGF0YSAqLworCWhhYi5IQUJBRFJfYTYuSEFCQURSID0gMDsKKwlpZiAoKHJldCA9IGJjbTM1MTBfd3JpdGVCKHN0LDB4YTYsaGFiKSkgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWhhYi5IQUJEQVRBX2E3ID0gYnVmW2ldOworCQlpZiAoKHJldCA9IGJjbTM1MTBfd3JpdGVCKHN0LDB4YTcsaGFiKSkgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKy8qIFNldCB0aGUgSEFCUiBiaXQgdG8gaW5kaWNhdGUgQVAgcmVxdWVzdCBpbiBwcm9ncmVzcyAoTEJIQUJSIGFsbG93cyBIQUJSIHRvCisgKiBiZSB3cml0dGVuKSAqLworCXYucmF3ID0gMDsgdi5IQUJTVEFUX2E4LkhBQlIgPSAxOyB2LkhBQlNUQVRfYTguTERIQUJSID0gMTsKKwlpZiAoKHJldCA9IGJjbTM1MTBfd3JpdGVCKHN0LDB4YTgsdikpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworLyogUG9sbGluZyBtZXRob2Q6IFdhaXQgdW50aWwgdGhlIEFQIGZpbmlzaGVzIHByb2Nlc3NpbmcgdGhlIEhBQiByZXF1ZXN0ICovCisJdCA9IGppZmZpZXMgKyAxKkhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0KSkgeworCQlkZWJfaW5mbygid2FpdGluZyBmb3IgSEFCIHRvIGNvbXBsZXRlXG4iKTsKKwkJbXNsZWVwKDEwKTsKKwkJaWYgKChyZXQgPSBiY20zNTEwX3JlYWRCKHN0LDB4YTgsJnYpKSA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWlmICghdi5IQUJTVEFUX2E4LkhBQlIpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlkZWJfaW5mbygic2VuZF9yZXF1ZXN0IGV4ZWN1dGlvbiB0aW1lZCBvdXQuXG4iKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludCBiY20zNTEwX2RvX2hhYl9jbWQoc3RydWN0IGJjbTM1MTBfc3RhdGUgKnN0LCB1OCBjbWQsIHU4IG1zZ2lkLCB1OCAqb2J1ZiwgdTggb2xlbiwgdTggKmlidWYsIHU4IGlsZW4pCit7CisJdTggb2Jbb2xlbisyXSxpYltpbGVuKzJdOworCWludCByZXQgPSAwOworCisJb2JbMF0gPSBjbWQ7CisJb2JbMV0gPSBtc2dpZDsKKwltZW1jcHkoJm9iWzJdLG9idWYsb2xlbik7CisKKwlkZWJfaGFiKCJoYWIgc25kOiAiKTsKKwlkYnVmb3V0KG9iLG9sZW4rMixkZWJfaGFiKTsKKwlkZWJfaGFiKCJcbiIpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc3QtPmhhYl9zZW0pIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAoKHJldCA9IGJjbTM1MTBfaGFiX3NlbmRfcmVxdWVzdChzdCwgb2IsIG9sZW4rMikpIDwgMCB8fAorCQkocmV0ID0gYmNtMzUxMF9oYWJfZ2V0X3Jlc3BvbnNlKHN0LCBpYiwgaWxlbisyKSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJZGViX2hhYigiaGFiIGdldDogIik7CisJZGJ1Zm91dChpYixpbGVuKzIsZGViX2hhYik7CisJZGViX2hhYigiXG4iKTsKKworCW1lbWNweShpYnVmLCZpYlsyXSxpbGVuKTsKK2Vycm9yOgorCXVwKCZzdC0+aGFiX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworI2lmIDAKKy8qIG5vdCBuZWVkZWQsIHdlIHVzZSBhIHNlbWFwaG9yZSB0byBwcmV2ZW50IEhBQiByYWNlcyAqLworc3RhdGljIGludCBiY20zNTEwX2lzX2FwX3JlYWR5KHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdCkKK3sKKwliY20zNTEwX3JlZ2lzdGVyX3ZhbHVlIGFwLGhhYjsKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBiY20zNTEwX3JlYWRCKHN0LDB4YTgsJmhhYikpIDwgMCB8fAorCQkocmV0ID0gYmNtMzUxMF9yZWFkQihzdCwweGEyLCZhcCkgPCAwKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhcC5BUFNUQVQxX2EyLlJFU0VUIHx8IGFwLkFQU1RBVDFfYTIuSURMRSB8fCBhcC5BUFNUQVQxX2EyLlNUT1AgfHwgaGFiLkhBQlNUQVRfYTguSEFCUikgeworCQlkZWJfaW5mbygiQVAgaXMgYnVzeVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBiY20zNTEwX2JlcnRfcmVzZXQoc3RydWN0IGJjbTM1MTBfc3RhdGUgKnN0KQoreworCWJjbTM1MTBfcmVnaXN0ZXJfdmFsdWUgYjsKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPCBiY20zNTEwX3JlYWRCKHN0LDB4ZmEsJmIpKSA8IDApCisJCXJldHVybiByZXQ7CisKKwliLkJFUkNUTF9mYS5SRVNZTkMgPSAwOyBiY20zNTEwX3dyaXRlQihzdCwweGZhLGIpOworCWIuQkVSQ1RMX2ZhLlJFU1lOQyA9IDE7IGJjbTM1MTBfd3JpdGVCKHN0LDB4ZmEsYik7CisJYi5CRVJDVExfZmEuUkVTWU5DID0gMDsgYmNtMzUxMF93cml0ZUIoc3QsMHhmYSxiKTsKKwliLkJFUkNUTF9mYS5DTlRDVEwgPSAxOyBiLkJFUkNUTF9mYS5CSVRDTlQgPSAxOyBiY20zNTEwX3dyaXRlQihzdCwweGZhLGIpOworCisJLyogY2xlYXIgcmVzaWR1YWwgYml0IGNvdW50ZXIgVE9ETyAgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20zNTEwX3JlZnJlc2hfc3RhdGUoc3RydWN0IGJjbTM1MTBfc3RhdGUgKnN0KQoreworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsc3QtPm5leHRfc3RhdHVzX2NoZWNrKSkgeworCQliY20zNTEwX2RvX2hhYl9jbWQoc3QsIENNRF9TVEFUVVMsIE1TR0lEX1NUQVRVUzEsIE5VTEwsMCwgKHU4ICopJnN0LT5zdGF0dXMxLCBzaXplb2Yoc3QtPnN0YXR1czEpKTsKKwkJYmNtMzUxMF9kb19oYWJfY21kKHN0LCBDTURfU1RBVFVTLCBNU0dJRF9TVEFUVVMyLCBOVUxMLDAsICh1OCAqKSZzdC0+c3RhdHVzMiwgc2l6ZW9mKHN0LT5zdGF0dXMyKSk7CisJCXN0LT5uZXh0X3N0YXR1c19jaGVjayA9IGppZmZpZXMgKyAoc3QtPnN0YXR1c19jaGVja19pbnRlcnZhbCpIWikvMTAwMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSogc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwliY20zNTEwX3JlZnJlc2hfc3RhdGUoc3QpOworCisJKnN0YXR1cyA9IDA7CisJaWYgKHN0LT5zdGF0dXMxLlNUQVRVUzEuUkVDRUlWRVJfTE9DSykKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSyB8IEZFX0hBU19TWU5DOworCisJaWYgKHN0LT5zdGF0dXMxLlNUQVRVUzEuRkVDX0xPQ0spCisJCSpzdGF0dXMgfD0gRkVfSEFTX1ZJVEVSQkk7CisKKwlpZiAoc3QtPnN0YXR1czEuU1RBVFVTMS5PVVRfUExMX0xPQ0spCisJCSpzdGF0dXMgfD0gRkVfSEFTX1NJR05BTCB8IEZFX0hBU19DQVJSSUVSOworCisJaWYgKCpzdGF0dXMgJiBGRV9IQVNfTE9DSykKKwkJc3QtPnN0YXR1c19jaGVja19pbnRlcnZhbCA9IDE1MDA7CisJZWxzZSAvKiBtb3JlIGZyZXF1ZW50bHkgY2hlY2tzIGlmIG5vIGxvY2sgaGFzIGJlZW4gYWNoaWV2ZWQgeWV0ICovCisJCXN0LT5zdGF0dXNfY2hlY2tfaW50ZXJ2YWwgPSA1MDA7CisKKwlkZWJfaW5mbygicmVhbF9zdGF0dXM6ICUwMnhcbiIsKnN0YXR1cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF9yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiBiZXIpCit7CisJc3RydWN0IGJjbTM1MTBfc3RhdGUqIHN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJYmNtMzUxMF9yZWZyZXNoX3N0YXRlKHN0KTsKKworCSpiZXIgPSAoc3QtPnN0YXR1czIuTERCRVIwIDw8IDE2KSB8IChzdC0+c3RhdHVzMi5MREJFUjEgPDwgOCkgfCBzdC0+c3RhdHVzMi5MREJFUjI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF9yZWFkX3VuYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1bmMpCit7CisJc3RydWN0IGJjbTM1MTBfc3RhdGUqIHN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJYmNtMzUxMF9yZWZyZXNoX3N0YXRlKHN0KTsKKwkqdW5jID0gKHN0LT5zdGF0dXMyLkxEVUVSQzAgPDwgOCkgfCBzdC0+c3RhdHVzMi5MRFVFUkMxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCit7CisJc3RydWN0IGJjbTM1MTBfc3RhdGUqIHN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJczMyIHQ7CisKKwliY20zNTEwX3JlZnJlc2hfc3RhdGUoc3QpOworCXQgPSBzdC0+c3RhdHVzMi5TSUdOQUw7CisKKwlpZiAodCA+IDE5MCkKKwkJdCA9IDE5MDsKKwlpZiAodCA8IDkwKQorCQl0ID0gOTA7CisKKwl0IC09IDkwOworCXQgPSB0ICogMHhmZiAvIDEwMDsKKwkvKiBub3JtYWxpemUgaWYgbmVjZXNzYXJ5ICovCisJKnN0cmVuZ3RoID0gKHQgPDwgOCkgfCB0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfcmVhZF9zbnIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc25yKQoreworCXN0cnVjdCBiY20zNTEwX3N0YXRlKiBzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWJjbTM1MTBfcmVmcmVzaF9zdGF0ZShzdCk7CisKKwkqc25yID0gc3QtPnN0YXR1czEuU05SX0VTVDAqMTAwMCArICgoc3QtPnN0YXR1czEuU05SX0VTVDEqMTAwMCkgPj4gOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHR1bmVyIGZyb250ZW5kIHByb2dyYW1taW5nICovCitzdGF0aWMgaW50IGJjbTM1MTBfdHVuZXJfY21kKHN0cnVjdCBiY20zNTEwX3N0YXRlKiBzdCx1OCBiYywgdTE2IG4sIHU4IGEpCit7CisJc3RydWN0IGJjbTM1MTBfaGFiX2NtZF90dW5lIGM7CisJbWVtc2V0KCZjLDAsc2l6ZW9mKHN0cnVjdCBiY20zNTEwX2hhYl9jbWRfdHVuZSkpOworCisvKiBJMkMgTW9kZSBkaXNhYmxlZCwgIHNldCAxNiBjb250cm9sIC8gRGF0YSBwYWlycyAqLworCWMubGVuZ3RoID0gMHgxMDsKKwljLmNsb2NrX3dpZHRoID0gMDsKKy8qIENTMSwgQ1MwLCBEQVRBLCBDTEsgYml0cyBjb250cm9sIHRoZSB0dW5lciBSRl9BR0NfU0VMIHBpbiBpcyBzZXQgdG8KKyAqIGxvZ2ljIGhpZ2ggKGFzIENvbmZpZ3VyYXRpb24pICovCisJYy5taXNjID0gMHgxMDsKKy8qIFNldCBkdXJhdGlvbiBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBUVU5DVEwgPSAzLjM0IG1pY3JvIFNlYyAqLworCWMuVFVOQ1RMX3N0YXRlID0gMHg0MDsKKworLyogUFJFU0NBTEVSIERFVklERSBSQVRJTyB8IEJDMV8yXzNfNDsgKGJhbmQgc3dpdGNoKSwgMXN0b3NjIFJFRkVSRU5DRSBDT1VOVEVSIFJFRl9TMTIgYW5kIFJFRl9TMTEgKi8KKwljLmN0bF9kYXRbMF0uY3RybC5zaXplID0gQklUU184OworCWMuY3RsX2RhdFswXS5kYXRhICAgICAgPSAweDgwIHwgYmM7CisKKy8qIENvbnRyb2wgREFUQSBwaW4sIDFzdG9zYyBSRUZFUkVOQ0UgQ09VTlRFUiBSRUZfUzEwIHRvIFJFRl9TMyAqLworCWMuY3RsX2RhdFsxXS5jdHJsLnNpemUgPSBCSVRTXzg7CisJYy5jdGxfZGF0WzFdLmRhdGEgICAgICA9IDQ7CisKKy8qIHNldCBDT05UUk9MIEJJVCAxIHRvIDEsIDFzdG9zYyBSRUZFUkVOQ0UgQ09VTlRFUiBSRUZfUzIgdG8gUkVGX1MxICovCisJYy5jdGxfZGF0WzJdLmN0cmwuc2l6ZSA9IEJJVFNfMzsKKwljLmN0bF9kYXRbMl0uZGF0YSAgICAgID0gMHgyMDsKKworLyogY29udHJvbCBDUzAgcGluLCBwdWxzZSBieXRlID8gKi8KKwljLmN0bF9kYXRbM10uY3RybC5zaXplID0gQklUU18zOworCWMuY3RsX2RhdFszXS5jdHJsLmNsa19vZmYgPSAxOworCWMuY3RsX2RhdFszXS5jdHJsLmNzMCAgPSAxOworCWMuY3RsX2RhdFszXS5kYXRhICAgICAgPSAweDQwOworCisvKiBQR01fUzE4IHRvIFBHTV9TMTEgKi8KKwljLmN0bF9kYXRbNF0uY3RybC5zaXplID0gQklUU184OworCWMuY3RsX2RhdFs0XS5kYXRhICAgICAgPSBuID4+IDM7CisKKy8qIFBHTV9TMTAgdG8gUEdNX1M4LCBTV0xfUzcgdG8gU1dMX1MzICovCisJYy5jdGxfZGF0WzVdLmN0cmwuc2l6ZSA9IEJJVFNfODsKKwljLmN0bF9kYXRbNV0uZGF0YSAgICAgID0gKChuICYgMHg3KSA8PCA1KSB8IChhID4+IDIpOworCisvKiBTV0xfUzIgYW5kIFNXTF9TMSwgc2V0IENPTlRST0wgQklUIDIgdG8gMCAqLworCWMuY3RsX2RhdFs2XS5jdHJsLnNpemUgPSBCSVRTXzM7CisJYy5jdGxfZGF0WzZdLmRhdGEgICAgICA9IChhIDw8IDYpICYgMHhkZjsKKworLyogY29udHJvbCBDUzAgcGluLCBwdWxzZSBieXRlID8gKi8KKwljLmN0bF9kYXRbN10uY3RybC5zaXplID0gQklUU18zOworCWMuY3RsX2RhdFs3XS5jdHJsLmNsa19vZmYgPSAxOworCWMuY3RsX2RhdFs3XS5jdHJsLmNzMCAgPSAxOworCWMuY3RsX2RhdFs3XS5kYXRhICAgICAgPSAweDQwOworCisvKiBQUkVTQ0FMRVIgREVWSURFIFJBVElPLCAybmRvc2MgUkVGRVJFTkNFIENPVU5URVIgUkVGX1MxMiBhbmQgUkVGX1MxMSAqLworCWMuY3RsX2RhdFs4XS5jdHJsLnNpemUgPSBCSVRTXzg7CisJYy5jdGxfZGF0WzhdLmRhdGEgICAgICA9IDB4ODA7CisKKy8qIDJuZG9zYyBSRUZFUkVOQ0UgQ09VTlRFUiBSRUZfUzEwIHRvIFJFRl9TMyAqLworCWMuY3RsX2RhdFs5XS5jdHJsLnNpemUgPSBCSVRTXzg7CisJYy5jdGxfZGF0WzldLmRhdGEgICAgICA9IDB4MTA7CisKKy8qIHNldCBDT05UUk9MIEJJVCAxIHRvIDEsIDJuZG9zYyBSRUZFUkVOQ0UgQ09VTlRFUiBSRUZfUzIgdG8gUkVGX1MxICovCisJYy5jdGxfZGF0WzEwXS5jdHJsLnNpemUgPSBCSVRTXzM7CisJYy5jdGxfZGF0WzEwXS5kYXRhICAgICAgPSAweDIwOworCisvKiBwdWxzZSBieXRlICovCisJYy5jdGxfZGF0WzExXS5jdHJsLnNpemUgPSBCSVRTXzM7CisJYy5jdGxfZGF0WzExXS5jdHJsLmNsa19vZmYgPSAxOworCWMuY3RsX2RhdFsxMV0uY3RybC5jczEgID0gMTsKKwljLmN0bF9kYXRbMTFdLmRhdGEgICAgICA9IDB4NDA7CisKKy8qIFBHTV9TMTggdG8gUEdNX1MxMSAqLworCWMuY3RsX2RhdFsxMl0uY3RybC5zaXplID0gQklUU184OworCWMuY3RsX2RhdFsxMl0uZGF0YSAgICAgID0gMHgyYTsKKworLyogUEdNX1MxMCB0byBQR01fUzggYW5kIFNXTF9TNyB0byBTV0xfUzMgKi8KKwljLmN0bF9kYXRbMTNdLmN0cmwuc2l6ZSA9IEJJVFNfODsKKwljLmN0bF9kYXRbMTNdLmRhdGEgICAgICA9IDB4OGU7CisKKy8qIFNXTF9TMiBhbmQgU1dMX1MxIGFuZCBzZXQgQ09OVFJPTCBCSVQgMiB0byAwICovCisJYy5jdGxfZGF0WzE0XS5jdHJsLnNpemUgPSBCSVRTXzM7CisJYy5jdGxfZGF0WzE0XS5kYXRhICAgICAgPSAwOworCisvKiBQdWxzZSBCeXRlICovCisJYy5jdGxfZGF0WzE1XS5jdHJsLnNpemUgPSBCSVRTXzM7CisJYy5jdGxfZGF0WzE1XS5jdHJsLmNsa19vZmYgPSAxOworCWMuY3RsX2RhdFsxNV0uY3RybC5jczEgID0gMTsKKwljLmN0bF9kYXRbMTVdLmRhdGEgICAgICA9IDB4NDA7CisKKwlyZXR1cm4gYmNtMzUxMF9kb19oYWJfY21kKHN0LENNRF9UVU5FLCBNU0dJRF9UVU5FLCh1OCAqKSAmYyxzaXplb2YoYyksIE5VTEwsIDApOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfc2V0X2ZyZXEoc3RydWN0IGJjbTM1MTBfc3RhdGUqIHN0LHUzMiBmcmVxKQoreworCXU4IGJjLGE7CisJdTE2IG47CisJczMyIFlJbnRlcmNlcHQsVGZ2Y28xOworCisJZnJlcSAvPSAxMDAwOworCisJZGViX2luZm8oIiVka0h6OiIsZnJlcSk7CisJLyogc2V0IEJhbmQgU3dpdGNoICovCisJaWYgKGZyZXEgPD0gMTY4MDAwKQorCQliYyA9IDB4MWM7CisJZWxzZSBpZiAoZnJlcSA8PSAzNzgwMDApCisJCWJjID0gMHgyYzsKKwllbHNlCisJCWJjID0gMHgzMDsKKworCWlmIChmcmVxID49IDQ3MDAwMCkgeworCQlmcmVxIC09IDQ3MDAwMTsKKwkJWUludGVyY2VwdCA9IDE4ODA1OworCX0gZWxzZSBpZiAoZnJlcSA+PSA5MDAwMCkgeworCQlmcmVxIC09IDkwMDAxOworCQlZSW50ZXJjZXB0ID0gMTUwMDU7CisJfSBlbHNlIGlmIChmcmVxID49IDc2MDAwKXsKKwkJZnJlcSAtPSA3NjAwMTsKKwkJWUludGVyY2VwdCA9IDE0ODY1OworCX0gZWxzZSB7CisJCWZyZXEgLT0gNTQwMDE7CisJCVlJbnRlcmNlcHQgPSAxNDY0NTsKKwl9CisKKwlUZnZjbzEgPSAoKChmcmVxLzYwMDApKjYwICsgWUludGVyY2VwdCkqNCkvMTA7CisKKwluID0gVGZ2Y28xID4+IDY7CisJYSA9IFRmdmNvMSAmIDB4M2Y7CisKKwlkZWJfaW5mbygiIEJDMV8yXzNfNDogJXgsIE46ICV4IEE6ICV4XG4iLCBiYywgbiwgYSk7CisJaWYgKG4gPj0gMTYgJiYgbiA8PSAyMDQ3KQorCQlyZXR1cm4gYmNtMzUxMF90dW5lcl9jbWQoc3QsYmMsbixhKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCQkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSogc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX2V4dF9hY3F1aXJlIGNtZDsKKwlzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX2JlcnRfY29udHJvbCBiZXJ0OworCWludCByZXQ7CisKKwltZW1zZXQoJmNtZCwwLHNpemVvZihjbWQpKTsKKwlzd2l0Y2ggKHAtPnUudnNiLm1vZHVsYXRpb24pIHsKKwkJY2FzZSBRQU1fMjU2OgorCQkJY21kLkFDUVVJUkUwLk1PREUgPSAweDE7CisJCQljbWQuQUNRVUlSRTEuU1lNX1JBVEUgPSAweDE7CisJCQljbWQuQUNRVUlSRTEuSUZfRlJFUSA9IDB4MTsKKwkJCWJyZWFrOworCQljYXNlIFFBTV82NDoKKwkJCWNtZC5BQ1FVSVJFMC5NT0RFID0gMHgyOworCQkJY21kLkFDUVVJUkUxLlNZTV9SQVRFID0gMHgyOworCQkJY21kLkFDUVVJUkUxLklGX0ZSRVEgPSAweDE7CisJCQlicmVhazsKKy8qCQljYXNlIFFBTV8yNTY6CisJCQljbWQuQUNRVUlSRTAuTU9ERSA9IDB4MzsKKwkJCWJyZWFrOworCQljYXNlIFFBTV8xMjg6CisJCQljbWQuQUNRVUlSRTAuTU9ERSA9IDB4NDsKKwkJCWJyZWFrOworCQljYXNlIFFBTV82NDoKKwkJCWNtZC5BQ1FVSVJFMC5NT0RFID0gMHg1OworCQkJYnJlYWs7CisJCWNhc2UgUUFNXzMyOgorCQkJY21kLkFDUVVJUkUwLk1PREUgPSAweDY7CisJCQlicmVhazsKKwkJY2FzZSBRQU1fMTY6CisJCQljbWQuQUNRVUlSRTAuTU9ERSA9IDB4NzsKKwkJCWJyZWFrOyovCisJCWNhc2UgVlNCXzg6CisJCQljbWQuQUNRVUlSRTAuTU9ERSA9IDB4ODsKKwkJCWNtZC5BQ1FVSVJFMS5TWU1fUkFURSA9IDB4MDsKKwkJCWNtZC5BQ1FVSVJFMS5JRl9GUkVRID0gMHgwOworCQkJYnJlYWs7CisJCWNhc2UgVlNCXzE2OgorCQkJY21kLkFDUVVJUkUwLk1PREUgPSAweDk7CisJCQljbWQuQUNRVUlSRTEuU1lNX1JBVEUgPSAweDA7CisJCQljbWQuQUNRVUlSRTEuSUZfRlJFUSA9IDB4MDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX07CisJY21kLkFDUVVJUkUwLk9GRlNFVCA9IDA7CisJY21kLkFDUVVJUkUwLk5UU0NTV0VFUCA9IDE7CisJY21kLkFDUVVJUkUwLkZBID0gMTsKKwljbWQuQUNRVUlSRTAuQlcgPSAwOworCisvKglpZiAoZW5hYmxlT2Zmc2V0KSB7CisJCWNtZC5JRl9PRkZTRVQwID0geHg7CisJCWNtZC5JRl9PRkZTRVQxID0geHg7CisKKwkJY21kLlNZTV9PRkZTRVQwID0geHg7CisJCWNtZC5TWU1fT0ZGU0VUMSA9IHh4OworCQlpZiAoZW5hYmxlTnRzY1N3ZWVwKSB7CisJCQljbWQuTlRTQ19PRkZTRVQwOworCQkJY21kLk5UU0NfT0ZGU0VUMTsKKwkJfQorCX0gKi8KKwliY20zNTEwX2RvX2hhYl9jbWQoc3QsIENNRF9BQ1FVSVJFLCBNU0dJRF9FWFRfVFVORVJfQUNRVUlSRSwgKHU4ICopICZjbWQsIHNpemVvZihjbWQpLCBOVUxMLCAwKTsKKworLyogZG9pbmcgaXQgd2l0aCBkaWZmZXJlbnQgTVNHSURzLCBkYXRhIGJvb2sgYW5kIHNvdXJjZSBkaWZmZXJzICovCisJYmVydC5CRSA9IDA7CisJYmVydC51bnVzZWQgPSAwOworCWJjbTM1MTBfZG9faGFiX2NtZChzdCwgQ01EX1NUQVRFX0NPTlRST0wsIE1TR0lEX0JFUlRfQ09OVFJPTCwgKHU4ICopICZiZXJ0LCBzaXplb2YoYmVydCksIE5VTEwsIDApOworCWJjbTM1MTBfZG9faGFiX2NtZChzdCwgQ01EX1NUQVRFX0NPTlRST0wsIE1TR0lEX0JFUlRfU0VULCAodTggKikgJmJlcnQsIHNpemVvZihiZXJ0KSwgTlVMTCwgMCk7CisKKwliY20zNTEwX2JlcnRfcmVzZXQoc3QpOworCisJaWYgKChyZXQgPSBiY20zNTEwX3NldF9mcmVxKHN0LHAtPmZyZXF1ZW5jeSkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1lbXNldCgmc3QtPnN0YXR1czEsMCxzaXplb2Yoc3QtPnN0YXR1czEpKTsKKwltZW1zZXQoJnN0LT5zdGF0dXMyLDAsc2l6ZW9mKHN0LT5zdGF0dXMyKSk7CisJc3QtPnN0YXR1c19jaGVja19pbnRlcnZhbCA9IDUwMDsKKworLyogR2l2ZSB0aGUgQVAgc29tZSB0aW1lICovCisJbXNsZWVwKDIwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20zNTEwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqcykKK3sKKwlzLT5taW5fZGVsYXlfbXMgPSAxMDAwOworCXMtPnN0ZXBfc2l6ZSA9IDA7CisJcy0+bWF4X2RyaWZ0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtMzUxMF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCBiY20zNTEwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworLyogZmlybXdhcmUgZG93bmxvYWQ6CisgKiBmaXJtd2FyZSBmaWxlIGlzIGJ1aWxkIHVwIGxpa2UgdGhpczoKKyAqIDE2Yml0IGFkZHIsIDE2Yml0IGxlbmd0aCwgOGJ5dGUgb2YgbGVuZ3RoCisgKi8KKyNkZWZpbmUgQkNNMzUxMF9ERUZBVUxUX0ZJUk1XQVJFICJkdmItZmUtYmNtMzUxMC0wMS5mdyIKKworc3RhdGljIGludCBiY20zNTEwX3dyaXRlX3JhbShzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSAqc3QsIHUxNiBhZGRyLCB1OCAqYiwgdTE2IGxlbikKK3sKKwlpbnQgcmV0ID0gMCxpOworCWJjbTM1MTBfcmVnaXN0ZXJfdmFsdWUgdkgsIHZMLHZEOworCisJdkguTUFEUkhfYTkgPSBhZGRyID4+IDg7CisJdkwuTUFEUkxfYWEgPSBhZGRyOworCWlmICgocmV0ID0gYmNtMzUxMF93cml0ZUIoc3QsMHhhOSx2SCkpIDwgMCkgcmV0dXJuIHJldDsKKwlpZiAoKHJldCA9IGJjbTM1MTBfd3JpdGVCKHN0LDB4YWEsdkwpKSA8IDApIHJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdkQuTURBVEFfYWIgPSBiW2ldOworCQlpZiAoKHJldCA9IGJjbTM1MTBfd3JpdGVCKHN0LDB4YWIsdkQpKSA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGJjbTM1MTBfc3RhdGUqIHN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwl1MTYgYWRkcixsZW47CisJdTggICpiOworCWludCByZXQsaTsKKworCWRlYl9pbmZvKCJyZXF1ZXN0aW5nIGZpcm13YXJlXG4iKTsKKwlpZiAoKHJldCA9IHN0LT5jb25maWctPnJlcXVlc3RfZmlybXdhcmUoZmUsICZmdywgQkNNMzUxMF9ERUZBVUxUX0ZJUk1XQVJFKSkgPCAwKSB7CisJCWVycigiY291bGQgbm90IGxvYWQgZmlybXdhcmUgKCVzKTogJWQiLEJDTTM1MTBfREVGQVVMVF9GSVJNV0FSRSxyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZWJfaW5mbygiZ290IGZpcm13YXJlOiAlZFxuIixmdy0+c2l6ZSk7CisKKwliID0gZnctPmRhdGE7CisJZm9yIChpID0gMDsgaSA8IGZ3LT5zaXplOykgeworCQlhZGRyID0gbGUxNl90b19jcHUoICooICh1MTYgKikmYltpXSApICk7CisJCWxlbiAgPSBsZTE2X3RvX2NwdSggKiggKHUxNiAqKSZiW2krMl0gKSApOworCQlkZWJfaW5mbygiZmlybXdhcmUgY2h1bmssIGFkZHI6IDB4JTA0eCwgbGVuOiAweCUwNHgsIHRvdGFsIGxlbmd0aDogMHglMDR4XG4iLGFkZHIsbGVuLGZ3LT5zaXplKTsKKwkJaWYgKChyZXQgPSBiY20zNTEwX3dyaXRlX3JhbShzdCxhZGRyLCZiW2krNF0sbGVuKSkgPCAwKSB7CisJCQllcnIoImZpcm13YXJlIGRvd25sb2FkIGZhaWxlZDogJWRcbiIscmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaSArPSA0ICsgbGVuOworCX0KKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlkZWJfaW5mbygiZmlybXdhcmUgZG93bmxvYWQgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMzUxMF9jaGVja19maXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdCkKK3sKKwlzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX2dldF92ZXJzaW9uX2luZm8gdmVyOworCWJjbTM1MTBfZG9faGFiX2NtZChzdCxDTURfR0VUX1ZFUlNJT05fSU5GTyxNU0dJRF9HRVRfVkVSU0lPTl9JTkZPLE5VTEwsMCwodTgqKSZ2ZXIsc2l6ZW9mKHZlcikpOworCisJZGViX2luZm8oIlZlcnNpb24gaW5mb3JtYXRpb246IDB4JTAyeCAweCUwMnggMHglMDJ4IDB4JTAyeFxuIiwKKwkJdmVyLm1pY3JvY29kZV92ZXJzaW9uLCB2ZXIuc2NyaXB0X3ZlcnNpb24sIHZlci5jb25maWdfdmVyc2lvbiwgdmVyLmRlbW9kX3ZlcnNpb24pOworCisJaWYgKHZlci5zY3JpcHRfdmVyc2lvbiA9PSBCQ00zNTEwX0RFRl9TQ1JJUFRfVkVSU0lPTiAmJgorCQl2ZXIuY29uZmlnX3ZlcnNpb24gPT0gQkNNMzUxMF9ERUZfQ09ORklHX1ZFUlNJT04gJiYKKwkJdmVyLmRlbW9kX3ZlcnNpb24gID09IEJDTTM1MTBfREVGX0RFTU9EX1ZFUlNJT04pCisJCXJldHVybiAwOworCisJZGViX2luZm8oInZlcnNpb24gY2hlY2sgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogKHVuKXJlc2V0dGluZyB0aGUgQVAgKi8KK3N0YXRpYyBpbnQgYmNtMzUxMF9yZXNldChzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSAqc3QpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nICB0OworCWJjbTM1MTBfcmVnaXN0ZXJfdmFsdWUgdjsKKworCWJjbTM1MTBfcmVhZEIoc3QsMHhhMCwmdik7IHYuSENUTDFfYTAuUkVTRVQgPSAxOworCWlmICgocmV0ID0gYmNtMzUxMF93cml0ZUIoc3QsMHhhMCx2KSkgPCAwKQorCQlyZXR1cm4gcmV0OworCisgICAgdCA9IGppZmZpZXMgKyAzKkhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0KSkgeworCQltc2xlZXAoMTApOworCQlpZiAoKHJldCA9IGJjbTM1MTBfcmVhZEIoc3QsMHhhMiwmdikpIDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHYuQVBTVEFUMV9hMi5SRVNFVCkKKwkJCXJldHVybiAwOworCX0KKwlkZWJfaW5mbygicmVzZXQgdGltZWQgb3V0XG4iKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3RhdGljIGludCBiY20zNTEwX2NsZWFyX3Jlc2V0KHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdCkKK3sKKwliY20zNTEwX3JlZ2lzdGVyX3ZhbHVlIHY7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHQ7CisKKwl2LnJhdyA9IDA7CisJaWYgKChyZXQgPSBiY20zNTEwX3dyaXRlQihzdCwweGEwLHYpKSA8IDApCisJCXJldHVybiByZXQ7CisKKyAgICB0ID0gamlmZmllcyArIDMqSFo7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHQpKSB7CisJCW1zbGVlcCgxMCk7CisJCWlmICgocmV0ID0gYmNtMzUxMF9yZWFkQihzdCwweGEyLCZ2KSkgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQkvKiB2ZXJpZnkgdGhhdCByZXNldCBpcyBjbGVhcmVkICovCisJCWlmICghdi5BUFNUQVQxX2EyLlJFU0VUKQorCQkJcmV0dXJuIDA7CisJfQorCWRlYl9pbmZvKCJyZXNldCBjbGVhciB0aW1lZCBvdXRcbiIpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IGJjbTM1MTBfaW5pdF9jb2xkKHN0cnVjdCBiY20zNTEwX3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCWJjbTM1MTBfcmVnaXN0ZXJfdmFsdWUgdjsKKworCS8qIHJlYWQgQWNxdWlzYXRpb24gUHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciBhbmQgY2hlY2sgaXQgaXMgbm90IGluIFJVTiBtb2RlICovCisJaWYgKChyZXQgPSBiY20zNTEwX3JlYWRCKHN0LDB4YTIsJnYpKSA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHYuQVBTVEFUMV9hMi5SVU4pIHsKKwkJZGViX2luZm8oIkFQIGlzIGFscmVhZHkgcnVubmluZyAtIGZpcm13YXJlIGFscmVhZHkgbG9hZGVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCWRlYl9pbmZvKCJyZXNldD9cbiIpOworCWlmICgocmV0ID0gYmNtMzUxMF9yZXNldChzdCkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRlYl9pbmZvKCJ0cmlzdGF0ZT9cbiIpOworCS8qIHRyaS1zdGF0ZSAqLworCXYuVFNUQ1RMXzJlLkNUTCA9IDA7CisJaWYgKChyZXQgPSBiY20zNTEwX3dyaXRlQihzdCwweDJlLHYpKSA8IDApCisJCXJldHVybiByZXQ7CisKKwlkZWJfaW5mbygiZmlybXdhcmU/XG4iKTsKKwlpZiAoKHJldCA9IGJjbTM1MTBfZG93bmxvYWRfZmlybXdhcmUoJnN0LT5mcm9udGVuZCkpIDwgMCB8fAorCQkocmV0ID0gYmNtMzUxMF9jbGVhcl9yZXNldChzdCkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGFueXRoaW5nIGxlZnQgaGVyZSB0byBMZXQgdGhlIGFjcXVpc2l0aW9uIHByb2Nlc3NvciBiZWdpbiBleGVjdXRpb24gYXQgcHJvZ3JhbSBjb3VudGVyIDAwMDAgPz8/ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20zNTEwX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IGJjbTM1MTBfc3RhdGUqIHN0ID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJYmNtMzUxMF9yZWdpc3Rlcl92YWx1ZSBqOworCXN0cnVjdCBiY20zNTEwX2hhYl9jbWRfc2V0X2FnYyBjOworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IGJjbTM1MTBfcmVhZEIoc3QsMHhjYSwmaikpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRlYl9pbmZvKCJKREVDOiAlMDJ4XG4iLGoucmF3KTsKKworCXN3aXRjaCAoai5KREVDX2NhLkpERUMpIHsKKwkJY2FzZSBKREVDX1dBSVRfQVRfUkFNOgorCQkJZGViX2luZm8oImF0dGVtcHRpbmcgdG8gZG93bmxvYWQgZmlybXdhcmVcbiIpOworCQkJaWYgKChyZXQgPSBiY20zNTEwX2luaXRfY29sZChzdCkpIDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQljYXNlIEpERUNfRUVQUk9NX0xPQURfV0FJVDogLyogZmFsbC10aHJvdWdoIGlzIHdhbnRlZCAqLworCQkJZGViX2luZm8oImZpcm13YXJlIGlzIGxvYWRlZFxuIik7CisJCQliY20zNTEwX2NoZWNrX2Zpcm13YXJlX3ZlcnNpb24oc3QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW1zZXQoJmMsMCwxKTsKKwljLlNFTCA9IDE7CisJYmNtMzUxMF9kb19oYWJfY21kKHN0LENNRF9BVVRPX1BBUkFNLE1TR0lEX1NFVF9SRl9BR0NfU0VMLCh1OCAqKSZjLHNpemVvZihjKSxOVUxMLDApOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGJjbTM1MTBfb3BzOworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBiY20zNTEwX2F0dGFjaChjb25zdCBzdHJ1Y3QgYmNtMzUxMF9jb25maWcgKmNvbmZpZywKKwkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSogc3RhdGUgPSBOVUxMOworCWludCByZXQ7CisJYmNtMzUxMF9yZWdpc3Rlcl92YWx1ZSB2OworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiY20zNTEwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKHN0cnVjdCBiY20zNTEwX3N0YXRlKSk7CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKworCXN0YXRlLT5jb25maWcgPSBjb25maWc7CisJc3RhdGUtPmkyYyA9IGkyYzsKKwltZW1jcHkoJnN0YXRlLT5vcHMsICZiY20zNTEwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisKKwlzZW1hX2luaXQoJnN0YXRlLT5oYWJfc2VtLCAxKTsKKworCWlmICgocmV0ID0gYmNtMzUxMF9yZWFkQihzdGF0ZSwweGUwLCZ2KSkgPCAwKQorCQlnb3RvIGVycm9yOworCisJZGViX2luZm8oIlJldmlzaW9uOiAweCUxeCwgTGF5ZXI6IDB4JTF4LlxuIix2LlJFVklEX2UwLlJFVix2LlJFVklEX2UwLkxBWUVSKTsKKworCWlmICgodi5SRVZJRF9lMC5SRVYgIT0gMHgxICYmIHYuUkVWSURfZTAuTEFZRVIgIT0gMHhiKSAmJiAvKiBjb2xkICovCisJCSh2LlJFVklEX2UwLlJFViAhPSAweDggJiYgdi5SRVZJRF9lMC5MQVlFUiAhPSAweDApKSAgIC8qIHdhcm0gKi8KKwkJZ290byBlcnJvcjsKKworCWluZm8oIlJldmlzaW9uOiAweCUxeCwgTGF5ZXI6IDB4JTF4LiIsdi5SRVZJRF9lMC5SRVYsdi5SRVZJRF9lMC5MQVlFUik7CisKKwliY20zNTEwX3Jlc2V0KHN0YXRlKTsKKworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOworCitlcnJvcjoKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGJjbTM1MTBfYXR0YWNoKTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGJjbTM1MTBfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lID0gIkJyb2FkY29tIEJDTTM1MTAgVlNCL1FBTSBmcm9udGVuZCIsCisJCS50eXBlID0gRkVfQVRTQywKKwkJLmZyZXF1ZW5jeV9taW4gPSAgNTQwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gODAzMDAwMDAwLAorICAgICAgICAgICAgICAgIC8qIHN0ZXBzaXplIGlzIGp1c3QgYSBndWVzcyAqLworCQkuZnJlcXVlbmN5X3N0ZXBzaXplID0gMCwKKwkJLmNhcHMgPQorCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCUZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQkJRkVfQ0FOXzhWU0IgfCBGRV9DQU5fMTZWU0IgfAorCQkJRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzEyOCB8IEZFX0NBTl9RQU1fMjU2CisJfSwKKworCS5yZWxlYXNlID0gYmNtMzUxMF9yZWxlYXNlLAorCisJLmluaXQgPSBiY20zNTEwX2luaXQsCisJLnNsZWVwID0gYmNtMzUxMF9zbGVlcCwKKworCS5zZXRfZnJvbnRlbmQgPSBiY20zNTEwX3NldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBiY20zNTEwX2dldF90dW5lX3NldHRpbmdzLAorCisJLnJlYWRfc3RhdHVzID0gYmNtMzUxMF9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgPSBiY20zNTEwX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGJjbTM1MTBfcmVhZF9zaWduYWxfc3RyZW5ndGgsCisJLnJlYWRfc25yID0gYmNtMzUxMF9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyA9IGJjbTM1MTBfcmVhZF91bmMsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIkJyb2FkY29tIEJDTTM1MTAgQVRTQyAoOFZTQi8xNlZTQiAmIElUVSBKODMgQW5uZXhCIEZFQyBRQU02NC8yNTYpIGRlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGY1ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIEJyb2FkY29tIEJDTTM1MTAgQVRTQyBkZW1vZHVsYXRvciAoMXN0IGdlbmVyYXRpb24gQWlyMlBDKQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEtNSwgQjJDMiBpbmMuCisgKgorICogIEdQTC9MaW51eCBkcml2ZXIgd3JpdHRlbiBieSBQYXRyaWNrIEJvZXR0Y2hlciA8cGF0cmljay5ib2V0dGNoZXJAZGVzeS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2lmbmRlZiBCQ00zNTEwX0gKKyNkZWZpbmUgQkNNMzUxMF9ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCitzdHJ1Y3QgYmNtMzUxMF9jb25maWcKK3sKKwkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiByZXF1ZXN0IGZpcm13YXJlIGZvciBkZXZpY2UgKi8KKwlpbnQgKCpyZXF1ZXN0X2Zpcm13YXJlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpOworfTsKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGJjbTM1MTBfYXR0YWNoKGNvbnN0IHN0cnVjdCBiY20zNTEwX2NvbmZpZyogY29uZmlnLAorCQkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTBfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTBfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjFiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMF9wcml2LmgKQEAgLTAsMCArMSw0NjAgQEAKKy8qCisgKiBTdXBwb3J0IGZvciB0aGUgQnJvYWRjb20gQkNNMzUxMCBBVFNDIGRlbW9kdWxhdG9yICgxc3QgZ2VuZXJhdGlvbiBBaXIyUEMpCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMS01LCBCMkMyIGluYy4KKyAqCisgKiAgR1BML0xpbnV4IGRyaXZlciB3cml0dGVuIGJ5IFBhdHJpY2sgQm9ldHRjaGVyIDxwYXRyaWNrLmJvZXR0Y2hlckBkZXN5LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaWZuZGVmIF9fQkNNMzUxMF9QUklWX0hfXworI2RlZmluZSBfX0JDTTM1MTBfUFJJVl9IX18KKworI2RlZmluZSBQQUNLRUQgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKworI3VuZGVmIGVycgorI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pICBwcmludGsoS0VSTl9FUlIgICAgICJiY20zNTEwOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI3VuZGVmIGluZm8KKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAgICAiYmNtMzUxMDogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyN1bmRlZiB3YXJuCisjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImJjbTM1MTA6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisKKworI2RlZmluZSBQQU5BU09OSUNfRklSU1RfSUZfQkFTRV9JTl9LSHogIDE0MDc1MDAKKyNkZWZpbmUgQkNNMzUxMF9TWU1CT0xfUkFURSAgICAgICAgICAgICA1MzgxMDAwCisKK3R5cGVkZWYgdW5pb24geworCXU4IHJhdzsKKworCXN0cnVjdCB7CisJCXU4IENUTCAgIDo4OworCX0gVFNUQ1RMXzJlOworCisJdTggTERDRVJDXzRlOworCXU4IExEVUVSQ180ZjsKKwl1OCBMRF9CRVIwXzY1OworCXU4IExEX0JFUjFfNjY7CisJdTggTERfQkVSMl82NzsKKwl1OCBMRF9CRVIzXzY4OworCisJc3RydWN0IHsKKwkJdTggUkVTRVQgOjE7CisJCXU4IElETEUgIDoxOworCQl1OCBTVE9QICA6MTsKKwkJdTggSElSUTAgOjE7CisJCXU4IEhJUlExIDoxOworCQl1OCBuYTAgICA6MTsKKwkJdTggSEFCQVYgOjE7CisJCXU4IG5hMSAgIDoxOworCX0gSENUTDFfYTA7CisKKwlzdHJ1Y3QgeworCQl1OCBuYTAgICAgOjE7CisJCXU4IElETE1TSyA6MTsKKwkJdTggU1RNU0sgIDoxOworCQl1OCBJME1TSyAgOjE7CisJCXU4IEkxTVNLICA6MTsKKwkJdTggbmExICAgIDoxOworCQl1OCBIQUJNU0sgOjE7CisJCXU4IG5hMiAgICA6MTsKKwl9IEhDVExNU0tfYTE7CisKKwlzdHJ1Y3QgeworCQl1OCBSRVNFVCAgOjE7CisJCXU4IElETEUgICA6MTsKKwkJdTggU1RPUCAgIDoxOworCQl1OCBSVU4gICAgOjE7CisJCXU4IEhBQkFWICA6MTsKKwkJdTggTUVNQVYgIDoxOworCQl1OCBBTERPTkUgOjE7CisJCXU4IFJFSVJRICA6MTsKKwl9IEFQU1RBVDFfYTI7CisKKwlzdHJ1Y3QgeworCQl1OCBSU1RNU0sgOjE7CisJCXU4IElNU0sgICA6MTsKKwkJdTggU01TSyAgIDoxOworCQl1OCBSTVNLICAgOjE7CisJCXU4IEhBQk1TSyA6MTsKKwkJdTggTUFWTVNLIDoxOworCQl1OCBBTERNU0sgOjE7CisJCXU4IFJFTVNLICA6MTsKKwl9IEFQTVNLMV9hMzsKKworCXU4IEFQU1RBVDJfYTQ7CisJdTggQVBNU0syX2E1OworCisJc3RydWN0IHsKKwkJdTggSEFCQURSIDo3OworCQl1OCBuYSAgICAgOjE7CisJfSBIQUJBRFJfYTY7CisKKwl1OCBIQUJEQVRBX2E3OworCisJc3RydWN0IHsKKwkJdTggSEFCUiAgIDoxOworCQl1OCBMREhBQlIgOjE7CisJCXU4IEFQTVNLICA6MTsKKwkJdTggSE1TSyAgIDoxOworCQl1OCBMRE1TSyAgOjE7CisJCXU4IG5hICAgICA6MzsKKwl9IEhBQlNUQVRfYTg7CisKKwl1OCBNQURSSF9hOTsKKwl1OCBNQURSTF9hYTsKKwl1OCBNREFUQV9hYjsKKworCXN0cnVjdCB7CisjZGVmaW5lIEpERUNfV0FJVF9BVF9SQU0gICAgICAweDcKKyNkZWZpbmUgSkRFQ19FRVBST01fTE9BRF9XQUlUIDB4NAorCQl1OCBKREVDICAgOjM7CisJCXU4IG5hICAgICA6NTsKKwl9IEpERUNfY2E7CisKKwlzdHJ1Y3QgeworCQl1OCBSRVYgICA6NDsKKwkJdTggTEFZRVIgOjQ7CisJfSBSRVZJRF9lMDsKKworCXN0cnVjdCB7CisJCXU4IHVuazAgICA6MTsKKwkJdTggQ05UQ1RMIDoxOworCQl1OCBCSVRDTlQgOjE7CisJCXU4IHVuazEgICA6MTsKKwkJdTggUkVTWU5DIDoxOworCQl1OCB1bmsyICAgOjM7CisJfSBCRVJDVExfZmE7CisKKwlzdHJ1Y3QgeworCQl1OCBDU0VMMCAgOjE7CisJCXU4IENMS0VEMCA6MTsKKwkJdTggQ1NFTDEgIDoxOworCQl1OCBDTEtFRDEgOjE7CisJCXU4IENMS0xFViA6MTsKKwkJdTggU1BJVkFSIDoxOworCQl1OCBuYSAgICAgOjI7CisJfSBUVU5TRVRfZmM7CisKKwlzdHJ1Y3QgeworCQl1OCBDTEsgICAgOjE7CisJCXU4IERBVEEgICA6MTsKKwkJdTggQ1MwICAgIDoxOworCQl1OCBDUzEgICAgOjE7CisJCXU4IEFHQ1NFTCA6MTsKKwkJdTggbmEwICAgIDoxOworCQl1OCBUVU5TRUwgOjE7CisJCXU4IG5hMSAgICA6MTsKKwl9IFRVTkNUTF9mZDsKKworCXU4IFRVTlNFTDBfZmU7CisJdTggVFVOU0VMMV9mZjsKKworfSBiY20zNTEwX3JlZ2lzdGVyX3ZhbHVlOworCisvKiBIQUIgY29tbWFuZHMgKi8KKworLyogdmVyc2lvbiAqLworI2RlZmluZSBDTURfR0VUX1ZFUlNJT05fSU5GTyAgIDB4M0QKKyNkZWZpbmUgTVNHSURfR0VUX1ZFUlNJT05fSU5GTyAweDE1CitzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX2dldF92ZXJzaW9uX2luZm8geworCXU4IG1pY3JvY29kZV92ZXJzaW9uOworCXU4IHNjcmlwdF92ZXJzaW9uOworCXU4IGNvbmZpZ192ZXJzaW9uOworCXU4IGRlbW9kX3ZlcnNpb247Cit9IFBBQ0tFRDsKKworI2RlZmluZSBCQ00zNTEwX0RFRl9NSUNST0NPREVfVkVSU0lPTiAweDBFCisjZGVmaW5lIEJDTTM1MTBfREVGX1NDUklQVF9WRVJTSU9OICAgIDB4MDYKKyNkZWZpbmUgQkNNMzUxMF9ERUZfQ09ORklHX1ZFUlNJT04gICAgMHgwMQorI2RlZmluZSBCQ00zNTEwX0RFRl9ERU1PRF9WRVJTSU9OICAgICAweEIxCisKKy8qIGFjcXVpcmUgKi8KKyNkZWZpbmUgQ01EX0FDUVVJUkUgICAgICAgICAgICAweDM4CisKKyNkZWZpbmUgTVNHSURfRVhUX1RVTkVSX0FDUVVJUkUgMHgwQQorc3RydWN0IGJjbTM1MTBfaGFiX2NtZF9leHRfYWNxdWlyZSB7CisJc3RydWN0IHsKKwkJdTggTU9ERSAgICAgIDo0OworCQl1OCBCVyAgICAgICAgOjE7CisJCXU4IEZBICAgICAgICA6MTsKKwkJdTggTlRTQ1NXRUVQIDoxOworCQl1OCBPRkZTRVQgICAgOjE7CisJfSBQQUNLRUQgQUNRVUlSRTA7IC8qIGNvbnRyb2xfYnl0ZSAqLworCisJc3RydWN0IHsKKwkJdTggSUZfRlJFUSAgOjM7CisJCXU4IHplcm8wICAgIDoxOworCQl1OCBTWU1fUkFURSA6MzsKKwkJdTggemVybzEgICAgOjE7CisJfSBQQUNLRUQgQUNRVUlSRTE7IC8qIHN5bV9pZiAqLworCisJdTggSUZfT0ZGU0VUMDsgICAvKiBJRl9PZmZzZXRfMTBoeiAqLworCXU4IElGX09GRlNFVDE7CisJdTggU1lNX09GRlNFVDA7ICAvKiBTeW1ib2xSYXRlT2Zmc2V0ICovCisJdTggU1lNX09GRlNFVDE7CisJdTggTlRTQ19PRkZTRVQwOyAvKiBOVFNDX09mZnNldF8xMGh6ICovCisJdTggTlRTQ19PRkZTRVQxOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTVNHSURfSU5UX1RVTkVSX0FDUVVJUkUgMHgwQgorc3RydWN0IGJjbTM1MTBfaGFiX2NtZF9pbnRfYWNxdWlyZSB7CisJc3RydWN0IHsKKwkJdTggTU9ERSAgICAgIDo0OworCQl1OCBCVyAgICAgICAgOjE7CisJCXU4IEZBICAgICAgICA6MTsKKwkJdTggTlRTQ1NXRUVQIDoxOworCQl1OCBPRkZTRVQgICAgOjE7CisJfSBQQUNLRUQgQUNRVUlSRTA7IC8qIGNvbnRyb2xfYnl0ZSAqLworCisJc3RydWN0IHsKKwkJdTggSUZfRlJFUSAgOjM7CisJCXU4IHplcm8wICAgIDoxOworCQl1OCBTWU1fUkFURSA6MzsKKwkJdTggemVybzEgICAgOjE7CisJfSBQQUNLRUQgQUNRVUlSRTE7IC8qIHN5bV9pZiAqLworCisJdTggVFVORVJfRlJFUTA7CisJdTggVFVORVJfRlJFUTE7CisJdTggVFVORVJfRlJFUTI7CisJdTggVFVORVJfRlJFUTM7CisJdTggSUZfT0ZGU0VUMDsgICAvKiBJRl9PZmZzZXRfMTBoeiAqLworCXU4IElGX09GRlNFVDE7CisJdTggU1lNX09GRlNFVDA7ICAvKiBTeW1ib2xSYXRlT2Zmc2V0ICovCisJdTggU1lNX09GRlNFVDE7CisJdTggTlRTQ19PRkZTRVQwOyAvKiBOVFNDX09mZnNldF8xMGh6ICovCisJdTggTlRTQ19PRkZTRVQxOworfSBQQUNLRUQ7CisKKy8qIG1vZGVzICovCisjZGVmaW5lIEJDTTM1MTBfUUFNMTYgICAgICAgICAgID0gICAweDAxCisjZGVmaW5lIEJDTTM1MTBfUUFNMzIgICAgICAgICAgID0gICAweDAyCisjZGVmaW5lIEJDTTM1MTBfUUFNNjQgICAgICAgICAgID0gICAweDAzCisjZGVmaW5lIEJDTTM1MTBfUUFNMTI4ICAgICAgICAgID0gICAweDA0CisjZGVmaW5lIEJDTTM1MTBfUUFNMjU2ICAgICAgICAgID0gICAweDA1CisjZGVmaW5lIEJDTTM1MTBfOFZTQiAgICAgICAgICAgID0gICAweDBCCisjZGVmaW5lIEJDTTM1MTBfMTZWU0IgICAgICAgICAgID0gICAweDBECisKKy8qIElGX0ZSRVFTICovCisjZGVmaW5lIEJDTTM1MTBfSUZfVEVSUkVTVFJJQUwgMHgwCisjZGVmaW5lIEJDTTM1MTBfSUZfQ0FCTEUgICAgICAgMHgxCisjZGVmaW5lIEJDTTM1MTBfSUZfVVNFX0NNRCAgICAgMHg3CisKKy8qIFNZTV9SQVRFICovCisjZGVmaW5lIEJDTTM1MTBfU1JfOFZTQiAgICAgICAgMHgwIC8qIDUzODExMTkgcy9zZWMgKi8KKyNkZWZpbmUgQkNNMzUxMF9TUl8yNTZRQU0gICAgICAweDEgLyogNTM2MDUzNyBzL3NlYyAqLworI2RlZmluZSBCQ00zNTEwX1NSXzE2UUFNICAgICAgIDB4MiAvKiA1MDU2OTcxIHMvc2VjICovCisjZGVmaW5lIEJDTTM1MTBfU1JfTUlTQyAgICAgICAgMHgzIC8qIDUwMDAwMDAgcy9zZWMgKi8KKyNkZWZpbmUgQkNNMzUxMF9TUl9VU0VfQ01EICAgICAweDcKKworLyogc3BlY2lhbCBzeW1ib2wgcmF0ZSAqLworI2RlZmluZSBDTURfU0VUX1ZBTFVFX05PVF9MSVNURUQgIDB4MmQKKyNkZWZpbmUgTVNHSURfU0VUX1NZTUJPTF9SQVRFX05PVF9MSVNURUQgMHgwYworc3RydWN0IGJjbTM1MTBfaGFiX2NtZF9zZXRfc3Jfbm90X2xpc3RlZCB7CisJdTggSE9TVF9TWU1fUkFURTA7CisJdTggSE9TVF9TWU1fUkFURTE7CisJdTggSE9TVF9TWU1fUkFURTI7CisJdTggSE9TVF9TWU1fUkFURTM7Cit9IFBBQ0tFRDsKKworLyogc3BlY2lhbCBJRiAqLworI2RlZmluZSBNU0dJRF9TRVRfSUZfRlJFUV9OT1RfTElTVEVEIDB4MGQKK3N0cnVjdCBiY20zNTEwX2hhYl9jbWRfc2V0X2lmX2ZyZXFfbm90X2xpc3RlZCB7CisJdTggSE9TVF9JRl9GUkVRMDsKKwl1OCBIT1NUX0lGX0ZSRVExOworCXU4IEhPU1RfSUZfRlJFUTI7CisJdTggSE9TVF9JRl9GUkVRMzsKK30gUEFDS0VEOworCisvKiBhdXRvIHJlYWNxdWlyZSAqLworI2RlZmluZSBDTURfQVVUT19QQVJBTSAgICAgICAweDJhCisjZGVmaW5lIE1TR0lEX0FVVE9fUkVBQ1FVSVJFIDB4MGUKK3N0cnVjdCBiY20zNTEwX2hhYl9jbWRfYXV0b19yZWFjcXVpcmUgeworCXU4IEFDUSAgICA6MTsgLyogb24vb2ZmKi8KKwl1OCB1bnVzZWQgOjc7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBNU0dJRF9TRVRfUkZfQUdDX1NFTCAweDEyCitzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX3NldF9hZ2MgeworCXU4IExWTCAgICA6MTsKKwl1OCB1bnVzZWQgOjY7CisJdTggU0VMICAgIDoxOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTVNHSURfU0VUX0FVVE9fSU5WRVJTSU9OIDB4MTQKK3N0cnVjdCBiY20zNTEwX2hhYl9jbWRfYXV0b19pbnZlcnNpb24geworCXU4IEFJICAgICA6MTsKKwl1OCB1bnVzZWQgOjc7Cit9IFBBQ0tFRDsKKworCisvKiBiZXJ0IGNvbnRyb2wgKi8KKyNkZWZpbmUgQ01EX1NUQVRFX0NPTlRST0wgIDB4MTIKKyNkZWZpbmUgTVNHSURfQkVSVF9DT05UUk9MIDB4MGUKKyNkZWZpbmUgTVNHSURfQkVSVF9TRVQgICAgIDB4ZmEKK3N0cnVjdCBiY20zNTEwX2hhYl9jbWRfYmVydF9jb250cm9sIHsKKwl1OCBCRSAgICAgOjE7CisJdTggdW51c2VkIDo3OworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTVNHSURfVFJJX1NUQVRFIDB4MmUKK3N0cnVjdCBiY20zNTEwX2hhYl9jbWRfdHJpX3N0YXRlIHsKKwl1OCBSRSA6MTsgLyogYS9kIHJhbSBwb3J0IHBpbnMgKi8KKwl1OCBQRSA6MTsgLyogYmF1ZCBjbG9jayBwaW4gKi8KKwl1OCBBQyA6MTsgLyogYS9kIGNsb2NrIHBpbiAqLworCXU4IEJFIDoxOyAvKiBiYXVkIGNsb2NrIHBpbiAqLworCXU4IHVudXNlZCA6NDsKK30gUEFDS0VEOworCisKKy8qIHR1bmUgKi8KKyNkZWZpbmUgQ01EX1RVTkUgICAweDM4CisjZGVmaW5lIE1TR0lEX1RVTkUgMHgxNgorc3RydWN0IGJjbTM1MTBfaGFiX2NtZF90dW5lX2N0cmxfZGF0YV9wYWlyIHsKKwlzdHJ1Y3QgeworI2RlZmluZSBCSVRTXzggMHgwNworI2RlZmluZSBCSVRTXzcgMHgwNgorI2RlZmluZSBCSVRTXzYgMHgwNQorI2RlZmluZSBCSVRTXzUgMHgwNAorI2RlZmluZSBCSVRTXzQgMHgwMworI2RlZmluZSBCSVRTXzMgMHgwMgorI2RlZmluZSBCSVRTXzIgMHgwMQorI2RlZmluZSBCSVRTXzEgMHgwMAorCQl1OCBzaXplICAgIDozOworCQl1OCB1bmsgICAgIDoyOworCQl1OCBjbGtfb2ZmIDoxOworCQl1OCBjczAgICAgIDoxOworCQl1OCBjczEgICAgIDoxOworCisJfSBQQUNLRUQgY3RybDsKKworCXU4IGRhdGE7Cit9IFBBQ0tFRDsKKworc3RydWN0IGJjbTM1MTBfaGFiX2NtZF90dW5lIHsKKwl1OCBsZW5ndGg7CisJdTggY2xvY2tfd2lkdGg7CisJdTggbWlzYzsKKwl1OCBUVU5DVExfc3RhdGU7CisKKwlzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX3R1bmVfY3RybF9kYXRhX3BhaXIgY3RsX2RhdFsxNl07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBDTURfU1RBVFVTICAgIDB4MzgKKyNkZWZpbmUgTVNHSURfU1RBVFVTMSAweDA4CitzdHJ1Y3QgYmNtMzUxMF9oYWJfY21kX3N0YXR1czEgeworCXN0cnVjdCB7CisJCXU4IEVRX01PREUgICAgICAgOjQ7CisJCXU4IHJlc2VydmVkICAgICAgOjI7CisJCXU4IFFSRSAgICAgICAgICAgOjE7IC8qIGlmIFFTRSBhbmQgdGhlIHNwZWN0cnVtIGlzIGludmVyc2VkICovCisJCXU4IFFTRSAgICAgICAgICAgOjE7IC8qIGF1dG9tYXRpYyBzcGVjdHJhbCBpbnZlcnNpb24gKi8KKwl9IFBBQ0tFRCBTVEFUVVMwOworCisJc3RydWN0IHsKKwkJdTggUkVDRUlWRVJfTE9DSyA6MTsKKwkJdTggRkVDX0xPQ0sgICAgICA6MTsKKwkJdTggT1VUX1BMTF9MT0NLICA6MTsKKwkJdTggcmVzZXJ2ZWQgICAgICA6NTsKKwl9IFBBQ0tFRCBTVEFUVVMxOworCisJc3RydWN0IHsKKwkJdTggcmVzZXJ2ZWQgICAgICA6MjsKKwkJdTggQlcgICAgICAgICAgICA6MTsKKwkJdTggTlRFICAgICAgICAgICA6MTsgLyogTlRTQyBmaWx0ZXIgc3dlZXAgZW5hYmxlZCAqLworCQl1OCBBUUkgICAgICAgICAgIDoxOyAvKiBjdXJyZW50bHkgYWNxdWlyaW5nICovCisJCXU4IEZBICAgICAgICAgICAgOjE7IC8qIGZhc3QgYWNxdWlzaXRpb24gKi8KKwkJdTggQVJJICAgICAgICAgICA6MTsgLyogYXV0byByZWFjcXVpcmUgKi8KKwkJdTggVEkgICAgICAgICAgICA6MTsgLyogcHJvZ3JhbW1pbmcgdGhlIHR1bmVyICovCisJfSBQQUNLRUQgU1RBVFVTMjsKKwl1OCBTVEFUVVMzOworCXU4IFNOUl9FU1QwOworCXU4IFNOUl9FU1QxOworCXU4IFRVTkVSX0ZSRVEwOworCXU4IFRVTkVSX0ZSRVExOworCXU4IFRVTkVSX0ZSRVEyOworCXU4IFRVTkVSX0ZSRVEzOworCXU4IFNZTV9SQVRFMDsKKwl1OCBTWU1fUkFURTE7CisJdTggU1lNX1JBVEUyOworCXU4IFNZTV9SQVRFMzsKKwl1OCBTWU1fT0ZGU0VUMDsKKwl1OCBTWU1fT0ZGU0VUMTsKKwl1OCBTWU1fRVJST1IwOworCXU4IFNZTV9FUlJPUjE7CisJdTggSUZfRlJFUTA7CisJdTggSUZfRlJFUTE7CisJdTggSUZfRlJFUTI7CisJdTggSUZfRlJFUTM7CisJdTggSUZfT0ZGU0VUMDsKKwl1OCBJRl9PRkZTRVQxOworCXU4IElGX0VSUk9SMDsKKwl1OCBJRl9FUlJPUjE7CisJdTggTlRTQ19GSUxURVIwOworCXU4IE5UU0NfRklMVEVSMTsKKwl1OCBOVFNDX0ZJTFRFUjI7CisJdTggTlRTQ19GSUxURVIzOworCXU4IE5UU0NfT0ZGU0VUMDsKKwl1OCBOVFNDX09GRlNFVDE7CisJdTggTlRTQ19FUlJPUjA7CisJdTggTlRTQ19FUlJPUjE7CisJdTggSU5UX0FHQ19MRVZFTDA7CisJdTggSU5UX0FHQ19MRVZFTDE7CisJdTggRVhUX0FHQ19MRVZFTDA7CisJdTggRVhUX0FHQ19MRVZFTDE7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBNU0dJRF9TVEFUVVMyIDB4MTQKK3N0cnVjdCBiY20zNTEwX2hhYl9jbWRfc3RhdHVzMiB7CisJc3RydWN0IHsKKwkJdTggRVFfTU9ERSAgOjQ7CisJCXU4IHJlc2VydmVkIDoyOworCQl1OCBRUkUgICAgICA6MTsKKwkJdTggUVNSICAgICAgOjE7CisJfSBQQUNLRUQgU1RBVFVTMDsKKwlzdHJ1Y3QgeworCQl1OCBSTCAgICAgICA6MTsKKwkJdTggRkwgICAgICAgOjE7CisJCXU4IE9MICAgICAgIDoxOworCQl1OCByZXNlcnZlZCA6NTsKKwl9IFBBQ0tFRCBTVEFUVVMxOworCXU4IFNZTUJPTF9SQVRFMDsKKwl1OCBTWU1CT0xfUkFURTE7CisJdTggU1lNQk9MX1JBVEUyOworCXU4IFNZTUJPTF9SQVRFMzsKKwl1OCBMRENFUkMwOworCXU4IExEQ0VSQzE7CisJdTggTERDRVJDMjsKKwl1OCBMRENFUkMzOworCXU4IExEVUVSQzA7CisJdTggTERVRVJDMTsKKwl1OCBMRFVFUkMyOworCXU4IExEVUVSQzM7CisJdTggTERCRVIwOworCXU4IExEQkVSMTsKKwl1OCBMREJFUjI7CisJdTggTERCRVIzOworCXN0cnVjdCB7CisJCXU4IE1PREVfVFlQRSA6NDsgLyogYWNxdWlyZSBtb2RlIDAgKi8KKwkJdTggcmVzZXJ2ZCAgIDo0OworCX0gTU9ERV9UWVBFOworCXU4IFNOUl9FU1QwOworCXU4IFNOUl9FU1QxOworCXU4IFNJR05BTDsKK30gUEFDS0VEOworCisjZGVmaW5lIENNRF9TRVRfUkZfQldfTk9UX0xJU1RFRCAgIDB4M2YKKyNkZWZpbmUgTVNHSURfU0VUX1JGX0JXX05PVF9MSVNURUQgMHgxMQorLyogVE9ETyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCmluZGV4IGY0YWE0NDEzLi45ZjYzOTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAkweDQ5LCAweDU2LAogCTB4NmIsIDB4MWUsCiAJMHhjOCwgMHgwMiwKLQkweGY4LCAweDAyLAogCTB4ZjksIDB4MDAsCiAJMHhmYSwgMHgwMCwKIAkweGZiLCAweDAwLApAQCAtMjAzLDcgKzIwMiw3IEBACiAJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKIAkvKiBzZXQgUExMICovCi0gICAgICAgIGN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgJjB4ZmUpOworCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgJjB4ZmUpOwogCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KSB7CiAJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwogCX0gZWxzZSBpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MpIHsKQEAgLTIxNyw3ICsyMTYsNyBAQAogCX0gZWxzZSB7CiAJCUJVRygpOwogCX0KLSAgICAgICAgY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSB8IDEpOworCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgfCAxKTsKIAogCS8qIHNldCBpbnZlcnNpb24gKi8KIAljeDIyNzAyX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwpAQCAtMjU2LDcgKzI1NSw3IEBACiAJCWN4MjI3MDJfd3JpdGVyZWcoc3RhdGUsIDB4MEIsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwgMHgwQikgJiAweGZjICk7CiAJCWN4MjI3MDJfd3JpdGVyZWcoc3RhdGUsIDB4MEMsIChjeDIyNzAyX3JlYWRyZWcoc3RhdGUsIDB4MEMpICYgMHhCRikgfCAweDQwICk7CiAJCWN4MjI3MDJfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MDEpOyAvKiBCZWdpbiBhcXVpc2l0aW9uICovCi0JCXByaW50aygiJXM6IEF1dG9kZXRlY3RpbmdcbiIsX19GVU5DVElPTl9fKTsKKwkJZHByaW50aygiJXM6IEF1dG9kZXRlY3RpbmdcbiIsX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNDcsMTAgKzM0NiwxMSBAQAogCWZvciAoaT0wOyBpPHNpemVvZihpbml0X3RhYik7IGkrPTIpCiAJCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCBpbml0X3RhYltpXSwgaW5pdF90YWJbaSsxXSk7CiAKKwljeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHhmOCwgKHN0YXRlLT5jb25maWctPm91dHB1dF9tb2RlIDw8IDEpICYgMHgwMik7CiAKIAkvKiBpbml0IFBMTCAqLwogCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCSAgICAgICAgY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4MEQsIGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwweDBEKSAmMHhmZSk7CisJCWN4MjI3MDJfd3JpdGVyZWcgKHN0YXRlLCAweDBELCBjeDIyNzAyX3JlYWRyZWcoc3RhdGUsMHgwRCkgJiAweGZlKTsKIAkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwogCQljeDIyNzAyX3dyaXRlcmVnIChzdGF0ZSwgMHgwRCwgY3gyMjcwMl9yZWFkcmVnKHN0YXRlLDB4MEQpIHwgMSk7CiAJfQpAQCAtNDQwLDggKzQ0MCwxMCBAQAogCiAJLyogUlMgVW5jb3JyZWN0YWJsZSBQYWNrZXQgQ291bnQgdGhlbiByZXNldCAqLwogCV91Y2Jsb2NrcyA9IGN4MjI3MDJfcmVhZHJlZyAoc3RhdGUsIDB4RTMpOwotCWlmIChzdGF0ZS0+cHJldlVDQmxvY2tzIDwgX3VjYmxvY2tzKSAqdWNibG9ja3MgPSAoX3VjYmxvY2tzIC0gc3RhdGUtPnByZXZVQ0Jsb2Nrcyk7Ci0JZWxzZSAqdWNibG9ja3MgPSBzdGF0ZS0+cHJldlVDQmxvY2tzIC0gX3VjYmxvY2tzOworCWlmIChzdGF0ZS0+cHJldlVDQmxvY2tzIDwgX3VjYmxvY2tzKQorCQkqdWNibG9ja3MgPSAoX3VjYmxvY2tzIC0gc3RhdGUtPnByZXZVQ0Jsb2Nrcyk7CisJZWxzZQorCQkqdWNibG9ja3MgPSBzdGF0ZS0+cHJldlVDQmxvY2tzIC0gX3VjYmxvY2tzOwogCXN0YXRlLT5wcmV2VUNCbG9ja3MgPSBfdWNibG9ja3M7CiAKIAlyZXR1cm4gMDsKQEAgLTQ1Nyw2ICs0NTksMTIgQEAKIAlyZXR1cm4gY3gyMjcwMl9nZXRfdHBzIChzdGF0ZSwgJnAtPnUub2ZkbSk7CiB9CiAKK3N0YXRpYyBpbnQgY3gyMjcwMl9nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzICp0dW5lKQoreworCXR1bmUtPm1pbl9kZWxheV9tcyA9IDEwMDA7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGN4MjI3MDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgY3gyMjcwMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTQ3Miw3ICs0ODAsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDIyNzAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CiAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwpAQCAtNDgxLDcgKzQ5MCw4IEBACiAJc3RhdGUtPnByZXZVQ0Jsb2NrcyA9IDA7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KLQlpZiAoY3gyMjcwMl9yZWFkcmVnKHN0YXRlLCAweDFmKSAhPSAweDMpIGdvdG8gZXJyb3I7CisJaWYgKGN4MjI3MDJfcmVhZHJlZyhzdGF0ZSwgMHgxZikgIT0gMHgzKQorCQlnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwogCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKQEAgLTUxNCw2ICs1MjQsNyBAQAogCiAJLnNldF9mcm9udGVuZCA9IGN4MjI3MDJfc2V0X3RwcywKIAkuZ2V0X2Zyb250ZW5kID0gY3gyMjcwMl9nZXRfZnJvbnRlbmQsCisJLmdldF90dW5lX3NldHRpbmdzID0gY3gyMjcwMl9nZXRfdHVuZV9zZXR0aW5ncywKIAogCS5yZWFkX3N0YXR1cyA9IGN4MjI3MDJfcmVhZF9zdGF0dXMsCiAJLnJlYWRfYmVyID0gY3gyMjcwMl9yZWFkX2JlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCmluZGV4IDU1OWZkYjkuLjExZjg2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaApAQCAtMzUsNiArMzUsMTEgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKKwkvKiBzZXJpYWwvcGFyYWxsZWwgb3V0cHV0ICovCisjZGVmaW5lIENYMjI3MDJfUEFSQUxMRUxfT1VUUFVUIDAKKyNkZWZpbmUgQ1gyMjcwMl9TRVJJQUxfT1VUUFVUICAgMQorCXU4IG91dHB1dF9tb2RlOworCiAJLyogUExMIG1haW50ZW5hbmNlICovCiAJdTggcGxsX2FkZHJlc3M7CiAJc3RydWN0IGR2Yl9wbGxfZGVzYyAqcGxsX2Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC1jb21tb24uYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLWNvbW1vbi5jCmluZGV4IDQ3YWIwMmUuLjFhNGYxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLWNvbW1vbi5jCkBAIC03Myw3ICs3Myw3IEBACiAJfTsKIAogTU9EVUxFX0FVVEhPUigiUGF0cmljayBCb2V0dGNoZXIgPHBhdHJpY2suYm9ldHRjaGVyQGRlc3kuZGUiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQ29tbW9uIGZ1bmN0aW9ucyBmb3IgdGhlIGRpYjMwMDBtYi9kaWIzMDAwbWMgZHZiLWZyb250ZW5kIGRyaXZlcnMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ29tbW9uIGZ1bmN0aW9ucyBmb3IgdGhlIGRpYjMwMDBtYi9kaWIzMDAwbWMgZHZiIGZyb250ZW5kIGRyaXZlcnMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogRVhQT1JUX1NZTUJPTChkaWIzMDAwX3NlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaAppbmRleCA4MDY4N2MxLi4yZDU0NzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLmgKQEAgLTMyLDkgKzMyLDggQEAKIAl1OCBkZW1vZF9hZGRyZXNzOwogCiAJLyogUExMIG1haW50ZW5hbmNlIGFuZCB0aGUgaTJjIGFkZHJlc3Mgb2YgdGhlIFBMTCAqLwotCXU4ICgqcGxsX2FkZHIpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHU4IHBsbF9idWZbNV0pOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTggcGxsX2J1Zls1XSk7CisJaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKKwlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogc3RydWN0IGRpYl9mZV94ZmVyX29wcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCmluZGV4IDZmNTJkNjQuLmNkNDM0YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKQEAgLTQ4LDggKzQ4LDYgQEAKICNkZWZpbmUgZGViX3NldGYoYXJncy4uLikgZHByaW50aygweDA0LGFyZ3MpCiAjZGVmaW5lIGRlYl9nZXRmKGFyZ3MuLi4pIGRwcmludGsoMHgwOCxhcmdzKQogCi1zdGF0aWMgaW50IGRpYjMwMDBtYl90dW5lcl9wYXNzX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBvbm9mZiwgdTggcGxsX2FkZHIpOwotCiBzdGF0aWMgaW50IGRpYjMwMDBtYl9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCk7CiAKQEAgLTYxLDEwICs1OSw4IEBACiAJZmVfY29kZV9yYXRlX3QgZmVfY3IgPSBGRUNfTk9ORTsKIAlpbnQgc2VhcmNoX3N0YXRlLCBzZXE7CiAKLQlpZiAodHVuZXIgJiYgc3RhdGUtPmNvbmZpZy5wbGxfYWRkciAmJiBzdGF0ZS0+Y29uZmlnLnBsbF9zZXQpIHsKLQkJZGliMzAwMG1iX3R1bmVyX3Bhc3NfY3RybChmZSwxLHN0YXRlLT5jb25maWcucGxsX2FkZHIoZmUpKTsKLQkJc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLCBmZXAsIE5VTEwpOwotCQlkaWIzMDAwbWJfdHVuZXJfcGFzc19jdHJsKGZlLDAsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOworCWlmICh0dW5lciAmJiBzdGF0ZS0+Y29uZmlnLnBsbF9zZXQpIHsKKwkJc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLCBmZXApOwogCiAJCWRlYl9zZXRmKCJiYW5kd2lkdGg6ICIpOwogCQlzd2l0Y2ggKG9mZG0tPmJhbmR3aWR0aCkgewpAQCAtMzg5LDExICszODUsOCBAQAogCiAJd3IoRElCMzAwME1CX1JFR19EQVRBX0lOX0RJVkVSU0lUWSwgRElCMzAwME1CX0RBVEFfRElWRVJTSVRZX0lOX09GRik7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy5wbGxfaW5pdCkgewotCQlkaWIzMDAwbWJfdHVuZXJfcGFzc19jdHJsKGZlLDEsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOwotCQlzdGF0ZS0+Y29uZmlnLnBsbF9pbml0KGZlLE5VTEwpOwotCQlkaWIzMDAwbWJfdHVuZXJfcGFzc19jdHJsKGZlLDAsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOwotCX0KKwlpZiAoc3RhdGUtPmNvbmZpZy5wbGxfaW5pdCkKKwkJc3RhdGUtPmNvbmZpZy5wbGxfaW5pdChmZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyMyw3ICs2MTYsNyBAQAogewogCXN0cnVjdCBkaWIzMDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JKnVuYyA9IHJkKERJQjMwMDBNQl9SRUdfVU5DKTsKKwkqdW5jID0gcmQoRElCMzAwME1CX1JFR19QQUNLRVRfRVJST1JfUkFURSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYzOCw5ICs2MzEsNiBAQAogc3RhdGljIGludCBkaWIzMDAwbWJfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqdHVuZSkKIHsKIAl0dW5lLT5taW5fZGVsYXlfbXMgPSA4MDA7Ci0JdHVuZS0+c3RlcF9zaXplID0gMTY2NjY3OwotCXR1bmUtPm1heF9kcmlmdCA9IDE2NjY2NyAqIDI7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYl9wcml2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iX3ByaXYuaAppbmRleCA1N2U2MWFhLi45OTliMTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iX3ByaXYuaApAQCAtMjk0LDcgKzI5NCw3IEBACiAKIHN0YXRpYyB1MTYgZGliMzAwMG1iX2ZpbHRlcl9jb2VmZnNbXSA9IHsKIAkgMjI2LCAgMTYwLCAgIDI5LAotIAkgOTc5LCAgOTk4LCAgIDE5LAorCSA5NzksICA5OTgsICAgMTksCiAJICAyMiwgMTAxOSwgMTAwNiwKIAkxMDIyLCAgIDEyLCAgICA2LAogCTEwMTcsIDEwMTcsICAgIDMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKaW5kZXggODg4ZjEwYS4uY2QzMzcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwpAQCAtNDgsOCArNDgsNiBAQAogI2RlZmluZSBkZWJfZ2V0ZihhcmdzLi4uKSBkcHJpbnRrKDB4MDgsYXJncykKICNkZWZpbmUgZGViX3N0YXQoYXJncy4uLikgZHByaW50aygweDEwLGFyZ3MpCiAKLXN0YXRpYyBpbnQgZGliMzAwMG1jX3R1bmVyX3Bhc3NfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IG9ub2ZmLCB1OCBwbGxfYWRkcik7Ci0KIHN0YXRpYyBpbnQgZGliMzAwMG1jX3NldF9pbXB1bHNlX25vaXNlKHN0cnVjdCBkaWIzMDAwX3N0YXRlICogc3RhdGUsIGludCBtb2RlLAogCWZlX3RyYW5zbWl0X21vZGVfdCB0cmFuc21pc3Npb25fbW9kZSwgZmVfYmFuZHdpZHRoX3QgYmFuZHdpZHRoKQogewpAQCAtNDYzLDEwICs0NjEsOCBAQAogCWludCBzZWFyY2hfc3RhdGUsYXV0b192YWw7CiAJdTE2IHZhbDsKIAotCWlmICh0dW5lciAmJiBzdGF0ZS0+Y29uZmlnLnBsbF9hZGRyICYmIHN0YXRlLT5jb25maWcucGxsX3NldCkgeyAvKiBpbml0aWFsIGNhbGwgZnJvbSBkdmIgKi8KLQkJZGliMzAwMG1jX3R1bmVyX3Bhc3NfY3RybChmZSwxLHN0YXRlLT5jb25maWcucGxsX2FkZHIoZmUpKTsKLQkJc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLGZlcCxOVUxMKTsKLQkJZGliMzAwMG1jX3R1bmVyX3Bhc3NfY3RybChmZSwwLHN0YXRlLT5jb25maWcucGxsX2FkZHIoZmUpKTsKKwlpZiAodHVuZXIgJiYgc3RhdGUtPmNvbmZpZy5wbGxfc2V0KSB7IC8qIGluaXRpYWwgY2FsbCBmcm9tIGR2YiAqLworCQlzdGF0ZS0+Y29uZmlnLnBsbF9zZXQoZmUsZmVwKTsKIAogCQlzdGF0ZS0+bGFzdF90dW5lZF9mcmVxID0gZmVwLT5mcmVxdWVuY3k7CiAJLy8JaWYgKCFzY2FuYm9vc3QpIHsKQEAgLTU1NCwxOSArNTUwLDE1IEBACiAJCQlkaWIzMDAwbWNfc2V0X2FkcF9jZmcoc3RhdGUsb2ZkbS0+Y29uc3RlbGxhdGlvbik7CiAJCXdyX2ZvcmVhY2goZGliMzAwMG1jX3JlZ19vZmZzZXQsCiAJCQkJZGliMzAwMG1jX29mZnNldFsob2ZkbS0+dHJhbnNtaXNzaW9uX21vZGUgPT0gVFJBTlNNSVNTSU9OX01PREVfOEspKzFdKTsKLQotCiAJfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRpYjMwMDBtY19mZV9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgbW9iaWxlX21vZGUpCiB7Ci0Jc3RydWN0IGRpYjMwMDBfc3RhdGUgKnN0YXRlOwotCisJc3RydWN0IGRpYjMwMDBfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJZGViX2luZm8oImluaXQgc3RhcnRcbiIpOwogCi0Jc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlzdGF0ZS0+dGltaW5nX29mZnNldCA9IDA7CiAJc3RhdGUtPnRpbWluZ19vZmZzZXRfY29tcF9kb25lID0gMDsKIApAQCAtNjQ5LDExICs2NDEsOSBAQAogCiAJc2V0X29yKERJQjMwMDBNQ19SRUdfQ0xLX0NGR183LERJQjMwMDBNQ19DTEtfQ0ZHXzdfRElWX0lOX09GRik7CiAKLS8qCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQlkaWIzMDAwbWNfdHVuZXJfcGFzc19jdHJsKGZlLDEsc3RhdGUtPmNvbmZpZy5wbGxfYWRkcihmZSkpOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSxOVUxMKTsKLQkJZGliMzAwMG1jX3R1bmVyX3Bhc3NfY3RybChmZSwwLHN0YXRlLT5jb25maWcucGxsX2FkZHIoZmUpKTsKLQl9Ki8KKwlpZiAoc3RhdGUtPmNvbmZpZy5wbGxfaW5pdCkKKwkJc3RhdGUtPmNvbmZpZy5wbGxfaW5pdChmZSk7CisKIAlkZWJfaW5mbygiaW5pdCBlbmRcbiIpOwogCXJldHVybiAwOwogfQpAQCAtNjg4LDcgKzY3OCw3IEBACiB7CiAJc3RydWN0IGRpYjMwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQkqdW5jID0gcmQoRElCMzAwME1DX1JFR19QQUNLRVRfRVJST1JfQ09VTlQpOworCSp1bmMgPSByZChESUIzMDAwTUNfUkVHX1BBQ0tFVF9FUlJPUlMpOwogCXJldHVybiAwOwogfQogCkBAIC03MzcsMTAgKzcyNyw3IEBACiAKIHN0YXRpYyBpbnQgZGliMzAwMG1jX2ZlX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnR1bmUpCiB7Ci0JdHVuZS0+bWluX2RlbGF5X21zID0gMjAwMDsKLQl0dW5lLT5zdGVwX3NpemUgPSAxNjY2Njc7Ci0JdHVuZS0+bWF4X2RyaWZ0ID0gMTY2NjY3ICogMjsKLQorCXR1bmUtPm1pbl9kZWxheV9tcyA9IDEwMDA7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCmluZGV4IDJhM2MyY2UuLjVhZmVhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwpAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiAkSWQ6IGR2Yi1wbGwuYyx2IDEuNyAyMDA1LzAyLzEwIDExOjUyOjAyIGtyYXhlbCBFeHAgJAotICoKICAqIGRlc2NyaXB0aW9ucyArIGhlbHBlciBmdW5jdGlvbnMgZm9yIHNpbXBsZSBkdmIgcGxscy4KICAqCiAgKiAoYykgMjAwNCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdCkBAIC01Nyw3ICs1NSw3IEBACiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX3Rob21zb25fZHR0NzYxMCk7CiAKLXN0YXRpYyB2b2lkIHRob21zb25fZHR0NzU5eF9idyh1OCAqYnVmLCBpbnQgYmFuZHdpZHRoKQorc3RhdGljIHZvaWQgdGhvbXNvbl9kdHQ3NTl4X2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQogewogCWlmIChCQU5EV0lEVEhfN19NSFogPT0gYmFuZHdpZHRoKQogCQlidWZbM10gfD0gMHgxMDsKQEAgLTk1LDYgKzkzLDMyIEBACiB9OwogRVhQT1JUX1NZTUJPTChkdmJfcGxsX2xnX3oyMDEpOwogCitzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfbWljcm90dW5lXzQwNDIgPSB7CisJLm5hbWUgID0gIk1pY3JvdHVuZSA0MDQyIEZJNSIsCisJLm1pbiAgID0gIDU3MDAwMDAwLAorCS5tYXggICA9IDg1ODAwMDAwMCwKKwkuY291bnQgPSAzLAorCS5lbnRyaWVzID0geworCQl7IDE2MjAwMDAwMCwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweGExIH0sCisJCXsgNDU3MDAwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4OTEgfSwKKwkJeyA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzMSB9LAorCX0sCit9OworRVhQT1JUX1NZTUJPTChkdmJfcGxsX21pY3JvdHVuZV80MDQyKTsKKworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Rob21zb25fZHR0NzYxMSA9IHsKKwkubmFtZSAgPSAiVGhvbXNvbiBkdHQ3NjExIiwKKwkubWluICAgPSAgNDQwMDAwMDAsCisJLm1heCAgID0gOTU4MDAwMDAwLAorCS5jb3VudCA9IDMsCisJLmVudHJpZXMgPSB7CisJCXsgMTU3MjUwMDAwLCA0NDAwMDAwMCwgNjI1MDAsIDB4OGUsIDB4MzkgfSwKKwkJeyA0NTQwMDAwMDAsIDQ0MDAwMDAwLCA2MjUwMCwgMHg4ZSwgMHgzYSB9LAorCQl7IDk5OTk5OTk5OSwgNDQwMDAwMDAsIDYyNTAwLCAweDhlLCAweDNjIH0sCisJfSwKK307CitFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExKTsKKwogc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Vua25vd25fMSA9IHsKIAkubmFtZSAgPSAidW5rbm93biAxIiwgLyogdXNlZCBieSBkbnR2IGxpdmUgZHZiLXQgKi8KIAkubWluICAgPSAxNzQwMDAwMDAsCkBAIC0xMTQsNiArMTM4LDE0MyBAQAogfTsKIEVYUE9SVF9TWU1CT0woZHZiX3BsbF91bmtub3duXzEpOwogCisvKiBJbmZpbmVvbiBUVUE2MDEwWFMKKyAqIHVzZWQgaW4gVGhvbXNvbiBDYWJsZSBUdW5lcgorICovCitzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdHVhNjAxMHhzID0geworCS5uYW1lICA9ICJJbmZpbmVvbiBUVUE2MDEwWFMiLAorCS5taW4gICA9ICA0NDI1MDAwMCwKKwkubWF4ICAgPSA4NTgwMDAwMDAsCisJLmNvdW50ID0gMywKKwkuZW50cmllcyA9IHsKKwkJeyAgMTE1NzUwMDAwLCAzNjEyNTAwMCwgNjI1MDAsIDB4OGUsIDB4MDMgfSwKKwkJeyAgNDAzMjUwMDAwLCAzNjEyNTAwMCwgNjI1MDAsIDB4OGUsIDB4MDYgfSwKKwkJeyAgOTk5OTk5OTk5LCAzNjEyNTAwMCwgNjI1MDAsIDB4OGUsIDB4ODUgfSwKKwl9LAorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF90dWE2MDEweHMpOworCisvKiBQYW5hc29uaWMgZW52NTdoMXhkNSAoc29tZSBQaGlsaXBzIFBMTCA/KSAqLworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2VudjU3aDF4ZDUgPSB7CisJLm5hbWUgID0gIlBhbmFzb25pYyBFTlY1N0gxWEQ1IiwKKwkubWluICAgPSAgNDQyNTAwMDAsCisJLm1heCAgID0gODU4MDAwMDAwLAorCS5jb3VudCA9IDQsCisJLmVudHJpZXMgPSB7CisJCXsgIDE1MzAwMDAwMCwgMzYyOTE2NjYsIDE2NjY2NiwgMHhjMiwgMHg0MSB9LAorCQl7ICA0NzAwMDAwMDAsIDM2MjkxNjY2LCAxNjY2NjYsIDB4YzIsIDB4NDIgfSwKKwkJeyAgNTI2MDAwMDAwLCAzNjI5MTY2NiwgMTY2NjY2LCAweGMyLCAweDg0IH0sCisJCXsgIDk5OTk5OTk5OSwgMzYyOTE2NjYsIDE2NjY2NiwgMHhjMiwgMHhhNCB9LAorCX0sCit9OworRVhQT1JUX1NZTUJPTChkdmJfcGxsX2VudjU3aDF4ZDUpOworCisvKiBQaGlsaXBzIFREQTY2NTAvVERBNjY1MQorICogdXNlZCBpbiBQYW5hc29uaWMgRU5WNzdIMTFENQorICovCitzdGF0aWMgdm9pZCB0ZGE2NjV4X2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQoreworCWlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKQorCQlidWZbM10gfD0gMHgwODsKK30KKworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkYTY2NXggPSB7CisJLm5hbWUgID0gIlBoaWxpcHMgVERBNjY1MC9UREE2NjUxIiwKKwkubWluICAgPSAgNDQyNTAwMDAsCisJLm1heCAgID0gODU4MDAwMDAwLAorCS5zZXRidyA9IHRkYTY2NXhfYncsCisJLmNvdW50ID0gMTIsCisJLmVudHJpZXMgPSB7CisJCXsgICA5MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHg2MSAvKiAwMTEgMCAwIDAgIDAxICovIH0sCisJCXsgIDEyMzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMSAvKiAxMDEgMCAwIDAgIDAxICovIH0sCisJCXsgIDE2MTAwMDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMSAvKiAxMDEgMCAwIDAgIDAxICovIH0sCisJCXsgIDE2MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjMiAvKiAxMTAgMCAwIDAgIDEwICovIH0sCisJCXsgIDI1MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHg2MiAvKiAwMTEgMCAwIDAgIDEwICovIH0sCisJCXsgIDM4MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMiAvKiAxMDEgMCAwIDAgIDEwICovIH0sCisJCXsgIDQ0MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjMiAvKiAxMTAgMCAwIDAgIDEwICovIH0sCisJCXsgIDQ0NDAwMDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjMyAvKiAxMTAgMCAwIDAgIDExICovIH0sCisJCXsgIDU4MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHg2MyAvKiAwMTEgMCAwIDAgIDExICovIH0sCisJCXsgIDc5MzgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhhMyAvKiAxMDEgMCAwIDAgIDExICovIH0sCisJCXsgIDQ0NDgzNDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhjMyAvKiAxMTAgMCAwIDAgIDExICovIH0sCisJCXsgIDg2MTAwMDAwMCwgMzYyNDkzMzMsIDE2NjY2NywgMHhjYSwgMHhlMyAvKiAxMTEgMCAwIDAgIDExICovIH0sCisJfQorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF90ZGE2NjV4KTsKKworLyogSW5maW5lb24gVFVBNjAzNAorICogdXNlZCBpbiBMRyBURFRQIEUxMDJQCisgKi8KK3N0YXRpYyB2b2lkIHR1YTYwMzRfYncodTggKmJ1ZiwgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpCit7CisJaWYgKEJBTkRXSURUSF83X01IWiAhPSBiYW5kd2lkdGgpCisJCWJ1ZlszXSB8PSAweDA4OworfQorCitzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdHVhNjAzNCA9IHsKKwkubmFtZSAgPSAiSW5maW5lb24gVFVBNjAzNCIsCisJLm1pbiAgID0gIDQ0MjUwMDAwLAorCS5tYXggICA9IDg1ODAwMDAwMCwKKwkuY291bnQgPSAzLAorCS5zZXRidyA9IHR1YTYwMzRfYncsCisJLmVudHJpZXMgPSB7CisJCXsgIDE3NDUwMDAwMCwgMzYxNjY2NjcsIDYyNTAwLCAweGNlLCAweDAxIH0sCisJCXsgIDIzMDAwMDAwMCwgMzYxNjY2NjcsIDYyNTAwLCAweGNlLCAweDAyIH0sCisJCXsgIDk5OTk5OTk5OSwgMzYxNjY2NjcsIDYyNTAwLCAweGNlLCAweDA0IH0sCisJfSwKK307CitFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdHVhNjAzNCk7CisKKy8qIFBoaWxpcHMgRk1EMTIxNk1FCisgKiB1c2VkIGluIE1lZGlvbiBIeWJyaWQgUENNQ0lBIGNhcmQgYW5kIFVTQiBCb3gKKyAqLworc3RhdGljIHZvaWQgZm1kMTIxNm1lX2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQoreworCWlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaICYmIGZyZXEgPj0gMTU4ODcwMDAwKQorCQlidWZbM10gfD0gMHgwODsKK30KKworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2ZtZDEyMTZtZSA9IHsKKwkubmFtZSA9ICJQaGlsaXBzIEZNRDEyMTZNRSIsCisJLm1pbiA9IDUwODcwMDAwLAorCS5tYXggPSA4NTgwMDAwMDAsCisJLnNldGJ3ID0gZm1kMTIxNm1lX2J3LAorCS5jb3VudCA9IDcsCisJLmVudHJpZXMgPSB7CisJCXsgMTQzODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQxIH0sCisJCXsgMTU4ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQxIH0sCisJCXsgMzI5ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQyIH0sCisJCXsgNDQxODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQyIH0sCisJCXsgNjI1ODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGJjLCAweDQ0IH0sCisJCXsgODAzODcwMDAwLCAzNjIxMzMzMywgMTY2NjY3LCAweGY0LCAweDQ0IH0sCisJCXsgOTk5OTk5OTk5LCAzNjIxMzMzMywgMTY2NjY3LCAweGZjLCAweDQ0IH0sCisJfQorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF9mbWQxMjE2bWUpOworCisvKiBBTFBTIFRERUQ0CisgKiB1c2VkIGluIE5lYnVsYS1DYXJkcyBhbmQgVVNCIGJveGVzCisgKi8KK3N0YXRpYyB2b2lkIHRkZWQ0X2J3KHU4ICpidWYsIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKQoreworCWlmIChiYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKQorCQlidWZbM10gfD0gMHgwNDsKK30KKworc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkZWQ0ID0geworCS5uYW1lID0gIkFMUFMgVERFRDQiLAorCS5taW4gPSA0NzAwMDAwMCwKKwkubWF4ID0gODYzMDAwMDAwLAorCS5zZXRidyA9IHRkZWQ0X2J3LAorCS5jb3VudCA9IDQsCisJLmVudHJpZXMgPSB7CisJCXsgMTUzMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDAxIH0sCisJCXsgNDcwMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDAyIH0sCisJCXsgODIzMDAwMDAwLCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDA4IH0sCisJCXsgOTk5OTk5OTk5LCAzNjE2NjY2NywgMTY2NjY3LCAweDg1LCAweDg4IH0sCisJfQorfTsKK0VYUE9SVF9TWU1CT0woZHZiX3BsbF90ZGVkNCk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCkBAIC0xNDcsNyArMzA4LDcgQEAKIAlidWZbM10gPSBkZXNjLT5lbnRyaWVzW2ldLmNiMjsKIAogCWlmIChkZXNjLT5zZXRidykKLQkJZGVzYy0+c2V0YncoYnVmLCBiYW5kd2lkdGgpOworCQlkZXNjLT5zZXRidyhidWYsIGZyZXEsIGJhbmR3aWR0aCk7CiAKIAlpZiAoZGVidWcpCiAJCXByaW50aygicGxsOiAlczogZGl2PSVkIHwgYnVmPTB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeFxuIiwKQEAgLTE2MCw5ICszMjEsMyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkdmIgcGxsIGxpYnJhcnkiKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCmluZGV4IGM0YzNjNTYuLmNiNzk0NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGR2Yi1wbGwuaCx2IDEuMiAyMDA1LzAyLzEwIDExOjQzOjQxIGtyYXhlbCBFeHAgJAorICogZGVzY3JpcHRpb25zICsgaGVscGVyIGZ1bmN0aW9ucyBmb3Igc2ltcGxlIGR2YiBwbGxzLgogICovCiAKICNpZm5kZWYgX19EVkJfUExMX0hfXwpAQCAtOSw3ICs5LDcgQEAKIAljaGFyICpuYW1lOwogCXUzMiAgbWluOwogCXUzMiAgbWF4OwotCXZvaWQgKCpzZXRidykodTggKmJ1ZiwgaW50IGJhbmR3aWR0aCk7CisJdm9pZCAoKnNldGJ3KSh1OCAqYnVmLCB1MzIgZnJlcSwgaW50IGJhbmR3aWR0aCk7CiAJaW50ICBjb3VudDsKIAlzdHJ1Y3QgewogCQl1MzIgbGltaXQ7CkBAIC0xNywxNSArMTcsMjQgQEAKIAkJdTMyIHN0ZXBzaXplOwogCQl1OCAgY2IxOwogCQl1OCAgY2IyOwotCX0gZW50cmllc1s5XTsKKwl9IGVudHJpZXNbMTJdOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2R0dDc1Nzk7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3Rob21zb25fZHR0NzU5eDsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjEwOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9sZ196MjAxOworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9taWNyb3R1bmVfNDA0MjsKK2V4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjExOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF91bmtub3duXzE7CiAKK2V4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdHVhNjAxMHhzOworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9lbnY1N2gxeGQ1OworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90dWE2MDM0OworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90ZGE2NjV4OworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9mbWQxMjE2bWU7CitleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkZWQ0OworCiBpbnQgZHZiX3BsbF9jb25maWd1cmUoc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYywgdTggKmJ1ZiwKIAkJICAgICAgdTMyIGZyZXEsIGludCBiYW5kd2lkdGgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKaW5kZXggMDMxYTFkZC4uZmFhYWQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwpAQCAtNDc0LDExICs0NzQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsNjQ3ODFfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKK3N0YXRpYyBpbnQgbDY0NzgxX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7Ci0gICAgICAgIGZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDIwMDsKLSAgICAgICAgZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMTY2NjY3OwotICAgICAgICBmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAxNjY2NjcqMjsKKyAgICAgICAgZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNDAwMDsKKyAgICAgICAgZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMDsKKyAgICAgICAgZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlYTAzZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5jCkBAIC0wLDAgKzEsNjA5IEBACisvKgorICogICAgU3VwcG9ydCBmb3IgTEdEVDMzMDIgKERWaUNPIEZ1c3Rpb25IRFRWIDMgR29sZCkgLSBWU0IvUUFNCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA1IFdpbHNvbiBNaWNoYWVscyA8d2lsc29ubWljaGFlbHNAZWFydGhsaW5rLm5ldD4KKyAqCisgKiAgICBCYXNlZCBvbiBjb2RlIGZyb20gIEtpcmsgTGFwcmF5IDxraXJrX2xhcHJheUBiaWdmb290LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAyMDA1CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICBOT1RFUyBBQk9VVCBUSElTIERSSVZFUgorICoKKyAqIFRoaXMgZHJpdmVyIHN1cHBvcnRzIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkIHVuZGVyIExpbnV4LgorICoKKyAqIFRPRE86CisgKiBCRVIgYW5kIHNpZ25hbCBzdHJlbmd0aCBhbHdheXMgcmV0dXJuIDAuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yi1wbGwuaCIKKyNpbmNsdWRlICJsZ2R0MzMwMl9wcml2LmgiCisjaW5jbHVkZSAibGdkdDMzMDIuaCIKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJUdXJuIG9uL29mZiBsZ2R0MzMwMiBmcm9udGVuZCBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKKyNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCitkbyB7IFwKK2lmIChkZWJ1ZykgcHJpbnRrKEtFUk5fREVCVUcgImxnZHQzMzAyOiAiIGFyZ3MpOyBcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CisKKwkvKiBDb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJY29uc3Qgc3RydWN0IGxnZHQzMzAyX2NvbmZpZyogY29uZmlnOworCisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCS8qIERlbW9kdWxhdG9yIHByaXZhdGUgZGF0YSAqLworCWZlX21vZHVsYXRpb25fdCBjdXJyZW50X21vZHVsYXRpb247CisKKwkvKiBUdW5lciBwcml2YXRlIGRhdGEgKi8KKwl1MzIgY3VycmVudF9mcmVxdWVuY3k7Cit9OworCitzdGF0aWMgaW50IGkyY193cml0ZWJ5dGVzIChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlLAorCQkJICAgdTggYWRkciwgLyogZGVtb2RfYWRkcmVzcyBvciBwbGxfYWRkcmVzcyAqLworCQkJICAgdTggKmJ1ZiwgLyogZGF0YSBieXRlcyB0byBzZW5kICovCisJCQkgICBpbnQgbGVuICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZCAqLyApCit7CisJaWYgKGFkZHIgPT0gc3RhdGUtPmNvbmZpZy0+cGxsX2FkZHJlc3MpIHsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJCXsgLmFkZHIgPSBhZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAgLmxlbiA9IGxlbiB9OworCQlpbnQgZXJyOworCisJCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXMgZXJyb3IgKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIsIGJ1ZlswXSwgZXJyKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9IGVsc2UgeworCQl1OCB0bXBbXSA9IHsgYnVmWzBdLCBidWZbMV0gfTsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJCXsgLmFkZHIgPSBhZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gdG1wLCAgLmxlbiA9IDIgfTsKKwkJaW50IGVycjsKKwkJaW50IGk7CisKKwkJZm9yIChpPTE7IGk8bGVuOyBpKyspIHsKKwkJCXRtcFsxXSA9IGJ1ZltpXTsKKwkJCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibGdkdDMzMDI6ICVzIGVycm9yIChhZGRyICUwMnggPC0gJTAyeCwgZXJyID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCBhZGRyLCBidWZbMF0sIGVycik7CisJCQkJaWYgKGVyciA8IDApCisJCQkJCXJldHVybiBlcnI7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJCX0KKwkJCXRtcFswXSsrOworCQl9CisJfQorCXJldHVybiAwOworfQorc3RhdGljIGludCBpMmNfcmVhZGJ5dGVzIChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlLAorCQkJICB1OCBhZGRyLCAvKiBkZW1vZF9hZGRyZXNzIG9yIHBsbF9hZGRyZXNzICovCisJCQkgIHU4ICpidWYsIC8qIGhvbGRzIGRhdGEgYnl0ZXMgcmVhZCAqLworCQkJICBpbnQgbGVuICAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCAqLyApCit7CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJeyAuYWRkciA9IGFkZHIsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYnVmLCAgLmxlbiA9IGxlbiB9OworCWludCBlcnI7CisKKwlpZiAoKGVyciA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXMgZXJyb3IgKGFkZHIgJTAyeCwgZXJyID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCBhZGRyLCBlcnIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgd3JpdGVzIHRoZSByZWdpc3RlciAocmVnKSB0byB0aGUgZGVtb2QgYnVzCisgKiB0aGVuIHJlYWRzIHRoZSBkYXRhIHJldHVybmVkIGZvciAobGVuKSBieXRlcy4KKyAqLworCitzdGF0aWMgdTggaTJjX3NlbGVjdHJlYWRieXRlcyAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKiBzdGF0ZSwKKwkJCSAgICAgICBlbnVtIEkyQ19SRUcgcmVnLCB1OCogYnVmLCBpbnQgbGVuKQoreworCXU4IHdyIFtdID0geyByZWcgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgW10gPSB7CisJCXsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkgIC5mbGFncyA9IDAsIC5idWYgPSB3ciwgIC5sZW4gPSAxIH0sCisJCXsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkgIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gYnVmLCAubGVuID0gbGVuIH0sCisJfTsKKwlpbnQgcmV0OworCXJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpOworCWlmIChyZXQgIT0gMikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMjogJXM6IGFkZHIgMHglMDJ4IHNlbGVjdCAweCUwMnggZXJyb3IgKHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgcmVnLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIFNvZnR3YXJlIHJlc2V0ICovCitpbnQgbGdkdDMzMDJfU3dSZXNldChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlKQoreworCXU4IHJldDsKKwl1OCByZXNldFtdID0geworCQlJUlFfTUFTSywKKwkJMHgwMCAvKiBiaXQgNiBpcyBhY3RpdmUgbG93IHNvZnR3YXJlIHJlc2V0CisJCSAgICAgICoJYml0cyA1LTAgYXJlIDEgdG8gbWFzayBpbnRlcnJ1cHRzICovCisJfTsKKworCXJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLAorCQkJICAgICBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICByZXNldCwgc2l6ZW9mKHJlc2V0KSk7CisJaWYgKHJldCA9PSAwKSB7CisJCS8qIHNwZWMgc2F5cyByZXNldCB0YWtlcyAxMDAgbnMgd2h5IHdhaXQgKi8KKwkJLyogbWRlbGF5KDEwMCk7ICAgICovIC8qIGtlZXAgbG93IGZvciAxMDBtUyAqLworCQlyZXNldFsxXSA9IDB4N2Y7ICAgICAgLyogZm9yY2UgcmVzZXQgaGlnaCAoaW5hY3RpdmUpCisJCQkJICAgICAgICogYW5kIHVubWFzayBpbnRlcnJ1cHRzICovCisJCXJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLAorCQkJCSAgICAgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCQkgICAgIHJlc2V0LCBzaXplb2YocmVzZXQpKTsKKwl9CisJLyogU3BlYyBkb2VzIG5vdCBpbmRpY2F0ZSBhIG5lZWQgZm9yIHRoaXMgZWl0aGVyICovCisJLyptZGVsYXkoNSk7ICovICAgICAgICAgICAgICAgLyogd2FpdCA1IG1zZWMgYmVmb3JlIGRvaW5nIG1vcmUgKi8KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJLyogSGFyZHdhcmUgcmVzZXQgaXMgZG9uZSB1c2luZyBncGlvWzBdIG9mIGN4MjM4ODB4IGNoaXAuCisJICogSSdkIGxpa2UgdG8gZG8gaXQgaGVyZSwgYnV0IGRvbid0IGtub3cgaG93IHRvIGZpbmQgY2hpcCBhZGRyZXNzLgorCSAqIGN4ODgtY2FyZHMuYyBhcnJhbmdlcyBmb3IgdGhlIHJlc2V0IGJpdCB0byBiZSBpbmFjdGl2ZSAoaGlnaCkuCisJICogTWF5YmUgdGhlcmUgbmVlZHMgdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbiBpbiBjeDg4LWNvcmUgb3IKKwkgKiB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gZG8gaXQuICovCisKKwlkcHJpbnRrKCIlcyBlbnRlcmVkXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBsZ2R0MzMwMl9Td1Jlc2V0KChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogYmVyKQoreworCSpiZXIgPSAwOyAvKiBEdW1teSBvdXQgZm9yIG5vdyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUzMiogdWNibG9ja3MpCit7CisJc3RydWN0IGxnZHQzMzAyX3N0YXRlKiBzdGF0ZSA9IChzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBidWZbMl07CisKKwlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBQQUNLRVRfRVJSX0NPVU5URVIxLCBidWYsIHNpemVvZihidWYpKTsKKworCSp1Y2Jsb2NrcyA9IChidWZbMF0gPDwgOCkgfCBidWZbMV07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbSkKK3sKKwl1OCBidWZbNF07CisJc3RydWN0IGxnZHQzMzAyX3N0YXRlKiBzdGF0ZSA9CisJCShzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqKSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCS8qIFVzZSA1ME1IeiBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gc3BlYyBzaGVldCBzaW5jZSB4dGFsIGlzIDUwICovCisJc3RhdGljIHU4IHRvcF9jdHJsX2NmZ1tdICAgPSB7IFRPUF9DT05UUk9MLCAweDAzIH07CisJc3RhdGljIHU4IHZzYl9mcmVxX2NmZ1tdICAgPSB7IFZTQl9DQVJSSUVSX0ZSRVEwLCAweDAwLCAweDg3LCAweDhlLCAweDAxIH07CisJc3RhdGljIHU4IGRlbXV4X2N0cmxfY2ZnW10gPSB7IERFTVVYX0NPTlRST0wsIDB4ZmIgfTsKKwlzdGF0aWMgdTggYWdjX3JmX2NmZ1tdICAgICA9IHsgQUdDX1JGX0JBTkRXSURUSDAsIDB4NDAsIDB4OTMsIDB4MDAgfTsKKwlzdGF0aWMgdTggYWdjX2N0cmxfY2ZnW10gICA9IHsgQUdDX0ZVTkNfQ1RSTDIsIDB4YzYsIDB4NDAgfTsKKwlzdGF0aWMgdTggYWdjX2RlbGF5X2NmZ1tdICA9IHsgQUdDX0RFTEFZMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBhZ2NfbG9vcF9jZmdbXSAgID0geyBBR0NfTE9PUF9CQU5EV0lEVEgwLCAweDA4LCAweDlhIH07CisKKwkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIG1vZHVsYXRpb24gKi8KKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiAhPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbikgeworCQlpbnQgdmFsdWU7CisKKwkJc3dpdGNoKHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7CisJCWNhc2UgVlNCXzg6CisJCQlkcHJpbnRrKCIlczogVlNCXzggTU9ERVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogU2VsZWN0IFZTQiBtb2RlIGFuZCBzZXJpYWwgTVBFRyBpbnRlcmZhY2UgKi8KKwkJCXRvcF9jdHJsX2NmZ1sxXSA9IDB4MDc7CisJCQlicmVhazsKKworCQljYXNlIFFBTV82NDoKKwkJCWRwcmludGsoIiVzOiBRQU1fNjQgTU9ERVxuIiwgX19GVU5DVElPTl9fKTsKKworCQkJLyogU2VsZWN0IFFBTV82NCBtb2RlIGFuZCBzZXJpYWwgTVBFRyBpbnRlcmZhY2UgKi8KKwkJCXRvcF9jdHJsX2NmZ1sxXSA9IDB4MDQ7CisJCQlicmVhazsKKworCQljYXNlIFFBTV8yNTY6CisJCQlkcHJpbnRrKCIlczogUUFNXzI1NiBNT0RFXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCQkvKiBTZWxlY3QgUUFNXzI1NiBtb2RlIGFuZCBzZXJpYWwgTVBFRyBpbnRlcmZhY2UgKi8KKwkJCXRvcF9jdHJsX2NmZ1sxXSA9IDB4MDU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAyOiAlczogTW9kdWxhdGlvbiB0eXBlKCVkKSBVTlNVUFBPUlRFRFxuIiwgX19GVU5DVElPTl9fLCBwYXJhbS0+dS52c2IubW9kdWxhdGlvbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogSW5pdGlhbGl6YXRpb25zIGNvbW1vbiB0byBhbGwgbW9kZXMgKi8KKworCQkvKiBTZWxlY3QgdGhlIHJlcXVlc3RlZCBtb2RlICovCisJCWkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICAgIHRvcF9jdHJsX2NmZywgc2l6ZW9mKHRvcF9jdHJsX2NmZykpOworCisJCS8qIENoYW5nZSB0aGUgdmFsdWUgb2YgSUZCV1sxMTowXQorCQkgICBvZiBBR0MgSUYvUkYgbG9vcCBmaWx0ZXIgYmFuZHdpZHRoIHJlZ2lzdGVyICovCisJCWkyY193cml0ZWJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAorCQkJICAgICAgIGFnY19yZl9jZmcsIHNpemVvZihhZ2NfcmZfY2ZnKSk7CisKKwkJLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBiaXQgNiwgJ25JTkFHQ0JZJyBhbmQKKwkJICAgJ05TU0VMWzE6MF0gb2YgQUNHIGZ1bmN0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgMiAqLworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIGJpdCA2ICdSRkZJWCcKKwkJICAgb2YgQUdDIGZ1bmN0aW9uIGNvbnRyb2wgcmVnaXN0ZXIgMyAqLworCQlpMmNfd3JpdGVieXRlcyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKKwkJCSAgICAgICBhZ2NfY3RybF9jZmcsIHNpemVvZihhZ2NfY3RybF9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIFRQQ0xLIHBpbiBwb2xhcml0eQorCQkgICBkYXRhIGlzIHZhbGlkIG9uIGZhbGxpbmcgY2xvY2sgKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgZGVtdXhfY3RybF9jZmcsIHNpemVvZihkZW11eF9jdHJsX2NmZykpOworCisJCS8qIENoYW5nZSB0aGUgdmFsdWUgb2YgTkNPQ1RGVlsyNTowXSBvZiBjYXJyaWVyCisJCSAgIHJlY292ZXJ5IGNlbnRlciBmcmVxdWVuY3kgcmVnaXN0ZXIgKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkJICAgICAgIHZzYl9mcmVxX2NmZywgc2l6ZW9mKHZzYl9mcmVxX2NmZykpOworCQkvKiBTZXQgdGhlIHZhbHVlIG9mICdJTkxWVEhEJyByZWdpc3RlciAweDJhLzB4MmMKKwkJICAgdG8gdmFsdWUgZnJvbSAnSUZBQ0MnIHJlZ2lzdGVyIDB4MzkvMHgzYiAtMSAqLworCQlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBBR0NfUkZJRl9BQ0MwLAorCQkJCSAgICAmYWdjX2RlbGF5X2NmZ1sxXSwgMyk7CisJCXZhbHVlID0gKChhZ2NfZGVsYXlfY2ZnWzFdICYgMHgwZikgPDwgOCkgfCBhZ2NfZGVsYXlfY2ZnWzNdOworCQl2YWx1ZSA9IHZhbHVlIC0xOworCQlkcHJpbnRrKCIlcyBJRkFDQyAtMSA9IDB4JTAzeFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZSk7CisJCWFnY19kZWxheV9jZmdbMV0gPSAodmFsdWUgPj4gOCkgJiAweDBmOworCQlhZ2NfZGVsYXlfY2ZnWzJdID0gMHgwMDsKKwkJYWdjX2RlbGF5X2NmZ1szXSA9IHZhbHVlICYgMHhmZjsKKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2RlbGF5X2NmZywgc2l6ZW9mKGFnY19kZWxheV9jZmcpKTsKKworCQkvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIElBR0NCV1sxNTo4XQorCQkgICBvZiBpbm5lciBBR0MgbG9vcCBmaWx0ZXIgYmFuZHdpdGggKi8KKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCisJCQkgICAgICAgYWdjX2xvb3BfY2ZnLCBzaXplb2YoYWdjX2xvb3BfY2ZnKSk7CisKKwkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMCk7CisJCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSBwYXJhbS0+dS52c2IubW9kdWxhdGlvbjsKKwl9CisKKwkvKiBDaGFuZ2Ugb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgY2hhbmdpbmcgdGhlIGNoYW5uZWwgKi8KKwlpZiAoc3RhdGUtPmN1cnJlbnRfZnJlcXVlbmN5ICE9IHBhcmFtLT5mcmVxdWVuY3kpIHsKKwkJZHZiX3BsbF9jb25maWd1cmUoc3RhdGUtPmNvbmZpZy0+cGxsX2Rlc2MsIGJ1ZiwKKwkJCQkgIHBhcmFtLT5mcmVxdWVuY3ksIDApOworCQlkcHJpbnRrKCIlczogdHVuZXIgYnl0ZXM6IDB4JTAyeCAweCUwMnggIgorCQkJIjB4JTAyeCAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwkJaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzICxidWYsIDQpOworCisJCS8qIENoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHR1bmVyIHBsbCAqLworCQlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgYnVmLCAxKTsKKwkJZHByaW50aygiJXM6IHR1bmVyIHN0YXR1cyBieXRlID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZlswXSk7CisKKwkJLyogVXBkYXRlIGN1cnJlbnQgZnJlcXVlbmN5ICovCisJCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IHBhcmFtLT5mcmVxdWVuY3k7CisJfQorCWxnZHQzMzAyX1N3UmVzZXQoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJcGFyYW0tPmZyZXF1ZW5jeSA9IHN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc3RhdHVzX3QqIHN0YXR1cykKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1ZlszXTsKKworCSpzdGF0dXMgPSAwOyAvKiBSZXNldCBzdGF0dXMgcmVzdWx0ICovCisKKwkvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSB0dW5lciBwbGwgKi8KKwlpMmNfcmVhZGJ5dGVzKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5wbGxfYWRkcmVzcywgYnVmLCAxKTsKKwlkcHJpbnRrKCIlczogdHVuZXIgc3RhdHVzIGJ5dGUgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKwlpZiAoKGJ1ZlswXSAmIDB4YzApICE9IDB4NDApCisJCXJldHVybiAwOyAvKiBUdW5lciBQTEwgbm90IGxvY2tlZCBvciBub3QgcG93ZXJlZCBvbiAqLworCisJLyoKKwkgKiBZb3UgbXVzdCBzZXQgdGhlIE1hc2sgYml0cyB0byAxIGluIHRoZSBJUlFfTUFTSyBpbiBvcmRlcgorCSAqIHRvIHNlZSB0aGF0IHN0YXR1cyBiaXQgaW4gdGhlIElSUV9TVEFUVVMgcmVnaXN0ZXIuCisJICogVGhpcyBpcyBkb25lIGluIFN3UmVzZXQoKTsKKwkgKi8KKworCS8qIEFHQyBzdGF0dXMgcmVnaXN0ZXIgKi8KKwlpMmNfc2VsZWN0cmVhZGJ5dGVzKHN0YXRlLCBBR0NfU1RBVFVTLCBidWYsIDEpOworCWRwcmludGsoIiVzOiBBR0NfU1RBVFVTID0gMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIGJ1ZlswXSk7CisJaWYgKChidWZbMF0gJiAweDBjKSA9PSAweDgpeworCQkvKiBUZXN0IHNpZ25hbCBkb2VzIG5vdCBleGlzdCBmbGFnICovCisJCS8qIGFzIHdlbGwgYXMgdGhlIEFHQyBsb2NrIGZsYWcuICAgKi8KKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworCX0gZWxzZSB7CisJCS8qIFdpdGhvdXQgYSBzaWduYWwgYWxsIG90aGVyIHN0YXR1cyBiaXRzIGFyZSBtZWFuaW5nbGVzcyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzaWduYWwgc3RhdHVzICovCisJaTJjX3NlbGVjdHJlYWRieXRlcyhzdGF0ZSwgVE9QX0NPTlRST0wsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWRwcmludGsoIiVzOiBUT1BfQ09OVFJPTCA9IDB4JTAyeCwgSVJPX01BU0sgPSAweCUwMngsIElSUV9TVEFUVVMgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSk7CisKKyNpZiAwCisJLyogQWx0ZXJuYXRpdmUgbWV0aG9kIHRvIGNoZWNrIGZvciBhIHNpZ25hbCAqLworCS8qIHVzaW5nIHRoZSBTTlIgZ29vZC9iYWQgaW50ZXJydXB0cy4gICAqLworCWlmICgoYnVmWzJdICYgMHgzMCkgPT0gMHgxMCkKKwkJKnN0YXR1cyB8PSBGRV9IQVNfU0lHTkFMOworI2VuZGlmCisKKwkvKiBzeW5jIHN0YXR1cyAqLworCWlmICgoYnVmWzJdICYgMHgwMykgPT0gMHgwMSkgeworCQkqc3RhdHVzIHw9IEZFX0hBU19TWU5DOworCX0KKworCS8qIEZFQyBlcnJvciBzdGF0dXMgKi8KKwlpZiAoKGJ1ZlsyXSAmIDB4MGMpID09IDB4MDgpIHsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfTE9DSzsKKwkJKnN0YXR1cyB8PSBGRV9IQVNfVklURVJCSTsKKwl9CisKKwkvKiBDYXJyaWVyIFJlY292ZXJ5IExvY2sgU3RhdHVzIFJlZ2lzdGVyICovCisJaTJjX3NlbGVjdHJlYWRieXRlcyhzdGF0ZSwgQ0FSUklFUl9MT0NLLCBidWYsIDEpOworCWRwcmludGsoIiVzOiBDQVJSSUVSX0xPQ0sgPSAweCUwMnhcbiIsIF9fRlVOQ1RJT05fXywgYnVmWzBdKTsKKwlzd2l0Y2ggKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24pIHsKKwljYXNlIFFBTV8yNTY6CisJY2FzZSBRQU1fNjQ6CisJCS8qIE5lZWQgdG8gdW5kZXN0YW5kIHdoeSB0aGVyZSBhcmUgMyBsb2NrIGxldmVscyBoZXJlICovCisJCWlmICgoYnVmWzBdICYgMHgwNykgPT0gMHgwNykKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWNhc2UgVlNCXzg6CisJCWlmICgoYnVmWzBdICYgMHg4MCkgPT0gMHg4MCkKKwkJCSpzdGF0dXMgfD0gRkVfSEFTX0NBUlJJRVI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiS0VSTl9XQVJOSU5HIGxnZHQzMzAyOiAlczogTW9kdWxhdGlvbiBzZXQgdG8gdW5zdXBwb3J0ZWQgdmFsdWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGdkdDMzMDJfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHUxNiogc3RyZW5ndGgpCit7CisJLyogbm90IGRpcmVjdGx5IGF2YWlsYWJsZS4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZ2R0MzMwMl9yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTE2KiBzbnIpCit7CisjaWZkZWYgU05SX0lOX0RCCisJLyoKKwkgKiBTcGVjIHNoZWV0IHNob3dzIGZvcm11bGEgZm9yIFNOUl9FUSA9IDEwIGxvZzEwKDI1ICogMjQqKjIgLyBub2lzZSkKKwkgKiBhbmQgU05SX1BIID0gMTAgbG9nMTAoMjUgKiAzMioqMiAvIG5vaXNlKSBmb3IgZXF1YWxpemVyIGFuZCBwaGFzZSB0cmFja2VyCisJICogcmVzcGVjdGl2ZWx5LiBUaGUgZm9sbG93aW5nIHRhYmxlcyBhcmUgYnVpbHQgb24gdGhlc2UgZm9ybXVsYXMuCisJICogVGhlIHVzdWFsIGRlZmluaXRpb24gaXMgU05SID0gMjAgbG9nMTAoc2lnbmFsL25vaXNlKQorCSAqIElmIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHdyb25nIHRoZSB2YWx1ZSByZXR1bmVkIGlzIDEvMiB0aGUgYWN0dWFsIFNOUiBpbiBkYi4KKwkgKgorCSAqIFRoaXMgdGFibGUgaXMgYSBhbiBvcmRlcmVkIGxpc3Qgb2Ygbm9pc2UgdmFsdWVzIGNvbXB1dGVkIGJ5IHRoZQorCSAqIGZvcm11bGEgZnJvbSB0aGUgc3BlYyBzaGVldCBzdWNoIHRoYXQgdGhlIGluZGV4IGludG8gdGhlIHRhYmxlCisJICogc3RhcnRpbmcgYXQgNDMgb3IgNDUgaXMgdGhlIFNOUiB2YWx1ZSBpbiBkYi4gVGhlcmUgYXJlIGR1cGxpY2F0ZSBub2lzZQorCSAqIHZhbHVlIGVudHJpZXMgYXQgdGhlIGJlZ2lubmluZyBiZWNhdXNlIHRoZSBTTlIgdmFyaWVzIG1vcmUgdGhhbgorCSAqIDEgZGIgZm9yIGEgY2hhbmdlIG9mIDEgZGlnaXQgaW4gbm9pc2UgYXQgdmVyeSBzbWFsbCB2YWx1ZXMgb2Ygbm9pc2UuCisJICoKKwkgKiBFeGFtcGxlcyBmcm9tIFNOUl9FUSB0YWJsZToKKwkgKiBub2lzZSBTTlIKKwkgKiAgIDAgICAgNDMKKwkgKiAgIDEgICAgNDIKKwkgKiAgIDIgICAgMzkKKwkgKiAgIDMgICAgMzcKKwkgKiAgIDQgICAgMzYKKwkgKiAgIDUgICAgMzUKKwkgKiAgIDYgICAgMzQKKwkgKiAgIDcgICAgMzMKKwkgKiAgIDggICAgMzMKKwkgKiAgIDkgICAgMzIKKwkgKiAgIDEwICAgMzIKKwkgKiAgIDExICAgMzEKKwkgKiAgIDEyICAgMzEKKwkgKiAgIDEzICAgMzAKKwkgKi8KKworCXN0YXRpYyBjb25zdCB1MzIgU05SX0VRW10gPQorCQl7IDEsICAgICAyLCAgICAgIDIsICAgICAgMiwgMywgICAgICAzLCAgICAgIDQsICAgICA0LCAgICAgNSwgICAgIDcsCisJCSAgOSwgICAgIDExLCAgICAgMTMsICAgICAxNywgMjEsICAgICAyNiwgICAgIDMzLCAgICA0MSwgICAgNTIsICAgIDY1LAorCQkgIDgxLCAgICAxMDIsICAgIDEyOSwgICAgMTYyLCAyMDQsICAgIDI1NywgICAgMzIzLCAgIDQwNiwgICA1MTEsICAgNjQ0LAorCQkgIDgxMCwgICAxMDIwLCAgIDEyODQsICAgMTYxNiwgMjAzNSwgICAyNTYxLCAgIDMyMjQsICA0MDU5LCAgNTExMCwgIDY0MzMsCisJCSAgODA5OCwgIDEwMTk1LCAgMTI4MzUsICAxNjE1OCwgMjAzNDEsICAyNTYwOCwgIDMyMjM4LCA0MDU4NSwgNTEwOTQsIDY0MzIzLAorCQkgIDgwOTc4LCAxMDE5NDUsIDEyODM0MSwgMTYxNTcxLCAyMDM0MDYsIDI1NjA3MywgMHg0MDAwMAorCQl9OworCisJc3RhdGljIGNvbnN0IHUzMiBTTlJfUEhbXSA9CisJCXsgMSwgICAgIDIsICAgICAgMiwgICAgICAyLCAgICAgIDMsICAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDgsCisJCSAgMTAsICAgIDEyLCAgICAgMTUsICAgICAxOSwgICAgIDIzLCAgICAgMjksIDM3LCAgICA0NiwgICAgNTgsICAgIDczLAorCQkgIDkxLCAgICAxMTUsICAgIDE0NCwgICAgMTgyLCAgICAyMjksICAgIDI4OCwgMzYyLCAgIDQ1NiwgICA1NzQsICAgNzIyLAorCQkgIDkwOSwgICAxMTQ0LCAgIDE0NDAsICAgMTgxMywgICAyMjgyLCAgIDI4NzMsIDM2MTcsICA0NTUzLCAgNTczMiwgIDcyMTYsCisJCSAgOTA4NCwgIDExNDM2LCAgMTQzOTYsICAxODEyNCwgIDIyODE3LCAgMjg3MjQsICAzNjE2MSwgNDU1MjQsIDU3MzEyLCA3MjE1MSwKKwkJICA5MDgzMywgMTE0MzUxLCAxNDM5NjAsIDE4MTIzNSwgMjI4MTYxLCAweDA0MDAwMAorCQl9OworCisJc3RhdGljIHU4IGJ1Zls1XTsvKiByZWFkIGRhdGEgYnVmZmVyICovCisJc3RhdGljIHUzMiBub2lzZTsgICAvKiBub2lzZSB2YWx1ZSAqLworCXN0YXRpYyB1MzIgc25yX2RiOyAgLyogaW5kZXggaW50byBTTlJfRVFbXSAqLworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwkvKiByZWFkIGJvdGggZXF1YWxpemVyIGFuZCBwYXNlIHRyYWNrZXIgbm9pc2UgZGF0YSAqLworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgeworCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKworCQkvKgorCQkgKiBMb29rIHVwIG5vaXNlIHZhbHVlIGluIHRhYmxlLgorCQkgKiBBIGJldHRlciBzZWFyY2ggYWxnb3JpdGhtIGNvdWxkIGJlIHVzZWQuLi4KKwkJICogd2F0Y2ggb3V0IHRoZXJlIGFyZSBkdXBsaWNhdGUgZW50cmllcy4KKwkJICovCisJCWZvciAoc25yX2RiID0gMDsgc25yX2RiIDwgc2l6ZW9mKFNOUl9FUSk7IHNucl9kYisrKSB7CisJCQlpZiAobm9pc2UgPCBTTlJfRVFbc25yX2RiXSkgeworCQkJCSpzbnIgPSA0MyAtIHNucl9kYjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIFBoYXNlIFRyYWNrZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFFBTSAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNzw8MykgPDwgMTMpIHwgKGJ1ZlszXSA8PCA4KSB8IGJ1Zls0XTsKKworCQkvKiBMb29rIHVwIG5vaXNlIHZhbHVlIGluIHRhYmxlLiAqLworCQlmb3IgKHNucl9kYiA9IDA7IHNucl9kYiA8IHNpemVvZihTTlJfUEgpOyBzbnJfZGIrKykgeworCQkJaWYgKG5vaXNlIDwgU05SX1BIW3Nucl9kYl0pIHsKKwkJCQkqc25yID0gNDUgLSBzbnJfZGI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZWxzZQorCS8qIFJldHVybiB0aGUgcmF3IG5vaXNlIHZhbHVlICovCisJc3RhdGljIHU4IGJ1Zls1XTsvKiByZWFkIGRhdGEgYnVmZmVyICovCisJc3RhdGljIHUzMiBub2lzZTsgICAvKiBub2lzZSB2YWx1ZSAqLworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikgZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwkvKiByZWFkIGJvdGggZXF1YWxpemVyIGFuZCBwYXNlIHRyYWNrZXIgbm9pc2UgZGF0YSAqLworCWkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIEVRUEhfRVJSMCwgYnVmLCBzaXplb2YoYnVmKSk7CisKKwlpZiAoc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9PSBWU0JfOCkgeworCQkvKiBFcXVhbGl6ZXIgTWVhbi1TcXVhcmUgRXJyb3IgUmVnaXN0ZXIgZm9yIFZTQiAqLworCQlub2lzZSA9ICgoYnVmWzBdICYgNykgPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKwl9IGVsc2UgeworCQkvKiBQaGFzZSBUcmFja2VyIE1lYW4tU3F1YXJlIEVycm9yIFJlZ2lzdGVyIGZvciBRQU0gKi8KKwkJbm9pc2UgPSAoKGJ1ZlswXSAmIDc8PDMpIDw8IDEzKSB8IChidWZbM10gPDwgOCkgfCBidWZbNF07CisJfQorCisJLyogU21hbGwgdmFsdWVzIGZvciBub2lzZSBtZWFuIHNpZ25hbCBpcyBiZXR0ZXIgc28gaW52ZXJ0IG5vaXNlICovCisJLyogTm9pc2UgaXMgMTkgYml0IHZhbHVlIHNvIGRpc2NhcmQgMyBMU0IqLworCSpzbnIgPSB+bm9pc2U+PjM7CisjZW5kaWYKKworCWRwcmludGsoIiVzOiBub2lzZSA9IDB4JTA1eCwgc25yID0gJWlkYlxuIixfX0ZVTkNUSU9OX18sIG5vaXNlLCAqc25yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxnZHQzMzAyX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlX3R1bmVfc2V0dGluZ3MpCit7CisJLyogSSBoYXZlIG5vIGlkZWEgYWJvdXQgdGhpcyAtIGl0IG1heSBub3QgYmUgbmVlZGVkICovCisJZmVfdHVuZV9zZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNTAwOworCWZlX3R1bmVfc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDA7CisJZmVfdHVuZV9zZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGdkdDMzMDJfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgbGdkdDMzMDJfc3RhdGUqIHN0YXRlID0gKHN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSopIGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGxnZHQzMzAyX29wczsKKworc3RydWN0IGR2Yl9mcm9udGVuZCogbGdkdDMzMDJfYXR0YWNoKGNvbnN0IHN0cnVjdCBsZ2R0MzMwMl9jb25maWcqIGNvbmZpZywKKwkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKQoreworCXN0cnVjdCBsZ2R0MzMwMl9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGJ1ZlsxXTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGludGVybmFsIHN0YXRlICovCisJc3RhdGUgPSAoc3RydWN0IGxnZHQzMzAyX3N0YXRlKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGxnZHQzMzAyX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJbWVtc2V0KHN0YXRlLDAsc2l6ZW9mKCpzdGF0ZSkpOworCisJLyogU2V0dXAgdGhlIHN0YXRlICovCisJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmc3RhdGUtPm9wcywgJmxnZHQzMzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJLyogVmVyaWZ5IGNvbW11bmljYXRpb24gd2l0aCBkZW1vZCBjaGlwICovCisJaWYgKGkyY19zZWxlY3RyZWFkYnl0ZXMoc3RhdGUsIDIsIGJ1ZiwgMSkpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSAtMTsKKwlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gLTE7CisKKwkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWlmIChzdGF0ZSkKKwkJa2ZyZWUoc3RhdGUpOworCWRwcmludGsoIiVzOiBFUlJPUlxuIixfX0ZVTkNUSU9OX18pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgbGdkdDMzMDJfb3BzID0geworCS5pbmZvID0geworCQkubmFtZT0gIkxHIEVsZWN0cm9uaWNzIExHRFQzMzAyIFZTQi9RQU0gRnJvbnRlbmQiLAorCQkudHlwZSA9IEZFX0FUU0MsCisJCS5mcmVxdWVuY3lfbWluPSA1NDAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXg9IDg1ODAwMDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZT0gNjI1MDAsCisJCS8qIFN5bWJvbCByYXRlIGlzIGZvciBhbGwgVlNCIG1vZGVzIG5lZWQgdG8gY2hlY2sgUUFNICovCisJCS5zeW1ib2xfcmF0ZV9taW4gICAgPSAxMDc2MjAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCAgICA9IDEwNzYyMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzI1NiB8IEZFX0NBTl84VlNCCisJfSwKKwkuaW5pdCAgICAgICAgICAgICAgICAgPSBsZ2R0MzMwMl9pbml0LAorCS5zZXRfZnJvbnRlbmQgICAgICAgICA9IGxnZHQzMzAyX3NldF9wYXJhbWV0ZXJzLAorCS5nZXRfZnJvbnRlbmQgICAgICAgICA9IGxnZHQzMzAyX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgICAgPSBsZ2R0MzMwMl9nZXRfdHVuZV9zZXR0aW5ncywKKwkucmVhZF9zdGF0dXMgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3N0YXR1cywKKwkucmVhZF9iZXIgICAgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBsZ2R0MzMwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgICAgICAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3NuciwKKwkucmVhZF91Y2Jsb2NrcyAgICAgICAgPSBsZ2R0MzMwMl9yZWFkX3VjYmxvY2tzLAorCS5yZWxlYXNlICAgICAgICAgICAgICA9IGxnZHQzMzAyX3JlbGVhc2UsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIkxHRFQzMzAyIFtEVmlDTyBGdXNpb25IRFRWIDMgR29sZF0gKEFUU0MgOFZTQiAmIElUVS1UIEouODMgQW5uZXhCIDY0LzI1NiBRQU0pIERlbW9kdWxhdG9yIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2lsc29uIE1pY2hhZWxzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK0VYUE9SVF9TWU1CT0wobGdkdDMzMDJfYXR0YWNoKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBjb21waWxlLWNvbW1hbmQ6ICJtYWtlIERWQj0xIgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMwMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTg3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDIuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogJElkOiBsZ2R0MzMwMi5oLHYgMS4yIDIwMDUvMDYvMjggMjM6NTA6NDggbWtydWZreSBFeHAgJAorICoKKyAqICAgIFN1cHBvcnQgZm9yIExHRFQzMzAyIChEVmlDTyBGdXN0aW9uSERUViAzIEdvbGQpIC0gVlNCL1FBTQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMjAwNSBXaWxzb24gTWljaGFlbHMgPHdpbHNvbm1pY2hhZWxzQGVhcnRobGluay5uZXQ+CisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTEdEVDMzMDJfSAorI2RlZmluZSBMR0RUMzMwMl9ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworc3RydWN0IGxnZHQzMzAyX2NvbmZpZworeworCS8qIFRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCisJdTggZGVtb2RfYWRkcmVzczsKKwl1OCBwbGxfYWRkcmVzczsKKwlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKKworCS8qIE5lZWQgdG8gc2V0IGRldmljZSBwYXJhbSBmb3Igc3RhcnRfZG1hICovCisJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGxnZHQzMzAyX2F0dGFjaChjb25zdCBzdHJ1Y3QgbGdkdDMzMDJfY29uZmlnKiBjb25maWcsCisJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZiAvKiBMR0RUMzMwMl9IICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMDJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkzZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzAyX3ByaXYuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogJElkOiBsZ2R0MzMwMl9wcml2LmgsdiAxLjIgMjAwNS8wNi8yOCAyMzo1MDo0OCBta3J1Zmt5IEV4cCAkCisgKgorICogICAgU3VwcG9ydCBmb3IgTEdEVDMzMDIgKERWaUNPIEZ1c3Rpb25IRFRWIDMgR29sZCkgLSBWU0IvUUFNCisgKgorICogICAgQ29weXJpZ2h0IChDKSAyMDA1IFdpbHNvbiBNaWNoYWVscyA8d2lsc29ubWljaGFlbHNAZWFydGhsaW5rLm5ldD4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTEdEVDMzMDJfUFJJVl8KKyNkZWZpbmUgX0xHRFQzMzAyX1BSSVZfCisKKy8qIGkyYyBjb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAqLworZW51bSBJMkNfUkVHIHsKKwlUT1BfQ09OVFJPTD0gMHgwMCwKKwlJUlFfTUFTSz0gMHgwMSwKKwlJUlFfU1RBVFVTPSAweDAyLAorCVZTQl9DQVJSSUVSX0ZSRVEwPSAweDE2LAorCVZTQl9DQVJSSUVSX0ZSRVExPSAweDE3LAorCVZTQl9DQVJSSUVSX0ZSRVEyPSAweDE4LAorCVZTQl9DQVJSSUVSX0ZSRVEzPSAweDE5LAorCUNBUlJJRVJfTVNFUUFNMT0gMHgxYSwKKwlDQVJSSUVSX01TRVFBTTI9IDB4MWIsCisJQ0FSUklFUl9MT0NLPSAweDFjLAorCVRJTUlOR19SRUNPVkVSWT0gMHgxZCwKKwlBR0NfREVMQVkwPSAweDJhLAorCUFHQ19ERUxBWTE9IDB4MmIsCisJQUdDX0RFTEFZMj0gMHgyYywKKwlBR0NfUkZfQkFORFdJRFRIMD0gMHgyZCwKKwlBR0NfUkZfQkFORFdJRFRIMT0gMHgyZSwKKwlBR0NfUkZfQkFORFdJRFRIMj0gMHgyZiwKKwlBR0NfTE9PUF9CQU5EV0lEVEgwPSAweDMwLAorCUFHQ19MT09QX0JBTkRXSURUSDE9IDB4MzEsCisJQUdDX0ZVTkNfQ1RSTDE9IDB4MzIsCisJQUdDX0ZVTkNfQ1RSTDI9IDB4MzMsCisJQUdDX0ZVTkNfQ1RSTDM9IDB4MzQsCisJQUdDX1JGSUZfQUNDMD0gMHgzOSwKKwlBR0NfUkZJRl9BQ0MxPSAweDNhLAorCUFHQ19SRklGX0FDQzI9IDB4M2IsCisJQUdDX1NUQVRVUz0gMHgzZiwKKwlTWU5DX1NUQVRVU19WU0I9IDB4NDMsCisJRVFQSF9FUlIwPSAweDQ3LAorCUVRX0VSUjE9IDB4NDgsCisJRVFfRVJSMj0gMHg0OSwKKwlQSF9FUlIxPSAweDRhLAorCVBIX0VSUjI9IDB4NGIsCisJREVNVVhfQ09OVFJPTD0gMHg2NiwKKwlQQUNLRVRfRVJSX0NPVU5URVIxPSAweDZhLAorCVBBQ0tFVF9FUlJfQ09VTlRFUjI9IDB4NmIsCit9OworCisjZW5kaWYgLyogX0xHRFQzMzAyX1BSSVZfICovCisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM5NmFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKK0RyaXZlciBmb3IgU2Ftc3VuZyBTNUgxNDIwIFFQU0sgRGVtb2R1bGF0b3IKKworQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJldyBkZSBRdWluY2V5IDxhZHFfZHZiQGxpZHNraWFsZi5uZXQ+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKworR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgInM1aDE0MjAuaCIKKworCisKKyNkZWZpbmUgVE9ORV9GUkVRIDIyMDAwCisKK3N0cnVjdCBzNWgxNDIwX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CisJY29uc3Qgc3RydWN0IHM1aDE0MjBfY29uZmlnKiBjb25maWc7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKKworCXU4IHBvc3Rsb2NrZWQ6MTsKKwl1MzIgZmNsazsKKwl1MzIgdHVuZWRmcmVxOworCWZlX2NvZGVfcmF0ZV90IGZlY19pbm5lcjsKKwl1MzIgc3ltYm9sX3JhdGU7Cit9OworCitzdGF0aWMgdTMyIHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpOworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpOworCisKK3N0YXRpYyBpbnQgZGVidWcgPSAwOworI2RlZmluZSBkcHJpbnRrIGlmIChkZWJ1ZykgcHJpbnRrCisKK3N0YXRpYyBpbnQgczVoMTQyMF93cml0ZXJlZyAoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCB1OCByZWcsIHU4IGRhdGEpCit7CisJdTggYnVmIFtdID0geyByZWcsIGRhdGEgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDIgfTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCWRwcmludGsgKCIlczogd3JpdGVyZWcgZXJyb3IgKGVyciA9PSAlaSwgcmVnID09IDB4JTAyeCwgZGF0YSA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgcmVnLCBkYXRhKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBzNWgxNDIwX3JlYWRyZWcgKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQoreworCWludCByZXQ7CisJdTggYjAgW10gPSB7IHJlZyB9OworCXU4IGIxIFtdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnMSA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYjAsIC5sZW4gPSAxIH07CisJc3RydWN0IGkyY19tc2cgbXNnMiA9IHsgLmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLCAuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9IGIxLCAubGVuID0gMSB9OworCisJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIgKHN0YXRlLT5pMmMsICZtc2cxLCAxKSkgIT0gMSkKKwkJcmV0dXJuIHJldDsKKworCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyIChzdGF0ZS0+aTJjLCAmbXNnMiwgMSkpICE9IDEpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYjFbMF07Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXN3aXRjaCh2b2x0YWdlKSB7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgJiAweGZlKSB8IDB4MDIpOworCQlicmVhazsKKworCWNhc2UgU0VDX1ZPTFRBR0VfMTg6CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYykgfCAweDAzKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNjKSAmIDB4ZmQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NldF90b25lIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlzd2l0Y2godG9uZSkgeworCWNhc2UgU0VDX1RPTkVfT046CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3NCkgfCAweDA4KTsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19UT05FX09GRjoKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgJiAweDc0KSB8IDB4MDEpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NlbmRfbWFzdGVyX2NtZCAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQqIGNtZCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXN1bHQgPSAwOworCisJLyogc2V0dXAgZm9yIERJU0VRQyAqLworCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHgwMik7CisJbXNsZWVwKDE1KTsKKworCS8qIHdyaXRlIHRoZSBESVNFUUMgY29tbWFuZCBieXRlcyAqLworCWZvcihpPTA7IGk8IGNtZC0+bXNnX2xlbjsgaSsrKSB7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2MgKyBpLCBjbWQtPm1zZ1tpXSk7CisJfQorCisJLyoga2ljayBvZmYgdHJhbnNtaXNzaW9uICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSB8ICgoY21kLT5tc2dfbGVuLTEpIDw8IDQpIHwgMHgwOCk7CisKKwkvKiB3YWl0IGZvciB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICgoMTAwKkhaKSAvIDEwMDApOworCXdoaWxlKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkKKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCisJCXJlc3VsdCA9IC1FVElNRURPVVQ7CisKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgdmFsKTsKKwltc2xlZXAoMTUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkqIHJlcGx5KQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IHZhbDsKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCS8qIHNldHVwIGZvciBESVNFUUMgcmVjaWV2ZSAqLworCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgMHg4Mik7IC8qIEZJWE1FOiBndWVzcyAtIGRvIHdlIG5lZWQgdG8gc2V0IERJU19SRFkoMHgwOCkgaW4gcmVjZWl2ZSBtb2RlPyAqLworCW1zbGVlcCgxNSk7CisKKwkvKiB3YWl0IGZvciByZWNlcHRpb24gdG8gY29tcGxldGUgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICgocmVwbHktPnRpbWVvdXQqSFopIC8gMTAwMCk7CisJd2hpbGUodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaWYgKCEoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4ODApKSAvKiBGSVhNRTogZG8gd2UgdGVzdCBESVNfUkRZKDB4MDgpIG9yIFJDVl9FTigweDgwKT8gKi8KKwkJCWJyZWFrOworCisJCW1zbGVlcCg1KTsKKwl9CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVzdWx0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBleGl0OworCX0KKworCS8qIGNoZWNrIGVycm9yIGZsYWcgLSBGSVhNRTogbm90IHN1cmUgd2hhdCB0aGlzIGRvZXMgLSBkb2NzIGRvIG5vdCBkZXNjcmliZQorCSAqIGJleW9uZCAiZXJyb3IgZmxhZyBmb3IgZGlzZXFjIHJlY2VpdmUgZGF0YSA6KCAqLworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDkpKSB7CisJCXJlc3VsdCA9IC1FSU87CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBjaGVjayBsZW5ndGggKi8KKwlsZW5ndGggPSAoczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDNiKSAmIDB4NzApID4+IDQ7CisJaWYgKGxlbmd0aCA+IHNpemVvZihyZXBseS0+bXNnKSkgeworCQlyZXN1bHQgPSAtRU9WRVJGTE9XOworCQlnb3RvIGV4aXQ7CisJfQorCXJlcGx5LT5tc2dfbGVuID0gbGVuZ3RoOworCisJLyogZXh0cmFjdCBkYXRhICovCisJZm9yKGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKKwkJcmVwbHktPm1zZ1tpXSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYyArIGkpOworCX0KKworZXhpdDoKKwkvKiByZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYiwgdmFsKTsKKwltc2xlZXAoMTUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9zZW5kX2J1cnN0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgbWluaWNtZCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCB2YWw7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJLyogc2V0dXAgZm9yIHRvbmUgYnVyc3QgKi8KKwl2YWwgPSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHg3MCkgfCAweDAxKTsKKworCS8qIHNldCB2YWx1ZSBmb3IgQiBwb3NpdGlvbiBpZiByZXF1ZXN0ZWQgKi8KKwlpZiAobWluaWNtZCA9PSBTRUNfTUlOSV9CKSB7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA0KTsKKwl9CisJbXNsZWVwKDE1KTsKKworCS8qIHN0YXJ0IHRyYW5zbWlzc2lvbiAqLworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzYikgfCAweDA4KTsKKworCS8qIHdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKCgyMCpIWikgLyAxMDAwKTsKKwl3aGlsZSh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpZiAoIShzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4M2IpICYgMHgwOCkpCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJfQorCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQlyZXN1bHQgPSAtRVRJTUVET1VUOworCisJLyogcmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncyAqLworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4M2IsIHZhbCk7CisJbXNsZWVwKDE1KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgZmVfc3RhdHVzX3QgczVoMTQyMF9nZXRfc3RhdHVzX2JpdHMoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCXU4IHZhbDsKKwlmZV9zdGF0dXNfdCBzdGF0dXMgPSAwOworCisJdmFsID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDE0KTsKKwlpZiAodmFsICYgMHgwMikKKwkJc3RhdHVzIHw9ICBGRV9IQVNfU0lHTkFMOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCWlmICh2YWwgJiAweDAxKQorCQlzdGF0dXMgfD0gIEZFX0hBU19DQVJSSUVSOyAvLyBGSVhNRTogbm90IHN1cmUgaWYgdGhpcyBpcyByaWdodAorCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzNik7CisJaWYgKHZhbCAmIDB4MDEpCisJCXN0YXR1cyB8PSAgRkVfSEFTX1ZJVEVSQkk7CisJaWYgKHZhbCAmIDB4MjApCisJCXN0YXR1cyB8PSAgRkVfSEFTX1NZTkM7CisJaWYgKHN0YXR1cyA9PSAoRkVfSEFTX1NJR05BTHxGRV9IQVNfQ0FSUklFUnxGRV9IQVNfVklURVJCSXxGRV9IQVNfU1lOQykpCisJCXN0YXR1cyB8PSAgRkVfSEFTX0xPQ0s7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190KiBzdGF0dXMpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggdmFsOworCisJaWYgKHN0YXR1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRldGVybWluZSBsb2NrIHN0YXRlICovCisJKnN0YXR1cyA9IHM1aDE0MjBfZ2V0X3N0YXR1c19iaXRzKHN0YXRlKTsKKworCS8qIGZpeCBmb3IgRkVDIDUvNiBpbnZlcnNpb24gaXNzdWUgLSBpZiBpdCBkb2Vzbid0IHF1aXRlIGxvY2ssIGludmVydCB0aGUgaW52ZXJzaW9uLAorCXdhaXQgYSBiaXQgYW5kIGNoZWNrIGFnYWluICovCisJaWYgKCpzdGF0dXMgPT0gKEZFX0hBU19TSUdOQUx8RkVfSEFTX0NBUlJJRVJ8RkVfSEFTX1ZJVEVSQkkpKSB7CisJCXZhbCA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMik7CisJCWlmICgodmFsICYgMHgwNykgPT0gMHgwMykgeworCQkJaWYgKHZhbCAmIDB4MDgpCisJCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMyk7CisJCQllbHNlCisJCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxYik7CisKKwkJCS8qIHdhaXQgYSBiaXQgdGhlbiB1cGRhdGUgbG9jayBzdGF0dXMgKi8KKwkJCW1kZWxheSgyMDApOworCQkJKnN0YXR1cyA9IHM1aDE0MjBfZ2V0X3N0YXR1c19iaXRzKHN0YXRlKTsKKwkJfQorCX0KKworCS8qIHBlcmZvcm0gcG9zdCBsb2NrIHNldHVwICovCisJaWYgKCgqc3RhdHVzICYgRkVfSEFTX0xPQ0spICYmICghc3RhdGUtPnBvc3Rsb2NrZWQpKSB7CisKKwkJLyogY2FsY3VsYXRlIHRoZSBkYXRhIHJhdGUgKi8KKwkJdTMyIHRtcCA9IHM1aDE0MjBfZ2V0c3ltYm9scmF0ZShzdGF0ZSk7CisJCXN3aXRjaChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwNykgeworCQljYXNlIDA6CisJCQl0bXAgPSAodG1wICogMiAqIDEpIC8gMjsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCXRtcCA9ICh0bXAgKiAyICogMikgLyAzOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJdG1wID0gKHRtcCAqIDIgKiAzKSAvIDQ7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQl0bXAgPSAodG1wICogMiAqIDUpIC8gNjsKKwkJCWJyZWFrOworCisJCWNhc2UgNDoKKwkJCXRtcCA9ICh0bXAgKiAyICogNikgLyA3OworCQkJYnJlYWs7CisKKwkJY2FzZSA1OgorCQkJdG1wID0gKHRtcCAqIDIgKiA3KSAvIDg7CisJCQlicmVhazsKKwkJfQorCQl0bXAgPSBzdGF0ZS0+ZmNsayAvIHRtcDsKKworCQkvKiBzZXQgdGhlIE1QRUdfQ0xLX0lOVEwgZm9yIHRoZSBjYWxjdWxhdGVkIGRhdGEgcmF0ZSAqLworCQlpZiAodG1wIDwgNCkKKwkJCXZhbCA9IDB4MDA7CisJCWVsc2UgaWYgKHRtcCA8IDgpCisJCQl2YWwgPSAweDAxOworCQllbHNlIGlmICh0bXAgPCAxMikKKwkJCXZhbCA9IDB4MDI7CisJCWVsc2UgaWYgKHRtcCA8IDE2KQorCQkJdmFsID0gMHgwMzsKKwkJZWxzZSBpZiAodG1wIDwgMjQpCisJCQl2YWwgPSAweDA0OworCQllbHNlIGlmICh0bXAgPCAzMikKKwkJCXZhbCA9IDB4MDU7CisJCWVsc2UKKwkJCXZhbCA9IDB4MDY7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MjIsIHZhbCk7CisKKwkJLyogREMgZnJlZXplICovCisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MWYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxZikgfCAweDAxKTsKKworCQkvKiBraWNrZXIgZGlzYWJsZSArIHJlbW92ZSBEQyBvZmZzZXQgKi8KKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSAmIDB4NmYpOworCisJCS8qIHBvc3QtbG9jayBwcm9jZXNzaW5nIGhhcyBiZWVuIGRvbmUhICovCisJCXN0YXRlLT5wb3N0bG9ja2VkID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIqIGJlcikKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4NDYsIDB4MWQpOworCW1kZWxheSgyNSk7CisJcmV0dXJuIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYqIHN0cmVuZ3RoKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJdTggdmFsID0gMHhmZiAtIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxNSk7CisKKwlyZXR1cm4gKGludCkgKCh2YWwgPDwgOCkgfCB2YWwpOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdTMyKiB1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4NDYsIDB4MWYpOworCW1kZWxheSgyNSk7CisJcmV0dXJuIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4NDgpIDw8IDgpIHwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDQ3KTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9yZXNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDEsIDB4MDgpOworCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAxLCAweDAwKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBzNWgxNDIwX3NldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJdTY0IHZhbDsKKworCXZhbCA9IChwLT51LnFwc2suc3ltYm9sX3JhdGUgLyAxMDAwKSAqICgxPDwyNCk7CisJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA8PSAyMTAwMDAwMCkgeworCQl2YWwgKj0gMjsKKwl9CisJZG9fZGl2KHZhbCwgKHN0YXRlLT5mY2xrIC8gMTAwMCkpOworCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwOSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA5KSAmIDB4N2YpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MTEsIHZhbCA+PiAxNik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgxMiwgdmFsID4+IDgpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MTMsIHZhbCAmIDB4ZmYpOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDksIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwOSkgfCAweDgwKTsKK30KKworc3RhdGljIHUzMiBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCXU2NCB2YWw7CisJaW50IHNhbXBsaW5nID0gMjsKKworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDUpICYgMHgyKQorCQlzYW1wbGluZyA9IDE7CisKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpIHwgMHgwOCk7CisJdmFsICA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxMSkgPDwgMTY7CisJdmFsIHw9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgxMikgPDwgODsKKwl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDEzKTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA2LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDYpICYgMHhmNyk7CisKKwl2YWwgKj0gKHN0YXRlLT5mY2xrIC8gMTAwMCk7CisJZG9fZGl2KHZhbCwgKCgxPDwyNCkgKiBzYW1wbGluZykpOworCisJcmV0dXJuICh1MzIpICh2YWwgKiAxMDAwKTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgaW50IGZyZXFvZmZzZXQpCit7CisJaW50IHZhbDsKKworCS8qIHJlbWVtYmVyIGZyZXFvZmZzZXQgaXMgaW4ga0h6LCBidXQgdGhlIGNoaXAgd2FudHMgdGhlIG9mZnNldCBpbiBIeiwgc28KKwkgKiBkaXZpZGUgZmNsayBieSAxMDAwMDAwIHRvIGdldCB0aGUgY29ycmVjdCB2YWx1ZS4gKi8KKwl2YWwgPSAtKGludCkgKChmcmVxb2Zmc2V0ICogKDE8PDI0KSkgLyAoc3RhdGUtPmZjbGsgLyAxMDAwMDAwKSk7CisKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA5LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDkpICYgMHhiZik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZSwgdmFsID4+IDE2KTsKKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDBmLCB2YWwgPj4gOCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgxMCwgdmFsICYgMHhmZik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwOSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA5KSB8IDB4NDApOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfZ2V0ZnJlcW9mZnNldChzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJaW50IHZhbDsKKworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgfCAweDA4KTsKKwl2YWwgID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDBlKSA8PCAxNjsKKwl2YWwgfD0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDBmKSA8PCA4OworCXZhbCB8PSBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MTApOworCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDYsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwNikgJiAweGY3KTsKKworCWlmICh2YWwgJiAweDgwMDAwMCkKKwkJdmFsIHw9IDB4ZmYwMDAwMDA7CisKKwkvKiByZW1lbWJlciBmcmVxb2Zmc2V0IGlzIGluIGtIeiwgYnV0IHRoZSBjaGlwIHdhbnRzIHRoZSBvZmZzZXQgaW4gSHosIHNvCisJICogZGl2aWRlIGZjbGsgYnkgMTAwMDAwMCB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuICovCisJdmFsID0gLSAoKHZhbCAqIChzdGF0ZS0+ZmNsay8xMDAwMDAwKSkgLyAoMTw8MjQpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHM1aDE0MjBfc2V0ZmVjKHN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCWlmICgocC0+dS5xcHNrLmZlY19pbm5lciA9PSBGRUNfQVVUTykgfHwgKHAtPmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgwMCk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4M2YpOworCX0gZWxzZSB7CisJCXN3aXRjaChwLT51LnFwc2suZmVjX2lubmVyKSB7CisJCWNhc2UgRkVDXzFfMjoKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTApOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwMSk7CisJCQlicmVhazsKKworCQljYXNlIEZFQ18yXzM6CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDExKTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MDIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRUNfM180OgorCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxMik7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDA0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgRkVDXzVfNjoKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIDB4MTMpOworCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgwOCk7CisJCQlicmVhazsKKworCQljYXNlIEZFQ182Xzc6CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDE0KTsKKwkJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzAsIDB4MTApOworCQkJYnJlYWs7CisKKwkJY2FzZSBGRUNfN184OgorCQkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMSwgMHgxNSk7CisJCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMwLCAweDIwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyBmZV9jb2RlX3JhdGVfdCBzNWgxNDIwX2dldGZlYyhzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUpCit7CisJc3dpdGNoKHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgzMikgJiAweDA3KSB7CisJY2FzZSAwOgorCQlyZXR1cm4gRkVDXzFfMjsKKworCWNhc2UgMToKKwkJcmV0dXJuIEZFQ18yXzM7CisKKwljYXNlIDI6CisJCXJldHVybiBGRUNfM180OworCisJY2FzZSAzOgorCQlyZXR1cm4gRkVDXzVfNjsKKworCWNhc2UgNDoKKwkJcmV0dXJuIEZFQ182Xzc7CisKKwljYXNlIDU6CisJCXJldHVybiBGRUNfN184OworCX0KKworCXJldHVybiBGRUNfTk9ORTsKK30KKworc3RhdGljIHZvaWQgczVoMTQyMF9zZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJaWYgKChwLT51LnFwc2suZmVjX2lubmVyID09IEZFQ19BVVRPKSB8fCAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9BVVRPKSkgeworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDMxLCAweDAwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzMCwgMHgzZik7CisJfSBlbHNlIHsKKwkJdTggdG1wID0gczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDMxKSAmIDB4Zjc7CisJCQl0bXAgfD0gMHgxMDsKKworCQlpZiAocC0+aW52ZXJzaW9uID09IElOVkVSU0lPTl9PTikKKwkJCXRtcCB8PSAweDgwOworCisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MzEsIHRtcCk7CisJfQorfQorCitzdGF0aWMgZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgczVoMTQyMF9nZXRpbnZlcnNpb24oc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlKQoreworCWlmIChzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MzIpICYgMHgwOCkKKwkJcmV0dXJuIElOVkVSU0lPTl9PTjsKKworCXJldHVybiBJTlZFUlNJT05fT0ZGOworfQorCitzdGF0aWMgaW50IHM1aDE0MjBfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIGZyZXF1ZW5jeV9kZWx0YTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgZmVzZXR0aW5nczsKKworCS8qIGNoZWNrIGlmIHdlIHNob3VsZCBkbyBhIGZhc3QtdHVuZSAqLworCW1lbWNweSgmZmVzZXR0aW5ncy5wYXJhbWV0ZXJzLCBwLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CisJczVoMTQyMF9nZXRfdHVuZV9zZXR0aW5ncyhmZSwgJmZlc2V0dGluZ3MpOworCWZyZXF1ZW5jeV9kZWx0YSA9IHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXE7CisJaWYgKChmcmVxdWVuY3lfZGVsdGEgPiAtZmVzZXR0aW5ncy5tYXhfZHJpZnQpICYmIChmcmVxdWVuY3lfZGVsdGEgPCBmZXNldHRpbmdzLm1heF9kcmlmdCkgJiYKKwkgICAgKGZyZXF1ZW5jeV9kZWx0YSAhPSAwKSAmJgorCSAgICAoc3RhdGUtPmZlY19pbm5lciA9PSBwLT51LnFwc2suZmVjX2lubmVyKSAmJgorCSAgICAoc3RhdGUtPnN5bWJvbF9yYXRlID09IHAtPnUucXBzay5zeW1ib2xfcmF0ZSkpIHsKKworCQlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIGZyZXF1ZW5jeV9kZWx0YSk7CisJCXJldHVybiAwOworCX0KKworCS8qIGZpcnN0IG9mIGFsbCwgc29mdHdhcmUgcmVzZXQgKi8KKwlzNWgxNDIwX3Jlc2V0KHN0YXRlKTsKKworCS8qIHNldCB0dW5lciBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgeworCQlzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7CisJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZzdGF0ZS0+dHVuZWRmcmVxKTsKKwkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSAmIDB4ZmUpOworCX0KKworCS8qIHNldCBzNWgxNDIwIGZjbGsgUExMIGFjY29yZGluZyB0byBkZXNpcmVkIHN5bWJvbCByYXRlICovCisJaWYgKHAtPnUucXBzay5zeW1ib2xfcmF0ZSA+IDI4MDAwMDAwKSB7CisJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4NTApOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA0LCAweDQwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHhhZSk7CisJfSBlbHNlIGlmIChwLT51LnFwc2suc3ltYm9sX3JhdGUgPiAyMTAwMDAwMCkgeworCQlzdGF0ZS0+ZmNsayA9IDU5MDAwMDAwOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDAzLCAweDMzKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNCwgMHg0MCk7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDUsIDB4YWUpOworCX0gZWxzZSB7CisJCXN0YXRlLT5mY2xrID0gODgwMDAwMDA7CisJCXM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDMsIDB4NTApOworCQlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA0LCAweDQwKTsKKwkJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgMHhhYyk7CisJfQorCisJLyogc2V0IG1pc2MgcmVnaXN0ZXJzICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwMiwgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNywgMHhiMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYSwgMHg2Nyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYiwgMHg3OCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwYywgMHg0OCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwZCwgMHg2Yik7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgyZSwgMHg4ZSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzNSwgMHgzMyk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzOCwgMHgwMSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzOSwgMHg3ZCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYSwgKHN0YXRlLT5mY2xrICsgKFRPTkVfRlJFUSAqIDMyKSAtIDEpIC8gKFRPTkVfRlJFUSAqIDMyKSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgzYywgMHgwMCk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NSwgMHg2MSk7CisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHg0NiwgMHgxZCk7CisKKwkvKiBzdGFydCBRUFNLICovCisJczVoMTQyMF93cml0ZXJlZyhzdGF0ZSwgMHgwNSwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLCAweDA1KSB8IDEpOworCisJLyogc2V0IHRoZSBmcmVxdWVuY3kgb2Zmc2V0IHRvIGFkanVzdCBmb3IgUExMIGluYWNjdXJhY3kgKi8KKwlzNWgxNDIwX3NldGZyZXFvZmZzZXQoc3RhdGUsIHAtPmZyZXF1ZW5jeSAtIHN0YXRlLT50dW5lZGZyZXEpOworCisJLyogc2V0IHRoZSByZXNldCBvZiB0aGUgcGFyYW1ldGVycyAqLworCXM1aDE0MjBfc2V0c3ltYm9scmF0ZShzdGF0ZSwgcCk7CisJczVoMTQyMF9zZXRpbnZlcnNpb24oc3RhdGUsIHApOworCXM1aDE0MjBfc2V0ZmVjKHN0YXRlLCBwKTsKKworCXN0YXRlLT5mZWNfaW5uZXIgPSBwLT51LnFwc2suZmVjX2lubmVyOworCXN0YXRlLT5zeW1ib2xfcmF0ZSA9IHAtPnUucXBzay5zeW1ib2xfcmF0ZTsKKwlzdGF0ZS0+cG9zdGxvY2tlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCXAtPmZyZXF1ZW5jeSA9IHN0YXRlLT50dW5lZGZyZXEgKyBzNWgxNDIwX2dldGZyZXFvZmZzZXQoc3RhdGUpOworCXAtPmludmVyc2lvbiA9IHM1aDE0MjBfZ2V0aW52ZXJzaW9uKHN0YXRlKTsKKwlwLT51LnFwc2suc3ltYm9sX3JhdGUgPSBzNWgxNDIwX2dldHN5bWJvbHJhdGUoc3RhdGUpOworCXAtPnUucXBzay5mZWNfaW5uZXIgPSBzNWgxNDIwX2dldGZlYyhzdGF0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCit7CisJaWYgKGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlID4gMjAwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gNTA7CisJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDIwMDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDgwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDEyMDAwMDAwKSB7CisJCWZlc2V0dGluZ3MtPm1pbl9kZWxheV9tcyA9IDEwMDsKKwkJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMTUwMDsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gOTAwMDsKKwl9IGVsc2UgaWYgKGZlc2V0dGluZ3MtPnBhcmFtZXRlcnMudS5xcHNrLnN5bWJvbF9yYXRlID4gODAwMDAwMCkgeworCQlmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSAxMDA7CisJCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDEwMDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDgwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDQwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMTAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSA1MDA7CisJCWZlc2V0dGluZ3MtPm1heF9kcmlmdCA9IDcwMDA7CisJfSBlbHNlIGlmIChmZXNldHRpbmdzLT5wYXJhbWV0ZXJzLnUucXBzay5zeW1ib2xfcmF0ZSA+IDIwMDAwMDApIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyA4MDAwKTsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMTQgKiBmZXNldHRpbmdzLT5zdGVwX3NpemU7CisJfSBlbHNlIHsKKwkJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMjAwOworCQlmZXNldHRpbmdzLT5zdGVwX3NpemUgPSAoZmVzZXR0aW5ncy0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyA4MDAwKTsKKwkJZmVzZXR0aW5ncy0+bWF4X2RyaWZ0ID0gMTggKiBmZXNldHRpbmdzLT5zdGVwX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVoMTQyMF9pbml0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCS8qIGRpc2FibGUgcG93ZXIgZG93biBhbmQgZG8gcmVzZXQgKi8KKwlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDAyLCAweDEwKTsKKwltc2xlZXAoMTApOworCXM1aDE0MjBfcmVzZXQoc3RhdGUpOworCisJLyogaW5pdCBQTEwgKi8KKwlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKKwkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOworCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7CisJCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgJiAweGZlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNWgxNDIwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQoreworCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJcmV0dXJuIHM1aDE0MjBfd3JpdGVyZWcoc3RhdGUsIDB4MDIsIDB4MTIpOworfQorCitzdGF0aWMgdm9pZCBzNWgxNDIwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgczVoMTQyMF9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQqIHM1aDE0MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCBzNWgxNDIwX2NvbmZpZyogY29uZmlnLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYykKK3sKKwlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBOVUxMOworCXU4IGlkZW50aXR5OworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzNWgxNDIwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KKwlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOworCXN0YXRlLT5pMmMgPSBpMmM7CisJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmczVoMTQyMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5wb3N0bG9ja2VkID0gMDsKKwlzdGF0ZS0+ZmNsayA9IDg4MDAwMDAwOworCXN0YXRlLT50dW5lZGZyZXEgPSAwOworCXN0YXRlLT5mZWNfaW5uZXIgPSBGRUNfTk9ORTsKKwlzdGF0ZS0+c3ltYm9sX3JhdGUgPSAwOworCisJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICsgaWRlbnRpZnkgaXQgKi8KKwlpZGVudGl0eSA9IHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwgMHgwMCk7CisJaWYgKGlkZW50aXR5ICE9IDB4MDMpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CisKK2Vycm9yOgorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIHM1aDE0MjBfb3BzID0geworCisJLmluZm8gPSB7CisJCS5uYW1lICAgICA9ICJTYW1zdW5nIFM1SDE0MjAgRFZCLVMiLAorCQkudHlwZSAgICAgPSBGRV9RUFNLLAorCQkuZnJlcXVlbmN5X21pbiAgICA9IDk1MDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggICAgPSAyMTUwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXBzaXplID0gMTI1LCAgICAgLyoga0h6IGZvciBRUFNLIGZyb250ZW5kcyAqLworCQkuZnJlcXVlbmN5X3RvbGVyYW5jZSAgPSAyOTUwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiAgPSAxMDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWF4ICA9IDQ1MDAwMDAwLAorCQkvKiAgLnN5bWJvbF9yYXRlX3RvbGVyYW5jZSAgPSA/Pz8sKi8KKwkJLmNhcHMgPSBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gfAorCQlGRV9DQU5fRkVDXzFfMiB8IEZFX0NBTl9GRUNfMl8zIHwgRkVfQ0FOX0ZFQ18zXzQgfAorCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfNl83IHwgRkVfQ0FOX0ZFQ183XzggfCBGRV9DQU5fRkVDX0FVVE8gfAorCQlGRV9DQU5fUVBTSworCX0sCisKKwkucmVsZWFzZSA9IHM1aDE0MjBfcmVsZWFzZSwKKworCS5pbml0ID0gczVoMTQyMF9pbml0LAorCS5zbGVlcCA9IHM1aDE0MjBfc2xlZXAsCisKKwkuc2V0X2Zyb250ZW5kID0gczVoMTQyMF9zZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZCA9IHM1aDE0MjBfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IHM1aDE0MjBfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkucmVhZF9zdGF0dXMgPSBzNWgxNDIwX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IHM1aDE0MjBfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gczVoMTQyMF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF91Y2Jsb2NrcyA9IHM1aDE0MjBfcmVhZF91Y2Jsb2NrcywKKworCS5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gczVoMTQyMF9zZW5kX21hc3Rlcl9jbWQsCisJLmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5ID0gczVoMTQyMF9yZWN2X3NsYXZlX3JlcGx5LAorCS5kaXNlcWNfc2VuZF9idXJzdCA9IHM1aDE0MjBfc2VuZF9idXJzdCwKKwkuc2V0X3RvbmUgPSBzNWgxNDIwX3NldF90b25lLAorCS5zZXRfdm9sdGFnZSA9IHM1aDE0MjBfc2V0X3ZvbHRhZ2UsCit9OworCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTNUgxNDIwIERWQi1TIERlbW9kdWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IGRlIFF1aW5jZXkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChzNWgxNDIwX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjg3ZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMCwwICsxLDQxIEBACisvKgorICAgIERyaXZlciBmb3IgUzVIMTQyMCBRUFNLIERlbW9kdWxhdG9ycworCisgICAgQ29weXJpZ2h0IChDKSAyMDA1IEFuZHJldyBkZSBRdWluY2V5IDxhZHFfZHZiQGxpZHNraWFsZi5uZXQ+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorCisqLworCisjaWZuZGVmIFM1SDE0MjBfSAorI2RlZmluZSBTNUgxNDIwX0gKKworI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorCitzdHJ1Y3QgczVoMTQyMF9jb25maWcKK3sKKwkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLworCXU4IGRlbW9kX2FkZHJlc3M7CisKKwkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KKwlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOworCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTMyKiBmcmVxb3V0KTsKK307CisKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzNWgxNDIwX2F0dGFjaChjb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYyk7CisKKyNlbmRpZiAvLyBTNUgxNDIwX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCmluZGV4IGU2ODEyNjMuLjkyOGFjYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYwpAQCAtNjE3LDcgKzYxNyw3IEBACiAKIAkvKiB3YWl0IGZvciBXR0FHQyBsb2NrICovCiAJc3RhcnR0aW1lID0gamlmZmllczsKLQl0aW1lb3V0ID0gamlmZmllcyArICgyMDAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKTsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKIAkJbXNsZWVwKDEwKTsKIAkJaWYgKHN0djAyOTdfcmVhZHJlZyhzdGF0ZSwgMHg0MykgJiAweDA4KQpAQCAtNjI5LDcgKzYyOSw3IEBACiAJbXNsZWVwKDIwKTsKIAogCS8qIHdhaXQgZm9yIGVxdWFsaXNlciBwYXJ0aWFsIGNvbnZlcmdlbmNlICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoNTAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoMTApOwogCkBAIC02NDIsNyArNjQyLDcgQEAKIAl9CiAKIAkvKiB3YWl0IGZvciBlcXVhbGlzZXIgZnVsbCBjb252ZXJnZW5jZSAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgKGRlbGF5ICogSFopIC8gMTAwMDsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXkpOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQltc2xlZXAoMTApOwogCkBAIC02NTksNyArNjU5LDcgQEAKIAlzdHYwMjk3X3dyaXRlcmVnX21hc2soc3RhdGUsIDB4ODgsIDgsIDApOwogCiAJLyogd2FpdCBmb3IgbWFpbiBsb2NrICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAoMjAgKiBIWikgLyAxMDAwOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCW1zbGVlcCgxMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKaW5kZXggMGJlYjM3MC4uYWIwYzAzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmMKQEAgLTQ5LDEwICs0OSw4IEBACiAJLyogcHJpdmF0ZSBkZW1vZCBkYXRhICovCiAJdTggaW5pdGlhbGlzZWQ7CiAJZW51bSB0ZGExMDA0eF9kZW1vZCBkZW1vZF90eXBlOwotCXU4IGZ3X3ZlcnNpb247CiB9OwogCi0KIHN0YXRpYyBpbnQgZGVidWc7CiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAogCWRvIHsgXApAQCAtMTIyLDYgKzEyMCw4IEBACiAjZGVmaW5lIFREQTEwMDQ2SF9HUElPX09VVF9TRUwJIDB4NDEKICNkZWZpbmUgVERBMTAwNDZIX0dQSU9fU0VMRUNUCSAweDQyCiAjZGVmaW5lIFREQTEwMDQ2SF9BR0NfQ09ORgkgMHg0MworI2RlZmluZSBUREExMDA0NkhfQUdDX1RIUgkgMHg0NAorI2RlZmluZSBUREExMDA0NkhfQUdDX1JFTk9STQkgMHg0NQogI2RlZmluZSBUREExMDA0NkhfQUdDX0dBSU5TCSAweDQ2CiAjZGVmaW5lIFREQTEwMDQ2SF9BR0NfVFVOX01JTgkgMHg0NwogI2RlZmluZSBUREExMDA0NkhfQUdDX1RVTl9NQVgJIDB4NDgKQEAgLTI3NCwxNCArMjc0LDI2IEBACiAJc3dpdGNoIChiYW5kd2lkdGgpIHsKIAljYXNlIEJBTkRXSURUSF82X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzZtaHosIHNpemVvZihiYW5kd2lkdGhfNm1oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDA5KTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg0Zik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJBTkRXSURUSF83X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzdtaHosIHNpemVvZihiYW5kd2lkdGhfN21oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBhKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHg3OSk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJBTkRXSURUSF84X01IWjoKIAkJdGRhMTAwNHhfd3JpdGVfYnVmKHN0YXRlLCBUREExMDA0NkhfVElNRV9XUkVGMSwgYmFuZHdpZHRoXzhtaHosIHNpemVvZihiYW5kd2lkdGhfOG1oeikpOworCQlpZiAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSA9PSBUREExMDA0Nl9GUkVRXzA0NSkgeworCQkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBiKTsKKwkJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHhhMyk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzE1LDIwICszMjcsMzUgQEAKIAkJbWVtY3B5KGJ1ZiArIDEsIG1lbSArIHBvcywgdHhfc2l6ZSk7CiAJCWZ3X21zZy5sZW4gPSB0eF9zaXplICsgMTsKIAkJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmZndfbXNnLCAxKSAhPSAxKSB7Ci0JCQlwcmludGsoInRkYTEwMDR4OiBFcnJvciBkdXJpbmcgZmlybXdhcmUgdXBsb2FkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAidGRhMTAwNHg6IEVycm9yIGR1cmluZyBmaXJtd2FyZSB1cGxvYWRcbiIpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcG9zICs9IHR4X3NpemU7CiAKIAkJZHByaW50aygiJXM6IGZ3X3Bvcz0weCV4XG4iLCBfX0ZVTkNUSU9OX18sIHBvcyk7CiAJfQorCS8vIGdpdmUgdGhlIERTUCBhIGNoYW5jZSB0byBzZXR0bGUgMDMvMTAvMDUgSGFjCisJbXNsZWVwKDEwMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RydWN0IHRkYTEwMDR4X3N0YXRlICpzdGF0ZSwgdTggZHNwVmVyc2lvbikKK3N0YXRpYyBpbnQgdGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUpCiB7CiAJdTggZGF0YTEsIGRhdGEyOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmIChzdGF0ZS0+ZGVtb2RfdHlwZSA9PSBUREExMDA0WF9ERU1PRF9UREExMDA0NikgeworCQl0aW1lb3V0ID0gamlmZmllcyArIDIgKiBIWjsKKwkJd2hpbGUoISh0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX1NUQVRVU19DRCkgJiAweDIwKSkgeworCQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiB0aW1lb3V0IHdhaXRpbmcgZm9yIERTUCByZWFkeVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQltc2xlZXAoMSk7CisJCX0KKwl9IGVsc2UKKwkJbXNsZWVwKDEwMCk7CiAKIAkvLyBjaGVjayB1cGxvYWQgd2FzIE9LCiAJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCAweDEwLCAwKTsgLy8gd2Ugd2FudCB0byByZWFkIGZyb20gdGhlIERTUApAQCAtMzM2LDkgKzM2MywxMSBAQAogCiAJZGF0YTEgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0RTUF9EQVRBMSk7CiAJZGF0YTIgPSB0ZGExMDA0eF9yZWFkX2J5dGUoc3RhdGUsIFREQTEwMDRYX0RTUF9EQVRBMik7Ci0JaWYgKChkYXRhMSAhPSAweDY3KSB8fCAoZGF0YTIgIT0gZHNwVmVyc2lvbikpCisJaWYgKGRhdGExICE9IDB4NjcgfHwgZGF0YTIgPCAweDIwIHx8IGRhdGEyID4gMHgyZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogZm91bmQgZmlybXdhcmUgcmV2aXNpb24gJXggLS0gaW52YWxpZFxuIiwgZGF0YTIpOwogCQlyZXR1cm4gLUVJTzsKLQorCX0KKwlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogZm91bmQgZmlybXdhcmUgcmV2aXNpb24gJXggLS0gb2tcbiIsIGRhdGEyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ5LDE0ICszNzgsMTQgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KLQlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlLCAweDJjKSA9PSAwKQorCWlmICh0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpID09IDApCiAJCXJldHVybiAwOwogCiAJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayB1bnRpbCBzb21lb25lIHVwbG9hZHMgaXQgKi8KLQlwcmludGsoInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQgKCVzKS4uLlxuIiwgVERBMTAwNDVfREVGQVVMVF9GSVJNV0FSRSk7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHdhaXRpbmcgZm9yIGZpcm13YXJlIHVwbG9hZCAoJXMpLi4uXG4iLCBUREExMDA0NV9ERUZBVUxUX0ZJUk1XQVJFKTsKIAlyZXQgPSBzdGF0ZS0+Y29uZmlnLT5yZXF1ZXN0X2Zpcm13YXJlKGZlLCAmZncsIFREQTEwMDQ1X0RFRkFVTFRfRklSTVdBUkUpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKCJ0ZGExMDA0eDogbm8gZmlybXdhcmUgdXBsb2FkICh0aW1lb3V0IG9yIGZpbGUgbm90IGZvdW5kPylcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zNzAsOTUgKzM5OSw5MyBAQAogCXRkYTEwMDQ1aF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBCQU5EV0lEVEhfOF9NSFopOwogCiAJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ1SF9GV1BBR0UsIFREQTEwMDQ1SF9DT0RFX0lOKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBjb21wbGV0ZVxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IGZpcm13YXJlIHVwbG9hZCBjb21wbGV0ZVxuIik7CiAKIAkvKiB3YWl0IGZvciBEU1AgdG8gaW5pdGlhbGlzZSAqLwogCS8qIERTUFJFQURZIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIG9uIHRoZSBUREExMDA0NUggKi8KIAltc2xlZXAoMTAwKTsKIAotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIDB4MmMpOworCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUpOwogfQogCi1zdGF0aWMgaW50IHRkYTEwMDQ2X2dldF9md192ZXJzaW9uKHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSAqc3RhdGUsCi0JCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKK3N0YXRpYyB2b2lkIHRkYTEwMDQ2X2luaXRfcGxscyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyIHBhdHRlcm5bXSA9IHsgMHg2NywgMHgwMCwgMHg1MCwgMHg2MiwgMHg1ZSwgMHgxOCwgMHg2NyB9OwotCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCS8qIGFyZWEgZ3Vlc3NlZCBmcm9tIGZpcm13YXJlIHYyMCwgdjIxIGFuZCB2MjUgKi8KLQlmb3IgKGkgPSAweDY2MDsgaSA8IDB4NzAwOyBpKyspIHsKLQkJaWYgKCFtZW1jbXAoJmZ3LT5kYXRhW2ldLCBwYXR0ZXJuLCBzaXplb2YocGF0dGVybikpKSB7Ci0JCQlzdGF0ZS0+ZndfdmVyc2lvbiA9IGZ3LT5kYXRhW2kgKyBzaXplb2YocGF0dGVybildOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAidGRhMTAwNHg6IHVzaW5nIGZpcm13YXJlIHYlMDJ4XG4iLAotCQkJCQlzdGF0ZS0+ZndfdmVyc2lvbik7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDEsIDB4ZjApOworCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAorCWlmIChzdGF0ZS0+Y29uZmlnLT54dGFsX2ZyZXEgPT0gVERBMTAwNDZfWFRBTF80TSApIHsKKwkJZHByaW50aygiJXM6IHNldHRpbmcgdXAgUExMcyBmb3IgYSA0IE1IeiBYdGFsXG4iLCBfX0ZVTkNUSU9OX18pOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCAwKTsgLy8gUExMIFAgPSBOID0gMAorCX0gZWxzZSB7CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHVwIFBMTHMgZm9yIGEgMTYgTUh6IFh0YWxcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIDMpOyAvLyBQTEwgUCA9IDAsIE4gPSAzCiAJfQotCi0JcmV0dXJuIC1FSU5WQUw7CisJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOworCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+aWZfZnJlcSkgeworCWNhc2UgVERBMTAwNDZfRlJFUV8zNjE3OgorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9NU0IsIDB4ZDQpOworCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0ZSRVFfUEhZMl9MU0IsIDB4MmMpOworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0ZSRVFfMzYxMzoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweGQ0KTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDEzKTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzA0NToKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBiKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweGEzKTsKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9GUkVRXzA1MjoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTVNCLCAweDBjKTsKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDA2KTsKKwkJYnJlYWs7CisJfQorCXRkYTEwMDQ2aF9zZXRfYmFuZHdpZHRoKHN0YXRlLCBCQU5EV0lEVEhfOF9NSFopOyAvLyBkZWZhdWx0IGJhbmR3aWR0aCA4IE1IegogfQogCiBzdGF0aWMgaW50IHRkYTEwMDQ2X2Z3dXBsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCB0ZGExMDA0eF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCiAJLyogcmVzZXQgKyB3YWtlIHVwIGNoaXAgKi8KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDEsIDApOworCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDApOwogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9DT05GX1RSSVNUQVRFMSwgMSwgMCk7Ci0JbXNsZWVwKDEwMCk7CisJLyogbGV0IHRoZSBjbG9ja3MgcmVjb3ZlciBmcm9tIHNsZWVwICovCisJbXNsZWVwKDUpOwogCiAJLyogZG9uJ3QgcmUtdXBsb2FkIHVubGVzcyBuZWNlc3NhcnkgKi8KLQlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlLCBzdGF0ZS0+ZndfdmVyc2lvbikgPT0gMCkKKwlpZiAodGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCi0JcHJpbnRrKCJ0ZGExMDA0eDogd2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkICglcykuLi5cbiIsIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOwotCXJldCA9IHN0YXRlLT5jb25maWctPnJlcXVlc3RfZmlybXdhcmUoZmUsICZmdywgVERBMTAwNDZfREVGQVVMVF9GSVJNV0FSRSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGZ3LT5zaXplIDwgMjQ0NzgpIHsgLyogc2l6ZSBvZiBmaXJtd2FyZSB2MjAsIHdoaWNoIGlzIHRoZSBzbWFsbGVzdCBvZiB2MjAsIHYyMSBhbmQgdjI1ICovCi0JCXByaW50aygidGRhMTAwNHg6IGZpcm13YXJlIGZpbGUgc2VlbXMgdG8gYmUgdG9vIHNtYWxsICglZCBieXRlcylcbiIsIGZ3LT5zaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gdGRhMTAwNDZfZ2V0X2Z3X3ZlcnNpb24oc3RhdGUsIGZ3KTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoInRkYTEwMDR4OiB1bmFibGUgdG8gZmluZCBmaXJtd2FyZSB2ZXJzaW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAkvKiBzZXQgcGFyYW1ldGVycyAqLwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsKLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZQTEwzLCBzdGF0ZS0+Y29uZmlnLT5uX2kyYyk7Ci0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX09GRlNFVCwgOTkpOwotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7Ci0JdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9GUkVRX1BIWTJfTFNCLCAweDJjKTsKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDgsIDgpOyAvLyBnb2luZyB0byBib290IGZyb20gSE9TVAorCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CiAKLQlyZXQgPSB0ZGExMDA0eF9kb191cGxvYWQoc3RhdGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSwgVERBMTAwNDZIX0NPREVfQ1BULCBUREExMDA0NkhfQ09ERV9JTik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlwcmludGsoInRkYTEwMDR4OiBmaXJtd2FyZSB1cGxvYWQgY29tcGxldGVcbiIpOwotCi0JLyogd2FpdCBmb3IgRFNQIHRvIGluaXRpYWxpc2UgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIEhaOwotCXdoaWxlICghKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfU1RBVFVTX0NEKSAmIDB4MjApKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoInRkYTEwMDR4OiBEU1AgZmFpbGVkIHRvIGluaXRpYWxpc2VkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTzsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+cmVxdWVzdF9maXJtd2FyZSAhPSBOVUxMKSB7CisJCS8qIHJlcXVlc3QgdGhlIGZpcm13YXJlLCB0aGlzIHdpbGwgYmxvY2sgdW50aWwgc29tZW9uZSB1cGxvYWRzIGl0ICovCisJCXByaW50ayhLRVJOX0lORk8gInRkYTEwMDR4OiB3YWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQuLi5cbiIpOworCQlyZXQgPSBzdGF0ZS0+Y29uZmlnLT5yZXF1ZXN0X2Zpcm13YXJlKGZlLCAmZncsIFREQTEwMDQ2X0RFRkFVTFRfRklSTVdBUkUpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIgInRkYTEwMDR4OiBubyBmaXJtd2FyZSB1cGxvYWQgKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CisgICAJICAgCQlyZXR1cm4gcmV0OwogCQl9Ci0JCW1zbGVlcCgxKTsKKwkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCA4LCA4KTsgLy8gZ29pbmcgdG8gYm9vdCBmcm9tIEhPU1QKKwkJcmV0ID0gdGRhMTAwNHhfZG9fdXBsb2FkKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUsIFREQTEwMDQ2SF9DT0RFX0NQVCwgVERBMTAwNDZIX0NPREVfSU4pOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJLyogYm9vdCBmcm9tIGZpcm13YXJlIGVlcHJvbSAqLworCQkvKiBIYWMgTm90ZTogd2UgbWlnaHQgbmVlZCB0byBkbyBzb21lIEdQSU8gTWFnaWMgaGVyZSAqLworCQlwcmludGsoS0VSTl9JTkZPICJ0ZGExMDA0eDogYm9vdGluZyBmcm9tIGVlcHJvbVxuIik7CisJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgNCwgNCk7CisJCW1zbGVlcCgzMDApOwogCX0KLQotCXJldHVybiB0ZGExMDA0eF9jaGVja191cGxvYWRfb2soc3RhdGUsIHN0YXRlLT5md192ZXJzaW9uKTsKKwlyZXR1cm4gdGRhMTAwNHhfY2hlY2tfdXBsb2FkX29rKHN0YXRlKTsKIH0KIAogc3RhdGljIGludCB0ZGExMDA0eF9lbmNvZGVfZmVjKGludCBmZWMpCkBAIC01NjAsMTIgKzU4NywxMCBAQAogCiAJaWYgKHRkYTEwMDQ2X2Z3dXBsb2FkKGZlKSkgewogCQlwcmludGsoInRkYTEwMDR4OiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87CisJCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDEsIDApOyAvLyB3YWtlIHVwIHRoZSBjaGlwCi0KLQkvLyBJbml0IHRoZSBQTEwKKwkvLyBJbml0IHRoZSB0dW5lciBQTEwKIAlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKIAkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CiAJCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKQEAgLTU3NCwzMiArNTk5LDQ0IEBACiAKIAkvLyB0ZGEgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDB4MjAsIDApOyAvLyBkaXNhYmxlIERTUCB3YXRjaGRvZyB0aW1lcgotCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDMSwgMHg0MCwgMHg0MCk7Ci0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgOCwgMCk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzEsIDB4ODAsIDApOyAvLyBkaXNhYmxlIHB1bHNlIGtpbGxlcgotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDIsIDEwKTsgLy8gUExMIE0gPSAxMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORlBMTDMsIHN0YXRlLT5jb25maWctPm5faTJjKTsgLy8gUExMIFAgPSBOID0gMAotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9PRkZTRVQsIDk5KTsgLy8gRlJFUU9GRlMgPSA5OQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX01TQiwgMHhkNCk7IC8vIH0gUEhZMiA9IC0xMTIyMQotCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfRlJFUV9QSFkyX0xTQiwgMHgyYyk7IC8vIH0KLQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAwKTsgLy8gQUdDIHNldHVwCi0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjAsIDB4NjApOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQVVUTywgNyk7IC8vIHNlbGVjdCBIUCBzdHJlYW0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORkMxLCA4KTsgLy8gZGlzYWJsZSBwdWxzZSBraWxsZXIKKworCXRkYTEwMDQ2X2luaXRfcGxscyhmZSk7CisJc3dpdGNoIChzdGF0ZS0+Y29uZmlnLT5hZ2NfY29uZmlnKSB7CisJY2FzZSBUREExMDA0Nl9BR0NfREVGQVVMVDoKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfQ09ORiwgMHgwMCk7IC8vIEFHQyBzZXR1cAorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfUE9MQVJJVFksIDB4NjApOyAvLyBzZXQgQUdDIHBvbGFyaXRpZXMKKwkJYnJlYWs7CisJY2FzZSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHOgorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCAweDBhKTsgLy8gQUdDIHNldHVwCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQ09ORl9QT0xBUklUWSwgMHg2MCk7IC8vIHNldCBBR0MgcG9sYXJpdGllcworCQlicmVhazsKKwljYXNlIFREQTEwMDQ2X0FHQ19JRk9fQVVUT19QT1M6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MGEpOyAvLyBBR0Mgc2V0dXAKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDAwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCWJyZWFrOworCWNhc2UgVERBMTAwNDZfQUdDX1REQTgyN1g6CisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0NPTkYsIDB4MDIpOyAgIC8vIEFHQyBzZXR1cAorCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0FHQ19USFIsIDB4NzApOyAgICAvLyBBR0MgVGhyZXNob2xkCisJCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1JFTk9STSwgMHgwRSk7IC8vIEdhaW4gUmVub3JtYWxpemUKKwkJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9DT05GX1BPTEFSSVRZLCAweDYwKTsgLy8gc2V0IEFHQyBwb2xhcml0aWVzCisJCWJyZWFrOworCX0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUxLCAweDYxKTsgLy8gVHVybiBib3RoIEFHQyBvdXRwdXRzIG9uCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDQ2SF9BR0NfVFVOX01JTiwgMCk7CSAgLy8gfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX1RVTl9NQVgsIDB4ZmYpOyAvLyB9IEFHQyBtaW4vbWF4IHZhbHVlcwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0lGX01JTiwgMCk7CSAgLy8gfQogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0lGX01BWCwgMHhmZik7ICAvLyB9Ci0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0NWQkVSX0NUUkwsIDB4MzAsIDB4MTApOyAvLyAxMF42IFZCRVIgbWVhc3VyZW1lbnQgYml0cwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0NkhfQUdDX0dBSU5TLCAxKTsgLy8gSUYgZ2FpbiAyLCBUVU4gZ2FpbiAxCi0JdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQVVUTywgMHg4MCwgMCk7IC8vIGNyeXN0YWwgaXMgNTBwcG0KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NWQkVSX0NUUkwsIDB4MWEpOyAvLyAxMF42IFZCRVIgbWVhc3VyZW1lbnQgYml0cwogCXRkYTEwMDR4X3dyaXRlX2J5dGVJKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMSwgNyk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GX1RTMiwgMHgzMSwgMCk7IC8vIE1QRUcyIGludGVyZmFjZSBjb25maWcKLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0NkhfQ09ORl9UUklTVEFURTEsIDB4OWUsIDApOyAvLyBkaXNhYmxlIEFHQ19UVU4KKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNFhfQ09ORl9UUzIsIDB4YzApOyAvLyBNUEVHMiBpbnRlcmZhY2UgY29uZmlnCisJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgMHgzYSwgMHg4MCwgc3RhdGUtPmNvbmZpZy0+aW52ZXJ0X29jbGsgPDwgNyk7CisKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUyLCAweGUxKTsgLy8gdHJpc3RhdGUgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fT1VUX1NFTCwgMHhjYyk7IC8vIEdQSU8gb3V0cHV0IGNvbmZpZwotCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDQ2SF9HUElPX1NFTEVDVCwgOCwgOCk7IC8vIEdQSU8gc2VsZWN0Ci0JdGRhMTAwNDZoX3NldF9iYW5kd2lkdGgoc3RhdGUsIEJBTkRXSURUSF84X01IWik7IC8vIGRlZmF1bHQgYmFuZHdpZHRoIDggTUh6Ci0KLQl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCAweDNhLCAweDgwLCBzdGF0ZS0+Y29uZmlnLT5pbnZlcnRfb2NsayA8PCA3KTsKKwl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0dQSU9fU0VMRUNULCA4KTsgLy8gR1BJTyBzZWxlY3QKIAogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDE7CiAJcmV0dXJuIDA7CkBAIC02MjksOSArNjY2LDYgQEAKIAlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBmZV9wYXJhbXMpOwogCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKIAotCWlmIChzdGF0ZS0+ZGVtb2RfdHlwZSA9PSBUREExMDA0WF9ERU1PRF9UREExMDA0NikKLQkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNDZIX0FHQ19DT05GLCA0LCA0KTsKLQogCS8vIEhhcmRjb2RlZCB0byB1c2UgYXV0byBhcyBtdWNoIGFzIHBvc3NpYmxlIG9uIHRoZSBUREExMDA0NSBhcyBpdAogCS8vIGlzIHZlcnkgdW5yZWxpYWJsZSBpZiBBVVRPIG1vZGUgaXMgX25vdF8gdXNlZC4KIAlpZiAoc3RhdGUtPmRlbW9kX3R5cGUgPT0gVERBMTAwNFhfREVNT0RfVERBMTAwNDUpIHsKQEAgLTEwODksNiArMTEyMywxMSBAQAogCQlicmVhazsKIAogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDY6CisJCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAgIT0gTlVMTCkgeworCQkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CisJCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAoZmUpOworCQkJdGRhMTAwNHhfZGlzYWJsZV90dW5lcl9pMmMoc3RhdGUpOworCQl9CiAJCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMSwgMSk7CiAJCWJyZWFrOwogCX0KQEAgLTExMDAsOCArMTEzOSw5IEBACiBzdGF0aWMgaW50IHRkYTEwMDR4X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7CiAJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gODAwOwotCWZlc2V0dGluZ3MtPnN0ZXBfc2l6ZSA9IDE2NjY2NzsKLQlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAxNjY2NjcqMjsKKwkvKiBEcmlmdCBjb21wZW5zYXRpb24gbWFrZXMgbm8gc2Vuc2UgZm9yIERWQi1UICovCisJZmVzZXR0aW5ncy0+c3RlcF9zaXplID0gMDsKKwlmZXNldHRpbmdzLT5tYXhfZHJpZnQgPSAwOwogCXJldHVybiAwOwogfQogCkBAIC0xMjE2LDcgKzEyNTYsNiBAQAogCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ2X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKIAlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ2OwotCXN0YXRlLT5md192ZXJzaW9uID0gMHgyMDsJLyogZHVtbXkgZGVmYXVsdCB2YWx1ZSAqLwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKHRkYTEwMDR4X3JlYWRfYnl0ZShzdGF0ZSwgVERBMTAwNFhfQ0hJUElEKSAhPSAweDQ2KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCmluZGV4IGM4ZTFkNTQuLjg2NTljNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5oCkBAIC0yNiw2ICsyNiwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAKK2VudW0gdGRhMTAwNDZfeHRhbCB7CisJVERBMTAwNDZfWFRBTF80TSwKKwlUREExMDA0Nl9YVEFMXzE2TSwKK307CisKK2VudW0gdGRhMTAwNDZfYWdjIHsKKwlUREExMDA0Nl9BR0NfREVGQVVMVCwJCS8qIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gKi8KKwlUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHLAkvKiBJRiBBR0Mgb25seSwgYXV0b21hdGljLCBuZWd0aXZlICovCisJVERBMTAwNDZfQUdDX0lGT19BVVRPX1BPUywJLyogSUYgQUdDIG9ubHksIGF1dG9tYXRpYywgcG9zaXRpdmUgKi8KKwlUREExMDA0Nl9BR0NfVERBODI3WCwJICAgIC8qIElGIEFHQyBvbmx5LCBzcGVjaWFsIHNldHVwIGZvciB0ZGE4Mjd4ICovCit9OworCitlbnVtIHRkYTEwMDQ2X2lmIHsKKwlUREExMDA0Nl9GUkVRXzM2MTcsCQkvKiBvcmlnaW5hbCBjb25maWcsIDM2LDE2NiBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzM2MTMsCQkvKiAzNiwxMyBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzA0NSwJCS8qIGxvdyBJRiwgNC4wLCA0LjUsIG9yIDUuMCBNSFogKi8KKwlUREExMDA0Nl9GUkVRXzA1MiwJCS8qIGxvdyBJRiwgNS4xNjY3IE1IWiBmb3IgdGRhOTg4OSAqLworfTsKKwogc3RydWN0IHRkYTEwMDR4X2NvbmZpZwogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCkBAIC0zNywxNCArNTYsMjIgQEAKIAkvKiBEb2VzIHRoZSBPQ0xLIHNpZ25hbCBuZWVkIGludmVydGVkPyAqLwogCXU4IGludmVydF9vY2xrOwogCi0JLyogdmFsdWUgb2YgTl9JMkMgb2YgdGhlIENPTkZfUExMMyByZWdpc3RlciAqLwotCXU4IG5faTJjOworCS8qIFh0YWwgZnJlcXVlbmN5LCA0IG9yIDE2TUh6Ki8KKwllbnVtIHRkYTEwMDQ2X3h0YWwgeHRhbF9mcmVxOworCisJLyogSUYgZnJlcXVlbmN5ICovCisJZW51bSB0ZGExMDA0Nl9pZiBpZl9mcmVxOworCisJLyogQUdDIGNvbmZpZ3VyYXRpb24gKi8KKwllbnVtIHRkYTEwMDQ2X2FnYyBhZ2NfY29uZmlnOwogCiAJLyogUExMIG1haW50ZW5hbmNlICovCiAJaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKKwl2b2lkICgqcGxsX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiAJaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIAogCS8qIHJlcXVlc3QgZmlybXdhcmUgZm9yIGRldmljZSAqLworCS8qIHNldCB0aGlzIHRvIE5VTEwgaWYgdGhlIGNhcmQgaGFzIGEgZmlybXdhcmUgRUVQUk9NICovCiAJaW50ICgqcmVxdWVzdF9maXJtd2FyZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODB4eC5jCmluZGV4IDAzMmQzNDguLjg4ZTEyNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgweHguYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyODQyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9LY29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK2NvbmZpZyBEVkJfUExVVE8yCisJdHJpc3RhdGUgIlBsdXRvMiBjYXJkcyIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSQorCXNlbGVjdCBJMkMKKwlzZWxlY3QgSTJDX0FMR09CSVQKKwlzZWxlY3QgRFZCX1REQTEwMDRYCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUENJIGNhcmRzIGJhc2VkIG9uIHRoZSBQbHV0bzIgRlBHQSBsaWtlIHRoZSBTYXRlbGNvCisJICBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIERWQi1UIFJlY2VpdmVyLgorCisgICAgICAgICAgU2luY2UgdGhlc2UgY2FyZHMgaGF2ZSBubyBNUEVHIGRlY29kZXIgb25ib2FyZCwgdGhleSB0cmFuc21pdAorCSAgb25seSBjb21wcmVzc2VkIE1QRUcgZGF0YSBvdmVyIHRoZSBQQ0kgYnVzLCBzbyB5b3UgbmVlZAorCSAgYW4gZXh0ZXJuYWwgc29mdHdhcmUgZGVjb2RlciB0byB3YXRjaCBUViBvbiB5b3VyIGNvbXB1dGVyLgorCisJICBTYXkgWSBvciBNIGlmIHlvdSBvd24gc3VjaCBhIGRldmljZSBhbmQgd2FudCB0byB1c2UgaXQuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNhODRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX0RWQl9QTFVUTzIpID0gcGx1dG8yLm8KKworRVhUUkFfQ0ZMQUdTID0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZTBiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyAqIHBsdXRvMi5jIC0gU2F0ZWxjbyBFYXN5d2F0Y2ggTW9iaWxlIFRlcnJlc3RyaWFsIFJlY2VpdmVyIFtEVkItVF0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQW5kcmVhcyBPYmVycml0dGVyIDxvYmlAbGludXh0di5vcmc+CisgKgorICogYmFzZWQgb24gcGx1dG8yLmMgMS4xMCAtIGh0dHA6Ly9pbnN0aW5jdC13cDgubm8taXAub3JnL3BsdXRvLworICogCWJ5IERhbnkgU2FsbWFuIDxzYWxtYW5kYW55QHlhaG9vLmZyPgorICoJQ29weXJpZ2h0IChjKSAyMDA0IFRERgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJkZW11eC5oIgorI2luY2x1ZGUgImRteGRldi5oIgorI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yl9uZXQuaCIKKyNpbmNsdWRlICJkdmJkZXYuaCIKKyNpbmNsdWRlICJ0ZGExMDA0eC5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FCQkicGx1dG8yIgorCisjZGVmaW5lIFJFR19QSURuKG4pCQkoKG4pIDw8IDIpCS8qIFBJRCBuIHBhdHRlcm4gcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19QQ0FSCQkweDAwMjAJCS8qIFBDIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1RTQ1IJCTB4MDAyNAkJLyogVFMgY3RybCAmIHN0YXR1cyAqLworI2RlZmluZSBSRUdfTUlTQwkJMHgwMDI4CQkvKiBtaXNjZWxsYW5lb3VzICovCisjZGVmaW5lIFJFR19NTUFDCQkweDAwMmMJCS8qIE1TQiBNQUMgYWRkcmVzcyAqLworI2RlZmluZSBSRUdfSU1BQwkJMHgwMDMwCQkvKiBJU0IgTUFDIGFkZHJlc3MgKi8KKyNkZWZpbmUgUkVHX0xNQUMJCTB4MDAzNAkJLyogTFNCIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIFJFR19TUElECQkweDAwMzgJCS8qIFNQSSBkYXRhICovCisjZGVmaW5lIFJFR19TTENTCQkweDAwM2MJCS8qIHNlcmlhbCBsaW5rcyBjdHJsL3N0YXR1cyAqLworCisjZGVmaW5lIFBJRDBfTk9GSUwJCSgweDAwMDEgPDwgMTYpCisjZGVmaW5lIFBJRG5fRU5QCQkoMHgwMDAxIDw8IDE1KQorI2RlZmluZSBQSUQwX0VORAkJKDB4MDAwMSA8PCAxNCkKKyNkZWZpbmUgUElEMF9BRklMCQkoMHgwMDAxIDw8IDEzKQorI2RlZmluZSBQSURuX1BJRAkJKDB4MWZmZiA8PCAgMCkKKworI2RlZmluZSBUU0NSX05CUEFDS0VUUwkJKDB4MDBmZiA8PCAyNCkKKyNkZWZpbmUgVFNDUl9ERU0JCSgweDAwMDEgPDwgMTcpCisjZGVmaW5lIFRTQ1JfREUJCQkoMHgwMDAxIDw8IDE2KQorI2RlZmluZSBUU0NSX1JTVE4JCSgweDAwMDEgPDwgMTUpCisjZGVmaW5lIFRTQ1JfTVNLTwkJKDB4MDAwMSA8PCAxNCkKKyNkZWZpbmUgVFNDUl9NU0tBCQkoMHgwMDAxIDw8IDEzKQorI2RlZmluZSBUU0NSX01TS0wJCSgweDAwMDEgPDwgMTIpCisjZGVmaW5lIFRTQ1JfT1ZSCQkoMHgwMDAxIDw8IDExKQorI2RlZmluZSBUU0NSX0FGVUwJCSgweDAwMDEgPDwgMTApCisjZGVmaW5lIFRTQ1JfTE9DSwkJKDB4MDAwMSA8PCAgOSkKKyNkZWZpbmUgVFNDUl9JQUNLCQkoMHgwMDAxIDw8ICA4KQorI2RlZmluZSBUU0NSX0FERUYJCSgweDAwN2YgPDwgIDApCisKKyNkZWZpbmUgTUlTQ19EVlIJCSgweDBmZmYgPDwgIDQpCisjZGVmaW5lIE1JU0NfQUxFRAkJKDB4MDAwMSA8PCAgMykKKyNkZWZpbmUgTUlTQ19GUlNUCQkoMHgwMDAxIDw8ICAyKQorI2RlZmluZSBNSVNDX0xFRDEJCSgweDAwMDEgPDwgIDEpCisjZGVmaW5lIE1JU0NfTEVEMAkJKDB4MDAwMSA8PCAgMCkKKworI2RlZmluZSBTUElEX1NQSURSCQkoMHgwMGZmIDw8ICAwKQorCisjZGVmaW5lIFNMQ1NfU0NMCQkoMHgwMDAxIDw8ICA3KQorI2RlZmluZSBTTENTX1NEQQkJKDB4MDAwMSA8PCAgNikKKyNkZWZpbmUgU0xDU19DU04JCSgweDAwMDEgPDwgIDIpCisjZGVmaW5lIFNMQ1NfT1ZSCQkoMHgwMDAxIDw8ICAxKQorI2RlZmluZSBTTENTX1NXQwkJKDB4MDAwMSA8PCAgMCkKKworI2RlZmluZSBUU19ETUFfUEFDS0VUUwkJKDgpCisjZGVmaW5lIFRTX0RNQV9CWVRFUwkJKDE4OCAqIFRTX0RNQV9QQUNLRVRTKQorCisjZGVmaW5lIEkyQ19BRERSX1REQTEwMDQ2CTB4MTAKKyNkZWZpbmUgSTJDX0FERFJfVFVBNjAzNAkweGMyCisjZGVmaW5lIE5IV0ZJTFRFUlMJCTgKKworc3RydWN0IHBsdXRvIHsKKwkvKiBwY2kgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1OCBfX2lvbWVtICppb19tZW07CisKKwkvKiBkdmIgKi8KKwlzdHJ1Y3QgZG14X2Zyb250ZW5kIGh3X2Zyb250ZW5kOworCXN0cnVjdCBkbXhfZnJvbnRlbmQgbWVtX2Zyb250ZW5kOworCXN0cnVjdCBkbXhkZXYgZG14ZGV2OworCXN0cnVjdCBkdmJfYWRhcHRlciBkdmJfYWRhcHRlcjsKKwlzdHJ1Y3QgZHZiX2RlbXV4IGRlbXV4OworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCXN0cnVjdCBkdmJfbmV0IGR2Ym5ldDsKKwl1bnNpZ25lZCBpbnQgZnVsbF90c191c2VyczsKKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisKKwkvKiBpMmMgKi8KKwlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgaTJjX2JpdDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7CisJdW5zaWduZWQgaW50IGkyY2J1ZzsKKworCS8qIGlycSAqLworCXVuc2lnbmVkIGludCBvdmVyZmxvdzsKKworCS8qIGRtYSAqLworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdTggZG1hX2J1ZltUU19ETUFfQllURVNdOworCXU4IGR1bW15WzQwOTZdOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGx1dG8gKmZlZWRfdG9fcGx1dG8oc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVlZC0+ZGVtdXgsIHN0cnVjdCBwbHV0bywgZGVtdXgpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbHV0byAqZnJvbnRlbmRfdG9fcGx1dG8oc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmZS0+ZHZiLCBzdHJ1Y3QgcGx1dG8sIGR2Yl9hZGFwdGVyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgcGx1dG9fcmVhZHJlZyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbCgmcGx1dG8tPmlvX21lbVtyZWddKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBsdXRvX3dyaXRlcmVnKHN0cnVjdCBwbHV0byAqcGx1dG8sIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgJnBsdXRvLT5pb19tZW1bcmVnXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbHV0b19ydyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1MzIgcmVnLCB1MzIgbWFzaywgdTMyIGJpdHMpCit7CisJdTMyIHZhbCA9IHJlYWRsKCZwbHV0by0+aW9fbWVtW3JlZ10pOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gYml0czsKKwl3cml0ZWwodmFsLCAmcGx1dG8tPmlvX21lbVtyZWddKTsKK30KKworc3RhdGljIHZvaWQgcGx1dG9fc2V0c2RhKHZvaWQgKmRhdGEsIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZGF0YTsKKworCWlmIChzdGF0ZSkKKwkJcGx1dG9fcncocGx1dG8sIFJFR19TTENTLCBTTENTX1NEQSwgU0xDU19TREEpOworCWVsc2UKKwkJcGx1dG9fcncocGx1dG8sIFJFR19TTENTLCBTTENTX1NEQSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX3NldHNjbCh2b2lkICpkYXRhLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlpZiAoc3RhdGUpCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfU0xDUywgU0xDU19TQ0wsIFNMQ1NfU0NMKTsKKwllbHNlCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfU0xDUywgU0xDU19TQ0wsIDApOworCisJLyogdHJ5IHRvIGRldGVjdCBpMmNfaW5iKCkgdG8gd29ya2Fyb3VuZCBoYXJkd2FyZSBidWc6CisJICogcmVzZXQgU0RBIHRvIGhpZ2ggYWZ0ZXIgU0NMIGhhcyBiZWVuIHNldCB0byBsb3cgKi8KKwlpZiAoKHN0YXRlKSAmJiAocGx1dG8tPmkyY2J1ZyA9PSAwKSkgeworCQlwbHV0by0+aTJjYnVnID0gMTsKKwl9IGVsc2UgeworCQlpZiAoKCFzdGF0ZSkgJiYgKHBsdXRvLT5pMmNidWcgPT0gMSkpCisJCQlwbHV0b19zZXRzZGEocGx1dG8sIDEpOworCQlwbHV0by0+aTJjYnVnID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fZ2V0c2RhKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlyZXR1cm4gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1NMQ1MpICYgU0xDU19TREE7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fZ2V0c2NsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGRhdGE7CisKKwlyZXR1cm4gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1NMQ1MpICYgU0xDU19TQ0w7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX3Jlc2V0X2Zyb250ZW5kKHN0cnVjdCBwbHV0byAqcGx1dG8sIGludCByZWVuYWJsZSkKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX01JU0MpOworCisJaWYgKHZhbCAmIE1JU0NfRlJTVCkgeworCQl2YWwgJj0gfk1JU0NfRlJTVDsKKwkJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19NSVNDLCB2YWwpOworCX0KKwlpZiAocmVlbmFibGUpIHsKKwkJdmFsIHw9IE1JU0NfRlJTVDsKKwkJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19NSVNDLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgcGx1dG9fcmVzZXRfdHMoc3RydWN0IHBsdXRvICpwbHV0bywgaW50IHJlZW5hYmxlKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfVFNDUik7CisKKwlpZiAodmFsICYgVFNDUl9SU1ROKSB7CisJCXZhbCAmPSB+VFNDUl9SU1ROOworCQlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7CisJfQorCWlmIChyZWVuYWJsZSkgeworCQl2YWwgfD0gVFNDUl9SU1ROOworCQlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbHV0b19zZXRfZG1hX2FkZHIoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1BDQVIsIGNwdV90b19sZTMyKHBsdXRvLT5kbWFfYWRkcikpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbHV0b19kbWFfbWFwKHN0cnVjdCBwbHV0byAqcGx1dG8pCit7CisJcGx1dG8tPmRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUocGx1dG8tPnBkZXYsIHBsdXRvLT5kbWFfYnVmLAorCQkJVFNfRE1BX0JZVEVTLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJcmV0dXJuIHBjaV9kbWFfbWFwcGluZ19lcnJvcihwbHV0by0+ZG1hX2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBwbHV0b19kbWFfdW5tYXAoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwY2lfdW5tYXBfc2luZ2xlKHBsdXRvLT5wZGV2LCBwbHV0by0+ZG1hX2FkZHIsCisJCQlUU19ETUFfQllURVMsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmYpCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGZlZWRfdG9fcGx1dG8oZik7CisKKwkvKiBlbmFibGUgUElEIGZpbHRlcmluZyAqLworCWlmIChwbHV0by0+dXNlcnMrKyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfQUZJTCB8IFBJRDBfTk9GSUwsIDApOworCisJaWYgKChmLT5waWQgPCAweDIwMDApICYmIChmLT5pbmRleCA8IE5IV0ZJTFRFUlMpKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oZi0+aW5kZXgpLCBQSURuX0VOUCB8IFBJRG5fUElELCBQSURuX0VOUCB8IGYtPnBpZCk7CisJZWxzZSBpZiAocGx1dG8tPmZ1bGxfdHNfdXNlcnMrKyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfTk9GSUwsIFBJRDBfTk9GSUwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGx1dG9fc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZikKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZmVlZF90b19wbHV0byhmKTsKKworCS8qIGRpc2FibGUgUElEIGZpbHRlcmluZyAqLworCWlmICgtLXBsdXRvLT51c2VycyA9PSAwKQorCQlwbHV0b19ydyhwbHV0bywgUkVHX1BJRG4oMCksIFBJRDBfQUZJTCwgUElEMF9BRklMKTsKKworCWlmICgoZi0+cGlkIDwgMHgyMDAwKSAmJiAoZi0+aW5kZXggPCBOSFdGSUxURVJTKSkKKwkJcGx1dG9fcncocGx1dG8sIFJFR19QSURuKGYtPmluZGV4KSwgUElEbl9FTlAgfCBQSURuX1BJRCwgMHgxZmZmKTsKKwllbHNlIGlmICgtLXBsdXRvLT5mdWxsX3RzX3VzZXJzID09IDApCisJCXBsdXRvX3J3KHBsdXRvLCBSRUdfUElEbigwKSwgUElEMF9OT0ZJTCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGx1dG9fZG1hX2VuZChzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1bnNpZ25lZCBpbnQgbmJwYWNrZXRzKQoreworCS8qIHN5bmNocm9uaXplIHRoZSBETUEgdHJhbnNmZXIgd2l0aCB0aGUgQ1BVCisJICogZmlyc3Qgc28gdGhhdCB3ZSBzZWUgdXBkYXRlZCBjb250ZW50cy4gKi8KKwlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUocGx1dG8tPnBkZXYsIHBsdXRvLT5kbWFfYWRkciwKKwkJCVRTX0RNQV9CWVRFUywgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCS8qIFdvcmthcm91bmQgZm9yIGJyb2tlbiBoYXJkd2FyZToKKwkgKiBbMV0gT24gc3RhcnR1cCBOQlBBQ0tFVFMgc2VlbXMgdG8gY29udGFpbiBhbiB1bmluaXRpYWxpemVkIHZhbHVlLAorCSAqICAgICBidXQgbm8gcGFja2V0cyBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KKwkgKiBbMl0gU29tZXRpbWVzIChhY3R1YWxseSB2ZXJ5IG9mdGVuKSBOQlBBQ0tFVFMgc3RheXMgYXQgemVybworCSAqICAgICBhbHRob3VnaCBvbmUgcGFja2V0IGhhcyBiZWVuIHRyYW5zZmVyZWQuCisJICovCisJaWYgKChuYnBhY2tldHMgPT0gMCkgfHwgKG5icGFja2V0cyA+IFRTX0RNQV9QQUNLRVRTKSkgeworCQl1bnNpZ25lZCBpbnQgaSA9IDAsIHZhbGlkOworCQl3aGlsZSAocGx1dG8tPmRtYV9idWZbaV0gPT0gMHg0NykKKwkJCWkgKz0gMTg4OworCQl2YWxpZCA9IGkgLyAxODg7CisJCWlmIChuYnBhY2tldHMgIT0gdmFsaWQpIHsKKwkJCWRldl9lcnIoJnBsdXRvLT5wZGV2LT5kZXYsICJuYnBhY2tldHM9JXUgdmFsaWQ9JXVcbiIsCisJCQkJCW5icGFja2V0cywgdmFsaWQpOworCQkJbmJwYWNrZXRzID0gdmFsaWQ7CisJCX0KKwl9CisKKwlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoJnBsdXRvLT5kZW11eCwgcGx1dG8tPmRtYV9idWYsIG5icGFja2V0cyk7CisKKwkvKiBjbGVhciB0aGUgZG1hIGJ1ZmZlci4gdGhpcyBpcyBuZWVkZWQgdG8gYmUgYWJsZSB0byBpZGVudGlmeQorCSAqIG5ldyB2YWxpZCB0cyBwYWNrZXRzIGFib3ZlICovCisJbWVtc2V0KHBsdXRvLT5kbWFfYnVmLCAwLCBuYnBhY2tldHMgKiAxODgpOworCisJLyogcmVzZXQgdGhlIGRtYSBhZGRyZXNzICovCisJcGx1dG9fc2V0X2RtYV9hZGRyKHBsdXRvKTsKKworCS8qIHN5bmMgdGhlIGJ1ZmZlciBhbmQgZ2l2ZSBpdCBiYWNrIHRvIHRoZSBjYXJkICovCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHBsdXRvLT5wZGV2LCBwbHV0by0+ZG1hX2FkZHIsCisJCQlUU19ETUFfQllURVMsIFBDSV9ETUFfRlJPTURFVklDRSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwbHV0b19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZGV2X2lkOworCXUzMiB0c2NyOworCisJLyogY2hlY2sgd2hldGhlciBhbiBpbnRlcnJ1cHQgb2NjdXJlZCBvbiB0aGlzIGRldmljZSAqLworCXRzY3IgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfVFNDUik7CisJaWYgKCEodHNjciAmIChUU0NSX0RFIHwgVFNDUl9PVlIpKSkKKwkJcmV0dXJuIElSUV9OT05FOworCisJaWYgKHRzY3IgPT0gMHhmZmZmZmZmZikgeworCQkvLyBGSVhNRTogbWF5YmUgcmVjb3ZlciBzb21laG93CisJCWRldl9lcnIoJnBsdXRvLT5wZGV2LT5kZXYsICJjYXJkIGh1bmcgdXAgOihcbiIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogZG1hIGVuZCBpbnRlcnJ1cHQgKi8KKwlpZiAodHNjciAmIFRTQ1JfREUpIHsKKwkJcGx1dG9fZG1hX2VuZChwbHV0bywgKHRzY3IgJiBUU0NSX05CUEFDS0VUUykgPj4gMjQpOworCQkvKiBvdmVyZmxvdyBpbnRlcnJ1cHQgKi8KKwkJaWYgKHRzY3IgJiBUU0NSX09WUikKKwkJCXBsdXRvLT5vdmVyZmxvdysrOworCQlpZiAocGx1dG8tPm92ZXJmbG93KSB7CisJCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAib3ZlcmZsb3cgaXJxICglZClcbiIsCisJCQkJCXBsdXRvLT5vdmVyZmxvdyk7CisJCQlwbHV0b19yZXNldF90cyhwbHV0bywgMSk7CisJCQlwbHV0by0+b3ZlcmZsb3cgPSAwOworCQl9CisJfSBlbHNlIGlmICh0c2NyICYgVFNDUl9PVlIpIHsKKwkJcGx1dG8tPm92ZXJmbG93Kys7CisJfQorCisJLyogQUNLIHRoZSBpbnRlcnJ1cHQgKi8KKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHRzY3IgfCBUU0NSX0lBQ0spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGx1dG9fZW5hYmxlX2lycXMoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1RTQ1IpOworCisJLyogc2V0IHRoZSBudW1iZXIgb2YgcGFja2V0cyAqLworCXZhbCAmPSB+VFNDUl9BREVGOworCXZhbCB8PSBUU19ETUFfUEFDS0VUUyAvIDI7CisJLyogZGlzYWJsZSBBRlVMIGFuZCBMT0NLIGludGVycnVwdHMgKi8KKwl2YWwgfD0gKFRTQ1JfTVNLQSB8IFRTQ1JfTVNLTCk7CisJLyogZW5hYmxlIERNQSBhbmQgT1ZFUkZMT1cgaW50ZXJydXB0cyAqLworCXZhbCAmPSB+KFRTQ1JfREVNIHwgVFNDUl9NU0tPKTsKKwkvKiBjbGVhciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwl2YWwgfD0gVFNDUl9JQUNLOworCisJcGx1dG9fd3JpdGVyZWcocGx1dG8sIFJFR19UU0NSLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBwbHV0b19kaXNhYmxlX2lycXMoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwl1MzIgdmFsID0gcGx1dG9fcmVhZHJlZyhwbHV0bywgUkVHX1RTQ1IpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCXZhbCB8PSAoVFNDUl9ERU0gfCBUU0NSX01TS08gfCBUU0NSX01TS0EgfCBUU0NSX01TS0wpOworCS8qIGNsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXZhbCB8PSBUU0NSX0lBQ0s7CisKKwlwbHV0b193cml0ZXJlZyhwbHV0bywgUkVHX1RTQ1IsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHBsdXRvX2h3X2luaXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlwbHV0b19yZXNldF9mcm9udGVuZChwbHV0bywgMSk7CisKKwkvKiBzZXQgYXV0b21hdGljIExFRCBjb250cm9sIGJ5IEZQR0EgKi8KKwlwbHV0b19ydyhwbHV0bywgUkVHX01JU0MsIE1JU0NfQUxFRCwgTUlTQ19BTEVEKTsKKworCS8qIHNldCBkYXRhIGVuZGlhbmVzcyAqLworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXBsdXRvX3J3KHBsdXRvLCBSRUdfUElEbigwKSwgUElEMF9FTkQsIFBJRDBfRU5EKTsKKyNlbHNlCisJcGx1dG9fcncocGx1dG8sIFJFR19QSURuKDApLCBQSUQwX0VORCwgMCk7CisjZW5kaWYKKwkvKiBtYXAgRE1BIGFuZCBzZXQgYWRkcmVzcyAqLworCXBsdXRvX2RtYV9tYXAocGx1dG8pOworCXBsdXRvX3NldF9kbWFfYWRkcihwbHV0byk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXBsdXRvX2VuYWJsZV9pcnFzKHBsdXRvKTsKKworCS8qIHJlc2V0IFRTIGxvZ2ljICovCisJcGx1dG9fcmVzZXRfdHMocGx1dG8sIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsdXRvX2h3X2V4aXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwlwbHV0b19kaXNhYmxlX2lycXMocGx1dG8pOworCisJcGx1dG9fcmVzZXRfdHMocGx1dG8sIDApOworCisJLyogTEVEOiBkaXNhYmxlIGF1dG9tYXRpYyBjb250cm9sLCBlbmFibGUgeWVsbG93LCBkaXNhYmxlIGdyZWVuICovCisJcGx1dG9fcncocGx1dG8sIFJFR19NSVNDLCBNSVNDX0FMRUQgfCBNSVNDX0xFRDEgfCBNSVNDX0xFRDAsIE1JU0NfTEVEMSk7CisKKwkvKiB1bm1hcCBETUEgKi8KKwlwbHV0b19kbWFfdW5tYXAocGx1dG8pOworCisJcGx1dG9fcmVzZXRfZnJvbnRlbmQocGx1dG8sIDApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBkaXZpZGUodTMyIG51bWVyYXRvciwgdTMyIGRlbm9taW5hdG9yKQoreworCWlmIChkZW5vbWluYXRvciA9PSAwKQorCQlyZXR1cm4gfjA7CisKKwlyZXR1cm4gKG51bWVyYXRvciArIGRlbm9taW5hdG9yIC8gMikgLyBkZW5vbWluYXRvcjsKK30KKworLyogTEcgSW5ub3RlayBURFRFLUUwMDFQIChJbmZpbmVvbiBUVUE2MDM0KSAqLworc3RhdGljIGludCBsZ190ZHRwZTAwMXBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IHBsdXRvICpwbHV0byA9IGZyb250ZW5kX3RvX3BsdXRvKGZlKTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJaW50IHJldDsKKwl1OCBidWZbNF07CisJdTMyIGRpdjsKKworCS8vIEZyZWYgPSAxNjYuNjY3IEh6CisJLy8gRnJlZiAqIDMgPSA1MDAuMDAwIEh6CisJLy8gSUYgPSAzNjE2NjY2NworCS8vIElGIC8gRnJlZiA9IDIxNworCS8vZGl2ID0gZGl2aWRlKHAtPmZyZXF1ZW5jeSArIDM2MTY2NjY3LCAxNjY2NjcpOworCWRpdiA9IGRpdmlkZShwLT5mcmVxdWVuY3kgKiAzLCA1MDAwMDApICsgMjE3OworCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOworCWJ1ZlsxXSA9IChkaXYgPj4gMCkgJiAweGZmOworCisJaWYgKHAtPmZyZXF1ZW5jeSA8IDYxMTAwMDAwMCkKKwkJYnVmWzJdID0gMHhiNDsKKwllbHNlIGlmIChwLT5mcmVxdWVuY3kgPCA4MTEwMDAwMDApCisJCWJ1ZlsyXSA9IDB4YmM7CisJZWxzZQorCQlidWZbMl0gPSAweGY0OworCisJLy8gVkhGOiAxNzQtMjMwIE1IegorCS8vIGNlbnRlcjogMzUwIE1IegorCS8vIFVIRjogNDcwLTg2MiBNSHoKKwlpZiAocC0+ZnJlcXVlbmN5IDwgMzUwMDAwMDAwKQorCQlidWZbM10gPSAweDAyOworCWVsc2UKKwkJYnVmWzNdID0gMHgwNDsKKworCWlmIChwLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikKKwkJYnVmWzNdIHw9IDB4MDg7CisKKwlpZiAoc2l6ZW9mKGJ1ZikgPT0gNikgeworCQlidWZbNF0gPSBidWZbMl07CisJCWJ1Zls0XSAmPSB+MHgxYzsKKwkJYnVmWzRdIHw9ICAweDE4OworCisJCWJ1Zls1XSA9ICgwIDw8IDcpIHwgKDIgPDwgNCk7CisJfQorCisJbXNnLmFkZHIgPSBJMkNfQUREUl9UVUE2MDM0ID4+IDE7CisJbXNnLmZsYWdzID0gMDsKKwltc2cuYnVmID0gYnVmOworCW1zZy5sZW4gPSBzaXplb2YoYnVmKTsKKworCXJldCA9IGkyY190cmFuc2ZlcigmcGx1dG8tPmkyY19hZGFwLCAmbXNnLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlIGlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbHV0bzJfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZnJvbnRlbmRfdG9fcGx1dG8oZmUpOworCisJcmV0dXJuIHJlcXVlc3RfZmlybXdhcmUoZncsIG5hbWUsICZwbHV0by0+cGRldi0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGx1dG8yX2ZlX2NvbmZpZyBfX2RldmluaXRkYXRhID0geworCS5kZW1vZF9hZGRyZXNzID0gSTJDX0FERFJfVERBMTAwNDYgPj4gMSwKKwkuaW52ZXJ0ID0gMSwKKwkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8zNjE3LAorCS5wbGxfc2V0ID0gbGdfdGR0cGUwMDFwX3BsbF9zZXQsCisJLnBsbF9zbGVlcCA9IE5VTEwsCisJLnJlcXVlc3RfZmlybXdhcmUgPSBwbHV0bzJfcmVxdWVzdF9maXJtd2FyZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGZyb250ZW5kX2luaXQoc3RydWN0IHBsdXRvICpwbHV0bykKK3sKKwlpbnQgcmV0OworCisJcGx1dG8tPmZlID0gdGRhMTAwNDZfYXR0YWNoKCZwbHV0bzJfZmVfY29uZmlnLCAmcGx1dG8tPmkyY19hZGFwKTsKKwlpZiAoIXBsdXRvLT5mZSkgeworCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCBmcm9udGVuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmcGx1dG8tPmR2Yl9hZGFwdGVyLCBwbHV0by0+ZmUpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChwbHV0by0+ZmUtPm9wcy0+cmVsZWFzZSkKKwkJCXBsdXRvLT5mZS0+b3BzLT5yZWxlYXNlKHBsdXRvLT5mZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHV0b19yZWFkX3JldihzdHJ1Y3QgcGx1dG8gKnBsdXRvKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTUlTQykgJiBNSVNDX0RWUjsKKwlkZXZfaW5mbygmcGx1dG8tPnBkZXYtPmRldiwgImJvYXJkIHJldmlzaW9uICVkLiVkXG4iLAorCQkJKHZhbCA+PiAxMikgJiAweDBmLCAodmFsID4+IDQpICYgMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbHV0b19yZWFkX21hYyhzdHJ1Y3QgcGx1dG8gKnBsdXRvLCB1OCAqbWFjKQoreworCXUzMiB2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTU1BQyk7CisJbWFjWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzFdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwl2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfSU1BQyk7CisJbWFjWzJdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzNdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwl2YWwgPSBwbHV0b19yZWFkcmVnKHBsdXRvLCBSRUdfTE1BQyk7CisJbWFjWzRdID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJbWFjWzVdID0gKHZhbCA+PiAwKSAmIDB4ZmY7CisKKwlkZXZfaW5mbygmcGx1dG8tPnBkZXYtPmRldiwgIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCW1hY1swXSwgbWFjWzFdLCBtYWNbMl0sIG1hY1szXSwgbWFjWzRdLCBtYWNbNV0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbHV0b19yZWFkX3NlcmlhbChzdHJ1Y3QgcGx1dG8gKnBsdXRvKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGx1dG8tPnBkZXY7CisJdW5zaWduZWQgaW50IGksIGo7CisJdTggX19pb21lbSAqY2lzOworCisJY2lzID0gcGNpX2lvbWFwKHBkZXYsIDEsIDApOworCWlmICghY2lzKQorCQlyZXR1cm4gLUVJTzsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTL04gIik7CisKKwlmb3IgKGkgPSAweGUwOyBpIDwgMHgxMDA7IGkgKz0gNCkgeworCQl1MzIgdmFsID0gcmVhZGwoJmNpc1tpXSk7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaiArPSA4KSB7CisJCQlpZiAoKHZhbCAmIDB4ZmYpID09IDB4ZmYpCisJCQkJZ290byBvdXQ7CisJCQlwcmludGsoIiVjIiwgdmFsICYgMHhmZik7CisJCQl2YWwgPj49IDg7CisJCX0KKwl9CitvdXQ6CisJcHJpbnRrKCJcbiIpOworCXBjaV9pb3VubWFwKHBkZXYsIGNpcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcGx1dG8yX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXI7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXg7CisJc3RydWN0IGRteF9kZW11eCAqZG14OworCWludCByZXQgPSAtRU5PTUVNOworCisJcGx1dG8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGx1dG8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBsdXRvKQorCQlnb3RvIG91dDsKKworCW1lbXNldChwbHV0bywgMCwgc2l6ZW9mKHN0cnVjdCBwbHV0bykpOworCXBsdXRvLT5wZGV2ID0gcGRldjsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9rZnJlZTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDZjLCAweDgwMDApOworCisJcmV0ID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlX2RldmljZTsKKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlX2RldmljZTsKKworCXBsdXRvLT5pb19tZW0gPSBwY2lfaW9tYXAocGRldiwgMCwgMHg0MCk7CisJaWYgKCFwbHV0by0+aW9fbWVtKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHBsdXRvKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGx1dG9faXJxLCBTQV9TSElSUSwgRFJJVkVSX05BTUUsIHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGNpX2lvdW5tYXA7CisKKwlyZXQgPSBwbHV0b19od19pbml0KHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9pcnE7CisKKwkvKiBpMmMgKi8KKwlpMmNfc2V0X2FkYXBkYXRhKCZwbHV0by0+aTJjX2FkYXAsIHBsdXRvKTsKKwlzdHJjcHkocGx1dG8tPmkyY19hZGFwLm5hbWUsIERSSVZFUl9OQU1FKTsKKwlwbHV0by0+aTJjX2FkYXAub3duZXIgPSBUSElTX01PRFVMRTsKKwlwbHV0by0+aTJjX2FkYXAuaWQgPSBJMkNfQUxHT19CSVQ7CisJcGx1dG8tPmkyY19hZGFwLmNsYXNzID0gSTJDX0NMQVNTX1RWX0RJR0lUQUw7CisJcGx1dG8tPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXBsdXRvLT5pMmNfYWRhcC5hbGdvX2RhdGEgPSAmcGx1dG8tPmkyY19iaXQ7CisJcGx1dG8tPmkyY19iaXQuZGF0YSA9IHBsdXRvOworCXBsdXRvLT5pMmNfYml0LnNldHNkYSA9IHBsdXRvX3NldHNkYTsKKwlwbHV0by0+aTJjX2JpdC5zZXRzY2wgPSBwbHV0b19zZXRzY2w7CisJcGx1dG8tPmkyY19iaXQuZ2V0c2RhID0gcGx1dG9fZ2V0c2RhOworCXBsdXRvLT5pMmNfYml0LmdldHNjbCA9IHBsdXRvX2dldHNjbDsKKwlwbHV0by0+aTJjX2JpdC51ZGVsYXkgPSAxMDsKKwlwbHV0by0+aTJjX2JpdC50aW1lb3V0ID0gMTA7CisKKwkvKiBSYWlzZSBTQ0wgYW5kIFNEQSAqLworCXBsdXRvX3NldHNkYShwbHV0bywgMSk7CisJcGx1dG9fc2V0c2NsKHBsdXRvLCAxKTsKKworCXJldCA9IGkyY19iaXRfYWRkX2J1cygmcGx1dG8tPmkyY19hZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGx1dG9faHdfZXhpdDsKKworCS8qIGR2YiAqLworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZwbHV0by0+ZHZiX2FkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2kyY19iaXRfZGVsX2J1czsKKworCWR2Yl9hZGFwdGVyID0gJnBsdXRvLT5kdmJfYWRhcHRlcjsKKworCXBsdXRvX3JlYWRfcmV2KHBsdXRvKTsKKwlwbHV0b19yZWFkX3NlcmlhbChwbHV0byk7CisJcGx1dG9fcmVhZF9tYWMocGx1dG8sIGR2Yl9hZGFwdGVyLT5wcm9wb3NlZF9tYWMpOworCisJZHZiZGVtdXggPSAmcGx1dG8tPmRlbXV4OworCWR2YmRlbXV4LT5maWx0ZXJudW0gPSAyNTY7CisJZHZiZGVtdXgtPmZlZWRudW0gPSAyNTY7CisJZHZiZGVtdXgtPnN0YXJ0X2ZlZWQgPSBwbHV0b19zdGFydF9mZWVkOworCWR2YmRlbXV4LT5zdG9wX2ZlZWQgPSBwbHV0b19zdG9wX2ZlZWQ7CisJZHZiZGVtdXgtPmRteC5jYXBhYmlsaXRpZXMgPSAoRE1YX1RTX0ZJTFRFUklORyB8CisJCQlETVhfU0VDVElPTl9GSUxURVJJTkcgfCBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJcmV0ID0gZHZiX2RteF9pbml0KGR2YmRlbXV4KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZHZiX3VucmVnaXN0ZXJfYWRhcHRlcjsKKworCWRteCA9ICZkdmJkZW11eC0+ZG14OworCisJcGx1dG8tPmh3X2Zyb250ZW5kLnNvdXJjZSA9IERNWF9GUk9OVEVORF8wOworCXBsdXRvLT5tZW1fZnJvbnRlbmQuc291cmNlID0gRE1YX01FTU9SWV9GRTsKKwlwbHV0by0+ZG14ZGV2LmZpbHRlcm51bSA9IE5IV0ZJTFRFUlM7CisJcGx1dG8tPmRteGRldi5kZW11eCA9IGRteDsKKworCXJldCA9IGR2Yl9kbXhkZXZfaW5pdCgmcGx1dG8tPmRteGRldiwgZHZiX2FkYXB0ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14X3JlbGVhc2U7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZwbHV0by0+aHdfZnJvbnRlbmQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9kdmJfZG14ZGV2X3JlbGVhc2U7CisKKwlyZXQgPSBkbXgtPmFkZF9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcmVtb3ZlX2h3X2Zyb250ZW5kOworCisJcmV0ID0gZG14LT5jb25uZWN0X2Zyb250ZW5kKGRteCwgJnBsdXRvLT5od19mcm9udGVuZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3JlbW92ZV9tZW1fZnJvbnRlbmQ7CisKKwlyZXQgPSBmcm9udGVuZF9pbml0KHBsdXRvKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZGlzY29ubmVjdF9mcm9udGVuZDsKKworCWR2Yl9uZXRfaW5pdChkdmJfYWRhcHRlciwgJnBsdXRvLT5kdmJuZXQsIGRteCk7CitvdXQ6CisJcmV0dXJuIHJldDsKKworZXJyX2Rpc2Nvbm5lY3RfZnJvbnRlbmQ6CisJZG14LT5kaXNjb25uZWN0X2Zyb250ZW5kKGRteCk7CitlcnJfcmVtb3ZlX21lbV9mcm9udGVuZDoKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKK2Vycl9yZW1vdmVfaHdfZnJvbnRlbmQ6CisJZG14LT5yZW1vdmVfZnJvbnRlbmQoZG14LCAmcGx1dG8tPmh3X2Zyb250ZW5kKTsKK2Vycl9kdmJfZG14ZGV2X3JlbGVhc2U6CisJZHZiX2RteGRldl9yZWxlYXNlKCZwbHV0by0+ZG14ZGV2KTsKK2Vycl9kdmJfZG14X3JlbGVhc2U6CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKK2Vycl9kdmJfdW5yZWdpc3Rlcl9hZGFwdGVyOgorCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoZHZiX2FkYXB0ZXIpOworZXJyX2kyY19iaXRfZGVsX2J1czoKKwlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CitlcnJfcGx1dG9faHdfZXhpdDoKKwlwbHV0b19od19leGl0KHBsdXRvKTsKK2Vycl9mcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIHBsdXRvKTsKK2Vycl9wY2lfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBwbHV0by0+aW9fbWVtKTsKK2Vycl9wY2lfcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK2Vycl9rZnJlZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUocGx1dG8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcGx1dG8yX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBkdmJfYWRhcHRlciAqZHZiX2FkYXB0ZXIgPSAmcGx1dG8tPmR2Yl9hZGFwdGVyOworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gJnBsdXRvLT5kZW11eDsKKwlzdHJ1Y3QgZG14X2RlbXV4ICpkbXggPSAmZHZiZGVtdXgtPmRteDsKKworCWRteC0+Y2xvc2UoZG14KTsKKwlkdmJfbmV0X3JlbGVhc2UoJnBsdXRvLT5kdmJuZXQpOworCWlmIChwbHV0by0+ZmUpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKHBsdXRvLT5mZSk7CisKKwlkbXgtPmRpc2Nvbm5lY3RfZnJvbnRlbmQoZG14KTsKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+bWVtX2Zyb250ZW5kKTsKKwlkbXgtPnJlbW92ZV9mcm9udGVuZChkbXgsICZwbHV0by0+aHdfZnJvbnRlbmQpOworCWR2Yl9kbXhkZXZfcmVsZWFzZSgmcGx1dG8tPmRteGRldik7CisJZHZiX2RteF9yZWxlYXNlKGR2YmRlbXV4KTsKKwlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGR2Yl9hZGFwdGVyKTsKKwlpMmNfYml0X2RlbF9idXMoJnBsdXRvLT5pMmNfYWRhcCk7CisJcGx1dG9faHdfZXhpdChwbHV0byk7CisJZnJlZV9pcnEocGRldi0+aXJxLCBwbHV0byk7CisJcGNpX2lvdW5tYXAocGRldiwgcGx1dG8tPmlvX21lbSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWtmcmVlKHBsdXRvKTsKK30KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1NDTQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NDTQkweDA0MzIKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1BMVVRPMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1BMVVRPMgkweDAwMDEKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGx1dG8yX2lkX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NDTSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfUExVVE8yLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJfSwgeworCQkvKiBlbXB0eSAqLworCX0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGx1dG8yX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBsdXRvMl9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUgPSBwbHV0bzJfaWRfdGFibGUsCisJLnByb2JlID0gcGx1dG8yX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbHV0bzJfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBsdXRvMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBsdXRvMl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGx1dG8yX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBsdXRvMl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwbHV0bzJfaW5pdCk7Cittb2R1bGVfZXhpdChwbHV0bzJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgT2JlcnJpdHRlciA8b2JpQGxpbnV4dHYub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQbHV0bzIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZwppbmRleCA3ZmZhMmM3Li5iZjNjMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTEyLDcgKzEyLDcgQEAKIAlzZWxlY3QgRFZCX1NUVjAyOTcKIAlzZWxlY3QgRFZCX0w2NDc4MQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFNBQTcxNDYgYW5kIEFWNzExMCBiYXNlZCBEVkIgY2FyZHMgYXMgcHJvZHVjZWQgCisJICBTdXBwb3J0IGZvciBTQUE3MTQ2IGFuZCBBVjcxMTAgYmFzZWQgRFZCIGNhcmRzIGFzIHByb2R1Y2VkCiAJICBieSBGdWppdHN1LVNpZW1lbnMsIFRlY2hub3RyZW5kLCBIYXVwcGF1Z2UgYW5kIG90aGVycy4KIAogCSAgVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyB0aGUgZnVsbGZlYXR1cmVkIGNhcmRzIHdpdGgKQEAgLTMzLDcgKzMzLDcgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGZpcm13YXJlIGludG8gdGhlIGRyaXZlciB5b3UgbmVlZCB0byBzYXkKIAkgIFkgaGVyZSBhbmQgcHJvdmlkZSB0aGUgY29ycmVjdCBwYXRoIG9mIHRoZSBmaXJtd2FyZS4gWW91IG5lZWQgdGhpcwogCSAgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHdob2xlIGRyaXZlciBzdGF0aWNhbGx5IGludG8gdGhlCi0JICBrZXJuZWwuIAorCSAga2VybmVsLgogCiAJICBBbGwgb3RoZXIgcGVvcGxlIHNheSBOLgogCkBAIC02Niw2ICs2Niw3IEBACiAJc2VsZWN0IERWQl9MNjQ3ODEKIAlzZWxlY3QgRFZCX1REQTgwODMKIAlzZWxlY3QgRFZCX1REQTEwMDIxCisJc2VsZWN0IERWQl9TNUgxNDIwCiAJaGVscAogCSAgU3VwcG9ydCBmb3Igc2ltcGxlIFNBQTcxNDYgYmFzZWQgRFZCIGNhcmRzCiAJICAoc28gY2FsbGVkIEJ1ZGdldC0gb3IgTm92YS1QQ0kgY2FyZHMpIHdpdGhvdXQgb25ib2FyZApAQCAtMTE5LDkgKzEyMCw5IEBACiAJc2VsZWN0IERWQl9WRVMxWDkzCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJaGVscAotCSAgU3VwcG9ydCBmb3IgQnVkZ2V0IFBhdGNoIChmdWxsIFRTKSBtb2RpZmljYXRpb24gb24gCisJICBTdXBwb3J0IGZvciBCdWRnZXQgUGF0Y2ggKGZ1bGwgVFMpIG1vZGlmaWNhdGlvbiBvbgogCSAgU0FBNzE0NitBVjcxMTAgYmFzZWQgY2FyZHMgKERWQi1TIGNhcmRzKS4gVGhpcwotCSAgZHJpdmVyIGRvZXNuJ3QgdXNlIG9uYm9hcmQgTVBFRzIgZGVjb2Rlci4gVGhlIAorCSAgZHJpdmVyIGRvZXNuJ3QgdXNlIG9uYm9hcmQgTVBFRzIgZGVjb2Rlci4gVGhlCiAJICBjYXJkIGlzIGRyaXZlbiBpbiBCdWRnZXQtb25seSBtb2RlLiBDYXJkIGlzCiAJICByZXF1aXJlZCB0byBoYXZlIGxvYWRlZCBmaXJtd2FyZSB0byB0dW5lIHByb3Blcmx5LgogCSAgRmlybXdhcmUgY2FuIGJlIGxvYWRlZCBieSBpbnNlcnRpb24gYW5kIHJlbW92YWwgb2YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggOGUzM2E4NS4uZTRjNmU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTExNiwxMyArMTE2LDE4IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfYXY3MTEwX2F2KHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2ID0gYXY3MTEwLT5kZXY7CiAKIAkvKiBzZXQgaW50ZXJuYWwgdm9sdW1lIGNvbnRyb2wgdG8gbWF4aW11bSAqLwogCWF2NzExMC0+YWRhY190eXBlID0gRFZCX0FEQUNfVEk7Ci0JYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgaW50ZXJuYWwgdm9sdW1lIHRvIG1heGltdW06JWRcbiIscmV0KTsKIAotCWF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOworCXJldCA9IGF2NzcxMF9zZXRfdmlkZW9fbW9kZShhdjcxMTAsIHZpZG1vZGUpOworCWlmIChyZXQgPCAwKQorCQlwcmludGsoImR2Yi10dHBjaTpjYW5ub3Qgc2V0IHZpZGVvIG1vZGU6JWRcbiIscmV0KTsKIAogCS8qIGhhbmRsZSBkaWZmZXJlbnQgY2FyZCB0eXBlcyAqLwogCS8qIHJlbWFpbmluZyBpbml0cyBhY2NvcmRpbmcgdG8gY2FyZCBhbmQgZnJvbnRlbmQgdHlwZSAqLwpAQCAtMTU2LDggKzE2MSwxMiBAQAogCiAJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX05PTkUgfHwgYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfTVNQKSB7CiAJCS8vIHN3aXRjaCBEVkIgU0NBUlQgb24KLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfQVVESU9EQUMsIE1haW5Td2l0Y2gsIDEsIDApOwotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDEpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgTWFpblN3aXRjaCwgMSwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJpbnRrKCJkdmItdHRwY2k6Y2Fubm90IHN3aXRjaCBvbiBTQ0FSVChNYWluKTolZFxuIixyZXQpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgQURTd2l0Y2gsIDEsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzd2l0Y2ggb24gU0NBUlQoQUQpOiVkXG4iLHJldCk7CiAJCWlmIChyZ2Jfb24gJiYKIAkJICAgIChhdjcxMTAtPmRldi0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTEwYSkgJiYgKGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMDAwKSkgewogCQkJc2FhNzE0Nl9zZXRncGlvKGRldiwgMSwgU0FBNzE0Nl9HUElPX09VVEhJKTsgLy8gUkdCIG9uLCBTQ0FSVCBwaW4gMTYKQEAgLTE2NSw4ICsxNzQsMTIgQEAKIAkJfQogCX0KIAotCWF2NzExMF9zZXRfdm9sdW1lKGF2NzExMCwgYXY3MTEwLT5taXhlci52b2x1bWVfbGVmdCwgYXY3MTEwLT5taXhlci52b2x1bWVfcmlnaHQpOwotCWF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7CisJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhdjcxMTAtPm1peGVyLnZvbHVtZV9sZWZ0LCBhdjcxMTAtPm1peGVyLnZvbHVtZV9yaWdodCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXQgdm9sdW1lIDolZFxuIixyZXQpOworCXJldCA9IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKGF2NzExMCwgMCk7CisJaWYgKHJldCA8IDApCisJCXByaW50aygiZHZiLXR0cGNpOmNhbm5vdCBzZXR1cCBpcmMgY29uZmlnIDolZFxuIixyZXQpOwogfQogCiBzdGF0aWMgdm9pZCByZWNvdmVyX2FybShzdHJ1Y3QgYXY3MTEwICphdjcxMTApCkBAIC0yNTgsOCArMjcxLDkgQEAKICAqCiAgKiAgSWYgd2Ugd2FudCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbnRyb2xzIHdlIHdvdWxkIGhhdmUgdG8gZG8gbXVjaCBtb3JlLi4uCiAgKi8KLXZvaWQgYXY3MTEwX3NldHVwX2lyY19jb25maWcoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgaXJfY29uZmlnKQoraW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZykKIHsKKwlpbnQgcmV0ID0gMDsKIAlzdGF0aWMgc3RydWN0IGF2NzExMCAqbGFzdDsKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwpAQCAtMjcwLDkgKzI4NCwxMCBAQAogCQlsYXN0ID0gYXY3MTEwOwogCiAJaWYgKGF2NzExMCkgewotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNldElSLCAxLCBpcl9jb25maWcpOwogCQlhdjcxMTAtPmlyX2NvbmZpZyA9IGlyX2NvbmZpZzsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgKCppcmNfaGFuZGxlcikodTMyKTsKQEAgLTc2NSwxMyArNzgwLDE0IEBACiAJCQkgICAgIHBjcnBpZCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCk7CiB9CiAKLXZvaWQgQ2hhbmdlUElEcyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB2cGlkLCB1MTYgYXBpZCwgdTE2IHR0cGlkLAoraW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJdTE2IHN1YnBpZCwgdTE2IHBjcnBpZCkKIHsKKwlpbnQgcmV0ID0gMDsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+cGlkX211dGV4KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCiAJaWYgKCEodnBpZCAmIDB4ODAwMCkpCiAJCWF2NzExMC0+cGlkc1tETVhfUEVTX1ZJREVPXSA9IHZwaWQ7CkBAIC03ODYsMTAgKzgwMiwxMSBAQAogCiAJaWYgKGF2NzExMC0+ZmVfc3luY2VkKSB7CiAJCXBjcnBpZCA9IGF2NzExMC0+cGlkc1tETVhfUEVTX1BDUl07Ci0JCVNldFBJRHMoYXY3MTEwLCB2cGlkLCBhcGlkLCB0dHBpZCwgc3VicGlkLCBwY3JwaWQpOworCQlyZXQgPSBTZXRQSURzKGF2NzExMCwgdnBpZCwgYXBpZCwgdHRwaWQsIHN1YnBpZCwgcGNycGlkKTsKIAl9CiAKIAl1cCgmYXY3MTEwLT5waWRfbXV0ZXgpOworCXJldHVybiByZXQ7CiB9CiAKIApAQCAtODMyLDExICs4NDksMTMgQEAKIAlyZXQgPSBhdjcxMTBfZndfcmVxdWVzdChhdjcxMTAsIGJ1ZiwgMjAsICZoYW5kbGUsIDEpOwogCWlmIChyZXQgIT0gMCB8fCBoYW5kbGUgPj0gMzIpIHsKIAkJcHJpbnRrKCJkdmItdHRwY2k6ICVzIGVycm9yICBidWYgJTA0eCAlMDR4ICUwNHggJTA0eCAgIgotCQkJCSJyZXQgJXggIGhhbmRsZSAlMDR4XG4iLAorCQkJCSJyZXQgJWQgIGhhbmRsZSAlMDR4XG4iLAogCQkJCV9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLAogCQkJCXJldCwgaGFuZGxlKTsKIAkJZHZiZG14ZmlsdGVyLT5od19oYW5kbGUgPSAweGZmZmY7Ci0JCXJldHVybiAtMTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSAtMTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaGFuZGxlXSA9IGR2YmRteGZpbHRlcjsKQEAgLTg1OSw3ICs4NzgsNyBAQAogCWlmIChoYW5kbGUgPj0gMzIpIHsKIAkJcHJpbnRrKCIlcyB0cmllZCB0byBzdG9wIGludmFsaWQgZmlsdGVyICUwNHgsIGZpbHRlciB0eXBlID0gJXhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBoYW5kbGUsIGR2YmRteGZpbHRlci0+dHlwZSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlhdjcxMTAtPmhhbmRsZTJmaWx0ZXJbaGFuZGxlXSA9IE5VTEw7CkBAIC04NzMsMTggKzg5MiwyMCBAQAogCQkJCSJyZXNwICUwNHggJTA0eCAgcGlkICVkXG4iLAogCQkJCV9fRlVOQ1RJT05fXywgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgcmV0LAogCQkJCWFuc3dbMF0sIGFuc3dbMV0sIGR2YmRteGZpbHRlci0+ZmVlZC0+cGlkKTsKLQkJcmV0ID0gLTE7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLTE7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKIAotc3RhdGljIHZvaWQgZHZiX2ZlZWRfc3RhcnRfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3N0YXRpYyBpbnQgZHZiX2ZlZWRfc3RhcnRfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKIHsKIAlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSAoc3RydWN0IGF2NzExMCAqKSBkdmJkbXgtPnByaXY7CiAJdTE2ICpwaWQgPSBkdmJkbXgtPnBpZHMsIG5waWRzWzVdOwogCWludCBpOworCWludCByZXQgPSAwOwogCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKQEAgLTg5MywzNiArOTE0LDQ5IEBACiAJbnBpZHNbaV0gPSAocGlkW2ldJjB4ODAwMCkgPyAwIDogcGlkW2ldOwogCWlmICgoaSA9PSAyKSAmJiBucGlkc1tpXSAmJiAoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkpIHsKIAkJbnBpZHNbaV0gPSAwOwotCQlDaGFuZ2VQSURzKGF2NzExMCwgbnBpZHNbMV0sIG5waWRzWzBdLCBucGlkc1syXSwgbnBpZHNbM10sIG5waWRzWzRdKTsKLQkJU3RhcnRIV0ZpbHRlcihkdmJkbXhmZWVkLT5maWx0ZXIpOwotCQlyZXR1cm47CisJCXJldCA9IENoYW5nZVBJRHMoYXY3MTEwLCBucGlkc1sxXSwgbnBpZHNbMF0sIG5waWRzWzJdLCBucGlkc1szXSwgbnBpZHNbNF0pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IFN0YXJ0SFdGaWx0ZXIoZHZiZG14ZmVlZC0+ZmlsdGVyKTsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDIgfHwgZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gNCkKLQkJQ2hhbmdlUElEcyhhdjcxMTAsIG5waWRzWzFdLCBucGlkc1swXSwgbnBpZHNbMl0sIG5waWRzWzNdLCBucGlkc1s0XSk7CisJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDIgfHwgZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gNCkgeworCQlyZXQgPSBDaGFuZ2VQSURzKGF2NzExMCwgbnBpZHNbMV0sIG5waWRzWzBdLCBucGlkc1syXSwgbnBpZHNbM10sIG5waWRzWzRdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDwgMiAmJiBucGlkc1swXSkKIAkJaWYgKGF2NzExMC0+ZmVfc3luY2VkKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJeworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQogCiAJaWYgKChkdmJkbXhmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSkgewogCQlpZiAoZHZiZG14ZmVlZC0+cGVzX3R5cGUgPT0gMCAmJiAhKGR2YmRteC0+cGlkc1swXSAmIDB4ODAwMCkpCi0JCQlhdjcxMTBfYXZfc3RhcnRfcmVjb3JkKGF2NzExMCwgUlBfQVVESU8sIGR2YmRteGZlZWQpOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0YXJ0X3JlY29yZChhdjcxMTAsIFJQX0FVRElPLCBkdmJkbXhmZWVkKTsKIAkJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlID09IDEgJiYgIShkdmJkbXgtPnBpZHNbMV0gJiAweDgwMDApKQotCQkJYXY3MTEwX2F2X3N0YXJ0X3JlY29yZChhdjcxMTAsIFJQX1ZJREVPLCBkdmJkbXhmZWVkKTsKKwkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoYXY3MTEwLCBSUF9WSURFTywgZHZiZG14ZmVlZCk7CiAJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGR2Yl9mZWVkX3N0b3BfcGlkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3N0YXRpYyBpbnQgZHZiX2ZlZWRfc3RvcF9waWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OwogCXN0cnVjdCBhdjcxMTAgKmF2NzExMCA9IChzdHJ1Y3QgYXY3MTEwICopIGR2YmRteC0+cHJpdjsKIAl1MTYgKnBpZCA9IGR2YmRteC0+cGlkcywgbnBpZHNbNV07CiAJaW50IGk7CiAKKwlpbnQgcmV0ID0gMDsKKwogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCiAJaWYgKGR2YmRteGZlZWQtPnBlc190eXBlIDw9IDEpIHsKLQkJYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBkdmJkbXhmZWVkLT5wZXNfdHlwZSA/ICBSUF9WSURFTyA6IFJQX0FVRElPKTsKKwkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBkdmJkbXhmZWVkLT5wZXNfdHlwZSA/ICBSUF9WSURFTyA6IFJQX0FVRElPKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWlmICghYXY3MTEwLT5yZWNfbW9kZSkKIAkJCWR2YmRteC0+cmVjb3JkaW5nID0gMDsKIAkJaWYgKCFhdjcxMTAtPnBsYXlpbmcpCkBAIC05MzMsMjQgKzk2NywyNyBAQAogCXN3aXRjaCAoaSkgewogCWNhc2UgMjogLy90ZWxldGV4dAogCQlpZiAoZHZiZG14ZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkKLQkJCVN0b3BIV0ZpbHRlcihkdmJkbXhmZWVkLT5maWx0ZXIpOworCQkJcmV0ID0gU3RvcEhXRmlsdGVyKGR2YmRteGZlZWQtPmZpbHRlcik7CiAJCW5waWRzWzJdID0gMDsKIAkJYnJlYWs7CiAJY2FzZSAwOgogCWNhc2UgMToKIAljYXNlIDQ6CiAJCWlmICghcGlkc19vZmYpCi0JCQlyZXR1cm47CisJCQlyZXR1cm4gMDsKIAkJbnBpZHNbaV0gPSAocGlkW2ldJjB4ODAwMCkgPyAwIDogcGlkW2ldOwogCQlicmVhazsKIAl9Ci0JQ2hhbmdlUElEcyhhdjcxMTAsIG5waWRzWzFdLCBucGlkc1swXSwgbnBpZHNbMl0sIG5waWRzWzNdLCBucGlkc1s0XSk7CisJaWYgKCFyZXQpCisJCXJldCA9IENoYW5nZVBJRHMoYXY3MTEwLCBucGlkc1sxXSwgbnBpZHNbMF0sIG5waWRzWzJdLCBucGlkc1szXSwgbnBpZHNbNF0pOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX3N0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkKQogewogCXN0cnVjdCBkdmJfZGVtdXggKmRlbXV4ID0gZmVlZC0+ZGVtdXg7CiAJc3RydWN0IGF2NzExMCAqYXY3MTEwID0gZGVtdXgtPnByaXY7CisJaW50IHJldCA9IDA7CiAKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIApAQCAtOTcxLDIxICsxMDA4LDIyIEBACiAJCQkJCSAgICEoZGVtdXgtPnBpZHNbMV0gJiAweDgwMDApKSB7CiAJCQkJCSAgICAgICBkdmJfcmluZ2J1ZmZlcl9mbHVzaF9zcGlubG9ja193YWtldXAoJmF2NzExMC0+YXZvdXQpOwogCQkJCQkgICAgICAgZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKCZhdjcxMTAtPmFvdXQpOwotCQkJCQkgICAgICAgYXY3MTEwX2F2X3N0YXJ0X3BsYXkoYXY3MTEwLFJQX0FWKTsKLQkJCQkJICAgICAgIGRlbXV4LT5wbGF5aW5nID0gMTsKKwkJCQkJICAgICAgIHJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCxSUF9BVik7CisJCQkJCSAgICAgICBpZiAoIXJldCkKKwkJCQkJCSAgICAgICBkZW11eC0+cGxheWluZyA9IDE7CiAJCQkJCX0KIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJZHZiX2ZlZWRfc3RhcnRfcGlkKGZlZWQpOworCQkJCXJldCA9IGR2Yl9mZWVkX3N0YXJ0X3BpZChmZWVkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIGlmICgoZmVlZC0+dHNfdHlwZSAmIFRTX1BBQ0tFVCkgJiYKIAkJCSAgIChkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpIHsKLQkJCVN0YXJ0SFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKKwkJCXJldCA9IFN0YXJ0SFdGaWx0ZXIoZmVlZC0+ZmlsdGVyKTsKIAkJfQogCX0KIAotCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1NFQykgeworCWVsc2UgaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkZW11eC0+ZmlsdGVybnVtOyBpKyspIHsKQEAgLTk5NiwxMiArMTAzNCwxNSBAQAogCQkJaWYgKGRlbXV4LT5maWx0ZXJbaV0uZmlsdGVyLnBhcmVudCAhPSAmZmVlZC0+ZmVlZC5zZWMpCiAJCQkJY29udGludWU7CiAJCQlkZW11eC0+ZmlsdGVyW2ldLnN0YXRlID0gRE1YX1NUQVRFX0dPOwotCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKQotCQkJCVN0YXJ0SFdGaWx0ZXIoJmRlbXV4LT5maWx0ZXJbaV0pOworCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSB7CisJCQkJcmV0ID0gU3RhcnRIV0ZpbHRlcigmZGVtdXgtPmZpbHRlcltpXSk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTEwMDksNyArMTA1MCw3IEBACiB7CiAJc3RydWN0IGR2Yl9kZW11eCAqZGVtdXggPSBmZWVkLT5kZW11eDsKIAlzdHJ1Y3QgYXY3MTEwICphdjcxMTAgPSBkZW11eC0+cHJpdjsKLQorCWludCBpLCByYywgcmV0ID0gMDsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAogCWlmIChmZWVkLT50eXBlID09IERNWF9UWVBFX1RTKSB7CkBAIC0xMDIyLDI2ICsxMDYzLDI5IEBACiAJCX0KIAkJaWYgKGZlZWQtPnRzX3R5cGUgJiBUU19ERUNPREVSICYmCiAJCSAgICBmZWVkLT5wZXNfdHlwZSA8IERNWF9UU19QRVNfT1RIRVIpIHsKLQkJCWR2Yl9mZWVkX3N0b3BfcGlkKGZlZWQpOworCQkJcmV0ID0gZHZiX2ZlZWRfc3RvcF9waWQoZmVlZCk7CiAJCX0gZWxzZQogCQkJaWYgKChmZWVkLT50c190eXBlICYgVFNfUEFDS0VUKSAmJgogCQkJICAgIChkZW11eC0+ZG14LmZyb250ZW5kLT5zb3VyY2UgIT0gRE1YX01FTU9SWV9GRSkpCi0JCQkJU3RvcEhXRmlsdGVyKGZlZWQtPmZpbHRlcik7CisJCQkJcmV0ID0gU3RvcEhXRmlsdGVyKGZlZWQtPmZpbHRlcik7CiAJfQogCi0JaWYgKGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKQorCWlmICghcmV0ICYmIGZlZWQtPnR5cGUgPT0gRE1YX1RZUEVfU0VDKSB7CisJCWZvciAoaSA9IDA7IGk8ZGVtdXgtPmZpbHRlcm51bTsgaSsrKSB7CiAJCQlpZiAoZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9PSBETVhfU1RBVEVfR08gJiYKIAkJCSAgICBkZW11eC0+ZmlsdGVyW2ldLmZpbHRlci5wYXJlbnQgPT0gJmZlZWQtPmZlZWQuc2VjKSB7CiAJCQkJZGVtdXgtPmZpbHRlcltpXS5zdGF0ZSA9IERNWF9TVEFURV9SRUFEWTsKLQkJCQlpZiAoZGVtdXgtPmRteC5mcm9udGVuZC0+c291cmNlICE9IERNWF9NRU1PUllfRkUpCi0JCQkJCVN0b3BIV0ZpbHRlcigmZGVtdXgtPmZpbHRlcltpXSk7CisJCQkJaWYgKGRlbXV4LT5kbXguZnJvbnRlbmQtPnNvdXJjZSAhPSBETVhfTUVNT1JZX0ZFKSB7CisJCQkJCXJjID0gU3RvcEhXRmlsdGVyKCZkZW11eC0+ZmlsdGVyW2ldKTsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSByYzsKKwkJCQkJLyoga2VlcCBnb2luZywgc3RvcCBhcyBtYW55IGZpbHRlcnMgYXMgcG9zc2libGUgKi8KKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTEwOTMsNyArMTEzNyw3IEBACiAJcmV0ID0gYXY3MTEwX2Z3X3JlcXVlc3QoYXY3MTEwLCAmdGFnLCAwLCBmd3N0YywgNCk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBhdjcxMTBfZndfcmVxdWVzdCBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiByZXQ7CiAJfQogCWRwcmludGsoMiwgImZ3c3RjID0gJTA0aHggJTA0aHggJTA0aHggJTA0aHhcbiIsCiAJCWZ3c3RjWzBdLCBmd3N0Y1sxXSwgZndzdGNbMl0sIGZ3c3RjWzNdKTsKQEAgLTExMTksMTggKzExNjMsMTQgQEAKIAogCXN3aXRjaCAodG9uZSkgewogCWNhc2UgU0VDX1RPTkVfT046Ci0JCVNldDIySyhhdjcxMTAsIDEpOwotCQlicmVhazsKKwkJcmV0dXJuIFNldDIySyhhdjcxMTAsIDEpOwogCiAJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCVNldDIySyhhdjcxMTAsIDApOwotCQlicmVhazsKKwkJcmV0dXJuIFNldDIySyhhdjcxMTAsIDApOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCkBAIC0xMTM4LDkgKzExNzgsNyBAQAogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKLQlhdjcxMTBfZGlzZXFjX3NlbmQoYXY3MTEwLCBjbWQtPm1zZ19sZW4sIGNtZC0+bXNnLCAtMSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXY3MTEwX2Rpc2VxY19zZW5kKGF2NzExMCwgY21kLT5tc2dfbGVuLCBjbWQtPm1zZywgLTEpOwogfQogCiBzdGF0aWMgaW50IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKQEAgLTExNDgsOSArMTE4Niw3IEBACiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9kaXNlcWNfc2VuZChhdjcxMTAsIDAsIE5VTEwsIG1pbmljbWQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGF2NzExMF9kaXNlcWNfc2VuZChhdjcxMTAsIDAsIE5VTEwsIG1pbmljbWQpOwogfQogCiAvKiBzaW1wbGlmaWVkIGNvZGUgZnJvbSBidWRnZXQtY29yZS5jICovCkBAIC0xOTkyLDc2ICsyMDI4LDg1IEBACiAKIAogCi1zdGF0aWMgdm9pZCBhdjcxMTBfZmVfbG9ja19maXgoc3RydWN0IGF2NzExMCogYXY3MTEwLCBmZV9zdGF0dXNfdCBzdGF0dXMpCitzdGF0aWMgaW50IGF2NzExMF9mZV9sb2NrX2ZpeChzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAsIGZlX3N0YXR1c190IHN0YXR1cykKIHsKKwlpbnQgcmV0ID0gMDsKIAlpbnQgc3luY2VkID0gKHN0YXR1cyAmIEZFX0hBU19MT0NLKSA/IDEgOiAwOwogCiAJYXY3MTEwLT5mZV9zdGF0dXMgPSBzdGF0dXM7CiAKIAlpZiAoYXY3MTEwLT5mZV9zeW5jZWQgPT0gc3luY2VkKQotCQlyZXR1cm47Ci0KLQlhdjcxMTAtPmZlX3N5bmNlZCA9IHN5bmNlZDsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoYXY3MTEwLT5wbGF5aW5nKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5waWRfbXV0ZXgpKQotCQlyZXR1cm47CisJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlpZiAoYXY3MTEwLT5mZV9zeW5jZWQpIHsKLQkJU2V0UElEcyhhdjcxMTAsIGF2NzExMC0+cGlkc1tETVhfUEVTX1ZJREVPXSwKKwlpZiAoc3luY2VkKSB7CisJCXJldCA9IFNldFBJRHMoYXY3MTEwLCBhdjcxMTAtPnBpZHNbRE1YX1BFU19WSURFT10sCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19BVURJT10sCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19URUxFVEVYVF0sIDAsCiAJCQlhdjcxMTAtPnBpZHNbRE1YX1BFU19QQ1JdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9QSURGSUxURVIsIFNjYW4sIDApOwogCX0gZWxzZSB7Ci0JCVNldFBJRHMoYXY3MTEwLCAwLCAwLCAwLCAwLCAwKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElEX0ZJTFRFUiwgRmx1c2hUU1F1ZXVlLCAwKTsKLQkJYXY3MTEwX3dhaXRfbXNnc3RhdGUoYXY3MTEwLCBHUE1RQnVzeSk7CisJCXJldCA9IFNldFBJRHMoYXY3MTEwLCAwLCAwLCAwLCAwLCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJRF9GSUxURVIsIEZsdXNoVFNRdWV1ZSwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBhdjcxMTBfd2FpdF9tc2dzdGF0ZShhdjcxMTAsIEdQTVFCdXN5KTsKKwkJfQogCX0KIAorCWlmICghcmV0KQorCQlhdjcxMTAtPmZlX3N5bmNlZCA9IHN5bmNlZDsKKwogCXVwKCZhdjcxMTAtPnBpZF9tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfc2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX3NldF9mcm9udGVuZChmZSwgcGFyYW1zKTsKKworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfZnJvbnRlbmQoZmUsIHBhcmFtcyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfaW5pdChmZSk7CisJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOworCWlmICghcmV0KQorCQlyZXQgPSBhdjcxMTAtPmZlX2luaXQoZmUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7Ci0JaW50IHJldDsKIAogCS8qIGNhbGwgdGhlIHJlYWwgaW1wbGVtZW50YXRpb24gKi8KLQlyZXQgPSBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoKCgqc3RhdHVzIF4gYXY3MTEwLT5mZV9zdGF0dXMpICYgRkVfSEFTX0xPQ0spICYmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spKSB7Ci0JCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsICpzdGF0dXMpOwotCX0KLQotCXJldHVybiAwOworCWludCByZXQgPSBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOworCWlmICghcmV0KQorCQlpZiAoKCgqc3RhdHVzIF4gYXY3MTEwLT5mZV9zdGF0dXMpICYgRkVfSEFTX0xPQ0spICYmICgqc3RhdHVzICYgRkVfSEFTX0xPQ0spKQorCQkJcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgKnN0YXR1cyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzZXFjX3Jlc2V0X292ZXJsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAKLQlhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKLQlyZXR1cm4gYXY3MTEwLT5mZV9kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9kaXNlcWNfcmVzZXRfb3ZlcmxvYWQoZmUpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCkBAIC0yMDY5LDQwICsyMTE0LDUwIEBACiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJaW50IHJldCA9IGF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOworCWlmICghcmV0KQorCQlyZXQgPSBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIGNtZCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzZXFjX3NlbmRfYnVyc3Qoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY19taW5pX2NtZF90IG1pbmljbWQpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAotCWF2NzExMF9mZV9sb2NrX2ZpeChhdjcxMTAsIDApOwotCXJldHVybiBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX2J1cnN0KGZlLCBtaW5pY21kKTsKKwlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+ZmVfZGlzZXFjX3NlbmRfYnVyc3QoZmUsIG1pbmljbWQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXY3MTEwX2ZlX3NldF90b25lKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zZWNfdG9uZV9tb2RlX3QgdG9uZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfc2V0X3RvbmUoZmUsIHRvbmUpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdG9uZShmZSwgdG9uZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfc2V0X3ZvbHRhZ2UoZmUsIHZvbHRhZ2UpOworCWludCByZXQgPSBhdjcxMTBfZmVfbG9ja19maXgoYXY3MTEwLCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXY3MTEwLT5mZV9zZXRfdm9sdGFnZShmZSwgdm9sdGFnZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdjcxMTBfZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCi0JYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7Ci0JcmV0dXJuIGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgY21kKTsKKwlpbnQgcmV0ID0gYXY3MTEwX2ZlX2xvY2tfZml4KGF2NzExMCwgMCk7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgY21kKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IGF2NzExMCogYXY3MTEwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAppbmRleCA0ZjY5YjRkLi41MDhiNzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTAuaApAQCAtMTE5LDggKzExOSw3IEBACiAJdm9sYXRpbGUgaW50CQlibXBfc3RhdGU7CiAjZGVmaW5lIEJNUF9OT05FICAgICAwCiAjZGVmaW5lIEJNUF9MT0FESU5HICAxCi0jZGVmaW5lIEJNUF9MT0FESU5HUyAyCi0jZGVmaW5lIEJNUF9MT0FERUQgICAzCisjZGVmaW5lIEJNUF9MT0FERUQgICAyCiAJd2FpdF9xdWV1ZV9oZWFkX3QJYm1wcTsKIAogCkBAIC0yNTUsMTIgKzI1NCwxMiBAQAogfTsKIAogCi1leHRlcm4gdm9pZCBDaGFuZ2VQSURzKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTE2IHZwaWQsIHUxNiBhcGlkLCB1MTYgdHRwaWQsCitleHRlcm4gaW50IENoYW5nZVBJRHMoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgdnBpZCwgdTE2IGFwaWQsIHUxNiB0dHBpZCwKIAkJICAgICAgIHUxNiBzdWJwaWQsIHUxNiBwY3JwaWQpOwogCiBleHRlcm4gdm9pZCBhdjcxMTBfcmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpOwogZXh0ZXJuIHZvaWQgYXY3MTEwX3VucmVnaXN0ZXJfaXJjX2hhbmRsZXIodm9pZCAoKmZ1bmMpKHUzMikpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX3NldHVwX2lyY19jb25maWcgKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGlyX2NvbmZpZyk7CitleHRlcm4gaW50IGF2NzExMF9zZXR1cF9pcmNfY29uZmlnIChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBpcl9jb25maWcpOwogCiBleHRlcm4gaW50IGF2NzExMF9pcl9pbml0ICh2b2lkKTsKIGV4dGVybiB2b2lkIGF2NzExMF9pcl9leGl0ICh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKaW5kZXggY2NmOTQ2MS4uMDY5NmE1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2F2LmMKQEAgLTEyMSw2ICsxMjEsNyBAQAogaW50IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYsCiAJCQkgICBzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCiB7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CiAKIAlkcHJpbnRrKDIsICJhdjcxMTA6JXAsICwgZHZiX2RlbXV4X2ZlZWQ6JXBcbiIsIGF2NzExMCwgZHZiZG14ZmVlZCk7CkBAIC0xMzcsNyArMTM4LDcgQEAKIAkJCQkgICAgICAgZHZiZG14LT5wZXNmaWx0ZXJbMF0tPnBpZCwKIAkJCQkgICAgICAgZHZiX2ZpbHRlcl9wZXMydHNfY2IsCiAJCQkJICAgICAgICh2b2lkICopIGR2YmRteC0+cGVzZmlsdGVyWzBdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUmVjb3JkLCAyLCBBdWRpb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQXVkaW9QRVMsIDApOwogCQlicmVhazsKIAogCWNhc2UgUlBfVklERU86CkBAIC0xNDUsNyArMTQ2LDcgQEAKIAkJCQkgICAgICAgZHZiZG14LT5wZXNmaWx0ZXJbMV0tPnBpZCwKIAkJCQkgICAgICAgZHZiX2ZpbHRlcl9wZXMydHNfY2IsCiAJCQkJICAgICAgICh2b2lkICopIGR2YmRteC0+cGVzZmlsdGVyWzFdKTsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUmVjb3JkLCAyLCBWaWRlb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgVmlkZW9QRVMsIDApOwogCQlicmVhazsKIAogCWNhc2UgUlBfQVY6CkBAIC0xNTcsMTQgKzE1OCwxNSBAQAogCQkJCSAgICAgICBkdmJkbXgtPnBlc2ZpbHRlclsxXS0+cGlkLAogCQkJCSAgICAgICBkdmJfZmlsdGVyX3BlczJ0c19jYiwKIAkJCQkgICAgICAgKHZvaWQgKikgZHZiZG14LT5wZXNmaWx0ZXJbMV0pOwotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIEFWX1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQVZfUEVTLCAwKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIGludCBhdjcxMTBfYXZfc3RhcnRfcGxheShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBhdikKIHsKKwlpbnQgcmV0ID0gMDsKIAlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKIAogCWlmIChhdjcxMTAtPnJlY19tb2RlKQpAQCAtMTgyLDU0ICsxODQsNTcgQEAKIAlhdjcxMTAtPnBsYXlpbmcgfD0gYXY7CiAJc3dpdGNoIChhdjcxMTAtPnBsYXlpbmcpIHsKIAljYXNlIFJQX0FVRElPOgotCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QbGF5LCAyLCBBdWRpb1BFUywgMCk7CisJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBSUF9WSURFTzoKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOworCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19QbGF5LCAyLCBWaWRlb1BFUywgMCk7CiAJCWF2NzExMC0+c2luZm8gPSAwOwogCQlicmVhazsKIAljYXNlIFJQX0FWOgogCQlhdjcxMTAtPnNpbmZvID0gMDsKLQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKKwkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybiBhdjcxMTAtPnBsYXlpbmc7CisJaWYgKCFyZXQpCisJCXJldCA9IGF2NzExMC0+cGxheWluZzsKKwlyZXR1cm4gcmV0OwogfQogCi12b2lkIGF2NzExMF9hdl9zdG9wKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KQoraW50IGF2NzExMF9hdl9zdG9wKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KQogeworCWludCByZXQgPSAwOwogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCiAJaWYgKCEoYXY3MTEwLT5wbGF5aW5nICYgYXYpICYmICEoYXY3MTEwLT5yZWNfbW9kZSAmIGF2KSkKLQkJcmV0dXJuOwotCisJCXJldHVybiAwOwogCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1N0b3AsIDApOwogCWlmIChhdjcxMTAtPnBsYXlpbmcpIHsKIAkJYXY3MTEwLT5wbGF5aW5nICY9IH5hdjsKIAkJc3dpdGNoIChhdjcxMTAtPnBsYXlpbmcpIHsKIAkJY2FzZSBSUF9BVURJTzoKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BsYXksIDIsIEF1ZGlvUEVTLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIFJQX1ZJREVPOgotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fUGxheSwgMiwgVmlkZW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfTk9ORToKLQkJCWF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIGF2NzExMC0+dmlkbW9kZSk7CisJCQlyZXQgPSBhdjcxMTBfc2V0X3ZpZG1vZGUoYXY3MTEwLCBhdjcxMTAtPnZpZG1vZGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgewogCQlhdjcxMTAtPnJlY19tb2RlICY9IH5hdjsKIAkJc3dpdGNoIChhdjcxMTAtPnJlY19tb2RlKSB7CiAJCWNhc2UgUlBfQVVESU86Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIEF1ZGlvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgQXVkaW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfVklERU86Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19SZWNvcmQsIDIsIFZpZGVvUEVTLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1JlY29yZCwgMiwgVmlkZW9QRVMsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgUlBfTk9ORToKIAkJCWJyZWFrOwogCQl9CiAJfQorCXJldHVybiByZXQ7CiB9CiAKIApAQCAtMzE3LDE5ICszMjIsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBhdjcxMTBfc2V0X3ZpZG1vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKK2ludCBhdjcxMTBfc2V0X3ZpZG1vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKIHsKKwlpbnQgcmV0OwogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCi0JYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfRU5DT0RFUiwgTG9hZFZpZENvZGUsIDEsIG1vZGUpOworCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIExvYWRWaWRDb2RlLCAxLCBtb2RlKTsKIAotCWlmICghYXY3MTEwLT5wbGF5aW5nKSB7Ci0JCUNoYW5nZVBJRHMoYXY3MTEwLCBhdjcxMTAtPnBpZHNbRE1YX1BFU19WSURFT10sCisJaWYgKCFyZXQgJiYgIWF2NzExMC0+cGxheWluZykgeworCQlyZXQgPSBDaGFuZ2VQSURzKGF2NzExMCwgYXY3MTEwLT5waWRzW0RNWF9QRVNfVklERU9dLAogCQkJICAgYXY3MTEwLT5waWRzW0RNWF9QRVNfQVVESU9dLAogCQkJICAgYXY3MTEwLT5waWRzW0RNWF9QRVNfVEVMRVRFWFRdLAogCQkJICAgMCwgYXY3MTEwLT5waWRzW0RNWF9QRVNfUENSXSk7Ci0JCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1BJREZJTFRFUiwgU2NhbiwgMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUElERklMVEVSLCBTY2FuLCAwKTsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogCkBAIC0zNDAsMTcgKzM0OCwxOCBAQAogCVZJREVPX01PREVfUEFMLCBWSURFT19NT0RFX1BBTCwgVklERU9fTU9ERV9QQUwsIFZJREVPX01PREVfUEFMLAogfTsKIAotc3RhdGljIHZvaWQgZ2V0X3ZpZGVvX2Zvcm1hdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4ICpidWYsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgZ2V0X3ZpZGVvX2Zvcm1hdChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4ICpidWYsIGludCBjb3VudCkKIHsKIAlpbnQgaTsKIAlpbnQgaHNpemUsIHZzaXplOwogCWludCBzdzsKIAl1OCAqcDsKKwlpbnQgcmV0ID0gMDsKIAogCWRwcmludGsoMiwgImF2NzExMDolcCwgXG4iLCBhdjcxMTApOwogCiAJaWYgKGF2NzExMC0+c2luZm8pCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJZm9yIChpID0gNzsgaSA8IGNvdW50IC0gMTA7IGkrKykgewogCQlwID0gYnVmICsgaTsKIAkJaWYgKHBbMF0gfHwgcFsxXSB8fCBwWzJdICE9IDB4MDEgfHwgcFszXSAhPSAweGIzKQpAQCAtMzU5LDExICszNjgsMTQgQEAKIAkJaHNpemUgPSAoKHBbMV0gJjB4RjApID4+IDQpIHwgKHBbMF0gPDwgNCk7CiAJCXZzaXplID0gKChwWzFdICYweDBGKSA8PCA4KSB8IChwWzJdKTsKIAkJc3cgPSAocFszXSAmIDB4MEYpOwotCQlhdjcxMTBfc2V0X3ZpZG1vZGUoYXY3MTEwLCBzdzJtb2RlW3N3XSk7Ci0JCWRwcmludGsoMiwgInBsYXliYWNrICVkeCVkIGZyPSVkXG4iLCBoc2l6ZSwgdnNpemUsIHN3KTsKLQkJYXY3MTEwLT5zaW5mbyA9IDE7CisJCXJldCA9IGF2NzExMF9zZXRfdmlkbW9kZShhdjcxMTAsIHN3Mm1vZGVbc3ddKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWRwcmludGsoMiwgInBsYXliYWNrICVkeCVkIGZyPSVkXG4iLCBoc2l6ZSwgdnNpemUsIHN3KTsKKwkJCWF2NzExMC0+c2luZm8gPSAxOworCQl9CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTk3NCw3ICs5ODYsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldCA9IDA7CiAKLQlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKKwlkcHJpbnRrKDEsICJhdjcxMTA6JXAsIGNtZD0lMDR4XG4iLCBhdjcxMTAsY21kKTsKIAogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpIHsKIAkJaWYgKCBjbWQgIT0gVklERU9fR0VUX1NUQVRVUyAmJiBjbWQgIT0gVklERU9fR0VUX0VWRU5UICYmCkBAIC05ODcsNDkgKzk5OSw1NyBAQAogCWNhc2UgVklERU9fU1RPUDoKIAkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19TVE9QUEVEOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gVklERU9fU09VUkNFX01FTU9SWSkKLQkJCWF2NzExMF9hdl9zdG9wKGF2NzExMCwgUlBfVklERU8pOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBSUF9WSURFTyk7CiAJCWVsc2UKLQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TVE9QLAorCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsCiAJCQkgICAgICAgYXY3MTEwLT52aWRlb3N0YXRlLnZpZGVvX2JsYW5rID8gMCA6IDEpOwotCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX05PTkU7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlicmVhazsKIAogCWNhc2UgVklERU9fUExBWToKIAkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOwogCQlpZiAoYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPT0gVklERU9fRlJFRVpFRCkgewogCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKIAkJfQogCiAJCWlmIChhdjcxMTAtPnZpZGVvc3RhdGUuc3RyZWFtX3NvdXJjZSA9PSBWSURFT19TT1VSQ0VfTUVNT1JZKSB7CiAJCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKSB7Ci0JCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fU3RvcCwgMCk7CisJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fU3RvcCwgMCk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CiAJCQkJYXY3MTEwLT5wbGF5aW5nICY9IH5SUF9WSURFTzsKIAkJCX0KLQkJCWF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOwotCQl9IGVsc2UgewotCQkJLy9hdjcxMTBfYXZfc3RvcChhdjcxMTAsIFJQX1ZJREVPKTsKLQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJCXJldCA9IGF2NzExMF9hdl9zdGFydF9wbGF5KGF2NzExMCwgUlBfVklERU8pOwogCQl9Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOwogCQlicmVhazsKIAogCWNhc2UgVklERU9fRlJFRVpFOgogCQlhdjcxMTAtPnZpZGVvc3RhdGUucGxheV9zdGF0ZSA9IFZJREVPX0ZSRUVaRUQ7CiAJCWlmIChhdjcxMTAtPnBsYXlpbmcgJiBSUF9WSURFTykKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BhdXNlLCAwKTsKKwkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1BhdXNlLCAwKTsKIAkJZWxzZQotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZSRUVaRSwgMSk7Ci0JCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfRlJFRVpFOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZSRUVaRSwgMSk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19GUkVFWkU7CiAJCWJyZWFrOwogCiAJY2FzZSBWSURFT19DT05USU5VRToKIAkJaWYgKGF2NzExMC0+cGxheWluZyAmIFJQX1ZJREVPKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOwotCQl2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKLQkJYXY3MTEwLT50cmlja21vZGUgPSBUUklDS19OT05FOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksIF9fQ29udGludWUsIDApOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9QTEFZLCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfTk9ORTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklERU9fU0VMRUNUX1NPVVJDRToKQEAgLTEwNDUsNyArMTA2NSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBWSURFT19HRVRfRVZFTlQ6Ci0JCXJldD1kdmJfdmlkZW9fZ2V0X2V2ZW50KGF2NzExMCwgcGFyZywgZmlsZS0+Zl9mbGFncyk7CisJCXJldCA9IGR2Yl92aWRlb19nZXRfZXZlbnQoYXY3MTEwLCBwYXJnLCBmaWxlLT5mX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJREVPX0dFVF9TSVpFOgpAQCAtMTEwNSwyNSArMTEyNSwzMiBAQAogCWNhc2UgVklERU9fRkFTVF9GT1JXQVJEOgogCQkvL25vdGU6IGFyZyBpcyBpZ25vcmVkIGJ5IGZpcm13YXJlCiAJCWlmIChhdjcxMTAtPnBsYXlpbmcgJiBSUF9WSURFTykKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAotCQkJCSAgICAgIF9fU2Nhbl9JLCAyLCBBVl9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCSAgICBfX1NjYW5fSSwgMiwgQVZfUEVTLCAwKTsKIAkJZWxzZQotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZGV0QsIGFyZyk7Ci0JCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfRkFTVDsKLQkJYXY3MTEwLT52aWRlb3N0YXRlLnBsYXlfc3RhdGUgPSBWSURFT19QTEFZSU5HOworCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX0ZGV0QsIGFyZyk7CisJCWlmICghcmV0KSB7CisJCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX0ZBU1Q7CisJCQlhdjcxMTAtPnZpZGVvc3RhdGUucGxheV9zdGF0ZSA9IFZJREVPX1BMQVlJTkc7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIFZJREVPX1NMT1dNT1RJT046CiAJCWlmIChhdjcxMTAtPnBsYXlpbmcmUlBfVklERU8pIHsKLQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLCBfX1Nsb3csIDIsIDAsIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwgX19TbG93LCAyLCAwLCAwKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQl9IGVsc2UgewotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1BMQVksIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDApOwotCQkJdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NMT1csIGFyZyk7CisJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfUExBWSwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSB2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU0xPVywgYXJnKTsKIAkJfQotCQlhdjcxMTAtPnRyaWNrbW9kZSA9IFRSSUNLX1NMT1c7Ci0JCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJaWYgKCFyZXQpIHsKKwkJCWF2NzExMC0+dHJpY2ttb2RlID0gVFJJQ0tfU0xPVzsKKwkJCWF2NzExMC0+dmlkZW9zdGF0ZS5wbGF5X3N0YXRlID0gVklERU9fUExBWUlORzsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgVklERU9fR0VUX0NBUEFCSUxJVElFUzoKQEAgLTExMzYsMTggKzExNjMsMjEgQEAKIAkJYXY3MTEwX2lwYWNrX3Jlc2V0KCZhdjcxMTAtPmlwYWNrWzFdKTsKIAogCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKSB7Ci0JCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKLQkJCQkgICAgICBfX1BsYXksIDIsIEFWX1BFUywgMCk7CisJCQlyZXQgPSBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKKwkJCQkJICAgIF9fUGxheSwgMiwgQVZfUEVTLCAwKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CiAJCQlpZiAoYXY3MTEwLT50cmlja21vZGUgPT0gVFJJQ0tfRkFTVCkKLQkJCQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9SRUNfUExBWSwKLQkJCQkJICAgICAgX19TY2FuX0ksIDIsIEFWX1BFUywgMCk7CisJCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCQkgICAgX19TY2FuX0ksIDIsIEFWX1BFUywgMCk7CiAJCQlpZiAoYXY3MTEwLT50cmlja21vZGUgPT0gVFJJQ0tfU0xPVykgewotCQkJCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAotCQkJCQkgICAgICBfX1Nsb3csIDIsIDAsIDApOwotCQkJCXZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOworCQkJCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX1JFQ19QTEFZLAorCQkJCQkJICAgIF9fU2xvdywgMiwgMCwgMCk7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IHZpZGNvbShhdjcxMTAsIFZJREVPX0NNRF9TTE9XLCBhcmcpOwogCQkJfQogCQkJaWYgKGF2NzExMC0+dHJpY2ttb2RlID09IFRSSUNLX0ZSRUVaRSkKLQkJCQl2aWRjb20oYXY3MTEwLCBWSURFT19DTURfU1RPUCwgMSk7CisJCQkJcmV0ID0gdmlkY29tKGF2NzExMCwgVklERU9fQ01EX1NUT1AsIDEpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMTcwLDcgKzEyMDAsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpIHBhcmc7CiAJaW50IHJldCA9IDA7CiAKLQlkcHJpbnRrKDIsICJhdjcxMTA6JXAsIFxuIiwgYXY3MTEwKTsKKwlkcHJpbnRrKDEsICJhdjcxMTA6JXAsIGNtZD0lMDR4XG4iLCBhdjcxMTAsY21kKTsKIAogCWlmICgoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKSAmJgogCSAgICAoY21kICE9IEFVRElPX0dFVF9TVEFUVVMpKQpAQCAtMTE3OSwyOCArMTIwOSwzMiBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBBVURJT19TVE9QOgogCQlpZiAoYXY3MTEwLT5hdWRpb3N0YXRlLnN0cmVhbV9zb3VyY2UgPT0gQVVESU9fU09VUkNFX01FTU9SWSkKLQkJCWF2NzExMF9hdl9zdG9wKGF2NzExMCwgUlBfQVVESU8pOworCQkJcmV0ID0gYXY3MTEwX2F2X3N0b3AoYXY3MTEwLCBSUF9BVURJTyk7CiAJCWVsc2UKLQkJCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NVVRFKTsKLQkJYXY3MTEwLT5hdWRpb3N0YXRlLnBsYXlfc3RhdGUgPSBBVURJT19TVE9QUEVEOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOworCQlpZiAoIXJldCkKKwkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fU1RPUFBFRDsKIAkJYnJlYWs7CiAKIAljYXNlIEFVRElPX1BMQVk6CiAJCWlmIChhdjcxMTAtPmF1ZGlvc3RhdGUuc3RyZWFtX3NvdXJjZSA9PSBBVURJT19TT1VSQ0VfTUVNT1JZKQotCQkJYXY3MTEwX2F2X3N0YXJ0X3BsYXkoYXY3MTEwLCBSUF9BVURJTyk7Ci0JCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9VTk1VVEUpOwotCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BMQVlJTkc7CisJCQlyZXQgPSBhdjcxMTBfYXZfc3RhcnRfcGxheShhdjcxMTAsIFJQX0FVRElPKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBhdWRjb20oYXY3MTEwLCBBVURJT19DTURfVU5NVVRFKTsKKwkJaWYgKCFyZXQpCisJCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BMQVlJTkc7CiAJCWJyZWFrOwogCiAJY2FzZSBBVURJT19QQVVTRToKLQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOwotCQlhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9IEFVRElPX1BBVVNFRDsKKwkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01VVEUpOworCQlpZiAoIXJldCkKKwkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fUEFVU0VEOwogCQlicmVhazsKIAogCWNhc2UgQVVESU9fQ09OVElOVUU6CiAJCWlmIChhdjcxMTAtPmF1ZGlvc3RhdGUucGxheV9zdGF0ZSA9PSBBVURJT19QQVVTRUQpIHsKIAkJCWF2NzExMC0+YXVkaW9zdGF0ZS5wbGF5X3N0YXRlID0gQVVESU9fUExBWUlORzsKLQkJCWF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9NVVRFIHwgQVVESU9fQ01EX1BDTTE2KTsKKwkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9VTk1VVEUgfCBBVURJT19DTURfUENNMTYpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xMjEwLDE0ICsxMjQ0LDE1IEBACiAKIAljYXNlIEFVRElPX1NFVF9NVVRFOgogCXsKLQkJYXVkY29tKGF2NzExMCwgYXJnID8gQVVESU9fQ01EX01VVEUgOiBBVURJT19DTURfVU5NVVRFKTsKLQkJYXY3MTEwLT5hdWRpb3N0YXRlLm11dGVfc3RhdGUgPSAoaW50KSBhcmc7CisJCXJldCA9IGF1ZGNvbShhdjcxMTAsIGFyZyA/IEFVRElPX0NNRF9NVVRFIDogQVVESU9fQ01EX1VOTVVURSk7CisJCWlmICghcmV0KQorCQkJYXY3MTEwLT5hdWRpb3N0YXRlLm11dGVfc3RhdGUgPSAoaW50KSBhcmc7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgQVVESU9fU0VUX0FWX1NZTkM6CiAJCWF2NzExMC0+YXVkaW9zdGF0ZS5BVl9zeW5jX3N0YXRlID0gKGludCkgYXJnOwotCQlhdWRjb20oYXY3MTEwLCBhcmcgPyBBVURJT19DTURfU1lOQ19PTiA6IEFVRElPX0NNRF9TWU5DX09GRik7CisJCXJldCA9IGF1ZGNvbShhdjcxMTAsIGFyZyA/IEFVRElPX0NNRF9TWU5DX09OIDogQVVESU9fQ01EX1NZTkNfT0ZGKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFVRElPX1NFVF9CWVBBU1NfTU9ERToKQEAgLTEyMjksMjEgKzEyNjQsMjQgQEAKIAogCQlzd2l0Y2goYXY3MTEwLT5hdWRpb3N0YXRlLmNoYW5uZWxfc2VsZWN0KSB7CiAJCWNhc2UgQVVESU9fU1RFUkVPOgotCQkJYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX1NURVJFTyk7Ci0JCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKLQkJCQlpMmNfd3JpdGVyZWcoYXY3MTEwLCAweDIwLCAweDAyLCAweDQ5KTsKKwkJCXJldCA9IGF1ZGNvbShhdjcxMTAsIEFVRElPX0NNRF9TVEVSRU8pOworCQkJaWYgKCFyZXQpCisJCQkJaWYgKGF2NzExMC0+YWRhY190eXBlID09IERWQl9BREFDX0NSWVNUQUwpCisJCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDkpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBVURJT19NT05PX0xFRlQ6Ci0JCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19MKTsKLQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQotCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NGEpOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fTCk7CisJCQlpZiAoIXJldCkKKwkJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMiwgMHg0YSk7CiAJCQlicmVhazsKIAogCQljYXNlIEFVRElPX01PTk9fUklHSFQ6Ci0JCQlhdWRjb20oYXY3MTEwLCBBVURJT19DTURfTU9OT19SKTsKLQkJCWlmIChhdjcxMTAtPmFkYWNfdHlwZSA9PSBEVkJfQURBQ19DUllTVEFMKQotCQkJCWkyY193cml0ZXJlZyhhdjcxMTAsIDB4MjAsIDB4MDIsIDB4NDUpOworCQkJcmV0ID0gYXVkY29tKGF2NzExMCwgQVVESU9fQ01EX01PTk9fUik7CisJCQlpZiAoIXJldCkKKwkJCQlpZiAoYXY3MTEwLT5hZGFjX3R5cGUgPT0gRFZCX0FEQUNfQ1JZU1RBTCkKKwkJCQkJaTJjX3dyaXRlcmVnKGF2NzExMCwgMHgyMCwgMHgwMiwgMHg0NSk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgpAQCAtMTI2NCw4ICsxMzAyLDggQEAKIAkJZHZiX3JpbmdidWZmZXJfZmx1c2hfc3BpbmxvY2tfd2FrZXVwKCZhdjcxMTAtPmFvdXQpOwogCQlhdjcxMTBfaXBhY2tfcmVzZXQoJmF2NzExMC0+aXBhY2tbMF0pOwogCQlpZiAoYXY3MTEwLT5wbGF5aW5nID09IFJQX0FWKQotCQkJYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCi0JCQkgICAgICAgX19QbGF5LCAyLCBBVl9QRVMsIDApOworCQkJcmV0ID0gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfUkVDX1BMQVksCisJCQkJCSAgICBfX1BsYXksIDIsIEFWX1BFUywgMCk7CiAJCWJyZWFrOwogCWNhc2UgQVVESU9fU0VUX0lEOgogCkBAIC0xMjc0LDcgKzEzMTIsNyBAQAogCXsKIAkJc3RydWN0IGF1ZGlvX21peGVyICphbWl4ID0gKHN0cnVjdCBhdWRpb19taXhlciAqKXBhcmc7CiAKLQkJYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhbWl4LT52b2x1bWVfbGVmdCwgYW1peC0+dm9sdW1lX3JpZ2h0KTsKKwkJcmV0ID0gYXY3MTEwX3NldF92b2x1bWUoYXY3MTEwLCBhbWl4LT52b2x1bWVfbGVmdCwgYW1peC0+dm9sdW1lX3JpZ2h0KTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgQVVESU9fU0VUX1NUUkVBTVRZUEU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfYXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCmluZGV4IGNjNWU3YTcuLjQ1ZGMxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9hdi5oCkBAIC0zLDE0ICszLDE0IEBACiAKIHN0cnVjdCBhdjcxMTA7CiAKLWV4dGVybiB2b2lkIGF2NzExMF9zZXRfdmlkbW9kZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBtb2RlKTsKK2V4dGVybiBpbnQgYXY3MTEwX3NldF92aWRtb2RlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IG1vZGUpOwogCiBleHRlcm4gaW50IGF2NzExMF9yZWNvcmRfY2Ioc3RydWN0IGR2Yl9maWx0ZXJfcGVzMnRzICpwMnQsIHU4ICpidWYsIHNpemVfdCBsZW4pOwogZXh0ZXJuIGludCBhdjcxMTBfcGVzX3BsYXkodm9pZCAqZGVzdCwgc3RydWN0IGR2Yl9yaW5nYnVmZmVyICpidWYsIGludCBkbGVuKTsKIGV4dGVybiBpbnQgYXY3MTEwX3dyaXRlX3RvX2RlY29kZXIoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpmZWVkLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKTsKIAogZXh0ZXJuIGludCBhdjcxMTBfc2V0X3ZvbHVtZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCB2b2xsZWZ0LCBpbnQgdm9scmlnaHQpOwotZXh0ZXJuIHZvaWQgYXY3MTEwX2F2X3N0b3Aoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYpOworZXh0ZXJuIGludCBhdjcxMTBfYXZfc3RvcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBhdik7CiBleHRlcm4gaW50IGF2NzExMF9hdl9zdGFydF9yZWNvcmQoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgYXYsCiAJCQkgIHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCk7CiBleHRlcm4gaW50IGF2NzExMF9hdl9zdGFydF9wbGF5KHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgaW50IGF2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKaW5kZXggN2ZhNGEwZS4uMTIyMDgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCXVkZWxheSg1KTsKIAl9Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRVRJTUVET1VUOwogfQogCiBzdGF0aWMgaW50IGxvYWRfZHJhbShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiAqZGF0YSwgaW50IGxlbikKQEAgLTE1NSw3ICsxNTUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBibG9ja3M7IGkrKykgewogCQlpZiAod2FpdGRlYmkoYXY3MTEwLCBCT09UX1NUQVRFLCBCT09UU1RBVEVfQlVGRkVSX0VNUFRZKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBsb2FkX2RyYW0oKTogdGltZW91dCBhdCBibG9jayAlZFxuIiwgaSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQogCQlkcHJpbnRrKDQsICJ3cml0aW5nIERSQU0gYmxvY2sgJWRcbiIsIGkpOwogCQltd2RlYmkoYXY3MTEwLCBERUJJU1dBQiwgYm9vdGJsb2NrLApAQCAtMTcwLDcgKzE3MCw3IEBACiAJaWYgKHJlc3QgPiAwKSB7CiAJCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGxvYWRfZHJhbSgpOiB0aW1lb3V0IGF0IGxhc3QgYmxvY2tcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJaWYgKHJlc3QgPiA0KQogCQkJbXdkZWJpKGF2NzExMCwgREVCSVNXQUIsIGJvb3RibG9jaywKQEAgLTE4NSwxMyArMTg1LDEzIEBACiAJfQogCWlmICh3YWl0ZGViaShhdjcxMTAsIEJPT1RfU1RBVEUsIEJPT1RTVEFURV9CVUZGRVJfRU1QVFkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogbG9hZF9kcmFtKCk6IHRpbWVvdXQgYWZ0ZXIgbGFzdCBibG9ja1xuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCWl3ZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJPT1RfU0laRSwgMCwgMik7CiAJaXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQk9PVF9TVEFURSwgQk9PVFNUQVRFX0JVRkZFUl9GVUxMLCAyKTsKIAlpZiAod2FpdGRlYmkoYXY3MTEwLCBCT09UX1NUQVRFLCBCT09UU1RBVEVfQk9PVF9DT01QTEVURSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBsb2FkX2RyYW0oKTogZmluYWwgaGFuZHNoYWtlIHRpbWVvdXRcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRVRJTUVET1VUOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI2Myw3ICsyNjMsNyBAQAogCWlmIChzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZShhdjcxMTAtPmRldiwgMSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9ib290YXJtKCk6ICIKIAkJICAgICAgICJzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZSgpIHRpbWVkIG91dFxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJbWRlbGF5KDEpOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJaWYgKHNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKGF2NzExMC0+ZGV2LCAxKSkgewogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYXY3MTEwX2Jvb3Rhcm0oKTogIgogCQkgICAgICAgInNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKCkgdGltZWQgb3V0IGFmdGVyIGxvYWRpbmcgRFJBTVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIFJFU0VUX0xJTkUsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAJbXNsZWVwKDMwKTsJLyogdGhlIGZpcm13YXJlIG5lZWRzIHNvbWUgdGltZSB0byBpbml0aWFsaXplICovCkBAIC0zMDgsNiArMzA4LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXUzMiBzdGF0OworCWludCBlcnI7CiAKIAlpZiAoRldfVkVSU0lPTihhdjcxMTAtPmFybV9hcHApIDw9IDB4MjYxYykgewogCQkvKiBub3Qgc3VwcG9ydGVkIGJ5IG9sZCBmaXJtd2FyZSAqLwpAQCAtMzE4LDE3ICszMTksMTcgQEAKIAkvKiBuZXcgZmlybXdhcmUgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJZm9yICg7OykgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfRlJFRSk7CiAJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+ZGNvbWxvY2spKQogCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAkJc3RhdCA9IHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgTVNHU1RBVEUsIDAsIDIpOwogCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCWlmICgoc3RhdCAmIGZsYWdzKSA9PSAwKSB7CisJCWlmICgoc3RhdCAmIGZsYWdzKSA9PSAwKQogCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgeworCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIE1TR1NUQVRFICUwNHhcbiIsCiAJCQkJX19GVU5DVElPTl9fLCBzdGF0ICYgZmxhZ3MpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KIAkJbXNsZWVwKDEpOwogCX0KQEAgLTM0Miw2ICszNDMsNyBAQAogCWNoYXIgKnR5cGUgPSBOVUxMOwogCXUxNiBmbGFnc1syXSA9IHswLCAwfTsKIAl1MzIgc3RhdDsKKwlpbnQgZXJyOwogCiAvLwlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIApAQCAtMzUxLDI0ICszNTMsMzAgQEAKIAl9CiAKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIGlkbGVcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogCiAJd2RlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01fSUZfTE9DSywgMHhmZmZmLCAyKTsKIAogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgSEFORFNIQUtFX1JFRywgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSkpIHsKKwl3aGlsZSAoMSkgeworCQllcnIgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfU0hBS0UpOworCQlpZiAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBIQU5EU0hBS0VfUkVHLCAwLCAyKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChlcnIpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiAlcygpOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEhBTkRTSEFLRV9SRUdcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogI2VuZGlmCiAKQEAgLTQwMSw2ICs0MDksNyBAQAogCQkvKiBub24taW1tZWRpYXRlIENPTU1BTkQgdHlwZSAqLwogCQlzdGFydCA9IGppZmZpZXM7CiAJCWZvciAoOzspIHsKKwkJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKIAkJCXN0YXQgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIE1TR1NUQVRFLCAwLCAyKTsKIAkJCWlmIChzdGF0ICYgZmxhZ3NbMF0pIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlcyBRVUVVRSBvdmVyZmxvd1xuIiwKQEAgLTQwOSwxMCArNDE4LDEwIEBACiAJCQl9CiAJCQlpZiAoKHN0YXQgJiBmbGFnc1sxXSkgPT0gMCkKIAkJCQlicmVhazsKLQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfRlJFRSkpIHsKKwkJCWlmIChlcnIpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgb24gYnVzeSAlcyBRVUVVRVxuIiwKIAkJCQkJX19GVU5DVElPTl9fLCB0eXBlKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCQl9CiAJCQltc2xlZXAoMSk7CiAJCX0KQEAgLTQzMiwxMyArNDQxLDE2IEBACiAKICNpZmRlZiBDT01fREVCVUcKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMiApKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IHRpbWVvdXQgd2FpdGluZyBmb3IgQ09NTUFORCB0byBjb21wbGV0ZVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXMoKTogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EICVkIHRvIGNvbXBsZXRlXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgKGJ1ZlswXSA+PiA4KSAmIDB4ZmYpOwogCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KKwkJbXNsZWVwKDEpOwogCX0KIAogCXN0YXQgPSByZGViaShhdjcxMTAsIERFQklOT1NXQVAsIE1TR1NUQVRFLCAwLCAyKTsKQEAgLTQ3MCw3ICs0ODIsNyBAQAogCiAJcmV0ID0gX19hdjcxMTBfc2VuZF9md19jbWQoYXY3MTEwLCBidWYsIGxlbmd0aCk7CiAJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQhPS1FUkVTVEFSVFNZUykKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IGF2NzExMF9zZW5kX2Z3X2NtZCBlcnJvciAlZFxuIiwKIAkJICAgICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDk1LDcgKzUwNyw3IEBACiAJfQogCiAJcmV0ID0gYXY3MTEwX3NlbmRfZndfY21kKGF2NzExMCwgYnVmLCBudW0gKyAyKTsKLQlpZiAocmV0KQorCWlmIChyZXQgJiYgcmV0ICE9IC1FUkVTVEFSVFNZUykKIAkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6IGF2NzExMF9md19jbWQgZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUxOCw3ICs1MzAsNyBAQAogCX0KIAogCXJldCA9IGF2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGNtZCwgMTgpOwotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQgIT0gLUVSRVNUQVJUU1lTKQogCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogYXY3MTEwX3NlbmRfY2lfY21kIGVycm9yICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC01NTEsMjYgKzU2MywzMiBAQAogCX0KIAogCXN0YXJ0ID0gamlmZmllczsKLQl3aGlsZSAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBDT01NQU5ELCAwLCAyKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQ09NTUFORCwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIENPTU1BTkQgdG8gY29tcGxldGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQogI2lmZGVmIF9OT0hBTkRTSEFLRQogCQltc2xlZXAoMSk7CiAjZW5kaWYKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9GUkVFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBDT01NQU5EIHRvIGNvbXBsZXRlXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCQkJcmV0dXJuIC0xOwotCQl9CiAJfQogCiAjaWZuZGVmIF9OT0hBTkRTSEFLRQogCXN0YXJ0ID0gamlmZmllczsKLQl3aGlsZSAocmRlYmkoYXY3MTEwLCBERUJJTk9TV0FQLCBIQU5EU0hBS0VfUkVHLCAwLCAyICkpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX1NIQUtFKSkgeworCXdoaWxlICgxKSB7CisJCWVyciA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEhBTkRTSEFLRV9SRUcsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdGltZW91dCB3YWl0aW5nIGZvciBIQU5EU0hBS0VfUkVHXG4iLCBfX0ZVTkNUSU9OX18pOwogCQkJdXAoJmF2NzExMC0+ZGNvbWxvY2spOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCX0KKwkJbXNsZWVwKDEpOwogCX0KICNlbmRpZgogCkBAIC02NjcsMTAgKzY4NSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJYnVmW2kgKyA0XSA9IG1zZ1tpXTsKIAotCWlmICgocmV0ID0gYXY3MTEwX3NlbmRfZndfY21kKGF2NzExMCwgYnVmLCAxOCkpKQorCXJldCA9IGF2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGJ1ZiwgMTgpOworCWlmIChyZXQgJiYgcmV0IT0tRVJFU1RBUlRTWVMpCiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBhdjcxMTBfZGlzZXFjX3NlbmQgZXJyb3IgJWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAKQEAgLTcwNSwxOCArNzIzLDIyIEBACiBzdGF0aWMgaW50IEZsdXNoVGV4dChzdHJ1Y3QgYXY3MTEwICphdjcxMTApCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXY3MTEwLT5kY29tbG9jaykpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAJc3RhcnQgPSBqaWZmaWVzOwotCXdoaWxlIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJVRkYxX0JBU0UsIDAsIDIpKSB7Ci0JCW1zbGVlcCgxKTsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9PU0QpKSB7CisJd2hpbGUgKDEpIHsKKwkJZXJyID0gdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX09TRCk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEJVRkYxX0JBU0UsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzKCk6IHRpbWVvdXQgd2FpdGluZyBmb3IgQlVGRjFfQkFTRSA9PSAwXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKIAlyZXR1cm4gMDsKQEAgLTczMywyNSArNzU1LDMxIEBACiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSwgMCwgMikpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX09TRCkpIHsKKwl3aGlsZSAoMSkgeworCQlyZXQgPSB0aW1lX2FmdGVyKGppZmZpZXMsIHN0YXJ0ICsgQVJNX1dBSVRfT1NEKTsKKwkJaWYgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSwgMCwgMikgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAocmV0KSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImR2Yi10dHBjaTogJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgQlVGRjFfQkFTRSA9PSAwXG4iLAogCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CiAJCQl1cCgmYXY3MTEwLT5kY29tbG9jayk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAkJfQorCQltc2xlZXAoMSk7CiAJfQogI2lmbmRlZiBfTk9IQU5EU0hBS0UKIAlzdGFydCA9IGppZmZpZXM7Ci0Jd2hpbGUgKHJkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgSEFORFNIQUtFX1JFRywgMCwgMikpIHsKLQkJbXNsZWVwKDEpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydCArIEFSTV9XQUlUX1NIQUtFKSkgeworCXdoaWxlICgxKSB7CisJCXJldCA9IHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnQgKyBBUk1fV0FJVF9TSEFLRSk7CisJCWlmIChyZGViaShhdjcxMTAsIERFQklOT1NXQVAsIEhBTkRTSEFLRV9SRUcsIDAsIDIpID09IDApCisJCQlicmVhazsKKwkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJkdmItdHRwY2k6ICVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIEhBTkRTSEFLRV9SRUdcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fKTsKIAkJCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CisJCW1zbGVlcCgxKTsKIAl9CiAjZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC8gMjsgaSsrKQpAQCAtNzYxLDcgKzc4OSw3IEBACiAJCXdkZWJpKGF2NzExMCwgREVCSU5PU1dBUCwgQlVGRjFfQkFTRSArIGkgKiAyLCAwLCAyKTsKIAlyZXQgPSBfX2F2NzExMF9zZW5kX2Z3X2NtZChhdjcxMTAsIGNidWYsIDUpOwogCXVwKCZhdjcxMTAtPmRjb21sb2NrKTsKLQlpZiAocmV0KQorCWlmIChyZXQgJiYgcmV0IT0tRVJFU1RBUlRTWVMpCiAJCXByaW50ayhLRVJOX0VSUiAiZHZiLXR0cGNpOiBXcml0ZVRleHQgZXJyb3IgJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgxNiw5ICs4NDQsMjUgQEAKIAlPU0RfQklUTUFQMSwgT1NEX0JJVE1BUDIsIDAsIE9TRF9CSVRNQVA0LCAwLCAwLCAwLCBPU0RfQklUTUFQOAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgTG9hZEJpdG1hcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiBmb3JtYXQsCitzdGF0aWMgaW5saW5lIGludCBXYWl0VW50aWxCbXBMb2FkZWQoc3RydWN0IGF2NzExMCAqYXY3MTEwKQoreworCWludCByZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhdjcxMTAtPmJtcHEsCisJCQkJYXY3MTEwLT5ibXBfc3RhdGUgIT0gQk1QX0xPQURJTkcsIDEwKkhaKTsKKwlpZiAocmV0ID09IC1FUkVTVEFSVFNZUykKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApIHsKKwkJcHJpbnRrKCJkdmItdHRwY2k6IHdhcm5pbmc6IHRpbWVvdXQgd2FpdGluZyBpbiBMb2FkQml0bWFwOiAlZCwgJWRcbiIsCisJCSAgICAgICByZXQsIGF2NzExMC0+Ym1wX3N0YXRlKTsKKwkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBMb2FkQml0bWFwKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwKIAkJCSAgICAgdTE2IGR4LCB1MTYgZHksIGludCBpbmMsIHU4IF9fdXNlciAqIGRhdGEpCiB7CisJdTE2IGZvcm1hdDsKIAlpbnQgYnBwOwogCWludCBpOwogCWludCBkLCBkZWx0YTsKQEAgLTgyNywxNCArODcxLDcgQEAKIAogCWRwcmludGsoNCwgIiVwXG4iLCBhdjcxMTApOwogCi0JcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXY3MTEwLT5ibXBxLCBhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BRElORywgSFopOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTIHx8IHJldCA9PSAwKSB7Ci0JCXByaW50aygiZHZiLXR0cGNpOiB3YXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgaW4gTG9hZEJpdG1hcDogJWQsICVkXG4iLAotCQkgICAgICAgcmV0LCBhdjcxMTAtPmJtcF9zdGF0ZSk7Ci0JCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAtMTsKLQl9Ci0JQlVHX09OIChhdjcxMTAtPmJtcF9zdGF0ZSA9PSBCTVBfTE9BRElORyk7CisJZm9ybWF0ID0gYnBwMmJpdFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dOwogCiAJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTE9BRElORzsKIAlpZgkoZm9ybWF0ID09IE9TRF9CSVRNQVA4KSB7CkBAIC04NDcsMTggKzg4NCwxOCBAQAogCQlicHA9MTsgZGVsdGEgPSA4OwogCX0gZWxzZSB7CiAJCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWF2NzExMC0+Ym1wbGVuID0gKChkeCAqIGR5ICogYnBwICsgNykgJiB+NykgLyA4OwogCWF2NzExMC0+Ym1wcCA9IDA7CiAJaWYgKGF2NzExMC0+Ym1wbGVuID4gMzI3NjgpIHsKIAkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGR5OyBpKyspIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGF2NzExMC0+Ym1wYnVmICsgMTAyNCArIGkgKiBkeCwgZGF0YSArIGkgKiBpbmMsIGR4KSkgewogCQkJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCWlmIChmb3JtYXQgIT0gT1NEX0JJVE1BUDgpIHsKQEAgLTg3MywzNyArOTEwLDI3IEBACiAJfQogCWF2NzExMC0+Ym1wbGVuICs9IDEwMjQ7CiAJZHByaW50ayg0LCAiYXY3MTEwX2Z3X2NtZDogTG9hZEJtcCBzaXplICVkXG4iLCBhdjcxMTAtPmJtcGxlbik7Ci0JcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgTG9hZEJtcCwgMywgZm9ybWF0LCBkeCwgZHkpOworCXJldCA9IGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgTG9hZEJtcCwgMywgZm9ybWF0LCBkeCwgZHkpOworCWlmICghcmV0KQorCQlyZXQgPSBXYWl0VW50aWxCbXBMb2FkZWQoYXY3MTEwKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IEJsaXRCaXRtYXAoc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MTYgd2luLCB1MTYgeCwgdTE2IHksIHUxNiB0cmFucykKK3N0YXRpYyBpbnQgQmxpdEJpdG1hcChzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUxNiB4LCB1MTYgeSkKIHsKLQlpbnQgcmV0OwotCiAJZHByaW50ayg0LCAiJXBcbiIsIGF2NzExMCk7CiAKLQlCVUdfT04gKGF2NzExMC0+Ym1wX3N0YXRlID09IEJNUF9OT05FKTsKLQotCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGF2NzExMC0+Ym1wcSwKLQkJCQlhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BRElORywgMTAqSFopOwotCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTIHx8IHJldCA9PSAwKSB7Ci0JCXByaW50aygiZHZiLXR0cGNpOiB3YXJuaW5nOiB0aW1lb3V0IHdhaXRpbmcgaW4gQmxpdEJpdG1hcDogJWQsICVkXG4iLAotCQkgICAgICAgcmV0LCBhdjcxMTAtPmJtcF9zdGF0ZSk7Ci0JCWF2NzExMC0+Ym1wX3N0YXRlID0gQk1QX05PTkU7Ci0JCXJldHVybiAocmV0ID09IDApID8gLUVUSU1FRE9VVCA6IHJldDsKLQl9Ci0KLQlCVUdfT04gKGF2NzExMC0+Ym1wX3N0YXRlICE9IEJNUF9MT0FERUQpOwotCi0JcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgQmxpdEJtcCwgNCwgd2luLCB4LCB5LCB0cmFucyk7CisJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX09TRCwgQmxpdEJtcCwgNCwgYXY3MTEwLT5vc2R3aW4sIHgsIHksIDApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBSZWxlYXNlQml0bWFwKHN0cnVjdCBhdjcxMTAgKmF2NzExMCkKIHsKIAlkcHJpbnRrKDQsICIlcFxuIiwgYXY3MTEwKTsKIAotCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BREVEKQorCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSAhPSBCTVBfTE9BREVEICYmIEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA8IDB4MjYxZSkKIAkJcmV0dXJuIC0xOworCWlmIChhdjcxMTAtPmJtcF9zdGF0ZSA9PSBCTVBfTE9BRElORykKKwkJZHByaW50aygxLCJSZWxlYXNlQml0bWFwIGNhbGxlZCB3aGlsZSBCTVBfTE9BRElOR1xuIik7CiAJYXY3MTEwLT5ibXBfc3RhdGUgPSBCTVBfTk9ORTsKIAlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfT1NELCBSZWxlYXNlQm1wLCAwKTsKIH0KQEAgLTkyNCwxOCArOTUxLDIyIEBACiAJcmV0dXJuIENyIHwgKENiIDw8IDE2KSB8IChZIDw8IDgpOwogfQogCi1zdGF0aWMgdm9pZCBPU0RTZXRDb2xvcihzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHU4IGNvbG9yLCB1OCByLCB1OCBnLCB1OCBiLCB1OCBibGVuZCkKK3N0YXRpYyBpbnQgT1NEU2V0Q29sb3Ioc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1OCBjb2xvciwgdTggciwgdTggZywgdTggYiwgdTggYmxlbmQpCiB7CisJaW50IHJldDsKKwogCXUxNiBjaCwgY2w7CiAJdTMyIHl1djsKIAogCXl1diA9IGJsZW5kID8gUkdCMllVVihyLGcsYikgOiAwOwogCWNsID0gKHl1diAmIDB4ZmZmZik7CiAJY2ggPSAoKHl1diA+PiAxNikgJiAweGZmZmYpOwotCVNldENvbG9yXyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBicHAycGFsW2F2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXV0sCi0JCSAgY29sb3IsIGNoLCBjbCk7Ci0JU2V0QmxlbmRfKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGJwcDJwYWxbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKLQkJICBjb2xvciwgKChibGVuZCA+PiA0KSAmIDB4MGYpKTsKKwlyZXQgPSBTZXRDb2xvcl8oYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgYnBwMnBhbFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dLAorCQkJY29sb3IsIGNoLCBjbCk7CisJaWYgKCFyZXQpCisJCXJldCA9IFNldEJsZW5kXyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBicHAycGFsW2F2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXV0sCisJCQkJY29sb3IsICgoYmxlbmQgPj4gNCkgJiAweDBmKSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBPU0RTZXRQYWxldHRlKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIF9fdXNlciAqIGNvbG9ycywgdTggZmlyc3QsIHU4IGxhc3QpCkBAIC05NjgsMTQgKzk5OSwxNCBAQAogewogCXVpbnQgdywgaCwgYnBwLCBicGwsIHNpemUsIGxwYiwgYm51bSwgYnJlc3Q7CiAJaW50IGk7Ci0JaW50IHJjOworCWludCByYyxyZWxlYXNlX3JjOwogCiAJdyA9IHgxIC0geDAgKyAxOwogCWggPSB5MSAtIHkwICsgMTsKIAlpZiAoaW5jIDw9IDApCiAJCWluYyA9IHc7CiAJaWYgKHcgPD0gMCB8fCB3ID4gNzIwIHx8IGggPD0gMCB8fCBoID4gNTc2KQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCWJwcCA9IGF2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXSArIDE7CiAJYnBsID0gKCh3ICogYnBwICsgNykgJiB+NykgLyA4OwogCXNpemUgPSBoICogYnBsOwpAQCAtOTgzLDE3NiArMTAxNCwxODYgQEAKIAlibnVtID0gc2l6ZSAvIChscGIgKiBicGwpOwogCWJyZXN0ID0gc2l6ZSAtIGJudW0gKiBscGIgKiBicGw7CiAKKwlpZiAoYXY3MTEwLT5ibXBfc3RhdGUgPT0gQk1QX0xPQURJTkcpIHsKKwkJLyogcG9zc2libGUgaWYgc3lzY2FsbCBpcyByZXBlYXRlZCBieSAtRVJFU1RBUlRTWVMgYW5kIGlmIGZpcm13YXJlIGNhbm5vdCBhYm9ydCAqLworCQlCVUdfT04gKEZXX1ZFUlNJT04oYXY3MTEwLT5hcm1fYXBwKSA+PSAweDI2MWUpOworCQlyYyA9IFdhaXRVbnRpbEJtcExvYWRlZChhdjcxMTApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCS8qIGp1c3QgY29udGludWUuIFRoaXMgc2hvdWxkIHdvcmsgZm9yIGFsbCBmdyB2ZXJzaW9ucworCQkgKiBpZiBibnVtPT0xICYmICFicmVzdCAmJiBMb2FkQml0bWFwIHdhcyBzdWNjZXNzZnVsCisJCSAqLworCX0KKworCXJjID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgYm51bTsgaSsrKSB7Ci0JCXJjID0gTG9hZEJpdG1hcChhdjcxMTAsIGJwcDJiaXRbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKLQkJCSAgIHcsIGxwYiwgaW5jLCBkYXRhKTsKKwkJcmMgPSBMb2FkQml0bWFwKGF2NzExMCwgdywgbHBiLCBpbmMsIGRhdGEpOwogCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JCXJjID0gQmxpdEJpdG1hcChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCB4MCwgeTAgKyBpICogbHBiLCAwKTsKKwkJCWJyZWFrOworCQlyYyA9IEJsaXRCaXRtYXAoYXY3MTEwLCB4MCwgeTAgKyBpICogbHBiKTsKIAkJaWYgKHJjKQotCQkJcmV0dXJuIHJjOworCQkJYnJlYWs7CiAJCWRhdGEgKz0gbHBiICogaW5jOwogCX0KLQlpZiAoYnJlc3QpIHsKLQkJcmMgPSBMb2FkQml0bWFwKGF2NzExMCwgYnBwMmJpdFthdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl1dLAotCQkJICAgdywgYnJlc3QgLyBicGwsIGluYywgZGF0YSk7Ci0JCWlmIChyYykKLQkJCXJldHVybiByYzsKLQkJcmMgPSBCbGl0Qml0bWFwKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIHgwLCB5MCArIGJudW0gKiBscGIsIDApOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7CisJaWYgKCFyYyAmJiBicmVzdCkgeworCQlyYyA9IExvYWRCaXRtYXAoYXY3MTEwLCB3LCBicmVzdCAvIGJwbCwgaW5jLCBkYXRhKTsKKwkJaWYgKCFyYykKKwkJCXJjID0gQmxpdEJpdG1hcChhdjcxMTAsIHgwLCB5MCArIGJudW0gKiBscGIpOwogCX0KLQlSZWxlYXNlQml0bWFwKGF2NzExMCk7Ci0JcmV0dXJuIDA7CisJcmVsZWFzZV9yYyA9IFJlbGVhc2VCaXRtYXAoYXY3MTEwKTsKKwlpZiAoIXJjKQorCQlyYyA9IHJlbGVhc2VfcmM7CisJaWYgKHJjKQorCQlkcHJpbnRrKDEsInJldHVybnMgJWRcbiIscmMpOworCXJldHVybiByYzsKIH0KIAogaW50IGF2NzExMF9vc2RfY21kKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgb3NkX2NtZF90ICpkYykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhdjcxMTAtPm9zZF9zZW1hKTsKLQlpZiAocmV0KQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmF2NzExMC0+b3NkX3NlbWEpKQogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCi0JLyogc3R1cGlkLCBidXQgT1NEIGZ1bmN0aW9ucyBkb24ndCBwcm92aWRlIGEgcmV0dXJuIGNvZGUgYW55d2F5ICovCi0JcmV0ID0gMDsKLQogCXN3aXRjaCAoZGMtPmNtZCkgewogCWNhc2UgT1NEX0Nsb3NlOgotCQlEZXN0cm95T1NEV2luZG93KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRGVzdHJveU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfT3BlbjoKIAkJYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dID0gKGRjLT5jb2xvciAtIDEpICYgNzsKLQkJQ3JlYXRlT1NEV2luZG93KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sCisJCXJldCA9IENyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAogCQkJCWJwcDJiaXRbYXY3MTEwLT5vc2RicHBbYXY3MTEwLT5vc2R3aW5dXSwKIAkJCQlkYy0+eDEgLSBkYy0+eDAgKyAxLCBkYy0+eTEgLSBkYy0+eTAgKyAxKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOwogCQlpZiAoIWRjLT5kYXRhKSB7Ci0JCQlNb3ZlV2luZG93QWJzKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwKTsKLQkJCVNldENvbG9yQmxlbmQoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbik7CisJCQlyZXQgPSBNb3ZlV2luZG93QWJzKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwKTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQlyZXQgPSBTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwogCQl9Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TaG93OgotCQlNb3ZlV2luZG93UmVsKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDApOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gTW92ZVdpbmRvd1JlbChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAwLCAwKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfSGlkZToKLQkJSGlkZVdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKLQkJZ290byBvdXQ7CisJCXJldCA9IEhpZGVXaW5kb3coYXY3MTEwLCBhdjcxMTAtPm9zZHdpbik7CisJCWJyZWFrOwogCWNhc2UgT1NEX0NsZWFyOgotCQlEcmF3QmxvY2soYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgMCwgMCwgNzIwLCA1NzYsIDApOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCAwKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfRmlsbDoKLQkJRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCBkYy0+Y29sb3IpOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIDAsIDAsIDcyMCwgNTc2LCBkYy0+Y29sb3IpOworCQlicmVhazsKIAljYXNlIE9TRF9TZXRDb2xvcjoKLQkJT1NEU2V0Q29sb3IoYXY3MTEwLCBkYy0+Y29sb3IsIGRjLT54MCwgZGMtPnkwLCBkYy0+eDEsIGRjLT55MSk7Ci0JCWdvdG8gb3V0OworCQlyZXQgPSBPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciwgZGMtPngwLCBkYy0+eTAsIGRjLT54MSwgZGMtPnkxKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfU2V0UGFsZXR0ZToKLQl7Ci0JCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjE4KSB7CisJCWlmIChGV19WRVJTSU9OKGF2NzExMC0+YXJtX2FwcCkgPj0gMHgyNjE4KQogCQkJcmV0ID0gT1NEU2V0UGFsZXR0ZShhdjcxMTAsIGRjLT5kYXRhLCBkYy0+Y29sb3IsIGRjLT54MCk7Ci0JCQlnb3RvIG91dDsKLQkJfSBlbHNlIHsKKwkJZWxzZSB7CiAJCQlpbnQgaSwgbGVuID0gZGMtPngwLWRjLT5jb2xvcisxOwogCQkJdTggX191c2VyICpjb2xvcnMgPSAodTggX191c2VyICopZGMtPmRhdGE7CiAJCQl1OCByLCBnLCBiLCBibGVuZDsKLQorCQkJcmV0ID0gMDsKIAkJCWZvciAoaSA9IDA7IGk8bGVuOyBpKyspIHsKIAkJCQlpZiAoZ2V0X3VzZXIociwgY29sb3JzICsgaSAqIDQpIHx8CiAJCQkJICAgIGdldF91c2VyKGcsIGNvbG9ycyArIGkgKiA0ICsgMSkgfHwKIAkJCQkgICAgZ2V0X3VzZXIoYiwgY29sb3JzICsgaSAqIDQgKyAyKSB8fAogCQkJCSAgICBnZXRfdXNlcihibGVuZCwgY29sb3JzICsgaSAqIDQgKyAzKSkgewogCQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCQlnb3RvIG91dDsKKwkJCQkJYnJlYWs7CiAJCQkJICAgIH0KLQkJCQlPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciArIGksIHIsIGcsIGIsIGJsZW5kKTsKKwkJCQlyZXQgPSBPU0RTZXRDb2xvcihhdjcxMTAsIGRjLT5jb2xvciArIGksIHIsIGcsIGIsIGJsZW5kKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKIAkJCX0KIAkJfQotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0JY2FzZSBPU0RfU2V0VHJhbnM6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TZXRQaXhlbDoKLQkJRHJhd0xpbmUoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwKKwkJcmV0ID0gRHJhd0xpbmUoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwKIAkJCSBkYy0+eDAsIGRjLT55MCwgMCwgMCwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7Ci0JY2FzZSBPU0RfR2V0UGl4ZWw6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9TZXRSb3c6CiAJCWRjLT55MSA9IGRjLT55MDsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBPU0RfU2V0QmxvY2s6CiAJCXJldCA9IE9TRFNldEJsb2NrKGF2NzExMCwgZGMtPngwLCBkYy0+eTAsIGRjLT54MSwgZGMtPnkxLCBkYy0+Y29sb3IsIGRjLT5kYXRhKTsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX0ZpbGxSb3c6Ci0JCURyYXdCbG9jayhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCwKKwkJcmV0ID0gRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLAogCQkJICBkYy0+eDEtZGMtPngwKzEsIGRjLT55MSwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX0ZpbGxCbG9jazoKLQkJRHJhd0Jsb2NrKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLAorCQlyZXQgPSBEcmF3QmxvY2soYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgZGMtPngwLCBkYy0+eTAsCiAJCQkgIGRjLT54MSAtIGRjLT54MCArIDEsIGRjLT55MSAtIGRjLT55MCArIDEsIGRjLT5jb2xvcik7Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9MaW5lOgotCQlEcmF3TGluZShhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAorCQlyZXQgPSBEcmF3TGluZShhdjcxMTAsIGF2NzExMC0+b3Nkd2luLAogCQkJIGRjLT54MCwgZGMtPnkwLCBkYy0+eDEgLSBkYy0+eDAsIGRjLT55MSAtIGRjLT55MCwgZGMtPmNvbG9yKTsKLQkJZ290byBvdXQ7Ci0JY2FzZSBPU0RfUXVlcnk6Ci0JCWdvdG8gb3V0OwotCWNhc2UgT1NEX1Rlc3Q6Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAljYXNlIE9TRF9UZXh0OgogCXsKIAkJY2hhciB0ZXh0YnVmWzI0MF07CiAKIAkJaWYgKHN0cm5jcHlfZnJvbV91c2VyKHRleHRidWYsIGRjLT5kYXRhLCAyNDApIDwgMCkgewogCQkJcmV0ID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAkJdGV4dGJ1ZlsyMzldID0gMDsKIAkJaWYgKGRjLT54MSA+IDMpCiAJCQlkYy0+eDEgPSAzOwotCQlTZXRGb250KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MSwKKwkJcmV0ID0gU2V0Rm9udChhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDEsCiAJCQkodTE2KSAoZGMtPmNvbG9yICYgMHhmZmZmKSwgKHUxNikgKGRjLT5jb2xvciA+PiAxNikpOwotCQlGbHVzaFRleHQoYXY3MTEwKTsKLQkJV3JpdGVUZXh0KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLCB0ZXh0YnVmKTsKLQkJZ290byBvdXQ7CisJCWlmICghcmV0KQorCQkJcmV0ID0gRmx1c2hUZXh0KGF2NzExMCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gV3JpdGVUZXh0KGF2NzExMCwgYXY3MTEwLT5vc2R3aW4sIGRjLT54MCwgZGMtPnkwLCB0ZXh0YnVmKTsKKwkJYnJlYWs7CiAJfQogCWNhc2UgT1NEX1NldFdpbmRvdzoKLQkJaWYgKGRjLT54MCA8IDEgfHwgZGMtPngwID4gNykgeworCQlpZiAoZGMtPngwIDwgMSB8fCBkYy0+eDAgPiA3KQogCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OworCQllbHNlIHsKKwkJCWF2NzExMC0+b3Nkd2luID0gZGMtPngwOworCQkJcmV0ID0gMDsKIAkJfQotCQlhdjcxMTAtPm9zZHdpbiA9IGRjLT54MDsKLQkJZ290byBvdXQ7CisJCWJyZWFrOwogCWNhc2UgT1NEX01vdmVXaW5kb3c6Ci0JCU1vdmVXaW5kb3dBYnMoYXY3MTEwLCBhdjcxMTAtPm9zZHdpbiwgZGMtPngwLCBkYy0+eTApOwotCQlTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwotCQlnb3RvIG91dDsKKwkJcmV0ID0gTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gU2V0Q29sb3JCbGVuZChhdjcxMTAsIGF2NzExMC0+b3Nkd2luKTsKKwkJYnJlYWs7CiAJY2FzZSBPU0RfT3BlblJhdzoKIAkJaWYgKGRjLT5jb2xvciA8IE9TRF9CSVRNQVAxIHx8IGRjLT5jb2xvciA+IE9TRF9DVVJTT1IpIHsKIAkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9Ci0JCWlmIChkYy0+Y29sb3IgPj0gT1NEX0JJVE1BUDEgJiYgZGMtPmNvbG9yIDw9IE9TRF9CSVRNQVA4SFIpIHsKKwkJaWYgKGRjLT5jb2xvciA+PSBPU0RfQklUTUFQMSAmJiBkYy0+Y29sb3IgPD0gT1NEX0JJVE1BUDhIUikKIAkJCWF2NzExMC0+b3NkYnBwW2F2NzExMC0+b3Nkd2luXSA9ICgxIDw8IChkYy0+Y29sb3IgJiAzKSkgLSAxOwotCQl9Ci0JCWVsc2UgeworCQllbHNlCiAJCQlhdjcxMTAtPm9zZGJwcFthdjcxMTAtPm9zZHdpbl0gPSAwOwotCQl9Ci0JCUNyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAob3NkX3Jhd193aW5kb3dfdClkYy0+Y29sb3IsCisJCXJldCA9IENyZWF0ZU9TRFdpbmRvdyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCAob3NkX3Jhd193aW5kb3dfdClkYy0+Y29sb3IsCiAJCQkJZGMtPngxIC0gZGMtPngwICsgMSwgZGMtPnkxIC0gZGMtPnkwICsgMSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKIAkJaWYgKCFkYy0+ZGF0YSkgewotCQkJTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7Ci0JCQlTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOworCQkJcmV0ID0gTW92ZVdpbmRvd0FicyhhdjcxMTAsIGF2NzExMC0+b3Nkd2luLCBkYy0+eDAsIGRjLT55MCk7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSBTZXRDb2xvckJsZW5kKGF2NzExMCwgYXY3MTEwLT5vc2R3aW4pOwogCQl9Ci0JCWdvdG8gb3V0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKKwkJYnJlYWs7CiAJfQogCi1vdXQ6CiAJdXAoJmF2NzExMC0+b3NkX3NlbWEpOworCWlmIChyZXQ9PS1FUkVTVEFSVFNZUykKKwkJZHByaW50aygxLCAiYXY3MTEwX29zZF9jbWQoJWQpIHJldHVybnMgd2l0aCAtRVJFU1RBUlRTWVNcbiIsZGMtPmNtZCk7CisJZWxzZSBpZiAocmV0KQorCQlkcHJpbnRrKDEsICJhdjcxMTBfb3NkX2NtZCglZCkgcmV0dXJucyB3aXRoICVkXG4iLGRjLT5jbWQscmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMF9ody5oIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKaW5kZXggNTIwNjFlMS4uZmVkZDIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2h3LmgKQEAgLTQ1OCwyNyArNDU4LDI3IEBACiAJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0FVRElPREFDLCBBdWRpb0RBQywgMiwgYWRkciwgZGF0YSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdjc3MTBfc2V0X3ZpZGVvX21vZGUoc3RydWN0IGF2NzExMCAqYXY3MTEwLCBpbnQgbW9kZSkKK3N0YXRpYyBpbmxpbmUgaW50IGF2NzcxMF9zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBtb2RlKQogewotCWF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX0VOQ09ERVIsIFNldFZpZE1vZGUsIDEsIG1vZGUpOworCXJldHVybiBhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9FTkNPREVSLCBTZXRWaWRNb2RlLCAxLCBtb2RlKTsKIH0KIAotc3RhdGljIGludCBpbmxpbmUgdmlkY29tKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGNvbSwgdTMyIGFyZykKK3N0YXRpYyBpbmxpbmUgaW50IHZpZGNvbShzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIHUzMiBjb20sIHUzMiBhcmcpCiB7CiAJcmV0dXJuIGF2NzExMF9md19jbWQoYXY3MTEwLCBDT01UWVBFX01JU0MsIEFWNzExMF9GV19WSURFT19DT01NQU5ELCA0LAogCQkJICAgICAoY29tPj4xNiksIChjb20mMHhmZmZmKSwKIAkJCSAgICAgKGFyZz4+MTYpLCAoYXJnJjB4ZmZmZikpOwogfQogCi1zdGF0aWMgaW50IGlubGluZSBhdWRjb20oc3RydWN0IGF2NzExMCAqYXY3MTEwLCB1MzIgY29tKQorc3RhdGljIGlubGluZSBpbnQgYXVkY29tKHN0cnVjdCBhdjcxMTAgKmF2NzExMCwgdTMyIGNvbSkKIHsKIAlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfTUlTQywgQVY3MTEwX0ZXX0FVRElPX0NPTU1BTkQsIDIsCiAJCQkgICAgIChjb20+PjE2KSwgKGNvbSYweGZmZmYpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIFNldDIySyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBzdGF0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IFNldDIySyhzdHJ1Y3QgYXY3MTEwICphdjcxMTAsIGludCBzdGF0ZSkKIHsKLQlhdjcxMTBfZndfY21kKGF2NzExMCwgQ09NVFlQRV9BVURJT0RBQywgKHN0YXRlID8gT04yMksgOiBPRkYyMkspLCAwKTsKKwlyZXR1cm4gYXY3MTEwX2Z3X2NtZChhdjcxMTAsIENPTVRZUEVfQVVESU9EQUMsIChzdGF0ZSA/IE9OMjJLIDogT0ZGMjJLKSwgMCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwX2lwYWNrLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYwppbmRleCAyNDY2NDA3Li42OTllZjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9hdjcxMTBfaXBhY2suYwpAQCAtMjQsNyArMjQsNyBAQAogCQkgICAgICB2b2lkICgqZnVuYykodTggKmJ1ZiwgaW50IHNpemUsIHZvaWQgKnByaXYpKQogewogCWlmICghKHAtPmJ1ZiA9IHZtYWxsb2Moc2l6ZSpzaXplb2YodTgpKSkpIHsKLQkJcHJpbnRrICgiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpcGFja1xuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNvdWxkbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgaXBhY2tcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcC0+c2l6ZSA9IHNpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtYXYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCmluZGV4IDZlMGY1ZDMuLjk3NDZkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jCkBAIC01NzAsOSArNTcwLDkgQEAKIAogCWJ1ZlswXSA9IChkaXYgPj4gOCkgJiAweDdmOwogCWJ1ZlsxXSA9IGRpdiAmIDB4ZmY7Ci0JYnVmWzJdID0gMHg4ZTsKLQlidWZbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQ1MDAwMDAgPyAweGExIDoKLQkJICBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ1NDAwMDAwMCA/IDB4OTIgOiAweDM0KTsKKwlidWZbMl0gPSAweDg2OworCWJ1ZlszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE1MDAwMDAwMCA/IDB4MDEgOgorCQkgIHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDQ1MDAwMDAwID8gMHgwMiA6IDB4MDQpOwogCiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CkBAIC02OTUsOCArNjk1LDEyIEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDgsCiAJLmludmVydCA9IDEsCiAJLmludmVydF9vY2xrID0gMSwKKwkueHRhbF9mcmVxID0gVERBMTAwNDZfWFRBTF80TSwKKwkuYWdjX2NvbmZpZyA9IFREQTEwMDQ2X0FHQ19ERUZBVUxULAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8zNjE3LAogCS5wbGxfaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0LAogCS5wbGxfc2V0ID0gcGhpbGlwc190dTEyMTZfcGxsX3NldCwKKwkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdHUxMjE2X3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCkBAIC0xMDE4LDcgKzEwMjIsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV90YmwpOwogCiBzdGF0aWMgc3RydWN0IHNhYTcxNDZfZXh0ZW5zaW9uIGJ1ZGdldF9leHRlbnNpb24gPSB7Ci0JLm5hbWUgPSAiYnVkZ2V0IGR2YiAvdyB2aWRlbyBpblwwIiwKKwkubmFtZSA9ICJidWRnZXRfYXYiLAogCS5wY2lfdGJsID0gcGNpX3RibCwKIAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggZGNlMTE2MS4uYTEyNjcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAlpbnQgc2xvdF9zdGF0dXM7CiAJc3RydWN0IGR2Yl9jYV9lbjUwMjIxIGNhOwogCWNoYXIgaXJfZGV2X25hbWVbNTBdOworCXU4IHR1bmVyX3BsbF9hZGRyZXNzOyAvKiB1c2VkIGZvciBwaGlsaXBzX3RkbTEzMTZsIGNvbmZpZ3MgKi8KIH07CiAKIC8qIGZyb20gcmVhZGluZyB0aGUgZm9sbG93aW5nIHJlbW90ZXM6CkBAIC03MjMsNyArNzI0LDcgQEAKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXN0YXRpYyB1OCB0ZDEzMTZfaW5pdFtdID0geyAweDBiLCAweGY1LCAweDg1LCAweGFiIH07CiAJc3RhdGljIHU4IGRpc2FibGVfbWM0NEJDMzc0Y1tdID0geyAweDFkLCAweDc0LCAweGEwLCAweDY4IH07Ci0Jc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MywuZmxhZ3MgPSAwLC5idWYgPSB0ZDEzMTZfaW5pdCwubGVuID0KKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSBidWRnZXRfY2ktPnR1bmVyX3BsbF9hZGRyZXNzLC5mbGFncyA9IDAsLmJ1ZiA9IHRkMTMxNl9pbml0LC5sZW4gPQogCQkJc2l6ZW9mKHRkMTMxNl9pbml0KSB9OwogCiAJLy8gc2V0dXAgUExMIGNvbmZpZ3VyYXRpb24KQEAgLTc0Niw3ICs3NDcsNyBAQAogewogCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjMsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OworCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MsLmZsYWdzID0gMCwuYnVmID0gdHVuZXJfYnVmLC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OwogCWludCB0dW5lcl9mcmVxdWVuY3kgPSAwOwogCXU4IGJhbmQsIGNwLCBmaWx0ZXI7CiAKQEAgLTgzOCw4ICs4MzksMTIgQEAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4OCwKIAkuaW52ZXJ0ID0gMCwKIAkuaW52ZXJ0X29jbGsgPSAwLAorCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzRNLAorCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCisJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCiAJLnBsbF9pbml0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdCwKIAkucGxsX3NldCA9IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKKwkucGxsX3NsZWVwID0gTlVMTCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRtMTMxNmxfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTg2NSwxMiArODcwLDIyIEBACiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMTE6CQkvLyBIYXVwcGF1Z2UvVFQgTm92YS1UIGJ1ZGdldCAodGRhMTAwNDUvUGhpbGlwcyB0ZG0xMzE2bCh0ZGE2NjUxdHQpICsgVERBOTg4OSkKKwkJYnVkZ2V0X2NpLT50dW5lcl9wbGxfYWRkcmVzcyA9IDB4NjM7CiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQl0ZGExMDA0NV9hdHRhY2goJnBoaWxpcHNfdGRtMTMxNmxfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMHgxMDEyOgkJLy8gSGF1cHBhdWdlL1RUIE5vdmEtVCBDSSBidWRnZXQgKHRkYTEwMDQ1L1BoaWxpcHMgdGRtMTMxNmwodGRhNjY1MXR0KSArIFREQTk4ODkpCisJCWJ1ZGdldF9jaS0+dHVuZXJfcGxsX2FkZHJlc3MgPSAweDYwOworCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQorCQkJdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9PSBOVUxMKSB7CkBAIC05NTAsMTEgKzk2NSwxMyBAQAogCiBNQUtFX0JVREdFVF9JTkZPKHR0YmNpLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtQ0kgUENJIiwgQlVER0VUX1RUX0hXX0RJU0VRQyk7CiBNQUtFX0JVREdFVF9JTkZPKHR0YnQyLCAiVFQtQnVkZ2V0L1dpblRWLU5PVkEtVAkgUENJIiwgQlVER0VUX1RUKTsKK01BS0VfQlVER0VUX0lORk8odHRidGNpLCAiVFQtQnVkZ2V0LVQtQ0kgUENJIiwgQlVER0VUX1RUKTsKIAogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV90YmxbXSA9IHsKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBjKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRiY2ksIDB4MTNjMiwgMHgxMDBmKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0kodHRidDIsIDB4MTNjMiwgMHgxMDExKSwKKwlNQUtFX0VYVEVOU0lPTl9QQ0kodHRidGNpLCAweDEzYzIsIDB4MTAxMiksCiAJewogCSAudmVuZG9yID0gMCwKIAkgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwppbmRleCAwODNmZDQ0Li45OTYxOTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgInZlczE4MjAuaCIKICNpbmNsdWRlICJsNjQ3ODEuaCIKICNpbmNsdWRlICJ0ZGE4MDgzLmgiCisjaW5jbHVkZSAiczVoMTQyMC5oIgogCiBzdGF0aWMgdm9pZCBTZXQyMksgKHN0cnVjdCBidWRnZXQgKmJ1ZGdldCwgaW50IHN0YXRlKQogewpAQCAtMTc3LDYgKzE3OCw2MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxuYnAyMV9zZXRfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3ZvbHRhZ2VfdCB2b2x0YWdlKQoreworCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKKwl1OCBidWY7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4MDgsIC5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJmJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisKKwlzd2l0Y2godm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWJ1ZiA9IChidWYgJiAweGY3KSB8IDB4MDQ7CisJCWJyZWFrOworCisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJYnVmID0gKGJ1ZiAmIDB4ZjcpIHwgMHgwYzsKKwkJYnJlYWs7CisKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJYnVmID0gYnVmICYgMHhmMDsKKwkJYnJlYWs7CisJfQorCisJbXNnLmZsYWdzID0gMDsKKwlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBhcmcpCit7CisJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OworCXU4IGJ1ZjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7IC5hZGRyID0gMHgwOCwgLmZsYWdzID0gSTJDX01fUkQsIC5idWYgPSAmYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKworCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKKworCWlmIChhcmcpIHsKKwkJYnVmID0gYnVmIHwgMHgxMDsKKwl9IGVsc2UgeworCQlidWYgPSBidWYgJiAweGVmOworCX0KKworCW1zZy5mbGFncyA9IDA7CisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxuYnAyMV9pbml0KHN0cnVjdCBidWRnZXQqIGJ1ZGdldCkKK3sKKwl1OCBidWYgPSAweDAwOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLCAuYnVmID0gJmJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisKKwlpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKTsKK30KKwogc3RhdGljIGludCBhbHBzX2JzcnYyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0KikgZmUtPmR2Yi0+cHJpdjsKQEAgLTM5NSw2ICs0NTIsMzggQEAKIAkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDUxX3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IHM1aDE0MjBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHUzMiogZnJlcW91dCkKK3sKKwlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CisJdTMyIGRpdjsKKwl1OCBkYXRhWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCisJZGl2ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwOworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHhjMjsKKworCWlmIChkaXYgPCAxNDUwKQorCQlkYXRhWzNdID0gMHgwMDsKKwllbHNlIGlmIChkaXYgPCAxODUwKQorCQlkYXRhWzNdID0gMHg0MDsKKwllbHNlIGlmIChkaXYgPCAyMDAwKQorCQlkYXRhWzNdID0gMHg4MDsKKwllbHNlCisJCWRhdGFbM10gPSAweGMwOworCisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCisJKmZyZXFvdXQgPSBkaXYgKiAxMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHM1aDE0MjBfY29uZmlnIHM1aDE0MjBfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHg1MywKKwkucGxsX3NldCA9IHM1aDE0MjBfcGxsX3NldCwKK307CisKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQpCiB7CiAJdTggYiA9IDB4ZmY7CkBAIC00NTksNiArNTQ4LDE1IEBACiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKworCWNhc2UgMHgxMDE2OiAvLyBIYXVwcGF1Z2UvVFQgTm92YS1TIFNFIChzYW1zdW5nIHM1aDE0MjAvPz8/Pyh0ZGE4MjYwKSkKKwkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSBzNWgxNDIwX2F0dGFjaCgmczVoMTQyMF9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKKwkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdm9sdGFnZSA9IGxuYnAyMV9zZXRfdm9sdGFnZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlID0gbG5icDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlOworCQkJbG5icDIxX2luaXQoYnVkZ2V0KTsKKwkJCWJyZWFrOworCQl9CiAJfQogCiAJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kID09IE5VTEwpIHsKQEAgLTUzMiw2ICs2MzAsNyBAQAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJjLCAgMHgxM2MyLCAweDEwMDQpLAogCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJ0LCAgMHgxM2MyLCAweDEwMDUpLAogCU1BS0VfRVhURU5TSU9OX1BDSShzYXRlbCwgMHgxM2MyLCAweDEwMTMpLAorCU1BS0VfRVhURU5TSU9OX1BDSSh0dGJzLCAgMHgxM2MyLCAweDEwMTYpLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczEsMHgxMTMxLCAweDRmNjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShmc2FjczAsMHgxMTMxLCAweDRmNjEpLAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKaW5kZXggNGFhNzE0YS4uYzZjMWQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKQEAgLTMsNiArMyw3IEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBVU0IKIAlzZWxlY3QgRFZCX0NYMjI3MDAKIAlzZWxlY3QgRFZCX1REQTEwMDRYCisJc2VsZWN0IERWQl9WRVMxODIwCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJc2VsZWN0IERWQl9TVFYwMjk5CiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKaW5kZXggYWZhMGU3YS4uYWE0M2I1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiZG14ZGV2LmgiCiAjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCiAjaW5jbHVkZSAiZHZiX25ldC5oIgorI2luY2x1ZGUgInZlczE4MjAuaCIKICNpbmNsdWRlICJjeDIyNzAwLmgiCiAjaW5jbHVkZSAidGRhMTAwNHguaCIKICNpbmNsdWRlICJzdHYwMjk5LmgiCkBAIC0xMzY3LDYgKzEzNjgsNDcgQEAKIAkucGxsX3NldCA9IHR0dXNiX25vdmFzX2dydW5kaWdfMjk1MDRfNDkxX3BsbF9zZXQsCiB9OwogCitzdGF0aWMgaW50IGFscHNfdGRiZTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCit7CisJc3RydWN0IHR0dXNiKiB0dHVzYiA9IGZlLT5kdmItPnByaXY7CisJdTMyIGRpdjsKKwl1OCBkYXRhWzRdOworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYyLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCisJZGl2ID0gKHBhcmFtcy0+ZnJlcXVlbmN5ICsgMzU5Mzc1MDAgKyAzMTI1MCkgLyA2MjUwMDsKKworCWRhdGFbMF0gPSAoZGl2ID4+IDgpICYgMHg3ZjsKKwlkYXRhWzFdID0gZGl2ICYgMHhmZjsKKwlkYXRhWzJdID0gMHg4NSB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOworCWRhdGFbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQwMDAwMDAgPyAweDg4IDogcGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDAgPyAweDg0IDogMHg4MSk7CisKKwlpZiAoaTJjX3RyYW5zZmVyICgmdHR1c2ItPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdmVzMTgyMF9jb25maWcgYWxwc190ZGJlMl9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA5LAorCS54aW4gPSA1Nzg0MDAwMFVMLAorCS5pbnZlcnQgPSAxLAorCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAorCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAorfTsKKworc3RhdGljIHU4IHJlYWRfcHdtKHN0cnVjdCB0dHVzYiogdHR1c2IpCit7CisJdTggYiA9IDB4ZmY7CisJdTggcHdtOworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geyB7IC5hZGRyID0gMHg1MCwuZmxhZ3MgPSAwLC5idWYgPSAmYiwubGVuID0gMSB9LAorCQkJCXsgLmFkZHIgPSAweDUwLC5mbGFncyA9IEkyQ19NX1JELC5idWYgPSAmcHdtLC5sZW4gPSAxfSB9OworCisJaWYgKChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgbXNnLCAyKSAhPSAyKSB8fCAocHdtID09IDB4ZmYpKQorCQlwd20gPSAweDQ4OworCisJcmV0dXJuIHB3bTsKK30KIAogCiBzdGF0aWMgdm9pZCBmcm9udGVuZF9pbml0KHN0cnVjdCB0dHVzYiogdHR1c2IpCkBAIC0xMzk0LDYgKzE0MzYsMTIgQEAKIAogCQlicmVhazsKIAorCWNhc2UgMHgxMDA0OiAvLyBIYXVwcGF1Z2UvVFQgRFZCLUMgYnVkZ2V0ICh2ZXMxODIwL0FMUFMgVERCRTIoc3A1NjU5KSkKKwkJdHR1c2ItPmZlID0gdmVzMTgyMF9hdHRhY2goJmFscHNfdGRiZTJfY29uZmlnLCAmdHR1c2ItPmkyY19hZGFwLCByZWFkX3B3bSh0dHVzYikpOworCQlpZiAodHR1c2ItPmZlICE9IE5VTEwpCisJCQlicmVhazsKKwkJYnJlYWs7CisKIAljYXNlIDB4MTAwNTogLy8gSGF1cHBhdWdlL1RUIE5vdmEtVVNCLXQgYnVkZ2V0ICh0ZGExMDA0Ni9QaGlsaXBzIHRkMTMxNih0ZGE2NjUxdHQpIE9SIGN4MjI3MDAvQUxQUyBURE1CNyg/PykpCiAJCS8vIHRyeSB0aGUgQUxQUyBURE1CNyBmaXJzdAogCQl0dHVzYi0+ZmUgPSBjeDIyNzAwX2F0dGFjaCgmYWxwc190ZG1iN19jb25maWcsICZ0dHVzYi0+aTJjX2FkYXApOwpAQCAtMTU3MCw3ICsxNjE4LDcgQEAKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHR0dXNiX3RhYmxlW10gPSB7CiAJe1VTQl9ERVZJQ0UoMHhiNDgsIDB4MTAwMyl9LAotLyoJe1VTQl9ERVZJQ0UoMHhiNDgsIDB4MTAwNCl9LFVOREVGSU5FRCBIQVJEV0FSRSAtIG1haWwgbGludXh0di5vcmcgbGlzdCovCS8qIHRvIGJlIGNvbmZpcm1lZCA/Pz8/ICAqLworCXtVU0JfREVWSUNFKDB4YjQ4LCAweDEwMDQpfSwKIAl7VVNCX0RFVklDRSgweGI0OCwgMHgxMDA1KX0sCiAJe30KIH07CkBAIC0xNTc4LDcgKzE2MjYsNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHR0dXNiX3RhYmxlKTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHR0dXNiX2RyaXZlciA9IHsKLSAgICAgIC5uYW1lCQk9ICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgVVNCLU5vdmEiLAorICAgICAgLm5hbWUJCT0gInR0dXNiIiwKICAgICAgIC5wcm9iZQkJPSB0dHVzYl9wcm9iZSwKICAgICAgIC5kaXNjb25uZWN0CT0gdHR1c2JfZGlzY29ubmVjdCwKICAgICAgIC5pZF90YWJsZQkJPSB0dHVzYl90YWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA1MDViZGFmLi40NWM5YTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0xMjgxLDYgKzEyODEsNyBAQAogCWlmIChmaXJtd2FyZV9zaXplIDwgNjApIHsKIAkJcHJpbnRrKCIlczogZmlybXdhcmUgc2l6ZSB0b28gc21hbGwgZm9yIERTUCBjb2RlICglenUgPCA2MCkuXG4iLAogCQkJX19GVU5DVElPTl9fLCBmaXJtd2FyZV9zaXplKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEyOTQsNiArMTI5NSw3IEBACiAJCXByaW50aygiJXM6IGNyYzMyIGNoZWNrIG9mIERTUCBjb2RlIGZhaWxlZCAoY2FsY3VsYXRlZCAiCiAJCSAgICAgICAiMHglMDh4ICE9IDB4JTA4eCBpbiBmaWxlKSwgZmlsZSBpbnZhbGlkLlxuIiwKIAkJCV9fRlVOQ1RJT05fXywgY3JjMzJfY3N1bSwgY3JjMzJfY2hlY2spOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1jcHkoaWRzdHJpbmcsICZmaXJtd2FyZVszNl0sIDIwKTsKQEAgLTEzMDgsMTUgKzEzMTAsMTkgQEAKIAogCXJlc3VsdCA9IHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCAweDQxLCBzaXplb2YoYjApLCBiMCwgTlVMTCwgTlVMTCk7CiAKLQlpZiAocmVzdWx0KQorCWlmIChyZXN1bHQpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiByZXN1bHQ7CisJfQogCiAJdHJhbnNfY291bnQgPSAwOwogCWogPSAwOwogCiAJYiA9IGttYWxsb2MoQVJNX1BBQ0tFVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoYiA9PSBOVUxMKQorCWlmIChiID09IE5VTEwpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBmaXJtd2FyZV9zaXplOyBpICs9IENPTU1BTkRfUEFDS0VUX1NJWkUpIHsKIAkJc2l6ZSA9IGZpcm13YXJlX3NpemUgLSBpOwpAQCAtMTM0NSw2ICsxMzUxLDcgQEAKIAogCXJlc3VsdCA9IHR0dXNiX2RlY19zZW5kX2NvbW1hbmQoZGVjLCAweDQzLCBzaXplb2YoYjEpLCBiMSwgTlVMTCwgTlVMTCk7CiAKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAlrZnJlZShiKTsKIAogCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYwppbmRleCAxNjk5Y2M5Li43MjVhZjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKQEAgLTE1Nyw3ICsxNTcsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IChzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKQEAgLTE2NywxMCArMTY4LDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKLQotZXJyb3I6Ci0Ja2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJzX29wczsKQEAgLTE4MSw3ICsxNzgsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW50ZXJuYWwgc3RhdGUgKi8KIAlzdGF0ZSA9IChzdHJ1Y3QgdHR1c2JkZWNmZV9zdGF0ZSopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CisJaWYgKHN0YXRlID09IE5VTEwpCisJCXJldHVybiBOVUxMOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKQEAgLTE5MywxMCArMTkxLDYgQEAKIAlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKLQotZXJyb3I6Ci0Ja2ZyZWUoc3RhdGUpOwotCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgdHR1c2JkZWNmZV9kdmJ0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCA2YzA1ZmRkLi5mNDYxNzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0zMzAsNiArMzMwLDggQEAKIAlzZWxlY3QgVklERU9fQlVGX0RWQgogCXNlbGVjdCBEVkJfTVQzNTIKIAlzZWxlY3QgRFZCX09SNTExMzIKKwlzZWxlY3QgRFZCX0NYMjI3MDIKKwlzZWxlY3QgRFZCX0xHRFQzMzAyCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIERWQi9BVFNDIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgQ29ubmV4YW50IDIzODh4IGNoaXAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQppbmRleCAyZGM5MDZmLi44MTBlN2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKQEAgLTcsOCArNyw3IEBACiB6b3Jhbi1vYmpzICAgICAgOj0JenIzNjEyMC5vIHpyMzYxMjBfaTJjLm8genIzNjEyMF9tZW0ubwogenIzNjA2Ny1vYmpzCTo9CXpvcmFuX3Byb2Nmcy5vIHpvcmFuX2RldmljZS5vIFwKIAkJCXpvcmFuX2RyaXZlci5vIHpvcmFuX2NhcmQubwotdHVuZXItb2Jqcwk6PQl0dW5lci1jb3JlLm8gdHVuZXItc2ltcGxlLm8gbXQyMHh4Lm8gdGRhODI5MC5vCi0KK3R1bmVyLW9ianMJOj0JdHVuZXItY29yZS5vIHR1bmVyLXNpbXBsZS5vIG10MjB4eC5vIHRkYTgyOTAubyB0ZWE1NzY3Lm8KIG9iai0kKENPTkZJR19WSURFT19ERVYpICs9IHZpZGVvZGV2Lm8gdjRsMi1jb21tb24ubyB2NGwxLWNvbXBhdC5vCiAKIG9iai0kKENPTkZJR19WSURFT19CVDg0OCkgKz0gYnR0di5vIG1zcDM0MDAubyB0dmF1ZGlvLm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCmluZGV4IDA3ZjcyZjY0Li5hMDcwNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5jCkBAIC02LDcgKzYsNyBAQAogICBJdCBvdXRwdXRzIGFuIDgtYml0IDQ6MjoyIFlVViBvciBZQ3JDYiB2aWRlbyBzaWduYWwgd2hpY2ggY2FuIGJlIGRpcmVjdGx5CiAgIGNvbm5lY3RlZCB0byBidDg0OC9idDg3OCBHUElPIHBpbnMgb24gdGhpcyBwdXJwb3NlLgogICAoc2VlOiBWTFNJIFZpc2lvbiBMdGQuIHd3dy52dmwuY28udWsgZm9yIGNhbWVyYSBkYXRhc2hlZXRzKQotICAKKwogICBTdXBwb3J0ZWQgQ2FyZHM6CiAgIC0gIFBpeGVsdmlldyBSZXYuNEU6IDB4OGEKIAkJR1BJTyAweDQwMDAwMCB0b2dnbGVzIEJ0ODMyIFJFU0VULCBhbmQgdGhlIGNoaXAgY2hhbmdlcyB0byBpMmMgMHg4OCAhCkBAIC0zMSw4ICszMSw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlICJpZC5oIgotI2luY2x1ZGUgImF1ZGlvY2hpcC5oIgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvY2hpcC5oPgorI2luY2x1ZGUgPG1lZGlhL2lkLmg+CiAjaW5jbHVkZSAiYnR0di5oIgogI2luY2x1ZGUgImJ0ODMyLmgiCiAKQEAgLTk1LDcgKzk1LDcgQEAKIAogCWJ1Zj1rbWFsbG9jKDY1LEdGUF9LRVJORUwpOwogCWJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7Ci0JCisKIAlpZihidWZbMHg0MF0gIT0gMHgzMSkgewogCQlwcmludGsoImJ0ODMyOiB0aGlzIGkyYyBjaGlwIGlzIG5vIGJ0ODMyIChpZD0lMDJ4KS4gRGV0YWNoaW5nLlxuIixidWZbMHg0MF0pOwogCQlrZnJlZShidWYpOwpAQCAtMTM1LDI4ICsxMzUsMTYgQEAKIAlidWZbMV09IDB4MjcgJiAofjB4MDEpOyAvLyBEZWZhdWx0IHwgIXNraXAKIAlpZiAoMiAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwyKSkpCiAgICAgICAgICAgICAgICAgcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBFTzogcmMgPT0gJWQgKHNob3VsZCBiZSAyKVxuIixyYyk7Ci0JCi0gICAgICAgIGJ0ODMyX2hleGR1bXAoaTJjX2NsaWVudF9zLGJ1Zik7Ci0KLSNpZiAwCi0JLy8gRnVsbCAzMC8yNSBGcmFtZSByYXRlCi0JcHJpbnRrKCJGdWxsIDMwLzI1IEZyYW1lIHJhdGVcbiIpOwotCWJ1ZlswXT1CVDgzMl9WUF9DT05UUk9MMDsgLy8gUmVnLjM5Ci0gICAgICAgIGJ1ZlsxXT0gMHgwMDsKLSAgICAgICAgaWYgKDIgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGkyY19jbGllbnRfcyxidWYsMikpKQotICAgICAgICAgICAgICAgIHByaW50aygiYnQ4MzI6IGkyYyBpL28gZXJyb3IgRkZSOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKIAogICAgICAgICBidDgzMl9oZXhkdW1wKGkyY19jbGllbnRfcyxidWYpOwotI2VuZGlmCiAKLSNpZiAxCisKIAkvLyBmb3IgdGVzdGluZyAoZXZlbiB3b3JrcyB3aGVuIG5vIGNhbWVyYSBhdHRhY2hlZCkKIAlwcmludGsoImJ0ODMyOiAqKiogR2VuZXJhdGUgTlRTQyBNIEJhcnMgKioqKipcbiIpOwogCWJ1ZlswXT1CVDgzMl9WUF9URVNUQ09OVFJPTDA7IC8vIFJlZy4gNDIKIAlidWZbMV09MzsgLy8gR2VuZXJhdGUgTlRTQyBTeXN0ZW0gTSBiYXJzLCBHZW5lcmF0ZSBGcmFtZSB0aW1pbmcgaW50ZXJuYWxseQogICAgICAgICBpZiAoMiAhPSAocmMgPSBpMmNfbWFzdGVyX3NlbmQoaTJjX2NsaWVudF9zLGJ1ZiwyKSkpCiAgICAgICAgICAgICAgICAgcHJpbnRrKCJidDgzMjogaTJjIGkvbyBlcnJvciBNQkFSOiByYyA9PSAlZCAoc2hvdWxkIGJlIDIpXG4iLHJjKTsKLSNlbmRpZgogCiAJcHJpbnRrKCJCdDgzMjogQ2FtZXJhIFByZXNlbnQ6ICVzXG4iLAogCQkoYnVmWzErQlQ4MzJfQ0FNX1NUQVRVU10gJiBCVDgzMl81Nl9DQU1FUkFfUFJFU0VOVCkgPyAieWVzIjoibm8iKTsKQEAgLTE2OCw4ICsxNTYsNyBAQAogCiAKIAotc3RhdGljIGludCBidDgzMl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwKLQkJCSAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGludCBraW5kKQorc3RhdGljIGludCBidDgzMl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBpbnQgYWRkciwgaW50IGtpbmQpCiB7CiAJc3RydWN0IGJ0ODMyICp0OwogCkBAIC0xODQsMjcgKzE3MSwzMiBAQAogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogCW1lbXNldCh0LDAsc2l6ZW9mKCp0KSk7CiAJdC0+Y2xpZW50ID0gY2xpZW50X3RlbXBsYXRlOwotICAgICAgICB0LT5jbGllbnQuZGF0YSA9IHQ7CisgICAgICAgIGkyY19zZXRfY2xpZW50ZGF0YSgmdC0+Y2xpZW50LCB0KTsKICAgICAgICAgaTJjX2F0dGFjaF9jbGllbnQoJnQtPmNsaWVudCk7CiAKIAlpZighIGJ0ODMyX2luaXQoJnQtPmNsaWVudCkpIHsKIAkJYnQ4MzJfZGV0YWNoKCZ0LT5jbGllbnQpOwogCQlyZXR1cm4gLTE7CiAJfQotICAgICAgICAKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGJ0ODMyX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCiAJaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKIAkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBidDgzMl9hdHRhY2gpOworI2Vsc2UKKwlpZiAoYWRhcC0+aWQgPT0gKEkyQ19BTEdPX0JJVCB8IEkyQ19IV19CX0JUODQ4KSkKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBidDgzMl9hdHRhY2gpOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYnQ4MzJfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGJ0ODMyICp0ID0gKHN0cnVjdCBidDgzMiopY2xpZW50LT5kYXRhOworCXN0cnVjdCBidDgzMiAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJcHJpbnRrKCJidDgzMjogZGV0YWNoLlxuIik7CiAJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKQEAgLTIxNSw3ICsyMDcsNyBAQAogc3RhdGljIGludAogYnQ4MzJfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGJ0ODMyICp0ID0gKHN0cnVjdCBidDgzMiopY2xpZW50LT5kYXRhOworCXN0cnVjdCBidDgzMiAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJcHJpbnRrKCJidDgzMjogY29tbWFuZCAleFxuIixjbWQpOwogCkBAIC0yNDksMTkgKzI0MSwxOCBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQogewotICAgICAgICAubmFtZSAgID0gImJ0ODMyIiwKLQkuZmxhZ3MgID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCi0gICAgICAgIC5kcml2ZXIgPSAmZHJpdmVyLAorCUkyQ19ERVZOQU1FKCJidDgzMiIpLAorCS5mbGFncyAgICAgID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCisgICAgICAgIC5kcml2ZXIgICAgID0gJmRyaXZlciwKIH07CiAKIAotaW50IGJ0ODMyX2luaXRfbW9kdWxlKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBidDgzMl9pbml0X21vZHVsZSh2b2lkKQogewotCWkyY19hZGRfZHJpdmVyKCZkcml2ZXIpOwotCXJldHVybiAwOworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZHJpdmVyKTsKIH0KIAotc3RhdGljIHZvaWQgYnQ4MzJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBidDgzMl9jbGVhbnVwX21vZHVsZSh2b2lkKQogewogCWkyY19kZWxfZHJpdmVyKCZkcml2ZXIpOwogfQpAQCAtMjY5LDMgKzI2MCwxMCBAQAogbW9kdWxlX2luaXQoYnQ4MzJfaW5pdF9tb2R1bGUpOwogbW9kdWxlX2V4aXQoYnQ4MzJfY2xlYW51cF9tb2R1bGUpOwogCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4MzIuaAppbmRleCA3YTk4YzA2Li45YjZhOGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0ODMyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDgzMi5oCkBAIC0xLDYgKzEsNiBAQAogLyogQnQ4MzIgQ01PUyBDYW1lcmEgVmlkZW8gUHJvY2Vzc29yIChWUCkKIAotIFRoZSBCdDgzMiBDTU9TIENhbWVyYSBWaWRlbyBQcm9jZXNzb3IgY2hpcCBjb25uZWN0cyBhIFF1YXJ0c2lnaHQgQ01PUyAKKyBUaGUgQnQ4MzIgQ01PUyBDYW1lcmEgVmlkZW8gUHJvY2Vzc29yIGNoaXAgY29ubmVjdHMgYSBRdWFydHNpZ2h0IENNT1MKICAgY29sb3IgZGlnaXRhbCBjYW1lcmEgZGlyZWN0bHkgdG8gdmlkZW8gY2FwdHVyZSBkZXZpY2VzIHZpYSBhbiA4LWJpdCwKICAgNDoyOjIgWVVWIG9yIFlDckNiIHZpZGVvIGludGVyZmFjZS4KIApAQCAtODUsNyArODUsNyBAQAogI2RlZmluZSBCVDgzMl9ERVZJQ0VfSUQJCTYzCiAjIGRlZmluZSBCVDgzMl9ERVZJQ0VfSURfXzMxCQkweDMxIC8vIEJ0ODMyIGhhcyBJRCAweDMxCiAKLS8qIFNUTWljcm9lbGVjdHJvbml2Y3MgVlY1NDA0IGNhbWVyYSBtb2R1bGUgCisvKiBTVE1pY3JvZWxlY3Ryb25pdmNzIFZWNTQwNCBjYW1lcmEgbW9kdWxlCiAgICBpMmM6IDB4MjA6IHNlbnNvciBhZGRyZXNzCiAgICBpMmM6IDB4YTA6IGVlcHJvbSBmb3IgY2NkIGRlZmVjdCBtYXAKICAqLwpAQCAtMjU2LDI2ICsyNTYsMjYgQEAKIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBUaW1pbmcgZ2VuZXJhdG9yIFNSQU0gdGFibGUgdmFsdWVzIGZvciBDQ0lSNjAxIDcyMHg0ODAgTlRTQwogLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEZvciBOVFNDIENDSVI2NTYgCisvLyBGb3IgTlRTQyBDQ0lSNjU2CiBCWVRFIEJ0Q2FyZDo6U1JBTVRhYmxlX05UU0NbXSA9CiB7CiAgICAgLy8gU1JBTSBUaW1pbmcgVGFibGUgZm9yIE5UU0MKLSAgICAweDBjLCAweGMwLCAweDAwLCAKLSAgICAweDAwLCAweDkwLCAweGMyLCAKLSAgICAweDAzLCAweDEwLCAweDAzLCAKLSAgICAweDA2LCAweDEwLCAweDM0LCAKLSAgICAweDEyLCAweDEyLCAweDY1LCAKLSAgICAweDAyLCAweDEzLCAweDI0LCAKLSAgICAweDE5LCAweDAwLCAweDI0LCAKLSAgICAweDM5LCAweDAwLCAweDk2LCAKLSAgICAweDU5LCAweDA4LCAweDkzLCAKKyAgICAweDBjLCAweGMwLCAweDAwLAorICAgIDB4MDAsIDB4OTAsIDB4YzIsCisgICAgMHgwMywgMHgxMCwgMHgwMywKKyAgICAweDA2LCAweDEwLCAweDM0LAorICAgIDB4MTIsIDB4MTIsIDB4NjUsCisgICAgMHgwMiwgMHgxMywgMHgyNCwKKyAgICAweDE5LCAweDAwLCAweDI0LAorICAgIDB4MzksIDB4MDAsIDB4OTYsCisgICAgMHg1OSwgMHgwOCwgMHg5MywKICAgICAweDgzLCAweDA4LCAweDk3LAotICAgIDB4MDMsIDB4NTAsIDB4MzAsIAotICAgIDB4YzAsIDB4NDAsIDB4MzAsIAotICAgIDB4ODYsIDB4MDEsIDB4MDEsIAotICAgIDB4YTYsIDB4MGQsIDB4NjIsIAotICAgIDB4MDMsIDB4MTEsIDB4NjEsIAotICAgIDB4MDUsIDB4MzcsIDB4MzAsIAorICAgIDB4MDMsIDB4NTAsIDB4MzAsCisgICAgMHhjMCwgMHg0MCwgMHgzMCwKKyAgICAweDg2LCAweDAxLCAweDAxLAorICAgIDB4YTYsIDB4MGQsIDB4NjIsCisgICAgMHgwMywgMHgxMSwgMHg2MSwKKyAgICAweDA1LCAweDM3LCAweDMwLAogICAgIDB4YWMsIDB4MjEsIDB4NTAKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKaW5kZXggNjMzNDEyMi4uMmRiZjVlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWNhcmRzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS40NyAyMDA1LzAyLzIyIDE0OjA2OjMyIGtyYXhlbCBFeHAgJAorICAgICRJZDogYnR0di1jYXJkcy5jLHYgMS41MyAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogCiAgICAgYnR0di1jYXJkcy5jCiAKQEAgLTM5LDkgKzM5LDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgImJ0dHZwLmgiCi0jaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KLSNpbmNsdWRlICJidDgzMi5oIgotI2VuZGlmCiAKIC8qIGZ3ZCBkZWNsICovCiBzdGF0aWMgdm9pZCBib290X21zcDM0eHgoc3RydWN0IGJ0dHYgKmJ0diwgaW50IHBpbik7CkBAIC01MSw2ICs0OCw3IEBACiBzdGF0aWMgdm9pZCBvc3ByZXlfZWVwcm9tKHN0cnVjdCBidHR2ICpidHYpOwogc3RhdGljIHZvaWQgbW9kdGVjX2VlcHJvbShzdHJ1Y3QgYnR0diAqYnR2KTsKIHN0YXRpYyB2b2lkIGluaXRfUFhDMjAwKHN0cnVjdCBidHR2ICpidHYpOworc3RhdGljIHZvaWQgaW5pdF9SVFYyNChzdHJ1Y3QgYnR0diAqYnR2KTsKIAogc3RhdGljIHZvaWQgd2ludmlld19hdWRpbyhzdHJ1Y3QgYnR0diAqYnR2LCBzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYsIGludCBzZXQpOwogc3RhdGljIHZvaWQgbHQ5NDE1X2F1ZGlvKHN0cnVjdCBidHR2ICpidHYsIHN0cnVjdCB2aWRlb19hdWRpbyAqdiwgaW50IHNldCk7CkBAIC01MTIsMTMgKzUxMCw4IEBACiAJLnN2aHMJCT0gMiwKIAkuZ3Bpb21hc2sJPSAweDAxZmUwMCwKIAkubXV4c2VsCQk9IHsgMiwgMywgMSwgMX0sCi0jaWYgMAotCS8vIG9sZAotCS5hdWRpb211eAk9IHsgMHgwMWMwMDAsIDAsIDB4MDE4MDAwLCAweDAxNDAwMCwgMHgwMDIwMDAsIDAgfSwKLSNlbHNlCiAJLy8gMjAwMy0xMC0yMCBieSAiQW50b24gQS4gQXJhcG92IiA8YXJhcG92QG1haWwucnU+CiAJLmF1ZGlvbXV4ICAgICAgID0geyAweDAwMWUwMCwgMCwgMHgwMTgwMDAsIDB4MDE0MDAwLCAweDAwMjAwMCwgMCB9LAotI2VuZGlmCiAJLm5lZWRzX3R2YXVkaW8JPSAxLAogCS5wbGwJCT0gUExMXzI4LAogCS50dW5lcl90eXBlCT0gLTEsCkBAIC03NjUsMTQgKzc1OCw5IEBACiAJLnR1bmVyCQk9IDAsCiAJLnN2aHMJCT0gMiwKIAkubXV4c2VsCQk9IHsgMiwgMywgMSwgMSwgMH0sIC8vIFRWLCBDVmlkLCBTVmlkLCBDVmlkIG92ZXIgU1ZpZCBjb25uZWN0b3IKLSNpZiAwCi0JLmdwaW9tYXNrCT0gMHhjMzMwMDAsCi0JLmF1ZGlvbXV4CT0geyAweDQyMjAwMCwweDEwMDAsMHgwMDAwLDB4NjIwMDAwLDB4ODAwMDAwIH0sCi0jZWxzZQogCS8qIEFsZXhhbmRlciBWYXJha2luIDxhdmFyYWtpbkBob3RtYWlsLmNvbT4gW3N0ZXJlbyB2ZXJzaW9uXSAqLwogCS5ncGlvbWFzawk9IDB4YjMzMDAwLAogCS5hdWRpb211eAk9IHsgMHgxMjIwMDAsMHgxMDAwLDB4MDAwMCwweDYyMDAwMCwweDgwMDAwMCB9LAotI2VuZGlmCiAJLyogQXVkaW8gUm91dGluZyBmb3IgIldpbkZhc3QgMjAwMCBYUCIgKG5vIHR2IHN0ZXJlbyAhKQogCQlncGlvMjMgLS0gaGVmNDA1MjpuRW5hYmxlICgweDgwMDAwMCkKIAkJZ3BpbzEyIC0tIGhlZjQwNTI6QTEKQEAgLTE2MDIsMjAgKzE1OTAsMTEgQEAKICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAogICAgICAgIC5hdWRpb19pbnB1dHMgICA9IDEsCiAgICAgICAgLnR1bmVyICAgICAgICAgID0gLTEsCi0jaWYgMCAvKiBUT0RPIC4uLiAqLwotICAgICAgIC5zdmhzICAgICAgICAgICA9IE9TUFJFWTU0MF9TVklEX0FOQUxPRywKLSAgICAgICAubXV4c2VsICAgICAgICAgPSB7ICAgICAgIFtPU1BSRVk1NDBfQ09NUF9BTkFMT0ddID0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbT1NQUkVZNTQwX1NWSURfQU5BTE9HXSA9IDMsIH0sCi0jZW5kaWYKICAgICAgICAucGxsICAgICAgICAgICAgPSBQTExfMjgsCiAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gLTEsCiAgICAgICAgLm5vX21zcDM0eHggICAgID0gMSwKICAgICAgICAubm9fdGRhOTg3NSAgICAgPSAxLAogICAgICAgIC5ub190ZGE3NDMyICAgICA9IDEsCi0jaWYgMCAvKiBUT0RPIC4uLiAqLwotICAgICAgIC5tdXhzZWxfaG9vayAgICA9IG9zcHJleV81NDBfbXV4c2VsLAotICAgICAgIC5waWN0dXJlX2hvb2sgICA9IG9zcHJleV81NDBfc2V0X3BpY3R1cmUsCi0jZW5kaWYKIH0sewogCiAJLyogLS0tLSBjYXJkIDB4NUMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjI1MSw2ICsyMjMwLDIwIEBACiAJLm5vX3RkYTc0MzIJPSAxLAogCS5ub190ZGE5ODc1CT0gMSwKIAkubXV4c2VsX2hvb2sJPSBrb2RpY29tNDQwMHJfbXV4c2VsLAorfSwKK3sKKyAgICAgICAgLyogLS0tLSBjYXJkIDB4ODUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIC8qIE1pY2hhZWwgSGVuc29uIDxtaGVuc29uQGNsYXJpdHl2aS5jb20+ICovCisgICAgICAgIC8qIEFkbGluayBSVFYyNCB3aXRoIHNwZWNpYWwgdW5sb2NrIGNvZGVzICovCisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBZGxpbmsgUlRWMjQiLAorICAgICAgICAudmlkZW9faW5wdXRzICAgPSA0LAorICAgICAgICAuYXVkaW9faW5wdXRzICAgPSAxLAorICAgICAgICAudHVuZXIgICAgICAgICAgPSAwLAorICAgICAgICAuc3ZocyAgICAgICAgICAgPSAyLAorICAgICAgICAubXV4c2VsICAgICAgICAgPSB7IDIsIDMsIDEsIDB9LAorICAgICAgICAudHVuZXJfdHlwZSAgICAgPSAtMSwKKyAgICAgICAgLnBsbCAgICAgICAgICAgID0gUExMXzI4LAorCiB9fTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBidHR2X251bV90dmNhcmRzID0gQVJSQVlfU0laRShidHR2X3R2Y2FyZHMpOwpAQCAtMjUzMSwyMSArMjUyNCwxMiBAQAogCWJ0YW9yKCgyKTw8NSwgfigzPDw1KSwgQlQ4NDhfSUZPUk0pOwogCWdwaW9fYml0cygzLGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0ubXV4c2VsW2lucHV0JjddKTsKIAotI2lmIDAKLSAgICAgICAvKiBzdmhzICovCi0gICAgICAgLyogd2FrZSBjaHJvbWEgQURDICovCi0gICAgICAgYnRhbmQofkJUODQ4X0FEQ19DX1NMRUVQLCBCVDg0OF9BREMpOwotICAgICAgIC8qIHNldCB0byBZQyB2aWRlbyAqLwotICAgICAgIGJ0b3IoQlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9FX0NPTlRST0wpOwotICAgICAgIGJ0b3IoQlQ4NDhfQ09OVFJPTF9DT01QLCBCVDg0OF9PX0NPTlRST0wpOwotI2Vsc2UKICAgICAgICAvKiBjb21wb3NpdGUgKi8KICAgICAgICAvKiBzZXQgY2hyb21hIEFEQyB0byBzbGVlcCAqLwogICAgICAgIGJ0b3IoQlQ4NDhfQURDX0NfU0xFRVAsIEJUODQ4X0FEQyk7CiAgICAgICAgLyogc2V0IHRvIGNvbXBvc2l0ZSB2aWRlbyAqLwogICAgICAgIGJ0YW5kKH5CVDg0OF9DT05UUk9MX0NPTVAsIEJUODQ4X0VfQ09OVFJPTCk7CiAgICAgICAgYnRhbmQofkJUODQ4X0NPTlRST0xfQ09NUCwgQlQ4NDhfT19DT05UUk9MKTsKLSNlbmRpZgogCiAgICAgICAgLyogc3dpdGNoIHN5bmMgZHJpdmUgb2ZmICovCiAgICAgICAgZ3Bpb19iaXRzKExNMTg4Ml9TWU5DX0RSSVZFLExNMTg4Ml9TWU5DX0RSSVZFKTsKQEAgLTI2MzYsNiArMjYyMCwxMCBAQAogCWNhc2UgQlRUVl9BVkRWQlRfNzcxOgogCQlidHYtPnVzZV9pMmNfaHcgPSAxOwogCQlicmVhazsKKyAgICAgICAgY2FzZSBCVFRWX0FETElOS19SVFYyNDoKKyAgICAgICAgICAgICAgICBpbml0X1JUVjI0KCBidHYgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwogCX0KIAlpZiAoIWJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uaGFzX2R2YikKIAkJYnR0dl9yZXNldF9hdWRpbyhidHYpOwpAQCAtMjc4NCw2ICsyNzcyLDggQEAKICAgICAgICAgfQogCWJ0di0+cGxsLnBsbF9jdXJyZW50ID0gLTE7CiAKKwlidHR2X3Jlc2V0X2F1ZGlvKGJ0dik7CisKIAkvKiB0dW5lciBjb25maWd1cmF0aW9uIChmcm9tIGNhcmQgbGlzdCAvIGF1dG9kZXRlY3QgLyBpbnNtb2Qgb3B0aW9uKSAqLwogIAlpZiAoVU5TRVQgIT0gYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS50dW5lcl90eXBlKQogCQlpZihVTlNFVCA9PSBidHYtPnR1bmVyX3R5cGUpCkBAIC0yNzkyLDEwICsyNzgyLDE4IEBACiAJCWJ0di0+dHVuZXJfdHlwZSA9IHR1bmVyW2J0di0+Yy5ucl07CiAJcHJpbnRrKCJidHR2JWQ6IHVzaW5nIHR1bmVyPSVkXG4iLGJ0di0+Yy5ucixidHYtPnR1bmVyX3R5cGUpOwogCWlmIChidHYtPnBpbm5hY2xlX2lkICE9IFVOU0VUKQotCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LEFVRENfQ09ORklHX1BJTk5BQ0xFLAorCQlidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LCBBVURDX0NPTkZJR19QSU5OQUNMRSwKIAkJCQkgICAgICAmYnR2LT5waW5uYWNsZV9pZCk7Ci0JaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKLQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixUVU5FUl9TRVRfVFlQRSwmYnR2LT50dW5lcl90eXBlKTsKKwlpZiAoYnR2LT50dW5lcl90eXBlICE9IFVOU0VUKSB7CisJICAgICAgICBzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOworCisJICAgICAgICB0dW5fc2V0dXAubW9kZV9tYXNrID0gVF9SQURJTyB8IFRfQU5BTE9HX1RWIHwgVF9ESUdJVEFMX1RWOworCQl0dW5fc2V0dXAudHlwZSA9IGJ0di0+dHVuZXJfdHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBBRERSX1VOU0VUOworCisJCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCX0KKwogCWJ0di0+c3ZocyA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uc3ZoczsKIAlpZiAoc3Zoc1tidHYtPmMubnJdICE9IFVOU0VUKQogCQlidHYtPnN2aHMgPSBzdmhzW2J0di0+Yy5ucl07CkBAIC0zMTA0LDE0ICszMTAyLDYgQEAKICAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19TRUNBTSwKICAgICAgICAgVFVORVJfUEhJTElQU19TRUNBTSwgVFVORVJfUEhJTElQU19QQUwsCiAJVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMgfTsKLSNpZiAwCi1pbnQgdHVuZXJfMF9mbV90YWJsZVtdID0gewotICAgICAgICBQSElMSVBTX0ZSMTIzNl9OVFNDLCAgUEhJTElQU19GUjEyMTZfUEFMLAotICAgICAgICBQSElMSVBTX0ZSMTIxNl9QQUwsICAgUEhJTElQU19GUjEyMTZfUEFMLAotICAgICAgICBQSElMSVBTX0ZSMTIxNl9QQUwsICAgUEhJTElQU19GUjEyMTZfUEFMLAotICAgICAgICBQSElMSVBTX0ZSMTIzNl9TRUNBTSwgUEhJTElQU19GUjEyMzZfU0VDQU0sCi0gICAgICAgIFBISUxJUFNfRlIxMjM2X1NFQ0FNLCBQSElMSVBTX0ZSMTIxNl9QQUx9OwotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdHVuZXJfMV90YWJsZVtdID0gewogICAgICAgICBUVU5FUl9URU1JQ19OVFNDLCAgVFVORVJfVEVNSUNfUEFMLApAQCAtMzE5NywzNiArMzE4Nyw2IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBib290X2J0ODMyKHN0cnVjdCBidHR2ICpidHYpCiB7Ci0jaWYgMCAvKiBub3Qgd29ya2luZyB5ZXQgKi8KLQlpbnQgcmVzZXRiaXQ9MDsKLQotCXN3aXRjaCAoYnR2LT5jLnR5cGUpIHsKLQljYXNlIEJUVFZfUFhFTFZXUExUVlBBSzoKLQkJcmVzZXRiaXQgPSAweDQwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBCVFRWX01PRFRFQ18yMDU6Ci0JCXJlc2V0Yml0ID0gMTw8OTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JcmVxdWVzdF9tb2R1bGUoImJ0ODMyIik7Ci0JYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQlQ4MzJfSEVYRFVNUCwgTlVMTCk7Ci0KLQlwcmludGsoImJ0dHYlZDogUmVzZXQgQnQ4MzIgW2xpbmU9MHgleF1cbiIsYnR2LT5jLm5yLHJlc2V0Yml0KTsKLQlncGlvX3dyaXRlKDApOwotCWdwaW9faW5vdXQocmVzZXRiaXQsIHJlc2V0Yml0KTsKLQl1ZGVsYXkoNSk7Ci0JZ3Bpb19iaXRzKHJlc2V0Yml0LCByZXNldGJpdCk7Ci0JdWRlbGF5KDUpOwotCWdwaW9fYml0cyhyZXNldGJpdCwgMCk7Ci0JdWRlbGF5KDUpOwotCi0JLy8gYnQ4MzIgb24gcGl4ZWx2aWV3IGNoYW5nZXMgZnJvbSBpMmMgMHg4YSB0byAweDg4IGFmdGVyCi0JLy8gYmVpbmcgcmVzZXQgYXMgYWJvdmUuIFNvIHdlIG11c3QgZm9sbG93IGJ5IHRoaXM6Ci0JYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0diwgQlQ4MzJfUkVBVFRBQ0gsIE5VTEwpOwotI2VuZGlmCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzA0LDYgKzMyNjQsODMgQEAKIH0KIAogCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogIFRoZSBBZGxpbmsgUlRWLTI0IChha2EgQW5nZWxvKSBoYXMgc29tZSBzcGVjaWFsIGluaXRpYWxpc2F0aW9uIHRvIHVubG9jaworICogIGl0LiBUaGlzIGFwcGFyZW50bHkgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgZm9yIGVhY2ggODc4IGNoaXA6CisgKgorICogIDEpIHdyaXRlIDB4MDBDM0ZFRkYgdG8gdGhlIEdQSU9fT1VUX0VOIHJlZ2lzdGVyCisgKgorICogIDIpICB3cml0ZSB0byBHUElPX0RBVEEKKyAqICAgICAgLSAweDBFCisgKiAgICAgIC0gc2xlZXAgMW1zCisgKiAgICAgIC0gMHgxMCArIDB4MEUKKyAqICAgICAgLSBzbGVlcCAxMG1zCisgKiAgICAgIC0gMHgwRQorICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCisgKiAgICAgIC0gaWYgKCBkYXRhPj4xOCAmIDB4MDEgIT0gMCkgfHwgKCBidWY+PjE5ICYgMHgwMSAhPSAxICkKKyAqICAgICAgICAgICAgICAgICBlcnJvci4gRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgc3RvcC4KKyAqCisgKiAgMykgd3JpdGUgdG8gR1BJT19EQVRBCisgKiAgICAgIC0gd3JpdGUgMHg0NDAwICsgMHgwRQorICogICAgICAtIHNsZWVwIDEwbXMKKyAqICAgICAgLSB3cml0ZSAweDQ0MTAgKyAweDBFCisgKiAgICAgIC0gc2xlZXAgMW1zCisgKiAgICAgIC0gd3JpdGUgMHgwRQorICogICAgIHJlYWQgZnJvbSBHUElPX0RBVEEgaW50byBidWYgKHVpbnRfMzIpCisgKiAgICAgIC0gaWYgKCBidWY+PjE4ICYgMHgwMSApIHx8ICggYnVmPj4xOSAmJiAweDAxICE9IDAgKQorICogICAgICAgICAgICAgICAgZXJyb3IuIEVSUk9SX0NQTERfQ2hlY2tfRmFpbGVkLgorICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordm9pZAoraW5pdF9SVFYyNCAoc3RydWN0IGJ0dHYgKmJ0dikKK3sKKwl1aW50MzJfdCBkYXRhUmVhZCA9IDA7CisJbG9uZyB3YXRjaGRvZ192YWx1ZSA9IDB4MEU7CisKKwlwcmludGsgKEtFUk5fSU5GTworCQkiYnR0diVkOiBBZGxpbmsgUlRWLTI0IGluaXRpYWxpc2F0aW9uIGluIHByb2dyZXNzIC4uLlxuIiwKKwkJYnR2LT5jLm5yKTsKKworCWJ0d3JpdGUgKDB4MDBjM2ZlZmYsIEJUODQ4X0dQSU9fT1VUX0VOKTsKKworCWJ0d3JpdGUgKDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKKwltc2xlZXAgKDEpOworCWJ0d3JpdGUgKDB4MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKKwltc2xlZXAgKDEwKTsKKwlidHdyaXRlICgwICsgd2F0Y2hkb2dfdmFsdWUsIEJUODQ4X0dQSU9fREFUQSk7CisKKwlkYXRhUmVhZCA9IGJ0cmVhZCAoQlQ4NDhfR1BJT19EQVRBKTsKKworCWlmICgoKChkYXRhUmVhZCA+PiAxOCkgJiAweDAxKSAhPSAwKSB8fCAoKChkYXRhUmVhZCA+PiAxOSkgJiAweDAxKSAhPSAxKSkgeworCQlwcmludGsgKEtFUk5fSU5GTworCQkJImJ0dHYlZDogQWRsaW5rIFJUVi0yNCBpbml0aWFsaXNhdGlvbigxKSBFUlJPUl9DUExEX0NoZWNrX0ZhaWxlZCAocmVhZCAlZClcbiIsCisJCQlidHYtPmMubnIsIGRhdGFSZWFkKTsKKwl9CisKKwlidHdyaXRlICgweDQ0MDAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKKwltc2xlZXAgKDEwKTsKKwlidHdyaXRlICgweDQ0MTAgKyB3YXRjaGRvZ192YWx1ZSwgQlQ4NDhfR1BJT19EQVRBKTsKKwltc2xlZXAgKDEpOworCWJ0d3JpdGUgKHdhdGNoZG9nX3ZhbHVlLCBCVDg0OF9HUElPX0RBVEEpOworCW1zbGVlcCAoMSk7CisJZGF0YVJlYWQgPSBidHJlYWQgKEJUODQ4X0dQSU9fREFUQSk7CisKKwlpZiAoKCgoZGF0YVJlYWQgPj4gMTgpICYgMHgwMSkgIT0gMCkgfHwgKCgoZGF0YVJlYWQgPj4gMTkpICYgMHgwMSkgIT0gMCkpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8KKwkJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24oMikgRVJST1JfQ1BMRF9DaGVja19GYWlsZWQgKHJlYWQgJWQpXG4iLAorCQkJYnR2LT5jLm5yLCBkYXRhUmVhZCk7CisKKwkJcmV0dXJuOworCX0KKworCXByaW50ayAoS0VSTl9JTkZPCisJCSJidHR2JWQ6IEFkbGluayBSVFYtMjQgaW5pdGlhbGlzYXRpb24gY29tcGxldGUuXG4iLCBidHYtPmMubnIpOworfQorCisKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIE1pcm8gUHJvIHJhZGlvIHN0dWZmIC0tIHRoZSB0ZWE1NzU3IGlzIGNvbm5lY3RlZCB0byBzb21lIEdQSU8gcG9ydHMgICAgICovCiAvKgpAQCAtMzQ3NCwxMSArMzUxMSw2IEBACiB7CiAJZHByaW50aygidGVhNTc1N19zZXRfZnJlcSAlZFxuIixmcmVxKTsKIAl0ZWE1NzU3X3dyaXRlKGJ0diwgNSAqIGZyZXEgKyAweDM1OCk7IC8qIGFkZCAxMC43TUh6IChzZWUgZG9jcykgKi8KLSNpZiAwCi0JLyogYnJlYWtzIE1pcm8gUENUViAqLwotCXZhbHVlID0gdGVhNTc1N19yZWFkKGJ0dik7Ci0JZHByaW50aygiYnR0diVkOiB0ZWE1NzU3IHJlYWRiYWNrPTB4JXhcbiIsYnR2LT5jLm5yLHZhbHVlKTsKLSNlbmRpZgogfQogCiAKQEAgLTM1NTgsMTMgKzM1OTAsOCBAQAogewogCXVuc2lnbmVkIGludCB2YWwsIGNvbjsKIAotI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCiAJaWYgKGJ0di0+cmFkaW9fdXNlcikKIAkJcmV0dXJuOwotI2Vsc2UKLQlpZiAoYnR2LT5yYWRpbykKLQkJcmV0dXJuOwotI2VuZGlmCiAKIAl2YWwgPSBncGlvX3JlYWQoKTsKIAlpZiAoc2V0KSB7CkBAIC0zNzUzLDEzICszNzgwLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsID0gMDsKIAotI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCiAJaWYgKGJ0di0+cmFkaW9fdXNlcikKIAkJcmV0dXJuOwotI2Vsc2UKLQlpZiAoYnR2LT5yYWRpbykKLQkJcmV0dXJuOwotI2VuZGlmCiAKIAlpZiAoc2V0KSB7CiAJCWlmICh2LT5tb2RlICYgVklERU9fU09VTkRfTU9OTykJewpAQCAtMzc5MCwxMyArMzgxMiw4IEBACiB7CiAJdW5zaWduZWQgaW50IHZhbCA9IDB4ZmZmZjsKIAotI2lmIEJUVFZfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMCw4LDApCiAJaWYgKGJ0di0+cmFkaW9fdXNlcikKIAkJcmV0dXJuOwotI2Vsc2UKLQlpZiAoYnR2LT5yYWRpbykKLQkJcmV0dXJuOwotI2VuZGlmCiAJaWYgKHNldCkgewogCQlpZiAodi0+bW9kZSAmIFZJREVPX1NPVU5EX01PTk8pCXsKIAkJCXZhbCA9IDB4MDAwMDsKQEAgLTQyNzMsMTEgKzQyOTAsNiBAQAogCQlsYXRlbmN5ID0gMHgwQTsKICNlbmRpZgogCi0jaWYgMAotCS8qIHByaW50IHdoaWNoIGNoaXBzZXQgd2UgaGF2ZSAqLwotCXdoaWxlICgoZGV2ID0gcGNpX2ZpbmRfY2xhc3MoUENJX0NMQVNTX0JSSURHRV9IT1NUIDw8IDgsZGV2KSkpCi0JCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IEhvc3QgYnJpZGdlIGlzICVzXG4iLHBjaV9uYW1lKGRldikpOwotI2VuZGlmCiAKIAkvKiBwcmludCB3YXJuaW5ncyBhYm91dCBhbnkgcXVpcmtzIGZvdW5kICovCiAJaWYgKHRyaXRvbjEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtZHJpdmVyLmMKaW5kZXggMDMzY2M1NC4uNTFhMGY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1kcml2ZXIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBidHR2LWRyaXZlci5jLHYgMS4zNyAyMDA1LzAyLzIxIDEzOjU3OjU5IGtyYXhlbCBFeHAgJAorICAgICRJZDogYnR0di1kcml2ZXIuYyx2IDEuNDIgMjAwNS8wNy8wNSAxNzozNzozNSBuc2ggRXhwICQKIAogICAgIGJ0dHYgLSBCdDg0OCBmcmFtZSBncmFiYmVyIGRyaXZlcgogCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpAQCAtNzYsNiArNzcsOSBAQAogc3RhdGljIHVuc2lnbmVkIGludCB3aGl0ZWNydXNoX2xvd2VyID0gMHg3RjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmNyX2hhY2sgICAgPSAwOwogc3RhdGljIHVuc2lnbmVkIGludCBpcnFfaXN3aXRjaCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHV2X3JhdGlvICAgID0gNTA7CitzdGF0aWMgdW5zaWduZWQgaW50IGZ1bGxfbHVtYV9yYW5nZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvcmluZyAgICAgID0gMDsKIAogLyogQVBJIGZlYXR1cmVzICh0dXJuIG9uL29mZiBzdHVmZiBmb3IgdGVzdGluZykgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgdjRsMiAgICAgICAgPSAxOwpAQCAtMTA2LDYgKzExMCw5IEBACiBtb2R1bGVfcGFyYW0od2hpdGVjcnVzaF91cHBlciwgIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0od2hpdGVjcnVzaF9sb3dlciwgIGludCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0odmNyX2hhY2ssICAgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0odXZfcmF0aW8sICAgICAgICAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZnVsbF9sdW1hX3JhbmdlLCAgIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oY29yaW5nLCAgICAgICAgICAgIGludCwgMDQ0NCk7CiAKIG1vZHVsZV9wYXJhbV9hcnJheShyYWRpbywgaW50LCBOVUxMLCAwNDQ0KTsKIApAQCAtMTI0LDYgKzEzMSw5IEBACiBNT0RVTEVfUEFSTV9ERVNDKHdoaXRlY3J1c2hfbG93ZXIsInNldHMgdGhlIHdoaXRlIGNydXNoIGxvd2VyIHZhbHVlLCBkZWZhdWx0IGlzIDEyNyIpOwogTU9EVUxFX1BBUk1fREVTQyh2Y3JfaGFjaywiZW5hYmxlcyB0aGUgVkNSIGhhY2sgKGltcHJvdmVzIHN5bmNoIG9uIHBvb3IgVkNSIHRhcGVzKSwgZGVmYXVsdCBpcyAwIChubykiKTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJxX2lzd2l0Y2gsInN3aXRjaCBpbnB1dHMgaW4gaXJxIGhhbmRsZXIiKTsKK01PRFVMRV9QQVJNX0RFU0ModXZfcmF0aW8sInJhdGlvIGJldHdlZW4gdSBhbmQgdiBnYWlucywgZGVmYXVsdCBpcyA1MCIpOworTU9EVUxFX1BBUk1fREVTQyhmdWxsX2x1bWFfcmFuZ2UsInVzZSB0aGUgZnVsbCBsdW1hIHJhbmdlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOworTU9EVUxFX1BBUk1fREVTQyhjb3JpbmcsInNldCB0aGUgbHVtYSBjb3JpbmcgbGV2ZWwsIGRlZmF1bHQgaXMgMCAobm8pIik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiYnR0diAtIHY0bC92NGwyIGRyaXZlciBtb2R1bGUgZm9yIGJ0ODQ4Lzg3OCBiYXNlZCBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciAmIE1hcmN1cyBNZXR6bGVyICYgR2VyZCBLbm9yciIpOwpAQCAtNDg0LDcgKzQ5NCwxMCBAQAogI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1ZDUl9IQUNLICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1KQogI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1dISVRFQ1JVU0hfVVBQRVIgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNikKICNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9XSElURUNSVVNIX0xPV0VSICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDcpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfTEFTVFAxICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDgpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfVVZfUkFUSU8gICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDgpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfRlVMTF9MVU1BX1JBTkdFICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0NPUklORyAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMCkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9MQVNUUDEgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTEpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgbm9fY3RsID0gewogCS5uYW1lICA9ICI0MiIsCkBAIC02MTgsOCArNjMxLDMyIEBACiAJCS5zdGVwICAgICAgICAgID0gMSwKIAkJLmRlZmF1bHRfdmFsdWUgPSAweDdGLAogCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfSx7CisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfUFJJVkFURV9VVl9SQVRJTywKKwkJLm5hbWUgICAgICAgICAgPSAidXYgcmF0aW8iLAorCQkubWluaW11bSAgICAgICA9IDAsCisJCS5tYXhpbXVtICAgICAgID0gMTAwLAorCQkuc3RlcCAgICAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gNTAsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0ZVTExfTFVNQV9SQU5HRSwKKwkJLm5hbWUgICAgICAgICAgPSAiZnVsbCBsdW1hIHJhbmdlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwl9LHsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0NPUklORywKKwkJLm5hbWUgICAgICAgICAgPSAiY29yaW5nIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDMsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJfQogCisKKwogfTsKIHN0YXRpYyBjb25zdCBpbnQgQlRUVl9DVExTID0gQVJSQVlfU0laRShidHR2X2N0bHMpOwogCkBAIC02NjIsMTIgKzY5OSwxMCBAQAogc3RhdGljCiB2b2lkIGZyZWVfYnRyZXMoc3RydWN0IGJ0dHYgKmJ0diwgc3RydWN0IGJ0dHZfZmggKmZoLCBpbnQgYml0cykKIHsKLSNpZiAxIC8qIERFQlVHICovCiAJaWYgKChmaC0+cmVzb3VyY2VzICYgYml0cykgIT0gYml0cykgewogCQkvKiB0cnlpbmcgdG8gZnJlZSByZXNzb3VyY2VzIG5vdCBhbGxvY2F0ZWQgYnkgdXMgLi4uICovCiAJCXByaW50aygiYnR0djogQlVHISAoYnRyZXMpXG4iKTsKIAl9Ci0jZW5kaWYKIAlkb3duKCZidHYtPnJlc2xvY2spOwogCWZoLT5yZXNvdXJjZXMgICY9IH5iaXRzOwogCWJ0di0+cmVzb3VyY2VzICY9IH5iaXRzOwpAQCAtODMzLDggKzg2OCw4IEBACiAJYnR2LT5zYXR1cmF0aW9uID0gY29sb3I7CiAKIAkvKiAwLTUxMSBmb3IgdGhlIGNvbG9yICovCi0JdmFsX3UgICA9IGNvbG9yID4+IDc7Ci0JdmFsX3YgICA9ICgoY29sb3I+PjcpKjE4MEwpLzI1NDsKKwl2YWxfdSAgID0gKChjb2xvciAqIGJ0di0+b3B0X3V2X3JhdGlvKSAvIDUwKSA+PiA3OworCXZhbF92ICAgPSAoKChjb2xvciAqICgxMDAgLSBidHYtPm9wdF91dl9yYXRpbykgLyA1MCkgPj43KSoxODBMKS8yNTQ7CiAgICAgICAgIGhpYml0cyAgPSAodmFsX3UgPj4gNykgJiAyOwogCWhpYml0cyB8PSAodmFsX3YgPj4gOCkgJiAxOwogICAgICAgICBidHdyaXRlKHZhbF91ICYgMHhmZiwgQlQ4NDhfU0FUX1VfTE8pOwpAQCAtOTA3LDExICs5NDIsNiBAQAogCWkyY19tdXggPSBtdXggPSAoYnR2LT5hdWRpbyAmIEFVRElPX01VVEUpID8gQVVESU9fT0ZGIDogYnR2LT5hdWRpbzsKIAlpZiAoYnR2LT5vcHRfYXV0b211dGUgJiYgIXNpZ25hbCAmJiAhYnR2LT5yYWRpb191c2VyKQogCQltdXggPSBBVURJT19PRkY7Ci0jaWYgMAotCXByaW50aygiYnR0diVkOiBhbXV4OiBtb2RlPSVkIGF1ZGlvPSVkIHNpZ25hbD0lcyBtdXg9JWQvJWQgaXJxPSVzXG4iLAotCSAgICAgICBidHYtPmMubnIsIG1vZGUsIGJ0di0+YXVkaW8sIHNpZ25hbCA/ICJ5ZXMiIDogIm5vIiwKLQkgICAgICAgbXV4LCBpMmNfbXV4LCBpbl9pbnRlcnJ1cHQoKSA/ICJ5ZXMiIDogIm5vIik7Ci0jZW5kaWYKIAogCXZhbCA9IGJ0dHZfdHZjYXJkc1tidHYtPmMudHlwZV0uYXVkaW9tdXhbbXV4XTsKIAlncGlvX2JpdHMoYnR0dl90dmNhcmRzW2J0di0+Yy50eXBlXS5ncGlvbWFzayx2YWwpOwpAQCAtOTU4LDExICs5ODgsNiBAQAogCWNhc2UgQlRUVl9WT09ET09UVl9GTToKIAkJYnR0dl90ZGE5ODgwX3NldG5vcm0oYnR2LG5vcm0pOwogCQlicmVhazsKLSNpZiAwCi0JY2FzZSBCVFRWX09TUFJFWTU0MDoKLQkJb3NwcmV5XzU0MF9zZXRfbm9ybShidHYsbm9ybSk7Ci0JCWJyZWFrOwotI2VuZGlmCiAJfQogCXJldHVybiAwOwogfQpAQCAtMTE1MSw2ICsxMTc2LDE1IEBACiAJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1dISVRFQ1JVU0hfTE9XRVI6CiAJCWMtPnZhbHVlID0gYnR2LT5vcHRfd2hpdGVjcnVzaF9sb3dlcjsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1VWX1JBVElPOgorCQljLT52YWx1ZSA9IGJ0di0+b3B0X3V2X3JhdGlvOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfRlVMTF9MVU1BX1JBTkdFOgorCQljLT52YWx1ZSA9IGJ0di0+b3B0X2Z1bGxfbHVtYV9yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPUklORzoKKwkJYy0+dmFsdWUgPSBidHYtPm9wdF9jb3Jpbmc7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEyNDcsNiArMTI4MSwxOCBAQAogCQlidHYtPm9wdF93aGl0ZWNydXNoX2xvd2VyID0gYy0+dmFsdWU7CiAJCWJ0d3JpdGUoYy0+dmFsdWUsIEJUODQ4X1dDX0RPV04pOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfVVZfUkFUSU86CisJCWJ0di0+b3B0X3V2X3JhdGlvID0gYy0+dmFsdWU7CisJCWJ0ODQ4X3NhdChidHYsIGJ0di0+c2F0dXJhdGlvbik7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfUFJJVkFURV9GVUxMX0xVTUFfUkFOR0U6CisJCWJ0di0+b3B0X2Z1bGxfbHVtYV9yYW5nZSA9IGMtPnZhbHVlOworCQlidGFvcigoYy0+dmFsdWU8PDcpLCB+QlQ4NDhfT0ZPUk1fUkFOR0UsIEJUODQ4X09GT1JNKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPUklORzoKKwkJYnR2LT5vcHRfY29yaW5nID0gYy0+dmFsdWU7CisJCWJ0YW9yKChjLT52YWx1ZTw8NSksIH5CVDg0OF9PRk9STV9DT1JFMzIsIEJUODQ4X09GT1JNKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTc5Miw3ICsxODM4LDcgQEAKIAogCQlpZiAodW5saWtlbHkoZi0+dHVuZXIgIT0gMCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKHVubGlrZWx5KGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpKQorCQlpZiAodW5saWtlbHkgKGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWRvd24oJmJ0di0+bG9jayk7CiAJCWJ0di0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKQEAgLTMxMTcsMTEgKzMxNjMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7CiAgICAgICAgICAgICAgICAgc3RyY3B5KHYtPm5hbWUsICJSYWRpbyIpOwotICAgICAgICAgICAgICAgIC8qIGphcGFuOiAgICAgICAgICA3Ni4wIE1IeiAtICA4OS45IE1IegotICAgICAgICAgICAgICAgICAgIHdlc3Rlcm4gZXVyb3BlOiA4Ny41IE1IeiAtIDEwOC4wIE1IegotICAgICAgICAgICAgICAgICAgIHJ1c3NpYTogICAgICAgICA2NS4wIE1IeiAtIDEwOC4wIE1IeiAqLwotICAgICAgICAgICAgICAgIHYtPnJhbmdlbG93PShpbnQpKDY1KjE2KTsKLSAgICAgICAgICAgICAgICB2LT5yYW5nZWhpZ2g9KGludCkoMTA4KjE2KTsKICAgICAgICAgICAgICAgICBidHR2X2NhbGxfaTJjX2NsaWVudHMoYnR2LGNtZCx2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtMzgxMyw3ICszODU0LDcgQEAKIAkJICAgICAgIGJ0di0+Yy5ucik7CiAJCXJldHVybiAtRUlPOwogCX0KLSAgICAgICAgaWYgKHBjaV9zZXRfZG1hX21hc2soZGV2LCAweGZmZmZmZmZmKSkgeworICAgICAgICBpZiAocGNpX3NldF9kbWFfbWFzayhkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImJ0dHYlZDogTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIsCiAJCSAgICAgICBidHYtPmMubnIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTM4NzYsNiArMzkxNyw5IEBACiAJYnR2LT5vcHRfdmNyX2hhY2sgICA9IHZjcl9oYWNrOwogCWJ0di0+b3B0X3doaXRlY3J1c2hfdXBwZXIgID0gd2hpdGVjcnVzaF91cHBlcjsKIAlidHYtPm9wdF93aGl0ZWNydXNoX2xvd2VyICA9IHdoaXRlY3J1c2hfbG93ZXI7CisJYnR2LT5vcHRfdXZfcmF0aW8gICA9IHV2X3JhdGlvOworCWJ0di0+b3B0X2Z1bGxfbHVtYV9yYW5nZSAgID0gZnVsbF9sdW1hX3JhbmdlOworCWJ0di0+b3B0X2NvcmluZyAgICAgPSBjb3Jpbmc7CiAKIAkvKiBmaWxsIHN0cnVjdCBidHR2IHdpdGggc29tZSB1c2VmdWwgZGVmYXVsdHMgKi8KIAlidHYtPmluaXQuYnR2ICAgICAgICAgPSBidHY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtaTJjLmMKaW5kZXggYzIzNjhiYy4uMjM0YTg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1pMmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBidHR2LWkyYy5jLHYgMS4xOCAyMDA1LzAyLzE2IDEyOjE0OjEwIGtyYXhlbCBFeHAgJAorICAgICRJZDogYnR0di1pMmMuYyx2IDEuMjUgMjAwNS8wNy8wNSAxNzozNzozNSBuc2ggRXhwICQKIAogICAgIGJ0dHYtaTJjLmMgIC0tICBhbGwgdGhlIGkyYyBjb2RlIGlzIGhlcmUKIApAQCAtMjk1LDE0ICsyOTUsMjYgQEAKIHsKICAgICAgICAgc3RydWN0IGJ0dHYgKmJ0diA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKIAotCWlmIChidHYtPnR1bmVyX3R5cGUgIT0gVU5TRVQpCi0JCWJ0dHZfY2FsbF9pMmNfY2xpZW50cyhidHYsVFVORVJfU0VUX1RZUEUsJmJ0di0+dHVuZXJfdHlwZSk7CisJaWYgKGJ0dHZfZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICJidHR2JWQ6ICVzIGkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAorCQkJYnR2LT5jLm5yLGNsaWVudC0+ZHJpdmVyLT5uYW1lLGNsaWVudC0+YWRkciwKKwkJCWkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCWlmICghY2xpZW50LT5kcml2ZXItPmNvbW1hbmQpCisJCXJldHVybiAwOworCisJaWYgKGJ0di0+dHVuZXJfdHlwZSAhPSBVTlNFVCkgeworCSAgICAgICAgc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKKworCSAgICAgICAgdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKKwkJdHVuX3NldHVwLnR5cGUgPSBidHYtPnR1bmVyX3R5cGU7CisJCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKworCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZCAoY2xpZW50LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKKwl9CisKIAlpZiAoYnR2LT5waW5uYWNsZV9pZCAhPSBVTlNFVCkKLQkJYnR0dl9jYWxsX2kyY19jbGllbnRzKGJ0dixBVURDX0NPTkZJR19QSU5OQUNMRSwKKwkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LEFVRENfQ09ORklHX1BJTk5BQ0xFLAogCQkJCSAgICAgICZidHYtPnBpbm5hY2xlX2lkKTsKLSAgICAgICAgaWYgKGJ0dHZfZGVidWcpCi0JCXByaW50aygiYnR0diVkOiBpMmMgYXR0YWNoIFtjbGllbnQ9JXNdXG4iLAotCQkgICAgICAgYnR2LT5jLm5yLCBpMmNfY2xpZW50bmFtZShjbGllbnQpKTsKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHYtcmlzYy5jCmluZGV4IGJkYzVjZTYuLjllZDIxZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di1yaXNjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LXJpc2MuYwpAQCAtMzM0LDEwICszMzQsNiBAQAogCX0KIAogCXZkZWxheSA9IHR2bm9ybS0+dmRlbGF5OwotI2lmIDAgLyogRklYTUUgKi8KLQlpZiAodmRlbGF5IDwgYnR2LT52YmkubGluZXMqMikKLQkJdmRlbGF5ID0gYnR2LT52YmkubGluZXMqMjsKLSNlbmRpZgogCiAgICAgICAgIHhzZiA9ICh3aWR0aCpzY2FsZWR0d2lkdGgpL3N3aWR0aDsKICAgICAgICAgZ2VvLT5oc2NhbGUgPSAgKCh0b3RhbHdpZHRoKjQwOTZVTCkveHNmLTQwOTYpOwpAQCAtNzc2LDEzICs3NzIsOCBAQAogCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPmJvdHRvbSwgZm10LCBvdiwgMCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOgotI2lmIDAKLQkJYnR0dl9yaXNjX292ZXJsYXkoYnR2LCAmYnVmLT50b3AsICAgIGZtdCwgb3YsIDEsIDApOwotCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPmJvdHRvbSwgZm10LCBvdiwgMCwgMSk7Ci0jZWxzZQogCQlidHR2X3Jpc2Nfb3ZlcmxheShidHYsICZidWYtPnRvcCwgICAgZm10LCBvdiwgMCwgMSk7CiAJCWJ0dHZfcmlzY19vdmVybGF5KGJ0diwgJmJ1Zi0+Ym90dG9tLCBmbXQsIG92LCAxLCAwKTsKLSNlbmRpZgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0di5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmgKaW5kZXggODMyMmI2Ni4uMTkxZWFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBidHR2LmgsdiAxLjE3IDIwMDUvMDIvMjIgMTQ6MDY6MzIga3JheGVsIEV4cCAkCisgKiAkSWQ6IGJ0dHYuaCx2IDEuMTggMjAwNS8wNS8yNCAyMzo0MTo0MiBuc2ggRXhwICQKICAqCiAgKiAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCiAgKgpAQCAtMTM1LDYgKzEzNSw3IEBACiAjZGVmaW5lIEJUVFZfRFZJQ09fRFZCVF9MSVRFICAweDgwCiAjZGVmaW5lIEJUVFZfVElCRVRfQ1MxNiAgMHg4MwogI2RlZmluZSBCVFRWX0tPRElDT01fNDQwMFIgIDB4ODQKKyNkZWZpbmUgQlRUVl9BRExJTktfUlRWMjQgICAweDg1CiAKIC8qIGkyYyBhZGRyZXNzIGxpc3QgKi8KICNkZWZpbmUgSTJDX1RTQTU1MjIgICAgICAgIDB4YzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnR0dnAuaAppbmRleCAxYTliYTdlLi5mMzI5M2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idHR2cC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICAkSWQ6IGJ0dHZwLmgsdiAxLjE3IDIwMDUvMDIvMTYgMTI6MTQ6MTAga3JheGVsIEV4cCAkCisgICAgJElkOiBidHR2cC5oLHYgMS4xOSAyMDA1LzA2LzE2IDIxOjM4OjQ1IG5zaCBFeHAgJAogCiAgICAgYnR0diAtIEJ0ODQ4IGZyYW1lIGdyYWJiZXIgZHJpdmVyCiAKQEAgLTIyNiwxMCArMjI2LDYgQEAKICNkZWZpbmUgZHByaW50ayAgaWYgKGJ0dHZfZGVidWcgPj0gMSkgcHJpbnRrCiAjZGVmaW5lIGQycHJpbnRrIGlmIChidHR2X2RlYnVnID49IDIpIHByaW50awogCi0vKiBvdXIgZGV2aWNlcyAqLwotI2RlZmluZSBCVFRWX01BWCAxNgotZXh0ZXJuIHVuc2lnbmVkIGludCBidHR2X251bTsKLQogI2RlZmluZSBCVFRWX01BWF9GQlVGICAgMHgyMDgwMDAKICNkZWZpbmUgVkJJQlVGX1NJWkUgICAgICgyMDQ4KlZCSV9NQVhMSU5FUyoyKQogI2RlZmluZSBCVFRWX1RJTUVPVVQgICAgKEhaLzIpIC8qIDAuNSBzZWNvbmRzICovCkBAIC0zMzAsNiArMzI2LDkgQEAKIAlpbnQgb3B0X3Zjcl9oYWNrOwogCWludCBvcHRfd2hpdGVjcnVzaF91cHBlcjsKIAlpbnQgb3B0X3doaXRlY3J1c2hfbG93ZXI7CisJaW50IG9wdF91dl9yYXRpbzsKKwlpbnQgb3B0X2Z1bGxfbHVtYV9yYW5nZTsKKwlpbnQgb3B0X2NvcmluZzsKIAogCS8qIHJhZGlvIGRhdGEvc3RhdGUgKi8KIAlpbnQgaGFzX3JhZGlvOwpAQCAtMzc1LDYgKzM3NCwxMCBAQAogCXVuc2lnbmVkIGludCB1c2VyczsKIAlzdHJ1Y3QgYnR0dl9maCBpbml0OwogfTsKKworLyogb3VyIGRldmljZXMgKi8KKyNkZWZpbmUgQlRUVl9NQVggMTYKK2V4dGVybiB1bnNpZ25lZCBpbnQgYnR0dl9udW07CiBleHRlcm4gc3RydWN0IGJ0dHYgYnR0dnNbQlRUVl9NQVhdOwogCiAvKiBwcml2YXRlIGlvY3RscyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwppbmRleCA0NmQ2Nzc4Li40ZjM5Njg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtYmxhY2tiaXJkLmMsdiAxLjI2IDIwMDUvMDMvMDcgMTU6NTg6MDUga3JheGVsIEV4cCAkCisgKiAkSWQ6IGN4ODgtYmxhY2tiaXJkLmMsdiAxLjI3IDIwMDUvMDYvMDMgMTM6MzE6NTAgbWNoZWhhYiBFeHAgJAogICoKICAqICBTdXBwb3J0IGZvciBhIGN4MjM0MTYgbXBlZyBlbmNvZGVyIHZpYSBjeDIzODh4IGhvc3QgcG9ydC4KICAqICAiYmxhY2tiaXJkIiByZWZlcmVuY2UgZGVzaWduLgpAQCAtNjEsMzcgKzYxLDMwNCBAQAogCiAjZGVmaW5lIElWVFZfQ01EX0hXX0JMT0NLU19SU1QgMHhGRkZGRkZGRgogCi0vKkZpcm13YXJlIEFQSSBjb21tYW5kcyovCi0jZGVmaW5lIElWVFZfQVBJX0VOQ19QSU5HX0ZXIDB4MDAwMDAwODAKLSNkZWZpbmUgSVZUVl9BUElfRU5DX0dFVFZFUiAweDAwMDAwMEM0Ci0jZGVmaW5lIElWVFZfQVBJX0VOQ19IQUxUX0ZXIDB4MDAwMDAwQzMKLSNkZWZpbmUgSVZUVl9BUElfU1REX1RJTUVPVVQgMHgwMDAxMDAwMCAvKnVuaXRzPz8qLwotLy8jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9QR01fSU5ERVhfSU5GTyAweDAwMDAwMGM3Ci0jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9TVFJFQU1fVFlQRSAweDAwMDAwMGI5Ci0jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9PVVRQVVRfUE9SVCAweDAwMDAwMGJiCi0jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9GUkFNRVJBVEUgMHgwMDAwMDA4ZgotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fRlJBTUVfU0laRSAweDAwMDAwMDkxCi0jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9BU1BFQ1RfUkFUSU8gMHgwMDAwMDA5OQotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fQklUUkFURVMgMHgwMDAwMDA5NQotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fR09QX1BST1BFUlRJRVMgMHgwMDAwMDA5NwotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fM18yX1BVTExET1dOIDB4MDAwMDAwYjEKLSNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0dPUF9DTE9TVVJFIDB4MDAwMDAwYzUKLSNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0FVRElPX1BST1BFUlRJRVMgMHgwMDAwMDBiZAotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fRE5SX0ZJTFRFUl9NT0RFIDB4MDAwMDAwOWIKLSNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0ROUl9GSUxURVJfUFJPUFMgMHgwMDAwMDA5ZAotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fQ09SSU5HX0xFVkVMUyAweDAwMDAwMDlmCi0jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9TUEFUSUFMX0ZJTFRFUl9UWVBFIDB4MDAwMDAwYTEKLSNkZWZpbmUgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX0RST1BfUkFURSAweDAwMDAwMGQwCi0jZGVmaW5lIElWVFZfQVBJX0FTU0lHTl9QTEFDRUhPTERFUiAweDAwMDAwMGQ4Ci0jZGVmaW5lIElWVFZfQVBJX01VVEVfVklERU8gMHgwMDAwMDBkOQotI2RlZmluZSBJVlRWX0FQSV9NVVRFX0FVRElPIDB4MDAwMDAwZGEKLSNkZWZpbmUgSVZUVl9BUElfSU5JVElBTElaRV9JTlBVVCAweDAwMDAwMGNkCi0jZGVmaW5lIElWVFZfQVBJX1JFRlJFU0hfSU5QVVQgMHgwMDAwMDBkMwotI2RlZmluZSBJVlRWX0FQSV9BU1NJR05fTlVNX1ZTWU5DX0xJTkVTIDB4MDAwMDAwZDYKLSNkZWZpbmUgSVZUVl9BUElfQkVHSU5fQ0FQVFVSRSAweDAwMDAwMDgxCi0vLyNkZWZpbmUgSVZUVl9BUElfUEFVU0VfRU5DT0RFUiAweDAwMDAwMGQyCi0vLyNkZWZpbmUgSVZUVl9BUElfRVZFTlRfTk9USUZJQ0FUSU9OIDB4MDAwMDAwZDUKLSNkZWZpbmUgSVZUVl9BUElfRU5EX0NBUFRVUkUgMHgwMDAwMDA4MgorLyogRmlybXdhcmUgQVBJIGNvbW1hbmRzICovCisvKiAjZGVmaW5lIElWVFZfQVBJX1NURF9USU1FT1VUIDB4MDAwMTAwMDAgLy8gNjU1MzYsIHVuaXRzPz8gKi8KKyNkZWZpbmUgSVZUVl9BUElfU1REX1RJTUVPVVQgNTAwCisKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9QSU5HICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBCTEFDS0JJUkRfQVBJX0JFR0lOX0NBUFRVUkUgICAgICAweDgxCitlbnVtIGJsYWNrYmlyZF9jYXB0dXJlX3R5cGUgeworCUJMQUNLQklSRF9NUEVHX0NBUFRVUkUsCisJQkxBQ0tCSVJEX1JBV19DQVBUVVJFLAorCUJMQUNLQklSRF9SQVdfUEFTU1RIUlVfQ0FQVFVSRQorfTsKK2VudW0gYmxhY2tiaXJkX2NhcHR1cmVfYml0cyB7CisJQkxBQ0tCSVJEX1JBV19CSVRTX05PTkUgICAgICAgICAgICAgPSAweDAwLAorCUJMQUNLQklSRF9SQVdfQklUU19ZVVZfQ0FQVFVSRSAgICAgID0gMHgwMSwKKwlCTEFDS0JJUkRfUkFXX0JJVFNfUENNX0NBUFRVUkUgICAgICA9IDB4MDIsCisJQkxBQ0tCSVJEX1JBV19CSVRTX1ZCSV9DQVBUVVJFICAgICAgPSAweDA0LAorCUJMQUNLQklSRF9SQVdfQklUU19QQVNTVEhSVV9DQVBUVVJFID0gMHgwOCwKKwlCTEFDS0JJUkRfUkFXX0JJVFNfVE9fSE9TVF9DQVBUVVJFICA9IDB4MTAKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfRU5EX0NBUFRVUkUgICAgICAgIDB4ODIKK2VudW0gYmxhY2tiaXJkX2NhcHR1cmVfZW5kIHsKKwlCTEFDS0JJUkRfRU5EX0FUX0dPUCwgLyogc3RvcCBhdCB0aGUgZW5kIG9mIGdvcCwgZ2VuZXJhdGUgaXJxICovCisJQkxBQ0tCSVJEX0VORF9OT1csIC8qIHN0b3AgaW1tZWRpYXRlbHksIG5vIGlycSAqLworfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfQVVESU9fSUQgICAgICAgMHg4OQorI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9WSURFT19JRCAgICAgICAweDhCCisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1BDUl9JRCAgICAgICAgIDB4OEQKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfRlJBTUVSQVRFICAgICAgMHg4RgorZW51bSBibGFja2JpcmRfZnJhbWVyYXRlIHsKKwlCTEFDS0JJUkRfRlJBTUVSQVRFX05UU0NfMzAsIC8qIE5UU0M6IDMwZnBzICovCisJQkxBQ0tCSVJEX0ZSQU1FUkFURV9QQUxfMjUgICAvKiBQQUw6IDI1ZnBzICovCit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9SRVNPTFVUSU9OICAgICAweDkxCisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1ZJREVPX0JJVFJBVEUgIDB4OTUKK2VudW0gYmxhY2tiaXJkX3ZpZGVvX2JpdHJhdGVfdHlwZSB7CisJQkxBQ0tCSVJEX1ZJREVPX1ZCUiwKKwlCTEFDS0JJUkRfVklERU9fQ0JSCit9OworI2RlZmluZSBCTEFDS0JJUkRfUEVBS19SQVRFX0RJVklTT1IgNDAwCitlbnVtIGJsYWNrYmlyZF9tdXhfcmF0ZSB7CisJQkxBQ0tCSVJEX01VWF9SQVRFX0RFRkFVTFQsCisJIC8qIGR2ZCBtdXggcmF0ZTogbXVsdGlwbHkgYnkgNDAwIHRvIGdldCB0aGUgYWN0dWFsIHJhdGUgKi8KKwlCTEFDS0JJUkRfTVVYX1JBVEVfRFZEID0gMjUyMDAKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0dPUF9TVFJVQ1RVUkUgIDB4OTcKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfQVNQRUNUX1JBVElPICAgMHg5OQorZW51bSBibGFja2JpcmRfYXNwZWN0X3JhdGlvIHsKKwlCTEFDS0JJUkRfQVNQRUNUX1JBVElPX0ZPUkJJRERFTiwKKwlCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzFfMV9TUVVBUkUsCisJQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT180XzMsCisJQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT18xNl85LAorCUJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fMjIxXzEwMCwKKwlCTEFDS0JJUkRfQVNQRUNUX1JBVElPX1JFU0VSVkVECit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9ETlJfTU9ERSAgICAgICAweDlCCitlbnVtIGJsYWNrYmlyZF9kbnJfYml0cyB7CisJQkxBQ0tCSVJEX0ROUl9CSVRTX01BTlVBTCwKKwlCTEFDS0JJUkRfRE5SX0JJVFNfQVVUT19TUEFUSUFMLAorCUJMQUNLQklSRF9ETlJfQklUU19BVVRPX1RFTVBPUkFMLAorCUJMQUNLQklSRF9ETlJfQklUU19BVVRPCit9OworZW51bSBibGFja2JpcmRfbWVkaWFuX2ZpbHRlciB7CisJQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfRElTQUJMRUQsCisJQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfSE9SSVpPTlRBTCwKKwlCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9WRVJUSUNBTCwKKwlCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9IViwKKwlCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9ESUFHT05BTAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfTUFOVUFMX0ROUiAgICAgMHg5RAorI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9ETlJfTUVESUFOICAgICAweDlGCisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1NQQVRJQUxfRklMVEVSIDB4QTEKK2VudW0gYmxhY2tiaXJkX3NwYXRpYWxfZmlsdGVyX2x1bWEgeworCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9MVU1BX0RJU0FCTEVELAorCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9MVU1BXzFEX0hPUklaLAorCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9MVU1BXzFEX1ZFUlQsCisJQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0xVTUFfMkRfSFYsIC8qIHNlcGFyYWJsZSwgZGVmYXVsdCAqLworCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9MVU1BXzJEX1NZTU0gLyogc3ltbWV0cmljIG5vbi1zZXBhcmFibGUgKi8KK307CitlbnVtIGJsYWNrYmlyZF9zcGF0aWFsX2ZpbHRlcl9jaHJvbWEgeworCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9DSFJPTUFfRElTQUJMRUQsCisJQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0NIUk9NQV8xRF9IT1JJWiAvKiBkZWZhdWx0ICovCit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF8zXzJfUFVMTERPV04gICAweEIxCitlbnVtIGJsYWNrYmlyZF9wdWxsZG93biB7CisJQkxBQ0tCSVJEXzNfMl9QVUxMRE9XTl9ESVNBQkxFRCwKKwlCTEFDS0JJUkRfM18yX1BVTExET1dOX0VOQUJMRUQKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1ZCSV9MSU5FX05PICAgIDB4QjcKK2VudW0gYmxhY2tiaXJkX3ZiaV9saW5lX2JpdHMgeworCUJMQUNLQklSRF9WQklfTElORV9CSVRTX1RPUF9GSUVMRCwKKwlCTEFDS0JJUkRfVkJJX0xJTkVfQklUU19CT1RfRklFTEQgPSAoMSA8PCAzMSksCisJQkxBQ0tCSVJEX1ZCSV9MSU5FX0JJVFNfQUxMX0xJTkVTID0gMHhGRkZGRkZGRgorfTsKK2VudW0gYmxhY2tiaXJkX3ZiaV9saW5lIHsKKwlCTEFDS0JJUkRfVkJJX0xJTkVfRElTQUJMRUQsCisJQkxBQ0tCSVJEX1ZCSV9MSU5FX0VOQUJMRUQKK307CitlbnVtIGJsYWNrYmlyZF92Ymlfc2xpY2luZyB7CisJQkxBQ0tCSVJEX1ZCSV9TTElDSU5HX05PTkUsCisJQkxBQ0tCSVJEX1ZCSV9TTElDSU5HX0NMT1NFRF9DQVBUSU9OCit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9TVFJFQU1fVFlQRSAgICAweEI5CitlbnVtIGJsYWNrYmlyZF9zdHJlYW1fdHlwZSB7CisJQkxBQ0tCSVJEX1NUUkVBTV9QUk9HUkFNLAorCUJMQUNLQklSRF9TVFJFQU1fVFJBTlNQT1JULAorCUJMQUNLQklSRF9TVFJFQU1fTVBFRzEsCisJQkxBQ0tCSVJEX1NUUkVBTV9QRVNfQVYsCisJQkxBQ0tCSVJEX1NUUkVBTV9VTktOT1dONCwKKwlCTEFDS0JJUkRfU1RSRUFNX1BFU19WSURFTywKKwlCTEFDS0JJUkRfU1RSRUFNX1VOS05PV042LAorCUJMQUNLQklSRF9TVFJFQU1fUEVTX0FVRElPLAorCUJMQUNLQklSRF9TVFJFQU1fVU5LTk9XTjgsCisJQkxBQ0tCSVJEX1NUUkVBTV9VTktOT1dOOSwgLyogYXVkaW8vcGNtID8gKi8KKwlCTEFDS0JJUkRfU1RSRUFNX0RWRCwKKwlCTEFDS0JJUkRfU1RSRUFNX1ZDRCwKKwlCTEFDS0JJUkRfU1RSRUFNX1VOS05PV04xMiAvKiBzdmNkL3h2Y2QgPyAqLworfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfT1VUUFVUX1BPUlQgICAgMHhCQgorZW51bSBibGFja2JpcmRfc3RyZWFtX3BvcnQgeworCUJMQUNLQklSRF9PVVRQVVRfUE9SVF9NRU1PUlksCisJQkxBQ0tCSVJEX09VVFBVVF9QT1JUX1NUUkVBTUlORywKKwlCTEFDS0JJUkRfT1VUUFVUX1BPUlRfU0VSSUFMCit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9BVURJT19QQVJBTVMgICAweEJECitlbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX3NhbXBsZV9yYXRlIHsKKwlCTEFDS0JJUkRfQVVESU9fQklUU180NDEwMEhaLAorCUJMQUNLQklSRF9BVURJT19CSVRTXzQ4MDAwSFosCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfMzIwMDBIWiwKKwlCTEFDS0JJUkRfQVVESU9fQklUU19SRVNFUlZFRF9IWiwKK307CitlbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX2VuY29kaW5nIHsKKwlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xID0gMHgxIDw8IDIsCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMiA9IDB4MiA8PCAyLAorfTsKK2VudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfYml0cmF0ZV9sYXllcl8xIHsKKwlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xX0ZSRUVfRk9STUFULAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzIgID0gMHgwMSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNjQgID0gMHgwMiA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfOTYgID0gMHgwMyA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTI4ID0gMHgwNCA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTYwID0gMHgwNSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMTkyID0gMHgwNiA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMjI0ID0gMHgwNyA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMjU2ID0gMHgwOCA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMjg4ID0gMHgwOSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzIwID0gMHgwQSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzUyID0gMHgwQiA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfMzg0ID0gMHgwQyA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNDE2ID0gMHgwRCA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfNDQ4ID0gMHgwRSA8PCA0LAorfTsKK2VudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfYml0cmF0ZV9sYXllcl8yIHsKKwlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yX0ZSRUVfRk9STUFULAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzIgID0gMHgwMSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfNDggID0gMHgwMiA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfNTYgID0gMHgwMyA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfNjQgID0gMHgwNCA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfODAgID0gMHgwNSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfOTYgID0gMHgwNiA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTEyID0gMHgwNyA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTI4ID0gMHgwOCA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTYwID0gMHgwOSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTkyID0gMHgwQSA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMjI0ID0gMHgwQiA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMjU2ID0gMHgwQyA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzIwID0gMHgwRCA8PCA0LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzg0ID0gMHgwRSA8PCA0LAorfTsKK2VudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfbW9kZSB7CisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfU1RFUkVPLAorCUJMQUNLQklSRF9BVURJT19CSVRTX0pPSU5UX1NURVJFTyA9IDB4MSA8PCA4LAorCUJMQUNLQklSRF9BVURJT19CSVRTX0RVQUwgICAgICAgICA9IDB4MiA8PCA4LAorCUJMQUNLQklSRF9BVURJT19CSVRTX01PTk8gICAgICAgICA9IDB4MyA8PCA4LAorfTsKK2VudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfbW9kZV9leHRlbnNpb24geworCUJMQUNLQklSRF9BVURJT19CSVRTX0JPVU5EXzQsCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfOCAgPSAweDEgPDwgMTAsCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfMTIgPSAweDIgPDwgMTAsCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfMTYgPSAweDMgPDwgMTAsCit9OworZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19lbXBoYXNpcyB7CisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfRU1QSEFTSVNfTk9ORSwKKwlCTEFDS0JJUkRfQVVESU9fQklUU19FTVBIQVNJU181MF8xNSAgICAgPSAweDEgPDwgMTIsCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfRU1QSEFTSVNfUkVTRVJWRUQgID0gMHgyIDw8IDEyLAorCUJMQUNLQklSRF9BVURJT19CSVRTX0VNUEhBU0lTX0NDSVRUX0oxNyA9IDB4MyA8PCAxMiwKK307CitlbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX2NyYyB7CisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ1JDX09GRiwKKwlCTEFDS0JJUkRfQVVESU9fQklUU19DUkNfT04gPSAweDEgPDwgMTQsCit9OworZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19jb3B5cmlnaHQgeworCUJMQUNLQklSRF9BVURJT19CSVRTX0NPUFlSSUdIVF9PRkYsCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWVJJR0hUX09OID0gMHgxIDw8IDE1LAorfTsKK2VudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfb3JpZ2luYWwgeworCUJMQUNLQklSRF9BVURJT19CSVRTX0NPUFksCisJQkxBQ0tCSVJEX0FVRElPX0JJVFNfT1JJR0lOQUwgPSAweDEgPDwgMTYsCit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX0hBTFQgICAgICAgICAgICAgICAweEMzCisjZGVmaW5lIEJMQUNLQklSRF9BUElfR0VUX1ZFUlNJT04gICAgICAgIDB4QzQKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfR09QX0NMT1NVUkUgICAgMHhDNQorZW51bSBibGFja2JpcmRfZ29wX2Nsb3N1cmUgeworCUJMQUNLQklSRF9HT1BfQ0xPU1VSRV9PRkYsCisJQkxBQ0tCSVJEX0dPUF9DTE9TVVJFX09OLAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9EQVRBX1hGRVJfU1RBVFVTICAgMHhDNgorZW51bSBibGFja2JpcmRfZGF0YV94ZmVyX3N0YXR1cyB7CisJQkxBQ0tCSVJEX01PUkVfQlVGRkVSU19GT0xMT1csCisJQkxBQ0tCSVJEX0xBU1RfQlVGRkVSLAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9QUk9HUkFNX0lOREVYX0lORk8gMHhDNworZW51bSBibGFja2JpcmRfcGljdHVyZV9tYXNrIHsKKwlCTEFDS0JJUkRfUElDVFVSRV9NQVNLX05PTkUsCisJQkxBQ0tCSVJEX1BJQ1RVUkVfTUFTS19JX0ZSQU1FUywKKwlCTEFDS0JJUkRfUElDVFVSRV9NQVNLX0lfUF9GUkFNRVMgPSAweDMsCisJQkxBQ0tCSVJEX1BJQ1RVUkVfTUFTS19BTExfRlJBTUVTID0gMHg3LAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfVkJJX1BBUkFNUyAgICAgMHhDOAorZW51bSBibGFja2JpcmRfdmJpX21vZGVfYml0cyB7CisJQkxBQ0tCSVJEX1ZCSV9CSVRTX1NMSUNFRCwKKwlCTEFDS0JJUkRfVkJJX0JJVFNfUkFXLAorfTsKK2VudW0gYmxhY2tiaXJkX3ZiaV9pbnNlcnRpb25fYml0cyB7CisJQkxBQ0tCSVJEX1ZCSV9CSVRTX0lOU0VSVF9JTl9YVEVOU0lPTl9VU1JfREFUQSwKKwlCTEFDS0JJUkRfVkJJX0JJVFNfSU5TRVJUX0lOX1BSSVZBVEVfUEFDS0VUUyA9IDB4MSA8PCAxLAorCUJMQUNLQklSRF9WQklfQklUU19TRVBBUkFURV9TVFJFQU0gPSAweDIgPDwgMSwKKwlCTEFDS0JJUkRfVkJJX0JJVFNfU0VQQVJBVEVfU1RSRUFNX1VTUl9EQVRBID0gMHg0IDw8IDEsCisJQkxBQ0tCSVJEX1ZCSV9CSVRTX1NFUEFSQVRFX1NUUkVBTV9QUlZfREFUQSA9IDB4NSA8PCAxLAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfRE1BX0JMT0NLX1NJWkUgMHhDOQorZW51bSBibGFja2JpcmRfZG1hX3VuaXQgeworCUJMQUNLQklSRF9ETUFfQllURVMsCisJQkxBQ0tCSVJEX0RNQV9GUkFNRVMsCit9OworI2RlZmluZSBCTEFDS0JJUkRfQVBJX0RNQV9UUkFOU0ZFUl9JTkZPICAweENBCisjZGVmaW5lIEJMQUNLQklSRF9BUElfRE1BX1RSQU5TRkVSX1NUQVQgIDB4Q0IKK2VudW0gYmxhY2tiaXJkX2RtYV90cmFuc2Zlcl9zdGF0dXNfYml0cyB7CisJQkxBQ0tCSVJEX0RNQV9UUkFOU0ZFUl9CSVRTX0RPTkUgPSAweDAxLAorCUJMQUNLQklSRF9ETUFfVFJBTlNGRVJfQklUU19FUlJPUiA9IDB4MDQsCisJQkxBQ0tCSVJEX0RNQV9UUkFOU0ZFUl9CSVRTX0xMX0VSUk9SID0gMHgxMCwKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0RNQTJIT1NUX0FERFIgIDB4Q0MKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9JTklUX1ZJREVPX0lOUFVUICAgMHhDRAorI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9GUkFNRVNLSVAgICAgICAweEQwCisjZGVmaW5lIEJMQUNLQklSRF9BUElfUEFVU0UgICAgICAgICAgICAgIDB4RDIKK2VudW0gYmxhY2tiaXJkX3BhdXNlIHsKKwlCTEFDS0JJUkRfUEFVU0VfRU5DT0RJTkcsCisJQkxBQ0tCSVJEX1JFU1VNRV9FTkNPRElORywKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfUkVGUkVTSF9JTlBVVCAgICAgIDB4RDMKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfQ09QWVJJR0hUICAgICAgMHhENAorZW51bSBibGFja2JpcmRfY29weXJpZ2h0IHsKKwlCTEFDS0JJUkRfQ09QWVJJR0hUX09GRiwKKwlCTEFDS0JJUkRfQ09QWVJJR0hUX09OLAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfTk9USUZJQ0FUSU9OICAgMHhENQorZW51bSBibGFja2JpcmRfbm90aWZpY2F0aW9uX3R5cGUgeworCUJMQUNLQklSRF9OT1RJRklDQVRJT05fUkVGUkVTSCwKK307CitlbnVtIGJsYWNrYmlyZF9ub3RpZmljYXRpb25fc3RhdHVzIHsKKwlCTEFDS0JJUkRfTk9USUZJQ0FUSU9OX09GRiwKKwlCTEFDS0JJUkRfTk9USUZJQ0FUSU9OX09OLAorfTsKK2VudW0gYmxhY2tiaXJkX25vdGlmaWNhdGlvbl9tYWlsYm94IHsKKwlCTEFDS0JJUkRfTk9USUZJQ0FUSU9OX05PX01BSUxCT1ggPSAtMSwKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0NBUFRVUkVfTElORVMgIDB4RDYKK2VudW0gYmxhY2tiaXJkX2ZpZWxkMV9saW5lcyB7CisJQkxBQ0tCSVJEX0ZJRUxEMV9TQUE3MTE0ID0gMHgwMEVGLCAvKiAyMzkgKi8KKwlCTEFDS0JJUkRfRklFTEQxX1NBQTcxMTUgPSAweDAwRjAsIC8qIDI0MCAqLworCUJMQUNLQklSRF9GSUVMRDFfTUlDUk9OQVMgPSAweDAxMDUsIC8qIDI2MSAqLworfTsKK2VudW0gYmxhY2tiaXJkX2ZpZWxkMl9saW5lcyB7CisJQkxBQ0tCSVJEX0ZJRUxEMl9TQUE3MTE0ID0gMHgwMEVGLCAvKiAyMzkgKi8KKwlCTEFDS0JJUkRfRklFTEQyX1NBQTcxMTUgPSAweDAwRjAsIC8qIDI0MCAqLworCUJMQUNLQklSRF9GSUVMRDJfTUlDUk9OQVMgPSAweDAxMDYsIC8qIDI2MiAqLworfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfQ1VTVE9NX0RBVEEgICAgMHhENworZW51bSBibGFja2JpcmRfY3VzdG9tX2RhdGFfdHlwZSB7CisJQkxBQ0tCSVJEX0NVU1RPTV9FWFRFTlNJT05fVVNSX0RBVEEsCisJQkxBQ0tCSVJEX0NVU1RPTV9QUklWQVRFX1BBQ0tFVCwKK307CisjZGVmaW5lIEJMQUNLQklSRF9BUElfTVVURV9WSURFTyAgICAgICAgIDB4RDkKK2VudW0gYmxhY2tiaXJkX211dGUgeworCUJMQUNLQklSRF9VTk1VVEUsCisJQkxBQ0tCSVJEX01VVEUsCit9OworZW51bSBibGFja2JpcmRfbXV0ZV92aWRlb19tYXNrIHsKKwlCTEFDS0JJUkRfTVVURV9WSURFT19WX01BU0sgPSAweDAwMDBGRjAwLAorCUJMQUNLQklSRF9NVVRFX1ZJREVPX1VfTUFTSyA9IDB4MDBGRjAwMDAsCisJQkxBQ0tCSVJEX01VVEVfVklERU9fWV9NQVNLID0gMHhGRjAwMDAwMCwKK307CitlbnVtIGJsYWNrYmlyZF9tdXRlX3ZpZGVvX3NoaWZ0IHsKKwlCTEFDS0JJUkRfTVVURV9WSURFT19WX1NISUZUID0gOCwKKwlCTEFDS0JJUkRfTVVURV9WSURFT19VX1NISUZUID0gMTYsCisJQkxBQ0tCSVJEX01VVEVfVklERU9fWV9TSElGVCA9IDI0LAorfTsKKyNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9NVVRFX0FVRElPICAgICAgICAgMHhEQQogCiAvKiBSZWdpc3RlcnMgKi8KICNkZWZpbmUgSVZUVl9SRUdfRU5DX1NEUkFNX1JFRlJFU0ggKDB4MDdGOCAvKnwgSVZUVl9SRUdfT0ZGU0VUKi8pCkBAIC00MDUsNjggKzY3Miw5OCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyBTZXR0aW5ncyB1c2VkIGJ5IHRoZSB3aW5kb3dzIHR2IGFwcCBmb3IgUFZSMjAwMDoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQcm9maWxlIHwgQ29kZWMgfCBSZXNvbHV0aW9uIHwgQ0JSL1ZCUiB8IFZpZGVvIFFsdHkgICB8IFYuIEJpdHJhdGUgfCBGcm1yYXRlIHwgQXVkaW8gQ29kZWMgfCBBLiBCaXRyYXRlIHwgQS4gTW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01QRUctMSAgfCBNUEVHMSB8IDM1MngyODhQQUwgfCAoQ0JSKSAgIHwgMTAwMDpPcHRpbWFsIHwgMjAwMCBLYnBzICB8IDI1ZnBzICAgfCBNUEcxIExheWVyMiB8IDIyNGticHMgICAgfCBTdGVyZW8KK01QRUctMiAgfCBNUEVHMiB8IDcyMHg1NzZQQUwgfCBWQlIgICAgIHwgNjAwIDpHb29kICAgIHwgNDAwMCBLYnBzICB8IDI1ZnBzICAgfCBNUEcxIExheWVyMiB8IDIyNGticHMgICAgfCBTdGVyZW8KK1ZDRCAgICAgfCBNUEVHMSB8IDM1MngyODhQQUwgfCAoQ0JSKSAgIHwgMTAwMDpPcHRpbWFsIHwgMTE1MCBLYnBzICB8IDI1ZnBzICAgfCBNUEcxIExheWVyMiB8IDIyNGticHMgICAgfCBTdGVyZW8KK0RWRCAgICAgfCBNUEVHMiB8IDcyMHg1NzZQQUwgfCBWQlIgICAgIHwgNjAwIDpHb29kICAgIHwgNjAwMCBLYnBzICB8IDI1ZnBzICAgfCBNUEcxIExheWVyMiB8IDIyNGticHMgICAgfCBTdGVyZW8KK0RCKiBEVkQgfCBNUEVHMiB8IDcyMHg1NzZQQUwgfCBDQlIgICAgIHwgNjAwIDpHb29kICAgIHwgNjAwMCBLYnBzICB8IDI1ZnBzICAgfCBNUEcxIExheWVyMiB8IDIyNGticHMgICAgfCBTdGVyZW8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqREI6ICJEaXJlY3RCdXJuIgorKi8KIHN0YXRpYyB2b2lkIGJsYWNrYmlyZF9jb2RlY19zZXR0aW5ncyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCWludCBiaXRyYXRlX21vZGUgPSAxOwogCWludCBiaXRyYXRlID0gNzUwMDAwMDsKIAlpbnQgYml0cmF0ZV9wZWFrID0gNzUwMDAwMDsKKwliaXRyYXRlX21vZGUgPSBCTEFDS0JJUkRfVklERU9fQ0JSOworCWJpdHJhdGUgPSA0MDAwKjEwMjQ7CisJYml0cmF0ZV9wZWFrID0gNDAwMCoxMDI0OwogCiAJLyogYXNzaWduIHN0cmVhbSB0eXBlICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1NUUkVBTV9UWVBFLCAxLCAwLCAwKTsgLyogcHJvZ3JhbSBzdHJlYW0gKi8KLSAgICAgICAgLy9ibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9TVFJFQU1fVFlQRSwgMSwgMCwgMik7IC8qIE1QRUcxIHN0cmVhbSAqLwotICAgICAgICAvL2JsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1NUUkVBTV9UWVBFLCAxLCAwLCAzKTsgLyogUEVTIEEvViAqLwotICAgICAgICAvL2JsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1NUUkVBTV9UWVBFLCAxLCAwLCAxMCk7IC8qIERWRCBzdHJlYW0gKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1NUUkVBTV9UWVBFLCAxLCAwLCBCTEFDS0JJUkRfU1RSRUFNX1BST0dSQU0pOworCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUsIDEsIDAsIEJMQUNLQklSRF9TVFJFQU1fVFJBTlNQT1JUKTsgKi8KIAotICAgICAgICAvKiBhc3NpZ24gb3V0cHV0IHBvcnQgKi8KLSAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fT1VUUFVUX1BPUlQsIDEsIDAsIDEpOyAvKiAxID0gSG9zdCAqLworCS8qIGFzc2lnbiBvdXRwdXQgcG9ydCAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfT1VUUFVUX1BPUlQsIDEsIDAsIEJMQUNLQklSRF9PVVRQVVRfUE9SVF9TVFJFQU1JTkcpOyAvKiBIb3N0ICovCiAKLSAgICAgICAgLyogYXNzaWduIGZyYW1lcmF0ZSAqLwotICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9GUkFNRVJBVEUsIDEsIDAsIDApOworCS8qIGFzc2lnbiBmcmFtZXJhdGUgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0ZSQU1FUkFURSwgMSwgMCwgQkxBQ0tCSVJEX0ZSQU1FUkFURV9QQUxfMjUpOwogCi0gICAgICAgIC8qIGFzc2lnbiBmcmFtZSBzaXplICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX1NJWkUsIDIsIDAsCisJLyogYXNzaWduIGZyYW1lIHNpemUgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1JFU09MVVRJT04sIDIsIDAsCiAJCQkgIGRldi0+aGVpZ2h0LCBkZXYtPndpZHRoKTsKIAotICAgICAgICAvKiBhc3NpZ24gYXNwZWN0IHJhdGlvICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0FTUEVDVF9SQVRJTywgMSwgMCwgMik7CisJLyogYXNzaWduIGFzcGVjdCByYXRpbyAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfQVNQRUNUX1JBVElPLCAxLCAwLCBCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzRfMyk7CiAKLSAgICAgICAgLyogYXNzaWduIGJpdHJhdGVzICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0JJVFJBVEVTLCA1LCAwLAorCS8qIGFzc2lnbiBiaXRyYXRlcyAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfVklERU9fQklUUkFURSwgNSwgMCwKIAkJCSBiaXRyYXRlX21vZGUsICAgICAgICAgLyogbW9kZSAqLwogCQkJIGJpdHJhdGUsICAgICAgICAgICAgICAvKiBicHMgKi8KLQkJCSBiaXRyYXRlX3BlYWsgLyA0MDAsICAgLyogcGVhay80MDAgKi8KLQkJCSAwLCAweDcwKTsgICAgICAgICAgICAgLyogZW5jb2RpbmcgYnVmZmVyLCBja2VubmVkeSAqLworCQkJIGJpdHJhdGVfcGVhayAvIEJMQUNLQklSRF9QRUFLX1JBVEVfRElWSVNPUiwgICAvKiBwZWFrLzQwMCAqLworCQkJIEJMQUNLQklSRF9NVVhfUkFURV9ERUZBVUxUIC8qLCAweDcwKi8pOyAgICAgICAgICAgICAvKiBlbmNvZGluZyBidWZmZXIsIGNrZW5uZWR5ICovCiAKLSAgICAgICAgLyogYXNzaWduIGdvcCBwcm9wZXJ0aWVzICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0dPUF9QUk9QRVJUSUVTLCAyLCAwLCAxNSwgMyk7Ci0gICAgICAgIC8vYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fR09QX1BST1BFUlRJRVMsIDIsIDAsIDIsIDEpOworCS8qIGFzc2lnbiBnb3AgcHJvcGVydGllcyAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfR09QX1NUUlVDVFVSRSwgMiwgMCwgMTUsIDMpOwogCi0gICAgICAgIC8qIGFzc2lnbiAzIDIgcHVsbGRvd24gKi8KLSAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fM18yX1BVTExET1dOLCAxLCAwLCAwKTsKKwkvKiBhc3NpZ24gMyAyIHB1bGxkb3duICovCisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF8zXzJfUFVMTERPV04sIDEsIDAsIEJMQUNLQklSRF8zXzJfUFVMTERPV05fRElTQUJMRUQpOwogCi0gICAgICAgIC8qIG5vdGU6IGl0J3Mgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNhbXBsZXJhdGUsIHRoZSBtcGVnIGVuY29kZXIgc2VlbXMgdG8gYXV0b2RldGVjdC9hZGp1c3QgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9BVURJT19QUk9QRVJUSUVTLCAxLCAwLCAoMjw8MikgfCAoODw8NCkpOworCS8qIGFzc2lnbiBhdWRpbyBwcm9wZXJ0aWVzICovCisJLyogbm90ZTogaXQncyBub3QgbmVjZXNzYXJ5IHRvIHNldCB0aGUgc2FtcGxlcmF0ZSwgdGhlIG1wZWcgZW5jb2RlciBzZWVtcyB0byBhdXRvZGV0ZWN0L2FkanVzdCAqLworCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0FVRElPX1BST1BFUlRJRVMsIDEsIDAsICgyPDwyKSB8ICg4PDw0KSk7CisJICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fQVVESU9fUFJPUEVSVElFUywgMSwgMCwgMCB8ICgyIDw8IDIpIHwgKDE0IDw8IDQpKTsgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0FVRElPX1BBUkFNUywgMSwgMCwKKwkJCUJMQUNLQklSRF9BVURJT19CSVRTXzQ0MTAwSFogfAorCQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMiB8CisJCQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yXzIyNCB8CisJCQlCTEFDS0JJUkRfQVVESU9fQklUU19TVEVSRU8gfAorCQkJLyogQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfNCB8ICovCisJCQlCTEFDS0JJUkRfQVVESU9fQklUU19FTVBIQVNJU19OT05FIHwKKwkJCUJMQUNLQklSRF9BVURJT19CSVRTX0NSQ19PRkYgfAorCQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWVJJR0hUX09GRiB8CisJCQlCTEFDS0JJUkRfQVVESU9fQklUU19DT1BZCisJCSk7CiAKIAkvKiBhc3NpZ24gZ29wIGNsb3N1cmUgKi8KLSAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fR09QX0NMT1NVUkUsIDEsIDAsIDApOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfR09QX0NMT1NVUkUsIDEsIDAsIEJMQUNLQklSRF9HT1BfQ0xPU1VSRV9PRkYpOwogCi0gICAgICAgIC8qIGFzc2lnbiBhdWRpbyBwcm9wZXJ0aWVzICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0FVRElPX1BST1BFUlRJRVMsIDEsIDAsIDAgfCAoMiA8PCAyKSB8ICgxNCA8PCA0KSk7CiAKLSAgICAgICAgLyogYXNzaWduIGRuciBmaWx0ZXIgbW9kZSAqLwotICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9ETlJfRklMVEVSX01PREUsIDIsIDAsIDAsIDApOworCS8qIGFzc2lnbiBkbnIgZmlsdGVyIG1vZGUgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0ROUl9NT0RFLCAyLCAwLAorCQkJQkxBQ0tCSVJEX0ROUl9CSVRTX01BTlVBTCwKKwkJCUJMQUNLQklSRF9NRURJQU5fRklMVEVSX0RJU0FCTEVECisJCSk7CiAKLSAgICAgICAgLyogYXNzaWduIGRuciBmaWx0ZXIgcHJvcHMqLwotICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9ETlJfRklMVEVSX1BST1BTLCAyLCAwLCAwLCAwKTsKKwkvKiBhc3NpZ24gZG5yIGZpbHRlciBwcm9wcyovCisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9NQU5VQUxfRE5SLCAyLCAwLCAwLCAwKTsKIAotICAgICAgICAvKiBhc3NpZ24gY29yaW5nIGxldmVscyAobHVtYV9oLCBsdW1hX2wsIGNocm9tYV9oLCBjaHJvbWFfbCkgKi8KLSAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fQ09SSU5HX0xFVkVMUywgNCwgMCwgMCwgMjU1LCAwLCAyNTUpOworCS8qIGFzc2lnbiBjb3JpbmcgbGV2ZWxzIChsdW1hX2gsIGx1bWFfbCwgY2hyb21hX2gsIGNocm9tYV9sKSAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRE5SX01FRElBTiwgNCwgMCwgMCwgMjU1LCAwLCAyNTUpOwogCi0JLyogYXNzaWduIHNwYXRpYWwgZmlsdGVyIHR5cGU6IGx1bWFfdDogMSA9IGhvcml6X29ubHksIGNocm9tYV90OiAxID0gaG9yaXpfb25seSAqLwotICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9TUEFUSUFMX0ZJTFRFUl9UWVBFLCAyLCAwLCAxLCAxKTsKKwkvKiBhc3NpZ24gc3BhdGlhbCBmaWx0ZXIgdHlwZTogbHVtYV90OiBob3Jpel9vbmx5LCBjaHJvbWFfdDogaG9yaXpfb25seSAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1BBVElBTF9GSUxURVIsIDIsIDAsCisJCQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV8xRF9IT1JJWiwKKwkJCUJMQUNLQklSRF9TUEFUSUFMX0ZJTFRFUl9DSFJPTUFfMURfSE9SSVoKKwkJKTsKIAotICAgICAgICAvKiBhc3NpZ24gZnJhbWUgZHJvcCByYXRlICovCi0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX0RST1BfUkFURSwgMSwgMCwgMCk7CisJLyogYXNzaWduIGZyYW1lIGRyb3AgcmF0ZSAqLworCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX0RST1BfUkFURSwgMSwgMCwgMCk7ICovCiB9CiAKIHN0YXRpYyBpbnQgYmxhY2tiaXJkX2luaXRpYWxpemVfY29kZWMoc3RydWN0IGN4ODgwMl9kZXYgKmRldikKQEAgLTQ3Niw3ICs3NzMsNyBAQAogCWludCByZXR2YWw7CiAKIAlkcHJpbnRrKDEsIkluaXRpYWxpemUgY29kZWNcbiIpOwotCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfRU5DX1BJTkdfRlcsIDAsIDApOyAvKiBwaW5nICovCisJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1BJTkcsIDAsIDApOyAvKiBwaW5nICovCiAJaWYgKHJldHZhbCA8IDApIHsKIAkJLyogcGluZyB3YXMgbm90IHN1Y2Nlc3NmdWwsIHJlc2V0IGFuZCB1cGxvYWQgZmlybXdhcmUgKi8KIAkJY3hfd3JpdGUoTU9fU1JTVF9JTywgMCk7IC8qIFNZU19SU1RPPTAgKi8KQEAgLTQ5MSwxMyArNzg4LDEzIEBACiAJCWlmIChkZXYtPm1haWxib3ggPCAwKQogCQkJcmV0dXJuIC0xOwogCi0JCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfRU5DX1BJTkdfRlcsIDAsIDApOyAvKiBwaW5nICovCisJCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9QSU5HLCAwLCAwKTsgLyogcGluZyAqLwogCQlpZiAocmV0dmFsIDwgMCkgewogCQkJZHByaW50aygwLCAiRVJST1I6IEZpcm13YXJlIHBpbmcgZmFpbGVkIVxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQlyZXR2YWwgPSBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0VOQ19HRVRWRVIsIDAsIDEsICZ2ZXJzaW9uKTsKKwkJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX0dFVF9WRVJTSU9OLCAwLCAxLCAmdmVyc2lvbik7CiAJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQlkcHJpbnRrKDAsICJFUlJPUjogRmlybXdhcmUgZ2V0IGVuY29kZXIgdmVyc2lvbiBmYWlsZWQhXG4iKTsKIAkJCXJldHVybiAtMTsKQEAgLTUxMSwzMSArODA4LDM5IEBACiAJY3hfd3JpdGUoTU9fVkJPU19DT05UUk9MLCAweDg0QTAwKTsgLyogbm8gNjU2IG1vZGUsIDgtYml0IHBpeGVscywgZGlzYWJsZSBWQkkgKi8KIAljeF9jbGVhcihNT19PVVRQVVRfRk9STUFULCAweDAwMDgpOyAvKiBOb3JtYWwgWS1saW1pdHMgdG8gbGV0IHRoZSBtcGVnIGVuY29kZXIgc3luYyAqLwogCi0jaWYgMCAvKiBGSVhNRSAqLwotCXNldF9zY2FsZShkZXYsIDcyMCwgNDgwLCBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpOwotI2VuZGlmCiAJYmxhY2tiaXJkX2NvZGVjX3NldHRpbmdzKGRldik7CiAJbXNsZWVwKDEpOwogCi0JLy9ibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4ZWYsIDB4ZWYpOwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX05VTV9WU1lOQ19MSU5FUywgNCwgMCwgMHhmMCwgMHhmMCk7Ci0JLy9ibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4MTgwLCAweDE4MCk7Ci0gICAgICAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1BMQUNFSE9MREVSLCAxMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisJLyogYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fTlVNX1ZTWU5DX0xJTkVTLCA0LCAwLCAweGVmLCAweGVmKTsKKwkgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4ZjAsIDB4ZjApOworCSAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX05VTV9WU1lOQ19MSU5FUywgNCwgMCwgMHgxODAsIDB4MTgwKTsgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0NBUFRVUkVfTElORVMsIDIsIDAsCisJCQlCTEFDS0JJUkRfRklFTEQxX1NBQTcxMTUsCisJCQlCTEFDS0JJUkRfRklFTEQxX1NBQTcxMTUKKwkJKTsKIAotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfSU5JVElBTElaRV9JTlBVVCwgMCwgMCk7IC8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGlucHV0ICovCisJLyogYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fUExBQ0VIT0xERVIsIDEyLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0NVU1RPTV9EQVRBLCAxMiwgMCwKKwkJCUJMQUNLQklSRF9DVVNUT01fRVhURU5TSU9OX1VTUl9EQVRBLAorCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfSU5JVF9WSURFT19JTlBVVCwgMCwgMCk7IC8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGlucHV0ICovCiAKIAltc2xlZXAoMSk7CiAKLSAgICAgICAgYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9NVVRFX1ZJREVPLCAxLCAwLCAwKTsKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfTVVURV9WSURFTywgMSwgMCwgQkxBQ0tCSVJEX1VOTVVURSk7CiAJbXNsZWVwKDEpOwotICAgICAgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX01VVEVfQVVESU8sIDEsIDAsIDApOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9NVVRFX0FVRElPLCAxLCAwLCBCTEFDS0JJUkRfVU5NVVRFKTsKIAltc2xlZXAoMSk7CiAKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0JFR0lOX0NBUFRVUkUsIDIsIDAsIDAsIDB4MTMpOyAvKiBzdGFydCBjYXB0dXJpbmcgdG8gdGhlIGhvc3QgaW50ZXJmYWNlICovCi0JLy9ibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0JFR0lOX0NBUFRVUkUsIDIsIDAsIDAsIDApOyAvKiBzdGFydCBjYXB0dXJpbmcgdG8gdGhlIGhvc3QgaW50ZXJmYWNlICovCi0JbXNsZWVwKDEpOworCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFLCAyLCAwLCAwLCAweDEzKTsgLy8gc3RhcnQgY2FwdHVyaW5nIHRvIHRoZSBob3N0IGludGVyZmFjZSAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFLCAyLCAwLAorCQkJQkxBQ0tCSVJEX01QRUdfQ0FQVFVSRSwKKwkJCUJMQUNLQklSRF9SQVdfQklUU19OT05FCisJCSk7IC8qIHN0YXJ0IGNhcHR1cmluZyB0byB0aGUgaG9zdCBpbnRlcmZhY2UgKi8KKwltc2xlZXAoMTApOwogCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9SRUZSRVNIX0lOUFVULCAwLDApOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9SRUZSRVNIX0lOUFVULCAwLDApOwogCXJldHVybiAwOwogfQogCkBAIC03MDksNyArMTAxNCwxMiBAQAogewogCXN0cnVjdCBjeDg4MDJfZmggICpmaCAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLQlibGFja2JpcmRfYXBpX2NtZChmaC0+ZGV2LCBJVlRWX0FQSV9FTkRfQ0FQVFVSRSwgMywgMCwgMSwgMCwgMHgxMyk7CisJLyogYmxhY2tiaXJkX2FwaV9jbWQoZmgtPmRldiwgQkxBQ0tCSVJEX0FQSV9FTkRfQ0FQVFVSRSwgMywgMCwgQkxBQ0tCSVJEX0VORF9OT1csIDAsIDB4MTMpOyAqLworCWJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIEJMQUNLQklSRF9BUElfRU5EX0NBUFRVUkUsIDMsIDAsCisJCQlCTEFDS0JJUkRfRU5EX05PVywKKwkJCUJMQUNLQklSRF9NUEVHX0NBUFRVUkUsCisJCQlCTEFDS0JJUkRfUkFXX0JJVFNfTk9ORQorCQkpOwogCiAJLyogc3RvcCBtcGVnIGNhcHR1cmUgKi8KIAlpZiAoZmgtPm1wZWdxLnN0cmVhbWluZykKQEAgLTkwOCw0ICsxMjE4LDUgQEAKICAqIExvY2FsIHZhcmlhYmxlczoKICAqIGMtYmFzaWMtb2Zmc2V0OiA4CiAgKiBFbmQ6CisgKiBrYXRlOiBlb2wgInVuaXgiOyBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRyYWlsaW5nLXNwYWNlLXNhdmUgb247IHRhYi13aWR0aCA4OyByZXBsYWNlLXRhYnMgb2ZmOyBzcGFjZS1pbmRlbnQgb2ZmOyBtaXhlZC1pbmRlbnQgb2ZmCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCmluZGV4IDM2NzYyNDguLmIwYjQ3YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtY2FyZHMuYyx2IDEuNjYgMjAwNS8wMy8wNCAwOToxMjoyMyBrcmF4ZWwgRXhwICQKKyAqICRJZDogY3g4OC1jYXJkcy5jLHYgMS44NSAyMDA1LzA3LzA0IDE5OjM1OjA1IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcwogICogY2FyZC1zcGVjaWZpYyBzdHVmZi4KQEAgLTM1LDYgKzM1LDkgQEAKIAlbQ1g4OF9CT0FSRF9VTktOT1dOXSA9IHsKIAkJLm5hbWUJCT0gIlVOS05PV04vR0VORVJJQyIsCiAJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgID0gMCwKQEAgLTUyLDYgKzU1LDkgQEAKIAlbQ1g4OF9CT0FSRF9IQVVQUEFVR0VdID0gewogCQkubmFtZQkJPSAiSGF1cHBhdWdlIFdpblRWIDM0eHh4IG1vZGVscyIsCiAJCS50dW5lcl90eXBlICAgICA9IFVOU0VULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKQEAgLTc4LDYgKzg0LDkgQEAKIAlbQ1g4OF9CT0FSRF9HREldID0gewogCQkubmFtZQkJPSAiR0RJIEJsYWNrIEdvbGQiLAogCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICA9IDAsCkBAIC04NSw3ICs5NCwxMCBAQAogCX0sCiAJW0NYODhfQk9BUkRfUElYRUxWSUVXXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIlBpeGVsVmlldyIsCi0JCS50dW5lcl90eXBlICAgICA9IDUsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKQEAgLTEwNCw3ICsxMTYsMTAgQEAKIAl9LAogCVtDWDg4X0JPQVJEX0FUSV9XT05ERVJfUFJPXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkFUSSBUViBXb25kZXIgUHJvIiwKLQkJLnR1bmVyX3R5cGUgICAgID0gNDQsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfNElOMSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X0lOVEVSQ0FSUklFUiwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKQEAgLTEyMiw3ICsxMzcsMTAgQEAKIAl9LAogICAgICAgICBbQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVF0gPSB7CiAgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxlYWR0ZWsgV2luZmFzdCAyMDAwWFAgRXhwZXJ0IiwKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSA0NCwKKyAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTXzRJTjEsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCkBAIC0xNTYsNyArMTc0LDEwIEBACiAgICAgICAgIH0sCiAJW0NYODhfQk9BUkRfQVZFUlRWXzMwM10gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVyVFYgU3R1ZGlvIDMwMyAoTTEyNikiLAotCQkudHVuZXJfdHlwZSAgICAgPSAzOCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLApAQCAtMTc5LDcgKzIwMCwxMCBAQAogCQkvLyBhZGRlZCBncGlvIHZhbHVlcyB0aGFua3MgdG8gTWljaGFsCiAJCS8vIHZhbHVlcyBmb3IgUEFMIGZyb20gRFNjYWxlcgogCQkubmFtZSAgICAgICAgICAgPSAiTVNJIFRWLUBueXdoZXJlIE1hc3RlciIsCi0JCS50dW5lcl90eXBlICAgICA9IDMzLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZgk9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKQEAgLTIwNiw3ICsyMzAsMTAgQEAKIAl9LAogCVtDWDg4X0JPQVJEX1dJTkZBU1RfRFYyMDAwXSA9IHsKICAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiTGVhZHRlayBXaW5mYXN0IERWMjAwMCIsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gMzgsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCkBAIC0yMzksMzQgKzI2Niw0MCBAQAogCQkJLmdwaW8zICA9IDB4MDIwMDAwMDAsCiAJCSB9LAogICAgICAgICB9LAotICAgICAgICBbQ1g4OF9CT0FSRF9MRUFEVEVLX1BWUjIwMDBdID0geworCVtDWDg4X0JPQVJEX0xFQURURUtfUFZSMjAwMF0gPSB7CiAJCS8vIGdwaW8gdmFsdWVzIGZvciBQQUwgdmVyc2lvbiBmcm9tIHJlZ3NweSBieSBEU2NhbGVyCi0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkxlYWR0ZWsgUFZSIDIwMDAiLAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IDM4LAorCQkubmFtZSAgICAgICAgICAgPSAiTGVhZHRlayBQVlIgMjAwMCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAuaW5wdXQgICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwMDAwYmRlNiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MDAwMGJkZTYsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MDAwMGJkZTYsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfUkFESU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbzAgID0gMHgwMDAwYmQ2MiwKLSAgICAgICAgICAgICAgICB9LAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAgID0gMHgwMDAwYmRlMiwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwMDAwYmRlNiwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS50eXBlICAgPSBDWDg4X1JBRElPLAorCQkJLmdwaW8wICA9IDB4MDAwMGJkNjIsCisJCX0sCiAJCS5ibGFja2JpcmQgPSAxLAotICAgICAgICB9LAorCX0sCiAJW0NYODhfQk9BUkRfSU9EQVRBX0dWVkNQM1BDSV0gPSB7CiAgCQkubmFtZQkJPSAiSU9EQVRBIEdWLVZDUDMvUENJIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAotIAkJLmlucHV0ICAgICAgICAgID0ge3sKKyAJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKICAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAgCQkJLnZtdXggICA9IDAsCiAgCQl9LHsKQEAgLTI3OSw3ICszMTIsMTAgQEAKICAJfSwKIAlbQ1g4OF9CT0FSRF9QUk9MSU5LX1BMQVlUVlBWUl0gPSB7CiAgICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlByb2xpbmsgUGxheVRWIFBWUiIsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNDMsCisgICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYJPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCkBAIC0zMDEsOCArMzM3LDExIEBACiAJfSwKIAlbQ1g4OF9CT0FSRF9BU1VTX1BWUl80MTZdID0gewogCQkubmFtZQkJPSAiQVNVUyBQVlItNDE2IiwKLQkJLnR1bmVyX3R5cGUgICAgID0gNDMsCi0gICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICA9IDAsCkBAIC0zMjAsNyArMzU5LDEwIEBACiAJfSwKIAlbQ1g4OF9CT0FSRF9NU0lfVFZBTllXSEVSRV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJNU0kgVFYtQG55d2hlcmUiLAotCQkudHVuZXJfdHlwZSAgICAgPSAzMywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKQEAgLTM0Miw2ICszODQsOSBAQAogICAgICAgICBbQ1g4OF9CT0FSRF9LV09STERfRFZCX1RdID0gewogICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJLV29ybGQvVlN0cmVhbSBYUGVydCBEVkItVCIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKQEAgLTM1Niw4ICs0MDEsMTEgQEAKIAkJLmR2YiAgICAgICAgICAgID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1QxXSA9IHsKLQkJLm5hbWUgICAgICAgICAgID0gIkRWSUNPIEZ1c2lvbkhEVFYgRFZCLVQxIiwKKwkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgRFZCLVQxIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULCAvKiBObyBhbmFsb2cgdHVuZXIgKi8KKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9IDEsCkBAIC0zNzEsNyArNDE5LDEwIEBACiAJfSwKIAlbQ1g4OF9CT0FSRF9LV09STERfTFRWODgzXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIktXb3JsZCBMVFY4ODNSRiIsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gNDgsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RORl84ODMxQkdGRiwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogICAgICAgICAgICAgICAgIC5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKQEAgLTM5NCw5ICs0NDUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDAwMDAwN2Y4LAogICAgICAgICAgICAgICAgIH0sCiAJfSwKLQlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF0gPSB7Ci0JCS5uYW1lCQk9ICJEVmlDTyAtIEZ1c2lvbkhEVFYgMyBHb2xkIiwKKwlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9RXSA9IHsKKwkJLm5hbWUJCT0gIkRWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NSUNST1RVTkVfNDA0MkZJNSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkvKgogCQkgICBHUElPWzBdIHJlc2V0cyBEVDMzMDIgRFRWIHJlY2VpdmVyCiAJCSAgICAwIC0gcmVzZXQgYXNzZXJ0ZWQKQEAgLTQxMCw2ICs0NjQsOSBAQAogCQkgICBHUElPWzNdIHNlbGVjdHMgUkYgaW5wdXQgY29ubmVjdG9yIG9uIHR1bmVyIG1vZHVsZQogCQkgICAgMCAtIFJGIGNvbm5lY3RvciBsYWJlbGVkIENBQkxFCiAJCSAgICAxIC0gUkYgY29ubmVjdG9yIGxhYmVsZWQgQU5UCisJCSAgIEdQSU9bNF0gc2VsZWN0cyBoaWdoIFJGIGZvciBRQU0yNTYgbW9kZQorCQkgICAgMCAtIG5vcm1hbCBSRgorCQkgICAgMSAtIGhpZ2ggUkYKIAkJKi8KIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKQEAgLTQyOCwxNyArNDg1LDE1IEBACiAJCQkudm11eCAgID0gMiwKIAkJCS5ncGlvMAk9IDB4MGYwMCwKIAkJfX0sCi0jaWYgMAotCQkudHMgICAgICAgICAgICAgPSB7Ci0JCQkgLnR5cGUgICA9IENYODhfVFMsCi0JCQkgLmdwaW8wICA9IDB4MDAwMDBmMDEsICAgLyogSG9va2VkIHRvIHR1bmVyIHJlc2V0IGJpdCAqLwotCQkgfQotI2VuZGlmCisJCS5kdmIgICAgICAgICAgICA9IDEsCiAJfSwKICAgICAgICAgW0NYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMV0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBOb3ZhLVQgRFZCLVQiLAorCQkubmFtZSAgICAgICAgICAgPSAiSGF1cHBhdWdlIE5vdmEtVCBEVkItVCIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKLSAgICAgICAgICAgICAgICAuaW5wdXQgICAgICAgICAgPSB7eworCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CiAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0RWQiwKICAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAwLAogICAgICAgICAgICAgICAgIH19LApAQCAtNDQ3LDYgKzUwMiw5IEBACiAgICAgICAgIFtDWDg4X0JPQVJEX0NPTkVYQU5UX0RWQl9UMV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJDb25leGFudCBEVkItVCByZWZlcmVuY2UgZGVzaWduIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAgICAgICAgICAgICAgICAgLmlucHV0ICAgICAgICAgID0ge3sKICAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfRFZCLAogICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDAsCkBAIC00NTYsNiArNTE0LDkgQEAKIAlbQ1g4OF9CT0FSRF9QUk9WSURFT19QVjI1OV0gPSB7CiAJCS5uYW1lCQk9ICJQcm92aWRlbyBQVjI1OSIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgPSAwLApAQCAtNDYzLDggKzUyNCwxMSBAQAogCQkuYmxhY2tiaXJkID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfRFZCX1RfUExVU10gPSB7Ci0JCS5uYW1lICAgICAgICAgICA9ICJEVklDTyBGdXNpb25IRFRWIERWQi1UIFBsdXMiLAorCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViBEVkItVCBQbHVzIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULCAvKiBObyBhbmFsb2cgdHVuZXIgKi8KKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggICA9IDEsCkBAIC00NzksNiArNTQzLDkgQEAKIAlbQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RdID0gewogCQkubmFtZQkgICAgICAgID0gImRpZ2l0YWxub3cgRE5UViBMaXZlISBEVkItVCIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXQJICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgID0gMSwKQEAgLTQ5NSw2ICs1NjIsOSBAQAogCVtDWDg4X0JPQVJEX1BDSERUVl9IRDMwMDBdID0gewogCQkubmFtZSAgICAgICAgICAgPSAicGNIRFRWIEhEMzAwMCBIRFRWIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfVEhPTVNPTl9EVFQ3NjEwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCiAJCQkudm11eCAgID0gMCwKQEAgLTUzMCw4ICs2MDAsMTEgQEAKIAlbQ1g4OF9CT0FSRF9IQVVQUEFVR0VfUk9TTFlOXSA9IHsKIAkJLy8gZW50cnkgYWRkZWQgYnkgS2F1c3R1YmggRC4gQmhhbGVyYW8gPGJoYWxlcmFvLjFAb3N1LmVkdT4KIAkJLy8gR1BJTyB2YWx1ZXMgb2J0YWluZWQgZnJvbSByZWdzcHksIGNvdXJ0ZXN5IFNlYW4gQ292ZWwKLQkJLm5hbWUgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViAyOHh4eCAoUm9zbHluKSBtb2RlbHMiLAotCQkudHVuZXJfdHlwZSAgPSBVTlNFVCwKKwkJLm5hbWUgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViAyOHh4eCAoUm9zbHluKSBtb2RlbHMiLAorCQkudHVuZXJfdHlwZSAgICAgPSBVTlNFVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAogCQkJLnZtdXggICA9IDAsCkBAIC01NTksMzMgKzYzMiwzNyBAQAogCQkuYmxhY2tiaXJkID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0RJR0lUQUxMT0dJQ19NRUNdID0gewotCQkvKiBwYXJhbXMgY29waWVkIG92ZXIgZnJvbSBMZWFkdGVrIFBWUiAyMDAwICovCiAJCS5uYW1lICAgICAgICAgICA9ICJEaWdpdGFsLUxvZ2ljIE1JQ1JPU1BBQ0UgRW50ZXJ0YWlubWVudCBDZW50ZXIgKE1FQykiLAotCQkvKiBub3Qgc3VyZSB5ZXQgYWJvdXQgdGhlIHR1bmVyIHR5cGUgKi8KLQkJLnR1bmVyX3R5cGUgICAgID0gMzgsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKIAkJCS52bXV4ICAgPSAwLAotCQkJLmdwaW8wICA9IDB4MDAwMGJkZTYsCisJCQkuZ3BpbzAgID0gMHgwMDAwOWQ4MCwKIAkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCiAJCQkudm11eCAgID0gMSwKLQkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQkJLmdwaW8wICA9IDB4MDAwMDlkNzYsCiAJCX0sewogCQkJLnR5cGUgICA9IENYODhfVk1VWF9TVklERU8sCiAJCQkudm11eCAgID0gMiwKLQkJCS5ncGlvMCAgPSAweDAwMDBiZGU2LAorCQkJLmdwaW8wICA9IDB4MDAwMDlkNzYsCiAJCX19LAogCQkucmFkaW8gPSB7CiAJCQkudHlwZSAgID0gQ1g4OF9SQURJTywKLQkJCS5ncGlvMCAgPSAweDAwMDBiZDYyLAorCQkJLmdwaW8wICA9IDB4MDAwMDlkMDAsCiAJCX0sCiAJCS5ibGFja2JpcmQgPSAxLAogCX0sCiAJW0NYODhfQk9BUkRfSU9EQVRBX0dWQkNUVjdFXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIklPREFUQSBHVi9CQ1RWN0UiLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZRMTI4NiwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCkBAIC02MDEsNiArNjc4LDgxIEBACiAJCQkuZ3BpbzEgID0gMHgwMDAwZTA3ZiwKIAkJfX0KIAl9LAorCVtDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfVUxUUkFfUFJPXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlBpeGVsVmlldyBQbGF5VFYgVWx0cmEgUHJvIChTdGVyZW8pIiwKKwkJLyogTWF5IGJlIGFsc28gVFVORVJfWU1FQ19UVkZfNTUzM01GIGZvciBOVFNDL00gb3IgUEFML00gKi8KKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFRVTkVSX1RFQTU3NjcsCisJCS50dW5lcl9hZGRyCT0gMHhjMj4+MSwKKwkJLnJhZGlvX2FkZHIJPSAweGMwPj4xLAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggICA9IDAsCisJCQkuZ3BpbzAgID0gMHhiZjYxLCAgLyogaW50ZXJuYWwgZGVjb2RlciAqLworCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wCT0gMHhiZjYzLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAJPSAweGJmNjMsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkgLnR5cGUgID0gQ1g4OF9SQURJTywKKwkJCSAuZ3BpbzAgPSAweGJmNjAsCisJCSB9LAorCX0sCisgICAgICAgIFtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1RdID0geworCQkubmFtZSAgICAgICAgICAgPSAiRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtVCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RIT01TT05fRFRUNzYxMSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkvKiAgU2VlIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgZm9yIEdQSU8gZG9jdW1lbnRhdGlvbi4gICovCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMGQsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisgICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvMCAgPSAweDBmMDAsCisgICAgICAgICAgICAgICAgfSx7CisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKyAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8wICA9IDB4MGYwMCwKKyAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKyAgICAgICAgfSwKKyAgICAgICAgW0NYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0ldID0geworICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBRFMgVGVjaCBJbnN0YW50IFRWIERWQi1UIFBDSSIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXQgICAgICAgICAgPSB7eworICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHgwNzAwLAorCQkJLmdwaW8yICA9IDB4MDEwMSwKKyAgICAgICAgICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHgwNzAwLAorCQkJLmdwaW8yICA9IDB4MDEwMSwKKyAgICAgICAgICAgICAgICB9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDFdID0geworCQkubmFtZSAgICAgICAgICAgPSAiVGVycmFUZWMgQ2luZXJneSAxNDAwIERWQi1UIiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfQUJTRU5ULAorCQkuaW5wdXQgICAgICAgICAgPSB7eworCQkJLnR5cGUgICA9IENYODhfVk1VWF9EVkIsCisJCQkudm11eCAgID0gMCwKKwkJfX0sCisJCS5kdmIgICAgICAgICAgICA9IDEsCisJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3g4OF9iY291bnQgPSBBUlJBWV9TSVpFKGN4ODhfYm9hcmRzKTsKIApAQCAtNjcxLDcgKzgyMywxMSBAQAogCX0sewogCQkuc3VidmVuZG9yID0gMHgxOGFjLAogCQkuc3ViZGV2aWNlID0gMHhkODEwLAotCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUSwKKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MThhYywKKwkJLnN1YmRldmljZSA9IDB4ZDgyMCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVCwKIAl9LHsKIAkJLnN1YnZlbmRvciA9IDB4MThBQywKIAkJLnN1YmRldmljZSA9IDB4REIwMCwKQEAgLTcxNiw3ICs4NzIsMTUgQEAKIAkJLnN1YnZlbmRvciA9IDB4MTBmYywKIAkJLnN1YmRldmljZSA9IDB4ZDAzNSwKIAkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfSU9EQVRBX0dWQkNUVjdFLAotCX0KKwl9LHsKKwkJLnN1YnZlbmRvciA9IDB4MTQyMSwKKwkJLnN1YmRldmljZSA9IDB4MDMzNCwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0ksCisgCX0seworCQkuc3VidmVuZG9yID0gMHgxNTNiLAorCQkuc3ViZGV2aWNlID0gMHgxMTY2LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9URVJSQVRFQ19DSU5FUkdZXzE0MDBfRFZCX1QxLAorCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGN4ODhfaWRjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9zdWJpZHMpOwogCkBAIC05MzUsNCArMTA5OSw1IEBACiAgKiBMb2NhbCB2YXJpYWJsZXM6CiAgKiBjLWJhc2ljLW9mZnNldDogOAogICogRW5kOgorICoga2F0ZTogZW9sICJ1bml4IjsgaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10cmFpbGluZy1zcGFjZS1zYXZlIG9uOyB0YWItd2lkdGggODsgcmVwbGFjZS10YWJzIG9mZjsgc3BhY2UtaW5kZW50IG9mZjsgbWl4ZWQtaW5kZW50IG9mZgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggMWZmNzliNS4uNWU4NjhmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtY29yZS5jLHYgMS4yNCAyMDA1LzAxLzE5IDEyOjAxOjU1IGtyYXhlbCBFeHAgJAorICogJElkOiBjeDg4LWNvcmUuYyx2IDEuMzMgMjAwNS8wNy8wNyAxNDoxNzo0NyBtY2hlaGFiIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYgY2FyZHMKICAqIGRyaXZlciBjb3JlCkBAIC01MSwxMiArNTEsMTUgQEAKIE1PRFVMRV9QQVJNX0RFU0MobGF0ZW5jeSwicGNpIGxhdGVuY3kgdGltZXIiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCB0dW5lcltdID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Oworc3RhdGljIHVuc2lnbmVkIGludCByYWRpb1tdID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Owogc3RhdGljIHVuc2lnbmVkIGludCBjYXJkW10gID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OwogCiBtb2R1bGVfcGFyYW1fYXJyYXkodHVuZXIsIGludCwgTlVMTCwgMDQ0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkocmFkaW8sIGludCwgTlVMTCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkoY2FyZCwgIGludCwgTlVMTCwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0ModHVuZXIsInR1bmVyIHR5cGUiKTsKK01PRFVMRV9QQVJNX0RFU0MocmFkaW8sInJhZGlvIHR1bmVyIHR5cGUiKTsKIE1PRFVMRV9QQVJNX0RFU0MoY2FyZCwiY2FyZCB0eXBlIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmljYW0gPSAwOwpAQCAtNDI5LDcgKzQzMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGRlYnVnIGhlbHBlciBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi1zdGF0aWMgaW50IGN4ODhfcmlzY19kZWNvZGUodTMyIHJpc2MpCitpbnQgY3g4OF9yaXNjX2RlY29kZSh1MzIgcmlzYykKIHsKIAlzdGF0aWMgY2hhciAqaW5zdHJbMTZdID0gewogCQlbIFJJU0NfU1lOQyAgICA+PiAyOCBdID0gInN5bmMiLApAQCAtNDY3LDI1ICs0NzAsNiBAQAogCXJldHVybiBpbmNyW3Jpc2MgPj4gMjhdID8gaW5jcltyaXNjID4+IDI4XSA6IDE7CiB9CiAKLSNpZiAwIC8qIGN1cnJlbnRseSB1bnVzZWQsIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZyAqLwotdm9pZCBjeDg4X3Jpc2NfZGlzYXNtKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCi0JCSAgICAgIHN0cnVjdCBidGN4X3Jpc2NtZW0gKnJpc2MpCi17Ci0JdW5zaWduZWQgaW50IGksaixuOwotCi0JcHJpbnRrKCIlczogcmlzYyBkaXNhc206ICVwIFtkbWE9MHglMDhseF1cbiIsCi0JICAgICAgIGNvcmUtPm5hbWUsIHJpc2MtPmNwdSwgKHVuc2lnbmVkIGxvbmcpcmlzYy0+ZG1hKTsKLQlmb3IgKGkgPSAwOyBpIDwgKHJpc2MtPnNpemUgPj4gMik7IGkgKz0gbikgewotCQlwcmludGsoIiVzOiAgICUwNGQ6ICIsIGNvcmUtPm5hbWUsIGkpOwotCQluID0gY3g4OF9yaXNjX2RlY29kZShyaXNjLT5jcHVbaV0pOwotCQlmb3IgKGogPSAxOyBqIDwgbjsgaisrKQotCQkJcHJpbnRrKCIlczogICAlMDRkOiAweCUwOHggWyBhcmcgIyVkIF1cbiIsCi0JCQkgICAgICAgY29yZS0+bmFtZSwgaStqLCByaXNjLT5jcHVbaStqXSwgaik7Ci0JCWlmIChyaXNjLT5jcHVbaV0gPT0gUklTQ19KVU1QKQotCQkJYnJlYWs7Ci0JfQotfQotI2VuZGlmCiAKIHZvaWQgY3g4OF9zcmFtX2NoYW5uZWxfZHVtcChzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAogCQkJICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoKQpAQCAtNTQ4LDIxICs1MzIsNiBAQAogCSJicmRnX2VyciIsICJzcmNfZG1hX2VyciIsICJkc3RfZG1hX2VyciIsICJpcGJfZG1hX2VyciIsCiAJImkyYyIsICJpMmNfcmFjayIsICJpcl9zbXAiLCAiZ3BpbzAiLCAiZ3BpbzEiCiB9OwotY2hhciAqY3g4OF92aWRfaXJxc1szMl0gPSB7Ci0JInlfcmlzY2kxIiwgInVfcmlzY2kxIiwgInZfcmlzY2kxIiwgInZiaV9yaXNjMSIsCi0JInlfcmlzY2kyIiwgInVfcmlzY2kyIiwgInZfcmlzY2kyIiwgInZiaV9yaXNjMiIsCi0JInlfb2Zsb3ciLCAgInVfb2Zsb3ciLCAgInZfb2Zsb3ciLCAgInZiaV9vZmxvdyIsCi0JInlfc3luYyIsICAgInVfc3luYyIsICAgInZfc3luYyIsICAgInZiaV9zeW5jIiwKLQkib3BjX2VyciIsICAicGFyX2VyciIsICAicmlwX2VyciIsICAicGNpX2Fib3J0IiwKLX07Ci1jaGFyICpjeDg4X21wZWdfaXJxc1szMl0gPSB7Ci0JInRzX3Jpc2NpMSIsIE5VTEwsIE5VTEwsIE5VTEwsCi0JInRzX3Jpc2NpMiIsIE5VTEwsIE5VTEwsIE5VTEwsCi0JInRzX29mbG93IiwgIE5VTEwsIE5VTEwsIE5VTEwsCi0JInRzX3N5bmMiLCAgIE5VTEwsIE5VTEwsIE5VTEwsCi0JIm9wY19lcnIiLCAicGFyX2VyciIsICJyaXBfZXJyIiwgInBjaV9hYm9ydCIsCi0JInRzX2Vycj8iLAotfTsKIAogdm9pZCBjeDg4X3ByaW50X2lycWJpdHMoY2hhciAqbmFtZSwgY2hhciAqdGFnLCBjaGFyICoqc3RyaW5ncywKIAkJCXUzMiBiaXRzLCB1MzIgbWFzaykKQEAgLTYxMiwxNiArNTgxLDExIEBACiAJCQlicmVhazsKIAkJYnVmID0gbGlzdF9lbnRyeShxLT5hY3RpdmUubmV4dCwKIAkJCQkgc3RydWN0IGN4ODhfYnVmZmVyLCB2Yi5xdWV1ZSk7Ci0jaWYgMAotCQlpZiAoYnVmLT5jb3VudCA+IGNvdW50KQotCQkJYnJlYWs7Ci0jZWxzZQogCQkvKiBjb3VudCBjb21lcyBmcm9tIHRoZSBodyBhbmQgaXMgaXMgMTZiaXQgd2lkZSAtLQogCQkgKiB0aGlzIHRyaWNrIGhhbmRsZXMgd3JhcC1hcm91bmRzIGNvcnJlY3RseSBmb3IKIAkJICogdXAgdG8gMzI3NjcgYnVmZmVycyBpbiBmbGlnaHQuLi4gKi8KIAkJaWYgKChzMTYpIChjb3VudCAtIGJ1Zi0+Y291bnQpIDwgMCkKIAkJCWJyZWFrOwotI2VuZGlmCiAJCWRvX2dldHRpbWVvZmRheSgmYnVmLT52Yi50cyk7CiAJCWRwcmludGsoMiwiWyVwLyVkXSB3YWtldXAgcmVnPSVkIGJ1Zj0lZFxuIixidWYsYnVmLT52Yi5pLAogCQkJY291bnQsIGJ1Zi0+Y291bnQpOwpAQCAtNzM2LDYgKzcwMCwxMCBAQAogewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbnRzYyA9IDI4NjM2MzYwOwogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGFsICA9IDM1NDY4OTUwOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGFsbSAgPSAyODYwNDg5MjsKKworCWlmIChub3JtLT5pZCAmIFY0TDJfU1REX1BBTF9NKQorCQlyZXR1cm4gcGFsbTsKIAogCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gcGFsIDogbnRzYzsKIH0KQEAgLTc0OSw2ICs3MTcsMTEgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBpbmxpbmUgbm9ybV9odG90YWwoc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQogeworCS8qIFNob3VsZCBhbHdheXMgYmUgTGluZSBEcmF3IFRpbWUgLyAoNCpGU0MpICovCisKKwlpZiAobm9ybS0+aWQgJiBWNEwyX1NURF9QQUxfTSkKKwkJcmV0dXJuIDkwOTsKKwogCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gMTEzNSA6IDkxMDsKIH0KIApAQCAtOTQwLDEyICs5MTMsMTAgQEAKIAkJbm9ybS0+Y3hpZm9ybWF0LCBjeF9yZWFkKE1PX0lOUFVUX0ZPUk1BVCkgJiAweDBmKTsKIAljeF9hbmRvcihNT19JTlBVVF9GT1JNQVQsIDB4Ziwgbm9ybS0+Y3hpZm9ybWF0KTsKIAotI2lmIDEKIAkvLyBGSVhNRTogYXMtaXMgZnJvbSBEU2NhbGVyCiAJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19PVVRQVVRfRk9STUFUIDB4JTA4eCBbb2xkPTB4JTA4eF1cbiIsCiAJCW5vcm0tPmN4b2Zvcm1hdCwgY3hfcmVhZChNT19PVVRQVVRfRk9STUFUKSk7CiAJY3hfd3JpdGUoTU9fT1VUUFVUX0ZPUk1BVCwgbm9ybS0+Y3hvZm9ybWF0KTsKLSNlbmRpZgogCiAJLy8gTU9fU0NPTlZfUkVHID0gYWRjIGNsb2NrIC8gdmlkZW8gZGVjIGNsb2NrICogMl4xNwogCXRtcDY0ICA9IGFkY19jbG9jayAqICh1NjQpKDEgPDwgMTcpOwpAQCAtOTk0LDIxICs5NjUsNyBAQAogCXNldF90dmF1ZGlvKGNvcmUpOwogCiAJLy8gdGVsbCBpMmMgY2hpcHMKLSNpZmRlZiBWNEwyX0kyQ19DTElFTlRTCiAJY3g4OF9jYWxsX2kyY19jbGllbnRzKGNvcmUsVklESU9DX1NfU1RELCZub3JtLT5pZCk7Ci0jZWxzZQotCXsKLQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgYzsKLQkJbWVtc2V0KCZjLDAsc2l6ZW9mKGMpKTsKLQkJYy5jaGFubmVsID0gY29yZS0+aW5wdXQ7Ci0JCWMubm9ybSA9IFZJREVPX01PREVfUEFMOwotCQlpZiAoKG5vcm0tPmlkICYgKFY0TDJfU1REX05UU0NfTXxWNEwyX1NURF9OVFNDX01fSlApKSkKLQkJCWMubm9ybSA9IFZJREVPX01PREVfTlRTQzsKLQkJaWYgKG5vcm0tPmlkICYgVjRMMl9TVERfU0VDQU0pCi0JCQljLm5vcm0gPSBWSURFT19NT0RFX1NFQ0FNOwotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoY29yZSxWSURJT0NTQ0hBTiwmYyk7Ci0JfQotI2VuZGlmCiAKIAkvLyBkb25lCiAJcmV0dXJuIDA7CkBAIC0xMTY0LDggKzExMjEsMjAgQEAKIAkgICAgICAgImluc21vZCBvcHRpb24iIDogImF1dG9kZXRlY3RlZCIpOwogCiAJY29yZS0+dHVuZXJfdHlwZSA9IHR1bmVyW2NvcmUtPm5yXTsKKwljb3JlLT5yYWRpb190eXBlID0gcmFkaW9bY29yZS0+bnJdOwogCWlmIChVTlNFVCA9PSBjb3JlLT50dW5lcl90eXBlKQogCQljb3JlLT50dW5lcl90eXBlID0gY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLnR1bmVyX3R5cGU7CisJaWYgKFVOU0VUID09IGNvcmUtPnJhZGlvX3R5cGUpCisJCWNvcmUtPnJhZGlvX3R5cGUgPSBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ucmFkaW9fdHlwZTsKKwlpZiAoIWNvcmUtPnR1bmVyX2FkZHIpCisJCWNvcmUtPnR1bmVyX2FkZHIgPSBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0udHVuZXJfYWRkcjsKKwlpZiAoIWNvcmUtPnJhZGlvX2FkZHIpCisJCWNvcmUtPnJhZGlvX2FkZHIgPSBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0ucmFkaW9fYWRkcjsKKworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJUViB0dW5lciAlZCBhdCAweCUwMngsIFJhZGlvIHR1bmVyICVkIGF0IDB4JTAyeFxuIiwKKwkJY29yZS0+dHVuZXJfdHlwZSwgY29yZS0+dHVuZXJfYWRkcjw8MSwKKwkJY29yZS0+cmFkaW9fdHlwZSwgY29yZS0+cmFkaW9fYWRkcjw8MSk7CisKIAljb3JlLT50ZGE5ODg3X2NvbmYgPSBjeDg4X2JvYXJkc1tjb3JlLT5ib2FyZF0udGRhOTg4N19jb25mOwogCiAJLyogaW5pdCBoYXJkd2FyZSAqLwpAQCAtMTIwNiw4ICsxMTc1LDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBFWFBPUlRfU1lNQk9MKGN4ODhfcHJpbnRfaW9jdGwpOwotRVhQT1JUX1NZTUJPTChjeDg4X3ZpZF9pcnFzKTsKLUVYUE9SVF9TWU1CT0woY3g4OF9tcGVnX2lycXMpOwogRVhQT1JUX1NZTUJPTChjeDg4X3ByaW50X2lycWJpdHMpOwogCiBFWFBPUlRfU1lNQk9MKGN4ODhfY29yZV9pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYwppbmRleCA5ZDE1ZDNkLi44ZGI2OGYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LWR2Yi5jLHYgMS4zMSAyMDA1LzAzLzA3IDE1OjU4OjA1IGtyYXhlbCBFeHAgJAorICogJElkOiBjeDg4LWR2Yi5jLHYgMS40MSAyMDA1LzA3LzA0IDE5OjM1OjA1IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcwogICogTVBFRyBUcmFuc3BvcnQgU3RyZWFtIChEVkIpIHJvdXRpbmVzCkBAIC0zMCwyMCArMzAsMjcgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCi0vKiB0aG9zZSB0d28gZnJvbnRlbmRzIG5lZWQgbWVyZ2luZyB2aWEgbGludXh0diBjdnMgLi4uICovCi0jZGVmaW5lIEhBVkVfQ1gyMjcwMiAxCi0jZGVmaW5lIEhBVkVfT1I1MTEzMiAxCisjZGVmaW5lIENPTkZJR19EVkJfTVQzNTIgMQorI2RlZmluZSBDT05GSUdfRFZCX0NYMjI3MDIgMQorI2RlZmluZSBDT05GSUdfRFZCX09SNTExMzIgMQorI2RlZmluZSBDT05GSUdfRFZCX0xHRFQzMzAyIDEKIAogI2luY2x1ZGUgImN4ODguaCIKICNpbmNsdWRlICJkdmItcGxsLmgiCi0jaW5jbHVkZSAibXQzNTIuaCIKLSNpbmNsdWRlICJtdDM1Ml9wcml2LmgiCi0jaWYgSEFWRV9DWDIyNzAyCisKKyNpZiBDT05GSUdfRFZCX01UMzUyCisjIGluY2x1ZGUgIm10MzUyLmgiCisjIGluY2x1ZGUgIm10MzUyX3ByaXYuaCIKKyNlbmRpZgorI2lmIENPTkZJR19EVkJfQ1gyMjcwMgogIyBpbmNsdWRlICJjeDIyNzAyLmgiCiAjZW5kaWYKLSNpZiBIQVZFX09SNTExMzIKKyNpZiBDT05GSUdfRFZCX09SNTExMzIKICMgaW5jbHVkZSAib3I1MTEzMi5oIgogI2VuZGlmCisjaWYgQ09ORklHX0RWQl9MR0RUMzMwMgorIyBpbmNsdWRlICJsZ2R0MzMwMi5oIgorI2VuZGlmCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBjeDIzODh4IGJhc2VkIERWQiBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKQEAgLTEwMCw2ICsxMDcsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorI2lmIENPTkZJR19EVkJfTVQzNTIKIHN0YXRpYyBpbnQgZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0YXRpYyB1OCBjbG9ja19jb25maWcgW10gID0geyBDTE9DS19DVEwsICAweDM4LCAweDM5IH07CkBAIC0xNjcsOCArMTc1LDkgQEAKIAkuZGVtb2RfaW5pdCAgICA9IGRudHZfbGl2ZV9kdmJ0X2RlbW9kX2luaXQsCiAJLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9wbGxfc2V0LAogfTsKKyNlbmRpZgogCi0jaWYgSEFWRV9DWDIyNzAyCisjaWYgQ09ORklHX0RWQl9DWDIyNzAyCiBzdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGNvbm5leGFudF9yZWZib2FyZF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDQzLAogCS5wbGxfYWRkcmVzcyAgID0gMHg2MCwKQEAgLTE4Miw3ICsxOTEsNyBAQAogfTsKICNlbmRpZgogCi0jaWYgSEFWRV9PUjUxMTMyCisjaWYgQ09ORklHX0RWQl9PUjUxMTMyCiBzdGF0aWMgaW50IG9yNTExMzJfc2V0X3RzX3BhcmFtKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCWludCBpc19wdW5jdHVyZWQpCiB7CkBAIC0xOTksNiArMjA4LDMyIEBACiB9OwogI2VuZGlmCiAKKyNpZiBDT05GSUdfRFZCX0xHRFQzMzAyCitzdGF0aWMgaW50IGxnZHQzMzAyX3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGlzX3B1bmN0dXJlZCkKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCWlmIChpc19wdW5jdHVyZWQpCisJCWRldi0+dHNfZ2VuX2NudHJsIHw9IDB4MDQ7CisJZWxzZQorCQlkZXYtPnRzX2dlbl9jbnRybCAmPSB+MHgwNDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBsZ2R0MzMwMl9jb25maWcgZnVzaW9uaGR0dl8zX2dvbGRfcSA9IHsKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGUsCisJLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAorCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfbWljcm90dW5lXzQwNDIsCisJLnNldF90c19wYXJhbXMgICAgPSBsZ2R0MzMwMl9zZXRfdHNfcGFyYW0sCit9OworCitzdGF0aWMgc3RydWN0IGxnZHQzMzAyX2NvbmZpZyBmdXNpb25oZHR2XzNfZ29sZF90ID0geworCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwZSwKKwkucGxsX2FkZHJlc3MgICAgICA9IDB4NjEsCisJLnBsbF9kZXNjICAgICAgICAgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc2MTEsCisJLnNldF90c19wYXJhbXMgICAgPSBsZ2R0MzMwMl9zZXRfdHNfcGFyYW0sCit9OworI2VuZGlmCisKIHN0YXRpYyBpbnQgZHZiX3JlZ2lzdGVyKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CiAJLyogaW5pdCBzdHJ1Y3QgdmlkZW9idWZfZHZiICovCkBAIC0yMDcsMTYgKzI0MiwxOCBAQAogCiAJLyogaW5pdCBmcm9udGVuZCAqLwogCXN3aXRjaCAoZGV2LT5jb3JlLT5ib2FyZCkgewotI2lmIEhBVkVfQ1gyMjcwMgorI2lmIENPTkZJR19EVkJfQ1gyMjcwMgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGN4MjI3MDJfYXR0YWNoKCZoYXVwcGF1Z2Vfbm92YXRfY29uZmlnLAogCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMToKIAljYXNlIENYODhfQk9BUkRfQ09ORVhBTlRfRFZCX1QxOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGN4MjI3MDJfYXR0YWNoKCZjb25uZXhhbnRfcmVmYm9hcmRfY29uZmlnLAogCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOwogCQlicmVhazsKICNlbmRpZgorI2lmIENPTkZJR19EVkJfTVQzNTIKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVDE6CiAJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOwogCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfbGdfejIwMTsKQEAgLTIzMSwxNyArMjY4LDQ5IEBACiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCX1Q6CiAJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVDoKKwljYXNlIENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0k6CiAJCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOwogCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdW5rbm93bl8xOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZG50dl9saXZlX2R2YnRfY29uZmlnLAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKIAkJYnJlYWs7Ci0jaWYgSEFWRV9PUjUxMTMyCisjZW5kaWYKKyNpZiBDT05GSUdfRFZCX09SNTExMzIKIAljYXNlIENYODhfQk9BUkRfUENIRFRWX0hEMzAwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBvcjUxMTMyX2F0dGFjaCgmcGNoZHR2X2hkMzAwMCwKIAkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CiAJCWJyZWFrOwogI2VuZGlmCisjaWYgQ09ORklHX0RWQl9MR0RUMzMwMgorCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9ROgorCQlkZXYtPnRzX2dlbl9jbnRybCA9IDB4MDg7CisJCXsKKwkJLyogRG8gYSBoYXJkd2FyZSByZXNldCBvZiBjaGlwIGJlZm9yZSB1c2luZyBpdC4gKi8KKwkJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKworCQljeF9jbGVhcihNT19HUDBfSU8sIDEpOworCQltZGVsYXkoMTAwKTsKKwkJY3hfc2V0KE1PX0dQMF9JTywgOSk7IC8vIEFOVCBjb25uZWN0b3IgdG9vIEZJWE1FCisJCW1kZWxheSgyMDApOworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzAyX2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGRfcSwKKwkJCQkJCSAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1Q6CisJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwODsKKwkJeworCQkvKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9mIGNoaXAgYmVmb3JlIHVzaW5nIGl0LiAqLworCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMSk7CisJCW1kZWxheSgxMDApOworCQljeF9zZXQoTU9fR1AwX0lPLCA5KTsgLyogQU5UIGNvbm5lY3RvciB0b28gRklYTUUgKi8KKwkJbWRlbGF5KDIwMCk7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbGdkdDMzMDJfYXR0YWNoKCZmdXNpb25oZHR2XzNfZ29sZF90LAorCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCXByaW50aygiJXM6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQgaXNuJ3Qgc3VwcG9ydGVkIHlldFxuIiwKIAkJICAgICAgIGRldi0+Y29yZS0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCmluZGV4IDA3MjViMTIuLjg0MDNjNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAgICAkSWQ6IGN4ODgtaTJjLmMsdiAxLjIwIDIwMDUvMDIvMTUgMTU6NTk6MzUga3JheGVsIEV4cCAkCisgICAgJElkOiBjeDg4LWkyYy5jLHYgMS4yOCAyMDA1LzA3LzA1IDE3OjM3OjM1IG5zaCBFeHAgJAogCiAgICAgY3g4OC1pMmMuYyAgLS0gIGFsbCB0aGUgaTJjIGNvZGUgaXMgaGVyZQogCkBAIC05MSwxNSArOTEsMzQgQEAKIAogc3RhdGljIGludCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisgICAgICAgIHN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGkyY19nZXRfYWRhcGRhdGEoY2xpZW50LT5hZGFwdGVyKTsKIAotCWRwcmludGsoMSwgImkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAotCQljbGllbnQtPmFkZHIsIGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCWRwcmludGsoMSwgIiVzIGkyYyBhdHRhY2ggW2FkZHI9MHgleCxjbGllbnQ9JXNdXG4iLAorCQljbGllbnQtPmRyaXZlci0+bmFtZSxjbGllbnQtPmFkZHIsaTJjX2NsaWVudG5hbWUoY2xpZW50KSk7CiAJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY29yZS0+dHVuZXJfdHlwZSAhPSBVTlNFVCkKLQkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LCBUVU5FUl9TRVRfVFlQRSwgJmNvcmUtPnR1bmVyX3R5cGUpOworICAgICAgICBpZiAoY29yZS0+cmFkaW9fdHlwZSAhPSBVTlNFVCkgeworCQlpZiAoKGNvcmUtPnJhZGlvX2FkZHI9PUFERFJfVU5TRVQpfHwoY29yZS0+cmFkaW9fYWRkcj09Y2xpZW50LT5hZGRyKSkgeworCQkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfUkFESU87CisJCQl0dW5fc2V0dXAudHlwZSA9IGNvcmUtPnJhZGlvX3R5cGU7CisJCQl0dW5fc2V0dXAuYWRkciA9IGNvcmUtPnJhZGlvX2FkZHI7CisKKwkJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kIChjbGllbnQsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvcmUtPnR1bmVyX3R5cGUgIT0gVU5TRVQpIHsKKwkJaWYgKChjb3JlLT50dW5lcl9hZGRyPT1BRERSX1VOU0VUKXx8KGNvcmUtPnR1bmVyX2FkZHI9PWNsaWVudC0+YWRkcikpIHsKKworCQkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWOworCQkJdHVuX3NldHVwLnR5cGUgPSBjb3JlLT50dW5lcl90eXBlOworCQkJdHVuX3NldHVwLmFkZHIgPSBjb3JlLT50dW5lcl9hZGRyOworCisJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZCAoY2xpZW50LFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisgICAgICAgIH0KKwogCWlmIChjb3JlLT50ZGE5ODg3X2NvbmYpCiAJCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCwgVERBOTg4N19TRVRfQ09ORklHLCAmY29yZS0+dGRhOTg4N19jb25mKTsKIAlyZXR1cm4gMDsKQEAgLTE0NSw2ICsxNjQsNyBAQAogfTsKIAogc3RhdGljIGNoYXIgKmkyY19kZXZzWzEyOF0gPSB7CisJWyAweDFjID4+IDEgXSA9ICJsZ2R0MzMwMiIsCiAJWyAweDg2ID4+IDEgXSA9ICJ0ZGE5ODg3L2N4MjI3MDIiLAogCVsgMHhhMCA+PiAxIF0gPSAiZWVwcm9tIiwKIAlbIDB4YzAgPj4gMSBdID0gInR1bmVyIChhbmFsb2cpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IGFmNmFkOGMuLjIxNDg4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtaW5wdXQuYyx2IDEuOSAyMDA1LzAzLzA0IDA5OjEyOjIzIGtyYXhlbCBFeHAgJAorICogJElkOiBjeDg4LWlucHV0LmMsdiAxLjE1IDIwMDUvMDcvMDcgMTM6NTg6MzggbWNoZWhhYiBFeHAgJAogICoKICAqIERldmljZSBkcml2ZXIgZm9yIEdQSU8gYXR0YWNoZWQgcmVtb3RlIGNvbnRyb2wgaW50ZXJmYWNlcwogICogb24gQ29uZXhhbnQgMjM4OHggYmFzZWQgVFYvRFZCIGNhcmRzLgpAQCAtMzgsMTE5ICszOCwyMDYgQEAKIAogLyogRGlnaXRhbE5vdyBETlRWIExpdmUgRFZCLVQgUmVtb3RlICovCiBzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZG50dl9saXZlX2R2Yl90W0lSX0tFWVRBQl9TSVpFXSA9IHsKLQlbIDB4MDAgXSA9IEtFWV9FU0MsICAgICAgICAgLy8gJ2dvIHVwIGEgbGV2ZWw/JwotCVsgMHgwMSBdID0gS0VZX0tQMSwgICAgICAgICAvLyAnMScKLQlbIDB4MDIgXSA9IEtFWV9LUDIsICAgICAgICAgLy8gJzInCi0JWyAweDAzIF0gPSBLRVlfS1AzLCAgICAgICAgIC8vICczJwotCVsgMHgwNCBdID0gS0VZX0tQNCwgICAgICAgICAvLyAnNCcKLQlbIDB4MDUgXSA9IEtFWV9LUDUsICAgICAgICAgLy8gJzUnCi0JWyAweDA2IF0gPSBLRVlfS1A2LCAgICAgICAgIC8vICc2JwotCVsgMHgwNyBdID0gS0VZX0tQNywgICAgICAgICAvLyAnNycKLQlbIDB4MDggXSA9IEtFWV9LUDgsICAgICAgICAgLy8gJzgnCi0JWyAweDA5IF0gPSBLRVlfS1A5LCAgICAgICAgIC8vICc5JwotCVsgMHgwYSBdID0gS0VZX0tQMCwgICAgICAgICAvLyAnMCcKLQlbIDB4MGIgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gJ3R2L2ZtJwotCVsgMHgwYyBdID0gS0VZX1NFQVJDSCwgICAgICAvLyAnc2NhbicKLQlbIDB4MGQgXSA9IEtFWV9TVE9QLCAgICAgICAgLy8gJ3N0b3AnCi0JWyAweDBlIF0gPSBLRVlfUEFVU0UsICAgICAgIC8vICdwYXVzZScKLQlbIDB4MGYgXSA9IEtFWV9MSVNULCAgICAgICAgLy8gJ3NvdXJjZScKKwlbMHgwMF0gPSBLRVlfRVNDLAkJLyogJ2dvIHVwIGEgbGV2ZWw/JyAqLworCS8qIEtleXMgMCB0byA5ICovCisJWzB4MGFdID0gS0VZX0tQMCwKKwlbMHgwMV0gPSBLRVlfS1AxLAorCVsweDAyXSA9IEtFWV9LUDIsCisJWzB4MDNdID0gS0VZX0tQMywKKwlbMHgwNF0gPSBLRVlfS1A0LAorCVsweDA1XSA9IEtFWV9LUDUsCisJWzB4MDZdID0gS0VZX0tQNiwKKwlbMHgwN10gPSBLRVlfS1A3LAorCVsweDA4XSA9IEtFWV9LUDgsCisJWzB4MDldID0gS0VZX0tQOSwKIAotCVsgMHgxMCBdID0gS0VZX01VVEUsICAgICAgICAvLyAnbXV0ZScKLQlbIDB4MTEgXSA9IEtFWV9SRVdJTkQsICAgICAgLy8gJ2JhY2t3YXJkIDw8JwotCVsgMHgxMiBdID0gS0VZX1BPV0VSLCAgICAgICAvLyAncG93ZXInCi0JWyAweDEzIF0gPSBLRVlfUywgICAgICAgICAgIC8vICdzbmFwJwotCVsgMHgxNCBdID0gS0VZX0FVRElPLCAgICAgICAvLyAnc3RlcmVvJwotCVsgMHgxNSBdID0gS0VZX0NMRUFSLCAgICAgICAvLyAncmVzZXQnCi0JWyAweDE2IF0gPSBLRVlfUExBWSwgICAgICAgIC8vICdwbGF5JwotCVsgMHgxNyBdID0gS0VZX0VOVEVSLCAgICAgICAvLyAnZW50ZXInCi0JWyAweDE4IF0gPSBLRVlfWk9PTSwgICAgICAgIC8vICdmdWxsIHNjcmVlbicKLQlbIDB4MTkgXSA9IEtFWV9GQVNURk9SV0FSRCwgLy8gJ2ZvcndhcmQgPj4nCi0JWyAweDFhIF0gPSBLRVlfQ0hBTk5FTFVQLCAgIC8vICdjaGFubmVsICsnCi0JWyAweDFiIF0gPSBLRVlfVk9MVU1FVVAsICAgIC8vICd2b2x1bWUgKycKLQlbIDB4MWMgXSA9IEtFWV9JTkZPLCAgICAgICAgLy8gJ3ByZXZpZXcnCi0JWyAweDFkIF0gPSBLRVlfUkVDT1JELCAgICAgIC8vICdyZWNvcmQnCi0JWyAweDFlIF0gPSBLRVlfQ0hBTk5FTERPV04sIC8vICdjaGFubmVsIC0nCi0JWyAweDFmIF0gPSBLRVlfVk9MVU1FRE9XTiwgIC8vICd2b2x1bWUgLScKKwlbMHgwYl0gPSBLRVlfVFVORVIsCQkvKiB0di9mbSAqLworCVsweDBjXSA9IEtFWV9TRUFSQ0gsCQkvKiBzY2FuICovCisJWzB4MGRdID0gS0VZX1NUT1AsCisJWzB4MGVdID0gS0VZX1BBVVNFLAorCVsweDBmXSA9IEtFWV9MSVNULAkJLyogc291cmNlICovCisKKwlbMHgxMF0gPSBLRVlfTVVURSwKKwlbMHgxMV0gPSBLRVlfUkVXSU5ELAkJLyogYmFja3dhcmQgPDwgKi8KKwlbMHgxMl0gPSBLRVlfUE9XRVIsCisJWzB4MTNdID0gS0VZX1MsCQkJLyogc25hcCAqLworCVsweDE0XSA9IEtFWV9BVURJTywJCS8qIHN0ZXJlbyAqLworCVsweDE1XSA9IEtFWV9DTEVBUiwJCS8qIHJlc2V0ICovCisJWzB4MTZdID0gS0VZX1BMQVksCisJWzB4MTddID0gS0VZX0VOVEVSLAorCVsweDE4XSA9IEtFWV9aT09NLAkJLyogZnVsbCBzY3JlZW4gKi8KKwlbMHgxOV0gPSBLRVlfRkFTVEZPUldBUkQsCS8qIGZvcndhcmQgPj4gKi8KKwlbMHgxYV0gPSBLRVlfQ0hBTk5FTFVQLAorCVsweDFiXSA9IEtFWV9WT0xVTUVVUCwKKwlbMHgxY10gPSBLRVlfSU5GTywJCS8qIHByZXZpZXcgKi8KKwlbMHgxZF0gPSBLRVlfUkVDT1JELAkJLyogcmVjb3JkICovCisJWzB4MWVdID0gS0VZX0NIQU5ORUxET1dOLAorCVsweDFmXSA9IEtFWV9WT0xVTUVET1dOLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBJTy1EQVRBIEJDVFY3RSBSZW1vdGUgKi8KIHN0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlW0lSX0tFWVRBQl9TSVpFXSA9IHsKLQlbIDB4NDAgXSA9IEtFWV9UViwgICAgICAgICAgICAgIC8vIFRWCi0JWyAweDIwIF0gPSBLRVlfUkFESU8sICAgICAgICAgICAvLyBGTQotCVsgMHg2MCBdID0gS0VZX0VQRywgICAgICAgICAgICAgLy8gRVBHCi0JWyAweDAwIF0gPSBLRVlfUE9XRVIsICAgICAgICAgICAvLyBwb3dlcgorCVsweDQwXSA9IEtFWV9UViwKKwlbMHgyMF0gPSBLRVlfUkFESU8sCQkvKiBGTSAqLworCVsweDYwXSA9IEtFWV9FUEcsCisJWzB4MDBdID0gS0VZX1BPV0VSLAogCi0JWyAweDUwIF0gPSBLRVlfS1AxLCAgICAgICAgICAgICAvLyAxCi0JWyAweDMwIF0gPSBLRVlfS1AyLCAgICAgICAgICAgICAvLyAyCi0JWyAweDcwIF0gPSBLRVlfS1AzLCAgICAgICAgICAgICAvLyAzCi0JWyAweDEwIF0gPSBLRVlfTCwgICAgICAgICAgICAgICAvLyBMaXZlCisJLyogS2V5cyAwIHRvIDkgKi8KKwlbMHg0NF0gPSBLRVlfS1AwLAkJLyogMTAgKi8KKwlbMHg1MF0gPSBLRVlfS1AxLAorCVsweDMwXSA9IEtFWV9LUDIsCisJWzB4NzBdID0gS0VZX0tQMywKKwlbMHg0OF0gPSBLRVlfS1A0LAorCVsweDI4XSA9IEtFWV9LUDUsCisJWzB4NjhdID0gS0VZX0tQNiwKKwlbMHg1OF0gPSBLRVlfS1A3LAorCVsweDM4XSA9IEtFWV9LUDgsCisJWzB4NzhdID0gS0VZX0tQOSwKIAotCVsgMHg0OCBdID0gS0VZX0tQNCwgICAgICAgICAgICAgLy8gNAotCVsgMHgyOCBdID0gS0VZX0tQNSwgICAgICAgICAgICAgLy8gNQotCVsgMHg2OCBdID0gS0VZX0tQNiwgICAgICAgICAgICAgLy8gNgotCVsgMHgwOCBdID0gS0VZX1QsICAgICAgICAgICAgICAgLy8gVGltZSBTaGlmdAorCVsweDEwXSA9IEtFWV9MLAkJCS8qIExpdmUgKi8KKwlbMHgwOF0gPSBLRVlfVCwJCQkvKiBUaW1lIFNoaWZ0ICovCiAKLQlbIDB4NTggXSA9IEtFWV9LUDcsICAgICAgICAgICAgIC8vIDcKLQlbIDB4MzggXSA9IEtFWV9LUDgsICAgICAgICAgICAgIC8vIDgKLQlbIDB4NzggXSA9IEtFWV9LUDksICAgICAgICAgICAgIC8vIDkKLQlbIDB4MTggXSA9IEtFWV9QTEFZUEFVU0UsICAgICAgIC8vIFBsYXkKKwlbMHgxOF0gPSBLRVlfUExBWVBBVVNFLAkJLyogUGxheSAqLwogCi0JWyAweDQ0IF0gPSBLRVlfS1AwLCAgICAgICAgICAgICAvLyAxMAotCVsgMHgyNCBdID0gS0VZX0VOVEVSLCAgICAgICAgICAgLy8gMTEKLQlbIDB4NjQgXSA9IEtFWV9FU0MsICAgICAgICAgICAgIC8vIDEyCi0JWyAweDA0IF0gPSBLRVlfTSwgICAgICAgICAgICAgICAvLyBNdWx0aQorCVsweDI0XSA9IEtFWV9FTlRFUiwJCS8qIDExICovCisJWzB4NjRdID0gS0VZX0VTQywJCS8qIDEyICovCisJWzB4MDRdID0gS0VZX00sCQkJLyogTXVsdGkgKi8KIAotCVsgMHg1NCBdID0gS0VZX1ZJREVPLCAgICAgICAgICAgLy8gVklERU8KLQlbIDB4MzQgXSA9IEtFWV9DSEFOTkVMVVAsICAgICAgIC8vIGNoYW5uZWwgKwotCVsgMHg3NCBdID0gS0VZX1ZPTFVNRVVQLCAgICAgICAgLy8gdm9sdW1lICsKLQlbIDB4MTQgXSA9IEtFWV9NVVRFLCAgICAgICAgICAgIC8vIE11dGUKKwlbMHg1NF0gPSBLRVlfVklERU8sCisJWzB4MzRdID0gS0VZX0NIQU5ORUxVUCwKKwlbMHg3NF0gPSBLRVlfVk9MVU1FVVAsCisJWzB4MTRdID0gS0VZX01VVEUsCiAKLQlbIDB4NGMgXSA9IEtFWV9TLCAgICAgICAgICAgICAgIC8vIFNWSURFTwotCVsgMHgyYyBdID0gS0VZX0NIQU5ORUxET1dOLCAgICAgLy8gY2hhbm5lbCAtCi0JWyAweDZjIF0gPSBLRVlfVk9MVU1FRE9XTiwgICAgICAvLyB2b2x1bWUgLQotCVsgMHgwYyBdID0gS0VZX1pPT00sICAgICAgICAgICAgLy8gWm9vbQorCVsweDRjXSA9IEtFWV9TLAkJCS8qIFNWSURFTyAqLworCVsweDJjXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbMHg2Y10gPSBLRVlfVk9MVU1FRE9XTiwKKwlbMHgwY10gPSBLRVlfWk9PTSwKIAotCVsgMHg1YyBdID0gS0VZX1BBVVNFLCAgICAgICAgICAgLy8gcGF1c2UKLQlbIDB4M2MgXSA9IEtFWV9DLCAgICAgICAgICAgICAgIC8vIHx8IChyZWQpCi0JWyAweDdjIF0gPSBLRVlfUkVDT1JELCAgICAgICAgICAvLyByZWNvcmRpbmcKLQlbIDB4MWMgXSA9IEtFWV9TVE9QLCAgICAgICAgICAgIC8vIHN0b3AKKwlbMHg1Y10gPSBLRVlfUEFVU0UsCisJWzB4M2NdID0gS0VZX0MsCQkJLyogfHwgKHJlZCkgKi8KKwlbMHg3Y10gPSBLRVlfUkVDT1JELAkJLyogcmVjb3JkaW5nICovCisJWzB4MWNdID0gS0VZX1NUT1AsCiAKLQlbIDB4NDEgXSA9IEtFWV9SRVdJTkQsICAgICAgICAgIC8vIGJhY2t3YXJkIDw8Ci0JWyAweDIxIF0gPSBLRVlfUExBWSwgICAgICAgICAgICAvLyBwbGF5Ci0JWyAweDYxIF0gPSBLRVlfRkFTVEZPUldBUkQsICAgICAvLyBmb3J3YXJkID4+Ci0JWyAweDAxIF0gPSBLRVlfTkVYVCwgICAgICAgICAgICAvLyBza2lwID58CisJWzB4NDFdID0gS0VZX1JFV0lORCwJCS8qIGJhY2t3YXJkIDw8ICovCisJWzB4MjFdID0gS0VZX1BMQVksCisJWzB4NjFdID0gS0VZX0ZBU1RGT1JXQVJELAkvKiBmb3J3YXJkID4+ICovCisJWzB4MDFdID0gS0VZX05FWFQsCQkvKiBza2lwID58ICovCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEFEUyBUZWNoIEluc3RhbnQgVFYgRFZCLVQgUENJIFJlbW90ZSAqLworc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2Fkc3RlY2hfZHZiX3RfcGNpW0lSX0tFWVRBQl9TSVpFXSA9IHsKKwkvKiBLZXlzIDAgdG8gOSAqLworCVsweDRkXSA9IEtFWV8wLAorCVsweDU3XSA9IEtFWV8xLAorCVsweDRmXSA9IEtFWV8yLAorCVsweDUzXSA9IEtFWV8zLAorCVsweDU2XSA9IEtFWV80LAorCVsweDRlXSA9IEtFWV81LAorCVsweDVlXSA9IEtFWV82LAorCVsweDU0XSA9IEtFWV83LAorCVsweDRjXSA9IEtFWV84LAorCVsweDVjXSA9IEtFWV85LAorCisJWzB4NWJdID0gS0VZX1BPV0VSLAorCVsweDVmXSA9IEtFWV9NVVRFLAorCVsweDU1XSA9IEtFWV9HT1RPLAorCVsweDVkXSA9IEtFWV9TRUFSQ0gsCisJWzB4MTddID0gS0VZX0VQRywJCS8qIEd1aWRlICovCisJWzB4MWZdID0gS0VZX01FTlUsCisJWzB4MGZdID0gS0VZX1VQLAorCVsweDQ2XSA9IEtFWV9ET1dOLAorCVsweDE2XSA9IEtFWV9MRUZULAorCVsweDFlXSA9IEtFWV9SSUdIVCwKKwlbMHgwZV0gPSBLRVlfU0VMRUNULAkJLyogRW50ZXIgKi8KKwlbMHg1YV0gPSBLRVlfSU5GTywKKwlbMHg1Ml0gPSBLRVlfRVhJVCwKKwlbMHg1OV0gPSBLRVlfUFJFVklPVVMsCisJWzB4NTFdID0gS0VZX05FWFQsCisJWzB4NThdID0gS0VZX1JFV0lORCwKKwlbMHg1MF0gPSBLRVlfRk9SV0FSRCwKKwlbMHg0NF0gPSBLRVlfUExBWVBBVVNFLAorCVsweDA3XSA9IEtFWV9TVE9QLAorCVsweDFiXSA9IEtFWV9SRUNPUkQsCisJWzB4MTNdID0gS0VZX1RVTkVSLAkJLyogTGl2ZSAqLworCVsweDBhXSA9IEtFWV9BLAorCVsweDEyXSA9IEtFWV9CLAorCVsweDAzXSA9IEtFWV9QUk9HMSwJCS8qIDEgKi8KKwlbMHgwMV0gPSBLRVlfUFJPRzIsCQkvKiAyICovCisJWzB4MDBdID0gS0VZX1BST0czLAkJLyogMyAqLworCVsweDA2XSA9IEtFWV9EVkQsCisJWzB4NDhdID0gS0VZX0FVWCwJCS8qIFBob3RvICovCisJWzB4NDBdID0gS0VZX1ZJREVPLAorCVsweDE5XSA9IEtFWV9BVURJTywJCS8qIE11c2ljICovCisJWzB4MGJdID0gS0VZX0NIQU5ORUxVUCwKKwlbMHgwOF0gPSBLRVlfQ0hBTk5FTERPV04sCisJWzB4MTVdID0gS0VZX1ZPTFVNRVVQLAorCVsweDFjXSA9IEtFWV9WT0xVTUVET1dOLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBNU0kgVFZAbnl3aGVyZSByZW1vdGUgKi8KK3N0YXRpYyBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19tc2lfdHZhbnl3aGVyZVtJUl9LRVlUQUJfU0laRV0gPSB7CisJLyogS2V5cyAwIHRvIDkgKi8KKwlbMHgwMF0gPSBLRVlfMCwKKwlbMHgwMV0gPSBLRVlfMSwKKwlbMHgwMl0gPSBLRVlfMiwKKwlbMHgwM10gPSBLRVlfMywKKwlbMHgwNF0gPSBLRVlfNCwKKwlbMHgwNV0gPSBLRVlfNSwKKwlbMHgwNl0gPSBLRVlfNiwKKwlbMHgwN10gPSBLRVlfNywKKwlbMHgwOF0gPSBLRVlfOCwKKwlbMHgwOV0gPSBLRVlfOSwKKworCVsweDBjXSA9IEtFWV9NVVRFLAorCVsweDBmXSA9IEtFWV9TQ1JFRU4sCQkvKiBGdWxsIFNjcmVlbiAqLworCVsweDEwXSA9IEtFWV9GLAkJCS8qIEZ1bnRpb24gKi8KKwlbMHgxMV0gPSBLRVlfVCwJCQkvKiBUaW1lIHNoaWZ0ICovCisJWzB4MTJdID0gS0VZX1BPV0VSLAorCVsweDEzXSA9IEtFWV9NRURJQSwJCS8qIE1UUyAqLworCVsweDE0XSA9IEtFWV9TTE9XLAorCVsweDE2XSA9IEtFWV9SRVdJTkQsCQkvKiBiYWNrd2FyZCA8PCAqLworCVsweDE3XSA9IEtFWV9FTlRFUiwJCS8qIFJldHVybiAqLworCVsweDE4XSA9IEtFWV9GQVNURk9SV0FSRCwJLyogZm9yd2FyZCA+PiAqLworCVsweDFhXSA9IEtFWV9DSEFOTkVMVVAsCisJWzB4MWJdID0gS0VZX1ZPTFVNRVVQLAorCVsweDFlXSA9IEtFWV9DSEFOTkVMRE9XTiwKKwlbMHgxZl0gPSBLRVlfVk9MVU1FRE9XTiwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IGN4ODhfSVIgewotCXN0cnVjdCBjeDg4X2NvcmUJKmNvcmU7Ci0Jc3RydWN0IGlucHV0X2RldiAgICAgICAgaW5wdXQ7Ci0Jc3RydWN0IGlyX2lucHV0X3N0YXRlICAgaXI7Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgbmFtZVszMl07Ci0JY2hhciAgICAgICAgICAgICAgICAgICAgcGh5c1szMl07CisJc3RydWN0IGN4ODhfY29yZSAqY29yZTsKKwlzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0OworCXN0cnVjdCBpcl9pbnB1dF9zdGF0ZSBpcjsKKwljaGFyIG5hbWVbMzJdOworCWNoYXIgcGh5c1szMl07CiAKIAkvKiBzYW1wbGUgZnJvbSBncGlvIHBpbiAxNiAqLwotCWludCAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbMTZdOwotCWludCAgICAgICAgICAgICAgICAgICAgIHNjb3VudDsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICByZWxlYXNlOworCWludCBzYW1wbGluZzsKKwl1MzIgc2FtcGxlc1sxNl07CisJaW50IHNjb3VudDsKKwl1bnNpZ25lZCBsb25nIHJlbGVhc2U7CiAKIAkvKiBwb2xsIGV4dGVybmFsIGRlY29kZXIgKi8KLQlpbnQgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nOwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIHdvcms7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgdGltZXI7Ci0JdTMyCQkJZ3Bpb19hZGRyOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIGxhc3RfZ3BpbzsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBtYXNrX2tleWNvZGU7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgbWFza19rZXlkb3duOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIG1hc2tfa2V5dXA7CisJaW50IHBvbGxpbmc7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJdTMyIGdwaW9fYWRkcjsKKwl1MzIgbGFzdF9ncGlvOworCXUzMiBtYXNrX2tleWNvZGU7CisJdTMyIG1hc2tfa2V5ZG93bjsKKwl1MzIgbWFza19rZXl1cDsKIH07CiAKIHN0YXRpYyBpbnQgaXJfZGVidWcgPSAwOwotbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOyAgICAvKiBkZWJ1ZyBsZXZlbCBbSVJdICovCittb2R1bGVfcGFyYW0oaXJfZGVidWcsIGludCwgMDY0NCk7CS8qIGRlYnVnIGxldmVsIFtJUl0gKi8KIE1PRFVMRV9QQVJNX0RFU0MoaXJfZGVidWcsICJlbmFibGUgZGVidWcgbWVzc2FnZXMgW0lSXSIpOwogCiAjZGVmaW5lIGlyX2RwcmludGsoZm10LCBhcmcuLi4pCWlmIChpcl9kZWJ1ZykgXApAQCAtMTc0LDM3ICsyNjEsMzcgQEAKIAkvKiBleHRyYWN0IGRhdGEgKi8KIAlkYXRhID0gaXJfZXh0cmFjdF9iaXRzKGdwaW8sIGlyLT5tYXNrX2tleWNvZGUpOwogCWlyX2RwcmludGsoImlycSBncGlvPTB4JXggY29kZT0lZCB8ICVzJXMlc1xuIiwKLQkJZ3BpbywgZGF0YSwKLQkJaXItPnBvbGxpbmcgICAgICAgICAgICAgICA/ICJwb2xsIiAgOiAiaXJxIiwKLQkJKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSA/ICIgZG93biIgOiAiIiwKLQkJKGdwaW8gJiBpci0+bWFza19rZXl1cCkgICA/ICIgdXAiICAgOiAiIik7CisJCSAgIGdwaW8sIGRhdGEsCisJCSAgIGlyLT5wb2xsaW5nID8gInBvbGwiIDogImlycSIsCisJCSAgIChncGlvICYgaXItPm1hc2tfa2V5ZG93bikgPyAiIGRvd24iIDogIiIsCisJCSAgIChncGlvICYgaXItPm1hc2tfa2V5dXApID8gIiB1cCIgOiAiIik7CiAKIAlpZiAoaXItPm1hc2tfa2V5ZG93bikgewogCQkvKiBiaXQgc2V0IG9uIGtleWRvd24gKi8KIAkJaWYgKGdwaW8gJiBpci0+bWFza19rZXlkb3duKSB7Ci0JCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsJmlyLT5pcixkYXRhLGRhdGEpOworCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKIAkJfSBlbHNlIHsKLQkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCAmaXItPmlyKTsKIAkJfQogCiAJfSBlbHNlIGlmIChpci0+bWFza19rZXl1cCkgewogCQkvKiBiaXQgY2xlYXJlZCBvbiBrZXlkb3duICovCiAJCWlmICgwID09IChncGlvICYgaXItPm1hc2tfa2V5dXApKSB7Ci0JCQlpcl9pbnB1dF9rZXlkb3duKCZpci0+aW5wdXQsJmlyLT5pcixkYXRhLGRhdGEpOworCQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKIAkJfSBlbHNlIHsKLQkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCQlpcl9pbnB1dF9ub2tleSgmaXItPmlucHV0LCAmaXItPmlyKTsKIAkJfQogCiAJfSBlbHNlIHsKIAkJLyogY2FuJ3QgZGlzdGluZ3Vpc2gga2V5ZG93bi91cCA6LS8gKi8KLQkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCZpci0+aXIsZGF0YSxkYXRhKTsKLQkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwmaXItPmlyKTsKKwkJaXJfaW5wdXRfa2V5ZG93bigmaXItPmlucHV0LCAmaXItPmlyLCBkYXRhLCBkYXRhKTsKKwkJaXJfaW5wdXRfbm9rZXkoJmlyLT5pbnB1dCwgJmlyLT5pcik7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBpcl90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGN4ODhfSVIgKmlyID0gKHN0cnVjdCBjeDg4X0lSKilkYXRhOworCXN0cnVjdCBjeDg4X0lSICppciA9IChzdHJ1Y3QgY3g4OF9JUiAqKWRhdGE7CiAKIAlzY2hlZHVsZV93b3JrKCZpci0+d29yayk7CiB9CkBAIC0yMjcsNDEgKzMxNCw2NCBAQAogCUlSX0tFWVRBQl9UWVBFICppcl9jb2RlcyA9IE5VTEw7CiAJaW50IGlyX3R5cGUgPSBJUl9UWVBFX09USEVSOwogCi0JaXIgPSBrbWFsbG9jKHNpemVvZigqaXIpLEdGUF9LRVJORUwpOworCWlyID0ga21hbGxvYyhzaXplb2YoKmlyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKE5VTEwgPT0gaXIpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChpciwwLHNpemVvZigqaXIpKTsKKwltZW1zZXQoaXIsIDAsIHNpemVvZigqaXIpKTsKIAogCS8qIGRldGVjdCAmIGNvbmZpZ3VyZSAqLwogCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKIAljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UOgotCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfZG50dl9saXZlX2R2Yl90OwotCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AxX0lPOworCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCX1Q6CisJCWlyX2NvZGVzID0gaXJfY29kZXNfZG50dl9saXZlX2R2Yl90OworCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AxX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHgxZjsKLQkJaXItPm1hc2tfa2V5dXAgICA9IDB4NjA7Ci0JCWlyLT5wb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJaXItPm1hc2tfa2V5dXAgPSAweDYwOworCQlpci0+cG9sbGluZyA9IDUwOyAvKiBtcyAqLwogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfRFZCX1QxOgotCQlpcl9jb2RlcyAgICAgICAgID0gaXJfY29kZXNfaGF1cHBhdWdlX25ldzsKLQkJaXJfdHlwZSAgICAgICAgICA9IElSX1RZUEVfUkM1OwotCQlpci0+c2FtcGxpbmcgICAgID0gMTsKKwkJaXJfY29kZXMgPSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3OworCQlpcl90eXBlID0gSVJfVFlQRV9SQzU7CisJCWlyLT5zYW1wbGluZyA9IDE7CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKLQkJaXJfY29kZXMgICAgICAgICA9IGlyX2NvZGVzX3dpbmZhc3Q7Ci0JCWlyLT5ncGlvX2FkZHIgICAgPSBNT19HUDBfSU87CisJCWlyX2NvZGVzID0gaXJfY29kZXNfd2luZmFzdDsKKwkJaXItPmdwaW9fYWRkciA9IE1PX0dQMF9JTzsKIAkJaXItPm1hc2tfa2V5Y29kZSA9IDB4OGY4OwotCQlpci0+bWFza19rZXl1cCAgID0gMHgxMDA7Ci0JCWlyLT5wb2xsaW5nICAgICAgPSAxOyAvLyBtcworCQlpci0+bWFza19rZXl1cCA9IDB4MTAwOworCQlpci0+cG9sbGluZyA9IDE7IC8qIG1zICovCiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9JT0RBVEFfR1ZCQ1RWN0U6Ci0JCWlyX2NvZGVzICAgICAgICAgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOwotCQlpci0+Z3Bpb19hZGRyICAgID0gTU9fR1AwX0lPOworCQlpcl9jb2RlcyA9IGlyX2NvZGVzX2lvZGF0YV9iY3R2N2U7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDBfSU87CiAJCWlyLT5tYXNrX2tleWNvZGUgPSAweGZkOwogCQlpci0+bWFza19rZXlkb3duID0gMHgwMjsKLQkJaXItPnBvbGxpbmcgICAgICA9IDU7IC8vIG1zCisJCWlyLT5wb2xsaW5nID0gNTsgLyogbXMgKi8KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfVUxUUkFfUFJPOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX3BpeGVsdmlldzsKKwkJaXItPmdwaW9fYWRkciA9IE1PX0dQMV9JTzsKKwkJaXItPm1hc2tfa2V5Y29kZSA9IDB4MWY7CisJCWlyLT5tYXNrX2tleXVwID0gMHg4MDsKKwkJaXItPnBvbGxpbmcgPSAxOyAvKiBtcyAqLworCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0k6CisJCWlyX2NvZGVzID0gaXJfY29kZXNfYWRzdGVjaF9kdmJfdF9wY2k7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDFfSU87CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweGJmOworCQlpci0+bWFza19rZXl1cCA9IDB4NDA7CisJCWlyLT5wb2xsaW5nID0gNTA7IC8qIG1zICovCisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9NU0lfVFZBTllXSEVSRV9NQVNURVI6CisJCWlyX2NvZGVzID0gaXJfY29kZXNfbXNpX3R2YW55d2hlcmU7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDFfSU87CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweDFmOworCQlpci0+bWFza19rZXl1cCA9IDB4NDA7CisJCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KIAkJYnJlYWs7CiAJfQorCiAJaWYgKE5VTEwgPT0gaXJfY29kZXMpIHsKIAkJa2ZyZWUoaXIpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI3MCw4ICszODAsNyBAQAogCS8qIGluaXQgaW5wdXQgZGV2aWNlICovCiAJc25wcmludGYoaXItPm5hbWUsIHNpemVvZihpci0+bmFtZSksICJjeDg4IElSICglcykiLAogCQkgY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLm5hbWUpOwotCXNucHJpbnRmKGlyLT5waHlzLCBzaXplb2YoaXItPnBoeXMpLCAicGNpLSVzL2lyMCIsCi0JCSBwY2lfbmFtZShwY2kpKTsKKwlzbnByaW50Zihpci0+cGh5cywgc2l6ZW9mKGlyLT5waHlzKSwgInBjaS0lcy9pcjAiLCBwY2lfbmFtZShwY2kpKTsKIAogCWlyX2lucHV0X2luaXQoJmlyLT5pbnB1dCwgJmlyLT5pciwgaXJfdHlwZSwgaXJfY29kZXMpOwogCWlyLT5pbnB1dC5uYW1lID0gaXItPm5hbWU7CkBAIC0yNzksMTAgKzM4OCwxMCBAQAogCWlyLT5pbnB1dC5pZC5idXN0eXBlID0gQlVTX1BDSTsKIAlpci0+aW5wdXQuaWQudmVyc2lvbiA9IDE7CiAJaWYgKHBjaS0+c3Vic3lzdGVtX3ZlbmRvcikgewotCQlpci0+aW5wdXQuaWQudmVuZG9yICA9IHBjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKKwkJaXItPmlucHV0LmlkLnZlbmRvciA9IHBjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKIAkJaXItPmlucHV0LmlkLnByb2R1Y3QgPSBwY2ktPnN1YnN5c3RlbV9kZXZpY2U7CiAJfSBlbHNlIHsKLQkJaXItPmlucHV0LmlkLnZlbmRvciAgPSBwY2ktPnZlbmRvcjsKKwkJaXItPmlucHV0LmlkLnZlbmRvciA9IHBjaS0+dmVuZG9yOwogCQlpci0+aW5wdXQuaWQucHJvZHVjdCA9IHBjaS0+ZGV2aWNlOwogCX0KIApAQCAtMjk0LDEzICs0MDMsMTMgQEAKIAkJSU5JVF9XT1JLKCZpci0+d29yaywgY3g4OF9pcl93b3JrLCBpcik7CiAJCWluaXRfdGltZXIoJmlyLT50aW1lcik7CiAJCWlyLT50aW1lci5mdW5jdGlvbiA9IGlyX3RpbWVyOwotCQlpci0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylpcjsKKwkJaXItPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpcjsKIAkJc2NoZWR1bGVfd29yaygmaXItPndvcmspOwogCX0KIAlpZiAoaXItPnNhbXBsaW5nKSB7Ci0JCWNvcmUtPnBjaV9pcnFtYXNrIHw9ICgxPDwxOCk7ICAgLy8gSVJfU01QX0lOVAotCQljeF93cml0ZShNT19ERFNfSU8sIDB4YTgwYTgwKTsgIC8vIDQga0h6IHNhbXBsZSByYXRlCi0JCWN4X3dyaXRlKE1PX0REU0NGR19JTywgICAweDUpOyAgLy8gZW5hYmxlCisJCWNvcmUtPnBjaV9pcnFtYXNrIHw9ICgxIDw8IDE4KTsJLyogSVJfU01QX0lOVCAqLworCQljeF93cml0ZShNT19ERFNfSU8sIDB4YTgwYTgwKTsJLyogNCBrSHogc2FtcGxlIHJhdGUgKi8KKwkJY3hfd3JpdGUoTU9fRERTQ0ZHX0lPLCAweDUpOwkvKiBlbmFibGUgKi8KIAl9CiAKIAkvKiBhbGwgZG9uZSAqLwpAQCAtMzM2LDcgKzQ0NSw3IEBACiB2b2lkIGN4ODhfaXJfaXJxKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUpCiB7CiAJc3RydWN0IGN4ODhfSVIgKmlyID0gY29yZS0+aXI7Ci0JdTMyIHNhbXBsZXMscmM1OworCXUzMiBzYW1wbGVzLCByYzU7CiAJaW50IGk7CiAKIAlpZiAoTlVMTCA9PSBpcikKQEAgLTM0NSw3ICs0NTQsNyBAQAogCQlyZXR1cm47CiAKIAlzYW1wbGVzID0gY3hfcmVhZChNT19TQU1QTEVfSU8pOwotCWlmICgwICE9IHNhbXBsZXMgICYmICAweGZmZmZmZmZmICE9IHNhbXBsZXMpIHsKKwlpZiAoMCAhPSBzYW1wbGVzICYmIDB4ZmZmZmZmZmYgIT0gc2FtcGxlcykgewogCQkvKiByZWNvcmQgc2FtcGxlIGRhdGEgKi8KIAkJaWYgKGlyLT5zY291bnQgPCBBUlJBWV9TSVpFKGlyLT5zYW1wbGVzKSkKIAkJCWlyLT5zYW1wbGVzW2lyLT5zY291bnQrK10gPSBzYW1wbGVzOwpAQCAtMzUzLDggKzQ2Miw4IEBACiAJfQogCWlmICghaXItPnNjb3VudCkgewogCQkvKiBub3RoaW5nIHRvIHNhbXBsZSAqLwotCQlpZiAoaXItPmlyLmtleXByZXNzZWQgJiYgdGltZV9hZnRlcihqaWZmaWVzLGlyLT5yZWxlYXNlKSkKLQkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsJmlyLT5pcik7CisJCWlmIChpci0+aXIua2V5cHJlc3NlZCAmJiB0aW1lX2FmdGVyKGppZmZpZXMsIGlyLT5yZWxlYXNlKSkKKwkJCWlyX2lucHV0X25va2V5KCZpci0+aW5wdXQsICZpci0+aXIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zNjQsMTQgKzQ3MywxNCBAQAogCWZvciAoaSA9IDA7IGkgPCBpci0+c2NvdW50OyBpKyspCiAJCWlyLT5zYW1wbGVzW2ldID0gfmlyLT5zYW1wbGVzW2ldOwogCWlmIChpcl9kZWJ1ZykKLQkJaXJfZHVtcF9zYW1wbGVzKGlyLT5zYW1wbGVzLGlyLT5zY291bnQpOworCQlpcl9kdW1wX3NhbXBsZXMoaXItPnNhbXBsZXMsIGlyLT5zY291bnQpOwogCiAJLyogZGVjb2RlIGl0ICovCiAJc3dpdGNoIChjb3JlLT5ib2FyZCkgewogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0U6CiAJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDE6Ci0JCXJjNSA9IGlyX2RlY29kZV9iaXBoYXNlKGlyLT5zYW1wbGVzLGlyLT5zY291bnQsNSw3KTsKLQkJaXJfZHByaW50aygiYmlwaGFzZSBkZWNvZGVkOiAleFxuIixyYzUpOworCQlyYzUgPSBpcl9kZWNvZGVfYmlwaGFzZShpci0+c2FtcGxlcywgaXItPnNjb3VudCwgNSwgNyk7CisJCWlyX2RwcmludGsoImJpcGhhc2UgZGVjb2RlZDogJXhcbiIsIHJjNSk7CiAJCWlmICgocmM1ICYgMHhmZmZmZjAwMCkgIT0gMHgzMDAwKQogCQkJYnJlYWs7CiAJCWlyX2lucHV0X2tleWRvd24oJmlyLT5pbnB1dCwgJmlyLT5pciwgcmM1ICYgMHgzZiwgcmM1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCAwN2FhZTE4Li5mZTI3NjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogY3g4OC1tcGVnLmMsdiAxLjI1IDIwMDUvMDMvMDcgMTQ6MTg6MDAga3JheGVsIEV4cCAkCisgKiAkSWQ6IGN4ODgtbXBlZy5jLHYgMS4zMSAyMDA1LzA3LzA3IDE0OjE3OjQ3IG1jaGVoYWIgRXhwICQKICAqCiAgKiAgU3VwcG9ydCBmb3IgdGhlIG1wZWcgdHJhbnNwb3J0IHN0cmVhbSB0cmFuc2ZlcnMKICAqICBQQ0kgZnVuY3Rpb24gIzIgb2YgdGhlIGN4MjM4OHguCkBAIC01NSw3ICs1NSw3IEBACiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAotCWRwcmludGsoMSwgImN4ODgwMl9zdGFydF9tcGVncG9ydF9kbWEgJWRcbiIsIGJ1Zi0+dmIud2lkdGgpOworCWRwcmludGsoMCwgImN4ODgwMl9zdGFydF9kbWEgJWRcbiIsIGJ1Zi0+dmIud2lkdGgpOwogCiAJLyogc2V0dXAgZmlmbyArIGZvcm1hdCAqLwogCWN4ODhfc3JhbV9jaGFubmVsX3NldHVwKGNvcmUsICZjeDg4X3NyYW1fY2hhbm5lbHNbU1JBTV9DSDI4XSwKQEAgLTY0LDE3ICs2NCwyMSBAQAogCS8qIHdyaXRlIFRTIGxlbmd0aCB0byBjaGlwICovCiAJY3hfd3JpdGUoTU9fVFNfTE5HVEgsIGJ1Zi0+dmIud2lkdGgpOwogCi0jaWYgMQogCS8qIEZJWE1FOiB0aGlzIG5lZWRzIGEgcmV2aWV3LgogCSAqIGFsc286IG1vdmUgdG8gY3g4OC1ibGFja2JpcmQgKyBjeDg4LWR2YiBzb3VyY2UgZmlsZXM/ICovCiAKIAlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmR2YikgewogCQkvKiBuZWdlZGdlIGRyaXZlbiAmIHNvZnR3YXJlIHJlc2V0ICovCi0JCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHg0MCk7CisJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgMHgwMDQwIHwgZGV2LT50c19nZW5fY250cmwpOwogCQl1ZGVsYXkoMTAwKTsKIAkJY3hfd3JpdGUoTU9fUElOTVVYX0lPLCAweDAwKTsKLQkJY3hfd3JpdGUoVFNfSFdfU09QX0NOVFJMLDQ3PDwxNnwxODg8PDR8MHgwMCk7Ci0JCWN4X3dyaXRlKFRTX1NPUF9TVEFULDB4MDApOworCQljeF93cml0ZShUU19IV19TT1BfQ05UUkwsMHg0Nzw8MTZ8MTg4PDw0fDB4MDEpOworCQlpZiAoKGNvcmUtPmJvYXJkID09IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUSkgfHwKKwkJICAgIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1QpKSB7CisJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMTw8MTMpOworCQl9IGVsc2UgeworCQkJY3hfd3JpdGUoVFNfU09QX1NUQVQsIDB4MDApOworCQl9CiAJCWN4X3dyaXRlKFRTX0dFTl9DTlRSTCwgZGV2LT50c19nZW5fY250cmwpOwogCQl1ZGVsYXkoMTAwKTsKIAl9CkBAIC05MywyNSArOTcsMjcgQEAKIAkJY3hfd3JpdGUoVFNfR0VOX0NOVFJMLCAweDA2KTsgLyogcHVuY3R1cmVkIGNsb2NrIFRTICYgcG9zZWRnZSBkcml2ZW4gKi8KIAkJdWRlbGF5KDEwMCk7CiAJfQotI2VuZGlmCiAKIAkvKiByZXNldCBjb3VudGVyICovCiAJY3hfd3JpdGUoTU9fVFNfR1BDTlRSTCwgR1BfQ09VTlRfQ09OVFJPTF9SRVNFVCk7CiAJcS0+Y291bnQgPSAxOwogCiAJLyogZW5hYmxlIGlycXMgKi8KKwlkcHJpbnRrKCAwLCAic2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2tcbiIgKTsKIAljeF9zZXQoTU9fUENJX0lOVE1TSywgY29yZS0+cGNpX2lycW1hc2sgfCAweDA0KTsKLQljeF93cml0ZShNT19UU19JTlRNU0ssICAweDFmMDAxMSk7CisJY3hfc2V0KE1PX1RTX0lOVE1TSywgIDB4MWYwMDExKTsKKwkvL2N4X3dyaXRlKE1PX1RTX0lOVE1TSywgIDB4MGYwMDExKTsKIAogCS8qIHN0YXJ0IGRtYSAqLwotCWN4X3dyaXRlKE1PX0RFVl9DTlRSTDIsICgxPDw1KSk7IC8qIEZJWE1FOiBzL3dyaXRlL3NldC8gPz8/ICovCi0JY3hfd3JpdGUoTU9fVFNfRE1BQ05UUkwsIDB4MTEpOworCWN4X3NldChNT19ERVZfQ05UUkwyLCAoMTw8NSkpOworCWN4X3NldChNT19UU19ETUFDTlRSTCwgMHgxMSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3g4ODAyX3N0b3BfZG1hKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKKwlkcHJpbnRrKCAwLCAiY3g4ODAyX3N0b3BfZG1hXG4iICk7CiAKIAkvKiBzdG9wIGRtYSAqLwogCWN4X2NsZWFyKE1PX1RTX0RNQUNOVFJMLCAweDExKTsKQEAgLTEzMSw4ICsxMzcsMTIgQEAKIAlzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtOwogCisJZHByaW50ayggMCwgImN4ODgwMl9yZXN0YXJ0X3F1ZXVlXG4iICk7CiAJaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpCisJeworCQlkcHJpbnRrKCAwLCAiY3g4ODAyX3Jlc3RhcnRfcXVldWU6IHF1ZXVlIGlzIGVtcHR5XG4iICk7CiAJCXJldHVybiAwOworCX0KIAogCWJ1ZiA9IGxpc3RfZW50cnkocS0+YWN0aXZlLm5leHQsIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOwogCWRwcmludGsoMiwicmVzdGFydF9xdWV1ZSBbJXAvJWRdOiByZXN0YXJ0IGRtYVxuIiwKQEAgLTE4MiwyNyArMTkyLDMyIEBACiAJc3RydWN0IGN4ODhfYnVmZmVyICAgICpwcmV2OwogCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAqcSAgICA9ICZkZXYtPm1wZWdxOwogCisJZHByaW50ayggMSwgImN4ODgwMl9idWZfcXVldWVcbiIgKTsKIAkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCiAJYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7CiAJYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKIAogCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7CisJCWRwcmludGsoIDAsICJxdWV1ZSBpcyBlbXB0eSAtIGZpcnN0IGFjdGl2ZVxuIiApOwogCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOwogCQljeDg4MDJfc3RhcnRfZG1hKGRldiwgcSwgYnVmKTsKIAkJYnVmLT52Yi5zdGF0ZSA9IFNUQVRFX0FDVElWRTsKIAkJYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CiAJCW1vZF90aW1lcigmcS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMiwiWyVwLyVkXSAlcyAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJZHByaW50aygwLCJbJXAvJWRdICVzIC0gZmlyc3QgYWN0aXZlXG4iLAogCQkJYnVmLCBidWYtPnZiLmksIF9fRlVOQ1RJT05fXyk7CisJCS8vdWRlbGF5KDEwMCk7CiAKIAl9IGVsc2UgeworCQlkcHJpbnRrKCAxLCAicXVldWUgaXMgbm90IGVtcHR5IC0gYXBwZW5kIHRvIGFjdGl2ZVxuIiApOwogCQlwcmV2ID0gbGlzdF9lbnRyeShxLT5hY3RpdmUucHJldiwgc3RydWN0IGN4ODhfYnVmZmVyLCB2Yi5xdWV1ZSk7CiAJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJnEtPmFjdGl2ZSk7CiAJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CiAJCWJ1Zi0+Y291bnQgICAgPSBxLT5jb3VudCsrOwogCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwotCQlkcHJpbnRrKDIsIlslcC8lZF0gJXMgLSBhcHBlbmQgdG8gYWN0aXZlXG4iLAorCQlkcHJpbnRrKCAxLCAiWyVwLyVkXSAlcyAtIGFwcGVuZCB0byBhY3RpdmVcbiIsCiAJCQlidWYsIGJ1Zi0+dmIuaSwgX19GVU5DVElPTl9fKTsKKwkJLy91ZGVsYXkoMTAwKTsKIAl9CiB9CiAKQEAgLTIyNCw3ICsyMzksMTAgQEAKIAkJCWJ1ZiwgYnVmLT52Yi5pLCByZWFzb24sICh1bnNpZ25lZCBsb25nKWJ1Zi0+cmlzYy5kbWEpOwogCX0KIAlpZiAocmVzdGFydCkKKwl7CisJCWRwcmludGsoMCwgInJlc3RhcnRpbmcgcXVldWVcbiIgKTsKIAkJY3g4ODAyX3Jlc3RhcnRfcXVldWUoZGV2LHEpOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNsb2NrLGZsYWdzKTsKIH0KIApAQCAtMjMyLDYgKzI1MCw3IEBACiB7CiAJc3RydWN0IGN4ODhfZG1hcXVldWUgKnEgPSAmZGV2LT5tcGVncTsKIAorCWRwcmludGsoIDEsICJjeDg4MDJfY2FuY2VsX2J1ZmZlcnMiICk7CiAJZGVsX3RpbWVyX3N5bmMoJnEtPnRpbWVvdXQpOwogCWN4ODgwMl9zdG9wX2RtYShkZXYpOwogCWRvX2NhbmNlbF9idWZmZXJzKGRldiwiY2FuY2VsIiwwKTsKQEAgLTI0MSw3ICsyNjAsNyBAQAogewogCXN0cnVjdCBjeDg4MDJfZGV2ICpkZXYgPSAoc3RydWN0IGN4ODgwMl9kZXYqKWRhdGE7CiAKLQlkcHJpbnRrKDEsICIlc1xuIixfX0ZVTkNUSU9OX18pOworCWRwcmludGsoMCwgIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAKIAlpZiAoZGVidWcpCiAJCWN4ODhfc3JhbV9jaGFubmVsX2R1bXAoZGV2LT5jb3JlLCAmY3g4OF9zcmFtX2NoYW5uZWxzW1NSQU1fQ0gyOF0pOwpAQCAtMjQ5LDE3ICsyNjgsMjggQEAKIAlkb19jYW5jZWxfYnVmZmVycyhkZXYsInRpbWVvdXQiLDEpOwogfQogCitzdGF0aWMgY2hhciAqY3g4OF9tcGVnX2lycXNbMzJdID0geworCSJ0c19yaXNjaTEiLCBOVUxMLCBOVUxMLCBOVUxMLAorCSJ0c19yaXNjaTIiLCBOVUxMLCBOVUxMLCBOVUxMLAorCSJ0c19vZmxvdyIsICBOVUxMLCBOVUxMLCBOVUxMLAorCSJ0c19zeW5jIiwgICBOVUxMLCBOVUxMLCBOVUxMLAorCSJvcGNfZXJyIiwgInBhcl9lcnIiLCAicmlwX2VyciIsICJwY2lfYWJvcnQiLAorCSJ0c19lcnI/IiwKK307CisKIHN0YXRpYyB2b2lkIGN4ODgwMl9tcGVnX2lycShzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAJdTMyIHN0YXR1cywgbWFzaywgY291bnQ7CiAKKwlkcHJpbnRrKCAxLCAiY3g4ODAyX21wZWdfaXJxXG4iICk7CiAJc3RhdHVzID0gY3hfcmVhZChNT19UU19JTlRTVEFUKTsKIAltYXNrICAgPSBjeF9yZWFkKE1PX1RTX0lOVE1TSyk7CiAJaWYgKDAgPT0gKHN0YXR1cyAmIG1hc2spKQogCQlyZXR1cm47CiAKIAljeF93cml0ZShNT19UU19JTlRTVEFULCBzdGF0dXMpOworCiAJaWYgKGRlYnVnIHx8IChzdGF0dXMgJiBtYXNrICYgfjB4ZmYpKQogCQljeDg4X3ByaW50X2lycWJpdHMoY29yZS0+bmFtZSwgImlycSBtcGVnICIsCiAJCQkJICAgY3g4OF9tcGVnX2lycXMsIHN0YXR1cywgbWFzayk7CkBAIC0yNzMsNiArMzAzLDcgQEAKIAogCS8qIHJpc2MxIHkgKi8KIAlpZiAoc3RhdHVzICYgMHgwMSkgeworCQlkcHJpbnRrKCAxLCAid2FrZSB1cFxuIiApOwogCQlzcGluX2xvY2soJmRldi0+c2xvY2spOwogCQljb3VudCA9IGN4X3JlYWQoTU9fVFNfR1BDTlQpOwogCQljeDg4X3dha2V1cChkZXYtPmNvcmUsICZkZXYtPm1wZWdxLCBjb3VudCk7CkBAIC0yODgsNiArMzE5LDcgQEAKIAogICAgICAgICAvKiBvdGhlciBnZW5lcmFsIGVycm9ycyAqLwogICAgICAgICBpZiAoc3RhdHVzICYgMHgxZjAxMDApIHsKKwkJZHByaW50ayggMCwgImdlbmVyYWwgZXJyb3JzOiAweCUwOHhcbiIsIHN0YXR1cyAmIDB4MWYwMTAwICk7CiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKIAkJY3g4ODAyX3N0b3BfZG1hKGRldik7CiAgICAgICAgICAgICAgICAgY3g4ODAyX3Jlc3RhcnRfcXVldWUoZGV2LCZkZXYtPm1wZWdxKTsKQEAgLTI5NSw2ICszMjcsOCBAQAogICAgICAgICB9CiB9CiAKKyNkZWZpbmUgTUFYX0lSUV9MT09QIDEwCisKIHN0YXRpYyBpcnFyZXR1cm5fdCBjeDg4MDJfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGRldl9pZDsKQEAgLTMwMiwxMCArMzM2LDEzIEBACiAJdTMyIHN0YXR1czsKIAlpbnQgbG9vcCwgaGFuZGxlZCA9IDA7CiAKLQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMTA7IGxvb3ArKykgeworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBNQVhfSVJRX0xPT1A7IGxvb3ArKykgewogCQlzdGF0dXMgPSBjeF9yZWFkKE1PX1BDSV9JTlRTVEFUKSAmIChjb3JlLT5wY2lfaXJxbWFzayB8IDB4MDQpOwogCQlpZiAoMCA9PSBzdGF0dXMpCiAJCQlnb3RvIG91dDsKKwkJZHByaW50ayggMSwgImN4ODgwMl9pcnFcbiIgKTsKKwkJZHByaW50ayggMSwgIiAgICBsb29wOiAlZC8lZFxuIiwgbG9vcCwgTUFYX0lSUV9MT09QICk7CisJCWRwcmludGsoIDEsICIgICAgc3RhdHVzOiAlZFxuIiwgc3RhdHVzICk7CiAJCWhhbmRsZWQgPSAxOwogCQljeF93cml0ZShNT19QQ0lfSU5UU1RBVCwgc3RhdHVzKTsKIApAQCAtMzE0LDcgKzM1MSw4IEBACiAJCWlmIChzdGF0dXMgJiAweDA0KQogCQkJY3g4ODAyX21wZWdfaXJxKGRldik7CiAJfTsKLQlpZiAoMTAgPT0gbG9vcCkgeworCWlmIChNQVhfSVJRX0xPT1AgPT0gbG9vcCkgeworCQlkcHJpbnRrKCAwLCAiY2xlYXJpbmcgbWFza1xuIiApOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy8wOiBpcnEgbG9vcCAtLSBjbGVhcmluZyBtYXNrXG4iLAogCQkgICAgICAgY29yZS0+bmFtZSk7CiAJCWN4X3dyaXRlKE1PX1BDSV9JTlRNU0ssMCk7CkBAIC0zNzgsNiArNDE2LDcgQEAKIAogdm9pZCBjeDg4MDJfZmluaV9jb21tb24oc3RydWN0IGN4ODgwMl9kZXYgKmRldikKIHsKKwlkcHJpbnRrKCAyLCAiY3g4ODAyX2ZpbmlfY29tbW9uXG4iICk7CiAJY3g4ODAyX3N0b3BfZG1hKGRldik7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKGRldi0+cGNpKTsKIApAQCAtMzk5LDE2ICs0MzgsMTUgQEAKIAkvKiBzdG9wIG1wZWcgZG1hICovCiAJc3Bpbl9sb2NrKCZkZXYtPnNsb2NrKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmRldi0+bXBlZ3EuYWN0aXZlKSkgeworCQlkcHJpbnRrKCAyLCAic3VzcGVuZFxuIiApOwogCQlwcmludGsoIiVzOiBzdXNwZW5kIG1wZWdcbiIsIGNvcmUtPm5hbWUpOwogCQljeDg4MDJfc3RvcF9kbWEoZGV2KTsKIAkJZGVsX3RpbWVyKCZkZXYtPm1wZWdxLnRpbWVvdXQpOwogCX0KIAlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CiAKLSNpZiAxCiAJLyogRklYTUUgLS0gc2h1dGRvd24gZGV2aWNlICovCiAJY3g4OF9zaHV0ZG93bihkZXYtPmNvcmUpOwotI2VuZGlmCiAKIAlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKIAlpZiAoMCAhPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKSkgewpAQCAtNDMwLDEwICs0NjgsOCBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpX2RldiwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwY2lfZGV2KTsKIAotI2lmIDEKIAkvKiBGSVhNRTogcmUtaW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwogCWN4ODhfcmVzZXQoZGV2LT5jb3JlKTsKLSNlbmRpZgogCiAJLyogcmVzdGFydCB2aWRlbyt2YmkgY2FwdHVyZSAqLwogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CkBAIC00NjMsNCArNDk5LDUgQEAKICAqIExvY2FsIHZhcmlhYmxlczoKICAqIGMtYmFzaWMtb2Zmc2V0OiA4CiAgKiBFbmQ6CisgKiBrYXRlOiBlb2wgInVuaXgiOyBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRyYWlsaW5nLXNwYWNlLXNhdmUgb247IHRhYi13aWR0aCA4OyByZXBsYWNlLXRhYnMgb2ZmOyBzcGFjZS1pbmRlbnQgb2ZmOyBtaXhlZC1pbmRlbnQgb2ZmCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKaW5kZXggODYzOGNlNS4uMzdmODI2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtcmVnLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICAgICRJZDogY3g4OC1yZWcuaCx2IDEuNiAyMDA0LzEwLzEzIDEwOjM5OjAwIGtyYXhlbCBFeHAgJAorICAgICRJZDogY3g4OC1yZWcuaCx2IDEuOCAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKIAogICAgIGN4ODh4LWh3LmggLSBDWDIzODh4IHJlZ2lzdGVyIG9mZnNldHMKIApAQCAtMzk3LDYgKzM5Nyw3IEBACiAjZGVmaW5lIEFVRF9SQVRFX0FESjQgICAgICAgICAgICAweDMyMDVlNAogI2RlZmluZSBBVURfUkFURV9BREo1ICAgICAgICAgICAgMHgzMjA1ZTgKICNkZWZpbmUgQVVEX0FQQl9JTl9SQVRFX0FESiAgICAgIDB4MzIwNWVjCisjZGVmaW5lIEFVRF9JMlNDTlRMICAgICAgICAgICAgICAweDMyMDVlYwogI2RlZmluZSBBVURfUEhBU0VfRklYX0NUTCAgICAgICAgMHgzMjA1ZjAKICNkZWZpbmUgQVVEX1BMTF9QUkVTQ0FMRSAgICAgICAgIDB4MzIwNjAwCiAjZGVmaW5lIEFVRF9QTExfRERTICAgICAgICAgICAgICAweDMyMDYwNApAQCAtNjAzLDIwICs2MDQsMTEgQEAKICNkZWZpbmUgRU5fSTJTSU5fU1RSMkRBQyAgICAgICAgMHgwMDAwNDAwMAogI2RlZmluZSBFTl9JMlNJTl9FTkFCTEUgICAgICAgICAweDAwMDA4MDAwCiAKLSNpZiAwCi0vKiBvbGQgKi8KLSNkZWZpbmUgRU5fRE1UUlhfU1VNRElGRiAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBFTl9ETVRSWF9TVU1SICAgICAgICAgICAweDAwMDAwODgwCi0jZGVmaW5lIEVOX0RNVFJYX0xSICAgICAgICAgICAgIDB4MDAwMDA5MDAKLSNkZWZpbmUgRU5fRE1UUlhfTU9OTyAgICAgICAgICAgMHgwMDAwMDk4MAotI2Vsc2UKLS8qIGRzY2FsZXIgY3ZzICovCiAjZGVmaW5lIEVOX0RNVFJYX1NVTURJRkYgICAgICAgICgwIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX1NVTVIgICAgICAgICAgICgxIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX0xSICAgICAgICAgICAgICgyIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX01PTk8gICAgICAgICAgICgzIDw8IDcpCiAjZGVmaW5lIEVOX0RNVFJYX0JZUEFTUyAgICAgICAgICgxIDw8IDExKQotI2VuZGlmCiAKIC8vIFZpZGVvCiAjZGVmaW5lIFZJRF9DQVBUVVJFX0NPTlRST0wJCTB4MzEwMTgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggZjJhOTQ3NS4uOTEyMDdmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgJElkOiBjeDg4LXR2YXVkaW8uYyx2IDEuMzQgMjAwNS8wMy8wNyAxNjoxMDo1MSBrcmF4ZWwgRXhwICQKKyAgICAkSWQ6IGN4ODgtdHZhdWRpby5jLHYgMS4zNyAyMDA1LzA3LzA3IDEzOjU4OjM4IG1jaGVoYWIgRXhwICQKIAogICAgIGN4ODh4LWF1ZGlvLmMgLSBDb25leGFudCBDWDIzODgwLzIzODgxIGF1ZGlvIGRvd25zdHJlYW0gZHJpdmVyIGRyaXZlcgogCkBAIC0xMjcsNyArMTI3LDggQEAKIAljeF93cml0ZShBVURfVk9MX0NUTCwgICAgICAgKDEgPDwgNikpOwogCiAJLy8gIGluY3JlYXNlIGxldmVsIG9mIGlucHV0IGJ5IDEyZEIKLQljeF93cml0ZShBVURfQUZFXzEyREJfRU4sICAgMHgwMDAxKTsKKy8vCWN4X3dyaXRlKEFVRF9BRkVfMTJEQl9FTiwgICAweDAwMDEpOworCWN4X3dyaXRlKEFVRF9BRkVfMTJEQl9FTiwgICAweDAwMDApOwogCiAJLy8gc3RhcnQgcHJvZ3JhbW1pbmcKIAljeF93cml0ZShBVURfQ1RMLCAgICAgICAgICAgMHgwMDAwKTsKQEAgLTE0Myw5ICsxNDQsMTUgQEAKIAl1MzIgdm9sdW1lOwogCiAJaWYgKGN4ODhfYm9hcmRzW2NvcmUtPmJvYXJkXS5ibGFja2JpcmQpIHsKKwkJLy8gc2V0cyBzb3VuZCBpbnB1dCBmcm9tIGV4dGVybmFsIGFkYworCQljeF9zZXQoQVVEX0NUTCwgRU5fSTJTSU5fRU5BQkxFKTsKKwkJLy9jeF93cml0ZShBVURfSTJTSU5QVVRDTlRMLCAwKTsKKwkJY3hfd3JpdGUoQVVEX0kyU0lOUFVUQ05UTCwgNCk7CisJCWN4X3dyaXRlKEFVRF9CQVVEUkFURSwgMSk7CiAJCS8vICdwYXNzLXRocnUgbW9kZSc6IHRoaXMgZW5hYmxlcyB0aGUgaTJzIG91dHB1dCB0byB0aGUgbXBlZyBlbmNvZGVyCi0JCWN4X3NldChBVURfQ1RMLCAweDIwMDApOworCQljeF9zZXQoQVVEX0NUTCwgRU5fSTJTT1VUX0VOQUJMRSk7CiAJCWN4X3dyaXRlKEFVRF9JMlNPVVRQVVRDTlRMLCAxKTsKKwkJY3hfd3JpdGUoQVVEX0kyU0NOVEwsIDApOwogCQkvL2N4X3dyaXRlKEFVRF9BUEJfSU5fUkFURV9BREosIDApOwogCX0KIApAQCAtMjcxLDgwICsyNzgsNiBAQAogCXNldF9hdWRpb19maW5pc2goY29yZSk7CiB9CiAKLSNpZiAwCi1zdGF0aWMgdm9pZCBzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU0oc3RydWN0IGN4ODhfY29yZSAqY29yZSkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IG5pY2FtX2NvbW1vbltdID0gewotCQkvKiBmcm9tIGRzY2FsZXIgKi8KLSAgICAJCXsgQVVEX1JBVEVfQURKMSwgICAgICAgICAgIDB4MDAwMDAwMTAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKMiwgICAgICAgICAgIDB4MDAwMDAwNDAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKMywgICAgICAgICAgIDB4MDAwMDAxMDAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKNCwgICAgICAgICAgIDB4MDAwMDA0MDAgfSwKLSAgICAJCXsgQVVEX1JBVEVfQURKNSwgICAgICAgICAgIDB4MDAwMDEwMDAgfSwKLSAgICAvLwkJeyBBVURfRE1EX1JBX0REUywgICAgICAgICAgMHgwMGMwZDVjZSB9LAotCi0JCS8vIERlZW1waGFzaXMgMToKLQkJeyBBVURfREVFTVBIR0FJTl9SLCAgICAgICAgMHgwMDAwMjNjMiB9LAotCQl7IEFVRF9ERUVNUEhOVU1FUjFfUiwgICAgICAweDAwMDJhN2JjIH0sCi0JCXsgQVVEX0RFRU1QSE5VTUVSMl9SLCAgICAgIDB4MDAwMzAyM2UgfSwKLQkJeyBBVURfREVFTVBIREVOT00xX1IsICAgICAgMHgwMDAwZjNkMCB9LAotCQl7IEFVRF9ERUVNUEhERU5PTTJfUiwgICAgICAweDAwMDAwMDAwIH0sCi0KLSNpZiAwCi0JCS8vIERlZW1waGFzaXMgMjogKG90aGVyIHR2IG5vcm0/KQotCQl7IEFVRF9ERUVNUEhHQUlOX1IsICAgICAgICAweDAwMDBjNjAwIH0sCi0JCXsgQVVEX0RFRU1QSE5VTUVSMV9SLCAgICAgIDB4MDAwNjY3MzggfSwKLQkJeyBBVURfREVFTVBITlVNRVIyX1IsICAgICAgMHgwMDA2NjczOSB9LAotCQl7IEFVRF9ERUVNUEhERU5PTTFfUiwgICAgICAweDAwMDFlODhjIH0sCi0JCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMWU4OGMgfSwKLSNlbmRpZgotCi0JCXsgQVVEX0RFRU1QSERFTk9NMl9SLCAgICAgIDB4MDAwMDAwMDAgfSwKLQkJeyBBVURfRVJSTE9HUEVSSU9EX1IsICAgICAgMHgwMDAwMGZmZiB9LAotCQl7IEFVRF9FUlJJTlRSUFRUSFNITEQxX1IsICAweDAwMDAwM2ZmIH0sCi0JCXsgQVVEX0VSUklOVFJQVFRIU0hMRDJfUiwgIDB4MDAwMDAwZmYgfSwKLQkJeyBBVURfRVJSSU5UUlBUVEhTSExEM19SLCAgMHgwMDAwMDAzZiB9LAotCQl7IEFVRF9QT0xZUEg4MFNDQUxFRkFDLCAgICAweDAwMDAwMDAzIH0sCi0KLQkJLy8gc2V0dXAgUUFNIHJlZ2lzdGVycwotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTIsICAweDA2IH0sCi0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMSwgIDB4ODIgfSwKLQkJeyBBVURfUERGX0REU19DTlNUX0JZVEUwLCAgMHgxNiB9LAotCQl7IEFVRF9RQU1fTU9ERSwgICAgICAgICAgICAweDA1IH0sCi0KLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0gICAgICAgIH07Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9wYWxfaVtdID0gewotCQl7IEFVRF9QREZfRERTX0NOU1RfQllURTAsICAweDEyIH0sCi0JCXsgQVVEX1BIQUNDX0ZSRVFfOE1TQiwgICAgIDB4M2EgfSwKLQkJeyBBVURfUEhBQ0NfRlJFUV84TFNCLCAgICAgMHg5MyB9LAotCi0gICAgICAgICAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAotCX07Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBuaWNhbV9kZWZhdWx0W10gPSB7Ci0JCXsgQVVEX1BERl9ERFNfQ05TVF9CWVRFMCwgIDB4MTYgfSwKLQkJeyBBVURfUEhBQ0NfRlJFUV84TVNCLCAgICAgMHgzNCB9LAotCQl7IEFVRF9QSEFDQ19GUkVRXzhMU0IsICAgICAweDRjIH0sCi0KLSAgICAgICAgICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0sCi0JfTsKLQotICAgICAgICBzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDEwLAotCQkJRU5fRE1UUlhfTFIgfCBFTl9ETVRSWF9CWVBBU1MgfCBFTl9OSUNBTV9BVVRPX1NURVJFTyk7Ci0gICAgICAgIHNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fY29tbW9uKTsKLQlzd2l0Y2ggKGNvcmUtPnR2YXVkaW8pIHsKLQljYXNlIFdXX05JQ0FNX0k6Ci0JCWRwcmludGsoIiVzIFBBTC1JIE5JQ0FNIChzdGF0dXM6IHVua25vd24pXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgbmljYW1fcGFsX2kpOwotCQlicmVhazsKLQljYXNlIFdXX05JQ0FNX0JHREtMOgotCQlkcHJpbnRrKCIlcyBQQUwtQkdESyBOSUNBTSAoc3RhdHVzOiB1bmtub3duKVxuIixfX0ZVTkNUSU9OX18pOwotCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIG5pY2FtX2RlZmF1bHQpOwotCQlicmVhazsKLQl9OwotICAgICAgICBzZXRfYXVkaW9fZmluaXNoKGNvcmUpOwotfQotI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9OSUNBTV9MKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGludCBzdGVyZW8pCiB7CkBAIC03MDcsNTAgKzY0MCw2NSBAQAogCXNldF9hdWRpb19maW5pc2goY29yZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9hdWRpb19zdGFuZGFyZF9GTShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlKQorc3RhdGljIHZvaWQgc2V0X2F1ZGlvX3N0YW5kYXJkX0ZNKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsIGVudW0gY3g4OF9kZWVtcGhfdHlwZSBkZWVtcGgpCiB7Ci0jaWYgMCAvKiBGSVhNRSAqLwotCXN3aXRjaCAoZGV2LT5hdWRpb19wcm9wZXJ0aWVzLkZNX2RlZW1waGFzaXMpCi0JewotCQljYXNlIFdXX0ZNX0RFRU1QSF81MDoKLQkJCS8vU2V0IERlLWVtcGhhc2lzIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIDUwIHVzZWMKLQkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0cwLCAweDBDNDUpOwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfQTAsIDB4NjI2Mik7Ci0JCQljeF93cml0ZShBVURfREVFTVBIMF9CMCwgMHgxQzI5KTsKLQkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0ExLCAweDNGQzY2KTsKLQkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0IxLCAweDM5OUEpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcmxpc3QgZm1fZGVlbXBoXzUwW10gPSB7CisJCXsgQVVEX0RFRU1QSDBfRzAsCTB4MEM0NSB9LAorCQl7IEFVRF9ERUVNUEgwX0EwLAkweDYyNjIgfSwKKwkJeyBBVURfREVFTVBIMF9CMCwJMHgxQzI5IH0sCisJCXsgQVVEX0RFRU1QSDBfQTEsCTB4M0ZDNjZ9LAorCQl7IEFVRF9ERUVNUEgwX0IxLAkweDM5OUEgfSwKIAotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDFfRzAsIDB4MEQ4MCk7Ci0JCQljeF93cml0ZShBVURfREVFTVBIMV9BMCwgMHg2MjYyKTsKLQkJCWN4X3dyaXRlKEFVRF9ERUVNUEgxX0IwLCAweDFDMjkpOwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDFfQTEsIDB4M0ZDNjYpOwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDFfQjEsIDB4Mzk5QSk7CisJCXsgQVVEX0RFRU1QSDFfRzAsCTB4MEQ4MCB9LAorCQl7IEFVRF9ERUVNUEgxX0EwLAkweDYyNjIgfSwKKwkJeyBBVURfREVFTVBIMV9CMCwJMHgxQzI5IH0sCisJCXsgQVVEX0RFRU1QSDFfQTEsCTB4M0ZDNjZ9LAorCQl7IEFVRF9ERUVNUEgxX0IxLAkweDM5OUF9LAogCi0JCQlicmVhazsKKwkJeyBBVURfUE9MWVBIODBTQ0FMRUZBQywJMHgwMDAzfSwKKwkJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBybGlzdCBmbV9kZWVtcGhfNzVbXSA9IHsKKwkJeyBBVURfREVFTVBIMF9HMCwJMHgwOTFCIH0sCisJCXsgQVVEX0RFRU1QSDBfQTAsCTB4NkI2OCB9LAorCQl7IEFVRF9ERUVNUEgwX0IwLAkweDExRUMgfSwKKwkJeyBBVURfREVFTVBIMF9BMSwJMHgzRkM2Nn0sCisJCXsgQVVEX0RFRU1QSDBfQjEsCTB4Mzk5QSB9LAogCi0JCWNhc2UgV1dfRk1fREVFTVBIXzc1OgotCQkJLy9TZXQgRGUtZW1waGFzaXMgZmlsdGVyIGNvZWZmaWNpZW50cyBmb3IgNzUgdXNlYwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfRzAsIDB4OTFCICk7Ci0JCQljeF93cml0ZShBVURfREVFTVBIMF9BMCwgMHg2QjY4KTsKLQkJCWN4X3dyaXRlKEFVRF9ERUVNUEgwX0IwLCAweDExRUMpOwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfQTEsIDB4M0ZDNjYpOwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDBfQjEsIDB4Mzk5QSk7CisJCXsgQVVEX0RFRU1QSDFfRzAsCTB4MEFBMCB9LAorCQl7IEFVRF9ERUVNUEgxX0EwLAkweDZCNjggfSwKKwkJeyBBVURfREVFTVBIMV9CMCwJMHgxMUVDIH0sCisJCXsgQVVEX0RFRU1QSDFfQTEsCTB4M0ZDNjZ9LAorCQl7IEFVRF9ERUVNUEgxX0IxLAkweDM5OUF9LAogCi0JCQljeF93cml0ZShBVURfREVFTVBIMV9HMCwgMHhBQTAgKTsKLQkJCWN4X3dyaXRlKEFVRF9ERUVNUEgxX0EwLCAweDZCNjgpOwotCQkJY3hfd3JpdGUoQVVEX0RFRU1QSDFfQjAsIDB4MTFFQyk7Ci0JCQljeF93cml0ZShBVURfREVFTVBIMV9BMSwgMHgzRkM2Nik7Ci0JCQljeF93cml0ZShBVURfREVFTVBIMV9CMSwgMHgzOTlBKTsKKwkJeyBBVURfUE9MWVBIODBTQ0FMRUZBQywJMHgwMDAzfSwKKwkJeyAvKiBlbmQgb2YgbGlzdCAqLyB9LAorCX07CiAKLQkJCWJyZWFrOwotCX0KLSNlbmRpZgorCS8qIEl0IGlzIGVub3VnaCB0byBsZWF2ZSBkZWZhdWx0IHZhbHVlcz8gKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJsaXN0IGZtX25vX2RlZW1waFtdID0geworCisJCXsgQVVEX1BPTFlQSDgwU0NBTEVGQUMsCTB4MDAwM30sCisJCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKKwl9OwogCiAJZHByaW50aygiJXMgKHN0YXR1czogdW5rbm93bilcbiIsX19GVU5DVElPTl9fKTsKIAlzZXRfYXVkaW9fc3RhcnQoY29yZSwgMHgwMDIwLCBFTl9GTVJBRElPX0FVVE9fU1RFUkVPKTsKIAotCS8vIEFCOiAxMC8yLzAxOiB0aGlzIHJlZ2lzdGVyIGlzIG5vdCBiZWluZyByZXNldCBhcHByb3ByaWF0ZWx5IG9uIG9jY2FzaW9uLgotCWN4X3dyaXRlKEFVRF9QT0xZUEg4MFNDQUxFRkFDLDMpOworCXN3aXRjaCAoZGVlbXBoKQorCXsKKwkJY2FzZSBGTV9OT19ERUVNUEg6CisJCQlzZXRfYXVkaW9fcmVnaXN0ZXJzKGNvcmUsIGZtX25vX2RlZW1waCk7CisJCQlicmVhazsKKworCQljYXNlIEZNX0RFRU1QSF81MDoKKwkJCXNldF9hdWRpb19yZWdpc3RlcnMoY29yZSwgZm1fZGVlbXBoXzUwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRk1fREVFTVBIXzc1OgorCQkJc2V0X2F1ZGlvX3JlZ2lzdGVycyhjb3JlLCBmbV9kZWVtcGhfNzUpOworCQkJYnJlYWs7CisJfQogCiAJc2V0X2F1ZGlvX2ZpbmlzaChjb3JlKTsKIH0KQEAgLTc3OCw3ICs3MjYsNyBAQAogCQlzZXRfYXVkaW9fc3RhbmRhcmRfRUlBSihjb3JlKTsKIAkJYnJlYWs7CiAJY2FzZSBXV19GTToKLQkJc2V0X2F1ZGlvX3N0YW5kYXJkX0ZNKGNvcmUpOworCQlzZXRfYXVkaW9fc3RhbmRhcmRfRk0oY29yZSxGTV9OT19ERUVNUEgpOwogCQlicmVhazsKIAljYXNlIFdXX1NZU1RFTV9MX0FNOgogCQlzZXRfYXVkaW9fc3RhbmRhcmRfTklDQU1fTChjb3JlLCAxKTsKQEAgLTEwMjksNCArOTc3LDUgQEAKICAqIExvY2FsIHZhcmlhYmxlczoKICAqIGMtYmFzaWMtb2Zmc2V0OiA4CiAgKiBFbmQ6CisgKiBrYXRlOiBlb2wgInVuaXgiOyBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRyYWlsaW5nLXNwYWNlLXNhdmUgb247IHRhYi13aWR0aCA4OyByZXBsYWNlLXRhYnMgb2ZmOyBzcGFjZS1pbmRlbnQgb2ZmOyBtaXhlZC1pbmRlbnQgb2ZmCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKaW5kZXggMDU4NGZmNC4uMzIwZDU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBjeDg4LXZiaS5jLHYgMS4xNiAyMDA0LzEyLzEwIDEyOjMzOjM5IGtyYXhlbCBFeHAgJAorICogJElkOiBjeDg4LXZiaS5jLHYgMS4xNyAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDcsOCArNDcsOCBAQAogfQogCiBzdGF0aWMgaW50IGN4ODgwMF9zdGFydF92YmlfZG1hKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCi0JCQkJc3RydWN0IGN4ODhfZG1hcXVldWUgKnEsCi0JCQkJc3RydWN0IGN4ODhfYnVmZmVyICAgKmJ1ZikKKwkJCSBzdHJ1Y3QgY3g4OF9kbWFxdWV1ZSAqcSwKKwkJCSBzdHJ1Y3QgY3g4OF9idWZmZXIgICAqYnVmKQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCmluZGV4IGQxZjVjOTIuLmM0NGEwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODgtdmlkZW8uYyx2IDEuNTggMjAwNS8wMy8wNyAxNTo1ODowNSBrcmF4ZWwgRXhwICQKKyAqICRJZDogY3g4OC12aWRlby5jLHYgMS43OSAyMDA1LzA3LzA3IDE0OjE3OjQ3IG1jaGVoYWIgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBDb25leGFudCAyMzg4eCBiYXNlZCBUViBjYXJkcwogICogdmlkZW80bGludXggdmlkZW8gaW50ZXJmYWNlCkBAIC04NiwxMyArODYsNiBAQAogCQkuaWQgICAgICAgID0gVjRMMl9TVERfTlRTQ19NX0pQLAogCQkuY3hpZm9ybWF0ID0gVmlkZW9Gb3JtYXROVFNDSmFwYW4sCiAJCS5jeG9mb3JtYXQgPSAweDE4MWYwMDA4LAotI2lmIDAKLQl9LHsKLQkJLm5hbWUgICAgICA9ICJOVFNDLTQuNDMiLAotCQkuaWQgICAgICAgID0gRklYTUUsCi0JCS5jeGlmb3JtYXQgPSBWaWRlb0Zvcm1hdE5UU0M0NDMsCi0JCS5jeG9mb3JtYXQgPSAweDE4MWYwMDA4LAotI2VuZGlmCiAJfSx7CiAJCS5uYW1lICAgICAgPSAiUEFMLUJHIiwKIAkJLmlkICAgICAgICA9IFY0TDJfU1REX1BBTF9CRywKQEAgLTI0OCw2ICsyNDEsNyBAQAogCQkJLmRlZmF1bHRfdmFsdWUgPSAwLAogCQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQl9LAorCQkub2ZmICAgICAgICAgICAgICAgICAgID0gMCwKIAkJLnJlZyAgICAgICAgICAgICAgICAgICA9IE1PX0NPTlRSX0JSSUdIVCwKIAkJLm1hc2sgICAgICAgICAgICAgICAgICA9IDB4ZmYwMCwKIAkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDgsCkBAIC0yNjEsNyArMjU1LDcgQEAKIAkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKIAkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAkJfSwKLQkJLm9mZiAgICAgICAgICAgICAgICAgICA9IDAsCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAxMjgsCiAJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19IVUUsCiAJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweDAwZmYsCiAJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSAwLApAQCAtNjc0LDIzMSArNjY4LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiAwIC8qIG92ZXJsYXkgc3VwcG9ydCBub3QgZmluaXNoZWQgeWV0ICovCi1zdGF0aWMgdTMyKiBvdl9yaXNjX2ZpZWxkKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAotCQkJICB1MzIgKnJwLCBzdHJ1Y3QgYnRjeF9za2lwbGlzdCAqc2tpcHMsCi0JCQkgIHUzMiBzeW5jX2xpbmUsIGludCBza2lwX2V2ZW4sIGludCBza2lwX29kZCkKLXsKLQlpbnQgbGluZSxtYXh5LHN0YXJ0LGVuZCxza2lwLG5za2lwczsKLQl1MzIgcmkscmE7Ci0JdTMyIGFkZHI7Ci0KLQkvKiBzeW5jIGluc3RydWN0aW9uICovCi0JKihycCsrKSA9IGNwdV90b19sZTMyKFJJU0NfUkVTWU5DIHwgc3luY19saW5lKTsKLQotCWFkZHIgID0gKHVuc2lnbmVkIGxvbmcpZGV2LT5mYnVmLmJhc2U7Ci0JYWRkciArPSBkZXYtPmZidWYuZm10LmJ5dGVzcGVybGluZSAqIGZoLT53aW4udy50b3A7Ci0JYWRkciArPSAoZmgtPmZtdC0+ZGVwdGggPj4gMykgICAgICAqIGZoLT53aW4udy5sZWZ0OwotCi0JLyogc2NhbiBsaW5lcyAqLwotCWZvciAobWF4eSA9IC0xLCBsaW5lID0gMDsgbGluZSA8IGZoLT53aW4udy5oZWlnaHQ7Ci0JICAgICBsaW5lKyssIGFkZHIgKz0gZGV2LT5mYnVmLmZtdC5ieXRlc3BlcmxpbmUpIHsKLQkJaWYgKChsaW5lJTIpID09IDAgICYmICBza2lwX2V2ZW4pCi0JCQljb250aW51ZTsKLQkJaWYgKChsaW5lJTIpID09IDEgICYmICBza2lwX29kZCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGNhbGN1bGF0ZSBjbGlwcGluZyAqLwotCQlpZiAobGluZSA+IG1heHkpCi0JCQlidGN4X2NhbGNfc2tpcHMobGluZSwgZmgtPndpbi53LndpZHRoLCAmbWF4eSwKLQkJCQkJc2tpcHMsICZuc2tpcHMsIGZoLT5jbGlwcywgZmgtPm5jbGlwcyk7Ci0KLQkJLyogd3JpdGUgb3V0IHJpc2MgY29kZSAqLwotCQlmb3IgKHN0YXJ0ID0gMCwgc2tpcCA9IDA7IHN0YXJ0IDwgZmgtPndpbi53LndpZHRoOyBzdGFydCA9IGVuZCkgewotCQkJaWYgKHNraXAgPj0gbnNraXBzKSB7Ci0JCQkJcmkgID0gUklTQ19XUklURTsKLQkJCQllbmQgPSBmaC0+d2luLncud2lkdGg7Ci0JCQl9IGVsc2UgaWYgKHN0YXJ0IDwgc2tpcHNbc2tpcF0uc3RhcnQpIHsKLQkJCQlyaSAgPSBSSVNDX1dSSVRFOwotCQkJCWVuZCA9IHNraXBzW3NraXBdLnN0YXJ0OwotCQkJfSBlbHNlIHsKLQkJCQlyaSAgPSBSSVNDX1NLSVA7Ci0JCQkJZW5kID0gc2tpcHNbc2tpcF0uZW5kOwotCQkJCXNraXArKzsKLQkJCX0KLQkJCWlmIChSSVNDX1dSSVRFID09IHJpKQotCQkJCXJhID0gYWRkciArIChmaC0+Zm10LT5kZXB0aD4+Mykqc3RhcnQ7Ci0JCQllbHNlCi0JCQkJcmEgPSAwOwotCi0JCQlpZiAoMCA9PSBzdGFydCkKLQkJCQlyaSB8PSBSSVNDX1NPTDsKLQkJCWlmIChmaC0+d2luLncud2lkdGggPT0gZW5kKQotCQkJCXJpIHw9IFJJU0NfRU9MOwotCQkJcmkgfD0gKGZoLT5mbXQtPmRlcHRoPj4zKSAqIChlbmQtc3RhcnQpOwotCi0JCQkqKHJwKyspPWNwdV90b19sZTMyKHJpKTsKLQkJCWlmICgwICE9IHJhKQotCQkJCSoocnArKyk9Y3B1X3RvX2xlMzIocmEpOwotCQl9Ci0JfQotCWtmcmVlKHNraXBzKTsKLQlyZXR1cm4gcnA7Ci19Ci0KLXN0YXRpYyBpbnQgb3ZfcmlzY19mcmFtZShzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgY3g4ODAwX2ZoICpmaCwKLQkJCSBzdHJ1Y3QgY3g4OF9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgYnRjeF9za2lwbGlzdCAqc2tpcHM7Ci0JdTMyIGluc3RydWN0aW9ucyxmaWVsZHM7Ci0JdTMyICpycDsKLQlpbnQgcmM7Ci0KLQkvKiBza2lwIGxpc3QgZm9yIHdpbmRvdyBjbGlwcGluZyAqLwotCWlmIChOVUxMID09IChza2lwcyA9IGttYWxsb2Moc2l6ZW9mKCpza2lwcykgKiBmaC0+bmNsaXBzLEdGUF9LRVJORUwpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmaWVsZHMgPSAwOwotCWlmIChWNEwyX0ZJRUxEX0hBU19UT1AoZmgtPndpbi5maWVsZCkpCi0JCWZpZWxkcysrOwotCWlmIChWNEwyX0ZJRUxEX0hBU19CT1RUT00oZmgtPndpbi5maWVsZCkpCi0JCWZpZWxkcysrOwotCi0gICAgICAgIC8qIGVzdGltYXRlIHJpc2MgbWVtOiB3b3JzdCBjYXNlIGlzIChjbGlwKzEpICogbGluZXMgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICAgICsgc3luY3MgKyBqdW1wIChhbGwgMiBkd29yZHMpICovCi0JaW5zdHJ1Y3Rpb25zICA9IChmaC0+bmNsaXBzKzEpICogZmgtPndpbi53LmhlaWdodDsKLQlpbnN0cnVjdGlvbnMgKz0gMyArIDQ7Ci0JaWYgKChyYyA9IGJ0Y3hfcmlzY21lbV9hbGxvYyhkZXYtPnBjaSwmYnVmLT5yaXNjLGluc3RydWN0aW9ucyo4KSkgPCAwKSB7Ci0JCWtmcmVlKHNraXBzKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIHdyaXRlIHJpc2MgaW5zdHJ1Y3Rpb25zICovCi0JcnAgPSBidWYtPnJpc2MuY3B1OwotCXN3aXRjaCAoZmgtPndpbi5maWVsZCkgewotCWNhc2UgVjRMMl9GSUVMRF9UT1A6Ci0JCXJwID0gb3ZfcmlzY19maWVsZChkZXYsIGZoLCBycCwgc2tpcHMsIDAsICAgICAwLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0ZJRUxEX0JPVFRPTToKLQkJcnAgPSBvdl9yaXNjX2ZpZWxkKGRldiwgZmgsIHJwLCBza2lwcywgMHgyMDAsIDAsIDApOwotCQlicmVhazsKLQljYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKLQkJcnAgPSBvdl9yaXNjX2ZpZWxkKGRldiwgZmgsIHJwLCBza2lwcywgMCwgICAgIDAsIDEpOwotCQlycCA9IG92X3Jpc2NfZmllbGQoZGV2LCBmaCwgcnAsIHNraXBzLCAweDIwMCwgMSwgMCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCS8qIHNhdmUgcG9pbnRlciB0byBqbXAgaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotCWJ1Zi0+cmlzYy5qbXAgPSBycDsKLQlrZnJlZShza2lwcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmVyaWZ5X3dpbmRvdyhzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbikKLXsKLQllbnVtIHY0bDJfZmllbGQgZmllbGQ7Ci0JaW50IG1heHcsIG1heGg7Ci0KLQlpZiAoTlVMTCA9PSBkZXYtPmZidWYuYmFzZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHdpbi0+dy53aWR0aCA8IDQ4IHx8IHdpbi0+dy5oZWlnaHQgPCAgMzIpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh3aW4tPmNsaXBjb3VudCA+IDIwNDgpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZmllbGQgPSB3aW4tPmZpZWxkOwotCW1heHcgID0gbm9ybV9tYXh3KGNvcmUtPnR2bm9ybSk7Ci0JbWF4aCAgPSBub3JtX21heGgoY29yZS0+dHZub3JtKTsKLQotCWlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgewotICAgICAgICAgICAgICAgIGZpZWxkID0gKHdpbi0+dy5oZWlnaHQgPiBtYXhoLzIpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IFY0TDJfRklFTERfSU5URVJMQUNFRAotICAgICAgICAgICAgICAgICAgICAgICAgOiBWNEwyX0ZJRUxEX1RPUDsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7Ci0gICAgICAgIGNhc2UgVjRMMl9GSUVMRF9UT1A6Ci0gICAgICAgIGNhc2UgVjRMMl9GSUVMRF9CT1RUT006Ci0gICAgICAgICAgICAgICAgbWF4aCA9IG1heGggLyAyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFY0TDJfRklFTERfSU5URVJMQUNFRDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0Jd2luLT5maWVsZCA9IGZpZWxkOwotCWlmICh3aW4tPncud2lkdGggPiBtYXh3KQotCQl3aW4tPncud2lkdGggPSBtYXh3OwotCWlmICh3aW4tPncuaGVpZ2h0ID4gbWF4aCkKLQkJd2luLT53LmhlaWdodCA9IG1heGg7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0dXBfd2luZG93KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCBjeDg4MDBfZmggKmZoLAotCQkJc3RydWN0IHY0bDJfd2luZG93ICp3aW4pCi17Ci0Jc3RydWN0IHY0bDJfY2xpcCAqY2xpcHMgPSBOVUxMOwotCWludCBuLHNpemUscmV0dmFsID0gMDsKLQotCWlmIChOVUxMID09IGZoLT5mbXQpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHZhbCA9IHZlcmlmeV93aW5kb3coZGV2LHdpbik7Ci0JaWYgKDAgIT0gcmV0dmFsKQotCQlyZXR1cm4gcmV0dmFsOwotCi0JLyogY29weSBjbGlwcyAgLS0gIGx1Y2tpbHkgdjRsMSArIHY0bDIgYXJlIGJpbmFyeQotCSAgIGNvbXBhdGlibGUgaGVyZSAuLi4qLwotCW4gPSB3aW4tPmNsaXBjb3VudDsKLQlzaXplID0gc2l6ZW9mKCpjbGlwcykqKG4rNCk7Ci0JY2xpcHMgPSBrbWFsbG9jKHNpemUsR0ZQX0tFUk5FTCk7Ci0JaWYgKE5VTEwgPT0gY2xpcHMpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChuID4gMCkgewotCQlpZiAoY29weV9mcm9tX3VzZXIoY2xpcHMsd2luLT5jbGlwcyxzaXplb2Yoc3RydWN0IHY0bDJfY2xpcCkqbikpIHsKLQkJCWtmcmVlKGNsaXBzKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCi0JLyogY2xpcCBhZ2FpbnN0IHNjcmVlbiAqLwotCWlmIChOVUxMICE9IGRldi0+ZmJ1Zi5iYXNlKQotCQluID0gYnRjeF9zY3JlZW5fY2xpcHMoZGV2LT5mYnVmLmZtdC53aWR0aCwgZGV2LT5mYnVmLmZtdC5oZWlnaHQsCi0JCQkJICAgICAgJndpbi0+dywgY2xpcHMsIG4pOwotCWJ0Y3hfc29ydF9jbGlwcyhjbGlwcyxuKTsKLQotCS8qIDQtYnl0ZSBhbGlnbm1lbnRzICovCi0Jc3dpdGNoIChmaC0+Zm10LT5kZXB0aCkgewotCWNhc2UgODoKLQljYXNlIDI0OgotCQlidGN4X2FsaWduKCZ3aW4tPncsIGNsaXBzLCBuLCAzKTsKLQkJYnJlYWs7Ci0JY2FzZSAxNjoKLQkJYnRjeF9hbGlnbigmd2luLT53LCBjbGlwcywgbiwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgMzI6Ci0JCS8qIG5vIGFsaWdubWVudCBmaXh1cHMgbmVlZGVkICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLQotCWRvd24oJmZoLT52aWRxLmxvY2spOwotCWlmIChmaC0+Y2xpcHMpCi0JCWtmcmVlKGZoLT5jbGlwcyk7Ci0JZmgtPmNsaXBzICAgID0gY2xpcHM7Ci0JZmgtPm5jbGlwcyAgID0gbjsKLQlmaC0+d2luICAgICAgPSAqd2luOwotI2lmIDAKLQlmaC0+b3Yuc2V0dXBfb2sgPSAxOwotI2VuZGlmCi0KLQkvKiB1cGRhdGUgb3ZlcmxheSBpZiBuZWVkZWQgKi8KLQlyZXR2YWwgPSAwOwotI2lmIDAKLQlpZiAoY2hlY2tfYnRyZXMoZmgsIFJFU09VUkNFX09WRVJMQVkpKSB7Ci0JCXN0cnVjdCBidHR2X2J1ZmZlciAqbmV3OwotCi0JCW5ldyA9IHZpZGVvYnVmX2FsbG9jKHNpemVvZigqbmV3KSk7Ci0JCWJ0dHZfb3ZlcmxheV9yaXNjKGJ0diwgJmZoLT5vdiwgZmgtPm92Zm10LCBuZXcpOwotCQlyZXR2YWwgPSBidHR2X3N3aXRjaF9vdmVybGF5KGJ0dixmaCxuZXcpOwotCX0KLSNlbmRpZgotCXVwKCZmaC0+dmlkcS5sb2NrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xMTg3LDkgKzk1NiwyNCBAQAogCQkuaWQgICAgPSBWNEwyX0NJRF9BVURJT19WT0xVTUUsCiAJCS52YWx1ZSA9IDB4M2YsCiAJfTsKKwlzdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCBodWUgPSB7CisJCS5pZCAgICA9IFY0TDJfQ0lEX0hVRSwKKwkJLnZhbHVlID0gMHg4MCwKKwl9OworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyYXN0ID0geworCQkuaWQgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJLnZhbHVlID0gMHg4MCwKKwl9OworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9jb250cm9sIGJyaWdodG5lc3MgPSB7CisJCS5pZCAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJCS52YWx1ZSA9IDB4ODAsCisJfTsKIAogCXNldF9jb250cm9sKGRldiwmbXV0ZSk7CiAJc2V0X2NvbnRyb2woZGV2LCZ2b2x1bWUpOworCXNldF9jb250cm9sKGRldiwmaHVlKTsKKwlzZXRfY29udHJvbChkZXYsJmNvbnRyYXN0KTsKKwlzZXRfY29udHJvbChkZXYsJmJyaWdodG5lc3MpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMTIsOSArMTA5Niw2IEBACiAJc3RydWN0IGN4ODgwMF9maCAgKmZoICAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGN4ODgwMF9kZXYgKmRldiAgPSBmaC0+ZGV2OwogCXN0cnVjdCBjeDg4X2NvcmUgICpjb3JlID0gZGV2LT5jb3JlOwotI2lmIDAKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2VuZGlmCiAJaW50IGVycjsKIAogCWlmICh2aWRlb19kZWJ1ZyA+IDEpCkBAIC0xMzM1LDkgKzExMTYsNiBAQAogCQkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CiAJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKIAkJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFICAgfAotI2lmIDAKLQkJCVY0TDJfQ0FQX1ZJREVPX09WRVJMQVkgfAotI2VuZGlmCiAJCQkwOwogCQlpZiAoVU5TRVQgIT0gY29yZS0+dHVuZXJfdHlwZSkKIAkJCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOwpAQCAtMTQzOCwzNiArMTIxNiw2IEBACiAJfQogCiAKLSNpZiAwCi0JLyogbmVlZHMgcmV2aWV3ICovCi0JY2FzZSBWSURJT0NfR19BVURJTzoKLQl7Ci0JCXN0cnVjdCB2NGwyX2F1ZGlvICphID0gYXJnOwotCQl1bnNpZ25lZCBpbnQgbiA9IGEtPmluZGV4OwotCi0JCW1lbXNldChhLDAsc2l6ZW9mKCphKSk7Ci0JCWEtPmluZGV4ID0gbjsKLQkJc3dpdGNoIChuKSB7Ci0JCWNhc2UgMDoKLQkJCWlmICgoQ1g4OF9WTVVYX1RFTEVWSVNJT04gPT0gSU5QVVQobiktPnR5cGUpCi0JCQkgICAgfHwgKENYODhfVk1VWF9DQUJMRSA9PSBJTlBVVChuKS0+dHlwZSkpIHsKLQkJCQlzdHJjcHkoYS0+bmFtZSwiVGVsZXZpc2lvbiIpOwotCQkJCS8vIEZJWE1FIGZpZ3VyZSBvdXQgaWYgc3RlcmVvIHJlY2VpdmVkIGFuZCBzZXQgVjRMMl9BVURDQVBfU1RFUkVPLgotCQkJCXJldHVybiAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmIChDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEID09IGNvcmUtPmJvYXJkKSB7Ci0JCQkJc3RyY3B5KGEtPm5hbWUsIkxpbmUgSW4iKTsKLQkJCQlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJLy8gQXVkaW8gaW5wdXQgbm90IGF2YWlsYWJsZS4KLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotI2VuZGlmCiAKIAkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCWNhc2UgVklESU9DX0VOVU1fRk1UOgpAQCAtMTU3MCwxMyArMTMxOCwxNiBAQAogCXsKIAkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCisJCW1lbXNldChmLDAsc2l6ZW9mKCpmKSk7CisKIAkJaWYgKFVOU0VUID09IGNvcmUtPnR1bmVyX3R5cGUpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGYtPnR1bmVyICE9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtc2V0KGYsMCxzaXplb2YoKmYpKTsKKwogCQlmLT50eXBlID0gZmgtPnJhZGlvID8gVjRMMl9UVU5FUl9SQURJTyA6IFY0TDJfVFVORVJfQU5BTE9HX1RWOwogCQlmLT5mcmVxdWVuY3kgPSBkZXYtPmZyZXE7CisKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfR19GUkVRVUVOQ1ksZik7CisKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgpAQCAtMTU5NCwxMSArMTM0NSw3IEBACiAJCWRvd24oJmRldi0+bG9jayk7CiAJCWRldi0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKIAkJY3g4OF9uZXdzdGF0aW9uKGNvcmUpOwotI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKIAkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NfU19GUkVRVUVOQ1ksZik7Ci0jZWxzZQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFZJRElPQ1NGUkVRLCZkZXYtPmZyZXEpOwotI2VuZGlmCiAJCXVwKCZkZXYtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xNzA4LDE5ICsxNDU1LDggQEAKIAogCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwogCQlzdHJjcHkodC0+bmFtZSwgIlJhZGlvIik7Ci0gICAgICAgICAgICAgICAgdC0+cmFuZ2Vsb3cgID0gKGludCkoNjUqMTYpOwotICAgICAgICAgICAgICAgIHQtPnJhbmdlaGlnaCA9IChpbnQpKDEwOCoxNik7CiAKLSNpZmRlZiBWNEwyX0kyQ19DTElFTlRTCiAJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DX0dfVFVORVIsdCk7Ci0jZWxzZQotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgdnQ7Ci0JCQltZW1zZXQoJnZ0LDAsc2l6ZW9mKHZ0KSk7Ci0JCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LFZJRElPQ0dUVU5FUiwmdnQpOwotCQkJdC0+c2lnbmFsID0gdnQuc2lnbmFsOwotCQl9Ci0jZW5kaWYKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKQEAgLTE3NTMsOCArMTQ4OSwyOSBAQAogCQkqaWQgPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JY2FzZSBWSURJT0NfU19BVURJTzoKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwl7CisJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKKworCQlpZiAodi0+dHVuZXIpIC8qIE9ubHkgdHVuZXIgMCAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY3g4OF9jYWxsX2kyY19jbGllbnRzKGRldi0+Y29yZSxWSURJT0NTVFVORVIsdik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJfQogCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKworCQlpZiAoMCAhPSB0LT5pbmRleCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWN4ODhfY2FsbF9pMmNfY2xpZW50cyhkZXYtPmNvcmUsVklESU9DX1NfVFVORVIsdCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBWSURJT0NfU19BVURJTzoKIAljYXNlIFZJRElPQ19TX0lOUFVUOgogCWNhc2UgVklESU9DX1NfU1REOgogCQlyZXR1cm4gMDsKQEAgLTE4MjUsNiArMTU4MiwxNCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssZmxhZ3MpOwogfQogCitzdGF0aWMgY2hhciAqY3g4OF92aWRfaXJxc1szMl0gPSB7CisJInlfcmlzY2kxIiwgInVfcmlzY2kxIiwgInZfcmlzY2kxIiwgInZiaV9yaXNjMSIsCisJInlfcmlzY2kyIiwgInVfcmlzY2kyIiwgInZfcmlzY2kyIiwgInZiaV9yaXNjMiIsCisJInlfb2Zsb3ciLCAgInVfb2Zsb3ciLCAgInZfb2Zsb3ciLCAgInZiaV9vZmxvdyIsCisJInlfc3luYyIsICAgInVfc3luYyIsICAgInZfc3luYyIsICAgInZiaV9zeW5jIiwKKwkib3BjX2VyciIsICAicGFyX2VyciIsICAicmlwX2VyciIsICAicGNpX2Fib3J0IiwKK307CisKIHN0YXRpYyB2b2lkIGN4ODgwMF92aWRfaXJxKHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKQEAgLTIwNjUsMTEgKzE4MzAsNiBAQAogCQlyZXF1ZXN0X21vZHVsZSgidHVuZXIiKTsKIAlpZiAoY29yZS0+dGRhOTg4N19jb25mKQogCQlyZXF1ZXN0X21vZHVsZSgidGRhOTg4NyIpOwotCWlmIChjb3JlLT50dW5lcl90eXBlICE9IFVOU0VUKQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFRVTkVSX1NFVF9UWVBFLCZjb3JlLT50dW5lcl90eXBlKTsKLQlpZiAoY29yZS0+dGRhOTg4N19jb25mKQotCQljeDg4X2NhbGxfaTJjX2NsaWVudHMoZGV2LT5jb3JlLFREQTk4ODdfU0VUX0NPTkZJRywmY29yZS0+dGRhOTg4N19jb25mKTsKLQogCS8qIHJlZ2lzdGVyIHY0bCBkZXZpY2VzICovCiAJZGV2LT52aWRlb19kZXYgPSBjeDg4X3ZkZXZfaW5pdChjb3JlLGRldi0+cGNpLAogCQkJCQkmY3g4ODAwX3ZpZGVvX3RlbXBsYXRlLCJ2aWRlbyIpOwpAQCAtMjE2Miw3ICsxOTIyLDcgQEAKIAogc3RhdGljIGludCBjeDg4MDBfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotICAgICAgICBzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAogCS8qIHN0b3AgdmlkZW8rdmJpIGNhcHR1cmUgKi8KQEAgLTIxNzksMTAgKzE5MzksOCBAQAogCX0KIAlzcGluX3VubG9jaygmZGV2LT5zbG9jayk7CiAKLSNpZiAxCiAJLyogRklYTUUgLS0gc2h1dGRvd24gZGV2aWNlICovCiAJY3g4OF9zaHV0ZG93bihkZXYtPmNvcmUpOwotI2VuZGlmCiAKIAlwY2lfc2F2ZV9zdGF0ZShwY2lfZGV2KTsKIAlpZiAoMCAhPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGNpX2Rldiwgc3RhdGUpKSkgewpAQCAtMjE5NCw3ICsxOTUyLDcgQEAKIAogc3RhdGljIGludCBjeDg4MDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewotICAgICAgICBzdHJ1Y3QgY3g4ODAwX2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBjeDg4MDBfZGV2ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKIAogCWlmIChkZXYtPnN0YXRlLmRpc2FibGVkKSB7CkBAIC0yMjA0LDEwICsxOTYyLDggQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaV9kZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CiAKLSNpZiAxCiAJLyogRklYTUU6IHJlLWluaXRpYWxpemUgaGFyZHdhcmUgKi8KIAljeDg4X3Jlc2V0KGRldi0+Y29yZSk7Ci0jZW5kaWYKIAogCS8qIHJlc3RhcnQgdmlkZW8rdmJpIGNhcHR1cmUgKi8KIAlzcGluX2xvY2soJmRldi0+c2xvY2spOwpAQCAtMjIzMCw4ICsxOTg2LDggQEAKIAl7CiAJCS52ZW5kb3IgICAgICAgPSAweDE0ZjEsCiAJCS5kZXZpY2UgICAgICAgPSAweDg4MDAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKIAl9LHsKIAkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLwogCX0KQEAgLTIyMzksMTAgKzE5OTUsMTAgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjeDg4MDBfcGNpX3RibCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjeDg4MDBfcGNpX2RyaXZlciA9IHsKLSAgICAgICAgLm5hbWUgICAgID0gImN4ODgwMCIsCi0gICAgICAgIC5pZF90YWJsZSA9IGN4ODgwMF9wY2lfdGJsLAotICAgICAgICAucHJvYmUgICAgPSBjeDg4MDBfaW5pdGRldiwKLSAgICAgICAgLnJlbW92ZSAgID0gX19kZXZleGl0X3AoY3g4ODAwX2ZpbmlkZXYpLAorCS5uYW1lICAgICA9ICJjeDg4MDAiLAorCS5pZF90YWJsZSA9IGN4ODgwMF9wY2lfdGJsLAorCS5wcm9iZSAgICA9IGN4ODgwMF9pbml0ZGV2LAorCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGN4ODgwMF9maW5pZGV2KSwKIAogCS5zdXNwZW5kICA9IGN4ODgwMF9zdXNwZW5kLAogCS5yZXN1bWUgICA9IGN4ODgwMF9yZXN1bWUsCkBAIC0yMjc0LDQgKzIwMzAsNSBAQAogICogTG9jYWwgdmFyaWFibGVzOgogICogYy1iYXNpYy1vZmZzZXQ6IDgKICAqIEVuZDoKKyAqIGthdGU6IGVvbCAidW5peCI7IGluZGVudC13aWR0aCAzOyByZW1vdmUtdHJhaWxpbmctc3BhY2Ugb247IHJlcGxhY2UtdHJhaWxpbmctc3BhY2Utc2F2ZSBvbjsgdGFiLXdpZHRoIDg7IHJlcGxhY2UtdGFicyBvZmY7IHNwYWNlLWluZGVudCBvZmY7IG1peGVkLWluZGVudCBvZmYKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKaW5kZXggODhlYWFhYmEuLjMwN2JlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGN4ODguaCx2IDEuNTYgMjAwNS8wMy8wNCAwOToxMjoyMyBrcmF4ZWwgRXhwICQKKyAqICRJZDogY3g4OC5oLHYgMS42OCAyMDA1LzA3LzA3IDE0OjE3OjQ3IG1jaGVoYWIgRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIGN4MjM4OHggYmFzZWQgVFYgY2FyZHMKICAqCkBAIC01MSw4ICs1MSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZGVmaW5lcyBhbmQgZW51bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2RlZmluZSBWNEwyX0kyQ19DTElFTlRTIDEKLQogI2RlZmluZSBGT1JNQVRfRkxBR1NfUEFDS0VEICAgICAgIDB4MDEKICNkZWZpbmUgRk9STUFUX0ZMQUdTX1BMQU5BUiAgICAgICAweDAyCiAKQEAgLTY0LDYgKzYyLDEzIEBACiAjZGVmaW5lIFNIQURPV19BVURfQkFMX0NUTCAgICAgICAgICAgMgogI2RlZmluZSBTSEFET1dfTUFYICAgICAgICAgICAgICAgICAgIDIKIAorLyogRk0gUmFkaW8gZGVlbXBoYXNpcyB0eXBlICovCitlbnVtIGN4ODhfZGVlbXBoX3R5cGUgeworCUZNX05PX0RFRU1QSCA9IDAsCisJRk1fREVFTVBIXzUwLAorCUZNX0RFRU1QSF83NQorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHR2IG5vcm1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTc3LDkgKzgyLDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1fbWF4dyhzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCiB7CiAJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA3NjggOiA2NDA7Ci0vLwlyZXR1cm4gKG5vcm0tPmlkICYgVjRMMl9TVERfNjI1XzUwKSA/IDcyMCA6IDY0MDsKIH0KIAorCiBzdGF0aWMgdW5zaWduZWQgaW50IGlubGluZSBub3JtX21heGgoc3RydWN0IGN4ODhfdHZub3JtICpub3JtKQogewogCXJldHVybiAobm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApID8gNTc2IDogNDgwOwpAQCAtMTUyLDcgKzE1Nyw3IEBACiAjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX0RWQl9UICAgICAgICAgICAgMTQKICNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMSAxNQogI2RlZmluZSBDWDg4X0JPQVJEX0tXT1JMRF9MVFY4ODMgICAgICAgICAgIDE2Ci0jZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTEQgMTcKKyNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzNfR09MRF9RICAxNwogI2RlZmluZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9EVkJfVDEgICAgICAgIDE4CiAjZGVmaW5lIENYODhfQk9BUkRfQ09ORVhBTlRfRFZCX1QxICAgICAgICAgMTkKICNkZWZpbmUgQ1g4OF9CT0FSRF9QUk9WSURFT19QVjI1OSAgICAgICAgICAyMApAQCAtMTYwLDggKzE2NSwxMiBAQAogI2RlZmluZSBDWDg4X0JPQVJEX1BDSERUVl9IRDMwMDAgICAgICAgICAgIDIyCiAjZGVmaW5lIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UICAgICAgICAgMjMKICNkZWZpbmUgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfUk9TTFlOICAgICAgICAyNAotI2RlZmluZSBDWDg4X0JPQVJEX0RJR0lUQUxMT0dJQ19NRUMJICAgICAgIDI1CisjZGVmaW5lIENYODhfQk9BUkRfRElHSVRBTExPR0lDX01FQyAgICAgICAgMjUKICNkZWZpbmUgQ1g4OF9CT0FSRF9JT0RBVEFfR1ZCQ1RWN0UgICAgICAgICAyNgorI2RlZmluZSBDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfVUxUUkFfUFJPIDI3CisjZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVCAgMjgKKyNkZWZpbmUgQ1g4OF9CT0FSRF9BRFNURUNIX0RWQl9UX1BDSSAgICAgICAgICAyOQorI2RlZmluZSBDWDg4X0JPQVJEX1RFUlJBVEVDX0NJTkVSR1lfMTQwMF9EVkJfVDEgIDMwCiAKIGVudW0gY3g4OF9pdHlwZSB7CiAJQ1g4OF9WTVVYX0NPTVBPU0lURTEgPSAxLApAQCAtMTg1LDYgKzE5NCw5IEBACiBzdHJ1Y3QgY3g4OF9ib2FyZCB7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgKm5hbWU7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgdHVuZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQJCXJhZGlvX3R5cGU7CisJdW5zaWduZWQgY2hhcgkJdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyCQlyYWRpb19hZGRyOwogCWludCAgICAgICAgICAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKIAlzdHJ1Y3QgY3g4OF9pbnB1dCAgICAgICBpbnB1dFs4XTsKIAlzdHJ1Y3QgY3g4OF9pbnB1dCAgICAgICByYWRpbzsKQEAgLTIwOCw3ICsyMjAsNiBAQAogI2RlZmluZSBSRVNPVVJDRV9WQkkgICAgICAgICAgIDQKIAogI2RlZmluZSBCVUZGRVJfVElNRU9VVCAgICAgKEhaLzIpICAvKiAwLjUgc2Vjb25kcyAqLwotLy8jZGVmaW5lIEJVRkZFUl9USU1FT1VUICAgICAoSFoqMikKIAogLyogYnVmZmVyIGZvciBvbmUgdmlkZW8gZnJhbWUgKi8KIHN0cnVjdCBjeDg4X2J1ZmZlciB7CkBAIC0yNTUsNiArMjY2LDkgQEAKIAkvKiBjb25maWcgaW5mbyAtLSBhbmFsb2cgKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBib2FyZDsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICB0dW5lcl90eXBlOworCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHJhZGlvX3R5cGU7CisJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgdHVuZXJfYWRkcjsKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICByYWRpb19hZGRyOwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBoYXNfcmFkaW87CiAKQEAgLTMyMSwxMSArMzM1LDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAgICAgICAgICAgICAqcGNpOwogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgIHBjaV9yZXYscGNpX2xhdDsKIAotI2lmIDAKLQkvKiB2aWRlbyBvdmVybGF5ICovCi0Jc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgICAgZmJ1ZjsKLQlzdHJ1Y3QgY3g4OF9idWZmZXIgICAgICAgICAqc2NyZWVuOwotI2VuZGlmCiAKIAkvKiBjYXB0dXJlIHF1ZXVlcyAqLwogCXN0cnVjdCBjeDg4X2RtYXF1ZXVlICAgICAgIHZpZHE7CkBAIC00MjAsOCArNDI5LDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBjeDg4LWNvcmUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi1leHRlcm4gY2hhciAqY3g4OF92aWRfaXJxc1szMl07Ci1leHRlcm4gY2hhciAqY3g4OF9tcGVnX2lycXNbMzJdOwogZXh0ZXJuIHZvaWQgY3g4OF9wcmludF9pcnFiaXRzKGNoYXIgKm5hbWUsIGNoYXIgKnRhZywgY2hhciAqKnN0cmluZ3MsCiAJCQkgICAgICAgdTMyIGJpdHMsIHUzMiBtYXNrKTsKIGV4dGVybiB2b2lkIGN4ODhfcHJpbnRfaW9jdGwoY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGNtZCk7CkBAIC00NzEsNiArNDc4LDExIEBACiAvKiBjeDg4LXZiaS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiB2b2lkIGN4ODgwMF92YmlfZm10KHN0cnVjdCBjeDg4MDBfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisvKgoraW50IGN4ODgwMF9zdGFydF92YmlfZG1hKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCisJCQkgc3RydWN0IGN4ODhfZG1hcXVldWUgKnEsCisJCQkgc3RydWN0IGN4ODhfYnVmZmVyICAgKmJ1Zik7CisqLwogaW50IGN4ODgwMF9zdG9wX3ZiaV9kbWEoc3RydWN0IGN4ODgwMF9kZXYgKmRldik7CiBpbnQgY3g4ODAwX3Jlc3RhcnRfdmJpX3F1ZXVlKHN0cnVjdCBjeDg4MDBfZGV2ICAgICpkZXYsCiAJCQkgICAgIHN0cnVjdCBjeDg4X2RtYXF1ZXVlICpxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWdwaW8uYwppbmRleCBhYjY2MjBkLi5hNTY1ODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1ncGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtZ3Bpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogaXIta2JkLWdwaW8uYyx2IDEuMTIgMjAwNS8wMi8yMiAxMjoyODo0MCBrcmF4ZWwgRXhwICQKKyAqICRJZDogaXIta2JkLWdwaW8uYyx2IDEuMTMgMjAwNS8wNS8xNSAxOTowMToyNiBtY2hlaGFiIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAzIEdlcmQgS25vcnIKICAqIENvcHlyaWdodCAoYykgMjAwMyBQYXZlbCBNYWNoZWsKQEAgLTExNCwzOCArMTE0LDYgQEAKIAlbIDB4M2UgXSA9IEtFWV9WT0xVTUVVUCwgICAgLy8gJ3ZvbHVtZSArJwogfTsKIAotc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3BpeGVsdmlld1tJUl9LRVlUQUJfU0laRV0gPSB7Ci0JWyAgMiBdID0gS0VZX0tQMCwKLQlbICAxIF0gPSBLRVlfS1AxLAotCVsgMTEgXSA9IEtFWV9LUDIsCi0JWyAyNyBdID0gS0VZX0tQMywKLQlbICA1IF0gPSBLRVlfS1A0LAotCVsgIDkgXSA9IEtFWV9LUDUsCi0JWyAyMSBdID0gS0VZX0tQNiwKLQlbICA2IF0gPSBLRVlfS1A3LAotCVsgMTAgXSA9IEtFWV9LUDgsCi0JWyAxOCBdID0gS0VZX0tQOSwKLQotCVsgIDMgXSA9IEtFWV9UVU5FUiwgICAgICAgLy8gVFYvRk0KLQlbICA3IF0gPSBLRVlfU0VBUkNILCAgICAgIC8vIHNjYW4KLQlbIDI4IF0gPSBLRVlfWk9PTSwgICAgICAgIC8vIGZ1bGwgc2NyZWVuCi0JWyAzMCBdID0gS0VZX1BPV0VSLAotCVsgMjMgXSA9IEtFWV9WT0xVTUVET1dOLAotCVsgMzEgXSA9IEtFWV9WT0xVTUVVUCwKLQlbIDIwIF0gPSBLRVlfQ0hBTk5FTERPV04sCi0JWyAyMiBdID0gS0VZX0NIQU5ORUxVUCwKLQlbIDI0IF0gPSBLRVlfTVVURSwKLQotCVsgIDAgXSA9IEtFWV9MSVNULCAgICAgICAgLy8gc291cmNlCi0JWyAxOSBdID0gS0VZX0lORk8sICAgICAgICAvLyBsb29wCi0JWyAxNiBdID0gS0VZX0xBU1QsICAgICAgICAvLyArMTAwCi0JWyAxMyBdID0gS0VZX0NMRUFSLCAgICAgICAvLyByZXNldAotCVsgMTIgXSA9IEJUTl9SSUdIVCwgICAgICAgLy8gZnVuKysKLQlbICA0IF0gPSBCVE5fTEVGVCwgICAgICAgIC8vIGZ1bi0tCi0JWyAxNCBdID0gS0VZX0dPVE8sICAgICAgICAvLyBmdW5jdGlvbgotCVsgMTUgXSA9IEtFWV9TVE9QLCAgICAgICAgIC8vIGZyZWV6ZQotfTsKLQogLyogQXR0aWxhIEtvbmRvcm9zIDxhdHRpbGEua29uZG9yb3NAY2hlbGxvLmh1PiAqLwogc3RhdGljIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2FwYWNfdmlld2NvbXBbSVJfS0VZVEFCX1NJWkVdID0gewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCmluZGV4IDkyNjY0ZjcuLjlmYzUwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXIta2JkLWkyYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogaXIta2JkLWkyYy5jLHYgMS4xMCAyMDA0LzEyLzA5IDEyOjUxOjM1IGtyYXhlbCBFeHAgJAorICogJElkOiBpci1rYmQtaTJjLmMsdiAxLjExIDIwMDUvMDcvMDcgMTY6NDI6MTEgbWNoZWhhYiBFeHAgJAogICoKICAqIGtleWJvYXJkIGlucHV0IGRyaXZlciBmb3IgaTJjIElSIHJlbW90ZSBjb250cm9scwogICoKQEAgLTY2LDI2ICs2NiwyNiBAQAogCVsgMjkgXSA9IEtFWV9QQUdFRE9XTiwKIAlbIDE5IF0gPSBLRVlfU09VTkQsCiAKLQlbIDI0IF0gPSBLRVlfS1BQTFVTTUlOVVMsCS8vIENIICsvLQotCVsgMjIgXSA9IEtFWV9TVUJUSVRMRSwJCS8vIENDCi0JWyAxMyBdID0gS0VZX1RFWFQsCQkvLyBUVFgKLQlbIDExIF0gPSBLRVlfVFYsCQkvLyBBSVIvQ0JMCi0JWyAxNyBdID0gS0VZX1BDLAkJLy8gUEMvVFYKLQlbIDIzIF0gPSBLRVlfT0ssCQkvLyBDSCBSVE4KLQlbIDI1IF0gPSBLRVlfTU9ERSwgCQkvLyBGVU5DCi0JWyAxMiBdID0gS0VZX1NFQVJDSCwgCQkvLyBBVVRPU0NBTgorCVsgMjQgXSA9IEtFWV9LUFBMVVNNSU5VUywJLyogQ0ggKy8tICovCisJWyAyMiBdID0gS0VZX1NVQlRJVExFLAkJLyogQ0MgKi8KKwlbIDEzIF0gPSBLRVlfVEVYVCwJCS8qIFRUWCAqLworCVsgMTEgXSA9IEtFWV9UViwJCS8qIEFJUi9DQkwgKi8KKwlbIDE3IF0gPSBLRVlfUEMsCQkvKiBQQy9UViAqLworCVsgMjMgXSA9IEtFWV9PSywJCS8qIENIIFJUTiAqLworCVsgMjUgXSA9IEtFWV9NT0RFLCAJCS8qIEZVTkMgKi8KKwlbIDEyIF0gPSBLRVlfU0VBUkNILCAJCS8qIEFVVE9TQ0FOICovCiAKIAkvKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGhlc2Ugb25lcyEgKi8KLQlbIDE1IF0gPSBLRVlfU0VMRUNULCAJCS8vIFNPVVJDRQotCVsgMTAgXSA9IEtFWV9LUFBMVVMsCQkvLyArMTAwCi0JWyAyMCBdID0gS0VZX0tQRVFVQUwsCQkvLyBTWU5DCi0JWyAyOCBdID0gS0VZX01FRElBLCAgICAgICAgICAgICAvLyBQQy9UVgorCVsgMTUgXSA9IEtFWV9TRUxFQ1QsIAkJLyogU09VUkNFICovCisJWyAxMCBdID0gS0VZX0tQUExVUywJCS8qICsxMDAgKi8KKwlbIDIwIF0gPSBLRVlfS1BFUVVBTCwJCS8qIFNZTkMgKi8KKwlbIDI4IF0gPSBLRVlfTUVESUEsICAgICAgICAgICAgIC8qIFBDL1RWICovCiB9OwogCiBzdGF0aWMgSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcHVycGxldHZbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHgzICBdID0gS0VZX1BPV0VSLAogCVsgMHg2ZiBdID0gS0VZX01VVEUsCi0JWyAweDEwIF0gPSBLRVlfQkFDS1NQQUNFLAkvLyBSZWNhbGwKKwlbIDB4MTAgXSA9IEtFWV9CQUNLU1BBQ0UsCS8qIFJlY2FsbCAqLwogCiAJWyAweDExIF0gPSBLRVlfS1AwLAogCVsgMHg0ICBdID0gS0VZX0tQMSwKQEAgLTk3LDcgKzk3LDcgQEAKIAlbIDB4YyAgXSA9IEtFWV9LUDcsCiAJWyAweGQgIF0gPSBLRVlfS1A4LAogCVsgMHhlICBdID0gS0VZX0tQOSwKLQlbIDB4MTIgXSA9IEtFWV9LUERPVCwJCS8vIDEwMCsKKwlbIDB4MTIgXSA9IEtFWV9LUERPVCwJCS8qIDEwMCsgKi8KIAogCVsgMHg3ICBdID0gS0VZX1ZPTFVNRVVQLAogCVsgMHhiICBdID0gS0VZX1ZPTFVNRURPV04sCkBAIC0xMDksMjUgKzEwOSwxNiBAQAogCVsgMHgxMyBdID0gS0VZX0NIQU5ORUxET1dOLAogCVsgMHg0OCBdID0gS0VZX1pPT00sCiAKLQlbIDB4MWIgXSA9IEtFWV9WSURFTywJCS8vIFZpZGVvIHNvdXJjZQotI2lmIDAKLQlbIDB4MWYgXSA9IEtFWV9TLCAgICAgICAJLy8gU25hcHNob3QKLSNlbmRpZgotCVsgMHg0OSBdID0gS0VZX0xBTkdVQUdFLAkvLyBNVFMgU2VsZWN0Ci0JWyAweDE5IF0gPSBLRVlfU0VBUkNILAkJLy8gQXV0byBTY2FuCisJWyAweDFiIF0gPSBLRVlfVklERU8sCQkvKiBWaWRlbyBzb3VyY2UgKi8KKwlbIDB4NDkgXSA9IEtFWV9MQU5HVUFHRSwJLyogTVRTIFNlbGVjdCAqLworCVsgMHgxOSBdID0gS0VZX1NFQVJDSCwJCS8qIEF1dG8gU2NhbiAqLwogCiAJWyAweDRiIF0gPSBLRVlfUkVDT1JELAogCVsgMHg0NiBdID0gS0VZX1BMQVksCi0JWyAweDQ1IF0gPSBLRVlfUEFVU0UsICAgCS8vIFBhdXNlCisJWyAweDQ1IF0gPSBLRVlfUEFVU0UsICAgCS8qIFBhdXNlICovCiAJWyAweDQ0IF0gPSBLRVlfU1RPUCwKLSNpZiAwCi0JWyAweDQzIF0gPSBLRVlfVCwgICAgCQkvLyBUaW1lIFNoaWZ0Ci0JWyAweDQ3IF0gPSBLRVlfWSwgICAgCQkvLyBUaW1lIFNoaWZ0IE9GRgotCVsgMHg0YSBdID0gS0VZX08sICAgIAkJLy8gVE9QCi0JWyAweDE3IF0gPSBLRVlfRiwgICAgCQkvLyBTVVJGIENICi0jZW5kaWYKLQlbIDB4NDAgXSA9IEtFWV9GT1JXQVJELCAgIAkvLyBGb3J3YXJkID8KLQlbIDB4NDIgXSA9IEtFWV9SRVdJTkQsICAgCS8vIEJhY2t3YXJkID8KKwlbIDB4NDAgXSA9IEtFWV9GT1JXQVJELCAgIAkvKiBGb3J3YXJkID8gKi8KKwlbIDB4NDIgXSA9IEtFWV9SRVdJTkQsICAgCS8qIEJhY2t3YXJkID8gKi8KIAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYwppbmRleCAwOTQ2NGQ2Li42MjM5MjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuYwpAQCAtNTY3LDEwICs1NjcsNiBAQAogCXN3aXRjaCAoYXVkbW9kZSkgewogCWNhc2UgVjRMMl9UVU5FUl9NT0RFX1NURVJFTzoKIAkJc3JjID0gMHgwMDIwIHwgbmljYW07Ci0jaWYgMAotCQkvKiBzcGF0aWFsIGVmZmVjdCAqLwotCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwMDA1LDB4NDAwMCk7Ci0jZW5kaWYKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX1RVTkVSX01PREVfTU9OTzoKIAkJaWYgKG1zcC0+bW9kZSA9PSBNU1BfTU9ERV9BTV9OSUNBTSkgewpAQCAtNzM1LDI4ICs3MzEsMjEgQEAKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAotYWdhaW46CiAJYWRkX3dhaXRfcXVldWUoJm1zcC0+d3EsICZ3YWl0KTsKIAlpZiAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewogCQlpZiAodGltZW91dCA8IDApIHsKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZSgpOwogCQl9IGVsc2UgewotI2lmIDAKLQkJCS8qIGhtbSwgdGhhdCBvbmUgZG9lc24ndCByZXR1cm4gb24gd2FrZXVwIC4uLiAqLwotCQkJbXNsZWVwX2ludGVycnVwdGlibGUodGltZW91dCk7Ci0jZWxzZQogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0jZW5kaWYKIAkJfQogCX0KKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKKwkJcmVmcmlnZXJhdG9yICgpOworCX0KIAogCXJlbW92ZV93YWl0X3F1ZXVlKCZtc3AtPndxLCAmd2FpdCk7Ci0KLQlpZiAodHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpKQotCQlnb3RvIGFnYWluOwotCiAJcmV0dXJuIG1zcC0+cmVzdGFydDsKIH0KIApAQCAtMTE1OSwxNyArMTE0OCwxMCBAQAogCQkJCQkgICAgTVNQX0NBUlJJRVIoMTAuNykpOwogCQkJLyogc2NhcnQgcm91dGluZyAqLwogCQkJbXNwMzQwMGNfc2V0X3NjYXJ0KGNsaWVudCxTQ0FSVF9JTjIsMCk7Ci0jaWYgMAotCQkJLyogcmFkaW8gZnJvbSBTQ0FSVF9JTjIgKi8KLQkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA4LCAweDAyMjApOwotCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDksIDB4MDIyMCk7Ci0JCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwYiwgMHgwMjIwKTsKLSNlbHNlCiAJCQkvKiBtc3AzNHh4IGRvZXMgcmFkaW8gZGVjb2RpbmcgKi8KIAkJCW1zcDM0MDBjX3dyaXRlKGNsaWVudCxJMkNfTVNQMzQwMENfREZQLCAweDA4LCAweDAwMjApOwogCQkJbXNwMzQwMGNfd3JpdGUoY2xpZW50LEkyQ19NU1AzNDAwQ19ERlAsIDB4MDksIDB4MDAyMCk7CiAJCQltc3AzNDAwY193cml0ZShjbGllbnQsSTJDX01TUDM0MDBDX0RGUCwgMHgwYiwgMHgwMDIwKTsKLSNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgMHgwMDAzOgogCQljYXNlIDB4MDAwNDoKQEAgLTE0MzYsNyArMTQxOCw3IEBACiBzdGF0aWMgaW50IG1zcF9wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApOwogc3RhdGljIGludCBtc3BfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwogCi1zdGF0aWMgaW50IG1zcF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKTsKK3N0YXRpYyBpbnQgbXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpOwogc3RhdGljIGludCBtc3BfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHUzMiBsZXZlbCk7CiAKIHN0YXRpYyB2b2lkIG1zcF93YWtlX3RocmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKQEAgLTE1MTIsMTAgKzE0OTQsNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0jaWYgMAotCS8qIHRoaXMgd2lsbCB0dXJuIG9uIGEgMWtIeiBiZWVwIC0gbWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuLi4gKi8KLQltc3AzNDAwY193cml0ZShjLEkyQ19NU1AzNDAwQ19ERlAsIDB4MDAxNCwgMHgxMDQwKTsKLSNlbmRpZgogCW1zcDM0MDBjX3NldHZvbHVtZShjLCBtc3AtPm11dGVkLCBtc3AtPnZvbHVtZSwgbXNwLT5iYWxhbmNlKTsKIAogCXNucHJpbnRmKGMtPm5hbWUsIHNpemVvZihjLT5uYW1lKSwgIk1TUDM0JTAyZCVjLSVjJWQiLApAQCAtMTg0MSw3ICsxODE5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtc3Bfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCkKK3N0YXRpYyBpbnQgbXNwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaAppbmRleCBkNzBhOTU0Li4wMjNmMzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAuaApAQCAtMSwzICsxLDcgQEAKKy8qCisgKiAkSWQ6IG1zcDM0MDAuaCx2IDEuMyAyMDA1LzA2LzEyIDA0OjE5OjE5IG1jaGVoYWIgRXhwICQKKyAqLworCiAjaWZuZGVmIE1TUDM0MDBfSAogI2RlZmluZSBNU1AzNDAwX0gKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQyMHh4LmMKaW5kZXggOTVhZDE3Yi4uMmZiN2MyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDIweHguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210MjB4eC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogbXQyMHh4LmMsdiAxLjQgMjAwNS8wMy8wNCAwOToyNDo1NiBrcmF4ZWwgRXhwICQKKyAqICRJZDogbXQyMHh4LmMsdiAxLjUgMjAwNS8wNi8xNiAwODoyOTo0OSBuc2ggRXhwICQKICAqCiAgKiBpMmMgdHYgdHVuZXIgY2hpcCBkZXZpY2UgZHJpdmVyCiAgKiBjb250cm9scyBtaWNyb3R1bmUgdHVuZXJzLCBtdDIwMzIgKyBtdDIwNTAgYXQgdGhlIG1vbWVudC4KQEAgLTI5NSw4ICsyOTUsOCBAQAogCWludCBpZjIgPSB0LT5yYWRpb19pZjI7CiAKIAkvLyBwZXIgTWFudWFsIGZvciBGTSB0dW5pbmc6IGZpcnN0IGlmIGNlbnRlciBmcmVxLiAxMDg1IE1IegotICAgICAgICBtdDIwMzJfc2V0X2lmX2ZyZXEoYywgZnJlcSo2MjUwMCAvKiBmcmVxKjEwMDAqMTAwMC8xNiAqLywKLQkJCSAgIDEwODUqMTAwMCoxMDAwLGlmMixpZjIsaWYyKTsKKyAgICAgICAgbXQyMDMyX3NldF9pZl9mcmVxKGMsIGZyZXEgKiAxMDAwIC8gMTYsCisJCQkgICAgICAxMDg1KjEwMDAqMTAwMCxpZjIsaWYyLGlmMik7CiB9CiAKIC8vIEluaXRhbGl6YXRpb24gYXMgZGVzY3JpYmVkIGluICJNVDIwM3ggUHJvZ3JhbW1pbmcgUHJvY2VkdXJlcyIsIFJldiAxLjIsIEZlYi4yMDAxCkBAIC01MTEsMjIgKzUxMSw2IEBACiAJdHVuZXJfaW5mbygibWljcm90dW5lOiBjb21wYW55Y29kZT0lMDR4IHBhcnQ9JTAyeCByZXY9JTAyeFxuIiwKIAkJICAgY29tcGFueV9jb2RlLGJ1ZlsweDEzXSxidWZbMHgxNF0pOwogCi0jaWYgMAotCS8qIHNlZW1zIHRvIGNhdXNlIG1vcmUgcHJvYmxlbXMgdGhhbiBpdCBzb2x2ZXMgLi4uICovCi0Jc3dpdGNoIChjb21wYW55X2NvZGUpIHsKLQljYXNlIDB4MzBiZjoKLQljYXNlIDB4M2NiZjoKLQljYXNlIDB4M2RiZjoKLQljYXNlIDB4NGQ1NDoKLQljYXNlIDB4OGU4MToKLQljYXNlIDB4OGU5MToKLQkJLyogb2sgKD8pICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXR1bmVyX3dhcm4oInR1bmVyOiBtaWNyb3R1bmU6IHVua25vd24gY29tcGFueWNvZGVcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKIAogCWlmIChidWZbMHgxM10gPCBBUlJBWV9TSVpFKG1pY3JvdHVuZV9wYXJ0KSAmJgogCSAgICBOVUxMICE9IG1pY3JvdHVuZV9wYXJ0W2J1ZlsweDEzXV0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teGIuYwppbmRleCA3MGJmMWYxLi40ODYyMzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXhiLmMKQEAgLTMyNiw2ICszMjYsNyBAQAogCXN0cnVjdCBteGIqIG14YiA9IChzdHJ1Y3QgbXhiKilkZXYtPmV4dF9wcml2OwogCXN0cnVjdCB2aWRlb19kZWNvZGVyX2luaXQgaW5pdDsKIAlzdHJ1Y3QgaTJjX21zZyBtc2c7CisJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKIAogCWludCBpID0gMCwgZXJyID0gMDsKIAlzdHJ1Y3QJdGVhNjQxNWNfbXVsdGlwbGV4IHZtOwkKQEAgLTM0OSw4ICszNTAsMTAgQEAKIAlteGItPnNhYTcxMTFhLT5kcml2ZXItPmNvbW1hbmQobXhiLT5zYWE3MTExYSxERUNPREVSX1NFVF9WQklfQllQQVNTLCAmaSk7CiAKIAkvKiBzZWxlY3QgYSB0dW5lciB0eXBlICovCi0JaSA9IDU7IAotCW14Yi0+dHVuZXItPmRyaXZlci0+Y29tbWFuZChteGItPnR1bmVyLFRVTkVSX1NFVF9UWVBFLCAmaSk7CisJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfQU5BTE9HX1RWOworCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKwl0dW5fc2V0dXAudHlwZSA9IDU7CisJbXhiLT50dW5lci0+ZHJpdmVyLT5jb21tYW5kKG14Yi0+dHVuZXIsVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CiAJCiAJLyogbXV0ZSBhdWRpbyBvbiB0ZWE2NDIwcyAqLwogCW14Yi0+dGVhNjQyMF8xLT5kcml2ZXItPmNvbW1hbmQobXhiLT50ZWE2NDIwXzEsVEVBNjQyMF9TV0lUQ0gsICZURUE2NDIwX2xpbmVbNl1bMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCmluZGV4IDQyYzJiNTYuLjc5ZDA1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKQEAgLTQxLDE2ICs0MSwxNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZm9ybWF0IHY0bDJfZm9ybWF0X3RhYmxlW10gPQogewotCVtTQUE2NzUySFNfVkZfRDFdID0gewotCQkuZm10ID0geyAucGl4ID0geyAud2lkdGggPSA3MjAsIC5oZWlnaHQgPSA1NzYgfSwgfSwgfSwKLQlbU0FBNjc1MkhTX1ZGXzJfM19EMV0gPSB7Ci0JCS5mbXQgPSB7IC5waXggPSB7IC53aWR0aCA9IDQ4MCwgLmhlaWdodCA9IDU3NiB9LCB9LCB9LAotCVtTQUE2NzUySFNfVkZfMV8yX0QxXSA9IHsKLQkJLmZtdCA9IHsgLnBpeCA9IHsgLndpZHRoID0gMzUyLCAuaGVpZ2h0ID0gNTc2IH0sIH0sIH0sCi0JW1NBQTY3NTJIU19WRl9TSUZdID0gewotCQkuZm10ID0geyAucGl4ID0geyAud2lkdGggPSAzNTIsIC5oZWlnaHQgPSAyODggfSwgfSwgfSwKLQlbU0FBNjc1MkhTX1ZGX1VOS05PV05dID0gewotCQkuZm10ID0geyAucGl4ID0geyAud2lkdGggPSAwLCAuaGVpZ2h0ID0gMCB9LCB9LCB9LAorCVtTQUE2NzUySFNfVkZfRDFdID0KKwkJeyAuZm10ID0geyAucGl4ID0geyAud2lkdGggPSA3MjAsIC5oZWlnaHQgPSA1NzYgfX19LAorCVtTQUE2NzUySFNfVkZfMl8zX0QxXSA9CisJCXsgLmZtdCA9IHsgLnBpeCA9IHsgLndpZHRoID0gNDgwLCAuaGVpZ2h0ID0gNTc2IH19fSwKKwlbU0FBNjc1MkhTX1ZGXzFfMl9EMV0gPQorCQl7IC5mbXQgPSB7IC5waXggPSB7IC53aWR0aCA9IDM1MiwgLmhlaWdodCA9IDU3NiB9fX0sCisJW1NBQTY3NTJIU19WRl9TSUZdID0KKwkJeyAuZm10ID0geyAucGl4ID0geyAud2lkdGggPSAzNTIsIC5oZWlnaHQgPSAyODggfX19LAorCVtTQUE2NzUySFNfVkZfVU5LTk9XTl0gPQorCQl7IC5mbXQgPSB7IC5waXggPSB7IC53aWR0aCA9IDAsIC5oZWlnaHQgPSAwfX19LAogfTsKIAogc3RydWN0IHNhYTY3NTJoc19zdGF0ZSB7CkBAIC0xNTUsMTAgKzE1NSw2IEBACiAJCS50YXJnZXQgID0gMjU2LAogCX0sCiAKLSNpZiAwCi0JLyogRklYTUU6IHNpemU/IHZpYSBTX0ZNVD8gKi8KLQkudmlkZW9fZm9ybWF0ID0gTVBFR19WSURFT19GT1JNQVRfRDEsCi0jZW5kaWYKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IGM1MWViN2YuLjg4YjcxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtMSw2ICsxLDUgQEAKLQogLyoKLSAqICRJZDogc2FhNzEzNC1jYXJkcy5jLHYgMS41NCAyMDA1LzAzLzA3IDEyOjAxOjUxIGtyYXhlbCBFeHAgJAorICogJElkOiBzYWE3MTM0LWNhcmRzLmMsdiAxLjgwIDIwMDUvMDcvMDcgMDE6NDk6MzAgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogY2FyZC1zcGVjaWZpYyBzdHVmZi4KQEAgLTQ3LDYgKzQ2LDEwIEBACiAJCS5uYW1lCQk9ICJVTktOT1dOL0dFTkVSSUMiLAogCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9ICJkZWZhdWx0IiwKIAkJCS52bXV4ID0gMCwKQEAgLTU4LDYgKzYxLDEwIEBACiAJCS5uYW1lCQk9ICJQcm90ZXVzIFBybyBbcGhpbGlwcyByZWZlcmVuY2UgZGVzaWduXSIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAwLApAQCAtODMsNiArOTAsMTAgQEAKIAkJLm5hbWUJCT0gIkxpZmVWaWV3IEZseVZJREVPMzAwMCIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwogCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC05MCw3ICsxMDEsNyBAQAogCQkJLmFtdXggPSBUViwKIAkJCS5ncGlvID0gMHg4MDAwLAogCQkJLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0seworCQl9LHsKIAkJCS5uYW1lID0gbmFtZV90dl9tb25vLAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKQEAgLTExNywxMiArMTI4LDIxIEBACiAJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDIwMDAsCiAJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDBdID0gewogCQkvKiAiVEMgV2FuIiA8dGN3YW5AY3MudXNtLm15PiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5VklERU8yMDAwIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisKIAkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtMTQ2LDE0ICsxNjYsMTQgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4NDAwMCwKIAkJfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHgyMDAwLAotICAgICAgICAgICAgICAgIH0sCisJCX0sCiAJCS5tdXRlID0gewogCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg4MDAwLAogCQl9LAogCX0sCkBAIC0xNjIsMTAgKzE4MiwxNCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5VFYgUGxhdGludW0gTWluaSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCi0JCQkuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBUViwKIAkJCS50diAgID0gMSwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCkBAIC0xODMsNiArMjA3LDEwIEBACiAJCS5uYW1lICAgICAgICAgICA9ICJMaWZlVmlldyBGbHlUViBQbGF0aW51bSBGTSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5ncGlvbWFzayAgICAgICA9IDB4MUUwMDAsCS8qIFNldCBHUDE2IGFuZCB1bnVzZWQgMTUsMTQsMTMgdG8gT3V0cHV0ICovCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC0xOTAsNyArMjE4LDcgQEAKIAkJCS5hbXV4ID0gVFYsCiAJCQkuZ3BpbyA9IDB4MTAwMDAsCS8qIEdQMTY9MSBzZWxlY3RzIFRWIGlucHV0ICovCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7CisJCX0sewogLyoJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gTElORTIsCkBAIC0yMDAsMjkgKzIyOCwzOCBAQAogKi8JCQkubmFtZSA9IG5hbWVfY29tcDEsCS8qIENvbXBvc2l0ZSBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLwogCQkJLnZtdXggPSAwLAogCQkJLmFtdXggPSBMSU5FMiwKLS8vCQkJLmdwaW8gPSAweDQwMDAsCisvKgkJCS5ncGlvID0gMHg0MDAwLCAgICAgICAgICovCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAkvKiBDb21wb3NpdGUgaW5wdXQgKi8KIAkJCS52bXV4ID0gMywKIAkJCS5hbXV4ID0gTElORTIsCi0vLwkJCS5ncGlvID0gMHg0MDAwLAorLyoJCQkuZ3BpbyA9IDB4NDAwMCwgICAgICAgICAqLwogCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCS8qIFMtVmlkZW8gc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KIAkJCS52bXV4ID0gOCwKIAkJCS5hbXV4ID0gTElORTIsCi0vLwkJCS5ncGlvID0gMHg0MDAwLAorLyoJCQkuZ3BpbyA9IDB4NDAwMCwgICAgICAgICAqLwogCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJLmFtdXggPSBUViwKIAkJCS5ncGlvID0gMHgwMDAwMCwJLyogR1AxNj0wIHNlbGVjdHMgRk0gcmFkaW8gYW50ZW5uYSAqLwogCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgxMDAwMCwKKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0VNUFJFU1NdID0gewogCQkvKiAiR2VydCBWZXJ2b29ydCIgPGdlcnQudmVydm9vcnRAcGhpbGlwcy5jb20+ICovCiAJCS5uYW1lCQk9ICJFTVBSRVNTIiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCiAJCQkudm11eCA9IDAsCkBAIC0yNDUsMzMgKzI4Miw0MCBAQAogCQkudmlkZW9fb3V0ID0gQ0NJUjY1NiwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX01PTlNURVJUVl0gPSB7Ci0gICAgICAgICAgICAgICAvKiAiSy5PaHRhIiA8YWxwaGEyOTJAYnJlbWVuLm9yLmpwPiAqLwotICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlNLTmV0IE1vbnN0ZXIgVFYiLAotICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAotICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3JhZGlvLAotICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgfSwKKwkJLyogIksuT2h0YSIgPGFscGhhMjkyQGJyZW1lbi5vci5qcD4gKi8KKwkJLm5hbWUgICAgICAgICAgID0gIlNLTmV0IE1vbnN0ZXIgVFYiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQl9LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfTUQ5NzE3XSA9IHsKIAkJLm5hbWUJCT0gIlRldmlvbiBNRCA5NzE3IiwKIAkJLmF1ZGlvX2Nsb2NrCT0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUJPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLApAQCAtMzAyLDEwICszNDYsMTMgQEAKIAkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX1RWU1RBVElPTl9SRFNdID0gewotICAgICAgICAgICAgICAgIC8qIFR5cGhvb24gVFYgVHVuZXIgUkRTOiBBcnQuTnIuIDUwNjk0ICovCisJCS8qIFR5cGhvb24gVFYgVHVuZXIgUkRTOiBBcnQuTnIuIDUwNjk0ICovCiAJCS5uYW1lCQk9ICJLTkMgT25lIFRWLVN0YXRpb24gUkRTIC8gVHlwaG9vbiBUViBUdW5lciBSRFMiLAogCQkuYXVkaW9fY2xvY2sJPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTMxNCwxMCArMzYxLDEwIEBACiAJCQkudHYgICA9IDEsCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7CisJCQkudm11eCA9IDEsCisJCQkuYW11eCAgID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX0sewogCiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LApAQCAtMzI4LDEwICszNzUsMTAgQEAKIAkJCS5hbXV4ID0gTElORTEsCiAJCX0sewogCi0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9ICJDVmlkIG92ZXIgU1ZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH19LAorCQkJLm5hbWUgPSAiQ1ZpZCBvdmVyIFNWaWQiLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS5uYW1lID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ID0gTElORTIsCkBAIC0zNDEsNiArMzg4LDkgQEAKIAkJLm5hbWUJCT0gIktOQyBPbmUgVFYtU3RhdGlvbiBEVlIiLAogCQkuYXVkaW9fY2xvY2sJPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYJPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5ncGlvbWFzawk9IDB4ODIwMDAwLAogCQkuaW5wdXRzCQk9IHt7CkBAIC0zNjksMzIgKzQxOSwzOCBAQAogCQkudmlkZW9fb3V0CT0gQ0NJUjY1NiwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDBdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDQwMCBUViIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwgLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9fQotICAgICAgICB9LAorCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA0MDAgVFYiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDQsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwgLyogQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvciAqLworCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0KKwl9LAogCVtTQUE3MTM0X0JPQVJEX01ENTA0NF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJNZWRpb24gNTA0NCIsCi0JCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsIC8vIHdhczogMHgwMDIwMDAwMCwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywgLyogd2FzOiAweDAwMjAwMDAwLCAqLwogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCkBAIC00MjYsNTcgKzQ4Miw2NSBAQAogCQl9LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfS1dPUkxEXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiS3dvcmxkL0t1cm91dG9TaGlrb3UgU0FBNzEzMC1UVlBDSSIsCisJCS5uYW1lICAgICAgICAgICA9ICJLd29ybGQvS3Vyb3V0b1NoaWtvdSBTQUE3MTMwLVRWUENJIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgIH0sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS50diAgID0gMSwKKwkJfX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwXSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSA2MDAgVFYiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5uYW1lICAgICAgICAgICA9ICJUZXJyYXRlYyBDaW5lcmd5IDYwMCBUViIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwgLy8gQ1ZpZGVvIG92ZXIgU1ZpZGVvIENvbm5lY3RvcgotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9fSwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsIC8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgKi8KKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKKwl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfTUQ3MTM0XSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIk1lZGlvbiA3MTM0IiwKLQkJLy8uYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKIAkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKIAkJLmlucHV0cyA9IHt7CkBAIC01MDQsNiArNTY4LDkgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIlR5cGhvb24gVFYrUmFkaW8gOTAwMzEiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSAgID0gbmFtZV90diwKQEAgLTUyMywxMSArNTkwLDE0IEBACiAJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKIAkJCS5hbXV4ICAgPSBMSU5FMiwKIAkJfSwKLSAgICAgICAgfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0VMU0FdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiRUxTQSBFWC1WSVNJT04gMzAwVFYiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9ISVRBQ0hJX05UU0MsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCkBAIC01NDIsMTEgKzYxMiwxNCBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS50diAgID0gMSwKIAkJfX0sCi0gICAgICAgIH0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9FTFNBXzUwMFRWXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkVMU0EgRVgtVklTSU9OIDUwMFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfSElUQUNISV9OVFNDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA3LApAQCAtNTYyLDgzICs2MzUsMTAwIEBACiAJCQkuYW11eCA9IExJTkUyLAogCQkJLnR2ICAgPSAxLAogCQl9fSwKLSAgICAgICAgfSwKLQlbU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0XSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTM0IiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAotICAgICAgICAgICAgICAgIC50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA2LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sCiAJfSwKLQlbU0FBNzEzNV9CT0FSRF9BU1VTVGVLX1RWRk03MTM1XSA9IHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiQVNVUyBUVi1GTSA3MTM1IiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAotICAgICAgICAgICAgICAgIC50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwlbU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0XSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFTVVMgVFYtRk0gNzEzNCIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRk0xMjE2TUVfTUszLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA2LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM1XSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFTVVMgVFYtRk0gNzEzNSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDIwMDAwMCwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBUViwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCiAJCQkuZ3BpbyA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHgwMDAwLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNiwKKwkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4MDAwMCwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBUViwKIAkJCS5ncGlvID0gMHgyMDAwMDAsCi0gICAgICAgICAgICAgICAgfSwKKwkJfSwKKwkJLm11dGUgID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuZ3BpbyA9IDB4MDAwMCwKKwkJfSwKKwogCX0sCiAJW1NBQTcxMzRfQk9BUkRfVkExMDAwUE9XRVJdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBT1BFTiBWQTEwMDAgUE9XRVIiLAorCQkubmFtZSAgICAgICAgICAgPSAiQU9QRU4gVkExMDAwIFBPV0VSIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH19LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX19LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfMTBNT09OU1RWTUFTVEVSXSA9IHsKIAkJLyogImxpbGljaGVuZyIgPGxsY0BsaW51eGZhbnMub3JnPiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiMTBNT09OUyBQQ0kgVFYgQ0FQVFVSRSBDQVJEIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfUEFMX05FV19UQVBDLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKQEAgLTY2MiwxNCArNzUyLDE0IEBACiAJCQkuYW11eCA9IExJTkUyLAogCQkJLmdwaW8gPSAweDQwMDAsCiAJCX19LAotICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4MjAwMCwKLSAgICAgICAgICAgICAgICB9LAorCQl9LAogCQkubXV0ZSA9IHsKIAkJCS5uYW1lID0gbmFtZV9tdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKKwkJCS5hbXV4ID0gTElORTIsCiAJCQkuZ3BpbyA9IDB4ODAwMCwKIAkJfSwKIAl9LApAQCAtNjc4LDYgKzc2OCw5IEBACiAJCS5uYW1lCQk9ICJCTUsgTVBFWCBObyBUdW5lciIsCiAJCS5hdWRpb19jbG9jawk9IDB4MjAwMDAwLAogCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSA0LApAQCAtNzA2LDgwICs3OTksOTQgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkNvbXBybyBWaWRlb01hdGUgVFYiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgID0gMSwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSwKLSAgICBbU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTXSA9IHsKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLnR2ICAgPSAxLAorCQl9fSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiQ29tcHJvIFZpZGVvTWF0ZSBUViBHb2xkKyIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDgwMGMwMDAwLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5ncGlvID0gMHgwNmMwMDAxMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuZ3BpbyA9IDB4MGFjMjAwMTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLmdwaW8gPSAweDA4YzIwMDEyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHgwNmMwMDAxMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDBhYzIwMDEyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDhjMjAwMTIsCisJCQkudHYgICA9IDEsCisJCX19LAkJCQkvKiByYWRpbyBhbmQgcHJvYmFibHkgbXV0ZSBpcyBtaXNzaW5nICovCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9DUk9OT1NfUExVU10gPSB7Ci0JCS8qIGdwaW8gcGluczoKLQkJICAgMCAgLi4gMyAgIEJBU0VfSUQKLQkJICAgNCAgLi4gNyAgIFBST1RFQ1RfSUQKLQkJICAgOCAgLi4gMTEgIFVTRVJfT1VUCi0JCSAgIDEyIC4uIDEzICBVU0VSX0lOCi0JCSAgIDE0IC4uIDE1ICBWSURJTl9TRUwgKi8KKwkJLyoKKwkJZ3BpbyBwaW5zOgorCQkJMCAgLi4gMyAgIEJBU0VfSUQKKwkJCTQgIC4uIDcgICBQUk9URUNUX0lECisJCQk4ICAuLiAxMSAgVVNFUl9PVVQKKwkJCTEyIC4uIDEzICBVU0VSX0lOCisJCQkxNCAuLiAxNSAgVklESU5fU0VMCisJCSovCiAJCS5uYW1lICAgICAgICAgICA9ICJNYXRyb3ggQ3Jvbm9zUGx1cyIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweGNmMDAsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKIAkJCS5ncGlvID0gMiA8PCAxNCwKIAkJfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDAsCiAJCQkuZ3BpbyA9IDEgPDwgMTQsCiAJCX0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAorCQkJLm5hbWUgPSBuYW1lX2NvbXAzLAorCQkJLnZtdXggPSAwLAogCQkJLmdwaW8gPSAwIDw8IDE0LAogCQl9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKKwkJCS5uYW1lID0gbmFtZV9jb21wNCwKKwkJCS52bXV4ID0gMCwKIAkJCS5ncGlvID0gMyA8PCAxNCwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAogCQkJLnZtdXggPSA4LAogCQkJLmdwaW8gPSAyIDw8IDE0LAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCQl9fSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX01EMjgxOV0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVyTWVkaWEgTTE1NiAvIE1lZGlvbiAyODE5IiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LApAQCAtODA5LDYgKzkxNiw5IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJCTUsgTVBFWCBUdW5lciIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAxLApAQCAtODI1LDYyICs5MzUsNzIgQEAKIAkJfX0sCiAJCS5tcGVnICAgICAgPSBTQUE3MTM0X01QRUdfRU1QUkVTUywKIAkJLnZpZGVvX291dCA9IENDSVI2NTYsCi0gICAgICAgIH0sCi0gICAgICAgIFtTQUE3MTM0X0JPQVJEX0FTVVNURUtfVFZGTTcxMzNdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJBU1VTIFRWLUZNIDcxMzMiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0JCS8vIHByb2JhYmx5IHdyb25nLCB0aGUgNzEzMyBvbmUgaXMgdGhlIE5UU0MgdmVyc2lvbiAuLi4KLQkJLy8gLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyMzZfTUszCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfTlRTQ19ORVdfVEFQQywKLSAgICAgICAgICAgICAgICAudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9BU1VTVEVLX1RWRk03MTMzXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFTVVMgVFYtRk0gNzEzMyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS8qIHByb2JhYmx5IHdyb25nLCB0aGUgNzEzMyBvbmUgaXMgdGhlIE5UU0MgdmVyc2lvbiAuLi4KKwkJKiAudHVuZXJfdHlwZSAgPSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMgKi8KKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfTlRTQ19ORVdfVEFQQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCiAJCX0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICAgICAgICAgIC5yYWRpbyA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gNCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNiwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUxLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl9TVEVSRU9dID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIFN0ZXJlbyAoc2FhNzEzNCkiLAotICAgICAgICAgICAgICAgIC5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCi0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTVQyMDMyLAotICAgICAgICAgICAgICAgIC50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfSU5URVJDQVJSSUVSLAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgfSwKKwkJLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgU3RlcmVvIChzYWE3MTM0KSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX01UMjAzMiwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X0lOVEVSQ0FSUklFUiwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUyLAorCQl9fSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX01BTkxJX01UVjAwMl0gPSB7CiAJCS8qIE9nbmplbiBOYXN0aWMgPG9nbmplbkBsb2dvc29mdC5iYT4gKi8KLQkJLm5hbWUgICAgICAgICAgID0gIk1hbmxpIE11Y2hUViBNLVRWMDAyIiwKKwkJLm5hbWUgICAgICAgICAgID0gIk1hbmxpIE11Y2hUViBNLVRWMDAyL0JlaG9sZCBUViA0MDMgRk0iLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gOCwKQEAgLTg5OSwxNiArMTAxOSwxNSBAQAogCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJLmFtdXggPSBMSU5FMiwKIAkJfSwKLQkJLm11dGUgPSB7Ci0JCQkubmFtZSA9IG5hbWVfbXV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0JCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDFdID0gewogCQkvKiBPZ25qZW4gTmFzdGljIDxvZ25qZW5AbG9nb3NvZnQuYmE+IFVOVEVTVEVEICovCi0JCS5uYW1lICAgICAgICAgICA9ICJNYW5saSBNdWNoVFYgTS1UVjAwMSIsCisJCS5uYW1lICAgICAgICAgICA9ICJNYW5saSBNdWNoVFYgTS1UVjAwMS9CZWhvbGQgVFYgNDAxIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCiAJCQkudm11eCA9IDgsCkBAIC05MjMsMTIgKzEwNDIsMTkgQEAKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkudHYgICA9IDEsCiAJCX19LAotICAgICAgICB9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX1RHMzAwMFRWXSA9IHsKIAkJLyogVHJhbnNHZWFyIDMwMDBUViAqLwogCQkubmFtZSAgICAgICAgICAgPSAiTmFnYXNlIFNhbmd5byBUcmFuc0dlYXIgMzAwMFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19OVFNDX00sCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKQEAgLTk0NCw4MSArMTA3MCw5MCBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJfX0sCiAJfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIkVsaXRlZ3JvdXAgRUNTIFRWUDNYUCBGTTEyMTYgVHVuZXIgQ2FyZChQQUwtQkcsRk0pICIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsICAvLyB4dGFsIDMyLjEgTUh6Ci0gICAgICAgICAgICAgICAgLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2X21vbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUxLAorCVtTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBdID0geworCQkubmFtZSAgICAgICAgICAgPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTIxNiBUdW5lciBDYXJkKFBBTC1CRyxGTSkgIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsICAvKiB4dGFsIDMyLjEgTUh6ICovCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSAgID0gbmFtZV90diwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IFRWLAorCQkJLnR2ICAgICA9IDEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfdHZfbW9ubywKKwkJCS52bXV4ICAgPSAxLAorCQkJLmFtdXggICA9IExJTkUyLAorCQkJLnR2ICAgICA9IDEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfY29tcDEsCisJCQkudm11eCAgID0gMywKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gOCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfSx7CiAJCQkubmFtZSAgID0gIkNWaWQgb3ZlciBTVmlkIiwKIAkJCS52bXV4ICAgPSAwLAogCQkJLmFtdXggICA9IExJTkUxLAogCQl9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjVdID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJFbGl0ZWdyb3VwIEVDUyBUVlAzWFAgRk0xMjM2IFR1bmVyIENhcmQgKE5UU0MsRk0pIiwKLSAgICAgICAgICAgICAgICAuYXVkaW9fY2xvY2sgICAgPSAweDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0MsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2LAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggICA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICAgID0gMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3R2X21vbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIC50diAgICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lICAgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ICAgPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggICA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9ICJDVmlkIG92ZXIgU1ZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCAgID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9fSwKLSAgICAgICAgICAgICAgICAucmFkaW8gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSAgID0gbmFtZV9yYWRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ICAgPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICB9LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJFbGl0ZWdyb3VwIEVDUyBUVlAzWFAgRk0xMjM2IFR1bmVyIENhcmQgKE5UU0MsRk0pIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3R2X21vbm8sCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9ICJDVmlkIG92ZXIgU1ZpZCIsCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IExJTkUyLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWXSA9IHsKIAkJLyogUm9tYW4gUHN6b25jemVua28gPHJvbWthQGtvbG9zLm1hdGgudW5pLmxvZHoucGw+ICovCiAJCS5uYW1lICAgICAgICAgICA9ICJBVkFDUyBTbWFydFRWIiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUwsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gVFYsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7CisJCX0sewogCQkJLm5hbWUgPSBuYW1lX3R2X21vbm8sCiAJCQkudm11eCA9IDEsCiAJCQkuYW11eCA9IExJTkUyLApAQCAtMTA0Nyw2ICsxMTgyLDkgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIkFWZXJNZWRpYSBEVkQgRVpNYWtlciIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0FCU0VOVCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAzLApAQCAtMTA1NSwzMCArMTE5MywzNSBAQAogCQkJLnZtdXggPSA4LAogCQl9fSwKIAl9LAotICAgICAgICBbU0FBNzEzNF9CT0FSRF9OT1ZBQ19QUklNRVRWNzEzM10gPSB7Ci0gICAgICAgICAgICAgICAgLyogdG9zaGlpQG5ldGJzZC5vcmcgKi8KLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSAiTm92YWwgUHJpbWUgVFYgNzEzMyIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkgxX05UU0MsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCVtTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzXSA9IHsKKwkJLyogdG9zaGlpQG5ldGJzZC5vcmcgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIk5vdmFsIFByaW1lIFRWIDcxMzMiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkgxX05UU0MsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDVdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiQXZlck1lZGlhIEF2ZXJUViBTdHVkaW8gMzA1IiwKIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKIAkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19GTTEyNTZfSUgzLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKLQkJLmdwaW9tYXNrID0gMHgzLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAxLApAQCAtMTA5OCwzNSArMTI0MSw0MSBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJfX0sCiAJCS5yYWRpbyA9IHsKLQkJCSAubmFtZSA9IG5hbWVfcmFkaW8sCi0JCQkgLmFtdXggPSBMSU5FMiwKLQkJIH0sCisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUyLAorCQl9LAogCQkubXV0ZSA9IHsKLQkJCSAubmFtZSA9IG5hbWVfbXV0ZSwKLQkJCSAuYW11eCA9IExJTkUxLAorCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IExJTkUxLAogCQl9LAogCX0sCi0gIAlbU0FBNzEzM19CT0FSRF9VUE1PU1RfUFVSUExFX1RWXSA9IHsKLSAgCQkubmFtZSAgICAgICAgICAgPSAiVVBNT1NUIFBVUlBMRSBUViIsCi0gIAkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMsCi0gIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotICAJCS5pbnB1dHMgICAgICAgICA9IHt7Ci0gIAkJCS5uYW1lID0gbmFtZV90diwKLSAgCQkJLnZtdXggPSA3LAotICAJCQkuYW11eCA9IFRWLAotICAJCQkudHYgICA9IDEsCi0gIAkJfSx7Ci0gIAkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCi0gIAkJCS52bXV4ID0gNywKLSAgCQkJLmFtdXggPSBMSU5FMSwKLSAgCQl9fSwKKwlbU0FBNzEzNF9CT0FSRF9VUE1PU1RfUFVSUExFX1RWXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlVQTU9TVCBQVVJQTEUgVFYiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIzNl9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSA3LAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA3LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9JVEVNU19NVFYwMDVdID0gewogCQkvKiBOb3JtYW4gSm9uYXMgPG5vcm1hbmpvbmFzQGFyY29yLmRlPiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiSXRlbXMgTXVjaFRWIFBsdXMgLyBJVC0wMDUiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX3R2LAogCQkJLnZtdXggPSAzLApAQCAtMTE1MCwyNyArMTI5OSwzMCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiVGVycmF0ZWMgQ2luZXJneSAyMDAgVFYiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMjAwMDAwLAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgIAkJCS5uYW1lID0gbmFtZV90diwKKwkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDIsIC8vIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsIC8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgKi8KKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX19LAogCQkubXV0ZSA9IHsKLQkJCSAubmFtZSA9IG5hbWVfbXV0ZSwKLQkJCSAuYW11eCA9IExJTkUyLAorCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IExJTkUyLAogCQl9LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX1BWUl0gPSB7CkBAIC0xMTc4LDg0ICsxMzMwLDk2IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJDb21wcm8gVmlkZW9NYXRlIFRWIFBWUi9GTSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQ19NLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5ncGlvbWFzawk9IDB4ODA4YzAwODAsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTEsCiAJCQkuZ3BpbyA9IDB4MDAwODAsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCiAJCQkuZ3BpbyA9IDB4MDAwODAsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyX0xFRlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMl9MRUZULAorCQkJLnR2ICAgPSAxLAogCQkJLmdwaW8gPSAweDAwMDgwLAotICAgICAgICAgICAgICAgIH19LAorCQl9fSwKIAkJLnJhZGlvID0gewogCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg4MDAwMCwKLQkJIH0sCisJCX0sCiAJCS5tdXRlID0gewogCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAorCQkJLmFtdXggPSBMSU5FMiwKIAkJCS5ncGlvID0gMHg0MDAwMCwKIAkJfSwKLSAgICAgICAgfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNXSA9IHsKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTV0gPSB7CiAJCS8qIE1pY2hhZWwgUm9kcmlndWV6LVRvcnJlbnQgPG1ydG9ycmVudEBhc3UuZWR1PiAqLwotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJTYWJyZW50IFNCVC1UVkZNIChzYWE3MTMwKSIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworCQkubmFtZSAgICAgICAgICAgPSAiU2FicmVudCBTQlQtVFZGTSAoc2FhNzEzMCkiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX05UU0NfTSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAogCQkJLnZtdXggPSAxLAogCQkJLmFtdXggPSBMSU5FMiwKIAkJfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTIsCi0gICAgICAgICAgICAgICAgfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgICA9IG5hbWVfcmFkaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCAgID0gTElORTIsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX1pPTElEX1hQRVJUX1RWNzEzNF0gPSB7CiAJCS8qIEhlbGdlIEplbnNlbiA8aGVsZ2UuamVuc2VuQHNsb2cuZGs+ICovCi0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIjpab2xpZCBYcGVydCBUVjcxMzQiLAorCQkubmFtZSAgICAgICAgICAgPSAiOlpvbGlkIFhwZXJ0IFRWNzEzNCIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKLSAgICAgICAgICAgICAgICAuaW5wdXRzICAgICAgICAgPSB7eworCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA4LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9jb21wMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH19LAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkudHYgICA9IDEsCisJCX19LAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfRU1QSVJFX1BDSV9UVl9SQURJT19MRV0gPSB7CiAJCS8qICJNYXR0ZW8gQXoiIDxtYXR0ZS5hekBub3NwYW0ubGliZXJvLml0PiA7LSkgKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkVtcGlyZSBQQ0kgVFYtUmFkaW8gTEUiLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDQwMDAsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKQEAgLTEyNzQsMTggKzE0MzgsMTggQEAKIAkJCS5hbXV4ID0gTElORTEsCiAJCQkuZ3BpbyA9IDB4ODAwMCwKIAkJfX0sCi0gICAgICAgICAgICAgICAgLnJhZGlvID0gewotCQkJIC5uYW1lID0gbmFtZV9yYWRpbywKLQkJCSAuYW11eCA9IExJTkUxLAotCQkJIC5ncGlvID0gMHg4MDAwLAotCQkgfSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJCS5ncGlvID0gMHg4MDAwLAorCQl9LAogCQkubXV0ZSA9IHsKLQkJCSAubmFtZSA9IG5hbWVfbXV0ZSwKLQkJCSAuYW11eCA9IFRWLAotCQkJIC5ncGlvID0weDgwMDAsCi0JCSB9CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9MHg4MDAwLAorCQl9CiAJfSwKLSAgICAgICAgW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwN10gPSB7CisJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDddID0gewogCQkvKgogCQlOaWNrb2xheSBWLiBTaG15cmV2IDxuc2hteXJldkB5YW5kZXgucnU+CiAJCUxvdHMgb2YgdGhhbmtzIHRvIEFuZHJleSBab2xvdGFyZXYgPHpvbG90YXJldl9hbmRyZXlAbWFpbC5ydT4KQEAgLTEyOTMsNiArMTQ1Nyw5IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVybWVkaWEgQVZlclRWIFN0dWRpbyAzMDciLAogCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuZ3Bpb21hc2sgICAgICAgPSAweDAzLAogCQkuaW5wdXRzICAgICAgICAgPSB7ewpAQCAtMTMyMiwxNiArMTQ4OSw2MSBAQAogCQkJLmFtdXggPSBMSU5FMSwKIAkJCS5ncGlvID0gMHgwMSwKIAkJfSwKLSAgICAgICAgfSwKLQlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVU10gPSB7Ci0JCS8qIEpvbiBXZXN0Z2F0ZSA8b3J5bkBvcnluLmZzY2sudHY+ICovCi0JCS5uYW1lICAgICAgICAgICA9ICJBVmVyTWVkaWEgQ2FyZGJ1cyBUVi9SYWRpbyIsCi0JCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCi0JCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMLAorCQkubXV0ZSAgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDAsCisJCX0sCisJfSwKKwlbU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfR09fMDA3X0ZNXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkF2ZXJtZWRpYSBBVmVyVFYgR08gMDA3IEZNIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5ncGlvbWFzayAgICAgICA9IDB4MDAzMDAwMDMsCisJCS8qIC5ncGlvbWFzayAgICAgICA9IDB4OGMyNDAwMDMsICovCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQkJLmdwaW8gPSAweDAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKIAkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gNiwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MDIsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkuYW11eCA9IExJTkUxLAorCQkJLmdwaW8gPSAweDAwMzAwMDAxLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMSwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTXSA9IHsKKwkJLyogS2Vlcy5CbG9tQGN3aS5ubCAqLworCQkubmFtZSAgICAgICAgICAgPSAiQVZlck1lZGlhIENhcmRidXMgVFYvUmFkaW8gKEU1MDApIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKIAkJCS50diAgID0gMSwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDEsCkBAIC0xMzQwLDEwICsxNTUyLDEwIEBACiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKIAkJCS52bXV4ID0gOCwKLQkJCS5hbXV4ID0gTElORTIsCisJCQkuYW11eCA9IExJTkUxLAogCQl9fSwKIAkJLnJhZGlvID0gewotICAgICAgICAgICAgICAgIAkubmFtZSA9IG5hbWVfcmFkaW8sCisJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUxLAogCQl9LAogCX0sCkBAIC0xMzUxLDExOSArMTU2MywxMzQgQEAKIAkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNDAwIG1vYmlsZSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MTg3ZGU3LAogCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9BTFBTX1RTQkU1X1BBTCwKLSAgCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewotICAgICAgIAkJCS5uYW1lID0gbmFtZV90diwKKwkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gVFYsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICB9LHsKKwkJfSx7CiAJCQkubmFtZSA9IG5hbWVfdHZfbW9ubywKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gTElORTIsCiAJCQkudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKIAkJfX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LM10gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIE1LMyIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLm5hbWUgICAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgNjAwIFRWIE1LMyIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCi0gIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotICAgICAgICAgICAgICAgIC5pbnB1dHMgICAgICAgICA9IHt7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfdHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IFRWLAotICAgICAgICAgICAgICAgICAgICAgICAgLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMSwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLCAvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUxLAotICAgICAgICAgICAgICAgIH19LAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSA0LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsIC8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgKi8KKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCX19LAogCQkucmFkaW8gPSB7CiAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCiAJCQkuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAJW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX0dPTERfUExVU10gPSB7Ci0gCQkvKiBEeWxhbiBXYWxrZGVuIDxkeWxhbl93YWxrZGVuQGhvdG1haWwuY29tPiAqLwotIAkJLm5hbWUJCT0gIkNvbXBybyBWaWRlb01hdGUgR29sZCsgUGFsIiwKLSAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCi0gCQkudHVuZXJfdHlwZQk9IFRVTkVSX1BISUxJUFNfUEFMLAotIAkJLmdwaW9tYXNrCT0gMHgxY2U3ODAsCi0gCQkuaW5wdXRzCQk9IHt7Ci0gCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKLSAJCQkudm11eCA9IDAsCQkvLyBDVmlkZW8gb3ZlciBTVmlkZW8gQ29ubmVjdG9yIC0gb2s/Ci0gCQkJLmFtdXggPSBMSU5FMSwKLSAJCQkuZ3BpbyA9IDB4MDA4MDgwLAotIAkJfSx7Ci0gCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAotIAkJCS52bXV4ID0gMywKLSAJCQkuYW11eCA9IExJTkUxLAotIAkJCS5ncGlvID0gMHgwMDgwODAsCi0gCQl9LHsKLSAJCQkubmFtZSA9IG5hbWVfdHYsCi0gCQkJLnZtdXggPSAxLAotIAkJCS5hbXV4ID0gVFYsCi0gCQkJLnR2ICAgPSAxLAotIAkJCS5ncGlvID0gMHgwMDgwODAsCi0gCQl9fSwKLSAJCS5yYWRpbyA9IHsKLSAJCQkubmFtZSA9IG5hbWVfcmFkaW8sCi0gCQkJLmFtdXggPSBMSU5FMiwKLSAJCQkuZ3BpbyA9IDB4ODAwMDAsCi0gCQl9LAotIAkJLm11dGUgPSB7Ci0gCQkJLm5hbWUgPSBuYW1lX211dGUsCi0gCQkJLmFtdXggPSBMSU5FMiwKLSAJCQkuZ3BpbyA9IDB4MGM4MDAwLAotIAkJfSwKLSAJfSwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9HT0xEX1BMVVNdID0geworCQkvKiBEeWxhbiBXYWxrZGVuIDxkeWxhbl93YWxrZGVuQGhvdG1haWwuY29tPiAqLworCQkubmFtZQkJPSAiQ29tcHJvIFZpZGVvTWF0ZSBHb2xkKyBQYWwiLAorCQkuYXVkaW9fY2xvY2sJPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX1BBTCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sJPSAweDFjZTc4MCwKKwkJLmlucHV0cwkJPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gMCwJCS8qIENWaWRlbyBvdmVyIFNWaWRlbyBDb25uZWN0b3IgLSBvaz8gKi8KKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDA4MDgwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4MDA4MDgwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCQkuZ3BpbyA9IDB4MDA4MDgwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHg4MDAwMCwKKwkJfSwKKwkJLm11dGUgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MGM4MDAwLAorCQl9LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfUElOTkFDTEVfMzAwSV9EVkJUX1BBTF0gPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlBpbm5hY2xlIFBDVFYgMzAwaSBEVkItVCArIFBBTCIsCi0gICAgICAgICAgICAgICAgLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKLSAgICAgICAgICAgICAgICAudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCi0gICAgICAgICAgICAgICAgLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCisJCS5uYW1lICAgICAgICAgICA9ICJQaW5uYWNsZSBQQ1RWIDMwMGkgRFZCLVQgKyBQQUwiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9NVDIwMzIsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19JTlRFUkNBUlJJRVIsCiAJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCi0gICAgICAgICAgICAgICAgLmlucHV0cyAgICAgICAgID0ge3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV90diwKLSAgICAgICAgICAgICAgICAgICAgICAgIC52bXV4ID0gMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hbXV4ID0gVFYsCi0gICAgICAgICAgICAgICAgICAgICAgICAudHYgICA9IDEsCi0gICAgICAgICAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAubmFtZSA9IG5hbWVfY29tcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH0sewotICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUgPSBuYW1lX2NvbXAyLAotICAgICAgICAgICAgICAgICAgICAgICAgLnZtdXggPSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgLmFtdXggPSBMSU5FMiwKLSAgICAgICAgICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lID0gbmFtZV9zdmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAudm11eCA9IDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAuYW11eCA9IExJTkUyLAotICAgICAgICAgICAgICAgIH19LAotICAgICAgICB9LAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAzLAorCQkJLmFtdXggPSBUViwKKwkJCS50diAgID0gMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDEsCisJCQkudm11eCA9IDAsCisJCQkuYW11eCA9IExJTkUyLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMiwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCX0sCiAJW1NBQTcxMzRfQk9BUkRfUFJPVklERU9fUFY5NTJdID0gewogCQkvKiBhbmRyZWFzLmtyZXRzY2htZXJAd2ViLmRlICovCiAJCS5uYW1lCQk9ICJQcm9WaWRlbyBQVjk1MiIsCiAJCS5hdWRpb19jbG9jawk9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlCT0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAogCQkuaW5wdXRzICAgICAgICAgPSB7ewogCQkJLm5hbWUgPSBuYW1lX2NvbXAxLApAQCAtMTQ4NywxMiArMTcxNCwxNCBAQAogCX0sCiAJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNV0gPSB7CiAJCS8qIG11Y2ggbGlrZSB0aGUgInN0dWRpbyIgdmVyc2lvbiBidXQgd2l0aG91dCByYWRpbwotCQkgKiBhbmQgYW5vdGhlciB0dW5lciAoc2lyc3Bpcml0dXNAeWFuZGV4LnJ1KSAqLworCQkqIGFuZCBhbm90aGVyIHR1bmVyIChzaXJzcGlyaXR1c0B5YW5kZXgucnUpICovCiAJCS5uYW1lICAgICAgICAgICA9ICJBdmVyTWVkaWEgQXZlclRWLzMwNSIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfRlExMjE2TUUsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKIAkJLnRkYTk4ODdfY29uZiAgID0gVERBOTg4N19QUkVTRU5ULAotCQkuZ3Bpb21hc2sgPSAweDMsCiAJCS5pbnB1dHMgICAgICAgICA9IHt7CiAJCQkubmFtZSA9IG5hbWVfdHYsCiAJCQkudm11eCA9IDEsCkBAIC0xNTEyLDQxICsxNzQxLDI2OSBAQAogCQkJLmFtdXggPSBMSU5FMiwKIAkJfX0sCiAJCS5tdXRlID0gewotCQkJIC5uYW1lID0gbmFtZV9tdXRlLAotCQkJIC5hbXV4ID0gTElORTEsCisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gTElORTEsCiAJCX0sCiAJfSwKIAlbU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPXSA9IHsKIAkJLyogTGlmZVZpZXcgRmx5RFZCLVQgRFVPICovCi0JCS8qICJOaWNvIFNhYmJpIDxuc2FiYmlAdGlzY2FsaS5pdD4gKi8KKwkJLyogIk5pY28gU2FiYmkgPG5zYWJiaUB0aXNjYWxpLml0PiAgSGFydG11dCBIYWNrbWFubiBoYXJ0bXV0LmhhY2ttYW5uQHQtb25saW5lLmRlKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkxpZmVWaWV3IEZseURWQi1UIERVTyIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKLS8vCQkuZ3Bpb21hc2sgICAgICAgPSAweGUwMDAsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLm1wZWcgICAgICAgICAgID0gU0FBNzEzNF9NUEVHX0RWQiwKIAkJLmlucHV0cyAgICAgICAgID0ge3sKIAkJCS5uYW1lID0gbmFtZV90diwKIAkJCS52bXV4ID0gMSwKIAkJCS5hbXV4ID0gVFYsCi0vLwkJCS5ncGlvID0gMHgwMDAwLAogCQkJLnR2ICAgPSAxLAotICAgICAgICAgICAgICAgIH0seworCQl9LHsKIAkJCS5uYW1lID0gbmFtZV9jb21wMSwJLyogQ29tcG9zaXRlIHNpZ25hbCBvbiBTLVZpZGVvIGlucHV0ICovCiAJCQkudm11eCA9IDAsCiAJCQkuYW11eCA9IExJTkUyLAotLy8JCQkuZ3BpbyA9IDB4NDAwMCwKIAkJfSx7CiAJCQkubmFtZSA9IG5hbWVfY29tcDIsCS8qIENvbXBvc2l0ZSBpbnB1dCAqLwogCQkJLnZtdXggPSAzLAogCQkJLmFtdXggPSBMSU5FMiwKLS8vCQkJLmdwaW8gPSAweDQwMDAsCiAJCX0sewogCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywJLyogUy1WaWRlbyBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLwogCQkJLnZtdXggPSA4LAogCQkJLmFtdXggPSBMSU5FMiwKLS8vCQkJLmdwaW8gPSAweDQwMDAsCiAJCX19LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJQaGlsaXBzIFRPVUdIIERWQi1UIHJlZmVyZW5jZSBkZXNpZ24iLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX0FCU0VOVCwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkubXBlZyAgICAgICAgICAgPSBTQUE3MTM0X01QRUdfRFZCLAorCQkuaW5wdXRzID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDAsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCisJCX19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwN10gPSB7CisJCS8qCisJCURhdnlkb3YgVmxhZGltaXIgPHZsYWRpbWlyQGlxbWVkaWEuY29tPgorCQkqLworCQkubmFtZSAgICAgICAgICAgPSAiQXZlcm1lZGlhIEFWZXJUViAzMDciLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZRMTIxNk1FLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS50ZGE5ODg3X2NvbmYgICA9IFREQTk4ODdfUFJFU0VOVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCA9IDgsCisJCQkuYW11eCA9IExJTkUxLAorCQl9fSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkFEUyBUZWNoIEluc3RhbnQgVFYgKHNhYTcxMzUpIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCX19LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlRdID0geworCQkubmFtZSAgICAgICAgICAgPSAiS3dvcmxkL1RldmlvbiBWLVN0cmVhbSBYcGVydCBUViBQVlI3MTM0IiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19QQUxfSSwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkuZ3Bpb21hc2sJPSAweDA3MDAsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQkJLmdwaW8gICA9IDB4MDAwLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHgyMDAsCQkvKiBncGlvIGJ5IERTY2FsZXIgKi8KKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDIwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MTAwLAorCQl9LAorCQkubXV0ZSAgPSB7CisJCQkubmFtZSA9IG5hbWVfbXV0ZSwKKwkJCS5hbXV4ID0gVFYsCisJCQkuZ3BpbyA9IDB4MDAwLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfVEhZUEhPT05fRFZCVF9EVU9fQ0FSREJVU10gPSB7CisJCS5uYW1lCQk9ICJUeXBob29uIERWQi1UIER1byBEaWdpdGFsL0FuYWxvZyBDYXJkYnVzIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDIwMDAwMCwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS8qIC5ncGlvbWFzayAgICAgICA9IDB4ZTAwMCwgKi8KKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCS8qCS5ncGlvID0gMHgwMDAwLCAgICAgICovCisJCQkudHYgICA9IDEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAxLAkvKiBDb21wb3NpdGUgc2lnbmFsIG9uIFMtVmlkZW8gaW5wdXQgKi8KKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCS8qCS5ncGlvID0gMHg0MDAwLCAgICAgICovCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAkvKiBDb21wb3NpdGUgaW5wdXQgKi8KKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTIsCisJCS8qCS5ncGlvID0gMHg0MDAwLCAgICAgICovCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywJLyogUy1WaWRlbyBzaWduYWwgb24gUy1WaWRlbyBpbnB1dCAqLworCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMiwKKwkJLyoJLmdwaW8gPSAweDQwMDAsICAgICAgKi8KKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IExJTkUxLAorCQl9LAorCX0sCisJW1NBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVU0lJXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIkNvbXBybyBWaWRlb01hdGUgVFYgR29sZCtJSSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9MR19QQUxfTkVXX1RBUEMsCisJCS5yYWRpb190eXBlICAgICA9IFRVTkVSX1RFQTU3NjcsCisJCS50dW5lcl9hZGRyICAgICA9IDB4NjMsCisJCS5yYWRpb19hZGRyICAgICA9IDB4NjAsCisJCS5ncGlvbWFzayAgICAgICA9IDB4OGMxODgwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4ODAwODAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCQkuZ3BpbyA9IDB4ODAxMDAwLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90diwKKwkJCS52bXV4ID0gMSwKKwkJCS5hbXV4ID0gVFYsCisJCQkudHYgICA9IDEsCisJCQkuZ3BpbyA9IDB4ODAwMDAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLm5hbWUgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHg4ODAwMDAsCisJCX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDg0MDAwMCwKKwkJfSwKKwl9LAorCVtTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVF0gPSB7CisJCS8qCisJCUZJWE1FOgorCQktIFJlbW90ZSBjb250cm9sIGRvZXNuJ3QgaW5pdGlhbGl6ZSBwcm9wZXJseS4KKwkJLSBBdWRpbyB2b2x1bWUgc3RhcnRzIG11dGVkLAorCQl0aGVuIGdyYWR1YWxseSBpbmNyZWFzZXMgYWZ0ZXIgY2hhbm5lbCBjaGFuZ2UuCisJCS0gT3ZlcmxheSBzY2FsaW5nIHByb2JsZW1zIChhcHBsaWNhdGlvbiBlcnJvcj8pCisJCS0gQ29tcG9zaXRlIFMtVmlkZW8gdW50ZXN0ZWQuCisJCUZyb206IEtvbnJhZCBSemVwZWNraSA8aGFubmliYWxAbWVnYXBvbGlzLnBsPgorCQkqLworCQkubmFtZSAgICAgICAgICAgPSAiS3dvcmxkIFhwZXJ0IFRWIFBWUjcxMzQiLAorCQkuYXVkaW9fY2xvY2sgICAgPSAweDAwMTg3ZGU3LAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU5BXzk1MzNfREksCisJCS5yYWRpb190eXBlICAgICA9IFRVTkVSX1RFQTU3NjcsCisJCS50dW5lcl9hZGRyCT0gMHg2MSwKKwkJLnJhZGlvX2FkZHIJPSAweDYwLAorCQkuZ3Bpb21hc2sJPSAweDA3MDAsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQkJLmdwaW8gICA9IDB4MDAwLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCQkuZ3BpbyAgID0gMHgyMDAsCQkvKiBncGlvIGJ5IERTY2FsZXIgKi8KKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9zdmlkZW8sCisJCQkudm11eCAgID0gMCwKKwkJCS5hbXV4ICAgPSBMSU5FMSwKKwkJCS5ncGlvICAgPSAweDIwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lICAgPSBuYW1lX3JhZGlvLAorCQkJLmFtdXggICA9IExJTkUxLAorCQkJLmdwaW8gICA9IDB4MTAwLAorCQl9LAorCQkubXV0ZSA9IHsKKwkJCS5uYW1lID0gbmFtZV9tdXRlLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHgwMDAsCisJCX0sCisJfSwKIH07CisKKwogY29uc3QgdW5zaWduZWQgaW50IHNhYTcxMzRfYmNvdW50ID0gQVJSQVlfU0laRShzYWE3MTM0X2JvYXJkcyk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTU1OSwxMyArMjAxNiwxMyBAQAogCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuc3ViZGV2aWNlICAgID0gMHgyMDAxLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9URVVTX1BSTywKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLnN1YmRldmljZSAgICA9IDB4MjAwMSwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUFJPVEVVU19QUk8sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCkBAIC0xNTc0LDcwICsyMDMxLDcwIEBACiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMTMxLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRlODUsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDExMzEsCisJCS5zdWJkZXZpY2UgICAgPSAweDRlODUsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX01PTlNURVJUViwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMTQyLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDAsCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MTE0MywKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNTNCLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDExNTgsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzMsCi0gICAgICAgIH0seworCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE1M0IsCisJCS5zdWJkZXZpY2UgICAgPSAweDExNDIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDAsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKKwkJLnN1YmRldmljZSAgICA9IDB4MTE0MywKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMCwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxNTNCLAorCQkuc3ViZGV2aWNlICAgID0gMHgxMTU4LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LMywKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHgxNTNiLAogCQkuc3ViZGV2aWNlICAgID0gMHgxMTYyLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9DSU5FUkdZNDAwX0NBUkRCVVMsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDUxNjgsCiAJCS5zdWJkZXZpY2UgICAgPSAweDAxMzgsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMCwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDRlNDIsCQkJCS8vIlR5cGhvb24gUENJIENhcHR1cmUgVFYgQ2FyZCIgQXJ0Lk5vLiA1MDY3MwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDAxMzgsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLAotICAgICAgICB9LHsKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHg0ZTQyLAkJCQkvKiAiVHlwaG9vbiBQQ0kgQ2FwdHVyZSBUViBDYXJkIiBBcnQuTm8uIDUwNjczICovCisJCS5zdWJkZXZpY2UgICAgPSAweDAxMzgsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMCwKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAogCQkuc3ViZGV2aWNlICAgID0gMHgwMTM4LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDAsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzUsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKIAkJLnN1YmRldmljZSAgICA9IDB4MDIxMiwgLyogbWluaXBjaSwgTFIyMTIgKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAkvKiBBbmltYXRpb24gVGVjaG5vbG9naWVzIChMaWZlVmlldykgKi8KIAkJLnN1YmRldmljZSAgICA9IDB4MDIxNCwgLyogU3RhbmRhcmQgUENJLCBMUjIxNFdGICovCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0ZMWVRWUExBVElOVU1fRk0sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDE0ODksIC8qIEtZRSAqLwogCQkuc3ViZGV2aWNlICAgID0gMHgwMjE0LCAvKiBHZW5pdXMgVmlkZW9Xb25kZXIgUHJvVFYgKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSwgLyogaXMgYW4gTFIyMTRXRiBhY3R1YWxseSAqLwotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAogCQkuc3VidmVuZG9yICAgID0gMHgxNmJlLApAQCAtMTY1NiwzNiArMjExMywzNiBAQAogCQkuc3ViZGV2aWNlICAgID0gMHgyMjZiLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9FTFNBXzUwMFRWLAogCX0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NDg0MiwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAorCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX0FTVVNURUssCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4NDIsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzQsCiAJfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQ1LAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzUsCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg0NSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNSwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4MzAsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0ODQzLAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FTVVNURUtfVFZGTTcxMzMsCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDgzMCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDQ4NDAsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19UVkZNNzEzNCwKLSAgICAgICAgfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQVNVU1RFSywKKwkJLnN1YmRldmljZSAgICA9IDB4NDg0MywKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RFS19UVkZNNzEzMywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9BU1VTVEVLLAorCQkuc3ViZGV2aWNlICAgID0gMHg0ODQwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM0LAorCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCiAJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCkBAIC0xNzA2LDEyNCArMjE2MywxMzAgQEAKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExMzEsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4NzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKKwkJLnN1YmRldmljZSAgICA9IDB4NzEzMywKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVkExMDAwUE9XRVIsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgyMDAxLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuc3ViZGV2aWNlICAgID0gMHgyMDAxLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF8xME1PT05TVFZNQVNURVIsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTg1YiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhjMTAwLAorCQkuc3VidmVuZG9yICAgID0gMHgxODViLAorCQkuc3ViZGV2aWNlICAgID0gMHhjMTAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFYsCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTg1YiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhjMTAwLAorCQkuc3VidmVuZG9yICAgID0gMHgxODViLAorCQkuc3ViZGV2aWNlICAgID0gMHhjMTAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfR09MRF9QTFVTLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX01BVFJPWCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0OGQwLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9NQVRST1gsCisJCS5zdWJkZXZpY2UgICAgPSAweDQ4ZDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0NST05PU19QTFVTLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhhNzBiLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHhhNzBiLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9NRDI4MTksCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDIxMTUsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweDIxMTUsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1LAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgyMTA4LAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHgyMTA4LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA1LAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgxMGZmLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHgxMGZmLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfRFZEX0VaTUFLRVIsCi0gICAgICAgIH0seworCX0sewogCQkvKiBBVmVyTWVkaWEgQ2FyZEJ1cyAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHhkNmVlLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHhkNmVlLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQ0FSREJVUywKIAl9LHsKIAkJLyogVHJhbnNHZWFyIDMwMDBUViAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTQ2MSwgLyogQXZlcm1lZGlhIFRlY2hub2xvZ2llcyBJbmMgKi8KLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwNTBjLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHgwNTBjLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9URzMwMDBUViwKIAl9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMWJkLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDAwMmIsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUElOTkFDTEVfUENUVl9TVEVSRU8sCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSAweDExYmQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IDB4MDAyZCwKLSAgICAgICAgICAgICAgICAuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMLAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAotICAgICAgICAgICAgICAgIC5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxMDE5LAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweDRjYjQsCi0gICAgICAgICAgICAgICAgLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUCwKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTAxOSwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHg0Y2I1LAotICAgICAgICAgICAgICAgIC5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNSwKLSAgICAgICAgfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTJhYiwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMHgwODAwLAotIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzNfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViwKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxMWJkLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMDJiLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWX1NURVJFTywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxMWJkLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMDJkLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEwMTksCisJCS5zdWJkZXZpY2UgICAgPSAweDRjYjQsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFAsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4MTAxOSwKKwkJLnN1YmRldmljZSAgICA9IDB4NGNiNSwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1LAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDEyYWIsCisJCS5zdWJkZXZpY2UgICAgPSAweDA4MDAsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1VQTU9TVF9QVVJQTEVfVFYsCiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKIAkJLnN1YnZlbmRvciAgICA9IDB4MTUzQiwKIAkJLnN1YmRldmljZSAgICA9IDB4MTE1MiwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQ0lORVJHWTIwMCwKLSAJfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gMHgxODViLAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSAweGMxMDAsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE4NWIsCisJCS5zdWJkZXZpY2UgICAgPSAweGMxMDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlIsCi0gCX0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gMCwKKwkJLnN1YnZlbmRvciAgICA9IDB4MTEzMSwKKwkJLnN1YmRldmljZSAgICA9IDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfU0JUVFZGTSwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAogCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLwogCQkuc3ViZGV2aWNlICAgID0gMHg5NzE1LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxNDYxLCAvKiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyAqLworCQkuc3ViZGV2aWNlICAgID0gMHhhNzBhLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3LAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLApAQCAtMTgzMSwzMSArMjI5NCw3MCBAQAogCQkuc3VidmVuZG9yICAgID0gMHgxODViLAogCQkuc3ViZGV2aWNlICAgID0gMHhjMjAwLAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfR09MRF9QTFVTLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAogCQkuc3VidmVuZG9yICAgID0gMHgxNTQwLAogCQkuc3ViZGV2aWNlICAgID0gMHg5NTI0LAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1MiwKIAotIAl9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAogCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAotCQkuc3ViZGV2aWNlICAgID0gMHgwMzA2LAorCQkuc3ViZGV2aWNlICAgID0gMHgwNTAyLCAgICAgICAgICAgICAgICAvKiBDYXJkYnVzIHZlcnNpb24gKi8KIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAorCQkuc3ViZGV2aWNlICAgID0gMHgwMzA2LCAgICAgICAgICAgICAgICAvKiBQQ0kgdmVyc2lvbiAqLworCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlEVkJURFVPLAorCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDE0NjEsIC8qIEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jICovCisJCS5zdWJkZXZpY2UgICAgPSAweGYzMWYsCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9HT18wMDdfRk0sCiAKLSAJfSx7CisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLnN1YmRldmljZSAgICA9IDB4MjAwNCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSCwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDIxLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMzUwLAkJLyogUENJIHZlcnNpb24gKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQURTX0lOU1RBTlRfVFYsCisKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxNDIxLAorCQkuc3ViZGV2aWNlICAgID0gMHgwMzcwLAkJLyogY2FyZGJ1cyB2ZXJzaW9uICovCisJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWLAorCisJfSx7ICAgICAvKiBUeXBob29uIERWQi1UIER1byBEaWdpdGFsL0FuYWxvZyBDYXJkYnVzICovCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKKwkJLnN1YnZlbmRvciAgICA9IDB4NGU0MiwKKwkJLnN1YmRldmljZSAgICA9IDB4MDUwMiwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVEhZUEhPT05fRFZCVF9EVU9fQ0FSREJVUywKKworCX0sewogCQkvKiAtLS0gYm9hcmRzIHdpdGhvdXQgZWVwcm9tICsgc3Vic3lzdGVtIElEIC0tLSAqLwotICAgICAgICAgICAgICAgIC52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCi0gICAgICAgICAgICAgICAgLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLnN1YmRldmljZSAgICA9IDAsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX05PQVVUTywKLSAgICAgICAgfSx7Ci0gICAgICAgICAgICAgICAgLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKLSAgICAgICAgICAgICAgICAuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzAsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAorCQkuc3VidmVuZG9yICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuc3ViZGV2aWNlICAgID0gMCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfTk9BVVRPLAogCX0sewpAQCAtMTg2MywyNiArMjM2NSwyNiBAQAogCQkvKiAtLS0gZGVmYXVsdCBjYXRjaCAtLS0gKi8KIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwLAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1VOS05PV04sCi0gICAgICAgIH0seworCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCi0gICAgICAgICAgICAgICAgLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCi0gICAgICAgICAgICAgICAgLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfVU5LTk9XTiwKLSAgICAgICAgfSx7CisJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKLSAgICAgICAgICAgICAgICAuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKLSAgICAgICAgICAgICAgICAuc3ViZGV2aWNlICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YnZlbmRvciAgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9VTktOT1dOLAotICAgICAgICB9LHsKKwl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKIAkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM1LAotICAgICAgICAgICAgICAgIC5zdWJ2ZW5kb3IgICAgPSBQQ0lfQU5ZX0lELAotICAgICAgICAgICAgICAgIC5zdWJkZXZpY2UgICAgPSBQQ0lfQU5ZX0lELAorCQkuc3VidmVuZG9yICAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgICA9IFBDSV9BTllfSUQsCiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX1VOS05PV04sCiAJfSx7CiAJCS8qIC0tLSBlbmQgb2YgbGlzdCAtLS0gKi8KQEAgLTE4OTMsNDYgKzIzOTUsOSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGZseXZpZGVvIHR3ZWFrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSNpZiAwCi1zdGF0aWMgc3RydWN0IHsKLQljaGFyICAqbW9kZWw7Ci0JaW50ICAgdHVuZXJfdHlwZTsKLX0gZmx5X2xpc3RbMHgyMF0gPSB7Ci0JLyogZGVmYXVsdCBjYXRjaCAuLi4gKi8KLQlbIDAgLi4uIDB4MWYgXSA9IHsKLQkJLm1vZGVsICAgICAgPSAiVU5LTk9XTiIsCi0JCS50dW5lcl90eXBlID0gVFVORVJfQUJTRU5ULAotCX0sCi0JLyogLi4uIHRoZSBvbmVzIGtub3duIHNvIGZhciAqLwotCVsgMHgwNSBdID0gewotCQkubW9kZWwgICAgICA9ICJQQUwtQkciLAotCQkudHVuZXJfdHlwZSA9IFRVTkVSX0xHX1BBTF9ORVdfVEFQQywKLQl9LAotCVsgMHgxMCBdID0gewotCQkubW9kZWwgICAgICA9ICJQQUwtQkcgLyBQQUwtREsiLAotCQkudHVuZXJfdHlwZSA9IFRVTkVSX1BISUxJUFNfUEFMLAotCX0sCi0JWyAweDE1IF0gPSB7Ci0JCS5tb2RlbCAgICAgID0gIk5UU0MiLAotCQkudHVuZXJfdHlwZSA9IFRVTkVSX0FCU0VOVCAvKiBGSVhNRSAqLywKLQl9LAotfTsKLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBib2FyZF9mbHl2aWRlbyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKLSNpZiAwCi0JLyogbm9uLXdvcmtpbmcgYXR0ZW1wdCB0byBkZXRlY3QgdGhlIGNvcnJlY3QgdHVuZXIgdHlwZSAuLi4gKi8KLQl1MzIgdmFsdWU7Ci0JaW50IGluZGV4OwotCi0JdmFsdWUgPSBkZXYtPmdwaW9fdmFsdWU7Ci0JaW5kZXggPSAodmFsdWUgJiAweDFmMDApID4+IDg7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZseXZpZGVvOiBncGlvIGlzIDB4JXggW21vZGVsPSVzLHR1bmVyPSVkXVxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCB2YWx1ZSwgZmx5X2xpc3RbaW5kZXhdLm1vZGVsLAotCSAgICAgICBmbHlfbGlzdFtpbmRleF0udHVuZXJfdHlwZSk7Ci0JZGV2LT50dW5lcl90eXBlID0gZmx5X2xpc3RbaW5kZXhdLnR1bmVyX3R5cGU7Ci0jZW5kaWYKIAlwcmludGsoIiVzOiB0aGVyZSBhcmUgZGlmZmVyZW50IGZseXZpZGVvIGNhcmRzIHdpdGggZGlmZmVyZW50IHR1bmVyc1xuIgogCSAgICAgICAiJXM6IG91dCB0aGVyZSwgeW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoZSB0dW5lcj08bnI+IGluc21vZFxuIgogCSAgICAgICAiJXM6IG9wdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZS5cbiIsCkBAIC0xOTQzLDcgKzI0MDgsNyBAQAogCiBpbnQgc2FhNzEzNF9ib2FyZF9pbml0MShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKIHsKLQkvLyBBbHdheXMgcHJpbnQgZ3Bpbywgb2Z0ZW4gbWFudWZhY3R1cmVycyBlbmNvZGUgdHVuZXIgdHlwZSBhbmQgb3RoZXIgaW5mby4KKwkvKiBBbHdheXMgcHJpbnQgZ3Bpbywgb2Z0ZW4gbWFudWZhY3R1cmVycyBlbmNvZGUgdHVuZXIgdHlwZSBhbmQgb3RoZXIgaW5mby4gKi8KIAlzYWFfd3JpdGVsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsIDApOwogCWRldi0+Z3Bpb192YWx1ZSA9IHNhYV9yZWFkbChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIpOwogCXByaW50ayhLRVJOX0lORk8gIiVzOiBib2FyZCBpbml0OiBncGlvIGlzICV4XG4iLCBkZXYtPm5hbWUsIGRldi0+Z3Bpb192YWx1ZSk7CkBAIC0xOTYxLDIxICsyNDI2LDI2IEBACiAJY2FzZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFA6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNToKIAljYXNlIFNBQTcxMzRfQk9BUkRfTUQyODE5OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfVlNUUkVBTV9YUEVSVDoKKwljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1hQRVJUOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNToKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNToKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDc6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDc6Ci0vLwljYXNlIFNBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNOiAgLyogbm90IGZpbmlzaGVkIHlldCAqLworCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfR09fMDA3X0ZNOgorLyogICAgICBjYXNlIFNBQTcxMzRfQk9BUkRfU0FCUkVOVF9TQlRUVkZNOiAgKi8gLyogbm90IGZpbmlzaGVkIHlldCAqLwogCWNhc2UgU0FBNzEzNF9CT0FSRF9WSURFT01BVEVfVFZfUFZSOgotCQlkZXYtPmhhc19yZW1vdGUgPSAxOwotCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1RWX0dPTERfUExVU0lJOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDE6CisJY2FzZSBTQUE3MTM0X0JPQVJEX01BTkxJX01UVjAwMjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWOgogCQlkZXYtPmhhc19yZW1vdGUgPSAxOwogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfTUQ1MDQ0OgogCQlwcmludGsoIiVzOiBzZWVtcyB0aGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgTUQ1MDQ0XG4iCi0JCSAgICAgICAiJXM6ICh3aXRoIHRoZSBzYW1lIElEKSBvdXQgdGhlcmUuICBJZiBzb3VuZCBkb2Vzbid0IHdvcmsgZm9yXG4iCi0JCSAgICAgICAiJXM6IHlvdSB0cnkgdGhlIGF1ZGlvX2Nsb2NrX292ZXJyaWRlPTB4MjAwMDAwIGluc21vZCBvcHRpb24uXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLGRldi0+bmFtZSxkZXYtPm5hbWUpOworCQkiJXM6ICh3aXRoIHRoZSBzYW1lIElEKSBvdXQgdGhlcmUuICBJZiBzb3VuZCBkb2Vzbid0IHdvcmsgZm9yXG4iCisJCSIlczogeW91IHRyeSB0aGUgYXVkaW9fY2xvY2tfb3ZlcnJpZGU9MHgyMDAwMDAgaW5zbW9kIG9wdGlvbi5cbiIsCisJCWRldi0+bmFtZSxkZXYtPm5hbWUsZGV2LT5uYW1lKTsKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0NJTkVSR1k0MDBfQ0FSREJVUzoKIAkJLyogcG93ZXItdXAgdHVuZXIgY2hpcCAqLwpAQCAtMTk4MywxMSArMjQ1MywxOSBAQAogCQlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUFNUQVRVUzAgPj4gMiwgMHgwMDA0MDAwMCwgMHgwMDAwMDAwMCk7CiAJCW1zbGVlcCgxKTsKIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU86CisJY2FzZSBTQUE3MTM0X0JPQVJEX1RIWVBIT09OX0RWQlRfRFVPX0NBUkRCVVM6CisJLyogdHVybiB0aGUgZmFuIG9uIEhhYzogc3RhdGljIGZvciB0aGUgdGltZSBiZWluZyAqLworCQlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUE1PREUzLCAweDA4KTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X0dQSU9fR1BTVEFUVVMzLCAweDA2KTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTOgorCQkvKiBwb3dlci11cCB0dW5lciBjaGlwICovCisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKKwkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYpOworCQltc2xlZXAoMSk7CisJCWJyZWFrOwogCX0KLQlpZiAoZGV2LT5oYXNfcmVtb3RlKQotCQlkZXYtPmlycTJfbWFzayB8PSAoU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE4ICB8Ci0JCQkJICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE4QSB8Ci0JCQkJICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE2ICApOwogCXJldHVybiAwOwogfQogCkBAIC0yMDA4LDEwICsyNDg2LDg1IEBACiAJCQlicmVhazsKIAkJZGV2LT5ib2FyZCA9IGJvYXJkOwogCQlwcmludGsoIiVzOiBib2FyZCB0eXBlIGZpeHVwOiAlc1xuIiwgZGV2LT5uYW1lLAotCQkgICAgICAgc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSk7CisJCXNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUpOwogCQlkZXYtPnR1bmVyX3R5cGUgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50dW5lcl90eXBlOwotCQlpZiAoVFVORVJfQUJTRU5UICE9IGRldi0+dHVuZXJfdHlwZSkKLQkJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVFVORVJfU0VUX1RZUEUsJmRldi0+dHVuZXJfdHlwZSk7CisKKwkJaWYgKFRVTkVSX0FCU0VOVCAhPSBkZXYtPnR1bmVyX3R5cGUpIHsKKwkJCQlzdHJ1Y3QgdHVuZXJfc2V0dXAgdHVuX3NldHVwOworCisJCQkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKKwkJCQl0dW5fc2V0dXAudHlwZSA9IGRldi0+dHVuZXJfdHlwZTsKKwkJCQl0dW5fc2V0dXAuYWRkciA9IEFERFJfVU5TRVQ7CisKKwkJCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMgKGRldiwgVFVORVJfU0VUX1RZUEVfQUREUiwgJnR1bl9zZXR1cCk7CisJCX0KKwkJYnJlYWs7CitjYXNlIFNBQTcxMzRfQk9BUkRfTUQ3MTM0OgorCQl7CisJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisJCXU4IHN1YmFkZHI7CisJCXU4IGRhdGFbM107CisJCWludCByZXQsIHR1bmVyX3Q7CisKKwkJc3RydWN0IGkyY19tc2cgbXNnW10gPSB7ey5hZGRyPTB4NTAsIC5mbGFncz0wLCAuYnVmPSZzdWJhZGRyLCAubGVuID0gMX0sCisJCQkJCXsuYWRkcj0weDUwLCAuZmxhZ3M9STJDX01fUkQsIC5idWY9ZGF0YSwgLmxlbiA9IDN9fTsKKwkJc3ViYWRkcj0gMHgxNDsKKwkJdHVuZXJfdCA9IDA7CisJCXJldCA9IGkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgbXNnLCAyKTsKKwkJaWYgKHJldCAhPSAyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVFUFJPTSByZWFkIGZhaWx1cmVcbiIpOworCQl9IGVsc2UgaWYgKChkYXRhWzBdICE9IDApICYmIChkYXRhWzBdICE9IDB4ZmYpKSB7CisJCQkvKiBvbGQgY29uZmlnIHN0cnVjdHVyZSAqLworCQkJc3ViYWRkciA9IGRhdGFbMF0gKyAyOworCQkJbXNnWzFdLmxlbiA9IDI7CisJCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsIG1zZywgMik7CisJCQl0dW5lcl90ID0gKGRhdGFbMF0gPDwgOCkgKyBkYXRhWzFdOworCQkJc3dpdGNoICh0dW5lcl90KXsKKwkJCWNhc2UgMHgwMTAzOgorCQkJCWRldi0+dHVuZXJfdHlwZSA9IFRVTkVSX1BISUxJUFNfUEFMOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAxMEM6CisJCQkJZGV2LT50dW5lcl90eXBlID0gVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzM7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgQ2FudCBkZXRlcm1pbmUgdHVuZXIgdHlwZSAleCBmcm9tIEVFUFJPTVxuIiwgZGV2LT5uYW1lLCB0dW5lcl90KTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoZGF0YVsxXSAhPSAwKSAmJiAoZGF0YVsxXSAhPSAweGZmKSkgeworCQkJLyogbmV3IGNvbmZpZyBzdHJ1Y3R1cmUgKi8KKwkJCXN1YmFkZHIgPSBkYXRhWzFdICsgMTsKKwkJCW1zZ1sxXS5sZW4gPSAxOworCQkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCBtc2csIDIpOworCQkJc3ViYWRkciA9IGRhdGFbMF0gKyAxOworCQkJbXNnWzFdLmxlbiA9IDI7CisJCQlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsIG1zZywgMik7CisJCQl0dW5lcl90ID0gKGRhdGFbMV0gPDwgOCkgKyBkYXRhWzBdOworCQkJc3dpdGNoICh0dW5lcl90KSB7CisJCQljYXNlIDB4MDAwNToKKwkJCQlkZXYtPnR1bmVyX3R5cGUgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDFkOgorCQkJCWRldi0+dHVuZXJfdHlwZSA9IFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMzsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgQm9hcmQgaGFzIERWQi1UXG4iLCBkZXYtPm5hbWUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzIENhbnQgZGV0ZXJtaW5lIHR1bmVyIHR5cGUgJXggZnJvbSBFRVBST01cbiIsIGRldi0+bmFtZSwgdHVuZXJfdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzIHVuZXhwZWN0ZWQgY29uZmlnIHN0cnVjdHVyZVxuIiwgZGV2LT5uYW1lKTsKKwkJfQorCisJCXByaW50ayhLRVJOX0lORk8gIiVzIFR1bmVyIHR5cGUgaXMgJWRcbiIsIGRldi0+bmFtZSwgZGV2LT50dW5lcl90eXBlKTsKKwkJaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMpIHsKKwkJCWRldi0+dGRhOTg4N19jb25mID0gVERBOTg4N19QUkVTRU5UIHwgVERBOTg4N19QT1JUMV9BQ1RJVkUgfCBUREE5ODg3X1BPUlQyX0FDVElWRTsKKwkJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVERBOTg4N19TRVRfQ09ORklHLCAmZGV2LT50ZGE5ODg3X2NvbmYpOworCQl9CisKKwkJdHVuX3NldHVwLm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKKwkJdHVuX3NldHVwLnR5cGUgPSBkZXYtPnR1bmVyX3R5cGU7CisJCXR1bl9zZXR1cC5hZGRyID0gQUREUl9VTlNFVDsKKworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMgKGRldiwgVFVORVJfU0VUX1RZUEVfQUREUiwmdHVuX3NldHVwKTsKKwkJfQogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggZDUwNmNhZi4uMWRiZTYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtY29yZS5jLHYgMS4yOCAyMDA1LzAyLzIyIDA5OjU2OjI5IGtyYXhlbCBFeHAgJAorICogJElkOiBzYWE3MTM0LWNvcmUuYyx2IDEuMzkgMjAwNS8wNy8wNSAxNzozNzozNSBuc2ggRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIGRyaXZlciBjb3JlCkBAIC0xODMsNDYgKzE4Myw2IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWYgMAotc3RhdGljIGNoYXIgKmRlYzFfYml0c1s4XSA9IHsKLQkiRENTVEQwIiwgIkRDU0NUMSIsICJXSVBBIiwgIkdMSU1CIiwKLQkiR0xJTVQiLCAiU0xUQ0EiLCAiSExDSyIKLX07Ci1zdGF0aWMgY2hhciAqZGVjMl9iaXRzWzhdID0gewotCSJSRENBUCIsICJDT1BSTyIsICJDT0xTVFIiLCAiVFlQRTMiLAotCU5VTEwsICJGSURUIiwgIkhMVkxOIiwgIklOVEwiCi19Owotc3RhdGljIGNoYXIgKnNjYWxlMV9iaXRzWzhdID0gewotCSJWSURfQSIsICJWQklfQSIsIE5VTEwsIE5VTEwsICJWSURfQiIsICJWQklfQiIKLX07Ci1zdGF0aWMgY2hhciAqc2NhbGUyX2JpdHNbOF0gPSB7Ci0JIlRSRVJSIiwgIkNGRVJSIiwgIkxERVJSIiwgIldBU1JTVCIsCi0JIkZJRFNDSSIsICJGSURTQ08iLCAiRDZeRDUiLCAiVEFTSyIKLX07Ci0KLXN0YXRpYyB2b2lkIGR1bXBfc3RhdHVzcmVnKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBpbnQgcmVnLAotCQkJICAgY2hhciAqcmVnbmFtZSwgY2hhciAqKmJpdHMpCi17Ci0JaW50IHZhbHVlLGk7Ci0KLQl2YWx1ZSA9IHNhYV9yZWFkYihyZWcpOwotCXByaW50ayhLRVJOX0RFQlVHICIlczogJXM6IiwgZGV2LT5uYW1lLCByZWduYW1lKTsKLQlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgewotCQlpZiAoTlVMTCA9PSBiaXRzW2ldKQotCQkJY29udGludWU7Ci0JCXByaW50aygiICVzPSVkIiwgYml0c1tpXSwgKHZhbHVlICYgKDEgPDwgaSkpID8gMSA6IDApOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGR1bXBfc3RhdHVzcmVncyhzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKLXsKLQlkdW1wX3N0YXR1c3JlZyhkZXYsU0FBNzEzNF9TVEFUVVNfVklERU8xLCJkZWMxIixkZWMxX2JpdHMpOwotCWR1bXBfc3RhdHVzcmVnKGRldixTQUE3MTM0X1NUQVRVU19WSURFTzIsImRlYzIiLGRlYzJfYml0cyk7Ci0JZHVtcF9zdGF0dXNyZWcoZGV2LFNBQTcxMzRfU0NBTEVSX1NUQVRVUzAsInNjYWxlMCIsc2NhbGUxX2JpdHMpOwotCWR1bXBfc3RhdHVzcmVnKGRldixTQUE3MTM0X1NDQUxFUl9TVEFUVVMxLCJzY2FsZTEiLHNjYWxlMl9iaXRzKTsKLX0KLSNlbmRpZgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZGVsYXllZCByZXF1ZXN0X21vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMxNiw3ICsyNzYsNyBAQAogCiBpbnQgc2FhNzEzNF9wZ3RhYmxlX2FsbG9jKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBzYWE3MTM0X3BndGFibGUgKnB0KQogewotICAgICAgICB1MzIgICAgICAgICAgKmNwdTsKKyAgICAgICAgX19sZTMyICAgICAgICpjcHU7CiAgICAgICAgIGRtYV9hZGRyX3QgICBkbWFfYWRkcjsKIAogCWNwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaSwgU0FBNzEzNF9QR1RBQkxFX1NJWkUsICZkbWFfYWRkcik7CkBAIC0zMzIsNyArMjkyLDcgQEAKIAkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpsaXN0LCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAogCQkJICB1bnNpZ25lZCBpbnQgc3RhcnRwYWdlKQogewotCXUzMiAgICAgICAgICAgKnB0cjsKKwlfX2xlMzIgICAgICAgICpwdHI7CiAJdW5zaWduZWQgaW50ICBpLHA7CiAKIAlCVUdfT04oTlVMTCA9PSBwdCB8fCBOVUxMID09IHB0LT5jcHUpOwpAQCAtMzQwLDcgKzMwMCw3IEBACiAJcHRyID0gcHQtPmNwdSArIHN0YXJ0cGFnZTsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyssIGxpc3QrKykKIAkJZm9yIChwID0gMDsgcCAqIDQwOTYgPCBsaXN0LT5sZW5ndGg7IHArKywgcHRyKyspCi0JCQkqcHRyID0gc2dfZG1hX2FkZHJlc3MobGlzdCkgLSBsaXN0LT5vZmZzZXQ7CisJCQkqcHRyID0gY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3MobGlzdCkgLSBsaXN0LT5vZmZzZXQpOwogCXJldHVybiAwOwogfQogCkBAIC02MTYsMTAgKzU3Niw2IEBACiAJCWlmIChpcnFfZGVidWcpCiAJCQlwcmludF9pcnFzdGF0dXMoZGV2LGxvb3AscmVwb3J0LHN0YXR1cyk7CiAKLSNpZiAwCi0JCWlmIChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfQ09ORl9FUlIpCi0JCQlkdW1wX3N0YXR1c3JlZ3MoZGV2KTsKLSNlbmRpZgogCiAJCWlmIChyZXBvcnQgJiBTQUE3MTM0X0lSUV9SRVBPUlRfUkRDQVAgLyogX0lOVEwgKi8pCiAJCQlzYWE3MTM0X2lycV92aWRlb19pbnRsKGRldik7CkBAIC03MTEsNyArNjY3LDYgQEAKIAkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRVZGRTEgfAogCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FVkZFMiB8CiAJCSAgIFNBQTcxMzRfTUFJTl9DVFJMX0VTRkUgIHwKLQkJICAgU0FBNzEzNF9NQUlOX0NUUkxfRUJBREMgfAogCQkgICBTQUE3MTM0X01BSU5fQ1RSTF9FQkRBQyk7CiAKIAkvKiBlbmFibGUgcGVyaXBoZXJhbCBkZXZpY2VzICovCkBAIC03MjYsMTQgKzY4MSwyOCBAQAogLyogbGF0ZSBpbml0ICh3aXRoIGkyYyArIGlycSkgKi8KIHN0YXRpYyBpbnQgc2FhNzEzNF9od2luaXQyKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogeworCXVuc2lnbmVkIGludCBpcnEyX21hc2s7CiAJZHByaW50aygiaHdpbml0MlxuIik7CiAKIAlzYWE3MTM0X3ZpZGVvX2luaXQyKGRldik7CiAJc2FhNzEzNF90dmF1ZGlvX2luaXQyKGRldik7CiAKIAkvKiBlbmFibGUgSVJRJ3MgKi8KKyAgIAlpcnEyX21hc2sgPQorCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMzICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMiAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzEgICAgfAorCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMwICAgIHwKKwkJU0FBNzEzNF9JUlEyX0lOVEVfUEUgICAgICB8CisJCVNBQTcxMzRfSVJRMl9JTlRFX0FSOworCisJaWYgKGRldi0+aGFzX3JlbW90ZSkKKwkJaXJxMl9tYXNrIHw9IChTQUE3MTM0X0lSUTJfSU5URV9HUElPMTggIHwKKwkJCSAgICAgIFNBQTcxMzRfSVJRMl9JTlRFX0dQSU8xOEEgfAorCQkJICAgICAgU0FBNzEzNF9JUlEyX0lOVEVfR1BJTzE2ICApOworCiAJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTEsIDApOwotCXNhYV93cml0ZWwoU0FBNzEzNF9JUlEyLCBkZXYtPmlycTJfbWFzayk7CisJc2FhX3dyaXRlbChTQUE3MTM0X0lSUTIsIGlycTJfbWFzayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk1NCwxMyArOTIzLDYgQEAKIAl9CiAKIAkvKiBpbml0aWFsaXplIGhhcmR3YXJlICMxICovCi0gICAJZGV2LT5pcnEyX21hc2sgPQotCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMzICAgIHwKLQkJU0FBNzEzNF9JUlEyX0lOVEVfREVDMiAgICB8Ci0JCVNBQTcxMzRfSVJRMl9JTlRFX0RFQzEgICAgfAotCQlTQUE3MTM0X0lSUTJfSU5URV9ERUMwICAgIHwKLQkJU0FBNzEzNF9JUlEyX0lOVEVfUEUgICAgICB8Ci0JCVNBQTcxMzRfSVJRMl9JTlRFX0FSOwogCXNhYTcxMzRfYm9hcmRfaW5pdDEoZGV2KTsKIAlzYWE3MTM0X2h3aW5pdDEoZGV2KTsKIApAQCAtOTkwLDYgKzk1Miw3IEBACiAJCXJlcXVlc3RfbW9kdWxlKCJzYWE2NzUyaHMiKTsKIAkJcmVxdWVzdF9tb2R1bGVfZGVwZW5kKCJzYWE3MTM0LWVtcHJlc3MiLCZuZWVkX2VtcHJlc3MpOwogCX0KKwogICAJaWYgKGNhcmRfaXNfZHZiKGRldikpCiAJCXJlcXVlc3RfbW9kdWxlX2RlcGVuZCgic2FhNzEzNC1kdmIiLCZuZWVkX2R2Yik7CiAKQEAgLTExNDQsOSArMTEwNyw2IEBACiAJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApLAogCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LDApKTsKIAotI2lmIDAgIC8qIGNhdXNlcyBzb21lIHRyb3VibGUgd2hlbiByZWluc2VydGluZyB0aGUgZHJpdmVyIC4uLiAqLwotCXBjaV9kaXNhYmxlX2RldmljZShwY2lfZGV2KTsKLSNlbmRpZgogCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKIAogCS8qIGZyZWUgbWVtb3J5ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IGMyODczYWUuLjMzNGJjMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC0xLDggKzEsMTEgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtZHZiLmMsdiAxLjEyIDIwMDUvMDIvMTggMTI6Mjg6Mjkga3JheGVsIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtZHZiLmMsdiAxLjE4IDIwMDUvMDcvMDQgMTY6MDU6NTAgbWtydWZreSBFeHAgJAogICoKICAqIChjKSAyMDA0IEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KICAqCisgKiAgRXh0ZW5kZWQgMyAvIDIwMDUgYnkgSGFydG11dCBIYWNrbWFubiB0byBzdXBwb3J0IHZhcmlvdXMKKyAqICBjYXJkcyB3aXRoIHRoZSB0ZGExMDA0NiBEVkItVCBjaGFubmVsIGRlY29kZXIKKyAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0yNywyMyArMzAsMzEgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogCisjZGVmaW5lIENPTkZJR19EVkJfTVQzNTIgMQorI2RlZmluZSBDT05GSUdfRFZCX1REQTEwMDRYIDEKKwogI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCiAjaW5jbHVkZSAic2FhNzEzNC5oIgogCi0jaW5jbHVkZSAiZHZiLXBsbC5oIgotI2luY2x1ZGUgIm10MzUyLmgiCi0jaW5jbHVkZSAibXQzNTJfcHJpdi5oIiAvKiBGSVhNRSAqLwotI2luY2x1ZGUgInRkYTEwMDR4LmgiCisjaWYgQ09ORklHX0RWQl9NVDM1MgorIyBpbmNsdWRlICJtdDM1Mi5oIgorIyBpbmNsdWRlICJtdDM1Ml9wcml2LmgiIC8qIEZJWE1FICovCisjZW5kaWYKKyNpZiBDT05GSUdfRFZCX1REQTEwMDRYCisjIGluY2x1ZGUgInRkYTEwMDR4LmgiCisjZW5kaWYKIAogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGFudGVubmFfcHdyID0gMDsKKwogbW9kdWxlX3BhcmFtKGFudGVubmFfcHdyLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhbnRlbm5hX3B3ciwiZW5hYmxlIGFudGVubmEgcG93ZXIgKFBpbm5hY2xlIDMwMGkpIik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisjaWYgQ09ORklHX0RWQl9NVDM1Mgogc3RhdGljIGludCBwaW5uYWNsZV9hbnRlbm5hX3B3cihzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IG9uKQogewogCXUzMiBvazsKQEAgLTEzOCw1MSArMTQ5LDM5MCBAQAogCS5kZW1vZF9pbml0ICAgID0gbXQzNTJfcGlubmFjbGVfaW5pdCwKIAkucGxsX3NldCAgICAgICA9IG10MzUyX3Bpbm5hY2xlX3BsbF9zZXQsCiB9OworI2VuZGlmCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IG1lZGlvbl9jYXJkYnVzX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi17Ci0JLyogYW55dGhpbmcgdG8gZG8gaGVyZSA/Pz8gKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtZWRpb25fY2FyZGJ1c19wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAotCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCisjaWYgQ09ORklHX0RWQl9UREExMDA0WAorc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0Jc3RydWN0IHY0bDJfZnJlcXVlbmN5IGY7CisJc3RhdGljIHU4IHR1MTIxNl9pbml0W10gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IHR1MTIxNl9pbml0LC5sZW4gPSBzaXplb2YodHUxMjE2X2luaXQpIH07CiAKLQkvKgotCSAqIHRoaXMgaW5zdHJ1Y3RzIHR1bmVyLm8gdG8gc2V0IHRoZSBmcmVxdWVuY3ksIHRoZSBjYWxsIHdpbGwKLQkgKiBlbmQgdXAgaW4gdHVuZXJfY29tbWFuZCgpLCBWSURJT0NfU19GUkVRVUVOQ1kgc3dpdGNoLgotCSAqIHRkYTk4ODcubyB3aWxsIHNlZSB0aGF0IGFzIHdlbGwuCi0JICovCi0JZi50dW5lciAgICAgPSAwOwotCWYudHlwZSAgICAgID0gVjRMMl9UVU5FUl9ESUdJVEFMX1RWOwotCWYuZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3kgLyAxMDAwICogMTYgLyAxMDAwOwotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DX1NfRlJFUVVFTkNZLCZmKTsKKwkvKiBzZXR1cCBQTEwgY29uZmlndXJhdGlvbiAqLworCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCW1zbGVlcCgxKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZlX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwl1OCB0dW5lcl9idWZbNF07CisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0dW5lcl9idWYsLmxlbiA9CisJCQlzaXplb2YodHVuZXJfYnVmKSB9OworCWludCB0dW5lcl9mcmVxdWVuY3kgPSAwOworCXU4IGJhbmQsIGNwLCBmaWx0ZXI7CisKKwkvKiBkZXRlcm1pbmUgY2hhcmdlIHB1bXAgKi8KKwl0dW5lcl9mcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIDM2MTY2MDAwOworCWlmICh0dW5lcl9mcmVxdWVuY3kgPCA4NzAwMDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMTMwMDAwMDAwKQorCQljcCA9IDM7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMTYwMDAwMDAwKQorCQljcCA9IDU7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMjAwMDAwMDAwKQorCQljcCA9IDY7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMjkwMDAwMDAwKQorCQljcCA9IDM7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNDIwMDAwMDAwKQorCQljcCA9IDU7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNDgwMDAwMDAwKQorCQljcCA9IDY7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNjIwMDAwMDAwKQorCQljcCA9IDM7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgODMwMDAwMDAwKQorCQljcCA9IDU7CisJZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgODk1MDAwMDAwKQorCQljcCA9IDc7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGRldGVybWluZSBiYW5kICovCisJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDkwMDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTYxMDAwMDAwKQorCQliYW5kID0gMTsKKwllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ0NDAwMDAwMCkKKwkJYmFuZCA9IDI7CisJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCA4NjEwMDAwMDApCisJCWJhbmQgPSA0OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXR1cCBQTEwgZmlsdGVyICovCisJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGgpIHsKKwljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJZmlsdGVyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJZmlsdGVyID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJZmlsdGVyID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjYWxjdWxhdGUgZGl2aXNvcgorCSAqICgoMzYxNjYwMDArKCgxMDAwMDAwLzYpLzIpKSArIEZpbnB1dCkvKDEwMDAwMDAvNikKKwkgKi8KKwl0dW5lcl9mcmVxdWVuY3kgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSAvIDEwMDApICogNikgKyAyMTc0OTYpIC8gMTAwMDsKKworCS8qIHNldHVwIHR1bmVyIGJ1ZmZlciAqLworCXR1bmVyX2J1ZlswXSA9ICh0dW5lcl9mcmVxdWVuY3kgPj4gOCkgJiAweDdmOworCXR1bmVyX2J1ZlsxXSA9IHR1bmVyX2ZyZXF1ZW5jeSAmIDB4ZmY7CisJdHVuZXJfYnVmWzJdID0gMHhjYTsKKwl0dW5lcl9idWZbM10gPSAoY3AgPDwgNSkgfCAoZmlsdGVyIDw8IDMpIHwgYmFuZDsKKworCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCisJbXNsZWVwKDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZShmdywgbmFtZSwgJmRldi0+cGNpLT5kZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBtZWRpb25fY2FyZGJ1cyA9IHsKLQkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsICAvKiBub3Qgc3VyZSB0aGlzIGlzIGNvcnJlY3QgKi8KLQkuaW52ZXJ0ICAgICAgICA9IDAsCi0gICAgICAgIC5pbnZlcnRfb2NsayAgID0gMCwKLSAgICAgICAgLnBsbF9pbml0ICAgICAgPSBtZWRpb25fY2FyZGJ1c19pbml0LAotICAgICAgICAucGxsX3NldCAgICAgICA9IG1lZGlvbl9jYXJkYnVzX3BsbF9zZXQsCi0gICAgICAgIC5yZXF1ZXN0X2Zpcm13YXJlID0gZmVfcmVxdWVzdF9maXJtd2FyZSwKK3N0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIHBoaWxpcHNfdHUxMjE2X2NvbmZpZyA9IHsKKworCS5kZW1vZF9hZGRyZXNzID0gMHg4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDEsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzRNLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTcsCisJLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX3R1MTIxNl9wbGxfaW5pdCwKKwkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdHUxMjE2X3BsbF9zZXQsCisJLnBsbF9zbGVlcCAgICAgPSBOVUxMLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisKK3N0YXRpYyBpbnQgcGhpbGlwc19mbWQxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwkvKiB0aGlzIG1lc3NhZ2UgaXMgdG8gc2V0IHVwIEFUQyBhbmQgQUxDICovCisJc3RhdGljIHU4IGZtZDEyMTZfaW5pdFtdID0geyAweDBiLCAweGRjLCAweDljLCAweGEwIH07CisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MSwuZmxhZ3MgPSAwLC5idWYgPSBmbWQxMjE2X2luaXQsLmxlbiA9IHNpemVvZihmbWQxMjE2X2luaXQpIH07CisKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKwltc2xlZXAoMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGhpbGlwc19mbWQxMjE2X2FuYWxvZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisJLyogdGhpcyBtZXNzYWdlIGFjdHVhbGx5IHR1cm5zIHRoZSB0dW5lciBiYWNrIHRvIGFuYWxvZyBtb2RlICovCisJc3RhdGljIHU4IGZtZDEyMTZfaW5pdFtdID0geyAweDBiLCAweGRjLCAweDljLCAweDYwIH07CisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MSwuZmxhZ3MgPSAwLC5idWYgPSBmbWQxMjE2X2luaXQsLmxlbiA9IHNpemVvZihmbWQxMjE2X2luaXQpIH07CisKKwlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOworCW1zbGVlcCgxKTsKKwlmbWQxMjE2X2luaXRbMl0gPSAweDg2OworCWZtZDEyMTZfaW5pdFszXSA9IDB4NTQ7CisJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKTsKKwltc2xlZXAoMSk7Cit9CisKK3N0YXRpYyBpbnQgcGhpbGlwc19mbWQxMjE2X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwl1OCB0dW5lcl9idWZbNF07CisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MSwuZmxhZ3MgPSAwLC5idWYgPSB0dW5lcl9idWYsLmxlbiA9CisJCQlzaXplb2YodHVuZXJfYnVmKSB9OworCWludCB0dW5lcl9mcmVxdWVuY3kgPSAwOworCWludCBkaXZpZGVyID0gMDsKKwl1OCBiYW5kLCBtb2RlLCBjcDsKKworCS8qIGRldGVybWluZSBjaGFyZ2UgcHVtcCAqLworCXR1bmVyX2ZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5ICsgMzYxMzAwMDA7CisJaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg3MDAwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBsb3cgYmFuZCAqLworCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDE4MDAwMDAwMCkgeworCQliYW5kID0gMTsKKwkJbW9kZSA9IDc7CisJCWNwICAgPSAwOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMTk1MDAwMDAwKSB7CisJCWJhbmQgPSAxOworCQltb2RlID0gNjsKKwkJY3AgICA9IDE7CisJLyogbWlkIGJhbmQJKi8KKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDM2NjAwMDAwMCkgeworCQlpZiAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikgeworCQkJYmFuZCA9IDEwOworCQl9IGVsc2UgeworCQkJYmFuZCA9IDI7CisJCX0KKwkJbW9kZSA9IDc7CisJCWNwICAgPSAwOworCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgNDc4MDAwMDAwKSB7CisJCWlmIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKSB7CisJCQliYW5kID0gMTA7CisJCX0gZWxzZSB7CisJCQliYW5kID0gMjsKKwkJfQorCQltb2RlID0gNjsKKwkJY3AgICA9IDE7CisJLyogaGlnaCBiYW5kICovCisJfSBlbHNlIGlmICh0dW5lcl9mcmVxdWVuY3kgPCA2NjIwMDAwMDApIHsKKwkJaWYgKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCA9PSBCQU5EV0lEVEhfOF9NSFopIHsKKwkJCWJhbmQgPSAxMjsKKwkJfSBlbHNlIHsKKwkJCWJhbmQgPSA0OworCQl9CisJCW1vZGUgPSA3OworCQljcCAgID0gMDsKKwl9IGVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg0MDAwMDAwMCkgeworCQlpZiAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoID09IEJBTkRXSURUSF84X01IWikgeworCQkJYmFuZCA9IDEyOworCQl9IGVsc2UgeworCQkJYmFuZCA9IDQ7CisJCX0KKwkJbW9kZSA9IDY7CisJCWNwICAgPSAxOworCX0gZWxzZSB7CisJCWlmIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGggPT0gQkFORFdJRFRIXzhfTUhaKSB7CisJCQliYW5kID0gMTI7CisJCX0gZWxzZSB7CisJCQliYW5kID0gNDsKKwkJfQorCQltb2RlID0gNzsKKwkJY3AgICA9IDE7CisKKwl9CisJLyogY2FsY3VsYXRlIGRpdmlzb3IgKi8KKwkvKiAoKDM2MTY2MDAwICsgRmlucHV0KSAvIDE2NjY2Nikgcm91bmRlZCEgKi8KKwlkaXZpZGVyID0gKHR1bmVyX2ZyZXF1ZW5jeSArIDgzMzMzKSAvIDE2NjY2NzsKKworCS8qIHNldHVwIHR1bmVyIGJ1ZmZlciAqLworCXR1bmVyX2J1ZlswXSA9IChkaXZpZGVyID4+IDgpICYgMHg3ZjsKKwl0dW5lcl9idWZbMV0gPSBkaXZpZGVyICYgMHhmZjsKKwl0dW5lcl9idWZbMl0gPSAweDgwIHwgKGNwIDw8IDYpIHwgKG1vZGUgIDw8IDMpIHwgNDsKKwl0dW5lcl9idWZbM10gPSAweDQwIHwgYmFuZDsKKworCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIG1lZGlvbl9jYXJkYnVzID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKKwkuaW52ZXJ0ICAgICAgICA9IDEsCisJLmludmVydF9vY2xrICAgPSAwLAorCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCisJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fTkVHLAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8zNjEzLAorCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc19mbWQxMjE2X3BsbF9pbml0LAorCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc19mbWQxMjE2X3BsbF9zZXQsCisJLnBsbF9zbGVlcAkgICA9IHBoaWxpcHNfZm1kMTIxNl9hbmFsb2csCisJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB0ZGE4Mjd4X2RhdGEgeworCXUzMiBsb21heDsKKwl1OCAgc3BkOworCXU4ICBiczsKKwl1OCAgYnA7CisJdTggIGNwOworCXU4ICBnYzM7CisJdTggZGl2MXA1OworfTsKKworc3RhdGljIHN0cnVjdCB0ZGE4Mjd4X2RhdGEgdGRhODI3eF9kdmJ0W10gPSB7CisJeyAubG9tYXggPSAgNjIwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAyLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gIDY2MDAwMDAwLCAuc3BkID0gMywgLmJzID0gMywgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDMsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9ICA3NjAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDEsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAzLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAgODQwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAyLCAuYnAgPSAwLCAuY3AgPSAwLCAuZ2MzID0gMywgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gIDkzMDAwMDAwLCAuc3BkID0gMywgLmJzID0gMiwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9ICA5ODAwMDAwMCwgLnNwZCA9IDMsIC5icyA9IDMsIC5icCA9IDAsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxMDkwMDAwMDAsIC5zcGQgPSAzLCAuYnMgPSAzLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTIzMDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAxfSwKKwl7IC5sb21heCA9IDEzMzAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDMsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAxNTEwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAxLCAuYnAgPSAxLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMTU0MDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMiwgLmJwID0gMSwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDE4MTAwMDAwMCwgLnNwZCA9IDIsIC5icyA9IDIsIC5icCA9IDEsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAxODUwMDAwMDAsIC5zcGQgPSAyLCAuYnMgPSAyLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gMjE3MDAwMDAwLCAuc3BkID0gMiwgLmJzID0gMywgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDI0NDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDIsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSAyNjUwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAzLCAuYnAgPSAyLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gMzAyMDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMSwgLmJwID0gMiwgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDMyNDAwMDAwMCwgLnNwZCA9IDEsIC5icyA9IDIsIC5icCA9IDIsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSAzNzAwMDAwMDAsIC5zcGQgPSAxLCAuYnMgPSAyLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNDU0MDAwMDAwLCAuc3BkID0gMSwgLmJzID0gMywgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDQ5MzAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDIsIC5icCA9IDMsIC5jcCA9IDAsIC5nYzMgPSAxLCAuZGl2MXA1ID0gMX0sCisJeyAubG9tYXggPSA1MzAwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAzLCAuYnAgPSAzLCAuY3AgPSAwLCAuZ2MzID0gMSwgLmRpdjFwNSA9IDF9LAorCXsgLmxvbWF4ID0gNTU0MDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMSwgLmJwID0gMywgLmNwID0gMCwgLmdjMyA9IDEsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDYwNDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDEsIC5icCA9IDQsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA2OTYwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAyLCAuYnAgPSA0LCAuY3AgPSAwLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gNzQwMDAwMDAwLCAuc3BkID0gMCwgLmJzID0gMiwgLmJwID0gNCwgLmNwID0gMSwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfSwKKwl7IC5sb21heCA9IDgyMDAwMDAwMCwgLnNwZCA9IDAsIC5icyA9IDMsIC5icCA9IDQsIC5jcCA9IDAsIC5nYzMgPSAwLCAuZGl2MXA1ID0gMH0sCisJeyAubG9tYXggPSA4NjUwMDAwMDAsIC5zcGQgPSAwLCAuYnMgPSAzLCAuYnAgPSA0LCAuY3AgPSAxLCAuZ2MzID0gMCwgLmRpdjFwNSA9IDB9LAorCXsgLmxvbWF4ID0gICAgICAgICAwLCAuc3BkID0gMCwgLmJzID0gMCwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfQorfTsKKworc3RhdGljIGludCBwaGlsaXBzX3RkYTgyN3hfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwl1OCB0dW5lcl9idWZbMTRdOworCisJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0dW5lcl9idWYsCisJCSAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4gPSBzaXplb2YodHVuZXJfYnVmKSB9OworCWludCBpLCB0dW5lcl9mcmVxLCBpZl9mcmVxOworCXUzMiBOOworCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCWlmX2ZyZXEgPSA0MDAwMDAwOworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF83X01IWjoKKwkJaWZfZnJlcSA9IDQ1MDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkgICAvKiA4IE1IeiBvciBBdXRvICovCisJCWlmX2ZyZXEgPSA1MDAwMDAwOworCQlicmVhazsKKwl9CisJdHVuZXJfZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5ICsgaWZfZnJlcTsKKworCWkgPSAwOworCXdoaWxlICh0ZGE4Mjd4X2R2YnRbaV0ubG9tYXggPCB0dW5lcl9mcmVxKSB7CisJCWlmKHRkYTgyN3hfZHZidFtpICsgMV0ubG9tYXggPT0gMCkKKwkJCWJyZWFrOworCQlpKys7CisJfQorCisJTiA9ICgodHVuZXJfZnJlcSArIDEyNTAwMCkgLyAyNTAwMDApIDw8ICh0ZGE4Mjd4X2R2YnRbaV0uc3BkICsgMik7CisJdHVuZXJfYnVmWzBdID0gMDsKKwl0dW5lcl9idWZbMV0gPSAoTj4+OCkgfCAweDQwOworCXR1bmVyX2J1ZlsyXSA9IE4gJiAweGZmOworCXR1bmVyX2J1ZlszXSA9IDA7CisJdHVuZXJfYnVmWzRdID0gMHg1MjsKKwl0dW5lcl9idWZbNV0gPSAodGRhODI3eF9kdmJ0W2ldLnNwZCA8PCA2KSArICh0ZGE4Mjd4X2R2YnRbaV0uZGl2MXA1IDw8IDUpICsKKwkJCQkgICAodGRhODI3eF9kdmJ0W2ldLmJzIDw8IDMpICsgdGRhODI3eF9kdmJ0W2ldLmJwOworCXR1bmVyX2J1Zls2XSA9ICh0ZGE4Mjd4X2R2YnRbaV0uZ2MzIDw8IDQpICsgMHg4ZjsKKwl0dW5lcl9idWZbN10gPSAweGJmOworCXR1bmVyX2J1Zls4XSA9IDB4MmE7CisJdHVuZXJfYnVmWzldID0gMHgwNTsKKwl0dW5lcl9idWZbMTBdID0gMHhmZjsKKwl0dW5lcl9idWZbMTFdID0gMHgwMDsKKwl0dW5lcl9idWZbMTJdID0gMHgwMDsKKwl0dW5lcl9idWZbMTNdID0gMHg0MDsKKworCXR1bmVyX21zZy5sZW4gPSAxNDsKKwlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCW1zbGVlcCg1MDApOworCS8qIGNvcnJlY3QgQ1AgdmFsdWUgKi8KKwl0dW5lcl9idWZbMF0gPSAweDMwOworCXR1bmVyX2J1ZlsxXSA9IDB4NTAgKyB0ZGE4Mjd4X2R2YnRbaV0uY3A7CisJdHVuZXJfbXNnLmxlbiA9IDI7CisJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaGlsaXBzX3RkYTgyN3hfcGxsX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKKwlzdGF0aWMgdTggdGRhODI3eF9zbGVlcFtdID0geyAweDMwLCAweGQwfTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IHRkYTgyN3hfc2xlZXAsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4gPSBzaXplb2YodGRhODI3eF9zbGVlcCkgfTsKKwlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOworfQorCitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyB0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCisJLmludmVydCAgICAgICAgPSAxLAorCS5pbnZlcnRfb2NsayAgID0gMCwKKwkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAorCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1gsCisJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKKwkucGxsX2luaXQgICAgICA9IHBoaWxpcHNfdGRhODI3eF9wbGxfaW5pdCwKKwkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdGRhODI3eF9wbGxfc2V0LAorCS5wbGxfc2xlZXAJICAgPSBwaGlsaXBzX3RkYTgyN3hfcGxsX3NsZWVwLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIHN0YXRpYyBpbnQgZHZiX2luaXQoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7CiAJLyogaW5pdCBzdHJ1Y3QgdmlkZW9idWZfZHZiICovCkBAIC0xOTcsMTggKzU0NywzMSBAQAogCQkJICAgIGRldik7CiAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKyNpZiBDT05GSUdfRFZCX01UMzUyCiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUw6CiAJCXByaW50aygiJXM6IHBpbm5hY2xlIDMwMGkgZHZiIHNldHVwXG4iLGRldi0+bmFtZSk7CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZwaW5uYWNsZV8zMDBpLAogCQkJCQkJICZkZXYtPmkyY19hZGFwKTsKIAkJYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfRFZCX1REQTEwMDRYCiAJY2FzZSBTQUE3MTM0X0JPQVJEX01ENzEzNDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJm1lZGlvbl9jYXJkYnVzLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKLQkJaWYgKE5VTEwgPT0gZGV2LT5kdmIuZnJvbnRlbmQpCi0JCQlwcmludGsoIiVzOiBIbW0sIGxvb2tzIGxpa2UgdGhpcyBpcyB0aGUgb2xkIE1ENzEzNCAiCi0JCQkgICAgICAgInZlcnNpb24gd2l0aG91dCBEVkItVCBzdXBwb3J0XG4iLGRldi0+bmFtZSk7CiAJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9QSElMSVBTX1RPVUdIOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190dTEyMTZfY29uZmlnLAorCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU86CisJCWRldi0+ZHZiLmZyb250ZW5kID0gdGRhMTAwNDZfYXR0YWNoKCZ0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZywKKwkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWJyZWFrOworCWNhc2UgU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTOgorCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmdGRhODI3eF9saWZldmlld19jb25maWcsCisJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCXByaW50aygiJXM6IEh1aD8gdW5rbm93biBEVkIgY2FyZD9cbiIsZGV2LT5uYW1lKTsKIAkJYnJlYWs7CkBAIC0yMjcsOCArNTkwLDYgQEAKIHsKIAlzdGF0aWMgaW50IG9uICA9IFREQTk4ODdfUFJFU0VOVCB8IFREQTk4ODdfUE9SVDJfSU5BQ1RJVkU7CiAKLQlwcmludGsoIiVzOiAlc1xuIixkZXYtPm5hbWUsX19GVU5DVElPTl9fKTsKLQogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV8zMDBJX0RWQlRfUEFMOgogCQkvKiBvdGhlcndpc2Ugd2UgZG9uJ3QgZGV0ZWN0IHRoZSB0dW5lciBvbiBuZXh0IGluc21vZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCmluZGV4IGZhMTM1NzMuLmM4NTM0OGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1lbXByZXNzLmMsdiAxLjEwIDIwMDUvMDIvMDMgMTA6MjQ6MzMga3JheGVsIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtZW1wcmVzcy5jLHYgMS4xMSAyMDA1LzA1LzIyIDE5OjIzOjM5IG5zaCBFeHAgJAogICoKICAqIChjKSAyMDA0IEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10KICAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCmluZGV4IDcwMmJiNjMuLjkzZGQ2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWkyYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC1pMmMuYyx2IDEuMTAgMjAwNS8wMS8yNCAxNzozNzoyMyBrcmF4ZWwgRXhwICQKKyAqICRJZDogc2FhNzEzNC1pMmMuYyx2IDEuMTkgMjAwNS8wNy8wNyAwMTo0OTozMCBta3J1Zmt5IEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiBpMmMgaW50ZXJmYWNlIHN1cHBvcnQKQEAgLTE5NywxMCArMTk3LDYgQEAKIAllbnVtIGkyY19zdGF0dXMgc3RhdHVzOwogCV9fdTMyIGR3b3JkOwogCi0jaWYgMAotCWkyY19zZXRfYXR0cihkZXYsYXR0cik7Ci0Jc2FhX3dyaXRlYihTQUE3MTM0X0kyQ19EQVRBLCBkYXRhKTsKLSNlbHNlCiAJLyogaGF2ZSB0byB3cml0ZSBib3RoIGF0dHIgKyBkYXRhIGluIG9uZSAzMmJpdCB3b3JkICovCiAJZHdvcmQgID0gc2FhX3JlYWRsKFNBQTcxMzRfSTJDX0FUVFJfU1RBVFVTID4+IDIpOwogCWR3b3JkICY9IDB4MGY7CkBAIC0yMTAsNyArMjA2LDYgQEAKIC8vCWR3b3JkIHw9IDB4NDAgPDwgMTY7ICAvKiA0MDAga0h6ICovCiAJZHdvcmQgfD0gMHhmMCA8PCAyNDsKIAlzYWFfd3JpdGVsKFNBQTcxMzRfSTJDX0FUVFJfU1RBVFVTID4+IDIsIGR3b3JkKTsKLSNlbmRpZgogCWQycHJpbnRrKEtFUk5fREVCVUcgIiVzOiBpMmMgZGF0YSA9PiAweCV4XG4iLGRldi0+bmFtZSxkYXRhKTsKIAogCWlmICghaTJjX2lzX2J1c3lfd2FpdChkZXYpKQpAQCAtMzMxLDEyICszMjYsNDQgQEAKIAogc3RhdGljIGludCBhdHRhY2hfaW5mb3JtKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0gICAgICAgIHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gY2xpZW50LT5hZGFwdGVyLT5hbGdvX2RhdGE7CisJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBjbGllbnQtPmFkYXB0ZXItPmFsZ29fZGF0YTsKIAlpbnQgdHVuZXIgPSBkZXYtPnR1bmVyX3R5cGU7CiAJaW50IGNvbmYgID0gZGV2LT50ZGE5ODg3X2NvbmY7CisJc3RydWN0IHR1bmVyX3NldHVwIHR1bl9zZXR1cDsKIAotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVFVORVJfU0VUX1RZUEUsJnR1bmVyKTsKLQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFREQTk4ODdfU0VUX0NPTkZJRywmY29uZik7CisJZDFwcmludGsoICIlcyBpMmMgYXR0YWNoIFthZGRyPTB4JXgsY2xpZW50PSVzXVxuIiwKKwkJY2xpZW50LT5kcml2ZXItPm5hbWUsY2xpZW50LT5hZGRyLGkyY19jbGllbnRuYW1lKGNsaWVudCkpOworCisJaWYgKCFjbGllbnQtPmRyaXZlci0+Y29tbWFuZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmFkaW9fdHlwZSAhPSBVTlNFVCkgeworCisJCXR1bl9zZXR1cC50eXBlID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ucmFkaW9fdHlwZTsKKwkJdHVuX3NldHVwLmFkZHIgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5yYWRpb19hZGRyOworCisJCWlmICgodHVuX3NldHVwLmFkZHIgPT0gQUREUl9VTlNFVCkgfHwgKHR1bl9zZXR1cC5hZGRyID09IGNsaWVudC0+YWRkcikpIHsKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX1JBRElPOworCisJCQljbGllbnQtPmRyaXZlci0+Y29tbWFuZChjbGllbnQsIFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisgICAgICAgIH0KKworCWlmICh0dW5lciAhPSBVTlNFVCkgeworCisJICAgICAgICB0dW5fc2V0dXAudHlwZSA9IHR1bmVyOworCSAgICAgICAgdHVuX3NldHVwLmFkZHIgPSBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS50dW5lcl9hZGRyOworCisJCWlmICgodHVuX3NldHVwLmFkZHIgPT0gQUREUl9VTlNFVCl8fCh0dW5fc2V0dXAuYWRkciA9PSBjbGllbnQtPmFkZHIpKSB7CisKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UVjsKKworCQkJY2xpZW50LT5kcml2ZXItPmNvbW1hbmQoY2xpZW50LFRVTkVSX1NFVF9UWVBFX0FERFIsICZ0dW5fc2V0dXApOworCQl9CisgICAgICAgIH0KKworCWNsaWVudC0+ZHJpdmVyLT5jb21tYW5kKGNsaWVudCwgVERBOTg4N19TRVRfQ09ORklHLCAmY29uZik7CisKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCmluZGV4IGNhNTBjZjUuLjIxMzc0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtaW5wdXQuYyx2IDEuMTYgMjAwNC8xMi8xMCAxMjozMzozOSBrcmF4ZWwgRXhwICQKKyAqICRJZDogc2FhNzEzNC1pbnB1dC5jLHYgMS4yMSAyMDA1LzA2LzIyIDIzOjM3OjM0IG5zaCBFeHAgJAogICoKICAqIGhhbmRsZSBzYWE3MTM0IElSIHJlbW90ZXMgdmlhIGxpbnV4IGtlcm5lbCBpbnB1dCBsYXllci4KICAqCkBAIC02OCwxMCArNjgsOCBAQAogCVsgICAgNiBdID0gS0VZX0FHQUlOLCAgICAgICAgLy8gUmVjYWwKIAlbICAgMTYgXSA9IEtFWV9LUEVOVEVSLCAgICAgIC8vIEVudGVyCiAKLSNpZiAxIC8qIEZJWE1FICovCiAJWyAgIDI2IF0gPSBLRVlfRjIyLCAgICAgICAgICAvLyBTdGVyZW8KIAlbICAgMjQgXSA9IEtFWV9FRElULCAgICAgICAgIC8vIEFWIFNvdXJjZQotI2VuZGlmCiB9OwogCiBzdGF0aWMgSVJfS0VZVEFCX1RZUEUgY2luZXJneV9jb2Rlc1tJUl9LRVlUQUJfU0laRV0gPSB7CkBAIC0xNzIsNDUgKzE3MCw0NSBAQAogfTsKIAogc3RhdGljIElSX0tFWVRBQl9UWVBFIGF2YWNzc21hcnRfY29kZXNbSVJfS0VZVEFCX1NJWkVdID0gewotICAgICAgICBbIDMwIF0gPSBLRVlfUE9XRVIsCQkvLyBwb3dlcgorCVsgMzAgXSA9IEtFWV9QT1dFUiwJCS8vIHBvd2VyCiAJWyAyOCBdID0gS0VZX1NFQVJDSCwJCS8vIHNjYW4KLSAgICAgICAgWyAgNyBdID0gS0VZX1NFTEVDVCwJCS8vIHNvdXJjZQorCVsgIDcgXSA9IEtFWV9TRUxFQ1QsCQkvLyBzb3VyY2UKIAogCVsgMjIgXSA9IEtFWV9WT0xVTUVVUCwKIAlbIDIwIF0gPSBLRVlfVk9MVU1FRE9XTiwKLSAgICAgICAgWyAzMSBdID0gS0VZX0NIQU5ORUxVUCwKKwlbIDMxIF0gPSBLRVlfQ0hBTk5FTFVQLAogCVsgMjMgXSA9IEtFWV9DSEFOTkVMRE9XTiwKIAlbIDI0IF0gPSBLRVlfTVVURSwKIAogCVsgIDIgXSA9IEtFWV9LUDAsCi0gICAgICAgIFsgIDEgXSA9IEtFWV9LUDEsCi0gICAgICAgIFsgMTEgXSA9IEtFWV9LUDIsCi0gICAgICAgIFsgMjcgXSA9IEtFWV9LUDMsCi0gICAgICAgIFsgIDUgXSA9IEtFWV9LUDQsCi0gICAgICAgIFsgIDkgXSA9IEtFWV9LUDUsCi0gICAgICAgIFsgMjEgXSA9IEtFWV9LUDYsCisJWyAgMSBdID0gS0VZX0tQMSwKKwlbIDExIF0gPSBLRVlfS1AyLAorCVsgMjcgXSA9IEtFWV9LUDMsCisJWyAgNSBdID0gS0VZX0tQNCwKKwlbICA5IF0gPSBLRVlfS1A1LAorCVsgMjEgXSA9IEtFWV9LUDYsCiAJWyAgNiBdID0gS0VZX0tQNywKLSAgICAgICAgWyAxMCBdID0gS0VZX0tQOCwKKwlbIDEwIF0gPSBLRVlfS1A4LAogCVsgMTggXSA9IEtFWV9LUDksCiAJWyAxNiBdID0gS0VZX0tQRE9ULAogCiAJWyAgMyBdID0gS0VZX1RVTkVSLAkJLy8gdHYvZm0KLSAgICAgICAgWyAgNCBdID0gS0VZX1JFV0lORCwJCS8vIGZtIHR1bmluZyBsZWZ0IG9yIGZ1bmN0aW9uIGxlZnQKLSAgICAgICAgWyAxMiBdID0gS0VZX0ZPUldBUkQsCQkvLyBmbSB0dW5pbmcgcmlnaHQgb3IgZnVuY3Rpb24gcmlnaHQKKwlbICA0IF0gPSBLRVlfUkVXSU5ELAkJLy8gZm0gdHVuaW5nIGxlZnQgb3IgZnVuY3Rpb24gbGVmdAorCVsgMTIgXSA9IEtFWV9GT1JXQVJELAkJLy8gZm0gdHVuaW5nIHJpZ2h0IG9yIGZ1bmN0aW9uIHJpZ2h0CiAKIAlbICAwIF0gPSBLRVlfUkVDT1JELAotICAgICAgICBbICA4IF0gPSBLRVlfU1RPUCwKLSAgICAgICAgWyAxNyBdID0gS0VZX1BMQVksCisJWyAgOCBdID0gS0VZX1NUT1AsCisJWyAxNyBdID0gS0VZX1BMQVksCiAKIAlbIDI1IF0gPSBLRVlfWk9PTSwKIAlbIDE0IF0gPSBLRVlfTUVOVSwJCS8vIGZ1bmN0aW9uCiAJWyAxOSBdID0gS0VZX0FHQUlOLAkJLy8gcmVjYWxsCiAJWyAyOSBdID0gS0VZX1JFU1RBUlQsCQkvLyByZXNldAorCVsgMjYgXSA9IEtFWV9TSFVGRkxFLAkJLy8gc25hcHNob3Qvc2h1ZmZsZQogCiAvLyBGSVhNRQogCVsgMTMgXSA9IEtFWV9GMjEsCQkvLyBtdHMKLSAgICAgICAgWyAxNSBdID0gS0VZX0YyMiwJCS8vIG1pbgotCVsgMjYgXSA9IEtFWV9GMjMsCQkvLyBmcmVlemUKKwlbIDE1IF0gPSBLRVlfRjIyLAkJLy8gbWluCiB9OwogCiAvKiBBbGV4IEhlcm1hbm4gPGdhYWZAZ214Lm5ldD4gKi8KQEAgLTMwOCw2ICszMDYsMTAyIEBACiAJWyAzMiBdID0gS0VZX0xBTkdVQUdFLAogCVsgMzMgXSA9IEtFWV9TTEVFUCwKIH07CisKKy8qIE1pY2hhZWwgVG9rYXJldiA8bWp0QHRscy5tc2sucnU+CisgICBodHRwOi8vd3d3LmNvcnBpdC5ydS9tanQvYmVob2xkVFYvcmVtb3RlX2NvbnRyb2wuanBnCisgICBrZXl0YWJsZSBpcyB1c2VkIGJ5IE1BTkxJIE1UVjAwWzEyXSBhbmQgQmVob2xkVFYgNDBbMTNdIGF0CisgICBsZWFzdCwgYW5kIHByb2JhYmx5IG90aGVyIGNhcmRzIHRvby4KKyAgIFRoZSAiYXNjaWktYXJ0IHBpY3R1cmUiIGJlbG93IChpbiBjb21tZW50cywgZmlyc3Qgcm93CisgICBpcyB0aGUga2V5Y29kZSBpbiBoZXgsIGFuZCBzdWJzZXF1ZW50IHJvdyhzKSBzaG93cworICAgdGhlIGJ1dHRvbiBsYWJlbHMgKHNldmVyYWwgdmFyaWFudHMgd2hlbiBhcHByb3ByaWF0ZSkKKyAgIGhlbHBzIHRvIGRlc2NpZGUgd2hpY2gga2V5Y29kZXMgdG8gYXNzaWduIHRvIHRoZSBidXR0b25zLgorICovCitzdGF0aWMgSVJfS0VZVEFCX1RZUEUgbWFubGlfY29kZXNbSVJfS0VZVEFCX1NJWkVdID0geworCisJLyogIDB4MWMgICAgICAgICAgICAweDEyICAqCisJICogRlVOQ1RJT04gICAgICAgICBQT1dFUiAqCisJICogICBGTSAgICAgICAgICAgICAgKHwpICAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAqLworCVsgMHgxYyBdID0gS0VZX1JBRElPLAkvKlhYWCovCisJWyAweDEyIF0gPSBLRVlfUE9XRVIsCisKKwkvKiAgMHgwMSAgICAweDAyICAgIDB4MDMgICoKKwkgKiAgIDEgICAgICAgMiAgICAgICAzICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgMHgwNCAgICAweDA1ICAgIDB4MDYgICoKKwkgKiAgIDQgICAgICAgNSAgICAgICA2ICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgMHgwNyAgICAweDA4ICAgIDB4MDkgICoKKwkgKiAgIDcgICAgICAgOCAgICAgICA5ICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICovCisJWyAweDAxIF0gPSBLRVlfS1AxLAorCVsgMHgwMiBdID0gS0VZX0tQMiwKKwlbIDB4MDMgXSA9IEtFWV9LUDMsCisJWyAweDA0IF0gPSBLRVlfS1A0LAorCVsgMHgwNSBdID0gS0VZX0tQNSwKKwlbIDB4MDYgXSA9IEtFWV9LUDYsCisJWyAweDA3IF0gPSBLRVlfS1A3LAorCVsgMHgwOCBdID0gS0VZX0tQOCwKKwlbIDB4MDkgXSA9IEtFWV9LUDksCisKKwkvKiAgMHgwYSAgICAweDAwICAgIDB4MTcgICoKKwkgKiBSRUNBTEwgICAgMCAgICAgICsxMDAgICoKKwkgKiAgICAgICAgICAgICAgICAgIFBMVVMgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICovCisJWyAweDBhIF0gPSBLRVlfQUdBSU4sCS8qWFhYIEtFWV9SRVdJTkQ/ICovCisJWyAweDAwIF0gPSBLRVlfS1AwLAorCVsgMHgxNyBdID0gS0VZX0RJR0lUUywJLypYWFgqLworCisJLyogIDB4MTQgICAgICAgICAgICAweDEwICAqCisJICogIE1FTlUgICAgICAgICAgICBJTkZPICAqCisJICogIE9TRCAgICAgICAgICAgICAgICAgICAqLworCVsgMHgxNCBdID0gS0VZX01FTlUsCisJWyAweDEwIF0gPSBLRVlfSU5GTywKKworCS8qICAgICAgICAgIDB4MGIgICAgICAgICAgKgorCSAqICAgICAgICAgICBVcCAgICAgICAgICAgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqICAweDE4ICAgIDB4MTYgICAgMHgwYyAgKgorCSAqICBMZWZ0ICAgICBPayAgICAgUmlnaHQgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgKgorCSAqICAgICAgICAgMHgwMTUgICAgICAgICAgKgorCSAqICAgICAgICAgRG93biAgICAgICAgICAgKgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlbIDB4MGIgXSA9IEtFWV9VUCwJLypYWFggS0VZX1NDUk9MTFVQPyAqLworCVsgMHgxOCBdID0gS0VZX0xFRlQsCS8qWFhYIEtFWV9CQUNLPyAqLworCVsgMHgxNiBdID0gS0VZX09LLAkvKlhYWCBLRVlfU0VMRUNUPyBLRVlfRU5URVI/ICovCisJWyAweDBjIF0gPSBLRVlfUklHSFQsCS8qWFhYIEtFWV9GT1JXQVJEPyAqLworCVsgMHgxNSBdID0gS0VZX0RPV04sCS8qWFhYIEtFWV9TQ1JPTExET1dOPyAqLworCisJLyogIDB4MTEgICAgICAgICAgICAweDBkICAqCisJICogIFRWL0FWICAgICAgICAgICBNT0RFICAqCisJICogIFNPVVJDRSAgICAgICAgIFNURVJFTyAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAqLworCVsgMHgxMSBdID0gS0VZX1RWLAkvKlhYWCovCisJWyAweDBkIF0gPSBLRVlfTU9ERSwJLypYWFggdGhlcmUncyBubyBLRVlfU1RFUkVPICovCisKKwkvKiAgMHgwZiAgICAweDFiICAgIDB4MWEgICoKKwkgKiAgQVVESU8gICBWb2wrICAgIENoYW4rICoKKwkgKiAgICAgICAgVElNRVNISUZUPz8/ICAgICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICoKKwkgKiAgMHgwZSAgICAweDFmICAgIDB4MWUgICoKKwkgKiAgU0xFRVAgICBWb2wtICAgIENoYW4tICoKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICovCisJWyAweDBmIF0gPSBLRVlfQVVESU8sCisJWyAweDFiIF0gPSBLRVlfVk9MVU1FVVAsCisJWyAweDFhIF0gPSBLRVlfQ0hBTk5FTFVQLAorCVsgMHgwZSBdID0gS0VZX1NMRUVQLAkvKlhYWCBtYXliZSBLRVlfUEFVU0UgKi8KKwlbIDB4MWYgXSA9IEtFWV9WT0xVTUVET1dOLAorCVsgMHgxZSBdID0gS0VZX0NIQU5ORUxET1dOLAorCisJLyogICAgICAgICAweDEzICAgICAweDE5ICAqCisJICogICAgICAgICBNVVRFICAgU05BUFNIT1QqCisJICogICAgICAgICAgICAgICAgICAgICAgICAqLworCVsgMHgxMyBdID0gS0VZX01VVEUsCisJWyAweDE5IF0gPSBLRVlfUkVDT1JELAkvKlhYWCovCisKKwkvLyAweDFkIHVudXNlZCA/Cit9OwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgaW50IGJ1aWxkX2tleShzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldikKQEAgLTM3OSw3ICs0NzMsNyBAQAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlWSURFTzIwMDA6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMDoKLQljYXNlIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTToKKyAgICAgICAgY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWVRWUExBVElOVU1fRk06CiAJCWlyX2NvZGVzICAgICA9IGZseXZpZGVvX2NvZGVzOwogCQltYXNrX2tleWNvZGUgPSAweEVDMDAwMDA7CiAJCW1hc2tfa2V5ZG93biA9IDB4MDA0MDAwMDsKQEAgLTM5MywyMCArNDg3LDI1IEBACiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjU6Ci0gICAgICAgICAgICAgICAgaXJfY29kZXMgICAgID0gZXp0dl9jb2RlczsKLSAgICAgICAgICAgICAgICBtYXNrX2tleWNvZGUgPSAweDAwMDE3YzsKLSAgICAgICAgICAgICAgICBtYXNrX2tleXVwICAgPSAweDAwMDAwMjsKKwkJaXJfY29kZXMgICAgID0gZXp0dl9jb2RlczsKKwkJbWFza19rZXljb2RlID0gMHgwMDAxN2M7CisJCW1hc2tfa2V5dXAgICA9IDB4MDAwMDAyOwogCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKLSAgICAgICAgICAgICAgICBicmVhazsKKwkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZBQ1NTTUFSVFRWOgotCSAgICAgICAgaXJfY29kZXMgICAgID0gYXZhY3NzbWFydF9jb2RlczsKKwkJaXJfY29kZXMgICAgID0gYXZhY3NzbWFydF9jb2RlczsKIAkJbWFza19rZXljb2RlID0gMHgwMDAwMUY7CiAJCW1hc2tfa2V5dXAgICA9IDB4MDAwMDIwOwogCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX01EMjgxOToKKwljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlQ6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDU6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDc6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9TVFVESU9fMzA1OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNzoKKwljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTToKIAkJaXJfY29kZXMgICAgID0gbWQyODE5X2NvZGVzOwogCQltYXNrX2tleWNvZGUgPSAweDAwMDdDODsKIAkJbWFza19rZXlkb3duID0gMHgwMDAwMTA7CkBAIC00MTUsNyArNTE0LDE2IEBACiAJCXNhYV9zZXRiKFNBQTcxMzRfR1BJT19HUE1PREUwLCAweDQpOwogCQlzYWFfc2V0YihTQUE3MTM0X0dQSU9fR1BTVEFUVVMwLCAweDQpOwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfTUFOTElfTVRWMDAxOgorCWNhc2UgU0FBNzEzNF9CT0FSRF9NQU5MSV9NVFYwMDI6CisJCWlyX2NvZGVzICAgICA9IG1hbmxpX2NvZGVzOworCQltYXNrX2tleWNvZGUgPSAweDAwMWYwMDsKKwkJbWFza19rZXl1cCAgID0gMHgwMDQwMDA7CisJCW1hc2tfa2V5ZG93biA9IDB4MDAyMDAwOworCQlwb2xsaW5nICAgICAgPSA1MDsgLy8gbXMKKwkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9QVlI6CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSToKIAkJaXJfY29kZXMgICAgID0gdmlkZW9tYXRlX3R2X3B2cl9jb2RlczsKIAkJbWFza19rZXljb2RlID0gMHgwMDAwM0Y7CiAJCW1hc2tfa2V5dXAgICA9IDB4NDAwMDAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtb3NzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwppbmRleCA2YjZhNjQzLi5iNWJlZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1vc3MuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtb3NzLmMsdiAxLjEzIDIwMDQvMTIvMTAgMTI6MzM6Mzkga3JheGVsIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQtb3NzLmMsdiAxLjE3IDIwMDUvMDYvMjggMjM6NDE6NDcgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogb3NzIGRzcCBpbnRlcmZhY2UKQEAgLTQ5LDcgKzQ5LDYgQEAKIAogc3RhdGljIGludCBkc3BfYnVmZmVyX2NvbmYoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCBibGtzaXplLCBpbnQgYmxvY2tzKQogewotCWJsa3NpemUgJj0gfjB4ZmY7CiAJaWYgKGJsa3NpemUgPCAweDEwMCkKIAkJYmxrc2l6ZSA9IDB4MTAwOwogCWlmIChibGtzaXplID4gMHgxMDAwMCkKQEAgLTU3LDggKzU2LDYgQEAKIAogCWlmIChibG9ja3MgPCAyKQogCQlibG9ja3MgPSAyOwotICAgICAgICB3aGlsZSAoKGJsa3NpemUgKiBibG9ja3MpICYgflBBR0VfTUFTSykKLQkJYmxvY2tzKys7CiAJaWYgKChibGtzaXplICogYmxvY2tzKSA+IDEwMjQqMTAyNCkKIAkJYmxvY2tzID0gMTAyNCoxMDI0IC8gYmxrc2l6ZTsKIApAQCAtNzksNyArNzYsNyBAQAogCQlCVUcoKTsKIAl2aWRlb2J1Zl9kbWFfaW5pdCgmZGV2LT5vc3MuZG1hKTsKIAllcnIgPSB2aWRlb2J1Zl9kbWFfaW5pdF9rZXJuZWwoJmRldi0+b3NzLmRtYSwgUENJX0RNQV9GUk9NREVWSUNFLAotCQkJCSAgICAgICBkZXYtPm9zcy5idWZzaXplID4+IFBBR0VfU0hJRlQpOworCQkJCSAgICAgICAoZGV2LT5vc3MuYnVmc2l6ZSArIFBBR0VfU0laRSkgPj4gUEFHRV9TSElGVCk7CiAJaWYgKDAgIT0gZXJyKQogCQlyZXR1cm4gZXJyOwogCXJldHVybiAwOwpAQCAtMTYzLDEwICsxNjAsMTEgQEAKIAkJCWZtdCB8PSAweDA0OwogCQlmbXQgfD0gKFRWID09IGRldi0+b3NzLmlucHV0KSA/IDB4YzAgOiAweDgwOwogCi0JCXNhYV93cml0ZWIoU0FBNzEzNF9OVU1fU0FNUExFUzAsIChkZXYtPm9zcy5ibGtzaXplICYgMHgwMDAwZmYpKTsKLQkJc2FhX3dyaXRlYihTQUE3MTM0X05VTV9TQU1QTEVTMSwgKGRldi0+b3NzLmJsa3NpemUgJiAweDAwZmYwMCkgPj4gIDgpOwotCQlzYWFfd3JpdGViKFNBQTcxMzRfTlVNX1NBTVBMRVMyLCAoZGV2LT5vc3MuYmxrc2l6ZSAmIDB4ZmYwMDAwKSA+PiAxNik7CisJCXNhYV93cml0ZWIoU0FBNzEzNF9OVU1fU0FNUExFUzAsICgoZGV2LT5vc3MuYmxrc2l6ZSAtIDEpICYgMHgwMDAwZmYpKTsKKwkJc2FhX3dyaXRlYihTQUE3MTM0X05VTV9TQU1QTEVTMSwgKChkZXYtPm9zcy5ibGtzaXplIC0gMSkgJiAweDAwZmYwMCkgPj4gIDgpOworCQlzYWFfd3JpdGViKFNBQTcxMzRfTlVNX1NBTVBMRVMyLCAoKGRldi0+b3NzLmJsa3NpemUgLSAxKSAmIDB4ZmYwMDAwKSA+PiAxNik7CiAJCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19GT1JNQVRfQ1RSTCwgZm10KTsKKwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzOgogCWNhc2UgUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzU6CkBAIC01NTgsMjEgKzU1NiwyOCBAQAogc3RhdGljIGludAogbWl4ZXJfcmVjc3JjXzcxMzMoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCiB7Ci0JdTMyIHZhbHVlID0gMHhiYmJiYmI7CisJdTMyIGFuYWJhciwgeGJhcmluOwogCisJeGJhcmluID0gMHgwMzsgLy8gYWRjCisgICAgYW5hYmFyID0gMDsKIAlzd2l0Y2ggKGRldi0+b3NzLmlucHV0KSB7CiAJY2FzZSBUVjoKLQkJdmFsdWUgPSAweGJiYmIxMDsgIC8qIE1BSU4gKi8KKwkJeGJhcmluID0gMDsgLy8gRGVtb2R1bGF0b3IKKyAgICAgICAgYW5hYmFyID0gMjsgLy8gREFDcwogCQlicmVhazsKIAljYXNlIExJTkUxOgotCQl2YWx1ZSA9IDB4YmJiYjMyOyAgLyogQVVYMSAqLworCQlhbmFiYXIgPSAwOyAgLy8gYXV4MSwgYXV4MQogCQlicmVhazsKIAljYXNlIExJTkUyOgogCWNhc2UgTElORTJfTEVGVDoKLQkJdmFsdWUgPSAweGJiYmI1NDsgIC8qIEFVWDIgKi8KKwkJYW5hYmFyID0gOTsgIC8vIGF1eDIsIGF1eDIKIAkJYnJlYWs7CiAJfQotCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NmMgPj4gMiwgdmFsdWUpOworICAgIC8qIG91dHB1dCB4YmFyIGFsd2F5cyBtYWluIGNoYW5uZWwgKi8KKwlzYWFfZHNwX3dyaXRlbChkZXYsIDB4NDZjID4+IDIsIDB4YmJiYjEwKTsKKwlzYWFfZHNwX3dyaXRlbChkZXYsIDB4NDY0ID4+IDIsIHhiYXJpbik7CisJc2FhX3dyaXRlbCgweDU5NCA+PiAyLCBhbmFiYXIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgxNyw3ICs4MjIsNyBAQAogCQkJcmVnID0gU0FBNzEzNF9SU19CQTEoNik7CiAJfSBlbHNlIHsKIAkJLyogZXZlbiAqLwotCQlpZiAoMCA9PSAoZGV2LT5vc3MuZG1hX2JsayAmIDB4MDApKQorCQlpZiAoMSA9PSAoZGV2LT5vc3MuZG1hX2JsayAmIDB4MDEpKQogCQkJcmVnID0gU0FBNzEzNF9SU19CQTIoNik7CiAJfQogCWlmICgwID09IHJlZykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXRzLmMKaW5kZXggMzQ1ZWIyYS4uNGRkOWYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10cy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogc2FhNzEzNC10cy5jLHYgMS4xNCAyMDA1LzAyLzAzIDEwOjI0OjMzIGtyYXhlbCBFeHAgJAorICogJElkOiBzYWE3MTM0LXRzLmMsdiAxLjE1IDIwMDUvMDYvMTQgMjI6NDg6MTggaGhhY2ttYW5uIEV4cCAkCiAgKgogICogZGV2aWNlIGRyaXZlciBmb3IgcGhpbGlwcyBzYWE3MTM0IGJhc2VkIFRWIGNhcmRzCiAgKiB2aWRlbzRsaW51eCB2aWRlbyBpbnRlcmZhY2UKQEAgLTIyMSwxMCArMjIxLDEwIEBACiAJaWYgKGRldi0+dHNfcS5jdXJyKSB7CiAJCWZpZWxkID0gZGV2LT50c19xLmN1cnItPnZiLmZpZWxkOwogCQlpZiAoZmllbGQgPT0gVjRMMl9GSUVMRF9UT1ApIHsKLQkJCWlmICgoc3RhdHVzICYgMHgxMDAwMDApICE9IDB4MDAwMDAwKQorCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgxMDAwMDApCiAJCQkJZ290byBkb25lOwogCQl9IGVsc2UgewotCQkJaWYgKChzdGF0dXMgJiAweDEwMDAwMCkgIT0gMHgxMDAwMDApCisJCQlpZiAoKHN0YXR1cyAmIDB4MTAwMDAwKSAhPSAweDAwMDAwMCkKIAkJCQlnb3RvIGRvbmU7CiAJCX0KIAkJc2FhNzEzNF9idWZmZXJfZmluaXNoKGRldiwmZGV2LT50c19xLFNUQVRFX0RPTkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdHZhdWRpby5jCmluZGV4IGVjYWMxM2MuLmVlYWZhNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXR2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC10dmF1ZGlvLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LXR2YXVkaW8uYyx2IDEuMjIgMjAwNS8wMS8wNyAxMzoxMToxOSBrcmF4ZWwgRXhwICQKKyAqICRJZDogc2FhNzEzNC10dmF1ZGlvLmMsdiAxLjMwIDIwMDUvMDYvMjggMjM6NDE6NDcgbWtydWZreSBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogdHYgYXVkaW8gZGVjb2RlciAoZm0gc3RlcmVvLCBuaWNhbSwgLi4uKQpAQCAtMTY5LDcgKzE2OSw3IEBACiAJaW50IGNsb2NrID0gc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0uYXVkaW9fY2xvY2s7CiAKIAlpZiAoVU5TRVQgIT0gYXVkaW9fY2xvY2tfb3ZlcnJpZGUpCi0JICAgICAgICBjbG9jayA9IGF1ZGlvX2Nsb2NrX292ZXJyaWRlOworCQljbG9jayA9IGF1ZGlvX2Nsb2NrX292ZXJyaWRlOwogCiAJLyogaW5pdCBhbGwgYXVkaW8gcmVnaXN0ZXJzICovCiAJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX1BMTF9DVFJMLCAgIDB4MDApOwpAQCAtMTgxLDcgKzE4MSw4IEBACiAJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX0NMT0NLMCwgICAgICBjbG9jayAgICAgICAgJiAweGZmKTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfQVVESU9fQ0xPQ0sxLCAgICAgKGNsb2NrID4+ICA4KSAmIDB4ZmYpOwogCXNhYV93cml0ZWIoU0FBNzEzNF9BVURJT19DTE9DSzIsICAgICAoY2xvY2sgPj4gMTYpICYgMHhmZik7Ci0Jc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX1BMTF9DVFJMLCAgIDB4MDEpOworCS8vIGZyYW1lIGxvY2tlZCBhdWRpbyB3YXMgcmVwb3J0ZWQgbm90IHRvIGJlIHJlbGlhYmxlCisJc2FhX3dyaXRlYihTQUE3MTM0X0FVRElPX1BMTF9DVFJMLCAgIDB4MDIpOwogCiAJc2FhX3dyaXRlYihTQUE3MTM0X05JQ0FNX0VSUk9SX0xPVywgIDB4MTQpOwogCXNhYV93cml0ZWIoU0FBNzEzNF9OSUNBTV9FUlJPUl9ISUdILCAweDUwKTsKQEAgLTIxOCwxNCArMjE5LDE3IEBACiAJaW4gICA9IGRldi0+aW5wdXQ7CiAJbXV0ZSA9IChkZXYtPmN0bF9tdXRlIHx8CiAJCShkZXYtPmF1dG9tdXRlICAmJiAgKCZjYXJkKGRldikucmFkaW8pICE9IGluKSk7Ci0JaWYgKFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMwID09IGRldi0+cGNpLT5kZXZpY2UgJiYKLQkgICAgY2FyZChkZXYpLm11dGUubmFtZSkgewotCQkvKiA3MTMwIC0gd2UnbGwgbXV0ZSB1c2luZyBzb21lIHVuY29ubmVjdGVkIGF1ZGlvIGlucHV0ICovCisJaWYgKGNhcmQoZGV2KS5tdXRlLm5hbWUpIHsKKwkJLyoKKwkJICogNzEzMCAtIHdlJ2xsIG11dGUgdXNpbmcgc29tZSB1bmNvbm5lY3RlZCBhdWRpbyBpbnB1dAorCQkgKiA3MTM0IC0gd2UnbGwgcHJvYmFibHkgc2hvdWxkIHN3aXRjaCBleHRlcm5hbCBtdXggd2l0aCBncGlvCisJCSAqLwogCQlpZiAobXV0ZSkKIAkJCWluID0gJmNhcmQoZGV2KS5tdXRlOwogCX0KKwogCWlmIChkZXYtPmh3X211dGUgID09IG11dGUgJiYKLQkgICAgZGV2LT5od19pbnB1dCA9PSBpbikgeworCQlkZXYtPmh3X2lucHV0ID09IGluKSB7CiAJCWRwcmludGsoIm11dGUvaW5wdXQ6IG5vdGhpbmcgdG8gZG8gW211dGU9JWQsaW5wdXQ9JXNdXG4iLAogCQkJbXV0ZSxpbi0+bmFtZSk7CiAJCXJldHVybjsKQEAgLTI1MCwxMCArMjU0LDE2IEBACiAJc2FhX2FuZG9yYihTQUE3MTM0X0FVRElPX0ZPUk1BVF9DVFJMLCAweGMwLCBhdXNlbCk7CiAJc2FhX2FuZG9yYihTQUE3MTM0X0FOQUxPR19JT19TRUxFQ1QsIDB4MDgsIGljcyk7CiAJc2FhX2FuZG9yYihTQUE3MTM0X0FOQUxPR19JT19TRUxFQ1QsIDB4MDcsIG9jcyk7CisJLy8gZm9yIG9zcywgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGNsb2NrIGNvbmZpZ3VyYXRpb24KKwlpZiAoaW4tPmFtdXggPT0gVFYpCisJCXNhYV9hbmRvcmIoU0FBNzEzNF9TSUZfU0FNUExFX0ZSRVEsICAgMHgwMywgMHgwMCk7CisJZWxzZQorCQlzYWFfYW5kb3JiKFNBQTcxMzRfU0lGX1NBTVBMRV9GUkVRLCAgIDB4MDMsIDB4MDEpOwogCiAJLyogc3dpdGNoIGdwaW8tY29ubmVjdGVkIGV4dGVybmFsIGF1ZGlvIG11eCAqLwogCWlmICgwID09IGNhcmQoZGV2KS5ncGlvbWFzaykKIAkJcmV0dXJuOworCiAJbWFzayA9IGNhcmQoZGV2KS5ncGlvbWFzazsKIAlzYWFfYW5kb3JsKFNBQTcxMzRfR1BJT19HUE1PREUwID4+IDIsICAgbWFzaywgbWFzayk7CiAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIG1hc2ssIGluLT5ncGlvKTsKQEAgLTMzMywxMyArMzQzLDggQEAKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZSgpOwogCQl9IGVsc2UgewotI2lmIDAKLQkJCS8qIGhtbSwgdGhhdCBvbmUgZG9lc24ndCByZXR1cm4gb24gd2FrZXVwIC4uLiAqLwotCQkJbXNsZWVwX2ludGVycnVwdGlibGUodGltZW91dCk7Ci0jZWxzZQogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0jZW5kaWYKIAkJfQogCX0KIAlyZW1vdmVfd2FpdF9xdWV1ZSgmZGV2LT50aHJlYWQud3EsICZ3YWl0KTsKQEAgLTM5NCwyNyArMzk5LDEwIEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi0jaWYgMAotc3RhdGljIHZvaWQgc2lmZGVidWdfZHVtcF9yZWdzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQotewotCXByaW50X3JlZ2IoQVVESU9fU1RBVFVTKTsKLQlwcmludF9yZWdiKElERU5UX1NJRik7Ci0JcHJpbnRfcmVnYihMRVZFTF9SRUFET1VUMSk7Ci0JcHJpbnRfcmVnYihMRVZFTF9SRUFET1VUMik7Ci0JcHJpbnRfcmVnYihEQ1hPX0lERU5UX0NUUkwpOwotCXByaW50X3JlZ2IoREVNT0RVTEFUT1IpOwotCXByaW50X3JlZ2IoQUdDX0dBSU5fU0VMRUNUKTsKLQlwcmludF9yZWdiKE1PTklUT1JfU0VMRUNUKTsKLQlwcmludF9yZWdiKEZNX0RFRU1QSEFTSVMpOwotCXByaW50X3JlZ2IoRk1fREVNQVRSSVgpOwotCXByaW50X3JlZ2IoU0lGX1NBTVBMRV9GUkVRKTsKLQlwcmludF9yZWdiKEFOQUxPR19JT19TRUxFQ1QpOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdHZhdWRpb19nZXRzdGVyZW8oc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIHN0cnVjdCBzYWE3MTM0X3R2YXVkaW8gKmF1ZGlvKQogewotCV9fdTMyIGlkcCxuaWNhbTsKKwlfX3UzMiBpZHAsIG5pY2FtLCBuaWNhbV9zdGF0dXM7CiAJaW50IHJldHZhbCA9IC0xOwogCiAJc3dpdGNoIChhdWRpby0+bW9kZSkgewpAQCAtNDM2LDE5ICs0MjQsMjQgQEAKIAkJYnJlYWs7CiAJY2FzZSBUVkFVRElPX05JQ0FNX0ZNOgogCWNhc2UgVFZBVURJT19OSUNBTV9BTToKLQkJbmljYW0gPSBzYWFfcmVhZGIoU0FBNzEzNF9OSUNBTV9TVEFUVVMpOworCQluaWNhbSA9IHNhYV9yZWFkYihTQUE3MTM0X0FVRElPX1NUQVRVUyk7CiAJCWRwcmludGsoImdldHN0ZXJlbzogbmljYW09MHgleFxuIixuaWNhbSk7Ci0JCXN3aXRjaCAobmljYW0gJiAweDBiKSB7Ci0JCWNhc2UgMHgwOToKLQkJCXJldHZhbCA9IFY0TDJfVFVORVJfU1VCX0xBTkcxIHwgVjRMMl9UVU5FUl9TVUJfTEFORzI7Ci0JCQlicmVhazsKLQkJY2FzZSAweDBhOgotCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTyB8IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKLQkJCWJyZWFrOwotCQljYXNlIDB4MDg6Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJYnJlYWs7CisJCWlmIChuaWNhbSAmIDB4MSkgeworCQkJbmljYW1fc3RhdHVzID0gc2FhX3JlYWRiKFNBQTcxMzRfTklDQU1fU1RBVFVTKTsKKwkJCWRwcmludGsoImdldHN0ZXJlbzogbmljYW1fc3RhdHVzPTB4JXhcbiIsIG5pY2FtX3N0YXR1cyk7CisKKwkJCXN3aXRjaCAobmljYW1fc3RhdHVzICYgMHgwMykgeworCQkJICAgIGNhc2UgMHgwMToKKwkJCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9MQU5HMSB8IFY0TDJfVFVORVJfU1VCX0xBTkcyOworCQkJCWJyZWFrOworCQkJICAgIGNhc2UgMHgwMjoKKwkJCQlyZXR2YWwgPSBWNEwyX1RVTkVSX1NVQl9NT05PIHwgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOworCQkJCWJyZWFrOworCQkJICAgIGRlZmF1bHQ6CisJCQkJcmV0dmFsID0gVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE5vIG5pY2FtIGRldGVjdGVkICovCiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtNDg0LDE1ICs0NzcsMTUgQEAKIAkJYnJlYWs7CiAJY2FzZSBUVkFVRElPX0ZNX0tfU1RFUkVPOgogCWNhc2UgVFZBVURJT19GTV9CR19TVEVSRU86CisJY2FzZSBUVkFVRElPX05JQ0FNX0FNOgorCWNhc2UgVFZBVURJT19OSUNBTV9GTToKIAkJZHByaW50aygic2V0c3RlcmVvIFtmbV0gPT4gJXNcbiIsCiAJCQluYW1lWyBtb2RlICUgQVJSQVlfU0laRShuYW1lKSBdKTsKIAkJcmVnID0gZm1bIG1vZGUgJSBBUlJBWV9TSVpFKGZtKSBdOwogCQlzYWFfd3JpdGViKFNBQTcxMzRfRk1fREVNQVRSSVgsIHJlZyk7CiAJCWJyZWFrOwogCWNhc2UgVFZBVURJT19GTV9TQVRfU1RFUkVPOgotCWNhc2UgVFZBVURJT19OSUNBTV9BTToKLQljYXNlIFRWQVVESU9fTklDQU1fRk06Ci0JCS8qIEZJWE1FICovCisJCS8qIE5vdCBpbXBsZW1lbnRlZCAqLwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC01NzIsMTQgKzU2NSwxNCBAQAogCQl9IGVsc2UgaWYgKDAgIT0gZGV2LT5sYXN0X2NhcnJpZXIpIHsKIAkJCS8qIG5vIGNhcnJpZXIgLS0gdHJ5IGxhc3QgZGV0ZWN0ZWQgb25lIGFzIGZhbGxiYWNrICovCiAJCQljYXJyaWVyID0gZGV2LT5sYXN0X2NhcnJpZXI7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcy9hdWRpbzogYXVkaW8gY2FycmllciBzY2FuIGZhaWxlZCwgIgorCQkJZHByaW50ayhLRVJOX1dBUk5JTkcgIiVzL2F1ZGlvOiBhdWRpbyBjYXJyaWVyIHNjYW4gZmFpbGVkLCAiCiAJCQkgICAgICAgInVzaW5nICVkLiUwM2QgTUh6IFtsYXN0IGRldGVjdGVkXVxuIiwKIAkJCSAgICAgICBkZXYtPm5hbWUsIGNhcnJpZXIvMTAwMCwgY2FycmllciUxMDAwKTsKIAogCQl9IGVsc2UgewogCQkJLyogbm8gY2FycmllciArIG5vIGZhbGxiYWNrIC0tIHVzZSBkZWZhdWx0ICovCiAJCQljYXJyaWVyID0gZGVmYXVsdF9jYXJyaWVyOwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMvYXVkaW86IGF1ZGlvIGNhcnJpZXIgc2NhbiBmYWlsZWQsICIKKwkJCWRwcmludGsoS0VSTl9XQVJOSU5HICIlcy9hdWRpbzogYXVkaW8gY2FycmllciBzY2FuIGZhaWxlZCwgIgogCQkJICAgICAgICJ1c2luZyAlZC4lMDNkIE1IeiBbZGVmYXVsdF1cbiIsCiAJCQkgICAgICAgZGV2LT5uYW1lLCBjYXJyaWVyLzEwMDAsIGNhcnJpZXIlMTAwMCk7CiAJCX0KQEAgLTU5MSw3ICs1ODQsNyBAQAogCQkvKiBmaW5kIHRoZSBleGFjdCB0diBhdWRpbyBub3JtICovCiAJCWZvciAoYXVkaW8gPSBVTlNFVCwgaSA9IDA7IGkgPCBUVkFVRElPOyBpKyspIHsKIAkJCWlmIChkZXYtPnR2bm9ybS0+aWQgIT0gVU5TRVQgJiYKLQkJCSAgICAhKGRldi0+dHZub3JtLT5pZCAmIHR2YXVkaW9baV0uc3RkKSkKKwkJCQkhKGRldi0+dHZub3JtLT5pZCAmIHR2YXVkaW9baV0uc3RkKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICh0dmF1ZGlvW2ldLmNhcnIxICE9IGNhcnJpZXIpCiAJCQkJY29udGludWU7CkBAIC02OTgsMjQgKzY5MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAwCi1zdGF0aWMgaW50IHNhYV9kc3BfcmVhZGwoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYsIGludCByZWcsIHUzMiAqdmFsdWUpCi17Ci0JaW50IGVycjsKLQotCWQycHJpbnRrKCJkc3AgcmVhZCByZWcgMHgleFxuIiwgcmVnPDwyKTsKLQlzYWFfcmVhZGwocmVnKTsKLQllcnIgPSBzYWFfZHNwX3dhaXRfYml0KGRldixTQUE3MTM1X0RTUF9SV1NUQVRFX1JEQik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JKnZhbHVlID0gc2FhX3JlYWRsKHJlZyk7Ci0JZDJwcmludGsoImRzcCByZWFkICAgPT4gMHglMDZ4XG4iLCAqdmFsdWUgJiAweGZmZmZmZik7Ci0JZXJyID0gc2FhX2RzcF93YWl0X2JpdChkZXYsU0FBNzEzNV9EU1BfUldTVEFURV9JREEpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOwotfQotI2VuZGlmCiAKIGludCBzYWFfZHNwX3dyaXRlbChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IHJlZywgdTMyIHZhbHVlKQogewpAQCAtNzQ4LDMxICs3MjMsNTAgQEAKIHN0YXRpYyBpbnQgbXV0ZV9pbnB1dF83MTMzKHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2KQogewogCXUzMiByZWcgPSAwOworCXUzMiB4YmFyaW4sIHhiYXJvdXQ7CiAJaW50IG1hc2s7CisJc3RydWN0IHNhYTcxMzRfaW5wdXQgKmluOwogCisJLyogSGFjIDA1MDYgcm91dGUgT1NTIHNvdW5kIHNpbXVsdGFub3VzbHkgICovCisJeGJhcmluID0gMHgwMzsKIAlzd2l0Y2ggKGRldi0+aW5wdXQtPmFtdXgpIHsKIAljYXNlIFRWOgogCQlyZWcgPSAweDAyOworCQl4YmFyaW4gPSAwOwogCQlicmVhazsKIAljYXNlIExJTkUxOgogCQlyZWcgPSAweDAwOwogCQlicmVhazsKIAljYXNlIExJTkUyOgogCWNhc2UgTElORTJfTEVGVDoKLQkJcmVnID0gMHgwMTsKKwkJcmVnID0gMHgwOTsKIAkJYnJlYWs7CiAJfQotCWlmIChkZXYtPmN0bF9tdXRlKQorCXNhYV9kc3Bfd3JpdGVsKGRldiwgMHg0NjQgPj4gMiwgeGJhcmluKTsKKwlpZiAoZGV2LT5jdGxfbXV0ZSkgewogCQlyZWcgPSAweDA3OworCQl4YmFyb3V0ID0gMHhiYmJiYmI7CisJfSBlbHNlCisJCXhiYXJvdXQgPSAweGJiYmIxMDsKKwlzYWFfZHNwX3dyaXRlbChkZXYsIDB4NDZjID4+IDIsIHhiYXJvdXQpOworCiAJc2FhX3dyaXRlbCgweDU5NCA+PiAyLCByZWcpOwogCisKIAkvKiBzd2l0Y2ggZ3Bpby1jb25uZWN0ZWQgZXh0ZXJuYWwgYXVkaW8gbXV4ICovCiAgICAgICAgIGlmICgwICE9IGNhcmQoZGV2KS5ncGlvbWFzaykgewogICAgICAgICAJbWFzayA9IGNhcmQoZGV2KS5ncGlvbWFzazsKKworCQlpZiAoY2FyZChkZXYpLm11dGUubmFtZSAmJiBkZXYtPmN0bF9tdXRlKQorCQkJaW4gPSAmY2FyZChkZXYpLm11dGU7CisJCWVsc2UKKwkJCWluID0gZGV2LT5pbnB1dDsKKwogICAgICAgICAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BNT0RFMCA+PiAyLCAgIG1hc2ssIG1hc2spOwotICAgICAgICAJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIG1hc2ssIGRldi0+aW5wdXQtPmdwaW8pOwotICAgICAgICAJc2FhNzEzNF90cmFja19ncGlvKGRldixkZXYtPmlucHV0LT5uYW1lKTsKKyAgICAgICAgCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQU1RBVFVTMCA+PiAyLCBtYXNrLCBpbi0+Z3Bpbyk7CisgICAgICAgIAlzYWE3MTM0X3RyYWNrX2dwaW8oZGV2LGluLT5uYW1lKTsKIAl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYwppbmRleCA4Njk1NGNjLi4yOWU1MWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12YmkuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdmJpLmMsdiAxLjYgMjAwNC8xMi8xMCAxMjozMzozOSBrcmF4ZWwgRXhwICQKKyAqICRJZDogc2FhNzEzNC12YmkuYyx2IDEuNyAyMDA1LzA1LzI0IDIzOjEzOjA2IG5zaCBFeHAgJAogICoKICAqIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICogdmlkZW80bGludXggdmlkZW8gaW50ZXJmYWNlCkBAIC02MCwxMCArNjAsMTAgQEAKIAlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX0hfU1RBUlQyKHRhc2spLCBub3JtLT5oX3N0YXJ0ICAgICA+PiA4KTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX0hfU1RPUDEodGFzayksICBub3JtLT5oX3N0b3AgICAgICAmICAweGZmKTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX0hfU1RPUDIodGFzayksICBub3JtLT5oX3N0b3AgICAgICA+PiA4KTsKLQlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfU1RBUlQxKHRhc2spLCBub3JtLT52Ymlfdl9zdGFydCAmICAweGZmKTsKLQlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfU1RBUlQyKHRhc2spLCBub3JtLT52Ymlfdl9zdGFydCA+PiA4KTsKLQlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfU1RPUDEodGFzayksICBub3JtLT52Ymlfdl9zdG9wICAmICAweGZmKTsKLQlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfU1RPUDIodGFzayksICBub3JtLT52Ymlfdl9zdG9wICA+PiA4KTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfU1RBUlQxKHRhc2spLCBub3JtLT52Ymlfdl9zdGFydF8wICYgIDB4ZmYpOworCXNhYV93cml0ZWIoU0FBNzEzNF9WQklfVl9TVEFSVDIodGFzayksIG5vcm0tPnZiaV92X3N0YXJ0XzAgPj4gOCk7CisJc2FhX3dyaXRlYihTQUE3MTM0X1ZCSV9WX1NUT1AxKHRhc2spLCAgbm9ybS0+dmJpX3Zfc3RvcF8wICAmICAweGZmKTsKKwlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX1ZfU1RPUDIodGFzayksICBub3JtLT52Ymlfdl9zdG9wXzAgID4+IDgpOwogCiAJc2FhX3dyaXRlYihTQUE3MTM0X1ZCSV9IX1NDQUxFX0lOQzEodGFzayksICAgICAgICBWQklfU0NBTEUgJiAweGZmKTsKIAlzYWFfd3JpdGViKFNBQTcxMzRfVkJJX0hfU0NBTEVfSU5DMih0YXNrKSwgICAgICAgIFZCSV9TQ0FMRSA+PiA4KTsKQEAgLTEyNywxNiArMTI3LDEwIEBACiAJdW5zaWduZWQgaW50IGxpbmVzLCBsbGVuZ3RoLCBzaXplOwogCWludCBlcnI7CiAKLQlsaW5lcyAgID0gbm9ybS0+dmJpX3Zfc3RvcCAtIG5vcm0tPnZiaV92X3N0YXJ0ICsxOworCWxpbmVzICAgPSBub3JtLT52Ymlfdl9zdG9wXzAgLSBub3JtLT52Ymlfdl9zdGFydF8wICsxOwogCWlmIChsaW5lcyA+IFZCSV9MSU5FX0NPVU5UKQogCQlsaW5lcyA9IFZCSV9MSU5FX0NPVU5UOwotI2lmIDEKIAlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOwotI2Vsc2UKLQlsbGVuZ3RoID0gKG5vcm0tPmhfc3RvcCAtIG5vcm0tPmhfc3RhcnQgKzEpICogMjsKLQlpZiAobGxlbmd0aCA+IFZCSV9MSU5FX0xFTkdUSCkKLQkJbGxlbmd0aCA9IFZCSV9MSU5FX0xFTkdUSDsKLSNlbmRpZgogCXNpemUgPSBsaW5lcyAqIGxsZW5ndGggKiAyOwogCWlmICgwICE9IGJ1Zi0+dmIuYmFkZHIgICYmICBidWYtPnZiLmJzaXplIDwgc2l6ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzcsMTQgKzE3MSw4IEBACiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCWludCBsbGVuZ3RoLGxpbmVzOwogCi0JbGluZXMgICA9IGRldi0+dHZub3JtLT52Ymlfdl9zdG9wIC0gZGV2LT50dm5vcm0tPnZiaV92X3N0YXJ0ICsxOwotI2lmIDEKKwlsaW5lcyAgID0gZGV2LT50dm5vcm0tPnZiaV92X3N0b3BfMCAtIGRldi0+dHZub3JtLT52Ymlfdl9zdGFydF8wICsxOwogCWxsZW5ndGggPSBWQklfTElORV9MRU5HVEg7Ci0jZWxzZQotCWxsZW5ndGggPSAobm9ybS0+aF9zdG9wIC0gbm9ybS0+aF9zdGFydCArMSkgKiAyOwotCWlmIChsbGVuZ3RoID4gVkJJX0xJTkVfTEVOR1RIKQotCQlsbGVuZ3RoID0gVkJJX0xJTkVfTEVOR1RIOwotI2VuZGlmCiAJKnNpemUgPSBsaW5lcyAqIGxsZW5ndGggKiAyOwogCWlmICgwID09ICpjb3VudCkKIAkJKmNvdW50ID0gdmJpYnVmczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IDVkNjYwNjAuLmE0YzJmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtdmlkZW8uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IHNhYTcxMzQtdmlkZW8uYyx2IDEuMjggMjAwNS8wMi8xNSAxNTo1OTozNSBrcmF4ZWwgRXhwICQKKyAqICRJZDogc2FhNzEzNC12aWRlby5jLHYgMS4zNiAyMDA1LzA2LzI4IDIzOjQxOjQ3IG1rcnVma3kgRXhwICQKICAqCiAgKiBkZXZpY2UgZHJpdmVyIGZvciBwaGlsaXBzIHNhYTcxMzQgYmFzZWQgVFYgY2FyZHMKICAqIHZpZGVvNGxpbnV4IHZpZGVvIGludGVyZmFjZQpAQCAtMzEsOCArMzEsNiBAQAogI2luY2x1ZGUgInNhYTcxMzQtcmVnLmgiCiAjaW5jbHVkZSAic2FhNzEzNC5oIgogCi0jZGVmaW5lIFY0TDJfSTJDX0NMSUVOVFMgMQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19kZWJ1ZyAgID0gMDsKQEAgLTE1OCwxOCArMTU2LDIwIEBACiAJCS5oX3N0b3AgICAgICAgID0gNzE5LAlcCiAJCS52aWRlb192X3N0YXJ0ID0gMjQsCVwKIAkJLnZpZGVvX3Zfc3RvcCAgPSAzMTEsCVwKLQkJLnZiaV92X3N0YXJ0ICAgPSA3LAlcCi0JCS52Ymlfdl9zdG9wICAgID0gMjIsCVwKKwkJLnZiaV92X3N0YXJ0XzAgPSA3LAlcCisJCS52Ymlfdl9zdG9wXzAgID0gMjIsCVwKKwkJLnZiaV92X3N0YXJ0XzEgPSAzMTksICAgXAogCQkuc3JjX3RpbWluZyAgICA9IDQKIAogI2RlZmluZSBOT1JNXzUyNV82MAkJCVwKIAkJLmhfc3RhcnQgICAgICAgPSAwLAlcCiAJCS5oX3N0b3AgICAgICAgID0gNzAzLAlcCi0JCS52aWRlb192X3N0YXJ0ID0gMjIsCVwKLQkJLnZpZGVvX3Zfc3RvcCAgPSAyMisyMzksIFwKLQkJLnZiaV92X3N0YXJ0ICAgPSAxMCwgLyogRklYTUUgKi8gXAotCQkudmJpX3Zfc3RvcCAgICA9IDIxLCAvKiBGSVhNRSAqLyBcCi0JCS5zcmNfdGltaW5nICAgID0gMQorCQkudmlkZW9fdl9zdGFydCA9IDIzLAlcCisJCS52aWRlb192X3N0b3AgID0gMjYyLAlcCisJCS52Ymlfdl9zdGFydF8wID0gMTAsCVwKKwkJLnZiaV92X3N0b3BfMCAgPSAyMSwJXAorCQkudmJpX3Zfc3RhcnRfMSA9IDI3MywJXAorCQkuc3JjX3RpbWluZyAgICA9IDcKIAogc3RhdGljIHN0cnVjdCBzYWE3MTM0X3R2bm9ybSB0dm5vcm1zW10gPSB7CiAJewpAQCAtMjc0LDExICsyNzQsMTIgQEAKIAogCQkuaF9zdGFydCAgICAgICA9IDAsCiAJCS5oX3N0b3AgICAgICAgID0gNzE5LAotCQkudmlkZW9fdl9zdGFydCA9IDIyLAotCQkudmlkZW9fdl9zdG9wICA9IDIyKzIzOSwKLQkJLnZiaV92X3N0YXJ0ICAgPSAxMCwgLyogRklYTUUgKi8KLQkJLnZiaV92X3N0b3AgICAgPSAyMSwgLyogRklYTUUgKi8KLQkJLnNyY190aW1pbmcgICAgPSAxLAorICAJCS52aWRlb192X3N0YXJ0ID0gMjMsCisgIAkJLnZpZGVvX3Zfc3RvcCAgPSAyNjIsCisgIAkJLnZiaV92X3N0YXJ0XzAgPSAxMCwKKyAgCQkudmJpX3Zfc3RvcF8wICA9IDIxLAorICAJCS52Ymlfdl9zdGFydF8xID0gMjczLAorICAJCS5zcmNfdGltaW5nICAgID0gNywKIAogCQkuc3luY19jb250cm9sICA9IDB4MTgsCiAJCS5sdW1hX2NvbnRyb2wgID0gMHg0MCwKQEAgLTMzNSw4ICszMzYsOCBAQAogCQkuZGVmYXVsdF92YWx1ZSA9IDAsCiAJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKIAl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9WRkxJUCwKLQkJLm5hbWUgICAgICAgICAgPSAidmVydGljYWwgZmxpcCIsCisJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSEZMSVAsCisJCS5uYW1lICAgICAgICAgID0gIk1pcnJvciIsCiAJCS5taW5pbXVtICAgICAgID0gMCwKIAkJLm1heGltdW0gICAgICAgPSAxLAogCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCkBAIC00ODIsNyArNDgzLDcgQEAKIAlkZXYtPmNyb3BfYm91bmRzLndpZHRoICAgPSBub3JtLT5oX3N0b3AgLSBub3JtLT5oX3N0YXJ0ICsxOwogCWRldi0+Y3JvcF9kZWZyZWN0LndpZHRoICA9IG5vcm0tPmhfc3RvcCAtIG5vcm0tPmhfc3RhcnQgKzE7CiAKLQlkZXYtPmNyb3BfYm91bmRzLnRvcCAgICAgPSAobm9ybS0+dmJpX3Zfc3RvcCsxKSoyOworCWRldi0+Y3JvcF9ib3VuZHMudG9wICAgICA9IChub3JtLT52Ymlfdl9zdG9wXzArMSkqMjsKIAlkZXYtPmNyb3BfZGVmcmVjdC50b3AgICAgPSBub3JtLT52aWRlb192X3N0YXJ0KjI7CiAJZGV2LT5jcm9wX2JvdW5kcy5oZWlnaHQgID0gKChub3JtLT5pZCAmIFY0TDJfU1REXzUyNV82MCkgPyA1MjQgOiA2MjQpCiAJCS0gZGV2LT5jcm9wX2JvdW5kcy50b3A7CkBAIC01MjEsMjIgKzUyMiw3IEBACiAJc2FhX3dyaXRlYihTQUE3MTM0X1JBV19EQVRBX0dBSU4sICAgICAgICAgMHg0MCk7CiAJc2FhX3dyaXRlYihTQUE3MTM0X1JBV19EQVRBX09GRlNFVCwgICAgICAgMHg4MCk7CiAKLSNpZmRlZiBWNEwyX0kyQ19DTElFTlRTCiAJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NfU19TVEQsJm5vcm0tPmlkKTsKLSNlbHNlCi0JewotCQkvKiBwYXNzIGRvd24gaW5mbyB0byB0aGUgaTJjIGNoaXBzICh2NGwxKSAqLwotCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCBjOwotCQltZW1zZXQoJmMsMCxzaXplb2YoYykpOwotCQljLmNoYW5uZWwgPSBkZXYtPmN0bF9pbnB1dDsKLQkJYy5ub3JtID0gVklERU9fTU9ERV9QQUw7Ci0JCWlmIChub3JtLT5pZCAmIFY0TDJfU1REX05UU0MpCi0JCQljLm5vcm0gPSBWSURFT19NT0RFX05UU0M7Ci0JCWlmIChub3JtLT5pZCAmIFY0TDJfU1REX1NFQ0FNKQotCQkJYy5ub3JtID0gVklERU9fTU9ERV9TRUNBTTsKLQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NTQ0hBTiwmYyk7Ci0JfQotI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIHZpZGVvX211eChzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiwgaW50IGlucHV0KQpAQCAtMTA2NCw3ICsxMDUwLDcgQEAKIAljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfSU5WRVJUOgogCQljLT52YWx1ZSA9IGRldi0+Y3RsX2ludmVydDsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9WRkxJUDoKKwljYXNlIFY0TDJfQ0lEX0hGTElQOgogCQljLT52YWx1ZSA9IGRldi0+Y3RsX21pcnJvcjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1lfRVZFTjoKQEAgLTExMzksNyArMTEyNSw3IEBACiAJCXNhYV93cml0ZWIoU0FBNzEzNF9ERUNfQ0hST01BX1NBVFVSQVRJT04sCiAJCQkgICBkZXYtPmN0bF9pbnZlcnQgPyAtZGV2LT5jdGxfc2F0dXJhdGlvbiA6IGRldi0+Y3RsX3NhdHVyYXRpb24pOwogCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX1ZGTElQOgorCWNhc2UgVjRMMl9DSURfSEZMSVA6CiAJCWRldi0+Y3RsX21pcnJvciA9IGMtPnZhbHVlOwogCQlyZXN0YXJ0X292ZXJsYXkgPSAxOwogCQlicmVhazsKQEAgLTEyMTgsNyArMTIwNCw2IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAlpbnQgcmFkaW8gPSAwOwotCiAJbGlzdF9mb3JfZWFjaChsaXN0LCZzYWE3MTM0X2Rldmxpc3QpIHsKIAkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHNhYTcxMzRfZGV2LCBkZXZsaXN0KTsKIAkJaWYgKGgtPnZpZGVvX2RldiAmJiAoaC0+dmlkZW9fZGV2LT5taW5vciA9PSBtaW5vcikpCkBAIC0xMjcwLDEyICsxMjU1LDEyIEBACiAJaWYgKGZoLT5yYWRpbykgewogCQkvKiBzd2l0Y2ggdG8gcmFkaW8gbW9kZSAqLwogCQlzYWE3MTM0X3R2YXVkaW9fc2V0aW5wdXQoZGV2LCZjYXJkKGRldikucmFkaW8pOwotCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LEFVRENfU0VUX1JBRElPLE5VTEwpOworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LEFVRENfU0VUX1JBRElPLCBOVUxMKTsKIAl9IGVsc2UgewogCQkvKiBzd2l0Y2ggdG8gdmlkZW8vdmJpIG1vZGUgKi8KIAkJdmlkZW9fbXV4KGRldixkZXYtPmN0bF9pbnB1dCk7CiAJfQotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTEzMTgsMTAgKzEzMDMsMTAgQEAKIAl9IGVsc2UgewogCQlkb3duKCZmaC0+Y2FwLmxvY2spOwogCQlpZiAoVU5TRVQgPT0gZmgtPmNhcC5yZWFkX29mZikgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogbmVlZCB0byBjYXB0dXJlIGEgbmV3IGZyYW1lICovCisJCQkvKiBuZWVkIHRvIGNhcHR1cmUgYSBuZXcgZnJhbWUgKi8KIAkJCWlmIChyZXNfbG9ja2VkKGZoLT5kZXYsUkVTT1VSQ0VfVklERU8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmaC0+Y2FwLmxvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUE9MTEVSUjsKKwkJCQl1cCgmZmgtPmNhcC5sb2NrKTsKKwkJCQlyZXR1cm4gUE9MTEVSUjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9IGZoLT5jYXAub3BzLT5idWZfcHJlcGFyZSgmZmgtPmNhcCxmaC0+Y2FwLnJlYWRfYnVmLGZoLT5jYXAuZmllbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmaC0+Y2FwLmxvY2spOwpAQCAtMTM3Nyw2ICsxMzYyLDM2IEBACiAJCXJlc19mcmVlKGRldixmaCxSRVNPVVJDRV9WQkkpOwogCX0KIAorCS8qIHRzLWNhcHR1cmUgd2lsbCBub3Qgd29yayBpbiBwbGFuYXIgbW9kZSwgc28gdHVybiBpdCBvZmYgSGFjOiAwNC4wNSovCisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfVklERU9fQSwgMHgxZiwgMCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfVklERU9fQiwgMHgxZiwgMCk7CisJc2FhX2FuZG9yYihTQUE3MTM0X09GTVRfREFUQV9BLCAweDFmLCAwKTsKKwlzYWFfYW5kb3JiKFNBQTcxMzRfT0ZNVF9EQVRBX0IsIDB4MWYsIDApOworCisJaWYgKGRldi0+dHVuZXJfdHlwZSA9PSBUVU5FUl9QSElMSVBTX1REQTgyOTApIHsKKwkJdTggZGF0YVsyXTsKKwkJaW50IHJldDsKKwkJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPUkyQ19BRERSX1REQTgyOTAsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSAyfTsKKwkJZGF0YVswXSA9IDB4MjE7CisJCWRhdGFbMV0gPSAweGMwOworCQlyZXQgPSBpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpOworCQlpZiAocmV0ICE9IDEpCisJCQlwcmludGsoS0VSTl9FUlIgIlREQTgyOTAgYWNjZXNzIGZhaWx1cmVcbiIpOworCQltc2cuYWRkciA9IEkyQ19BRERSX1REQTgyNzU7CisJCWRhdGFbMF0gPSAweDMwOworCQlkYXRhWzFdID0gMHhkMDsKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwkJaWYgKHJldCAhPSAxKQorCQkJcHJpbnRrKEtFUk5fRVJSICJUREE4Mjc1IGFjY2VzcyBmYWlsdXJlXG4iKTsKKwkJbXNnLmFkZHIgPSBJMkNfQUREUl9UREE4MjkwOworCQlkYXRhWzBdID0gMHgyMTsKKwkJZGF0YVsxXSA9IDB4ODA7CisJCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CisJCWRhdGFbMF0gPSAweDAwOworCQlkYXRhWzFdID0gMHgwMjsKKwkJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKKwl9CisKIAkvKiBmcmVlIHN0dWZmICovCiAJdmlkZW9idWZfbW1hcF9mcmVlKCZmaC0+Y2FwKTsKIAl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmZoLT52YmkpOwpAQCAtMTQwNywxOSArMTQyMiwxMiBAQAogCWYtPmZtdC52Ymkuc2FtcGxlc19wZXJfbGluZSA9IDIwNDggLyogVkJJX0xJTkVfTEVOR1RIICovOwogCWYtPmZtdC52Ymkuc2FtcGxlX2Zvcm1hdCA9IFY0TDJfUElYX0ZNVF9HUkVZOwogCWYtPmZtdC52Ymkub2Zmc2V0ID0gNjQgKiA0OwotCWYtPmZtdC52Ymkuc3RhcnRbMF0gPSBub3JtLT52Ymlfdl9zdGFydDsKLQlmLT5mbXQudmJpLmNvdW50WzBdID0gbm9ybS0+dmJpX3Zfc3RvcCAtIG5vcm0tPnZiaV92X3N0YXJ0ICsxOwotCWYtPmZtdC52Ymkuc3RhcnRbMV0gPSBub3JtLT52aWRlb192X3N0b3AgKyBub3JtLT52Ymlfdl9zdGFydCArMTsKKwlmLT5mbXQudmJpLnN0YXJ0WzBdID0gbm9ybS0+dmJpX3Zfc3RhcnRfMDsKKwlmLT5mbXQudmJpLmNvdW50WzBdID0gbm9ybS0+dmJpX3Zfc3RvcF8wIC0gbm9ybS0+dmJpX3Zfc3RhcnRfMCArMTsKKwlmLT5mbXQudmJpLnN0YXJ0WzFdID0gbm9ybS0+dmJpX3Zfc3RhcnRfMTsKIAlmLT5mbXQudmJpLmNvdW50WzFdID0gZi0+Zm10LnZiaS5jb3VudFswXTsKIAlmLT5mbXQudmJpLmZsYWdzID0gMDsgLyogVkJJX1VOU1lOQyBWQklfSU5URVJMQUNFRCAqLwogCi0jaWYgMAotCWlmIChWNEwyX1NURF9QQUwgPT0gbm9ybS0+aWQpIHsKLQkJLyogRklYTUUgKi8KLQkJZi0+Zm10LnZiaS5zdGFydFswXSArPSAzOwotCQlmLT5mbXQudmJpLnN0YXJ0WzFdICs9IDMqMjsKLQl9Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBzYWE3MTM0X2dfZm10KHN0cnVjdCBzYWE3MTM0X2RldiAqZGV2LCBzdHJ1Y3Qgc2FhNzEzNF9maCAqZmgsCkBAIC0xODgwLDExICsxODg4LDkgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlkb3duKCZkZXYtPmxvY2spOwogCQlkZXYtPmN0bF9mcmVxID0gZi0+ZnJlcXVlbmN5OwotI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKKwogCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LFZJRElPQ19TX0ZSRVFVRU5DWSxmKTsKLSNlbHNlCi0JCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DU0ZSRVEsJmRldi0+Y3RsX2ZyZXEpOwotI2VuZGlmCisKIAkJc2FhNzEzNF90dmF1ZGlvX2RvX3NjYW4oZGV2KTsKIAkJdXAoJmRldi0+bG9jayk7CiAJCXJldHVybiAwOwpAQCAtMjEzNiwxOSArMjE0MiwyMCBAQAogCiAJCW1lbXNldCh0LDAsc2l6ZW9mKCp0KSk7CiAJCXN0cmNweSh0LT5uYW1lLCAiUmFkaW8iKTsKLSAgICAgICAgICAgICAgICB0LT5yYW5nZWxvdyAgPSAoaW50KSg2NSoxNik7Ci0gICAgICAgICAgICAgICAgdC0+cmFuZ2VoaWdoID0gKGludCkoMTA4KjE2KTsKIAotI2lmZGVmIFY0TDJfSTJDX0NMSUVOVFMKLQkJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NfR19UVU5FUix0KTsKLSNlbHNlCi0JCXsKLQkJCXN0cnVjdCB2aWRlb190dW5lciB2dDsKLQkJCW1lbXNldCgmdnQsMCxzaXplb2YodnQpKTsKLQkJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DR1RVTkVSLCZ2dCk7Ci0JCQl0LT5zaWduYWwgPSB2dC5zaWduYWw7Ci0JCX0KLSNlbmRpZgorCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfR19UVU5FUiwgdCk7CisKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKKworCQlpZiAoMCAhPSB0LT5pbmRleCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsVklESU9DX1NfVFVORVIsdCk7CisKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKQEAgLTIxODIsNyArMjE4OSw2IEBACiAJCXJldHVybiAwOwogCX0KIAljYXNlIFZJRElPQ19TX0FVRElPOgotCWNhc2UgVklESU9DX1NfVFVORVI6CiAJY2FzZSBWSURJT0NfU19JTlBVVDoKIAljYXNlIFZJRElPQ19TX1NURDoKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAppbmRleCBhYzkwYTk4Li42ODM2YzA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBzYWE3MTM0LmgsdiAxLjM4IDIwMDUvMDMvMDcgMTI6MDE6NTEga3JheGVsIEV4cCAkCisgKiAkSWQ6IHNhYTcxMzQuaCx2IDEuNDggMjAwNS8wNy8wMSAwODoyMjoyNCBuc2ggRXhwICQKICAqCiAgKiB2NGwyIGRldmljZSBkcml2ZXIgZm9yIHBoaWxpcHMgc2FhNzEzNCBiYXNlZCBUViBjYXJkcwogICoKQEAgLTIxLDcgKzIxLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2RlZmluZSBTQUE3MTM0X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDIsMTIpCisjZGVmaW5lIFNBQTcxMzRfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsMiwxMykKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgpAQCAtNDYsOCArNDYsNiBAQAogI2VuZGlmCiAjZGVmaW5lIFVOU0VUICgtMVUpCiAKLS8qIDIuNCAvIDIuNSBkcml2ZXIgY29tcGF0aWJpbGl0eSBzdHVmZiAqLwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogZW51bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtOTEsOSArODksMTAgQEAKIAl1bnNpZ25lZCBpbnQgIGhfc3RvcDsKIAl1bnNpZ25lZCBpbnQgIHZpZGVvX3Zfc3RhcnQ7CiAJdW5zaWduZWQgaW50ICB2aWRlb192X3N0b3A7Ci0JdW5zaWduZWQgaW50ICB2Ymlfdl9zdGFydDsKLQl1bnNpZ25lZCBpbnQgIHZiaV92X3N0b3A7CisJdW5zaWduZWQgaW50ICB2Ymlfdl9zdGFydF8wOworCXVuc2lnbmVkIGludCAgdmJpX3Zfc3RvcF8wOwogCXVuc2lnbmVkIGludCAgc3JjX3RpbWluZzsKKwl1bnNpZ25lZCBpbnQgIHZiaV92X3N0YXJ0XzE7CiB9OwogCiBzdHJ1Y3Qgc2FhNzEzNF90dmF1ZGlvIHsKQEAgLTE1OCw3ICsxNTcsNyBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9EVkRfRVpNQUtFUiAzMwogI2RlZmluZSBTQUE3MTM0X0JPQVJEX05PVkFDX1BSSU1FVFY3MTMzIDM0CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX1NUVURJT18zMDUgMzUKLSNkZWZpbmUgU0FBNzEzM19CT0FSRF9VUE1PU1RfUFVSUExFX1RWIDM2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfVVBNT1NUX1BVUlBMRV9UViAzNgogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0lURU1TX01UVjAwNSAgICAgMzcKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9DSU5FUkdZMjAwICAgICAgIDM4CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9NSU5JIDM5CkBAIC0xNjcsNyArMTY2LDcgQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1NCVFRWRk0gIDQyCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfWk9MSURfWFBFUlRfVFY3MTM0IDQzCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRU1QSVJFX1BDSV9UVl9SQURJT19MRSA0NAotI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV8zMDcgICAgNDUKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfU1RVRElPXzMwNyAgICA0NQogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FWRVJNRURJQV9DQVJEQlVTIDQ2CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTQwMF9DQVJEQlVTIDQ3CiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQ0lORVJHWTYwMF9NSzMgICA0OApAQCAtMTc1LDkgKzE3NCwxNyBAQAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFXzMwMElfRFZCVF9QQUwgNTAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9QUk9WSURFT19QVjk1MiAgIDUxCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBXzMwNSAgICA1MgotI2RlZmluZSBTQUE3MTM1X0JPQVJEX0FTVVNUZUtfVFZGTTcxMzUgNTMKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1RWRk03MTM1IDUzCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSA1NAogI2RlZmluZSBTQUE3MTM0X0JPQVJEX0ZMWURWQlREVU8gNTUKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfMzA3ICAgIDU2CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0dPXzAwN19GTSA1NworI2RlZmluZSBTQUE3MTM0X0JPQVJEX0FEU19JTlNUQU5UX1RWIDU4CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlQgNTkKKyNkZWZpbmUgU0FBNzEzNF9CT0FSRF9USFlQSE9PTl9EVkJUX0RVT19DQVJEQlVTIDYwCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSCA2MQorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UVl9HT0xEX1BMVVNJSSA2MgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVCA2MwogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApAQCAtMjA4LDYgKzIxNSwxMCBAQAogCiAJLyogaTJjIGNoaXAgaW5mbyAqLwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHR1bmVyX3R5cGU7CisJdW5zaWduZWQgaW50CQlyYWRpb190eXBlOworCXVuc2lnbmVkIGNoYXIJCXR1bmVyX2FkZHI7CisJdW5zaWduZWQgY2hhcgkJcmFkaW9fYWRkcjsKKwogCXVuc2lnbmVkIGludCAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKIAogCS8qIHBlcmlwaGVyYWwgSS9PICovCkBAIC0yNDEsNyArMjUyLDcgQEAKIC8qIHNhYTcxMzQgcGFnZSB0YWJsZSAqLwogc3RydWN0IHNhYTcxMzRfcGd0YWJsZSB7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgc2l6ZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAqY3B1OworCV9fbGUzMiAgICAgICAgICAgICAgICAgICAgICpjcHU7CiAJZG1hX2FkZHJfdCAgICAgICAgICAgICAgICAgZG1hOwogfTsKIApAQCAtMzk4LDkgKzQwOSwxMiBAQAogCS8qIGNvbmZpZyBpbmZvICovCiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgYm9hcmQ7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgdHVuZXJfdHlwZTsKKwl1bnNpZ25lZCBpbnQgCQkgICByYWRpb190eXBlOworCXVuc2lnbmVkIGNoYXIJCSAgIHR1bmVyX2FkZHI7CisJdW5zaWduZWQgY2hhcgkJICAgcmFkaW9fYWRkcjsKKwogCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIHRkYTk4ODdfY29uZjsKIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICBncGlvX3ZhbHVlOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgICAgIGlycTJfbWFzazsKIAogCS8qIGkyYyBpL28gKi8KIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAgICAgICBpMmNfYWRhcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKaW5kZXggMDdiYTZkMy4uN2NiMWZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE3NDMyLmMKQEAgLTI0MywxOSArMjQzLDYgQEAKIH0KIAogLyogSSBkb24ndCB0aGluayB3ZSBldmVyIGFjdHVhbGx5IF9yZWFkXyB0aGUgY2hpcC4uLiAqLwotI2lmIDAKLXN0YXRpYyBpbnQgdGRhNzQzMl9yZWFkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0JdW5zaWduZWQgY2hhciBidWZmZXI7Ci0JZDJwcmludGsoInRkYTc0MzI6IEluIHRkYTc0MzJfcmVhZFxuIik7Ci0JaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwmYnVmZmVyLDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInRkYTc0MzI6IEkvTyBlcnJvciwgdHJ5aW5nIChyZWFkKVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZHByaW50aygidGRhNzQzMjogUmVhZCAweCUwMnhcbiIsIGJ1ZmZlcik7Ci0JcmV0dXJuIGJ1ZmZlcjsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHRkYTc0MzJfc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTgyOTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCmluZGV4IGIyN2NjMzQuLmE4YjZhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhODI5MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogdGRhODI5MC5jLHYgMS43IDIwMDUvMDMvMDcgMTI6MDE6NTEga3JheGVsIEV4cCAkCisgKiAkSWQ6IHRkYTgyOTAuYyx2IDEuMTUgMjAwNS8wNy8wOCAyMDoyMTozMyBtY2hlaGFiIEV4cCAkCiAgKgogICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgogICogY29udHJvbHMgdGhlIHBoaWxpcHMgdGRhODI5MCs3NSB0dW5lciBjaGlwIGNvbWJvLgpAQCAtNjksNyArNjksNyBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgaTJjX2VuYWJsZV9icmlkZ2VbMl0gPSAJeyAweDIxLCAweEMwIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfZGlzYWJsZV9icmlkZ2VbMl0gPSAJeyAweDIxLCAweDgwIH07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBpMmNfaW5pdF90ZGE4Mjc1WzE0XSA9IAl7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCQkJCQkgIDB4N0MsIDB4MDQsIDB4QTMsIDB4M0YsCisJCQkJCQkgIDB4ZkMsIDB4MDQsIDB4QTMsIDB4M0YsCiAJCQkJCQkgIDB4MkEsIDB4MDQsIDB4RkYsIDB4MDAsCiAJCQkJCQkgIDB4MDAsIDB4NDAgfTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGkyY19zZXRfVlNbMl0gPSAJCXsgMHgzMCwgMHg2RiB9OwpAQCAtMTM2LDE4ICsxMzYsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgdHVuZXIgKnQsIHUxNiBpZmMpCitzdGF0aWMgdm9pZCBzZXRfZnJlcXVlbmN5KHN0cnVjdCB0dW5lciAqdCwgdTE2IGlmYywgdW5zaWduZWQgaW50IGZyZXEpCiB7Ci0JdTMyIE4gPSAoKCh0LT5mcmVxPDwzKStpZmMpJjB4M2ZmZmMpOworCXUzMiBOOwogCi0JTiA9IE4gPj4gZ2V0X2ZyZXFfZW50cnkoZGl2X3RhYmxlLCB0LT5mcmVxKTsKKwlpZiAodC0+bW9kZSA9PSBWNEwyX1RVTkVSX1JBRElPKQorCQlmcmVxID0gZnJlcSAvIDEwMDA7CisKKwlOID0gKCgoZnJlcTw8MykraWZjKSYweDNmZmZjKTsKKworCU4gPSBOID4+IGdldF9mcmVxX2VudHJ5KGRpdl90YWJsZSwgZnJlcSk7CiAJdC0+aTJjX3NldF9mcmVxWzBdID0gMDsKIAl0LT5pMmNfc2V0X2ZyZXFbMV0gPSAodW5zaWduZWQgY2hhcikoTj4+OCk7CiAJdC0+aTJjX3NldF9mcmVxWzJdID0gKHVuc2lnbmVkIGNoYXIpIE47CiAJdC0+aTJjX3NldF9mcmVxWzNdID0gMHg0MDsKIAl0LT5pMmNfc2V0X2ZyZXFbNF0gPSAweDUyOwotCXQtPmkyY19zZXRfZnJlcVs1XSA9IGdldF9mcmVxX2VudHJ5KGJhbmRfdGFibGUsIHQtPmZyZXEpOwotCXQtPmkyY19zZXRfZnJlcVs2XSA9IGdldF9mcmVxX2VudHJ5KGFnY190YWJsZSwgIHQtPmZyZXEpOworCXQtPmkyY19zZXRfZnJlcVs1XSA9IGdldF9mcmVxX2VudHJ5KGJhbmRfdGFibGUsIGZyZXEpOworCXQtPmkyY19zZXRfZnJlcVs2XSA9IGdldF9mcmVxX2VudHJ5KGFnY190YWJsZSwgIGZyZXEpOwogCXQtPmkyY19zZXRfZnJlcVs3XSA9IDB4OGY7CiB9CiAKQEAgLTE3OSwxNCArMTg0LDE0IEBACiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwogCiAJc2V0X2F1ZGlvKHQpOwotCXNldF9mcmVxdWVuY3kodCwgODY0KTsKKwlzZXRfZnJlcXVlbmN5KHQsIDg2NCwgZnJlcSk7CiAJdGRhODI5MF90dW5lKGMpOwogfQogCiBzdGF0aWMgdm9pZCBzZXRfcmFkaW9fZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZyZXEpCiB7CiAJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCXNldF9mcmVxdWVuY3kodCwgNzA0KTsKKwlzZXRfZnJlcXVlbmN5KHQsIDcwNCwgZnJlcSk7CiAJdGRhODI5MF90dW5lKGMpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4NzUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCmluZGV4IDk3YjExM2UuLjU2NmUxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jCkBAIC0xMjMsMTkgKzEyMyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZiAwCi1zdGF0aWMgaW50IHRkYTk4NzVfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXVuc2lnbmVkIGNoYXIgYnVmZmVyOwotCWRwcmludGsoIkluIHRkYTk4NzVfcmVhZFxuIik7Ci0JaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwmYnVmZmVyLDEpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInRkYTk4NzU6IEkvTyBlcnJvciwgdHJ5aW5nIChyZWFkKVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZHByaW50aygiUmVhZCAweCUwMnhcbiIsIGJ1ZmZlcik7Ci0JcmV0dXJuIGJ1ZmZlcjsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW50IGkyY19yZWFkX3JlZ2lzdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCByZWcpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCmluZGV4IDdlNmU2ZGQuLjEwOGMzYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCkBAIC01Myw2ICs1Myw3IEBACiAJdW5zaWduZWQgaW50ICAgICAgIGNvbmZpZzsKIAl1bnNpZ25lZCBpbnQgICAgICAgcGlubmFjbGVfaWQ7CiAJdW5zaWduZWQgaW50ICAgICAgIHVzaW5nX3Y0bDI7CisJdW5zaWduZWQgaW50IAkgICByYWRpb19tb2RlOwogfTsKIAogc3RydWN0IHR2bm9ybSB7CkBAIC0yMTIsMTIgKzIxMywyMiBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdHZub3JtIHJhZGlvID0gewotCS5uYW1lID0gInJhZGlvIiwKK3N0YXRpYyBzdHJ1Y3QgdHZub3JtIHJhZGlvX3N0ZXJlbyA9IHsKKwkubmFtZSA9ICJSYWRpbyBTdGVyZW8iLAorCS5iICAgID0gKCBjRm1SYWRpbyAgICAgICB8CisJCSAgY1FTUyAgICAgICAgICAgKSwKKwkuYyAgICA9ICggY0RlZW1waGFzaXNPRkYgfAorCQkgIGNBdWRpb0dhaW42ICksCisJLmUgICAgPSAoIGNBdWRpb0lGXzVfNSAgIHwKKwkJICBjUmFkaW9JRl8zOF85MCApLAorfTsKKworc3RhdGljIHN0cnVjdCB0dm5vcm0gcmFkaW9fbW9ubyA9IHsKKwkubmFtZSA9ICJSYWRpbyBNb25vIiwKIAkuYiAgICA9ICggY0ZtUmFkaW8gICAgICAgfAogCQkgIGNRU1MgICAgICAgICAgICksCiAJLmMgICAgPSAoIGNEZWVtcGhhc2lzT04gIHwKLQkJICBjRGVlbXBoYXNpczUwICApLAorCQkgIGNEZWVtcGhhc2lzNTApLAogCS5lICAgID0gKCBjQXVkaW9JRl81XzUgICB8CiAJCSAgY1JhZGlvSUZfMzhfOTAgKSwKIH07CkBAIC0zNTQsNyArMzY1LDEwIEBACiAJaW50IGk7CiAKIAlpZiAodC0+cmFkaW8pIHsKLQkJbm9ybSA9ICZyYWRpbzsKKwkJaWYgKHQtPnJhZGlvX21vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCisJCQlub3JtID0gJnJhZGlvX21vbm87CisJCWVsc2UKKwkJCW5vcm0gPSAmcmFkaW9fc3RlcmVvOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHR2bm9ybXMpOyBpKyspIHsKIAkJCWlmICh0dm5vcm1zW2ldLnN0ZCAmIHQtPnN0ZCkgewpAQCAtNTQ1LDIzICs1NTksMTYgQEAKIAogCW1lbXNldChidWYsMCxzaXplb2YoYnVmKSk7CiAJdGRhOTg4N19zZXRfdHZub3JtKHQsYnVmKTsKKwogCWJ1ZlsxXSB8PSBjT3V0cHV0UG9ydDFJbmFjdGl2ZTsKIAlidWZbMV0gfD0gY091dHB1dFBvcnQySW5hY3RpdmU7CisKIAlpZiAoVU5TRVQgIT0gdC0+cGlubmFjbGVfaWQpIHsKIAkJdGRhOTg4N19zZXRfcGlubmFjbGUodCxidWYpOwogCX0KIAl0ZGE5ODg3X3NldF9jb25maWcodCxidWYpOwogCXRkYTk4ODdfc2V0X2luc21vZCh0LGJ1Zik7CiAKLSNpZiAwCi0JLyogVGhpcyBhcy1pcyBicmVha3Mgc29tZSBjYXJkcywgbXVzdCBiZSBmaXhlZCBpbiBhCi0JICogY2FyZC1zcGVjaWZpYyB3YXksIHByb2JhYmx5IHVzaW5nIFREQTk4ODdfU0VUX0NPTkZJRyB0bwotCSAqIHR1cm4gb24vb2ZmIHBvcnQyICovCi0JaWYgKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNX0wpIHsKLQkJLyogc2VjYW0gZml4dXAgKEZJWE1FOiBtb3ZlIHRoaXMgdG8gdHZub3JtcyBhcnJheT8pICovCi0JCWJ1ZlsxXSAmPSB+Y091dHB1dFBvcnQySW5hY3RpdmU7Ci0JfQotI2VuZGlmCiAKIAlkcHJpbnRrKFBSRUZJWCAid3JpdGluZzogYj0weCUwMnggYz0weCUwMnggZT0weCUwMnhcbiIsCiAJCWJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKQEAgLTU5MiwxMSArNTk5LDE0IEBACiAgICAgICAgIGlmIChOVUxMID09ICh0ID0ga21hbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAJbWVtc2V0KHQsMCxzaXplb2YoKnQpKTsKKwogCXQtPmNsaWVudCAgICAgID0gY2xpZW50X3RlbXBsYXRlOwogCXQtPnN0ZCAgICAgICAgID0gMDsKIAl0LT5waW5uYWNsZV9pZCA9IFVOU0VUOwotICAgICAgICBpMmNfc2V0X2NsaWVudGRhdGEoJnQtPmNsaWVudCwgdCk7Ci0gICAgICAgIGkyY19hdHRhY2hfY2xpZW50KCZ0LT5jbGllbnQpOworCXQtPnJhZGlvX21vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCisJaTJjX3NldF9jbGllbnRkYXRhKCZ0LT5jbGllbnQsIHQpOworCWkyY19hdHRhY2hfY2xpZW50KCZ0LT5jbGllbnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC03MzMsNiArNzQzLDE2IEBACiAJCX0KIAkJYnJlYWs7CiAJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7CisKKwkJaWYgKHQtPnJhZGlvKSB7CisJCQl0LT5yYWRpb19tb2RlID0gdHVuZXItPmF1ZG1vZGU7CisJCQl0ZGE5ODg3X2NvbmZpZ3VyZSAodCk7CisJCX0KKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCS8qIG5vdGhpbmcgKi8KIAkJYnJlYWs7CkBAIC03NDAsNyArNzYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGE5ODg3X3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCitzdGF0aWMgaW50IHRkYTk4ODdfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICogZGV2LCB1MzIgc3RhdGUsIHUzMiBsZXZlbCkKIHsKIAlkcHJpbnRrKCJ0ZGE5ODg3OiBzdXNwZW5kXG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGVhNTc2Ny5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzYzc0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIEZvciBQaGlsaXBzIFRFQTU3NjcgRk0gQ2hpcCB1c2VkIG9uIHNvbWUgVFYgQ2FyZHMgbGlrZSBQcm9saW5rIFBpeGVsdmlldworICogSTJDIGFkZHJlc3MgaXMgYWxsd2F5cyAweEMwLgorICoKKyAqICRJZDogdGVhNTc2Ny5jLHYgMS4xOCAyMDA1LzA3LzA3IDAzOjAyOjU1IG1jaGVoYWIgRXhwICQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIChtY2hlaGFiQGJydHVyYm8uY29tLmJyKQorICogVGhpcyBjb2RlIGlzIHBsYWNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgorICogdGVhNTc2NyBhdXRvZGV0ZWN0aW9uIHRoYW5rcyB0byBUb3JzdGVuIFNlZWJvdGggYW5kIEF0c3VzaGkgTmFrYWdhd2EKKyAqIGZyb20gdGhlaXIgY29udHJpYnV0aW9ucyBvbiBEU2NhbGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgorCisjZGVmaW5lIFBSRUZJWCAiVEVBNTc2NyAiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV3JpdGUgbW9kZSByZWdpc3RlciB2YWx1ZXMgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRmlyc3QgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEVBNTc2N19NVVRFCQkweDgwCS8qIE11dGVzIG91dHB1dCAqLworI2RlZmluZSBURUE1NzY3X1NFQVJDSAkJMHg0MAkvKiBBY3RpdmF0ZXMgc3RhdGlvbiBzZWFyY2ggKi8KKy8qIEJpdHMgMC01IGZvciBkaXZpZGVyIE1TQiAqLworCisvKiBTZWNvbmQgcmVnaXN0ZXIgKi8KKy8qIEJpdHMgMC03IGZvciBkaXZpZGVyIExTQiAqLworCisvKiBUaGlyZCByZWdpc3RlciAqLworCisvKiBTdGF0aW9uIHNlYXJjaCBmcm9tIGJvdHRvbiB0byB1cCAqLworI2RlZmluZSBURUE1NzY3X1NFQVJDSF9VUAkweDgwCisKKy8qIFNlYXJjaGVzIHdpdGggQURDIG91dHB1dCA9IDEwICovCisjZGVmaW5lIFRFQTU3NjdfU1JDSF9ISUdIX0xWTAkweDYwCisKKy8qIFNlYXJjaGVzIHdpdGggQURDIG91dHB1dCA9IDEwICovCisjZGVmaW5lIFRFQTU3NjdfU1JDSF9NSURfTFZMCTB4NDAKKworLyogU2VhcmNoZXMgd2l0aCBBREMgb3V0cHV0ID0gNSAqLworI2RlZmluZSBURUE1NzY3X1NSQ0hfTE9XX0xWTAkweDIwCisKKy8qIGlmIG9uLCBkaXY9NCooRnJmK0ZpZikvRnJlZiBvdGhlcndpc2UsIGRpdj00KihGcmYtRmlmKS9GcmVxKSAqLworI2RlZmluZSBURUE1NzY3X0hJR0hfTE9fSU5KRUNUCTB4MTAKKworLyogRGlzYWJsZSBzdGVyZW8gKi8KKyNkZWZpbmUgVEVBNTc2N19NT05PCQkweDA4CisKKy8qIERpc2FibGUgcmlnaHQgY2hhbm5lbCBhbmQgdHVybnMgdG8gbW9ubyAqLworI2RlZmluZSBURUE1NzY3X01VVEVfUklHSFQJMHgwNAorCisvKiBEaXNhYmxlIGxlZnQgY2hhbm5lbCBhbmQgdHVybnMgdG8gbW9ubyAqLworI2RlZmluZSBURUE1NzY3X01VVEVfTEVGVAkweDAyCisKKyNkZWZpbmUgVEVBNTc2N19QT1JUMV9ISUdICTB4MDEKKworLyogRm9ydGggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEVBNTc2N19QT1JUMl9ISUdICTB4ODAKKy8qIENoaXBzIHN0b3BzIHdvcmtpbmcuIE9ubHkgSTJDIGJ1cyByZW1haW5zIG9uICovCisjZGVmaW5lIFRFQTU3NjdfU1REQlkJCTB4NDAKKworLyogSmFwYW4gZnJlcSAoNzYtMTA4IE1Iei4gSWYgZGlzYWJsZWQsIDg3LjUtMTA4IE1IeiAqLworI2RlZmluZSBURUE1NzY3X0pBUEFOX0JBTkQJMHgyMAorCisvKiBVbnNlbGVjdGVkIG1lYW5zIDMyLjc2OCBLSHogZnJlcSBhcyByZWZlcmVuY2UuIE90aGVyd2lzZSBYdGFsIGF0IDEzIE1IeiAqLworI2RlZmluZSBURUE1NzY3X1hUQUxfMzI3NjgJMHgxMAorCisvKiBDdXRzIHdlYWsgc2lnbmFscyAqLworI2RlZmluZSBURUE1NzY3X1NPRlRfTVVURQkweDA4CisKKy8qIEFjdGl2YXRlcyBoaWdoIGN1dCBjb250cm9sICovCisjZGVmaW5lIFRFQTU3NjdfSElHSF9DVVRfQ1RSTAkweDA0CisKKy8qIEFjdGl2YXRlcyBzdGVyZW8gbm9pc2UgY29udHJvbCAqLworI2RlZmluZSBURUE1NzY3X1NUX05PSVNFX0NUTAkweDAyCisKKy8qIElmIGFjdGl2YXRlIFBPUlQgMSBpbmRpY2F0ZXMgU0VBUkNIIG9yIGVsc2UgaXQgaXMgdXNlZCBhcyBQT1JUMSAqLworI2RlZmluZSBURUE1NzY3X1NSQ0hfSU5ECTB4MDEKKworLyogRml2ZXRoIHJlZ2lzdGVyICovCisKKy8qIEJ5IGFjdGl2YXRpbmcsIGl0IHdpbGwgdXNlIFh0YWwgYXQgMTMgTUh6IGFzIHJlZmVyZW5jZSBmb3IgZGl2aWRlciAqLworI2RlZmluZSBURUE1NzY3X1BMTFJFRl9FTkFCTEUJMHg4MAorCisvKiBCeSBhY3RpdmF0aW5nLCBkZWVtcGhhc2lzPTUwLCBvciBlbHNlLCBkZWVtcGhhc2lzIG9mIDUwdXMgKi8KKyNkZWZpbmUgVEVBNTc2N19ERUVNUEhfNzUJMFg0MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJlYWQgbW9kZSByZWdpc3RlciB2YWx1ZXMgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBGaXJzdCByZWdpc3RlciAqLworI2RlZmluZSBURUE1NzY3X1JFQURZX0ZMQUdfTUFTSwkweDgwCisjZGVmaW5lIFRFQTU3NjdfQkFORF9MSU1JVF9NQVNLCTBYNDAKKy8qIEJpdHMgMC01IGZvciBkaXZpZGVyIE1TQiBhZnRlciBzZWFyY2ggb3IgcHJlc2V0ICovCisKKy8qIFNlY29uZCByZWdpc3RlciAqLworLyogQml0cyAwLTcgZm9yIGRpdmlkZXIgTFNCIGFmdGVyIHNlYXJjaCBvciBwcmVzZXQgKi8KKworLyogVGhpcmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVEVBNTc2N19TVEVSRU9fTUFTSwkweDgwCisjZGVmaW5lIFRFQTU3NjdfSUZfQ05UUl9NQVNLCTB4N2YKKworLyogRm91ciByZWdpc3RlciAqLworI2RlZmluZSBURUE1NzY3X0FEQ19MRVZFTF9NQVNLCTB4ZjAKKworLyogc2hvdWxkIGJlIDAgKi8KKyNkZWZpbmUgVEVBNTc2N19DSElQX0lEX01BU0sJMHgwZgorCisvKiBGaXZldGggcmVnaXN0ZXIgKi8KKy8qIFJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBURUE1NzY3X1JFU0VSVkVEX01BU0sJMHhmZgorCitlbnVtIHRlYTU3NjdfeHRhbF9mcmVxIHsKKyAgICAgICAgVEVBNTc2N19MT1dfTE9fMzI3NjggICAgPSAwLAorICAgICAgICBURUE1NzY3X0hJR0hfTE9fMzI3NjggICA9IDEsCisgICAgICAgIFRFQTU3NjdfTE9XX0xPXzEzTUh6ICAgID0gMiwKKyAgICAgICAgVEVBNTc2N19ISUdIX0xPXzEzTUh6ICAgPSAzLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHNldF90dl9mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwl0dW5lcl93YXJuKCJUaGlzIHR1bmVyIGRvZXNuJ3Qgc3VwcG9ydCBUViBmcmVxLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlYTU3Njdfc3RhdHVzX2R1bXAodW5zaWduZWQgY2hhciAqYnVmZmVyKQoreworCXVuc2lnbmVkIGludCBkaXYsIGZycTsKKworCWlmIChURUE1NzY3X1JFQURZX0ZMQUdfTUFTSyAmIGJ1ZmZlclswXSkKKwkJcHJpbnRrKFBSRUZJWCAiUmVhZHkgRmxhZyBPTlxuIik7CisJZWxzZQorCQlwcmludGsoUFJFRklYICJSZWFkeSBGbGFnIE9GRlxuIik7CisKKwlpZiAoVEVBNTc2N19CQU5EX0xJTUlUX01BU0sgJiBidWZmZXJbMF0pCisJCXByaW50ayhQUkVGSVggIlR1bmVyIGF0IGJhbmQgbGltaXRcbiIpOworCWVsc2UKKwkJcHJpbnRrKFBSRUZJWCAiVHVuZXIgbm90IGF0IGJhbmQgbGltaXRcbiIpOworCisJZGl2ID0gKChidWZmZXJbMF0gJiAweDNmKSA8PCA4KSB8IGJ1ZmZlclsxXTsKKworCXN3aXRjaCAoVEVBNTc2N19ISUdIX0xPXzMyNzY4KSB7CisJY2FzZSBURUE1NzY3X0hJR0hfTE9fMTNNSHo6CisJCWZycSA9IDEwMDAgKiAoZGl2ICogNTAgLSA3MDAgLSAyMjUpIC8gNDsJLyogRnJlcSBpbiBLSHogKi8KKwkJYnJlYWs7CisJY2FzZSBURUE1NzY3X0xPV19MT18xM01IejoKKwkJZnJxID0gMTAwMCAqIChkaXYgKiA1MCArIDcwMCArIDIyNSkgLyA0OwkvKiBGcmVxIGluIEtIeiAqLworCQlicmVhazsKKwljYXNlIFRFQTU3NjdfTE9XX0xPXzMyNzY4OgorCQlmcnEgPSAxMDAwICogKGRpdiAqIDMyNzY4IC8gMTAwMCArIDcwMCArIDIyNSkgLyA0OwkvKiBGcmVxIGluIEtIeiAqLworCQlicmVhazsKKwljYXNlIFRFQTU3NjdfSElHSF9MT18zMjc2ODoKKwlkZWZhdWx0OgorCQlmcnEgPSAxMDAwICogKGRpdiAqIDMyNzY4IC8gMTAwMCAtIDcwMCAtIDIyNSkgLyA0OwkvKiBGcmVxIGluIEtIeiAqLworCQlicmVhazsKKwl9CisJYnVmZmVyWzBdID0gKGRpdiA+PiA4KSAmIDB4M2Y7CisJYnVmZmVyWzFdID0gZGl2ICYgMHhmZjsKKworCXByaW50ayhQUkVGSVggIkZyZXF1ZW5jeSAlZC4lMDNkIEtIeiAoZGl2aWRlciA9IDB4JTA0eClcbiIsCisJICAgICAgIGZycSAvIDEwMDAsIGZycSAlIDEwMDAsIGRpdik7CisKKwlpZiAoVEVBNTc2N19TVEVSRU9fTUFTSyAmIGJ1ZmZlclsyXSkKKwkJcHJpbnRrKFBSRUZJWCAiU3RlcmVvXG4iKTsKKwllbHNlCisJCXByaW50ayhQUkVGSVggIk1vbm9cbiIpOworCisJcHJpbnRrKFBSRUZJWCAiSUYgQ291bnRlciA9ICVkXG4iLCBidWZmZXJbMl0gJiBURUE1NzY3X0lGX0NOVFJfTUFTSyk7CisKKwlwcmludGsoUFJFRklYICJBREMgTGV2ZWwgPSAlZFxuIiwKKwkgICAgICAgKGJ1ZmZlclszXSAmIFRFQTU3NjdfQURDX0xFVkVMX01BU0spID4+IDQpOworCisJcHJpbnRrKFBSRUZJWCAiQ2hpcCBJRCA9ICVkXG4iLCAoYnVmZmVyWzNdICYgVEVBNTc2N19DSElQX0lEX01BU0spKTsKKworCXByaW50ayhQUkVGSVggIlJlc2VydmVkID0gMHglMDJ4XG4iLAorCSAgICAgICAoYnVmZmVyWzRdICYgVEVBNTc2N19SRVNFUlZFRF9NQVNLKSk7Cit9CisKKy8qIEZyZXEgc2hvdWxkIGJlIHNwZWNpZnllZCBhdCA2Mi41IEh6ICovCitzdGF0aWMgdm9pZCBzZXRfcmFkaW9fZnJlcShzdHJ1Y3QgaTJjX2NsaWVudCAqYywgdW5zaWduZWQgaW50IGZycSkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNV07CisJdW5zaWduZWQgZGl2OworCWludCByYzsKKworCXR1bmVyX2RiZyAoUFJFRklYICJyYWRpbyBmcmVxIGNvdW50ZXIgJWRcbiIsIGZycSk7CisKKwkvKiBSb3VuZHMgZnJlcSB0byBuZXh0IGRlY2ltYWwgdmFsdWUgLSBmb3IgNjIuNSBLSHogc3RlcCAqLworCS8qIGZycSA9IDIwKihmcnEvMTYpK3JhZGlvX2ZycVtmcnElMTZdOyAqLworCisJYnVmZmVyWzJdID0gVEVBNTc2N19QT1JUMV9ISUdIOworCWJ1ZmZlclszXSA9IFRFQTU3NjdfUE9SVDJfSElHSCB8IFRFQTU3NjdfSElHSF9DVVRfQ1RSTCB8CisJCSAgICBURUE1NzY3X1NUX05PSVNFX0NUTCB8IFRFQTU3NjdfSkFQQU5fQkFORDsKKwlidWZmZXJbNF0gPSAwOworCisJaWYgKHQtPm1vZGUgPT0gVF9TVEFOREJZKSB7CisJCXR1bmVyX2RiZygiVEVBNTc2NyBzZXQgdG8gc3RhbmRieSBtb2RlXG4iKTsKKwkJYnVmZmVyWzNdIHw9IFRFQTU3NjdfU1REQlk7CisJfQorCisJaWYgKHQtPmF1ZG1vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pIHsKKwkJdHVuZXJfZGJnKCJURUE1NzY3IHNldCB0byBtb25vXG4iKTsKKwkJYnVmZmVyWzJdIHw9IFRFQTU3NjdfTU9OTzsKKwl9IGVsc2UgeworCQl0dW5lcl9kYmcoIlRFQTU3Njcgc2V0IHRvIHN0ZXJlb1xuIik7CisJfQorCisJLyogU2hvdWxkIGJlIHJlcGxhY2VkICovCisJc3dpdGNoIChURUE1NzY3X0hJR0hfTE9fMzI3NjgpIHsKKwljYXNlIFRFQTU3NjdfSElHSF9MT18xM01IejoKKwkJdHVuZXJfZGJnICgiVEVBNTc2NyByYWRpbyBISUdIIExPIGluamVjdCB4dGFsIEAgMTMgTUh6XG4iKTsKKwkJYnVmZmVyWzJdIHw9IFRFQTU3NjdfSElHSF9MT19JTkpFQ1Q7CisJCWJ1ZmZlcls0XSB8PSBURUE1NzY3X1BMTFJFRl9FTkFCTEU7CisJCWRpdiA9IChmcnEgKiA0IC8gMTYgKyA3MDAgKyAyMjUgKyAyNSkgLyA1MDsKKwkJYnJlYWs7CisJY2FzZSBURUE1NzY3X0xPV19MT18xM01IejoKKwkJdHVuZXJfZGJnICgiVEVBNTc2NyByYWRpbyBMT1cgTE8gaW5qZWN0IHh0YWwgQCAxMyBNSHpcbiIpOworCisJCWJ1ZmZlcls0XSB8PSBURUE1NzY3X1BMTFJFRl9FTkFCTEU7CisJCWRpdiA9IChmcnEgKiA0IC8gMTYgLSA3MDAgLSAyMjUgKyAyNSkgLyA1MDsKKwkJYnJlYWs7CisJY2FzZSBURUE1NzY3X0xPV19MT18zMjc2ODoKKwkJdHVuZXJfZGJnICgiVEVBNTc2NyByYWRpbyBMT1cgTE8gaW5qZWN0IHh0YWwgQCAzMiw3NjggTUh6XG4iKTsKKwkJYnVmZmVyWzNdIHw9IFRFQTU3NjdfWFRBTF8zMjc2ODsKKwkJLyogY29uc3QgNzAwPTQwMDAqMTc1IEtoeiAtIHRvIGFkanVzdCBmcmVxIHRvIHJpZ2h0IHZhbHVlICovCisJCWRpdiA9ICgxMDAwICogKGZycSAqIDQgLyAxNiAtIDcwMCAtIDIyNSkgKyAxNjM4NCkgPj4gMTU7CisJCWJyZWFrOworCWNhc2UgVEVBNTc2N19ISUdIX0xPXzMyNzY4OgorCWRlZmF1bHQ6CisJCXR1bmVyX2RiZyAoIlRFQTU3NjcgcmFkaW8gSElHSCBMTyBpbmplY3QgeHRhbCBAIDMyLDc2OCBNSHpcbiIpOworCisJCWJ1ZmZlclsyXSB8PSBURUE1NzY3X0hJR0hfTE9fSU5KRUNUOworCQlidWZmZXJbM10gfD0gVEVBNTc2N19YVEFMXzMyNzY4OworCQlkaXYgPSAoMTAwMCAqIChmcnEgKiA0IC8gMTYgKyA3MDAgKyAyMjUpICsgMTYzODQpID4+IDE1OworCQlicmVhazsKKwl9CisJYnVmZmVyWzBdID0gKGRpdiA+PiA4KSAmIDB4M2Y7CisJYnVmZmVyWzFdID0gZGl2ICYgMHhmZjsKKworCWlmICh0dW5lcl9kZWJ1ZykKKwkJdGVhNTc2N19zdGF0dXNfZHVtcChidWZmZXIpOworCisJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNSkpKQorCQl0dW5lcl93YXJuKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDUpXG4iLCByYyk7Cit9CisKK3N0YXRpYyBpbnQgdGVhNTc2N19zaWduYWwoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNV07CisJaW50IHJjOworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCW1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKwlpZiAoNSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoYywgYnVmZmVyLCA1KSkpCisJCXR1bmVyX3dhcm4oImkyYyBpL28gZXJyb3I6IHJjID09ICVkIChzaG91bGQgYmUgNSlcbiIsIHJjKTsKKworCXJldHVybiAoKGJ1ZmZlclszXSAmIFRFQTU3NjdfQURDX0xFVkVMX01BU0spIDw8ICgxMyAtIDQpKTsKK30KKworc3RhdGljIGludCB0ZWE1NzY3X3N0ZXJlbyhzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1XTsKKwlpbnQgcmM7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworCWlmICg1ICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdihjLCBidWZmZXIsIDUpKSkKKwkJdHVuZXJfd2FybigiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSA1KVxuIiwgcmMpOworCisJcmMgPSBidWZmZXJbMl0gJiBURUE1NzY3X1NURVJFT19NQVNLOworCisJdHVuZXJfZGJnKCJURUE1NzY3IHJhZGlvIFNUIEdFVCA9ICUwMnhcbiIsIHJjKTsKKworCXJldHVybiAoKGJ1ZmZlclsyXSAmIFRFQTU3NjdfU1RFUkVPX01BU0spID8gVjRMMl9UVU5FUl9TVUJfU1RFUkVPIDogMCk7Cit9CisKK2ludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNV0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKwlpbnQgcmM7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKDUgIT0gKHJjID0gaTJjX21hc3Rlcl9yZWN2KGMsIGJ1ZmZlciwgNSkpKSB7CisJCXR1bmVyX3dhcm4oIml0IGlzIG5vdCBhIFRFQTU3NjcuIFJlY2VpdmVkICVpIGNoYXJzLlxuIiwgcmMpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCS8qIElmIGFsbCBieXRlcyBhcmUgdGhlIHNhbWUgdGhlbiBpdCdzIGEgVFYgdHVuZXIgYW5kIG5vdCBhIHRlYTU3NjcgY2hpcC4gKi8KKwlpZiAoYnVmZmVyWzBdID09IGJ1ZmZlclsxXSAmJiBidWZmZXJbMF0gPT0gYnVmZmVyWzJdICYmCisJICAgIGJ1ZmZlclswXSA9PSBidWZmZXJbM10gJiYgYnVmZmVyWzBdID09IGJ1ZmZlcls0XSkgeworCQl0dW5lcl93YXJuKCJBbGwgYnl0ZXMgYXJlIGVxdWFsLiBJdCBpcyBub3QgYSBURUE1NzY3XG4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwkvKiAgU3RhdHVzIGJ5dGVzOgorCSAqICBCeXRlIDQ6IGJpdCAzOjEgOiBDSSAoQ2hpcCBJZGVudGlmaWNhdGlvbikgPT0gMAorCSAqICAgICAgICAgIGJpdCAwICAgOiBpbnRlcm5hbGx5IHNldCB0byAwCisJICogIEJ5dGUgNTogYml0IDc6MCA6ID09IDAKKwkgKi8KKworCWlmICghKChidWZmZXJbM10gJiAweDBmKSA9PSAweDAwKSAmJiAoYnVmZmVyWzRdID09IDB4MDApKSB7CisJCXR1bmVyX3dhcm4oIkNoaXAgSUQgaXMgbm90IHplcm8uIEl0IGlzIG5vdCBhIFRFQTU3NjdcbiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwl0dW5lcl93YXJuKCJURUE1NzY3IGRldGVjdGVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCB0ZWE1NzY3X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpCit7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCisJaWYgKHRlYTU3NjdfYXV0b2RldGVjdGlvbihjKSA9PSBFSU5WQUwpCisJCXJldHVybiBFSU5WQUw7CisKKwl0dW5lcl9pbmZvKCJ0eXBlIHNldCB0byAlZCAoJXMpXG4iLCB0LT50eXBlLCAiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iKTsKKwlzdHJsY3B5KGMtPm5hbWUsICJ0ZWE1NzY3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKKworCXQtPnR2X2ZyZXEgPSBzZXRfdHZfZnJlcTsKKwl0LT5yYWRpb19mcmVxID0gc2V0X3JhZGlvX2ZyZXE7CisJdC0+aGFzX3NpZ25hbCA9IHRlYTU3Njdfc2lnbmFsOworCXQtPmlzX3N0ZXJlbyA9IHRlYTU3Njdfc3RlcmVvOworCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMKaW5kZXggNTE3NDhjNi4uN2Q4MjVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci0zMDM2LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJc3dpdGNoIChjbWQpIAogCXsKLQkJY2FzZSBUVU5FUl9TRVRfVFZGUkVROgorCQljYXNlIFZJRElPQ1NGUkVROgogCQkJc2V0X3R2X2ZyZXEoY2xpZW50LCAqaWFyZyk7CiAJCQlicmVhazsKIAkgICAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDgxODgyZGQuLmRlMTkwNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogdHVuZXItY29yZS5jLHYgMS41IDIwMDUvMDIvMTUgMTU6NTk6MzUga3JheGVsIEV4cCAkCisgKiAkSWQ6IHR1bmVyLWNvcmUuYyx2IDEuNTUgMjAwNS8wNy8wOCAxMzoyMDozMyBtY2hlaGFiIEV4cCAkCiAgKgogICogaTJjIHR2IHR1bmVyIGNoaXAgZGV2aWNlIGRyaXZlcgogICogY29yZSBjb3JlLCBpLmUuIGtlcm5lbCBpbnRlcmZhY2VzLCByZWdpc3RlcmluZyBhbmQgc28gb24KQEAgLTI3LDYxICsyNyw1NiBAQAogCiAvKiBzdGFuZGFyZCBpMmMgaW5zbW9kIG9wdGlvbnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7Ci0JMHg0YiwgLyogdGRhODI5MCAqLworCTB4NGIsCQkJLyogdGRhODI5MCAqLwogCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCiAJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwKIAlJMkNfQ0xJRU5UX0VORAogfTsKKwogSTJDX0NMSUVOVF9JTlNNT0Q7CiAKIC8qIGluc21vZCBvcHRpb25zIHVzZWQgYXQgaW5pdCB0aW1lID0+IHJlYWQvb25seSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBhZGRyICA9ICAwOworc3RhdGljIHVuc2lnbmVkIGludCBhZGRyID0gMDsKIG1vZHVsZV9wYXJhbShhZGRyLCBpbnQsIDA0NDQpOwogCiAvKiBpbnNtb2Qgb3B0aW9ucyB1c2VkIGF0IHJ1bnRpbWUgPT4gcmVhZC93cml0ZSAqLwotdW5zaWduZWQgaW50IHR1bmVyX2RlYnVnICAgPSAwOwotbW9kdWxlX3BhcmFtKHR1bmVyX2RlYnVnLCAgICAgICBpbnQsIDA2NDQpOwordW5zaWduZWQgaW50IHR1bmVyX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbSh0dW5lcl9kZWJ1ZywgaW50LCAwNjQ0KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCB0dl9yYW5nZVsyXSAgICA9IHsgNDQsIDk1OCB9Oworc3RhdGljIHVuc2lnbmVkIGludCB0dl9yYW5nZVsyXSA9IHsgNDQsIDk1OCB9Owogc3RhdGljIHVuc2lnbmVkIGludCByYWRpb19yYW5nZVsyXSA9IHsgNjUsIDEwOCB9OwogCi1tb2R1bGVfcGFyYW1fYXJyYXkodHZfcmFuZ2UsICAgIGludCwgTlVMTCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fYXJyYXkodHZfcmFuZ2UsIGludCwgTlVMTCwgMDY0NCk7CiBtb2R1bGVfcGFyYW1fYXJyYXkocmFkaW9fcmFuZ2UsIGludCwgTlVMTCwgMDY0NCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiZGV2aWNlIGRyaXZlciBmb3IgdmFyaW91cyBUViBhbmQgVFYrRk0gcmFkaW8gdHVuZXJzIik7CiBNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyLCBHZXJkIEtub3JyLCBHdW50aGVyIE1heWVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgdGhpc19hZGFwOwotCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOwogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vLyBTZXQgdHVuZXIgZnJlcXVlbmN5LCAgZnJlcSBpbiBVbml0cyBvZiA2Mi41a0h6ID0gMS8xNk1IegorLyogU2V0IHR1bmVyIGZyZXF1ZW5jeSwgIGZyZXEgaW4gVW5pdHMgb2YgNjIuNWtIeiA9IDEvMTZNSHogKi8KIHN0YXRpYyB2b2lkIHNldF90dl9mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKIAlpZiAodC0+dHlwZSA9PSBVTlNFVCkgewotCQl0dW5lcl9pbmZvKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOworCQl0dW5lcl93YXJuICgidHVuZXIgdHlwZSBub3Qgc2V0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAoTlVMTCA9PSB0LT50dl9mcmVxKSB7Ci0JCXR1bmVyX2luZm8oIkh1aD8gdHZfc2V0IGlzIE5VTEw/XG4iKTsKKwkJdHVuZXJfd2FybiAoIlR1bmVyIGhhcyBubyB3YXkgdG8gc2V0IHR2IGZyZXFcbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChmcmVxIDwgdHZfcmFuZ2VbMF0qMTYgfHwgZnJlcSA+IHR2X3JhbmdlWzFdKjE2KSB7Ci0JCS8qIEZJWE1FOiBiZXR0ZXIgZG8gdGhhdCBjaGlwLXNwZWNpZmljLCBidXQKLQkJICAgcmlnaHQgbm93IHdlIGRvbid0IGhhdmUgdGhhdCBpbiB0aGUgY29uZmlnCi0JCSAgIHN0cnVjdCBhbmQgdGhpcyB3YXkgaXMgc3RpbGwgYmV0dGVyIHRoYW4gbm8KLQkJICAgY2hlY2sgYXQgYWxsICovCi0JCXR1bmVyX2luZm8oIlRWIGZyZXEgKCVkLiUwMmQpIG91dCBvZiByYW5nZSAoJWQtJWQpXG4iLAotCQkJICAgZnJlcS8xNixmcmVxJTE2KjEwMC8xNix0dl9yYW5nZVswXSx0dl9yYW5nZVsxXSk7Ci0JCXJldHVybjsKKwlpZiAoZnJlcSA8IHR2X3JhbmdlWzBdICogMTYgfHwgZnJlcSA+IHR2X3JhbmdlWzFdICogMTYpIHsKKwkJdHVuZXJfZGJnICgiVFYgZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCisJCQkgICBmcmVxIC8gMTYsIGZyZXEgJSAxNiAqIDEwMCAvIDE2LCB0dl9yYW5nZVswXSwKKwkJCSAgIHR2X3JhbmdlWzFdKTsKIAl9Ci0JdC0+dHZfZnJlcShjLGZyZXEpOworCXQtPnR2X2ZyZXEoYywgZnJlcSk7CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9yYWRpb19mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgZnJlcSkKQEAgLTg5LDIwICs4NCwyMSBAQAogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKIAogCWlmICh0LT50eXBlID09IFVOU0VUKSB7Ci0JCXR1bmVyX2luZm8oInR1bmVyIHR5cGUgbm90IHNldFxuIik7CisJCXR1bmVyX3dhcm4gKCJ0dW5lciB0eXBlIG5vdCBzZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChOVUxMID09IHQtPnJhZGlvX2ZyZXEpIHsKLQkJdHVuZXJfaW5mbygibm8gcmFkaW8gdHVuaW5nIGZvciB0aGlzIG9uZSwgc29ycnkuXG4iKTsKKwkJdHVuZXJfd2FybiAoInR1bmVyIGhhcyBubyB3YXkgdG8gc2V0IHJhZGlvIGZyZXF1ZW5jeVxuIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKGZyZXEgPCByYWRpb19yYW5nZVswXSoxNiB8fCBmcmVxID4gcmFkaW9fcmFuZ2VbMV0qMTYpIHsKLQkJdHVuZXJfaW5mbygicmFkaW8gZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCi0JCQkgICBmcmVxLzE2LGZyZXElMTYqMTAwLzE2LAotCQkJICAgcmFkaW9fcmFuZ2VbMF0scmFkaW9fcmFuZ2VbMV0pOwotCQlyZXR1cm47CisJaWYgKGZyZXEgPD0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMCB8fCBmcmVxID49IHJhZGlvX3JhbmdlWzFdICogMTYwMDApIHsKKwkJdHVuZXJfZGJnICgicmFkaW8gZnJlcSAoJWQuJTAyZCkgb3V0IG9mIHJhbmdlICglZC0lZClcbiIsCisJCQkgICBmcmVxIC8gMTYwMDAsIGZyZXEgJSAxNjAwMCAqIDEwMCAvIDE2MDAwLAorCQkJICAgcmFkaW9fcmFuZ2VbMF0sIHJhZGlvX3JhbmdlWzFdKTsKIAl9Ci0JdC0+cmFkaW9fZnJlcShjLGZyZXEpOworCisJdC0+cmFkaW9fZnJlcShjLCBmcmVxKTsKKwlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHNldF9mcmVxKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBsb25nIGZyZXEpCkBAIC0xMTIsNDAgKzEwOCw0NSBAQAogCXN3aXRjaCAodC0+bW9kZSkgewogCWNhc2UgVjRMMl9UVU5FUl9SQURJTzoKIAkJdHVuZXJfZGJnKCJyYWRpbyBmcmVxIHNldCB0byAlbHUuJTAybHVcbiIsCi0JCQkgIGZyZXEvMTYsZnJlcSUxNioxMDAvMTYpOwotCQlzZXRfcmFkaW9fZnJlcShjLGZyZXEpOworCQkJICBmcmVxIC8gMTYwMDAsIGZyZXEgJSAxNjAwMCAqIDEwMCAvIDE2MDAwKTsKKwkJc2V0X3JhZGlvX2ZyZXEoYywgZnJlcSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CiAJY2FzZSBWNEwyX1RVTkVSX0RJR0lUQUxfVFY6CiAJCXR1bmVyX2RiZygidHYgZnJlcSBzZXQgdG8gJWx1LiUwMmx1XG4iLAotCQkJICBmcmVxLzE2LGZyZXElMTYqMTAwLzE2KTsKKwkJCSAgZnJlcSAvIDE2LCBmcmVxICUgMTYgKiAxMDAgLyAxNik7CiAJCXNldF90dl9mcmVxKGMsIGZyZXEpOwogCQlicmVhazsKIAl9CiAJdC0+ZnJlcSA9IGZyZXE7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF90eXBlKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3N0YXRpYyB2b2lkIHNldF90eXBlKHN0cnVjdCBpMmNfY2xpZW50ICpjLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJICAgICB1bnNpZ25lZCBpbnQgbmV3X21vZGVfbWFzaykKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNF07CiAKLQkvKiBzYW5pdHkgY2hlY2sgKi8KLQlpZiAodHlwZSA9PSBVTlNFVCAgfHwgIHR5cGUgPT0gVFVORVJfQUJTRU5UKQotCQlyZXR1cm47Ci0JaWYgKHR5cGUgPj0gdHVuZXJfY291bnQpCi0JCXJldHVybjsKLQotCWlmIChOVUxMID09IHQtPmkyYy5kZXYuZHJpdmVyKSB7Ci0JCS8qIG5vdCByZWdpc3RlcmVkIHlldCAqLwotCQl0LT50eXBlID0gdHlwZTsKKwlpZiAodHlwZSA9PSBVTlNFVCB8fCB0eXBlID09IFRVTkVSX0FCU0VOVCkgeworCQl0dW5lcl9kYmcgKCJ0dW5lciAweCUwMng6IFR1bmVyIHR5cGUgYWJzZW50XG4iLGMtPmFkZHIpOwogCQlyZXR1cm47CiAJfQotCWlmICh0LT5pbml0aWFsaXplZCkKLQkJLyogcnVuIG9ubHkgb25jZSAqLwotCQlyZXR1cm47CiAKLQl0LT5pbml0aWFsaXplZCA9IDE7CisJaWYgKHR5cGUgPj0gdHVuZXJfY291bnQpIHsKKwkJdHVuZXJfd2FybiAoInR1bmVyIDB4JTAyeDogVHVuZXIgY291bnQgZ3JlYXRlciB0aGFuICVkXG4iLGMtPmFkZHIsdHVuZXJfY291bnQpOworCQlyZXR1cm47CisJfQorCisJLyogVGhpcyBjb2RlIGRldGVjdHMgY2FsbHMgYnkgY2FyZCBhdHRhY2hfaW5mb3JtICovCisJaWYgKE5VTEwgPT0gdC0+aTJjLmRldi5kcml2ZXIpIHsKKwkJdHVuZXJfZGJnICgidHVuZXIgMHglMDJ4OiBjYWxsZWQgZHVyaW5nIGkyY19jbGllbnQgcmVnaXN0ZXIgYnkgYWRhcHRlcidzIGF0dGFjaF9pbmZvcm1cbiIsIGMtPmFkZHIpOworCisJCXQtPnR5cGU9dHlwZTsKKwkJcmV0dXJuOworCX0KKwogCXQtPnR5cGUgPSB0eXBlOworCiAJc3dpdGNoICh0LT50eXBlKSB7CiAJY2FzZSBUVU5FUl9NVDIwMzI6CiAJCW1pY3JvdHVuZV9pbml0KGMpOwpAQCAtMTUzLDcwICsxNTQsMTk1IEBACiAJY2FzZSBUVU5FUl9QSElMSVBTX1REQTgyOTA6CiAJCXRkYTgyOTBfaW5pdChjKTsKIAkJYnJlYWs7CisJY2FzZSBUVU5FUl9URUE1NzY3OgorCQlpZiAodGVhNTc2N190dW5lcl9pbml0KGMpID09IEVJTlZBTCkgeworCQkJdC0+dHlwZSA9IFRVTkVSX0FCU0VOVDsKKwkJCXQtPm1vZGVfbWFzayA9IFRfVU5JTklUSUFMSVpFRDsKKwkJCXJldHVybjsKKwkJfQorCQl0LT5tb2RlX21hc2sgPSBUX1JBRElPOworCQlicmVhazsKKwljYXNlIFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMzoKKwkJYnVmZmVyWzBdID0gMHgwYjsKKwkJYnVmZmVyWzFdID0gMHhkYzsKKwkJYnVmZmVyWzJdID0gMHg5YzsKKwkJYnVmZmVyWzNdID0gMHg2MDsKKwkJaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNCk7CisJCW1kZWxheSgxKTsKKwkJYnVmZmVyWzJdID0gMHg4NjsKKwkJYnVmZmVyWzNdID0gMHg1NDsKKwkJaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNCk7CisJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGVmYXVsdF90dW5lcl9pbml0KGMpOwogCQlicmVhazsKIAl9CisKKwlpZiAodC0+bW9kZV9tYXNrID09IFRfVU5JTklUSUFMSVpFRCkKKwkJdC0+bW9kZV9tYXNrID0gbmV3X21vZGVfbWFzazsKKworCXNldF9mcmVxKGMsIHQtPmZyZXEpOworCXR1bmVyX2RiZygiJXMgJXMgSTJDIGFkZHIgMHglMDJ4IHdpdGggdHlwZSAlZCB1c2VkIGZvciAweCUwMnhcbiIsCisJCSAgYy0+YWRhcHRlci0+bmFtZSwgYy0+ZHJpdmVyLT5uYW1lLCBjLT5hZGRyIDw8IDEsIHR5cGUsCisJCSAgdC0+bW9kZV9tYXNrKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gYXBwbHkgdHVuZXIgY29uZmlnIHRvIHR1bmVyIHNwZWNpZmllZAorICogYnkgdHVuX3NldHVwIHN0cnVjdHVyZS4gSSBhZGRyIGlzIHVuc2V0LCB0aGVuIGFkbWluIHN0YXR1cworICogYW5kIHR1biBhZGRyIHN0YXR1cyBpcyBtb3JlIHByZWNpc2UgdGhlbiBjdXJyZW50IHN0YXR1cywKKyAqIGl0J3MgYXBwbGllZC4gT3RoZXJ3aXNlIHN0YXR1cyBhbmQgdHlwZSBhcmUgYXBwbGllZCBvbmx5IHRvCisgKiB0dW5lciB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgYWRkci4KKyovCisKK3N0YXRpYyB2b2lkIHNldF9hZGRyKHN0cnVjdCBpMmNfY2xpZW50ICpjLCBzdHJ1Y3QgdHVuZXJfc2V0dXAgKnR1bl9zZXR1cCkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwlpZiAodHVuX3NldHVwLT5hZGRyID09IEFERFJfVU5TRVQpIHsKKwkJaWYgKHQtPm1vZGVfbWFzayAmIHR1bl9zZXR1cC0+bW9kZV9tYXNrKQorCQkJc2V0X3R5cGUoYywgdHVuX3NldHVwLT50eXBlLCB0dW5fc2V0dXAtPm1vZGVfbWFzayk7CisJfSBlbHNlIGlmICh0dW5fc2V0dXAtPmFkZHIgPT0gYy0+YWRkcikgeworCQlzZXRfdHlwZShjLCB0dW5fc2V0dXAtPnR5cGUsIHR1bl9zZXR1cC0+bW9kZV9tYXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX21vZGUoc3RydWN0IHR1bmVyICp0LCBjaGFyICpjbWQpCit7CisJaWYgKDEgPDwgdC0+bW9kZSAmIHQtPm1vZGVfbWFzaykgeworCQlzd2l0Y2ggKHQtPm1vZGUpIHsKKwkJY2FzZSBWNEwyX1RVTkVSX1JBRElPOgorCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIHJhZGlvXG4iLCBjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9BTkFMT0dfVFY6CisJCQl0dW5lcl9kYmcoIkNtZCAlcyBhY2NlcHRlZCBmb3IgYW5hbG9nIFRWXG4iLCBjbWQpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9ESUdJVEFMX1RWOgorCQkJdHVuZXJfZGJnKCJDbWQgJXMgYWNjZXB0ZWQgZm9yIGRpZ2l0YWwgVFZcbiIsIGNtZCk7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIEVJTlZBTDsKIH0KIAogc3RhdGljIGNoYXIgcGFsW10gPSAiLSI7CiBtb2R1bGVfcGFyYW1fc3RyaW5nKHBhbCwgcGFsLCBzaXplb2YocGFsKSwgMDY0NCk7CitzdGF0aWMgY2hhciBzZWNhbVtdID0gIi0iOworbW9kdWxlX3BhcmFtX3N0cmluZyhzZWNhbSwgc2VjYW0sIHNpemVvZihzZWNhbSksIDA2NDQpOwogCisvKiBnZXQgbW9yZSBwcmVjaXNlIG5vcm0gaW5mbyBmcm9tIGluc21vZCBvcHRpb24gKi8KIHN0YXRpYyBpbnQgdHVuZXJfZml4dXBfc3RkKHN0cnVjdCB0dW5lciAqdCkKIHsKIAlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1BBTCkgPT0gVjRMMl9TVERfUEFMKSB7Ci0JCS8qIGdldCBtb3JlIHByZWNpc2Ugbm9ybSBpbmZvIGZyb20gaW5zbW9kIG9wdGlvbiAqLwogCQlzd2l0Y2ggKHBhbFswXSkgewogCQljYXNlICdiJzoKIAkJY2FzZSAnQic6CiAJCWNhc2UgJ2cnOgogCQljYXNlICdHJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHXG4iKTsKKwkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1CR1xuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfQkc7CiAJCQlicmVhazsKIAkJY2FzZSAnaSc6CiAJCWNhc2UgJ0knOgotCQkJdHVuZXJfZGJnKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtSVxuIik7CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFBBTCA9PiBQQUwtSVxuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfSTsKIAkJCWJyZWFrOwogCQljYXNlICdkJzoKIAkJY2FzZSAnRCc6CiAJCWNhc2UgJ2snOgogCQljYXNlICdLJzoKLQkJCXR1bmVyX2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLURLXG4iKTsKKwkJCXR1bmVyX2RiZyAoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1ES1xuIik7CiAJCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfREs7CiAJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCWNhc2UgJ20nOgorCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU1cbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX007CisJCQlicmVhazsKKwkJY2FzZSAnTic6CisJCWNhc2UgJ24nOgorCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLU5cbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX047CisJCQlicmVhazsKIAkJfQogCX0KKwlpZiAoKHQtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNKSA9PSBWNEwyX1NURF9TRUNBTSkgeworCQlzd2l0Y2ggKHNlY2FtWzBdKSB7CisJCWNhc2UgJ2QnOgorCQljYXNlICdEJzoKKwkJY2FzZSAnayc6CisJCWNhc2UgJ0snOgorCQkJdHVuZXJfZGJnICgiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1ES1xuIik7CisJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9ESzsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJY2FzZSAnTCc6CisJCQl0dW5lcl9kYmcgKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUxcbiIpOworCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTDsKKwkJCWJyZWFrOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogc3RhdGljIHZhciBVc2VkIG9ubHkgaW4gdHVuZXJfYXR0YWNoIGFuZCB0dW5lcl9wcm9iZSAqLworc3RhdGljIHVuc2lnbmVkIGRlZmF1bHRfbW9kZV9tYXNrOworCisvKiBEdXJpbmcgY2xpZW50IGF0dGFjaCwgc2V0X3R5cGUgaXMgY2FsbGVkIGJ5IGFkYXB0ZXIncyBhdHRhY2hfaW5mb3JtIGNhbGxiYWNrLgorICAgc2V0X3R5cGUgbXVzdCB0aGVuIGJlIGNvbXBsZXRlZCBieSB0dW5lcl9hdHRhY2guCisgKi8KIHN0YXRpYyBpbnQgdHVuZXJfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQogewogCXN0cnVjdCB0dW5lciAqdDsKIAotCWlmICh0aGlzX2FkYXAgPiAwKQotCQlyZXR1cm4gLTE7Ci0JdGhpc19hZGFwKys7CisJY2xpZW50X3RlbXBsYXRlLmFkYXB0ZXIgPSBhZGFwOworCWNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKIAotICAgICAgICBjbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0gICAgICAgIGNsaWVudF90ZW1wbGF0ZS5hZGRyID0gYWRkcjsKLQotICAgICAgICB0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR1bmVyKSxHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKE5VTEwgPT0gdCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgbWVtc2V0KHQsMCxzaXplb2Yoc3RydWN0IHR1bmVyKSk7Ci0gICAgICAgIG1lbWNweSgmdC0+aTJjLCZjbGllbnRfdGVtcGxhdGUsc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSk7CisJdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0dW5lciksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHQpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldCh0LCAwLCBzaXplb2Yoc3RydWN0IHR1bmVyKSk7CisJbWVtY3B5KCZ0LT5pMmMsICZjbGllbnRfdGVtcGxhdGUsIHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCkpOwogCWkyY19zZXRfY2xpZW50ZGF0YSgmdC0+aTJjLCB0KTsKLQl0LT50eXBlICAgICAgID0gVU5TRVQ7Ci0JdC0+cmFkaW9faWYyICA9IDEwNzAwKjEwMDA7IC8vIDEwLjdNSHogLSBGTSByYWRpbworCXQtPnR5cGUgPSBVTlNFVDsKKwl0LT5yYWRpb19pZjIgPSAxMDcwMCAqIDEwMDA7CS8qIDEwLjdNSHogLSBGTSByYWRpbyAqLworCXQtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXQtPm1vZGVfbWFzayA9IFRfVU5JTklUSUFMSVpFRDsKIAotICAgICAgICBpMmNfYXR0YWNoX2NsaWVudCgmdC0+aTJjKTsKLQl0dW5lcl9pbmZvKCJjaGlwIGZvdW5kIEAgMHgleCAoJXMpXG4iLAotCQkgICBhZGRyIDw8IDEsIGFkYXAtPm5hbWUpOwotCXNldF90eXBlKCZ0LT5pMmMsIHQtPnR5cGUpOworCisJdHVuZXJfaW5mbygiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwgYWRkciA8PCAxLCBhZGFwLT5uYW1lKTsKKworCS8qIFRFQTU3NjcgYXV0b2RldGVjdGlvbiBjb2RlIC0gb25seSBmb3IgYWRkciA9IDB4YzAgKi8KKwlpZiAoYWRkciA9PSAweDYwKSB7CisJCWlmICh0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oJnQtPmkyYykgIT0gRUlOVkFMKSB7CisJCQl0LT50eXBlID0gVFVORVJfVEVBNTc2NzsKKwkJCXQtPm1vZGVfbWFzayA9IFRfUkFESU87CisJCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQkJdC0+ZnJlcSA9IDg3LjUgKiAxNjsgLyogU2V0cyBmcmVxIHRvIEZNIHJhbmdlICovCisJCQlkZWZhdWx0X21vZGVfbWFzayAmPSB+VF9SQURJTzsKKworCQkJaTJjX2F0dGFjaF9jbGllbnQgKCZ0LT5pMmMpOworCQkJc2V0X3R5cGUoJnQtPmkyYyx0LT50eXBlLCB0LT5tb2RlX21hc2spOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplcyBvbmx5IHRoZSBmaXJzdCBhZGFwdGVyIGZvdW5kICovCisJaWYgKGRlZmF1bHRfbW9kZV9tYXNrICE9IFRfVU5JTklUSUFMSVpFRCkgeworCQl0dW5lcl9kYmcgKCJTZXR0aW5nIG1vZGVfbWFzayB0byAweCUwMnhcbiIsIGRlZmF1bHRfbW9kZV9tYXNrKTsKKwkJdC0+bW9kZV9tYXNrID0gZGVmYXVsdF9tb2RlX21hc2s7CisJCXQtPmZyZXEgPSA0MDAgKiAxNjsgLyogU2V0cyBmcmVxIHRvIFZIRiBIaWdoICovCisJCWRlZmF1bHRfbW9kZV9tYXNrID0gVF9VTklOSVRJQUxJWkVEOworCX0KKworCS8qIFNob3VsZCBiZSBqdXN0IGJlZm9yZSByZXR1cm4gKi8KKwlpMmNfYXR0YWNoX2NsaWVudCAoJnQtPmkyYyk7CisJc2V0X3R5cGUgKCZ0LT5pMmMsdC0+dHlwZSwgdC0+bW9kZV9tYXNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI2LDcgKzM1Miw4IEBACiAJCW5vcm1hbF9pMmNbMF0gPSBhZGRyOwogCQlub3JtYWxfaTJjWzFdID0gSTJDX0NMSUVOVF9FTkQ7CiAJfQotCXRoaXNfYWRhcCA9IDA7CisKKwlkZWZhdWx0X21vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKIAogCWlmIChhZGFwLT5jbGFzcyAmIEkyQ19DTEFTU19UVl9BTkFMT0cpCiAJCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgdHVuZXJfYXR0YWNoKTsKQEAgLTIzNiwzOCArMzYzLDc4IEBACiBzdGF0aWMgaW50IHR1bmVyX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBlcnI7CiAKLQlpMmNfZGV0YWNoX2NsaWVudCgmdC0+aTJjKTsKKwllcnIgPSBpMmNfZGV0YWNoX2NsaWVudCgmdC0+aTJjKTsKKwlpZiAoZXJyKSB7CisJCXR1bmVyX3dhcm4KKwkJICAgICgiQ2xpZW50IGRlcmVnaXN0cmF0aW9uIGZhaWxlZCwgY2xpZW50IG5vdCBkZXRhY2hlZC5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKwogCWtmcmVlKHQpOwogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFNXSVRDSF9WNEwyCWlmICghdC0+dXNpbmdfdjRsMiAmJiB0dW5lcl9kZWJ1ZykgXAotCQkgICAgICAgICAgdHVuZXJfaW5mbygic3dpdGNoaW5nIHRvIHY0bDJcbiIpOyBcCi0JICAgICAgICAgICAgICAgICAgdC0+dXNpbmdfdjRsMiA9IDE7Ci0jZGVmaW5lIENIRUNLX1Y0TDIJaWYgKHQtPnVzaW5nX3Y0bDIpIHsgaWYgKHR1bmVyX2RlYnVnKSBcCi0JCQkgIHR1bmVyX2luZm8oImlnbm9yZSB2NGwxIGNhbGxcbiIpOyBcCi0JCSAgICAgICAgICByZXR1cm4gMDsgfQorLyoKKyAqIFN3aXRjaCB0dW5lciB0byBvdGhlciBtb2RlLiBJZiB0dW5lciBzdXBwb3J0IGJvdGggdHYgYW5kIHJhZGlvLAorICogc2V0IGFub3RoZXIgZnJlcXVlbmN5IHRvIHNvbWUgdmFsdWUgKFRoaXMgaXMgbmVlZGVkIGZvciBzb21lIHBhbAorICogdHVuZXJzIHRvIGF2b2lkIGxvY2tpbmcpLiBPdGhlcndpc2UsIGp1c3QgcHV0IHNlY29uZCB0dW5lciBpbgorICogc3RhbmRieSBtb2RlLgorICovCiAKLXN0YXRpYyBpbnQKLXR1bmVyX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQorc3RhdGljIGlubGluZSBpbnQgc2V0X21vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHR1bmVyICp0LCBpbnQgbW9kZSwgY2hhciAqY21kKQoreworCWlmIChtb2RlICE9IHQtPm1vZGUpIHsKKworCQl0LT5tb2RlID0gbW9kZTsKKwkJaWYgKGNoZWNrX21vZGUodCwgY21kKSA9PSBFSU5WQUwpIHsKKwkJCXQtPm1vZGUgPSBUX1NUQU5EQlk7CisJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSBtb2RlKSB7CisJCQkJc2V0X3R2X2ZyZXEoY2xpZW50LCA0MDAgKiAxNik7CisJCQl9IGVsc2UgeworCQkJCXNldF9yYWRpb19mcmVxKGNsaWVudCwgODcuNSAqIDE2MDAwKTsKKwkJCX0KKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgc3dpdGNoX3Y0bDIoKQlpZiAoIXQtPnVzaW5nX3Y0bDIpIFwKKwkJICAgICAgICAgICAgdHVuZXJfZGJnKCJzd2l0Y2hpbmcgdG8gdjRsMlxuIik7IFwKKwkgICAgICAgICAgICAgICAgdC0+dXNpbmdfdjRsMiA9IDE7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3Y0bDIoc3RydWN0IHR1bmVyICp0KQoreworCWlmICh0LT51c2luZ192NGwyKSB7CisJCXR1bmVyX2RiZyAoImlnbm9yZSB2NGwxIGNhbGxcbiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLSAgICAgICAgdW5zaWduZWQgaW50ICppYXJnID0gKGludCopYXJnOworCXVuc2lnbmVkIGludCAqaWFyZyA9IChpbnQgKilhcmc7CiAKLSAgICAgICAgc3dpdGNoIChjbWQpIHsKLQorCXN3aXRjaCAoY21kKSB7CiAJLyogLS0tIGNvbmZpZ3VyYXRpb24gLS0tICovCi0JY2FzZSBUVU5FUl9TRVRfVFlQRToKLQkJc2V0X3R5cGUoY2xpZW50LCppYXJnKTsKKwljYXNlIFRVTkVSX1NFVF9UWVBFX0FERFI6CisJCXR1bmVyX2RiZyAoIkNhbGxpbmcgc2V0X3R5cGVfYWRkciBmb3IgdHlwZT0lZCwgYWRkcj0weCUwMngsIG1vZGU9MHglMDJ4XG4iLAorCQkJCSgoc3RydWN0IHR1bmVyX3NldHVwICopYXJnKS0+dHlwZSwKKwkJCQkoKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyktPmFkZHIsCisJCQkJKChzdHJ1Y3QgdHVuZXJfc2V0dXAgKilhcmcpLT5tb2RlX21hc2spOworCisJCXNldF9hZGRyKGNsaWVudCwgKHN0cnVjdCB0dW5lcl9zZXR1cCAqKWFyZyk7CiAJCWJyZWFrOwogCWNhc2UgQVVEQ19TRVRfUkFESU86Ci0JCWlmIChWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpIHsKLQkJCXNldF90dl9mcmVxKGNsaWVudCw0MDAgKiAxNik7Ci0JCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9SQURJTzsKLQkJfQorCQlzZXRfbW9kZShjbGllbnQsdCxWNEwyX1RVTkVSX1JBRElPLCAiQVVEQ19TRVRfUkFESU8iKTsKIAkJYnJlYWs7CiAJY2FzZSBBVURDX0NPTkZJR19QSU5OQUNMRToKKwkJaWYgKGNoZWNrX21vZGUodCwgIkFVRENfQ09ORklHX1BJTk5BQ0xFIikgPT0gRUlOVkFMKQorCQkJcmV0dXJuIDA7CiAJCXN3aXRjaCAoKmlhcmcpIHsKIAkJY2FzZSAyOgogCQkJdHVuZXJfZGJnKCJwaW5uYWNsZSBwYWxcbiIpOwpAQCAtMjc4LDE1NCArNDQ1LDIzOSBAQAogCQkJdC0+cmFkaW9faWYyID0gNDEzMDAgKiAxMDAwOwogCQkJYnJlYWs7CiAJCX0KLSAgICAgICAgICAgICAgICBicmVhazsKLQorCQlicmVhazsKKwljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKKwkJYnJlYWs7CiAJLyogLS0tIHY0bCBpb2N0bHMgLS0tICovCiAJLyogdGFrZSBjYXJlOiBidHR2IGRvZXMgdXNlcnNwYWNlIGNvcHlpbmcsIHdlJ2xsIGdldCBhCiAJICAga2VybmVsIHBvaW50ZXIgaGVyZS4uLiAqLwogCWNhc2UgVklESU9DU0NIQU46Ci0JewotCQlzdGF0aWMgY29uc3QgdjRsMl9zdGRfaWQgbWFwW10gPSB7Ci0JCQlbIFZJREVPX01PREVfUEFMICAgXSA9IFY0TDJfU1REX1BBTCwKLQkJCVsgVklERU9fTU9ERV9OVFNDICBdID0gVjRMMl9TVERfTlRTQ19NLAotCQkJWyBWSURFT19NT0RFX1NFQ0FNIF0gPSBWNEwyX1NURF9TRUNBTSwKLQkJCVsgNCAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfUEFMX00sCi0JCQlbIDUgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX1BBTF9OLAotCQkJWyA2IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9OVFNDX01fSlAsCi0JCX07Ci0JCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKKwkJeworCQkJc3RhdGljIGNvbnN0IHY0bDJfc3RkX2lkIG1hcFtdID0geworCQkJCVtWSURFT19NT0RFX1BBTF0gPSBWNEwyX1NURF9QQUwsCisJCQkJW1ZJREVPX01PREVfTlRTQ10gPSBWNEwyX1NURF9OVFNDX00sCisJCQkJW1ZJREVPX01PREVfU0VDQU1dID0gVjRMMl9TVERfU0VDQU0sCisJCQkJWzQgLyogYnR0diAqLyBdID0gVjRMMl9TVERfUEFMX00sCisJCQkJWzUgLyogYnR0diAqLyBdID0gVjRMMl9TVERfUEFMX04sCisJCQkJWzYgLyogYnR0diAqLyBdID0gVjRMMl9TVERfTlRTQ19NX0pQLAorCQkJfTsKKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2YyA9IGFyZzsKIAotCQlDSEVDS19WNEwyOwotCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCWlmICh2Yy0+bm9ybSA8IEFSUkFZX1NJWkUobWFwKSkKLQkJCXQtPnN0ZCA9IG1hcFt2Yy0+bm9ybV07Ci0JCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKLQkJaWYgKHQtPmZyZXEpCi0JCQlzZXRfdHZfZnJlcShjbGllbnQsdC0+ZnJlcSk7Ci0JCXJldHVybiAwOwotCX0KKwkJCWlmIChjaGVja192NGwyKHQpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKworCQkJaWYgKHNldF9tb2RlKGNsaWVudCx0LFY0TDJfVFVORVJfQU5BTE9HX1RWLCAiVklESU9DU0NIQU4iKT09RUlOVkFMKQorCQkJCXJldHVybiAwOworCisJCQlpZiAodmMtPm5vcm0gPCBBUlJBWV9TSVpFKG1hcCkpCisJCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKKwkJCXR1bmVyX2ZpeHVwX3N0ZCh0KTsKKwkJCWlmICh0LT5mcmVxKQorCQkJCXNldF90dl9mcmVxKGNsaWVudCwgdC0+ZnJlcSk7CisJCQlyZXR1cm4gMDsKKwkJfQogCWNhc2UgVklESU9DU0ZSRVE6Ci0JewotCQl1bnNpZ25lZCBsb25nICp2ID0gYXJnOworCQl7CisJCQl1bnNpZ25lZCBsb25nICp2ID0gYXJnOwogCi0JCUNIRUNLX1Y0TDI7Ci0JCXNldF9mcmVxKGNsaWVudCwqdik7Ci0JCXJldHVybiAwOwotCX0KKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NTRlJFUSIpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChjaGVja192NGwyKHQpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKworCQkJc2V0X2ZyZXEoY2xpZW50LCAqdik7CisJCQlyZXR1cm4gMDsKKwkJfQogCWNhc2UgVklESU9DR1RVTkVSOgotCXsKLQkJc3RydWN0IHZpZGVvX3R1bmVyICp2dCA9IGFyZzsKKwkJeworCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2dCA9IGFyZzsKIAotCQlDSEVDS19WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICAmJiAgdC0+aGFzX3NpZ25hbCkKLQkJCXZ0LT5zaWduYWwgPSB0LT5oYXNfc2lnbmFsKGNsaWVudCk7Ci0JCXJldHVybiAwOwotCX0KKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NHVFVORVIiKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoY2hlY2tfdjRsMih0KSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpIHsKKwkJCQlpZiAodC0+aGFzX3NpZ25hbCkKKwkJCQkJdnQtPnNpZ25hbCA9IHQtPmhhc19zaWduYWwoY2xpZW50KTsKKwkJCQlpZiAodC0+aXNfc3RlcmVvKSB7CisJCQkJCWlmICh0LT5pc19zdGVyZW8oY2xpZW50KSkKKwkJCQkJCXZ0LT5mbGFncyB8PQorCQkJCQkJICAgIFZJREVPX1RVTkVSX1NURVJFT19PTjsKKwkJCQkJZWxzZQorCQkJCQkJdnQtPmZsYWdzICY9CisJCQkJCQkgICAgflZJREVPX1RVTkVSX1NURVJFT19PTjsKKwkJCQl9CisJCQkJdnQtPmZsYWdzIHw9IFZJREVPX1RVTkVSX0xPVzsJLyogQWxsb3cgZnJlcXMgYXQgNjIuNSBIeiAqLworCisJCQkJdnQtPnJhbmdlbG93ID0gcmFkaW9fcmFuZ2VbMF0gKiAxNjAwMDsKKwkJCQl2dC0+cmFuZ2VoaWdoID0gcmFkaW9fcmFuZ2VbMV0gKiAxNjAwMDsKKworCQkJfSBlbHNlIHsKKwkJCQl2dC0+cmFuZ2Vsb3cgPSB0dl9yYW5nZVswXSAqIDE2OworCQkJCXZ0LT5yYW5nZWhpZ2ggPSB0dl9yYW5nZVsxXSAqIDE2OworCQkJfQorCisJCQlyZXR1cm4gMDsKKwkJfQogCWNhc2UgVklESU9DR0FVRElPOgotCXsKLQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKKwkJeworCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2YSA9IGFyZzsKIAotCQlDSEVDS19WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICAmJiAgdC0+aXNfc3RlcmVvKQotCQkJdmEtPm1vZGUgPSB0LT5pc19zdGVyZW8oY2xpZW50KQotCQkJCT8gVklERU9fU09VTkRfU1RFUkVPCi0JCQkJOiBWSURFT19TT1VORF9NT05POwotCQlyZXR1cm4gMDsKLQl9CisJCQlpZiAoY2hlY2tfbW9kZSh0LCAiVklESU9DR0FVRElPIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCQkJaWYgKGNoZWNrX3Y0bDIodCkgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCisJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlICYmIHQtPmlzX3N0ZXJlbykKKwkJCQl2YS0+bW9kZSA9IHQtPmlzX3N0ZXJlbyhjbGllbnQpCisJCQkJICAgID8gVklERU9fU09VTkRfU1RFUkVPIDogVklERU9fU09VTkRfTU9OTzsKKwkJCXJldHVybiAwOworCQl9CiAKIAljYXNlIFZJRElPQ19TX1NURDoKLQl7Ci0JCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKwkJeworCQkJdjRsMl9zdGRfaWQgKmlkID0gYXJnOwogCi0JCVNXSVRDSF9WNEwyOwotCQl0LT5tb2RlID0gVjRMMl9UVU5FUl9BTkFMT0dfVFY7Ci0JCXQtPnN0ZCA9ICppZDsKLQkJdHVuZXJfZml4dXBfc3RkKHQpOwotCQlpZiAodC0+ZnJlcSkKLQkJCXNldF9mcmVxKGNsaWVudCx0LT5mcmVxKTsKLQkJYnJlYWs7Ci0JfQorCQkJaWYgKHNldF9tb2RlIChjbGllbnQsIHQsIFY0TDJfVFVORVJfQU5BTE9HX1RWLCAiVklESU9DX1NfU1REIikKKwkJCQkJPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCisJCQlzd2l0Y2hfdjRsMigpOworCisJCQl0LT5zdGQgPSAqaWQ7CisJCQl0dW5lcl9maXh1cF9zdGQodCk7CisJCQlpZiAodC0+ZnJlcSkKKwkJCQlzZXRfZnJlcShjbGllbnQsIHQtPmZyZXEpOworCQkJYnJlYWs7CisJCX0KIAljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQl7Ci0JCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKKwkJeworCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwogCi0JCVNXSVRDSF9WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSBmLT50eXBlICYmCi0JCSAgICBWNEwyX1RVTkVSX1JBRElPICE9IHQtPm1vZGUpCi0JCQlzZXRfdHZfZnJlcShjbGllbnQsNDAwKjE2KTsKLQkJdC0+bW9kZSAgPSBmLT50eXBlOwotCQlzZXRfZnJlcShjbGllbnQsZi0+ZnJlcXVlbmN5KTsKLQkJYnJlYWs7Ci0JfQorCQkJdC0+ZnJlcSA9IGYtPmZyZXF1ZW5jeTsKKwkJCXN3aXRjaF92NGwyKCk7CisJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSBmLT50eXBlICYmCisJCQkgICAgVjRMMl9UVU5FUl9SQURJTyAhPSB0LT5tb2RlKSB7CisJCQkgICAgICAgIGlmIChzZXRfbW9kZSAoY2xpZW50LCB0LCBmLT50eXBlLCAiVklESU9DX1NfRlJFUVVFTkNZIikKKwkJCQkJICAgID09IEVJTlZBTCkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzZXRfZnJlcShjbGllbnQsdC0+ZnJlcSk7CisKKwkJCWJyZWFrOworCQl9CiAJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7CisJCXsKKwkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKIAotCQlTV0lUQ0hfVjRMMjsKLQkJZi0+dHlwZSA9IHQtPm1vZGU7Ci0JCWYtPmZyZXF1ZW5jeSA9IHQtPmZyZXE7Ci0JCWJyZWFrOwotCX0KKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NfR19GUkVRVUVOQ1kiKSA9PSBFSU5WQUwpCisJCQkJcmV0dXJuIDA7CisJCQlzd2l0Y2hfdjRsMigpOworCQkJZi0+dHlwZSA9IHQtPm1vZGU7CisJCQlmLT5mcmVxdWVuY3kgPSB0LT5mcmVxOworCQkJYnJlYWs7CisJCX0KIAljYXNlIFZJRElPQ19HX1RVTkVSOgotCXsKLQkJc3RydWN0IHY0bDJfdHVuZXIgKnR1bmVyID0gYXJnOworCQl7CisJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdHVuZXIgPSBhcmc7CiAKLQkJU1dJVENIX1Y0TDI7Ci0JCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUgICYmICB0LT5oYXNfc2lnbmFsKQotCQkJdHVuZXItPnNpZ25hbCA9IHQtPmhhc19zaWduYWwoY2xpZW50KTsKLQkJdHVuZXItPnJhbmdlbG93ID0gdHZfcmFuZ2VbMF0gKiAxNjsKLQkJdHVuZXItPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7Ci0JCWJyZWFrOwotCX0KKwkJCWlmIChjaGVja19tb2RlKHQsICJWSURJT0NfR19UVU5FUiIpID09IEVJTlZBTCkKKwkJCQlyZXR1cm4gMDsKKwkJCXN3aXRjaF92NGwyKCk7CisKKwkJCWlmIChWNEwyX1RVTkVSX1JBRElPID09IHQtPm1vZGUpIHsKKworCQkJCWlmICh0LT5oYXNfc2lnbmFsKQorCQkJCQl0dW5lci0+c2lnbmFsID0gdC0+aGFzX3NpZ25hbChjbGllbnQpOworCisJCQkJaWYgKHQtPmlzX3N0ZXJlbykgeworCQkJCQlpZiAodC0+aXNfc3RlcmVvKGNsaWVudCkpIHsKKwkJCQkJCXR1bmVyLT5yeHN1YmNoYW5zID0KKwkJCQkJCSAgICBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gfAorCQkJCQkJICAgIFY0TDJfVFVORVJfU1VCX01PTk87CisJCQkJCX0gZWxzZSB7CisJCQkJCQl0dW5lci0+cnhzdWJjaGFucyA9CisJCQkJCQkgICAgVjRMMl9UVU5FUl9TVUJfTU9OTzsKKwkJCQkJfQorCQkJCX0KKworCQkJCXR1bmVyLT5jYXBhYmlsaXR5IHw9CisJCQkJICAgIFY0TDJfVFVORVJfQ0FQX0xPVyB8IFY0TDJfVFVORVJfQ0FQX1NURVJFTzsKKworCQkJCXR1bmVyLT5hdWRtb2RlID0gdC0+YXVkbW9kZTsKKworCQkJCXR1bmVyLT5yYW5nZWxvdyA9IHJhZGlvX3JhbmdlWzBdICogMTYwMDA7CisJCQkJdHVuZXItPnJhbmdlaGlnaCA9IHJhZGlvX3JhbmdlWzFdICogMTYwMDA7CisJCQl9IGVsc2UgeworCQkJCXR1bmVyLT5yYW5nZWxvdyA9IHR2X3JhbmdlWzBdICogMTY7CisJCQkJdHVuZXItPnJhbmdlaGlnaCA9IHR2X3JhbmdlWzFdICogMTY7CisJCQl9CisJCQlicmVhazsKKwkJfQorCWNhc2UgVklESU9DX1NfVFVORVI6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3R1bmVyICp0dW5lciA9IGFyZzsKKworCQkJaWYgKGNoZWNrX21vZGUodCwgIlZJRElPQ19TX1RVTkVSIikgPT0gRUlOVkFMKQorCQkJCXJldHVybiAwOworCisJCQlzd2l0Y2hfdjRsMigpOworCisJCQlpZiAoVjRMMl9UVU5FUl9SQURJTyA9PSB0LT5tb2RlKSB7CisJCQkJdC0+YXVkbW9kZSA9IHR1bmVyLT5hdWRtb2RlOworCQkJCXNldF9yYWRpb19mcmVxKGNsaWVudCwgdC0+ZnJlcSk7CisJCQl9CisJCQlicmVhazsKKwkJfQogCWRlZmF1bHQ6Ci0JCS8qIG5vdGhpbmcgKi8KKwkJdHVuZXJfZGJnKCJVbmltcGxlbWVudGVkIElPQ1RMIDB4JTA4eCBjYWxsZWQgdG8gdHVuZXIuXG4iLCBjbWQpOwogCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0dW5lcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQorc3RhdGljIGludCB0dW5lcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHN0YXRlLCB1MzIgbGV2ZWwpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaTJjX2NsaWVudCwgZGV2KTsKLQlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBjb250YWluZXJfb2YgKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhIChjKTsKIAotCXR1bmVyX2RiZygic3VzcGVuZFxuIik7CisJdHVuZXJfZGJnICgic3VzcGVuZFxuIik7CiAJLyogRklYTUU6IHBvd2VyIGRvd24gPz8/ICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdHVuZXJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHUzMiBsZXZlbCkKK3N0YXRpYyBpbnQgdHVuZXJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7Ci0Jc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mIChkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YSAoYyk7CiAKLQl0dW5lcl9kYmcoInJlc3VtZVxuIik7CisJdHVuZXJfZGJnICgicmVzdW1lXG4iKTsKIAlpZiAodC0+ZnJlcSkKLQkJc2V0X2ZyZXEoYyx0LT5mcmVxKTsKKwkJc2V0X2ZyZXEoYywgdC0+ZnJlcSk7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0gICAgICAgIC5uYW1lICAgICAgICAgICA9ICJ0dW5lciIsCi0gICAgICAgIC5pZCAgICAgICAgICAgICA9IEkyQ19EUklWRVJJRF9UVU5FUiwKLSAgICAgICAgLmZsYWdzICAgICAgICAgID0gSTJDX0RGX05PVElGWSwKLSAgICAgICAgLmF0dGFjaF9hZGFwdGVyID0gdHVuZXJfcHJvYmUsCi0gICAgICAgIC5kZXRhY2hfY2xpZW50ICA9IHR1bmVyX2RldGFjaCwKLSAgICAgICAgLmNvbW1hbmQgICAgICAgID0gdHVuZXJfY29tbWFuZCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJ0dW5lciIsCisJLmlkID0gSTJDX0RSSVZFUklEX1RVTkVSLAorCS5mbGFncyA9IEkyQ19ERl9OT1RJRlksCisJLmF0dGFjaF9hZGFwdGVyID0gdHVuZXJfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgPSB0dW5lcl9kZXRhY2gsCisJLmNvbW1hbmQgPSB0dW5lcl9jb21tYW5kLAogCS5kcml2ZXIgPSB7Ci0JCS5zdXNwZW5kID0gdHVuZXJfc3VzcGVuZCwKLQkJLnJlc3VtZSAgPSB0dW5lcl9yZXN1bWUsCi0JfSwKKwkJICAgLnN1c3BlbmQgPSB0dW5lcl9zdXNwZW5kLAorCQkgICAucmVzdW1lID0gdHVuZXJfcmVzdW1lLAorCQkgICB9LAogfTsKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPQoteworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9IHsKIAlJMkNfREVWTkFNRSgiKHR1bmVyIHVuc2V0KSIpLAotCS5mbGFncyAgICAgID0gSTJDX0NMSUVOVF9BTExPV19VU0UsCi0gICAgICAgIC5kcml2ZXIgICAgID0gJmRyaXZlciwKKwkuZmxhZ3MgPSBJMkNfQ0xJRU5UX0FMTE9XX1VTRSwKKwkuZHJpdmVyID0gJmRyaXZlciwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHR1bmVyX2luaXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwppbmRleCA0OGM2Y2VmLi5hM2Y4ZTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiB0dW5lci1zaW1wbGUuYyx2IDEuMTAgMjAwNS8wMy8wOCAwODozODowMCBrcmF4ZWwgRXhwICQKKyAqICRJZDogdHVuZXItc2ltcGxlLmMsdiAxLjM5IDIwMDUvMDcvMDcgMDE6NDk6MzAgbWtydWZreSBFeHAgJAogICoKICAqIGkyYyB0diB0dW5lciBjaGlwIGRldmljZSBkcml2ZXIKICAqIGNvbnRyb2xzIGFsbCB0aG9zZSBzaW1wbGUgNC1jb250cm9sLWJ5dGVzIHN0eWxlIHR1bmVycy4KQEAgLTU0LDYgKzU0LDI3IEBACiAjZGVmaW5lIFBISUxJUFNfTUZfU0VUX1BBTF9MCTB4MDMgLy8gRnJhbmNlCiAjZGVmaW5lIFBISUxJUFNfTUZfU0VUX1BBTF9MMgkweDAyIC8vIEwnCiAKKy8qIENvbnRyb2wgYnl0ZSAqLworCisjZGVmaW5lIFRVTkVSX1JBVElPX01BU0sgICAgICAgIDB4MDYgLyogQml0IGNiMTpjYjIgKi8KKyNkZWZpbmUgVFVORVJfUkFUSU9fU0VMRUNUXzUwICAgMHgwMAorI2RlZmluZSBUVU5FUl9SQVRJT19TRUxFQ1RfMzIgICAweDAyCisjZGVmaW5lIFRVTkVSX1JBVElPX1NFTEVDVF8xNjYgIDB4MDQKKyNkZWZpbmUgVFVORVJfUkFUSU9fU0VMRUNUXzYyICAgMHgwNgorCisjZGVmaW5lIFRVTkVSX0NIQVJHRV9QVU1QICAgICAgIDB4NDAgIC8qIEJpdCBjYjYgKi8KKworLyogU3RhdHVzIGJ5dGUgKi8KKworI2RlZmluZSBUVU5FUl9QT1IJICAweDgwCisjZGVmaW5lIFRVTkVSX0ZMICAgICAgICAgIDB4NDAKKyNkZWZpbmUgVFVORVJfTU9ERSAgICAgICAgMHgzOAorI2RlZmluZSBUVU5FUl9BRkMgICAgICAgICAweDA3CisjZGVmaW5lIFRVTkVSX1NJR05BTCAgICAgIDB4MDcKKyNkZWZpbmUgVFVORVJfU1RFUkVPICAgICAgMHgxMAorCisjZGVmaW5lIFRVTkVSX1BMTF9MT0NLRUQgICAweDQwCisjZGVmaW5lIFRVTkVSX1NURVJFT19NSzMgICAweDA0CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMjA3LDEyICsyMjgsMjUgQEAKIAl7ICJMRyBQQUwgKFRBUEUgc2VyaWVzKSIsIExHSU5OT1RFSywgUEFMLAogICAgICAgICAgIDE2KjE3MC4wMCwgMTYqNDUwLjAwLCAweDAxLDB4MDIsMHgwOCwweGNlLDYyM30sCiAKLSAgICAgICAgeyAiUGhpbGlwcyBQQUwvU0VDQU0gbXVsdGkgKEZRMTIxNkFNRSBNSzQpIiwgUGhpbGlwcywgUEFMLAotICAgICAgICAgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw2MjMgfSwKLSAgICAgICAgeyAiUGhpbGlwcyBGUTEyMzZBIE1LNCIsIFBoaWxpcHMsIE5UU0MsCi0gICAgICAgICAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDAxLDB4MDIsMHgwNCwweDhlLDczMiB9LAorCXsgIlBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGUTEyMTZBTUUgTUs0KSIsIFBoaWxpcHMsIFBBTCwKKwkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHhjZSw2MjMgfSwKKwl7ICJQaGlsaXBzIEZRMTIzNkEgTUs0IiwgUGhpbGlwcywgTlRTQywKKwkgIDE2KjE2MC4wMCwxNio0NDIuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzIgfSwKKwl7ICJZbWVjIFRWaXNpb24gVFZGLTg1MzFNRi84ODMxTUYvODczMU1GIiwgUGhpbGlwcywgTlRTQywKKwkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHhhMCwweDkwLDB4MzAsMHg4ZSw3MzJ9LAorCXsgIlltZWMgVFZpc2lvbiBUVkYtNTUzM01GIiwgUGhpbGlwcywgTlRTQywKKwkgIDE2KjE2MC4wMCwxNio0NTQuMDAsMHgwMSwweDAyLDB4MDQsMHg4ZSw3MzJ9LAogCisJeyAiVGhvbXNvbiBERFQgNzYxMSAoQVRTQy9OVFNDKSIsIFRIT01TT04sIEFUU0MsCisJICAxNioxNTcuMjUsMTYqNDU0LjAwLDB4MzksMHgzYSwweDNjLDB4OGUsNzMyfSwKKwl7ICJUZW5hIFRORjk1MzMtRC9JRi9UTkY5NTMzLUIvREYiLCBQaGlsaXBzLCBQQUwsCisgICAgICAgICAgMTYqMTYwLjI1LDE2KjQ2NC4yNSwweDAxLDB4MDIsMHgwNCwweDhlLDYyM30sCisJeyAiUGhpbGlwcyBURUE1NzY3SE4gRk0gUmFkaW8iLCBQaGlsaXBzLCBSQURJTywKKyAgICAgICAgICAvKiBzZWUgdGVhNTc2Ny5jIGZvciBkZXRhaWxzICovfSwKKwl7ICJQaGlsaXBzIEZNRDEyMTZNRSBNSzMgSHlicmlkIFR1bmVyIiwgUGhpbGlwcywgUEFMLAorCSAgMTYqMTYwLjAwLDE2KjQ0Mi4wMCwweDUxLDB4NTIsMHg1NCwweDg2LDYyMyB9LAogfTsKKwogdW5zaWduZWQgY29uc3QgaW50IHR1bmVyX2NvdW50ID0gQVJSQVlfU0laRSh0dW5lcnMpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjMsNDMgKzI1NywzNSBAQAogCiAJaWYgKDEgIT0gaTJjX21hc3Rlcl9yZWN2KGMsJmJ5dGUsMSkpCiAJCXJldHVybiAwOworCiAJcmV0dXJuIGJ5dGU7CiB9CiAKLSNkZWZpbmUgVFVORVJfUE9SICAgICAgIDB4ODAKLSNkZWZpbmUgVFVORVJfRkwgICAgICAgIDB4NDAKLSNkZWZpbmUgVFVORVJfTU9ERSAgICAgIDB4MzgKLSNkZWZpbmUgVFVORVJfQUZDICAgICAgIDB4MDcKLQotI2RlZmluZSBUVU5FUl9TVEVSRU8gICAgMHgxMCAvKiByYWRpbyBtb2RlICovCi0jZGVmaW5lIFRVTkVSX1NJR05BTCAgICAweDA3IC8qIHJhZGlvIG1vZGUgKi8KLQogc3RhdGljIGludCB0dW5lcl9zaWduYWwoc3RydWN0IGkyY19jbGllbnQgKmMpCiB7Ci0JcmV0dXJuICh0dW5lcl9nZXRzdGF0dXMoYykgJiBUVU5FUl9TSUdOQUwpPDwxMzsKKwlyZXR1cm4gKHR1bmVyX2dldHN0YXR1cyhjKSAmIFRVTkVSX1NJR05BTCkgPDwgMTM7CiB9CiAKIHN0YXRpYyBpbnQgdHVuZXJfc3RlcmVvKHN0cnVjdCBpMmNfY2xpZW50ICpjKQogewotCXJldHVybiAodHVuZXJfZ2V0c3RhdHVzIChjKSAmIFRVTkVSX1NURVJFTyk7CisJaW50IHN0ZXJlbywgc3RhdHVzOworCXN0cnVjdCB0dW5lciAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKworCXN0YXR1cyA9IHR1bmVyX2dldHN0YXR1cyAoYyk7CisKKwlzd2l0Y2ggKHQtPnR5cGUpIHsKKyAgICAgICAgCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMTZNRV9NSzM6CisgICAgCQljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMzoKKwkJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDM6CisJCQlzdGVyZW8gPSAoKHN0YXR1cyAmIFRVTkVSX1NJR05BTCkgPT0gVFVORVJfU1RFUkVPX01LMyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0ZXJlbyA9IHN0YXR1cyAmIFRVTkVSX1NURVJFTzsKKwl9CisKKwlyZXR1cm4gc3RlcmVvOwogfQogCi0jaWYgMCAvKiB1bnVzZWQgKi8KLXN0YXRpYyBpbnQgdHVuZXJfaXNsb2NrZWQgKHN0cnVjdCBpMmNfY2xpZW50ICpjKQotewotICAgICAgICByZXR1cm4gKHR1bmVyX2dldHN0YXR1cyAoYykgJiBUVU5FUl9GTCk7Ci19Ci0KLXN0YXRpYyBpbnQgdHVuZXJfYWZjc3RhdHVzIChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKLXsKLSAgICAgICAgcmV0dXJuICh0dW5lcl9nZXRzdGF0dXMgKGMpICYgVFVORVJfQUZDKSAtIDI7Ci19Ci0KLXN0YXRpYyBpbnQgdHVuZXJfbW9kZSAoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0gICAgICAgIHJldHVybiAodHVuZXJfZ2V0c3RhdHVzIChjKSAmIFRVTkVSX01PREUpID4+IDM7Ci19Ci0jZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0zNDIsNyArMzY4LDcgQEAKIAogCWNhc2UgVFVORVJfTUlDUk9UVU5FXzQwNDJGSTU6CiAJCS8qIFNldCB0aGUgY2hhcmdlIHB1bXAgZm9yIGZhc3QgdHVuaW5nICovCi0JCXR1bi0+Y29uZmlnIHw9IDB4NDA7CisJCXR1bi0+Y29uZmlnIHw9IFRVTkVSX0NIQVJHRV9QVU1QOwogCQlicmVhazsKIAl9CiAKQEAgLTM5MSwxNCArNDE3LDEzIEBACiAJCQkJdHVuZXJfd2FybigiaTJjIGkvbyByZWFkIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDEpXG4iLHJjKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCS8qIGJpdCA2IGlzIFBMTCBsb2NrZWQgaW5kaWNhdG9yICovCi0JCQlpZiAoc3RhdHVzX2J5dGUgJiAweDQwKQorCQkJaWYgKHN0YXR1c19ieXRlICYgVFVORVJfUExMX0xPQ0tFRCkKIAkJCQlicmVhazsKIAkJCXVkZWxheSgxMCk7CiAJCX0KIAogCQkvKiBTZXQgdGhlIGNoYXJnZSBwdW1wIGZvciBvcHRpbWl6ZWQgcGhhc2Ugbm9pc2UgZmlndXJlICovCi0JCXR1bi0+Y29uZmlnICY9IH4weDQwOworCQl0dW4tPmNvbmZpZyAmPSB+VFVORVJfQ0hBUkdFX1BVTVA7CiAJCWJ1ZmZlclswXSA9IChkaXY+PjgpICYgMHg3ZjsKIAkJYnVmZmVyWzFdID0gZGl2ICAgICAgJiAweGZmOwogCQlidWZmZXJbMl0gPSB0dW4tPmNvbmZpZzsKQEAgLTQxOSwxOCArNDQ0LDIyIEBACiAJdW5zaWduZWQgZGl2OwogCWludCByYzsKIAotCXR1bj0mdHVuZXJzW3QtPnR5cGVdOwotCWRpdiA9IGZyZXEgKyAoaW50KSgxNioxMC43KTsKLQlidWZmZXJbMl0gPSB0dW4tPmNvbmZpZzsKKwl0dW4gPSAmdHVuZXJzW3QtPnR5cGVdOworCWRpdiA9ICgyMCAqIGZyZXEgLyAxNjAwMCkgKyAoaW50KSgyMCoxMC43KTsgLyogSUYgMTAuNyBNSHogKi8KKwlidWZmZXJbMl0gPSAodHVuLT5jb25maWcgJiB+VFVORVJfUkFUSU9fTUFTSykgfCBUVU5FUl9SQVRJT19TRUxFQ1RfNTA7IC8qIDUwIGtIeiBzdGVwICovCiAKIAlzd2l0Y2ggKHQtPnR5cGUpIHsKKwljYXNlIFRVTkVSX1RFTkFfOTUzM19ESToKKwljYXNlIFRVTkVSX1lNRUNfVFZGXzU1MzNNRjoKKwkJdHVuZXJfZGJnICgiVGhpcyB0dW5lciBkb2Vzbid0IGhhdmUgRk0uIE1vc3QgY2FyZHMgaGFzIGEgVEVBNTc2NyBmb3IgRk1cbiIpOworCQlyZXR1cm47CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMzoKIAljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMzoKKwljYXNlIFRVTkVSX1BISUxJUFNfRk1EMTIxNk1FX01LMzoKIAkJYnVmZmVyWzNdID0gMHgxOTsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDM6Ci0JCWRpdiA9ICgyMCAqIGZyZXEpLzE2ICsgMzMzICogMjsKLQkgICAgICAgIGJ1ZmZlclsyXSA9IDB4ODA7CisJCWRpdiA9ICgyMCAqIGZyZXEpIC8gMTYwMDAgKyAoaW50KSgzMy4zICogMjApOyAgLyogSUYgMzMuMyBNSHogKi8KIAkJYnVmZmVyWzNdID0gMHgxOTsKIAkJYnJlYWs7CiAJY2FzZSBUVU5FUl9MR19QQUxfRk06CkBAIC00NjIsNiArNDkxLDcgQEAKIAl0LT5yYWRpb19mcmVxID0gZGVmYXVsdF9zZXRfcmFkaW9fZnJlcTsKIAl0LT5oYXNfc2lnbmFsID0gdHVuZXJfc2lnbmFsOwogCXQtPmlzX3N0ZXJlbyAgPSB0dW5lcl9zdGVyZW87CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwppbmRleCA0MWI2MzVlLi5kOGI3OGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2YXVkaW8uYwpAQCAtMjg1LDcgKzI4NSw2IEBACiAJCQlzY2hlZHVsZSgpOwogCQl9CiAJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CiAJCWlmIChjaGlwLT5kb25lIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CiAJCWRwcmludGsoIiVzOiB0aHJlYWQgd2FrZXVwXG4iLCBpMmNfY2xpZW50bmFtZSgmY2hpcC0+YykpOwpAQCAtODY1LDEzICs4NjQsOCBAQAogCQkgKiBCdXQgY2hhbmdpbmcgdGhlIG1vZGUgdG8gVklERU9fU09VTkRfTU9OTyB3b3VsZCBzd2l0Y2gKIAkJICogZXh0ZXJuYWwgNDA1MiBtdWx0aXBsZXhlciBpbiBhdWRpb19ob29rKCkuCiAJCSAqLwotI2lmIDAKLQkJaWYoKG5zciAmIDB4MDIpICYmICEoZHNyICYgMHgxMCkpIC8qIE5TUi5TL01CPTEgYW5kIERTUi5BTVNUQVQ9MCAqLwotCQkJbW9kZSB8PSBWSURFT19TT1VORF9TVEVSRU87Ci0jZWxzZQogCQlpZihuc3IgJiAweDAyKSAvKiBOU1IuUy9NQj0xICovCiAJCQltb2RlIHw9IFZJREVPX1NPVU5EX1NURVJFTzsKLSNlbmRpZgogCQlpZihuc3IgJiAweDAxKSAvKiBOU1IuRC9TQj0xICovCiAJCQltb2RlIHw9IFZJREVPX1NPVU5EX0xBTkcxIHwgVklERU9fU09VTkRfTEFORzI7CiAJfSBlbHNlIHsKQEAgLTEyMzcsMTcgKzEyMzEsMTcgQEAKIC8qIGF1ZGlvIGNoaXAgZGVzY3JpcHRpb25zIC0gc3RydWN0IENISVBERVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogLyogaW5zbW9kIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUgaW5kaXZpZHVhbCBhdWRpbyBjaGlwcyAqLwotaW50IHRkYTg0MjUgID0gMTsKLWludCB0ZGE5ODQwICA9IDE7Ci1pbnQgdGRhOTg1MCAgPSAxOwotaW50IHRkYTk4NTUgID0gMTsKLWludCB0ZGE5ODczICA9IDE7Ci1pbnQgdGRhOTg3NGEgPSAxOwotaW50IHRlYTYzMDAgID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4Ci1pbnQgdGVhNjMyMCAgPSAwOyAgLy8gYWRkcmVzcyBjbGFzaCB3aXRoIG1zcDM0eHgKLWludCB0ZWE2NDIwICA9IDE7Ci1pbnQgcGljMTZjNTQgPSAxOwotaW50IHRhODg3NHogID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCB0ZGE5ODQwCitzdGF0aWMgaW50IHRkYTg0MjUgID0gMTsKK3N0YXRpYyBpbnQgdGRhOTg0MCAgPSAxOworc3RhdGljIGludCB0ZGE5ODUwICA9IDE7CitzdGF0aWMgaW50IHRkYTk4NTUgID0gMTsKK3N0YXRpYyBpbnQgdGRhOTg3MyAgPSAxOworc3RhdGljIGludCB0ZGE5ODc0YSA9IDE7CitzdGF0aWMgaW50IHRlYTYzMDAgID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4CitzdGF0aWMgaW50IHRlYTYzMjAgID0gMDsgIC8vIGFkZHJlc3MgY2xhc2ggd2l0aCBtc3AzNHh4CitzdGF0aWMgaW50IHRlYTY0MjAgID0gMTsKK3N0YXRpYyBpbnQgcGljMTZjNTQgPSAxOworc3RhdGljIGludCB0YTg4NzR6ICA9IDA7ICAvLyBhZGRyZXNzIGNsYXNoIHdpdGggdGRhOTg0MAogCiBtb2R1bGVfcGFyYW0odGRhODQyNSwgaW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbSh0ZGE5ODQwLCBpbnQsIDA0NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCmluZGV4IDNkMjE2OTcuLmU4ZDk0NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAl7IDB4MDAwMDAwMDcsICJQQUwoQi9HKSIgfSwKIAl7IDB4MDAwMDEwMDAsICJOVFNDKE0pIiB9LAogCXsgMHgwMDAwMDAxMCwgIlBBTChJKSIgfSwKLQl7IDB4MDA0MDAwMDAsICJTRUNBTShML0zvv70pIiB9LAorCXsgMHgwMDQwMDAwMCwgIlNFQ0FNKEwvTLQpIiB9LAogCXsgMHgwMDAwMGUwMCwgIlBBTChEL0spIiB9LAogCXsgMHgwMzAwMDAwMCwgIkFUU0MgRGlnaXRhbCIgfSwKIH07CkBAIC00MDAsMTQgKzQwMCw2IEBACiAJCX0KIAl9CiAKLSNpZiAwCi0JaWYgKHRfZm9ybWF0IDwgc2l6ZW9mKGhhdXBwYXVnZV90dW5lcl9mbXQpL3NpemVvZihzdHJ1Y3QgSEFVUFBBVUdFX1RVTkVSX0ZNVCkpIHsKLQkJdHZlZS0+dHVuZXJfZm9ybWF0cyA9IGhhdXBwYXVnZV90dW5lcl9mbXRbdF9mb3JtYXRdLmlkOwotCQl0X2ZtdF9uYW1lID0gaGF1cHBhdWdlX3R1bmVyX2ZtdFt0X2Zvcm1hdF0ubmFtZTsKLQl9IGVsc2UgewotCQl0X2ZtdF9uYW1lID0gIjx1bmtub3duPiI7Ci0JfQotI2VuZGlmCiAKIAlUVkVFUFJPTV9LRVJOX0lORk8oIkhhdXBwYXVnZTogbW9kZWwgPSAlZCwgcmV2ID0gJXMsIHNlcmlhbCMgPSAlZFxuIiwKIAkJICAgdHZlZS0+bW9kZWwsCkBAIC00ODIsNiArNDc0LDcgQEAKIAkweGEwID4+IDEsCiAJSTJDX0NMSUVOVF9FTkQsCiB9OworCiBJMkNfQ0xJRU5UX0lOU01PRDsKIAogc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl90dmVlcHJvbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZtaXhlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMKaW5kZXggZWFmZDcwNi4uNTFiOTljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMKQEAgLTEsMyArMSw3IEBACisvKgorICogJElkOiB0dm1peGVyLmMsdiAxLjggMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggYjBkNGJjYi4uNzBlY2JkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMSw0ICsxLDYgQEAKIC8qCisgKiAkSWQ6IHY0bDEtY29tcGF0LmMsdiAxLjkgMjAwNS8wNi8xMiAwNDoxOToxOSBtY2hlaGFiIEV4cCAkCisgKgogICoJVmlkZW8gZm9yIExpbnV4IFR3bwogICoJQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBMYXllcgogICoKQEAgLTE1LDE0ICsxNywxMSBAQAogICoKICAqLwogCi0jaWZuZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgX19LRVJORUxfXwotI2VuZGlmCi0KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTc4NywxMiArNzg2LDE1IEBACiAJCSAgICAhKHFjdHJsMi5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKSkKIAkJCWF1ZC0+c3RlcCA9IHFjdHJsMi5zdGVwOwogCQlhdWQtPm1vZGUgPSAwOworCisJCW1lbXNldCgmdHVuMiwwLHNpemVvZih0dW4yKSk7CiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfVFVORVIsICZ0dW4yKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWRwcmludGsoIlZJRElPQ0dBVURJTyAvIFZJRElPQ19HX1RVTkVSOiAlZFxuIixlcnIpOwogCQkJZXJyID0gMDsKIAkJCWJyZWFrOwogCQl9CisKIAkJaWYgKHR1bjIucnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKQogCQkJYXVkLT5tb2RlID0gVklERU9fU09VTkRfTEFORzEgfCBWSURFT19TT1VORF9MQU5HMjsKIAkJZWxzZSBpZiAodHVuMi5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwppbmRleCA1Zjg3MDA3Li4xNWY1YmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi1kdmIuYwpAQCAtNjIsOCArNjIsNyBAQAogCQkJYnJlYWs7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQotCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAogCQkvKiBmZWVkIGJ1ZmZlciBkYXRhIHRvIGRlbXV4ICovCiAJCWlmIChidWYtPnN0YXRlID09IFNUQVRFX0RPTkUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCmluZGV4IDhiNjIzMjcuLmZmYmU2ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0YmFzZS5jCkBAIC0xMzYzLDE5ICsxMzYzLDcgQEAKIAl1MzIgZGV2aWNlX3N0YXRlOwogCU1QVF9BREFQVEVSICppb2MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlzd2l0Y2goc3RhdGUpCi0JewotCQljYXNlIDE6IC8qIFMxICovCi0JCQlkZXZpY2Vfc3RhdGU9MTsgLyogRDEgKi87Ci0JCQlicmVhazsKLQkJY2FzZSAzOiAvKiBTMyAqLwotCQljYXNlIDQ6IC8qIFM0ICovCi0JCQlkZXZpY2Vfc3RhdGU9MzsgLyogRDMgKi87Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUFHQUlOIC8qRklYTUUqLzsKLQkJCWJyZWFrOwotCX0KKwlkZXZpY2Vfc3RhdGU9cGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSk7CiAKIAlwcmludGsoTVlJT0Nfc19JTkZPX0ZNVAogCSJwY2ktc3VzcGVuZDogcGRldj0weCVwLCBzbG90PSVzLCBFbnRlcmluZyBvcGVyYXRpbmcgc3RhdGUgW0QlZF1cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggZDhkNjUzOS4uMzUzZGViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtMzY0LDkgKzM2NCw3IEBACiAJLmlkX3RhYmxlCT0gbXB0ZmNfcGNpX3RhYmxlLAogCS5wcm9iZQkJPSBtcHRmY19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1wdHNjc2loX3JlbW92ZSksCi0JLmRyaXZlciAgICAgICAgID0gewotCQkuc2h1dGRvd24gPSBtcHRzY3NpaF9zaHV0ZG93biwKLSAgICAgICAgfSwKKwkuc2h1dGRvd24JPSBtcHRzY3NpaF9zaHV0ZG93biwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAk9IG1wdHNjc2loX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBtcHRzY3NpaF9yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKaW5kZXggYTAwNzhhZS4uNGY5NzNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAjZW5kaWYKIAogdm9pZCAJCW1wdHNjc2loX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKLXZvaWQgCQltcHRzY3NpaF9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICopOwordm9pZCAJCW1wdHNjc2loX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICopOwogI2lmZGVmIENPTkZJR19QTQogaW50IAkJbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIGludCAJCW1wdHNjc2loX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldik7CkBAIC05ODgsNyArOTg4LDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLQltcHRzY3NpaF9zaHV0ZG93bigmcGRldi0+ZGV2KTsKKwltcHRzY3NpaF9zaHV0ZG93bihwZGV2KTsKIAogCXN6MT0wOwogCkBAIC0xMDI2LDkgKzEwMjYsOSBAQAogICoKICAqLwogdm9pZAotbXB0c2NzaWhfc2h1dGRvd24oc3RydWN0IGRldmljZSAqIGRldikKK21wdHNjc2loX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCU1QVF9BREFQVEVSIAkJKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCU1QVF9BREFQVEVSIAkJKmlvYyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0IAkqaG9zdCA9IGlvYy0+c2g7CiAJTVBUX1NDU0lfSE9TVAkJKmhkOwogCkBAIC0xMDU0LDcgKzEwNTQsNyBAQAogaW50CiBtcHRzY3NpaF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JbXB0c2NzaWhfc2h1dGRvd24oJnBkZXYtPmRldik7CisJbXB0c2NzaWhfc2h1dGRvd24ocGRldik7CiAJcmV0dXJuIG1wdF9zdXNwZW5kKHBkZXYsc3RhdGUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmggYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmgKaW5kZXggZDczYWVjMy4uZGViYjhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5oCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguaApAQCAtODIsOSArODIsOSBAQAogI2VuZGlmCiAKIGV4dGVybiB2b2lkIG1wdHNjc2loX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqKTsKLWV4dGVybiB2b2lkIG1wdHNjc2loX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKik7CitleHRlcm4gdm9pZCBtcHRzY3NpaF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqKTsKICNpZmRlZiBDT05GSUdfUE0KLWV4dGVybiBpbnQgbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKTsKK2V4dGVybiBpbnQgbXB0c2NzaWhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIGV4dGVybiBpbnQgbXB0c2NzaWhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNlbmRpZgogZXh0ZXJuIGludCBtcHRzY3NpaF9wcm9jX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGZ1bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKaW5kZXggNWY5YTYxYi4uZTBjMGVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzcGkuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNwaS5jCkBAIC00MTksOSArNDE5LDcgQEAKIAkuaWRfdGFibGUJPSBtcHRzcGlfcGNpX3RhYmxlLAogCS5wcm9iZQkJPSBtcHRzcGlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtcHRzY3NpaF9yZW1vdmUpLAotCS5kcml2ZXIgICAgICAgICA9IHsKLQkJLnNodXRkb3duID0gbXB0c2NzaWhfc2h1dGRvd24sCi0gICAgICAgIH0sCisJLnNodXRkb3duCT0gbXB0c2NzaWhfc2h1dGRvd24sCiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBtcHRzY3NpaF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gbXB0c2NzaWhfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnIGIvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCmluZGV4IDhkMTMyYjAuLjA2ZThlYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL0tjb25maWcKQEAgLTI0LDEwICsyNCwyOCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgSTJPX0VYVF9BREFQVEVDCisJYm9vbCAiRW5hYmxlIEFkYXB0ZWMgZXh0ZW5zaW9ucyIKKwlkZXBlbmRzIG9uIEkyTworCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGZvciBzdXBwb3J0IG9mIHJhaWR1dGlscyBmb3IgQWRhcHRlYyBJMk8gY29udHJvbGxlcnMuIFlvdSBhbHNvCisJICBoYXZlIHRvIHNheSBZIHRvICJJMk8gQ29uZmlndXJhdGlvbiBzdXBwb3J0IiwgIkkyTyBTQ1NJIE9TTSIgYmVsb3cKKwkgIGFuZCB0byAiU0NTSSBnZW5lcmljIHN1cHBvcnQiIHVuZGVyICJTQ1NJIGRldmljZSBjb25maWd1cmF0aW9uIi4KKworY29uZmlnIEkyT19FWFRfQURBUFRFQ19ETUE2NAorCWJvb2wgIkVuYWJsZSA2NC1iaXQgRE1BIgorCWRlcGVuZHMgb24gSTJPX0VYVF9BREFQVEVDICYmICggNjRCSVQgfHwgSElHSE1FTTY0RyApCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgZm9yIHN1cHBvcnQgb2YgNjQtYml0IERNQSB0cmFuc2ZlciBtb2RlIG9uIEFkYXB0ZWMgSTJPCisJICBjb250cm9sbGVycy4KKwkgIE5vdGU6IFlvdSBuZWVkIGF0IGxlYXN0IGZpcm13YXJlIHZlcnNpb24gMzcwOS4KKwogY29uZmlnIEkyT19DT05GSUcKIAl0cmlzdGF0ZSAiSTJPIENvbmZpZ3VyYXRpb24gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBJMk8KLQloZWxwCisJZGVwZW5kcyBvbiBJMk8KKwktLS1oZWxwLS0tCiAJICBTYXkgWSBmb3Igc3VwcG9ydCBvZiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBJMk8gYWRhcHRlcnMuCiAJICBJZiB5b3UgaGF2ZSBhIFJBSUQgY29udHJvbGxlciBmcm9tIEFkYXB0ZWMgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKIAkgIHJhaWR1dGlscyB0byBtYW5hZ2UgeW91ciBSQUlEIGFycmF5LCB5b3UgaGF2ZSB0byBzYXkgWSBoZXJlLgpAQCAtMzUsMTAgKzUzLDI4IEBACiAJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTJvX2NvbmZpZy4KIAorY29uZmlnIEkyT19DT05GSUdfT0xEX0lPQ1RMCisJYm9vbCAiRW5hYmxlIGlvY3RscyAoT0JTT0xFVEUpIgorCWRlcGVuZHMgb24gSTJPX0NPTkZJRworCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZXMgb2xkIGlvY3Rscy4KKworY29uZmlnIEkyT19CVVMKKwl0cmlzdGF0ZSAiSTJPIEJ1cyBBZGFwdGVyIE9TTSIKKwlkZXBlbmRzIG9uIEkyTworCS0tLWhlbHAtLS0KKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEkyTyBCdXMgQWRhcHRlciBPU00uIFRoZSBCdXMgQWRhcHRlciBPU00KKwkgIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnVzc2VzIG9uIHRoZSBJMk8gY29udHJvbGxlci4gVGhlIG1haW4gcHVycG9zZQorCSAgaXMgdG8gcmVzY2FuIHRoZSBidXMgdG8gZmluZCBuZXcgZGV2aWNlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGkyb19idXMuCisKIGNvbmZpZyBJMk9fQkxPQ0sKIAl0cmlzdGF0ZSAiSTJPIEJsb2NrIE9TTSIKIAlkZXBlbmRzIG9uIEkyTwotCWhlbHAKKwktLS1oZWxwLS0tCiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBJMk8gQmxvY2sgT1NNLiBUaGUgQmxvY2sgT1NNIHByZXNlbnRzIGRpc2sKIAkgIGFuZCBvdGhlciBzdHJ1Y3R1cmVkIGJsb2NrIGRldmljZXMgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uIElmIHlvdQogCSAgYXJlIHVzaW5nIGFuIFJBSUQgY29udHJvbGxlciwgeW91IGNvdWxkIGFjY2VzcyB0aGUgYXJyYXkgb25seSBieQpAQCAtNTEsNyArODcsNyBAQAogY29uZmlnIEkyT19TQ1NJCiAJdHJpc3RhdGUgIkkyTyBTQ1NJIE9TTSIKIAlkZXBlbmRzIG9uIEkyTyAmJiBTQ1NJCi0JaGVscAorCS0tLWhlbHAtLS0KIAkgIEFsbG93cyBkaXJlY3QgU0NTSSBhY2Nlc3MgdG8gU0NTSSBkZXZpY2VzIG9uIGEgU0NTSSBvciBGaWJyZUNoYW5uZWwKIAkgIEkyTyBjb250cm9sbGVyLiBZb3UgY2FuIHVzZSBib3RoIHRoZSBTQ1NJIGFuZCBCbG9jayBPU00gdG9nZXRoZXIgaWYKIAkgIHlvdSB3aXNoLiBUbyBhY2Nlc3MgYSBSQUlEIGFycmF5LCB5b3UgbXVzdCB1c2UgdGhlIEJsb2NrIE9TTSBkcml2ZXIuCkBAIC02Myw3ICs5OSw3IEBACiBjb25maWcgSTJPX1BST0MKIAl0cmlzdGF0ZSAiSTJPIC9wcm9jIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMk8KLQloZWxwCisJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIHRvICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgeW91IHdpbGwgYmUKIAkgIGFibGUgdG8gcmVhZCBJMk8gcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB2aXJ0dWFsIGRpcmVjdG9yeQogCSAgL3Byb2MvaTJvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vTWFrZWZpbGUKaW5kZXggYWFiYzZjZC4uMmMyZTM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL01ha2VmaWxlCkBAIC02LDggKzYsMTEgQEAKICMKIAogaTJvX2NvcmUteQkJKz0gaW9wLm8gZHJpdmVyLm8gZGV2aWNlLm8gZGVidWcubyBwY2kubyBleGVjLW9zbS5vCitpMm9fYnVzLXkJCSs9IGJ1cy1vc20ubworaTJvX2NvbmZpZy15CQkrPSBjb25maWctb3NtLm8KIG9iai0kKENPTkZJR19JMk8pCSs9IGkyb19jb3JlLm8KIG9iai0kKENPTkZJR19JMk9fQ09ORklHKSs9IGkyb19jb25maWcubworb2JqLSQoQ09ORklHX0kyT19CVVMpCSs9IGkyb19idXMubwogb2JqLSQoQ09ORklHX0kyT19CTE9DSykJKz0gaTJvX2Jsb2NrLm8KIG9iai0kKENPTkZJR19JMk9fU0NTSSkJKz0gaTJvX3Njc2kubwogb2JqLSQoQ09ORklHX0kyT19QUk9DKQkrPSBpMm9fcHJvYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2J1cy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vYnVzLW9zbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MWIyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2J1cy1vc20uYwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqCUJ1cyBBZGFwdGVyIE9TTQorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwNQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KKyAqCQkJaW5pdGlhbCB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMm8uaD4KKworI2RlZmluZSBPU01fTkFNRQkiYnVzLW9zbSIKKyNkZWZpbmUgT1NNX1ZFUlNJT04JIiRSZXYkIgorI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTyBCdXMgQWRhcHRlciBPU00iCisKK3N0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fYnVzX2RyaXZlcjsKKworLyogQnVzIE9TTSBjbGFzcyBoYW5kbGluZyBkZWZpbml0aW9uICovCitzdGF0aWMgc3RydWN0IGkyb19jbGFzc19pZCBpMm9fYnVzX2NsYXNzX2lkW10gPSB7CisJe0kyT19DTEFTU19CVVNfQURBUFRFUn0sCisJe0kyT19DTEFTU19FTkR9Cit9OworCisvKioKKyAqCWkyb19idXNfc2NhbiAtIFNjYW4gdGhlIGJ1cyBmb3IgbmV3IGRldmljZXMKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugb2YgdGhlIGJ1cywgd2hpY2ggc2hvdWxkIGJlIHNjYW5uZWQKKyAqCisgKglTY2FucyB0aGUgYnVzIGRldiBmb3IgbmV3IC8gcmVtb3ZlZCBkZXZpY2VzLiBBZnRlciB0aGUgc2NhbiBhIG5ldyBMQ1QKKyAqCXdpbGwgYmUgZmV0Y2hlZCBhdXRvbWF0aWNhbGx5LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYnVzX3NjYW4oc3RydWN0IGkyb19kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9CVVNfU0NBTiA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgZGV2LT5sY3RfZGF0YS50aWQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisKKwlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXQoZGV2LT5pb3AsIG0sIDYwKTsKK307CisKKy8qKgorICoJaTJvX2J1c19zdG9yZV9zY2FuIC0gU2NhbiB0aGUgSTJPIEJ1cyBBZGFwdGVyCisgKglAZDogZGV2aWNlIHdoaWNoIHNob3VsZCBiZSBzY2FubmVkCisgKgorICoJUmV0dXJucyBjb3VudC4KKyAqLworc3RhdGljIHNzaXplX3QgaTJvX2J1c19zdG9yZV9zY2FuKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJICBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGQpOworCWludCByYzsKKworCWlmICgocmMgPSBpMm9fYnVzX3NjYW4oaTJvX2RldikpKQorCQlvc21fd2FybigiYnVzIHNjYW4gZmFpbGVkICVkXG4iLCByYyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIEJ1cyBBZGFwdGVyIE9TTSBkZXZpY2UgYXR0cmlidXRlcyAqLworc3RhdGljIERFVklDRV9BVFRSKHNjYW4sIFNfSVdVU1IsIE5VTEwsIGkyb19idXNfc3RvcmVfc2Nhbik7CisKKy8qKgorICoJaTJvX2J1c19wcm9iZSAtIHZlcmlmeSBpZiBkZXYgaXMgYSBJMk8gQnVzIEFkYXB0ZXIgZGV2aWNlIGFuZCBpbnN0YWxsIGl0CisgKglAZGV2OiBkZXZpY2UgdG8gdmVyaWZ5IGlmIGl0IGlzIGEgSTJPIEJ1cyBBZGFwdGVyIGRldmljZQorICoKKyAqCUJlY2F1c2Ugd2Ugd2FudCBhbGwgQnVzIEFkYXB0ZXJzIGFsd2F5cyByZXR1cm4gMC4KKyAqCisgKglSZXR1cm5zIDAuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2J1c19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSB0b19pMm9fZGV2aWNlKGdldF9kZXZpY2UoZGV2KSk7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2Nhbik7CisKKwlvc21faW5mbygiZGV2aWNlIGFkZGVkIChUSUQ6ICUwM3gpXG4iLCBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19idXNfcmVtb3ZlIC0gcmVtb3ZlIHRoZSBJMk8gQnVzIEFkYXB0ZXIgZGV2aWNlIGZyb20gdGhlIHN5c3RlbSBhZ2FpbgorICoJQGRldjogSTJPIEJ1cyBBZGFwdGVyIGRldmljZSB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAorICoKKyAqCUFsd2F5cyByZXR1cm5zIDAuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2J1c19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3NjYW4pOworCisJcHV0X2RldmljZShkZXYpOworCisJb3NtX2luZm8oImRldmljZSByZW1vdmVkIChUSUQ6ICUwM3gpXG4iLCBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCisJcmV0dXJuIDA7Cit9OworCisvKiBCdXMgQWRhcHRlciBPU00gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19idXNfZHJpdmVyID0geworCS5uYW1lID0gT1NNX05BTUUsCisJLmNsYXNzZXMgPSBpMm9fYnVzX2NsYXNzX2lkLAorCS5kcml2ZXIgPSB7CisJCSAgIC5wcm9iZSA9IGkyb19idXNfcHJvYmUsCisJCSAgIC5yZW1vdmUgPSBpMm9fYnVzX3JlbW92ZSwKKwkJICAgfSwKK307CisKKy8qKgorICoJaTJvX2J1c19pbml0IC0gQnVzIEFkYXB0ZXIgT1NNIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICoJT25seSByZWdpc3RlciB0aGUgQnVzIEFkYXB0ZXIgT1NNIGluIHRoZSBJMk8gY29yZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGkyb19idXNfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CisKKwkvKiBSZWdpc3RlciBCdXMgQWRhcHRlciBPU00gaW50byBJMk8gY29yZSAqLworCXJjID0gaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2J1c19kcml2ZXIpOworCWlmIChyYykgeworCQlvc21fZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgQnVzIEFkYXB0ZXIgT1NNXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fYnVzX2V4aXQgLSBCdXMgQWRhcHRlciBPU00gZXhpdCBmdW5jdGlvbgorICoKKyAqCVVucmVnaXN0ZXJzIEJ1cyBBZGFwdGVyIE9TTSBmcm9tIEkyTyBjb3JlLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJvX2J1c19leGl0KHZvaWQpCit7CisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fYnVzX2RyaXZlcik7Cit9OworCitNT0RVTEVfQVVUSE9SKCJNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTihPU01fREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oT1NNX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChpMm9fYnVzX2luaXQpOworbW9kdWxlX2V4aXQoaTJvX2J1c19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vY29uZmlnLW9zbS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9jb25maWctb3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyZTdhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vY29uZmlnLW9zbS5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorICoJQ29uZmlndXJhdGlvbiBPU00KKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDUJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlcy9hZGRpdGlvbnM6CisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgkJCWluaXRpYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBPU01fTkFNRQkiY29uZmlnLW9zbSIKKyNkZWZpbmUgT1NNX1ZFUlNJT04JIjEuMjQ4IgorI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTyBDb25maWd1cmF0aW9uIE9TTSIKKworLyogYWNjZXNzIG1vZGUgdXNlciBydyAqLworI2RlZmluZSBTX0lXUlNSIChTX0lSVVNSIHwgU19JV1VTUikKKworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19jb25maWdfZHJpdmVyOworCisvKiBTcGVjaWFsIGZpbGUgb3BlcmF0aW9ucyBmb3Igc3lzZnMgKi8KK3N0cnVjdCBmb3BzX2F0dHJpYnV0ZSB7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgYmluOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wczsKK307CisKKy8qKgorICoJc3lzZnNfcmVhZF9kdW1teQorICovCitzdGF0aWMgc3NpemVfdCBzeXNmc19yZWFkX2R1bW15KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmZzZXQsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXJldHVybiAwOworfTsKKworLyoqCisgKglzeXNmc193cml0ZV9kdW1teQorICovCitzdGF0aWMgc3NpemVfdCBzeXNmc193cml0ZV9kdW1teShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2Zmc2V0LAorCQkJCSBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCXN5c2ZzX2NyZWF0ZV9mb3BzX2ZpbGUgLSBDcmVhdGVzIGF0dHJpYnV0ZSB3aXRoIHNwZWNpYWwgZmlsZSBvcGVyYXRpb25zCisgKglAa29iajoga29iamVjdCB3aGljaCBzaG91bGQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZQorICoJQGF0dHI6IGF0dHJpYnV0ZXMgd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGZpbGUKKyAqCisgKglGaXJzdCBjcmVhdGVzIGF0dHJpYnV0ZSBAYXR0ciBpbiBrb2JqZWN0IEBrb2JqLiBJZiBpdCBpcyB0aGUgZmlyc3QgdGltZQorICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIG1lcmdlIG9sZCBmb3BzIGZyb20gc3lzZnMgd2l0aCBuZXcgb25lIGFuZAorICoJd3JpdGUgaXQgYmFjay4gQWZ0ZXJ3b3JkcyB0aGUgbmV3IGZvcHMgd2lsbCBiZSBzZXQgZm9yIHRoZSBjcmVhdGVkCisgKglhdHRyaWJ1dGUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHN5c2ZzX2NyZWF0ZV9mb3BzX2ZpbGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3QgZm9wc19hdHRyaWJ1dGUgKmF0dHIpCit7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0bXAsICpmb3BzOworCXN0cnVjdCBkZW50cnkgKmQ7CisJc3RydWN0IHFzdHIgcXN0cjsKKwlpbnQgcmM7CisKKwlmb3BzID0gJmF0dHItPmZvcHM7CisKKwlpZiAoZm9wcy0+cmVhZCkKKwkJYXR0ci0+YmluLnJlYWQgPSBzeXNmc19yZWFkX2R1bW15OworCisJaWYgKGZvcHMtPndyaXRlKQorCQlhdHRyLT5iaW4ud3JpdGUgPSBzeXNmc193cml0ZV9kdW1teTsKKworCWlmICgocmMgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoa29iaiwgJmF0dHItPmJpbikpKQorCQlyZXR1cm4gcmM7CisKKwlxc3RyLm5hbWUgPSBhdHRyLT5iaW4uYXR0ci5uYW1lOworCXFzdHIubGVuID0gc3RybGVuKHFzdHIubmFtZSk7CisJcXN0ci5oYXNoID0gZnVsbF9uYW1lX2hhc2gocXN0ci5uYW1lLCBxc3RyLmxlbik7CisKKwlpZiAoKGQgPSBsb29rdXBfaGFzaCgmcXN0ciwga29iai0+ZGVudHJ5KSkpIHsKKwkJaWYgKCFmb3BzLT5vd25lcikgeworCQkJbWVtY3B5KCZ0bXAsIGQtPmRfaW5vZGUtPmlfZm9wLCBzaXplb2YodG1wKSk7CisJCQlpZiAoZm9wcy0+cmVhZCkKKwkJCQl0bXAucmVhZCA9IGZvcHMtPnJlYWQ7CisJCQlpZiAoZm9wcy0+d3JpdGUpCisJCQkJdG1wLndyaXRlID0gZm9wcy0+d3JpdGU7CisJCQltZW1jcHkoZm9wcywgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQl9CisKKwkJZC0+ZF9pbm9kZS0+aV9mb3AgPSBmb3BzOworCX0gZWxzZQorCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoa29iaiwgJmF0dHItPmJpbik7CisKKwlyZXR1cm4gLUVOT0VOVDsKK307CisKKy8qKgorICoJc3lzZnNfcmVtb3ZlX2ZvcHNfZmlsZSAtIFJlbW92ZSBhdHRyaWJ1dGUgd2l0aCBzcGVjaWFsIGZpbGUgb3BlcmF0aW9ucworICoJQGtvYmo6IGtvYmplY3Qgd2hpY2ggY29udGFpbnMgdGhlIGF0dHJpYnV0ZQorICoJQGF0dHI6IGF0dHJpYnV0ZXMgd2hpY2ggYXJlIHVzZWQgdG8gY3JlYXRlIGZpbGUKKyAqCisgKglPbmx5IHdyYXBwZXIgYXJyb3VuZCBzeXNmc19yZW1vdmVfYmluX2ZpbGUoKQorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc3lzZnNfcmVtb3ZlX2ZvcHNfZmlsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBmb3BzX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlyZXR1cm4gc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKGtvYmosICZhdHRyLT5iaW4pOworfTsKKworLyoqCisgKglpMm9fY29uZmlnX3JlYWRfaHJ0IC0gUmV0dXJucyB0aGUgSFJUIG9mIHRoZSBjb250cm9sbGVyCisgKglAa29iOiBrZXJuZWwgb2JqZWN0IGhhbmRsZQorICoJQGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggdGhlIEhSVCBzaG91bGQgYmUgY29waWVkCisgKglAb2ZmOiBmaWxlIG9mZnNldAorICoJQGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoKKyAqCVB1dCBAY291bnQgYnl0ZXMgc3RhcnRpbmcgYXQgQG9mZiBpbnRvIEBidWYgZnJvbSB0aGUgSFJUIG9mIHRoZSBJMk8KKyAqCWNvbnRyb2xsZXIgY29ycmVzcG9uZGluZyB0byBAa29iai4KKyAqCisgKglSZXR1cm5zIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byBidWZmZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGkyb19jb25maWdfcmVhZF9ocnQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKwkJCQkgICBsb2ZmX3Qgb2Zmc2V0LCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0ga29ial90b19pMm9fZGV2aWNlKGtvYmopLT5pb3A7CisJaTJvX2hydCAqaHJ0ID0gYy0+aHJ0LnZpcnQ7CisKKwl1MzIgc2l6ZSA9IChocnQtPm51bV9lbnRyaWVzICogaHJ0LT5lbnRyeV9sZW4gKyAyKSAqIDQ7CisKKwlpZiAob2Zmc2V0ID4gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2Zmc2V0ICsgY291bnQgPiBzaXplKQorCQljb3VudCA9IHNpemUgLSBvZmZzZXQ7CisKKwltZW1jcHkoYnVmLCAodTggKikgaHJ0ICsgb2Zmc2V0LCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9OworCisvKioKKyAqCWkyb19jb25maWdfcmVhZF9sY3QgLSBSZXR1cm5zIHRoZSBMQ1Qgb2YgdGhlIGNvbnRyb2xsZXIKKyAqCUBrb2I6IGtlcm5lbCBvYmplY3QgaGFuZGxlCisgKglAYnVmOiBidWZmZXIgaW50byB3aGljaCB0aGUgTENUIHNob3VsZCBiZSBjb3BpZWQKKyAqCUBvZmY6IGZpbGUgb2Zmc2V0CisgKglAY291bnQ6IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKgorICoJUHV0IEBjb3VudCBieXRlcyBzdGFydGluZyBhdCBAb2ZmIGludG8gQGJ1ZiBmcm9tIHRoZSBMQ1Qgb2YgdGhlIEkyTworICoJY29udHJvbGxlciBjb3JyZXNwb25kaW5nIHRvIEBrb2JqLgorICoKKyAqCVJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIGJ1ZmZlci4KKyAqLworc3RhdGljIHNzaXplX3QgaTJvX2NvbmZpZ19yZWFkX2xjdChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJCSAgIGxvZmZfdCBvZmZzZXQsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBrb2JqX3RvX2kyb19kZXZpY2Uoa29iaiktPmlvcDsKKwl1MzIgc2l6ZSA9IGMtPmxjdC0+dGFibGVfc2l6ZSAqIDQ7CisKKwlpZiAob2Zmc2V0ID4gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob2Zmc2V0ICsgY291bnQgPiBzaXplKQorCQljb3VudCA9IHNpemUgLSBvZmZzZXQ7CisKKwltZW1jcHkoYnVmLCAodTggKikgYy0+bGN0ICsgb2Zmc2V0LCBjb3VudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9OworCisjZGVmaW5lIEkyT19DT05GSUdfU1dfQVRUUihfbmFtZSxfbW9kZSxfdHlwZSxfc3dpZCkgXAorc3RhdGljIHNzaXplX3QgaTJvX2NvbmZpZ18jI19uYW1lIyNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBvZmZzZXQpIHsgXAorCXJldHVybiBpMm9fY29uZmlnX3N3X3JlYWQoZmlsZSwgYnVmLCBjb3VudCwgb2Zmc2V0LCBfdHlwZSwgX3N3aWQpOyBcCit9O1wKK1wKK3N0YXRpYyBzc2l6ZV90IGkyb19jb25maWdfIyNfbmFtZSMjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZnNldCkgeyBcCisJcmV0dXJuIGkyb19jb25maWdfc3dfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgb2Zmc2V0LCBfdHlwZSwgX3N3aWQpOyBcCit9OyBcCitcCitzdGF0aWMgc3RydWN0IGZvcHNfYXR0cmlidXRlIGkyb19jb25maWdfYXR0cl8jI19uYW1lID0geyBcCisJLmJpbiA9IHsgLmF0dHIgPSB7IC5uYW1lID0gX19zdHJpbmdpZnkoX25hbWUpLCAubW9kZSA9IF9tb2RlLCBcCisJCQkgICAub3duZXIgPSBUSElTX01PRFVMRSB9LCBcCisJCSAuc2l6ZSA9IDAsIH0sIFwKKwkuZm9wcyA9IHsgLndyaXRlID0gaTJvX2NvbmZpZ18jI19uYW1lIyNfd3JpdGUsIFwKKwkJICAucmVhZCA9IGkyb19jb25maWdfIyNfbmFtZSMjX3JlYWR9IFwKK307CisKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCisKKy8qKgorICoJaTJvX2NvbmZpZ19kcHRfcmVhZ2lvbiAtIENvbnZlcnRzIHR5cGUgYW5kIGlkIHRvIGZsYXNoIHJlZ2lvbgorICoJQHN3dHlwZTogdHlwZSBvZiBzb2Z0d2FyZSBtb2R1bGUgcmVhZGluZworICoJQHN3aWQ6IGlkIG9mIHNvZnR3YXJlIHdoaWNoIHNob3VsZCBiZSByZWFkCisgKgorICoJQ29udmVydHMgdHlwZSBhbmQgaWQgZnJvbSBJMk8gc3BlYyB0byB0aGUgbWF0Y2hpbmcgcmVnaW9uIGZvciBEUFQgLworICoJQWRhcHRlYyBjb250cm9sbGVycy4KKyAqCisgKglSZXR1cm5zIHJlZ2lvbiB3aGljaCBtYXRjaCB0eXBlIGFuZCBpZCBvciAtMSBvbiBlcnJvci4KKyAqLworc3RhdGljIHUzMiBpMm9fY29uZmlnX2RwdF9yZWdpb24odTggc3d0eXBlLCB1OCBzd2lkKQoreworCXN3aXRjaCAoc3d0eXBlKSB7CisJY2FzZSBJMk9fU09GVFdBUkVfTU9EVUxFX0lSVE9TOgorCQkvKgorCQkgKiBjb250ZW50OiBvcGVyYXRpb24gZmlybXdhcmUKKwkJICogcmVnaW9uIHNpemU6CisJCSAqICAgICAgMHhiYzAwMCBmb3IgMjU1NCwgMzc1NCwgMjU2NCwgMzc1NworCQkgKiAgICAgIDB4MTcwMDAwIGZvciAyODY1CisJCSAqICAgICAgMHgxN2MwMDAgZm9yIDM5NjYKKwkJICovCisJCWlmICghc3dpZCkKKwkJCXJldHVybiAwOworCisJCWJyZWFrOworCisJY2FzZSBJMk9fU09GVFdBUkVfTU9EVUxFX0lPUF9QUklWQVRFOgorCQkvKgorCQkgKiBjb250ZW50OiBCSU9TIGFuZCBTTU9SCisJCSAqIEJJT1Mgc2l6ZTogZmlyc3QgMHg4MDAwIGJ5dGVzCisJCSAqIHJlZ2lvbiBzaXplOgorCQkgKiAgICAgIDB4NDAwMDAgZm9yIDI1NTQsIDM3NTQsIDI1NjQsIDM3NTcKKwkJICogICAgICAweDgwMDAwIGZvciAyODY1LCAzOTY2CisJCSAqLworCQlpZiAoIXN3aWQpCisJCQlyZXR1cm4gMTsKKworCQlicmVhazsKKworCWNhc2UgSTJPX1NPRlRXQVJFX01PRFVMRV9JT1BfQ09ORklHOgorCQlzd2l0Y2ggKHN3aWQpIHsKKwkJY2FzZSAwOgorCQkJLyoKKwkJCSAqIGNvbnRlbnQ6IE5WUkFNIGRlZmF1bHRzCisJCQkgKiByZWdpb24gc2l6ZTogMHgyMDAwIGJ5dGVzCisJCQkgKi8KKwkJCXJldHVybiAyOworCQljYXNlIDE6CisJCQkvKgorCQkJICogY29udGVudDogc2VyaWFsIG51bWJlcgorCQkJICogcmVnaW9uIHNpemU6IDB4MjAwMCBieXRlcworCQkJICovCisJCQlyZXR1cm4gMzsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLTE7Cit9OworCisjZW5kaWYKKworLyoqCisgKglpMm9fY29uZmlnX3N3X3JlYWQgLSBSZWFkIGEgc29mdHdhcmUgbW9kdWxlIGZyb20gY29udHJvbGxlcgorICoJQGZpbGU6IGZpbGUgcG9pbnRlcgorICoJQGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgc2hvdWxkIGJlIGNvcGllZAorICoJQGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoJQG9mZjogZmlsZSBvZmZzZXQKKyAqCUBzd3R5cGU6IHR5cGUgb2Ygc29mdHdhcmUgbW9kdWxlIHJlYWRpbmcKKyAqCUBzd2lkOiBpZCBvZiBzb2Z0d2FyZSB3aGljaCBzaG91bGQgYmUgcmVhZAorICoKKyAqCVRyYW5zZmVycyBAY291bnQgYnl0ZXMgYXQgb2Zmc2V0IEBvZmZzZXQgZnJvbSBJT1AgaW50byBidWZmZXIgdXNpbmcKKyAqCXR5cGUgQHN3dHlwZSBhbmQgaWQgQHN3aWQgYXMgZGVzY3JpYmVkIGluIEkyTyBzcGVjLgorICoKKyAqCVJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIGJ1ZmZlciBvciBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGkyb19jb25maWdfc3dfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZnNldCwgdTggc3d0eXBlLAorCQkJCSAgdTMyIHN3aWQpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QgPSBmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfZnNkYXRhOworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gc2QtPnNfZWxlbWVudDsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBrb2JqX3RvX2kyb19kZXZpY2Uoa29iaiktPmlvcDsKKwl1MzIgbSwgZnVuY3Rpb24gPSBJMk9fQ01EX1NXX1VQTE9BRDsKKwlzdHJ1Y3QgaTJvX2RtYSBidWZmZXI7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgX19pb21lbSAqbXB0cjsKKwlpbnQgcmMsIHN0YXR1czsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRUJVU1k7CisKKwltcHRyID0gJm1zZy0+Ym9keVszXTsKKworCWlmICgocmMgPSBpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGNvdW50LCBHRlBfS0VSTkVMKSkpIHsKKwkJaTJvX21zZ19ub3AoYywgbSk7CisJCXJldHVybiByYzsKKwl9CisjaWZkZWYgQ09ORklHX0kyT19FWFRfQURBUFRFQworCWlmIChjLT5hZGFwdGVjKSB7CisJCW1wdHIgPSAmbXNnLT5ib2R5WzRdOworCQlmdW5jdGlvbiA9IEkyT19DTURfUFJJVkFURTsKKworCQl3cml0ZWwoVEVOX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzgsICZtc2ctPnUuaGVhZFswXSk7CisKKwkJd3JpdGVsKEkyT19WRU5ET1JfRFBUIDw8IDE2IHwgSTJPX0RQVF9GTEFTSF9SRUFELAorCQkgICAgICAgJm1zZy0+Ym9keVswXSk7CisJCXdyaXRlbChpMm9fY29uZmlnX2RwdF9yZWdpb24oc3d0eXBlLCBzd2lkKSwgJm1zZy0+Ym9keVsxXSk7CisJCXdyaXRlbCgqb2Zmc2V0LCAmbXNnLT5ib2R5WzJdKTsKKwkJd3JpdGVsKGNvdW50LCAmbXNnLT5ib2R5WzNdKTsKKwl9IGVsc2UKKyNlbmRpZgorCQl3cml0ZWwoTklORV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF83LCAmbXNnLT51LmhlYWRbMF0pOworCisJd3JpdGVsKDB4RDAwMDAwMDAgfCBjb3VudCwgbXB0cisrKTsKKwl3cml0ZWwoYnVmZmVyLnBoeXMsIG1wdHIpOworCisJd3JpdGVsKGZ1bmN0aW9uIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5oZWFkWzJdKTsKKwl3cml0ZWwoMCwgJm1zZy0+dS5oZWFkWzNdKTsKKworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKKwlpZiAoIWMtPmFkYXB0ZWMpCisjZW5kaWYKKwl7CisJCXdyaXRlbCgodTMyKSBzd3R5cGUgPDwgMTYgfCAodTMyKSAxIDw8IDgsICZtc2ctPmJvZHlbMF0pOworCQl3cml0ZWwoMCwgJm1zZy0+Ym9keVsxXSk7CisJCXdyaXRlbChzd2lkLCAmbXNnLT5ib2R5WzJdKTsKKwl9CisKKwlzdGF0dXMgPSBpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0oYywgbSwgNjAsICZidWZmZXIpOworCisJaWYgKHN0YXR1cyA9PSBJMk9fUE9TVF9XQUlUX09LKSB7CisJCWlmICghKHJjID0gY29weV90b191c2VyKGJ1ZiwgYnVmZmVyLnZpcnQsIGNvdW50KSkpIHsKKwkJCXJjID0gY291bnQ7CisJCQkqb2Zmc2V0ICs9IGNvdW50OworCQl9CisJfSBlbHNlCisJCXJjID0gLUVJTzsKKworCWlmIChzdGF0dXMgIT0gLUVUSU1FRE9VVCkKKwkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOworCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9fY29uZmlnX3N3X3dyaXRlIC0gV3JpdGUgYSBzb2Z0d2FyZSBtb2R1bGUgdG8gY29udHJvbGxlcgorICoJQGZpbGU6IGZpbGUgcG9pbnRlcgorICoJQGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgc2hvdWxkIGJlIGNvcGllZAorICoJQGNvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoJQG9mZjogZmlsZSBvZmZzZXQKKyAqCUBzd3R5cGU6IHR5cGUgb2Ygc29mdHdhcmUgbW9kdWxlIHdyaXRpbmcKKyAqCUBzd2lkOiBpZCBvZiBzb2Z0d2FyZSB3aGljaCBzaG91bGQgYmUgd3JpdHRlbgorICoKKyAqCVRyYW5zZmVycyBAY291bnQgYnl0ZXMgYXQgb2Zmc2V0IEBvZmZzZXQgZnJvbSBidWZmZXIgdG8gSU9QIHVzaW5nCisgKgl0eXBlIEBzd3R5cGUgYW5kIGlkIEBzd2lkIGFzIGRlc2NyaWJlZCBpbiBJMk8gc3BlYy4KKyAqCisgKglSZXR1cm5zIG51bWJlciBvZiBieXRlcyBjb3BpZWQgZnJvbSBidWZmZXIgb3IgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgc3NpemVfdCBpMm9fY29uZmlnX3N3X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZnNldCwgdTggc3d0eXBlLAorCQkJCSAgIHUzMiBzd2lkKQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKnNkID0gZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50LT5kX2ZzZGF0YTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHNkLT5zX2VsZW1lbnQ7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0ga29ial90b19pMm9fZGV2aWNlKGtvYmopLT5pb3A7CisJdTMyIG0sIGZ1bmN0aW9uID0gSTJPX0NNRF9TV19ET1dOTE9BRDsKKwlzdHJ1Y3QgaTJvX2RtYSBidWZmZXI7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgX19pb21lbSAqbXB0cjsKKwlpbnQgcmMsIHN0YXR1czsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRUJVU1k7CisKKwltcHRyID0gJm1zZy0+Ym9keVszXTsKKworCWlmICgocmMgPSBpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGNvdW50LCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gbm9wX21zZzsKKworCWlmICgocmMgPSBjb3B5X2Zyb21fdXNlcihidWZmZXIudmlydCwgYnVmLCBjb3VudCkpKQorCQlnb3RvIGZyZWVfYnVmZmVyOworCisjaWZkZWYgQ09ORklHX0kyT19FWFRfQURBUFRFQworCWlmIChjLT5hZGFwdGVjKSB7CisJCW1wdHIgPSAmbXNnLT5ib2R5WzRdOworCQlmdW5jdGlvbiA9IEkyT19DTURfUFJJVkFURTsKKworCQl3cml0ZWwoVEVOX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzgsICZtc2ctPnUuaGVhZFswXSk7CisKKwkJd3JpdGVsKEkyT19WRU5ET1JfRFBUIDw8IDE2IHwgSTJPX0RQVF9GTEFTSF9XUklURSwKKwkJICAgICAgICZtc2ctPmJvZHlbMF0pOworCQl3cml0ZWwoaTJvX2NvbmZpZ19kcHRfcmVnaW9uKHN3dHlwZSwgc3dpZCksICZtc2ctPmJvZHlbMV0pOworCQl3cml0ZWwoKm9mZnNldCwgJm1zZy0+Ym9keVsyXSk7CisJCXdyaXRlbChjb3VudCwgJm1zZy0+Ym9keVszXSk7CisJfSBlbHNlCisjZW5kaWYKKwkJd3JpdGVsKE5JTkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNywgJm1zZy0+dS5oZWFkWzBdKTsKKworCXdyaXRlbCgweEQ0MDAwMDAwIHwgY291bnQsIG1wdHIrKyk7CisJd3JpdGVsKGJ1ZmZlci5waHlzLCBtcHRyKTsKKworCXdyaXRlbChmdW5jdGlvbiA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFszXSk7CisKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCisJaWYgKCFjLT5hZGFwdGVjKQorI2VuZGlmCisJeworCQl3cml0ZWwoKHUzMikgc3d0eXBlIDw8IDE2IHwgKHUzMikgMSA8PCA4LCAmbXNnLT5ib2R5WzBdKTsKKwkJd3JpdGVsKDAsICZtc2ctPmJvZHlbMV0pOworCQl3cml0ZWwoc3dpZCwgJm1zZy0+Ym9keVsyXSk7CisJfQorCisJc3RhdHVzID0gaTJvX21zZ19wb3N0X3dhaXRfbWVtKGMsIG0sIDYwLCAmYnVmZmVyKTsKKworCWlmIChzdGF0dXMgIT0gLUVUSU1FRE9VVCkKKwkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOworCisJaWYgKHN0YXR1cyAhPSBJMk9fUE9TVF9XQUlUX09LKQorCQlyZXR1cm4gLUVJTzsKKworCSpvZmZzZXQgKz0gY291bnQ7CisKKwlyZXR1cm4gY291bnQ7CisKKyAgICAgIGZyZWVfYnVmZmVyOgorCWkyb19kbWFfZnJlZSgmYy0+cGRldi0+ZGV2LCAmYnVmZmVyKTsKKworICAgICAgbm9wX21zZzoKKwlpMm9fbXNnX25vcChjLCBtKTsKKworCXJldHVybiByYzsKK307CisKKy8qIGF0dHJpYnV0ZSBmb3IgSFJUIGluIHN5c2ZzICovCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgaTJvX2NvbmZpZ19ocnRfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJIC5uYW1lID0gImhydCIsCisJCSAubW9kZSA9IFNfSVJVR08sCisJCSAub3duZXIgPSBUSElTX01PRFVMRX0sCisJLnNpemUgPSAwLAorCS5yZWFkID0gaTJvX2NvbmZpZ19yZWFkX2hydAorfTsKKworLyogYXR0cmlidXRlIGZvciBMQ1QgaW4gc3lzZnMgKi8KK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBpMm9fY29uZmlnX2xjdF9hdHRyID0geworCS5hdHRyID0geworCQkgLm5hbWUgPSAibGN0IiwKKwkJIC5tb2RlID0gU19JUlVHTywKKwkJIC5vd25lciA9IFRISVNfTU9EVUxFfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBpMm9fY29uZmlnX3JlYWRfbGN0Cit9OworCisvKiBJUlRPUyBmaXJtd2FyZSBhY2Nlc3MgKi8KK0kyT19DT05GSUdfU1dfQVRUUihpcnRvcywgU19JV1JTUiwgSTJPX1NPRlRXQVJFX01PRFVMRV9JUlRPUywgMCk7CisKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCisKKy8qCisgKiBhdHRyaWJ1dGUgZm9yIEJJT1MgLyBTTU9SLCBudnJhbSBhbmQgc2VyaWFsIG51bWJlciBhY2Nlc3Mgb24gRFBUIC8gQWRhcHRlYworICogY29udHJvbGxlcnMKKyAqLworSTJPX0NPTkZJR19TV19BVFRSKGJpb3MsIFNfSVdSU1IsIEkyT19TT0ZUV0FSRV9NT0RVTEVfSU9QX1BSSVZBVEUsIDApOworSTJPX0NPTkZJR19TV19BVFRSKG52cmFtLCBTX0lXUlNSLCBJMk9fU09GVFdBUkVfTU9EVUxFX0lPUF9DT05GSUcsIDApOworSTJPX0NPTkZJR19TV19BVFRSKHNlcmlhbCwgU19JV1JTUiwgSTJPX1NPRlRXQVJFX01PRFVMRV9JT1BfQ09ORklHLCAxKTsKKworI2VuZGlmCisKKy8qKgorICoJaTJvX2NvbmZpZ19ub3RpZnlfY29udHJvbGxlcl9hZGQgLSBOb3RpZnkgb2YgYWRkZWQgY29udHJvbGxlcgorICoJQGM6IHRoZSBjb250cm9sbGVyIHdoaWNoIHdhcyBhZGRlZAorICoKKyAqCUlmIGEgSTJPIGNvbnRyb2xsZXIgaXMgYWRkZWQsIHdlIGNhdGNoIHRoZSBub3RpZmljYXRpb24gdG8gYWRkIHN5c2ZzCisgKgllbnRyaWVzLgorICovCitzdGF0aWMgdm9pZCBpMm9fY29uZmlnX25vdGlmeV9jb250cm9sbGVyX2FkZChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGtvYmplY3QgKmtvYmogPSAmYy0+ZXhlYy0+ZGV2aWNlLmtvYmo7CisKKwlzeXNmc19jcmVhdGVfYmluX2ZpbGUoa29iaiwgJmkyb19jb25maWdfaHJ0X2F0dHIpOworCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShrb2JqLCAmaTJvX2NvbmZpZ19sY3RfYXR0cik7CisKKwlzeXNmc19jcmVhdGVfZm9wc19maWxlKGtvYmosICZpMm9fY29uZmlnX2F0dHJfaXJ0b3MpOworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKKwlpZiAoYy0+YWRhcHRlYykgeworCQlzeXNmc19jcmVhdGVfZm9wc19maWxlKGtvYmosICZpMm9fY29uZmlnX2F0dHJfYmlvcyk7CisJCXN5c2ZzX2NyZWF0ZV9mb3BzX2ZpbGUoa29iaiwgJmkyb19jb25maWdfYXR0cl9udnJhbSk7CisJCXN5c2ZzX2NyZWF0ZV9mb3BzX2ZpbGUoa29iaiwgJmkyb19jb25maWdfYXR0cl9zZXJpYWwpOworCX0KKyNlbmRpZgorfTsKKworLyoqCisgKglpMm9fY29uZmlnX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZSAtIE5vdGlmeSBvZiByZW1vdmVkIGNvbnRyb2xsZXIKKyAqCUBjOiB0aGUgY29udHJvbGxlciB3aGljaCB3YXMgcmVtb3ZlZAorICoKKyAqCUlmIGEgSTJPIGNvbnRyb2xsZXIgaXMgcmVtb3ZlZCwgd2UgY2F0Y2ggdGhlIG5vdGlmaWNhdGlvbiB0byByZW1vdmUgdGhlCisgKglzeXNmcyBlbnRyaWVzLgorICovCitzdGF0aWMgdm9pZCBpMm9fY29uZmlnX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGtvYmplY3QgKmtvYmogPSAmYy0+ZXhlYy0+ZGV2aWNlLmtvYmo7CisKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCisJaWYgKGMtPmFkYXB0ZWMpIHsKKwkJc3lzZnNfcmVtb3ZlX2ZvcHNfZmlsZShrb2JqLCAmaTJvX2NvbmZpZ19hdHRyX3NlcmlhbCk7CisJCXN5c2ZzX3JlbW92ZV9mb3BzX2ZpbGUoa29iaiwgJmkyb19jb25maWdfYXR0cl9udnJhbSk7CisJCXN5c2ZzX3JlbW92ZV9mb3BzX2ZpbGUoa29iaiwgJmkyb19jb25maWdfYXR0cl9iaW9zKTsKKwl9CisjZW5kaWYKKwlzeXNmc19yZW1vdmVfZm9wc19maWxlKGtvYmosICZpMm9fY29uZmlnX2F0dHJfaXJ0b3MpOworCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKGtvYmosICZpMm9fY29uZmlnX2xjdF9hdHRyKTsKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoa29iaiwgJmkyb19jb25maWdfaHJ0X2F0dHIpOworfTsKKworLyogQ29uZmlnIE9TTSBkcml2ZXIgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IGkyb19kcml2ZXIgaTJvX2NvbmZpZ19kcml2ZXIgPSB7CisJLm5hbWUgPSBPU01fTkFNRSwKKwkubm90aWZ5X2NvbnRyb2xsZXJfYWRkID0gaTJvX2NvbmZpZ19ub3RpZnlfY29udHJvbGxlcl9hZGQsCisJLm5vdGlmeV9jb250cm9sbGVyX3JlbW92ZSA9IGkyb19jb25maWdfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlCit9OworCisjaWZkZWYgQ09ORklHX0kyT19DT05GSUdfT0xEX0lPQ1RMCisjaW5jbHVkZSAiaTJvX2NvbmZpZy5jIgorI2VuZGlmCisKKy8qKgorICoJaTJvX2NvbmZpZ19pbml0IC0gQ29uZmlndXJhdGlvbiBPU00gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKglSZWdpc3RlcnMgQ29uZmlndXJhdGlvbiBPU00gaW4gdGhlIEkyTyBjb3JlIGFuZCBpZiBvbGQgaW9jdGwncyBhcmUKKyAqCWNvbXBpbGVkIGluIGluaXRpYWxpemUgdGhlbS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGkyb19jb25maWdfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CisKKwlpZiAoaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2NvbmZpZ19kcml2ZXIpKSB7CisJCW9zbV9lcnIoImhhbmRsZXIgcmVnaXN0ZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorI2lmZGVmIENPTkZJR19JMk9fQ09ORklHX09MRF9JT0NUTAorCWlmIChpMm9fY29uZmlnX29sZF9pbml0KCkpCisJCWkyb19kcml2ZXJfdW5yZWdpc3RlcigmaTJvX2NvbmZpZ19kcml2ZXIpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fY29uZmlnX2V4aXQgLSBDb25maWd1cmF0aW9uIE9TTSBleGl0IGZ1bmN0aW9uCisgKgorICoJSWYgb2xkIGlvY3RsJ3MgYXJlIGNvbXBpbGVkIGluIGV4aXQgcmVtb3ZlIHRoZW0gYW5kIHVucmVnaXN0ZXJzCisgKglDb25maWd1cmF0aW9uIE9TTSBmcm9tIEkyTyBjb3JlLgorICovCitzdGF0aWMgdm9pZCBpMm9fY29uZmlnX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSTJPX0NPTkZJR19PTERfSU9DVEwKKwlpMm9fY29uZmlnX29sZF9leGl0KCk7CisjZW5kaWYKKworCWkyb19kcml2ZXJfdW5yZWdpc3RlcigmaTJvX2NvbmZpZ19kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTihPU01fREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oT1NNX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChpMm9fY29uZmlnX2luaXQpOworbW9kdWxlX2V4aXQoaTJvX2NvbmZpZ19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vY29yZS5oIGIvZHJpdmVycy9tZXNzYWdlL2kyby9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViY2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vY29yZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKglJMk8gY29yZSBpbnRlcm5hbCBkZWNsYXJhdGlvbnMKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDUJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlcy9hZGRpdGlvbnM6CisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgkJCWluaXRpYWwgdmVyc2lvbi4KKyAqLworCisvKiBFeGVjLU9TTSAqLworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpMm9fYnVzX3R5cGU7CisKK2V4dGVybiBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fZXhlY19kcml2ZXI7CitleHRlcm4gaW50IGkyb19leGVjX2xjdF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICopOworCitleHRlcm4gaW50IF9faW5pdCBpMm9fZXhlY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IGkyb19leGVjX2V4aXQodm9pZCk7CisKKy8qIGRyaXZlciAqLworZXh0ZXJuIGludCBpMm9fZHJpdmVyX2Rpc3BhdGNoKHN0cnVjdCBpMm9fY29udHJvbGxlciAqLCB1MzIpOworCitleHRlcm4gaW50IF9faW5pdCBpMm9fZHJpdmVyX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgaTJvX2RyaXZlcl9leGl0KHZvaWQpOworCisvKiBQQ0kgKi8KK2V4dGVybiBpbnQgX19pbml0IGkyb19wY2lfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBpMm9fcGNpX2V4aXQodm9pZCk7CisKKy8qIGRldmljZSAqLworZXh0ZXJuIHZvaWQgaTJvX2RldmljZV9yZW1vdmUoc3RydWN0IGkyb19kZXZpY2UgKik7CitleHRlcm4gaW50IGkyb19kZXZpY2VfcGFyc2VfbGN0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKKworZXh0ZXJuIGludCBpMm9fZGV2aWNlX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpMm9fZGV2aWNlX2V4aXQodm9pZCk7CisKKy8qIElPUCAqLworZXh0ZXJuIHN0cnVjdCBpMm9fY29udHJvbGxlciAqaTJvX2lvcF9hbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkIGkyb19pb3BfZnJlZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CisKK2V4dGVybiBpbnQgaTJvX2lvcF9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICopOworZXh0ZXJuIHZvaWQgaTJvX2lvcF9yZW1vdmUoc3RydWN0IGkyb19jb250cm9sbGVyICopOworCisvKiBjb25maWcgKi8KK2V4dGVybiBpbnQgaTJvX3Bhcm1faXNzdWUoc3RydWN0IGkyb19kZXZpY2UgKiwgaW50LCB2b2lkICosIGludCwgdm9pZCAqLCBpbnQpOworCisvKiBjb250cm9sIHJlZ2lzdGVycyByZWxhdGl2ZSB0byBjLT5iYXNlICovCisjZGVmaW5lIEkyT19JUlFfU1RBVFVTCTB4MzAKKyNkZWZpbmUgSTJPX0lSUV9NQVNLCTB4MzQKKyNkZWZpbmUgSTJPX0lOX1BPUlQJMHg0MAorI2RlZmluZSBJMk9fT1VUX1BPUlQJMHg0NAorCisjZGVmaW5lIEkyT19JUlFfT1VUQk9VTkRfUE9TVAkweDAwMDAwMDA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RlYnVnLmMKaW5kZXggMmE1ZDQ3OC4uMDE4Y2E4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYwpAQCAtNCw4ICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pMm8uaD4KIAotZXh0ZXJuIHN0cnVjdCBpMm9fZHJpdmVyICoqaTJvX2RyaXZlcnM7Ci1leHRlcm4gdW5zaWduZWQgaW50IGkyb19tYXhfZHJpdmVyczsKIHN0YXRpYyB2b2lkIGkyb19yZXBvcnRfdXRpbF9jbWQodTggY21kKTsKIHN0YXRpYyB2b2lkIGkyb19yZXBvcnRfZXhlY19jbWQodTggY21kKTsKIHN0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICogbXNnKTsKQEAgLTIzLDcgKzIxLDYgQEAKIAl1OCBjbWQgPSAobXNnWzFdID4+IDI0KSAmIDB4RkY7CiAJdTggcmVxX3N0YXR1cyA9IChtc2dbNF0gPj4gMjQpICYgMHhGRjsKIAl1MTYgZGV0YWlsZWRfc3RhdHVzID0gbXNnWzRdICYgMHhGRkZGOwotCS8vc3RydWN0IGkyb19kcml2ZXIgKmggPSBpMm9fZHJpdmVyc1ttc2dbMl0gJiAoaTJvX21heF9kcml2ZXJzLTEpXTsKIAogCWlmIChjbWQgPT0gSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUikKIAkJcmV0dXJuOwkJLy8gTm8gc3RhdHVzIGluIHRoaXMgcmVwbHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jCmluZGV4IGViOTA3ZTguLjIxZjE2YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwpAQCAtMTYsOSArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLS8qIEV4ZWMgT1NNIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpMm9fYnVzX3R5cGU7CisjaW5jbHVkZSAiY29yZS5oIgogCiAvKioKICAqCWkyb19kZXZpY2VfaXNzdWVfY2xhaW0gLSBjbGFpbSBvciByZWxlYXNlIGEgZGV2aWNlCkBAIC0yODIsOCArMjgwLDcgQEAKIAogCWRvd24oJmMtPmxjdF9sb2NrKTsKIAotCWlmIChjLT5sY3QpCi0JCWtmcmVlKGMtPmxjdCk7CisJa2ZyZWUoYy0+bGN0KTsKIAogCWxjdCA9IGMtPmRsY3QudmlydDsKIApAQCAtMjk0LDEyICsyOTEsMTIgQEAKIAl9CiAKIAlpZiAobGN0LT50YWJsZV9zaXplICogNCA+IGMtPmRsY3QubGVuKSB7Ci0JCW1lbWNweV9mcm9taW8oYy0+bGN0LCBjLT5kbGN0LnZpcnQsIGMtPmRsY3QubGVuKTsKKwkJbWVtY3B5KGMtPmxjdCwgYy0+ZGxjdC52aXJ0LCBjLT5kbGN0Lmxlbik7CiAJCXVwKCZjLT5sY3RfbG9jayk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KIAotCW1lbWNweV9mcm9taW8oYy0+bGN0LCBjLT5kbGN0LnZpcnQsIGxjdC0+dGFibGVfc2l6ZSAqIDQpOworCW1lbWNweShjLT5sY3QsIGMtPmRsY3QudmlydCwgbGN0LT50YWJsZV9zaXplICogNCk7CiAKIAlsY3QgPSBjLT5sY3Q7CiAKQEAgLTM1NCw3ICszNTEsNyBAQAogewogCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYgPSB0b19pMm9fZGV2aWNlKGNkLT5kZXYpOwogCi0Jc3ByaW50ZihidWYsICIlMDN4XG4iLCBkZXYtPmxjdF9kYXRhLmNsYXNzX2lkKTsKKwlzcHJpbnRmKGJ1ZiwgIjB4JTAzeFxuIiwgZGV2LT5sY3RfZGF0YS5jbGFzc19pZCk7CiAJcmV0dXJuIHN0cmxlbihidWYpICsgMTsKIH07CiAKQEAgLTM2OSw3ICszNjYsNyBAQAogewogCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYgPSB0b19pMm9fZGV2aWNlKGNkLT5kZXYpOwogCi0Jc3ByaW50ZihidWYsICIlMDN4XG4iLCBkZXYtPmxjdF9kYXRhLnRpZCk7CisJc3ByaW50ZihidWYsICIweCUwM3hcbiIsIGRldi0+bGN0X2RhdGEudGlkKTsKIAlyZXR1cm4gc3RybGVuKGJ1ZikgKyAxOwogfTsKIApAQCAtNDAxLDI1ICszOTgsMjcgQEAKIAogCS8qIGNyZWF0ZSB1c2VyIGVudHJpZXMgZm9yIHRoaXMgZGV2aWNlICovCiAJdG1wID0gaTJvX2lvcF9maW5kX2RldmljZShpMm9fZGV2LT5pb3AsIGkyb19kZXYtPmxjdF9kYXRhLnVzZXJfdGlkKTsKLQlpZiAodG1wKQorCWlmICh0bXAgJiYgKHRtcCAhPSBpMm9fZGV2KSkKIAkJc3lzZnNfY3JlYXRlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAmdG1wLT5kZXZpY2Uua29iaiwKIAkJCQkgICJ1c2VyIik7CiAKIAkvKiBjcmVhdGUgdXNlciBlbnRyaWVzIHJlZmVyaW5nIHRvIHRoaXMgZGV2aWNlICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZjLT5kZXZpY2VzLCBsaXN0KQotCSAgICBpZiAodG1wLT5sY3RfZGF0YS51c2VyX3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJICAgIGlmICgodG1wLT5sY3RfZGF0YS51c2VyX3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJCSYmICh0bXAgIT0gaTJvX2RldikpCiAJCXN5c2ZzX2NyZWF0ZV9saW5rKCZ0bXAtPmRldmljZS5rb2JqLAogCQkJCSAgJmkyb19kZXYtPmRldmljZS5rb2JqLCAidXNlciIpOwogCiAJLyogY3JlYXRlIHBhcmVudCBlbnRyaWVzIGZvciB0aGlzIGRldmljZSAqLwogCXRtcCA9IGkyb19pb3BfZmluZF9kZXZpY2UoaTJvX2Rldi0+aW9wLCBpMm9fZGV2LT5sY3RfZGF0YS5wYXJlbnRfdGlkKTsKLQlpZiAodG1wKQorCWlmICh0bXAgJiYgKHRtcCAhPSBpMm9fZGV2KSkKIAkJc3lzZnNfY3JlYXRlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAmdG1wLT5kZXZpY2Uua29iaiwKIAkJCQkgICJwYXJlbnQiKTsKIAogCS8qIGNyZWF0ZSBwYXJlbnQgZW50cmllcyByZWZlcmluZyB0byB0aGlzIGRldmljZSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYy0+ZGV2aWNlcywgbGlzdCkKLQkgICAgaWYgKHRtcC0+bGN0X2RhdGEucGFyZW50X3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJICAgIGlmICgodG1wLT5sY3RfZGF0YS5wYXJlbnRfdGlkID09IGkyb19kZXYtPmxjdF9kYXRhLnRpZCkKKwkJJiYgKHRtcCAhPSBpMm9fZGV2KSkKIAkJc3lzZnNfY3JlYXRlX2xpbmsoJnRtcC0+ZGV2aWNlLmtvYmosCiAJCQkJICAmaTJvX2Rldi0+ZGV2aWNlLmtvYmosICJwYXJlbnQiKTsKIApAQCAtNDQ0LDkgKzQ0Myw4IEBACiAgKglOb3RlIHRoYXQgdGhlIG1pbmltdW0gc2l6ZWQgcmVzbGlzdCBpcyA4IGJ5dGVzIGFuZCBjb250YWlucwogICoJUmVzdWx0Q291bnQsIEVycm9ySW5mb1NpemUsIEJsb2NrU3RhdHVzIGFuZCBCbG9ja1NpemUuCiAgKi8KLQogaW50IGkyb19wYXJtX2lzc3VlKHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2LCBpbnQgY21kLCB2b2lkICpvcGxpc3QsCi0JCSAgIGludCBvcGxlbiwgdm9pZCAqcmVzbGlzdCwgaW50IHJlc2xlbikKKwkJCSAgaW50IG9wbGVuLCB2b2lkICpyZXNsaXN0LCBpbnQgcmVzbGVuKQogewogCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CiAJdTMyIG07CkBAIC00ODksNyArNDg3LDcgQEAKIAlpZiAocmMgPT0gLUVUSU1FRE9VVCkKIAkJcmV0dXJuIHJjOwogCi0JbWVtY3B5X2Zyb21pbyhyZXNsaXN0LCByZXMudmlydCwgcmVzLmxlbik7CisJbWVtY3B5KHJlc2xpc3QsIHJlcy52aXJ0LCByZXMubGVuKTsKIAlpMm9fZG1hX2ZyZWUoZGV2LCAmcmVzKTsKIAogCS8qIFF1ZXJ5IGZhaWxlZCAqLwpAQCAtNTMxLDE3ICs1MjksMjMgQEAKIAkJICAgICAgIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKIHsKIAl1MTYgb3BibGtbXSA9IHsgMSwgMCwgSTJPX1BBUkFNU19GSUVMRF9HRVQsIGdyb3VwLCAxLCBmaWVsZCB9OwotCXU4IHJlc2Jsa1s4ICsgYnVmbGVuXTsJLyogOCBieXRlcyBmb3IgaGVhZGVyICovCisJdTggKnJlc2JsazsJCS8qIDggYnl0ZXMgZm9yIGhlYWRlciAqLwogCWludCBzaXplOwogCiAJaWYgKGZpZWxkID09IC0xKQkvKiB3aG9sZSBncm91cCAqLwogCQlvcGJsa1s0XSA9IC0xOwogCisJcmVzYmxrID0ga21hbGxvYyhidWZsZW4gKyA4LCBHRlBfS0VSTkVMIHwgR0ZQX0FUT01JQyk7CisJaWYgKCFyZXNibGspCisJCXJldHVybiAtRU5PTUVNOworCiAJc2l6ZSA9IGkyb19wYXJtX2lzc3VlKGkyb19kZXYsIEkyT19DTURfVVRJTF9QQVJBTVNfR0VULCBvcGJsaywKLQkJCSAgICAgIHNpemVvZihvcGJsayksIHJlc2Jsaywgc2l6ZW9mKHJlc2JsaykpOworCQkJICAgICAgc2l6ZW9mKG9wYmxrKSwgcmVzYmxrLCBidWZsZW4gKyA4KTsKIAogCW1lbWNweShidWYsIHJlc2JsayArIDgsIGJ1Zmxlbik7CS8qIGN1dCBvZmYgaGVhZGVyICovCiAKKwlrZnJlZShyZXNibGspOworCiAJaWYgKHNpemUgPiBidWZsZW4pCiAJCXJldHVybiBidWZsZW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2RyaXZlci5jCmluZGV4IDkxZjRlZGIuLjczOWJmZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYwpAQCAtMTcsOSArMTcsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgImNvcmUuaCIKKworI2RlZmluZSBPU01fTkFNRQkiaTJvIgogCiAvKiBtYXhfZHJpdmVycyAtIE1heGltdW0gSTJPIGRyaXZlcnMgKE9TTXMpIHdoaWNoIGNvdWxkIGJlIHJlZ2lzdGVyZWQgKi8KLXVuc2lnbmVkIGludCBpMm9fbWF4X2RyaXZlcnMgPSBJMk9fTUFYX0RSSVZFUlM7CitzdGF0aWMgdW5zaWduZWQgaW50IGkyb19tYXhfZHJpdmVycyA9IEkyT19NQVhfRFJJVkVSUzsKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfZHJpdmVycywgaTJvX21heF9kcml2ZXJzLCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X2RyaXZlcnMsICJtYXhpbXVtIG51bWJlciBvZiBPU00ncyB0byBzdXBwb3J0Iik7CiAKQEAgLTc2LDE3ICs3OSwxNiBAQAogCWludCByYyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXByX2RlYnVnKCJpMm86IFJlZ2lzdGVyIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKKwlvc21fZGVidWcoIlJlZ2lzdGVyIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKIAogCWlmIChkcnYtPmV2ZW50KSB7CiAJCWRydi0+ZXZlbnRfcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKGRydi0+bmFtZSk7CiAJCWlmICghZHJ2LT5ldmVudF9xdWV1ZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IENvdWxkIG5vdCBpbml0aWFsaXplIGV2ZW50IHF1ZXVlICIKLQkJCSAgICAgICAiZm9yIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKKwkJCW9zbV9lcnIoIkNvdWxkIG5vdCBpbml0aWFsaXplIGV2ZW50IHF1ZXVlIGZvciBkcml2ZXIgIgorCQkJCSIlc1xuIiwgZHJ2LT5uYW1lKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9Ci0JCXByX2RlYnVnKCJpMm86IEV2ZW50IHF1ZXVlIGluaXRpYWxpemVkIGZvciBkcml2ZXIgJXNcbiIsCi0JCQkgZHJ2LT5uYW1lKTsKKwkJb3NtX2RlYnVnKCJFdmVudCBxdWV1ZSBpbml0aWFsaXplZCBmb3IgZHJpdmVyICVzXG4iLCBkcnYtPm5hbWUpOwogCX0gZWxzZQogCQlkcnYtPmV2ZW50X3F1ZXVlID0gTlVMTDsKIApAQCAtOTcsOCArOTksOCBAQAogCiAJZm9yIChpID0gMDsgaTJvX2RyaXZlcnNbaV07IGkrKykKIAkJaWYgKGkgPj0gaTJvX21heF9kcml2ZXJzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImkybzogdG9vIG1hbnkgZHJpdmVycyByZWdpc3RlcmVkLCAiCi0JCQkgICAgICAgImluY3JlYXNlIG1heF9kcml2ZXJzXG4iKTsKKwkJCW9zbV9lcnIoInRvbyBtYW55IGRyaXZlcnMgcmVnaXN0ZXJlZCwgaW5jcmVhc2UgIgorCQkJCSJtYXhfZHJpdmVyc1xuIik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMm9fZHJpdmVyc19sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQpAQCAtMTA4LDE4ICsxMTAsMTYgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19kcml2ZXJzX2xvY2ssIGZsYWdzKTsKIAotCXByX2RlYnVnKCJpMm86IGRyaXZlciAlcyBnZXRzIGNvbnRleHQgaWQgJWRcbiIsIGRydi0+bmFtZSwKLQkJIGRydi0+Y29udGV4dCk7CisJb3NtX2RlYnVnKCJkcml2ZXIgJXMgZ2V0cyBjb250ZXh0IGlkICVkXG4iLCBkcnYtPm5hbWUsIGRydi0+Y29udGV4dCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpIHsKIAkJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CiAKIAkJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9hZGQoZHJ2LCBjKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShpMm9fZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKLQkJCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9hZGQoZHJ2LCBpMm9fZGV2KTsKKwkJICAgIGkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9hZGQoZHJ2LCBpMm9fZGV2KTsKIAl9CiAKLQogCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAJaWYgKHJjKQogCQlkZXN0cm95X3dvcmtxdWV1ZShkcnYtPmV2ZW50X3F1ZXVlKTsKQEAgLTEzOSw3ICsxMzksNyBAQAogCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcHJfZGVidWcoImkybzogdW5yZWdpc3RlciBkcml2ZXIgJXNcbiIsIGRydi0+bmFtZSk7CisJb3NtX2RlYnVnKCJ1bnJlZ2lzdGVyIGRyaXZlciAlc1xuIiwgZHJ2LT5uYW1lKTsKIAogCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAKQEAgLTE1OSw3ICsxNTksNyBAQAogCWlmIChkcnYtPmV2ZW50X3F1ZXVlKSB7CiAJCWRlc3Ryb3lfd29ya3F1ZXVlKGRydi0+ZXZlbnRfcXVldWUpOwogCQlkcnYtPmV2ZW50X3F1ZXVlID0gTlVMTDsKLQkJcHJfZGVidWcoImkybzogZXZlbnQgcXVldWUgcmVtb3ZlZCBmb3IgJXNcbiIsIGRydi0+bmFtZSk7CisJCW9zbV9kZWJ1ZygiZXZlbnQgcXVldWUgcmVtb3ZlZCBmb3IgJXNcbiIsIGRydi0+bmFtZSk7CiAJfQogfTsKIApAQCAtMTc2LDY4ICsxNzYsNzAgQEAKICAqCW9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBmbHVzaGVkIGFmdGVyd29yZHMuIFJldHVybnMKICAqCW5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZSAodGhlIG1lc3NhZ2Ugd2lsbCBiZSBmbHVzaGVkIHRvbykuCiAgKi8KLWludCBpMm9fZHJpdmVyX2Rpc3BhdGNoKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCi0JCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnKQoraW50IGkyb19kcml2ZXJfZGlzcGF0Y2goc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSkKIHsKIAlzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2OwotCXUzMiBjb250ZXh0ID0gcmVhZGwoJm1zZy0+dS5zLmljbnR4dCk7CisJc3RydWN0IGkyb19tZXNzYWdlICptc2cgPSBpMm9fbXNnX291dF90b192aXJ0KGMsIG0pOworCXUzMiBjb250ZXh0ID0gbGUzMl90b19jcHUobXNnLT51LnMuaWNudHh0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGxpa2VseShjb250ZXh0IDwgaTJvX21heF9kcml2ZXJzKSkgewotCQlzcGluX2xvY2soJmkyb19kcml2ZXJzX2xvY2spOwotCQlkcnYgPSBpMm9fZHJpdmVyc1tjb250ZXh0XTsKLQkJc3Bpbl91bmxvY2soJmkyb19kcml2ZXJzX2xvY2spOwotCi0JCWlmICh1bmxpa2VseSghZHJ2KSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNwdXJpb3VzIHJlcGx5IHRvIHVua25vd24gIgotCQkJICAgICAgICJkcml2ZXIgJWRcbiIsIGMtPm5hbWUsIGNvbnRleHQpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlpZiAoKHJlYWRsKCZtc2ctPnUuaGVhZFsxXSkgPj4gMjQpID09IEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIpIHsKLQkJCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYsICp0bXA7Ci0JCQlzdHJ1Y3QgaTJvX2V2ZW50ICpldnQ7Ci0JCQl1MTYgc2l6ZTsKLQkJCXUxNiB0aWQ7Ci0KLQkJCXRpZCA9IHJlYWRsKCZtc2ctPnUuaGVhZFsxXSkgJiAweDFmZmY7Ci0KLQkJCXByX2RlYnVnKCIlczogZXZlbnQgcmVjZWl2ZWQgZnJvbSBkZXZpY2UgJWRcbiIsIGMtPm5hbWUsCi0JCQkJIHRpZCk7Ci0KLQkJCS8qIGN1dCBvZiBoZWFkZXIgZnJvbSBtZXNzYWdlIHNpemUgKGluIDMyLWJpdCB3b3JkcykgKi8KLQkJCXNpemUgPSAocmVhZGwoJm1zZy0+dS5oZWFkWzBdKSA+PiAxNikgLSA1OwotCi0JCQlldnQgPSBrbWFsbG9jKHNpemUgKiA0ICsgc2l6ZW9mKCpldnQpLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghZXZ0KQotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJbWVtc2V0KGV2dCwgMCwgc2l6ZSAqIDQgKyBzaXplb2YoKmV2dCkpOwotCi0JCQlldnQtPnNpemUgPSBzaXplOwotCQkJbWVtY3B5X2Zyb21pbygmZXZ0LT50Y250eHQsICZtc2ctPnUucy50Y250eHQsCi0JCQkJICAgICAgKHNpemUgKyAyKSAqIDQpOwotCi0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZjLT5kZXZpY2VzLCBsaXN0KQotCQkJICAgIGlmIChkZXYtPmxjdF9kYXRhLnRpZCA9PSB0aWQpIHsKLQkJCQlldnQtPmkyb19kZXYgPSBkZXY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUlOSVRfV09SSygmZXZ0LT53b3JrLCAodm9pZCAoKikodm9pZCAqKSlkcnYtPmV2ZW50LAotCQkJCSAgZXZ0KTsKLQkJCXF1ZXVlX3dvcmsoZHJ2LT5ldmVudF9xdWV1ZSwgJmV2dC0+d29yayk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCWlmIChsaWtlbHkoZHJ2LT5yZXBseSkpCi0JCQlyZXR1cm4gZHJ2LT5yZXBseShjLCBtLCBtc2cpOwotCQllbHNlCi0JCQlwcl9kZWJ1ZygiJXM6IFJlcGx5IHRvIGRyaXZlciAlcywgYnV0IG5vIHJlcGx5IGZ1bmN0aW9uIgotCQkJCSAiIGRlZmluZWQhXG4iLCBjLT5uYW1lLCBkcnYtPm5hbWUpOworCWlmICh1bmxpa2VseShjb250ZXh0ID49IGkyb19tYXhfZHJpdmVycykpIHsKKwkJb3NtX3dhcm4oIiVzOiBTcHVyaW91cyByZXBseSB0byB1bmtub3duIGRyaXZlciAlZFxuIiwgYy0+bmFtZSwKKwkJCSBjb250ZXh0KTsKIAkJcmV0dXJuIC1FSU87Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTcHVyaW91cyByZXBseSB0byB1bmtub3duIGRyaXZlciAiCi0JCSAgICAgICAiJWRcbiIsIGMtPm5hbWUsIHJlYWRsKCZtc2ctPnUucy5pY250eHQpKTsKLQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJvX2RyaXZlcnNfbG9jaywgZmxhZ3MpOworCWRydiA9IGkyb19kcml2ZXJzW2NvbnRleHRdOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19kcml2ZXJzX2xvY2ssIGZsYWdzKTsKKworCWlmICh1bmxpa2VseSghZHJ2KSkgeworCQlvc21fd2FybigiJXM6IFNwdXJpb3VzIHJlcGx5IHRvIHVua25vd24gZHJpdmVyICVkXG4iLCBjLT5uYW1lLAorCQkJIGNvbnRleHQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoKGxlMzJfdG9fY3B1KG1zZy0+dS5oZWFkWzFdKSA+PiAyNCkgPT0gSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUikgeworCQlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCAqdG1wOworCQlzdHJ1Y3QgaTJvX2V2ZW50ICpldnQ7CisJCXUxNiBzaXplOworCQl1MTYgdGlkID0gbGUzMl90b19jcHUobXNnLT51LmhlYWRbMV0pICYgMHhmZmY7CisKKwkJb3NtX2RlYnVnKCJldmVudCByZWNlaXZlZCBmcm9tIGRldmljZSAlZFxuIiwgdGlkKTsKKworCQlpZiAoIWRydi0+ZXZlbnQpCisJCQlyZXR1cm4gLUVJTzsKKworCQkvKiBjdXQgb2YgaGVhZGVyIGZyb20gbWVzc2FnZSBzaXplIChpbiAzMi1iaXQgd29yZHMpICovCisJCXNpemUgPSAobGUzMl90b19jcHUobXNnLT51LmhlYWRbMF0pID4+IDE2KSAtIDU7CisKKwkJZXZ0ID0ga21hbGxvYyhzaXplICogNCArIHNpemVvZigqZXZ0KSwgR0ZQX0FUT01JQyB8IF9fR0ZQX1pFUk8pOworCQlpZiAoIWV2dCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWV2dC0+c2l6ZSA9IHNpemU7CisJCWV2dC0+dGNudHh0ID0gbGUzMl90b19jcHUobXNnLT51LnMudGNudHh0KTsKKwkJZXZ0LT5ldmVudF9pbmRpY2F0b3IgPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pOworCQltZW1jcHkoJmV2dC0+dGNudHh0LCAmbXNnLT51LnMudGNudHh0LCBzaXplICogNCk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgdG1wLCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkJICAgIGlmIChkZXYtPmxjdF9kYXRhLnRpZCA9PSB0aWQpIHsKKwkJCWV2dC0+aTJvX2RldiA9IGRldjsKKwkJCWJyZWFrOworCQl9CisKKwkJSU5JVF9XT1JLKCZldnQtPndvcmssICh2b2lkICgqKSh2b2lkICopKWRydi0+ZXZlbnQsIGV2dCk7CisJCXF1ZXVlX3dvcmsoZHJ2LT5ldmVudF9xdWV1ZSwgJmV2dC0+d29yayk7CisJCXJldHVybiAxOworCX0KKworCWlmICh1bmxpa2VseSghZHJ2LT5yZXBseSkpIHsKKwkJb3NtX2RlYnVnKCIlczogUmVwbHkgdG8gZHJpdmVyICVzLCBidXQgbm8gcmVwbHkgZnVuY3Rpb24iCisJCQkgICIgZGVmaW5lZCFcbiIsIGMtPm5hbWUsIGRydi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiBkcnYtPnJlcGx5KGMsIG0sIG1zZyk7CiB9CiAKIC8qKgpAQCAtMzM0LDExICszMzYsMTEgQEAKIAlpZiAoKGkyb19tYXhfZHJpdmVycyA8IDIpIHx8IChpMm9fbWF4X2RyaXZlcnMgPiA2NCkgfHwKIAkgICAgKChpMm9fbWF4X2RyaXZlcnMgXiAoaTJvX21heF9kcml2ZXJzIC0gMSkpICE9CiAJICAgICAoMiAqIGkyb19tYXhfZHJpdmVycyAtIDEpKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IG1heF9kcml2ZXJzIHNldCB0byAlZCwgYnV0IG11c3QgYmUgIgotCQkgICAgICAgIj49MiBhbmQgPD0gNjQgYW5kIGEgcG93ZXIgb2YgMlxuIiwgaTJvX21heF9kcml2ZXJzKTsKKwkJb3NtX3dhcm4oIm1heF9kcml2ZXJzIHNldCB0byAlZCwgYnV0IG11c3QgYmUgPj0yIGFuZCA8PSA2NCBhbmQgIgorCQkJICJhIHBvd2VyIG9mIDJcbiIsIGkyb19tYXhfZHJpdmVycyk7CiAJCWkyb19tYXhfZHJpdmVycyA9IEkyT19NQVhfRFJJVkVSUzsKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBtYXggZHJpdmVycyA9ICVkXG4iLCBpMm9fbWF4X2RyaXZlcnMpOworCW9zbV9pbmZvKCJtYXggZHJpdmVycyA9ICVkXG4iLCBpMm9fbWF4X2RyaXZlcnMpOwogCiAJaTJvX2RyaXZlcnMgPQogCSAgICBrbWFsbG9jKGkyb19tYXhfZHJpdmVycyAqIHNpemVvZigqaTJvX2RyaXZlcnMpLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwppbmRleCA3OWMxY2JmLi5iZGEyYzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9leGVjLW9zbS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJjb3JlLmgiCiAKICNkZWZpbmUgT1NNX05BTUUgImV4ZWMtb3NtIgogCkBAIC0zNyw5ICszOCw2IEBACiAKIHN0YXRpYyBpbnQgaTJvX2V4ZWNfbGN0X25vdGlmeShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBjaGFuZ2VfaW5kKTsKIAotLyogTW9kdWxlIGludGVybmFsIGZ1bmN0aW9ucyBmcm9tIG90aGVyIHNvdXJjZXMgKi8KLWV4dGVybiBpbnQgaTJvX2RldmljZV9wYXJzZV9sY3Qoc3RydWN0IGkyb19jb250cm9sbGVyICopOwotCiAvKiBnbG9iYWwgd2FpdCBsaXN0IGZvciBQT1NUIFdBSVQgKi8KIHN0YXRpYyBMSVNUX0hFQUQoaTJvX2V4ZWNfd2FpdF9saXN0KTsKIApAQCAtNTAsNyArNDgsNyBAQAogCXUzMiB0Y250eHQ7CQkvKiB0cmFuc2FjdGlvbiBjb250ZXh0IGZyb20gcmVwbHkgKi8KIAlpbnQgY29tcGxldGU7CQkvKiAxIGlmIHJlcGx5IHJlY2VpdmVkIG90aGVyd2lzZSAwICovCiAJdTMyIG07CQkJLyogbWVzc2FnZSBpZCAqLwotCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CS8qIHBvaW50ZXIgdG8gdGhlIHJlcGx5IG1lc3NhZ2UgKi8KKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsJLyogcG9pbnRlciB0byB0aGUgcmVwbHkgbWVzc2FnZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbm9kZSBpbiBnbG9iYWwgd2FpdCBsaXN0ICovCiB9OwogCkBAIC0xMDgsNyArMTA2LDggQEAKICAqCWJ1ZmZlciBtdXN0IG5vdCBiZSBmcmVlZC4gSW5zdGVhZCB0aGUgZXZlbnQgY29tcGxldGlvbiB3aWxsIGZyZWUgdGhlbQogICoJZm9yIHlvdS4gSW4gYWxsIG90aGVyIGNhc2VzIHRoZSBidWZmZXIgYXJlIHlvdXIgcHJvYmxlbS4KICAqCi0gKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiB0aW1lb3V0IG9yIHBvc2l0aXZlIGVycm9yCisgKgljb2RlIGZyb20gcmVwbHkuCiAgKi8KIGludCBpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0oc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwgdW5zaWduZWQgbG9uZwogCQkJICB0aW1lb3V0LCBzdHJ1Y3QgaTJvX2RtYSAqZG1hKQpAQCAtMTE2LDcgKzExNSw3IEBACiAJREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQod3EpOwogCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OwogCXN0YXRpYyB1MzIgdGNudHh0ID0gMHg4MDAwMDAwMDsKLQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnID0gYy0+aW5fcXVldWUudmlydCArIG07CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZyA9IGkyb19tc2dfaW5fdG9fdmlydChjLCBtKTsKIAlpbnQgcmMgPSAwOwogCiAJd2FpdCA9IGkyb19leGVjX3dhaXRfYWxsb2MoKTsKQEAgLTE1Myw3ICsxNTIsNyBAQAogCQlsaXN0X2FkZCgmd2FpdC0+bGlzdCwgJmkyb19leGVjX3dhaXRfbGlzdCk7CiAKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQod3EsIHdhaXQtPmNvbXBsZXRlLAotCQkJdGltZW91dCAqIEhaKTsKKwkJCQkJCSB0aW1lb3V0ICogSFopOwogCiAJCXdhaXQtPndxID0gTlVMTDsKIAl9CkBAIC0xNjEsOCArMTYwLDcgQEAKIAliYXJyaWVyKCk7CiAKIAlpZiAod2FpdC0+Y29tcGxldGUpIHsKLQkJaWYgKHJlYWRsKCZ3YWl0LT5tc2ctPmJvZHlbMF0pID4+IDI0KQotCQkJcmMgPSByZWFkbCgmd2FpdC0+bXNnLT5ib2R5WzBdKSAmIDB4ZmY7CisJCXJjID0gbGUzMl90b19jcHUod2FpdC0+bXNnLT5ib2R5WzBdKSA+PiAyNDsKIAkJaTJvX2ZsdXNoX3JlcGx5KGMsIHdhaXQtPm0pOwogCQlpMm9fZXhlY193YWl0X2ZyZWUod2FpdCk7CiAJfSBlbHNlIHsKQEAgLTE4Nyw2ICsxODUsNyBAQAogICoJQGM6IEkyTyBjb250cm9sbGVyIHdoaWNoIGFuc3dlcnMKICAqCUBtOiBtZXNzYWdlIGlkCiAgKglAbXNnOiBwb2ludGVyIHRvIHRoZSBJMk8gcmVwbHkgbWVzc2FnZQorICoJQGNvbnRleHQ6IHRyYW5zYWN0aW9uIGNvbnRleHQgb2YgcmVxdWVzdAogICoKICAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0IG9ubHkuIElmIHRoZSByZXBseSByZWFjaGVkCiAgKgliZWZvcmUgdGhlIHRpbWVvdXQsIHRoZSBpMm9fZXhlY193YWl0IHN0cnVjdCBpcyBmaWxsZWQgd2l0aCB0aGUgbWVzc2FnZQpAQCAtMjAxLDE2ICsyMDAsMTIgQEAKICAqCW1lc3NhZ2UgbXVzdCBhbHNvIGJlIGdpdmVuIGJhY2sgdG8gdGhlIGNvbnRyb2xsZXIuCiAgKi8KIHN0YXRpYyBpbnQgaTJvX21zZ19wb3N0X3dhaXRfY29tcGxldGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwKLQkJCQkgICAgICBzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnKQorCQkJCSAgICAgIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnLCB1MzIgY29udGV4dCkKIHsKIAlzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqd2FpdCwgKnRtcDsKLQlzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RhdGljIHNwaW5sb2NrX3QgbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKIAlpbnQgcmMgPSAxOwotCXUzMiBjb250ZXh0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJmxvY2spOwotCi0JY29udGV4dCA9IHJlYWRsKCZtc2ctPnUucy50Y250eHQpOwogCiAJLyoKIAkgKiBXZSBuZWVkIHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBpMm9fZXhlY193YWl0X2xpc3QgdG8gc2VlIGlmIHRoZSBnaXZlbgpAQCAtMjE5LDExICsyMTQsMTMgQEAKIAkgKiBhbHJlYWR5IGV4cGlyZWQuIE5vdCBtdWNoIHdlIGNhbiBkbyBhYm91dCB0aGF0IGV4Y2VwdCBsb2cgaXQgZm9yCiAJICogZGVidWcgcHVycG9zZXMsIGluY3JlYXNlIHRpbWVvdXQsIGFuZCByZWNvbXBpbGUuCiAJICovCi0Jc3Bpbl9sb2NrKCZsb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YWl0LCB0bXAsICZpMm9fZXhlY193YWl0X2xpc3QsIGxpc3QpIHsKIAkJaWYgKHdhaXQtPnRjbnR4dCA9PSBjb250ZXh0KSB7CiAJCQlsaXN0X2RlbCgmd2FpdC0+bGlzdCk7CiAKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwogCQkJd2FpdC0+bSA9IG07CiAJCQl3YWl0LT5tc2cgPSBtc2c7CiAJCQl3YWl0LT5jb21wbGV0ZSA9IDE7CkBAIC0yNDUsMjEgKzI0Miw2MyBAQAogCQkJCXJjID0gLTE7CiAJCQl9CiAKLQkJCXNwaW5fdW5sb2NrKCZsb2NrKTsKLQogCQkJcmV0dXJuIHJjOwogCQl9CiAJfQogCi0Jc3Bpbl91bmxvY2soJmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKIAotCXByX2RlYnVnKCIlczogQm9ndXMgcmVwbHkgaW4gUE9TVCBXQUlUICh0ci1jb250ZXh0OiAlMDh4KSFcbiIsIGMtPm5hbWUsCisJb3NtX3dhcm4oIiVzOiBCb2d1cyByZXBseSBpbiBQT1NUIFdBSVQgKHRyLWNvbnRleHQ6ICUwOHgpIVxuIiwgYy0+bmFtZSwKIAkJIGNvbnRleHQpOwogCiAJcmV0dXJuIC0xOwogfTsKIAogLyoqCisgKglpMm9fZXhlY19zaG93X3ZlbmRvcl9pZCAtIERpc3BsYXlzIFZlbmRvciBJRCBvZiBjb250cm9sbGVyCisgKglAZDogZGV2aWNlIG9mIHdoaWNoIHRoZSBWZW5kb3IgSUQgc2hvdWxkIGJlIGRpc3BsYXllZAorICoJQGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggdGhlIFZlbmRvciBJRCBzaG91bGQgYmUgcHJpbnRlZAorICoKKyAqCVJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHByaW50ZWQgaW50byBidWZmZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGkyb19leGVjX3Nob3dfdmVuZG9yX2lkKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldiA9IHRvX2kyb19kZXZpY2UoZCk7CisJdTE2IGlkOworCisJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChkZXYsIDB4MDAwMCwgMCwgJmlkLCAyKSkgeworCQlzcHJpbnRmKGJ1ZiwgIjB4JTA0eCIsIGlkKTsKKwkJcmV0dXJuIHN0cmxlbihidWYpICsgMTsKKwl9CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX2V4ZWNfc2hvd19wcm9kdWN0X2lkIC0gRGlzcGxheXMgUHJvZHVjdCBJRCBvZiBjb250cm9sbGVyCisgKglAZDogZGV2aWNlIG9mIHdoaWNoIHRoZSBQcm9kdWN0IElEIHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAqCUBidWY6IGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBQcm9kdWN0IElEIHNob3VsZCBiZSBwcmludGVkCisgKgorICoJUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcHJpbnRlZCBpbnRvIGJ1ZmZlci4KKyAqLworc3RhdGljIHNzaXplX3QgaTJvX2V4ZWNfc2hvd19wcm9kdWN0X2lkKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldiA9IHRvX2kyb19kZXZpY2UoZCk7CisJdTE2IGlkOworCisJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChkZXYsIDB4MDAwMCwgMSwgJmlkLCAyKSkgeworCQlzcHJpbnRmKGJ1ZiwgIjB4JTA0eCIsIGlkKTsKKwkJcmV0dXJuIHN0cmxlbihidWYpICsgMTsKKwl9CisKKwlyZXR1cm4gMDsKK307CisKKy8qIEV4ZWMtT1NNIGRldmljZSBhdHRyaWJ1dGVzICovCitzdGF0aWMgREVWSUNFX0FUVFIodmVuZG9yX2lkLCBTX0lSVUdPLCBpMm9fZXhlY19zaG93X3ZlbmRvcl9pZCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJvZHVjdF9pZCwgU19JUlVHTywgaTJvX2V4ZWNfc2hvd19wcm9kdWN0X2lkLCBOVUxMKTsKKworLyoqCiAgKglpMm9fZXhlY19wcm9iZSAtIENhbGxlZCBpZiBhIG5ldyBJMk8gZGV2aWNlIChleGVjdXRpdmUgY2xhc3MpIGFwcGVhcnMKICAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHByb2JlZAogICoKQEAgLTI3MSwxMCArMzEwLDE2IEBACiBzdGF0aWMgaW50IGkyb19leGVjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBpMm9fZGV2LT5pb3A7CiAKIAlpMm9fZXZlbnRfcmVnaXN0ZXIoaTJvX2RldiwgJmkyb19leGVjX2RyaXZlciwgMCwgMHhmZmZmZmZmZik7CiAKLQlpMm9fZGV2LT5pb3AtPmV4ZWMgPSBpMm9fZGV2OworCWMtPmV4ZWMgPSBpMm9fZGV2OworCisJaTJvX2V4ZWNfbGN0X25vdGlmeShjLCBjLT5sY3QtPmNoYW5nZV9pbmQgKyAxKTsKKworCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92ZW5kb3JfaWQpOworCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl9wcm9kdWN0X2lkKTsKIAogCXJldHVybiAwOwogfTsKQEAgLTI4OSw2ICszMzQsOSBAQAogICovCiBzdGF0aWMgaW50IGkyb19leGVjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3RfaWQpOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl92ZW5kb3JfaWQpOworCiAJaTJvX2V2ZW50X3JlZ2lzdGVyKHRvX2kyb19kZXZpY2UoZGV2KSwgJmkyb19leGVjX2RyaXZlciwgMCwgMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTMwMCwxMiArMzQ4LDE2IEBACiAgKgogICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFzeW5jaHJvbnVzIExDVCBOT1RJRlkgcmVwbGllcy4gSXQgcGFyc2VzIHRoZQogICoJbmV3IExDVCBhbmQgaWYgdGhlIGJ1ZmZlciBmb3IgdGhlIExDVCB3YXMgdG8gc21hbGwgc2VuZHMgYSBMQ1QgTk9USUZZCi0gKglhZ2Fpbi4KKyAqCWFnYWluLCBvdGhlcndpc2Ugc2VuZCBMQ1QgTk9USUZZIHRvIGdldCBpbmZvcm1lZCBvbiBuZXh0IExDVCBjaGFuZ2UuCiAgKi8KIHN0YXRpYyB2b2lkIGkyb19leGVjX2xjdF9tb2RpZmllZChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCiB7Ci0JaWYgKGkyb19kZXZpY2VfcGFyc2VfbGN0KGMpID09IC1FQUdBSU4pCi0JCWkyb19leGVjX2xjdF9ub3RpZnkoYywgMCk7CisJdTMyIGNoYW5nZV9pbmQgPSAwOworCisJaWYgKGkyb19kZXZpY2VfcGFyc2VfbGN0KGMpICE9IC1FQUdBSU4pCisJCWNoYW5nZV9pbmQgPSBjLT5sY3QtPmNoYW5nZV9pbmQgKyAxOworCisJaTJvX2V4ZWNfbGN0X25vdGlmeShjLCBjaGFuZ2VfaW5kKTsKIH07CiAKIC8qKgpAQCAtMzI1LDggKzM3NywxNCBAQAogc3RhdGljIGludCBpMm9fZXhlY19yZXBseShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLAogCQkJICBzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZykKIHsKLQlpZiAobGUzMl90b19jcHUobXNnLT51LmhlYWRbMF0pICYgTVNHX0ZBSUwpIHsJLy8gRmFpbCBiaXQgaXMgc2V0Ci0JCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICpwbXNnOwkvKiBwcmVzZXJ2ZWQgbWVzc2FnZSAqLworCXUzMiBjb250ZXh0OworCisJaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5oZWFkWzBdKSAmIE1TR19GQUlMKSB7CisJCS8qCisJCSAqIElmIEZhaWwgYml0IGlzIHNldCB3ZSBtdXN0IHRha2UgdGhlIHRyYW5zYWN0aW9uIGNvbnRleHQgb2YKKwkJICogdGhlIHByZXNlcnZlZCBtZXNzYWdlIHRvIGZpbmQgdGhlIHJpZ2h0IHJlcXVlc3QgYWdhaW4uCisJCSAqLworCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqcG1zZzsKIAkJdTMyIHBtOwogCiAJCXBtID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzNdKTsKQEAgLTMzNSwxNSArMzkzLDE1IEBACiAKIAkJaTJvX3JlcG9ydF9zdGF0dXMoS0VSTl9JTkZPLCAiaTJvX2NvcmUiLCBtc2cpOwogCi0JCS8qIFJlbGVhc2UgdGhlIHByZXNlcnZlZCBtc2cgYnkgcmVzdWJtaXR0aW5nIGl0IGFzIGEgTk9QICovCisJCWNvbnRleHQgPSByZWFkbCgmcG1zZy0+dS5zLnRjbnR4dCk7CisKKwkJLyogUmVsZWFzZSB0aGUgcHJlc2VydmVkIG1zZyAqLwogCQlpMm9fbXNnX25vcChjLCBwbSk7CisJfSBlbHNlCisJCWNvbnRleHQgPSBsZTMyX3RvX2NwdShtc2ctPnUucy50Y250eHQpOwogCi0JCS8qIElmIHJlcGx5IHRvIGkyb19wb3N0X3dhaXQgZmFpbGVkLCByZXR1cm4gY2F1c2VzIGEgdGltZW91dCAqLwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGxlMzJfdG9fY3B1KG1zZy0+dS5zLnRjbnR4dCkgJiAweDgwMDAwMDAwKQotCQlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXRfY29tcGxldGUoYywgbSwgbXNnKTsKKwlpZiAoY29udGV4dCAmIDB4ODAwMDAwMDApCisJCXJldHVybiBpMm9fbXNnX3Bvc3Rfd2FpdF9jb21wbGV0ZShjLCBtLCBtc2csIGNvbnRleHQpOwogCiAJaWYgKChsZTMyX3RvX2NwdShtc2ctPnUuaGVhZFsxXSkgPj4gMjQpID09IEkyT19DTURfTENUX05PVElGWSkgewogCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcms7CkBAIC0zODEsOCArNDM5LDkgQEAKICAqLwogc3RhdGljIHZvaWQgaTJvX2V4ZWNfZXZlbnQoc3RydWN0IGkyb19ldmVudCAqZXZ0KQogewotCW9zbV9pbmZvKCJFdmVudCByZWNlaXZlZCBmcm9tIGRldmljZTogJWRcbiIsCi0JCSBldnQtPmkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJaWYgKGxpa2VseShldnQtPmkyb19kZXYpKQorCQlvc21fZGVidWcoIkV2ZW50IHJlY2VpdmVkIGZyb20gZGV2aWNlOiAlZFxuIiwKKwkJCSAgZXZ0LT5pMm9fZGV2LT5sY3RfZGF0YS50aWQpOwogCWtmcmVlKGV2dCk7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwppbmRleCA0ODMwYjc3Li5mMjgzYjViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKQEAgLTYyLDcgKzYyLDcgQEAKICNpbmNsdWRlICJpMm9fYmxvY2suaCIKIAogI2RlZmluZSBPU01fTkFNRQkiYmxvY2stb3NtIgotI2RlZmluZSBPU01fVkVSU0lPTgkiJFJldiQiCisjZGVmaW5lIE9TTV9WRVJTSU9OCSIxLjI4NyIKICNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gQmxvY2sgRGV2aWNlIE9TTSIKIAogc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19ibG9ja19kcml2ZXI7CkBAIC0xMDQsNyArMTA0LDggQEAKIAlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCW9zbV9pbmZvKCJEZXZpY2UgcmVtb3ZlZCAlc1xuIiwgaTJvX2Jsa19kZXYtPmdkLT5kaXNrX25hbWUpOworCW9zbV9pbmZvKCJkZXZpY2UgcmVtb3ZlZCAoVElEOiAlMDN4KTogJXNcbiIsIGkyb19kZXYtPmxjdF9kYXRhLnRpZCwKKwkJIGkyb19ibGtfZGV2LT5nZC0+ZGlza19uYW1lKTsKIAogCWkyb19ldmVudF9yZWdpc3RlcihpMm9fZGV2LCAmaTJvX2Jsb2NrX2RyaXZlciwgMCwgMCk7CiAKQEAgLTE0Niw2ICsxNDcsMjkgQEAKIH07CiAKIC8qKgorICoJaTJvX2Jsb2NrX2lzc3VlX2ZsdXNoIC0gZGV2aWNlLWZsdXNoIGludGVyZmFjZSBmb3IgYmxvY2stbGF5ZXIKKyAqCUBxdWV1ZTogdGhlIHJlcXVlc3QgcXVldWUgb2YgdGhlIGRldmljZSB3aGljaCBzaG91bGQgYmUgZmx1c2hlZAorICoJQGRpc2s6IGdlbmRpc2sKKyAqCUBlcnJvcl9zZWN0b3I6IGVycm9yIG9mZnNldAorICoKKyAqCUhlbHBlciBmdW5jdGlvbiB0byBwcm92aWRlIGZsdXNoIGZ1bmN0aW9uYWxpdHkgdG8gYmxvY2stbGF5ZXIuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX2lzc3VlX2ZsdXNoKHJlcXVlc3RfcXVldWVfdCAqIHF1ZXVlLCBzdHJ1Y3QgZ2VuZGlzayAqZGlzaywKKwkJCQkgc2VjdG9yX3QgKiBlcnJvcl9zZWN0b3IpCit7CisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmkyb19ibGtfZGV2ID0gcXVldWUtPnF1ZXVlZGF0YTsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJaWYgKGxpa2VseShpMm9fYmxrX2RldikpCisJCXJjID0gaTJvX2Jsb2NrX2RldmljZV9mbHVzaChpMm9fYmxrX2Rldi0+aTJvX2Rldik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgogICoJaTJvX2Jsb2NrX2RldmljZV9tb3VudCAtIE1vdW50IChsb2FkKSB0aGUgbWVkaWEgb2YgZGV2aWNlIGRldgogICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgbW91bnQgcmVxdWVzdAogICoJQG1lZGlhX2lkOiBNZWRpYSBJZGVudGlmaWVyCkBAIC0yOTgsMjggKzMyMiwzMSBAQAogCiAvKioKICAqCWkyb19ibG9ja19zZ2xpc3RfYWxsb2MgLSBBbGxvY2F0ZSB0aGUgU0cgbGlzdCBhbmQgbWFwIGl0CisgKglAYzogSTJPIGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIHJlcXVlc3QgYmVsb25ncwogICoJQGlyZXE6IEkyTyBibG9jayByZXF1ZXN0CiAgKgotICoJQnVpbGRzIHRoZSBTRyBsaXN0IGFuZCBtYXAgaXQgaW50byB0byBiZSBhY2Nlc3NhYmxlIGJ5IHRoZSBjb250cm9sbGVyLgorICoJQnVpbGRzIHRoZSBTRyBsaXN0IGFuZCBtYXAgaXQgdG8gYmUgYWNjZXNzYWJsZSBieSB0aGUgY29udHJvbGxlci4KICAqCi0gKglSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIFNHIGxpc3Qgb3IgMCBvbiBmYWlsdXJlLgorICoJUmV0dXJucyAwIG9uIGZhaWx1cmUgb3IgMSBvbiBzdWNjZXNzLgogICovCi1zdGF0aWMgaW5saW5lIGludCBpMm9fYmxvY2tfc2dsaXN0X2FsbG9jKHN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSkKK3N0YXRpYyBpbmxpbmUgaW50IGkyb19ibG9ja19zZ2xpc3RfYWxsb2Moc3RydWN0IGkyb19jb250cm9sbGVyICpjLAorCQkJCQkgc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxLAorCQkJCQkgdTMyIF9faW9tZW0gKiogbXB0cikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXJlcS0+aTJvX2Jsa19kZXYtPmkyb19kZXYtPmlvcC0+cGRldi0+ZGV2OwogCWludCBuZW50czsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247CiAKKwlpcmVxLT5kZXYgPSAmYy0+cGRldi0+ZGV2OwogCW5lbnRzID0gYmxrX3JxX21hcF9zZyhpcmVxLT5yZXEtPnEsIGlyZXEtPnJlcSwgaXJlcS0+c2dfdGFibGUpOwogCiAJaWYgKHJxX2RhdGFfZGlyKGlyZXEtPnJlcSkgPT0gUkVBRCkKLQkJaXJlcS0+c2dfZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKwkJZGlyZWN0aW9uID0gUENJX0RNQV9GUk9NREVWSUNFOwogCWVsc2UKLQkJaXJlcS0+c2dfZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CisJCWRpcmVjdGlvbiA9IFBDSV9ETUFfVE9ERVZJQ0U7CiAKLQlpcmVxLT5zZ19uZW50cyA9IGRtYV9tYXBfc2coZGV2LCBpcmVxLT5zZ190YWJsZSwgbmVudHMsCi0JCQkJICAgIGlyZXEtPnNnX2RtYV9kaXJlY3Rpb24pOworCWlyZXEtPnNnX25lbnRzID0gbmVudHM7CiAKLQlyZXR1cm4gaXJlcS0+c2dfbmVudHM7CisJcmV0dXJuIGkyb19kbWFfbWFwX3NnKGMsIGlyZXEtPnNnX3RhYmxlLCBuZW50cywgZGlyZWN0aW9uLCBtcHRyKTsKIH07CiAKIC8qKgpAQCAtMzMwLDEwICszNTcsMTQgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGkyb19ibG9ja19zZ2xpc3RfZnJlZShzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QgKmlyZXEpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmlyZXEtPmkyb19ibGtfZGV2LT5pMm9fZGV2LT5pb3AtPnBkZXYtPmRldjsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb247CiAKLQlkbWFfdW5tYXBfc2coZGV2LCBpcmVxLT5zZ190YWJsZSwgaXJlcS0+c2dfbmVudHMsCi0JCSAgICAgaXJlcS0+c2dfZG1hX2RpcmVjdGlvbik7CisJaWYgKHJxX2RhdGFfZGlyKGlyZXEtPnJlcSkgPT0gUkVBRCkKKwkJZGlyZWN0aW9uID0gUENJX0RNQV9GUk9NREVWSUNFOworCWVsc2UKKwkJZGlyZWN0aW9uID0gUENJX0RNQV9UT0RFVklDRTsKKworCWRtYV91bm1hcF9zZyhpcmVxLT5kZXYsIGlyZXEtPnNnX3RhYmxlLCBpcmVxLT5zZ19uZW50cywgZGlyZWN0aW9uKTsKIH07CiAKIC8qKgpAQCAtMzUxLDYgKzM4MiwxMSBAQAogCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICppMm9fYmxrX2RldiA9IHEtPnF1ZXVlZGF0YTsKIAlzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QgKmlyZXE7CiAKKwlpZiAodW5saWtlbHkoIWkyb19ibGtfZGV2KSkgeworCQlvc21fZXJyKCJibG9jayBkZXZpY2UgYWxyZWFkeSByZW1vdmVkXG4iKTsKKwkJcmV0dXJuIEJMS1BSRVBfS0lMTDsKKwl9CisKIAkvKiByZXF1ZXN0IGlzIGFscmVhZHkgcHJvY2Vzc2VkIGJ5IHVzLCBzbyByZXR1cm4gKi8KIAlpZiAocmVxLT5mbGFncyAmIFJFUV9TUEVDSUFMKSB7CiAJCW9zbV9kZWJ1ZygiUkVRX1NQRUNJQUwgYWxyZWFkeSBzZXQhXG4iKTsKQEAgLTQwMCw2ICs0MzYsNTIgQEAKIH07CiAKIC8qKgorICoJaTJvX2Jsb2NrX2VuZF9yZXF1ZXN0IC0gUG9zdC1wcm9jZXNzaW5nIG9mIGNvbXBsZXRlZCBjb21tYW5kcworICoJQHJlcTogcmVxdWVzdCB3aGljaCBzaG91bGQgYmUgY29tcGxldGVkCisgKglAdXB0b2RhdGU6IDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIEkvTyBlcnJvciwgPCAwIGZvciBzcGVjaWZpYyBlcnJvcgorICoJQG5yX2J5dGVzOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUKKyAqCisgKglNYXJrIHRoZSByZXF1ZXN0IGFzIGNvbXBsZXRlLiBUaGUgbG9jayBtdXN0IG5vdCBiZSBoZWxkIHdoZW4gZW50ZXJpbmcuCisgKgorICovCitzdGF0aWMgdm9pZCBpMm9fYmxvY2tfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IHVwdG9kYXRlLAorCQkJCSAgaW50IG5yX2J5dGVzKQoreworCXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSA9IHJlcS0+c3BlY2lhbDsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2ID0gaXJlcS0+aTJvX2Jsa19kZXY7CisJcmVxdWVzdF9xdWV1ZV90ICpxID0gcmVxLT5xOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhyZXEsIHVwdG9kYXRlLCBucl9ieXRlcykpIHsKKwkJaW50IGxlZnRvdmVyID0gKHJlcS0+aGFyZF9ucl9zZWN0b3JzIDw8IEtFUk5FTF9TRUNUT1JfU0hJRlQpOworCisJCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKQorCQkJbGVmdG92ZXIgPSByZXEtPmRhdGFfbGVuOworCisJCWlmIChlbmRfaW9fZXJyb3IodXB0b2RhdGUpKQorCQkJZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhyZXEsIDAsIGxlZnRvdmVyKTsKKwl9CisKKwlhZGRfZGlza19yYW5kb21uZXNzKHJlcS0+cnFfZGlzayk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKworCWlmIChsaWtlbHkoZGV2KSkgeworCQlkZXYtPm9wZW5fcXVldWVfZGVwdGgtLTsKKwkJbGlzdF9kZWwoJmlyZXEtPnF1ZXVlKTsKKwl9CisKKwlibGtfc3RhcnRfcXVldWUocSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCWkyb19ibG9ja19zZ2xpc3RfZnJlZShpcmVxKTsKKwlpMm9fYmxvY2tfcmVxdWVzdF9mcmVlKGlyZXEpOworfTsKKworLyoqCiAgKglpMm9fYmxvY2tfcmVwbHkgLSBCbG9jayBPU00gcmVwbHkgaGFuZGxlci4KICAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSBtZXNzYWdlIGFycml2ZXMKICAqCUBtOiBtZXNzYWdlIGlkIG9mIHJlcGx5CkBAIC00MTEsNjAgKzQ5Myw4IEBACiBzdGF0aWMgaW50IGkyb19ibG9ja19yZXBseShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLAogCQkJICAgc3RydWN0IGkyb19tZXNzYWdlICptc2cpCiB7Ci0Jc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKLQl1OCBzdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogRkFJTGVkIG1lc3NhZ2UgKi8KLQlpZiAodW5saWtlbHkobGUzMl90b19jcHUobXNnLT51LmhlYWRbMF0pICYgKDEgPDwgMTMpKSkgewotCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgKnBtc2c7Ci0JCXUzMiBwbTsKLQotCQkvKgotCQkgKiBGQUlMZWQgbWVzc2FnZSBmcm9tIGNvbnRyb2xsZXIKLQkJICogV2UgaW5jcmVtZW50IHRoZSBlcnJvciBjb3VudCBhbmQgYWJvcnQgaXQKLQkJICoKLQkJICogSW4gdGhlb3J5IHRoaXMgd2lsbCBuZXZlciBoYXBwZW4uICBUaGUgSTJPIGJsb2NrIGNsYXNzCi0JCSAqIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgYmxvY2sgZGV2aWNlcyBuZXZlciByZXR1cm4KLQkJICogRkFJTHMgYnV0IGluc3RlYWQgdXNlIHRoZSBSRVEgc3RhdHVzIGZpZWxkLi4uYnV0Ci0JCSAqIGJldHRlciBiZSBvbiB0aGUgc2FmZSBzaWRlIHNpbmNlIG5vIG9uZSByZWFsbHkgZm9sbG93cwotCQkgKiB0aGUgc3BlYyB0byB0aGUgYm9vayA6KQotCQkgKi8KLQkJcG0gPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbM10pOwotCQlwbXNnID0gaTJvX21zZ19pbl90b192aXJ0KGMsIHBtKTsKLQotCQlyZXEgPSBpMm9fY250eHRfbGlzdF9nZXQoYywgbGUzMl90b19jcHUocG1zZy0+dS5zLnRjbnR4dCkpOwotCQlpZiAodW5saWtlbHkoIXJlcSkpIHsKLQkJCW9zbV9lcnIoIk5VTEwgcmVwbHkgcmVjZWl2ZWQhXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWlyZXEgPSByZXEtPnNwZWNpYWw7Ci0JCWRldiA9IGlyZXEtPmkyb19ibGtfZGV2OwotCQlxID0gZGV2LT5nZC0+cXVldWU7Ci0KLQkJcmVxLT5lcnJvcnMrKzsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0KLQkJd2hpbGUgKGVuZF90aGF0X3JlcXVlc3RfY2h1bmsocmVxLCAhcmVxLT5lcnJvcnMsCi0JCQkJCSAgICAgIGxlMzJfdG9fY3B1KHBtc2ctPmJvZHlbMV0pKSkgOwotCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKLQotCQlkZXYtPm9wZW5fcXVldWVfZGVwdGgtLTsKLQkJbGlzdF9kZWwoJmlyZXEtPnF1ZXVlKTsKLQkJYmxrX3N0YXJ0X3F1ZXVlKHEpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCi0JCS8qIE5vdyBmbHVzaCB0aGUgbWVzc2FnZSBieSBtYWtpbmcgaXQgYSBOT1AgKi8KLQkJaTJvX21zZ19ub3AoYywgcG0pOwotCi0JCXJldHVybiAtMTsKLQl9CisJaW50IHVwdG9kYXRlID0gMTsKIAogCXJlcSA9IGkyb19jbnR4dF9saXN0X2dldChjLCBsZTMyX3RvX2NwdShtc2ctPnUucy50Y250eHQpKTsKIAlpZiAodW5saWtlbHkoIXJlcSkpIHsKQEAgLTQ3Miw2MSArNTAyLDEzIEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpcmVxID0gcmVxLT5zcGVjaWFsOwotCWRldiA9IGlyZXEtPmkyb19ibGtfZGV2OwotCXEgPSBkZXYtPmdkLT5xdWV1ZTsKLQotCWlmICh1bmxpa2VseSghZGV2LT5pMm9fZGV2KSkgewotCQkvKgotCQkgKiBUaGlzIGlzIEhBQ0ssIGJ1dCBJbnRlbCBJbnRlZ3JhdGVkIFJBSUQgYWxsb3dzIHVzZXIKLQkJICogdG8gZGVsZXRlIGEgdm9sdW1lIHRoYXQgaXMgY2xhaW1lZCwgbG9ja2VkLCBhbmQgaW4gdXNlCi0JCSAqIGJ5IHRoZSBPUy4gV2UgaGF2ZSB0byBjaGVjayBmb3IgYSByZXBseSBmcm9tIGEKLQkJICogbm9uLWV4aXN0ZW50IGRldmljZSBhbmQgZmxhZyBpdCBhcyBhbiBlcnJvciBvciB0aGUgc3lzdGVtCi0JCSAqIGdvZXMga2FwdXQuLi4KLQkJICovCi0JCXJlcS0+ZXJyb3JzKys7Ci0JCW9zbV93YXJuKCJEYXRhIHRyYW5zZmVyIHRvIGRlbGV0ZWQgZGV2aWNlIVxuIik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJd2hpbGUgKGVuZF90aGF0X3JlcXVlc3RfY2h1bmsKLQkJICAgICAgIChyZXEsICFyZXEtPmVycm9ycywgbGUzMl90b19jcHUobXNnLT5ib2R5WzFdKSkpIDsKLQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJlcSk7Ci0KLQkJZGV2LT5vcGVuX3F1ZXVlX2RlcHRoLS07Ci0JCWxpc3RfZGVsKCZpcmVxLT5xdWV1ZSk7Ci0JCWJsa19zdGFydF9xdWV1ZShxKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCS8qCiAJICogICAgICBMZXRzIHNlZSB3aGF0IGlzIGNvb2tpbmcuIFdlIHN0dWZmZWQgdGhlCiAJICogICAgICByZXF1ZXN0IGluIHRoZSBjb250ZXh0LgogCSAqLwogCi0Jc3QgPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pID4+IDI0OwotCi0JaWYgKHN0ICE9IDApIHsKLQkJaW50IGVycjsKLQkJY2hhciAqYnNhX2Vycm9yc1tdID0gewotCQkJIlN1Y2Nlc3MiLAotCQkJIk1lZGlhIEVycm9yIiwKLQkJCSJGYWlsdXJlIGNvbW11bmljYXRpbmcgdG8gZGV2aWNlIiwKLQkJCSJEZXZpY2UgRmFpbHVyZSIsCi0JCQkiRGV2aWNlIGlzIG5vdCByZWFkeSIsCi0JCQkiTWVkaWEgbm90IHByZXNlbnQiLAotCQkJIk1lZGlhIGlzIGxvY2tlZCBieSBhbm90aGVyIHVzZXIiLAotCQkJIk1lZGlhIGhhcyBmYWlsZWQiLAotCQkJIkZhaWx1cmUgY29tbXVuaWNhdGluZyB0byBkZXZpY2UiLAotCQkJIkRldmljZSBidXMgZmFpbHVyZSIsCi0JCQkiRGV2aWNlIGlzIGxvY2tlZCBieSBhbm90aGVyIHVzZXIiLAotCQkJIkRldmljZSBpcyB3cml0ZSBwcm90ZWN0ZWQiLAotCQkJIkRldmljZSBoYXMgcmVzZXQiLAotCQkJIlZvbHVtZSBoYXMgY2hhbmdlZCwgd2FpdGluZyBmb3IgYWNrbm93bGVkZ2VtZW50IgotCQl9OwotCi0JCWVyciA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgJiAweGZmZmY7Ci0KKwlpZiAoKGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgPj4gMjQpICE9IDApIHsKKwkJdTMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSk7CiAJCS8qCiAJCSAqICAgICAgRGV2aWNlIG5vdCByZWFkeSBtZWFucyB0d28gdGhpbmdzLiBPbmUgaXMgdGhhdCB0aGUKIAkJICogICAgICB0aGUgdGhpbmcgd2VudCBvZmZsaW5lIChidXQgbm90IGEgcmVtb3ZhbCBtZWRpYSkKQEAgLTUzOSw0MCArNTIxLDIzIEBACiAJCSAqICAgICAgRG9uJ3Qgc3RpY2sgYSBzdXBlcnRyYWsxMDAgaW50byBjYWNoZSBhZ2dyZXNzaXZlIG1vZGVzCiAJCSAqLwogCi0JCW9zbV9lcnIoImJsb2NrLW9zbTogL2Rldi8lcyBlcnJvcjogJXMiLCBkZXYtPmdkLT5kaXNrX25hbWUsCi0JCQlic2FfZXJyb3JzW2xlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgJiAweGZmZmZdKTsKLQkJaWYgKGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgJiAweDAwZmYwMDAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICIgLSBERE0gYXR0ZW1wdGVkICVkIHJldHJpZXMiLAotCQkJICAgICAgIChsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pID4+IDE2KSAmIDB4MDBmZik7Ci0JCXByaW50ayhLRVJOX0VSUiAiLlxuIik7CisJCW9zbV9lcnIoIlRJRCAlMDN4IGVycm9yIHN0YXR1czogMHglMDJ4LCBkZXRhaWxlZCBzdGF0dXM6ICIKKwkJCSIweCUwNHhcbiIsIChsZTMyX3RvX2NwdShtc2ctPnUuaGVhZFsxXSkgPj4gMTIgJiAweGZmZiksCisJCQlzdGF0dXMgPj4gMjQsIHN0YXR1cyAmIDB4ZmZmZik7CisKIAkJcmVxLT5lcnJvcnMrKzsKLQl9IGVsc2UKLQkJcmVxLT5lcnJvcnMgPSAwOwogCi0JaWYgKCFlbmRfdGhhdF9yZXF1ZXN0X2NodW5rCi0JICAgIChyZXEsICFyZXEtPmVycm9ycywgbGUzMl90b19jcHUobXNnLT5ib2R5WzFdKSkpIHsKLQkJYWRkX2Rpc2tfcmFuZG9tbmVzcyhyZXEtPnJxX2Rpc2spOwotCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCXVwdG9kYXRlID0gMDsKKwl9CiAKLQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJlcSk7Ci0KLQkJZGV2LT5vcGVuX3F1ZXVlX2RlcHRoLS07Ci0JCWxpc3RfZGVsKCZpcmVxLT5xdWV1ZSk7Ci0JCWJsa19zdGFydF9xdWV1ZShxKTsKLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQotCQlpMm9fYmxvY2tfc2dsaXN0X2ZyZWUoaXJlcSk7Ci0JCWkyb19ibG9ja19yZXF1ZXN0X2ZyZWUoaXJlcSk7Ci0JfSBlbHNlCi0JCW9zbV9lcnIoInN0aWxsIHJlbWFpbmluZyBjaHVua3NcbiIpOworCWkyb19ibG9ja19lbmRfcmVxdWVzdChyZXEsIHVwdG9kYXRlLCBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMV0pKTsKIAogCXJldHVybiAxOwogfTsKIAogc3RhdGljIHZvaWQgaTJvX2Jsb2NrX2V2ZW50KHN0cnVjdCBpMm9fZXZlbnQgKmV2dCkKIHsKLQlvc21faW5mbygiYmxvY2stb3NtOiBldmVudCByZWNlaXZlZFxuIik7CisJb3NtX2RlYnVnKCJldmVudCByZWNlaXZlZFxuIik7CiAJa2ZyZWUoZXZ0KTsKIH07CiAKQEAgLTc3OCwxOCArNzQzLDI1IEBACiBzdGF0aWMgaW50IGkyb19ibG9ja190cmFuc2ZlcihzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICpkZXYgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBkZXYtPmkyb19kZXYtPmlvcDsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CiAJaW50IHRpZCA9IGRldi0+aTJvX2Rldi0+bGN0X2RhdGEudGlkOwogCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7Ci0Jdm9pZCBfX2lvbWVtICptcHRyOworCXUzMiBfX2lvbWVtICptcHRyOwogCXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSA9IHJlcS0+c3BlY2lhbDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCWludCBzZ251bTsKLQlpbnQgaTsKIAl1MzIgbTsKIAl1MzIgdGNudHh0OwotCXUzMiBzZ19mbGFnczsKKwl1MzIgc2dsX29mZnNldCA9IFNHTF9PRkZTRVRfODsKKwl1MzIgY3RsX2ZsYWdzID0gMHgwMDAwMDAwMDsKIAlpbnQgcmM7CisJdTMyIGNtZDsKKworCWlmICh1bmxpa2VseSghZGV2LT5pMm9fZGV2KSkgeworCQlvc21fZXJyKCJ0cmFuc2ZlciB0byByZW1vdmVkIGRyaXZlXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJYyA9IGRldi0+aTJvX2Rldi0+aW9wOwogCiAJbSA9IGkyb19tc2dfZ2V0KGMsICZtc2cpOwogCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkgewpAQCAtODAzLDgyICs3NzUsMTA5IEBACiAJCWdvdG8gbm9wX21zZzsKIAl9CiAKLQlpZiAoKHNnbnVtID0gaTJvX2Jsb2NrX3NnbGlzdF9hbGxvYyhpcmVxKSkgPD0gMCkgeworCXdyaXRlbChpMm9fYmxvY2tfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbCh0Y250eHQsICZtc2ctPnUucy50Y250eHQpOworCisJbXB0ciA9ICZtc2ctPmJvZHlbMF07CisKKwlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CisJCWNtZCA9IEkyT19DTURfQkxPQ0tfUkVBRCA8PCAyNDsKKworCQlzd2l0Y2ggKGRldi0+cmNhY2hlKSB7CisJCWNhc2UgQ0FDSEVfUFJFRkVUQ0g6CisJCQljdGxfZmxhZ3MgPSAweDIwMUYwMDA4OworCQkJYnJlYWs7CisKKwkJY2FzZSBDQUNIRV9TTUFSVEZFVENIOgorCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQorCQkJCWN0bF9mbGFncyA9IDB4MjAxRjAwMDg7CisJCQllbHNlCisJCQkJY3RsX2ZsYWdzID0gMHgwMDFGMDAwMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWNtZCA9IEkyT19DTURfQkxPQ0tfV1JJVEUgPDwgMjQ7CisKKwkJc3dpdGNoIChkZXYtPndjYWNoZSkgeworCQljYXNlIENBQ0hFX1dSSVRFVEhST1VHSDoKKwkJCWN0bF9mbGFncyA9IDB4MDAxRjAwMDg7CisJCQlicmVhazsKKwkJY2FzZSBDQUNIRV9XUklURUJBQ0s6CisJCQljdGxfZmxhZ3MgPSAweDAwMUYwMDEwOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfU01BUlRCQUNLOgorCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQorCQkJCWN0bF9mbGFncyA9IDB4MDAxRjAwMDQ7CisJCQllbHNlCisJCQkJY3RsX2ZsYWdzID0gMHgwMDFGMDAxMDsKKwkJCWJyZWFrOworCQljYXNlIENBQ0hFX1NNQVJUVEhST1VHSDoKKwkJCWlmIChyZXEtPm5yX3NlY3RvcnMgPiAxNikKKwkJCQljdGxfZmxhZ3MgPSAweDAwMUYwMDA0OworCQkJZWxzZQorCQkJCWN0bF9mbGFncyA9IDB4MDAxRjAwMTA7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKKwlpZiAoYy0+YWRhcHRlYykgeworCQl1OCBjbWRbMTBdOworCQl1MzIgc2NzaV9mbGFnczsKKwkJdTE2IGh3c2VjID0gcXVldWVfaGFyZHNlY3Rfc2l6ZShyZXEtPnEpID4+IEtFUk5FTF9TRUNUT1JfU0hJRlQ7CisKKwkJbWVtc2V0KGNtZCwgMCwgMTApOworCisJCXNnbF9vZmZzZXQgPSBTR0xfT0ZGU0VUXzEyOworCisJCXdyaXRlbChJMk9fQ01EX1BSSVZBVEUgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IHRpZCwKKwkJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisKKwkJd3JpdGVsKEkyT19WRU5ET1JfRFBUIDw8IDE2IHwgSTJPX0NNRF9TQ1NJX0VYRUMsIG1wdHIrKyk7CisJCXdyaXRlbCh0aWQsIG1wdHIrKyk7CisKKwkJLyoKKwkJICogRU5BQkxFX0RJU0NPTk5FQ1QKKwkJICogU0lNUExFX1RBRworCQkgKiBSRVRVUk5fU0VOU0VfREFUQV9JTl9SRVBMWV9NRVNTQUdFX0ZSQU1FCisJCSAqLworCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CisJCQljbWRbMF0gPSAweDI4OworCQkJc2NzaV9mbGFncyA9IDB4NjBhMDAwMGE7CisJCX0gZWxzZSB7CisJCQljbWRbMF0gPSAweDJBOworCQkJc2NzaV9mbGFncyA9IDB4YTBhMDAwMGE7CisJCX0KKworCQl3cml0ZWwoc2NzaV9mbGFncywgbXB0cisrKTsKKworCQkqKCh1MzIgKikgJiBjbWRbMl0pID0gY3B1X3RvX2JlMzIocmVxLT5zZWN0b3IgKiBod3NlYyk7CisJCSooKHUxNiAqKSAmIGNtZFs3XSkgPSBjcHVfdG9fYmUxNihyZXEtPm5yX3NlY3RvcnMgKiBod3NlYyk7CisKKwkJbWVtY3B5X3RvaW8obXB0ciwgY21kLCAxMCk7CisJCW1wdHIgKz0gNDsKKwkJd3JpdGVsKHJlcS0+bnJfc2VjdG9ycyA8PCBLRVJORUxfU0VDVE9SX1NISUZULCBtcHRyKyspOworCX0gZWxzZQorI2VuZGlmCisJeworCQl3cml0ZWwoY21kIHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsICZtc2ctPnUuaGVhZFsxXSk7CisJCXdyaXRlbChjdGxfZmxhZ3MsIG1wdHIrKyk7CisJCXdyaXRlbChyZXEtPm5yX3NlY3RvcnMgPDwgS0VSTkVMX1NFQ1RPUl9TSElGVCwgbXB0cisrKTsKKwkJd3JpdGVsKCh1MzIpIChyZXEtPnNlY3RvciA8PCBLRVJORUxfU0VDVE9SX1NISUZUKSwgbXB0cisrKTsKKwkJd3JpdGVsKHJlcS0+c2VjdG9yID4+ICgzMiAtIEtFUk5FTF9TRUNUT1JfU0hJRlQpLCBtcHRyKyspOworCX0KKworCWlmICghaTJvX2Jsb2NrX3NnbGlzdF9hbGxvYyhjLCBpcmVxLCAmbXB0cikpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGNvbnRleHRfcmVtb3ZlOwogCX0KIAotCS8qIEJ1aWxkIHRoZSBtZXNzYWdlIGJhc2VkIG9uIHRoZSByZXF1ZXN0LiAqLwotCXdyaXRlbChpMm9fYmxvY2tfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOwotCXdyaXRlbCh0Y250eHQsICZtc2ctPnUucy50Y250eHQpOwotCXdyaXRlbChyZXEtPm5yX3NlY3RvcnMgPDwgOSwgJm1zZy0+Ym9keVsxXSk7Ci0KLQl3cml0ZWwoKCgodTY0KSByZXEtPnNlY3RvcikgPDwgOSkgJiAweGZmZmZmZmZmLCAmbXNnLT5ib2R5WzJdKTsKLQl3cml0ZWwocmVxLT5zZWN0b3IgPj4gMjMsICZtc2ctPmJvZHlbM10pOwotCi0JbXB0ciA9ICZtc2ctPmJvZHlbNF07Ci0KLQlzZyA9IGlyZXEtPnNnX3RhYmxlOwotCi0JaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gUkVBRCkgewotCQl3cml0ZWwoSTJPX0NNRF9CTE9DS19SRUFEIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsCi0JCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOwotCQlzZ19mbGFncyA9IDB4MTAwMDAwMDA7Ci0JCXN3aXRjaCAoZGV2LT5yY2FjaGUpIHsKLQkJY2FzZSBDQUNIRV9OVUxMOgotCQkJd3JpdGVsKDAsICZtc2ctPmJvZHlbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FDSEVfUFJFRkVUQ0g6Ci0JCQl3cml0ZWwoMHgyMDFGMDAwOCwgJm1zZy0+Ym9keVswXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDQUNIRV9TTUFSVEZFVENIOgotCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQotCQkJCXdyaXRlbCgweDIwMUYwMDA4LCAmbXNnLT5ib2R5WzBdKTsKLQkJCWVsc2UKLQkJCQl3cml0ZWwoMHgwMDFGMDAwMCwgJm1zZy0+Ym9keVswXSk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXdyaXRlbChJMk9fQ01EX0JMT0NLX1dSSVRFIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsCi0JCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOwotCQlzZ19mbGFncyA9IDB4MTQwMDAwMDA7Ci0JCXN3aXRjaCAoZGV2LT53Y2FjaGUpIHsKLQkJY2FzZSBDQUNIRV9OVUxMOgotCQkJd3JpdGVsKDAsICZtc2ctPmJvZHlbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FDSEVfV1JJVEVUSFJPVUdIOgotCQkJd3JpdGVsKDB4MDAxRjAwMDgsICZtc2ctPmJvZHlbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FDSEVfV1JJVEVCQUNLOgotCQkJd3JpdGVsKDB4MDAxRjAwMTAsICZtc2ctPmJvZHlbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0FDSEVfU01BUlRCQUNLOgotCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQotCQkJCXdyaXRlbCgweDAwMUYwMDA0LCAmbXNnLT5ib2R5WzBdKTsKLQkJCWVsc2UKLQkJCQl3cml0ZWwoMHgwMDFGMDAxMCwgJm1zZy0+Ym9keVswXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDQUNIRV9TTUFSVFRIUk9VR0g6Ci0JCQlpZiAocmVxLT5ucl9zZWN0b3JzID4gMTYpCi0JCQkJd3JpdGVsKDB4MDAxRjAwMDQsICZtc2ctPmJvZHlbMF0pOwotCQkJZWxzZQotCQkJCXdyaXRlbCgweDAwMUYwMDEwLCAmbXNnLT5ib2R5WzBdKTsKLQkJfQotCX0KLQotCWZvciAoaSA9IHNnbnVtOyBpID4gMDsgaS0tKSB7Ci0JCWlmIChpID09IDEpCi0JCQlzZ19mbGFncyB8PSAweDgwMDAwMDAwOwotCQl3cml0ZWwoc2dfZmxhZ3MgfCBzZ19kbWFfbGVuKHNnKSwgbXB0cik7Ci0JCXdyaXRlbChzZ19kbWFfYWRkcmVzcyhzZyksIG1wdHIgKyA0KTsKLQkJbXB0ciArPSA4OwotCQlzZysrOwotCX0KLQotCXdyaXRlbChJMk9fTUVTU0FHRV9TSVpFCi0JICAgICAgICgoKHVuc2lnbmVkIGxvbmcpbXB0ciAtCi0JCSAodW5zaWduZWQgbG9uZykmbXNnLT51LmhlYWRbMF0pID4+IDIpIHwgU0dMX09GRlNFVF84LAotCSAgICAgICAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fTUVTU0FHRV9TSVpFKG1wdHIgLSAmbXNnLT51LmhlYWRbMF0pIHwKKwkgICAgICAgc2dsX29mZnNldCwgJm1zZy0+dS5oZWFkWzBdKTsKIAogCWxpc3RfYWRkX3RhaWwoJmlyZXEtPnF1ZXVlLCAmZGV2LT5vcGVuX3F1ZXVlKTsKIAlkZXYtPm9wZW5fcXVldWVfZGVwdGgrKzsKQEAgLTkyMSwxMSArOTIwLDEzIEBACiAKIAkJCXF1ZXVlX2RlcHRoID0gaXJlcS0+aTJvX2Jsa19kZXYtPm9wZW5fcXVldWVfZGVwdGg7CiAKLQkJCWlmIChxdWV1ZV9kZXB0aCA8IEkyT19CTE9DS19NQVhfT1BFTl9SRVFVRVNUUykKKwkJCWlmIChxdWV1ZV9kZXB0aCA8IEkyT19CTE9DS19NQVhfT1BFTl9SRVFVRVNUUykgewogCQkJCWlmICghaTJvX2Jsb2NrX3RyYW5zZmVyKHJlcSkpIHsKIAkJCQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOwogCQkJCQljb250aW51ZTsKLQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCW9zbV9pbmZvKCJ0cmFuc2ZlciBlcnJvclxuIik7CisJCQl9CiAKIAkJCWlmIChxdWV1ZV9kZXB0aCkKIAkJCQlicmVhazsKQEAgLTkzOSw3ICs5NDAsNiBAQAogCQkJSU5JVF9XT1JLKCZkcmVxLT53b3JrLCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0X2ZuLAogCQkJCSAgZHJlcSk7CiAKLQkJCW9zbV9pbmZvKCJ0cmFuc2ZlciBlcnJvclxuIik7CiAJCQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhpMm9fYmxvY2tfZHJpdmVyLmV2ZW50X3F1ZXVlLAogCQkJCQkJJmRyZXEtPndvcmssCiAJCQkJCQlJMk9fQkxPQ0tfUkVUUllfVElNRSkpCkBAIC0xMDA4LDYgKzEwMDgsNyBAQAogCX0KIAogCWJsa19xdWV1ZV9wcmVwX3JxKHF1ZXVlLCBpMm9fYmxvY2tfcHJlcF9yZXFfZm4pOworCWJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihxdWV1ZSwgaTJvX2Jsb2NrX2lzc3VlX2ZsdXNoKTsKIAogCWdkLT5tYWpvciA9IEkyT19NQUpPUjsKIAlnZC0+cXVldWUgPSBxdWV1ZTsKQEAgLTEwNDAsMTcgKzEwNDEsMjcgQEAKIHN0YXRpYyBpbnQgaTJvX2Jsb2NrX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKLQlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXY7CiAJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gaTJvX2Rldi0+aW9wOworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICppMm9fYmxrX2RldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwogCXN0YXRpYyBpbnQgdW5pdCA9IDA7CiAJaW50IHJjOwogCXU2NCBzaXplOwogCXUzMiBibG9ja3NpemU7Ci0JdTE2IHBvd2VyOwogCXUzMiBmbGFncywgc3RhdHVzOwotCWludCBzZWdtZW50czsKKwl1MTYgYm9keV9zaXplID0gNDsKKwl1bnNpZ25lZCBzaG9ydCBtYXhfc2VjdG9yczsKKworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKKwlpZiAoYy0+YWRhcHRlYykKKwkJYm9keV9zaXplID0gODsKKyNlbmRpZgorCisJaWYgKGMtPmxpbWl0X3NlY3RvcnMpCisJCW1heF9zZWN0b3JzID0gSTJPX01BWF9TRUNUT1JTX0xJTUlURUQ7CisJZWxzZQorCQltYXhfc2VjdG9ycyA9IEkyT19NQVhfU0VDVE9SUzsKIAogCS8qIHNraXAgZGV2aWNlcyB3aGljaCBhcmUgdXNlZCBieSBJT1AgKi8KIAlpZiAoaTJvX2Rldi0+bGN0X2RhdGEudXNlcl90aWQgIT0gMHhmZmYpIHsKQEAgLTEwNTgsOCArMTA2OSw2IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCW9zbV9pbmZvKCJOZXcgZGV2aWNlIGRldGVjdGVkIChUSUQ6ICUwM3gpXG4iLCBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOwotCiAJaWYgKGkyb19kZXZpY2VfY2xhaW0oaTJvX2RldikpIHsKIAkJb3NtX3dhcm4oIlVuYWJsZSB0byBjbGFpbSBkZXZpY2UuIEluc3RhbGxhdGlvbiBhYm9ydGVkXG4iKTsKIAkJcmMgPSAtRUZBVUxUOwpAQCAtMTA4Nyw1MCArMTA5Niw0NCBAQAogCXF1ZXVlID0gZ2QtPnF1ZXVlOwogCXF1ZXVlLT5xdWV1ZWRhdGEgPSBpMm9fYmxrX2RldjsKIAotCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxdWV1ZSwgSTJPX01BWF9TRUdNRU5UUyk7Ci0JYmxrX3F1ZXVlX21heF9zZWN0b3JzKHF1ZXVlLCBJMk9fTUFYX1NFQ1RPUlMpOworCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxdWV1ZSwgSTJPX01BWF9QSFlTX1NFR01FTlRTKTsKKwlibGtfcXVldWVfbWF4X3NlY3RvcnMocXVldWUsIG1heF9zZWN0b3JzKTsKKwlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHF1ZXVlLCBpMm9fc2dfdGFibGVzaXplKGMsIGJvZHlfc2l6ZSkpOwogCi0JaWYgKGMtPnNob3J0X3JlcSkKLQkJc2VnbWVudHMgPSA4OwotCWVsc2UgewotCQlpMm9fc3RhdHVzX2Jsb2NrICpzYjsKLQotCQlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OwotCi0JCXNlZ21lbnRzID0gKHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUgLQotCQkJICAgIHNpemVvZihzdHJ1Y3QgaTJvX21lc3NhZ2UpIC8gNCAtIDQpIC8gMjsKLQl9Ci0KLQlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHF1ZXVlLCBzZWdtZW50cyk7Ci0KLQlvc21fZGVidWcoIm1heCBzZWN0b3JzID0gJWRcbiIsIEkyT19NQVhfU0VDVE9SUyk7Ci0Jb3NtX2RlYnVnKCJwaHlzIHNlZ21lbnRzID0gJWRcbiIsIEkyT19NQVhfU0VHTUVOVFMpOwotCW9zbV9kZWJ1ZygiaHcgc2VnbWVudHMgPSAlZFxuIiwgc2VnbWVudHMpOworCW9zbV9kZWJ1ZygibWF4IHNlY3RvcnMgPSAlZFxuIiwgcXVldWUtPm1heF9waHlzX3NlZ21lbnRzKTsKKwlvc21fZGVidWcoInBoeXMgc2VnbWVudHMgPSAlZFxuIiwgcXVldWUtPm1heF9zZWN0b3JzKTsKKwlvc21fZGVidWcoIm1heCBodyBzZWdtZW50cyA9ICVkXG4iLCBxdWV1ZS0+bWF4X2h3X3NlZ21lbnRzKTsKIAogCS8qCiAJICogICAgICBBc2sgZm9yIHRoZSBjdXJyZW50IG1lZGlhIGRhdGEuIElmIHRoYXQgaXNuJ3Qgc3VwcG9ydGVkCiAJICogICAgICB0aGVuIHdlIGFzayBmb3IgdGhlIGRldmljZSBjYXBhY2l0eSBkYXRhCiAJICovCi0JaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDQsIDEsICZibG9ja3NpemUsIDQpICE9IDAKLQkgICAgfHwgaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwNCwgMCwgJnNpemUsIDgpICE9IDApIHsKLQkJaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMywgJmJsb2Nrc2l6ZSwgNCk7Ci0JCWkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDQsICZzaXplLCA4KTsKLQl9Ci0Jb3NtX2RlYnVnKCJibG9ja3NpemUgPSAlZFxuIiwgYmxvY2tzaXplKTsKKwlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwNCwgMSwgJmJsb2Nrc2l6ZSwgNCkgfHwKKwkgICAgaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMywgJmJsb2Nrc2l6ZSwgNCkpIHsKKwkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocXVldWUsIGJsb2Nrc2l6ZSk7CisJfSBlbHNlCisJCW9zbV93YXJuKCJ1bmFibGUgdG8gZ2V0IGJsb2Nrc2l6ZSBvZiAlc1xuIiwgZ2QtPmRpc2tfbmFtZSk7CiAKLQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMiwgJnBvd2VyLCAyKSkKLQkJcG93ZXIgPSAwOworCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDA0LCAwLCAmc2l6ZSwgOCkgfHwKKwkgICAgaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgNCwgJnNpemUsIDgpKSB7CisJCXNldF9jYXBhY2l0eShnZCwgc2l6ZSA+PiBLRVJORUxfU0VDVE9SX1NISUZUKTsKKwl9IGVsc2UKKwkJb3NtX3dhcm4oImNvdWxkIG5vdCBnZXQgc2l6ZSBvZiAlc1xuIiwgZ2QtPmRpc2tfbmFtZSk7CisKKwlpZiAoIWkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDIsICZpMm9fYmxrX2Rldi0+cG93ZXIsIDIpKQorCQlpMm9fYmxrX2Rldi0+cG93ZXIgPSAwOwogCWkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDUsICZmbGFncywgNCk7CiAJaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgNiwgJnN0YXR1cywgNCk7CiAKLQlzZXRfY2FwYWNpdHkoZ2QsIHNpemUgPj4gOSk7Ci0KIAlpMm9fZXZlbnRfcmVnaXN0ZXIoaTJvX2RldiwgJmkyb19ibG9ja19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOwogCiAJYWRkX2Rpc2soZ2QpOwogCiAJdW5pdCsrOwogCisJb3NtX2luZm8oImRldmljZSBhZGRlZCAoVElEOiAlMDN4KTogJXNcbiIsIGkyb19kZXYtPmxjdF9kYXRhLnRpZCwKKwkJIGkyb19ibGtfZGV2LT5nZC0+ZGlza19uYW1lKTsKKwogCXJldHVybiAwOwogCiAgICAgICBjbGFpbV9yZWxlYXNlOgpAQCAtMTE3OCw3ICsxMTgxLDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWkyb19ibGtfcmVxX3Bvb2wucG9vbCA9IG1lbXBvb2xfY3JlYXRlKEkyT19SRVFfTUVNUE9PTF9TSVpFLAorCWkyb19ibGtfcmVxX3Bvb2wucG9vbCA9IG1lbXBvb2xfY3JlYXRlKEkyT19CTE9DS19SRVFfTUVNUE9PTF9TSVpFLAogCQkJCQkgICAgICAgbWVtcG9vbF9hbGxvY19zbGFiLAogCQkJCQkgICAgICAgbWVtcG9vbF9mcmVlX3NsYWIsCiAJCQkJCSAgICAgICBpMm9fYmxrX3JlcV9wb29sLnNsYWIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suaCBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmgKaW5kZXggZGRkOWExNS4uNGZkYWE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suaAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5oCkBAIC01Niw0MiArNTYsNDYgQEAKICNkZWZpbmUgSTJPX0JMT0NLX1JFVFJZX1RJTUUgSFovNAogI2RlZmluZSBJMk9fQkxPQ0tfTUFYX09QRU5fUkVRVUVTVFMgNTAKIAorLyogcmVxdWVzdCBxdWV1ZSBzaXplcyAqLworI2RlZmluZSBJMk9fQkxPQ0tfUkVRX01FTVBPT0xfU0laRQkJMzIKKworI2RlZmluZSBLRVJORUxfU0VDVE9SX1NISUZUIDkKKyNkZWZpbmUgS0VSTkVMX1NFQ1RPUl9TSVpFICgxIDw8IEtFUk5FTF9TRUNUT1JfU0hJRlQpCisKIC8qIEkyTyBCbG9jayBPU00gbWVtcG9vbCBzdHJ1Y3QgKi8KIHN0cnVjdCBpMm9fYmxvY2tfbWVtcG9vbCB7Ci0Ja21lbV9jYWNoZV90CSpzbGFiOwotCW1lbXBvb2xfdAkqcG9vbDsKKwlrbWVtX2NhY2hlX3QgKnNsYWI7CisJbWVtcG9vbF90ICpwb29sOwogfTsKIAogLyogSTJPIEJsb2NrIGRldmljZSBkZXNjcmlwdG9yICovCiBzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSB7CiAJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CS8qIHBvaW50ZXIgdG8gSTJPIGRldmljZSAqLwogCXN0cnVjdCBnZW5kaXNrICpnZDsKLQlzcGlubG9ja190IGxvY2s7CQkvKiBxdWV1ZSBsb2NrICovCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBxdWV1ZSBsb2NrICovCiAJc3RydWN0IGxpc3RfaGVhZCBvcGVuX3F1ZXVlOwkvKiBsaXN0IG9mIHRyYW5zZmVyZWQsIGJ1dCB1bmZpbmlzaGVkCiAJCQkJCSAgIHJlcXVlc3RzICovCiAJdW5zaWduZWQgaW50IG9wZW5fcXVldWVfZGVwdGg7CS8qIG51bWJlciBvZiByZXF1ZXN0cyBpbiB0aGUgcXVldWUgKi8KIAotCWludCByY2FjaGU7CQkJLyogcmVhZCBjYWNoZSBmbGFncyAqLwotCWludCB3Y2FjaGU7CQkJLyogd3JpdGUgY2FjaGUgZmxhZ3MgKi8KKwlpbnQgcmNhY2hlOwkJLyogcmVhZCBjYWNoZSBmbGFncyAqLworCWludCB3Y2FjaGU7CQkvKiB3cml0ZSBjYWNoZSBmbGFncyAqLwogCWludCBmbGFnczsKLQlpbnQgcG93ZXI7CQkJLyogcG93ZXIgc3RhdGUgKi8KLQlpbnQgbWVkaWFfY2hhbmdlX2ZsYWc7CQkvKiBtZWRpYSBjaGFuZ2VkIGZsYWcgKi8KKwl1MTYgcG93ZXI7CQkvKiBwb3dlciBzdGF0ZSAqLworCWludCBtZWRpYV9jaGFuZ2VfZmxhZzsJLyogbWVkaWEgY2hhbmdlZCBmbGFnICovCiB9OwogCiAvKiBJMk8gQmxvY2sgZGV2aWNlIHJlcXVlc3QgKi8KLXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdAoteworc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOwotCXN0cnVjdCByZXF1ZXN0ICpyZXE7CQkvKiBjb3JyZXNwb25kaW5nIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwkvKiBjb3JyZXNwb25kaW5nIHJlcXVlc3QgKi8KIAlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXY7CS8qIEkyTyBibG9jayBkZXZpY2UgKi8KLQlpbnQgc2dfZG1hX2RpcmVjdGlvbjsJCS8qIGRpcmVjdGlvbiBvZiBETUEgYnVmZmVyIHJlYWQvd3JpdGUgKi8KLQlpbnQgc2dfbmVudHM7CQkJLyogbnVtYmVyIG9mIFNHIGVsZW1lbnRzICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnX3RhYmxlW0kyT19NQVhfU0VHTUVOVFNdOyAvKiBTRyB0YWJsZSAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsJLyogZGV2aWNlIHVzZWQgZm9yIERNQSAqLworCWludCBzZ19uZW50czsJCS8qIG51bWJlciBvZiBTRyBlbGVtZW50cyAqLworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ190YWJsZVtJMk9fTUFYX1BIWVNfU0VHTUVOVFNdOwkvKiBTRyB0YWJsZSAqLwogfTsKIAogLyogSTJPIEJsb2NrIGRldmljZSBkZWxheWVkIHJlcXVlc3QgKi8KLXN0cnVjdCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0Ci17CitzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2NvbmZpZy5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKaW5kZXggMWZiNWNkZi4uM2MzYTdhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKQEAgLTMwLDI5ICszMCwxNSBAQAogICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJvLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNkZWZpbmUgT1NNX05BTUUJImNvbmZpZy1vc20iCi0jZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKLSNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gQ29uZmlndXJhdGlvbiBPU00iCisjaW5jbHVkZSAiY29yZS5oIgogCi1leHRlcm4gaW50IGkyb19wYXJtX2lzc3VlKHN0cnVjdCBpMm9fZGV2aWNlICosIGludCwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgaW50KTsKKyNkZWZpbmUgU0dfVEFCTEVTSVpFCQkzMAogCiBzdGF0aWMgaW50IGkyb19jZmdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJIHVuc2lnbmVkIGxvbmcgYXJnKTsKQEAgLTgwLDE1ICs2Niw2IEBACiBzdGF0aWMgc3RydWN0IGkyb19jZmdfaW5mbyAqb3Blbl9maWxlcyA9IE5VTEw7CiBzdGF0aWMgdWxvbmcgaTJvX2NmZ19pbmZvX2lkID0gMDsKIAotLyoKLSAqCUVhY2ggb2YgdGhlc2UgZGVzY3JpYmVzIGFuIGkybyBtZXNzYWdlIGhhbmRsZXIuIFRoZXkgYXJlCi0gKgltdWx0aXBsZXhlZCBieSB0aGUgaTJvX2NvcmUgY29kZQotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fY29uZmlnX2RyaXZlciA9IHsKLQkubmFtZSA9IE9TTV9OQU1FCi19OwotCiBzdGF0aWMgaW50IGkyb19jZmdfZ2V0aW9wcyh1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CkBAIC0zOTEsOSArMzY4LDkgQEAKIAogCWkyb19kbWFfZnJlZSgmYy0+cGRldi0+ZGV2LCAmYnVmZmVyKTsKIAotcmV0dXJuX3JldDoKKyAgICAgIHJldHVybl9yZXQ6CiAJcmV0dXJuIHJldDsKLXJldHVybl9mYXVsdDoKKyAgICAgIHJldHVybl9mYXVsdDoKIAlyZXQgPSAtRUZBVUxUOwogCWdvdG8gcmV0dXJuX3JldDsKIH07CkBAIC01NDAsOCArNTE3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCiAjaWZkZWYgQ09ORklHX0NPTVBBVAotc3RhdGljIGludCBpMm9fY2ZnX3Bhc3N0aHJ1MzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtbmQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBpMm9fY2ZnX3Bhc3N0aHJ1MzIoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtbmQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydTMyIF9fdXNlciAqY21kOwogCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKQEAgLTU1NSw2ICs1MzQsNyBAQAogCXUzMiBzZ19vZmZzZXQgPSAwOwogCXUzMiBzZ19jb3VudCA9IDA7CiAJdTMyIGkgPSAwOworCXUzMiBzZ19pbmRleCA9IDA7CiAJaTJvX3N0YXR1c19ibG9jayAqc2I7CiAJc3RydWN0IGkyb19tZXNzYWdlICptc2c7CiAJdTMyIG07CkBAIC02MzQsOCArNjE0LDggQEAKIAkJaWYgKHNnX2NvdW50ID4gU0dfVEFCTEVTSVpFKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6SU9DVEwgU0cgTGlzdCB0b28gbGFyZ2UgKCV1KVxuIiwKIAkJCSAgICAgICBjLT5uYW1lLCBzZ19jb3VudCk7Ci0JCQlrZnJlZShyZXBseSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJjb2RlID0gLUVJTlZBTDsKKwkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CkBAIC02NTEsNyArNjMxLDcgQEAKIAkJCQlnb3RvIGNsZWFudXA7CiAJCQl9CiAJCQlzZ19zaXplID0gc2dbaV0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOwotCQkJcCA9ICYoc2dfbGlzdFtpXSk7CisJCQlwID0gJihzZ19saXN0W3NnX2luZGV4KytdKTsKIAkJCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRyYW5zZmVyICovCiAJCQlpZiAoaTJvX2RtYV9hbGxvYwogCQkJICAgICgmYy0+cGRldi0+ZGV2LCBwLCBzZ19zaXplLApAQCAtNjYwLDIwICs2NDAsMjEgQEAKIAkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgU0cgYnVmZmVyIC0gc2l6ZSA9ICVkIGJ1ZmZlciBudW1iZXIgJWQgb2YgJWRcbiIsCiAJCQkJICAgICAgIGMtPm5hbWUsIHNnX3NpemUsIGksIHNnX2NvdW50KTsKIAkJCQlyY29kZSA9IC1FTk9NRU07Ci0JCQkJZ290byBjbGVhbnVwOworCQkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQkJfQogCQkJLyogQ29weSBpbiB0aGUgdXNlcidzIFNHIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KIAkJCWlmIChzZ1tpXS4KIAkJCSAgICBmbGFnX2NvdW50ICYgMHgwNDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSICovICkgewogCQkJCS8vIFRPRE8gNjRiaXQgZml4CiAJCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJICAgIChwLT52aXJ0LCAodm9pZCBfX3VzZXIgKikodW5zaWduZWQgbG9uZylzZ1tpXS5hZGRyX2J1cywKLQkJCQkgICAgIHNnX3NpemUpKSB7CisJCQkJICAgIChwLT52aXJ0LAorCQkJCSAgICAgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpc2dbaV0uCisJCQkJICAgICBhZGRyX2J1cywgc2dfc2l6ZSkpIHsKIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgU0cgYnVmICVkIEZST00gdXNlclxuIiwKIAkJCQkJICAgICAgIGMtPm5hbWUsIGkpOwogCQkJCQlyY29kZSA9IC1FRkFVTFQ7Ci0JCQkJCWdvdG8gY2xlYW51cDsKKwkJCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCQkJfQogCQkJfQogCQkJLy9UT0RPIDY0Yml0IGZpeApAQCAtNjgzLDEwICs2NjQsMTAgQEAKIAogCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgNjApOwogCWlmIChyY29kZSkKLQkJZ290byBjbGVhbnVwOworCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAogCWlmIChzZ19vZmZzZXQpIHsKLQkJdTMyIG1zZ1sxMjhdOworCQl1MzIgbXNnW0kyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRV07CiAJCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KIAkJdTMyIGo7CiAJCS8vIFRPRE8gNjRiaXQgZml4CkBAIC02OTQsMTggKzY3NSwxOCBAQAogCQlpbnQgc2dfc2l6ZTsKIAogCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCi0JCW1lbXNldCgmbXNnLCAwLCBNU0dfRlJBTUVfU0laRSAqIDQpOworCQltZW1zZXQoJm1zZywgMCwgSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFICogNCk7CiAJCS8vIGdldCB1c2VyIG1zZyBzaXplIGluIHUzMnMKIAkJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKLQkJCWdvdG8gY2xlYW51cDsKKwkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQl9CiAJCXNpemUgPSBzaXplID4+IDE2OwogCQlzaXplICo9IDQ7CiAJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwogCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKIAkJCXJjb2RlID0gLUVGQVVMVDsKLQkJCWdvdG8gY2xlYW51cDsKKwkJCWdvdG8gc2dfbGlzdF9jbGVhbnVwOwogCQl9CiAJCXNnX2NvdW50ID0KIAkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKQEAgLTcyNyw3ICs3MDgsNyBAQAogCQkJCQkgICAgICAgYy0+bmFtZSwgc2dfbGlzdFtqXS52aXJ0LAogCQkJCQkgICAgICAgc2dbal0uYWRkcl9idXMpOwogCQkJCQlyY29kZSA9IC1FRkFVTFQ7Ci0JCQkJCWdvdG8gY2xlYW51cDsKKwkJCQkJZ290byBzZ19saXN0X2NsZWFudXA7CiAJCQkJfQogCQkJfQogCQl9CkBAIC03NDEsNiArNzIyLDcgQEAKIAkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IG1lc3NhZ2UgY29udGV4dCBGUk9NIHVzZXJcbiIsCiAJCQkgICAgICAgYy0+bmFtZSk7CiAJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQogCQlpZiAoY29weV90b191c2VyKHVzZXJfcmVwbHksIHJlcGx5LCByZXBseV9zaXplKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtNzQ5LDE2ICs3MzEsMjEgQEAKIAkJfQogCX0KIAorICAgICAgc2dfbGlzdF9jbGVhbnVwOgorCWZvciAoaSA9IDA7IGkgPCBzZ19pbmRleDsgaSsrKQorCQlpMm9fZG1hX2ZyZWUoJmMtPnBkZXYtPmRldiwgJnNnX2xpc3RbaV0pOworCiAgICAgICBjbGVhbnVwOgogCWtmcmVlKHJlcGx5KTsKIAlyZXR1cm4gcmNvZGU7CiB9CiAKLXN0YXRpYyBsb25nIGkyb19jZmdfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgaTJvX2NmZ19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaW50IHJldDsKLQlsb2NrX2tlcm5lbCgpOwkJCi0Jc3dpdGNoIChjbWQpIHsgCisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSTJPR0VUSU9QUzoKIAkJcmV0ID0gaTJvX2NmZ19pb2N0bChOVUxMLCBmaWxlLCBjbWQsIGFyZyk7CiAJCWJyZWFrOwpAQCAtODYyLDggKzg0OSw4IEBACiAJCWlmIChzZ19jb3VudCA+IFNHX1RBQkxFU0laRSkgewogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOklPQ1RMIFNHIExpc3QgdG9vIGxhcmdlICgldSlcbiIsCiAJCQkgICAgICAgYy0+bmFtZSwgc2dfY291bnQpOwotCQkJa2ZyZWUocmVwbHkpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyY29kZSA9IC1FSU5WQUw7CisJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgewpAQCAtODc1LDcgKzg2Miw3IEBACiAJCQkJICAgICAgICIlczpCYWQgU0cgZWxlbWVudCAlZCAtIG5vdCBzaW1wbGUgKCV4KVxuIiwKIAkJCQkgICAgICAgYy0+bmFtZSwgaSwgc2dbaV0uZmxhZ19jb3VudCk7CiAJCQkJcmNvZGUgPSAtRUlOVkFMOwotCQkJCWdvdG8gY2xlYW51cDsKKwkJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJCX0KIAkJCXNnX3NpemUgPSBzZ1tpXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CiAJCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc2ZlciAqLwpAQCAtODg1LDcgKzg3Miw3IEBACiAJCQkJICAgICAgICIlczogQ291bGQgbm90IGFsbG9jYXRlIFNHIGJ1ZmZlciAtIHNpemUgPSAlZCBidWZmZXIgbnVtYmVyICVkIG9mICVkXG4iLAogCQkJCSAgICAgICBjLT5uYW1lLCBzZ19zaXplLCBpLCBzZ19jb3VudCk7CiAJCQkJcmNvZGUgPSAtRU5PTUVNOwotCQkJCWdvdG8gY2xlYW51cDsKKwkJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJCX0KIAkJCXNnX2xpc3Rbc2dfaW5kZXgrK10gPSBwOwkvLyBzZ2xpc3QgaW5kZXhlZCB3aXRoIGlucHV0IGZyYW1lLCBub3Qgb3VyIGludGVybmFsIGZyYW1lLgogCQkJLyogQ29weSBpbiB0aGUgdXNlcidzIFNHIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KQEAgLTg5OSw3ICs4ODYsNyBAQAogCQkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBTRyBidWYgJWQgRlJPTSB1c2VyXG4iLAogCQkJCQkgICAgICAgYy0+bmFtZSwgaSk7CiAJCQkJCXJjb2RlID0gLUVGQVVMVDsKLQkJCQkJZ290byBjbGVhbnVwOworCQkJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJCQl9CiAJCQl9CiAJCQkvL1RPRE8gNjRiaXQgZml4CkBAIC05MDksNyArODk2LDcgQEAKIAogCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgNjApOwogCWlmIChyY29kZSkKLQkJZ290byBjbGVhbnVwOworCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAogCWlmIChzZ19vZmZzZXQpIHsKIAkJdTMyIG1zZ1sxMjhdOwpAQCAtOTIwLDE4ICs5MDcsMTggQEAKIAkJaW50IHNnX3NpemU7CiAKIAkJLy8gcmUtYWNxdWlyZSB0aGUgb3JpZ2luYWwgbWVzc2FnZSB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSBzZyBjb3B5IG9wZXJhdGlvbgotCQltZW1zZXQoJm1zZywgMCwgTVNHX0ZSQU1FX1NJWkUgKiA0KTsKKwkJbWVtc2V0KCZtc2csIDAsIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIDQpOwogCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzCiAJCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNsZWFudXA7CisJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQogCQlzaXplID0gc2l6ZSA+PiAxNjsKIAkJc2l6ZSAqPSA0OwogCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KIAkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CiAJCQlyY29kZSA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNsZWFudXA7CisJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJfQogCQlzZ19jb3VudCA9CiAJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CkBAIC05NTMsNyArOTQwLDcgQEAKIAkJCQkJICAgICAgIGMtPm5hbWUsIHNnX2xpc3Rbal0sCiAJCQkJCSAgICAgICBzZ1tqXS5hZGRyX2J1cyk7CiAJCQkJCXJjb2RlID0gLUVGQVVMVDsKLQkJCQkJZ290byBjbGVhbnVwOworCQkJCQlnb3RvIHNnX2xpc3RfY2xlYW51cDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTk3NSwxMCArOTYyLDE1IEBACiAJCX0KIAl9CiAKKyAgICAgIHNnX2xpc3RfY2xlYW51cDoKKwlmb3IgKGkgPSAwOyBpIDwgc2dfaW5kZXg7IGkrKykKKwkJa2ZyZWUoc2dfbGlzdFtpXSk7CisKICAgICAgIGNsZWFudXA6CiAJa2ZyZWUocmVwbHkpOwogCXJldHVybiByY29kZTsKIH0KKyNlbmRpZgogCiAvKgogICogSU9DVEwgSGFuZGxlcgpAQCAtMTAzMyw5ICsxMDI1LDExIEBACiAJCXJldCA9IGkyb19jZmdfZXZ0X2dldChhcmcsIGZwKTsKIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDCiAJY2FzZSBJMk9QQVNTVEhSVToKIAkJcmV0ID0gaTJvX2NmZ19wYXNzdGhydShhcmcpOwogCQlicmVhazsKKyNlbmRpZgogCiAJZGVmYXVsdDoKIAkJb3NtX2RlYnVnKCJ1bmtub3duIGlvY3RsIGNhbGxlZCFcbiIpOwpAQCAtMTEzNywzNyArMTEzMSwyMSBAQAogCSZjb25maWdfZm9wcwogfTsKIAotc3RhdGljIGludCBfX2luaXQgaTJvX2NvbmZpZ19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpMm9fY29uZmlnX29sZF9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKLQogCXNwaW5fbG9ja19pbml0KCZpMm9fY29uZmlnX2xvY2spOwogCiAJaWYgKG1pc2NfcmVnaXN0ZXIoJmkyb19taXNjZGV2KSA8IDApIHsKIAkJb3NtX2VycigiY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCS8qCi0JICogICAgICBJbnN0YWxsIG91ciBoYW5kbGVyCi0JICovCi0JaWYgKGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19jb25maWdfZHJpdmVyKSkgewotCQlvc21fZXJyKCJoYW5kbGVyIHJlZ2lzdGVyIGZhaWxlZC5cbiIpOwotCQltaXNjX2RlcmVnaXN0ZXIoJmkyb19taXNjZGV2KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaTJvX2NvbmZpZ19leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBpMm9fY29uZmlnX29sZF9leGl0KHZvaWQpCiB7CiAJbWlzY19kZXJlZ2lzdGVyKCZpMm9fbWlzY2Rldik7Ci0JaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fY29uZmlnX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9BVVRIT1IoIlJlZCBIYXQgU29mdHdhcmUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTihPU01fREVTQ1JJUFRJT04pOwotTU9EVUxFX1ZFUlNJT04oT1NNX1ZFUlNJT04pOwotCi1tb2R1bGVfaW5pdChpMm9fY29uZmlnX2luaXQpOwotbW9kdWxlX2V4aXQoaTJvX2NvbmZpZ19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYwppbmRleCBiMTc2ZDBlLi5kNTU5YTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fcHJvYy5jCkBAIC0yOCw3ICsyOCw3IEBACiAgKi8KIAogI2RlZmluZSBPU01fTkFNRQkicHJvYy1vc20iCi0jZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKKyNkZWZpbmUgT1NNX1ZFUlNJT04JIjEuMTQ1IgogI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTyBQcm9jRlMgT1NNIgogCiAjZGVmaW5lIEkyT19NQVhfTU9EVUxFUyA0CkBAIC0yMjgsNyArMjI4LDcgQEAKIAljYXNlIEkyT19DTEFTU19GTE9QUFlfREVWSUNFOgogCQlpZHggPSAxMjsKIAkJYnJlYWs7Ci0JY2FzZSBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVDoKKwljYXNlIEkyT19DTEFTU19CVVNfQURBUFRFUjoKIAkJaWR4ID0gMTM7CiAJCWJyZWFrOwogCWNhc2UgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUX0FHRU5UOgpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCQkJc2VxX3ByaW50ZihzZXEsICIsIFVua25vd24gRGV2aWNlIFR5cGUiKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQ6CisJCWNhc2UgSTJPX0NMQVNTX0JVU19BREFQVEVSOgogCQkJaWYgKGxjdC0+bGN0X2VudHJ5W2ldLnN1Yl9jbGFzcyA8IEJVU19UQUJMRV9TSVpFKQogCQkJCXNlcV9wcmludGYoc2VxLCAiLCAlcyIsCiAJCQkJCSAgIGJ1c19wb3J0c1tsY3QtPmxjdF9lbnRyeVtpXS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYwppbmRleCA0M2Y1ODc1Li45ZjE3NDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19zY3NpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCkBAIC01NCw2ICs1NCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KIAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC02NCwxOSArNjUsMjMgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9yZXF1ZXN0Lmg+CisjaW5jbHVkZSA8c2NzaS9zZy5oPgorI2luY2x1ZGUgPHNjc2kvc2dfcmVxdWVzdC5oPgogCiAjZGVmaW5lIE9TTV9OQU1FCSJzY3NpLW9zbSIKLSNkZWZpbmUgT1NNX1ZFUlNJT04JIiRSZXYkIgorI2RlZmluZSBPU01fVkVSU0lPTgkiMS4yODIiCiAjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPIFNDU0kgUGVyaXBoZXJhbCBPU00iCiAKIHN0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fc2NzaV9kcml2ZXI7CiAKLXN0YXRpYyBpbnQgaTJvX3Njc2lfbWF4X2lkID0gMTY7Ci1zdGF0aWMgaW50IGkyb19zY3NpX21heF9sdW4gPSA4Oworc3RhdGljIHVuc2lnbmVkIGludCBpMm9fc2NzaV9tYXhfaWQgPSAxNjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTJvX3Njc2lfbWF4X2x1biA9IDI1NTsKIAogc3RydWN0IGkyb19zY3NpX2hvc3QgewogCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsJLyogcG9pbnRlciB0byB0aGUgU0NTSSBob3N0ICovCiAJc3RydWN0IGkyb19jb250cm9sbGVyICppb3A7CS8qIHBvaW50ZXIgdG8gdGhlIEkyTyBjb250cm9sbGVyICovCisJdW5zaWduZWQgaW50IGx1bjsJLyogbHVuJ3MgdXNlZCBmb3IgYmxvY2sgZGV2aWNlcyAqLwogCXN0cnVjdCBpMm9fZGV2aWNlICpjaGFubmVsWzBdOwkvKiBjaGFubmVsLT5pMm9fZGV2IG1hcHBpbmcgdGFibGUgKi8KIH07CiAKQEAgLTk5LDExICsxMDQsMTcgQEAKIAl1OCB0eXBlOwogCWludCBpOwogCXNpemVfdCBzaXplOwotCWkyb19zdGF0dXNfYmxvY2sgKnNiOworCXUxNiBib2R5X3NpemUgPSA2OworCisjaWZkZWYgQ09ORklHX0kyT19FWFRfQURBUFRFQworCWlmIChjLT5hZGFwdGVjKQorCQlib2R5X3NpemUgPSA4OworI2VuZGlmCiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGkyb19kZXYsICZjLT5kZXZpY2VzLCBsaXN0KQotCSAgICBpZiAoaTJvX2Rldi0+bGN0X2RhdGEuY2xhc3NfaWQgPT0gSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQpIHsKLQkJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDAsICZ0eXBlLCAxKSB8fCAodHlwZSA9PSAxKSkJLyogU0NTSSBidXMgKi8KKwkgICAgaWYgKGkyb19kZXYtPmxjdF9kYXRhLmNsYXNzX2lkID09IEkyT19DTEFTU19CVVNfQURBUFRFUikgeworCQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMCwgJnR5cGUsIDEpCisJCSAgICAmJiAodHlwZSA9PSAweDAxKSkJLyogU0NTSSBidXMgKi8KIAkJCW1heF9jaGFubmVsKys7CiAJfQogCkBAIC0xMjUsMjAgKzEzNiwxOCBAQAogCXNjc2lfaG9zdC0+bWF4X2lkID0gaTJvX3Njc2lfbWF4X2lkOwogCXNjc2lfaG9zdC0+bWF4X2x1biA9IGkyb19zY3NpX21heF9sdW47CiAJc2NzaV9ob3N0LT50aGlzX2lkID0gYy0+dW5pdDsKLQotCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7Ci0KLQlzY3NpX2hvc3QtPnNnX3RhYmxlc2l6ZSA9IChzYi0+aW5ib3VuZF9mcmFtZV9zaXplIC0KLQkJCQkgICBzaXplb2Yoc3RydWN0IGkyb19tZXNzYWdlKSAvIDQgLSA2KSAvIDI7CisJc2NzaV9ob3N0LT5zZ190YWJsZXNpemUgPSBpMm9fc2dfdGFibGVzaXplKGMsIGJvZHlfc2l6ZSk7CiAKIAlpMm9fc2hvc3QgPSAoc3RydWN0IGkyb19zY3NpX2hvc3QgKilzY3NpX2hvc3QtPmhvc3RkYXRhOwogCWkyb19zaG9zdC0+c2NzaV9ob3N0ID0gc2NzaV9ob3N0OwogCWkyb19zaG9zdC0+aW9wID0gYzsKKwlpMm9fc2hvc3QtPmx1biA9IDE7CiAKIAlpID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGkyb19kZXYsICZjLT5kZXZpY2VzLCBsaXN0KQotCSAgICBpZiAoaTJvX2Rldi0+bGN0X2RhdGEuY2xhc3NfaWQgPT0gSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQpIHsKLQkJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDAsICZ0eXBlLCAxKSB8fCAodHlwZSA9PSAxKSkJLyogb25seSBTQ1NJIGJ1cyAqLworCSAgICBpZiAoaTJvX2Rldi0+bGN0X2RhdGEuY2xhc3NfaWQgPT0gSTJPX0NMQVNTX0JVU19BREFQVEVSKSB7CisJCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDAwLCAwLCAmdHlwZSwgMSkKKwkJICAgICYmICh0eXBlID09IDB4MDEpKQkvKiBvbmx5IFNDU0kgYnVzICovCiAJCQlpMm9fc2hvc3QtPmNoYW5uZWxbaSsrXSA9IGkyb19kZXY7CiAKIAkJaWYgKGkgPj0gbWF4X2NoYW5uZWwpCkBAIC0xNzgsMTAgKzE4NywxMyBAQAogCXN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2hvc3Q7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpX2RldjsKIAorCW9zbV9pbmZvKCJkZXZpY2UgcmVtb3ZlZCAoVElEOiAlMDN4KVxuIiwgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwogCWkyb19zaG9zdCA9IGkyb19zY3NpX2dldF9ob3N0KGMpOwogCiAJc2hvc3RfZm9yX2VhY2hfZGV2aWNlKHNjc2lfZGV2LCBpMm9fc2hvc3QtPnNjc2lfaG9zdCkKIAkgICAgaWYgKHNjc2lfZGV2LT5ob3N0ZGF0YSA9PSBpMm9fZGV2KSB7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZpMm9fZGV2LT5kZXZpY2Uua29iaiwgInNjc2kiKTsKIAkJc2NzaV9yZW1vdmVfZGV2aWNlKHNjc2lfZGV2KTsKIAkJc2NzaV9kZXZpY2VfcHV0KHNjc2lfZGV2KTsKIAkJYnJlYWs7CkBAIC0yMDcsOCArMjE5LDggQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3Q7CiAJc3RydWN0IGkyb19kZXZpY2UgKnBhcmVudDsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2OwotCXUzMiBpZDsKLQl1NjQgbHVuOworCXUzMiBpZCA9IC0xOworCXU2NCBsdW4gPSAtMTsKIAlpbnQgY2hhbm5lbCA9IC0xOwogCWludCBpOwogCkBAIC0yMTgsNTEgKzIzMCw4MyBAQAogCiAJc2NzaV9ob3N0ID0gaTJvX3Nob3N0LT5zY3NpX2hvc3Q7CiAKLQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDAsIDMsICZpZCwgNCkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlzd2l0Y2ggKGkyb19kZXYtPmxjdF9kYXRhLmNsYXNzX2lkKSB7CisJY2FzZSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0U6CisJY2FzZSBJMk9fQ0xBU1NfRVhFQ1VUSVZFOgorI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKKwkJaWYgKGMtPmFkYXB0ZWMpIHsKKwkJCXU4IHR5cGU7CisJCQlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IGkyb19zaG9zdC0+Y2hhbm5lbFswXTsKIAotCWlmIChpZCA+PSBzY3NpX2hvc3QtPm1heF9pZCkgewotCQlvc21fd2FybigiU0NTSSBkZXZpY2UgaWQgKCVkKSA+PSBtYXhfaWQgb2YgSTJPIGhvc3QgKCVkKSIsIGlkLAotCQkJIHNjc2lfaG9zdC0+bWF4X2lkKTsKKwkJCWlmIChpMm9fcGFybV9maWVsZF9nZXQoZCwgMHgwMDAwLCAwLCAmdHlwZSwgMSkKKwkJCSAgICAmJiAodHlwZSA9PSAweDAxKSkJLyogU0NTSSBidXMgKi8KKwkJCQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGQsIDB4MDIwMCwgNCwgJmlkLCA0KSkgeworCQkJCQljaGFubmVsID0gMDsKKwkJCQkJaWYgKGkyb19kZXYtPmxjdF9kYXRhLmNsYXNzX2lkID09CisJCQkJCSAgICBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0UpCisJCQkJCQlsdW4gPSBpMm9fc2hvc3QtPmx1bisrOworCQkJCQllbHNlCisJCQkJCQlsdW4gPSAwOworCQkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMOgorCQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMywgJmlkLCA0KSA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgNCwgJmx1biwgOCkgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcGFyZW50ID0gaTJvX2lvcF9maW5kX2RldmljZShjLCBpMm9fZGV2LT5sY3RfZGF0YS5wYXJlbnRfdGlkKTsKKwkJaWYgKCFwYXJlbnQpIHsKKwkJCW9zbV93YXJuKCJjYW4gbm90IGZpbmQgcGFyZW50IG9mIGRldmljZSAlMDN4XG4iLAorCQkJCSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDw9IGkyb19zaG9zdC0+c2NzaV9ob3N0LT5tYXhfY2hhbm5lbDsgaSsrKQorCQkJaWYgKGkyb19zaG9zdC0+Y2hhbm5lbFtpXSA9PSBwYXJlbnQpCisJCQkJY2hhbm5lbCA9IGk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAwLCA0LCAmbHVuLCA4KSA8IDApCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChsdW4gPj0gc2NzaV9ob3N0LT5tYXhfbHVuKSB7Ci0JCW9zbV93YXJuKCJTQ1NJIGRldmljZSBpZCAoJWQpID49IG1heF9sdW4gb2YgSTJPIGhvc3QgKCVkKSIsCi0JCQkgKHVuc2lnbmVkIGludClsdW4sIHNjc2lfaG9zdC0+bWF4X2x1bik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCXBhcmVudCA9IGkyb19pb3BfZmluZF9kZXZpY2UoYywgaTJvX2Rldi0+bGN0X2RhdGEucGFyZW50X3RpZCk7Ci0JaWYgKCFwYXJlbnQpIHsKLQkJb3NtX3dhcm4oImNhbiBub3QgZmluZCBwYXJlbnQgb2YgZGV2aWNlICUwM3hcbiIsCi0JCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8PSBpMm9fc2hvc3QtPnNjc2lfaG9zdC0+bWF4X2NoYW5uZWw7IGkrKykKLQkJaWYgKGkyb19zaG9zdC0+Y2hhbm5lbFtpXSA9PSBwYXJlbnQpCi0JCQljaGFubmVsID0gaTsKLQogCWlmIChjaGFubmVsID09IC0xKSB7CiAJCW9zbV93YXJuKCJjYW4gbm90IGZpbmQgY2hhbm5lbCBvZiBkZXZpY2UgJTAzeFxuIiwKIAkJCSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKLQlzY3NpX2RldiA9Ci0JICAgIF9fc2NzaV9hZGRfZGV2aWNlKGkyb19zaG9zdC0+c2NzaV9ob3N0LCBjaGFubmVsLCBpZCwgbHVuLCBpMm9fZGV2KTsKLQotCWlmICghc2NzaV9kZXYpIHsKLQkJb3NtX3dhcm4oImNhbiBub3QgYWRkIFNDU0kgZGV2aWNlICUwM3hcbiIsCi0JCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwlpZiAoaWQgPj0gc2NzaV9ob3N0LT5tYXhfaWQpIHsKKwkJb3NtX3dhcm4oIlNDU0kgZGV2aWNlIGlkICglZCkgPj0gbWF4X2lkIG9mIEkyTyBob3N0ICglZCkiLCBpZCwKKwkJCSBzY3NpX2hvc3QtPm1heF9pZCk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCW9zbV9kZWJ1ZygiYWRkZWQgbmV3IFNDU0kgZGV2aWNlICUwM3ggKGNhbm5lbDogJWQsIGlkOiAlZCwgbHVuOiAlZClcbiIsCi0JCSAgaTJvX2Rldi0+bGN0X2RhdGEudGlkLCBjaGFubmVsLCBpZCwgKHVuc2lnbmVkIGludClsdW4pOworCWlmIChsdW4gPj0gc2NzaV9ob3N0LT5tYXhfbHVuKSB7CisJCW9zbV93YXJuKCJTQ1NJIGRldmljZSBpZCAoJWQpID49IG1heF9sdW4gb2YgSTJPIGhvc3QgKCVkKSIsCisJCQkgKHVuc2lnbmVkIGludClsdW4sIHNjc2lfaG9zdC0+bWF4X2x1bik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNjc2lfZGV2ID0KKwkgICAgX19zY3NpX2FkZF9kZXZpY2UoaTJvX3Nob3N0LT5zY3NpX2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIGkyb19kZXYpOworCisJaWYgKElTX0VSUihzY3NpX2RldikpIHsKKwkJb3NtX3dhcm4oImNhbiBub3QgYWRkIFNDU0kgZGV2aWNlICUwM3hcbiIsCisJCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2NzaV9kZXYpOworCX0KKworCXN5c2ZzX2NyZWF0ZV9saW5rKCZpMm9fZGV2LT5kZXZpY2Uua29iaiwgJnNjc2lfZGV2LT5zZGV2X2dlbmRldi5rb2JqLAorCQkJICAic2NzaSIpOworCisJb3NtX2luZm8oImRldmljZSBhZGRlZCAoVElEOiAlMDN4KSBjaGFubmVsOiAlZCwgaWQ6ICVkLCBsdW46ICVkXG4iLAorCQkgaTJvX2Rldi0+bGN0X2RhdGEudGlkLCBjaGFubmVsLCBpZCwgKHVuc2lnbmVkIGludClsdW4pOwogCiAJcmV0dXJuIDA7CiB9OwpAQCAtMjkzLDE2NSArMzM3LDkyIEBACiAJCQkgIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwl1MzIgZXJyb3I7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXU4IGFzLCBkcywgc3Q7CiAKIAljbWQgPSBpMm9fY250eHRfbGlzdF9nZXQoYywgbGUzMl90b19jcHUobXNnLT51LnMudGNudHh0KSk7Ci0KLQlpZiAobXNnLT51LmhlYWRbMF0gJiAoMSA8PCAxMykpIHsKLQkJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKnBtc2c7CS8qIHByZXNlcnZlZCBtZXNzYWdlICovCi0JCXUzMiBwbTsKLQkJaW50IGVyciA9IERJRF9FUlJPUjsKLQotCQlwbSA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVszXSk7Ci0KLQkJcG1zZyA9IGkyb19tc2dfaW5fdG9fdmlydChjLCBwbSk7Ci0KLQkJb3NtX2VycigiSU9QIGZhaWwuXG4iKTsKLQkJb3NtX2VycigiRnJvbSAlZCBUbyAlZCBDbWQgJWQuXG4iLAotCQkJKG1zZy0+dS5oZWFkWzFdID4+IDEyKSAmIDB4RkZGLAotCQkJbXNnLT51LmhlYWRbMV0gJiAweEZGRiwgbXNnLT51LmhlYWRbMV0gPj4gMjQpOwotCQlvc21fZXJyKCJGYWlsdXJlIENvZGUgJWQuXG4iLCBtc2ctPmJvZHlbMF0gPj4gMjQpOwotCQlpZiAobXNnLT5ib2R5WzBdICYgKDEgPDwgMTYpKQotCQkJb3NtX2VycigiRm9ybWF0IGVycm9yLlxuIik7Ci0JCWlmIChtc2ctPmJvZHlbMF0gJiAoMSA8PCAxNykpCi0JCQlvc21fZXJyKCJQYXRoIGVycm9yLlxuIik7Ci0JCWlmIChtc2ctPmJvZHlbMF0gJiAoMSA8PCAxOCkpCi0JCQlvc21fZXJyKCJQYXRoIFN0YXRlLlxuIik7Ci0JCWlmIChtc2ctPmJvZHlbMF0gJiAoMSA8PCAxOCkpCi0JCXsKLQkJCW9zbV9lcnIoIkNvbmdlc3Rpb24uXG4iKTsKLQkJCWVyciA9IERJRF9CVVNfQlVTWTsKLQkJfQotCi0JCW9zbV9kZWJ1ZygiRmFpbGluZyBtZXNzYWdlIGlzICVwLlxuIiwgcG1zZyk7Ci0KLQkJY21kID0gaTJvX2NudHh0X2xpc3RfZ2V0KGMsIHJlYWRsKCZwbXNnLT51LnMudGNudHh0KSk7Ci0JCWlmICghY21kKQotCQkJcmV0dXJuIDE7Ci0KLQkJY21kLT5yZXN1bHQgPSBlcnIgPDwgMTY7Ci0JCWNtZC0+c2NzaV9kb25lKGNtZCk7Ci0KLQkJLyogTm93IGZsdXNoIHRoZSBtZXNzYWdlIGJ5IG1ha2luZyBpdCBhIE5PUCAqLwotCQlpMm9fbXNnX25vcChjLCBwbSk7Ci0KLQkJcmV0dXJuIDE7CisJaWYgKHVubGlrZWx5KCFjbWQpKSB7CisJCW9zbV9lcnIoIk5VTEwgcmVwbHkgcmVjZWl2ZWQhXG4iKTsKKwkJcmV0dXJuIC0xOwogCX0KIAogCS8qCiAJICogICAgICBMb3cgYnl0ZSBpcyBkZXZpY2Ugc3RhdHVzLCBuZXh0IGlzIGFkYXB0ZXIgc3RhdHVzLAogCSAqICAgICAgKHRoZW4gb25lIGJ5dGUgcmVzZXJ2ZWQpLCB0aGVuIHJlcXVlc3Qgc3RhdHVzLgogCSAqLwotCWRzID0gKHU4KSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pOwotCWFzID0gKHU4KSAobGUzMl90b19jcHUobXNnLT5ib2R5WzBdKSA+PiA4KTsKLQlzdCA9ICh1OCkgKGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgPj4gMjQpOwotCi0JLyoKLQkgKiAgICAgIElzIHRoaXMgYSBjb250cm9sIHJlcXVlc3QgY29taW5nIGJhY2sgLSBlZyBhbiBhYm9ydCA/Ci0JICovCi0KLQlpZiAoIWNtZCkgewotCQlpZiAoc3QpCi0JCQlvc21fd2FybigiU0NTSSBhYm9ydDogJTA4WCIsIGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkpOwotCQlvc21faW5mbygiU0NTSSBhYm9ydCBjb21wbGV0ZWQuXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCWVycm9yID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzBdKTsKIAogCW9zbV9kZWJ1ZygiQ29tcGxldGVkICVsZFxuIiwgY21kLT5zZXJpYWxfbnVtYmVyKTsKIAotCWlmIChzdCkgewotCQl1MzIgY291bnQsIGVycm9yOwotCQkvKiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8KKwljbWQtPnJlc3VsdCA9IGVycm9yICYgMHhmZjsKKwkvKgorCSAqIGlmIERldmljZVN0YXR1cyBpcyBub3QgU0NTSV9TVUNDRVNTIGNvcHkgb3ZlciB0aGUgc2Vuc2UgZGF0YSBhbmQgbGV0CisJICogdGhlIFNDU0kgbGF5ZXIgaGFuZGxlIHRoZSBlcnJvcgorCSAqLworCWlmIChjbWQtPnJlc3VsdCkKKwkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCAmbXNnLT5ib2R5WzNdLAorCQkgICAgICAgbWluKHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlciksIChzaXplX3QpIDQwKSk7CiAKLQkJc3dpdGNoIChzdCkgewotCQljYXNlIDB4MDY6Ci0JCQljb3VudCA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVsxXSk7Ci0JCQlpZiAoY291bnQgPCBjbWQtPnVuZGVyZmxvdykgewotCQkJCWludCBpOwotCi0JCQkJb3NtX2VycigiU0NTSSB1bmRlcmZsb3cgMHglMDhYIDB4JTA4WFxuIiwgY291bnQsCi0JCQkJCWNtZC0+dW5kZXJmbG93KTsKLQkJCQlvc21fZGVidWcoIkNtZDogIik7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCi0JCQkJCXByX2RlYnVnKCIlMDJYICIsIGNtZC0+Y21uZFtpXSk7Ci0JCQkJcHJfZGVidWcoIi5cbiIpOwotCQkJCWNtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZXJyb3IgPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pOwotCi0JCQlvc21fZXJyKCJTQ1NJIGVycm9yICUwOHhcbiIsIGVycm9yKTsKLQotCQkJaWYgKChlcnJvciAmIDB4ZmYpID09IDB4MDIgLypDSEVDS19DT05ESVRJT04gKi8gKSB7Ci0JCQkJaW50IGk7Ci0JCQkJdTMyIGxlbiA9IHNpemVvZihjbWQtPnNlbnNlX2J1ZmZlcik7Ci0JCQkJbGVuID0gKGxlbiA+IDQwKSA/IDQwIDogbGVuOwotCQkJCS8vIENvcHkgb3ZlciB0aGUgc2Vuc2UgZGF0YQotCQkJCW1lbWNweShjbWQtPnNlbnNlX2J1ZmZlciwgKHZvaWQgKikmbXNnLT5ib2R5WzNdLAotCQkJCSAgICAgICBsZW4pOwotCQkJCWZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspCi0JCQkJCW9zbV9pbmZvKCIlMDJ4XG4iLAotCQkJCQkJIGNtZC0+c2Vuc2VfYnVmZmVyW2ldKTsKLQkJCQlpZiAoY21kLT5zZW5zZV9idWZmZXJbMF0gPT0gMHg3MAotCQkJCSAgICAmJiBjbWQtPnNlbnNlX2J1ZmZlclsyXSA9PSBEQVRBX1BST1RFQ1QpIHsKLQkJCQkJLyogVGhpcyBpcyB0byBoYW5kbGUgYW4gYXJyYXkgZmFpbGVkICovCi0JCQkJCWNtZC0+cmVzdWx0ID0gKERJRF9USU1FX09VVCA8PCAxNik7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTQ1NJIERhdGEgIgotCQkJCQkgICAgICAgIlByb3RlY3QtRGV2aWNlICglZCwlZCwlZCkgIgotCQkJCQkgICAgICAgImhiYV9zdGF0dXM9MHgleCwgZGV2X3N0YXR1cz0iCi0JCQkJCSAgICAgICAiMHgleCwgY21kPTB4JXhcbiIsIGMtPm5hbWUsCi0JCQkJCSAgICAgICAodTMyKSBjbWQtPmRldmljZS0+Y2hhbm5lbCwKLQkJCQkJICAgICAgICh1MzIpIGNtZC0+ZGV2aWNlLT5pZCwKLQkJCQkJICAgICAgICh1MzIpIGNtZC0+ZGV2aWNlLT5sdW4sCi0JCQkJCSAgICAgICAoZXJyb3IgPj4gOCkgJiAweGZmLAotCQkJCQkgICAgICAgZXJyb3IgJiAweGZmLCBjbWQtPmNtbmRbMF0pOwotCQkJCX0gZWxzZQotCQkJCQljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXN3aXRjaCAoYXMpIHsKLQkJCWNhc2UgMHgwRToKLQkJCQkvKiBTQ1NJIFJlc2V0ICovCi0JCQkJY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMHgwRjoKLQkJCQljbWQtPnJlc3VsdCA9IERJRF9QQVJJVFkgPDwgMTY7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJY21kLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJY21kLT5zY3NpX2RvbmUoY21kKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JY21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTYgfCBkczsKLQotCWNtZC0+c2NzaV9kb25lKGNtZCk7CisJLyogb25seSBvdXRwdXQgZXJyb3IgY29kZSBpZiBBZGFwdGVyU3RhdHVzIGlzIG5vdCBIQkFfU1VDQ0VTUyAqLworCWlmICgoZXJyb3IgPj4gOCkgJiAweGZmKQorCQlvc21fZXJyKCJTQ1NJIGVycm9yICUwOHhcbiIsIGVycm9yKTsKIAogCWRldiA9ICZjLT5wZGV2LT5kZXY7CiAJaWYgKGNtZC0+dXNlX3NnKQotCQlkbWFfdW5tYXBfc2coZGV2LCAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5idWZmZXIsCi0JCQkgICAgIGNtZC0+dXNlX3NnLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQllbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikKLQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIChkbWFfYWRkcl90KSAoKGxvbmcpY21kLT5TQ3AucHRyKSwKLQkJCQkgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlkbWFfdW5tYXBfc2coZGV2LCBjbWQtPnJlcXVlc3RfYnVmZmVyLCBjbWQtPnVzZV9zZywKKwkJCSAgICAgY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJZWxzZSBpZiAoY21kLT5TQ3AuZG1hX2hhbmRsZSkKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGNtZC0+U0NwLmRtYV9oYW5kbGUsIGNtZC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCSBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKworCWNtZC0+c2NzaV9kb25lKGNtZCk7CiAKIAlyZXR1cm4gMTsKIH07CiAKIC8qKgorICoJaTJvX3Njc2lfbm90aWZ5X2RldmljZV9hZGQgLSBSZXRyaWV2ZSBub3RpZmljYXRpb25zIG9mIGFkZGVkIGRldmljZXMKKyAqCUBpMm9fZGV2OiB0aGUgSTJPIGRldmljZSB3aGljaCB3YXMgYWRkZWQKKyAqCisgKglJZiBhIEkyTyBkZXZpY2UgaXMgYWRkZWQgd2UgY2F0Y2ggdGhlIG5vdGlmaWNhdGlvbiwgYmVjYXVzZSBJMk8gY2xhc3NlcworICoJb3RoZXIgdGhlbiBTQ1NJIHBlcmlwaGVyYWwgd2lsbCBub3QgYmUgcmVjZWl2ZWQgdGhyb3VnaAorICoJaTJvX3Njc2lfcHJvYmUoKS4KKyAqLworc3RhdGljIHZvaWQgaTJvX3Njc2lfbm90aWZ5X2RldmljZV9hZGQoc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYpCit7CisJc3dpdGNoIChpMm9fZGV2LT5sY3RfZGF0YS5jbGFzc19pZCkgeworCWNhc2UgSTJPX0NMQVNTX0VYRUNVVElWRToKKwljYXNlIEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRToKKwkJaTJvX3Njc2lfcHJvYmUoJmkyb19kZXYtPmRldmljZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfTsKKworLyoqCisgKglpMm9fc2NzaV9ub3RpZnlfZGV2aWNlX3JlbW92ZSAtIFJldHJpZXZlIG5vdGlmaWNhdGlvbnMgb2YgcmVtb3ZlZAorICoJCQkJICAgICAgICBkZXZpY2VzCisgKglAaTJvX2RldjogdGhlIEkyTyBkZXZpY2Ugd2hpY2ggd2FzIHJlbW92ZWQKKyAqCisgKglJZiBhIEkyTyBkZXZpY2UgaXMgcmVtb3ZlZCwgd2UgY2F0Y2ggdGhlIG5vdGlmaWNhdGlvbiB0byByZW1vdmUgdGhlCisgKgljb3JyZXNwb25kaW5nIFNDU0kgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBpMm9fc2NzaV9ub3RpZnlfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldikKK3sKKwlzd2l0Y2ggKGkyb19kZXYtPmxjdF9kYXRhLmNsYXNzX2lkKSB7CisJY2FzZSBJMk9fQ0xBU1NfRVhFQ1VUSVZFOgorCWNhc2UgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFOgorCQlpMm9fc2NzaV9yZW1vdmUoJmkyb19kZXYtPmRldmljZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfTsKKworLyoqCiAgKglpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9hZGQgLSBSZXRyaWV2ZSBub3RpZmljYXRpb25zIG9mIGFkZGVkCiAgKgkJCQkJIGNvbnRyb2xsZXJzCiAgKglAYzogdGhlIGNvbnRyb2xsZXIgd2hpY2ggd2FzIGFkZGVkCkBAIC01MDEsNyArNDcyLDcgQEAKIAogCXNjc2lfcmVtb3ZlX2hvc3QoaTJvX3Nob3N0LT5zY3NpX2hvc3QpOwogCXNjc2lfaG9zdF9wdXQoaTJvX3Nob3N0LT5zY3NpX2hvc3QpOwotCXByX2luZm8oIkkyTyBTQ1NJIGhvc3QgcmVtb3ZlZFxuIik7CisJb3NtX2RlYnVnKCJJMk8gU0NTSSBob3N0IHJlbW92ZWRcbiIpOwogfTsKIAogLyogU0NTSSBPU00gZHJpdmVyIHN0cnVjdCAqLwpAQCAtNTA5LDYgKzQ4MCw4IEBACiAJLm5hbWUgPSBPU01fTkFNRSwKIAkucmVwbHkgPSBpMm9fc2NzaV9yZXBseSwKIAkuY2xhc3NlcyA9IGkyb19zY3NpX2NsYXNzX2lkLAorCS5ub3RpZnlfZGV2aWNlX2FkZCA9IGkyb19zY3NpX25vdGlmeV9kZXZpY2VfYWRkLAorCS5ub3RpZnlfZGV2aWNlX3JlbW92ZSA9IGkyb19zY3NpX25vdGlmeV9kZXZpY2VfcmVtb3ZlLAogCS5ub3RpZnlfY29udHJvbGxlcl9hZGQgPSBpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9hZGQsCiAJLm5vdGlmeV9jb250cm9sbGVyX3JlbW92ZSA9IGkyb19zY3NpX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZSwKIAkuZHJpdmVyID0gewpAQCAtNTM1LDI2ICs1MDgsMjYgQEAKIAkJCQkgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgdGlkOwogCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CiAJdTMyIG07Ci0JdTMyIHNjc2lfZmxhZ3MsIHNnX2ZsYWdzOworCS8qCisJICogRU5BQkxFX0RJU0NPTk5FQ1QKKwkgKiBTSU1QTEVfVEFHCisJICogUkVUVVJOX1NFTlNFX0RBVEFfSU5fUkVQTFlfTUVTU0FHRV9GUkFNRQorCSAqLworCXUzMiBzY3NpX2ZsYWdzID0gMHgyMGEwMDAwMDsKKwl1MzIgc2dsX29mZnNldDsKIAl1MzIgX19pb21lbSAqbXB0cjsKLQl1MzIgX19pb21lbSAqbGVucHRyOwotCXUzMiBsZW4sIHJlcWxlbjsKLQlpbnQgaTsKKwl1MzIgY21kID0gSTJPX0NNRF9TQ1NJX0VYRUMgPDwgMjQ7CisJaW50IHJjID0gMDsKIAogCS8qCiAJICogICAgICBEbyB0aGUgaW5jb21pbmcgcGFwZXJ3b3JrCiAJICovCi0KIAlpMm9fZGV2ID0gU0NwbnQtPmRldmljZS0+aG9zdGRhdGE7Ci0JaG9zdCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CiAJYyA9IGkyb19kZXYtPmlvcDsKLQlkZXYgPSAmYy0+cGRldi0+ZGV2OwogCiAJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CiAKQEAgLTU2Miw3ICs1MzUsNyBAQAogCQlvc21fd2Fybigibm8gSTJPIGRldmljZSBpbiByZXF1ZXN0XG4iKTsKIAkJU0NwbnQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwogCQlkb25lKFNDcG50KTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAl0aWQgPSBpMm9fZGV2LT5sY3RfZGF0YS50aWQ7CkBAIC01NzEsNDQgKzU0NCw4NSBAQAogCW9zbV9kZWJ1ZygiUmVhbCBzY3NpIG1lc3NhZ2VzLlxuIik7CiAKIAkvKgotCSAqICAgICAgT2J0YWluIGFuIEkyTyBtZXNzYWdlLiBJZiB0aGVyZSBhcmUgbm9uZSBmcmVlIHRoZW4KLQkgKiAgICAgIHRocm93IGl0IGJhY2sgdG8gdGhlIHNjc2kgbGF5ZXIKLQkgKi8KLQotCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKLQlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCi0JCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOwotCi0JLyoKIAkgKiAgICAgIFB1dCB0b2dldGhlciBhIHNjc2kgZXhlY3NjYiBtZXNzYWdlCiAJICovCi0KLQlsZW4gPSBTQ3BudC0+cmVxdWVzdF9idWZmbGVuOwotCiAJc3dpdGNoIChTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKIAljYXNlIFBDSV9ETUFfTk9ORToKLQkJc2NzaV9mbGFncyA9IDB4MDAwMDAwMDA7CS8vIERBVEEgTk8gWEZFUgotCQlzZ19mbGFncyA9IDB4MDAwMDAwMDA7CisJCS8qIERBVEEgTk8gWEZFUiAqLworCQlzZ2xfb2Zmc2V0ID0gU0dMX09GRlNFVF8wOwogCQlicmVhazsKIAogCWNhc2UgUENJX0RNQV9UT0RFVklDRToKLQkJc2NzaV9mbGFncyA9IDB4ODAwMDAwMDA7CS8vIERBVEEgT1VUIChpb3AtLT5kZXYpCi0JCXNnX2ZsYWdzID0gMHgxNDAwMDAwMDsKKwkJLyogREFUQSBPVVQgKGlvcC0tPmRldikgKi8KKwkJc2NzaV9mbGFncyB8PSAweDgwMDAwMDAwOworCQlzZ2xfb2Zmc2V0ID0gU0dMX09GRlNFVF8xMDsKIAkJYnJlYWs7CiAKIAljYXNlIFBDSV9ETUFfRlJPTURFVklDRToKLQkJc2NzaV9mbGFncyA9IDB4NDAwMDAwMDA7CS8vIERBVEEgSU4gIChpb3A8LS1kZXYpCi0JCXNnX2ZsYWdzID0gMHgxMDAwMDAwMDsKKwkJLyogREFUQSBJTiAgKGlvcDwtLWRldikgKi8KKwkJc2NzaV9mbGFncyB8PSAweDQwMDAwMDAwOworCQlzZ2xfb2Zmc2V0ID0gU0dMX09GRlNFVF8xMDsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQkvKiBVbmtub3duIC0ga2lsbCB0aGUgY29tbWFuZCAqLwogCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCWRvbmUoU0NwbnQpOwotCQlyZXR1cm4gMDsKKwkJZ290byBleGl0OwogCX0KIAotCXdyaXRlbChJMk9fQ01EX1NDU0lfRVhFQyA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgdGlkLCAmbXNnLT51LmhlYWRbMV0pOworCS8qCisJICogICAgICBPYnRhaW4gYW4gSTJPIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBub25lIGZyZWUgdGhlbgorCSAqICAgICAgdGhyb3cgaXQgYmFjayB0byB0aGUgc2NzaSBsYXllcgorCSAqLworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkgeworCQlyYyA9IFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisKKwltcHRyID0gJm1zZy0+Ym9keVswXTsKKworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUMKKwlpZiAoYy0+YWRhcHRlYykgeworCQl1MzIgYWRwdF9mbGFncyA9IDA7CisKKwkJaWYgKFNDcG50LT5zY19yZXF1ZXN0ICYmIFNDcG50LT5zY19yZXF1ZXN0LT51cHBlcl9wcml2YXRlX2RhdGEpIHsKKwkJCWkyb19zZ19pb19oZHJfdCBfX3VzZXIgKnVzcl9wdHIgPQorCQkJICAgICgoU2dfcmVxdWVzdCAqKSAoU0NwbnQtPnNjX3JlcXVlc3QtPgorCQkJCQkgICAgIHVwcGVyX3ByaXZhdGVfZGF0YSkpLT5oZWFkZXIuCisJCQkgICAgdXNyX3B0cjsKKworCQkJaWYgKHVzcl9wdHIpCisJCQkJZ2V0X3VzZXIoYWRwdF9mbGFncywgJnVzcl9wdHItPmZsYWdzKTsKKwkJfQorCisJCXN3aXRjaCAoaTJvX2Rldi0+bGN0X2RhdGEuY2xhc3NfaWQpIHsKKwkJY2FzZSBJMk9fQ0xBU1NfRVhFQ1VUSVZFOgorCQljYXNlIEkyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRToKKwkJCS8qIGludGVycHJldCBmbGFnIGhhcyB0byBiZSBzZXQgZm9yIGV4ZWN1dGl2ZSAqLworCQkJYWRwdF9mbGFncyBePSBJMk9fRFBUX1NHX0ZMQUdfSU5URVJQUkVUOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogZm9yIEFkYXB0ZWMgY29udHJvbGxlcnMgd2UgdXNlIHRoZSBQUklWQVRFIGNvbW1hbmQsIGJlY2F1c2UKKwkJICogdGhlIG5vcm1hbCBTQ1NJIEVYRUMgZG9lc24ndCBzdXBwb3J0IGFsbCBTQ1NJIGNvbW1hbmRzIG9uCisJCSAqIGFsbCBjb250cm9sbGVycyAoZm9yIGV4YW1wbGUgUkVBRCBDQVBBQ0lUWSkuCisJCSAqLworCQlpZiAoc2dsX29mZnNldCA9PSBTR0xfT0ZGU0VUXzEwKQorCQkJc2dsX29mZnNldCA9IFNHTF9PRkZTRVRfMTI7CisJCWNtZCA9IEkyT19DTURfUFJJVkFURSA8PCAyNDsKKwkJd3JpdGVsKEkyT19WRU5ET1JfRFBUIDw8IDE2IHwgSTJPX0NNRF9TQ1NJX0VYRUMsIG1wdHIrKyk7CisJCXdyaXRlbChhZHB0X2ZsYWdzIHwgdGlkLCBtcHRyKyspOworCX0KKyNlbmRpZgorCisJd3JpdGVsKGNtZCB8IEhPU1RfVElEIDw8IDEyIHwgdGlkLCAmbXNnLT51LmhlYWRbMV0pOwogCXdyaXRlbChpMm9fc2NzaV9kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5zLmljbnR4dCk7CiAKIAkvKiBXZSB3YW50IHRoZSBTQ1NJIGNvbnRyb2wgYmxvY2sgYmFjayAqLwpAQCAtNjI2LDcgKzY0MCw3IEBACiAJICovCiAKIAkvKiBBdHRhY2ggdGFncyB0byB0aGUgZGV2aWNlcyAqLwotCS8qCisJLyogRklYTUU6IGltcGxlbWVudAogCSAgIGlmKFNDcG50LT5kZXZpY2UtPnRhZ2dlZF9zdXBwb3J0ZWQpIHsKIAkgICBpZihTQ3BudC0+dGFnID09IEhFQURfT0ZfUVVFVUVfVEFHKQogCSAgIHNjc2lfZmxhZ3MgfD0gMHgwMTAwMDAwMDsKQEAgLTYzNSw2NyArNjQ5LDM1IEBACiAJICAgfQogCSAqLwogCi0JLyogRGlyZWN0aW9uLCBkaXNjb25uZWN0IG9rLCB0YWcsIENEQkxlbiAqLwotCXdyaXRlbChzY3NpX2ZsYWdzIHwgMHgyMDIwMDAwMCB8IFNDcG50LT5jbWRfbGVuLCAmbXNnLT5ib2R5WzBdKTsKLQotCW1wdHIgPSAmbXNnLT5ib2R5WzFdOworCXdyaXRlbChzY3NpX2ZsYWdzIHwgU0NwbnQtPmNtZF9sZW4sIG1wdHIrKyk7CiAKIAkvKiBXcml0ZSBTQ1NJIGNvbW1hbmQgaW50byB0aGUgbWVzc2FnZSAtIGFsd2F5cyAxNiBieXRlIGJsb2NrICovCiAJbWVtY3B5X3RvaW8obXB0ciwgU0NwbnQtPmNtbmQsIDE2KTsKIAltcHRyICs9IDQ7Ci0JbGVucHRyID0gbXB0cisrOwkvKiBSZW1lbWJlciBtZSAtIGZpbGwgaW4gd2hlbiB3ZSBrbm93ICovCiAKLQlyZXFsZW4gPSAxMjsJCS8vIFNJTkdMRSBTR0UKKwlpZiAoc2dsX29mZnNldCAhPSBTR0xfT0ZGU0VUXzApIHsKKwkJLyogd3JpdGUgc2l6ZSBvZiBkYXRhIGFkZHJlc3NlZCBieSBTR0wgKi8KKwkJd3JpdGVsKFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIG1wdHIrKyk7CiAKLQkvKiBOb3cgZmlsbCBpbiB0aGUgU0dMaXN0IGFuZCBjb21tYW5kICovCi0JaWYgKFNDcG50LT51c2Vfc2cpIHsKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQkJaW50IHNnX2NvdW50OwotCi0JCXNnID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOwotCQlsZW4gPSAwOwotCi0JCXNnX2NvdW50ID0gZG1hX21hcF9zZyhkZXYsIHNnLCBTQ3BudC0+dXNlX3NnLAotCQkJCSAgICAgIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7Ci0KLQkJaWYgKHVubGlrZWx5KHNnX2NvdW50IDw9IDApKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJZm9yIChpID0gU0NwbnQtPnVzZV9zZzsgaSA+IDA7IGktLSkgewotCQkJaWYgKGkgPT0gMSkKLQkJCQlzZ19mbGFncyB8PSAweEMwMDAwMDAwOwotCQkJd3JpdGVsKHNnX2ZsYWdzIHwgc2dfZG1hX2xlbihzZyksIG1wdHIrKyk7Ci0JCQl3cml0ZWwoc2dfZG1hX2FkZHJlc3Moc2cpLCBtcHRyKyspOwotCQkJbGVuICs9IHNnX2RtYV9sZW4oc2cpOwotCQkJc2crKzsKKwkJLyogTm93IGZpbGwgaW4gdGhlIFNHTGlzdCBhbmQgY29tbWFuZCAqLworCQlpZiAoU0NwbnQtPnVzZV9zZykgeworCQkJaWYgKCFpMm9fZG1hX21hcF9zZyhjLCBTQ3BudC0+cmVxdWVzdF9idWZmZXIsCisJCQkJCSAgICBTQ3BudC0+dXNlX3NnLAorCQkJCQkgICAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uLCAmbXB0cikpCisJCQkJZ290byBub21lbTsKKwkJfSBlbHNlIHsKKwkJCVNDcG50LT5TQ3AuZG1hX2hhbmRsZSA9CisJCQkgICAgaTJvX2RtYV9tYXBfc2luZ2xlKGMsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKKwkJCQkJICAgICAgIFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sCisJCQkJCSAgICAgICBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24sICZtcHRyKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihTQ3BudC0+U0NwLmRtYV9oYW5kbGUpKQorCQkJCWdvdG8gbm9tZW07CiAJCX0KLQotCQlyZXFsZW4gPSBtcHRyIC0gJm1zZy0+dS5oZWFkWzBdOwotCQl3cml0ZWwobGVuLCBsZW5wdHIpOwotCX0gZWxzZSB7Ci0JCWxlbiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47Ci0KLQkJd3JpdGVsKGxlbiwgbGVucHRyKTsKLQotCQlpZiAobGVuID4gMCkgewotCQkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKLQotCQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShkZXYsIFNDcG50LT5yZXF1ZXN0X2J1ZmZlciwKLQkJCQkJCSAgU0NwbnQtPnJlcXVlc3RfYnVmZmxlbiwKLQkJCQkJCSAgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKLQkJCWlmICghZG1hX2FkZHIpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCVNDcG50LT5TQ3AucHRyID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylkbWFfYWRkcjsKLQkJCXNnX2ZsYWdzIHw9IDB4QzAwMDAwMDA7Ci0JCQl3cml0ZWwoc2dfZmxhZ3MgfCBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLCBtcHRyKyspOwotCQkJd3JpdGVsKGRtYV9hZGRyLCBtcHRyKyspOwotCQl9IGVsc2UKLQkJCXJlcWxlbiA9IDk7CiAJfQogCiAJLyogU3RpY2sgdGhlIGhlYWRlcnMgb24gKi8KLQl3cml0ZWwocmVxbGVuIDw8IDE2IHwgU0dMX09GRlNFVF8xMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX01FU1NBR0VfU0laRShtcHRyIC0gJm1zZy0+dS5oZWFkWzBdKSB8IHNnbF9vZmZzZXQsCisJICAgICAgICZtc2ctPnUuaGVhZFswXSk7CiAKIAkvKiBRdWV1ZSB0aGUgbWVzc2FnZSAqLwogCWkyb19tc2dfcG9zdChjLCBtKTsKQEAgLTcwMyw2ICs2ODUsMTMgQEAKIAlvc21fZGVidWcoIklzc3VlZCAlbGRcbiIsIFNDcG50LT5zZXJpYWxfbnVtYmVyKTsKIAogCXJldHVybiAwOworCisgICAgICBub21lbToKKwlyYyA9IC1FTk9NRU07CisJaTJvX21zZ19ub3AoYywgbSk7CisKKyAgICAgIGV4aXQ6CisJcmV0dXJuIHJjOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwppbmRleCA1MGM4Y2VkLi40MmY4YjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaW9wLmMKQEAgLTI4LDggKzI4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJjb3JlLmgiCiAKLSNkZWZpbmUgT1NNX1ZFUlNJT04JIiRSZXYkIgorI2RlZmluZSBPU01fTkFNRQkiaTJvIgorI2RlZmluZSBPU01fVkVSU0lPTgkiMS4yODgiCiAjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPIHN1YnN5c3RlbSIKIAogLyogZ2xvYmFsIEkyTyBjb250cm9sbGVyIGxpc3QgKi8KQEAgLTQzLDIwICs0NSw2IEBACiAKIHN0YXRpYyBpbnQgaTJvX2hydF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKTsKIAotLyogTW9kdWxlIGludGVybmFsIGZ1bmN0aW9ucyBmcm9tIG90aGVyIHNvdXJjZXMgKi8KLWV4dGVybiBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fZXhlY19kcml2ZXI7Ci1leHRlcm4gaW50IGkyb19leGVjX2xjdF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICopOwotZXh0ZXJuIHZvaWQgaTJvX2RldmljZV9yZW1vdmUoc3RydWN0IGkyb19kZXZpY2UgKik7Ci0KLWV4dGVybiBpbnQgX19pbml0IGkyb19kcml2ZXJfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIF9fZXhpdCBpMm9fZHJpdmVyX2V4aXQodm9pZCk7Ci1leHRlcm4gaW50IF9faW5pdCBpMm9fZXhlY19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgX19leGl0IGkyb19leGVjX2V4aXQodm9pZCk7Ci1leHRlcm4gaW50IF9faW5pdCBpMm9fcGNpX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2V4aXQgaTJvX3BjaV9leGl0KHZvaWQpOwotZXh0ZXJuIGludCBpMm9fZGV2aWNlX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBpMm9fZGV2aWNlX2V4aXQodm9pZCk7Ci0KIC8qKgogICoJaTJvX21zZ19ub3AgLSBSZXR1cm5zIGEgbWVzc2FnZSB3aGljaCBpcyBub3QgdXNlZAogICoJQGM6IEkyTyBjb250cm9sbGVyIGZyb20gd2hpY2ggdGhlIG1lc3NhZ2Ugd2FzIGNyZWF0ZWQKQEAgLTY4LDcgKzU2LDcgQEAKICAqLwogdm9pZCBpMm9fbXNnX25vcChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtKQogewotCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2cgPSBjLT5pbl9xdWV1ZS52aXJ0ICsgbTsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnID0gaTJvX21zZ19pbl90b192aXJ0KGMsIG0pOwogCiAJd3JpdGVsKFRIUkVFX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CiAJd3JpdGVsKEkyT19DTURfVVRJTF9OT1AgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELApAQCAtOTIsMTYgKzgwLDE2IEBACiAgKglhZGRyZXNzIGZyb20gdGhlIHJlYWQgcG9ydCAoc2VlIHRoZSBpMm8gc3BlYykuIElmIG5vIG1lc3NhZ2UgaXMKICAqCWF2YWlsYWJsZSByZXR1cm5zIEkyT19RVUVVRV9FTVBUWSBhbmQgbXNnIGlzIGxlYXZlZCB1bnRvdWNoZWQuCiAgKi8KLXUzMiBpMm9fbXNnX2dldF93YWl0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKiptc2csCi0JCSAgICAgaW50IHdhaXQpCit1MzIgaTJvX21zZ19nZXRfd2FpdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCisJCSAgICAgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKiogbXNnLCBpbnQgd2FpdCkKIHsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgd2FpdCAqIEhaOwogCXUzMiBtOwogCiAJd2hpbGUgKChtID0gaTJvX21zZ19nZXQoYywgbXNnKSkgPT0gSTJPX1FVRVVFX0VNUFRZKSB7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IFRpbWVvdXQgd2FpdGluZyBmb3IgbWVzc2FnZSBmcmFtZS5cbiIsCi0JCQkJIGMtPm5hbWUpOworCQkJb3NtX2RlYnVnKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBtZXNzYWdlIGZyYW1lLlxuIiwKKwkJCQkgIGMtPm5hbWUpOwogCQkJcmV0dXJuIEkyT19RVUVVRV9FTVBUWTsKIAkJfQogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CkBAIC0xMjksMTMgKzExNywxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXB0cikKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGRuJ3QgYWRkIE5VTEwgcG9pbnRlciB0byBjb250ZXh0IGxpc3QhIgotCQkgICAgICAgIlxuIiwgYy0+bmFtZSk7CisJCW9zbV9lcnIoIiVzOiBjb3VsZG4ndCBhZGQgTlVMTCBwb2ludGVyIHRvIGNvbnRleHQgbGlzdCFcbiIsCisJCQljLT5uYW1lKTsKIAogCWVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFlbnRyeSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250ZXh0ICIKLQkJICAgICAgICJsaXN0IGVsZW1lbnRcbiIsIGMtPm5hbWUpOworCQlvc21fZXJyKCIlczogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGV4dCBsaXN0IGVsZW1lbnQiCisJCQkiXG4iLCBjLT5uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNTQsNyArMTQyLDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CiAKLQlwcl9kZWJ1ZygiJXM6IEFkZCBjb250ZXh0IHRvIGxpc3QgJXAgLT4gJWRcbiIsIGMtPm5hbWUsIHB0ciwgY29udGV4dCk7CisJb3NtX2RlYnVnKCIlczogQWRkIGNvbnRleHQgdG8gbGlzdCAlcCAtPiAlZFxuIiwgYy0+bmFtZSwgcHRyLCBjb250ZXh0KTsKIAogCXJldHVybiBlbnRyeS0+Y29udGV4dDsKIH07CkBAIC0xODYsMTEgKzE3NCwxMSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWNvbnRleHQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgcmVtb3ZlIG5vbmV4aXN0ZW50IHB0ciAiCi0JCSAgICAgICAiJXBcbiIsIGMtPm5hbWUsIHB0cik7CisJCW9zbV93YXJuKCIlczogQ291bGQgbm90IHJlbW92ZSBub25leGlzdGVudCBwdHIgJXBcbiIsIGMtPm5hbWUsCisJCQkgcHRyKTsKIAotCXByX2RlYnVnKCIlczogcmVtb3ZlIHB0ciBmcm9tIGNvbnRleHQgbGlzdCAlZCAtPiAlcFxuIiwgYy0+bmFtZSwKLQkJIGNvbnRleHQsIHB0cik7CisJb3NtX2RlYnVnKCIlczogcmVtb3ZlIHB0ciBmcm9tIGNvbnRleHQgbGlzdCAlZCAtPiAlcFxuIiwgYy0+bmFtZSwKKwkJICBjb250ZXh0LCBwdHIpOwogCiAJcmV0dXJuIGNvbnRleHQ7CiB9OwpAQCAtMjIwLDExICsyMDgsMTAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5jb250ZXh0X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFwdHIpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb250ZXh0IGlkICVkIG5vdCBmb3VuZFxuIiwgYy0+bmFtZSwKLQkJICAgICAgIGNvbnRleHQpOworCQlvc21fd2FybigiJXM6IGNvbnRleHQgaWQgJWQgbm90IGZvdW5kXG4iLCBjLT5uYW1lLCBjb250ZXh0KTsKIAotCXByX2RlYnVnKCIlczogZ2V0IHB0ciBmcm9tIGNvbnRleHQgbGlzdCAlZCAtPiAlcFxuIiwgYy0+bmFtZSwgY29udGV4dCwKLQkJIHB0cik7CisJb3NtX2RlYnVnKCIlczogZ2V0IHB0ciBmcm9tIGNvbnRleHQgbGlzdCAlZCAtPiAlcFxuIiwgYy0+bmFtZSwgY29udGV4dCwKKwkJICBwdHIpOwogCiAJcmV0dXJuIHB0cjsKIH07CkBAIC0yNTIsMTEgKzIzOSwxMSBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWNvbnRleHQpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgZmluZCBub25leGlzdGVudCBwdHIgIgotCQkgICAgICAgIiVwXG4iLCBjLT5uYW1lLCBwdHIpOworCQlvc21fd2FybigiJXM6IENvdWxkIG5vdCBmaW5kIG5vbmV4aXN0ZW50IHB0ciAlcFxuIiwgYy0+bmFtZSwKKwkJCSBwdHIpOwogCi0JcHJfZGVidWcoIiVzOiBnZXQgY29udGV4dCBpZCBmcm9tIGNvbnRleHQgbGlzdCAlcCAtPiAlZFxuIiwgYy0+bmFtZSwKLQkJIHB0ciwgY29udGV4dCk7CisJb3NtX2RlYnVnKCIlczogZ2V0IGNvbnRleHQgaWQgZnJvbSBjb250ZXh0IGxpc3QgJXAgLT4gJWRcbiIsIGMtPm5hbWUsCisJCSAgcHRyLCBjb250ZXh0KTsKIAogCXJldHVybiBjb250ZXh0OwogfTsKQEAgLTMzNiwxMCArMzIzLDkgQEAKIAogCS8qIExvbmcgdGltZW91dCBuZWVkZWQgZm9yIHF1aWVzY2UgaWYgbG90cyBvZiBkZXZpY2VzICovCiAJaWYgKChyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDI0MCkpKQotCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIHF1aWVzY2UgKHN0YXR1cz0lI3gpLlxuIiwKLQkJICAgICAgIGMtPm5hbWUsIC1yYyk7CisJCW9zbV9pbmZvKCIlczogVW5hYmxlIHRvIHF1aWVzY2UgKHN0YXR1cz0lI3gpLlxuIiwgYy0+bmFtZSwgLXJjKTsKIAllbHNlCi0JCXByX2RlYnVnKCIlczogUXVpZXNjZWQuXG4iLCBjLT5uYW1lKTsKKwkJb3NtX2RlYnVnKCIlczogUXVpZXNjZWQuXG4iLCBjLT5uYW1lKTsKIAogCWkyb19zdGF0dXNfZ2V0KGMpOwkvLyBFbnRlcmVkIFJFQURZIHN0YXRlCiAKQEAgLTM3NywxMCArMzYzLDkgQEAKIAogCS8qIEhvdyBsb25nIG9mIGEgdGltZW91dCBkbyB3ZSBuZWVkPyAqLwogCWlmICgocmMgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCAyNDApKSkKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGVuYWJsZSAoc3RhdHVzPSUjeCkuXG4iLAotCQkgICAgICAgYy0+bmFtZSwgLXJjKTsKKwkJb3NtX2VycigiJXM6IENvdWxkIG5vdCBlbmFibGUgKHN0YXR1cz0lI3gpLlxuIiwgYy0+bmFtZSwgLXJjKTsKIAllbHNlCi0JCXByX2RlYnVnKCIlczogRW5hYmxlZC5cbiIsIGMtPm5hbWUpOworCQlvc21fZGVidWcoIiVzOiBFbmFibGVkLlxuIiwgYy0+bmFtZSk7CiAKIAlpMm9fc3RhdHVzX2dldChjKTsJLy8gZW50ZXJlZCBPUEVSQVRJT05BTCBzdGF0ZQogCkBAIC00NDQsMjAgKzQyOSw3OCBAQAogCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOwogCiAJaWYgKChyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDMwKSkpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gY2xlYXIgKHN0YXR1cz0lI3gpLlxuIiwKLQkJICAgICAgIGMtPm5hbWUsIC1yYyk7CisJCW9zbV9pbmZvKCIlczogVW5hYmxlIHRvIGNsZWFyIChzdGF0dXM9JSN4KS5cbiIsIGMtPm5hbWUsIC1yYyk7CiAJZWxzZQotCQlwcl9kZWJ1ZygiJXM6IENsZWFyZWQuXG4iLCBjLT5uYW1lKTsKKwkJb3NtX2RlYnVnKCIlczogQ2xlYXJlZC5cbiIsIGMtPm5hbWUpOwogCiAJLyogRW5hYmxlIGFsbCBJT1BzICovCiAJaTJvX2lvcF9lbmFibGVfYWxsKCk7CiAKLQlpMm9fc3RhdHVzX2dldChjKTsKLQogCXJldHVybiByYzsKIH0KIAogLyoqCisgKglpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUgLSBzZXR1cCB0aGUgb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJQ2xlYXIgYW5kIChyZSlpbml0aWFsaXplIElPUCdzIG91dGJvdW5kIHF1ZXVlIGFuZCBwb3N0IHRoZSBtZXNzYWdlCisgKglmcmFtZXMgdG8gdGhlIElPUC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXZvbGF0aWxlIHU4ICpzdGF0dXMgPSBjLT5zdGF0dXMudmlydDsKKwl1MzIgbTsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXVsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwlvc21fZGVidWcoIiVzOiBJbml0aWFsaXppbmcgT3V0Ym91bmQgUXVldWUuLi5cbiIsIGMtPm5hbWUpOworCisJbWVtc2V0KGMtPnN0YXR1cy52aXJ0LCAwLCA0KTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEVJR0hUX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzYsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfT1VUQk9VTkRfSU5JVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwoMHgwMDAwMDAwMCwgJm1zZy0+dS5zLnRjbnR4dCk7CisJd3JpdGVsKFBBR0VfU0laRSwgJm1zZy0+Ym9keVswXSk7CisJLyogT3V0Ym91bmQgbXNnIGZyYW1lIHNpemUgaW4gd29yZHMgYW5kIEluaXRjb2RlICovCisJd3JpdGVsKEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSA8PCAxNiB8IDB4ODAsICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbCgweGQwMDAwMDA0LCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwoaTJvX2RtYV9sb3coYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKKwl3cml0ZWwoaTJvX2RtYV9oaWdoKGMtPnN0YXR1cy5waHlzKSwgJm1zZy0+Ym9keVs0XSk7CisKKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIEkyT19USU1FT1VUX0lOSVRfT1VUQk9VTkRfUVVFVUUgKiBIWjsKKwl3aGlsZSAoKnN0YXR1cyA8PSBJMk9fQ01EX0lOX1BST0dSRVNTKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlvc21fd2FybigiJXM6IFRpbWVvdXQgSW5pdGlhbGl6aW5nXG4iLCBjLT5uYW1lKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwltID0gYy0+b3V0X3F1ZXVlLnBoeXM7CisKKwkvKiBQb3N0IGZyYW1lcyAqLworCWZvciAoaSA9IDA7IGkgPCBJMk9fTUFYX09VVEJPVU5EX01TR19GUkFNRVM7IGkrKykgeworCQlpMm9fZmx1c2hfcmVwbHkoYywgbSk7CisJCXVkZWxheSgxKTsJLyogUHJvbWlzZSAqLworCQltICs9IEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRSAqIHNpemVvZih1MzIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKICAqCWkyb19pb3BfcmVzZXQgLSByZXNldCBhbiBJMk8gY29udHJvbGxlcgogICoJQGM6IGNvbnRyb2xsZXIgdG8gcmVzZXQKICAqCkBAIC00NjgsMjAgKzUxMSwyMCBAQAogICovCiBzdGF0aWMgaW50IGkyb19pb3BfcmVzZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQogewotCXU4ICpzdGF0dXMgPSBjLT5zdGF0dXMudmlydDsKKwl2b2xhdGlsZSB1OCAqc3RhdHVzID0gYy0+c3RhdHVzLnZpcnQ7CiAJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKIAl1MzIgbTsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKIAlpbnQgcmMgPSAwOwogCi0JcHJfZGVidWcoIiVzOiBSZXNldHRpbmcgY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CisJb3NtX2RlYnVnKCIlczogUmVzZXR0aW5nIGNvbnRyb2xsZXJcbiIsIGMtPm5hbWUpOwogCiAJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwogCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAKLQltZW1zZXQoc3RhdHVzLCAwLCA4KTsKKwltZW1zZXQoYy0+c3RhdHVzX2Jsb2NrLnZpcnQsIDAsIDgpOwogCiAJLyogUXVpZXNjZSBhbGwgSU9QcyBmaXJzdCAqLwogCWkyb19pb3BfcXVpZXNjZV9hbGwoKTsKQEAgLTQ5Myw0OSArNTM2LDQzIEBACiAJd3JpdGVsKDAsICZtc2ctPnUucy50Y250eHQpOwkvL0ZJWE1FOiB1c2UgcmVhc29uYWJsZSB0cmFuc2FjdGlvbiBjb250ZXh0CiAJd3JpdGVsKDAsICZtc2ctPmJvZHlbMF0pOwogCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzFdKTsKLQl3cml0ZWwoaTJvX3B0cl9sb3coKHZvaWQgKiljLT5zdGF0dXMucGh5cyksICZtc2ctPmJvZHlbMl0pOwotCXdyaXRlbChpMm9fcHRyX2hpZ2goKHZvaWQgKiljLT5zdGF0dXMucGh5cyksICZtc2ctPmJvZHlbM10pOworCXdyaXRlbChpMm9fZG1hX2xvdyhjLT5zdGF0dXMucGh5cyksICZtc2ctPmJvZHlbMl0pOworCXdyaXRlbChpMm9fZG1hX2hpZ2goYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKIAogCWkyb19tc2dfcG9zdChjLCBtKTsKIAogCS8qIFdhaXQgZm9yIGEgcmVwbHkgKi8KIAl0aW1lb3V0ID0gamlmZmllcyArIEkyT19USU1FT1VUX1JFU0VUICogSFo7CiAJd2hpbGUgKCEqc3RhdHVzKSB7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJT1AgcmVzZXQgdGltZW91dC5cbiIsIGMtPm5hbWUpOwotCQkJcmMgPSAtRVRJTUVET1VUOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJLyogUHJvbWlzZSBidWcgKi8KLQkJaWYgKHN0YXR1c1sxXSB8fCBzdGF0dXNbNF0pIHsKLQkJCSpzdGF0dXMgPSAwOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKIAkJCWJyZWFrOwotCQl9CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCi0JCXJtYigpOwogCX0KIAotCWlmICgqc3RhdHVzID09IEkyT19DTURfSU5fUFJPR1JFU1MpIHsKKwlzd2l0Y2ggKCpzdGF0dXMpIHsKKwljYXNlIEkyT19DTURfUkVKRUNURUQ6CisJCW9zbV93YXJuKCIlczogSU9QIHJlc2V0IHJlamVjdGVkXG4iLCBjLT5uYW1lKTsKKwkJcmMgPSAtRVBFUk07CisJCWJyZWFrOworCisJY2FzZSBJMk9fQ01EX0lOX1BST0dSRVNTOgogCQkvKgogCQkgKiBPbmNlIHRoZSByZXNldCBpcyBzZW50LCB0aGUgSU9QIGdvZXMgaW50byB0aGUgSU5JVCBzdGF0ZQotCQkgKiB3aGljaCBpcyBpbmRldGVybWluYXRlLiAgV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBJT1AKLQkJICogaGFzIHJlYm9vdGVkIGJlZm9yZSB3ZSBjYW4gbGV0IHRoZSBzeXN0ZW0gdGFsayB0bwotCQkgKiBpdC4gV2UgcmVhZCB0aGUgaW5ib3VuZCBGcmVlX0xpc3QgdW50aWwgYSBtZXNzYWdlIGlzCi0JCSAqIGF2YWlsYWJsZS4gSWYgd2UgY2FuJ3QgcmVhZCBvbmUgaW4gdGhlIGdpdmVuIGFtbW91bnQgb2YKLQkJICogdGltZSwgd2UgYXNzdW1lIHRoZSBJT1AgY291bGQgbm90IHJlYm9vdCBwcm9wZXJseS4KKwkJICogd2hpY2ggaXMgaW5kZXRlcm1pbmF0ZS4gV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBJT1AgaGFzCisJCSAqIHJlYm9vdGVkIGJlZm9yZSB3ZSBjYW4gbGV0IHRoZSBzeXN0ZW0gdGFsayB0byBpdC4gV2UgcmVhZAorCQkgKiB0aGUgaW5ib3VuZCBGcmVlX0xpc3QgdW50aWwgYSBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gSWYgd2UKKwkJICogY2FuJ3QgcmVhZCBvbmUgaW4gdGhlIGdpdmVuIGFtbW91bnQgb2YgdGltZSwgd2UgYXNzdW1lIHRoZQorCQkgKiBJT1AgY291bGQgbm90IHJlYm9vdCBwcm9wZXJseS4KIAkJICovCi0JCXByX2RlYnVnKCIlczogUmVzZXQgaW4gcHJvZ3Jlc3MsIHdhaXRpbmcgZm9yIHJlYm9vdC4uLlxuIiwKLQkJCSBjLT5uYW1lKTsKKwkJb3NtX2RlYnVnKCIlczogUmVzZXQgaW4gcHJvZ3Jlc3MsIHdhaXRpbmcgZm9yIHJlYm9vdC4uLlxuIiwKKwkJCSAgYy0+bmFtZSk7CiAKIAkJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfUkVTRVQpOwogCQl3aGlsZSAobSA9PSBJMk9fUVVFVUVfRU1QVFkpIHsKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSU9QIHJlc2V0IHRpbWVvdXQuXG4iLAotCQkJCSAgICAgICBjLT5uYW1lKTsKKwkJCQlvc21fZXJyKCIlczogSU9QIHJlc2V0IHRpbWVvdXQuXG4iLCBjLT5uYW1lKTsKIAkJCQlyYyA9IC1FVElNRURPVVQ7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtNTQ1LDIwICs1ODIsMjcgQEAKIAkJCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX1JFU0VUKTsKIAkJfQogCQlpMm9fbXNnX25vcChjLCBtKTsKKworCQkvKiBmcm9tIGhlcmUgYWxsIHF1aWVzY2UgY29tbWFuZHMgYXJlIHNhZmUgKi8KKwkJYy0+bm9fcXVpZXNjZSA9IDA7CisKKwkJLyogdmVyaWZ5IGlmIGNvbnRyb2xsZXIgaXMgaW4gc3RhdGUgUkVTRVQgKi8KKwkJaTJvX3N0YXR1c19nZXQoYyk7CisKKwkJaWYgKCFjLT5wcm9taXNlICYmIChzYi0+aW9wX3N0YXRlICE9IEFEQVBURVJfU1RBVEVfUkVTRVQpKQorCQkJb3NtX3dhcm4oIiVzOiByZXNldCBjb21wbGV0ZWQsIGJ1dCBhZGFwdGVyIG5vdCBpbiBSRVNFVCIKKwkJCQkgIiBzdGF0ZS5cbiIsIGMtPm5hbWUpOworCQllbHNlCisJCQlvc21fZGVidWcoIiVzOiByZXNldCBjb21wbGV0ZWQuXG4iLCBjLT5uYW1lKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCW9zbV9lcnIoIiVzOiBJT1AgcmVzZXQgdGltZW91dC5cbiIsIGMtPm5hbWUpOworCQlyYyA9IC1FVElNRURPVVQ7CisJCWJyZWFrOwogCX0KIAotCS8qIGZyb20gaGVyZSBhbGwgcXVpZXNjZSBjb21tYW5kcyBhcmUgc2FmZSAqLwotCWMtPm5vX3F1aWVzY2UgPSAwOwotCi0JLyogSWYgSW9wUmVzZXQgd2FzIHJlamVjdGVkIG9yIGRpZG4ndCBwZXJmb3JtIHJlc2V0LCB0cnkgSW9wQ2xlYXIgKi8KLQlpMm9fc3RhdHVzX2dldChjKTsKLQlpZiAoKnN0YXR1cyA9PSBJMk9fQ01EX1JFSkVDVEVEIHx8IHNiLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRVNFVCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXQgcmVqZWN0ZWQsIHRyeWluZyB0byBjbGVhclxuIiwKLQkJICAgICAgIGMtPm5hbWUpOwotCQlpMm9faW9wX2NsZWFyKGMpOwotCX0gZWxzZQotCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGNvbXBsZXRlZC5cbiIsIGMtPm5hbWUpOwotCiAgICAgICBleGl0OgogCS8qIEVuYWJsZSBhbGwgSU9QcyAqLwogCWkyb19pb3BfZW5hYmxlX2FsbCgpOwpAQCAtNTY3LDg4ICs2MTEsNiBAQAogfTsKIAogLyoqCi0gKglpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUgLSBzZXR1cCB0aGUgb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQotICoJQGM6IEkyTyBjb250cm9sbGVyCi0gKgotICoJQ2xlYXIgYW5kIChyZSlpbml0aWFsaXplIElPUCdzIG91dGJvdW5kIHF1ZXVlIGFuZCBwb3N0IHRoZSBtZXNzYWdlCi0gKglmcmFtZXMgdG8gdGhlIElPUC4KLSAqCi0gKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQotewotCXU4ICpzdGF0dXMgPSBjLT5zdGF0dXMudmlydDsKLQl1MzIgbTsKLQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwotCXVsb25nIHRpbWVvdXQ7Ci0JaW50IGk7Ci0KLQlwcl9kZWJ1ZygiJXM6IEluaXRpYWxpemluZyBPdXRib3VuZCBRdWV1ZS4uLlxuIiwgYy0+bmFtZSk7Ci0KLQltZW1zZXQoc3RhdHVzLCAwLCA0KTsKLQotCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKLQlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCi0JCXJldHVybiAtRVRJTUVET1VUOwotCi0Jd3JpdGVsKEVJR0hUX1dPUkRfTVNHX1NJWkUgfCBUUkxfT0ZGU0VUXzYsICZtc2ctPnUuaGVhZFswXSk7Ci0Jd3JpdGVsKEkyT19DTURfT1VUQk9VTkRfSU5JVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCi0JICAgICAgICZtc2ctPnUuaGVhZFsxXSk7Ci0Jd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKLQl3cml0ZWwoMHgwMTA2LCAmbXNnLT51LnMudGNudHh0KTsJLyogRklYTUU6IHdoeSAweDAxMDYsIG1heWJlIGluCi0JCQkJCQkgICBTcGVjPyAqLwotCXdyaXRlbChQQUdFX1NJWkUsICZtc2ctPmJvZHlbMF0pOwotCXdyaXRlbChNU0dfRlJBTUVfU0laRSA8PCAxNiB8IDB4ODAsICZtc2ctPmJvZHlbMV0pOwkvKiBPdXRib3VuZCBtc2cgZnJhbWUKLQkJCQkJCQkJICAgc2l6ZSBpbiB3b3JkcyBhbmQgSW5pdGNvZGUgKi8KLQl3cml0ZWwoMHhkMDAwMDAwNCwgJm1zZy0+Ym9keVsyXSk7Ci0Jd3JpdGVsKGkyb19wdHJfbG93KCh2b2lkICopYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKLQl3cml0ZWwoaTJvX3B0cl9oaWdoKCh2b2lkICopYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzRdKTsKLQotCWkyb19tc2dfcG9zdChjLCBtKTsKLQotCXRpbWVvdXQgPSBqaWZmaWVzICsgSTJPX1RJTUVPVVRfSU5JVF9PVVRCT1VORF9RVUVVRSAqIEhaOwotCXdoaWxlICgqc3RhdHVzIDw9IEkyT19DTURfSU5fUFJPR1JFU1MpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUaW1lb3V0IEluaXRpYWxpemluZ1xuIiwKLQkJCSAgICAgICBjLT5uYW1lKTsKLQkJCXJldHVybiAtRVRJTUVET1VUOwotCQl9Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQotCQlybWIoKTsKLQl9Ci0KLQltID0gYy0+b3V0X3F1ZXVlLnBoeXM7Ci0KLQkvKiBQb3N0IGZyYW1lcyAqLwotCWZvciAoaSA9IDA7IGkgPCBOTUJSX01TR19GUkFNRVM7IGkrKykgewotCQlpMm9fZmx1c2hfcmVwbHkoYywgbSk7Ci0JCXVkZWxheSgxKTsJLyogUHJvbWlzZSAqLwotCQltICs9IE1TR19GUkFNRV9TSVpFICogNDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKglpMm9faW9wX3NlbmRfbm9wIC0gc2VuZCBhIGNvcmUgTk9QIG1lc3NhZ2UKLSAqCUBjOiBjb250cm9sbGVyCi0gKgotICoJU2VuZCBhIG5vLW9wZXJhdGlvbiBtZXNzYWdlIHdpdGggYSByZXBseSBzZXQgdG8gY2F1c2Ugbm8KLSAqCWFjdGlvbiBlaXRoZXIuIE5lZWRlZCBmb3IgYnJpbmdpbmcgdXAgcHJvbWlzZSBjb250cm9sbGVycy4KLSAqLwotc3RhdGljIGludCBpMm9faW9wX3NlbmRfbm9wKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKLXsKLQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwotCXUzMiBtID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBIWik7Ci0JaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQlpMm9fbXNnX25vcChjLCBtKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKglpMm9faW9wX2FjdGl2YXRlIC0gQnJpbmcgY29udHJvbGxlciB1cCB0byBIT0xECiAgKglAYzogY29udHJvbGxlcgogICoKQEAgLTY1OSw3OCArNjIxLDYyIEBACiAgKi8KIHN0YXRpYyBpbnQgaTJvX2lvcF9hY3RpdmF0ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKmk5NjAgPSBOVUxMOwogCWkyb19zdGF0dXNfYmxvY2sgKnNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CiAJaW50IHJjOwotCi0JaWYgKGMtPnByb21pc2UpIHsKLQkJLyogQmVhdCB1cCB0aGUgaGFyZHdhcmUgZmlyc3Qgb2YgYWxsICovCi0JCWk5NjAgPQotCQkgICAgcGNpX2ZpbmRfc2xvdChjLT5wZGV2LT5idXMtPm51bWJlciwKLQkJCQkgIFBDSV9ERVZGTihQQ0lfU0xPVChjLT5wZGV2LT5kZXZmbiksIDApKTsKLQkJaWYgKGk5NjApCi0JCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaTk2MCwgMHg0MiwgMCk7Ci0KLQkJLyogRm9sbG93IHRoaXMgc2VxdWVuY2UgcHJlY2lzZWx5IG9yIHRoZSBjb250cm9sbGVyCi0JCSAgIGNlYXNlcyB0byBwZXJmb3JtIHVzZWZ1bCBmdW5jdGlvbnMgdW50aWwgcmVib290ICovCi0JCWlmICgocmMgPSBpMm9faW9wX3NlbmRfbm9wKGMpKSkKLQkJCXJldHVybiByYzsKLQotCQlpZiAoKHJjID0gaTJvX2lvcF9yZXNldChjKSkpCi0JCQlyZXR1cm4gcmM7Ci0JfQorCWludCBzdGF0ZTsKIAogCS8qIEluIElOSVQgc3RhdGUsIFdhaXQgSW5ib3VuZCBRIHRvIGluaXRpYWxpemUgKGluIGkyb19zdGF0dXNfZ2V0KSAqLwogCS8qIEluIFJFQURZIHN0YXRlLCBHZXQgc3RhdHVzICovCiAKIAlyYyA9IGkyb19zdGF0dXNfZ2V0KGMpOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIG9idGFpbiBzdGF0dXMsICIKLQkJICAgICAgICJhdHRlbXB0aW5nIGEgcmVzZXQuXG4iLCBjLT5uYW1lKTsKLQkJaWYgKGkyb19pb3BfcmVzZXQoYykpCisJCW9zbV9pbmZvKCIlczogVW5hYmxlIHRvIG9idGFpbiBzdGF0dXMsIGF0dGVtcHRpbmcgYSByZXNldC5cbiIsCisJCQkgYy0+bmFtZSk7CisJCXJjID0gaTJvX2lvcF9yZXNldChjKTsKKwkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KIAogCWlmIChzYi0+aTJvX3ZlcnNpb24gPiBJMk9WRVIxNSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBOb3QgcnVubmluZyB2ZXJzaW9uIDEuNSBvZiB0aGUgSTJPICIKLQkJICAgICAgICJTcGVjaWZpY2F0aW9uLlxuIiwgYy0+bmFtZSk7CisJCW9zbV9lcnIoIiVzOiBOb3QgcnVubmluZyB2ZXJzaW9uIDEuNSBvZiB0aGUgSTJPIFNwZWNpZmljYXRpb24uIgorCQkJIlxuIiwgYy0+bmFtZSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXN3aXRjaCAoc2ItPmlvcF9zdGF0ZSkgewogCWNhc2UgQURBUFRFUl9TVEFURV9GQVVMVEVEOgotCQlwcmludGsoS0VSTl9DUklUICIlczogaGFyZHdhcmUgZmF1bHRcbiIsIGMtPm5hbWUpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJb3NtX2VycigiJXM6IGhhcmR3YXJlIGZhdWx0XG4iLCBjLT5uYW1lKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKIAljYXNlIEFEQVBURVJfU1RBVEVfUkVBRFk6CiAJY2FzZSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMOgogCWNhc2UgQURBUFRFUl9TVEFURV9IT0xEOgogCWNhc2UgQURBUFRFUl9TVEFURV9GQUlMRUQ6Ci0JCXByX2RlYnVnKCIlczogYWxyZWFkeSBydW5uaW5nLCB0cnlpbmcgdG8gcmVzZXQuLi5cbiIsIGMtPm5hbWUpOwotCQlpZiAoaTJvX2lvcF9yZXNldChjKSkKLQkJCXJldHVybiAtRU5PREVWOworCQlvc21fZGVidWcoIiVzOiBhbHJlYWR5IHJ1bm5pbmcsIHRyeWluZyB0byByZXNldC4uLlxuIiwgYy0+bmFtZSk7CisJCXJjID0gaTJvX2lvcF9yZXNldChjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCX0KIAorCS8qIHByZXNlcnZlIHN0YXRlICovCisJc3RhdGUgPSBzYi0+aW9wX3N0YXRlOworCiAJcmMgPSBpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUoYyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlpZiAoYy0+cHJvbWlzZSkgewotCQlpZiAoKHJjID0gaTJvX2lvcF9zZW5kX25vcChjKSkpCi0JCQlyZXR1cm4gcmM7CisJLyogaWYgYWRhcHRlciB3YXMgbm90IGluIFJFU0VUIHN0YXRlIGNsZWFyIG5vdyAqLworCWlmIChzdGF0ZSAhPSBBREFQVEVSX1NUQVRFX1JFU0VUKQorCQlpMm9faW9wX2NsZWFyKGMpOwogCi0JCWlmICgocmMgPSBpMm9fc3RhdHVzX2dldChjKSkpCi0JCQlyZXR1cm4gcmM7CisJaTJvX3N0YXR1c19nZXQoYyk7CiAKLQkJaWYgKGk5NjApCi0JCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaTk2MCwgMHg0MiwgMHgzRkYpOworCWlmIChzYi0+aW9wX3N0YXRlICE9IEFEQVBURVJfU1RBVEVfSE9MRCkgeworCQlvc21fZXJyKCIlczogZmFpbGVkIHRvIGJyaW5nIElPUCBpbnRvIEhPTEQgc3RhdGVcbiIsIGMtPm5hbWUpOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvKiBJbiBIT0xEIHN0YXRlICovCi0KLQlyYyA9IGkyb19ocnRfZ2V0KGMpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBpMm9faHJ0X2dldChjKTsKIH07CiAKIC8qKgpAQCAtNzU2LDIwICs3MDIsMTggQEAKIAkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwogCQlyZXMtPnN0YXJ0ID0gMDsKIAkJcmVzLT5lbmQgPSAwOwotCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwKLQkJICAgICAgIGMtPm5hbWUpOworCQlvc21faW5mbygiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsIGMtPm5hbWUpOwogCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7CiAJCWlmIChyb290ID09IE5VTEwpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgZmluZCBwYXJlbnQgcmVzb3VyY2UhXG4iLAotCQkJICAgICAgIGMtPm5hbWUpOworCQkJb3NtX3dhcm4oIiVzOiBDYW4ndCBmaW5kIHBhcmVudCByZXNvdXJjZSFcbiIsIGMtPm5hbWUpOwogCQlpZiAocm9vdCAmJiBhbGxvY2F0ZV9yZXNvdXJjZShyb290LCByZXMsIHNiLT5kZXNpcmVkX21lbV9zaXplLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgc2ItPmRlc2lyZWRfbWVtX3NpemUsIDEgPDwgMjAsCS8qIFVuc3BlY2lmaWVkLCBzbyB1c2UgMU1iIGFuZCBwbGF5IHNhZmUgKi8KIAkJCQkJICAgICAgTlVMTCwgTlVMTCkgPj0gMCkgewogCQkJYy0+bWVtX2FsbG9jID0gMTsKIAkJCXNiLT5jdXJyZW50X21lbV9zaXplID0gMSArIHJlcy0+ZW5kIC0gcmVzLT5zdGFydDsKIAkJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhbGxvY2F0ZWQgJWxkIGJ5dGVzIG9mIFBDSSBtZW1vcnkiCi0JCQkgICAgICAgIiBhdCAweCUwOGxYLlxuIiwgYy0+bmFtZSwKLQkJCSAgICAgICAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0KTsKKwkJCW9zbV9pbmZvKCIlczogYWxsb2NhdGVkICVsZCBieXRlcyBvZiBQQ0kgbWVtb3J5IGF0ICIKKwkJCQkgIjB4JTA4bFguXG4iLCBjLT5uYW1lLAorCQkJCSAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0KTsKIAkJfQogCX0KIApAQCAtNzc5LDIwICs3MjMsMTggQEAKIAkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfSU87CiAJCXJlcy0+c3RhcnQgPSAwOwogCQlyZXMtPmVuZCA9IDA7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiByZXF1aXJlcyBwcml2YXRlIG1lbW9yeSByZXNvdXJjZXMuXG4iLAotCQkgICAgICAgYy0+bmFtZSk7CisJCW9zbV9pbmZvKCIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwgYy0+bmFtZSk7CiAJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UoYy0+cGRldiwgcmVzKTsKIAkJaWYgKHJvb3QgPT0gTlVMTCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBmaW5kIHBhcmVudCByZXNvdXJjZSFcbiIsCi0JCQkgICAgICAgYy0+bmFtZSk7CisJCQlvc21fd2FybigiJXM6IENhbid0IGZpbmQgcGFyZW50IHJlc291cmNlIVxuIiwgYy0+bmFtZSk7CiAJCWlmIChyb290ICYmIGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgc2ItPmRlc2lyZWRfaW9fc2l6ZSwgMSA8PCAyMCwJLyogVW5zcGVjaWZpZWQsIHNvIHVzZSAxTWIgYW5kIHBsYXkgc2FmZSAqLwogCQkJCQkgICAgICBOVUxMLCBOVUxMKSA+PSAwKSB7CiAJCQljLT5pb19hbGxvYyA9IDE7CiAJCQlzYi0+Y3VycmVudF9pb19zaXplID0gMSArIHJlcy0+ZW5kIC0gcmVzLT5zdGFydDsKIAkJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhbGxvY2F0ZWQgJWxkIGJ5dGVzIG9mIFBDSSBJL08gYXQiCi0JCQkgICAgICAgIiAweCUwOGxYLlxuIiwgYy0+bmFtZSwKLQkJCSAgICAgICAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0KTsKKwkJCW9zbV9pbmZvKCIlczogYWxsb2NhdGVkICVsZCBieXRlcyBvZiBQQ0kgSS9PIGF0IDB4JTA4bFgiCisJCQkJICIuXG4iLCBjLT5uYW1lLCAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0LAorCQkJCSByZXMtPnN0YXJ0KTsKIAkJfQogCX0KIApAQCAtODM2LDEwICs3NzgsMTAgQEAKIAkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKIAogCWlmIChyYyA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBzZXQgU3lzVGFiIChzdGF0dXM9JSN4KS5cbiIsCi0JCSAgICAgICBjLT5uYW1lLCAtcmMpOworCQlvc21fZXJyKCIlczogVW5hYmxlIHRvIHNldCBTeXNUYWIgKHN0YXR1cz0lI3gpLlxuIiwgYy0+bmFtZSwKKwkJCS1yYyk7CiAJZWxzZQotCQlwcl9kZWJ1ZygiJXM6IFN5c1RhYiBzZXQuXG4iLCBjLT5uYW1lKTsKKwkJb3NtX2RlYnVnKCIlczogU3lzVGFiIHNldC5cbiIsIGMtPm5hbWUpOwogCiAJaTJvX3N0YXR1c19nZXQoYyk7CS8vIEVudGVyZWQgUkVBRFkgc3RhdGUKIApAQCAtODYzLDcgKzgwNSw3IEBACiAJCXJldHVybiByYzsKIAogCS8qIEluIFJFQURZIHN0YXRlICovCi0JcHJfZGVidWcoIiVzOiBBdHRlbXB0aW5nIHRvIGVuYWJsZS4uLlxuIiwgYy0+bmFtZSk7CisJb3NtX2RlYnVnKCIlczogQXR0ZW1wdGluZyB0byBlbmFibGUuLi5cbiIsIGMtPm5hbWUpOwogCXJjID0gaTJvX2lvcF9lbmFibGUoYyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC04ODIsNyArODI0LDcgQEAKIHsKIAlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCAqdG1wOwogCi0JcHJfZGVidWcoIiVzOiBkZWxldGluZyBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKKwlvc21fZGVidWcoIiVzOiBkZWxldGluZyBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKIAogCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlX2FsbChjKTsKIApAQCAtODkxLDggKzgzMywxMiBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmMtPmRldmljZXMsIGxpc3QpCiAJICAgIGkyb19kZXZpY2VfcmVtb3ZlKGRldik7CiAKKwlkZXZpY2VfZGVsKCZjLT5kZXZpY2UpOworCiAJLyogQXNrIHRoZSBJT1AgdG8gc3dpdGNoIHRvIFJFU0VUIHN0YXRlICovCiAJaTJvX2lvcF9yZXNldChjKTsKKworCXB1dF9kZXZpY2UoJmMtPmRldmljZSk7CiB9CiAKIC8qKgpAQCAtOTI3LDggKzg3Myw3IEBACiAKIAlzeXN0YWIgPSBpMm9fc3lzdGFiLnZpcnQgPSBrbWFsbG9jKGkyb19zeXN0YWIubGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN5c3RhYikgewotCQlwcmludGsoS0VSTl9FUlIgImkybzogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU3lzdGVtICIKLQkJICAgICAgICJUYWJsZVxuIik7CisJCW9zbV9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFN5c3RlbSBUYWJsZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQoc3lzdGFiLCAwLCBpMm9fc3lzdGFiLmxlbik7CkBAIC05NDAsOCArODg1LDggQEAKIAkJaTJvX3N0YXR1c19ibG9jayAqc2I7CiAKIAkJaWYgKGNvdW50ID49IG51bV9jb250cm9sbGVycykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IGNvbnRyb2xsZXIgYWRkZWQgd2hpbGUgYnVpbGRpbmcgIgotCQkJICAgICAgICJzeXN0ZW0gdGFibGVcbiIpOworCQkJb3NtX2VycigiY29udHJvbGxlciBhZGRlZCB3aGlsZSBidWlsZGluZyBzeXN0ZW0gdGFibGUiCisJCQkJIlxuIik7CiAJCQlicmVhazsKIAkJfQogCkBAIC05NTUsOSArOTAwLDggQEAKIAkJICogaXQgaXMgdGVjaG5pbmljYWxseSBub3QgcGFydCBvZiB0aGUgSTJPIHN1YnN5c3RlbS4uLgogCQkgKi8KIAkJaWYgKHVubGlrZWx5KGkyb19zdGF0dXNfZ2V0KGMpKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRGVsZXRpbmcgYi9jIGNvdWxkIG5vdCBnZXQgc3RhdHVzIgotCQkJICAgICAgICIgd2hpbGUgYXR0ZW1wdGluZyB0byBidWlsZCBzeXN0ZW0gdGFibGVcbiIsCi0JCQkgICAgICAgYy0+bmFtZSk7CisJCQlvc21fZXJyKCIlczogRGVsZXRpbmcgYi9jIGNvdWxkIG5vdCBnZXQgc3RhdHVzIHdoaWxlICIKKwkJCQkiYXR0ZW1wdGluZyB0byBidWlsZCBzeXN0ZW0gdGFibGVcbiIsIGMtPm5hbWUpOwogCQkJaTJvX2lvcF9yZW1vdmUoYyk7CiAJCQljb250aW51ZTsJLy8gdHJ5IHRoZSBuZXh0IG9uZQogCQl9CkBAIC05NzEsOCArOTE1LDEwIEBACiAJCXN5c3RhYi0+aW9wc1tjb3VudF0uZnJhbWVfc2l6ZSA9IHNiLT5pbmJvdW5kX2ZyYW1lX3NpemU7CiAJCXN5c3RhYi0+aW9wc1tjb3VudF0ubGFzdF9jaGFuZ2VkID0gY2hhbmdlX2luZDsKIAkJc3lzdGFiLT5pb3BzW2NvdW50XS5pb3BfY2FwYWJpbGl0aWVzID0gc2ItPmlvcF9jYXBhYmlsaXRpZXM7Ci0JCXN5c3RhYi0+aW9wc1tjb3VudF0uaW5ib3VuZF9sb3cgPSBpMm9fcHRyX2xvdyhjLT5wb3N0X3BvcnQpOwotCQlzeXN0YWItPmlvcHNbY291bnRdLmluYm91bmRfaGlnaCA9IGkyb19wdHJfaGlnaChjLT5wb3N0X3BvcnQpOworCQlzeXN0YWItPmlvcHNbY291bnRdLmluYm91bmRfbG93ID0KKwkJICAgIGkyb19kbWFfbG93KGMtPmJhc2UucGh5cyArIEkyT19JTl9QT1JUKTsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5pbmJvdW5kX2hpZ2ggPQorCQkgICAgaTJvX2RtYV9oaWdoKGMtPmJhc2UucGh5cyArIEkyT19JTl9QT1JUKTsKIAogCQljb3VudCsrOwogCX0KQEAgLTEwMTAsMTEgKzk1NiwxMSBAQAogewogCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CiAJdTMyIG07Ci0JdTggKnN0YXR1c19ibG9jazsKKwl2b2xhdGlsZSB1OCAqc3RhdHVzX2Jsb2NrOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCXN0YXR1c19ibG9jayA9ICh1OCAqKSBjLT5zdGF0dXNfYmxvY2sudmlydDsKLQltZW1zZXQoc3RhdHVzX2Jsb2NrLCAwLCBzaXplb2YoaTJvX3N0YXR1c19ibG9jaykpOworCW1lbXNldChjLT5zdGF0dXNfYmxvY2sudmlydCwgMCwgc2l6ZW9mKGkyb19zdGF0dXNfYmxvY2spKTsKIAogCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKIAlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCkBAIC0xMDI3LDggKzk3Myw4IEBACiAJd3JpdGVsKDAsICZtc2ctPnUucy50Y250eHQpOwkvLyBGSVhNRTogdXNlIHJlc29uYWJsZSB0cmFuc2FjdGlvbiBjb250ZXh0CiAJd3JpdGVsKDAsICZtc2ctPmJvZHlbMF0pOwogCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzFdKTsKLQl3cml0ZWwoaTJvX3B0cl9sb3coKHZvaWQgKiljLT5zdGF0dXNfYmxvY2sucGh5cyksICZtc2ctPmJvZHlbMl0pOwotCXdyaXRlbChpMm9fcHRyX2hpZ2goKHZvaWQgKiljLT5zdGF0dXNfYmxvY2sucGh5cyksICZtc2ctPmJvZHlbM10pOworCXdyaXRlbChpMm9fZG1hX2xvdyhjLT5zdGF0dXNfYmxvY2sucGh5cyksICZtc2ctPmJvZHlbMl0pOworCXdyaXRlbChpMm9fZG1hX2hpZ2goYy0+c3RhdHVzX2Jsb2NrLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKIAl3cml0ZWwoc2l6ZW9mKGkyb19zdGF0dXNfYmxvY2spLCAmbXNnLT5ib2R5WzRdKTsJLyogYWx3YXlzIDg4IGJ5dGVzICovCiAKIAlpMm9fbXNnX3Bvc3QoYywgbSk7CkBAIC0xMDM3LDE0ICs5ODMsMTIgQEAKIAl0aW1lb3V0ID0gamlmZmllcyArIEkyT19USU1FT1VUX1NUQVRVU19HRVQgKiBIWjsKIAl3aGlsZSAoc3RhdHVzX2Jsb2NrWzg3XSAhPSAweEZGKSB7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBHZXQgc3RhdHVzIHRpbWVvdXQuXG4iLCBjLT5uYW1lKTsKKwkJCW9zbV9lcnIoIiVzOiBHZXQgc3RhdHVzIHRpbWVvdXQuXG4iLCBjLT5uYW1lKTsKIAkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwotCi0JCXJtYigpOwogCX0KIAogI2lmZGVmIERFQlVHCkBAIC0xMDg4LDggKzEwMzIsOCBAQAogCQlyYyA9IGkyb19tc2dfcG9zdF93YWl0X21lbShjLCBtLCAyMCwgJmMtPmhydCk7CiAKIAkJaWYgKHJjIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBIUlQgKHN0YXR1cz0lI3gpXG4iLAotCQkJICAgICAgIGMtPm5hbWUsIC1yYyk7CisJCQlvc21fZXJyKCIlczogVW5hYmxlIHRvIGdldCBIUlQgKHN0YXR1cz0lI3gpXG4iLCBjLT5uYW1lLAorCQkJCS1yYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KIApAQCAtMTEwMywxMyArMTA0Nyw0MSBAQAogCQkJcmV0dXJuIGkyb19wYXJzZV9ocnQoYyk7CiAJfQogCi0JcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBIUlQgYWZ0ZXIgJWQgdHJpZXMsIGdpdmluZyB1cFxuIiwKLQkgICAgICAgYy0+bmFtZSwgSTJPX0hSVF9HRVRfVFJJRVMpOworCW9zbV9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IEhSVCBhZnRlciAlZCB0cmllcywgZ2l2aW5nIHVwXG4iLCBjLT5uYW1lLAorCQlJMk9fSFJUX0dFVF9UUklFUyk7CiAKIAlyZXR1cm4gLUVCVVNZOwogfQogCiAvKioKKyAqCWkyb19pb3BfZnJlZSAtIEZyZWUgdGhlIGkyb19jb250cm9sbGVyIHN0cnVjdAorICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIGZyZWUKKyAqLwordm9pZCBpMm9faW9wX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWtmcmVlKGMpOworfTsKKworLyoqCisgKglpMm9faW9wX3JlbGVhc2UgLSByZWxlYXNlIHRoZSBtZW1vcnkgZm9yIGEgSTJPIGNvbnRyb2xsZXIKKyAqCUBkZXY6IEkyTyBjb250cm9sbGVyIHdoaWNoIHNob3VsZCBiZSByZWxlYXNlZAorICoKKyAqCVJlbGVhc2UgdGhlIGFsbG9jYXRlZCBtZW1vcnkuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIHJlZmNvdW50IG9mCisgKglkZXZpY2UgcmVhY2hlcyAwIGF1dG9tYXRpY2FsbHkuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19pb3BfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gdG9faTJvX2NvbnRyb2xsZXIoZGV2KTsKKworCWkyb19pb3BfZnJlZShjKTsKK307CisKKy8qIEkyTyBjb250cm9sbGVyIGNsYXNzICovCitzdGF0aWMgc3RydWN0IGNsYXNzIGkyb19jb250cm9sbGVyX2NsYXNzID0geworCS5uYW1lID0gImkyb19jb250cm9sbGVyIiwKK307CisKKy8qKgogICoJaTJvX2lvcF9hbGxvYyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgaTJvX2NvbnRyb2xsZXIgc3RydWN0CiAgKgogICoJQWxsb2NhdGUgdGhlIG5lY2Vzc2FyeSBtZW1vcnkgZm9yIGEgaTJvX2NvbnRyb2xsZXIgc3RydWN0IGFuZApAQCAtMTEyNSw4ICsxMDk3LDggQEAKIAogCWMgPSBrbWFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwogCWlmICghYykgewotCQlwcmludGsoS0VSTl9FUlIgImkybzogSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSBhIEkyTyAiCi0JCSAgICAgICAiY29udHJvbGxlci5cbiIpOworCQlvc21fZXJyKCJpMm86IEluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgYSBJMk8gY29udHJvbGxlci4iCisJCQkiXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKQEAgLTExMzcsNiArMTEwOSwxNiBAQAogCWMtPnVuaXQgPSB1bml0Kys7CiAJc3ByaW50ZihjLT5uYW1lLCAiaW9wJWQiLCBjLT51bml0KTsKIAorCWRldmljZV9pbml0aWFsaXplKCZjLT5kZXZpY2UpOworCWNsYXNzX2RldmljZV9pbml0aWFsaXplKCZjLT5jbGFzc2Rldik7CisKKwljLT5kZXZpY2UucmVsZWFzZSA9ICZpMm9faW9wX3JlbGVhc2U7CisJYy0+Y2xhc3NkZXYuY2xhc3MgPSAmaTJvX2NvbnRyb2xsZXJfY2xhc3M7CisJYy0+Y2xhc3NkZXYuZGV2ID0gJmMtPmRldmljZTsKKworCXNucHJpbnRmKGMtPmRldmljZS5idXNfaWQsIEJVU19JRF9TSVpFLCAiaW9wJWQiLCBjLT51bml0KTsKKwlzbnByaW50ZihjLT5jbGFzc2Rldi5jbGFzc19pZCwgQlVTX0lEX1NJWkUsICJpb3AlZCIsIGMtPnVuaXQpOworCiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAogCXNwaW5fbG9ja19pbml0KCZjLT5jb250ZXh0X2xpc3RfbG9jayk7CiAJYXRvbWljX3NldCgmYy0+Y29udGV4dF9saXN0X2NvdW50ZXIsIDApOwpAQCAtMTE0NywxNSArMTEyOSw2IEBACiB9OwogCiAvKioKLSAqCWkyb19pb3BfZnJlZSAtIEZyZWUgdGhlIGkyb19jb250cm9sbGVyIHN0cnVjdAotICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIGZyZWUKLSAqLwotdm9pZCBpMm9faW9wX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQotewotCWtmcmVlKGMpOwotfTsKLQotLyoqCiAgKglpMm9faW9wX2FkZCAtIEluaXRpYWxpemUgdGhlIEkyTyBjb250cm9sbGVyIGFuZCBhZGQgaGltIHRvIHRoZSBJMk8gY29yZQogICoJQGM6IGNvbnRyb2xsZXIKICAqCkBAIC0xMTY4LDQ1ICsxMTQxLDU4IEBACiB7CiAJaW50IHJjOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFjdGl2YXRpbmcgSTJPIGNvbnRyb2xsZXIuLi5cbiIsIGMtPm5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGlzIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMgaWYgdGhlcmUgYXJlIG1hbnkgIgotCSAgICAgICAiZGV2aWNlc1xuIiwgYy0+bmFtZSk7CisJaWYgKChyYyA9IGRldmljZV9hZGQoJmMtPmRldmljZSkpKSB7CisJCW9zbV9lcnIoIiVzOiBjb3VsZCBub3QgYWRkIGNvbnRyb2xsZXJcbiIsIGMtPm5hbWUpOworCQlnb3RvIGlvcF9yZXNldDsKKwl9CisKKwlpZiAoKHJjID0gY2xhc3NfZGV2aWNlX2FkZCgmYy0+Y2xhc3NkZXYpKSkgeworCQlvc21fZXJyKCIlczogY291bGQgbm90IGFkZCBjb250cm9sbGVyIGNsYXNzXG4iLCBjLT5uYW1lKTsKKwkJZ290byBkZXZpY2VfZGVsOworCX0KKworCW9zbV9pbmZvKCIlczogQWN0aXZhdGluZyBJMk8gY29udHJvbGxlci4uLlxuIiwgYy0+bmFtZSk7CisJb3NtX2luZm8oIiVzOiBUaGlzIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMgaWYgdGhlcmUgYXJlIG1hbnkgZGV2aWNlc1xuIiwKKwkJIGMtPm5hbWUpOwogCiAJaWYgKChyYyA9IGkyb19pb3BfYWN0aXZhdGUoYykpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBhY3RpdmF0ZSBjb250cm9sbGVyXG4iLAotCQkgICAgICAgYy0+bmFtZSk7Ci0JCWkyb19pb3BfcmVzZXQoYyk7Ci0JCXJldHVybiByYzsKKwkJb3NtX2VycigiJXM6IGNvdWxkIG5vdCBhY3RpdmF0ZSBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKKwkJZ290byBjbGFzc19kZWw7CiAJfQogCi0JcHJfZGVidWcoIiVzOiBidWlsZGluZyBzeXMgdGFibGUuLi5cbiIsIGMtPm5hbWUpOworCW9zbV9kZWJ1ZygiJXM6IGJ1aWxkaW5nIHN5cyB0YWJsZS4uLlxuIiwgYy0+bmFtZSk7CiAKLQlpZiAoKHJjID0gaTJvX3N5c3RhYl9idWlsZCgpKSkgewotCQlpMm9faW9wX3Jlc2V0KGMpOwotCQlyZXR1cm4gcmM7Ci0JfQorCWlmICgocmMgPSBpMm9fc3lzdGFiX2J1aWxkKCkpKQorCQlnb3RvIGNsYXNzX2RlbDsKIAotCXByX2RlYnVnKCIlczogb25saW5lIGNvbnRyb2xsZXIuLi5cbiIsIGMtPm5hbWUpOworCW9zbV9kZWJ1ZygiJXM6IG9ubGluZSBjb250cm9sbGVyLi4uXG4iLCBjLT5uYW1lKTsKIAotCWlmICgocmMgPSBpMm9faW9wX29ubGluZShjKSkpIHsKLQkJaTJvX2lvcF9yZXNldChjKTsKLQkJcmV0dXJuIHJjOwotCX0KKwlpZiAoKHJjID0gaTJvX2lvcF9vbmxpbmUoYykpKQorCQlnb3RvIGNsYXNzX2RlbDsKIAotCXByX2RlYnVnKCIlczogZ2V0dGluZyBMQ1QuLi5cbiIsIGMtPm5hbWUpOworCW9zbV9kZWJ1ZygiJXM6IGdldHRpbmcgTENULi4uXG4iLCBjLT5uYW1lKTsKIAotCWlmICgocmMgPSBpMm9fZXhlY19sY3RfZ2V0KGMpKSkgewotCQlpMm9faW9wX3Jlc2V0KGMpOwotCQlyZXR1cm4gcmM7Ci0JfQorCWlmICgocmMgPSBpMm9fZXhlY19sY3RfZ2V0KGMpKSkKKwkJZ290byBjbGFzc19kZWw7CiAKIAlsaXN0X2FkZCgmYy0+bGlzdCwgJmkyb19jb250cm9sbGVycyk7CiAKIAlpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX2FkZF9hbGwoYyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogQ29udHJvbGxlciBhZGRlZFxuIiwgYy0+bmFtZSk7CisJb3NtX2luZm8oIiVzOiBDb250cm9sbGVyIGFkZGVkXG4iLCBjLT5uYW1lKTsKIAogCXJldHVybiAwOworCisgICAgICBjbGFzc19kZWw6CisJY2xhc3NfZGV2aWNlX2RlbCgmYy0+Y2xhc3NkZXYpOworCisgICAgICBkZXZpY2VfZGVsOgorCWRldmljZV9kZWwoJmMtPmRldmljZSk7CisKKyAgICAgIGlvcF9yZXNldDoKKwlpMm9faW9wX3Jlc2V0KGMpOworCisJcmV0dXJuIHJjOwogfTsKIAogLyoqCkBAIC0xMjY0LDE2ICsxMjUwLDE4IEBACiAJaWYgKHJjKQogCQlnb3RvIGV4aXQ7CiAKLQlyYyA9IGkyb19kcml2ZXJfaW5pdCgpOwotCWlmIChyYykKKwlpZiAoKHJjID0gY2xhc3NfcmVnaXN0ZXIoJmkyb19jb250cm9sbGVyX2NsYXNzKSkpIHsKKwkJb3NtX2VycigiY2FuJ3QgcmVnaXN0ZXIgY2xhc3MgaTJvX2NvbnRyb2xsZXJcbiIpOwogCQlnb3RvIGRldmljZV9leGl0OworCX0KIAotCXJjID0gaTJvX2V4ZWNfaW5pdCgpOwotCWlmIChyYykKKwlpZiAoKHJjID0gaTJvX2RyaXZlcl9pbml0KCkpKQorCQlnb3RvIGNsYXNzX2V4aXQ7CisKKwlpZiAoKHJjID0gaTJvX2V4ZWNfaW5pdCgpKSkKIAkJZ290byBkcml2ZXJfZXhpdDsKIAotCXJjID0gaTJvX3BjaV9pbml0KCk7Ci0JaWYgKHJjIDwgMCkKKwlpZiAoKHJjID0gaTJvX3BjaV9pbml0KCkpKQogCQlnb3RvIGV4ZWNfZXhpdDsKIAogCXJldHVybiAwOwpAQCAtMTI4NCw2ICsxMjcyLDkgQEAKICAgICAgIGRyaXZlcl9leGl0OgogCWkyb19kcml2ZXJfZXhpdCgpOwogCisgICAgICBjbGFzc19leGl0OgorCWNsYXNzX3VucmVnaXN0ZXIoJmkyb19jb250cm9sbGVyX2NsYXNzKTsKKwogICAgICAgZGV2aWNlX2V4aXQ6CiAJaTJvX2RldmljZV9leGl0KCk7CiAKQEAgLTEzMDEsNiArMTI5Miw3IEBACiAJaTJvX3BjaV9leGl0KCk7CiAJaTJvX2V4ZWNfZXhpdCgpOwogCWkyb19kcml2ZXJfZXhpdCgpOworCWNsYXNzX3VucmVnaXN0ZXIoJmkyb19jb250cm9sbGVyX2NsYXNzKTsKIAlpMm9fZGV2aWNlX2V4aXQoKTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jCmluZGV4IGU3NzI3NTIuLjdhNjBmZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vcGNpLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwpAQCAtMzAsNTMgKzMwLDE4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJvLmg+Ci0KLSNpZmRlZiBDT05GSUdfTVRSUgotI2luY2x1ZGUgPGFzbS9tdHJyLmg+Ci0jZW5kaWYJCQkJLy8gQ09ORklHX01UUlIKLQotLyogTW9kdWxlIGludGVybmFsIGZ1bmN0aW9ucyBmcm9tIG90aGVyIHNvdXJjZXMgKi8KLWV4dGVybiBzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmkyb19pb3BfYWxsb2Modm9pZCk7Ci1leHRlcm4gdm9pZCBpMm9faW9wX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICopOwotCi1leHRlcm4gaW50IGkyb19pb3BfYWRkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKLWV4dGVybiB2b2lkIGkyb19pb3BfcmVtb3ZlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKLQotZXh0ZXJuIGludCBpMm9fZHJpdmVyX2Rpc3BhdGNoKHN0cnVjdCBpMm9fY29udHJvbGxlciAqLCB1MzIsCi0JCQkgICAgICAgc3RydWN0IGkyb19tZXNzYWdlICopOworI2luY2x1ZGUgImNvcmUuaCIKIAogLyogUENJIGRldmljZSBpZCB0YWJsZSBmb3IgYWxsIEkyTyBjb250cm9sbGVycyAqLwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9fZGV2aW5pdGRhdGEgaTJvX3BjaV9pZHNbXSA9IHsKIAl7UENJX0RFVklDRV9DTEFTUyhQQ0lfQ0xBU1NfSU5URUxMSUdFTlRfSTJPIDw8IDgsIDB4ZmZmZjAwKX0sCiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9EUFQsIDB4YTUxMSl9LAorCXsudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwuZGV2aWNlID0gMHgxOTYyLAorCSAuc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9QUk9NSVNFLC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lEfSwKIAl7MH0KIH07CiAKIC8qKgotICoJaTJvX2RtYV9yZWFsbG9jIC0gUmVhbGxvYyBETUEgbWVtb3J5Ci0gKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCi0gKglAYWRkcjogcG9pbnRlciB0byBhIGkyb19kbWEgc3RydWN0IERNQSBidWZmZXIKLSAqCUBsZW46IG5ldyBsZW5ndGggb2YgbWVtb3J5Ci0gKglAZ2ZwX21hc2s6IEdGUCBtYXNrCi0gKgotICoJSWYgdGhlcmUgd2FzIHNvbWV0aGluZyBhbGxvY2F0ZWQgaW4gdGhlIGFkZHIsIGZyZWUgaXQgZmlyc3QuIElmIGxlbiA+IDAKLSAqCXRoYW4gdHJ5IHRvIGFsbG9jYXRlIGl0IGFuZCB3cml0ZSB0aGUgYWRkcmVzc2VzIGJhY2sgdG8gdGhlIGFkZHIKLSAqCXN0cnVjdHVyZS4gSWYgbGVuID09IDAgc2V0IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gTlVMTC4KLSAqCi0gKglSZXR1cm5zIHRoZSAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1pbnQgaTJvX2RtYV9yZWFsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIsIHNpemVfdCBsZW4sCi0JCSAgICB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCi17Ci0JaTJvX2RtYV9mcmVlKGRldiwgYWRkcik7Ci0KLQlpZiAobGVuKQotCQlyZXR1cm4gaTJvX2RtYV9hbGxvYyhkZXYsIGFkZHIsIGxlbiwgZ2ZwX21hc2spOwotCi0JcmV0dXJuIDA7Ci19OwotCi0vKioKICAqCWkyb19wY2lfZnJlZSAtIEZyZWVzIHRoZSBETUEgbWVtb3J5IGZvciB0aGUgSTJPIGNvbnRyb2xsZXIKICAqCUBjOiBJMk8gY29udHJvbGxlciB0byBmcmVlCiAgKgpAQCAtOTEsMTkgKzU2LDExIEBACiAKIAlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+b3V0X3F1ZXVlKTsKIAlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+c3RhdHVzX2Jsb2NrKTsKLQlpZiAoYy0+bGN0KQotCQlrZnJlZShjLT5sY3QpOworCWtmcmVlKGMtPmxjdCk7CiAJaTJvX2RtYV9mcmVlKGRldiwgJmMtPmRsY3QpOwogCWkyb19kbWFfZnJlZShkZXYsICZjLT5ocnQpOwogCWkyb19kbWFfZnJlZShkZXYsICZjLT5zdGF0dXMpOwogCi0jaWZkZWYgQ09ORklHX01UUlIKLQlpZiAoYy0+bXRycl9yZWcwID49IDApCi0JCW10cnJfZGVsKGMtPm10cnJfcmVnMCwgMCwgMCk7Ci0JaWYgKGMtPm10cnJfcmVnMSA+PSAwKQotCQltdHJyX2RlbChjLT5tdHJyX3JlZzEsIDAsIDApOwotI2VuZGlmCi0KIAlpZiAoYy0+cmFwdG9yICYmIGMtPmluX3F1ZXVlLnZpcnQpCiAJCWlvdW5tYXAoYy0+aW5fcXVldWUudmlydCk7CiAKQEAgLTE3OCwxNCArMTM1LDE1IEBACiAJCSAgICAgICBjLT5uYW1lLCAodW5zaWduZWQgbG9uZyljLT5iYXNlLnBoeXMsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZyljLT5iYXNlLmxlbik7CiAKLQljLT5iYXNlLnZpcnQgPSBpb3JlbWFwKGMtPmJhc2UucGh5cywgYy0+YmFzZS5sZW4pOworCWMtPmJhc2UudmlydCA9IGlvcmVtYXBfbm9jYWNoZShjLT5iYXNlLnBoeXMsIGMtPmJhc2UubGVuKTsKIAlpZiAoIWMtPmJhc2UudmlydCkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gbWFwIGNvbnRyb2xsZXIuXG4iLCBjLT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJaWYgKGMtPnJhcHRvcikgewotCQljLT5pbl9xdWV1ZS52aXJ0ID0gaW9yZW1hcChjLT5pbl9xdWV1ZS5waHlzLCBjLT5pbl9xdWV1ZS5sZW4pOworCQljLT5pbl9xdWV1ZS52aXJ0ID0KKwkJICAgIGlvcmVtYXBfbm9jYWNoZShjLT5pbl9xdWV1ZS5waHlzLCBjLT5pbl9xdWV1ZS5sZW4pOwogCQlpZiAoIWMtPmluX3F1ZXVlLnZpcnQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBtYXAgY29udHJvbGxlci5cbiIsCiAJCQkgICAgICAgYy0+bmFtZSk7CkBAIC0xOTUsNDMgKzE1MywxMCBAQAogCX0gZWxzZQogCQljLT5pbl9xdWV1ZSA9IGMtPmJhc2U7CiAKLQljLT5pcnFfbWFzayA9IGMtPmJhc2UudmlydCArIDB4MzQ7Ci0JYy0+cG9zdF9wb3J0ID0gYy0+YmFzZS52aXJ0ICsgMHg0MDsKLQljLT5yZXBseV9wb3J0ID0gYy0+YmFzZS52aXJ0ICsgMHg0NDsKLQotI2lmZGVmIENPTkZJR19NVFJSCi0JLyogRW5hYmxlIFdyaXRlIENvbWJpbmluZyBNVFJSIGZvciBJT1AncyBtZW1vcnkgcmVnaW9uICovCi0JYy0+bXRycl9yZWcwID0gbXRycl9hZGQoYy0+aW5fcXVldWUucGh5cywgYy0+aW5fcXVldWUubGVuLAotCQkJCU1UUlJfVFlQRV9XUkNPTUIsIDEpOwotCWMtPm10cnJfcmVnMSA9IC0xOwotCi0JaWYgKGMtPm10cnJfcmVnMCA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgZW5hYmxlIHdyaXRlIGNvbWJpbmluZyAiCi0JCSAgICAgICAiTVRSUlxuIiwgYy0+bmFtZSk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICIlczogdXNpbmcgd3JpdGUgY29tYmluaW5nIE1UUlJcbiIsIGMtPm5hbWUpOwotCi0JLyoKLQkgKiBJZiBpdCBpcyBhbiBJTlRFTCBpOTYwIEkvTyBwcm9jZXNzb3IgdGhlbiBzZXQgdGhlIGZpcnN0IDY0SyB0bwotCSAqIFVuY2FjaGVhYmxlIHNpbmNlIHRoZSByZWdpb24gY29udGFpbnMgdGhlIG1lc3NhZ2luZyB1bml0IHdoaWNoCi0JICogc2hvdWxkbid0IGJlIGNhY2hlZC4KLQkgKi8KLQlpZiAoKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMIHx8Ci0JICAgICBwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9EUFQpICYmICFjLT5yYXB0b3IpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IE1UUlIgd29ya2Fyb3VuZCBmb3IgSW50ZWwgaTk2MCBwcm9jZXNzb3IiCi0JCSAgICAgICAiXG4iLCBjLT5uYW1lKTsKLQkJYy0+bXRycl9yZWcxID0gbXRycl9hZGQoYy0+YmFzZS5waHlzLCAweDEwMDAwLAotCQkJCQlNVFJSX1RZUEVfVU5DQUNIQUJMRSwgMSk7Ci0KLQkJaWYgKGMtPm10cnJfcmVnMSA8IDApIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBFcnJvciBpbiBzZXR0aW5nICIKLQkJCSAgICAgICAiTVRSUl9UWVBFX1VOQ0FDSEFCTEVcbiIsIGMtPm5hbWUpOwotCQkJbXRycl9kZWwoYy0+bXRycl9yZWcwLCBjLT5pbl9xdWV1ZS5waHlzLAotCQkJCSBjLT5pbl9xdWV1ZS5sZW4pOwotCQkJYy0+bXRycl9yZWcwID0gLTE7Ci0JCX0KLQl9Ci0jZW5kaWYKKwljLT5pcnFfc3RhdHVzID0gYy0+YmFzZS52aXJ0ICsgSTJPX0lSUV9TVEFUVVM7CisJYy0+aXJxX21hc2sgPSBjLT5iYXNlLnZpcnQgKyBJMk9fSVJRX01BU0s7CisJYy0+aW5fcG9ydCA9IGMtPmJhc2UudmlydCArIEkyT19JTl9QT1JUOworCWMtPm91dF9wb3J0ID0gYy0+YmFzZS52aXJ0ICsgSTJPX09VVF9QT1JUOwogCiAJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+c3RhdHVzLCA4LCBHRlBfS0VSTkVMKSkgewogCQlpMm9fcGNpX2ZyZWUoYyk7CkBAIC0yNTQsNyArMTc5LDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJmMtPm91dF9xdWV1ZSwgTVNHX1BPT0xfU0laRSwgR0ZQX0tFUk5FTCkpIHsKKwlpZiAoaTJvX2RtYV9hbGxvYworCSAgICAoZGV2LCAmYy0+b3V0X3F1ZXVlLAorCSAgICAgSTJPX01BWF9PVVRCT1VORF9NU0dfRlJBTUVTICogSTJPX09VVEJPVU5EX01TR19GUkFNRV9TSVpFICoKKwkgICAgIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKSkgewogCQlpMm9fcGNpX2ZyZWUoYyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTI3Niw1MSArMjA0LDMwIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgaTJvX3BjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcikKIHsKIAlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBkZXZfaWQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmMtPnBkZXYtPmRldjsKLQlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm07Ci0JdTMyIG12OworCXUzMiBtOworCWlycXJldHVybl90IHJjID0gSVJRX05PTkU7CiAKLQkvKgotCSAqIE9sZCA5NjAgc3RlcHBpbmdzIGhhZCBhIGJ1ZyBpbiB0aGUgSTJPIHVuaXQgdGhhdCBjYXVzZWQKLQkgKiB0aGUgcXVldWUgdG8gYXBwZWFyIGVtcHR5IHdoZW4gaXQgd2Fzbid0LgotCSAqLwotCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKLQlpZiAobXYgPT0gSTJPX1FVRVVFX0VNUFRZKSB7Ci0JCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKLQkJaWYgKHVubGlrZWx5KG12ID09IEkyT19RVUVVRV9FTVBUWSkpIHsKLQkJCXJldHVybiBJUlFfTk9ORTsKLQkJfSBlbHNlCi0JCQlwcl9kZWJ1ZygiJXM6IDk2MCBidWcgZGV0ZWN0ZWRcbiIsIGMtPm5hbWUpOwotCX0KLQotCXdoaWxlIChtdiAhPSBJMk9fUVVFVUVfRU1QVFkpIHsKLQkJLyoKLQkJICogTWFwIHRoZSBtZXNzYWdlIGZyb20gdGhlIHBhZ2UgZnJhbWUgbWFwIHRvIGtlcm5lbCB2aXJ0dWFsLgotCQkgKiBCZWNhdXNlIGJ1c190b192aXJ0IGlzIGRlcHJlY2F0ZWQsIHdlIGhhdmUgY2FsY3VsYXRlIHRoZQotCQkgKiBsb2NhdGlvbiBieSBvdXJzZWxmIQotCQkgKi8KLQkJbSA9IGkyb19tc2dfb3V0X3RvX3ZpcnQoYywgbXYpOwotCi0JCS8qCi0JCSAqICAgICAgRW5zdXJlIHRoaXMgbWVzc2FnZSBpcyBzZWVuIGNvaGVyZW50bHkgYnV0IGNhY2hhYmx5IGJ5Ci0JCSAqICAgICAgdGhlIHByb2Nlc3NvcgotCQkgKi8KLQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2LCBtdiwgTVNHX0ZSQU1FX1NJWkUgKiA0LAotCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXdoaWxlIChyZWFkbChjLT5pcnFfc3RhdHVzKSAmIEkyT19JUlFfT1VUQk9VTkRfUE9TVCkgeworCQltID0gcmVhZGwoYy0+b3V0X3BvcnQpOworCQlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpIHsKKwkJCS8qCisJCQkgKiBPbGQgOTYwIHN0ZXBwaW5ncyBoYWQgYSBidWcgaW4gdGhlIEkyTyB1bml0IHRoYXQKKwkJCSAqIGNhdXNlZCB0aGUgcXVldWUgdG8gYXBwZWFyIGVtcHR5IHdoZW4gaXQgd2Fzbid0LgorCQkJICovCisJCQltID0gcmVhZGwoYy0+b3V0X3BvcnQpOworCQkJaWYgKHVubGlrZWx5KG0gPT0gSTJPX1FVRVVFX0VNUFRZKSkKKwkJCQlicmVhazsKKwkJfQogCiAJCS8qIGRpc3BhdGNoIGl0ICovCi0JCWlmIChpMm9fZHJpdmVyX2Rpc3BhdGNoKGMsIG12LCBtKSkKKwkJaWYgKGkyb19kcml2ZXJfZGlzcGF0Y2goYywgbSkpCiAJCQkvKiBmbHVzaCBpdCBpZiByZXN1bHQgIT0gMCAqLwotCQkJaTJvX2ZsdXNoX3JlcGx5KGMsIG12KTsKKwkJCWkyb19mbHVzaF9yZXBseShjLCBtKTsKIAotCQkvKgotCQkgKiBUaGF0IDk2MCBidWcgYWdhaW4uLi4KLQkJICovCi0JCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKLQkJaWYgKG12ID09IEkyT19RVUVVRV9FTVBUWSkKLQkJCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwkJcmMgPSBJUlFfSEFORExFRDsKIAl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTMzNiw3ICsyNDMsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYy0+cGRldjsKIAlpbnQgcmM7CiAKLQlJMk9fSVJRX1dSSVRFMzIoYywgMHhmZmZmZmZmZik7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIGMtPmlycV9tYXNrKTsKIAogCWlmIChwZGV2LT5pcnEpIHsKIAkJcmMgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGkyb19wY2lfaW50ZXJydXB0LCBTQV9TSElSUSwKQEAgLTM0OCw3ICsyNTUsNyBAQAogCQl9CiAJfQogCi0JSTJPX0lSUV9XUklURTMyKGMsIDB4MDAwMDAwMDApOworCXdyaXRlbCgweDAwMDAwMDAwLCBjLT5pcnFfbWFzayk7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogSW5zdGFsbGVkIGF0IElSUSAlZFxuIiwgYy0+bmFtZSwgcGRldi0+aXJxKTsKIApAQCAtMzYzLDcgKzI3MCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGkyb19wY2lfaXJxX2Rpc2FibGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQogewotCUkyT19JUlFfV1JJVEUzMihjLCAweGZmZmZmZmZmKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgYy0+aXJxX21hc2spOwogCiAJaWYgKGMtPnBkZXYtPmlycSA+IDApCiAJCWZyZWVfaXJxKGMtPnBkZXYtPmlycSwgYyk7CkBAIC0zODUsMjggKzI5MiwyNSBAQAogewogCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKIAlpbnQgcmM7CisJc3RydWN0IHBjaV9kZXYgKmk5NjAgPSBOVUxMOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBDaGVja2luZyBmb3IgUENJIEkyTyBjb250cm9sbGVycy4uLlxuIik7CiAKIAlpZiAoKHBkZXYtPmNsYXNzICYgMHhmZikgPiAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgZm91bmQgYnV0IGRvZXMgbm90ICIKLQkJICAgICAgICJzdXBwb3J0IEkyTyAxLjUgKHNraXBwaW5nKS5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86ICVzIGRvZXMgbm90IHN1cHBvcnQgSTJPIDEuNSAiCisJCSAgICAgICAiKHNraXBwaW5nKS5cbiIsIHBjaV9uYW1lKHBkZXYpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKChyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IEkyTyBjb250cm9sbGVyIGZvdW5kIGJ1dCBjb3VsZCBub3QgYmUiCi0JCSAgICAgICAiIGVuYWJsZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJvOiBjb3VsZG4ndCBlbmFibGUgZGV2aWNlICVzXG4iLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCQlyZXR1cm4gcmM7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBJMk8gY29udHJvbGxlciBmb3VuZCBvbiBidXMgJWQgYXQgJWQuXG4iLAotCSAgICAgICBwZGV2LT5idXMtPm51bWJlciwgcGRldi0+ZGV2Zm4pOwotCiAJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImkybzogSTJPIGNvbnRyb2xsZXIgb24gYnVzICVkIGF0ICVkOiBObyAiCi0JCSAgICAgICAic3VpdGFibGUgRE1BIGF2YWlsYWJsZSFcbiIsIHBkZXYtPmJ1cy0+bnVtYmVyLAotCQkgICAgICAgcGRldi0+ZGV2Zm4pOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IG5vIHN1aXRhYmxlIERNQSBmb3VuZCBmb3IgJXNcbiIsCisJCSAgICAgICBwY2lfbmFtZShwZGV2KSk7CiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBkaXNhYmxlOwogCX0KQEAgLTQxNSwxNCArMzE5LDE2IEBACiAKIAljID0gaTJvX2lvcF9hbGxvYygpOwogCWlmIChJU19FUlIoYykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IG1lbW9yeSBmb3IgSTJPIGNvbnRyb2xsZXIgY291bGQgbm90IGJlICIKLQkJICAgICAgICJhbGxvY2F0ZWRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImkybzogY291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlc1xuIiwKKwkJICAgICAgIHBjaV9uYW1lKHBkZXYpKTsKIAkJcmMgPSBQVFJfRVJSKGMpOwogCQlnb3RvIGRpc2FibGU7Ci0JfQorCX0gZWxzZQorCQlwcmludGsoS0VSTl9JTkZPICIlczogY29udHJvbGxlciBmb3VuZCAoJXMpXG4iLCBjLT5uYW1lLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCiAJYy0+cGRldiA9IHBkZXY7Ci0JYy0+ZGV2aWNlID0gcGRldi0+ZGV2OworCWMtPmRldmljZS5wYXJlbnQgPSBnZXRfZGV2aWNlKCZwZGV2LT5kZXYpOwogCiAJLyogQ2FyZHMgdGhhdCBmYWxsIGFwYXJ0IGlmIHlvdSBoaXQgdGhlbSB3aXRoIGxhcmdlIEkvTyBsb2Fkcy4uLiAqLwogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OQ1IgJiYgcGRldi0+ZGV2aWNlID09IDB4MDYzMCkgewpAQCAtNDMyLDE2ICszMzgsNDggQEAKIAl9CiAKIAlpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1BST01JU0UpIHsKKwkJLyoKKwkJICogRXhwb3NlIHRoZSBzaGlwIGJlaGluZCBpOTYwIGZvciBpbml0aWFsaXphdGlvbiwgb3IgaXQgd2lsbAorCQkgKiBmYWlsZWQKKwkJICovCisJCWk5NjAgPQorCQkgICAgcGNpX2ZpbmRfc2xvdChjLT5wZGV2LT5idXMtPm51bWJlciwKKwkJCQkgIFBDSV9ERVZGTihQQ0lfU0xPVChjLT5wZGV2LT5kZXZmbiksIDApKTsKKworCQlpZiAoaTk2MCkKKwkJCXBjaV93cml0ZV9jb25maWdfd29yZChpOTYwLCAweDQyLCAwKTsKKwogCQljLT5wcm9taXNlID0gMTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFByb21pc2Ugd29ya2Fyb3VuZHMgYWN0aXZhdGVkLlxuIiwKLQkJICAgICAgIGMtPm5hbWUpOworCQljLT5saW1pdF9zZWN0b3JzID0gMTsKIAl9CiAKKwlpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RQVCkKKwkJYy0+YWRhcHRlYyA9IDE7CisKIAkvKiBDYXJkcyB0aGF0IGdvIGJhbmFuYXMgaWYgeW91IHF1aWVzY2UgdGhlbSBiZWZvcmUgeW91IHJlc2V0IHRoZW0uICovCiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RQVCkgewogCQljLT5ub19xdWllc2NlID0gMTsKIAkJaWYgKHBkZXYtPmRldmljZSA9PSAweGE1MTEpCiAJCQljLT5yYXB0b3IgPSAxOworCisJCWlmIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4YzA1YSkgeworCQkJYy0+bGltaXRfc2VjdG9ycyA9IDE7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIiVzOiBsaW1pdCBzZWN0b3JzIHBlciByZXF1ZXN0IHRvICVkXG4iLCBjLT5uYW1lLAorCQkJICAgICAgIEkyT19NQVhfU0VDVE9SU19MSU1JVEVEKTsKKwkJfQorI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUNfRE1BNjQKKwkJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpIHsKKwkJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogNjQtYml0IERNQSB1bmF2YWlsYWJsZVxuIiwKKwkJCQkgICAgICAgYy0+bmFtZSk7CisJCQllbHNlIHsKKwkJCQljLT5wYWVfc3VwcG9ydCA9IDE7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVzaW5nIDY0LWJpdCBETUFcbiIsCisJCQkJICAgICAgIGMtPm5hbWUpOworCQkJfQorCQl9CisjZW5kaWYKIAl9CiAKIAlpZiAoKHJjID0gaTJvX3BjaV9hbGxvYyhjKSkpIHsKQEAgLTQ1OSw2ICszOTcsMTEgQEAKIAlpZiAoKHJjID0gaTJvX2lvcF9hZGQoYykpKQogCQlnb3RvIHVuaW5zdGFsbDsKIAorCWdldF9kZXZpY2UoJmMtPmRldmljZSk7CisKKwlpZiAoaTk2MCkKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGk5NjAsIDB4NDIsIDB4MDNmZik7CisKIAlyZXR1cm4gMDsKIAogICAgICAgdW5pbnN0YWxsOgpAQCAtNDY5LDYgKzQxMiw3IEBACiAKICAgICAgIGZyZWVfY29udHJvbGxlcjoKIAlpMm9faW9wX2ZyZWUoYyk7CisJcHV0X2RldmljZShjLT5kZXZpY2UucGFyZW50KTsKIAogICAgICAgZGlzYWJsZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CkBAIC00OTIsMTUgKzQzNiwxNyBAQAogCWkyb19wY2lfaXJxX2Rpc2FibGUoYyk7CiAJaTJvX3BjaV9mcmVlKGMpOwogCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IENvbnRyb2xsZXIgcmVtb3ZlZC5cbiIsIGMtPm5hbWUpOwogCi0JaTJvX2lvcF9mcmVlKGMpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwdXRfZGV2aWNlKGMtPmRldmljZS5wYXJlbnQpOworCXB1dF9kZXZpY2UoJmMtPmRldmljZSk7CiB9OwogCiAvKiBQQ0kgZHJpdmVyIGZvciBJMk8gY29udHJvbGxlciAqLwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGkyb19wY2lfZHJpdmVyID0gewotCS5uYW1lID0gIkkyTyBjb250cm9sbGVyIiwKKwkubmFtZSA9ICJQQ0lfSTJPIiwKIAkuaWRfdGFibGUgPSBpMm9fcGNpX2lkcywKIAkucHJvYmUgPSBpMm9fcGNpX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpMm9fcGNpX3JlbW92ZSksCkBAIC01MjMsNiArNDY5LDQgQEAKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmkyb19wY2lfZHJpdmVyKTsKIH07Ci0KLUVYUE9SVF9TWU1CT0woaTJvX2RtYV9yZWFsbG9jKTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpMm9fcGNpX2lkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCmluZGV4IDRjZWNkYWYuLjdmYzY5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWlzYy9LY29uZmlnCkBAIC02LDggKzYsNyBAQAogCiBjb25maWcgSUJNX0FTTQogCXRyaXN0YXRlICJEZXZpY2UgZHJpdmVyIGZvciBJQk0gUlNBIHNlcnZpY2UgcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gWDg2ICYmIEVYUEVSSU1FTlRBTAotCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gWDg2ICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldmljZSBkcml2ZXIgc3VwcG9ydCBmb3IgaW4tYmFuZCBhY2Nlc3MgdG8gdGhlCiAJICBJQk0gUlNBIChDb25kb3IpIHNlcnZpY2UgcHJvY2Vzc29yIGluIGVTZXJ2ZXIgeFNlcmllcyBzeXN0ZW1zLgpAQCAtMjIsNyArMjEsNyBAQAogCSAgCiAJICBXQVJOSU5HOiBUaGlzIHNvZnR3YXJlIG1heSBub3QgYmUgc3VwcG9ydGVkIG9yIGZ1bmN0aW9uCiAJICBjb3JyZWN0bHkgb24geW91ciBJQk0gc2VydmVyLiBQbGVhc2UgY29uc3VsdCB0aGUgSUJNIFNlcnZlclByb3ZlbgotCSAgd2Vic2l0ZSA8aHR0cDovL3d3dy5wYy5pYm0vd3cvZXNlcnZlci94c2VyaWVzL3NlcnZlcnByb3Zlbj4gZm9yCisJICB3ZWJzaXRlIDxodHRwOi8vd3d3LnBjLmlibS5jb20vd3cvZXNlcnZlci94c2VyaWVzL3NlcnZlcnByb3Zlbj4gZm9yCiAJICBpbmZvcm1hdGlvbiBvbiB0aGUgc3BlY2lmaWMgZHJpdmVyIGxldmVsIGFuZCBzdXBwb3J0IHN0YXRlbWVudAogCSAgZm9yIHlvdXIgSUJNIHNlcnZlci4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvbW1jaS5jIGIvZHJpdmVycy9tbWMvbW1jaS5jCmluZGV4IDNhNWY2YWMuLjdhNDI5NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL21tY2kuYworKysgYi9kcml2ZXJzL21tYy9tbWNpLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9wcm90b2NvbC5oPgogCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgpAQCAtNzAsNiArNzEsNyBAQAogc3RhdGljIHZvaWQgbW1jaV9zdGFydF9kYXRhKHN0cnVjdCBtbWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgZGF0YWN0cmwsIHRpbWVvdXQsIGlycW1hc2s7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsa3M7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCiAJREJHKGhvc3QsICJibGtzeiAlMDR4IGJsa3MgJTA0eCBmbGFncyAlMDh4XG4iLApAQCAtODEsOSArODMsMTAgQEAKIAogCW1tY2lfaW5pdF9zZyhob3N0LCBkYXRhKTsKIAotCXRpbWVvdXQgPSBkYXRhLT50aW1lb3V0X2Nsa3MgKwotCQkgICgodW5zaWduZWQgbG9uZyBsb25nKWRhdGEtPnRpbWVvdXRfbnMgKiBob3N0LT5jY2xrKSAvCi0JCSAgIDEwMDAwMDAwMDBVTEw7CisJY2xrcyA9ICh1bnNpZ25lZCBsb25nIGxvbmcpZGF0YS0+dGltZW91dF9ucyAqIGhvc3QtPmNjbGs7CisJZG9fZGl2KGNsa3MsIDEwMDAwMDAwMDBVTCk7CisKKwl0aW1lb3V0ID0gZGF0YS0+dGltZW91dF9jbGtzICsgKHVuc2lnbmVkIGludCljbGtzOwogCiAJYmFzZSA9IGhvc3QtPmJhc2U7CiAJd3JpdGVsKHRpbWVvdXQsIGJhc2UgKyBNTUNJREFUQVRJTUVSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3dic2QuYyBiL2RyaXZlcnMvbW1jL3dic2QuYwppbmRleCBiN2ZiZDMwLi4wYzQxZDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy93YnNkLmMKKysrIGIvZHJpdmVycy9tbWMvd2JzZC5jCkBAIC01NCwyOCArNTQsNiBAQAogI2RlZmluZSBEQkdGKHguLi4pCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01NQ19ERUJVRwotdm9pZCBEQkdfUkVHKGludCByZWcsIHU4IHZhbHVlKQotewotCWludCBpOwotCQotCXByaW50ayhLRVJOX0RFQlVHICJ3YnNkOiBSZWdpc3RlciAlZDogMHglMDJYICUzZCAnJWMnICIsCi0JCXJlZywgKGludCl2YWx1ZSwgKGludCl2YWx1ZSwgKHZhbHVlIDwgMHgyMCk/Jy4nOnZhbHVlKTsKLQkKLQlmb3IgKGkgPSA3O2kgPj0gMDtpLS0pCi0JewotCQlpZiAodmFsdWUgJiAoMSA8PCBpKSkKLQkJCXByaW50aygieCIpOwotCQllbHNlCi0JCQlwcmludGsoIi4iKTsKLQl9Ci0JCi0JcHJpbnRrKCJcbiIpOwotfQotI2Vsc2UKLSNkZWZpbmUgREJHX1JFRyhyLCB2KSBkbyB7fSAgd2hpbGUgKDApCi0jZW5kaWYKLQogLyoKICAqIERldmljZSByZXNvdXJjZXMKICAqLwpAQCAtOTIsNiArNzAsMTMgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KIAorc3RhdGljIGNvbnN0IGludCBjb25maWdfcG9ydHNbXSA9IHsgMHgyRSwgMHg0RSB9Oworc3RhdGljIGNvbnN0IGludCB1bmxvY2tfY29kZXNbXSA9IHsgMHg4MywgMHg4NyB9OworCitzdGF0aWMgY29uc3QgaW50IHZhbGlkX2lkc1tdID0geworCTB4NzExMiwKKwl9OworCiAjaWZkZWYgQ09ORklHX1BOUAogc3RhdGljIHVuc2lnbmVkIGludCBub3BucCA9IDA7CiAjZWxzZQpAQCAtMTA1MSw2ICsxMDM2LDIwIEBACiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGNhcmQgZGV0ZWN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHdic2RfZGV0ZWN0X2NhcmQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB3YnNkX2hvc3QgKmhvc3QgPSAoc3RydWN0IHdic2RfaG9zdCopZGF0YTsKKwkKKwlCVUdfT04oaG9zdCA9PSBOVUxMKTsKKwkKKwlEQkcoIkV4ZWN1dGluZyBjYXJkIGRldGVjdGlvblxuIik7CisJCisJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jKTsJCit9CisKKy8qCiAgKiBUYXNrbGV0cwogICovCiAKQEAgLTEwNzUsNyArMTA3NCw2IEBACiB7CiAJc3RydWN0IHdic2RfaG9zdCogaG9zdCA9IChzdHJ1Y3Qgd2JzZF9ob3N0KilwYXJhbTsKIAl1OCBjc3I7Ci0JaW50IGNoYW5nZSA9IDA7CiAJCiAJc3Bpbl9sb2NrKCZob3N0LT5sb2NrKTsKIAkKQEAgLTEwOTQsMTQgKzEwOTIsMjAgQEAKIAkJewogCQkJREJHKCJDYXJkIGluc2VydGVkXG4iKTsKIAkJCWhvc3QtPmZsYWdzIHw9IFdCU0RfRkNBUkRfUFJFU0VOVDsKLQkJCWNoYW5nZSA9IDE7CisJCQkKKwkJCS8qCisJCQkgKiBEZWxheSBjYXJkIGRldGVjdGlvbiB0byBhbGxvdyBlbGVjdHJpY2FsIGNvbm5lY3Rpb25zCisJCQkgKiB0byBzdGFiaWxpc2UuCisJCQkgKi8KKwkJCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyBIWi8yKTsKIAkJfQorCQkKKwkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCX0KIAllbHNlIGlmIChob3N0LT5mbGFncyAmIFdCU0RfRkNBUkRfUFJFU0VOVCkKIAl7CiAJCURCRygiQ2FyZCByZW1vdmVkXG4iKTsKIAkJaG9zdC0+ZmxhZ3MgJj0gfldCU0RfRkNBUkRfUFJFU0VOVDsKLQkJY2hhbmdlID0gMTsKIAkJCiAJCWlmIChob3N0LT5tcnEpCiAJCXsKQEAgLTExMTIsMTUgKzExMTYsMTQgQEAKIAkJCWhvc3QtPm1ycS0+Y21kLT5lcnJvciA9IE1NQ19FUlJfRkFJTEVEOwogCQkJdGFza2xldF9zY2hlZHVsZSgmaG9zdC0+ZmluaXNoX3Rhc2tsZXQpOwogCQl9Ci0JfQotCQotCS8qCi0JICogVW5sb2NrIGZpcnN0IHNpbmNlIHdlIG1pZ2h0IGdldCBhIGNhbGwgYmFjay4KLQkgKi8KLQlzcGluX3VubG9jaygmaG9zdC0+bG9jayk7CisJCQorCQkvKgorCQkgKiBVbmxvY2sgZmlyc3Qgc2luY2Ugd2UgbWlnaHQgZ2V0IGEgY2FsbCBiYWNrLgorCQkgKi8KKwkJc3Bpbl91bmxvY2soJmhvc3QtPmxvY2spOwogCi0JaWYgKGNoYW5nZSkKIAkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIHdic2RfdGFza2xldF9maWZvKHVuc2lnbmVkIGxvbmcgcGFyYW0pCkBAIC0xMzI1LDYgKzEzMjgsMTMgQEAKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CiAJCiAJLyoKKwkgKiBTZXQgdXAgZGV0ZWN0aW9uIHRpbWVyCisJICovCisJaW5pdF90aW1lcigmaG9zdC0+dGltZXIpOworCWhvc3QtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylob3N0OworCWhvc3QtPnRpbWVyLmZ1bmN0aW9uID0gd2JzZF9kZXRlY3RfY2FyZDsKKwkKKwkvKgogCSAqIE1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzLiBXb3JzdCBjYXNlIGlzIG9uZSBzZWN0b3IgcGVyIHNlZ21lbnQKIAkgKiBzbyB0aGlzIHdpbGwgYmUgNjRrQi81MTIuCiAJICovCkBAIC0xMzUxLDExICsxMzYxLDE3IEBACiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2JzZF9mcmVlX21tYyhzdHJ1Y3QgZGV2aWNlKiBkZXYpCiB7CiAJc3RydWN0IG1tY19ob3N0KiBtbWM7CisJc3RydWN0IHdic2RfaG9zdCogaG9zdDsKIAkKIAltbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpZiAoIW1tYykKIAkJcmV0dXJuOwogCQorCWhvc3QgPSBtbWNfcHJpdihtbWMpOworCUJVR19PTihob3N0ID09IE5VTEwpOworCQorCWRlbF90aW1lcl9zeW5jKCZob3N0LT50aW1lcik7CisJCiAJbW1jX2ZyZWVfaG9zdChtbWMpOwogCQogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvd2JzZC5oIGIvZHJpdmVycy9tbWMvd2JzZC5oCmluZGV4IDg2NGYzMDgyLi42NjFhOWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy93YnNkLmgKKysrIGIvZHJpdmVycy9tbWMvd2JzZC5oCkBAIC04LDEzICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLWNvbnN0IGludCBjb25maWdfcG9ydHNbXSA9IHsgMHgyRSwgMHg0RSB9OwotY29uc3QgaW50IHVubG9ja19jb2Rlc1tdID0geyAweDgzLCAweDg3IH07Ci0KLWNvbnN0IGludCB2YWxpZF9pZHNbXSA9IHsKLQkweDcxMTIsCi0JfTsKLQogI2RlZmluZSBMT0NLX0NPREUJCTB4QUEKIAogI2RlZmluZSBXQlNEX0NPTkZfU1dSU1QJCTB4MDIKQEAgLTE4Nyw0ICsxODAsNiBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0aW1lb3V0X3Rhc2tsZXQ7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CWZpbmlzaF90YXNrbGV0OwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlibG9ja190YXNrbGV0OworCQorCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwkJLyogQ2FyZCBkZXRlY3Rpb24gdGltZXIgKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9hZnMuYyBiL2RyaXZlcnMvbXRkL2Fmcy5jCmluZGV4IDgwMWU2YzcuLjczNjNlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2Fmcy5jCisrKyBiL2RyaXZlcnMvbXRkL2Fmcy5jCkBAIC0yMTksNyArMjE5LDcgQEAKIAkgKi8KIAlmb3IgKGlkeCA9IG9mZiA9IDA7IG9mZiA8IG10ZC0+c2l6ZTsgb2ZmICs9IG10ZC0+ZXJhc2VzaXplKSB7CiAJCXN0cnVjdCBpbWFnZV9pbmZvX3N0cnVjdCBpaXM7Ci0JCXVfaW50IGlpc19wdHIsIGltZ19wdHIsIHNpemU7CisJCXVfaW50IGlpc19wdHIsIGltZ19wdHI7CiAKIAkJLyogUmVhZCB0aGUgZm9vdGVyLiAqLwogCQlyZXQgPSBhZnNfcmVhZF9mb290ZXIobXRkLCAmaW1nX3B0ciwgJmlpc19wdHIsIG9mZiwgbWFzayk7CkBAIC0yMzYsMjEgKzIzNiw5IEBACiAJCQljb250aW51ZTsKIAogCQlzdHJjcHkoc3RyLCBpaXMubmFtZSk7Ci0JCXNpemUgPSBtdGQtPmVyYXNlc2l6ZSArIG9mZiAtIGltZ19wdHI7Ci0KLQkJLyoKLQkJICogSW4gb3JkZXIgdG8gc3VwcG9ydCBKRkZTMiBwYXJ0aXRpb25zIG9uIHRoaXMgbGF5b3V0LAotCQkgKiB3ZSBtdXN0IGxpZSB0byBNVEQgYWJvdXQgdGhlIHJlYWwgc2l6ZSBvZiBKRkZTMgotCQkgKiBwYXJ0aXRpb25zOyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgQUZTIGZsYXNoIGZvb3RlcgotCQkgKiB3b24ndCBiZSBlcmFzZWQgYnkgSkZGUzIuICBQbGVhc2UgZW5zdXJlIHRoYXQgeW91cgotCQkgKiBKRkZTMiBwYXJ0aXRpb25zIGFyZSBnaXZlbiBpbWFnZSBudW1iZXJzIGJldHdlZW4KLQkJICogMTAwMCBhbmQgMjAwMCBpbmNsdXNpdmUuCi0JCSAqLwotCQlpZiAoaWlzLmltYWdlTnVtYmVyID49IDEwMDAgJiYgaWlzLmltYWdlTnVtYmVyIDwgMjAwMCkKLQkJCXNpemUgLT0gbXRkLT5lcmFzZXNpemU7CiAKIAkJcGFydHNbaWR4XS5uYW1lCQk9IHN0cjsKLQkJcGFydHNbaWR4XS5zaXplCQk9IHNpemU7CisJCXBhcnRzW2lkeF0uc2l6ZQkJPSAoaWlzLmxlbmd0aCArIG10ZC0+ZXJhc2VzaXplIC0gMSkgJiB+KG10ZC0+ZXJhc2VzaXplIC0gMSk7CiAJCXBhcnRzW2lkeF0ub2Zmc2V0CT0gaW1nX3B0cjsKIAkJcGFydHNbaWR4XS5tYXNrX2ZsYWdzCT0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL2NoaXBzL0tjb25maWcKaW5kZXggZDY4MmRiYy4uYjVkYzU5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCkBAIC0xLDUgKzEsNSBAQAogIyBkcml2ZXJzL210ZC9jaGlwcy9LY29uZmlnCi0jICRJZDogS2NvbmZpZyx2IDEuMTMgMjAwNC8xMi8wMSAxNTo0OToxMCBuaWNvIEV4cCAkCisjICRJZDogS2NvbmZpZyx2IDEuMTUgMjAwNS8wNi8wNiAyMzowNDozNSB0cG95bm9yIEV4cCAkCiAKIG1lbnUgIlJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzIgogCWRlcGVuZHMgb24gTVREIT1uCkBAIC0xNTUsNiArMTU1LDMxIEBACiAJICBJZiB5b3VyIGZsYXNoIGNoaXBzIGFyZSBpbnRlcmxlYXZlZCBpbiBlaWdodHMgLSBpLmUuIHlvdSBoYXZlIGVpZ2h0CiAJICBmbGFzaCBjaGlwcyBhZGRyZXNzZWQgYnkgZWFjaCBidXMgY3ljbGUsIHRoZW4gc2F5ICdZJy4KIAorY29uZmlnIE1URF9PVFAKKwlib29sICJQcm90ZWN0aW9uIFJlZ2lzdGVycyBha2Egb25lLXRpbWUgcHJvZ3JhbW1hYmxlIChPVFApIGJpdHMiCisJZGVwZW5kcyBvbiBNVERfQ0ZJX0FEVl9PUFRJT05TCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHJlYWRpbmcsIHdyaXRpbmcgYW5kIGxvY2tpbmcgc28gY2FsbGVkCisJICAiUHJvdGVjdGlvbiBSZWdpc3RlcnMiIHByZXNlbnQgb24gc29tZSBmbGFzaCBjaGlwcy4KKwkgIEEgc3Vic2V0IG9mIHRoZW0gYXJlIHByZS1wcm9ncmFtbWVkIGF0IHRoZSBmYWN0b3J5IHdpdGggYQorCSAgdW5pcXVlIHNldCBvZiB2YWx1ZXMuIFRoZSByZXN0IGlzIHVzZXItcHJvZ3JhbW1hYmxlLgorCisJICBUaGUgdXNlci1wcm9ncmFtbWFibGUgUHJvdGVjdGlvbiBSZWdpc3RlcnMgY29udGFpbiBvbmUtdGltZQorCSAgcHJvZ3JhbW1hYmxlIChPVFApIGJpdHM7IHdoZW4gcHJvZ3JhbW1lZCwgcmVnaXN0ZXIgYml0cyBjYW5ub3QgYmUKKwkgIGVyYXNlZC4gRWFjaCBQcm90ZWN0aW9uIFJlZ2lzdGVyIGNhbiBiZSBhY2Nlc3NlZCBtdWx0aXBsZSB0aW1lcyB0bworCSAgcHJvZ3JhbSBpbmRpdmlkdWFsIGJpdHMsIGFzIGxvbmcgYXMgdGhlIHJlZ2lzdGVyIHJlbWFpbnMgdW5sb2NrZWQuCisKKwkgIEVhY2ggUHJvdGVjdGlvbiBSZWdpc3RlciBoYXMgYW4gYXNzb2NpYXRlZCBMb2NrIFJlZ2lzdGVyIGJpdC4gV2hlbiBhCisJICBMb2NrIFJlZ2lzdGVyIGJpdCBpcyBwcm9ncmFtbWVkLCB0aGUgYXNzb2NpYXRlZCBQcm90ZWN0aW9uIFJlZ2lzdGVyCisJICBjYW4gb25seSBiZSByZWFkOyBpdCBjYW4gbm8gbG9uZ2VyIGJlIHByb2dyYW1tZWQuIEFkZGl0aW9uYWxseSwKKwkgIGJlY2F1c2UgdGhlIExvY2sgUmVnaXN0ZXIgYml0cyB0aGVtc2VsdmVzIGFyZSBPVFAsIHdoZW4gcHJvZ3JhbW1lZCwKKwkgIExvY2sgUmVnaXN0ZXIgYml0cyBjYW5ub3QgYmUgZXJhc2VkLiBUaGVyZWZvcmUsIHdoZW4gYSBQcm90ZWN0aW9uCisJICBSZWdpc3RlciBpcyBsb2NrZWQsIGl0IGNhbm5vdCBiZSB1bmxvY2tlZC4KKworCSAgVGhpcyBmZWF0dXJlIHNob3VsZCB0aGVyZWZvcmUgYmUgdXNlZCB3aXRoIGV4dHJlbWUgY2FyZS4gQW55IG1pc3Rha2UKKwkgIGluIHRoZSBwcm9ncmFtbWluZyBvZiBPVFAgYml0cyB3aWxsIHdhc3RlIHRoZW0uCisKIGNvbmZpZyBNVERfQ0ZJX0lOVEVMRVhUCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIEludGVsL1NoYXJwIGZsYXNoIGNoaXBzIgogCWRlcGVuZHMgb24gTVREX0dFTl9QUk9CRQpAQCAtMjc1LDcgKzMwMCw3IEBACiAKIGNvbmZpZyBNVERfWElQCiAJYm9vbCAiWElQIGF3YXJlIE1URCBzdXBwb3J0IgotCWRlcGVuZHMgb24gIVNNUCAmJiBNVERfQ0ZJX0lOVEVMRVhUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gIVNNUCAmJiAoTVREX0NGSV9JTlRFTEVYVCB8fCBNVERfQ0ZJX0FNRFNURCkgJiYgRVhQRVJJTUVOVEFMCiAJZGVmYXVsdCB5IGlmIFhJUF9LRVJORUwKIAloZWxwCiAJICBUaGlzIGFsbG93cyBNVEQgc3VwcG9ydCB0byB3b3JrIHdpdGggZmxhc2ggbWVtb3J5IHdoaWNoIGlzIGFsc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2FtZF9mbGFzaC5jIGIvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMKaW5kZXggNDFlMmUzZS4uMmRhZmViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvYW1kX2ZsYXNoLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQXV0aG9yOiBKb25hcyBIb2xtYmVyZyA8am9uYXMuaG9sbWJlcmdAYXhpcy5jb20+CiAgKgotICogJElkOiBhbWRfZmxhc2guYyx2IDEuMjYgMjAwNC8xMS8yMCAxMjo0OTowNCBkd213MiBFeHAgJAorICogJElkOiBhbWRfZmxhc2guYyx2IDEuMjcgMjAwNS8wMi8wNCAwNzo0MzowOSBqb25hc2hnIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAxIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIKICAqCkBAIC02Nyw3ICs2Nyw2IEBACiAjZGVmaW5lIEFNMjlMVjE2MERUCTB4MjJDNAogI2RlZmluZSBBTTI5TFYxNjBEQgkweDIyNDkKICNkZWZpbmUgQU0yOUJEUzMyM0QgICAgIDB4MjJEMQotI2RlZmluZSBBTTI5QkRTNjQzRAkweDIyN0UKIAogLyogQXRtZWwgKi8KICNkZWZpbmUgQVQ0OXhWMTZ4CTB4MDBDMApAQCAtNjE4LDE3ICs2MTcsNiBAQAogCQkJeyAub2Zmc2V0ID0gMHgzZjAwMDAsIC5lcmFzZXNpemUgPSAweDAyMDAwLCAubnVtYmxvY2tzID0gIDggfSwKIAkJfQogCX0sIHsKLQkJLm1mcl9pZCA9IE1BTlVGQUNUVVJFUl9BTUQsCi0JCS5kZXZfaWQgPSBBTTI5QkRTNjQzRCwKLQkJLm5hbWUgPSAiQU1EIEFNMjlCRFM2NDNEIiwKLQkJLnNpemUgPSAweDAwODAwMDAwLAotCQkubnVtZXJhc2VyZWdpb25zID0gMywKLQkJLnJlZ2lvbnMgPSB7Ci0JCQl7IC5vZmZzZXQgPSAweDAwMDAwMCwgLmVyYXNlc2l6ZSA9IDB4MTAwMDAsIC5udW1ibG9ja3MgPSA5NiB9LAotCQkJeyAub2Zmc2V0ID0gMHg2MDAwMDAsIC5lcmFzZXNpemUgPSAweDEwMDAwLCAubnVtYmxvY2tzID0gMzEgfSwKLQkJCXsgLm9mZnNldCA9IDB4N2YwMDAwLCAuZXJhc2VzaXplID0gMHgwMjAwMCwgLm51bWJsb2NrcyA9ICA4IH0sCi0JCX0KLQl9LCB7CiAJCS5tZnJfaWQgPSBNQU5VRkFDVFVSRVJfQVRNRUwsCiAJCS5kZXZfaWQgPSBBVDQ5eFYxNngsCiAJCS5uYW1lID0gIkF0bWVsIEFUNDl4VjE2eCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9jZmlfY21kc2V0XzAwMDEuYyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCmluZGV4IGMyNjhiY2QuLjBjZmNkODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMS5jCkBAIC00LDcgKzQsNyBAQAogICoKICAqIChDKSAyMDAwIFJlZCBIYXQuIEdQTCdkCiAgKgotICogJElkOiBjZmlfY21kc2V0XzAwMDEuYyx2IDEuMTY0IDIwMDQvMTEvMTYgMTg6Mjk6MDAgZHdtdzIgRXhwICQKKyAqICRJZDogY2ZpX2NtZHNldF8wMDAxLmMsdiAxLjE3OCAyMDA1LzA1LzE5IDE3OjA1OjQzIG5pY28gRXhwICQKICAqCiAgKiAKICAqIDEwLzEwLzIwMDAJTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPgpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC94aXAuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgpAQCAtNDgsMTYgKzQ5LDI1IEBACiAjZGVmaW5lIE01MExQVzA4MCAgICAgICAweDAwMkYKIAogc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwotLy9zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKLS8vc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCB1X2NoYXIgKik7CiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF93cml0ZV93b3JkcyhzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCBjb25zdCB1X2NoYXIgKik7CiBzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF93cml0ZV9idWZmZXJzKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIGNvbnN0IHVfY2hhciAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2VyYXNlX3ZhcnNpemUoc3RydWN0IG10ZF9pbmZvICosIHN0cnVjdCBlcmFzZV9pbmZvICopOwogc3RhdGljIHZvaWQgY2ZpX2ludGVsZXh0X3N5bmMgKHN0cnVjdCBtdGRfaW5mbyAqKTsKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2soc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4pOwogc3RhdGljIGludCBjZmlfaW50ZWxleHRfdW5sb2NrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuKTsKKyNpZmRlZiBDT05GSUdfTVREX09UUAorc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKiwgbG9mZl90LCBzaXplX3QsIHNpemVfdCAqLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3dyaXRlX3VzZXJfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2tfdXNlcl9wcm90X3JlZyAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2dldF9mYWN0X3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICosCisJCQkJCSAgICBzdHJ1Y3Qgb3RwX2luZm8gKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2dldF91c2VyX3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICosCisJCQkJCSAgICBzdHJ1Y3Qgb3RwX2luZm8gKiwgc2l6ZV90KTsKKyNlbmRpZgogc3RhdGljIGludCBjZmlfaW50ZWxleHRfc3VzcGVuZCAoc3RydWN0IG10ZF9pbmZvICopOwogc3RhdGljIHZvaWQgY2ZpX2ludGVsZXh0X3Jlc3VtZSAoc3RydWN0IG10ZF9pbmZvICopOworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVib290IChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZywgdm9pZCAqKTsKIAogc3RhdGljIHZvaWQgY2ZpX2ludGVsZXh0X2Rlc3Ryb3koc3RydWN0IG10ZF9pbmZvICopOwogCkBAIC0yNTIsNyArMjYyLDggQEAKIAkJaW50IG5iX3BhcnRzLCBpOwogCiAJCS8qIFByb3RlY3Rpb24gUmVnaXN0ZXIgaW5mbyAqLwotCQlleHRyYV9zaXplICs9IChleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzIC0gMSkgKiAoNCArIDYpOworCQlleHRyYV9zaXplICs9IChleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzIC0gMSkgKgorCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjZmlfaW50ZWxleHRfb3RwaW5mbyk7CiAKIAkJLyogQnVyc3QgUmVhZCBpbmZvICovCiAJCWV4dHJhX3NpemUgKz0gNjsKQEAgLTMyNCw3ICszMzUsOSBAQAogCW10ZC0+cmVzdW1lICA9IGNmaV9pbnRlbGV4dF9yZXN1bWU7CiAJbXRkLT5mbGFncyAgID0gTVREX0NBUF9OT1JGTEFTSDsKIAltdGQtPm5hbWUgICAgPSBtYXAtPm5hbWU7Ci0JCisKKwltdGQtPnJlYm9vdF9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gY2ZpX2ludGVsZXh0X3JlYm9vdDsKKwogCWlmIChjZmktPmNmaV9tb2RlID09IENGSV9NT0RFX0NGSSkgewogCQkvKiAKIAkJICogSXQncyBhIHJlYWwgQ0ZJIGNoaXAsIG5vdCBvbmUgZm9yIHdoaWNoIHRoZSBwcm9iZQpAQCAtNDIyLDkgKzQzNSwxMyBAQAogCQkgICAgICAgbXRkLT5lcmFzZXJlZ2lvbnNbaV0ubnVtYmxvY2tzKTsKIAl9CiAKLSNpZiAwCi0JbXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnOworI2lmZGVmIENPTkZJR19NVERfT1RQCiAJbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnOworCW10ZC0+cmVhZF91c2VyX3Byb3RfcmVnID0gY2ZpX2ludGVsZXh0X3JlYWRfdXNlcl9wcm90X3JlZzsKKwltdGQtPndyaXRlX3VzZXJfcHJvdF9yZWcgPSBjZmlfaW50ZWxleHRfd3JpdGVfdXNlcl9wcm90X3JlZzsKKwltdGQtPmxvY2tfdXNlcl9wcm90X3JlZyA9IGNmaV9pbnRlbGV4dF9sb2NrX3VzZXJfcHJvdF9yZWc7CisJbXRkLT5nZXRfZmFjdF9wcm90X2luZm8gPSBjZmlfaW50ZWxleHRfZ2V0X2ZhY3RfcHJvdF9pbmZvOworCW10ZC0+Z2V0X3VzZXJfcHJvdF9pbmZvID0gY2ZpX2ludGVsZXh0X2dldF91c2VyX3Byb3RfaW5mbzsKICNlbmRpZgogCiAJLyogVGhpcyBmdW5jdGlvbiBoYXMgdGhlIHBvdGVudGlhbCB0byBkaXN0b3J0IHRoZSByZWFsaXR5CkBAIC00MzMsNiArNDUwLDcgQEAKIAkJZ290byBzZXR1cF9lcnI7CiAKIAlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbXRkLT5yZWJvb3Rfbm90aWZpZXIpOwogCXJldHVybiBtdGQ7CiAKICBzZXR1cF9lcnI6CkBAIC00NzEsNyArNDg5LDggQEAKIAkJaW50IG9mZnMsIG51bXJlZ2lvbnMsIG51bXBhcnRzLCBwYXJ0c2hpZnQsIG51bXZpcnRjaGlwcywgaSwgajsKIAogCQkvKiBQcm90ZWN0aW9uIFJlZ2lzdGVyIGluZm8gKi8KLQkJb2ZmcyA9IChleHRwLT5OdW1Qcm90ZWN0aW9uRmllbGRzIC0gMSkgKiAoNCArIDYpOworCQlvZmZzID0gKGV4dHAtPk51bVByb3RlY3Rpb25GaWVsZHMgLSAxKSAqCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvKTsKIAogCQkvKiBCdXJzdCBSZWFkIGluZm8gKi8KIAkJb2ZmcyArPSA2OwpAQCAtNTYzLDcgKzU4Miw3IEBACiAgcmVzZXR0aW1lOgogCXRpbWVvID0gamlmZmllcyArIEhaOwogIHJldHJ5OgotCWlmIChjaGlwLT5wcml2ICYmIChtb2RlID09IEZMX1dSSVRJTkcgfHwgbW9kZSA9PSBGTF9FUkFTSU5HKSkgeworCWlmIChjaGlwLT5wcml2ICYmIChtb2RlID09IEZMX1dSSVRJTkcgfHwgbW9kZSA9PSBGTF9FUkFTSU5HIHx8IG1vZGUgPT0gRkxfT1RQX1dSSVRFKSkgewogCQkvKgogCQkgKiBPSy4gV2UgaGF2ZSBwb3NzaWJpbGl0eSBmb3IgY29udGVuc2lvbiBvbiB0aGUgd3JpdGUvZXJhc2UKIAkJICogb3BlcmF0aW9ucyB3aGljaCBhcmUgZ2xvYmFsIHRvIHRoZSByZWFsIGNoaXAgYW5kIG5vdCBwZXIKQEAgLTgwNywxMCArODI2LDYgQEAKICAqIGFzc2VtYmx5IHRvIG1ha2Ugc3VyZSBpbmxpbmUgZnVuY3Rpb25zIHdlcmUgYWN0dWFsbHkgaW5saW5lZCBhbmQgdGhhdCBnY2MKICAqIGRpZG4ndCBlbWl0IGNhbGxzIHRvIGl0cyBvd24gc3VwcG9ydCBmdW5jdGlvbnMpLiBBbHNvIGNvbmZpZ3VyaW5nIE1URCBDRkkKICAqIHN1cHBvcnQgdG8gYSBzaW5nbGUgYnVzd2lkdGggYW5kIGEgc2luZ2xlIGludGVybGVhdmUgaXMgYWxzbyByZWNvbW1lbmRlZC4KLSAqIE5vdGUgdGhhdCBub3Qgb25seSBJUlFzIGFyZSBkaXNhYmxlZCBidXQgdGhlIHByZWVtcHRpb24gY291bnQgaXMgYWxzbwotICogaW5jcmVhc2VkIHRvIHByZXZlbnQgb3RoZXIgbG9ja2luZyBwcmltaXRpdmVzIChuYW1lbHkgc3Bpbl91bmxvY2spIGZyb20KLSAqIGRlY3JlbWVudGluZyB0aGUgcHJlZW1wdCBjb3VudCB0byB6ZXJvIGFuZCBzY2hlZHVsaW5nIHRoZSBDUFUgYXdheSB3aGlsZQotICogbm90IGluIGFycmF5IG1vZGUuCiAgKi8KIAogc3RhdGljIHZvaWQgeGlwX2Rpc2FibGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCkBAIC04MTgsNyArODMzLDYgQEAKIHsKIAkvKiBUT0RPOiBjaGlwcyB3aXRoIG5vIFhJUCB1c2Ugc2hvdWxkIGlnbm9yZSBhbmQgcmV0dXJuICovCiAJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsgLyogZW5zdXJlIG1tdSBtYXBwaW5nIGlzIHVwIHRvIGRhdGUgKi8KLQlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogfQogCkBAIC04MzEsOSArODQ1LDggQEAKIAkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAl9CiAJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsKLQlhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsgLyogZmlsbCBpbnN0cnVjdGlvbiBwcmVmZXRjaCAqLworCXhpcF9pcHJlZmV0Y2goKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogLyoKQEAgLTkwOSw3ICs5MjIsNyBAQAogCQkJKHZvaWQpIG1hcF9yZWFkKG1hcCwgYWRyKTsKIAkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOwogCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQkJcHJlZW1wdF9lbmFibGUoKTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOwogCQkJY29uZF9yZXNjaGVkKCk7CiAKQEAgLTkxOSwxNSArOTMyLDE1IEBACiAJCQkgKiBhIHN1c3BlbmRlZCBlcmFzZSBzdGF0ZS4gIElmIHNvIGxldCdzIHdhaXQKIAkJCSAqIHVudGlsIGl0J3MgZG9uZS4KIAkJCSAqLwotCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJd2hpbGUgKGNoaXAtPnN0YXRlICE9IG5ld3N0YXRlKSB7CiAJCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQkJCXByZWVtcHRfZW5hYmxlKCk7CisJCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJCXNjaGVkdWxlKCk7CiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCX0KIAkJCS8qIERpc2FsbG93IFhJUCBhZ2FpbiAqLwogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTk1NiwxMiArOTY5LDE0IEBACiAgKiBUaGUgSU5WQUxJREFURV9DQUNIRURfUkFOR0UoKSBtYWNybyBpcyBub3JtYWxseSB1c2VkIGluIHBhcmFsbGVsIHdoaWxlCiAgKiB0aGUgZmxhc2ggaXMgYWN0aXZlbHkgcHJvZ3JhbW1pbmcgb3IgZXJhc2luZyBzaW5jZSB3ZSBoYXZlIHRvIHBvbGwgZm9yCiAgKiB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlIGFueXdheS4gIFdlIGNhbid0IGRvIHRoYXQgaW4gYSBnZW5lcmljIHdheSB3aXRoCi0gKiBhIFhJUCBzZXR1cCBzbyBkbyBpdCBiZWZvcmUgdGhlIGFjdHVhbCBmbGFzaCBvcGVyYXRpb24gaW4gdGhpcyBjYXNlLgorICogYSBYSVAgc2V0dXAgc28gZG8gaXQgYmVmb3JlIHRoZSBhY3R1YWwgZmxhc2ggb3BlcmF0aW9uIGluIHRoaXMgY2FzZQorICogYW5kIHN0dWIgaXQgb3V0IGZyb20gSU5WQUxJREFURV9DQUNIRV9VREVMQVkuCiAgKi8KLSN1bmRlZiBJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRQotI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRSh4Li4uKQotI2RlZmluZSBYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgZnJvbSwgc2l6ZSkgXAotCWRvIHsgaWYobWFwLT5pbnZhbF9jYWNoZSkgbWFwLT5pbnZhbF9jYWNoZShtYXAsIGZyb20sIHNpemUpOyB9IHdoaWxlKDApCisjZGVmaW5lIFhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBmcm9tLCBzaXplKSAgXAorCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgZnJvbSwgc2l6ZSkKKworI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIGFkciwgbGVuLCB1c2VjKSAgXAorCVVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykKIAogLyoKICAqIEV4dHJhIG5vdGVzOgpAQCAtOTg0LDExICs5OTksMjMgQEAKIAogI2RlZmluZSB4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcikKICNkZWZpbmUgeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcikKLQotI2RlZmluZSBVREVMQVkobWFwLCBjaGlwLCBhZHIsIHVzZWMpICBjZmlfdWRlbGF5KHVzZWMpCi0KICNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRSh4Li4uKQogCisjZGVmaW5lIFVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykgIFwKK2RvIHsgIFwKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7ICBcCisJY2ZpX3VkZWxheSh1c2VjKTsgIFwKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIGFkciwgbGVuLCB1c2VjKSAgXAorZG8geyAgXAorCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsgIFwKKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsgIFwKKwljZmlfdWRlbGF5KHVzZWMpOyAgXAorCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7ICBcCit9IHdoaWxlICgwKQorCiAjZW5kaWYKIAogc3RhdGljIGludCBkb19wb2ludF9vbmVjaGlwIChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgbG9mZl90IGFkciwgc2l6ZV90IGxlbikKQEAgLTExNzYsMTExICsxMjAzLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmIDAKLXN0YXRpYyBpbnQgX194aXByYW0gY2ZpX2ludGVsZXh0X3JlYWRfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAotCQkJCQkJbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCi0JCQkJCQlzaXplX3QgKnJldGxlbiwKLQkJCQkJCXVfY2hhciAqYnVmLAotCQkJCQkJaW50IGJhc2Vfb2Zmc3QsIGludCByZWdfc3opCi17Ci0Jc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7Ci0Jc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7Ci0Jc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OwotCXN0cnVjdCBmbGNoaXAgKmNoaXA7Ci0JaW50IG9mc19mYWN0b3IgPSBjZmktPmludGVybGVhdmUgKiBjZmktPmRldmljZV90eXBlOwotCWludCBjb3VudCA9IGxlbjsKLQlpbnQgY2hpcF9udW0sIG9mZnN0OwotCWludCByZXQ7Ci0KLQljaGlwX251bSA9ICgodW5zaWduZWQgaW50KWZyb20vcmVnX3N6KTsKLQlvZmZzdCA9IGZyb20gLSAocmVnX3N6KmNoaXBfbnVtKStiYXNlX29mZnN0OwotCi0Jd2hpbGUgKGNvdW50KSB7Ci0JLyogQ2FsY3VsYXRlIHdoaWNoIGNoaXAgJiBwcm90ZWN0aW9uIHJlZ2lzdGVyIG9mZnNldCB3ZSBuZWVkICovCi0KLQkJaWYgKGNoaXBfbnVtID49IGNmaS0+bnVtY2hpcHMpCi0JCQlnb3RvIG91dDsKLQotCQljaGlwID0gJmNmaS0+Y2hpcHNbY2hpcF9udW1dOwotCQkKLQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKLQkJcmV0ID0gZ2V0X2NoaXAobWFwLCBjaGlwLCBjaGlwLT5zdGFydCwgRkxfSkVERUNfUVVFUlkpOwotCQlpZiAocmV0KSB7Ci0JCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCQlyZXR1cm4gKGxlbi1jb3VudCk/OnJldDsKLQkJfQotCi0JCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQpOwotCi0JCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9KRURFQ19RVUVSWSkgewotCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4OTApLCBjaGlwLT5zdGFydCk7Ci0JCQljaGlwLT5zdGF0ZSA9IEZMX0pFREVDX1FVRVJZOwotCQl9Ci0KLQkJd2hpbGUgKGNvdW50ICYmICgob2Zmc3QtYmFzZV9vZmZzdCkgPCByZWdfc3opKSB7Ci0JCQkqYnVmID0gbWFwX3JlYWQ4KG1hcCwoY2hpcC0+c3RhcnQrKChleHRwLT5Qcm90UmVnQWRkcisxKSpvZnNfZmFjdG9yKStvZmZzdCkpOwotCQkJYnVmKys7Ci0JCQlvZmZzdCsrOwotCQkJY291bnQtLTsKLQkJfQotCi0JCXhpcF9lbmFibGUobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7Ci0JCXB1dF9jaGlwKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQpOwotCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0KLQkJLyogTW92ZSBvbiB0byB0aGUgbmV4dCBjaGlwICovCi0JCWNoaXBfbnVtKys7Ci0JCW9mZnN0ID0gYmFzZV9vZmZzdDsKLQl9Ci0JCi0gb3V0OgkKLQlyZXR1cm4gbGVuLWNvdW50OwotfQotCQotc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKLQlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKLQlzdHJ1Y3QgY2ZpX3ByaV9pbnRlbGV4dCAqZXh0cD1jZmktPmNtZHNldF9wcml2OwotCWludCBiYXNlX29mZnN0LHJlZ19zejsKLQkKLQkvKiBDaGVjayB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBwcm90ZWN0aW9uIHJlZ2lzdGVycyAqLwotCWlmKCFleHRwIHx8ICEoZXh0cC0+RmVhdHVyZVN1cHBvcnQmNjQpKXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRoaXMgZmxhc2ggZGV2aWNlIGhhcyBubyBwcm90ZWN0aW9uIGRhdGEgdG8gcmVhZCFcbiIsbWFwLT5uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYmFzZV9vZmZzdD0oMTw8ZXh0cC0+RmFjdFByb3RSZWdTaXplKTsKLQlyZWdfc3o9KDE8PGV4dHAtPlVzZXJQcm90UmVnU2l6ZSk7Ci0KLQlyZXR1cm4gY2ZpX2ludGVsZXh0X3JlYWRfcHJvdF9yZWcobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBiYXNlX29mZnN0LCByZWdfc3opOwotfQotCi1zdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZWFkX2ZhY3RfcHJvdF9yZWcgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQotewotCXN0cnVjdCBtYXBfaW5mbyAqbWFwID0gbXRkLT5wcml2OwotCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwotCXN0cnVjdCBjZmlfcHJpX2ludGVsZXh0ICpleHRwPWNmaS0+Y21kc2V0X3ByaXY7Ci0JaW50IGJhc2Vfb2Zmc3QscmVnX3N6OwotCQotCS8qIENoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIHByb3RlY3Rpb24gcmVnaXN0ZXJzICovCi0JaWYoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCY2NCkpewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVGhpcyBmbGFzaCBkZXZpY2UgaGFzIG5vIHByb3RlY3Rpb24gZGF0YSB0byByZWFkIVxuIixtYXAtPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQliYXNlX29mZnN0PTA7Ci0JcmVnX3N6PSgxPDxleHRwLT5GYWN0UHJvdFJlZ1NpemUpOwotCi0JcmV0dXJuIGNmaV9pbnRlbGV4dF9yZWFkX3Byb3RfcmVnKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sIGJ1ZiwgYmFzZV9vZmZzdCwgcmVnX3N6KTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IF9feGlwcmFtIGRvX3dyaXRlX29uZXdvcmQoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIGFkciwgbWFwX3dvcmQgZGF0dW0pCisJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkciwgbWFwX3dvcmQgZGF0dW0sIGludCBtb2RlKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwotCW1hcF93b3JkIHN0YXR1cywgc3RhdHVzX09LOworCW1hcF93b3JkIHN0YXR1cywgc3RhdHVzX09LLCB3cml0ZV9jbWQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lbzsKIAlpbnQgeiwgcmV0PTA7CiAKQEAgLTEyODgsOSArMTIxNSwxNCBAQAogCiAJLyogTGV0J3MgZGV0ZXJtaW5lIHRoaXMgYWNjb3JkaW5nIHRvIHRoZSBpbnRlcmxlYXZlIG9ubHkgb25jZSAqLwogCXN0YXR1c19PSyA9IENNRCgweDgwKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEZMX1dSSVRJTkc6ICAgd3JpdGVfY21kID0gQ01EKDB4NDApOyBicmVhazsKKwljYXNlIEZMX09UUF9XUklURTogd3JpdGVfY21kID0gQ01EKDB4YzApOyBicmVhazsKKwlkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwotCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKKwlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGFkciwgbW9kZSk7CiAJaWYgKHJldCkgewogCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCXJldHVybiByZXQ7CkBAIC0xMjk5LDE5ICsxMjMxLDE4IEBACiAJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwX2Jhbmt3aWR0aChtYXApKTsKIAlFTkFCTEVfVlBQKG1hcCk7CiAJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBhZHIpOwotCW1hcF93cml0ZShtYXAsIENNRCgweDQwKSwgYWRyKTsKKwltYXBfd3JpdGUobWFwLCB3cml0ZV9jbWQsIGFkcik7CiAJbWFwX3dyaXRlKG1hcCwgZGF0dW0sIGFkcik7Ci0JY2hpcC0+c3RhdGUgPSBGTF9XUklUSU5HOworCWNoaXAtPnN0YXRlID0gbW9kZTsKIAotCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbWFwX2Jhbmt3aWR0aChtYXApKTsKLQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIGNoaXAtPndvcmRfd3JpdGVfdGltZSk7Ci0Jc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJY2hpcC0+d29yZF93cml0ZV90aW1lKTsKIAogCXRpbWVvID0gamlmZmllcyArIChIWi8yKTsKIAl6ID0gMDsKIAlmb3IgKDs7KSB7Ci0JCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9XUklUSU5HKSB7CisJCWlmIChjaGlwLT5zdGF0ZSAhPSBtb2RlKSB7CiAJCQkvKiBTb21lb25lJ3Mgc3VzcGVuZGVkIHRoZSB3cml0ZS4gU2xlZXAgKi8KIAkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCkBAIC0xMzM5LDEwICsxMjcwLDggQEAKIAkJfQogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJeisrOwogCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwotCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCX0KIAlpZiAoIXopIHsKIAkJY2hpcC0+d29yZF93cml0ZV90aW1lLS07CkBAIC0xMzk5LDcgKzEzMjgsNyBAQAogCQlkYXR1bSA9IG1hcF93b3JkX2xvYWRfcGFydGlhbChtYXAsIGRhdHVtLCBidWYsIGdhcCwgbik7CiAKIAkJcmV0ID0gZG9fd3JpdGVfb25ld29yZChtYXAsICZjZmktPmNoaXBzW2NoaXBudW1dLAotCQkJCQkgICAgICAgYnVzX29mcywgZGF0dW0pOworCQkJCQkgICAgICAgYnVzX29mcywgZGF0dW0sIEZMX1dSSVRJTkcpOwogCQlpZiAocmV0KSAKIAkJCXJldHVybiByZXQ7CiAKQEAgLTE0MjAsNyArMTM0OSw3IEBACiAJCW1hcF93b3JkIGRhdHVtID0gbWFwX3dvcmRfbG9hZChtYXAsIGJ1Zik7CiAKIAkJcmV0ID0gZG9fd3JpdGVfb25ld29yZChtYXAsICZjZmktPmNoaXBzW2NoaXBudW1dLAotCQkJCW9mcywgZGF0dW0pOworCQkJCSAgICAgICBvZnMsIGRhdHVtLCBGTF9XUklUSU5HKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTE0NDQsNyArMTM3Myw3IEBACiAJCWRhdHVtID0gbWFwX3dvcmRfbG9hZF9wYXJ0aWFsKG1hcCwgZGF0dW0sIGJ1ZiwgMCwgbGVuKTsKIAogCQlyZXQgPSBkb193cml0ZV9vbmV3b3JkKG1hcCwgJmNmaS0+Y2hpcHNbY2hpcG51bV0sCi0JCQkJCSAgICAgICBvZnMsIGRhdHVtKTsKKwkJCQkgICAgICAgb2ZzLCBkYXR1bSwgRkxfV1JJVElORyk7CiAJCWlmIChyZXQpIAogCQkJcmV0dXJuIHJldDsKIAkJCkBAIC0xNTA2LDkgKzE0MzUsNyBAQAogCQlpZiAobWFwX3dvcmRfYW5kZXF1YWwobWFwLCBzdGF0dXMsIHN0YXR1c19PSywgc3RhdHVzX09LKSkKIAkJCWJyZWFrOwogCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgMSk7Ci0JCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAKIAkJaWYgKCsreiA+IDIwKSB7CiAJCQkvKiBBcmdoLiBOb3QgcmVhZHkgZm9yIHdyaXRlIHRvIGJ1ZmZlciAqLwpAQCAtMTU1NCwxMCArMTQ4MSw5IEBACiAJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZDApLCBjbWRfYWRyKTsKIAljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CiAKLQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7Ci0JVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgY2hpcC0+YnVmZmVyX3dyaXRlX3RpbWUpOwotCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJSU5WQUxJREFURV9DQUNIRV9VREVMQVkobWFwLCBjaGlwLCAKKwkJCQljbWRfYWRyLCBsZW4sCisJCQkJY2hpcC0+YnVmZmVyX3dyaXRlX3RpbWUpOwogCiAJdGltZW8gPSBqaWZmaWVzICsgKEhaLzIpOwogCXogPSAwOwpAQCAtMTU4OSwxMCArMTUxNSw4IEBACiAJCX0KIAkJCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQkJVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgMSk7CiAJCXorKzsKLQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJVURFTEFZKG1hcCwgY2hpcCwgY21kX2FkciwgMSk7CiAJfQogCWlmICgheikgewogCQljaGlwLT5idWZmZXJfd3JpdGVfdGltZS0tOwpAQCAtMTcyMCwxMCArMTY0NCw5IEBACiAJY2hpcC0+c3RhdGUgPSBGTF9FUkFTSU5HOwogCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IDA7CiAKLQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBhZHIsIGxlbik7Ci0JVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBjaGlwLT5lcmFzZV90aW1lKjEwMDAvMik7Ci0Jc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBsZW4sCisJCQkJY2hpcC0+ZXJhc2VfdGltZSoxMDAwLzIpOwogCiAJLyogRklYTUUuIFVzZSBhIHRpbWVyIHRvIGNoZWNrIHRoaXMsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuICovCiAJLyogT25jZSB0aGUgc3RhdGUgbWFjaGluZSdzIGtub3duIHRvIGJlIHdvcmtpbmcgSSdsbCBkbyB0aGF0ICovCkBAIC0xNzY4LDkgKzE2OTEsNyBAQAogCQl9CiAJCQogCQkvKiBMYXRlbmN5IGlzc3Vlcy4gRHJvcCB0aGUgbG9jaywgd2FpdCBhIHdoaWxlIGFuZCByZXRyeSAqLwotCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7Ci0JCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJfQogCiAJLyogV2UndmUgYnJva2VuIHRoaXMgYmVmb3JlLiBJdCBkb2Vzbid0IGh1cnQgdG8gYmUgc2FmZSAqLwpAQCAtMTc4MCw0NCArMTcwMSwzNCBAQAogCiAJLyogY2hlY2sgZm9yIGxvY2sgYml0ICovCiAJaWYgKG1hcF93b3JkX2JpdHNzZXQobWFwLCBzdGF0dXMsIENNRCgweDNhKSkpIHsKLQkJdW5zaWduZWQgY2hhciBjaGlwc3RhdHVzOworCQl1bnNpZ25lZCBsb25nIGNoaXBzdGF0dXM7CiAKIAkJLyogUmVzZXQgdGhlIGVycm9yIGJpdHMgKi8KIAkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4NTApLCBhZHIpOwogCQltYXBfd3JpdGUobWFwLCBDTUQoMHg3MCksIGFkcik7CiAJCXhpcF9lbmFibGUobWFwLCBjaGlwLCBhZHIpOwogCi0JCWNoaXBzdGF0dXMgPSBzdGF0dXMueFswXTsKLQkJaWYgKCFtYXBfd29yZF9lcXVhbChtYXAsIHN0YXR1cywgQ01EKGNoaXBzdGF0dXMpKSkgewotCQkJaW50IGksIHc7Ci0JCQlmb3IgKHc9MDsgdzxtYXBfd29yZHMobWFwKTsgdysrKSB7Ci0JCQkJZm9yIChpID0gMDsgaTxjZmlfaW50ZXJsZWF2ZShjZmkpOyBpKyspIHsKLQkJCQkJY2hpcHN0YXR1cyB8PSBzdGF0dXMueFt3XSA+PiAoY2ZpLT5kZXZpY2VfdHlwZSAqIDgpOwotCQkJCX0KLQkJCX0KLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlN0YXR1cyBpcyBub3QgaWRlbnRpY2FsIGZvciBhbGwgY2hpcHM6IDB4JWx4LiBNZXJnaW5nIHRvIGdpdmUgMHglMDJ4XG4iLAotCQkJICAgICAgIHN0YXR1cy54WzBdLCBjaGlwc3RhdHVzKTsKLQkJfQorCQljaGlwc3RhdHVzID0gTUVSR0VTVEFUVVMoc3RhdHVzKTsKIAogCQlpZiAoKGNoaXBzdGF0dXMgJiAweDMwKSA9PSAweDMwKSB7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNoaXAgcmVwb3J0cyBpbXByb3BlciBjb21tYW5kIHNlcXVlbmNlOiBzdGF0dXMgMHgleFxuIiwgY2hpcHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNoaXAgcmVwb3J0cyBpbXByb3BlciBjb21tYW5kIHNlcXVlbmNlOiBzdGF0dXMgMHglbHhcbiIsIGNoaXBzdGF0dXMpOwogCQkJcmV0ID0gLUVJTzsKIAkJfSBlbHNlIGlmIChjaGlwc3RhdHVzICYgMHgwMikgewogCQkJLyogUHJvdGVjdGlvbiBiaXQgc2V0ICovCiAJCQlyZXQgPSAtRVJPRlM7CiAJCX0gZWxzZSBpZiAoY2hpcHN0YXR1cyAmIDB4OCkgewogCQkJLyogVm9sdGFnZSAqLwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2hpcCByZXBvcnRzIHZvbHRhZ2UgbG93IG9uIGVyYXNlOiBzdGF0dXMgMHgleFxuIiwgY2hpcHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDaGlwIHJlcG9ydHMgdm9sdGFnZSBsb3cgb24gZXJhc2U6IHN0YXR1cyAweCVseFxuIiwgY2hpcHN0YXR1cyk7CiAJCQlyZXQgPSAtRUlPOwogCQl9IGVsc2UgaWYgKGNoaXBzdGF0dXMgJiAweDIwKSB7CiAJCQlpZiAocmV0cmllcy0tKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIkNoaXAgZXJhc2UgZmFpbGVkIGF0IDB4JTA4bHg6IHN0YXR1cyAweCV4LiBSZXRyeWluZy4uLlxuIiwgYWRyLCBjaGlwc3RhdHVzKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JWx4LiBSZXRyeWluZy4uLlxuIiwgYWRyLCBjaGlwc3RhdHVzKTsKIAkJCQl0aW1lbyA9IGppZmZpZXMgKyBIWjsKIAkJCQlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7CiAJCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JXhcbiIsIGFkciwgY2hpcHN0YXR1cyk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hpcCBlcmFzZSBmYWlsZWQgYXQgMHglMDhseDogc3RhdHVzIDB4JWx4XG4iLCBhZHIsIGNoaXBzdGF0dXMpOwogCQkJcmV0ID0gLUVJTzsKIAkJfQogCX0gZWxzZSB7CkBAIC0xODgyLDYgKzE3OTMsNyBAQAogCQkKIAkJaWYgKGNoaXAtPnN0YXRlID09IEZMX1NZTkNJTkcpIHsKIAkJCWNoaXAtPnN0YXRlID0gY2hpcC0+b2xkc3RhdGU7CisJCQljaGlwLT5vbGRzdGF0ZSA9IEZMX1JFQURZOwogCQkJd2FrZV91cCgmY2hpcC0+d3EpOwogCQl9CiAJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKQEAgLTE4OTcsOCArMTgwOSw5IEBACiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CiAJaW50IHN0YXR1cywgb2ZzX2ZhY3RvciA9IGNmaS0+aW50ZXJsZWF2ZSAqIGNmaS0+ZGV2aWNlX3R5cGU7CiAKKwlhZHIgKz0gY2hpcC0+c3RhcnQ7CiAJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBhZHIrKDIqb2ZzX2ZhY3RvcikpOwotCWNmaV9zZW5kX2dlbl9jbWQoMHg5MCwgMHg1NSwgMCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOworCW1hcF93cml0ZShtYXAsIENNRCgweDkwKSwgYWRyKygyKm9mc19mYWN0b3IpKTsKIAljaGlwLT5zdGF0ZSA9IEZMX0pFREVDX1FVRVJZOwogCXN0YXR1cyA9IGNmaV9yZWFkX3F1ZXJ5KG1hcCwgYWRyKygyKm9mc19mYWN0b3IpKTsKIAl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgMCk7CkBAIC0xOTE1LDYgKzE4MjgsNyBAQAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkciwgaW50IGxlbiwgdm9pZCAqdGh1bmspCiB7CiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OwogCW1hcF93b3JkIHN0YXR1cywgc3RhdHVzX09LOwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CiAJaW50IHJldDsKQEAgLTE5NDQsOSArMTg1OCwxMyBAQAogCX0gZWxzZQogCQlCVUcoKTsKIAotCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEwMDAwMDAvSFopOwotCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJLyoKKwkgKiBJZiBJbnN0YW50IEluZGl2aWR1YWwgQmxvY2sgTG9ja2luZyBzdXBwb3J0ZWQgdGhlbiBubyBuZWVkCisJICogdG8gZGVsYXkuCisJICovCisKKwlpZiAoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCAmICgxIDw8IDUpKSkKKwkJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCAxMDAwMDAwL0haKTsKIAogCS8qIEZJWE1FLiBVc2UgYSB0aW1lciB0byBjaGVjayB0aGlzLCBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiAqLwogCS8qIE9uY2UgdGhlIHN0YXRlIG1hY2hpbmUncyBrbm93biB0byBiZSB3b3JraW5nIEknbGwgZG8gdGhhdCAqLwpAQCAtMTk3Myw5ICsxODkxLDcgQEAKIAkJfQogCQkKIAkJLyogTGF0ZW5jeSBpc3N1ZXMuIERyb3AgdGhlIGxvY2ssIHdhaXQgYSB3aGlsZSBhbmQgcmV0cnkgKi8KLQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwotCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCX0KIAkKIAkvKiBEb25lIGFuZCBoYXBweS4gKi8KQEAgLTIwMzQsNiArMTk1MCwyNzQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX01URF9PVFAKKwordHlwZWRlZiBpbnQgKCpvdHBfb3BfdCkoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIAorCQkJdV9sb25nIGRhdGFfb2Zmc2V0LCB1X2NoYXIgKmJ1ZiwgdV9pbnQgc2l6ZSwKKwkJCXVfbG9uZyBwcm90X29mZnNldCwgdV9pbnQgZ3JvdXBubywgdV9pbnQgZ3JvdXBzaXplKTsKKworc3RhdGljIGludCBfX3hpcHJhbQorZG9fb3RwX3JlYWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVfbG9uZyBvZmZzZXQsCisJICAgIHVfY2hhciAqYnVmLCB1X2ludCBzaXplLCB1X2xvbmcgcHJvdCwgdV9pbnQgZ3Jwbm8sIHVfaW50IGdycHN6KQoreworCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OworCWludCByZXQ7CisKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQsIEZMX0pFREVDX1FVRVJZKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBsZXQncyBlbnN1cmUgd2UncmUgbm90IHJlYWRpbmcgYmFjayBjYWNoZWQgZGF0YSBmcm9tIGFycmF5IG1vZGUgKi8KKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGNoaXAtPnN0YXJ0ICsgb2Zmc2V0LCBzaXplKTsKKworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgY2hpcC0+c3RhcnQpOworCWlmIChjaGlwLT5zdGF0ZSAhPSBGTF9KRURFQ19RVUVSWSkgeworCQltYXBfd3JpdGUobWFwLCBDTUQoMHg5MCksIGNoaXAtPnN0YXJ0KTsKKwkJY2hpcC0+c3RhdGUgPSBGTF9KRURFQ19RVUVSWTsKKwl9CisJbWFwX2NvcHlfZnJvbShtYXAsIGJ1ZiwgY2hpcC0+c3RhcnQgKyBvZmZzZXQsIHNpemUpOworCXhpcF9lbmFibGUobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7CisKKwkvKiB0aGVuIGVuc3VyZSB3ZSBkb24ndCBrZWVwIE9UUCBkYXRhIGluIHRoZSBjYWNoZSAqLworCUlOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKG1hcCwgY2hpcC0+c3RhcnQgKyBvZmZzZXQsIHNpemUpOworCisJcHV0X2NoaXAobWFwLCBjaGlwLCBjaGlwLT5zdGFydCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19vdHBfd3JpdGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVfbG9uZyBvZmZzZXQsCisJICAgICB1X2NoYXIgKmJ1ZiwgdV9pbnQgc2l6ZSwgdV9sb25nIHByb3QsIHVfaW50IGdycG5vLCB1X2ludCBncnBzeikKK3sKKwlpbnQgcmV0OworCisJd2hpbGUgKHNpemUpIHsKKwkJdW5zaWduZWQgbG9uZyBidXNfb2ZzID0gb2Zmc2V0ICYgfihtYXBfYmFua3dpZHRoKG1hcCktMSk7CisJCWludCBnYXAgPSBvZmZzZXQgLSBidXNfb2ZzOworCQlpbnQgbiA9IG1pbl90KGludCwgc2l6ZSwgbWFwX2Jhbmt3aWR0aChtYXApLWdhcCk7CisJCW1hcF93b3JkIGRhdHVtID0gbWFwX3dvcmRfZmYobWFwKTsKKworCQlkYXR1bSA9IG1hcF93b3JkX2xvYWRfcGFydGlhbChtYXAsIGRhdHVtLCBidWYsIGdhcCwgbik7CisJCXJldCA9IGRvX3dyaXRlX29uZXdvcmQobWFwLCBjaGlwLCBidXNfb2ZzLCBkYXR1bSwgRkxfT1RQX1dSSVRFKTsKKwkJaWYgKHJldCkgCisJCQlyZXR1cm4gcmV0OworCisJCW9mZnNldCArPSBuOworCQlidWYgKz0gbjsKKwkJc2l6ZSAtPSBuOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19vdHBfbG9jayhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdV9sb25nIG9mZnNldCwKKwkgICAgdV9jaGFyICpidWYsIHVfaW50IHNpemUsIHVfbG9uZyBwcm90LCB1X2ludCBncnBubywgdV9pbnQgZ3Jwc3opCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJbWFwX3dvcmQgZGF0dW07CisKKwkvKiBtYWtlIHN1cmUgYXJlYSBtYXRjaGVzIGdyb3VwIGJvdW5kYXJpZXMgKi8KKwlpZiAoc2l6ZSAhPSBncnBzeikKKwkJcmV0dXJuIC1FWERFVjsKKworCWRhdHVtID0gbWFwX3dvcmRfZmYobWFwKTsKKwlkYXR1bSA9IG1hcF93b3JkX2NscihtYXAsIGRhdHVtLCBDTUQoMSA8PCBncnBubykpOworCXJldHVybiBkb193cml0ZV9vbmV3b3JkKG1hcCwgY2hpcCwgcHJvdCwgZGF0dW0sIEZMX09UUF9XUklURSk7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X290cF93YWxrKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJCQkgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmLAorCQkJCSBvdHBfb3BfdCBhY3Rpb24sIGludCB1c2VyX3JlZ3MpCit7CisJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfaW50ZWxleHQgKmV4dHAgPSBjZmktPmNtZHNldF9wcml2OworCXN0cnVjdCBmbGNoaXAgKmNoaXA7CisJc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvICpvdHA7CisJdV9sb25nIGRldnNpemUsIHJlZ19wcm90X29mZnNldCwgZGF0YV9vZmZzZXQ7CisJdV9pbnQgY2hpcF9udW0sIGNoaXBfc3RlcCwgZmllbGQsIHJlZ19mYWN0X3NpemUsIHJlZ191c2VyX3NpemU7CisJdV9pbnQgZ3JvdXBzLCBncm91cG5vLCBncm91cHNpemUsIHJlZ19mYWN0X2dyb3VwcywgcmVnX3VzZXJfZ3JvdXBzOworCWludCByZXQ7CisKKwkqcmV0bGVuID0gMDsKKworCS8qIENoZWNrIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBzb21lIE9UUCByZWdpc3RlcnMgKi8KKwlpZiAoIWV4dHAgfHwgIShleHRwLT5GZWF0dXJlU3VwcG9ydCAmIDY0KSB8fCAhZXh0cC0+TnVtUHJvdGVjdGlvbkZpZWxkcykKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJLyogd2UgbmVlZCByZWFsIGNoaXBzIGhlcmUgbm90IHZpcnR1YWwgb25lcyAqLworCWRldnNpemUgPSAoMSA8PCBjZmktPmNmaXEtPkRldlNpemUpICogY2ZpLT5pbnRlcmxlYXZlOworCWNoaXBfc3RlcCA9IGRldnNpemUgPj4gY2ZpLT5jaGlwc2hpZnQ7CisJY2hpcF9udW0gPSAwOworCisJLyogU29tZSBjaGlwcyBoYXZlIE9UUCBsb2NhdGVkIGluIHRoZSBfdG9wXyBwYXJ0aXRpb24gb25seS4KKwkgICBGb3IgZXhhbXBsZTogSW50ZWwgMjhGMjU2TDE4VCAoVCBtZWFucyB0b3AtcGFyYW1ldGVyIGRldmljZSkgKi8KKwlpZiAoY2ZpLT5tZnIgPT0gTUFOVUZBQ1RVUkVSX0lOVEVMKSB7CisJCXN3aXRjaCAoY2ZpLT5pZCkgeworCQljYXNlIDB4ODgwYjoKKwkJY2FzZSAweDg4MGM6CisJCWNhc2UgMHg4ODBkOgorCQkJY2hpcF9udW0gPSBjaGlwX3N0ZXAgLSAxOworCQl9CisJfQorCisJZm9yICggOyBjaGlwX251bSA8IGNmaS0+bnVtY2hpcHM7IGNoaXBfbnVtICs9IGNoaXBfc3RlcCkgeworCQljaGlwID0gJmNmaS0+Y2hpcHNbY2hpcF9udW1dOworCQlvdHAgPSAoc3RydWN0IGNmaV9pbnRlbGV4dF9vdHBpbmZvICopJmV4dHAtPmV4dHJhWzBdOworCisJCS8qIGZpcnN0IE9UUCByZWdpb24gKi8KKwkJZmllbGQgPSAwOworCQlyZWdfcHJvdF9vZmZzZXQgPSBleHRwLT5Qcm90UmVnQWRkcjsKKwkJcmVnX2ZhY3RfZ3JvdXBzID0gMTsKKwkJcmVnX2ZhY3Rfc2l6ZSA9IDEgPDwgZXh0cC0+RmFjdFByb3RSZWdTaXplOworCQlyZWdfdXNlcl9ncm91cHMgPSAxOworCQlyZWdfdXNlcl9zaXplID0gMSA8PCBleHRwLT5Vc2VyUHJvdFJlZ1NpemU7CisKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCS8qIGZsYXNoIGdlb21ldHJ5IGZpeHVwICovCisJCQlkYXRhX29mZnNldCA9IHJlZ19wcm90X29mZnNldCArIDE7CisJCQlkYXRhX29mZnNldCAqPSBjZmktPmludGVybGVhdmUgKiBjZmktPmRldmljZV90eXBlOworCQkJcmVnX3Byb3Rfb2Zmc2V0ICo9IGNmaS0+aW50ZXJsZWF2ZSAqIGNmaS0+ZGV2aWNlX3R5cGU7CisJCQlyZWdfZmFjdF9zaXplICo9IGNmaS0+aW50ZXJsZWF2ZTsKKwkJCXJlZ191c2VyX3NpemUgKj0gY2ZpLT5pbnRlcmxlYXZlOworCisJCQlpZiAodXNlcl9yZWdzKSB7CisJCQkJZ3JvdXBzID0gcmVnX3VzZXJfZ3JvdXBzOworCQkJCWdyb3Vwc2l6ZSA9IHJlZ191c2VyX3NpemU7CisJCQkJLyogc2tpcCBvdmVyIGZhY3RvcnkgcmVnIGFyZWEgKi8KKwkJCQlncm91cG5vID0gcmVnX2ZhY3RfZ3JvdXBzOworCQkJCWRhdGFfb2Zmc2V0ICs9IHJlZ19mYWN0X2dyb3VwcyAqIHJlZ19mYWN0X3NpemU7CisJCQl9IGVsc2UgeworCQkJCWdyb3VwcyA9IHJlZ19mYWN0X2dyb3VwczsKKwkJCQlncm91cHNpemUgPSByZWdfZmFjdF9zaXplOworCQkJCWdyb3Vwbm8gPSAwOworCQkJfQorCisJCQl3aGlsZSAobGVuID4gMCAmJiBncm91cHMgPiAwKSB7CisJCQkJaWYgKCFhY3Rpb24pIHsKKwkJCQkJLyoKKwkJCQkJICogU3BlY2lhbCBjYXNlOiBpZiBhY3Rpb24gaXMgTlVMTAorCQkJCQkgKiB3ZSBmaWxsIGJ1ZiB3aXRoIG90cF9pbmZvIHJlY29yZHMuCisJCQkJCSAqLworCQkJCQlzdHJ1Y3Qgb3RwX2luZm8gKm90cGluZm87CisJCQkJCW1hcF93b3JkIGxvY2t3b3JkOworCQkJCQlsZW4gLT0gc2l6ZW9mKHN0cnVjdCBvdHBfaW5mbyk7CisJCQkJCWlmIChsZW4gPD0gMCkKKwkJCQkJCXJldHVybiAtRU5PU1BDOworCQkJCQlyZXQgPSBkb19vdHBfcmVhZChtYXAsIGNoaXAsCisJCQkJCQkJICByZWdfcHJvdF9vZmZzZXQsCisJCQkJCQkJICAodV9jaGFyICopJmxvY2t3b3JkLAorCQkJCQkJCSAgbWFwX2Jhbmt3aWR0aChtYXApLAorCQkJCQkJCSAgMCwgMCwgIDApOworCQkJCQlpZiAocmV0KQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJb3RwaW5mbyA9IChzdHJ1Y3Qgb3RwX2luZm8gKilidWY7CisJCQkJCW90cGluZm8tPnN0YXJ0ID0gZnJvbTsKKwkJCQkJb3RwaW5mby0+bGVuZ3RoID0gZ3JvdXBzaXplOworCQkJCQlvdHBpbmZvLT5sb2NrZWQgPQorCQkJCQkgICAhbWFwX3dvcmRfYml0c3NldChtYXAsIGxvY2t3b3JkLAorCQkJCQkJCSAgICAgQ01EKDEgPDwgZ3JvdXBubykpOworCQkJCQlmcm9tICs9IGdyb3Vwc2l6ZTsKKwkJCQkJYnVmICs9IHNpemVvZigqb3RwaW5mbyk7CisJCQkJCSpyZXRsZW4gKz0gc2l6ZW9mKCpvdHBpbmZvKTsKKwkJCQl9IGVsc2UgaWYgKGZyb20gPj0gZ3JvdXBzaXplKSB7CisJCQkJCWZyb20gLT0gZ3JvdXBzaXplOworCQkJCQlkYXRhX29mZnNldCArPSBncm91cHNpemU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IHNpemUgPSBncm91cHNpemU7CisJCQkJCWRhdGFfb2Zmc2V0ICs9IGZyb207CisJCQkJCXNpemUgLT0gZnJvbTsKKwkJCQkJZnJvbSA9IDA7CisJCQkJCWlmIChzaXplID4gbGVuKQorCQkJCQkJc2l6ZSA9IGxlbjsKKwkJCQkJcmV0ID0gYWN0aW9uKG1hcCwgY2hpcCwgZGF0YV9vZmZzZXQsCisJCQkJCQkgICAgIGJ1Ziwgc2l6ZSwgcmVnX3Byb3Rfb2Zmc2V0LAorCQkJCQkJICAgICBncm91cG5vLCBncm91cHNpemUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJCWJ1ZiArPSBzaXplOworCQkJCQlsZW4gLT0gc2l6ZTsKKwkJCQkJKnJldGxlbiArPSBzaXplOworCQkJCQlkYXRhX29mZnNldCArPSBzaXplOworCQkJCX0KKwkJCQlncm91cG5vKys7CisJCQkJZ3JvdXBzLS07CisJCQl9CisKKwkJCS8qIG5leHQgT1RQIHJlZ2lvbiAqLworCQkJaWYgKCsrZmllbGQgPT0gZXh0cC0+TnVtUHJvdGVjdGlvbkZpZWxkcykKKwkJCQlicmVhazsKKwkJCXJlZ19wcm90X29mZnNldCA9IG90cC0+UHJvdFJlZ0FkZHI7CisJCQlyZWdfZmFjdF9ncm91cHMgPSBvdHAtPkZhY3RHcm91cHM7CisJCQlyZWdfZmFjdF9zaXplID0gMSA8PCBvdHAtPkZhY3RQcm90UmVnU2l6ZTsKKwkJCXJlZ191c2VyX2dyb3VwcyA9IG90cC0+VXNlckdyb3VwczsKKwkJCXJlZ191c2VyX3NpemUgPSAxIDw8IG90cC0+VXNlclByb3RSZWdTaXplOworCQkJb3RwKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF9mYWN0X3Byb3RfcmVnKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJCQkJICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sCisJCQkJCSAgICB1X2NoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sCisJCQkJICAgICBidWYsIGRvX290cF9yZWFkLCAwKTsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfcmVhZF91c2VyX3Byb3RfcmVnKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJCQkJICAgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sCisJCQkJCSAgICB1X2NoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sCisJCQkJICAgICBidWYsIGRvX290cF9yZWFkLCAxKTsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfd3JpdGVfdXNlcl9wcm90X3JlZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sCisJCQkJCSAgICBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwKKwkJCQkJICAgICB1X2NoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCByZXRsZW4sCisJCQkJICAgICBidWYsIGRvX290cF93cml0ZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X2xvY2tfdXNlcl9wcm90X3JlZyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQkJICAgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IHJldGxlbjsKKwlyZXR1cm4gY2ZpX2ludGVsZXh0X290cF93YWxrKG10ZCwgZnJvbSwgbGVuLCAmcmV0bGVuLAorCQkJCSAgICAgTlVMTCwgZG9fb3RwX2xvY2ssIDEpOworfQorCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9nZXRfZmFjdF9wcm90X2luZm8oc3RydWN0IG10ZF9pbmZvICptdGQsIAorCQkJCQkgICBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQ7CisKKwlyZXQgPSBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCAwLCBsZW4sICZyZXRsZW4sICh1X2NoYXIgKilidWYsIE5VTEwsIDApOworCXJldHVybiByZXQgPyA6IHJldGxlbjsKK30KKworc3RhdGljIGludCBjZmlfaW50ZWxleHRfZ2V0X3VzZXJfcHJvdF9pbmZvKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAorCQkJCQkgICBzdHJ1Y3Qgb3RwX2luZm8gKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQ7CisKKwlyZXQgPSBjZmlfaW50ZWxleHRfb3RwX3dhbGsobXRkLCAwLCBsZW4sICZyZXRsZW4sICh1X2NoYXIgKilidWYsIE5VTEwsIDEpOworCXJldHVybiByZXQgPyA6IHJldGxlbjsKK30KKworI2VuZGlmCisKIHN0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3N1c3BlbmQoc3RydWN0IG10ZF9pbmZvICptdGQpCiB7CiAJc3RydWN0IG1hcF9pbmZvICptYXAgPSBtdGQtPnByaXY7CkBAIC0yMTI1LDEwICsyMzA5LDQ2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGNmaV9pbnRlbGV4dF9yZXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKKwlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpPTA7IGkgPCBjZmktPm51bWNoaXBzOyBpKyspIHsKKwkJc3RydWN0IGZsY2hpcCAqY2hpcCA9ICZjZmktPmNoaXBzW2ldOworCisJCS8qIGZvcmNlIHRoZSBjb21wbGV0aW9uIG9mIGFueSBvbmdvaW5nIG9wZXJhdGlvbgorCQkgICBhbmQgc3dpdGNoIHRvIGFycmF5IG1vZGUgc28gYW55IGJvb3Rsb2FkZXIgaW4gCisJCSAgIGZsYXNoIGlzIGFjY2Vzc2libGUgZm9yIHNvZnQgcmVib290LiAqLworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGNoaXAtPnN0YXJ0LCBGTF9TWU5DSU5HKTsKKwkJaWYgKCFyZXQpIHsKKwkJCW1hcF93cml0ZShtYXAsIENNRCgweGZmKSwgY2hpcC0+c3RhcnQpOworCQkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKKwkJfQorCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2ludGVsZXh0X3JlYm9vdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCSAgICAgICB2b2lkICp2KQoreworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCisJbXRkID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgbXRkX2luZm8sIHJlYm9vdF9ub3RpZmllcik7CisJY2ZpX2ludGVsZXh0X3Jlc2V0KG10ZCk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCiBzdGF0aWMgdm9pZCBjZmlfaW50ZWxleHRfZGVzdHJveShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKIHsKIAlzdHJ1Y3QgbWFwX2luZm8gKm1hcCA9IG10ZC0+cHJpdjsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKKwljZmlfaW50ZWxleHRfcmVzZXQobXRkKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbXRkLT5yZWJvb3Rfbm90aWZpZXIpOwogCWtmcmVlKGNmaS0+Y21kc2V0X3ByaXYpOwogCWtmcmVlKGNmaS0+Y2ZpcSk7CiAJa2ZyZWUoY2ZpLT5jaGlwc1swXS5wcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2NmaV9jbWRzZXRfMDAwMi5jIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKaW5kZXggZmNhOGZmNi4uODUwNWYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvY2ZpX2NtZHNldF8wMDAyLmMKQEAgLTQsMTYgKzQsMjAgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQ3Jvc3NuZXQgQ28uIDxpbmZvQGNyb3NzbmV0LmNvLmpwPgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFyY29tIENvbnRyb2wgU3lzdGVtcyBMdGQgPGxpbnV4QGFyY29tLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4gPHNvdXJjZUBtdmlzdGEuY29tPgogICoKICAqIDJfYnlfOCByb3V0aW5lcyBhZGRlZCBieSBTaW1vbiBNdW50b24KICAqCiAgKiA0X2J5XzE2IHdvcmsgYnkgQ2Fyb2x5biBKLiBTbWl0aAogICoKKyAqIFhJUCBzdXBwb3J0IGhvb2tzIGJ5IFZpdGFseSBXb29sIChiYXNlZCBvbiBjb2RlIGZvciBJbnRlbCBmbGFzaCAKKyAqIGJ5IE5pY29sYXMgUGl0cmUpCisgKiAKICAqIE9jY2FzaW9uYWxseSBtYWludGFpbmVkIGJ5IFRoYXluZSBIYXJiYXVnaCB0aGFyYmF1Z2ggYXQgbG54aSBkb3QgY29tCiAgKgogICogVGhpcyBjb2RlIGlzIEdQTAogICoKLSAqICRJZDogY2ZpX2NtZHNldF8wMDAyLmMsdiAxLjExNCAyMDA0LzEyLzExIDE1OjQzOjUzIGRlZGVraW5kIEV4cCAkCisgKiAkSWQ6IGNmaV9jbWRzZXRfMDAwMi5jLHYgMS4xMTggMjAwNS8wNy8wNCAyMjozNDoyOSBnbGVpeG5lciBFeHAgJAogICoKICAqLwogCkBAIC0zNCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvY2ZpLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3hpcC5oPgogCiAjZGVmaW5lIEFNRF9CT09UTE9DX0JVRwogI2RlZmluZSBGT1JDRV9XT1JEX1dSSVRFIDAKQEAgLTQzLDYgKzQ4LDcgQEAKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX0FNRAkweDAwMDEKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX1NTVAkweDAwQkYKICNkZWZpbmUgU1NUNDlMRjAwNEIJICAgICAgICAweDAwNjAKKyNkZWZpbmUgU1NUNDlMRjAwOEEJCTB4MDA1YQogCiBzdGF0aWMgaW50IGNmaV9hbWRzdGRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICosIGxvZmZfdCwgc2l6ZV90LCBzaXplX3QgKiwgdV9jaGFyICopOwogc3RhdGljIGludCBjZmlfYW1kc3RkX3dyaXRlX3dvcmRzKHN0cnVjdCBtdGRfaW5mbyAqLCBsb2ZmX3QsIHNpemVfdCwgc2l6ZV90ICosIGNvbnN0IHVfY2hhciAqKTsKQEAgLTE5MSw2ICsxOTcsNyBAQAogfTsKIHN0YXRpYyBzdHJ1Y3QgY2ZpX2ZpeHVwIGplZGVjX2ZpeHVwX3RhYmxlW10gPSB7CiAJeyBNQU5VRkFDVFVSRVJfU1NULCBTU1Q0OUxGMDA0QiwgZml4dXBfdXNlX2Z3aF9sb2NrLCBOVUxMLCB9LAorCXsgTUFOVUZBQ1RVUkVSX1NTVCwgU1NUNDlMRjAwOEEsIGZpeHVwX3VzZV9md2hfbG9jaywgTlVMTCwgfSwKIAl7IDAsIDAsIE5VTEwsIE5VTEwgfQogfTsKIApAQCAtMzkxLDcgKzM5OCw3IEBACiAgKiBjb3JyZWN0bHkgYW5kIGlzIHRoZXJlZm9yZSBub3QgZG9uZQkocGFydGljdWxhcnkgd2l0aCBpbnRlcmxlYXZlZCBjaGlwcwogICogYXMgZWFjaCBjaGlwIG11c3QgYmUgY2hlY2tlZCBpbmRlcGVuZGFudGx5IG9mIHRoZSBvdGhlcnMpLgogICovCi1zdGF0aWMgaW50IGNoaXBfcmVhZHkoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyBpbnQgX194aXByYW0gY2hpcF9yZWFkeShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCW1hcF93b3JkIGQsIHQ7CiAKQEAgLTQwMSw2ICs0MDgsMzIgQEAKIAlyZXR1cm4gbWFwX3dvcmRfZXF1YWwobWFwLCBkLCB0KTsKIH0KIAorLyoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBjaGlwIGlzIHJlYWR5IGFuZCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUuCisgKgorICogUmVhZHkgaXMgb25lIG9mOiByZWFkIG1vZGUsIHF1ZXJ5IG1vZGUsIGVyYXNlLXN1c3BlbmQtcmVhZCBtb2RlIChpbiBhbnkKKyAqIG5vbi1zdXNwZW5kZWQgc2VjdG9yKSBhbmQgaXQgaXMgaW5kaWNhdGVkIGJ5IG5vIGJpdHMgdG9nZ2xpbmcuCisgKgorICogRXJyb3IgYXJlIGluZGljYXRlZCBieSB0b2dnbGluZyBiaXRzIG9yIGJpdHMgaGVsZCB3aXRoIHRoZSB3cm9uZyB2YWx1ZSwKKyAqIG9yIHdpdGggYml0cyB0b2dnbGluZy4KKyAqCisgKiBOb3RlIHRoYXQgYW55dGhpbmcgbW9yZSBjb21wbGljYXRlZCB0aGFuIGNoZWNraW5nIGlmIG5vIGJpdHMgYXJlIHRvZ2dsaW5nCisgKiAoaW5jbHVkaW5nIGNoZWNraW5nIERRNSBmb3IgYW4gZXJyb3Igc3RhdHVzKSBpcyB0cmlja3kgdG8gZ2V0IHdvcmtpbmcKKyAqIGNvcnJlY3RseSBhbmQgaXMgdGhlcmVmb3JlIG5vdCBkb25lCShwYXJ0aWN1bGFyeSB3aXRoIGludGVybGVhdmVkIGNoaXBzCisgKiBhcyBlYWNoIGNoaXAgbXVzdCBiZSBjaGVja2VkIGluZGVwZW5kYW50bHkgb2YgdGhlIG90aGVycykuCisgKgorICovCitzdGF0aWMgaW50IF9feGlwcmFtIGNoaXBfZ29vZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBhZGRyLCBtYXBfd29yZCBleHBlY3RlZCkKK3sKKwltYXBfd29yZCBvbGRkLCBjdXJkOworCisJb2xkZCA9IG1hcF9yZWFkKG1hcCwgYWRkcik7CisJY3VyZCA9IG1hcF9yZWFkKG1hcCwgYWRkcik7CisKKwlyZXR1cm4JbWFwX3dvcmRfZXF1YWwobWFwLCBvbGRkLCBjdXJkKSAmJiAKKwkJbWFwX3dvcmRfZXF1YWwobWFwLCBjdXJkLCBleHBlY3RlZCk7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X2NoaXAoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVuc2lnbmVkIGxvbmcgYWRyLCBpbnQgbW9kZSkKIHsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKQEAgLTQyMCwxMiArNDUzLDEyIEBACiAKIAkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiV2FpdGluZyBmb3IgY2hpcCB0byBiZSByZWFkeSB0aW1lZCBvdXQuXG4iKTsKLQkJCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQljZmlfdWRlbGF5KDEpOwotCQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkJLyogU29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUgYmVlbiBwbGF5aW5nIHdpdGggaXQuICovCiAJCQlnb3RvIHJldHJ5OwogCQl9CkBAIC00NzMsMTUgKzUwNiwyMyBAQAogCQkJCXJldHVybiAtRUlPOwogCQkJfQogCQkJCi0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJY2ZpX3VkZWxheSgxKTsKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCS8qIE5vYm9keSB3aWxsIHRvdWNoIGl0IHdoaWxlIGl0J3MgaW4gc3RhdGUgRkxfRVJBU0VfU1VTUEVORElORy4KIAkJCSAgIFNvIHdlIGNhbiBqdXN0IGxvb3AgaGVyZS4gKi8KIAkJfQogCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOwogCQlyZXR1cm4gMDsKIAorCWNhc2UgRkxfWElQX1dISUxFX0VSQVNJTkc6CisJCWlmIChtb2RlICE9IEZMX1JFQURZICYmIG1vZGUgIT0gRkxfUE9JTlQgJiYKKwkJICAgICghY2ZpcCB8fCAhKGNmaXAtPkVyYXNlU3VzcGVuZCYyKSkpCisJCQlnb3RvIHNsZWVwOworCQljaGlwLT5vbGRzdGF0ZSA9IGNoaXAtPnN0YXRlOworCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOworCQlyZXR1cm4gMDsKKwogCWNhc2UgRkxfUE9JTlQ6CiAJCS8qIE9ubHkgaWYgdGhlcmUncyBubyBvcGVyYXRpb24gc3VzcGVuZGVkLi4uICovCiAJCWlmIChtb2RlID09IEZMX1JFQURZICYmIGNoaXAtPm9sZHN0YXRlID09IEZMX1JFQURZKQpAQCAtNDkxLDEwICs1MzIsMTAgQEAKIAlzbGVlcDoKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQlzY2hlZHVsZSgpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCWdvdG8gcmVzZXR0aW1lOwogCX0KIH0KQEAgLTUxMiw2ICs1NTMsMTEgQEAKIAkJY2hpcC0+c3RhdGUgPSBGTF9FUkFTSU5HOwogCQlicmVhazsKIAorCWNhc2UgRkxfWElQX1dISUxFX0VSQVNJTkc6CisJCWNoaXAtPnN0YXRlID0gY2hpcC0+b2xkc3RhdGU7CisJCWNoaXAtPm9sZHN0YXRlID0gRkxfUkVBRFk7CisJCWJyZWFrOworCiAJY2FzZSBGTF9SRUFEWToKIAljYXNlIEZMX1NUQVRVUzoKIAkJLyogV2Ugc2hvdWxkIHJlYWxseSBtYWtlIHNldF92cHAoKSBjb3VudCwgcmF0aGVyIHRoYW4gZG9pbmcgdGhpcyAqLwpAQCAtNTIzLDYgKzU2OSwxOTggQEAKIAl3YWtlX3VwKCZjaGlwLT53cSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTVREX1hJUAorCisvKgorICogTm8gaW50ZXJydXB0IHdoYXQgc28gZXZlciBjYW4gYmUgc2VydmljZWQgd2hpbGUgdGhlIGZsYXNoIGlzbid0IGluIGFycmF5CisgKiBtb2RlLiAgVGhpcyBpcyBlbnN1cmVkIGJ5IHRoZSB4aXBfZGlzYWJsZSgpIGFuZCB4aXBfZW5hYmxlKCkgZnVuY3Rpb25zCisgKiBlbmNsb3NpbmcgYW55IGNvZGUgcGF0aCB3aGVyZSB0aGUgZmxhc2ggaXMga25vd24gbm90IHRvIGJlIGluIGFycmF5IG1vZGUuCisgKiBBbmQgd2l0aGluIGEgWElQIGRpc2FibGVkIGNvZGUgcGF0aCwgb25seSBmdW5jdGlvbnMgbWFya2VkIHdpdGggX194aXByYW0KKyAqIG1heSBiZSBjYWxsZWQgYW5kIG5vdGhpbmcgZWxzZSAoaXQncyBhIGdvb2QgdGhpbmcgdG8gaW5zcGVjdCBnZW5lcmF0ZWQKKyAqIGFzc2VtYmx5IHRvIG1ha2Ugc3VyZSBpbmxpbmUgZnVuY3Rpb25zIHdlcmUgYWN0dWFsbHkgaW5saW5lZCBhbmQgdGhhdCBnY2MKKyAqIGRpZG4ndCBlbWl0IGNhbGxzIHRvIGl0cyBvd24gc3VwcG9ydCBmdW5jdGlvbnMpLiBBbHNvIGNvbmZpZ3VyaW5nIE1URCBDRkkKKyAqIHN1cHBvcnQgdG8gYSBzaW5nbGUgYnVzd2lkdGggYW5kIGEgc2luZ2xlIGludGVybGVhdmUgaXMgYWxzbyByZWNvbW1lbmRlZC4KKyAqLworCitzdGF0aWMgdm9pZCB4aXBfZGlzYWJsZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCXVuc2lnbmVkIGxvbmcgYWRyKQoreworCS8qIFRPRE86IGNoaXBzIHdpdGggbm8gWElQIHVzZSBzaG91bGQgaWdub3JlIGFuZCByZXR1cm4gKi8KKwkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOyAvKiBlbnN1cmUgbW11IG1hcHBpbmcgaXMgdXAgdG8gZGF0ZSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9feGlwcmFtIHhpcF9lbmFibGUoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsCisJCQkJdW5zaWduZWQgbG9uZyBhZHIpCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisKKwlpZiAoY2hpcC0+c3RhdGUgIT0gRkxfUE9JTlQgJiYgY2hpcC0+c3RhdGUgIT0gRkxfUkVBRFkpIHsKKwkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4ZjApLCBhZHIpOworCQljaGlwLT5zdGF0ZSA9IEZMX1JFQURZOworCX0KKwkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOworCXhpcF9pcHJlZmV0Y2goKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qCisgKiBXaGVuIGEgZGVsYXkgaXMgcmVxdWlyZWQgZm9yIHRoZSBmbGFzaCBvcGVyYXRpb24gdG8gY29tcGxldGUsIHRoZQorICogeGlwX3VkZWxheSgpIGZ1bmN0aW9uIGlzIHBvbGxpbmcgZm9yIGJvdGggdGhlIGdpdmVuIHRpbWVvdXQgYW5kIHBlbmRpbmcKKyAqIChidXQgc3RpbGwgbWFza2VkKSBoYXJkd2FyZSBpbnRlcnJ1cHRzLiAgV2hlbmV2ZXIgdGhlcmUgaXMgYW4gaW50ZXJydXB0CisgKiBwZW5kaW5nIHRoZW4gdGhlIGZsYXNoIGVyYXNlIG9wZXJhdGlvbiBpcyBzdXNwZW5kZWQsIGFycmF5IG1vZGUgcmVzdG9yZWQgCisgKiBhbmQgaW50ZXJydXB0cyB1bm1hc2tlZC4gIFRhc2sgc2NoZWR1bGluZyBtaWdodCBhbHNvIGhhcHBlbiBhdCB0aGF0CisgKiBwb2ludC4gIFRoZSBDUFUgZXZlbnR1YWxseSByZXR1cm5zIGZyb20gdGhlIGludGVycnVwdCBvciB0aGUgY2FsbCB0bworICogc2NoZWR1bGUoKSBhbmQgdGhlIHN1c3BlbmRlZCBmbGFzaCBvcGVyYXRpb24gaXMgcmVzdW1lZCBmb3IgdGhlIHJlbWFpbmluZworICogb2YgdGhlIGRlbGF5IHBlcmlvZC4KKyAqCisgKiBXYXJuaW5nOiB0aGlzIGZ1bmN0aW9uIF93aWxsXyBmb29sIGludGVycnVwdCBsYXRlbmN5IHRyYWNpbmcgdG9vbHMuCisgKi8KKworc3RhdGljIHZvaWQgX194aXByYW0geGlwX3VkZWxheShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCQl1bnNpZ25lZCBsb25nIGFkciwgaW50IHVzZWMpCit7CisJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CisJc3RydWN0IGNmaV9wcmlfYW1kc3RkICpleHRwID0gY2ZpLT5jbWRzZXRfcHJpdjsKKwltYXBfd29yZCBzdGF0dXMsIE9LID0gQ01EKDB4ODApOworCXVuc2lnbmVkIGxvbmcgc3VzcGVuZGVkLCBzdGFydCA9IHhpcF9jdXJydGltZSgpOworCWZsc3RhdGVfdCBvbGRzdGF0ZTsKKworCWRvIHsKKwkJY3B1X3JlbGF4KCk7CisJCWlmICh4aXBfaXJxcGVuZGluZygpICYmIGV4dHAgJiYKKwkJICAgICgoY2hpcC0+c3RhdGUgPT0gRkxfRVJBU0lORyAmJiAoZXh0cC0+RXJhc2VTdXNwZW5kICYgMikpKSAmJgorCQkgICAgKGNmaV9pbnRlcmxlYXZlX2lzXzEoY2ZpKSB8fCBjaGlwLT5vbGRzdGF0ZSA9PSBGTF9SRUFEWSkpIHsKKwkJCS8qCisJCQkgKiBMZXQncyBzdXNwZW5kIHRoZSBlcmFzZSBvcGVyYXRpb24gd2hlbiBzdXBwb3J0ZWQuICAKKwkJCSAqIE5vdGUgdGhhdCB3ZSBjdXJyZW50bHkgZG9uJ3QgdHJ5IHRvIHN1c3BlbmQgCisJCQkgKiBpbnRlcmxlYXZlZCBjaGlwcyBpZiB0aGVyZSBpcyBhbHJlYWR5IGFub3RoZXIgCisJCQkgKiBvcGVyYXRpb24gc3VzcGVuZGVkIChpbWFnaW5lIHdoYXQgaGFwcGVucworCQkJICogd2hlbiBvbmUgY2hpcCB3YXMgYWxyZWFkeSBkb25lIHdpdGggdGhlIGN1cnJlbnQKKwkJCSAqIG9wZXJhdGlvbiB3aGlsZSBhbm90aGVyIGNoaXAgc3VzcGVuZGVkIGl0LCB0aGVuCisJCQkgKiB3ZSByZXN1bWUgdGhlIHdob2xlIHRoaW5nIGF0IG9uY2UpLiAgWWVzLCBpdAorCQkJICogY2FuIGhhcHBlbiEKKwkJCSAqLworCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4YjApLCBhZHIpOworCQkJdXNlYyAtPSB4aXBfZWxhcHNlZF9zaW5jZShzdGFydCk7CisJCQlzdXNwZW5kZWQgPSB4aXBfY3VycnRpbWUoKTsKKwkJCWRvIHsKKwkJCQlpZiAoeGlwX2VsYXBzZWRfc2luY2Uoc3VzcGVuZGVkKSA+IDEwMDAwMCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgY2hpcCBkb2Vzbid0IHdhbnQgdG8gc3VzcGVuZAorCQkJCQkgKiBhZnRlciB3YWl0aW5nIGZvciAxMDAgbXNlY3MuCisJCQkJCSAqIFRoaXMgaXMgYSBjcml0aWNhbCBlcnJvciBidXQgdGhlcmUKKwkJCQkJICogaXMgbm90IG11Y2ggd2UgY2FuIGRvIGhlcmUuCisJCQkJCSAqLworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXN0YXR1cyA9IG1hcF9yZWFkKG1hcCwgYWRyKTsKKwkJCX0gd2hpbGUgKCFtYXBfd29yZF9hbmRlcXVhbChtYXAsIHN0YXR1cywgT0ssIE9LKSk7CisKKwkJCS8qIFN1c3BlbmQgc3VjY2VlZGVkICovCisJCQlvbGRzdGF0ZSA9IGNoaXAtPnN0YXRlOworCQkJaWYgKCFtYXBfd29yZF9iaXRzc2V0KG1hcCwgc3RhdHVzLCBDTUQoMHg0MCkpKQorCQkJCWJyZWFrOworCQkJY2hpcC0+c3RhdGUgPSBGTF9YSVBfV0hJTEVfRVJBU0lORzsKKwkJCWNoaXAtPmVyYXNlX3N1c3BlbmRlZCA9IDE7CisJCQltYXBfd3JpdGUobWFwLCBDTUQoMHhmMCksIGFkcik7CisJCQkodm9pZCkgbWFwX3JlYWQobWFwLCBhZHIpOworCQkJYXNtIHZvbGF0aWxlICgiLnJlcCA4OyBub3A7IC5lbmRyIik7CisJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCisJCQkvKgorCQkJICogV2UncmUgYmFjay4gIEhvd2V2ZXIgc29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUKKwkJCSAqIGRlY2lkZWQgdG8gZ28gd3JpdGUgdG8gdGhlIGNoaXAgaWYgd2UgYXJlIGluCisJCQkgKiBhIHN1c3BlbmRlZCBlcmFzZSBzdGF0ZS4gIElmIHNvIGxldCdzIHdhaXQKKwkJCSAqIHVudGlsIGl0J3MgZG9uZS4KKwkJCSAqLworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXdoaWxlIChjaGlwLT5zdGF0ZSAhPSBGTF9YSVBfV0hJTEVfRVJBU0lORykgeworCQkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKKwkJCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJfQorCQkJLyogRGlzYWxsb3cgWElQIGFnYWluICovCisJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJCQkvKiBSZXN1bWUgdGhlIHdyaXRlIG9yIGVyYXNlIG9wZXJhdGlvbiAqLworCQkJbWFwX3dyaXRlKG1hcCwgQ01EKDB4MzApLCBhZHIpOworCQkJY2hpcC0+c3RhdGUgPSBvbGRzdGF0ZTsKKwkJCXN0YXJ0ID0geGlwX2N1cnJ0aW1lKCk7CisJCX0gZWxzZSBpZiAodXNlYyA+PSAxMDAwMDAwL0haKSB7CisJCQkvKgorCQkJICogVHJ5IHRvIHNhdmUgb24gQ1BVIHBvd2VyIHdoZW4gd2FpdGluZyBkZWxheQorCQkJICogaXMgYXQgbGVhc3QgYSBzeXN0ZW0gdGltZXIgdGljayBwZXJpb2QuCisJCQkgKiBObyBuZWVkIHRvIGJlIGV4dHJlbWVseSBhY2N1cmF0ZSBoZXJlLgorCQkJICovCisJCQl4aXBfY3B1X2lkbGUoKTsKKwkJfQorCQlzdGF0dXMgPSBtYXBfcmVhZChtYXAsIGFkcik7CisJfSB3aGlsZSAoIW1hcF93b3JkX2FuZGVxdWFsKG1hcCwgc3RhdHVzLCBPSywgT0spCisJCSAmJiB4aXBfZWxhcHNlZF9zaW5jZShzdGFydCkgPCB1c2VjKTsKK30KKworI2RlZmluZSBVREVMQVkobWFwLCBjaGlwLCBhZHIsIHVzZWMpICB4aXBfdWRlbGF5KG1hcCwgY2hpcCwgYWRyLCB1c2VjKQorCisvKgorICogVGhlIElOVkFMSURBVEVfQ0FDSEVEX1JBTkdFKCkgbWFjcm8gaXMgbm9ybWFsbHkgdXNlZCBpbiBwYXJhbGxlbCB3aGlsZQorICogdGhlIGZsYXNoIGlzIGFjdGl2ZWx5IHByb2dyYW1taW5nIG9yIGVyYXNpbmcgc2luY2Ugd2UgaGF2ZSB0byBwb2xsIGZvcgorICogdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSBhbnl3YXkuICBXZSBjYW4ndCBkbyB0aGF0IGluIGEgZ2VuZXJpYyB3YXkgd2l0aAorICogYSBYSVAgc2V0dXAgc28gZG8gaXQgYmVmb3JlIHRoZSBhY3R1YWwgZmxhc2ggb3BlcmF0aW9uIGluIHRoaXMgY2FzZQorICogYW5kIHN0dWIgaXQgb3V0IGZyb20gSU5WQUxJREFURV9DQUNIRV9VREVMQVkuCisgKi8KKyNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGZyb20sIHNpemUpICBcCisJSU5WQUxJREFURV9DQUNIRURfUkFOR0UobWFwLCBmcm9tLCBzaXplKQorCisjZGVmaW5lIElOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwgYWRyLCBsZW4sIHVzZWMpICBcCisJVURFTEFZKG1hcCwgY2hpcCwgYWRyLCB1c2VjKQorCisvKgorICogRXh0cmEgbm90ZXM6CisgKgorICogQWN0aXZhdGluZyB0aGlzIFhJUCBzdXBwb3J0IGNoYW5nZXMgdGhlIHdheSB0aGUgY29kZSB3b3JrcyBhIGJpdC4gIEZvcgorICogZXhhbXBsZSB0aGUgY29kZSB0byBzdXNwZW5kIHRoZSBjdXJyZW50IHByb2Nlc3Mgd2hlbiBjb25jdXJyZW50IGFjY2VzcworICogaGFwcGVucyBpcyBuZXZlciBleGVjdXRlZCBiZWNhdXNlIHhpcF91ZGVsYXkoKSB3aWxsIGFsd2F5cyByZXR1cm4gd2l0aCB0aGUKKyAqIHNhbWUgY2hpcCBzdGF0ZSBhcyBpdCB3YXMgZW50ZXJlZCB3aXRoLiAgVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm8gY2FyZSBmb3IKKyAqIHRoZSBwcmVzZW5jZSBvZiBhZGRfd2FpdF9xdWV1ZSgpIG9yIHNjaGVkdWxlKCkgY2FsbHMgZnJvbSB3aXRoaW4gYSBjb3VwbGUKKyAqIHhpcF9kaXNhYmxlKCknZCAgYXJlYXMgb2YgY29kZSwgbGlrZSBpbiBkb19lcmFzZV9vbmVibG9jayBmb3IgZXhhbXBsZS4KKyAqIFRoZSBxdWV1ZWluZyBhbmQgc2NoZWR1bGluZyBhcmUgYWx3YXlzIGhhcHBlbmluZyB3aXRoaW4geGlwX3VkZWxheSgpLgorICoKKyAqIFNpbWlsYXJseSwgZ2V0X2NoaXAoKSBhbmQgcHV0X2NoaXAoKSBqdXN0IGhhcHBlbiB0byBhbHdheXMgYmUgZXhlY3V0ZWQKKyAqIHdpdGggY2hpcC0+c3RhdGUgc2V0IHRvIEZMX1JFQURZIChvciBGTF9YSVBfV0hJTEVfKikgd2hlcmUgZmxhc2ggc3RhdGUKKyAqIGlzIGluIGFycmF5IG1vZGUsIHRoZXJlZm9yZSBuZXZlciBleGVjdXRpbmcgbWFueSBjYXNlcyB0aGVyZWluIGFuZCBub3QKKyAqIGNhdXNpbmcgYW55IHByb2JsZW0gd2l0aCBYSVAuCisgKi8KKworI2Vsc2UKKworI2RlZmluZSB4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcikKKyNkZWZpbmUgeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcikKKyNkZWZpbmUgWElQX0lOVkFMX0NBQ0hFRF9SQU5HRSh4Li4uKQorCisjZGVmaW5lIFVERUxBWShtYXAsIGNoaXAsIGFkciwgdXNlYykgIFwKK2RvIHsgIFwKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7ICBcCisJY2ZpX3VkZWxheSh1c2VjKTsgIFwKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsIGFkciwgbGVuLCB1c2VjKSAgXAorZG8geyAgXAorCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsgIFwKKwlJTlZBTElEQVRFX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsgIFwKKwljZmlfdWRlbGF5KHVzZWMpOyAgXAorCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7ICBcCit9IHdoaWxlICgwKQorCisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgZG9fcmVhZF9vbmVjaGlwKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgZmxjaGlwICpjaGlwLCBsb2ZmX3QgYWRyLCBzaXplX3QgbGVuLCB1X2NoYXIgKmJ1ZikKIHsKQEAgLTUzNSwxMCArNzczLDEwIEBACiAJLyogRW5zdXJlIGNtZCByZWFkL3dyaXRlcyBhcmUgYWxpZ25lZC4gKi8gCiAJY21kX2FkZHIgPSBhZHIgJiB+KG1hcF9iYW5rd2lkdGgobWFwKS0xKTsgCiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgY21kX2FkZHIsIEZMX1JFQURZKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTU1MSw3ICs3ODksNyBAQAogCiAJcHV0X2NoaXAobWFwLCBjaGlwLCBjbWRfYWRkcik7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjA1LDcgKzg0Myw3IEBACiAJc3RydWN0IGNmaV9wcml2YXRlICpjZmkgPSBtYXAtPmZsZHJ2X3ByaXY7CiAKICByZXRyeToKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCiAJaWYgKGNoaXAtPnN0YXRlICE9IEZMX1JFQURZKXsKICNpZiAwCkBAIC02MTQsNyArODUyLDcgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKIAkJCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAogCQlzY2hlZHVsZSgpOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKQEAgLTY0Myw3ICs4ODEsNyBAQAogCWNmaV9zZW5kX2dlbl9jbWQoMHgwMCwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJCiAJd2FrZV91cCgmY2hpcC0+d3EpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTIsNyArOTMwLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGRvX3dyaXRlX29uZXdvcmQoc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBmbGNoaXAgKmNoaXAsIHVuc2lnbmVkIGxvbmcgYWRyLCBtYXBfd29yZCBkYXR1bSkKK3N0YXRpYyBpbnQgX194aXByYW0gZG9fd3JpdGVfb25ld29yZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIG1hcF93b3JkIGRhdHVtKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CkBAIC03MTIsMTAgKzk1MCwxMCBAQAogCiAJYWRyICs9IGNoaXAtPnN0YXJ0OwogCi0JY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGFkciwgRkxfV1JJVElORyk7CiAJaWYgKHJldCkgewotCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC03MzUsNyArOTczLDkgQEAKIAkJZ290byBvcF9kb25lOwogCX0KIAorCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIG1hcF9iYW5rd2lkdGgobWFwKSk7CiAJRU5BQkxFX1ZQUChtYXApOworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKTsKICByZXRyeToKIAljZmlfc2VuZF9nZW5fY21kKDB4QUEsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CkBAIC03NDMsOSArOTgzLDkgQEAKIAltYXBfd3JpdGUobWFwLCBkYXR1bSwgYWRyKTsKIAljaGlwLT5zdGF0ZSA9IEZMX1dSSVRJTkc7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCWNmaV91ZGVsYXkoY2hpcC0+d29yZF93cml0ZV90aW1lKTsKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJY2hpcC0+d29yZF93cml0ZV90aW1lKTsKIAogCS8qIFNlZSBjb21tZW50IGFib3ZlIGZvciB0aW1lb3V0IHZhbHVlLiAqLwogCXRpbWVvID0gamlmZmllcyArIHVXcml0ZVRpbWVvdXQ7IApAQCAtNzU2LDM5ICs5OTYsNDMgQEAKIAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkJdGltZW8gPSBqaWZmaWVzICsgKEhaIC8gMik7IC8qIEZJWE1FICovCi0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCWlmIChjaGlwX3JlYWR5KG1hcCwgYWRyKSkKLQkJCWdvdG8gb3BfZG9uZTsKKwkJCWJyZWFrOwogCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7CisJCQl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJfQogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCWNmaV91ZGVsYXkoMSk7Ci0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwogCX0KKwkvKiBEaWQgd2Ugc3VjY2VlZD8gKi8KKwlpZiAoIWNoaXBfZ29vZChtYXAsIGFkciwgZGF0dW0pKSB7CisJCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KKwkJbWFwX3dyaXRlKCBtYXAsIENNRCgweEYwKSwgY2hpcC0+c3RhcnQgKTsKKwkJLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJaWYgKCsrcmV0cnlfY250IDw9IE1BWF9XT1JEX1JFVFJJRVMpIAorCQkJZ290byByZXRyeTsKIAotCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KLQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOwotCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KLQlpZiAoKytyZXRyeV9jbnQgPD0gTUFYX1dPUkRfUkVUUklFUykgCi0JCWdvdG8gcmV0cnk7Ci0KLQlyZXQgPSAtRUlPOworCQlyZXQgPSAtRUlPOworCX0KKwl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKICBvcF9kb25lOgogCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CiAJcHV0X2NoaXAobWFwLCBjaGlwLCBhZHIpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTgyMCw3ICsxMDY0LDcgQEAKIAkJbWFwX3dvcmQgdG1wX2J1ZjsKIAogIHJldHJ5OgotCQljZmlfc3Bpbl9sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOworCQlzcGluX2xvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CiAKIAkJaWYgKGNmaS0+Y2hpcHNbY2hpcG51bV0uc3RhdGUgIT0gRkxfUkVBRFkpIHsKICNpZiAwCkBAIC04MjksNyArMTA3Myw3IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2ZpLT5jaGlwc1tjaGlwbnVtXS53cSwgJndhaXQpOwogCi0JCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCQlzcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKIAogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjZmktPmNoaXBzW2NoaXBudW1dLndxLCAmd2FpdCk7CkBAIC04NDMsNyArMTA4Nyw3IEBACiAJCS8qIExvYWQgJ3RtcF9idWYnIHdpdGggb2xkIGNvbnRlbnRzIG9mIGZsYXNoICovCiAJCXRtcF9idWYgPSBtYXBfcmVhZChtYXAsIGJ1c19vZnMrY2hpcHN0YXJ0KTsKIAotCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOwogCiAJCS8qIE51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gYnVmZmVyICovCiAJCW4gPSBtaW5fdChpbnQsIGxlbiwgbWFwX2Jhbmt3aWR0aChtYXApLWkpOwpAQCAtODk4LDcgKzExNDIsNyBAQAogCQltYXBfd29yZCB0bXBfYnVmOwogCiAgcmV0cnkxOgotCQljZmlfc3Bpbl9sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOworCQlzcGluX2xvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CiAKIAkJaWYgKGNmaS0+Y2hpcHNbY2hpcG51bV0uc3RhdGUgIT0gRkxfUkVBRFkpIHsKICNpZiAwCkBAIC05MDcsNyArMTE1MSw3IEBACiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2ZpLT5jaGlwc1tjaGlwbnVtXS53cSwgJndhaXQpOwogCi0JCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCQlzcGluX3VubG9jayhjZmktPmNoaXBzW2NoaXBudW1dLm11dGV4KTsKIAogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjZmktPmNoaXBzW2NoaXBudW1dLndxLCAmd2FpdCk7CkBAIC05MjAsNyArMTE2NCw3IEBACiAKIAkJdG1wX2J1ZiA9IG1hcF9yZWFkKG1hcCwgb2ZzICsgY2hpcHN0YXJ0KTsKIAotCQljZmlfc3Bpbl91bmxvY2soY2ZpLT5jaGlwc1tjaGlwbnVtXS5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNmaS0+Y2hpcHNbY2hpcG51bV0ubXV0ZXgpOwogCiAJCXRtcF9idWYgPSBtYXBfd29yZF9sb2FkX3BhcnRpYWwobWFwLCB0bXBfYnVmLCBidWYsIDAsIGxlbik7CiAJCkBAIC05MzksOCArMTE4Myw5IEBACiAvKgogICogRklYTUU6IGludGVybGVhdmVkIG1vZGUgbm90IHRlc3RlZCwgYW5kIHByb2JhYmx5IG5vdCBzdXBwb3J0ZWQhCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGRvX3dyaXRlX2J1ZmZlcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgCi0JCQkJICB1bnNpZ25lZCBsb25nIGFkciwgY29uc3QgdV9jaGFyICpidWYsIGludCBsZW4pCitzdGF0aWMgaW50IF9feGlwcmFtIGRvX3dyaXRlX2J1ZmZlcihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhZHIsIGNvbnN0IHVfY2hhciAqYnVmLCAKKwkJCQkgICAgaW50IGxlbikKIHsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIEhaOwpAQCAtOTU0LDEwICsxMTk5LDEwIEBACiAJYWRyICs9IGNoaXAtPnN0YXJ0OwogCWNtZF9hZHIgPSBhZHI7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTk2Niw3ICsxMjExLDEwIEBACiAJREVCVUcoIE1URF9ERUJVR19MRVZFTDMsICJNVEQgJXMoKTogV1JJVEUgMHglLjhseCgweCUuOGx4KVxuIiwKIAkgICAgICAgX19mdW5jX18sIGFkciwgZGF0dW0ueFswXSApOwogCisJWElQX0lOVkFMX0NBQ0hFRF9SQU5HRShtYXAsIGFkciwgbGVuKTsKIAlFTkFCTEVfVlBQKG1hcCk7CisJeGlwX2Rpc2FibGUobWFwLCBjaGlwLCBjbWRfYWRyKTsKKwkKIAljZmlfc2VuZF9nZW5fY21kKDB4QUEsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJLy9jZmlfc2VuZF9nZW5fY21kKDB4QTAsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtOTk2LDkgKzEyNDQsOSBAQAogCW1hcF93cml0ZShtYXAsIENNRCgweDI5KSwgY21kX2Fkcik7CiAJY2hpcC0+c3RhdGUgPSBGTF9XUklUSU5HOwogCi0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKLQljZmlfdWRlbGF5KGNoaXAtPmJ1ZmZlcl93cml0ZV90aW1lKTsKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBtYXBfYmFua3dpZHRoKG1hcCksCisJCQkJY2hpcC0+d29yZF93cml0ZV90aW1lKTsKIAogCXRpbWVvID0gamlmZmllcyArIHVXcml0ZVRpbWVvdXQ7IAogCQkKQEAgLTEwMDksMzggKzEyNTcsMzkgQEAKIAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQkJYWRkX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQkJc2NoZWR1bGUoKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkJdGltZW8gPSBqaWZmaWVzICsgKEhaIC8gMik7IC8qIEZJWE1FICovCi0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChjaGlwX3JlYWR5KG1hcCwgYWRyKSkKKwkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKIAkJCWdvdG8gb3BfZG9uZTsKKwkJfQogCQkgICAgCiAJCWlmKCB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKIAkJCWJyZWFrOwogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCWNmaV91ZGVsYXkoMSk7Ci0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlVREVMQVkobWFwLCBjaGlwLCBhZHIsIDEpOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAotCSAgICAgICBfX2Z1bmNfXyApOwotCiAJLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLwogCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7CisJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcik7CiAJLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwogCisJcHJpbnRrKEtFUk5fV0FSTklORyAiTVREICVzKCk6IHNvZnR3YXJlIHRpbWVvdXRcbiIsCisJICAgICAgIF9fZnVuY19fICk7CisKIAlyZXQgPSAtRUlPOwogIG9wX2RvbmU6CiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTEzMCw3ICsxMzc5LDcgQEAKICAqIEhhbmRsZSBkZXZpY2VzIHdpdGggb25lIGVyYXNlIHJlZ2lvbiwgdGhhdCBvbmx5IGltcGxlbWVudAogICogdGhlIGNoaXAgZXJhc2UgY29tbWFuZC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgZG9fZXJhc2VfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCkKK3N0YXRpYyBpbnQgX194aXByYW0gZG9fZXJhc2VfY2hpcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSA9IG1hcC0+ZmxkcnZfcHJpdjsKIAl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIEhaOwpAQCAtMTE0MCwxNyArMTM4OSwyMCBAQAogCiAJYWRyID0gY2ZpLT5hZGRyX3VubG9jazE7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9XUklUSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBFUkFTRSAweCUuOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgY2hpcC0+c3RhcnQgKTsKIAorCVhJUF9JTlZBTF9DQUNIRURfUkFOR0UobWFwLCBhZHIsIG1hcC0+c2l6ZSk7CiAJRU5BQkxFX1ZQUChtYXApOworCXhpcF9kaXNhYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwogCWNmaV9zZW5kX2dlbl9jbWQoMHhBQSwgY2ZpLT5hZGRyX3VubG9jazEsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDU1LCBjZmktPmFkZHJfdW5sb2NrMiwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKIAljZmlfc2VuZF9nZW5fY21kKDB4ODAsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwpAQCAtMTE2Miw5ICsxNDE0LDkgQEAKIAljaGlwLT5lcmFzZV9zdXNwZW5kZWQgPSAwOwogCWNoaXAtPmluX3Byb2dyZXNzX2Jsb2NrX2FkZHIgPSBhZHI7CiAKLQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwotCW1zbGVlcChjaGlwLT5lcmFzZV90aW1lLzIpOwotCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCUlOVkFMSURBVEVfQ0FDSEVfVURFTEFZKG1hcCwgY2hpcCwKKwkJCQlhZHIsIG1hcC0+c2l6ZSwKKwkJCQljaGlwLT5lcmFzZV90aW1lKjUwMCk7CiAKIAl0aW1lbyA9IGppZmZpZXMgKyAoSFoqMjApOwogCkBAIC0xMTczLDEwICsxNDI1LDEwIEBACiAJCQkvKiBTb21lb25lJ3Mgc3VzcGVuZGVkIHRoZSBlcmFzZS4gU2xlZXAgKi8KIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIAkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwotCQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChjaGlwLT5lcmFzZV9zdXNwZW5kZWQpIHsKQEAgLTExODcsMzYgKzE0MzksMzYgQEAKIAkJfQogCiAJCWlmIChjaGlwX3JlYWR5KG1hcCwgYWRyKSkKLQkJCWdvdG8gb3BfZG9uZTsKLQotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lbykpCiAJCQlicmVhazsKIAorCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lbykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fICk7CisJCQlicmVhazsKKwkJfQorCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7CisJfQorCS8qIERpZCB3ZSBzdWNjZWVkPyAqLworCWlmICghY2hpcF9nb29kKG1hcCwgYWRyLCBtYXBfd29yZF9mZihtYXApKSkgeworCQkvKiByZXNldCBvbiBhbGwgZmFpbHVyZXMuICovCisJCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7CisJCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKworCQlyZXQgPSAtRUlPOwogCX0KIAotCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAotCSAgICAgICBfX2Z1bmNfXyApOwotCi0JLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLwotCW1hcF93cml0ZSggbWFwLCBDTUQoMHhGMCksIGNoaXAtPnN0YXJ0ICk7Ci0JLyogRklYTUUgLSBzaG91bGQgaGF2ZSByZXNldCBkZWxheSBiZWZvcmUgY29udGludWluZyAqLwotCi0JcmV0ID0gLUVJTzsKLSBvcF9kb25lOgogCWNoaXAtPnN0YXRlID0gRkxfUkVBRFk7CisJeGlwX2VuYWJsZShtYXAsIGNoaXAsIGFkcik7CiAJcHV0X2NoaXAobWFwLCBjaGlwLCBhZHIpOwotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBkb19lcmFzZV9vbmVibG9jayhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIGludCBsZW4sIHZvaWQgKnRodW5rKQorc3RhdGljIGludCBfX3hpcHJhbSBkb19lcmFzZV9vbmVibG9jayhzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgc3RydWN0IGZsY2hpcCAqY2hpcCwgdW5zaWduZWQgbG9uZyBhZHIsIGludCBsZW4sIHZvaWQgKnRodW5rKQogewogCXN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpID0gbWFwLT5mbGRydl9wcml2OwogCXVuc2lnbmVkIGxvbmcgdGltZW8gPSBqaWZmaWVzICsgSFo7CkBAIC0xMjI1LDE3ICsxNDc3LDIwIEBACiAKIAlhZHIgKz0gY2hpcC0+c3RhcnQ7CiAKLQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCXJldCA9IGdldF9jaGlwKG1hcCwgY2hpcCwgYWRyLCBGTF9FUkFTSU5HKTsKIAlpZiAocmV0KSB7Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlERUJVRyggTVREX0RFQlVHX0xFVkVMMywgIk1URCAlcygpOiBFUkFTRSAweCUuOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgYWRyICk7CiAKKwlYSVBfSU5WQUxfQ0FDSEVEX1JBTkdFKG1hcCwgYWRyLCBsZW4pOwogCUVOQUJMRV9WUFAobWFwKTsKKwl4aXBfZGlzYWJsZShtYXAsIGNoaXAsIGFkcik7CisKIAljZmlfc2VuZF9nZW5fY21kKDB4QUEsIGNmaS0+YWRkcl91bmxvY2sxLCBjaGlwLT5zdGFydCwgbWFwLCBjZmksIGNmaS0+ZGV2aWNlX3R5cGUsIE5VTEwpOwogCWNmaV9zZW5kX2dlbl9jbWQoMHg1NSwgY2ZpLT5hZGRyX3VubG9jazIsIGNoaXAtPnN0YXJ0LCBtYXAsIGNmaSwgY2ZpLT5kZXZpY2VfdHlwZSwgTlVMTCk7CiAJY2ZpX3NlbmRfZ2VuX2NtZCgweDgwLCBjZmktPmFkZHJfdW5sb2NrMSwgY2hpcC0+c3RhcnQsIG1hcCwgY2ZpLCBjZmktPmRldmljZV90eXBlLCBOVUxMKTsKQEAgLTEyNDYsMTAgKzE1MDEsMTAgQEAKIAljaGlwLT5zdGF0ZSA9IEZMX0VSQVNJTkc7CiAJY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkID0gMDsKIAljaGlwLT5pbl9wcm9ncmVzc19ibG9ja19hZGRyID0gYWRyOwotCQotCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JbXNsZWVwKGNoaXAtPmVyYXNlX3RpbWUvMik7Ci0JY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisKKwlJTlZBTElEQVRFX0NBQ0hFX1VERUxBWShtYXAsIGNoaXAsCisJCQkJYWRyLCBsZW4sCisJCQkJY2hpcC0+ZXJhc2VfdGltZSo1MDApOwogCiAJdGltZW8gPSBqaWZmaWVzICsgKEhaKjIwKTsKIApAQCAtMTI1OCwxMCArMTUxMywxMCBAQAogCQkJLyogU29tZW9uZSdzIHN1c3BlbmRlZCB0aGUgZXJhc2UuIFNsZWVwICovCiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmY2hpcC0+d3EsICZ3YWl0KTsKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQlzY2hlZHVsZSgpOwogCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmNoaXAtPndxLCAmd2FpdCk7Ci0JCQljZmlfc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKKwkJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoY2hpcC0+ZXJhc2Vfc3VzcGVuZGVkKSB7CkBAIC0xMjcxLDMxICsxNTI2LDMzIEBACiAJCQljaGlwLT5lcmFzZV9zdXNwZW5kZWQgPSAwOwogCQl9CiAKLQkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKQotCQkJZ290byBvcF9kb25lOwotCi0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvKSkKKwkJaWYgKGNoaXBfcmVhZHkobWFwLCBhZHIpKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKIAkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW8pKSB7CisJCQl4aXBfZW5hYmxlKG1hcCwgY2hpcCwgYWRyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAorCQkJCV9fZnVuY19fICk7CisJCQlicmVhazsKKwkJfQogCiAJCS8qIExhdGVuY3kgaXNzdWVzLiBEcm9wIHRoZSBsb2NrLCB3YWl0IGEgd2hpbGUgYW5kIHJldHJ5ICovCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgxKTsKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCVVERUxBWShtYXAsIGNoaXAsIGFkciwgMTAwMDAwMC9IWik7CiAJfQotCQotCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCAlcygpOiBzb2Z0d2FyZSB0aW1lb3V0XG4iLAotCSAgICAgICBfX2Z1bmNfXyApOwotCQotCS8qIHJlc2V0IG9uIGFsbCBmYWlsdXJlcy4gKi8KLQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOwotCS8qIEZJWE1FIC0gc2hvdWxkIGhhdmUgcmVzZXQgZGVsYXkgYmVmb3JlIGNvbnRpbnVpbmcgKi8KKwkvKiBEaWQgd2Ugc3VjY2VlZD8gKi8KKwlpZiAoIWNoaXBfZ29vZChtYXAsIGFkciwgbWFwX3dvcmRfZmYobWFwKSkpIHsKKwkJLyogcmVzZXQgb24gYWxsIGZhaWx1cmVzLiAqLworCQltYXBfd3JpdGUoIG1hcCwgQ01EKDB4RjApLCBjaGlwLT5zdGFydCApOworCQkvKiBGSVhNRSAtIHNob3VsZCBoYXZlIHJlc2V0IGRlbGF5IGJlZm9yZSBjb250aW51aW5nICovCiAKLQlyZXQgPSAtRUlPOwotIG9wX2RvbmU6CisJCXJldCA9IC1FSU87CisJfQorCiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTM1NSw3ICsxNjEyLDcgQEAKIAkJY2hpcCA9ICZjZmktPmNoaXBzW2ldOwogCiAJcmV0cnk6Ci0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCiAJCXN3aXRjaChjaGlwLT5zdGF0ZSkgewogCQljYXNlIEZMX1JFQURZOgpAQCAtMTM2OSwxNCArMTYyNiwxNCBAQAogCQkJICogd2l0aCB0aGUgY2hpcCBub3cgYW55d2F5LgogCQkJICovCiAJCWNhc2UgRkxfU1lOQ0lORzoKLQkJCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgogCQkJLyogTm90IGFuIGlkbGUgc3RhdGUgKi8KIAkJCWFkZF93YWl0X3F1ZXVlKCZjaGlwLT53cSwgJndhaXQpOwogCQkJCi0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCiAJCQlzY2hlZHVsZSgpOwogCkBAIC0xMzkxLDEzICsxNjQ4LDEzIEBACiAJZm9yIChpLS07IGkgPj0wOyBpLS0pIHsKIAkJY2hpcCA9ICZjZmktPmNoaXBzW2ldOwogCi0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkKIAkJaWYgKGNoaXAtPnN0YXRlID09IEZMX1NZTkNJTkcpIHsKIAkJCWNoaXAtPnN0YXRlID0gY2hpcC0+b2xkc3RhdGU7CiAJCQl3YWtlX3VwKCZjaGlwLT53cSk7CiAJCX0KLQkJY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCX0KIH0KIApAQCAtMTQxMyw3ICsxNjcwLDcgQEAKIAlmb3IgKGk9MDsgIXJldCAmJiBpPGNmaS0+bnVtY2hpcHM7IGkrKykgewogCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKLQkJY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fbG9jayhjaGlwLT5tdXRleCk7CiAKIAkJc3dpdGNoKGNoaXAtPnN0YXRlKSB7CiAJCWNhc2UgRkxfUkVBRFk6CkBAIC0xNDMzLDcgKzE2OTAsNyBAQAogCQkJcmV0ID0gLUVBR0FJTjsKIAkJCWJyZWFrOwogCQl9Ci0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAl9CiAKIAkvKiBVbmxvY2sgdGhlIGNoaXBzIGFnYWluICovCkBAIC0xNDQyLDEzICsxNjk5LDEzIEBACiAJCWZvciAoaS0tOyBpID49MDsgaS0tKSB7CiAJCQljaGlwID0gJmNmaS0+Y2hpcHNbaV07CiAKLQkJCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAkJCiAJCQlpZiAoY2hpcC0+c3RhdGUgPT0gRkxfUE1fU1VTUEVOREVEKSB7CiAJCQkJY2hpcC0+c3RhdGUgPSBjaGlwLT5vbGRzdGF0ZTsKIAkJCQl3YWtlX3VwKCZjaGlwLT53cSk7CiAJCQl9Ci0JCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQkJc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOwogCQl9CiAJfQogCQpAQCAtMTQ2Nyw3ICsxNzI0LDcgQEAKIAkKIAkJY2hpcCA9ICZjZmktPmNoaXBzW2ldOwogCi0JCWNmaV9zcGluX2xvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX2xvY2soY2hpcC0+bXV0ZXgpOwogCQkKIAkJaWYgKGNoaXAtPnN0YXRlID09IEZMX1BNX1NVU1BFTkRFRCkgewogCQkJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKQEAgLTE0NzcsNyArMTczNCw3IEBACiAJCWVsc2UKIAkJCXByaW50ayhLRVJOX0VSUiAiQXJnaC4gQ2hpcCBub3QgaW4gUE1fU1VTUEVOREVEIHN0YXRlIHVwb24gcmVzdW1lKClcbiIpOwogCi0JCWNmaV9zcGluX3VubG9jayhjaGlwLT5tdXRleCk7CisJCXNwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmggYi9kcml2ZXJzL210ZC9jaGlwcy9md2hfbG9jay5oCmluZGV4IGZiZjQ0NzAuLmUxYTViNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NoaXBzL2Z3aF9sb2NrLmgKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvZndoX2xvY2suaApAQCAtNTgsMTAgKzU4LDEwIEBACiAJICogdG8gZmxhc2ggbWVtb3J5IC0gdGhhdCBtZWFucyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2hlY2sgc3RhdHVzCiAJICogYW5kIHRpbWVvdXQuCiAJICovCi0JY2ZpX3NwaW5fbG9jayhjaGlwLT5tdXRleCk7CisJc3Bpbl9sb2NrKGNoaXAtPm11dGV4KTsKIAlyZXQgPSBnZXRfY2hpcChtYXAsIGNoaXAsIGFkciwgRkxfTE9DS0lORyk7CiAJaWYgKHJldCkgewotCQljZmlfc3Bpbl91bmxvY2soY2hpcC0+bXV0ZXgpOworCQlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC03MSw3ICs3MSw3IEBACiAJLyogRG9uZSBhbmQgaGFwcHkuICovCiAJY2hpcC0+c3RhdGUgPSBGTF9SRUFEWTsKIAlwdXRfY2hpcChtYXAsIGNoaXAsIGFkcik7Ci0JY2ZpX3NwaW5fdW5sb2NrKGNoaXAtPm11dGV4KTsKKwlzcGluX3VubG9jayhjaGlwLT5tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NoaXBzL2dlbl9wcm9iZS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMKaW5kZXggZmM5ODJjNC4uZGMwNjViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMKKysrIGIvZHJpdmVycy9tdGQvY2hpcHMvZ2VuX3Byb2JlLmMKQEAgLTIsNyArMiw3IEBACiAgKiBSb3V0aW5lcyBjb21tb24gdG8gYWxsIENGSS10eXBlIHByb2Jlcy4KICAqIChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgogICogR1BMJ2QKLSAqICRJZDogZ2VuX3Byb2JlLmMsdiAxLjIxIDIwMDQvMDgvMTQgMTU6MTQ6MDUgZHdtdzIgRXhwICQKKyAqICRJZDogZ2VuX3Byb2JlLmMsdiAxLjIyIDIwMDUvMDEvMjQgMjM6NDk6NTAgcm1rIEV4cCAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTYyLDcgKzE2Miw3IEBACiAJaW50IG1heF9jaGlwcyA9IG1hcF9iYW5rd2lkdGgobWFwKTsgLyogQW5kIG1pbmltdW0gMSAqLwogCWludCBucl9jaGlwcywgdHlwZTsKIAotCWZvciAobnJfY2hpcHMgPSBtaW5fY2hpcHM7IG5yX2NoaXBzIDw9IG1heF9jaGlwczsgbnJfY2hpcHMgPDw9IDEpIHsKKwlmb3IgKG5yX2NoaXBzID0gbWF4X2NoaXBzOyBucl9jaGlwcyA+PSBtaW5fY2hpcHM7IG5yX2NoaXBzID4+PSAxKSB7CiAKIAkJaWYgKCFjZmlfaW50ZXJsZWF2ZV9zdXBwb3J0ZWQobnJfY2hpcHMpKQogCQkgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jIGIvZHJpdmVycy9tdGQvY2hpcHMvamVkZWNfcHJvYmUuYwppbmRleCAzMDMyNWEyLi4zMGRhNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9jaGlwcy9qZWRlY19wcm9iZS5jCisrKyBiL2RyaXZlcnMvbXRkL2NoaXBzL2plZGVjX3Byb2JlLmMKQEAgLTEsNyArMSw3IEBACiAvKiAKICAgIENvbW1vbiBGbGFzaCBJbnRlcmZhY2UgcHJvYmUgY29kZS4KICAgIChDKSAyMDAwIFJlZCBIYXQuIEdQTCdkLgotICAgJElkOiBqZWRlY19wcm9iZS5jLHYgMS42MSAyMDA0LzExLzE5IDIwOjUyOjE2IHRoYXluZSBFeHAgJAorICAgJElkOiBqZWRlY19wcm9iZS5jLHYgMS42MyAyMDA1LzAyLzE0IDE2OjMwOjMyIGJqZCBFeHAgJAogICAgU2VlIEpFREVDIChodHRwOi8vd3d3LmplZGVjLm9yZy8pIHN0YW5kYXJkIEpFU0QyMUMgKHNlY3Rpb24gMy41KQogICAgZm9yIHRoZSBzdGFuZGFyZCB0aGlzIHByb2JlIGdvZXMgYmFjayB0by4KIApAQCAtMTQyLDYgKzE0Miw3IEBACiAjZGVmaW5lIFNTVDI5TEU1MTIJMHgwMDNkCiAjZGVmaW5lIFNTVDM5TEY4MDAJMHgyNzgxCiAjZGVmaW5lIFNTVDM5TEYxNjAJMHgyNzgyCisjZGVmaW5lIFNTVDM5VkYxNjAxCTB4MjM0YgogI2RlZmluZSBTU1QzOUxGNTEyCTB4MDBENAogI2RlZmluZSBTU1QzOUxGMDEwCTB4MDBENQogI2RlZmluZSBTU1QzOUxGMDIwCTB4MDBENgpAQCAtMTQ0OCw2ICsxNDQ5LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFSU5GTygweDEwMDAsMjU2KSwKICAgICAgICAgICAgICAgICAgICAgICAgRVJBU0VJTkZPKDB4MTAwMCwyNTYpCiAgICAgICAgICAgICAgICB9CisJfSwgeworICAgICAgICAgICAgICAgLm1mcl9pZCAgICAgICAgID0gTUFOVUZBQ1RVUkVSX1NTVCwgICAgIC8qIHNob3VsZCBiZSBDRkkgKi8KKyAgICAgICAgICAgICAgIC5kZXZfaWQgICAgICAgICA9IFNTVDM5VkYxNjAxLAorICAgICAgICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIlNTVCAzOVZGMTYwMSIsCisgICAgICAgICAgICAgICAudWFkZHIgICAgICAgICAgPSB7CisgICAgICAgICAgICAgICAgICAgICAgIFswXSA9IE1URF9VQUREUl8weDU1NTVfMHgyQUFBLCAgLyogeDggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgWzFdID0gTVREX1VBRERSXzB4NTU1NV8weDJBQUEgICAvKiB4MTYgKi8KKyAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAuRGV2U2l6ZSAgICAgICAgPSBTSVpFXzJNaUIsCisgICAgICAgICAgICAgICAuQ21kU2V0ICAgICAgICAgPSBQX0lEX0FNRF9TVEQsCisgICAgICAgICAgICAgICAuTnVtRXJhc2VSZWdpb25zPSAyLAorICAgICAgICAgICAgICAgLnJlZ2lvbnMgICAgICAgID0geworICAgICAgICAgICAgICAgICAgICAgICBFUkFTRUlORk8oMHgxMDAwLDI1NiksCisgICAgICAgICAgICAgICAgICAgICAgIEVSQVNFSU5GTygweDEwMDAsMjU2KQorICAgICAgICAgICAgICAgfQogCiAgICAgICAgfSwgewogCQkubWZyX2lkCQk9IE1BTlVGQUNUVVJFUl9TVCwJLyogRklYTUUgLSBDRkkgZGV2aWNlPyAqLwpAQCAtMTg1Niw2ICsxODcyLDE2IEBACiAJY2FzZSBDRklfREVWSUNFVFlQRV9YODoKIAkJbWZyID0gKF9fdTgpZmluZm8tPm1mcl9pZDsKIAkJaWQgPSAoX191OClmaW5mby0+ZGV2X2lkOworCisJCS8qIGJqZDogaXQgc2VlbXMgdGhhdCBpZiB3ZSBkbyB0aGlzLCB3ZSBjYW4gZW5kIHVwCisJCSAqIGRldGVjdGluZyAxNmJpdCBmbGFzaGVzIGFzIGFuIDhiaXQgZGV2aWNlLCBldmVuIHRob3VnaAorCQkgKiB0aGVyZSBhcmVuJ3QuCisJCSAqLworCQlpZiAoZmluZm8tPmRldl9pZCA+IDB4ZmYpIHsKKwkJCURFQlVHKCBNVERfREVCVUdfTEVWRUwzLCAiJXMoKTogSUQgaXMgbm90IDhiaXRcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJZ290byBtYXRjaF9kb25lOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ0ZJX0RFVklDRVRZUEVfWDE2OgogCQltZnIgPSAoX191MTYpZmluZm8tPm1mcl9pZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMgYi9kcml2ZXJzL210ZC9jbWRsaW5lcGFydC5jCmluZGV4IDYwYWI0YjguLmVmMjQ4MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2NtZGxpbmVwYXJ0LmMKKysrIGIvZHJpdmVycy9tdGQvY21kbGluZXBhcnQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IGNtZGxpbmVwYXJ0LmMsdiAxLjE3IDIwMDQvMTEvMjYgMTE6MTg6NDcgbGF2aW5lbiBFeHAgJAorICogJElkOiBjbWRsaW5lcGFydC5jLHYgMS4xOCAyMDA1LzA2LzA3IDE1OjA0OjI2IGpvZXJuIEV4cCAkCiAgKgogICogUmVhZCBmbGFzaCBwYXJ0aXRpb24gdGFibGUgZnJvbSBjb21tYW5kIGxpbmUKICAqCkBAIC0yMzksNyArMjM5LDggQEAKIAkJCQkmbnVtX3BhcnRzLAkvKiBvdXQ6IG51bWJlciBvZiBwYXJ0cyAqLwogCQkJCTAsCQkvKiBmaXJzdCBwYXJ0aXRpb24gKi8KIAkJCQkodW5zaWduZWQgY2hhcioqKSZ0aGlzX210ZCwgLyogb3V0OiBleHRyYSBtZW0gKi8KLQkJCQltdGRfaWRfbGVuICsgMSArIHNpemVvZigqdGhpc19tdGQpKTsKKwkJCQltdGRfaWRfbGVuICsgMSArIHNpemVvZigqdGhpc19tdGQpICsgCisJCQkJc2l6ZW9mKHZvaWQqKS0xIC8qYWxpZ25tZW50Ki8pOwogCQlpZighcGFydHMpCiAJCXsKIAkJCS8qCkBAIC0yNTIsNiArMjUzLDkgQEAKIAkJCSByZXR1cm4gMDsKIAkJIH0KIAorCQkvKiBhbGlnbiB0aGlzX210ZCAqLworCQl0aGlzX210ZCA9IChzdHJ1Y3QgY21kbGluZV9tdGRfcGFydGl0aW9uICopIAorCQkJQUxJR04oKHVuc2lnbmVkIGxvbmcpdGhpc19tdGQsIHNpemVvZih2b2lkKikpOwogCQkvKiBlbnRlciByZXN1bHRzICovCSAgICAKIAkJdGhpc19tdGQtPnBhcnRzID0gcGFydHM7CiAJCXRoaXNfbXRkLT5udW1fcGFydHMgPSBudW1fcGFydHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9ibG9jazJtdGQuYwppbmRleCBjZmU2Y2NmLi40YTdhODA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL2Jsb2NrMm10ZC5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvYmxvY2sybXRkLmMKQEAgLTEsMTAgKzEsOSBAQAogLyoKLSAqICRJZDogYmxvY2sybXRkLmMsdiAxLjIzIDIwMDUvMDEvMDUgMTc6MDU6NDYgZHdtdzIgRXhwICQKKyAqICRJZDogYmxvY2sybXRkLmMsdiAxLjI4IDIwMDUvMDMvMTkgMjI6NDA6NDQgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBibG9jazJtdGQuYyAtIGNyZWF0ZSBhbiBtdGQgZnJvbSBhIGJsb2NrIGRldmljZQogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyCVNpbW9uIEV2YW5zIDxzcHNlQHNlY3JldC5vcmcudWs+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDQJCUdhcmV0aCBCdWx0IDxHYXJldGhARW5jcnlwdGVjLm5ldD4KICAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1CUr2cm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPgogICoKICAqIExpY2VuY2U6IEdQTApAQCAtMjAsNyArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogCi0jZGVmaW5lIFZFUlNJT04gIiRSZXZpc2lvbjogMS4yMyAkIgorI2RlZmluZSBWRVJTSU9OICIkUmV2aXNpb246IDEuMjggJCIKIAogCiAjZGVmaW5lIEVSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSICJibG9jazJtdGQ6ICIgZm10ICJcbiIgLCAjIyBhcmdzKQpAQCAtODksNyArODgsNiBAQAogc3RhdGljIHN0cnVjdCBwYWdlKiBwYWdlX3JlYWRhaGVhZChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IGluZGV4KQogewogCWZpbGxlcl90ICpmaWxsZXIgPSAoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZTsKLQkvL2RvX3BhZ2VfY2FjaGVfcmVhZGFoZWFkKG1hcHBpbmcsIGluZGV4LCBYWFgsIDY0KTsKIAljYWNoZV9yZWFkYWhlYWQobWFwcGluZywgaW5kZXgpOwogCXJldHVybiByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsIGZpbGxlciwgTlVMTCk7CiB9CkBAIC0xNTcsNyArMTU1LDcgQEAKIAlzdHJ1Y3QgYmxvY2sybXRkX2RldiAqZGV2ID0gbXRkLT5wcml2OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBpbmRleCA9IGZyb20gPj4gUEFHRV9TSElGVDsKLQlpbnQgb2Zmc2V0ID0gZnJvbSAmIChQQUdFX1NISUZULTEpOworCWludCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfU0laRS0xKTsKIAlpbnQgY3B5bGVuOwogCiAJaWYgKGZyb20gPiBtdGQtPnNpemUpCkBAIC0zNzAsMTYgKzM2OCwxNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgcGFyc2VfbnVtMzIodTMyICpudW0zMiwgY29uc3QgY2hhciAqdG9rZW4pCitzdGF0aWMgaW50IHBhcnNlX251bShzaXplX3QgKm51bSwgY29uc3QgY2hhciAqdG9rZW4pCiB7CiAJY2hhciAqZW5kcDsKLQl1bnNpZ25lZCBsb25nIG47CisJc2l6ZV90IG47CiAKLQluID0gdXN0cnRvdWwodG9rZW4sICZlbmRwLCAwKTsKKwluID0gKHNpemVfdCkgdXN0cnRvdWwodG9rZW4sICZlbmRwLCAwKTsKIAlpZiAoKmVuZHApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKm51bTMyID0gbjsKKwkqbnVtID0gbjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDIyLDcgKzQyMCw3IEBACiAJY2hhciBidWZbODArMTJdLCAqc3RyPWJ1ZjsgLyogODAgZm9yIGRldmljZSwgMTIgZm9yIGVyYXNlIHNpemUgKi8KIAljaGFyICp0b2tlblsyXTsKIAljaGFyICpuYW1lOwotCXUzMiBlcmFzZV9zaXplID0gUEFHRV9TSVpFOworCXNpemVfdCBlcmFzZV9zaXplID0gUEFHRV9TSVpFOwogCWludCBpLCByZXQ7CiAKIAlpZiAoc3Rybmxlbih2YWwsIHNpemVvZihidWYpKSA+PSBzaXplb2YoYnVmKSkKQEAgLTQ0OSw3ICs0NDcsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICh0b2tlblsxXSkgewotCQlyZXQgPSBwYXJzZV9udW0zMigmZXJhc2Vfc2l6ZSwgdG9rZW5bMV0pOworCQlyZXQgPSBwYXJzZV9udW0oJmVyYXNlX3NpemUsIHRva2VuWzFdKTsKIAkJaWYgKHJldCkKIAkJCXBhcnNlX2VycigiaWxsZWdhbCBlcmFzZSBzaXplIik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9tczAyLW52LmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL21zMDItbnYuYwppbmRleCAzODBmZjA4Li5mNTAyNmNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL21zMDItbnYuYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL21zMDItbnYuYwpAQCAtNiw3ICs2LDcgQEAKICAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKgkkSWQ6IG1zMDItbnYuYyx2IDEuOCAyMDA1LzAxLzA1IDE4OjA1OjEyIGR3bXcyIEV4cCAkCisgKgkkSWQ6IG1zMDItbnYuYyx2IDEuMTAgMjAwNS8wNi8yMCAxMjoyNDo0MSBtYWNybyBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC05OSw4ICs5OSw4IEBACiAJICogVGhlIGZpcm13YXJlIHdyaXRlcyBNUzAyTlZfSUQgYXQgTVMwMk5WX01BR0lDIGFuZCBhbHNvCiAJICogYSBkaWFnbm9zdGljIHN0YXR1cyBhdCBNUzAyTlZfRElBRy4KIAkgKi8KLQltczAybnZfZGlhZ3AgPSAobXMwMm52X3VpbnQgKikoS1NFRzFBRERSKGFkZHIgKyBNUzAyTlZfRElBRykpOwotCW1zMDJudl9tYWdpY3AgPSAobXMwMm52X3VpbnQgKikoS1NFRzFBRERSKGFkZHIgKyBNUzAyTlZfTUFHSUMpKTsKKwltczAybnZfZGlhZ3AgPSAobXMwMm52X3VpbnQgKikoQ0tTRUcxQUREUihhZGRyICsgTVMwMk5WX0RJQUcpKTsKKwltczAybnZfbWFnaWNwID0gKG1zMDJudl91aW50ICopKENLU0VHMUFERFIoYWRkciArIE1TMDJOVl9NQUdJQykpOwogCWVyciA9IGdldF9kYmUobXMwMm52X21hZ2ljLCBtczAybnZfbWFnaWNwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gMDsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQlnb3RvIGVycl9vdXRfY3NyX3JlczsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJtdGQlZDogJXMgYXQgMHglMDhseCwgc2l6ZSAldU1pQi5cbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAibXRkJWQ6ICVzIGF0IDB4JTA4bHgsIHNpemUgJXp1TWlCLlxuIiwKIAkJbXRkLT5pbmRleCwgbXMwMm52X25hbWUsIGFkZHIsIHNpemUgPj4gMjApOwogCiAJbXAtPm5leHQgPSByb290X21zMDJudl9tdGQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tdGRyYW0uYwppbmRleCBlZGFjNDE1Li5iYjcxM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9kZXZpY2VzL210ZHJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvbXRkcmFtLmMKQEAgLTEsOSArMSwxMCBAQAogLyoKICAqIG10ZHJhbSAtIGEgdGVzdCBtdGQgZGV2aWNlCi0gKiAkSWQ6IG10ZHJhbS5jLHYgMS4zNSAyMDA1LzAxLzA1IDE4OjA1OjEyIGR3bXcyIEV4cCAkCisgKiAkSWQ6IG10ZHJhbS5jLHYgMS4zNyAyMDA1LzA0LzIxIDAzOjQyOjExIGpvZXJuIEV4cCAkCiAgKiBBdXRob3I6IEFsZXhhbmRlciBMYXJzc29uIDxhbGV4QGNlbmRpby5zZT4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWxleGFuZGVyIExhcnNzb24gPGFsZXhAY2VuZGlvLnNlPgorICogQ29weXJpZ2h0IChjKSAyMDA1IEpvZXJuIEVuZ2VsIDxqb2VybkB3aC5maC13ZWRlbC5kZT4KICAqCiAgKiBUaGlzIGNvZGUgaXMgR1BMCiAgKgpAQCAtMTgsMjEzICsxOSwxNDAgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvY29tcGF0bWFjLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgogCi0jaWZuZGVmIENPTkZJR19NVERSQU1fQUJTX1BPUwotICAjZGVmaW5lIENPTkZJR19NVERSQU1fQUJTX1BPUyAwCi0jZW5kaWYKLQotI2lmIENPTkZJR19NVERSQU1fQUJTX1BPUyA+IDAKLSAgI2luY2x1ZGUgPGFzbS9pby5oPgotI2VuZGlmCi0KLSNpZmRlZiBNT0RVTEUKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsX3NpemUgPSBDT05GSUdfTVREUkFNX1RPVEFMX1NJWkU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlcmFzZV9zaXplID0gQ09ORklHX01URFJBTV9FUkFTRV9TSVpFOwotbW9kdWxlX3BhcmFtKHRvdGFsX3NpemUsdWxvbmcsMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHRvdGFsX3NpemUsICJUb3RhbCBkZXZpY2Ugc2l6ZSBpbiBLaUIiKTsKLW1vZHVsZV9wYXJhbShlcmFzZV9zaXplLHVsb25nLDApOwotTU9EVUxFX1BBUk1fREVTQyhlcmFzZV9zaXplLCAiRGV2aWNlIGVyYXNlIGJsb2NrIHNpemUgaW4gS2lCIik7CiAjZGVmaW5lIE1URFJBTV9UT1RBTF9TSVpFICh0b3RhbF9zaXplICogMTAyNCkKICNkZWZpbmUgTVREUkFNX0VSQVNFX1NJWkUgKGVyYXNlX3NpemUgKiAxMDI0KQotI2Vsc2UKLSNkZWZpbmUgTVREUkFNX1RPVEFMX1NJWkUgKENPTkZJR19NVERSQU1fVE9UQUxfU0laRSAqIDEwMjQpCi0jZGVmaW5lIE1URFJBTV9FUkFTRV9TSVpFIChDT05GSUdfTVREUkFNX0VSQVNFX1NJWkUgKiAxMDI0KQotI2VuZGlmCiAKKyNpZmRlZiBNT0RVTEUKK21vZHVsZV9wYXJhbSh0b3RhbF9zaXplLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRvdGFsX3NpemUsICJUb3RhbCBkZXZpY2Ugc2l6ZSBpbiBLaUIiKTsKK21vZHVsZV9wYXJhbShlcmFzZV9zaXplLCB1bG9uZywgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGVyYXNlX3NpemUsICJEZXZpY2UgZXJhc2UgYmxvY2sgc2l6ZSBpbiBLaUIiKTsKKyNlbmRpZgogCiAvLyBXZSBjb3VsZCBzdG9yZSB0aGVzZSBpbiB0aGUgbXRkIHN0cnVjdHVyZSwgYnV0IHdlIG9ubHkgc3VwcG9ydCAxIGRldmljZS4uCiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICptdGRfaW5mbzsKIAotCi1zdGF0aWMgaW50Ci1yYW1fZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKK3N0YXRpYyBpbnQgcmFtX2VyYXNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHIpCiB7Ci0gIERFQlVHKE1URF9ERUJVR19MRVZFTDIsICJyYW1fZXJhc2UocG9zOiVsZCwgbGVuOiVsZClcbiIsIChsb25nKWluc3RyLT5hZGRyLCAobG9uZylpbnN0ci0+bGVuKTsKLSAgaWYgKGluc3RyLT5hZGRyICsgaW5zdHItPmxlbiA+IG10ZC0+c2l6ZSkgewotICAgIERFQlVHKE1URF9ERUJVR19MRVZFTDEsICJyYW1fZXJhc2UoKSBvdXQgb2YgYm91bmRzICglbGQgPiAlbGQpXG4iLCAobG9uZykoaW5zdHItPmFkZHIgKyBpbnN0ci0+bGVuKSwgKGxvbmcpbXRkLT5zaXplKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQotCQotICBtZW1zZXQoKGNoYXIgKiltdGQtPnByaXYgKyBpbnN0ci0+YWRkciwgMHhmZiwgaW5zdHItPmxlbik7Ci0JCi0gIGluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOwotICBtdGRfZXJhc2VfY2FsbGJhY2soaW5zdHIpOworCWlmIChpbnN0ci0+YWRkciArIGluc3RyLT5sZW4gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOwogCi0gIHJldHVybiAwOworCW1lbXNldCgoY2hhciAqKW10ZC0+cHJpdiArIGluc3RyLT5hZGRyLCAweGZmLCBpbnN0ci0+bGVuKTsKKworCWluc3RyLT5zdGF0ZSA9IE1URF9FUkFTRV9ET05FOworCW10ZF9lcmFzZV9jYWxsYmFjayhpbnN0cik7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYW1fcG9pbnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqKm10ZGJ1ZikKK3N0YXRpYyBpbnQgcmFtX3BvaW50KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqKm10ZGJ1ZikKIHsKLSAgaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCi0gICAgcmV0dXJuIC1FSU5WQUw7Ci0JCi0gICptdGRidWYgPSBtdGQtPnByaXYgKyBmcm9tOwotICAqcmV0bGVuID0gbGVuOwotICByZXR1cm4gMDsKKwlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqbXRkYnVmID0gbXRkLT5wcml2ICsgZnJvbTsKKwkqcmV0bGVuID0gbGVuOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByYW1fdW5wb2ludCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYWRkciwgbG9mZl90IGZyb20sCi0JCQkgc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIHJhbV91bnBvaW50KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKiBhZGRyLCBsb2ZmX3QgZnJvbSwKKwkJc2l6ZV90IGxlbikKIHsKLSAgREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInJhbV91bnBvaW50XG4iKTsKIH0KIAogc3RhdGljIGludCByYW1fcmVhZChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sCi0JICAgICBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCisJCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKIHsKLSAgREVCVUcoTVREX0RFQlVHX0xFVkVMMiwgInJhbV9yZWFkKHBvczolbGQsIGxlbjolbGQpXG4iLCAobG9uZylmcm9tLCAobG9uZylsZW4pOwotICBpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkgewotICAgIERFQlVHKE1URF9ERUJVR19MRVZFTDEsICJyYW1fcmVhZCgpIG91dCBvZiBib3VuZHMgKCVsZCA+ICVsZClcbiIsIChsb25nKShmcm9tICsgbGVuKSwgKGxvbmcpbXRkLT5zaXplKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQorCWlmIChmcm9tICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICBtZW1jcHkoYnVmLCBtdGQtPnByaXYgKyBmcm9tLCBsZW4pOworCW1lbWNweShidWYsIG10ZC0+cHJpdiArIGZyb20sIGxlbik7CiAKLSAgKnJldGxlbj1sZW47Ci0gIHJldHVybiAwOworCSpyZXRsZW4gPSBsZW47CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmFtX3dyaXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCi0JICAgICAgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQorCQlzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCiB7Ci0gIERFQlVHKE1URF9ERUJVR19MRVZFTDIsICJyYW1fd3JpdGUocG9zOiVsZCwgbGVuOiVsZClcbiIsIChsb25nKXRvLCAobG9uZylsZW4pOwotICBpZiAodG8gKyBsZW4gPiBtdGQtPnNpemUpIHsKLSAgICBERUJVRyhNVERfREVCVUdfTEVWRUwxLCAicmFtX3dyaXRlKCkgb3V0IG9mIGJvdW5kcyAoJWxkID4gJWxkKVxuIiwgKGxvbmcpKHRvICsgbGVuKSwgKGxvbmcpbXRkLT5zaXplKTsKLSAgICByZXR1cm4gLUVJTlZBTDsKLSAgfQorCWlmICh0byArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgbWVtY3B5ICgoY2hhciAqKW10ZC0+cHJpdiArIHRvLCBidWYsIGxlbik7CisJbWVtY3B5KChjaGFyICopbXRkLT5wcml2ICsgdG8sIGJ1ZiwgbGVuKTsKIAotICAqcmV0bGVuPWxlbjsKLSAgcmV0dXJuIDA7CisJKnJldGxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbXRkcmFtKHZvaWQpCiB7Ci0gIGlmIChtdGRfaW5mbykgewotICAgIGRlbF9tdGRfZGV2aWNlKG10ZF9pbmZvKTsKLSNpZiBDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgPiAwCi0gICAgaWYgKG10ZF9pbmZvLT5wcml2KQotI2lmIENPTkZJR19NVERSQU1fQUJTX1BPUyA+IDAKLSAgICAgIGlvdW5tYXAobXRkX2luZm8tPnByaXYpOwotI2Vsc2UKLSAgICAgIHZmcmVlKG10ZF9pbmZvLT5wcml2KTsKLSNlbmRpZgkKLSNlbmRpZgotICAgIGtmcmVlKG10ZF9pbmZvKTsKLSAgfQorCWlmIChtdGRfaW5mbykgeworCQlkZWxfbXRkX2RldmljZShtdGRfaW5mbyk7CisJCWlmIChtdGRfaW5mby0+cHJpdikKKwkJCXZmcmVlKG10ZF9pbmZvLT5wcml2KTsKKwkJa2ZyZWUobXRkX2luZm8pOworCX0KIH0KIAotaW50IG10ZHJhbV9pbml0X2RldmljZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdm9pZCAqbWFwcGVkX2FkZHJlc3MsIAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNoYXIgKm5hbWUpCitpbnQgbXRkcmFtX2luaXRfZGV2aWNlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB2b2lkICptYXBwZWRfYWRkcmVzcywKKwkJdW5zaWduZWQgbG9uZyBzaXplLCBjaGFyICpuYW1lKQogewotICAgbWVtc2V0KG10ZCwgMCwgc2l6ZW9mKCptdGQpKTsKKwltZW1zZXQobXRkLCAwLCBzaXplb2YoKm10ZCkpOwogCi0gICAvKiBTZXR1cCB0aGUgTVREIHN0cnVjdHVyZSAqLwotICAgbXRkLT5uYW1lID0gbmFtZTsKLSAgIG10ZC0+dHlwZSA9IE1URF9SQU07Ci0gICBtdGQtPmZsYWdzID0gTVREX0NBUF9SQU07Ci0gICBtdGQtPnNpemUgPSBzaXplOwotICAgbXRkLT5lcmFzZXNpemUgPSBNVERSQU1fRVJBU0VfU0laRTsKLSAgIG10ZC0+cHJpdiA9IG1hcHBlZF9hZGRyZXNzOworCS8qIFNldHVwIHRoZSBNVEQgc3RydWN0dXJlICovCisJbXRkLT5uYW1lID0gbmFtZTsKKwltdGQtPnR5cGUgPSBNVERfUkFNOworCW10ZC0+ZmxhZ3MgPSBNVERfQ0FQX1JBTTsKKwltdGQtPnNpemUgPSBzaXplOworCW10ZC0+ZXJhc2VzaXplID0gTVREUkFNX0VSQVNFX1NJWkU7CisJbXRkLT5wcml2ID0gbWFwcGVkX2FkZHJlc3M7CiAKLSAgIG10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLSAgIG10ZC0+ZXJhc2UgPSByYW1fZXJhc2U7Ci0gICBtdGQtPnBvaW50ID0gcmFtX3BvaW50OwotICAgbXRkLT51bnBvaW50ID0gcmFtX3VucG9pbnQ7Ci0gICBtdGQtPnJlYWQgPSByYW1fcmVhZDsKLSAgIG10ZC0+d3JpdGUgPSByYW1fd3JpdGU7CisJbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCW10ZC0+ZXJhc2UgPSByYW1fZXJhc2U7CisJbXRkLT5wb2ludCA9IHJhbV9wb2ludDsKKwltdGQtPnVucG9pbnQgPSByYW1fdW5wb2ludDsKKwltdGQtPnJlYWQgPSByYW1fcmVhZDsKKwltdGQtPndyaXRlID0gcmFtX3dyaXRlOwogCi0gICBpZiAoYWRkX210ZF9kZXZpY2UobXRkKSkgewotICAgICByZXR1cm4gLUVJTzsKLSAgIH0KLSAgIAotICAgcmV0dXJuIDA7CisJaWYgKGFkZF9tdGRfZGV2aWNlKG10ZCkpIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7CiB9CiAKLSNpZiBDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgPiAwCi0jaWYgQ09ORklHX01URFJBTV9BQlNfUE9TID4gMAotc3RhdGljIGludCBfX2luaXQgaW5pdF9tdGRyYW0odm9pZCkKLXsKLSAgdm9pZCAqYWRkcjsKLSAgaW50IGVycjsKLSAgLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgKi8KLSAgIG10ZF9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICBpZiAoIW10ZF9pbmZvKQotICAgICByZXR1cm4gLUVOT01FTTsKLSAgIAotICBhZGRyID0gaW9yZW1hcChDT05GSUdfTVREUkFNX0FCU19QT1MsIE1URFJBTV9UT1RBTF9TSVpFKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgCi0gICAgICAgICAgIkZhaWxlZCB0byBpb3JlbWFwKSBtZW1vcnkgcmVnaW9uIG9mIHNpemUgJWxkIGF0IEFCU19QT1M6JWxkXG4iLCAKLSAgICAgICAgICAobG9uZylNVERSQU1fVE9UQUxfU0laRSwgKGxvbmcpQ09ORklHX01URFJBTV9BQlNfUE9TKTsKLSAgICBrZnJlZShtdGRfaW5mbyk7Ci0gICAgbXRkX2luZm8gPSBOVUxMOwotICAgIHJldHVybiAtRU5PTUVNOwotICB9Ci0gIGVyciA9IG10ZHJhbV9pbml0X2RldmljZShtdGRfaW5mbywgYWRkciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNVERSQU1fVE9UQUxfU0laRSwgIm10ZHJhbSB0ZXN0IGRldmljZSIpOwotICBpZiAoZXJyKSAKLSAgewotICAgIGlvdW5tYXAoYWRkcik7Ci0gICAga2ZyZWUobXRkX2luZm8pOwotICAgIG10ZF9pbmZvID0gTlVMTDsKLSAgICByZXR1cm4gZXJyOwotICB9Ci0gIG1lbXNldChtdGRfaW5mby0+cHJpdiwgMHhmZiwgTVREUkFNX1RPVEFMX1NJWkUpOwotICByZXR1cm4gZXJyOwotfQotCi0jZWxzZSAvKiBDT05GSUdfTVREUkFNX0FCU19QT1MgPiAwICovCi0KIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbXRkcmFtKHZvaWQpCiB7Ci0gIHZvaWQgKmFkZHI7Ci0gIGludCBlcnI7Ci0gIC8qIEFsbG9jYXRlIHNvbWUgbWVtb3J5ICovCi0gICBtdGRfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbyksIEdGUF9LRVJORUwpOwotICAgaWYgKCFtdGRfaW5mbykKLSAgICAgcmV0dXJuIC1FTk9NRU07CisJdm9pZCAqYWRkcjsKKwlpbnQgZXJyOwogCi0gIGFkZHIgPSB2bWFsbG9jKE1URFJBTV9UT1RBTF9TSVpFKTsKLSAgaWYgKCFhZGRyKSB7Ci0gICAgREVCVUcoTVREX0RFQlVHX0xFVkVMMSwgCi0gICAgICAgICAgIkZhaWxlZCB0byB2bWFsbG9jIG1lbW9yeSByZWdpb24gb2Ygc2l6ZSAlbGRcbiIsIAotICAgICAgICAgIChsb25nKU1URFJBTV9UT1RBTF9TSVpFKTsKLSAgICBrZnJlZShtdGRfaW5mbyk7Ci0gICAgbXRkX2luZm8gPSBOVUxMOwotICAgIHJldHVybiAtRU5PTUVNOwotICB9Ci0gIGVyciA9IG10ZHJhbV9pbml0X2RldmljZShtdGRfaW5mbywgYWRkciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBNVERSQU1fVE9UQUxfU0laRSwgIm10ZHJhbSB0ZXN0IGRldmljZSIpOwotICBpZiAoZXJyKSAKLSAgewotICAgIHZmcmVlKGFkZHIpOwotICAgIGtmcmVlKG10ZF9pbmZvKTsKLSAgICBtdGRfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIGVycjsKLSAgfQotICBtZW1zZXQobXRkX2luZm8tPnByaXYsIDB4ZmYsIE1URFJBTV9UT1RBTF9TSVpFKTsKLSAgcmV0dXJuIGVycjsKKwlpZiAoIXRvdGFsX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQWxsb2NhdGUgc29tZSBtZW1vcnkgKi8KKwltdGRfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbXRkX2luZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJYWRkciA9IHZtYWxsb2MoTVREUkFNX1RPVEFMX1NJWkUpOworCWlmICghYWRkcikgeworCQlrZnJlZShtdGRfaW5mbyk7CisJCW10ZF9pbmZvID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWVyciA9IG10ZHJhbV9pbml0X2RldmljZShtdGRfaW5mbywgYWRkciwgTVREUkFNX1RPVEFMX1NJWkUsICJtdGRyYW0gdGVzdCBkZXZpY2UiKTsKKwlpZiAoZXJyKSB7CisJCXZmcmVlKGFkZHIpOworCQlrZnJlZShtdGRfaW5mbyk7CisJCW10ZF9pbmZvID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJbWVtc2V0KG10ZF9pbmZvLT5wcml2LCAweGZmLCBNVERSQU1fVE9UQUxfU0laRSk7CisJcmV0dXJuIGVycjsKIH0KLSNlbmRpZiAvKiAhKENPTkZJR19NVERSQU1fQUJTX1BPUyA+IDApICovCi0KLSNlbHNlIC8qIENPTkZJR19NVERSQU1fVE9UQUxfU0laRSA+IDAgKi8KLQotc3RhdGljIGludCBfX2luaXQgaW5pdF9tdGRyYW0odm9pZCkKLXsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogIShDT05GSUdfTVREUkFNX1RPVEFMX1NJWkUgPiAwKSAqLwogCiBtb2R1bGVfaW5pdChpbml0X210ZHJhbSk7CiBtb2R1bGVfZXhpdChjbGVhbnVwX210ZHJhbSk7CkBAIC0yMzIsNCArMTYwLDMgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkFsZXhhbmRlciBMYXJzc29uIDxhbGV4bEByZWRoYXQuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTaW11bGF0ZWQgTVREIGRyaXZlciBmb3IgdGVzdGluZyIpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9kZXZpY2VzL3BocmFtLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3BocmFtLmMKaW5kZXggNWY4ZTE2NC4uYTQyM2EzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvZGV2aWNlcy9waHJhbS5jCisrKyBiL2RyaXZlcnMvbXRkL2RldmljZXMvcGhyYW0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogJElkOiBwaHJhbS5jLHYgMS4xMSAyMDA1LzAxLzA1IDE4OjA1OjEzIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHBocmFtLmMsdiAxLjE0IDIwMDUvMDMvMDcgMjE6NDM6Mzggam9lcm4gRXhwICQKICAqCiAgKiBDb3B5cmlnaHQgKGMpID8/Pz8JCUpvY2hlbiBTY2jkdWJsZSA8cHNpb25pY0Bwc2lvbmljLmRlPgogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQJSvZybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CkBAIC0xNSw5ICsxNSw3IEBACiAgKgogICogRXhhbXBsZToKICAqCXBocmFtPXN3YXAsNjRNaSwxMjhNaSBwaHJhbT10ZXN0LDkwME1pLDFNaQotICoKICAqLwotCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzYsNyArMzQsNiBAQAogc3RhdGljIExJU1RfSEVBRChwaHJhbV9saXN0KTsKIAogCi0KIHN0YXRpYyBpbnQgcGhyYW1fZXJhc2Uoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0cikKIHsKIAl1X2NoYXIgKnN0YXJ0ID0gbXRkLT5wcml2OwpAQCAtNzEsNyArNjgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaHJhbV91bnBvaW50KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmFkZHIsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuKQorc3RhdGljIHZvaWQgcGhyYW1fdW5wb2ludChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICphZGRyLCBsb2ZmX3QgZnJvbSwKKwkJc2l6ZV90IGxlbikKIHsKIH0KIApAQCAtODAsOCArNzgsMTEgQEAKIHsKIAl1X2NoYXIgKnN0YXJ0ID0gbXRkLT5wcml2OwogCi0JaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJaWYgKGZyb20gPj0gbXRkLT5zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsZW4gPiBtdGQtPnNpemUgLSBmcm9tKQorCQlsZW4gPSBtdGQtPnNpemUgLSBmcm9tOwogCQogCW1lbWNweShidWYsIHN0YXJ0ICsgZnJvbSwgbGVuKTsKIApAQCAtOTQsOCArOTUsMTEgQEAKIHsKIAl1X2NoYXIgKnN0YXJ0ID0gbXRkLT5wcml2OwogCi0JaWYgKHRvICsgbGVuID4gbXRkLT5zaXplKQorCWlmICh0byA+PSBtdGQtPnNpemUpCiAJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbiA+IG10ZC0+c2l6ZSAtIHRvKQorCQlsZW4gPSBtdGQtPnNpemUgLSB0bzsKIAkKIAltZW1jcHkoc3RhcnQgKyB0bywgYnVmLCBsZW4pOwogCkBAIC0xMDcsOSArMTExLDkgQEAKIAogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9kZXZpY2VzKHZvaWQpCiB7Ci0Jc3RydWN0IHBocmFtX210ZF9saXN0ICp0aGlzOworCXN0cnVjdCBwaHJhbV9tdGRfbGlzdCAqdGhpcywgKnNhZmU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZwaHJhbV9saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIHNhZmUsICZwaHJhbV9saXN0LCBsaXN0KSB7CiAJCWRlbF9tdGRfZGV2aWNlKCZ0aGlzLT5tdGQpOwogCQlpb3VubWFwKHRoaXMtPm10ZC5wcml2KTsKIAkJa2ZyZWUodGhpcyk7CkBAIC0xNDUsNyArMTQ5LDcgQEAKIAluZXctPm10ZC53cml0ZSA9IHBocmFtX3dyaXRlOwogCW5ldy0+bXRkLm93bmVyID0gVEhJU19NT0RVTEU7CiAJbmV3LT5tdGQudHlwZSA9IE1URF9SQU07Ci0JbmV3LT5tdGQuZXJhc2VzaXplID0gMDsKKwluZXctPm10ZC5lcmFzZXNpemUgPSBQQUdFX1NJWkU7CiAKIAlyZXQgPSAtRUFHQUlOOwogCWlmIChhZGRfbXRkX2RldmljZSgmbmV3LT5tdGQpKSB7CkBAIC0yMTQsNiArMjE4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIGlubGluZSB2b2lkIGtpbGxfZmluYWxfbmV3bGluZShjaGFyICpzdHIpCit7CisJY2hhciAqbmV3bGluZSA9IHN0cnJjaHIoc3RyLCAnXG4nKTsKKwlpZiAobmV3bGluZSAmJiAhbmV3bGluZVsxXSkKKwkJKm5ld2xpbmUgPSAwOworfQorCisKICNkZWZpbmUgcGFyc2VfZXJyKGZtdCwgYXJncy4uLikgZG8gewlcCiAJRVJST1IoZm10ICwgIyMgYXJncyk7CVwKIAlyZXR1cm4gMDsJCVwKQEAgLTIzMiw2ICsyNDUsNyBAQAogCQlwYXJzZV9lcnIoInBhcmFtZXRlciB0b28gbG9uZ1xuIik7CiAKIAlzdHJjcHkoc3RyLCB2YWwpOworCWtpbGxfZmluYWxfbmV3bGluZShzdHIpOwogCiAJZm9yIChpPTA7IGk8MzsgaSsrKQogCQl0b2tlbltpXSA9IHN0cnNlcCgmc3RyLCAiLCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9zbHJhbS5jIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9zbHJhbS5jCmluZGV4IDVhYjE1ZTYuLjg0ZmE5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvc2xyYW0uYworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL3NscmFtLmMKQEAgLTEsNiArMSw2IEBACiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAkSWQ6IHNscmFtLmMsdiAxLjMzIDIwMDUvMDEvMDUgMTg6MDU6MTMgZHdtdzIgRXhwICQKKyAgJElkOiBzbHJhbS5jLHYgMS4zNCAyMDA1LzAxLzA2IDIxOjE2OjQyIGp3Ym95ZXIgRXhwICQKIAogICBUaGlzIGRyaXZlciBwcm92aWRlcyBhIG1ldGhvZCB0byBhY2Nlc3MgbWVtb3J5IG5vdCB1c2VkIGJ5IHRoZSBrZXJuZWwKICAgaXRzZWxmIChpLmUuIGlmIHRoZSBrZXJuZWwgY29tbWFuZGxpbmUgbWVtPXh4eCBpcyB1c2VkKS4gVG8gYWN0dWFsbHkKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CiAKICNkZWZpbmUgU0xSQU1fTUFYX0RFVklDRVNfUEFSQU1TIDYJCS8qIDMgcGFyYW1ldGVycyAvIGRldmljZSAqLworI2RlZmluZSBTTFJBTV9CTEtfU1ogMHg0MDAwCiAKICNkZWZpbmUgVChmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyMgYXJncykKICNkZWZpbmUgRShmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX05PVElDRSBmbXQsICMjIGFyZ3MpCkBAIC0xMDgsNiArMTA5LDkgQEAKIHsKIAlzbHJhbV9wcml2X3QgKnByaXYgPSBtdGQtPnByaXY7CiAKKwlpZiAoZnJvbSArIGxlbiA+IG10ZC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkqbXRkYnVmID0gcHJpdi0+c3RhcnQgKyBmcm9tOwogCSpyZXRsZW4gPSBsZW47CiAJcmV0dXJuKDApOwpAQCAtMTIxLDcgKzEyNSwxMyBAQAogCQlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCiB7CiAJc2xyYW1fcHJpdl90ICpwcml2ID0gbXRkLT5wcml2OwotCQorCisJaWYgKGZyb20gPiBtdGQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZyb20gKyBsZW4gPiBtdGQtPnNpemUpCisJCWxlbiA9IG10ZC0+c2l6ZSAtIGZyb207CisKIAltZW1jcHkoYnVmLCBwcml2LT5zdGFydCArIGZyb20sIGxlbik7CiAKIAkqcmV0bGVuID0gbGVuOwpAQCAtMTMzLDYgKzE0Myw5IEBACiB7CiAJc2xyYW1fcHJpdl90ICpwcml2ID0gbXRkLT5wcml2OwogCisJaWYgKHRvICsgbGVuID4gbXRkLT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW1lbWNweShwcml2LT5zdGFydCArIHRvLCBidWYsIGxlbik7CiAKIAkqcmV0bGVuID0gbGVuOwpAQCAtMTg4LDcgKzIwMSw3IEBACiAJKCpjdXJtdGQpLT5tdGRpbmZvLT5uYW1lID0gbmFtZTsKIAkoKmN1cm10ZCktPm10ZGluZm8tPnNpemUgPSBsZW5ndGg7CiAJKCpjdXJtdGQpLT5tdGRpbmZvLT5mbGFncyA9IE1URF9DTEVBUl9CSVRTIHwgTVREX1NFVF9CSVRTIHwKLQkJCQkJTVREX1dSSVRFQl9XUklURUFCTEUgfCBNVERfVk9MQVRJTEU7CisJCQkJCU1URF9XUklURUJfV1JJVEVBQkxFIHwgTVREX1ZPTEFUSUxFIHwgTVREX0NBUF9SQU07CiAgICAgICAgICgqY3VybXRkKS0+bXRkaW5mby0+ZXJhc2UgPSBzbHJhbV9lcmFzZTsKIAkoKmN1cm10ZCktPm10ZGluZm8tPnBvaW50ID0gc2xyYW1fcG9pbnQ7CiAJKCpjdXJtdGQpLT5tdGRpbmZvLT51bnBvaW50ID0gc2xyYW1fdW5wb2ludDsKQEAgLTE5Niw3ICsyMDksNyBAQAogCSgqY3VybXRkKS0+bXRkaW5mby0+d3JpdGUgPSBzbHJhbV93cml0ZTsKIAkoKmN1cm10ZCktPm10ZGluZm8tPm93bmVyID0gVEhJU19NT0RVTEU7CiAJKCpjdXJtdGQpLT5tdGRpbmZvLT50eXBlID0gTVREX1JBTTsKLQkoKmN1cm10ZCktPm10ZGluZm8tPmVyYXNlc2l6ZSA9IDB4MDsKKwkoKmN1cm10ZCktPm10ZGluZm8tPmVyYXNlc2l6ZSA9IFNMUkFNX0JMS19TWjsKIAogCWlmIChhZGRfbXRkX2RldmljZSgoKmN1cm10ZCktPm10ZGluZm8pKQl7CiAJCUUoInNscmFtOiBGYWlsZWQgdG8gcmVnaXN0ZXIgbmV3IGRldmljZVxuIik7CkBAIC0yNjEsNyArMjc0LDcgQEAKIAl9CiAJVCgic2xyYW06IGRldm5hbWU9JXMsIGRldnN0YXJ0PTB4JWx4LCBkZXZsZW5ndGg9MHglbHhcbiIsCiAJCQlkZXZuYW1lLCBkZXZzdGFydCwgZGV2bGVuZ3RoKTsKLQlpZiAoKGRldnN0YXJ0IDwgMCkgfHwgKGRldmxlbmd0aCA8IDApKSB7CisJaWYgKChkZXZzdGFydCA8IDApIHx8IChkZXZsZW5ndGggPCAwKSB8fCAoZGV2bGVuZ3RoICUgU0xSQU1fQkxLX1NaICE9IDApKSB7CiAJCUUoInNscmFtOiBJbGxlZ2FsIHN0YXJ0IC8gbGVuZ3RoIHBhcmFtZXRlci5cbiIpOwogCQlyZXR1cm4oLUVJTlZBTCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZnRsLmMgYi9kcml2ZXJzL210ZC9mdGwuYwppbmRleCAxOGNjODg0Li5kOWFiNjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9mdGwuYworKysgYi9kcml2ZXJzL210ZC9mdGwuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIFRoaXMgdmVyc2lvbiBwb3J0ZWQgdG8gdGhlIExpbnV4LU1URCBzeXN0ZW0gYnkgZHdtdzJAaW5mcmFkZWFkLm9yZwotICogJElkOiBmdGwuYyx2IDEuNTQgMjAwNC8xMS8xNiAxODozMzoxNSBkd213MiBFeHAgJAorICogJElkOiBmdGwuYyx2IDEuNTUgMjAwNS8wMS8xNyAxMzo0NzoyMSBodnIgRXhwICQKICAqCiAgKiBGaXhlczogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAgKiAtIGZpeGVzIHNvbWUgbGVha3Mgb24gZmFpbHVyZSBpbiBidWlsZF9tYXBzIGFuZCBmdGxfbm90aWZ5X2FkZCwgY2xlYW51cHMKQEAgLTM1Nyw2ICszNTcsNyBAQAogICAgIGlmICghZXJhc2UpIAogICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAKKyAgICBlcmFzZS0+bXRkID0gcGFydC0+bWJkLm10ZDsKICAgICBlcmFzZS0+Y2FsbGJhY2sgPSBmdGxfZXJhc2VfY2FsbGJhY2s7CiAgICAgZXJhc2UtPmFkZHIgPSB4ZmVyLT5PZmZzZXQ7CiAgICAgZXJhc2UtPmxlbiA9IDEgPDwgcGFydC0+aGVhZGVyLkVyYXNlVW5pdFNpemU7CkBAIC0xMDk2LDcgKzEwOTcsNyBAQAogCiBpbnQgaW5pdF9mdGwodm9pZCkKIHsKLQlERUJVRygwLCAiJElkOiBmdGwuYyx2IDEuNTQgMjAwNC8xMS8xNiAxODozMzoxNSBkd213MiBFeHAgJFxuIik7CisJREVCVUcoMCwgIiRJZDogZnRsLmMsdiAxLjU1IDIwMDUvMDEvMTcgMTM6NDc6MjEgaHZyIEV4cCAkXG4iKTsKIAogCXJldHVybiByZWdpc3Rlcl9tdGRfYmxrdHJhbnMoJmZ0bF90cik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcgYi9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKaW5kZXggODQ4MDA1Ny4uNDQ3ODFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKICMgZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCi0jICRJZDogS2NvbmZpZyx2IDEuNDIgMjAwNS8wMS8wNSAxNjo1OTo1MCBkd213MiBFeHAgJAorIyAkSWQ6IEtjb25maWcsdiAxLjU1IDIwMDUvMDcvMDIgMDE6NTM6MjQgdHBveW5vciBFeHAgJAogCiBtZW51ICJNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzIgogCWRlcGVuZHMgb24gTVREIT1uCkBAIC0xMjIsMTYgKzEyMiw2IEBACiAJICBNb3JlIGluZm8gYXQKIAkgIDxodHRwOi8vd3d3LmFyY29tY29udHJvbHMuY29tL3Byb2R1Y3RzL2ljcC9wYzEwNC9wcm9jZXNzb3JzL1NCQ19HWDEuaHRtPi4KIAotY29uZmlnIE1URF9FTEFOXzEwNE5DCi0JdHJpc3RhdGUgIkNGSSBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIEFyY29tIEVMQU4tMTA0TkMiCi0JZGVwZW5kcyBvbiBYODYgJiYgTVREX0NGSV9JTlRFTEVYVCAmJiBNVERfUEFSVElUSU9OUyAmJiBNVERfQ09NUExFWF9NQVBQSU5HUwotCWhlbHAKLQkgIFRoaXMgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBvbi1ib2FyZCBmbGFzaCBvZiB0aGUgQXJjb20gQ29udHJvbAotCSAgU3lzdGVtJ3MgRUxBTi0xMDROQyBkZXZlbG9wbWVudCBib2FyZC4gQnkgZGVmYXVsdCB0aGUgZmxhc2gKLQkgIGlzIHNwbGl0IGludG8gMyBwYXJ0aXRpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBhcyBzZXBhcmF0ZSBNVEQKLQkgIGRldmljZXMuIFRoaXMgYm9hcmQgdXRpbGl6ZXMgSW50ZWwgU3RyYXRhRmxhc2guIE1vcmUgaW5mbyBhdAotCSAgPGh0dHA6Ly93d3cuYXJjb21jb250cm9scy5jb20vcHJvZHVjdHMvaWNwL3BjMTA0L3Byb2Nlc3NvcnMvRUxBTjEwNE5DLmh0bT4uCi0KIGNvbmZpZyBNVERfTFVCQk9DSwogCXRyaXN0YXRlICJDRkkgRmxhc2ggZGV2aWNlIG1hcHBlZCBvbiBJbnRlbCBMdWJib2NrIFhTY2FsZSBldmFsIGJvYXJkIgogCWRlcGVuZHMgb24gQVJDSF9MVUJCT0NLICYmIE1URF9DRklfSU5URUxFWFQgJiYgTVREX1BBUlRJVElPTlMKQEAgLTEzOSw2ICsxMjksMTQgQEAKIAkgIFRoaXMgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBvbi1ib2FyZCBmbGFzaCBvZiB0aGUgSW50ZWwKIAkgICdMdWJib2NrJyBYU2NhbGUgZXZhbHVhdGlvbiBib2FyZC4KIAorY29uZmlnIE1URF9NQUlOU1RPTkUKKwl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gSW50ZWwgTWFpbnN0b25lIFhTY2FsZSBldmFsIGJvYXJkIgorCWRlcGVuZHMgb24gTUFDSF9NQUlOU1RPTkUgJiYgTVREX0NGSV9JTlRFTEVYVAorCXNlbGVjdCBNVERfUEFSVElUSU9OUworCWhlbHAKKwkgIFRoaXMgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBvbi1ib2FyZCBmbGFzaCBvZiB0aGUgSW50ZWwKKwkgICdNYWluc3RvbmUgUFhBMjd4IGV2YWx1YXRpb24gYm9hcmQuCisKIGNvbmZpZyBNVERfT0NUQUdPTgogCXRyaXN0YXRlICJKRURFQyBGbGFzaCBkZXZpY2UgbWFwcGVkIG9uIE9jdGFnb24gNTA2NiBTQkMiCiAJZGVwZW5kcyBvbiBYODYgJiYgTVREX0pFREVDICYmIE1URF9DT01QTEVYX01BUFBJTkdTCkBAIC0yMTMsNzQgKzIxMSwxMSBAQAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIGZsYXNoIGNoaXBzIG9uIE5FVHRlbC9TZWN1cmVFZGdlL1NuYXBHZWFyIGJvYXJkcy4KIAotY29uZmlnIE1URF9QQjFYWFgKLQl0cmlzdGF0ZSAiRmxhc2ggZGV2aWNlcyBvbiBBbGNoZW15IFBCMXh4eCBib2FyZHMiCi0JZGVwZW5kcyBvbiBNSVBTICYmICggTUlQU19QQjEwMDAgfHwgTUlQU19QQjExMDAgfHwgTUlQU19QQjE1MDAgKQorY29uZmlnIE1URF9BTENIRU1ZCisJdHJpc3RhdGUgJyAgQU1EIEFsY2hlbXkgUGIxeHh4L0RiMXh4eC9SREsgTVREIHN1cHBvcnQnIAorCWRlcGVuZHMgb24gTUlQUyAmJiBTT0NfQVUxWDAwCiAJaGVscAotCSAgRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IFBiMTAwMC9QYjExMDAvUGIxNTAwIGJvYXJkcwotCi1jb25maWcgTVREX1BCMVhYWF9CT09UCi0JYm9vbCAiUEIxeDAwIGJvb3QgZmxhc2ggZGV2aWNlIgotCWRlcGVuZHMgb24gTVREX1BCMVhYWCAmJiAoIE1JUFNfUEIxMTAwIHx8IE1JUFNfUEIxNTAwICkKLQloZWxwCi0JICBVc2UgdGhlIGZpcnN0IG9mIHRoZSB0d28gMzJNaUIgZmxhc2ggYmFua3Mgb24gUGIxMTAwL1BiMTUwMCBib2FyZC4KLQkgIFlvdSBjYW4gc2F5ICdZJyB0byBib3RoIHRoaXMgYW5kICdNVERfUEIxWFhYX1VTRVInIGJlbG93LCB0byB1c2UKLQkgIGJvdGggYmFua3MuCi0KLWNvbmZpZyBNVERfUEIxWFhYX1VTRVIKLQlib29sICJQQjF4MDAgdXNlciBmbGFzaCBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVERfUEIxWFhYICYmICggTUlQU19QQjExMDAgfHwgTUlQU19QQjE1MDAgKQotCWRlZmF1bHQgeSBpZiBNVERfUEIxWFhfQk9PVCA9IG4KLQloZWxwCi0JICBVc2UgdGhlIHNlY29uZCBvZiB0aGUgdHdvIDMyTWlCIGZsYXNoIGJhbmtzIG9uIFBiMTEwMC9QYjE1MDAgYm9hcmQuCi0JICBZb3UgY2FuIHNheSAnWScgdG8gYm90aCB0aGlzIGFuZCAnTVREX1BCMVhYWF9CT09UJyBhYm92ZSwgdG8gdXNlCi0JICBib3RoIGJhbmtzLgotCi1jb25maWcgTVREX1BCMTU1MAotCXRyaXN0YXRlICJGbGFzaCBkZXZpY2VzIG9uIEFsY2hlbXkgUEIxNTUwIGJvYXJkIgotCWRlcGVuZHMgb24gTUlQUyAmJiBNSVBTX1BCMTU1MAotCWhlbHAKLQkgIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBQYjE1NTAgYm9hcmQKLQotY29uZmlnIE1URF9QQjE1NTBfQk9PVAotCWJvb2wgIlBCMTU1MCBib290IGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1URF9QQjE1NTAKLQloZWxwCi0JICBVc2UgdGhlIGZpcnN0IG9mIHRoZSB0d28gNjRNaUIgZmxhc2ggYmFua3Mgb24gUGIxNTUwIGJvYXJkLgotCSAgWW91IGNhbiBzYXkgJ1knIHRvIGJvdGggdGhpcyBhbmQgJ01URF9QQjE1NTBfVVNFUicgYmVsb3csIHRvIHVzZQotCSAgYm90aCBiYW5rcy4KLQotY29uZmlnIE1URF9QQjE1NTBfVVNFUgotCWJvb2wgIlBCMTU1MCB1c2VyIGZsYXNoIGRldmljZSIKLQlkZXBlbmRzIG9uIE1URF9QQjE1NTAKLQlkZWZhdWx0IHkgaWYgTVREX1BCMTU1MF9CT09UID0gbgotCWhlbHAKLQkgIFVzZSB0aGUgc2Vjb25kIG9mIHRoZSB0d28gNjRNaUIgZmxhc2ggYmFua3Mgb24gUGIxNTUwIGJvYXJkLgotCSAgWW91IGNhbiBzYXkgJ1knIHRvIGJvdGggdGhpcyBhbmQgJ01URF9QQjE1NTBfQk9PVCcgYWJvdmUsIHRvIHVzZQotCSAgYm90aCBiYW5rcy4KLQotY29uZmlnIE1URF9EQjE1NTAKLQl0cmlzdGF0ZSAiRmxhc2ggZGV2aWNlcyBvbiBBbGNoZW15IERCMTU1MCBib2FyZCIKLQlkZXBlbmRzIG9uIE1JUFMgJiYgTUlQU19EQjE1NTAKLQloZWxwCi0JICBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFsY2hlbXkgRGIxNTUwIGJvYXJkCi0KLWNvbmZpZyBNVERfREIxNTUwX0JPT1QKLQlib29sICJEQjE1NTAgYm9vdCBmbGFzaCBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVERfREIxNTUwCi0JaGVscAotCSAgVXNlIHRoZSBmaXJzdCBvZiB0aGUgdHdvIDY0TWlCIGZsYXNoIGJhbmtzIG9uIERiMTU1MCBib2FyZC4KLQkgIFlvdSBjYW4gc2F5ICdZJyB0byBib3RoIHRoaXMgYW5kICdNVERfREIxNTUwX1VTRVInIGJlbG93LCB0byB1c2UKLQkgIGJvdGggYmFua3MuCi0KLWNvbmZpZyBNVERfREIxNTUwX1VTRVIKLQlib29sICJEQjE1NTAgdXNlciBmbGFzaCBkZXZpY2UiCi0JZGVwZW5kcyBvbiBNVERfREIxNTUwCi0JZGVmYXVsdCB5IGlmIE1URF9EQjE1NTBfQk9PVCA9IG4KLQloZWxwCi0JICBVc2UgdGhlIHNlY29uZCBvZiB0aGUgdHdvIDY0TWlCIGZsYXNoIGJhbmtzIG9uIERiMTU1MCBib2FyZC4KLQkgIFlvdSBjYW4gc2F5ICdZJyB0byBib3RoIHRoaXMgYW5kICdNVERfREIxNTUwX0JPT1QnIGFib3ZlLCB0byB1c2UKLQkgIGJvdGggYmFua3MuCisJICBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFNRCBBbGNoZW15IFBiL0RiL1JESyBSZWZlcmVuY2UgQm9hcmRzCiAKIGNvbmZpZyBNVERfRElMTkVUUEMKIAl0cmlzdGF0ZSAiQ0ZJIEZsYXNoIGRldmljZSBtYXBwZWQgb24gRElML05ldCBQQyIKQEAgLTU4OCw2ICs1MjMsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyBhY2Nlc3MgdG8gdGhlIGZsYXNoIGNoaXBzIG9uIHRoZSBJbnRlcmZhY2UgTVBDLTEyMTEoQ1RQL1BDSS9NUEMtU0gwMikuCiAJICBJZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQsIHNheSAnWScuCiAKK2NvbmZpZyBNVERfT01BUF9OT1IKKwl0cmlzdGF0ZSAiVEkgT01BUCBib2FyZCBtYXBwaW5ncyIKKwlkZXBlbmRzIG9uIE1URF9DRkkgJiYgQVJDSF9PTUFQCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGFjY2VzcyB0byB0aGUgTk9SIGZsYXNoIGNoaXBzIG9uIFRJIE9NQVAtYmFzZWQKKwkgIGJvYXJkcyBkZWZpbmluZyBmbGFzaCBwbGF0Zm9ybSBkZXZpY2VzIGFuZCBmbGFzaCBwbGF0Zm9ybSBkYXRhLgorCSAgVGhlc2UgYm9hcmRzIGluY2x1ZGUgdGhlIElubm92YXRvciwgSDIsIEgzLCBPU0ssIFBlcnNldXMyLCBhbmQKKwkgIG1vcmUuICBJZiB5b3UgaGF2ZSBzdWNoIGEgYm9hcmQsIHNheSAnWScuCisKICMgVGhpcyBuZWVkcyBDRkkgb3IgSkVERUMsIGRlcGVuZGluZyBvbiB0aGUgY2FyZHMgZm91bmQuCiBjb25maWcgTVREX1BDSQogCXRyaXN0YXRlICJQQ0kgTVREIGRyaXZlciIKQEAgLTYwNyw2ICs1NTEsMTYgQEAKIAkgIGNhcmRzIGFyZSB1c3VhbGx5IGFyb3VuZCA0LTE2TWlCIGluIHNpemUuIFRoaXMgZG9lcyBub3QgaW5jbHVkZQogCSAgQ29tcGFjdCBGbGFzaCBjYXJkcyB3aGljaCBhcmUgdHJlYXRlZCBhcyBJREUgZGV2aWNlcy4KIAorY29uZmlnIE1URF9QQ01DSUFfQU5PTllNT1VTCisJYm9vbCAiVXNlIFBDTUNJQSBNVEQgZHJpdmVycyBmb3IgYW5vbnltb3VzIFBDTUNJQSBjYXJkcyIKKwlkZXBlbmRzIG9uIE1URF9QQ01DSUEKKwlkZWZhdWx0IE4KKwloZWxwCisJICBJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCBQQ01DSUEgY2FyZHMgd2hpY2ggZG8gbm90IHJlcG9ydAorCSAgYW55dGhpbmcgYWJvdXQgdGhlbXNlbHZlcyBhcmUgYXNzdW1lZCB0byBiZSBNVEQgY2FyZHMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBNVERfVUNMSU5VWAogCXRyaXN0YXRlICJHZW5lcmljIHVDbGludXggUkFNL1JPTSBmaWxlc3lzdGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNVERfUEFSVElUSU9OUyAmJiAhTU1VCkBAIC02MzcsMTMgKzU5MSwxNCBAQAogICAgICAgICAgIE1hcCBkcml2ZXIgZm9yIER5LTQgU1ZNRS9ETVYtMTgyIGJvYXJkLgogCiBjb25maWcgTVREX0JBU1QKLQl0cmlzdGF0ZSAiTWFwIGRyaXZlciBmb3IgU2ltdGVjIEJBU1QgKEVCMjQxMElUWCkiCi0JZGVwZW5kcyBvbiBBUkNIX0JBU1QKKwl0cmlzdGF0ZSAiTWFwIGRyaXZlciBmb3IgU2ltdGVjIEJBU1QgKEVCMjQxMElUWCkgb3IgVGhvcmNvbSBWUjEwMDAiCisJZGVwZW5kcyBvbiBBUkNIX0JBU1QgfHwgTUFDSF9WUjEwMDAKIAlzZWxlY3QgTVREX1BBUlRJVElPTlMKIAlzZWxlY3QgTVREX01BUF9CQU5LX1dJRFRIXzE2CiAJc2VsZWN0IE1URF9KRURFQ1BST0JFCiAJaGVscAotCSAgTWFwIGRyaXZlciBmb3IgTk9SIGZsYXNoIG9uIHRoZSBTaW10ZWMgQkFTVCAoRUIyNDEwSVRYKS4KKwkgIE1hcCBkcml2ZXIgZm9yIE5PUiBmbGFzaCBvbiB0aGUgU2ltdGVjIEJBU1QgKEVCMjQxMElUWCksIG9yIHRoZQorCSAgVGhvcmNvbSBWUjEwMDAKIAogCSAgTm90ZSwgdGhpcyBkcml2ZXIgKmNhbm5vdCogb3Zlci1yaWRlIHRoZSBXUCBsaW5rIG9uIHRoZQogCSAgYm9hcmQsIG9yIGN1cnJlbnRseSBkZXRlY3QgdGhlIHN0YXRlIG9mIHRoZSBsaW5rLgpAQCAtNjU5LDUgKzYxNCwxNSBAQAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBhY2Nlc3MgdG8gdGhlIGZsYXNoIGNoaXAgb24gdGhlIFNoYXJwIFNMIFNlcmllcyBvZiBQREFzLgogCitjb25maWcgTVREX1BMQVRSQU0KKwl0cmlzdGF0ZSAiTWFwIGRyaXZlciBmb3IgcGxhdGZvcm0gZGV2aWNlIFJBTSAobXRkLXJhbSkiCisJZGVwZW5kcyBvbiBNVEQKKwlzZWxlY3QgTVREX1JBTQorCWhlbHAKKwkgIE1hcCBkcml2ZXIgZm9yIFJBTSBhcmVhcyBkZXNjcmliZWQgdmlhIHRoZSBwbGF0Zm9ybSBkZXZpY2UKKwkgIHN5c3RlbS4KKworCSAgVGhpcyBzZWxlY3Rpb24gYXV0b21hdGljYWxseSBzZWxlY3RzIHRoZSBtYXBfcmFtIGRyaXZlci4KKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQppbmRleCA3ZmZlMDJiLi43YmNiYzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAjCiAjIGxpbnV4L2RyaXZlcnMvbWFwcy9NYWtlZmlsZQogIwotIyAkSWQ6IE1ha2VmaWxlLmNvbW1vbix2IDEuMjMgMjAwNS8wMS8wNSAxNzowNjozNiBkd213MiBFeHAgJAorIyAkSWQ6IE1ha2VmaWxlLmNvbW1vbix2IDEuMzAgMjAwNS8wNy8wMiAwMTo1MzoyNCB0cG95bm9yIEV4cCAkCiAKIGlmZXEgKCQoQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTKSx5KQogb2JqLSQoQ09ORklHX01URCkJCSs9IG1hcF9mdW5jcy5vCkBAIC0xNSw3ICsxNSw2IEBACiBvYmotJChDT05GSUdfTVREX0NTVE1fTUlQU19JWFgpCSs9IGNzdG1fbWlwc19peHgubwogb2JqLSQoQ09ORklHX01URF9EQzIxMjg1KQkrPSBkYzIxMjg1Lm8KIG9iai0kKENPTkZJR19NVERfRElMTkVUUEMpCSs9IGRpbG5ldHBjLm8KLW9iai0kKENPTkZJR19NVERfRUxBTl8xMDROQykJKz0gZWxhbi0xMDRuYy5vCiBvYmotJChDT05GSUdfTVREX0VQWEExMERCKQkrPSBlcHhhMTBkYi1mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX0lRODAzMTApCSs9IGlxODAzMTAubwogb2JqLSQoQ09ORklHX01URF9MNDQwR1gpCSs9IGw0NDBneC5vCkBAIC0yMyw2ICsyMiw3IEBACiBvYmotJChDT05GSUdfTVREX0lDSFhST00pCSs9IGljaHhyb20ubwogb2JqLSQoQ09ORklHX01URF9UU1VOQU1JKQkrPSB0c3VuYW1pX2ZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTFVCQk9DSykJKz0gbHViYm9jay1mbGFzaC5vCitvYmotJChDT05GSUdfTVREX01BSU5TVE9ORSkJKz0gbWFpbnN0b25lLWZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTUJYODYwKQkrPSBtYng4NjAubwogb2JqLSQoQ09ORklHX01URF9DRUlWQSkJCSs9IGNlaXZhLm8KIG9iai0kKENPTkZJR19NVERfT0NUQUdPTikJKz0gb2N0YWdvbi01MDY2Lm8KQEAgLTQ0LDEwICs0NCw3IEBACiBvYmotJChDT05GSUdfTVREX09DRUxPVCkJKz0gb2NlbG90Lm8KIG9iai0kKENPTkZJR19NVERfU09MVVRJT05FTkdJTkUpKz0gc29sdXRpb25lbmdpbmUubwogb2JqLSQoQ09ORklHX01URF9QQ0kpCQkrPSBwY2kubwotb2JqLSQoQ09ORklHX01URF9QQjFYWFgpCSs9IHBiMXh4eC1mbGFzaC5vCi1vYmotJChDT05GSUdfTVREX0RCMVgwMCkgICAgICAgICs9IGRiMXgwMC1mbGFzaC5vCi1vYmotJChDT05GSUdfTVREX1BCMTU1MCkgICAgICAgICs9IHBiMTU1MC1mbGFzaC5vCi1vYmotJChDT05GSUdfTVREX0RCMTU1MCkgICAgICAgICs9IGRiMTU1MC1mbGFzaC5vCitvYmotJChDT05GSUdfTVREX0FMQ0hFTVkpICAgICAgICs9IGFsY2hlbXktZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9MQVNBVCkJCSs9IGxhc2F0Lm8KIG9iai0kKENPTkZJR19NVERfQVVUQ1BVMTIpCSs9IGF1dGNwdTEyLW52cmFtLm8KIG9iai0kKENPTkZJR19NVERfRURCNzMxMikJKz0gZWRiNzMxMi5vCkBAIC03MSwzICs2OCw1IEBACiBvYmotJChDT05GSUdfTVREX1dSU0JDODI2MCkJKz0gd3Jfc2JjODJ4eF9mbGFzaC5vCiBvYmotJChDT05GSUdfTVREX0RNVjE4MikJKz0gZG12MTgyLm8KIG9iai0kKENPTkZJR19NVERfU0hBUlBfU0wpCSs9IHNoYXJwc2wtZmxhc2gubworb2JqLSQoQ09ORklHX01URF9QTEFUUkFNKQkrPSBwbGF0LXJhbS5vCitvYmotJChDT05GSUdfTVREX09NQVBfTk9SKQkrPSBvbWFwX25vci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2FsY2hlbXktZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvYWxjaGVteS1mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9tYXBzL2FsY2hlbXktZmxhc2guYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQU1EIEFsY2hlbXkgZXZhbHVhdGlvbiBib2FyZHMKKyAqIAorICogJElkOiBhbGNoZW15LWZsYXNoLmMsdiAxLjEgMjAwNS8wMi8yNyAyMTo1MDoyMSBwcG9wb3YgRXhwICQKKyAqCisgKiAoQykgMjAwMywgMjAwNCBQZXRlIFBvcG92IDxwcG9wb3ZAZW1iZWRkZWRhbGxleS5jb20+CisgKiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2lmZGVmIAlERUJVR19SVworI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCisjZWxzZQorI2RlZmluZQlEQkcoeC4uLikJCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTAwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiUGIxMDAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDA4MDAwMDAgLyogOE1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19QQjE1MDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIlBiMTUwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDA0MDAwMDAwIC8qIDY0TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX1BCMTEwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiUGIxMTAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDQwMDAwMDAgLyogNjRNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfUEIxNTUwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJQYjE1NTAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwODAwMDAwMCAvKiAxMjhNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfUEIxMjAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJQYjEyMDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwODAwMDAwMCAvKiAxMjhNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCAyIC8qIDE2LWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxMDAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJEYjEwMDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwMjAwMDAwMCAvKiAzMk1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDQgLyogMzItYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19EQjE1MDAKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIkRiMTUwMCBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAyMDAwMDAwIC8qIDMyTUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NSVBTX0RCMTEwMAorI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiRGIxMTAwIEZsYXNoIgorI2RlZmluZSBCT0FSRF9GTEFTSF9TSVpFIDB4MDIwMDAwMDAgLyogMzJNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxNTUwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJEYjE1NTAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwODAwMDAwMCAvKiAxMjhNQiAqLworI2RlZmluZSBCT0FSRF9GTEFTSF9XSURUSCA0IC8qIDMyLWJpdHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01JUFNfREIxMjAwCisjZGVmaW5lIEJPQVJEX01BUF9OQU1FICJEYjEyMDAgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwNDAwMDAwMCAvKiA2NE1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDIgLyogMTYtYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19IWURST0dFTjMKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIkh5ZHJvZ2VuMyBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDAyMDAwMDAwIC8qIDMyTUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZGVmaW5lIFVTRV9MT0NBTF9BQ0NFU1NPUlMgLyogd2h5PyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19CT1NQT1JVUworI2RlZmluZSBCT0FSRF9NQVBfTkFNRSAiQm9zcG9ydXMgRmxhc2giCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1NJWkUgMHgwMTAwMDAwMCAvKiAxNk1CICovCisjZGVmaW5lIEJPQVJEX0ZMQVNIX1dJRFRIIDIgLyogMTYtYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19NSVJBR0UKKyNkZWZpbmUgQk9BUkRfTUFQX05BTUUgIk1pcmFnZSBGbGFzaCIKKyNkZWZpbmUgQk9BUkRfRkxBU0hfU0laRSAweDA0MDAwMDAwIC8qIDY0TUIgKi8KKyNkZWZpbmUgQk9BUkRfRkxBU0hfV0lEVEggNCAvKiAzMi1iaXRzICovCisjZGVmaW5lIFVTRV9MT0NBTF9BQ0NFU1NPUlMgLyogd2h5PyAqLworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2luZm8gYWxjaGVteV9tYXAgPSB7CisJLm5hbWUgPQlCT0FSRF9NQVBfTkFNRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBhbGNoZW15X3BhcnRpdGlvbnNbXSA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC5uYW1lID0gIlVzZXIgRlMiLAorICAgICAgICAgICAgICAgIC5zaXplID0gQk9BUkRfRkxBU0hfU0laRSAtIDB4MDA0MDAwMDAsCisgICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAorICAgICAgICB9LHsKKyAgICAgICAgICAgICAgICAubmFtZSA9ICJZQU1PTiIsCisgICAgICAgICAgICAgICAgLnNpemUgPSAweDAxMDAwMDAsCisJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCisgICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFCisgICAgICAgIH0seworICAgICAgICAgICAgICAgIC5uYW1lID0gInJhdyBrZXJuZWwiLAorCQkuc2l6ZSA9ICgweDMwMDAwMCAtIDB4NDAwMDApLCAvKiBsYXN0IDI1NktCIGlzIHlhbW9uIGVudiAqLworCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorICAgICAgICB9Cit9OworCisjZGVmaW5lIE5CX09GKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqbXltdGQ7CisKK2ludCBfX2luaXQgYWxjaGVteV9tdGRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKKwlpbnQgbmJfcGFydHMgPSAwOworCXVuc2lnbmVkIGxvbmcgd2luZG93X2FkZHI7CisJdW5zaWduZWQgbG9uZyB3aW5kb3dfc2l6ZTsKKwkKKwkvKiBEZWZhdWx0IGZsYXNoIGJ1c3dpZHRoICovCisJYWxjaGVteV9tYXAuYmFua3dpZHRoID0gQk9BUkRfRkxBU0hfV0lEVEg7CisKKwl3aW5kb3dfYWRkciA9IDB4MjAwMDAwMDAgLSBCT0FSRF9GTEFTSF9TSVpFOworCXdpbmRvd19zaXplID0gQk9BUkRfRkxBU0hfU0laRTsKKyNpZmRlZiBDT05GSUdfTUlQU19NSVJBR0VfV0hZCisJLyogQm9vdCBST00gZmxhc2ggYmFuayBvbmx5OyBubyB1c2VyIGJhbmsgKi8KKwl3aW5kb3dfYWRkciA9IDB4MUMwMDAwMDA7CisJd2luZG93X3NpemUgPSAweDA0MDAwMDAwOworCS8qIFVTRVJGUyBmcm9tIDB4MUMwMCAwMDAwIHRvIDB4MUZDMDAwMDAgKi8KKwlhbGNoZW15X3BhcnRpdGlvbnNbMF0uc2l6ZSA9IDB4MDNDMDAwMDA7CisjZW5kaWYKKworCS8qCisJICogU3RhdGljIHBhcnRpdGlvbiBkZWZpbml0aW9uIHNlbGVjdGlvbgorCSAqLworCXBhcnRzID0gYWxjaGVteV9wYXJ0aXRpb25zOworCW5iX3BhcnRzID0gTkJfT0YoYWxjaGVteV9wYXJ0aXRpb25zKTsKKwlhbGNoZW15X21hcC5zaXplID0gd2luZG93X3NpemU7CisKKwkvKgorCSAqIE5vdyBsZXQncyBwcm9iZSBmb3IgdGhlIGFjdHVhbCBmbGFzaC4gIERvIGl0IGhlcmUgc2luY2UKKwkgKiBzcGVjaWZpYyBtYWNoaW5lIHNldHRpbmdzIG1pZ2h0IGhhdmUgYmVlbiBzZXQgYWJvdmUuCisJICovCisJcHJpbnRrKEtFUk5fTk9USUNFIEJPQVJEX01BUF9OQU1FICI6IHByb2JpbmcgJWQtYml0IGZsYXNoIGJ1c1xuIiwgCisJCQlhbGNoZW15X21hcC5iYW5rd2lkdGgqOCk7CisJYWxjaGVteV9tYXAudmlydCA9IGlvcmVtYXAod2luZG93X2FkZHIsIHdpbmRvd19zaXplKTsKKwlteW10ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJmFsY2hlbXlfbWFwKTsKKwlpZiAoIW15bXRkKSB7CisJCWlvdW5tYXAoYWxjaGVteV9tYXAudmlydCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwYXJ0cywgbmJfcGFydHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWxjaGVteV9tdGRfY2xlYW51cCh2b2lkKQoreworCWlmIChteW10ZCkgeworCQlkZWxfbXRkX3BhcnRpdGlvbnMobXltdGQpOworCQltYXBfZGVzdHJveShteW10ZCk7CisJCWlvdW5tYXAoYWxjaGVteV9tYXAudmlydCk7CisJfQorfQorCittb2R1bGVfaW5pdChhbGNoZW15X210ZF9pbml0KTsKK21vZHVsZV9leGl0KGFsY2hlbXlfbXRkX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJFbWJlZGRlZCBBbGxleSBTb2x1dGlvbnMsIEluYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKEJPQVJEX01BUF9OQU1FICIgTVREIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9hbWQ3Nnhyb20uYyBiL2RyaXZlcnMvbXRkL21hcHMvYW1kNzZ4cm9tLmMKaW5kZXggNTFlOTdiMC4uZThhOTAwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9hbWQ3Nnhyb20uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL2FtZDc2eHJvbS5jCkBAIC0yLDcgKzIsNyBAQAogICogYW1kNzZ4cm9tLmMKICAqCiAgKiBOb3JtYWwgbWFwcGluZ3Mgb2YgY2hpcHMgaW4gcGh5c2ljYWwgbWVtb3J5Ci0gKiAkSWQ6IGFtZDc2eHJvbS5jLHYgMS4xOSAyMDA0LzExLzI4IDA5OjQwOjM5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IGFtZDc2eHJvbS5jLHYgMS4yMCAyMDA1LzAzLzE4IDE0OjA0OjM1IGdsZWl4bmVyIEV4cCAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzE0LDcgKzMxNCw3IEBACiAJfQogCXJldHVybiAtRU5YSU87CiAjaWYgMAotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmFtZDc2eHJvbV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZhbWQ3Nnhyb21fZHJpdmVyKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2Jhc3QtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvYmFzdC1mbGFzaC5jCmluZGV4IDQ0ZGUzYTguLjBjNDU0NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvYmFzdC1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvYmFzdC1mbGFzaC5jCkBAIC0xLDE0ICsxLDE1IEBACiAvKiBsaW51eC9kcml2ZXJzL210ZC9tYXBzL2Jhc3RfZmxhc2guYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgogICoKICAqIFNpbXRlYyBCYXN0IChFQjI0MTBJVFgpIE5PUiBNVEQgTWFwcGluZyBkcml2ZXIKICAqCiAgKiBDaGFuZ2Vsb2c6CiAgKgkyMC1TZXAtMjAwNCAgQkpEICBJbml0aWFsIHZlcnNpb24KKyAqCTE3LUphbi0yMDA1ICBCSkQgIEFkZCB3aG9sZSBkZXZpY2UgaWYgbm8gcGFydGl0aW9ucyBmb3VuZAogICoKLSAqICRJZDogYmFzdC1mbGFzaC5jLHYgMS4xIDIwMDQvMDkvMjEgMTQ6Mjk6MDQgYmpkIEV4cCAkCisgKiAkSWQ6IGJhc3QtZmxhc2guYyx2IDEuMiAyMDA1LzAxLzE4IDExOjEzOjQ3IGJqZCBFeHAgJAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNDYsOSArNDcsOSBAQAogI2luY2x1ZGUgPGFzbS9hcmNoL2Jhc3QtY3BsZC5oPgogCiAjaWZkZWYgQ09ORklHX01URF9CQVNUX01BWFNJWkUKLSNkZWZpbmUgQVJFQV9NQVhTSVpFIChDT05GSUdfTVREX0JBU1RfTUFYU0laRSAqICgxMDI0KjEwMjQpKQorI2RlZmluZSBBUkVBX01BWFNJWkUgKENPTkZJR19NVERfQkFTVF9NQVhTSVpFICogU1pfMU0pCiAjZWxzZQotI2RlZmluZSBBUkVBX01BWFNJWkUgKDMyKjEwMjQqMTAyNCkKKyNkZWZpbmUgQVJFQV9NQVhTSVpFICgzMiAqIFNaXzFNKQogI2VuZGlmCiAKICNkZWZpbmUgUEZYICJiYXN0LWZsYXNoOiAiCkBAIC0xODksNiArMTkwLDggQEAKIAkJZXJyID0gYWRkX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgaW5mby0+cGFydGl0aW9ucywgZXJyKTsKIAkJaWYgKGVycikgCiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgYWRkL3BhcnNlIHBhcnRpdGlvbnNcbiIpOworCX0gZWxzZSB7CisJCWVyciA9IGFkZF9tdGRfZGV2aWNlKGluZm8tPm10ZCk7CiAJfQogCiAJaWYgKGVyciA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9kYjE1NTAtZmxhc2guYyBiL2RyaXZlcnMvbXRkL21hcHMvZGIxNTUwLWZsYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTM4ODguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9kYjE1NTAtZmxhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IERiMTU1MCBib2FyZAotICogCi0gKiAkSWQ6IGRiMTU1MC1mbGFzaC5jLHYgMS43IDIwMDQvMTEvMDQgMTM6MjQ6MTQgZ2xlaXhuZXIgRXhwICQKLSAqCi0gKiAoQykgMjAwNCBFbWJlZGRlZCBFZGdlLCBMTEMsIGJhc2VkIG9uIGRiMTU1MC1mbGFzaC5jOgotICogKEMpIDIwMDMsIDIwMDQgUGV0ZSBQb3BvdiA8cHBvcG92QGVtYmVkZGVkYWxsZXkuY29tPgotICogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLSNpZmRlZiAJREVCVUdfUlcKLSNkZWZpbmUJREJHKHguLi4pCXByaW50ayh4KQotI2Vsc2UKLSNkZWZpbmUJREJHKHguLi4pCQotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdpbmRvd19hZGRyOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X3NpemU7Ci0KLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBkYjE1NTBfbWFwID0gewotCS5uYW1lID0JIkRiMTU1MCBmbGFzaCIsCi19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFzaF9iYW5rd2lkdGggPSA0OwotCi0vKiAKLSAqIFN1cHBvcnQgb25seSA2NE1CIE5PUiBGbGFzaCBwYXJ0cwotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19NVERfREIxNTUwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9EQjE1NTBfVVNFUikKLSNkZWZpbmUgREIxNTUwX0JPVEhfQkFOS1MKLSNlbGlmIGRlZmluZWQoQ09ORklHX01URF9EQjE1NTBfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX01URF9EQjE1NTBfVVNFUikKLSNkZWZpbmUgREIxNTUwX0JPT1RfT05MWQotI2VsaWYgIWRlZmluZWQoQ09ORklHX01URF9EQjE1NTBfQk9PVCkgJiYgZGVmaW5lZChDT05GSUdfTVREX0RCMTU1MF9VU0VSKQotI2RlZmluZSBEQjE1NTBfVVNFUl9PTkxZCi0jZW5kaWYKLQotI2lmZGVmIERCMTU1MF9CT1RIX0JBTktTCi0vKiBib3RoIGJhbmtzIHdpbGwgYmUgdXNlZC4gQ29tYmluZSB0aGUgZmlyc3QgYmFuayBhbmQgdGhlIGZpcnN0IAotICogcGFydCBvZiB0aGUgc2Vjb25kIGJhbmsgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBqZmZzL2pmZnMyCi0gKiBwYXJ0aXRpb24uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDFDMDAgMDAwMCAxRkZGIEZGRkYgQ0UwIDY0TUIgQm9vdCBOT1IgRmxhc2gKLQkgKiAxODAwIDAwMDAgMUJGRiBGRkZGIENFMCA2NE1CIFBhcmFtIE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAgICgweDFGQzAwMDAwIC0gMHgxODAwMDAwMCksCi0gICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAweDAxMDAwMDAsCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lID0gInJhdyBrZXJuZWwiLAotCQkuc2l6ZSA9ICgweDMwMDAwMCAtIDB4NDAwMDApLCAvKiBsYXN0IDI1NktCIGlzIHlhbW9uIGVudiAqLwotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2VsaWYgZGVmaW5lZChEQjE1NTBfQk9PVF9PTkxZKQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRiMTU1MF9wYXJ0aXRpb25zW10gPSB7Ci0JLyogYXNzdW1lIGJvb3RbMjowXTpzd2FwIGlzICcwMDAwJyBvciAnMTAwMCcsIHdoaWNoIHRyYW5zbGF0ZXMgdG86Ci0JICogMUMwMCAwMDAwIDFGRkYgRkZGRiBDRTAgNjRNQiBCb290IE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAgIDB4MDNjMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAweDAxMDAwMDAsCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lID0gInJhdyBrZXJuZWwiLAotCQkuc2l6ZSA9ICgweDMwMDAwMC0weDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoREIxNTUwX1VTRVJfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBkYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDE4MDAgMDAwMCAxQkZGIEZGRkYgQ0UwIDY0TUIgUGFyYW0gTk9SIEZsYXNoCi0JICovCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSA9ICgweDQwMDAwMDAgLSAweDIwMDAwMCksIC8qIHJlc2VydmUgMk1CIGZvciByYXcga2VybmVsICovCi0gICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSBNVERQQVJUX1NJWl9GVUxMLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2Vsc2UKLSNlcnJvciBNVERfREIxNTUwIGRlZmluZSBjb21ibyBlcnJvciAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0jZW5kaWYKLQotI2RlZmluZSBOQl9PRih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCi0KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOwotCi0vKgotICogUHJvYmUgdGhlIGZsYXNoIGRlbnNpdHkgYW5kIHNldHVwIHdpbmRvdyBhZGRyZXNzIGFuZCBzaXplCi0gKiBiYXNlZCBvbiB1c2VyIENPTkZJRyBvcHRpb25zLiBUaGVyZSBhcmUgdGltZXMgd2hlbiB3ZSBkb24ndAotICogd2FudCB0aGUgTVREIGRyaXZlciB0byBiZSBwcm9iaW5nIHRoZSBib290IG9yIHVzZXIgZmxhc2gsCi0gKiBzbyBoYXZpbmcgdGhlIG9wdGlvbiB0byBlbmFibGUgb25seSBvbmUgYmFuayBpcyBpbXBvcnRhbnQuCi0gKi8KLWludCBzZXR1cF9mbGFzaF9wYXJhbXModm9pZCkKLXsKLSNpZiBkZWZpbmVkKERCMTU1MF9CT1RIX0JBTktTKQotCQkJd2luZG93X2FkZHIgPSAweDE4MDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDgwMDAwMDA7IAotI2VsaWYgZGVmaW5lZChEQjE1NTBfQk9PVF9PTkxZKQotCQkJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7IAotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MTgwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4NDAwMDAwMDsgCi0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW5pdCBkYjE1NTBfbXRkX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IG5iX3BhcnRzID0gMDsKLQkKLQkvKiBEZWZhdWx0IGZsYXNoIGJhbmt3aWR0aCAqLwotCWRiMTU1MF9tYXAuYmFua3dpZHRoID0gZmxhc2hfYmFua3dpZHRoOwotCi0JaWYgKHNldHVwX2ZsYXNoX3BhcmFtcygpKSAKLQkJcmV0dXJuIC1FTlhJTzsKLQotCS8qCi0JICogU3RhdGljIHBhcnRpdGlvbiBkZWZpbml0aW9uIHNlbGVjdGlvbgotCSAqLwotCXBhcnRzID0gZGIxNTUwX3BhcnRpdGlvbnM7Ci0JbmJfcGFydHMgPSBOQl9PRihkYjE1NTBfcGFydGl0aW9ucyk7Ci0JZGIxNTUwX21hcC5zaXplID0gd2luZG93X3NpemU7Ci0KLQkvKgotCSAqIE5vdyBsZXQncyBwcm9iZSBmb3IgdGhlIGFjdHVhbCBmbGFzaC4gIERvIGl0IGhlcmUgc2luY2UKLQkgKiBzcGVjaWZpYyBtYWNoaW5lIHNldHRpbmdzIG1pZ2h0IGhhdmUgYmVlbiBzZXQgYWJvdmUuCi0JICovCi0JcHJpbnRrKEtFUk5fTk9USUNFICJEYjE1NTAgZmxhc2g6IHByb2JpbmcgJWQtYml0IGZsYXNoIGJ1c1xuIiwgCi0JCQlkYjE1NTBfbWFwLmJhbmt3aWR0aCo4KTsKLQlkYjE1NTBfbWFwLnZpcnQgPSBpb3JlbWFwKHdpbmRvd19hZGRyLCB3aW5kb3dfc2l6ZSk7Ci0JbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZkYjE1NTBfbWFwKTsKLQlpZiAoIW15bXRkKSByZXR1cm4gLUVOWElPOwotCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwYXJ0cywgbmJfcGFydHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGIxNTUwX210ZF9jbGVhbnVwKHZvaWQpCi17Ci0JaWYgKG15bXRkKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyhteW10ZCk7Ci0JCW1hcF9kZXN0cm95KG15bXRkKTsKLQkJaW91bm1hcCgodm9pZCAqKSBkYjE1NTBfbWFwLnZpcnQpOwotCX0KLX0KLQotbW9kdWxlX2luaXQoZGIxNTUwX210ZF9pbml0KTsKLW1vZHVsZV9leGl0KGRiMTU1MF9tdGRfY2xlYW51cCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkVtYmVkZGVkIEVkZ2UsIExMQyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEYjE1NTAgbXRkIG1hcCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvZGIxeDAwLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL2RiMXgwMC1mbGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWE2OGVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL21hcHMvZGIxeDAwLWZsYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIEZsYXNoIG1lbW9yeSBhY2Nlc3Mgb24gQWxjaGVteSBEYjF4eHggYm9hcmRzCi0gKiAKLSAqICRJZDogZGIxeDAwLWZsYXNoLmMsdiAxLjYgMjAwNC8xMS8wNCAxMzoyNDoxNCBnbGVpeG5lciBFeHAgJAotICoKLSAqIChDKSAyMDAzIFBldGUgUG9wb3YgPHBwb3BvdkBlbWJlZGRlZGFsbGV5LmNvbT4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWZkZWYgCURFQlVHX1JXCi0jZGVmaW5lCURCRyh4Li4uKQlwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQkKLSNlbmRpZgotCi0vKiBNVEQgQ09ORklHIE9QVElPTlMgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NVERfREIxWDAwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9EQjFYMDBfVVNFUikKLSNkZWZpbmUgREIxWDAwX0JPVEhfQkFOS1MKLSNlbGlmIGRlZmluZWQoQ09ORklHX01URF9EQjFYMDBfQk9PVCkgJiYgIWRlZmluZWQoQ09ORklHX01URF9EQjFYMDBfVVNFUikKLSNkZWZpbmUgREIxWDAwX0JPT1RfT05MWQotI2VsaWYgIWRlZmluZWQoQ09ORklHX01URF9EQjFYMDBfQk9PVCkgJiYgZGVmaW5lZChDT05GSUdfTVREX0RCMVgwMF9VU0VSKQotI2RlZmluZSBEQjFYMDBfVVNFUl9PTkxZCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X2FkZHI7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB3aW5kb3dfc2l6ZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZsYXNoX3NpemU7Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqYmNzciA9ICh1bnNpZ25lZCBzaG9ydCAqKTB4QUUwMDAwMDA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBmbGFzaF9iYW5rd2lkdGggPSA0OwotCi0vKiAKLSAqIFRoZSBEYjF4IGJvYXJkcyBzdXBwb3J0IGRpZmZlcmVudCBmbGFzaCBkZW5zaXRpZXMuIFdlIHNldHVwCi0gKiB0aGUgbXRkX3BhcnRpdGlvbiBzdHJ1Y3R1cmVzIGJlbG93IGZvciBkZWZhdWx0IG9mIDY0TWJpdCAKLSAqIGZsYXNoIGRlbnNpdGllcywgYW5kIG92ZXJyaWRlIHRoZSBwYXJ0aXRpb25zIHNpemVzLCBpZgotICogbmVjZXNzYXJ5LCBhZnRlciB3ZSBjaGVjayB0aGUgYm9hcmQgc3RhdHVzIHJlZ2lzdGVyLgotICovCi0KLSNpZmRlZiBEQjFYMDBfQk9USF9CQU5LUwotLyogYm90aCBiYW5rcyB3aWxsIGJlIHVzZWQuIENvbWJpbmUgdGhlIGZpcnN0IGJhbmsgYW5kIHRoZSBmaXJzdCAKLSAqIHBhcnQgb2YgdGhlIHNlY29uZCBiYW5rIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgamZmcy9qZmZzMgotICogcGFydGl0aW9uLgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGIxeDAwX3BhcnRpdGlvbnNbXSA9IHsKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgMHgxYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgMHgwMDAwMDAwCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgInlhbW9uIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gIDB4MDEwMDAwMCwKLQkJLm9mZnNldCAgICAgICA9ICBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgICA9ICBNVERfV1JJVEVBQkxFCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgInJhdyBrZXJuZWwiLAotCQkuc2l6ZSAgICAgICAgID0gICgweDMwMDAwMC0weDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyBlbnYgKi8KLQkJLm9mZnNldCAgICAgICA9ICBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgIH0KLX07Ci0jZWxpZiBkZWZpbmVkKERCMVgwMF9CT09UX09OTFkpCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZGIxeDAwX3BhcnRpdGlvbnNbXSA9IHsKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgIlVzZXIgRlMiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgMHgwMGMwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAweDAxMDAwMDAsCi0JCS5vZmZzZXQgICAgICAgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJyYXcga2VybmVsIiwKLQkJLnNpemUgICAgICAgICA9ICAoMHgzMDAwMDAtMHg0MDAwMCksIC8qIGxhc3QgMjU2S0IgaXMgZW52ICovCi0JCS5vZmZzZXQgICAgICAgPSAgTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2VsaWYgZGVmaW5lZChEQjFYMDBfVVNFUl9PTkxZKQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGRiMXgwMF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSAgICAgICAgID0gIDB4MGUwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICJyYXcga2VybmVsIiwKLQkJLnNpemUgICAgICAgICA9ICBNVERQQVJUX1NJWl9GVUxMLAotCQkub2Zmc2V0ICAgICAgID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbHNlCi0jZXJyb3IgTVREX0RCMVgwMCBkZWZpbmUgY29tYm8gZXJyb3IgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotI2VuZGlmCi0jZGVmaW5lIE5CX09GKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKLQotI2RlZmluZSBOQU1FICAgICAJIkRiMXgwMCBMaW51eCBGbGFzaCIKLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBkYjF4eHhfbXRkX21hcCA9IHsKLQkubmFtZQkJPSBOQU1FLAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJzZWRfcGFydHM7Ci1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICpkYjF4eHhfbXRkOwotCi0vKgotICogUHJvYmUgdGhlIGZsYXNoIGRlbnNpdHkgYW5kIHNldHVwIHdpbmRvdyBhZGRyZXNzIGFuZCBzaXplCi0gKiBiYXNlZCBvbiB1c2VyIENPTkZJRyBvcHRpb25zLiBUaGVyZSBhcmUgdGltZXMgd2hlbiB3ZSBkb24ndAotICogd2FudCB0aGUgTVREIGRyaXZlciB0byBiZSBwcm9iaW5nIHRoZSBib290IG9yIHVzZXIgZmxhc2gsCi0gKiBzbyBoYXZpbmcgdGhlIG9wdGlvbiB0byBlbmFibGUgb25seSBvbmUgYmFuayBpcyBpbXBvcnRhbnQuCi0gKi8KLWludCBzZXR1cF9mbGFzaF9wYXJhbXModm9pZCkKLXsKLQlzd2l0Y2ggKChiY3NyWzJdID4+IDE0KSAmIDB4MykgewotCQljYXNlIDA6IC8qIDY0TWJpdCBkZXZpY2VzICovCi0JCQlmbGFzaF9zaXplID0gMHg4MDAwMDA7IC8qIDhNQiBwZXIgcGFydCAqLwotI2lmIGRlZmluZWQoREIxWDAwX0JPVEhfQkFOS1MpCi0JCQl3aW5kb3dfYWRkciA9IDB4MUUwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MjAwMDAwMDsgCi0jZWxpZiBkZWZpbmVkKERCMVgwMF9CT09UX09OTFkpCi0JCQl3aW5kb3dfYWRkciA9IDB4MUYwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4MTAwMDAwMDsgCi0jZWxzZSAvKiBVU0VSIE9OTFkgKi8KLQkJCXdpbmRvd19hZGRyID0gMHgxRTAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHgxMDAwMDAwOyAKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCS8qIDEyOCBNYml0IGRldmljZXMgKi8KLQkJCWZsYXNoX3NpemUgPSAweDEwMDAwMDA7IC8qIDE2TUIgcGVyIHBhcnQgKi8KLSNpZiBkZWZpbmVkKERCMVgwMF9CT1RIX0JBTktTKQotCQkJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7Ci0JCQkvKiBVU0VSRlMgZnJvbSAweDFDMDAgMDAwMCB0byAweDFGQzAgMDAwMCAqLwotCQkJZGIxeDAwX3BhcnRpdGlvbnNbMF0uc2l6ZSA9IDB4M0MwMDAwMDsKLSNlbGlmIGRlZmluZWQoREIxWDAwX0JPT1RfT05MWSkKLQkJCXdpbmRvd19hZGRyID0gMHgxRTAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHgyMDAwMDAwOwotCQkJLyogVVNFUkZTIGZyb20gMHgxRTAwIDAwMDAgdG8gMHgxRkMwIDAwMDAgKi8KLQkJCWRiMXgwMF9wYXJ0aXRpb25zWzBdLnNpemUgPSAweDFDMDAwMDA7Ci0jZWxzZSAvKiBVU0VSIE9OTFkgKi8KLQkJCXdpbmRvd19hZGRyID0gMHgxQzAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHgyMDAwMDAwOwotCQkJLyogVVNFUkZTIGZyb20gMHgxQzAwIDAwMDAgdG8gMHgxREUwMDAwMCAqLwotCQkJZGIxeDAwX3BhcnRpdGlvbnNbMF0uc2l6ZSA9IDB4MURFMDAwMDsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCS8qIDI1NiBNYml0IGRldmljZXMgKi8KLQkJCWZsYXNoX3NpemUgPSAweDQwMDAwMDA7IC8qIDY0TUIgcGVyIHBhcnQgKi8KLSNpZiBkZWZpbmVkKERCMVgwMF9CT1RIX0JBTktTKQotCQkJcmV0dXJuIDE7Ci0jZWxpZiBkZWZpbmVkKERCMVgwMF9CT09UX09OTFkpCi0JCQkvKiBCb290IFJPTSBmbGFzaCBiYW5rIG9ubHk7IG5vIHVzZXIgYmFuayAqLwotCQkJd2luZG93X2FkZHIgPSAweDFDMDAwMDAwOwotCQkJd2luZG93X3NpemUgPSAweDQwMDAwMDA7Ci0JCQkvKiBVU0VSRlMgZnJvbSAweDFDMDAgMDAwMCB0byAweDFGQzAwMDAwICovCi0JCQlkYjF4MDBfcGFydGl0aW9uc1swXS5zaXplID0gMHgzQzAwMDAwOwotI2Vsc2UgLyogVVNFUiBPTkxZICovCi0JCQlyZXR1cm4gMTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMTsKLQl9Ci0JZGIxeHh4X210ZF9tYXAuc2l6ZSA9IHdpbmRvd19zaXplOwotCWRiMXh4eF9tdGRfbWFwLmJhbmt3aWR0aCA9IGZsYXNoX2Jhbmt3aWR0aDsKLQlkYjF4eHhfbXRkX21hcC5waHlzID0gd2luZG93X2FkZHI7Ci0JZGIxeHh4X210ZF9tYXAuYmFua3dpZHRoID0gZmxhc2hfYmFua3dpZHRoOwotCXJldHVybiAwOwotfQotCi1pbnQgX19pbml0IGRiMXgwMF9tdGRfaW5pdCh2b2lkKQotewotCXN0cnVjdCBtdGRfcGFydGl0aW9uICpwYXJ0czsKLQlpbnQgbmJfcGFydHMgPSAwOwotCQotCWlmIChzZXR1cF9mbGFzaF9wYXJhbXMoKSkgCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKgotCSAqIFN0YXRpYyBwYXJ0aXRpb24gZGVmaW5pdGlvbiBzZWxlY3Rpb24KLQkgKi8KLQlwYXJ0cyA9IGRiMXgwMF9wYXJ0aXRpb25zOwotCW5iX3BhcnRzID0gTkJfT0YoZGIxeDAwX3BhcnRpdGlvbnMpOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCi0JICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiRGIxeHh4IGZsYXNoOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAotCQkJZGIxeHh4X210ZF9tYXAuYmFua3dpZHRoKjgpOwotCWRiMXh4eF9tdGRfbWFwLnZpcnQgPSBpb3JlbWFwKHdpbmRvd19hZGRyLCB3aW5kb3dfc2l6ZSk7Ci0JZGIxeHh4X210ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJmRiMXh4eF9tdGRfbWFwKTsKLQlpZiAoIWRiMXh4eF9tdGQpIHJldHVybiAtRU5YSU87Ci0JZGIxeHh4X210ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCWFkZF9tdGRfcGFydGl0aW9ucyhkYjF4eHhfbXRkLCBwYXJ0cywgbmJfcGFydHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGIxeDAwX210ZF9jbGVhbnVwKHZvaWQpCi17Ci0JaWYgKGRiMXh4eF9tdGQpIHsKLQkJZGVsX210ZF9wYXJ0aXRpb25zKGRiMXh4eF9tdGQpOwotCQltYXBfZGVzdHJveShkYjF4eHhfbXRkKTsKLQkJaWYgKHBhcnNlZF9wYXJ0cykKLQkJCWtmcmVlKHBhcnNlZF9wYXJ0cyk7Ci0JfQotfQotCi1tb2R1bGVfaW5pdChkYjF4MDBfbXRkX2luaXQpOwotbW9kdWxlX2V4aXQoZGIxeDAwX210ZF9jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiUGV0ZSBQb3BvdiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEYjF4MDAgbXRkIG1hcCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvZWxhbi0xMDRuYy5jIGIvZHJpdmVycy9tdGQvbWFwcy9lbGFuLTEwNG5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDY1ZjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9lbGFuLTEwNG5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyogZWxhbi0xMDRuYy5jIC0tIE1URCBtYXAgZHJpdmVyIGZvciBBcmNvbSBDb250cm9sIFN5c3RlbXMgRUxBTi0xMDROQwotIAotICAgQ29weXJpZ2h0IChDKSAyMDAwIEFyY29tIENvbnRyb2wgU3lzdGVtIEx0ZAotIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKLQotICAgJElkOiBlbGFuLTEwNG5jLmMsdiAxLjI1IDIwMDQvMTEvMjggMDk6NDA6MzkgZHdtdzIgRXhwICQKLQotVGhlIEVMQU4tMTA0TkMgaGFzIHVwIHRvIDggTWlieXRlIG9mIEludGVsIFN0cmF0YUZsYXNoICgyOEYzMjAvMjhGNjQwKSBpbiB4MTYKLW1vZGUuICBUaGlzIGRyaXZlcnMgdXNlcyB0aGUgQ0ZJIHByb2JlIGFuZCBJbnRlbCBFeHRlbmRlZCBDb21tYW5kIFNldCBkcml2ZXJzLgotCi1UaGUgZmxhc2ggaXMgYWNjZXNzZWQgYXMgZm9sbG93czoKLQotICAgMzIga2J5dGUgbWVtb3J5IHdpbmRvdyBhdCAweGIwMDAwLTB4YjdmZmYKLSAgIAotICAgMTYgYml0IEkvTyBwb3J0ICgweDIyKSBmb3Igc29tZSBzb3J0IG9mIHBhZ2luZy4KLQotVGhlIHNpbmdsZSBmbGFzaCBkZXZpY2UgaXMgZGl2aWRlZCBpbnRvIDMgcGFydGl0aW9uIHdoaWNoIGFwcGVhciBhcyBzZXBhcmF0ZQotTVREIGRldmljZXMuCi0KLUxpbnV4IHRoaW5rcyB0aGF0IHRoZSBJL08gcG9ydCBpcyB1c2VkIGJ5IHRoZSBQSUMgYW5kIGhlbmNlIGNoZWNrX3JlZ2lvbigpIHdpbGwKLWFsd2F5cyBmYWlsLiAgU28gd2UgZG9uJ3QgZG8gaXQuICBJIGp1c3QgaG9wZSBpdCBkb2Vzbid0IGJyZWFrIGFueXRoaW5nLgotKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotCi0jZGVmaW5lIFdJTkRPV19TVEFSVCAweGIwMDAwCi0vKiBOdW1iZXIgb2YgYml0cyBpbiBvZmZzZXQuICovCi0jZGVmaW5lIFdJTkRPV19TSElGVCAxNQotI2RlZmluZSBXSU5ET1dfTEVOR1RIICgxIDw8IFdJTkRPV19TSElGVCkKLS8qIFRoZSBiaXRzIGZvciB0aGUgb2Zmc2V0IGludG8gdGhlIHdpbmRvdy4gKi8KLSNkZWZpbmUgV0lORE9XX01BU0sgKFdJTkRPV19MRU5HVEgtMSkKLSNkZWZpbmUgUEFHRV9JTyAweDIyCi0jZGVmaW5lIFBBR0VfSU9fU0laRSAyCi0KLXN0YXRpYyB2b2xhdGlsZSBpbnQgcGFnZV9pbl93aW5kb3cgPSAtMTsgLy8gQ3VycmVudCBwYWdlIGluIHdpbmRvdy4KLXN0YXRpYyB2b2lkIF9faW9tZW0gKmlvbWFwYWRyOwotc3RhdGljIERFRklORV9TUElOTE9DSyhlbGFuXzEwNG5jX3NwaW4pOwotCi0vKiBwYXJ0aXRpb25faW5mbyBnaXZlcyBkZXRhaWxzIG9uIHRoZSBsb2dpY2FsIHBhcnRpdGlvbnMgdGhhdCB0aGUgc3BsaXQgdGhlIAotICogc2luZ2xlIGZsYXNoIGRldmljZSBpbnRvLiBJZiB0aGUgc2l6ZSBpZiB6ZXJvIHdlIHVzZSB1cCB0byB0aGUgZW5kIG9mIHRoZQotICogZGV2aWNlLiAqLwotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvW109ewotICAgIHsgLm5hbWUgPSAiRUxBTi0xMDROQyBmbGFzaCBib290IHBhcnRpdGlvbiIsIAotICAgICAgLm9mZnNldCA9IDAsIAotICAgICAgLnNpemUgPSA2NDAqMTAyNCB9LAotICAgIHsgLm5hbWUgPSAiRUxBTi0xMDROQyBmbGFzaCBwYXJ0aXRpb24gMSIsIAotICAgICAgLm9mZnNldCA9IDY0MCoxMDI0LCAKLSAgICAgIC5zaXplID0gODk2KjEwMjQgfSwKLSAgICB7IC5uYW1lID0gIkVMQU4tMTA0TkMgZmxhc2ggcGFydGl0aW9uIDIiLCAKLSAgICAgIC5vZmZzZXQgPSAoNjQwKzg5NikqMTAyNCB9Ci19OwotI2RlZmluZSBOVU1fUEFSVElUSU9OUyAoc2l6ZW9mKHBhcnRpdGlvbl9pbmZvKS9zaXplb2YocGFydGl0aW9uX2luZm9bMF0pKQotCi0vKgotICogSWYgbm8gaWRlYSB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICBUaGlzIGlzIHRha2VuIGZyb20gdGhlIEZsYXNoRlggc3R1ZmYuCi0gKi8KLSNkZWZpbmUgUk9NQ1MgMQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZWxhbl8xMDRuY19zZXR1cCh2b2lkKQotewotICAgIHUxNiB0OwotCi0gICAgb3V0dyggMHgwMDIzICsgUk9NQ1MqMiwgUEFHRV9JTyApOwotICAgIHQ9aW5iKCBQQUdFX0lPKzEgKTsKLQotICAgIHQ9KHQgJiAweGY5KSB8IDB4MDQ7Ci0KLSAgICBvdXR3KCAoKDB4MDAyMyArIFJPTUNTKjIpIHwgKHQgPDwgOCkpLCBQQUdFX0lPICk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbGFuXzEwNG5jX3BhZ2Uoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQotewotCXVuc2lnbmVkIGxvbmcgcGFnZSA9IG9mcyA+PiBXSU5ET1dfU0hJRlQ7Ci0gICAgICAgCi0JaWYoIHBhZ2UhPXBhZ2VfaW5fd2luZG93ICkgewotCQlpbnQgY21kMTsKLQkJaW50IGNtZDI7Ci0KLQkJY21kMT0ocGFnZSAmIDB4NzAwKSArIDB4MDgzMyArIFJPTUNTKjB4NDAwMDsKLQkJY21kMj0oKHBhZ2UgJiAweGZmKSA8PCA4KSArIDB4MDAzMjsKLQotCQlvdXR3KCBjbWQxLCBQQUdFX0lPICk7Ci0JCW91dHcoIGNtZDIsIFBBR0VfSU8gKTsKLQotCQlwYWdlX2luX3dpbmRvdyA9IHBhZ2U7Ci0JfQotfQotCi0KLXN0YXRpYyBtYXBfd29yZCBlbGFuXzEwNG5jX3JlYWQxNihzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBvZnMpCi17Ci0JbWFwX3dvcmQgcmV0OwotCXNwaW5fbG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQllbGFuXzEwNG5jX3BhZ2UobWFwLCBvZnMpOwotCXJldC54WzBdID0gcmVhZHcoaW9tYXBhZHIgKyAob2ZzICYgV0lORE9XX01BU0spKTsKLQlzcGluX3VubG9jaygmZWxhbl8xMDRuY19zcGluKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBlbGFuXzEwNG5jX2NvcHlfZnJvbShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgZnJvbSwgc3NpemVfdCBsZW4pCi17Ci0Jd2hpbGUgKGxlbikgewotCQl1bnNpZ25lZCBsb25nIHRoaXNsZW4gPSBsZW47Ci0JCWlmIChsZW4gPiAoV0lORE9XX0xFTkdUSCAtIChmcm9tICYgV0lORE9XX01BU0spKSkKLQkJCXRoaXNsZW4gPSBXSU5ET1dfTEVOR1RILShmcm9tICYgV0lORE9XX01BU0spOwotCQkKLQkJc3Bpbl9sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCQllbGFuXzEwNG5jX3BhZ2UobWFwLCBmcm9tKTsKLQkJbWVtY3B5X2Zyb21pbyh0bywgaW9tYXBhZHIgKyAoZnJvbSAmIFdJTkRPV19NQVNLKSwgdGhpc2xlbik7Ci0JCXNwaW5fdW5sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCQl0byArPSB0aGlzbGVuOwotCQlmcm9tICs9IHRoaXNsZW47Ci0JCWxlbiAtPSB0aGlzbGVuOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZWxhbl8xMDRuY193cml0ZTE2KHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBtYXBfd29yZCBkLCB1bnNpZ25lZCBsb25nIGFkcikKLXsKLQlzcGluX2xvY2soJmVsYW5fMTA0bmNfc3Bpbik7Ci0JZWxhbl8xMDRuY19wYWdlKG1hcCwgYWRyKTsKLQl3cml0ZXcoZC54WzBdLCBpb21hcGFkciArIChhZHIgJiBXSU5ET1dfTUFTSykpOwotCXNwaW5fdW5sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotfQotCi1zdGF0aWMgdm9pZCBlbGFuXzEwNG5jX2NvcHlfdG8oc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNzaXplX3QgbGVuKQotewkKLQl3aGlsZShsZW4pIHsKLQkJdW5zaWduZWQgbG9uZyB0aGlzbGVuID0gbGVuOwotCQlpZiAobGVuID4gKFdJTkRPV19MRU5HVEggLSAodG8gJiBXSU5ET1dfTUFTSykpKQotCQkJdGhpc2xlbiA9IFdJTkRPV19MRU5HVEgtKHRvICYgV0lORE9XX01BU0spOwotCQkKLQkJc3Bpbl9sb2NrKCZlbGFuXzEwNG5jX3NwaW4pOwotCQllbGFuXzEwNG5jX3BhZ2UobWFwLCB0byk7Ci0JCW1lbWNweV90b2lvKGlvbWFwYWRyICsgKHRvICYgV0lORE9XX01BU0spLCBmcm9tLCB0aGlzbGVuKTsKLQkJc3Bpbl91bmxvY2soJmVsYW5fMTA0bmNfc3Bpbik7Ci0JCXRvICs9IHRoaXNsZW47Ci0JCWZyb20gKz0gdGhpc2xlbjsKLQkJbGVuIC09IHRoaXNsZW47Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IG1hcF9pbmZvIGVsYW5fMTA0bmNfbWFwID0gewotCS5uYW1lID0gIkVMQU4tMTA0TkMgZmxhc2giLAotCS5waHlzID0gTk9fWElQLAotCS5zaXplID0gOCoxMDI0KjEwMjQsIC8qIHRoaXMgbXVzdCBiZSBzZXQgdG8gYSBtYXhpbXVtIHBvc3NpYmxlIGFtb3VudAotCQkJb2YgZmxhc2ggc28gdGhlIGNmaSBwcm9iZSByb3V0aW5lcyBmaW5kIGFsbAotCQkJdGhlIGNoaXBzICovCi0JLmJhbmt3aWR0aCA9IDIsCi0JLnJlYWQgPSBlbGFuXzEwNG5jX3JlYWQxNiwKLQkuY29weV9mcm9tID0gZWxhbl8xMDRuY19jb3B5X2Zyb20sCi0JLndyaXRlID0gZWxhbl8xMDRuY193cml0ZTE2LAotCS5jb3B5X3RvID0gZWxhbl8xMDRuY19jb3B5X3RvCi19OwotCi0vKiBNVEQgZGV2aWNlIGZvciBhbGwgb2YgdGhlIGZsYXNoLiAqLwotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqYWxsX210ZDsKLQotc3RhdGljIHZvaWQgY2xlYW51cF9lbGFuXzEwNG5jKHZvaWQpCi17Ci0JaWYoIGFsbF9tdGQgKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyggYWxsX210ZCApOwotCQltYXBfZGVzdHJveSggYWxsX210ZCApOwotCX0KLQotCWlvdW5tYXAoaW9tYXBhZHIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2VsYW5fMTA0bmModm9pZCkKLXsKLQkvKiBVcmchIFdlIHVzZSBJL08gcG9ydCAweDIyIHdpdGhvdXQgcmVxdWVzdF9yZWdpb24oKWluZyBpdCwKLQkgICBiZWNhdXNlIGl0J3MgYWxyZWFkeSBhbGxvY2F0ZWQgdG8gdGhlIFBJQy4gKi8KLQotICAJaW9tYXBhZHIgPSBpb3JlbWFwKFdJTkRPV19TVEFSVCwgV0lORE9XX0xFTkdUSCk7Ci0JaWYgKCFpb21hcGFkcikgewotCQlwcmludGsoIEtFUk5fRVJSIiVzOiBmYWlsZWQgdG8gaW9yZW1hcCBtZW1vcnkgcmVnaW9uXG4iLAotCQkJZWxhbl8xMDRuY19tYXAubmFtZSApOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlwcmludGsoIEtFUk5fSU5GTyIlczogSU86MHgleC0weCV4IE1FTToweCV4LTB4JXhcbiIsCi0JCWVsYW5fMTA0bmNfbWFwLm5hbWUsCi0JCVBBR0VfSU8sIFBBR0VfSU8rUEFHRV9JT19TSVpFLTEsCi0JCVdJTkRPV19TVEFSVCwgV0lORE9XX1NUQVJUK1dJTkRPV19MRU5HVEgtMSApOwotCi0JZWxhbl8xMDRuY19zZXR1cCgpOwotCi0JLyogUHJvYmUgZm9yIGNoaXAuICovCi0JYWxsX210ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgICZlbGFuXzEwNG5jX21hcCApOwotCWlmKCAhYWxsX210ZCApIHsKLQkJY2xlYW51cF9lbGFuXzEwNG5jKCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCQotCWFsbF9tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQkvKiBDcmVhdGUgTVREIGRldmljZXMgZm9yIGVhY2ggcGFydGl0aW9uLiAqLwotCWFkZF9tdGRfcGFydGl0aW9ucyggYWxsX210ZCwgcGFydGl0aW9uX2luZm8sIE5VTV9QQVJUSVRJT05TICk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9lbGFuXzEwNG5jKTsKLW1vZHVsZV9leGl0KGNsZWFudXBfZWxhbl8xMDRuYyk7Ci0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQXJjb20gQ29udHJvbCBTeXN0ZW1zIEx0ZC4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTVREIG1hcCBkcml2ZXIgZm9yIEFyY29tIENvbnRyb2wgU3lzdGVtcyBFTEFOLTEwNE5DIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2ljaHhyb20uYyBiL2RyaXZlcnMvbXRkL21hcHMvaWNoeHJvbS5jCmluZGV4IDI5ZDFjYzEuLmU1MDUyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaWNoeHJvbS5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaWNoeHJvbS5jCkBAIC0yLDcgKzIsNyBAQAogICogaWNoeHJvbS5jCiAgKgogICogTm9ybWFsIG1hcHBpbmdzIG9mIGNoaXBzIGluIHBoeXNpY2FsIG1lbW9yeQotICogJElkOiBpY2h4cm9tLmMsdiAxLjE2IDIwMDQvMTEvMjggMDk6NDA6MzkgZHdtdzIgRXhwICQKKyAqICRJZDogaWNoeHJvbS5jLHYgMS4xOCAyMDA1LzA3LzA3IDEwOjI2OjIwIGR3bXcyIEV4cCAkCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzM4LDkgKzMzOCw5IEBACiAJeyAwLCB9LAogfTsKIAorI2lmIDAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpY2h4cm9tX3BjaV90YmwpOwogCi0jaWYgMAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGljaHhyb21fZHJpdmVyID0gewogCS5uYW1lID0JCU1PRF9OQU1FLAogCS5pZF90YWJsZSA9CWljaHhyb21fcGNpX3RibCwKQEAgLTM2Niw3ICszNjYsNyBAQAogCX0KIAlyZXR1cm4gLUVOWElPOwogI2lmIDAKLQlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpY2h4cm9tX2RyaXZlcik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmljaHhyb21fZHJpdmVyKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL2l4cDIwMDAuYyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCmluZGV4IGM1YjVmNDQuLjNlOTRiNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogaXhwMjAwMC5jLHYgMS41IDIwMDQvMTEvMTYgMTc6MTU6NDggZHNheGVuYSBFeHAgJAorICogJElkOiBpeHAyMDAwLmMsdiAxLjYgMjAwNS8wMy8xOCAxNDowNzo0NiBnbGVpeG5lciBFeHAgJAogICoKICAqIGRyaXZlcnMvbXRkL21hcHMvaXhwMjAwMC5jCiAgKgpAQCAtMjE2LDExICsyMTYsNiBAQAogCQlnb3RvIEVycm9yOwogCX0KIAotCS8qCi0JICogU2V0dXAgcmVhZCBtb2RlIGZvciBGTEFTSAotCSAqLwotCSpJWFAyMDAwX1NMT1dQT1JUX0ZSTSA9IDE7Ci0KICNpZiBkZWZpbmVkKF9fQVJNRUJfXykKIAkvKgogCSAqIEVuYWJsZSBlcnJhdHVtIDQ0IHdvcmthcm91bmQgZm9yIE5QVXMgd2l0aCBicm9rZW4gc2xvd3BvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvbWFpbnN0b25lLWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL21haW5zdG9uZS1mbGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTkzZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9tYXBzL21haW5zdG9uZS1mbGFzaC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogJElkOiAgJAorICoKKyAqIE1hcCBkcml2ZXIgZm9yIHRoZSBNYWluc3RvbmUgZGV2ZWxvcGVyIHBsYXRmb3JtLgorICoKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ29weXJpZ2h0OgkoQykgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIAorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9tYWluc3RvbmUuaD4KKworCisjZGVmaW5lIFJPTV9BRERSCTB4MDAwMDAwMDAKKyNkZWZpbmUgRkxBU0hfQUREUgkweDA0MDAwMDAwCisKKyNkZWZpbmUgV0lORE9XX1NJWkUgCTB4MDQwMDAwMDAKKworc3RhdGljIHZvaWQgbWFpbnN0b25lX21hcF9pbnZhbF9jYWNoZShzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBmcm9tLAorCQkJCSAgICAgIHNzaXplX3QgbGVuKQoreworCWNvbnNpc3RlbnRfc3luYygoY2hhciAqKW1hcC0+Y2FjaGVkICsgZnJvbSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9pbmZvIG1haW5zdG9uZV9tYXBzWzJdID0geyB7CisJLnNpemUgPQkJV0lORE9XX1NJWkUsCisJLnBoeXMgPQkJUFhBX0NTMF9QSFlTLAorCS5pbnZhbF9jYWNoZSA9IAltYWluc3RvbmVfbWFwX2ludmFsX2NhY2hlLAorfSwgeworCS5zaXplID0JCVdJTkRPV19TSVpFLAorCS5waHlzID0JCVBYQV9DUzFfUEhZUywKKwkuaW52YWxfY2FjaGUgPSAJbWFpbnN0b25lX21hcF9pbnZhbF9jYWNoZSwKK30gfTsKKworc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIG1haW5zdG9uZV9wYXJ0aXRpb25zW10gPSB7CisJeworCQkubmFtZSA9CQkiQm9vdGxvYWRlciIsCisJCS5zaXplID0JCTB4MDAwNDAwMDAsCisJCS5vZmZzZXQgPQkwLAorCQkubWFza19mbGFncyA9CU1URF9XUklURUFCTEUgIC8qIGZvcmNlIHJlYWQtb25seSAqLworCX0seworCQkubmFtZSA9CQkiS2VybmVsIiwKKwkJLnNpemUgPQkJMHgwMDQwMDAwMCwKKwkJLm9mZnNldCA9CTB4MDAwNDAwMDAsCisJfSx7CisJCS5uYW1lID0JCSJGaWxlc3lzdGVtIiwKKwkJLnNpemUgPQkJTVREUEFSVF9TSVpfRlVMTCwKKwkJLm9mZnNldCA9CTB4MDA0NDAwMDAKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZHNbMl07CitzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gKnBhcnNlZF9wYXJ0c1syXTsKK3N0YXRpYyBpbnQgbnJfcGFyc2VkX3BhcnRzWzJdOworCitzdGF0aWMgY29uc3QgY2hhciAqcHJvYmVzW10gPSB7ICJSZWRCb290IiwgImNtZGxpbmVwYXJ0IiwgTlVMTCB9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21haW5zdG9uZSh2b2lkKQoreworCWludCBTVzcgPSAwOyAgLyogRklYTUU6IGdldCBmcm9tIFNDUiAoTXN0IGRvYyBzZWN0aW9uIDMuMi4xLjEpICovCisJaW50IHJldCA9IDAsIGk7CisKKwltYWluc3RvbmVfbWFwc1swXS5iYW5rd2lkdGggPSAoQk9PVF9ERUYgJiAxKSA/IDIgOiA0OworCW1haW5zdG9uZV9tYXBzWzFdLmJhbmt3aWR0aCA9IDQ7CisKKwkvKiBDb21wZW5zYXRlIGZvciBTVzcgd2hpY2ggc3dhcHMgdGhlIGZsYXNoIGJhbmtzICovCisJbWFpbnN0b25lX21hcHNbU1c3XS5uYW1lID0gInByb2Nlc3NvciBmbGFzaCI7CisJbWFpbnN0b25lX21hcHNbU1c3IF4gMV0ubmFtZSA9ICJtYWluIGJvYXJkIGZsYXNoIjsKKworCXByaW50ayhLRVJOX05PVElDRSAiTWFpbnN0b25lIGNvbmZpZ3VyZWQgdG8gYm9vdCBmcm9tICVzXG4iLAorCSAgICAgICBtYWluc3RvbmVfbWFwc1swXS5uYW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJbWFpbnN0b25lX21hcHNbaV0udmlydCA9IGlvcmVtYXAobWFpbnN0b25lX21hcHNbaV0ucGh5cywKKwkJCQkJCSBXSU5ET1dfU0laRSk7CisJCWlmICghbWFpbnN0b25lX21hcHNbaV0udmlydCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGlvcmVtYXAgJXNcbiIsIAorCQkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLm5hbWUpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCA9IAorCQkJaW9yZW1hcF9jYWNoZWQobWFpbnN0b25lX21hcHNbaV0ucGh5cywgV0lORE9XX1NJWkUpOworCQlpZiAoIW1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBpb3JlbWFwIGNhY2hlZCAlc1xuIiwKKwkJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5uYW1lKTsKKwkJc2ltcGxlX21hcF9pbml0KCZtYWluc3RvbmVfbWFwc1tpXSk7CisKKwkJcHJpbnRrKEtFUk5fTk9USUNFIAorCQkgICAgICAgIlByb2JpbmcgJXMgYXQgcGh5c2ljYWwgYWRkcmVzcyAweCUwOGx4IgorCQkgICAgICAgIiAoJWQtYml0IGJhbmt3aWR0aClcbiIsCisJCSAgICAgICBtYWluc3RvbmVfbWFwc1tpXS5uYW1lLCBtYWluc3RvbmVfbWFwc1tpXS5waHlzLCAKKwkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLmJhbmt3aWR0aCAqIDgpOworCisJCW15bXRkc1tpXSA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJm1haW5zdG9uZV9tYXBzW2ldKTsKKwkJCisJCWlmICghbXltdGRzW2ldKSB7CisJCQlpb3VubWFwKCh2b2lkICopbWFpbnN0b25lX21hcHNbaV0udmlydCk7CisJCQlpZiAobWFpbnN0b25lX21hcHNbaV0uY2FjaGVkKQorCQkJCWlvdW5tYXAobWFpbnN0b25lX21hcHNbaV0uY2FjaGVkKTsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FSU87CisJCQljb250aW51ZTsKKwkJfQorCQlteW10ZHNbaV0tPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwkJcmV0ID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMobXltdGRzW2ldLCBwcm9iZXMsCisJCQkJCSAgICZwYXJzZWRfcGFydHNbaV0sIDApOworCisJCWlmIChyZXQgPiAwKQorCQkJbnJfcGFyc2VkX3BhcnRzW2ldID0gcmV0OworCX0KKworCWlmICghbXltdGRzWzBdICYmICFteW10ZHNbMV0pCisJCXJldHVybiByZXQ7CisJCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoIW15bXRkc1tpXSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgaXMgYWJzZW50LiBTa2lwcGluZ1xuIiwgCisJCQkgICAgICAgbWFpbnN0b25lX21hcHNbaV0ubmFtZSk7CisJCX0gZWxzZSBpZiAobnJfcGFyc2VkX3BhcnRzW2ldKSB7CisJCQlhZGRfbXRkX3BhcnRpdGlvbnMobXltdGRzW2ldLCBwYXJzZWRfcGFydHNbaV0sIAorCQkJCQkgICBucl9wYXJzZWRfcGFydHNbaV0pOworCQl9IGVsc2UgaWYgKCFpKSB7CisJCQlwcmludGsoIlVzaW5nIHN0YXRpYyBwYXJ0aXRpb25zIG9uICVzXG4iLAorCQkJICAgICAgIG1haW5zdG9uZV9tYXBzW2ldLm5hbWUpOworCQkJYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkc1tpXSwgbWFpbnN0b25lX3BhcnRpdGlvbnMsIAorCQkJCQkgICBBUlJBWV9TSVpFKG1haW5zdG9uZV9wYXJ0aXRpb25zKSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIlJlZ2lzdGVyaW5nICVzIGFzIHdob2xlIGRldmljZVxuIiwgCisJCQkgICAgICAgbWFpbnN0b25lX21hcHNbaV0ubmFtZSk7CisJCQlhZGRfbXRkX2RldmljZShteW10ZHNbaV0pOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9tYWluc3RvbmUodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmICghbXltdGRzW2ldKQorCQkJY29udGludWU7CisKKwkJaWYgKG5yX3BhcnNlZF9wYXJ0c1tpXSB8fCAhaSkKKwkJCWRlbF9tdGRfcGFydGl0aW9ucyhteW10ZHNbaV0pOworCQllbHNlCisJCQlkZWxfbXRkX2RldmljZShteW10ZHNbaV0pOworCisJCW1hcF9kZXN0cm95KG15bXRkc1tpXSk7CisJCWlvdW5tYXAoKHZvaWQgKiltYWluc3RvbmVfbWFwc1tpXS52aXJ0KTsKKwkJaWYgKG1haW5zdG9uZV9tYXBzW2ldLmNhY2hlZCkKKwkJCWlvdW5tYXAobWFpbnN0b25lX21hcHNbaV0uY2FjaGVkKTsKKwkJa2ZyZWUocGFyc2VkX3BhcnRzW2ldKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWFpbnN0b25lKTsKK21vZHVsZV9leGl0KGNsZWFudXBfbWFpbnN0b25lKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTmljb2xhcyBQaXRyZSA8bmljb0BjYW0ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNVEQgbWFwIGRyaXZlciBmb3IgSW50ZWwgTWFpbnN0b25lIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL21hcF9mdW5jcy5jIGIvZHJpdmVycy9tdGQvbWFwcy9tYXBfZnVuY3MuYwppbmRleCAzOGY2YTdhLi45MTA1ZTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL21hcF9mdW5jcy5jCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvbWFwX2Z1bmNzLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBtYXBfZnVuY3MuYyx2IDEuOSAyMDA0LzA3LzEzIDIyOjMzOjE1IGR3bXcyIEV4cCAkCisgKiAkSWQ6IG1hcF9mdW5jcy5jLHYgMS4xMCAyMDA1LzA2LzA2IDIzOjA0OjM2IHRwb3lub3IgRXhwICQKICAqCiAgKiBPdXQtb2YtbGluZSBtYXAgSS9PIGZ1bmN0aW9ucyBmb3Igc2ltcGxlIG1hcHMgd2hlbiBDT05GSUdfQ09NUExFWF9NQVBQSU5HUwogICogaXMgZW5hYmxlZC4KQEAgLTksMjMgKzksMjQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQveGlwLmg+CiAKLXN0YXRpYyBtYXBfd29yZCBzaW1wbGVfbWFwX3JlYWQoc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgb2ZzKQorc3RhdGljIG1hcF93b3JkIF9feGlwcmFtIHNpbXBsZV9tYXBfcmVhZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBvZnMpCiB7CiAJcmV0dXJuIGlubGluZV9tYXBfcmVhZChtYXAsIG9mcyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNpbXBsZV9tYXBfd3JpdGUoc3RydWN0IG1hcF9pbmZvICptYXAsIGNvbnN0IG1hcF93b3JkIGRhdHVtLCB1bnNpZ25lZCBsb25nIG9mcykKK3N0YXRpYyB2b2lkIF9feGlwcmFtIHNpbXBsZV9tYXBfd3JpdGUoc3RydWN0IG1hcF9pbmZvICptYXAsIGNvbnN0IG1hcF93b3JkIGRhdHVtLCB1bnNpZ25lZCBsb25nIG9mcykKIHsKIAlpbmxpbmVfbWFwX3dyaXRlKG1hcCwgZGF0dW0sIG9mcyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNpbXBsZV9tYXBfY29weV9mcm9tKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB2b2lkICp0bywgdW5zaWduZWQgbG9uZyBmcm9tLCBzc2l6ZV90IGxlbikKK3N0YXRpYyB2b2lkIF9feGlwcmFtIHNpbXBsZV9tYXBfY29weV9mcm9tKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB2b2lkICp0bywgdW5zaWduZWQgbG9uZyBmcm9tLCBzc2l6ZV90IGxlbikKIHsKIAlpbmxpbmVfbWFwX2NvcHlfZnJvbShtYXAsIHRvLCBmcm9tLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCBzaW1wbGVfbWFwX2NvcHlfdG8oc3RydWN0IG1hcF9pbmZvICptYXAsIHVuc2lnbmVkIGxvbmcgdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNzaXplX3QgbGVuKQorc3RhdGljIHZvaWQgX194aXByYW0gc2ltcGxlX21hcF9jb3B5X3RvKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1bnNpZ25lZCBsb25nIHRvLCBjb25zdCB2b2lkICpmcm9tLCBzc2l6ZV90IGxlbikKIHsKIAlpbmxpbmVfbWFwX2NvcHlfdG8obWFwLCB0bywgZnJvbSwgbGVuKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYyBiL2RyaXZlcnMvbXRkL21hcHMvb21hcF9ub3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M3MTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9vbWFwX25vci5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogRmxhc2ggbWVtb3J5IHN1cHBvcnQgZm9yIHZhcmlvdXMgVEkgT01BUCBib2FyZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTm9raWEgQ29ycG9yYXRpb24gCisgKgorICoJQXNzZW1ibGVkIHVzaW5nIGRyaXZlciBjb2RlIGNvcHlyaWdodCB0aGUgY29tcGFuaWVzIGFib3ZlCisgKglhbmQgd3JpdHRlbiBieSBEYXZpZCBCcm93bmVsbCwgSmlhbiBaaGFuZyA8anpoYW5nQHRpLmNvbT4sCisgKiAJVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gYW5kIG90aGVycy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvdGMuaD4KKworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7IC8qICJSZWRCb290IiwgKi8gImNtZGxpbmVwYXJ0IiwgTlVMTCB9OworI2VuZGlmCisKK3N0cnVjdCBvbWFwZmxhc2hfaW5mbyB7CisJc3RydWN0IG10ZF9wYXJ0aXRpb24JKnBhcnRzOworCXN0cnVjdCBtdGRfaW5mbwkJKm10ZDsKKwlzdHJ1Y3QgbWFwX2luZm8JCW1hcDsKK307CisKK3N0YXRpYyB2b2lkIG9tYXBfc2V0X3ZwcChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgaW50IGVuYWJsZSkKK3sKKwlzdGF0aWMgaW50CWNvdW50OworCisJaWYgKGVuYWJsZSkgeworCQlpZiAoY291bnQrKyA9PSAwKQorCQkJT01BUF9FTUlGU19DT05GSUdfUkVHIHw9IE9NQVBfRU1JRlNfQ09ORklHX1dQOworCX0gZWxzZSB7CisJCWlmIChjb3VudCAmJiAoLS1jb3VudCA9PSAwKSkKKwkJCU9NQVBfRU1JRlNfQ09ORklHX1JFRyAmPSB+T01BUF9FTUlGU19DT05GSUdfV1A7CisJfQorfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBvbWFwZmxhc2hfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnI7CisJc3RydWN0IG9tYXBmbGFzaF9pbmZvICppbmZvOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZmxhc2hfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBkZXYtPnJlc291cmNlOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG9tYXBmbGFzaF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IG9tYXBmbGFzaF9pbmZvKSk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCAiZmxhc2giKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2ZyZWVfaW5mbzsKKwl9CisKKwlpbmZvLT5tYXAudmlydAkJPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHNpemUpOworCWlmICghaW5mby0+bWFwLnZpcnQpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKwlpbmZvLT5tYXAubmFtZQkJPSBwZGV2LT5kZXYuYnVzX2lkOworCWluZm8tPm1hcC5waHlzCQk9IHJlcy0+c3RhcnQ7CisJaW5mby0+bWFwLnNpemUJCT0gc2l6ZTsKKwlpbmZvLT5tYXAuYmFua3dpZHRoCT0gcGRhdGEtPndpZHRoOworCWluZm8tPm1hcC5zZXRfdnBwCT0gb21hcF9zZXRfdnBwOworCisJc2ltcGxlX21hcF9pbml0KCZpbmZvLT5tYXApOworCWluZm8tPm10ZCA9IGRvX21hcF9wcm9iZShwZGF0YS0+bWFwX25hbWUsICZpbmZvLT5tYXApOworCWlmICghaW5mby0+bXRkKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUworCWVyciA9IHBhcnNlX210ZF9wYXJ0aXRpb25zKGluZm8tPm10ZCwgcGFydF9wcm9iZXMsICZpbmZvLT5wYXJ0cywgMCk7CisJaWYgKGVyciA+IDApCisJCWFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIGluZm8tPnBhcnRzLCBlcnIpOworCWVsc2UgaWYgKGVyciA8IDAgJiYgcGRhdGEtPnBhcnRzKQorCQlhZGRfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CisJZWxzZQorI2VuZGlmCisJCWFkZF9tdGRfZGV2aWNlKGluZm8tPm10ZCk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgaW5mbyk7CisKKwlyZXR1cm4gMDsKKworb3V0X2lvdW5tYXA6CisJaW91bm1hcChpbmZvLT5tYXAudmlydCk7CitvdXRfcmVsZWFzZV9tZW1fcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplKTsKK291dF9mcmVlX2luZm86CisJa2ZyZWUoaW5mbyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBvbWFwZmxhc2hfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG9tYXBmbGFzaF9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIE5VTEwpOworCisJaWYgKGluZm8pIHsKKwkJaWYgKGluZm8tPnBhcnRzKSB7CisJCQlkZWxfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkKTsKKwkJCWtmcmVlKGluZm8tPnBhcnRzKTsKKwkJfSBlbHNlCisJCQlkZWxfbXRkX2RldmljZShpbmZvLT5tdGQpOworCQltYXBfZGVzdHJveShpbmZvLT5tdGQpOworCQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+bWFwLnBoeXMsIGluZm8tPm1hcC5zaXplKTsKKwkJaW91bm1hcCgodm9pZCBfX2lvbWVtICopIGluZm8tPm1hcC52aXJ0KTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciBvbWFwZmxhc2hfZHJpdmVyID0geworCS5uYW1lCT0gIm9tYXBmbGFzaCIsCisJLmJ1cwk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJPSBvbWFwZmxhc2hfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKG9tYXBmbGFzaF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb21hcGZsYXNoX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZvbWFwZmxhc2hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9tYXBmbGFzaF9leGl0KHZvaWQpCit7CisJZHJpdmVyX3VucmVnaXN0ZXIoJm9tYXBmbGFzaF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvbWFwZmxhc2hfaW5pdCk7Cittb2R1bGVfZXhpdChvbWFwZmxhc2hfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVREIE5PUiBtYXAgZHJpdmVyIGZvciBUSSBPTUFQIGJvYXJkcyIpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BiMTU1MC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wYjE1NTAtZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyNDcyNmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wYjE1NTAtZmxhc2guYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKgotICogRmxhc2ggbWVtb3J5IGFjY2VzcyBvbiBBbGNoZW15IFBiMTU1MCBib2FyZAotICogCi0gKiAkSWQ6IHBiMTU1MC1mbGFzaC5jLHYgMS42IDIwMDQvMTEvMDQgMTM6MjQ6MTUgZ2xlaXhuZXIgRXhwICQKLSAqCi0gKiAoQykgMjAwNCBFbWJlZGRlZCBFZGdlLCBMTEMsIGJhc2VkIG9uIHBiMTU1MC1mbGFzaC5jOgotICogKEMpIDIwMDMgUGV0ZSBQb3BvdiA8cHBvcG92QHBhY2JlbGwubmV0PgotICogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2F1MTAwMC5oPgotI2luY2x1ZGUgPGFzbS9wYjE1NTAuaD4KLQotI2lmZGVmIAlERUJVR19SVwotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZQlEQkcoeC4uLikJCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgd2luZG93X2FkZHI7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB3aW5kb3dfc2l6ZTsKLQotCi1zdGF0aWMgc3RydWN0IG1hcF9pbmZvIHBiMTU1MF9tYXAgPSB7Ci0JLm5hbWUgPQkiUGIxNTUwIGZsYXNoIiwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGZsYXNoX2Jhbmt3aWR0aCA9IDQ7Ci0KLS8qIAotICogU3VwcG9ydCBvbmx5IDY0TUIgTk9SIEZsYXNoIHBhcnRzCi0gKi8KLQotI2lmZGVmIFBCMTU1MF9CT1RIX0JBTktTCi0vKiBib3RoIGJhbmtzIHdpbGwgYmUgdXNlZC4gQ29tYmluZSB0aGUgZmlyc3QgYmFuayBhbmQgdGhlIGZpcnN0IAotICogcGFydCBvZiB0aGUgc2Vjb25kIGJhbmsgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBqZmZzL2pmZnMyCi0gKiBwYXJ0aXRpb24uCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDFDMDAgMDAwMCAxRkZGIEZGRkYgQ0UwIDY0TUIgQm9vdCBOT1IgRmxhc2gKLQkgKiAxODAwIDAwMDAgMUJGRiBGRkZGIENFMCA2NE1CIFBhcmFtIE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAgICgweDFGQzAwMDAwIC0gMHgxODAwMDAwMCksCi0gICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAweDAxMDAwMDAsCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lID0gInJhdyBrZXJuZWwiLAotCQkuc2l6ZSA9ICgweDMwMDAwMCAtIDB4NDAwMDApLCAvKiBsYXN0IDI1NktCIGlzIHlhbW9uIGVudiAqLwotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2VsaWYgZGVmaW5lZChQQjE1NTBfQk9PVF9PTkxZKQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBiMTU1MF9wYXJ0aXRpb25zW10gPSB7Ci0JLyogYXNzdW1lIGJvb3RbMjowXTpzd2FwIGlzICcwMDAwJyBvciAnMTAwMCcsIHdoaWNoIHRyYW5zbGF0ZXMgdG86Ci0JICogMUMwMCAwMDAwIDFGRkYgRkZGRiBDRTAgNjRNQiBCb290IE5PUiBGbGFzaAotCSAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgPSAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAgIDB4MDNjMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJ5YW1vbiIsCi0gICAgICAgICAgICAgICAgLnNpemUgPSAweDAxMDAwMDAsCi0JCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lID0gInJhdyBrZXJuZWwiLAotCQkuc2l6ZSA9ICgweDMwMDAwMC0weDQwMDAwKSwgLyogbGFzdCAyNTZLQiBpcyB5YW1vbiBlbnYgKi8KLQkJLm9mZnNldCA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLSAgICAgICAgfQotfTsKLSNlbGlmIGRlZmluZWQoUEIxNTUwX1VTRVJfT05MWSkKLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYjE1NTBfcGFydGl0aW9uc1tdID0gewotCS8qIGFzc3VtZSBib290WzI6MF06c3dhcCBpcyAnMDAwMCcgb3IgJzEwMDAnLCB3aGljaCB0cmFuc2xhdGVzIHRvOgotCSAqIDE4MDAgMDAwMCAxQkZGIEZGRkYgQ0UwIDY0TUIgUGFyYW0gTk9SIEZsYXNoCi0JICovCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJVc2VyIEZTIiwKLSAgICAgICAgICAgICAgICAuc2l6ZSA9ICgweDQwMDAwMDAgLSAweDIwMDAwMCksIC8qIHJlc2VydmUgMk1CIGZvciByYXcga2VybmVsICovCi0gICAgICAgICAgICAgICAgLm9mZnNldCA9IDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSA9ICJyYXcga2VybmVsIiwKLQkJLnNpemUgPSBNVERQQVJUX1NJWl9GVUxMLAotCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAotICAgICAgICB9Ci19OwotI2Vsc2UKLSNlcnJvciBNVERfUEIxNTUwIGRlZmluZSBjb21ibyBlcnJvciAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0jZW5kaWYKLQotI2RlZmluZSBOQl9PRih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCi0KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKm15bXRkOwotCi0vKgotICogUHJvYmUgdGhlIGZsYXNoIGRlbnNpdHkgYW5kIHNldHVwIHdpbmRvdyBhZGRyZXNzIGFuZCBzaXplCi0gKiBiYXNlZCBvbiB1c2VyIENPTkZJRyBvcHRpb25zLiBUaGVyZSBhcmUgdGltZXMgd2hlbiB3ZSBkb24ndAotICogd2FudCB0aGUgTVREIGRyaXZlciB0byBiZSBwcm9iaW5nIHRoZSBib290IG9yIHVzZXIgZmxhc2gsCi0gKiBzbyBoYXZpbmcgdGhlIG9wdGlvbiB0byBlbmFibGUgb25seSBvbmUgYmFuayBpcyBpbXBvcnRhbnQuCi0gKi8KLWludCBzZXR1cF9mbGFzaF9wYXJhbXModm9pZCkKLXsKLQl1MTYgYm9vdF9zd2FwYm9vdDsKLQlib290X3N3YXBib290ID0gKGF1X3JlYWRsKE1FTV9TVFNUQVQpICYgKDB4Nzw8MSkpIHwgCi0JCSgoYmNzci0+c3RhdHVzID4+IDYpICAmIDB4MSk7Ci0JcHJpbnRrKCJQYjE1NTAgTVREOiBib290OnN3YXAgJWRcbiIsIGJvb3Rfc3dhcGJvb3QpOwotCi0Jc3dpdGNoIChib290X3N3YXBib290KSB7Ci0JCWNhc2UgMDogLyogNTEyTWJpdCBkZXZpY2VzLCBib3RoIGVuYWJsZWQgKi8KLQkJY2FzZSAxOiAKLQkJY2FzZSA4OgotCQljYXNlIDk6IAotI2lmIGRlZmluZWQoUEIxNTUwX0JPVEhfQkFOS1MpCi0JCQl3aW5kb3dfYWRkciA9IDB4MTgwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4ODAwMDAwMDsgCi0jZWxpZiBkZWZpbmVkKFBCMTU1MF9CT09UX09OTFkpCi0JCQl3aW5kb3dfYWRkciA9IDB4MUMwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4NDAwMDAwMDsgCi0jZWxzZSAvKiBVU0VSIE9OTFkgKi8KLQkJCXdpbmRvd19hZGRyID0gMHgxRTAwMDAwMDsKLQkJCXdpbmRvd19zaXplID0gMHg0MDAwMDAwOyAKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCWNhc2UgMHhDOgotCQljYXNlIDB4RDoKLQkJY2FzZSAweEU6Ci0JCWNhc2UgMHhGOiAKLQkJCS8qIDY0IE1CIEJvb3QgTk9SIEZsYXNoIGlzIGRpc2FibGVkICovCi0JCQkvKiBhbmQgdGhlIHN0YXJ0IGFkZHJlc3MgaXMgbW92ZWQgdG8gMHgwQzAwMDAwICovCi0JCQl3aW5kb3dfYWRkciA9IDB4MEMwMDAwMDA7Ci0JCQl3aW5kb3dfc2l6ZSA9IDB4NDAwMDAwMDsgCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoIlBiMTU1MCBNVEQ6IHVuc3VwcG9ydGVkIGJvb3Q6c3dhcCBzZXR0aW5nXG4iKTsKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IF9faW5pdCBwYjE1NTBfbXRkX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IG5iX3BhcnRzID0gMDsKLQkKLQkvKiBEZWZhdWx0IGZsYXNoIGJhbmt3aWR0aCAqLwotCXBiMTU1MF9tYXAuYmFua3dpZHRoID0gZmxhc2hfYmFua3dpZHRoOwotCi0JaWYgKHNldHVwX2ZsYXNoX3BhcmFtcygpKSAKLQkJcmV0dXJuIC1FTlhJTzsKLQotCS8qCi0JICogU3RhdGljIHBhcnRpdGlvbiBkZWZpbml0aW9uIHNlbGVjdGlvbgotCSAqLwotCXBhcnRzID0gcGIxNTUwX3BhcnRpdGlvbnM7Ci0JbmJfcGFydHMgPSBOQl9PRihwYjE1NTBfcGFydGl0aW9ucyk7Ci0JcGIxNTUwX21hcC5zaXplID0gd2luZG93X3NpemU7Ci0KLQkvKgotCSAqIE5vdyBsZXQncyBwcm9iZSBmb3IgdGhlIGFjdHVhbCBmbGFzaC4gIERvIGl0IGhlcmUgc2luY2UKLQkgKiBzcGVjaWZpYyBtYWNoaW5lIHNldHRpbmdzIG1pZ2h0IGhhdmUgYmVlbiBzZXQgYWJvdmUuCi0JICovCi0JcHJpbnRrKEtFUk5fTk9USUNFICJQYjE1NTAgZmxhc2g6IHByb2JpbmcgJWQtYml0IGZsYXNoIGJ1c1xuIiwgCi0JCQlwYjE1NTBfbWFwLmJhbmt3aWR0aCo4KTsKLQlwYjE1NTBfbWFwLnZpcnQgPSBpb3JlbWFwKHdpbmRvd19hZGRyLCB3aW5kb3dfc2l6ZSk7Ci0JbXltdGQgPSBkb19tYXBfcHJvYmUoImNmaV9wcm9iZSIsICZwYjE1NTBfbWFwKTsKLQlpZiAoIW15bXRkKSByZXR1cm4gLUVOWElPOwotCW15bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JYWRkX210ZF9wYXJ0aXRpb25zKG15bXRkLCBwYXJ0cywgbmJfcGFydHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGIxNTUwX210ZF9jbGVhbnVwKHZvaWQpCi17Ci0JaWYgKG15bXRkKSB7Ci0JCWRlbF9tdGRfcGFydGl0aW9ucyhteW10ZCk7Ci0JCW1hcF9kZXN0cm95KG15bXRkKTsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KHBiMTU1MF9tdGRfaW5pdCk7Ci1tb2R1bGVfZXhpdChwYjE1NTBfbXRkX2NsZWFudXApOwotCi1NT0RVTEVfQVVUSE9SKCJFbWJlZGRlZCBFZGdlLCBMTEMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUGIxNTUwIG10ZCBtYXAgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tYXBzL3BiMXh4eC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9wYjF4eHgtZmxhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNzMxNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3BiMXh4eC1mbGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qCi0gKiBGbGFzaCBtZW1vcnkgYWNjZXNzIG9uIEFsY2hlbXkgUGIxeHh4IGJvYXJkcwotICogCi0gKiAoQykgMjAwMSBQZXRlIFBvcG92IDxwcG9wb3ZAbXZpc3RhLmNvbT4KLSAqIAotICogJElkOiBwYjF4eHgtZmxhc2guYyx2IDEuMTQgMjAwNC8xMS8wNCAxMzoyNDoxNSBnbGVpeG5lciBFeHAgJAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaWZkZWYgCURFQlVHX1JXCi0jZGVmaW5lCURCRyh4Li4uKQlwcmludGsoeCkKLSNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQkKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01JUFNfUEIxMDAwCi0KLSNkZWZpbmUgV0lORE9XX0FERFIgMHgxRjgwMDAwMAotI2RlZmluZSBXSU5ET1dfU0laRSAweDgwMDAwMAotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGIxeHh4X3BhcnRpdGlvbnNbXSA9IHsKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgInlhbW9uIGVudiIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgwMDAyMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAwLAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgIE1URF9XUklURUFCTEV9LAotCXsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgwMDNlMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDIwMDAwLH0sCi0JewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgICJib290IGNvZGUiLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MTAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4NDAwMDAwLAotICAgICAgICAgICAgICAgIC5tYXNrX2ZsYWdzICAgPSAgIE1URF9XUklURUFCTEV9LAotCXsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAicmF3L2tlcm5lbCIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgzMDAwMDAsCi0gICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9ICAgMHg1MDAwMDB9Ci19OwotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NSVBTX1BCMTUwMCkgfHwgZGVmaW5lZChDT05GSUdfTUlQU19QQjExMDApCi0KLSNpZiBkZWZpbmVkKENPTkZJR19NVERfUEIxNTAwX0JPT1QpICYmIGRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfVVNFUikKLS8qIGJvdGggMzJNQiBiYW5rcyB3aWxsIGJlIHVzZWQuIENvbWJpbmUgdGhlIGZpcnN0IDMyTUIgYmFuayBhbmQgdGhlCi0gKiBmaXJzdCAyOE1CIG9mIHRoZSBzZWNvbmQgYmFuayB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGpmZnMvamZmczIKLSAqIHBhcnRpdGlvbi4KLSAqLwotI2RlZmluZSBXSU5ET1dfQUREUiAweDFDMDAwMDAwCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4NDAwMDAwMAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBiMXh4eF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgzYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDEwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDNjMDAwMDAsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgICA9ICAgTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAicmF3IGtlcm5lbCIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgwMmMwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4M2QwMDAwMAotICAgICAgICB9Ci19OwotI2VsaWYgZGVmaW5lZChDT05GSUdfTVREX1BCMTUwMF9CT09UKSAmJiAhZGVmaW5lZChDT05GSUdfTVREX1BCMTUwMF9VU0VSKQotI2RlZmluZSBXSU5ET1dfQUREUiAweDFFMDAwMDAwCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4MjAwMDAwMAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBiMXh4eF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgxYzAwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4MDAwMDAwMAotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAieWFtb24iLAotICAgICAgICAgICAgICAgIC5zaXplICAgICAgICAgPSAgIDB4MDEwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAweDFjMDAwMDAsCi0gICAgICAgICAgICAgICAgLm1hc2tfZmxhZ3MgICA9ICAgTVREX1dSSVRFQUJMRQotICAgICAgICB9LHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAicmF3IGtlcm5lbCIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgMHgwMmMwMDAwLAotICAgICAgICAgICAgICAgIC5vZmZzZXQgICAgICAgPSAgIDB4MWQwMDAwMAotICAgICAgICB9Ci19OwotI2VsaWYgIWRlZmluZWQoQ09ORklHX01URF9QQjE1MDBfQk9PVCkgJiYgZGVmaW5lZChDT05GSUdfTVREX1BCMTUwMF9VU0VSKQotI2RlZmluZSBXSU5ET1dfQUREUiAweDFDMDAwMDAwCi0jZGVmaW5lIFdJTkRPV19TSVpFIDB4MjAwMDAwMAotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBiMXh4eF9wYXJ0aXRpb25zW10gPSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAubmFtZSAgICAgICAgID0gICAiVXNlciBGUyIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgIDB4MWUwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAgMHgwMDAwMDAwCi0gICAgICAgIH0sewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSAgICAicmF3IGtlcm5lbCIsCi0gICAgICAgICAgICAgICAgLnNpemUgICAgICAgICA9ICAgIDB4MDIwMDAwMCwKLSAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gICAgMHgxZTAwMDAwLAotICAgICAgICB9Ci19OwotI2Vsc2UKLSNlcnJvciBNVERfUEIxNTAwIGRlZmluZSBjb21ibyBlcnJvciAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0jZW5kaWYKLSNlbHNlCi0jZXJyb3IgVW5zdXBwb3J0ZWQgYm9hcmQKLSNlbmRpZgotCi0jZGVmaW5lIE5BTUUgICAgIAkiUGIxeDAwIExpbnV4IEZsYXNoIgotI2RlZmluZSBQQUREUiAgICAJV0lORE9XX0FERFIKLSNkZWZpbmUgQlVTV0lEVEgJNAotI2RlZmluZSBTSVpFCQlXSU5ET1dfU0laRQotI2RlZmluZSBQQVJUSVRJT05TCTQKLQotc3RhdGljIHN0cnVjdCBtYXBfaW5mbyBwYjF4eHhfbXRkX21hcCA9IHsKLQkubmFtZQkJPSBOQU1FLAotCS5zaXplCQk9IFNJWkUsCi0JLmJhbmt3aWR0aAk9IEJVU1dJRFRILAotCS5waHlzCQk9IFBBRERSLAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfaW5mbyAqcGIxeHh4X210ZDsKLQotaW50IF9faW5pdCBwYjF4eHhfbXRkX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqcGFydHM7Ci0JaW50IG5iX3BhcnRzID0gMDsKLQljaGFyICpwYXJ0X3R5cGU7Ci0JCi0JLyoKLQkgKiBTdGF0aWMgcGFydGl0aW9uIGRlZmluaXRpb24gc2VsZWN0aW9uCi0JICovCi0JcGFydF90eXBlID0gInN0YXRpYyI7Ci0JcGFydHMgPSBwYjF4eHhfcGFydGl0aW9uczsKLQluYl9wYXJ0cyA9IEFSUkFZX1NJWkUocGIxeHh4X3BhcnRpdGlvbnMpOwotCi0JLyoKLQkgKiBOb3cgbGV0J3MgcHJvYmUgZm9yIHRoZSBhY3R1YWwgZmxhc2guICBEbyBpdCBoZXJlIHNpbmNlCi0JICogc3BlY2lmaWMgbWFjaGluZSBzZXR0aW5ncyBtaWdodCBoYXZlIGJlZW4gc2V0IGFib3ZlLgotCSAqLwotCXByaW50ayhLRVJOX05PVElDRSAiUGIxeHh4IGZsYXNoOiBwcm9iaW5nICVkLWJpdCBmbGFzaCBidXNcbiIsIAotCQkJQlVTV0lEVEgqOCk7Ci0JcGIxeHh4X210ZF9tYXAudmlydCA9IGlvcmVtYXAoV0lORE9XX0FERFIsIFdJTkRPV19TSVpFKTsKLQotCXNpbXBsZV9tYXBfaW5pdCgmcGIxeHh4X210ZF9tYXApOwotCi0JcGIxeHh4X210ZCA9IGRvX21hcF9wcm9iZSgiY2ZpX3Byb2JlIiwgJnBiMXh4eF9tdGRfbWFwKTsKLQlpZiAoIXBiMXh4eF9tdGQpIHJldHVybiAtRU5YSU87Ci0JcGIxeHh4X210ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQotCWFkZF9tdGRfcGFydGl0aW9ucyhwYjF4eHhfbXRkLCBwYXJ0cywgbmJfcGFydHMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGIxeHh4X210ZF9jbGVhbnVwKHZvaWQpCi17Ci0JaWYgKHBiMXh4eF9tdGQpIHsKLQkJZGVsX210ZF9wYXJ0aXRpb25zKHBiMXh4eF9tdGQpOwotCQltYXBfZGVzdHJveShwYjF4eHhfbXRkKTsKLQkJaW91bm1hcCgodm9pZCAqKSBwYjF4eHhfbXRkX21hcC52aXJ0KTsKLQl9Ci19Ci0KLW1vZHVsZV9pbml0KHBiMXh4eF9tdGRfaW5pdCk7Ci1tb2R1bGVfZXhpdChwYjF4eHhfbXRkX2NsZWFudXApOwotCi1NT0RVTEVfQVVUSE9SKCJQZXRlIFBvcG92Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBiMXh4eCBDRkkgbWFwIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wY2kuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGNpLmMKaW5kZXggMDhiNjBiZC4uMThkYmQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wY2kuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BjaS5jCkBAIC03LDcgKzcsNyBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICoKLSAqICAkSWQ6IHBjaS5jLHYgMS45IDIwMDQvMTEvMjggMDk6NDA6NDAgZHdtdzIgRXhwICQKKyAqICAkSWQ6IHBjaS5jLHYgMS4xMCAyMDA1LzAzLzE4IDE0OjA0OjM1IGdsZWl4bmVyIEV4cCAkCiAgKiAKICAqIEdlbmVyaWMgUENJIG1lbW9yeSBtYXAgZHJpdmVyLiAgV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGJvYXJkczoKICAqICAtIEludGVsIElRODAzMTAgQVRVLgpAQCAtMzcwLDcgKzM3MCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG10ZF9wY2lfbWFwc19pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmbXRkX3BjaV9kcml2ZXIpOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZtdGRfcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtdGRfcGNpX21hcHNfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYyBiL2RyaXZlcnMvbXRkL21hcHMvcGNtY2lhbXRkLmMKaW5kZXggZTM3YjRjMS4uZmY3YzUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9wY21jaWFtdGQuYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BjbWNpYW10ZC5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC04MDAsMTEgKzc5OSw2IEBACiAKIAkvKiBSZWdpc3RlciB3aXRoIENhcmQgU2VydmljZXMgKi8KIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZwY21jaWFtdGRfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJREVCVUcoMiwgIkNhbGxpbmcgUmVnaXN0ZXJDbGllbnQiKTsKQEAgLTgxOCwxNCArODEyLDQyIEBACiAJcmV0dXJuIGxpbms7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBwY21jaWFtdGRfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9GVU5DX0lEKDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiSU8gREFUQSIsICJQQ1MtMk0iLCAiMk1CIFNSQU0iLCAweDU0N2U2NmRjLCAweDFmZWQzNmNkLCAweDM2ZWFkZDIxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSUJNIiwgIjJNQiBTUkFNIiwgMHhiNTY5YTZlNSwgMHgzNmVhZGQyMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSIsICI0TUIgRkxBU0giLCAweGI1NjlhNmU1LCAweDhiYzU0ZDJhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSUJNIiwgIjhNQiBGTEFTSCIsIDB4YjU2OWE2ZTUsIDB4NmRmMWJlM2UpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJbnRlbCIsICJTMkUyMFNXIiwgMHg4MTZjYzgxNSwgMHhkMTRjOWRjZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkludGVsIiwgIlMyRTggU1ciLCAweDgxNmNjODE1LCAweGEyZDdkZWRiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiaW50ZWwiLCAiU0VSSUVTMi0wMiAiLCAweDQwYWRlNzExLCAweDE0NWNlYTVjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiaW50ZWwiLCAiU0VSSUVTMi0wNCAiLCAweDQwYWRlNzExLCAweDQyMDY0ZGRhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiaW50ZWwiLCAiU0VSSUVTMi0yMCAiLCAweDQwYWRlNzExLCAweDI1ZWU1Y2IwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiaW50ZWwiLCAiVkFMVUUgU0VSSUVTIDEwMCAiLCAweDQwYWRlNzExLCAweGRmODUwNmQ4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS0lOR01BWCBURUNITk9MT0dZIElOQy4iLCAiU1JBTSAyNTZLIEJ5dGVzIiwgMHg1NGQwYzY5YywgMHhhZDEyYzI5YyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1heHRvciIsICJNQVhGTCBNb2JpbGVNYXggRmxhc2ggTWVtb3J5IENhcmQiLCAweGI2ODk2OGM4LCAweDJkZmI0N2IwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU0VJS08gRVBTT04iLCAiV1dCMTAxRU4yMCIsIDB4Zjk4NzZiYWYsIDB4YWQwYjIwN2IpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTRUlLTyBFUFNPTiIsICJXV0I1MTNFTjIwIiwgMHhmOTg3NmJhZiwgMHhlOGQ4ODRhZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlN0YXJmaXNoLCBJbmMuIiwgIlJFWC0zMDAwIiwgMHgwNWRkY2E0NywgMHhlN2Q2N2JjYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlN0YXJmaXNoLCBJbmMuIiwgIlJFWC00MTAwIiwgMHgwNWRkY2E0NywgMHg3YmMzMjk0NCksCisJLyogdGhlIGZvbGxvd2luZyB3YXMgY29tbWVudGVkIG91dCBpbiBwY21jaWEtY3MtMy4yLjcgKi8KKwkvKiBQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUkFUT0MgU3lzdGVtcyxJbmMuIiwgIlNtYXJ0TWVkaWEgQURBUFRFUiBQQyBDYXJkIiwgMHhmNGEyZmVmZSwgMHg1ODg1YjJhZSksICovCisjaWZkZWYgQ09ORklHX01URF9QQ01DSUFfQU5PTllNT1VTCisJeyAubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX0FOT05ZTU9VUywgfSwKKyNlbmRpZgorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBwY21jaWFtdGRfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHBjbWNpYW10ZF9kcml2ZXIgPSB7CiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gInBjbWNpYW10ZCIKIAl9LAogCS5hdHRhY2gJCT0gcGNtY2lhbXRkX2F0dGFjaCwKKwkuZXZlbnQJCT0gcGNtY2lhbXRkX2V2ZW50LAogCS5kZXRhY2gJCT0gcGNtY2lhbXRkX2RldGFjaCwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkX3RhYmxlCT0gcGNtY2lhbXRkX2lkcywKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOGIwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qIGRyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYworICoKKyAqIChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEdlbmVyaWMgcGxhdGZyb20gZGV2aWNlIGJhc2VkIFJBTSBtYXAKKyAqCisgKiAkSWQ6IHBsYXQtcmFtLmMsdiAxLjMgMjAwNS8wMy8xOSAyMjo0MToyNyBnbGVpeG5lciBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGxhdC1yYW0uaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBwcml2YXRlIHN0cnVjdHVyZSBmb3IgZWFjaCBtdGQgcGxhdGZvcm0gcmFtIGRldmljZSBjcmVhdGVkICovCisKK3N0cnVjdCBwbGF0cmFtX2luZm8geworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IG10ZF9pbmZvCQkqbXRkOworCXN0cnVjdCBtYXBfaW5mbwkJIG1hcDsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSphcmVhOworCXN0cnVjdCBwbGF0ZGF0YV9tdGRfcmFtCSpwZGF0YTsKK307CisKKy8qIHRvX3BsYXRyYW1faW5mbygpCisgKgorICogZGV2aWNlIHByaXZhdGUgZGF0YSB0byBzdHJ1Y3QgcGxhdHJhbV9pbmZvIGNvbnZlcnNpb24KKyovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBsYXRyYW1faW5mbyAqdG9fcGxhdHJhbV9pbmZvKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKHN0cnVjdCBwbGF0cmFtX2luZm8gKilkZXZfZ2V0X2RydmRhdGEoZGV2KTsKK30KKworLyogcGxhdHJhbV9zZXRydworICoKKyAqIGNhbGwgdGhlIHBsYXRmb3JtIGRldmljZSdzIHNldCBydy9ybyBjb250cm9sCisgKgorICogdG8gPSAwID0+IHJlYWQtb25seQorICogICAgPSAxID0+IHJlYWQtd3JpdGUKKyovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbGF0cmFtX3NldHJ3KHN0cnVjdCBwbGF0cmFtX2luZm8gKmluZm8sIGludCB0bykKK3sKKwlpZiAoaW5mby0+cGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGluZm8tPnBkYXRhLT5zZXRfcncgIT0gTlVMTCkKKwkJKGluZm8tPnBkYXRhLT5zZXRfcncpKGluZm8tPmRldiwgdG8pOworfQorCisvKiBwbGF0cmFtX3JlbW92ZQorICoKKyAqIGNhbGxlZCB0byByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBkcml2ZXIncyBjb250cm9sCisqLworCitzdGF0aWMgaW50IHBsYXRyYW1fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdHJhbV9pbmZvICppbmZvID0gdG9fcGxhdHJhbV9pbmZvKGRldik7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCWRldl9kYmcoZGV2LCAicmVtb3ZpbmcgZGV2aWNlXG4iKTsKKworCWlmIChpbmZvID09IE5VTEwpIAorCQlyZXR1cm4gMDsKKworCWlmIChpbmZvLT5tdGQpIHsKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwkJaWYgKGluZm8tPnBhcnRpdGlvbnMpIHsKKwkJCWRlbF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQpOworCQkJa2ZyZWUoaW5mby0+cGFydGl0aW9ucyk7CisJCX0KKyNlbmRpZgorCQlkZWxfbXRkX2RldmljZShpbmZvLT5tdGQpOworCQltYXBfZGVzdHJveShpbmZvLT5tdGQpOworCX0KKworCS8qIGVuc3VyZSByYW0gaXMgbGVmdCByZWFkLW9ubHkgKi8KKworCXBsYXRyYW1fc2V0cncoaW5mbywgUExBVFJBTV9STyk7CisKKwkvKiByZWxlYXNlIHJlc291cmNlcyAqLworCisJaWYgKGluZm8tPmFyZWEpIHsKKwkJcmVsZWFzZV9yZXNvdXJjZShpbmZvLT5hcmVhKTsKKwkJa2ZyZWUoaW5mby0+YXJlYSk7CisJfQorCisJaWYgKGluZm8tPm1hcC52aXJ0ICE9IE5VTEwpCisJCWlvdW5tYXAoaW5mby0+bWFwLnZpcnQpOworCQorCWtmcmVlKGluZm8pOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHBsYXRyYW1fcHJvYmUKKyAqCisgKiBjYWxsZWQgZnJvbSBkZXZpY2UgZHJpdmUgc3lzdGVtIHdoZW4gYSBkZXZpY2UgbWF0Y2hpbmcgb3VyCisgKiBkcml2ZXIgaXMgZm91bmQuCisqLworCitzdGF0aWMgaW50IHBsYXRyYW1fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHBsYXRkYXRhX210ZF9yYW0JKnBkYXRhOworCXN0cnVjdCBwbGF0cmFtX2luZm8gKmluZm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVyciA9IDA7CisKKwlkZXZfZGJnKGRldiwgInByb2JlIGVudGVyZWRcbiIpOworCQorCWlmIChkZXYtPnBsYXRmb3JtX2RhdGEgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGV4aXRfZXJyb3I7CisJfQorCisJcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibm8gbWVtb3J5IGZvciBmbGFzaCBpbmZvXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2Vycm9yOworCX0KKworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKKworCWluZm8tPmRldiA9IGRldjsKKwlpbmZvLT5wZGF0YSA9IHBkYXRhOworCisJLyogZ2V0IHRoZSByZXNvdXJjZSBmb3IgdGhlIG1lbW9yeSBtYXBwaW5nICovCisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGQsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm5vIG1lbW9yeSByZXNvdXJjZSBzcGVjaWZpZWRcbiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGV4aXRfZnJlZTsKKwl9CisKKwlkZXZfZGJnKGRldiwgImdvdCBwbGF0Zm9ybSByZXNvdXJjZSAlcCAoMHglbHgpXG4iLCByZXMsIHJlcy0+c3RhcnQpOworCisJLyogc2V0dXAgbWFwIHBhcmFtZXRlcnMgKi8KKworCWluZm8tPm1hcC5waHlzID0gcmVzLT5zdGFydDsKKwlpbmZvLT5tYXAuc2l6ZSA9IChyZXMtPmVuZCAtIHJlcy0+c3RhcnQpICsgMTsKKwlpbmZvLT5tYXAubmFtZSA9IHBkYXRhLT5tYXBuYW1lICE9IE5VTEwgPyBwZGF0YS0+bWFwbmFtZSA6IHBkLT5uYW1lOworCWluZm8tPm1hcC5iYW5rd2lkdGggPSBwZGF0YS0+YmFua3dpZHRoOworCisJLyogcmVnaXN0ZXIgb3VyIHVzYWdlIG9mIHRoZSBtZW1vcnkgYXJlYSAqLworCisJaW5mby0+YXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBpbmZvLT5tYXAuc2l6ZSwgcGQtPm5hbWUpOworCWlmIChpbmZvLT5hcmVhID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJLyogcmVtYXAgdGhlIG1lbW9yeSBhcmVhICovCisKKwlpbmZvLT5tYXAudmlydCA9IGlvcmVtYXAocmVzLT5zdGFydCwgaW5mby0+bWFwLnNpemUpOworCWRldl9kYmcoZGV2LCAidmlydCAlcCwgJWx1IGJ5dGVzXG4iLCBpbmZvLT5tYXAudmlydCwgaW5mby0+bWFwLnNpemUpOworCisJaWYgKGluZm8tPm1hcC52aXJ0ID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW9yZW1hcCgpIHJlZ2lvblxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCXNpbXBsZV9tYXBfaW5pdCgmaW5mby0+bWFwKTsKKworCWRldl9kYmcoZGV2LCAiaW5pdGlhbGlzZWQgbWFwLCBwcm9iaW5nIGZvciBtdGRcbiIpOworCisJLyogcHJvYmUgZm9yIHRoZSByaWdodCBtdGQgbWFwIGRyaXZlciAqLworCisJaW5mby0+bXRkID0gZG9fbWFwX3Byb2JlKCJtYXBfcmFtIiAsICZpbmZvLT5tYXApOworCWlmIChpbmZvLT5tdGQgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBwcm9iZSBmb3IgbWFwX3JhbVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCWluZm8tPm10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXBsYXRyYW1fc2V0cncoaW5mbywgUExBVFJBTV9SVyk7CisKKwkvKiBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcGFydGl0aW9ucywgb3Igd2V0aGVyCisJICogdG8gYWRkIHRoaXMgZGV2aWNlIHdob2xlICovCisKKyNpZmRlZiBDT05GSUdfTVREX1BBUlRJVElPTlMKKwlpZiAocGRhdGEtPm5yX3BhcnRpdGlvbnMgPiAwKSB7CisJCWNvbnN0IGNoYXIgKipwcm9iZXMgPSB7IE5VTEwgfTsKKworCQlpZiAocGRhdGEtPnByb2JlcykKKwkJCXByb2JlcyA9IChjb25zdCBjaGFyICoqKXBkYXRhLT5wcm9iZXM7CisKKwkJZXJyID0gcGFyc2VfbXRkX3BhcnRpdGlvbnMoaW5mby0+bXRkLCBwcm9iZXMsCisJCQkJCSAgICZpbmZvLT5wYXJ0aXRpb25zLCAwKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWVyciA9IGFkZF9tdGRfcGFydGl0aW9ucyhpbmZvLT5tdGQsIGluZm8tPnBhcnRpdGlvbnMsCisJCQkJCQkgZXJyKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfTVREX1BBUlRJVElPTlMgKi8KKworCWlmIChhZGRfbXRkX2RldmljZShpbmZvLT5tdGQpKSB7CisJCWRldl9lcnIoZGV2LCAiYWRkX210ZF9kZXZpY2UoKSBmYWlsZWRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCX0KKwkKKwlkZXZfaW5mbyhkZXYsICJyZWdpc3RlcmVkIG10ZCBkZXZpY2VcbiIpOworCXJldHVybiBlcnI7CisKKyBleGl0X2ZyZWU6CisJcGxhdHJhbV9yZW1vdmUoZGV2KTsKKyBleGl0X2Vycm9yOgorCXJldHVybiBlcnI7Cit9CisKKy8qIGRldmljZSBkcml2ZXIgaW5mbyAqLworCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgcGxhdHJhbV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIm10ZC1yYW0iLAorCS5idXMJCT0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZQkJPSBwbGF0cmFtX3Byb2JlLAorCS5yZW1vdmUJCT0gcGxhdHJhbV9yZW1vdmUsCit9OworCisvKiBtb2R1bGUgaW5pdC9leGl0ICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBsYXRyYW1faW5pdCh2b2lkKQoreworCXByaW50aygiR2VuZXJpYyBwbGF0Zm9ybSBSQU0gTVRELCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3NcbiIpOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnBsYXRyYW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBsYXRyYW1fZXhpdCh2b2lkKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZwbGF0cmFtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBsYXRyYW1faW5pdCk7Cittb2R1bGVfZXhpdChwbGF0cmFtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBwbGF0Zm9ybSBSQU0gbWFwIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9zY2IyX2ZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwppbmRleCA1YmIzYjYwLi45N2E4ZGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3NjYjJfZmxhc2guYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBNVEQgbWFwIGRyaXZlciBmb3IgQklPUyBGbGFzaCBvbiBJbnRlbCBTQ0IyIGJvYXJkcwotICogJElkOiBzY2IyX2ZsYXNoLmMsdiAxLjExIDIwMDQvMTEvMjggMDk6NDA6NDAgZHdtdzIgRXhwICQKKyAqICRJZDogc2NiMl9mbGFzaC5jLHYgMS4xMiAyMDA1LzAzLzE4IDE0OjA0OjM1IGdsZWl4bmVyIEV4cCAkCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgogICogVGltIEhvY2tpbiA8dGhvY2tpbkBzdW4uY29tPgogICoKQEAgLTIzOCw3ICsyMzgsNyBAQAogc3RhdGljIGludCBfX2luaXQKIHNjYjJfZmxhc2hfaW5pdCh2b2lkKQogewotCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnNjYjJfZmxhc2hfZHJpdmVyKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2NiMl9mbGFzaF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvc2hhcnBzbC1mbGFzaC5jIGIvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKaW5kZXggYjNiMzljYi4uZDE1ZGE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9zaGFycHNsLWZsYXNoLmMKQEAgLTQsNyArNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTGluZW8gSmFwYW4sIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwMiAgU0hBUlAKICAqCi0gKiAkSWQ6IHNoYXJwc2wtZmxhc2guYyx2IDEuMiAyMDA0LzExLzI0IDIwOjM4OjA2IHJwdXJkaWUgRXhwICQKKyAqICRJZDogc2hhcnBzbC1mbGFzaC5jLHYgMS41IDIwMDUvMDMvMjEgMDg6NDI6MTEgcnB1cmRpZSBFeHAgJAogICoKICAqIGJhc2VkIG9uIHJweGxpdGUuYyx2IDEuMTUgMjAwMS8xMC8wMiAxNTowNToxNCBkd213MiBFeHAKICAqICAgICAgICAgIEhhbmRsZSBtYXBwaW5nIG9mIHRoZSBmbGFzaCBvbiB0aGUgUlBYIExpdGUgYW5kIENMTEYgYm9hcmRzCkBAIC0yNCwxMyArMjQsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCiAjZGVmaW5lIFdJTkRPV19BRERSIDB4MDAwMDAwMDAKLSNkZWZpbmUgV0lORE9XX1NJWkUgMHgwMTAwMDAwMAorI2RlZmluZSBXSU5ET1dfU0laRSAweDAwODAwMDAwCiAjZGVmaW5lIEJBTktfV0lEVEggMgogCiBzdGF0aWMgc3RydWN0IG10ZF9pbmZvICpteW10ZDsKQEAgLTQ0LDkgKzQ1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHNoYXJwc2xfcGFydGl0aW9uc1sxXSA9IHsKIAl7Ci0JCW5hbWU6CQkiRmlsZXN5c3RlbSIsCi0JCXNpemU6CQkweDAwNmQwMDAwLAotCQlvZmZzZXQ6CQkweDAwMTIwMDAwCisJCW5hbWU6CQkiQm9vdCBQUk9NIEZpbGVzeXN0ZW0iLAogCX0KIH07CiAKQEAgLTU4LDEyICs1NywxNiBAQAogCWludCBuYl9wYXJ0cyA9IDA7CiAJY2hhciAqcGFydF90eXBlID0gInN0YXRpYyI7CiAKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlNoYXJwIFNMIHNlcmllcyBmbGFzaCBkZXZpY2U6ICV4IGF0ICV4XG4iLCBXSU5ET1dfU0laRSwgV0lORE9XX0FERFIpOworCXByaW50ayhLRVJOX05PVElDRSAiU2hhcnAgU0wgc2VyaWVzIGZsYXNoIGRldmljZTogJXggYXQgJXhcbiIsIAorCQlXSU5ET1dfU0laRSwgV0lORE9XX0FERFIpOwogCXNoYXJwc2xfbWFwLnZpcnQgPSBpb3JlbWFwKFdJTkRPV19BRERSLCBXSU5ET1dfU0laRSk7CiAJaWYgKCFzaGFycHNsX21hcC52aXJ0KSB7CiAJCXByaW50aygiRmFpbGVkIHRvIGlvcmVtYXBcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisKKwlzaW1wbGVfbWFwX2luaXQoJnNoYXJwc2xfbWFwKTsKKwogCW15bXRkID0gZG9fbWFwX3Byb2JlKCJtYXBfcm9tIiwgJnNoYXJwc2xfbWFwKTsKIAlpZiAoIW15bXRkKSB7CiAJCWlvdW5tYXAoc2hhcnBzbF9tYXAudmlydCk7CkBAIC03Miw2ICs3NSwyMiBAQAogCiAJbXltdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKKwlpZiAobWFjaGluZV9pc19jb3JnaSgpIHx8IG1hY2hpbmVfaXNfc2hlcGhlcmQoKSB8fCBtYWNoaW5lX2lzX2h1c2t5KCkgCisJCXx8IG1hY2hpbmVfaXNfcG9vZGxlKCkpIHsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLnNpemU9MHgwMDZkMDAwMDsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLm9mZnNldD0weDAwMTIwMDAwOworCX0gZWxzZSBpZiAobWFjaGluZV9pc190b3NhKCkpIHsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLnNpemU9MHgwMDZhMDAwMDsKKwkJc2hhcnBzbF9wYXJ0aXRpb25zWzBdLm9mZnNldD0weDAwMTYwMDAwOworCX0gZWxzZSBpZiAobWFjaGluZV9pc19zcGl0eigpKSB7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5zaXplPTB4MDA2YjAwMDA7CisJCXNoYXJwc2xfcGFydGl0aW9uc1swXS5vZmZzZXQ9MHgwMDE0MDAwMDsKKwl9IGVsc2UgeworCQltYXBfZGVzdHJveShteW10ZCk7CisJCWlvdW5tYXAoc2hhcnBzbF9tYXAudmlydCk7CQorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCiAJcGFydHMgPSBzaGFycHNsX3BhcnRpdGlvbnM7CiAJbmJfcGFydHMgPSBOQl9PRihzaGFycHNsX3BhcnRpdGlvbnMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMKaW5kZXggNTEwYWQ3OC4uMWVkNjAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbXRkY2hhci5jCisrKyBiL2RyaXZlcnMvbXRkL210ZGNoYXIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiAkSWQ6IG10ZGNoYXIuYyx2IDEuNjYgMjAwNS8wMS8wNSAxODowNToxMSBkd213MiBFeHAgJAorICogJElkOiBtdGRjaGFyLmMsdiAxLjczIDIwMDUvMDcvMDQgMTc6MzY6NDEgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBDaGFyYWN0ZXItZGV2aWNlIGFjY2VzcyB0byByYXcgTVREIGRldmljZXMuCiAgKgpAQCAtMTUsMjcgKzE1LDMwIEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaWZkZWYgQ09ORklHX0RFVkZTX0ZTCi0jaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKm10ZF9jbGFzczsKIAogc3RhdGljIHZvaWQgbXRkX25vdGlmeV9hZGQoc3RydWN0IG10ZF9pbmZvKiBtdGQpCiB7CiAJaWYgKCFtdGQpCiAJCXJldHVybjsKIAotCWRldmZzX21rX2NkZXYoTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMiksCi0JCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTywgIm10ZC8lZCIsIG10ZC0+aW5kZXgpOwotCQkKLQlkZXZmc19ta19jZGV2KE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIrMSksCi0JCSAgICAgIFNfSUZDSFIgfCBTX0lSVUdPLCAibXRkLyVkcm8iLCBtdGQtPmluZGV4KTsKKwljbGFzc19kZXZpY2VfY3JlYXRlKG10ZF9jbGFzcywgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMiksCisJCQkgICAgTlVMTCwgIm10ZCVkIiwgbXRkLT5pbmRleCk7CisJCisJY2xhc3NfZGV2aWNlX2NyZWF0ZShtdGRfY2xhc3MsIAorCQkJICAgIE1LREVWKE1URF9DSEFSX01BSk9SLCBtdGQtPmluZGV4KjIrMSksCisJCQkgICAgTlVMTCwgIm10ZCVkcm8iLCBtdGQtPmluZGV4KTsKIH0KIAogc3RhdGljIHZvaWQgbXRkX25vdGlmeV9yZW1vdmUoc3RydWN0IG10ZF9pbmZvKiBtdGQpCiB7CiAJaWYgKCFtdGQpCiAJCXJldHVybjsKLQlkZXZmc19yZW1vdmUoIm10ZC8lZCIsIG10ZC0+aW5kZXgpOwotCWRldmZzX3JlbW92ZSgibXRkLyVkcm8iLCBtdGQtPmluZGV4KTsKKworCWNsYXNzX2RldmljZV9kZXN0cm95KG10ZF9jbGFzcywgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMikpOworCWNsYXNzX2RldmljZV9kZXN0cm95KG10ZF9jbGFzcywgTUtERVYoTVREX0NIQVJfTUFKT1IsIG10ZC0+aW5kZXgqMisxKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXRkX25vdGlmaWVyIG5vdGlmaWVyID0gewpAQCAtNDMsMjUgKzQ2LDI1IEBACiAJLnJlbW92ZQk9IG10ZF9ub3RpZnlfcmVtb3ZlLAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIG10ZGNoYXJfZGV2ZnNfaW5pdCh2b2lkKQotewotCWRldmZzX21rX2RpcigibXRkIik7Ci0JcmVnaXN0ZXJfbXRkX3VzZXIoJm5vdGlmaWVyKTsKLX0KKy8qCisgKiBXZSB1c2UgZmlsZS0+cHJpdmF0ZV9kYXRhIHRvIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgTVREZGV2aWNlLgorICogU2luY2UgYWxpZ2htZW50IGlzIGF0IGxlYXN0IDMyIGJpdHMsIHdlIGhhdmUgMiBiaXRzIGZyZWUgZm9yIE9UUAorICogbW9kZXMgYXMgd2VsbC4KKyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXRkY2hhcl9kZXZmc19leGl0KHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9tdGRfdXNlcigmbm90aWZpZXIpOwotCWRldmZzX3JlbW92ZSgibXRkIik7Ci19Ci0jZWxzZSAvKiAhREVWRlMgKi8KLSNkZWZpbmUgbXRkY2hhcl9kZXZmc19pbml0KCkgZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIG10ZGNoYXJfZGV2ZnNfZXhpdCgpIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCisjZGVmaW5lIFRPX01URChmaWxlKSAoc3RydWN0IG10ZF9pbmZvICopKChsb25nKSgoZmlsZSktPnByaXZhdGVfZGF0YSkgJiB+M0wpCisKKyNkZWZpbmUgTVREX01PREVfT1RQX0ZBQ1QJMQorI2RlZmluZSBNVERfTU9ERV9PVFBfVVNFUgkyCisjZGVmaW5lIE1URF9NT0RFKGZpbGUpCQkoKGxvbmcpKChmaWxlKS0+cHJpdmF0ZV9kYXRhKSAmIDMpCisKKyNkZWZpbmUgU0VUX01URF9NT0RFKGZpbGUsIG1vZGUpIFwKKwlkbyB7IGxvbmcgX19wID0gKGxvbmcpKChmaWxlKS0+cHJpdmF0ZV9kYXRhKTsgXAorCSAgICAgKGZpbGUpLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSgoX19wICYgfjNMKSB8IG1vZGUpOyB9IHdoaWxlICgwKQogCiBzdGF0aWMgbG9mZl90IG10ZF9sc2VlayAoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQogewotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gVE9fTVREKGZpbGUpOwogCiAJc3dpdGNoIChvcmlnKSB7CiAJY2FzZSAwOgpAQCAtMTM0LDcgKzEzNyw3IEBACiAKIAlERUJVRyhNVERfREVCVUdfTEVWRUwwLCAiTVREX2Nsb3NlXG4iKTsKIAotCW10ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltdGQgPSBUT19NVEQoZmlsZSk7CiAJCiAJaWYgKG10ZC0+c3luYykKIAkJbXRkLT5zeW5jKG10ZCk7CkBAIC0xNTEsNyArMTU0LDcgQEAKIAogc3RhdGljIHNzaXplX3QgbXRkX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCxsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IG10ZF9pbmZvICptdGQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSBUT19NVEQoZmlsZSk7CiAJc2l6ZV90IHJldGxlbj0wOwogCXNpemVfdCB0b3RhbF9yZXRsZW49MDsKIAlpbnQgcmV0PTA7CkBAIC0xNzgsNyArMTgxLDE2IEBACiAJCWlmICgha2J1ZikKIAkJCXJldHVybiAtRU5PTUVNOwogCQkKLQkJcmV0ID0gTVREX1JFQUQobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJc3dpdGNoIChNVERfTU9ERShmaWxlKSkgeworCQljYXNlIE1URF9NT0RFX09UUF9GQUNUOgorCQkJcmV0ID0gbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIE1URF9NT0RFX09UUF9VU0VSOgorCQkJcmV0ID0gbXRkLT5yZWFkX3VzZXJfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gTVREX1JFQUQobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJfQogCQkvKiBOYW5kIHJldHVybnMgLUVCQURNU0cgb24gZWNjIGVycm9ycywgYnV0IGl0IHJldHVybnMKIAkJICogdGhlIGRhdGEuIEZvciBvdXIgdXNlcnNwYWNlIHRvb2xzIGl0IGlzIGltcG9ydGFudAogCQkgKiB0byBkdW1wIGFyZWFzIHdpdGggZWNjIGVycm9ycyAhIApAQCAtMTk2LDYgKzIwOCw4IEBACiAKIAkJCWNvdW50IC09IHJldGxlbjsKIAkJCWJ1ZiArPSByZXRsZW47CisJCQlpZiAocmV0bGVuID09IDApCisJCQkJY291bnQgPSAwOwogCQl9CiAJCWVsc2UgewogCQkJa2ZyZWUoa2J1Zik7CkBAIC0yMTAsNyArMjI0LDcgQEAKIAogc3RhdGljIHNzaXplX3QgbXRkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gVE9fTVREKGZpbGUpOwogCWNoYXIgKmtidWY7CiAJc2l6ZV90IHJldGxlbjsKIAlzaXplX3QgdG90YWxfcmV0bGVuPTA7CkBAIC0yNDUsNyArMjU5LDIwIEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQkKLQkgICAgICAgIHJldCA9ICgqKG10ZC0+d3JpdGUpKShtdGQsICpwcG9zLCBsZW4sICZyZXRsZW4sIGtidWYpOworCQlzd2l0Y2ggKE1URF9NT0RFKGZpbGUpKSB7CisJCWNhc2UgTVREX01PREVfT1RQX0ZBQ1Q6CisJCQlyZXQgPSAtRVJPRlM7CisJCQlicmVhazsKKwkJY2FzZSBNVERfTU9ERV9PVFBfVVNFUjoKKwkJCWlmICghbXRkLT53cml0ZV91c2VyX3Byb3RfcmVnKSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBtdGQtPndyaXRlX3VzZXJfcHJvdF9yZWcobXRkLCAqcHBvcywgbGVuLCAmcmV0bGVuLCBrYnVmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gKCoobXRkLT53cml0ZSkpKG10ZCwgKnBwb3MsIGxlbiwgJnJldGxlbiwga2J1Zik7CisJCX0KIAkJaWYgKCFyZXQpIHsKIAkJCSpwcG9zICs9IHJldGxlbjsKIAkJCXRvdGFsX3JldGxlbiArPSByZXRsZW47CkBAIC0yNzYsNyArMzAzLDcgQEAKIHN0YXRpYyBpbnQgbXRkX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgIHVfaW50IGNtZCwgdV9sb25nIGFyZykKIHsKLQlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IFRPX01URChmaWxlKTsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAlpbnQgcmV0ID0gMDsKIAl1X2xvbmcgc2l6ZTsKQEAgLTUxOCw2ICs1NDUsODAgQEAKIAkJYnJlYWs7CiAJfQogCisjaWZkZWYgQ09ORklHX01URF9PVFAKKwljYXNlIE9UUFNFTEVDVDoKKwl7CisJCWludCBtb2RlOworCQlpZiAoY29weV9mcm9tX3VzZXIoJm1vZGUsIGFyZ3AsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlTRVRfTVREX01PREUoZmlsZSwgMCk7CisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIE1URF9PVFBfRkFDVE9SWToKKwkJCWlmICghbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcpCisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQllbHNlCisJCQkJU0VUX01URF9NT0RFKGZpbGUsIE1URF9NT0RFX09UUF9GQUNUKTsKKwkJCWJyZWFrOworCQljYXNlIE1URF9PVFBfVVNFUjoKKwkJCWlmICghbXRkLT5yZWFkX2ZhY3RfcHJvdF9yZWcpCisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQllbHNlCisJCQkJU0VUX01URF9NT0RFKGZpbGUsIE1URF9NT0RFX09UUF9VU0VSKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJY2FzZSBNVERfT1RQX09GRjoKKwkJCWJyZWFrOworCQl9CisJCWZpbGUtPmZfcG9zID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBPVFBHRVRSRUdJT05DT1VOVDoKKwljYXNlIE9UUEdFVFJFR0lPTklORk86CisJeworCQlzdHJ1Y3Qgb3RwX2luZm8gKmJ1ZiA9IGttYWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlzd2l0Y2ggKE1URF9NT0RFKGZpbGUpKSB7CisJCWNhc2UgTVREX01PREVfT1RQX0ZBQ1Q6CisJCQlpZiAobXRkLT5nZXRfZmFjdF9wcm90X2luZm8pCisJCQkJcmV0ID0gbXRkLT5nZXRfZmFjdF9wcm90X2luZm8obXRkLCBidWYsIDQwOTYpOworCQkJYnJlYWs7CisJCWNhc2UgTVREX01PREVfT1RQX1VTRVI6CisJCQlpZiAobXRkLT5nZXRfdXNlcl9wcm90X2luZm8pCisJCQkJcmV0ID0gbXRkLT5nZXRfdXNlcl9wcm90X2luZm8obXRkLCBidWYsIDQwOTYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCA+PSAwKSB7CisJCQlpZiAoY21kID09IE9UUEdFVFJFR0lPTkNPVU5UKSB7CisJCQkJaW50IG5iciA9IHJldCAvIHNpemVvZihzdHJ1Y3Qgb3RwX2luZm8pOworCQkJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmbmJyLCBzaXplb2YoaW50KSk7CisJCQl9IGVsc2UKKwkJCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgYnVmLCByZXQpOworCQkJaWYgKHJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJCWtmcmVlKGJ1Zik7CisJCWJyZWFrOworCX0KKworCWNhc2UgT1RQTE9DSzoKKwl7CisJCXN0cnVjdCBvdHBfaW5mbyBpbmZvOworCisJCWlmIChNVERfTU9ERShmaWxlKSAhPSBNVERfTU9ERV9PVFBfVVNFUikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZ3AsIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCFtdGQtPmxvY2tfdXNlcl9wcm90X3JlZykKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0ID0gbXRkLT5sb2NrX3VzZXJfcHJvdF9yZWcobXRkLCBpbmZvLnN0YXJ0LCBpbmZvLmxlbmd0aCk7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1RUWTsKIAl9CkBAIC01NDMsMTMgKzY0NCwyMiBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKLQltdGRjaGFyX2RldmZzX2luaXQoKTsKKwltdGRfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtdGQiKTsKKworCWlmIChJU19FUlIobXRkX2NsYXNzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGNyZWF0aW5nIG10ZCBjbGFzcy5cbiIpOworCQl1bnJlZ2lzdGVyX2NocmRldihNVERfQ0hBUl9NQUpPUiwgIm10ZCIpOworCQlyZXR1cm4gUFRSX0VSUihtdGRfY2xhc3MpOworCX0KKworCXJlZ2lzdGVyX210ZF91c2VyKCZub3RpZmllcik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX210ZGNoYXIodm9pZCkKIHsKLQltdGRjaGFyX2RldmZzX2V4aXQoKTsKKwl1bnJlZ2lzdGVyX210ZF91c2VyKCZub3RpZmllcik7CisJY2xhc3NfZGVzdHJveShtdGRfY2xhc3MpOwogCXVucmVnaXN0ZXJfY2hyZGV2KE1URF9DSEFSX01BSk9SLCAibXRkIik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZGNvcmUuYyBiL2RyaXZlcnMvbXRkL210ZGNvcmUuYwppbmRleCA5YzAzMTVkLi5kYzg2ZGYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tdGRjb3JlLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogbXRkY29yZS5jLHYgMS40NCAyMDA0LzExLzE2IDE4OjI4OjU5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IG10ZGNvcmUuYyx2IDEuNDUgMjAwNS8wMi8xOCAxNDozNDo1MCBkZWRla2luZCBFeHAgJAogICoKICAqIENvcmUgcmVnaXN0cmF0aW9uIGFuZCBjYWxsYmFjayByb3V0aW5lcyBmb3IgTVRECiAgKiBkcml2ZXJzIGFuZCB1c2Vycy4KQEAgLTE0OSw4ICsxNDksOCBAQAogfQogCiAvKioKLSAqCXJlZ2lzdGVyX210ZF91c2VyIC0gdW5yZWdpc3RlciBhICd1c2VyJyBvZiBNVEQgZGV2aWNlcy4KLSAqCUBuZXc6IHBvaW50ZXIgdG8gbm90aWZpZXIgaW5mbyBzdHJ1Y3R1cmUKKyAqCXVucmVnaXN0ZXJfbXRkX3VzZXIgLSB1bnJlZ2lzdGVyIGEgJ3VzZXInIG9mIE1URCBkZXZpY2VzLgorICoJQG9sZDogcG9pbnRlciB0byBub3RpZmllciBpbmZvIHN0cnVjdHVyZQogICoKICAqCVJlbW92ZXMgYSBjYWxsYmFjayBmdW5jdGlvbiBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgJ3VzZXJzJyB0byBiZQogICoJbm90aWZpZWQgdXBvbiBhZGRpdGlvbiBvciByZW1vdmFsIG9mIE1URCBkZXZpY2VzLiBDYXVzZXMgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRwYXJ0LmMgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKaW5kZXggOTZlYmI1Mi4uYjkyZTZiZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZHBhcnQuYworKysgYi9kcml2ZXJzL210ZC9tdGRwYXJ0LmMKQEAgLTUsNyArNSw3IEBACiAgKgogICogVGhpcyBjb2RlIGlzIEdQTAogICoKLSAqICRJZDogbXRkcGFydC5jLHYgMS41MSAyMDA0LzExLzE2IDE4OjI4OjU5IGR3bXcyIEV4cCAkCisgKiAkSWQ6IG10ZHBhcnQuYyx2IDEuNTMgMjAwNS8wMi8wOCAxNzoxMToxMyBuaWNvIEV4cCAkCiAgKgogICogCTAyLTIxLTIwMDIJVGhvbWFzIEdsZWl4bmVyIDxnbGVpeG5lckBhdXRyb25peC5kZT4KICAqCQkJYWRkZWQgc3VwcG9ydCBmb3IgcmVhZF9vb2IsIHdyaXRlX29vYgpAQCAtMTE2LDYgKzExNiwxMyBAQAogCQkJCQlsZW4sIHJldGxlbiwgYnVmKTsKIH0KIAorc3RhdGljIGludCBwYXJ0X2dldF91c2VyX3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBtdGRfcGFydCAqcGFydCA9IFBBUlQobXRkKTsKKwlyZXR1cm4gcGFydC0+bWFzdGVyLT5nZXRfdXNlcl9wcm90X2luZm8gKHBhcnQtPm1hc3RlciwgYnVmLCBsZW4pOworfQorCiBzdGF0aWMgaW50IHBhcnRfcmVhZF9mYWN0X3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIAogCQkJc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQogewpAQCAtMTI0LDYgKzEzMSwxMyBAQAogCQkJCQlsZW4sIHJldGxlbiwgYnVmKTsKIH0KIAorc3RhdGljIGludCBwYXJ0X2dldF9mYWN0X3Byb3RfaW5mbyAoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICAgIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBtdGRfcGFydCAqcGFydCA9IFBBUlQobXRkKTsKKwlyZXR1cm4gcGFydC0+bWFzdGVyLT5nZXRfZmFjdF9wcm90X2luZm8gKHBhcnQtPm1hc3RlciwgYnVmLCBsZW4pOworfQorCiBzdGF0aWMgaW50IHBhcnRfd3JpdGUgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgdG8sIHNpemVfdCBsZW4sCiAJCQlzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCiB7CkBAIC0xODIsNiArMTk2LDEyIEBACiAJCQkJCWxlbiwgcmV0bGVuLCBidWYpOwogfQogCitzdGF0aWMgaW50IHBhcnRfbG9ja191c2VyX3Byb3RfcmVnIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4pIAoreworCXN0cnVjdCBtdGRfcGFydCAqcGFydCA9IFBBUlQobXRkKTsKKwlyZXR1cm4gcGFydC0+bWFzdGVyLT5sb2NrX3VzZXJfcHJvdF9yZWcgKHBhcnQtPm1hc3RlciwgZnJvbSwgbGVuKTsKK30KKwogc3RhdGljIGludCBwYXJ0X3dyaXRldiAoc3RydWN0IG10ZF9pbmZvICptdGQsICBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKIAkJCSB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKQogewpAQCAtNDA5LDYgKzQyOSwxMiBAQAogCQkJc2xhdmUtPm10ZC5yZWFkX2ZhY3RfcHJvdF9yZWcgPSBwYXJ0X3JlYWRfZmFjdF9wcm90X3JlZzsKIAkJaWYobWFzdGVyLT53cml0ZV91c2VyX3Byb3RfcmVnKQogCQkJc2xhdmUtPm10ZC53cml0ZV91c2VyX3Byb3RfcmVnID0gcGFydF93cml0ZV91c2VyX3Byb3RfcmVnOworCQlpZihtYXN0ZXItPmxvY2tfdXNlcl9wcm90X3JlZykKKwkJCXNsYXZlLT5tdGQubG9ja191c2VyX3Byb3RfcmVnID0gcGFydF9sb2NrX3VzZXJfcHJvdF9yZWc7CisJCWlmKG1hc3Rlci0+Z2V0X3VzZXJfcHJvdF9pbmZvKQorCQkJc2xhdmUtPm10ZC5nZXRfdXNlcl9wcm90X2luZm8gPSBwYXJ0X2dldF91c2VyX3Byb3RfaW5mbzsKKwkJaWYobWFzdGVyLT5nZXRfZmFjdF9wcm90X2luZm8pCisJCQlzbGF2ZS0+bXRkLmdldF9mYWN0X3Byb3RfaW5mbyA9IHBhcnRfZ2V0X2ZhY3RfcHJvdF9pbmZvOwogCQlpZiAobWFzdGVyLT5zeW5jKQogCQkJc2xhdmUtPm10ZC5zeW5jID0gcGFydF9zeW5jOwogCQlpZiAoIWkgJiYgbWFzdGVyLT5zdXNwZW5kICYmIG1hc3Rlci0+cmVzdW1lKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcgYi9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKaW5kZXggZjc4MDFlYi4uMzZkMzRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvS2NvbmZpZwpAQCAtMSw1ICsxLDUgQEAKICMgZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCi0jICRJZDogS2NvbmZpZyx2IDEuMjYgMjAwNS8wMS8wNSAxMjo0MjoyNCBkd213MiBFeHAgJAorIyAkSWQ6IEtjb25maWcsdiAxLjMxIDIwMDUvMDYvMjAgMTI6MDM6MjEgYmpkIEV4cCAkCiAKIG1lbnUgIk5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMiCiAJZGVwZW5kcyBvbiBNVEQhPW4KQEAgLTU4LDIwICs1OCw2IEBACiBjb25maWcgTVREX05BTkRfSURTCiAJdHJpc3RhdGUKIAotY29uZmlnIE1URF9OQU5EX1RYNDkyNU5ERk1DCi0JdHJpc3RhdGUgIlNtYXJ0TWVkaWEgQ2FyZCBvbiBUb3NoaWJhIFJCVFg0OTI1IHJlZmVyZW5jZSBib2FyZCIKLQlkZXBlbmRzIG9uIFRPU0hJQkFfUkJUWDQ5MjUgJiYgTVREX05BTkQgJiYgVE9TSElCQV9SQlRYNDkyNV9NUExFWF9OQU5ECi0JaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBmb3VuZCBvbiB0aGUKLQkgIFRvc2hpYmEgUkJUWDQ5MjUgcmVmZXJlbmNlIGJvYXJkLCB3aGljaCBpcyBhIFNtYXJ0TWVkaWFDYXJkLgotCi1jb25maWcgTVREX05BTkRfVFg0OTM4TkRGTUMKLQl0cmlzdGF0ZSAiTkFORCBGbGFzaCBkZXZpY2Ugb24gVG9zaGliYSBSQlRYNDkzOCByZWZlcmVuY2UgYm9hcmQiCi0JZGVwZW5kcyBvbiBUT1NISUJBX1JCVFg0OTM4ICYmIE1URF9OQU5EICYmIFRPU0hJQkFfUkJUWDQ5MzhfTVBMRVhfTkFORCAKLQloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIGRyaXZlciBmb3IgdGhlIE5BTkQgZmxhc2ggZGV2aWNlIGZvdW5kIG9uIHRoZQotCSAgVG9zaGliYSBSQlRYNDkzOCByZWZlcmVuY2UgYm9hcmQuCi0KIGNvbmZpZyBNVERfTkFORF9BVTE1NTAKIAl0cmlzdGF0ZSAiQXUxNTUwIE5BTkQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPQ19BVTE1NTAgJiYgTVREX05BTkQKQEAgLTk1LDEwICs4MSwxMSBAQAogCSAgVGhpcyBlbmFibGVzIHRoZSBOQU5EIGZsYXNoIGRyaXZlciBvbiB0aGUgUFBDaGFtZWxlb24gRVZCIEJvYXJkLgogCiBjb25maWcgTVREX05BTkRfUzNDMjQxMAotCXRyaXN0YXRlICJOQU5EIEZsYXNoIHN1cHBvcnQgZm9yIFMzQzI0MTAgU29DIgorCXRyaXN0YXRlICJOQU5EIEZsYXNoIHN1cHBvcnQgZm9yIFMzQzI0MTAvUzNDMjQ0MCBTb0MiCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAgJiYgTVREX05BTkQKIAloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIE5BTkQgZmxhc2ggY29udHJvbGxlciBvbiB0aGUgUzNDMjQxMC4KKwkgIFRoaXMgZW5hYmxlcyB0aGUgTkFORCBmbGFzaCBjb250cm9sbGVyIG9uIHRoZSBTM0MyNDEwIGFuZCBTM0MyNDQwCisJICBTb0NzCiAKIAkgIE5vIGJvYXJkIHNwZWNmaWMgc3VwcG9ydCBpcyBkb25lIGJ5IHRoaXMgZHJpdmVyLCBlYWNoIGJvYXJkCiAJICBtdXN0IGFkdmVydGlzZSBhIHBsYXRmb3JtX2RldmljZSBmb3IgdGhlIGRyaXZlciB0byBhdHRhY2guIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZSBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKaW5kZXggZDlkYzhjYy4uNDE3NDIwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCkBAIC0xMCw4ICsxMCw2IEBACiBvYmotJChDT05GSUdfTVREX05BTkRfVE9UTykJCSs9IHRvdG8ubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0FVVENQVTEyKQkJKz0gYXV0Y3B1MTIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0VEQjczMTIpCQkrPSBlZGI3MzEyLm8KLW9iai0kKENPTkZJR19NVERfTkFORF9UWDQ5MjVOREZNQykJKz0gdHg0OTI1bmRmbWMubwotb2JqLSQoQ09ORklHX01URF9OQU5EX1RYNDkzOE5ERk1DKQkrPSB0eDQ5MzhuZGZtYy5vCiBvYmotJChDT05GSUdfTVREX05BTkRfQVUxNTUwKQkJKz0gYXUxNTUwbmQubwogb2JqLSQoQ09ORklHX01URF9OQU5EX1BQQ0hBTUVMRU9ORVZCKQkrPSBwcGNoYW1lbGVvbmV2Yi5vCiBvYmotJChDT05GSUdfTVREX05BTkRfUzNDMjQxMCkJCSs9IHMzYzI0MTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9kaXNrb25jaGlwLmMgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwppbmRleCAwMjEzNWMzLi5mZGI1ZDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2Rpc2tvbmNoaXAuYwpAQCAtMTYsNyArMTYsNyBAQAogICogIAogICogSW50ZXJmYWNlIHRvIGdlbmVyaWMgTkFORCBjb2RlIGZvciBNLVN5c3RlbXMgRGlza09uQ2hpcCBkZXZpY2VzCiAgKgotICogJElkOiBkaXNrb25jaGlwLmMsdiAxLjQ1IDIwMDUvMDEvMDUgMTg6MDU6MTQgZHdtdzIgRXhwICQKKyAqICRJZDogZGlza29uY2hpcC5jLHYgMS41NCAyMDA1LzA0LzA3IDE0OjIyOjU1IGRicm93biBFeHAgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM1LDEzICszNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L210ZC9pbmZ0bC5oPgogCiAvKiBXaGVyZSB0byBsb29rIGZvciB0aGUgZGV2aWNlcz8gKi8KLSNpZm5kZWYgQ09ORklHX01URF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MKLSNkZWZpbmUgQ09ORklHX01URF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MgMAorI2lmbmRlZiBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTCisjZGVmaW5lIENPTkZJR19NVERfTkFORF9ESVNLT05DSElQX1BST0JFX0FERFJFU1MgMAogI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgZG9jX2xvY2F0aW9uc1tdID0gewogI2lmIGRlZmluZWQgKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotI2lmZGVmIENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9ISUdICisjaWZkZWYgQ09ORklHX01URF9OQU5EX0RJU0tPTkNISVBfUFJPQkVfSElHSAogCTB4ZmZmYzgwMDAsIDB4ZmZmY2EwMDAsIDB4ZmZmY2MwMDAsIDB4ZmZmY2UwMDAsIAogCTB4ZmZmZDAwMDAsIDB4ZmZmZDIwMDAsIDB4ZmZmZDQwMDAsIDB4ZmZmZDYwMDAsCiAJMHhmZmZkODAwMCwgMHhmZmZkYTAwMCwgMHhmZmZkYzAwMCwgMHhmZmZkZTAwMCwgCkBAIC04MSwxMSArODEsNiBAQAogCXN0cnVjdCBtdGRfaW5mbyAqbmV4dGRvYzsKIH07CiAKLS8qIE1heCBudW1iZXIgb2YgZXJhc2VibG9ja3MgdG8gc2NhbiAoZnJvbSBzdGFydCBvZiBkZXZpY2UpIGZvciB0aGUgKEkpTkZUTAotICAgTWVkaWFIZWFkZXIuICBUaGUgc3BlYyBzYXlzIHRvIGp1c3Qga2VlcCBnb2luZywgSSB0aGluaywgYnV0IHRoYXQncyBqdXN0Ci0gICBzaWxseS4gKi8KLSNkZWZpbmUgTUFYX01FRElBSEVBREVSX1NDQU4gOAotCiAvKiBUaGlzIGlzIHRoZSBzeW5kcm9tZSBjb21wdXRlZCBieSB0aGUgSFcgZWNjIGdlbmVyYXRvciB1cG9uIHJlYWRpbmcgYW4gZW1wdHkKICAgIHBhZ2UsIG9uZSB3aXRoIGFsbCAweGZmIGZvciBkYXRhIGFuZCBzdG9yZWQgZWNjIGNvZGUuICovCiBzdGF0aWMgdV9jaGFyIGVtcHR5X3JlYWRfc3luZHJvbWVbNl0gPSB7IDB4MjYsIDB4ZmYsIDB4NmQsIDB4NDcsIDB4NzMsIDB4N2EgfTsKQEAgLTExMSwxMCArMTA2LDExIEBACiBzdGF0aWMgaW50IG5vX2VjY19mYWlsdXJlcz0wOwogbW9kdWxlX3BhcmFtKG5vX2VjY19mYWlsdXJlcywgaW50LCAwKTsKIAotI2lmZGVmIENPTkZJR19NVERfUEFSVElUSU9OUwogc3RhdGljIGludCBub19hdXRvcGFydD0wOwogbW9kdWxlX3BhcmFtKG5vX2F1dG9wYXJ0LCBpbnQsIDApOwotI2VuZGlmCisKK3N0YXRpYyBpbnQgc2hvd19maXJtd2FyZV9wYXJ0aXRpb249MDsKK21vZHVsZV9wYXJhbShzaG93X2Zpcm13YXJlX3BhcnRpdGlvbiwgaW50LCAwKTsKIAogI2lmZGVmIE1URF9OQU5EX0RJU0tPTkNISVBfQkJUV1JJVEUKIHN0YXRpYyBpbnQgaW5mdGxfYmJ0X3dyaXRlPTE7CkBAIC0xMjMsNyArMTE5LDcgQEAKICNlbmRpZgogbW9kdWxlX3BhcmFtKGluZnRsX2JidF93cml0ZSwgaW50LCAwKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9jX2NvbmZpZ19sb2NhdGlvbiA9IENPTkZJR19NVERfRElTS09OQ0hJUF9QUk9CRV9BRERSRVNTOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9jX2NvbmZpZ19sb2NhdGlvbiA9IENPTkZJR19NVERfTkFORF9ESVNLT05DSElQX1BST0JFX0FERFJFU1M7CiBtb2R1bGVfcGFyYW0oZG9jX2NvbmZpZ19sb2NhdGlvbiwgdWxvbmcsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkb2NfY29uZmlnX2xvY2F0aW9uLCAiUGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgYXQgd2hpY2ggdG8gcHJvYmUgZm9yIERpc2tPbkNoaXAiKTsKIApAQCAtNDEwLDcgKzQwNiwxMiBAQAogCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQUxFKTsKIAl0aGlzLT53cml0ZV9ieXRlKG10ZCwgMCk7CiAJZG9jMjAweF9od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJBTEUpOwotCisJCisJLyogV2UgY2FudCcgdXNlIGRldl9yZWFkeSBoZXJlLCBidXQgYXQgbGVhc3Qgd2Ugd2FpdCBmb3IgdGhlCisJICogY29tbWFuZCB0byBjb21wbGV0ZSAKKwkgKi8KKwl1ZGVsYXkoNTApOworCQogCXJldCA9IHRoaXMtPnJlYWRfYnl0ZShtdGQpIDw8IDg7CiAJcmV0IHw9IHRoaXMtPnJlYWRfYnl0ZShtdGQpOwogCkBAIC00MjksNiArNDMwLDggQEAKIAkJZG9jMjAwMF93cml0ZV9ieXRlKG10ZCwgMCk7CiAJCWRvYzIwMHhfaHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQUxFKTsKIAorCQl1ZGVsYXkoNTApOworCiAJCWlkZW50LmR3b3JkID0gcmVhZGwoZG9jcHRyICsgRG9DXzJrX0NEU05fSU8pOwogCQlpZiAoKChpZGVudC5ieXRlWzBdIDw8IDgpIHwgaWRlbnQuYnl0ZVsxXSkgPT0gcmV0KSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJEaXNrT25DaGlwIDIwMDAgcmVzcG9uZHMgdG8gRFdPUkQgYWNjZXNzXG4iKTsKQEAgLTEwNDYsMTEgKzEwNDksMjEgQEAKIAkJCiAvL3VfY2hhciBteWRhdGFidWZbNTI4XTsKIAorLyogVGhlIHN0cmFuZ2Ugb3V0LW9mLW9yZGVyIC5vb2JmcmVlIGxpc3QgYmVsb3cgaXMgYSAocG9zc2libHkgdW5uZWVkZWQpCisgKiBhdHRlbXB0IHRvIHJldGFpbiBjb21wYXRpYmlsaXR5LiAgSXQgdXNlZCB0byByZWFkOgorICogCS5vb2JmcmVlID0geyB7OCwgOH0gfQorICogU2luY2UgdGhhdCBsZWF2ZXMgdHdvIGJ5dGVzIHVudXNhYmxlLCBpdCB3YXMgY2hhbmdlZC4gIEJ1dCB0aGUgZm9sbG93aW5nCisgKiBzY2hlbWUgbWlnaHQgYWZmZWN0IGV4aXN0aW5nIGpmZnMyIGluc3RhbGxzIGJ5IG1vdmluZyB0aGUgY2xlYW5tYXJrZXI6CisgKiAJLm9vYmZyZWUgPSB7IHs2LCAxMH0gfQorICogamZmczIgc2VlbXMgdG8gaGFuZGxlIHRoZSBhYm92ZSBncmFjZWZ1bGx5LCBidXQgdGhlIGN1cnJlbnQgc2NoZW1lIHNlZW1zCisgKiBzYWZlci4gIFRoZSBvbmx5IHByb2JsZW0gd2l0aCBpdCBpcyB0aGF0IGFueSBjb2RlIHRoYXQgcGFyc2VzIG9vYmZyZWUgbXVzdAorICogYmUgYWJsZSB0byBoYW5kbGUgb3V0LW9mLW9yZGVyIHNlZ21lbnRzLgorICovCiBzdGF0aWMgc3RydWN0IG5hbmRfb29iaW5mbyBkb2MyMDB4X29vYmluZm8gPSB7CiAgICAgICAgIC51c2VlY2MgPSBNVERfTkFOREVDQ19BVVRPUExBQ0UsCiAgICAgICAgIC5lY2NieXRlcyA9IDYsCiAgICAgICAgIC5lY2Nwb3MgPSB7MCwgMSwgMiwgMywgNCwgNX0sCi0gICAgICAgIC5vb2JmcmVlID0geyB7OCwgOH0gfQorICAgICAgICAub29iZnJlZSA9IHsgezgsIDh9LCB7NiwgMn0gfQogfTsKICAKIC8qIEZpbmQgdGhlIChJKU5GVEwgTWVkaWEgSGVhZGVyLCBhbmQgb3B0aW9uYWxseSBhbHNvIHRoZSBtaXJyb3IgbWVkaWEgaGVhZGVyLgpAQCAtMTA2NCwxMiArMTA3NywxMSBAQAogewogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAJc3RydWN0IGRvY19wcml2ICpkb2MgPSB0aGlzLT5wcml2OwotCXVuc2lnbmVkIG9mZnMsIGVuZCA9IChNQVhfTUVESUFIRUFERVJfU0NBTiA8PCB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0KTsKKwl1bnNpZ25lZCBvZmZzOwogCWludCByZXQ7CiAJc2l6ZV90IHJldGxlbjsKIAotCWVuZCA9IG1pbihlbmQsIG10ZC0+c2l6ZSk7IC8vIHBhcmFub2lhCi0JZm9yIChvZmZzID0gMDsgb2ZmcyA8IGVuZDsgb2ZmcyArPSBtdGQtPmVyYXNlc2l6ZSkgeworCWZvciAob2ZmcyA9IDA7IG9mZnMgPCBtdGQtPnNpemU7IG9mZnMgKz0gbXRkLT5lcmFzZXNpemUpIHsKIAkJcmV0ID0gbXRkLT5yZWFkKG10ZCwgb2ZmcywgbXRkLT5vb2JibG9jaywgJnJldGxlbiwgYnVmKTsKIAkJaWYgKHJldGxlbiAhPSBtdGQtPm9vYmJsb2NrKSBjb250aW51ZTsKIAkJaWYgKHJldCkgewpAQCAtMTExMSw2ICsxMTIzLDcgQEAKIAl1X2NoYXIgKmJ1ZjsKIAlzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyICptaDsKIAljb25zdCB1bnNpZ25lZCBwc2l6ZSA9IDEgPDwgdGhpcy0+cGFnZV9zaGlmdDsKKwlpbnQgbnVtcGFydHMgPSAwOwogCXVuc2lnbmVkIGJsb2NrcywgbWF4YmxvY2tzOwogCWludCBvZmZzLCBudW1oZWFkZXJzOwogCkBAIC0xMTIyLDggKzExMzUsMTAgQEAKIAlpZiAoIShudW1oZWFkZXJzPWZpbmRfbWVkaWFfaGVhZGVycyhtdGQsIGJ1ZiwgIkFOQU5EIiwgMSkpKSBnb3RvIG91dDsKIAltaCA9IChzdHJ1Y3QgTkZUTE1lZGlhSGVhZGVyICopIGJ1ZjsKIAotLy8jaWZkZWYgQ09ORklHX01URF9ERUJVR19WRVJCT1NFCi0vLwlpZiAoQ09ORklHX01URF9ERUJVR19WRVJCT1NFID49IDIpCisJbWgtPk51bUVyYXNlVW5pdHMgPSBsZTE2X3RvX2NwdShtaC0+TnVtRXJhc2VVbml0cyk7CisJbWgtPkZpcnN0UGh5c2ljYWxFVU4gPSBsZTE2X3RvX2NwdShtaC0+Rmlyc3RQaHlzaWNhbEVVTik7CisJbWgtPkZvcm1hdHRlZFNpemUgPSBsZTMyX3RvX2NwdShtaC0+Rm9ybWF0dGVkU2l6ZSk7CisKIAlwcmludGsoS0VSTl9JTkZPICIgICAgRGF0YU9yZ0lEICAgICAgICA9ICVzXG4iCiAJCQkgIiAgICBOdW1FcmFzZVVuaXRzICAgID0gJWRcbiIKIAkJCSAiICAgIEZpcnN0UGh5c2ljYWxFVU4gPSAlZFxuIgpAQCAtMTEzMiw3ICsxMTQ3LDYgQEAKIAkJbWgtPkRhdGFPcmdJRCwgbWgtPk51bUVyYXNlVW5pdHMsCiAJCW1oLT5GaXJzdFBoeXNpY2FsRVVOLCBtaC0+Rm9ybWF0dGVkU2l6ZSwKIAkJbWgtPlVuaXRTaXplRmFjdG9yKTsKLS8vI2VuZGlmCiAKIAlibG9ja3MgPSBtdGQtPnNpemUgPj4gdGhpcy0+cGh5c19lcmFzZV9zaGlmdDsKIAltYXhibG9ja3MgPSBtaW4oMzI3NjhVLCBtdGQtPmVyYXNlc2l6ZSAtIHBzaXplKTsKQEAgLTExNzUsMjMgKzExODksMjggQEAKIAlvZmZzIDw8PSB0aGlzLT5wYWdlX3NoaWZ0OwogCW9mZnMgKz0gbXRkLT5lcmFzZXNpemU7CiAKLQkvL3BhcnRzWzBdLm5hbWUgPSAiIERpc2tPbkNoaXAgQm9vdCAvIE1lZGlhIEhlYWRlciBwYXJ0aXRpb24iOwotCS8vcGFydHNbMF0ub2Zmc2V0ID0gMDsKLQkvL3BhcnRzWzBdLnNpemUgPSBvZmZzOwotCi0JcGFydHNbMF0ubmFtZSA9ICIgRGlza09uQ2hpcCBCRFRMIHBhcnRpdGlvbiI7Ci0JcGFydHNbMF0ub2Zmc2V0ID0gb2ZmczsKLQlwYXJ0c1swXS5zaXplID0gKG1oLT5OdW1FcmFzZVVuaXRzIC0gbnVtaGVhZGVycykgPDwgdGhpcy0+YmJ0X2VyYXNlX3NoaWZ0OwotCi0Jb2ZmcyArPSBwYXJ0c1swXS5zaXplOwotCWlmIChvZmZzIDwgbXRkLT5zaXplKSB7Ci0JCXBhcnRzWzFdLm5hbWUgPSAiIERpc2tPbkNoaXAgUmVtYWluZGVyIHBhcnRpdGlvbiI7Ci0JCXBhcnRzWzFdLm9mZnNldCA9IG9mZnM7Ci0JCXBhcnRzWzFdLnNpemUgPSBtdGQtPnNpemUgLSBvZmZzOwotCQlyZXQgPSAyOwotCQlnb3RvIG91dDsKKwlpZiAoc2hvd19maXJtd2FyZV9wYXJ0aXRpb24gPT0gMSkgeworCQlwYXJ0c1swXS5uYW1lID0gIiBEaXNrT25DaGlwIEZpcm13YXJlIC8gTWVkaWEgSGVhZGVyIHBhcnRpdGlvbiI7CisJCXBhcnRzWzBdLm9mZnNldCA9IDA7CisJCXBhcnRzWzBdLnNpemUgPSBvZmZzOworCQludW1wYXJ0cyA9IDE7CiAJfQotCXJldCA9IDE7CisKKwlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBCRFRMIHBhcnRpdGlvbiI7CisJcGFydHNbbnVtcGFydHNdLm9mZnNldCA9IG9mZnM7CisJcGFydHNbbnVtcGFydHNdLnNpemUgPSAobWgtPk51bUVyYXNlVW5pdHMgLSBudW1oZWFkZXJzKSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQ7CisKKwlvZmZzICs9IHBhcnRzW251bXBhcnRzXS5zaXplOworCW51bXBhcnRzKys7CisKKwlpZiAob2ZmcyA8IG10ZC0+c2l6ZSkgeworCQlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBSZW1haW5kZXIgcGFydGl0aW9uIjsKKwkJcGFydHNbbnVtcGFydHNdLm9mZnNldCA9IG9mZnM7CisJCXBhcnRzW251bXBhcnRzXS5zaXplID0gbXRkLT5zaXplIC0gb2ZmczsKKwkJbnVtcGFydHMrKzsKKwl9CisKKwlyZXQgPSBudW1wYXJ0czsKIG91dDoKIAlrZnJlZShidWYpOwogCXJldHVybiByZXQ7CkBAIC0xMjMzLDggKzEyNTIsNiBAQAogCW1oLT5Gb3JtYXRGbGFncyA9IGxlMzJfdG9fY3B1KG1oLT5Gb3JtYXRGbGFncyk7CiAJbWgtPlBlcmNlbnRVc2VkID0gbGUzMl90b19jcHUobWgtPlBlcmNlbnRVc2VkKTsKICAKLS8vI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotLy8JaWYgKENPTkZJR19NVERfREVCVUdfVkVSQk9TRSA+PSAyKQogCXByaW50ayhLRVJOX0lORk8gIiAgICBib290UmVjb3JkSUQgICAgICAgICAgPSAlc1xuIgogCQkJICIgICAgTm9PZkJvb3RJbWFnZUJsb2NrcyAgID0gJWRcbiIKIAkJCSAiICAgIE5vT2ZCaW5hcnlQYXJ0aXRpb25zICA9ICVkXG4iCkBAIC0xMjUyLDcgKzEyNjksNiBAQAogCQkoKHVuc2lnbmVkIGNoYXIgKikgJm1oLT5Pc2FrVmVyc2lvbilbMl0gJiAweGYsCiAJCSgodW5zaWduZWQgY2hhciAqKSAmbWgtPk9zYWtWZXJzaW9uKVszXSAmIDB4ZiwKIAkJbWgtPlBlcmNlbnRVc2VkKTsKLS8vI2VuZGlmCiAKIAl2c2hpZnQgPSB0aGlzLT5waHlzX2VyYXNlX3NoaWZ0ICsgbWgtPkJsb2NrTXVsdGlwbGllckJpdHM7CiAKQEAgLTEyNzgsOCArMTI5NCw2IEBACiAJCWlwLT5zcGFyZVVuaXRzID0gbGUzMl90b19jcHUoaXAtPnNwYXJlVW5pdHMpOwogCQlpcC0+UmVzZXJ2ZWQwID0gbGUzMl90b19jcHUoaXAtPlJlc2VydmVkMCk7CiAKLS8vI2lmZGVmIENPTkZJR19NVERfREVCVUdfVkVSQk9TRQotLy8JCWlmIChDT05GSUdfTVREX0RFQlVHX1ZFUkJPU0UgPj0gMikKIAkJcHJpbnRrKEtFUk5fSU5GTwkiICAgIFBBUlRJVElPTlslZF0gLT5cbiIKIAkJCSIgICAgICAgIHZpcnR1YWxVbml0cyAgICA9ICVkXG4iCiAJCQkiICAgICAgICBmaXJzdFVuaXQgICAgICAgPSAlZFxuIgpAQCAtMTI4OSwxNiArMTMwMywxNCBAQAogCQkJaSwgaXAtPnZpcnR1YWxVbml0cywgaXAtPmZpcnN0VW5pdCwKIAkJCWlwLT5sYXN0VW5pdCwgaXAtPmZsYWdzLAogCQkJaXAtPnNwYXJlVW5pdHMpOwotLy8jZW5kaWYKIAotLyoKLQkJaWYgKChpID09IDApICYmIChpcC0+Zmlyc3RVbml0ID4gMCkpIHsKKwkJaWYgKChzaG93X2Zpcm13YXJlX3BhcnRpdGlvbiA9PSAxKSAmJgorCQkgICAgKGkgPT0gMCkgJiYgKGlwLT5maXJzdFVuaXQgPiAwKSkgewogCQkJcGFydHNbMF0ubmFtZSA9ICIgRGlza09uQ2hpcCBJUEwgLyBNZWRpYSBIZWFkZXIgcGFydGl0aW9uIjsKIAkJCXBhcnRzWzBdLm9mZnNldCA9IDA7CiAJCQlwYXJ0c1swXS5zaXplID0gbXRkLT5lcmFzZXNpemUgKiBpcC0+Zmlyc3RVbml0OwogCQkJbnVtcGFydHMgPSAxOwogCQl9Ci0qLwogCiAJCWlmIChpcC0+ZmxhZ3MgJiBJTkZUTF9CSU5BUlkpCiAJCQlwYXJ0c1tudW1wYXJ0c10ubmFtZSA9ICIgRGlza09uQ2hpcCBCREsgcGFydGl0aW9uIjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCmluZGV4IDQ0ZDViMTIuLjFiZDcxYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwpAQCAtMjgsNiArMjgsMjQgQEAKICAqCQlhbW9uZyBtdWx0aXBsZSBpbmRlcGVuZGVuZCBkZXZpY2VzLiBTdWdnZXN0aW9ucyBhbmQgaW5pdGlhbCBwYXRjaAogICoJCWZyb20gQmVuIERvb2tzIDxiZW4tbXRkQGZsdWZmLm9yZz4KICAqCisgKiAgMTItMDUtMjAwNAlkbWFybGluOiBhZGQgd29ya2Fyb3VuZCBmb3IgUmVuZXNhcyBBRy1BTkQgY2hpcHMgImRpc3R1cmIiIGlzc3VlLgorICoJCUJhc2ljYWxseSwgYW55IGJsb2NrIG5vdCByZXdyaXR0ZW4gbWF5IGxvc2UgZGF0YSB3aGVuIHN1cnJvdW5kaW5nIGJsb2NrcworICoJCWFyZSByZXdyaXR0ZW4gbWFueSB0aW1lcy4gIEpGRlMyIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbiBmb3IgYmxvY2tzIAorICoJCWl0IHVzZXMsIGJ1dCB0aGUgQmFkIEJsb2NrIFRhYmxlKHMpIG1heSBub3QgYmUgcmV3cml0dGVuLiAgVG8gZW5zdXJlIHRoZXkKKyAqCQlkbyBub3QgbG9zZSBkYXRhLCBmb3JjZSB0aGVtIHRvIGJlIHJld3JpdHRlbiB3aGVuIHNvbWUgb2YgdGhlIHN1cnJvdW5kaW5nCisgKgkJYmxvY2tzIGFyZSBlcmFzZWQuICBSYXRoZXIgdGhhbiB0cmFja2luZyBhIHNwZWNpZmljIG5lYXJieSBibG9jayAod2hpY2ggCisgKgkJY291bGQgaXRzZWxmIGdvIGJhZCksIHVzZSBhIHBhZ2UgYWRkcmVzcyAnbWFzaycgdG8gc2VsZWN0IHNldmVyYWwgYmxvY2tzIAorICoJCWluIHRoZSBzYW1lIGFyZWEsIGFuZCByZXdyaXRlIHRoZSBCQlQgd2hlbiBhbnkgb2YgdGhlbSBhcmUgZXJhc2VkLgorICoKKyAqICAwMS0wMy0yMDA1CWRtYXJsaW46IGFkZGVkIHN1cHBvcnQgZm9yIHRoZSBkZXZpY2UgcmVjb3ZlcnkgY29tbWFuZCBzZXF1ZW5jZSBmb3IgUmVuZXNhcyAKKyAqCQlBRy1BTkQgY2hpcHMuICBJZiB0aGVyZSB3YXMgYSBzdWRkZW4gbG9zcyBvZiBwb3dlciBkdXJpbmcgYW4gZXJhc2Ugb3BlcmF0aW9uLAorICogCQlhICJkZXZpY2UgcmVjb3ZlcnkiIG9wZXJhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCB3aGVuIHBvd2VyIGlzIHJlc3RvcmVkCisgKiAJCXRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbi4KKyAqCisgKiAgMDEtMjAtMjAwNQlkbWFybGluOiBhZGRlZCBzdXBwb3J0IGZvciBvcHRpb25hbCBoYXJkd2FyZSBzcGVjaWZpYyBjYWxsYmFjayByb3V0aW5lIHRvIAorICoJCXBlcmZvcm0gZXh0cmEgZXJyb3Igc3RhdHVzIGNoZWNrcyBvbiBlcmFzZSBhbmQgd3JpdGUgZmFpbHVyZXMuICBUaGlzIHJlcXVpcmVkCisgKgkJYWRkaW5nIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgbmFuZF9yZWFkX2VjYy4KKyAqCiAgKiBDcmVkaXRzOgogICoJRGF2aWQgV29vZGhvdXNlIGZvciBhZGRpbmcgbXVsdGljaGlwIHN1cHBvcnQgIAogICoJCkBAIC00MSw3ICs1OSw3IEBACiAgKglUaGUgQUctQU5EIGNoaXBzIGhhdmUgbmljZSBmZWF0dXJlcyBmb3Igc3BlZWQgaW1wcm92ZW1lbnQsCiAgKgl3aGljaCBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuIFJlYWQgLyBwcm9ncmFtIDQgcGFnZXMgaW4gb25lIGdvLgogICoKLSAqICRJZDogbmFuZF9iYXNlLmMsdiAxLjEyNiAyMDA0LzEyLzEzIDExOjIyOjI1IGxhdmluZW4gRXhwICQKKyAqICRJZDogbmFuZF9iYXNlLmMsdiAxLjE0NiAyMDA1LzA2LzE3IDE1OjAyOjA2IGdsZWl4bmVyIEV4cCAkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xNDksMTcgKzE2NywyMSBAQAogCiAJLyogRGUtc2VsZWN0IHRoZSBOQU5EIGRldmljZSAqLwogCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOwotCS8qIERvIHdlIGhhdmUgYSBoYXJkd2FyZSBjb250cm9sbGVyID8gKi8KKwogCWlmICh0aGlzLT5jb250cm9sbGVyKSB7CisJCS8qIFJlbGVhc2UgdGhlIGNvbnRyb2xsZXIgYW5kIHRoZSBjaGlwICovCiAJCXNwaW5fbG9jaygmdGhpcy0+Y29udHJvbGxlci0+bG9jayk7CiAJCXRoaXMtPmNvbnRyb2xsZXItPmFjdGl2ZSA9IE5VTEw7CisJCXRoaXMtPnN0YXRlID0gRkxfUkVBRFk7CisJCXdha2VfdXAoJnRoaXMtPmNvbnRyb2xsZXItPndxKTsKIAkJc3Bpbl91bmxvY2soJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOworCX0gZWxzZSB7CisJCS8qIFJlbGVhc2UgdGhlIGNoaXAgKi8KKwkJc3Bpbl9sb2NrKCZ0aGlzLT5jaGlwX2xvY2spOworCQl0aGlzLT5zdGF0ZSA9IEZMX1JFQURZOworCQl3YWtlX3VwKCZ0aGlzLT53cSk7CisJCXNwaW5fdW5sb2NrKCZ0aGlzLT5jaGlwX2xvY2spOwogCX0KLQkvKiBSZWxlYXNlIHRoZSBjaGlwICovCi0Jc3Bpbl9sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKLQl0aGlzLT5zdGF0ZSA9IEZMX1JFQURZOwotCXdha2VfdXAgKCZ0aGlzLT53cSk7Ci0Jc3Bpbl91bmxvY2sgKCZ0aGlzLT5jaGlwX2xvY2spOwogfQogCiAvKioKQEAgLTQ0Myw3ICs0NjUsOCBAQAogCQogCS8qIEdldCBibG9jayBudW1iZXIgKi8KIAlibG9jayA9ICgoaW50KSBvZnMpID4+IHRoaXMtPmJidF9lcmFzZV9zaGlmdDsKLQl0aGlzLT5iYnRbYmxvY2sgPj4gMl0gfD0gMHgwMSA8PCAoKGJsb2NrICYgMHgwMykgPDwgMSk7CisJaWYgKHRoaXMtPmJidCkKKwkJdGhpcy0+YmJ0W2Jsb2NrID4+IDJdIHw9IDB4MDEgPDwgKChibG9jayAmIDB4MDMpIDw8IDEpOwogCiAJLyogRG8gd2UgaGF2ZSBhIGZsYXNoIGJhc2VkIGJhZCBibG9jayB0YWJsZSA/ICovCiAJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1VTRV9GTEFTSF9CQlQpCkBAIC00NjYsNyArNDg5LDcgQEAKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCS8qIENoZWNrIHRoZSBXUCBiaXQgKi8KIAl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVUywgLTEsIC0xKTsKLQlyZXR1cm4gKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg4MCkgPyAwIDogMTsgCisJcmV0dXJuICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1dQKSA/IDAgOiAxOyAKIH0KIAogLyoqCkBAIC00OTAsNiArNTEzLDIyIEBACiAJcmV0dXJuIG5hbmRfaXNiYWRfYmJ0IChtdGQsIG9mcywgYWxsb3diYnQpOwogfQogCisvKiAKKyAqIFdhaXQgZm9yIHRoZSByZWFkeSBwaW4sIGFmdGVyIGEgY29tbWFuZAorICogVGhlIHRpbWVvdXQgaXMgY2F0Y2hlZCBsYXRlci4KKyAqLworc3RhdGljIHZvaWQgbmFuZF93YWl0X3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJdW5zaWduZWQgbG9uZwl0aW1lbyA9IGppZmZpZXMgKyAyOworCisJLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCBvciB0aW1lb3V0IG9jY3VyZXMgKi8KKwlkbyB7CisJCWlmICh0aGlzLT5kZXZfcmVhZHkobXRkKSkKKwkJCXJldHVybjsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lbykpOwkKK30KKwogLyoqCiAgKiBuYW5kX2NvbW1hbmQgLSBbREVGQVVMVF0gU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtNTcxLDcgKzYxMCw3IEBACiAJCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CiAJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBOQU5EX0NNRF9TVEFUVVMpOwogCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiAweDQwKSk7CisJCXdoaWxlICggISh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1JFQURZKSk7CiAJCXJldHVybjsKIAogCS8qIFRoaXMgYXBwbGllcyB0byByZWFkIGNvbW1hbmRzICovCQpAQCAtNTg1LDEyICs2MjQsMTEgQEAKIAkJCXJldHVybjsKIAkJfQkKIAl9Ci0JCiAJLyogQXBwbHkgdGhpcyBzaG9ydCBkZWxheSBhbHdheXMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gd2FpdCB0V0IgaW4KIAkgKiBhbnkgY2FzZSBvbiBhbnkgbWFjaGluZS4gKi8KIAluZGVsYXkgKDEwMCk7Ci0JLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLwotCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOworCisJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiB9CiAKIC8qKgpAQCAtNjE5LDcgKzY1Nyw3IEBACiAJLyogQmVnaW4gY29tbWFuZCBsYXRjaCBjeWNsZSAqLwogCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7CiAJLyogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuICovCi0JdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbW1hbmQpOworCXRoaXMtPndyaXRlX2J5dGUobXRkLCAoY29tbWFuZCAmIDB4ZmYpKTsKIAkvKiBFbmQgY29tbWFuZCBsYXRjaCBjeWNsZSAqLwogCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7CiAKQEAgLTY0Nyw4ICs2ODUsOCBAQAogCQogCS8qIAogCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgCi0JICogc3RhdHVzIGFuZCBzZXF1ZW50aWFsIGluIG5lZWRzIG5vIGRlbGF5Ci0JKi8KKwkgKiBzdGF0dXMsIHNlcXVlbnRpYWwgaW4sIGFuZCBkZXBsZXRlMSBuZWVkIG5vIGRlbGF5CisJICovCiAJc3dpdGNoIChjb21tYW5kKSB7CiAJCQkKIAljYXNlIE5BTkRfQ01EX0NBQ0hFRFBST0c6CkBAIC02NTcsOCArNjk1LDE5IEBACiAJY2FzZSBOQU5EX0NNRF9FUkFTRTI6CiAJY2FzZSBOQU5EX0NNRF9TRVFJTjoKIAljYXNlIE5BTkRfQ01EX1NUQVRVUzoKKwljYXNlIE5BTkRfQ01EX0RFUExFVEUxOgogCQlyZXR1cm47CiAKKwkvKiAKKwkgKiByZWFkIGVycm9yIHN0YXR1cyBjb21tYW5kcyByZXF1aXJlIG9ubHkgYSBzaG9ydCBkZWxheQorCSAqLworCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SOgorCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMDoKKwljYXNlIE5BTkRfQ01EX1NUQVRVU19FUlJPUjE6CisJY2FzZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IyOgorCWNhc2UgTkFORF9DTURfU1RBVFVTX0VSUk9SMzoKKwkJdWRlbGF5KHRoaXMtPmNoaXBfZGVsYXkpOworCQlyZXR1cm47CiAKIAljYXNlIE5BTkRfQ01EX1JFU0VUOgogCQlpZiAodGhpcy0+ZGV2X3JlYWR5KQkKQEAgLTY2Nyw3ICs3MTYsNyBAQAogCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwogCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKIAkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOworCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiBOQU5EX1NUQVRVU19SRUFEWSkpOwogCQlyZXR1cm47CiAKIAljYXNlIE5BTkRfQ01EX1JFQUQwOgpAQCAtNjkwLDEyICs3MzksMTIgQEAKIAkJCXJldHVybjsKIAkJfQkKIAl9Ci0JCisKIAkvKiBBcHBseSB0aGlzIHNob3J0IGRlbGF5IGFsd2F5cyB0byBlbnN1cmUgdGhhdCB3ZSBkbyB3YWl0IHRXQiBpbgogCSAqIGFueSBjYXNlIG9uIGFueSBtYWNoaW5lLiAqLwogCW5kZWxheSAoMTAwKTsKLQkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkICovCi0Jd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CisKKwluYW5kX3dhaXRfcmVhZHkobXRkKTsKIH0KIAogLyoqCkBAIC03MDgsMzcgKzc1NywzNCBAQAogICovCiBzdGF0aWMgdm9pZCBuYW5kX2dldF9kZXZpY2UgKHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbmV3X3N0YXRlKQogewotCXN0cnVjdCBuYW5kX2NoaXAgKmFjdGl2ZSA9IHRoaXM7Ci0KKwlzdHJ1Y3QgbmFuZF9jaGlwICphY3RpdmU7CisJc3BpbmxvY2tfdCAqbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CiAJREVDTEFSRV9XQUlUUVVFVUUgKHdhaXQsIGN1cnJlbnQpOwogCi0JLyogCi0JICogR3JhYiB0aGUgbG9jayBhbmQgc2VlIGlmIHRoZSBkZXZpY2UgaXMgYXZhaWxhYmxlIAotCSovCisJbG9jayA9ICh0aGlzLT5jb250cm9sbGVyKSA/ICZ0aGlzLT5jb250cm9sbGVyLT5sb2NrIDogJnRoaXMtPmNoaXBfbG9jazsKKwl3cSA9ICh0aGlzLT5jb250cm9sbGVyKSA/ICZ0aGlzLT5jb250cm9sbGVyLT53cSA6ICZ0aGlzLT53cTsKIHJldHJ5OgorCWFjdGl2ZSA9IHRoaXM7CisJc3Bpbl9sb2NrKGxvY2spOworCiAJLyogSGFyZHdhcmUgY29udHJvbGxlciBzaGFyZWQgYW1vbmcgaW5kZXBlbmRlbmQgZGV2aWNlcyAqLwogCWlmICh0aGlzLT5jb250cm9sbGVyKSB7Ci0JCXNwaW5fbG9jayAoJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOwogCQlpZiAodGhpcy0+Y29udHJvbGxlci0+YWN0aXZlKQogCQkJYWN0aXZlID0gdGhpcy0+Y29udHJvbGxlci0+YWN0aXZlOwogCQllbHNlCiAJCQl0aGlzLT5jb250cm9sbGVyLT5hY3RpdmUgPSB0aGlzOwotCQlzcGluX3VubG9jayAoJnRoaXMtPmNvbnRyb2xsZXItPmxvY2spOwogCX0KLQkKLQlpZiAoYWN0aXZlID09IHRoaXMpIHsKLQkJc3Bpbl9sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKLQkJaWYgKHRoaXMtPnN0YXRlID09IEZMX1JFQURZKSB7Ci0JCQl0aGlzLT5zdGF0ZSA9IG5ld19zdGF0ZTsKLQkJCXNwaW5fdW5sb2NrICgmdGhpcy0+Y2hpcF9sb2NrKTsKLQkJCXJldHVybjsKLQkJfQotCX0JCi0Jc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQlhZGRfd2FpdF9xdWV1ZSAoJmFjdGl2ZS0+d3EsICZ3YWl0KTsKLQlzcGluX3VubG9jayAoJmFjdGl2ZS0+Y2hpcF9sb2NrKTsKLQlzY2hlZHVsZSAoKTsKLQlyZW1vdmVfd2FpdF9xdWV1ZSAoJmFjdGl2ZS0+d3EsICZ3YWl0KTsKKwlpZiAoYWN0aXZlID09IHRoaXMgJiYgdGhpcy0+c3RhdGUgPT0gRkxfUkVBRFkpIHsKKwkJdGhpcy0+c3RhdGUgPSBuZXdfc3RhdGU7CisJCXNwaW5fdW5sb2NrKGxvY2spOworCQlyZXR1cm47CisJfQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSh3cSwgJndhaXQpOworCXNwaW5fdW5sb2NrKGxvY2spOworCXNjaGVkdWxlKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUod3EsICZ3YWl0KTsKIAlnb3RvIHJldHJ5OwogfQogCkBAIC03ODUsNyArODMxLDcgQEAKIAkJCWlmICh0aGlzLT5yZWFkX2J5dGUobXRkKSAmIE5BTkRfU1RBVFVTX1JFQURZKQogCQkJCWJyZWFrOwogCQl9Ci0JCXlpZWxkICgpOworCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAJc3RhdHVzID0gKGludCkgdGhpcy0+cmVhZF9ieXRlKG10ZCk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTg3MSw4ICs5MTcsMTQgQEAKIAlpZiAoIWNhY2hlZCkgewogCQkvKiBjYWxsIHdhaXQgcmVhZHkgZnVuY3Rpb24gKi8KIAkJc3RhdHVzID0gdGhpcy0+d2FpdGZ1bmMgKG10ZCwgdGhpcywgRkxfV1JJVElORyk7CisKKwkJLyogU2VlIGlmIG9wZXJhdGlvbiBmYWlsZWQgYW5kIGFkZGl0aW9uYWwgc3RhdHVzIGNoZWNrcyBhcmUgYXZhaWxhYmxlICovCisJCWlmICgoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgJiYgKHRoaXMtPmVycnN0YXQpKSB7CisJCQlzdGF0dXMgPSB0aGlzLT5lcnJzdGF0KG10ZCwgdGhpcywgRkxfV1JJVElORywgc3RhdHVzLCBwYWdlKTsKKwkJfQorCiAJCS8qIFNlZSBpZiBkZXZpY2UgdGhpbmtzIGl0IHN1Y2NlZWRlZCAqLwotCQlpZiAoc3RhdHVzICYgMHgwMSkgeworCQlpZiAoc3RhdHVzICYgTkFORF9TVEFUVVNfRkFJTCkgewogCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICIlczogIiAiRmFpbGVkIHdyaXRlLCBwYWdlIDB4JTA4eCwgIiwgX19GVU5DVElPTl9fLCBwYWdlKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CkBAIC05NzUsNyArMTAyNyw3IEBACiAJCWlmICghdGhpcy0+ZGV2X3JlYWR5KSAKIAkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7CiAJCWVsc2UKLQkJCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwkKKwkJCW5hbmRfd2FpdF9yZWFkeShtdGQpOwogCiAJCS8qIEFsbCBkb25lLCByZXR1cm4gaGFwcHkgKi8KIAkJaWYgKCFudW1wYWdlcykKQEAgLTk5NywyMyArMTA0OSwyNCBAQAogI2VuZGlmCiAKIC8qKgotICogbmFuZF9yZWFkIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9yZWFkX2VjYworICogbmFuZF9yZWFkIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9kb19yZWFkX2VjYwogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAogICogQHJldGxlbjoJcG9pbnRlciB0byB2YXJpYWJsZSB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHJlYWQgYnl0ZXMKICAqIEBidWY6CXRoZSBkYXRhYnVmZmVyIHRvIHB1dCBkYXRhCiAgKgotICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgbmFuZF9yZWFkX2VjYyB3aXRoIG9vYiBidWZmZXIgYW5kIG9vYnNlbCA9IE5VTEwKLSovCisgKiBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBuYW5kX2RvX3JlYWRfZWNjIHdpdGggb29iIGJ1ZmZlciBhbmQgb29ic2VsID0gTlVMTAorICogYW5kIGZsYWdzID0gMHhmZgorICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1ZikKIHsKLQlyZXR1cm4gbmFuZF9yZWFkX2VjYyAobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCBOVUxMKTsKLX0JCQkgICAKKwlyZXR1cm4gbmFuZF9kb19yZWFkX2VjYyAobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCAmbXRkLT5vb2JpbmZvLCAweGZmKTsKK30KIAogCiAvKioKLSAqIG5hbmRfcmVhZF9lY2MgLSBbTVREIEludGVyZmFjZV0gUmVhZCBkYXRhIHdpdGggRUNDCisgKiBuYW5kX3JlYWRfZWNjIC0gW01URCBJbnRlcmZhY2VdIE1URCBjb21wYWJpbGl0eSBmdW5jdGlvbiBmb3IgbmFuZF9kb19yZWFkX2VjYwogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBmcm9tOglvZmZzZXQgdG8gcmVhZCBmcm9tCiAgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZApAQCAtMTAyMiwxMSArMTA3NSwzOSBAQAogICogQG9vYl9idWY6CWZpbGVzeXN0ZW0gc3VwcGxpZWQgb29iIGRhdGEgYnVmZmVyCiAgKiBAb29ic2VsOglvb2Igc2VsZWN0aW9uIHN0cnVjdHVyZQogICoKLSAqIE5BTkQgcmVhZCB3aXRoIEVDQworICogVGhpcyBmdW5jdGlvbiBzaW1wbHkgY2FsbHMgbmFuZF9kb19yZWFkX2VjYyB3aXRoIGZsYWdzID0gMHhmZgogICovCiBzdGF0aWMgaW50IG5hbmRfcmVhZF9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKIAkJCSAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIG9vYl9idWYsIHN0cnVjdCBuYW5kX29vYmluZm8gKm9vYnNlbCkKIHsKKwkvKiB1c2UgdXNlcnNwYWNlIHN1cHBsaWVkIG9vYmluZm8sIGlmIHplcm8gKi8KKwlpZiAob29ic2VsID09IE5VTEwpCisJCW9vYnNlbCA9ICZtdGQtPm9vYmluZm87CisJcmV0dXJuIG5hbmRfZG9fcmVhZF9lY2MobXRkLCBmcm9tLCBsZW4sIHJldGxlbiwgYnVmLCBvb2JfYnVmLCBvb2JzZWwsIDB4ZmYpOworfQorCisKKy8qKgorICogbmFuZF9kb19yZWFkX2VjYyAtIFtNVEQgSW50ZXJmYWNlXSBSZWFkIGRhdGEgd2l0aCBFQ0MKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZnJvbToJb2Zmc2V0IHRvIHJlYWQgZnJvbQorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEByZXRsZW46CXBvaW50ZXIgdG8gdmFyaWFibGUgdG8gc3RvcmUgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzCisgKiBAYnVmOgl0aGUgZGF0YWJ1ZmZlciB0byBwdXQgZGF0YQorICogQG9vYl9idWY6CWZpbGVzeXN0ZW0gc3VwcGxpZWQgb29iIGRhdGEgYnVmZmVyIChjYW4gYmUgTlVMTCkKKyAqIEBvb2JzZWw6CW9vYiBzZWxlY3Rpb24gc3RydWN0dXJlCisgKiBAZmxhZ3M6CWZsYWcgdG8gaW5kaWNhdGUgaWYgbmFuZF9nZXRfZGV2aWNlL25hbmRfcmVsZWFzZV9kZXZpY2Ugc2hvdWxkIGJlIHByZWZvcm1lZAorICoJCWFuZCBob3cgbWFueSBjb3JyZWN0ZWQgZXJyb3IgYml0cyBhcmUgYWNjZXB0YWJsZToKKyAqCQkgIGJpdHMgMC4uNyAtIG51bWJlciBvZiB0b2xlcmFibGUgZXJyb3JzCisgKgkJICBiaXQgIDggICAgLSAwID09IGRvIG5vdCBnZXQvcmVsZWFzZSBjaGlwLCAxID09IGdldC9yZWxlYXNlIGNoaXAKKyAqCisgKiBOQU5EIHJlYWQgd2l0aCBFQ0MKKyAqLworaW50IG5hbmRfZG9fcmVhZF9lY2MgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwkJCSAgICAgc2l6ZV90ICogcmV0bGVuLCB1X2NoYXIgKiBidWYsIHVfY2hhciAqIG9vYl9idWYsIAorCQkJICAgICBzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvb2JzZWwsIGludCBmbGFncykKK3sKKwogCWludCBpLCBqLCBjb2wsIHJlYWxwYWdlLCBwYWdlLCBlbmQsIGVjYywgY2hpcG5yLCBzbmRjbWQgPSAxOwogCWludCByZWFkID0gMCwgb29iID0gMCwgZWNjX3N0YXR1cyA9IDAsIGVjY19mYWlsZWQgPSAwOwogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CkBAIC0xMDUxLDEyICsxMTMyLDkgQEAKIAl9CiAKIAkvKiBHcmFiIHRoZSBsb2NrIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgKi8KLQluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCAsRkxfUkVBRElORyk7CisJaWYgKGZsYWdzICYgTkFORF9HRVRfREVWSUNFKQorCQluYW5kX2dldF9kZXZpY2UgKHRoaXMsIG10ZCwgRkxfUkVBRElORyk7CiAKLQkvKiB1c2UgdXNlcnNwYWNlIHN1cHBsaWVkIG9vYmluZm8sIGlmIHplcm8gKi8KLQlpZiAob29ic2VsID09IE5VTEwpCi0JCW9vYnNlbCA9ICZtdGQtPm9vYmluZm87Ci0JCiAJLyogQXV0b3BsYWNlIG9mIG9vYiBkYXRhID8gVXNlIHRoZSBkZWZhdWx0IHBsYWNlbWVudCBzY2hlbWUgKi8KIAlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFKQogCQlvb2JzZWwgPSB0aGlzLT5hdXRvb29iOwpAQCAtMTExOCw3ICsxMTk2LDggQEAKIAkJfQkKIAogCQkvKiBnZXQgb29iIGFyZWEsIGlmIHdlIGhhdmUgbm8gb29iIGJ1ZmZlciBmcm9tIGZzLWRyaXZlciAqLwotCQlpZiAoIW9vYl9idWYgfHwgb29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFKQorCQlpZiAoIW9vYl9idWYgfHwgb29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMQUNFIHx8CisJCQlvb2JzZWwtPnVzZWVjYyA9PSBNVERfTkFOREVDQ19BVVRPUExfVVNSKQogCQkJb29iX2RhdGEgPSAmdGhpcy0+ZGF0YV9idWZbZW5kXTsKIAogCQllY2NzdGVwcyA9IHRoaXMtPmVjY3N0ZXBzOwpAQCAtMTE1NSw3ICsxMjM0LDggQEAKIAkJCQkJLyogV2UgY2FsYyBlcnJvciBjb3JyZWN0aW9uIGRpcmVjdGx5LCBpdCBjaGVja3MgdGhlIGh3CiAJCQkJCSAqIGdlbmVyYXRvciBmb3IgYW4gZXJyb3IsIHJlYWRzIGJhY2sgdGhlIHN5bmRyb21lIGFuZAogCQkJCQkgKiBkb2VzIHRoZSBlcnJvciBjb3JyZWN0aW9uIG9uIHRoZSBmbHkgKi8KLQkJCQkJaWYgKHRoaXMtPmNvcnJlY3RfZGF0YShtdGQsICZkYXRhX3BvaVtkYXRpZHhdLCAmb29iX2RhdGFbaV0sICZlY2NfY29kZVtpXSkgPT0gLTEpIHsKKwkJCQkJZWNjX3N0YXR1cyA9IHRoaXMtPmNvcnJlY3RfZGF0YShtdGQsICZkYXRhX3BvaVtkYXRpZHhdLCAmb29iX2RhdGFbaV0sICZlY2NfY29kZVtpXSk7CisJCQkJCWlmICgoZWNjX3N0YXR1cyA9PSAtMSkgfHwgKGVjY19zdGF0dXMgPiAoZmxhZ3MgJiYgMHhmZikpKSB7CiAJCQkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfcmVhZF9lY2M6ICIgCiAJCQkJCQkJIkZhaWxlZCBFQ0MgcmVhZCwgcGFnZSAweCUwOHggb24gY2hpcCAlZFxuIiwgcGFnZSwgY2hpcG5yKTsKIAkJCQkJCWVjY19mYWlsZWQrKzsKQEAgLTExOTQsNyArMTI3NCw3IEBACiAJCQkJcFtpXSA9IGVjY19zdGF0dXM7CiAJCQl9CiAJCQkKLQkJCWlmIChlY2Nfc3RhdHVzID09IC0xKSB7CQorCQkJaWYgKChlY2Nfc3RhdHVzID09IC0xKSB8fCAoZWNjX3N0YXR1cyA+IChmbGFncyAmJiAweGZmKSkpIHsJCiAJCQkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJuYW5kX3JlYWRfZWNjOiAiICJGYWlsZWQgRUNDIHJlYWQsIHBhZ2UgMHglMDh4XG4iLCBwYWdlKTsKIAkJCQllY2NfZmFpbGVkKys7CiAJCQl9CkBAIC0xMjA2LDE0ICsxMjg2LDE0IEBACiAJCQkvKiB3aXRob3V0IGF1dG9wbGFjZS4gTGVnYWN5IG1vZGUgdXNlZCBieSBZQUZGUzEgKi8KIAkJCXN3aXRjaChvb2JzZWwtPnVzZWVjYykgewogCQkJY2FzZSBNVERfTkFOREVDQ19BVVRPUExBQ0U6CisJCQljYXNlIE1URF9OQU5ERUNDX0FVVE9QTF9VU1I6CiAJCQkJLyogV2FsayB0aHJvdWdoIHRoZSBhdXRvcGxhY2UgY2h1bmtzICovCi0JCQkJZm9yIChpID0gMCwgaiA9IDA7IGogPCBtdGQtPm9vYmF2YWlsOyBpKyspIHsKKwkJCQlmb3IgKGkgPSAwOyBvb2JzZWwtPm9vYmZyZWVbaV1bMV07IGkrKykgewogCQkJCQlpbnQgZnJvbSA9IG9vYnNlbC0+b29iZnJlZVtpXVswXTsKIAkJCQkJaW50IG51bSA9IG9vYnNlbC0+b29iZnJlZVtpXVsxXTsKIAkJCQkJbWVtY3B5KCZvb2JfYnVmW29vYl0sICZvb2JfZGF0YVtmcm9tXSwgbnVtKTsKLQkJCQkJais9IG51bTsKKwkJCQkJb29iICs9IG51bTsKIAkJCQl9Ci0JCQkJb29iICs9IG10ZC0+b29iYXZhaWw7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1URF9OQU5ERUNDX1BMQUNFOgogCQkJCS8qIFlBRkZTMSBsZWdhY3kgbW9kZSAqLwpAQCAtMTIzOSw3ICsxMzE5LDcgQEAKIAkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIAogCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKIAkJZWxzZQotCQkJd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CQorCQkJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiAJCQkKIAkJaWYgKHJlYWQgPT0gbGVuKQogCQkJYnJlYWs7CQpAQCAtMTI2NCw3ICsxMzQ0LDggQEAKIAl9CiAKIAkvKiBEZXNlbGVjdCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgZGV2aWNlICovCi0JbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOworCWlmIChmbGFncyAmIE5BTkRfR0VUX0RFVklDRSkKKwkJbmFuZF9yZWxlYXNlX2RldmljZShtdGQpOwogCiAJLyoKIAkgKiBSZXR1cm4gc3VjY2VzcywgaWYgbm8gRUNDIGZhaWx1cmVzLCBlbHNlIC1FQkFETVNHCkBAIC0xMzM3LDcgKzE0MTgsNyBAQAogCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkgCiAJCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOwogCQllbHNlCi0JCQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsJCisJCQluYW5kX3dhaXRfcmVhZHkobXRkKTsKIAogCQkvKiBSZWFkIG1vcmUgPyAqLwogCQlpZiAoaSA8IGxlbikgewpAQCAtMTQxNyw3ICsxNDk4LDcgQEAKIAkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIAogCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKIAkJZWxzZQotCQkJd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7CQorCQkJbmFuZF93YWl0X3JlYWR5KG10ZCk7CiAJCQkKIAkJLyogQ2hlY2ssIGlmIHRoZSBjaGlwIHN1cHBvcnRzIGF1dG8gcGFnZSBpbmNyZW1lbnQgKi8gCiAJCWlmICghTkFORF9DQU5BVVRPSU5DUih0aGlzKSB8fCAhKHBhZ2UgJiBibG9ja2NoZWNrKSkKQEAgLTE1NjcsNiArMTY0OCw4IEBACiAJCW9vYnNlbCA9IHRoaXMtPmF1dG9vb2I7CiAJCWF1dG9wbGFjZSA9IDE7CiAJfQkKKwlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKKwkJYXV0b3BsYWNlID0gMTsKIAogCS8qIFNldHVwIHZhcmlhYmxlcyBhbmQgb29iIGJ1ZmZlciAqLwogCXRvdGFscGFnZXMgPSBsZW4gPj4gdGhpcy0+cGFnZV9zaGlmdDsKQEAgLTE3MzMsNyArMTgxNiw3IEBACiAJc3RhdHVzID0gdGhpcy0+d2FpdGZ1bmMgKG10ZCwgdGhpcywgRkxfV1JJVElORyk7CiAKIAkvKiBTZWUgaWYgZGV2aWNlIHRoaW5rcyBpdCBzdWNjZWVkZWQgKi8KLQlpZiAoc3RhdHVzICYgMHgwMSkgeworCWlmIChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKSB7CiAJCURFQlVHIChNVERfREVCVUdfTEVWRUwwLCAibmFuZF93cml0ZV9vb2I6ICIgIkZhaWxlZCB3cml0ZSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOwogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dDsKQEAgLTE4NDEsNiArMTkyNCw4IEBACiAJCW9vYnNlbCA9IHRoaXMtPmF1dG9vb2I7CiAJCWF1dG9wbGFjZSA9IDE7CiAJfQkKKwlpZiAob29ic2VsLT51c2VlY2MgPT0gTVREX05BTkRFQ0NfQVVUT1BMX1VTUikKKwkJYXV0b3BsYWNlID0gMTsKIAogCS8qIFNldHVwIHN0YXJ0IHBhZ2UgKi8KIAlwYWdlID0gKGludCkgKHRvID4+IHRoaXMtPnBhZ2Vfc2hpZnQpOwpAQCAtMTk4Nyw2ICsyMDcyLDcgQEAKIAlyZXR1cm4gbmFuZF9lcmFzZV9uYW5kIChtdGQsIGluc3RyLCAwKTsKIH0KICAKKyNkZWZpbmUgQkJUX1BBR0VfTUFTSwkweGZmZmZmZjNmCiAvKioKICAqIG5hbmRfZXJhc2VfaW50ZXJuIC0gW05BTkQgSW50ZXJmYWNlXSBlcmFzZSBibG9jayhzKQogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTE5OTksNiArMjA4NSwxMCBAQAogewogCWludCBwYWdlLCBsZW4sIHN0YXR1cywgcGFnZXNfcGVyX2Jsb2NrLCByZXQsIGNoaXBucjsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OworCWludCByZXdyaXRlX2JidFtOQU5EX01BWF9DSElQU109ezB9OwkvKiBmbGFncyB0byBpbmRpY2F0ZSB0aGUgcGFnZSwgaWYgYmJ0IG5lZWRzIHRvIGJlIHJld3JpdHRlbi4gKi8KKwl1bnNpZ25lZCBpbnQgYmJ0X21hc2tlZF9wYWdlOwkJLyogYmJ0IG1hc2sgdG8gY29tcGFyZSB0byBwYWdlIGJlaW5nIGVyYXNlZC4gKi8KKwkJCQkJCS8qIEl0IGlzIHVzZWQgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgaW4gdGhlIHNhbWUgKi8KKwkJCQkJCS8qICAgMjU2IGJsb2NrIGdyb3VwIGFuZCB0aGUgc2FtZSBiYW5rIGFzIHRoZSBiYnQuICovCiAKIAlERUJVRyAoTVREX0RFQlVHX0xFVkVMMywKIAkgICAgICAgIm5hbmRfZXJhc2U6IHN0YXJ0ID0gMHglMDh4LCBsZW4gPSAlaVxuIiwgKHVuc2lnbmVkIGludCkgaW5zdHItPmFkZHIsICh1bnNpZ25lZCBpbnQpIGluc3RyLT5sZW4pOwpAQCAtMjA0NCw2ICsyMTM0LDEzIEBACiAJCWdvdG8gZXJhc2VfZXhpdDsKIAl9CiAKKwkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCwgc2V0IHRoZSBCQlQgcGFnZSBtYXNrIHRvIHNlZSBpZiB0aGUgQkJUIHNob3VsZCBiZSByZXdyaXR0ZW4gKi8KKwlpZiAodGhpcy0+b3B0aW9ucyAmIEJCVF9BVVRPX1JFRlJFU0gpIHsKKwkJYmJ0X21hc2tlZF9wYWdlID0gdGhpcy0+YmJ0X3RkLT5wYWdlc1tjaGlwbnJdICYgQkJUX1BBR0VfTUFTSzsKKwl9IGVsc2UgeworCQliYnRfbWFza2VkX3BhZ2UgPSAweGZmZmZmZmZmOwkvKiBzaG91bGQgbm90IG1hdGNoIGFueXRoaW5nICovCisJfQorCiAJLyogTG9vcCB0aHJvdWdoIHRoZSBwYWdlcyAqLwogCWxlbiA9IGluc3RyLT5sZW47CiAKQEAgLTIwNjYsMTMgKzIxNjMsMjYgQEAKIAkJCiAJCXN0YXR1cyA9IHRoaXMtPndhaXRmdW5jIChtdGQsIHRoaXMsIEZMX0VSQVNJTkcpOwogCisJCS8qIFNlZSBpZiBvcGVyYXRpb24gZmFpbGVkIGFuZCBhZGRpdGlvbmFsIHN0YXR1cyBjaGVja3MgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAoKHN0YXR1cyAmIE5BTkRfU1RBVFVTX0ZBSUwpICYmICh0aGlzLT5lcnJzdGF0KSkgeworCQkJc3RhdHVzID0gdGhpcy0+ZXJyc3RhdChtdGQsIHRoaXMsIEZMX0VSQVNJTkcsIHN0YXR1cywgcGFnZSk7CisJCX0KKwogCQkvKiBTZWUgaWYgYmxvY2sgZXJhc2Ugc3VjY2VlZGVkICovCi0JCWlmIChzdGF0dXMgJiAweDAxKSB7CisJCWlmIChzdGF0dXMgJiBOQU5EX1NUQVRVU19GQUlMKSB7CiAJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfZXJhc2U6ICIgIkZhaWxlZCBlcmFzZSwgcGFnZSAweCUwOHhcbiIsIHBhZ2UpOwogCQkJaW5zdHItPnN0YXRlID0gTVREX0VSQVNFX0ZBSUxFRDsKIAkJCWluc3RyLT5mYWlsX2FkZHIgPSAocGFnZSA8PCB0aGlzLT5wYWdlX3NoaWZ0KTsKIAkJCWdvdG8gZXJhc2VfZXhpdDsKIAkJfQorCisJCS8qIGlmIEJCVCByZXF1aXJlcyByZWZyZXNoLCBzZXQgdGhlIEJCVCByZXdyaXRlIGZsYWcgdG8gdGhlIHBhZ2UgYmVpbmcgZXJhc2VkICovCisJCWlmICh0aGlzLT5vcHRpb25zICYgQkJUX0FVVE9fUkVGUkVTSCkgeworCQkJaWYgKCgocGFnZSAmIEJCVF9QQUdFX01BU0spID09IGJidF9tYXNrZWRfcGFnZSkgJiYgCisJCQkgICAgIChwYWdlICE9IHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSkpIHsKKwkJCQlyZXdyaXRlX2JidFtjaGlwbnJdID0gKHBhZ2UgPDwgdGhpcy0+cGFnZV9zaGlmdCk7CisJCQl9CisJCX0KIAkJCiAJCS8qIEluY3JlbWVudCBwYWdlIGFkZHJlc3MgYW5kIGRlY3JlbWVudCBsZW5ndGggKi8KIAkJbGVuIC09ICgxIDw8IHRoaXMtPnBoeXNfZXJhc2Vfc2hpZnQpOwpAQCAtMjA4Myw2ICsyMTkzLDEzIEBACiAJCQljaGlwbnIrKzsKIAkJCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgLTEpOwogCQkJdGhpcy0+c2VsZWN0X2NoaXAobXRkLCBjaGlwbnIpOworCisJCQkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCBhbmQgQkJULVBFUkNISVAsIAorCQkJICogICBzZXQgdGhlIEJCVCBwYWdlIG1hc2sgdG8gc2VlIGlmIHRoaXMgQkJUIHNob3VsZCBiZSByZXdyaXR0ZW4gKi8KKwkJCWlmICgodGhpcy0+b3B0aW9ucyAmIEJCVF9BVVRPX1JFRlJFU0gpICYmICh0aGlzLT5iYnRfdGQtPm9wdGlvbnMgJiBOQU5EX0JCVF9QRVJDSElQKSkgeworCQkJCWJidF9tYXNrZWRfcGFnZSA9IHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSAmIEJCVF9QQUdFX01BU0s7CisJCQl9CisKIAkJfQogCX0KIAlpbnN0ci0+c3RhdGUgPSBNVERfRVJBU0VfRE9ORTsKQEAgLTIwOTcsNiArMjIxNCwxOCBAQAogCS8qIERlc2VsZWN0IGFuZCB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIG9uIHRoZSBkZXZpY2UgKi8KIAluYW5kX3JlbGVhc2VfZGV2aWNlKG10ZCk7CiAKKwkvKiBpZiBCQlQgcmVxdWlyZXMgcmVmcmVzaCBhbmQgZXJhc2Ugd2FzIHN1Y2Nlc3NmdWwsIHJld3JpdGUgYW55IHNlbGVjdGVkIGJhZCBibG9jayB0YWJsZXMgKi8KKwlpZiAoKHRoaXMtPm9wdGlvbnMgJiBCQlRfQVVUT19SRUZSRVNIKSAmJiAoIXJldCkpIHsKKwkJZm9yIChjaGlwbnIgPSAwOyBjaGlwbnIgPCB0aGlzLT5udW1jaGlwczsgY2hpcG5yKyspIHsKKwkJCWlmIChyZXdyaXRlX2JidFtjaGlwbnJdKSB7CisJCQkJLyogdXBkYXRlIHRoZSBCQlQgZm9yIGNoaXAgKi8KKwkJCQlERUJVRyAoTVREX0RFQlVHX0xFVkVMMCwgIm5hbmRfZXJhc2VfbmFuZDogbmFuZF91cGRhdGVfYmJ0ICglZDoweCUweCAweCUweClcbiIsIAorCQkJCQljaGlwbnIsIHJld3JpdGVfYmJ0W2NoaXBucl0sIHRoaXMtPmJidF90ZC0+cGFnZXNbY2hpcG5yXSk7CisJCQkJbmFuZF91cGRhdGVfYmJ0IChtdGQsIHJld3JpdGVfYmJ0W2NoaXBucl0pOworCQkJfQorCQl9CisJfQorCiAJLyogUmV0dXJuIG1vcmUgb3IgbGVzcyBoYXBweSAqLwogCXJldHVybiByZXQ7CiB9CkBAIC0yMTY4LDcgKzIyOTcsNyBAQAogICovCiBpbnQgbmFuZF9zY2FuIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1heGNoaXBzKQogewotCWludCBpLCBqLCBuYW5kX21hZl9pZCwgbmFuZF9kZXZfaWQsIGJ1c3c7CisJaW50IGksIG5hbmRfbWFmX2lkLCBuYW5kX2Rldl9pZCwgYnVzdywgbWFmX2lkOwogCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CiAKIAkvKiBHZXQgYnVzd2lkdGggdG8gc2VsZWN0IHRoZSBjb3JyZWN0IGZ1bmN0aW9ucyovCkBAIC0yMjU2LDEyICsyMzg1LDE4IEBACiAJCQlidXN3ID0gbmFuZF9mbGFzaF9pZHNbaV0ub3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTY7CiAJCX0KIAorCQkvKiBUcnkgdG8gaWRlbnRpZnkgbWFudWZhY3R1cmVyICovCisJCWZvciAobWFmX2lkID0gMDsgbmFuZF9tYW51Zl9pZHNbbWFmX2lkXS5pZCAhPSAweDA7IG1hZl9pZCsrKSB7CisJCQlpZiAobmFuZF9tYW51Zl9pZHNbbWFmX2lkXS5pZCA9PSBuYW5kX21hZl9pZCkKKwkJCQlicmVhazsKKwkJfQorCiAJCS8qIENoZWNrLCBpZiBidXN3aWR0aCBpcyBjb3JyZWN0LiBIYXJkd2FyZSBkcml2ZXJzIHNob3VsZCBzZXQKIAkJICogdGhpcyBjb3JyZWN0ICEgKi8KIAkJaWYgKGJ1c3cgIT0gKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSkgewogCQkJcHJpbnRrIChLRVJOX0lORk8gIk5BTkQgZGV2aWNlOiBNYW51ZmFjdHVyZXIgSUQ6IgogCQkJCSIgMHglMDJ4LCBDaGlwIElEOiAweCUwMnggKCVzICVzKVxuIiwgbmFuZF9tYWZfaWQsIG5hbmRfZGV2X2lkLCAKLQkJCQluYW5kX21hbnVmX2lkc1tpXS5uYW1lICwgbXRkLT5uYW1lKTsKKwkJCQluYW5kX21hbnVmX2lkc1ttYWZfaWRdLm5hbWUgLCBtdGQtPm5hbWUpOwogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgCiAJCQkJIk5BTkQgYnVzIHdpZHRoICVkIGluc3RlYWQgJWQgYml0XG4iLCAKIAkJCQkJKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDE2IDogOCwKQEAgLTIzMDAsMTQgKzI0MzUsOSBAQAogCQlpZiAobXRkLT5vb2JibG9jayA+IDUxMiAmJiB0aGlzLT5jbWRmdW5jID09IG5hbmRfY29tbWFuZCkKIAkJCXRoaXMtPmNtZGZ1bmMgPSBuYW5kX2NvbW1hbmRfbHA7CiAJCQkJCi0JCS8qIFRyeSB0byBpZGVudGlmeSBtYW51ZmFjdHVyZXIgKi8KLQkJZm9yIChqID0gMDsgbmFuZF9tYW51Zl9pZHNbal0uaWQgIT0gMHgwOyBqKyspIHsKLQkJCWlmIChuYW5kX21hbnVmX2lkc1tqXS5pZCA9PSBuYW5kX21hZl9pZCkKLQkJCQlicmVhazsKLQkJfQogCQlwcmludGsgKEtFUk5fSU5GTyAiTkFORCBkZXZpY2U6IE1hbnVmYWN0dXJlciBJRDoiCiAJCQkiIDB4JTAyeCwgQ2hpcCBJRDogMHglMDJ4ICglcyAlcylcbiIsIG5hbmRfbWFmX2lkLCBuYW5kX2Rldl9pZCwgCi0JCQluYW5kX21hbnVmX2lkc1tqXS5uYW1lICwgbmFuZF9mbGFzaF9pZHNbaV0ubmFtZSk7CisJCQluYW5kX21hbnVmX2lkc1ttYWZfaWRdLm5hbWUgLCBuYW5kX2ZsYXNoX2lkc1tpXS5uYW1lKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMzg4LDEyICsyNTE4LDkgQEAKIAkKIAkvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgdGhlIGZpbGVzeXN0ZW0gdG8gcGxhY2UgZnMgZGVwZW5kZW5kCiAJICogb29iIGRhdGEgKi8KLQlpZiAodGhpcy0+b3B0aW9ucyAmIE5BTkRfQlVTV0lEVEhfMTYpIHsKLQkJbXRkLT5vb2JhdmFpbCA9IG10ZC0+b29ic2l6ZSAtICh0aGlzLT5hdXRvb29iLT5lY2NieXRlcyArIDIpOwotCQlpZiAodGhpcy0+YXV0b29vYi0+ZWNjYnl0ZXMgJiAweDAxKQotCQkJbXRkLT5vb2JhdmFpbC0tOwotCX0gZWxzZQotCQltdGQtPm9vYmF2YWlsID0gbXRkLT5vb2JzaXplIC0gKHRoaXMtPmF1dG9vb2ItPmVjY2J5dGVzICsgMSk7CisJbXRkLT5vb2JhdmFpbCA9IDA7CisJZm9yIChpID0gMDsgdGhpcy0+YXV0b29vYi0+b29iZnJlZVtpXVsxXTsgaSsrKQorCQltdGQtPm9vYmF2YWlsICs9IHRoaXMtPmF1dG9vb2ItPm9vYmZyZWVbaV1bMV07CiAKIAkvKiAKIAkgKiBjaGVjayBFQ0MgbW9kZSwgZGVmYXVsdCB0byBzb2Z0d2FyZQpAQCAtMjUyNCw2ICsyNjUxLDEwIEBACiAJbWVtY3B5KCZtdGQtPm9vYmluZm8sIHRoaXMtPmF1dG9vb2IsIHNpemVvZihtdGQtPm9vYmluZm8pKTsKIAogCW10ZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwkKKwkvKiBDaGVjaywgaWYgd2Ugc2hvdWxkIHNraXAgdGhlIGJhZCBibG9jayB0YWJsZSBzY2FuICovCisJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX1NLSVBfQkJUU0NBTikKKwkJcmV0dXJuIDA7CiAKIAkvKiBCdWlsZCBiYWQgYmxvY2sgdGFibGUgKi8KIAlyZXR1cm4gdGhpcy0+c2Nhbl9iYnQgKG10ZCk7CkBAIC0yNTU1LDggKzI2ODYsOCBAQAogCQlrZnJlZSAodGhpcy0+ZGF0YV9idWYpOwogfQogCi1FWFBPUlRfU1lNQk9MIChuYW5kX3NjYW4pOwotRVhQT1JUX1NZTUJPTCAobmFuZF9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0xfR1BMIChuYW5kX3NjYW4pOworRVhQT1JUX1NZTUJPTF9HUEwgKG5hbmRfcmVsZWFzZSk7CiAKIE1PRFVMRV9MSUNFTlNFICgiR1BMIik7CiBNT0RVTEVfQVVUSE9SICgiU3RldmVuIEouIEhpbGwgPHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20+LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYnQuYwppbmRleCA5YTE5NDk3Li41YWMyZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmJ0LmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2JidC5jCkBAIC02LDcgKzYsNyBAQAogICogICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQgVGhvbWFzIEdsZWl4bmVyICh0Z2x4QGxpbnV0cm9uaXguZGUpCiAgKgotICogJElkOiBuYW5kX2JidC5jLHYgMS4yOCAyMDA0LzExLzEzIDEwOjE5OjA5IGdsZWl4bmVyIEV4cCAkCisgKiAkSWQ6IG5hbmRfYmJ0LmMsdiAxLjMzIDIwMDUvMDYvMTQgMTU6NDc6NTYgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTc3LDcgKzc3LDcgQEAKICovCiBzdGF0aWMgaW50IGNoZWNrX3BhdHRlcm4gKHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgaW50IHBhZ2xlbiwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCkKIHsKLQlpbnQgaSwgZW5kOworCWludCBpLCBlbmQgPSAwOwogCXVpbnQ4X3QgKnAgPSBidWY7CiAKIAllbmQgPSBwYWdsZW4gKyB0ZC0+b2ZmczsKQEAgLTk1LDkgKzk1LDkgQEAKIAkJCXJldHVybiAtMTsKIAl9CiAKLQlwICs9IHRkLT5sZW47Ci0JZW5kICs9IHRkLT5sZW47CiAJaWYgKHRkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkVNUFRZKSB7CisJCXAgKz0gdGQtPmxlbjsKKwkJZW5kICs9IHRkLT5sZW47CiAJCWZvciAoaSA9IGVuZDsgaSA8IGxlbjsgaSsrKSB7CiAJCQlpZiAoKnArKyAhPSAweGZmKQogCQkJCXJldHVybiAtMTsKQEAgLTEwNiw2ICsxMDYsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyoqIAorICogY2hlY2tfc2hvcnRfcGF0dGVybiAtIFtHRU5FUklDXSBjaGVjayBpZiBhIHBhdHRlcm4gaXMgaW4gdGhlIGJ1ZmZlcgorICogQGJ1ZjoJdGhlIGJ1ZmZlciB0byBzZWFyY2gKKyAqIEBsZW46CXRoZSBsZW5ndGggb2YgYnVmZmVyIHRvIHNlYXJjaAorICogQHBhZ2xlbjoJdGhlIHBhZ2VsZW5ndGgKKyAqIEB0ZDoJCXNlYXJjaCBwYXR0ZXJuIGRlc2NyaXB0b3IKKyAqCisgKiBDaGVjayBmb3IgYSBwYXR0ZXJuIGF0IHRoZSBnaXZlbiBwbGFjZS4gVXNlZCB0byBzZWFyY2ggYmFkIGJsb2NrCisgKiB0YWJsZXMgYW5kIGdvb2QgLyBiYWQgYmxvY2sgaWRlbnRpZmllcnMuIFNhbWUgYXMgY2hlY2tfcGF0dGVybiwgYnV0IAorICogbm8gb3B0aW9uYWwgZW1wdHkgY2hlY2sgYW5kIHRoZSBwYXR0ZXJuIGlzIGV4cGVjdGVkIHRvIHN0YXJ0CisgKiBhdCBvZmZzZXQgMC4KKyAqCisqLworc3RhdGljIGludCBjaGVja19zaG9ydF9wYXR0ZXJuICh1aW50OF90ICpidWYsIGludCBsZW4sIGludCBwYWdsZW4sIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqdGQpCit7CisJaW50IGk7CisJdWludDhfdCAqcCA9IGJ1ZjsKKworCS8qIENvbXBhcmUgdGhlIHBhdHRlcm4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGQtPmxlbjsgaSsrKSB7CisJCWlmIChwW2ldICE9IHRkLT5wYXR0ZXJuW2ldKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiByZWFkX2JidCAtIFtHRU5FUklDXSBSZWFkIHRoZSBiYWQgYmxvY2sgdGFibGUgc3RhcnRpbmcgZnJvbSBwYWdlCiAgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMjUyLDcgKzI3OCw3IEBACiAgKiBDcmVhdGUgYSBiYWQgYmxvY2sgdGFibGUgYnkgc2Nhbm5pbmcgdGhlIGRldmljZQogICogZm9yIHRoZSBnaXZlbiBnb29kL2JhZCBibG9jayBpZGVudGlmeSBwYXR0ZXJuCiAgKi8KLXN0YXRpYyB2b2lkIGNyZWF0ZV9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIHN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQsIGludCBjaGlwKQorc3RhdGljIGludCBjcmVhdGVfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdWludDhfdCAqYnVmLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkLCBpbnQgY2hpcCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCWludCBpLCBqLCBudW1ibG9ja3MsIGxlbiwgc2NhbmxlbjsKQEAgLTI3MCw5ICsyOTYsMTcgQEAKIAkJZWxzZQkKIAkJCWxlbiA9IDE7CiAJfQotCXNjYW5sZW4JPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOwotCXJlYWRsZW4gPSBsZW4gKiBtdGQtPm9vYmJsb2NrOwotCW9vYmxlbiA9IGxlbiAqIG10ZC0+b29ic2l6ZTsKKworCWlmICghKGJkLT5vcHRpb25zICYgTkFORF9CQlRfU0NBTkVNUFRZKSkgeworCQkvKiBXZSBuZWVkIG9ubHkgcmVhZCBmZXcgYnl0ZXMgZnJvbSB0aGUgT09CIGFyZWEgKi8KKwkJc2NhbmxlbiA9IG9vYmxlbiA9IDA7CisJCXJlYWRsZW4gPSBiZC0+bGVuOworCX0gZWxzZSB7CisJCS8qIEZ1bGwgcGFnZSBjb250ZW50IHNob3VsZCBiZSByZWFkICovCisJCXNjYW5sZW4JPSBtdGQtPm9vYmJsb2NrICsgbXRkLT5vb2JzaXplOworCQlyZWFkbGVuID0gbGVuICogbXRkLT5vb2JibG9jazsKKwkJb29ibGVuID0gbGVuICogbXRkLT5vb2JzaXplOworCX0KIAogCWlmIChjaGlwID09IC0xKSB7CiAJCS8qIE5vdGUgdGhhdCBudW1ibG9ja3MgaXMgMiAqIChyZWFsIG51bWJsb2NrcykgaGVyZSwgc2VlIGkrPTIgYmVsb3cgYXMgaXQKQEAgLTI4NCw3ICszMTgsNyBAQAogCQlpZiAoY2hpcCA+PSB0aGlzLT5udW1jaGlwcykgewogCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImNyZWF0ZV9iYnQoKTogY2hpcG5yICglZCkgPiBhdmFpbGFibGUgY2hpcHMgKCVkKVxuIiwKIAkJCQljaGlwICsgMSwgdGhpcy0+bnVtY2hpcHMpOwotCQkJcmV0dXJuOwkKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCW51bWJsb2NrcyA9IHRoaXMtPmNoaXBzaXplID4+ICh0aGlzLT5iYnRfZXJhc2Vfc2hpZnQgLSAxKTsKIAkJc3RhcnRibG9jayA9IGNoaXAgKiBudW1ibG9ja3M7CkBAIC0yOTMsMTggKzMyNyw0MSBAQAogCX0KIAkKIAlmb3IgKGkgPSBzdGFydGJsb2NrOyBpIDwgbnVtYmxvY2tzOykgewotCQluYW5kX3JlYWRfcmF3IChtdGQsIGJ1ZiwgZnJvbSwgcmVhZGxlbiwgb29ibGVuKTsKKwkJaW50IHJldDsKKwkJCisJCWlmIChiZC0+b3B0aW9ucyAmIE5BTkRfQkJUX1NDQU5FTVBUWSkKKwkJCWlmICgocmV0ID0gbmFuZF9yZWFkX3JhdyAobXRkLCBidWYsIGZyb20sIHJlYWRsZW4sIG9vYmxlbikpKQorCQkJCXJldHVybiByZXQ7CisKIAkJZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0JCQlpZiAoY2hlY2tfcGF0dGVybiAoJmJ1ZltqICogc2Nhbmxlbl0sIHNjYW5sZW4sIG10ZC0+b29iYmxvY2ssIGJkKSkgewotCQkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOwotCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwOHhcbiIsIAotCQkJCQlpID4+IDEsICh1bnNpZ25lZCBpbnQpIGZyb20pOwotCQkJCWJyZWFrOworCQkJaWYgKCEoYmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9TQ0FORU1QVFkpKSB7CisJCQkJc2l6ZV90IHJldGxlbjsKKwkJCQkKKwkJCQkvKiBObyBuZWVkIHRvIHJlYWQgcGFnZXMgZnVsbHksIGp1c3QgcmVhZCByZXF1aXJlZCBPT0IgYnl0ZXMgKi8KKwkJCQlyZXQgPSBtdGQtPnJlYWRfb29iKG10ZCwgZnJvbSArIGogKiBtdGQtPm9vYmJsb2NrICsgYmQtPm9mZnMsCisJCQkJCQkJcmVhZGxlbiwgJnJldGxlbiwgJmJ1ZlswXSk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKworCQkJCWlmIChjaGVja19zaG9ydF9wYXR0ZXJuICgmYnVmW2ogKiBzY2FubGVuXSwgc2NhbmxlbiwgbXRkLT5vb2JibG9jaywgYmQpKSB7CisJCQkJCXRoaXMtPmJidFtpID4+IDNdIHw9IDB4MDMgPDwgKGkgJiAweDYpOworCQkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiQmFkIGVyYXNlYmxvY2sgJWQgYXQgMHglMDh4XG4iLCAKKwkJCQkJCWkgPj4gMSwgKHVuc2lnbmVkIGludCkgZnJvbSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNoZWNrX3BhdHRlcm4gKCZidWZbaiAqIHNjYW5sZW5dLCBzY2FubGVuLCBtdGQtPm9vYmJsb2NrLCBiZCkpIHsKKwkJCQkJdGhpcy0+YmJ0W2kgPj4gM10gfD0gMHgwMyA8PCAoaSAmIDB4Nik7CisJCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJCYWQgZXJhc2VibG9jayAlZCBhdCAweCUwOHhcbiIsIAorCQkJCQkJaSA+PiAxLCAodW5zaWduZWQgaW50KSBmcm9tKTsKKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQl9CiAJCWkgKz0gMjsKIAkJZnJvbSArPSAoMSA8PCB0aGlzLT5iYnRfZXJhc2Vfc2hpZnQpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01ODksMTQgKzY0NiwxMiBAQAogICogVGhlIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtZW1vcnkgYmFzZWQgYmJ0IGJ5IHNjYW5uaW5nIHRoZSBkZXZpY2UgCiAgKiBmb3IgbWFudWZhY3R1cmVyIC8gc29mdHdhcmUgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzCiAqLwotc3RhdGljIGludCBuYW5kX21lbW9yeV9iYnQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IgKmJkKQorc3RhdGljIGlubGluZSBpbnQgbmFuZF9tZW1vcnlfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyICpiZCkKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwogCi0JLyogRW5zdXJlIHRoYXQgd2Ugb25seSBzY2FuIGZvciB0aGUgcGF0dGVybiBhbmQgbm90aGluZyBlbHNlICovCi0JYmQtPm9wdGlvbnMgPSAwOwotCWNyZWF0ZV9iYnQgKG10ZCwgdGhpcy0+ZGF0YV9idWYsIGJkLCAtMSk7Ci0JcmV0dXJuIDA7CisJYmQtPm9wdGlvbnMgJj0gfk5BTkRfQkJUX1NDQU5FTVBUWTsKKwlyZXR1cm4gY3JlYXRlX2JidCAobXRkLCB0aGlzLT5kYXRhX2J1ZiwgYmQsIC0xKTsKIH0KIAogLyoqCkBAIC04MDgsOCArODYzLDE0IEBACiAJLyogSWYgbm8gcHJpbWFyeSB0YWJsZSBkZWNyaXB0b3IgaXMgZ2l2ZW4sIHNjYW4gdGhlIGRldmljZQogCSAqIHRvIGJ1aWxkIGEgbWVtb3J5IGJhc2VkIGJhZCBibG9jayB0YWJsZQogCSAqLwotCWlmICghdGQpCi0JCXJldHVybiBuYW5kX21lbW9yeV9iYnQobXRkLCBiZCk7CisJaWYgKCF0ZCkgeworCQlpZiAoKHJlcyA9IG5hbmRfbWVtb3J5X2JidChtdGQsIGJkKSkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIm5hbmRfYmJ0OiBDYW4ndCBzY2FuIGZsYXNoIGFuZCBidWlsZCB0aGUgUkFNLWJhc2VkIEJCVFxuIik7CisJCQlrZnJlZSAodGhpcy0+YmJ0KTsKKwkJCXRoaXMtPmJidCA9IE5VTEw7CisJCX0KKwkJcmV0dXJuIHJlczsKKwl9CiAKIAkvKiBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBidWZmZXIgZm9yIG9uZSBlcmFzZWJsb2NrIGluY2wuIG9vYiAqLwogCWxlbiA9ICgxIDw8IHRoaXMtPmJidF9lcmFzZV9zaGlmdCk7CkBAIC05MDQsMTQgKzk2NSwxMSBAQAogfQogCiAvKiBEZWZpbmUgc29tZSBnZW5lcmljIGJhZCAvIGdvb2QgYmxvY2sgc2NhbiBwYXR0ZXJuIHdoaWNoIGFyZSB1c2VkIAotICogd2hpbGUgc2Nhbm5pbmcgYSBkZXZpY2UgZm9yIGZhY3RvcnkgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzCi0gKiAKLSAqIFRoZSBtZW1vcnkgYmFzZWQgcGF0dGVybnMganVzdCAKLSAqLworICogd2hpbGUgc2Nhbm5pbmcgYSBkZXZpY2UgZm9yIGZhY3RvcnkgbWFya2VkIGdvb2QgLyBiYWQgYmxvY2tzLiAqLwogc3RhdGljIHVpbnQ4X3Qgc2Nhbl9mZl9wYXR0ZXJuW10gPSB7IDB4ZmYsIDB4ZmYgfTsKIAogc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBzbWFsbHBhZ2VfbWVtb3J5YmFzZWQgPSB7Ci0JLm9wdGlvbnMgPSAwLAorCS5vcHRpb25zID0gTkFORF9CQlRfU0NBTjJORFBBR0UsCiAJLm9mZnMgPSA1LAogCS5sZW4gPSAxLAogCS5wYXR0ZXJuID0gc2Nhbl9mZl9wYXR0ZXJuCkBAIC0xMDQyLDcgKzExMDAsNyBAQAogCXJlcyA9ICh0aGlzLT5iYnRbYmxvY2sgPj4gM10gPj4gKGJsb2NrICYgMHgwNikpICYgMHgwMzsKIAogCURFQlVHIChNVERfREVCVUdfTEVWRUwyLCAibmFuZF9pc2JhZF9iYnQoKTogYmJ0IGluZm8gZm9yIG9mZnMgMHglMDh4OiAoYmxvY2sgJWQpIDB4JTAyeFxuIiwgCi0JCSh1bnNpZ25lZCBpbnQpb2ZmcywgcmVzLCBibG9jayA+PiAxKTsKKwkJKHVuc2lnbmVkIGludClvZmZzLCBibG9jayA+PiAxLCByZXMpOwogCiAJc3dpdGNoICgoaW50KXJlcykgewogCWNhc2UgMHgwMDoJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfaWRzLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRfaWRzLmMKaW5kZXggMmQ4YzQzMi4uZWZlMjQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2lkcy5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9pZHMuYwpAQCAtMiw4ICsyLDggQEAKICAqICBkcml2ZXJzL210ZC9uYW5kaWRzLmMKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIFRob21hcyBHbGVpeG5lciAodGdseEBsaW51dHJvbml4LmRlKQotICAqCi0gKiAkSWQ6IG5hbmRfaWRzLmMsdiAxLjEwIDIwMDQvMDUvMjYgMTM6NDA6MTIgZ2xlaXhuZXIgRXhwICQKKyAqCisgKiAkSWQ6IG5hbmRfaWRzLmMsdiAxLjE0IDIwMDUvMDYvMjMgMDk6Mzg6NTAgZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTU2LDE3ICs1NiwyNCBAQAogCXsiTkFORCA2NE1pQiAzLDNWIDE2LWJpdCIsIAkweDU2LCA1MTIsIDY0LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAogCQogCXsiTkFORCAxMjhNaUIgMSw4ViA4LWJpdCIsIAkweDc4LCA1MTIsIDEyOCwgMHg0MDAwLCAwfSwKKwl7Ik5BTkQgMTI4TWlCIDEsOFYgOC1iaXQiLCAJMHgzOSwgNTEyLCAxMjgsIDB4NDAwMCwgMH0sCiAJeyJOQU5EIDEyOE1pQiAzLDNWIDgtYml0IiwgCTB4NzksIDUxMiwgMTI4LCAweDQwMDAsIDB9LAogCXsiTkFORCAxMjhNaUIgMSw4ViAxNi1iaXQiLCAJMHg3MiwgNTEyLCAxMjgsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCisJeyJOQU5EIDEyOE1pQiAxLDhWIDE2LWJpdCIsIAkweDQ5LCA1MTIsIDEyOCwgMHg0MDAwLCBOQU5EX0JVU1dJRFRIXzE2fSwKIAl7Ik5BTkQgMTI4TWlCIDMsM1YgMTYtYml0IiwgCTB4NzQsIDUxMiwgMTI4LCAweDQwMDAsIE5BTkRfQlVTV0lEVEhfMTZ9LAorCXsiTkFORCAxMjhNaUIgMywzViAxNi1iaXQiLCAJMHg1OSwgNTEyLCAxMjgsIDB4NDAwMCwgTkFORF9CVVNXSURUSF8xNn0sCiAJCiAJeyJOQU5EIDI1Nk1pQiAzLDNWIDgtYml0IiwgCTB4NzEsIDUxMiwgMjU2LCAweDQwMDAsIDB9LAogCi0JeyJOQU5EIDUxMk1pQiAzLDNWIDgtYml0IiwgCTB4REMsIDUxMiwgNTEyLCAweDQwMDAsIDB9LAotCQogCS8qIFRoZXNlIGFyZSB0aGUgbmV3IGNoaXBzIHdpdGggbGFyZ2UgcGFnZSBzaXplLiBUaGUgcGFnZXNpemUKIAkqIGFuZCB0aGUgZXJhc2VzaXplIGlzIGRldGVybWluZWQgZnJvbSB0aGUgZXh0ZW5kZWQgaWQgYnl0ZXMKIAkqLworCS8qNTEyIE1lZ2FiaXQgKi8KKwl7Ik5BTkQgNjRNaUIgMSw4ViA4LWJpdCIsIAkweEEyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCisJeyJOQU5EIDY0TWlCIDMsM1YgOC1iaXQiLCAJMHhGMiwgMCwgIDY0LCAwLCBOQU5EX1NBTVNVTkdfTFBfT1BUSU9OUyB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCA2NE1pQiAxLDhWIDE2LWJpdCIsIAkweEIyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCXsiTkFORCA2NE1pQiAzLDNWIDE2LWJpdCIsIAkweEMyLCAwLCAgNjQsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9CVVNXSURUSF8xNiB8IE5BTkRfTk9fQVVUT0lOQ1J9LAorCQogCS8qIDEgR2lnYWJpdCAqLwogCXsiTkFORCAxMjhNaUIgMSw4ViA4LWJpdCIsIAkweEExLCAwLCAxMjgsIDAsIE5BTkRfU0FNU1VOR19MUF9PUFRJT05TIHwgTkFORF9OT19BVVRPSU5DUn0sCiAJeyJOQU5EIDEyOE1pQiAzLDNWIDgtYml0IiwgCTB4RjEsIDAsIDEyOCwgMCwgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgfCBOQU5EX05PX0FVVE9JTkNSfSwKQEAgLTEwMyw3ICsxMTAsNyBAQAogCSAqIEFueXdheSBKRkZTMiB3b3VsZCBpbmNyZWFzZSB0aGUgZXJhc2VibG9jayBzaXplIHNvIHdlIGNob3NlIGEgY29tYmluZWQgb25lIHdoaWNoIGNhbiBiZSBlcmFzZWQgaW4gb25lIGdvCiAJICogVGhlcmUgYXJlIG1vcmUgc3BlZWQgaW1wcm92ZW1lbnRzIGZvciByZWFkcyBhbmQgd3JpdGVzIHBvc3NpYmxlLCBidXQgbm90IGltcGxlbWVudGVkIG5vdyAKIAkgKi8KLQl7IkFORCAxMjhNaUIgMywzViA4LWJpdCIsCTB4MDEsIDIwNDgsIDEyOCwgMHg0MDAwLCBOQU5EX0lTX0FORCB8IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EXzRQQUdFX0FSUkFZfSwKKwl7IkFORCAxMjhNaUIgMywzViA4LWJpdCIsCTB4MDEsIDIwNDgsIDEyOCwgMHg0MDAwLCBOQU5EX0lTX0FORCB8IE5BTkRfTk9fQVVUT0lOQ1IgfCBOQU5EXzRQQUdFX0FSUkFZIHwgQkJUX0FVVE9fUkVGUkVTSH0sCiAKIAl7TlVMTCx9CiB9OwpAQCAtMTE4LDYgKzEyNSw3IEBACiAJe05BTkRfTUZSX05BVElPTkFMLCAiTmF0aW9uYWwifSwKIAl7TkFORF9NRlJfUkVORVNBUywgIlJlbmVzYXMifSwKIAl7TkFORF9NRlJfU1RNSUNSTywgIlNUIE1pY3JvIn0sCisgICAgICAgIHtOQU5EX01GUl9IWU5JWCwgIkh5bml4In0sCiAJezB4MCwgIlVua25vd24ifQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kc2ltLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYwppbmRleCAxM2ZlZWZkLi43NTRiNmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmRzaW0uYwpAQCAtMjIsNyArMjIsNyBAQAogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQogICoKLSAqICRJZDogbmFuZHNpbS5jLHYgMS43IDIwMDQvMTIvMDYgMTE6NTM6MDYgZGVkZWtpbmQgRXhwICQKKyAqICRJZDogbmFuZHNpbS5jLHYgMS44IDIwMDUvMDMvMTkgMTU6MzM6NTYgZGVkZWtpbmQgRXhwICQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC0xNDg0LDMzICsxNDg0LDYgQEAKIH0KIAogLyoKLSAqIEhhdmluZyBvbmx5IE5BTkQgY2hpcCBJRHMgd2UgY2FsbCBuYW5kX3NjYW4gd2hpY2ggZGV0ZWN0cyBOQU5EIGZsYXNoCi0gKiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGxzIHNjYW5fYmJ0IGluIG9yZGVyIHRvIHNjYW4vZmluZC9idWlsZCB0aGUKLSAqIE5BTkQgZmxhc2ggYmFkIGJsb2NrIHRhYmxlLiBCdXQgc2luY2UgYXQgdGhhdCBtb21lbnQgdGhlIE5BTkQgZmxhc2gKLSAqIGltYWdlIGlzbid0IGFsbG9jYXRlZCBpbiB0aGUgc2ltdWxhdG9yLCBlcnJvcnMgYXJpc2UuIFRvIGF2b2lkIHRoaXMKLSAqIHdlIHJlZGVmaW5lIHRoZSBzY2FuX2JidCBjYWxsYmFjayBhbmQgaW5pdGlhbGl6ZSB0aGUgbmFuZHNpbSBzdHJ1Y3R1cmUKLSAqIGJlZm9yZSB0aGUgZmxhc2ggbWVkaWEgc2Nhbm5pbmcuCi0gKi8KLWludCBuc19zY2FuX2JidChzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsgCi0Jc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IChzdHJ1Y3QgbmFuZF9jaGlwICopbXRkLT5wcml2OwotCXN0cnVjdCBuYW5kc2ltICAgKm5zICAgPSAoc3RydWN0IG5hbmRzaW0gKikoY2hpcC0+cHJpdik7Ci0JaW50IHJldHZhbDsKLQotCWlmICghTlNfSVNfSU5JVElBTElaRUQobnMpKQotCQlpZiAoKHJldHZhbCA9IGluaXRfbmFuZHNpbShtdGQpKSAhPSAwKSB7Ci0JCQlOU19FUlIoInNjYW5fYmJ0OiBjYW4ndCBpbml0aWFsaXplIHRoZSBuYW5kc2ltIHN0cnVjdHVyZVxuIik7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JaWYgKChyZXR2YWwgPSBuYW5kX2RlZmF1bHRfYmJ0KG10ZCkpICE9IDApIHsKLQkJZnJlZV9uYW5kc2ltKG5zKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICovCiBpbnQgX19pbml0IG5zX2luaXRfbW9kdWxlKHZvaWQpCkBAIC0xNTQ0LDcgKzE1MTcsNiBAQAogCWNoaXAtPmh3Y29udHJvbCAgPSBuc19od2NvbnRyb2w7CiAJY2hpcC0+cmVhZF9ieXRlICA9IG5zX25hbmRfcmVhZF9ieXRlOwogCWNoaXAtPmRldl9yZWFkeSAgPSBuc19kZXZpY2VfcmVhZHk7Ci0JY2hpcC0+c2Nhbl9iYnQgICA9IG5zX3NjYW5fYmJ0OwogCWNoaXAtPndyaXRlX2J5dGUgPSBuc19uYW5kX3dyaXRlX2J5dGU7CiAJY2hpcC0+d3JpdGVfYnVmICA9IG5zX25hbmRfd3JpdGVfYnVmOwogCWNoaXAtPnJlYWRfYnVmICAgPSBuc19uYW5kX3JlYWRfYnVmOwpAQCAtMTU1Miw2ICsxNTI0LDcgQEAKIAljaGlwLT53cml0ZV93b3JkID0gbnNfbmFuZF93cml0ZV93b3JkOwogCWNoaXAtPnJlYWRfd29yZCAgPSBuc19uYW5kX3JlYWRfd29yZDsKIAljaGlwLT5lY2Ntb2RlICAgID0gTkFORF9FQ0NfU09GVDsKKwljaGlwLT5vcHRpb25zICAgfD0gTkFORF9TS0lQX0JCVFNDQU47CiAKIAkvKiAKIAkgKiBQZXJmb3JtIG1pbmltdW0gbmFuZHNpbSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24gdG8gaGFuZGxlCkBAIC0xNTgwLDYgKzE1NTMsMTYgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlpZiAoKHJldHZhbCA9IGluaXRfbmFuZHNpbShuc210ZCkpICE9IDApIHsKKwkJTlNfRVJSKCJzY2FuX2JidDogY2FuJ3QgaW5pdGlhbGl6ZSB0aGUgbmFuZHNpbSBzdHJ1Y3R1cmVcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwkKKwlpZiAoKHJldHZhbCA9IG5hbmRfZGVmYXVsdF9iYnQobnNtdGQpKSAhPSAwKSB7CisJCWZyZWVfbmFuZHNpbShuYW5kKTsKKwkJZ290byBlcnJvcjsKKwl9CisKIAkvKiBSZWdpc3RlciBOQU5EIGFzIG9uZSBiaWcgcGFydGl0aW9uICovCiAJYWRkX210ZF9wYXJ0aXRpb25zKG5zbXRkLCAmbmFuZC0+cGFydCwgMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMgYi9kcml2ZXJzL210ZC9uYW5kL3J0Y19mcm9tNC5jCmluZGV4IDAyMzA1YTIuLjAzMTA1MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcnRjX2Zyb200LmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9ydGNfZnJvbTQuYwpAQCAtNiw3ICs2LDcgQEAKICAqICBEZXJpdmVkIGZyb20gZHJpdmVycy9tdGQvbmFuZC9zcGlhLmMKICAqICAgICAgIENvcHlyaWdodCAoQykgMjAwMCBTdGV2ZW4gSi4gSGlsbCAoc2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbSkKICAqCi0gKiAkSWQ6IHJ0Y19mcm9tNC5jLHYgMS43IDIwMDQvMTEvMDQgMTI6NTM6MTAgZ2xlaXhuZXIgRXhwICQKKyAqICRJZDogcnRjX2Zyb200LmMsdiAxLjkgMjAwNS8wMS8yNCAyMDo0MDoxMSBkbWFybGluIEV4cCAkCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC04MywxMyArODMsMTggQEAKICNkZWZpbmUgUlRDX0ZST000X1JTX0VDQ19DSEsJCShSVENfRlJPTTRfTkFORF9BRERSX0ZQR0EgfCAweDAwMDAwMDcwKQogI2RlZmluZSBSVENfRlJPTTRfUlNfRUNDX0NIS19FUlJPUgkoMSA8PCA3KQogCisjZGVmaW5lIEVSUl9TVEFUX0VDQ19BVkFJTEFCTEUJCTB4MjAKKwogLyogVW5kZWZpbmUgZm9yIHNvZnR3YXJlIEVDQyAqLwogI2RlZmluZSBSVENfRlJPTTRfSFdFQ0MJMQogCisvKiBEZWZpbmUgYXMgMSBmb3Igbm8gdmlydHVhbCBlcmFzZSBibG9ja3MgKGluIEpGRlMyKSAqLworI2RlZmluZSBSVENfRlJPTTRfTk9fVklSVEJMT0NLUwkwCisKIC8qCiAgKiBNb2R1bGUgc3R1ZmYKICAqLwotc3RhdGljIHZvaWQgX19pb21lbSAqcnRjX2Zyb200X2Zpb19iYXNlID0gUDJTRUdBRERSKFJUQ19GUk9NNF9GSU9fQkFTRSk7CitzdGF0aWMgdm9pZCBfX2lvbWVtICpydGNfZnJvbTRfZmlvX2Jhc2UgPSAodm9pZCAqKVAyU0VHQUREUihSVENfRlJPTTRfRklPX0JBU0UpOwogCiBjb25zdCBzdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bXSA9IHsKICAgICAgICAgewpAQCAtMjY3LDcgKzI3Miw2IEBACiB9CiAKIAotCiAvKgogICogcnRjX2Zyb200X25hbmRfZGV2aWNlX3JlYWR5IC0gaGFyZHdhcmUgc3BlY2lmaWMgcmVhZHkvYnVzeSBjaGVjawogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTI4Niw2ICsyOTAsNDAgQEAKIAogfQogCisKKy8qCisgKiBkZXBsZXRlIC0gY29kZSB0byBwZXJmb3JtIGRldmljZSByZWNvdmVyeSBpbiBjYXNlIHRoZXJlIHdhcyBhIHBvd2VyIGxvc3MKKyAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCisgKiBAY2hpcDoJQ2hpcCB0byBzZWxlY3QgKDAgPT0gc2xvdCAzLCAxID09IHNsb3QgNCkKKyAqCisgKiBJZiB0aGVyZSB3YXMgYSBzdWRkZW4gbG9zcyBvZiBwb3dlciBkdXJpbmcgYW4gZXJhc2Ugb3BlcmF0aW9uLCBhIAorICogImRldmljZSByZWNvdmVyeSIgb3BlcmF0aW9uIG11c3QgYmUgcGVyZm9ybWVkIHdoZW4gcG93ZXIgaXMgcmVzdG9yZWQKKyAqIHRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbi4gIFRoaXMgcm91dGluZSBwZXJmb3JtcyB0aGUgcmVxdWlyZWQgc3RlcHMKKyAqIGZvciB0aGUgcmVxdWVzdGVkIGNoaXAuCisgKgorICogU2VlIHBhZ2UgODYgb2YgdGhlIGRhdGEgc2hlZXQgZm9yIGRldGFpbHMuCisgKgorICovCitzdGF0aWMgdm9pZCBkZXBsZXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY2hpcCkKK3sKKyAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKworICAgICAgICAvKiB3YWl0IHVudGlsIGRldmljZSBpcyByZWFkeSAqLworICAgICAgICB3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsKKworCXRoaXMtPnNlbGVjdF9jaGlwKG10ZCwgY2hpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLyogU2VuZCB0aGUgY29tbWFuZHMgZm9yIGRldmljZSByZWNvdmVyeSwgcGhhc2UgMSAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfREVQTEVURTEsIDB4MDAwMCwgMHgwMDAwKTsKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX0RFUExFVEUyLCAtMSwgLTEpOworCisJLyogU2VuZCB0aGUgY29tbWFuZHMgZm9yIGRldmljZSByZWNvdmVyeSwgcGhhc2UgMiAqLworCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfREVQTEVURTEsIDB4MDAwMCwgMHgwMDA0KTsKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX0RFUExFVEUyLCAtMSwgLTEpOworCit9CisKKwogI2lmZGVmIFJUQ19GUk9NNF9IV0VDQwogLyoKICAqIHJ0Y19mcm9tNF9lbmFibGVfaHdlY2MgLSBoYXJkd2FyZSBzcGVjaWZpYyBoYXJkd2FyZSBFQ0MgZW5hYmxlIGZ1bmN0aW9uCkBAIC0zMjksNiArMzY3LDcgQEAKIAogfQogCisKIC8qCiAgKiBydGNfZnJvbTRfY2FsY3VsYXRlX2VjYyAtIGhhcmR3YXJlIHNwZWNpZmljIGNvZGUgdG8gcmVhZCBFQ0MgY29kZQogICogQG10ZDoJTVREIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTM1Niw2ICszOTUsNyBAQAogCWVjY19jb2RlWzddIHw9IDB4MGY7CS8qIHNldCB0aGUgbGFzdCBmb3VyIGJpdHMgKG5vdCB1c2VkKSAqLwogfQogCisKIC8qCiAgKiBydGNfZnJvbTRfY29ycmVjdF9kYXRhIC0gaGFyZHdhcmUgc3BlY2lmaWMgY29kZSB0byBjb3JyZWN0IGRhdGEgdXNpbmcgRUNDIGNvZGUKICAqIEBtdGQ6CU1URCBkZXZpY2Ugc3RydWN0dXJlCkBAIC0zNjUsMTYgKzQwNSwxNCBAQAogICoKICAqIFRoZSBGUEdBIHRlbGxzIHVzIGZhc3QsIGlmIHRoZXJlJ3MgYW4gZXJyb3Igb3Igbm90LiBJZiBubywgd2UgZ28gYmFjayBoYXBweQogICogZWxzZSB3ZSByZWFkIHRoZSBlY2MgcmVzdWx0cyBmcm9tIHRoZSBmcGdhIGFuZCBjYWxsIHRoZSBycyBsaWJyYXJ5IHRvIGRlY29kZQotICogYW5kIGhvcGVmdWxseSBjb3JyZWN0IHRoZSBlcnJvcgorICogYW5kIGhvcGVmdWxseSBjb3JyZWN0IHRoZSBlcnJvci4KICAqCi0gKiBGb3Igbm93IEkgdXNlIHRoZSBjb2RlLCB3aGljaCB3ZSByZWFkIGZyb20gdGhlIEZMQVNIIHRvIHVzZSB0aGUgUlMgbGliLAotICogYXMgdGhlIHN5bmRyb20gY29udmVyc2lvbiBoYXMgYSB1bnJlc29sdmVkIGlzc3VlLgogICovCiBzdGF0aWMgaW50IHJ0Y19mcm9tNF9jb3JyZWN0X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCB1X2NoYXIgKmVjYzEsIHVfY2hhciAqZWNjMikKIHsKIAlpbnQgaSwgaiwgcmVzOwogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsgCi0JdWludDE2X3QgcGFyWzZdLCBzeW5bNl0sIHRtcDsKKwl1aW50MTZfdCBwYXJbNl0sIHN5bls2XTsKIAl1aW50OF90IGVjY1s4XTsKICAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnJzX2VjYzsKIApAQCAtNDE2LDE1ICs0NTQsODYgQEAKIAl9CiAKIAkvKiBMZXQgdGhlIGxpYnJhcnkgY29kZSBkbyBpdHMgbWFnaWMuKi8KLQlyZXMgPSBkZWNvZGVfcnM4KHJzX2RlY29kZXIsIGJ1ZiwgcGFyLCA1MTIsIHN5biwgMCwgTlVMTCwgMHhmZiwgTlVMTCk7CisJcmVzID0gZGVjb2RlX3JzOChyc19kZWNvZGVyLCAodWludDhfdCAqKWJ1ZiwgcGFyLCA1MTIsIHN5biwgMCwgTlVMTCwgMHhmZiwgTlVMTCk7CiAJaWYgKHJlcyA+IDApIHsKIAkJREVCVUcgKE1URF9ERUJVR19MRVZFTDAsICJydGNfZnJvbTRfY29ycmVjdF9kYXRhOiAiIAogCQkJIkVDQyBjb3JyZWN0ZWQgJWQgZXJyb3JzIG9uIHJlYWRcbiIsIHJlcyk7CiAJfQogCXJldHVybiByZXM7CiB9CisKKworLyoqCisgKiBydGNfZnJvbTRfZXJyc3RhdCAtIHBlcmZvcm0gYWRkaXRpb25hbCBlcnJvciBzdGF0dXMgY2hlY2tzCisgKiBAbXRkOglNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHRoaXM6CU5BTkQgY2hpcCBzdHJ1Y3R1cmUKKyAqIEBzdGF0ZToJc3RhdGUgb3IgdGhlIG9wZXJhdGlvbgorICogQHN0YXR1czoJc3RhdHVzIGNvZGUgcmV0dXJuZWQgZnJvbSByZWFkIHN0YXR1cworICogQHBhZ2U6CXN0YXJ0cGFnZSBpbnNpZGUgdGhlIGNoaXAsIG11c3QgYmUgY2FsbGVkIHdpdGggKHBhZ2UgJiB0aGlzLT5wYWdlbWFzaykKKyAqIAorICogUGVyZm9ybSBhZGRpdGlvbmFsIGVycm9yIHN0YXR1cyBjaGVja3Mgb24gZXJhc2UgYW5kIHdyaXRlIGZhaWx1cmVzIAorICogdG8gZGV0ZXJtaW5lIGlmIGVycm9ycyBhcmUgY29ycmVjdGFibGUuICBGb3IgdGhpcyBkZXZpY2UsIGNvcnJlY3RhYmxlIAorICogMS1iaXQgZXJyb3JzIG9uIGVyYXNlIGFuZCB3cml0ZSBhcmUgY29uc2lkZXJlZCBhY2NlcHRhYmxlLgorICoKKyAqIG5vdGU6IHNlZSBwYWdlcyAzNC4uMzcgb2YgZGF0YSBzaGVldCBmb3IgZGV0YWlscy4KKyAqCisgKi8KK3N0YXRpYyBpbnQgcnRjX2Zyb200X2VycnN0YXQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMsIGludCBzdGF0ZSwgaW50IHN0YXR1cywgaW50IHBhZ2UpCit7CisJaW50CWVyX3N0YXQ9MDsKKwlpbnQJcnRuLCByZXRsZW47CisJc2l6ZV90CWxlbjsKKwl1aW50OF90ICpidWY7CisJaW50CWk7CisKKwl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVU19DTEVBUiwgLTEsIC0xKTsKKworICAgICAgICBpZiAoc3RhdGUgPT0gRkxfRVJBU0lORykgeworCQlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJCWlmIChzdGF0dXMgJiAxPDwoaSsxKSkgeworCQkJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgKE5BTkRfQ01EX1NUQVRVU19FUlJPUiArIGkgKyAxKSwgLTEsIC0xKTsKKwkJCQlydG4gPSB0aGlzLT5yZWFkX2J5dGUobXRkKTsKKwkJCQl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVU19SRVNFVCwgLTEsIC0xKTsKKwkJCQlpZiAoIShydG4gJiBFUlJfU1RBVF9FQ0NfQVZBSUxBQkxFKSkgeworCQkJCQllcl9zdGF0IHw9IDE8PChpKzEpOwkvKiBlcnJfZWNjX25vdF9hdmFpbCAqLworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoc3RhdGUgPT0gRkxfV1JJVElORykgeworCQkvKiBzaW5nbGUgYmFuayB3cml0ZSBsb2dpYyAqLworCQl0aGlzLT5jbWRmdW5jIChtdGQsIE5BTkRfQ01EX1NUQVRVU19FUlJPUiwgLTEsIC0xKTsKKwkJcnRuID0gdGhpcy0+cmVhZF9ieXRlKG10ZCk7CisJCXRoaXMtPmNtZGZ1bmMgKG10ZCwgTkFORF9DTURfU1RBVFVTX1JFU0VULCAtMSwgLTEpOworCQlpZiAoIShydG4gJiBFUlJfU1RBVF9FQ0NfQVZBSUxBQkxFKSkgeworCQkJZXJfc3RhdCB8PSAxPDwxOwkvKiBlcnJfZWNjX25vdF9hdmFpbCAqLworCQl9IGVsc2UgeworCQkJbGVuID0gbXRkLT5vb2JibG9jazsKKwkJCWJ1ZiA9IGttYWxsb2MgKGxlbiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWJ1ZikgeworCQkJCXByaW50ayAoS0VSTl9FUlIgInJ0Y19mcm9tNF9lcnJzdGF0OiBPdXQgb2YgbWVtb3J5IVxuIik7CisJCQkJZXJfc3RhdCA9IDE7CQkJLyogaWYgd2UgY2FuJ3QgY2hlY2ssIGFzc3VtZSBmYWlsZWQgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogcmVjb3ZlcnkgcmVhZCAqLworCQkJCS8qIHBhZ2UgcmVhZCAqLworCQkJCXJ0biA9IG5hbmRfZG9fcmVhZF9lY2MgKG10ZCwgcGFnZSwgbGVuLCAmcmV0bGVuLCBidWYsIE5VTEwsIHRoaXMtPmF1dG9vb2IsIDEpOworCQkJCWlmIChydG4pIHsJLyogaWYgcmVhZCBmYWlsZWQgb3IgPiAxLWJpdCBlcnJvciBjb3JyZWN0ZWQgKi8KKwkJCQkJZXJfc3RhdCB8PSAxPDwxOwkvKiBFQ0MgcmVhZCBmYWlsZWQgKi8KKwkJCQl9CisJCQkJa2ZyZWUoYnVmKTsKKwkJCX0KKwkJfQorCX0KKworCXJ0biA9IHN0YXR1czsKKwlpZiAoZXJfc3RhdCA9PSAwKSB7CQkJCS8qIGlmIEVDQyBpcyBhdmFpbGFibGUgICAqLworCQlydG4gPSAoc3RhdHVzICYgfk5BTkRfU1RBVFVTX0ZBSUwpOwkvKiAgIGNsZWFyIHRoZSBlcnJvciBiaXQgKi8KKwl9CisKKwlyZXR1cm4gcnRuOworfQogI2VuZGlmCiAKKwogLyoKICAqIE1haW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQogICovCkBAIC00MzIsNiArNTQxLDcgQEAKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzOwogCXVuc2lnbmVkIHNob3J0IGJjcjEsIGJjcjIsIHdjcjI7CisJaW50IGk7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KIAlydGNfZnJvbTRfbXRkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZiAoc3RydWN0IG5hbmRfY2hpcCksCkBAIC00ODMsNiArNTkzLDggQEAKIAogICAgICAgICB0aGlzLT5lY2Ntb2RlID0gTkFORF9FQ0NfSFc4XzUxMjsKIAl0aGlzLT5vcHRpb25zIHw9IE5BTkRfSFdFQ0NfU1lORFJPTUU7CisJLyogcmV0dXJuIHRoZSBzdGF0dXMgb2YgZXh0cmEgc3RhdHVzIGFuZCBFQ0MgY2hlY2tzICovCisJdGhpcy0+ZXJyc3RhdCA9IHJ0Y19mcm9tNF9lcnJzdGF0OwogCS8qIHNldCB0aGUgbmFuZF9vb2JpbmZvIHRvIHN1cHBvcnQgRlBHQSBIL1cgZXJyb3IgZGV0ZWN0aW9uICovCiAJdGhpcy0+YXV0b29vYiA9ICZydGNfZnJvbTRfbmFuZF9vb2JpbmZvOwogCXRoaXMtPmVuYWJsZV9od2VjYyA9IHJ0Y19mcm9tNF9lbmFibGVfaHdlY2M7CkBAIC01MDQsNiArNjE2LDE4IEBACiAJCXJldHVybiAtRU5YSU87CiAJfQogCisJLyogUGVyZm9ybSAnZGV2aWNlIHJlY292ZXJ5JyBmb3IgZWFjaCBjaGlwIGluIGNhc2UgdGhlcmUgd2FzIGEgcG93ZXIgbG9zcy4gKi8KKwlmb3IgKGk9MDsgaSA8IHRoaXMtPm51bWNoaXBzOyBpKyspIHsKKwkJZGVwbGV0ZShydGNfZnJvbTRfbXRkLCBpKTsKKwl9CisKKyNpZiBSVENfRlJPTTRfTk9fVklSVEJMT0NLUworCS8qIHVzZSBhIHNtYWxsZXIgZXJhc2UgYmxvY2sgdG8gbWluaW1pemUgd2FzdGVkIHNwYWNlIHdoZW4gYSBibG9jayBpcyBiYWQgKi8KKwkvKiBub3RlOiB0aGlzIHVzZXMgZWlnaHQgdGltZXMgYXMgbXVjaCBSQU0gYXMgdXNpbmcgdGhlIGRlZmF1bHQgYW5kIG1ha2VzICovCisJLyogICAgICAgbW91bnRzIHRha2UgZm91ciB0aW1lcyBhcyBsb25nLiAqLworCXJ0Y19mcm9tNF9tdGQtPmZsYWdzIHw9IE1URF9OT19WSVJUQkxPQ0tTOworI2VuZGlmCisKIAkvKiBSZWdpc3RlciB0aGUgcGFydGl0aW9ucyAqLwogCWFkZF9tdGRfcGFydGl0aW9ucyhydGNfZnJvbTRfbXRkLCBwYXJ0aXRpb25faW5mbywgTlVNX1BBUlRJVElPTlMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCmluZGV4IGQwNWU5YjkuLjg5MWUzYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvczNjMjQxMC5jCkBAIC0xLDE3ICsxLDI0IEBACiAvKiBsaW51eC9kcml2ZXJzL210ZC9uYW5kL3MzYzI0MTAuYwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqIEJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwyMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL3d3dy5zaW10ZWMuY28udWsvcHJvZHVjdHMvU1dMSU5VWC8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KICAqCi0gKiBTYW1zdW5nIFMzQzI0MTAgTkFORCBkcml2ZXIKKyAqIFNhbXN1bmcgUzNDMjQxMC9TM0MyNDAgTkFORCBkcml2ZXIKICAqCiAgKiBDaGFuZ2Vsb2c6CiAgKgkyMS1TZXAtMjAwNCAgQkpEICBJbml0aWFsIHZlcnNpb24KICAqCTIzLVNlcC0yMDA0ICBCSkQgIE11bGl0cGxlIGRldmljZSBzdXBwb3J0CiAgKgkyOC1TZXAtMjAwNCAgQkpEICBGaXhlZCBFQ0MgcGxhY2VtZW50IGZvciBIYXJkd2FyZSBtb2RlCiAgKgkxMi1PY3QtMjAwNCAgQkpEICBGaXhlZCBlcnJvcnMgaW4gdXNlIG9mIHBsYXRmb3JtIGRhdGEKKyAqCTE4LUZlYi0yMDA1ICBCSkQgIEZpeCBzcGFyc2UgZXJyb3JzCisgKgkxNC1NYXItMjAwNSAgQkpEICBBcHBsaWVkIHRnbHgncyBjb2RlIHJlZHVjdGlvbiBwYXRjaAorICoJMDItTWF5LTIwMDUgIEJKRCAgRml4ZWQgczNjMjQ0MCBzdXBwb3J0CisgKgkwMi1NYXktMjAwNSAgQkpEICBSZWR1Y2VkIGh3Y29udHJvbCBkZWNvZGUKKyAqCTIwLUp1bi0yMDA1ICBCSkQgIFVwZGF0ZWQgczNjMjQ0MCBzdXBwb3J0LCBmaXhlZCB0aW1pbmcgYnVnCisgKgkwOC1KdWwtMjAwNSAgQkpEICBGaXggT09QUyB3aGVuIG5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWQKICAqCi0gKiAkSWQ6IHMzYzI0MTAuYyx2IDEuNyAyMDA1LzAxLzA1IDE4OjA1OjE0IGR3bXcyIEV4cCAkCisgKiAkSWQ6IHMzYzI0MTAuYyx2IDEuMTQgMjAwNS8wNy8wNiAyMDowNTowNiBiamQgRXhwICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTY5LDEwICs3NiwxMCBAQAogICovCiAKIHN0YXRpYyBzdHJ1Y3QgbmFuZF9vb2JpbmZvIG5hbmRfaHdfZWNjb29iID0gewotCS51c2VlY2MgPSBNVERfTkFOREVDQ19BVVRPUExBQ0UsCi0JLmVjY2J5dGVzID0gMywKLQkuZWNjcG9zID0gezAsIDEsIDIgfSwKLQkub29iZnJlZSA9IHsgezgsIDh9IH0KKwkudXNlZWNjCQk9IE1URF9OQU5ERUNDX0FVVE9QTEFDRSwKKwkuZWNjYnl0ZXMJPSAzLAorCS5lY2Nwb3MJCT0gezAsIDEsIDIgfSwKKwkub29iZnJlZQk9IHsgezgsIDh9IH0KIH07CiAKIC8qIGNvbnRyb2xsZXIgYW5kIG10ZCBpbmZvcm1hdGlvbiAqLwpAQCAtOTksOCArMTA2LDEwIEBACiAJc3RydWN0IGRldmljZQkJCSpkZXZpY2U7CiAJc3RydWN0IHJlc291cmNlCQkJKmFyZWE7CiAJc3RydWN0IGNsawkJCSpjbGs7Ci0Jdm9pZAkJCQkqcmVnczsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKIAlpbnQJCQkJbXRkX2NvdW50OworCisJdW5zaWduZWQgY2hhcgkJCWlzX3MzYzI0NDA7CiB9OwogCiAvKiBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwpAQCAtMTY1LDEyICsxNzQsMTIgQEAKIAkvKiBjYWxjdWxhdGUgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbnRyb2xsZXIgKi8KIAogCWlmIChwbGF0ICE9IE5VTEwpIHsKLQkJdGFjbHMgPSBzM2MyNDEwX25hbmRfY2FsY19yYXRlKHBsYXQtPnRhY2xzLCBjbGtyYXRlLCA4KTsKKwkJdGFjbHMgID0gczNjMjQxMF9uYW5kX2NhbGNfcmF0ZShwbGF0LT50YWNscywgY2xrcmF0ZSwgNCk7CiAJCXR3cnBoMCA9IHMzYzI0MTBfbmFuZF9jYWxjX3JhdGUocGxhdC0+dHdycGgwLCBjbGtyYXRlLCA4KTsKIAkJdHdycGgxID0gczNjMjQxMF9uYW5kX2NhbGNfcmF0ZShwbGF0LT50d3JwaDEsIGNsa3JhdGUsIDgpOwogCX0gZWxzZSB7CiAJCS8qIGRlZmF1bHQgdGltaW5ncyAqLwotCQl0YWNscyA9IDg7CisJCXRhY2xzID0gNDsKIAkJdHdycGgwID0gODsKIAkJdHdycGgxID0gODsKIAl9CkBAIC0xODUsMTAgKzE5NCwxNiBAQAogCSAgICAgICB0b19ucyh0d3JwaDAsIGNsa3JhdGUpLAogCSAgICAgICB0b19ucyh0d3JwaDEsIGNsa3JhdGUpKTsKIAotCWNmZyAgPSBTM0MyNDEwX05GQ09ORl9FTjsKLQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVEFDTFModGFjbHMtMSk7Ci0JY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RXUlBIMCh0d3JwaDAtMSk7Ci0JY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RXUlBIMSh0d3JwaDEtMSk7CisJaWYgKCFpbmZvLT5pc19zM2MyNDQwKSB7CisJCWNmZyAgPSBTM0MyNDEwX05GQ09ORl9FTjsKKwkJY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RBQ0xTKHRhY2xzLTEpOworCQljZmcgfD0gUzNDMjQxMF9ORkNPTkZfVFdSUEgwKHR3cnBoMC0xKTsKKwkJY2ZnIHw9IFMzQzI0MTBfTkZDT05GX1RXUlBIMSh0d3JwaDEtMSk7CisJfSBlbHNlIHsKKwkJY2ZnICAgPSBTM0MyNDQwX05GQ09ORl9UQUNMUyh0YWNscy0xKTsKKwkJY2ZnICB8PSBTM0MyNDQwX05GQ09ORl9UV1JQSDAodHdycGgwLTEpOworCQljZmcgIHw9IFMzQzI0NDBfTkZDT05GX1RXUlBIMSh0d3JwaDEtMSk7CisJfQogCiAJcHJfZGVidWcoUEZYICJORl9DT05GIGlzIDB4JWx4XG4iLCBjZmcpOwogCkBAIC0yMDMsMTcgKzIxOCwyMiBAQAogCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgczNjMjQxMF9uYW5kX210ZCAqbm10ZDsgCiAJc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKKwl2b2lkIF9faW9tZW0gKnJlZzsKIAl1bnNpZ25lZCBsb25nIGN1cjsKKwl1bnNpZ25lZCBsb25nIGJpdDsKIAogCW5tdGQgPSB0aGlzLT5wcml2OwogCWluZm8gPSBubXRkLT5pbmZvOwogCi0JY3VyID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKKwliaXQgPSAoaW5mby0+aXNfczNjMjQ0MCkgPyBTM0MyNDQwX05GQ09OVF9uRkNFIDogUzNDMjQxMF9ORkNPTkZfbkZDRTsKKwlyZWcgPSBpbmZvLT5yZWdzKygoaW5mby0+aXNfczNjMjQ0MCkgPyBTM0MyNDQwX05GQ09OVDpTM0MyNDEwX05GQ09ORik7CisKKwljdXIgPSByZWFkbChyZWcpOwogCiAJaWYgKGNoaXAgPT0gLTEpIHsKLQkJY3VyIHw9IFMzQzI0MTBfTkZDT05GX25GQ0U7CisJCWN1ciB8PSBiaXQ7CiAJfSBlbHNlIHsKLQkJaWYgKGNoaXAgPiBubXRkLT5zZXQtPm5yX2NoaXBzKSB7CisJCWlmIChubXRkLT5zZXQgIT0gTlVMTCAmJiBjaGlwID4gbm10ZC0+c2V0LT5ucl9jaGlwcykgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2hpcCAlZCBvdXQgb2YgcmFuZ2VcbiIsIGNoaXApOwogCQkJcmV0dXJuOwogCQl9CkBAIC0yMjMsMTQzICsyNDMsNzYgQEAKIAkJCQkoaW5mby0+cGxhdGZvcm0tPnNlbGVjdF9jaGlwKShubXRkLT5zZXQsIGNoaXApOwogCQl9CiAKLQkJY3VyICY9IH5TM0MyNDEwX05GQ09ORl9uRkNFOworCQljdXIgJj0gfmJpdDsKIAl9CiAKLQl3cml0ZWwoY3VyLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOworCXdyaXRlbChjdXIsIHJlZyk7CiB9CiAKLS8qIGNvbW1hbmQgYW5kIGNvbnRyb2wgZnVuY3Rpb25zICovCisvKiBjb21tYW5kIGFuZCBjb250cm9sIGZ1bmN0aW9ucyAKKyAqCisgKiBOb3RlLCB0aGVzZSBhbGwgdXNlIHRnbHgncyBtZXRob2Qgb2YgY2hhbmdpbmcgdGhlIElPX0FERFJfVyBmaWVsZAorICogdG8gbWFrZSB0aGUgY29kZSBzaW1wbGVyLCBhbmQgdXNlIHRoZSBuYW5kIGxheWVyJ3MgY29kZSB0byBpc3N1ZSB0aGUKKyAqIGNvbW1hbmQgYW5kIGFkZHJlc3Mgc2VxdWVuY2VzIHZpYSB0aGUgcHJvcGVyIElPIHBvcnRzLgorICoKKyovCiAKIHN0YXRpYyB2b2lkIHMzYzI0MTBfbmFuZF9od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCiB7CiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKLQl1bnNpZ25lZCBsb25nIGN1cjsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE5BTkRfQ1RMX1NFVE5DRToKLQkJY3VyID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKLQkJY3VyICY9IH5TM0MyNDEwX05GQ09ORl9uRkNFOwotCQl3cml0ZWwoY3VyLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOwotCQlicmVhazsKLQogCWNhc2UgTkFORF9DVExfQ0xSTkNFOgotCQljdXIgPSByZWFkbChpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNPTkYpOwotCQljdXIgfD0gUzNDMjQxMF9ORkNPTkZfbkZDRTsKLQkJd3JpdGVsKGN1ciwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZDT05GKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY2FsbGVkIGZvciBOQ0VcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWJyZWFrOwogCi0JCS8qIHdlIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IHRoZXNlICovCiAJY2FzZSBOQU5EX0NUTF9TRVRDTEU6Ci0JY2FzZSBOQU5EX0NUTF9DTFJDTEU6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ01EOworCQlicmVhazsKKwogCWNhc2UgTkFORF9DVExfU0VUQUxFOgotCWNhc2UgTkFORF9DVExfQ0xSQUxFOgotCQlwcl9kZWJ1ZyhQRlggInMzYzI0MTBfbmFuZF9od2NvbnRyb2woJWQpIHVudXNlZG4iLCBjbWQpOworCQljaGlwLT5JT19BRERSX1cgPSBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkFERFI7CisJCWJyZWFrOworCisJCS8qIE5BTkRfQ1RMX0NMUkNMRTogKi8KKwkJLyogTkFORF9DVExfQ0xSQUxFOiAqLworCWRlZmF1bHQ6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKIAkJYnJlYWs7CiAJfQogfQogCi0vKiBzM2MyNDEwX25hbmRfY29tbWFuZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzZW5kaW5nIGNvbW1hbmRzIGFuZCB0aGUgcmVsZXZhbnQgYWRkcmVzcwotICogaW5mb3JtYXRpb24gdG8gdGhlIGNoaXAsIHZpYSB0aGUgaGFyZHdhcmUgY29udHJvbGxlci4gU2luY2UgdGhlCi0gKiBTM0MyNDEwIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBBTEUvQ0xFIHNpZ25hbGluZyBhdXRvbWF0aWNhbGx5LCB3ZQotICogZG8gbm90IG5lZWQgdG8gdXNlIGh3Y29udHJvbC4KLSovCisvKiBjb21tYW5kIGFuZCBjb250cm9sIGZ1bmN0aW9ucyAqLwogCi1zdGF0aWMgdm9pZCBzM2MyNDEwX25hbmRfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsCi0JCQkJICBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQorc3RhdGljIHZvaWQgczNjMjQ0MF9uYW5kX2h3Y29udHJvbChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IGNtZCkKIHsKLQlyZWdpc3RlciBzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOwotCXJlZ2lzdGVyIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7CisJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OwogCi0JLyoKLQkgKiBXcml0ZSBvdXQgdGhlIGNvbW1hbmQgdG8gdGhlIGRldmljZS4KLQkgKi8KLQlpZiAoY29tbWFuZCA9PSBOQU5EX0NNRF9TRVFJTikgewotCQlpbnQgcmVhZGNtZDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTkFORF9DVExfU0VUTkNFOgorCWNhc2UgTkFORF9DVExfQ0xSTkNFOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYWxsZWQgZm9yIE5DRVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CiAKLQkJaWYgKGNvbHVtbiA+PSBtdGQtPm9vYmJsb2NrKSB7Ci0JCQkvKiBPT0IgYXJlYSAqLwotCQkJY29sdW1uIC09IG10ZC0+b29iYmxvY2s7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRE9PQjsKLQkJfSBlbHNlIGlmIChjb2x1bW4gPCAyNTYpIHsKLQkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMDsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbiAtPSAyNTY7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDE7Ci0JCX0KLQkJCi0JCXdyaXRlYihyZWFkY21kLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNNRCk7Ci0JfQotCXdyaXRlYihjb21tYW5kLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNNRCk7CisJY2FzZSBOQU5EX0NUTF9TRVRDTEU6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQ01EOworCQlicmVhazsKIAotCS8qIFNldCBBTEUgYW5kIGNsZWFyIENMRSB0byBzdGFydCBhZGRyZXNzIGN5Y2xlICovCisJY2FzZSBOQU5EX0NUTF9TRVRBTEU6CisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQUREUjsKKwkJYnJlYWs7CiAKLQlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgewotCi0JCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KLQkJaWYgKGNvbHVtbiAhPSAtMSkgewotCQkJLyogQWRqdXN0IGNvbHVtbnMgZm9yIDE2IGJpdCBidXN3aWR0aCAqLwotCQkJaWYgKHRoaXMtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KQotCQkJCWNvbHVtbiA+Pj0gMTsKLQkJCXdyaXRlYihjb2x1bW4sIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQUREUik7Ci0JCX0KLQkJaWYgKHBhZ2VfYWRkciAhPSAtMSkgewotCQkJd3JpdGViKCh1bnNpZ25lZCBjaGFyKSAocGFnZV9hZGRyKSwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZBRERSKTsKLQkJCXdyaXRlYigodW5zaWduZWQgY2hhcikgKHBhZ2VfYWRkciA+PiA4KSwgaW5mby0+cmVncyArIFMzQzI0MTBfTkZBRERSKTsKLQkJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGhpZ2hlciBkZW5zaXR5IGRldmljZXMgKi8KLQkJCWlmICh0aGlzLT5jaGlwc2l6ZSAmIDB4MGMwMDAwMDApIAotCQkJCXdyaXRlYigodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gMTYpICYgMHgwZiksCi0JCQkJICAgICAgIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQUREUik7Ci0JCX0KLQkJLyogTGF0Y2ggaW4gYWRkcmVzcyAqLwotCX0KLQkKLQkvKiAKLQkgKiBwcm9ncmFtIGFuZCBlcmFzZSBoYXZlIHRoZWlyIG93biBidXN5IGhhbmRsZXJzIAotCSAqIHN0YXR1cyBhbmQgc2VxdWVudGlhbCBpbiBuZWVkcyBubyBkZWxheQotCSovCi0Jc3dpdGNoIChjb21tYW5kKSB7Ci0JCQkKLQljYXNlIE5BTkRfQ01EX1BBR0VQUk9HOgotCWNhc2UgTkFORF9DTURfRVJBU0UxOgotCWNhc2UgTkFORF9DTURfRVJBU0UyOgotCWNhc2UgTkFORF9DTURfU0VRSU46Ci0JY2FzZSBOQU5EX0NNRF9TVEFUVVM6Ci0JCXJldHVybjsKLQotCWNhc2UgTkFORF9DTURfUkVTRVQ6Ci0JCWlmICh0aGlzLT5kZXZfcmVhZHkpCQotCQkJYnJlYWs7Ci0KLQkJdWRlbGF5KHRoaXMtPmNoaXBfZGVsYXkpOwotCQl3cml0ZWIoTkFORF9DTURfU1RBVFVTLCBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkNNRCk7Ci0KLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOwotCQlyZXR1cm47Ci0KLQkvKiBUaGlzIGFwcGxpZXMgdG8gcmVhZCBjb21tYW5kcyAqLwkKKwkJLyogTkFORF9DVExfQ0xSQ0xFOiAqLworCQkvKiBOQU5EX0NUTF9DTFJBTEU6ICovCiAJZGVmYXVsdDoKLQkJLyogCi0JCSAqIElmIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBidXN5IHBpbiwgd2UgYXBwbHkgdGhlIGdpdmVuCi0JCSAqIGNvbW1hbmQgZGVsYXkKLQkJKi8KLQkJaWYgKCF0aGlzLT5kZXZfcmVhZHkpIHsKLQkJCXVkZWxheSAodGhpcy0+Y2hpcF9kZWxheSk7Ci0JCQlyZXR1cm47Ci0JCX0JCisJCWNoaXAtPklPX0FERFJfVyA9IGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GREFUQTsKKwkJYnJlYWs7CiAJfQotCQotCS8qIEFwcGx5IHRoaXMgc2hvcnQgZGVsYXkgYWx3YXlzIHRvIGVuc3VyZSB0aGF0IHdlIGRvIHdhaXQgdFdCIGluCi0JICogYW55IGNhc2Ugb24gYW55IG1hY2hpbmUuICovCi0JbmRlbGF5ICgxMDApOwotCS8qIHdhaXQgdW50aWwgY29tbWFuZCBpcyBwcm9jZXNzZWQgKi8KLQl3aGlsZSAoIXRoaXMtPmRldl9yZWFkeShtdGQpKTsKIH0KIAotCiAvKiBzM2MyNDEwX25hbmRfZGV2cmVhZHkoKQogICoKICAqIHJldHVybnMgMCBpZiB0aGUgbmFuZCBpcyBidXN5LCAxIGlmIGl0IGlzIHJlYWR5CkBAIC0zNjksOSArMzIyLDEyIEBACiB7CiAJc3RydWN0IHMzYzI0MTBfbmFuZF9pbmZvICppbmZvID0gczNjMjQxMF9uYW5kX210ZF90b2luZm8obXRkKTsKIAkKKwlpZiAoaW5mby0+aXNfczNjMjQ0MCkKKwkJcmV0dXJuIHJlYWRiKGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GU1RBVCkgJiBTM0MyNDQwX05GU1RBVF9SRUFEWTsKIAlyZXR1cm4gcmVhZGIoaW5mby0+cmVncyArIFMzQzI0MTBfTkZTVEFUKSAmIFMzQzI0MTBfTkZTVEFUX0JVU1k7CiB9CiAKKwogLyogRUNDIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLwogCiBzdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9jb3JyZWN0X2RhdGEoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqZGF0LApAQCAtMzk0LDYgKzM1MCwxMiBAQAogCXJldHVybiAtMTsKIH0KIAorLyogRUNDIGZ1bmN0aW9ucworICoKKyAqIFRoZXNlIGFsbG93IHRoZSBzM2MyNDEwIGFuZCBzM2MyNDQwIHRvIHVzZSB0aGUgY29udHJvbGxlcidzIEVDQworICogZ2VuZXJhdG9yIGJsb2NrIHRvIEVDQyB0aGUgZGF0YSBhcyBpdCBwYXNzZXMgdGhyb3VnaF0KKyovCisKIHN0YXRpYyB2b2lkIHMzYzI0MTBfbmFuZF9lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQogewogCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHMzYzI0MTBfbmFuZF9tdGRfdG9pbmZvKG10ZCk7CkBAIC00MDQsNiArMzY2LDE1IEBACiAJd3JpdGVsKGN0cmwsIGluZm8tPnJlZ3MgKyBTM0MyNDEwX05GQ09ORik7CiB9CiAKK3N0YXRpYyB2b2lkIHMzYzI0NDBfbmFuZF9lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQoreworCXN0cnVjdCBzM2MyNDEwX25hbmRfaW5mbyAqaW5mbyA9IHMzYzI0MTBfbmFuZF9tdGRfdG9pbmZvKG10ZCk7CisJdW5zaWduZWQgbG9uZyBjdHJsOworCisJY3RybCA9IHJlYWRsKGluZm8tPnJlZ3MgKyBTM0MyNDQwX05GQ09OVCk7CisJd3JpdGVsKGN0cmwgfCBTM0MyNDQwX05GQ09OVF9JTklURUNDLCBpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORkNPTlQpOworfQorCiBzdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9jYWxjdWxhdGVfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLAogCQkJCSAgICAgIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKQogewpAQCAtNDIwLDcgKzM5MSwyNiBAQAogfQogCiAKLS8qIG92ZXItcmlkZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIGZvciBhIGxpdHRsZSBtb3JlIHNwZWVkPyAqLworc3RhdGljIGludCBzM2MyNDQwX25hbmRfY2FsY3VsYXRlX2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQkgICAgICBjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKK3sKKwlzdHJ1Y3QgczNjMjQxMF9uYW5kX2luZm8gKmluZm8gPSBzM2MyNDEwX25hbmRfbXRkX3RvaW5mbyhtdGQpOworCXVuc2lnbmVkIGxvbmcgZWNjID0gcmVhZGwoaW5mby0+cmVncyArIFMzQzI0NDBfTkZNRUNDMCk7CisKKwllY2NfY29kZVswXSA9IGVjYzsKKwllY2NfY29kZVsxXSA9IGVjYyA+PiA4OworCWVjY19jb2RlWzJdID0gZWNjID4+IDE2OworCisJcHJfZGVidWcoImNhbGN1bGF0ZV9lY2M6IHJldHVybmluZyBlY2MgJTAyeCwlMDJ4LCUwMnhcbiIsCisJCSBlY2NfY29kZVswXSwgZWNjX2NvZGVbMV0sIGVjY19jb2RlWzJdKTsKKworCXJldHVybiAwOworfQorCisKKy8qIG92ZXItcmlkZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIGZvciBhIGxpdHRsZSBtb3JlIHNwZWVkLiBXZSBjYW4KKyAqIHVzZSByZWFkL3dyaXRlIGJsb2NrIHRvIG1vdmUgdGhlIGRhdGEgYnVmZmVycyB0by9mcm9tIHRoZSBjb250cm9sbGVyCisqLwogCiBzdGF0aWMgdm9pZCBzM2MyNDEwX25hbmRfcmVhZF9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIHVfY2hhciAqYnVmLCBpbnQgbGVuKQogewpAQCAtNTIzLDExICs1MTMsMTAgQEAKIHsKIAlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gJm5tdGQtPmNoaXA7CiAKLQljaGlwLT5JT19BRERSX1IJICAgPSAoY2hhciAqKWluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKLQljaGlwLT5JT19BRERSX1cgICAgPSAoY2hhciAqKWluZm8tPnJlZ3MgKyBTM0MyNDEwX05GREFUQTsKKwljaGlwLT5JT19BRERSX1IJICAgPSBpbmZvLT5yZWdzICsgUzNDMjQxMF9ORkRBVEE7CisJY2hpcC0+SU9fQUREUl9XICAgID0gaW5mby0+cmVncyArIFMzQzI0MTBfTkZEQVRBOwogCWNoaXAtPmh3Y29udHJvbCAgICA9IHMzYzI0MTBfbmFuZF9od2NvbnRyb2w7CiAJY2hpcC0+ZGV2X3JlYWR5ICAgID0gczNjMjQxMF9uYW5kX2RldnJlYWR5OwotCWNoaXAtPmNtZGZ1bmMgICAgICA9IHMzYzI0MTBfbmFuZF9jb21tYW5kOwogCWNoaXAtPndyaXRlX2J1ZiAgICA9IHMzYzI0MTBfbmFuZF93cml0ZV9idWY7CiAJY2hpcC0+cmVhZF9idWYgICAgID0gczNjMjQxMF9uYW5kX3JlYWRfYnVmOwogCWNoaXAtPnNlbGVjdF9jaGlwICA9IHMzYzI0MTBfbmFuZF9zZWxlY3RfY2hpcDsKQEAgLTUzNiw2ICs1MjUsMTIgQEAKIAljaGlwLT5vcHRpb25zCSAgID0gMDsKIAljaGlwLT5jb250cm9sbGVyICAgPSAmaW5mby0+Y29udHJvbGxlcjsKIAorCWlmIChpbmZvLT5pc19zM2MyNDQwKSB7CisJCWNoaXAtPklPX0FERFJfUgkgPSBpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORkRBVEE7CisJCWNoaXAtPklPX0FERFJfVyAgPSBpbmZvLT5yZWdzICsgUzNDMjQ0MF9ORkRBVEE7CisJCWNoaXAtPmh3Y29udHJvbCAgPSBzM2MyNDQwX25hbmRfaHdjb250cm9sOworCX0KKwogCW5tdGQtPmluZm8JICAgPSBpbmZvOwogCW5tdGQtPm10ZC5wcml2CSAgID0gY2hpcDsKIAlubXRkLT5zZXQJICAgPSBzZXQ7CkBAIC01NDYsNiArNTQxLDExIEBACiAJCWNoaXAtPmNhbGN1bGF0ZV9lY2MgPSBzM2MyNDEwX25hbmRfY2FsY3VsYXRlX2VjYzsKIAkJY2hpcC0+ZWNjbW9kZQkgICAgPSBOQU5EX0VDQ19IVzNfNTEyOwogCQljaGlwLT5hdXRvb29iICAgICAgID0gJm5hbmRfaHdfZWNjb29iOworCisJCWlmIChpbmZvLT5pc19zM2MyNDQwKSB7CisJCQljaGlwLT5lbmFibGVfaHdlY2MgID0gczNjMjQ0MF9uYW5kX2VuYWJsZV9od2VjYzsKKwkJCWNoaXAtPmNhbGN1bGF0ZV9lY2MgPSBzM2MyNDQwX25hbmRfY2FsY3VsYXRlX2VjYzsKKwkJfQogCX0gZWxzZSB7CiAJCWNoaXAtPmVjY21vZGUJICAgID0gTkFORF9FQ0NfU09GVDsKIAl9CkBAIC01NTksNyArNTU5LDcgQEAKICAqIG5hbmQgbGF5ZXIgdG8gbG9vayBmb3IgZGV2aWNlcwogKi8KIAotc3RhdGljIGludCBzM2MyNDEwX25hbmRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzM2MyNHh4X25hbmRfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaXNfczNjMjQ0MCkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHMzYzI0MTBfcGxhdGZvcm1fbmFuZCAqcGxhdCA9IHRvX25hbmRfcGxhdChkZXYpOwpAQCAtNTg1LDYgKzU4NSw3IEBACiAJZGV2X3NldF9kcnZkYXRhKGRldiwgaW5mbyk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaW5mby0+Y29udHJvbGxlci5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbmZvLT5jb250cm9sbGVyLndxKTsKIAogCS8qIGdldCB0aGUgY2xvY2sgc291cmNlIGFuZCBlbmFibGUgaXQgKi8KIApAQCAtNjAwLDcgKzYwMSw4IEBACiAKIAkvKiBhbGxvY2F0ZSBhbmQgbWFwIHRoZSByZXNvdXJjZSAqLwogCi0JcmVzID0gcGRldi0+cmVzb3VyY2U7ICAvKiBhc3N1bWUgdGhhdCB0aGUgZmxhc2ggaGFzIG9uZSByZXNvdXJjZSAqLworCS8qIGN1cnJlbnRseSB3ZSBhc3N1bWUgd2UgaGF2ZSB0aGUgb25lIHJlc291cmNlICovCisJcmVzICA9IHBkZXYtPnJlc291cmNlOwogCXNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOwogCiAJaW5mby0+YXJlYSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCBwZGV2LT5uYW1lKTsKQEAgLTYxMSw5ICs2MTMsMTAgQEAKIAkJZ290byBleGl0X2Vycm9yOwogCX0KIAotCWluZm8tPmRldmljZSA9IGRldjsKLQlpbmZvLT5wbGF0Zm9ybSA9IHBsYXQ7Ci0JaW5mby0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgc2l6ZSk7CisJaW5mby0+ZGV2aWNlICAgICA9IGRldjsKKwlpbmZvLT5wbGF0Zm9ybSAgID0gcGxhdDsKKwlpbmZvLT5yZWdzICAgICAgID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpbmZvLT5pc19zM2MyNDQwID0gaXNfczNjMjQ0MDsKIAogCWlmIChpbmZvLT5yZWdzID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlc2VydmUgcmVnaXN0ZXIgcmVnaW9uXG4iKTsKQEAgLTY3OCw2ICs2ODEsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBkcml2ZXIgZGV2aWNlIHJlZ2lzdHJhdGlvbiAqLworCitzdGF0aWMgaW50IHMzYzI0MTBfbmFuZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHMzYzI0eHhfbmFuZF9wcm9iZShkZXYsIDApOworfQorCitzdGF0aWMgaW50IHMzYzI0NDBfbmFuZF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHMzYzI0eHhfbmFuZF9wcm9iZShkZXYsIDEpOworfQorCiBzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgczNjMjQxMF9uYW5kX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiczNjMjQxMC1uYW5kIiwKIAkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKQEAgLTY4NSwxNCArNzAwLDI0IEBACiAJLnJlbW92ZQkJPSBzM2MyNDEwX25hbmRfcmVtb3ZlLAogfTsKIAorc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIHMzYzI0NDBfbmFuZF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInMzYzI0NDAtbmFuZCIsCisJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJLnByb2JlCQk9IHMzYzI0NDBfbmFuZF9wcm9iZSwKKwkucmVtb3ZlCQk9IHMzYzI0MTBfbmFuZF9yZW1vdmUsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBzM2MyNDEwX25hbmRfaW5pdCh2b2lkKQogewotCXByaW50aygiUzNDMjQxMCBOQU5EIERyaXZlciwgKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzXG4iKTsKKwlwcmludGsoIlMzQzI0WFggTkFORCBEcml2ZXIsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CisKKwlkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0NDBfbmFuZF9kcml2ZXIpOwogCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnMzYzI0MTBfbmFuZF9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgczNjMjQxMF9uYW5kX2V4aXQodm9pZCkKIHsKKwlkcml2ZXJfdW5yZWdpc3RlcigmczNjMjQ0MF9uYW5kX2RyaXZlcik7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJnMzYzI0MTBfbmFuZF9kcml2ZXIpOwogfQogCkBAIC03MDEsNCArNzI2LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNDEwIE1URCBOQU5EIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTM0MyNFhYIE1URCBOQU5EIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMgYi9kcml2ZXJzL210ZC9uYW5kL3NoYXJwc2wuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDI5NTcyNzkuLjk4NTNiODcKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9zaGFycHNsLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNCBSaWNoYXJkIFB1cmRpZQogICoKLSAqICAkSWQ6IHNoYXJwc2wuYyx2IDEuMyAyMDA1LzAxLzAzIDE0OjUzOjUwIHJwdXJkaWUgRXhwICQKKyAqICAkSWQ6IHNoYXJwc2wuYyx2IDEuNCAyMDA1LzAxLzIzIDExOjA5OjE5IHJwdXJkaWUgRXhwICQKICAqCiAgKiAgQmFzZWQgb24gU2hhcnAncyBOQU5EIGRyaXZlciBzaGFycF9zbC5jCiAgKgpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCW5yX3BhcnRpdGlvbnMgPSBERUZBVUxUX05VTV9QQVJUSVRJT05TOwogCQlzaGFycHNsX3BhcnRpdGlvbl9pbmZvID0gc2hhcnBzbF9uYW5kX2RlZmF1bHRfcGFydGl0aW9uX2luZm87CiAJCWlmIChtYWNoaW5lX2lzX3Bvb2RsZSgpKSB7Ci0JCQlzaGFycHNsX3BhcnRpdGlvbl9pbmZvWzFdLnNpemU9MjIgKiAxMDI0ICogMTAyNDsKKwkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZT0zMCAqIDEwMjQgKiAxMDI0OwogCQl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfY29yZ2koKSB8fCBtYWNoaW5lX2lzX3NoZXBoZXJkKCkpIHsKIAkJCXNoYXJwc2xfcGFydGl0aW9uX2luZm9bMV0uc2l6ZT0yNSAqIDEwMjQgKiAxMDI0OwogCQl9IGVsc2UgaWYgKG1hY2hpbmVfaXNfaHVza3koKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC90eDQ5MjVuZGZtYy5jIGIvZHJpdmVycy9tdGQvbmFuZC90eDQ5MjVuZGZtYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE2ODg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbXRkL25hbmQvdHg0OTI1bmRmbWMuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKgotICogIGRyaXZlcnMvbXRkL3R4NDkyNW5kZm1jLmMKLSAqCi0gKiAgT3ZlcnZpZXc6Ci0gKiAgIFRoaXMgaXMgYSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBkZXZpY2UgZm91bmQgb24gdGhlCi0gKiAgIFRvc2hpYmEgUkJUWDQ5MjUgcmVmZXJlbmNlIGJvYXJkLCB3aGljaCBpcyBhIFNtYXJ0TWVkaWFDYXJkLiBJdCBzdXBwb3J0cyAKLSAqICAgMTZNaUIsIDMyTWlCIGFuZCA2NE1pQiBjYXJkcy4KLSAqCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvbXRkL2F1dGNwdTEyLmMKLSAqICAgICAgIENvcHlyaWdodCAoYykgMjAwMSBUaG9tYXMgR2xlaXhuZXIgKGdsZWl4bmVyQGF1dHJvbml4LmRlKQotICoKLSAqICRJZDogdHg0OTI1bmRmbWMuYyx2IDEuNSAyMDA0LzEwLzA1IDEzOjUwOjIwIGdsZWl4bmVyIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIFRvc2hpYmEgQ29ycG9yYXRpb24gCi0gKiAKLSAqIDIwMDMgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCi0gKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKLSAqIG9yIGltcGxpZWQuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdHg0OTI1L3R4NDkyNV9uYW5kLmg+Ci0KLWV4dGVybiBzdHJ1Y3QgbmFuZF9vb2JpbmZvIGpmZnMyX29vYmluZm87Ci0KLS8qCi0gKiBNVEQgc3RydWN0dXJlIGZvciBSQlRYNDkyNSBib2FyZAotICovCi1zdGF0aWMgc3RydWN0IG10ZF9pbmZvICp0eDQ5MjVuZGZtY19tdGQgPSBOVUxMOwotCi0vKgotICogRGVmaW5lIHBhcnRpdGlvbnMgZm9yIGZsYXNoIGRldmljZXMKLSAqLwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm8xNmtbXSA9IHsKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAxIiwKLQkgIC5vZmZzZXQgPSAgMCwKLQkgIC5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAgfSwKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAyIiwKLQkgIC5vZmZzZXQgPSAgOCAqIDB4MDAxMDAwMDAsCi0JICAuc2l6ZSA9ICAgIDggKiAweDAwMTAwMDAwIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm8zMmtbXSA9IHsKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAxIiwKLQkgIC5vZmZzZXQgPSAgMCwKLQkgIC5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAgfSwKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAyIiwKLQkgIC5vZmZzZXQgPSA4ICogMHgwMDEwMDAwMCwKLQkgIC5zaXplID0gIDI0ICogMHgwMDEwMDAwMCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHBhcnRpdGlvbl9pbmZvNjRrW10gPSB7Ci0JeyAubmFtZSA9ICJVc2VyIEZTIiwKLQkgIC5vZmZzZXQgPSAgMCwKLQkgIC5zaXplID0gICAxNiAqIDB4MDAxMDAwMDAgfSwKLQl7IC5uYW1lID0gIlJCVFg0OTI1IGZsYXNoIHBhcnRpdGlvbiAyIiwKLQkgIC5vZmZzZXQgPSAxNiAqIDB4MDAxMDAwMDAsCi0JICAuc2l6ZSA9ICAgNDggKiAweDAwMTAwMDAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBwYXJ0aXRpb25faW5mbzEyOGtbXSA9IHsKLQl7IC5uYW1lID0gIlNraXAgYmFkIHNlY3Rpb24iLAotCSAgLm9mZnNldCA9ICAwLAotCSAgLnNpemUgPSAgIDE2ICogMHgwMDEwMDAwMCB9LAotCXsgLm5hbWUgPSAiVXNlciBGUyIsCi0JICAub2Zmc2V0ID0gMTYgKiAweDAwMTAwMDAwLAotCSAgLnNpemUgPSAgIDExMiAqIDB4MDAxMDAwMDAgfSwKLX07Ci0jZGVmaW5lIE5VTV9QQVJUSVRJT05TMTZLICAyCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TMzJLICAyCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TNjRLICAyCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TMTI4SyAyCi0KLS8qIAotICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKLSovCi1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCi17Ci0KLQlzd2l0Y2goY21kKXsKLQotCQljYXNlIE5BTkRfQ1RMX1NFVENMRTogCi0JCQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUkNMRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVEFMRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyIHw9IFRYNDkyNV9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSQUxFOiAKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0FMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVE5DRToKLQkJCXR4NDkyNV9uZGZtY3B0ci0+bWNyIHw9IFRYNDkyNV9OREZNQ1JfQ0U7Ci0JCQlicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6Ci0JCQl0eDQ5MjVfbmRmbWNwdHItPm1jciAmPSB+VFg0OTI1X05ERk1DUl9DRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVFdQOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9XRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUldQOgotCQkJdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfV0U7Ci0JCQlicmVhazsKLQl9Ci19Ci0KLS8qCi0qCXJlYWQgZGV2aWNlIHJlYWR5IHBpbgotKi8KLXN0YXRpYyBpbnQgdHg0OTI1bmRmbWNfZGV2aWNlX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCWludCByZWFkeTsKLQlyZWFkeSA9ICh0eDQ5MjVfbmRmbWNwdHItPnNyICYgVFg0OTI1X05EU0ZSX0JVU1kpID8gMCA6IDE7Ci0JcmV0dXJuIHJlYWR5OwotfQotdm9pZCB0eDQ5MjVuZGZtY19lbmFibGVfaHdlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBtb2RlKQotewotCS8qIHJlc2V0IGZpcnN0ICovCi0JdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9NQVNLOwotCXR4NDkyNV9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX01BU0s7Ci0JdHg0OTI1X25kZm1jcHRyLT5tY3IgfD0gVFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9FTkFCOwotfQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfZGlzYWJsZV9lY2Modm9pZCkKLXsKLQl0eDQ5MjVfbmRmbWNwdHItPm1jciAmPSB+VFg0OTI1X05ERk1DUl9FQ0NfQ05UTF9NQVNLOwotfQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfZW5hYmxlX3JlYWRfZWNjKHZvaWQpCi17Ci0JdHg0OTI1X25kZm1jcHRyLT5tY3IgJj0gflRYNDkyNV9OREZNQ1JfRUNDX0NOVExfTUFTSzsKLQl0eDQ5MjVfbmRmbWNwdHItPm1jciB8PSBUWDQ5MjVfTkRGTUNSX0VDQ19DTlRMX1JFQUQ7Ci19Ci12b2lkIHR4NDkyNW5kZm1jX3JlYWRlY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2NoYXIgKmVjY19jb2RlKXsKLQlpbnQgaTsKLQl1X2NoYXIgKmVjYyA9IGVjY19jb2RlOwotICAgICAgICB0eDQ5MjVuZGZtY19lbmFibGVfcmVhZF9lY2MoKTsKLQlmb3IgKGkgPSAwO2kgPCA2O2krKyxlY2MrKykKLQkJKmVjYyA9IHR4NDkyNV9yZWFkX25mbWMoJih0eDQ5MjVfbmRmbWNwdHItPmR0cikpOwotICAgICAgICB0eDQ5MjVuZGZtY19kaXNhYmxlX2VjYygpOwotfQotdm9pZCB0eDQ5MjVuZGZtY19kZXZpY2Vfc2V0dXAodm9pZCkKLXsKLQotCSoodW5zaWduZWQgY2hhciAqKTB4YmIwMDUwMDAgJj0gfjB4MDg7Ci0KLSAgICAgICAgLyogcmVzZXQgTkRGTUMgKi8KLSAgICAgICAgdHg0OTI1X25kZm1jcHRyLT5yc3RyIHw9IFRYNDkyNV9OREZSU1RSX1JTVDsKLQl3aGlsZSAodHg0OTI1X25kZm1jcHRyLT5yc3RyICYgVFg0OTI1X05ERlJTVFJfUlNUKTsgICAgICAgCi0KLQkvKiBzZXR1cCBCdXNTZXBhcmV0ZSwgSG9sZCBUaW1lLCBTdHJvYmUgUHVsc2UgV2lkdGggKi8KLQl0eDQ5MjVfbmRmbWNwdHItPm1jciA9IFRYNDkyNV9CU1BSVCA/IFRYNDkyNV9OREZNQ1JfQlNQUlQgOiAwOwotCXR4NDkyNV9uZGZtY3B0ci0+c3ByID0gVFg0OTI1X0hPTEQgPDwgNCB8IFRYNDkyNV9TUFc7ICAgICAgICAgICAgIAotfQotc3RhdGljIHVfY2hhciB0eDQ5MjVuZGZtY19uYW5kX3JlYWRfYnl0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLSAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLSAgICAgICAgcmV0dXJuIHR4NDkyNV9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSkKLXsKLSAgICAgICAgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLSAgICAgICAgdHg0OTI1X3dyaXRlX25mbWMoYnl0ZSwgdGhpcy0+SU9fQUREUl9XKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJdHg0OTI1X3dyaXRlX25mbWMoYnVmW2ldLCB0aGlzLT5JT19BRERSX1cpOwotfQotCi1zdGF0aWMgdm9pZCB0eDQ5MjVuZGZtY19uYW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCWJ1ZltpXSA9IHR4NDkyNV9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIGludCB0eDQ5MjVuZGZtY19uYW5kX3ZlcmlmeV9idWYoc3RydWN0IG10ZF9pbmZvICptdGQsIGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCBpOwotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQlmb3IgKGk9MDsgaTxsZW47IGkrKykKLQkJaWYgKGJ1ZltpXSAhPSB0eDQ5MjVfcmVhZF9uZm1jKHRoaXMtPklPX0FERFJfUikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogU2VuZCBjb21tYW5kIHRvIE5BTkQgZGV2aWNlCi0gKi8KLXN0YXRpYyB2b2lkIHR4NDkyNW5kZm1jX25hbmRfY29tbWFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHVuc2lnbmVkIGNvbW1hbmQsIGludCBjb2x1bW4sIGludCBwYWdlX2FkZHIpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCS8qIEJlZ2luIGNvbW1hbmQgbGF0Y2ggY3ljbGUgKi8KLQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBjb21tYW5kIHRvIHRoZSBkZXZpY2UuCi0JICovCi0JaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfU0VRSU4pIHsKLQkJaW50IHJlYWRjbWQ7Ci0KLQkJaWYgKGNvbHVtbiA+PSBtdGQtPm9vYmJsb2NrKSB7Ci0JCQkvKiBPT0IgYXJlYSAqLwotCQkJY29sdW1uIC09IG10ZC0+b29iYmxvY2s7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRE9PQjsKLQkJfSBlbHNlIGlmIChjb2x1bW4gPCAyNTYpIHsKLQkJCS8qIEZpcnN0IDI1NiBieXRlcyAtLT4gUkVBRDAgKi8KLQkJCXJlYWRjbWQgPSBOQU5EX0NNRF9SRUFEMDsKLQkJfSBlbHNlIHsKLQkJCWNvbHVtbiAtPSAyNTY7Ci0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDE7Ci0JCX0KLQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsIHJlYWRjbWQpOwotCX0KLQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgY29tbWFuZCk7Ci0KLQkvKiBTZXQgQUxFIGFuZCBjbGVhciBDTEUgdG8gc3RhcnQgYWRkcmVzcyBjeWNsZSAqLwotCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkNMRSk7Ci0KLQlpZiAoY29sdW1uICE9IC0xIHx8IHBhZ2VfYWRkciAhPSAtMSkgewotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRBTEUpOwotCi0JCS8qIFNlcmlhbGx5IGlucHV0IGFkZHJlc3MgKi8KLQkJaWYgKGNvbHVtbiAhPSAtMSkKLQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCBjb2x1bW4pOwotCQlpZiAocGFnZV9hZGRyICE9IC0xKSB7Ci0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpIChwYWdlX2FkZHIgJiAweGZmKSk7Ci0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpICgocGFnZV9hZGRyID4+IDgpICYgMHhmZikpOwotCQkJLyogT25lIG1vcmUgYWRkcmVzcyBjeWNsZSBmb3IgaGlnaGVyIGRlbnNpdHkgZGV2aWNlcyAqLwotCQkJaWYgKG10ZC0+c2l6ZSAmIDB4MGMwMDAwMDApIAotCQkJCXRoaXMtPndyaXRlX2J5dGUobXRkLCAodW5zaWduZWQgY2hhcikgKChwYWdlX2FkZHIgPj4gMTYpICYgMHgwZikpOwotCQl9Ci0JCS8qIExhdGNoIGluIGFkZHJlc3MgKi8KLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQUxFKTsKLQl9Ci0JCi0JLyogCi0JICogcHJvZ3JhbSBhbmQgZXJhc2UgaGF2ZSB0aGVpciBvd24gYnVzeSBoYW5kbGVycyAKLQkgKiBzdGF0dXMgYW5kIHNlcXVlbnRpYWwgaW4gbmVlZHMgbm8gZGVsYXkKLQkqLwotCXN3aXRjaCAoY29tbWFuZCkgewotCQkJCi0JY2FzZSBOQU5EX0NNRF9QQUdFUFJPRzoKLQkJLyogVHVybiBvZmYgV0UgKi8KLQkJdGhpcy0+aHdjb250cm9sIChtdGQsIE5BTkRfQ1RMX0NMUldQKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQljYXNlIE5BTkRfQ01EX1NFUUlOOgotCQkvKiBUdXJuIG9uIFdFICovCi0JCXRoaXMtPmh3Y29udHJvbCAobXRkLCBOQU5EX0NUTF9TRVRXUCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9FUkFTRTE6Ci0JY2FzZSBOQU5EX0NNRF9FUkFTRTI6Ci0JY2FzZSBOQU5EX0NNRF9TVEFUVVM6Ci0JCXJldHVybjsKLQotCWNhc2UgTkFORF9DTURfUkVTRVQ6Ci0JCWlmICh0aGlzLT5kZXZfcmVhZHkpCQotCQkJYnJlYWs7Ci0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX1NFVENMRSk7Ci0JCXRoaXMtPndyaXRlX2J5dGUobXRkLCBOQU5EX0NNRF9TVEFUVVMpOwotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCQl3aGlsZSAoICEodGhpcy0+cmVhZF9ieXRlKG10ZCkgJiAweDQwKSk7Ci0JCXJldHVybjsKLQotCS8qIFRoaXMgYXBwbGllcyB0byByZWFkIGNvbW1hbmRzICovCQotCWRlZmF1bHQ6Ci0JCS8qIAotCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgYnVzeSBwaW4sIHdlIGFwcGx5IHRoZSBnaXZlbgotCQkgKiBjb21tYW5kIGRlbGF5Ci0JCSovCi0JCWlmICghdGhpcy0+ZGV2X3JlYWR5KSB7Ci0JCQl1ZGVsYXkgKHRoaXMtPmNoaXBfZGVsYXkpOwotCQkJcmV0dXJuOwotCQl9CQotCX0KLQkKLQkvKiB3YWl0IHVudGlsIGNvbW1hbmQgaXMgcHJvY2Vzc2VkICovCi0Jd2hpbGUgKCF0aGlzLT5kZXZfcmVhZHkobXRkKSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMKLWV4dGVybiBpbnQgcGFyc2VfY21kbGluZV9wYXJ0aXRpb25zKHN0cnVjdCBtdGRfaW5mbyAqbWFzdGVyLCBzdHJ1Y3QgbXRkX3BhcnRpdGlvCi1uICoqcHBhcnRzLCBjaGFyICopOwotI2VuZGlmCi0KLS8qCi0gKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqLwotZXh0ZXJuIGludCBuYW5kX2NvcnJlY3RfZGF0YShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpkYXQsIHVfY2hhciAqcmVhZF9lY2MsIHVfY2hhciAqY2FsY19lY2MpOwotaW50IF9faW5pdCB0eDQ5MjVuZGZtY19pbml0ICh2b2lkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE1URCBkZXZpY2Ugc3RydWN0dXJlIGFuZCBwcml2YXRlIGRhdGEgKi8KLQl0eDQ5MjVuZGZtY19tdGQgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSArIHNpemVvZiAoc3RydWN0IG5hbmRfY2hpcCksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eDQ5MjVuZGZtY19tdGQpIHsKLQkJcHJpbnRrICgiVW5hYmxlIHRvIGFsbG9jYXRlIFJCVFg0OTI1IE5BTkQgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0gICAgICAgIHR4NDkyNW5kZm1jX2RldmljZV9zZXR1cCgpOwotCi0JLyogaW8gaXMgaW5kaXJlY3QgdmlhIGEgcmVnaXN0ZXIgc28gZG9uJ3QgbmVlZCB0byBpb3JlbWFwIGFkZHJlc3MgKi8KLQotCS8qIEdldCBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSAqLwotCXRoaXMgPSAoc3RydWN0IG5hbmRfY2hpcCAqKSAoJnR4NDkyNW5kZm1jX210ZFsxXSk7Ci0KLQkvKiBJbml0aWFsaXplIHN0cnVjdHVyZXMgKi8KLQltZW1zZXQoKGNoYXIgKikgdHg0OTI1bmRmbWNfbXRkLCAwLCBzaXplb2Yoc3RydWN0IG10ZF9pbmZvKSk7Ci0JbWVtc2V0KChjaGFyICopIHRoaXMsIDAsIHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSk7Ci0KLQkvKiBMaW5rIHRoZSBwcml2YXRlIGRhdGEgd2l0aCB0aGUgTVREIHN0cnVjdHVyZSAqLwotCXR4NDkyNW5kZm1jX210ZC0+cHJpdiA9IHRoaXM7Ci0KLQkvKiBTZXQgYWRkcmVzcyBvZiBOQU5EIElPIGxpbmVzICovCi0JdGhpcy0+SU9fQUREUl9SID0gKHZvaWQgX19pb21lbSAqKSYodHg0OTI1X25kZm1jcHRyLT5kdHIpOwotCXRoaXMtPklPX0FERFJfVyA9ICh2b2lkIF9faW9tZW0gKikmKHR4NDkyNV9uZGZtY3B0ci0+ZHRyKTsKLQl0aGlzLT5od2NvbnRyb2wgPSB0eDQ5MjVuZGZtY19od2NvbnRyb2w7Ci0JdGhpcy0+ZW5hYmxlX2h3ZWNjID0gdHg0OTI1bmRmbWNfZW5hYmxlX2h3ZWNjOwotCXRoaXMtPmNhbGN1bGF0ZV9lY2MgPSB0eDQ5MjVuZGZtY19yZWFkZWNjOwotCXRoaXMtPmNvcnJlY3RfZGF0YSA9IG5hbmRfY29ycmVjdF9kYXRhOwotCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19IVzZfNTEyOwkKLQl0aGlzLT5kZXZfcmVhZHkgPSB0eDQ5MjVuZGZtY19kZXZpY2VfcmVhZHk7Ci0JLyogMjAgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCi0JdGhpcy0+Y2hpcF9kZWxheSA9IDIwOwkJCi0gICAgICAgIHRoaXMtPnJlYWRfYnl0ZSA9IHR4NDkyNW5kZm1jX25hbmRfcmVhZF9ieXRlOwotICAgICAgICB0aGlzLT53cml0ZV9ieXRlID0gdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9ieXRlOwotCXRoaXMtPmNtZGZ1bmMgPSB0eDQ5MjVuZGZtY19uYW5kX2NvbW1hbmQ7Ci0JdGhpcy0+d3JpdGVfYnVmID0gdHg0OTI1bmRmbWNfbmFuZF93cml0ZV9idWY7Ci0JdGhpcy0+cmVhZF9idWYgPSB0eDQ5MjVuZGZtY19uYW5kX3JlYWRfYnVmOwotCXRoaXMtPnZlcmlmeV9idWYgPSB0eDQ5MjVuZGZtY19uYW5kX3ZlcmlmeV9idWY7Ci0KLQkvKiBTY2FuIHRvIGZpbmQgZXhpc3RhbmNlIG9mIHRoZSBkZXZpY2UgKi8KLQlpZiAobmFuZF9zY2FuICh0eDQ5MjVuZGZtY19tdGQsIDEpKSB7Ci0JCWVyciA9IC1FTlhJTzsKLQkJZ290byBvdXRfaW9yOwotCX0KLQotCS8qIFJlZ2lzdGVyIHRoZSBwYXJ0aXRpb25zICovCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbXRkX3BhcnRzX25iID0gMDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiAqbXRkX3BhcnRzID0gMDsKLSAgICAgICAgICAgICAgICBtdGRfcGFydHNfbmIgPSBwYXJzZV9jbWRsaW5lX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCAmbXRkX3BhcnRzLCAidHg0OTI1bmRmbWMiKTsKLSAgICAgICAgICAgICAgICBpZiAobXRkX3BhcnRzX25iID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MjVuZGZtY19tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRfbXRkX2RldmljZSh0eDQ5MjVuZGZtY19tdGQpOwotICAgICAgICB9Ci0jZWxzZSAvKiBpZmRlZiBDT05GSUdfTVREX0NNRExJTkVfUEFSVFMgKi8KLQlzd2l0Y2godHg0OTI1bmRmbWNfbXRkLT5zaXplKXsKLQkJY2FzZSAweDAxMDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzE2aywgTlVNX1BBUlRJVElPTlMxNkspOyBicmVhazsKLQkJY2FzZSAweDAyMDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzMyaywgTlVNX1BBUlRJVElPTlMzMkspOyBicmVhazsKLQkJY2FzZSAweDA0MDAwMDAwOiBhZGRfbXRkX3BhcnRpdGlvbnModHg0OTI1bmRmbWNfbXRkLCBwYXJ0aXRpb25faW5mbzY0aywgTlVNX1BBUlRJVElPTlM2NEspOyBicmVhazsgCi0JCWNhc2UgMHgwODAwMDAwMDogYWRkX210ZF9wYXJ0aXRpb25zKHR4NDkyNW5kZm1jX210ZCwgcGFydGl0aW9uX2luZm8xMjhrLCBOVU1fUEFSVElUSU9OUzEyOEspOyBicmVhazsgCi0JCWRlZmF1bHQ6IHsKLQkJCXByaW50ayAoIlVuc3VwcG9ydGVkIFNtYXJ0TWVkaWEgZGV2aWNlXG4iKTsgCi0JCQllcnIgPSAtRU5YSU87Ci0JCQlnb3RvIG91dF9pb3I7Ci0JCX0KLQl9Ci0jZW5kaWYgLyogaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTICovCi0JZ290byBvdXQ7Ci0KLW91dF9pb3I6Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotbW9kdWxlX2luaXQodHg0OTI1bmRmbWNfaW5pdCk7Ci0KLS8qCi0gKiBDbGVhbiB1cCByb3V0aW5lCi0gKi8KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyB2b2lkIF9fZXhpdCB0eDQ5MjVuZGZtY19jbGVhbnVwICh2b2lkKQotewotCS8qIFJlbGVhc2UgcmVzb3VyY2VzLCB1bnJlZ2lzdGVyIGRldmljZSAqLwotCW5hbmRfcmVsZWFzZSAodHg0OTI1bmRmbWNfbXRkKTsKLQotCS8qIEZyZWUgdGhlIE1URCBkZXZpY2Ugc3RydWN0dXJlICovCi0Ja2ZyZWUgKHR4NDkyNW5kZm1jX210ZCk7Ci19Ci1tb2R1bGVfZXhpdCh0eDQ5MjVuZGZtY19jbGVhbnVwKTsKLSNlbmRpZgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJBbGljZSBIZW5uZXNzeSA8YWhlbm5lc3N5QG12aXN0YS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkdsdWUgbGF5ZXIgZm9yIFNtYXJ0TWVkaWFDYXJkIG9uIFRvc2hpYmEgUkJUWDQ5MjUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYyBiL2RyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNmU1OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL3R4NDkzOG5kZm1jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoKLSAqIGRyaXZlcnMvbXRkL25hbmQvdHg0OTM4bmRmbWMuYwotICoKLSAqICBPdmVydmlldzoKLSAqICAgVGhpcyBpcyBhIGRldmljZSBkcml2ZXIgZm9yIHRoZSBOQU5EIGZsYXNoIGRldmljZSBjb25uZWN0ZWQgdG8KLSAqICAgVFg0OTM4IGludGVybmFsIE5BTkQgTWVtb3J5IENvbnRyb2xsZXIuCi0gKiAgIFRYNDkzOCBOREZNQyBpcyBhbG1vc3Qgc2FtZSBhcyBUWDQ5MjUgTkRGTUMsIGJ1dCByZWdpc3RlciBzaXplIGFyZSA2NCBiaXQuCi0gKgotICogQXV0aG9yOiBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIEJhc2VkIG9uIHNwaWEuYyBieSBTdGV2ZW4gSi4gSGlsbAotICoKLSAqICRJZDogdHg0OTM4bmRmbWMuYyx2IDEuNCAyMDA0LzEwLzA1IDEzOjUwOjIwIGdsZWl4bmVyIEV4cCAkCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgVG9zaGliYSBDb3Jwb3JhdGlvbiAKLSAqCi0gKiAyMDAzIChjKSBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcwotICogbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCi0gKiBvciBpbXBsaWVkLgotICovCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZF9lY2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL3R4NDkzOC9yYnR4NDkzOC5oPgotCi1leHRlcm4gc3RydWN0IG5hbmRfb29iaW5mbyBqZmZzMl9vb2JpbmZvOwotCi0vKgotICogTVREIHN0cnVjdHVyZSBmb3IgVFg0OTM4IE5ERk1DCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbXRkX2luZm8gKnR4NDkzOG5kZm1jX210ZDsKLQotLyoKLSAqIERlZmluZSBwYXJ0aXRpb25zIGZvciBmbGFzaCBkZXZpY2UKLSAqLwotI2RlZmluZSBmbHVzaF93YigpCSh2b2lkKXR4NDkzOF9uZGZtY3B0ci0+bWNyOwotCi0jZGVmaW5lIE5VTV9QQVJUSVRJT05TICAJMwotI2RlZmluZSBOVU1CRVJfT0ZfQ0lTX0JMT0NLUwkyNAotI2RlZmluZSBTSVpFX09GX0JMT0NLCQkweDAwMDA0MDAwCi0jZGVmaW5lIE5VTUJFUl9PRl9CTE9DS19QRVJfWk9ORSAxMDI0Ci0jZGVmaW5lIFNJWkVfT0ZfWk9ORQkJKE5VTUJFUl9PRl9CTE9DS19QRVJfWk9ORSAqIFNJWkVfT0ZfQkxPQ0spCi0jaWZuZGVmIENPTkZJR19NVERfQ01ETElORV9QQVJUUwotLyoKLSAqIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgc2FtcGxlIG9mIE1URCBwYXJ0aXRpb25zIAotICogb24gdGhlIE5BTkQgRmxhc2ggTWVtb3J5IDMyTUIgb3IgbW9yZS4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIGZpZ3VyZSBzaG93cyB0aGUgaW1hZ2Ugb2YgdGhlIHNhbXBsZSBwYXJ0aXRpb24gb24KLSAqIHRoZSAzMk1CIE5BTkQgRmxhc2ggTWVtb3J5LiAKLSAqCi0gKiAgIEJsb2NrIE5vLgotICogICAgMCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rIC0tLS0tLQotICogICAgICB8ICAgICAgICAgICAgIENJUyAgICAgICAgICAgICB8ICAgXgotICogICAyNCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgfAotICogICAgICB8ICAgICAgICAga2VybmVsIGltYWdlICAgICAgICB8ICAgfCBab25lIDAKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAqICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIHwKLSAqIDEwMjMgfCAgICAgICAgIHVudXNlZCBhcmVhICAgICAgICAgfCAgIHYKLSAqICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAtLS0tLS0KLSAqIDEwMjQgfCAgICAgICAgICAgIEpGRlMyICAgICAgICAgICAgfCAgIF4KLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKLSAqICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwgWm9uZSAxCi0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8Ci0gKiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICB2Ci0gKiAyMDQ3ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgLS0tLS0tCi0gKgotICovCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gcGFydGl0aW9uX2luZm9bTlVNX1BBUlRJVElPTlNdID0gewotCXsKLQkJLm5hbWUgPSAiUkJUWDQ5MzggQ0lTIEFyZWEiLAotIAkJLm9mZnNldCA9ICAwLAotIAkJLnNpemUgPSAgICAoTlVNQkVSX09GX0NJU19CTE9DS1MgKiBTSVpFX09GX0JMT0NLKSwKLSAJCS5tYXNrX2ZsYWdzICA9IE1URF9XUklURUFCTEUJLyogVGhpcyBwYXJ0aXRpb24gaXMgTk9UIHdyaXRhYmxlICovCi0gCX0sCi0gCXsKLSAJCS5uYW1lID0gIlJCVFg0OTM4IGtlcm5lbCBpbWFnZSIsCi0gCQkub2Zmc2V0ID0gIE1URFBBUlRfT0ZTX0FQUEVORCwKLSAJCS5zaXplID0gICAgOCAqIDB4MDAxMDAwMDAsCS8qIDhNQiAoRGVwZW5kcyBvbiBzaXplIG9mIGtlcm5lbCBpbWFnZSkgKi8KLSAJCS5tYXNrX2ZsYWdzICA9IE1URF9XUklURUFCTEUJLyogVGhpcyBwYXJ0aXRpb24gaXMgTk9UIHdyaXRhYmxlICovCi0gCX0sCi0gCXsKLSAJCS5uYW1lID0gIlJvb3QgRlMgKEpGRlMyKSIsCi0gCQkub2Zmc2V0ID0gICgwICsgU0laRV9PRl9aT05FKSwgICAgLyogc3RhcnQgYWRkcmVzcyBvZiBuZXh0IHpvbmUgKi8KLSAJCS5zaXplID0gICAgTVREUEFSVF9TSVpfRlVMTAotIAl9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19od2NvbnRyb2woc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBjbWQpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBOQU5EX0NUTF9TRVRDTEU6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciB8PSBUWDQ5MzhfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUkNMRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyICY9IH5UWDQ5MzhfTkRGTUNSX0NMRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVEFMRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyIHw9IFRYNDkzOF9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkFORF9DVExfQ0xSQUxFOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgJj0gflRYNDkzOF9OREZNQ1JfQUxFOwotCQkJYnJlYWs7Ci0JCS8qIFRYNDkzOF9OREZNQ1JfQ0UgYml0IGlzIDA6aGlnaCAxOmxvdyAqLwotCQljYXNlIE5BTkRfQ1RMX1NFVE5DRToKLQkJCXR4NDkzOF9uZGZtY3B0ci0+bWNyIHw9IFRYNDkzOF9OREZNQ1JfQ0U7Ci0JCQlicmVhazsKLQkJY2FzZSBOQU5EX0NUTF9DTFJOQ0U6Ci0JCQl0eDQ5MzhfbmRmbWNwdHItPm1jciAmPSB+VFg0OTM4X05ERk1DUl9DRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX1NFVFdQOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgfD0gVFg0OTM4X05ERk1DUl9XRTsKLQkJCWJyZWFrOwotCQljYXNlIE5BTkRfQ1RMX0NMUldQOgotCQkJdHg0OTM4X25kZm1jcHRyLT5tY3IgJj0gflRYNDkzOF9OREZNQ1JfV0U7Ci0JCQlicmVhazsKLQl9Ci19Ci1zdGF0aWMgaW50IHR4NDkzOG5kZm1jX2Rldl9yZWFkeShzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKLXsKLQlmbHVzaF93YigpOwotCXJldHVybiAhKHR4NDkzOF9uZGZtY3B0ci0+c3IgJiBUWDQ5MzhfTkRGU1JfQlVTWSk7Ci19Ci1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19jYWxjdWxhdGVfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9jaGFyICplY2NfY29kZSkKLXsKLQl1MzIgbWNyID0gdHg0OTM4X25kZm1jcHRyLT5tY3I7Ci0JbWNyICY9IH5UWDQ5MzhfTkRGTUNSX0VDQ19BTEw7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19PRkY7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19SRUFEOwotCWVjY19jb2RlWzFdID0gdHg0OTM4X25kZm1jcHRyLT5kdHI7Ci0JZWNjX2NvZGVbMF0gPSB0eDQ5MzhfbmRmbWNwdHItPmR0cjsKLQllY2NfY29kZVsyXSA9IHR4NDkzOF9uZGZtY3B0ci0+ZHRyOwotCXR4NDkzOF9uZGZtY3B0ci0+bWNyID0gbWNyIHwgVFg0OTM4X05ERk1DUl9FQ0NfT0ZGOwotfQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfZW5hYmxlX2h3ZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgbW9kZSkKLXsKLQl1MzIgbWNyID0gdHg0OTM4X25kZm1jcHRyLT5tY3I7Ci0JbWNyICY9IH5UWDQ5MzhfTkRGTUNSX0VDQ19BTEw7Ci0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBtY3IgfCBUWDQ5MzhfTkRGTUNSX0VDQ19SRVNFVDsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX09GRjsKLQl0eDQ5MzhfbmRmbWNwdHItPm1jciA9IG1jciB8IFRYNDkzOF9OREZNQ1JfRUNDX09OOwotfQotCi1zdGF0aWMgdV9jaGFyIHR4NDkzOG5kZm1jX25hbmRfcmVhZF9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0JcmV0dXJuIHR4NDkzOF9yZWFkX25mbWModGhpcy0+SU9fQUREUl9SKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfbmFuZF93cml0ZV9ieXRlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1X2NoYXIgYnl0ZSkKLXsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCXR4NDkzOF93cml0ZV9uZm1jKGJ5dGUsIHRoaXMtPklPX0FERFJfVyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4NDkzOG5kZm1jX25hbmRfd3JpdGVfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCXR4NDkzOF93cml0ZV9uZm1jKGJ1ZltpXSwgdGhpcy0+SU9fQUREUl9XKTsKLX0KLQotc3RhdGljIHZvaWQgdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgdV9jaGFyICpidWYsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG5hbmRfY2hpcCAqdGhpcyA9IG10ZC0+cHJpdjsKLQotCWZvciAoaT0wOyBpPGxlbjsgaSsrKQotCQlidWZbaV0gPSB0eDQ5MzhfcmVhZF9uZm1jKHRoaXMtPklPX0FERFJfUik7Ci19Ci0KLXN0YXRpYyBpbnQgdHg0OTM4bmRmbWNfbmFuZF92ZXJpZnlfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzID0gbXRkLT5wcml2OwotCi0JZm9yIChpPTA7IGk8bGVuOyBpKyspCi0JCWlmIChidWZbaV0gIT0gdHg0OTM4X3JlYWRfbmZtYyh0aGlzLT5JT19BRERSX1IpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNlbmQgY29tbWFuZCB0byBOQU5EIGRldmljZQotICovCi1zdGF0aWMgdm9pZCB0eDQ5MzhuZGZtY19uYW5kX2NvbW1hbmQgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1bnNpZ25lZCBjb21tYW5kLCBpbnQgY29sdW1uLCBpbnQgcGFnZV9hZGRyKQotewotCXJlZ2lzdGVyIHN0cnVjdCBuYW5kX2NoaXAgKnRoaXMgPSBtdGQtPnByaXY7Ci0KLQkvKiBCZWdpbiBjb21tYW5kIGxhdGNoIGN5Y2xlICovCi0JdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQ0xFKTsKLQkvKgotCSAqIFdyaXRlIG91dCB0aGUgY29tbWFuZCB0byB0aGUgZGV2aWNlLgotCSAqLwotCWlmIChjb21tYW5kID09IE5BTkRfQ01EX1NFUUlOKSB7Ci0JCWludCByZWFkY21kOwotCi0JCWlmIChjb2x1bW4gPj0gbXRkLT5vb2JibG9jaykgewotCQkJLyogT09CIGFyZWEgKi8KLQkJCWNvbHVtbiAtPSBtdGQtPm9vYmJsb2NrOwotCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQURPT0I7Ci0JCX0gZWxzZSBpZiAoY29sdW1uIDwgMjU2KSB7Ci0JCQkvKiBGaXJzdCAyNTYgYnl0ZXMgLS0+IFJFQUQwICovCi0JCQlyZWFkY21kID0gTkFORF9DTURfUkVBRDA7Ci0JCX0gZWxzZSB7Ci0JCQljb2x1bW4gLT0gMjU2OwotCQkJcmVhZGNtZCA9IE5BTkRfQ01EX1JFQUQxOwotCQl9Ci0JCXRoaXMtPndyaXRlX2J5dGUobXRkLCByZWFkY21kKTsKLQl9Ci0JdGhpcy0+d3JpdGVfYnl0ZShtdGQsIGNvbW1hbmQpOwotCi0JLyogU2V0IEFMRSBhbmQgY2xlYXIgQ0xFIHRvIHN0YXJ0IGFkZHJlc3MgY3ljbGUgKi8KLQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9DTFJDTEUpOwotCi0JaWYgKGNvbHVtbiAhPSAtMSB8fCBwYWdlX2FkZHIgIT0gLTEpIHsKLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfU0VUQUxFKTsKLQotCQkvKiBTZXJpYWxseSBpbnB1dCBhZGRyZXNzICovCi0JCWlmIChjb2x1bW4gIT0gLTEpCi0JCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgY29sdW1uKTsKLQkJaWYgKHBhZ2VfYWRkciAhPSAtMSkgewotCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAocGFnZV9hZGRyICYgMHhmZikpOwotCQkJdGhpcy0+d3JpdGVfYnl0ZShtdGQsICh1bnNpZ25lZCBjaGFyKSAoKHBhZ2VfYWRkciA+PiA4KSAmIDB4ZmYpKTsKLQkJCS8qIE9uZSBtb3JlIGFkZHJlc3MgY3ljbGUgZm9yIGhpZ2hlciBkZW5zaXR5IGRldmljZXMgKi8KLQkJCWlmIChtdGQtPnNpemUgJiAweDBjMDAwMDAwKSAKLQkJCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgKHVuc2lnbmVkIGNoYXIpICgocGFnZV9hZGRyID4+IDE2KSAmIDB4MGYpKTsKLQkJfQotCQkvKiBMYXRjaCBpbiBhZGRyZXNzICovCi0JCXRoaXMtPmh3Y29udHJvbChtdGQsIE5BTkRfQ1RMX0NMUkFMRSk7Ci0JfQotCQotCS8qIAotCSAqIHByb2dyYW0gYW5kIGVyYXNlIGhhdmUgdGhlaXIgb3duIGJ1c3kgaGFuZGxlcnMgCi0JICogc3RhdHVzIGFuZCBzZXF1ZW50aWFsIGluIG5lZWRzIG5vIGRlbGF5Ci0JKi8KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJCQotCWNhc2UgTkFORF9DTURfUEFHRVBST0c6Ci0JCS8qIFR1cm4gb2ZmIFdFICovCi0JCXRoaXMtPmh3Y29udHJvbCAobXRkLCBOQU5EX0NUTF9DTFJXUCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JY2FzZSBOQU5EX0NNRF9TRVFJTjoKLQkJLyogVHVybiBvbiBXRSAqLwotCQl0aGlzLT5od2NvbnRyb2wgKG10ZCwgTkFORF9DVExfU0VUV1ApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCWNhc2UgTkFORF9DTURfRVJBU0UxOgotCWNhc2UgTkFORF9DTURfRVJBU0UyOgotCWNhc2UgTkFORF9DTURfU1RBVFVTOgotCQlyZXR1cm47Ci0KLQljYXNlIE5BTkRfQ01EX1JFU0VUOgotCQlpZiAodGhpcy0+ZGV2X3JlYWR5KQkKLQkJCWJyZWFrOwotCQl0aGlzLT5od2NvbnRyb2wobXRkLCBOQU5EX0NUTF9TRVRDTEUpOwotCQl0aGlzLT53cml0ZV9ieXRlKG10ZCwgTkFORF9DTURfU1RBVFVTKTsKLQkJdGhpcy0+aHdjb250cm9sKG10ZCwgTkFORF9DVExfQ0xSQ0xFKTsKLQkJd2hpbGUgKCAhKHRoaXMtPnJlYWRfYnl0ZShtdGQpICYgMHg0MCkpOwotCQlyZXR1cm47Ci0KLQkvKiBUaGlzIGFwcGxpZXMgdG8gcmVhZCBjb21tYW5kcyAqLwkKLQlkZWZhdWx0OgotCQkvKiAKLQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGJ1c3kgcGluLCB3ZSBhcHBseSB0aGUgZ2l2ZW4KLQkJICogY29tbWFuZCBkZWxheQotCQkqLwotCQlpZiAoIXRoaXMtPmRldl9yZWFkeSkgewotCQkJdWRlbGF5ICh0aGlzLT5jaGlwX2RlbGF5KTsKLQkJCXJldHVybjsKLQkJfQkKLQl9Ci0JCi0JLyogd2FpdCB1bnRpbCBjb21tYW5kIGlzIHByb2Nlc3NlZCAqLwotCXdoaWxlICghdGhpcy0+ZGV2X3JlYWR5KG10ZCkpOwotfQotCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi1leHRlcm4gaW50IHBhcnNlX2NtZGxpbmVfcGFydGl0aW9ucyhzdHJ1Y3QgbXRkX2luZm8gKm1hc3Rlciwgc3RydWN0IG10ZF9wYXJ0aXRpb24gKipwcGFydHMsIGNoYXIgKik7Ci0jZW5kaWYKLS8qCi0gKiBNYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqLwotaW50IF9faW5pdCB0eDQ5MzhuZGZtY19pbml0ICh2b2lkKQotewotCXN0cnVjdCBuYW5kX2NoaXAgKnRoaXM7Ci0JaW50IGJzcHJ0ID0gMCwgaG9sZCA9IDB4Ziwgc3B3ID0gMHhmOwotCWludCBwcm90ZWN0ZWQgPSAwOwotCi0JaWYgKCgqcmJ0eDQ5MzhfcGlvc2VsX3B0ciAmIDB4MGMpICE9IDB4MDgpIHsKLQkJcHJpbnRrKCJUWDQ5MzggTkRGTUM6IGRpc2FibGVkIGJ5IElPQyBQSU9TRUxcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JYnNwcnQgPSAxOwotCWhvbGQgPSAyOwotCXNwdyA9IDkgLSAxOwkvKiA4IEdCVVNDTEsgPSA4MG5zIChAIEdCVVNDTEsgMTAwTUh6KSAqLwotCi0JaWYgKCh0eDQ5MzhfY2NmZ3B0ci0+cGNmZyAmCi0JICAgICAoVFg0OTM4X1BDRkdfQVRBX1NFTHxUWDQ5MzhfUENGR19JU0FfU0VMfFRYNDkzOF9QQ0ZHX05ERl9TRUwpKQotCSAgICAhPSBUWDQ5MzhfUENGR19OREZfU0VMKSB7Ci0JCXByaW50aygiVFg0OTM4IE5ERk1DOiBkaXNhYmxlZCBieSBQQ0ZHLlxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIHJlc2V0IE5ERk1DICovCi0JdHg0OTM4X25kZm1jcHRyLT5yc3RyIHw9IFRYNDkzOF9OREZSU1RSX1JTVDsKLQl3aGlsZSAodHg0OTM4X25kZm1jcHRyLT5yc3RyICYgVFg0OTM4X05ERlJTVFJfUlNUKQotCQk7Ci0JLyogc2V0dXAgQnVzU2VwYXJldGUsIEhvbGQgVGltZSwgU3Ryb2JlIFB1bHNlIFdpZHRoICovCi0JdHg0OTM4X25kZm1jcHRyLT5tY3IgPSBic3BydCA/IFRYNDkzOF9OREZNQ1JfQlNQUlQgOiAwOwotCXR4NDkzOF9uZGZtY3B0ci0+c3ByID0gaG9sZCA8PCA0IHwgc3B3OwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciBNVEQgZGV2aWNlIHN0cnVjdHVyZSBhbmQgcHJpdmF0ZSBkYXRhICovCi0JdHg0OTM4bmRmbWNfbXRkID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykgKyBzaXplb2YgKHN0cnVjdCBuYW5kX2NoaXApLAotCQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghdHg0OTM4bmRmbWNfbXRkKSB7Ci0JCXByaW50ayAoIlVuYWJsZSB0byBhbGxvY2F0ZSBUWDQ5MzggTkRGTUMgTVREIGRldmljZSBzdHJ1Y3R1cmUuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogR2V0IHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhICovCi0JdGhpcyA9IChzdHJ1Y3QgbmFuZF9jaGlwICopICgmdHg0OTM4bmRmbWNfbXRkWzFdKTsKLQotCS8qIEluaXRpYWxpemUgc3RydWN0dXJlcyAqLwotCW1lbXNldCgoY2hhciAqKSB0eDQ5MzhuZGZtY19tdGQsIDAsIHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pKTsKLQltZW1zZXQoKGNoYXIgKikgdGhpcywgMCwgc2l6ZW9mKHN0cnVjdCBuYW5kX2NoaXApKTsKLQotCS8qIExpbmsgdGhlIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBNVEQgc3RydWN0dXJlICovCi0JdHg0OTM4bmRmbWNfbXRkLT5wcml2ID0gdGhpczsKLQotCS8qIFNldCBhZGRyZXNzIG9mIE5BTkQgSU8gbGluZXMgKi8KLQl0aGlzLT5JT19BRERSX1IgPSAodW5zaWduZWQgbG9uZykmdHg0OTM4X25kZm1jcHRyLT5kdHI7Ci0JdGhpcy0+SU9fQUREUl9XID0gKHVuc2lnbmVkIGxvbmcpJnR4NDkzOF9uZGZtY3B0ci0+ZHRyOwotCXRoaXMtPmh3Y29udHJvbCA9IHR4NDkzOG5kZm1jX2h3Y29udHJvbDsKLQl0aGlzLT5kZXZfcmVhZHkgPSB0eDQ5MzhuZGZtY19kZXZfcmVhZHk7Ci0JdGhpcy0+Y2FsY3VsYXRlX2VjYyA9IHR4NDkzOG5kZm1jX2NhbGN1bGF0ZV9lY2M7Ci0JdGhpcy0+Y29ycmVjdF9kYXRhID0gbmFuZF9jb3JyZWN0X2RhdGE7Ci0JdGhpcy0+ZW5hYmxlX2h3ZWNjID0gdHg0OTM4bmRmbWNfZW5hYmxlX2h3ZWNjOwotCXRoaXMtPmVjY21vZGUgPSBOQU5EX0VDQ19IVzNfMjU2OwotCXRoaXMtPmNoaXBfZGVsYXkgPSAxMDA7Ci0JdGhpcy0+cmVhZF9ieXRlID0gdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J5dGU7Ci0JdGhpcy0+d3JpdGVfYnl0ZSA9IHR4NDkzOG5kZm1jX25hbmRfd3JpdGVfYnl0ZTsKLQl0aGlzLT5jbWRmdW5jID0gdHg0OTM4bmRmbWNfbmFuZF9jb21tYW5kOwotCXRoaXMtPndyaXRlX2J1ZiA9IHR4NDkzOG5kZm1jX25hbmRfd3JpdGVfYnVmOwotCXRoaXMtPnJlYWRfYnVmID0gdHg0OTM4bmRmbWNfbmFuZF9yZWFkX2J1ZjsKLQl0aGlzLT52ZXJpZnlfYnVmID0gdHg0OTM4bmRmbWNfbmFuZF92ZXJpZnlfYnVmOwotCi0JLyogU2NhbiB0byBmaW5kIGV4aXN0YW5jZSBvZiB0aGUgZGV2aWNlICovCi0JaWYgKG5hbmRfc2NhbiAodHg0OTM4bmRmbWNfbXRkLCAxKSkgewotCQlrZnJlZSAodHg0OTM4bmRmbWNfbXRkKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpZiAocHJvdGVjdGVkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlRYNDkzOCBOREZNQzogd3JpdGUgcHJvdGVjdGVkLlxuIik7Ci0JCXR4NDkzOG5kZm1jX210ZC0+ZmxhZ3MgJj0gfihNVERfV1JJVEVBQkxFIHwgTVREX0VSQVNFQUJMRSk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX01URF9DTURMSU5FX1BBUlRTCi0JewotCQlpbnQgbXRkX3BhcnRzX25iID0gMDsKLQkJc3RydWN0IG10ZF9wYXJ0aXRpb24gKm10ZF9wYXJ0cyA9IDA7Ci0JCW10ZF9wYXJ0c19uYiA9IHBhcnNlX2NtZGxpbmVfcGFydGl0aW9ucyh0eDQ5MzhuZGZtY19tdGQsICZtdGRfcGFydHMsICJ0eDQ5MzhuZGZtYyIpOwotCQlpZiAobXRkX3BhcnRzX25iID4gMCkKLQkJCWFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MzhuZGZtY19tdGQsIG10ZF9wYXJ0cywgbXRkX3BhcnRzX25iKTsKLQkJZWxzZQotCQkJYWRkX210ZF9kZXZpY2UodHg0OTM4bmRmbWNfbXRkKTsKLQl9Ci0jZWxzZQotCWFkZF9tdGRfcGFydGl0aW9ucyh0eDQ5MzhuZGZtY19tdGQsIHBhcnRpdGlvbl9pbmZvLCBOVU1fUEFSVElUSU9OUyApOwotI2VuZGlmCi0KLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KHR4NDkzOG5kZm1jX2luaXQpOwotCi0vKgotICogQ2xlYW4gdXAgcm91dGluZQotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgdHg0OTM4bmRmbWNfY2xlYW51cCAodm9pZCkKLXsKLQkvKiBSZWxlYXNlIHJlc291cmNlcywgdW5yZWdpc3RlciBkZXZpY2UgKi8KLQluYW5kX3JlbGVhc2UgKHR4NDkzOG5kZm1jX210ZCk7Ci0KLQkvKiBGcmVlIHRoZSBNVEQgZGV2aWNlIHN0cnVjdHVyZSAqLwotCWtmcmVlICh0eDQ5MzhuZGZtY19tdGQpOwotfQotbW9kdWxlX2V4aXQodHg0OTM4bmRmbWNfY2xlYW51cCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkFsaWNlIEhlbm5lc3N5IDxhaGVubmVzc3lAbXZpc3RhLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQm9hcmQtc3BlY2lmaWMgZ2x1ZSBsYXllciBmb3IgTkFORCBmbGFzaCBvbiBUWDQ5MzggTkRGTUMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTAzLmMgYi9kcml2ZXJzL25ldC8zYzUwMy5jCmluZGV4IDI5ZGZkNDcuLjVjNWVlYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTAzLmMKKysrIGIvZHJpdmVycy9uZXQvM2M1MDMuYwpAQCAtMTcxLDEyICsxNzEsNyBAQAogCWVyciA9IGRvX2VsMl9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0zNTYsNiArMzUxLDEwIEBACiAgICAgZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOwogI2VuZGlmCiAKKyAgICByZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKyAgICBpZiAocmV0dmFsKQorCWdvdG8gb3V0MTsKKwogICAgIGlmIChkZXYtPm1lbV9zdGFydCkKIAlwcmludGsoIiVzOiAlcyAtICVka0IgUkFNLCA4a0Igc2hhcmVkIG1lbSB3aW5kb3cgYXQgJSM2bHgtJSM2bHguXG4iLAogCQlkZXYtPm5hbWUsIGVpX3N0YXR1cy5uYW1lLCAod29yZGxlbmd0aCsxKTw8MywKQEAgLTcxNSwxMSArNzE0LDggQEAKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWRldi0+bWVtX2VuZCA9IHhjdnJbdGhpc19kZXZdOwkvKiBsb3cgNGJpdHMgPSB4Y3ZyIHNlbC4gKi8KIAkJaWYgKGRvX2VsMl9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2VsMltmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2VsMltmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIjNjNTAzLmM6IE5vIDNjNTAzIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTA1LmMgYi9kcml2ZXJzL25ldC8zYzUwNS5jCmluZGV4IDc2ZmE4Y2MuLmFkMTdmMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTA1LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1MDUuYwpAQCAtMTMxNyw4ICsxMzE3LDcgQEAKIAlpZiAob3JpZ19IU1IgJiBESVIpIHsKIAkJLyogSWYgSENSLkRJUiBpcyB1cCwgd2UgcHVsbCBpdCBkb3duLiBIU1IuRElSIHNob3VsZCBmb2xsb3cuICovCiAJCW91dGIoMCwgZGV2LT5iYXNlX2FkZHIgKyBQT1JUX0NPTlRST0wpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMzAqSFovMTAwKTsKKwkJbXNsZWVwKDMwMCk7CiAJCWlmIChpbmJfc3RhdHVzKGFkZHIpICYgRElSKSB7CiAJCQlpZiAoZWxwX2RlYnVnID4gMCkKIAkJCQlwcmludGsobm90Zm91bmRfbXNnLCAyKTsKQEAgLTEzMjcsOCArMTMyNiw3IEBACiAJfSBlbHNlIHsKIAkJLyogSWYgSENSLkRJUiBpcyBkb3duLCB3ZSBwdWxsIGl0IHVwLiBIU1IuRElSIHNob3VsZCBmb2xsb3cuICovCiAJCW91dGIoRElSLCBkZXYtPmJhc2VfYWRkciArIFBPUlRfQ09OVFJPTCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dCgzMCpIWi8xMDApOworCQltc2xlZXAoMzAwKTsKIAkJaWYgKCEoaW5iX3N0YXR1cyhhZGRyKSAmIERJUikpIHsKIAkJCWlmIChlbHBfZGVidWcgPiAwKQogCQkJCXByaW50ayhub3Rmb3VuZF9tc2csIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MDkuYyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKaW5kZXggZTg0MzEwOS4uOTc3OTM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MDkuYworKysgYi9kcml2ZXJzL25ldC8zYzUwOS5jCkBAIC0yMTcsNiArMjE3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgZWwzX2Vpc2FfaWRzW10gPSB7CiAJCXsgIlRDTTUwOTIiIH0sCiAJCXsgIlRDTTUwOTMiIH0sCisJCXsgIlRDTTUwOTUiIH0sCiAJCXsgIiIgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MTUuYyBiL2RyaXZlcnMvbmV0LzNjNTE1LmMKaW5kZXggYzRjZjRmYy4uOTFkMWM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MTUuYworKysgYi9kcml2ZXJzL25ldC8zYzUxNS5jCkBAIC0zNjUsNyArMzY1LDcgQEAKICNlbmRpZiAvKiBfX0lTQVBOUF9fICovCiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqY29ya3NjcmV3X3NjYW4oaW50IHVuaXQpOwotc3RhdGljIHZvaWQgY29ya3NjcmV3X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIsCitzdGF0aWMgaW50IGNvcmtzY3Jld19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyLAogCQkJICAgIHN0cnVjdCBwbnBfZGV2ICppZGV2LCBpbnQgY2FyZF9udW1iZXIpOwogc3RhdGljIGludCBjb3Jrc2NyZXdfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIGNvcmtzY3Jld190aW1lcih1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC01MzksMTAgKzUzOSw5IEBACiAJCQlwcmludGsoS0VSTl9JTkZPICIzYzUxNSBSZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICUjNC40eCwgRENSICU0LjR4LlxuIiwKIAkJICAgICAJCWlubChpb2FkZHIgKyAweDIwMDIpLCBpbncoaW9hZGRyICsgMHgyMDAwKSk7CiAJCQkvKiBpcnEgPSBpbncoaW9hZGRyICsgMHgyMDAyKSAmIDE1OyAqLyAvKiBVc2UgdGhlIGlycSBmcm9tIGlzYXBucCAqLwotCQkJY29ya3NjcmV3X3NldHVwKGRldiwgaW9hZGRyLCBpZGV2LCBjYXJkc19mb3VuZCsrKTsKIAkJCVNFVF9ORVRERVZfREVWKGRldiwgJmlkZXYtPmRldik7CiAJCQlwbnBfY2FyZHMrKzsKLQkJCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQkJZXJyID0gY29ya3NjcmV3X3NldHVwKGRldiwgaW9hZGRyLCBpZGV2LCBjYXJkc19mb3VuZCsrKTsKIAkJCWlmICghZXJyKQogCQkJCXJldHVybiBkZXY7CiAJCQljbGVhbnVwX2NhcmQoZGV2KTsKQEAgLTU1OCw4ICs1NTcsNyBAQAogCiAJCXByaW50ayhLRVJOX0lORk8gIjNjNTE1IFJlc291cmNlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgJSM0LjR4LCBEQ1IgJTQuNHguXG4iLAogCQkgICAgIGlubChpb2FkZHIgKyAweDIwMDIpLCBpbncoaW9hZGRyICsgMHgyMDAwKSk7Ci0JCWNvcmtzY3Jld19zZXR1cChkZXYsIGlvYWRkciwgTlVMTCwgY2FyZHNfZm91bmQrKyk7Ci0JCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCQllcnIgPSBjb3Jrc2NyZXdfc2V0dXAoZGV2LCBpb2FkZHIsIE5VTEwsIGNhcmRzX2ZvdW5kKyspOwogCQlpZiAoIWVycikKIAkJCXJldHVybiBkZXY7CiAJCWNsZWFudXBfY2FyZChkZXYpOwpAQCAtNTY4LDcgKzU2Niw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGNvcmtzY3Jld19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyLAorc3RhdGljIGludCBjb3Jrc2NyZXdfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGlvYWRkciwKIAkJCSAgICBzdHJ1Y3QgcG5wX2RldiAqaWRldiwgaW50IGNhcmRfbnVtYmVyKQogewogCXN0cnVjdCBjb3Jrc2NyZXdfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtNjkxLDYgKzY4OSw4IEBACiAJZGV2LT5nZXRfc3RhdHMgPSAmY29ya3NjcmV3X2dldF9zdGF0czsKIAlkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9ICZzZXRfcnhfbW9kZTsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm5ldGRldl9ldGh0b29sX29wczsKKworCXJldHVybiByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIH0KIAwKIApAQCAtODIyLDcgKzgyMiw3IEBACiAJCQkJYnJlYWs7CS8qIEJhZCBuZXdzISAgKi8KIAkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KLQkJCXZwLT5yeF9yaW5nW2ldLmFkZHIgPSBpc2FfdmlydF90b19idXMoc2tiLT50YWlsKTsKKwkJCXZwLT5yeF9yaW5nW2ldLmFkZHIgPSBpc2FfdmlydF90b19idXMoc2tiLT5kYXRhKTsKIAkJfQogCQl2cC0+cnhfcmluZ1tpIC0gMV0ubmV4dCA9IGlzYV92aXJ0X3RvX2J1cygmdnAtPnJ4X3JpbmdbMF0pOwkvKiBXcmFwIHRoZSByaW5nLiAqLwogCQlvdXRsKGlzYV92aXJ0X3RvX2J1cygmdnAtPnJ4X3JpbmdbMF0pLCBpb2FkZHIgKyBVcExpc3RQdHIpOwpAQCAtMTQwNiw3ICsxNDA2LDcgQEAKIAkJCQlicmVhazsJLyogQmFkIG5ld3MhICAqLwogCQkJc2tiLT5kZXYgPSBkZXY7CS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIEFsaWduIElQIG9uIDE2IGJ5dGUgYm91bmRhcmllcyAqLwotCQkJdnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBpc2FfdmlydF90b19idXMoc2tiLT50YWlsKTsKKwkJCXZwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gaXNhX3ZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CiAJCQl2cC0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKIAkJfQogCQl2cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjMuYyBiL2RyaXZlcnMvbmV0LzNjNTIzLmMKaW5kZXggOGY2YjJmYS4uOWUxZmUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MjMuYworKysgYi9kcml2ZXJzL25ldC8zYzUyMy5jCkBAIC01NzIsNiArNTcyLDEwIEBACiAgICAgICAgIGRldi0+ZmxhZ3MmPX5JRkZfTVVMVElDQVNUOyAgICAgLyogTXVsdGljYXN0IGRvZXNuJ3Qgd29yayAqLwogI2VuZGlmCiAKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9vdXQ7CisKIAlyZXR1cm4gMDsKIGVycl9vdXQ6CiAJbWNhX3NldF9hZGFwdGVyX3Byb2NmbihzbG90LCBOVUxMLCBOVUxMKTsKQEAgLTYwMCwxMiArNjA0LDcgQEAKIAllcnIgPSBkb19lbG1jX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTEyNzUsNiArMTI3NCw3IEBACiBtb2R1bGVfcGFyYW1fYXJyYXkoaW8sIGludCwgTlVMTCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiRXRoZXJMaW5rL01DIEkvTyBiYXNlIGFkZHJlc3MoZXMpIik7CiBNT0RVTEVfUEFSTV9ERVNDKGlycSwgIkV0aGVyTGluay9NQyBJUlEgbnVtYmVyKHMpIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIGludCBpbml0X21vZHVsZSh2b2lkKQogewpAQCAtMTI4OCwxMiArMTI4OCw5IEBACiAJCWRldi0+aXJxPWlycVt0aGlzX2Rldl07CiAJCWRldi0+YmFzZV9hZGRyPWlvW3RoaXNfZGV2XTsKIAkJaWYgKGRvX2VsbWNfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9lbG1jW3RoaXNfZGV2XSA9IGRldjsKLQkJCQlmb3VuZCsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfZWxtY1t0aGlzX2Rldl0gPSBkZXY7CisJCQlmb3VuZCsrOworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJaWYgKGlvW3RoaXNfZGV2XT09MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTl4LmMgYi9kcml2ZXJzL25ldC8zYzU5eC5jCmluZGV4IDgwZWM5YWEuLjA3NzQ2YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1OXguYwpAQCAtMTgwMiw3ICsxODAyLDcgQEAKIAkJCQlicmVhazsJCQkvKiBCYWQgbmV3cyEgICovCiAJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KLQkJCXZwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT50YWlsLCBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXZwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihwY2lfbWFwX3NpbmdsZShWT1JURVhfUENJKHZwKSwgc2tiLT5kYXRhLCBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJfQogCQlpZiAoaSAhPSBSWF9SSU5HX1NJWkUpIHsKIAkJCWludCBqOwpAQCAtMjYzMiw3ICsyNjMyLDcgQEAKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoVk9SVEVYX1BDSSh2cCksIGRtYSwgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCQkvKiAnc2tiX3B1dCgpJyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHNrX2J1ZmYgZGF0YSBhcmVhLiAqLwogCQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0X2xlbiksCi0JCQkJCSAgIHZwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLAorCQkJCQkgICB2cC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwKIAkJCQkJICAgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKFZPUlRFWF9QQ0kodnApLCBkbWEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQkJdnAtPnJ4X2NvcHkrKzsKQEAgLTI2NzgsNyArMjY3OCw3IEBACiAJCQl9CiAJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KLQkJCXZwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoVk9SVEVYX1BDSSh2cCksIHNrYi0+dGFpbCwgUEtUX0JVRl9TWiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQl2cC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKFZPUlRFWF9QQ0kodnApLCBza2ItPmRhdGEsIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQkJdnAtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CiAJCX0KIAkJdnAtPnJ4X3JpbmdbZW50cnldLnN0YXR1cyA9IDA7CS8qIENsZWFyIGNvbXBsZXRlIGJpdC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzljcC5jIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKaW5kZXggNzJjZGYxOS4uN2IyOTNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOWNwLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgpAQCAtNTk1LDcgKzU5Niw3IEBACiAKIAkJbWFwcGluZyA9CiAJCWNwLT5yeF9za2JbcnhfdGFpbF0ubWFwcGluZyA9Ci0JCQlwY2lfbWFwX3NpbmdsZShjcC0+cGRldiwgbmV3X3NrYi0+dGFpbCwKKwkJCXBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LCBuZXdfc2tiLT5kYXRhLAogCQkJCSAgICAgICBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCWNwLT5yeF9za2JbcnhfdGFpbF0uc2tiID0gbmV3X3NrYjsKIApAQCAtMTEwMCw3ICsxMTAxLDcgQEAKIAkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOwogCiAJCWNwLT5yeF9za2JbaV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGNwLT5wZGV2LAotCQkJc2tiLT50YWlsLCBjcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiLT5kYXRhLCBjcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQljcC0+cnhfc2tiW2ldLnNrYiA9IHNrYjsKIAogCQljcC0+cnhfcmluZ1tpXS5vcHRzMiA9IDA7CkBAIC0xNTE1LDIyICsxNTE2LDIyIEBACiAJCQkJICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKnRtcF9zdGF0cykKIHsKIAlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOwotCXVuc2lnbmVkIGludCB3b3JrID0gMTAwOwogCWludCBpOwogCisJbWVtc2V0KGNwLT5uaWNfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgY3BfZG1hX3N0YXRzKSk7CisKIAkvKiBiZWdpbiBOSUMgc3RhdGlzdGljcyBkdW1wICovCiAJY3B3MzIoU3RhdHNBZGRyICsgNCwgKGNwLT5uaWNfc3RhdHNfZG1hID4+IDE2KSA+PiAxNik7CiAJY3B3MzIoU3RhdHNBZGRyLCAoY3AtPm5pY19zdGF0c19kbWEgJiAweGZmZmZmZmZmKSB8IER1bXBTdGF0cyk7CiAJY3ByMzIoU3RhdHNBZGRyKTsKIAotCXdoaWxlICh3b3JrLS0gPiAwKSB7CisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgewogCQlpZiAoKGNwcjMyKFN0YXRzQWRkcikgJiBEdW1wU3RhdHMpID09IDApCiAJCQlicmVhazsKLQkJY3B1X3JlbGF4KCk7CisJCXVkZWxheSgxMCk7CiAJfQotCi0JaWYgKGNwcjMyKFN0YXRzQWRkcikgJiBEdW1wU3RhdHMpCi0JCXJldHVybiAvKiAtRUlPICovOworCWNwdzMyKFN0YXRzQWRkciwgMCk7CisJY3B3MzIoU3RhdHNBZGRyICsgNCwgMCk7CiAKIAlpID0gMDsKIAl0bXBfc3RhdHNbaSsrXSA9IGxlNjRfdG9fY3B1KGNwLT5uaWNfc3RhdHMtPnR4X29rKTsKQEAgLTE3MzIsMTkgKzE3MzMsMTkgQEAKIAogCS8qIENvbmZpZ3VyZSBETUEgYXR0cmlidXRlcy4gKi8KIAlpZiAoKHNpemVvZihkbWFfYWRkcl90KSA+IDQpICYmCi0JICAgICFwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSAmJgotCSAgICAhcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisJICAgICFwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spICYmCisJICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgewogCQlwY2lfdXNpbmdfZGFjID0gMTsKIAl9IGVsc2UgewogCQlwY2lfdXNpbmdfZGFjID0gMDsKIAotCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCAiCiAJCQkgICAgICAgImFib3J0aW5nLlxuIik7CiAJCQlnb3RvIGVycl9vdXRfcmVzOwogCQl9Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpOworCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJCWlmIChyYykgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm8gdXNhYmxlIGNvbnNpc3RlbnQgRE1BIGNvbmZpZ3VyYXRpb24sICIKIAkJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzl0b28uYyBiL2RyaXZlcnMvbmV0LzgxMzl0b28uYwppbmRleCAwNDcyMDJjLi41YTRhMDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC84MTM5dG9vLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOXRvby5jCkBAIC0xNjA2LDcgKzE2MDYsNyBAQAogCQlkbyB7CiAJCQl0aW1lb3V0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0ICgmdHAtPnRocl93YWl0LCB0aW1lb3V0KTsKIAkJCS8qIG1ha2Ugc3dzdXNwIGhhcHB5IHdpdGggb3VyIHRocmVhZCAqLwotCQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQl9IHdoaWxlICghc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpICYmICh0aW1lb3V0ID4gMCkpOwogCiAJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgyNTk2LmMgYi9kcml2ZXJzL25ldC84MjU5Ni5jCmluZGV4IDY1Zjk3YjEuLjEzYjc0NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvODI1OTYuYwpAQCAtNTQ2LDExICs1NDYsMTEgQEAKIAkJcmJkLT5iX25leHQgPSBXU1dBUHJiZCh2aXJ0X3RvX2J1cyhyYmQrMSkpOwogCQlyYmQtPmJfYWRkciA9IFdTV0FQcmJkKHZpcnRfdG9fYnVzKHJiZCkpOwogCQlyYmQtPnNrYiA9IHNrYjsKLQkJcmJkLT52X2RhdGEgPSBza2ItPnRhaWw7Ci0JCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKHZpcnRfdG9fYnVzKHNrYi0+dGFpbCkpOworCQlyYmQtPnZfZGF0YSA9IHNrYi0+ZGF0YTsKKwkJcmJkLT5iX2RhdGEgPSBXU1dBUGNoYXIodmlydF90b19idXMoc2tiLT5kYXRhKSk7CiAJCXJiZC0+c2l6ZSA9IFBLVF9CVUZfU1o7CiAjaWZkZWYgX19tYzY4MDAwX18KLQkJY2FjaGVfY2xlYXIodmlydF90b19waHlzKHNrYi0+dGFpbCksIFBLVF9CVUZfU1opOworCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMoc2tiLT5kYXRhKSwgUEtUX0JVRl9TWik7CiAjZW5kaWYKIAl9CiAJbHAtPnJiZF9oZWFkID0gbHAtPnJiZHM7CkBAIC04MTYsMTAgKzgxNiwxMCBAQAogCQkJCXJ4X2luX3BsYWNlID0gMTsKIAkJCQlyYmQtPnNrYiA9IG5ld3NrYjsKIAkJCQluZXdza2ItPmRldiA9IGRldjsKLQkJCQlyYmQtPnZfZGF0YSA9IG5ld3NrYi0+dGFpbDsKLQkJCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcih2aXJ0X3RvX2J1cyhuZXdza2ItPnRhaWwpKTsKKwkJCQlyYmQtPnZfZGF0YSA9IG5ld3NrYi0+ZGF0YTsKKwkJCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcih2aXJ0X3RvX2J1cyhuZXdza2ItPmRhdGEpKTsKICNpZmRlZiBfX21jNjgwMDBfXwotCQkJCWNhY2hlX2NsZWFyKHZpcnRfdG9fcGh5cyhuZXdza2ItPnRhaWwpLCBQS1RfQlVGX1NaKTsKKwkJCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMobmV3c2tiLT5kYXRhKSwgUEtUX0JVRl9TWik7CiAjZW5kaWYKIAkJCX0KIAkJCWVsc2UKQEAgLTg0MCw3ICs4NDAsNyBAQAogCQkJCXNrYi0+cHJvdG9jb2w9ZXRoX3R5cGVfdHJhbnMoc2tiLGRldik7CiAJCQkJc2tiLT5sZW4gPSBwa3RfbGVuOwogI2lmZGVmIF9fbWM2ODAwMF9fCi0JCQkJY2FjaGVfY2xlYXIodmlydF90b19waHlzKHJiZC0+c2tiLT50YWlsKSwKKwkJCQljYWNoZV9jbGVhcih2aXJ0X3RvX3BoeXMocmJkLT5za2ItPmRhdGEpLAogCQkJCQkJcGt0X2xlbik7CiAjZW5kaWYKIAkJCQluZXRpZl9yeChza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggZmE5Zjc2Yy4uOWEwN2ZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0zLDYgKzMsOCBAQAogIyBOZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKK21lbnUgIk5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCisKIGNvbmZpZyBORVRERVZJQ0VTCiAJZGVwZW5kcyBvbiBORVQKIAlib29sICJOZXR3b3JrIGRldmljZSBzdXBwb3J0IgpAQCAtMTMyMCw3ICsxMzIyLDcgQEAKIAogY29uZmlnIENTODl4MAogCXRyaXN0YXRlICJDUzg5eDAgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgKElTQSB8fCBBUkNIX0lYRFAyWDAxKQorCWRlcGVuZHMgb24gKE5FVF9QQ0kgJiYgKElTQSB8fCBBUkNIX0lYRFAyWDAxKSkgfHwgQVJDSF9QTlgwMTA1CiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgQ1M4OXgwIGNoaXBzZXQgYmFzZWQgRXRoZXJuZXQgY2FyZHMuIElmIHlvdSBoYXZlIGEKIAkgIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kIHJlYWQgdGhlCkBAIC0xNDg4LDE0ICsxNDkwLDE0IEBACiAJICB3aWxsIGJlIGNhbGxlZCA4MTM5Y3AuICBUaGlzIGlzIHJlY29tbWVuZGVkLgogCiBjb25maWcgODEzOVRPTwotCXRyaXN0YXRlICJSZWFsVGVrIFJUTC04MTM5IFBDSSBGYXN0IEV0aGVybmV0IEFkYXB0ZXIgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiUmVhbFRlayBSVEwtODEyOS84MTMwLzgxMzkgUENJIEZhc3QgRXRoZXJuZXQgQWRhcHRlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gTkVUX1BDSSAmJiBQQ0kKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEZhc3QgRXRoZXJuZXQgUENJIG5ldHdvcmsgY2FyZHMgYmFzZWQgb24KLQkgIHRoZSBSVEw4MTM5IGNoaXBzLiBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UsIHNheSBZIGFuZCByZWFkCi0JICB0aGUgRXRoZXJuZXQtSE9XVE8gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKwkgIHRoZSBSVEwgODEyOS84MTMwLzgxMzkgY2hpcHMuIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSwgc2F5IFkgYW5kCisJICByZWFkIHRoZSBFdGhlcm5ldC1IT1dUTyA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCA4MTM5dG9vLiAgVGhpcyBpcyByZWNvbW1lbmRlZC4KQEAgLTI1NDcsMyArMjU0OSw0IEBACiAJSWYgeW91IHdhbnQgdG8gbG9nIGtlcm5lbCBtZXNzYWdlcyBvdmVyIHRoZSBuZXR3b3JrLCBlbmFibGUgdGhpcy4KIAlTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldGNvbnNvbGUudHh0PiBmb3IgZGV0YWlscy4KIAorZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYWMzMjAwLmMgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwppbmRleCAyNGZiYTM2Li45MTc5MWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hYzMyMDAuYworKysgYi9kcml2ZXJzL25ldC9hYzMyMDAuYwpAQCAtMTQ2LDEyICsxNDYsNyBAQAogCWVyciA9IGRvX2FjMzIwMF9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0yNzMsNyArMjY4LDE0IEBACiAJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOwogI2VuZGlmCiAJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0MjsKIAlyZXR1cm4gMDsKK291dDI6CisJaWYgKGVpX3N0YXR1cy5yZWcwKQorCQlpb3VubWFwKCh2b2lkICopZGV2LT5tZW1fc3RhcnQpOwogb3V0MToKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIG91dDoKQEAgLTM5MiwxMSArMzk0LDggQEAKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsJCS8qIEN1cnJlbnRseSBpZ25vcmVkIGJ5IGRyaXZlciAqLwogCQlpZiAoZG9fYWMzMjAwX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfYWMzMltmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2FjMzJbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhYzMyMDAuYzogTm8gYWMzMjAwIGNhcmQgZm91bmQgKGkvbyA9IDB4JXgpLlxuIiwgaW9bdGhpc19kZXZdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FjZW5pYy5jIGIvZHJpdmVycy9uZXQvYWNlbmljLmMKaW5kZXggNmVlYTNhOC4uZGJlY2M2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYWNlbmljLmMKKysrIGIvZHJpdmVycy9uZXQvYWNlbmljLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTExNjcsOSArMTE2OCw5IEBACiAJLyoKIAkgKiBDb25maWd1cmUgRE1BIGF0dHJpYnV0ZXMuCiAJICovCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSB7CiAJCWFwLT5wY2lfdXNpbmdfZGFjID0gMTsKLQl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTEwpKSB7CisJfSBlbHNlIGlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJYXAtPnBjaV91c2luZ19kYWMgPSAwOwogCX0gZWxzZSB7CiAJCWVjb2RlID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9hbWQ4MTExZS5jCmluZGV4IGI3ZGQ3MjYuLjg2MTgwMTIgMTAwNzU1Ci0tLSBhL2RyaXZlcnMvbmV0L2FtZDgxMTFlLmMKKysrIGIvZHJpdmVycy9uZXQvYW1kODExMWUuYwpAQCAtODcsNiArODcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgkKICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0yMDA2LDEyICsyMDA3LDExIEBACiAJfQogCiAJLyogSW5pdGlhbGl6ZSBETUEgKi8KLQlpZighcGNpX2RtYV9zdXBwb3J0ZWQocGRldiwgMHhmZmZmZmZmZikpeworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhbWQ4MTExZTogRE1BIG5vdCBzdXBwb3J0ZWQsIgogCQkJImV4aXRpbmcuXG4iKTsKLQkJZ290byAgZXJyX2ZyZWVfcmVnOwotCX0gZWxzZQotCQlwZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmY7CisJCWdvdG8gZXJyX2ZyZWVfcmVnOworCX0KIAkKIAlyZWdfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlyZWdfbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FwcGxldGFsay9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcKaW5kZXggNjljNDg4ZC4uYjE0ZTg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvYXBwbGV0YWxrL0tjb25maWcKQEAgLTEsNiArMSwzMyBAQAogIwogIyBBcHBsZXRhbGsgZHJpdmVyIGNvbmZpZ3VyYXRpb24KICMKK2NvbmZpZyBBVEFMSworCXRyaXN0YXRlICJBcHBsZXRhbGsgcHJvdG9jb2wgc3VwcG9ydCIKKwlzZWxlY3QgTExDCisJLS0taGVscC0tLQorCSAgQXBwbGVUYWxrIGlzIHRoZSBwcm90b2NvbCB0aGF0IEFwcGxlIGNvbXB1dGVycyBjYW4gdXNlIHRvIGNvbW11bmljYXRlCisJICBvbiBhIG5ldHdvcmsuICBJZiB5b3VyIExpbnV4IGJveCBpcyBjb25uZWN0ZWQgdG8gc3VjaCBhIG5ldHdvcmsgYW5kIHlvdQorCSAgd2lzaCB0byBjb25uZWN0IHRvIGl0LCBzYXkgWS4gIFlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBuZXRhdGFsayBwYWNrYWdlCisJICBzbyB0aGF0IHlvdXIgTGludXggYm94IGNhbiBhY3QgYXMgYSBwcmludCBhbmQgZmlsZSBzZXJ2ZXIgZm9yIE1hY3MgYXMKKwkgIHdlbGwgYXMgYWNjZXNzIEFwcGxlVGFsayBwcmludGVycy4gIENoZWNrIG91dAorCSAgPGh0dHA6Ly93d3cuemV0dGFieXRlLm5ldC9uZXRhdGFsay8+IG9uIHRoZSBXV1cgZm9yIGRldGFpbHMuCisJICBFdGhlclRhbGsgaXMgdGhlIG5hbWUgdXNlZCBmb3IgQXBwbGVUYWxrIG92ZXIgRXRoZXJuZXQgYW5kIHRoZQorCSAgY2hlYXBlciBhbmQgc2xvd2VyIExvY2FsVGFsayBpcyBBcHBsZVRhbGsgb3ZlciBhIHByb3ByaWV0YXJ5IEFwcGxlCisJICBuZXR3b3JrIHVzaW5nIHNlcmlhbCBsaW5rcy4gIEV0aGVyVGFsayBhbmQgTG9jYWxUYWxrIGFyZSBmdWxseQorCSAgc3VwcG9ydGVkIGJ5IExpbnV4LgorCisJICBHZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb25uZWN0IExpbnV4LCBXaW5kb3dzIG1hY2hpbmVzIGFuZAorCSAgTWFjcyBpcyBvbiB0aGUgV1dXIGF0IDxodHRwOi8vd3d3LmVhdHMuY29tL2xpbnV4X21hY193aW4uaHRtbD4uICBUaGUKKwkgIE5FVC0zLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgY29udGFpbnMgdmFsdWFibGUKKwkgIGluZm9ybWF0aW9uIGFzIHdlbGwuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGFwcGxldGFsay4gWW91IGFsbW9zdCBjZXJ0YWlubHkgd2FudCB0byBjb21waWxlIGl0IGFzIGEKKwkgIG1vZHVsZSBzbyB5b3UgY2FuIHJlc3RhcnQgeW91ciBBcHBsZVRhbGsgc3RhY2sgd2l0aG91dCByZWJvb3RpbmcKKwkgIHlvdXIgbWFjaGluZS4gSSBoZWFyIHRoYXQgdGhlIEdOVSBib3ljb3R0IG9mIEFwcGxlIGlzIG92ZXIsIHNvCisJICBldmVuIHBvbGl0aWNhbGx5IGNvcnJlY3QgcGVvcGxlIGFyZSBhbGxvd2VkIHRvIHNheSBZIGhlcmUuCisKIGNvbmZpZyBERVZfQVBQTEVUQUxLCiAJYm9vbCAiQXBwbGV0YWxrIGludGVyZmFjZXMgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFUQUxLCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXJoLmMKaW5kZXggMmUyOGMyMC4uOTQyYTI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyaC5jCisrKyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcmguYwpAQCAtNjgsNyArNjgsNiBAQAogCXZvaWQgX19pb21lbQkqZG1hX2Jhc2U7CiAJdW5zaWduZWQgaW50CWlkOwogCXZvaWQgX19pb21lbQkqY3RybF9wb3J0OwotCXZvaWQgX19pb21lbQkqYmFzZTsKIAl1bnNpZ25lZCBjaGFyCWN0cmw7CiAJdTMyCQlzdXBwb3J0ZWQ7CiB9OwpAQCAtMTc4LDcgKzE3Nyw3IEBACiAJc3dpdGNoIChldGhlcmhfcHJpdihkZXYpLT5pZCkgewogCWNhc2UgUFJPRF9JM19FVEhFUkxBTjYwMDoKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDBBOgotCQlhZGRyID0gZXRoZXJoX3ByaXYoZGV2KS0+YmFzZSArIEVOMF9SQ05USEk7CisJCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyICsgRU4wX1JDTlRISTsKIAogCQlzd2l0Y2ggKGRldi0+aWZfcG9ydCkgewogCQljYXNlIElGX1BPUlRfMTBCQVNFMjoKQEAgLTIxOSw3ICsyMTgsNyBAQAogCXN3aXRjaCAoZXRoZXJoX3ByaXYoZGV2KS0+aWQpIHsKIAljYXNlIFBST0RfSTNfRVRIRVJMQU42MDA6CiAJY2FzZSBQUk9EX0kzX0VUSEVSTEFONjAwQToKLQkJYWRkciA9IGV0aGVyaF9wcml2KGRldiktPmJhc2UgKyBFTjBfUkNOVEhJOworCQlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkciArIEVOMF9SQ05USEk7CiAJCXN3aXRjaCAoZGV2LT5pZl9wb3J0KSB7CiAJCWNhc2UgSUZfUE9SVF8xMEJBU0UyOgogCQkJc3RhdCA9IDE7CkBAIC0yODIsNyArMjgxLDcgQEAKIGV0aGVyaF9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBlaV9kZXZpY2UgKmVpX2xvY2FsID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl2b2lkIF9faW9tZW0gKmFkZHIgPSBldGhlcmhfcHJpdihkZXYpLT5iYXNlOworCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CiAKIAl3cml0ZWIoRTgzOTBfTk9ETUErRTgzOTBfUEFHRTArRTgzOTBfU1RPUCwgYWRkcik7CiAKQEAgLTMyOCw3ICszMjcsNyBAQAogCiAJZWlfbG9jYWwtPmRtYWluZyA9IDE7CiAKLQlhZGRyID0gZXRoZXJoX3ByaXYoZGV2KS0+YmFzZTsKKwlhZGRyID0gKHZvaWQgKilkZXYtPmJhc2VfYWRkcjsKIAlkbWFfYmFzZSA9IGV0aGVyaF9wcml2KGRldiktPmRtYV9iYXNlOwogCiAJY291bnQgPSAoY291bnQgKyAxKSAmIH4xOwpAQCAtMzg4LDcgKzM4Nyw3IEBACiAKIAllaV9sb2NhbC0+ZG1haW5nID0gMTsKIAotCWFkZHIgPSBldGhlcmhfcHJpdihkZXYpLT5iYXNlOworCWFkZHIgPSAodm9pZCAqKWRldi0+YmFzZV9hZGRyOwogCWRtYV9iYXNlID0gZXRoZXJoX3ByaXYoZGV2KS0+ZG1hX2Jhc2U7CiAKIAlidWYgPSBza2ItPmRhdGE7CkBAIC00MjgsNyArNDI3LDcgQEAKIAogCWVpX2xvY2FsLT5kbWFpbmcgPSAxOwogCi0JYWRkciA9IGV0aGVyaF9wcml2KGRldiktPmJhc2U7CisJYWRkciA9ICh2b2lkICopZGV2LT5iYXNlX2FkZHI7CiAJZG1hX2Jhc2UgPSBldGhlcmhfcHJpdihkZXYpLT5kbWFfYmFzZTsKIAogCXdyaXRlYiAoRTgzOTBfTk9ETUEgfCBFODM5MF9QQUdFMCB8IEU4MzkwX1NUQVJULCBhZGRyICsgRTgzOTBfQ01EKTsKQEAgLTY5Nyw4ICs2OTYsNyBAQAogCQllaC0+Y3RybF9wb3J0ID0gZWgtPmlvY19mYXN0OwogCX0KIAotCWVoLT5iYXNlID0gZWgtPm1lbWMgKyBkYXRhLT5uczgzOTBfb2Zmc2V0OwotCWRldi0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZWgtPmJhc2U7CisJZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZyllaC0+bWVtYyArIGRhdGEtPm5zODM5MF9vZmZzZXQ7CiAJZWgtPmRtYV9iYXNlID0gZWgtPm1lbWMgKyBkYXRhLT5kYXRhcG9ydF9vZmZzZXQ7CiAJZWgtPmN0cmxfcG9ydCArPSBkYXRhLT5jdHJscG9ydF9vZmZzZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2F0MTcwMC5jIGIvZHJpdmVycy9uZXQvYXQxNzAwLmMKaW5kZXggYjhhYjJiNi4uZTYxM2NjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXQxNzAwLmMKKysrIGIvZHJpdmVycy9uZXQvYXQxNzAwLmMKQEAgLTM0LDEwICszNCw2IEBACiAJb25seSBpcyBpdCBkaWZmaWN1bHQgdG8gZGV0ZWN0LCBpdCBhbHNvIG1vdmVzIGFyb3VuZCBpbiBJL08gc3BhY2UgaW4KIAlyZXNwb25zZSB0byBpbmIoKXMgZnJvbSBvdGhlciBkZXZpY2UgcHJvYmVzIQogKi8KLS8qCi0JOTkvMDMvMDMgIEFsbGllZCBUZWxlc2lzIFJFMTAwMCBQbHVzIHN1cHBvcnQgYnkgVC5IYWdhd2EKLQk5OS8xMi8zMAlwb3J0IHRvIDIuMy4zNSBieSBLLlRha2FpCi0qLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2I0NC5jIGIvZHJpdmVycy9uZXQvYjQ0LmMKaW5kZXggM2ZlOGJhOS4uOTQ5MzlmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYjQ0LmMKKysrIGIvZHJpdmVycy9uZXQvYjQ0LmMKQEAgLTEyODUsNiArMTI4NSw5IEBACiAJYjQ0X2luaXRfaHcoYnApOwogCWJwLT5mbGFncyB8PSBCNDRfRkxBR19JTklUX0NPTVBMRVRFOwogCisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKKwliNDRfY2hlY2tfcGh5KGJwKTsKKwogCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogCiAJaW5pdF90aW1lcigmYnAtPnRpbWVyKTsKQEAgLTE5MjcsNiArMTkzMCw3IEBACiAJYjQ0X2ZyZWVfcmluZ3MoYnApOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xOTM2LDYgKzE5NDAsOCBAQAogCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm1hYy5jIGIvZHJpdmVycy9uZXQvYm1hYy5jCmluZGV4IDAwZTUyNTcuLjhkYzY1N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JtYWMuYworKysgYi9kcml2ZXJzL25ldC9ibWFjLmMKQEAgLTEyNjEsNyArMTI2MSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgYm1hY19wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKQorc3RhdGljIGludCBfX2RldmluaXQgYm1hY19wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlpbnQgaiwgcmV2LCByZXQ7CiAJc3RydWN0IGJtYWNfZGF0YSAqYnA7CkBAIC0xNjQ1LDE2ICsxNjQ1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggYm1hY19tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBibWFjX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJibWFjIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gsCiAJLmRhdGEJCT0gKHZvaWQgKikwLAogCX0sCiAJewotCS5uYW1lIAkJPSBPRl9BTllfTUFUQ0gsCiAJLnR5cGUJCT0gIm5ldHdvcmsiLAogCS5jb21wYXRpYmxlCT0gImJtYWMrIiwKIAkuZGF0YQkJPSAodm9pZCAqKTEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKaW5kZXggNjIzM2M0Zi4uYTJlOGRkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwpAQCAtMjM0Niw3ICsyMzQ2LDYgQEAKIHsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlLCAqc3RhcnRfYXQ7CiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBkZXYtPnByaXY7Ci0Jc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwogCWludCBzbGF2ZV9hZ2dfbm87CiAJaW50IHNsYXZlc19pbl9hZ2c7CiAJaW50IGFnZ19pZDsKQEAgLTIzNzcsNyArMjM3Niw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXNsYXZlX2FnZ19ubyA9IChkYXRhLT5oX2Rlc3RbNV1eYm9uZC0+ZGV2LT5kZXZfYWRkcls1XSkgJSBzbGF2ZXNfaW5fYWdnOworCXNsYXZlX2FnZ19ubyA9IGJvbmQtPnhtaXRfaGFzaF9wb2xpY3koc2tiLCBkZXYsIHNsYXZlc19pbl9hZ2cpOwogCiAJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkgewogCQlzdHJ1Y3QgYWdncmVnYXRvciAqYWdnID0gU0xBVkVfQURfSU5GTyhzbGF2ZSkucG9ydC5hZ2dyZWdhdG9yOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggMjY5YTVlNC4uMmM5MzBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC00NzUsNyArNDc1LDE4IEBACiAgKiAgICAgICAgU29sdXRpb24gaXMgdG8gbW92ZSBjYWxsIHRvIGRldl9yZW1vdmVfcGFjayBvdXRzaWRlIG9mIHRoZQogICogICAgICAgIHNwaW5sb2NrLgogICogICAgICAgIFNldCB2ZXJzaW9uIHRvIDIuNi4xLgotICoKKyAqIDIwMDUvMDYvMDUgLSBKYXkgVm9zYnVyZ2ggPGZ1YmFyQHVzLmlibS5jb20+CisgKiAJLSBTdXBwb3J0IGZvciBnZW5lcmF0aW5nIGdyYXR1aXRvdXMgQVJQcyBpbiBhY3RpdmUtYmFja3VwIG1vZGUuCisgKiAJICBJbmNsdWRlcyBzdXBwb3J0IGZvciBWTEFOIHRhZ2dpbmcgYWxsIGJvbmRpbmctZ2VuZXJhdGVkIEFSUHMKKyAqIAkgIGFzIG5lZWRlZC4gIFNldCB2ZXJzaW9uIHRvIDIuNi4yLgorICogMjAwNS8wNi8wOCAtIEphc29uIEdhYmxlciA8anlnYWJsZXIgYXQgbGJsIGRvdCBnb3Y+CisgKgktIGFsdGVybmF0ZSBoYXNoaW5nIHBvbGljeSBzdXBwb3J0IGZvciBtb2RlIDIKKyAqCSAgKiBBZGRlZCBrZXJuZWwgcGFyYW1ldGVyICJ4bWl0X2hhc2hfcG9saWN5IiB0byBhbGxvdyB0aGUgc2VsZWN0aW9uCisgKgkgICAgb2YgZGlmZmVyZW50IGhhc2hpbmcgcG9saWNpZXMgZm9yIG1vZGUgMi4gIFRoZSBvcmlnaW5hbCBtb2RlIDIKKyAqCSAgICBwb2xpY3kgaXMgdGhlIGRlZmF1bHQsIG5vdyBmb3VuZCBpbiB4bWl0X2hhc2hfcG9saWN5X2xheWVyMigpLgorICoJICAqIEFkZGVkIHhtaXRfaGFzaF9wb2xpY3lfbGF5ZXIzNCgpCisgKgktIE1vZGlmaWVkIGJ5IEpheSBWb3NidXJnaCA8ZnViYXJAdXMuaWJtLmNvbT4gdG8gYWxzbyBzdXBwb3J0IG1vZGUgNC4KKyAqCSAgU2V0IHZlcnNpb24gdG8gMi42LjMuCiAgKi8KIAogLy8jZGVmaW5lIEJPTkRJTkdfREVCVUcgMQpAQCAtNDkwLDcgKzUwMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtNTE5LDYgKzUzMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+CisjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSAiYm9uZGluZy5oIgogI2luY2x1ZGUgImJvbmRfM2FkLmgiCiAjaW5jbHVkZSAiYm9uZF9hbGIuaCIKQEAgLTUzNyw2ICs1NTIsNyBAQAogc3RhdGljIGNoYXIgKm1vZGUJPSBOVUxMOwogc3RhdGljIGNoYXIgKnByaW1hcnkJPSBOVUxMOwogc3RhdGljIGNoYXIgKmxhY3BfcmF0ZQk9IE5VTEw7CitzdGF0aWMgY2hhciAqeG1pdF9oYXNoX3BvbGljeSA9IE5VTEw7CiBzdGF0aWMgaW50IGFycF9pbnRlcnZhbCA9IEJPTkRfTElOS19BUlBfSU5URVJWOwogc3RhdGljIGNoYXIgKmFycF9pcF90YXJnZXRbQk9ORF9NQVhfQVJQX1RBUkdFVFNdID0geyBOVUxMLCB9OwogCkBAIC01NTYsNiArNTcyLDggQEAKIE1PRFVMRV9QQVJNX0RFU0MocHJpbWFyeSwgIlByaW1hcnkgbmV0d29yayBkZXZpY2UgdG8gdXNlIik7CiBtb2R1bGVfcGFyYW0obGFjcF9yYXRlLCBjaGFycCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxhY3BfcmF0ZSwgIkxBQ1BEVSB0eCByYXRlIHRvIHJlcXVlc3QgZnJvbSA4MDIuM2FkIHBhcnRuZXIgKHNsb3cvZmFzdCkiKTsKK21vZHVsZV9wYXJhbSh4bWl0X2hhc2hfcG9saWN5LCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHhtaXRfaGFzaF9wb2xpY3ksICJYT1IgaGFzaGluZyBtZXRob2QgOiAwIGZvciBsYXllciAyIChkZWZhdWx0KSwgMSBmb3IgbGF5ZXIgMys0Iik7CiBtb2R1bGVfcGFyYW0oYXJwX2ludGVydmFsLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhhcnBfaW50ZXJ2YWwsICJhcnAgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoYXJwX2lwX3RhcmdldCwgY2hhcnAsIE5VTEwsIDApOwpAQCAtNTc0LDggKzU5Miw4IEBACiAKIHN0YXRpYyB1MzIgYXJwX3RhcmdldFtCT05EX01BWF9BUlBfVEFSR0VUU10gPSB7IDAsIH0gOwogc3RhdGljIGludCBhcnBfaXBfY291bnQJPSAwOwotc3RhdGljIHUzMiBteV9pcAk9IDA7CiBzdGF0aWMgaW50IGJvbmRfbW9kZQk9IEJPTkRfTU9ERV9ST1VORFJPQklOOworc3RhdGljIGludCB4bWl0X2hhc2h0eXBlPSBCT05EX1hNSVRfUE9MSUNZX0xBWUVSMjsKIHN0YXRpYyBpbnQgbGFjcF9mYXN0CT0gMDsKIHN0YXRpYyBpbnQgYXBwX2FiaV92ZXIJPSAwOwogc3RhdGljIGludCBvcmlnX2FwcF9hYmlfdmVyID0gLTE7IC8qIFRoaXMgaXMgdXNlZCB0byBzYXZlIHRoZSBmaXJzdCBBQkkgdmVyc2lvbgpAQCAtNTg1LDcgKzYwMyw2IEBACiAJCQkJICAgKiBjb21tYW5kIGNvbWVzIGZyb20gYW4gYXBwbGljYXRpb24gdXNpbmcKIAkJCQkgICAqIGFub3RoZXIgQUJJIHZlcnNpb24uCiAJCQkJICAgKi8KLQogc3RydWN0IGJvbmRfcGFybV90YmwgewogCWNoYXIgKm1vZGVuYW1lOwogCWludCBtb2RlOwpAQCAtNjA4LDkgKzYyNSwxNiBAQAogewlOVUxMLAkJCS0xfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgYm9uZF9wYXJtX3RibCB4bWl0X2hhc2h0eXBlX3RibFtdID0geworewkibGF5ZXIyIiwJCUJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIyfSwKK3sJImxheWVyMys0IiwJCUJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIzNH0sCit7CU5VTEwsCQkJLTF9LAorfTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGb3J3YXJkIGRlY2xhcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgYm9uZF9zZXRfbW9kZV9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgaW5saW5lIHZvaWQgYm9uZF9zZXRfbW9kZV9vcHMoc3RydWN0IGJvbmRpbmcgKmJvbmQsIGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIGJvbmRfc2VuZF9ncmF0dWl0b3VzX2FycChzdHJ1Y3QgYm9uZGluZyAqYm9uZCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHZW5lcmFsIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNjU5LDYgKzY4Myw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdmxhbi0+dmxhbl9saXN0KTsKIAl2bGFuLT52bGFuX2lkID0gdmxhbl9pZDsKKwl2bGFuLT52bGFuX2lwID0gMDsKIAogCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOwogCkBAIC0xNDY4LDE2ICsxNDkzLDYgQEAKIAkJfQogCX0KIAotCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7Ci0JCWlmIChvbGRfYWN0aXZlKSB7Ci0JCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhvbGRfYWN0aXZlKTsKLQkJfQotCi0JCWlmIChuZXdfYWN0aXZlKSB7Ci0JCQlib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3MobmV3X2FjdGl2ZSk7Ci0JCX0KLQl9Ci0KIAlpZiAoVVNFU19QUklNQVJZKGJvbmQtPnBhcmFtcy5tb2RlKSkgewogCQlib25kX21jX3N3YXAoYm9uZCwgbmV3X2FjdGl2ZSwgb2xkX2FjdGl2ZSk7CiAJfQpAQCAtMTQ4OCw2ICsxNTAzLDE3IEBACiAJfSBlbHNlIHsKIAkJYm9uZC0+Y3Vycl9hY3RpdmVfc2xhdmUgPSBuZXdfYWN0aXZlOwogCX0KKworCWlmIChib25kLT5wYXJhbXMubW9kZSA9PSBCT05EX01PREVfQUNUSVZFQkFDS1VQKSB7CisJCWlmIChvbGRfYWN0aXZlKSB7CisJCQlib25kX3NldF9zbGF2ZV9pbmFjdGl2ZV9mbGFncyhvbGRfYWN0aXZlKTsKKwkJfQorCisJCWlmIChuZXdfYWN0aXZlKSB7CisJCQlib25kX3NldF9zbGF2ZV9hY3RpdmVfZmxhZ3MobmV3X2FjdGl2ZSk7CisJCX0KKwkJYm9uZF9zZW5kX2dyYXR1aXRvdXNfYXJwKGJvbmQpOworCX0KIH0KIAogLyoqCkBAIC0yNjk0LDE1ICsyNzIwLDE4MCBAQAogCXJlYWRfdW5sb2NrKCZib25kLT5sb2NrKTsKIH0KIAorCitzdGF0aWMgdTMyIGJvbmRfZ2xlYW5fZGV2X2lwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGluX2RldmljZSAqaWRldjsKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmE7CisJdTMyIGFkZHIgPSAwOworCisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWlkZXYgPSBfX2luX2Rldl9nZXQoZGV2KTsKKwlpZiAoIWlkZXYpCisJCWdvdG8gb3V0OworCisJaWZhID0gaWRldi0+aWZhX2xpc3Q7CisJaWYgKCFpZmEpCisJCWdvdG8gb3V0OworCisJYWRkciA9IGlmYS0+aWZhX2xvY2FsOworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW50IGJvbmRfaGFzX2lwKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuLCAqdmxhbl9uZXh0OworCisJaWYgKGJvbmQtPm1hc3Rlcl9pcCkKKwkJcmV0dXJuIDE7CisKKwlpZiAobGlzdF9lbXB0eSgmYm9uZC0+dmxhbl9saXN0KSkKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmxhbiwgdmxhbl9uZXh0LCAmYm9uZC0+dmxhbl9saXN0LAorCQkJCSB2bGFuX2xpc3QpIHsKKwkJaWYgKHZsYW4tPnZsYW5faXApCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGdvIHRvIHRoZSAobGFyZ2UpIHRyb3VibGUgb2YgVkxBTiB0YWdnaW5nIEFSUCBmcmFtZXMgYmVjYXVzZQorICogc3dpdGNoZXMgaW4gVkxBTiBtb2RlIChlc3BlY2lhbGx5IGlmIHBvcnRzIGFyZSBjb25maWd1cmVkIGFzCisgKiAibmF0aXZlIiB0byBhIFZMQU4pIG1pZ2h0IG5vdCBwYXNzIG5vbi10YWdnZWQgZnJhbWVzLgorICovCitzdGF0aWMgdm9pZCBib25kX2FycF9zZW5kKHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYsIGludCBhcnBfb3AsIHUzMiBkZXN0X2lwLCB1MzIgc3JjX2lwLCB1bnNpZ25lZCBzaG9ydCB2bGFuX2lkKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlkcHJpbnRrKCJhcnAgJWQgb24gc2xhdmUgJXM6IGRzdCAleCBzcmMgJXggdmlkICVkXG4iLCBhcnBfb3AsCisJICAgICAgIHNsYXZlX2Rldi0+bmFtZSwgZGVzdF9pcCwgc3JjX2lwLCB2bGFuX2lkKTsKKwkgICAgICAgCisJc2tiID0gYXJwX2NyZWF0ZShhcnBfb3AsIEVUSF9QX0FSUCwgZGVzdF9pcCwgc2xhdmVfZGV2LCBzcmNfaXAsCisJCQkgTlVMTCwgc2xhdmVfZGV2LT5kZXZfYWRkciwgTlVMTCk7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogQVJQIHBhY2tldCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHZsYW5faWQpIHsKKwkJc2tiID0gdmxhbl9wdXRfdGFnKHNrYiwgdmxhbl9pZCk7CisJCWlmICghc2tiKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogZmFpbGVkIHRvIGluc2VydCBWTEFOIHRhZ1xuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJYXJwX3htaXQoc2tiKTsKK30KKworCiBzdGF0aWMgdm9pZCBib25kX2FycF9zZW5kX2FsbChzdHJ1Y3QgYm9uZGluZyAqYm9uZCwgc3RydWN0IHNsYXZlICpzbGF2ZSkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgdmxhbl9pZCwgcnY7CiAJdTMyICp0YXJnZXRzID0gYm9uZC0+cGFyYW1zLmFycF90YXJnZXRzOworCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuLCAqdmxhbl9uZXh0OworCXN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldjsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CiAKIAlmb3IgKGkgPSAwOyAoaSA8IEJPTkRfTUFYX0FSUF9UQVJHRVRTKSAmJiB0YXJnZXRzW2ldOyBpKyspIHsKLQkJYXJwX3NlbmQoQVJQT1BfUkVRVUVTVCwgRVRIX1BfQVJQLCB0YXJnZXRzW2ldLCBzbGF2ZS0+ZGV2LAotCQkJIG15X2lwLCBOVUxMLCBzbGF2ZS0+ZGV2LT5kZXZfYWRkciwKLQkJCSBOVUxMKTsKKwkJZHByaW50aygiYmFzYTogdGFyZ2V0ICV4XG4iLCB0YXJnZXRzW2ldKTsKKwkJaWYgKGxpc3RfZW1wdHkoJmJvbmQtPnZsYW5fbGlzdCkpIHsKKwkJCWRwcmludGsoImJhc2E6IGVtcHR5IHZsYW46IGFycF9zZW5kXG4iKTsKKwkJCWJvbmRfYXJwX3NlbmQoc2xhdmUtPmRldiwgQVJQT1BfUkVRVUVTVCwgdGFyZ2V0c1tpXSwKKwkJCQkgICAgICBib25kLT5tYXN0ZXJfaXAsIDApOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJZiBWTEFOcyBhcmUgY29uZmlndXJlZCwgd2UgZG8gYSByb3V0ZSBsb29rdXAgdG8KKwkJICogZGV0ZXJtaW5lIHdoaWNoIFZMQU4gaW50ZXJmYWNlIHdvdWxkIGJlIHVzZWQsIHNvIHdlCisJCSAqIGNhbiB0YWcgdGhlIEFSUCB3aXRoIHRoZSBwcm9wZXIgVkxBTiB0YWcuCisJCSAqLworCQltZW1zZXQoJmZsLCAwLCBzaXplb2YoZmwpKTsKKwkJZmwuZmw0X2RzdCA9IHRhcmdldHNbaV07CisJCWZsLmZsNF90b3MgPSBSVE9fT05MSU5LOworCisJCXJ2ID0gaXBfcm91dGVfb3V0cHV0X2tleSgmcnQsICZmbCk7CisJCWlmIChydikgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgRFJWX05BTUUKKwkJCSAgICAgIjogJXM6IG5vIHJvdXRlIHRvIGFycF9pcF90YXJnZXQgJXUuJXUuJXUuJXVcbiIsCisJCQkJICAgICAgIGJvbmQtPmRldi0+bmFtZSwgTklQUVVBRChmbC5mbDRfZHN0KSk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgdGFyZ2V0IGlzIG5vdCBvbiBhIFZMQU4KKwkJICovCisJCWlmIChydC0+dS5kc3QuZGV2ID09IGJvbmQtPmRldikgeworCQkJZHByaW50aygiYmFzYTogcnRkZXYgPT0gYm9uZC0+ZGV2OiBhcnBfc2VuZFxuIik7CisJCQlib25kX2FycF9zZW5kKHNsYXZlLT5kZXYsIEFSUE9QX1JFUVVFU1QsIHRhcmdldHNbaV0sCisJCQkJICAgICAgYm9uZC0+bWFzdGVyX2lwLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdmxhbl9pZCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCB2bGFuX25leHQsICZib25kLT52bGFuX2xpc3QsCisJCQkJCSB2bGFuX2xpc3QpIHsKKwkJCXZsYW5fZGV2ID0gYm9uZC0+dmxncnAtPnZsYW5fZGV2aWNlc1t2bGFuLT52bGFuX2lkXTsKKwkJCWlmICh2bGFuX2RldiA9PSBydC0+dS5kc3QuZGV2KSB7CisJCQkJdmxhbl9pZCA9IHZsYW4tPnZsYW5faWQ7CisJCQkJZHByaW50aygiYmFzYTogdmxhbiBtYXRjaCBvbiAlcyAlZFxuIiwKKwkJCQkgICAgICAgdmxhbl9kZXYtPm5hbWUsIHZsYW5faWQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHZsYW5faWQpIHsKKwkJCWJvbmRfYXJwX3NlbmQoc2xhdmUtPmRldiwgQVJQT1BfUkVRVUVTVCwgdGFyZ2V0c1tpXSwKKwkJCQkgICAgICB2bGFuLT52bGFuX2lwLCB2bGFuX2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRQorCSAgICAgICAiOiAlczogbm8gcGF0aCB0byBhcnBfaXBfdGFyZ2V0ICV1LiV1LiV1LiV1IHZpYSBydC5kZXYgJXNcbiIsCisJCQkgICAgICAgYm9uZC0+ZGV2LT5uYW1lLCBOSVBRVUFEKGZsLmZsNF9kc3QpLAorCQkJICAgICAgIHJ0LT51LmRzdC5kZXYgPyBydC0+dS5kc3QuZGV2LT5uYW1lIDogIk5VTEwiKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEtpY2sgb3V0IGEgZ3JhdHVpdG91cyBBUlAgZm9yIGFuIElQIG9uIHRoZSBib25kaW5nIG1hc3RlciBwbHVzIG9uZQorICogZm9yIGVhY2ggVkxBTiBhYm92ZSB1cy4KKyAqLworc3RhdGljIHZvaWQgYm9uZF9zZW5kX2dyYXR1aXRvdXNfYXJwKHN0cnVjdCBib25kaW5nICpib25kKQoreworCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKKwlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbl9kZXY7CisKKwlkcHJpbnRrKCJib25kX3NlbmRfZ3JhdF9hcnA6IGJvbmQgJXMgc2xhdmUgJXNcbiIsIGJvbmQtPmRldi0+bmFtZSwKKwkJCQlzbGF2ZSA/IHNsYXZlLT5kZXYtPm5hbWUgOiAiTlVMTCIpOworCWlmICghc2xhdmUpCisJCXJldHVybjsKKworCWlmIChib25kLT5tYXN0ZXJfaXApIHsKKwkJYm9uZF9hcnBfc2VuZChzbGF2ZS0+ZGV2LCBBUlBPUF9SRVBMWSwgYm9uZC0+bWFzdGVyX2lwLAorCQkJCSAgYm9uZC0+bWFzdGVyX2lwLCAwKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgeworCQl2bGFuX2RldiA9IGJvbmQtPnZsZ3JwLT52bGFuX2RldmljZXNbdmxhbi0+dmxhbl9pZF07CisJCWlmICh2bGFuLT52bGFuX2lwKSB7CisJCQlib25kX2FycF9zZW5kKHNsYXZlLT5kZXYsIEFSUE9QX1JFUExZLCB2bGFuLT52bGFuX2lwLAorCQkJCSAgICAgIHZsYW4tPnZsYW5faXAsIHZsYW4tPnZsYW5faWQpOworCQl9CiAJfQogfQogCkBAIC0yNzgxLDcgKzI5NzIsNyBAQAogCQkJICovCiAJCQlpZiAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+dHJhbnNfc3RhcnQpID49ICgyKmRlbHRhX2luX3RpY2tzKSkgfHwKIAkJCSAgICAoKChqaWZmaWVzIC0gc2xhdmUtPmRldi0+bGFzdF9yeCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSAmJgotCQkJICAgICBteV9pcCkpIHsKKwkJCSAgICAgYm9uZF9oYXNfaXAoYm9uZCkpKSB7CiAKIAkJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKIAkJCQlzbGF2ZS0+c3RhdGUgPSBCT05EX1NUQVRFX0JBQ0tVUDsKQEAgLTI5MjAsNyArMzExMSw3IEBACiAJCQlpZiAoKHNsYXZlICE9IGJvbmQtPmN1cnJfYWN0aXZlX3NsYXZlKSAmJgogCQkJICAgICghYm9uZC0+Y3VycmVudF9hcnBfc2xhdmUpICYmCiAJCQkgICAgKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPmxhc3RfcngpID49IDMqZGVsdGFfaW5fdGlja3MpICYmCi0JCQkgICAgIG15X2lwKSkgeworCQkJICAgICBib25kX2hhc19pcChib25kKSkpIHsKIAkJCQkvKiBhIGJhY2t1cCBzbGF2ZSBoYXMgZ29uZSBkb3duOyB0aHJlZSB0aW1lcwogCQkJCSAqIHRoZSBkZWx0YSBhbGxvd3MgdGhlIGN1cnJlbnQgc2xhdmUgdG8gYmUKIAkJCQkgKiB0YWtlbiBvdXQgYmVmb3JlIHRoZSBiYWNrdXAgc2xhdmUuCkBAIC0yOTY2LDggKzMxNTcsOCBAQAogCQkgKiBpZiBpdCBpcyB1cCBhbmQgbmVlZHMgdG8gdGFrZSBvdmVyIGFzIHRoZSBjdXJyX2FjdGl2ZV9zbGF2ZQogCQkgKi8KIAkJaWYgKCgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT50cmFuc19zdGFydCkgPj0gKDIqZGVsdGFfaW5fdGlja3MpKSB8fAotCQkgICAgICgoKGppZmZpZXMgLSBzbGF2ZS0+ZGV2LT5sYXN0X3J4KSA+PSAoMipkZWx0YV9pbl90aWNrcykpICYmCi0JCSAgICAgIG15X2lwKSkgJiYKKwkgICAgKCgoamlmZmllcyAtIHNsYXZlLT5kZXYtPmxhc3RfcngpID49ICgyKmRlbHRhX2luX3RpY2tzKSkgJiYKKwkgICAgIGJvbmRfaGFzX2lwKGJvbmQpKSkgJiYKIAkJICAgICgoamlmZmllcyAtIHNsYXZlLT5qaWZmaWVzKSA+PSAyKmRlbHRhX2luX3RpY2tzKSkgewogCiAJCQlzbGF2ZS0+bGluayAgPSBCT05EX0xJTktfRE9XTjsKQEAgLTMwMTksNyArMzIxMCw3IEBACiAJCS8qIHRoZSBjdXJyZW50IHNsYXZlIG11c3QgdHggYW4gYXJwIHRvIGVuc3VyZSBiYWNrdXAgc2xhdmVzCiAJCSAqIHJ4IHRyYWZmaWMKIAkJICovCi0JCWlmIChzbGF2ZSAmJiBteV9pcCkgeworCQlpZiAoc2xhdmUgJiYgYm9uZF9oYXNfaXAoYm9uZCkpIHsKIAkJCWJvbmRfYXJwX3NlbmRfYWxsKGJvbmQsIHNsYXZlKTsKIAkJfQogCX0KQEAgLTM0NzEsMTAgKzM2NjIsNjcgQEAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKKy8qCisgKiBib25kX2luZXRhZGRyX2V2ZW50OiBoYW5kbGUgaW5ldGFkZHIgbm90aWZpZXIgY2hhaW4gZXZlbnRzLgorICoKKyAqIFdlIGtlZXAgdHJhY2sgb2YgZGV2aWNlIElQcyBwcmltYXJpbHkgdG8gdXNlIGFzIHNvdXJjZSBhZGRyZXNzZXMgaW4KKyAqIEFSUCBtb25pdG9yIHByb2JlcyAocmF0aGVyIHRoYW4gc3Bld2luZyBvdXQgYnJvYWRjYXN0cyBhbGwgdGhlIHRpbWUpLgorICoKKyAqIFdlIHRyYWNrIG9uZSBJUCBmb3IgdGhlIG1haW4gZGV2aWNlIChpZiBpdCBoYXMgb25lKSwgcGx1cyBvbmUgcGVyIFZMQU4uCisgKi8KK3N0YXRpYyBpbnQgYm9uZF9pbmV0YWRkcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaW5faWZhZGRyICppZmEgPSBwdHI7CisJc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZGV2LCAqZXZlbnRfZGV2ID0gaWZhLT5pZmFfZGV2LT5kZXY7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQsICpib25kX25leHQ7CisJc3RydWN0IHZsYW5fZW50cnkgKnZsYW4sICp2bGFuX25leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYm9uZCwgYm9uZF9uZXh0LCAmYm9uZF9kZXZfbGlzdCwgYm9uZF9saXN0KSB7CisJCWlmIChib25kLT5kZXYgPT0gZXZlbnRfZGV2KSB7CisJCQlzd2l0Y2ggKGV2ZW50KSB7CisJCQljYXNlIE5FVERFVl9VUDoKKwkJCQlib25kLT5tYXN0ZXJfaXAgPSBpZmEtPmlmYV9sb2NhbDsKKwkJCQlyZXR1cm4gTk9USUZZX09LOworCQkJY2FzZSBORVRERVZfRE9XTjoKKwkJCQlib25kLT5tYXN0ZXJfaXAgPSBib25kX2dsZWFuX2Rldl9pcChib25kLT5kZXYpOworCQkJCXJldHVybiBOT1RJRllfT0s7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOT1RJRllfRE9ORTsKKwkJCX0KKwkJfQorCisJCWlmIChsaXN0X2VtcHR5KCZib25kLT52bGFuX2xpc3QpKQorCQkJY29udGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZsYW4sIHZsYW5fbmV4dCwgJmJvbmQtPnZsYW5fbGlzdCwKKwkJCQkJIHZsYW5fbGlzdCkgeworCQkJdmxhbl9kZXYgPSBib25kLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZsYW4tPnZsYW5faWRdOworCQkJaWYgKHZsYW5fZGV2ID09IGV2ZW50X2RldikgeworCQkJCXN3aXRjaCAoZXZlbnQpIHsKKwkJCQljYXNlIE5FVERFVl9VUDoKKwkJCQkJdmxhbi0+dmxhbl9pcCA9IGlmYS0+aWZhX2xvY2FsOworCQkJCQlyZXR1cm4gTk9USUZZX09LOworCQkJCWNhc2UgTkVUREVWX0RPV046CisJCQkJCXZsYW4tPnZsYW5faXAgPQorCQkJCQkJYm9uZF9nbGVhbl9kZXZfaXAodmxhbl9kZXYpOworCQkJCQlyZXR1cm4gTk9USUZZX09LOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBOT1RJRllfRE9ORTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJvbmRfbmV0ZGV2X25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gYm9uZF9uZXRkZXZfZXZlbnQsCiB9OwogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJvbmRfaW5ldGFkZHJfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBib25kX2luZXRhZGRyX2V2ZW50LAorfTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYWNrZXQgdHlwZSBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAvKiByZWdpc3RlciB0byByZWNlaXZlIGxhY3BkdXMgb24gYSBib25kICovCkBAIC0zNDk2LDYgKzM3NDQsNDYgQEAKIAlkZXZfcmVtb3ZlX3BhY2soJihCT05EX0FEX0lORk8oYm9uZCkuYWRfcGt0X3R5cGUpKTsKIH0KIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhhc2hpbmcgUG9saWNpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogSGFzaCBmb3IgdGhlIHRoZSBvdXRwdXQgZGV2aWNlIGJhc2VkIHVwb24gbGF5ZXIgMyBhbmQgbGF5ZXIgNCBkYXRhLiBJZgorICogdGhlIHBhY2tldCBpcyBhIGZyYWcgb3Igbm90IFRDUCBvciBVRFAsIGp1c3QgdXNlIGxheWVyIDMgZGF0YS4gIElmIGl0IGlzCisgKiBhbHRvZ2V0aGVyIG5vdCBJUCwgbWltaWMgYm9uZF94bWl0X2hhc2hfcG9saWN5X2wyKCkKKyAqLworc3RhdGljIGludCBib25kX3htaXRfaGFzaF9wb2xpY3lfbDM0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgaW50IGNvdW50KQoreworCXN0cnVjdCBldGhoZHIgKmRhdGEgPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOworCXUxNiAqbGF5ZXI0aGRyID0gKHUxNiAqKSgodTMyICopaXBoICsgaXBoLT5paGwpOworCWludCBsYXllcjRfeG9yID0gMDsKKworCWlmIChza2ItPnByb3RvY29sID09IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApKSB7CisJCWlmICghKGlwaC0+ZnJhZ19vZmYgJiBfX2NvbnN0YW50X2h0b25zKElQX01GfElQX09GRlNFVCkpICYmCisJCSAgICAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAorCQkgICAgIGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApKSB7CisJCQlsYXllcjRfeG9yID0gaHRvbnMoKCpsYXllcjRoZHIgXiAqKGxheWVyNGhkciArIDEpKSk7CisJCX0KKwkJcmV0dXJuIChsYXllcjRfeG9yIF4KKwkJCSgobnRvaGwoaXBoLT5zYWRkciBeIGlwaC0+ZGFkZHIpKSAmIDB4ZmZmZikpICUgY291bnQ7CisKKwl9CisKKwlyZXR1cm4gKGRhdGEtPmhfZGVzdFs1XSBeIGJvbmRfZGV2LT5kZXZfYWRkcls1XSkgJSBjb3VudDsKK30KKworLyoKKyAqIEhhc2ggZm9yIHRoZSBvdXRwdXQgZGV2aWNlIGJhc2VkIHVwb24gbGF5ZXIgMiBkYXRhCisgKi8KK3N0YXRpYyBpbnQgYm9uZF94bWl0X2hhc2hfcG9saWN5X2wyKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCBpbnQgY291bnQpCit7CisJc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCisJcmV0dXJuIChkYXRhLT5oX2Rlc3RbNV0gXiBib25kX2Rldi0+ZGV2X2FkZHJbNV0pICUgY291bnQ7Cit9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGV2aWNlIGVudHJ5IHBvaW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCBib25kX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQpAQCAtNDA2MCwxNyArNDM0OCw2IEBACiAJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBib25kX2Rldi0+cHJpdjsKIAlpbnQgcmVzID0gMTsKIAotCS8qIGlmIHdlIGFyZSBzZW5kaW5nIGFycCBwYWNrZXRzLCB0cnkgdG8gYXQgbGVhc3QKLQkgICBpZGVudGlmeSBvdXIgb3duIGlwIGFkZHJlc3MgKi8KLQlpZiAoYm9uZC0+cGFyYW1zLmFycF9pbnRlcnZhbCAmJiAhbXlfaXAgJiYKLQkJKHNrYi0+cHJvdG9jb2wgPT0gX19jb25zdGFudF9odG9ucyhFVEhfUF9BUlApKSkgewotCQljaGFyICp0aGVfaXAgPSAoY2hhciAqKXNrYi0+ZGF0YSArCi0JCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKLQkJCQlzaXplb2Yoc3RydWN0IGFycGhkcikgKwotCQkJCUVUSF9BTEVOOwotCQltZW1jcHkoJm15X2lwLCB0aGVfaXAsIDQpOwotCX0KLQogCXJlYWRfbG9jaygmYm9uZC0+bG9jayk7CiAJcmVhZF9sb2NrKCZib25kLT5jdXJyX3NsYXZlX2xvY2spOwogCkBAIC00MDkzLDE0ICs0MzcwLDEzIEBACiB9CiAKIC8qCi0gKiBpbiBYT1IgbW9kZSwgd2UgZGV0ZXJtaW5lIHRoZSBvdXRwdXQgZGV2aWNlIGJ5IHBlcmZvcm1pbmcgeG9yIG9uCi0gKiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBodyBhZHJlc3Nlcy4gIElmIHRoaXMgZGV2aWNlIGlzIG5vdAotICogZW5hYmxlZCwgZmluZCB0aGUgbmV4dCBzbGF2ZSBmb2xsb3dpbmcgdGhpcyB4b3Igc2xhdmUuCisgKiBJbiBib25kX3htaXRfeG9yKCkgLCB3ZSBkZXRlcm1pbmUgdGhlIG91dHB1dCBkZXZpY2UgYnkgdXNpbmcgYSBwcmUtCisgKiBkZXRlcm1pbmVkIHhtaXRfaGFzaF9wb2xpY3koKSwgSWYgdGhlIHNlbGVjdGVkIGRldmljZSBpcyBub3QgZW5hYmxlZCwKKyAqIGZpbmQgdGhlIG5leHQgYWN0aXZlIHNsYXZlLgogICovCiBzdGF0aWMgaW50IGJvbmRfeG1pdF94b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQogewogCXN0cnVjdCBib25kaW5nICpib25kID0gYm9uZF9kZXYtPnByaXY7Ci0Jc3RydWN0IGV0aGhkciAqZGF0YSA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdGFydF9hdDsKIAlpbnQgc2xhdmVfbm87CiAJaW50IGk7CkBAIC00MTEyLDcgKzQzODgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzbGF2ZV9ubyA9IChkYXRhLT5oX2Rlc3RbNV1eYm9uZF9kZXYtPmRldl9hZGRyWzVdKSAlIGJvbmQtPnNsYXZlX2NudDsKKwlzbGF2ZV9ubyA9IGJvbmQtPnhtaXRfaGFzaF9wb2xpY3koc2tiLCBib25kX2RldiwgYm9uZC0+c2xhdmVfY250KTsKIAogCWJvbmRfZm9yX2VhY2hfc2xhdmUoYm9uZCwgc2xhdmUsIGkpIHsKIAkJc2xhdmVfbm8tLTsKQEAgLTQyMDgsOCArNDQ4NCwxMCBAQAogLyoKICAqIHNldCBib25kIG1vZGUgc3BlY2lmaWMgbmV0IGRldmljZSBvcGVyYXRpb25zCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBib25kX3NldF9tb2RlX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIGludCBtb2RlKQorc3RhdGljIGlubGluZSB2b2lkIGJvbmRfc2V0X21vZGVfb3BzKHN0cnVjdCBib25kaW5nICpib25kLCBpbnQgbW9kZSkKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYgPSBib25kLT5kZXY7CisKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEJPTkRfTU9ERV9ST1VORFJPQklOOgogCQlib25kX2Rldi0+aGFyZF9zdGFydF94bWl0ID0gYm9uZF94bWl0X3JvdW5kcm9iaW47CkBAIC00MjE5LDEyICs0NDk3LDIwIEBACiAJCWJyZWFrOwogCWNhc2UgQk9ORF9NT0RFX1hPUjoKIAkJYm9uZF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvbmRfeG1pdF94b3I7CisJCWlmIChib25kLT5wYXJhbXMueG1pdF9wb2xpY3kgPT0gQk9ORF9YTUlUX1BPTElDWV9MQVlFUjM0KQorCQkJYm9uZC0+eG1pdF9oYXNoX3BvbGljeSA9IGJvbmRfeG1pdF9oYXNoX3BvbGljeV9sMzQ7CisJCWVsc2UKKwkJCWJvbmQtPnhtaXRfaGFzaF9wb2xpY3kgPSBib25kX3htaXRfaGFzaF9wb2xpY3lfbDI7CiAJCWJyZWFrOwogCWNhc2UgQk9ORF9NT0RFX0JST0FEQ0FTVDoKIAkJYm9uZF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvbmRfeG1pdF9icm9hZGNhc3Q7CiAJCWJyZWFrOwogCWNhc2UgQk9ORF9NT0RFXzgwMjNBRDoKIAkJYm9uZF9kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IGJvbmRfM2FkX3htaXRfeG9yOworCQlpZiAoYm9uZC0+cGFyYW1zLnhtaXRfcG9saWN5ID09IEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIzNCkKKwkJCWJvbmQtPnhtaXRfaGFzaF9wb2xpY3kgPSBib25kX3htaXRfaGFzaF9wb2xpY3lfbDM0OworCQllbHNlCisJCQlib25kLT54bWl0X2hhc2hfcG9saWN5ID0gYm9uZF94bWl0X2hhc2hfcG9saWN5X2wyOwogCQlicmVhazsKIAljYXNlIEJPTkRfTU9ERV9UTEI6CiAJY2FzZSBCT05EX01PREVfQUxCOgpAQCAtNDI3Myw3ICs0NTU5LDcgQEAKIAlib25kX2Rldi0+Y2hhbmdlX210dSA9IGJvbmRfY2hhbmdlX210dTsKIAlib25kX2Rldi0+c2V0X21hY19hZGRyZXNzID0gYm9uZF9zZXRfbWFjX2FkZHJlc3M7CiAKLQlib25kX3NldF9tb2RlX29wcyhib25kX2RldiwgYm9uZC0+cGFyYW1zLm1vZGUpOworCWJvbmRfc2V0X21vZGVfb3BzKGJvbmQsIGJvbmQtPnBhcmFtcy5tb2RlKTsKIAogCWJvbmRfZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CiAKQEAgLTQzODQsNiArNDY3MCwyNSBAQAogCQl9CiAJfQogCisJaWYgKHhtaXRfaGFzaF9wb2xpY3kpIHsKKwkJaWYgKChib25kX21vZGUgIT0gQk9ORF9NT0RFX1hPUikgJiYKKwkJICAgIChib25kX21vZGUgIT0gQk9ORF9NT0RFXzgwMjNBRCkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJCSAgICAgICAiOiB4b3JfbW9kZSBwYXJhbSBpcyBpcnJlbGV2YW50IGluIG1vZGUgJXNcbiIsCisJCQkgICAgICAgYm9uZF9tb2RlX25hbWUoYm9uZF9tb2RlKSk7CisJCX0gZWxzZSB7CisJCQl4bWl0X2hhc2h0eXBlID0gYm9uZF9wYXJzZV9wYXJtKHhtaXRfaGFzaF9wb2xpY3ksCisJCQkJCQkJeG1pdF9oYXNodHlwZV90YmwpOworCQkJaWYgKHhtaXRfaGFzaHR5cGUgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKKwkJCSAgICAgICAJIjogRXJyb3I6IEludmFsaWQgeG1pdF9oYXNoX3BvbGljeSBcIiVzXCJcbiIsCisJCQkgICAgICAgCXhtaXRfaGFzaF9wb2xpY3kgPT0gTlVMTCA/ICJOVUxMIiA6CisJCQkJICAgICAgIHhtaXRfaGFzaF9wb2xpY3kpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCiAJaWYgKGxhY3BfcmF0ZSkgewogCQlpZiAoYm9uZF9tb2RlICE9IEJPTkRfTU9ERV84MDIzQUQpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKQEAgLTQ1OTUsNiArNDkwMCw3IEBACiAKIAkvKiBmaWxsIHBhcmFtcyBzdHJ1Y3Qgd2l0aCB0aGUgcHJvcGVyIHZhbHVlcyAqLwogCXBhcmFtcy0+bW9kZSA9IGJvbmRfbW9kZTsKKwlwYXJhbXMtPnhtaXRfcG9saWN5ID0geG1pdF9oYXNodHlwZTsKIAlwYXJhbXMtPm1paW1vbiA9IG1paW1vbjsKIAlwYXJhbXMtPmFycF9pbnRlcnZhbCA9IGFycF9pbnRlcnZhbDsKIAlwYXJhbXMtPnVwZGVsYXkgPSB1cGRlbGF5OwpAQCAtNDY2OSw2ICs0OTc1LDcgQEAKIAogCXJ0bmxfdW5sb2NrKCk7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZib25kX25ldGRldl9ub3RpZmllcik7CisJcmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmJvbmRfaW5ldGFkZHJfbm90aWZpZXIpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTQ2ODQsNiArNDk5MSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgYm9uZGluZ19leGl0KHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmJvbmRfbmV0ZGV2X25vdGlmaWVyKTsKKwl1bnJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZib25kX2luZXRhZGRyX25vdGlmaWVyKTsKIAogCXJ0bmxfbG9jaygpOwogCWJvbmRfZnJlZV9hbGwoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZGluZy5oIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKaW5kZXggOGMzMjUzMC4uZDI3ZjM3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kaW5nLmgKQEAgLTI1LDYgKzI1LDEwIEBACiAgKgogICogMjAwMy8xMi8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgogICoJLSBDb2RlIGNsZWFudXAgYW5kIHN0eWxlIGNoYW5nZXMKKyAqCisgKiAyMDA1LzA1LzA1IC0gSmFzb24gR2FibGVyIDxqeWdhYmxlciBhdCBsYmwgZG90IGdvdj4KKyAqICAgICAgLSBhZGRlZCAieG1pdF9wb2xpY3kiIGtlcm5lbCBwYXJhbWV0ZXIgZm9yIGFsdGVybmF0ZSBoYXNoaW5nIHBvbGljeQorICoJICBzdXBwb3J0IGZvciBtb2RlIDIKICAqLwogCiAjaWZuZGVmIF9MSU5VWF9CT05ESU5HX0gKQEAgLTM2LDggKzQwLDggQEAKICNpbmNsdWRlICJib25kXzNhZC5oIgogI2luY2x1ZGUgImJvbmRfYWxiLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuNi4xIgotI2RlZmluZSBEUlZfUkVMREFURQkiT2N0b2JlciAyOSwgMjAwNCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuNi4zIgorI2RlZmluZSBEUlZfUkVMREFURQkiSnVuZSA4LCAyMDA1IgogI2RlZmluZSBEUlZfTkFNRQkiYm9uZGluZyIKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJFdGhlcm5ldCBDaGFubmVsIEJvbmRpbmcgRHJpdmVyIgogCkBAIC0xMzcsNiArMTQxLDcgQEAKIAogc3RydWN0IGJvbmRfcGFyYW1zIHsKIAlpbnQgbW9kZTsKKwlpbnQgeG1pdF9wb2xpY3k7CiAJaW50IG1paW1vbjsKIAlpbnQgYXJwX2ludGVydmFsOwogCWludCB1c2VfY2FycmllcjsKQEAgLTE0OSw2ICsxNTQsNyBAQAogCiBzdHJ1Y3Qgdmxhbl9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCB2bGFuX2xpc3Q7CisJdTMyIHZsYW5faXA7CiAJdW5zaWduZWQgc2hvcnQgdmxhbl9pZDsKIH07CiAKQEAgLTE5Nyw2ICsyMDMsOCBAQAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAJc3RydWN0ICAgbGlzdF9oZWFkIGJvbmRfbGlzdDsKIAlzdHJ1Y3QgICBkZXZfbWNfbGlzdCAqbWNfbGlzdDsKKwlpbnQgICAgICAoKnhtaXRfaGFzaF9wb2xpY3kpKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICosIGludCk7CisJdTMyICAgICAgbWFzdGVyX2lwOwogCXUxNiAgICAgIGZsYWdzOwogCXN0cnVjdCAgIGFkX2JvbmRfaW5mbyBhZF9pbmZvOwogCXN0cnVjdCAgIGFsYl9ib25kX2luZm8gYWxiX2luZm87CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCmluZGV4IDVjNWY1NDAuLmI5NmQ2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NzODl4MC5jCisrKyBiL2RyaXZlcnMvbmV0L2NzODl4MC5jCkBAIC0xNzQsNiArMTc0LDEzIEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9IHtJWERQMlgwMV9DUzg5MDBfVklSVF9CQVNFLCAwfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHtJUlFfSVhEUDJYMDFfQ1M4OTAwLCAwLCAwLCAwfTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorI2RlZmluZSBDSVJSVVNfREVGQVVMVF9CQVNFCUlPX0FERFJFU1MoRVhUX1NUQVRJQzJfczBfQkFTRSArIDB4MjAwMDAwKQkvKiA9IFBoeXNpY2FsIGFkZHJlc3MgMHg0ODIwMDAwMCAqLworI2RlZmluZSBDSVJSVVNfREVGQVVMVF9JUlEJVkhfSU5UQ19JTlRfTlVNX0NBU0NBREVEX0lOVEVSUlVQVF8xIC8qIEV2ZW50IGlucHV0cyBiYW5rIDEgLSBJRCAzNS9iaXQgMyAqLworc3RhdGljIHVuc2lnbmVkIGludCBuZXRjYXJkX3BvcnRsaXN0W10gX19pbml0ZGF0YSA9IHtDSVJSVVNfREVGQVVMVF9CQVNFLCAwfTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M4OTAwX2lycV9tYXBbXSA9IHtDSVJSVVNfREVGQVVMVF9JUlEsIDAsIDAsIDB9OwogI2Vsc2UKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV0Y2FyZF9wb3J0bGlzdFtdIF9faW5pdGRhdGEgPQogICAgeyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgyMDAsIDB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwLCAweDJhMCwgMHgyYzAsIDB4MmUwLCAwfTsKQEAgLTMxOSwxMyArMzI2LDcgQEAKIAl9CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCW91dHcoUFBfQ2hpcElELCBkZXYtPmJhc2VfYWRkciArIEFERF9QT1JUKTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgTkVUQ0FSRF9JT19FWFRFTlQpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiY3M4OXgwOiBubyBjczg5MDAgb3IgY3M4OTIwIGRldGVjdGVkLiAgQmUgc3VyZSB0byBkaXNhYmxlIFBuUCB3aXRoIFNFVFVQXG4iKTsKQEAgLTQzNyw2ICs0MzgsMzAgQEAKICNlbmRpZgogICAgICAgICB9CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9QTlgwMTA1CisJaW5pdGlhbGl6ZV9lYmkoKTsKKworCS8qIE1hcCBHUElPIHJlZ2lzdGVycyBmb3IgdGhlIHBpbnMgY29ubmVjdGVkIHRvIHRoZSBDUzg5MDBhLiAqLworCWlmIChtYXBfY2lycnVzX2dwaW8oKSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmVzZXRfY2lycnVzKCk7CisKKwkvKiBNYXAgZXZlbnQtcm91dGVyIHJlZ2lzdGVycy4gKi8KKwlpZiAobWFwX2V2ZW50X3JvdXRlcigpIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllbmFibGVfY2lycnVzX2lycSgpOworCisJdW5tYXBfY2lycnVzX2dwaW8oKTsKKwl1bm1hcF9ldmVudF9yb3V0ZXIoKTsKKworCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOworCisJZm9yIChpID0gMCA7IGkgPCAzIDsgaSsrKQorCQlyZWFkcmVnKGRldiwgMCk7CisjZW5kaWYKKwogCS8qIEdyYWIgdGhlIHJlZ2lvbiBzbyB3ZSBjYW4gZmluZCBhbm90aGVyIGJvYXJkIGlmIGF1dG9JUlEgZmFpbHMuICovCiAJLyogV1RGIGlzIGdvaW5nIG9uIGhlcmU/ICovCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIgJiB+MywgTkVUQ0FSRF9JT19FWFRFTlQsIERSVl9OQU1FKSkgewpAQCAtNjc4LDcgKzcwMyw3IEBACiAJfSBlbHNlIHsKIAkJaSA9IGxwLT5pc2FfY29uZmlnICYgSU5UX05PX01BU0s7CiAJCWlmIChscC0+Y2hpcF90eXBlID09IENTODkwMCkgewotI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTA1KQogCQkgICAgICAgIGkgPSBjczg5MDBfaXJxX21hcFswXTsKICNlbHNlCiAJCQkvKiBUcmFuc2xhdGUgdGhlIElSUSB1c2luZyB0aGUgSVJRIG1hcHBpbmcgdGFibGUuICovCkBAIC03MzUsNyArNzYwLDEzIEBACiAJcHJpbnRrKCJcbiIpOwogCWlmIChuZXRfZGVidWcpCiAJCXByaW50aygiY3M4OXgwX3Byb2JlMSgpIHN1Y2Nlc3NmdWxcbiIpOworCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQzOwogCXJldHVybiAwOworb3V0MzoKKwlvdXR3KFBQX0NoaXBJRCwgZGV2LT5iYXNlX2FkZHIgKyBBRERfUE9SVCk7CiBvdXQyOgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciAmIH4zLCBORVRDQVJEX0lPX0VYVEVOVCk7CiBvdXQxOgpAQCAtMTE0NSw3ICsxMTc2LDcgQEAKIAlpbnQgaTsKIAlpbnQgcmV0OwogCi0jaWZuZGVmIENPTkZJR19TSF9ISUNPU0g0IC8qIHVzZXMgaXJxIzEsIHNvIHRoaXMgd29uJ3Qgd29yayAqLworI2lmICFkZWZpbmVkKENPTkZJR19TSF9ISUNPU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9QTlgwMTA1KSAvKiB1c2VzIGlycSMxLCBzbyB0aGlzIHdvbid0IHdvcmsgKi8KIAlpZiAoZGV2LT5pcnEgPCAyKSB7CiAJCS8qIEFsbG93IGludGVycnVwdHMgdG8gYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjaGlwICovCiAvKiBDaXJydXMnIHJlbGVhc2UgaGFkIHRoaXM6ICovCkBAIC0xMTc2LDcgKzEyMDcsNyBAQAogCWVsc2UKICNlbmRpZgogCXsKLSNpZm5kZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9JWERQMlgwMSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfUE5YMDEwNSkKIAkJaWYgKCgoMSA8PCBkZXYtPmlycSkgJiBscC0+aXJxX21hcCkgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGlzIG5vdCBpbiBvdXIgbWFwIG9mIGFsbG93YWJsZSBJUlFzLCB3aGljaCBpcyAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGRldi0+aXJxLCBscC0+aXJxX21hcCk7CkBAIC0xMjYxLDYgKzEyOTIsOSBAQAogCWNhc2UgQV9DTkZfTUVESUFfMTBCXzI6IHJlc3VsdCA9IGxwLT5hZGFwdGVyX2NuZiAmIEFfQ05GXzEwQl8yOyBicmVhazsKICAgICAgICAgZGVmYXVsdDogcmVzdWx0ID0gbHAtPmFkYXB0ZXJfY25mICYgKEFfQ05GXzEwQl9UIHwgQV9DTkZfQVVJIHwgQV9DTkZfMTBCXzIpOwogICAgICAgICB9CisjaWZkZWYgQ09ORklHX0FSQ0hfUE5YMDEwNQorCXJlc3VsdCA9IEFfQ05GXzEwQl9UOworI2VuZGlmCiAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRUVQUk9NIGlzIGNvbmZpZ3VyZWQgZm9yIHVuYXZhaWxhYmxlIG1lZGlhXG4iLCBkZXYtPm5hbWUpOwogICAgICAgICByZWxlYXNlX2lycToKQEAgLTE4MzEsMTMgKzE4NjUsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0gICAgICAgIGlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczg5eDAuYzogTm8gY2FyZCBmb3VuZCBhdCAweCV4XG4iLCBpbyk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gLUVOWElPOwotCQlvdXR3KFBQX0NoaXBJRCwgZGV2LT5iYXNlX2FkZHIgKyBBRERfUE9SVCk7Ci0JCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBORVRDQVJEX0lPX0VYVEVOVCk7Ci0JCWdvdG8gb3V0OwotICAgICAgICB9CiAJZGV2X2NzODl4MCA9IGRldjsKIAlyZXR1cm4gMDsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NzODl4MC5oIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKaW5kZXggYjBlZjdhZC4uYmQzYWQ4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY3M4OXgwLmgKKysrIGIvZHJpdmVycy9uZXQvY3M4OXgwLmgKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCi0jaWZkZWYgQ09ORklHX0FSQ0hfSVhEUDJYMDEKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lYRFAyWDAxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX1BOWDAxMDUpCiAvKiBJWERQMjQwMS9JWERQMjgwMSB1c2VzIGR3b3JkLWFsaWduZWQgcmVnaXN0ZXIgYWRkcmVzc2luZyAqLwogI2RlZmluZSBDUzg5eDBfUE9SVChyZWcpICgocmVnKSAqIDIpCiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZGVmeHguYyBiL2RyaXZlcnMvbmV0L2RlZnh4LmMKaW5kZXggYTZhYTU2NS4uNWFjZDM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGVmeHguYworKysgYi9kcml2ZXJzL25ldC9kZWZ4eC5jCkBAIC0xOTEsNiArMTkxLDcgQEAKICAqCQlGZWIgMjAwMQlkYXZlagkJUENJIGVuYWJsZSBjbGVhbnVwcy4KICAqCQkwNCBBdWcgMjAwMwltYWNybwkJQ29udmVydGVkIHRvIHRoZSBETUEgQVBJLgogICoJCTE0IEF1ZyAyMDA0CW1hY3JvCQlGaXggZGV2aWNlIG5hbWVzIHJlcG9ydGVkLgorICoJCTE0IEp1biAyMDA1CW1hY3JvCQlVc2UgaXJxcmV0dXJuX3QuCiAgKi8KIAogLyogSW5jbHVkZSBmaWxlcyAqLwpAQCAtMjE3LDggKzIxOCw4IEBACiAKIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gc3RyaW5nIHNob3VsZCBiZSB1cGRhdGVkIHByaW9yIHRvIGVhY2ggbmV3IHJlbGVhc2UhICAqLwogI2RlZmluZSBEUlZfTkFNRSAiZGVmeHgiCi0jZGVmaW5lIERSVl9WRVJTSU9OICJ2MS4wNyIKLSNkZWZpbmUgRFJWX1JFTERBVEUgIjIwMDQvMDgvMTQiCisjZGVmaW5lIERSVl9WRVJTSU9OICJ2MS4wOCIKKyNkZWZpbmUgRFJWX1JFTERBVEUgIjIwMDUvMDYvMTQiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAlEUlZfTkFNRSAiOiAiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURQpAQCAtMjQ3LDcgKzI0OCw4IEBACiBzdGF0aWMgdm9pZAkJZGZ4X2ludF9wcl9oYWx0X2lkKERGWF9ib2FyZF90ICpicCk7CiBzdGF0aWMgdm9pZAkJZGZ4X2ludF90eXBlXzBfcHJvY2VzcyhERlhfYm9hcmRfdCAqYnApOwogc3RhdGljIHZvaWQJCWRmeF9pbnRfY29tbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQJCWRmeF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QJZGZ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBzdGF0aWMgc3RydWN0CQluZXRfZGV2aWNlX3N0YXRzICpkZnhfY3RsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkCQlkZnhfY3RsX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTQzNyw3ICs0MzksOCBAQAogCX0KIAogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKLQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCWlmIChwZGV2ICE9IE5VTEwpCisJCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAKIAlicCA9IGRldi0+cHJpdjsKIApAQCAtMTIyNSw3ICsxMjI4LDcgQEAKIAkKIAkvKiBSZWdpc3RlciBJUlEgLSBzdXBwb3J0IHNoYXJlZCBpbnRlcnJ1cHRzIGJ5IHBhc3NpbmcgZGV2aWNlIHB0ciAqLwogCi0JcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopZGZ4X2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgZGZ4X2ludGVycnVwdCwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKIAlpZiAocmV0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IFJlcXVlc3RlZCBJUlEgJWQgaXMgYnVzeVxuIiwgZGV2LT5uYW1lLCBkZXYtPmlycSk7CiAJCXJldHVybiByZXQ7CkBAIC0xNjgwLDEzICsxNjgzLDEzIEBACiAgKiA9PT09PT09PT09PT09PT09PQogICogPSBkZnhfaW50ZXJydXB0ID0KICAqID09PT09PT09PT09PT09PT09Ci0gKiAgIAorICoKICAqIE92ZXJ2aWV3OgogICogICBJbnRlcnJ1cHQgcHJvY2Vzc2luZyByb3V0aW5lCi0gKiAgCisgKgogICogUmV0dXJuczoKLSAqICAgTm9uZQotICogICAgICAgCisgKiAgIFdoZXRoZXIgYSB2YWxpZCBpbnRlcnJ1cHQgd2FzIHNlZW4uCisgKgogICogQXJndW1lbnRzOgogICogICBpcnEJLSBpbnRlcnJ1cHQgdmVjdG9yCiAgKiAgIGRldl9pZAktIHBvaW50ZXIgdG8gZGV2aWNlIGluZm9ybWF0aW9uCkBAIC0xNjk5LDcgKzE3MDIsOCBAQAogICogICBzdHJ1Y3R1cmUgY29udGV4dC4KICAqCiAgKiBSZXR1cm4gQ29kZXM6Ci0gKiAgIE5vbmUKKyAqICAgSVJRX0hBTkRMRUQgLSBhbiBJUlEgd2FzIGhhbmRsZWQuCisgKiAgIElSUV9OT05FICAgIC0gbm8gSVJRIHdhcyBoYW5kbGVkLgogICoKICAqIEFzc3VtcHRpb25zOgogICogICBUaGUgaW50ZXJydXB0IGFja25vd2xlZGdlbWVudCBhdCB0aGUgaGFyZHdhcmUgbGV2ZWwgKGVnLiBBQ0tpbmcgdGhlIFBJQwpAQCAtMTcxMiw2MCArMTcxNiw3MCBAQAogICogICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgdGhlbiByZWVuYWJsZWQgYXQgdGhlIGFkYXB0ZXIuCiAgKi8KIAotc3RhdGljIHZvaWQgZGZ4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzCSpyZWdzKQotCXsKK3N0YXRpYyBpcnFyZXR1cm5fdCBkZnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldiA9IGRldl9pZDsKIAlERlhfYm9hcmRfdAkJKmJwOwkvKiBwcml2YXRlIGJvYXJkIHN0cnVjdHVyZSBwb2ludGVyICovCi0JdTgJCQkJdG1wOwkvKiB1c2VkIGZvciBkaXNhYmxpbmcvZW5hYmxpbmcgaW50cyAqLwogCiAJLyogR2V0IGJvYXJkIHBvaW50ZXIgb25seSBpZiBkZXZpY2Ugc3RydWN0dXJlIGlzIHZhbGlkICovCiAKIAlicCA9IGRldi0+cHJpdjsKIAotCXNwaW5fbG9jaygmYnAtPmxvY2spOwotCQogCS8qIFNlZSBpZiB3ZSdyZSBhbHJlYWR5IHNlcnZpY2luZyBhbiBpbnRlcnJ1cHQgKi8KIAogCS8qIFNlcnZpY2UgYWRhcHRlciBpbnRlcnJ1cHRzICovCiAKLQlpZiAoYnAtPmJ1c190eXBlID09IERGWF9CVVNfVFlQRV9QQ0kpCi0JCXsKLQkJLyogRGlzYWJsZSBQRFEtUEZJIGludGVycnVwdHMgYXQgUEZJICovCisJaWYgKGJwLT5idXNfdHlwZSA9PSBERlhfQlVTX1RZUEVfUENJKSB7CisJCXUzMiBzdGF0dXM7CiAKLQkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX01PREVfQ1RSTCwgUEZJX01PREVfTV9ETUFfRU5CKTsKKwkJZGZ4X3BvcnRfcmVhZF9sb25nKGJwLCBQRklfS19SRUdfU1RBVFVTLCAmc3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgUEZJX1NUQVRVU19NX1BEUV9JTlQpKQorCQkJcmV0dXJuIElSUV9OT05FOworCisJCXNwaW5fbG9jaygmYnAtPmxvY2spOworCisJCS8qIERpc2FibGUgUERRLVBGSSBpbnRlcnJ1cHRzIGF0IFBGSSAqLworCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfTU9ERV9DVFJMLAorCQkJCSAgICBQRklfTU9ERV9NX0RNQV9FTkIpOwogCiAJCS8qIENhbGwgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgdGhpcyBhZGFwdGVyICovCi0KIAkJZGZ4X2ludF9jb21tb24oZGV2KTsKIAogCQkvKiBDbGVhciBQRFEgaW50ZXJydXB0IHN0YXR1cyBiaXQgYW5kIHJlZW5hYmxlIGludGVycnVwdHMgKi8KLQotCQlkZnhfcG9ydF93cml0ZV9sb25nKGJwLCBQRklfS19SRUdfU1RBVFVTLCBQRklfU1RBVFVTX01fUERRX0lOVCk7CisJCWRmeF9wb3J0X3dyaXRlX2xvbmcoYnAsIFBGSV9LX1JFR19TVEFUVVMsCisJCQkJICAgIFBGSV9TVEFUVVNfTV9QRFFfSU5UKTsKIAkJZGZ4X3BvcnRfd3JpdGVfbG9uZyhicCwgUEZJX0tfUkVHX01PREVfQ1RSTCwKLQkJCQkJKFBGSV9NT0RFX01fUERRX0lOVF9FTkIgKyBQRklfTU9ERV9NX0RNQV9FTkIpKTsKLQkJfQotCWVsc2UKLQkJewotCQkvKiBEaXNhYmxlIGludGVycnVwdHMgYXQgdGhlIEVTSUMgKi8KKwkJCQkgICAgKFBGSV9NT0RFX01fUERRX0lOVF9FTkIgfAorCQkJCSAgICAgUEZJX01PREVfTV9ETUFfRU5CKSk7CiAKLQkJZGZ4X3BvcnRfcmVhZF9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgJnRtcCk7Ci0JCXRtcCAmPSB+UElfQ09ORklHX1NUQVRfMF9NX0lOVF9FTkI7Ci0JCWRmeF9wb3J0X3dyaXRlX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCB0bXApOworCQlzcGluX3VubG9jaygmYnAtPmxvY2spOworCX0gZWxzZSB7CisJCXU4IHN0YXR1czsKKworCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmc3RhdHVzKTsKKwkJaWYgKCEoc3RhdHVzICYgUElfQ09ORklHX1NUQVRfMF9NX1BFTkQpKQorCQkJcmV0dXJuIElSUV9OT05FOworCisJCXNwaW5fbG9jaygmYnAtPmxvY2spOworCisJCS8qIERpc2FibGUgaW50ZXJydXB0cyBhdCB0aGUgRVNJQyAqLworCQlzdGF0dXMgJj0gflBJX0NPTkZJR19TVEFUXzBfTV9JTlRfRU5COworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgc3RhdHVzKTsKIAogCQkvKiBDYWxsIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgZm9yIHRoaXMgYWRhcHRlciAqLwotCiAJCWRmeF9pbnRfY29tbW9uKGRldik7CiAKIAkJLyogUmVlbmFibGUgaW50ZXJydXB0cyBhdCB0aGUgRVNJQyAqLworCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmc3RhdHVzKTsKKwkJc3RhdHVzIHw9IFBJX0NPTkZJR19TVEFUXzBfTV9JTlRfRU5COworCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgc3RhdHVzKTsKIAotCQlkZnhfcG9ydF9yZWFkX2J5dGUoYnAsIFBJX0VTSUNfS19JT19DT05GSUdfU1RBVF8wLCAmdG1wKTsKLQkJdG1wIHw9IFBJX0NPTkZJR19TVEFUXzBfTV9JTlRfRU5COwotCQlkZnhfcG9ydF93cml0ZV9ieXRlKGJwLCBQSV9FU0lDX0tfSU9fQ09ORklHX1NUQVRfMCwgdG1wKTsKLQkJfQotCi0Jc3Bpbl91bmxvY2soJmJwLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmJwLT5sb2NrKTsKIAl9CiAKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIAwKIC8qCiAgKiA9PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RsMmsuYyBiL2RyaXZlcnMvbmV0L2RsMmsuYwppbmRleCBhYTQyYjdhLi40MzBjNjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbDJrLmMKKysrIGIvZHJpdmVycy9uZXQvZGwyay5jCkBAIC01NDcsNyArNTQ3LDcgQEAKIAkJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKIAkJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gPQogCQkJCSAgICBjcHVfdG9fbGU2NCAocGNpX21hcF9zaW5nbGUKLQkJCQkJIChucC0+cGRldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LAorCQkJCQkgKG5wLT5wZGV2LCBza2ItPmRhdGEsIG5wLT5yeF9idWZfc3osCiAJCQkJCSAgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCQl9CiAJCQlucC0+cnhfcmluZ1tlbnRyeV0uZnJhZ2luZm8gfD0KQEAgLTYxOCw3ICs2MTgsNyBAQAogCQkvKiBSdWJpY29uIG5vdyBzdXBwb3J0cyA0MCBiaXRzIG9mIGFkZHJlc3Npbmcgc3BhY2UuICovCiAJCW5wLT5yeF9yaW5nW2ldLmZyYWdpbmZvID0KIAkJICAgIGNwdV90b19sZTY0ICggcGNpX21hcF9zaW5nbGUgKAotCQkJIAkgIG5wLT5wZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osCisJCQkgCSAgbnAtPnBkZXYsIHNrYi0+ZGF0YSwgbnAtPnJ4X2J1Zl9zeiwKIAkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQlucC0+cnhfcmluZ1tpXS5mcmFnaW5mbyB8PSBjcHVfdG9fbGU2NCAobnAtPnJ4X2J1Zl9zeikgPDwgNDg7CiAJfQpAQCAtOTA2LDcgKzkwNiw3IEBACiAJCQkJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyICovCiAJCQkJc2tiX3Jlc2VydmUgKHNrYiwgMik7CiAJCQkJZXRoX2NvcHlfYW5kX3N1bSAoc2tiLAotCQkJCQkJICBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwKKwkJCQkJCSAgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsCiAJCQkJCQkgIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQgKHNrYiwgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wZGV2LApAQCAtOTUwLDcgKzk1MCw3IEBACiAJCQlza2JfcmVzZXJ2ZSAoc2tiLCAyKTsKIAkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyA9CiAJCQkgICAgY3B1X3RvX2xlNjQgKHBjaV9tYXBfc2luZ2xlCi0JCQkJCSAobnAtPnBkZXYsIHNrYi0+dGFpbCwgbnAtPnJ4X2J1Zl9zeiwKKwkJCQkJIChucC0+cGRldiwgc2tiLT5kYXRhLCBucC0+cnhfYnVmX3N6LAogCQkJCQkgIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQl9CiAJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnaW5mbyB8PQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZG05MDAwLmMgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwppbmRleCBmNGJhMGZmLi41ZmRkYzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kbTkwMDAuYworKysgYi9kcml2ZXJzL25ldC9kbTkwMDAuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAKIHN0YXRpYyB2b2lkIGRtOTAwMF9pbmJsa184Yml0KHZvaWQgX19pb21lbSAqcmVnLCB2b2lkICpkYXRhLCBpbnQgY291bnQpCiB7Ci0JcmVhZHNiKHJlZywgZGF0YSwgY291bnQrMSk7CisJcmVhZHNiKHJlZywgZGF0YSwgY291bnQpOwogfQogCiAKQEAgLTM2NCw3ICszNjQsNyBAQAogCX0KIAogCWlmIChkYi0+YWRkcl9yZXMgIT0gTlVMTCkgewotCQlyZWxlYXNlX3Jlc291cmNlKGRiLT5kYXRhX3JlcSk7CisJCXJlbGVhc2VfcmVzb3VyY2UoZGItPmFkZHJfcmVzKTsKIAkJa2ZyZWUoZGItPmFkZHJfcmVxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwLmMgYi9kcml2ZXJzL25ldC9lMTAwLmMKaW5kZXggNGE0N2RmNS4uZDBmYTI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAuYwpAQCAtMTQzLDYgKzE0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgpAQCAtMTA5MiwxMSArMTA5MywxNiBAQAogCX0KIAogCWlmKChuaWMtPm1hYyA+PSBtYWNfODI1NTBfRDEwMikgfHwgKChuaWMtPmZsYWdzICYgaWNoKSAmJiAKLQkJKG1kaW9fcmVhZChuZXRkZXYsIG5pYy0+bWlpLnBoeV9pZCwgTUlJX1RQSVNUQVRVUykgJiAweDgwMDApICYmIAotCQkobmljLT5lZXByb21bZWVwcm9tX2NuZmdfbWRpeF0gJiBlZXByb21fbWRpeF9lbmFibGVkKSkpCi0JCS8qIGVuYWJsZS9kaXNhYmxlIE1ESS9NREktWCBhdXRvLXN3aXRjaGluZyAqLwotCQltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTkNPTkZJRywKLQkJCW5pYy0+bWlpLmZvcmNlX21lZGlhID8gMCA6IE5DT05GSUdfQVVUT19TV0lUQ0gpOworCSAgIChtZGlvX3JlYWQobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9UUElTVEFUVVMpICYgMHg4MDAwKSkpIHsKKwkJLyogZW5hYmxlL2Rpc2FibGUgTURJL01ESS1YIGF1dG8tc3dpdGNoaW5nLgorCQkgICBNREkvTURJLVggYXV0by1zd2l0Y2hpbmcgaXMgZGlzYWJsZWQgZm9yIDgyNTUxRVIvUU0gY2hpcHMgKi8KKwkJaWYoKG5pYy0+bWFjID09IG1hY184MjU1MV9FKSB8fCAobmljLT5tYWMgPT0gbWFjXzgyNTUxX0YpIHx8CisJCSAgIChuaWMtPm1hYyA9PSBtYWNfODI1NTFfMTApIHx8IChuaWMtPm1paS5mb3JjZV9tZWRpYSkgfHwgCisJCSAgICEobmljLT5lZXByb21bZWVwcm9tX2NuZmdfbWRpeF0gJiBlZXByb21fbWRpeF9lbmFibGVkKSkgCisJCQltZGlvX3dyaXRlKG5ldGRldiwgbmljLT5taWkucGh5X2lkLCBNSUlfTkNPTkZJRywgMCk7CisJCWVsc2UKKwkJCW1kaW9fd3JpdGUobmV0ZGV2LCBuaWMtPm1paS5waHlfaWQsIE1JSV9OQ09ORklHLCBOQ09ORklHX0FVVE9fU1dJVENIKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2NjUsOCArMTY3MSwxMCBAQAogCWlmKHN0YXRfYWNrICYgc3RhdF9hY2tfcm5yKQogCQluaWMtPnJ1X3J1bm5pbmcgPSBSVV9TVVNQRU5ERUQ7CiAKLQllMTAwX2Rpc2FibGVfaXJxKG5pYyk7Ci0JbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKwlpZihsaWtlbHkobmV0aWZfcnhfc2NoZWR1bGVfcHJlcChuZXRkZXYpKSkgeworCQllMTAwX2Rpc2FibGVfaXJxKG5pYyk7CisJCV9fbmV0aWZfcnhfc2NoZWR1bGUobmV0ZGV2KTsKKwl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0yMjg2LDcgKzIyOTQsNyBAQAogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9wZGV2OwogCX0KIAotCWlmKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpKSkgeworCWlmKChlcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkpIHsKIAkJRFBSSU5USyhQUk9CRSwgRVJSLCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQpAQCAtMjMzNCwxMSArMjM0MiwxMSBAQAogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAl9CiAKLQllMTAwX3BoeV9pbml0KG5pYyk7Ci0KIAlpZigoZXJyID0gZTEwMF9lZXByb21fbG9hZChuaWMpKSkKIAkJZ290byBlcnJfb3V0X2ZyZWU7CiAKKwllMTAwX3BoeV9pbml0KG5pYyk7CisKIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgbmljLT5lZXByb20sIEVUSF9BTEVOKTsKIAlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgewogCQlEUFJJTlRLKFBST0JFLCBFUlIsICJJbnZhbGlkIE1BQyBhZGRyZXNzIGZyb20gIgpAQCAtMjQzOSw5ICsyNDQ3LDggQEAKICNlbmRpZgogCiAKLXN0YXRpYyB2b2lkIGUxMDBfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgZTEwMF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG5pYyAqbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjQ2MiwxMSArMjQ2OSw3IEBACiAJLnN1c3BlbmQgPSAgICAgIGUxMDBfc3VzcGVuZCwKIAkucmVzdW1lID0gICAgICAgZTEwMF9yZXN1bWUsCiAjZW5kaWYKLQotCS5kcml2ZXIgPSB7Ci0JCS5zaHV0ZG93biA9IGUxMDBfc2h1dGRvd24sCi0JfQotCisJLnNodXRkb3duID0JZTEwMF9zaHV0ZG93biwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGUxMDBfaW5pdF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMC5oCmluZGV4IGFmMWU4MmMuLjA5Mjc1N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDAuaApAQCAtMTQwLDcgKzE0MCw3IEBACiAjZGVmaW5lIEUxMDAwX1JYX0JVRkZFUl9XUklURQkxNgkvKiBNdXN0IGJlIHBvd2VyIG9mIDIgKi8KIAogI2RlZmluZSBBVVRPX0FMTF9NT0RFUyAgICAgICAgICAgIDAKLSNkZWZpbmUgRTEwMDBfRUVQUk9NXzgyNTQ0X0FQTSAgICAweDA0MDAKKyNkZWZpbmUgRTEwMDBfRUVQUk9NXzgyNTQ0X0FQTSAgICAweDAwMDQKICNkZWZpbmUgRTEwMDBfRUVQUk9NX0FQTUUgICAgICAgICAweDA0MDAKIAogI2lmbmRlZiBFMTAwMF9NQVNURVJfU0xBVkUKQEAgLTE1OSw3ICsxNTksNyBAQAogICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyICovCiBzdHJ1Y3QgZTEwMDBfYnVmZmVyIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVpbnQ2NF90IGRtYTsKKwlkbWFfYWRkcl90IGRtYTsKIAl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7CiAJdWludDE2X3QgbGVuZ3RoOwogCXVpbnQxNl90IG5leHRfdG9fd2F0Y2g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKaW5kZXggMjM3MjQ3Zi4uZjEzM2ZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJaWYoaHctPm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXIpIHsKQEAgLTE0MSw5ICsxNDEsOSBAQAogCQkJCSAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKIAkJCQkgICAgIFNVUFBPUlRFRF9BdXRvbmVnKTsKIAotCQllY21kLT5hZHZlcnRpc2luZyA9IChTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfAotCQkJCSAgICAgU1VQUE9SVEVEX0ZJQlJFIHwKLQkJCQkgICAgIFNVUFBPUlRFRF9BdXRvbmVnKTsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSAoQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJICAgICBBRFZFUlRJU0VEX0ZJQlJFIHwKKwkJCQkgICAgIEFEVkVSVElTRURfQXV0b25lZyk7CiAKIAkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CiAKQEAgLTE3OSwxMyArMTc5LDI0IEBACiBzdGF0aWMgaW50CiBlMTAwMF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCiAJaWYoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQlody0+YXV0b25lZyA9IDE7Ci0JCWh3LT5hdXRvbmVnX2FkdmVydGlzZWQgPSAweDAwMkY7Ci0JCWVjbWQtPmFkdmVydGlzaW5nID0gMHgwMDJGOworCQlpZihody0+bWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKQorCQkJaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgICAgQURWRVJUSVNFRF9GSUJSRSB8CisJCQkJICAgICBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCWVsc2UgCisJCQlody0+YXV0b25lZ19hZHZlcnRpc2VkID0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAorCQkJCQkJICBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8CisJCQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CisJCQkJCQkgIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCB8CisJCQkJCQkgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGx8CisJCQkJCQkgIEFEVkVSVElTRURfQXV0b25lZyB8CisJCQkJCQkgIEFEVkVSVElTRURfVFA7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gaHctPmF1dG9uZWdfYWR2ZXJ0aXNlZDsKIAl9IGVsc2UKIAkJaWYoZTEwMDBfc2V0X3NwZF9kcGx4KGFkYXB0ZXIsIGVjbWQtPnNwZWVkICsgZWNtZC0+ZHVwbGV4KSkKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA2LDcgKzIxNyw3IEBACiBlMTAwMF9nZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKIAlwYXVzZS0+YXV0b25lZyA9IApAQCAtMjI2LDcgKzIzNyw3IEBACiBlMTAwMF9zZXRfcGF1c2VwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJCiAJYWRhcHRlci0+ZmNfYXV0b25lZyA9IHBhdXNlLT5hdXRvbmVnOwpAQCAtMjU5LDE0ICsyNzAsMTQgQEAKIHN0YXRpYyB1aW50MzJfdAogZTEwMDBfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJcmV0dXJuIGFkYXB0ZXItPnJ4X2NzdW07CiB9CiAKIHN0YXRpYyBpbnQKIGUxMDAwX3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWFkYXB0ZXItPnJ4X2NzdW0gPSBkYXRhOwogCiAJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CkBAIC0yODYsNyArMjk3LDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJaWYoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgewogCQlpZiAoIWRhdGEpCkBAIC0zMDYsOCArMzE3LDggQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDMyX3QgZGF0YSkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKLQlpZiAoKGFkYXB0ZXItPmh3Lm1hY190eXBlIDwgZTEwMDBfODI1NDQpIHx8CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWlmKChhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTQ0KSB8fAogCSAgICAoYWRhcHRlci0+aHcubWFjX3R5cGUgPT0gZTEwMDBfODI1NDcpKSAKIAkJcmV0dXJuIGRhdGEgPyAtRUlOVkFMIDogMDsKIApAQCAtMzIyLDE0ICszMzMsMTQgQEAKIHN0YXRpYyB1aW50MzJfdAogZTEwMDBfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXJldHVybiBhZGFwdGVyLT5tc2dfZW5hYmxlOwogfQogCiBzdGF0aWMgdm9pZAogZTEwMDBfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWFkYXB0ZXItPm1zZ19lbmFibGUgPSBkYXRhOwogfQogCkBAIC0zNDQsNyArMzU1LDcgQEAKIGUxMDAwX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJICAgICAgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdWludDMyX3QgKnJlZ3NfYnVmZiA9IHA7CiAJdWludDE2X3QgcGh5X2RhdGE7CkBAIC00MzIsNyArNDQzLDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXJldHVybiBhZGFwdGVyLT5ody5lZXByb20ud29yZF9zaXplICogMjsKIH0KIApAQCAtNDQwLDcgKzQ1MSw3IEBACiBlMTAwMF9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHVpbnQ4X3QgKmJ5dGVzKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXVpbnQxNl90ICplZXByb21fYnVmZjsKIAlpbnQgZmlyc3Rfd29yZCwgbGFzdF93b3JkOwpAQCAtNDg2LDcgKzQ5Nyw3IEBACiBlMTAwMF9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHVpbnQ4X3QgKmJ5dGVzKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXVpbnQxNl90ICplZXByb21fYnVmZjsKIAl2b2lkICpwdHI7CkBAIC01NDcsNyArNTU4LDcgQEAKIGUxMDAwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJc3RybmNweShkcnZpbmZvLT5kcml2ZXIsICBlMTAwMF9kcml2ZXJfbmFtZSwgMzIpOwogCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgZTEwMDBfZHJpdmVyX3ZlcnNpb24sIDMyKTsKQEAgLTU2Myw3ICs1NzQsNyBAQAogZTEwMDBfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWUxMDAwX21hY190eXBlIG1hY190eXBlID0gYWRhcHRlci0+aHcubWFjX3R5cGU7CiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOwogCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+cnhfcmluZzsKQEAgLTU4NCw3ICs1OTUsNyBAQAogZTEwMDBfc2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWUxMDAwX21hY190eXBlIG1hY190eXBlID0gYWRhcHRlci0+aHcubWFjX3R5cGU7CiAJc3RydWN0IGUxMDAwX2Rlc2NfcmluZyAqdHhkciA9ICZhZGFwdGVyLT50eF9yaW5nOwogCXN0cnVjdCBlMTAwMF9kZXNjX3JpbmcgKnJ4ZHIgPSAmYWRhcHRlci0+cnhfcmluZzsKQEAgLTY1MSw2ICs2NjIsOSBAQAogCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSLCAodGVzdFtwYXRdICYgVykpOyAgICAgICAgICAgICBcCiAJCXZhbHVlID0gRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBSKTsgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJaWYodmFsdWUgIT0gKHRlc3RbcGF0XSAmIFcgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJRFBSSU5USyhEUlYsIEVSUiwgInBhdHRlcm4gdGVzdCByZWcgJTA0WCBmYWlsZWQ6IGdvdCAiIFwKKwkJCSAgICAgICAgIjB4JTA4WCBleHBlY3RlZCAweCUwOFhcbiIsICAgICAgICAgICAgICAgICAgICBcCisJCQkgICAgICAgIEUxMDAwXyMjUiwgdmFsdWUsICh0ZXN0W3BhdF0gJiBXICYgTSkpOyAgICAgICAgXAogCQkJKmRhdGEgPSAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgPyAgICAgICAgIFwKIAkJCQlFMTAwMF84MjU0Ml8jI1IgOiBFMTAwMF8jI1I7ICAgICAgICAgICAgICAgICAgIFwKIAkJCXJldHVybiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02NjMsNyArNjc3LDkgQEAKIAl1aW50MzJfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBSLCBXICYgTSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl2YWx1ZSA9IEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlpZiAoKFcgJiBNKSAhPSAodmFsdWUgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlpZigoVyAmIE0pICE9ICh2YWx1ZSAmIE0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlEUFJJTlRLKERSViwgRVJSLCAic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYICJcCisJCSAgICAgICAgImV4cGVjdGVkIDB4JTA4WFxuIiwgRTEwMDBfIyNSLCAodmFsdWUgJiBNKSwgKFcgJiBNKSk7IFwKIAkJKmRhdGEgPSAoYWRhcHRlci0+aHcubWFjX3R5cGUgPCBlMTAwMF84MjU0MykgPyAgICAgICAgICAgICAgICAgXAogCQkJRTEwMDBfODI1NDJfIyNSIDogRTEwMDBfIyNSOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjczLDE4ICs2ODksMzMgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX3JlZ190ZXN0KHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLCB1aW50NjRfdCAqZGF0YSkKIHsKLQl1aW50MzJfdCB2YWx1ZTsKLQl1aW50MzJfdCBpOworCXVpbnQzMl90IHZhbHVlLCBiZWZvcmUsIGFmdGVyOworCXVpbnQzMl90IGksIHRvZ2dsZTsKIAogCS8qIFRoZSBzdGF0dXMgcmVnaXN0ZXIgaXMgUmVhZCBPbmx5LCBzbyBhIHdyaXRlIHNob3VsZCBmYWlsLgogCSAqIFNvbWUgYml0cyB0aGF0IGdldCB0b2dnbGVkIGFyZSBpZ25vcmVkLgogCSAqLwotCXZhbHVlID0gKEUxMDAwX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmICgweEZGRkZGODMzKSk7Ci0JRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTLCAoMHhGRkZGRkZGRikpOwotCWlmKHZhbHVlICE9IChFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiAoMHhGRkZGRjgzMykpKSB7CisgICAgICAgIHN3aXRjaCAoYWRhcHRlci0+aHcubWFjX3R5cGUpIHsKKwljYXNlIGUxMDAwXzgyNTczOgorCQl0b2dnbGUgPSAweDdGRkZGMDMzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0b2dnbGUgPSAweEZGRkZGODMzOworCQlicmVhazsKKwl9CisKKwliZWZvcmUgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUyk7CisJdmFsdWUgPSAoRTEwMDBfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMpICYgdG9nZ2xlKTsKKwlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBTVEFUVVMsIHRvZ2dsZSk7CisJYWZ0ZXIgPSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIFNUQVRVUykgJiB0b2dnbGU7CisJaWYodmFsdWUgIT0gYWZ0ZXIpIHsKKwkJRFBSSU5USyhEUlYsIEVSUiwgImZhaWxlZCBTVEFUVVMgcmVnaXN0ZXIgdGVzdCBnb3Q6ICIKKwkJICAgICAgICAiMHglMDhYIGV4cGVjdGVkOiAweCUwOFhcbiIsIGFmdGVyLCB2YWx1ZSk7CiAJCSpkYXRhID0gMTsKIAkJcmV0dXJuIDE7CiAJfQorCS8qIHJlc3RvcmUgcHJldmlvdXMgc3RhdHVzICovCisJRTEwMDBfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTLCBiZWZvcmUpOwogCiAJUkVHX1BBVFRFUk5fVEVTVChGQ0FMLCAweEZGRkZGRkZGLCAweEZGRkZGRkZGKTsKIAlSRUdfUEFUVEVSTl9URVNUKEZDQUgsIDB4MDAwMEZGRkYsIDB4RkZGRkZGRkYpOwpAQCAtNzY2LDcgKzc5Nyw3IEBACiAJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlhZGFwdGVyLT50ZXN0X2ljciB8PSBFMTAwMF9SRUFEX1JFRygmYWRhcHRlci0+aHcsIElDUik7CiAKQEAgLTEyMTQsNiArMTI0NSw3IEBACiAJY2FzZSBlMTAwMF84MjU0MV9yZXZfMjoKIAljYXNlIGUxMDAwXzgyNTQ3OgogCWNhc2UgZTEwMDBfODI1NDdfcmV2XzI6CisJY2FzZSBlMTAwMF84MjU3MzoKIAkJcmV0dXJuIGUxMDAwX2ludGVncmF0ZWRfcGh5X2xvb3BiYWNrKGFkYXB0ZXIpOwogCQlicmVhazsKIApAQCAtMTQyMiw3ICsxNDU0LDcgQEAKIGUxMDAwX2RpYWdfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICBzdHJ1Y3QgZXRodG9vbF90ZXN0ICpldGhfdGVzdCwgdWludDY0X3QgKmRhdGEpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWJvb2xlYW5fdCBpZl9ydW5uaW5nID0gbmV0aWZfcnVubmluZyhuZXRkZXYpOwogCiAJaWYoZXRoX3Rlc3QtPmZsYWdzID09IEVUSF9URVNUX0ZMX09GRkxJTkUpIHsKQEAgLTE0ODIsNyArMTUxNCw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKIAlzd2l0Y2goYWRhcHRlci0+aHcuZGV2aWNlX2lkKSB7CkBAIC0xNTI3LDcgKzE1NTksNyBAQAogc3RhdGljIGludAogZTEwMDBfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKIAlzd2l0Y2goYWRhcHRlci0+aHcuZGV2aWNlX2lkKSB7CkBAIC0xNTg4LDIyICsxNjIwLDMxIEBACiBzdGF0aWMgaW50CiBlMTAwMF9waHlzX2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IGRhdGEpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCiAJaWYoIWRhdGEgfHwgZGF0YSA+ICh1aW50MzJfdCkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWikpCiAJCWRhdGEgPSAodWludDMyX3QpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopOwogCi0JaWYoIWFkYXB0ZXItPmJsaW5rX3RpbWVyLmZ1bmN0aW9uKSB7Ci0JCWluaXRfdGltZXIoJmFkYXB0ZXItPmJsaW5rX3RpbWVyKTsKLQkJYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPSBlMTAwMF9sZWRfYmxpbmtfY2FsbGJhY2s7Ci0JCWFkYXB0ZXItPmJsaW5rX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgYWRhcHRlcjsKKwlpZihhZGFwdGVyLT5ody5tYWNfdHlwZSA8IGUxMDAwXzgyNTczKSB7CisJCWlmKCFhZGFwdGVyLT5ibGlua190aW1lci5mdW5jdGlvbikgeworCQkJaW5pdF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIpOworCQkJYWRhcHRlci0+YmxpbmtfdGltZXIuZnVuY3Rpb24gPSBlMTAwMF9sZWRfYmxpbmtfY2FsbGJhY2s7CisJCQlhZGFwdGVyLT5ibGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXI7CisJCX0KKwkJZTEwMDBfc2V0dXBfbGVkKCZhZGFwdGVyLT5odyk7CisJCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMpOworCQltc2xlZXBfaW50ZXJydXB0aWJsZShkYXRhICogMTAwMCk7CisJCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5ibGlua190aW1lcik7CisJfQorCWVsc2UgeworCQlFMTAwMF9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBMRURDVEwsIChFMTAwMF9MRURDVExfTEVEMl9CTElOS19SQVRFIHwKKwkJCUUxMDAwX0xFRENUTF9MRUQxX0JMSU5LIHwgRTEwMDBfTEVEQ1RMX0xFRDJfQkxJTksgfCAKKwkJCShFMTAwMF9MRURDVExfTU9ERV9MRURfT04gPDwgRTEwMDBfTEVEQ1RMX0xFRDJfTU9ERV9TSElGVCkgfAorCQkJKEUxMDAwX0xFRENUTF9NT0RFX0xJTktfQUNUSVZJVFkgPDwgRTEwMDBfTEVEQ1RMX0xFRDFfTU9ERV9TSElGVCkgfAorCQkJKEUxMDAwX0xFRENUTF9NT0RFX0xFRF9PRkYgPDwgRTEwMDBfTEVEQ1RMX0xFRDBfTU9ERV9TSElGVCkpKTsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOwogCX0KIAotCWUxMDAwX3NldHVwX2xlZCgmYWRhcHRlci0+aHcpOwotCW1vZF90aW1lcigmYWRhcHRlci0+YmxpbmtfdGltZXIsIGppZmZpZXMpOwotCi0JbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOwotCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5ibGlua190aW1lcik7CiAJZTEwMDBfbGVkX29mZigmYWRhcHRlci0+aHcpOwogCWNsZWFyX2JpdChFMTAwMF9MRURfT04sICZhZGFwdGVyLT5sZWRfc3RhdHVzKTsKIAllMTAwMF9jbGVhbnVwX2xlZCgmYWRhcHRlci0+aHcpOwpAQCAtMTYxNCw3ICsxNjU1LDcgQEAKIHN0YXRpYyBpbnQKIGUxMDAwX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaWYobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCWUxMDAwX2Rvd24oYWRhcHRlcik7CiAJCWUxMDAwX3VwKGFkYXB0ZXIpOwpAQCAtMTYzMiw3ICsxNjczLDcgQEAKIGUxMDAwX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIAogCQlzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHVpbnQ2NF90ICpkYXRhKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgaTsKIAogCWUxMDAwX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCmluZGV4IDcyMzU4OWIuLjA0NWY1NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtMzU0LDE4ICszNTQsMjcgQEAKICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2ludGVybmFsX3NlcmRlczsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYoaHctPm1hY190eXBlID49IGUxMDAwXzgyNTQzKSB7CisgICAgICAgIHN3aXRjaCAoaHctPm1hY190eXBlKSB7CisgICAgICAgIGNhc2UgZTEwMDBfODI1NDJfcmV2Ml8wOgorICAgICAgICBjYXNlIGUxMDAwXzgyNTQyX3JldjJfMToKKyAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGUxMDAwXzgyNTczOgorICAgICAgICAgICAgLyogVGhlIFNUQVRVU19UQklNT0RFIGJpdCBpcyByZXNlcnZlZCBvciByZXVzZWQgZm9yIHRoZSB0aGlzCisgICAgICAgICAgICAgKiBkZXZpY2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9jb3BwZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEUxMDAwX1JFQURfUkVHKGh3LCBTVEFUVVMpOwotICAgICAgICAgICAgaWYoc3RhdHVzICYgRTEwMDBfU1RBVFVTX1RCSU1PREUpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgJiBFMTAwMF9TVEFUVVNfVEJJTU9ERSkgewogICAgICAgICAgICAgICAgIGh3LT5tZWRpYV90eXBlID0gZTEwMDBfbWVkaWFfdHlwZV9maWJlcjsKICAgICAgICAgICAgICAgICAvKiB0YmlfY29tcGF0aWJpbGl0eSBub3QgdmFsaWQgb24gZmliZXIgKi8KICAgICAgICAgICAgICAgICBody0+dGJpX2NvbXBhdGliaWxpdHlfZW4gPSBGQUxTRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaHctPm1lZGlhX3R5cGUgPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFRoaXMgaXMgYW4gODI1NDIgKGZpYmVyIG9ubHkpICovCi0gICAgICAgICAgICBody0+bWVkaWFfdHlwZSA9IGUxMDAwX21lZGlhX3R5cGVfZmliZXI7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTExODksOSArMTE5OCw5IEBACiAgICAgICAgIHJldF92YWwgPSBlMTAwMF93cml0ZV9waHlfcmVnKGh3LCBQSFlfMTAwMFRfQ1RSTCwgcGh5X2RhdGEpOwogICAgICAgICBpZihyZXRfdmFsKQogICAgICAgICAgICAgcmV0dXJuIHJldF92YWw7Ci0gICAgICAgIH0KKyAgICB9CiAKLSAgIHJldHVybiBFMTAwMF9TVUNDRVNTOworICAgIHJldHVybiBFMTAwMF9TVUNDRVNTOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmggYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5oCmluZGV4IGEwMjYzZWUuLjkzZTlmODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuaApAQCAtNjYsNiArNjYsNyBAQAogICAgIGUxMDAwX2VlcHJvbV9zcGksCiAgICAgZTEwMDBfZWVwcm9tX21pY3Jvd2lyZSwKICAgICBlMTAwMF9lZXByb21fZmxhc2gsCisgICAgZTEwMDBfZWVwcm9tX25vbmUsIC8qIE5vIE5WTSBzdXBwb3J0ICovCiAgICAgZTEwMDBfbnVtX2VlcHJvbV90eXBlcwogfSBlMTAwMF9lZXByb21fdHlwZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCmluZGV4IDEzNzIyNmQuLmNiN2YwNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlICJlMTAwMC5oIgogCiAvKiBDaGFuZ2UgTG9nCisgKiA2LjAuNTggICAgICAgNC8yMC8wNQorICogICBvIEFjY2VwdGVkIGV0aHRvb2wgY2xlYW51cCBwYXRjaCBmcm9tIFN0ZXBoZW4gSGVtbWluZ2VyIAogICogNi4wLjQ0KwkyLzE1LzA1CiAgKiAgIG8gYXBwbGllZCBBbnRvbidzIHBhdGNoIHRvIHJlc29sdmUgdHggaGFuZyBpbiBoYXJkd2FyZQogICogICBvIEFwcGxpZWQgQW5kcmV3IE1vcnRvbnMgcGF0Y2ggLSBlMTAwMCBzdG9wcyB3b3JraW5nIGFmdGVyIHJlc3VtZQpAQCAtNDEsOSArNDMsOSBAQAogI2Vsc2UKICNkZWZpbmUgRFJJVkVSTkFQSSAiLU5BUEkiCiAjZW5kaWYKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjYuMC41NC1rMiJEUklWRVJOQVBJCisjZGVmaW5lIERSVl9WRVJTSU9OCQkiNi4wLjYwLWsyIkRSSVZFUk5BUEkKIGNoYXIgZTEwMDBfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwotY2hhciBlMTAwMF9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4iOworY2hhciBlMTAwMF9jb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4iOwogCiAvKiBlMTAwMF9wY2lfdGJsIC0gUENJIERldmljZSBJRCBUYWJsZQogICoKQEAgLTUxNyw3ICs1MTksNyBAQAogCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CiAKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKLQlhZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKIAlhZGFwdGVyLT5wZGV2ID0gcGRldjsKIAlhZGFwdGVyLT5ody5iYWNrID0gYWRhcHRlcjsKQEAgLTczOCw3ICs3NDAsNyBAQAogZTEwMDBfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXVpbnQzMl90IG1hbmMsIHN3c207CiAKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwpAQCAtODcxLDcgKzg3Myw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWludCBlcnI7CiAKIAkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLwpAQCAtOTE5LDcgKzkyMSw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWUxMDAwX2Rvd24oYWRhcHRlcik7CiAKQEAgLTE1OTksNyArMTYwMSw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9zZXRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CiAKIAlpZighaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKQEAgLTE2MzQsNyArMTYzNiw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IGRldl9tY19saXN0ICptY19wdHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIyMTMsNyArMjIxNSw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF94bWl0X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXVuc2lnbmVkIGludCBmaXJzdCwgbWF4X3Blcl90eGQgPSBFMTAwMF9NQVhfREFUQV9QRVJfVFhEOwogCXVuc2lnbmVkIGludCBtYXhfdHhkX3B3ciA9IEUxMDAwX01BWF9UWERfUFdSOwogCXVuc2lnbmVkIGludCB0eF9mbGFncyA9IDA7CkBAIC0yMzQ0LDcgKzIzNDYsNyBAQAogc3RhdGljIHZvaWQKIGUxMDAwX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAkvKiBEbyB0aGUgcmVzZXQgb3V0c2lkZSBvZiBpbnRlcnJ1cHQgY29udGV4dCAqLwogCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnR4X3RpbWVvdXRfdGFzayk7CkBAIC0yMzUzLDcgKzIzNTUsNyBAQAogc3RhdGljIHZvaWQKIGUxMDAwX3R4X3RpbWVvdXRfdGFzayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWUxMDAwX2Rvd24oYWRhcHRlcik7CiAJZTEwMDBfdXAoYWRhcHRlcik7CkBAIC0yMzcwLDcgKzIzNzIsNyBAQAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICoKIGUxMDAwX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAogCWUxMDAwX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKIAlyZXR1cm4gJmFkYXB0ZXItPm5ldF9zdGF0czsKQEAgLTIzODcsNyArMjM4OSw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgbWF4X2ZyYW1lID0gbmV3X210dSArIEVORVRfSEVBREVSX1NJWkUgKyBFVEhFUk5FVF9GQ1NfU0laRTsKIAogCWlmKChtYXhfZnJhbWUgPCBNSU5JTVVNX0VUSEVSTkVUX0ZSQU1FX1NJWkUpIHx8CkBAIC0yNTk4LDcgKzI2MDAsNyBAQAogZTEwMDBfaW50cihpbnQgaXJxLCB2b2lkICpkYXRhLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1aW50MzJfdCBpY3IgPSBFMTAwMF9SRUFEX1JFRyhodywgSUNSKTsKICNpZm5kZWYgQ09ORklHX0UxMDAwX05BUEkKQEAgLTI2NjEsNyArMjY2Myw3IEBACiBzdGF0aWMgaW50CiBlMTAwMF9jbGVhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgKmJ1ZGdldCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHdvcmtfdG9fZG8gPSBtaW4oKmJ1ZGdldCwgbmV0ZGV2LT5xdW90YSk7CiAJaW50IHR4X2NsZWFuZWQ7CiAJaW50IHdvcmtfZG9uZSA9IDA7CkBAIC0yNjcyLDggKzI2NzQsOCBAQAogCSpidWRnZXQgLT0gd29ya19kb25lOwogCW5ldGRldi0+cXVvdGEgLT0gd29ya19kb25lOwogCQotCS8qIElmIG5vIFR4IGFuZCBubyBSeCB3b3JrIGRvbmUsIGV4aXQgdGhlIHBvbGxpbmcgbW9kZSAqLwogCWlmICgoIXR4X2NsZWFuZWQgJiYgKHdvcmtfZG9uZSA9PSAwKSkgfHwgIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCS8qIElmIG5vIFR4IGFuZCBub3QgZW5vdWdoIFJ4IHdvcmsgZG9uZSwgZXhpdCB0aGUgcG9sbGluZyBtb2RlICovCiAJCW5ldGlmX3J4X2NvbXBsZXRlKG5ldGRldik7CiAJCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CiAJCXJldHVybiAwOwpAQCAtMjc2OSwxMyArMjc3MSwxMyBAQAogCQkJaSA9IHR4X3JpbmctPm5leHRfdG9fY2xlYW47CiAJCQllb3AgPSB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5uZXh0X3RvX3dhdGNoOwogCQkJZW9wX2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBlb3ApOwotCQkJRFBSSU5USyhUWF9FUlIsIEVSUiwgIkRldGVjdGVkIFR4IFVuaXQgSGFuZ1xuIgorCQkJRFBSSU5USyhEUlYsIEVSUiwgIkRldGVjdGVkIFR4IFVuaXQgSGFuZ1xuIgogCQkJCQkiICBUREggICAgICAgICAgICAgICAgICA8JXg+XG4iCiAJCQkJCSIgIFREVCAgICAgICAgICAgICAgICAgIDwleD5cbiIKIAkJCQkJIiAgbmV4dF90b191c2UgICAgICAgICAgPCV4PlxuIgogCQkJCQkiICBuZXh0X3RvX2NsZWFuICAgICAgICA8JXg+XG4iCiAJCQkJCSJidWZmZXJfaW5mb1tuZXh0X3RvX2NsZWFuXVxuIgotCQkJCQkiICBkbWEgICAgICAgICAgICAgICAgICA8JWxseD5cbiIKKwkJCQkJIiAgZG1hICAgICAgICAgICAgICAgICAgPCV6eD5cbiIKIAkJCQkJIiAgdGltZV9zdGFtcCAgICAgICAgICAgPCVseD5cbiIKIAkJCQkJIiAgbmV4dF90b193YXRjaCAgICAgICAgPCV4PlxuIgogCQkJCQkiICBqaWZmaWVzICAgICAgICAgICAgICA8JWx4PlxuIgpAQCAtMjk5NCw3ICsyOTk2LDcgQEAKIAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuOwogCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDX1BTKCpyeF9yaW5nLCBpKTsKLQlzdGF0ZXJyID0gcnhfZGVzYy0+d2IubWlkZGxlLnN0YXR1c19lcnJvcjsKKwlzdGF0ZXJyID0gbGUzMl90b19jcHUocnhfZGVzYy0+d2IubWlkZGxlLnN0YXR1c19lcnJvcik7CiAKIAl3aGlsZShzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKIAkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CkBAIC0zMDY1LDE2ICszMDY3LDE2IEBACiAjaWZkZWYgQ09ORklHX0UxMDAwX05BUEkKIAkJaWYodW5saWtlbHkoYWRhcHRlci0+dmxncnAgJiYgKHN0YXRlcnIgJiBFMTAwMF9SWERfU1RBVF9WUCkpKSB7CiAJCQl2bGFuX2h3YWNjZWxfcmVjZWl2ZV9za2Ioc2tiLCBhZGFwdGVyLT52bGdycCwKLQkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUudmxhbiAmCi0JCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKSk7CisJCQkJbGUxNl90b19jcHUocnhfZGVzYy0+d2IubWlkZGxlLnZsYW4pICYKKwkJCQlFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSyk7CiAJCX0gZWxzZSB7CiAJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQl9CiAjZWxzZSAvKiBDT05GSUdfRTEwMDBfTkFQSSAqLwogCQlpZih1bmxpa2VseShhZGFwdGVyLT52bGdycCAmJiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX1ZQKSkpIHsKIAkJCXZsYW5faHdhY2NlbF9yeChza2IsIGFkYXB0ZXItPnZsZ3JwLAotCQkJCWxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLm1pZGRsZS52bGFuICYKLQkJCQkJRTEwMDBfUlhEX1NQQ19WTEFOX01BU0spKTsKKwkJCQlsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUudmxhbikgJgorCQkJCUUxMDAwX1JYRF9TUENfVkxBTl9NQVNLKTsKIAkJfSBlbHNlIHsKIAkJCW5ldGlmX3J4KHNrYik7CiAJCX0KQEAgLTMwODcsNyArMzA4OSw3IEBACiAJCWlmKHVubGlrZWx5KCsraSA9PSByeF9yaW5nLT5jb3VudCkpIGkgPSAwOwogCiAJCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDX1BTKCpyeF9yaW5nLCBpKTsKLQkJc3RhdGVyciA9IHJ4X2Rlc2MtPndiLm1pZGRsZS5zdGF0dXNfZXJyb3I7CisJCXN0YXRlcnIgPSBsZTMyX3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUuc3RhdHVzX2Vycm9yKTsKIAl9CiAJcnhfcmluZy0+bmV4dF90b19jbGVhbiA9IGk7CiAJYWRhcHRlci0+YWxsb2NfcnhfYnVmKGFkYXB0ZXIpOwpAQCAtMzM3MSwxMSArMzM3MywxMiBAQAogc3RhdGljIGludAogZTEwMDBfbWlpX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKmRhdGEgPSBpZl9taWkoaWZyKTsKIAlpbnQgcmV0dmFsOwogCXVpbnQxNl90IG1paV9yZWc7CiAJdWludDE2X3Qgc3BkZHBseDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYoYWRhcHRlci0+aHcubWVkaWFfdHlwZSAhPSBlMTAwMF9tZWRpYV90eXBlX2NvcHBlcikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtMzM4NSwyMiArMzM4OCwyOSBAQAogCQlkYXRhLT5waHlfaWQgPSBhZGFwdGVyLT5ody5waHlfYWRkcjsKIAkJYnJlYWs7CiAJY2FzZSBTSU9DR01JSVJFRzoKLQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlpZighY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChlMTAwMF9yZWFkX3BoeV9yZWcoJmFkYXB0ZXItPmh3LCBkYXRhLT5yZWdfbnVtICYgMHgxRiwKLQkJCQkgICAmZGF0YS0+dmFsX291dCkpCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CisJCWlmKGUxMDAwX3JlYWRfcGh5X3JlZygmYWRhcHRlci0+aHcsIGRhdGEtPnJlZ19udW0gJiAweDFGLAorCQkJCSAgICZkYXRhLT52YWxfb3V0KSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQlicmVhazsKIAljYXNlIFNJT0NTTUlJUkVHOgotCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCWlmKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKLQkJaWYgKGRhdGEtPnJlZ19udW0gJiB+KDB4MUYpKQorCQlpZihkYXRhLT5yZWdfbnVtICYgfigweDFGKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQltaWlfcmVnID0gZGF0YS0+dmFsX2luOwotCQlpZiAoZTEwMDBfd3JpdGVfcGh5X3JlZygmYWRhcHRlci0+aHcsIGRhdGEtPnJlZ19udW0sCi0JCQkJCW1paV9yZWcpKQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOworCQlpZihlMTAwMF93cml0ZV9waHlfcmVnKCZhZGFwdGVyLT5odywgZGF0YS0+cmVnX251bSwKKwkJCQkJbWlpX3JlZykpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnN0YXRzX2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtRUlPOwotCQlpZiAoYWRhcHRlci0+aHcucGh5X3R5cGUgPT0gZTEwMDBfcGh5X204OCkgeworCQl9CisJCWlmKGFkYXB0ZXItPmh3LnBoeV90eXBlID09IGUxMDAwX3BoeV9tODgpIHsKIAkJCXN3aXRjaCAoZGF0YS0+cmVnX251bSkgewogCQkJY2FzZSBQSFlfQ1RSTDoKIAkJCQlpZihtaWlfcmVnICYgTUlJX0NSX1BPV0VSX0RPV04pCkBAIC0zNDIwLDggKzM0MzAsMTIgQEAKIAkJCQkJCSAgIEhBTEZfRFVQTEVYOwogCQkJCQlyZXR2YWwgPSBlMTAwMF9zZXRfc3BkX2RwbHgoYWRhcHRlciwKIAkJCQkJCQkJICAgIHNwZGRwbHgpOwotCQkJCQlpZihyZXR2YWwpCisJCQkJCWlmKHJldHZhbCkgeworCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCQkJCQkmYWRhcHRlci0+c3RhdHNfbG9jaywgCisJCQkJCQkJZmxhZ3MpOwogCQkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQkJfQogCQkJCX0KIAkJCQlpZihuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKIAkJCQkJZTEwMDBfZG93bihhZGFwdGVyKTsKQEAgLTM0MzEsOCArMzQ0NSwxMSBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBNODhFMTAwMF9QSFlfU1BFQ19DVFJMOgogCQkJY2FzZSBNODhFMTAwMF9FWFRfUEhZX1NQRUNfQ1RSTDoKLQkJCQlpZiAoZTEwMDBfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odykpCisJCQkJaWYoZTEwMDBfcGh5X3Jlc2V0KCZhZGFwdGVyLT5odykpIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCQkJCSZhZGFwdGVyLT5zdGF0c19sb2NrLCBmbGFncyk7CiAJCQkJCXJldHVybiAtRUlPOworCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTM0NDgsNiArMzQ2NSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3RhdHNfbG9jaywgZmxhZ3MpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0zNTA0LDcgKzM1MjIsNyBAQAogc3RhdGljIHZvaWQKIGUxMDAwX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdWludDMyX3QgY3RybCwgcmN0bDsKIAogCWUxMDAwX2lycV9kaXNhYmxlKGFkYXB0ZXIpOwpAQCAtMzU0NCw3ICszNTYyLDcgQEAKIHN0YXRpYyB2b2lkCiBlMTAwMF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdWludDE2X3QgdmlkKQogewotCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2LT5wcml2OworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1aW50MzJfdCB2ZnRhLCBpbmRleDsKIAlpZigoYWRhcHRlci0+aHcubW5nX2Nvb2tpZS5zdGF0dXMgJgogCQlFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgJiYKQEAgLTM1NjAsNyArMzU3OCw3IEBACiBzdGF0aWMgdm9pZAogZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1aW50MTZfdCB2aWQpCiB7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXVpbnQzMl90IHZmdGEsIGluZGV4OwogCiAJZTEwMDBfaXJxX2Rpc2FibGUoYWRhcHRlcik7CkBAIC0zNjAxLDYgKzM2MTksMTMgQEAKIHsKIAlhZGFwdGVyLT5ody5hdXRvbmVnID0gMDsKIAorCS8qIEZpYmVyIE5JQ3Mgb25seSBhbGxvdyAxMDAwIGdicHMgRnVsbCBkdXBsZXggKi8KKwlpZigoYWRhcHRlci0+aHcubWVkaWFfdHlwZSA9PSBlMTAwMF9tZWRpYV90eXBlX2ZpYmVyKSAmJgorCQlzcGRkcGx4ICE9IChTUEVFRF8xMDAwICsgRFVQTEVYX0ZVTEwpKSB7CisJCURQUklOVEsoUFJPQkUsIEVSUiwgIlVuc3VwcG9ydGVkIFNwZWVkL0R1cGxleCBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJc3dpdGNoKHNwZGRwbHgpIHsKIAljYXNlIFNQRUVEXzEwICsgRFVQTEVYX0hBTEY6CiAJCWFkYXB0ZXItPmh3LmZvcmNlZF9zcGVlZF9kdXBsZXggPSBlMTAwMF8xMF9oYWxmOwpAQCAtMzY0Nyw3ICszNjcyLDcgQEAKIGUxMDAwX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQzMl90IHN0YXRlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXVpbnQzMl90IGN0cmwsIGN0cmxfZXh0LCByY3RsLCBtYW5jLCBzdGF0dXMsIHN3c207CiAJdWludDMyX3Qgd3VmYyA9IGFkYXB0ZXItPndvbDsKIApAQCAtMzc0MCwxMiArMzc2NSwxMiBAQAogZTEwMDBfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYtPnByaXY7Ci0JdWludDMyX3QgbWFuYywgcmV0LCBzd3NtOworCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1aW50MzJfdCBtYW5jLCByZXRfdmFsLCBzd3NtOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlyZXRfdmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgMywgMCk7CkBAIC0zNzg4LDcgKzM4MTMsNyBAQAogc3RhdGljIHZvaWQKIGUxMDAwX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldi0+cHJpdjsKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJZGlzYWJsZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKIAllMTAwMF9pbnRyKGFkYXB0ZXItPnBkZXYtPmlycSwgbmV0ZGV2LCBOVUxMKTsKIAllbmFibGVfaXJxKGFkYXB0ZXItPnBkZXYtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMjEwMC5jIGIvZHJpdmVycy9uZXQvZTIxMDAuYwppbmRleCA1MWM5ZmEyLi5mNWE0ZGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2UyMTAwLmMKQEAgLTE2MiwxMiArMTYyLDcgQEAKIAllcnIgPSBkb19lMjEwMF9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0yODYsNiArMjgxLDkgQEAKICNlbmRpZgogCU5TODM5MF9pbml0KGRldiwgMCk7CiAKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKIAlyZXR1cm4gMDsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEUyMV9JT19FWFRFTlQpOwpAQCAtNDUzLDExICs0NTEsOCBAQAogCQlkZXYtPm1lbV9zdGFydCA9IG1lbVt0aGlzX2Rldl07CiAJCWRldi0+bWVtX2VuZCA9IHhjdnJbdGhpc19kZXZdOwkvKiBsb3cgNGJpdHMgPSB4Y3ZyIHNlbC4gKi8KIAkJaWYgKGRvX2UyMTAwX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfZTIxW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfZTIxW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZTIxMDAuYzogTm8gRTIxMDAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWVwcm8uYyBiL2RyaXZlcnMvbmV0L2VlcHJvLmMKaW5kZXggY2QyNDc1Ni4uZGNiMzAyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWVwcm8uYworKysgYi9kcml2ZXJzL25ldC9lZXByby5jCkBAIC02MDAsMTIgKzYwMCw3IEBACiAJZXJyID0gZG9fZWVwcm9fcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JcmVsZWFzZV9yZWdpb24oZGV2LT5iYXNlX2FkZHIsIEVFUFJPX0lPX0VYVEVOVCk7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtNzU4LDYgKzc1Myw3IEBACiAJaW50IGk7CiAJc3RydWN0IGVlcHJvX2xvY2FsICpscDsKIAlpbnQgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CisJaW50IGVycjsKIAogCS8qIEdyYWIgdGhlIHJlZ2lvbiBzbyB3ZSBjYW4gZmluZCBhbm90aGVyIGJvYXJkIGlmIGF1dG9JUlEgZmFpbHMuICovCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIEVFUFJPX0lPX0VYVEVOVCwgRFJWX05BTUUpKSB7IApAQCAtODczLDEwICs4NjksMTYgQEAKIAogCS8qIHJlc2V0IDgyNTk1ICovCiAJZWVwcm9fcmVzZXQoaW9hZGRyKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOwogCXJldHVybiAwOwogZXhpdDoKKwllcnIgPSAtRU5PREVWOworZXJyOgogIAlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUVQUk9fSU9fRVhURU5UKTsKLSAJcmV0dXJuIC1FTk9ERVY7CisgCXJldHVybiBlcnI7CiB9CiAKIC8qIE9wZW4vaW5pdGlhbGl6ZSB0aGUgYm9hcmQuICBUaGlzIGlzIGNhbGxlZCAoaW4gdGhlIGN1cnJlbnQga2VybmVsKQpAQCAtMTgzNCwxMSArMTgzNiw4IEBACiAJCWRldi0+aXJxID0gaXJxW2ldOwogCiAJCWlmIChkb19lZXByb19wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2VlcHJvW25fZWVwcm8rK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRUVQUk9fSU9fRVhURU5UKTsKKwkJCWRldl9lZXByb1tuX2VlcHJvKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXBybzEwMC5jIGIvZHJpdmVycy9uZXQvZWVwcm8xMDAuYwppbmRleCA5OGIzYTJmLi4xNzk1NDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXBybzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2VlcHJvMTAwLmMKQEAgLTEyNjksNyArMTI2OSw3IEBACiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwkJCS8qIE9LLiAgSnVzdCBpbml0aWFsbHkgc2hvcnQgb2YgUnggYnVmcy4gKi8KIAkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwotCQlyeGYgPSAoc3RydWN0IFJ4RkQgKilza2ItPnRhaWw7CisJCXJ4ZiA9IChzdHJ1Y3QgUnhGRCAqKXNrYi0+ZGF0YTsKIAkJc3AtPnJ4X3JpbmdwW2ldID0gcnhmOwogCQlzcC0+cnhfcmluZ19kbWFbaV0gPQogCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsIHJ4ZiwKQEAgLTE2NjEsNyArMTY2MSw3IEBACiAJCXNwLT5yeF9yaW5ncFtlbnRyeV0gPSBOVUxMOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcnhmID0gc3AtPnJ4X3JpbmdwW2VudHJ5XSA9IChzdHJ1Y3QgUnhGRCAqKXNrYi0+dGFpbDsKKwlyeGYgPSBzcC0+cnhfcmluZ3BbZW50cnldID0gKHN0cnVjdCBSeEZEICopc2tiLT5kYXRhOwogCXNwLT5yeF9yaW5nX2RtYVtlbnRyeV0gPQogCQlwY2lfbWFwX3NpbmdsZShzcC0+cGRldiwgcnhmLAogCQkJCQkgICBQS1RfQlVGX1NaICsgc2l6ZW9mKHN0cnVjdCBSeEZEKSwgUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTE4MDgsMTAgKzE4MDgsMTAgQEAKIAogI2lmIDEgfHwgVVNFX0lQX0NTVU0KIAkJCQkvKiBQYWNrZXQgaXMgaW4gb25lIGNodW5rIC0tIHdlIGNhbiBjb3B5ICsgY2tzdW0uICovCi0JCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHNwLT5yeF9za2J1ZmZbZW50cnldLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc3AtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsIHBrdF9sZW4sIDApOwogCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsKICNlbHNlCi0JCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwgc3AtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsCisJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwgc3AtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsCiAJCQkJCSAgIHBrdF9sZW4pOwogI2VuZGlmCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwLT5wZGV2LCBzcC0+cnhfcmluZ19kbWFbZW50cnldLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZWV4cHJlc3MuYyBiL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKaW5kZXggZmM4ZTc5NC4uODJiZDM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZWV4cHJlc3MuYworKysgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCkBAIC00MzYsMTEgKzQzNiw4IEBACiAJbmV0ZGV2X2Jvb3Rfc2V0dXBfY2hlY2soZGV2KTsKIAogCWVyciA9IGRvX2V4cHJlc3NfcHJvYmUoZGV2KTsKLQlpZiAoIWVycikgewotCQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQkJaWYgKCFlcnIpCi0JCQlyZXR1cm4gZGV2OwotCX0KKwlpZiAoIWVycikKKwkJcmV0dXJuIGRldjsKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC0xMjA1LDcgKzEyMDIsOCBAQAogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gJmVleHBfc2V0X211bHRpY2FzdDsKIAlkZXYtPnR4X3RpbWVvdXQgPSBlZXhwX3RpbWVvdXQ7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IDIqSFo7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiB9CiAKIC8qCkBAIC0xNzE2LDcgKzE3MTQsNyBAQAogCQkJCWJyZWFrOwogCQkJcHJpbnRrKEtFUk5fTk9USUNFICJlZXhwcmVzcy5jOiBNb2R1bGUgYXV0b3Byb2JlIG5vdCByZWNvbW1lbmRlZCwgZ2l2ZSBpbz14eC5cbiIpOwogCQl9Ci0JCWlmIChkb19leHByZXNzX3Byb2JlKGRldikgPT0gMCAmJiByZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7CisJCWlmIChkb19leHByZXNzX3Byb2JlKGRldikgPT0gMCkgewogCQkJZGV2X2VleHBbdGhpc19kZXZdID0gZGV2OwogCQkJZm91bmQrKzsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXBpYzEwMC5jIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCmluZGV4IDgxZWJhZWQuLjg3ZjUyMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYworKysgYi9kcml2ZXJzL25ldC9lcGljMTAwLmMKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLwogCQllcC0+cnhfcmluZ1tpXS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIAotCQkJc2tiLT50YWlsLCBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiLT5kYXRhLCBlcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQllcC0+cnhfcmluZ1tpXS5yeHN0YXR1cyA9IGNwdV90b19sZTMyKERlc2NPd24pOwogCX0KIAllcC0+ZGlydHlfcnggPSAodW5zaWduZWQgaW50KShpIC0gUlhfUklOR19TSVpFKTsKQEAgLTEyNzQsNyArMTI3NCw3IEBACiAJCQkJCQkJICAgIGVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyLAogCQkJCQkJCSAgICBlcC0+cnhfYnVmX3N6LAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBlcC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIGVwLT5yeF9za2J1ZmZbZW50cnldLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGVwLT5wY2lfZGV2LAogCQkJCQkJCSAgICAgICBlcC0+cnhfcmluZ1tlbnRyeV0uYnVmYWRkciwKQEAgLTEzMDgsNyArMTMwOCw3IEBACiAJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KIAkJCWVwLT5yeF9yaW5nW2VudHJ5XS5idWZhZGRyID0gcGNpX21hcF9zaW5nbGUoZXAtPnBjaV9kZXYsIAotCQkJCXNrYi0+dGFpbCwgZXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCQlza2ItPmRhdGEsIGVwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQl3b3JrX2RvbmUrKzsKIAkJfQogCQllcC0+cnhfcmluZ1tlbnRyeV0ucnhzdGF0dXMgPSBjcHVfdG9fbGUzMihEZXNjT3duKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VzMzIxMC5jIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKaW5kZXggZjFlODE1MC4uNTBmOGUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXMzMjEwLmMKKysrIGIvZHJpdmVycy9uZXQvZXMzMjEwLmMKQEAgLTE3NywxMiArMTc3LDcgQEAKIAllcnIgPSBkb19lc19wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0zMTAsNiArMzA1LDEwIEBACiAJZGV2LT5wb2xsX2NvbnRyb2xsZXIgPSBlaV9wb2xsOwogI2VuZGlmCiAJTlM4MzkwX2luaXQoZGV2LCAwKTsKKworCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0MTsKIAlyZXR1cm4gMDsKIG91dDE6CiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CkBAIC00NDUsMTEgKzQ0NCw4IEBACiAJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOwogCQlkZXYtPm1lbV9zdGFydCA9IG1lbVt0aGlzX2Rldl07CiAJCWlmIChkb19lc19wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2VzMzIxMFtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2VzMzIxMFtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImVzMzIxMC5jOiBObyBlczMyMTAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoMTZpLmMgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwppbmRleCBjY2FlNmJhLi5mMzJhNmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGgxNmkuYworKysgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwpAQCAtNDczLDEzICs0NzMsNyBAQAogCWVyciA9IGRvX2V0aDE2aV9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgRVRIMTZJX0lPX0VYVEVOVCk7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtNTY5LDcgKzU2MywxMyBAQAogCWRldi0+dHhfdGltZW91dCAJPSBldGgxNmlfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvCT0gVFhfVElNRU9VVDsKIAlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOworCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQxOwogCXJldHVybiAwOworb3V0MToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIEVUSDE2SV9JT19FWFRFTlQpOwogCXJldHVybiByZXR2YWw7CkBAIC0xNDYyLDEyICsxNDYyLDggQEAKIAkJfQogCiAJCWlmIChkb19ldGgxNmlfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9ldGgxNmlbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQkJCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBFVEgxNklfSU9fRVhURU5UKTsKKwkJCWRldl9ldGgxNmlbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJldGgxNmkuYyBObyBFdGgxNmkgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLAogCQkgICAgICAgaW9bdGhpc19kZXZdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V3cmszLmMgYi9kcml2ZXJzL25ldC9ld3JrMy5jCmluZGV4IGRjZjk2OWIuLmI5ODdmOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V3cmszLmMKKysrIGIvZHJpdmVycy9uZXQvZXdyazMuYwpAQCAtMTMwOCwxNSArMTMwOCw5IEBACiAJaWYgKGlvYWRkciA8IDB4MTAwMCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaW9hZGRyID09IDApIHsJLyogQXV0b3Byb2JpbmcgKi8KLQkJaW9iYXNlID0gRUlTQV9TTE9UX0lOQzsJCS8qIEdldCB0aGUgZmlyc3Qgc2xvdCBhZGRyZXNzICovCi0JCWkgPSAxOwotCQltYXhTbG90cyA9IE1BWF9FSVNBX1NMT1RTOwotCX0gZWxzZSB7CQkvKiBQcm9iZSBhIHNwZWNpZmljIGxvY2F0aW9uICovCi0JCWlvYmFzZSA9IGlvYWRkcjsKLQkJaSA9IChpb2FkZHIgPj4gMTIpOwotCQltYXhTbG90cyA9IGkgKyAxOwotCX0KKwlpb2Jhc2UgPSBpb2FkZHI7CisJaSA9IChpb2FkZHIgPj4gMTIpOworCW1heFNsb3RzID0gaSArIDE7CiAKIAlmb3IgKGkgPSAxOyAoaSA8IG1heFNsb3RzKSAmJiAoZGV2ICE9IE5VTEwpOyBpKyssIGlvYmFzZSArPSBFSVNBX1NMT1RfSU5DKSB7CiAJCWlmIChFSVNBX3NpZ25hdHVyZShuYW1lLCBFSVNBX0lEKSA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWFsbnguYyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCmluZGV4IGQwNWU5ZGQuLjU1ZGJlOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYWxueC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYWxueC5jCkBAIC0xMTA3LDcgKzExMDcsNyBAQAogCiAJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCW5wLT5sYWNrX3J4YnVmLT5za2J1ZmYgPSBza2I7Ci0JCW5wLT5sYWNrX3J4YnVmLT5idWZmZXIgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLAorCQlucC0+bGFja19yeGJ1Zi0+YnVmZmVyID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKIAkJCW5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCW5wLT5sYWNrX3J4YnVmLT5zdGF0dXMgPSBSWE9XTjsKIAkJKytucC0+cmVhbGx5X3J4X2NvdW50OwpAQCAtMTMwMCw3ICsxMzAwLDcgQEAKIAkJKytucC0+cmVhbGx5X3J4X2NvdW50OwogCQlucC0+cnhfcmluZ1tpXS5za2J1ZmYgPSBza2I7CiAJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCi0JCW5wLT5yeF9yaW5nW2ldLmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCW5wLT5yeF9yaW5nW2ldLmJ1ZmZlciA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCiAJCQlucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlucC0+cnhfcmluZ1tpXS5zdGF0dXMgPSBSWE9XTjsKIAkJbnAtPnJ4X3JpbmdbaV0uY29udHJvbCB8PSBSWElDOwpAQCAtMTQyMyw4ICsxNDIzLDcgQEAKIAkJaWYgKGN1ci0+c2tidWZmKSB7CiAJCQlwY2lfdW5tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBjdXItPmJ1ZmZlciwKIAkJCQljdXItPnNrYnVmZi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCWRldl9rZnJlZV9za2IoY3VyLT5za2J1ZmYpOwotCQkJLyogb3IgZGV2X2tmcmVlX3NrYl9pcnEoY3VyLT5za2J1ZmYpOyA/ICovCisJCQlkZXZfa2ZyZWVfc2tiX2FueShjdXItPnNrYnVmZik7CiAJCQljdXItPnNrYnVmZiA9IE5VTEw7CiAJCX0KIAkJY3VyLT5zdGF0dXMgPSAwOwpAQCAtMTczOCwxMSArMTczNywxMSBAQAogCiAjaWYgISBkZWZpbmVkKF9fYWxwaGFfXykKIAkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgCi0JCQkJCW5wLT5jdXJfcngtPnNrYnVmZi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJCW5wLT5jdXJfcngtPnNrYnVmZi0+ZGF0YSwgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogI2Vsc2UKIAkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAotCQkJCQlucC0+Y3VyX3J4LT5za2J1ZmYtPnRhaWwsIHBrdF9sZW4pOworCQkJCQlucC0+Y3VyX3J4LT5za2J1ZmYtPmRhdGEsIHBrdF9sZW4pOwogI2VuZGlmCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAogCQkJCQkJCSAgICAgICBucC0+Y3VyX3J4LT5idWZmZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mb3JjZWRldGguYyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCmluZGV4IDRlYmNkMDUuLjY0ZjBmNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jCkBAIC04Miw2ICs4Miw5IEBACiAgKgkwLjMxOiAxNCBOb3YgMjAwNDogZXRodG9vbCBzdXBwb3J0IGZvciBnZXR0aW5nL3NldHRpbmcgbGluawogICoJICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllcy4KICAqCTAuMzI6IDE2IEFwciAyMDA1OiBSWF9FUlJPUjQgaGFuZGxpbmcgYWRkZWQuCisgKgkwLjMzOiAxNiBNYXkgMjAwNTogU3VwcG9ydCBmb3IgTUNQNTEgYWRkZWQuCisgKgkwLjM0OiAxOCBKdW4gMjAwNTogQWRkIERFVl9ORUVEX0xJTktUSU1FUiB0byBhbGwgbkZvcmNlIG5pY3MuCisgKgkwLjM1OiAyNiBKdW4gMjAwNTogU3VwcG9ydCBmb3IgTUNQNTUgYWRkZWQuCiAgKgogICogS25vd24gYnVnczoKICAqIFdlIHN1c3BlY3QgdGhhdCBvbiBzb21lIGhhcmR3YXJlIG5vIFRYIGRvbmUgaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLgpAQCAtOTMsNyArOTYsNyBAQAogICogREVWX05FRURfVElNRVJJUlEgd2lsbCBub3QgaGFybSB5b3Ugb24gc2FuZSBoYXJkd2FyZSwgb25seSBnZW5lcmF0aW5nIGEgZmV3CiAgKiBzdXBlcmZsdW91cyB0aW1lciBpbnRlcnJ1cHRzIGZyb20gdGhlIG5pYy4KICAqLwotI2RlZmluZSBGT1JDRURFVEhfVkVSU0lPTgkJIjAuMzIiCisjZGVmaW5lIEZPUkNFREVUSF9WRVJTSU9OCQkiMC4zNSIKICNkZWZpbmUgRFJWX05BTUUJCQkiZm9yY2VkZXRoIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yMDA1LDcgKzIwMDgsOSBAQAogCS8qIGhhbmRsZSBkaWZmZXJlbnQgZGVzY3JpcHRvciB2ZXJzaW9ucyAqLwogCWlmIChwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEgfHwKIAkJcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yIHx8Ci0JCXBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMykKKwkJcGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8zIHx8ICAgIAorCQlwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEyIHx8CisJCXBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTMpCiAJCW5wLT5kZXNjX3ZlciA9IERFU0NfVkVSXzE7CiAJZWxzZQogCQlucC0+ZGVzY192ZXIgPSBERVNDX1ZFUl8yOwpAQCAtMjIxNSw1NiArMjIyMCw4NCBAQAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzQsCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7CS8qIG5Gb3JjZTMgRXRoZXJuZXQgQ29udHJvbGxlciAqLwogCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCiAJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfNSwKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKIAl9LAogCXsJLyogbkZvcmNlMyBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKIAkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF82LAogCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAogCX0sCiAJewkvKiBuRm9yY2UzIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzcsCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7CS8qIENLODA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzgsCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7CS8qIENLODA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzksCiAJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAogCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKLQkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUSwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7CS8qIE1DUDA0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KIAkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEwLAogCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKIAkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCi0JCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlEsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAogCX0sCiAJewkvKiBNQ1AwNCBFdGhlcm5ldCBDb250cm9sbGVyICovCiAJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKIAkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMSwKIAkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCiAJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAotCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRLAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKKwl9LAorCXsJLyogTUNQNTEgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTIsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCisJfSwKKwl7CS8qIE1DUDUxIEV0aGVybmV0IENvbnRyb2xsZXIgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfTlZJRElBLAorCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzEzLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IERFVl9ORUVEX0xBU1RQQUNLRVQxfERFVl9JUlFNQVNLXzJ8REVWX05FRURfVElNRVJJUlF8REVWX05FRURfTElOS1RJTUVSLAorCX0sCisJewkvKiBNQ1A1NSBFdGhlcm5ldCBDb250cm9sbGVyICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX05WSURJQSwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xNCwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBERVZfTkVFRF9MQVNUUEFDS0VUMXxERVZfSVJRTUFTS18yfERFVl9ORUVEX1RJTUVSSVJRfERFVl9ORUVEX0xJTktUSU1FUiwKKwl9LAorCXsJLyogTUNQNTUgRXRoZXJuZXQgQ29udHJvbGxlciAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9OVklESUEsCisJCS5kZXZpY2UgPSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTUsCisJCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gREVWX05FRURfTEFTVFBBQ0tFVDF8REVWX0lSUU1BU0tfMnxERVZfTkVFRF9USU1FUklSUXxERVZfTkVFRF9MSU5LVElNRVIsCiAJfSwKIAl7MCx9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuYwppbmRleCBiNDNiMmIxLi42NTE4MzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5jCkBAIC0xLDQgKzEsNCBAQAotLyogCisvKgogICogZHJpdmVycy9uZXQvZ2lhbmZhci5jCiAgKgogICogR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIKQEAgLTIyLDEwICsyMiw5IEBACiAgKiAgQi1WICsxLjYyCiAgKgogICogIFRoZW9yeSBvZiBvcGVyYXRpb24KLSAqICBUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIFRyaXBsZS1zcGVlZCBFdGhlcm5ldAotICogIGNvbnRyb2xsZXJzIG9uIHRoZSBGcmVlc2NhbGUgODU0MC84NTYwIGludGVncmF0ZWQgcHJvY2Vzc29ycywKLSAqICBhcyB3ZWxsIGFzIHRoZSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgb24gdGhlIDg1NDAuICAKLSAqICAKKyAqICBUaGlzIGRyaXZlciBpcyBkZXNpZ25lZCBmb3IgdGhlIG5vbi1DUE0gZXRoZXJuZXQgY29udHJvbGxlcnMKKyAqICBvbiB0aGUgODV4eCBhbmQgODN4eCBmYW1pbHkgb2YgaW50ZWdyYXRlZCBwcm9jZXNzb3JzCisgKgogICogIFRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBwbGF0Zm9ybV9kZXZpY2UuICBTdHJ1Y3R1cmVzIHdoaWNoCiAgKiAgZGVmaW5lIHRoZSBjb25maWd1cmF0aW9uIG5lZWRlZCBieSB0aGUgYm9hcmQgYXJlIGRlZmluZWQgaW4gYQogICogIGJvYXJkIHN0cnVjdHVyZSBpbiBhcmNoL3BwYy9wbGF0Zm9ybXMgKHRob3VnaCBJIGRvIG5vdApAQCAtMzksMTIgKzM4LDEyIEBACiAgKgogICogIFRoZSBHaWFuZmFyIEV0aGVybmV0IENvbnRyb2xsZXIgdXNlcyBhIHJpbmcgb2YgYnVmZmVyCiAgKiAgZGVzY3JpcHRvcnMuICBUaGUgYmVnaW5uaW5nIGlzIGluZGljYXRlZCBieSBhIHJlZ2lzdGVyCi0gKiAgcG9pbnRpbmcgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nLiAKLSAqICBUaGUgZW5kIGlzIGRldGVybWluZWQgYnkgYSAid3JhcCIgYml0IGJlaW5nIHNldCBpbiB0aGUgCisgKiAgcG9pbnRpbmcgdG8gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSByaW5nLgorICogIFRoZSBlbmQgaXMgZGV0ZXJtaW5lZCBieSBhICJ3cmFwIiBiaXQgYmVpbmcgc2V0IGluIHRoZQogICogIGxhc3QgZGVzY3JpcHRvciBvZiB0aGUgcmluZy4KICAqCiAgKiAgV2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCwgdGhlIFJYRiBiaXQgaW4gdGhlCi0gKiAgSUVWRU5UIHJlZ2lzdGVyIGlzIHNldCwgdHJpZ2dlcmluZyBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgCisgKiAgSUVWRU5UIHJlZ2lzdGVyIGlzIHNldCwgdHJpZ2dlcmluZyBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUKICAqICBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgSU1BU0sgcmVnaXN0ZXIgaXMgYWxzbyBzZXQgKGlmCiAgKiAgaW50ZXJydXB0IGNvYWxlc2NpbmcgaXMgYWN0aXZlLCB0aGVuIHRoZSBpbnRlcnJ1cHQgbWF5IG5vdAogICogIGhhcHBlbiBpbW1lZGlhdGVseSwgYnV0IHdpbGwgd2FpdCB1bnRpbCBlaXRoZXIgYSBzZXQgbnVtYmVyCkBAIC01Miw3ICs1MSw3IEBACiAgKiAgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBzaWduYWwgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCBhbmQKICAqICBleGl0LiAgV2l0aG91dCBOQVBJLCB0aGUgcGFja2V0KHMpIHdpbGwgYmUgaGFuZGxlZAogICogIGltbWVkaWF0ZWx5LiAgQm90aCBtZXRob2RzIHdpbGwgc3RhcnQgYXQgdGhlIGxhc3Qga25vd24gZW1wdHkKLSAqICBkZXNjcmlwdG9yLCBhbmQgcHJvY2VzcyBldmVyeSBzdWJzZXF1ZW50IGRlc2NyaXB0b3IgdW50aWwgdGhlcmUgCisgKiAgZGVzY3JpcHRvciwgYW5kIHByb2Nlc3MgZXZlcnkgc3Vic2VxdWVudCBkZXNjcmlwdG9yIHVudGlsIHRoZXJlCiAgKiAgYXJlIG5vbmUgbGVmdCB3aXRoIGRhdGEgKE5BUEkgd2lsbCBzdG9wIGFmdGVyIGEgc2V0IG51bWJlciBvZgogICogIHBhY2tldHMgdG8gZ2l2ZSB0aW1lIHRvIG90aGVyIHRhc2tzLCBidXQgd2lsbCBldmVudHVhbGx5CiAgKiAgcHJvY2VzcyBhbGwgdGhlIHBhY2tldHMpLiAgVGhlIGRhdGEgYXJyaXZlcyBpbnNpZGUgYQpAQCAtODMsOSArODIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTEyMyw3ICsxMjYsNyBAQAogc3RhdGljIGludCBnZmFyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOwogc3RhdGljIGlycXJldHVybl90IGdmYXJfZXJyb3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl90cmFuc21pdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWlycXJldHVybl90IGdmYXJfcmVjZWl2ZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBnZmFyX3JlY2VpdmUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2Zhcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgcGh5X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyB2b2lkIGdmYXJfcGh5X2NoYW5nZSh2b2lkICpkYXRhKTsKQEAgLTEzOSw5ICsxNDIsMTIgQEAKICNpZmRlZiBDT05GSUdfR0ZBUl9OQVBJCiBzdGF0aWMgaW50IGdmYXJfcG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgKmJ1ZGdldCk7CiAjZW5kaWYKLXN0YXRpYyBpbnQgZ2Zhcl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCByeF93b3JrX2xpbWl0KTsKK2ludCBnZmFyX2NsZWFuX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJ4X3dvcmtfbGltaXQpOwogc3RhdGljIGludCBnZmFyX3Byb2Nlc3NfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbmd0aCk7CiBzdGF0aWMgdm9pZCBnZmFyX3BoeV9zdGFydHVwX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBnZmFyX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJICAgICAgICAgICAgICAgIHN0cnVjdCB2bGFuX2dyb3VwICpncnApOworc3RhdGljIHZvaWQgZ2Zhcl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQxNl90IHZpZCk7CiAKIGV4dGVybiBzdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ldGh0b29sX29wczsKIApAQCAtMTQ5LDYgKzE1NSwxMyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJHaWFuZmFyIEV0aGVybmV0IERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCitpbnQgZ2Zhcl91c2VzX2ZjYihzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KQoreworCWlmIChwcml2LT52bGFuX2VuYWJsZSB8fCBwcml2LT5yeF9jc3VtX2VuYWJsZSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KIHN0YXRpYyBpbnQgZ2Zhcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJdTMyIHRlbXB2YWw7CkBAIC0xNTksNyArMTcyLDYgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJaW50IGlkeDsKIAlpbnQgZXJyID0gMDsKLQlpbnQgZGV2X2V0aHRvb2xfb3BzID0gMDsKIAogCWVpbmZvID0gKHN0cnVjdCBnaWFuZmFyX3BsYXRmb3JtX2RhdGEgKikgcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKQEAgLTI2NSwxNSArMjc3LDY5IEBACiAJZGV2LT5tdHUgPSAxNTAwOwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gZ2Zhcl9zZXRfbXVsdGk7CiAKLQkvKiBJbmRleCBpbnRvIHRoZSBhcnJheSBvZiBwb3NzaWJsZSBldGh0b29sCi0JICogb3BzIHRvIGNhdGNoIGFsbCA0IHBvc3NpYmlsaXRpZXMgKi8KLQlpZigocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTikgPT0gMCkKLQkJZGV2X2V0aHRvb2xfb3BzICs9IDE7CisJZGV2LT5ldGh0b29sX29wcyA9ICZnZmFyX2V0aHRvb2xfb3BzOwogCi0JaWYoKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX0NPQUxFU0NFKSA9PSAwKQotCQlkZXZfZXRodG9vbF9vcHMgKz0gMjsKKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSkgeworCQlwcml2LT5yeF9jc3VtX2VuYWJsZSA9IDE7CisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCX0gZWxzZQorCQlwcml2LT5yeF9jc3VtX2VuYWJsZSA9IDA7CiAKLQlkZXYtPmV0aHRvb2xfb3BzID0gZ2Zhcl9vcF9hcnJheVtkZXZfZXRodG9vbF9vcHNdOworCXByaXYtPnZsZ3JwID0gTlVMTDsKKworCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19WTEFOKSB7CisJCWRldi0+dmxhbl9yeF9yZWdpc3RlciA9IGdmYXJfdmxhbl9yeF9yZWdpc3RlcjsKKwkJZGV2LT52bGFuX3J4X2tpbGxfdmlkID0gZ2Zhcl92bGFuX3J4X2tpbGxfdmlkOworCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOworCisJCXByaXYtPnZsYW5fZW5hYmxlID0gMTsKKwl9CisKKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfRVhURU5ERURfSEFTSCkgeworCQlwcml2LT5leHRlbmRlZF9oYXNoID0gMTsKKwkJcHJpdi0+aGFzaF93aWR0aCA9IDk7CisKKwkJcHJpdi0+aGFzaF9yZWdzWzBdID0gJnByaXYtPnJlZ3MtPmlnYWRkcjA7CisJCXByaXYtPmhhc2hfcmVnc1sxXSA9ICZwcml2LT5yZWdzLT5pZ2FkZHIxOworCQlwcml2LT5oYXNoX3JlZ3NbMl0gPSAmcHJpdi0+cmVncy0+aWdhZGRyMjsKKwkJcHJpdi0+aGFzaF9yZWdzWzNdID0gJnByaXYtPnJlZ3MtPmlnYWRkcjM7CisJCXByaXYtPmhhc2hfcmVnc1s0XSA9ICZwcml2LT5yZWdzLT5pZ2FkZHI0OworCQlwcml2LT5oYXNoX3JlZ3NbNV0gPSAmcHJpdi0+cmVncy0+aWdhZGRyNTsKKwkJcHJpdi0+aGFzaF9yZWdzWzZdID0gJnByaXYtPnJlZ3MtPmlnYWRkcjY7CisJCXByaXYtPmhhc2hfcmVnc1s3XSA9ICZwcml2LT5yZWdzLT5pZ2FkZHI3OworCQlwcml2LT5oYXNoX3JlZ3NbOF0gPSAmcHJpdi0+cmVncy0+Z2FkZHIwOworCQlwcml2LT5oYXNoX3JlZ3NbOV0gPSAmcHJpdi0+cmVncy0+Z2FkZHIxOworCQlwcml2LT5oYXNoX3JlZ3NbMTBdID0gJnByaXYtPnJlZ3MtPmdhZGRyMjsKKwkJcHJpdi0+aGFzaF9yZWdzWzExXSA9ICZwcml2LT5yZWdzLT5nYWRkcjM7CisJCXByaXYtPmhhc2hfcmVnc1sxMl0gPSAmcHJpdi0+cmVncy0+Z2FkZHI0OworCQlwcml2LT5oYXNoX3JlZ3NbMTNdID0gJnByaXYtPnJlZ3MtPmdhZGRyNTsKKwkJcHJpdi0+aGFzaF9yZWdzWzE0XSA9ICZwcml2LT5yZWdzLT5nYWRkcjY7CisJCXByaXYtPmhhc2hfcmVnc1sxNV0gPSAmcHJpdi0+cmVncy0+Z2FkZHI3OworCisJfSBlbHNlIHsKKwkJcHJpdi0+ZXh0ZW5kZWRfaGFzaCA9IDA7CisJCXByaXYtPmhhc2hfd2lkdGggPSA4OworCisJCXByaXYtPmhhc2hfcmVnc1swXSA9ICZwcml2LT5yZWdzLT5nYWRkcjA7CisgICAgICAgICAgICAgICAgcHJpdi0+aGFzaF9yZWdzWzFdID0gJnByaXYtPnJlZ3MtPmdhZGRyMTsKKwkJcHJpdi0+aGFzaF9yZWdzWzJdID0gJnByaXYtPnJlZ3MtPmdhZGRyMjsKKwkJcHJpdi0+aGFzaF9yZWdzWzNdID0gJnByaXYtPnJlZ3MtPmdhZGRyMzsKKwkJcHJpdi0+aGFzaF9yZWdzWzRdID0gJnByaXYtPnJlZ3MtPmdhZGRyNDsKKwkJcHJpdi0+aGFzaF9yZWdzWzVdID0gJnByaXYtPnJlZ3MtPmdhZGRyNTsKKwkJcHJpdi0+aGFzaF9yZWdzWzZdID0gJnByaXYtPnJlZ3MtPmdhZGRyNjsKKwkJcHJpdi0+aGFzaF9yZWdzWzddID0gJnByaXYtPnJlZ3MtPmdhZGRyNzsKKwl9CisKKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfUEFERElORykKKwkJcHJpdi0+cGFkZGluZyA9IERFRkFVTFRfUEFERElORzsKKwllbHNlCisJCXByaXYtPnBhZGRpbmcgPSAwOworCisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gcHJpdi0+cGFkZGluZzsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKQorCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiArPSBHTUFDX0ZDQl9MRU47CiAKIAlwcml2LT5yeF9idWZmZXJfc2l6ZSA9IERFRkFVTFRfUlhfQlVGRkVSX1NJWkU7CiAjaWZkZWYgQ09ORklHX0dGQVJfQlVGU1RBU0gKQEAgLTI4OSw2ICszNTUsOSBAQAogCXByaXYtPnJ4Y291bnQgPSBERUZBVUxUX1JYQ09VTlQ7CiAJcHJpdi0+cnh0aW1lID0gREVGQVVMVF9SWFRJTUU7CiAKKwkvKiBFbmFibGUgbW9zdCBtZXNzYWdlcyBieSBkZWZhdWx0ICovCisJcHJpdi0+bXNnX2VuYWJsZSA9IChORVRJRl9NU0dfSUZVUCA8PCAxICkgLSAxOworCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAKIAlpZiAoZXJyKSB7CkBAIC0zNjAsOCArNDI5LDkgQEAKIAkJCUdGUF9LRVJORUwpOwogCiAJaWYoTlVMTCA9PSBtaWlfaW5mbykgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgbWlpX2luZm9cbiIsIAotCQkJCWRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtaWlfaW5mb1xuIiwKKwkJCQkJZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MTAsNyArNDgwLDggQEAKIAljdXJwaHkgPSBnZXRfcGh5X2luZm8ocHJpdi0+bWlpX2luZm8pOwogCiAJaWYgKGN1cnBoeSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIFBIWSBmb3VuZFxuIiwgZGV2LT5uYW1lKTsKKwkJaWYgKG5ldGlmX21zZ19pZnVwKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTm8gUEhZIGZvdW5kXG4iLCBkZXYtPm5hbWUpOwogCQllcnIgPSAtMTsKIAkJZ290byBub19waHk7CiAJfQpAQCAtNDIxLDcgKzQ5Miw3IEBACiAJaWYoY3VycGh5LT5pbml0KSB7CiAJCWVyciA9IGN1cnBoeS0+aW5pdChwcml2LT5taWlfaW5mbyk7CiAKLQkJaWYgKGVycikgCisJCWlmIChlcnIpCiAJCQlnb3RvIHBoeV9pbml0X2ZhaWw7CiAJfQogCkBAIC00NDYsMTQgKzUxNywxNCBAQAogCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmltYXNrLCBJTUFTS19JTklUX0NMRUFSKTsKIAogCS8qIEluaXQgaGFzaCByZWdpc3RlcnMgdG8gemVybyAqLwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyMCwgMCk7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHIxLCAwKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjIsIDApOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyMywgMCk7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHI0LCAwKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pYWRkcjUsIDApOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmlhZGRyNiwgMCk7Ci0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWFkZHI3LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHIwLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHIxLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHIyLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHIzLCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHI0LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHI1LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHI2LCAwKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5pZ2FkZHI3LCAwKTsKIAogCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyMCwgMCk7CiAJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHIxLCAwKTsKQEAgLTQ2NCw5ICs1MzUsNiBAQAogCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmdhZGRyNiwgMCk7CiAJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+Z2FkZHI3LCAwKTsKIAotCS8qIFplcm8gb3V0IHJjdHJsICovCi0JZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cmN0cmwsIDB4MDAwMDAwMDApOwotCiAJLyogWmVybyBvdXQgdGhlIHJtb24gbWliIHJlZ2lzdGVycyBpZiBpdCBoYXMgdGhlbSAqLwogCWlmIChwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19STU9OKSB7CiAJCW1lbXNldCgodm9pZCAqKSAmKHByaXYtPnJlZ3MtPnJtb24pLCAwLApAQCAtNDk3LDIwICs1NjUsMTQgQEAKIAlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50YmlwYSwgVEJJUEFfVkFMVUUpOwogfQogCi12b2lkIHN0b3BfZ2ZhcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCisvKiBIYWx0IHRoZSByZWNlaXZlIGFuZCB0cmFuc21pdCBxdWV1ZXMgKi8KK3ZvaWQgZ2Zhcl9oYWx0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHRlbXB2YWw7CiAKLQkvKiBMb2NrIGl0IGRvd24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogVGVsbCB0aGUga2VybmVsIHRoZSBsaW5rIGlzIGRvd24gKi8KLQlwcml2LT5taWlfaW5mby0+bGluayA9IDA7Ci0JYWRqdXN0X2xpbmsoZGV2KTsKLQogCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KIAlnZmFyX3dyaXRlKCZyZWdzLT5pbWFzaywgSU1BU0tfSU5JVF9DTEVBUik7CiAKQEAgLTUzMywxMyArNTk1LDI5IEBACiAJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcmVncy0+bWFjY2ZnMSk7CiAJdGVtcHZhbCAmPSB+KE1BQ0NGRzFfUlhfRU4gfCBNQUNDRkcxX1RYX0VOKTsKIAlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcxLCB0ZW1wdmFsKTsKK30KKwordm9pZCBzdG9wX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZ2ZhciAqcmVncyA9IHByaXYtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIExvY2sgaXQgZG93biAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBUZWxsIHRoZSBrZXJuZWwgdGhlIGxpbmsgaXMgZG93biAqLworCXByaXYtPm1paV9pbmZvLT5saW5rID0gMDsKKwlhZGp1c3RfbGluayhkZXYpOworCisJZ2Zhcl9oYWx0KGRldik7CiAKIAlpZiAocHJpdi0+ZWluZm8tPmJvYXJkX2ZsYWdzICYgRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUikgewogCQkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCiAJCW1paV9jbGVhcl9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvKTsKIAogCQkvKiBEaXNhYmxlIFBIWSBJbnRlcnJ1cHRzICovCi0JCW1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdChwcml2LT5taWlfaW5mbywgCisJCW1paV9jb25maWd1cmVfcGh5X2ludGVycnVwdChwcml2LT5taWlfaW5mbywKIAkJCQlNSUlfSU5URVJSVVBUX0RJU0FCTEVEKTsKIAl9CiAKQEAgLTU2Niw3ICs2NDQsNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCB0eGJkOCkqcHJpdi0+dHhfcmluZ19zaXplCiAJCQkrIHNpemVvZihzdHJ1Y3QgcnhiZDgpKnByaXYtPnJ4X3Jpbmdfc2l6ZSwKIAkJCXByaXYtPnR4X2JkX2Jhc2UsCi0JCQlnZmFyX3JlYWQoJnJlZ3MtPnRiYXNlKSk7CisJCQlnZmFyX3JlYWQoJnJlZ3MtPnRiYXNlMCkpOwogfQogCiAvKiBJZiB0aGVyZSBhcmUgYW55IHR4IHNrYnMgb3Igcnggc2ticyBzdGlsbCBhcm91bmQsIGZyZWUgdGhlbS4KQEAgLTYyMCw2ICs2OTgsMzQgQEAKIAl9CiB9CiAKK3ZvaWQgZ2Zhcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBnZmFyICpyZWdzID0gcHJpdi0+cmVnczsKKwl1MzIgdGVtcHZhbDsKKworCS8qIEVuYWJsZSBSeCBhbmQgVHggaW4gTUFDQ0ZHMSAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzEpOworCXRlbXB2YWwgfD0gKE1BQ0NGRzFfUlhfRU4gfCBNQUNDRkcxX1RYX0VOKTsKKwlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcxLCB0ZW1wdmFsKTsKKworCS8qIEluaXRpYWxpemUgRE1BQ1RSTCB0byBoYXZlIFdXUiBhbmQgV09QICovCisJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+ZG1hY3RybCk7CisJdGVtcHZhbCB8PSBETUFDVFJMX0lOSVRfU0VUVElOR1M7CisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+ZG1hY3RybCwgdGVtcHZhbCk7CisKKwkvKiBDbGVhciBUSExULCBzbyB0aGF0IHRoZSBETUEgc3RhcnRzIHBvbGxpbmcgbm93ICovCisJZ2Zhcl93cml0ZSgmcmVncy0+dHN0YXQsIFRTVEFUX0NMRUFSX1RIQUxUKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3Qgc3RvcHBlZCAqLworCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOworCXRlbXB2YWwgJj0gfihETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKKwlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKworCS8qIFVubWFzayB0aGUgaW50ZXJydXB0cyB3ZSBsb29rIGZvciAqLworCWdmYXJfd3JpdGUoJnJlZ3MtPmltYXNrLCBJTUFTS19ERUZBVUxUKTsKK30KKwogLyogQnJpbmcgdGhlIGNvbnRyb2xsZXIgdXAgYW5kIHJ1bm5pbmcgKi8KIGludCBzdGFydHVwX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTYzMCwzMyArNzM2LDM0IEBACiAJaW50IGk7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOwotCXUzMiB0ZW1wdmFsOwogCWludCBlcnIgPSAwOworCXUzMiByY3RybCA9IDA7CiAKIAlnZmFyX3dyaXRlKCZyZWdzLT5pbWFzaywgSU1BU0tfSU5JVF9DTEVBUik7CiAKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgZGVzY3JpcHRvcnMgKi8KLQl2YWRkciA9ICh1bnNpZ25lZCBsb25nKSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgCisJdmFkZHIgPSAodW5zaWduZWQgbG9uZykgZG1hX2FsbG9jX2NvaGVyZW50KE5VTEwsCiAJCQlzaXplb2YgKHN0cnVjdCB0eGJkOCkgKiBwcml2LT50eF9yaW5nX3NpemUgKwogCQkJc2l6ZW9mIChzdHJ1Y3QgcnhiZDgpICogcHJpdi0+cnhfcmluZ19zaXplLAogCQkJJmFkZHIsIEdGUF9LRVJORUwpOwogCiAJaWYgKHZhZGRyID09IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciBkZXNjcmlwdG9ycyFcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOworCQlpZiAobmV0aWZfbXNnX2lmdXAocHJpdikpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyIGRlc2NyaXB0b3JzIVxuIiwKKwkJCQkJZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcHJpdi0+dHhfYmRfYmFzZSA9IChzdHJ1Y3QgdHhiZDggKikgdmFkZHI7CiAKIAkvKiBlbmV0IERNQSBvbmx5IHVuZGVyc3RhbmRzIHBoeXNpY2FsIGFkZHJlc3NlcyAqLwotCWdmYXJfd3JpdGUoJnJlZ3MtPnRiYXNlLCBhZGRyKTsKKwlnZmFyX3dyaXRlKCZyZWdzLT50YmFzZTAsIGFkZHIpOwogCiAJLyogU3RhcnQgdGhlIHJ4IGRlc2NyaXB0b3IgcmluZyB3aGVyZSB0aGUgdHggcmluZyBsZWF2ZXMgb2ZmICovCiAJYWRkciA9IGFkZHIgKyBzaXplb2YgKHN0cnVjdCB0eGJkOCkgKiBwcml2LT50eF9yaW5nX3NpemU7CiAJdmFkZHIgPSB2YWRkciArIHNpemVvZiAoc3RydWN0IHR4YmQ4KSAqIHByaXYtPnR4X3Jpbmdfc2l6ZTsKIAlwcml2LT5yeF9iZF9iYXNlID0gKHN0cnVjdCByeGJkOCAqKSB2YWRkcjsKLQlnZmFyX3dyaXRlKCZyZWdzLT5yYmFzZSwgYWRkcik7CisJZ2Zhcl93cml0ZSgmcmVncy0+cmJhc2UwLCBhZGRyKTsKIAogCS8qIFNldHVwIHRoZSBza2J1ZmYgcmluZ3MgKi8KIAlwcml2LT50eF9za2J1ZmYgPQpAQCAtNjY0LDggKzc3MSw5IEBACiAJCQkJCXByaXYtPnR4X3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAocHJpdi0+dHhfc2tidWZmID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIHR4X3NrYnVmZlxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSB0eF9za2J1ZmZcbiIsCisJCQkJCWRldi0+bmFtZSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gdHhfc2tiX2ZhaWw7CiAJfQpAQCAtNjc4LDggKzc4Niw5IEBACiAJCQkJCXByaXYtPnJ4X3Jpbmdfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAocHJpdi0+cnhfc2tidWZmID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJ4X3NrYnVmZlxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfaWZ1cChwcml2KSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSByeF9za2J1ZmZcbiIsCisJCQkJCWRldi0+bmFtZSk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gcnhfc2tiX2ZhaWw7CiAJfQpAQCAtNzI2LDEyICs4MzUsMTMgQEAKIAkvKiBJZiB0aGUgZGV2aWNlIGhhcyBtdWx0aXBsZSBpbnRlcnJ1cHRzLCByZWdpc3RlciBmb3IKIAkgKiB0aGVtLiAgT3RoZXJ3aXNlLCBvbmx5IHJlZ2lzdGVyIGZvciB0aGUgb25lICovCiAJaWYgKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX01VTFRJX0lOVFIpIHsKLQkJLyogSW5zdGFsbCBvdXIgaW50ZXJydXB0IGhhbmRsZXJzIGZvciBFcnJvciwgCisJCS8qIEluc3RhbGwgb3VyIGludGVycnVwdCBoYW5kbGVycyBmb3IgRXJyb3IsCiAJCSAqIFRyYW5zbWl0LCBhbmQgUmVjZWl2ZSAqLwogCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+aW50ZXJydXB0RXJyb3IsIGdmYXJfZXJyb3IsCiAJCQkJMCwgImVuZXRfZXJyb3IiLCBkZXYpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZFxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdEVycm9yKTsKKwkJCWlmIChuZXRpZl9tc2dfaW50cihwcml2KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAorCQkJCQlkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdEVycm9yKTsKIAogCQkJZXJyID0gLTE7CiAJCQlnb3RvIGVycl9pcnFfZmFpbDsKQEAgLTczOSw4ICs4NDksOSBAQAogCiAJCWlmIChyZXF1ZXN0X2lycShwcml2LT5pbnRlcnJ1cHRUcmFuc21pdCwgZ2Zhcl90cmFuc21pdCwKIAkJCQkwLCAiZW5ldF90eCIsIGRldikgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0VHJhbnNtaXQpOworCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCisJCQkJCWRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0VHJhbnNtaXQpOwogCiAJCQllcnIgPSAtMTsKIApAQCAtNzQ5LDggKzg2MCw5IEBACiAKIAkJaWYgKHJlcXVlc3RfaXJxKHByaXYtPmludGVycnVwdFJlY2VpdmUsIGdmYXJfcmVjZWl2ZSwKIAkJCQkwLCAiZW5ldF9yeCIsIGRldikgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkIChyZWNlaXZlMClcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lLCBwcml2LT5pbnRlcnJ1cHRSZWNlaXZlKTsKKwkJCWlmIChuZXRpZl9tc2dfaW50cihwcml2KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkIChyZWNlaXZlMClcbiIsCisJCQkJCQlkZXYtPm5hbWUsIHByaXYtPmludGVycnVwdFJlY2VpdmUpOwogCiAJCQllcnIgPSAtMTsKIAkJCWdvdG8gcnhfaXJxX2ZhaWw7CkBAIC03NTgsOCArODcwLDkgQEAKIAl9IGVsc2UgewogCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+aW50ZXJydXB0VHJhbnNtaXQsIGdmYXJfaW50ZXJydXB0LAogCQkJCTAsICJnZmFyX2ludGVycnVwdCIsIGRldikgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkXG4iLAotCQkJICAgICAgIGRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0RXJyb3IpOworCQkJaWYgKG5ldGlmX21zZ19pbnRyKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IGdldCBJUlEgJWRcbiIsCisJCQkJCWRldi0+bmFtZSwgcHJpdi0+aW50ZXJydXB0RXJyb3IpOwogCiAJCQllcnIgPSAtMTsKIAkJCWdvdG8gZXJyX2lycV9mYWlsOwpAQCAtNzg3LDI4ICs5MDAsMjIgQEAKIAllbHNlCiAJCWdmYXJfd3JpdGUoJnJlZ3MtPnJ4aWMsIDApOwogCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdi0+cnhjbGVhbnVwcSk7CisJaWYgKHByaXYtPnJ4X2NzdW1fZW5hYmxlKQorCQlyY3RybCB8PSBSQ1RSTF9DSEVDS1NVTU1JTkc7CiAKLQkvKiBFbmFibGUgUnggYW5kIFR4IGluIE1BQ0NGRzEgKi8KLQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5tYWNjZmcxKTsKLQl0ZW1wdmFsIHw9IChNQUNDRkcxX1JYX0VOIHwgTUFDQ0ZHMV9UWF9FTik7Ci0JZ2Zhcl93cml0ZSgmcmVncy0+bWFjY2ZnMSwgdGVtcHZhbCk7CisJaWYgKHByaXYtPmV4dGVuZGVkX2hhc2gpCisJCXJjdHJsIHw9IFJDVFJMX0VYVEhBU0g7CiAKLQkvKiBJbml0aWFsaXplIERNQUNUUkwgdG8gaGF2ZSBXV1IgYW5kIFdPUCAqLwotCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOwotCXRlbXB2YWwgfD0gRE1BQ1RSTF9JTklUX1NFVFRJTkdTOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOworCWlmIChwcml2LT52bGFuX2VuYWJsZSkKKwkJcmN0cmwgfD0gUkNUUkxfVkxBTjsKIAotCS8qIENsZWFyIFRITFQsIHNvIHRoYXQgdGhlIERNQSBzdGFydHMgcG9sbGluZyBub3cgKi8KLQlnZmFyX3dyaXRlKCZyZWdzLT50c3RhdCwgVFNUQVRfQ0xFQVJfVEhBTFQpOworCS8qIEluaXQgcmN0cmwgYmFzZWQgb24gb3VyIHNldHRpbmdzICovCisJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cmN0cmwsIHJjdHJsKTsKIAotCS8qIE1ha2Ugc3VyZSB3ZSBhcmVuJ3Qgc3RvcHBlZCAqLwotCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOwotCXRlbXB2YWwgJj0gfihETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+dGN0cmwsIFRDVFJMX0lOSVRfQ1NVTSk7CiAKLQkvKiBVbm1hc2sgdGhlIGludGVycnVwdHMgd2UgbG9vayBmb3IgKi8KLQlnZmFyX3dyaXRlKCZyZWdzLT5pbWFzaywgSU1BU0tfREVGQVVMVCk7CisJZ2Zhcl9zdGFydChkZXYpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTgyNCw3ICs5MzEsNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCB0eGJkOCkqcHJpdi0+dHhfcmluZ19zaXplCiAJCQkrIHNpemVvZihzdHJ1Y3QgcnhiZDgpKnByaXYtPnJ4X3Jpbmdfc2l6ZSwKIAkJCXByaXYtPnR4X2JkX2Jhc2UsCi0JCQlnZmFyX3JlYWQoJnJlZ3MtPnRiYXNlKSk7CisJCQlnZmFyX3JlYWQoJnJlZ3MtPnRiYXNlMCkpOwogCiAJaWYgKHByaXYtPm1paV9pbmZvLT5waHlpbmZvLT5jbG9zZSkKIAkJcHJpdi0+bWlpX2luZm8tPnBoeWluZm8tPmNsb3NlKHByaXYtPm1paV9pbmZvKTsKQEAgLTg1NywxMSArOTY0LDYyIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHN0cnVjdCB0eGZjYiAqZ2Zhcl9hZGRfZmNiKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0eGJkOCAqYmRwKQoreworCXN0cnVjdCB0eGZjYiAqZmNiID0gKHN0cnVjdCB0eGZjYiAqKXNrYl9wdXNoIChza2IsIEdNQUNfRkNCX0xFTik7CisKKwltZW1zZXQoZmNiLCAwLCBHTUFDX0ZDQl9MRU4pOworCisJLyogRmxhZyB0aGUgYmQgc28gdGhlIGNvbnRyb2xsZXIgbG9va3MgZm9yIHRoZSBGQ0IgKi8KKwliZHAtPnN0YXR1cyB8PSBUWEJEX1RPRTsKKworCXJldHVybiBmY2I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZmFyX3R4X2NoZWNrc3VtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0eGZjYiAqZmNiKQoreworCWludCBsZW47CisKKwkvKiBJZiB3ZSdyZSBoZXJlLCBpdCdzIGEgSVAgcGFja2V0IHdpdGggYSBUQ1Agb3IgVURQCisJICogcGF5bG9hZC4gIFdlIHNldCBpdCB0byBjaGVja3N1bSwgdXNpbmcgYSBwc2V1ZG8taGVhZGVyCisJICogd2UgcHJvdmlkZQorCSAqLworCWZjYi0+aXAgPSAxOworCWZjYi0+dHVwID0gMTsKKwlmY2ItPmN0dSA9IDE7CisJZmNiLT5ucGggPSAxOworCisJLyogTm90aWZ5IHRoZSBjb250cm9sbGVyIHdoYXQgdGhlIHByb3RvY29sIGlzICovCisJaWYgKHNrYi0+bmguaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJZmNiLT51ZHAgPSAxOworCisJLyogbDNvcyBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlCisJICogZnJhbWUgKHNrYi0+ZGF0YSkgYW5kIHRoZSBzdGFydCBvZiB0aGUgSVAgaGRyLgorCSAqIGw0b3MgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIGwzIGhkciBhbmQgdGhlIGw0IGhkciAqLworCWZjYi0+bDNvcyA9ICh1MTYpKHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhIC0gR01BQ19GQ0JfTEVOKTsKKwlmY2ItPmw0b3MgPSAodTE2KShza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCisJbGVuID0gc2tiLT5uaC5pcGgtPnRvdF9sZW4gLSBmY2ItPmw0b3M7CisKKwkvKiBQcm92aWRlIHRoZSBwc2V1ZG9oZWFkZXIgY3N1bSAqLworCWZjYi0+cGhjcyA9IH5jc3VtX3RjcHVkcF9tYWdpYyhza2ItPm5oLmlwaC0+c2FkZHIsCisJCQlza2ItPm5oLmlwaC0+ZGFkZHIsIGxlbiwKKwkJCXNrYi0+bmguaXBoLT5wcm90b2NvbCwgMCk7Cit9CisKK3ZvaWQgZ2Zhcl90eF92bGFuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0eGZjYiAqZmNiKQoreworCWZjYi0+dmxuID0gMTsKKwlmY2ItPnZsY3RsID0gdmxhbl90eF90YWdfZ2V0KHNrYik7Cit9CisKIC8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgd2hlbiBhIGZyYW1lIGlzIHJlYWR5IGZvciB0cmFuc21pc3Npb24uICovCiAvKiBJdCBpcyBwb2ludGVkIHRvIGJ5IHRoZSBkZXYtPmhhcmRfc3RhcnRfeG1pdCBmdW5jdGlvbiBwb2ludGVyICovCiBzdGF0aWMgaW50IGdmYXJfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCB0eGZjYiAqZmNiID0gTlVMTDsKIAlzdHJ1Y3QgdHhiZDggKnR4YmRwOwogCiAJLyogVXBkYXRlIHRyYW5zbWl0IHN0YXRzICovCkBAIC04NzYsOSArMTAzNCwyNCBAQAogCS8qIENsZWFyIGFsbCBidXQgdGhlIFdSQVAgc3RhdHVzIGZsYWdzICovCiAJdHhiZHAtPnN0YXR1cyAmPSBUWEJEX1dSQVA7CiAKKwkvKiBTZXQgdXAgY2hlY2tzdW1taW5nICovCisJaWYgKChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSAKKwkJCSYmIChDSEVDS1NVTV9IVyA9PSBza2ItPmlwX3N1bW1lZCkpIHsKKwkJZmNiID0gZ2Zhcl9hZGRfZmNiKHNrYiwgdHhiZHApOworCQlnZmFyX3R4X2NoZWNrc3VtKHNrYiwgZmNiKTsKKwl9CisKKwlpZiAocHJpdi0+dmxhbl9lbmFibGUgJiYKKwkJCXVubGlrZWx5KHByaXYtPnZsZ3JwICYmIHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkpIHsKKwkJaWYgKE5VTEwgPT0gZmNiKQorCQkJZmNiID0gZ2Zhcl9hZGRfZmNiKHNrYiwgdHhiZHApOworCisJCWdmYXJfdHhfdmxhbihza2IsIGZjYik7CisJfQorCiAJLyogU2V0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgKi8KIAl0eGJkcC0+bGVuZ3RoID0gc2tiLT5sZW47Ci0JdHhiZHAtPmJ1ZlB0ciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwgCisJdHhiZHAtPmJ1ZlB0ciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwKIAkJCXNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKIAogCS8qIFNhdmUgdGhlIHNrYiBwb2ludGVyIHNvIHdlIGNhbiBmcmVlIGl0IGxhdGVyICovCkBAIC05NzIsMTUgKzExNDUsNzggQEAKIH0KIAogCisvKiBFbmFibGVzIGFuZCBkaXNhYmxlcyBWTEFOIGluc2VydGlvbi9leHRyYWN0aW9uICovCitzdGF0aWMgdm9pZCBnZmFyX3ZsYW5fcnhfcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0ZW1wdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXByaXYtPnZsZ3JwID0gZ3JwOworCisJaWYgKGdycCkgeworCQkvKiBFbmFibGUgVkxBTiB0YWcgaW5zZXJ0aW9uICovCisJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnRjdHJsKTsKKwkJdGVtcHZhbCB8PSBUQ1RSTF9WTElOUzsKKworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT50Y3RybCwgdGVtcHZhbCk7CisJCQorCQkvKiBFbmFibGUgVkxBTiB0YWcgZXh0cmFjdGlvbiAqLworCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5yY3RybCk7CisJCXRlbXB2YWwgfD0gUkNUUkxfVkxFWDsKKwkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cmN0cmwsIHRlbXB2YWwpOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgVkxBTiB0YWcgaW5zZXJ0aW9uICovCisJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnRjdHJsKTsKKwkJdGVtcHZhbCAmPSB+VENUUkxfVkxJTlM7CisJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnRjdHJsLCB0ZW1wdmFsKTsKKworCQkvKiBEaXNhYmxlIFZMQU4gdGFnIGV4dHJhY3Rpb24gKi8KKwkJdGVtcHZhbCA9IGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+cmN0cmwpOworCQl0ZW1wdmFsICY9IH5SQ1RSTF9WTEVYOworCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yY3RybCwgdGVtcHZhbCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGdmYXJfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1aW50MTZfdCB2aWQpCit7CisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocHJpdi0+dmxncnApCisJCXByaXYtPnZsZ3JwLT52bGFuX2RldmljZXNbdmlkXSA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Cit9CisKKwogc3RhdGljIGludCBnZmFyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CiAJaW50IHRlbXBzaXplLCB0ZW1wdmFsOwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBvbGRzaXplID0gcHJpdi0+cnhfYnVmZmVyX3NpemU7Ci0JaW50IGZyYW1lX3NpemUgPSBuZXdfbXR1ICsgMTg7CisJaW50IGZyYW1lX3NpemUgPSBuZXdfbXR1ICsgRVRIX0hMRU47CisKKwlpZiAocHJpdi0+dmxhbl9lbmFibGUpCisJCWZyYW1lX3NpemUgKz0gVkxBTl9FVEhfSExFTjsKKworCWlmIChnZmFyX3VzZXNfZmNiKHByaXYpKQorCQlmcmFtZV9zaXplICs9IEdNQUNfRkNCX0xFTjsKKworCWZyYW1lX3NpemUgKz0gcHJpdi0+cGFkZGluZzsKIAogCWlmICgoZnJhbWVfc2l6ZSA8IDY0KSB8fCAoZnJhbWVfc2l6ZSA+IEpVTUJPX0ZSQU1FX1NJWkUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgTVRVIHNldHRpbmdcbiIsIGRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSW52YWxpZCBNVFUgc2V0dGluZ1xuIiwKKwkJCQkJZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTIwLDcgKzEzNTYsNyBAQAogCXNrYi0+ZGV2ID0gZGV2OwogCiAJYmRwLT5idWZQdHIgPSBkbWFfbWFwX3NpbmdsZShOVUxMLCBza2ItPmRhdGEsCi0JCQlwcml2LT5yeF9idWZmZXJfc2l6ZSArIFJYQlVGX0FMSUdOTUVOVCwgCisJCQlwcml2LT5yeF9idWZmZXJfc2l6ZSArIFJYQlVGX0FMSUdOTUVOVCwKIAkJCURNQV9GUk9NX0RFVklDRSk7CiAKIAliZHAtPmxlbmd0aCA9IDA7CkBAIC0xMTkwLDExICsxNDI2LDEwIEBACiAKIAkJX19uZXRpZl9yeF9zY2hlZHVsZShkZXYpOwogCX0gZWxzZSB7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmUgY2FsbGVkIHR3aWNlICgleClbJXhdXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmlldmVudCksCi0JCSAgICAgICBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmltYXNrKSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ19yeF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlY2VpdmUgY2FsbGVkIHR3aWNlICgleClbJXhdXG4iLAorCQkJCWRldi0+bmFtZSwgZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pZXZlbnQpLAorCQkJCWdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aW1hc2spKTsKIAl9CiAjZWxzZQogCkBAIC0xMjA5LDE1ICsxNDQ0LDQzIEBACiAJZWxzZQogCQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5yeGljLCAwKTsKIAotCS8qIEp1c3QgaW4gY2FzZSB3ZSBuZWVkIHRvIHdha2UgdGhlIHJpbmcgcGFyYW0gY2hhbmdlciAqLwotCXByaXYtPnJ4Y2xlYW4gPSAxOwotCiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogI2VuZGlmCiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdmYXJfcnhfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxncnAsIHVuc2lnbmVkIHNob3J0IHZsY3RsKQoreworI2lmZGVmIENPTkZJR19HRkFSX05BUEkKKwlyZXR1cm4gdmxhbl9od2FjY2VsX3JlY2VpdmVfc2tiKHNrYiwgdmxncnAsIHZsY3RsKTsKKyNlbHNlCisJcmV0dXJuIHZsYW5faHdhY2NlbF9yeChza2IsIHZsZ3JwLCB2bGN0bCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdmYXJfcnhfY2hlY2tzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJ4ZmNiICpmY2IpCit7CisJLyogSWYgdmFsaWQgaGVhZGVycyB3ZXJlIGZvdW5kLCBhbmQgdmFsaWQgc3VtcworCSAqIHdlcmUgdmVyaWZpZWQsIHRoZW4gd2UgdGVsbCB0aGUga2VybmVsIHRoYXQgbm8KKwkgKiBjaGVja3N1bW1pbmcgaXMgbmVjZXNzYXJ5LiAgT3RoZXJ3aXNlLCBpdCBpcyAqLworCWlmIChmY2ItPmNpcCAmJiAhZmNiLT5laXAgJiYgZmNiLT5jdHUgJiYgIWZjYi0+ZXR1KQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCWVsc2UKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworfQorCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJ4ZmNiICpnZmFyX2dldF9mY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhmY2IgKmZjYiA9IChzdHJ1Y3QgcnhmY2IgKilza2ItPmRhdGE7CisKKwkvKiBSZW1vdmUgdGhlIEZDQiBmcm9tIHRoZSBza2IgKi8KKwlza2JfcHVsbChza2IsIEdNQUNfRkNCX0xFTik7CisKKwlyZXR1cm4gZmNiOworfQogCiAvKiBnZmFyX3Byb2Nlc3NfZnJhbWUoKSAtLSBoYW5kbGUgb25lIGluY29taW5nIHBhY2tldCBpZiBza2IKICAqIGlzbid0IE5VTEwuICAqLwpAQCAtMTIyNSwzNSArMTQ4OCw1MSBAQAogCQlpbnQgbGVuZ3RoKQogewogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCByeGZjYiAqZmNiID0gTlVMTDsKIAogCWlmIChza2IgPT0gTlVMTCkgewotI2lmZGVmIEJSSUVGX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNaXNzaW5nIHNrYiEhLlxuIiwKLQkJCQlkZXYtPm5hbWUpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1pc3Npbmcgc2tiISEuXG4iLCBkZXYtPm5hbWUpOwogCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCXByaXYtPmV4dHJhX3N0YXRzLnJ4X3NrYm1pc3NpbmcrKzsKIAl9IGVsc2UgeworCQlpbnQgcmV0OworCiAJCS8qIFByZXAgdGhlIHNrYiBmb3IgdGhlIHBhY2tldCAqLwogCQlza2JfcHV0KHNrYiwgbGVuZ3RoKTsKIAorCQkvKiBHcmFiIHRoZSBGQ0IgaWYgdGhlcmUgaXMgb25lICovCisJCWlmIChnZmFyX3VzZXNfZmNiKHByaXYpKQorCQkJZmNiID0gZ2Zhcl9nZXRfZmNiKHNrYik7CisKKwkJLyogUmVtb3ZlIHRoZSBwYWRkZWQgYnl0ZXMsIGlmIHRoZXJlIGFyZSBhbnkgKi8KKwkJaWYgKHByaXYtPnBhZGRpbmcpCisJCQlza2JfcHVsbChza2IsIHByaXYtPnBhZGRpbmcpOworCisJCWlmIChwcml2LT5yeF9jc3VtX2VuYWJsZSkKKwkJCWdmYXJfcnhfY2hlY2tzdW0oc2tiLCBmY2IpOworCiAJCS8qIFRlbGwgdGhlIHNrYiB3aGF0IGtpbmQgb2YgcGFja2V0IHRoaXMgaXMgKi8KIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAogCQkvKiBTZW5kIHRoZSBwYWNrZXQgdXAgdGhlIHN0YWNrICovCi0JCWlmIChSRUNFSVZFKHNrYikgPT0gTkVUX1JYX0RST1ApIHsKKwkJaWYgKHVubGlrZWx5KHByaXYtPnZsZ3JwICYmIGZjYi0+dmxuKSkKKwkJCXJldCA9IGdmYXJfcnhfdmxhbihza2IsIHByaXYtPnZsZ3JwLCBmY2ItPnZsY3RsKTsKKwkJZWxzZQorCQkJcmV0ID0gUkVDRUlWRShza2IpOworCisJCWlmIChORVRfUlhfRFJPUCA9PSByZXQpCiAJCQlwcml2LT5leHRyYV9zdGF0cy5rZXJuZWxfZHJvcHBlZCsrOwotCQl9CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIC8qIGdmYXJfY2xlYW5fcnhfcmluZygpIC0tIFByb2Nlc3NlcyBlYWNoIGZyYW1lIGluIHRoZSByeCByaW5nCi0gKiAgIHVudGlsIHRoZSBidWRnZXQvcXVvdGEgaGFzIGJlZW4gcmVhY2hlZC4gUmV0dXJucyB0aGUgbnVtYmVyIAorICogICB1bnRpbCB0aGUgYnVkZ2V0L3F1b3RhIGhhcyBiZWVuIHJlYWNoZWQuIFJldHVybnMgdGhlIG51bWJlcgogICogICBvZiBmcmFtZXMgaGFuZGxlZAogICovCi1zdGF0aWMgaW50IGdmYXJfY2xlYW5fcnhfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcnhfd29ya19saW1pdCkKK2ludCBnZmFyX2NsZWFuX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJ4X3dvcmtfbGltaXQpCiB7CiAJc3RydWN0IHJ4YmQ4ICpiZHA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTEzNTUsOSArMTYzNCw2IEBACiAJCQkJICAgbWtfaWNfdmFsdWUocHJpdi0+cnhjb3VudCwgcHJpdi0+cnh0aW1lKSk7CiAJCWVsc2UKIAkJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnJ4aWMsIDApOwotCi0JCS8qIFNpZ25hbCB0byB0aGUgcmluZyBzaXplIGNoYW5nZXIgdGhhdCBpdCdzIHNhZmUgdG8gZ28gKi8KLQkJcHJpdi0+cnhjbGVhbiA9IDE7CiAJfQogCiAJcmV0dXJuIChyeF93b3JrX2xpbWl0IDwgMCkgPyAxIDogMDsKQEAgLTEzOTMsMTAgKzE2NjksOCBAQAogCQlpZiAoZXZlbnRzICYgSUVWRU5UX0NSTCkKIAkJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJCWlmIChldmVudHMgJiBJRVZFTlRfWEZVTikgewotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB0eCB1bmRlcnJ1bi4gZHJvcHBlZCBwYWNrZXRcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKLSNlbmRpZgorCQkJaWYgKG5ldGlmX21zZ190eF9lcnIocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHR4IHVuZGVycnVuLiBkcm9wcGVkIHBhY2tldFxuIiwgZGV2LT5uYW1lKTsKIAkJCXByaXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJCXByaXYtPmV4dHJhX3N0YXRzLnR4X3VuZGVycnVuKys7CiAKQEAgLTE0MTUsMzYgKzE2ODksMzAgQEAKIAkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnN0YXQsIFJTVEFUX0NMRUFSX1JIQUxUKTsKICNlbmRpZgogCi0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1c3kgZXJyb3IgKHJoYWx0OiAleClcbiIsIGRldi0+bmFtZSwKLQkJICAgICAgIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+cnN0YXQpKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzeSBlcnJvciAocmhhbHQ6ICV4KVxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQlnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnJzdGF0KSk7CiAJfQogCWlmIChldmVudHMgJiBJRVZFTlRfQkFCUikgewogCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfYmFicisrOwogCi0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYmJsaW5nIGVycm9yXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJibGluZyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKIAl9CiAJaWYgKGV2ZW50cyAmIElFVkVOVF9FQkVSUikgewogCQlwcml2LT5leHRyYV9zdGF0cy5lYmVycisrOwotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFQkVSUlxuIiwgZGV2LT5uYW1lKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogRUJFUlJcbiIsIGRldi0+bmFtZSk7CiAJfQotCWlmIChldmVudHMgJiBJRVZFTlRfUlhDKSB7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvbnRyb2wgZnJhbWVcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKLQl9CisJaWYgKChldmVudHMgJiBJRVZFTlRfUlhDKSAmJiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNvbnRyb2wgZnJhbWVcbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAoZXZlbnRzICYgSUVWRU5UX0JBQlQpIHsKIAkJcHJpdi0+ZXh0cmFfc3RhdHMudHhfYmFidCsrOwotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJ0IGVycm9yXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJ0IGVycm9yXG4iLCBkZXYtPm5hbWUpOwogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTE1MTAsNyArMTc3OCw3IEBACiAgKiBJZiwgYWZ0ZXIgR0ZBUl9BTl9USU1FT1VUIHNlY29uZHMsIGl0IGhhcyBub3QKICAqIGZpbmlzaGVkLCB3ZSBzd2l0Y2ggdG8gZm9yY2VkLgogICogRWl0aGVyIHdheSwgb25jZSB0aGUgcHJvY2VzcyBoYXMgY29tcGxldGVkLCB3ZSBlaXRoZXIKLSAqIHJlcXVlc3QgdGhlIGludGVycnVwdCwgb3Igc3dpdGNoIHRoZSB0aW1lciBvdmVyIHRvIAorICogcmVxdWVzdCB0aGUgaW50ZXJydXB0LCBvciBzd2l0Y2ggdGhlIHRpbWVyIG92ZXIgdG8KICAqIHVzaW5nIGdmYXJfcGh5X3RpbWVyIHRvIGNoZWNrIHN0YXR1cyAqLwogc3RhdGljIHZvaWQgZ2Zhcl9waHlfc3RhcnR1cF90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7CkBAIC0xNTM1LDggKzE4MDMsOSBAQAogCiAJCS8qIEZvcmNpbmcgZmFpbGVkISAgR2l2ZSB1cCAqLwogCQlpZihyZXN1bHQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEZvcmNpbmcgZmFpbGVkIVxuIiwKLQkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSk7CisJCQlpZiAobmV0aWZfbXNnX2xpbmsocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRm9yY2luZyBmYWlsZWQhXG4iLAorCQkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xNTQ2LDE2ICsxODE1LDE3IEBACiAKIAkvKiBHcmFiIHRoZSBQSFkgaW50ZXJydXB0LCBpZiBuZWNlc3NhcnkvcG9zc2libGUgKi8KIAlpZiAocHJpdi0+ZWluZm8tPmJvYXJkX2ZsYWdzICYgRlNMX0dJQU5GQVJfQlJEX0hBU19QSFlfSU5UUikgewotCQlpZiAocmVxdWVzdF9pcnEocHJpdi0+ZWluZm8tPmludGVycnVwdFBIWSwgCisJCWlmIChyZXF1ZXN0X2lycShwcml2LT5laW5mby0+aW50ZXJydXB0UEhZLAogCQkJCQlwaHlfaW50ZXJydXB0LAotCQkJCQlTQV9TSElSUSwgCi0JCQkJCSJwaHlfaW50ZXJydXB0IiwgCisJCQkJCVNBX1NISVJRLAorCQkJCQkicGh5X2ludGVycnVwdCIsCiAJCQkJCW1paV9pbmZvLT5kZXYpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgZ2V0IElSUSAlZCAoUEhZKVxuIiwKLQkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSwKKwkJCWlmIChuZXRpZl9tc2dfaW50cihwcml2KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBnZXQgSVJRICVkIChQSFkpXG4iLAorCQkJCQkJbWlpX2luZm8tPmRldi0+bmFtZSwKIAkJCQkJcHJpdi0+ZWluZm8tPmludGVycnVwdFBIWSk7CiAJCX0gZWxzZSB7Ci0JCQltaWlfY29uZmlndXJlX3BoeV9pbnRlcnJ1cHQocHJpdi0+bWlpX2luZm8sIAorCQkJbWlpX2NvbmZpZ3VyZV9waHlfaW50ZXJydXB0KHByaXYtPm1paV9pbmZvLAogCQkJCQlNSUlfSU5URVJSVVBUX0VOQUJMRUQpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xNTkyLDE1ICsxODYyLDE3IEBACiAJCQkJdGVtcHZhbCAmPSB+KE1BQ0NGRzJfRlVMTF9EVVBMRVgpOwogCQkJCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOwogCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhbGYgRHVwbGV4XG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCWlmIChuZXRpZl9tc2dfbGluayhwcml2KSkKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEhhbGYgRHVwbGV4XG4iLAorCQkJCQkJCWRldi0+bmFtZSk7CiAJCQl9IGVsc2UgewogCQkJCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnJlZ3MtPm1hY2NmZzIpOwogCQkJCXRlbXB2YWwgfD0gTUFDQ0ZHMl9GVUxMX0RVUExFWDsKIAkJCQlnZmFyX3dyaXRlKCZyZWdzLT5tYWNjZmcyLCB0ZW1wdmFsKTsKIAotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGdWxsIER1cGxleFxuIiwKLQkJCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJCQlpZiAobmV0aWZfbXNnX2xpbmsocHJpdikpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGdWxsIER1cGxleFxuIiwKKwkJCQkJCQlkZXYtPm5hbWUpOwogCQkJfQogCiAJCQlwcml2LT5vbGRkdXBsZXggPSBtaWlfaW5mby0+ZHVwbGV4OwpAQCAtMTYyMiwyNyArMTg5NCwzMiBAQAogCQkJCWdmYXJfd3JpdGUoJnJlZ3MtPm1hY2NmZzIsIHRlbXB2YWwpOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJICAgICAgICIlczogQWNrISAgU3BlZWQgKCVkKSBpcyBub3QgMTAvMTAwLzEwMDAhXG4iLAotCQkJCSAgICAgICBkZXYtPm5hbWUsIG1paV9pbmZvLT5zcGVlZCk7CisJCQkJaWYgKG5ldGlmX21zZ19saW5rKHByaXYpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCQkJIiVzOiBBY2shICBTcGVlZCAoJWQpIGlzIG5vdCAxMC8xMDAvMTAwMCFcbiIsCisJCQkJCQkJZGV2LT5uYW1lLCBtaWlfaW5mby0+c3BlZWQpOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogU3BlZWQgJWRCVFxuIiwgZGV2LT5uYW1lLAotCQkJICAgICAgIG1paV9pbmZvLT5zcGVlZCk7CisJCQlpZiAobmV0aWZfbXNnX2xpbmsocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFNwZWVkICVkQlRcbiIsIGRldi0+bmFtZSwKKwkJCQkJCW1paV9pbmZvLT5zcGVlZCk7CiAKIAkJCXByaXYtPm9sZHNwZWVkID0gbWlpX2luZm8tPnNwZWVkOwogCQl9CiAKIAkJaWYgKCFwcml2LT5vbGRsaW5rKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyB1cFxuIiwgZGV2LT5uYW1lKTsKKwkJCWlmIChuZXRpZl9tc2dfbGluayhwcml2KSkKKwkJCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyB1cFxuIiwgZGV2LT5uYW1lKTsKIAkJCXByaXYtPm9sZGxpbmsgPSAxOwogCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCQkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChwcml2LT5vbGRsaW5rKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBpcyBkb3duXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKG5ldGlmX21zZ19saW5rKHByaXYpKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGlzIGRvd25cbiIsCisJCQkJCQlkZXYtPm5hbWUpOwogCQkJcHJpdi0+b2xkbGluayA9IDA7CiAJCQlwcml2LT5vbGRzcGVlZCA9IDA7CiAJCQlwcml2LT5vbGRkdXBsZXggPSAtMTsKQEAgLTE2NjQsOCArMTk0MSw5IEBACiAJdTMyIHRlbXB2YWw7CiAKIAlpZihkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVudGVyaW5nIHByb21pc2N1b3VzIG1vZGUuXG4iLAotCQkJCWRldi0+bmFtZSk7CisJCWlmIChuZXRpZl9tc2dfZHJ2KHByaXYpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVudGVyaW5nIHByb21pc2N1b3VzIG1vZGUuXG4iLAorCQkJCQlkZXYtPm5hbWUpOwogCQkvKiBTZXQgUkNUUkwgdG8gUFJPTSAqLwogCQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZyZWdzLT5yY3RybCk7CiAJCXRlbXB2YWwgfD0gUkNUUkxfUFJPTTsKQEAgLTE2NzksNiArMTk1NywxNCBAQAogCQogCWlmKGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpIHsKIAkJLyogU2V0IHRoZSBoYXNoIHRvIHJ4IGFsbCBtdWx0aWNhc3QgZnJhbWVzICovCisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjAsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5pZ2FkZHIxLCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyMiwgMHhmZmZmZmZmZik7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjMsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5pZ2FkZHI0LCAweGZmZmZmZmZmKTsKKwkJZ2Zhcl93cml0ZSgmcmVncy0+aWdhZGRyNSwgMHhmZmZmZmZmZik7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjYsIDB4ZmZmZmZmZmYpOworCQlnZmFyX3dyaXRlKCZyZWdzLT5pZ2FkZHI3LCAweGZmZmZmZmZmKTsKIAkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIwLCAweGZmZmZmZmZmKTsKIAkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIxLCAweGZmZmZmZmZmKTsKIAkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIyLCAweGZmZmZmZmZmKTsKQEAgLTE2ODksNiArMTk3NSwxNCBAQAogCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjcsIDB4ZmZmZmZmZmYpOwogCX0gZWxzZSB7CiAJCS8qIHplcm8gb3V0IHRoZSBoYXNoICovCisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjAsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjEsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjIsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjMsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjQsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjUsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjYsIDB4MCk7CisJCWdmYXJfd3JpdGUoJnJlZ3MtPmlnYWRkcjcsIDB4MCk7CiAJCWdmYXJfd3JpdGUoJnJlZ3MtPmdhZGRyMCwgMHgwKTsKIAkJZ2Zhcl93cml0ZSgmcmVncy0+Z2FkZHIxLCAweDApOwogCQlnZmFyX3dyaXRlKCZyZWdzLT5nYWRkcjIsIDB4MCk7CkBAIC0xNzI3LDE2ICsyMDIxLDE1IEBACiB7CiAJdTMyIHRlbXB2YWw7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGdmYXIgKnJlZ3MgPSBwcml2LT5yZWdzOwotCXUzMiAqaGFzaCA9ICZyZWdzLT5nYWRkcjA7CiAJdTMyIHJlc3VsdCA9IGV0aGVyX2NyYyhNQUNfQUREUl9MRU4sIGFkZHIpOwotCXU4IHdoaWNocmVnID0gKChyZXN1bHQgPj4gMjkpICYgMHg3KTsKLQl1OCB3aGljaGJpdCA9ICgocmVzdWx0ID4+IDI0KSAmIDB4MWYpOworCWludCB3aWR0aCA9IHByaXYtPmhhc2hfd2lkdGg7CisJdTggd2hpY2hiaXQgPSAocmVzdWx0ID4+ICgzMiAtIHdpZHRoKSkgJiAweDFmOworCXU4IHdoaWNocmVnID0gcmVzdWx0ID4+ICgzMiAtIHdpZHRoICsgNSk7CiAJdTMyIHZhbHVlID0gKDEgPDwgKDMxLXdoaWNoYml0KSk7CiAKLQl0ZW1wdmFsID0gZ2Zhcl9yZWFkKCZoYXNoW3doaWNocmVnXSk7CisJdGVtcHZhbCA9IGdmYXJfcmVhZChwcml2LT5oYXNoX3JlZ3Nbd2hpY2hyZWddKTsKIAl0ZW1wdmFsIHw9IHZhbHVlOwotCWdmYXJfd3JpdGUoJmhhc2hbd2hpY2hyZWddLCB0ZW1wdmFsKTsKKwlnZmFyX3dyaXRlKHByaXYtPmhhc2hfcmVnc1t3aGljaHJlZ10sIHRlbXB2YWwpOwogCiAJcmV0dXJuOwogfQpAQCAtMTc1NCwxMCArMjA0Nyw5IEBACiAJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+aWV2ZW50LCBJRVZFTlRfRVJSX01BU0spOwogCiAJLyogSG1tLi4uICovCi0jaWYgZGVmaW5lZCAoQlJJRUZfR0ZBUl9FUlJPUlMpIHx8IGRlZmluZWQgKFZFUkJPU0VfR0ZBUl9FUlJPUlMpCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBlcnJvciBpbnRlcnJ1cHQgKGlldmVudD0weCUwOHggaW1hc2s9MHglMDh4KVxuIiwKLQkgICAgICAgZGV2LT5uYW1lLCBldmVudHMsIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aW1hc2spKTsKLSNlbmRpZgorCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpIHx8IG5ldGlmX21zZ190eF9lcnIocHJpdikpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogZXJyb3IgaW50ZXJydXB0IChpZXZlbnQ9MHglMDh4IGltYXNrPTB4JTA4eClcbiIsCisJCQkJZGV2LT5uYW1lLCBldmVudHMsIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+aW1hc2spKTsKIAogCS8qIFVwZGF0ZSB0aGUgZXJyb3IgY291bnRlcnMgKi8KIAlpZiAoZXZlbnRzICYgSUVWRU5UX1RYRSkgewpAQCAtMTc2OCwxOSArMjA2MCwxNyBAQAogCQlpZiAoZXZlbnRzICYgSUVWRU5UX0NSTCkKIAkJCXByaXYtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAJCWlmIChldmVudHMgJiBJRVZFTlRfWEZVTikgewotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5kZXJydW4uICBwYWNrZXQgZHJvcHBlZC5cbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKLSNlbmRpZgorCQkJaWYgKG5ldGlmX21zZ190eF9lcnIocHJpdikpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB1bmRlcnJ1bi4gIHBhY2tldCBkcm9wcGVkLlxuIiwKKwkJCQkJCWRldi0+bmFtZSk7CiAJCQlwcml2LT5zdGF0cy50eF9kcm9wcGVkKys7CiAJCQlwcml2LT5leHRyYV9zdGF0cy50eF91bmRlcnJ1bisrOwogCiAJCQkvKiBSZWFjdGl2YXRlIHRoZSBUeCBRdWV1ZXMgKi8KIAkJCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPnRzdGF0LCBUU1RBVF9DTEVBUl9USEFMVCk7CiAJCX0KLSNpZmRlZiBWRVJCT1NFX0dGQVJfRVJST1JTCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczogVHJhbnNtaXQgRXJyb3JcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ190eF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFRyYW5zbWl0IEVycm9yXG4iLCBkZXYtPm5hbWUpOwogCX0KIAlpZiAoZXZlbnRzICYgSUVWRU5UX0JTWSkgewogCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKQEAgLTE3OTMsMzUgKzIwODMsMzEgQEAKIAkJZ2Zhcl93cml0ZSgmcHJpdi0+cmVncy0+cnN0YXQsIFJTVEFUX0NMRUFSX1JIQUxUKTsKICNlbmRpZgogCi0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1c3kgZXJyb3IgKHJoYWx0OiAleClcbiIsIGRldi0+bmFtZSwKLQkJICAgICAgIGdmYXJfcmVhZCgmcHJpdi0+cmVncy0+cnN0YXQpKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzeSBlcnJvciAocmhhbHQ6ICV4KVxuIiwKKwkJCQkJZGV2LT5uYW1lLAorCQkJCQlnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPnJzdGF0KSk7CiAJfQogCWlmIChldmVudHMgJiBJRVZFTlRfQkFCUikgewogCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJcHJpdi0+ZXh0cmFfc3RhdHMucnhfYmFicisrOwogCi0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYmJsaW5nIGVycm9yXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisJCWlmIChuZXRpZl9tc2dfcnhfZXJyKHByaXYpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBiYWJibGluZyBlcnJvclxuIiwgZGV2LT5uYW1lKTsKIAl9CiAJaWYgKGV2ZW50cyAmIElFVkVOVF9FQkVSUikgewogCQlwcml2LT5leHRyYV9zdGF0cy5lYmVycisrOwotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBFQkVSUlxuIiwgZGV2LT5uYW1lKTsKLSNlbmRpZgorCQlpZiAobmV0aWZfbXNnX3J4X2Vycihwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogRUJFUlJcbiIsIGRldi0+bmFtZSk7CiAJfQotCWlmIChldmVudHMgJiBJRVZFTlRfUlhDKQotI2lmZGVmIFZFUkJPU0VfR0ZBUl9FUlJPUlMKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBjb250cm9sIGZyYW1lXG4iLCBkZXYtPm5hbWUpOwotI2VuZGlmCisJaWYgKChldmVudHMgJiBJRVZFTlRfUlhDKSAmJiBuZXRpZl9tc2dfcnhfc3RhdHVzKHByaXYpKQorCQlpZiAobmV0aWZfbXNnX3J4X3N0YXR1cyhwcml2KSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogY29udHJvbCBmcmFtZVxuIiwgZGV2LT5uYW1lKTsKIAogCWlmIChldmVudHMgJiBJRVZFTlRfQkFCVCkgewogCQlwcml2LT5leHRyYV9zdGF0cy50eF9iYWJ0Kys7Ci0jaWZkZWYgVkVSQk9TRV9HRkFSX0VSUk9SUwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYnQgZXJyb3JcbiIsIGRldi0+bmFtZSk7Ci0jZW5kaWYKKwkJaWYgKG5ldGlmX21zZ190eF9lcnIocHJpdikpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJhYnQgZXJyb3JcbiIsIGRldi0+bmFtZSk7CiAJfQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2dpYW5mYXIuaCBiL2RyaXZlcnMvbmV0L2dpYW5mYXIuaAppbmRleCBjMmY3ODNhLi4yOGFmMDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9naWFuZmFyLmgKKysrIGIvZHJpdmVycy9uZXQvZ2lhbmZhci5oCkBAIC0xLDQgKzEsNCBAQAotLyogCisvKgogICogZHJpdmVycy9uZXQvZ2lhbmZhci5oCiAgKgogICogR2lhbmZhciBFdGhlcm5ldCBEcml2ZXIKQEAgLTUzLDYgKzUzLDEyIEBACiAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBiZSBoYW5kbGVkIGluIG9uZSBjYWxsIG9mIGdmYXJfcG9sbCAqLwogI2RlZmluZSBHRkFSX0RFVl9XRUlHSFQgNjQKIAorLyogTGVuZ3RoIGZvciBGQ0IgKi8KKyNkZWZpbmUgR01BQ19GQ0JfTEVOIDgKKworLyogRGVmYXVsdCBwYWRkaW5nIGFtb3VudCAqLworI2RlZmluZSBERUZBVUxUX1BBRERJTkcgMgorCiAvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gYWxpZ24gdGhlIHJ4IGJ1ZnMgdG8gKi8KICNkZWZpbmUgUlhCVUZfQUxJR05NRU5UIDY0CiAKQEAgLTkxLDcgKzk3LDcgQEAKICNkZWZpbmUgSlVNQk9fRlJBTUVfU0laRSA5NjAwCiAKIC8qIExhdGVuY3kgb2YgaW50ZXJmYWNlIGNsb2NrIGluIG5hbm9zZWNvbmRzICovCi0vKiBJbnRlcmZhY2UgY2xvY2sgbGF0ZW5jeSAsIGluIHRoaXMgY2FzZSwgbWVhbnMgdGhlIAorLyogSW50ZXJmYWNlIGNsb2NrIGxhdGVuY3kgLCBpbiB0aGlzIGNhc2UsIG1lYW5zIHRoZQogICogdGltZSBkZXNjcmliZWQgYnkgYSB2YWx1ZSBvZiAxIGluIHRoZSBpbnRlcnJ1cHQKICAqIGNvYWxlc2NpbmcgcmVnaXN0ZXJzJyB0aW1lIGZpZWxkcy4gIFNpbmNlIHRob3NlIGZpZWxkcwogICogcmVmZXIgdG8gdGhlIHRpbWUgaXQgdGFrZXMgZm9yIDY0IGNsb2NrcyB0byBwYXNzLCB0aGUKQEAgLTE2Niw5ICsxNzIsMjggQEAKIAkJCQlta19pY19pY2Z0KGNvdW50KSB8IFwKIAkJCQlta19pY19pY3R0KHRpbWUpKQogCisjZGVmaW5lIFJDVFJMX1BBTF9NQVNLCQkweDAwMWYwMDAwCisjZGVmaW5lIFJDVFJMX1ZMRVgJCTB4MDAwMDIwMDAKKyNkZWZpbmUgUkNUUkxfRklMUkVOCQkweDAwMDAxMDAwCisjZGVmaW5lIFJDVFJMX0dIVFgJCTB4MDAwMDA0MDAKKyNkZWZpbmUgUkNUUkxfSVBDU0VOCQkweDAwMDAwMjAwCisjZGVmaW5lIFJDVFJMX1RVQ1NFTgkJMHgwMDAwMDEwMAorI2RlZmluZSBSQ1RSTF9QUlNERVBfTUFTSwkweDAwMDAwMGMwCisjZGVmaW5lIFJDVFJMX1BSU0RFUF9JTklUCTB4MDAwMDAwYzAKICNkZWZpbmUgUkNUUkxfUFJPTQkJMHgwMDAwMDAwOAorI2RlZmluZSBSQ1RSTF9DSEVDS1NVTU1JTkcJKFJDVFJMX0lQQ1NFTiBcCisJCXwgUkNUUkxfVFVDU0VOIHwgUkNUUkxfUFJTREVQX0lOSVQpCisjZGVmaW5lIFJDVFJMX0VYVEhBU0gJCShSQ1RSTF9HSFRYKQorI2RlZmluZSBSQ1RSTF9WTEFOCQkoUkNUUkxfUFJTREVQX0lOSVQpCisKKwogI2RlZmluZSBSU1RBVF9DTEVBUl9SSEFMVCAgICAgICAweDAwODAwMDAwCiAKKyNkZWZpbmUgVENUUkxfSVBDU0VOCQkweDAwMDA0MDAwCisjZGVmaW5lIFRDVFJMX1RVQ1NFTgkJMHgwMDAwMjAwMAorI2RlZmluZSBUQ1RSTF9WTElOUwkJMHgwMDAwMTAwMAorI2RlZmluZSBUQ1RSTF9JTklUX0NTVU0JCShUQ1RSTF9UVUNTRU4gfCBUQ1RSTF9JUENTRU4pCisKICNkZWZpbmUgSUVWRU5UX0lOSVRfQ0xFQVIJMHhmZmZmZmZmZgogI2RlZmluZSBJRVZFTlRfQkFCUgkJMHg4MDAwMDAwMAogI2RlZmluZSBJRVZFTlRfUlhDCQkweDQwMDAwMDAwCkBAIC0xODcsMTIgKzIxMiwxNiBAQAogI2RlZmluZSBJRVZFTlRfUlhCMAkJMHgwMDAwODAwMAogI2RlZmluZSBJRVZFTlRfR1JTQwkJMHgwMDAwMDEwMAogI2RlZmluZSBJRVZFTlRfUlhGMAkJMHgwMDAwMDA4MAorI2RlZmluZSBJRVZFTlRfRklSCQkweDAwMDAwMDA4CisjZGVmaW5lIElFVkVOVF9GSVEJCTB4MDAwMDAwMDQKKyNkZWZpbmUgSUVWRU5UX0RQRQkJMHgwMDAwMDAwMgorI2RlZmluZSBJRVZFTlRfUEVSUgkJMHgwMDAwMDAwMQogI2RlZmluZSBJRVZFTlRfUlhfTUFTSyAgICAgICAgICAoSUVWRU5UX1JYQjAgfCBJRVZFTlRfUlhGMCkKICNkZWZpbmUgSUVWRU5UX1RYX01BU0sgICAgICAgICAgKElFVkVOVF9UWEIgfCBJRVZFTlRfVFhGKQogI2RlZmluZSBJRVZFTlRfRVJSX01BU0sgICAgICAgICBcCiAoSUVWRU5UX1JYQyB8IElFVkVOVF9CU1kgfCBJRVZFTlRfRUJFUlIgfCBJRVZFTlRfTVNSTyB8IFwKICBJRVZFTlRfQkFCVCB8IElFVkVOVF9UWEMgfCBJRVZFTlRfVFhFIHwgSUVWRU5UX0xDIFwKLSB8IElFVkVOVF9DUkwgfCBJRVZFTlRfWEZVTikKKyB8IElFVkVOVF9DUkwgfCBJRVZFTlRfWEZVTiB8IElFVkVOVF9EUEUgfCBJRVZFTlRfUEVSUikKIAogI2RlZmluZSBJTUFTS19JTklUX0NMRUFSCTB4MDAwMDAwMDAKICNkZWZpbmUgSU1BU0tfQkFCUiAgICAgICAgICAgICAgMHg4MDAwMDAwMApAQCAtMjEyLDEwICsyNDEsMTUgQEAKICNkZWZpbmUgSU1BU0tfUlhCMCAgICAgICAgICAgICAgMHgwMDAwODAwMAogI2RlZmluZSBJTUFTS19HVFNDICAgICAgICAgICAgICAweDAwMDAwMTAwCiAjZGVmaW5lIElNQVNLX1JYRkVOMAkJMHgwMDAwMDA4MAorI2RlZmluZSBJTUFTS19GSVIJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSU1BU0tfRklRCQkweDAwMDAwMDA0CisjZGVmaW5lIElNQVNLX0RQRQkJMHgwMDAwMDAwMgorI2RlZmluZSBJTUFTS19QRVJSCQkweDAwMDAwMDAxCiAjZGVmaW5lIElNQVNLX1JYX0RJU0FCTEVEIH4oSU1BU0tfUlhGRU4wIHwgSU1BU0tfQlNZKQogI2RlZmluZSBJTUFTS19ERUZBVUxUICAoSU1BU0tfVFhFRU4gfCBJTUFTS19UWEZFTiB8IElNQVNLX1RYQkVOIHwgXAogCQlJTUFTS19SWEZFTjAgfCBJTUFTS19CU1kgfCBJTUFTS19FQkVSUiB8IElNQVNLX0JBQlIgfCBcCi0JCUlNQVNLX1hGVU4gfCBJTUFTS19SWEMgfCBJTUFTS19CQUJUKQorCQlJTUFTS19YRlVOIHwgSU1BU0tfUlhDIHwgSU1BU0tfQkFCVCB8IElNQVNLX0RQRSBcCisJCXwgSU1BU0tfUEVSUikKIAogCiAvKiBBdHRyaWJ1dGUgZmllbGRzICovCkBAIC0yNTQsNiArMjg4LDE4IEBACiAjZGVmaW5lIFRYQkRfUkVUUllMSU1JVAkJMHgwMDQwCiAjZGVmaW5lCVRYQkRfUkVUUllDT1VOVE1BU0sJMHgwMDNjCiAjZGVmaW5lIFRYQkRfVU5ERVJSVU4JCTB4MDAwMgorI2RlZmluZSBUWEJEX1RPRQkJMHgwMDAyCisKKy8qIFR4IEZDQiBwYXJhbSBiaXRzICovCisjZGVmaW5lIFRYRkNCX1ZMTgkJMHg4MAorI2RlZmluZSBUWEZDQl9JUAkJMHg0MAorI2RlZmluZSBUWEZDQl9JUDYJCTB4MjAKKyNkZWZpbmUgVFhGQ0JfVFVQCQkweDEwCisjZGVmaW5lIFRYRkNCX1VEUAkJMHgwOAorI2RlZmluZSBUWEZDQl9DSVAJCTB4MDQKKyNkZWZpbmUgVFhGQ0JfQ1RVCQkweDAyCisjZGVmaW5lIFRYRkNCX05QSAkJMHgwMQorI2RlZmluZSBUWEZDQl9ERUZBVUxUIAkJKFRYRkNCX0lQfFRYRkNCX1RVUHxUWEZDQl9DVFV8VFhGQ0JfTlBIKQogCiAvKiBSeEJEIHN0YXR1cyBmaWVsZCBiaXRzICovCiAjZGVmaW5lIFJYQkRfRU1QVFkJCTB4ODAwMApAQCAtMjczLDYgKzMxOSwxOCBAQAogI2RlZmluZSBSWEJEX1RSVU5DQVRFRAkJMHgwMDAxCiAjZGVmaW5lIFJYQkRfU1RBVFMJCTB4MDFmZgogCisvKiBSeCBGQ0Igc3RhdHVzIGZpZWxkIGJpdHMgKi8KKyNkZWZpbmUgUlhGQ0JfVkxOCQkweDgwMDAKKyNkZWZpbmUgUlhGQ0JfSVAJCTB4NDAwMAorI2RlZmluZSBSWEZDQl9JUDYJCTB4MjAwMAorI2RlZmluZSBSWEZDQl9UVVAJCTB4MTAwMAorI2RlZmluZSBSWEZDQl9DSVAJCTB4MDgwMAorI2RlZmluZSBSWEZDQl9DVFUJCTB4MDQwMAorI2RlZmluZSBSWEZDQl9FSVAJCTB4MDIwMAorI2RlZmluZSBSWEZDQl9FVFUJCTB4MDEwMAorI2RlZmluZSBSWEZDQl9QRVJSX01BU0sJCTB4MDAwYworI2RlZmluZSBSWEZDQl9QRVJSX0JBREwzCTB4MDAwOAorCiBzdHJ1Y3QgdHhiZDgKIHsKIAl1MTYJc3RhdHVzOwkvKiBTdGF0dXMgRmllbGRzICovCkBAIC0yODAsNiArMzM4LDIyIEBACiAJdTMyCWJ1ZlB0cjsJLyogQnVmZmVyIFBvaW50ZXIgKi8KIH07CiAKK3N0cnVjdCB0eGZjYiB7CisJdTgJdmxuOjEsCisJCWlwOjEsCisJCWlwNjoxLAorCQl0dXA6MSwKKwkJdWRwOjEsCisJCWNpcDoxLAorCQljdHU6MSwKKwkJbnBoOjE7CisJdTgJcmVzZXJ2ZWQ7CisJdTgJbDRvczsJLyogTGV2ZWwgNCBIZWFkZXIgT2Zmc2V0ICovCisJdTgJbDNvczsgCS8qIExldmVsIDMgSGVhZGVyIE9mZnNldCAqLworCXUxNglwaGNzOwkvKiBQc2V1ZG8taGVhZGVyIENoZWNrc3VtICovCisJdTE2CXZsY3RsOwkvKiBWTEFOIGNvbnRyb2wgd29yZCAqLworfTsKKwogc3RydWN0IHJ4YmQ4CiB7CiAJdTE2CXN0YXR1czsJLyogU3RhdHVzIEZpZWxkcyAqLwpAQCAtMjg3LDYgKzM2MSwyMSBAQAogCXUzMglidWZQdHI7CS8qIEJ1ZmZlciBQb2ludGVyICovCiB9OwogCitzdHJ1Y3QgcnhmY2IgeworCXUxNgl2bG46MSwKKwkJaXA6MSwKKwkJaXA2OjEsCisJCXR1cDoxLAorCQljaXA6MSwKKwkJY3R1OjEsCisJCWVpcDoxLAorCQlldHU6MTsKKwl1OAlycTsJLyogUmVjZWl2ZSBRdWV1ZSBpbmRleCAqLworCXU4CXBybzsJLyogTGF5ZXIgNCBQcm90b2NvbCAqLworCXUxNglyZXNlcnZlZDsKKwl1MTYJdmxjdGw7CS8qIFZMQU4gY29udHJvbCB3b3JkICovCit9OworCiBzdHJ1Y3Qgcm1vbl9taWIKIHsKIAl1MzIJdHI2NDsJLyogMHguNjgwIC0gVHJhbnNtaXQgYW5kIFJlY2VpdmUgNjQtYnl0ZSBGcmFtZSBDb3VudGVyICovCkBAIC0zNzEsOTAgKzQ2MCwxOTEgQEAKIAogCiBzdHJ1Y3QgZ2ZhciB7Ci0JdTgJcmVzMVsxNl07Ci0JdTMyCWlldmVudDsJCQkvKiAweC4wMTAgLSBJbnRlcnJ1cHQgRXZlbnQgUmVnaXN0ZXIgKi8KLQl1MzIJaW1hc2s7CQkJLyogMHguMDE0IC0gSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLQl1MzIJZWRpczsJCQkvKiAweC4wMTggLSBFcnJvciBEaXNhYmxlZCBSZWdpc3RlciAqLworCXUzMgl0c2VjX2lkOwkvKiAweC4wMDAgLSBDb250cm9sbGVyIElEIHJlZ2lzdGVyICovCisJdTgJcmVzMVsxMl07CisJdTMyCWlldmVudDsJCS8qIDB4LjAxMCAtIEludGVycnVwdCBFdmVudCBSZWdpc3RlciAqLworCXUzMglpbWFzazsJCS8qIDB4LjAxNCAtIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisJdTMyCWVkaXM7CQkvKiAweC4wMTggLSBFcnJvciBEaXNhYmxlZCBSZWdpc3RlciAqLwogCXU4CXJlczJbNF07Ci0JdTMyCWVjbnRybDsJCQkvKiAweC4wMjAgLSBFdGhlcm5ldCBDb250cm9sIFJlZ2lzdGVyICovCi0JdTMyCW1pbmZscjsJCQkvKiAweC4wMjQgLSBNaW5pbXVtIEZyYW1lIExlbmd0aCBSZWdpc3RlciAqLwotCXUzMglwdHY7CQkJLyogMHguMDI4IC0gUGF1c2UgVGltZSBWYWx1ZSBSZWdpc3RlciAqLwotCXUzMglkbWFjdHJsOwkJLyogMHguMDJjIC0gRE1BIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQl1MzIJdGJpcGE7CQkJLyogMHguMDMwIC0gVEJJIFBIWSBBZGRyZXNzIFJlZ2lzdGVyICovCisJdTMyCWVjbnRybDsJCS8qIDB4LjAyMCAtIEV0aGVybmV0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1MzIJbWluZmxyOwkJLyogMHguMDI0IC0gTWluaW11bSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1MzIJcHR2OwkJLyogMHguMDI4IC0gUGF1c2UgVGltZSBWYWx1ZSBSZWdpc3RlciAqLworCXUzMglkbWFjdHJsOwkvKiAweC4wMmMgLSBETUEgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgl0YmlwYTsJCS8qIDB4LjAzMCAtIFRCSSBQSFkgQWRkcmVzcyBSZWdpc3RlciAqLwogCXU4CXJlczNbODhdOwotCXUzMglmaWZvX3R4X3RocjsJCS8qIDB4LjA4YyAtIEZJRk8gdHJhbnNtaXQgdGhyZXNob2xkIHJlZ2lzdGVyICovCisJdTMyCWZpZm9fdHhfdGhyOwkvKiAweC4wOGMgLSBGSUZPIHRyYW5zbWl0IHRocmVzaG9sZCByZWdpc3RlciAqLwogCXU4CXJlczRbOF07Ci0JdTMyCWZpZm9fdHhfc3RhcnZlOwkJLyogMHguMDk4IC0gRklGTyB0cmFuc21pdCBzdGFydmUgcmVnaXN0ZXIgKi8KKwl1MzIJZmlmb190eF9zdGFydmU7CS8qIDB4LjA5OCAtIEZJRk8gdHJhbnNtaXQgc3RhcnZlIHJlZ2lzdGVyICovCiAJdTMyCWZpZm9fdHhfc3RhcnZlX3NodXRvZmY7CS8qIDB4LjA5YyAtIEZJRk8gdHJhbnNtaXQgc3RhcnZlIHNodXRvZmYgcmVnaXN0ZXIgKi8KLQl1OAlyZXM1Wzk2XTsKLQl1MzIJdGN0cmw7CQkJLyogMHguMTAwIC0gVHJhbnNtaXQgQ29udHJvbCBSZWdpc3RlciAqLwotCXUzMgl0c3RhdDsJCQkvKiAweC4xMDQgLSBUcmFuc21pdCBTdGF0dXMgUmVnaXN0ZXIgKi8KLQl1OAlyZXM2WzRdOwotCXUzMgl0YmRsZW47CQkJLyogMHguMTBjIC0gVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KLQl1MzIJdHhpYzsJCQkvKiAweC4xMTAgLSBUcmFuc21pdCBJbnRlcnJ1cHQgQ29hbGVzY2luZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0JdTgJcmVzN1sxNl07Ci0JdTMyCWN0YnB0cjsJCQkvKiAweC4xMjQgLSBDdXJyZW50IFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIFBvaW50ZXIgUmVnaXN0ZXIgKi8KLQl1OAlyZXM4WzkyXTsKLQl1MzIJdGJwdHI7CQkJLyogMHguMTg0IC0gVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgUG9pbnRlciBMb3cgUmVnaXN0ZXIgKi8KLQl1OAlyZXM5WzEyNF07Ci0JdTMyCXRiYXNlOwkJCS8qIDB4LjIwNCAtIFRyYW5zbWl0IERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0JdTgJcmVzMTBbMTY4XTsKLQl1MzIJb3N0YmQ7CQkJLyogMHguMmIwIC0gT3V0LW9mLVNlcXVlbmNlIFRyYW5zbWl0IEJ1ZmZlciBEZXNjcmlwdG9yIFJlZ2lzdGVyICovCi0JdTMyCW9zdGJkcDsJCQkvKiAweC4yYjQgLSBPdXQtb2YtU2VxdWVuY2UgVHJhbnNtaXQgRGF0YSBCdWZmZXIgUG9pbnRlciBSZWdpc3RlciAqLwotCXU4CXJlczExWzcyXTsKLQl1MzIJcmN0cmw7CQkJLyogMHguMzAwIC0gUmVjZWl2ZSBDb250cm9sIFJlZ2lzdGVyICovCi0JdTMyCXJzdGF0OwkJCS8qIDB4LjMwNCAtIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyICovCi0JdTgJcmVzMTJbNF07Ci0JdTMyCXJiZGxlbjsJCQkvKiAweC4zMGMgLSBSeEJEIERhdGEgTGVuZ3RoIFJlZ2lzdGVyICovCi0JdTMyCXJ4aWM7CQkJLyogMHguMzEwIC0gUmVjZWl2ZSBJbnRlcnJ1cHQgQ29hbGVzY2luZyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0JdTgJcmVzMTNbMTZdOwotCXUzMgljcmJwdHI7CQkJLyogMHguMzI0IC0gQ3VycmVudCBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KLQl1OAlyZXMxNFsyNF07Ci0JdTMyCW1yYmxyOwkJCS8qIDB4LjM0MCAtIE1heGltdW0gUmVjZWl2ZSBCdWZmZXIgTGVuZ3RoIFJlZ2lzdGVyICovCi0JdTgJcmVzMTVbNjRdOwotCXUzMglyYnB0cjsJCQkvKiAweC4zODQgLSBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KLQl1OAlyZXMxNlsxMjRdOwotCXUzMglyYmFzZTsJCQkvKiAweC40MDQgLSBSZWNlaXZlIERlc2NyaXB0b3IgQmFzZSBBZGRyZXNzICovCi0JdTgJcmVzMTdbMjQ4XTsKLQl1MzIJbWFjY2ZnMTsJCS8qIDB4LjUwMCAtIE1BQyBDb25maWd1cmF0aW9uIDEgUmVnaXN0ZXIgKi8KLQl1MzIJbWFjY2ZnMjsJCS8qIDB4LjUwNCAtIE1BQyBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KLQl1MzIJaXBnaWZnOwkJCS8qIDB4LjUwOCAtIEludGVyIFBhY2tldCBHYXAvSW50ZXIgRnJhbWUgR2FwIFJlZ2lzdGVyICovCi0JdTMyCWhhZmR1cDsJCQkvKiAweC41MGMgLSBIYWxmIER1cGxleCBSZWdpc3RlciAqLwotCXUzMgltYXhmcm07CQkJLyogMHguNTEwIC0gTWF4aW11bSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1OAlyZXM1WzRdOworCXUzMglmaWZvX3J4X3BhdXNlOwkvKiAweC4wYTQgLSBGSUZPIHJlY2VpdmUgcGF1c2UgdGhyZXNob2xkIHJlZ2lzdGVyICovCisJdTMyCWZpZm9fcnhfYWxhcm07CS8qIDB4LjBhOCAtIEZJRk8gcmVjZWl2ZSBhbGFybSB0aHJlc2hvbGQgcmVnaXN0ZXIgKi8KKwl1OAlyZXM2Wzg0XTsKKwl1MzIJdGN0cmw7CQkvKiAweC4xMDAgLSBUcmFuc21pdCBDb250cm9sIFJlZ2lzdGVyICovCisJdTMyCXRzdGF0OwkJLyogMHguMTA0IC0gVHJhbnNtaXQgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCWRmdmxhbjsJCS8qIDB4LjEwOCAtIERlZmF1bHQgVkxBTiBDb250cm9sIHdvcmQgKi8KKwl1MzIJdGJkbGVuOwkJLyogMHguMTBjIC0gVHJhbnNtaXQgQnVmZmVyIERlc2NyaXB0b3IgRGF0YSBMZW5ndGggUmVnaXN0ZXIgKi8KKwl1MzIJdHhpYzsJCS8qIDB4LjExMCAtIFRyYW5zbWl0IEludGVycnVwdCBDb2FsZXNjaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIJdHF1ZXVlOwkJLyogMHguMTE0IC0gVHJhbnNtaXQgcXVldWUgY29udHJvbCByZWdpc3RlciAqLworCXU4CXJlczdbNDBdOworCXUzMgl0cjAzd3Q7CQkvKiAweC4xNDAgLSBUeEJEIFJpbmdzIDAtMyByb3VuZC1yb2JpbiB3ZWlnaHRpbmdzICovCisJdTMyCXRyNDd3dDsJCS8qIDB4LjE0NCAtIFR4QkQgUmluZ3MgNC03IHJvdW5kLXJvYmluIHdlaWdodGluZ3MgKi8KKwl1OAlyZXM4WzUyXTsKKwl1MzIJdGJkYnBoOwkJLyogMHguMTdjIC0gVHggZGF0YSBidWZmZXIgcG9pbnRlciBoaWdoICovCisJdTgJcmVzOWFbNF07CisJdTMyCXRicHRyMDsJCS8qIDB4LjE4NCAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyAwICovCisJdTgJcmVzOWJbNF07CisJdTMyCXRicHRyMTsJCS8qIDB4LjE4YyAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyAxICovCisJdTgJcmVzOWNbNF07CisJdTMyCXRicHRyMjsJCS8qIDB4LjE5NCAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyAyICovCisJdTgJcmVzOWRbNF07CisJdTMyCXRicHRyMzsJCS8qIDB4LjE5YyAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyAzICovCisJdTgJcmVzOWVbNF07CisJdTMyCXRicHRyNDsJCS8qIDB4LjFhNCAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyA0ICovCisJdTgJcmVzOWZbNF07CisJdTMyCXRicHRyNTsJCS8qIDB4LjFhYyAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyA1ICovCisJdTgJcmVzOWdbNF07CisJdTMyCXRicHRyNjsJCS8qIDB4LjFiNCAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyA2ICovCisJdTgJcmVzOWhbNF07CisJdTMyCXRicHRyNzsJCS8qIDB4LjFiYyAtIFR4QkQgUG9pbnRlciBmb3IgcmluZyA3ICovCisJdTgJcmVzOVs2NF07CisJdTMyCXRiYXNlaDsJCS8qIDB4LjIwMCAtIFR4QkQgYmFzZSBhZGRyZXNzIGhpZ2ggKi8KKwl1MzIJdGJhc2UwOwkJLyogMHguMjA0IC0gVHhCRCBCYXNlIEFkZHJlc3Mgb2YgcmluZyAwICovCisJdTgJcmVzMTBhWzRdOworCXUzMgl0YmFzZTE7CQkvKiAweC4yMGMgLSBUeEJEIEJhc2UgQWRkcmVzcyBvZiByaW5nIDEgKi8KKwl1OAlyZXMxMGJbNF07CisJdTMyCXRiYXNlMjsJCS8qIDB4LjIxNCAtIFR4QkQgQmFzZSBBZGRyZXNzIG9mIHJpbmcgMiAqLworCXU4CXJlczEwY1s0XTsKKwl1MzIJdGJhc2UzOwkJLyogMHguMjFjIC0gVHhCRCBCYXNlIEFkZHJlc3Mgb2YgcmluZyAzICovCisJdTgJcmVzMTBkWzRdOworCXUzMgl0YmFzZTQ7CQkvKiAweC4yMjQgLSBUeEJEIEJhc2UgQWRkcmVzcyBvZiByaW5nIDQgKi8KKwl1OAlyZXMxMGVbNF07CisJdTMyCXRiYXNlNTsJCS8qIDB4LjIyYyAtIFR4QkQgQmFzZSBBZGRyZXNzIG9mIHJpbmcgNSAqLworCXU4CXJlczEwZls0XTsKKwl1MzIJdGJhc2U2OwkJLyogMHguMjM0IC0gVHhCRCBCYXNlIEFkZHJlc3Mgb2YgcmluZyA2ICovCisJdTgJcmVzMTBnWzRdOworCXUzMgl0YmFzZTc7CQkvKiAweC4yM2MgLSBUeEJEIEJhc2UgQWRkcmVzcyBvZiByaW5nIDcgKi8KKwl1OAlyZXMxMFsxOTJdOworCXUzMglyY3RybDsJCS8qIDB4LjMwMCAtIFJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMglyc3RhdDsJCS8qIDB4LjMwNCAtIFJlY2VpdmUgU3RhdHVzIFJlZ2lzdGVyICovCisJdTgJcmVzMTJbOF07CisJdTMyCXJ4aWM7CQkvKiAweC4zMTAgLSBSZWNlaXZlIEludGVycnVwdCBDb2FsZXNjaW5nIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwl1MzIJcnF1ZXVlOwkJLyogMHguMzE0IC0gUmVjZWl2ZSBxdWV1ZSBjb250cm9sIHJlZ2lzdGVyICovCisJdTgJcmVzMTNbMjRdOworCXUzMglyYmlmeDsJCS8qIDB4LjMzMCAtIFJlY2VpdmUgYml0IGZpZWxkIGV4dHJhY3QgY29udHJvbCByZWdpc3RlciAqLworCXUzMglycWZhcjsJCS8qIDB4LjMzNCAtIFJlY2VpdmUgcXVldWUgZmlsaW5nIHRhYmxlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwl1MzIJcnFmY3I7CQkvKiAweC4zMzggLSBSZWNlaXZlIHF1ZXVlIGZpbGluZyB0YWJsZSBjb250cm9sIHJlZ2lzdGVyICovCisJdTMyCXJxZnByOwkJLyogMHguMzNjIC0gUmVjZWl2ZSBxdWV1ZSBmaWxpbmcgdGFibGUgcHJvcGVydHkgcmVnaXN0ZXIgKi8KKwl1MzIJbXJibHI7CQkvKiAweC4zNDAgLSBNYXhpbXVtIFJlY2VpdmUgQnVmZmVyIExlbmd0aCBSZWdpc3RlciAqLworCXU4CXJlczE0WzU2XTsKKwl1MzIJcmJkYnBoOwkJLyogMHguMzdjIC0gUnggZGF0YSBidWZmZXIgcG9pbnRlciBoaWdoICovCisJdTgJcmVzMTVhWzRdOworCXUzMglyYnB0cjA7CQkvKiAweC4zODQgLSBSeEJEIHBvaW50ZXIgZm9yIHJpbmcgMCAqLworCXU4CXJlczE1Yls0XTsKKwl1MzIJcmJwdHIxOwkJLyogMHguMzhjIC0gUnhCRCBwb2ludGVyIGZvciByaW5nIDEgKi8KKwl1OAlyZXMxNWNbNF07CisJdTMyCXJicHRyMjsJCS8qIDB4LjM5NCAtIFJ4QkQgcG9pbnRlciBmb3IgcmluZyAyICovCisJdTgJcmVzMTVkWzRdOworCXUzMglyYnB0cjM7CQkvKiAweC4zOWMgLSBSeEJEIHBvaW50ZXIgZm9yIHJpbmcgMyAqLworCXU4CXJlczE1ZVs0XTsKKwl1MzIJcmJwdHI0OwkJLyogMHguM2E0IC0gUnhCRCBwb2ludGVyIGZvciByaW5nIDQgKi8KKwl1OAlyZXMxNWZbNF07CisJdTMyCXJicHRyNTsJCS8qIDB4LjNhYyAtIFJ4QkQgcG9pbnRlciBmb3IgcmluZyA1ICovCisJdTgJcmVzMTVnWzRdOworCXUzMglyYnB0cjY7CQkvKiAweC4zYjQgLSBSeEJEIHBvaW50ZXIgZm9yIHJpbmcgNiAqLworCXU4CXJlczE1aFs0XTsKKwl1MzIJcmJwdHI3OwkJLyogMHguM2JjIC0gUnhCRCBwb2ludGVyIGZvciByaW5nIDcgKi8KKwl1OAlyZXMxNls2NF07CisJdTMyCXJiYXNlaDsJCS8qIDB4LjQwMCAtIFJ4QkQgYmFzZSBhZGRyZXNzIGhpZ2ggKi8KKwl1MzIJcmJhc2UwOwkJLyogMHguNDA0IC0gUnhCRCBiYXNlIGFkZHJlc3Mgb2YgcmluZyAwICovCisJdTgJcmVzMTdhWzRdOworCXUzMglyYmFzZTE7CQkvKiAweC40MGMgLSBSeEJEIGJhc2UgYWRkcmVzcyBvZiByaW5nIDEgKi8KKwl1OAlyZXMxN2JbNF07CisJdTMyCXJiYXNlMjsJCS8qIDB4LjQxNCAtIFJ4QkQgYmFzZSBhZGRyZXNzIG9mIHJpbmcgMiAqLworCXU4CXJlczE3Y1s0XTsKKwl1MzIJcmJhc2UzOwkJLyogMHguNDFjIC0gUnhCRCBiYXNlIGFkZHJlc3Mgb2YgcmluZyAzICovCisJdTgJcmVzMTdkWzRdOworCXUzMglyYmFzZTQ7CQkvKiAweC40MjQgLSBSeEJEIGJhc2UgYWRkcmVzcyBvZiByaW5nIDQgKi8KKwl1OAlyZXMxN2VbNF07CisJdTMyCXJiYXNlNTsJCS8qIDB4LjQyYyAtIFJ4QkQgYmFzZSBhZGRyZXNzIG9mIHJpbmcgNSAqLworCXU4CXJlczE3Zls0XTsKKwl1MzIJcmJhc2U2OwkJLyogMHguNDM0IC0gUnhCRCBiYXNlIGFkZHJlc3Mgb2YgcmluZyA2ICovCisJdTgJcmVzMTdnWzRdOworCXUzMglyYmFzZTc7CQkvKiAweC40M2MgLSBSeEJEIGJhc2UgYWRkcmVzcyBvZiByaW5nIDcgKi8KKwl1OAlyZXMxN1sxOTJdOworCXUzMgltYWNjZmcxOwkvKiAweC41MDAgLSBNQUMgQ29uZmlndXJhdGlvbiAxIFJlZ2lzdGVyICovCisJdTMyCW1hY2NmZzI7CS8qIDB4LjUwNCAtIE1BQyBDb25maWd1cmF0aW9uIDIgUmVnaXN0ZXIgKi8KKwl1MzIJaXBnaWZnOwkJLyogMHguNTA4IC0gSW50ZXIgUGFja2V0IEdhcC9JbnRlciBGcmFtZSBHYXAgUmVnaXN0ZXIgKi8KKwl1MzIJaGFmZHVwOwkJLyogMHguNTBjIC0gSGFsZiBEdXBsZXggUmVnaXN0ZXIgKi8KKwl1MzIJbWF4ZnJtOwkJLyogMHguNTEwIC0gTWF4aW11bSBGcmFtZSBMZW5ndGggUmVnaXN0ZXIgKi8KIAl1OAlyZXMxOFsxMl07Ci0JdTMyCW1paW1jZmc7CQkvKiAweC41MjAgLSBNSUkgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0JdTMyCW1paW1jb207CQkvKiAweC41MjQgLSBNSUkgTWFuYWdlbWVudCBDb21tYW5kIFJlZ2lzdGVyICovCi0JdTMyCW1paW1hZGQ7CQkvKiAweC41MjggLSBNSUkgTWFuYWdlbWVudCBBZGRyZXNzIFJlZ2lzdGVyICovCi0JdTMyCW1paW1jb247CQkvKiAweC41MmMgLSBNSUkgTWFuYWdlbWVudCBDb250cm9sIFJlZ2lzdGVyICovCi0JdTMyCW1paW1zdGF0OwkJLyogMHguNTMwIC0gTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyICovCi0JdTMyCW1paW1pbmQ7CQkvKiAweC41MzQgLSBNSUkgTWFuYWdlbWVudCBJbmRpY2F0b3IgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWNmZzsJLyogMHguNTIwIC0gTUlJIE1hbmFnZW1lbnQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCXUzMgltaWltY29tOwkvKiAweC41MjQgLSBNSUkgTWFuYWdlbWVudCBDb21tYW5kIFJlZ2lzdGVyICovCisJdTMyCW1paW1hZGQ7CS8qIDB4LjUyOCAtIE1JSSBNYW5hZ2VtZW50IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwl1MzIJbWlpbWNvbjsJLyogMHguNTJjIC0gTUlJIE1hbmFnZW1lbnQgQ29udHJvbCBSZWdpc3RlciAqLworCXUzMgltaWltc3RhdDsJLyogMHguNTMwIC0gTUlJIE1hbmFnZW1lbnQgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCW1paW1pbmQ7CS8qIDB4LjUzNCAtIE1JSSBNYW5hZ2VtZW50IEluZGljYXRvciBSZWdpc3RlciAqLwogCXU4CXJlczE5WzRdOwotCXUzMglpZnN0YXQ7CQkJLyogMHguNTNjIC0gSW50ZXJmYWNlIFN0YXR1cyBSZWdpc3RlciAqLwotCXUzMgltYWNzdG5hZGRyMTsJCS8qIDB4LjU0MCAtIFN0YXRpb24gQWRkcmVzcyBQYXJ0IDEgUmVnaXN0ZXIgKi8KLQl1MzIJbWFjc3RuYWRkcjI7CQkvKiAweC41NDQgLSBTdGF0aW9uIEFkZHJlc3MgUGFydCAyIFJlZ2lzdGVyICovCi0JdTgJcmVzMjBbMzEyXTsKLQlzdHJ1Y3Qgcm1vbl9taWIJcm1vbjsKLQl1OAlyZXMyMVsxOTJdOwotCXUzMglpYWRkcjA7CQkJLyogMHguODAwIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMCAqLwotCXUzMglpYWRkcjE7CQkJLyogMHguODA0IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMSAqLwotCXUzMglpYWRkcjI7CQkJLyogMHguODA4IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLwotCXUzMglpYWRkcjM7CQkJLyogMHguODBjIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLwotCXUzMglpYWRkcjQ7CQkJLyogMHguODEwIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNCAqLwotCXUzMglpYWRkcjU7CQkJLyogMHguODE0IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNSAqLwotCXUzMglpYWRkcjY7CQkJLyogMHguODE4IC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNiAqLwotCXUzMglpYWRkcjc7CQkJLyogMHguODFjIC0gSW5kaXZkdWFsIGFkZHJlc3MgcmVnaXN0ZXIgNyAqLworCXUzMglpZnN0YXQ7CQkvKiAweC41M2MgLSBJbnRlcmZhY2UgU3RhdHVzIFJlZ2lzdGVyICovCisJdTMyCW1hY3N0bmFkZHIxOwkvKiAweC41NDAgLSBTdGF0aW9uIEFkZHJlc3MgUGFydCAxIFJlZ2lzdGVyICovCisJdTMyCW1hY3N0bmFkZHIyOwkvKiAweC41NDQgLSBTdGF0aW9uIEFkZHJlc3MgUGFydCAyIFJlZ2lzdGVyICovCisJdTMyCW1hYzAxYWRkcjE7CS8qIDB4LjU0OCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEsIHBhcnQgMSAqLworCXUzMgltYWMwMWFkZHIyOwkvKiAweC41NGMgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxLCBwYXJ0IDIgKi8KKwl1MzIJbWFjMDJhZGRyMTsJLyogMHguNTUwIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMiwgcGFydCAxICovCisJdTMyCW1hYzAyYWRkcjI7CS8qIDB4LjU1NCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDIsIHBhcnQgMiAqLworCXUzMgltYWMwM2FkZHIxOwkvKiAweC41NTggLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAzLCBwYXJ0IDEgKi8KKwl1MzIJbWFjMDNhZGRyMjsJLyogMHguNTVjIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMywgcGFydCAyICovCisJdTMyCW1hYzA0YWRkcjE7CS8qIDB4LjU2MCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDQsIHBhcnQgMSAqLworCXUzMgltYWMwNGFkZHIyOwkvKiAweC41NjQgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA0LCBwYXJ0IDIgKi8KKwl1MzIJbWFjMDVhZGRyMTsJLyogMHguNTY4IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgNSwgcGFydCAxICovCisJdTMyCW1hYzA1YWRkcjI7CS8qIDB4LjU2YyAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDUsIHBhcnQgMiAqLworCXUzMgltYWMwNmFkZHIxOwkvKiAweC41NzAgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA2LCBwYXJ0IDEgKi8KKwl1MzIJbWFjMDZhZGRyMjsJLyogMHguNTc0IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgNiwgcGFydCAyICovCisJdTMyCW1hYzA3YWRkcjE7CS8qIDB4LjU3OCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDcsIHBhcnQgMSAqLworCXUzMgltYWMwN2FkZHIyOwkvKiAweC41N2MgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA3LCBwYXJ0IDIgKi8KKwl1MzIJbWFjMDhhZGRyMTsJLyogMHguNTgwIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgOCwgcGFydCAxICovCisJdTMyCW1hYzA4YWRkcjI7CS8qIDB4LjU4NCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDgsIHBhcnQgMiAqLworCXUzMgltYWMwOWFkZHIxOwkvKiAweC41ODggLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyA5LCBwYXJ0IDEgKi8KKwl1MzIJbWFjMDlhZGRyMjsJLyogMHguNThjIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgOSwgcGFydCAyICovCisJdTMyCW1hYzEwYWRkcjE7CS8qIDB4LjU5MCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEwLCBwYXJ0IDEqLworCXUzMgltYWMxMGFkZHIyOwkvKiAweC41OTQgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxMCwgcGFydCAyKi8KKwl1MzIJbWFjMTFhZGRyMTsJLyogMHguNTk4IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTEsIHBhcnQgMSovCisJdTMyCW1hYzExYWRkcjI7CS8qIDB4LjU5YyAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDExLCBwYXJ0IDIqLworCXUzMgltYWMxMmFkZHIxOwkvKiAweC41YTAgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxMiwgcGFydCAxKi8KKwl1MzIJbWFjMTJhZGRyMjsJLyogMHguNWE0IC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTIsIHBhcnQgMiovCisJdTMyCW1hYzEzYWRkcjE7CS8qIDB4LjVhOCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDEzLCBwYXJ0IDEqLworCXUzMgltYWMxM2FkZHIyOwkvKiAweC41YWMgLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxMywgcGFydCAyKi8KKwl1MzIJbWFjMTRhZGRyMTsJLyogMHguNWIwIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTQsIHBhcnQgMSovCisJdTMyCW1hYzE0YWRkcjI7CS8qIDB4LjViNCAtIE1BQyBleGFjdCBtYXRjaCBhZGRyZXNzIDE0LCBwYXJ0IDIqLworCXUzMgltYWMxNWFkZHIxOwkvKiAweC41YjggLSBNQUMgZXhhY3QgbWF0Y2ggYWRkcmVzcyAxNSwgcGFydCAxKi8KKwl1MzIJbWFjMTVhZGRyMjsJLyogMHguNWJjIC0gTUFDIGV4YWN0IG1hdGNoIGFkZHJlc3MgMTUsIHBhcnQgMiovCisJdTgJcmVzMjBbMTkyXTsKKwlzdHJ1Y3Qgcm1vbl9taWIJcm1vbjsJLyogMHguNjgwLTB4LjczYyAqLworCXUzMglycmVqOwkJLyogMHguNzQwIC0gUmVjZWl2ZSBmaWxlciByZWplY3RlZCBwYWNrZXQgY291bnRlciAqLworCXU4CXJlczIxWzE4OF07CisJdTMyCWlnYWRkcjA7CS8qIDB4LjgwMCAtIEluZGl2ZHVhbC9Hcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDAqLworCXUzMglpZ2FkZHIxOwkvKiAweC44MDQgLSBJbmRpdmR1YWwvR3JvdXAgYWRkcmVzcyByZWdpc3RlciAxKi8KKwl1MzIJaWdhZGRyMjsJLyogMHguODA4IC0gSW5kaXZkdWFsL0dyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgMiovCisJdTMyCWlnYWRkcjM7CS8qIDB4LjgwYyAtIEluZGl2ZHVhbC9Hcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDMqLworCXUzMglpZ2FkZHI0OwkvKiAweC44MTAgLSBJbmRpdmR1YWwvR3JvdXAgYWRkcmVzcyByZWdpc3RlciA0Ki8KKwl1MzIJaWdhZGRyNTsJLyogMHguODE0IC0gSW5kaXZkdWFsL0dyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgNSovCisJdTMyCWlnYWRkcjY7CS8qIDB4LjgxOCAtIEluZGl2ZHVhbC9Hcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDYqLworCXUzMglpZ2FkZHI3OwkvKiAweC44MWMgLSBJbmRpdmR1YWwvR3JvdXAgYWRkcmVzcyByZWdpc3RlciA3Ki8KIAl1OAlyZXMyMls5Nl07Ci0JdTMyCWdhZGRyMDsJCQkvKiAweC44ODAgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAwICovCi0JdTMyCWdhZGRyMTsJCQkvKiAweC44ODQgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAxICovCi0JdTMyCWdhZGRyMjsJCQkvKiAweC44ODggLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAyICovCi0JdTMyCWdhZGRyMzsJCQkvKiAweC44OGMgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciAzICovCi0JdTMyCWdhZGRyNDsJCQkvKiAweC44OTAgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA0ICovCi0JdTMyCWdhZGRyNTsJCQkvKiAweC44OTQgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA1ICovCi0JdTMyCWdhZGRyNjsJCQkvKiAweC44OTggLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA2ICovCi0JdTMyCWdhZGRyNzsJCQkvKiAweC44OWMgLSBHbG9iYWwgYWRkcmVzcyByZWdpc3RlciA3ICovCi0JdTgJcmVzMjNbODU2XTsKLQl1MzIJYXR0cjsJCQkvKiAweC5iZjggLSBBdHRyaWJ1dGVzIFJlZ2lzdGVyICovCi0JdTMyCWF0dHJlbGk7CQkvKiAweC5iZmMgLSBBdHRyaWJ1dGVzIEV4dHJhY3QgTGVuZ3RoIGFuZCBFeHRyYWN0IEluZGV4IFJlZ2lzdGVyICovCisJdTMyCWdhZGRyMDsJCS8qIDB4Ljg4MCAtIEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgMCAqLworCXUzMglnYWRkcjE7CQkvKiAweC44ODQgLSBHcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDEgKi8KKwl1MzIJZ2FkZHIyOwkJLyogMHguODg4IC0gR3JvdXAgYWRkcmVzcyByZWdpc3RlciAyICovCisJdTMyCWdhZGRyMzsJCS8qIDB4Ljg4YyAtIEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCXUzMglnYWRkcjQ7CQkvKiAweC44OTAgLSBHcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KKwl1MzIJZ2FkZHI1OwkJLyogMHguODk0IC0gR3JvdXAgYWRkcmVzcyByZWdpc3RlciA1ICovCisJdTMyCWdhZGRyNjsJCS8qIDB4Ljg5OCAtIEdyb3VwIGFkZHJlc3MgcmVnaXN0ZXIgNiAqLworCXUzMglnYWRkcjc7CQkvKiAweC44OWMgLSBHcm91cCBhZGRyZXNzIHJlZ2lzdGVyIDcgKi8KKwl1OAlyZXMyM2FbMzUyXTsKKwl1MzIJZmlmb2NmZzsJLyogMHguYTAwIC0gRklGTyBpbnRlcmZhY2UgY29uZmlnIHJlZ2lzdGVyICovCisJdTgJcmVzMjNiWzI1Ml07CisJdTgJcmVzMjNjWzI0OF07CisJdTMyCWF0dHI7CQkvKiAweC5iZjggLSBBdHRyaWJ1dGVzIFJlZ2lzdGVyICovCisJdTMyCWF0dHJlbGk7CS8qIDB4LmJmYyAtIEF0dHJpYnV0ZXMgRXh0cmFjdCBMZW5ndGggYW5kIEV4dHJhY3QgSW5kZXggUmVnaXN0ZXIgKi8KIAl1OAlyZXMyNFsxMDI0XTsKIAogfTsKQEAgLTQ5Niw2ICs2ODYsOCBAQAogCXN0cnVjdCB0eGJkOCAqY3VyX3R4OwkgICAgICAgIC8qIE5leHQgZnJlZSByaW5nIGVudHJ5ICovCiAJc3RydWN0IHR4YmQ4ICpkaXJ0eV90eDsJCS8qIFRoZSBSaW5nIGVudHJ5IHRvIGJlIGZyZWVkLiAqLwogCXN0cnVjdCBnZmFyICpyZWdzOwkvKiBQb2ludGVyIHRvIHRoZSBHRkFSIG1lbW9yeSBtYXBwZWQgUmVnaXN0ZXJzICovCisJdTMyICpoYXNoX3JlZ3NbMTZdOworCWludCBoYXNoX3dpZHRoOwogCXN0cnVjdCBnZmFyICpwaHlyZWdzOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB0cTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBwaHlfaW5mb190aW1lcjsKQEAgLTUwNiw5ICs2OTgsMTIgQEAKIAl1bnNpZ25lZCBpbnQgcnhfc3Rhc2hfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgdHhfcmluZ19zaXplOwogCXVuc2lnbmVkIGludCByeF9yaW5nX3NpemU7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgcnhjbGVhbnVwcTsKLQl1bnNpZ25lZCBpbnQgcnhjbGVhbjsKIAorCXVuc2lnbmVkIGNoYXIgdmxhbl9lbmFibGU6MSwKKwkJcnhfY3N1bV9lbmFibGU6MSwKKwkJZXh0ZW5kZWRfaGFzaDoxOworCXVuc2lnbmVkIHNob3J0IHBhZGRpbmc7CisJc3RydWN0IHZsYW5fZ3JvdXAgKnZsZ3JwOwogCS8qIEluZm8gc3RydWN0dXJlIGluaXRpYWxpemVkIGJ5IGJvYXJkIHNldHVwIGNvZGUgKi8KIAl1bnNpZ25lZCBpbnQgaW50ZXJydXB0VHJhbnNtaXQ7CiAJdW5zaWduZWQgaW50IGludGVycnVwdFJlY2VpdmU7CkBAIC01MTksNiArNzE0LDggQEAKIAlpbnQgb2xkc3BlZWQ7CiAJaW50IG9sZGR1cGxleDsKIAlpbnQgb2xkbGluazsKKworCXVpbnQzMl90IG1zZ19lbmFibGU7CiB9OwogCiBleHRlcm4gaW5saW5lIHUzMiBnZmFyX3JlYWQodm9sYXRpbGUgdW5zaWduZWQgKmFkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9naWFuZmFyX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCmluZGV4IDI4MDQ2ZTkuLmE0NTFkZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfZXRodG9vbC5jCkBAIC00NiwxNiArNDYsMTggQEAKIAogZXh0ZXJuIGludCBzdGFydHVwX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBzdG9wX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBnZmFyX3JlY2VpdmUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBnZmFyX2hhbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBnZmFyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBnZmFyX2NsZWFuX3J4X3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJ4X3dvcmtfbGltaXQpOwogCi12b2lkIGdmYXJfZmlsbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZHVtbXksCitzdGF0aWMgdm9pZCBnZmFyX2ZpbGxfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LAogCQkgICAgIHU2NCAqIGJ1Zik7Ci12b2lkIGdmYXJfZ3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBidWYpOwotaW50IGdmYXJfZ2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjdmFscyk7Ci1pbnQgZ2Zhcl9zY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKTsKLXZvaWQgZ2Zhcl9ncmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpOwotaW50IGdmYXJfc3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKTsKLXZvaWQgZ2Zhcl9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKTsKK3N0YXRpYyB2b2lkIGdmYXJfZ3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBidWYpOworc3RhdGljIGludCBnZmFyX2djb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpOworc3RhdGljIGludCBnZmFyX3Njb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpOworc3RhdGljIHZvaWQgZ2Zhcl9ncmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpOworc3RhdGljIGludCBnZmFyX3NyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscyk7CitzdGF0aWMgdm9pZCBnZmFyX2dkcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pOwogCiBzdGF0aWMgY2hhciBzdGF0X2dzdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKIAkicngtZHJvcHBlZC1ieS1rZXJuZWwiLApAQCAtMTE4LDU3ICsxMjAsNTYgQEAKIAkidHgtZnJhZ21lbnRlZC1mcmFtZXMiLAogfTsKIAorLyogRmlsbCBpbiBhIGJ1ZmZlciB3aXRoIHRoZSBzdHJpbmdzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlCisgKiBzdGF0cyAqLworc3RhdGljIHZvaWQgZ2Zhcl9nc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGJ1ZikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkKKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTikKKwkJbWVtY3B5KGJ1Ziwgc3RhdF9nc3RyaW5ncywgR0ZBUl9TVEFUU19MRU4gKiBFVEhfR1NUUklOR19MRU4pOworCWVsc2UKKwkJbWVtY3B5KGJ1Ziwgc3RhdF9nc3RyaW5ncywKKwkJCQlHRkFSX0VYVFJBX1NUQVRTX0xFTiAqIEVUSF9HU1RSSU5HX0xFTik7Cit9CisKIC8qIEZpbGwgaW4gYW4gYXJyYXkgb2YgNjQtYml0IHN0YXRpc3RpY3MgZnJvbSB2YXJpb3VzIHNvdXJjZXMuCiAgKiBUaGlzIGFycmF5IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgZXRodG9vbF9zdGF0cwogICogc3RydWN0dXJlLCBhbmQgcmV0dXJuZWQgdG8gdXNlciBzcGFjZQogICovCi12b2lkIGdmYXJfZmlsbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZHVtbXksIHU2NCAqIGJ1ZikKK3N0YXRpYyB2b2lkIGdmYXJfZmlsbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZHVtbXksIHU2NCAqIGJ1ZikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgKnJtb24gPSAodTMyICopICYgcHJpdi0+cmVncy0+cm1vbjsKIAl1NjQgKmV4dHJhID0gKHU2NCAqKSAmIHByaXYtPmV4dHJhX3N0YXRzOwotCXN0cnVjdCBnZmFyX3N0YXRzICpzdGF0cyA9IChzdHJ1Y3QgZ2Zhcl9zdGF0cyAqKSBidWY7CiAKLQlmb3IgKGkgPSAwOyBpIDwgR0ZBUl9STU9OX0xFTjsgaSsrKSB7Ci0JCXN0YXRzLT5ybW9uW2ldID0gKHU2NCkgKHJtb25baV0pOwotCX0KKwlpZiAocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfUk1PTikgeworCQl1MzIgKnJtb24gPSAodTMyICopICYgcHJpdi0+cmVncy0+cm1vbjsKKwkJc3RydWN0IGdmYXJfc3RhdHMgKnN0YXRzID0gKHN0cnVjdCBnZmFyX3N0YXRzICopIGJ1ZjsKIAotCWZvciAoaSA9IDA7IGkgPCBHRkFSX0VYVFJBX1NUQVRTX0xFTjsgaSsrKSB7Ci0JCXN0YXRzLT5leHRyYVtpXSA9IGV4dHJhW2ldOwotCX0KKwkJZm9yIChpID0gMDsgaSA8IEdGQVJfUk1PTl9MRU47IGkrKykKKwkJCXN0YXRzLT5ybW9uW2ldID0gKHU2NCkgKHJtb25baV0pOworCisJCWZvciAoaSA9IDA7IGkgPCBHRkFSX0VYVFJBX1NUQVRTX0xFTjsgaSsrKQorCQkJc3RhdHMtPmV4dHJhW2ldID0gZXh0cmFbaV07CisJfSBlbHNlCisJCWZvciAoaSA9IDA7IGkgPCBHRkFSX0VYVFJBX1NUQVRTX0xFTjsgaSsrKQorCQkJYnVmW2ldID0gZXh0cmFbaV07CiB9CiAKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGF0cyAoYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RyaW5ncykgKi8KLWludCBnZmFyX3N0YXRzX2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGdmYXJfc3RhdHNfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gR0ZBUl9TVEFUU19MRU47Ci19Ci0KLXZvaWQgZ2Zhcl9nc3RyaW5nc19ub3Jtb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBidWYpCi17Ci0JbWVtY3B5KGJ1Ziwgc3RhdF9nc3RyaW5ncywgR0ZBUl9FWFRSQV9TVEFUU19MRU4gKiBFVEhfR1NUUklOR19MRU4pOwotfQotCi12b2lkIGdmYXJfZmlsbF9zdGF0c19ub3Jtb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgCi0JCXN0cnVjdCBldGh0b29sX3N0YXRzICpkdW1teSwgdTY0ICogYnVmKQotewotCWludCBpOwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXU2NCAqZXh0cmEgPSAodTY0ICopICYgcHJpdi0+ZXh0cmFfc3RhdHM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgR0ZBUl9FWFRSQV9TVEFUU19MRU47IGkrKykgewotCQlidWZbaV0gPSBleHRyYVtpXTsKLQl9CisJaWYgKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX1JNT04pCisJCXJldHVybiBHRkFSX1NUQVRTX0xFTjsKKwllbHNlCisJCXJldHVybiBHRkFSX0VYVFJBX1NUQVRTX0xFTjsKIH0KIAotCi1pbnQgZ2Zhcl9zdGF0c19jb3VudF9ub3Jtb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gR0ZBUl9FWFRSQV9TVEFUU19MRU47Ci19CiAvKiBGaWxscyBpbiB0aGUgZHJ2aW5mbyBzdHJ1Y3R1cmUgd2l0aCBzb21lIGJhc2ljIGluZm8gKi8KLXZvaWQgZ2Zhcl9nZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QKK3N0YXRpYyB2b2lkIGdmYXJfZ2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0CiAJICAgICAgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQogewogCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgR0ZBUl9JTkZPU1RSX0xFTik7CkBAIC0xODIsNyArMTgzLDcgQEAKIH0KIAogLyogUmV0dXJuIHRoZSBjdXJyZW50IHNldHRpbmdzIGluIHRoZSBldGh0b29sX2NtZCBzdHJ1Y3R1cmUgKi8KLWludCBnZmFyX2dzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgZ2Zhcl9nc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdWludCBnaWdhYml0X3N1cHBvcnQgPSAKQEAgLTIxNiwxMyArMjE3LDEzIEBACiB9CiAKIC8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJ1Y3R1cmUgKi8KLWludCBnZmFyX3JlZ2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBnZmFyX3JlZ2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiBzaXplb2YgKHN0cnVjdCBnZmFyKTsKIH0KIAogLyogUmV0dXJuIGEgZHVtcCBvZiB0aGUgR0ZBUiByZWdpc3RlciBzcGFjZSAqLwotdm9pZCBnZmFyX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnJlZ2J1ZikKK3N0YXRpYyB2b2lkIGdmYXJfZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcmVnYnVmKQogewogCWludCBpOwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjMzLDEzICsyMzQsNiBAQAogCQlidWZbaV0gPSB0aGVyZWdzW2ldOwogfQogCi0vKiBGaWxsIGluIGEgYnVmZmVyIHdpdGggdGhlIHN0cmluZ3Mgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUKLSAqIHN0YXRzICovCi12b2lkIGdmYXJfZ3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHN0cmluZ3NldCwgdTggKiBidWYpCi17Ci0JbWVtY3B5KGJ1Ziwgc3RhdF9nc3RyaW5ncywgR0ZBUl9TVEFUU19MRU4gKiBFVEhfR1NUUklOR19MRU4pOwotfQotCiAvKiBDb252ZXJ0IG1pY3Jvc2Vjb25kcyB0byBldGhlcm5ldCBjbG9jayB0aWNrcywgd2hpY2ggY2hhbmdlcwogICogZGVwZW5kaW5nIG9uIHdoYXQgc3BlZWQgdGhlIGNvbnRyb2xsZXIgaXMgcnVubmluZyBhdCAqLwogc3RhdGljIHVuc2lnbmVkIGludCBnZmFyX3VzZWNzMnRpY2tzKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsIHVuc2lnbmVkIGludCB1c2VjcykKQEAgLTI5MSw5ICsyODUsMTIgQEAKIAogLyogR2V0IHRoZSBjb2FsZXNjaW5nIHBhcmFtZXRlcnMsIGFuZCBwdXQgdGhlbSBpbiB0aGUgY3ZhbHMKICAqIHN0cnVjdHVyZS4gICovCi1pbnQgZ2Zhcl9nY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKQorc3RhdGljIGludCBnZmFyX2djb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJCisJaWYgKCEocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ09BTEVTQ0UpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAljdmFscy0+cnhfY29hbGVzY2VfdXNlY3MgPSBnZmFyX3RpY2tzMnVzZWNzKHByaXYsIHByaXYtPnJ4dGltZSk7CiAJY3ZhbHMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gcHJpdi0+cnhjb3VudDsKQEAgLTMzNywxMCArMzM0LDEzIEBACiAgKiBCb3RoIGN2YWxzLT4qX3VzZWNzIGFuZCBjdmFscy0+Kl9mcmFtZXMgaGF2ZSB0byBiZSA+IDAKICAqIGluIG9yZGVyIGZvciBjb2FsZXNjaW5nIHRvIGJlIGFjdGl2ZQogICovCi1pbnQgZ2Zhcl9zY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmN2YWxzKQorc3RhdGljIGludCBnZmFyX3Njb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY3ZhbHMpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKKwlpZiAoIShwcml2LT5laW5mby0+ZGV2aWNlX2ZsYWdzICYgRlNMX0dJQU5GQVJfREVWX0hBU19DT0FMRVNDRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCS8qIFNldCB1cCByeCBjb2FsZXNjaW5nICovCiAJaWYgKChjdmFscy0+cnhfY29hbGVzY2VfdXNlY3MgPT0gMCkgfHwKIAkgICAgKGN2YWxzLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9PSAwKSkKQEAgLTM3OSw3ICszNzksNyBAQAogLyogRmlsbHMgaW4gcnZhbHMgd2l0aCB0aGUgY3VycmVudCByaW5nIHBhcmFtZXRlcnMuICBDdXJyZW50bHksCiAgKiByeCwgcnhfbWluaSwgYW5kIHJ4X2p1bWJvIHJpbmdzIGFyZSB0aGUgc2FtZSBzaXplLCBhcyBtaW5pIGFuZAogICoganVtYm8gYXJlIGlnbm9yZWQgYnkgdGhlIGRyaXZlciAqLwotdm9pZCBnZmFyX2dyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpydmFscykKK3N0YXRpYyB2b2lkIGdmYXJfZ3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKQogewogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC00MDEsOSArNDAxLDggQEAKICAqIG5lY2Vzc2FyeSBzbyB0aGF0IHdlIGRvbid0IG1lc3MgdGhpbmdzIHVwIHdoaWxlIHdlJ3JlIGluCiAgKiBtb3Rpb24uICBXZSB3YWl0IGZvciB0aGUgcmluZyB0byBiZSBjbGVhbiBiZWZvcmUgcmVhbGxvY2F0aW5nCiAgKiB0aGUgcmluZ3MuICovCi1pbnQgZ2Zhcl9zcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcnZhbHMpCitzdGF0aWMgaW50IGdmYXJfc3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJ2YWxzKQogewotCXUzMiB0ZW1wdmFsOwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBlcnIgPSAwOwogCkBAIC00MjUsNDQgKzQyNCwxMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogU3RvcCB0aGUgY29udHJvbGxlciBzbyB3ZSBkb24ndCByeCBhbnkgbW9yZSBmcmFtZXMgKi8KLQkvKiBCdXQgZmlyc3QsIG1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgYml0cyAqLwotCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOwotCXRlbXB2YWwgJj0gfihETUFDVFJMX0dSUyB8IERNQUNUUkxfR1RTKTsKLQlnZmFyX3dyaXRlKCZwcml2LT5yZWdzLT5kbWFjdHJsLCB0ZW1wdmFsKTsKLQotCXRlbXB2YWwgPSBnZmFyX3JlYWQoJnByaXYtPnJlZ3MtPmRtYWN0cmwpOwotCXRlbXB2YWwgfD0gKERNQUNUUkxfR1JTIHwgRE1BQ1RSTF9HVFMpOwotCWdmYXJfd3JpdGUoJnByaXYtPnJlZ3MtPmRtYWN0cmwsIHRlbXB2YWwpOwotCi0Jd2hpbGUgKCEoZ2Zhcl9yZWFkKCZwcml2LT5yZWdzLT5pZXZlbnQpICYgKElFVkVOVF9HUlNDIHwgSUVWRU5UX0dUU0MpKSkKLQkJY3B1X3JlbGF4KCk7Ci0KLQkvKiBOb3RlIHRoYXQgcnggaXMgbm90IGNsZWFuIHJpZ2h0IG5vdyAqLwotCXByaXYtPnJ4Y2xlYW4gPSAwOwotCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHsKLQkJLyogVGVsbCB0aGUgZHJpdmVyIHRvIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lcyAqLwotCQlnZmFyX3JlY2VpdmUoMCwgKHZvaWQgKikgZGV2LCBOVUxMKTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCQkvKiBOb3cgd2FpdCBmb3IgaXQgdG8gYmUgZG9uZSAqLwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocHJpdi0+cnhjbGVhbnVwcSwgcHJpdi0+cnhjbGVhbik7CisJCS8qIEhhbHQgVFggYW5kIFJYLCBhbmQgcHJvY2VzcyB0aGUgZnJhbWVzIHdoaWNoCisJCSAqIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCWdmYXJfaGFsdChkZXYpOworCQlnZmFyX2NsZWFuX3J4X3JpbmcoZGV2LCBwcml2LT5yeF9yaW5nX3NpemUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQkJLyogT2ssIGFsbCBwYWNrZXRzIGhhdmUgYmVlbiBoYW5kbGVkLiAgTm93IHdlIGJyaW5nIGl0IGRvd24sCi0JCSAqIGNoYW5nZSB0aGUgcmluZyBzaXplLCBhbmQgYnJpbmcgaXQgdXAgKi8KLQorCQkvKiBOb3cgd2UgdGFrZSBkb3duIHRoZSByaW5ncyB0byByZWJ1aWxkIHRoZW0gKi8KIAkJc3RvcF9nZmFyKGRldik7CiAJfQogCisJLyogQ2hhbmdlIHRoZSBzaXplICovCiAJcHJpdi0+cnhfcmluZ19zaXplID0gcnZhbHMtPnJ4X3BlbmRpbmc7CiAJcHJpdi0+dHhfcmluZ19zaXplID0gcnZhbHMtPnR4X3BlbmRpbmc7CiAKKwkvKiBSZWJ1aWxkIHRoZSByaW5ncyB3aXRoIHRoZSBuZXcgc2l6ZSAqLworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKQorCQllcnIgPSBzdGFydHVwX2dmYXIoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZ2Zhcl9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1aW50MzJfdCBkYXRhKQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJaWYgKCEocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogSGFsdCBUWCBhbmQgUlgsIGFuZCBwcm9jZXNzIHRoZSBmcmFtZXMgd2hpY2gKKwkJICogaGF2ZSBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJZ2Zhcl9oYWx0KGRldik7CisJCWdmYXJfY2xlYW5fcnhfcmluZyhkZXYsIHByaXYtPnJ4X3Jpbmdfc2l6ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBOb3cgd2UgdGFrZSBkb3duIHRoZSByaW5ncyB0byByZWJ1aWxkIHRoZW0gKi8KKwkJc3RvcF9nZmFyKGRldik7CisJfQorCisJcHJpdi0+cnhfY3N1bV9lbmFibGUgPSBkYXRhOworCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfVVApCiAJCWVyciA9IHN0YXJ0dXBfZ2ZhcihkZXYpOwogCiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHVpbnQzMl90IGdmYXJfZ2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX0NTVU0pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwcml2LT5yeF9jc3VtX2VuYWJsZTsKK30KKworc3RhdGljIGludCBnZmFyX3NldF90eF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQzMl90IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghKHByaXYtPmVpbmZvLT5kZXZpY2VfZmxhZ3MgJiBGU0xfR0lBTkZBUl9ERVZfSEFTX0NTVU0pKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWdmYXJfaGFsdChkZXYpOworCisJaWYgKGRhdGEpCisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9JUF9DU1VNOworCWVsc2UKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9JUF9DU1VNOworCisJZ2Zhcl9zdGFydChkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgZ2Zhcl9nZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCEocHJpdi0+ZWluZm8tPmRldmljZV9mbGFncyAmIEZTTF9HSUFORkFSX0RFVl9IQVNfQ1NVTSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSAhPSAwOworfQorCitzdGF0aWMgdWludDMyX3QgZ2Zhcl9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sgICAgICAgCisJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJcmV0dXJuIHByaXYtPm1zZ19lbmFibGU7Cit9ICAgICAgIAorICAgICAgICAKK3N0YXRpYyB2b2lkIGdmYXJfc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVpbnQzMl90IGRhdGEpCit7ICAgICAgIAorCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXByaXYtPm1zZ19lbmFibGUgPSBkYXRhOworfQorCisKIHN0cnVjdCBldGh0b29sX29wcyBnZmFyX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBnZmFyX2dzZXR0aW5ncywKIAkuZ2V0X2RydmluZm8gPSBnZmFyX2dkcnZpbmZvLApAQCAtNDc2LDUyICs1NDcsMTAgQEAKIAkuZ2V0X3N0cmluZ3MgPSBnZmFyX2dzdHJpbmdzLAogCS5nZXRfc3RhdHNfY291bnQgPSBnZmFyX3N0YXRzX2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cyA9IGdmYXJfZmlsbF9zdGF0cywKLX07Ci0KLXN0cnVjdCBldGh0b29sX29wcyBnZmFyX25vcm1vbl9ub2NvYWxlc2NlX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MgPSBnZmFyX2dzZXR0aW5ncywKLQkuZ2V0X2RydmluZm8gPSBnZmFyX2dkcnZpbmZvLAotCS5nZXRfcmVnc19sZW4gPSBnZmFyX3JlZ2xlbiwKLQkuZ2V0X3JlZ3MgPSBnZmFyX2dldF9yZWdzLAotCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF9yaW5ncGFyYW0gPSBnZmFyX2dyaW5ncGFyYW0sCi0JLnNldF9yaW5ncGFyYW0gPSBnZmFyX3NyaW5ncGFyYW0sCi0JLmdldF9zdHJpbmdzID0gZ2Zhcl9nc3RyaW5nc19ub3Jtb24sCi0JLmdldF9zdGF0c19jb3VudCA9IGdmYXJfc3RhdHNfY291bnRfbm9ybW9uLAotCS5nZXRfZXRodG9vbF9zdGF0cyA9IGdmYXJfZmlsbF9zdGF0c19ub3Jtb24sCi19OwotCi1zdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ub2NvYWxlc2NlX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MgPSBnZmFyX2dzZXR0aW5ncywKLQkuZ2V0X2RydmluZm8gPSBnZmFyX2dkcnZpbmZvLAotCS5nZXRfcmVnc19sZW4gPSBnZmFyX3JlZ2xlbiwKLQkuZ2V0X3JlZ3MgPSBnZmFyX2dldF9yZWdzLAotCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF9yaW5ncGFyYW0gPSBnZmFyX2dyaW5ncGFyYW0sCi0JLnNldF9yaW5ncGFyYW0gPSBnZmFyX3NyaW5ncGFyYW0sCi0JLmdldF9zdHJpbmdzID0gZ2Zhcl9nc3RyaW5ncywKLQkuZ2V0X3N0YXRzX2NvdW50ID0gZ2Zhcl9zdGF0c19jb3VudCwKLQkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBnZmFyX2ZpbGxfc3RhdHMsCi19OwotCi1zdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ub3Jtb25fZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncyA9IGdmYXJfZ3NldHRpbmdzLAotCS5nZXRfZHJ2aW5mbyA9IGdmYXJfZ2RydmluZm8sCi0JLmdldF9yZWdzX2xlbiA9IGdmYXJfcmVnbGVuLAotCS5nZXRfcmVncyA9IGdmYXJfZ2V0X3JlZ3MsCi0JLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKLQkuZ2V0X2NvYWxlc2NlID0gZ2Zhcl9nY29hbGVzY2UsCi0JLnNldF9jb2FsZXNjZSA9IGdmYXJfc2NvYWxlc2NlLAotCS5nZXRfcmluZ3BhcmFtID0gZ2Zhcl9ncmluZ3BhcmFtLAotCS5zZXRfcmluZ3BhcmFtID0gZ2Zhcl9zcmluZ3BhcmFtLAotCS5nZXRfc3RyaW5ncyA9IGdmYXJfZ3N0cmluZ3Nfbm9ybW9uLAotCS5nZXRfc3RhdHNfY291bnQgPSBnZmFyX3N0YXRzX2NvdW50X25vcm1vbiwKLQkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBnZmFyX2ZpbGxfc3RhdHNfbm9ybW9uLAotfTsKLQotc3RydWN0IGV0aHRvb2xfb3BzICpnZmFyX29wX2FycmF5W10gPSB7Ci0JJmdmYXJfZXRodG9vbF9vcHMsCi0JJmdmYXJfbm9ybW9uX2V0aHRvb2xfb3BzLAotCSZnZmFyX25vY29hbGVzY2VfZXRodG9vbF9vcHMsCi0JJmdmYXJfbm9ybW9uX25vY29hbGVzY2VfZXRodG9vbF9vcHMKKwkuZ2V0X3J4X2NzdW0gPSBnZmFyX2dldF9yeF9jc3VtLAorCS5nZXRfdHhfY3N1bSA9IGdmYXJfZ2V0X3R4X2NzdW0sCisJLnNldF9yeF9jc3VtID0gZ2Zhcl9zZXRfcnhfY3N1bSwKKwkuc2V0X3R4X2NzdW0gPSBnZmFyX3NldF90eF9jc3VtLAorCS5nZXRfbXNnbGV2ZWwgPSBnZmFyX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsID0gZ2Zhcl9zZXRfbXNnbGV2ZWwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuYyBiL2RyaXZlcnMvbmV0L2dpYW5mYXJfcGh5LmMKaW5kZXggMDJiMTZhYi4uN2M5NjVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZ2lhbmZhcl9waHkuYworKysgYi9kcml2ZXJzL25ldC9naWFuZmFyX3BoeS5jCkBAIC01NzIsNyArNTcyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGh5X2luZm8gcGh5X2luZm9fbWFydmVsbCA9IHsKIAkucGh5X2lkCQk9IDB4MDE0MTBjMDAsCiAJLnBoeV9pZF9tYXNrCT0gMHhmZmZmZmYwMCwKLQkubmFtZQkJPSAiTWFydmVsbCA4OEUxMTAxIiwKKwkubmFtZQkJPSAiTWFydmVsbCA4OEUxMTAxLzg4RTExMTEiLAogCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAogCS5jb25maWdfYW5lZwk9ICZtYXJ2ZWxsX2NvbmZpZ19hbmVnLAogCS5yZWFkX3N0YXR1cwk9ICZtYXJ2ZWxsX3JlYWRfc3RhdHVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtYWNoaS5jIGIvZHJpdmVycy9uZXQvaGFtYWNoaS5jCmluZGV4IDNkOTY3MTQuLmQ5ZGYxZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbWFjaGkuYworKysgYi9kcml2ZXJzL25ldC9oYW1hY2hpLmMKQEAgLTExNDksNyArMTE0OSw3IEBACiAJCXNrYi0+ZGV2ID0gZGV2OyAgICAgICAgIC8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsgLyogMTYgYnl0ZSBhbGlnbiB0aGUgSVAgaGVhZGVyLiAqLwogICAgICAgICAgICAgICAgIGhtcC0+cnhfcmluZ1tpXS5hZGRyID0gY3B1X3RvX2xlWFgocGNpX21hcF9zaW5nbGUoaG1wLT5wY2lfZGV2LCAKLQkJCXNrYi0+dGFpbCwgaG1wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJc2tiLT5kYXRhLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgCiAJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0ludHIgfCAoaG1wLT5yeF9idWZfc3ogLSAyKSk7CiAJfQpAQCAtMTIxMCw3ICsxMjEwLDcgQEAKIAkJc2tiLT5kZXYgPSBkZXY7ICAgICAgICAgLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIuICovCiAgICAgICAgICAgICAgICAgaG1wLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGVYWChwY2lfbWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAotCQkJc2tiLT50YWlsLCBobXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CisJCQlza2ItPmRhdGEsIGhtcC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJLyogLTIgYmVjYXVzZSBpdCBkb2Vzbid0IFJFQUxMWSBoYXZlIHRoYXQgZmlyc3QgMiBieXRlcyAtS0RVICovCiAJCWhtcC0+cnhfcmluZ1tpXS5zdGF0dXNfbl9sZW5ndGggPSBjcHVfdG9fbGUzMihEZXNjT3duIHwgCiAJCQlEZXNjRW5kUGFja2V0IHwgRGVzY0ludHIgfCAoaG1wLT5yeF9idWZfc3ogLTIpKTsKQEAgLTE1MDksNyArMTUwOSw3IEBACiAJCQkJCSAgICBkZXNjLT5hZGRyLAogCQkJCQkgICAgaG1wLT5yeF9idWZfc3osCiAJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQlidWZfYWRkciA9ICh1OCAqKSBobXAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWw7CisJCWJ1Zl9hZGRyID0gKHU4ICopIGhtcC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YTsKIAkJZnJhbWVfc3RhdHVzID0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoczMyKikmKGJ1Zl9hZGRyW2RhdGFfc2l6ZSAtIDEyXSkpKTsKIAkJaWYgKGhhbWFjaGlfZGVidWcgPiA0KQogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgaGFtYWNoaV9yeCgpIHN0YXR1cyB3YXMgJTguOHguXG4iLApAQCAtMTY3OCw3ICsxNjc4LDcgQEAKIAkJCXNrYi0+ZGV2ID0gZGV2OwkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsJLyogQWxpZ24gSVAgb24gMTYgYnl0ZSBib3VuZGFyaWVzICovCiAgICAgICAgICAgICAgICAgCWRlc2MtPmFkZHIgPSBjcHVfdG9fbGVYWChwY2lfbWFwX3NpbmdsZShobXAtPnBjaV9kZXYsIAotCQkJCXNrYi0+dGFpbCwgaG1wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOworCQkJCXNrYi0+ZGF0YSwgaG1wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQl9CiAJCWRlc2MtPnN0YXR1c19uX2xlbmd0aCA9IGNwdV90b19sZTMyKGhtcC0+cnhfYnVmX3N6KTsKIAkJaWYgKGVudHJ5ID49IFJYX1JJTkdfU0laRS0xKQpAQCAtMTc3Miw5ICsxNzcyLDkgQEAKIAkJCQkgICByZWFkbChpb2FkZHIgKyBSeEN1clB0cikgPT0gKGxvbmcpJmhtcC0+cnhfcmluZ1tpXSA/ICc+JyA6ICcgJywKIAkJCQkgICBpLCBobXAtPnJ4X3JpbmdbaV0uc3RhdHVzX25fbGVuZ3RoLCBobXAtPnJ4X3JpbmdbaV0uYWRkcik7CiAJCQlpZiAoaGFtYWNoaV9kZWJ1ZyA+IDYpIHsKLQkJCQlpZiAoKih1OCopaG1wLT5yeF9za2J1ZmZbaV0tPnRhaWwgIT0gMHg2OSkgeworCQkJCWlmICgqKHU4KilobXAtPnJ4X3NrYnVmZltpXS0+ZGF0YSAhPSAweDY5KSB7CiAJCQkJCXUxNiAqYWRkciA9ICh1MTYgKikKLQkJCQkJCWhtcC0+cnhfc2tidWZmW2ldLT50YWlsOworCQkJCQkJaG1wLT5yeF9za2J1ZmZbaV0tPmRhdGE7CiAJCQkJCWludCBqOwogCiAJCQkJCWZvciAoaiA9IDA7IGogPCAweDUwOyBqKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jCmluZGV4IGVjZTFiMWExLi5jMjdlNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9zY2MuYwpAQCAtMzA0LDcgKzMwNCw3IEBACiAJCXNjYy0+dHhfYnVmZiA9IE5VTEw7CiAJfQogCQotCXdoaWxlIChza2JfcXVldWVfbGVuKCZzY2MtPnR4X3F1ZXVlKSkKKwl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmc2NjLT50eF9xdWV1ZSkpCiAJCWRldl9rZnJlZV9za2Ioc2tiX2RlcXVldWUoJnNjYy0+dHhfcXVldWUpKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYy0+bG9jaywgZmxhZ3MpOwpAQCAtMTEyNiw4ICsxMTI2LDcgQEAKIAkKIAlpZiAoc2NjLT5zdGF0LnR4X3N0YXRlID09IFRYU19XQUlUKQkvKiBtYXhrZXl1cCBvciBpZGxlIHRpbWVvdXQgKi8KIAl7Ci0JCWlmIChza2JfcXVldWVfbGVuKCZzY2MtPnR4X3F1ZXVlKSA9PSAwKQkvKiBub3RoaW5nIHRvIHNlbmQgKi8KLQkJeworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzY2MtPnR4X3F1ZXVlKSkgewkvKiBub3RoaW5nIHRvIHNlbmQgKi8KIAkJCXNjYy0+c3RhdC50eF9zdGF0ZSA9IFRYU19JRExFOwogCQkJbmV0aWZfd2FrZV9xdWV1ZShzY2MtPmRldik7CS8qIHRfbWF4a2V5dXAgbG9ja2VkIGl0LiAqLwogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAtcGx1cy5jIGIvZHJpdmVycy9uZXQvaHAtcGx1cy5jCmluZGV4IDQ4MzQzMTQuLjBhYmY1ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hwLXBsdXMuYworKysgYi9kcml2ZXJzL25ldC9ocC1wbHVzLmMKQEAgLTE1OSwxMiArMTU5LDcgQEAKIAllcnIgPSBkb19ocHBfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMjcxLDYgKzI2Niw5IEBACiAJLyogTGVhdmUgdGhlIDgzOTAgYW5kIEhQIGNoaXAgcmVzZXQuICovCiAJb3V0dyhpbncoaW9hZGRyICsgSFBQX09QVElPTikgJiB+RW5hYmxlSVJRLCBpb2FkZHIgKyBIUFBfT1BUSU9OKTsKIAorCXJldHZhbCA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OwogCXJldHVybiAwOwogb3V0OgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFBfSU9fRVhURU5UKTsKQEAgLTQ2MywxMSArNDYxLDggQEAKIAkJZGV2LT5pcnEgPSBpcnFbdGhpc19kZXZdOwogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJaWYgKGRvX2hwcF9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2hwcFtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2hwcFtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImhwLXBsdXMuYzogTm8gSFAtUGx1cyBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ocC5jIGIvZHJpdmVycy9uZXQvaHAuYwppbmRleCAwMjY4ODg2Li41OWNmODQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ocC5jCisrKyBiL2RyaXZlcnMvbmV0L2hwLmMKQEAgLTEyMywxMiArMTIzLDcgQEAKIAllcnIgPSBkb19ocF9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0yMjcsNyArMjIyLDEyIEBACiAJZWlfc3RhdHVzLmJsb2NrX291dHB1dCA9ICZocF9ibG9ja19vdXRwdXQ7CiAJaHBfaW5pdF9jYXJkKGRldik7CiAKKwlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDE7CiAJcmV0dXJuIDA7CitvdXQxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogb3V0OgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFBfSU9fRVhURU5UKTsKIAlyZXR1cm4gcmV0dmFsOwpAQCAtNDMyLDExICs0MzIsOCBAQAogCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CiAJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOwogCQlpZiAoZG9faHBfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9ocFtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2hwW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHAuYzogTm8gSFAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggYjNhODk4Yy4uY2YwYWM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0xMDYsNiArMTA2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9laXNhLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC00MTcsMTIgKzQxOCw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLSBvdXQxOgotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7CiAgb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTU2Miw3ICs1NTgsNyBAQAogCQkJICogQWxzbywgd2UgY2FuIGhhdmUgRUlTQSBCdXNtYXN0ZXIgY2FyZHMgKG5vdCB0ZXN0ZWQpLAogCQkJICogc28gYmV3YXJlICEhISAtIEplYW4gSUkgKi8KIAkJCWlmKChidXMgPT0gSFAxMDBfQlVTX1BDSSkgJiYKLQkJCSAgIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIDB4ZmZmZmZmZmYpKSkgeworCQkJICAgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgRE1BXzMyQklUX01BU0spKSkgewogCQkJCS8qIEdyYWNlZnVsbHkgZmFsbGJhY2sgdG8gc2hhcmVkIG1lbW9yeSAqLwogCQkJCWdvdG8gYnVzbWFzdGVyZmFpbDsKIAkJCX0KQEAgLTc3NiwxMSArNzcyLDIyIEBACiAJCXByaW50aygiV2FybmluZyEgTGluayBkb3duLlxuIik7CiAJfQogCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQzOworCiAJcmV0dXJuIDA7CitvdXQzOgorCWlmIChsb2NhbF9tb2RlID09IDEpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQobHAtPnBjaV9kZXYsIE1BWF9SSU5HU0laRSArIDB4MGYsIAorCQkJCSAgICBscC0+cGFnZV92YWRkcl9hbGduLCAKKwkJCQkgICAgdmlydF90b193aGF0ZXZlcihkZXYsIGxwLT5wYWdlX3ZhZGRyX2FsZ24pKTsKKwlpZiAobWVtX3B0cl92aXJ0KQorCQlpb3VubWFwKG1lbV9wdHJfdmlydCk7CiBvdXQyOgogCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOwogb3V0MToKLQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBUaGlzIHByb2NlZHVyZSBwdXRzIHRoZSBjYXJkIGludG8gYSBzdGFibGUgaW5pdCBzdGF0ZSAqLwpAQCAtMjg3NSwxOCArMjg4MiwxMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0MTsKIAotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MjsKLQkKICNpZmRlZiBIUDEwMF9ERUJVRwogCXByaW50aygiaHAxMDA6ICVzOiBFSVNBIGFkYXB0ZXIgZm91bmQgYXQgMHgleFxuIiwgZGV2LT5uYW1lLCAKIAkgICAgICAgZGV2LT5iYXNlX2FkZHIpOwogI2VuZGlmCiAJZ2VuZGV2LT5kcml2ZXJfZGF0YSA9IGRldjsKIAlyZXR1cm4gMDsKLSBvdXQyOgotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7CiAgb3V0MToKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBlcnI7CkBAIC0yOTUxLDE3ICsyOTUyLDEyIEBACiAJZXJyID0gaHAxMDBfcHJvYmUxKGRldiwgaW9hZGRyLCBIUDEwMF9CVVNfUENJLCBwZGV2KTsKIAlpZiAoZXJyKSAKIAkJZ290byBvdXQxOwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MjsKIAkKICNpZmRlZiBIUDEwMF9ERUJVRwogCXByaW50aygiaHAxMDA6ICVzOiBQQ0kgYWRhcHRlciBmb3VuZCBhdCAweCV4XG4iLCBkZXYtPm5hbWUsIGlvYWRkcik7CiAjZW5kaWYKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAlyZXR1cm4gMDsKLSBvdXQyOgotCXJlbGVhc2VfcmVnaW9uKGRldi0+YmFzZV9hZGRyLCBIUDEwMF9SRUdJT05fU0laRSk7CiAgb3V0MToKIAlmcmVlX25ldGRldihkZXYpOwogIG91dDA6CkBAIC0zMDMyLDE1ICszMDI4LDkgQEAKIAkJU0VUX01PRFVMRV9PV05FUihkZXYpOwogCiAJCWVyciA9IGhwMTAwX2lzYV9wcm9iZShkZXYsIGhwMTAwX3BvcnRbaV0pOwotCQlpZiAoIWVycikgewotCQkJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JCQlpZiAoIWVycikgCi0JCQkJaHAxMDBfZGV2bGlzdFtjYXJkcysrXSA9IGRldjsKLQkJCWVsc2UKLQkJCQlyZWxlYXNlX3JlZ2lvbihkZXYtPmJhc2VfYWRkciwgSFAxMDBfUkVHSU9OX1NJWkUpOwotCQl9Ci0KLQkJaWYgKGVycikKKwkJaWYgKCFlcnIpCisJCQlocDEwMF9kZXZsaXN0W2NhcmRzKytdID0gZGV2OworCQllbHNlCiAJCQlmcmVlX25ldGRldihkZXYpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaXJfa3RocmVhZC5jIGIvZHJpdmVycy9uZXQvaXJkYS9zaXJfa3RocmVhZC5jCmluZGV4IDE4Y2VhMTAuLmM2NTA1NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc2lyX2t0aHJlYWQuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3Npcl9rdGhyZWFkLmMKQEAgLTEzNSw4ICsxMzUsNyBAQAogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaXJkYV9ycV9xdWV1ZS5raWNrLCAmd2FpdCk7CiAKIAkJLyogbWFrZSBzd3N1c3AgaGFwcHkgd2l0aCBvdXIgdGhyZWFkICovCi0JCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJcnVuX2lyZGFfcXVldWUoKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMgYi9kcml2ZXJzL25ldC9pcmRhL3N0aXI0MjAwLmMKaW5kZXggNjZmNDg4Yy4uMTVmMjA3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zdGlyNDIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc3RpcjQyMDAuYwpAQCAtNzYzLDcgKzc2Myw3IEBACiAJewogI2lmZGVmIENPTkZJR19QTQogCQkvKiBpZiBzdXNwZW5kaW5nLCB0aGVuIHBvd2VyIG9mZiBhbmQgd2FpdCAqLwotCQlpZiAodW5saWtlbHkoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpKSB7CisJCWlmICh1bmxpa2VseShmcmVlemluZyhjdXJyZW50KSkpIHsKIAkJCWlmIChzdGlyLT5yZWNlaXZpbmcpCiAJCQkJcmVjZWl2ZV9zdG9wKHN0aXIpOwogCQkJZWxzZQpAQCAtNzcxLDcgKzc3MSw3IEBACiAKIAkJCXdyaXRlX3JlZyhzdGlyLCBSRUdfQ1RSTDEsIENUUkwxX1RYUFdEfENUUkwxX1JYUFdEKTsKIAotCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCQlyZWZyaWdlcmF0b3IoKTsKIAogCQkJaWYgKGNoYW5nZV9zcGVlZChzdGlyLCBzdGlyLT5zcGVlZCkpCiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pc2Etc2tlbGV0b24uYyBiL2RyaXZlcnMvbmV0L2lzYS1za2VsZXRvbi5jCmluZGV4IDUwYmViYjUuLjg4YWU4YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lzYS1za2VsZXRvbi5jCisrKyBiL2RyaXZlcnMvbmV0L2lzYS1za2VsZXRvbi5jCkBAIC0xNzYsMTIgKzE3Niw3IEBACiAJZXJyID0gZG9fbmV0Y2FyZF9wcm9iZShkZXYpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0MTsKIAlyZXR1cm4gZGV2Owotb3V0MToKLQljbGVhbnVwX2NhcmQoZGV2KTsKIG91dDoKIAlmcmVlX25ldGRldihkZXYpOwogCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0zMTYsNyArMzExLDE1IEBACiAKICAgICAgICAgZGV2LT50eF90aW1lb3V0CQk9ICZuZXRfdHhfdGltZW91dDsKICAgICAgICAgZGV2LT53YXRjaGRvZ190aW1lbwk9IE1ZX1RYX1RJTUVPVVQ7IAorCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKGVycikKKwkJZ290byBvdXQyOwogCXJldHVybiAwOworb3V0MjoKKyNpZmRlZiBqdW1wZXJlZF9kbWEKKwlmcmVlX2RtYShkZXYtPmRtYSk7CisjZW5kaWYKIG91dDE6CiAjaWZkZWYganVtcGVyZWRfaW50ZXJydXB0cwogCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwpAQCAtNjkxLDExICs2OTQsOCBAQAogCWRldi0+ZG1hICAgICAgID0gZG1hOwogCWRldi0+bWVtX3N0YXJ0ID0gbWVtOwogCWlmIChkb19uZXRjYXJkX3Byb2JlKGRldikgPT0gMCkgewotCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkKLQkJCXRoaXNfZGV2aWNlID0gZGV2OwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2xlYW51cF9jYXJkKGRldik7CisJCXRoaXNfZGV2aWNlID0gZGV2OworCQlyZXR1cm4gMDsKIAl9CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gLUVOWElPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKaW5kZXggMzVmNmE3Yy4uMDk3YjkwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCkBAIC00Nyw3ICs0Nyw5IEBACiAjZWxzZQogI2RlZmluZSBEUklWRVJOQVBJICItTkFQSSIKICNlbmRpZgotY2hhciBpeGdiX2RyaXZlcl92ZXJzaW9uW10gPSAiMS4wLjk1LWsyIkRSSVZFUk5BUEk7CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMC45NS1rMiJEUklWRVJOQVBJCitjaGFyIGl4Z2JfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogY2hhciBpeGdiX2NvcHlyaWdodFtdID0gIkNvcHlyaWdodCAoYykgMTk5OS0yMDA1IEludGVsIENvcnBvcmF0aW9uLiI7CiAKIC8qIGl4Z2JfcGNpX3RibCAtIFBDSSBEZXZpY2UgSUQgVGFibGUKQEAgLTE0MCw2ICsxNDIsNyBAQAogTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24sIDxsaW51eC5uaWNzQGludGVsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwoUikgUFJPLzEwR2JFIE5ldHdvcmsgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKIC8qIHNvbWUgZGVmaW5lcyBmb3IgY29udHJvbGxpbmcgZGVzY3JpcHRvciBmZXRjaGVzIGluIGgvdyAqLwogI2RlZmluZSBSWERDVExfUFRIUkVTSF9ERUZBVUxUIDEyOAkvKiBjaGlwIGNvbnNpZGVycyBwcmVmZWNoIGJlbG93IHRoaXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xhbmNlLmMgYi9kcml2ZXJzL25ldC9sYW5jZS5jCmluZGV4IGRlYzU1N2YuLmI0OTI5YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvbGFuY2UuYwpAQCAtMzU2LDExICszNTYsOCBAQAogCQlkZXYtPmJhc2VfYWRkciA9IGlvW3RoaXNfZGV2XTsKIAkJZGV2LT5kbWEgPSBkbWFbdGhpc19kZXZdOwogCQlpZiAoZG9fbGFuY2VfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl9sYW5jZVtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2xhbmNlW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJYnJlYWs7CkBAIC00NDgsMTIgKzQ0NSw3IEBACiAJZXJyID0gZG9fbGFuY2VfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtNzI0LDYgKzcxNiw5IEBACiAJZGV2LT50eF90aW1lb3V0ID0gbGFuY2VfdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKIAorCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2RtYTsKIAlyZXR1cm4gMDsKIG91dF9kbWE6CiAJaWYgKGRldi0+ZG1hICE9IDQpCkBAIC04NjcsNyArODYyLDcgQEAKIAkJbHAtPnJ4X3NrYnVmZltpXSA9IHNrYjsKIAkJaWYgKHNrYikgewogCQkJc2tiLT5kZXYgPSBkZXY7Ci0JCQlyeF9idWZmID0gc2tiLT50YWlsOworCQkJcnhfYnVmZiA9IHNrYi0+ZGF0YTsKIAkJfSBlbHNlCiAJCQlyeF9idWZmID0ga21hbGxvYyhQS1RfQlVGX1NaLCBHRlBfRE1BIHwgZ2ZwKTsKIAkJaWYgKHJ4X2J1ZmYgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYyBiL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYwppbmRleCA1ZTI2M2ZjLi40MWJhZDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCkBAIC01NTMsMTQgKzU1MywxNCBAQAogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlwYW5pYygiJXM6IGFsbG9jX3NrYigpIGZhaWxlZCIsIF9fRklMRV9fKTsKIAkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBza2ItPnRhaWwsUEtUX0JVRl9TWiwKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShscC0+ZGV2LCBza2ItPmRhdGEsUEtUX0JVRl9TWiwKIAkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwogCQlza2ItPmRldiA9IGRldjsKIAkJcmJkLT52X25leHQgPSByYmQrMTsKIAkJcmJkLT5iX25leHQgPSBXU1dBUHJiZCh2aXJ0X3RvX2RtYShscCxyYmQrMSkpOwogCQlyYmQtPmJfYWRkciA9IFdTV0FQcmJkKHZpcnRfdG9fZG1hKGxwLHJiZCkpOwogCQlyYmQtPnNrYiA9IHNrYjsKLQkJcmJkLT52X2RhdGEgPSBza2ItPnRhaWw7CisJCXJiZC0+dl9kYXRhID0gc2tiLT5kYXRhOwogCQlyYmQtPmJfZGF0YSA9IFdTV0FQY2hhcihkbWFfYWRkcik7CiAJCXJiZC0+c2l6ZSA9IFBLVF9CVUZfU1o7CiAJfQpAQCAtNzgzLDggKzc4Myw4IEBACiAJCQkJcnhfaW5fcGxhY2UgPSAxOwogCQkJCXJiZC0+c2tiID0gbmV3c2tiOwogCQkJCW5ld3NrYi0+ZGV2ID0gZGV2OwotCQkJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUobHAtPmRldiwgbmV3c2tiLT50YWlsLCBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOwotCQkJCXJiZC0+dl9kYXRhID0gbmV3c2tiLT50YWlsOworCQkJCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUobHAtPmRldiwgbmV3c2tiLT5kYXRhLCBQS1RfQlVGX1NaLCBETUFfRlJPTV9ERVZJQ0UpOworCQkJCXJiZC0+dl9kYXRhID0gbmV3c2tiLT5kYXRhOwogCQkJCXJiZC0+Yl9kYXRhID0gV1NXQVBjaGFyKGRtYV9hZGRyKTsKIAkJCQlDSEVDS19XQkFDS19JTlYocmJkLCBzaXplb2Yoc3RydWN0IGk1OTZfcmJkKSk7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sbmUzOTAuYyBiL2RyaXZlcnMvbmV0L2xuZTM5MC5jCmluZGV4IDE3OWE5N2MuLjI3ZjBkOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xuZTM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L2xuZTM5MC5jCkBAIC0xNjcsMTIgKzE2Nyw3IEBACiAJZXJyID0gZG9fbG5lMzkwX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTI5Niw3ICsyOTEsMTQgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byB1bm1hcDsKIAlyZXR1cm4gMDsKK3VubWFwOgorCWlmIChlaV9zdGF0dXMucmVnMCkKKwkJaW91bm1hcCgodm9pZCAqKWRldi0+bWVtX3N0YXJ0KTsKIGNsZWFudXA6CiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJcmV0dXJuIHJldDsKQEAgLTQyNiwxMSArNDI4LDggQEAKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKIAkJaWYgKGRvX2xuZTM5MF9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X2xuZVtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X2xuZVtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImxuZTM5MC5jOiBObyBMTkUzOTAgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjZS5jIGIvZHJpdmVycy9uZXQvbWFjZS5jCmluZGV4IDZlZDJkN2QuLjgxZDBhMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2UuYworKysgYi9kcml2ZXJzL25ldC9tYWNlLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG1hY2VfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hY2VfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICptYWNlID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTEwMDksMTIgKzEwMDksMTAgQEAKICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWFjZV9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtYWNlX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJtYWNlIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfY29kZS5oIGIvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKaW5kZXggODUxZWJhOC4uZTljNmU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9jb2RlLmgKQEAgLTQ3NzUsMTI4OCArNDc3NSw3IEBACiAvKiBUaGlzIGlzIHRoZSBMQU5haSBkYXRhICovIAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGxhbmFpNF9kYXRhX29mZiA9IDB4OTRGMDsgLyogaGFsZi13b3JkIG9mZnNldCAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFuYWk0X2RhdGFbMjA0NzJdIF9faW5pdGRhdGEgPSB7Ci0weDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDEsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgMHgwMCwweDAwLCAweDAwLDB4MDAsIAotMHgwMCwweDAwLCAweDAwLDB4MDAsIDB4MDAsMHgwMCwgfSA7CitzdGF0aWMgdW5zaWduZWQgY2hhciBsYW5haTRfZGF0YVsyMDQ3Ml0gX19pbml0ZGF0YTsKIAogCiAjaWZkZWYgU1lNQk9MX0RFRklORVNfQ09NUElMRUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5jIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKaW5kZXggYWFkNTQ5NC4uZjA5OTZjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMKQEAgLTM2OSw3ICszNjksNyBAQAogICogYXNzdW1lIDgwMi4zIGlmIHRoZSB0eXBlIGZpZWxkIGlzIHNob3J0IGVub3VnaCB0byBiZSBhIGxlbmd0aC4KICAqIFRoaXMgaXMgbm9ybWFsIHByYWN0aWNlIGFuZCB3b3JrcyBmb3IgYW55ICdub3cgaW4gdXNlJyBwcm90b2NvbC4KICAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG15cmlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBteXJpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoaGRyICpldGg7CiAJdW5zaWduZWQgY2hhciAqcmF3cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25hdHNlbWkuYyBiL2RyaXZlcnMvbmV0L25hdHNlbWkuYwppbmRleCBiYWJiNTllLi45ZDZkMjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uYXRzZW1pLmMKKysrIGIvZHJpdmVycy9uZXQvbmF0c2VtaS5jCkBAIC0xOTI2LDcgKzE5MjYsNyBAQAogCQkJCWJyZWFrOyAvKiBCZXR0ZXIgbHVjayBuZXh0IHJvdW5kLiAqLwogCQkJc2tiLT5kZXYgPSBkZXY7IC8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCW5wLT5yeF9kbWFbZW50cnldID0gcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsCi0JCQkJc2tiLT50YWlsLCBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJc2tiLT5kYXRhLCBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlucC0+cnhfcmluZ1tlbnRyeV0uYWRkciA9IGNwdV90b19sZTMyKG5wLT5yeF9kbWFbZW50cnldKTsKIAkJfQogCQlucC0+cnhfcmluZ1tlbnRyeV0uY21kX3N0YXR1cyA9IGNwdV90b19sZTMyKG5wLT5yeF9idWZfc3opOwpAQCAtMjI4MCw3ICsyMjgwLDcgQEAKIAkJCQkJYnVmbGVuLAogCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLAotCQkJCQlucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJCW5wLT5yeF9za2J1ZmZbZW50cnldLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAogCQkJCQlucC0+cnhfZG1hW2VudHJ5XSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMgYi9kcml2ZXJzL25ldC9uZS1oODMwMC5jCmluZGV4IDg0ZTI5MWUuLjhmNDAzNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25lLWg4MzAwLmMKKysrIGIvZHJpdmVycy9uZXQvbmUtaDgzMDAuYwpAQCAtMTgwLDEyICsxODAsNyBAQAogCWVyciA9IGRvX25lX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTMyNSw4ICszMjAsMTMgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOwotCXJldHVybiAwOwogCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXJxOworCXJldHVybiAwOworb3V0X2lycToKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIGVycl9vdXQ6CiAJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBORV9JT19FWFRFTlQpOwogCXJldHVybiByZXQ7CkBAIC02MzMsMTEgKzYzMyw4IEBACiAJCWVyciA9IGluaXRfcmVnX29mZnNldChkZXYsIGRldi0+YmFzZV9hZGRyKTsKIAkJaWYgKCFlcnIpIHsKIAkJCWlmIChkb19uZV9wcm9iZShkZXYpID09IDApIHsKLQkJCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7CisJCQkJY29udGludWU7CiAJCQl9CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25lLmMgYi9kcml2ZXJzL25ldC9uZS5jCmluZGV4IDQ5NjQzMzkuLjZjNTcwOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25lLmMKKysrIGIvZHJpdmVycy9uZXQvbmUuYwpAQCAtMjI5LDEyICsyMjksNyBAQAogCWVyciA9IGRvX25lX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTUzNCw4ICs1MjksMTQgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfaXJxOwogCXJldHVybiAwOwogCitvdXRfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogZXJyX291dDoKIAlyZWxlYXNlX3JlZ2lvbihpb2FkZHIsIE5FX0lPX0VYVEVOVCk7CiAJcmV0dXJuIHJldDsKQEAgLTgyNiwxMSArODI3LDggQEAKIAkJZGV2LT5tZW1fZW5kID0gYmFkW3RoaXNfZGV2XTsKIAkJZGV2LT5iYXNlX2FkZHIgPSBpb1t0aGlzX2Rldl07CiAJCWlmIChkb19uZV9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X25lW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlpZiAoZm91bmQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZTIuYyBiL2RyaXZlcnMvbmV0L25lMi5jCmluZGV4IDZlYmVmMjcuLjZkNjJhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25lMi5jCisrKyBiL2RyaXZlcnMvbmV0L25lMi5jCkBAIC0zMDEsMTIgKzMwMSw3IEBACiAJZXJyID0gZG9fbmUyX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTUxNyw3ICs1MTIsMTQgQEAKIAlkZXYtPnBvbGxfY29udHJvbGxlciA9IGVpX3BvbGw7CiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOworCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQxOwogCXJldHVybiAwOworb3V0MToKKwltY2Ffc2V0X2FkYXB0ZXJfcHJvY2ZuKCBlaV9zdGF0dXMucHJpdiwgTlVMTCwgTlVMTCk7CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBvdXQ6CiAJcmVsZWFzZV9yZWdpb24oYmFzZV9hZGRyLCBORV9JT19FWFRFTlQpOwogCXJldHVybiByZXR2YWw7CkBAIC03OTgsMTEgKzgwMCw4IEBACiAJCWRldi0+bWVtX2VuZCA9IGJhZFt0aGlzX2Rldl07CiAJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOwogCQlpZiAoZG9fbmUyX3Byb2JlKGRldikgPT0gMCkgewotCQkJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpID09IDApIHsKLQkJCQlkZXZfbmVbZm91bmQrK10gPSBkZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljbGVhbnVwX2NhcmQoZGV2KTsKKwkJCWRldl9uZVtmb3VuZCsrXSA9IGRldjsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyZWVfbmV0ZGV2KGRldik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUyay1wY2kuYyBiL2RyaXZlcnMvbmV0L25lMmstcGNpLmMKaW5kZXggYTFhNmMwOC4uZjFjMDFhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbmUyay1wY2kuYworKysgYi9kcml2ZXJzL25ldC9uZTJrLXBjaS5jCkBAIC02NjAsNiArNjYwLDcgQEAKIAogCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CiAKIAlyZXR1cm4gMDsKQEAgLTY3MSw2ICs2NzIsOCBAQAogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCAwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAlOUzgzOTBfaW5pdChkZXYsIDEpOwogCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvbnM4MzgyMC5jCmluZGV4IGMzMzZiNDYuLmU2NGRmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9uczgzODIwLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTU3Myw3ICs1NzQsNyBAQAogCiAJZGV2LT5yeF9pbmZvLm5leHRfZW1wdHkgPSAobmV4dF9lbXB0eSArIDEpICUgTlJfUlhfREVTQzsKIAljbWRzdHMgPSBSRUFMX1JYX0JVRl9TSVpFIHwgQ01EU1RTX0lOVFI7Ci0JYnVmID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wY2lfZGV2LCBza2ItPnRhaWwsCisJYnVmID0gcGNpX21hcF9zaW5nbGUoZGV2LT5wY2lfZGV2LCBza2ItPmRhdGEsCiAJCQkgICAgIFJFQUxfUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJYnVpbGRfcnhfZGVzYyhkZXYsIHNnLCAwLCBidWYsIGNtZHN0cywgMCk7CiAJLyogdXBkYXRlIGxpbmsgb2YgcHJldmlvdXMgcnggKi8KQEAgLTYwMyw3ICs2MDQsNyBAQAogCQlpZiAodW5saWtlbHkoIXNrYikpCiAJCQlicmVhazsKIAotCQlyZXMgPSAobG9uZylza2ItPnRhaWwgJiAweGY7CisJCXJlcyA9IChsb25nKXNrYi0+ZGF0YSAmIDB4ZjsKIAkJcmVzID0gMHgxMCAtIHJlczsKIAkJcmVzICY9IDB4ZjsKIAkJc2tiX3Jlc2VydmUoc2tiLCByZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvM2M1NzRfY3MuYwppbmRleCBjNmU4YjI1Zi4uNzFmZDQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTc0X2NzLmMKQEAgLTg2LDcgKzg2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTMxMiwxMSArMzExLDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQkJCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnRjNTc0X2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMTI4NiwxMyArMTI4MCwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgdGM1NzRfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTAxLCAweDA1NzQpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMCwgMHgwMTAxLCAweDA1NTYsICIzQ0NGRU01NTYuY2lzIiksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB0YzU3NF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgdGM1NzRfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiM2M1NzRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSB0YzU3NF9hdHRhY2gsCisJLmV2ZW50CQk9IHRjNTc0X2V2ZW50LAogCS5kZXRhY2gJCT0gdGM1NzRfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHRjNTc0X2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdGM1NzQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS8zYzU4OV9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKaW5kZXggODlhYmRkYS4uZDgzZmRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhLzNjNTg5X2NzLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjI2LDExICsyMjUsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdGM1ODlfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0xMDU3LDEzICsxMDUxLDI2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB0YzU4OV9pZHNbXSA9IHsKKwlQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTAxLCAweDA1NjIpLAorCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxKDAsICJNb3Rvcm9sYSBNQVJRVUlTIiwgMHhmMDNlNGU3NyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTAxLCAweDA1ODkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJGYXJhbGxvbiIsICJFTmV0IiwgMHg1OGQ5M2ZjNCwgMHg5OTJjMjIwMiksCisJUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRCgwLCAweDAxMDEsIDB4MDAzNSwgIjNDWEVNNTU2LmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMCwgMHgwMTAxLCAweDAwM2QsICIzQ1hFTTU1Ni5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHRjNTg5X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB0YzU4OV9kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICIzYzU4OV9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHRjNTg5X2F0dGFjaCwKKwkuZXZlbnQJCT0gdGM1ODlfZXZlbnQsCiAJLmRldGFjaAkJPSB0YzU4OV9kZXRhY2gsCisgICAgICAgIC5pZF90YWJsZSAgICAgICA9IHRjNTg5X2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdGM1ODkodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9heG5ldF9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKaW5kZXggODUzYjU4Ni4uOGJiNGU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2F4bmV0X2NzLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlICIuLi84MzkwLmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE4MSwxMSArMTgwLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF4bmV0X2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtODUwLDEzICs4NDQsNDMgQEAKICAgICBvdXRzdyhuaWNfYmFzZSArIEFYTkVUX0RBVEFQT1JULCBidWYsIGNvdW50Pj4xKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGF4bmV0X2lkc1tdID0geworCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxNmMsIDB4MDA4MSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMThhLCAweDAzMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2ZiwgMHgwMzAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwMyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjZmLCAweDAzMDkpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI3NCwgMHgxMTA2KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDhhMDEsIDB4YzFhYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTI0KCJGYXN0IEV0aGVybmV0IiwgIjE2LWJpdCBQQyBDYXJkIiwgIkFYODgxOTAiLCAweGI0YmUxNGUzLCAweDlhMTJlYjZhLCAweGFiOWJlNWVmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVNJWCIsICJBWDg4MTkwIiwgMHgwOTU5ODIzYiwgMHhhYjliZTVlZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkJpbGxpb250b24iLCAiTE5BLTEwMEIiLCAweDU1MmFiNjgyLCAweGJjM2I4N2UxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ0hFRVRBSCBFVEhFUkNBUkQiLCAiRU4yMjI4IiwgMHgwMGZhN2JjOCwgMHgwMGU5OTBjYyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNOZXQiLCAiQ05GMzAxIiwgMHhiYzQ3N2RkZSwgMHg3OGM1ZjQwYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgImNvcmVnYSBGRXRoZXIgUENDLVRYRCIsIDB4NTI2MTQ0MGYsIDB4NDM2NzY4YzUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICJjb3JlZ2EgRkV0aGVySUkgUENDLVRYRCIsIDB4NTI2MTQ0MGYsIDB4NzMwZGY3MmUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEeW5hbGluayIsICJMMTAwQzE2IiwgMHg1NTYzMmZkNSwgMHg2NmJjMmE5MCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiRXRoZXJGYXN0IDEwLzEwMCBQQyBDYXJkIChQQ01QQzEwMCBWMykiLCAweDA3MzNjYzgxLCAweDIzMjAxOWE4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUVMQ08iLCAiTFBDMy1UWCIsIDB4NDgxZTAwOTQsIDB4ZjkxYWY2MDkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiMTAwQkFTRSIsIDB4MjgxZjFjNWQsIDB4N2MyYWRkMDQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRmFzdEV0aGVyQ2FyZCIsIDB4MjgxZjFjNWQsIDB4N2VmMjYxMTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRkVQNTAxIiwgMHgyODFmMWM1ZCwgMHgyZTI3MjA1OCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTQoIk5ldHdvcmsgRXZlcnl3aGVyZSIsICJBWDg4MTkwIiwgMHg4MjBhNjdiNiwgIDB4YWI5YmU1ZWYpLAorCS8qIHRoaXMgaXMgbm90IHNwZWNpZmljIGVub3VnaCAqLworCS8qIFBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDIxYiwgMHgwMjAyKSwgKi8KKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGF4bmV0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBheG5ldF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJheG5ldF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGF4bmV0X2F0dGFjaCwKKwkuZXZlbnQJCT0gYXhuZXRfZXZlbnQsCiAJLmRldGFjaAkJPSBheG5ldF9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gYXhuZXRfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9heG5ldF9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2NvbTIwMDIwX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwppbmRleCA0Mjk0ZTFlLi5iOTM1NWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvY29tMjAwMjBfY3MuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FyY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbTIwMDIwLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIwMCwxMSArMTk5LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0gICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmNvbTIwMDIwX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDgzLDcgKzQ3NywxMSBAQAogICAgIHJldHVybiAwOwogfSAvKiBjb20yMDAyMF9ldmVudCAqLwogCi0KK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBjb20yMDAyMF9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ29udGVtcG9yYXJ5IENvbnRyb2wgU3lzdGVtcywgSW5jLiIsICJQQ00yMCBBcmNuZXQgQWRhcHRlciIsIDB4NTk5OTE2NjYsIDB4OTVkZmZmYWYpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBjb20yMDAyMF9pZHMpOwogCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgY29tMjAwMjBfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKQEAgLTQ5MSw3ICs0ODksOSBAQAogCQkubmFtZQk9ICJjb20yMDAyMF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGNvbTIwMDIwX2F0dGFjaCwKKwkuZXZlbnQJCT0gY29tMjAwMjBfZXZlbnQsCiAJLmRldGFjaAkJPSBjb20yMDAyMF9kZXRhY2gsCisJLmlkX3RhYmxlCT0gY29tMjAwMjBfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9jb20yMDAyMF9jcyh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKaW5kZXggMDQyNDg2NS4uOWQ4MTk3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEvZm12ajE4eF9jcy5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjg4LDExICsyODcsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmZm12ajE4eF9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTQzNSw3ICs0MjksOSBAQAogCQlwY21jaWFfZ2V0X3N0YXR1cyhoYW5kbGUsICZzdGF0dXMpOwogCQlpZiAoc3RhdHVzLkNhcmRTdGF0ZSAmIENTX0VWRU5UXzNWQ0FSRCkKIAkJICAgIGxpbmstPmNvbmYuVmNjID0gMzM7IC8qIGluc2VydGVkIGluIDMuM1Ygc2xvdCAqLwotCSAgICB9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KGJ1ZlsxXSkgPT0gUFJPRElEX1RES19HTjM0MTApIHsKKwkgICAgfSBlbHNlIGlmIChsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfR04zNDEwCisJCQl8fCBsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfTlA5NjEwCisJCQl8fCBsZTE2X3RvX2NwdShidWZbMV0pID09IFBST0RJRF9UREtfTU4zMjAwKSB7CiAJCS8qIE11bHRpRnVuY3Rpb24gQ2FyZCAqLwogCQlsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSAweDgwMDsKIAkJbGluay0+Y29uZi5Db25maWdJbmRleCA9IDB4NDc7CkBAIC03NjQsMTMgKzc2MCw0MCBAQAogICAgIHJldHVybiAwOwogfSAvKiBmbXZqMTh4X2V2ZW50ICovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBmbXZqMTh4X2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwNCwgMHgwMDA0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRUFHTEUgVGVjaG5vbG9neSIsICJORTIwMCBFVEhFUk5FVCBMQU4gTUJIMTAzMDIgMDQiLCAweDUyOGM4OGM0LCAweDc0ZjkxZTU5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRWlnZXIgTGFicyxJbmMiLCAiRVBYLTEwQlQgUEMgQ2FyZCBFdGhlcm5ldCAxMEJUIiwgMHg1M2FmNTU2ZSwgMHg4NzdmOTkyMiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVpZ2VyIGxhYnMsSW5jLiIsICJFUFgtMTBCVCBQQyBDYXJkIEV0aGVybmV0IDEwQlQiLCAweGY0N2U2YzY2LCAweDg3N2Y5OTIyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRlVKSVRTVSIsICJMQU4gQ2FyZChGTVYtSjE4MikiLCAweDZlZTVhM2Q4LCAweDViYWYzMWRiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRlVKSVRTVSIsICJNQkgxMDMwOCIsIDB4NmVlNWEzZDgsIDB4M2YwNDg3NWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJGVUpJVFNVIFRPV0EiLCAiTEE1MDEiLCAweGI4NDUxMTg4LCAweDEyOTM5YmEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSElUQUNISSIsICJIVC00ODQwLTExIiwgMHhmNGY0Mzk0OSwgMHg3NzM5MTBmNCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5leHRDb21LLksuIiwgIk5DNTMxMEIgVmVyMS4wICAgICAgICIsIDB4OGNlZjRkM2EsIDB4MDc1ZmM3YjYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJOZXh0Q29tSy5LLiIsICJOQzUzMTAgVmVyMS4wICAgICAgICAiLCAweDhjZWY0ZDNhLCAweGJjY2Y0M2U2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUkFUT0MgU3lzdGVtIEluYy4iLCAiMTBCQVNFX1QgQ0FSRCBSMjgwIiwgMHg4NWMxMGUxNywgMHhkOTQxMzY2NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRESyIsICJMQUMtQ0QwMngiLCAweDFlYWU5NDc1LCAweDhmYTBlZTcwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVERLIiwgIkxBQy1DRjAxMCIsIDB4MWVhZTk0NzUsIDB4NzY4M2JjOWEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIkNPTlRFQyBDby4sTHRkLiIsIDB4NThkOGZlZTIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIlBDTUNJQSBMQU4gTUJIMTAzMDQgIEVTIiwgMHgyNTk5ZjQ1NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiUENNQ0lBIE1CSDEwMzAyIiwgMHg4ZjQwMDVkYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiVUJLSyxWMi4wIiwgMHg5MDg4ODA4MCksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJUREsiLCAiR2xvYmFsTmV0d29ya2VyIDM0MTAvMzQxMiIsIDB4MWVhZTk0NzUsIDB4ZDlhOTNiZWQpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxMDUsIDB4MGQwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDEwNSwgMHgwZTBhKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGZtdmoxOHhfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGZtdmoxOHhfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiZm12ajE4eF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGZtdmoxOHhfYXR0YWNoLAorCS5ldmVudAkJPSBmbXZqMTh4X2V2ZW50LAogCS5kZXRhY2gJCT0gZm12ajE4eF9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gZm12ajE4eF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2ZtdmoxOHhfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9pYm10cl9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKaW5kZXggMzEwN2NjZi4uYjZjMTQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2libXRyX2NzLmMKQEAgLTU3LDcgKzU3LDYgQEAKICNpbmNsdWRlIDxsaW51eC90cmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2libXRyLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTExOSw5ICsxMTgsNiBAQAogCiBzdGF0aWMgZGV2X2xpbmtfdCAqZGV2X2xpc3Q7CiAKLWV4dGVybiBpbnQgaWJtdHJfcHJvYmVfY2FyZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiBpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHR5cGVkZWYgc3RydWN0IGlibXRyX2Rldl90IHsKQEAgLTE5MywxMSArMTg5LDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotICAgICAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgICAgIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0gICAgICAgIENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmlibXRyX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNTExLDEzICs1MDIsMjIgQEAKICAgICByZXR1cm47CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBpYm10cl9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiM0NvbSIsICJUb2tlbkxpbmsgVmVsb2NpdHkgUEMgQ2FyZCIsIDB4NDEyNDBlNWIsIDB4ODJjMzczNGUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJQk0iLCAiVE9LRU4gUklORyIsIDB4YjU2OWE2ZTUsIDB4YmY4ZWVkNDcpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgaWJtdHJfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGlibXRyX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImlibXRyX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gaWJtdHJfYXR0YWNoLAorCS5ldmVudAkJPSBpYm10cl9ldmVudCwKIAkuZGV0YWNoCQk9IGlibXRyX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBpYm10cl9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2libXRyX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMgYi9kcml2ZXJzL25ldC9wY21jaWEvbm1jbGFuX2NzLmMKaW5kZXggNDYwMzgwNy4uZGJiOTQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL25tY2xhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9ubWNsYW5fY3MuYwpAQCAtMTQ2LDcgKzE0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNyZWcuaD4KQEAgLTUwMiwxMSArNTAxLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm5tY2xhbl9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTE2NzUsMTMgKzE2NjksMjIgQEAKIAogfSAvKiBzZXRfbXVsdGljYXN0X2xpc3QgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIG5tY2xhbl9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmV3IE1lZGlhIENvcnBvcmF0aW9uIiwgIkV0aGVybmV0IiwgMHgwODVhODUwYiwgMHgwMGIyZTk0MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBvcnRhYmxlIEFkZC1vbnMiLCAiRXRoZXJuZXQiLCAweDBlYmYxZDYwLCAweDAwYjJlOTQxKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIG5tY2xhbl9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbm1jbGFuX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gIm5tY2xhbl9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IG5tY2xhbl9hdHRhY2gsCisJLmV2ZW50CQk9IG5tY2xhbl9ldmVudCwKIAkuZGV0YWNoCQk9IG5tY2xhbl9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gbm1jbGFuX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbm1jbGFuX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvcGNuZXRfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCmluZGV4IDE4MWI2ZWQuLmUxNjY0YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9wY25ldF9jcy5jCkBAIC00MCw3ICs0MCw2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8Li4vZHJpdmVycy9uZXQvODM5MC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yNzYsMTEgKzI3NSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZwY25ldF9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTExNTUsMTEgKzExNDksMTMgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBlaV9pcnFfd3JhcHBlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7Ci0gICAgcGNuZXRfZGV2X3QgKmluZm8gPSBQUklWKGRldik7CisgICAgcGNuZXRfZGV2X3QgKmluZm87CiAgICAgaXJxcmV0dXJuX3QgcmV0ID0gZWlfaW50ZXJydXB0KGlycSwgZGV2X2lkLCByZWdzKTsKIAotICAgIGlmIChyZXQgPT0gSVJRX0hBTkRMRUQpCisgICAgaWYgKHJldCA9PSBJUlFfSEFORExFRCkgeworCSAgICBpbmZvID0gUFJJVihkZXYpOwogCSAgICBpbmZvLT5zdGFsZSA9IDA7CisgICAgfQogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTEzNTAsNyArMTM0Niw3IEBACiAgICAgaWYgKGNvdW50ICYgMHgwMSkKIAlidWZbY291bnQtMV0gPSBpbmIobmljX2Jhc2UgKyBQQ05FVF9EQVRBUE9SVCksIHhmZXJfY291bnQrKzsKIAotICAgIC8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisgICAgLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUgYmVlbgogICAgICAgIGVuY291bnRlcmluZyBwcm9ibGVtcyB0aGF0IGl0IGlzIHN0aWxsIGhlcmUuICovCiAjaWZkZWYgUENNQ0lBX0RFQlVHCiAgICAgaWYgKGVpX2RlYnVnID4gNCkgewkJLyogRE1BIHRlcm1pbmF0aW9uIGFkZHJlc3MgY2hlY2suLi4gKi8KQEAgLTE0MjQsNyArMTQyMCw3IEBACiAgICAgZG1hX3N0YXJ0ID0gamlmZmllczsKIAogI2lmZGVmIFBDTUNJQV9ERUJVRwotICAgIC8qIFRoaXMgd2FzIGZvciB0aGUgQUxQSEEgdmVyc2lvbiBvbmx5LCBidXQgZW5vdWdoIHBlb3BsZSBoYXZlCisgICAgLyogVGhpcyB3YXMgZm9yIHRoZSBBTFBIQSB2ZXJzaW9uIG9ubHksIGJ1dCBlbm91Z2ggcGVvcGxlIGhhdmUgYmVlbgogICAgICAgIGVuY291bnRlcmluZyBwcm9ibGVtcyB0aGF0IGl0IGlzIHN0aWxsIGhlcmUuICovCiAgICAgaWYgKGVpX2RlYnVnID4gNCkgewkvKiBETUEgdGVybWluYXRpb24gYWRkcmVzcyBjaGVjay4uLiAqLwogCWludCBhZGRyLCB0cmllcyA9IDIwOwpAQCAtMTYzNSwxMyArMTYzMSwyMTcgQEAKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBwY25ldF9pZHNbXSA9IHsKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMDU3LCAweDAwMjEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxMDQsIDB4MDAwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDEwNSwgMHhlYTE1KSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTQzLCAweDMzNDEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxNDMsIDB4YzBhYiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDIxYiwgMHgwMTAxKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwOGExLCAweGMwYWIpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiQW55Q29tIiwgIkZhc3QgRXRoZXJuZXQgIiwgMHg1NzhiYTZlNywgMHgwMmQ5MmQxZSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJELUxpbmsiLCAiRE1FMzM2VCIsIDB4MWE0MjRhMWMsIDB4YjIzODk3ZmYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiR3JleSBDZWxsIiwgIkdDUzMwMDAiLCAweDJhMTUxZmFjLCAweDQ4YjkzMmFlKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIkxpbmtzeXMiLCAiRXRoZXJGYXN0IDEwJjEwMCArIDU2SyBQQyBDYXJkIChQQ01MTTU2KSIsIDB4MDczM2NjODEsIDB4YjM3NjUwMzMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiTElOS1NZUyIsICJQQ01MTTMzNiIsIDB4ZjdjYjBiMDcsIDB4N2E4MjFiNTgpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiUENNQ0lBcyIsICJDb21ib0NhcmQiLCAweGRjZmUxMmQzLCAweGNkODkwNmNjKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIlBDTUNJQXMiLCAiTGFuTW9kZW0iLCAweGRjZmUxMmQzLCAweGM2N2M2NDhmKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIklCTSIsICJIb21lIGFuZCBBd2F5IDI4LjggUEMgQ2FyZCAgICAgICAiLCAweGI1NjlhNmU1LCAweDViZDRmZjJjKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIklCTSIsICJIb21lIGFuZCBBd2F5IENyZWRpdCBDYXJkIEFkYXB0ZXIiLCAweGI1NjlhNmU1LCAweDRiZGYxNWMzKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIklCTSIsICJ3OTUgSG9tZSBhbmQgQXdheSBDcmVkaXQgQ2FyZCAiLCAweGI1NjlhNmU1LCAweGFlOTExYzE1KSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIzKDAsICJBUEVYIERBVEEiLCAiTVVMVElDQVJEIiwgIkVUSEVSTkVULU1PREVNIiwgMHgxMWMyZGEwOSwgMHg3Mjg5ZGM1ZCwgMHhhYWQ5NWUxZiksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDIoMCwgIkZBWC9Nb2RlbS9FdGhlcm5ldCBDb21ibyBDYXJkICIsIDB4MWVkNTkzMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDA1NywgMHgxMDA0KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDQsIDB4MDAwZCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTA0LCAweDAwNzUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwNCwgMHgwMTQ1KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNDksIDB4MDIzMCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTQ5LCAweDQ1MzApLAorLyoJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTQ5LCAweGMxYWIpLCBjb25mbGljdCB3aXRoIGF4bmV0X2NzICovCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTg2LCAweDAxMTApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFiZiwgMHgyMzI4KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxYmYsIDB4ODA0MSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjEzLCAweDI0NTIpLAorLyoJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjFiLCAweDAyMDIpLCBjb25mbGljdCB3aXRoIGF4bmV0X2NzICovCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjZmLCAweDAzMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2ZiwgMHgwMzA3KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwYSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDExMDMpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI3NCwgMHgxMTIxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiMjQwOExBTiIsICJFdGhlcm5ldCIsIDB4MzUyZmZmN2YsIDB4MDBiMmU5NDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiQ2FyZHdlbGwiLCAiUENNQ0lBIiwgIkVUSEVSTkVUIiwgMHg5NTMzNjcyZSwgMHgyODFmMWM1ZCwgMHgzZmY3MTc1YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJDTmV0ICAiLCAiQ04zMEJDIiwgIkVUSEVSTkVUIiwgMHg5ZmU1NWQzZCwgMHg4NTYwMTE5OCwgMHgzZmY3MTc1YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJEaWdpdGFsIiwgIkV0aGVybmV0IiwgIkFkYXB0ZXIiLCAweDk5OTlhYjM1LCAweDAwYjJlOTQxLCAweDRiMGQ4MjllKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkVkaW1heCBUZWNobm9sb2d5IEluYy4iLCAiUENNQ0lBIiwgIkV0aGVybmV0IENhcmQiLCAweDczOGEwMDE5LCAweDI4MWYxYzVkLCAweDVlOWQ5MmMwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkVGQSAgICIsICJFRkEyMDciLCAiRVRIRVJORVQiLCAweDNkMjk0YmU0LCAweGViOWFhYjZjLCAweDNmZjcxNzViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkktTyBEQVRBIiwgIlBDTEEiLCAiRVRIRVJORVQiLCAweDFkNTVkN2VjLCAweGU0YzY0ZDM0LCAweDNmZjcxNzViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIklPIERBVEEiLCAiUENMQVRFIiwgIkVUSEVSTkVUIiwgMHg1NDdlNjZkYywgMHg2YjI2MDc1MywgMHgzZmY3MTc1YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJLaW5nTWF4IFRlY2hub2xvZ3kgSW5jLiIsICJFTjEwLVQyIiwgIlBDTUNJQSBFdGhlcm5ldCBDYXJkIiwgMHg5MzJiNzE4OSwgMHg2OTllNDQzNiwgMHg2ZjY2NTJlMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJQQ01DSUEiLCAiUENNQ0lBLUVUSEVSTkVULUNBUkQiLCAiVUUyMjE2IiwgMHgyODFmMWM1ZCwgMHhkNGNkMmYyMCwgMHhiODdhZGQ4MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJQQ01DSUEiLCAiUENNQ0lBLUVUSEVSTkVULUNBUkQiLCAiVUUyNjIwIiwgMHgyODFmMWM1ZCwgMHhkNGNkMmYyMCwgMHg3ZDNkODNhOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiMjQxMkxBTiIsIDB4NjdmMjM2YWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBQ0NUT04iLCAiRU4yMjEyIiwgMHhkZmM2YjViMiwgMHhjYjExMmExMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFDQ1RPTiIsICJFTjIyMTYtUENNQ0lBLUVUSEVSTkVUIiwgMHhkZmM2YjViMiwgMHg1NTQyYmZmZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFsbGllZCBUZWxlc2lzLCBLLksuIiwgIkNlbnRyZUNPTSBMQTEwMC1QQ00tVCBWMiAxMDAvMTBNIExBTiBQQyBDYXJkIiwgMHhiYjdmYmRkNywgMHhjZDkxY2M2OCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFsbGllZCBUZWxlc2lzLCBLLksuIiwgIkNlbnRyZUNPTSBMQS1QQ00iLCAweGJiN2ZiZGQ3LCAweDViYTEwZDQ5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQWxsaWVkIFRlbGVzaXMgSy5LLiIsICJMQTEwMC1QQ00gVjIiLCAweDM2NjM0YTY2LCAweGM2ZDA1OTk3KSwKKyAgCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbGxpZWQgVGVsZXNpcywgSy5LLiIsICJDZW50cmVDT00gTEEtUENNX1YyIiwgMHhiYjdmQmRkNywgMHgyOGUyOTlmOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFsbGllZCBUZWxlc2lzIEsuSy4iLCAiTEEtUENNIFYzIiwgMHgzNjYzNGE2NiwgMHg2MjI0MWQ5NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFtYmlDb20iLCAiQU1CODAxMCIsIDB4NTA3MGE3ZjksIDB4ODJmOTZlOTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbWJpQ29tIiwgIkFNQjg2MTAiLCAweDUwNzBhN2Y5LCAweDg2NzQxMjI0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQW1iaUNvbSBJbmMiLCAiQU1CODAwMiIsIDB4OTNiMTU1NzAsIDB4NzVlYzNlZmIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbWJpQ29tIEluYyIsICJBTUI4MDAyVCIsIDB4OTNiMTU1NzAsIDB4NDYxYzUyNDcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBbWJpQ29tIEluYyIsICJBTUI4MDEwIiwgMHg5M2IxNTU3MCwgMHg4MmY5NmU5NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkFueUNvbSIsICJFQ08gRXRoZXJuZXQiLCAweDU3OGJhNmU3LCAweDBhOTg4OGMxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQW55Q29tIiwgIkVDTyBFdGhlcm5ldCAxMC8xMDAiLCAweDU3OGJhNmU3LCAweDkzOWZlZGJkKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVJPV0FOQSIsICJQQ01DSUEgRXRoZXJuZXQgTEFOIENhcmQiLCAweDMxM2FkYmM4LCAweDA4ZDlmMTkwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVNBTlRFIiwgIkZyaWVuZGx5TmV0IFBDIENhcmQiLCAweDNhN2FkZTBmLCAweDQxYzY0NTA0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQmlsbGlvbnRvbiIsICJMTlQtMTBUQiIsIDB4NTUyYWI2ODIsIDB4ZWViMWJhNmEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDRiIsICIxMEJhc2UtRXRoZXJuZXQiLCAweDQ0ZWJmODYzLCAweDkzYWU0ZDc5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ05ldCIsICJDTjQwQkMgRXRoZXJuZXQiLCAweGJjNDc3ZGRlLCAweGZiYTc3NWE3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ09NUFUtU0hBQ0siLCAiQkFTRWxpbmUgUENNQ0lBIDEwIE1CaXQgRXRoZXJuZXRhZGFwdGVyIiwgMHhmYTJlNDI0ZCwgMHhlOTE5MGQ4YSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNPTVBVLVNIQUNLIiwgIkZBU1RsaW5lIFBDTUNJQSAxMC8xMDAgRmFzdC1FdGhlcm5ldCIsIDB4ZmEyZTQyNGQsIDB4Mzk1M2Q5YjkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDT05URUMiLCAiQy1ORVQoUEMpQy0xMEwiLCAweDIxY2FiNTUyLCAweGY2ZjkwNzIyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIiwgIkZFdGhlciBQQ0MtVFhGIiwgMHgwYTIxNTAxYSwgMHhhNTE1NjRhMiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgImNvcmVnYSBFdGhlcklJIFBDQy1UIiwgMHg1MjYxNDQwZiwgMHhmYTlkODViZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNvcmVnYSBLLksuIiwgImNvcmVnYSBFdGhlcklJIFBDQy1URCIsIDB4ZDRmZGNiZDgsIDB4YzQ5YmQ3M2QpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICJjb3JlZ2EgRXRoZXIgUENDLVQiLCAweDUyNjE0NDBmLCAweDY3MDVmY2FhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhIEsuSy4iLCAiY29yZWdhIEZhc3RFdGhlciBQQ0MtVFgiLCAweDUyNjE0NDBmLCAweDQ4NWU4NWQ5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ29yZWdhLEsuSy4iLCAiRXRoZXJuZXQgTEFOIENhcmQiLCAweDExMGQyNmQ5LCAweDlmZDJmMGEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiY29yZWdhLEsuSy4iLCAiRXRoZXJuZXQgTEFOIENhcmQiLCAweDk3OTFhOTBlLCAweDlmZDJmMGEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ291cGxlcmxlc3NQQ01DSUEiLCAiMTAwQkFTRSIsIDB4ZWU1YWYwYWQsIDB4N2MyYWRkMDQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDeVEndmUiLCAiRUxBLTAxMCIsIDB4NzcwMDg5NzksIDB4OWQ4ZDQ0NWQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDeVEndmUiLCAiRUxBLTExMEUgMTAvMTAwTSBMQU4gQ2FyZCIsIDB4NzcwMDg5NzksIDB4ZmQxODQ4MTQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEYXRhVHJlay4iLCAiTmV0Q2FyZCAiLCAweDVjZDY2ZDlkLCAweDg0Njk3Y2UwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRGF5bmEgQ29tbXVuaWNhdGlvbnMsIEluYy4iLCAiQ29tbXVuaUNhcmQgRSIsIDB4MGM2MjkzMjUsIDB4YjRlN2RiYWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJEaWdpY29tIiwgIlBhbGxhZGlvIExBTiAxMC8xMDAiLCAweDY5NzQwM2Q4LCAweGUxNjBiOTk1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRGlnaWNvbSIsICJQYWxsYWRpbyBMQU4gMTAvMTAwIERvbmdsZXNzIiwgMHg2OTc0MDNkOCwgMHhhNmQzYjIzMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRJR0lUQUwiLCAiREVQQ00tWFgiLCAweDY5NjE2Y2IzLCAweGU2MDBlNzZlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRC1MaW5rIiwgIkRFLTY1MCIsIDB4MWE0MjRhMWMsIDB4ZjI4YzgzOTgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJELUxpbmsiLCAiREUtNjYwIiwgMHgxYTQyNGExYywgMHhkOWExZDA1YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkQtTGluayIsICJERkUtNjUwIiwgMHgxYTQyNGExYywgMHgwZjAwNzNmOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkR1YWwgU3BlZWQiLCAiMTAvMTAwIFBDIENhcmQiLCAweDcyNWI4NDJkLCAweGYxZWZlZTg0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRHVhbCBTcGVlZCIsICIxMC8xMDAgUG9ydCBBdHRhY2hlZCBQQyBDYXJkIiwgMHg3MjViODQyZCwgMHgyZGIxZjhlOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkR5bmFsaW5rIiwgIkwxMEJDIiwgMHg1NTYzMmZkNSwgMHhkYzY1ZjJiMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRZTkFMSU5LIiwgIkwxMEJDIiwgMHg2YTI2ZDFjZiwgMHhkYzY1ZjJiMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRZTkFMSU5LIiwgIkwxMEMiLCAweDZhMjZkMWNmLCAweGM0Zjg0ZWZiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRS1DQVJEIiwgIkUtQ0FSRCIsIDB4NjcwMWRhMTEsIDB4NjcwMWRhMTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFSUdFUiBMYWJzIEluYy4iLCAiRXRoZXJuZXQgMTBCYXNlVCBjYXJkIiwgMHg1M2M4NjRjNiwgMHhlZGQwNTlmNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkVJR0VSIExhYnMgSW5jLiIsICJFdGhlcm5ldCBDb21ibyBjYXJkIiwgMHg1M2M4NjRjNiwgMHg5MjljNDg2YyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkV0aGVybmV0IiwgIkFkYXB0ZXIiLCAweDAwYjJlOTQxLCAweDRiMGQ4MjllKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRXRoZXJuZXQgQWRhcHRlciIsICJFMjAwMCBQQ01DSUEgRXRoZXJuZXQiLCAweDk2NzY3MzAxLCAweDcxZmJiYzYxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRXRoZXJuZXQgUENNQ0lBIGFkYXB0ZXIiLCAiRVAtMjEwIiwgMHg4ZGQ4NjE4MSwgMHhmMmI1MjUxNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkZhc3QgRXRoZXJuZXQiLCAiQWRhcHRlciIsIDB4YjRiZTE0ZTMsIDB4NGIwZDgyOWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJHcmV5IENlbGwiLCAiR0NTMjAwMCIsIDB4MmExNTFmYWMsIDB4ZjAwNTU1Y2IpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJHcmV5IENlbGwiLCAiR0NTMjIyMCIsIDB4MmExNTFmYWMsIDB4YzFiN2UzMjcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJHVkMiLCAiTklDLTIwMDBwIiwgMHg3NmUxNzFiZCwgMHg2ZWIxYzk0NyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSBDb3JwLiIsICJFdGhlcm5ldCIsIDB4ZTM3MzZjODgsIDB4MDBiMmU5NDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJQy1DQVJEIiwgIklDLUNBUkQiLCAweDYwY2IwOWE2LCAweDYwY2IwOWE2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU8gREFUQSIsICJQQ0VUVFgiLCAweDU0N2U2NmRjLCAweDZmYzU0NTliKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiaVBvcnQiLCAiMTAvMTAwIEV0aGVybmV0IENhcmQiLCAweDU2YzUzOGQyLCAweDExYjBmZmMwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS0FOU0FJIEVMRUNUUklDIENPLixMVEQiLCAiS0xBLVBDTS9UIiwgMHhiMThkYzNiNCwgMHhjYzUxYTk1NiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIktDSSIsICJQRTUyMCBQQ01DSUEgRXRoZXJuZXQgQWRhcHRlciIsIDB4YTg5Yjg3ZDMsIDB4MWViODhlNjQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJLSU5HTUFYIiwgIkVOMTBUMlQiLCAweDdiY2I0NTlhLCAweGE1YzgxZmE1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS2luZ3N0b24iLCAiS05FLVBDMiIsIDB4MTEyOGU2MzMsIDB4Y2UyYTg5YjMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJLaW5nc3RvbiBUZWNobm9sb2d5IENvcnAuIiwgIkV0aGVSeCBQQyBDYXJkIEV0aGVybmV0IEFkYXB0ZXIiLCAweDMxM2M3YmUzLCAweDBhZmI1NGEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGFuZWVkIiwgIkxELTEwLzEwMENEIiwgMHgxYjc4MjdiMiwgMHhjZGE3MWQxYyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxhbmVlZCIsICJMRC1DREYiLCAweDFiNzgyN2IyLCAweGZlYzcxZTQwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGFuZWVkIiwgIkxELUNETC9UIiwgMHgxYjc4MjdiMiwgMHg3OWZiYTRmNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxhbmVlZCIsICJMRC1DRFMiLCAweDFiNzgyN2IyLCAweDkzMWFmYWFiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGlua3N5cyIsICJDb21ibyBQQ01DSUEgRXRoZXJuZXRDYXJkIChFQzJUKSIsIDB4MDczM2NjODEsIDB4MzJlZThjNzgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMSU5LU1lTIiwgIkUtQ0FSRCIsIDB4ZjdjYjBiMDcsIDB4NjcwMWRhMTEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMaW5rc3lzIiwgIkV0aGVyRmFzdCAxMC8xMDAgSW50ZWdyYXRlZCBQQyBDYXJkIChQQ00xMDApIiwgMHgwNzMzY2M4MSwgMHg0NTNjM2Y5ZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkxpbmtzeXMiLCAiRXRoZXJGYXN0IDEwLzEwMCBQQyBDYXJkIChQQ01QQzEwMCkiLCAweDA3MzNjYzgxLCAweDY2YzVhMzg5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTGlua3N5cyIsICJFdGhlckZhc3QgMTAvMTAwIFBDIENhcmQgKFBDTVBDMTAwIFYyKSIsIDB4MDczM2NjODEsIDB4M2EzYjI4ZTkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMaW5rc3lzIiwgIkhvbWVMaW5rIFBob25lbGluZSAiLCAweDA3MzNjYzgxLCAweDVlMDdjZmEwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTG9naXRlYyIsICJMUE0tTE4xMDBUWCIsIDB4ODhmY2RlZGEsIDB4NmQ3NzI3MzcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMb2dpdGVjIiwgIkxQTS1MTjIwVCIsIDB4ODhmY2RlZGEsIDB4ODEwOTA5MjIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJMT05HU0hJTkUiLCAiUENNQ0lBIEV0aGVybmV0IENhcmQiLCAweGY4NjZiMGIwLCAweDZmNjY1MmUwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUFDTklDQSIsICJNRTEtSkVJREEiLCAweDIwODQxYjY4LCAweGFmOGEzNTc4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTWFjc2Vuc2UiLCAiTVBDLTEwIiwgMHhkODMwMjk3ZiwgMHhkMjY1YzMwNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1hdHN1c2hpdGEgRWxlY3RyaWMgSW5kdXN0cmlhbCBDby4sTFRELiIsICJDRi1WRUwyMTEiLCAweDQ0NDQ1Mzc2LCAweDhkZWQ0MWQ0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUFYVEVDSCIsICJQQ04yMDAwIiwgMHg3OGQ2NGJjMCwgMHhjYTBjYTRiOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1FTENPIiwgIkxQQzItVCIsIDB4NDgxZTAwOTQsIDB4YTJlYjBjZjMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNRUxDTyIsICJMUEMyLVRYIiwgMHg0ODFlMDA5NCwgMHg0MWE2OTE2YyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1pY3JvY29tIEMuRS4iLCAiVHJhdmVsIENhcmQgTEFOIDEwLzEwMCIsIDB4NGI5MWNlYzcsIDB4ZTcwMjIwZDYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNaWNyb2R5bmUiLCAiTkU0MjAwIiwgMHgyZTZkYTU5YiwgMHgwNDc4ZTQ3MiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1JRE9SSSBFTEVDLiIsICJMVC1QQ01UIiwgMHg2NDhkNTVjMSwgMHhiZGU1MjZjNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5hdGlvbmFsIFNlbWljb25kdWN0b3IiLCAiSW5mb01vdmVyIDQxMDAiLCAweDM2ZTExOTFmLCAweDYwYzIyOWI5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciIsICJJbmZvTW92ZXIgTkU0MTAwIiwgMHgzNmUxMTkxZiwgMHhhNjYxN2VjOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5FQyIsICJQQy05ODAxTi1KMTIiLCAweDE4ZGYwYmEwLCAweGJjOTEyZDc2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTkVUR0VBUiIsICJGQTQxMFRYIiwgMHg5YWE3OWRjMywgMHg2MGU1YmMwZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5FVEdFQVIiLCAiRkE0MTEiLCAweDlhYTc5ZGMzLCAweDQwZmFkODc1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmV0d29yayBFdmVyeXdoZXJlIiwgIkZhc3QgRXRoZXJuZXQgMTAvMTAwIFBDIENhcmQiLCAweDgyMGE2N2I2LCAweDMxZWQxYTVmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTmV4dENvbSBLLksuIiwgIk5leHQgSGF3ayIsIDB4YWVkYWVjNzQsIDB4YWQwNTBlZjEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiMTAvMTAwTWJwcyBFdGhlcm5ldCBDYXJkIiwgMHgyODFmMWM1ZCwgMHg2ZTQxNzczYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJFdGhlcm5ldCIsIDB4MjgxZjFjNWQsIDB4MDBiMmU5NDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRVRIRVJORVQiLCAweDI4MWYxYzVkLCAweDNmZjcxNzViKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIkV0aGVybmV0IDEwQmFzZVQgQ2FyZCIsIDB4MjgxZjFjNWQsIDB4NGRlMmY2YzgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRXRoZXJuZXQgQ2FyZCIsIDB4MjgxZjFjNWQsIDB4NWU5ZDkyYzApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRXRoZXJuZXQgQ29tYm8gY2FyZCIsIDB4MjgxZjFjNWQsIDB4OTI5YzQ4NmMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRVRIRVJORVQgVjEuMCIsIDB4MjgxZjFjNWQsIDB4NGQ4ODE3YzgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRmFzdEV0aGVybmV0IiwgMHgyODFmMWM1ZCwgMHhmZTg3MWVlYiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJGYXN0LUV0aGVybmV0IiwgMHgyODFmMWM1ZCwgMHg0NWYxZjNiNCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICJGQVNUIEVUSEVSTkVUIENBUkQiLCAweDI4MWYxYzVkLCAweGVjNWRiY2E3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIExBTiIsICJFdGhlcm5ldCIsIDB4NzUwMGUyNDYsIDB4MDBiMmU5NDEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiTE5ULTEwVE4iLCAweDI4MWYxYzVkLCAweGU3MDdmNjQxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBcyIsICJDb21ib0NhcmQiLCAweGRjZmUxMmQzLCAweGNkODkwNmNjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUENNQ0lBIiwgIlVFMjIxMiIsIDB4MjgxZjFjNWQsIDB4YmYxNzE5OWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiICAgIEV0aGVybmV0IE5FMjAwMCBDb21wYXRpYmxlIiwgMHgyODFmMWM1ZCwgMHg0MmQ1ZDdlMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBSRVRFQyIsICJFdGhlcm5ldCBDb21wYWN0TEFOIDEwYmFzZVQgMy4zViIsIDB4ZWJmOTExNTUsIDB4MzAwNzRjODApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQUkVURUMiLCAiRXRoZXJuZXQgQ29tcGFjdExBTiAxMEJhc2VUIDMuM1YiLCAweGViZjkxMTU1LCAweDdmNWE0ZjUwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUHNpb24gRGFjb20iLCAiR29sZCBDYXJkIEV0aGVybmV0IiwgMHhmNWYwMjVjMiwgMHgzYTMwZTExMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIj1SRUxJQT09IiwgIkV0aGVybmV0IiwgMHhjZGQwNjQ0YSwgMHgwMGIyZTk0MSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlJQIiwgIjE2MjVCIEV0aGVybmV0IE5FMjAwMCBDb21wYXRpYmxlIiwgMHhlM2U2NmUyMiwgMHhiOTYxNTBkZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlJQVEkiLCAiRVA0MDAgRXRoZXJuZXQgTkUyMDAwIENvbXBhdGlibGUiLCAweGRjNmY4OGZkLCAweDRhN2UyYWUwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUlBUSSIsICJFUDQwMSBFdGhlcm5ldCBORTIwMDAgQ29tcGF0aWJsZSIsIDB4ZGM2Zjg4ZmQsIDB4NGJjYmQ3ZmQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJSUFRJIExURC4iLCAiRVA0MDAiLCAweGM1M2FjNTE1LCAweDgxZTM5Mzg4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU0NNIiwgIkV0aGVybmV0IENvbWJvIGNhcmQiLCAweGJkYzNiMTAyLCAweDkyOWM0ODZjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU2Vpa28gRXBzb24gQ29ycC4iLCAiRXRoZXJuZXQiLCAweDA5OTI4NzMwLCAweDAwYjJlOTQxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU01DIiwgIkVaQ2FyZC0xMC1QQ01DSUEiLCAweGM0ZjhiMThiLCAweGZiMjFkMjY1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU29ja2V0IENvbW11bmljYXRpb25zIEluYyIsICJTb2NrZXQgRUEgUENNQ0lBIExBTiBBZGFwdGVyIFJldmlzaW9uIEQiLCAweGM3MGE0NzYwLCAweDJhZGU0ODNlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU29ja2V0IENvbW11bmljYXRpb25zIEluYyIsICJTb2NrZXQgRUEgUENNQ0lBIExBTiBBZGFwdGVyIFJldmlzaW9uIEUiLCAweGM3MGE0NzYwLCAweDVkZDk3OGE4KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVERLIiwgIkxBSy1DRDAzMSBmb3IgUENNQ0lBIiwgMHgxZWFlOTQ3NSwgMHgwZWQzODZmYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRlbGVjb20gRGV2aWNlIEsuSy4iLCAiU3VwZXJTb2NrZXQgUkU0NTBUIiwgMHg0NjZiMDVmMCwgMHg4Yjc0YmM0ZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRlbGVjb20gRGV2aWNlIEsuSy4iLCAiU3VwZXJTb2NrZXQgUkU1NTBUIiwgMHg0NjZiMDVmMCwgMHgzM2M4ZGIyYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIkh5cGVydGVjIiwgICJFUDQwMSIsIDB4ODc4N2JlYzcsIDB4ZjZlNGEzMWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJLaW5nTWF4IFRlY2hub2xvZ3kgSW5jLiIsICJFdGhlcm5ldCBDYXJkIiwgMHg5MzJiNzE4OSwgMHg1ZTlkOTJjMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIkxPTkdTSElORSIsICJFUDQwMSIsIDB4Zjg2NmIwYjAsIDB4ZjZlNGEzMWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJYaXJjb20iLCAiQ0ZFLTEwIiwgMHgyZTNlZTg0NSwgMHgyMmE0OWY4OSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiQ3lRJ3ZlIDEwIEJhc2UtVCBMQU4gQ0FSRCIsIDB4OTRmYWYzNjApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIkVQLTIxMCBQQ01DSUEgTEFOIENBUkQuIiwgMHg4ODUwYjRkZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiRVRIRVItQzE2IiwgMHgwNmE4NTE0ZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiSUMtQ0FSRCIsIDB4NjBjYjA5YTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEoIk5FMjAwMCBDb21wYXRpYmxlIiwgMHg3NWI4YWQ1YSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMigiRU4tNjIwMFAyIiwgMHhhOTk2ZDA3OCksCisJLyogdG9vIGdlbmVyaWMhICovCisJLyogUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSIsICIxMC8xMDAgRXRoZXJuZXQgQ2FyZCIsIDB4MjgxZjFjNWQsIDB4MTFiMGZmYzApLCAqLworCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMCwgIlBDTUNJQSIsICJFTjIyMTgtTEFOL01PREVNIiwgMHgyODFmMWM1ZCwgMHg1NzBmMzQ4ZSwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigwLCAiUENNQ0lBIiwgIlVFMjIxOC1MQU4vTU9ERU0iLCAweDI4MWYxYzVkLCAweDZmZGNhY2VlLCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDAsICJQc2lvbiBEYWNvbSIsICJHb2xkIENhcmQgVjM0IEV0aGVybmV0IiwgMHhmNWYwMjVjMiwgMHgzMzhlODE1NSwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigwLCAiUHNpb24gRGFjb20iLCAiR29sZCBDYXJkIFYzNCBFdGhlcm5ldCBHU00iLCAweGY1ZjAyNWMyLCAweDRhZTg1ZDM1LCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDAsICJMSU5LU1lTIiwgIlBDTUxNMjgiLCAweGY3Y2IwYjA3LCAweDY2ODgxODc0LCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDAsICJEQVlOQSBDT01NVU5JQ0FUSU9OUyIsICJMQU4gQU5EIE1PREVNIE1VTFRJRlVOQ1RJT04iLCAweDhmZGY4Zjg5LCAweGRkNWVkOWU4LCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfUFJPRF9JRDQoMCwgIk5TQyBNRiBMQU4vTW9kZW0iLCAweDU4ZmM2MDU2LCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDAsIDB4MDE3NSwgMHgwMDAwLCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQoMHhjMDBmLCAweDAwMDIsICJMQS1QQ00uY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJLVEkiLCAiUEU1MjAgUExVUyIsIDB4YWQxODAzNDUsIDB4OWQ1OGQzOTIsICJQRTUyMC5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIk5EQyIsICJFdGhlcm5ldCIsIDB4MDFjNDNhZTEsIDB4MDBiMmU5NDEsICJORTJLLmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQxMigiUE1YICAgIiwgIlBFLTIwMCIsIDB4MzRmM2YxYzgsIDB4MTBiNTlmOGMsICJQRS0yMDAuY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJUQU1BUkFDSyIsICJFdGhlcm5ldCIsIDB4Y2Y0MzRmYmEsIDB4MDBiMmU5NDEsICJ0YW1hcmFjay5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcGNuZXRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHBjbmV0X2RyaXZlciA9IHsKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAicGNuZXRfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBwY25ldF9hdHRhY2gsCisJLmV2ZW50CQk9IHBjbmV0X2V2ZW50LAogCS5kZXRhY2gJCT0gcGNuZXRfZGV0YWNoLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaWRfdGFibGUJPSBwY25ldF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BjbmV0X2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvc21jOTFjOTJfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCmluZGV4IDg1YTE1MjEuLmZiYzJmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jCkBAIC00Miw3ICs0Miw2IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMjcsNiArMTI2LDEyIEBACiAgICAgaW50CQkJCXJ4X292cm47CiB9OwogCitzdHJ1Y3Qgc21jX2NmZ19tZW0geworICAgIHR1cGxlX3QgdHVwbGU7CisgICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICB1X2NoYXIgYnVmWzI1NV07Cit9OworCiAvKiBTcGVjaWFsIGRlZmluaXRpb25zIGZvciBNZWdhaGVydHogbXVsdGlmdW5jdGlvbiBjYXJkcyAqLwogI2RlZmluZSBNRUdBSEVSVFpfSVNSCQkweDAzODAKIApAQCAtMzY0LDEwICszNjksNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9IENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnNtYzkxYzkyX2V2ZW50OwogICAgIGNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKICAgICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogICAgIHJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNDk4LDE0ICs0OTksMjQgQEAKIHsKICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbGluay0+cHJpdjsKICAgICBzdHJ1Y3Qgc21jX3ByaXZhdGUgKnNtYyA9IG5ldGRldl9wcml2KGRldik7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwotICAgIHVfY2hhciBidWZbMjU1XTsKLSAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZiA9ICZwYXJzZS5jZnRhYmxlX2VudHJ5OworICAgIHN0cnVjdCBzbWNfY2ZnX21lbSAqY2ZnX21lbTsKKyAgICB0dXBsZV90ICp0dXBsZTsKKyAgICBjaXNwYXJzZV90ICpwYXJzZTsKKyAgICBjaXN0cGxfY2Z0YWJsZV9lbnRyeV90ICpjZjsKKyAgICB1X2NoYXIgKmJ1ZjsKICAgICB3aW5fcmVxX3QgcmVxOwogICAgIG1lbXJlcV90IG1lbTsKICAgICBpbnQgaSwgazsKIAorICAgIGNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21jX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWNmZ19tZW0pCisgICAgICAgIHJldHVybiBDU19PVVRfT0ZfUkVTT1VSQ0U7CisKKyAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKKyAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKKyAgICBjZiA9ICZwYXJzZS0+Y2Z0YWJsZV9lbnRyeTsKKyAgICBidWYgPSBjZmdfbWVtLT5idWY7CisKICAgICBsaW5rLT5jb25mLkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfU1BLUjsKICAgICBsaW5rLT5jb25mLlN0YXR1cyA9IENDU1JfQVVESU9fRU5BOwogICAgIGxpbmstPmlycS5BdHRyaWJ1dGVzID0KQEAgLTUxNCwxMiArNTI1LDEyIEBACiAgICAgbGluay0+aW8uQXR0cmlidXRlczIgPSBJT19EQVRBX1BBVEhfV0lEVEhfODsKICAgICBsaW5rLT5pby5OdW1Qb3J0czIgPSA4OwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfQ0ZUQUJMRV9FTlRSWTsKIAotICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKyAgICBpID0gZmlyc3RfdHVwbGUobGluay0+aGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIC8qIFRoZSBNZWdhaGVydHogY29tYm8gY2FyZHMgaGF2ZSBtb2RlbS1saWtlIENJUyBlbnRyaWVzLCBzbwogICAgICAgIHdlIGhhdmUgdG8gZXhwbGljaXRseSB0cnkgYSBidW5jaCBvZiBwb3J0IGNvbWJpbmF0aW9ucy4gKi8KICAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7CkBAIC01MzIsMTAgKzU0MywxMCBAQAogCSAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSBicmVhazsKIAl9CiAJaWYgKGkgPT0gQ1NfU1VDQ0VTUykgYnJlYWs7Ci0JaSA9IG5leHRfdHVwbGUobGluay0+aGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisJaSA9IG5leHRfdHVwbGUobGluay0+aGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIH0KICAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQotCXJldHVybiBpOworCWdvdG8gZnJlZV9jZmdfbWVtOwogICAgIGRldi0+YmFzZV9hZGRyID0gbGluay0+aW8uQmFzZVBvcnQxOwogCiAgICAgLyogQWxsb2NhdGUgYSBtZW1vcnkgd2luZG93LCBmb3IgYWNjZXNzaW5nIHRoZSBJU1IgKi8KQEAgLTU0NCw3ICs1NTUsNyBAQAogICAgIHJlcS5BY2Nlc3NTcGVlZCA9IDA7CiAgICAgaSA9IHBjbWNpYV9yZXF1ZXN0X3dpbmRvdygmbGluay0+aGFuZGxlLCAmcmVxLCAmbGluay0+d2luKTsKICAgICBpZiAoaSAhPSBDU19TVUNDRVNTKQotCXJldHVybiBpOworCWdvdG8gZnJlZV9jZmdfbWVtOwogICAgIHNtYy0+YmFzZSA9IGlvcmVtYXAocmVxLkJhc2UsIHJlcS5TaXplKTsKICAgICBtZW0uQ2FyZE9mZnNldCA9IG1lbS5QYWdlID0gMDsKICAgICBpZiAoc21jLT5tYW5maWQgPT0gTUFORklEX01PVE9ST0xBKQpAQCAtNTU2LDYgKzU2Nyw4IEBACiAJJiYgKHNtYy0+Y2FyZGlkID09IFBST0RJRF9NRUdBSEVSVFpfRU0zMjg4KSkKIAltaHpfMzI4OF9wb3dlcihsaW5rKTsKIAorZnJlZV9jZmdfbWVtOgorICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybiBpOwogfQogCkBAIC01NjMsMzkgKzU3Niw2MSBAQAogewogICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICBjaXNwYXJzZV90IHBhcnNlOwotICAgIHVfY2hhciBidWZbMjU1XSwgKnN0YXRpb25fYWRkcjsKKyAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07CisgICAgdHVwbGVfdCAqdHVwbGU7CisgICAgY2lzcGFyc2VfdCAqcGFyc2U7CisgICAgdV9jaGFyICpidWYsICpzdGF0aW9uX2FkZHI7CisgICAgaW50IHJjOwogCi0gICAgdHVwbGUuQXR0cmlidXRlcyA9IHR1cGxlLlR1cGxlT2Zmc2V0ID0gMDsKLSAgICB0dXBsZS5UdXBsZURhdGEgPSBidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7CisgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOworICAgIGlmICghY2ZnX21lbSkKKwlyZXR1cm4gLTE7CisKKyAgICB0dXBsZSA9ICZjZmdfbWVtLT50dXBsZTsKKyAgICBwYXJzZSA9ICZjZmdfbWVtLT5wYXJzZTsKKyAgICBidWYgPSBjZmdfbWVtLT5idWY7CisKKyAgICB0dXBsZS0+QXR0cmlidXRlcyA9IHR1cGxlLT5UdXBsZU9mZnNldCA9IDA7CisgICAgdHVwbGUtPlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7CisgICAgdHVwbGUtPlR1cGxlRGF0YU1heCA9IDI1NTsKIAogICAgIC8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHRoZSBDSVMuICBJdCBpcyBzdG9yZWQgYXMgdGhlIGxhc3QKICAgICAgICAoZm91cnRoKSBzdHJpbmcgaW4gdGhlIFZlcnNpb24gMSBWZXJzaW9uL0lEIHR1cGxlLiAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9WRVJTXzE7Ci0gICAgaWYgKGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpICE9IENTX1NVQ0NFU1MpCi0JcmV0dXJuIC0xOworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgIT0gQ1NfU1VDQ0VTUykgeworCXJjID0gLTE7CisJZ290byBmcmVlX2NmZ19tZW07CisgICAgfQogICAgIC8qIFVnaCAtLSB0aGUgRU0xMTQ0IGNhcmQgaGFzIHR3byBWRVJTXzEgdHVwbGVzIT8hICovCi0gICAgaWYgKG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gQ1NfU1VDQ0VTUykKLQlmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKLSAgICBpZiAocGFyc2UudmVyc2lvbl8xLm5zID4gMykgewotCXN0YXRpb25fYWRkciA9IHBhcnNlLnZlcnNpb25fMS5zdHIgKyBwYXJzZS52ZXJzaW9uXzEub2ZzWzNdOwotCWlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIHN0YXRpb25fYWRkcikgPT0gMCkKLQkgICAgcmV0dXJuIDA7CisgICAgaWYgKG5leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpICE9IENTX1NVQ0NFU1MpCisJZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOworICAgIGlmIChwYXJzZS0+dmVyc2lvbl8xLm5zID4gMykgeworCXN0YXRpb25fYWRkciA9IHBhcnNlLT52ZXJzaW9uXzEuc3RyICsgcGFyc2UtPnZlcnNpb25fMS5vZnNbM107CisJaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7CisJCXJjID0gMDsKKwkJZ290byBmcmVlX2NmZ19tZW07CisJfQogICAgIH0KIAogICAgIC8qIEFub3RoZXIgcG9zc2liaWxpdHk6IGZvciB0aGUgRU0zMjg4LCBpbiBhIHNwZWNpYWwgdHVwbGUgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDgxOwotICAgIGlmIChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQotCXJldHVybiAtMTsKLSAgICBpZiAocGNtY2lhX2dldF90dXBsZV9kYXRhKGhhbmRsZSwgJnR1cGxlKSAhPSBDU19TVUNDRVNTKQotCXJldHVybiAtMTsKKyAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gMHg4MTsKKyAgICBpZiAocGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKSAhPSBDU19TVUNDRVNTKSB7CisJcmMgPSAtMTsKKwlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgICB9CisgICAgaWYgKHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKSAhPSBDU19TVUNDRVNTKSB7CisJcmMgPSAtMTsKKwlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgICB9CiAgICAgYnVmWzEyXSA9ICdcMCc7Ci0gICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgYnVmKSA9PSAwKQotCXJldHVybiAwOwotCi0gICAgcmV0dXJuIC0xOworICAgIGlmIChjdnRfYXNjaWlfYWRkcmVzcyhkZXYsIGJ1ZikgPT0gMCkgeworCXJjID0gMDsKKwlnb3RvIGZyZWVfY2ZnX21lbTsKKyAgIH0KKyAgICByYyA9IC0xOworZnJlZV9jZmdfbWVtOgorICAga2ZyZWUoY2ZnX21lbSk7CisgICByZXR1cm4gcmM7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjY1LDE5ICs3MDAsMjkgQEAKIHN0YXRpYyBpbnQgc21jX2NvbmZpZyhkZXZfbGlua190ICpsaW5rKQogewogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICB1X2NoYXIgYnVmWzI1NV07Ci0gICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2YgPSAmcGFyc2UuY2Z0YWJsZV9lbnRyeTsKKyAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07CisgICAgdHVwbGVfdCAqdHVwbGU7CisgICAgY2lzcGFyc2VfdCAqcGFyc2U7CisgICAgY2lzdHBsX2NmdGFibGVfZW50cnlfdCAqY2Y7CisgICAgdV9jaGFyICpidWY7CiAgICAgaW50IGk7CiAKLSAgICB0dXBsZS5BdHRyaWJ1dGVzID0gdHVwbGUuVHVwbGVPZmZzZXQgPSAwOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IChjaXNkYXRhX3QgKilidWY7Ci0gICAgdHVwbGUuVHVwbGVEYXRhTWF4ID0gc2l6ZW9mKGJ1Zik7Ci0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NGVEFCTEVfRU5UUlk7CisgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOworICAgIGlmICghY2ZnX21lbSkKKwlyZXR1cm4gQ1NfT1VUX09GX1JFU09VUkNFOworCisgICAgdHVwbGUgPSAmY2ZnX21lbS0+dHVwbGU7CisgICAgcGFyc2UgPSAmY2ZnX21lbS0+cGFyc2U7CisgICAgY2YgPSAmcGFyc2UtPmNmdGFibGVfZW50cnk7CisgICAgYnVmID0gY2ZnX21lbS0+YnVmOworCisgICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSB0dXBsZS0+VHVwbGVPZmZzZXQgPSAwOworICAgIHR1cGxlLT5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLT5UdXBsZURhdGFNYXggPSAyNTU7CisgICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DRlRBQkxFX0VOVFJZOwogCiAgICAgbGluay0+aW8uTnVtUG9ydHMxID0gMTY7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGxpbmstPmhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIGkgPSBmaXJzdF90dXBsZShsaW5rLT5oYW5kbGUsIHR1cGxlLCBwYXJzZSk7CiAgICAgd2hpbGUgKGkgIT0gQ1NfTk9fTU9SRV9JVEVNUykgewogCWlmIChpID09IENTX1NVQ0NFU1MpIHsKIAkgICAgbGluay0+Y29uZi5Db25maWdJbmRleCA9IGNmLT5pbmRleDsKQEAgLTY4NiwxMCArNzMxLDEyIEBACiAJICAgIGkgPSBwY21jaWFfcmVxdWVzdF9pbyhsaW5rLT5oYW5kbGUsICZsaW5rLT5pbyk7CiAJICAgIGlmIChpID09IENTX1NVQ0NFU1MpIGJyZWFrOwogCX0KLQlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsICZ0dXBsZSwgJnBhcnNlKTsKKwlpID0gbmV4dF90dXBsZShsaW5rLT5oYW5kbGUsIHR1cGxlLCBwYXJzZSk7CiAgICAgfQogICAgIGlmIChpID09IENTX1NVQ0NFU1MpCiAJZGV2LT5iYXNlX2FkZHIgPSBsaW5rLT5pby5CYXNlUG9ydDE7CisKKyAgICBrZnJlZShjZmdfbWVtKTsKICAgICByZXR1cm4gaTsKIH0KIApAQCAtNjk3LDQxICs3NDQsNTggQEAKIHsKICAgICBjbGllbnRfaGFuZGxlX3QgaGFuZGxlID0gbGluay0+aGFuZGxlOwogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKKyAgICBzdHJ1Y3Qgc21jX2NmZ19tZW0gKmNmZ19tZW07CisgICAgdHVwbGVfdCAqdHVwbGU7CisgICAgY2lzcGFyc2VfdCAqcGFyc2U7CiAgICAgY2lzdHBsX2xhbl9ub2RlX2lkX3QgKm5vZGVfaWQ7Ci0gICAgdV9jaGFyIGJ1ZlsyNTVdLCAqc3RhdGlvbl9hZGRyOwotICAgIGludCBpOworICAgIHVfY2hhciAqYnVmLCAqc3RhdGlvbl9hZGRyOworICAgIGludCBpLCByYzsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gYnVmOwotICAgIHR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYpOworICAgIGNmZ19tZW0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21jX2NmZ19tZW0pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIWNmZ19tZW0pCisJcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKKworICAgIHR1cGxlID0gJmNmZ19tZW0tPnR1cGxlOworICAgIHBhcnNlID0gJmNmZ19tZW0tPnBhcnNlOworICAgIGJ1ZiA9IGNmZ19tZW0tPmJ1ZjsKKworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gMjU1OwogCiAgICAgLyogQ2hlY2sgZm9yIGEgTEFOIGZ1bmN0aW9uIGV4dGVuc2lvbiB0dXBsZSAqLwotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKLSAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisgICAgdHVwbGUtPkRlc2lyZWRUdXBsZSA9IENJU1RQTF9GVU5DRTsKKyAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIHdoaWxlIChpID09IENTX1NVQ0NFU1MpIHsKLQlpZiAocGFyc2UuZnVuY2UudHlwZSA9PSBDSVNUUExfRlVOQ0VfTEFOX05PREVfSUQpCisJaWYgKHBhcnNlLT5mdW5jZS50eXBlID09IENJU1RQTF9GVU5DRV9MQU5fTk9ERV9JRCkKIAkgICAgYnJlYWs7Ci0JaSA9IG5leHRfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSk7CisJaSA9IG5leHRfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIH0KICAgICBpZiAoaSA9PSBDU19TVUNDRVNTKSB7Ci0Jbm9kZV9pZCA9IChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLmZ1bmNlLmRhdGE7CisJbm9kZV9pZCA9IChjaXN0cGxfbGFuX25vZGVfaWRfdCAqKXBhcnNlLT5mdW5jZS5kYXRhOwogCWlmIChub2RlX2lkLT5uYiA9PSA2KSB7CiAJICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBub2RlX2lkLT5pZFtpXTsKLQkgICAgcmV0dXJuIDA7CisJICAgIHJjID0gMDsKKwkgICAgZ290byBmcmVlX2NmZ19tZW07CiAJfQogICAgIH0KICAgICAvKiBUcnkgdGhlIHRoaXJkIHN0cmluZyBpbiB0aGUgVmVyc2lvbiAxIFZlcnNpb24vSUQgdHVwbGUuICovCi0gICAgdHVwbGUuRGVzaXJlZFR1cGxlID0gQ0lTVFBMX1ZFUlNfMTsKLSAgICBpZiAoZmlyc3RfdHVwbGUoaGFuZGxlLCAmdHVwbGUsICZwYXJzZSkgIT0gQ1NfU1VDQ0VTUykKLQlyZXR1cm4gLTE7Ci0gICAgc3RhdGlvbl9hZGRyID0gcGFyc2UudmVyc2lvbl8xLnN0ciArIHBhcnNlLnZlcnNpb25fMS5vZnNbMl07Ci0gICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKQotCXJldHVybiAwOworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfVkVSU18xOworICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsIHR1cGxlLCBwYXJzZSkgIT0gQ1NfU1VDQ0VTUykgeworCXJjID0gLTE7CisJZ290byBmcmVlX2NmZ19tZW07CisgICAgfQorICAgIHN0YXRpb25fYWRkciA9IHBhcnNlLT52ZXJzaW9uXzEuc3RyICsgcGFyc2UtPnZlcnNpb25fMS5vZnNbMl07CisgICAgaWYgKGN2dF9hc2NpaV9hZGRyZXNzKGRldiwgc3RhdGlvbl9hZGRyKSA9PSAwKSB7CisJcmMgPSAwOworCWdvdG8gZnJlZV9jZmdfbWVtOworICAgIH0KIAotICAgIHJldHVybiAtMTsKKyAgICByYyA9IC0xOworZnJlZV9jZmdfbWVtOgorICAgIGtmcmVlKGNmZ19tZW0pOworICAgIHJldHVybiByYzsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC03NzMsMjYgKzgzNywzNiBAQAogewogICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7Ci0gICAgdHVwbGVfdCB0dXBsZTsKLSAgICB1X2NoYXIgYnVmWzI1NV07Ci0gICAgaW50IGk7CisgICAgc3RydWN0IHNtY19jZmdfbWVtICpjZmdfbWVtOworICAgIHR1cGxlX3QgKnR1cGxlOworICAgIHVfY2hhciAqYnVmOworICAgIGludCBpLCByYzsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwotICAgIHR1cGxlLlR1cGxlRGF0YSA9IGJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKLSAgICB0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisgICAgY2ZnX21lbSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbWNfY2ZnX21lbSksIEdGUF9LRVJORUwpOworICAgIGlmICghY2ZnX21lbSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgdHVwbGUgPSAmY2ZnX21lbS0+dHVwbGU7CisgICAgYnVmID0gY2ZnX21lbS0+YnVmOworCisgICAgdHVwbGUtPkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOworICAgIHR1cGxlLT5UdXBsZURhdGEgPSAoY2lzZGF0YV90ICopYnVmOworICAgIHR1cGxlLT5UdXBsZURhdGFNYXggPSAyNTU7CisgICAgdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKIAogICAgIC8qIFJlYWQgdGhlIHN0YXRpb24gYWRkcmVzcyBmcm9tIHR1cGxlIDB4OTAsIHN1YnR1cGxlIDB4MDQgKi8KLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSAweDkwOwotICAgIGkgPSBwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlKTsKKyAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gMHg5MDsKKyAgICBpID0gcGNtY2lhX2dldF9maXJzdF90dXBsZShoYW5kbGUsIHR1cGxlKTsKICAgICB3aGlsZSAoaSA9PSBDU19TVUNDRVNTKSB7Ci0JaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsICZ0dXBsZSk7CisJaSA9IHBjbWNpYV9nZXRfdHVwbGVfZGF0YShoYW5kbGUsIHR1cGxlKTsKIAlpZiAoKGkgIT0gQ1NfU1VDQ0VTUykgfHwgKGJ1ZlswXSA9PSAweDA0KSkKIAkgICAgYnJlYWs7Ci0JaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsICZ0dXBsZSk7CisJaSA9IHBjbWNpYV9nZXRfbmV4dF90dXBsZShoYW5kbGUsIHR1cGxlKTsKICAgICB9Ci0gICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykKLQlyZXR1cm4gLTE7CisgICAgaWYgKGkgIT0gQ1NfU1VDQ0VTUykgeworCXJjID0gLTE7CisJZ290byBmcmVlX2NmZ19tZW07CisgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJZGV2LT5kZXZfYWRkcltpXSA9IGJ1ZltpKzJdOwogCkBAIC04MTQsOCArODg4LDEwIEBACiAJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfQVVJX1BXUiksCiAJICAgICAgaW53KGxpbmstPmlvLkJhc2VQb3J0MSArIE9TSVRFQ0hfUkVTRVRfSVNSKSk7CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmMgPSAwOworZnJlZV9jZmdfbWVtOgorICAga2ZyZWUoY2ZnX21lbSk7CisgICByZXR1cm4gcmM7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtODg3LDkgKzk2MywxMCBAQAogICAgIGNsaWVudF9oYW5kbGVfdCBoYW5kbGUgPSBsaW5rLT5oYW5kbGU7CiAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGxpbmstPnByaXY7CiAgICAgc3RydWN0IHNtY19wcml2YXRlICpzbWMgPSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHR1cGxlX3QgdHVwbGU7Ci0gICAgY2lzcGFyc2VfdCBwYXJzZTsKLSAgICB1X3Nob3J0IGJ1ZlszMl07CisgICAgc3RydWN0IHNtY19jZmdfbWVtICpjZmdfbWVtOworICAgIHR1cGxlX3QgKnR1cGxlOworICAgIGNpc3BhcnNlX3QgKnBhcnNlOworICAgIHVfY2hhciAqYnVmOwogICAgIGNoYXIgKm5hbWU7CiAgICAgaW50IGksIGosIHJldjsKICAgICBraW9fYWRkcl90IGlvYWRkcjsKQEAgLTg5NywyMSArOTc0LDI5IEBACiAKICAgICBERUJVRygwLCAic21jOTFjOTJfY29uZmlnKDB4JXApXG4iLCBsaW5rKTsKIAotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSB0dXBsZS5UdXBsZU9mZnNldCA9IDA7Ci0gICAgdHVwbGUuVHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKLSAgICB0dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmKTsKKyAgICBjZmdfbWVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNtY19jZmdfbWVtKSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCFjZmdfbWVtKQorCWdvdG8gY29uZmlnX2ZhaWxlZDsKIAotICAgIHR1cGxlLkRlc2lyZWRUdXBsZSA9IENJU1RQTF9DT05GSUc7Ci0gICAgaSA9IGZpcnN0X3R1cGxlKGhhbmRsZSwgJnR1cGxlLCAmcGFyc2UpOworICAgIHR1cGxlID0gJmNmZ19tZW0tPnR1cGxlOworICAgIHBhcnNlID0gJmNmZ19tZW0tPnBhcnNlOworICAgIGJ1ZiA9IGNmZ19tZW0tPmJ1ZjsKKworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gdHVwbGUtPlR1cGxlT2Zmc2V0ID0gMDsKKyAgICB0dXBsZS0+VHVwbGVEYXRhID0gKGNpc2RhdGFfdCAqKWJ1ZjsKKyAgICB0dXBsZS0+VHVwbGVEYXRhTWF4ID0gNjQ7CisKKyAgICB0dXBsZS0+RGVzaXJlZFR1cGxlID0gQ0lTVFBMX0NPTkZJRzsKKyAgICBpID0gZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpOwogICAgIENTX0VYSVRfVEVTVChpLCBQYXJzZVR1cGxlLCBjb25maWdfZmFpbGVkKTsKLSAgICBsaW5rLT5jb25mLkNvbmZpZ0Jhc2UgPSBwYXJzZS5jb25maWcuYmFzZTsKLSAgICBsaW5rLT5jb25mLlByZXNlbnQgPSBwYXJzZS5jb25maWcucm1hc2tbMF07CisgICAgbGluay0+Y29uZi5Db25maWdCYXNlID0gcGFyc2UtPmNvbmZpZy5iYXNlOworICAgIGxpbmstPmNvbmYuUHJlc2VudCA9IHBhcnNlLT5jb25maWcucm1hc2tbMF07CiAKLSAgICB0dXBsZS5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOwotICAgIHR1cGxlLkF0dHJpYnV0ZXMgPSBUVVBMRV9SRVRVUk5fQ09NTU9OOwotICAgIGlmIChmaXJzdF90dXBsZShoYW5kbGUsICZ0dXBsZSwgJnBhcnNlKSA9PSBDU19TVUNDRVNTKSB7Ci0Jc21jLT5tYW5maWQgPSBwYXJzZS5tYW5maWQubWFuZjsKLQlzbWMtPmNhcmRpZCA9IHBhcnNlLm1hbmZpZC5jYXJkOworICAgIHR1cGxlLT5EZXNpcmVkVHVwbGUgPSBDSVNUUExfTUFORklEOworICAgIHR1cGxlLT5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0NPTU1PTjsKKyAgICBpZiAoZmlyc3RfdHVwbGUoaGFuZGxlLCB0dXBsZSwgcGFyc2UpID09IENTX1NVQ0NFU1MpIHsKKwlzbWMtPm1hbmZpZCA9IHBhcnNlLT5tYW5maWQubWFuZjsKKwlzbWMtPmNhcmRpZCA9IHBhcnNlLT5tYW5maWQuY2FyZDsKICAgICB9CiAKICAgICAvKiBDb25maWd1cmUgY2FyZCAqLwpAQCAtMTA0Niw3ICsxMTMxLDcgQEAKICAgICAJICAgIHByaW50ayhLRVJOX05PVElDRSAiICBObyBNSUkgdHJhbnNjZWl2ZXJzIGZvdW5kIVxuIik7CiAJfQogICAgIH0KLQorICAgIGtmcmVlKGNmZ19tZW0pOwogICAgIHJldHVybjsKIAogY29uZmlnX3VuZG86CkBAIC0xMDU0LDYgKzExMzksNyBAQAogY29uZmlnX2ZhaWxlZDoJCQkvKiBDU19FWElUX1RFU1QoKSBjYWxscyBqdW1wIHRvIGhlcmUuLi4gKi8KICAgICBzbWM5MWM5Ml9yZWxlYXNlKGxpbmspOwogICAgIGxpbmstPnN0YXRlICY9IH5ERVZfQ09ORklHX1BFTkRJTkc7CisgICAga2ZyZWUoY2ZnX21lbSk7CiAKIH0gLyogc21jOTFjOTJfY29uZmlnICovCiAKQEAgLTIyMzYsMTMgKzIzMjIsNDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBzbWM5MWM5Ml9pZHNbXSA9IHsKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTA5LCAweDA1MDEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxNDAsIDB4MDAwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMygwLCAiTUVHQUhFUlRaIiwgIkNDL1hKRU0zMjg4IiwgIkRBVEEvRkFYL0NFTEwgRVRIRVJORVQgTU9ERU0iLCAweGY1MTBkYjA0LCAweDA0Y2QyOTg4LCAweDQ2YTUyZDYzKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIzKDAsICJNRUdBSEVSVFoiLCAiQ0MvWEpFTTMzMzYiLCAiREFUQS9GQVgvQ0VMTCBFVEhFUk5FVCBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4MDE0M2I3NzMsIDB4NDZhNTJkNjMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMjMoMCwgIk1FR0FIRVJUWiIsICJFTTExNDRUIiwgIlBDTUNJQSBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4ODU2ZDY2YzgsIDB4YmQ2YzQzZWYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMjMoMCwgIk1FR0FIRVJUWiIsICJYSkVNMTE0NC9DQ0VNMTE0NCIsICJQQ01DSUEgTU9ERU0iLCAweGY1MTBkYjA0LCAweDUyZDIxZTFlLCAweGJkNmM0M2VmKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMCwgIkdhdGV3YXkgMjAwMCIsICJYSkVNMzMzNiIsIDB4ZGQ5OTg5YmUsIDB4NjYyYzM5NGMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiTUVHQUhFUlRaIiwgIlhKRU0xMTQ0L0NDRU0xMTQ0IiwgMHhmNTEwZGIwNCwgMHg1MmQyMWUxZSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJPc2l0ZWNoIiwgIlRydW1wY2FyZCIsIDB4MGMyZjgwY2QsIDB4MDU3M2MyOWYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigwLCAiT3NpdGVjaCIsICJUcnVtcGNhcmQiLCAweDBjMmY4MGNkLCAweDA1NzNjMjlmKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMTZjLCAweDAwMjApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE2YywgMHgwMDIzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkJBU0lDUyBieSBOZXcgTWVkaWEgQ29ycG9yYXRpb24iLCAiRXRoZXJuZXQiLCAiU01DOTFDOTQiLCAweDIzYzc4YTlkLCAweDAwYjJlOTQxLCAweGNlZjM5N2ZiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVJHT1NZIiwgIkZhc3QgRXRoZXJuZXQgUENDYXJkIiwgMHg3OGYzMDhkYywgMHhkY2VhNjhiYyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImRpdCBDby4sIEx0ZC4iLCAiUEMgQ2FyZC0xMC8xMDBCVFgiLCAweGU1OTM2NWM4LCAweDZhMjE2MWQxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRFlOQUxJTksiLCAiTDEwMEMiLCAweDZhMjZkMWNmLCAweGMxNmNlOWM1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRmFyYWxsb24iLCAiRmFyYWxsb24gRW5ldCIsIDB4NThkOTNmYzQsIDB4MjQ0NzM0ZTkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNZWdhaGVydHoiLCAiQ0MxMEJULzIiLCAweDMzMjM0NzQ4LCAweDNjOTViOTUzKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUVMQ08vU01DIiwgIkxQQy1UWCIsIDB4YTJjZDhlNmQsIDB4NDJkYTY2MmEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJPc2l0ZWNoIiwgIlRydW1wY2FyZCIsIDB4MGMyZjgwY2QsIDB4MDU3M2MyOWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJPc2l0ZWNoIiwgIlRydW1wY2FyZCIsIDB4MGMyZjgwY2QsIDB4MDU3M2MyOWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQQ01DSUEiLCAiRmFzdCBFdGhlcm5ldCBQQ0NhcmQiLCAweDI4MWYxYzVkLCAweGRjZWE2OGJjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUHNpb24iLCAiMTBNYiBFdGhlcm5ldCIsIDB4NGVmMDBiMjEsIDB4ODQ0YmU5ZTkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTTUMiLCAiRXRoZXJFWiBFdGhlcm5ldCA4MDIwIiwgMHhjNGY4YjE4YiwgMHg0YTBlZWIyZCksCisJLyogVGhlc2UgY29uZmxpY3Qgd2l0aCBvdGhlciBjYXJkcyEgKi8KKwkvKiBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxODYsIDB4MDEwMCksICovCisJLyogUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHg4YTAxLCAweGMxYWIpLCAqLworCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgc21jOTFjOTJfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHNtYzkxYzkyX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gInNtYzkxYzkyX2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gc21jOTFjOTJfYXR0YWNoLAorCS5ldmVudAkJPSBzbWM5MWM5Ml9ldmVudCwKIAkuZGV0YWNoCQk9IHNtYzkxYzkyX2RldGFjaCwKKwkuaWRfdGFibGUgICAgICAgPSBzbWM5MWM5Ml9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3NtYzkxYzkyX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYwppbmRleCA1ODE3N2Q2Li45ZjMzYmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKQEAgLTgxLDcgKzgxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtNjE5LDExICs2MTgsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmeGlyYzJwc19ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICBpZiAoKGVyciA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpKSkgewpAQCAtMTk4MywxMyArMTk3Nyw0MiBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgeGlyYzJwc19pZHNbXSA9IHsKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMCwgMHgwMDg5LCAweDExMGEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgwLCAweDAxMzgsIDB4MTEwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDAsICJYaXJjb20iLCAiQ0VNMjgiLCAweDJlM2VlODQ1LCAweDBlYTk3OGVhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMCwgIlhpcmNvbSIsICJDRU0zMyIsIDB4MmUzZWU4NDUsIDB4ODA2MDkwMjMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMygwLCAiWGlyY29tIiwgIkNFTTU2IiwgMHgyZTNlZTg0NSwgMHhhNjUwYzMyYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDAsICJYaXJjb20iLCAiUkVNMTAiLCAweDJlM2VlODQ1LCAweDc2ZGYxZDI5KSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMCwgIlhpcmNvbSIsICJYRU01NjAwIiwgMHgyZTNlZTg0NSwgMHhmMTQwMzcxOSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJYaXJjb20iLCAiQ3JlZGl0Q2FyZCBFdGhlcm5ldCIsIDB4MmUzZWU4NDUsIDB4YzBlNzc4YzIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFiZiwgMHgwMTBhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiVG9zaGliYSBJbmZvcm1hdGlvbiBTeXN0ZW1zIiwgIlRQQ0VORVQiLCAweDFiM2I5NGZlLCAweGYzODFjMWEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiWGlyY29tIiwgIkNFMy0xMC8xMDAiLCAweDJlM2VlODQ1LCAweDBlYzBhYzM3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiWGlyY29tIiwgIlBTLUNFMi0xMCIsIDB4MmUzZWU4NDUsIDB4OTQ3ZDkwNzMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJYaXJjb20iLCAiUjJFLTEwMEJUWCIsIDB4MmUzZWU4NDUsIDB4MjQ2NGE2ZTMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEzKCJYaXJjb20iLCAiUkUtMTAiLCAweDJlM2VlODQ1LCAweDNlMDhkNjA5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMygiWGlyY29tIiwgIlhFMjAwMCIsIDB4MmUzZWU4NDUsIDB4ZjcxODhlNDYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDb21wYXEiLCAiRXRoZXJuZXQgTEFOIENhcmQiLCAweDU0ZjdjNDljLCAweDlmZDJmMGEyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ29tcGFxIiwgIk5ldGVsbGlnZW50IDEwLzEwMCBQQyBDYXJkIiwgMHg1NGY3YzQ5YywgMHhlZmU5Njc2OSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkludGVsIiwgIkV0aGVyRXhwcmVzcyhUTSkgUFJPLzEwMCBQQyBDYXJkIE1vYmlsZSBBZGFwdGVyMTYiLCAweDgxNmNjODE1LCAweDE3NDM5N2RiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVG9zaGliYSIsICIxMC8xMDAgRXRoZXJuZXQgUEMgQ2FyZCIsIDB4NDRhMDlkOWMsIDB4YjQ0ZGVlY2YpLAorCS8qIGFsc28gbWF0Y2hlcyBDRkUtMTAgY2FyZHMhICovCisJLyogUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTA1LCAweDAxMGEpLCAqLworCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgeGlyYzJwc19pZHMpOworCisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB4aXJjMnBzX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gInhpcmMycHNfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSB4aXJjMnBzX2F0dGFjaCwKKwkuZXZlbnQJCT0geGlyYzJwc19ldmVudCwKIAkuZGV0YWNoCQk9IHhpcmMycHNfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHhpcmMycHNfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L3BjbmV0MzIuYwppbmRleCAxM2YxMTQ4Li4xMTNiNjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wY25ldDMyLmMKKysrIGIvZHJpdmVycy9uZXQvcGNuZXQzMi5jCkBAIC04NTAsNyArODUwLDcgQEAKICAgICBpZiAoKCFkYXRhKSB8fCAoZGF0YSA+ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKSkKICAgICBkYXRhID0gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWik7CiAKLSAgICBzY2hlZHVsZV90aW1lb3V0KGRhdGEgKiBIWik7CisgICAgbXNsZWVwX2ludGVycnVwdGlibGUoZGF0YSAqIDEwMDApOwogICAgIGRlbF90aW1lcl9zeW5jKCZscC0+YmxpbmtfdGltZXIpOwogCiAgICAgLyogUmVzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGJjcnMgKi8KQEAgLTE2MDIsNyArMTYwMiw3IEBACiAKIAlybWIoKTsKIAlpZiAobHAtPnJ4X2RtYV9hZGRyW2ldID09IDApCi0JICAgIGxwLT5yeF9kbWFfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCByeF9za2J1ZmYtPnRhaWwsCisJICAgIGxwLT5yeF9kbWFfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKGxwLT5wY2lfZGV2LCByeF9za2J1ZmYtPmRhdGEsCiAJCSAgICBQS1RfQlVGX1NaLTIsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJbHAtPnJ4X3JpbmdbaV0uYmFzZSA9ICh1MzIpbGUzMl90b19jcHUobHAtPnJ4X2RtYV9hZGRyW2ldKTsKIAlscC0+cnhfcmluZ1tpXS5idWZfbGVuZ3RoID0gbGUxNl90b19jcHUoMi1QS1RfQlVGX1NaKTsKQEAgLTE5ODMsNyArMTk4Myw3IEBACiAJCQlscC0+cnhfc2tidWZmW2VudHJ5XSA9IG5ld3NrYjsKIAkJCW5ld3NrYi0+ZGV2ID0gZGV2OwogCQkJbHAtPnJ4X2RtYV9hZGRyW2VudHJ5XSA9Ci0JCQkgICAgcGNpX21hcF9zaW5nbGUobHAtPnBjaV9kZXYsIG5ld3NrYi0+dGFpbCwKKwkJCSAgICBwY2lfbWFwX3NpbmdsZShscC0+cGNpX2RldiwgbmV3c2tiLT5kYXRhLAogCQkJCSAgICBQS1RfQlVGX1NaLTIsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlscC0+cnhfcmluZ1tlbnRyeV0uYmFzZSA9IGxlMzJfdG9fY3B1KGxwLT5yeF9kbWFfYWRkcltlbnRyeV0pOwogCQkJcnhfaW5fcGxhY2UgPSAxOwpAQCAtMjAyMCw3ICsyMDIwLDcgQEAKIAkJCQkJCVBLVF9CVUZfU1otMiwKIAkJCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCSAgICBldGhfY29weV9hbmRfc3VtKHNrYiwKLQkJCSAgICAodW5zaWduZWQgY2hhciAqKShscC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCksCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKikobHAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEpLAogCQkJICAgIHBrdF9sZW4sMCk7CiAJCSAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UobHAtPnBjaV9kZXYsCiAJCQkJCQkgICBscC0+cnhfZG1hX2FkZHJbZW50cnldLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGxpcC5jIGIvZHJpdmVycy9uZXQvcGxpcC5jCmluZGV4IGY0YjYyNDAuLjIxNTM3ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BsaXAuYworKysgYi9kcml2ZXJzL25ldC9wbGlwLmMKQEAgLTU0MCw3ICs1NDAsNyBAQAogICoJaW4gZmFyIHRvbyBtYW55IG9sZCBzeXN0ZW1zIG5vdCBhbGwgZXZlbiBydW5uaW5nIExpbnV4LgogICovCiAgCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcGxpcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IHBsaXBfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBldGhoZHIgKmV0aDsKIAl1bnNpZ25lZCBjaGFyICpyYXdwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX2FzeW5jLmMgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwppbmRleCA1ZTQ4YjlhLi41OWU4MTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYworKysgYi9kcml2ZXJzL25ldC9wcHBfYXN5bmMuYwpAQCAtMzY0LDcgKzM2NCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKIAlwcHBfYXN5bmNfaW5wdXQoYXAsIGJ1ZiwgY2ZsYWdzLCBjb3VudCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwotCWlmIChza2JfcXVldWVfbGVuKCZhcC0+cnF1ZXVlKSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmYXAtPnJxdWV1ZSkpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJmFwLT50c2spOwogCWFwX3B1dChhcCk7CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHBfZ2VuZXJpYy5jCmluZGV4IGFiNzI2YWIuLmEzMjY2OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcF9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwX2dlbmVyaWMuYwpAQCAtMTIzNyw4ICsxMjM3LDggQEAKIAkJcGNoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY2hhbm5lbCwgY2xpc3QpOwogCQluYXZhaWwgKz0gcGNoLT5hdmFpbCA9IChwY2gtPmNoYW4gIT0gTlVMTCk7CiAJCWlmIChwY2gtPmF2YWlsKSB7Ci0JCQlpZiAoc2tiX3F1ZXVlX2xlbigmcGNoLT5maWxlLnhxKSA9PSAwCi0JCQkgICAgfHwgIXBjaC0+aGFkX2ZyYWcpIHsKKwkJCWlmIChza2JfcXVldWVfZW1wdHkoJnBjaC0+ZmlsZS54cSkgfHwKKwkJCSAgICAhcGNoLT5oYWRfZnJhZykgewogCQkJCXBjaC0+YXZhaWwgPSAyOwogCQkJCSsrbmZyZWU7CiAJCQl9CkBAIC0xMzc0LDggKzEzNzQsOCBAQAogCiAJCS8qIHRyeSB0byBzZW5kIGl0IGRvd24gdGhlIGNoYW5uZWwgKi8KIAkJY2hhbiA9IHBjaC0+Y2hhbjsKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnBjaC0+ZmlsZS54cSkKLQkJICAgIHx8ICFjaGFuLT5vcHMtPnN0YXJ0X3htaXQoY2hhbiwgZnJhZykpCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZwY2gtPmZpbGUueHEpIHx8CisJCSAgICAhY2hhbi0+b3BzLT5zdGFydF94bWl0KGNoYW4sIGZyYWcpKQogCQkJc2tiX3F1ZXVlX3RhaWwoJnBjaC0+ZmlsZS54cSwgZnJhZyk7CiAJCXBjaC0+aGFkX2ZyYWcgPSAxOwogCQlwICs9IGZsZW47CkBAIC0xNDEyLDcgKzE0MTIsNyBAQAogCiAJc3Bpbl9sb2NrX2JoKCZwY2gtPmRvd25sKTsKIAlpZiAocGNoLT5jaGFuICE9IDApIHsKLQkJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnBjaC0+ZmlsZS54cSkgPiAwKSB7CisJCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZwY2gtPmZpbGUueHEpKSB7CiAJCQlza2IgPSBza2JfZGVxdWV1ZSgmcGNoLT5maWxlLnhxKTsKIAkJCWlmICghcGNoLT5jaGFuLT5vcHMtPnN0YXJ0X3htaXQocGNoLT5jaGFuLCBza2IpKSB7CiAJCQkJLyogcHV0IHRoZSBwYWNrZXQgYmFjayBhbmQgdHJ5IGFnYWluIGxhdGVyICovCkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmcGNoLT5kb3dubCk7CiAJLyogc2VlIGlmIHRoZXJlIGlzIGFueXRoaW5nIGZyb20gdGhlIGF0dGFjaGVkIHVuaXQgdG8gYmUgc2VudCAqLwotCWlmIChza2JfcXVldWVfbGVuKCZwY2gtPmZpbGUueHEpID09IDApIHsKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZwY2gtPmZpbGUueHEpKSB7CiAJCXJlYWRfbG9ja19iaCgmcGNoLT51cGwpOwogCQlwcHAgPSBwY2gtPnBwcDsKIAkJaWYgKHBwcCAhPSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYyBiL2RyaXZlcnMvbmV0L3BwcF9zeW5jdHR5LmMKaW5kZXggZmQ5ZjUwMS4uNGQ1MWMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwX3N5bmN0dHkuYworKysgYi9kcml2ZXJzL25ldC9wcHBfc3luY3R0eS5jCkBAIC00MDYsNyArNDA2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPnJlY3ZfbG9jaywgZmxhZ3MpOwogCXBwcF9zeW5jX2lucHV0KGFwLCBidWYsIGNmbGFncywgY291bnQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5yZWN2X2xvY2ssIGZsYWdzKTsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmYXAtPnJxdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmFwLT5ycXVldWUpKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZhcC0+dHNrKTsKIAlzcF9wdXQoYXApOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yODE2OS5jIGIvZHJpdmVycy9uZXQvcjgxNjkuYwppbmRleCBjZTQ0OWZlLi5kNWFmZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTE4NzYsNyArMTg3Niw3IEBACiAJc2tiX3Jlc2VydmUoc2tiLCBORVRfSVBfQUxJR04pOwogCSpza19idWZmID0gc2tiOwogCi0JbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHBkZXYsIHNrYi0+dGFpbCwgcnhfYnVmX3N6LAorCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwZGV2LCBza2ItPmRhdGEsIHJ4X2J1Zl9zeiwKIAkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCXJ0bDgxNjlfbWFwX3RvX2FzaWMoZGVzYywgbWFwcGluZywgcnhfYnVmX3N6KTsKQEAgLTIzMzYsNyArMjMzNiw3IEBACiAJCXNrYiA9IGRldl9hbGxvY19za2IocGt0X3NpemUgKyBORVRfSVBfQUxJR04pOwogCQlpZiAoc2tiKSB7CiAJCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7Ci0JCQlldGhfY29weV9hbmRfc3VtKHNrYiwgc2tfYnVmZlswXS0+dGFpbCwgcGt0X3NpemUsIDApOworCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHNrX2J1ZmZbMF0tPmRhdGEsIHBrdF9zaXplLCAwKTsKIAkJCSpza19idWZmID0gc2tiOwogCQkJcnRsODE2OV9tYXJrX3RvX2FzaWMoZGVzYywgcnhfYnVmX3N6KTsKIAkJCXJldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggOWMyMjRlYi4uZWE2MzhiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtMTY5OCwxMSArMTY5OSw5IEBACiAjZWxzZQogCQliYSA9ICZuaWMtPmJhW3Jpbmdfbm9dW2Jsb2NrX25vXVtvZmZdOwogCQlza2JfcmVzZXJ2ZShza2IsIEJVRjBfTEVOKTsKLQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIHNrYi0+ZGF0YTsKLQkJdG1wICs9IEFMSUdOX1NJWkU7Ci0JCXRtcCAmPSB+QUxJR05fU0laRTsKLQkJc2tiLT5kYXRhID0gKHZvaWQgKikgdG1wOwotCQlza2ItPnRhaWwgPSAodm9pZCAqKSB0bXA7CisJCXRtcCA9ICgodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhICYgQUxJR05fU0laRSk7CisJCWlmICh0bXApCisJCQlza2JfcmVzZXJ2ZShza2IsIChBTElHTl9TSVpFICsgMSkgLSB0bXApOwogCiAJCW1lbXNldChyeGRwLCAwLCBzaXplb2YoUnhEX3QpKTsKIAkJcnhkcC0+QnVmZmVyMl9wdHIgPSBwY2lfbWFwX3NpbmdsZQpAQCAtNDU5MywxOSArNDU5MiwxOSBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpKSB7CisJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkgewogCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJzMmlvX2luaXRfbmljOiBVc2luZyA2NGJpdCBETUFcbiIpOwogCQlkbWFfZmxhZyA9IFRSVUU7CiAKIAkJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzawotCQkgICAgKHBkZXYsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwkJICAgIChwZGV2LCBETUFfNjRCSVRfTUFTSykpIHsKIAkJCURCR19QUklOVChFUlJfREJHLAogCQkJCSAgIlVuYWJsZSB0byBvYnRhaW4gNjRiaXQgRE1BIGZvciBcCiAJCQkJCWNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOwogCQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmZVTCkpIHsKKwl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJzMmlvX2luaXRfbmljOiBVc2luZyAzMmJpdCBETUFcbiIpOwogCX0gZWxzZSB7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKaW5kZXggZTE1MzY5Yy4uZDYzODhlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMDAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKQEAgLTkwLDcgKzkwLDYgQEAKIAogCiAvKiBTQjEwMDAgaGFyZHdhcmUgcm91dGluZXMgdG8gYmUgdXNlZCBkdXJpbmcgb3Blbi9jb25maWd1cmF0aW9uIHBoYXNlcyAqLwotc3RhdGljIGlubGluZSB2b2lkIG5pY2VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKIHN0YXRpYyBpbmxpbmUgaW50IGNhcmRfd2FpdF9mb3JfYnVzeV9jbGVhcihjb25zdCBpbnQgaW9hZGRyW10sCiAJY29uc3QgY2hhciogbmFtZSk7CiBzdGF0aWMgaW5saW5lIGludCBjYXJkX3dhaXRfZm9yX3JlYWR5KGNvbnN0IGludCBpb2FkZHJbXSwgY29uc3QgY2hhciogbmFtZSwKQEAgLTI1NCwxMyArMjUzLDYgQEAKIAogc3RhdGljIGNvbnN0IGludCBUaW1lT3V0SmlmZmllcyA9ICg4NzUgKiBIWikgLyAxMDA7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuaWNlZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjcykKLXsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKLQlyZXR1cm47Ci19Ci0KIC8qIENhcmQgV2FpdCBGb3IgQnVzeSBDbGVhciAoY2Fubm90IGJlIHVzZWQgZHVyaW5nIGFuIGludGVycnVwdCkgKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBjYXJkX3dhaXRfZm9yX2J1c3lfY2xlYXIoY29uc3QgaW50IGlvYWRkcltdLCBjb25zdCBjaGFyKiBuYW1lKQpAQCAtNDc1LDcgKzQ2Nyw3IEBACiAJdWRlbGF5KDEwMDApOwogCW91dGIoMHgwLCBwb3J0KTsKIAlpbmIocG9ydCk7Ci0JbmljZWRlbGF5KDYwMDAwKTsKKwlzc2xlZXAoMSk7CiAJb3V0YigweDQsIHBvcnQpOwogCWluYihwb3J0KTsKIAl1ZGVsYXkoMTAwMCk7CkBAIC01MzcsNyArNTI5LDcgQEAKIAljb25zdCB1bnNpZ25lZCBjaGFyIENvbW1hbmQwWzZdID0gezB4ODAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwogCWNvbnN0IHVuc2lnbmVkIGNoYXIgQ29tbWFuZDFbNl0gPSB7MHg4MCwgMHgxNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CiAKLQluaWNlZGVsYXkoNTAwMDApOworCXNzbGVlcCgxKTsKIAlpZiAoKHN0YXR1cyA9IGNhcmRfc2VuZF9jb21tYW5kKGlvYWRkciwgbmFtZSwgQ29tbWFuZDAsIHN0KSkpCiAJCXJldHVybiBzdGF0dXM7CiAJaWYgKChzdGF0dXMgPSBjYXJkX3NlbmRfY29tbWFuZChpb2FkZHIsIG5hbWUsIENvbW1hbmQxLCBzdCkpKQpAQCAtOTQ0LDcgKzkzNiw3IEBACiAJLyogaW5pdGlhbGl6ZSBzYjEwMDAgKi8KIAlpZiAoKHN0YXR1cyA9IHNiMTAwMF9yZXNldChpb2FkZHIsIG5hbWUpKSkKIAkJcmV0dXJuIHN0YXR1czsKLQluaWNlZGVsYXkoMjAwMDAwKTsKKwlzc2xlZXAoMSk7CiAJaWYgKChzdGF0dXMgPSBzYjEwMDBfY2hlY2tfQ1JDKGlvYWRkciwgbmFtZSkpKQogCQlyZXR1cm4gc3RhdHVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMgYi9kcml2ZXJzL25ldC9zYjEyNTAtbWFjLmMKaW5kZXggZmQyZTdjMy4uN2FiZDU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMjUwLW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NiMTI1MC1tYWMuYwpAQCAtOTYzLDExICs5NjMsMTEgQEAKIAkvKgogCSAqIERvIG5vdCBpbnRlcnJ1cHQgcGVyIERNQSB0cmFuc2Zlci4KIAkgKi8KLQlkc2MtPmRzY3JfYSA9IHZpcnRfdG9fcGh5cyhzYl9uZXctPnRhaWwpIHwKKwlkc2MtPmRzY3JfYSA9IHZpcnRfdG9fcGh5cyhzYl9uZXctPmRhdGEpIHwKIAkJVl9ETUFfRFNDUkFfQV9TSVpFKE5VTUNBQ0hFQkxLUyhwa3RzaXplK0VUSEVSX0FMSUdOKSkgfAogCQkwOwogI2Vsc2UKLQlkc2MtPmRzY3JfYSA9IHZpcnRfdG9fcGh5cyhzYl9uZXctPnRhaWwpIHwKKwlkc2MtPmRzY3JfYSA9IHZpcnRfdG9fcGh5cyhzYl9uZXctPmRhdGEpIHwKIAkJVl9ETUFfRFNDUkFfQV9TSVpFKE5VTUNBQ0hFQkxLUyhwa3RzaXplK0VUSEVSX0FMSUdOKSkgfAogCQlNX0RNQV9EU0NSQV9JTlRFUlJVUFQ7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NoYXBlci5jIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKaW5kZXggMjBlZGViMy4uM2FkMGI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2hhcGVyLmMKKysrIGIvZHJpdmVycy9uZXQvc2hhcGVyLmMKQEAgLTEzNSwxMCArMTM1LDggQEAKIHsKIAlzdHJ1Y3Qgc2hhcGVyICpzaGFwZXIgPSBkZXYtPnByaXY7CiAgCXN0cnVjdCBza19idWZmICpwdHI7Ci0gICAKLQlpZiAoZG93bl90cnlsb2NrKCZzaGFwZXItPnNlbSkpCi0JCXJldHVybiAtMTsKLQorICAKKwlzcGluX2xvY2soJnNoYXBlci0+bG9jayk7CiAgCXB0cj1zaGFwZXItPnNlbmRxLnByZXY7CiAgCQogIAkvKgpAQCAtMjMyLDcgKzIzMCw3IEBACiAgICAgICAgICAgICAgICAgc2hhcGVyLT5zdGF0cy5jb2xsaXNpb25zKys7CiAgCX0KIAlzaGFwZXJfa2ljayhzaGFwZXIpOwotCXVwKCZzaGFwZXItPnNlbSk7CisJc3Bpbl91bmxvY2soJnNoYXBlci0+bG9jayk7CiAgCXJldHVybiAwOwogfQogCkBAIC0yNzEsMTEgKzI2OSw5IEBACiB7CiAJc3RydWN0IHNoYXBlciAqc2hhcGVyID0gKHN0cnVjdCBzaGFwZXIgKilkYXRhOwogCi0JaWYgKCFkb3duX3RyeWxvY2soJnNoYXBlci0+c2VtKSkgewotCQlzaGFwZXJfa2ljayhzaGFwZXIpOwotCQl1cCgmc2hhcGVyLT5zZW0pOwotCX0gZWxzZQotCQltb2RfdGltZXIoJnNoYXBlci0+dGltZXIsIGppZmZpZXMpOworCXNwaW5fbG9jaygmc2hhcGVyLT5sb2NrKTsKKwlzaGFwZXJfa2ljayhzaGFwZXIpOworCXNwaW5fdW5sb2NrKCZzaGFwZXItPmxvY2spOwogfQogCiAvKgpAQCAtMzMyLDIxICszMjgsNiBAQAogCiAKIC8qCi0gKglGbHVzaCB0aGUgc2hhcGVyIHF1ZXVlcyBvbiBhIGNsb3NlZG93bgotICovCi0gCi1zdGF0aWMgdm9pZCBzaGFwZXJfZmx1c2goc3RydWN0IHNoYXBlciAqc2hhcGVyKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlkb3duKCZzaGFwZXItPnNlbSk7Ci0Jd2hpbGUoKHNrYj1za2JfZGVxdWV1ZSgmc2hhcGVyLT5zZW5kcSkpIT1OVUxMKQotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0Jc2hhcGVyX2tpY2soc2hhcGVyKTsKLQl1cCgmc2hhcGVyLT5zZW0pOwotfQotCi0vKgogICoJQnJpbmcgdGhlIGludGVyZmFjZSB1cC4gV2UganVzdCBkaXNhbGxvdyB0aGlzIHVudGlsIGEgCiAgKgliaW5kLgogICovCkBAIC0zNzUsNyArMzU2LDE1IEBACiBzdGF0aWMgaW50IHNoYXBlcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzaGFwZXIgKnNoYXBlcj1kZXYtPnByaXY7Ci0Jc2hhcGVyX2ZsdXNoKHNoYXBlcik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNoYXBlci0+c2VuZHEpKSAhPSBOVUxMKQorCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlzcGluX2xvY2tfYmgoJnNoYXBlci0+bG9jayk7CisJc2hhcGVyX2tpY2soc2hhcGVyKTsKKwlzcGluX3VubG9ja19iaCgmc2hhcGVyLT5sb2NrKTsKKwogCWRlbF90aW1lcl9zeW5jKCZzaGFwZXItPnRpbWVyKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTU3Niw2ICs1NjUsNyBAQAogCWluaXRfdGltZXIoJnNoLT50aW1lcik7CiAJc2gtPnRpbWVyLmZ1bmN0aW9uPXNoYXBlcl90aW1lcjsKIAlzaC0+dGltZXIuZGF0YT0odW5zaWduZWQgbG9uZylzaDsKKwlzcGluX2xvY2tfaW5pdCgmc2gtPmxvY2spOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzOTAwLmMgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwppbmRleCAzMTA3YWVkLi4yM2I3MTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXM5MDAuYworKysgYi9kcml2ZXJzL25ldC9zaXM5MDAuYwpAQCAtNjYsNiArNjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+ICAgICAgLyogUHJvY2Vzc29yIHR5cGUgZm9yIGNhY2hlIGFsaWdubWVudC4gKi8KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTkzLDggKzk0LDYgQEAKIAogLyogVGltZSBpbiBqaWZmaWVzIGJlZm9yZSBjb25jbHVkaW5nIHRoZSB0cmFuc21pdHRlciBpcyBodW5nLiAqLwogI2RlZmluZSBUWF9USU1FT1VUICAoNCpIWikKLS8qIFNpUyA5MDAgaXMgY2FwYWJsZSBvZiAzMiBiaXRzIEJNIERNQSAqLwotI2RlZmluZSBTSVM5MDBfRE1BX01BU0sgMHhmZmZmZmZmZgogCiBlbnVtIHsKIAlTSVNfOTAwID0gMCwKQEAgLTQxNCw3ICs0MTMsNyBAQAogCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpOwogCWlmKHJldCkgcmV0dXJuIHJldDsKIAkKLQlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBTSVM5MDBfRE1BX01BU0spOworCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZihpKXsKIAkJcHJpbnRrKEtFUk5fRVJSICJzaXM5MDAuYzogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiCiAJCQkiMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOwpAQCAtMTE1NSw3ICsxMTU0LDcgQEAKIAkJc2lzX3ByaXYtPnJ4X3NrYnVmZltpXSA9IHNrYjsKIAkJc2lzX3ByaXYtPnJ4X3JpbmdbaV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgc2lzX3ByaXYtPnJ4X3JpbmdbaV0uYnVmcHRyID0gcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICBza2ItPnRhaWwsIFJYX0JVRl9TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kYXRhLCBSWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAl9CiAJc2lzX3ByaXYtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkgKGkgLSBOVU1fUlhfREVTQyk7CiAKQEAgLTE3NzcsNyArMTc3Niw3IEBACiAJCQlzaXNfcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKIAkJCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5jbWRzdHMgPSBSWF9CVUZfU0laRTsKICAgICAgICAgICAgICAgICAJc2lzX3ByaXYtPnJ4X3JpbmdbZW50cnldLmJ1ZnB0ciA9IAotCQkJCXBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCBza2ItPnRhaWwsIAorCQkJCXBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCBza2ItPmRhdGEsIAogCQkJCQlSWF9CVUZfU0laRSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXNpc19wcml2LT5kaXJ0eV9yeCsrOwogCQl9CkBAIC0xODEwLDcgKzE4MDksNyBAQAogCQkJc2lzX3ByaXYtPnJ4X3NrYnVmZltlbnRyeV0gPSBza2I7CiAJCQlzaXNfcHJpdi0+cnhfcmluZ1tlbnRyeV0uY21kc3RzID0gUlhfQlVGX1NJWkU7CiAgICAgICAgICAgICAgICAgCXNpc19wcml2LT5yeF9yaW5nW2VudHJ5XS5idWZwdHIgPQotCQkJCXBjaV9tYXBfc2luZ2xlKHNpc19wcml2LT5wY2lfZGV2LCBza2ItPnRhaWwsCisJCQkJcGNpX21hcF9zaW5nbGUoc2lzX3ByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSwKIAkJCQkJUlhfQlVGX1NJWkUsIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zazk4bGluL3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCmluZGV4IDFjY2IyOTguLjgyNTcwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jCkBAIC0xMTIsNiArMTEyLDcgQEAKICNpbmNsdWRlCTxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUJPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIAk8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUJPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlCSJoL3NrZHJ2MXN0LmgiCiAjaW5jbHVkZQkiaC9za2RydjJuZC5oIgpAQCAtNDkxMiw4ICs0OTEzLDggQEAKIAkJZ290byBvdXQ7CiAgCiAJLyogQ29uZmlndXJlIERNQSBhdHRyaWJ1dGVzLiAqLwotCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICh1NjQpIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkgJiYKLQkgICAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCAodTY0KSAweGZmZmZmZmZmKSkKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfNjRCSVRfTUFTSykgJiYKKwkgICAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpCiAJCWdvdG8gb3V0X2Rpc2FibGVfZGV2aWNlOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9za2ZwL01ha2VmaWxlCmluZGV4IDZjZmNjZmIuLmNiMjM1ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9NYWtlZmlsZQpAQCAtNiw4ICs2LDggQEAKIAogc2tmcC1vYmpzIDo9ICBza2ZkZGkubyAgICBod210bS5vICAgIGZwbHVzdG0ubyAgc210Lm8gICAgICBjZm0ubyAgICAgXAogICAgICAgICAgICAgICBlY20ubyAgICAgICBwY21wbGMubyAgIHBtZi5vICAgICAgcXVldWUubyAgICBybXQubyAgICAgXAotCSAgICAgIHNtdGRlZi5vICAgIHNtdGluaXQubyAgc210dGltZXIubyBzcmYubyAgICAgIGxua3N0YXQubyBcCi0gICAgICAgICAgICAgIHNtdHBhcnNlLm8gIGh3dC5vICAgICAgZHJ2ZmJpLm8gICBlc3MubworCSAgICAgIHNtdGRlZi5vICAgIHNtdGluaXQubyAgc210dGltZXIubyBzcmYubyAgICAgIGh3dC5vICAgICBcCisJICAgICAgZHJ2ZmJpLm8gICBlc3MubwogCiAjIE5PVEU6CiAjICAgQ29tcGlsaW5nIHRoaXMgZHJpdmVyIHByb2R1Y2VzIHNvbWUgd2FybmluZ3MgKGFuZCBzb21lIG1vcmUgYXJlIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYyBiL2RyaXZlcnMvbmV0L3NrZnAvZHJ2ZmJpLmMKaW5kZXggMDUyZTg0MS4uNWI0NzU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9kcnZmYmkuYworKysgYi9kcml2ZXJzL25ldC9za2ZwL2RydmZiaS5jCkBAIC0xMDUsOCArMTA1LDggQEAKICNlbmRpZgogCiAKLS8qIFByb3RvdHlwZXMgb2YgbG9jYWwgZnVuY3Rpb25zLiAqLwotdm9pZCBzbXRfc3RvcF93YXRjaGRvZyhzdHJ1Y3Qgc19zbWMgKnNtYyk7CisvKiBQcm90b3R5cGUgb2YgYSBsb2NhbCBmdW5jdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHNtdF9zdG9wX3dhdGNoZG9nKHN0cnVjdCBzX3NtYyAqc21jKTsKIAogI2lmZGVmIE1DQQogc3RhdGljIGludCByZWFkX2NhcmRfaWQoKSA7CkBAIC02MzEsNyArNjMxLDcgQEAKICAqCUxFRF9ZX09GRglqdXN0IHN3aXRjaCB5ZWxsb3cgTEVEIG9mZgogICoJTEVEX1lfT04JanVzdCBzd2l0Y2ggeWVsbG8gTEVEIG9uCiAgKi8KLXZvaWQgbGVkX2luZGljYXRpb24oc3RydWN0IHNfc21jICpzbWMsIGludCBsZWRfZXZlbnQpCitzdGF0aWMgdm9pZCBsZWRfaW5kaWNhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxlZF9ldmVudCkKIHsKIAkvKiB1c2Ugc21jLT5ody5tYWNfcmluZ19pc191cCA9PSBUUlVFIAogCSAqIGFzIGluZGljYXRpb24gZm9yIFJpbmcgT3BlcmF0aW9uYWwKQEAgLTc2NCwxMjIgKzc2NCw2IEBACiAjZW5kaWYKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRE1BIGluaXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYJSVNBCi0KLS8qCi0gKiBpbml0IERNQQotICovCi12b2lkIGluaXRfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQotewotCVNLX1VOVVNFRChzbWMpIDsKLQotCS8qCi0JICogc2V0IGNhc2NhZGUgbW9kZSwKLQkgKiBjbGVhciBtYXNrIGJpdCAoZW5hYmxlIERNQSBjYW5uYWwpCi0JICovCi0JaWYgKGRtYSA+IDMpIHsKLQkJb3V0cCgweGQ2LChkbWEgJiAweDAzKSB8IDB4YzApIDsKLQkJb3V0cCgweGQ0LCBkbWEgJiAweDAzKSA7Ci0JfQotCWVsc2UgewotCQlvdXRwKDB4MGIsKGRtYSAmIDB4MDMpIHwgMHhjMCkgOwotCQlvdXRwKDB4MGEsZG1hICYgMHgwMykgOwotCX0KLX0KLQotLyoKLSAqIGRpc2FibGUgRE1BCi0gKi8KLXZvaWQgZGlzX2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKLXsKLQlTS19VTlVTRUQoc21jKSA7Ci0KLQkvKgotCSAqIHNldCBtYXNrIGJpdCAoZGlzYWJsZSBETUEgY2FubmFsKQotCSAqLwotCWlmIChkbWEgPiAzKSB7Ci0JCW91dHAoMHhkNCwoZG1hICYgMHgwMykgfCAweDA0KSA7Ci0JfQotCWVsc2UgewotCQlvdXRwKDB4MGEsKGRtYSAmIDB4MDMpIHwgMHgwNCkgOwotCX0KLX0KLQotI2VuZGlmCS8qIElTQSAqLwotCi0jaWZkZWYJRUlTQQotCi0vKmFycmF5cyB3aXRoIGlvIGFkZHJlc3NlcyBvZiBkbWEgY29udHJvbGxlciBsZW5ndGggYW5kIGFkZHJlc3MgcmVnaXN0ZXJzKi8KLXN0YXRpYyBjb25zdCBpbnQgY250cls4XSA9IHsgMHgwMDEsMHgwMDMsMHgwMDUsMHgwMDcsMCwweDBjNiwweDBjYSwweDBjZSB9IDsKLXN0YXRpYyBjb25zdCBpbnQgYmFzZVs4XSA9IHsgMHgwMDAsMHgwMDIsMHgwMDQsMHgwMDYsMCwweDBjNCwweDBjOCwweDBjYyB9IDsKLXN0YXRpYyBjb25zdCBpbnQgcGFnZVs4XSA9IHsgMHgwODcsMHgwODMsMHgwODEsMHgwODIsMCwweDA4YiwweDA4OSwweDA4YSB9IDsKLQotdm9pZCBpbml0X2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKLXsKLQkvKgotCSAqIGV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIKLQkgKiAzMiBiaXQgSU8KLQkgKiB0eXBlIGMKLQkgKiBUQyBvdXRwdXQKLQkgKiBkaXNhYmxlIHN0b3AKLQkgKi8KLQotCS8qIG1vZGUgcmVhZCAod3JpdGUpIGRlbWFuZCAqLwotCXNtYy0+aHcuZG1hX3Jtb2RlID0gKGRtYSAmIDMpIHwgMHgwOCB8IDB4MCA7Ci0Jc21jLT5ody5kbWFfd21vZGUgPSAoZG1hICYgMykgfCAweDA0IHwgMHgwIDsKLQotCS8qIDMyIGJpdCBJTydzLCBidXJzdCBETUEgbW9kZSAodHlwZSAiQyIpICovCi0Jc21jLT5ody5kbWFfZW1vZGUgPSAoZG1hICYgMykgfCAweDA4IHwgMHgzMCA7Ci0KLQlvdXRwKChkbWEgPCA0KSA/IDB4NDBiIDogMHg0ZDYsc21jLT5ody5kbWFfZW1vZGUpIDsKLQotCS8qIGRpc2FibGUgY2hhaW5pbmcgKi8KLQlvdXRwKChkbWEgPCA0KSA/IDB4NDBhIDogMHg0ZDQsKGRtYSYzKSkgOwotCi0JLypsb2FkIGRtYSBjb250cm9sbGVyIGFkZHJlc3NlcyBmb3IgZmFzdCBhY2Nlc3MgZHVyaW5nIHNldCBkbWEqLwotCXNtYy0+aHcuZG1hX2Jhc2Vfd29yZF9jb3VudCA9IGNudHJbc21jLT5ody5kbWFdOwotCXNtYy0+aHcuZG1hX2Jhc2VfYWRkcmVzcyA9IGJhc2Vbc21jLT5ody5kbWFdOwotCXNtYy0+aHcuZG1hX2Jhc2VfYWRkcmVzc19wYWdlID0gcGFnZVtzbWMtPmh3LmRtYV07Ci0KLX0KLQotdm9pZCBkaXNfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQotewotCVNLX1VOVVNFRChzbWMpIDsKLQotCW91dHAoKGRtYSA8IDQpID8gMHgwYSA6IDB4ZDQsKGRtYSYzKXw0KSA7LyogbWFzayBiaXQgKi8KLX0KLSNlbmRpZgkvKiBFSVNBICovCi0KLSNpZmRlZglNQ0EKLXZvaWQgaW5pdF9kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCi17Ci0JU0tfVU5VU0VEKHNtYykgOwotCVNLX1VOVVNFRChkbWEpIDsKLX0KLQotdm9pZCBkaXNfZG1hKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgZG1hKQotewotCVNLX1VOVVNFRChzbWMpIDsKLQlTS19VTlVTRUQoZG1hKSA7Ci19Ci0jZW5kaWYKLQotI2lmZGVmCVBDSQotdm9pZCBpbml0X2RtYShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGRtYSkKLXsKLQlTS19VTlVTRUQoc21jKSA7Ci0JU0tfVU5VU0VEKGRtYSkgOwotfQotCi12b2lkIGRpc19kbWEoc3RydWN0IHNfc21jICpzbWMsIGludCBkbWEpCi17Ci0JU0tfVU5VU0VEKHNtYykgOwotCVNLX1VOVVNFRChkbWEpIDsKLX0KLSNlbmRpZgotCiAjaWZkZWYgTVVMVF9PRU0KIHN0YXRpYyBpbnQgaXNfZXF1YWxfbnVtKGNoYXIgY29tcDFbXSwgY2hhciBjb21wMltdLCBpbnQgbnVtKQogewpAQCAtMTQwNyw3ICsxMjkxLDcgQEAKICNlbmRpZgkvKiBERUJVRyAqLwogfQogCi12b2lkIHNtdF9zdG9wX3dhdGNoZG9nKHN0cnVjdCBzX3NtYyAqc21jKQorc3RhdGljIHZvaWQgc210X3N0b3Bfd2F0Y2hkb2coc3RydWN0IHNfc21jICpzbWMpCiB7CiAJU0tfVU5VU0VEKHNtYykgOwkvKiBNYWtlIExJTlQgaGFwcHkuICovCiAjaWZuZGVmCURFQlVHCkBAIC0xNDIyLDEwNCArMTMwNiw2IEBACiB9CiAKICNpZmRlZglQQ0kKLXN0YXRpYyBjaGFyIGdldF9yb21fYnl0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgdV9zaG9ydCBhZGRyKQotewotCUdFVF9QQUdFKGFkZHIpIDsKLQlyZXR1cm4gKFJFQURfUFJPTShBRERSKEIyX0ZEUCkpKSA7Ci19Ci0KLS8qCi0gKiBST00gaW1hZ2UgZGVmaW5lcwotICovCi0jZGVmaW5lCVJPTV9TSUdfMQkwCi0jZGVmaW5lIFJPTV9TSUdfMgkxCi0jZGVmaW5lIFBDSV9EQVRBXzEJMHgxOAotI2RlZmluZSBQQ0lfREFUQV8yCTB4MTkKLQotLyoKLSAqIFBDSSBkYXRhIHN0cnVjdHVyZSBkZWZpbmVzCi0gKi8KLSNkZWZpbmUJVlBEX0RBVEFfMQkweDA4Ci0jZGVmaW5lCVZQRF9EQVRBXzIJMHgwOQotI2RlZmluZSBJTUFHRV9MRU5fMQkweDEwCi0jZGVmaW5lIElNQUdFX0xFTl8yCTB4MTEKLSNkZWZpbmUJQ09ERV9UWVBFCTB4MTQKLSNkZWZpbmUJSU5ESUNBVE9SCTB4MTUKLQotLyoKLSAqCUJFR0lOX01BTlVBTF9FTlRSWShtYWNfZHJ2X3ZwZF9yZWFkKQotICoJbWFjX2Rydl92cGRfcmVhZChzbWMsYnVmLHNpemUsaW1hZ2UpCi0gKgotICogZnVuY3Rpb24JRE9XTkNBTEwJKEZERElXQVJFKQotICoJCXJlYWRzIHRoZSBWUEQgZGF0YSBvZiB0aGUgRlBST00gYW5kIHdyaXRlcyBpdCBpbnRvIHRoZQotICoJCWJ1ZmZlcgotICoKLSAqIHBhcmEJYnVmCXBvaW50cyB0byB0aGUgYnVmZmVyIGZvciB0aGUgVlBEIGRhdGEKLSAqCXNpemUJc2l6ZSBvZiB0aGUgVlBEIGRhdGEgYnVmZmVyCi0gKglpbWFnZQlib290IGltYWdlOyBjb2RlIHR5cGUgb2YgdGhlIGJvb3QgaW1hZ2UKLSAqCQlpbWFnZSA9IDAJSW50ZWwgeDg2LCBQQy1BVCBjb21wYXRpYmxlCi0gKgkJCTEJT1BFTkJPT1Qgc3RhbmRhcmQgZm9yIFBDSQotICoJCQkyLUZGCXJlc2VydmVkCi0gKgotICogcmV0dXJucwlsZW4JbnVtYmVyIG9mIFZQRCBkYXRhIGJ5dGVzIHJlYWQgZm9ybSB0aGUgRlBST00KLSAqCQk8MAludW1iZXIgb2YgcmVhZCBieXRlcwotICoJCT4wCWVycm9yOiBkYXRhIGludmFsaWQKLSAqCi0gKglFTkRfTUFOVUFMX0VOVFJZCi0gKi8KLWludCBtYWNfZHJ2X3ZwZF9yZWFkKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICpidWYsIGludCBzaXplLCBjaGFyIGltYWdlKQotewotCXVfc2hvcnQJaWJhc2UgOwotCXVfc2hvcnQgcGNpX2Jhc2UgOwotCXVfc2hvcnQgdnBkIDsKLQlpbnQJbGVuIDsKLQotCWxlbiA9IDAgOwotCWliYXNlID0gMCA7Ci0JLyoKLQkgKiBhcyBsb25nIGltYWdlcyBkZWZpbmVkCi0JICovCi0Jd2hpbGUgKGdldF9yb21fYnl0ZShzbWMsaWJhc2UrUk9NX1NJR18xKSA9PSAweDU1ICYmCi0JCSh1X2NoYXIpIGdldF9yb21fYnl0ZShzbWMsaWJhc2UrUk9NX1NJR18yKSA9PSAweGFhKSB7Ci0JCS8qCi0JCSAqIGdldCB0aGUgcG9pbnRlciB0byB0aGUgUENJIGRhdGEgc3RydWN0dXJlCi0JCSAqLwotCQlwY2lfYmFzZSA9IGliYXNlICsgZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStQQ0lfREFUQV8xKSArCi0JCQkJKGdldF9yb21fYnl0ZShzbWMsaWJhc2UrUENJX0RBVEFfMikgPDwgOCkgOwotCi0JCWlmIChpbWFnZSA9PSBnZXRfcm9tX2J5dGUoc21jLHBjaV9iYXNlK0NPREVfVFlQRSkpIHsKLQkJCS8qCi0JCQkgKiB3ZSBoYXZlIHRoZSByaWdodCBpbWFnZSwgcmVhZCB0aGUgVlBEIGRhdGEKLQkJCSAqLwotCQkJdnBkID0gaWJhc2UgKyBnZXRfcm9tX2J5dGUoc21jLHBjaV9iYXNlK1ZQRF9EQVRBXzEpICsKLQkJCQkoZ2V0X3JvbV9ieXRlKHNtYyxwY2lfYmFzZStWUERfREFUQV8yKSA8PCA4KSA7Ci0JCQlpZiAodnBkID09IGliYXNlKSB7Ci0JCQkJYnJlYWsgOwkJLyogbm8gVlBEIGRhdGEgKi8KLQkJCX0KLQkJCWZvciAobGVuID0gMDsgbGVuIDwgc2l6ZTsgbGVuKyssYnVmKyssdnBkKyspIHsKLQkJCQkqYnVmID0gZ2V0X3JvbV9ieXRlKHNtYyx2cGQpIDsKLQkJCX0KLQkJCWJyZWFrIDsKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiB0cnkgdGhlIG5leHQgaW1hZ2UKLQkJCSAqLwotCQkJaWYgKGdldF9yb21fYnl0ZShzbWMscGNpX2Jhc2UrSU5ESUNBVE9SKSAmIDB4ODApIHsKLQkJCQlicmVhayA7CQkvKiB0aGlzIHdhcyB0aGUgbGFzdCBpbWFnZSAqLwotCQkJfQotCQkJaWJhc2UgPSBpYmFzZSArIGdldF9yb21fYnl0ZShzbWMsaWJhc2UrSU1BR0VfTEVOXzEpICsKLQkJCQkoZ2V0X3JvbV9ieXRlKHNtYyxpYmFzZStJTUFHRV9MRU5fMikgPDwgOCkgOwotCQl9Ci0JfQotCi0JcmV0dXJuKGxlbikgOwotfQotCi12b2lkIG1hY19kcnZfcGNpX2ZpeChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9sb25nIGZpeF92YWx1ZSkKLXsKLQlzbWMtPmh3LnBjaV9maXhfdmFsdWUgPSBmaXhfdmFsdWUgOwotfQogCiB2b2lkIG1hY19kb19wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9lc3MuYyBiL2RyaXZlcnMvbmV0L3NrZnAvZXNzLmMKaW5kZXggZmQzOWI0Yi4uNjJiMDEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9lc3MuYworKysgYi9kcml2ZXJzL25ldC9za2ZwL2Vzcy5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIHZvaWQgZXNzX3BhcmFfY2hhbmdlKHN0cnVjdCBzX3NtYyAqc21jKTsKIGludCBlc3NfcmFmX3JlY2VpdmVkX3BhY2soc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYiwgc3RydWN0IHNtdF9oZWFkZXIgKnNtLAogCQkJICBpbnQgZnMpOwotaW50IHByb2Nlc3NfYndfYWxsb2Moc3RydWN0IHNfc21jICpzbWMsIGxvbmcgaW50IHBheWxvYWQsIGxvbmcgaW50IG92ZXJoZWFkKTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19id19hbGxvYyhzdHJ1Y3Qgc19zbWMgKnNtYywgbG9uZyBpbnQgcGF5bG9hZCwgbG9uZyBpbnQgb3ZlcmhlYWQpOwogCiAKIC8qCkBAIC0zNzUsNyArMzc1LDcgQEAKICAqIGRldGVybWluZXMgdGhlIHN5bmNocm9ub3VzIGJhbmR3aWR0aCwgc2V0IHRoZSBUU1lOQyByZWdpc3RlciBhbmQgdGhlCiAgKiBtaWIgdmFyaWFibGVzIFNCQVBheWxvYWQsIFNCQU92ZXJoZWFkIGFuZCBmZGRpTUFDVC1ORUcuCiAgKi8KLWludCBwcm9jZXNzX2J3X2FsbG9jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIGludCBwYXlsb2FkLCBsb25nIGludCBvdmVyaGVhZCkKK3N0YXRpYyBpbnQgcHJvY2Vzc19id19hbGxvYyhzdHJ1Y3Qgc19zbWMgKnNtYywgbG9uZyBpbnQgcGF5bG9hZCwgbG9uZyBpbnQgb3ZlcmhlYWQpCiB7CiAJLyoKIAkgKiBkZXRlcm1pbmUgdGhlIHN5bmNocm9ub3VzIGJhbmR3aWR0aCAoc3luY19idykgaW4gYnl0ZXMgcGVyIFQtTkVHLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9mcGx1c3RtLmMgYi9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYwppbmRleCA3NmU3ODQ0Li5hMmVkNDdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYworKysgYi9kcml2ZXJzL25ldC9za2ZwL2ZwbHVzdG0uYwpAQCAtMTExNywzMCArMTExNyw2IEBACiAvKgogCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsyKQogCi0JaW50IG1hY19zZXRfZnVuY19hZGRyKHNtYyxmX2FkZHIpCi0Jc3RydWN0IHNfc21jICpzbWMgOwotCXVfbG9uZyBmX2FkZHIgOwotCi1GdW5jdGlvbglET1dOQ0FMTAkoU01ULCBmcGx1c3RtLmMpCi0JCVNldCBhIFRva2VuLVJpbmcgZnVuY3Rpb25hbCBhZGRyZXNzLCB0aGUgYWRkcmVzcyB3aWxsCi0JCWJlIGFjdGl2YXRlZCBhZnRlciBjYWxsaW5nIG1hY191cGRhdGVfbXVsdGljYXN0KCkKLQotUGFyYQlmX2FkZHIJZnVuY3Rpb25hbCBiaXRzIGluIG5vbi1jYW5vbmljYWwgZm9ybWF0Ci0KLVJldHVybnMJMDogYWx3YXlzIHN1Y2Nlc3MKLQotCUVORF9NQU5VQUxfRU5UUlkoKQotICovCi1pbnQgbWFjX3NldF9mdW5jX2FkZHIoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyBmX2FkZHIpCi17Ci0Jc21jLT5ody5mcC5mdW5jX2FkZHIgPSBmX2FkZHIgOwotCXJldHVybigwKSA7Ci19Ci0KLQotLyoKLQlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MikKLQogCWludCBtYWNfYWRkX211bHRpY2FzdChzbWMsYWRkcixjYW4pCiAJc3RydWN0IHNfc21jICpzbWMgOwogCXN0cnVjdCBmZGRpX2FkZHIgKmFkZHIgOwpAQCAtMTIwMyw1MiArMTE3OSw2IEBACiB9CiAKIC8qCi0JQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzIpCi0KLQl2b2lkIG1hY19kZWxfbXVsdGljYXN0KHNtYyxhZGRyLGNhbikKLQlzdHJ1Y3Qgc19zbWMgKnNtYyA7Ci0Jc3RydWN0IGZkZGlfYWRkciAqYWRkciA7Ci0JaW50IGNhbiA7Ci0KLUZ1bmN0aW9uCURPV05DQUxMCShTTVQsIGZwbHVzdG0uYykKLQkJRGVsZXRlIGFuIGVudHJ5IGZyb20gdGhlIG11bHRpY2FzdCB0YWJsZQotCi1QYXJhCWFkZHIJcG9pbnRlciB0byBhIG11bHRpY2FzdCBhZGRyZXNzCi0JY2FuCT0gMDoJdGhlIG11bHRpY2FzdCBhZGRyZXNzIGhhcyB0aGUgcGh5c2ljYWwgZm9ybWF0Ci0JCT0gMToJdGhlIG11bHRpY2FzdCBhZGRyZXNzIGhhcyB0aGUgY2Fub25pY2FsIGZvcm1hdAotCQl8IDB4ODAJcGVybWFuZW50Ci0KLQlFTkRfTUFOVUFMX0VOVFJZKCkKLSAqLwotdm9pZCBtYWNfZGVsX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IGZkZGlfYWRkciAqYWRkciwgaW50IGNhbikKLXsKLQlTS19MT0NfREVDTChzdHJ1Y3QgZmRkaV9hZGRyLG93bikgOwotCXN0cnVjdCBzX2ZwbWMJKnRiIDsKLQotCWlmICghKHRiID0gbWFjX2dldF9tY190YWJsZShzbWMsYWRkciwmb3duLDEsY2FuICYgfjB4ODApKSkKLQkJcmV0dXJuIDsKLQkvKgotCSAqIHBlcm1hbmVudCBhZGRyZXNzZXMgbXVzdCBiZSBkZWxldGVkIHdpdGggcGVybSBiaXQKLQkgKiBhbmQgdmljZSB2ZXJzYQotCSAqLwotCWlmICgoIHRiLT5wZXJtICYmICAoY2FuICYgMHg4MCkpIHx8Ci0JICAgICghdGItPnBlcm0gJiYgIShjYW4gJiAweDgwKSkpIHsKLQkJLyoKLQkJICogZGVsZXRlIGl0Ci0JCSAqLwotCQlpZiAodGItPm4pIHsKLQkJCXRiLT5uLS0gOwotCQkJaWYgKHRiLT5wZXJtKSB7Ci0JCQkJc21jLT5ody5mcC5zbXRfc2xvdHNfdXNlZC0tIDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNtYy0+aHcuZnAub3Nfc2xvdHNfdXNlZC0tIDsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKICAqIG1vZGUKICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2gvY210ZGVmLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvY210ZGVmLmgKaW5kZXggNjAzOTgyZC4uZjJmNzcxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9oL2NtdGRlZi5oCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvaC9jbXRkZWYuaApAQCAtNTA3LDcgKzUwNyw2IEBACiAJCSAgICAgIGludCAqcmVtb3RlLCBpbnQgKm1hYyk7CiB2b2lkIHBsY19jb25maWdfbXV4KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbXV4KTsKIHZvaWQgc21fbGVtX2V2YWx1YXRlKHN0cnVjdCBzX3NtYyAqc21jKTsKLXZvaWQgc210X2NsZWFyX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBtYWNfdXBkYXRlX2NvdW50ZXIoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBzbV9wbV9sc19sYXRjaChzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHBoeSwgaW50IG9uX29mZik7CiB2b2lkIHNtX21hX2NvbnRyb2woc3RydWN0IHNfc21jICpzbWMsIGludCBtb2RlKTsKQEAgLTU0MSwxMSArNTQwLDkgQEAKIHVfbG9uZyBzbXRfZ2V0X3RpbWUodm9pZCk7CiB1X2xvbmcgc210X2dldF90aWQoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBzbXRfdGltZXJfZG9uZShzdHJ1Y3Qgc19zbWMgKnNtYyk7Ci12b2lkIHNtdF9zZXRfZGVmYXVsdHMoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBzbXRfZml4dXBfbWliKHN0cnVjdCBzX3NtYyAqc21jKTsKIHZvaWQgc210X3Jlc2V0X2RlZmF1bHRzKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbGV2ZWwpOwogdm9pZCBzbXRfYWdlbnRfdGFzayhzdHJ1Y3Qgc19zbWMgKnNtYyk7Ci12b2lkIHNtdF9wbGVhc2VfcmVjb25uZWN0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcmVjb25uX3RpbWUpOwogaW50IHNtdF9jaGVja19wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X2hlYWRlciAqc20sCiAJCSAgIGNvbnN0IHVfc2hvcnQgbGlzdFtdKTsKIHZvaWQgZHJpdmVyX2dldF9iaWEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmJpYV9hZGRyKTsKQEAgLTU2OCw3ICs1NjUsNiBAQAogaW50IHBjbV9yb290ZWRfc3RhdGlvbihzdHJ1Y3Qgc19zbWMgKnNtYyk7CiBpbnQgY2ZtX2dldF9tYWNfaW5wdXQoc3RydWN0IHNfc21jICpzbWMpOwogaW50IGNmbV9nZXRfbWFjX291dHB1dChzdHJ1Y3Qgc19zbWMgKnNtYyk7Ci1pbnQgcG9ydF90b19taWIoc3RydWN0IHNfc21jICpzbWMsIGludCBwKTsKIGludCBjZW1fYnVpbGRfcGF0aChzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqdG8sIGludCBwYXRoX2luZGV4KTsKIGludCBzbV9tYWNfZ2V0X3R4X3N0YXRlKHN0cnVjdCBzX3NtYyAqc21jKTsKIGNoYXIgKmdldF9wY21zdGF0ZShzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IG5wKTsKQEAgLTU4MCw4ICs1NzYsNiBAQAogdm9pZCBzbXRfc2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyICpwKTsKIHZvaWQgbWFjX3NldF9yeF9tb2RlKHN0cnVjdCBzX3NtYyAqc21jLAlpbnQgbW9kZSk7CiBpbnQgbWFjX2FkZF9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmFkZHIsIGludCBjYW4pOwotaW50IG1hY19zZXRfZnVuY19hZGRyKHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgZl9hZGRyKTsKLXZvaWQgbWFjX2RlbF9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmFkZHIsIGludCBjYW4pOwogdm9pZCBtYWNfdXBkYXRlX211bHRpY2FzdChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIG1hY19jbGVhcl9tdWx0aWNhc3Qoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBzZXRfZm9ybWFjX3RzeW5jKHN0cnVjdCBzX3NtYyAqc21jLCBsb25nIHN5bmNfYncpOwpAQCAtNTk5LDcgKzU5Myw2IEBACiBpbnQgc210X3NldF9tYWNfb3B2YWx1ZXMoc3RydWN0IHNfc21jICpzbWMpOwogCiAjaWZkZWYgVEFHX01PREUKLXZvaWQgbWFjX2Rydl9wY2lfZml4KHN0cnVjdCBzX3NtYyAqc21jLCB1X2xvbmcgZml4X3ZhbHVlKTsKIHZvaWQgbWFjX2RvX3BjaV9maXgoc3RydWN0IHNfc21jICpzbWMpOwogdm9pZCBtYWNfZHJ2X2NsZWFyX3R4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKTsKIHZvaWQgbWFjX2Rydl9yZXBhaXJfZGVzY3Ioc3RydWN0IHNfc21jICpzbWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9oL2h3bXRtLmggYi9kcml2ZXJzL25ldC9za2ZwL2gvaHdtdG0uaAppbmRleCA0ZTM2MGFmLi4xYTYwNmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL2gvaHdtdG0uaAorKysgYi9kcml2ZXJzL25ldC9za2ZwL2gvaHdtdG0uaApAQCAtMjYyLDMxICsyNjIsNiBAQAogCQkJCQkoc21jKS0+aHcuZnAudHhfcVtxdWV1ZV0udHhfY3Vycl9wdXQKIAogLyoKLSAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fVFhfQ0hFQ0spCi0gKgl2b2lkIEhXTV9UWF9DSEVDSyhzbWMsZnJhbWVfc3RhdHVzLGxvd193YXRlcikKLSAqCi0gKiBmdW5jdGlvbglNQUNSTwkJKGhhcmR3YXJlIG1vZHVsZSwgaHdtdG0uaCkKLSAqCQlUaGlzIG1hY3JvIGlzIGludm9rZWQgYnkgdGhlIE9TLXNwZWNpZmljIGJlZm9yZSBpdCBsZWZ0IGl0J3MKLSAqCQlkcml2ZXJfc2VuZCBmdW5jdGlvbi4gVGhpcyBtYWNybyBjYWxscyBtYWNfZHJ2X2NsZWFyX3R4ZAotICoJCWlmIHRoZSBmcmVlIFR4RHMgb2YgdGhlIGN1cnJlbnQgdHJhbnNtaXQgcXVldWUgaXMgZXF1YWwgb3IKLSAqCQlsb3dlciB0aGFuIHRoZSBnaXZlbiBsb3cgd2F0ZXIgbWFyay4KLSAqCi0gKiBwYXJhCWZyYW1lX3N0YXR1cwlzdGF0dXMgb2YgdGhlIGZyYW1lLCBzZWUgZGVzaWduIGRlc2NyaXB0aW9uCi0gKglsb3dfd2F0ZXIJbG93IHdhdGVyIG1hcmsgb2YgZnJlZSBUeEQncwotICoKLSAqCUVORF9NQU5VQUxfRU5UUlkKLSAqLwotI2lmbmRlZiBIV01fTk9fRkxPV19DVEwKLSNkZWZpbmUJSFdNX1RYX0NIRUNLKHNtYyxmcmFtZV9zdGF0dXMsbG93X3dhdGVyKSB7XAotCWlmICgobG93X3dhdGVyKT49KHNtYyktPmh3LmZwLnR4X3FbKGZyYW1lX3N0YXR1cykmUVVFVUVfQTBdLnR4X2ZyZWUpIHtcCi0JCW1hY19kcnZfY2xlYXJfdHhkKHNtYykgO1wKLQl9XAotfQotI2Vsc2UKLSNkZWZpbmUJSFdNX1RYX0NIRUNLKHNtYyxmcmFtZV9zdGF0dXMsbG93X3dhdGVyKQltYWNfZHJ2X2NsZWFyX3R4ZChzbWMpCi0jZW5kaWYKLQotLyoKICAqCUJFR0lOX01BTlVBTF9FTlRSWShIV01fR0VUX1JYX0ZSQUdfTEVOKQogICoJaW50IEhXTV9HRVRfUlhfRlJBR19MRU4ocnhkKQogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvaC9vc2RlZjFzdC5oIGIvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmgKaW5kZXggNTM1OWViNS4uNzYzY2ExOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmgKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9oL29zZGVmMXN0LmgKQEAgLTIwLDYgKzIwLDggQEAKIC8vIEhXTSAoSGFyZFdhcmUgTW9kdWxlKSBEZWZpbml0aW9ucwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKwogI2lmZGVmIF9fTElUVExFX0VORElBTgogI2RlZmluZSBMSVRUTEVfRU5ESUFOCiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9od210bS5jIGIvZHJpdmVycy9uZXQvc2tmcC9od210bS5jCmluZGV4IDE4ZDQyOTAuLjQzOGY0MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvaHdtdG0uYworKysgYi9kcml2ZXJzL25ldC9za2ZwL2h3bXRtLmMKQEAgLTg2LDYgKzg2LDcgQEAKIHN0YXRpYyB1X2xvbmcgcmVwYWlyX3J4ZF9yaW5nKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc19zbXRfcnhfcXVldWUgKnF1ZXVlKTsKIHN0YXRpYyBTTWJ1ZiogZ2V0X2xsY19yeChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiBzdGF0aWMgU01idWYqIGdldF90eGRfbWIoc3RydWN0IHNfc21jICpzbWMpOworc3RhdGljIHZvaWQgbWFjX2Rydl9jbGVhcl90eGQoc3RydWN0IHNfc21jICpzbWMpOwogCiAvKgogCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0Niw3ICsxNDcsNiBAQAogKi8KIHZvaWQgcHJvY2Vzc19yZWNlaXZlKHN0cnVjdCBzX3NtYyAqc21jKTsKIHZvaWQgZmRkaV9pc3Ioc3RydWN0IHNfc21jICpzbWMpOwotdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYyk7CiB2b2lkIHNtdF9mcmVlX21idWYoc3RydWN0IHNfc21jICpzbWMsIFNNYnVmICptYik7CiB2b2lkIGluaXRfZHJpdmVyX2ZwbHVzKHN0cnVjdCBzX3NtYyAqc21jKTsKIHZvaWQgbWFjX2Rydl9yeF9tb2RlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSk7CkBAIC0xNTgsNyArMTU4LDYgQEAKIHZvaWQgaHdtX3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgZmFyICp2aXJ0LCB1X2xvbmcgcGh5cywgaW50IGxlbiwKIAkJIGludCBmcmFtZV9zdGF0dXMpOwogCi1pbnQgbWFjX2Rydl9yeF9mcmFnKHN0cnVjdCBzX3NtYyAqc21jLCB2b2lkIGZhciAqdmlydCwgaW50IGxlbik7CiBpbnQgbWFjX2Rydl9pbml0KHN0cnVjdCBzX3NtYyAqc21jKTsKIGludCBod21fdHhfaW5pdChzdHJ1Y3Qgc19zbWMgKnNtYywgdV9jaGFyIGZjLCBpbnQgZnJhZ19jb3VudCwgaW50IGZyYW1lX2xlbiwKIAkJaW50IGZyYW1lX3N0YXR1cyk7CkBAIC0xNDQ4LDM1ICsxNDQ3LDYgQEAKIAlORERfVFJBQ0UoIlJIZkUiLHIsQUlYX1JFVkVSU0Uoci0+cnhkX3JiYWRyKSwwKSA7CiB9CiAKLSNpZm5kZWYJTkRJU19PUzIKLS8qCi0gKglCRUdJTl9NQU5VQUxfRU5UUlkobWFjX2Rydl9yeF9mcmFnKQotICoJaW50IG1hY19kcnZfcnhfZnJhZyhzbWMsdmlydCxsZW4pCi0gKgotICogZnVuY3Rpb24JRE9XTkNBTEwJKGh3bXRtLmMpCi0gKgkJbWFjX2Rydl9yeF9mcmFnIGZpbGxzIHRoZSBmcmFnbWVudCB3aXRoIGEgcGFydCBvZiB0aGUgZnJhbWUuCi0gKgotICogcGFyYQl2aXJ0CXRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZyYWdtZW50Ci0gKglsZW4JdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZnJhZ21lbnQKLSAqCi0gKiByZXR1cm4gMDoJc3VjY2VzcyBjb2RlLCBubyBlcnJvcnMgcG9zc2libGUKLSAqCi0gKglFTkRfTUFOVUFMX0VOVFJZCi0gKi8KLWludCBtYWNfZHJ2X3J4X2ZyYWcoc3RydWN0IHNfc21jICpzbWMsIHZvaWQgZmFyICp2aXJ0LCBpbnQgbGVuKQotewotCU5ERF9UUkFDRSgiUkhTQiIsdmlydCxsZW4sc21jLT5vcy5od20uci5tYl9wb3MpIDsKLQotCURCX1JYKCJyZWNlaXZlIGZyb20gcXVldWU6IGxlbi92aXJ0OiA9ICVkLyV4IixsZW4sdmlydCw0KSA7Ci0JbWVtY3B5KChjaGFyIGZhciAqKXZpcnQsc21jLT5vcy5od20uci5tYl9wb3MsbGVuKSA7Ci0Jc21jLT5vcy5od20uci5tYl9wb3MgKz0gbGVuIDsKLQotCU5ERF9UUkFDRSgiUkhTRSIsc21jLT5vcy5od20uci5tYl9wb3MsMCwwKSA7Ci0JcmV0dXJuKDApIDsKLX0KLSNlbmRpZgotCi0KIC8qCiAgKglCRUdJTk5fTUFOVUFMX0VOVFJZKG1hY19kcnZfY2xlYXJfcnhfcXVldWUpCiAgKgpAQCAtMTk3OCw3ICsxOTQ4LDcgQEAKICAqCiAgKglFTkRfTUFOVUFMX0VOVFJZCiAgKi8KLXZvaWQgbWFjX2Rydl9jbGVhcl90eGQoc3RydWN0IHNfc21jICpzbWMpCitzdGF0aWMgdm9pZCBtYWNfZHJ2X2NsZWFyX3R4ZChzdHJ1Y3Qgc19zbWMgKnNtYykKIHsKIAlzdHJ1Y3Qgc19zbXRfdHhfcXVldWUgKnF1ZXVlIDsKIAlzdHJ1Y3Qgc19zbXRfZnBfdHhkIHZvbGF0aWxlICp0MSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL2xua3N0YXQuYyBiL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEyNDgwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvbG5rc3RhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgkoQylDb3B5cmlnaHQgMTk5OCwxOTk5IFN5c0tvbm5lY3QsCi0gKglhIGJ1c2luZXNzIHVuaXQgb2YgU2NobmVpZGVyICYgS29jaCAmIENvLiBEYXRlbnN5c3RlbWUgR21iSC4KLSAqCi0gKglTZWUgdGhlIGZpbGUgInNrZmRkaS5jIiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KLSAqCi0gKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqCVRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGZpbGUgaXMgcHJvdmlkZWQgIkFTIElTIiB3aXRob3V0IHdhcnJhbnR5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0JSUJNIEZEREkgcmVhZCBlcnJvciBsb2cgZnVuY3Rpb24KLSovCi0KLSNpbmNsdWRlICJoL3R5cGVzLmgiCi0jaW5jbHVkZSAiaC9mZGRpLmgiCi0jaW5jbHVkZSAiaC9zbWMuaCIKLSNpbmNsdWRlICJoL2xua3N0YXQuaCIKLQotI2lmbmRlZglsaW50Ci1zdGF0aWMgY29uc3QgY2hhciBJRF9zY2NzW10gPSAiQCgjKWxua3N0YXQuYwkxLjggOTcvMDQvMTEgKEMpIFNLICIgOwotI2VuZGlmCi0KLSNpZmRlZglzdW4KLSNkZWZpbmUgX2ZhcgotI2VuZGlmCi0KLSNkZWZpbmUgRUxfSVNfT0soeCxsKQkoKCgoaW50KSYoKChzdHJ1Y3Qgc19lcnJvcl9sb2cgKikwKS0+eCkpICsgXAotCQkJc2l6ZW9mKGVyLT54KSkgPD0gbCkKLQotLyoKLQlCRUdJTl9NQU5VQUxfRU5UUlkoaWYsZnVuYztvdGhlcnM7MTEpCi0KLQl1X2xvbmcgc210X2dldF9lcnJvcl93b3JkKHNtYykKLQlzdHJ1Y3Qgc19zbWMgKnNtYyA7Ci0KLUZ1bmN0aW9uCURPV05DQUxMCShTTVQsIGxua3N0YXQuYykKLQkJVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgU01UIGVycm9yIHdvcmsgZm9yIEFJWCBldmVudHMuCi0KLVJldHVybglzbXRfZXJyb3Jfd29yZAlUaGVzZSBiaXRzIGFyZSBzdXBwb3J0ZWQ6Ci0KLQkJU01UX0VSTF9BTEMJPT0gCVtQUy9QQV0uZmRkaVBPUlRMZXJGbGFnCi0JCVNNVF9FUkxfQkxDCT09CVtQQl0uZmRkaVBPUlRMZXJGbGFnCi0JCVNNVF9FUkxfTkNDCT09CWZkZGlNQUNOb3RDb3BpZWRGbGFnCi0JCVNNVF9FUkxfRkVDCT09CWZkZGlNQUNGcmFtZUVycm9yRmxhZwotCi0JRU5EX01BTlVBTF9FTlRSWSgpCi0gKi8KLXVfbG9uZyBzbXRfZ2V0X2Vycm9yX3dvcmQoc3RydWN0IHNfc21jICpzbWMpCi17Ci0JdV9sb25nCXN0OwotCi0JLyoKLQkgKiBzbXQgZXJyb3Igd29yZCBsb3cKLQkgKi8KLQlzdCA9IDAgOwotCWlmIChzbWMtPnMuc2FzID09IFNNVF9TQVMpIHsKLQkJaWYgKHNtYy0+bWliLnBbUFNdLmZkZGlQT1JUTGVyRmxhZykKLQkJCXN0IHw9IFNNVF9FUkxfQUxDIDsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChzbWMtPm1pYi5wW1BBXS5mZGRpUE9SVExlckZsYWcpCi0JCQlzdCB8PSBTTVRfRVJMX0FMQyA7Ci0JCWlmIChzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVExlckZsYWcpCi0JCQlzdCB8PSBTTVRfRVJMX0JMQyA7Ci0JfQotCWlmIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNOb3RDb3BpZWRGbGFnKQotCQlzdCB8PSBTTVRfRVJMX05DQyA7CQkvKiBub3QgY29waWVkIGNvbmRpdGlvbiAqLwotCWlmIChzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNGcmFtZUVycm9yRmxhZykKLQkJc3QgfD0gU01UX0VSTF9GRUMgOwkJLyogZnJhbWUgZXJyb3IgY29uZGl0aW9uICovCi0KLQlyZXR1cm4gc3Q7Ci19Ci0KLS8qCi0JQkVHSU5fTUFOVUFMX0VOVFJZKGlmLGZ1bmM7b3RoZXJzOzExKQotCi0JdV9sb25nIHNtdF9nZXRfZXZlbnRfd29yZChzbWMpCi0Jc3RydWN0IHNfc21jICpzbWMgOwotCi1GdW5jdGlvbglET1dOQ0FMTAkoU01ULCBsbmtzdGF0LmMpCi0JCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIFNNVCBldmVudCB3b3JrIGZvciBBSVggZXZlbnRzLgotCi1SZXR1cm4Jc210X2V2ZW50X3dvcmQJYWx3YXlzIDAKLQotCUVORF9NQU5VQUxfRU5UUlkoKQotICovCi11X2xvbmcgc210X2dldF9ldmVudF93b3JkKHN0cnVjdCBzX3NtYyAqc21jKQotewotCXJldHVybiAodV9sb25nKSAwOwotfQotCi0vKgotCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsxMSkKLQotCXVfbG9uZyBzbXRfZ2V0X3BvcnRfZXZlbnRfd29yZChzbWMpCi0Jc3RydWN0IHNfc21jICpzbWMgOwotCi1GdW5jdGlvbglET1dOQ0FMTAkoU01ULCBsbmtzdGF0LmMpCi0JCVRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIFNNVCBwb3J0IGV2ZW50IHdvcmsgZm9yIEFJWCBldmVudHMuCi0KLVJldHVybglzbXRfcG9ydF9ldmVudF93b3JkCWFsd2F5cyAwCi0KLQlFTkRfTUFOVUFMX0VOVFJZKCkKLSAqLwotdV9sb25nIHNtdF9nZXRfcG9ydF9ldmVudF93b3JkKHN0cnVjdCBzX3NtYyAqc21jKQotewotCXJldHVybiAodV9sb25nKSAwOwotfQotCi0vKgotCUJFR0lOX01BTlVBTF9FTlRSWShpZixmdW5jO290aGVyczsxMSkKLQotCXVfbG9uZyBzbXRfcmVhZF9lcnJvcmxvZyhzbWMscCxsZW4pCi0Jc3RydWN0IHNfc21jICpzbWMgOwotCWNoYXIgX2ZhciAqcCA7Ci0JaW50IGxlbiA7Ci0KLUZ1bmN0aW9uCURPV05DQUxMCShTTVQsIGxua3N0YXQuYykKLQkJVGhpcyBmdW5jdGlvbnMgcmV0dXJucyB0aGUgU01UIGVycm9yIGxvZyBmaWVsZCBmb3IgQUlYIGV2ZW50cy4KLQotUGFyYQlwCXBvaW50ZXIgdG8gdGhlIGVycm9yIGxvZyBmaWVsZAotCWxlbglsZW4gb2YgdGhlIGVycm9yIGxvZyBmaWVsZAotCi1SZXR1cm4JbGVuCXVzZWQgbGVuIG9mIHRoZSBlcnJvciBsb2cgZmllbGQKLQotCUVORF9NQU5VQUxfRU5UUlkoKQotICovCi1pbnQgc210X3JlYWRfZXJyb3Jsb2coc3RydWN0IHNfc21jICpzbWMsIGNoYXIgX2ZhciAqcCwgaW50IGxlbikKLXsKLQlpbnQJCQlpIDsKLQlpbnQJCQlzdCA7Ci0Jc3RydWN0IHNfZXJyb3JfbG9nIF9mYXIJKmVyIDsKLQotCWVyID0gKHN0cnVjdCBzX2Vycm9yX2xvZyBfZmFyICopIHAgOwotCWlmIChsZW4gPiBzaXplb2Yoc3RydWN0IHNfZXJyb3JfbG9nKSkKLQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzX2Vycm9yX2xvZykgOwotCWZvciAoaSA9IDAgOyBpIDwgbGVuIDsgaSsrKQotCQkqcCsrID0gMCA7Ci0JLyoKLQkgKiBzZXQgY291bnQKLQkgKi8KLQlpZiAoRUxfSVNfT0soc2V0X2NvdW50X2hpZ2gsbGVuKSkgewotCQllci0+c2V0X2NvdW50X2xvdyA9ICh1X3Nob3J0KXNtYy0+bWliLmZkZGlTTVRTZXRDb3VudC5jb3VudCA7Ci0JCWVyLT5zZXRfY291bnRfaGlnaCA9Ci0JCQkodV9zaG9ydCkoc21jLT5taWIuZmRkaVNNVFNldENvdW50LmNvdW50ID4+IDE2TCkgOwotCX0KLQkvKgotCSAqIGFjaQotCSAqLwotCWlmIChFTF9JU19PSyhhY2lfaWRfY29kZSxsZW4pKSB7Ci0JCWVyLT5hY2lfaWRfY29kZSA9IDAgOwotCX0KLQkvKgotCSAqIHB1cmdlIGNvdW50ZXIgaXMgbWlzc2VkIGZyYW1lczsgMTYgYml0cyBvbmx5Ci0JICovCi0JaWYgKEVMX0lTX09LKHB1cmdlX2ZyYW1lX2NvdW50ZXIsbGVuKSkgewotCQlpZiAoc21jLT5taWIubVtNQUMwXS5mZGRpTUFDQ29waWVkX0N0ID4gMHhmZmZmKQotCQkJZXItPnB1cmdlX2ZyYW1lX2NvdW50ZXIgPSAweGZmZmYgOwotCQllbHNlCi0JCQllci0+cHVyZ2VfZnJhbWVfY291bnRlciA9Ci0JCQkJKHVfc2hvcnQpc21jLT5taWIubVtNQUMwXS5mZGRpTUFDQ29waWVkX0N0IDsKLQl9Ci0JLyoKLQkgKiBDTVQgYW5kIFJNVCBzdGF0ZSBtYWNoaW5lcwotCSAqLwotCWlmIChFTF9JU19PSyhlY21fc3RhdGUsbGVuKSkKLQkJZXItPmVjbV9zdGF0ZSA9IHNtYy0+bWliLmZkZGlTTVRFQ01TdGF0ZSA7Ci0KLQlpZiAoRUxfSVNfT0socGNtX2Jfc3RhdGUsbGVuKSkgewotCQlpZiAoc21jLT5zLnNhcyA9PSBTTVRfU0FTKSB7Ci0JCQllci0+cGNtX2Ffc3RhdGUgPSBzbWMtPnlbUFNdLm1pYi0+ZmRkaVBPUlRQQ01TdGF0ZSA7Ci0JCQllci0+cGNtX2Jfc3RhdGUgPSAwIDsKLQkJfQotCQllbHNlIHsKLQkJCWVyLT5wY21fYV9zdGF0ZSA9IHNtYy0+eVtQQV0ubWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKLQkJCWVyLT5wY21fYl9zdGF0ZSA9IHNtYy0+eVtQQl0ubWliLT5mZGRpUE9SVFBDTVN0YXRlIDsKLQkJfQotCX0KLQlpZiAoRUxfSVNfT0soY2ZtX3N0YXRlLGxlbikpCi0JCWVyLT5jZm1fc3RhdGUgPSBzbWMtPm1pYi5mZGRpU01UQ0ZfU3RhdGUgOwotCWlmIChFTF9JU19PSyhybXRfc3RhdGUsbGVuKSkKLQkJZXItPnJtdF9zdGF0ZSA9IHNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1JNVFN0YXRlIDsKLQotCS8qCi0JICogc210IGVycm9yIHdvcmQgbG93ICh3ZSBvbmx5IG5lZWQgdGhlIGxvdyBvcmRlciAxNiBiaXRzLikKLQkgKi8KLQotCXN0ID0gc210X2dldF9lcnJvcl93b3JkKHNtYykgJiAweGZmZmYgOwotCi0JaWYgKEVMX0lTX09LKHNtdF9lcnJvcl9sb3csbGVuKSkKLQkJZXItPnNtdF9lcnJvcl9sb3cgPSBzdCA7Ci0KLQlpZiAoRUxfSVNfT0sodWNvZGVfdmVyc2lvbl9sZXZlbCxsZW4pKQotCQllci0+dWNvZGVfdmVyc2lvbl9sZXZlbCA9IDB4MDEwMSA7Ci0JcmV0dXJuKGxlbikgOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3BjbXBsYy5jIGIvZHJpdmVycy9uZXQvc2tmcC9wY21wbGMuYwppbmRleCA1NzFmMDU1Li5jZDBhYTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL3BjbXBsYy5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvcGNtcGxjLmMKQEAgLTE4NjEsMTMgKzE4NjEsNiBAQAogI2VuZGlmCiB9CiAKLXZvaWQgcGNtX3NldF9sY3Rfc2hvcnQoc3RydWN0IHNfc21jICpzbWMsIGludCBuKQotewotCWlmIChuIDw9IDAgfHwgbiA+IDEwMDApCi0JCXJldHVybiA7Ci0Jc21jLT5zLmxjdF9zaG9ydCA9IG4gOwotfQotCiAjaWZkZWYJREVCVUcKIC8qCiAgKiBmaWxsIHN0YXRlIHN0cnVjdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9wbWYuYyBiL2RyaXZlcnMvbmV0L3NrZnAvcG1mLmMKaW5kZXggZjJiNDQ2ZC4uZWZjNjM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tmcC9wbWYuYworKysgYi9kcml2ZXJzL25ldC9za2ZwL3BtZi5jCkBAIC0zNiwxMiArMzYsMTMgQEAKIHN0YXRpYyBpbnQgc210X2NoZWNrX3NldF9jb3VudChzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnNtKTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc19wX3RhYiogc210X2dldF9wdGFiKHVfc2hvcnQgcGFyYSk7CiBzdGF0aWMgaW50IHNtdF9taWJfcGh5cyhzdHJ1Y3Qgc19zbWMgKnNtYyk7Ci1pbnQgc210X3NldF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BhcmEgKnBhLCBpbnQgaW5kZXgsIGludCBsb2NhbCwKLQkJIGludCBzZXQpOworc3RhdGljIGludCBzbXRfc2V0X3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcGFyYSAqcGEsIGludCBpbmRleCwKKwkJCWludCBsb2NhbCwgaW50IHNldCk7CiB2b2lkIHNtdF9hZGRfcGFyYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNfcGNvbiAqcGNvbiwgdV9zaG9ydCBwYXJhLAogCQkgIGludCBpbmRleCwgaW50IGxvY2FsKTsKIHN0YXRpYyBTTWJ1ZiAqc210X2J1aWxkX3BtZl9yZXNwb25zZShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9oZWFkZXIgKnJlcSwKIAkJCQkgICAgIGludCBzZXQsIGludCBsb2NhbCk7CitzdGF0aWMgaW50IHBvcnRfdG9fbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCk7CiAKICNkZWZpbmUgTU9GRlNTKGUpCSgoaW50KSYoKChzdHJ1Y3QgZmRkaV9taWIgKikwKS0+ZSkpCiAjZGVmaW5lIE1PRkZTQShlKQkoKGludCkgKCgoc3RydWN0IGZkZGlfbWliICopMCktPmUpKQpAQCAtMTA3OCw4ICsxMDc5LDggQEAKIC8qCiAgKiBzZXQgcGFyYW1ldGVyCiAgKi8KLWludCBzbXRfc2V0X3BhcmEoc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBzbXRfcGFyYSAqcGEsIGludCBpbmRleCwgaW50IGxvY2FsLAotCQkgaW50IHNldCkKK3N0YXRpYyBpbnQgc210X3NldF9wYXJhKHN0cnVjdCBzX3NtYyAqc21jLCBzdHJ1Y3Qgc210X3BhcmEgKnBhLCBpbnQgaW5kZXgsCisJCQlpbnQgbG9jYWwsIGludCBzZXQpCiB7CiAjZGVmaW5lIElGU0VUKHgpCWlmIChzZXQpICh4KQogCkBAIC0xNTQ5LDcgKzE1NTAsNyBAQAogI2VuZGlmCiB9CiAKLWludCBwb3J0X3RvX21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IHApCitzdGF0aWMgaW50IHBvcnRfdG9fbWliKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgcCkKIHsKICNpZmRlZglDT05DRU5UUkFUT1IKIAlTS19VTlVTRUQoc21jKSA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jIGIvZHJpdmVycy9uZXQvc2tmcC9za2ZkZGkuYwppbmRleCBjODhhYWQ2Li40YjVlZDJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL3NrZmRkaS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc2tmZGRpLmMKQEAgLTE0OSw3ICsxNDksNiBAQAogZXh0ZXJuIHZvaWQgbWFjX2Rydl9yeF9tb2RlKHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbW9kZSk7CiBleHRlcm4gdm9pZCBtYWNfZHJ2X2NsZWFyX3J4X3F1ZXVlKHN0cnVjdCBzX3NtYyAqc21jKTsKIGV4dGVybiB2b2lkIGVuYWJsZV90eF9pcnEoc3RydWN0IHNfc21jICpzbWMsIHVfc2hvcnQgcXVldWUpOwotZXh0ZXJuIHZvaWQgbWFjX2Rydl9jbGVhcl90eGQoc3RydWN0IHNfc21jICpzbWMpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2tmZGRpX3BjaV90YmxbXSA9IHsKIAl7IFBDSV9WRU5ET1JfSURfU0ssIFBDSV9ERVZJQ0VfSURfU0tfRlAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2ZwL3NtdC5jIGIvZHJpdmVycy9uZXQvc2tmcC9zbXQuYwppbmRleCA3MTkzNWVhLi5mMTdjMDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2ZwL3NtdC5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZnAvc210LmMKQEAgLTg2LDcgKzg2LDcgQEAKIHN0YXRpYyB2b2lkIHNtdF9zZW5kX3NpZl9vcGVyYXRpb24oc3RydWN0IHNfc21jICpzbWMsIHN0cnVjdCBmZGRpX2FkZHIgKmRlc3QsCiAJCQkJICAgdV9sb25nIHRpZCwgaW50IGxvY2FsKTsKICNpZmRlZiBMSVRUTEVfRU5ESUFOCi1zdGF0aWMgdm9pZCBzbXRfc3RyaW5nX3N3YXAodm9pZCk7CitzdGF0aWMgdm9pZCBzbXRfc3RyaW5nX3N3YXAoY2hhciAqZGF0YSwgY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgbGVuKTsKICNlbmRpZgogc3RhdGljIHZvaWQgc210X2FkZF9mcmFtZV9sZW4oU01idWYgKm1iLCBpbnQgbGVuKTsKIHN0YXRpYyB2b2lkIHNtdF9maWxsX3VuYShzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX3VuYSAqdW5hKTsKQEAgLTExMCw3ICsxMTAsNyBAQAogc3RhdGljIHZvaWQgc210X2ZpbGxfZWNobyhzdHJ1Y3Qgc19zbWMgKnNtYywgc3RydWN0IHNtdF9wX2VjaG8gKmVjaG8sIHVfbG9uZyBzZWVkLAogCQkJICBpbnQgbGVuKTsKIAotdm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYyk7CitzdGF0aWMgdm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYyk7CiBzdGF0aWMgdm9pZCBzbXRfY2xlYXJfb2xkX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpOwogI2lmZGVmCUNPTkNFTlRSQVRPUgogc3RhdGljIGludCBlbnRpdHlfdG9faW5kZXgodm9pZCk7CkBAIC0xMTgsNyArMTE4LDcgQEAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9kYWMoc3RydWN0IHNfc21jICpzbWMsIGludCByZXBvcnQpOwogc3RhdGljIGludCBkaXZfcmF0aW8odV9sb25nIHVwcGVyLCB1X2xvbmcgbG93ZXIpOwogI2lmZGVmICBVU0VfQ0FOX0FERFIKLXZvaWQJaHdtX2NvbnZfY2FuKHN0cnVjdCBzX3NtYyAqc21jLCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyB2b2lkCWh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbik7CiAjZWxzZQogI2RlZmluZQkJaHdtX2NvbnZfY2FuKHNtYyxkYXRhLGxlbikKICNlbmRpZgpAQCAtMjE2LDI0ICsyMTYsNiBAQAogCURCX1NNVCgiU01UIGFnZW50IHRhc2tcbiIsMCwwKSA7CiB9CiAKLXZvaWQgc210X3BsZWFzZV9yZWNvbm5lY3Qoc3RydWN0IHNfc21jICpzbWMsIGludCByZWNvbm5fdGltZSkKLS8qIHN0cnVjdCBzX3NtYwkqc21jOyAgUG9pbnRlciB0byBTTVQgY29udGV4dCAqLwotLyogaW50IHJlY29ubl90aW1lOyAgICBXYWl0IGZvciByZWNvbm5lY3QgdGltZSBpbiBzZWNvbmRzICovCi17Ci0JLyoKLQkgKiBUaGUgcGxlYXNlIHJlY29ubmVjdCB2YXJpYWJsZSBpcyB1c2VkIGFzIGEgdGltZXIuCi0JICogSXQgaXMgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHNtdF9ldmVudCBpcyBjYWxsZWQuCi0JICogVGhpcyBoYXBwZW5zIGV2ZXJ5IHNlY29uZCBvciB3aGVuIHNtdF9mb3JjZV9pcnEgaXMgY2FsbGVkLgotCSAqIE5vdGU6IHNtdF9mb3JjZV9pcnEgKCkgaXMgY2FsbGVkIG9uIHNvbWUgcGFja2V0IHJlY2VpdmVzIGFuZAotCSAqICAgICAgIHdoZW4gYSBtdWx0aWNhc3QgYWRkcmVzcyBpcyBjaGFuZ2VkLiBTaW5jZSBub3RoaW5nCi0JICogICAgICAgaXMgcmVjZWl2ZWQgZHVyaW5nIHRoZSBkaXNjb25uZWN0IGFuZCB0aGUgbXVsdGljYXN0Ci0JICogICAgICAgYWRkcmVzcyBjaGFuZ2VzIGNhbiBiZSB2aWV3ZWQgYXMgbm90IHZlcnkgb2Z0ZW4gYW5kCi0JICogICAgICAgdGhlIHRpbWVyIHJ1bnMgb3V0IGNsb3NlIHRvIGl0cyBnaXZlbiB2YWx1ZQotCSAqICAgICAgIChyZWNvbm5fdGltZSkuCi0JICovCi0Jc21jLT5zbS5wbGVhc2VfcmVjb25uZWN0ID0gcmVjb25uX3RpbWUgOwotfQotCiAjaWZuZGVmIFNNVF9SRUFMX1RPS0VOX0NUCiB2b2lkIHNtdF9lbXVsYXRlX3Rva2VuX2N0KHN0cnVjdCBzX3NtYyAqc21jLCBpbnQgbWFjX2luZGV4KQogewpAQCAtMTU3NCw3ICsxNTU2LDcgQEAKICAqIGNsZWFyIEROQSBhbmQgVU5BCiAgKiBjYWxsZWQgZnJvbSBDRk0gaWYgY29uZmlndXJhdGlvbiBjaGFuZ2VzCiAgKi8KLXZvaWQgc210X2NsZWFyX3VuYV9kbmEoc3RydWN0IHNfc21jICpzbWMpCitzdGF0aWMgdm9pZCBzbXRfY2xlYXJfdW5hX2RuYShzdHJ1Y3Qgc19zbWMgKnNtYykKIHsKIAlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNVcHN0cmVhbU5iciA9IFNNVF9Vbmtub3duIDsKIAlzbWMtPm1pYi5tW01BQzBdLmZkZGlNQUNEb3duc3RyZWFtTmJyID0gU01UX1Vua25vd24gOwpAQCAtMjA1OCwzMCArMjA0MCwxMCBAQAogfQogCiAvKgotICogY2hhbmdlIHRuZWcKLSAqCXNldCBUX1JlcSBpbiBNSUIgKFBhdGggQXR0cmlidXRlKQotICoJY2FsY3VsYXRlIG5ldyB2YWx1ZXMgZm9yIE1BQwotICoJaWYgY2hhbmdlIHJlcXVpcmVkCi0gKgkJZGlzY29ubmVjdAotICoJCXNldCByZWNvbm5lY3QKLSAqCWVuZAotICovCi12b2lkIHNtdF9jaGFuZ2VfdF9uZWcoc3RydWN0IHNfc21jICpzbWMsIHVfbG9uZyB0bmVnKQotewotCXNtYy0+bWliLmFbUEFUSDBdLmZkZGlQQVRITWF4VF9SZXEgPSB0bmVnIDsKLQotCWlmIChzbXRfc2V0X21hY19vcHZhbHVlcyhzbWMpKSB7Ci0JCVJTX1NFVChzbWMsUlNfRVZFTlQpIDsKLQkJc21jLT5zbS5wbGVhc2VfcmVjb25uZWN0ID0gMSA7Ci0JCXF1ZXVlX2V2ZW50KHNtYyxFVkVOVF9FQ00sRUNfRElTQ09OTkVDVCkgOwotCX0KLX0KLQotLyoKICAqIGNhbm9uaWNhbCBjb252ZXJzaW9uIG9mIDxsZW4+IGJ5dGVzIGJlZ2lubmluZyBmb3JtICpkYXRhCiAgKi8KICNpZmRlZiAgVVNFX0NBTl9BRERSCi12b2lkIGh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIGh3bV9jb252X2NhbihzdHJ1Y3Qgc19zbWMgKnNtYywgY2hhciAqZGF0YSwgaW50IGxlbikKIHsKIAlpbnQgaSA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZnAvc210ZGVmLmMgYi9kcml2ZXJzL25ldC9za2ZwL3NtdGRlZi5jCmluZGV4IDVhMGM4ZGIuLjRlMDdmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc210ZGVmLmMKKysrIGIvZHJpdmVycy9uZXQvc2tmcC9zbXRkZWYuYwpAQCAtNzYsMTEgKzc2LDYgQEAKIHN0YXRpYyB2b2lkIHNtdF9pbml0X21pYihzdHJ1Y3Qgc19zbWMgKnNtYywgaW50IGxldmVsKTsKIHN0YXRpYyBpbnQgc2V0X21pbl9tYXgoaW50IG1heGZsYWcsIHVfbG9uZyBtaWIsIHVfbG9uZyBsaW1pdCwgdV9sb25nICpvcGVyKTsKIAotdm9pZCBzbXRfc2V0X2RlZmF1bHRzKHN0cnVjdCBzX3NtYyAqc21jKQotewotCXNtdF9yZXNldF9kZWZhdWx0cyhzbWMsMCkgOwotfQotCiAjZGVmaW5lIE1TMkJDTEsoeCkJKCh4KSoxMjUwMEwpCiAjZGVmaW5lIFVTMkJDTEsoeCkJKCh4KSoxMjUwTCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jIGIvZHJpdmVycy9uZXQvc2tmcC9zbXRwYXJzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc3OWU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3NrZnAvc210cGFyc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJKEMpQ29weXJpZ2h0IDE5OTgsMTk5OSBTeXNLb25uZWN0LAotICoJYSBidXNpbmVzcyB1bml0IG9mIFNjaG5laWRlciAmIEtvY2ggJiBDby4gRGF0ZW5zeXN0ZW1lIEdtYkguCi0gKgotICoJU2VlIHRoZSBmaWxlICJza2ZkZGkuYyIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0gKgotICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKglUaGUgaW5mb3JtYXRpb24gaW4gdGhpcyBmaWxlIGlzIHByb3ZpZGVkICJBUyBJUyIgd2l0aG91dCB3YXJyYW50eS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qCi0JcGFyc2VyIGZvciBTTVQgcGFyYW1ldGVycwotKi8KLQotI2luY2x1ZGUgImgvdHlwZXMuaCIKLSNpbmNsdWRlICJoL2ZkZGkuaCIKLSNpbmNsdWRlICJoL3NtYy5oIgotI2luY2x1ZGUgImgvc210X3AuaCIKLQotI2RlZmluZSBLRVJORUwKLSNpbmNsdWRlICJoL3NtdHN0YXRlLmgiCi0KLSNpZm5kZWYJbGludAotc3RhdGljIGNvbnN0IGNoYXIgSURfc2Njc1tdID0gIkAoIylzbXRwYXJzZS5jCTEuMTIgOTgvMTAvMDYgKEMpIFNLICIgOwotI2VuZGlmCi0KLSNpZmRlZglzdW4KLSNkZWZpbmUgX2ZhcgotI2VuZGlmCi0KLS8qCi0gKiBjb252ZXJ0IHRvIEJDTEsgdW5pdHMKLSAqLwotI2RlZmluZSBNUzJCQ0xLKHgpICAgICAgKCh4KSoxMjUwMEwpCi0jZGVmaW5lIFVTMkJDTEsoeCkgICAgICAoKHgvMTApKjEyNUwpCi0KLS8qCi0gKiBwYXJhbWV0ZXIgdGFibGUKLSAqLwotc3RhdGljIHN0cnVjdCBzX3B0YWIgewotCWNoYXIJKnB0X25hbWUgOwotCXVfc2hvcnQJcHRfbnVtIDsKLQl1X3Nob3J0CXB0X3R5cGUgOwotCXVfbG9uZwlwdF9taW4gOwotCXVfbG9uZwlwdF9tYXggOwotfSBwdGFiW10gPSB7Ci0JeyAiUE1GUEFTU1dEIiwwLAkwIH0gLAotCXsgIlVTRVJEQVRBIiwxLAkJMCB9ICwKLQl7ICJMRVJDVVRPRkZBIiwyLAkxLAk0LAkxNQl9ICwKLQl7ICJMRVJDVVRPRkZCIiwzLAkxLAk0LAkxNQl9ICwKLQl7ICJMRVJBTEFSTUEiLDQsCTEsCTQsCTE1CX0gLAotCXsgIkxFUkFMQVJNQiIsNSwJMSwJNCwJMTUJfSAsCi0JeyAiVE1BWCIsNiwJCTEsCTUsCTE2NQl9ICwKLQl7ICJUTUlOIiw3LAkJMSwJNSwJMTY1CX0gLAotCXsgIlRSRVEiLDgsCQkxLAk1LAkxNjUJfSAsCi0JeyAiVFZYIiw5LAkJMSwJMjUwMCwJMTAwMDAJfSAsCi0jaWZkZWYgRVNTCi0JeyAiU0JBUEFZTE9BRCIsMTAsCTEsCTAsCTE1NjIJfSAsCi0JeyAiU0JBT1ZFUkhFQUQiLDExLAkxLAk1MCwJNTAwMAl9ICwKLQl7ICJNQVhUTkVHIiwxMiwJCTEsCTUsCTE2NQl9ICwKLQl7ICJNSU5TRUdNRU5UU0laRSIsMTMsCTEsCTAsCTQ0NzgJfSAsCi0JeyAiU0JBQ0FURUdPUlkiLDE0LAkxLAkwLAkweGZmZmYJfSAsCi0JeyAiU1lOQ0hUWE1PREUiLDE1LAkwIH0gLAotI2VuZGlmCi0jaWZkZWYgU0JBCi0JeyAiU0JBQ09NTUFORCIsMTYsCTAgfSAsCi0JeyAiU0JBQVZBSUxBQkxFIiwxNywJMSwJMCwJMTAwCX0gLAotI2VuZGlmCi0JeyBOVUxMIH0KLX0gOwotCi0vKiBEZWZpbmUgbWF4aW11bSBzdHJpbmcgc2l6ZSBmb3IgdmFsdWVzIGFuZCBrZXlidWZmZXIgKi8KLSNkZWZpbmUgTUFYX1ZBTAk0MAotCi0vKgotICogbG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0gKi8KLXN0YXRpYyB1X2xvbmcgcGFyc2VfbnVtKGludCB0eXBlLCBjaGFyIF9mYXIgKnZhbHVlLCBjaGFyICp2LCB1X2xvbmcgbW4sCi0JCQl1X2xvbmcgbXgsIGludCBzY2FsZSk7Ci1zdGF0aWMgaW50IHBhcnNlX3dvcmQoY2hhciAqYnVmLCBjaGFyIF9mYXIgKnRleHQpOwotCi0jaWZkZWYgU0lNCi0jZGVmaW5lIERCX01BSU4oYSxiLGMpCXByaW50ZihhLGIsYykKLSNlbHNlCi0jZGVmaW5lIERCX01BSU4oYSxiLGMpCi0jZW5kaWYKLQotLyoKLSAqIEJFR0lOX01BTlVBTF9FTlRSWSgpCi0gKgotICoJaW50IHNtdF9wYXJzZV9hcmcoc3RydWN0IHNfc21jICosY2hhciBfZmFyICprZXl3b3JkLGludCB0eXBlLAotCQljaGFyIF9mYXIgKnZhbHVlKQotICoKLSAqCXBhcnNlIFNNVCBwYXJhbWV0ZXIKLSAqCSprZXl3b3JkCi0gKgkJcG9pbnRlciB0byBrZXl3b3JkLCBtdXN0IGJlIFwwLCBcbiBvciBcciB0ZXJtaW5hdGVkCi0gKgkqdmFsdWUJcG9pbnRlciB0byB2YWx1ZSwgZWl0aGVyIGNoYXIgKiBvciB1X2xvbmcgKgotICoJCWlmIGNoYXIgKgotICoJCQlwb2ludGVyIHRvIHZhbHVlLCBtdXN0IGJlIFwwLCBcbiBvciBcciB0ZXJtaW5hdGVkCi0gKgkJaWYgdV9sb25nICoKLSAqCQkJY29udGFpbnMgYmluYXJ5IHZhbHVlCi0gKgotICoJdHlwZQkwOiBpbnRlZ2VyCi0gKgkJMTogc3RyaW5nCi0gKglyZXR1cm4KLSAqCQkwCXBhcmFtZXRlciBwYXJzZWQgb2sKLSAqCQkhPSAwCWVycm9yCi0gKglOT1RFOgotICoJCWZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgd2l0aCBEUyAhPSBTUwotICoKLSAqCi0gKiBFTkRfTUFOVUFMX0VOVFJZKCkKLSAqLwotaW50IHNtdF9wYXJzZV9hcmcoc3RydWN0IHNfc21jICpzbWMsIGNoYXIgX2ZhciAqa2V5d29yZCwgaW50IHR5cGUsCi0JCSAgY2hhciBfZmFyICp2YWx1ZSkKLXsKLQljaGFyCQlrZXlidWZbTUFYX1ZBTCsxXTsKLQljaGFyCQl2YWxidWZbTUFYX1ZBTCsxXTsKLQljaGFyCQljIDsKLQljaGFyIAkJKnAgOwotCWNoYXIJCSp2IDsKLQljaGFyCQkqZCA7Ci0JdV9sb25nCQl2YWwgPSAwIDsKLQlzdHJ1Y3Qgc19wdGFiCSpwdCA7Ci0JaW50CQlzdCA7Ci0JaW50CQlpIDsKLQotCS8qCi0JICogcGFyc2Uga2V5d29yZAotCSAqLwotCWlmICgoc3QgPSBwYXJzZV93b3JkKGtleWJ1ZixrZXl3b3JkKSkpCi0JCXJldHVybihzdCkgOwotCS8qCi0JICogcGFyc2UgdmFsdWUgaWYgZ2l2ZW4gYXMgc3RyaW5nCi0JICovCi0JaWYgKHR5cGUgPT0gMSkgewotCQlpZiAoKHN0ID0gcGFyc2Vfd29yZCh2YWxidWYsdmFsdWUpKSkKLQkJCXJldHVybihzdCkgOwotCX0KLQkvKgotCSAqIHNlYXJjaCBpbiB0YWJsZQotCSAqLwotCXN0ID0gMCA7Ci0JZm9yIChwdCA9IHB0YWIgOyAodiA9IHB0LT5wdF9uYW1lKSA7IHB0KyspIHsKLQkJZm9yIChwID0ga2V5YnVmIDsgKGMgPSAqcCkgOyBwKyssdisrKSB7Ci0JCQlpZiAoYyAhPSAqdikKLQkJCQlicmVhayA7Ci0JCX0KLQkJaWYgKCFjICYmICEqdikKLQkJCWJyZWFrIDsKLQl9Ci0JaWYgKCF2KQotCQlyZXR1cm4oLTEpIDsKLSNpZgkwCi0JcHJpbnRmKCI9PiVzPD09PiVzPD1cbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7Ci0jZW5kaWYKLQkvKgotCSAqIHNldCB2YWx1ZSBpbiBNSUIKLQkgKi8KLQlpZiAocHQtPnB0X3R5cGUpCi0JCXZhbCA9IHBhcnNlX251bSh0eXBlLHZhbHVlLHZhbGJ1ZixwdC0+cHRfbWluLHB0LT5wdF9tYXgsMSkgOwotCXN3aXRjaCAocHQtPnB0X251bSkgewotCWNhc2UgMCA6Ci0JCXYgPSB2YWxidWYgOwotCQlkID0gKGNoYXIgKikgc21jLT5taWIuZmRkaVBSUE1GUGFzc3dkIDsKLQkJZm9yIChpID0gMCA7IGkgPCAoc2lnbmVkKXNpemVvZihzbWMtPm1pYi5mZGRpUFJQTUZQYXNzd2QpIDsgaSsrKQotCQkJKmQrKyA9ICp2KysgOwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlc1xuIixwdC0+cHRfbmFtZSxzbWMtPm1pYi5mZGRpUFJQTUZQYXNzd2QpIDsKLQkJYnJlYWsgOwotCWNhc2UgMSA6Ci0JCXYgPSB2YWxidWYgOwotCQlkID0gKGNoYXIgKikgc21jLT5taWIuZmRkaVNNVFVzZXJEYXRhIDsKLQkJZm9yIChpID0gMCA7IGkgPCAoc2lnbmVkKXNpemVvZihzbWMtPm1pYi5mZGRpU01UVXNlckRhdGEpIDsgaSsrKQotCQkJKmQrKyA9ICp2KysgOwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlc1xuIixwdC0+cHRfbmFtZSxzbWMtPm1pYi5mZGRpU01UVXNlckRhdGEpIDsKLQkJYnJlYWsgOwotCWNhc2UgMiA6Ci0JCXNtYy0+bWliLnBbUEFdLmZkZGlQT1JUTGVyX0N1dG9mZiA9ICh1X2NoYXIpIHZhbCA7Ci0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAotCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQ3V0b2ZmKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDMgOgotCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVExlcl9DdXRvZmYgPSAodV9jaGFyKSB2YWwgOwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIiwKLQkJCXB0LT5wdF9uYW1lLHNtYy0+bWliLnBbUEJdLmZkZGlQT1JUTGVyX0N1dG9mZikgOwotCQlicmVhayA7Ci0JY2FzZSA0IDoKLQkJc21jLT5taWIucFtQQV0uZmRkaVBPUlRMZXJfQWxhcm0gPSAodV9jaGFyKSB2YWwgOwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIiwKLQkJCXB0LT5wdF9uYW1lLHNtYy0+bWliLnBbUEFdLmZkZGlQT1JUTGVyX0FsYXJtKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDUgOgotCQlzbWMtPm1pYi5wW1BCXS5mZGRpUE9SVExlcl9BbGFybSA9ICh1X2NoYXIpIHZhbCA7Ci0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLAotCQkJcHQtPnB0X25hbWUsc21jLT5taWIucFtQQl0uZmRkaVBPUlRMZXJfQWxhcm0pIDsKLQkJYnJlYWsgOwotCWNhc2UgNiA6CQkJLyogVE1BWCAqLwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKLQkJc21jLT5taWIuYVtQQVRIMF0uZmRkaVBBVEhUX01heExvd2VyQm91bmQgPQotCQkJKHVfbG9uZykgLU1TMkJDTEsoKGxvbmcpdmFsKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDcgOgkJCS8qIFRNSU4gKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLm1bTUFDMF0uZmRkaU1BQ1RfTWluID0KLQkJCSh1X2xvbmcpIC1NUzJCQ0xLKChsb25nKXZhbCkgOwotCQlicmVhayA7Ci0JY2FzZSA4IDoJCQkvKiBUUkVRICovCi0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSE1heFRfUmVxID0KLQkJCSh1X2xvbmcpIC1NUzJCQ0xLKChsb25nKXZhbCkgOwotCQlicmVhayA7Ci0JY2FzZSA5IDoJCQkvKiBUVlggKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWQgXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlzbWMtPm1pYi5hW1BBVEgwXS5mZGRpUEFUSFRWWExvd2VyQm91bmQgPQotCQkJKHVfbG9uZykgLVVTMkJDTEsoKGxvbmcpdmFsKSA7Ci0JCWJyZWFrIDsKLSNpZmRlZglFU1MKLQljYXNlIDEwIDoJCQkvKiBTQkFQQVlMT0FEICovCi0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlpZiAoc21jLT5taWIuZmRkaUVTU1BheWxvYWQgIT0gdmFsKSB7Ci0JCQlzbWMtPmVzcy5yYWZfYWN0X3RpbWVyX3BvbGwgPSBUUlVFIDsKLQkJCXNtYy0+bWliLmZkZGlFU1NQYXlsb2FkID0gdmFsIDsKLQkJfQotCQlicmVhayA7Ci0JY2FzZSAxMSA6CQkJLyogU0JBT1ZFUkhFQUQgKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLmZkZGlFU1NPdmVyaGVhZCA9IHZhbCA7Ci0JCWJyZWFrIDsKLQljYXNlIDEyIDoJCQkvKiBNQVhUTkVHICovCi0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlzbWMtPm1pYi5mZGRpRVNTTWF4VE5lZyA9ICh1X2xvbmcpIC1NUzJCQ0xLKChsb25nKXZhbCkgOwotCQlicmVhayA7Ci0JY2FzZSAxMyA6CQkJLyogTUlOU0VHTUVOVFNJWkUgKi8KLQkJREJfTUFJTigiU0VUICVzID0gJWRcbiIscHQtPnB0X25hbWUsdmFsKSA7Ci0JCXNtYy0+bWliLmZkZGlFU1NNaW5TZWdtZW50U2l6ZSA9IHZhbCA7Ci0JCWJyZWFrIDsKLQljYXNlIDE0IDoJCQkvKiBTQkFDQVRFR09SWSAqLwotCQlEQl9NQUlOKCJTRVQgJXMgPSAlZFxuIixwdC0+cHRfbmFtZSx2YWwpIDsKLQkJc21jLT5taWIuZmRkaUVTU0NhdGVnb3J5ID0KLQkJCShzbWMtPm1pYi5mZGRpRVNTQ2F0ZWdvcnkgJiAweGZmZmYpIHwKLQkJCSgodV9sb25nKSh2YWwgPDwgMTYpKSA7Ci0JCWJyZWFrIDsKLQljYXNlIDE1IDoJCQkvKiBTWU5DSFRYTU9ERSAqLwotCQkvKiBkbyBub3QgdXNlIG1lbWNtcCh2YWxidWYsIkFMTCIsMykgYmVjYXVzZSBEUyAhPSBTUyAqLwotCQlpZiAodmFsYnVmWzBdID09ICdBJyAmJiB2YWxidWZbMV0gPT0gJ0wnICYmIHZhbGJ1ZlsyXSA9PSAnTCcpIHsKLQkJCXNtYy0+bWliLmZkZGlFU1NTeW5jaFR4TW9kZSA9IFRSVUUgOwotCQkJREJfTUFJTigiU0VUICVzID0gJXNcbiIscHQtPnB0X25hbWUsdmFsYnVmKSA7Ci0JCX0KLQkJLyogaWYgKCFtZW1jbXAodmFsYnVmLCJTUExJVCIsNSkpIHsgKi8KLQkJaWYgKHZhbGJ1ZlswXSA9PSAnUycgJiYgdmFsYnVmWzFdID09ICdQJyAmJiB2YWxidWZbMl0gPT0gJ0wnICYmCi0JCQl2YWxidWZbM10gPT0gJ0knICYmIHZhbGJ1Zls0XSA9PSAnVCcpIHsKLQkJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHZhbGJ1ZikgOwotCQkJc21jLT5taWIuZmRkaUVTU1N5bmNoVHhNb2RlID0gRkFMU0UgOwotCQl9Ci0JCWJyZWFrIDsKLSNlbmRpZgotI2lmZGVmCVNCQQotCWNhc2UgMTYgOgkJCS8qIFNCQUNPTU1BTkQgKi8KLQkJLyogaWYgKCFtZW1jbXAodmFsYnVmLCJTVEFSVCIsNSkpIHsgKi8KLQkJaWYgKHZhbGJ1ZlswXSA9PSAnUycgJiYgdmFsYnVmWzFdID09ICdUJyAmJiB2YWxidWZbMl0gPT0gJ0EnICYmCi0JCQl2YWxidWZbM10gPT0gJ1InICYmIHZhbGJ1Zls0XSA9PSAnVCcpIHsKLQkJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHZhbGJ1ZikgOwotCQkJc21jLT5taWIuZmRkaVNCQUNvbW1hbmQgPSBTQl9TVEFSVCA7Ci0JCX0KLQkJLyogaWYgKCFtZW1jbXAodmFsYnVmLCJTVE9QIiw0KSkgeyAqLwotCQlpZiAodmFsYnVmWzBdID09ICdTJyAmJiB2YWxidWZbMV0gPT0gJ1QnICYmIHZhbGJ1ZlsyXSA9PSAnTycgJiYKLQkJCXZhbGJ1ZlszXSA9PSAnUCcpIHsKLQkJCURCX01BSU4oIlNFVCAlcyA9ICVzXG4iLHB0LT5wdF9uYW1lLHZhbGJ1ZikgOwotCQkJc21jLT5taWIuZmRkaVNCQUNvbW1hbmQgPSBTQl9TVE9QIDsKLQkJfQotCQlicmVhayA7Ci0JY2FzZSAxNyA6CQkJLyogU0JBQVZBSUxBQkxFICovCi0JCURCX01BSU4oIlNFVCAlcyA9ICVkXG4iLHB0LT5wdF9uYW1lLHZhbCkgOwotCQlzbWMtPm1pYi5mZGRpU0JBQXZhaWxhYmxlID0gKHVfY2hhcikgdmFsIDsKLQkJYnJlYWsgOwotI2VuZGlmCi0JfQotCXJldHVybigwKSA7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2Vfd29yZChjaGFyICpidWYsIGNoYXIgX2ZhciAqdGV4dCkKLXsKLQljaGFyCQljIDsKLQljaGFyIAkJKnAgOwotCWludAkJcF9sZW4gOwotCWludAkJcXVvdGUgOwotCWludAkJaSA7Ci0JaW50CQlvayA7Ci0KLQkvKgotCSAqIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZQotCSAqLwotCXAgPSBidWYgOwotCWZvciAoaSA9IDAgOyBpIDwgTUFYX1ZBTCA7IGkrKykKLQkJKnArKyA9IDAgOwotCXAgPSBidWYgOwotCXBfbGVuID0gMCA7Ci0Jb2sgPSAwIDsKLQl3aGlsZSAoIChjID0gKnRleHQrKykgJiYgKGMgIT0gJ1xuJykgJiYgKGMgIT0gJ1xyJykpIHsKLQkJaWYgKChjICE9ICcgJykgJiYgKGMgIT0gJ1x0JykpIHsKLQkJCW9rID0gMSA7Ci0JCQlicmVhayA7Ci0JCX0KLQl9Ci0JaWYgKCFvaykKLQkJcmV0dXJuKC0xKSA7Ci0JaWYgKGMgPT0gJyInKSB7Ci0JCXF1b3RlID0gMSA7Ci0JfQotCWVsc2UgewotCQlxdW90ZSA9IDAgOwotCQl0ZXh0LS0gOwotCX0KLQkvKgotCSAqIHBhcnNlIHZhbGJ1ZgotCSAqLwotCW9rID0gMCA7Ci0Jd2hpbGUgKCFvayAmJiBwX2xlbiA8IE1BWF9WQUwtMSAmJiAoYyA9ICp0ZXh0KyspICYmIChjICE9ICdcbicpCi0JCSYmIChjICE9ICdccicpKSB7Ci0JCXN3aXRjaCAocXVvdGUpIHsKLQkJY2FzZSAwIDoKLQkJCWlmICgoYyA9PSAnICcpIHx8IChjID09ICdcdCcpIHx8IChjID09ICc9JykpIHsKLQkJCQlvayA9IDEgOwotCQkJCWJyZWFrIDsKLQkJCX0KLQkJCSpwKysgPSBjIDsKLQkJCXBfbGVuKysgOwotCQkJYnJlYWsgOwotCQljYXNlIDIgOgotCQkJKnArKyA9IGMgOwotCQkJcF9sZW4rKyA7Ci0JCQlxdW90ZSA9IDEgOwotCQkJYnJlYWsgOwotCQljYXNlIDEgOgotCQkJc3dpdGNoIChjKSB7Ci0JCQljYXNlICciJyA6Ci0JCQkJb2sgPSAxIDsKLQkJCQlicmVhayA7Ci0JCQljYXNlICdcXCcgOgotCQkJCXF1b3RlID0gMiA7Ci0JCQkJYnJlYWsgOwotCQkJZGVmYXVsdCA6Ci0JCQkJKnArKyA9IGMgOwotCQkJCXBfbGVuKysgOwotCQkJfQotCQl9Ci0JfQotCSpwKysgPSAwIDsKLQlmb3IgKHAgPSBidWYgOyAoYyA9ICpwKSA7IHArKykgewotCQlpZiAoYyA+PSAnYScgJiYgYyA8PSAneicpCi0JCQkqcCA9IGMgKyAnQScgLSAnYScgOwotCX0KLQlyZXR1cm4oMCkgOwotfQotCi1zdGF0aWMgdV9sb25nIHBhcnNlX251bShpbnQgdHlwZSwgY2hhciBfZmFyICp2YWx1ZSwgY2hhciAqdiwgdV9sb25nIG1uLAotCQkJdV9sb25nIG14LCBpbnQgc2NhbGUpCi17Ci0JdV9sb25nCXggPSAwIDsKLQljaGFyCWMgOwotCi0JaWYgKHR5cGUgPT0gMCkgewkJLyogaW50ZWdlciAqLwotCQl1X2xvbmcgX2ZhcgkqbCA7Ci0JCXVfbG9uZwkJdTEgOwotCi0JCWwgPSAodV9sb25nIF9mYXIgKikgdmFsdWUgOwotCQl1MSA9ICpsIDsKLQkJLyoKLQkJICogaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlIHRha2UgdGhlIGxvd2VyIGxpbWl0Ci0JCSAqLwotCQlpZiAoKGxvbmcpdTEgPCAwKSB7Ci0JCQlpZiAoLSAoKGxvbmcpdTEpID4gKGxvbmcpIG14KSB7Ci0JCQkJdTEgPSAwIDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXUxID0gKHVfbG9uZykgLSAoKGxvbmcpdTEpIDsKLQkJCX0KLQkJfQotCQl4ID0gdTEgOwotCX0KLQllbHNlIHsJCQkJLyogc3RyaW5nICovCi0JCWludAlzaWduID0gMCA7Ci0KLQkJaWYgKCp2ID09ICctJykgewotCQkJc2lnbiA9IDEgOwotCQl9Ci0JCXdoaWxlICgoYyA9ICp2KyspICYmIChjID49ICcwJykgJiYgKGMgPD0gJzknKSkgewotCQkJeCA9IHggKiAxMCArIGMgLSAnMCcgOwotCQl9Ci0JCWlmIChzY2FsZSA9PSAxMCkgewotCQkJeCAqPSAxMCA7Ci0JCQlpZiAoYyA9PSAnLicpIHsKLQkJCQlpZiAoKGMgPSAqdisrKSAmJiAoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKLQkJCQkJeCArPSBjIC0gJzAnIDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNpZ24pCi0JCQl4ID0gKHVfbG9uZykgLSAoKGxvbmcpeCkgOwotCX0KLQkvKgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZQotCSAqCWFuZCB0aGUgYWJzb2x1dGUgdmFsdWUgaXMgb3V0c2lkZSB0aGUgbGltaXRzCi0JICoJCXRha2UgdGhlIGxvd2VyIGxpbWl0Ci0JICoJZWxzZQotCSAqCQl0YWtlIHRoZSBhYnNvdXRlIHZhbHVlCi0JICovCi0JaWYgKChsb25nKXggPCAwKSB7Ci0JCWlmICgtICgobG9uZyl4KSA+IChsb25nKSBteCkgewotCQkJeCA9IDAgOwotCQl9Ci0JCWVsc2UgewotCQkJeCA9ICh1X2xvbmcpIC0gKChsb25nKXgpIDsKLQkJfQotCX0KLQlpZiAoeCA8IG1uKQotCQlyZXR1cm4obW4pIDsKLQllbHNlIGlmICh4ID4gbXgpCi0JCXJldHVybihteCkgOwotCXJldHVybih4KSA7Ci19Ci0KLSNpZiAwCi1zdHJ1Y3QJc19zbWMJU01DIDsKLW1haW4oKQotewotCWNoYXIJKnAgOwotCWNoYXIJKnYgOwotCWNoYXIJYnVmWzEwMF0gOwotCWludAl0b2dnbGUgPSAwIDsKLQotCXdoaWxlIChnZXRzKGJ1ZikpIHsKLQkJcCA9IGJ1ZiA7Ci0JCXdoaWxlICgqcCAmJiAoKCpwID09ICcgJykgfHwgKCpwID09ICdcdCcpKSkKLQkJCXArKyA7Ci0KLQkJd2hpbGUgKCpwICYmICgoKnAgIT0gJyAnKSAmJiAoKnAgIT0gJ1x0JykpKQotCQkJcCsrIDsKLQotCQl2ID0gcCA7Ci0JCXdoaWxlICgqdiAmJiAoKCp2ID09ICcgJykgfHwgKCp2ID09ICdcdCcpKSkKLQkJCXYrKyA7Ci0JCWlmICgoKnYgPj0gJzAnKSAmJiAoKnYgPD0gJzknKSkgewotCQkJdG9nZ2xlID0gIXRvZ2dsZSA7Ci0JCQlpZiAodG9nZ2xlKSB7Ci0JCQkJdV9sb25nCWwgOwotCQkJCWwgPSBhdG9sKHYpIDsKLQkJCQlzbXRfcGFyc2VfYXJnKCZTTUMsYnVmLDAsKGNoYXIgX2ZhciAqKSZsKSA7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc210X3BhcnNlX2FyZygmU01DLGJ1ZiwxLChjaGFyIF9mYXIgKilwKSA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzbXRfcGFyc2VfYXJnKCZTTUMsYnVmLDEsKGNoYXIgX2ZhciAqKXApIDsKLQkJfQotCX0KLQlleGl0KDApIDsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za2dlLmMgYi9kcml2ZXJzL25ldC9za2dlLmMKaW5kZXggMzBlOGQ1OC4uNWNhY2M3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2tnZS5jCisrKyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwpAQCAtNyw3ICs3LDcgQEAKICAqIG9mIHRoZSBvcmlnaW5hbCBkcml2ZXIgc3VjaCBhcyBsaW5rIGZhaWwtb3ZlciBhbmQgbGluayBtYW5hZ2VtZW50IGJlY2F1c2UKICAqIHRob3NlIHNob3VsZCBiZSBkb25lIGF0IGhpZ2hlciBsZXZlbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0LCBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBvc2RsLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSBTdGVwaGVuIEhlbW1pbmdlciA8c2hlbW1pbmdlckBvc2RsLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQyLDE5ICs0MiwyMCBAQAogI2luY2x1ZGUgInNrZ2UuaCIKIAogI2RlZmluZSBEUlZfTkFNRQkJInNrZ2UiCi0jZGVmaW5lIERSVl9WRVJTSU9OCQkiMC42IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJIjAuNyIKICNkZWZpbmUgUEZYCQkJRFJWX05BTUUgIiAiCiAKICNkZWZpbmUgREVGQVVMVF9UWF9SSU5HX1NJWkUJMTI4CiAjZGVmaW5lIERFRkFVTFRfUlhfUklOR19TSVpFCTUxMgogI2RlZmluZSBNQVhfVFhfUklOR19TSVpFCTEwMjQKICNkZWZpbmUgTUFYX1JYX1JJTkdfU0laRQk0MDk2CisjZGVmaW5lIFJYX0NPUFlfVEhSRVNIT0xECTEyOAorI2RlZmluZSBSWF9CVUZfU0laRQkJMTUzNgogI2RlZmluZSBQSFlfUkVUUklFUwkgICAgICAgIDEwMDAKICNkZWZpbmUgRVRIX0pVTUJPX01UVQkJOTAwMAogI2RlZmluZSBUWF9XQVRDSERPRwkJKDUgKiBIWikKICNkZWZpbmUgTkFQSV9XRUlHSFQJCTY0CiAjZGVmaW5lIEJMSU5LX0haCQkoSFovNCkKLSNkZWZpbmUgTElOS19QT0xMX0haCQkoSFovMTApCiAKIE1PRFVMRV9ERVNDUklQVElPTigiU3lzS29ubmVjdCBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+Iik7CkBAIC03MCwyOCArNzEsMTcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMD1ub25lLC4uLiwxNj1hbGwpIik7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBza2dlX2lkX3RhYmxlW10gPSB7Ci0JeyBQQ0lfVkVORE9SX0lEXzNDT00sIFBDSV9ERVZJQ0VfSURfM0NPTV8zQzk0MCwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDOTQwQiwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUX0dFLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9LAotCXsgUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfWVUsCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCi0JeyBQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4OUUwMCwgLyogU0stOUV4eCAgKi8KLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfRExJTkssIFBDSV9ERVZJQ0VfSURfRExJTktfREdFNTEwVCwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg0MzIwLCAvKiBHaWdhYml0IEV0aGVybmV0IENvbnRyb2xsZXIgKi8KLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDA1LCAvKiBNYXJ2ZWxsICgxMWFiKSwgQmVsa2luICovCi0JICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NORVQsIFBDSV9ERVZJQ0VfSURfQ05FVF9HSUdBQ0FSRCwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgUENJX0RFVklDRV9JRF9MSU5LU1lTX0VHMTAzMiwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKLQl7IFBDSV9WRU5ET1JfSURfTElOS1NZUywgUENJX0RFVklDRV9JRF9MSU5LU1lTX0VHMTA2NCwKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF8zQ09NLCBQQ0lfREVWSUNFX0lEXzNDT01fM0M5NDApIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfM0NPTSwgUENJX0RFVklDRV9JRF8zQ09NXzNDOTQwQikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TWVNLT05ORUNULCBQQ0lfREVWSUNFX0lEX1NZU0tPTk5FQ1RfR0UpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU1lTS09OTkVDVCwgUENJX0RFVklDRV9JRF9TWVNLT05ORUNUX1lVKSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NZU0tPTk5FQ1QsIDB4OUUwMCkgfSwgLyogU0stOUV4eCAgKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywgUENJX0RFVklDRV9JRF9ETElOS19ER0U1MTBUKSwgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzMjApIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTUFSVkVMTCwgMHg1MDA1KSB9LCAvKiBCZWxraW4gKi8KKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DTkVULCBQQ0lfREVWSUNFX0lEX0NORVRfR0lHQUNBUkQpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTElOS1NZUywgUENJX0RFVklDRV9JRF9MSU5LU1lTX0VHMTAzMikgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9MSU5LU1lTLCBQQ0lfREVWSUNFX0lEX0xJTktTWVNfRUcxMDY0KSB9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNrZ2VfaWRfdGFibGUpOwpAQCAtOTksMTkgKzg5LDIyIEBACiBzdGF0aWMgaW50IHNrZ2VfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHNrZ2VfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHNrZ2VfdHhfY2xlYW4oc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSk7Ci1zdGF0aWMgdm9pZCBza2dlX3htX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKTsKLXN0YXRpYyB2b2lkIHNrZ2VfZ21fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpOworc3RhdGljIHZvaWQgeG1fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpOworc3RhdGljIHZvaWQgZ21fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpOwogc3RhdGljIHZvaWQgZ2VuZXNpc19nZXRfc3RhdHMoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSwgdTY0ICpkYXRhKTsKIHN0YXRpYyB2b2lkIHl1a29uX2dldF9zdGF0cyhzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLCB1NjQgKmRhdGEpOwogc3RhdGljIHZvaWQgeXVrb25faW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KTsKIHN0YXRpYyB2b2lkIHl1a29uX3Jlc2V0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpOwogc3RhdGljIHZvaWQgZ2VuZXNpc19tYWNfaW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KTsKIHN0YXRpYyB2b2lkIGdlbmVzaXNfcmVzZXQoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCBnZW5lc2lzX2xpbmtfdXAoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSk7CiAKKy8qIEF2b2lkIGNvbmRpdGlvbmFscyBieSB1c2luZyBhcnJheSAqLwogc3RhdGljIGNvbnN0IGludCB0eHFhZGRyW10gPSB7IFFfWEExLCBRX1hBMiB9Owogc3RhdGljIGNvbnN0IGludCByeHFhZGRyW10gPSB7IFFfUjEsIFFfUjIgfTsKIHN0YXRpYyBjb25zdCB1MzIgcnhpcnFtYXNrW10gPSB7IElTX1IxX0YsIElTX1IyX0YgfTsKIHN0YXRpYyBjb25zdCB1MzIgdHhpcnFtYXNrW10gPSB7IElTX1hBMV9GLCBJU19YQTJfRiB9Oworc3RhdGljIGNvbnN0IHUzMiBwb3J0aXJxbWFza1tdID0geyBJU19QT1JUXzEsIElTX1BPUlRfMiB9OwogCiAvKiBEb24ndCBuZWVkIHRvIGxvb2sgYXQgd2hvbGUgMTZLLgogICogbGFzdCBpbnRlcmVzdGluZyByZWdpc3RlciBpcyBkZXNjcmlwdG9yIHBvbGwgdGltZXIuCkBAIC0xNTQsNyArMTQ3LDcgQEAKIHN0YXRpYyBpbnQgd29sX3N1cHBvcnRlZChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCiB7CiAJcmV0dXJuICEoKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUyB8fAotCQkgIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OICYmIGNoaXBfcmV2KGh3KSA9PSAwKSkpOworCQkgIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OICYmIGh3LT5jaGlwX3JldiA9PSAwKSkpOwogfQogCiBzdGF0aWMgdm9pZCBza2dlX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQpAQCAtMTcwLDcgKzE2Myw3IEBACiAJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CiAKLQlpZih3b2wtPndvbG9wdHMgIT0gV0FLRV9NQUdJQyAmJiB3b2wtPndvbG9wdHMgIT0gMCkKKwlpZiAod29sLT53b2xvcHRzICE9IFdBS0VfTUFHSUMgJiYgd29sLT53b2xvcHRzICE9IDApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmICh3b2wtPndvbG9wdHMgPT0gV0FLRV9NQUdJQyAmJiAhd29sX3N1cHBvcnRlZChodykpCkBAIC0xOTAsNiArMTgzLDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIERldGVybWluZSBzdXBwb3J0ZWQvYWR2ZXJpc2VkIG1vZGVzIGJhc2VkIG9uIGhhcmR3YXJlLgorICogTm90ZTogZXRodG9vb2wgQURWRVJUSVNFRF94eHggPT0gU1VQUE9SVEVEX3h4eAorICovCitzdGF0aWMgdTMyIHNrZ2Vfc3VwcG9ydGVkX21vZGVzKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodykKK3sKKwl1MzIgc3VwcG9ydGVkOworCisJaWYgKGlzY29wcGVyKGh3KSkgeworCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmCisJCQl8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCXwgU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYKKwkJCXwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwKKwkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCisJCQl8IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAorCQkJfCBTVVBQT1JURURfQXV0b25lZ3wgU1VQUE9SVEVEX1RQOworCisJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCQlzdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTBiYXNlVF9IYWxmCisJCQkJCSAgICAgfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsCisJCQkJCSAgICAgfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZgorCQkJCQkgICAgIHwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwpOworCisJCWVsc2UgaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04pCisJCQlzdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZjsKKwl9IGVsc2UKKwkJc3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFCisJCQl8IFNVUFBPUlRFRF9BdXRvbmVnOworCisJcmV0dXJuIHN1cHBvcnRlZDsKK30KIAogc3RhdGljIGludCBza2dlX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCkBAIC0xOTgsMzggKzIyMSwxMyBAQAogCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwogCiAJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCWVjbWQtPnN1cHBvcnRlZCA9IHNrZ2Vfc3VwcG9ydGVkX21vZGVzKGh3KTsKIAogCWlmIChpc2NvcHBlcihodykpIHsKLQkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKLQkJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAotCQkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmCi0JCQkJfCBTVVBQT1JURURfQXV0b25lZyB8IFNVUFBPUlRFRF9UUDsKLQkJZWxzZSB7Ci0JCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmCi0JCQkJfCBTVVBQT1JURURfMTBiYXNlVF9GdWxsCi0JCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfSGFsZgotCQkJCXwgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwKLQkJCQl8IFNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZgotCQkJCXwgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsCi0JCQkJfCBTVVBQT1JURURfQXV0b25lZ3wgU1VQUE9SVEVEX1RQOwotCi0JCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTikKLQkJCQllY21kLT5zdXBwb3J0ZWQgJj0gflNVUFBPUlRFRF8xMDAwYmFzZVRfSGFsZjsKLQotCQkJZWxzZSBpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRSkKLQkJCQllY21kLT5zdXBwb3J0ZWQgJj0gfihTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYKLQkJCQkJCSAgICAgfCBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwpOwotCQl9Ci0KIAkJZWNtZC0+cG9ydCA9IFBPUlRfVFA7CiAJCWVjbWQtPnBoeV9hZGRyZXNzID0gaHctPnBoeV9hZGRyOwotCX0gZWxzZSB7Ci0JCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbAotCQkJfCBTVVBQT1JURURfRklCUkUKLQkJCXwgU1VQUE9SVEVEX0F1dG9uZWc7Ci0KKwl9IGVsc2UKIAkJZWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7Ci0JfQogCiAJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBza2dlLT5hZHZlcnRpc2luZzsKIAllY21kLT5hdXRvbmVnID0gc2tnZS0+YXV0b25lZzsKQEAgLTIzOCw2NSArMjM2LDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgc2tnZV9tb2Rlcyhjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcpCi17Ci0JdTMyIG1vZGVzID0gQURWRVJUSVNFRF9BdXRvbmVnCi0JCXwgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYKLQkJfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYKLQkJfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOwotCi0JaWYgKGlzY29wcGVyKGh3KSkgewotCQltb2RlcyB8PSBBRFZFUlRJU0VEX1RQOwotCQlzd2l0Y2goaHctPmNoaXBfaWQpIHsKLQkJY2FzZSBDSElQX0lEX0dFTkVTSVM6Ci0JCQltb2RlcyAmPSB+KEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbAotCQkJCSAgIHwgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmCi0JCQkJICAgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbAotCQkJCSAgIHwgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDSElQX0lEX1lVS09OOgotCQkJbW9kZXMgJj0gfkFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7Ci0JCQlicmVhazsKLQotCQljYXNlIENISVBfSURfWVVLT05fRkU6Ci0JCQltb2RlcyAmPSB+KEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGZ8QURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCW1vZGVzIHw9IEFEVkVSVElTRURfRklCUkU7Ci0JCW1vZGVzICY9IH5BRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmOwotCX0KLQlyZXR1cm4gbW9kZXM7Ci19Ci0KIHN0YXRpYyBpbnQgc2tnZV9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCWNvbnN0IHN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OworCXUzMiBzdXBwb3J0ZWQgPSBza2dlX3N1cHBvcnRlZF9tb2Rlcyhodyk7CiAKIAlpZiAoZWNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBza2dlX21vZGVzKGh3KSkKLQkJCXJldHVybiAtRUlOVkFMOworCQllY21kLT5hZHZlcnRpc2luZyA9IHN1cHBvcnRlZDsKKwkJc2tnZS0+ZHVwbGV4ID0gLTE7CisJCXNrZ2UtPnNwZWVkID0gLTE7CiAJfSBlbHNlIHsKKwkJdTMyIHNldHRpbmc7CisKIAkJc3dpdGNoKGVjbWQtPnNwZWVkKSB7CiAJCWNhc2UgU1BFRURfMTAwMDoKLQkJCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0ZFKQorCQkJaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJCQlzZXR0aW5nID0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQkJZWxzZSBpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJCXNldHRpbmcgPSBTVVBQT1JURURfMTAwMGJhc2VUX0hhbGY7CisJCQllbHNlCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlicmVhazsKIAkJY2FzZSBTUEVFRF8xMDA6CisJCQlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCXNldHRpbmcgPSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJCWVsc2UgaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJCQlzZXR0aW5nID0gU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGY7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwogCQljYXNlIFNQRUVEXzEwOgotCQkJaWYgKGlzY29wcGVyKGh3KSB8fCBody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCisJCQlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJCXNldHRpbmcgPSBTVVBQT1JURURfMTBiYXNlVF9GdWxsOworCQkJZWxzZSBpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQkJCXNldHRpbmcgPSBTVVBQT1JURURfMTBiYXNlVF9IYWxmOworCQkJZWxzZQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCisJCWlmICgoc2V0dGluZyAmIHN1cHBvcnRlZCkgPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNrZ2UtPnNwZWVkID0gZWNtZC0+c3BlZWQ7CisJCXNrZ2UtPmR1cGxleCA9IGVjbWQtPmR1cGxleDsKIAl9CiAKIAlza2dlLT5hdXRvbmVnID0gZWNtZC0+YXV0b25lZzsKLQlza2dlLT5zcGVlZCA9IGVjbWQtPnNwZWVkOwotCXNrZ2UtPmR1cGxleCA9IGVjbWQtPmR1cGxleDsKIAlza2dlLT5hZHZlcnRpc2luZyA9IGVjbWQtPmFkdmVydGlzaW5nOwogCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtMzkzLDcgKzM4Myw3IEBACiB7CiAJaW50IGk7CiAKLQlzd2l0Y2goc3RyaW5nc2V0KSB7CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKIAljYXNlIEVUSF9TU19TVEFUUzoKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2tnZV9zdGF0cyk7IGkrKykKIAkJCW1lbWNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwKQEAgLTUxMSwxNCArNTAxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogT25seSBZdWtvbiBJSSBzdXBwb3J0cyBUU08gKG5vdCBpbXBsZW1lbnRlZCB5ZXQpICovCi1zdGF0aWMgaW50IHNrZ2Vfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlpZiAoZGF0YSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBza2dlX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqZWNtZCkKIHsKQEAgLTU0MCw5ICs1MjIsOSBAQAogCXNrZ2UtPmF1dG9uZWcgPSBlY21kLT5hdXRvbmVnOwogCWlmIChlY21kLT5yeF9wYXVzZSAmJiBlY21kLT50eF9wYXVzZSkKIAkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1NZTU1FVFJJQzsKLQllbHNlIGlmKGVjbWQtPnJ4X3BhdXNlICYmICFlY21kLT50eF9wYXVzZSkKKwllbHNlIGlmIChlY21kLT5yeF9wYXVzZSAmJiAhZWNtZC0+dHhfcGF1c2UpCiAJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9SRU1fU0VORDsKLQllbHNlIGlmKCFlY21kLT5yeF9wYXVzZSAmJiBlY21kLT50eF9wYXVzZSkKKwllbHNlIGlmICghZWNtZC0+cnhfcGF1c2UgJiYgZWNtZC0+dHhfcGF1c2UpCiAJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9MT0NfU0VORDsKIAllbHNlCiAJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9OT05FOwpAQCAtNTU5LDggKzU0MSw2IEBACiB7CiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKIAkJcmV0dXJuIDUzMjE1OyAvKiBvcjogIDUzLjEyNSBNSHogKi8KLQllbHNlIGlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0VDKQotCQlyZXR1cm4gMTI1MDAwOyAvKiBvcjogMTI1LjAwMCBNSHogKi8KIAllbHNlCiAJCXJldHVybiA3ODIxNTsgLyogb3I6ICA3OC4xMjUgTUh6ICovCiB9CkBAIC02NDMsMzAgKzYyMywxOCBAQAogc3RhdGljIHZvaWQgc2tnZV9sZWRfb24oc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCkKIHsKIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKSB7Ci0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksIExJTktMRURfT04pOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIExOS19MRURfUkVHKSwgTElOS0xFRF9PTik7CiAJCXNrZ2Vfd3JpdGU4KGh3LCBCMF9MRUQsIExFRF9TVEFUX09OKTsKIAotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTEVEX1RTVCksIExFRF9UX09OKTsKLQkJc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9MRURfVkFMKSwgMTAwKTsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfVFNUKSwgTEVEX1RfT04pOworCQlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfVkFMKSwgMTAwKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9TVEFSVCk7CiAKLQkJc3dpdGNoIChody0+cGh5X3R5cGUpIHsKLQkJY2FzZSBTS19QSFlfQkNPTToKLQkJCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLAotCQkJCQkgIFBIWV9CX1BFQ19MRURfT04pOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0tfUEhZX0xPTkU6Ci0JCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0xPTkVfTEVEX0NGRywKLQkJCQkJICAweDA4MDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX1RTVCksIExFRF9UX09OKTsKLQkJCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX1ZBTCksIDEwMCk7Ci0JCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX0NUUkwpLCBMRURfU1RBUlQpOwotCQl9CisJCS8qIEZvciBCcm9hZGNvbSBQaHkgb25seSAqLworCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsIFBIWV9CX1BFQ19MRURfT04pOwogCX0gZWxzZSB7Ci0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgMCk7Ci0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgMCk7CisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX09WRVIsCiAJCQkJICBQSFlfTV9MRURfTU9fRFVQKE1PX0xFRF9PTikgIHwKIAkJCQkgIFBIWV9NX0xFRF9NT18xMChNT19MRURfT04pICAgfAogCQkJCSAgUEhZX01fTEVEX01PXzEwMChNT19MRURfT04pICB8CkBAIC02NzgsMjggKzY0NiwxNyBAQAogc3RhdGljIHZvaWQgc2tnZV9sZWRfb2ZmKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7CiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgewotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09GRik7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX09GRik7CiAJCXNrZ2Vfd3JpdGU4KGh3LCBCMF9MRUQsIExFRF9TVEFUX09GRik7CiAKLQkJc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9MRURfVkFMKSwgMCk7Ci0JCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9UX09GRik7CisJCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9WQUwpLCAwKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9UX09GRik7CiAKLQkJc3dpdGNoIChody0+cGh5X3R5cGUpIHsKLQkJY2FzZSBTS19QSFlfQkNPTToKLQkJCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9QX0VYVF9DVFJMLAotCQkJCQkgIFBIWV9CX1BFQ19MRURfT0ZGKTsKLQkJCWJyZWFrOwotCQljYXNlIFNLX1BIWV9MT05FOgotCQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9MT05FX0xFRF9DRkcsCi0JCQkJCSAgUEhZX0xfTENfTEVEVCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTEVEX1ZBTCksIDApOwotCQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX0xFRF9DVFJMKSwgTEVEX1RfT0ZGKTsKLQkJfQorCQkvKiBCcm9hZGNvbSBvbmx5ICovCisJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgUEhZX0JfUEVDX0xFRF9PRkYpOwogCX0gZWxzZSB7Ci0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgMCk7Ci0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfQ1RSTCwgMCk7CisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX09WRVIsCiAJCQkJICBQSFlfTV9MRURfTU9fRFVQKE1PX0xFRF9PRkYpICB8CiAJCQkJICBQSFlfTV9MRURfTU9fMTAoTU9fTEVEX09GRikgICB8CiAJCQkJICBQSFlfTV9MRURfTU9fMTAwKE1PX0xFRF9PRkYpICB8CkBAIC03MzAsNyArNjg3LDcgQEAKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmKCFkYXRhIHx8IGRhdGEgPiAodTMyKShNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKSkKKwlpZiAoIWRhdGEgfHwgZGF0YSA+ICh1MzIpKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopKQogCQlkYXRhID0gKHUzMikoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWik7CiAKIAkvKiBzdGFydCBibGlua2luZyAqLwpAQCAtNzYzLDggKzcyMCw2IEBACiAJLnNldF9wYXVzZXBhcmFtID0gc2tnZV9zZXRfcGF1c2VwYXJhbSwKIAkuZ2V0X2NvYWxlc2NlCT0gc2tnZV9nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZQk9IHNrZ2Vfc2V0X2NvYWxlc2NlLAotCS5nZXRfdHNvCT0gZXRodG9vbF9vcF9nZXRfdHNvLAotCS5zZXRfdHNvCT0gc2tnZV9zZXRfdHNvLAogCS5nZXRfc2cJCT0gZXRodG9vbF9vcF9nZXRfc2csCiAJLnNldF9zZwkJPSBza2dlX3NldF9zZywKIAkuZ2V0X3R4X2NzdW0JPSBldGh0b29sX29wX2dldF90eF9jc3VtLApAQCAtNzkzLDYgKzc0OCw3IEBACiAKIAlmb3IgKGkgPSAwLCBlID0gcmluZy0+c3RhcnQsIGQgPSB2YWRkcjsgaSA8IHJpbmctPmNvdW50OyBpKyssIGUrKywgZCsrKSB7CiAJCWUtPmRlc2MgPSBkOworCQllLT5za2IgPSBOVUxMOwogCQlpZiAoaSA9PSByaW5nLT5jb3VudCAtIDEpIHsKIAkJCWUtPm5leHQgPSByaW5nLT5zdGFydDsKIAkJCWQtPm5leHRfb2Zmc2V0ID0gYmFzZTsKQEAgLTgwNiwyNCArNzYyLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFNldHVwIGJ1ZmZlciBmb3IgcmVjZWl2aW5nICovCi1zdGF0aWMgaW5saW5lIGludCBza2dlX3J4X2FsbG9jKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UsCi0JCQkJc3RydWN0IHNrZ2VfZWxlbWVudCAqZSkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqc2tnZV9yeF9hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBza2dlLT5uZXRkZXYtPm10dSArIEVUSF9ITEVOOyAvKiBWTEFOPyAqLwotCXN0cnVjdCBza2dlX3J4X2Rlc2MgKnJkID0gZS0+ZGVzYzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXU2NCBtYXA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CiAKLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGJ1ZnNpemUgKyBORVRfSVBfQUxJR04pOwotCWlmICh1bmxpa2VseSghc2tiKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiBvdXQgb2YgbWVtb3J5IGZvciByZWNlaXZlXG4iLAotCQkgICAgICAgc2tnZS0+bmV0ZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGxpa2VseShza2IpKSB7CisJCXNrYi0+ZGV2ID0gZGV2OworCQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CiAJfQorCXJldHVybiBza2I7Cit9CiAKLQlza2ItPmRldiA9IHNrZ2UtPm5ldGRldjsKLQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisvKiBBbGxvY2F0ZSBhbmQgc2V0dXAgYSBuZXcgYnVmZmVyIGZvciByZWNlaXZpbmcgKi8KK3N0YXRpYyB2b2lkIHNrZ2Vfcnhfc2V0dXAoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSwgc3RydWN0IHNrZ2VfZWxlbWVudCAqZSwKKwkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGJ1ZnNpemUpCit7CisJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOworCXU2NCBtYXA7CiAKIAltYXAgPSBwY2lfbWFwX3NpbmdsZShza2dlLT5ody0+cGRldiwgc2tiLT5kYXRhLCBidWZzaXplLAogCQkJICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtODQxLDU1ICs3OTYsNjkgQEAKIAlyZC0+Y29udHJvbCA9IEJNVV9PV04gfCBCTVVfU1RGIHwgQk1VX0lSUV9FT0YgfCBCTVVfVENQX0NIRUNLIHwgYnVmc2l6ZTsKIAlwY2lfdW5tYXBfYWRkcl9zZXQoZSwgbWFwYWRkciwgbWFwKTsKIAlwY2lfdW5tYXBfbGVuX3NldChlLCBtYXBsZW4sIGJ1ZnNpemUpOwotCXJldHVybiAwOwogfQogCi0vKiBGcmVlIGFsbCB1bnVzZWQgYnVmZmVycyBpbiByZWNlaXZlIHJpbmcsIGFzc3VtZXMgcmVjZWl2ZXIgc3RvcHBlZCAqLworLyogUmVzdW1lIHJlY2VpdmluZyB1c2luZyBleGlzdGluZyBza2IsCisgKiBOb3RlOiBETUEgYWRkcmVzcyBpcyBub3QgY2hhbmdlZCBieSBjaGlwLgorICogCSBNVFUgbm90IGNoYW5nZWQgd2hpbGUgcmVjZWl2ZXIgYWN0aXZlLgorICovCitzdGF0aWMgdm9pZCBza2dlX3J4X3JldXNlKHN0cnVjdCBza2dlX2VsZW1lbnQgKmUsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBza2dlX3J4X2Rlc2MgKnJkID0gZS0+ZGVzYzsKKworCXJkLT5jc3VtMiA9IDA7CisJcmQtPmNzdW0yX3N0YXJ0ID0gRVRIX0hMRU47CisKKwl3bWIoKTsKKworCXJkLT5jb250cm9sID0gQk1VX09XTiB8IEJNVV9TVEYgfCBCTVVfSVJRX0VPRiB8IEJNVV9UQ1BfQ0hFQ0sgfCBzaXplOworfQorCisKKy8qIEZyZWUgYWxsICBidWZmZXJzIGluIHJlY2VpdmUgcmluZywgYXNzdW1lcyByZWNlaXZlciBzdG9wcGVkICovCiBzdGF0aWMgdm9pZCBza2dlX3J4X2NsZWFuKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCiB7CiAJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CiAJc3RydWN0IHNrZ2VfcmluZyAqcmluZyA9ICZza2dlLT5yeF9yaW5nOwogCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7CiAKLQlmb3IgKGUgPSByaW5nLT50b19jbGVhbjsgZSAhPSByaW5nLT50b191c2U7IGUgPSBlLT5uZXh0KSB7CisJZSA9IHJpbmctPnN0YXJ0OworCWRvIHsKIAkJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOwogCQlyZC0+Y29udHJvbCA9IDA7Ci0KLQkJcGNpX3VubWFwX3NpbmdsZShody0+cGRldiwKLQkJCQkgcGNpX3VubWFwX2FkZHIoZSwgbWFwYWRkciksCi0JCQkJIHBjaV91bm1hcF9sZW4oZSwgbWFwbGVuKSwKLQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJZGV2X2tmcmVlX3NrYihlLT5za2IpOwotCQllLT5za2IgPSBOVUxMOwotCX0KLQlyaW5nLT50b19jbGVhbiA9IGU7CisJCWlmIChlLT5za2IpIHsKKwkJCXBjaV91bm1hcF9zaW5nbGUoaHctPnBkZXYsCisJCQkJCSBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKKwkJCQkJIHBjaV91bm1hcF9sZW4oZSwgbWFwbGVuKSwKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlkZXZfa2ZyZWVfc2tiKGUtPnNrYik7CisJCQllLT5za2IgPSBOVUxMOworCQl9CisJfSB3aGlsZSAoKGUgPSBlLT5uZXh0KSAhPSByaW5nLT5zdGFydCk7CiB9CiAKKwogLyogQWxsb2NhdGUgYnVmZmVycyBmb3IgcmVjZWl2ZSByaW5nCi0gKiBGb3IgcmVjZWl2ZTogdG9fdXNlICAgaXMgcmVmaWxsIGxvY2F0aW9uCi0gKiAgICAgICAgICAgICAgdG9fY2xlYW4gaXMgbmV4dCByZWNlaXZlZCBmcmFtZS4KLSAqCi0gKiBpZiAodG9fdXNlID09IHRvX2NsZWFuKQotICoJIHRoZW4gcmluZyBhbGwgZnJhbWVzIGluIHJpbmcgbmVlZCBidWZmZXJzCi0gKiBpZiAodG9fdXNlLT5uZXh0ID09IHRvX2NsZWFuKQotICoJIHRoZW4gcmluZyBhbGwgZnJhbWVzIGluIHJpbmcgaGF2ZSBidWZmZXJzCisgKiBGb3IgcmVjZWl2ZTogIHRvX2NsZWFuIGlzIG5leHQgcmVjZWl2ZWQgZnJhbWUuCiAgKi8KIHN0YXRpYyBpbnQgc2tnZV9yeF9maWxsKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCiB7CiAJc3RydWN0IHNrZ2VfcmluZyAqcmluZyA9ICZza2dlLT5yeF9yaW5nOwogCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7Ci0JaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGJ1ZnNpemUgPSBza2dlLT5yeF9idWZfc2l6ZTsKIAotCWZvciAoZSA9IHJpbmctPnRvX3VzZTsgZS0+bmV4dCAhPSByaW5nLT50b19jbGVhbjsgZSA9IGUtPm5leHQpIHsKLQkJaWYgKHNrZ2VfcnhfYWxsb2Moc2tnZSwgZSkpIHsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKLQkJfQorCWUgPSByaW5nLT5zdGFydDsKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBza2dlX3J4X2FsbG9jKHNrZ2UtPm5ldGRldiwgYnVmc2l6ZSk7CiAKLQl9Ci0JcmluZy0+dG9fdXNlID0gZTsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldHVybiByZXQ7CisJCXNrZ2Vfcnhfc2V0dXAoc2tnZSwgZSwgc2tiLCBidWZzaXplKTsKKwl9IHdoaWxlICggKGUgPSBlLT5uZXh0KSAhPSByaW5nLT5zdGFydCk7CisKKwlyaW5nLT50b19jbGVhbiA9IHJpbmctPnN0YXJ0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBza2dlX2xpbmtfdXAoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKQEAgLTkxOSw1MCArODg4LDUwIEBACiAJCXByaW50ayhLRVJOX0lORk8gUEZYICIlczogTGluayBpcyBkb3duLlxuIiwgc2tnZS0+bmV0ZGV2LT5uYW1lKTsKIH0KIAotc3RhdGljIHUxNiBza2dlX3htX3BoeV9yZWFkKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsICB1MTYgcmVnKQorc3RhdGljIHUxNiB4bV9waHlfcmVhZChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnKQogewogCWludCBpOwogCXUxNiB2OwogCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfQUREUiwgcmVnIHwgaHctPnBoeV9hZGRyKTsKLQl2ID0gc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1BIWV9EQVRBKTsKLQlpZiAoaHctPnBoeV90eXBlICE9IFNLX1BIWV9YTUFDKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7Ci0JCQl1ZGVsYXkoMSk7Ci0JCQlpZiAoc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpCi0JCQkgICAgJiBYTV9NTVVfUEhZX1JEWSkKLQkJCQlnb3RvIHJlYWR5OwotCQl9CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUEhZX0FERFIsIHJlZyB8IGh3LT5waHlfYWRkcik7CisJdiA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fUEhZX0RBVEEpOwogCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogcGh5IHJlYWQgdGltZWQgb3V0XG4iLAotCQkgICAgICAgaHctPmRldltwb3J0XS0+bmFtZSk7Ci0JCXJldHVybiAwOwotCXJlYWR5OgotCQl2ID0gc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX1BIWV9EQVRBKTsKKwkvKiBOZWVkIHRvIHdhaXQgZm9yIGV4dGVybmFsIFBIWSAqLworCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVUUklFUzsgaSsrKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkKKwkJICAgICYgWE1fTU1VX1BIWV9SRFkpCisJCQlnb3RvIHJlYWR5OwogCX0KIAorCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogcGh5IHJlYWQgdGltZWQgb3V0XG4iLAorCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKKwlyZXR1cm4gMDsKKyByZWFkeToKKwl2ID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9QSFlfREFUQSk7CisKIAlyZXR1cm4gdjsKIH0KIAotc3RhdGljIHZvaWQgc2tnZV94bV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCkKK3N0YXRpYyB2b2lkIHhtX3BoeV93cml0ZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCB1MTYgcmVnLCB1MTYgdmFsKQogewogCWludCBpOwogCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfQUREUiwgcmVnIHwgaHctPnBoeV9hZGRyKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfQUREUiwgcmVnIHwgaHctPnBoeV9hZGRyKTsKIAlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFVFJJRVM7IGkrKykgewotCQlpZiAoIShza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkgJiBYTV9NTVVfUEhZX0JVU1kpKQorCQlpZiAoISh4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpICYgWE1fTU1VX1BIWV9CVVNZKSkKIAkJCWdvdG8gcmVhZHk7Ci0JCWNwdV9yZWxheCgpOworCQl1ZGVsYXkoMSk7CiAJfQogCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICIlczogcGh5IHdyaXRlIGZhaWxlZCB0byBjb21lIHJlYWR5XG4iLAogCSAgICAgICBody0+ZGV2W3BvcnRdLT5uYW1lKTsKIAogCiAgcmVhZHk6Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfREFUQSwgdmFsKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9QSFlfREFUQSwgdmFsKTsKIAlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFVFJJRVM7IGkrKykgewogCQl1ZGVsYXkoMSk7Ci0JCWlmICghKHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKSAmIFhNX01NVV9QSFlfQlVTWSkpCisJCWlmICghKHhtX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkgJiBYTV9NTVVfUEhZX0JVU1kpKQogCQkJcmV0dXJuOwogCX0KIAlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiJXM6IHBoeSB3cml0ZSB0aW1lZCBvdXRcbiIsCkBAIC05OTksMzQgKzk2OCwxMTIgQEAKIAogc3RhdGljIHZvaWQgZ2VuZXNpc19yZXNldChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0KQogewotCWludCBpOwotCXU2NCB6ZXJvID0gMDsKKwljb25zdCB1OCB6ZXJvWzhdICA9IHsgMCB9OwogCiAJLyogcmVzZXQgdGhlIHN0YXRpc3RpY3MgbW9kdWxlICovCi0Jc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9HUF9QT1JULCBYTV9HUF9SRVNfU1RBVCk7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9JTVNLLCAweGZmZmYpOwkvKiBkaXNhYmxlIFhNQUMgSVJRcyAqLwotCXNrZ2VfeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgMCk7CQkvKiBjbGVhciBNb2RlIFJlZyAqLwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fVFhfQ01ELCAwKTsJLyogcmVzZXQgVFggQ01EIFJlZyAqLwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCAwKTsJLyogcmVzZXQgUlggQ01EIFJlZyAqLworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX0dQX1BPUlQsIFhNX0dQX1JFU19TVEFUKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9JTVNLLCAweGZmZmYpOwkvKiBkaXNhYmxlIFhNQUMgSVJRcyAqLworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIDApOwkJLyogY2xlYXIgTW9kZSBSZWcgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9UWF9DTUQsIDApOwkvKiByZXNldCBUWCBDTUQgUmVnICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCAwKTsJLyogcmVzZXQgUlggQ01EIFJlZyAqLwogCi0JLyogZGlzYWJsZSBhbGwgUEhZIElSUXMgKi8KLQlpZiAgKGh3LT5waHlfdHlwZSA9PSBTS19QSFlfQkNPTSkKLQkJc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgMHhmZmZmKTsKKwkvKiBkaXNhYmxlIEJyb2FkY29tIFBIWSBJUlEgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgMHhmZmZmKTsKIAotCXNrZ2VfeG1fb3V0aGFzaChodywgcG9ydCwgWE1fSFNNLCAodTggKikgJnplcm8pOwotCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQotCQlza2dlX3htX291dGFkZHIoaHcsIHBvcnQsIFhNX0VYTShpKSwgKHU4ICopICZ6ZXJvKTsKLQlza2dlX3htX291dGhhc2goaHcsIHBvcnQsIFhNX1NSQ19DSEssICh1OCAqKSAmemVybyk7CisJeG1fb3V0aGFzaChodywgcG9ydCwgWE1fSFNNLCB6ZXJvKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBnZW5lc2lzX21hY19pbml0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCisvKiBDb252ZXJ0IG1vZGUgdG8gTUlJIHZhbHVlcyAgKi8KK3N0YXRpYyBjb25zdCB1MTYgcGh5X3BhdXNlX21hcFtdID0geworCVtGTE9XX01PREVfTk9ORV0gPQkwLAorCVtGTE9XX01PREVfTE9DX1NFTkRdID0JUEhZX0FOX1BBVVNFX0FTWU0sCisJW0ZMT1dfTU9ERV9TWU1NRVRSSUNdID0gUEhZX0FOX1BBVVNFX0NBUCwKKwlbRkxPV19NT0RFX1JFTV9TRU5EXSAgPSBQSFlfQU5fUEFVU0VfQ0FQIHwgUEhZX0FOX1BBVVNFX0FTWU0sCit9OworCisKKy8qIENoZWNrIHN0YXR1cyBvZiBCcm9hZGNvbSBwaHkgbGluayAqLworc3RhdGljIHZvaWQgYmNvbV9jaGVja19saW5rKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGh3LT5kZXZbcG9ydF0pOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W3BvcnRdOworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOworCXUxNiBzdGF0dXM7CisKKwkvKiByZWFkIHR3aWNlIGJlY2F1c2Ugb2YgbGF0Y2ggKi8KKwkodm9pZCkgeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX1NUQVQpOworCXN0YXR1cyA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9TVEFUKTsKKworCXByX2RlYnVnKCJiY29tX2NoZWNrX2xpbmsgc3RhdHVzPTB4JXhcbiIsIHN0YXR1cyk7CisKKwlpZiAoKHN0YXR1cyAmIFBIWV9TVF9MU1lOQykgPT0gMCkgeworCQl1MTYgY21kID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwkJY21kICY9IH4oWE1fTU1VX0VOQV9SWCB8IFhNX01NVV9FTkFfVFgpOworCQl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NTVVfQ01ELCBjbWQpOworCQkvKiBkdW1teSByZWFkIHRvIGVuc3VyZSB3cml0aW5nICovCisJCSh2b2lkKSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOworCisJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQlza2dlX2xpbmtfZG93bihza2dlKTsKKwl9IGVsc2UgeworCQlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSAmJgorCQkgICAgKHN0YXR1cyAmIFBIWV9TVF9BTl9PVkVSKSkgeworCQkJdTE2IGxwYSA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVU5FX0xQKTsKKwkJCXUxNiBhdXggPSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fQVVYX1NUQVQpOworCisJCQlpZiAobHBhICYgUEhZX0JfQU5fUkYpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICIlczogcmVtb3RlIGZhdWx0XG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyogQ2hlY2sgRHVwbGV4IG1pc21hdGNoICovCisJCQlzd2l0Y2goYXV4ICYgUEhZX0JfQVNfQU5fUkVTX01TSykgeworCQkJY2FzZSBQSFlfQl9SRVNfMTAwMEZEOgorCQkJCXNrZ2UtPmR1cGxleCA9IERVUExFWF9GVUxMOworCQkJCWJyZWFrOworCQkJY2FzZSBQSFlfQl9SRVNfMTAwMEhEOgorCQkJCXNrZ2UtPmR1cGxleCA9IERVUExFWF9IQUxGOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICIlczogZHVwbGV4IG1pc21hdGNoXG4iLAorCQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJCXJldHVybjsKKwkJCX0KKworCisJCQkvKiBXZSBhcmUgdXNpbmcgSUVFRSA4MDIuM3ovRDUuMCBUYWJsZSAzNy00ICovCisJCQlzd2l0Y2ggKGF1eCAmIFBIWV9CX0FTX1BBVVNFX01TSykgeworCQkJY2FzZSBQSFlfQl9BU19QQVVTRV9NU0s6CisJCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX1NZTU1FVFJJQzsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZX0JfQVNfUFJSOgorCQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9SRU1fU0VORDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUEhZX0JfQVNfUFJUOgorCQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9MT0NfU0VORDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc2tnZS0+Zmxvd19jb250cm9sID0gRkxPV19NT0RFX05PTkU7CisJCQl9CisKKwkJCXNrZ2UtPnNwZWVkID0gU1BFRURfMTAwMDsKKwkJfQorCisJCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQorCQkJZ2VuZXNpc19saW5rX3VwKHNrZ2UpOworCX0KK30KKworLyogQnJvYWRjb20gNTQwMCBvbmx5IHN1cHBvcnRzIGdpYWdhYml0ISBTeXNLb25uZWN0IGRpZCBub3QgcHV0IGFuIGFkZGl0aW9uYWwKKyAqIFBoeSBvbiBmb3IgMTAwIG9yIDEwTWJpdCBvcGVyYXRpb24KKyAqLworc3RhdGljIHZvaWQgYmNvbV9waHlfaW5pdChzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlLCBpbnQganVtYm8pCit7CisJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CisJaW50IHBvcnQgPSBza2dlLT5wb3J0OwogCWludCBpOwotCXUzMiByOwotCXUxNiBpZDE7Ci0JdTE2IGN0cmwxLCBjdHJsMiwgY3RybDMsIGN0cmw0LCBjdHJsNTsKKwl1MTYgaWQxLCByLCBleHQsIGN0bDsKIAogCS8qIG1hZ2ljIHdvcmthcm91bmQgcGF0dGVybnMgZm9yIEJyb2FkY29tICovCiAJc3RhdGljIGNvbnN0IHN0cnVjdCB7CkBAIC0xMDQyLDE2ICsxMDg5LDEyMCBAQAogCQl7IDB4MTcsIDB4MDAxMyB9LCB7IDB4MTUsIDB4MEEwNCB9LCB7IDB4MTgsIDB4MDQyMCB9LAogCX07CiAKKwlwcl9kZWJ1ZygiYmNvbV9waHlfaW5pdFxuIik7CisKKwkvKiByZWFkIElkIGZyb20gZXh0ZXJuYWwgUEhZIChhbGwgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzKSAqLworCWlkMSA9IHhtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfWE1BQ19JRDEpOworCisJLyogT3B0aW1pemUgTURJTyB0cmFuc2ZlciBieSBzdXBwcmVzc2luZyBwcmVhbWJsZS4gKi8KKwlyID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwlyIHw9ICBYTV9NTVVfTk9fUFJFOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQscik7CisKKwlzd2l0Y2goaWQxKSB7CisJY2FzZSBQSFlfQkNPTV9JRDFfQzA6CisJCS8qCisJCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgZm9yIHRoZSBDMCB0eXBlLgorCQkgKiBXcml0ZSBtYWdpYyBwYXR0ZXJucyB0byByZXNlcnZlZCByZWdpc3RlcnMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShDMGhhY2spOyBpKyspCisJCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsCisJCQkJICAgICBDMGhhY2tbaV0ucmVnLCBDMGhhY2tbaV0udmFsKTsKKworCQlicmVhazsKKwljYXNlIFBIWV9CQ09NX0lEMV9BMToKKwkJLyoKKwkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSBmb3IgdGhlIEExIHR5cGUuCisJCSAqIFdyaXRlIG1hZ2ljIHBhdHRlcm5zIHRvIHJlc2VydmVkIHJlZ2lzdGVycy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEExaGFjayk7IGkrKykKKwkJCXhtX3BoeV93cml0ZShodywgcG9ydCwKKwkJCQkgICAgIEExaGFja1tpXS5yZWcsIEExaGFja1tpXS52YWwpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgZm9yIGFsbCBCQ29tIFBIWXMuCisJICogRGlzYWJsZSBQb3dlciBNYW5hZ2VtZW50IGFmdGVyIHJlc2V0LgorCSAqLworCXIgPSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwpOworCXIgfD0gUEhZX0JfQUNfRElTX1BNOworCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsIHIpOworCisJLyogRHVtbXkgcmVhZCAqLworCXhtX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQyk7CisKKwlleHQgPSBQSFlfQl9QRUNfRU5fTFRSOyAvKiBlbmFibGUgdHggbGVkICovCisJY3RsID0gUEhZX0NUX1NQMTAwMDsJLyogYWx3YXlzIDEwMDBtYml0ICovCisKKwlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQkvKgorCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhICMxIGZvciB0aGUgQzUgdHlwZS4KKwkJICogMTAwMEJhc2UtVCBMaW5rIEFjcXVpc2l0aW9uIEZhaWx1cmUgaW4gU2xhdmUgTW9kZQorCQkgKiBTZXQgUmVwZWF0ZXIvRFRFIGJpdCAxMCBvZiB0aGUgMTAwMEJhc2UtVCBDb250cm9sIFJlZ2lzdGVyCisJCSAqLworCQl1MTYgYWR2ID0gUEhZX0JfMTAwMENfUkQ7CisJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYpCisJCQlhZHYgfD0gUEhZX0JfMTAwMENfQUhEOworCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQkJYWR2IHw9IFBIWV9CXzEwMDBDX0FGRDsKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV8xMDAwVF9DVFJMLCBhZHYpOworCisJCWN0bCB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKKwl9IGVsc2UgeworCQlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQkJY3RsIHw9IFBIWV9DVF9EVVBfTUQ7CisJCS8qIEZvcmNlIHRvIHNsYXZlICovCisJCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fMTAwMFRfQ1RSTCwgUEhZX0JfMTAwMENfTVNFKTsKKwl9CisKKwkvKiBTZXQgYXV0b25lZ290aWF0aW9uIHBhdXNlIHBhcmFtZXRlcnMgKi8KKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0FVTkVfQURWLAorCQkgICAgIHBoeV9wYXVzZV9tYXBbc2tnZS0+Zmxvd19jb250cm9sXSB8IFBIWV9BTl9DU01BKTsKKworCS8qIEhhbmRsZSBKdW1ibyBmcmFtZXMgKi8KKwlpZiAoanVtYm8pIHsKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwKKwkJCSAgICAgUEhZX0JfQUNfVFhfVFNUIHwgUEhZX0JfQUNfTE9OR19QQUNLKTsKKworCQlleHQgfD0gUEhZX0JfUEVDX0hJR0hfTEE7CisKKwl9CisKKwl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX1BfRVhUX0NUUkwsIGV4dCk7CisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLCBjdGwpOworCisJLyogVXNlIGxpbmsgc3RhdHVzIGNoYW5nZSBpbnRlcnJydXB0ICovCisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgUEhZX0JfREVGX01TSyk7CisKKwliY29tX2NoZWNrX2xpbmsoaHcsIHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBnZW5lc2lzX21hY19pbml0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbcG9ydF07CisJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGp1bWJvID0gaHctPmRldltwb3J0XS0+bXR1ID4gRVRIX0RBVEFfTEVOOworCWludCBpOworCXUzMiByOworCWNvbnN0IHU4IHplcm9bNl0gID0geyAwIH07CisKKwkvKiBDbGVhciBNSUIgY291bnRlcnMgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9TVEFUX0NNRCwKKwkJCVhNX1NDX0NMUl9SWEMgfCBYTV9TQ19DTFJfVFhDKTsKKwkvKiBDbGVhciB0d28gdGltZXMgYWNjb3JkaW5nIHRvIEVycmF0YSAjMyAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1NUQVRfQ01ELAorCQkJWE1fU0NfQ0xSX1JYQyB8IFhNX1NDX0NMUl9UWEMpOwogCiAJLyogaW5pdGlhbGl6ZSBSeCwgVHggYW5kIExpbmsgTEVEICovCi0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIExOS19MRURfUkVHKSwgTElOS0xFRF9PTik7Ci0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIExOS19MRURfUkVHKSwgTElOS0xFRF9MSU5LU1lOQ19PTik7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBMTktfTEVEX1JFRyksIExJTktMRURfT04pOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgTE5LX0xFRF9SRUcpLCBMSU5LTEVEX0xJTktTWU5DX09OKTsKIAotCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9TVEFSVCk7Ci0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX0xFRF9DVFJMKSwgTEVEX1NUQVJUKTsKIAogCS8qIFVucmVzZXQgdGhlIFhNQUMuICovCi0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfQ0xSX01BQ19SU1QpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9DTFJfTUFDX1JTVCk7CiAKIAkvKgogCSAqIFBlcmZvcm0gYWRkaXRpb25hbCBpbml0aWFsaXphdGlvbiBmb3IgZXh0ZXJuYWwgUEhZcywKQEAgLTEwNTksNjcgKzEyMTAsNTYgQEAKIAkgKiBHTUlJIG1vZGUuCiAJICovCiAJc3Bpbl9sb2NrX2JoKCZody0+cGh5X2xvY2spOwotCWlmIChody0+cGh5X3R5cGUgIT0gU0tfUEhZX1hNQUMpIHsKLQkJLyogVGFrZSBQSFkgb3V0IG9mIHJlc2V0LiAqLwotCQlyID0gc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKLQkJaWYgKHBvcnQgPT0gMCkKLQkJCXIgfD0gR1BfRElSXzB8R1BfSU9fMDsKLQkJZWxzZQotCQkJciB8PSBHUF9ESVJfMnxHUF9JT18yOworCS8qIFRha2UgZXh0ZXJuYWwgUGh5IG91dCBvZiByZXNldCAqLworCXIgPSBza2dlX3JlYWQzMihodywgQjJfR1BfSU8pOworCWlmIChwb3J0ID09IDApCisJCXIgfD0gR1BfRElSXzB8R1BfSU9fMDsKKwllbHNlCisJCXIgfD0gR1BfRElSXzJ8R1BfSU9fMjsKIAotCQlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLCByKTsKLQkJc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKKwlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLCByKTsKKwlza2dlX3JlYWQzMihodywgQjJfR1BfSU8pOworCXNwaW5fdW5sb2NrX2JoKCZody0+cGh5X2xvY2spOwogCi0JCS8qIEVuYWJsZSBHTUlJIG1vZGUgb24gdGhlIFhNQUMuICovCi0JCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSFdfQ0ZHLCBYTV9IV19HTUlJX01EKTsKKwkvKiBFbmFibGUgR01JSSBpbnRlcmZhYyAqLworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0hXX0NGRywgWE1fSFdfR01JSV9NRCk7CiAKLQkJaWQxID0gc2tnZV94bV9waHlfcmVhZChodywgcG9ydCwgUEhZX1hNQUNfSUQxKTsKKwliY29tX3BoeV9pbml0KHNrZ2UsIGp1bWJvKTsKIAotCQkvKiBPcHRpbWl6ZSBNRElPIHRyYW5zZmVyIGJ5IHN1cHByZXNzaW5nIHByZWFtYmxlLiAqLwotCQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsCi0JCQkJc2tnZV94bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpCi0JCQkJfCBYTV9NTVVfTk9fUFJFKTsKKwkvKiBTZXQgU3RhdGlvbiBBZGRyZXNzICovCisJeG1fb3V0YWRkcihodywgcG9ydCwgWE1fU0EsIGRldi0+ZGV2X2FkZHIpOwogCi0JCWlmIChpZDEgPT0gUEhZX0JDT01fSUQxX0MwKSB7Ci0JCQkvKgotCQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSBmb3IgdGhlIEMwIHR5cGUuCi0JCQkgKiBXcml0ZSBtYWdpYyBwYXR0ZXJucyB0byByZXNlcnZlZCByZWdpc3RlcnMuCi0JCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEMwaGFjayk7IGkrKykKLQkJCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwKLQkJCQkJICBDMGhhY2tbaV0ucmVnLCBDMGhhY2tbaV0udmFsKTsKKwkvKiBXZSBkb24ndCB1c2UgbWF0Y2ggYWRkcmVzc2VzIHNvIGNsZWFyICovCisJZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCisJCXhtX291dGFkZHIoaHcsIHBvcnQsIFhNX0VYTShpKSwgemVybyk7CiAKLQkJfSBlbHNlIGlmIChpZDEgPT0gUEhZX0JDT01fSUQxX0ExKSB7Ci0JCQkvKgotCQkJICogV29ya2Fyb3VuZCBCQ09NIEVycmF0YSBmb3IgdGhlIEExIHR5cGUuCi0JCQkgKiBXcml0ZSBtYWdpYyBwYXR0ZXJucyB0byByZXNlcnZlZCByZWdpc3RlcnMuCi0JCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEExaGFjayk7IGkrKykKLQkJCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwKLQkJCQkJICBBMWhhY2tbaV0ucmVnLCBBMWhhY2tbaV0udmFsKTsKLQkJfQotCi0JCS8qCi0JCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgZm9yIGFsbCBCQ29tIFBIWXMuCi0JCSAqIERpc2FibGUgUG93ZXIgTWFuYWdlbWVudCBhZnRlciByZXNldC4KLQkJICovCi0JCXIgPSBza2dlX3htX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCk7Ci0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9BVVhfQ1RSTCwgciB8IFBIWV9CX0FDX0RJU19QTSk7Ci0JfQotCi0JLyogRHVtbXkgcmVhZCAqLwotCXNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JU1JDKTsKLQotCXIgPSBza2dlX3htX3JlYWQzMihodywgcG9ydCwgWE1fTU9ERSk7Ci0Jc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCByfFhNX01EX0NTQSk7CisJLyogY29uZmlndXJlIFJ4IEhpZ2ggV2F0ZXIgTWFyayAoWE1fUlhfSElfV00pICovCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfSElfV00sIDE0NTApOwogCiAJLyogV2UgZG9uJ3QgbmVlZCB0aGUgRkNTIGFwcGVuZGVkIHRvIHRoZSBwYWNrZXQuICovCi0JciA9IHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9SWF9DTUQpOwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCByIHwgWE1fUlhfU1RSSVBfRkNTKTsKKwlyID0gWE1fUlhfTEVORVJSX09LIHwgWE1fUlhfU1RSSVBfRkNTOworCWlmIChqdW1ibykKKwkJciB8PSBYTV9SWF9CSUdfUEtfT0s7CisKKwlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9IQUxGKSB7CisJCS8qCisJCSAqIElmIGluIG1hbnVhbCBoYWxmIGR1cGxleCBtb2RlIHRoZSBvdGhlciBzaWRlIG1pZ2h0IGJlIGluCisJCSAqIGZ1bGwgZHVwbGV4IG1vZGUsIHNvIGlnbm9yZSBpZiBhIGNhcnJpZXIgZXh0ZW5zaW9uIGlzIG5vdCBzZWVuCisJCSAqIG9uIGZyYW1lcyByZWNlaXZlZAorCQkgKi8KKwkJciB8PSBYTV9SWF9ESVNfQ0VYVDsKKwl9CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCByKTsKKwogCiAJLyogV2Ugd2FudCBzaG9ydCBmcmFtZXMgcGFkZGVkIHRvIDYwIGJ5dGVzLiAqLwotCXIgPSBza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fVFhfQ01EKTsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1RYX0NNRCwgciB8IFhNX1RYX0FVVE9fUEFEKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9UWF9DTUQsIFhNX1RYX0FVVE9fUEFEKTsKKworCS8qCisJICogQnVtcCB1cCB0aGUgdHJhbnNtaXQgdGhyZXNob2xkLiBUaGlzIGhlbHBzIGhvbGQgb2ZmIHRyYW5zbWl0CisJICogdW5kZXJydW5zIHdoZW4gd2UncmUgYmxhc3RpbmcgdHJhZmZpYyBmcm9tIGJvdGggcG9ydHMgYXQgb25jZS4KKwkgKi8KKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9UWF9USFIsIDUxMik7CiAKIAkvKgogCSAqIEVuYWJsZSB0aGUgcmVjZXB0aW9uIG9mIGFsbCBlcnJvciBmcmFtZXMuIFRoaXMgaXMgaXMKQEAgLTExMzUsMTkgKzEyNzUsMjIgQEAKIAkgKiBjYXNlIHRoZSBYTUFDIHdpbGwgc3RhcnQgdHJhbnNmZXJpbmcgZnJhbWVzIG91dCBvZiB0aGUKIAkgKiBSWCBGSUZPIGFzIHNvb24gYXMgdGhlIEZJRk8gdGhyZXNob2xkIGlzIHJlYWNoZWQuCiAJICovCi0JciA9IHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKLQlza2dlX3htX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsCi0JCSAgICAgWE1fTURfUlhfQ1JDRXxYTV9NRF9SWF9MT05HfFhNX01EX1JYX1JVTlR8Ci0JCSAgICAgWE1fTURfUlhfRVJSfFhNX01EX1JYX0lSTEUpOworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsIFhNX0RFRl9NT0RFKTsKIAotCXNrZ2VfeG1fb3V0YWRkcihodywgcG9ydCwgWE1fU0EsIGh3LT5kZXZbcG9ydF0tPmRldl9hZGRyKTsKLQlza2dlX3htX291dGFkZHIoaHcsIHBvcnQsIFhNX0VYTSgwKSwgaHctPmRldltwb3J0XS0+ZGV2X2FkZHIpOwogCiAJLyoKLQkgKiBCdW1wIHVwIHRoZSB0cmFuc21pdCB0aHJlc2hvbGQuIFRoaXMgaGVscHMgaG9sZCBvZmYgdHJhbnNtaXQKLQkgKiB1bmRlcnJ1bnMgd2hlbiB3ZSdyZSBibGFzdGluZyB0cmFmZmljIGZyb20gYm90aCBwb3J0cyBhdCBvbmNlLgorCSAqIEluaXRpYWxpemUgdGhlIFJlY2VpdmUgQ291bnRlciBFdmVudCBNYXNrIChYTV9SWF9FVl9NU0spCisJICoJLSBFbmFibGUgYWxsIGJpdHMgZXhjZXB0aW5nICdPY3RldHMgUnggT0sgTG93IENudE92JworCSAqCSAgYW5kICdPY3RldHMgUnggT0sgSGkgQ250IE92Jy4KIAkgKi8KLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1RYX1RIUiwgNTEyKTsKKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9SWF9FVl9NU0ssIFhNUl9ERUZfTVNLKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgVHJhbnNtaXQgQ291bnRlciBFdmVudCBNYXNrIChYTV9UWF9FVl9NU0spCisJICoJLSBFbmFibGUgYWxsIGJpdHMgZXhjZXB0aW5nICdPY3RldHMgVHggT0sgTG93IENudE92JworCSAqCSAgYW5kICdPY3RldHMgVHggT0sgSGkgQ250IE92Jy4KKwkgKi8KKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9UWF9FVl9NU0ssIFhNVF9ERUZfTVNLKTsKIAogCS8qIENvbmZpZ3VyZSBNQUMgYXJiaXRlciAqLwogCXNrZ2Vfd3JpdGUxNihodywgQjNfTUFfVE9fQ1RSTCwgTUFfUlNUX0NMUik7CkBAIC0xMTY0LDEzNyArMTMwNywzMCBAQAogCXNrZ2Vfd3JpdGU4KGh3LCBCM19NQV9SQ0lOSV9UWDIsIDApOwogCiAJLyogQ29uZmlndXJlIFJ4IE1BQyBGSUZPICovCi0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfQ0xSKTsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9FTkFfVElNX1BBVCk7Ci0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9FTkFfT1BfTUQpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwyKSwgTUZGX1JTVF9DTFIpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX01GRl9DVFJMMSksIE1GRl9FTkFfVElNX1BBVCk7CisJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDIpLCBNRkZfRU5BX09QX01EKTsKIAogCS8qIENvbmZpZ3VyZSBUeCBNQUMgRklGTyAqLwotCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDIpLCBNRkZfUlNUX0NMUik7Ci0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfVFhfQ1RSTF9ERUYpOwotCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDIpLCBNRkZfRU5BX09QX01EKTsKKwlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9SU1RfQ0xSKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9NRkZfQ1RSTDEpLCBNRkZfVFhfQ1RSTF9ERUYpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX0VOQV9PUF9NRCk7CiAKLQlpZiAoaHctPmRldltwb3J0XS0+bXR1ID4gRVRIX0RBVEFfTEVOKSB7CisJaWYgKGp1bWJvKSB7CiAJCS8qIEVuYWJsZSBmcmFtZSBmbHVzaGluZyBpZiBqdW1ibyBmcmFtZXMgdXNlZCAqLwotCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9GTFVTSCk7CisJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9GTFVTSCk7CiAJfSBlbHNlIHsKIAkJLyogZW5hYmxlIHRpbWVvdXQgdGltZXJzIGlmIG5vcm1hbCBmcmFtZXMgKi8KIAkJc2tnZV93cml0ZTE2KGh3LCBCM19QQV9DVFJMLAotCQkJICAgICBwb3J0ID09IDAgPyBQQV9FTkFfVE9fVFgxIDogUEFfRU5BX1RPX1RYMik7CisJCQkgICAgIChwb3J0ID09IDApID8gUEFfRU5BX1RPX1RYMSA6IFBBX0VOQV9UT19UWDIpOwogCX0KLQotCi0JciA9IHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9SWF9DTUQpOwotCWlmIChody0+ZGV2W3BvcnRdLT5tdHUgPiBFVEhfREFUQV9MRU4pCi0JCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCByIHwgWE1fUlhfQklHX1BLX09LKTsKLQllbHNlCi0JCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fUlhfQ01ELCByICYgfihYTV9SWF9CSUdfUEtfT0spKTsKLQotCXN3aXRjaCAoaHctPnBoeV90eXBlKSB7Ci0JY2FzZSBTS19QSFlfWE1BQzoKLQkJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJCWN0cmwxID0gUEhZX1hfQU5fRkQgfCBQSFlfWF9BTl9IRDsKLQotCQkJc3dpdGNoIChza2dlLT5mbG93X2NvbnRyb2wpIHsKLQkJCWNhc2UgRkxPV19NT0RFX05PTkU6Ci0JCQkJY3RybDEgfD0gUEhZX1hfUF9OT19QQVVTRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX0xPQ19TRU5EOgotCQkJCWN0cmwxIHw9IFBIWV9YX1BfQVNZTV9NRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1NZTU1FVFJJQzoKLQkJCQljdHJsMSB8PSBQSFlfWF9QX1NZTV9NRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1JFTV9TRU5EOgotCQkJCWN0cmwxIHw9IFBIWV9YX1BfQk9USF9NRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9YTUFDX0FVTkVfQURWLCBjdHJsMSk7Ci0JCQljdHJsMiA9IFBIWV9DVF9BTkUgfCBQSFlfQ1RfUkVfQ0ZHOwotCQl9IGVsc2UgewotCQkJY3RybDIgPSAwOwotCQkJaWYgKHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKLQkJCQljdHJsMiB8PSBQSFlfQ1RfRFVQX01EOwotCQl9Ci0KLQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9YTUFDX0NUUkwsIGN0cmwyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNLX1BIWV9CQ09NOgotCQljdHJsMSA9IFBIWV9DVF9TUDEwMDA7Ci0JCWN0cmwyID0gMDsKLQkJY3RybDMgPSBQSFlfU0VMX1RZUEU7Ci0JCWN0cmw0ID0gUEhZX0JfUEVDX0VOX0xUUjsKLQkJY3RybDUgPSBQSFlfQl9BQ19UWF9UU1Q7Ci0KLQkJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJCS8qCi0JCQkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhICMxIGZvciB0aGUgQzUgdHlwZS4KLQkJCSAqIDEwMDBCYXNlLVQgTGluayBBY3F1aXNpdGlvbiBGYWlsdXJlIGluIFNsYXZlIE1vZGUKLQkJCSAqIFNldCBSZXBlYXRlci9EVEUgYml0IDEwIG9mIHRoZSAxMDAwQmFzZS1UIENvbnRyb2wgUmVnaXN0ZXIKLQkJCSAqLwotCQkJY3RybDIgfD0gUEhZX0JfMTAwMENfUkQ7Ci0JCQlpZiAoc2tnZS0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQotCQkJCWN0cmwyIHw9IFBIWV9CXzEwMDBDX0FIRDsKLQkJCWlmIChza2dlLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCi0JCQkJY3RybDIgfD0gUEhZX0JfMTAwMENfQUZEOwotCi0JCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLwotCQkJc3dpdGNoIChza2dlLT5mbG93X2NvbnRyb2wpIHsKLQkJCWNhc2UgRkxPV19NT0RFX05PTkU6Ci0JCQkJY3RybDMgfD0gUEhZX0JfUF9OT19QQVVTRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX0xPQ19TRU5EOgotCQkJCWN0cmwzIHw9IFBIWV9CX1BfQVNZTV9NRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1NZTU1FVFJJQzoKLQkJCQljdHJsMyB8PSBQSFlfQl9QX1NZTV9NRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1JFTV9TRU5EOgotCQkJCWN0cmwzIHw9IFBIWV9CX1BfQk9USF9NRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogUmVzdGFydCBBdXRvLW5lZ290aWF0aW9uICovCi0JCQljdHJsMSB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKLQkJfSBlbHNlIHsKLQkJCWlmIChza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCi0JCQkJY3RybDEgfD0gUEhZX0NUX0RVUF9NRDsKLQotCQkJY3RybDIgfD0gUEhZX0JfMTAwMENfTVNFOwkvKiBzZXQgaXQgdG8gU2xhdmUgKi8KLQkJfQotCi0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV8xMDAwVF9DVFJMLCBjdHJsMik7Ci0JCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9BVU5FX0FEViwgY3RybDMpOwotCi0JCWlmIChza2dlLT5uZXRkZXYtPm10dSA+IEVUSF9EQVRBX0xFTikgewotCQkJY3RybDQgfD0gUEhZX0JfUEVDX0hJR0hfTEE7Ci0JCQljdHJsNSB8PSBQSFlfQl9BQ19MT05HX1BBQ0s7Ci0KLQkJCXNrZ2VfeG1fcGh5X3dyaXRlKGh3LCBwb3J0LFBIWV9CQ09NX0FVWF9DVFJMLCBjdHJsNSk7Ci0JCX0KLQotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fUF9FWFRfQ1RSTCwgY3RybDQpOwotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQ1RSTCwgY3RybDEpOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmh3LT5waHlfbG9jayk7Ci0KLQkvKiBDbGVhciBNSUIgY291bnRlcnMgKi8KLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX1NUQVRfQ01ELAotCQkJWE1fU0NfQ0xSX1JYQyB8IFhNX1NDX0NMUl9UWEMpOwotCS8qIENsZWFyIHR3byB0aW1lcyBhY2NvcmRpbmcgdG8gRXJyYXRhICMzICovCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9TVEFUX0NNRCwKLQkJCVhNX1NDX0NMUl9SWEMgfCBYTV9TQ19DTFJfVFhDKTsKLQotCS8qIFN0YXJ0IHBvbGxpbmcgZm9yIGxpbmsgc3RhdHVzICovCi0JbW9kX3RpbWVyKCZza2dlLT5saW5rX2NoZWNrLCBqaWZmaWVzICsgTElOS19QT0xMX0haKTsKIH0KIAogc3RhdGljIHZvaWQgZ2VuZXNpc19zdG9wKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCiB7CiAJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CiAJaW50IHBvcnQgPSBza2dlLT5wb3J0OworCXUzMiByZWc7CiAKIAkvKiBDbGVhciBUeCBwYWNrZXQgYXJiaXRlciB0aW1lb3V0IElSUSAqLwogCXNrZ2Vfd3JpdGUxNihodywgQjNfUEFfQ1RSTCwKQEAgLTEzMDQsMzMgKzEzNDAsMzAgQEAKIAkgKiBJZiB0aGUgdHJhbnNmZXIgc3R1Y2tzIGF0IHRoZSBNQUMgdGhlIFNUT1AgY29tbWFuZCB3aWxsIG5vdAogCSAqIHRlcm1pbmF0ZSBpZiB3ZSBkb24ndCBmbHVzaCB0aGUgWE1BQydzIHRyYW5zbWl0IEZJRk8gIQogCSAqLwotCXNrZ2VfeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwKLQkJCXNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKXxYTV9NRF9GVEYpOworCXhtX3dyaXRlMzIoaHcsIHBvcnQsIFhNX01PREUsCisJCQl4bV9yZWFkMzIoaHcsIHBvcnQsIFhNX01PREUpfFhNX01EX0ZURik7CiAKIAogCS8qIFJlc2V0IHRoZSBNQUMgKi8KLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX01GRl9DVFJMMSksIE1GRl9TRVRfTUFDX1JTVCk7CisJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwgTUZGX1NFVF9NQUNfUlNUKTsKIAogCS8qIEZvciBleHRlcm5hbCBQSFlzIHRoZXJlIG11c3QgYmUgc3BlY2lhbCBoYW5kbGluZyAqLwotCWlmIChody0+cGh5X3R5cGUgIT0gU0tfUEhZX1hNQUMpIHsKLQkJdTMyIHJlZyA9IHNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7Ci0KLQkJaWYgKHBvcnQgPT0gMCkgewotCQkJcmVnIHw9IEdQX0RJUl8wOwotCQkJcmVnICY9IH5HUF9JT18wOwotCQl9IGVsc2UgewotCQkJcmVnIHw9IEdQX0RJUl8yOwotCQkJcmVnICY9IH5HUF9JT18yOwotCQl9Ci0JCXNrZ2Vfd3JpdGUzMihodywgQjJfR1BfSU8sIHJlZyk7Ci0JCXNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7CisJcmVnID0gc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKTsKKwlpZiAocG9ydCA9PSAwKSB7CisJCXJlZyB8PSBHUF9ESVJfMDsKKwkJcmVnICY9IH5HUF9JT18wOworCX0gZWxzZSB7CisJCXJlZyB8PSBHUF9ESVJfMjsKKwkJcmVnICY9IH5HUF9JT18yOwogCX0KKwlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLCByZWcpOworCXNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTyk7CiAKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsCi0JCQlza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NTVVfQ01ELAorCQkJeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKQogCQkJJiB+KFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKSk7CiAKLQlza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7CisJeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKIH0KIAogCkBAIC0xMzQxLDExICsxMzc0LDExIEBACiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCi0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LAorCXhtX3dyaXRlMTYoaHcsIHBvcnQsCiAJCQlYTV9TVEFUX0NNRCwgWE1fU0NfU05QX1RYQyB8IFhNX1NDX1NOUF9SWEMpOwogCiAJLyogd2FpdCBmb3IgdXBkYXRlIHRvIGNvbXBsZXRlICovCi0Jd2hpbGUgKHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9TVEFUX0NNRCkKKwl3aGlsZSAoeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9TVEFUX0NNRCkKIAkgICAgICAgJiAoWE1fU0NfU05QX1RYQyB8IFhNX1NDX1NOUF9SWEMpKSB7CiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQogCQkJYnJlYWs7CkBAIC0xMzUzLDY4ICsxMzg2LDYwIEBACiAJfQogCiAJLyogc3BlY2lhbCBjYXNlIGZvciA2NCBiaXQgb2N0ZXQgY291bnRlciAqLwotCWRhdGFbMF0gPSAodTY0KSBza2dlX3htX3JlYWQzMihodywgcG9ydCwgWE1fVFhPX09LX0hJKSA8PCAzMgotCQl8IHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9UWE9fT0tfTE8pOwotCWRhdGFbMV0gPSAodTY0KSBza2dlX3htX3JlYWQzMihodywgcG9ydCwgWE1fUlhPX09LX0hJKSA8PCAzMgotCQl8IHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9SWE9fT0tfTE8pOworCWRhdGFbMF0gPSAodTY0KSB4bV9yZWFkMzIoaHcsIHBvcnQsIFhNX1RYT19PS19ISSkgPDwgMzIKKwkJfCB4bV9yZWFkMzIoaHcsIHBvcnQsIFhNX1RYT19PS19MTyk7CisJZGF0YVsxXSA9ICh1NjQpIHhtX3JlYWQzMihodywgcG9ydCwgWE1fUlhPX09LX0hJKSA8PCAzMgorCQl8IHhtX3JlYWQzMihodywgcG9ydCwgWE1fUlhPX09LX0xPKTsKIAogCWZvciAoaSA9IDI7IGkgPCBBUlJBWV9TSVpFKHNrZ2Vfc3RhdHMpOyBpKyspCi0JCWRhdGFbaV0gPSBza2dlX3htX3JlYWQzMihodywgcG9ydCwgc2tnZV9zdGF0c1tpXS54bWFjX29mZnNldCk7CisJCWRhdGFbaV0gPSB4bV9yZWFkMzIoaHcsIHBvcnQsIHNrZ2Vfc3RhdHNbaV0ueG1hY19vZmZzZXQpOwogfQogCiBzdGF0aWMgdm9pZCBnZW5lc2lzX21hY19pbnRyKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7CiAJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGh3LT5kZXZbcG9ydF0pOwotCXUxNiBzdGF0dXMgPSBza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQyk7CisJdTE2IHN0YXR1cyA9IHhtX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQyk7CiAKLQlwcl9kZWJ1ZygiZ2VuZXNpc19pbnRyIHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKLQlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9YTUFDKSB7Ci0JCS8qIExJbmsgZG93biwgc3RhcnQgcG9sbGluZyBmb3Igc3RhdGUgY2hhbmdlICovCi0JCWlmIChzdGF0dXMgJiBYTV9JU19JTlBfQVNTKSB7Ci0JCQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX0lNU0ssCi0JCQkJCXNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9JTVNLKSB8IFhNX0lTX0lOUF9BU1MpOwotCQkJbW9kX3RpbWVyKCZza2dlLT5saW5rX2NoZWNrLCBqaWZmaWVzICsgTElOS19QT0xMX0haKTsKLQkJfQotCQllbHNlIGlmIChzdGF0dXMgJiBYTV9JU19BTkQpCi0JCQltb2RfdGltZXIoJnNrZ2UtPmxpbmtfY2hlY2ssIGppZmZpZXMgKyBMSU5LX1BPTExfSFopOwotCX0KKwlpZiAobmV0aWZfbXNnX2ludHIoc2tnZSkpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IG1hYyBpbnRlcnJ1cHQgc3RhdHVzIDB4JXhcbiIsCisJCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUsIHN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzICYgWE1fSVNfVFhGX1VSKSB7Ci0JCXNrZ2VfeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgWE1fTURfRlRGKTsKKwkJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgWE1fTURfRlRGKTsKIAkJKytza2dlLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnM7CiAJfQogCWlmIChzdGF0dXMgJiBYTV9JU19SWEZfT1YpIHsKLQkJc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBYTV9NRF9GUkYpOworCQl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBYTV9NRF9GUkYpOwogCQkrK3NrZ2UtPm5ldF9zdGF0cy5yeF9maWZvX2Vycm9yczsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNrZ2VfZ21fcGh5X3dyaXRlKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcsIHUxNiB2YWwpCitzdGF0aWMgdm9pZCBnbV9waHlfd3JpdGUoc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCkKIHsKIAlpbnQgaTsKIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NNSV9EQVRBLCB2YWwpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NNSV9DVFJMLAorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfREFUQSwgdmFsKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fU01JX0NUUkwsCiAJCQkgR01fU01JX0NUX1BIWV9BRChody0+cGh5X2FkZHIpIHwgR01fU01JX0NUX1JFR19BRChyZWcpKTsKIAlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFVFJJRVM7IGkrKykgewogCQl1ZGVsYXkoMSk7CiAKLQkJaWYgKCEoc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCkgJiBHTV9TTUlfQ1RfQlVTWSkpCisJCWlmICghKGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1NNSV9DVFJMKSAmIEdNX1NNSV9DVF9CVVNZKSkKIAkJCWJyZWFrOwogCX0KIH0KIAotc3RhdGljIHUxNiBza2dlX2dtX3BoeV9yZWFkKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcpCitzdGF0aWMgdTE2IGdtX3BoeV9yZWFkKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIHUxNiByZWcpCiB7CiAJaW50IGk7CiAKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCwKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fU01JX0NUUkwsCiAJCQkgR01fU01JX0NUX1BIWV9BRChody0+cGh5X2FkZHIpCiAJCQkgfCBHTV9TTUlfQ1RfUkVHX0FEKHJlZykgfCBHTV9TTUlfQ1RfT1BfUkQpOwogCiAJZm9yIChpID0gMDsgaSA8IFBIWV9SRVRSSUVTOyBpKyspIHsKIAkJdWRlbGF5KDEpOwotCQlpZiAoc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9TTUlfQ1RSTCkgJiBHTV9TTUlfQ1RfUkRfVkFMKQorCQlpZiAoZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0NUUkwpICYgR01fU01JX0NUX1JEX1ZBTCkKIAkJCWdvdG8gcmVhZHk7CiAJfQogCkBAIC0xNDIyLDI0ICsxNDQ3LDcgQEAKIAkgICAgICAgaHctPmRldltwb3J0XS0+bmFtZSk7CiAJcmV0dXJuIDA7CiAgcmVhZHk6Ci0JcmV0dXJuIHNrZ2VfZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0RBVEEpOwotfQotCi1zdGF0aWMgdm9pZCBnZW5lc2lzX2xpbmtfZG93bihzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlKQotewotCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwotCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKLQotCXByX2RlYnVnKCJnZW5lc2lzX2xpbmtfZG93blxuIik7Ci0KLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsCi0JCQlza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCkKLQkJCSYgfihYTV9NTVVfRU5BX1JYIHwgWE1fTU1VX0VOQV9UWCkpOwotCi0JLyogZHVtbXkgcmVhZCB0byBlbnN1cmUgd3JpdGluZyAqLwotCSh2b2lkKSBza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7Ci0KLQlza2dlX2xpbmtfZG93bihza2dlKTsKKwlyZXR1cm4gZ21hX3JlYWQxNihodywgcG9ydCwgR01fU01JX0RBVEEpOwogfQogCiBzdGF0aWMgdm9pZCBnZW5lc2lzX2xpbmtfdXAoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKQEAgLTE0NTAsNyArMTQ1OCw3IEBACiAJdTMyIG1vZGUsIG1zazsKIAogCXByX2RlYnVnKCJnZW5lc2lzX2xpbmtfdXBcbiIpOwotCWNtZCA9IHNrZ2VfeG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwljbWQgPSB4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQpOwogCiAJLyoKIAkgKiBlbmFibGluZyBwYXVzZSBmcmFtZSByZWNlcHRpb24gaXMgcmVxdWlyZWQgZm9yIDEwMDBCVApAQCAtMTQ1OCwxNCArMTQ2NiwxNSBAQAogCSAqLwogCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX05PTkUgfHwKIAkgICAgc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9MT0NfU0VORCkKKwkJLyogRGlzYWJsZSBQYXVzZSBGcmFtZSBSZWNlcHRpb24gKi8KIAkJY21kIHw9IFhNX01NVV9JR05fUEY7CiAJZWxzZQogCQkvKiBFbmFibGUgUGF1c2UgRnJhbWUgUmVjZXB0aW9uICovCiAJCWNtZCAmPSB+WE1fTU1VX0lHTl9QRjsKIAotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwgY21kKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCBYTV9NTVVfQ01ELCBjbWQpOwogCi0JbW9kZSA9IHNrZ2VfeG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKKwltb2RlID0geG1fcmVhZDMyKGh3LCBwb3J0LCBYTV9NT0RFKTsKIAlpZiAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9TWU1NRVRSSUMgfHwKIAkgICAgc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9MT0NfU0VORCkgewogCQkvKgpAQCAtMTQ3OSwxMCArMTQ4OCwxMCBAQAogCQkvKiBYTV9QQVVTRV9EQSA9ICcwMTAwMDBDMjgwMDEnIChkZWZhdWx0KSAqLwogCQkvKiBYTV9NQUNfUFRJTUUgPSAweGZmZmYgKG1heGltdW0pICovCiAJCS8qIHJlbWVtYmVyIHRoaXMgdmFsdWUgaXMgZGVmaW5lZCBpbiBiaWcgZW5kaWFuICghKSAqLwotCQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01BQ19QVElNRSwgMHhmZmZmKTsKKwkJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTUFDX1BUSU1FLCAweGZmZmYpOwogCiAJCW1vZGUgfD0gWE1fUEFVU0VfTU9ERTsKLQkJc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRU5BX1BBVVNFKTsKKwkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0VOQV9QQVVTRSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogZGlzYWJsZSBwYXVzZSBmcmFtZSBnZW5lcmF0aW9uIGlzIHJlcXVpcmVkIGZvciAxMDAwQlQKQEAgLTE0OTEsMTI1ICsxNTAwLDY4IEBACiAJCS8qIERpc2FibGUgUGF1c2UgTW9kZSBpbiBNb2RlIFJlZ2lzdGVyICovCiAJCW1vZGUgJj0gflhNX1BBVVNFX01PREU7CiAKLQkJc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9NRkZfQ1RSTDEpLCBNRkZfRElTX1BBVVNFKTsKKwkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgUlhfTUZGX0NUUkwxKSwgTUZGX0RJU19QQVVTRSk7CiAJfQogCi0Jc2tnZV94bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBtb2RlKTsKKwl4bV93cml0ZTMyKGh3LCBwb3J0LCBYTV9NT0RFLCBtb2RlKTsKIAogCW1zayA9IFhNX0RFRl9NU0s7Ci0JaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQykKLQkJbXNrIHw9IFhNX0lTX0lOUF9BU1M7CS8qIGRpc2FibGUgR1AwIGludGVycnVwdCBiaXQgKi8KKwkvKiBkaXNhYmxlIEdQMCBpbnRlcnJ1cHQgYml0IGZvciBleHRlcm5hbCBQaHkgKi8KKwltc2sgfD0gWE1fSVNfSU5QX0FTUzsKIAotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSU1TSywgbXNrKTsKLQlza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQyk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fSU1TSywgbXNrKTsKKwl4bV9yZWFkMTYoaHcsIHBvcnQsIFhNX0lTUkMpOwogCiAJLyogZ2V0IE1NVSBDb21tYW5kIFJlZy4gKi8KLQljbWQgPSBza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fTU1VX0NNRCk7Ci0JaWYgKGh3LT5waHlfdHlwZSAhPSBTS19QSFlfWE1BQyAmJiBza2dlLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJY21kID0geG1fcmVhZDE2KGh3LCBwb3J0LCBYTV9NTVVfQ01EKTsKKwlpZiAoc2tnZS0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQogCQljbWQgfD0gWE1fTU1VX0dNSUlfRkQ7CiAKLQlpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9CQ09NKSB7Ci0JCS8qCi0JCSAqIFdvcmthcm91bmQgQkNPTSBFcnJhdGEgKCMxMDUyMykgZm9yIGFsbCBCQ29tIFBoeXMKLQkJICogRW5hYmxlIFBvd2VyIE1hbmFnZW1lbnQgYWZ0ZXIgbGluayB1cAotCQkgKi8KLQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMLAotCQkJCSAgc2tnZV94bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwpCi0JCQkJICAmIH5QSFlfQl9BQ19ESVNfUE0pOwotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fSU5UX01BU0ssCi0JCQkJICBQSFlfQl9ERUZfTVNLKTsKLQl9CisJLyoKKwkgKiBXb3JrYXJvdW5kIEJDT00gRXJyYXRhICgjMTA1MjMpIGZvciBhbGwgQkNvbSBQaHlzCisJICogRW5hYmxlIFBvd2VyIE1hbmFnZW1lbnQgYWZ0ZXIgbGluayB1cAorCSAqLworCXhtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQVVYX0NUUkwsCisJCSAgICAgeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9DVFJMKQorCQkgICAgICYgflBIWV9CX0FDX0RJU19QTSk7CisJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9JTlRfTUFTSywgUEhZX0JfREVGX01TSyk7CiAKIAkvKiBlbmFibGUgUngvVHggKi8KLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIFhNX01NVV9DTUQsCisJeG1fd3JpdGUxNihodywgcG9ydCwgWE1fTU1VX0NNRCwKIAkJCWNtZCB8IFhNX01NVV9FTkFfUlggfCBYTV9NTVVfRU5BX1RYKTsKIAlza2dlX2xpbmtfdXAoc2tnZSk7CiB9CiAKIAotc3RhdGljIHZvaWQgZ2VuZXNpc19iY29tX2ludHIoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY29tX3BoeV9pbnRyKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCiB7CiAJc3RydWN0IHNrZ2VfaHcgKmh3ID0gc2tnZS0+aHc7CiAJaW50IHBvcnQgPSBza2dlLT5wb3J0OwotCXUxNiBzdGF0ID0gc2tnZV94bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fSU5UX1NUQVQpOworCXUxNiBpc3JjOwogCi0JcHJfZGVidWcoImdlbmVzaXNfYmNvbSBpbnRyIHN0YXQ9JXhcbiIsIHN0YXQpOworCWlzcmMgPSB4bV9waHlfcmVhZChodywgcG9ydCwgUEhZX0JDT01fSU5UX1NUQVQpOworCWlmIChuZXRpZl9tc2dfaW50cihza2dlKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlczogcGh5IGludGVycnVwdCBzdGF0dXMgMHgleFxuIiwKKwkJICAgICAgIHNrZ2UtPm5ldGRldi0+bmFtZSwgaXNyYyk7CisKKwlpZiAoaXNyYyAmIFBIWV9CX0lTX1BTRSkKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IHVuY29ycmVjdGFibGUgcGFpciBzd2FwIGVycm9yXG4iLAorCQkgICAgICAgaHctPmRldltwb3J0XS0+bmFtZSk7CiAKIAkvKiBXb3JrYXJvdW5kIEJDb20gRXJyYXRhOgogCSAqCWVuYWJsZSBhbmQgZGlzYWJsZSBsb29wYmFjayBtb2RlIGlmICJOTyBIQ0QiIG9jY3Vycy4KIAkgKi8KLQlpZiAoc3RhdCAmIFBIWV9CX0lTX05PX0hEQ0wpIHsKLQkJdTE2IGN0cmwgPSBza2dlX3htX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMKTsKLQkJc2tnZV94bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0NUUkwsCisJaWYgKGlzcmMgJiBQSFlfQl9JU19OT19IRENMKSB7CisJCXUxNiBjdHJsID0geG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0NUUkwpOworCQl4bV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9CQ09NX0NUUkwsCiAJCQkJICBjdHJsIHwgUEhZX0NUX0xPT1ApOwotCQlza2dlX3htX3BoeV93cml0ZShodywgcG9ydCwgUEhZX0JDT01fQ1RSTCwKKwkJeG1fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfQkNPTV9DVFJMLAogCQkJCSAgY3RybCAmIH5QSFlfQ1RfTE9PUCk7CiAJfQogCi0Jc3RhdCA9IHNrZ2VfeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX1NUQVQpOwotCWlmIChzdGF0ICYgKFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpIHsKLQkJdTE2IGF1eCA9IHNrZ2VfeG1fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9CQ09NX0FVWF9TVEFUKTsKLQkJaWYgKCAhKGF1eCAmIFBIWV9CX0FTX0xTKSAmJiBuZXRpZl9jYXJyaWVyX29rKHNrZ2UtPm5ldGRldikpCi0JCQlnZW5lc2lzX2xpbmtfZG93bihza2dlKTsKKwlpZiAoaXNyYyAmIChQSFlfQl9JU19BTl9QUiB8IFBIWV9CX0lTX0xTVF9DSEFOR0UpKQorCQliY29tX2NoZWNrX2xpbmsoaHcsIHBvcnQpOwogCi0JCWVsc2UgaWYgKHN0YXQgJiBQSFlfQl9JU19MU1RfQ0hBTkdFKSB7Ci0JCQlpZiAoYXV4ICYgUEhZX0JfQVNfQU5fQykgewotCQkJCXN3aXRjaCAoYXV4ICYgUEhZX0JfQVNfQU5fUkVTX01TSykgewotCQkJCWNhc2UgUEhZX0JfUkVTXzEwMDBGRDoKLQkJCQkJc2tnZS0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUEhZX0JfUkVTXzEwMDBIRDoKLQkJCQkJc2tnZS0+ZHVwbGV4ID0gRFVQTEVYX0hBTEY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCXN3aXRjaCAoYXV4ICYgUEhZX0JfQVNfUEFVU0VfTVNLKSB7Ci0JCQkJY2FzZSBQSFlfQl9BU19QQVVTRV9NU0s6Ci0JCQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUEhZX0JfQVNfUFJSOgotCQkJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfUkVNX1NFTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUEhZX0JfQVNfUFJUOgotCQkJCQlza2dlLT5mbG93X2NvbnRyb2wgPSBGTE9XX01PREVfTE9DX1NFTkQ7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9OT05FOwotCQkJCX0KLQkJCQlza2dlLT5zcGVlZCA9IFNQRUVEXzEwMDA7Ci0JCQl9Ci0JCQlnZW5lc2lzX2xpbmtfdXAoc2tnZSk7Ci0JCX0KLQkJZWxzZQotCQkJbW9kX3RpbWVyKCZza2dlLT5saW5rX2NoZWNrLCBqaWZmaWVzICsgTElOS19QT0xMX0haKTsKLQl9Ci19Ci0KLS8qIFBlcm9kaWMgcG9sbCBvZiBwaHkgc3RhdHVzIHRvIGNoZWNrIGZvciBsaW5rIHRyYW5zaXN0aW9uICAqLwotc3RhdGljIHZvaWQgc2tnZV9saW5rX3RpbWVyKHVuc2lnbmVkIGxvbmcgX19hcmcpCi17Ci0Jc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IChzdHJ1Y3Qgc2tnZV9wb3J0ICopIF9fYXJnOwotCXN0cnVjdCBza2dlX2h3ICpodyA9IHNrZ2UtPmh3OwotCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKLQotCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX0dFTkVTSVMgfHwgIW5ldGlmX3J1bm5pbmcoc2tnZS0+bmV0ZGV2KSkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2JoKCZody0+cGh5X2xvY2spOwotCWlmIChody0+cGh5X3R5cGUgPT0gU0tfUEhZX0JDT00pCi0JCWdlbmVzaXNfYmNvbV9pbnRyKHNrZ2UpOwotCWVsc2UgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCWlmIChza2dlX3htX3JlYWQxNihodywgcG9ydCwgWE1fSVNSQykgJiBYTV9JU19JTlBfQVNTKQotCQkJCWJyZWFrOwotCi0JCWlmIChpID09IDMpCi0JCQltb2RfdGltZXIoJnNrZ2UtPmxpbmtfY2hlY2ssIGppZmZpZXMgKyBMSU5LX1BPTExfSFopOwotCQllbHNlCi0JCQlnZW5lc2lzX2xpbmtfdXAoc2tnZSk7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZody0+cGh5X2xvY2spOwogfQogCiAvKiBNYXJ2ZWxsIFBoeSBJbml0YWlsaXphdGlvbiAqLwpAQCAtMTYyMSwzMSArMTU3MywyNyBAQAogCiAJcHJfZGVidWcoInl1a29uX2luaXRcbiIpOwogCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7Ci0JCXUxNiBlY3RybCA9IHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMKTsKKwkJdTE2IGVjdHJsID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0VYVF9DVFJMKTsKIAogCQllY3RybCAmPSB+KFBIWV9NX0VDX01fRFNDX01TSyB8IFBIWV9NX0VDX1NfRFNDX01TSyB8CiAJCQkgIFBIWV9NX0VDX01BQ19TX01TSyk7CiAJCWVjdHJsIHw9IFBIWV9NX0VDX01BQ19TKE1BQ19UWF9DTEtfMjVfTUhaKTsKIAotCQkvKiBvbiBQSFkgODhFMTExMSB0aGVyZSBpcyBhIGNoYW5nZSBmb3IgZG93bnNoaWZ0IGNvbnRyb2wgKi8KLQkJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRUMpCi0JCQllY3RybCB8PSBQSFlfTV9FQ19NX0RTQ18yKDApIHwgUEhZX01fRUNfRE9XTl9TX0VOQTsKLQkJZWxzZQotCQkJZWN0cmwgfD0gUEhZX01fRUNfTV9EU0MoMCkgfCBQSFlfTV9FQ19TX0RTQygxKTsKKwkJZWN0cmwgfD0gUEhZX01fRUNfTV9EU0MoMCkgfCBQSFlfTV9FQ19TX0RTQygxKTsKIAotCQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfRVhUX0NUUkwsIGVjdHJsKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9FWFRfQ1RSTCwgZWN0cmwpOwogCX0KIAotCWN0cmwgPSBza2dlX2dtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMKTsKKwljdHJsID0gZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwpOwogCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkKIAkJY3RybCAmPSB+UEhZX0NUX0FORTsKIAogCWN0cmwgfD0gUEhZX0NUX1JFU0VUOwotCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0NUUkwsIGN0cmwpOwogCiAJY3RybCA9IDA7CiAJY3QxMDAwID0gMDsKLQlhZHYgPSBQSFlfU0VMX1RZUEU7CisJYWR2ID0gUEhZX0FOX0NTTUE7CiAKIAlpZiAoc2tnZS0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQlpZiAoaXNjb3BwZXIoaHcpKSB7CkBAIC0xNjYxLDQxICsxNjA5LDEyIEBACiAJCQkJYWR2IHw9IFBIWV9NX0FOXzEwX0ZEOwogCQkJaWYgKHNrZ2UtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCiAJCQkJYWR2IHw9IFBIWV9NX0FOXzEwX0hEOwotCi0JCQkvKiBTZXQgRmxvdy1jb250cm9sIGNhcGFiaWxpdGllcyAqLwotCQkJc3dpdGNoIChza2dlLT5mbG93X2NvbnRyb2wpIHsKLQkJCWNhc2UgRkxPV19NT0RFX05PTkU6Ci0JCQkJYWR2IHw9IFBIWV9CX1BfTk9fUEFVU0U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZMT1dfTU9ERV9MT0NfU0VORDoKLQkJCQlhZHYgfD0gUEhZX0JfUF9BU1lNX01EOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGTE9XX01PREVfU1lNTUVUUklDOgotCQkJCWFkdiB8PSBQSFlfQl9QX1NZTV9NRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgRkxPV19NT0RFX1JFTV9TRU5EOgotCQkJCWFkdiB8PSBQSFlfQl9QX0JPVEhfTUQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7CS8qIHNwZWNpYWwgZGVmaW5lcyBmb3IgRklCRVIgKDg4RTEwMTFTIG9ubHkpICovCisJCX0gZWxzZQkvKiBzcGVjaWFsIGRlZmluZXMgZm9yIEZJQkVSICg4OEUxMDExUyBvbmx5KSAqLwogCQkJYWR2IHw9IFBIWV9NX0FOXzEwMDBYX0FIRCB8IFBIWV9NX0FOXzEwMDBYX0FGRDsKIAotCQkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KLQkJCXN3aXRjaCAoc2tnZS0+Zmxvd19jb250cm9sKSB7Ci0JCQljYXNlIEZMT1dfTU9ERV9OT05FOgotCQkJCWFkdiB8PSBQSFlfTV9QX05PX1BBVVNFX1g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZMT1dfTU9ERV9MT0NfU0VORDoKLQkJCQlhZHYgfD0gUEhZX01fUF9BU1lNX01EX1g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZMT1dfTU9ERV9TWU1NRVRSSUM6Ci0JCQkJYWR2IHw9IFBIWV9NX1BfU1lNX01EX1g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEZMT1dfTU9ERV9SRU1fU0VORDoKLQkJCQlhZHYgfD0gUEhZX01fUF9CT1RIX01EX1g7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJLyogU2V0IEZsb3ctY29udHJvbCBjYXBhYmlsaXRpZXMgKi8KKwkJYWR2IHw9IHBoeV9wYXVzZV9tYXBbc2tnZS0+Zmxvd19jb250cm9sXTsKKwogCQkvKiBSZXN0YXJ0IEF1dG8tbmVnb3RpYXRpb24gKi8KIAkJY3RybCB8PSBQSFlfQ1RfQU5FIHwgUEhZX0NUX1JFX0NGRzsKIAl9IGVsc2UgewpAQCAtMTcxNywzNiArMTYzNiwyMyBAQAogCQljdHJsIHw9IFBIWV9DVF9SRVNFVDsKIAl9CiAKLQlpZiAoaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9ZVUtPTl9GRSkKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWXzEwMDBUX0NUUkwsIGN0MTAwMCk7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl8xMDAwVF9DVFJMLCBjdDEwMDApOwogCi0Jc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLCBhZHYpOwotCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9DVFJMLCBjdHJsKTsKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0FVTkVfQURWLCBhZHYpOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQ1RSTCwgY3RybCk7CiAKIAkvKiBTZXR1cCBQaHkgTEVEJ3MgKi8KIAlsZWRjdHJsID0gUEhZX01fTEVEX1BVTFNfRFVSKFBVTFNfMTcwTVMpOwogCWxlZG92ZXIgPSAwOwogCi0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkUpIHsKLQkJLyogb24gODhFMzA4MiB0aGVzZSBiaXRzIGFyZSBhdCAxMS4uOSAoc2hpZnRlZCBsZWZ0KSAqLwotCQlsZWRjdHJsIHw9IFBIWV9NX0xFRF9CTElOS19SVChCTElOS184NE1TKSA8PCAxOworCWxlZGN0cmwgfD0gUEhZX01fTEVEX0JMSU5LX1JUKEJMSU5LXzg0TVMpIHwgUEhZX01fTEVEQ19UWF9DVFJMOwogCi0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9GRV9MRURfUEFSLAotCQkJCSAgKChza2dlX2dtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9GRV9MRURfUEFSKQotCi0JCQkJICAgICYgflBIWV9NX0ZFTFBfTEVEMV9NU0spCi0JCQkJICAgfCBQSFlfTV9GRUxQX0xFRDFfQ1RSTChMRURfUEFSX0NUUkxfQUNUX0JMKSkpOwotCX0gZWxzZSB7Ci0JCS8qIHNldCBUeCBMRUQgKExFRF9UWCkgdG8gYmxpbmsgbW9kZSBvbiBSeCBPUiBUeCBhY3Rpdml0eSAqLwotCQlsZWRjdHJsIHw9IFBIWV9NX0xFRF9CTElOS19SVChCTElOS184NE1TKSB8IFBIWV9NX0xFRENfVFhfQ1RSTDsKLQotCQkvKiB0dXJuIG9mZiB0aGUgUnggTEVEIChMRURfUlgpICovCi0JCWxlZG92ZXIgfD0gUEhZX01fTEVEX01PX1JYKE1PX0xFRF9PRkYpOwotCX0KKwkvKiB0dXJuIG9mZiB0aGUgUnggTEVEIChMRURfUlgpICovCisJbGVkb3ZlciB8PSBQSFlfTV9MRURfTU9fUlgoTU9fTEVEX09GRik7CiAKIAkvKiBkaXNhYmxlIGJsaW5rIG1vZGUgKExFRF9EVVBMRVgpIG9uIGNvbGxpc2lvbnMgKi8KIAljdHJsIHw9IFBIWV9NX0xFRENfRFBfQ1RSTDsKLQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsIGxlZGN0cmwpOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX0NUUkwsIGxlZGN0cmwpOwogCiAJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFIHx8IHNrZ2UtPnNwZWVkID09IFNQRUVEXzEwMCkgewogCQkvKiB0dXJuIG9uIDEwMCBNYnBzIExFRCAoTEVEX0xJTksxMDApICovCkBAIC0xNzU0LDI1ICsxNjYwLDI1IEBACiAJfQogCiAJaWYgKGxlZG92ZXIpCi0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9MRURfT1ZFUiwgbGVkb3Zlcik7CisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfTEVEX09WRVIsIGxlZG92ZXIpOwogCiAJLyogRW5hYmxlIHBoeSBpbnRlcnJ1cHQgb24gYXV0b25lZ290aWF0aW9uIGNvbXBsZXRlIChvciBsaW5rIHVwKSAqLwogCWlmIChza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQotCQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIFBIWV9NX0lTX0FOX0NPTVBMKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fSVNfQU5fQ09NUEwpOwogCWVsc2UKLQkJc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCBQSFlfTV9ERUZfTVNLKTsKKwkJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgUEhZX01fREVGX01TSyk7CiB9CiAKIHN0YXRpYyB2b2lkIHl1a29uX3Jlc2V0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7Ci0Jc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsvKiBkaXNhYmxlIFBIWSBJUlFzICovCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9IMSwgMCk7CS8qIGNsZWFyIE1DIGhhc2ggKi8KLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gyLCAwKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gzLCAwKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0g0LCAwKTsKKwlnbV9waHlfd3JpdGUoaHcsIHBvcnQsIFBIWV9NQVJWX0lOVF9NQVNLLCAwKTsvKiBkaXNhYmxlIFBIWSBJUlFzICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDEsIDApOwkvKiBjbGVhciBNQyBoYXNoICovCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX01DX0FERFJfSDIsIDApOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gzLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fTUNfQUREUl9INCwgMCk7CiAKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMLAotCQkJIHNrZ2VfZ21hX3JlYWQxNihodywgcG9ydCwgR01fUlhfQ1RSTCkKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUlhfQ1RSTCwKKwkJCSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMKQogCQkJIHwgR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9NQ0ZfRU5BKTsKIH0KIApAQCAtMTc4NSwxNyArMTY5MSwxNyBAQAogCiAJLyogV0EgY29kZSBmb3IgQ09NQSBtb2RlIC0tIHNldCBQSFkgcmVzZXQgKi8KIAlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9MSVRFICYmCi0JICAgIGNoaXBfcmV2KGh3KSA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKQorCSAgICBody0+Y2hpcF9yZXYgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykKIAkJc2tnZV93cml0ZTMyKGh3LCBCMl9HUF9JTywKIAkJCSAgICAgKHNrZ2VfcmVhZDMyKGh3LCBCMl9HUF9JTykgfCBHUF9ESVJfOSB8IEdQX0lPXzkpKTsKIAogCS8qIGhhcmQgcmVzZXQgKi8KLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIEdQQ19SU1RfU0VUKTsKLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19SU1RfU0VUKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCBHUENfUlNUX1NFVCk7CisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1JTVF9TRVQpOwogCiAJLyogV0EgY29kZSBmb3IgQ09NQSBtb2RlIC0tIGNsZWFyIFBIWSByZXNldCAqLwogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0xJVEUgJiYKLQkgICAgY2hpcF9yZXYoaHcpID09IENISVBfUkVWX1lVX0xJVEVfQTMpCisJICAgIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKQogCQlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLAogCQkJICAgICAoc2tnZV9yZWFkMzIoaHcsIEIyX0dQX0lPKSB8IEdQX0RJUl85KQogCQkJICAgICAmIH5HUF9JT185KTsKQEAgLTE4MDYsMTMgKzE3MTIsMTMgQEAKIAlyZWcgfD0gaXNjb3BwZXIoaHcpID8gR1BDX0hXQ0ZHX0dNSUlfQ09QIDogR1BDX0hXQ0ZHX0dNSUlfRklCOwogCiAJLyogQ2xlYXIgR01DIHJlc2V0ICovCi0Jc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCByZWcgfCBHUENfUlNUX1NFVCk7Ci0Jc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBHUEhZX0NUUkwpLCByZWcgfCBHUENfUlNUX0NMUik7Ci0Jc2tnZV93cml0ZTMyKGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT04gfCBHTUNfUlNUX0NMUik7CisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgR1BIWV9DVFJMKSwgcmVnIHwgR1BDX1JTVF9TRVQpOworCXNrZ2Vfd3JpdGUzMihodywgU0tfUkVHKHBvcnQsIEdQSFlfQ1RSTCksIHJlZyB8IEdQQ19SU1RfQ0xSKTsKKwlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT04gfCBHTUNfUlNUX0NMUik7CiAJaWYgKHNrZ2UtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CiAJCXJlZyA9IEdNX0dQQ1JfQVVfQUxMX0RJUzsKLQkJc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwKLQkJCQkgc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKSB8IHJlZyk7CisJCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLAorCQkJCSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKSB8IHJlZyk7CiAKIAkJc3dpdGNoIChza2dlLT5zcGVlZCkgewogCQljYXNlIFNQRUVEXzEwMDA6CkBAIC0xODI4LDcgKzE3MzQsNyBAQAogCQlyZWcgPSBHTV9HUENSX1NQRUVEXzEwMDAgfCBHTV9HUENSX1NQRUVEXzEwMCB8IEdNX0dQQ1JfRFVQX0ZVTEw7CiAJc3dpdGNoIChza2dlLT5mbG93X2NvbnRyb2wpIHsKIAljYXNlIEZMT1dfTU9ERV9OT05FOgotCQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdNQUNfQ1RSTCksIEdNQ19QQVVTRV9PRkYpOworCQlza2dlX3dyaXRlMzIoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKIAkJcmVnIHw9IEdNX0dQQ1JfRkNfVFhfRElTIHwgR01fR1BDUl9GQ19SWF9ESVMgfCBHTV9HUENSX0FVX0ZDVF9ESVM7CiAJCWJyZWFrOwogCWNhc2UgRkxPV19NT0RFX0xPQ19TRU5EOgpAQCAtMTgzNiw3ICsxNzQyLDcgQEAKIAkJcmVnIHw9IEdNX0dQQ1JfRkNfUlhfRElTIHwgR01fR1BDUl9BVV9GQ1RfRElTOwogCX0KIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CiAJc2tnZV9yZWFkMTYoaHcsIEdNQUNfSVJRX1NSQyk7CiAKIAlzcGluX2xvY2tfYmgoJmh3LT5waHlfbG9jayk7CkBAIC0xODQ0LDI1ICsxNzUwLDI1IEBACiAJc3Bpbl91bmxvY2tfYmgoJmh3LT5waHlfbG9jayk7CiAKIAkvKiBNSUIgY2xlYXIgKi8KLQlyZWcgPSBza2dlX2dtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9QSFlfQUREUiwgcmVnIHwgR01fUEFSX01JQl9DTFIpOworCXJlZyA9IGdtYV9yZWFkMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fUEhZX0FERFIsIHJlZyB8IEdNX1BBUl9NSUJfQ0xSKTsKIAogCWZvciAoaSA9IDA7IGkgPCBHTV9NSUJfQ05UX1NJWkU7IGkrKykKLQkJc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9NSUJfQ05UX0JBU0UgKyA4KmkpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1BIWV9BRERSLCByZWcpOworCQlnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9NSUJfQ05UX0JBU0UgKyA4KmkpOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9QSFlfQUREUiwgcmVnKTsKIAogCS8qIHRyYW5zbWl0IGNvbnRyb2wgKi8KLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9DVFJMLCBUWF9DT0xfVEhSKFRYX0NPTF9ERUYpKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfQ1RSTCwgVFhfQ09MX1RIUihUWF9DT0xfREVGKSk7CiAKIAkvKiByZWNlaXZlIGNvbnRyb2wgcmVnOiB1bmljYXN0ICsgbXVsdGljYXN0ICsgbm8gRkNTICAqLwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsCiAJCQkgR01fUlhDUl9VQ0ZfRU5BIHwgR01fUlhDUl9DUkNfRElTIHwgR01fUlhDUl9NQ0ZfRU5BKTsKIAogCS8qIHRyYW5zbWl0IGZsb3cgY29udHJvbCAqLwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RYX0ZMT1dfQ1RSTCwgMHhmZmZmKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfRkxPV19DVFJMLCAweGZmZmYpOwogCiAJLyogdHJhbnNtaXQgcGFyYW1ldGVyICovCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfUEFSQU0sCisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1RYX1BBUkFNLAogCQkJIFRYX0pBTV9MRU5fVkFMKFRYX0pBTV9MRU5fREVGKSB8CiAJCQkgVFhfSkFNX0lQR19WQUwoVFhfSkFNX0lQR19ERUYpIHwKIAkJCSBUWF9JUEdfSkFNX0RBVEEoVFhfSVBHX0pBTV9ERUYpKTsKQEAgLTE4NzIsMzMgKzE3NzgsMzMgQEAKIAlpZiAoaHctPmRldltwb3J0XS0+bXR1ID4gMTUwMCkKIAkJcmVnIHw9IEdNX1NNT0RfSlVNQk9fRU5BOwogCi0Jc2tnZV9nbWFfd3JpdGUxNihodywgcG9ydCwgR01fU0VSSUFMX01PREUsIHJlZyk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1NFUklBTF9NT0RFLCByZWcpOwogCiAJLyogcGh5c2ljYWwgYWRkcmVzczogdXNlZCBmb3IgcGF1c2UgZnJhbWVzICovCi0Jc2tnZV9nbV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMUwsIGFkZHIpOworCWdtYV9zZXRfYWRkcihodywgcG9ydCwgR01fU1JDX0FERFJfMUwsIGFkZHIpOwogCS8qIHZpcnR1YWwgYWRkcmVzcyBmb3IgZGF0YSAqLwotCXNrZ2VfZ21fc2V0X2FkZHIoaHcsIHBvcnQsIEdNX1NSQ19BRERSXzJMLCBhZGRyKTsKKwlnbWFfc2V0X2FkZHIoaHcsIHBvcnQsIEdNX1NSQ19BRERSXzJMLCBhZGRyKTsKIAogCS8qIGVuYWJsZSBpbnRlcnJ1cHQgbWFzayBmb3IgY291bnRlciBvdmVyZmxvd3MgKi8KLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UWF9JUlFfTVNLLCAwKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9SWF9JUlFfTVNLLCAwKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UUl9JUlFfTVNLLCAwKTsKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fVFhfSVJRX01TSywgMCk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0lSUV9NU0ssIDApOworCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9UUl9JUlFfTVNLLCAwKTsKIAogCS8qIEluaXRpYWxpemUgTWFjIEZpZm8gKi8KIAogCS8qIENvbmZpZ3VyZSBSeCBNQUMgRklGTyAqLwotCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfR01GX0ZMX01TSyksIFJYX0ZGX0ZMX0RFRl9NU0spOworCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKHBvcnQsIFJYX0dNRl9GTF9NU0spLCBSWF9GRl9GTF9ERUZfTVNLKTsKIAlyZWcgPSBHTUZfT1BFUl9PTiB8IEdNRl9SWF9GX0ZMX09OOwogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OX0xJVEUgJiYKLQkgICAgY2hpcF9yZXYoaHcpID09IENISVBfUkVWX1lVX0xJVEVfQTMpCisJICAgIGh3LT5jaGlwX3JldiA9PSBDSElQX1JFVl9ZVV9MSVRFX0EzKQogCQlyZWcgJj0gfkdNRl9SWF9GX0ZMX09OOwotCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9DTFIpOwotCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIHJlZyk7Ci0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBSWF9HTUZfRkxfVEhSKSwgUlhfR01GX0ZMX1RIUl9ERUYpOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIEdNRl9SU1RfQ0xSKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfQ1RSTF9UKSwgcmVnKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBSWF9HTUZfRkxfVEhSKSwgUlhfR01GX0ZMX1RIUl9ERUYpOwogCiAJLyogQ29uZmlndXJlIFR4IE1BQyBGSUZPICovCi0Jc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX0NMUik7Ci0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX09QRVJfT04pOworCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksIEdNRl9SU1RfQ0xSKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX09QRVJfT04pOwogfQogCiBzdGF0aWMgdm9pZCB5dWtvbl9zdG9wKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UpCkBAIC0xOTA3LDE5ICsxODEzLDE5IEBACiAJaW50IHBvcnQgPSBza2dlLT5wb3J0OwogCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fTElURSAmJgotCSAgICBjaGlwX3JldihodykgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykgeworCSAgICBody0+Y2hpcF9yZXYgPT0gQ0hJUF9SRVZfWVVfTElURV9BMykgewogCQlza2dlX3dyaXRlMzIoaHcsIEIyX0dQX0lPLAogCQkJICAgICBza2dlX3JlYWQzMihodywgQjJfR1BfSU8pIHwgR1BfRElSXzkgfCBHUF9JT185KTsKIAl9CiAKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMLAotCQkJIHNrZ2VfZ21hX3JlYWQxNihodywgcG9ydCwgR01fR1BfQ1RSTCkKKwlnbWFfd3JpdGUxNihodywgcG9ydCwgR01fR1BfQ1RSTCwKKwkJCSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9HUF9DVFJMKQogCQkJICYgfihHTV9HUENSX1JYX0VOQXxHTV9HUENSX1JYX0VOQSkpOwotCXNrZ2VfZ21hX3JlYWQxNihodywgcG9ydCwgR01fR1BfQ1RSTCk7CisJZ21hX3JlYWQxNihodywgcG9ydCwgR01fR1BfQ1RSTCk7CiAKIAkvKiBzZXQgR1BIWSBDb250cm9sIHJlc2V0ICovCi0Jc2tnZV9nbWFfd3JpdGUzMihodywgcG9ydCwgR1BIWV9DVFJMLCBHUENfUlNUX1NFVCk7Ci0Jc2tnZV9nbWFfd3JpdGUzMihodywgcG9ydCwgR01BQ19DVFJMLCBHTUNfUlNUX1NFVCk7CisJZ21hX3dyaXRlMzIoaHcsIHBvcnQsIEdQSFlfQ1RSTCwgR1BDX1JTVF9TRVQpOworCWdtYV93cml0ZTMyKGh3LCBwb3J0LCBHTUFDX0NUUkwsIEdNQ19SU1RfU0VUKTsKIH0KIAogc3RhdGljIHZvaWQgeXVrb25fZ2V0X3N0YXRzKHN0cnVjdCBza2dlX3BvcnQgKnNrZ2UsIHU2NCAqZGF0YSkKQEAgLTE5MjgsMzkgKzE4MzQsNDAgQEAKIAlpbnQgcG9ydCA9IHNrZ2UtPnBvcnQ7CiAJaW50IGk7CiAKLQlkYXRhWzBdID0gKHU2NCkgc2tnZV9nbWFfcmVhZDMyKGh3LCBwb3J0LCBHTV9UWE9fT0tfSEkpIDw8IDMyCi0JCXwgc2tnZV9nbWFfcmVhZDMyKGh3LCBwb3J0LCBHTV9UWE9fT0tfTE8pOwotCWRhdGFbMV0gPSAodTY0KSBza2dlX2dtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1JYT19PS19ISSkgPDwgMzIKLQkJfCBza2dlX2dtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1JYT19PS19MTyk7CisJZGF0YVswXSA9ICh1NjQpIGdtYV9yZWFkMzIoaHcsIHBvcnQsIEdNX1RYT19PS19ISSkgPDwgMzIKKwkJfCBnbWFfcmVhZDMyKGh3LCBwb3J0LCBHTV9UWE9fT0tfTE8pOworCWRhdGFbMV0gPSAodTY0KSBnbWFfcmVhZDMyKGh3LCBwb3J0LCBHTV9SWE9fT0tfSEkpIDw8IDMyCisJCXwgZ21hX3JlYWQzMihodywgcG9ydCwgR01fUlhPX09LX0xPKTsKIAogCWZvciAoaSA9IDI7IGkgPCBBUlJBWV9TSVpFKHNrZ2Vfc3RhdHMpOyBpKyspCi0JCWRhdGFbaV0gPSBza2dlX2dtYV9yZWFkMzIoaHcsIHBvcnQsCisJCWRhdGFbaV0gPSBnbWFfcmVhZDMyKGh3LCBwb3J0LAogCQkJCQkgIHNrZ2Vfc3RhdHNbaV0uZ21hX29mZnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIHl1a29uX21hY19pbnRyKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGh3LT5kZXZbcG9ydF0pOwotCXU4IHN0YXR1cyA9IHNrZ2VfcmVhZDgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIEdNQUNfSVJRX1NSQykpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBody0+ZGV2W3BvcnRdOworCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IHN0YXR1cyA9IHNrZ2VfcmVhZDgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0lSUV9TUkMpKTsKIAotCXByX2RlYnVnKCJ5dWtvbl9pbnRyIHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKKwlpZiAobmV0aWZfbXNnX2ludHIoc2tnZSkpCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IG1hYyBpbnRlcnJ1cHQgc3RhdHVzIDB4JXhcbiIsCisJCSAgICAgICBkZXYtPm5hbWUsIHN0YXR1cyk7CisKIAlpZiAoc3RhdHVzICYgR01fSVNfUlhfRkZfT1IpIHsKIAkJKytza2dlLT5uZXRfc3RhdHMucnhfZmlmb19lcnJvcnM7Ci0JCXNrZ2VfZ21hX3dyaXRlOChodywgcG9ydCwgUlhfR01GX0NUUkxfVCwgR01GX0NMSV9SWF9GTyk7CisJCWdtYV93cml0ZTgoaHcsIHBvcnQsIFJYX0dNRl9DVFJMX1QsIEdNRl9DTElfUlhfRk8pOwogCX0KIAlpZiAoc3RhdHVzICYgR01fSVNfVFhfRkZfVVIpIHsKIAkJKytza2dlLT5uZXRfc3RhdHMudHhfZmlmb19lcnJvcnM7Ci0JCXNrZ2VfZ21hX3dyaXRlOChodywgcG9ydCwgVFhfR01GX0NUUkxfVCwgR01GX0NMSV9UWF9GVSk7CisJCWdtYV93cml0ZTgoaHcsIHBvcnQsIFRYX0dNRl9DVFJMX1QsIEdNRl9DTElfVFhfRlUpOwogCX0KIAogfQogCiBzdGF0aWMgdTE2IHl1a29uX3NwZWVkKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgdTE2IGF1eCkKIHsKLQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9GRSkKLQkJcmV0dXJuIChhdXggJiBQSFlfTV9QU19TUEVFRF8xMDApID8gU1BFRURfMTAwIDogU1BFRURfMTA7Ci0KLQlzd2l0Y2goYXV4ICYgUEhZX01fUFNfU1BFRURfTVNLKSB7CisJc3dpdGNoIChhdXggJiBQSFlfTV9QU19TUEVFRF9NU0spIHsKIAljYXNlIFBIWV9NX1BTX1NQRUVEXzEwMDA6CiAJCXJldHVybiBTUEVFRF8xMDAwOwogCWNhc2UgUEhZX01fUFNfU1BFRURfMTAwOgpAQCAtMTk4MSwxNSArMTg4OCwxNSBAQAogCS8qIEVuYWJsZSBUcmFuc21pdCBGSUZPIFVuZGVycnVuICovCiAJc2tnZV93cml0ZTgoaHcsIEdNQUNfSVJRX01TSywgR01BQ19ERUZfTVNLKTsKIAotCXJlZyA9IHNrZ2VfZ21hX3JlYWQxNihodywgcG9ydCwgR01fR1BfQ1RSTCk7CisJcmVnID0gZ21hX3JlYWQxNihodywgcG9ydCwgR01fR1BfQ1RSTCk7CiAJaWYgKHNrZ2UtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCB8fCBza2dlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQogCQlyZWcgfD0gR01fR1BDUl9EVVBfRlVMTDsKIAogCS8qIGVuYWJsZSBSeC9UeCAqLwogCXJlZyB8PSBHTV9HUENSX1JYX0VOQSB8IEdNX0dQQ1JfVFhfRU5BOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX0dQX0NUUkwsIHJlZyk7CiAKLQlza2dlX2dtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIFBIWV9NX0RFRl9NU0spOworCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfSU5UX01BU0ssIFBIWV9NX0RFRl9NU0spOwogCXNrZ2VfbGlua191cChza2dlKTsKIH0KIApAQCAtMTk5OSwxNiArMTkwNiwxNSBAQAogCWludCBwb3J0ID0gc2tnZS0+cG9ydDsKIAogCXByX2RlYnVnKCJ5dWtvbl9saW5rX2Rvd25cbiIpOwotCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgMCk7Ci0Jc2tnZV9nbV9waHlfd3JpdGUoaHcsIHBvcnQsIEdNX0dQX0NUUkwsCi0JCQkgIHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIEdNX0dQX0NUUkwpCisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfTUFTSywgMCk7CisJZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBHTV9HUF9DVFJMLAorCQkJICBnbV9waHlfcmVhZChodywgcG9ydCwgR01fR1BfQ1RSTCkKIAkJCSAgJiB+KEdNX0dQQ1JfUlhfRU5BIHwgR01fR1BDUl9UWF9FTkEpKTsKIAotCWlmIChody0+Y2hpcF9pZCAhPSBDSElQX0lEX1lVS09OX0ZFICYmCi0JICAgIHNrZ2UtPmZsb3dfY29udHJvbCA9PSBGTE9XX01PREVfUkVNX1NFTkQpIHsKKwlpZiAoc2tnZS0+Zmxvd19jb250cm9sID09IEZMT1dfTU9ERV9SRU1fU0VORCkgewogCQkvKiByZXN0b3JlIEFzeW1tZXRyaWMgUGF1c2UgYml0ICovCi0JCXNrZ2VfZ21fcGh5X3dyaXRlKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0FEViwKLQkJCQkgIHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsCisJCWdtX3BoeV93cml0ZShodywgcG9ydCwgUEhZX01BUlZfQVVORV9BRFYsCisJCQkJICBnbV9waHlfcmVhZChodywgcG9ydCwKIAkJCQkJCSAgIFBIWV9NQVJWX0FVTkVfQURWKQogCQkJCSAgfCBQSFlfTV9BTl9BU1ApOwogCkBAIC0yMDI3LDIwICsxOTMzLDIxIEBACiAJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKIAl1MTYgaXN0YXR1cywgcGh5c3RhdDsKIAotCWlzdGF0dXMgPSBza2dlX2dtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9JTlRfU1RBVCk7Ci0JcGh5c3RhdCA9IHNrZ2VfZ21fcGh5X3JlYWQoaHcsIHBvcnQsIFBIWV9NQVJWX1BIWV9TVEFUKTsKLQlwcl9kZWJ1ZygieXVrb24gcGh5IGludHIgaXN0YXQ9JXggcGh5X3N0YXQ9JXhcbiIsIGlzdGF0dXMsIHBoeXN0YXQpOworCWlzdGF0dXMgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfSU5UX1NUQVQpOworCXBoeXN0YXQgPSBnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfUEhZX1NUQVQpOworCisJaWYgKG5ldGlmX21zZ19pbnRyKHNrZ2UpKQorCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIiVzOiBwaHkgaW50ZXJydXB0IHN0YXR1cyAweCV4IDB4JXhcbiIsCisJCSAgICAgICBza2dlLT5uZXRkZXYtPm5hbWUsIGlzdGF0dXMsIHBoeXN0YXQpOwogCiAJaWYgKGlzdGF0dXMgJiBQSFlfTV9JU19BTl9DT01QTCkgewotCQlpZiAoc2tnZV9nbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfQVVORV9MUCkKKwkJaWYgKGdtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl9BVU5FX0xQKQogCQkgICAgJiBQSFlfTV9BTl9SRikgewogCQkJcmVhc29uID0gInJlbW90ZSBmYXVsdCI7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCi0JCWlmICghKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT05fRkUgfHwgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQykKLQkJICAgICYmIChza2dlX2dtX3BoeV9yZWFkKGh3LCBwb3J0LCBQSFlfTUFSVl8xMDAwVF9TVEFUKQotCQkJJiBQSFlfQl8xMDAwU19NU0YpKSB7CisJCWlmIChnbV9waHlfcmVhZChodywgcG9ydCwgUEhZX01BUlZfMTAwMFRfU1RBVCkgJiBQSFlfQl8xMDAwU19NU0YpIHsKIAkJCXJlYXNvbiA9ICJtYXN0ZXIvc2xhdmUgZmF1bHQiOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KQEAgLTIwNTQsMTAgKzE5NjEsNiBAQAogCQkJPyBEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOwogCQlza2dlLT5zcGVlZCA9IHl1a29uX3NwZWVkKGh3LCBwaHlzdGF0KTsKIAotCQkvKiBUeCAmIFJ4IFBhdXNlIEVuYWJsZWQgYml0cyBhcmUgYXQgOS4uOCAqLwotCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9YTCkKLQkJCXBoeXN0YXQgPj49IDY7Ci0KIAkJLyogV2UgYXJlIHVzaW5nIElFRUUgODAyLjN6L0Q1LjAgVGFibGUgMzctNCAqLwogCQlzd2l0Y2ggKHBoeXN0YXQgJiBQSFlfTV9QU19QQVVTRV9NU0spIHsKIAkJY2FzZSBQSFlfTV9QU19QQVVTRV9NU0s6CkBAIC0yMDc1LDkgKzE5NzgsOSBAQAogCiAJCWlmIChza2dlLT5mbG93X2NvbnRyb2wgPT0gRkxPV19NT0RFX05PTkUgfHwKIAkJICAgIChza2dlLT5zcGVlZCA8IFNQRUVEXzEwMDAgJiYgc2tnZS0+ZHVwbGV4ID09IERVUExFWF9IQUxGKSkKLQkJCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT0ZGKTsKKwkJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgR01BQ19DVFJMKSwgR01DX1BBVVNFX09GRik7CiAJCWVsc2UKLQkJCXNrZ2Vfd3JpdGU4KGh3LCBTS0dFTUFDX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT04pOworCQkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBHTUFDX0NUUkwpLCBHTUNfUEFVU0VfT04pOwogCQl5dWtvbl9saW5rX3VwKHNrZ2UpOwogCQlyZXR1cm47CiAJfQpAQCAtMjE2MSw2ICsyMDY0LDEyIEBACiAJaWYgKG5ldGlmX21zZ19pZnVwKHNrZ2UpKQogCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiJXM6IGVuYWJsaW5nIGludGVyZmFjZVxuIiwgZGV2LT5uYW1lKTsKIAorCWlmIChkZXYtPm10dSA+IFJYX0JVRl9TSVpFKQorCQlza2dlLT5yeF9idWZfc2l6ZSA9IGRldi0+bXR1ICsgRVRIX0hMRU4gKyBORVRfSVBfQUxJR047CisJZWxzZQorCQlza2dlLT5yeF9idWZfc2l6ZSA9IFJYX0JVRl9TSVpFOworCisKIAlyeF9zaXplID0gc2tnZS0+cnhfcmluZy5jb3VudCAqIHNpemVvZihzdHJ1Y3Qgc2tnZV9yeF9kZXNjKTsKIAl0eF9zaXplID0gc2tnZS0+dHhfcmluZy5jb3VudCAqIHNpemVvZihzdHJ1Y3Qgc2tnZV90eF9kZXNjKTsKIAlza2dlLT5tZW1fc2l6ZSA9IHR4X3NpemUgKyByeF9zaXplOwpAQCAtMjE3Myw3ICsyMDgyLDggQEAKIAlpZiAoKGVyciA9IHNrZ2VfcmluZ19hbGxvYygmc2tnZS0+cnhfcmluZywgc2tnZS0+bWVtLCBza2dlLT5kbWEpKSkKIAkJZ290byBmcmVlX3BjaV9tZW07CiAKLQlpZiAoc2tnZV9yeF9maWxsKHNrZ2UpKQorCWVyciA9IHNrZ2VfcnhfZmlsbChza2dlKTsKKwlpZiAoZXJyKQogCQlnb3RvIGZyZWVfcnhfcmluZzsKIAogCWlmICgoZXJyID0gc2tnZV9yaW5nX2FsbG9jKCZza2dlLT50eF9yaW5nLCBza2dlLT5tZW0gKyByeF9zaXplLApAQCAtMjE4Miw2ICsyMDkyLDEwIEBACiAKIAlza2dlLT50eF9hdmFpbCA9IHNrZ2UtPnR4X3JpbmcuY291bnQgLSAxOwogCisJLyogRW5hYmxlIElSUSBmcm9tIHBvcnQgKi8KKwlody0+aW50cl9tYXNrIHw9IHBvcnRpcnFtYXNrW3BvcnRdOworCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7CisKIAkvKiBJbml0aWFsemUgTUFDICovCiAJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKIAkJZ2VuZXNpc19tYWNfaW5pdChodywgcG9ydCk7CkBAIC0yMTg5LDcgKzIxMDMsNyBAQAogCQl5dWtvbl9tYWNfaW5pdChodywgcG9ydCk7CiAKIAkvKiBDb25maWd1cmUgUkFNYnVmZmVycyAqLwotCWNodW5rID0gaHctPnJhbV9zaXplIC8gKGlzZHVhbHBvcnQoaHcpID8gNCA6IDIpOworCWNodW5rID0gaHctPnJhbV9zaXplIC8gKChody0+cG9ydHMgKyAxKSoyKTsKIAlyYW1fYWRkciA9IGh3LT5yYW1fb2Zmc2V0ICsgMiAqIGNodW5rICogcG9ydDsKIAogCXNrZ2VfcmFtc2V0KGh3LCByeHFhZGRyW3BvcnRdLCByYW1fYWRkciwgY2h1bmspOwpAQCAtMjIyNyw3ICsyMTQxLDYgQEAKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKIAlkZWxfdGltZXJfc3luYygmc2tnZS0+bGVkX2JsaW5rKTsKLQlkZWxfdGltZXJfc3luYygmc2tnZS0+bGlua19jaGVjayk7CiAKIAkvKiBTdG9wIHRyYW5zbWl0dGVyICovCiAJc2tnZV93cml0ZTgoaHcsIFFfQUREUih0eHFhZGRyW3BvcnRdLCBRX0NTUiksIENTUl9TVE9QKTsKQEAgLTIyNDAsMTIgKzIxNTMsMTIgQEAKIAkJeXVrb25fc3RvcChza2dlKTsKIAogCS8qIERpc2FibGUgRm9yY2UgU3luYyBiaXQgYW5kIEVuYWJsZSBBbGxvYyBiaXQgKi8KLQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhBX0NUUkwpLAorCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhBX0NUUkwpLAogCQkgICAgVFhBX0RJU19GU1lOQyB8IFRYQV9ESVNfQUxMT0MgfCBUWEFfU1RPUF9SQyk7CiAKIAkvKiBTdG9wIEludGVydmFsIFRpbWVyIGFuZCBMaW1pdCBDb3VudGVyIG9mIFR4IEFyYml0ZXIgKi8KLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYQV9JVElfSU5JKSwgMEwpOwotCXNrZ2Vfd3JpdGUzMihodywgU0tHRU1BQ19SRUcocG9ydCwgVFhBX0xJTV9JTkkpLCAwTCk7CisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhBX0lUSV9JTkkpLCAwTCk7CisJc2tnZV93cml0ZTMyKGh3LCBTS19SRUcocG9ydCwgVFhBX0xJTV9JTkkpLCAwTCk7CiAKIAkvKiBSZXNldCBQQ0kgRklGTyAqLwogCXNrZ2Vfd3JpdGUzMihodywgUV9BRERSKHR4cWFkZHJbcG9ydF0sIFFfQ1NSKSwgQ1NSX1NFVF9SRVNFVCk7CkBAIC0yMjYwLDEzICsyMTczLDEzIEBACiAJc2tnZV93cml0ZTMyKGh3LCBRX0FERFIocnhxYWRkcltwb3J0XSwgUV9DU1IpLCBDU1JfU0VUX1JFU0VUKTsKIAogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX0xFRF9DVFJMKSwgTEVEX1NUT1ApOwotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfTEVEX0NUUkwpLCBMRURfU1RPUCk7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwyKSwgTUZGX1JTVF9TRVQpOworCQlza2dlX3dyaXRlOChodywgU0tfUkVHKHBvcnQsIFJYX01GRl9DVFJMMiksIE1GRl9SU1RfU0VUKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9MRURfQ1RSTCksIExFRF9TVE9QKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBSWF9MRURfQ1RSTCksIExFRF9TVE9QKTsKIAl9IGVsc2UgewotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIEdNRl9SU1RfU0VUKTsKLQkJc2tnZV93cml0ZTgoaHcsIFNLR0VNQUNfUkVHKHBvcnQsIFRYX0dNRl9DVFJMX1QpLCBHTUZfUlNUX1NFVCk7CisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgUlhfR01GX0NUUkxfVCksIEdNRl9SU1RfU0VUKTsKKwkJc2tnZV93cml0ZTgoaHcsIFNLX1JFRyhwb3J0LCBUWF9HTUZfQ1RSTF9UKSwgR01GX1JTVF9TRVQpOwogCX0KIAogCS8qIHR1cm4gb2ZmIGxlZCdzICovCkBAIC0yMjk5LDEwICsyMjEyLDEwIEBACiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKCFzcGluX3RyeWxvY2soJnNrZ2UtPnR4X2xvY2spKSB7Ci0gCQkvKiBDb2xsaXNpb24gLSB0ZWxsIHVwcGVyIGxheWVyIHRvIHJlcXVldWUgKi8gCi0gCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7IAotIAkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7IAotIAl9IAorIAkJLyogQ29sbGlzaW9uIC0gdGVsbCB1cHBlciBsYXllciB0byByZXF1ZXVlICovCisgCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgCQlyZXR1cm4gTkVUREVWX1RYX0xPQ0tFRDsKKyAJfQogCiAJaWYgKHVubGlrZWx5KHNrZ2UtPnR4X2F2YWlsIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArMSkpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwpAQCAtMjMzMyw3ICsyMjQ2LDcgQEAKIAkJICogZG9lcy4gIExvb2tzIGxpa2UgaGFyZHdhcmUgaXMgd3Jvbmc/CiAJCSAqLwogCQlpZiAoaXAtPnByb3RvY29sID09IElQUFJPVE9fVURQCi0JICAgICAgICAgICAgJiYgY2hpcF9yZXYoaHcpID09IDAgJiYgaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTikKKwkgICAgICAgICAgICAmJiBody0+Y2hpcF9yZXYgPT0gMCAmJiBody0+Y2hpcF9pZCA9PSBDSElQX0lEX1lVS09OKQogCQkJY29udHJvbCA9IEJNVV9UQ1BfQ0hFQ0s7CiAJCWVsc2UKIAkJCWNvbnRyb2wgPSBCTVVfVURQX0NIRUNLOwpAQCAtMjM5NCw2ICsyMzA3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfdHhfZnJlZShzdHJ1Y3Qgc2tnZV9odyAqaHcsIHN0cnVjdCBza2dlX2VsZW1lbnQgKmUpCiB7CisJLyogVGhpcyByaW5nIGVsZW1lbnQgY2FuIGJlIHNrYiBvciBmcmFnbWVudCAqLwogCWlmIChlLT5za2IpIHsKIAkJcGNpX3VubWFwX3NpbmdsZShody0+cGRldiwKIAkJCSAgICAgICBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKQEAgLTI0MzgsMTYgKzIzNTIsMTcgQEAKIHN0YXRpYyBpbnQgc2tnZV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQogewogCWludCBlcnIgPSAwOworCWludCBydW5uaW5nID0gbmV0aWZfcnVubmluZyhkZXYpOwogCi0JaWYobmV3X210dSA8IEVUSF9aTEVOIHx8IG5ld19tdHUgPiBFVEhfSlVNQk9fTVRVKQorCWlmIChuZXdfbXR1IDwgRVRIX1pMRU4gfHwgbmV3X210dSA+IEVUSF9KVU1CT19NVFUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGV2LT5tdHUgPSBuZXdfbXR1OwogCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCWlmIChydW5uaW5nKQogCQlza2dlX2Rvd24oZGV2KTsKKwlkZXYtPm10dSA9IG5ld19tdHU7CisJaWYgKHJ1bm5pbmcpCiAJCXNrZ2VfdXAoZGV2KTsKLQl9CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjQ2Miw3ICsyMzc3LDkgQEAKIAl1MzIgbW9kZTsKIAl1OCBmaWx0ZXJbOF07CiAKLQltb2RlID0gc2tnZV94bV9yZWFkMzIoaHcsIHBvcnQsIFhNX01PREUpOworCXByX2RlYnVnKCJnZW5lc2lzX3NldF9tdWx0aWNhc3QgZmxhZ3M9JXggY291bnQ9JWRcbiIsIGRldi0+ZmxhZ3MsIGRldi0+bWNfY291bnQpOworCisJbW9kZSA9IHhtX3JlYWQzMihodywgcG9ydCwgWE1fTU9ERSk7CiAJbW9kZSB8PSBYTV9NRF9FTkFfSEFTSDsKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQogCQltb2RlIHw9IFhNX01EX0VOQV9QUk9NOwpAQCAtMjQ3MywxNyArMjM5MCwxNiBAQAogCQltZW1zZXQoZmlsdGVyLCAweGZmLCBzaXplb2YoZmlsdGVyKSk7CiAJZWxzZSB7CiAJCW1lbXNldChmaWx0ZXIsIDAsIHNpemVvZihmaWx0ZXIpKTsKLQkJZm9yKGkgPSAwOyBsaXN0ICYmIGkgPCBjb3VudDsgaSsrLCBsaXN0ID0gbGlzdC0+bmV4dCkgewotCQkJdTMyIGNyYyA9IGNyYzMyX2xlKH4wLCBsaXN0LT5kbWlfYWRkciwgRVRIX0FMRU4pOwotCQkJdTggYml0ID0gNjMgLSAoY3JjICYgNjMpOwotCisJCWZvciAoaSA9IDA7IGxpc3QgJiYgaSA8IGNvdW50OyBpKyssIGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCQl1MzIgY3JjLCBiaXQ7CisJCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGxpc3QtPmRtaV9hZGRyKTsKKwkJCWJpdCA9IH5jcmMgJiAweDNmOwogCQkJZmlsdGVyW2JpdC84XSB8PSAxIDw8IChiaXQlOCk7CiAJCX0KIAl9CiAKLQlza2dlX3htX291dGhhc2goaHcsIHBvcnQsIFhNX0hTTSwgZmlsdGVyKTsKLQotCXNrZ2VfeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgbW9kZSk7CisJeG1fd3JpdGUzMihodywgcG9ydCwgWE1fTU9ERSwgbW9kZSk7CisJeG1fb3V0aGFzaChodywgcG9ydCwgWE1fSFNNLCBmaWx0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCB5dWtvbl9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yNDk3LDcgKzI0MTMsNyBAQAogCiAJbWVtc2V0KGZpbHRlciwgMCwgc2l6ZW9mKGZpbHRlcikpOwogCi0JcmVnID0gc2tnZV9nbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMKTsKKwlyZWcgPSBnbWFfcmVhZDE2KGh3LCBwb3J0LCBHTV9SWF9DVFJMKTsKIAlyZWcgfD0gR01fUlhDUl9VQ0ZfRU5BOwogCiAJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgCQkvKiBwcm9taXNjaW91cyAqLwpAQCAtMjUxMCwyMyArMjQyNiwyMyBAQAogCQlpbnQgaTsKIAkJcmVnIHw9IEdNX1JYQ1JfTUNGX0VOQTsKIAotCQlmb3IoaSA9IDA7IGxpc3QgJiYgaSA8IGRldi0+bWNfY291bnQ7IGkrKywgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJZm9yIChpID0gMDsgbGlzdCAmJiBpIDwgZGV2LT5tY19jb3VudDsgaSsrLCBsaXN0ID0gbGlzdC0+bmV4dCkgewogCQkJdTMyIGJpdCA9IGV0aGVyX2NyYyhFVEhfQUxFTiwgbGlzdC0+ZG1pX2FkZHIpICYgMHgzZjsKIAkJCWZpbHRlcltiaXQvOF0gfD0gMSA8PCAoYml0JTgpOwogCQl9CiAJfQogCiAKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gxLAorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gxLAogCQkJICh1MTYpZmlsdGVyWzBdIHwgKCh1MTYpZmlsdGVyWzFdIDw8IDgpKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gyLAorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gyLAogCQkJICh1MTYpZmlsdGVyWzJdIHwgKCh1MTYpZmlsdGVyWzNdIDw8IDgpKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gzLAorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0gzLAogCQkJICh1MTYpZmlsdGVyWzRdIHwgKCh1MTYpZmlsdGVyWzVdIDw8IDgpKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0g0LAorCWdtYV93cml0ZTE2KGh3LCBwb3J0LCBHTV9NQ19BRERSX0g0LAogCQkJICh1MTYpZmlsdGVyWzZdIHwgKCh1MTYpZmlsdGVyWzddIDw8IDgpKTsKIAotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsIHJlZyk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIEdNX1JYX0NUUkwsIHJlZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJhZF9waHlfc3RhdHVzKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgdTMyIHN0YXR1cykKQEAgLTI1NDUsMjggKzI0NjEsNzYgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICIlczogcnggZXJyLCBzbG90ICVkIGNvbnRyb2wgMHgleCBzdGF0dXMgMHgleFxuIiwKIAkJICAgICAgIHNrZ2UtPm5ldGRldi0+bmFtZSwgc2xvdCwgY29udHJvbCwgc3RhdHVzKTsKIAotCWlmICgoY29udHJvbCAmIChCTVVfRU9GfEJNVV9TVEYpKSAhPSAoQk1VX1NURnxCTVVfRU9GKQotCSAgICB8fCAoY29udHJvbCAmIEJNVV9CQkMpID4gc2tnZS0+bmV0ZGV2LT5tdHUgKyBWTEFOX0VUSF9ITEVOKQorCWlmICgoY29udHJvbCAmIChCTVVfRU9GfEJNVV9TVEYpKSAhPSAoQk1VX1NURnxCTVVfRU9GKSkKIAkJc2tnZS0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQllbHNlIHsKLQkJaWYgKHNrZ2UtPmh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgewotCQkJaWYgKHN0YXR1cyAmIChYTVJfRlNfUlVOVHxYTVJfRlNfTE5HX0VSUikpCi0JCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJCWlmIChzdGF0dXMgJiBYTVJfRlNfRlJBX0VSUikKLQkJCQlza2dlLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgWE1SX0ZTX0ZDU19FUlIpCi0JCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJfSBlbHNlIHsKLQkJCWlmIChzdGF0dXMgJiAoR01SX0ZTX0xPTkdfRVJSfEdNUl9GU19VTl9TSVpFKSkKLQkJCQlza2dlLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwotCQkJaWYgKHN0YXR1cyAmIEdNUl9GU19GUkFHTUVOVCkKLQkJCQlza2dlLT5uZXRfc3RhdHMucnhfZnJhbWVfZXJyb3JzKys7Ci0JCQlpZiAoc3RhdHVzICYgR01SX0ZTX0NSQ19FUlIpCi0JCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKLQkJfQorCWVsc2UgaWYgKHNrZ2UtPmh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgeworCQlpZiAoc3RhdHVzICYgKFhNUl9GU19SVU5UfFhNUl9GU19MTkdfRVJSKSkKKwkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWlmIChzdGF0dXMgJiBYTVJfRlNfRlJBX0VSUikKKwkJCXNrZ2UtPm5ldF9zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJaWYgKHN0YXR1cyAmIFhNUl9GU19GQ1NfRVJSKQorCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwl9IGVsc2UgeworCQlpZiAoc3RhdHVzICYgKEdNUl9GU19MT05HX0VSUnxHTVJfRlNfVU5fU0laRSkpCisJCQlza2dlLT5uZXRfc3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgR01SX0ZTX0ZSQUdNRU5UKQorCQkJc2tnZS0+bmV0X3N0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQlpZiAoc3RhdHVzICYgR01SX0ZTX0NSQ19FUlIpCisJCQlza2dlLT5uZXRfc3RhdHMucnhfY3JjX2Vycm9ycysrOwogCX0KIH0KIAorLyogR2V0IHJlY2VpdmUgYnVmZmVyIGZyb20gZGVzY3JpcHRvci4KKyAqIEhhbmRsZXMgY29weSBvZiBzbWFsbCBidWZmZXJzIGFuZCByZWFsbG9jYXRpb24gZmFpbHVyZXMKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tnZV9yeF9nZXQoc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSwKKwkJCQkJICBzdHJ1Y3Qgc2tnZV9lbGVtZW50ICplLAorCQkJCQkgIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKm5za2IsICpza2I7CisKKwlpZiAobGVuIDwgUlhfQ09QWV9USFJFU0hPTEQpIHsKKwkJbnNrYiA9IHNrZ2VfcnhfYWxsb2Moc2tnZS0+bmV0ZGV2LCBsZW4gKyBORVRfSVBfQUxJR04pOworCQlpZiAodW5saWtlbHkoIW5za2IpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHNrZ2UtPmh3LT5wZGV2LAorCQkJCQkgICAgcGNpX3VubWFwX2FkZHIoZSwgbWFwYWRkciksCisJCQkJCSAgICBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCW1lbWNweShuc2tiLT5kYXRhLCBlLT5za2ItPmRhdGEsIGxlbik7CisJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShza2dlLT5ody0+cGRldiwKKwkJCQkJICAgICAgIHBjaV91bm1hcF9hZGRyKGUsIG1hcGFkZHIpLAorCQkJCQkgICAgICAgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCWlmIChza2dlLT5yeF9jc3VtKSB7CisJCQlzdHJ1Y3Qgc2tnZV9yeF9kZXNjICpyZCA9IGUtPmRlc2M7CisJCQluc2tiLT5jc3VtID0gbGUxNl90b19jcHUocmQtPmNzdW0yKTsKKwkJCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQl9CisJCXNrZ2VfcnhfcmV1c2UoZSwgc2tnZS0+cnhfYnVmX3NpemUpOworCQlyZXR1cm4gbnNrYjsKKwl9IGVsc2UgeworCQluc2tiID0gc2tnZV9yeF9hbGxvYyhza2dlLT5uZXRkZXYsIHNrZ2UtPnJ4X2J1Zl9zaXplKTsKKwkJaWYgKHVubGlrZWx5KCFuc2tiKSkKKwkJCXJldHVybiBOVUxMOworCisJCXBjaV91bm1hcF9zaW5nbGUoc2tnZS0+aHctPnBkZXYsCisJCQkJIHBjaV91bm1hcF9hZGRyKGUsIG1hcGFkZHIpLAorCQkJCSBwY2lfdW5tYXBfbGVuKGUsIG1hcGxlbiksCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCXNrYiA9IGUtPnNrYjsKKwkJaWYgKHNrZ2UtPnJ4X2NzdW0pIHsKKwkJCXN0cnVjdCBza2dlX3J4X2Rlc2MgKnJkID0gZS0+ZGVzYzsKKwkJCXNrYi0+Y3N1bSA9IGxlMTZfdG9fY3B1KHJkLT5jc3VtMik7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQl9CisKKwkJc2tnZV9yeF9zZXR1cChza2dlLCBlLCBuc2tiLCBza2dlLT5yeF9idWZfc2l6ZSk7CisJCXJldHVybiBza2I7CisJfQorfQorCisKIHN0YXRpYyBpbnQgc2tnZV9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCAqYnVkZ2V0KQogewogCXN0cnVjdCBza2dlX3BvcnQgKnNrZ2UgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMjU3NSwxMyArMjUzOSwxMiBAQAogCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7CiAJdW5zaWduZWQgaW50IHRvX2RvID0gbWluKGRldi0+cXVvdGEsICpidWRnZXQpOwogCXVuc2lnbmVkIGludCB3b3JrX2RvbmUgPSAwOwotCWludCBkb25lOwotCXN0YXRpYyBjb25zdCB1MzIgaXJxbWFza1tdID0geyBJU19QT1JUXzEsIElTX1BPUlRfMiB9OwogCi0JZm9yIChlID0gcmluZy0+dG9fY2xlYW47IGUgIT0gcmluZy0+dG9fdXNlICYmIHdvcmtfZG9uZSA8IHRvX2RvOwotCSAgICAgZSA9IGUtPm5leHQpIHsKKwlwcl9kZWJ1Zygic2tnZV9wb2xsXG4iKTsKKworCWZvciAoZSA9IHJpbmctPnRvX2NsZWFuOyB3b3JrX2RvbmUgPCB0b19kbzsgZSA9IGUtPm5leHQpIHsKIAkJc3RydWN0IHNrZ2VfcnhfZGVzYyAqcmQgPSBlLT5kZXNjOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZS0+c2tiOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQl1MzIgY29udHJvbCwgbGVuLCBzdGF0dXM7CiAKIAkJcm1iKCk7CkBAIC0yNTkwLDE5ICsyNTUzLDEyIEBACiAJCQlicmVhazsKIAogCQlsZW4gPSBjb250cm9sICYgQk1VX0JCQzsKLQkJZS0+c2tiID0gTlVMTDsKLQotCQlwY2lfdW5tYXBfc2luZ2xlKGh3LT5wZGV2LAotCQkJCSBwY2lfdW5tYXBfYWRkcihlLCBtYXBhZGRyKSwKLQkJCQkgcGNpX3VubWFwX2xlbihlLCBtYXBsZW4pLAotCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCiAJCXN0YXR1cyA9IHJkLT5zdGF0dXM7Ci0JCWlmICgoY29udHJvbCAmIChCTVVfRU9GfEJNVV9TVEYpKSAhPSAoQk1VX1NURnxCTVVfRU9GKQotCQkgICAgIHx8IGxlbiA+IGRldi0+bXR1ICsgVkxBTl9FVEhfSExFTgotCQkgICAgIHx8IGJhZF9waHlfc3RhdHVzKGh3LCBzdGF0dXMpKSB7CisKKwkJaWYgKHVubGlrZWx5KChjb250cm9sICYgKEJNVV9FT0Z8Qk1VX1NURikpICE9IChCTVVfU1RGfEJNVV9FT0YpCisJCQkgICAgIHx8IGJhZF9waHlfc3RhdHVzKGh3LCBzdGF0dXMpKSkgewogCQkJc2tnZV9yeF9lcnJvcihza2dlLCBlIC0gcmluZy0+c3RhcnQsIGNvbnRyb2wsIHN0YXR1cyk7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlza2dlX3J4X3JldXNlKGUsIHNrZ2UtPnJ4X2J1Zl9zaXplKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTI2MTAsNDMgKzI1NjYsMzcgQEAKIAkJICAgIHByaW50ayhLRVJOX0RFQlVHIFBGWCAiJXM6IHJ4IHNsb3QgJXRkIHN0YXR1cyAweCV4IGxlbiAlZFxuIiwKIAkJCSAgIGRldi0+bmFtZSwgZSAtIHJpbmctPnN0YXJ0LCByZC0+c3RhdHVzLCBsZW4pOwogCi0JCXNrYl9wdXQoc2tiLCBsZW4pOwotCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQlza2IgPSBza2dlX3J4X2dldChza2dlLCBlLCBsZW4pOworCQlpZiAobGlrZWx5KHNrYikpIHsKKwkJCXNrYl9wdXQoc2tiLCBsZW4pOworCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKIAotCQlpZiAoc2tnZS0+cnhfY3N1bSkgewotCQkJc2tiLT5jc3VtID0gbGUxNl90b19jcHUocmQtPmNzdW0yKTsKLQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7Ci0JCX0KKwkJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCi0JCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7Ci0JCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0KLQkJKyt3b3JrX2RvbmU7CisJCQkrK3dvcmtfZG9uZTsKKwkJfSBlbHNlCisJCQlza2dlX3J4X3JldXNlKGUsIHNrZ2UtPnJ4X2J1Zl9zaXplKTsKIAl9CiAJcmluZy0+dG9fY2xlYW4gPSBlOwogCi0JKmJ1ZGdldCAtPSB3b3JrX2RvbmU7Ci0JZGV2LT5xdW90YSAtPSB3b3JrX2RvbmU7Ci0JZG9uZSA9IHdvcmtfZG9uZSA8IHRvX2RvOwotCi0JaWYgKHNrZ2VfcnhfZmlsbChza2dlKSkKLQkJZG9uZSA9IDA7Ci0KIAkvKiByZXN0YXJ0IHJlY2VpdmVyICovCiAJd21iKCk7CiAJc2tnZV93cml0ZTgoaHcsIFFfQUREUihyeHFhZGRyW3NrZ2UtPnBvcnRdLCBRX0NTUiksCiAJCSAgICBDU1JfU1RBUlQgfCBDU1JfSVJRX0NMX0YpOwogCi0JaWYgKGRvbmUpIHsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJaHctPmludHJfbWFzayB8PSBpcnFtYXNrW3NrZ2UtPnBvcnRdOwotCQkvKiBPcmRlciBpcyBpbXBvcnRhbnQgc2luY2UgZGF0YSBjYW4gZ2V0IGludGVycnVwdGVkICovCi0JCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7Ci0JCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KKwkqYnVkZ2V0IC09IHdvcmtfZG9uZTsKKwlkZXYtPnF1b3RhIC09IHdvcmtfZG9uZTsKIAotCXJldHVybiAhZG9uZTsKKwlpZiAod29ya19kb25lID49ICB0b19kbykKKwkJcmV0dXJuIDE7IC8qIG5vdCBkb25lICovCisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCV9fbmV0aWZfcnhfY29tcGxldGUoZGV2KTsKKwlody0+aW50cl9tYXNrIHw9IHBvcnRpcnFtYXNrW3NrZ2UtPnBvcnRdOworCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2tnZV90eF9pbnRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yNjU3LDcgKzI2MDcsNyBAQAogCXN0cnVjdCBza2dlX2VsZW1lbnQgKmU7CiAKIAlzcGluX2xvY2soJnNrZ2UtPnR4X2xvY2spOwotCWZvcihlID0gcmluZy0+dG9fY2xlYW47IGUgIT0gcmluZy0+dG9fdXNlOyBlID0gZS0+bmV4dCkgeworCWZvciAoZSA9IHJpbmctPnRvX2NsZWFuOyBlICE9IHJpbmctPnRvX3VzZTsgZSA9IGUtPm5leHQpIHsKIAkJc3RydWN0IHNrZ2VfdHhfZGVzYyAqdGQgPSBlLT5kZXNjOwogCQl1MzIgY29udHJvbDsKIApAQCAtMjY5MCwxMiArMjY0MCwxMiBAQAogCSAgICAgICA6IChwb3J0ID09IDAgPyAiKHBvcnQgQSkiOiAiKHBvcnQgQiIpKTsKIAogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpCi0JCXNrZ2Vfd3JpdGUxNihodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwKKwkJc2tnZV93cml0ZTE2KGh3LCBTS19SRUcocG9ydCwgVFhfTUZGX0NUUkwxKSwKIAkJCSAgICAgTUZGX0NMUl9QRVJSKTsKIAllbHNlCiAJCS8qIEhXLUJ1ZyAjODogY2xlYXJlZCBieSBHTUZfQ0xJX1RYX0ZDIGluc3RlYWQgb2YgR01GX0NMSV9UWF9QRSAqLwotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksCi0JCQkgICAgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04gJiYgY2hpcF9yZXYoaHcpID09IDApCisJCXNrZ2Vfd3JpdGU4KGh3LCBTS19SRUcocG9ydCwgVFhfR01GX0NUUkxfVCksCisJCQkgICAgKGh3LT5jaGlwX2lkID09IENISVBfSURfWVVLT04gJiYgaHctPmNoaXBfcmV2ID09IDApCiAJCQkgICAgPyBHTUZfQ0xJX1RYX0ZDIDogR01GX0NMSV9UWF9QRSk7CiB9CiAKQEAgLTI3MDMsMTYgKzI2NTMsMTYgQEAKIHsKIAl1MTYgc3RhdHVzOwogCi0Jc3RhdHVzID0gc2tnZV9yZWFkMTYoaHcsIFNLR0VQQ0lfUkVHKFBDSV9TVEFUVVMpKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChody0+cGRldiwgUENJX1NUQVRVUywgJnN0YXR1cyk7CiAJc2tnZV93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PTik7Ci0Jc2tnZV93cml0ZTE2KGh3LCBTS0dFUENJX1JFRyhQQ0lfU1RBVFVTKSwKLQkJICAgICBzdGF0dXMgfCBQQ0lfU1RBVFVTX0VSUk9SX0JJVFMpOworCXBjaV93cml0ZV9jb25maWdfd29yZChody0+cGRldiwgUENJX1NUQVRVUywKKwkJCSAgICAgIHN0YXR1cyB8IFBDSV9TVEFUVVNfRVJST1JfQklUUyk7CiAJc2tnZV93cml0ZTgoaHcsIEIyX1RTVF9DVFJMMSwgVFNUX0NGR19XUklURV9PRkYpOwogfQogCiBzdGF0aWMgdm9pZCBza2dlX21hY19pbnRyKHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCiB7Ci0JaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykgCisJaWYgKGh3LT5jaGlwX2lkID09IENISVBfSURfR0VORVNJUykKIAkJZ2VuZXNpc19tYWNfaW50cihodywgcG9ydCk7CiAJZWxzZQogCQl5dWtvbl9tYWNfaW50cihodywgcG9ydCk7CkBAIC0yNzI2LDkgKzI2NzYsOSBAQAogCWlmIChody0+Y2hpcF9pZCA9PSBDSElQX0lEX0dFTkVTSVMpIHsKIAkJLyogY2xlYXIgeG1hYyBlcnJvcnMgKi8KIAkJaWYgKGh3c3RhdHVzICYgKElTX05PX1NUQVRfTTF8SVNfTk9fVElTVF9NMSkpCi0JCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKDAsIFJYX01GRl9DVFJMMSksIE1GRl9DTFJfSU5TVEFUKTsKKwkJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKDAsIFJYX01GRl9DVFJMMSksIE1GRl9DTFJfSU5TVEFUKTsKIAkJaWYgKGh3c3RhdHVzICYgKElTX05PX1NUQVRfTTJ8SVNfTk9fVElTVF9NMikpCi0JCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKDAsIFJYX01GRl9DVFJMMiksIE1GRl9DTFJfSU5TVEFUKTsKKwkJCXNrZ2Vfd3JpdGUxNihodywgU0tfUkVHKDAsIFJYX01GRl9DVFJMMiksIE1GRl9DTFJfSU5TVEFUKTsKIAl9IGVsc2UgewogCQkvKiBUaW1lc3RhbXAgKHVudXNlZCkgb3ZlcmZsb3cgKi8KIAkJaWYgKGh3c3RhdHVzICYgSVNfSVJRX1RJU1RfT1YpCkBAIC0yODAzLDggKzI3NTMsOCBAQAogCiAJCQlpZiAoaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9HRU5FU0lTKQogCQkJCXl1a29uX3BoeV9pbnRyKHNrZ2UpOwotCQkJZWxzZSBpZiAoaHctPnBoeV90eXBlID09IFNLX1BIWV9CQ09NKQotCQkJCWdlbmVzaXNfYmNvbV9pbnRyKHNrZ2UpOworCQkJZWxzZQorCQkJCWJjb21fcGh5X2ludHIoc2tnZSk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2soJmh3LT5waHlfbG9jayk7CkBAIC0yODI0LDE5ICsyNzc0LDE0IEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAogCXN0YXR1cyAmPSBody0+aW50cl9tYXNrOwotCi0JaWYgKChzdGF0dXMgJiBJU19SMV9GKSAmJiBuZXRpZl9yeF9zY2hlZHVsZV9wcmVwKGh3LT5kZXZbMF0pKSB7Ci0JCXN0YXR1cyAmPSB+SVNfUjFfRjsKKwlpZiAoc3RhdHVzICYgSVNfUjFfRikgewogCQlody0+aW50cl9tYXNrICY9IH5JU19SMV9GOwotCQlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOwotCQlfX25ldGlmX3J4X3NjaGVkdWxlKGh3LT5kZXZbMF0pOworCQluZXRpZl9yeF9zY2hlZHVsZShody0+ZGV2WzBdKTsKIAl9CiAKLQlpZiAoKHN0YXR1cyAmIElTX1IyX0YpICYmIG5ldGlmX3J4X3NjaGVkdWxlX3ByZXAoaHctPmRldlsxXSkpIHsKLQkJc3RhdHVzICY9IH5JU19SMl9GOworCWlmIChzdGF0dXMgJiBJU19SMl9GKSB7CiAJCWh3LT5pbnRyX21hc2sgJj0gfklTX1IyX0Y7Ci0JCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7Ci0JCV9fbmV0aWZfcnhfc2NoZWR1bGUoaHctPmRldlsxXSk7CisJCW5ldGlmX3J4X3NjaGVkdWxlKGh3LT5kZXZbMV0pOwogCX0KIAogCWlmIChzdGF0dXMgJiBJU19YQTFfRikKQEAgLTI4NDUsOSArMjc5MCwyNyBAQAogCWlmIChzdGF0dXMgJiBJU19YQTJfRikKIAkJc2tnZV90eF9pbnRyKGh3LT5kZXZbMV0pOwogCisJaWYgKHN0YXR1cyAmIElTX1BBX1RPX1JYMSkgeworCQlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoaHctPmRldlswXSk7CisJCSsrc2tnZS0+bmV0X3N0YXRzLnJ4X292ZXJfZXJyb3JzOworCQlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19SWDEpOworCX0KKworCWlmIChzdGF0dXMgJiBJU19QQV9UT19SWDIpIHsKKwkJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGh3LT5kZXZbMV0pOworCQkrK3NrZ2UtPm5ldF9zdGF0cy5yeF9vdmVyX2Vycm9yczsKKwkJc2tnZV93cml0ZTE2KGh3LCBCM19QQV9DVFJMLCBQQV9DTFJfVE9fUlgyKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgSVNfUEFfVE9fVFgxKQorCQlza2dlX3dyaXRlMTYoaHcsIEIzX1BBX0NUUkwsIFBBX0NMUl9UT19UWDEpOworCisJaWYgKHN0YXR1cyAmIElTX1BBX1RPX1RYMikKKwkJc2tnZV93cml0ZTE2KGh3LCBCM19QQV9DVFJMLCBQQV9DTFJfVE9fVFgyKTsKKwogCWlmIChzdGF0dXMgJiBJU19NQUMxKQogCQlza2dlX21hY19pbnRyKGh3LCAwKTsKLQkKKwogCWlmIChzdGF0dXMgJiBJU19NQUMyKQogCQlza2dlX21hY19pbnRyKGh3LCAxKTsKIApAQCAtMjg1OSw4ICsyODIyLDcgQEAKIAkJdGFza2xldF9zY2hlZHVsZSgmaHctPmV4dF90YXNrbGV0KTsKIAl9CiAKLQlpZiAoc3RhdHVzKQotCQlza2dlX3dyaXRlMzIoaHcsIEIwX0lNU0ssIGh3LT5pbnRyX21hc2spOworCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0yOTA0LDkgKzI4NjYsNiBAQAogCXsgQ0hJUF9JRF9ZVUtPTiwJICJZdWtvbiIgfSwKIAl7IENISVBfSURfWVVLT05fTElURSwJICJZdWtvbi1MaXRlIn0sCiAJeyBDSElQX0lEX1lVS09OX0xQLAkgIll1a29uLUxQIn0sCi0JeyBDSElQX0lEX1lVS09OX1hMLAkgIll1a29uLTIgWEwifSwKLQl7IENISVBfSURfWVVLT05fRUMsCSAiWVVLT04tMiBFQyJ9LAotCXsgQ0hJUF9JRF9ZVUtPTl9GRSwJICJZVUtPTi0yIEZFIn0sCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2tnZV9ib2FyZF9uYW1lKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodykKQEAgLTI5MzAsOCArMjg4OSw4IEBACiBzdGF0aWMgaW50IHNrZ2VfcmVzZXQoc3RydWN0IHNrZ2VfaHcgKmh3KQogewogCXUxNiBjdHN0OwotCXU4IHQ4OwotCWludCBpLCBwb3J0czsKKwl1OCB0OCwgbWFjX2NmZzsKKwlpbnQgaTsKIAogCWN0c3QgPSBza2dlX3JlYWQxNihodywgQjBfQ1RTVCk7CiAKQEAgLTI5NTIsMTIgKzI5MTEsOSBAQAogCWh3LT5waHlfdHlwZSA9IHNrZ2VfcmVhZDgoaHcsIEIyX0VfMSkgJiAweGY7CiAJaHctPnBtZF90eXBlID0gc2tnZV9yZWFkOChodywgQjJfUE1EX1RZUCk7CiAKLQlzd2l0Y2goaHctPmNoaXBfaWQpIHsKKwlzd2l0Y2ggKGh3LT5jaGlwX2lkKSB7CiAJY2FzZSBDSElQX0lEX0dFTkVTSVM6CiAJCXN3aXRjaCAoaHctPnBoeV90eXBlKSB7Ci0JCWNhc2UgU0tfUEhZX1hNQUM6Ci0JCQlody0+cGh5X2FkZHIgPSBQSFlfQUREUl9YTUFDOwotCQkJYnJlYWs7CiAJCWNhc2UgU0tfUEhZX0JDT006CiAJCQlody0+cGh5X2FkZHIgPSBQSFlfQUREUl9CQ09NOwogCQkJYnJlYWs7CkBAIC0yOTg2LDggKzI5NDIsOSBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JaHctPm1hY19jZmcgPSBza2dlX3JlYWQ4KGh3LCBCMl9NQUNfQ0ZHKTsKLQlwb3J0cyA9IGlzZHVhbHBvcnQoaHcpID8gMiA6IDE7CisJbWFjX2NmZyA9IHNrZ2VfcmVhZDgoaHcsIEIyX01BQ19DRkcpOworCWh3LT5wb3J0cyA9IChtYWNfY2ZnICYgQ0ZHX1NOR19NQUMpID8gMSA6IDI7CisJaHctPmNoaXBfcmV2ID0gKG1hY19jZmcgJiBDRkdfQ0hJUF9SX01TSykgPj4gNDsKIAogCS8qIHJlYWQgdGhlIGFkYXB0ZXJzIFJBTSBzaXplICovCiAJdDggPSBza2dlX3JlYWQ4KGh3LCBCMl9FXzApOwpAQCAtMzAxMCw5ICsyOTY3LDkgQEAKIAkJLyogc3dpdGNoIHBvd2VyIHRvIFZDQyAoV0EgZm9yIFZBVVggcHJvYmxlbSkgKi8KIAkJc2tnZV93cml0ZTgoaHcsIEIwX1BPV0VSX0NUUkwsCiAJCQkgICAgUENfVkFVWF9FTkEgfCBQQ19WQ0NfRU5BIHwgUENfVkFVWF9PRkYgfCBQQ19WQ0NfT04pOwotCQlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykgewotCQkJc2tnZV93cml0ZTE2KGh3LCBTS0dFTUFDX1JFRyhpLCBHTUFDX0xJTktfQ1RSTCksIEdNTENfUlNUX1NFVCk7Ci0JCQlza2dlX3dyaXRlMTYoaHcsIFNLR0VNQUNfUkVHKGksIEdNQUNfTElOS19DVFJMKSwgR01MQ19SU1RfQ0xSKTsKKwkJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKSB7CisJCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhpLCBHTUFDX0xJTktfQ1RSTCksIEdNTENfUlNUX1NFVCk7CisJCQlza2dlX3dyaXRlMTYoaHcsIFNLX1JFRyhpLCBHTUFDX0xJTktfQ1RSTCksIEdNTENfUlNUX0NMUik7CiAJCX0KIAl9CiAKQEAgLTMwMjIsOCArMjk3OSw4IEBACiAJc2tnZV93cml0ZTgoaHcsIEIwX0xFRCwgTEVEX1NUQVRfT04pOwogCiAJLyogZW5hYmxlIHRoZSBUeCBBcmJpdGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsrKQotCQlza2dlX3dyaXRlOChodywgU0tHRU1BQ19SRUcoaSwgVFhBX0NUUkwpLCBUWEFfRU5BX0FSQik7CisJZm9yIChpID0gMDsgaSA8IGh3LT5wb3J0czsgaSsrKQorCQlza2dlX3dyaXRlOChodywgU0tfUkVHKGksIFRYQV9DVFJMKSwgVFhBX0VOQV9BUkIpOwogCiAJLyogSW5pdGlhbGl6ZSByYW0gaW50ZXJmYWNlICovCiAJc2tnZV93cml0ZTE2KGh3LCBCM19SSV9DVFJMLCBSSV9SU1RfQ0xSKTsKQEAgLTMwNTAsMTYgKzMwMDcsMTQgQEAKIAlza2dlX3dyaXRlMzIoaHcsIEIyX0lSUU1fSU5JLCBza2dlX3VzZWNzMmNsayhodywgMTAwKSk7CiAJc2tnZV93cml0ZTMyKGh3LCBCMl9JUlFNX0NUUkwsIFRJTV9TVEFSVCk7CiAKLQlody0+aW50cl9tYXNrID0gSVNfSFdfRVJSIHwgSVNfRVhUX1JFRyB8IElTX1BPUlRfMTsKLQlpZiAoaXNkdWFscG9ydChodykpCi0JCWh3LT5pbnRyX21hc2sgfD0gSVNfUE9SVF8yOworCWh3LT5pbnRyX21hc2sgPSBJU19IV19FUlIgfCBJU19FWFRfUkVHOwogCXNrZ2Vfd3JpdGUzMihodywgQjBfSU1TSywgaHctPmludHJfbWFzayk7CiAKIAlpZiAoaHctPmNoaXBfaWQgIT0gQ0hJUF9JRF9HRU5FU0lTKQogCQlza2dlX3dyaXRlOChodywgR01BQ19JUlFfTVNLLCAwKTsKIAogCXNwaW5fbG9ja19iaCgmaHctPnBoeV9sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgewogCQlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9HRU5FU0lTKQogCQkJZ2VuZXNpc19yZXNldChodywgaSk7CiAJCWVsc2UKQEAgLTMwNzEsNyArMzAyNiw4IEBACiB9CiAKIC8qIEluaXRpYWxpemUgbmV0d29yayBkZXZpY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc2tnZV9kZXZpbml0KHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNrZ2VfZGV2aW5pdChzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LAorCQkJCSAgICAgICBpbnQgaGlnaG1lbSkKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YoKnNrZ2UpKTsKQEAgLTMxMDQsNiArMzA2MCw4IEBACiAjZW5kaWYKIAlkZXYtPmlycSA9IGh3LT5wZGV2LT5pcnE7CiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfTExUWDsKKwlpZiAoaGlnaG1lbSkKKwkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAKIAlza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlza2dlLT5uZXRkZXYgPSBkZXY7CkBAIC0zMTE3LDcgKzMwNzUsNyBAQAogCXNrZ2UtPmZsb3dfY29udHJvbCA9IEZMT1dfTU9ERV9TWU1NRVRSSUM7CiAJc2tnZS0+ZHVwbGV4ID0gLTE7CiAJc2tnZS0+c3BlZWQgPSAtMTsKLQlza2dlLT5hZHZlcnRpc2luZyA9IHNrZ2VfbW9kZXMoaHcpOworCXNrZ2UtPmFkdmVydGlzaW5nID0gc2tnZV9zdXBwb3J0ZWRfbW9kZXMoaHcpOwogCiAJaHctPmRldltwb3J0XSA9IGRldjsKIApAQCAtMzEyNSwxMCArMzA4Myw2IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmc2tnZS0+dHhfbG9jayk7CiAKLQlpbml0X3RpbWVyKCZza2dlLT5saW5rX2NoZWNrKTsKLQlza2dlLT5saW5rX2NoZWNrLmZ1bmN0aW9uID0gc2tnZV9saW5rX3RpbWVyOwotCXNrZ2UtPmxpbmtfY2hlY2suZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBza2dlOwotCiAJaW5pdF90aW1lcigmc2tnZS0+bGVkX2JsaW5rKTsKIAlza2dlLT5sZWRfYmxpbmsuZnVuY3Rpb24gPSBza2dlX2JsaW5rX3RpbWVyOwogCXNrZ2UtPmxlZF9ibGluay5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHNrZ2U7CkBAIC0zMjMyLDE0ICszMTg2LDExIEBACiAKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiYWRkciAweCVseCBpcnEgJWQgY2hpcCAlcyByZXYgJWRcbiIsCiAJICAgICAgIHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwgcGRldi0+aXJxLAotCSAgICAgICBza2dlX2JvYXJkX25hbWUoaHcpLCBjaGlwX3JldihodykpOworCSAgICAgICBza2dlX2JvYXJkX25hbWUoaHcpLCBody0+Y2hpcF9yZXYpOwogCi0JaWYgKChkZXYgPSBza2dlX2RldmluaXQoaHcsIDApKSA9PSBOVUxMKQorCWlmICgoZGV2ID0gc2tnZV9kZXZpbml0KGh3LCAwLCB1c2luZ19kYWMpKSA9PSBOVUxMKQogCQlnb3RvIGVycl9vdXRfbGVkX29mZjsKIAotCWlmICh1c2luZ19kYWMpCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwotCiAJaWYgKChlcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiJXM6IGNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwpAQCAtMzI0OCwxMCArMzE5OSw3IEBACiAKIAlza2dlX3Nob3dfYWRkcihkZXYpOwogCi0JaWYgKGlzZHVhbHBvcnQoaHcpICYmIChkZXYxID0gc2tnZV9kZXZpbml0KGh3LCAxKSkpIHsKLQkJaWYgKHVzaW5nX2RhYykKLQkJCWRldjEtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKLQorCWlmIChody0+cG9ydHMgPiAxICYmIChkZXYxID0gc2tnZV9kZXZpbml0KGh3LCAxLCB1c2luZ19kYWMpKSkgewogCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldjEpID09IDApCiAJCQlza2dlX3Nob3dfYWRkcihkZXYxKTsKIAkJZWxzZSB7CkBAIC0zMjg4LDcgKzMyMzYsNyBAQAogCXN0cnVjdCBza2dlX2h3ICpodyAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjAsICpkZXYxOwogCi0JaWYoIWh3KQorCWlmICghaHcpCiAJCXJldHVybjsKIAogCWlmICgoZGV2MSA9IGh3LT5kZXZbMV0pKQpAQCAtMzMxMSwxMiArMzI1OSwxMiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNrZ2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyIHN0YXRlKQorc3RhdGljIGludCBza2dlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpLCB3b2wgPSAwOwogCi0JZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltpXTsKIAogCQlpZiAoZGV2KSB7CkBAIC0zMzMxLDcgKzMyNzksNyBAQAogCX0KIAogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCXBjaV9lbmFibGVfd2FrZShwZGV2LCBzdGF0ZSwgd29sKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIHdvbCk7CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOwogCkBAIC0zMzQ5LDExICszMjk3LDExIEBACiAKIAlza2dlX3Jlc2V0KGh3KTsKIAotCWZvcihpID0gMDsgaSA8IDI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGh3LT5kZXZbaV07CiAJCWlmIChkZXYpIHsKIAkJCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKLQkJCWlmKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCQkJc2tnZV91cChkZXYpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5oIGIvZHJpdmVycy9uZXQvc2tnZS5oCmluZGV4IDM2YzYyYjYuLmZjZWQzZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuaAorKysgYi9kcml2ZXJzL25ldC9za2dlLmgKQEAgLTcsMzEgKzcsNyBAQAogLyogUENJIGNvbmZpZyByZWdpc3RlcnMgKi8KICNkZWZpbmUgUENJX0RFVl9SRUcxCTB4NDAKICNkZWZpbmUgUENJX0RFVl9SRUcyCTB4NDQKLSNpZm5kZWYgUENJX1ZQRAotI2RlZmluZSBQQ0lfVlBECQkweDUwCi0jZW5kaWYKLQotLyoJUENJX09VUl9SRUdfMgkJMzIgYml0CU91ciBSZWdpc3RlciAyICovCi1lbnVtIHsKLQlQQ0lfVlBEX1dSX1RIUiAgPSAweGZmPDwyNCwgLyogQml0IDMxLi4yNDoJVlBEIFdyaXRlIFRocmVzaG9sZCAqLwotCVBDSV9ERVZfU0VMCT0gMHg3Zjw8MTcsIC8qIEJpdCAyMy4uMTc6CUVFUFJPTSBEZXZpY2UgU2VsZWN0ICovCi0JUENJX1ZQRF9ST01fU1ogID0gNyAgIDw8MTQsIC8qIEJpdCAxNi4uMTQ6CVZQRCBST00gU2l6ZQkqLwotIAkJCQkgICAgLyogQml0IDEzLi4xMjoJcmVzZXJ2ZWQJKi8KLQlQQ0lfRU5fRFVNTVlfUkQgPSAxPDwzLCAvKiBFbmFibGUgRHVtbXkgUmVhZCAqLwotCVBDSV9SRVZfREVTQyAgICA9IDE8PDIsIC8qIFJldmVyc2UgRGVzYy4gQnl0ZXMgKi8KLQlQQ0lfVVNFREFUQTY0ICAgPSAxPDwwLCAvKiBVc2UgNjRCaXQgRGF0YSBidXMgZXh0ICovCi19OwotCi0vKglQQ0lfVlBEX0FEUl9SRUcJCTE2IGJpdAlWUEQgQWRkcmVzcyBSZWdpc3RlciAqLwotZW51bSB7Ci0JUENJX1ZQRF9GTEFHCT0gMTw8MTUsICAvKiBzdGFydHMgVlBEIHJkL3dyIGN5Y2xlICovCi0JUENJX1ZQRF9BRFJfTVNLID0weDdmZmZMLCAvKiBCaXQgMTQuLiAwOglWUEQgQWRkcmVzcyBNYXNrICovCi0JVlBEX1JFU19JRAk9IDB4ODIsCi0JVlBEX1JFU19SRUFECT0gMHg5MCwKLQlWUERfUkVTX1dSSVRFCT0gMHg4MSwKLQlWUERfUkVTX0VORAk9IDB4NzgsCi19OwotCisjZGVmaW5lICBQQ0lfUkVWX0RFU0MJIDB4NAogCiAjZGVmaW5lIFBDSV9TVEFUVVNfRVJST1JfQklUUyAoUENJX1NUQVRVU19ERVRFQ1RFRF9QQVJJVFkgfCBcCiAJCQkgICAgICAgUENJX1NUQVRVU19TSUdfU1lTVEVNX0VSUk9SIHwgXApAQCAtMzksNyArMTUsNiBAQAogCQkJICAgICAgIFBDSV9TVEFUVVNfUkVDX1RBUkdFVF9BQk9SVCB8IFwKIAkJCSAgICAgICBQQ0lfU1RBVFVTX1BBUklUWSkKIAotCiBlbnVtIGNzcl9yZWdzIHsKIAlCMF9SQVAJPSAweDAwMDAsCiAJQjBfQ1RTVAk9IDB4MDAwNCwKQEAgLTIyOSw4ICsyMDQsMTEgQEAKIAlJU19YQTJfRgk9IDE8PDEsCQkvKiBRX1hBMiBFbmQgb2YgRnJhbWUgKi8KIAlJU19YQTJfQwk9IDE8PDAsCQkvKiBRX1hBMiBFbmNvZGluZyBFcnJvciAqLwogCi0JSVNfUE9SVF8xCT0gSVNfWEExX0Z8IElTX1IxX0Z8IElTX01BQzEsCi0JSVNfUE9SVF8yCT0gSVNfWEEyX0Z8IElTX1IyX0Z8IElTX01BQzIsCisJSVNfVE9fUE9SVDEJPSBJU19QQV9UT19SWDEgfCBJU19QQV9UT19UWDEsCisJSVNfVE9fUE9SVDIJPSBJU19QQV9UT19SWDIgfCBJU19QQV9UT19UWDIsCisKKwlJU19QT1JUXzEJPSBJU19YQTFfRnwgSVNfUjFfRiB8IElTX1RPX1BPUlQxIHwgSVNfTUFDMSwKKwlJU19QT1JUXzIJPSBJU19YQTJfRnwgSVNfUjJfRiB8IElTX1RPX1BPUlQyIHwgSVNfTUFDMiwKIH07CiAKIApAQCAtMjg4LDE0ICsyNjYsNiBAQAogCUNISVBfUkVWX1lVX0xJVEVfQTMgID0gNywJLyogQ2hpcCBSZXYuIGZvciBZVUtPTi1MaXRlIEEzICovCiB9OwogCi0vKglCMl9MRF9URVNUCQkgOCBiaXQJRVBST00gbG9hZGVyIHRlc3QgcmVnaXN0ZXIgKi8KLWVudW0gewotCUxEX1RfT04JCT0gMTw8MywJLyogTG9hZGVyIFRlc3QgbW9kZSBvbiAqLwotCUxEX1RfT0ZGCT0gMTw8MiwJLyogTG9hZGVyIFRlc3QgbW9kZSBvZmYgKi8KLQlMRF9UX1NURVAJPSAxPDwxLAkvKiBEZWNyZW1lbnQgRlBST00gYWRkci4gQ291bnRlciAqLwotCUxEX1NUQVJUCT0gMTw8MCwJLyogU3RhcnQgbG9hZGluZyBGUFJPTSAqLwotfTsKLQogLyoJQjJfVElfQ1RSTAkJIDggYml0CVRpbWVyIGNvbnRyb2wgKi8KIC8qCUIyX0lSUU1fQ1RSTAkgOCBiaXQJSVJRIE1vZGVyYXRpb24gVGltZXIgQ29udHJvbCAqLwogZW51bSB7CkBAIC0zMTMsMTYgKzI4Myw2IEBACiAJVElNX1RfU1RFUAk9IDE8PDAsCS8qIFRlc3Qgc3RlcCAqLwogfTsKIAotLyoJQjI4X0RQVF9JTkkJMzIgYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBJbml0IFZhbCAqLwotLyoJQjI4X0RQVF9WQUwJMzIgYml0CURlc2NyaXB0b3IgUG9sbCBUaW1lciBDdXJyIFZhbCAqLwotLyoJQjI4X0RQVF9DVFJMCSA4IGJpdAlEZXNjcmlwdG9yIFBvbGwgVGltZXIgQ3RybCBSZWcgKi8KLWVudW0gewotCURQVF9NU0sJPSAweDAwZmZmZmZmTCwJLyogQml0IDIzLi4gMDoJRGVzYyBQb2xsIFRpbWVyIEJpdHMgKi8KLQotCURQVF9TVEFSVAk9IDE8PDEsCS8qIFN0YXJ0IERlc2NyaXB0b3IgUG9sbCBUaW1lciAqLwotCURQVF9TVE9QCT0gMTw8MCwJLyogU3RvcCAgRGVzY3JpcHRvciBQb2xsIFRpbWVyICovCi19OwotCiAvKglCMl9HUF9JTwkJMzIgYml0CUdlbmVyYWwgUHVycG9zZSBJL08gUmVnaXN0ZXIgKi8KIGVudW0gewogCUdQX0RJUl85ID0gMTw8MjUsIC8qIElPXzkgZGlyZWN0LCAwPUluLzE9T3V0ICovCkBAIC0zNDgsMzAgKzMwOCw2IEBACiAJR1BfSU9fMAk9IDE8PDAsCS8qIElPXzAgcGluICovCiB9OwogCi0vKiBSeC9UeCBQYXRoIHJlbGF0ZWQgQXJiaXRlciBUZXN0IFJlZ2lzdGVycyAqLwotLyoJQjNfTUFfVE9fVEVTVAkxNiBiaXQJTUFDIEFyYml0ZXIgVGltZW91dCBUZXN0IFJlZyAqLwotLyoJQjNfTUFfUkNfVEVTVAkxNiBiaXQJTUFDIEFyYml0ZXIgUmVjb3ZlcnkgVGVzdCBSZWcgKi8KLS8qCUIzX1BBX1RFU1QJCTE2IGJpdAlQYWNrZXQgQXJiaXRlciBUZXN0IFJlZ2lzdGVyICovCi0vKgkJCUJpdCAxNSwgMTEsIDcsIGFuZCAzIGFyZSByZXNlcnZlZCBpbiBCM19QQV9URVNUICovCi1lbnVtIHsKLQlUWDJfVF9FVgk9IDE8PDE1LC8qIFRYMiBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLwotCVRYMl9UX09OCT0gMTw8MTQsLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBUZXN0IE9uICovCi0JVFgyX1RfT0ZGCT0gMTw8MTMsLyogVFgyIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCi0JVFgyX1RfU1RFUAk9IDE8PDEyLC8qIFRYMiBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLwotCVRYMV9UX0VWCT0gMTw8MTEsLyogVFgxIFRpbWVvdXQvUmVjdiBFdmVudCBvY2N1cmVkICovCi0JVFgxX1RfT04JPSAxPDwxMCwvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFRlc3QgT24gKi8KLQlUWDFfVF9PRkYJPSAxPDw5LAkvKiBUWDEgVGltZW91dC9SZWN2IFRpbWVyIFRzdCBPZmYgKi8KLQlUWDFfVF9TVEVQCT0gMTw8OCwJLyogVFgxIFRpbWVvdXQvUmVjdiBUaW1lciBTdGVwICovCi0JUlgyX1RfRVYJPSAxPDw3LAkvKiBSWDIgVGltZW91dC9SZWN2IEV2ZW50IG9jY3VyZWQgKi8KLQlSWDJfVF9PTgk9IDE8PDYsCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgVGVzdCBPbiAqLwotCVJYMl9UX09GRgk9IDE8PDUsCS8qIFJYMiBUaW1lb3V0L1JlY3YgVGltZXIgVHN0IE9mZiAqLwotCVJYMl9UX1NURVAJPSAxPDw0LAkvKiBSWDIgVGltZW91dC9SZWN2IFRpbWVyIFN0ZXAgKi8KLQlSWDFfVF9FVgk9IDE8PDMsCS8qIFJYMSBUaW1lb3V0L1JlY3YgRXZlbnQgb2NjdXJlZCAqLwotCVJYMV9UX09OCT0gMTw8MiwJLyogUlgxIFRpbWVvdXQvUmVjdiBUaW1lciBUZXN0IE9uICovCi0JUlgxX1RfT0ZGCT0gMTw8MSwJLyogUlgxIFRpbWVvdXQvUmVjdiBUaW1lciBUc3QgT2ZmICovCi0JUlgxX1RfU1RFUAk9IDE8PDAsCS8qIFJYMSBUaW1lb3V0L1JlY3YgVGltZXIgU3RlcCAqLwotfTsKLQogLyogRGVzY3JpcHRvciBCaXQgRGVmaW5pdGlvbiAqLwogLyoJVHhDdHJsCQlUcmFuc21pdCBCdWZmZXIgQ29udHJvbCBGaWVsZCAqLwogLyoJUnhDdHJsCQlSZWNlaXZlICBCdWZmZXIgQ29udHJvbCBGaWVsZCAqLwpAQCAtNDI4LDE0ICszNjQsNiBAQAogCVJJX1JTVF9TRVQJPSAxPDwwLAkvKiBTZXQgICBSQU0gSW50ZXJmYWNlIFJlc2V0ICovCiB9OwogCi0vKglCM19SSV9URVNUCQkgOCBiaXQJUkFNIElmYWNlIFRlc3QgUmVnaXN0ZXIgKi8KLWVudW0gewotCVJJX1RfRVYJPSAxPDwzLAkvKiBUaW1lb3V0IEV2ZW50IG9jY3VyZWQgKi8KLQlSSV9UX09OCT0gMTw8MiwJLyogVGltZW91dCBUaW1lciBUZXN0IE9uICovCi0JUklfVF9PRkYJPSAxPDwxLAkvKiBUaW1lb3V0IFRpbWVyIFRlc3QgT2ZmICovCi0JUklfVF9TVEVQCT0gMTw8MCwJLyogVGltZW91dCBUaW1lciBTdGVwICovCi19OwotCiAvKiBNQUMgQXJiaXRlciBSZWdpc3RlcnMgKi8KIC8qCUIzX01BX1RPX0NUUkwJMTYgYml0CU1BQyBBcmJpdGVyIFRpbWVvdXQgQ3RybCBSZWcgKi8KIGVudW0gewpAQCAtNDUyLDE5ICszODAsNiBAQAogI2RlZmluZSBTS19QS1RfVE9fTUFYCTB4ZmZmZgkJLyogTWF4aW11bSB2YWx1ZSAqLwogI2RlZmluZSBTS19SSV9UT181MwkzNgkJLyogUkFNIGludGVyZmFjZSB0aW1lb3V0ICovCiAKLQotLyoJQjNfTUFfUkNfQ1RSTAkxNiBiaXQJTUFDIEFyYml0ZXIgUmVjb3ZlcnkgQ3RybCBSZWcgKi8KLWVudW0gewotCU1BX0VOQV9SRUNfVFgyCT0gMTw8NywJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBUWDIgKi8KLQlNQV9ESVNfUkVDX1RYMgk9IDE8PDYsCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgVFgyICovCi0JTUFfRU5BX1JFQ19UWDEJPSAxPDw1LAkvKiBFbmFibGUgIFJlY292ZXJ5IFRpbWVyIFRYMSAqLwotCU1BX0RJU19SRUNfVFgxCT0gMTw8NCwJLyogRGlzYWJsZSBSZWNvdmVyeSBUaW1lciBUWDEgKi8KLQlNQV9FTkFfUkVDX1JYMgk9IDE8PDMsCS8qIEVuYWJsZSAgUmVjb3ZlcnkgVGltZXIgUlgyICovCi0JTUFfRElTX1JFQ19SWDIJPSAxPDwyLAkvKiBEaXNhYmxlIFJlY292ZXJ5IFRpbWVyIFJYMiAqLwotCU1BX0VOQV9SRUNfUlgxCT0gMTw8MSwJLyogRW5hYmxlICBSZWNvdmVyeSBUaW1lciBSWDEgKi8KLQlNQV9ESVNfUkVDX1JYMQk9IDE8PDAsCS8qIERpc2FibGUgUmVjb3ZlcnkgVGltZXIgUlgxICovCi19OwotCiAvKiBQYWNrZXQgQXJiaXRlciBSZWdpc3RlcnMgKi8KIC8qCUIzX1BBX0NUUkwJCTE2IGJpdAlQYWNrZXQgQXJiaXRlciBDdHJsIFJlZ2lzdGVyICovCiBlbnVtIHsKQEAgLTQ4OCw3ICs0MDMsNyBAQAogCQkJCQkJUEFfRU5BX1RPX1RYMSB8IFBBX0VOQV9UT19UWDIpCiAKIAotLyogVHJhbnNtaXQgQXJiaXRlciBSZWdpc3RlcnMgTUFDIDEgYW5kIDIsIHVzZSBNUl9BRERSKCkgdG8gYWNjZXNzICovCisvKiBUcmFuc21pdCBBcmJpdGVyIFJlZ2lzdGVycyBNQUMgMSBhbmQgMiwgdXNlIFNLX1JFRygpIHRvIGFjY2VzcyAqLwogLyoJVFhBX0lUSV9JTkkJCTMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgSW5pdCBWYWwgKi8KIC8qCVRYQV9JVElfVkFMCQkzMiBiaXQJVHggQXJiIEludGVydmFsIFRpbWVyIFZhbHVlICovCiAvKglUWEFfTElNX0lOSQkJMzIgYml0CVR4IEFyYiBMaW1pdCBDb3VudGVyIEluaXQgVmFsICovCkBAIC01MTEsNyArNDI2LDcgQEAKIC8qCiAgKglCYW5rIDQgLSA1CiAgKi8KLS8qIFRyYW5zbWl0IEFyYml0ZXIgUmVnaXN0ZXJzIE1BQyAxIGFuZCAyLCB1c2UgTVJfQUREUigpIHRvIGFjY2VzcyAqLworLyogVHJhbnNtaXQgQXJiaXRlciBSZWdpc3RlcnMgTUFDIDEgYW5kIDIsIHVzZSBTS19SRUcoKSB0byBhY2Nlc3MgKi8KIGVudW0gewogCVRYQV9JVElfSU5JCT0gMHgwMjAwLC8qIDMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgSW5pdCBWYWwqLwogCVRYQV9JVElfVkFMCT0gMHgwMjA0LC8qIDMyIGJpdAlUeCBBcmIgSW50ZXJ2YWwgVGltZXIgVmFsdWUgKi8KQEAgLTUzNyw3ICs0NTIsNyBAQAogCiAvKiBRdWV1ZSBSZWdpc3RlciBPZmZzZXRzLCB1c2UgUV9BRERSKCkgdG8gYWNjZXNzICovCiBlbnVtIHsKLQlCOF9RX1JFR1MgPSAweDA0MDAsIC8qIGJhc2Ugb2YgUXVldWUgcmVnaXN0ZXJzICovCQorCUI4X1FfUkVHUyA9IDB4MDQwMCwgLyogYmFzZSBvZiBRdWV1ZSByZWdpc3RlcnMgKi8KIAlRX0QJPSAweDAwLAkvKiA4KjMyCWJpdAlDdXJyZW50IERlc2NyaXB0b3IgKi8KIAlRX0RBX0wJPSAweDIwLAkvKiAzMiBiaXQJQ3VycmVudCBEZXNjcmlwdG9yIEFkZHJlc3MgTG93IGRXb3JkICovCiAJUV9EQV9ICT0gMHgyNCwJLyogMzIgYml0CUN1cnJlbnQgRGVzY3JpcHRvciBBZGRyZXNzIEhpZ2ggZFdvcmQgKi8KQEAgLTYxOCw4ICs1MzMsNyBAQAogZW51bSB7CiAJUEhZX0FERFJfWE1BQwk9IDA8PDgsCiAJUEhZX0FERFJfQkNPTQk9IDE8PDgsCi0JUEhZX0FERFJfTE9ORQk9IDM8PDgsCi0JUEhZX0FERFJfTkFUCT0gMDw8OCwKKwogLyogR1BIWSBhZGRyZXNzIChiaXRzIDE1Li4xMSBvZiBTTUkgY29udHJvbCByZWcpICovCiAJUEhZX0FERFJfTUFSVgk9IDAsCiB9OwpAQCAtOTg2LDcgKzkwMCw3IEBACiAJTElOS0xFRF9CTElOS19PRkYgICAgPSAweDEwLAogCUxJTktMRURfQkxJTktfT04gICAgID0gMHgyMCwKIH07Ci0JCisKIC8qIEdNQUMgYW5kIEdQSFkgQ29udHJvbCBSZWdpc3RlcnMgKFlVS09OIG9ubHkpICovCiBlbnVtIHsKIAlHTUFDX0NUUkwJPSAweDBmMDAsLyogMzIgYml0CUdNQUMgQ29udHJvbCBSZWcgKi8KQEAgLTExNTEsNTQgKzEwNjUsNiBAQAogCVBIWV9NQVJWX0ZFX1NQRUNfMgk9IDB4MWMsLyogMTYgYml0IHIvdwlTcGVjaWZpYyBDb250cm9sIFJlZy4gMiAqLwogfTsKIAotLyogTGV2ZWwgT25lLVBIWSBSZWdpc3RlcnMsIGluZGlyZWN0IGFkZHJlc3NlZCBvdmVyIFhNQUMgKi8KLWVudW0gewotCVBIWV9MT05FX0NUUkwJCT0gMHgwMCwvKiAxNiBiaXQgci93CVBIWSBDb250cm9sIFJlZ2lzdGVyICovCi0JUEhZX0xPTkVfU1RBVAkJPSAweDAxLC8qIDE2IGJpdCByL28JUEhZIFN0YXR1cyBSZWdpc3RlciAqLwotCVBIWV9MT05FX0lEMAkJPSAweDAyLC8qIDE2IGJpdCByL28JUEhZIElEMCBSZWdpc3RlciAqLwotCVBIWV9MT05FX0lEMQkJPSAweDAzLC8qIDE2IGJpdCByL28JUEhZIElEMSBSZWdpc3RlciAqLwotCVBIWV9MT05FX0FVTkVfQURWCT0gMHgwNCwvKiAxNiBiaXQgci93CUF1dG8tTmVnLiBBZHZlcnRpc2VtZW50ICovCi0JUEhZX0xPTkVfQVVORV9MUAk9IDB4MDUsLyogMTYgYml0IHIvbwlMaW5rIFBhcnQgQWJpbGl0eSBSZWcgKi8KLQlQSFlfTE9ORV9BVU5FX0VYUAk9IDB4MDYsLyogMTYgYml0IHIvbwlBdXRvLU5lZy4gRXhwYW5zaW9uIFJlZyAqLwotCVBIWV9MT05FX05FUEcJCT0gMHgwNywvKiAxNiBiaXQgci93CU5leHQgUGFnZSBSZWdpc3RlciAqLwotCVBIWV9MT05FX05FUEdfTFAJPSAweDA4LC8qIDE2IGJpdCByL28JTmV4dCBQYWdlIExpbmsgUGFydG5lciAqLwotCS8qIExldmVsIE9uZS1zcGVjaWZpYyByZWdpc3RlcnMgKi8KLQlQSFlfTE9ORV8xMDAwVF9DVFJMCT0gMHgwOSwvKiAxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KLQlQSFlfTE9ORV8xMDAwVF9TVEFUCT0gMHgwYSwvKiAxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqLwotCVBIWV9MT05FX0VYVF9TVEFUCT0gMHgwZiwvKiAxNiBiaXQgci9vCUV4dGVuZGVkIFN0YXR1cyBSZWcgKi8KLQlQSFlfTE9ORV9QT1JUX0NGRwk9IDB4MTAsLyogMTYgYml0IHIvdwlQb3J0IENvbmZpZ3VyYXRpb24gUmVnKi8KLQlQSFlfTE9ORV9RX1NUQVQJCT0gMHgxMSwvKiAxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcgKi8KLQlQSFlfTE9ORV9JTlRfRU5BQgk9IDB4MTIsLyogMTYgYml0IHIvdwlJbnRlcnJ1cHQgRW5hYmxlIFJlZyAqLwotCVBIWV9MT05FX0lOVF9TVEFUCT0gMHgxMywvKiAxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICovCi0JUEhZX0xPTkVfTEVEX0NGRwk9IDB4MTQsLyogMTYgYml0IHIvdwlMRUQgQ29uZmlndXJhdGlvbiBSZWcgKi8KLQlQSFlfTE9ORV9QT1JUX0NUUkwJPSAweDE1LC8qIDE2IGJpdCByL3cJUG9ydCBDb250cm9sIFJlZyAqLwotCVBIWV9MT05FX0NJTQkJPSAweDE2LC8qIDE2IGJpdCByL28JQ0lNIFJlZyAqLwotfTsKLQotLyogTmF0aW9uYWwtUEhZIFJlZ2lzdGVycywgaW5kaXJlY3QgYWRkcmVzc2VkIG92ZXIgWE1BQyAqLwotZW51bSB7Ci0JUEhZX05BVF9DVFJMCQk9IDB4MDAsLyogMTYgYml0IHIvdwlQSFkgQ29udHJvbCBSZWdpc3RlciAqLwotCVBIWV9OQVRfU1RBVAkJPSAweDAxLC8qIDE2IGJpdCByL3cJUEhZIFN0YXR1cyBSZWdpc3RlciAqLwotCVBIWV9OQVRfSUQwCQk9IDB4MDIsLyogMTYgYml0IHIvbwlQSFkgSUQwIFJlZ2lzdGVyICovCi0JUEhZX05BVF9JRDEJCT0gMHgwMywvKiAxNiBiaXQgci9vCVBIWSBJRDEgUmVnaXN0ZXIgKi8KLQlQSFlfTkFUX0FVTkVfQURWCT0gMHgwNCwvKiAxNiBiaXQgci93CUF1dG8tTmVnLiBBZHZlcnRpc2VtZW50ICovCi0JUEhZX05BVF9BVU5FX0xQCQk9IDB4MDUsLyogMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKi8KLQlQSFlfTkFUX0FVTkVfRVhQCT0gMHgwNiwvKiAxNiBiaXQgci9vCUF1dG8tTmVnLiBFeHBhbnNpb24gUmVnICovCi0JUEhZX05BVF9ORVBHCQk9IDB4MDcsLyogMTYgYml0IHIvdwlOZXh0IFBhZ2UgUmVnaXN0ZXIgKi8KLQlQSFlfTkFUX05FUEdfTFAJCT0gMHgwOCwvKiAxNiBiaXQgci9vCU5leHQgUGFnZSBMaW5rIFBhcnRuZXIgUmVnICovCi0JLyogTmF0aW9uYWwtc3BlY2lmaWMgcmVnaXN0ZXJzICovCi0JUEhZX05BVF8xMDAwVF9DVFJMCT0gMHgwOSwvKiAxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKi8KLQlQSFlfTkFUXzEwMDBUX1NUQVQJPSAweDBhLC8qIDE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICovCi0JUEhZX05BVF9FWFRfU1RBVAk9IDB4MGYsLyogMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKi8KLQlQSFlfTkFUX0VYVF9DVFJMMQk9IDB4MTAsLyogMTYgYml0IHIvbwlFeHRlbmRlZCBDb250cm9sIFJlZzEgKi8KLQlQSFlfTkFUX1FfU1RBVDEJCT0gMHgxMSwvKiAxNiBiaXQgci9vCVF1aWNrIFN0YXR1cyBSZWcxICovCi0JUEhZX05BVF8xMEJfT1AJCT0gMHgxMiwvKiAxNiBiaXQgci9vCTEwQmFzZS1UIE9wZXJhdGlvbnMgUmVnICovCi0JUEhZX05BVF9FWFRfQ1RSTDIJPSAweDEzLC8qIDE2IGJpdCByL28JRXh0ZW5kZWQgQ29udHJvbCBSZWcxICovCi0JUEhZX05BVF9RX1NUQVQyCQk9IDB4MTQsLyogMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnMiAqLwotCi0JUEhZX05BVF9QSFlfQUREUgk9IDB4MTksLyogMTYgYml0IHIvbwlQSFkgQWRkcmVzcyBSZWdpc3RlciAqLwotfTsKLQogZW51bSB7CiAJUEhZX0NUX1JFU0VUCT0gMTw8MTUsIC8qIEJpdCAxNTogKHNjKQljbGVhciBhbGwgUEhZIHJlbGF0ZWQgcmVncyAqLwogCVBIWV9DVF9MT09QCT0gMTw8MTQsIC8qIEJpdCAxNDoJZW5hYmxlIExvb3BiYWNrIG92ZXIgUEhZICovCkBAIC0xMjUzLDggKzExMTksMjkgQEAKIAlQSFlfTUFSVl9JRDFfWTIJPSAweDBDOTEsIC8qIFl1a29uLTIgKFBIWSA4OEUxMTEyKSAqLwogfTsKIAorLyogQWR2ZXJ0aXNlbWVudCByZWdpc3RlciBiaXRzICovCiBlbnVtIHsKIAlQSFlfQU5fTlhUX1BHCT0gMTw8MTUsIC8qIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KKwlQSFlfQU5fQUNLCT0gMTw8MTQsIC8qIEJpdCAxNDoJKHJvKSBBY2tub3dsZWRnZSBSZWNlaXZlZCAqLworCVBIWV9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCBCaXRzICovCisKKwlQSFlfQU5fUEFVU0VfQVNZTSA9IDE8PDExLC8qIEJpdCAxMToJVHJ5IGZvciBhc3ltbWV0cmljICovCisJUEhZX0FOX1BBVVNFX0NBUCA9IDE8PDEwLCAvKiBCaXQgMTA6CVRyeSBmb3IgcGF1c2UgKi8KKwlQSFlfQU5fMTAwQkFTRTQJPSAxPDw5LCAvKiBCaXQgOToJVHJ5IGZvciAxMDBtYnBzIDRrIHBhY2tldHMgKi8KKwlQSFlfQU5fMTAwRlVMTAk9IDE8PDgsIC8qIEJpdCA4OglUcnkgZm9yIDEwMG1icHMgZnVsbC1kdXBsZXggKi8KKwlQSFlfQU5fMTAwSEFMRgk9IDE8PDcsIC8qIEJpdCA3OglUcnkgZm9yIDEwMG1icHMgaGFsZi1kdXBsZXggKi8KKwlQSFlfQU5fMTBGVUxMCT0gMTw8NiwgLyogQml0IDY6CVRyeSBmb3IgMTBtYnBzIGZ1bGwtZHVwbGV4ICovCisJUEhZX0FOXzEwSEFMRgk9IDE8PDUsIC8qIEJpdCA1OglUcnkgZm9yIDEwbWJwcyBoYWxmLWR1cGxleCAqLworCVBIWV9BTl9DU01BCT0gMTw8MCwgLyogQml0IDA6CU9ubHkgc2VsZWN0b3Igc3VwcG9ydGVkICovCisJUEhZX0FOX1NFTAk9IDB4MWYsIC8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLworCVBIWV9BTl9GVUxMCT0gUEhZX0FOXzEwMEZVTEwgfCBQSFlfQU5fMTBGVUxMIHwgUEhZX0FOX0NTTUEsCisJUEhZX0FOX0FMTAk9IFBIWV9BTl8xMEhBTEYgfCBQSFlfQU5fMTBGVUxMIHwKKwkJICAJICBQSFlfQU5fMTAwSEFMRiB8IFBIWV9BTl8xMDBGVUxMLAorfTsKKworLyogWG1hYyBTcGVjaWZpYyAqLworZW51bSB7CisJUEhZX1hfQU5fTlhUX1BHCT0gMTw8MTUsIC8qIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KIAlQSFlfWF9BTl9BQ0sJPSAxPDwxNCwgLyogQml0IDE0Ogkocm8pIEFja25vd2xlZGdlIFJlY2VpdmVkICovCiAJUEhZX1hfQU5fUkZCCT0gMzw8MTIsLyogQml0IDEzLi4xMjoJUmVtb3RlIEZhdWx0IEJpdHMgKi8KIApAQCAtMTI2Myw4MiArMTE1MCw2IEBACiAJUEhZX1hfQU5fRkQJPSAxPDw1LCAvKiBCaXQgIDU6CUZ1bGwgRHVwbGV4ICovCiB9OwogCi1lbnVtIHsKLQlQSFlfQl9BTl9SRgk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW90ZSBGYXVsdCAqLwotCi0JUEhZX0JfQU5fQVNQCT0gMTw8MTEsIC8qIEJpdCAxMToJQXN5bW1ldHJpYyBQYXVzZSAqLwotCVBIWV9CX0FOX1BDCT0gMTw8MTAsIC8qIEJpdCAxMDoJUGF1c2UgQ2FwYWJsZSAqLwotCVBIWV9CX0FOX1NFTAk9IDB4MWYsIC8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLwotfTsKLQotZW51bSB7Ci0JUEhZX0xfQU5fUkYJPSAxPDwxMywgLyogQml0IDEzOglSZW1vdGUgRmF1bHQgKi8KLQkJCQkJCQkJLyogQml0IDEyOglyZXNlcnZlZCAqLwotCVBIWV9MX0FOX0FTUAk9IDE8PDExLCAvKiBCaXQgMTE6CUFzeW1tZXRyaWMgUGF1c2UgKi8KLQlQSFlfTF9BTl9QQwk9IDE8PDEwLCAvKiBCaXQgMTA6CVBhdXNlIENhcGFibGUgKi8KLQotCVBIWV9MX0FOX1NFTAk9IDB4MWYsIC8qIEJpdCA0Li4wOglTZWxlY3RvciBGaWVsZCwgMDAwMDE9RXRoZXJuZXQqLwotfTsKLQotLyogIFBIWV9OQVRfQVVORV9BRFYJMTYgYml0IHIvdwlBdXRvLU5lZ290aWF0aW9uIEFkdmVydGlzZW1lbnQgKi8KLS8qICBQSFlfTkFUX0FVTkVfTFAJMTYgYml0IHIvbwlMaW5rIFBhcnRuZXIgQWJpbGl0eSBSZWcgKioqKiovCi0vKiAgUEhZX0FOX05YVF9QRwkoc2VlIFhNQUMpIEJpdCAxNToJUmVxdWVzdCBOZXh0IFBhZ2UgKi8KLWVudW0gewotCVBIWV9OX0FOX1JGCT0gMTw8MTMsIC8qIEJpdCAxMzoJUmVtb3RlIEZhdWx0ICovCi0KLQlQSFlfTl9BTl8xMDBGCT0gMTw8MTEsIC8qIEJpdCAxMToJMTAwQmFzZS1UMiBGRCBTdXBwb3J0ICovCi0JUEhZX05fQU5fMTAwSAk9IDE8PDEwLCAvKiBCaXQgMTA6CTEwMEJhc2UtVDIgSEQgU3VwcG9ydCAqLwotCi0JUEhZX05fQU5fU0VMCT0gMHgxZiwgLyogQml0IDQuLjA6CVNlbGVjdG9yIEZpZWxkLCAwMDAwMT1FdGhlcm5ldCovCi19OwotCi0vKiBmaWVsZCB0eXBlIGRlZmluaXRpb24gZm9yIFBIWV94X0FOX1NFTCAqLwotZW51bSB7Ci0JUEhZX1NFTF9UWVBFCSA9IDEsCS8qIDAwMDAxID0gRXRoZXJuZXQgKi8KLX07Ci0KLWVudW0gewotCVBIWV9BTkVfTFBfTlAJPSAxPDwzLCAvKiBCaXQgIDM6CUxpbmsgUGFydG5lciBjYW4gTmV4dCBQYWdlICovCi0JUEhZX0FORV9MT0NfTlAJPSAxPDwyLCAvKiBCaXQgIDI6CUxvY2FsIFBIWSBjYW4gTmV4dCBQYWdlICovCi0JUEhZX0FORV9SWF9QRwk9IDE8PDEsIC8qIEJpdCAgMToJUGFnZSBSZWNlaXZlZCAqLwotfTsKLQotZW51bSB7Ci0JUEhZX0FORV9QQVJfREYJPSAxPDw0LCAvKiBCaXQgIDQ6CVBhcmFsbGVsIERldGVjdGlvbiBGYXVsdCAqLwotCi0JUEhZX0FORV9MUF9DQVAJPSAxPDwwLCAvKiBCaXQgIDA6CUxpbmsgUGFydG5lciBBdXRvLU5lZy4gQ2FwLiAqLyAJCi19OwotCi1lbnVtIHsKLQlQSFlfTlBfTU9SRQk9IDE8PDE1LCAvKiBCaXQgMTU6CU1vcmUsIE5leHQgUGFnZXMgdG8gZm9sbG93ICovCi0JUEhZX05QX0FDSzEJPSAxPDwxNCwgLyogQml0IDE0OiAocm8pCUFjazEsIGZvciByZWNlaXZpbmcgYSBtZXNzYWdlICovCi0JUEhZX05QX01TR19WQUwJPSAxPDwxMywgLyogQml0IDEzOglNZXNzYWdlIFBhZ2UgdmFsaWQgKi8KLQlQSFlfTlBfQUNLMgk9IDE8PDEyLCAvKiBCaXQgMTI6CUFjazIsIGNvbXBseSB3aXRoIG1zZyBjb250ZW50ICovCi0JUEhZX05QX1RPRwk9IDE8PDExLCAvKiBCaXQgMTE6CVRvZ2dsZSBCaXQsIGVuc3VyZSBzeW5jICovCi0JUEhZX05QX01TRwk9IDB4MDdmZiwgLyogQml0IDEwLi4wOglNZXNzYWdlIGZyb20vdG8gTGluayBQYXJ0bmVyICovCi19OwotCi1lbnVtIHsKLQlQSFlfWF9FWF9GRAk9IDE8PDE1LCAvKiBCaXQgMTU6CURldmljZSBTdXBwb3J0cyBGdWxsIER1cGxleCAqLwotCVBIWV9YX0VYX0hECT0gMTw8MTQsIC8qIEJpdCAxNDoJRGV2aWNlIFN1cHBvcnRzIEhhbGYgRHVwbGV4ICovCi19OwotCi1lbnVtIHsKLQlQSFlfWF9SU19QQVVTRQk9IDM8PDcsLyogQml0ICA4Li43OglzZWxlY3RlZCBQYXVzZSBNb2RlICovCi0JUEhZX1hfUlNfSEQJPSAxPDw2LCAvKiBCaXQgIDY6CUhhbGYgRHVwbGV4IE1vZGUgc2VsZWN0ZWQgKi8KLQlQSFlfWF9SU19GRAk9IDE8PDUsIC8qIEJpdCAgNToJRnVsbCBEdXBsZXggTW9kZSBzZWxlY3RlZCAqLwotCVBIWV9YX1JTX0FCTE1JUwk9IDE8PDQsIC8qIEJpdCAgNDoJZHVwbGV4IG9yIHBhdXNlIGNhcCBtaXNtYXRjaCAqLwotCVBIWV9YX1JTX1BBVU1JUwk9IDE8PDMsIC8qIEJpdCAgMzoJcGF1c2UgY2FwYWJpbGl0eSBtaXNtYXRjaCAqLwotfTsKLQotLyoqIFJlbW90ZSBGYXVsdCBCaXRzIChQSFlfWF9BTl9SRkIpIGVuY29kaW5nICAqLwotZW51bSB7Ci0JWF9SRkJfT0sJPSAwPDwxMiwvKiBCaXQgMTMuLjEyCU5vIGVycm9ycywgTGluayBPSyAqLwotCVhfUkZCX0xGCT0gMTw8MTIsIC8qIEJpdCAxMy4uMTIJTGluayBGYWlsdXJlICovCi0JWF9SRkJfT0ZGCT0gMjw8MTIsLyogQml0IDEzLi4xMglPZmZsaW5lICovCi0JWF9SRkJfQU5fRVJSCT0gMzw8MTIsLyogQml0IDEzLi4xMglBdXRvLU5lZ290aWF0aW9uIEVycm9yICovCi19OwotCiAvKiBQYXVzZSBCaXRzIChQSFlfWF9BTl9QQVVTRSBhbmQgUEhZX1hfUlNfUEFVU0UpIGVuY29kaW5nICovCiBlbnVtIHsKIAlQSFlfWF9QX05PX1BBVVNFCT0gMDw8NywvKiBCaXQgIDguLjc6CW5vIFBhdXNlIE1vZGUgKi8KQEAgLTE0MTgsNiArMTIyOSwxNiBAQAogCVBIWV9CX1BFU19NTFQzX0VSCT0gMTw8MCwgLyogQml0ICAwOglNTFQzIGNvZGUgRXJyb3IgKi8KIH07CiAKKy8qICBQSFlfQkNPTV9BVU5FX0FEVgkxNiBiaXQgci93CUF1dG8tTmVnb3RpYXRpb24gQWR2ZXJ0aXNlbWVudCAqKioqKi8KKy8qICBQSFlfQkNPTV9BVU5FX0xQCTE2IGJpdCByL28JTGluayBQYXJ0bmVyIEFiaWxpdHkgUmVnICoqKioqLworZW51bSB7CisJUEhZX0JfQU5fUkYJPSAxPDwxMywgLyogQml0IDEzOglSZW1vdGUgRmF1bHQgKi8KKworCVBIWV9CX0FOX0FTUAk9IDE8PDExLCAvKiBCaXQgMTE6CUFzeW1tZXRyaWMgUGF1c2UgKi8KKwlQSFlfQl9BTl9QQwk9IDE8PDEwLCAvKiBCaXQgMTA6CVBhdXNlIENhcGFibGUgKi8KK307CisKKwogLyoqKioqICBQSFlfQkNPTV9GQ19DVFIJCTE2IGJpdCByL3cJRmFsc2UgQ2FycmllciBDb3VudGVyICoqKioqLwogZW51bSB7CiAJUEhZX0JfRkNfQ1RSCT0gMHhmZiwgLyogQml0ICA3Li4wOglGYWxzZSBDYXJyaWVyIENvdW50ZXIgKi8KQEAgLTE0NzgsNyArMTI5OSw5IEBACiAJUEhZX0JfSVNfTFNUX0NIQU5HRQk9IDE8PDEsIC8qIEJpdCAgMToJTGluayBTdGF0dXMgQ2hhbmdlZCAqLwogCVBIWV9CX0lTX0NSQ19FUgk9IDE8PDAsIC8qIEJpdCAgMDoJQ1JDIEVycm9yICovCiB9OwotI2RlZmluZSBQSFlfQl9ERUZfTVNLCSh+KFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfTFNUX0NIQU5HRSkpCisjZGVmaW5lIFBIWV9CX0RFRl9NU0sJXAorCSh+KFBIWV9CX0lTX1BTRSB8IFBIWV9CX0lTX0FOX1BSIHwgUEhZX0JfSVNfRFVQX0NIQU5HRSB8IFwKKwkgICAgUEhZX0JfSVNfTFNQX0NIQU5HRSB8IFBIWV9CX0lTX0xTVF9DSEFOR0UpKQogCiAvKiBQYXVzZSBCaXRzIChQSFlfQl9BTl9BU1AgYW5kIFBIWV9CX0FOX1BDKSBlbmNvZGluZyAqLwogZW51bSB7CkBAIC0xNDk1LDE2NiArMTMxOCw2IEBACiAJUEhZX0JfUkVTXzEwMDBIRAk9IDY8PDgsLyogQml0IDEwLi44OgkxMDAwQmFzZS1UIEhhbGYgRHVwLiAqLwogfTsKIAotLyoKLSAqIExldmVsIE9uZS1TcGVjaWZpYwotICovCi0vKioqKiogIFBIWV9MT05FXzEwMDBUX0NUUkwJMTYgYml0IHIvdwkxMDAwQmFzZS1UIENvbnRyb2wgUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX0xfMTAwMENfVEVTVAk9IDc8PDEzLC8qIEJpdCAxNS4uMTM6CVRlc3QgTW9kZXMgKi8KLQlQSFlfTF8xMDAwQ19NU0UJPSAxPDwxMiwgLyogQml0IDEyOglNYXN0ZXIvU2xhdmUgRW5hYmxlICovCi0JUEhZX0xfMTAwMENfTVNDCT0gMTw8MTEsIC8qIEJpdCAxMToJTS9TIENvbmZpZ3VyYXRpb24gKi8KLQlQSFlfTF8xMDAwQ19SRAk9IDE8PDEwLCAvKiBCaXQgMTA6CVJlcGVhdGVyL0RURSAqLwotCVBIWV9MXzEwMDBDX0FGRAk9IDE8PDksIC8qIEJpdCAgOToJQWR2ZXJ0aXNlIEZ1bGwgRHVwbGV4ICovCi0JUEhZX0xfMTAwMENfQUhECT0gMTw8OCwgLyogQml0ICA4OglBZHZlcnRpc2UgSGFsZiBEdXBsZXggKi8KLX07Ci0KLS8qKioqKiAgUEhZX0xPTkVfMTAwMFRfU1RBVAkxNiBiaXQgci9vCTEwMDBCYXNlLVQgU3RhdHVzIFJlZyAqKioqKi8KLWVudW0gewotCVBIWV9MXzEwMDBTX01TRgk9IDE8PDE1LCAvKiBCaXQgMTU6CU1hc3Rlci9TbGF2ZSBGYXVsdCAqLwotCVBIWV9MXzEwMDBTX01TUgk9IDE8PDE0LCAvKiBCaXQgMTQ6CU1hc3Rlci9TbGF2ZSBSZXN1bHQgKi8KLQlQSFlfTF8xMDAwU19MUlMJPSAxPDwxMywgLyogQml0IDEzOglMb2NhbCBSZWNlaXZlciBTdGF0dXMgKi8KLQlQSFlfTF8xMDAwU19SUlMJPSAxPDwxMiwgLyogQml0IDEyOglSZW1vdGUgUmVjZWl2ZXIgU3RhdHVzICovCi0JUEhZX0xfMTAwMFNfTFBfRkQgPSAxPDwxMSwgLyogQml0IDExOglMaW5rIFBhcnRuZXIgY2FuIEZEICovCi0JUEhZX0xfMTAwMFNfTFBfSEQgPSAxPDwxMCwgLyogQml0IDEwOglMaW5rIFBhcnRuZXIgY2FuIEhEICovCi0KLQlQSFlfTF8xMDAwU19JRUMJID0gMHhmZiwgLyogQml0ICA3Li4wOglJZGxlIEVycm9yIENvdW50ICovCi0KLS8qKioqKiAgUEhZX0xPTkVfRVhUX1NUQVQJMTYgYml0IHIvbwlFeHRlbmRlZCBTdGF0dXMgUmVnaXN0ZXIgKioqKiovCi0JUEhZX0xfRVNfWF9GRF9DQVAgPSAxPDwxNSwgLyogQml0IDE1OgkxMDAwQmFzZS1YIEZEIGNhcGFibGUgKi8KLQlQSFlfTF9FU19YX0hEX0NBUCA9IDE8PDE0LCAvKiBCaXQgMTQ6CTEwMDBCYXNlLVggSEQgY2FwYWJsZSAqLwotCVBIWV9MX0VTX1RfRkRfQ0FQID0gMTw8MTMsIC8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCi0JUEhZX0xfRVNfVF9IRF9DQVAgPSAxPDwxMiwgLyogQml0IDEyOgkxMDAwQmFzZS1UIEhEIGNhcGFibGUgKi8KLX07Ci0KLS8qKioqKiAgUEhZX0xPTkVfUE9SVF9DRkcJMTYgYml0IHIvdwlQb3J0IENvbmZpZ3VyYXRpb24gUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX0xfUENfUkVQX01PREUJPSAxPDwxNSwgLyogQml0IDE1OglSZXBlYXRlciBNb2RlICovCi0KLQlQSFlfTF9QQ19UWF9ESVMJPSAxPDwxMywgLyogQml0IDEzOglUeCBvdXRwdXQgRGlzYWJsZWQgKi8KLQlQSFlfTF9QQ19CWV9TQ1IJPSAxPDwxMiwgLyogQml0IDEyOglCeXBhc3MgU2NyYW1ibGVyICovCi0JUEhZX0xfUENfQllfNDUJPSAxPDwxMSwgLyogQml0IDExOglCeXBhc3MgNEI1Qi1EZWNvZGVyICovCi0JUEhZX0xfUENfSkFCX0RJUwk9IDE8PDEwLCAvKiBCaXQgMTA6CUphYmJlciBEaXNhYmxlZCAqLwotCVBIWV9MX1BDX1NRRQk9IDE8PDksIC8qIEJpdCAgOToJRW5hYmxlIEhlYXJ0YmVhdCAqLwotCVBIWV9MX1BDX1RQX0xPT1AJPSAxPDw4LCAvKiBCaXQgIDg6CVRQIExvb3BiYWNrICovCi0JUEhZX0xfUENfU1NTCT0gMTw8NywgLyogQml0ICA3OglTbWFydCBTcGVlZCBTZWxlY3Rpb24gKi8KLQlQSFlfTF9QQ19GSUZPX1NJWkUJPSAxPDw2LCAvKiBCaXQgIDY6CUZJRk8gU2l6ZSAqLwotCVBIWV9MX1BDX1BSRV9FTgk9IDE8PDUsIC8qIEJpdCAgNToJUHJlYW1ibGUgRW5hYmxlICovCi0JUEhZX0xfUENfQ0lNCT0gMTw8NCwgLyogQml0ICA0OglDYXJyaWVyIEludGVncml0eSBNb24gKi8KLQlQSFlfTF9QQ18xMF9TRVIJPSAxPDwzLCAvKiBCaXQgIDM6CVVzZSBTZXJpYWwgT3V0cHV0ICovCi0JUEhZX0xfUENfQU5JU09MCT0gMTw8MiwgLyogQml0ICAyOglVbmlzb2xhdGUgUG9ydCAqLwotCVBIWV9MX1BDX1RFTl9CSVQJPSAxPDwxLCAvKiBCaXQgIDE6CTEwYml0IGlmYWNlIG1vZGUgb24gKi8KLQlQSFlfTF9QQ19BTFRDTE9DSwk9IDE8PDAsIC8qIEJpdCAgMDogKHJvKQlBTFRDTE9DSyBNb2RlIG9uICovCi19OwotCi0vKioqKiogIFBIWV9MT05FX1FfU1RBVAkJMTYgYml0IHIvbwlRdWljayBTdGF0dXMgUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX0xfUVNfRF9SQVRFCT0gMzw8MTQsLyogQml0IDE1Li4xNDoJRGF0YSBSYXRlICovCi0JUEhZX0xfUVNfVFhfU1RBVAk9IDE8PDEzLCAvKiBCaXQgMTM6CVRyYW5zbWl0dGluZyAqLwotCVBIWV9MX1FTX1JYX1NUQVQJPSAxPDwxMiwgLyogQml0IDEyOglSZWNlaXZpbmcgKi8KLQlQSFlfTF9RU19DT0xfU1RBVAk9IDE8PDExLCAvKiBCaXQgMTE6CUNvbGxpc2lvbiAqLwotCVBIWV9MX1FTX0xfU1RBVAk9IDE8PDEwLCAvKiBCaXQgMTA6CUxpbmsgaXMgdXAgKi8KLQlQSFlfTF9RU19EVVBfTU9ECT0gMTw8OSwgLyogQml0ICA5OglGdWxsL0hhbGYgRHVwbGV4ICovCi0JUEhZX0xfUVNfQU4JPSAxPDw4LCAvKiBCaXQgIDg6CUF1dG9OZWcgaXMgT24gKi8KLQlQSFlfTF9RU19BTl9DCT0gMTw8NywgLyogQml0ICA3OglBTiBpcyBDb21wbGV0ZSAqLwotCVBIWV9MX1FTX0xMRQk9IDc8PDQsLyogQml0ICA2Li40OglMaW5lIExlbmd0aCBFc3RpbS4gKi8KLQlQSFlfTF9RU19QQVVTRQk9IDE8PDMsIC8qIEJpdCAgMzoJTFAgYWR2ZXJ0aXNlZCBQYXVzZSAqLwotCVBIWV9MX1FTX0FTX1BBVVNFCT0gMTw8MiwgLyogQml0ICAyOglMUCBhZHYuIGFzeW0uIFBhdXNlICovCi0JUEhZX0xfUVNfSVNPTEFURQk9IDE8PDEsIC8qIEJpdCAgMToJQ0lNIElzb2xhdGVkICovCi0JUEhZX0xfUVNfRVZFTlQJPSAxPDwwLCAvKiBCaXQgIDA6CUV2ZW50IGhhcyBvY2N1cnJlZCAqLwotfTsKLQotLyoqKioqICBQSFlfTE9ORV9JTlRfRU5BQgkxNiBiaXQgci93CUludGVycnVwdCBFbmFibGUgUmVnICoqKioqLwotLyoqKioqICBQSFlfTE9ORV9JTlRfU1RBVAkxNiBiaXQgci9vCUludGVycnVwdCBTdGF0dXMgUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX0xfSVNfQU5fRgk9IDE8PDEzLCAvKiBCaXQgMTM6CUF1dG8tTmVnb3RpYXRpb24gZmF1bHQgKi8KLQlQSFlfTF9JU19DUk9TUwk9IDE8PDExLCAvKiBCaXQgMTE6CUNyb3Nzb3ZlciB1c2VkICovCi0JUEhZX0xfSVNfUE9MCT0gMTw8MTAsIC8qIEJpdCAxMDoJUG9sYXJpdHkgY29ycmVjdC4gdXNlZCAqLwotCVBIWV9MX0lTX1NTCT0gMTw8OSwgLyogQml0ICA5OglTbWFydCBTcGVlZCBEb3duZ3JhZGUgKi8KLQlQSFlfTF9JU19DRlVMTAk9IDE8PDgsIC8qIEJpdCAgODoJQ291bnRlciBGdWxsICovCi0JUEhZX0xfSVNfQU5fQwk9IDE8PDcsIC8qIEJpdCAgNzoJQXV0b05lZyBDb21wbGV0ZSAqLwotCVBIWV9MX0lTX1NQRUVECT0gMTw8NiwgLyogQml0ICA2OglTcGVlZCBDaGFuZ2VkICovCi0JUEhZX0xfSVNfRFVQCT0gMTw8NSwgLyogQml0ICA1OglEdXBsZXggQ2hhbmdlZCAqLwotCVBIWV9MX0lTX0xTCT0gMTw8NCwgLyogQml0ICA0OglMaW5rIFN0YXR1cyBDaGFuZ2VkICovCi0JUEhZX0xfSVNfSVNPTAk9IDE8PDMsIC8qIEJpdCAgMzoJSXNvbGF0ZSBPY2N1cmVkICovCi0JUEhZX0xfSVNfTURJTlQJPSAxPDwyLCAvKiBCaXQgIDI6IChybykJU1RBVDogTUlJIEludCBQZW5kaW5nICovCi0JUEhZX0xfSVNfSU5URU4JPSAxPDwxLCAvKiBCaXQgIDE6CUVOQUI6IEVuYWJsZSBJUlFzICovCi0JUEhZX0xfSVNfRk9SQ0UJPSAxPDwwLCAvKiBCaXQgIDA6CUVOQUI6IEZvcmNlIEludGVycnVwdCAqLwotfTsKLQotLyogaW50LiBtYXNrICovCi0jZGVmaW5lIFBIWV9MX0RFRl9NU0sJKFBIWV9MX0lTX0xTIHwgUEhZX0xfSVNfSVNPTCB8IFBIWV9MX0lTX0lOVEVOKQotCi0vKioqKiogIFBIWV9MT05FX0xFRF9DRkcJMTYgYml0IHIvdwlMRUQgQ29uZmlndXJhdGlvbiBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF9MQ19MRURDCT0gMzw8MTQsLyogQml0IDE1Li4xNDoJQ29sL0JsaW5rL09uL09mZiAqLwotCVBIWV9MX0xDX0xFRFIJPSAzPDwxMiwvKiBCaXQgMTMuLjEyOglSeC9CbGluay9Pbi9PZmYgKi8KLQlQSFlfTF9MQ19MRURUCT0gMzw8MTAsLyogQml0IDExLi4xMDoJVHgvQmxpbmsvT24vT2ZmICovCi0JUEhZX0xfTENfTEVERwk9IDM8PDgsLyogQml0ICA5Li44OglHaWdhL0JsaW5rL09uL09mZiAqLwotCVBIWV9MX0xDX0xFRFMJPSAzPDw2LC8qIEJpdCAgNy4uNjoJMTAtMTAwL0JsaW5rL09uL09mZiAqLwotCVBIWV9MX0xDX0xFREwJPSAzPDw0LC8qIEJpdCAgNS4uNDoJTGluay9CbGluay9Pbi9PZmYgKi8KLQlQSFlfTF9MQ19MRURGCT0gMzw8MiwvKiBCaXQgIDMuLjI6CUR1cGxleC9CbGluay9Pbi9PZmYgKi8KLQlQSFlfTF9MQ19QU1RSRUNIPSAxPDwxLCAvKiBCaXQgIDE6CVN0cmVjaCBMRUQgUHVsc2VzICovCi0JUEhZX0xfTENfRlJFUQk9IDE8PDAsIC8qIEJpdCAgMDoJMzAvMTAwIG1zICovCi19OwotCi0vKioqKiogIFBIWV9MT05FX1BPUlRfQ1RSTAkxNiBiaXQgci93CVBvcnQgQ29udHJvbCBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTF9QQ19UWF9UQ0xLID0gMTw8MTUsIC8qIEJpdCAxNToJRW5hYmxlIFRYX1RDTEsgKi8KLQlQSFlfTF9QQ19BTFRfTlAJID0gMTw8MTMsIC8qIEJpdCAxNDoJQWx0ZXJuYXRlIE5leHQgUGFnZSAqLwotCVBIWV9MX1BDX0dNSUlfQUxUPSAxPDwxMiwgLyogQml0IDEzOglBbHRlcm5hdGUgR01JSSBkcml2ZXIgKi8KLQlQSFlfTF9QQ19URU5fQ1JTID0gMTw8MTAsIC8qIEJpdCAxMDoJRXh0ZW5kIENSUyovCi19OwotCi0vKioqKiogIFBIWV9MT05FX0NJTQkJMTYgYml0IHIvbwlDSU0gUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX0xfQ0lNX0lTT0wJICAgID0gMHhmZjw8OCwvKiBCaXQgMTUuLjg6CUlzb2xhdGUgQ291bnQgKi8KLQlQSFlfTF9DSU1fRkFMU0VfQ0FSID0gMHhmZiwgICAvKiBCaXQgIDcuLjA6CUZhbHNlIENhcnJpZXIgQ291bnQgKi8KLX07Ci0KLS8qCi0gKiBQYXVzZSBCaXRzIChQSFlfTF9BTl9BU1AgYW5kIFBIWV9MX0FOX1BDKSBlbmNvZGluZwotICovCi1lbnVtIHsKLQlQSFlfTF9QX05PX1BBVVNFPSAwPDwxMCwvKiBCaXQgMTEuLjEwOglubyBQYXVzZSBNb2RlICovCi0JUEhZX0xfUF9TWU1fTUQJPSAxPDwxMCwgLyogQml0IDExLi4xMDoJc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KLQlQSFlfTF9QX0FTWU1fTUQJPSAyPDwxMCwvKiBCaXQgMTEuLjEwOglhc3ltbWV0cmljIFBhdXNlIE1vZGUgKi8KLQlQSFlfTF9QX0JPVEhfTUQJPSAzPDwxMCwvKiBCaXQgMTEuLjEwOglib3RoIFBhdXNlIE1vZGUgKi8KLX07Ci0KLS8qCi0gKiBOYXRpb25hbC1TcGVjaWZpYwotICovCi0vKioqKiogIFBIWV9OQVRfMTAwMFRfQ1RSTAkxNiBiaXQgci93CTEwMDBCYXNlLVQgQ29udHJvbCBSZWcgKioqKiovCi1lbnVtIHsKLQlQSFlfTl8xMDAwQ19URVNUPSA3PDwxMywvKiBCaXQgMTUuLjEzOglUZXN0IE1vZGVzICovCi0JUEhZX05fMTAwMENfTVNFCT0gMTw8MTIsIC8qIEJpdCAxMjoJTWFzdGVyL1NsYXZlIEVuYWJsZSAqLwotCVBIWV9OXzEwMDBDX01TQwk9IDE8PDExLCAvKiBCaXQgMTE6CU0vUyBDb25maWd1cmF0aW9uICovCi0JUEhZX05fMTAwMENfUkQJPSAxPDwxMCwgLyogQml0IDEwOglSZXBlYXRlci9EVEUgKi8KLQlQSFlfTl8xMDAwQ19BRkQJPSAxPDw5LCAvKiBCaXQgIDk6CUFkdmVydGlzZSBGdWxsIER1cGxleCAqLwotCVBIWV9OXzEwMDBDX0FIRAk9IDE8PDgsIC8qIEJpdCAgODoJQWR2ZXJ0aXNlIEhhbGYgRHVwbGV4ICovCi0JUEhZX05fMTAwMENfQVBDCT0gMTw8NywgLyogQml0ICA3OglBc3ltbWV0cmljIFBhdXNlIENhcC4gKi99OwotCi0KLS8qKioqKiAgUEhZX05BVF8xMDAwVF9TVEFUCTE2IGJpdCByL28JMTAwMEJhc2UtVCBTdGF0dXMgUmVnICoqKioqLwotZW51bSB7Ci0JUEhZX05fMTAwMFNfTVNGCT0gMTw8MTUsIC8qIEJpdCAxNToJTWFzdGVyL1NsYXZlIEZhdWx0ICovCi0JUEhZX05fMTAwMFNfTVNSCT0gMTw8MTQsIC8qIEJpdCAxNDoJTWFzdGVyL1NsYXZlIFJlc3VsdCAqLwotCVBIWV9OXzEwMDBTX0xSUwk9IDE8PDEzLCAvKiBCaXQgMTM6CUxvY2FsIFJlY2VpdmVyIFN0YXR1cyAqLwotCVBIWV9OXzEwMDBTX1JSUwk9IDE8PDEyLCAvKiBCaXQgMTI6CVJlbW90ZSBSZWNlaXZlciBTdGF0dXMqLwotCVBIWV9OXzEwMDBTX0xQX0ZEPSAxPDwxMSwgLyogQml0IDExOglMaW5rIFBhcnRuZXIgY2FuIEZEICovCi0JUEhZX05fMTAwMFNfTFBfSEQ9IDE8PDEwLCAvKiBCaXQgMTA6CUxpbmsgUGFydG5lciBjYW4gSEQgKi8KLQlQSFlfTl8xMDAwQ19MUF9BUEM9IDE8PDksIC8qIEJpdCAgOToJTFAgQXN5bS4gUGF1c2UgQ2FwLiAqLwotCVBIWV9OXzEwMDBTX0lFQwk9IDB4ZmYsIC8qIEJpdCAgNy4uMDoJSWRsZSBFcnJvciBDb3VudCAqLwotfTsKLQotLyoqKioqICBQSFlfTkFUX0VYVF9TVEFUCTE2IGJpdCByL28JRXh0ZW5kZWQgU3RhdHVzIFJlZ2lzdGVyICoqKioqLwotZW51bSB7Ci0JUEhZX05fRVNfWF9GRF9DQVA9IDE8PDE1LCAvKiBCaXQgMTU6CTEwMDBCYXNlLVggRkQgY2FwYWJsZSAqLwotCVBIWV9OX0VTX1hfSERfQ0FQPSAxPDwxNCwgLyogQml0IDE0OgkxMDAwQmFzZS1YIEhEIGNhcGFibGUgKi8KLQlQSFlfTl9FU19UX0ZEX0NBUD0gMTw8MTMsIC8qIEJpdCAxMzoJMTAwMEJhc2UtVCBGRCBjYXBhYmxlICovCi0JUEhZX05fRVNfVF9IRF9DQVA9IDE8PDEyLCAvKiBCaXQgMTI6CTEwMDBCYXNlLVQgSEQgY2FwYWJsZSAqLwotfTsKLQogLyoqIE1hcnZlbGwtU3BlY2lmaWMgKi8KIGVudW0gewogCVBIWV9NX0FOX05YVF9QRwk9IDE8PDE1LCAvKiBSZXF1ZXN0IE5leHQgUGFnZSAqLwpAQCAtMTcxOCw3ICsxMzgxLDcgQEAKIAlQSFlfTV9QQ19FTl9ERVRfUExVUwk9IDM8PDgsIC8qIEVuZXJneSBEZXRlY3QgUGx1cyAoTW9kZSAyKSAqLwogfTsKIAotI2RlZmluZSBQSFlfTV9QQ19NRElfWE1PREUoeCkJKCgoeCk8PDUpICYgUEhZX01fUENfTURJWF9NU0spCQorI2RlZmluZSBQSFlfTV9QQ19NRElfWE1PREUoeCkJKCgoeCk8PDUpICYgUEhZX01fUENfTURJWF9NU0spCiAKIGVudW0gewogCVBIWV9NX1BDX01BTl9NREkJPSAwLCAvKiAwMCA9IE1hbnVhbCBNREkgY29uZmlndXJhdGlvbiAqLwpAQCAtMjEwNSw3ICsxNzY4LDcgQEAKIAlHTV9HUFNSX0ZDX1JYX0RJUwk9IDE8PDIsCS8qIEJpdCAgMjoJUnggRmxvdy1Db250cm9sIE1vZGUgRGlzYWJsZWQgKi8KIAlHTV9HUFNSX1BST01fRU4JCT0gMTw8MSwJLyogQml0ICAxOglQcm9taXNjdW91cyBNb2RlIEVuYWJsZWQgKi8KIH07Ci0JCisKIC8qCUdNX0dQX0NUUkwJMTYgYml0IHIvdwlHZW5lcmFsIFB1cnBvc2UgQ29udHJvbCBSZWdpc3RlciAqLwogZW51bSB7CiAJR01fR1BDUl9QUk9NX0VOQQk9IDE8PDE0LAkvKiBCaXQgMTQ6CUVuYWJsZSBQcm9taXNjdW91cyBNb2RlICovCkBAIC0yMTI3LDcgKzE3OTAsNyBAQAogCiAjZGVmaW5lIEdNX0dQQ1JfU1BFRURfMTAwMAkoR01fR1BDUl9HSUdTX0VOQSB8IEdNX0dQQ1JfU1BFRURfMTAwKQogI2RlZmluZSBHTV9HUENSX0FVX0FMTF9ESVMJKEdNX0dQQ1JfQVVfRFVQX0RJUyB8IEdNX0dQQ1JfQVVfRkNUX0RJU3xHTV9HUENSX0FVX1NQRF9ESVMpCi0JCisKIC8qCUdNX1RYX0NUUkwJCQkxNiBiaXQgci93CVRyYW5zbWl0IENvbnRyb2wgUmVnaXN0ZXIgKi8KIGVudW0gewogCUdNX1RYQ1JfRk9SQ0VfSkFNCT0gMTw8MTUsIC8qIEJpdCAxNToJRm9yY2UgSmFtIC8gRmxvdy1Db250cm9sICovCkBAIC0yMTM4LDcgKzE4MDEsNyBAQAogCiAjZGVmaW5lIFRYX0NPTF9USFIoeCkJCSgoKHgpPDwxMCkgJiBHTV9UWENSX0NPTF9USFJfTVNLKQogI2RlZmluZSBUWF9DT0xfREVGCQkweDA0Ci0JCisKIC8qCUdNX1JYX0NUUkwJCQkxNiBiaXQgci93CVJlY2VpdmUgQ29udHJvbCBSZWdpc3RlciAqLwogZW51bSB7CiAJR01fUlhDUl9VQ0ZfRU5BCT0gMTw8MTUsIC8qIEJpdCAxNToJRW5hYmxlIFVuaWNhc3QgZmlsdGVyaW5nICovCkBAIC0yMTQ2LDcgKzE4MDksNyBAQAogCUdNX1JYQ1JfQ1JDX0RJUwk9IDE8PDEzLCAvKiBCaXQgMTM6CVJlbW92ZSA0LWJ5dGUgQ1JDICovCiAJR01fUlhDUl9QQVNTX0ZDCT0gMTw8MTIsIC8qIEJpdCAxMjoJUGFzcyBGQyBwYWNrZXRzIHRvIEZJRk8gKi8KIH07Ci0JCisKIC8qCUdNX1RYX1BBUkFNCQkxNiBiaXQgci93CVRyYW5zbWl0IFBhcmFtZXRlciBSZWdpc3RlciAqLwogZW51bSB7CiAJR01fVFhQQV9KQU1MRU5fTVNLCT0gMHgwMzw8MTQsCS8qIEJpdCAxNS4uMTQ6CUphbSBMZW5ndGggKi8KQEAgLTIxNzEsNyArMTgzNCw3IEBACiAJR01fU01PRF9KVU1CT19FTkEJPSAxPDw4LAkvKiBCaXQgIDg6CUVuYWJsZSBKdW1ibyAoTWF4LiBGcmFtZSBMZW4pICovCiAJIEdNX1NNT0RfSVBHX01TSwk9IDB4MWYJLyogQml0IDQuLjA6CUludGVyLVBhY2tldCBHYXAgKElQRykgKi8KIH07Ci0JCisKICNkZWZpbmUgREFUQV9CTElORF9WQUwoeCkJKCgoeCk8PDExKSAmIEdNX1NNT0RfREFUQUJMX01TSykKICNkZWZpbmUgREFUQV9CTElORF9ERUYJCTB4MDQKIApAQCAtMjE4Niw3ICsxODQ5LDcgQEAKIAlHTV9TTUlfQ1RfUkRfVkFMCT0gMTw8NCwJLyogQml0ICA0OglSZWFkIFZhbGlkIChSZWFkIGNvbXBsZXRlZCkgKi8KIAlHTV9TTUlfQ1RfQlVTWQkJPSAxPDwzLAkvKiBCaXQgIDM6CUJ1c3kgKE9wZXJhdGlvbiBpbiBwcm9ncmVzcykgKi8KIH07Ci0JCisKICNkZWZpbmUgR01fU01JX0NUX1BIWV9BRCh4KQkoKCh4KTw8MTEpICYgR01fU01JX0NUX1BIWV9BX01TSykKICNkZWZpbmUgR01fU01JX0NUX1JFR19BRCh4KQkoKCh4KTw8NikgJiBHTV9TTUlfQ1RfUkVHX0FfTVNLKQogCkBAIC0yMTk1LDcgKzE4NTgsNyBAQAogCUdNX1BBUl9NSUJfQ0xSCT0gMTw8NSwJLyogQml0ICA1OglTZXQgTUlCIENsZWFyIENvdW50ZXIgTW9kZSAqLwogCUdNX1BBUl9NSUJfVFNUCT0gMTw8NCwJLyogQml0ICA0OglNSUIgTG9hZCBDb3VudGVyIChUZXN0IE1vZGUpICovCiB9OwotCQorCiAvKiBSZWNlaXZlIEZyYW1lIFN0YXR1cyBFbmNvZGluZyAqLwogZW51bSB7CiAJR01SX0ZTX0xFTgk9IDB4ZmZmZjw8MTYsIC8qIEJpdCAzMS4uMTY6CVJ4IEZyYW1lIExlbmd0aCAqLwpAQCAtMjIxNywxMiArMTg4MCwxMiBAQAogLyoKICAqIEdNUl9GU19BTllfRVJSIChhbmFsb2dvdXMgdG8gWE1SX0ZTX0FOWV9FUlIpCiAgKi8KLQlHTVJfRlNfQU5ZX0VSUgk9IEdNUl9GU19DUkNfRVJSIHwgR01SX0ZTX0xPTkdfRVJSIHwgCi0JCSAgCSAgR01SX0ZTX01JSV9FUlIgfCBHTVJfRlNfQkFEX0ZDIHwgR01SX0ZTX0dPT0RfRkMgfCAKKwlHTVJfRlNfQU5ZX0VSUgk9IEdNUl9GU19DUkNfRVJSIHwgR01SX0ZTX0xPTkdfRVJSIHwKKwkJICAJICBHTVJfRlNfTUlJX0VSUiB8IEdNUl9GU19CQURfRkMgfCBHTVJfRlNfR09PRF9GQyB8CiAJCQkgIEdNUl9GU19KQUJCRVIsCiAvKiBSeCBHTUFDIEZJRk8gRmx1c2ggTWFzayAoZGVmYXVsdCkgKi8KIAlSWF9GRl9GTF9ERUZfTVNLID0gR01SX0ZTX0NSQ19FUlIgfCBHTVJfRlNfUlhfRkZfT1YgfEdNUl9GU19NSUlfRVJSIHwKLQkJCSAgIEdNUl9GU19CQURfRkMgfCBHTVJfRlNfR09PRF9GQyB8IEdNUl9GU19VTl9TSVpFIHwgCisJCQkgICBHTVJfRlNfQkFEX0ZDIHwgR01SX0ZTX0dPT0RfRkMgfCBHTVJfRlNfVU5fU0laRSB8CiAJCQkgICBHTVJfRlNfSkFCQkVSLAogfTsKIApAQCAtMjU0MCwxMCArMjIwMyw2IEBACiB9OwogCiAKLS8qCVhNX1BIWV9BRERSCTE2IGJpdCByL3cJUEhZIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgWE1fUEhZX0FERFJfU1oJMHgxZgkvKiBCaXQgIDQuLjA6CVBIWSBBZGRyZXNzIGJpdHMgKi8KLQotCiAvKglYTV9HUF9QT1JUCTMyIGJpdCByL3cJR2VuZXJhbCBQdXJwb3NlIFBvcnQgUmVnaXN0ZXIgKi8KIGVudW0gewogCVhNX0dQX0FOSVAJPSAxPDw2LAkvKiBCaXQgIDY6IChybykJQXV0by1OZWcuIGluIHByb2dyZXNzICovCkBAIC0yNjYyLDggKzIzMjEsOCBAQAogfTsKIAogI2RlZmluZSBYTV9QQVVTRV9NT0RFCShYTV9NRF9TUE9FX0UgfCBYTV9NRF9TUE9MX0kgfCBYTV9NRF9TUE9IX0kpCi0jZGVmaW5lIFhNX0RFRl9NT0RFCQkoWE1fTURfUlhfUlVOVCB8IFhNX01EX1JYX0lSTEUgfCBYTV9NRF9SWF9MT05HIHxcCi0JCQkJWE1fTURfUlhfQ1JDRSB8IFhNX01EX1JYX0VSUiB8IFhNX01EX0NTQSB8IFhNX01EX0NBQSkKKyNkZWZpbmUgWE1fREVGX01PREUJKFhNX01EX1JYX1JVTlQgfCBYTV9NRF9SWF9JUkxFIHwgWE1fTURfUlhfTE9ORyB8XAorCQkJIFhNX01EX1JYX0NSQ0UgfCBYTV9NRF9SWF9FUlIgfCBYTV9NRF9DU0EpCiAKIC8qCVhNX1NUQVRfQ01ECTE2IGJpdCByL3cJU3RhdGlzdGljcyBDb21tYW5kIFJlZ2lzdGVyICovCiBlbnVtIHsKQEAgLTI3OTMsMjggKzI0NTIsMjAgQEAKIAl1MzIJCSAgICAgaW50cl9tYXNrOwogCXN0cnVjdCBuZXRfZGV2aWNlICAgICpkZXZbMl07CiAKLQl1OAkJICAgICBtYWNfY2ZnOwogCXU4CSAgICAgCSAgICAgY2hpcF9pZDsKKwl1OAkJICAgICBjaGlwX3JldjsKIAl1OAkJICAgICBwaHlfdHlwZTsKIAl1OAkJICAgICBwbWRfdHlwZTsKIAl1MTYJCSAgICAgcGh5X2FkZHI7CisJdTgJCSAgICAgcG9ydHM7CiAKIAl1MzIJICAgICAJICAgICByYW1fc2l6ZTsKIAl1MzIJICAgICAJICAgICByYW1fb2Zmc2V0OwotCQorCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IGV4dF90YXNrbGV0OwogCXNwaW5sb2NrX3QJICAgICBwaHlfbG9jazsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzZHVhbHBvcnQoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3KQotewotCXJldHVybiAhKGh3LT5tYWNfY2ZnICYgQ0ZHX1NOR19NQUMpOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGNoaXBfcmV2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodykKLXsKLQlyZXR1cm4gKGh3LT5tYWNfY2ZnICYgQ0ZHX0NISVBfUl9NU0spID4+IDQ7Ci19CiAKIHN0YXRpYyBpbmxpbmUgaW50IGlzY29wcGVyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodykKIHsKQEAgLTI4MjcsNyArMjQ3OCw3IEBACiAJRkxPV19NT0RFX1JFTV9TRU5ECT0gMiwgLyogU3ltbWV0cmljIG9yIGp1c3QgcmVtb3RlICovCiAJRkxPV19NT0RFX1NZTU1FVFJJQwk9IDMsIC8qIEJvdGggc3RhdGlvbnMgbWF5IHNlbmQgUEFVU0UgKi8KIH07Ci0JCisKIHN0cnVjdCBza2dlX3BvcnQgewogCXUzMgkJICAgICBtc2dfZW5hYmxlOwogCXN0cnVjdCBza2dlX2h3CSAgICAgKmh3OwpAQCAtMjg1Myw4ICsyNTA0LDggQEAKIAl2b2lkCQkgICAgICptZW07CS8qIFBDSSBtZW1vcnkgZm9yIHJpbmdzICovCiAJZG1hX2FkZHJfdAkgICAgIGRtYTsKIAl1bnNpZ25lZCBsb25nCSAgICAgbWVtX3NpemU7CisJdW5zaWduZWQgaW50CSAgICAgcnhfYnVmX3NpemU7CiAKLQlzdHJ1Y3QgdGltZXJfbGlzdCAgICBsaW5rX2NoZWNrOwogCXN0cnVjdCB0aW1lcl9saXN0ICAgIGxlZF9ibGluazsKIH07CiAKQEAgLTI4NjMsNyArMjUxNCw2IEBACiBzdGF0aWMgaW5saW5lIHUzMiBza2dlX3JlYWQzMihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCByZWcpCiB7CiAJcmV0dXJuIHJlYWRsKGh3LT5yZWdzICsgcmVnKTsKLQogfQogCiBzdGF0aWMgaW5saW5lIHUxNiBza2dlX3JlYWQxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCByZWcpCkBAIC0yODkyLDExNCArMjU0Miw4NyBAQAogfQogCiAvKiBNQUMgUmVsYXRlZCBSZWdpc3RlcnMgaW5zaWRlIHRoZSBkZXZpY2UuICovCi0jZGVmaW5lIFNLR0VNQUNfUkVHKHBvcnQscmVnKQkoKChwb3J0KTw8NykrKHJlZykpCi0KLS8qIFBDSSBjb25maWcgc3BhY2UgY2FuIGJlIGFjY2Vzc2VkIHZpYSBtZW1vcnkgbWFwcGVkIHNwYWNlICovCi0jZGVmaW5lIFNLR0VQQ0lfUkVHKHJlZykgKChyZWcpKyAweDM4MCkKLQotI2RlZmluZSBTS0dFWE1fUkVHKHBvcnQsIHJlZykgXAorI2RlZmluZSBTS19SRUcocG9ydCxyZWcpCSgoKHBvcnQpPDw3KSsocmVnKSkKKyNkZWZpbmUgU0tfWE1BQ19SRUcocG9ydCwgcmVnKSBcCiAJKChCQVNFX1hNQUNfMSArIChwb3J0KSAqIChCQVNFX1hNQUNfMiAtIEJBU0VfWE1BQ18xKSkgfCAocmVnKSA8PCAxKQogCi1zdGF0aWMgaW5saW5lIHUzMiBza2dlX3htX3JlYWQzMihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnKQorc3RhdGljIGlubGluZSB1MzIgeG1fcmVhZDMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCiB7Ci0JcmV0dXJuIHNrZ2VfcmVhZDMyKGh3LCBTS0dFWE1fUkVHKHBvcnQscmVnKSk7CisJdTMyIHY7CisJdiA9IHNrZ2VfcmVhZDE2KGh3LCBTS19YTUFDX1JFRyhwb3J0LCByZWcpKTsKKwl2IHw9ICh1MzIpc2tnZV9yZWFkMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQsIHJlZysyKSkgPDwgMTY7CisJcmV0dXJuIHY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IHNrZ2VfeG1fcmVhZDE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCitzdGF0aWMgaW5saW5lIHUxNiB4bV9yZWFkMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKIHsKLQlyZXR1cm4gc2tnZV9yZWFkMTYoaHcsIFNLR0VYTV9SRUcocG9ydCxyZWcpKTsKKwlyZXR1cm4gc2tnZV9yZWFkMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQscmVnKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggc2tnZV94bV9yZWFkOChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnKQorc3RhdGljIGlubGluZSB2b2lkIHhtX3dyaXRlMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUzMiB2KQogewotCXJldHVybiBza2dlX3JlYWQ4KGh3LCBTS0dFWE1fUkVHKHBvcnQscmVnKSk7CisJc2tnZV93cml0ZTE2KGh3LCBTS19YTUFDX1JFRyhwb3J0LHIpLCB2ICYgMHhmZmZmKTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQscisyKSwgdiA+PiAxNik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX3htX3dyaXRlMzIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUzMiB2KQorc3RhdGljIGlubGluZSB2b2lkIHhtX3dyaXRlMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUxNiB2KQogewotCXNrZ2Vfd3JpdGUzMihodywgU0tHRVhNX1JFRyhwb3J0LHIpLCB2KTsKKwlza2dlX3dyaXRlMTYoaHcsIFNLX1hNQUNfUkVHKHBvcnQsciksIHYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tnZV94bV93cml0ZTE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1MTYgdikKLXsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VYTV9SRUcocG9ydCxyKSwgdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX3htX3dyaXRlOChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTggdikKLXsKLQlza2dlX3dyaXRlOChodywgU0tHRVhNX1JFRyhwb3J0LHIpLCB2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfeG1fb3V0aGFzaChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnLAorc3RhdGljIGlubGluZSB2b2lkIHhtX291dGhhc2goY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZywKIAkJCQkgICBjb25zdCB1OCAqaGFzaCkKIHsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgCi0JCQkodTE2KWhhc2hbMF0gfCAoKHUxNiloYXNoWzFdIDw8IDgpKTsKLQlza2dlX3htX3dyaXRlMTYoaHcsIHBvcnQsIHJlZysyLCAKLQkJCSh1MTYpaGFzaFsyXSB8ICgodTE2KWhhc2hbM10gPDwgOCkpOwotCXNrZ2VfeG1fd3JpdGUxNihodywgcG9ydCwgcmVnKzQsIAotCQkJKHUxNiloYXNoWzRdIHwgKCh1MTYpaGFzaFs1XSA8PCA4KSk7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNiwgCi0JCQkodTE2KWhhc2hbNl0gfCAoKHUxNiloYXNoWzddIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcsICAgKHUxNiloYXNoWzBdIHwgKCh1MTYpaGFzaFsxXSA8PCA4KSk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgcmVnKzIsICh1MTYpaGFzaFsyXSB8ICgodTE2KWhhc2hbM10gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys0LCAodTE2KWhhc2hbNF0gfCAoKHUxNiloYXNoWzVdIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNiwgKHUxNiloYXNoWzZdIHwgKCh1MTYpaGFzaFs3XSA8PCA4KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX3htX291dGFkZHIoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZywKK3N0YXRpYyBpbmxpbmUgdm9pZCB4bV9vdXRhZGRyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcsCiAJCQkJICAgY29uc3QgdTggKmFkZHIpCiB7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCByZWcsIAotCQkJKHUxNilhZGRyWzBdIHwgKCh1MTYpYWRkclsxXSA8PCA4KSk7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCByZWcsIAotCQkJKHUxNilhZGRyWzJdIHwgKCh1MTYpYWRkclszXSA8PCA4KSk7Ci0Jc2tnZV94bV93cml0ZTE2KGh3LCBwb3J0LCByZWcsIAotCQkJKHUxNilhZGRyWzRdIHwgKCh1MTYpYWRkcls1XSA8PCA4KSk7CisJeG1fd3JpdGUxNihodywgcG9ydCwgcmVnLCAgICh1MTYpYWRkclswXSB8ICgodTE2KWFkZHJbMV0gPDwgOCkpOworCXhtX3dyaXRlMTYoaHcsIHBvcnQsIHJlZysyLCAodTE2KWFkZHJbMl0gfCAoKHUxNilhZGRyWzNdIDw8IDgpKTsKKwl4bV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNCwgKHUxNilhZGRyWzRdIHwgKCh1MTYpYWRkcls1XSA8PCA4KSk7CiB9CiAKKyNkZWZpbmUgU0tfR01BQ19SRUcocG9ydCxyZWcpIFwKKwkoQkFTRV9HTUFDXzEgKyAocG9ydCkgKiAoQkFTRV9HTUFDXzItQkFTRV9HTUFDXzEpICsgKHJlZykpCiAKLSNkZWZpbmUgU0tHRUdNQV9SRUcocG9ydCxyZWcpIFwKLQkoKHJlZykgKyBCQVNFX0dNQUNfMSArIFwKLQkgKHBvcnQpICogKEJBU0VfR01BQ18yLUJBU0VfR01BQ18xKSkKLQotc3RhdGljIGlubGluZSB1MTYgc2tnZV9nbWFfcmVhZDE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCitzdGF0aWMgaW5saW5lIHUxNiBnbWFfcmVhZDE2KGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCiB7Ci0JcmV0dXJuIHNrZ2VfcmVhZDE2KGh3LCBTS0dFR01BX1JFRyhwb3J0LHJlZykpOworCXJldHVybiBza2dlX3JlYWQxNihodywgU0tfR01BQ19SRUcocG9ydCxyZWcpKTsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgc2tnZV9nbWFfcmVhZDMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCitzdGF0aWMgaW5saW5lIHUzMiBnbWFfcmVhZDMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByZWcpCiB7Ci0JcmV0dXJuICh1MzIpIHNrZ2VfcmVhZDE2KGh3LCBTS0dFR01BX1JFRyhwb3J0LHJlZykpCi0JCXwgKCh1MzIpc2tnZV9yZWFkMTYoaHcsIFNLR0VHTUFfUkVHKHBvcnQscmVnKzQpKSA8PCAxNik7CisJcmV0dXJuICh1MzIpIHNrZ2VfcmVhZDE2KGh3LCBTS19HTUFDX1JFRyhwb3J0LHJlZykpCisJCXwgKCh1MzIpc2tnZV9yZWFkMTYoaHcsIFNLX0dNQUNfUkVHKHBvcnQscmVnKzQpKSA8PCAxNik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggc2tnZV9nbWFfcmVhZDgoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbWFfd3JpdGUxNihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTE2IHYpCiB7Ci0JcmV0dXJuIHNrZ2VfcmVhZDgoaHcsIFNLR0VHTUFfUkVHKHBvcnQscmVnKSk7CisJc2tnZV93cml0ZTE2KGh3LCBTS19HTUFDX1JFRyhwb3J0LHIpLCB2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNrZ2VfZ21hX3dyaXRlMTYoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHUxNiB2KQorc3RhdGljIGlubGluZSB2b2lkIGdtYV93cml0ZTMyKGNvbnN0IHN0cnVjdCBza2dlX2h3ICpodywgaW50IHBvcnQsIGludCByLCB1MzIgdikKIHsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VHTUFfUkVHKHBvcnQsciksIHYpOworCXNrZ2Vfd3JpdGUxNihodywgU0tfR01BQ19SRUcocG9ydCwgciksICh1MTYpIHYpOworCXNrZ2Vfd3JpdGUzMihodywgU0tfR01BQ19SRUcocG9ydCwgcis0KSwgKHUxNikodiA+PiAxNikpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tnZV9nbWFfd3JpdGUzMihjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTMyIHYpCitzdGF0aWMgaW5saW5lIHZvaWQgZ21hX3dyaXRlOChjb25zdCBzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgciwgdTggdikKIHsKLQlza2dlX3dyaXRlMTYoaHcsIFNLR0VHTUFfUkVHKHBvcnQsIHIpLCAodTE2KSB2KTsKLQlza2dlX3dyaXRlMzIoaHcsIFNLR0VHTUFfUkVHKHBvcnQsIHIrNCksICh1MTYpKHYgPj4gMTYpKTsKKwlza2dlX3dyaXRlOChodywgU0tfR01BQ19SRUcocG9ydCxyKSwgdik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBza2dlX2dtYV93cml0ZTgoY29uc3Qgc3RydWN0IHNrZ2VfaHcgKmh3LCBpbnQgcG9ydCwgaW50IHIsIHU4IHYpCi17Ci0Jc2tnZV93cml0ZTgoaHcsIFNLR0VHTUFfUkVHKHBvcnQsciksIHYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tnZV9nbV9zZXRfYWRkcihzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnLAorc3RhdGljIGlubGluZSB2b2lkIGdtYV9zZXRfYWRkcihzdHJ1Y3Qgc2tnZV9odyAqaHcsIGludCBwb3J0LCBpbnQgcmVnLAogCQkJCSAgICBjb25zdCB1OCAqYWRkcikKIHsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCByZWcsCi0JCQkgKHUxNikgYWRkclswXSB8ICgodTE2KSBhZGRyWzFdIDw8IDgpKTsKLQlza2dlX2dtYV93cml0ZTE2KGh3LCBwb3J0LCByZWcrNCwKLQkJCSAodTE2KSBhZGRyWzJdIHwgKCh1MTYpIGFkZHJbM10gPDwgOCkpOwotCXNrZ2VfZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys4LAotCQkJICh1MTYpIGFkZHJbNF0gfCAoKHUxNikgYWRkcls1XSA8PCA4KSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZywgICh1MTYpIGFkZHJbMF0gfCAoKHUxNikgYWRkclsxXSA8PCA4KSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys0LCh1MTYpIGFkZHJbMl0gfCAoKHUxNikgYWRkclszXSA8PCA4KSk7CisJZ21hX3dyaXRlMTYoaHcsIHBvcnQsIHJlZys4LCh1MTYpIGFkZHJbNF0gfCAoKHUxNikgYWRkcls1XSA8PCA4KSk7CiB9Ci0JCQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NsaXAuYyBiL2RyaXZlcnMvbmV0L3NsaXAuYwppbmRleCAxOTExMjcxLi40MDRlYTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbGlwLmMKKysrIGIvZHJpdmVycy9uZXQvc2xpcC5jCkBAIC03NCw2ICs3NCw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfc2xpcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgInNsaXAuaCIKICNpZmRlZiBDT05GSUdfSU5FVApAQCAtMTk4LDE4ICsxOTksMTIgQEAKIHN0YXRpYyB2b2lkCiBzbF9mcmVlX2J1ZnMoc3RydWN0IHNsaXAgKnNsKQogewotCXZvaWQgKiB0bXA7Ci0KIAkvKiBGcmVlIGFsbCBTTElQIGZyYW1lIGJ1ZmZlcnMuICovCi0JdG1wID0geGNoZygmc2wtPnJidWZmLCBOVUxMKTsKLQlrZnJlZSh0bXApOwotCXRtcCA9IHhjaGcoJnNsLT54YnVmZiwgTlVMTCk7Ci0Ja2ZyZWUodG1wKTsKKwlrZnJlZSh4Y2hnKCZzbC0+cmJ1ZmYsIE5VTEwpKTsKKwlrZnJlZSh4Y2hnKCZzbC0+eGJ1ZmYsIE5VTEwpKTsKICNpZmRlZiBTTF9JTkNMVURFX0NTTElQCi0JdG1wID0geGNoZygmc2wtPmNidWZmLCBOVUxMKTsKLQlrZnJlZSh0bXApOwotCWlmICgodG1wID0geGNoZygmc2wtPnNsY29tcCwgTlVMTCkpICE9IE5VTEwpCi0JCXNsaGNfZnJlZSh0bXApOworCWtmcmVlKHhjaGcoJnNsLT5jYnVmZiwgTlVMTCkpOworCXNsaGNfZnJlZSh4Y2hnKCZzbC0+c2xjb21wLCBOVUxMKSk7CiAjZW5kaWYKIH0KIApAQCAtMTM4OSwxMCArMTM4NCw4IEBACiAJLyogRmlyc3Qgb2YgYWxsOiBjaGVjayBmb3IgYWN0aXZlIGRpc2NpcGxpbmVzIGFuZCBoYW5ndXAgdGhlbS4KIAkgKi8KIAlkbyB7Ci0JCWlmIChidXN5KSB7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKLQkJfQorCQlpZiAoYnVzeSkKKwkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMCk7CiAKIAkJYnVzeSA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCBzbGlwX21heGRldjsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmMgYi9kcml2ZXJzL25ldC9zbWMtbWNhLmMKaW5kZXggOTkwMjAxZi4uZjAwYzQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jLW1jYS5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYy1tY2EuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogI2luY2x1ZGUgIjgzOTAuaCIKLSNpbmNsdWRlICJzbWMtbWNhLmgiCiAKICNkZWZpbmUgRFJWX05BTUUgInNtYy1tY2EiCiAKQEAgLTEwMCw2ICs5OSw2MyBAQAogTU9EVUxFX1BBUk1fREVTQyh1bHRyYV9pbywgIlNNQyBVbHRyYS9FdGhlckVaIE1DQSBJL08gYmFzZSBhZGRyZXNzKGVzKSIpOwogTU9EVUxFX1BBUk1fREVTQyh1bHRyYV9pcnEsICJTTUMgVWx0cmEvRXRoZXJFWiBNQ0EgSVJRIG51bWJlcihzKSIpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgdW5zaWduZWQgaW50IGJhc2VfYWRkcjsKK30gYWRkcl90YWJsZVtdID0geworICAgIHsgMHgwODAwIH0sCisgICAgeyAweDE4MDAgfSwKKyAgICB7IDB4MjgwMCB9LAorICAgIHsgMHgzODAwIH0sCisgICAgeyAweDQ4MDAgfSwKKyAgICB7IDB4NTgwMCB9LAorICAgIHsgMHg2ODAwIH0sCisgICAgeyAweDc4MDAgfSwKKyAgICB7IDB4ODgwMCB9LAorICAgIHsgMHg5ODAwIH0sCisgICAgeyAweGE4MDAgfSwKKyAgICB7IDB4YjgwMCB9LAorICAgIHsgMHhjODAwIH0sCisgICAgeyAweGQ4MDAgfSwKKyAgICB7IDB4ZTgwMCB9LAorICAgIHsgMHhmODAwIH0KK307CisKKyNkZWZpbmUgTUVNX01BU0sgNjQKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIHVuc2lnbmVkIGNoYXIgbWVtX2luZGV4OworICB1bnNpZ25lZCBsb25nIG1lbV9zdGFydDsKKyAgdW5zaWduZWQgY2hhciBudW1fcGFnZXM7Cit9IG1lbV90YWJsZVtdID0geworICAgIHsgMTYsIDB4MGMwMDAwLCA0MCB9LAorICAgIHsgMTgsIDB4MGM0MDAwLCA0MCB9LAorICAgIHsgMjAsIDB4MGM4MDAwLCA0MCB9LAorICAgIHsgMjIsIDB4MGNjMDAwLCA0MCB9LAorICAgIHsgMjQsIDB4MGQwMDAwLCA0MCB9LAorICAgIHsgMjYsIDB4MGQ0MDAwLCA0MCB9LAorICAgIHsgMjgsIDB4MGQ4MDAwLCA0MCB9LAorICAgIHsgMzAsIDB4MGRjMDAwLCA0MCB9LAorICAgIHsxNDQsIDB4ZmMwMDAwLCA0MCB9LAorICAgIHsxNDgsIDB4ZmM4MDAwLCA0MCB9LAorICAgIHsxNTQsIDB4ZmQwMDAwLCA0MCB9LAorICAgIHsxNTYsIDB4ZmQ4MDAwLCA0MCB9LAorICAgIHsgIDAsIDB4MGMwMDAwLCAyMCB9LAorICAgIHsgIDEsIDB4MGMyMDAwLCAyMCB9LAorICAgIHsgIDIsIDB4MGM0MDAwLCAyMCB9LAorICAgIHsgIDMsIDB4MGM2MDAwLCAyMCB9Cit9OworCisjZGVmaW5lIElSUV9NQVNLIDI0Mworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICB1bnNpZ25lZCBjaGFyIG5ld19pcnE7CisgICB1bnNpZ25lZCBjaGFyIG9sZF9pcnE7Cit9IGlycV90YWJsZVtdID0geworICAgeyAgMywgIDMgfSwKKyAgIHsgIDQsICA0IH0sCisgICB7IDEwLCAxMCB9LAorICAgeyAxNCwgMTUgfQorfTsKKwogc3RhdGljIHNob3J0IHNtY19tY2FfYWRhcHRlcl9pZHNbXSBfX2luaXRkYXRhID0gewogCTB4NjFjOCwKIAkweDYxYzksCkBAIC0xMjYsNyArMTgyLDcgQEAKIAogc3RhdGljIGludCB1bHRyYV9mb3VuZCA9IDA7CiAKLWludCBfX2luaXQgdWx0cmFtY2FfcHJvYmUoc3RydWN0IGRldmljZSAqZ2VuX2RldikKK3N0YXRpYyBpbnQgX19pbml0IHVsdHJhbWNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmdlbl9kZXYpCiB7CiAJdW5zaWduZWQgc2hvcnQgaW9hZGRyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtbWNhLmggYi9kcml2ZXJzL25ldC9zbWMtbWNhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTAxMTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvc21jLW1jYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIGRqd2VpcyB3ZWlzZDM0NThAdW5pLmVkdQotICogbW9zdCBvZiB0aGlzIGZpbGUgd2FzIHRha2VuIGZyb20gcHMyZXNkaS5oCi0gKi8KLQotc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGJhc2VfYWRkcjsKLX0gYWRkcl90YWJsZVtdID0gewotICAgIHsgMHgwODAwIH0sCi0gICAgeyAweDE4MDAgfSwKLSAgICB7IDB4MjgwMCB9LAotICAgIHsgMHgzODAwIH0sCi0gICAgeyAweDQ4MDAgfSwKLSAgICB7IDB4NTgwMCB9LAotICAgIHsgMHg2ODAwIH0sCi0gICAgeyAweDc4MDAgfSwKLSAgICB7IDB4ODgwMCB9LAotICAgIHsgMHg5ODAwIH0sCi0gICAgeyAweGE4MDAgfSwKLSAgICB7IDB4YjgwMCB9LAotICAgIHsgMHhjODAwIH0sCi0gICAgeyAweGQ4MDAgfSwKLSAgICB7IDB4ZTgwMCB9LAotICAgIHsgMHhmODAwIH0KLX07Ci0KLSNkZWZpbmUgTUVNX01BU0sgNjQKLQotc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhciBtZW1faW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgbWVtX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyIG51bV9wYWdlczsKLX0gbWVtX3RhYmxlW10gPSB7Ci0gICAgeyAxNiwgMHgwYzAwMDAsIDQwIH0sCi0gICAgeyAxOCwgMHgwYzQwMDAsIDQwIH0sCi0gICAgeyAyMCwgMHgwYzgwMDAsIDQwIH0sCi0gICAgeyAyMiwgMHgwY2MwMDAsIDQwIH0sCi0gICAgeyAyNCwgMHgwZDAwMDAsIDQwIH0sCi0gICAgeyAyNiwgMHgwZDQwMDAsIDQwIH0sCi0gICAgeyAyOCwgMHgwZDgwMDAsIDQwIH0sCi0gICAgeyAzMCwgMHgwZGMwMDAsIDQwIH0sCi0gICAgezE0NCwgMHhmYzAwMDAsIDQwIH0sCi0gICAgezE0OCwgMHhmYzgwMDAsIDQwIH0sCi0gICAgezE1NCwgMHhmZDAwMDAsIDQwIH0sCi0gICAgezE1NiwgMHhmZDgwMDAsIDQwIH0sCi0gICAgeyAgMCwgMHgwYzAwMDAsIDIwIH0sCi0gICAgeyAgMSwgMHgwYzIwMDAsIDIwIH0sCi0gICAgeyAgMiwgMHgwYzQwMDAsIDIwIH0sCi0gICAgeyAgMywgMHgwYzYwMDAsIDIwIH0KLX07Ci0KLSNkZWZpbmUgSVJRX01BU0sgMjQzCi1zdHJ1Y3QgewotICAgdW5zaWduZWQgY2hhciBuZXdfaXJxOwotICAgdW5zaWduZWQgY2hhciBvbGRfaXJxOwotfSBpcnFfdGFibGVbXSA9IHsKLSAgIHsgIDMsICAzIH0sCi0gICB7ICA0LCAgNCB9LAotICAgeyAxMCwgMTAgfSwKLSAgIHsgMTQsIDE1IH0KLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWMtdWx0cmEuYyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jCmluZGV4IGI1NjRjNjcuLjZkOWRhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYy11bHRyYS5jCkBAIC0xOTQsMTIgKzE5NCw3IEBACiAJZXJyID0gZG9fdWx0cmFfcHJvYmUoZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDE7CiAJcmV0dXJuIGRldjsKLW91dDE6Ci0JY2xlYW51cF9jYXJkKGRldik7CiBvdXQ6CiAJZnJlZV9uZXRkZXYoZGV2KTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpAQCAtMzI1LDYgKzMyMCw5IEBACiAjZW5kaWYKIAlOUzgzOTBfaW5pdChkZXYsIDApOwogCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CiAJcmV0dXJuIDA7CiBvdXQ6CiAJcmVsZWFzZV9yZWdpb24oaW9hZGRyLCBVTFRSQV9JT19FWFRFTlQpOwpAQCAtNTgzLDExICs1ODEsOCBAQAogCQlkZXYtPmlycSA9IGlycVt0aGlzX2Rldl07CiAJCWRldi0+YmFzZV9hZGRyID0gaW9bdGhpc19kZXZdOwogCQlpZiAoZG9fdWx0cmFfcHJvYmUoZGV2KSA9PSAwKSB7Ci0JCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikgPT0gMCkgewotCQkJCWRldl91bHRyYVtmb3VuZCsrXSA9IGRldjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWNsZWFudXBfY2FyZChkZXYpOworCQkJZGV2X3VsdHJhW2ZvdW5kKytdID0gZGV2OworCQkJY29udGludWU7CiAJCX0KIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic21jLXVsdHJhLmM6IE5vIFNNQyBVbHRyYSBjYXJkIGZvdW5kIChpL28gPSAweCV4KS5cbiIsIGlvW3RoaXNfZGV2XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCmluZGV4IGZkODAwNDguLjE0MzhmZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NtYzkxeC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxeC5jCkBAIC0zMTUsMTUgKzMxNSwyNSBAQAogCXN0cnVjdCBzbWNfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IGxwLT5iYXNlOwogCXVuc2lnbmVkIGludCBjdGwsIGNmZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcGVuZGluZ19za2I7CiAKIAlEQkcoMiwgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOwogCi0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMsIGJsb2NrIFRYIHRhc2tsZXQgKi8KIAlzcGluX2xvY2soJmxwLT5sb2NrKTsKIAlTTUNfU0VMRUNUX0JBTksoMik7CiAJU01DX1NFVF9JTlRfTUFTSygwKTsKKwlwZW5kaW5nX3NrYiA9IGxwLT5wZW5kaW5nX3R4X3NrYjsKKwlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOwogCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CiAKKwkvKiBmcmVlIGFueSBwZW5kaW5nIHR4IHNrYiAqLworCWlmIChwZW5kaW5nX3NrYikgeworCQlkZXZfa2ZyZWVfc2tiKHBlbmRpbmdfc2tiKTsKKwkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOworCQlscC0+c3RhdHMudHhfYWJvcnRlZF9lcnJvcnMrKzsKKwl9CisKIAkvKgogCSAqIFRoaXMgcmVzZXRzIHRoZSByZWdpc3RlcnMgbW9zdGx5IHRvIGRlZmF1bHRzLCBidXQgZG9lc24ndAogCSAqIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5CkBAIC0zODksMTQgKzM5OSw2IEBACiAJU01DX1NFTEVDVF9CQU5LKDIpOwogCVNNQ19TRVRfTU1VX0NNRChNQ19SRVNFVCk7CiAJU01DX1dBSVRfTU1VX0JVU1koKTsKLQotCS8qIGNsZWFyIGFueXRoaW5nIHNhdmVkICovCi0JaWYgKGxwLT5wZW5kaW5nX3R4X3NrYiAhPSBOVUxMKSB7Ci0JCWRldl9rZnJlZV9za2IgKGxwLT5wZW5kaW5nX3R4X3NrYik7Ci0JCWxwLT5wZW5kaW5nX3R4X3NrYiA9IE5VTEw7Ci0JCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJbHAtPnN0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7Ci0JfQogfQogCiAvKgpAQCAtNDQwLDYgKzQ0Miw3IEBACiB7CiAJc3RydWN0IHNtY19sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CisJc3RydWN0IHNrX2J1ZmYgKnBlbmRpbmdfc2tiOwogCiAJREJHKDIsICIlczogJXNcbiIsIENBUkROQU1FLCBfX0ZVTkNUSU9OX18pOwogCkBAIC00NDcsNyArNDUwLDExIEBACiAJc3Bpbl9sb2NrKCZscC0+bG9jayk7CiAJU01DX1NFTEVDVF9CQU5LKDIpOwogCVNNQ19TRVRfSU5UX01BU0soMCk7CisJcGVuZGluZ19za2IgPSBscC0+cGVuZGluZ190eF9za2I7CisJbHAtPnBlbmRpbmdfdHhfc2tiID0gTlVMTDsKIAlzcGluX3VubG9jaygmbHAtPmxvY2spOworCWlmIChwZW5kaW5nX3NrYikKKwkJZGV2X2tmcmVlX3NrYihwZW5kaW5nX3NrYik7CiAKIAkvKiBhbmQgdGVsbCB0aGUgY2FyZCB0byBzdGF5IGF3YXkgZnJvbSB0aGF0IG5hc3R5IG91dHNpZGUgd29ybGQgKi8KIAlTTUNfU0VMRUNUX0JBTksoMCk7CkBAIC02MjcsNyArNjM0LDEyIEBACiAJfQogCiAJc2tiID0gbHAtPnBlbmRpbmdfdHhfc2tiOworCWlmICh1bmxpa2VseSghc2tiKSkgeworCQlzbWNfc3BlY2lhbF91bmxvY2soJmxwLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KIAlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOworCiAJcGFja2V0X25vID0gU01DX0dFVF9BUigpOwogCWlmICh1bmxpa2VseShwYWNrZXRfbm8gJiBBUl9GQUlMRUQpKSB7CiAJCXByaW50aygiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC5cbiIsIGRldi0+bmFtZSk7CkBAIC03MDIsNyArNzE0LDYgQEAKIAlEQkcoMywgIiVzOiAlc1xuIiwgZGV2LT5uYW1lLCBfX0ZVTkNUSU9OX18pOwogCiAJQlVHX09OKGxwLT5wZW5kaW5nX3R4X3NrYiAhPSBOVUxMKTsKLQlscC0+cGVuZGluZ190eF9za2IgPSBza2I7CiAKIAkvKgogCSAqIFRoZSBNTVUgd2FudHMgdGhlIG51bWJlciBvZiBwYWdlcyB0byBiZSB0aGUgbnVtYmVyIG9mIDI1NiBieXRlcwpAQCAtNzE4LDcgKzcyOSw2IEBACiAJbnVtUGFnZXMgPSAoKHNrYi0+bGVuICYgfjEpICsgKDYgLSAxKSkgPj4gODsKIAlpZiAodW5saWtlbHkobnVtUGFnZXMgPiA3KSkgewogCQlwcmludGsoIiVzOiBGYXIgdG9vIGJpZyBwYWNrZXQgZXJyb3IuXG4iLCBkZXYtPm5hbWUpOwotCQlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOwogCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CiAJCWxwLT5zdGF0cy50eF9kcm9wcGVkKys7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTc0NSw2ICs3NTUsNyBAQAogCiAJc21jX3NwZWNpYWxfdW5sb2NrKCZscC0+bG9jayk7CiAKKwlscC0+cGVuZGluZ190eF9za2IgPSBza2I7CiAgICAJaWYgKCFwb2xsX2NvdW50KSB7CiAJCS8qIG9oIHdlbGwsIHdhaXQgdW50aWwgdGhlIGNoaXAgZmluZHMgbWVtb3J5IGxhdGVyICovCiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKQEAgLTEwNjIsNyArMTA3Myw3IEBACiAJICAgYWJvdmUpLiBsaW5rd2F0Y2hfZXZlbnQoKSBhbHNvIHdhbnRzIHRoZSBuZXRsaW5rIHNlbWFwaG9yZS4KIAkqLwogCXdoaWxlKGxwLT53b3JrX3BlbmRpbmcpCi0JCXNjaGVkdWxlKCk7CisJCXlpZWxkKCk7CiAKIAlibWNyID0gc21jX3BoeV9yZWFkKGRldiwgcGh5LCBNSUlfQk1DUik7CiAJc21jX3BoeV93cml0ZShkZXYsIHBoeSwgTUlJX0JNQ1IsIGJtY3IgfCBCTUNSX1BET1dOKTsKQEAgLTE2MDYsMTQgKzE2MTcsOCBAQAogCiAJLyogY2xlYXIgZXZlcnl0aGluZyAqLwogCXNtY19zaHV0ZG93bihkZXYpOwotCisJdGFza2xldF9raWxsKCZscC0+dHhfdGFzayk7CiAJc21jX3BoeV9wb3dlcmRvd24oZGV2KTsKLQotCWlmIChscC0+cGVuZGluZ190eF9za2IpIHsKLQkJZGV2X2tmcmVlX3NrYihscC0+cGVuZGluZ190eF9za2IpOwotCQlscC0+cGVuZGluZ190eF9za2IgPSBOVUxMOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0xOTkzLDcgKzE5OTgsNyBAQAogICAgICAgCWlmIChyZXR2YWwpCiAgICAgICAJCWdvdG8gZXJyX291dDsKIAotCXNldF9pcnFfdHlwZShkZXYtPmlycSwgSVJRVF9SSVNJTkcpOworCXNldF9pcnFfdHlwZShkZXYtPmlycSwgU01DX0lSUV9UUklHR0VSX1RZUEUpOwogCiAjaWZkZWYgU01DX1VTRV9QWEFfRE1BCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc21jOTF4LmggYi9kcml2ZXJzL25ldC9zbWM5MXguaAppbmRleCA5NDY1MjhlLi43MDg5ZDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zbWM5MXguaAorKysgYi9kcml2ZXJzL25ldC9zbWM5MXguaApAQCAtMTgyLDYgKzE4MiwxNiBAQAogI2RlZmluZSBTTUNfaW5zbChhLCByLCBwLCBsKQlyZWFkc2woKGEpICsgKHIpLCBwLCBsKQogI2RlZmluZSBTTUNfb3V0c2woYSwgciwgcCwgbCkJd3JpdGVzbCgoYSkgKyAociksIHAsIGwpCiAKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2NwdS5oPgorCisjZGVmaW5lCVNNQ19JUlFfVFJJR0dFUl9UWVBFICgoIFwKKwkJICAgbWFjaGluZV9pc19vbWFwX2gyKCkgXAorCQl8fCBtYWNoaW5lX2lzX29tYXBfaDMoKSBcCisJCXx8IChtYWNoaW5lX2lzX29tYXBfaW5ub3ZhdG9yKCkgJiYgIWNwdV9pc19vbWFwMTUwKCkpIFwKKwkpID8gSVJRVF9GQUxMSU5HIDogSVJRVF9SSVNJTkcpCisKKwogI2VsaWYJZGVmaW5lZChDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWKQogCiAjZGVmaW5lIFNNQ19DQU5fVVNFXzhCSVQJMApAQCAtMzAwLDYgKzMxMCw5IEBACiAKICNlbmRpZgogCisjaWZuZGVmCVNNQ19JUlFfVFJJR0dFUl9UWVBFCisjZGVmaW5lCVNNQ19JUlFfVFJJR0dFUl9UWVBFCUlSUVRfUklTSU5HCisjZW5kaWYKIAogI2lmZGVmIFNNQ19VU0VfUFhBX0RNQQogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCmluZGV4IDEyZTJiNjguLjg4Yjg5ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKKysrIGIvZHJpdmVycy9uZXQvc3RhcmZpcmUuYwpAQCAtMTI4Niw3ICsxMjg2LDcgQEAKIAkJbnAtPnJ4X2luZm9baV0uc2tiID0gc2tiOwogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlicmVhazsKLQkJbnAtPnJ4X2luZm9baV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPnRhaWwsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCW5wLT5yeF9pbmZvW2ldLm1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT5kYXRhLCBucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCS8qIEdycnIsIHdlIGNhbm5vdCBvZmZzZXQgdG8gY29ycmVjdGx5IGFsaWduIHRoZSBJUCBoZWFkZXIuICovCiAJCW5wLT5yeF9yaW5nW2ldLnJ4YWRkciA9IGNwdV90b19kbWEobnAtPnJ4X2luZm9baV0ubWFwcGluZyB8IFJ4RGVzY1ZhbGlkKTsKQEAgLTE1NzIsNyArMTU3Miw3IEBACiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsCiAJCQkJCQkgICAgbnAtPnJ4X2luZm9bZW50cnldLm1hcHBpbmcsCiAJCQkJCQkgICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfaW5mb1tlbnRyeV0uc2tiLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfaW5mb1tlbnRyeV0uc2tiLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShucC0+cGNpX2RldiwKIAkJCQkJCSAgICAgICBucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZywKIAkJCQkJCSAgICAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtMTY5Niw3ICsxNjk2LDcgQEAKIAkJCWlmIChza2IgPT0gTlVMTCkKIAkJCQlicmVhazsJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KIAkJCW5wLT5yeF9pbmZvW2VudHJ5XS5tYXBwaW5nID0KLQkJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsIG5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJbnAtPnJ4X3JpbmdbZW50cnldLnJ4YWRkciA9CiAJCQkJY3B1X3RvX2RtYShucC0+cnhfaW5mb1tlbnRyeV0ubWFwcGluZyB8IFJ4RGVzY1ZhbGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCmluZGV4IDA4Y2I3MTcuLmQ1MDBhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwpAQCAtMTAyOCw3ICsxMDI4LDcgQEAKIAkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KIAkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5hZGRyID0gY3B1X3RvX2xlMzIoCi0JCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLCBucC0+cnhfYnVmX3N6LAorCQkJcGNpX21hcF9zaW5nbGUobnAtPnBjaV9kZXYsIHNrYi0+ZGF0YSwgbnAtPnJ4X2J1Zl9zeiwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKIAkJbnAtPnJ4X3JpbmdbaV0uZnJhZ1swXS5sZW5ndGggPSBjcHVfdG9fbGUzMihucC0+cnhfYnVmX3N6IHwgTGFzdEZyYWcpOwogCX0KQEAgLTEzNDEsNyArMTM0MSw3IEBACiAJCQkJCQkJICAgIG5wLT5yeF9idWZfc3osCiAJCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKLQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsIHBrdF9sZW4sIDApOworCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfc2tidWZmW2VudHJ5XS0+ZGF0YSwgcGt0X2xlbiwgMCk7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LAogCQkJCQkJCSAgICAgICBkZXNjLT5mcmFnWzBdLmFkZHIsCiAJCQkJCQkJICAgICAgIG5wLT5yeF9idWZfc3osCkBAIC0xNDAwLDcgKzE0MDAsNyBAQAogCQkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KIAkJCW5wLT5yeF9yaW5nW2VudHJ5XS5mcmFnWzBdLmFkZHIgPSBjcHVfdG9fbGUzMigKLQkJCQlwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldiwgc2tiLT50YWlsLAorCQkJCXBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LCBza2ItPmRhdGEsCiAJCQkJCW5wLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQl9CiAJCS8qIFBlcmhhcHMgd2UgbmVlZCBub3QgcmVzZXQgdGhpcyBmaWVsZC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKaW5kZXggNWNkNTBmZC4uMjYwOGU3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZ2VtLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0yOTg5LDEwICsyOTkwLDEwIEBACiAJICovCiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgogCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fR0VNICYmCi0JICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsICh1NjQpIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCkpIHsKKwkgICAgIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSB7CiAJCXBjaV91c2luZ19kYWMgPSAxOwogCX0gZWxzZSB7Ci0JCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgKHU2NCkgMHhmZmZmZmZmZik7CisJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCQlpZiAoZXJyKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sICIKIAkJCSAgICAgICAiYWJvcnRpbmcuXG4iKTsKQEAgLTMwNzgsNyArMzA3OSw5IEBACiAJZ3AtPnBoeV9taWkuZGV2ID0gZGV2OwogCWdwLT5waHlfbWlpLm1kaW9fcmVhZCA9IF9waHlfcmVhZDsKIAlncC0+cGh5X21paS5tZGlvX3dyaXRlID0gX3BoeV93cml0ZTsKLQorI2lmZGVmIENPTkZJR19QUENfUE1BQworCWdwLT5waHlfbWlpLnBsYXRmb3JtX2RhdGEgPSBncC0+b2Zfbm9kZTsKKyNlbmRpZgogCS8qIEJ5IGRlZmF1bHQsIHdlIHN0YXJ0IHdpdGggYXV0b25lZyAqLwogCWdwLT53YW50X2F1dG9uZWcgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMgYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmMKaW5kZXggMGZjYTQxNC4uZDNkZGI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuYwpAQCAtMzIsNiArMzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAorI2lmZGVmIENPTkZJR19QUENfUE1BQworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgInN1bmdlbV9waHkuaCIKIAogLyogTGluayBtb2RlcyBvZiB0aGUgQkNNNTQwMCBQSFkgKi8KQEAgLTI4MSwxMCArMjg1LDEyIEBACiBzdGF0aWMgaW50IGJjbTU0MjFfaW5pdChzdHJ1Y3QgbWlpX3BoeSogcGh5KQogewogCXUxNiBkYXRhOwotCWludCByZXY7CisJdW5zaWduZWQgaW50IGlkOwogCi0JcmV2ID0gcGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMikgJiAweDAwMGY7Ci0JaWYgKHJldiA9PSAwKSB7CisJaWQgPSAocGh5X3JlYWQocGh5LCBNSUlfUEhZU0lEMSkgPDwgMTYgfCBwaHlfcmVhZChwaHksIE1JSV9QSFlTSUQyKSk7CisKKwkvKiBSZXZpc2lvbiAwIG9mIDU0MjEgbmVlZHMgc29tZSBmaXh1cHMgKi8KKwlpZiAoaWQgPT0gMHgwMDIwNjBlMCkgewogCQkvKiBUaGlzIGlzIGJvcnJvd2VkIGZyb20gTWFjT1MKIAkJICovCiAJCXBoeV93cml0ZShwaHksIDB4MTgsIDB4MTAwNyk7CkBAIC0yOTcsMjEgKzMwMywyOCBAQAogCQlkYXRhID0gcGh5X3JlYWQocGh5LCAweDE1KTsKIAkJcGh5X3dyaXRlKHBoeSwgMHgxNSwgZGF0YSB8IDB4MDIwMCk7CiAJfQotI2lmIDAKLQkvKiBUaGlzIGhhcyB0byBiZSB2ZXJpZmllZCBiZWZvcmUgSSBlbmFibGUgaXQgKi8KLQkvKiBFbmFibGUgYXV0b21hdGljIGxvdy1wb3dlciAqLwotCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OTAwMik7Ci0JcGh5X3dyaXRlKHBoeSwgMHgxYywgMHhhODIxKTsKLQlwaHlfd3JpdGUocGh5LCAweDFjLCAweDk0MWQpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbnQgYmNtNTQyMWsyX2luaXQoc3RydWN0IG1paV9waHkqIHBoeSkKLXsKLQkvKiBJbml0IGNvZGUgYm9ycm93ZWQgZnJvbSBPRiAqLwotCXBoeV93cml0ZShwaHksIDQsIDB4MDFlMSk7Ci0JcGh5X3dyaXRlKHBoeSwgOSwgMHgwMzAwKTsKKwkvKiBQaWNrIHVwIHNvbWUgaW5pdCBjb2RlIGZyb20gT0YgZm9yIEsyIHZlcnNpb24gKi8KKwlpZiAoKGlkICYgMHhmZmZmZmZmMCkgPT0gMHgwMDIwNjJlMCkgeworCQlwaHlfd3JpdGUocGh5LCA0LCAweDAxZTEpOworCQlwaHlfd3JpdGUocGh5LCA5LCAweDAzMDApOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBlbmFibGUgYXV0b21hdGljIGxvdyBwb3dlciAqLworI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChwaHktPnBsYXRmb3JtX2RhdGEpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mX2dldF9wYXJlbnQocGh5LT5wbGF0Zm9ybV9kYXRhKTsKKwkJaW50IGNhbl9sb3dfcG93ZXIgPSAxOworCQlpZiAobnAgPT0gTlVMTCB8fCBnZXRfcHJvcGVydHkobnAsICJuby1hdXRvbG93cG93ZXIiLCBOVUxMKSkKKwkJCWNhbl9sb3dfcG93ZXIgPSAwOworCQlpZiAoY2FuX2xvd19wb3dlcikgeworCQkJLyogRW5hYmxlIGF1dG9tYXRpYyBsb3ctcG93ZXIgKi8KKwkJCXBoeV93cml0ZShwaHksIDB4MWMsIDB4OTAwMik7CisJCQlwaHlfd3JpdGUocGh5LCAweDFjLCAweGE4MjEpOworCQkJcGh5X3dyaXRlKHBoeSwgMHgxYywgMHg5NDFkKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KIAogCXJldHVybiAwOwogfQpAQCAtNzYyLDcgKzc3NSw3IEBACiAKIC8qIEJyb2FkY29tIEJDTSA1NDIxIGJ1aWx0LWluIEsyICovCiBzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0MjFrMl9waHlfb3BzID0gewotCS5pbml0CQk9IGJjbTU0MjFrMl9pbml0LAorCS5pbml0CQk9IGJjbTU0MjFfaW5pdCwKIAkuc3VzcGVuZAk9IGJjbTU0MTFfc3VzcGVuZCwKIAkuc2V0dXBfYW5lZwk9IGJjbTU0eHhfc2V0dXBfYW5lZywKIAkuc2V0dXBfZm9yY2VkCT0gYmNtNTR4eF9zZXR1cF9mb3JjZWQsCkBAIC03NzksNiArNzkyLDI1IEBACiAJLm9wcwkJPSAmYmNtNTQyMWsyX3BoeV9vcHMKIH07CiAKKy8qIEJyb2FkY29tIEJDTSA1NDYyIGJ1aWx0LWluIFZlc3RhICovCitzdGF0aWMgc3RydWN0IG1paV9waHlfb3BzIGJjbTU0NjJWX3BoeV9vcHMgPSB7CisJLmluaXQJCT0gYmNtNTQyMV9pbml0LAorCS5zdXNwZW5kCT0gYmNtNTQxMV9zdXNwZW5kLAorCS5zZXR1cF9hbmVnCT0gYmNtNTR4eF9zZXR1cF9hbmVnLAorCS5zZXR1cF9mb3JjZWQJPSBiY201NHh4X3NldHVwX2ZvcmNlZCwKKwkucG9sbF9saW5rCT0gZ2VubWlpX3BvbGxfbGluaywKKwkucmVhZF9saW5rCT0gYmNtNTR4eF9yZWFkX2xpbmssCit9OworCitzdGF0aWMgc3RydWN0IG1paV9waHlfZGVmIGJjbTU0NjJWX3BoeV9kZWYgPSB7CisJLnBoeV9pZAkJPSAweDAwMjA2MGQwLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJDTTU0NjItVmVzdGEiLAorCS5mZWF0dXJlcwk9IE1JSV9HQklUX0ZFQVRVUkVTLAorCS5tYWdpY19hbmVnCT0gMSwKKwkub3BzCQk9ICZiY201NDYyVl9waHlfb3BzCit9OworCiAvKiBNYXJ2ZWxsIDg4RTExMDEgKEFwcGxlIHNlZW0gdG8gZGVhbCB3aXRoIDIgZGlmZmVyZW50IHJldnMsCiAgKiBJIG1hc2tlZCBvdXQgdGhlIDggbGFzdCBiaXRzIHRvIGdldCBib3RoLCBidXQgc29tZSBzcGVjcwogICogd291bGQgYmUgdXNlZnVsIGhlcmUpIC0tQmVuSC4KQEAgLTgyNCw2ICs4NTYsNyBAQAogCSZiY201NDExX3BoeV9kZWYsCiAJJmJjbTU0MjFfcGh5X2RlZiwKIAkmYmNtNTQyMWsyX3BoeV9kZWYsCisJJmJjbTU0NjJWX3BoeV9kZWYsCiAJJm1hcnZlbGxfcGh5X2RlZiwKIAkmZ2VubWlpX3BoeV9kZWYsCiAJTlVMTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oIGIvZHJpdmVycy9uZXQvc3VuZ2VtX3BoeS5oCmluZGV4IDgyMmNiNTguLjQzMDU0NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmdlbV9waHkuaAorKysgYi9kcml2ZXJzL25ldC9zdW5nZW1fcGh5LmgKQEAgLTQzLDkgKzQzLDEwIEBACiAJaW50CQkJcGF1c2U7CiAKIAkvKiBQcm92aWRlZCBieSBob3N0IGNoaXAgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSoJZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAJaW50ICgqbWRpb19yZWFkKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG1paV9pZCwgaW50IHJlZyk7CiAJdm9pZCAoKm1kaW9fd3JpdGUpIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbWlpX2lkLCBpbnQgcmVnLCBpbnQgdmFsKTsKKwl2b2lkCQkJKnBsYXRmb3JtX2RhdGE7CiB9OwogCiAvKiBQYXNzIGluIGEgc3RydWN0IG1paV9waHkgd2l0aCBkZXYsIG1kaW9fcmVhZCBhbmQgbWRpb193cml0ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCBhMGI4ODQ4Li41NDY0MDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtNjYsOCArNjYsOCBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInRnMyIKICNkZWZpbmUgUEZYIERSVl9NT0RVTEVfTkFNRQkiOiAiCi0jZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4zMSIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW5lIDgsIDIwMDUiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMy4zMyIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdWx5IDUsIDIwMDUiCiAKICNkZWZpbmUgVEczX0RFRl9NQUNfTU9ERQkwCiAjZGVmaW5lIFRHM19ERUZfUlhfTU9ERQkJMApAQCAtMzM3LDEyICszMzcsMTAgQEAKIHN0YXRpYyB2b2lkIHRnM193cml0ZV9pbmRpcmVjdF9yZWczMihzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKIHsKIAlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgIT0gMCkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfYmgoJnRwLT5pbmRpcmVjdF9sb2NrKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19CQVNFX0FERFIsIG9mZik7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9SRUdfREFUQSwgdmFsKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRwLT5pbmRpcmVjdF9sb2NrKTsKIAl9IGVsc2UgewogCQl3cml0ZWwodmFsLCB0cC0+cmVncyArIG9mZik7CiAJCWlmICgodHAtPnRnM19mbGFncyAmIFRHM19GTEFHXzU3MDFfUkVHX1dSSVRFX0JVRykgIT0gMCkKQEAgLTM1MywxMiArMzUxLDEwIEBACiBzdGF0aWMgdm9pZCBfdHczMl9mbHVzaChzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyIHZhbCkKIHsKIAlpZiAoKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19QQ0lYX1RBUkdFVF9IV0JVRykgIT0gMCkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfYmgoJnRwLT5pbmRpcmVjdF9sb2NrKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX1JFR19CQVNFX0FERFIsIG9mZik7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9SRUdfREFUQSwgdmFsKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRwLT5pbmRpcmVjdF9sb2NrKTsKIAl9IGVsc2UgewogCQl2b2lkIF9faW9tZW0gKmRlc3QgPSB0cC0+cmVncyArIG9mZjsKIAkJd3JpdGVsKHZhbCwgZGVzdCk7CkBAIC0zOTgsMjggKzM5NCwyNCBAQAogCiBzdGF0aWMgdm9pZCB0ZzNfd3JpdGVfbWVtKHN0cnVjdCB0ZzMgKnRwLCB1MzIgb2ZmLCB1MzIgdmFsKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJnRwLT5pbmRpcmVjdF9sb2NrKTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHRwLT5wZGV2LCBURzNQQ0lfTUVNX1dJTl9CQVNFX0FERFIsIG9mZik7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fREFUQSwgdmFsKTsKIAogCS8qIEFsd2F5cyBsZWF2ZSB0aGlzIGFzIHplcm8uICovCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0cC0+cGRldiwgVEczUENJX01FTV9XSU5fQkFTRV9BRERSLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZ0cC0+aW5kaXJlY3RfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIHRnM19yZWFkX21lbShzdHJ1Y3QgdGczICp0cCwgdTMyIG9mZiwgdTMyICp2YWwpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0cC0+aW5kaXJlY3RfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmdHAtPmluZGlyZWN0X2xvY2spOwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgb2ZmKTsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0RBVEEsIHZhbCk7CiAKIAkvKiBBbHdheXMgbGVhdmUgdGhpcyBhcyB6ZXJvLiAqLwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQodHAtPnBkZXYsIFRHM1BDSV9NRU1fV0lOX0JBU0VfQUREUiwgMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHAtPmluZGlyZWN0X2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmdHAtPmluZGlyZWN0X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCB0ZzNfZGlzYWJsZV9pbnRzKHN0cnVjdCB0ZzMgKnRwKQpAQCAtNDM4LDEyICs0MzAsMTQgQEAKIAogc3RhdGljIHZvaWQgdGczX2VuYWJsZV9pbnRzKHN0cnVjdCB0ZzMgKnRwKQogeworCXRwLT5pcnFfc3luYyA9IDA7CisJd21iKCk7CisKIAl0dzMyKFRHM1BDSV9NSVNDX0hPU1RfQ1RSTCwKIAkgICAgICh0cC0+bWlzY19ob3N0X2N0cmwgJiB+TUlTQ19IT1NUX0NUUkxfTUFTS19QQ0lfSU5UKSk7CiAJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywKIAkJICAgICAodHAtPmxhc3RfdGFnIDw8IDI0KSk7CiAJdHIzMihNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1cpOwotCiAJdGczX2NvbmRfaW50KHRwKTsKIH0KIApAQCAtNDkyLDYgKzQ4Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0ZzNfbmV0aWZfc3RvcChzdHJ1Y3QgdGczICp0cCkKIHsKKwl0cC0+ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CS8qIHByZXZlbnQgdHggdGltZW91dCAqLwogCW5ldGlmX3BvbGxfZGlzYWJsZSh0cC0+ZGV2KTsKIAluZXRpZl90eF9kaXNhYmxlKHRwLT5kZXYpOwogfQpAQCAtNTA0LDcgKzQ5OSw4IEBACiAJICogKHN1Y2ggYXMgYWZ0ZXIgdGczX2luaXRfaHcpCiAJICovCiAJbmV0aWZfcG9sbF9lbmFibGUodHAtPmRldik7Ci0JdGczX2NvbmRfaW50KHRwKTsKKwl0cC0+aHdfc3RhdHVzLT5zdGF0dXMgfD0gU0RfU1RBVFVTX1VQREFURUQ7CisJdGczX2VuYWJsZV9pbnRzKHRwKTsKIH0KIAogc3RhdGljIHZvaWQgdGczX3N3aXRjaF9jbG9ja3Moc3RydWN0IHRnMyAqdHApCkBAIC0yNTc4LDcgKzI1NzQsNyBAQAogCQkJc3dfaWR4ID0gTkVYVF9UWChzd19pZHgpOwogCQl9CiAKLQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOwogCX0KIAogCXRwLT50eF9jb25zID0gc3dfaWR4OwpAQCAtMjg4NCwxMSArMjg4MCw4IEBACiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCB0ZzNfaHdfc3RhdHVzICpzYmxrID0gdHAtPmh3X3N0YXR1czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBkb25lOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBoYW5kbGUgbGluayBjaGFuZ2UgYW5kIG90aGVyIHBoeSBldmVudHMgKi8KIAlpZiAoISh0cC0+dGczX2ZsYWdzICYKIAkgICAgICAoVEczX0ZMQUdfVVNFX0xJTktDSEdfUkVHIHwKQEAgLTI4OTYsNyArMjg4OSw5IEBACiAJCWlmIChzYmxrLT5zdGF0dXMgJiBTRF9TVEFUVVNfTElOS19DSEcpIHsKIAkJCXNibGstPnN0YXR1cyA9IFNEX1NUQVRVU19VUERBVEVEIHwKIAkJCQkoc2Jsay0+c3RhdHVzICYgflNEX1NUQVRVU19MSU5LX0NIRyk7CisJCQlzcGluX2xvY2soJnRwLT5sb2NrKTsKIAkJCXRnM19zZXR1cF9waHkodHAsIDApOworCQkJc3Bpbl91bmxvY2soJnRwLT5sb2NrKTsKIAkJfQogCX0KIApAQCAtMjkwNyw4ICsyOTAyLDYgQEAKIAkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKIAl9CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOwotCiAJLyogcnVuIFJYIHRocmVhZCwgd2l0aGluIHRoZSBib3VuZHMgc2V0IGJ5IE5BUEkuCiAJICogQWxsIFJYICJsb2NraW5nIiBpcyBkb25lIGJ5IGVuc3VyaW5nIG91dHNpZGUKIAkgKiBjb2RlIHN5bmNocm9uaXplcyB3aXRoIGRldi0+cG9sbCgpCkBAIC0yOTI5LDE5ICsyOTIyLDU0IEBACiAJaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19UQUdHRURfU1RBVFVTKQogCQl0cC0+bGFzdF90YWcgPSBzYmxrLT5zdGF0dXNfdGFnOwogCXJtYigpOworCXNibGstPnN0YXR1cyAmPSB+U0RfU1RBVFVTX1VQREFURUQ7CiAKIAkvKiBpZiBubyBtb3JlIHdvcmssIHRlbGwgbmV0IHN0YWNrIGFuZCBOSUMgd2UncmUgZG9uZSAqLwogCWRvbmUgPSAhdGczX2hhc193b3JrKHRwKTsKIAlpZiAoZG9uZSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKLQkJX19uZXRpZl9yeF9jb21wbGV0ZShuZXRkZXYpOworCQlzcGluX2xvY2soJnRwLT5sb2NrKTsKKwkJbmV0aWZfcnhfY29tcGxldGUobmV0ZGV2KTsKIAkJdGczX3Jlc3RhcnRfaW50cyh0cCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7CiAJfQogCiAJcmV0dXJuIChkb25lID8gMCA6IDEpOwogfQogCitzdGF0aWMgdm9pZCB0ZzNfaXJxX3F1aWVzY2Uoc3RydWN0IHRnMyAqdHApCit7CisJQlVHX09OKHRwLT5pcnFfc3luYyk7CisKKwl0cC0+aXJxX3N5bmMgPSAxOworCXNtcF9tYigpOworCisJc3luY2hyb25pemVfaXJxKHRwLT5wZGV2LT5pcnEpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZzNfaXJxX3N5bmMoc3RydWN0IHRnMyAqdHApCit7CisJcmV0dXJuIHRwLT5pcnFfc3luYzsKK30KKworLyogRnVsbHkgc2h1dGRvd24gYWxsIHRnMyBkcml2ZXIgYWN0aXZpdHkgZWxzZXdoZXJlIGluIHRoZSBzeXN0ZW0uCisgKiBJZiBpcnFfc3luYyBpcyBub24temVybywgdGhlbiB0aGUgSVJRIGhhbmRsZXIgbXVzdCBiZSBzeW5jaHJvbml6ZWQKKyAqIHdpdGggYXMgd2VsbC4gIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSBleGNlcHQgd2hlbgorICogc2h1dHRpbmcgZG93biB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGczX2Z1bGxfbG9jayhzdHJ1Y3QgdGczICp0cCwgaW50IGlycV9zeW5jKQoreworCWlmIChpcnFfc3luYykKKwkJdGczX2lycV9xdWllc2NlKHRwKTsKKwlzcGluX2xvY2tfYmgoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRnM19mdWxsX3VubG9jayhzdHJ1Y3QgdGczICp0cCkKK3sKKwlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZ0cC0+bG9jayk7Cit9CisKIC8qIE1TSSBJU1IgLSBObyBuZWVkIHRvIGNoZWNrIGZvciBpbnRlcnJ1cHQgc2hhcmluZyBhbmQgbm8gbmVlZCB0bwogICogZmx1c2ggc3RhdHVzIGJsb2NrIGFuZCBpbnRlcnJ1cHQgbWFpbGJveC4gUENJIG9yZGVyaW5nIHJ1bGVzCiAgKiBndWFyYW50ZWUgdGhhdCBNU0kgd2lsbCBhcnJpdmUgYWZ0ZXIgdGhlIHN0YXR1cyBibG9jay4KQEAgLTI5NTEsOSArMjk3OSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHAtPmxvY2ssIGZsYWdzKTsKIAogCS8qCiAJICogV3JpdGluZyBhbnkgdmFsdWUgdG8gaW50ci1tYm94LTAgY2xlYXJzIFBDSSBJTlRBIyBhbmQKQEAgLTI5NjQsNiArMjk4OSw5IEBACiAJICovCiAJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywgMHgwMDAwMDAwMSk7CiAJdHAtPmxhc3RfdGFnID0gc2Jsay0+c3RhdHVzX3RhZzsKKwlybWIoKTsKKwlpZiAodGczX2lycV9zeW5jKHRwKSkKKwkJZ290byBvdXQ7CiAJc2Jsay0+c3RhdHVzICY9IH5TRF9TVEFUVVNfVVBEQVRFRDsKIAlpZiAobGlrZWx5KHRnM19oYXNfd29yayh0cCkpKQogCQluZXRpZl9yeF9zY2hlZHVsZShkZXYpOwkJLyogc2NoZWR1bGUgTkFQSSBwb2xsICovCkBAIC0yOTcyLDkgKzMwMDAsNyBAQAogCQl0dzMyX21haWxib3goTUFJTEJPWF9JTlRFUlJVUFRfMCArIFRHM182NEJJVF9SRUdfTE9XLAogCQkJICAgICB0cC0+bGFzdF90YWcgPDwgMjQpOwogCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0KK291dDoKIAlyZXR1cm4gSVJRX1JFVFZBTCgxKTsKIH0KIApAQCAtMjk4MywxMSArMzAwOSw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBJbiBJTlR4IG1vZGUsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaW50ZXJydXB0IHRvIGFycml2ZSBhdAogCSAqIHRoZSBDUFUgYmVmb3JlIHRoZSBzdGF0dXMgYmxvY2sgcG9zdGVkIHByaW9yIHRvIHRoZSBpbnRlcnJ1cHQuCiAJICogUmVhZGluZyB0aGUgUENJIFN0YXRlIHJlZ2lzdGVyIHdpbGwgY29uZmlybSB3aGV0aGVyIHRoZQpAQCAtMzAwNCw2ICszMDI3LDggQEAKIAkJICovCiAJCXR3MzJfbWFpbGJveChNQUlMQk9YX0lOVEVSUlVQVF8wICsgVEczXzY0QklUX1JFR19MT1csCiAJCQkgICAgIDB4MDAwMDAwMDEpOworCQlpZiAodGczX2lycV9zeW5jKHRwKSkKKwkJCWdvdG8gb3V0OwogCQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOwogCQlpZiAobGlrZWx5KHRnM19oYXNfd29yayh0cCkpKQogCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsJCS8qIHNjaGVkdWxlIE5BUEkgcG9sbCAqLwpAQCAtMzAxOCw5ICszMDQzLDcgQEAKIAl9IGVsc2UgewkvKiBzaGFyZWQgaW50ZXJydXB0ICovCiAJCWhhbmRsZWQgPSAwOwogCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0KK291dDoKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIApAQCAtMzAyOSwxMSArMzA1Miw4IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHRnM19od19zdGF0dXMgKnNibGsgPSB0cC0+aHdfc3RhdHVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGhhbmRsZWQgPSAxOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBJbiBJTlR4IG1vZGUsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaW50ZXJydXB0IHRvIGFycml2ZSBhdAogCSAqIHRoZSBDUFUgYmVmb3JlIHRoZSBzdGF0dXMgYmxvY2sgcG9zdGVkIHByaW9yIHRvIHRoZSBpbnRlcnJ1cHQuCiAJICogUmVhZGluZyB0aGUgUENJIFN0YXRlIHJlZ2lzdGVyIHdpbGwgY29uZmlybSB3aGV0aGVyIHRoZQpAQCAtMzA1MSw2ICszMDcxLDkgQEAKIAkJdHczMl9tYWlsYm94KE1BSUxCT1hfSU5URVJSVVBUXzAgKyBURzNfNjRCSVRfUkVHX0xPVywKIAkJCSAgICAgMHgwMDAwMDAwMSk7CiAJCXRwLT5sYXN0X3RhZyA9IHNibGstPnN0YXR1c190YWc7CisJCXJtYigpOworCQlpZiAodGczX2lycV9zeW5jKHRwKSkKKwkJCWdvdG8gb3V0OwogCQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOwogCQlpZiAobGlrZWx5KHRnM19oYXNfd29yayh0cCkpKQogCQkJbmV0aWZfcnhfc2NoZWR1bGUoZGV2KTsJCS8qIHNjaGVkdWxlIE5BUEkgcG9sbCAqLwpAQCAtMzA2NSw5ICszMDg4LDcgQEAKIAl9IGVsc2UgewkvKiBzaGFyZWQgaW50ZXJydXB0ICovCiAJCWhhbmRsZWQgPSAwOwogCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0KK291dDoKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIApAQCAtMzEwNiw4ICszMTI3LDcgQEAKIAogCXRnM19uZXRpZl9zdG9wKHRwKTsKIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZnVsbF9sb2NrKHRwLCAxKTsKIAogCXJlc3RhcnRfdGltZXIgPSB0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1JFU1RBUlRfVElNRVI7CiAJdHAtPnRnM19mbGFnczIgJj0gflRHM19GTEcyX1JFU1RBUlRfVElNRVI7CkBAIC0zMTE3LDggKzMxMzcsNyBAQAogCiAJdGczX25ldGlmX3N0YXJ0KHRwKTsKIAotCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIAogCWlmIChyZXN0YXJ0X3RpbWVyKQogCQltb2RfdGltZXIoJnRwLT50aW1lciwgamlmZmllcyArIDEpOwpAQCAtMzIyNCwzOSArMzI0MywyMSBAQAogCXVuc2lnbmVkIGludCBpOwogCXUzMiBsZW4sIGVudHJ5LCBiYXNlX2ZsYWdzLCBtc3M7CiAJaW50IHdvdWxkX2hpdF9od2J1ZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAogCS8qIE5vIEJIIGRpc2FibGluZyBmb3IgdHhfbG9jayBoZXJlLiAgV2UgYXJlIHJ1bm5pbmcgaW4gQkggZGlzYWJsZWQKIAkgKiBjb250ZXh0IGFuZCBUWCByZWNsYWltIHJ1bnMgdmlhIHRwLT5wb2xsIGluc2lkZSBvZiBhIHNvZnR3YXJlCi0JICogaW50ZXJydXB0LiAgUmVqb2ljZSEKLQkgKgotCSAqIEFjdHVhbGx5LCB0aGluZ3MgYXJlIG5vdCBzbyBzaW1wbGUuICBJZiB3ZSBhcmUgdG8gdGFrZSBhIGh3Ci0JICogSVJRIGhlcmUsIHdlIGNhbiBkZWFkbG9jaywgY29uc2lkZXI6Ci0JICoKLQkgKiAgICAgICBDUFUxCQlDUFUyCi0JICogICB0ZzNfc3RhcnRfeG1pdAotCSAqICAgdGFrZSB0cC0+dHhfbG9jawotCSAqCQkJdGczX3RpbWVyCi0JICoJCQl0YWtlIHRwLT5sb2NrCi0JICogICB0ZzNfaW50ZXJydXB0Ci0JICogICBzcGluIG9uIHRwLT5sb2NrCi0JICoJCQlzcGluIG9uIHRwLT50eF9sb2NrCi0JICoKLQkgKiBTbyB3ZSByZWFsbHkgZG8gbmVlZCB0byBkaXNhYmxlIGludGVycnVwdHMgd2hlbiB0YWtpbmcKLQkgKiB0eF9sb2NrIGhlcmUuCisJICogaW50ZXJydXB0LiAgRnVydGhlcm1vcmUsIElSUSBwcm9jZXNzaW5nIHJ1bnMgbG9ja2xlc3Mgc28gd2UgaGF2ZQorCSAqIG5vIElSUSBjb250ZXh0IGRlYWRsb2NrcyB0byB3b3JyeSBhYm91dCBlaXRoZXIuICBSZWpvaWNlIQogCSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoIXNwaW5fdHJ5bG9jaygmdHAtPnR4X2xvY2spKSB7IAotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJaWYgKCFzcGluX3RyeWxvY2soJnRwLT50eF9sb2NrKSkKIAkJcmV0dXJuIE5FVERFVl9UWF9MT0NLRUQ7IAotCX0gCiAKIAkvKiBUaGlzIGlzIGEgaGFyZCBlcnJvciwgbG9nIGl0LiAqLwogCWlmICh1bmxpa2VseShUWF9CVUZGU19BVkFJTCh0cCkgPD0gKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSkpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+dHhfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOwogCQlwcmludGsoS0VSTl9FUlIgUEZYICIlczogQlVHISBUeCBSaW5nIGZ1bGwgd2hlbiBxdWV1ZSBhd2FrZSFcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUpOwogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CkBAIC0zNDIxLDcgKzM0MjIsNyBAQAogCiBvdXRfdW5sb2NrOgogICAgIAltbWlvd2IoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+dHhfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7CiAKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIApAQCAtMzQ1NSw4ICszNDU2LDggQEAKIAl9CiAKIAl0ZzNfbmV0aWZfc3RvcCh0cCk7Ci0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJdGczX2Z1bGxfbG9jayh0cCwgMSk7CiAKIAl0ZzNfaGFsdCh0cCwgUkVTRVRfS0lORF9TSFVURE9XTiwgMSk7CiAKQEAgLTM0NjYsOCArMzQ2Nyw3IEBACiAKIAl0ZzNfbmV0aWZfc3RhcnQodHApOwogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MDg4LDkgKzUwODgsOSBAQAogCiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIGRldi0+YWRkcl9sZW4pOwogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwogCV9fdGczX3NldF9tYWNfYWRkcih0cCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnRwLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTExNyw3ICs1MTE3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX190ZzNfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci1zdGF0aWMgdm9pZCB0ZzNfc2V0X2NvYWxlc2NlKHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqZWMpCitzdGF0aWMgdm9pZCBfX3RnM19zZXRfY29hbGVzY2Uoc3RydWN0IHRnMyAqdHAsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAl0dzMyKEhPU1RDQ19SWENPTF9USUNLUywgZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKIAl0dzMyKEhPU1RDQ19UWENPTF9USUNLUywgZWMtPnR4X2NvYWxlc2NlX3VzZWNzKTsKQEAgLTU0NjAsNyArNTQ2MCw3IEBACiAJCXVkZWxheSgxMCk7CiAJfQogCi0JdGczX3NldF9jb2FsZXNjZSh0cCwgJnRwLT5jb2FsKTsKKwlfX3RnM19zZXRfY29hbGVzY2UodHAsICZ0cC0+Y29hbCk7CiAKIAkvKiBzZXQgc3RhdHVzIGJsb2NrIERNQSBhZGRyZXNzICovCiAJdHczMihIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIgKyBURzNfNjRCSVRfUkVHX0hJR0gsCkBAIC01NzI3LDkgKzU3MjcsNiBAQAogCiAJdGczX3dyaXRlX3NpZ19wb3N0X3Jlc2V0KHRwLCBSRVNFVF9LSU5EX0lOSVQpOwogCi0JaWYgKHRwLT50ZzNfZmxhZ3MgJiBURzNfRkxBR19JTklUX0NPTVBMRVRFKQotCQl0ZzNfZW5hYmxlX2ludHModHApOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU4MDIsMTAgKzU3OTksOCBAQAogc3RhdGljIHZvaWQgdGczX3RpbWVyKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSAoc3RydWN0IHRnMyAqKSBfX29wYXF1ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7Ci0Jc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJc3Bpbl9sb2NrKCZ0cC0+bG9jayk7CiAKIAlpZiAoISh0cC0+dGczX2ZsYWdzICYgVEczX0ZMQUdfVEFHR0VEX1NUQVRVUykpIHsKIAkJLyogQWxsIG9mIHRoaXMgZ2FyYmFnZSBpcyBiZWNhdXNlIHdoZW4gdXNpbmcgbm9uLXRhZ2dlZApAQCAtNTgyMiw4ICs1ODE3LDcgQEAKIAogCQlpZiAoISh0cjMyKFdETUFDX01PREUpICYgV0RNQUNfTU9ERV9FTkFCTEUpKSB7CiAJCQl0cC0+dGczX2ZsYWdzMiB8PSBURzNfRkxHMl9SRVNUQVJUX1RJTUVSOwotCQkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCQlzcGluX3VubG9jaygmdHAtPmxvY2spOwogCQkJc2NoZWR1bGVfd29yaygmdHAtPnJlc2V0X3Rhc2spOwogCQkJcmV0dXJuOwogCQl9CkBAIC01ODkxLDggKzU4ODUsNyBAQAogCQl0cC0+YXNmX2NvdW50ZXIgPSB0cC0+YXNmX211bHRpcGxpZXI7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZ0cC0+bG9jayk7CiAKIAl0cC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0cC0+dGltZXJfb2Zmc2V0OwogCWFkZF90aW1lcigmdHAtPnRpbWVyKTsKQEAgLTYwMDcsMTQgKzYwMDAsMTIgQEAKIAkvKiBOZWVkIHRvIHJlc2V0IHRoZSBjaGlwIGJlY2F1c2UgdGhlIE1TSSBjeWNsZSBtYXkgaGF2ZSB0ZXJtaW5hdGVkCiAJICogd2l0aCBNYXN0ZXIgQWJvcnQuCiAJICovCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19mdWxsX2xvY2sodHAsIDEpOwogCiAJdGczX2hhbHQodHAsIFJFU0VUX0tJTkRfU0hVVERPV04sIDEpOwogCWVyciA9IHRnM19pbml0X2h3KHRwKTsKIAotCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIAogCWlmIChlcnIpCiAJCWZyZWVfaXJxKHRwLT5wZGV2LT5pcnEsIGRldik7CkBAIC02MDI3LDE0ICs2MDE4LDEyIEBACiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBlcnI7CiAKLQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKIAl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKIAl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19JTklUX0NPTVBMRVRFOwogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogCiAJLyogVGhlIHBsYWNlbWVudCBvZiB0aGlzIGNhbGwgaXMgdGllZAogCSAqIHRvIHRoZSBzZXR1cCBhbmQgdXNlIG9mIEhvc3QgVFggZGVzY3JpcHRvcnMuCkBAIC02MDgxLDggKzYwNzAsNyBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAogCWVyciA9IHRnM19pbml0X2h3KHRwKTsKIAlpZiAoZXJyKSB7CkBAIC02MTA2LDggKzYwOTQsNyBAQAogCQl0cC0+dGltZXIuZnVuY3Rpb24gPSB0ZzNfdGltZXI7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogCiAJaWYgKGVycikgewogCQlmcmVlX2lycSh0cC0+cGRldi0+aXJxLCBkZXYpOwpAQCAtNjEyMyw4ICs2MTEwLDcgQEAKIAkJZXJyID0gdGczX3Rlc3RfbXNpKHRwKTsKIAogCQlpZiAoZXJyKSB7Ci0JCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0JCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwkJCXRnM19mdWxsX2xvY2sodHAsIDApOwogCiAJCQlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9VU0lOR19NU0kpIHsKIAkJCQlwY2lfZGlzYWJsZV9tc2kodHAtPnBkZXYpOwpAQCAtNjEzNCwyMiArNjEyMCwxOSBAQAogCQkJdGczX2ZyZWVfcmluZ3ModHApOwogCQkJdGczX2ZyZWVfY29uc2lzdGVudCh0cCk7CiAKLQkJCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0JCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJCXRnM19mdWxsX3VubG9jayh0cCk7CiAKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CiAKLQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKIAlhZGRfdGltZXIoJnRwLT50aW1lcik7CiAJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19JTklUX0NPTVBMRVRFOwogCXRnM19lbmFibGVfaW50cyh0cCk7CiAKLQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCXRnM19mdWxsX3VubG9jayh0cCk7CiAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCkBAIC02Mzk1LDggKzYzNzgsNyBAQAogCiAJZGVsX3RpbWVyX3N5bmMoJnRwLT50aW1lcik7CiAKLQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJdGczX2Z1bGxfbG9jayh0cCwgMSk7CiAjaWYgMAogCXRnM19kdW1wX3N0YXRlKHRwKTsKICNlbmRpZgpAQCAtNjQxMCw4ICs2MzkyLDcgQEAKIAkJICBURzNfRkxBR19HT1RfU0VSREVTX0ZMT1dDVEwpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKHRwLT5kZXYpOwogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogCiAJZnJlZV9pcnEodHAtPnBkZXYtPmlycSwgZGV2KTsKIAlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl9VU0lOR19NU0kpIHsKQEAgLTY0NDgsMTYgKzY0MjksMTUgQEAKIAlpZiAoISh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpICYmCiAJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcwMCB8fAogCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MDEpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXUzMiB2YWw7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwogCQlpZiAoIXRnM19yZWFkcGh5KHRwLCAweDFlLCAmdmFsKSkgewogCQkJdGczX3dyaXRlcGh5KHRwLCAweDFlLCB2YWwgfCAweDgwMDApOwogCQkJdGczX3JlYWRwaHkodHAsIDB4MTQsICZ2YWwpOwogCQl9IGVsc2UKIAkJCXZhbCA9IDA7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRwLT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0cC0+bG9jayk7CiAKIAkJdHAtPnBoeV9jcmNfZXJyb3JzICs9IHZhbDsKIApAQCAtNjcxOSwxMSArNjY5OSw5IEBACiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19mdWxsX2xvY2sodHAsIDApOwogCV9fdGczX3NldF9yeF9tb2RlKGRldik7Ci0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogfQogCiAjZGVmaW5lIFRHM19SRUdEVU1QX0xFTgkJKDMyICogMTAyNCkKQEAgLTY3NDUsOCArNjcyMyw3IEBACiAKIAltZW1zZXQocCwgMCwgVEczX1JFR0RVTVBfTEVOKTsKIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKIAogI2RlZmluZSBfX0dFVF9SRUczMihyZWcpCSgqKHApKysgPSB0cjMyKHJlZykpCiAjZGVmaW5lIEdFVF9SRUczMl9MT09QKGJhc2UsbGVuKQkJXApAQCAtNjc5Niw4ICs2NzczLDcgQEAKICN1bmRlZiBHRVRfUkVHMzJfTE9PUAogI3VuZGVmIEdFVF9SRUczMl8xCiAKLQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCXRnM19mdWxsX3VubG9jayh0cCk7CiB9CiAKIHN0YXRpYyBpbnQgdGczX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC02OTczLDggKzY5NDksNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19mdWxsX2xvY2sodHAsIDApOwogCiAJdHAtPmxpbmtfY29uZmlnLmF1dG9uZWcgPSBjbWQtPmF1dG9uZWc7CiAJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewpAQCAtNjk5MCw4ICs2OTY1LDcgQEAKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpKQogCQl0ZzNfc2V0dXBfcGh5KHRwLCAxKTsKIAotCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKICAgCiAJcmV0dXJuIDA7CiB9CkBAIC03MDI3LDEyICs3MDAxLDEyIEBACiAJICAgICEodHAtPnRnM19mbGFncyAmIFRHM19GTEFHX1NFUkRFU19XT0xfQ0FQKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAgIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnRwLT5sb2NrKTsKIAlpZiAod29sLT53b2xvcHRzICYgV0FLRV9NQUdJQykKIAkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19XT0xfRU5BQkxFOwogCWVsc2UKIAkJdHAtPnRnM19mbGFncyAmPSB+VEczX0ZMQUdfV09MX0VOQUJMRTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdHAtPmxvY2spOwogICAKIAlyZXR1cm4gMDsKIH0KQEAgLTcwNzIsNyArNzA0Niw3IEBACiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCiAJCXJldHVybiAtRUFHQUlOOwogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOworCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwogCXIgPSAtRUlOVkFMOwogCXRnM19yZWFkcGh5KHRwLCBNSUlfQk1DUiwgJmJtY3IpOwogCWlmICghdGczX3JlYWRwaHkodHAsIE1JSV9CTUNSLCAmYm1jcikgJiYKQEAgLTcwODAsNyArNzA1NCw3IEBACiAJCXRnM193cml0ZXBoeSh0cCwgTUlJX0JNQ1IsIGJtY3IgfCBCTUNSX0FOUkVTVEFSVCk7CiAJCXIgPSAwOwogCX0KLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmdHAtPmxvY2spOwogICAKIAlyZXR1cm4gcjsKIH0KQEAgLTcxMDIsMTcgKzcwNzYsMTkgQEAKIHN0YXRpYyBpbnQgdGczX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplcmluZykKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlycV9zeW5jID0gMDsKICAgCiAJaWYgKChlcmluZy0+cnhfcGVuZGluZyA+IFRHM19SWF9SSU5HX1NJWkUgLSAxKSB8fAogCSAgICAoZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPiBURzNfUlhfSlVNQk9fUklOR19TSVpFIC0gMSkgfHwKIAkgICAgKGVyaW5nLT50eF9wZW5kaW5nID4gVEczX1RYX1JJTkdfU0laRSAtIDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKICAgCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCXRnM19uZXRpZl9zdG9wKHRwKTsKKwkJaXJxX3N5bmMgPSAxOworCX0KIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZnVsbF9sb2NrKHRwLCBpcnFfc3luYyk7CiAgIAogCXRwLT5yeF9wZW5kaW5nID0gZXJpbmctPnJ4X3BlbmRpbmc7CiAKQEAgLTcxMjgsOCArNzEwNCw3IEBACiAJCXRnM19uZXRpZl9zdGFydCh0cCk7CiAJfQogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogICAKIAlyZXR1cm4gMDsKIH0KQEAgLTcxNDYsMTIgKzcxMjEsMTUgQEAKIHN0YXRpYyBpbnQgdGczX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlycV9zeW5jID0gMDsKICAgCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCXRnM19uZXRpZl9zdG9wKHRwKTsKKwkJaXJxX3N5bmMgPSAxOworCX0KIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZnVsbF9sb2NrKHRwLCBpcnFfc3luYyk7CisKIAlpZiAoZXBhdXNlLT5hdXRvbmVnKQogCQl0cC0+dGczX2ZsYWdzIHw9IFRHM19GTEFHX1BBVVNFX0FVVE9ORUc7CiAJZWxzZQpAQCAtNzE3MCw4ICs3MTQ4LDggQEAKIAkJdGczX2luaXRfaHcodHApOwogCQl0ZzNfbmV0aWZfc3RhcnQodHApOwogCX0KLQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKICAgCiAJcmV0dXJuIDA7CiB9CkBAIC03MTkyLDEyICs3MTcwLDEyIEBACiAgIAkJcmV0dXJuIDA7CiAgIAl9CiAgIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnRwLT5sb2NrKTsKIAlpZiAoZGF0YSkKIAkJdHAtPnRnM19mbGFncyB8PSBURzNfRkxBR19SWF9DSEVDS1NVTVM7CiAJZWxzZQogCQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19SWF9DSEVDS1NVTVM7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJnRwLT5sb2NrKTsKICAgCiAJcmV0dXJuIDA7CiB9CkBAIC03NjA2LDggKzc1ODQsNiBAQAogCiAJdGczX2Fib3J0X2h3KHRwLCAxKTsKIAotCS8qIENsZWFyaW5nIHRoaXMgZmxhZyB0byBrZWVwIGludGVycnVwdHMgZGlzYWJsZWQgKi8KLQl0cC0+dGczX2ZsYWdzICY9IH5URzNfRkxBR19JTklUX0NPTVBMRVRFOwogCXRnM19yZXNldF9odyh0cCk7CiAKIAltYWNfbW9kZSA9ICh0cC0+bWFjX21vZGUgJiB+TUFDX01PREVfUE9SVF9NT0RFX01BU0spIHwKQEAgLTc3MTYsMTEgKzc2OTIsMTQgQEAKIAkJZGF0YVsxXSA9IDE7CiAJfQogCWlmIChldGVzdC0+ZmxhZ3MgJiBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7Ci0JCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCi0JCQl0ZzNfbmV0aWZfc3RvcCh0cCk7CisJCWludCBpcnFfc3luYyA9IDA7CiAKLQkJc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJdGczX25ldGlmX3N0b3AodHApOworCQkJaXJxX3N5bmMgPSAxOworCQl9CisKKwkJdGczX2Z1bGxfbG9jayh0cCwgaXJxX3N5bmMpOwogCiAJCXRnM19oYWx0KHRwLCBSRVNFVF9LSU5EX1NVU1BFTkQsIDEpOwogCQl0ZzNfbnZyYW1fbG9jayh0cCk7CkBAIC03NzQyLDE0ICs3NzIxLDE0IEBACiAJCQlkYXRhWzRdID0gMTsKIAkJfQogCi0JCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCQl0ZzNfZnVsbF91bmxvY2sodHApOworCiAJCWlmICh0ZzNfdGVzdF9pbnRlcnJ1cHQodHApICE9IDApIHsKIAkJCWV0ZXN0LT5mbGFncyB8PSBFVEhfVEVTVF9GTF9GQUlMRUQ7CiAJCQlkYXRhWzVdID0gMTsKIAkJfQotCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0JCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCisJCXRnM19mdWxsX2xvY2sodHAsIDApOwogCiAJCXRnM19oYWx0KHRwLCBSRVNFVF9LSU5EX1NIVVRET1dOLCAxKTsKIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewpAQCAtNzc1Nyw4ICs3NzM2LDggQEAKIAkJCXRnM19pbml0X2h3KHRwKTsKIAkJCXRnM19uZXRpZl9zdGFydCh0cCk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisKKwkJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIAl9CiB9CiAKQEAgLTc3NzksOSArNzc1OCw5IEBACiAJCWlmICh0cC0+dGczX2ZsYWdzMiAmIFRHM19GTEcyX1BIWV9TRVJERVMpCiAJCQlicmVhazsJCQkvKiBXZSBoYXZlIG5vIFBIWSAqLwogCi0JCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0cC0+bG9jayk7CiAJCWVyciA9IHRnM19yZWFkcGh5KHRwLCBkYXRhLT5yZWdfbnVtICYgMHgxZiwgJm1paV9yZWd2YWwpOwotCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRwLT5sb2NrKTsKIAogCQlkYXRhLT52YWxfb3V0ID0gbWlpX3JlZ3ZhbDsKIApAQCAtNzc5NSw5ICs3Nzc0LDkgQEAKIAkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQogCQkJcmV0dXJuIC1FUEVSTTsKIAotCQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7CisJCXNwaW5fbG9ja19iaCgmdHAtPmxvY2spOwogCQllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIGRhdGEtPnJlZ19udW0gJiAweDFmLCBkYXRhLT52YWxfaW4pOwotCQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRwLT5sb2NrKTsKIAogCQlyZXR1cm4gZXJyOwogCkBAIC03ODEzLDI4ICs3NzkyLDI0IEBACiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19mdWxsX2xvY2sodHAsIDApOwogCiAJdHAtPnZsZ3JwID0gZ3JwOwogCiAJLyogVXBkYXRlIFJYX01PREVfS0VFUF9WTEFOX1RBRyBiaXQgaW4gUlhfTU9ERSByZWdpc3Rlci4gKi8KIAlfX3RnM19zZXRfcnhfbW9kZShkZXYpOwogCi0Jc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQlzcGluX3VubG9ja19pcnEoJnRwLT5sb2NrKTsKKwl0ZzNfZnVsbF91bmxvY2sodHApOwogfQogCiBzdGF0aWMgdm9pZCB0ZzNfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19mdWxsX2xvY2sodHAsIDApOwogCWlmICh0cC0+dmxncnApCiAJCXRwLT52bGdycC0+dmxhbl9kZXZpY2VzW3ZpZF0gPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIH0KICNlbmRpZgogCkBAIC03ODQ2LDYgKzc4MjEsNjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0ZzNfc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIG1heF9yeGNvYWxfdGlja19pbnQgPSAwLCBtYXhfdHhjb2FsX3RpY2tfaW50ID0gMDsKKwl1MzIgbWF4X3N0YXRfY29hbF90aWNrcyA9IDAsIG1pbl9zdGF0X2NvYWxfdGlja3MgPSAwOworCisJaWYgKCEodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpKSB7CisJCW1heF9yeGNvYWxfdGlja19pbnQgPSBNQVhfUlhDT0FMX1RJQ0tfSU5UOworCQltYXhfdHhjb2FsX3RpY2tfaW50ID0gTUFYX1RYQ09BTF9USUNLX0lOVDsKKwkJbWF4X3N0YXRfY29hbF90aWNrcyA9IE1BWF9TVEFUX0NPQUxfVElDS1M7CisJCW1pbl9zdGF0X2NvYWxfdGlja3MgPSBNSU5fU1RBVF9DT0FMX1RJQ0tTOworCX0KKworCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1JYQ09MX1RJQ0tTKSB8fAorCSAgICAoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID4gTUFYX1RYQ09MX1RJQ0tTKSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gTUFYX1JYTUFYX0ZSQU1FUykgfHwKKwkgICAgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA+IE1BWF9UWE1BWF9GUkFNRVMpIHx8CisJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3NfaXJxID4gbWF4X3J4Y29hbF90aWNrX2ludCkgfHwKKwkgICAgKGVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgPiBtYXhfdHhjb2FsX3RpY2tfaW50KSB8fAorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA+IE1BWF9SWENPQUxfTUFYRl9JTlQpIHx8CisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxID4gTUFYX1RYQ09BTF9NQVhGX0lOVCkgfHwKKwkgICAgKGVjLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjcyA+IG1heF9zdGF0X2NvYWxfdGlja3MpIHx8CisJICAgIChlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPCBtaW5fc3RhdF9jb2FsX3RpY2tzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBObyByeCBpbnRlcnJ1cHRzIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGJvdGggYXJlIHplcm8gKi8KKwlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSAmJgorCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5vIHR4IGludGVycnVwdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYm90aCBhcmUgemVybyAqLworCWlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID09IDApICYmCisJICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT25seSBjb3B5IHJlbGV2YW50IHBhcmFtZXRlcnMsIGlnbm9yZSBhbGwgb3RoZXJzLiAqLworCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOworCXRwLT5jb2FsLnR4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzOworCXRwLT5jb2FsLnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXRwLT5jb2FsLnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOworCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IGVjLT5yeF9jb2FsZXNjZV91c2Vjc19pcnE7CisJdHAtPmNvYWwudHhfY29hbGVzY2VfdXNlY3NfaXJxID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzX2lycTsKKwl0cC0+Y29hbC5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaXJxOworCXRwLT5jb2FsLnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSA9IGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnE7CisJdHAtPmNvYWwuc3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPSBlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3M7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXRnM19mdWxsX2xvY2sodHAsIDApOworCQlfX3RnM19zZXRfY29hbGVzY2UodHAsICZ0cC0+Y29hbCk7CisJCXRnM19mdWxsX3VubG9jayh0cCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHRnM19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzCQk9IHRnM19nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSB0ZzNfc2V0X3NldHRpbmdzLApAQCAtNzg4MSw2ICs3OTEwLDcgQEAKIAkuZ2V0X3N0YXRzX2NvdW50CT0gdGczX2dldF9zdGF0c19jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSB0ZzNfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9jb2FsZXNjZQkJPSB0ZzNfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UJCT0gdGczX3NldF9jb2FsZXNjZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCB0ZzNfZ2V0X2VlcHJvbV9zaXplKHN0cnVjdCB0ZzMgKnRwKQpAQCAtOTgyNSw2ICs5ODU1LDEyIEBACiAJCWVjLT50eF9jb2FsZXNjZV91c2VjcyA9IExPV19UWENPTF9USUNLU19DTFJUQ0tTOwogCQllYy0+dHhfY29hbGVzY2VfdXNlY3NfaXJxID0gREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUzsKIAl9CisKKwlpZiAodHAtPnRnM19mbGFnczIgJiBURzNfRkxHMl81NzA1X1BMVVMpIHsKKwkJZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSA9IDA7CisJCWVjLT50eF9jb2FsZXNjZV91c2Vjc19pcnEgPSAwOworCQllYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPSAwOworCX0KIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgdGczX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApAQCAtMTAxNjUsMjQgKzEwMjAxLDE5IEBACiAKIAlkZWxfdGltZXJfc3luYygmdHAtPnRpbWVyKTsKIAotCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQlzcGluX2xvY2soJnRwLT50eF9sb2NrKTsKKwl0ZzNfZnVsbF9sb2NrKHRwLCAxKTsKIAl0ZzNfZGlzYWJsZV9pbnRzKHRwKTsKLQlzcGluX3VubG9jaygmdHAtPnR4X2xvY2spOwotCXNwaW5fdW5sb2NrX2lycSgmdHAtPmxvY2spOworCXRnM19mdWxsX3VubG9jayh0cCk7CiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGRldik7CiAKLQlzcGluX2xvY2tfaXJxKCZ0cC0+bG9jayk7Ci0Jc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAJdGczX2hhbHQodHAsIFJFU0VUX0tJTkRfU0hVVERPV04sIDEpOwotCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIAogCWVyciA9IHRnM19zZXRfcG93ZXJfc3RhdGUodHAsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKIAlpZiAoZXJyKSB7Ci0JCXNwaW5fbG9ja19pcnEoJnRwLT5sb2NrKTsKLQkJc3Bpbl9sb2NrKCZ0cC0+dHhfbG9jayk7CisJCXRnM19mdWxsX2xvY2sodHAsIDApOwogCiAJCXRnM19pbml0X2h3KHRwKTsKIApAQCAtMTAxOTIsOCArMTAyMjMsNyBAQAogCQluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CiAJCXRnM19uZXRpZl9zdGFydCh0cCk7CiAKLQkJc3Bpbl91bmxvY2soJnRwLT50eF9sb2NrKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJCXRnM19mdWxsX3VubG9jayh0cCk7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTEwMjE2LDIwICsxMDI0NiwxNiBAQAogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCi0Jc3Bpbl9sb2NrX2lycSgmdHAtPmxvY2spOwotCXNwaW5fbG9jaygmdHAtPnR4X2xvY2spOworCXRnM19mdWxsX2xvY2sodHAsIDApOwogCiAJdGczX2luaXRfaHcodHApOwogCiAJdHAtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdHAtPnRpbWVyX29mZnNldDsKIAlhZGRfdGltZXIoJnRwLT50aW1lcik7CiAKLQl0ZzNfZW5hYmxlX2ludHModHApOwotCiAJdGczX25ldGlmX3N0YXJ0KHRwKTsKIAotCXNwaW5fdW5sb2NrKCZ0cC0+dHhfbG9jayk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CisJdGczX2Z1bGxfdW5sb2NrKHRwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmggYi9kcml2ZXJzL25ldC90ZzMuaAppbmRleCA5OTNmODRjLi43MGFkNDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuaAorKysgYi9kcml2ZXJzL25ldC90ZzMuaApAQCAtODc5LDMxICs4NzksNDEgQEAKICNkZWZpbmUgIExPV19SWENPTF9USUNLU19DTFJUQ0tTCSAweDAwMDAwMDE0CiAjZGVmaW5lICBERUZBVUxUX1JYQ09MX1RJQ0tTCQkgMHgwMDAwMDA0OAogI2RlZmluZSAgSElHSF9SWENPTF9USUNLUwkJIDB4MDAwMDAwOTYKKyNkZWZpbmUgIE1BWF9SWENPTF9USUNLUwkJIDB4MDAwMDAzZmYKICNkZWZpbmUgSE9TVENDX1RYQ09MX1RJQ0tTCQkweDAwMDAzYzBjCiAjZGVmaW5lICBMT1dfVFhDT0xfVElDS1MJCSAweDAwMDAwMDk2CiAjZGVmaW5lICBMT1dfVFhDT0xfVElDS1NfQ0xSVENLUwkgMHgwMDAwMDA0OAogI2RlZmluZSAgREVGQVVMVF9UWENPTF9USUNLUwkJIDB4MDAwMDAxMmMKICNkZWZpbmUgIEhJR0hfVFhDT0xfVElDS1MJCSAweDAwMDAwMTQ1CisjZGVmaW5lICBNQVhfVFhDT0xfVElDS1MJCSAweDAwMDAwM2ZmCiAjZGVmaW5lIEhPU1RDQ19SWE1BWF9GUkFNRVMJCTB4MDAwMDNjMTAKICNkZWZpbmUgIExPV19SWE1BWF9GUkFNRVMJCSAweDAwMDAwMDA1CiAjZGVmaW5lICBERUZBVUxUX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMDgKICNkZWZpbmUgIEhJR0hfUlhNQVhfRlJBTUVTCQkgMHgwMDAwMDAxMgorI2RlZmluZSAgTUFYX1JYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwZmYKICNkZWZpbmUgSE9TVENDX1RYTUFYX0ZSQU1FUwkJMHgwMDAwM2MxNAogI2RlZmluZSAgTE9XX1RYTUFYX0ZSQU1FUwkJIDB4MDAwMDAwMzUKICNkZWZpbmUgIERFRkFVTFRfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDA0YgogI2RlZmluZSAgSElHSF9UWE1BWF9GUkFNRVMJCSAweDAwMDAwMDUyCisjZGVmaW5lICBNQVhfVFhNQVhfRlJBTUVTCQkgMHgwMDAwMDBmZgogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzE4CiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQogI2RlZmluZSAgREVGQVVMVF9SWENPQUxfVElDS19JTlRfQ0xSVENLUyAweDAwMDAwMDE0CisjZGVmaW5lICBNQVhfUlhDT0FMX1RJQ0tfSU5UCQkgMHgwMDAwMDNmZgogI2RlZmluZSBIT1NUQ0NfVFhDT0FMX1RJQ0tfSU5UCQkweDAwMDAzYzFjCiAjZGVmaW5lICBERUZBVUxUX1RYQ09BTF9USUNLX0lOVAkgMHgwMDAwMDAxOQogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfVElDS19JTlRfQ0xSVENLUyAweDAwMDAwMDE0CisjZGVmaW5lICBNQVhfVFhDT0FMX1RJQ0tfSU5UCQkgMHgwMDAwMDNmZgogI2RlZmluZSBIT1NUQ0NfUlhDT0FMX01BWEZfSU5UCQkweDAwMDAzYzIwCiAjZGVmaW5lICBERUZBVUxUX1JYQ09BTF9NQVhGX0lOVAkgMHgwMDAwMDAwNQorI2RlZmluZSAgTUFYX1JYQ09BTF9NQVhGX0lOVAkJIDB4MDAwMDAwZmYKICNkZWZpbmUgSE9TVENDX1RYQ09BTF9NQVhGX0lOVAkJMHgwMDAwM2MyNAogI2RlZmluZSAgREVGQVVMVF9UWENPQUxfTUFYRl9JTlQJIDB4MDAwMDAwMDUKKyNkZWZpbmUgIE1BWF9UWENPQUxfTUFYRl9JTlQJCSAweDAwMDAwMGZmCiAjZGVmaW5lIEhPU1RDQ19TVEFUX0NPQUxfVElDS1MJCTB4MDAwMDNjMjgKICNkZWZpbmUgIERFRkFVTFRfU1RBVF9DT0FMX1RJQ0tTCSAweDAwMGY0MjQwCisjZGVmaW5lICBNQVhfU1RBVF9DT0FMX1RJQ0tTCQkgMHhkNjkzZDQwMAorI2RlZmluZSAgTUlOX1NUQVRfQ09BTF9USUNLUwkJIDB4MDAwMDAwNjQKIC8qIDB4M2MyYyAtLT4gMHgzYzMwIHVudXNlZCAqLwogI2RlZmluZSBIT1NUQ0NfU1RBVFNfQkxLX0hPU1RfQUREUgkweDAwMDAzYzMwIC8qIDY0LWJpdCAqLwogI2RlZmluZSBIT1NUQ0NfU1RBVFVTX0JMS19IT1NUX0FERFIJMHgwMDAwM2MzOCAvKiA2NC1iaXQgKi8KQEAgLTIwMDYsMTcgKzIwMTYsMzEgQEAKIHN0cnVjdCB0ZzMgewogCS8qIGJlZ2luICJnZW5lcmFsLCBmcmVxdWVudGx5LXVzZWQgbWVtYmVycyIgY2FjaGVsaW5lIHNlY3Rpb24gKi8KIAorCS8qIElmIHRoZSBJUlEgaGFuZGxlciAod2hpY2ggcnVucyBsb2NrbGVzcykgbmVlZHMgdG8gYmUKKwkgKiBxdWllc2NlZCwgdGhlIGZvbGxvd2luZyBiaXRtYXNrIHN0YXRlIGlzIHVzZWQuICBUaGUKKwkgKiBTWU5DIGZsYWcgaXMgc2V0IGJ5IG5vbi1JUlEgY29udGV4dCBjb2RlIHRvIGluaXRpYXRlCisJICogdGhlIHF1aWVzY2VuY2UuCisJICoKKwkgKiBXaGVuIHRoZSBJUlEgaGFuZGxlciBub3RpY2VzIHRoYXQgU1lOQyBpcyBzZXQsIGl0CisJICogZGlzYWJsZXMgaW50ZXJydXB0cyBhbmQgcmV0dXJucy4KKwkgKgorCSAqIFdoZW4gYWxsIG91dHN0YW5kaW5nIElSUSBoYW5kbGVycyBoYXZlIHJldHVybmVkIGFmdGVyCisJICogdGhlIFNZTkMgZmxhZyBoYXMgYmVlbiBzZXQsIHRoZSBzZXR0ZXIgY2FuIGJlIGFzc3VyZWQKKwkgKiB0aGF0IGludGVycnVwdHMgd2lsbCBubyBsb25nZXIgZ2V0IHJ1bi4KKwkgKgorCSAqIEluIHRoaXMgd2F5IGFsbCBTTVAgZHJpdmVyIGxvY2tzIGFyZSBuZXZlciBhY3F1aXJlZAorCSAqIGluIGh3IElSUSBjb250ZXh0LCBvbmx5IHN3IElSUSBjb250ZXh0IG9yIGxvd2VyLgorCSAqLworCXVuc2lnbmVkIGludAkJCWlycV9zeW5jOworCiAJLyogU01QIGxvY2tpbmcgc3RyYXRlZ3k6CiAJICoKIAkgKiBsb2NrOiBIZWxkIGR1cmluZyBhbGwgb3BlcmF0aW9ucyBleGNlcHQgVFggcGFja2V0CiAJICogICAgICAgcHJvY2Vzc2luZy4KIAkgKgotCSAqIHR4X2xvY2s6IEhlbGQgZHVyaW5nIHRnM19zdGFydF94bWl0eyxfNGdidWd9IGFuZCB0ZzNfdHgKKwkgKiB0eF9sb2NrOiBIZWxkIGR1cmluZyB0ZzNfc3RhcnRfeG1pdCBhbmQgdGczX3R4CiAJICoKLQkgKiBJZiB5b3Ugd2FudCB0byBzaHV0IHVwIGFsbCBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyB5b3UgbXVzdAotCSAqIGFjcXVpcmUgYm90aCBsb2NrcywgJ2xvY2snIHRha2VuIGJlZm9yZSAndHhfbG9jaycuICBJUlFzIG11c3QKLQkgKiBiZSBkaXNhYmxlZCB0byB0YWtlICdsb2NrJyBidXQgb25seSBzb2Z0aXJxIGRpc2FibGluZyBpcwotCSAqIG5lY2Vzc2FyeSBmb3IgYWNxdWlzaXRpb24gb2YgJ3R4X2xvY2snLgorCSAqIEJvdGggb2YgdGhlc2UgbG9ja3MgYXJlIHRvIGJlIGhlbGQgd2l0aCBCSCBzYWZldHkuCiAJICovCiAJc3BpbmxvY2tfdAkJCWxvY2s7CiAJc3BpbmxvY2tfdAkJCWluZGlyZWN0X2xvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90bGFuLmMgYi9kcml2ZXJzL25ldC90bGFuLmMKaW5kZXggY2YzMWMwNi4uOTQyZmFlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3RsYW4uYwpAQCAtMTcxLDYgKzE3MSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZWlzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtNTY2LDcgKzU2Nyw3IEBACiAKIAkJcHJpdi0+YWRhcHRlciA9ICZib2FyZF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOwogCi0JCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGKTsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlRMQU46IE5vIHN1aXRhYmxlIFBDSSBtYXBwaW5nIGF2YWlsYWJsZS5cbiIpOwogCQkJZ290byBlcnJfb3V0X2ZyZWVfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5LmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuYwppbmRleCAwZDFkY2Y0Li40MWUwY2Q4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTkuYwpAQCAtMjc2LDcgKzI3Niw4IEBACiAJcmV0dXJuIDsgCiB9CiAgCi1pbnQgX19kZXZpbml0IHhsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KSAKK3N0YXRpYyBpbnQgX19kZXZpbml0IHhsX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkgCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA7IAogCXN0cnVjdCB4bF9wcml2YXRlICp4bF9wcml2IDsgCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvM2MzNTlfbWljcm9jb2RlLmgKaW5kZXggODEzNTRhZi4uMDQwMGMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nLzNjMzU5X21pY3JvY29kZS5oCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy8zYzM1OV9taWNyb2NvZGUuaApAQCAtMjIsNyArMjIsNyBAQAogCiBzdGF0aWMgaW50IG1jX3NpemUgPSAyNDg4MCA7IAogCi11OCBtaWNyb2NvZGVbXSA9IHsgCitzdGF0aWMgY29uc3QgdTggbWljcm9jb2RlW10gPSB7IAogIDB4ZmUsMHgzYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAKICwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwCiAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2FieXNzLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvYWJ5c3MuYwppbmRleCBiZDRhMmJjLi44NzEwM2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvYWJ5c3MuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvYWJ5c3MuYwpAQCAtNDY4LDE0ICs0NjgsMyBAQAogbW9kdWxlX2luaXQoYWJ5c3NfaW5pdCk7CiBtb2R1bGVfZXhpdChhYnlzc19ybW1vZCk7CiAKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgYWJ5c3MuYyIKLSAqICBhbHQtY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgYWJ5c3MuYyIKLSAqICBjLXNldC1zdHlsZSAiSyZSIgotICogIGMtaW5kZW50LWxldmVsOiA4Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2libXRyLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwppbmRleCAzODczOTE3Li5lN2IwMDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvaWJtdHIuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIC8qIHRoaXMgYWxsb3dzIGRpc3BsYXlpbmcgZnVsbCBhZGFwdGVyIGluZm9ybWF0aW9uICovCiAKLWNoYXIgKmNoYW5uZWxfZGVmW10gX19kZXZpbml0ZGF0YSA9IHsgIklTQSIsICJNQ0EiLCAiSVNBIFAmUCIgfTsKK3N0YXRpYyBjaGFyICpjaGFubmVsX2RlZltdIF9fZGV2aW5pdGRhdGEgPSB7ICJJU0EiLCAiTUNBIiwgIklTQSBQJlAiIH07CiAKIHN0YXRpYyBjaGFyIHBjY2hhbm5lbGlkW10gX19kZXZpbml0ZGF0YSA9IHsKIAkweDA1LCAweDAwLCAweDA0LCAweDA5LApAQCAtMTcxLDcgKzE3MSw3IEBACiAJMHgwMywgMHgwOCwgMHgwMiwgMHgwMAogfTsKIAotY2hhciBfX2RldmluaXQgKmFkYXB0ZXJfZGVmKGNoYXIgdHlwZSkKK3N0YXRpYyBjaGFyIF9fZGV2aW5pdCAqYWRhcHRlcl9kZWYoY2hhciB0eXBlKQogewogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgMHhGOiByZXR1cm4gIlBDIEFkYXB0ZXIgfCBQQyBBZGFwdGVyIElJIHwgQWRhcHRlci9BIjsKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAjZGVmaW5lIFRSQ19JTklUIDB4MDEJCS8qICBUcmFjZSBpbml0aWFsaXphdGlvbiAmIFBST0JFcyAqLwogI2RlZmluZSBUUkNfSU5JVFYgMHgwMgkJLyogIHZlcmJvc2UgaW5pdCB0cmFjZSBwb2ludHMgICAgICovCi11bnNpZ25lZCBjaGFyIGlibXRyX2RlYnVnX3RyYWNlID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGlibXRyX2RlYnVnX3RyYWNlID0gMDsKIAogc3RhdGljIGludCAJaWJtdHJfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50CWlibXRyX3Byb2JlMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW9hZGRyKTsKQEAgLTE5MiwyMCArMTkyLDIwIEBACiBzdGF0aWMgaW50IAl0cmRldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCAJdG9rX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IAl0b2tfaW5pdF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCAJCXRva19vcGVuX2FkYXB0ZXIodW5zaWduZWQgbG9uZyBkZXZfYWRkcik7CitzdGF0aWMgdm9pZAl0b2tfb3Blbl9hZGFwdGVyKHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpOwogc3RhdGljIHZvaWQgCW9wZW5fc2FwKHVuc2lnbmVkIGNoYXIgdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCAJdG9rX3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgCXRva19zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgCXRva19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWlycXJldHVybl90IHRva19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgdG9rX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyB2b2lkIAlpbml0aWFsX3Rva19pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCAJdHJfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCAJdHJfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIAkJaWJtdHJfcmVzZXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QqdG1yLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQJaWJtdHJfcmVzZXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QqdG1yLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQJdG9rX3JlcnVuKHVuc2lnbmVkIGxvbmcgZGV2X2FkZHIpOwotdm9pZCAJCWlibXRyX3JlYWRsb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZAlpYm10cl9yZWFkbG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHN0cnVjdCAJbmV0X2RldmljZV9zdGF0cyAqdG9rX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCAJCWlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CitzdGF0aWMgaW50CWlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSk7CiBzdGF0aWMgdm9pZAlmaW5kX3R1cmJvX2FkYXB0ZXJzKGludCAqaW9saXN0KTsKIAogc3RhdGljIGludCBpYm10cl9wb3J0bGlzdFtJQk1UUl9NQVhfQURBUFRFUlMrMV0gX19kZXZpbml0ZGF0YSA9IHsKQEAgLTkyOCw3ICs5MjgsNyBAQAogI2RlZmluZSBETENfTUFYX1NBUF9PRlNUICAgICAgICAzMgogI2RlZmluZSBETENfTUFYX1NUQV9PRlNUICAgICAgICAzMwogCi12b2lkIHRva19vcGVuX2FkYXB0ZXIodW5zaWduZWQgbG9uZyBkZXZfYWRkcikKK3N0YXRpYyB2b2lkIHRva19vcGVuX2FkYXB0ZXIodW5zaWduZWQgbG9uZyBkZXZfYWRkcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIGRldl9hZGRyOwogCXN0cnVjdCB0b2tfaW5mbyAqdGk7CkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCXJldHVybiB0aS0+c3JhbV92aXJ0ICsgaW5kZXg7CiB9CiAKLXZvaWQgZGlyX29wZW5fYWRhcHRlciAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGRpcl9vcGVuX2FkYXB0ZXIgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAgICAgICAgIHN0cnVjdCB0b2tfaW5mbyAqdGkgPSAoc3RydWN0IHRva19pbmZvICopIGRldi0+cHJpdjsKICAgICAgICAgdW5zaWduZWQgY2hhciByZXRfY29kZTsKQEAgLTExNzIsNyArMTE3Miw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWlycXJldHVybl90IHRva19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBpcnFyZXR1cm5fdCB0b2tfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAJLyogIHVuc2lnbmVkIGNoYXIgc3RhdHVzX2V2ZW4gOyAqLwpAQCAtMTg0MCw3ICsxODQwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGlibXRyX3Jlc2V0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0bXIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpYm10cl9yZXNldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqdG1yLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXRtci0+ZXhwaXJlcyA9IGppZmZpZXMgKyBUUl9SRVRSWV9JTlRFUlZBTDsKIAl0bXItPmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwpAQCAtMTg3Miw3ICsxODcyLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGlibXRyX3JlYWRsb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGlibXRyX3JlYWRsb2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdG9rX2luZm8gKnRpOwogCkBAIC0xOTA1LDcgKzE5MDUsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBpYm10cl9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpCitzdGF0aWMgaW50IGlibXRyX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG10dSkKIHsKIAlzdHJ1Y3QgdG9rX2luZm8gKnRpID0gKHN0cnVjdCB0b2tfaW5mbyAqKSBkZXYtPnByaXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9sYW5zdHJlYW1lci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKaW5kZXggOTllMGIwMy4uOTc3MTJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL2xhbnN0cmVhbWVyLmMKQEAgLTExOCw2ICsxMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtMjU3LDcgKzI1OCw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4RkZGRkZGRkZVTEwpOworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IE5vIHN1aXRhYmxlIFBDSSBtYXBwaW5nIGF2YWlsYWJsZS5cbiIsCiAJCQkJZGV2LT5uYW1lKTsKQEAgLTQ1NCw4ICs0NTUsNyBAQAogCXdyaXRldyhyZWFkdyhzdHJlYW1lcl9tbWlvICsgQkNUTCkgfCBCQ1RMX1NPRlRSRVNFVCwgc3RyZWFtZXJfbW1pbyArIEJDVEwpOwogCXQgPSBqaWZmaWVzOwogCS8qIEhvbGQgc29mdCByZXNldCBiaXQgZm9yIGEgd2hpbGUgKi8KLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwotCXNjaGVkdWxlX3RpbWVvdXQoSFopOworCXNzbGVlcCgxKTsKIAkKIAl3cml0ZXcocmVhZHcoc3RyZWFtZXJfbW1pbyArIEJDVEwpICYgfkJDVExfU09GVFJFU0VULAogCSAgICAgICBzdHJlYW1lcl9tbWlvICsgQkNUTCk7CkBAIC01MTEsOCArNTExLDcgQEAKIAl3cml0ZXcoU0lTUl9NSSwgc3RyZWFtZXJfbW1pbyArIFNJU1JfTUFTS19TVU0pOwogCiAJd2hpbGUgKCEoKHJlYWR3KHN0cmVhbWVyX21taW8gKyBTSVNSKSkgJiBTSVNSX1NSQl9SRVBMWSkpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOworCQltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApOwogCQlpZiAoamlmZmllcyAtIHQgPiA0MCAqIEhaKSB7CiAJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiSUJNIFBDSSB0b2tlbnJpbmcgY2FyZCBub3QgcmVzcG9uZGluZ1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL21hZGdlbWMuYwppbmRleCBjZmFlMmJiLi42NTljYmRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvbWFkZ2VtYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9tYWRnZW1jLmMKQEAgLTYyNSw3ICs2MjUsNyBAQAogLyoKICAqIERpc2FibGUgdGhlIGJvYXJkLCBhbmQgcHV0IGJhY2sgaW50byBwb3dlci11cCBzdGF0ZS4KICAqLwotdm9pZCBtYWRnZW1jX2NoaXBzZXRfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG1hZGdlbWNfY2hpcHNldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwogCW1hZGdlbWNfc2V0aW50KGRldiwgMCk7CkBAIC03ODYsMTUgKzc4NiwzIEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBtYWRnZW1jLmMiCi0gKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIG1hZGdlbWMuYyIKLSAqICBjLXNldC1zdHlsZSAiSyZSIgotICogIGMtaW5kZW50LWxldmVsOiA4Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Byb3Rlb24uYwppbmRleCA2NzViMDYzLi40MGFkMGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvcHJvdGVvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9wcm90ZW9uLmMKQEAgLTQxOSwxNCArNDE5LDMgQEAKIH0KICNlbmRpZiAvKiBNT0RVTEUgKi8KIAotDAotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqICBjb21waWxlLWNvbW1hbmQ6ICJnY2MgLURNT0RWRVJTSU9OUyAgLURNT0RVTEUgLURfX0tFUk5FTF9fIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU82IC1mb21pdC1mcmFtZS1wb2ludGVyIC1JL3Vzci9zcmMvbGludXgvZHJpdmVycy9uZXQvdG9rZW5yaW5nLyAtYyBwcm90ZW9uLmMiCi0gKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHByb3Rlb24uYyIKLSAqICBjLXNldC1zdHlsZSAiSyZSIgotICogIGMtaW5kZW50LWxldmVsOiA4Ci0gKiAgYy1iYXNpYy1vZmZzZXQ6IDgKLSAqICB0YWItd2lkdGg6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NraXNhLmMgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc2tpc2EuYwppbmRleCAzZmFiNTRhLi5mMjY3OTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc2tpc2EuYworKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc2tpc2EuYwpAQCAtNDI5LDE0ICs0MjksMyBAQAogfQogI2VuZGlmIC8qIE1PRFVMRSAqLwogCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHNraXNhLmMiCi0gKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHNraXNhLmMiCi0gKiAgYy1zZXQtc3R5bGUgIksmUiIKLSAqICBjLWluZGVudC1sZXZlbDogOAotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiAgdGFiLXdpZHRoOiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy9zbWN0ci5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKaW5kZXggNWM4YWVhYy4uNjdkMmI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAogLyogU01DIE5hbWUgb2YgdGhlIEFkYXB0ZXIuICovCiBzdGF0aWMgY2hhciBzbWN0cl9uYW1lW10gPSAiU01DIFRva2VuQ2FyZCI7Ci1jaGFyICpzbWN0cl9tb2RlbCA9ICJVbmtub3duIjsKK3N0YXRpYyBjaGFyICpzbWN0cl9tb2RlbCA9ICJVbmtub3duIjsKIAogLyogVXNlIDAgZm9yIHByb2R1Y3Rpb24sIDEgZm9yIHZlcmlmaWNhdGlvbiwgMiBmb3IgZGVidWcsIGFuZAogICogMyBmb3IgdmVyeSB2ZXJib3NlIGRlYnVnLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3NtY3RyX2Zpcm13YXJlLmggYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHJfZmlybXdhcmUuaAppbmRleCA1M2YyY2JjLi40ODk5NGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHJfZmlybXdhcmUuaAorKysgYi9kcml2ZXJzL25ldC90b2tlbnJpbmcvc21jdHJfZmlybXdhcmUuaApAQCAtMjEsNyArMjEsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU01DVFIpIHx8IGRlZmluZWQoQ09ORklHX1NNQ1RSX01PRFVMRSkKIAotdW5zaWduZWQgY2hhciBzbWN0cl9jb2RlW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzbWN0cl9jb2RlW10gPSB7CiAJMHgwQkMsIDB4MDFELCAweDAxMiwgMHgwM0IsIDB4MDYzLCAweDBCNCwgMHgwRTksIDB4MDAwLAogCTB4MDAwLCAweDAxRiwgMHgwMDAsIDB4MDAxLCAweDAwMSwgMHgwMDAsIDB4MDAyLCAweDAwNSwKIAkweDAwMSwgMHgwMDAsIDB4MDA2LCAweDAwMywgMHgwMDEsIDB4MDAwLCAweDAwNCwgMHgwMDksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zMzgwdHIuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCmluZGV4IGRmNDNiNDQuLjVlMGIwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXMzODB0ci5jCkBAIC0yMzc5LDcgKzIzNzksNyBAQAogRVhQT1JUX1NZTUJPTCh0bXNkZXZfdGVybSk7CiBFWFBPUlRfU1lNQk9MKHRtczM4MHRyX3dhaXQpOwogCi1zdHJ1Y3QgbW9kdWxlICpUTVMzODBfbW9kdWxlID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlICpUTVMzODBfbW9kdWxlID0gTlVMTDsKIAogaW50IGluaXRfbW9kdWxlKHZvaWQpCiB7CkBAIC0yMzk3LDE0ICsyMzk3LDMgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0MCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFZFUlNJT05TICAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHRtczM4MHRyLmMiCi0gKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHRtczM4MHRyLmMiCi0gKiAgYy1zZXQtc3R5bGUgIksmUiIKLSAqICBjLWluZGVudC1sZXZlbDogOAotICogIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiAgdGFiLXdpZHRoOiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy90bXNwY2kuYwppbmRleCAzN2RkYjVjLi4yZTE4YzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvdG1zcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL3Rtc3BjaS5jCkBAIC0yNTQsMTQgKzI1NCwzIEBACiBtb2R1bGVfaW5pdCh0bXNfcGNpX2luaXQpOwogbW9kdWxlX2V4aXQodG1zX3BjaV9ybW1vZCk7CiAKLQwKLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgY29tcGlsZS1jb21tYW5kOiAiZ2NjIC1ETU9EVkVSU0lPTlMgIC1ETU9EVUxFIC1EX19LRVJORUxfXyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PNiAtZm9taXQtZnJhbWUtcG9pbnRlciAtSS91c3Ivc3JjL2xpbnV4L2RyaXZlcnMvbmV0L3Rva2VucmluZy8gLWMgdG1zcGNpLmMiCi0gKiAgYWx0LWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1PRFVMRSAtRF9fS0VSTkVMX18gLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtTzYgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLUkvdXNyL3NyYy9saW51eC9kcml2ZXJzL25ldC90b2tlbnJpbmcvIC1jIHRtc3BjaS5jIgotICogIGMtc2V0LXN0eWxlICJLJlIiCi0gKiAgYy1pbmRlbnQtbGV2ZWw6IDgKLSAqICBjLWJhc2ljLW9mZnNldDogOAotICogIHRhYi13aWR0aDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMgYi9kcml2ZXJzL25ldC90dWxpcC9kZTIxMDR4LmMKaW5kZXggZGQzNTdkZC4uZmMzNTNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvZGUyMTA0eC5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlMjEwNHguYwpAQCAtNDQ2LDEzICs0NDYsMTMgQEAKIAogCQkJbWFwcGluZyA9CiAJCQlkZS0+cnhfc2tiW3J4X3RhaWxdLm1hcHBpbmcgPQotCQkJCXBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LCBjb3B5X3NrYi0+dGFpbCwKKwkJCQlwY2lfbWFwX3NpbmdsZShkZS0+cGRldiwgY29weV9za2ItPmRhdGEsCiAJCQkJCSAgICAgICBidWZsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlkZS0+cnhfc2tiW3J4X3RhaWxdLnNrYiA9IGNvcHlfc2tiOwogCQl9IGVsc2UgewogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRlLT5wZGV2LCBtYXBwaW5nLCBsZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlza2JfcmVzZXJ2ZShjb3B5X3NrYiwgUlhfT0ZGU0VUKTsKLQkJCW1lbWNweShza2JfcHV0KGNvcHlfc2tiLCBsZW4pLCBza2ItPnRhaWwsIGxlbik7CisJCQltZW1jcHkoc2tiX3B1dChjb3B5X3NrYiwgbGVuKSwgc2tiLT5kYXRhLCBsZW4pOwogCiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGUtPnBkZXYsIG1hcHBpbmcsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIApAQCAtMTI2OSw3ICsxMjY5LDcgQEAKIAkJc2tiLT5kZXYgPSBkZS0+ZGV2OwogCiAJCWRlLT5yeF9za2JbaV0ubWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKGRlLT5wZGV2LAotCQkJc2tiLT50YWlsLCBkZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJc2tiLT5kYXRhLCBkZS0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlkZS0+cnhfc2tiW2ldLnNrYiA9IHNrYjsKIAogCQlkZS0+cnhfcmluZ1tpXS5vcHRzMSA9IGNwdV90b19sZTMyKERlc2NPd24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvZG1mZS5jCmluZGV4IGUyNWYzM2QuLjc0ZTkwNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9kbWZlLmMKQEAgLTc4LDYgKzc4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KQEAgLTM1NCw3ICszNTUsNyBAQAogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKIAlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwogCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZikpIHsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBEUlZfTkFNRSAiOiAzMi1iaXQgUENJIERNQSBub3QgYXZhaWxhYmxlLlxuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX291dF9mcmVlOwpAQCAtNzQzLDExICs3NDQsNiBAQAogCiAJRE1GRV9EQlVHKDAsICJkbWZlX2ludGVycnVwdCgpIiwgMCk7CiAKLQlpZiAoIWRldikgewotCQlETUZFX0RCVUcoMSwgImRtZmVfaW50ZXJydXB0KCkgd2l0aG91dCBERVZJQ0UgYXJnIiwgMCk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKIAogCS8qIEdvdCBETTkxMFggc3RhdHVzICovCkBAIC05NDksOCArOTQ1LDggQEAKIAogCQkJCS8qIFJlY2VpdmVkIFBhY2tldCBDUkMgY2hlY2sgbmVlZCBvciBub3QgKi8KIAkJCQlpZiAoIChkYi0+ZG05MTB4X2Noa19tb2RlICYgMSkgJiYKLQkJCQkJKGNhbF9DUkMoc2tiLT50YWlsLCByeGxlbiwgMSkgIT0KLQkJCQkJKCoodTMyICopIChza2ItPnRhaWwrcnhsZW4pICkpKSB7IC8qIEZJWE1FICg/KSAqLworCQkJCQkoY2FsX0NSQyhza2ItPmRhdGEsIHJ4bGVuLCAxKSAhPQorCQkJCQkoKih1MzIgKikgKHNrYi0+ZGF0YStyeGxlbikgKSkpIHsgLyogRklYTUUgKD8pICovCiAJCQkJCS8qIEZvdW5kIGEgZXJyb3IgcmVjZWl2ZWQgcGFja2V0ICovCiAJCQkJCWRtZmVfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CiAJCQkJCWRiLT5kbTkxMHhfY2hrX21vZGUgPSAzOwpAQCAtOTYzLDcgKzk1OSw3IEBACiAJCQkJCQkvKiBzaXplIGxlc3MgdGhhbiBDT1BZX1NJWkUsIGFsbG9jYXRlIGEgcnhsZW4gU0tCICovCiAJCQkJCQlza2ItPmRldiA9IGRldjsKIAkJCQkJCXNrYl9yZXNlcnZlKHNrYiwgMik7IC8qIDE2Ynl0ZSBhbGlnbiAqLwotCQkJCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCByeGxlbiksIHJ4cHRyLT5yeF9za2JfcHRyLT50YWlsLCByeGxlbik7CisJCQkJCQltZW1jcHkoc2tiX3B1dChza2IsIHJ4bGVuKSwgcnhwdHItPnJ4X3NrYl9wdHItPmRhdGEsIHJ4bGVuKTsKIAkJCQkJCWRtZmVfcmV1c2Vfc2tiKGRiLCByeHB0ci0+cnhfc2tiX3B0cik7CiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlza2ItPmRldiA9IGRldjsKQEAgLTEyNTYsNyArMTI1Miw3IEBACiAKIAlpZiAoIShyeHB0ci0+cmRlczAgJiBjcHVfdG9fbGUzMigweDgwMDAwMDAwKSkpIHsKIAkJcnhwdHItPnJ4X3NrYl9wdHIgPSBza2I7Ci0JCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT50YWlsLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CisJCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT5kYXRhLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CiAJCXdtYigpOwogCQlyeHB0ci0+cmRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKIAkJZGItPnJ4X2F2YWlsX2NudCsrOwpAQCAtMTQ2Nyw3ICsxNDYzLDcgQEAKIAkJaWYgKCAoIHNrYiA9IGRldl9hbGxvY19za2IoUlhfQUxMT0NfU0laRSkgKSA9PSBOVUxMICkKIAkJCWJyZWFrOwogCQlyeHB0ci0+cnhfc2tiX3B0ciA9IHNrYjsgLyogRklYTUUgKD8pICovCi0JCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT50YWlsLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CisJCXJ4cHRyLT5yZGVzMiA9IGNwdV90b19sZTMyKCBwY2lfbWFwX3NpbmdsZShkYi0+cGRldiwgc2tiLT5kYXRhLCBSWF9BTExPQ19TSVpFLCBQQ0lfRE1BX0ZST01ERVZJQ0UpICk7CiAJCXdtYigpOwogCQlyeHB0ci0+cmRlczAgPSBjcHVfdG9fbGUzMigweDgwMDAwMDAwKTsKIAkJcnhwdHIgPSByeHB0ci0+bmV4dF9yeF9kZXNjOwpAQCAtMTgwNiw3ICsxODAyLDcgQEAKIAlpZiAoICggKGludCkgc3JvbVsxOF0gJiAweGZmKSA9PSBTUk9NX1Y0MV9DT0RFKSB7CiAJCS8qIFNST00gVjQuMDEgKi8KIAkJLyogR2V0IE5JQyBzdXBwb3J0IG1lZGlhIG1vZGUgKi8KLQkJZGItPk5JQ19jYXBhYmlsaXR5ID0gbGUxNl90b19jcHVwKHNyb20gKyAzNCk7CisJCWRiLT5OSUNfY2FwYWJpbGl0eSA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopc3JvbSArIDM0LzIpOwogCQlkYi0+UEhZX3JlZzQgPSAwOwogCQlmb3IgKHRtcF9yZWcgPSAxOyB0bXBfcmVnIDwgMHgxMDsgdG1wX3JlZyA8PD0gMSkgewogCQkJc3dpdGNoKCBkYi0+TklDX2NhcGFiaWxpdHkgJiB0bXBfcmVnICkgewpAQCAtMTgxOCw3ICsxODE0LDggQEAKIAkJfQogCiAJCS8qIE1lZGlhIE1vZGUgRm9yY2Ugb3Igbm90IGNoZWNrICovCi0JCWRtZmVfbW9kZSA9IGxlMzJfdG9fY3B1cChzcm9tICsgMzQpICYgbGUzMl90b19jcHVwKHNyb20gKyAzNik7CisJCWRtZmVfbW9kZSA9IGxlMzJfdG9fY3B1cCgoX19sZTMyICopc3JvbSArIDM0LzQpICYKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKXNyb20gKyAzNi80KTsKIAkJc3dpdGNoKGRtZmVfbW9kZSkgewogCQljYXNlIDB4NDogZG1mZV9tZWRpYV9tb2RlID0gRE1GRV8xMDBNSEY7IGJyZWFrOwkvKiAxMDBNSEYgKi8KIAkJY2FzZSAweDI6IGRtZmVfbWVkaWFfbW9kZSA9IERNRkVfMTBNRkQ7IGJyZWFrOwkvKiAxME1GRCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwppbmRleCBhYzViZjQ5Li5mYmQ5YWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC90dWxpcC9lZXByb20uYwpAQCAtNjMsNiArNjMsMjIgQEAKIAkgKi8KIAl7IDB4MWUwMCwgMHgwMDAwLCAweDAwMGIsIDB4OGYwMSwgMHgwMTAzLCAweDAzMDAsIDB4MDgyMSwgMHgwMDAsIDB4MDAwMSwgMHgwMDAwLCAweDAxZTEgfQogICB9LAorICB7IkNvYmFsdCBNaWNyb3NlcnZlciIsIDAsIDB4MTAsIDB4RTAsIHsweDFlMDAsIC8qIDAgPT0gY29udHJvbGxlciAjLCAxZSA9PSBvZmZzZXQJKi8KKwkJCQkJIDB4MDAwMCwgLyogMCA9PSBoaWdoIG9mZnNldCwgMCA9PSBnYXAJCSovCisJCQkJCSAweDA4MDAsIC8qIERlZmF1bHQgQXV0b3NlbGVjdAkJCSovCisJCQkJCSAweDgwMDEsIC8qIDEgbGVhZiwgZXh0ZW5kZWQgdHlwZSwgYm9ndXMgbGVuCSovCisJCQkJCSAweDAwMDMsIC8qIFR5cGUgMyAoTUlJKSwgUEhZICMwCQkqLworCQkJCQkgMHgwNDAwLCAvKiAwIGluaXQgaW5zdHIsIDQgcmVzZXQgaW5zdHIJCSovCisJCQkJCSAweDA4MDEsIC8qIFNldCBjb250cm9sIG1vZGUsIEdQMCBvdXRwdXQJKi8KKwkJCQkJIDB4MDAwMCwgLyogRHJpdmUgR1AwIExvdyAoUlNUIGlzIGFjdGl2ZSBsb3cpCSovCisJCQkJCSAweDA4MDAsIC8qIGNvbnRyb2wgbW9kZSwgR1AwIGlucHV0ICh1bmRyaXZlbikJKi8KKwkJCQkJIDB4MDAwMCwgLyogY2xlYXIgY29udHJvbCBtb2RlCQkJKi8KKwkJCQkJIDB4NzgwMCwgLyogMTAwVFggRkRYICsgSERYLCAxMGJUIEZEWCArIEhEWAkqLworCQkJCQkgMHgwMWUwLCAvKiBBZHZlcnRpc2UgYWxsIGFib3ZlCQkJKi8KKwkJCQkJIDB4NTAwMCwgLyogRkRYIGFsbCBhYm92ZQkJCSovCisJCQkJCSAweDE4MDAsIC8qIFNldCBmYXN0IFRUTSBpbiAxMDBidCBtb2RlcwkJKi8KKwkJCQkJIDB4MDAwMCwgLyogUEhZIGNhbm5vdCBiZSB1bnBsdWdnZWQJCSovCisgIH19LAogICB7TlVMTH19OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL2ludGVycnVwdC5jIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKaW5kZXggYWZiNWNkYS4uYmIzNTU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvaW50ZXJydXB0LmMKQEAgLTc4LDcgKzc4LDcgQEAKIAkJCWlmIChza2IgPT0gTlVMTCkKIAkJCQlicmVhazsKIAotCQkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPnRhaWwsIFBLVF9CVUZfU1osCisJCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+ZGF0YSwgUEtUX0JVRl9TWiwKIAkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQkJdHAtPnJ4X2J1ZmZlcnNbZW50cnldLm1hcHBpbmcgPSBtYXBwaW5nOwogCkBAIC0xOTksMTIgKzE5OSwxMiBAQAogCQkJCQkJCQkgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0ubWFwcGluZywKIAkJCQkJCQkJICAgcGt0X2xlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKICNpZiAhIGRlZmluZWQoX19hbHBoYV9fKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRoX2NvcHlfYW5kX3N1bShza2IsIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGhfY29weV9hbmRfc3VtKHNrYiwgdHAtPnJ4X2J1ZmZlcnNbZW50cnldLnNrYi0+ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbiwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAjZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQoc2tiLCBwa3RfbGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT50YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0X2xlbik7CiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwKQEAgLTQyMywxMiArNDIzLDEyIEBACiAJCQkJCQkJICAgIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5tYXBwaW5nLAogCQkJCQkJCSAgICBwa3RfbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogI2lmICEgZGVmaW5lZChfX2FscGhhX18pCi0JCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPnRhaWwsCisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIHRwLT5yeF9idWZmZXJzW2VudHJ5XS5za2ItPmRhdGEsCiAJCQkJCQkgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogI2Vsc2UKIAkJCQltZW1jcHkoc2tiX3B1dChza2IsIHBrdF9sZW4pLAotCQkJCSAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT50YWlsLAorCQkJCSAgICAgICB0cC0+cnhfYnVmZmVyc1tlbnRyeV0uc2tiLT5kYXRhLAogCQkJCSAgICAgICBwa3RfbGVuKTsKICNlbmRpZgogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMgYi9kcml2ZXJzL25ldC90dWxpcC9tZWRpYS5jCmluZGV4IDkxOWM0MGMuLmUyNmMzMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL21lZGlhLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvbWVkaWEuYwpAQCAtNDAwLDYgKzQwMCw5IEBACiAJfQogCiAJdHAtPmNzcjYgPSBuZXdfY3NyNiB8ICh0cC0+Y3NyNiAmIDB4ZmRmZikgfCAodHAtPmZ1bGxfZHVwbGV4ID8gMHgwMjAwIDogMCk7CisKKwltZGVsYXkoMSk7CisKIAlyZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYwppbmRleCBlMGFlM2VkLi5kNDVkOGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCkBAIC0yNDIsNiArMjQyLDcgQEAKICAJeyAweDEwYjksIDB4NTI2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVUxJNTI2WCB9LAkvKiBBTGkgMTU2MyBpbnRlZ3JhdGVkIGV0aGVybmV0ICovCiAgCXsgMHgxMGI5LCAweDUyNjMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFVMSTUyNlggfSwJLyogQUxpIDE1NjMgaW50ZWdyYXRlZCBldGhlcm5ldCAqLwogCXsgMHgxMGI3LCAweDkzMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sIC8qIDNDb20gM0NTT0hPMTAwQi1UWCAqLworCXsgMHgxNGVhLCAweGFiMDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENPTUVUIH0sIC8qIFBsYW5leCBGTlctMzYwMi1UWCAqLwogCXsgfSAvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0dWxpcF9wY2lfdGJsKTsKQEAgLTYyNCw3ICs2MjUsNyBAQAogCQl0cC0+cnhfYnVmZmVyc1tpXS5za2IgPSBza2I7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWJyZWFrOwotCQltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+dGFpbCwKKwkJbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHRwLT5wZGV2LCBza2ItPmRhdGEsCiAJCQkJCSBQS1RfQlVGX1NaLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQl0cC0+cnhfYnVmZmVyc1tpXS5tYXBwaW5nID0gbWFwcGluZzsKIAkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwpAQCAtMTUxNCw4ICsxNTE1LDggQEAKICAgICAgICAgICAgICAgICAgICAgKFBDSV9TTE9UKHBkZXYtPmRldmZuKSA9PSAxMikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvYmFsdCBNQUMgYWRkcmVzcyBpbiBmaXJzdCBFRVBST00gbG9jYXRpb25zLiAqLwogICAgICAgICAgICAgICAgICAgICAgICBzYV9vZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtZWRpYSB0YWJsZSBlaXRoZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgdHAtPmZsYWdzICY9IH5IQVNfTUVESUFfVEFCTEU7CisJCSAgICAgICAvKiBFbnN1cmUgb3VyIG1lZGlhIHRhYmxlIGZpeHVwIGdldCdzIGFwcGxpZWQgKi8KKwkJICAgICAgIG1lbWNweShlZV9kYXRhICsgMTYsIGVlX2RhdGEsIDgpOwogICAgICAgICAgICAgICAgfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0dTQwpAQCAtMTc1NiwxMSArMTc1NywxOSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLQlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcgKGRldikgJiYgbmV0aWZfZGV2aWNlX3ByZXNlbnQgKGRldikpIHsKLQkJbmV0aWZfZGV2aWNlX2RldGFjaCAoZGV2KTsKLQkJdHVsaXBfZG93biAoZGV2KTsKLQkJLyogcGNpX3Bvd2VyX29mZihwZGV2LCAtMSk7ICovCi0JfQorCWlmICghZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXR1bGlwX2Rvd24oZGV2KTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNzY4LDE1ICsxNzc3LDI2IEBACiBzdGF0aWMgaW50IHR1bGlwX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXR2YWw7CiAKLQlpZiAoZGV2ICYmIG5ldGlmX3J1bm5pbmcgKGRldikgJiYgIW5ldGlmX2RldmljZV9wcmVzZW50IChkZXYpKSB7Ci0jaWYgMQotCQlwY2lfZW5hYmxlX2RldmljZSAocGRldik7Ci0jZW5kaWYKLQkJLyogcGNpX3Bvd2VyX29uKHBkZXYpOyAqLwotCQl0dWxpcF91cCAoZGV2KTsKLQkJbmV0aWZfZGV2aWNlX2F0dGFjaCAoZGV2KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmICgocmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsICZ0dWxpcF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBkZXYtPm5hbWUsIGRldikpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgInR1bGlwOiByZXF1ZXN0X2lycSBmYWlsZWQgaW4gcmVzdW1lXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQl0dWxpcF91cChkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMgYi9kcml2ZXJzL25ldC90dWxpcC93aW5ib25kLTg0MC5jCmluZGV4IGNhZmYyZjUuLjViMWFmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3dpbmJvbmQtODQwLmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvd2luYm9uZC04NDAuYwpAQCAtMTIxLDYgKzEyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTM5NCw3ICszOTUsNyBAQAogCiAJaXJxID0gcGRldi0+aXJxOwogCi0JaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwweEZGRkZmZmZmKSkgeworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJXaW5ib25kLTg0MDogRGV2aWNlICVzIGRpc2FibGVkIGR1ZSB0byBETUEgbGltaXRhdGlvbnMuXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTg0OCw3ICs4NDksNyBAQAogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlicmVhazsKIAkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwotCQlucC0+cnhfYWRkcltpXSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LHNrYi0+dGFpbCwKKwkJbnAtPnJ4X2FkZHJbaV0gPSBwY2lfbWFwX3NpbmdsZShucC0+cGNpX2Rldixza2ItPmRhdGEsCiAJCQkJCXNrYi0+bGVuLFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkJbnAtPnJ4X3JpbmdbaV0uYnVmZmVyMSA9IG5wLT5yeF9hZGRyW2ldOwpAQCAtMTI2OCw3ICsxMjY5LDcgQEAKIAkJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUobnAtPnBjaV9kZXYsbnAtPnJ4X2FkZHJbZW50cnldLAogCQkJCQkJCSAgICBucC0+cnhfc2tidWZmW2VudHJ5XS0+bGVuLAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJCWV0aF9jb3B5X2FuZF9zdW0oc2tiLCBucC0+cnhfc2tidWZmW2VudHJ5XS0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsIG5wLT5yeF9za2J1ZmZbZW50cnldLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5wLT5wY2lfZGV2LG5wLT5yeF9hZGRyW2VudHJ5XSwKIAkJCQkJCQkgICAgICAgbnAtPnJ4X3NrYnVmZltlbnRyeV0tPmxlbiwKQEAgLTEzMTQsNyArMTMxNSw3IEBACiAJCQkJYnJlYWs7CQkJLyogQmV0dGVyIGx1Y2sgbmV4dCByb3VuZC4gKi8KIAkJCXNrYi0+ZGV2ID0gZGV2OwkJCS8qIE1hcmsgYXMgYmVpbmcgdXNlZCBieSB0aGlzIGRldmljZS4gKi8KIAkJCW5wLT5yeF9hZGRyW2VudHJ5XSA9IHBjaV9tYXBfc2luZ2xlKG5wLT5wY2lfZGV2LAotCQkJCQkJCXNrYi0+dGFpbCwKKwkJCQkJCQlza2ItPmRhdGEsCiAJCQkJCQkJc2tiLT5sZW4sIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQlucC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IG5wLT5yeF9hZGRyW2VudHJ5XTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAveGlyY29tX3R1bGlwX2NiLmMgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwppbmRleCBiOGE5YjM5Li44ODdkNzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC94aXJjb21fdHVsaXBfY2IuYwpAQCAtODk5LDcgKzg5OSw3IEBACiAJCQlicmVhazsKIAkJc2tiLT5kZXYgPSBkZXY7CQkJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQl0cC0+cnhfcmluZ1tpXS5zdGF0dXMgPSBSeDBEZXNjT3duZWQ7CS8qIE93bmVkIGJ5IFhpcmNvbSBjaGlwICovCi0JCXRwLT5yeF9yaW5nW2ldLmJ1ZmZlcjEgPSB2aXJ0X3RvX2J1cyhza2ItPnRhaWwpOworCQl0cC0+cnhfcmluZ1tpXS5idWZmZXIxID0gdmlydF90b19idXMoc2tiLT5kYXRhKTsKIAl9CiAJdHAtPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoaSAtIFJYX1JJTkdfU0laRSk7CiAKQEAgLTEyOTEsNyArMTI5MSw3IEBACiAJCQlpZiAoc2tiID09IE5VTEwpCiAJCQkJYnJlYWs7CiAJCQlza2ItPmRldiA9IGRldjsJCQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCi0JCQl0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+dGFpbCk7CisJCQl0cC0+cnhfcmluZ1tlbnRyeV0uYnVmZmVyMSA9IHZpcnRfdG9fYnVzKHNrYi0+ZGF0YSk7CiAJCQl3b3JrX2RvbmUrKzsKIAkJfQogCQl0cC0+cnhfcmluZ1tlbnRyeV0uc3RhdHVzID0gUngwRGVzY093bmVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCA3YmZlZTM2Li5lZmZhYjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtMjE1LDcgKzIxNSw3IEBACiAKIAlwb2xsX3dhaXQoZmlsZSwgJnR1bi0+cmVhZF93YWl0LCB3YWl0KTsKICAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmdHVuLT5yZWFkcSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnR1bi0+cmVhZHEpKQogCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAKIAlyZXR1cm4gbWFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwppbmRleCA4ZjMzOTI5Li5lY2ZhNmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90eXBob29uLmMKKysrIGIvZHJpdmVycy9uZXQvdHlwaG9vbi5jCkBAIC0xNjYxLDcgKzE2NjEsNyBAQAogI2VuZGlmCiAKIAlza2ItPmRldiA9IHRwLT5kZXY7Ci0JZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT50YWlsLAorCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsIHNrYi0+ZGF0YSwKIAkJCQkgIFBLVF9CVUZfU1osIFBDSV9ETUFfRlJPTURFVklDRSk7CiAKIAkvKiBTaW5jZSBubyBjYXJkIGRvZXMgNjQgYml0IERBQywgdGhlIGhpZ2ggYml0cyB3aWxsIG5ldmVyCkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LCBkbWFfYWRkciwKIAkJCQkJCSAgICBQS1RfQlVGX1NaLAogCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlldGhfY29weV9hbmRfc3VtKG5ld19za2IsIHNrYi0+dGFpbCwgcGt0X2xlbiwgMCk7CisJCQlldGhfY29weV9hbmRfc3VtKG5ld19za2IsIHNrYi0+ZGF0YSwgcGt0X2xlbiwgMCk7CiAJCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodHAtPnBkZXYsIGRtYV9hZGRyLAogCQkJCQkJICAgICAgIFBLVF9CVUZfU1osCiAJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKQEAgLTE5MDYsOSArMTkwNiw5IEBACiAJICovCiAJbmV0aWZfY2Fycmllcl9vZmYodHAtPmRldik7CiAKLQlwY2lfZW5hYmxlX3dha2UodHAtPnBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCAxKTsKKwlwY2lfZW5hYmxlX3dha2UodHAtPnBkZXYsIHN0YXRlLCAxKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKIH0KIAogc3RhdGljIGludApAQCAtMjI3NCw3ICsyMjc0LDcgQEAKIAkJZ290byBuZWVkX3Jlc3VtZTsKIAl9CiAKLQlpZih0eXBob29uX3NsZWVwKHRwLCBzdGF0ZSwgdHAtPndvbF9ldmVudHMpIDwgMCkgeworCWlmKHR5cGhvb25fc2xlZXAodHAsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpLCB0cC0+d29sX2V2ZW50cykgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBwdXQgY2FyZCB0byBzbGVlcFxuIiwgZGV2LT5uYW1lKTsKIAkJZ290byBuZWVkX3Jlc3VtZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtcmhpbmUuYyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCmluZGV4IDdiNTdkNTUuLmZjNzczOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCkBAIC0xODYsNiArMTg2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtNTA2LDcgKzUwNyw3IEBACiBzdGF0aWMgaW50IG5ldGRldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKTsKIHN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzOwogc3RhdGljIGludCAgcmhpbmVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCByaGluZV9zaHV0ZG93biAoc3RydWN0IGRldmljZSAqZ2Rldik7CitzdGF0aWMgdm9pZCByaGluZV9zaHV0ZG93biAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCiAjZGVmaW5lIFJISU5FX1dBSVRfRk9SKGNvbmRpdGlvbikgZG8gewkJCQkJXAogCWludCBpPTEwMjQ7CQkJCQkJCVwKQEAgLTc0MCw3ICs3NDEsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAKIAkvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgc3VwcG9ydGVkICovCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmZmYpOworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgYnkgIgogCQkgICAgICAgInRoZSBjYXJkIT9cbiIpOwpAQCAtOTg5LDcgKzk5MCw3IEBACiAJCXNrYi0+ZGV2ID0gZGV2OyAgICAgICAgICAgICAgICAgLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCiAJCXJwLT5yeF9za2J1ZmZfZG1hW2ldID0KLQkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPnRhaWwsIHJwLT5yeF9idWZfc3osCisJCQlwY2lfbWFwX3NpbmdsZShycC0+cGRldiwgc2tiLT5kYXRhLCBycC0+cnhfYnVmX3N6LAogCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCXJwLT5yeF9yaW5nW2ldLmFkZHIgPSBjcHVfdG9fbGUzMihycC0+cnhfc2tidWZmX2RtYVtpXSk7CkBAIC0xMzk3LDcgKzEzOTgsNyBAQAogCXdoaWxlIChycC0+ZGlydHlfdHggIT0gcnAtPmN1cl90eCkgewogCQl0eHN0YXR1cyA9IGxlMzJfdG9fY3B1KHJwLT50eF9yaW5nW2VudHJ5XS50eF9zdGF0dXMpOwogCQlpZiAoZGVidWcgPiA2KQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiBUeCBzY2F2ZW5nZSAlZCBzdGF0dXMgJTguOHguXG4iLAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlR4IHNjYXZlbmdlICVkIHN0YXR1cyAlOC44eC5cbiIsCiAJCQkgICAgICAgZW50cnksIHR4c3RhdHVzKTsKIAkJaWYgKHR4c3RhdHVzICYgRGVzY093bikKIAkJCWJyZWFrOwpAQCAtMTQ2OCw3ICsxNDY5LDcgQEAKIAkJaW50IGRhdGFfc2l6ZSA9IGRlc2Nfc3RhdHVzID4+IDE2OwogCiAJCWlmIChkZWJ1ZyA+IDQpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiIHJoaW5lX3J4KCkgc3RhdHVzIGlzICU4Ljh4LlxuIiwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJyaGluZV9yeCgpIHN0YXR1cyBpcyAlOC44eC5cbiIsCiAJCQkgICAgICAgZGVzY19zdGF0dXMpOwogCQlpZiAoLS1ib2d1c2NudCA8IDApCiAJCQlicmVhazsKQEAgLTE0ODYsNyArMTQ4Nyw3IEBACiAJCQl9IGVsc2UgaWYgKGRlc2Nfc3RhdHVzICYgUnhFcnIpIHsKIAkJCQkvKiBUaGVyZSB3YXMgYSBlcnJvci4gKi8KIAkJCQlpZiAoZGVidWcgPiAyKQotCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiIHJoaW5lX3J4KCkgUnggIgorCQkJCQlwcmludGsoS0VSTl9ERUJVRyAicmhpbmVfcngoKSBSeCAiCiAJCQkJCSAgICAgICAiZXJyb3Igd2FzICU4Ljh4LlxuIiwKIAkJCQkJICAgICAgIGRlc2Nfc3RhdHVzKTsKIAkJCQlycC0+c3RhdHMucnhfZXJyb3JzKys7CkBAIC0xNTE3LDcgKzE1MTgsNyBAQAogCQkJCQkJCSAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCiAJCQkJZXRoX2NvcHlfYW5kX3N1bShza2IsCi0JCQkJCQkgcnAtPnJ4X3NrYnVmZltlbnRyeV0tPnRhaWwsCisJCQkJCQkgcnAtPnJ4X3NrYnVmZltlbnRyeV0tPmRhdGEsCiAJCQkJCQkgcGt0X2xlbiwgMCk7CiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCQkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShycC0+cGRldiwKQEAgLTE1NjAsNyArMTU2MSw3IEBACiAJCQkJYnJlYWs7CS8qIEJldHRlciBsdWNrIG5leHQgcm91bmQuICovCiAJCQlza2ItPmRldiA9IGRldjsJLyogTWFyayBhcyBiZWluZyB1c2VkIGJ5IHRoaXMgZGV2aWNlLiAqLwogCQkJcnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldID0KLQkJCQlwY2lfbWFwX3NpbmdsZShycC0+cGRldiwgc2tiLT50YWlsLAorCQkJCXBjaV9tYXBfc2luZ2xlKHJwLT5wZGV2LCBza2ItPmRhdGEsCiAJCQkJCSAgICAgICBycC0+cnhfYnVmX3N6LAogCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXJwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocnAtPnJ4X3NrYnVmZl9kbWFbZW50cnldKTsKQEAgLTE4OTQsOSArMTg5NSw4IEBACiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZCByaGluZV9zaHV0ZG93biAoc3RydWN0IGRldmljZSAqZ2VuZGV2KQorc3RhdGljIHZvaWQgcmhpbmVfc2h1dGRvd24gKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihnZW5kZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHJwLT5iYXNlOwpAQCAtMTk1NSw3ICsxOTU1LDcgQEAKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZycC0+bG9jaywgZmxhZ3MpOwotCXJoaW5lX3NodXRkb3duKCZwZGV2LT5kZXYpOworCXJoaW5lX3NodXRkb3duKHBkZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwLT5sb2NrLCBmbGFncyk7CiAKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKQEAgLTIwMDksOSArMjAwOSw3IEBACiAJLnN1c3BlbmQJPSByaGluZV9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcmhpbmVfcmVzdW1lLAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCS5kcml2ZXIgPSB7Ci0JCS5zaHV0ZG93biA9IHJoaW5lX3NodXRkb3duLAotCX0KKwkuc2h1dGRvd24gPQlyaGluZV9zaHV0ZG93biwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwppbmRleCAxNWU3MTAyLi5hYmM1Y2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYwpAQCAtMTMzNSw3ICsxMzM1LDcgQEAKIAkJCWlmICh2cHRyLT5mbGFncyAmIFZFTE9DSVRZX0ZMQUdTX0lQX0FMSUdOKQogCQkJCXNrYl9yZXNlcnZlKG5ld19za2IsIDIpOwogCi0JCQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgcnhfc2tiWzBdLT50YWlsLCBwa3Rfc2l6ZSk7CisJCQltZW1jcHkobmV3X3NrYi0+ZGF0YSwgcnhfc2tiWzBdLT5kYXRhLCBwa3Rfc2l6ZSk7CiAJCQkqcnhfc2tiID0gbmV3X3NrYjsKIAkJCXJldCA9IDA7CiAJCX0KQEAgLTE0NTYsOSArMTQ1Niw5IEBACiAJICoJRG8gdGhlIGd5bW5hc3RpY3MgdG8gZ2V0IHRoZSBidWZmZXIgaGVhZCBmb3IgZGF0YSBhdAogCSAqCTY0Ynl0ZSBhbGlnbm1lbnQuCiAJICovCi0Jc2tiX3Jlc2VydmUocmRfaW5mby0+c2tiLCAodW5zaWduZWQgbG9uZykgcmRfaW5mby0+c2tiLT50YWlsICYgNjMpOworCXNrYl9yZXNlcnZlKHJkX2luZm8tPnNrYiwgKHVuc2lnbmVkIGxvbmcpIHJkX2luZm8tPnNrYi0+ZGF0YSAmIDYzKTsKIAlyZF9pbmZvLT5za2ItPmRldiA9IHZwdHItPmRldjsKLQlyZF9pbmZvLT5za2JfZG1hID0gcGNpX21hcF9zaW5nbGUodnB0ci0+cGRldiwgcmRfaW5mby0+c2tiLT50YWlsLCB2cHRyLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJcmRfaW5mby0+c2tiX2RtYSA9IHBjaV9tYXBfc2luZ2xlKHZwdHItPnBkZXYsIHJkX2luZm8tPnNrYi0+ZGF0YSwgdnB0ci0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQogCS8qCiAJICoJRmlsbCBpbiB0aGUgZGVzY3JpcHRvciB0byBtYXRjaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwppbmRleCA2NmI5NDY2Li4xOGMyN2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93YW4vS2NvbmZpZwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJICB0aGUgZHJpdmVyIHRvIHN1cHBvcnQuCiAKIAkgIElmIHlvdSBoYXZlIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhcmRzLCBzYXkgTSB0byB0aGlzIG9wdGlvbjsKLQkgIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW5waXBlLnR4dD4uCisJICBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQ+LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW5waXBlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYyBiL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKaW5kZXggNzU3NWI3OS4uMmM4M2NjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2ZhcnN5bmMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCkBAIC04NjEsOCArODYxLDcgQEAKIC8qCiAgKiBNYXJrIGl0IGZvciBvdXIgb3duIHJhdyBzb2NrZXRzIGludGVyZmFjZQogICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgZmFyc3luY190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBmYXJzeW5jX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPm1hYy5yYXcgPSBza2ItPmRhdGE7CkBAIC05ODEsNiArOTgwLDcgQEAKIAkvKiBXYWl0IGZvciBhbnkgcHJldmlvdXMgY29tbWFuZCB0byBjb21wbGV0ZSAqLwogCXdoaWxlIChtYnZhbCA+IE5BSykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19jaXNjby5jCmluZGV4IGMxYjY4OTYuLjQ4YzAzYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2Npc2NvLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfY2lzY28uYwpAQCAtNzIsNyArNzIsNyBAQAogCX0KIAlza2JfcmVzZXJ2ZShza2IsIDQpOwogCWNpc2NvX2hhcmRfaGVhZGVyKHNrYiwgZGV2LCBDSVNDT19LRUVQQUxJVkUsIE5VTEwsIE5VTEwsIDApOwotCWRhdGEgPSAoY2lzY29fcGFja2V0Kilza2ItPnRhaWw7CisJZGF0YSA9IChjaXNjb19wYWNrZXQqKXNrYi0+ZGF0YTsKIAogCWRhdGEtPnR5cGUgPSBodG9ubCh0eXBlKTsKIAlkYXRhLT5wYXIxID0gaHRvbmwocGFyMSk7CkBAIC05MSw4ICs5MSw3IEBACiAKIAogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgY2lzY29fdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBjaXNjb190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaGRsY19oZWFkZXIgKmRhdGEgPSAoaGRsY19oZWFkZXIqKXNrYi0+ZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcHBwLmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwppbmRleCA3Y2Q2MTk1Li5iODEyNjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19wcHAuYwpAQCAtNjYsOCArNjYsNyBAQAogCiAKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBwcF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIF9fYmUxNiBwcHBfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXJldHVybiBfX2NvbnN0YW50X2h0b25zKEVUSF9QX1dBTl9QUFApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfcmF3LmMgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwppbmRleCBjNDFmYjcwLi45NDU2ZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19yYXcuYwpAQCAtMjQsOCArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KIAogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgcmF3X3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19iZTE2IHJhd190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3dhbnhsLmMgYi9kcml2ZXJzL25ldC93YW4vd2FueGwuYwppbmRleCAxZTdiNDc3Li45YzFlMTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vd2FueGwuYworKysgYi9kcml2ZXJzL25ldC93YW4vd2FueGwuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkbGMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogCkBAIC02MjQsOCArNjI1LDggQEAKIAkvKiBGSVhNRSB3aGVuIFBDSS9ETUEgc3Vic3lzdGVtcyBhcmUgZml4ZWQuCiAJICAgV2Ugc2V0IGJvdGggZG1hX21hc2sgYW5kIGNvbnNpc3RlbnRfZG1hX21hc2sgYmFjayB0byAzMiBiaXRzCiAJICAgdG8gaW5kaWNhdGUgdGhlIGNhcmQgY2FuIGRvIDMyLWJpdCBETUEgYWRkcmVzc2luZyAqLwotCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhGRkZGRkZGRikgfHwKLQkgICAgcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweEZGRkZGRkZGKSkgeworCWlmIChwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spIHx8CisJICAgIHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKSB7CiAJCXByaW50ayhLRVJOX0VSUiAid2FuWEw6IE5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvblxuIik7CiAJCXdhbnhsX3BjaV9yZW1vdmVfb25lKHBkZXYpOwogCQlyZXR1cm4gLUVJTzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dkLmMgYi9kcml2ZXJzL25ldC93ZC5jCmluZGV4IDFmMDVkOWIuLmIwM2ZlYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dkLmMKKysrIGIvZHJpdmVycy9uZXQvd2QuYwpAQCAtMTQ5LDEyICsxNDksNyBAQAogCWVyciA9IGRvX3dkX3Byb2JlKGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0JZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBvdXQxOwogCXJldHVybiBkZXY7Ci1vdXQxOgotCWNsZWFudXBfY2FyZChkZXYpOwogb3V0OgogCWZyZWVfbmV0ZGV2KGRldik7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKQEAgLTE2NCw2ICsxNTksNyBAQAogc3RhdGljIGludCBfX2luaXQgd2RfcHJvYmUxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpb2FkZHIpCiB7CiAJaW50IGk7CisJaW50IGVycjsKIAlpbnQgY2hlY2tzdW0gPSAwOwogCWludCBhbmNpZW50ID0gMDsJCQkvKiBBbiBvbGQgY2FyZCB3aXRob3V0IGNvbmZpZyByZWdpc3RlcnMuICovCiAJaW50IHdvcmQxNiA9IDA7CQkJCS8qIDAgPSA4IGJpdCwgMSA9IDE2IGJpdCAqLwpAQCAtMzU2LDcgKzM1MiwxMCBAQAogCQlvdXRiKGluYihpb2FkZHIrNCl8MHg4MCwgaW9hZGRyKzQpOwogI2VuZGlmCiAKLQlyZXR1cm4gMDsKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlpZiAoZXJyKQorCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50CkBAIC01MjcsMTEgKzUyNiw4IEBACiAJCWRldi0+bWVtX3N0YXJ0ID0gbWVtW3RoaXNfZGV2XTsKIAkJZGV2LT5tZW1fZW5kID0gbWVtX2VuZFt0aGlzX2Rldl07CiAJCWlmIChkb193ZF9wcm9iZShkZXYpID09IDApIHsKLQkJCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSA9PSAwKSB7Ci0JCQkJZGV2X3dkW2ZvdW5kKytdID0gZGV2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2xlYW51cF9jYXJkKGRldik7CisJCQlkZXZfd2RbZm91bmQrK10gPSBkZXY7CisJCQljb250aW51ZTsKIAkJfQogCQlmcmVlX25ldGRldihkZXYpOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3ZC5jOiBObyB3ZDgweDMgY2FyZCBmb3VuZCAoaS9vID0gMHgleCkuXG4iLCBpb1t0aGlzX2Rldl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IGZiMTBhMmQuLjQ3ZjNjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCXVuc2lnbmVkIGNoYXIgX191c2VyICpkYXRhOwkvLyBkLWRhdGEKIH0gYWlyb25ldF9pb2N0bDsKIAotc3RhdGljIGNoYXIgKnN3dmVyc2lvbiA9ICIyLjEiOworc3RhdGljIGNoYXIgc3d2ZXJzaW9uW10gPSAiMi4xIjsKICNlbmRpZiAvKiBDSVNDT19FWFQgKi8KIAogI2RlZmluZSBOVU1fTU9EVUxFUyAgICAgICAyCkBAIC0xMjA5LDcgKzEyMDksNyBAQAogCXVuc2lnbmVkIGNoYXIJCV9faW9tZW0gKnBjaWF1eDsKIAl1bnNpZ25lZCBjaGFyCQkqc2hhcmVkOwogCWRtYV9hZGRyX3QJCXNoYXJlZF9kbWE7Ci0JaW50CQkJcG93ZXI7CisJcG1fbWVzc2FnZV90CQlwb3dlcjsKIAlTc2lkUmlkCQkJKlNTSUQ7CiAJQVBMaXN0UmlkCQkqQVBMaXN0OwogI2RlZmluZQlQQ0lfU0hBUkVEX0xFTgkJMipNUElfTUFYX0ZJRFMqUEtUU0laRStSSURTSVpFCkBAIC0yMzc0LDcgKzIzNzQsNyBAQAogCS8qCiAJICogQ2xlYW4gb3V0IHR4IHF1ZXVlCiAJICovCi0JaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKSAmJiBza2JfcXVldWVfbGVuICgmYWktPnR4cSkgPiAwKSB7CisJaWYgKHRlc3RfYml0KEZMQUdfTVBJLCAmYWktPmZsYWdzKSAmJiAhc2tiX3F1ZXVlX2VtcHR5KCZhaS0+dHhxKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAkJZm9yICg7KHNrYiA9IHNrYl9kZXF1ZXVlKCZhaS0+dHhxKSk7KQogCQkJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMjkxOCw3ICsyOTE4LDcgQEAKIAkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAKIAkJLyogbWFrZSBzd3N1c3AgaGFwcHkgd2l0aCBvdXIgdGhyZWFkICovCi0JCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOwogCiAJCWlmICh0ZXN0X2JpdChKT0JfRElFLCAmYWktPmZsYWdzKSkKIAkJCWJyZWFrOwpAQCAtMzI4Nyw3ICszMjg3LDcgQEAKIAkJCQlpZiAoc3RhdHVzICYgRVZfVFhFWEMpCiAJCQkJCWdldF90eF9lcnJvcihhcHJpdiwgLTEpOwogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhcHJpdi0+YXV4X2xvY2ssIGZsYWdzKTsKLQkJCQlpZiAoc2tiX3F1ZXVlX2xlbiAoJmFwcml2LT50eHEpKSB7CisJCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmFwcml2LT50eHEpKSB7CiAJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwcml2LT5hdXhfbG9jayxmbGFncyk7CiAJCQkJCW1waV9zZW5kX3BhY2tldCAoZGV2KTsKIAkJCQl9IGVsc2UgewpAQCAtNTQ5OSw5ICs1NDk5LDkgQEAKIAljbWQuY21kPUhPU1RTTEVFUDsKIAlpc3N1ZWNvbW1hbmQoYWksICZjbWQsICZyc3ApOwogCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIHN0YXRlLCAxKTsKKwlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksIDEpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHN0YXRlKTsKKwlyZXR1cm4gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CiB9CiAKIHN0YXRpYyBpbnQgYWlyb19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtNTUxMiw3ICs1NTEyLDcgQEAKIAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIGFpLT5wb3dlciwgMCk7CisJcGNpX2VuYWJsZV93YWtlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgYWktPnBvd2VyKSwgMCk7CiAKIAlpZiAoYWktPnBvd2VyID4gMSkgewogCQlyZXNldF9jYXJkKGRldiwgMCk7CkBAIC01NTQxLDcgKzU1NDEsNyBAQAogCX0KIAl3cml0ZUNvbmZpZ1JpZChhaSwgMCk7CiAJZW5hYmxlX01BQyhhaSwgJnJzcCwgMCk7Ci0JYWktPnBvd2VyID0gMDsKKwlhaS0+cG93ZXIgPSBQTVNHX09OOwogCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAJZW5hYmxlX2ludGVycnVwdHMoYWkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyb19jcy5jCmluZGV4IGZiZjUzYWYuLmJmMjU1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm9fY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvX2NzLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMTAsMTEgKzIwOSw2IEBACiAJbGluay0+bmV4dCA9IGRldl9saXN0OwogCWRldl9saXN0ID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQkJQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCQlDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQlDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZhaXJvX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNTU5LDEzICs1NTMsMjQgQEAKIAlyZXR1cm4gMDsKIH0gLyogYWlyb19ldmVudCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYWlyb19pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWYsIDB4MDAwYSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTVmLCAweDAwMDUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1ZiwgMHgwMDA3KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDUsIDB4MDAwNyksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBhaXJvX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhaXJvX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImFpcm9fY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBhaXJvX2F0dGFjaCwKKwkuZXZlbnQJCT0gYWlyb19ldmVudCwKIAkuZGV0YWNoCQk9IGFpcm9fZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IGFpcm9faWRzLAogfTsKIAogc3RhdGljIGludCBhaXJvX2NzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FpcnBvcnQuYwppbmRleCBiNGY0YmQ3Li45ZDQ5NjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlycG9ydC5jCkBAIC0xODQsNyArMTg0LDcgQEAKIH0KIAogc3RhdGljIGludAotYWlycG9ydF9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK2FpcnBvcnRfYXR0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTI2NiwxNiArMjY2LDE2IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIEFwcGxlIEFpcnBvcnQgd2lyZWxlc3MgY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBhaXJwb3J0X21hdGNoW10gPSAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpcnBvcnRfbWF0Y2hbXSA9IAogewogCXsKIAkubmFtZSAJCT0gInJhZGlvIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXt9LAogfTsKIAorTU9EVUxFX0RFVklDRV9UQUJMRSAob2YsIGFpcnBvcnRfbWF0Y2gpOworCiBzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBhaXJwb3J0X2RyaXZlciA9IAogewogCS5uYW1lIAkJPSBEUklWRVJfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYwppbmRleCA0ZjMwNGM2ZS4uMGUxYWMzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXJsYW4tbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2FybGFuLW1haW4uYwpAQCAtMzMsOCArMzMsNiBAQAogCiAjaWZkZWYgQVJMQU5fREVCVUdHSU5HCiAKLXN0YXRpYyBpbnQgYXJsYW5fZW50cnlfZGVidWc7Ci1zdGF0aWMgaW50IGFybGFuX2V4aXRfZGVidWc7CiBzdGF0aWMgaW50IHRlc3RNZW1vcnkgPSB0ZXN0TWVtb3J5VU5LTk9XTjsKIHN0YXRpYyBpbnQgaXJxID0gaXJxVU5LTk9XTjsKIHN0YXRpYyBpbnQgdHhTY3JhbWJsZWQgPSAxOwpAQCAtNDMsMTUgKzQxLDEzIEBACiBtb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKG1kZWJ1ZywgaW50LCAwKTsKIG1vZHVsZV9wYXJhbSh0ZXN0TWVtb3J5LCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGFybGFuX2VudHJ5X2RlYnVnLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGFybGFuX2V4aXRfZGVidWcsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0odHhTY3JhbWJsZWQsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlycSwgIih1bnVzZWQpIik7CiBNT0RVTEVfUEFSTV9ERVNDKHRlc3RNZW1vcnksICIodW51c2VkKSIpOwogTU9EVUxFX1BBUk1fREVTQyhtZGVidWcsICJBcmxhbiBtdWx0aWNhc3QgZGVidWdnaW5nICgwLTEpIik7CiAjZW5kaWYKIAotbW9kdWxlX3BhcmFtKGFybGFuX2RlYnVnLCBpbnQsIDApOworbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBhcmxhbl9kZWJ1ZywgaW50LCAwKTsKIG1vZHVsZV9wYXJhbShzcHJlYWRpbmdDb2RlLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKGNoYW5uZWxOdW1iZXIsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0oY2hhbm5lbFNldCwgaW50LCAwKTsKQEAgLTYzLDE3ICs1OSwxOSBAQAogbW9kdWxlX3BhcmFtKHR4X2RlbGF5X21zLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHJldHJpZXMsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0odHhfcXVldWVfbGVuLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKGFybGFuX0VFUFJPTV9iYWQsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGFybGFuX2RlYnVnLCAiQXJsYW4gZGVidWcgZW5hYmxlICgwLTEpIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoRUVQUk9NX2JhZCwgYXJsYW5fRUVQUk9NX2JhZCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJBcmxhbiBkZWJ1ZyBlbmFibGUgKDAtMSkiKTsKIE1PRFVMRV9QQVJNX0RFU0MocmV0cmllcywgIkFybGFuIG1heGltdW0gcGFja2V0IHJldHJhbnNtaXNpb25zIik7CiAjaWZkZWYgQVJMQU5fRU5UUllfRVhJVF9ERUJVR0dJTkcKLU1PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZW50cnkgZGVidWdnaW5nIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGFybGFuX2V4aXRfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZXhpdCBkZWJ1Z2dpbmciKTsKLU1PRFVMRV9QQVJNX0RFU0MoYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcsICJBcmxhbiBkcml2ZXIgZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQgZGVidWdnaW5nIik7Ci0jZWxzZQotTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9lbnRyeV9kZWJ1ZywgIihpZ25vcmVkKSIpOwotTU9EVUxFX1BBUk1fREVTQyhhcmxhbl9leGl0X2RlYnVnLCAiKGlnbm9yZWQpIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGFybGFuX2VudHJ5X2FuZF9leGl0X2RlYnVnLCAiKGlnbm9yZWQpIik7CitzdGF0aWMgaW50IGFybGFuX2VudHJ5X2RlYnVnOworc3RhdGljIGludCBhcmxhbl9leGl0X2RlYnVnOworc3RhdGljIGludCBhcmxhbl9lbnRyeV9hbmRfZXhpdF9kZWJ1ZzsKK21vZHVsZV9wYXJhbV9uYW1lZChlbnRyeV9kZWJ1ZywgYXJsYW5fZW50cnlfZGVidWcsIGludCwgMCk7Cittb2R1bGVfcGFyYW1fbmFtZWQoZXhpdF9kZWJ1ZywgYXJsYW5fZXhpdF9kZWJ1ZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZChlbnRyeV9hbmRfZXhpdF9kZWJ1ZywgYXJsYW5fZW50cnlfYW5kX2V4aXRfZGVidWcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGVudHJ5X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGVudHJ5IGRlYnVnZ2luZyIpOworTU9EVUxFX1BBUk1fREVTQyhleGl0X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGV4aXQgZGVidWdnaW5nIik7CitNT0RVTEVfUEFSTV9ERVNDKGVudHJ5X2FuZF9leGl0X2RlYnVnLCAiQXJsYW4gZHJpdmVyIGZ1bmN0aW9uIGVudHJ5IGFuZCBleGl0IGRlYnVnZ2luZyIpOwogI2VuZGlmCiAKIHN0cnVjdCBhcmxhbl9jb25mX3N0cnUgYXJsYW5fY29uZltNQVhfQVJMQU5TXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbF9jcy5jCmluZGV4IGE0ZWQyOGQuLmZmMDMxYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWxfY3MuYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTIxOCwxMSArMjE3LDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmF0bWVsX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNjQ2LDEzICs2NDAsMzYgQEAKIH0gLyogYXRtZWxfZXZlbnQgKi8KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgYXRtZWxfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTAxLCAweDA2MjApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwMSwgMHgwNjk2KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxYmYsIDB4MzMwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDcpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIxMVdBVkUiLCAiMTFXUDYxMUFMLUUiLCAweDllYjJkYTFmLCAweGM5YTBkM2Y5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVRNRUwiLCAiQVQ3NkM1MDJBUiIsIDB4YWJkYTQxNjQsIDB4NDFiMzdlMWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVE1FTCIsICJBVDc2QzUwNCIsIDB4YWJkYTQxNjQsIDB4NTA0MDY3MGEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBVE1FTCIsICJBVDc2QzUwNEEiLCAweGFiZGE0MTY0LCAweGUxNWVkODdmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQlQiLCAiVm95YWdlciAxMDIwIExhcHRvcCBBZGFwdGVyIiwgMHhhZTQ5Yjg2YSwgMHgxZTk1N2NkNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNOZXQiLCAiQ05XTEMgMTFNYnBzIFdpcmVsZXNzIFBDIENhcmQgVi01IiwgMHhiYzQ3N2RkZSwgMHg1MDJmYWU2YiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklFRUUgODAyLjExYiIsICJXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIDB4NWI4Nzg3MjQsIDB4MTIyZjFkZjYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJPRU0iLCAiMTFNYnBzIFdpcmVsZXNzIExBTiBQQyBDYXJkIFYtMyIsIDB4ZmVhNTRjOTAsIDB4MWM1YjBmNjgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTTUMiLCAiMjYzMlciLCAweGM0ZjhiMThiLCAweDMwZjM4Nzc0KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU01DIiwgIjI2MzJXLVYyIiwgMHhjNGY4YjE4YiwgMHgxNzJkMTM3NyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIldpcmVsZXNzIiwgIlBDIiwgMHhhNDA3ZWNkZCwgMHg1NTZlNGQ3ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIldMQU4iLCAiODAyLjExYiBQQyBDQVJEIiwgMHg1NzVjNTE2YywgMHhiMWY2ZGJjNCksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGF0bWVsX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBhdG1lbF9kcml2ZXIgPSB7Ci0gICAgICAgIC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAotICAgICAgICAuZHJ2ICAgICAgICAgICAgPSB7Ci0gICAgICAgICAgICAgICAgLm5hbWUgICA9ICJhdG1lbF9jcyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJhdG1lbF9jcyIsCiAgICAgICAgIH0sCi0gICAgICAgIC5hdHRhY2ggICAgICAgICA9IGF0bWVsX2F0dGFjaCwKLSAgICAgICAgLmRldGFjaCAgICAgICAgID0gYXRtZWxfZGV0YWNoLAorCS5hdHRhY2ggICAgICAgICA9IGF0bWVsX2F0dGFjaCwKKwkuZXZlbnQJCT0gYXRtZWxfZXZlbnQsCisJLmRldGFjaAkJPSBhdG1lbF9kZXRhY2gsCisJLmlkX3RhYmxlCT0gYXRtZWxfaWRzLAogfTsKIAogc3RhdGljIGludCBhdG1lbF9jc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9uZXR3YXZlX2NzLmMKaW5kZXggMzgyMjQxZS4uNWY1MDdjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbmV0d2F2ZV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL25ldHdhdmVfY3MuYwpAQCAtNjIsNyArNjIsNiBAQAogI2VuZGlmCS8qIFdJUkVMRVNTX0VYVCA+IDEyICovCiAjZW5kaWYKIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtNDkxLDExICs0OTAsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbmV0d2F2ZV9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTE2NjgsMTMgKzE2NjIsMjEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIG5ldHdhdmVfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlhpcmNvbSIsICJDcmVkaXRDYXJkIE5ldHdhdmUiLCAweDJlM2VlODQ1LCAweDU0ZTI4YTI4KSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIG5ldHdhdmVfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIG5ldHdhdmVfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAibmV0d2F2ZV9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IG5ldHdhdmVfYXR0YWNoLAorCS5ldmVudAkJPSBuZXR3YXZlX2V2ZW50LAogCS5kZXRhY2gJCT0gbmV0d2F2ZV9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gbmV0d2F2ZV9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X25ldHdhdmVfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwppbmRleCBiMTA3OGJhYS4uYWFiY2RjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uYwpAQCAtNDYsMzgyICs0Niw5IEBACiAgKiB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLiAgKi8KIAogLyoKLSAqIHYwLjAxIC0+IHYwLjAyIC0gMjEvMy8yMDAxIC0gSmVhbiBJSQotICoJbyBBbGxvdyB0byB1c2UgcmVndWxhciBldGhYIGRldmljZSBuYW1lIGluc3RlYWQgb2YgZGxkd2RYCi0gKglvIFdhcm5pbmcgb24gSUJTUyB3aXRoIEVTU0lEPWFueSBmb3IgZmlybXdhcmUgNi4wNgotICoJbyBQdXQgcHJvcGVyIHJhbmdlLnRocm91Z2hwdXQgdmFsdWVzIChvcHRpbWlzdGljKQotICoJbyBJV1NQWSBzdXBwb3J0IChJT0NUTCBhbmQgc3RhdCBnYXRoZXIgaW4gUnggcGF0aCkKLSAqCW8gQWxsb3cgc2V0dGluZyBmcmVxdWVuY3kgaW4gQWQtSG9jIG1vZGUKLSAqCW8gRGlzYWJsZSBXRVAgc2V0dGluZyBpZiAhaGFzX3dlcCB0byB3b3JrIG9uIG9sZCBmaXJtd2FyZQotICoJbyBGaXggdHhwb3dlciByYW5nZQotICoJbyBTdGFydCBhZGRpbmcgc3VwcG9ydCBmb3IgU2Ftc3VuZy9Db21wYXEgZmlybXdhcmUKLSAqCi0gKiB2MC4wMiAtPiB2MC4wMyAtIDIzLzMvMjAwMSAtIEplYW4gSUkKLSAqCW8gU3RhcnQgYWRkaW5nIFN5bWJvbCBzdXBwb3J0IC0gbmVlZCB0byBjaGVjayBhbGwgdGhhdAotICoJbyBGaXggUHJpc20yL1N5bWJvbCBXRVAgdG8gYWNjZXB0IDEyOCBiaXRzIGtleXMKLSAqCW8gQWRkIFN5bWJvbCBXRVAgKGFkZCBhdXRoZW50aWNhdGlvbiB0eXBlKQotICoJbyBBZGQgUHJpc20yL1N5bWJvbCByYXRlCi0gKglvIEFkZCBQTSB0aW1lb3V0IChob2xkb3ZlciBkdXJhdGlvbikKLSAqCW8gRW5hYmxlICJpd2NvbmZpZyBldGgwIGtleSBvZmYiIGFuZCBmcmllbmRzICh0b2dnbGUgZmxhZ3MpCi0gKglvIEVuYWJsZSAiaXdjb25maWcgZXRoMCBwb3dlciB1bmljYXN0L2FsbCIgKHRvZ2dsZSBmbGFncykKLSAqCW8gVHJ5IHdpdGggYW4gSW50ZWwgY2FyZC4gSXQgcmVwb3J0IGZpcm13YXJlIDEuMDEsIGJlaGF2ZSBsaWtlCi0gKgkgIGFuIGFudGlxdWF0ZWQgZmlybXdhcmUsIGhvd2V2ZXIgb24gd2luZG93cyBpdCBzYXlzIDIuMDAuIFl1Y2sgIQotICoJbyBXb3JrYXJvdW5kIGZpcm13YXJlIGJ1ZyBpbiBhbGxvY2F0ZSBidWZmZXIgKEludGVsIDEuMDEpCi0gKglvIEZpbmlzaCBleHRlcm5hbCByZW5hbWluZyB0byBvcmlub2NvLi4uCi0gKglvIFRlc3Rpbmcgd2l0aCB2YXJpb3VzIFdhdmVsYW4gZmlybXdhcmVzCi0gKgotICogdjAuMDMgLT4gdjAuMDQgLSAzMC8zLzIwMDEgLSBKZWFuIElJCi0gKglvIFVwZGF0ZSB0byBXaXJlbGVzcyAxMSAtPiBhZGQgcmV0cnkgbGltaXQvbGlmZXRpbWUgc3VwcG9ydAotICoJbyBUZXN0ZWQgd2l0aCBhIEQtTGluayBEV0wgNjUwIGNhcmQsIGZpbGwgaW4gZmlybXdhcmUgc3VwcG9ydAotICoJbyBXYXJuaW5nIG9uIFZjYyBtaXNtYXRjaCAoRC1MaW5rIDMuM3YgY2FyZCBpbiBMdWNlbnQgNXYgb25seSBzbG90KQotICoJbyBGaXhlZCB0aGUgUHJpc20yIFdFUCBidWdzIHRoYXQgSSBpbnRyb2R1Y2VkIGluIHYwLjAzIDotKAotICoJICBJdCB3b3JrcyBvbiBELUxpbmsgKm9ubHkqIGFmdGVyIGEgdGNwZHVtcC4gV2VpcmQuLi4KLSAqCSAgQW5kIHN0aWxsIGRvZXNuJ3Qgd29yayBvbiBJbnRlbCBjYXJkLiBHcnJyci4uLgotICoJbyBVcGRhdGUgdGhlIG1vZGUgYWZ0ZXIgYSBzZXRwb3J0MwotICoJbyBBZGQgcHJlYW1ibGUgc2V0dGluZyBmb3IgU3ltYm9sIGNhcmRzIChub3QgeWV0IGVuYWJsZWQpCi0gKglvIERvbid0IGNvbXBsYWluIGFzIG11Y2ggYWJvdXQgU3ltYm9sIGNhcmRzLi4uCi0gKgotICogdjAuMDQgLT4gdjAuMDRiIC0gMjIvNC8yMDAxIC0gRGF2aWQgR2lic29uCi0gKiAgICAgIG8gUmVtb3ZlZCB0aGUgJ2V0aCcgcGFyYW1ldGVyIC0gYWx3YXlzIHVzZSBldGhYWCBhcyB0aGUKLSAqICAgICAgICBpbnRlcmZhY2UgbmFtZSBpbnN0ZWFkIG9mIGRsZHdkWFguICBUaGUgb3RoZXIgd2FzIHJhY3kKLSAqICAgICAgICBhbnl3YXkuCi0gKglvIENsZWFuIHVwIFJJRCBkZWZpbml0aW9ucyBpbiBoZXJtZXMuaCwgb3RoZXIgY2xlYW51cHMKLSAqCi0gKiB2MC4wNGIgLT4gdjAuMDRjIC0gMjQvNC8yMDAxIC0gSmVhbiBJSQotICoJbyBUaW0gSHVybGV5IDx0aW1zdGVyIEFUIHNlaWtpLmJsaXp0ZWNoLmNvbT4gcmVwb3J0ZWQgYSBELUxpbmsgY2FyZAotICoJICB3aXRoIHZlbmRvciAwMiBhbmQgZmlybXdhcmUgMC4wOC4gQWRkZWQgaW4gdGhlIGNhcGFiaWxpdGllcy4uLgotICoJbyBUZXN0ZWQgTHVjZW50IGZpcm13YXJlIDcuMjgsIGV2ZXJ5dGhpbmcgd29ya3MuLi4KLSAqCi0gKiB2MC4wNGMgLT4gdjAuMDUgLSAzLzUvMjAwMSAtIEJlbmphbWluIEhlcnJlbnNjaG1pZHQKLSAqCW8gU3Bpbi1vZmYgUGNtY2lhIGNvZGUuIFRoaXMgZmlsZSBpcyByZW5hbWVkIG9yaW5vY28uYywKLSAqCSAgYW5kIG9yaW5vY29fY3MuYyBub3cgY29udGFpbnMgb25seSB0aGUgUGNtY2lhIHNwZWNpZmljIHN0dWZmCi0gKglvIEFkZCBBaXJwb3J0IGRyaXZlciBzdXBwb3J0IG9uIHRvcCBvZiBvcmlub2NvLmMgKHNlZSBhaXJwb3J0LmMpCi0gKgotICogdjAuMDUgLT4gdjAuMDVhIC0gNC81LzIwMDEgLSBKZWFuIElJCi0gKglvIFJldmVydCB0byBvbGQgUGNtY2lhIGNvZGUgdG8gZml4IGJyZWFrYWdlIG9mIEJlbidzIGNoYW5nZXMuLi4KLSAqCi0gKiB2MC4wNWEgLT4gdjAuMDViIC0gNC81LzIwMDEgLSBKZWFuIElJCi0gKglvIGFkZCBtb2R1bGUgcGFyYW1ldGVyICdpZ25vcmVfY2lzX3ZjYycgZm9yIEQtTGluayBAIDVWCi0gKglvIEQtTGluayBmaXJtd2FyZSBkb2Vzbid0IHN1cHBvcnQgbXVsdGljYXN0LiBXZSBqdXN0IHByaW50IGEgZmV3Ci0gKgkgIGVycm9yIG1lc3NhZ2VzLCBidXQgb3RoZXJ3aXNlIGV2ZXJ5dGhpbmcgd29ya3MuLi4KLSAqCW8gRm9yIERhdmlkIDogc2V0L2dldHBvcnQzIHdvcmtzIGZpbmUsIGp1c3QgdXBncmFkZSBpd3ByaXYuLi4KLSAqCi0gKiB2MC4wNWIgLT4gdjAuMDVjIC0gNS81LzIwMDEgLSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0Ci0gKglvIEFkYXB0IGFpcnBvcnQuYyB0byBsYXRlc3QgY2hhbmdlcyBpbiBvcmlub2NvLmMKLSAqCW8gUmVtb3ZlIGRlZmVycmVkIHBvd2VyIGVuYWJsaW5nIGNvZGUKLSAqCi0gKiB2MC4wNWMgLT4gdjAuMDVkIC0gNS81LzIwMDEgLSBKZWFuIElJCi0gKglvIFdvcmthcm91bmQgdG8gU05BUCBkZWNhcHN1bGF0ZSBmcmFtZSBmcm9tIExpbmtzeXMgQVAKLSAqCSAgb3JpZ2luYWwgcGF0Y2ggZnJvbSA6IERvbmcgTGl1IDxkbGl1IEFUIHJlc2VhcmNoLmJlbGwtbGFicy5jb20+Ci0gKgkgIChub3RlIDogdGhlIG1lbWNtcCBidWcgd2FzIG1pbmUgLSBmaXhlZCkKLSAqCW8gUmVtb3ZlIHNldF9yZXRyeSBzdHVmZiwgbm8gZmlybXdhcmUgc3VwcG9ydCBpdCAoYmxvYXQtLSkuCi0gKgotICogdjAuMDVkIC0+IHYwLjA2IC0gMjUvNS8yMDAxIC0gSmVhbiBJSQotICoJCU9yaWdpbmFsIHBhdGNoIGZyb20gIkhvbmcgTGluIiA8YWxpbiBBVCByZWRoYXQuY29tPiwKLSAqCQkiSWFuIEtpbm5lciIgPGlraW5uZXIgQVQgcmVkaGF0LmNvbT4KLSAqCQlhbmQgIkRhdmlkIFNtaXRoIiA8ZHNtaXRoIEFUIHJlZGhhdC5jb20+Ci0gKglvIEluaXQgb2YgcHJpdi0+dHhfcmF0ZV9jdHJsIGluIGZpcm13YXJlIHNwZWNpZmljIHNlY3Rpb24uCi0gKglvIFByaXNtMi9TeW1ib2wgcmF0ZSwgdXB0byBzaG91bGQgYmUgMHhGIGFuZCBub3QgMHgxNS4gRG9oICEKLSAqCW8gU3BlY3RydW0gY2FyZCBhbHdheXMgbmVlZCBjb3JfcmVzZXQgKGZvciBldmVyeSByZXNldCkKLSAqCW8gRml4IGNvcl9yZXNldCB0byBub3QgbG9zZSBiaXQgNyBpbiB0aGUgcmVnaXN0ZXIKLSAqCW8gZmx1c2hfc3RhbGVfbGlua3MgdG8gcmVtb3ZlIHpvbWJpZSBQY21jaWEgaW5zdGFuY2VzCi0gKglvIEFjayBwcmV2aW91cyBoZXJtZXMgZXZlbnQgYmVmb3JlIHJlc2V0Ci0gKgkJTWUgKHdpdGggbXkgbGl0dGxlIGhhbmRzKQotICoJbyBBbGxvdyBvcmlub2NvLmMgdG8gY2FsbCBjb3JfcmVzZXQgdmlhIHByaXYtPmNhcmRfcmVzZXRfaGFuZGxlcgotICoJbyBBZGQgcHJpdi0+bmVlZF9jYXJkX3Jlc2V0IHRvIHRvZ2dsZSB0aGlzIGZlYXR1cmUKLSAqCW8gRml4IHZhcmlvdXMgYnVnbGV0cyB3aGVuIHNldHRpbmcgV0VQIGluIFN5bWJvbCBmaXJtd2FyZQotICoJICBOb3csIGVuY3J5cHRpb24gaXMgZnVsbHkgZnVuY3Rpb25hbCBvbiBTeW1ib2wgY2FyZHMuIFlvdXBpICEKLSAqCi0gKiB2MC4wNiAtPiB2MC4wNmIgLSAyNS81LzIwMDEgLSBKZWFuIElJCi0gKglvIElCU1Mgb24gU3ltYm9sIHVzZSBwb3J0X21vZGUgPSA0LiBQbGVhc2UgZG9uJ3QgYXNrLi4uCi0gKgotICogdjAuMDZiIC0+IHYwLjA2YyAtIDI5LzUvMjAwMSAtIEplYW4gSUkKLSAqCW8gU2hvdyBmaXJzdCBzcHkgYWRkcmVzcyBpbiAvcHJvYy9uZXQvd2lyZWxlc3MgZm9yIElCU1MgbW9kZSBhcyB3ZWxsCi0gKgotICogdjAuMDZjIC0+IHYwLjA2ZCAtIDYvNy8yMDAxIC0gRGF2aWQgR2lic29uCi0gKiAgICAgIG8gQ2hhbmdlIGEgYnVuY2ggb2YgS0VSTl9JTkZPIG1lc3NhZ2VzIHRvIEtFUk5fREVCVUcsIGFzIHBlciBMaW51cycKLSAqICAgICAgICB3aXNoZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCi0gKglvIFJlbW92ZWQgYm9ndXMgbWVzc2FnZSBvbiBDUkMgZXJyb3IuCi0gKglvIE1lcmdlZCBmaXhlcyBmb3IgdjAuMDggUHJpc20gMiBmaXJtd2FyZSBmcm9tIFdpbGxpYW0gV2FnaG9ybgotICoJICA8d2lsbHdhZ2hvcm4gQVQgeWFob28uY28udWs+Ci0gKglvIFNsaWdodCBjbGVhbnVwL3JlLWFycmFuZ2VtZW50IG9mIGZpcm13YXJlIGRldGVjdGlvbiBjb2RlLgotICoKLSAqIHYwLjA2ZCAtPiB2MC4wNmUgLSAxLzgvMjAwMSAtIERhdmlkIEdpYnNvbgotICoJbyBSZW1vdmVkIHNvbWUgcmVkdW5kYW50IGdsb2JhbCBpbml0aWFsaXplcnMgKG9yaW5vY29fY3MuYykuCi0gKglvIEFkZGVkIHNvbWUgbW9kdWxlIG1ldGFkYXRhCi0gKgotICogdjAuMDZlIC0+IHYwLjA2ZiAtIDE0LzgvMjAwMSAtIERhdmlkIEdpYnNvbgotICoJbyBXb3JkaW5nIGZpeCB0byBsaWNlbnNlCi0gKglvIEFkZGVkIGEgJ3VzZV9hbHRlcm5hdGVfZW5jYXBzJyBtb2R1bGUgcGFyYW1ldGVyIGZvciBBUHMgd2hpY2ggbmVlZCBhbgotICoJICBvdWkgb2YgMDA6MDA6MDAuICBXZSByZWFsbHkgbmVlZCBhIGJldHRlciB3YXkgb2YgaGFuZGxpbmcgdGhpcywgYnV0Ci0gKgkgIHRoZSBtb2R1bGUgZmxhZyBpcyBiZXR0ZXIgdGhhbiBub3RoaW5nIGZvciBub3cuCi0gKgotICogdjAuMDZmIC0+IHYwLjA3IC0gMjAvOC8yMDAxIC0gRGF2aWQgR2lic29uCi0gKglvIFJlbW92ZWQgQkFQIGVycm9yIHJldHJpZXMgZnJvbSBoZXJtZXNfYmFwX3NlZWsoKS4gIEZvciBUeCB3ZSBub3cKLSAqCSAgbGV0IHRoZSB1cHBlciBsYXllcnMgaGFuZGxlIHRoZSByZXRyeSwgd2UgcmV0cnkgZXhwbGljaXRseSBpbiB0aGUKLSAqCSAgUnggcGF0aCwgYnV0IGRvbid0IG1ha2UgYXMgbXVjaCBub2lzZSBhYm91dCBpdC4KLSAqCW8gRmlybXdhcmUgZGV0ZWN0aW9uIGNsZWFudXBzLgotICoKLSAqIHYwLjA3IC0+IHYwLjA3YSAtIDEvMTAvMzAwMSAtIEplYW4gSUkKLSAqCW8gQWRkIGNvZGUgdG8gcmVhZCBTeW1ib2wgZmlybXdhcmUgcmV2aXNpb24sIGluc3BpcmVkIGJ5IGxhdGVzdCBjb2RlCi0gKgkgIGluIFNwZWN0cnVtMjQgYnkgTGVlIEpvaG4gS2V5c2VyLUFsbGVuIC0gVGhhbmtzIExlZSAhCi0gKglvIFRoYW5rcyB0byBKYXJlZCBWYWxlbnRpbmUgPGhpZGRlbiBBVCB4bWlzc2lvbi5jb20+IGZvciAicHJvdmlkaW5nIiBtZQotICoJICBhIDNDb20gY2FyZCB3aXRoIGEgcmVjZW50IGZpcm13YXJlLCBmaWxsIG91dCBTeW1ib2wgZmlybXdhcmUKLSAqCSAgY2FwYWJpbGl0aWVzIG9mIGxhdGVzdCByZXYgKDIuMjApLCBhcyB3ZWxsIGFzIG9sZGVyIFN5bWJvbCBjYXJkcy4KLSAqCW8gRGlzYWJsZSBQb3dlciBNYW5hZ2VtZW50IGluIG5ld2VyIFN5bWJvbCBmaXJtd2FyZSwgdGhlIEFQSSAKLSAqCSAgaGFzIGNoYW5nZWQgKGRvY3VtZW50YXRpb24gbmVlZGVkKS4KLSAqCi0gKiB2MC4wN2EgLT4gdjAuMDggLSAzLzEwLzIwMDEgLSBEYXZpZCBHaWJzb24KLSAqCW8gRml4ZWQgYSBwb3NzaWJsZSBidWZmZXIgb3ZlcnJ1biBmb3VuZCBieSB0aGUgU3RhbmZvcmQgY2hlY2tlciAoaW4KLSAqCSAgZGxkd2RfaW9jdGxfc2V0aXdlbmNvZGUoKSkuICBDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbnl3YXksIHNvIG5vdAotICoJICBhIGJpZyBwcm9ibGVtLgotICoJbyBUdXJuZWQgaGFzX2JpZ193ZXAgb24gZm9yIEludGVyc2lsIGNhcmRzLiAgVGhhdCdzIG5vdCB0cnVlIGZvciBhbGwgb2YKLSAqCSAgdGhlbSBidXQgd2Ugc2hvdWxkIGF0IGxlYXN0IGxldCB0aGUgY2FwYWJsZSBvbmVzIHRyeS4KLSAqCW8gV2FpdCBmb3IgQlVTWSB0byBjbGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGhlcm1lc19iYXBfc2VlaygpLiAgSQotICoJICByZWFsaXplZCB0aGF0IG15IGFzc3VtcHRpb24gdGhhdCB0aGUgZHJpdmVyJ3Mgc2VyaWFsaXphdGlvbgotICoJICB3b3VsZCBwcmV2ZW50IHRoZSBCQVAgYmVpbmcgYnVzeSBvbiBlbnRyeSB3YXMgcG9zc2libHkgZmFsc2UsIGJlY2F1c2UKLSAqCSAgdGhpbmdzIG90aGVyIHRoYW4gc2Vla3MgbWF5IG1ha2UgdGhlIEJBUCBidXN5LgotICoJbyBVc2UgImFsdGVybmF0ZSIgKG91aSAwMDowMDowMCkgZW5jYXBzdWxhdGlvbiBieSBkZWZhdWx0LgotICoJICBTZXR0aW5nIHVzZV9vbGRfZW5jYXBzIHdpbGwgbWltaWMgdGhlIG9sZCBiZWhhdmlvdXIsIGJ1dCBJIHRoaW5rIHdlCi0gKgkgIHdpbGwgYmUgYWJsZSB0byBlbGltaW5hdGUgdGhpcy4KLSAqCW8gRG9uJ3QgdHJ5IHRvIG1ha2UgX19pbml0ZGF0YSBjb25zdCAodGhlIHZlcnNpb24gc3RyaW5nKS4gIFRoaXMgY2FuJ3QKLSAqCSAgd29yayBiZWNhdXNlIG9mIHRoZSB3YXkgdGhlIF9faW5pdGRhdGEgc2VjdGlvbmluZyB3b3Jrcy4KLSAqCW8gQWRkZWQgTU9EVUxFX0xJQ0VOU0UgdGFncy4KLSAqCW8gU3VwcG9ydCBmb3IgUExYICh0cmFuc3BhcmVudCBQQ01DSUEtPlBDSSBicmlkZ2UpIGNhcmRzLgotICoJbyBDaGFuZ2VkIHRvIHVzaW5nIHRoZSBuZXcgdHlwZS1mYXNjaXN0IG1pbi9tYXguCi0gKgotICogdjAuMDggLT4gdjAuMDhhIC0gOS8xMC8yMDAxIC0gRGF2aWQgR2lic29uCi0gKglvIEluc2VydGVkIHNvbWUgbWlzc2luZyBhY2tub3dsZWRnZW1lbnRzL2luZm8gaW50byB0aGUgQ2hhbmdlbG9nLgotICoJbyBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIG5vcm1hbGl6YXRpb24gb2Ygc2lnbmFsIGxldmVsIHJlcG9ydGluZy4KLSAqCW8gRml4ZWQgYmFkIGJ1ZyBpbiBXRVAga2V5IGhhbmRsaW5nIG9uIEludGVyc2lsIGFuZCBTeW1ib2wgZmlybXdhcmUsCi0gKgkgIHdoaWNoIGxlZCB0byBhbiBpbnN0YW50IGNyYXNoIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMuCi0gKgotICogdjAuMDhhIC0+IHYwLjA4YiAtIDIwLzExLzIwMDEgLSBEYXZpZCBHaWJzb24KLSAqCW8gTG90cyBvZiBjbGVhbnVwIGFuZCBidWdmaXhlcyBpbiBvcmlub2NvX3BseC5jCi0gKglvIENsZWFudXAgdG8gaGFuZGxpbmcgb2YgVHggcmF0ZSBzZXR0aW5nLgotICoJbyBSZW1vdmVkIHN1cHBvcnQgZm9yIG9sZCBlbmNhcHN1bGF0aW9uIG1ldGhvZC4KLSAqCW8gUmVtb3ZlZCBvbGQgImRsZHdkIiBuYW1lcy4KLSAqCW8gU3BsaXQgUklEIGNvbnN0YW50cyBpbnRvIGEgbmV3IGZpbGUgaGVybWVzX3JpZC5oCi0gKglvIFJlbmFtZWQgUklEIGNvbnN0YW50cyB0byBtYXRjaCBsaW51eC13bGFuLW5nIGFuZCBwcmlzbTIubwotICoJbyBCdWdmaXhlcyBpbiBoZXJtZXMuYwotICoJbyBQb2tlIHRoZSBQTFgncyBJTlRDU1IgcmVnaXN0ZXIsIHNvIGl0IGFjdHVhbGx5IHN0YXJ0cwotICoJICBnZW5lcmF0aW5nIGludGVycnVwdHMuICBUaGVzZSBjYXJkcyBtaWdodCBhY3R1YWxseSB3b3JrIG5vdy4KLSAqCW8gVXBkYXRlIHRvIHdpcmVsZXNzIGV4dGVuc2lvbnMgdjEyIChKZWFuIElJKQotICoJbyBTdXBwb3J0IGZvciB0YWxsaWVzIGFuZCBpbnF1aXJlIGNvbW1hbmQgKEplYW4gSUkpCi0gKglvIEFpcnBvcnQgdXBkYXRlcyBmb3IgbmV3ZXIgUFBDIGtlcm5lbHMgKEJlbkgpCi0gKgotICogdjAuMDhiIC0+IHYwLjA5IC0gMjEvMTIvMjAwMSAtIERhdmlkIEdpYnNvbgotICoJbyBTb21lIG5ldyBQQ0kgSURzIGZvciBQTFggY2FyZHMuCi0gKglvIFJlbW92ZWQgYnJva2VuIGF0dGVtcHQgdG8gZG8gQUxMTVVMVEkgcmVjZXB0aW9uLiAgSnVzdCB1c2UKLSAqCSAgcHJvbWlzY3VvdXMgbW9kZSBpbnN0ZWFkCi0gKglvIFByZWxpbWluYXJ5IHdvcmsgZm9yIGxpc3QtQVAgKEplYW4gSUkpCi0gKglvIEFpcnBvcnQgdXBkYXRlcyBmcm9tIChCZW5IKQotICoJbyBFbGltaW5hdGVkIHJhY3kgaHdfcmVhZHkgc3R1ZmYKLSAqCW8gRml4ZWQgZ2VuZXJhdGlvbiBvZiBmYWtlIGV2ZW50cyBpbiBpcnEgaGFuZGxlci4gIFRoaXMgc2hvdWxkCi0gKgkgIGZpbmFsbHkga2lsbCB0aGUgRUlPIHByb2JsZW1zIChKZWFuIElJICYgZGdpYnNvbikKLSAqCW8gRml4ZWQgYnJlYWthZ2Ugb2YgYml0cmF0ZSBzZXQvZ2V0IG9uIEFnZXJlIGZpcm13YXJlIChKZWFuIElJKQotICoKLSAqIHYwLjA5IC0+IHYwLjA5YSAtIDIvMS8yMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIEZpeGVkIHN0dXBpZCBtaXN0YWtlIGluIG11bHRpY2FzdCBsaXN0IGhhbmRsaW5nLCB0cmlnZ2VyaW5nCi0gKgkgIGEgQlVHKCkKLSAqCi0gKiB2MC4wOWEgLT4gdjAuMDliIC0gMTYvMS8yMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIEZpeGVkIGV2ZW4gc3R1cGlkZXIgbWlzdGFrZSBpbiBuZXcgaW50ZXJydXB0IGhhbmRsaW5nLCB3aGljaAotICoJICBzZXJpb3VzbHkgYnJva2UgdGhpbmdzIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMuCi0gKglvIFJlbW92ZWQgYSBidW5jaCBvZiByZWR1bmRhbnQgaW5jbHVkZXMgYW5kIGV4cG9ydHMuCi0gKglvIFJlbW92ZWQgYSByZWR1bmRhbnQgTU9EX3tJTkMsREVDfV9VU0VfQ09VTlQgcGFpciBpbiBhaXJwb3J0LmMKLSAqCW8gRG9uJ3QgYXR0ZW1wdCB0byBkbyBoYXJkd2FyZSBsZXZlbCBtdWx0aWNhc3QgcmVjZXB0aW9uIG9uCi0gKgkgIEludGVyc2lsIGZpcm13YXJlLCBqdXN0IGdvIHByb21pc2MgaW5zdGVhZC4KLSAqCW8gVHlwbyBmaXhlZCBpbiBoZXJtZXNfaXNzdWVfY21kKCkKLSAqCW8gRWxpbWluYXRlZCBXSVJFTEVTU19TUFkgI2lmZGVmcwotICoJbyBTdGF0dXMgY29kZSByZXBvcnRlZCBvbiBUeCBleGNlcHRpb25zCi0gKglvIE1vdmVkIG5ldGlmX3dha2VfcXVldWUoKSBmcm9tIEFMTE9DIGludGVycnVwdHMgdG8gVFggYW5kIFRYRVhDCi0gKgkgIGludGVycnVwdHMsIHdoaWNoIHNob3VsZCBmaXggdGhlIHRpbWVvdXRzIHdlJ3JlIHNlZWluZy4KLSAqCi0gKiB2MC4wOWIgLT4gdjAuMTAgLSAyNSBGZWIgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBSZW1vdmVkIG5lc3RlZCBzdHJ1Y3R1cmVzIHVzZWQgZm9yIGhlYWRlciBwYXJzaW5nLCBzbyB0aGUKLSAqCSAgZHJpdmVyIHNob3VsZCBub3cgd29yayB3aXRob3V0IGhhY2tlcnkgb24gQVJNCi0gKglvIEZpeCBmb3IgV0VQIGhhbmRsaW5nIG9uIEludGVyc2lsIChIYXdrIE5ld3RvbikKLSAqCW8gRWxpbWluYXRlZCB0aGUgL3Byb2MvaGVybWVzL2V0aFhYL3JlZ3MgZGVidWdnaW5nIGZpbGUuICBJdAotICoJICB3YXMgbmV2ZXIgdmVyeSB1c2VmdWwuCi0gKglvIE1ha2UgUnggZXJyb3JzIGxlc3Mgbm9pc3kuCi0gKgotICogdjAuMTAgLT4gdjAuMTEgLSA1IEFwciAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIExhaWQgdGhlIGdyb3VuZHdvcmsgaW4gaGVybWVzLltjaF0gZm9yIGRldmljZXMgd2hpY2ggbWFwCi0gKgkgIGludG8gUENJIG1lbW9yeSBzcGFjZSByYXRoZXIgdGhhbiBJTyBzcGFjZS4KLSAqCW8gRml4ZWQgYnVnIGluIG11bHRpY2FzdCBoYW5kbGluZyAoY2xlYXJlZCBtdWx0aWNhc3QgbGlzdCB3aGVuCi0gKgkgIGxlYXZpbmcgcHJvbWlzY3VvdXMgbW9kZSkuCi0gKglvIFJlbGVnYXRlZCBUeCBlcnJvciBtZXNzYWdlcyB0byBkZWJ1Zy4KLSAqCW8gQ2xlYW5lZCB1cCAvIGNvcnJlY3RlZCBoYW5kbGluZyBvZiBhbGxvY2F0aW9uIGxlbmd0aHMuCi0gKglvIFNldCBPV05TU0lEIGluIElCU1MgbW9kZSBmb3IgV2luWFAgaW50ZXJvcGVyYWJpbGl0eSAoamltYykuCi0gKglvIENoYW5nZSB0byB1c2luZyBhbGxvY19ldGhlcmRldigpIGZvciBzdHJ1Y3R1cmUgYWxsb2NhdGlvbnMuIAotICoJbyBDaGVjayBmb3IgYW5kIGRyb3AgdW5kZXJzaXplZCBwYWNrZXRzLgotICoJbyBGaXhlZCBhIHJhY2UgaW4gc3RvcHBpbmcvd2FraW5nIHRoZSBxdWV1ZS4gIFRoaXMgc2hvdWxkIGZpeAotICoJICB0aGUgdGltZW91dCBwcm9ibGVtcyAoUGF2ZWwgUm9za2luKQotICoJbyBSZXZlcnRlZCB0byBuZXRpZl93YWtlX3F1ZXVlKCkgb24gdGhlIEFMTE9DIGV2ZW50LgotICoJbyBGaXhlcyBmb3IgcmVjZW50IFN5bWJvbCBmaXJtd2FyZXMgd2hpY2ggbGFjayBBUCBkZW5zaXR5Ci0gKgkgIChQYXZlbCBSb3NraW4pLgotICoKLSAqIHYwLjExIC0+IHYwLjExYSAtIDI5IEFwciAyMDAyIC0gRGF2aWQgR2lic29uCi0gKglvIEhhbmRsZSBkaWZmZXJlbnQgcmVnaXN0ZXIgc3BhY2luZywgbmVjZXNzYXJ5IGZvciBQcmlzbSAyLjUKLSAqCSAgUENJIGFkYXB0b3JzIChTdGV2ZSBIaWxsKS4KLSAqCW8gQ2xlYW5lZCB1cCBpbml0aWFsaXphdGlvbiBvZiBjYXJkIHN0cnVjdHVyZXMgaW4gb3Jpbm9jb19jcwotICoJICBhbmQgYWlycG9ydC4gIFJlbW92ZWQgY2FyZC0+cHJpdiBmaWVsZC4KLSAqCW8gTWFrZSByZXNwb25zZSBzdHJ1Y3R1cmUgb3B0aW9uYWwgZm9yIGhlcm1lc19kb2NtZF93YWl0KCkKLSAqCSAgUGF2ZWwgUm9za2luKQotICoJbyBBZGRlZCBQQ0kgaWQgZm9yIE5vcnRlbCBlbW9iaWxpdHkgdG8gb3Jpbm9jb19wbHguYy4KLSAqCW8gQ2xlYW51cCB0byBoYW5kbGluZyBvZiBTeW1ib2wncyBhbGxvY2F0aW9uIGJ1Zy4gKFBhdmVsIFJvc2tpbikKLSAqCW8gQ2xlYW51cHMgdG8gZmlybXdhcmUgY2FwYWJpbGl0eSBkZXRlY3Rpb24uCi0gKglvIEFycmFuZ2UgZm9yIG9yaW5vY29fcGNpLmMgdG8gb3ZlcnJpZGUgZmlybXdhcmUgZGV0ZWN0aW9uLgotICoJICBXZSBzaG91bGQgYmUgYWJsZSB0byBzdXBwb3J0IHRoZSBQQ0kgSW50ZXJzaWwgY2FyZHMgbm93LgotICoJbyBDbGVhbnVwIGhhbmRsaW5nIG9mIHJlc2V0X2NvciBhbmQgaGFyZF9yZXNldCAoUGF2ZWwgUm9za2luKS4KLSAqCW8gUmVtb3ZlIGVycm9uZW91cyB1c2Ugb2YgVVNFUl9CQVAgaW4gdGhlIFR4RXhjIGhhbmRsZXIgKEpvdW5pCi0gKgkgIE1hbGluZW4pLgotICoJbyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBiZXR0ZXIgaW50ZWdyYXRpb24gaW50byBEYXZpZCBIaW5kcwotICoJICBwY21jaWEtY3MgcGFja2FnZS4KLSAqCi0gKiB2MC4xMWEgLT4gdjAuMTFiIC0gMSBNYXkgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluIG9yaW5vY29fcGx4X2luaXRfb25lKCkKLSAqCW8gRml4ZWQgbXVsdGlwbGUgYmFkIGtmcmVlKCkgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZQotICoJICBhbGxvY19vcmlub2NvZGV2KCkgY2hhbmdlcy4KLSAqCi0gKiB2MC4xMWIgLT4gdjAuMTIgLSAxOSBKdW4gMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBTdXBwb3J0IGNoYW5naW5nIHRoZSBNQUMgYWRkcmVzcy4KLSAqCW8gQ29ycmVjdCBkaXNwbGF5IG9mIEludGVyc2lsIGZpcm13YXJlIHJldmlzaW9uIG51bWJlcnMuCi0gKglvIEVudGlyZWx5IHJldmlzZWQgbG9ja2luZyBzY2hlbWUuICBTaG91bGQgYmUgYm90aCBzaW1wbGVyIGFuZAotICoJICAgYmV0dGVyLgotICoJbyBNZXJnZWQgc29tZSBjb21tb24gY29kZSBpbiBvcmlub2NvX3BseCwgb3Jpbm9jb19wY2kgYW5kCi0gKgkgIGFpcnBvcnQgYnkgY3JlYXRpbmcgb3Jpbm9jb19kZWZhdWx0X3tvcGVuLHN0b3AscmVzZXR9KCkKLSAqCSAgd2hpY2ggYXJlIHVzZWQgYXMgdGhlIGRldi0+b3BlbiwgZGV2LT5zdG9wLCBwcml2LT5yZXNldAotICoJICBjYWxsYmFja3MgaWYgbm9uZSBhcmUgc3BlY2lmaWVkIHdoZW4gYWxsb2Nfb3Jpbm9jb2RldigpIGlzCi0gKgkgIGNhbGxlZC4KLSAqCW8gUmVtb3ZlZCBvcmlub2NvX3BseF9pbnRlcnJ1cHQoKSBhbmQgb3Jpbm9jb19wY2lfaW50ZXJydXB0KCkuCi0gKgkgIFRoZXkgZGlkbid0IGRvIGFueXRoaW5nLgotICoKLSAqIHYwLjEyIC0+IHYwLjEyYSAtIDQgSnVsIDIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gU29tZSByZWFycmFuZ2VtZW50IG9mIGNvZGUuCi0gKglvIE51bWVyb3VzIGZpeHVwcyB0byBsb2NraW5nIGFuZCByZXN0IGhhbmRsaW5nLCBwYXJ0aWN1bGFybHkKLSAqCSAgZm9yIFBDTUNJQS4KLSAqCW8gVGhpcyBhbGxvd3Mgb3BlbiBhbmQgc3RvcCBuZXRfZGV2aWNlIG1ldGhvZHMgdG8gYmUgaW4KLSAqCSAgb3Jpbm9jby5jIG5vdywgcmF0aGVyIHRoYW4gaW4gdGhlIGluaXQgbW9kdWxlcy4KLSAqCW8gSW4gb3Jpbm9jb19jcy5jIGxpbmstPnByaXYgbm93IHBvaW50cyB0byB0aGUgc3RydWN0Ci0gKgkgIG5ldF9kZXZpY2Ugbm90IHRvIHRoZSBzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlLgotICoJbyBBZGRlZCBhIGNoZWNrIGZvciB1bmRlcnNpemVkIFNOQVAgZnJhbWVzLCB3aGljaCBjb3VsZCBjYXVzZQotICoJICBjcmFzaGVzLgotICoKLSAqIHYwLjEyYSAtPiB2MC4xMmIgLSAxMSBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBGaXggaHctPm51bV9pbml0IHRlc3RpbmcgY29kZSwgc28gbnVtX2luaXQgaXMgYWN0dWFsbHkKLSAqCSAgaW5jcmVtZW50ZWQuCi0gKglvIEZpeCB2ZXJ5IHN0dXBpZCBidWcgaW4gb3Jpbm9jb19jcyB3aGljaCBicm9rZSBjb21waWxlIHdpdGgKLSAqCSAgQ09ORklHX1NNUC4KLSAqCW8gU3F1YXNoZWQgYSB3YXJuaW5nLgotICoKLSAqIHYwLjEyYiAtPiB2MC4xMmMgLSAyNiBKdWwgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBDaGFuZ2UgdG8gQzlYIHN0eWxlIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLgotICoJbyBBZGQgc3VwcG9ydCBmb3IgM0NvbSBBaXJDb25uZWN0IFBDSS4KLSAqCW8gTm8gbG9uZ2VyIGlnbm9yZSB0aGUgaGFyZF9yZXNldCBhcmd1bWVudCB0bwotICoJICBhbGxvY19vcmlub2NvZGV2KCkuICBPb3BzLgotICoKLSAqIHYwLjEyYyAtPiB2MC4xM2JldGExIC0gMTMgU2VwIDIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gUmV2ZXJ0IHRoZSBicm9rZW4gMC4xMiogbG9ja2luZyBzY2hlbWUgYW5kIGdvIHRvIGEgbmV3IHlldAotICoJICBzaW1wbGVyIHNjaGVtZS4KLSAqCW8gRG8gZmlybXdhcmUgcmVzZXRzIG9ubHkgaW4gb3Jpbm9jb19pbml0KCkgYW5kIHdoZW4gd2FraW5nCi0gKgkgIHRoZSBjYXJkIGZyb20gaGFyZCBzbGVlcC4KLSAqCi0gKiB2MC4xM2JldGExIC0+IHYwLjEzIC0gMjcgU2VwIDIwMDIgLSBEYXZpZCBHaWJzb24KLSAqCW8gUmUtaW50cm9kdWNlZCBmdWxsIHJlc2V0cyAodmlhIHNjaGVkdWxlX3Rhc2soKSkgb24gVHgKLSAqCSAgdGltZW91dC4KLSAqCi0gKiB2MC4xMyAtPiB2MC4xM2EgLSAzMCBTZXAgMjAwMiAtIERhdmlkIEdpYnNvbgotICoJbyBNaW5vciBjbGVhbnVwcyB0byBpbmZvIGZyYW1lIGhhbmRsaW5nLiAgQWRkIGJhc2ljIHN1cHBvcnQKLSAqCSAgZm9yIGxpbmtzdGF0dXMgaW5mbyBmcmFtZXMuCi0gKglvIEluY2x1ZGUgcmVxdWlyZWQga2VybmVsIGhlYWRlcnMgaW4gb3Jpbm9jby5oLCB0byBhdm9pZAotICoJICBjb21waWxlIHByb2JsZW1zLgotICoKLSAqIHYwLjEzYSAtPiB2MC4xM2IgLSAxMCBGZWIgMjAwMyAtIERhdmlkIEdpYnNvbgotICoJbyBJbXBsZW1lbnRlZCBoYXJkIHJlc2V0IGZvciBBaXJwb3J0IGNhcmRzCi0gKglvIEV4cGVyaW1lbnRhbCBzdXNwZW5kL3Jlc3VtZSBpbXBsZW1lbnRhdGlvbiBmb3Igb3Jpbm9jb19wY2kKLSAqCW8gQWJvbGlzaGVkIC9wcm9jIGRlYnVnZ2luZyBzdXBwb3J0LCByZXBsYWNlZCB3aXRoIGEgZGVidWdnaW5nCi0gKgkgIGl3cHJpdi4gIE5vdyBpdCdzIHVnbHkgYW5kIHNpbXBsZSBpbnN0ZWFkIG9mIHVnbHkgYW5kIGNvbXBsZXguCi0gKglvIEJ1Z2ZpeCBpbiBoZXJtZXMuYyBpZiB0aGUgZmlybXdhcmUgcmV0dXJuZWQgYSByZWNvcmQgbGVuZ3RoCi0gKgkgIG9mIDAsIHdlIGNvdWxkIGdvIGNsb2JiZXJpbmcgbWVtb3J5LgotICoJbyBCdWdmaXggaW4gb3Jpbm9jb19zdG9wKCkgLSBpdCB1c2VkIHRvIGZhaWwgaWYgaHdfdW5hdmFpbGFibGUKLSAqCSAgd2FzIHNldCwgd2hpY2ggd2FzIHVzdWFsbHkgdHJ1ZSBvbiBQQ01DSUEgaG90IHJlbW92ZXMuCi0gKiAJbyBUcmFjayBMSU5LU1RBVFVTIG1lc3NhZ2VzLCBzaWxlbnRseSBkcm9wIFR4IHBhY2tldHMgYmVmb3JlCi0gKiAJICB3ZSBhcmUgY29ubmVjdGVkIChhdm9pZHMgY29uZnVzaW5nIHRoZSBmaXJtd2FyZSksIGFuZCBvbmx5Ci0gKiAJICBnaXZlIExJTktTVEFUVVMgcHJpbnRrKClzIGlmIHRoZSBzdGF0dXMgaGFzIGNoYW5nZWQuCi0gKgotICogdjAuMTNiIC0+IHYwLjEzYyAtIDExIE1hciAyMDAzIC0gRGF2aWQgR2lic29uCi0gKglvIENsZWFudXA6IHVzZSBkZXYgaW5zdGVhZCBvZiBwcml2IGluIHZhcmlvdXMgcGxhY2VzLgotICoJbyBCdWcgZml4OiBEb24ndCBSZWxlYXNlQ29uZmlndXJhdGlvbiBvbiBSRVNFVF9QSFlTSUNBTCBldmVudAotICoJICBpZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgKGRyaXZlciBpbml0aWF0ZWQpIGhhcmQgcmVzZXQuCi0gKglvIEJ1ZyBmaXg6IEVUSF9aTEVOIGlzIHN1cHBvc2VkIHRvIGluY2x1ZGUgdGhlIGhlYWRlcgotICoJICAoRGlvbnlzdXMgQmxhemFraXMgJiBNYW5pc2ggS2FyaXIpCi0gKglvIENvbnZlcnQgdG8gdXNpbmcgd29ya3F1ZXVlcyBpbnN0ZWFkIG9mIHRhc2txdWV1ZXMgKGFuZAotICoJICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtYWNyb3MgZm9yIHByZSAyLjUuNDEga2VybmVscykuCi0gKglvIERyb3AgcmVkdW5kYW50IChJIHRoaW5rLi4uKSBNT0Rfe0lOQyxERUN9X1VTRV9DT1VOVCBpbgotICoJICBhaXJwb3J0LmMKLSAqCW8gTmV3IG9yaW5vY29fdG1kLmMgaW5pdCBtb2R1bGUgZnJvbSBKb2VyZyBEb3JjaGFpbiBmb3IKLSAqCSAgVE1ENzE2MCBiYXNlZCBQQ0kgdG8gUENNQ0lBIGJyaWRnZXMgKHNpbWlsYXIgdG8KLSAqCSAgb3Jpbm9jb19wbHguYykuCi0gKgotICogdjAuMTNjIC0+IHYwLjEzZCAtIDIyIEFwciAyMDAzIC0gRGF2aWQgR2lic29uCi0gKglvIE1ha2UgaHdfdW5hdmFpbGFibGUgYSBjb3VudGVyLCByYXRoZXIgdGhhbiBqdXN0IGEgZmxhZywgdGhpcwotICoJICBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgc29tZSByYWNlcyAoc3VjaCBhcyBhIGNhcmQgYmVpbmcKLSAqCSAgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlIG9mIG9yaW5vY29fcmVzZXQoKS4KLSAqCW8gUmVzdG9yZSBSZWxlYXNlL1JlcXVlc3RDb25maWd1cmF0aW9uIGluIHRoZSBQQ01DSUEgZXZlbnQgaGFuZGxlcgotICoJICB3aGVuIGRlYWxpbmcgd2l0aCBhIGRyaXZlciBpbml0aWF0ZWQgaGFyZCByZXNldC4gIFRoaXMgaXMKLSAqCSAgbmVjZXNzYXJ5IHRvIHByZXZlbnQgaGFuZ3MgZHVlIHRvIGEgc3B1cmlvdXMgaW50ZXJydXB0IHdoaWxlCi0gKgkgIHRoZSByZXNldCBpcyBpbiBwcm9ncmVzcy4KLSAqCW8gQ2xlYXIgdGhlIDgwMi4xMSBoZWFkZXIgd2hlbiB0cmFuc21pdHRpbmcsIGV2ZW4gdGhvdWdoIHdlCi0gKgkgIGRvbid0IHVzZSBpdC4gIFRoaXMgZml4ZXMgYSBsb25nIHN0YW5kaW5nIGJ1ZyBvbiBzb21lCi0gKgkgIGZpcm13YXJlcywgd2hpY2ggc2VlbSB0byBnZXQgY29uZnVzZWQgaWYgdGhhdCBpc24ndCBkb25lLgotICoJbyBCZSBsZXNzIGVhZ2VyIHRvIGRlLWVuY2Fwc3VsYXRlIFNOQVAgZnJhbWVzLCBvbmx5IGRvIHNvIGlmCi0gKgkgIHRoZSBPVUkgaXMgMDA6MDA6MDAgb3IgMDA6MDA6ZjgsIGxlYXZlIG90aGVycyBhbG9uZS4gIFRoZSBvbGQKLSAqCSAgYmVoYXZpb3VyIGJyb2tlIENEUCAoQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sKS4KLSAqCW8gVXNlIGRldiBpbnN0ZWFkIG9mIHByaXYgZm9yIGZyZWVfaXJxKCkgYXMgd2VsbCBhcwotICoJICByZXF1ZXN0X2lycSgpIChvb3BzKS4KLSAqCW8gQXR0ZW1wdCB0byByZXNldCByYXRoZXIgdGhhbiBnaXZpbmcgdXAgaWYgd2UgZ2V0IHRvbyBtYW55Ci0gKgkgIElSUXMuCi0gKglvIENoYW5nZWQgc2VtYW50aWNzIG9mIF9fb3Jpbm9jb19kb3duKCkgc28gaXQgY2FuIGJlIGNhbGxlZAotICoJICBzYWZlbHkgd2l0aCBod191bmF2YWlsYWJsZSBzZXQuICBJdCBhbHNvIG5vdyBjbGVhcnMgdGhlCi0gKgkgIGxpbmtzdGF0dXMgKHNpbmNlIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gcmVhc3NvY2lhdGUpLgotICoKLSAqIHYwLjEzZCAtPiB2MC4xM2UgLSAxMiBNYXkgMjAwMyAtIERhdmlkIEdpYnNvbgotICoJbyBTdXBwb3J0IGZvciBwb3N0LTIuNS42OCByZXR1cm4gdmFsdWVzIGZyb20gaXJxIGhhbmRsZXIuCi0gKglvIEZpeGVkIGJ1ZyB3aGVyZSB1bmRlcmxlbmd0aCBwYWNrZXRzIHdvdWxkIGJlIGRvdWJsZSBjb3VudGVkCi0gKgkgIGluIHRoZSByeF9kcm9wcGVkIHN0YXRpc3RpY3MuCi0gKglvIFByb3ZpZGVkIGEgbW9kdWxlIHBhcmFtZXRlciB0byBzdXBwcmVzcyBsaW5rc3RhdHVzIG1lc3NhZ2VzLgotICoKLSAqIHYwLjEzZSAtPiB2MC4xNGFscGhhMSAtIDMwIFNlcCAyMDAzIC0gRGF2aWQgR2lic29uCi0gKglvIFJlcGxhY2VkIHByaXYtPmNvbm5lY3RlZCBsb2dpYyB3aXRoIG5ldGlmX2NhcnJpZXJfb24vb2ZmKCkKLSAqCSAgY2FsbHMuCi0gKglvIFJlbW92ZSBoYXNfaWJzc19hbnkgYW5kIG5ldmVyIHNldCB0aGUgQ1JFQVRFSUJTUyBSSUQgd2hlbgotICoJICB0aGUgRVNTSUQgaXMgZW1wdHkuICBUb28gbWFueSBmaXJtd2FyZXMgYnJlYWsgaWYgd2UgZG8uCi0gKglvIDIuNiBtZXJnZXM6IFJlcGxhY2UgcGRldi0+c2xvdF9uYW1lIHdpdGggcGNpX25hbWUoKSwgcmVtb3ZlCi0gKgkgIF9fZGV2aW5pdGRhdGEgZnJvbSBQQ0kgSUQgdGFibGVzLCB1c2UgZnJlZV9uZXRkZXYoKS4KLSAqCW8gRW5hYmxlZCBzaGFyZWQta2V5IGF1dGhlbnRpY2F0aW9uIGZvciBBZ2VyZSBmaXJtd2FyZSAoZnJvbQotICoJICBSb2JlcnQgSi4gTW9vcmUgPFJvYmVydC5KLk1vb3JlIEFUIGFsbGFuYmFuay5jb20+Ci0gKglvIE1vdmUgbmV0aWZfd2FrZV9xdWV1ZSgpIChiYWNrKSB0byB0aGUgVHggY29tcGxldGlvbiBmcm9tIHRoZQotICoJICBBTExPQyBldmVudC4gIFRoaXMgc2VlbXMgdG8gcHJldmVudC9taXRpZ2F0ZSB0aGUgcm9sbGluZwotICoJICBlcnJvciAtMTEwIHByb2JsZW1zIGF0IGxlYXN0IG9uIHNvbWUgSW50ZXJzaWwgZmlybXdhcmVzLgotICoJICBUaGVvcmV0aWNhbGx5IHJlZHVjZXMgcGVyZm9ybWFuY2UsIGJ1dCBJIGNhbid0IG1lYXN1cmUgaXQuCi0gKgkgIFBhdGNoIGZyb20gQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2UgQVQgc2FtYmEub3JnPgotICoKLSAqIHYwLjE0YWxwaGExIC0+IHYwLjE0YWxwaGEyIC0gMjAgT2N0IDIwMDMgLSBEYXZpZCBHaWJzb24KLSAqCW8gQ29ycmVjdGx5IHR1cm4gb2ZmIHNoYXJlZC1rZXkgYXV0aGVudGljYXRpb24gd2hlbiByZXF1ZXN0ZWQKLSAqCSAgKGJ1Z2ZpeCBmcm9tIFJvYmVydCBKLiBNb29yZSkuCi0gKglvIENvcnJlY3QgYWlycG9ydCBzbGVlcCBpbnRlcmZhY2VzIGZvciBjdXJyZW50IDIuNiBrZXJuZWxzLgotICoJbyBBZGQgY29kZSBmb3Iga2V5IGNoYW5nZSB3aXRob3V0IGRpc2FibGluZy9lbmFibGluZyB0aGUgTUFDCi0gKgkgIHBvcnQuICBUaGlzIGlzIHN1cHBvc2VkIHRvIGFsbG93IDgwMi4xeCB0byB3b3JrIHNhbmVseSwgYnV0Ci0gKgkgIGRvZXNuJ3Qgc2VlbSB0byB5ZXQuCi0gKgogICogVE9ETwotICoJbyBOZXcgd2lyZWxlc3MgZXh0ZW5zaW9ucyBBUEkgKHBhdGNoIGZyb20gTW91c3RhZmEKLSAqCSAgWW91c3NlZiwgdXBkYXRlZCBieSBKaW0gQ2FydGVyIGFuZCBQYXZlbCBSb3NraW4pLgogICoJbyBIYW5kbGUgZGUtZW5jYXBzdWxhdGlvbiB3aXRoaW4gbmV0d29yayBsYXllciwgcHJvdmlkZSA4MDIuMTEKICAqCSAgaGVhZGVycyAocGF0Y2ggZnJvbSBUaG9tYXMgJ0RlbnQnIE1pcmxhY2hlcikKLSAqCW8gUkYgbW9uaXRvciBtb2RlIHN1cHBvcnQKICAqCW8gRml4IHBvc3NpYmxlIHJhY2VzIGluIFNQWSBoYW5kbGluZy4KICAqCW8gRGlzY29ubmVjdCB3aXJlbGVzcyBleHRlbnNpb25zIGZyb20gZnVuZGFtZW50YWwgY29uZmlndXJhdGlvbi4KICAqCW8gKG1heWJlKSBTb2Z0d2FyZSBXRVAgc3VwcG9ydCAocGF0Y2ggZnJvbSBTdGFubyBNZWR1bmEpLgpAQCAtNDYyLDcgKzg5LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00OTYsNiArMTI2LDEwIEBACiBtb2R1bGVfcGFyYW0oaWdub3JlX2Rpc2Nvbm5lY3QsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9kaXNjb25uZWN0LCAiRG9uJ3QgcmVwb3J0IGxvc3QgbGluayB0byB0aGUgbmV0d29yayBsYXllciIpOwogCitzdGF0aWMgaW50IGZvcmNlX21vbml0b3I7IC8qID0gMCAqLworbW9kdWxlX3BhcmFtKGZvcmNlX21vbml0b3IsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX21vbml0b3IsICJBbGxvdyBtb25pdG9yIG1vZGUgZm9yIGFsbCBmaXJtd2FyZSB2ZXJzaW9ucyIpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBDb21waWxlIHRpbWUgY29uZmlndXJhdGlvbiBhbmQgY29tcGF0aWJpbGl0eSBzdHVmZiAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01MTEsNiArMTQ1LDEwIEBACiAvKiBJbnRlcm5hbCBjb25zdGFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qIDgwMi4yIExMQy9TTkFQIGhlYWRlciB1c2VkIGZvciBFdGhlcm5ldCBlbmNhcHN1bGF0aW9uIG92ZXIgODAyLjExICovCitzdGF0aWMgY29uc3QgdTggZW5jYXBzX2hkcltdID0gezB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDB9OworI2RlZmluZSBFTkNBUFNfT1ZFUkhFQUQJCShzaXplb2YoZW5jYXBzX2hkcikgKyAyKQorCiAjZGVmaW5lIE9SSU5PQ09fTUlOX01UVQkJMjU2CiAjZGVmaW5lIE9SSU5PQ09fTUFYX01UVQkJKElFRUU4MDJfMTFfREFUQV9MRU4gLSBFTkNBUFNfT1ZFUkhFQUQpCiAKQEAgLTUzNyw2ICsxNzUsMTEgQEAKIAkJCQkgfCBIRVJNRVNfRVZfV1RFUlIgfCBIRVJNRVNfRVZfSU5GTyBcCiAJCQkJIHwgSEVSTUVTX0VWX0lORkRST1AgKQogCisjZGVmaW5lIE1BWF9SSURfTEVOIDEwMjQKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBvcmlub2NvX2hhbmRsZXJfZGVmOworc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBvcmlub2NvX2V0aHRvb2xfb3BzOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEYXRhIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC01NzEsMjYgKzIxNCw0NSBAQAogLyogRGF0YSB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgaGVhZGVyX3N0cnVjdCB7Ci0JLyogODAyLjMgKi8KLQl1OCBkZXN0W0VUSF9BTEVOXTsKLQl1OCBzcmNbRVRIX0FMRU5dOwotCXUxNiBsZW47Ci0JLyogODAyLjIgKi8KKy8qIFVzZWQgaW4gRXZlbnQgaGFuZGxpbmcuCisgKiBXZSBhdm9pZCBuZXN0ZWQgc3RydWN0cmVzIGFzIHRoZXkgYnJlYWsgb24gQVJNIC0tIE1vdXN0YWZhICovCitzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3JfODAyXzExIHsKKwkvKiBoZXJtZXNfdHhfZGVzY3JpcHRvciAqLworCXUxNiBzdGF0dXM7CisJdTE2IHJlc2VydmVkMTsKKwl1MTYgcmVzZXJ2ZWQyOworCXUzMiBzd19zdXBwb3J0OworCXU4IHJldHJ5X2NvdW50OworCXU4IHR4X3JhdGU7CisJdTE2IHR4X2NvbnRyb2w7CisKKwkvKiBpZWVlODAyXzExX2hkciAqLworCXUxNiBmcmFtZV9jdGw7CisJdTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCXUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1MTYgZGF0YV9sZW47CisKKwkvKiBldGhoZHIgKi8KKwl1bnNpZ25lZCBjaGFyICAgaF9kZXN0W0VUSF9BTEVOXTsgICAgICAgLyogZGVzdGluYXRpb24gZXRoIGFkZHIgKi8KKwl1bnNpZ25lZCBjaGFyICAgaF9zb3VyY2VbRVRIX0FMRU5dOyAgICAgLyogc291cmNlIGV0aGVyIGFkZHIgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCAgaF9wcm90bzsgICAgICAgICAgICAgICAgLyogcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KKworCS8qIHA4MDIyX2hkciAqLwogCXU4IGRzYXA7CiAJdTggc3NhcDsKIAl1OCBjdHJsOwotCS8qIFNOQVAgKi8KIAl1OCBvdWlbM107CisKIAl1MTYgZXRoZXJ0eXBlOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLS8qIDgwMi4yIExMQy9TTkFQIGhlYWRlciB1c2VkIGZvciBFdGhlcm5ldCBlbmNhcHN1bGF0aW9uIG92ZXIgODAyLjExICovCi11OCBlbmNhcHNfaGRyW10gPSB7MHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLSNkZWZpbmUgRU5DQVBTX09WRVJIRUFECQkoc2l6ZW9mKGVuY2Fwc19oZHIpICsgMikKLQorLyogUnggZnJhbWUgaGVhZGVyIGV4Y2VwdCBjb21wYXRpYmlsaXR5IDgwMi4zIGhlYWRlciAqLwogc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yIHsKKwkvKiBDb250cm9sICovCiAJdTE2IHN0YXR1czsKIAl1MzIgdGltZTsKIAl1OCBzaWxlbmNlOwpAQCAtNTk4LDEzICsyNjAsMjQgQEAKIAl1OCByYXRlOwogCXU4IHJ4ZmxvdzsKIAl1MzIgcmVzZXJ2ZWQ7CisKKwkvKiA4MDIuMTEgaGVhZGVyICovCisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCisJLyogRGF0YSBsZW5ndGggKi8KKwl1MTYgZGF0YV9sZW47CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiBzdGF0aWMgaW50IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBzdGF0aWMgdm9pZCBfX29yaW5vY29fc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCkBAIC02MjgsNiArMzAxLDEwIEBACiAJCQlwcml2LT5jcmVhdGVpYnNzID0gMTsKIAkJfQogCQlicmVhazsKKwljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJcHJpdi0+cG9ydF90eXBlID0gMzsKKwkJcHJpdi0+Y3JlYXRlaWJzcyA9IDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgcHJpdi0+aXdfbW9kZSBpbiBzZXRfcG9ydF90eXBlKClcbiIsCiAJCSAgICAgICBwcml2LT5uZGV2LT5uYW1lKTsKQEAgLTgxNCw3ICs0OTEsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAoISBuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKKwlpZiAoISBuZXRpZl9jYXJyaWVyX29rKGRldikgfHwgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSkgewogCQkvKiBPb3BzLCB0aGUgZmlybXdhcmUgaGFzbid0IGVzdGFibGlzaGVkIGEgY29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBzaWxlbnRseSBkcm9wIHRoZSBwYWNrZXQgKHRoaXMgc2VlbXMgdG8gYmUgdGhlCiAgICAgICAgICAgICAgICAgICAgc2FmZXN0IGFwcHJvYWNoKS4gKi8KQEAgLTk1MSwyNiArNjI4LDU1IEBACiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwogCXUxNiBmaWQgPSBoZXJtZXNfcmVhZF9yZWduKGh3LCBUWENPTVBMRklEKTsKLQlzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3IgZGVzYzsKKwlzdHJ1Y3QgaGVybWVzX3R4X2Rlc2NyaXB0b3JfODAyXzExIGhkcjsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChmaWQgPT0gRFVNTVlfRklEKQogCQlyZXR1cm47IC8qIE5vdGhpbmcncyByZWFsbHkgaGFwcGVuZWQgKi8KIAotCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICZkZXNjLCBzaXplb2YoZGVzYyksIGZpZCwgMCk7CisJLyogUmVhZCB0aGUgZnJhbWUgaGVhZGVyICovCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmhkciwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhlcm1lc190eF9kZXNjcmlwdG9yKSArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyKSwKKwkJCSAgICAgICBmaWQsIDApOworCisJaGVybWVzX3dyaXRlX3JlZ24oaHcsIFRYQ09NUExGSUQsIERVTU1ZX0ZJRCk7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIHJlYWQgZGVzY3JpcHRvciBvbiBUeCBlcnJvciAiCiAJCSAgICAgICAiKEZJRD0lMDRYIGVycm9yICVkKVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgZmlkLCBlcnIpOwotCX0gZWxzZSB7Ci0JCURFQlVHKDEsICIlczogVHggZXJyb3IsIHN0YXR1cyAlZFxuIiwKLQkJICAgICAgZGV2LT5uYW1lLCBsZTE2X3RvX2NwdShkZXNjLnN0YXR1cykpOworCQlyZXR1cm47CiAJfQogCQotCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlERUJVRygxLCAiJXM6IFR4IGVycm9yLCBlcnIgJWQgKEZJRD0lMDRYKVxuIiwgZGV2LT5uYW1lLAorCSAgICAgIGVyciwgZmlkKTsKKyAgICAKKwkvKiBXZSBwcm9kdWNlIGEgVFhEUk9QIGV2ZW50IG9ubHkgZm9yIHJldHJ5IG9yIGxpZmV0aW1lCisJICogZXhjZWVkZWQsIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IHN0YXR1cyB0aGF0IHJlYWxseSBtZWFuCisJICogdGhhdCB0aGlzIHBhcnRpY3VsYXIgbm9kZSB3ZW50IGF3YXkuCisJICogT3RoZXIgZXJyb3JzIG1lYW5zIHRoYXQgKndlKiBzY3Jld2VkIHVwLiAtIEplYW4gSUkgKi8KKwloZHIuc3RhdHVzID0gbGUxNl90b19jcHUoaGRyLnN0YXR1cyk7CisJaWYgKGhkci5zdGF0dXMgJiAoSEVSTUVTX1RYU1RBVF9SRVRSWUVSUiB8IEhFUk1FU19UWFNUQVRfQUdFREVSUikpIHsKKwkJdW5pb24gaXdyZXFfZGF0YQl3cnF1OworCisJCS8qIENvcHkgODAyLjExIGRlc3QgYWRkcmVzcy4KKwkJICogV2UgdXNlIHRoZSA4MDIuMTEgaGVhZGVyIGJlY2F1c2UgdGhlIGZyYW1lIG1heQorCQkgKiBub3QgYmUgODAyLjMgb3IgbWF5IGJlIG1hbmdsZWQuLi4KKwkJICogSW4gQWQtSG9jIG1vZGUsIGl0IHdpbGwgYmUgdGhlIG5vZGUgYWRkcmVzcy4KKwkJICogSW4gbWFuYWdlZCBtb2RlLCBpdCB3aWxsIGJlIG1vc3QgbGlrZWx5IHRoZSBBUCBhZGRyCisJCSAqIFVzZXIgc3BhY2Ugd2lsbCBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGl0IHRvCisJCSAqIHdoYXRldmVyIGl0IG5lZWRzIChJUCBhZGRyZXNzIG9yIGVsc2UpLgorCQkgKiAtIEplYW4gSUkgKi8KKwkJbWVtY3B5KHdycXUuYWRkci5zYV9kYXRhLCBoZHIuYWRkcjEsIEVUSF9BTEVOKTsKKwkJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCQkvKiBTZW5kIGV2ZW50IHRvIHVzZXIgc3BhY2UgKi8KKwkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZUWERST1AsICZ3cnF1LCBOVUxMKTsKKwl9CiAKIAluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0JaGVybWVzX3dyaXRlX3JlZ24oaHcsIFRYQ09NUExGSUQsIERVTU1ZX0ZJRCk7CiB9CiAKIHN0YXRpYyB2b2lkIG9yaW5vY29fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTA0NywxOCArNzUzLDEyNyBAQAogCX0KIH0KIAorLyoKKyAqIG9yaW5vY29fcnhfbW9uaXRvciAtIGhhbmRsZSByZWNlaXZlZCBtb25pdG9yIGZyYW1lcy4KKyAqCisgKiBBcmd1bWVudHM6CisgKglkZXYJCW5ldHdvcmsgZGV2aWNlCisgKglyeGZpZAkJcmVjZWl2ZWQgRklECisgKglkZXNjCQlyeCBkZXNjcmlwdG9yIG9mIHRoZSBmcmFtZQorICoKKyAqIENhbGwgY29udGV4dDogaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkIG9yaW5vY29fcnhfbW9uaXRvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgcnhmaWQsCisJCQkgICAgICAgc3RydWN0IGhlcm1lc19yeF9kZXNjcmlwdG9yICpkZXNjKQoreworCXUzMiBoZHJsZW4gPSAzMDsJLyogcmV0dXJuIGZ1bGwgaGVhZGVyIGJ5IGRlZmF1bHQgKi8KKwl1MzIgZGF0YWxlbiA9IDA7CisJdTE2IGZjOworCWludCBlcnI7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CisKKwlsZW4gPSBsZTE2X3RvX2NwdShkZXNjLT5kYXRhX2xlbik7CisKKwkvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhlIGhlYWRlciBhbmQgdGhlIGRhdGEgKi8KKwlmYyA9IGxlMTZfdG9fY3B1KGRlc2MtPmZyYW1lX2N0bCk7CisJc3dpdGNoIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFKSB7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpCisJCSAgICAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKQorCQkJaGRybGVuID0gMzA7CisJCWVsc2UKKwkJCWhkcmxlbiA9IDI0OworCQlkYXRhbGVuID0gbGVuOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgorCQloZHJsZW4gPSAyNDsKKwkJZGF0YWxlbiA9IGxlbjsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfQ1RMOgorCQlzd2l0Y2ggKGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpIHsKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFNQT0xMOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9SVFM6CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NGRU5EOgorCQljYXNlIElFRUU4MDIxMV9TVFlQRV9DRkVOREFDSzoKKwkJCWhkcmxlbiA9IDE2OworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgorCQkJaGRybGVuID0gMTA7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIGZyYW1lIHR5cGUgKi8KKwkJYnJlYWs7CisJfQorCisJLyogc2FuaXR5IGNoZWNrIHRoZSBsZW5ndGggKi8KKwlpZiAoZGF0YWxlbiA+IElFRUU4MDIxMV9EQVRBX0xFTiArIDEyKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogb3ZlcnNpemVkIG1vbml0b3IgZnJhbWUsICIKKwkJICAgICAgICJkYXRhIGxlbmd0aCA9ICVkXG4iLCBkZXYtPm5hbWUsIGRhdGFsZW4pOworCQllcnIgPSAtRUlPOworCQlzdGF0cy0+cnhfbGVuZ3RoX2Vycm9ycysrOworCQlnb3RvIHVwZGF0ZV9zdGF0czsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGhkcmxlbiArIGRhdGFsZW4pOworCWlmICghc2tiKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW5ub3QgYWxsb2NhdGUgc2tiIGZvciBtb25pdG9yIGZyYW1lXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBkcm9wOworCX0KKworCS8qIENvcHkgdGhlIDgwMi4xMSBoZWFkZXIgdG8gdGhlIHNrYiAqLworCW1lbWNweShza2JfcHV0KHNrYiwgaGRybGVuKSwgJihkZXNjLT5mcmFtZV9jdGwpLCBoZHJsZW4pOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKworCS8qIElmIGFueSwgY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjYXJkIHRvIHRoZSBza2IgKi8KKwlpZiAoZGF0YWxlbiA+IDApIHsKKwkJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgc2tiX3B1dChza2IsIGRhdGFsZW4pLAorCQkJCSAgICAgICBBTElHTihkYXRhbGVuLCAyKSwgcnhmaWQsCisJCQkJICAgICAgIEhFUk1FU184MDJfMl9PRkZTRVQpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIG1vbml0b3IgZnJhbWVcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQkJZ290byBkcm9wOworCQl9CisJfQorCisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOworCXNrYi0+cHJvdG9jb2wgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMl8yKTsKKwkKKwlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJbmV0aWZfcngoc2tiKTsKKwlyZXR1cm47CisKKyBkcm9wOgorCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisgdXBkYXRlX3N0YXRzOgorCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwlzdGF0cy0+cnhfZHJvcHBlZCsrOworfQorCiBzdGF0aWMgdm9pZCBfX29yaW5vY29fZXZfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaGVybWVzX3QgKmh3KQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZwcml2LT5zdGF0czsKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnByaXYtPndzdGF0czsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQl1MTYgcnhmaWQsIHN0YXR1czsKLQlpbnQgbGVuZ3RoLCBkYXRhX2xlbiwgZGF0YV9vZmY7Ci0JY2hhciAqcDsKKwl1MTYgcnhmaWQsIHN0YXR1cywgZmM7CisJaW50IGxlbmd0aDsKIAlzdHJ1Y3QgaGVybWVzX3J4X2Rlc2NyaXB0b3IgZGVzYzsKLQlzdHJ1Y3QgaGVhZGVyX3N0cnVjdCBoZHI7Ci0Jc3RydWN0IGV0aGhkciAqZWg7CisJc3RydWN0IGV0aGhkciAqaGRyOwogCWludCBlcnI7CiAKIAlyeGZpZCA9IGhlcm1lc19yZWFkX3JlZ24oaHcsIFJYRklEKTsKQEAgLTEwNjgsNTMgKzg4Myw0NiBAQAogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBSeCBkZXNjcmlwdG9yLiAiCiAJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKLQkJc3RhdHMtPnJ4X2Vycm9ycysrOwotCQlnb3RvIGRyb3A7CisJCWdvdG8gdXBkYXRlX3N0YXRzOwogCX0KIAogCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGRlc2Muc3RhdHVzKTsKIAotCWlmIChzdGF0dXMgJiBIRVJNRVNfUlhTVEFUX0VSUikgewotCQlpZiAoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9VTkRFQ1JZUFRBQkxFKSB7Ci0JCQl3c3RhdHMtPmRpc2NhcmQuY29kZSsrOwotCQkJREVCVUcoMSwgIiVzOiBVbmRlY3J5cHRhYmxlIGZyYW1lIG9uIFJ4LiBGcmFtZSBkcm9wcGVkLlxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotCQl9IGVsc2UgewotCQkJc3RhdHMtPnJ4X2NyY19lcnJvcnMrKzsKLQkJCURFQlVHKDEsICIlczogQmFkIENSQyBvbiBSeC4gRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSk7Ci0JCX0KLQkJc3RhdHMtPnJ4X2Vycm9ycysrOwotCQlnb3RvIGRyb3A7CisJaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfQkFEQ1JDKSB7CisJCURFQlVHKDEsICIlczogQmFkIENSQyBvbiBSeC4gRnJhbWUgZHJvcHBlZC5cbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJCXN0YXRzLT5yeF9jcmNfZXJyb3JzKys7CisJCWdvdG8gdXBkYXRlX3N0YXRzOwogCX0KIAotCS8qIEZvciBub3cgd2UgaWdub3JlIHRoZSA4MDIuMTEgaGVhZGVyIGNvbXBsZXRlbHksIGFzc3VtaW5nCi0gICAgICAgICAgIHRoYXQgdGhlIGNhcmQncyBmaXJtd2FyZSBoYXMgaGFuZGxlZCBhbnl0aGluZyB2aXRhbCAqLwotCi0JZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgJmhkciwgc2l6ZW9mKGhkciksCi0JCQkgICAgICAgcnhmaWQsIEhFUk1FU184MDJfM19PRkZTRVQpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVhZGluZyBmcmFtZSBoZWFkZXIuICIKLQkJICAgICAgICJGcmFtZSBkcm9wcGVkLlxuIiwgZGV2LT5uYW1lLCBlcnIpOwotCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCWdvdG8gZHJvcDsKKwkvKiBIYW5kbGUgZnJhbWVzIGluIG1vbml0b3IgbW9kZSAqLworCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQlvcmlub2NvX3J4X21vbml0b3IoZGV2LCByeGZpZCwgJmRlc2MpOworCQlyZXR1cm47CiAJfQogCi0JbGVuZ3RoID0gbnRvaHMoaGRyLmxlbik7Ci0JCisJaWYgKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfVU5ERUNSWVBUQUJMRSkgeworCQlERUJVRygxLCAiJXM6IFVuZGVjcnlwdGFibGUgZnJhbWUgb24gUnguIEZyYW1lIGRyb3BwZWQuXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCQl3c3RhdHMtPmRpc2NhcmQuY29kZSsrOworCQlnb3RvIHVwZGF0ZV9zdGF0czsKKwl9CisKKwlsZW5ndGggPSBsZTE2X3RvX2NwdShkZXNjLmRhdGFfbGVuKTsKKwlmYyA9IGxlMTZfdG9fY3B1KGRlc2MuZnJhbWVfY3RsKTsKKwogCS8qIFNhbml0eSBjaGVja3MgKi8KIAlpZiAobGVuZ3RoIDwgMykgeyAvKiBObyBmb3IgZXZlbiBhbiA4MDIuMiBMTEMgaGVhZGVyICovCiAJCS8qIEF0IGxlYXN0IG9uIFN5bWJvbCBmaXJtd2FyZSB3aXRoIFBDRiB3ZSBnZXQgcXVpdGUgYQogICAgICAgICAgICAgICAgICAgIGxvdCBvZiB0aGVzZSBsZWdpdGltYXRlbHkgLSBQb2xsIGZyYW1lcyB3aXRoIG5vCiAgICAgICAgICAgICAgICAgICAgZGF0YS4gKi8KLQkJc3RhdHMtPnJ4X2Ryb3BwZWQrKzsKLQkJZ290byBkcm9wOworCQlyZXR1cm47CiAJfQogCWlmIChsZW5ndGggPiBJRUVFODAyXzExX0RBVEFfTEVOKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBPdmVyc2l6ZWQgZnJhbWUgcmVjZWl2ZWQgKCVkIGJ5dGVzKVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgbGVuZ3RoKTsKIAkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJc3RhdHMtPnJ4X2Vycm9ycysrOwotCQlnb3RvIGRyb3A7CisJCWdvdG8gdXBkYXRlX3N0YXRzOwogCX0KIAogCS8qIFdlIG5lZWQgc3BhY2UgZm9yIHRoZSBwYWNrZXQgZGF0YSBpdHNlbGYsIHBsdXMgYW4gZXRoZXJuZXQKQEAgLTExMjYsNjAgKzkzNCw1MyBAQAogCWlmICghc2tiKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDYW4ndCBhbGxvY2F0ZSBza2IgZm9yIFJ4XG4iLAogCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJZ290byBkcm9wOworCQlnb3RvIHVwZGF0ZV9zdGF0czsKIAl9CiAKLQlza2JfcmVzZXJ2ZShza2IsIDIpOyAvKiBUaGlzIHdheSB0aGUgSVAgaGVhZGVyIGlzIGFsaWduZWQgKi8KKwkvKiBXZSdsbCBwcmVwZW5kIHRoZSBoZWFkZXIsIHNvIHJlc2VydmUgc3BhY2UgZm9yIGl0LiAgVGhlIHdvcnN0CisJICAgY2FzZSBpcyBubyBkZWNhcHN1bGF0aW9uLCB3aGVuIDgwMi4zIGhlYWRlciBpcyBwcmVwZW5kZWQgYW5kCisJICAgbm90aGluZyBpcyByZW1vdmVkLiAgMiBpcyBmb3IgYWxpZ25pbmcgdGhlIElQIGhlYWRlci4gICovCisJc2tiX3Jlc2VydmUoc2tiLCBFVEhfSExFTiArIDIpOworCisJZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgc2tiX3B1dChza2IsIGxlbmd0aCksCisJCQkgICAgICAgQUxJR04obGVuZ3RoLCAyKSwgcnhmaWQsCisJCQkgICAgICAgSEVSTUVTXzgwMl8yX09GRlNFVCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGZyYW1lLiAiCisJCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byBkcm9wOworCX0KIAogCS8qIEhhbmRsZSBkZWNhcHN1bGF0aW9uCiAJICogSW4gbW9zdCBjYXNlcywgdGhlIGZpcm13YXJlIHRlbGwgdXMgYWJvdXQgU05BUCBmcmFtZXMuCiAJICogRm9yIHNvbWUgcmVhc29uLCB0aGUgU05BUCBmcmFtZXMgc2VudCBieSBMaW5rU3lzIEFQcwogCSAqIGFyZSBub3QgcHJvcGVybHkgcmVjb2duaXNlZCBieSBtb3N0IGZpcm13YXJlcy4KIAkgKiBTbywgY2hlY2sgb3Vyc2VsdmVzICovCi0JaWYgKCgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUXzEwNDIpIHx8Ci0JICAgICgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUX1RVTk5FTCkgfHwKLQkgICAgaXNfZXRoZXJzbmFwKCZoZHIpKSB7CisJaWYgKGxlbmd0aCA+PSBFTkNBUFNfT1ZFUkhFQUQgJiYKKwkgICAgKCgoc3RhdHVzICYgSEVSTUVTX1JYU1RBVF9NU0dUWVBFKSA9PSBIRVJNRVNfUlhTVEFUXzEwNDIpIHx8CisJICAgICAoKHN0YXR1cyAmIEhFUk1FU19SWFNUQVRfTVNHVFlQRSkgPT0gSEVSTUVTX1JYU1RBVF9UVU5ORUwpIHx8CisJICAgICBpc19ldGhlcnNuYXAoc2tiLT5kYXRhKSkpIHsKIAkJLyogVGhlc2UgaW5kaWNhdGUgYSBTTkFQIHdpdGhpbiA4MDIuMiBMTEMgd2l0aGluCiAJCSAgIDgwMi4xMSBmcmFtZSB3aGljaCB3ZSdsbCBuZWVkIHRvIGRlLWVuY2Fwc3VsYXRlIHRvCiAJCSAgIHRoZSBvcmlnaW5hbCBFdGhlcm5ldElJIGZyYW1lLiAqLwotCi0JCWlmIChsZW5ndGggPCBFTkNBUFNfT1ZFUkhFQUQpIHsgLyogTm8gcm9vbSBmb3IgZnVsbCBMTEMrU05BUCAqLwotCQkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJCWdvdG8gZHJvcDsKLQkJfQotCi0JCS8qIFJlbW92ZSBTTkFQIGhlYWRlciwgcmVjb25zdHJ1Y3QgRXRoZXJuZXRJSSBmcmFtZSAqLwotCQlkYXRhX2xlbiA9IGxlbmd0aCAtIEVOQ0FQU19PVkVSSEVBRDsKLQkJZGF0YV9vZmYgPSBIRVJNRVNfODAyXzNfT0ZGU0VUICsgc2l6ZW9mKGhkcik7Ci0KLQkJZWggPSAoc3RydWN0IGV0aGhkciAqKXNrYl9wdXQoc2tiLCBFVEhfSExFTik7Ci0KLQkJbWVtY3B5KGVoLCAmaGRyLCAyICogRVRIX0FMRU4pOwotCQllaC0+aF9wcm90byA9IGhkci5ldGhlcnR5cGU7CisJCWhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1c2goc2tiLCBFVEhfSExFTiAtIEVOQ0FQU19PVkVSSEVBRCk7CiAJfSBlbHNlIHsKLQkJLyogQWxsIG90aGVyIGNhc2VzIGluZGljYXRlIGEgZ2VudWluZSA4MDIuMyBmcmFtZS4gIE5vCi0JCSAgIGRlY2Fwc3VsYXRpb24gbmVlZGVkLiAgV2UganVzdCB0aHJvdyB0aGUgd2hvbGUKLQkJICAgdGhpbmcgaW4sIGFuZCBob3BlIHRoZSBwcm90b2NvbCBsYXllciBjYW4gZGVhbCB3aXRoCi0JCSAgIGl0IGFzIDgwMi4zICovCi0JCWRhdGFfbGVuID0gbGVuZ3RoOwotCQlkYXRhX29mZiA9IEhFUk1FU184MDJfM19PRkZTRVQ7Ci0JCS8qIEZJWE1FOiB3ZSByZS1yZWFkIGZyb20gdGhlIGNhcmQgZGF0YSB3ZSBhbHJlYWR5IHJlYWQgaGVyZSAqLworCQkvKiA4MDIuMyBmcmFtZSAtIHByZXBlbmQgODAyLjMgaGVhZGVyIGFzIGlzICovCisJCWhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJCWhkci0+aF9wcm90byA9IGh0b25zKGxlbmd0aCk7CiAJfQotCi0JcCA9IHNrYl9wdXQoc2tiLCBkYXRhX2xlbik7Ci0JZXJyID0gaGVybWVzX2JhcF9wcmVhZChodywgSVJRX0JBUCwgcCwgQUxJR04oZGF0YV9sZW4sIDIpLAotCQkJICAgICAgIHJ4ZmlkLCBkYXRhX29mZik7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWFkaW5nIGZyYW1lLiAiCi0JCSAgICAgICAiRnJhbWUgZHJvcHBlZC5cbiIsIGRldi0+bmFtZSwgZXJyKTsKLQkJc3RhdHMtPnJ4X2Vycm9ycysrOwotCQlnb3RvIGRyb3A7Ci0JfQorCW1lbWNweShoZHItPmhfZGVzdCwgZGVzYy5hZGRyMSwgRVRIX0FMRU4pOworCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykKKwkJbWVtY3B5KGhkci0+aF9zb3VyY2UsIGRlc2MuYWRkcjMsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbWNweShoZHItPmhfc291cmNlLCBkZXNjLmFkZHIyLCBFVEhfQUxFTik7CiAKIAlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCWlmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpCisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwogCQogCS8qIFByb2Nlc3MgdGhlIHdpcmVsZXNzIHN0YXRzIGlmIG5lZWRlZCAqLwogCW9yaW5vY29fc3RhdF9nYXRoZXIoZGV2LCBza2IsICZkZXNjKTsKQEAgLTExOTIsMTEgKzk5MywxMCBAQAogCXJldHVybjsKIAogIGRyb3A6CQorCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CisgdXBkYXRlX3N0YXRzOgorCXN0YXRzLT5yeF9lcnJvcnMrKzsKIAlzdGF0cy0+cnhfZHJvcHBlZCsrOwotCi0JaWYgKHNrYikKLQkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKLQlyZXR1cm47CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNDAsNiArMTA0MCw5OSBAQAogCSAgICAgICBkZXYtPm5hbWUsIHMsIHN0YXR1cyk7CiB9CiAKKy8qIFNlYXJjaCBzY2FuIHJlc3VsdHMgZm9yIHJlcXVlc3RlZCBCU1NJRCwgam9pbiBpdCBpZiBmb3VuZCAqLworc3RhdGljIHZvaWQgb3Jpbm9jb19qb2luX2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBqb2luX3JlcSB7CisJCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwkJdTE2IGNoYW5uZWw7CisJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmVxOworCWNvbnN0IGludCBhdG9tX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8sIGF0aW0pOworCXN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8gKmF0b207CisJaW50IG9mZnNldCA9IDQ7CisJdTggKmJ1ZjsKKwl1MTYgbGVuOworCisJLyogQWxsb2NhdGUgYnVmZmVyIGZvciBzY2FuIHJlc3VsdHMgKi8KKwlidWYgPSBrbWFsbG9jKE1BWF9TQ0FOX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgYnVmKQorCQlyZXR1cm47CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBTYW5pdHkgY2hlY2tzIGluIGNhc2UgdXNlciBjaGFuZ2VkIHNvbWV0aGluZyBpbiB0aGUgbWVhbnRpbWUgKi8KKwlpZiAoISBwcml2LT5ic3NpZF9maXhlZCkKKwkJZ290byBvdXQ7CisKKwlpZiAoc3RybGVuKHByaXYtPmRlc2lyZWRfZXNzaWQpID09IDApCisJCWdvdG8gb3V0OworCisJLyogUmVhZCBzY2FuIHJlc3VsdHMgZnJvbSB0aGUgZmlybXdhcmUgKi8KKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLAorCQkJICAgICAgSEVSTUVTX1JJRF9TQ0FOUkVTVUxUU1RBQkxFLAorCQkJICAgICAgTUFYX1NDQU5fTEVOLCAmbGVuLCBidWYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm90IHJlYWQgc2NhbiByZXN1bHRzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGVuID0gSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhsZW4pOworCisJLyogR28gdGhyb3VnaCB0aGUgc2NhbiByZXN1bHRzIGxvb2tpbmcgZm9yIHRoZSBjaGFubmVsIG9mIHRoZSBBUAorCSAqIHdlIHdlcmUgcmVxdWVzdGVkIHRvIGpvaW4gKi8KKwlmb3IgKDsgb2Zmc2V0ICsgYXRvbV9sZW4gPD0gbGVuOyBvZmZzZXQgKz0gYXRvbV9sZW4pIHsKKwkJYXRvbSA9IChzdHJ1Y3QgcHJpc20yX3NjYW5fYXBpbmZvICopIChidWYgKyBvZmZzZXQpOworCQlpZiAobWVtY21wKCZhdG9tLT5ic3NpZCwgcHJpdi0+ZGVzaXJlZF9ic3NpZCwgRVRIX0FMRU4pID09IDApCisJCQlnb3RvIGZvdW5kOworCX0KKworCURFQlVHKDEsICIlczogUmVxdWVzdGVkIEFQIG5vdCBmb3VuZCBpbiBzY2FuIHJlc3VsdHNcbiIsCisJICAgICAgZGV2LT5uYW1lKTsKKwlnb3RvIG91dDsKKworIGZvdW5kOgorCW1lbWNweShyZXEuYnNzaWQsIHByaXYtPmRlc2lyZWRfYnNzaWQsIEVUSF9BTEVOKTsKKwlyZXEuY2hhbm5lbCA9IGF0b20tPmNoYW5uZWw7CS8qIGJvdGggYXJlIGxpdHRsZS1lbmRpYW4gKi8KKwllcnIgPSBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DTkZKT0lOUkVRVUVTVCwKKwkJCQkgICZyZXEpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGlzc3Vpbmcgam9pbiByZXF1ZXN0XG4iLCBkZXYtPm5hbWUpOworCisgb3V0OgorCWtmcmVlKGJ1Zik7CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKK30KKworLyogU2VuZCBuZXcgQlNTSUQgdG8gdXNlcnNwYWNlICovCitzdGF0aWMgdm9pZCBvcmlub2NvX3NlbmRfd2V2ZW50cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBoZXJtZXMgKmh3ID0gJnByaXYtPmh3OworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuOworCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBJUlFfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRCU1NJRCwKKwkJCSAgICAgIEVUSF9BTEVOLCBOVUxMLCB3cnF1LmFwX2FkZHIuc2FfZGF0YSk7CisJaWYgKGVyciAhPSAwKQorCQlyZXR1cm47CisKKwl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCisJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOworCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Cit9CisKIHN0YXRpYyB2b2lkIF9fb3Jpbm9jb19ldl9pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGhlcm1lc190ICpodykKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTEzMDcsNiArMTIwMCw5IEBACiAJCXUxNiBuZXdzdGF0dXM7CiAJCWludCBjb25uZWN0ZWQ7CiAKKwkJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQkJYnJlYWs7CisKIAkJaWYgKGxlbiAhPSBzaXplb2YobGlua3N0YXR1cykpIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmV4cGVjdGVkIHNpemUgZm9yIGxpbmtzdGF0dXMgZnJhbWUgKCVkIGJ5dGVzKVxuIiwKIAkJCSAgICAgICBkZXYtPm5hbWUsIGxlbik7CkBAIC0xMzE5LDYgKzEyMTUsMTUgQEAKIAkJCWJyZWFrOwogCQluZXdzdGF0dXMgPSBsZTE2X3RvX2NwdShsaW5rc3RhdHVzLmxpbmtzdGF0dXMpOwogCisJCS8qIFN5bWJvbCBmaXJtd2FyZSB1c2VzICJvdXQgb2YgcmFuZ2UiIHRvIHNpZ25hbCB0aGF0CisJCSAqIHRoZSBob3N0c2NhbiBmcmFtZSBjYW4gYmUgcmVxdWVzdGVkLiAgKi8KKwkJaWYgKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19BUF9PVVRfT0ZfUkFOR0UgJiYKKwkJICAgIHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9TWU1CT0wgJiYKKwkJICAgIHByaXYtPmhhc19ob3N0c2NhbiAmJiBwcml2LT5zY2FuX2lucHJvZ3Jlc3MpIHsKKwkJCWhlcm1lc19pbnF1aXJlKGh3LCBIRVJNRVNfSU5RX0hPU1RTQ0FOX1NZTUJPTCk7CisJCQlicmVhazsKKwkJfQorCiAJCWNvbm5lY3RlZCA9IChuZXdzdGF0dXMgPT0gSEVSTUVTX0xJTktTVEFUVVNfQ09OTkVDVEVEKQogCQkJfHwgKG5ld3N0YXR1cyA9PSBIRVJNRVNfTElOS1NUQVRVU19BUF9DSEFOR0UpCiAJCQl8fCAobmV3c3RhdHVzID09IEhFUk1FU19MSU5LU1RBVFVTX0FQX0lOX1JBTkdFKTsKQEAgLTEzMjgsMTIgKzEyMzMsODkgQEAKIAkJZWxzZSBpZiAoIWlnbm9yZV9kaXNjb25uZWN0KQogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAotCQlpZiAobmV3c3RhdHVzICE9IHByaXYtPmxhc3RfbGlua3N0YXR1cykKKwkJaWYgKG5ld3N0YXR1cyAhPSBwcml2LT5sYXN0X2xpbmtzdGF0dXMpIHsKKwkJCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IG5ld3N0YXR1czsKIAkJCXByaW50X2xpbmtzdGF0dXMoZGV2LCBuZXdzdGF0dXMpOwotCi0JCXByaXYtPmxhc3RfbGlua3N0YXR1cyA9IG5ld3N0YXR1czsKKwkJCS8qIFRoZSBpbmZvIGZyYW1lIGNvbnRhaW5zIG9ubHkgb25lIHdvcmQgd2hpY2ggaXMgdGhlCisJCQkgKiBzdGF0dXMgKHNlZSBoZXJtZXMuaCkuIFRoZSBzdGF0dXMgaXMgcHJldHR5IGJvcmluZworCQkJICogaW4gaXRzZWxmLCB0aGF0J3Mgd2h5IHdlIGV4cG9ydCB0aGUgbmV3IEJTU0lELi4uCisJCQkgKiBKZWFuIElJICovCisJCQlzY2hlZHVsZV93b3JrKCZwcml2LT53ZXZlbnRfd29yayk7CisJCX0KIAl9CiAJYnJlYWs7CisJY2FzZSBIRVJNRVNfSU5RX1NDQU46CisJCWlmICghcHJpdi0+c2Nhbl9pbnByb2dyZXNzICYmIHByaXYtPmJzc2lkX2ZpeGVkICYmCisJCSAgICBwcml2LT5maXJtd2FyZV90eXBlID09IEZJUk1XQVJFX1RZUEVfSU5URVJTSUwpIHsKKwkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPmpvaW5fd29yayk7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEhFUk1FU19JTlFfSE9TVFNDQU46CisJY2FzZSBIRVJNRVNfSU5RX0hPU1RTQ0FOX1NZTUJPTDogeworCQkvKiBSZXN1bHQgb2YgYSBzY2FubmluZy4gQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKKwkJICogY2VsbHMgaW4gdGhlIHZpY2luaXR5IC0gSmVhbiBJSSAqLworCQl1bmlvbiBpd3JlcV9kYXRhCXdycXU7CisJCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJaWYgKGxlbiA+IDQwOTYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBTY2FuIHJlc3VsdHMgdG9vIGxhcmdlICglZCBieXRlcylcbiIsCisJCQkgICAgICAgZGV2LT5uYW1lLCBsZW4pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBXZSBhcmUgYSBzdHJpY3QgcHJvZHVjZXIuIElmIHRoZSBwcmV2aW91cyBzY2FuIHJlc3VsdHMKKwkJICogaGF2ZSBub3QgYmVlbiBjb25zdW1lZCwgd2UganVzdCBoYXZlIHRvIGRyb3AgdGhpcworCQkgKiBmcmFtZS4gV2UgY2FuJ3QgcmVtb3ZlIHRoZSBwcmV2aW91cyByZXN1bHRzIG91cnNlbHZlcywKKwkJICogdGhhdCB3b3VsZCBiZSAqdmVyeSogcmFjeS4uLiBKZWFuIElJICovCisJCWlmIChwcml2LT5zY2FuX3Jlc3VsdCAhPSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJldmlvdXMgc2NhbiByZXN1bHRzIG5vdCBjb25zdW1lZCwgZHJvcHBpbmcgaW5mbyBmcmFtZS5cbiIsIGRldi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEFsbG9jYXRlIGJ1ZmZlciBmb3IgcmVzdWx0cyAqLworCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCS8qIE5vIG1lbW9yeSwgc28gY2FuJ3QgcHJpbnRrKCkuLi4gKi8KKwkJCWJyZWFrOworCisJCS8qIFJlYWQgc2NhbiBkYXRhICovCisJCWVyciA9IGhlcm1lc19iYXBfcHJlYWQoaHcsIElSUV9CQVAsICh2b2lkICopIGJ1ZiwgbGVuLAorCQkJCSAgICAgICBpbmZvZmlkLCBzaXplb2YoaW5mbykpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKyNpZmRlZiBPUklOT0NPX0RFQlVHCisJCXsKKwkJCWludAlpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlNjYW4gcmVzdWx0IFslMDJYIiwgYnVmWzBdKTsKKwkJCWZvcihpID0gMTsgaSA8IChsZW4gKiAyKTsgaSsrKQorCQkJCXByaW50aygiOiUwMlgiLCBidWZbaV0pOworCQkJcHJpbnRrKCJdXG4iKTsKKwkJfQorI2VuZGlmCS8qIE9SSU5PQ09fREVCVUcgKi8KKworCQkvKiBBbGxvdyB0aGUgY2xpZW50cyB0byBhY2Nlc3MgdGhlIHJlc3VsdHMgKi8KKwkJcHJpdi0+c2Nhbl9sZW4gPSBsZW47CisJCXByaXYtPnNjYW5fcmVzdWx0ID0gYnVmOworCisJCS8qIFNlbmQgYW4gZW1wdHkgZXZlbnQgdG8gdXNlciBzcGFjZS4KKwkJICogV2UgZG9uJ3Qgc2VuZCB0aGUgcmVjZWl2ZWQgZGF0YSBvbiB0aGUgZXZlbnQgYmVjYXVzZQorCQkgKiBpdCB3b3VsZCByZXF1aXJlIHVzIHRvIGRvIGNvbXBsZXggdHJhbnNjb2RpbmcsIGFuZAorCQkgKiB3ZSB3YW50IHRvIG1pbmltaXNlIHRoZSB3b3JrIGRvbmUgaW4gdGhlIGlycSBoYW5kbGVyCisJCSAqIFVzZSBhIHJlcXVlc3QgdG8gZXh0cmFjdCB0aGUgZGF0YSAtIEplYW4gSUkgKi8KKwkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CisJCXdycXUuZGF0YS5mbGFncyA9IDA7CisJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBTSU9DR0lXU0NBTiwgJndycXUsIE5VTEwpOworCX0KKwlicmVhazsKKwljYXNlIEhFUk1FU19JTlFfU0VDX1NUQVRfQUdFUkU6CisJCS8qIFNlY3VyaXR5IHN0YXR1cyAoQWdlcmUgc3BlY2lmaWMpICovCisJCS8qIElnbm9yZSB0aGlzIGZyYW1lIGZvciBub3cgKi8KKwkJaWYgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9BR0VSRSkKKwkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFVua25vd24gaW5mb3JtYXRpb24gZnJhbWUgcmVjZWl2ZWQ6ICIKIAkJICAgICAgICJ0eXBlIDB4JTA0eCwgbGVuZ3RoICVkXG4iLCBkZXYtPm5hbWUsIHR5cGUsIGxlbik7CkBAIC0xNDcwLDYgKzE0NTIsMzYgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBTZXQgZml4ZWQgQVAgYWRkcmVzcyAqLworc3RhdGljIGludCBfX29yaW5vY29faHdfc2V0X3dhcChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2KQoreworCWludCByb2FtaW5nX2ZsYWc7CisJaW50IGVyciA9IDA7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCisJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJY2FzZSBGSVJNV0FSRV9UWVBFX0FHRVJFOgorCQkvKiBub3Qgc3VwcG9ydGVkICovCisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwkJaWYgKHByaXYtPmJzc2lkX2ZpeGVkKQorCQkJcm9hbWluZ19mbGFnID0gMjsKKwkJZWxzZQorCQkJcm9hbWluZ19mbGFnID0gMTsKKworCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCSAgIEhFUk1FU19SSURfQ05GUk9BTUlOR01PREUsCisJCQkJCSAgIHJvYW1pbmdfZmxhZyk7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCWVyciA9IEhFUk1FU19XUklURV9SRUNPUkQoaHcsIFVTRVJfQkFQLAorCQkJCQkgIEhFUk1FU19SSURfQ05GTUFOREFUT1JZQlNTSURfU1lNQk9MLAorCQkJCQkgICZwcml2LT5kZXNpcmVkX2Jzc2lkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKIC8qIENoYW5nZSB0aGUgV0VQIGtleXMgYW5kL29yIHRoZSBjdXJyZW50IGtleXMuICBDYW4gYmUgY2FsbGVkCiAgKiBlaXRoZXIgZnJvbSBfX29yaW5vY29faHdfc2V0dXBfd2VwKCkgb3IgZGlyZWN0bHkgZnJvbQogICogb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZSgpLiAgSW4gdGhlIGxhdGVyIGNhc2UgdGhlIGFzc29jaWF0aW9uCkBAIC0xNjU1LDYgKzE2NjcsMTMgQEAKIAkJfQogCX0KIAorCS8qIFNldCB0aGUgZGVzaXJlZCBCU1NJRCAqLworCWVyciA9IF9fb3Jpbm9jb19od19zZXRfd2FwKHByaXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgc2V0dGluZyBBUCBhZGRyZXNzXG4iLAorCQkgICAgICAgZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KIAkvKiBTZXQgdGhlIGRlc2lyZWQgRVNTSUQgKi8KIAlpZGJ1Zi5sZW4gPSBjcHVfdG9fbGUxNihzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkpOwogCW1lbWNweSgmaWRidWYudmFsLCBwcml2LT5kZXNpcmVkX2Vzc2lkLCBzaXplb2YoaWRidWYudmFsKSk7CkBAIC0xNzkzLDYgKzE4MTIsMjAgQEAKIAkJfQogCX0KIAorCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQkvKiBFbmFibGUgbW9uaXRvciBtb2RlICovCisJCWRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTE7CisJCWVyciA9IGhlcm1lc19kb2NtZF93YWl0KGh3LCBIRVJNRVNfQ01EX1RFU1QgfCAKKwkJCQkJICAgIEhFUk1FU19URVNUX01PTklUT1IsIDAsIE5VTEwpOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgbW9uaXRvciBtb2RlICovCisJCWRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKKwkJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfVEVTVCB8CisJCQkJCSAgICBIRVJNRVNfVEVTVF9TVE9QLCAwLCBOVUxMKTsKKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCS8qIFNldCBwcm9taXNjdWl0eSAvIG11bHRpY2FzdCovCiAJcHJpdi0+cHJvbWlzY3VvdXMgPSAwOwogCXByaXYtPm1jX2NvdW50ID0gMDsKQEAgLTE4NjksNTUgKzE5MDIsNiBAQAogCQlkZXYtPmZsYWdzICY9IH5JRkZfUFJPTUlTQzsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX3JlY29uZmlndXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGhlcm1lcyAqaHcgPSAmcHJpdi0+aHc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQpIHsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQotCQlyZXR1cm4gLUVCVVNZOwotCQkKLQllcnIgPSBoZXJtZXNfZGlzYWJsZV9wb3J0KGh3LCAwKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZGlzYWJsZSBwb3J0IHdoaWxlIHJlY29uZmlndXJpbmcgY2FyZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCXByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCA9IDE7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWVyciA9IF9fb3Jpbm9jb19wcm9ncmFtX3JpZHMoZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gcmVjb25maWd1cmUgY2FyZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWVyciA9IGhlcm1lc19lbmFibGVfcG9ydChodywgMCk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVW5hYmxlIHRvIGVuYWJsZSBwb3J0IHdoaWxlIHJlY29uZmlndXJpbmcgY2FyZFxuIiwKLQkJICAgICAgIGRldi0+bmFtZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotIG91dDoKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBSZXNldHRpbmcgaW5zdGVhZC4uLlxuIiwgZGV2LT5uYW1lKTsKLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7Ci0JCWVyciA9IDA7Ci0JfQotCi0Jb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQlyZXR1cm4gZXJyOwotCi19Ci0KIC8qIFRoaXMgbXVzdCBiZSBjYWxsZWQgZnJvbSB1c2VyIGNvbnRleHQsIHdpdGhvdXQgbG9ja3MgaGVsZCAtIHVzZQogICogc2NoZWR1bGVfd29yaygpICovCiBzdGF0aWMgdm9pZCBvcmlub2NvX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xOTQ2LDYgKzE5MzAsMTEgQEAKIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKKyAJLyogU2Nhbm5pbmcgc3VwcG9ydDogQ2xlYW51cCBvZiBkcml2ZXIgc3RydWN0ICovCisJa2ZyZWUocHJpdi0+c2Nhbl9yZXN1bHQpOworCXByaXYtPnNjYW5fcmVzdWx0ID0gTlVMTDsKKwlwcml2LT5zY2FuX2lucHJvZ3Jlc3MgPSAwOworCiAJaWYgKHByaXYtPmhhcmRfcmVzZXQpIHsKIAkJZXJyID0gKCpwcml2LT5oYXJkX3Jlc2V0KShwcml2KTsKIAkJaWYgKGVycikgewpAQCAtMjE4NCw2ICsyMTczLDggQEAKIAkJcHJpdi0+aGFzX213byA9IChmaXJtdmVyID49IDB4NjAwMDApOwogCQlwcml2LT5oYXNfcG0gPSAoZmlybXZlciA+PSAweDQwMDIwKTsgLyogRG9uJ3Qgd29yayBpbiA3LjUyID8gKi8KIAkJcHJpdi0+aWJzc19wb3J0ID0gMTsKKwkJcHJpdi0+aGFzX2hvc3RzY2FuID0gKGZpcm12ZXIgPj0gMHg4MDAwYSk7CisJCXByaXYtPmJyb2tlbl9tb25pdG9yID0gKGZpcm12ZXIgPj0gMHg4MDAwMCk7CiAKIAkJLyogVGVzdGVkIHdpdGggQWdlcmUgZmlybXdhcmUgOgogCQkgKgkxLjE2IDsgNC4wOCA7IDQuNTIgOyA2LjA0IDsgNi4xNiA7IDcuMjggPT4gSmVhbiBJSQpAQCAtMjIyOSw2ICsyMjIwLDggQEAKIAkJcHJpdi0+aWJzc19wb3J0ID0gNDsKICAJCXByaXYtPmJyb2tlbl9kaXNhYmxlcG9ydCA9IChmaXJtdmVyID09IDB4MjUwMTMpIHx8CiAgCQkJCQkgICAoZmlybXZlciA+PSAweDMwMDAwICYmIGZpcm12ZXIgPD0gMHgzMTAwMCk7CisJCXByaXYtPmhhc19ob3N0c2NhbiA9IChmaXJtdmVyID49IDB4MzEwMDEpIHx8CisJCQkJICAgICAoZmlybXZlciA+PSAweDI5MDU3ICYmIGZpcm12ZXIgPCAweDMwMDAwKTsKIAkJLyogVGVzdGVkIHdpdGggSW50ZWwgZmlybXdhcmUgOiAweDIwMDE1ID0+IEplYW4gSUkgKi8KIAkJLyogVGVzdGVkIHdpdGggM0NvbSBmaXJtd2FyZSA6IDB4MTUwMTIgJiAweDIyMDAxID0+IEplYW4gSUkgKi8KIAkJYnJlYWs7CkBAIC0yMjQ4LDYgKzIyNDEsNyBAQAogCQlwcml2LT5oYXNfaWJzcyA9IChmaXJtdmVyID49IDB4MDAwNzAwKTsgLyogRklYTUUgKi8KIAkJcHJpdi0+aGFzX2JpZ193ZXAgPSBwcml2LT5oYXNfd2VwID0gKGZpcm12ZXIgPj0gMHgwMDA4MDApOwogCQlwcml2LT5oYXNfcG0gPSAoZmlybXZlciA+PSAweDAwMDcwMCk7CisJCXByaXYtPmhhc19ob3N0c2NhbiA9IChmaXJtdmVyID49IDB4MDEwMzAxKTsKIAogCQlpZiAoZmlybXZlciA+PSAweDAwMDgwMCkKIAkJCXByaXYtPmlic3NfcG9ydCA9IDA7CkBAIC0yNDU2LDggKzI0NTAsOSBAQAogCWRldi0+dHhfdGltZW91dCA9IG9yaW5vY29fdHhfdGltZW91dDsKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFo7IC8qIDEgc2Vjb25kIHRpbWVvdXQgKi8KIAlkZXYtPmdldF9zdGF0cyA9IG9yaW5vY29fZ2V0X3N0YXRzOworCWRldi0+ZXRodG9vbF9vcHMgPSAmb3Jpbm9jb19ldGh0b29sX29wczsKIAlkZXYtPmdldF93aXJlbGVzc19zdGF0cyA9IG9yaW5vY29fZ2V0X3dpcmVsZXNzX3N0YXRzOwotCWRldi0+ZG9faW9jdGwgPSBvcmlub2NvX2lvY3RsOworCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPSAoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJm9yaW5vY29faGFuZGxlcl9kZWY7CiAJZGV2LT5jaGFuZ2VfbXR1ID0gb3Jpbm9jb19jaGFuZ2VfbXR1OwogCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gb3Jpbm9jb19zZXRfbXVsdGljYXN0X2xpc3Q7CiAJLyogd2UgdXNlIHRoZSBkZWZhdWx0IGV0aF9tYWNfYWRkciBmb3Igc2V0dGluZyB0aGUgTUFDIGFkZHIgKi8KQEAgLTI0NzMsNiArMjQ2OCw4IEBACiAJCQkJICAgKiBiZWZvcmUgYW55dGhpbmcgZWxzZSB0b3VjaGVzIHRoZQogCQkJCSAgICogaGFyZHdhcmUgKi8KIAlJTklUX1dPUksoJnByaXYtPnJlc2V0X3dvcmssICh2b2lkICgqKSh2b2lkICopKW9yaW5vY29fcmVzZXQsIGRldik7CisJSU5JVF9XT1JLKCZwcml2LT5qb2luX3dvcmssICh2b2lkICgqKSh2b2lkICopKW9yaW5vY29fam9pbl9hcCwgZGV2KTsKKwlJTklUX1dPUksoJnByaXYtPndldmVudF93b3JrLCAodm9pZCAoKikodm9pZCAqKSlvcmlub2NvX3NlbmRfd2V2ZW50cywgZGV2KTsKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJcHJpdi0+bGFzdF9saW5rc3RhdHVzID0gMHhmZmZmOwpAQCAtMjQ4Myw2ICsyNDgwLDkgQEAKIAogdm9pZCBmcmVlX29yaW5vY29kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWtmcmVlKHByaXYtPnNjYW5fcmVzdWx0KTsKIAlmcmVlX25ldGRldihkZXYpOwogfQogCkBAIC0yNDkwLDI0ICsyNDkwLDYgQEAKIC8qIFdpcmVsZXNzIGV4dGVuc2lvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludCBvcmlub2NvX2h3X2dldF9ic3NpZChzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LAotCQkJCWNoYXIgYnVmW0VUSF9BTEVOXSkKLXsKLQloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7Ci0JaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgSEVSTUVTX1JJRF9DVVJSRU5UQlNTSUQsCi0JCQkgICAgICBFVEhfQUxFTiwgTlVMTCwgYnVmKTsKLQotCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IG9yaW5vY29faHdfZ2V0X2Vzc2lkKHN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYsIGludCAqYWN0aXZlLAogCQkJCWNoYXIgYnVmW0lXX0VTU0lEX01BWF9TSVpFKzFdKQogewpAQCAtMjYzMywxNDAgKzI2MTUsMjcxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqcnJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldG5hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgY2hhciAqbmFtZSwKKwkJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGVyciA9IDA7Ci0JaW50IG1vZGU7Ci0Jc3RydWN0IGl3X3JhbmdlIHJhbmdlOwogCWludCBudW1yYXRlczsKLQlpbnQgaSwgazsKKwlpbnQgZXJyOworCisJZXJyID0gb3Jpbm9jb19od19nZXRfYml0cmF0ZWxpc3QocHJpdiwgJm51bXJhdGVzLCBOVUxMLCAwKTsKKworCWlmICghZXJyICYmIChudW1yYXRlcyA+IDIpKQorCQlzdHJjcHkobmFtZSwgIklFRUUgODAyLjExYiIpOworCWVsc2UKKwkJc3RyY3B5KG5hbWUsICJJRUVFIDgwMi4xMS1EUyIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXR3YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBzb2NrYWRkciAqYXBfYWRkciwKKwkJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOwotCi0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBycnEtPnBvaW50ZXIsIHNpemVvZihyYW5nZSkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJycS0+bGVuZ3RoID0gc2l6ZW9mKHJhbmdlKTsKKwlzdGF0aWMgY29uc3QgdTggb2ZmX2FkZHJbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyBjb25zdCB1OCBhbnlfYWRkcltdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CiAKIAlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCW1vZGUgPSBwcml2LT5pd19tb2RlOworCS8qIEVuYWJsZSBhdXRvbWF0aWMgcm9hbWluZyAtIG5vIHNhbml0eSBjaGVja3MgYXJlIG5lZWRlZCAqLworCWlmIChtZW1jbXAoJmFwX2FkZHItPnNhX2RhdGEsIG9mZl9hZGRyLCBFVEhfQUxFTikgPT0gMCB8fAorCSAgICBtZW1jbXAoJmFwX2FkZHItPnNhX2RhdGEsIGFueV9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQlwcml2LT5ic3NpZF9maXhlZCA9IDA7CisJCW1lbXNldChwcml2LT5kZXNpcmVkX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisKKwkJLyogIm9mZiIgbWVhbnMga2VlcCBleGlzdGluZyBjb25uZWN0aW9uICovCisJCWlmIChhcF9hZGRyLT5zYV9kYXRhWzBdID09IDApIHsKKwkJCV9fb3Jpbm9jb19od19zZXRfd2FwKHByaXYpOworCQkJZXJyID0gMDsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHJpdi0+ZmlybXdhcmVfdHlwZSA9PSBGSVJNV0FSRV9UWVBFX0FHRVJFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBMdWNlbnQvQWdlcmUgZmlybXdhcmUgZG9lc24ndCAiCisJCSAgICAgICAic3VwcG9ydCBtYW51YWwgcm9hbWluZ1xuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBNYW51YWwgcm9hbWluZyBzdXBwb3J0ZWQgb25seSBpbiAiCisJCSAgICAgICAibWFuYWdlZCBtb2RlXG4iLCBkZXYtPm5hbWUpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW50ZXJzaWwgZmlybXdhcmUgaGFuZ3Mgd2l0aG91dCBEZXNpcmVkIEVTU0lEICovCisJaWYgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9JTlRFUlNJTCAmJgorCSAgICBzdHJsZW4ocHJpdi0+ZGVzaXJlZF9lc3NpZCkgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRGVzaXJlZCBFU1NJRCBtdXN0IGJlIHNldCBmb3IgIgorCQkgICAgICAgIm1hbnVhbCByb2FtaW5nXG4iLCBkZXYtPm5hbWUpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmluYWxseSwgZW5hYmxlIG1hbnVhbCByb2FtaW5nICovCisJcHJpdi0+YnNzaWRfZml4ZWQgPSAxOworCW1lbWNweShwcml2LT5kZXNpcmVkX2Jzc2lkLCAmYXBfYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHdhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IHNvY2thZGRyICphcF9hZGRyLAorCQkJCWNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWFwX2FkZHItPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwllcnIgPSBoZXJtZXNfcmVhZF9sdHYoaHcsIFVTRVJfQkFQLCBIRVJNRVNfUklEX0NVUlJFTlRCU1NJRCwKKwkJCSAgICAgIEVUSF9BTEVOLCBOVUxMLCBhcF9hZGRyLT5zYV9kYXRhKTsKKwogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQltZW1zZXQoJnJhbmdlLCAwLCBzaXplb2YocmFuZ2UpKTsKKwlyZXR1cm4gZXJyOworfQogCi0JLyogTXVjaCBvZiB0aGlzIHNoYW1lbGVzc2x5IHRha2VuIGZyb20gd3ZsYW5fY3MuYy4gTm8gaWRlYQotCSAqIHdoYXQgaXQgYWxsIG1lYW5zIC1kZ2lic29uICovCi0JcmFuZ2Uud2VfdmVyc2lvbl9jb21waWxlZCA9IFdJUkVMRVNTX0VYVDsKLQlyYW5nZS53ZV92ZXJzaW9uX3NvdXJjZSA9IDExOworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldG1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdTMyICptb2RlLAorCQkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlyYW5nZS5taW5fbndpZCA9IHJhbmdlLm1heF9ud2lkID0gMDsgLyogV2UgZG9uJ3QgdXNlIG53aWRzICovCisJaWYgKHByaXYtPml3X21vZGUgPT0gKm1vZGUpCisJCXJldHVybiAwOworCisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKCptb2RlKSB7CisJY2FzZSBJV19NT0RFX0FESE9DOgorCQlpZiAoIXByaXYtPmhhc19pYnNzICYmICFwcml2LT5oYXNfcG9ydDMpCisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWJyZWFrOworCisJY2FzZSBJV19NT0RFX01PTklUT1I6CisJCWlmIChwcml2LT5icm9rZW5fbW9uaXRvciAmJiAhZm9yY2VfbW9uaXRvcikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1vbml0b3IgbW9kZSBzdXBwb3J0IGlzICIKKwkJCSAgICAgICAiYnVnZ3kgaW4gdGhpcyBmaXJtd2FyZSwgbm90IGVuYWJsaW5nXG4iLAorCQkJICAgICAgIGRldi0+bmFtZSk7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlpZiAoZXJyID09IC1FSU5QUk9HUkVTUykgeworCQlwcml2LT5pd19tb2RlID0gKm1vZGU7CisJCXNldF9wb3J0X3R5cGUocHJpdik7CisJfQorCisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRtb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHUzMiAqbW9kZSwKKwkJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkqbW9kZSA9IHByaXYtPml3X21vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgIHN0cnVjdCBpd19wb2ludCAqcnJxLAorCQkJCSAgICBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaXdfcmFuZ2UgKnJhbmdlID0gKHN0cnVjdCBpd19yYW5nZSAqKSBleHRyYTsKKwlpbnQgbnVtcmF0ZXM7CisJaW50IGksIGs7CisKKwlUUkFDRV9FTlRFUihkZXYtPm5hbWUpOworCisJcnJxLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGl3X3JhbmdlKTsKKwltZW1zZXQocmFuZ2UsIDAsIHNpemVvZihzdHJ1Y3QgaXdfcmFuZ2UpKTsKKworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE0OwogCiAJLyogU2V0IGF2YWlsYWJsZSBjaGFubmVscy9mcmVxdWVuY2llcyAqLwotCXJhbmdlLm51bV9jaGFubmVscyA9IE5VTV9DSEFOTkVMUzsKKwlyYW5nZS0+bnVtX2NoYW5uZWxzID0gTlVNX0NIQU5ORUxTOwogCWsgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ0hBTk5FTFM7IGkrKykgewogCQlpZiAocHJpdi0+Y2hhbm5lbF9tYXNrICYgKDEgPDwgaSkpIHsKLQkJCXJhbmdlLmZyZXFba10uaSA9IGkgKyAxOwotCQkJcmFuZ2UuZnJlcVtrXS5tID0gY2hhbm5lbF9mcmVxdWVuY3lbaV0gKiAxMDAwMDA7Ci0JCQlyYW5nZS5mcmVxW2tdLmUgPSAxOworCQkJcmFuZ2UtPmZyZXFba10uaSA9IGkgKyAxOworCQkJcmFuZ2UtPmZyZXFba10ubSA9IGNoYW5uZWxfZnJlcXVlbmN5W2ldICogMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFba10uZSA9IDE7CiAJCQlrKys7CiAJCX0KIAkJCiAJCWlmIChrID49IElXX01BWF9GUkVRVUVOQ0lFUykKIAkJCWJyZWFrOwogCX0KLQlyYW5nZS5udW1fZnJlcXVlbmN5ID0gazsKKwlyYW5nZS0+bnVtX2ZyZXF1ZW5jeSA9IGs7CisJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gMzsKIAotCXJhbmdlLnNlbnNpdGl2aXR5ID0gMzsKKwlpZiAocHJpdi0+aGFzX3dlcCkgeworCQlyYW5nZS0+bWF4X2VuY29kaW5nX3Rva2VucyA9IE9SSU5PQ09fTUFYX0tFWVM7CisJCXJhbmdlLT5lbmNvZGluZ19zaXplWzBdID0gU01BTExfS0VZX1NJWkU7CisJCXJhbmdlLT5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAxOwogCi0JaWYgKChtb2RlID09IElXX01PREVfQURIT0MpICYmIChwcml2LT5zcHlfbnVtYmVyID09IDApKXsKKwkJaWYgKHByaXYtPmhhc19iaWdfd2VwKSB7CisJCQlyYW5nZS0+ZW5jb2Rpbmdfc2l6ZVsxXSA9IExBUkdFX0tFWV9TSVpFOworCQkJcmFuZ2UtPm51bV9lbmNvZGluZ19zaXplcyA9IDI7CisJCX0KKwl9CisKKwlpZiAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgKHByaXYtPnNweV9udW1iZXIgPT0gMCkpewogCQkvKiBRdWFsaXR5IHN0YXRzIG1lYW5pbmdsZXNzIGluIGFkLWhvYyBtb2RlICovCi0JCXJhbmdlLm1heF9xdWFsLnF1YWwgPSAwOwotCQlyYW5nZS5tYXhfcXVhbC5sZXZlbCA9IDA7Ci0JCXJhbmdlLm1heF9xdWFsLm5vaXNlID0gMDsKLQkJcmFuZ2UuYXZnX3F1YWwucXVhbCA9IDA7Ci0JCXJhbmdlLmF2Z19xdWFsLmxldmVsID0gMDsKLQkJcmFuZ2UuYXZnX3F1YWwubm9pc2UgPSAwOwogCX0gZWxzZSB7Ci0JCXJhbmdlLm1heF9xdWFsLnF1YWwgPSAweDhiIC0gMHgyZjsKLQkJcmFuZ2UubWF4X3F1YWwubGV2ZWwgPSAweDJmIC0gMHg5NSAtIDE7Ci0JCXJhbmdlLm1heF9xdWFsLm5vaXNlID0gMHgyZiAtIDB4OTUgLSAxOworCQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDB4OGIgLSAweDJmOworCQlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAweDJmIC0gMHg5NSAtIDE7CisJCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IDB4MmYgLSAweDk1IC0gMTsKIAkJLyogTmVlZCB0byBnZXQgYmV0dGVyIHZhbHVlcyAqLwotCQlyYW5nZS5hdmdfcXVhbC5xdWFsID0gMHgyNDsKLQkJcmFuZ2UuYXZnX3F1YWwubGV2ZWwgPSAweEMyOwotCQlyYW5nZS5hdmdfcXVhbC5ub2lzZSA9IDB4OUU7CisJCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gMHgyNDsKKwkJcmFuZ2UtPmF2Z19xdWFsLmxldmVsID0gMHhDMjsKKwkJcmFuZ2UtPmF2Z19xdWFsLm5vaXNlID0gMHg5RTsKIAl9CiAKIAllcnIgPSBvcmlub2NvX2h3X2dldF9iaXRyYXRlbGlzdChwcml2LCAmbnVtcmF0ZXMsCi0JCQkJCSByYW5nZS5iaXRyYXRlLCBJV19NQVhfQklUUkFURVMpOworCQkJCQkgcmFuZ2UtPmJpdHJhdGUsIElXX01BWF9CSVRSQVRFUyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQlyYW5nZS5udW1fYml0cmF0ZXMgPSBudW1yYXRlczsKLQkKKwlyYW5nZS0+bnVtX2JpdHJhdGVzID0gbnVtcmF0ZXM7CisKIAkvKiBTZXQgYW4gaW5kaWNhdGlvbiBvZiB0aGUgbWF4IFRDUCB0aHJvdWdocHV0IGluIGJpdC9zIHRoYXQgd2UgY2FuCiAJICogZXhwZWN0IHVzaW5nIHRoaXMgaW50ZXJmYWNlLiBNYXkgYmUgdXNlIGZvciBRb1Mgc3R1ZmYuLi4KIAkgKiBKZWFuIElJICovCi0JaWYobnVtcmF0ZXMgPiAyKQotCQlyYW5nZS50aHJvdWdocHV0ID0gNSAqIDEwMDAgKiAxMDAwOwkvKiB+NSBNYi9zICovCisJaWYgKG51bXJhdGVzID4gMikKKwkJcmFuZ2UtPnRocm91Z2hwdXQgPSA1ICogMTAwMCAqIDEwMDA7CS8qIH41IE1iL3MgKi8KIAllbHNlCi0JCXJhbmdlLnRocm91Z2hwdXQgPSAxLjUgKiAxMDAwICogMTAwMDsJLyogfjEuNSBNYi9zICovCisJCXJhbmdlLT50aHJvdWdocHV0ID0gMS41ICogMTAwMCAqIDEwMDA7CS8qIH4xLjUgTWIvcyAqLwogCi0JcmFuZ2UubWluX3J0cyA9IDA7Ci0JcmFuZ2UubWF4X3J0cyA9IDIzNDc7Ci0JcmFuZ2UubWluX2ZyYWcgPSAyNTY7Ci0JcmFuZ2UubWF4X2ZyYWcgPSAyMzQ2OworCXJhbmdlLT5taW5fcnRzID0gMDsKKwlyYW5nZS0+bWF4X3J0cyA9IDIzNDc7CisJcmFuZ2UtPm1pbl9mcmFnID0gMjU2OworCXJhbmdlLT5tYXhfZnJhZyA9IDIzNDY7CiAKLQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKLQkJcmV0dXJuIC1FQlVTWTsKLQlpZiAocHJpdi0+aGFzX3dlcCkgewotCQlyYW5nZS5tYXhfZW5jb2RpbmdfdG9rZW5zID0gT1JJTk9DT19NQVhfS0VZUzsKKwlyYW5nZS0+bWluX3BtcCA9IDA7CisJcmFuZ2UtPm1heF9wbXAgPSA2NTUzNTAwMDsKKwlyYW5nZS0+bWluX3BtdCA9IDA7CisJcmFuZ2UtPm1heF9wbXQgPSA2NTUzNSAqIDEwMDA7CS8qID8/PyAqLworCXJhbmdlLT5wbXBfZmxhZ3MgPSBJV19QT1dFUl9QRVJJT0Q7CisJcmFuZ2UtPnBtdF9mbGFncyA9IElXX1BPV0VSX1RJTUVPVVQ7CisJcmFuZ2UtPnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwgSVdfUE9XRVJfVU5JQ0FTVF9SOwogCi0JCXJhbmdlLmVuY29kaW5nX3NpemVbMF0gPSBTTUFMTF9LRVlfU0laRTsKLQkJcmFuZ2UubnVtX2VuY29kaW5nX3NpemVzID0gMTsKLQotCQlpZiAocHJpdi0+aGFzX2JpZ193ZXApIHsKLQkJCXJhbmdlLmVuY29kaW5nX3NpemVbMV0gPSBMQVJHRV9LRVlfU0laRTsKLQkJCXJhbmdlLm51bV9lbmNvZGluZ19zaXplcyA9IDI7Ci0JCX0KLQl9IGVsc2UgewotCQlyYW5nZS5udW1fZW5jb2Rpbmdfc2l6ZXMgPSAwOwotCQlyYW5nZS5tYXhfZW5jb2RpbmdfdG9rZW5zID0gMDsKLQl9Ci0Jb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQkJCi0JcmFuZ2UubWluX3BtcCA9IDA7Ci0JcmFuZ2UubWF4X3BtcCA9IDY1NTM1MDAwOwotCXJhbmdlLm1pbl9wbXQgPSAwOwotCXJhbmdlLm1heF9wbXQgPSA2NTUzNSAqIDEwMDA7CS8qID8/PyAqLwotCXJhbmdlLnBtcF9mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKLQlyYW5nZS5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOwotCXJhbmdlLnBtX2NhcGEgPSBJV19QT1dFUl9QRVJJT0QgfCBJV19QT1dFUl9USU1FT1VUIHwgSVdfUE9XRVJfVU5JQ0FTVF9SOwotCi0JcmFuZ2UubnVtX3R4cG93ZXIgPSAxOwotCXJhbmdlLnR4cG93ZXJbMF0gPSAxNTsgLyogMTVkQm0gKi8KLQlyYW5nZS50eHBvd2VyX2NhcGEgPSBJV19UWFBPV19EQk07Ci0KLQlyYW5nZS5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MSUZFVElNRTsKLQlyYW5nZS5yZXRyeV9mbGFncyA9IElXX1JFVFJZX0xJTUlUOwotCXJhbmdlLnJfdGltZV9mbGFncyA9IElXX1JFVFJZX0xJRkVUSU1FOwotCXJhbmdlLm1pbl9yZXRyeSA9IDA7Ci0JcmFuZ2UubWF4X3JldHJ5ID0gNjU1MzU7CS8qID8/PyAqLwotCXJhbmdlLm1pbl9yX3RpbWUgPSAwOwotCXJhbmdlLm1heF9yX3RpbWUgPSA2NTUzNSAqIDEwMDA7CS8qID8/PyAqLwotCi0JaWYgKGNvcHlfdG9fdXNlcihycnEtPnBvaW50ZXIsICZyYW5nZSwgc2l6ZW9mKHJhbmdlKSkpCi0JCXJldHVybiAtRUZBVUxUOworCXJhbmdlLT5yZXRyeV9jYXBhID0gSVdfUkVUUllfTElNSVQgfCBJV19SRVRSWV9MSUZFVElNRTsKKwlyYW5nZS0+cmV0cnlfZmxhZ3MgPSBJV19SRVRSWV9MSU1JVDsKKwlyYW5nZS0+cl90aW1lX2ZsYWdzID0gSVdfUkVUUllfTElGRVRJTUU7CisJcmFuZ2UtPm1pbl9yZXRyeSA9IDA7CisJcmFuZ2UtPm1heF9yZXRyeSA9IDY1NTM1OwkvKiA/Pz8gKi8KKwlyYW5nZS0+bWluX3JfdGltZSA9IDA7CisJcmFuZ2UtPm1heF9yX3RpbWUgPSA2NTUzNSAqIDEwMDA7CS8qID8/PyAqLwogCiAJVFJBQ0VfRVhJVChkZXYtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgIHN0cnVjdCBpd19wb2ludCAqZXJxLAorCQkJCSAgICAgY2hhciAqa2V5YnVmKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpbmRleCA9IChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7CkBAIC0yNzc0LDggKzI4ODcsNyBAQAogCWludCBlbmFibGUgPSBwcml2LT53ZXBfb247CiAJaW50IHJlc3RyaWN0ZWQgPSBwcml2LT53ZXBfcmVzdHJpY3Q7CiAJdTE2IHhsZW4gPSAwOwotCWludCBlcnIgPSAwOwotCWNoYXIga2V5YnVmW09SSU5PQ09fTUFYX0tFWV9TSVpFXTsKKwlpbnQgZXJyID0gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoISBwcml2LT5oYXNfd2VwKQpAQCAtMjc4OCw5ICsyOTAwLDYgQEAKIAogCQlpZiAoIChlcnEtPmxlbmd0aCA+IFNNQUxMX0tFWV9TSVpFKSAmJiAhcHJpdi0+aGFzX2JpZ193ZXAgKQogCQkJcmV0dXJuIC1FMkJJRzsKLQkJCi0JCWlmIChjb3B5X2Zyb21fdXNlcihrZXlidWYsIGVycS0+cG9pbnRlciwgZXJxLT5sZW5ndGgpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCkBAIC0yODY0LDEyICsyOTczLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wb2ludCAqZXJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgc3RydWN0IGl3X3BvaW50ICplcnEsCisJCQkJICAgICBjaGFyICprZXlidWYpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGluZGV4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKIAl1MTYgeGxlbiA9IDA7Ci0JY2hhciBrZXlidWZbT1JJTk9DT19NQVhfS0VZX1NJWkVdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoISBwcml2LT5oYXNfd2VwKQpAQCAtMjg5OCw1MSArMzAwOSw0NyBAQAogCW1lbWNweShrZXlidWYsIHByaXYtPmtleXNbaW5kZXhdLmRhdGEsIE9SSU5PQ09fTUFYX0tFWV9TSVpFKTsKIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0KLQlpZiAoZXJxLT5wb2ludGVyKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoZXJxLT5wb2ludGVyLCBrZXlidWYsIHhsZW4pKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKmVycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRlc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVjdCBpd19wb2ludCAqZXJxLAorCQkJCSAgY2hhciAqZXNzaWRidWYpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JY2hhciBlc3NpZGJ1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogTm90ZSA6IEVTU0lEIGlzIGlnbm9yZWQgaW4gQWQtSG9jIGRlbW8gbW9kZSwgYnV0IHdlIGNhbiBzZXQgaXQKIAkgKiBhbnl3YXkuLi4gLSBKZWFuIElJICovCiAKLQltZW1zZXQoJmVzc2lkYnVmLCAwLCBzaXplb2YoZXNzaWRidWYpKTsKLQotCWlmIChlcnEtPmZsYWdzKSB7Ci0JCS8qIGl3Y29uZmlnIGluY2x1ZGVzIHRoZSBOVUwgaW4gdGhlIHNwZWNpZmllZCBsZW5ndGggKi8KLQkJaWYgKGVycS0+bGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUrMSkKLQkJCXJldHVybiAtRTJCSUc7Ci0JCQotCQlpZiAoY29weV9mcm9tX3VzZXIoJmVzc2lkYnVmLCBlcnEtPnBvaW50ZXIsIGVycS0+bGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWVzc2lkYnVmW0lXX0VTU0lEX01BWF9TSVpFXSA9ICdcMCc7Ci0JfQorCS8qIEh1bS4uLiBTaG91bGQgbm90IHVzZSBXaXJlbGVzcyBFeHRlbnNpb24gY29uc3RhbnQgKG1heSBjaGFuZ2UpLAorCSAqIHNob3VsZCB1c2Ugb3VyIG93bi4uLiAtIEplYW4gSUkgKi8KKwlpZiAoZXJxLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKIAogCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbWVtY3B5KHByaXYtPmRlc2lyZWRfZXNzaWQsIGVzc2lkYnVmLCBzaXplb2YocHJpdi0+ZGVzaXJlZF9lc3NpZCkpOworCS8qIE5VTEwgdGhlIHN0cmluZyAoZm9yIE5VTEwgdGVybWluYXRpb24gJiBFU1NJRCA9IEFOWSkgLSBKZWFuIElJICovCisJbWVtc2V0KHByaXYtPmRlc2lyZWRfZXNzaWQsIDAsIHNpemVvZihwcml2LT5kZXNpcmVkX2Vzc2lkKSk7CisKKwkvKiBJZiBub3QgQU5ZLCBnZXQgdGhlIG5ldyBFU1NJRCAqLworCWlmIChlcnEtPmZsYWdzKSB7CisJCW1lbWNweShwcml2LT5kZXNpcmVkX2Vzc2lkLCBlc3NpZGJ1ZiwgZXJxLT5sZW5ndGgpOworCX0KIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICplcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgaXdfcG9pbnQgKmVycSwKKwkJCQkgIGNoYXIgKmVzc2lkYnVmKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWNoYXIgZXNzaWRidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CiAJaW50IGFjdGl2ZTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjk1Niw1MSArMzA2Myw0NiBAQAogCX0gZWxzZSB7CiAJCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJbWVtY3B5KGVzc2lkYnVmLCBwcml2LT5kZXNpcmVkX2Vzc2lkLCBzaXplb2YoZXNzaWRidWYpKTsKKwkJbWVtY3B5KGVzc2lkYnVmLCBwcml2LT5kZXNpcmVkX2Vzc2lkLCBJV19FU1NJRF9NQVhfU0laRSArIDEpOwogCQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwogCX0KIAogCWVycS0+ZmxhZ3MgPSAxOwogCWVycS0+bGVuZ3RoID0gc3RybGVuKGVzc2lkYnVmKSArIDE7Ci0JaWYgKGVycS0+cG9pbnRlcikKLQkJaWYgKGNvcHlfdG9fdXNlcihlcnEtPnBvaW50ZXIsIGVzc2lkYnVmLCBlcnEtPmxlbmd0aCkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKIAogCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKIAkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldG5pY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BvaW50ICpucnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0bmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKm5ycSwKKwkJCQkgY2hhciAqbmlja2J1ZikKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQljaGFyIG5pY2tidWZbSVdfRVNTSURfTUFYX1NJWkUrMV07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChucnEtPmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQogCQlyZXR1cm4gLUUyQklHOwogCi0JbWVtc2V0KG5pY2tidWYsIDAsIHNpemVvZihuaWNrYnVmKSk7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIobmlja2J1ZiwgbnJxLT5wb2ludGVyLCBucnEtPmxlbmd0aCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jbmlja2J1ZltucnEtPmxlbmd0aF0gPSAnXDAnOwotCQogCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JbWVtY3B5KHByaXYtPm5pY2ssIG5pY2tidWYsIHNpemVvZihwcml2LT5uaWNrKSk7CisJbWVtc2V0KHByaXYtPm5pY2ssIDAsIHNpemVvZihwcml2LT5uaWNrKSk7CisJbWVtY3B5KHByaXYtPm5pY2ssIG5pY2tidWYsIG5ycS0+bGVuZ3RoKTsKIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0bmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKm5ycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRuaWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wb2ludCAqbnJxLAorCQkJCSBjaGFyICpuaWNrYnVmKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWNoYXIgbmlja2J1ZltJV19FU1NJRF9NQVhfU0laRSsxXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCkBAIC0zMDExLDIzICszMTEzLDIyIEBACiAKIAlucnEtPmxlbmd0aCA9IHN0cmxlbihuaWNrYnVmKSsxOwogCi0JaWYgKGNvcHlfdG9fdXNlcihucnEtPnBvaW50ZXIsIG5pY2tidWYsIHNpemVvZihuaWNrYnVmKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19mcmVxICpmcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfZnJlcSAqZnJxLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgY2hhbiA9IC0xOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KIAotCS8qIFdlIGNhbiBvbmx5IHVzZSB0aGlzIGluIEFkLUhvYyBkZW1vIG1vZGUgdG8gc2V0IHRoZSBvcGVyYXRpbmcKLQkgKiBmcmVxdWVuY3ksIG9yIGluIElCU1MgbW9kZSB0byBzZXQgdGhlIGZyZXF1ZW5jeSB3aGVyZSB0aGUgSUJTUwotCSAqIHdpbGwgYmUgY3JlYXRlZCAtIEplYW4gSUkgKi8KLQlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX0FESE9DKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJLyogSW4gaW5mcmFzdHJ1Y3R1cmUgbW9kZSB0aGUgQVAgc2V0cyB0aGUgY2hhbm5lbCAqLworCWlmIChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoIChmcnEtPmUgPT0gMCkgJiYgKGZycS0+bSA8PSAxMDAwKSApIHsKIAkJLyogU2V0dGluZyBieSBjaGFubmVsIG51bWJlciAqLwpAQCAtMzA1MSwxMyArMzE1Miw0NCBAQAogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CisKIAlwcml2LT5jaGFubmVsID0gY2hhbjsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJLyogRmFzdCBjaGFubmVsIGNoYW5nZSAtIG5vIGNvbW1pdCBpZiBzdWNjZXNzZnVsICovCisJCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKKwkJZXJyID0gaGVybWVzX2RvY21kX3dhaXQoaHcsIEhFUk1FU19DTURfVEVTVCB8CisJCQkJCSAgICBIRVJNRVNfVEVTVF9TRVRfQ0hBTk5FTCwKKwkJCQkJY2hhbiwgTlVMTCk7CisJfQogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfZnJlcSAqZnJxLAorCQkJCSBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgdG1wOworCisJLyogTG9ja2luZyBkb25lIGluIHRoZXJlICovCisJdG1wID0gb3Jpbm9jb19od19nZXRfZnJlcShwcml2KTsKKwlpZiAodG1wIDwgMCkgeworCQlyZXR1cm4gdG1wOworCX0KKworCWZycS0+bSA9IHRtcDsKKwlmcnEtPmUgPSAxOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqc3JxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNlbnMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BhcmFtICpzcnEsCisJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKQEAgLTMwODMsNyArMzIxNSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0c2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcGFyYW0gKnNycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRzZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqc3JxLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgdmFsID0gc3JxLT52YWx1ZTsKQEAgLTMxMDAsMTAgKzMyMzUsMTMgQEAKIAlwcml2LT5hcF9kZW5zaXR5ID0gdmFsOwogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BhcmFtICpycnEsCisJCQkJY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHZhbCA9IHJycS0+dmFsdWU7CkBAIC0zMTIxLDEzICszMjU5LDMwIEBACiAJcHJpdi0+cnRzX3RocmVzaCA9IHZhbDsKIAlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwogCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHJ0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJc3RydWN0IGl3X3BhcmFtICpycnEsCisJCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlycnEtPnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaDsKKwlycnEtPmRpc2FibGVkID0gKHJycS0+dmFsdWUgPT0gMjM0Nyk7CisJcnJxLT5maXhlZCA9IDE7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldGZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpmcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwKKwkJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGVyciA9IDA7CisJaW50IGVyciA9IC1FSU5QUk9HUkVTUzsJCS8qIENhbGwgY29tbWl0IGhhbmRsZXIgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCkBAIC0zMTU5LDExICszMzE0LDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldGZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpmcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKmZycSwKKwkJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OwotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAJdTE2IHZhbDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0zMTk2LDEwICszMzU0LDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwKKwkJCQkgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGVyciA9IDA7CiAJaW50IHJhdGVtb2RlID0gLTE7CiAJaW50IGJpdHJhdGU7IC8qIDEwMHMgb2Yga2lsb2JpdHMgKi8KIAlpbnQgaTsKQEAgLTMyMzUsMTAgKzMzOTUsMTMgQEAKIAlwcml2LT5iaXRyYXRlbW9kZSA9IHJhdGVtb2RlOwogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiAtRUlOUFJPR1JFU1M7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRyYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcnJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgc3RydWN0IGl3X3BhcmFtICpycnEsCisJCQkJIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKQEAgLTMzMDMsMTAgKzM0NjYsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpwcnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0cG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnBycSwKKwkJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBlcnIgPSAwOworCWludCBlcnIgPSAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQpAQCAtMzM1NSw3ICszNTIxLDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19wYXJhbSAqcHJxKQorc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgc3RydWN0IGl3X3BhcmFtICpwcnEsCisJCQkJICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CkBAIC0zNDAzLDcgKzM1NzIsMTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3BhcmFtICpycnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICBzdHJ1Y3QgaXdfcGFyYW0gKnJycSwKKwkJCQkgIGNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWhlcm1lc190ICpodyA9ICZwcml2LT5odzsKQEAgLTM0NTQsMTAgKzM2MjYsMzggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfc2V0aWJzc3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHZvaWQgKndycXUsCisJCQkgICAgICAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHZhbCA9ICooIChpbnQgKikgd3JxLT51Lm5hbWUgKTsKKworCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoaW5mby0+Y21kID09IChTSU9DSVdGSVJTVFBSSVYgKyAweDEpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRm9yY2luZyByZXNldCFcbiIsIGRldi0+bmFtZSk7CisKKwkJLyogRmlybXdhcmUgcmVzZXQgKi8KKwkJb3Jpbm9jb19yZXNldChkZXYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRm9yY2Ugc2NoZWR1bGluZyByZXNldCFcbiIsIGRldi0+bmFtZSk7CisKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd29yayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRpYnNzcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgIHZvaWQgKndycXUsCisJCQkJICAgICBjaGFyICpleHRyYSkKKworeworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCB2YWwgPSAqKCAoaW50ICopIGV4dHJhICk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQpAQCAtMzQ2OSwyOCArMzY2OSwyOCBAQAogCXNldF9wb3J0X3R5cGUocHJpdik7CiAKIAlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwotCXJldHVybiAwOworCXJldHVybiAtRUlOUFJPR1JFU1M7CQkvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpYnNzcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRpYnNzcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICAgIHZvaWQgKndycXUsCisJCQkJICAgICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgKnZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCi0JCXJldHVybiAtRUJVU1k7CisJaW50ICp2YWwgPSAoaW50ICopIGV4dHJhOwogCiAJKnZhbCA9IHByaXYtPmlic3NfcG9ydDsKLQlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRwb3J0MyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdyZXEgKndycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRwb3J0MyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgIHZvaWQgKndycXUsCisJCQkJICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOworCWludCB2YWwgPSAqKCAoaW50ICopIGV4dHJhICk7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMzUxOSw1MSArMzcxOSwxMzEgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAl9CiAKLQlpZiAoISBlcnIpCisJaWYgKCEgZXJyKSB7CiAJCS8qIEFjdHVhbGx5IHVwZGF0ZSB0aGUgbW9kZSB3ZSBhcmUgdXNpbmcgKi8KIAkJc2V0X3BvcnRfdHlwZShwcml2KTsKKwkJZXJyID0gLUVJTlBST0dSRVNTOworCX0KIAogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG9ydDMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3cmVxICp3cnEpCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cG9ydDMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICB2b2lkICp3cnF1LAorCQkJCSAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50ICp2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7CisJaW50ICp2YWwgPSAoaW50ICopIGV4dHJhOworCisJKnZhbCA9IHByaXYtPnByZWZlcl9wb3J0MzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHByZWFtYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICAgdm9pZCAqd3JxdSwKKwkJCQkgICAgIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZhbDsKKworCWlmICghIHByaXYtPmhhc19wcmVhbWJsZSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogODAyLjExYiBoYXMgcmVjZW50bHkgZGVmaW5lZCBzb21lIHNob3J0IHByZWFtYmxlLgorCSAqIEJhc2ljYWxseSwgdGhlIFBoeSBoZWFkZXIgaGFzIGJlZW4gcmVkdWNlZCBpbiBzaXplLgorCSAqIFRoaXMgaW5jcmVhc2UgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgYXQgaGlnaCByYXRlcworCSAqICh0aGUgcHJlYW1ibGUgaXMgdHJhbnNtaXR0ZWQgYXQgMU1iL3MpLCB1bmZvcnR1bmF0ZWx5CisJICogdGhpcyBnaXZlIGNvbXBhdGliaWxpdHkgdHJvdWJsZXMuLi4gLSBKZWFuIElJICovCisJdmFsID0gKiggKGludCAqKSBleHRyYSApOwogCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CiAKLQkqdmFsID0gcHJpdi0+cHJlZmVyX3BvcnQzOworCWlmICh2YWwpCisJCXByaXYtPnByZWFtYmxlID0gMTsKKwllbHNlCisJCXByaXYtPnByZWFtYmxlID0gMDsKKwogCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOwkJLyogQ2FsbCBjb21taXQgaGFuZGxlciAqLworfQorCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cHJlYW1ibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgICB2b2lkICp3cnF1LAorCQkJCSAgICAgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50ICp2YWwgPSAoaW50ICopIGV4dHJhOworCisJaWYgKCEgcHJpdi0+aGFzX3ByZWFtYmxlKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkqdmFsID0gcHJpdi0+cHJlYW1ibGU7CiAJcmV0dXJuIDA7CiB9CiAKKy8qIGlvY3RsIGludGVyZmFjZSB0byBoZXJtZXNfcmVhZF9sdHYoKQorICogVG8gdXNlIHdpdGggaXdwcml2LCBwYXNzIHRoZSBSSUQgYXMgdGhlIHRva2VuIGFyZ3VtZW50LCBlLmcuCisgKiBpd3ByaXYgZ2V0X3JpZCBbMHhmYzAwXQorICogQXQgbGVhc3QgV2lyZWxlc3MgVG9vbHMgMjUgaXMgcmVxdWlyZWQgdG8gdXNlIGl3cHJpdi4KKyAqIEZvciBXaXJlbGVzcyBUb29scyAyNSBhbmQgMjYgYXBwZW5kICJkdW1teSIgYXJlIHRoZSBlbmQuICovCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0cmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsCisJCQkJY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaGVybWVzX3QgKmh3ID0gJnByaXYtPmh3OworCWludCByaWQgPSBkYXRhLT5mbGFnczsKKwl1MTYgbGVuZ3RoOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIEl0J3MgYSAiZ2V0IiBmdW5jdGlvbiwgYnV0IHdlIGRvbid0IHdhbnQgdXNlcnMgdG8gYWNjZXNzIHRoZQorCSAqIFdFUCBrZXkgYW5kIG90aGVyIHJhdyBmaXJtd2FyZSBkYXRhICovCisJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChyaWQgPCAweGZjMDAgfHwgcmlkID4gMHhmZmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gaGVybWVzX3JlYWRfbHR2KGh3LCBVU0VSX0JBUCwgcmlkLCBNQVhfUklEX0xFTiwgJmxlbmd0aCwKKwkJCSAgICAgIGV4dHJhKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRhdGEtPmxlbmd0aCA9IG1pbl90KHUxNiwgSEVSTUVTX1JFQ0xFTl9UT19CWVRFUyhsZW5ndGgpLAorCQkJICAgICBNQVhfUklEX0xFTik7CisKKyBvdXQ6CisJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQorCiAvKiBTcHkgaXMgdXNlZCBmb3IgbGluayBxdWFsaXR5L3N0cmVuZ3RoIG1lYXN1cmVtZW50cyBpbiBBZC1Ib2MgbW9kZQogICogSmVhbiBJSSAqLwotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX3NldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnNycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRzcHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBpd19wb2ludCAqc3JxLAorCQkJCWNoYXIgKmV4dHJhKQorCiB7CiAJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyIGFkZHJlc3NbSVdfTUFYX1NQWV07CisJc3RydWN0IHNvY2thZGRyICphZGRyZXNzID0gKHN0cnVjdCBzb2NrYWRkciAqKSBleHRyYTsKIAlpbnQgbnVtYmVyID0gc3JxLT5sZW5ndGg7CiAJaW50IGk7Ci0JaW50IGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIENoZWNrIHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzICovCi0JaWYgKG51bWJlciA+IElXX01BWF9TUFkpCi0JCXJldHVybiAtRTJCSUc7Ci0KLQkvKiBHZXQgdGhlIGRhdGEgaW4gdGhlIGRyaXZlciAqLwotCWlmIChzcnEtPnBvaW50ZXIpIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGFkZHJlc3MsIHNycS0+cG9pbnRlciwKLQkJCQkgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlcikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KIAkvKiBNYWtlIHN1cmUgbm9ib2R5IG1lc3Mgd2l0aCB0aGUgc3RydWN0dXJlIHdoaWxlIHdlIGRvICovCiAJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCiAJCXJldHVybiAtRUJVU1k7CkBAIC0zNTg3LDE0ICszODY3LDE3IEBACiAJLyogTm93LCBsZXQgdGhlIG90aGVycyBwbGF5ICovCiAJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKIAotCXJldHVybiBlcnI7CisJLyogRG8gTk9UIGNhbGwgY29tbWl0IGhhbmRsZXIgKi8KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2dldHNweShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcG9pbnQgKnNycSkKK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9nZXRzcHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXN0cnVjdCBpd19wb2ludCAqc3JxLAorCQkJCWNoYXIgKmV4dHJhKQogewogCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzb2NrYWRkciBhZGRyZXNzW0lXX01BWF9TUFldOwotCXN0cnVjdCBpd19xdWFsaXR5IHNweV9zdGF0W0lXX01BWF9TUFldOworCXN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgZXh0cmE7CiAJaW50IG51bWJlcjsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMzYwMyw3ICszODg2LDEyIEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAludW1iZXIgPSBwcml2LT5zcHlfbnVtYmVyOwotCWlmICgobnVtYmVyID4gMCkgJiYgKHNycS0+cG9pbnRlcikpIHsKKwkvKiBDcmVhdGUgYWRkcmVzcyBzdHJ1Y3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKKwkJbWVtY3B5KGFkZHJlc3NbaV0uc2FfZGF0YSwgcHJpdi0+c3B5X2FkZHJlc3NbaV0sIEVUSF9BTEVOKTsKKwkJYWRkcmVzc1tpXS5zYV9mYW1pbHkgPSBBRl9VTklYOworCX0KKwlpZiAobnVtYmVyID4gMCkgewogCQkvKiBDcmVhdGUgYWRkcmVzcyBzdHJ1Y3QgKi8KIAkJZm9yIChpID0gMDsgaSA8IG51bWJlcjsgaSsrKSB7CiAJCQltZW1jcHkoYWRkcmVzc1tpXS5zYV9kYXRhLCBwcml2LT5zcHlfYWRkcmVzc1tpXSwKQEAgLTM2MTQsMzQ0ICszOTAyLDUwMyBAQAogCQkvKiBJbiB0aGVvcnksIHdlIHNob3VsZCBkaXNhYmxlIGlycXMgd2hpbGUgY29weWluZyB0aGUgc3RhdHMKIAkJICogYmVjYXVzZSB0aGUgcnggcGF0aCBtaWdodCB1cGRhdGUgaXQgaW4gdGhlIG1pZGRsZS4uLgogCQkgKiBCYWgsIHdobyBjYXJlID8gLSBKZWFuIElJICovCi0JCW1lbWNweSgmc3B5X3N0YXQsIHByaXYtPnNweV9zdGF0LAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIElXX01BWF9TUFkpOwotCQlmb3IgKGk9MDsgaSA8IG51bWJlcjsgaSsrKQotCQkJcHJpdi0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDA7CisJCW1lbWNweShleHRyYSAgKyAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiBudW1iZXIpLAorCQkgICAgICAgcHJpdi0+c3B5X3N0YXQsIHNpemVvZihzdHJ1Y3QgaXdfcXVhbGl0eSkgKiBudW1iZXIpOwogCX0KKwkvKiBSZXNldCB1cGRhdGVkIGZsYWdzLiAqLworCWZvciAoaSA9IDA7IGkgPCBudW1iZXI7IGkrKykKKwkJcHJpdi0+c3B5X3N0YXRbaV0udXBkYXRlZCA9IDA7CiAKIAlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOwogCi0JLyogUHVzaCBzdHVmZiB0byB1c2VyIHNwYWNlICovCiAJc3JxLT5sZW5ndGggPSBudW1iZXI7Ci0JaWYoY29weV90b191c2VyKHNycS0+cG9pbnRlciwgYWRkcmVzcywKLQkJCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSAqIG51bWJlcikpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmKGNvcHlfdG9fdXNlcihzcnEtPnBvaW50ZXIgKyAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikqbnVtYmVyKSwKLQkJCSZzcHlfc3RhdCwgc2l6ZW9mKHN0cnVjdCBpd19xdWFsaXR5KSAqIG51bWJlcikpCi0JCXJldHVybiAtRUZBVUxUOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLW9yaW5vY29faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKKy8qIFRyaWdnZXIgYSBzY2FuIChsb29rIGZvciBvdGhlciBjZWxscyBpbiB0aGUgdmljaW5pdHkgKi8KK3N0YXRpYyBpbnQgb3Jpbm9jb19pb2N0bF9zZXRzY2FuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHN0cnVjdCBpd19wYXJhbSAqc3JxLAorCQkJCSBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilycTsKKwloZXJtZXNfdCAqaHcgPSAmcHJpdi0+aHc7CiAJaW50IGVyciA9IDA7Ci0JaW50IHRtcDsKLQlpbnQgY2hhbmdlZCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCVRSQUNFX0VOVEVSKGRldi0+bmFtZSk7CisJLyogTm90ZSA6IHlvdSBtYXkgaGF2ZSByZWFsaXNlZCB0aGF0LCBhcyB0aGlzIGlzIGEgU0VUIG9wZXJhdGlvbiwKKwkgKiB0aGlzIGlzIHByaXZpbGVkZ2VkIGFuZCB0aGVyZWZvcmUgYSBub3JtYWwgdXNlciBjYW4ndAorCSAqIHBlcmZvcm0gc2Nhbm5pbmcuCisJICogVGhpcyBpcyBub3QgYW4gZXJyb3IsIHdoaWxlIHRoZSBkZXZpY2UgcGVyZm9ybSBzY2FubmluZywKKwkgKiB0cmFmZmljIGRvZXNuJ3QgZmxvdywgc28gaXQncyBhIHBlcmZlY3QgRG9TLi4uCisJICogSmVhbiBJSSAqLwogCi0JLyogSW4gdGhlb3J5LCB3ZSBjb3VsZCBhbGxvdyBtb3N0IG9mIHRoZSB0aGUgU0VUIHN0dWZmIHRvIGJlCi0JICogZG9uZS4gSW4gcHJhY3RpY2UsIHRoZSBsYXBzZSBvZiB0aW1lIGF0IHN0YXJ0dXAgd2hlbiB0aGUKLQkgKiBjYXJkIGlzIG5vdCByZWFkeSBpcyB2ZXJ5IHNob3J0LCBzbyB3aHkgYm90aGVyLi4uICBOb3RlCi0JICogdGhhdCBuZXRpZl9kZXZpY2VfcHJlc2VudCBpcyBkaWZmZXJlbnQgZnJvbSB1cC9kb3duCi0JICogKGlmY29uZmlnKSwgd2hlbiB0aGUgZGV2aWNlIGlzIG5vdCB5ZXQgdXAsIGl0IGlzIHVzdWFsbHkKLQkgKiBhbHJlYWR5IHJlYWR5Li4uICBKZWFuIElJICovCi0JaWYgKCEgbmV0aWZfZGV2aWNlX3ByZXNlbnQoZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCisJCXJldHVybiAtRUJVU1k7CiAKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0lPQ0dJV05BTUU6Ci0JCXN0cmNweSh3cnEtPnUubmFtZSwgIklFRUUgODAyLjExLURTIik7Ci0JCWJyZWFrOwotCQkKLQljYXNlIFNJT0NHSVdBUDoKLQkJd3JxLT51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQllcnIgPSBvcmlub2NvX2h3X2dldF9ic3NpZChwcml2LCB3cnEtPnUuYXBfYWRkci5zYV9kYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdSQU5HRToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlKGRldiwgJndycS0+dS5kYXRhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdNT0RFOgotCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCXN3aXRjaCAod3JxLT51Lm1vZGUpIHsKLQkJY2FzZSBJV19NT0RFX0FESE9DOgotCQkJaWYgKCEgKHByaXYtPmhhc19pYnNzIHx8IHByaXYtPmhhc19wb3J0MykgKQotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQllbHNlIHsKLQkJCQlwcml2LT5pd19tb2RlID0gSVdfTU9ERV9BREhPQzsKLQkJCQljaGFuZ2VkID0gMTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSVdfTU9ERV9JTkZSQToKLQkJCXByaXYtPml3X21vZGUgPSBJV19NT0RFX0lORlJBOwotCQkJY2hhbmdlZCA9IDE7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXNldF9wb3J0X3R5cGUocHJpdik7Ci0JCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXTU9ERToKLQkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCi0JCQlyZXR1cm4gLUVCVVNZOwotCQl3cnEtPnUubW9kZSA9IHByaXYtPml3X21vZGU7Ci0JCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXRU5DT0RFOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGl3ZW5jb2RlKGRldiwgJndycS0+dS5lbmNvZGluZyk7Ci0JCWlmICghIGVycikKLQkJCWNoYW5nZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV0VOQ09ERToKLQkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewotCQkJZXJyID0gLUVQRVJNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGl3ZW5jb2RlKGRldiwgJndycS0+dS5lbmNvZGluZyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXRVNTSUQ6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXRVNTSUQ6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0ZXNzaWQoZGV2LCAmd3JxLT51LmVzc2lkKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdOSUNLTjoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRuaWNrKGRldiwgJndycS0+dS5kYXRhKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXTklDS046Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0bmljayhkZXYsICZ3cnEtPnUuZGF0YSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXRlJFUToKLQkJdG1wID0gb3Jpbm9jb19od19nZXRfZnJlcShwcml2KTsKLQkJaWYgKHRtcCA8IDApIHsKLQkJCWVyciA9IHRtcDsKLQkJfSBlbHNlIHsKLQkJCXdycS0+dS5mcmVxLm0gPSB0bXA7Ci0JCQl3cnEtPnUuZnJlcS5lID0gMTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV0ZSRVE6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0ZnJlcShkZXYsICZ3cnEtPnUuZnJlcSk7Ci0JCWlmICghIGVycikKLQkJCWNoYW5nZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1NFTlM6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0c2VucyhkZXYsICZ3cnEtPnUuc2Vucyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXU0VOUzoKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRzZW5zKGRldiwgJndycS0+dS5zZW5zKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXUlRTOgotCQl3cnEtPnUucnRzLnZhbHVlID0gcHJpdi0+cnRzX3RocmVzaDsKLQkJd3JxLT51LnJ0cy5kaXNhYmxlZCA9ICh3cnEtPnUucnRzLnZhbHVlID09IDIzNDcpOwotCQl3cnEtPnUucnRzLmZpeGVkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdSVFM6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cnRzKGRldiwgJndycS0+dS5ydHMpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTSVdGUkFHOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGZyYWcoZGV2LCAmd3JxLT51LmZyYWcpOwotCQlpZiAoISBlcnIpCi0JCQljaGFuZ2VkID0gMTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdGUkFHOgotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGZyYWcoZGV2LCAmd3JxLT51LmZyYWcpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV1JBVEU6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cmF0ZShkZXYsICZ3cnEtPnUuYml0cmF0ZSk7Ci0JCWlmICghIGVycikKLQkJCWNoYW5nZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1JBVEU6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cmF0ZShkZXYsICZ3cnEtPnUuYml0cmF0ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DU0lXUE9XRVI6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfc2V0cG93ZXIoZGV2LCAmd3JxLT51LnBvd2VyKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR0lXUE9XRVI6Ci0JCWVyciA9IG9yaW5vY29faW9jdGxfZ2V0cG93ZXIoZGV2LCAmd3JxLT51LnBvd2VyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdUWFBPVzoKLQkJLyogVGhlIGNhcmQgb25seSBzdXBwb3J0cyBvbmUgdHggcG93ZXIsIHNvIHRoaXMgaXMgZWFzeSAqLwotCQl3cnEtPnUudHhwb3dlci52YWx1ZSA9IDE1OyAvKiBkQm0gKi8KLQkJd3JxLT51LnR4cG93ZXIuZml4ZWQgPSAxOwotCQl3cnEtPnUudHhwb3dlci5kaXNhYmxlZCA9IDA7Ci0JCXdycS0+dS50eHBvd2VyLmZsYWdzID0gSVdfVFhQT1dfREJNOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV1JFVFJZOgotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NHSVdSRVRSWToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRyZXRyeShkZXYsICZ3cnEtPnUucmV0cnkpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ1NJV1NQWToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRzcHkoZGV2LCAmd3JxLT51LmRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1NQWToKLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRzcHkoZGV2LCAmd3JxLT51LmRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0dJV1BSSVY6Ci0JCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7Ci0JCQlzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXZ0YWJbXSA9IHsKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MCwgMCwgMCwgImZvcmNlX3Jlc2V0IiB9LAotCQkJCXsgU0lPQ0lXRklSU1RQUklWICsgMHgxLCAwLCAwLCAiY2FyZF9yZXNldCIgfSwKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MiwKLQkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkJCSAgMCwgInNldF9wb3J0MyIgfSwKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4MywgMCwKLQkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkJCSAgImdldF9wb3J0MyIgfSwKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NCwKLQkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkJCSAgMCwgInNldF9wcmVhbWJsZSIgfSwKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NSwgMCwKLQkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkJCSAgImdldF9wcmVhbWJsZSIgfSwKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NiwKLQkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkJCSAgMCwgInNldF9pYnNzcG9ydCIgfSwKLQkJCQl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NywgMCwKLQkJCQkgIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCQkJCSAgImdldF9pYnNzcG9ydCIgfSwKLQkJCX07Ci0KLQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IHNpemVvZihwcml2dGFiKSAvIHNpemVvZihwcml2dGFiWzBdKTsKLQkJCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgcHJpdnRhYiwgc2l6ZW9mKHByaXZ0YWIpKSkKLQkJCQllcnIgPSAtRUZBVUxUOwotCQl9Ci0JCWJyZWFrOwotCSAgICAgICAKLQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MDogLyogZm9yY2VfcmVzZXQgKi8KLQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MTogLyogY2FyZF9yZXNldCAqLwotCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7Ci0JCQllcnIgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCQkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGb3JjZSBzY2hlZHVsaW5nIHJlc2V0IVxuIiwgZGV2LT5uYW1lKTsKLQotCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NJV0ZJUlNUUFJJViArIDB4MjogLyogc2V0X3BvcnQzICovCi0JCWlmICghIGNhcGFibGUoQ0FQX05FVF9BRE1JTikpIHsKLQkJCWVyciA9IC1FUEVSTTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9zZXRwb3J0MyhkZXYsIHdycSk7Ci0JCWlmICghIGVycikKLQkJCWNoYW5nZWQgPSAxOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHgzOiAvKiBnZXRfcG9ydDMgKi8KLQkJZXJyID0gb3Jpbm9jb19pb2N0bF9nZXRwb3J0MyhkZXYsIHdycSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDQ6IC8qIHNldF9wcmVhbWJsZSAqLwotCQlpZiAoISBjYXBhYmxlKENBUF9ORVRfQURNSU4pKSB7Ci0JCQllcnIgPSAtRVBFUk07Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIDgwMi4xMWIgaGFzIHJlY2VudGx5IGRlZmluZWQgc29tZSBzaG9ydCBwcmVhbWJsZS4KLQkJICogQmFzaWNhbGx5LCB0aGUgUGh5IGhlYWRlciBoYXMgYmVlbiByZWR1Y2VkIGluIHNpemUuCi0JCSAqIFRoaXMgaW5jcmVhc2UgcGVyZm9ybWFuY2UsIGVzcGVjaWFsbHkgYXQgaGlnaCByYXRlcwotCQkgKiAodGhlIHByZWFtYmxlIGlzIHRyYW5zbWl0dGVkIGF0IDFNYi9zKSwgdW5mb3J0dW5hdGVseQotCQkgKiB0aGlzIGdpdmUgY29tcGF0aWJpbGl0eSB0cm91Ymxlcy4uLiAtIEplYW4gSUkgKi8KLQkJaWYocHJpdi0+aGFzX3ByZWFtYmxlKSB7Ci0JCQlpbnQgdmFsID0gKiggKGludCAqKSB3cnEtPnUubmFtZSApOwotCi0JCQlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCQkJaWYgKHZhbCkKLQkJCQlwcml2LT5wcmVhbWJsZSA9IDE7Ci0JCQllbHNlCi0JCQkJcHJpdi0+cHJlYW1ibGUgPSAwOwotCQkJb3Jpbm9jb191bmxvY2socHJpdiwgJmZsYWdzKTsKLQkJCWNoYW5nZWQgPSAxOwotCQl9IGVsc2UKLQkJCWVyciA9IC1FT1BOT1RTVVBQOwotCQlicmVhazsKLQotCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHg1OiAvKiBnZXRfcHJlYW1ibGUgKi8KLQkJaWYocHJpdi0+aGFzX3ByZWFtYmxlKSB7Ci0JCQlpbnQgKnZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKLQotCQkJaWYgKG9yaW5vY29fbG9jayhwcml2LCAmZmxhZ3MpICE9IDApCi0JCQkJcmV0dXJuIC1FQlVTWTsKLQkJCSp2YWwgPSBwcml2LT5wcmVhbWJsZTsKLQkJCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7Ci0JCX0gZWxzZQotCQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWJyZWFrOwotCWNhc2UgU0lPQ0lXRklSU1RQUklWICsgMHg2OiAvKiBzZXRfaWJzc3BvcnQgKi8KLQkJaWYgKCEgY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewotCQkJZXJyID0gLUVQRVJNOwotCQkJYnJlYWs7Ci0JCX0KLQotCQllcnIgPSBvcmlub2NvX2lvY3RsX3NldGlic3Nwb3J0KGRldiwgd3JxKTsKLQkJaWYgKCEgZXJyKQotCQkJY2hhbmdlZCA9IDE7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DSVdGSVJTVFBSSVYgKyAweDc6IC8qIGdldF9pYnNzcG9ydCAqLwotCQllcnIgPSBvcmlub2NvX2lvY3RsX2dldGlic3Nwb3J0KGRldiwgd3JxKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkvKiBTY2FubmluZyB3aXRoIHBvcnQgMCBkaXNhYmxlZCB3b3VsZCBmYWlsICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJZXJyID0gLUVORVRET1dOOworCQlnb3RvIG91dDsKIAl9Ci0JCi0JaWYgKCEgZXJyICYmIGNoYW5nZWQgJiYgbmV0aWZfcnVubmluZyhkZXYpKSB7Ci0JCWVyciA9IG9yaW5vY29fcmVjb25maWd1cmUoZGV2KTsKLQl9CQkKIAotCVRSQUNFX0VYSVQoZGV2LT5uYW1lKTsKKwkvKiBJbiBtb25pdG9yIG1vZGUsIHRoZSBzY2FuIHJlc3VsdHMgYXJlIGFsd2F5cyBlbXB0eS4KKwkgKiBQcm9iZSByZXNwb25zZXMgYXJlIHBhc3NlZCB0byB0aGUgZHJpdmVyIGFzIHJlY2VpdmVkCisJICogZnJhbWVzIGFuZCBjb3VsZCBiZSBwcm9jZXNzZWQgaW4gc29mdHdhcmUuICovCisJaWYgKHByaXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CiAKKwkvKiBOb3RlIDogYmVjYXVzZSB3ZSBkb24ndCBsb2NrIG91dCB0aGUgaXJxIGhhbmRsZXIsIHRoZSB3YXkKKwkgKiB3ZSBhY2Nlc3Mgc2NhbiB2YXJpYWJsZXMgaW4gcHJpdiBpcyBjcml0aWNhbC4KKwkgKglvIHNjYW5faW5wcm9ncmVzcyA6IG5vdCB0b3VjaGVkIGJ5IGlycSBoYW5kbGVyCisJICoJbyBzY2FuX21vZGUgOiBub3QgdG91Y2hlZCBieSBpcnEgaGFuZGxlcgorCSAqCW8gc2Nhbl9yZXN1bHQgOiBpcnEgaXMgc3RyaWN0IHByb2R1Y2VyLCBub24taXJxIGlzIHN0cmljdAorCSAqCQljb25zdW1lci4KKwkgKglvIHNjYW5fbGVuIDogc3luY2hyb25pc2VkIHdpdGggc2Nhbl9yZXN1bHQKKwkgKiBCZWZvcmUgbW9kaWZ5aW5nIGFueXRoaW5nIG9uIHRob3NlIHZhcmlhYmxlcywgcGxlYXNlIHRoaW5rIGhhcmQgIQorCSAqIEplYW4gSUkgKi8KKworCS8qIElmIHRoZXJlIGlzIHN0aWxsIHNvbWUgbGVmdC1vdmVyIHNjYW4gcmVzdWx0cywgZ2V0IHJpZCBvZiBpdCAqLworCWlmIChwcml2LT5zY2FuX3Jlc3VsdCAhPSBOVUxMKSB7CisJCS8qIFdoYXQncyBsaWtlbHkgaXMgdGhhdCBhIGNsaWVudCBkaWQgY3Jhc2ggb3Igd2FzIGtpbGxlZAorCQkgKiBiZXR3ZWVuIHRyaWdnZXJpbmcgdGhlIHNjYW4gcmVxdWVzdCBhbmQgcmVhZGluZyB0aGUKKwkJICogcmVzdWx0cywgc28gd2UgbmVlZCB0byByZXNldCBldmVyeXRoaW5nLgorCQkgKiBTb21lIGNsaWVudHMgdGhhdCBhcmUgdG9vIHNsb3cgbWF5IHN1ZmZlciBmcm9tIHRoYXQuLi4KKwkJICogSmVhbiBJSSAqLworCQlrZnJlZShwcml2LT5zY2FuX3Jlc3VsdCk7CisJCXByaXYtPnNjYW5fcmVzdWx0ID0gTlVMTDsKKwl9CisKKwkvKiBTYXZlIGZsYWdzICovCisJcHJpdi0+c2Nhbl9tb2RlID0gc3JxLT5mbGFnczsKKworCS8qIEFsd2F5cyB0cmlnZ2VyIHNjYW5uaW5nLCBldmVuIGlmIGl0J3MgaW4gcHJvZ3Jlc3MuCisJICogVGhpcyB3YXksIGlmIHRoZSBpbmZvIGZyYW1lIGdldCBsb3N0LCB3ZSB3aWxsIHJlY292ZXIgc29tZXdoYXQKKwkgKiBncmFjZWZ1bGx5ICAtIEplYW4gSUkgKi8KKworCWlmIChwcml2LT5oYXNfaG9zdHNjYW4pIHsKKwkJc3dpdGNoIChwcml2LT5maXJtd2FyZV90eXBlKSB7CisJCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCQllcnIgPSBoZXJtZXNfd3JpdGVfd29yZHJlYyhodywgVVNFUl9CQVAsCisJCQkJCQkgICBIRVJNRVNfUklEX0NORkhPU1RTQ0FOX1NZTUJPTCwKKwkJCQkJCSAgIEhFUk1FU19IT1NUU0NBTl9TWU1CT0xfT05DRSB8CisJCQkJCQkgICBIRVJNRVNfSE9TVFNDQU5fU1lNQk9MX0JDQVNUKTsKKwkJCWJyZWFrOworCQljYXNlIEZJUk1XQVJFX1RZUEVfSU5URVJTSUw6IHsKKwkJCXUxNiByZXFbM107CisKKwkJCXJlcVswXSA9IGNwdV90b19sZTE2KDB4M2ZmZik7CS8qIEFsbCBjaGFubmVscyAqLworCQkJcmVxWzFdID0gY3B1X3RvX2xlMTYoMHgwMDAxKTsJLyogcmF0ZSAxIE1icHMgKi8KKwkJCXJlcVsyXSA9IDA7CQkJLyogQW55IEVTU0lEICovCisJCQllcnIgPSBIRVJNRVNfV1JJVEVfUkVDT1JEKGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgSEVSTUVTX1JJRF9DTkZIT1NUU0NBTiwgJnJlcSk7CisJCX0KKwkJYnJlYWs7CisJCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKKwkJCWVyciA9IGhlcm1lc193cml0ZV93b3JkcmVjKGh3LCBVU0VSX0JBUCwKKwkJCQkJCSAgIEhFUk1FU19SSURfQ05GU0NBTlNTSURfQUdFUkUsCisJCQkJCQkgICAwKTsJLyogQW55IEVTU0lEICovCisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCisJCQllcnIgPSBoZXJtZXNfaW5xdWlyZShodywgSEVSTUVTX0lOUV9TQ0FOKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlCisJCWVyciA9IGhlcm1lc19pbnF1aXJlKGh3LCBIRVJNRVNfSU5RX1NDQU4pOworCisJLyogT25lIG1vcmUgY2xpZW50ICovCisJaWYgKCEgZXJyKQorCQlwcml2LT5zY2FuX2lucHJvZ3Jlc3MgPSAxOworCisgb3V0OgorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CiAJcmV0dXJuIGVycjsKIH0KIAorLyogVHJhbnNsYXRlIHNjYW4gZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBjYXJkIHRvIGEgY2FyZCBpbmRlcGVuZGFudAorICogZm9ybWF0IHRoYXQgdGhlIFdpcmVsZXNzIFRvb2xzIHdpbGwgdW5kZXJzdGFuZCAtIEplYW4gSUkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9yaW5vY29fdHJhbnNsYXRlX3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJIGNoYXIgKmJ1ZmZlciwKKwkJCQkJIGNoYXIgKnNjYW4sCisJCQkJCSBpbnQgc2Nhbl9sZW4pCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50CQkJb2Zmc2V0OwkJLyogSW4gdGhlIHNjYW4gZGF0YSAqLworCXVuaW9uIGhlcm1lc19zY2FuX2luZm8gKmF0b207CisJaW50CQkJYXRvbV9sZW47CisJdTE2CQkJY2FwYWJpbGl0aWVzOworCXUxNgkJCWNoYW5uZWw7CisJc3RydWN0IGl3X2V2ZW50CQlpd2U7CQkvKiBUZW1wb3JhcnkgYnVmZmVyICovCisJY2hhciAqCQkJY3VycmVudF9ldiA9IGJ1ZmZlcjsKKwljaGFyICoJCQllbmRfYnVmID0gYnVmZmVyICsgSVdfU0NBTl9NQVhfREFUQTsKKworCXN3aXRjaCAocHJpdi0+ZmlybXdhcmVfdHlwZSkgeworCWNhc2UgRklSTVdBUkVfVFlQRV9BR0VSRToKKwkJYXRvbV9sZW4gPSBzaXplb2Yoc3RydWN0IGFnZXJlX3NjYW5fYXBpbmZvKTsKKyAJCW9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9TWU1CT0w6CisJCS8qIExhY2sgb2YgZG9jdW1lbnRhdGlvbiBuZWNlc3NpdGF0ZXMgdGhpcyBoYWNrLgorCQkgKiBEaWZmZXJlbnQgZmlybXdhcmVzIGhhdmUgNjggb3IgNzYgYnl0ZSBsb25nIGF0b21zLgorCQkgKiBXZSB0cnkgbW9kdWxvIGZpcnN0LiAgSWYgdGhlIGxlbmd0aCBkaXZpZGVzIGJ5IGJvdGgsCisJCSAqIHdlIGNoZWNrIHdoYXQgd291bGQgYmUgdGhlIGNoYW5uZWwgaW4gdGhlIHNlY29uZAorCQkgKiBmcmFtZSBmb3IgYSA2OC1ieXRlIGF0b20uICA3Ni1ieXRlIGF0b21zIGhhdmUgMCB0aGVyZS4KKwkJICogVmFsaWQgY2hhbm5lbCBjYW5ub3QgYmUgMC4gICovCisJCWlmIChzY2FuX2xlbiAlIDc2KQorCQkJYXRvbV9sZW4gPSA2ODsKKwkJZWxzZSBpZiAoc2Nhbl9sZW4gJSA2OCkKKwkJCWF0b21fbGVuID0gNzY7CisJCWVsc2UgaWYgKHNjYW5fbGVuID49IDEyOTIgJiYgc2Nhbls2OF0gPT0gMCkKKwkJCWF0b21fbGVuID0gNzY7CisJCWVsc2UKKwkJCWF0b21fbGVuID0gNjg7CisJCW9mZnNldCA9IDA7CisJCWJyZWFrOworCWNhc2UgRklSTVdBUkVfVFlQRV9JTlRFUlNJTDoKKwkJb2Zmc2V0ID0gNDsKKwkJaWYgKHByaXYtPmhhc19ob3N0c2NhbikKKwkJCWF0b21fbGVuID0gc2NhblswXSArIChzY2FuWzFdIDw8IDgpOworCQllbHNlCisJCQlhdG9tX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBwcmlzbTJfc2Nhbl9hcGluZm8sIGF0aW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHdlIGdvdCBhbiB3aG9sZSBudW1iZXIgb2YgYXRvbXMgKi8KKwlpZiAoKHNjYW5fbGVuIC0gb2Zmc2V0KSAlIGF0b21fbGVuKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuZXhwZWN0ZWQgc2NhbiBkYXRhIGxlbmd0aCAlZCwgIgorCQkgICAgICAgImF0b21fbGVuICVkLCBvZmZzZXQgJWRcbiIsIGRldi0+bmFtZSwgc2Nhbl9sZW4sCisJCSAgICAgICBhdG9tX2xlbiwgb2Zmc2V0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogUmVhZCB0aGUgZW50cmllcyBvbmUgYnkgb25lICovCisJZm9yICg7IG9mZnNldCArIGF0b21fbGVuIDw9IHNjYW5fbGVuOyBvZmZzZXQgKz0gYXRvbV9sZW4pIHsKKwkJLyogR2V0IG5leHQgYXRvbSAqLworCQlhdG9tID0gKHVuaW9uIGhlcm1lc19zY2FuX2luZm8gKikgKHNjYW4gKyBvZmZzZXQpOworCisJCS8qIEZpcnN0IGVudHJ5ICpNVVNUKiBiZSB0aGUgQVAgTUFDIGFkZHJlc3MgKi8KKwkJaXdlLmNtZCA9IFNJT0NHSVdBUDsKKwkJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGF0b20tPmEuYnNzaWQsIEVUSF9BTEVOKTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKworCQkvKiBPdGhlciBlbnRyaWVzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB3ZSBnaXZlIHRoZW0gKi8KKworCQkvKiBBZGQgdGhlIEVTU0lEICovCisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbGUxNl90b19jcHUoYXRvbS0+YS5lc3NpZF9sZW4pOworCQlpZiAoaXdlLnUuZGF0YS5sZW5ndGggPiAzMikKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gMzI7CisJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CisJCWl3ZS51LmRhdGEuZmxhZ3MgPSAxOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgYXRvbS0+YS5lc3NpZCk7CisKKwkJLyogQWRkIG1vZGUgKi8KKwkJaXdlLmNtZCA9IFNJT0NHSVdNT0RFOworCQljYXBhYmlsaXRpZXMgPSBsZTE2X3RvX2NwdShhdG9tLT5hLmNhcGFiaWxpdGllcyk7CisJCWlmIChjYXBhYmlsaXRpZXMgJiAweDMpIHsKKwkJCWlmIChjYXBhYmlsaXRpZXMgJiAweDEpCisJCQkJaXdlLnUubW9kZSA9IElXX01PREVfTUFTVEVSOworCQkJZWxzZQorCQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKwkJfQorCisJCWNoYW5uZWwgPSBhdG9tLT5zLmNoYW5uZWw7CisJCWlmICggKGNoYW5uZWwgPj0gMSkgJiYgKGNoYW5uZWwgPD0gTlVNX0NIQU5ORUxTKSApIHsKKwkJCS8qIEFkZCBmcmVxdWVuY3kgKi8KKwkJCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKKwkJCWl3ZS51LmZyZXEubSA9IGNoYW5uZWxfZnJlcXVlbmN5W2NoYW5uZWwtMV0gKiAxMDAwMDA7CisJCQlpd2UudS5mcmVxLmUgPSAxOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCisJCQkJCQkJICAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisJCX0KKworCQkvKiBBZGQgcXVhbGl0eSBzdGF0aXN0aWNzICovCisJCWl3ZS5jbWQgPSBJV0VWUVVBTDsKKwkJaXdlLnUucXVhbC51cGRhdGVkID0gMHgxMDsJLyogbm8gbGluayBxdWFsaXR5ICovCisJCWl3ZS51LnF1YWwubGV2ZWwgPSAoX191OCkgbGUxNl90b19jcHUoYXRvbS0+YS5sZXZlbCkgLSAweDk1OworCQlpd2UudS5xdWFsLm5vaXNlID0gKF9fdTgpIGxlMTZfdG9fY3B1KGF0b20tPmEubm9pc2UpIC0gMHg5NTsKKwkJLyogV2lyZWxlc3MgdG9vbHMgcHJpb3IgdG8gMjcucHJlMjIgd2lsbCBzaG93IGxpbmsgcXVhbGl0eQorCQkgKiBhbnl3YXksIHNvIHdlIHByb3ZpZGUgYSByZWFzb25hYmxlIHZhbHVlLiAqLworCQlpZiAoaXdlLnUucXVhbC5sZXZlbCA+IGl3ZS51LnF1YWwubm9pc2UpCisJCQlpd2UudS5xdWFsLnF1YWwgPSBpd2UudS5xdWFsLmxldmVsIC0gaXdlLnUucXVhbC5ub2lzZTsKKwkJZWxzZQorCQkJaXdlLnUucXVhbC5xdWFsID0gMDsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKKworCQkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJCWl3ZS5jbWQgPSBTSU9DR0lXRU5DT0RFOworCQlpZiAoY2FwYWJpbGl0aWVzICYgMHgxMCkKKwkJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRU5BQkxFRCB8IElXX0VOQ09ERV9OT0tFWTsKKwkJZWxzZQorCQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSAwOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwgYXRvbS0+YS5lc3NpZCk7CisKKwkJLyogQml0IHJhdGUgaXMgbm90IGF2YWlsYWJsZSBpbiBMdWNlbnQvQWdlcmUgZmlybXdhcmVzICovCisJCWlmIChwcml2LT5maXJtd2FyZV90eXBlICE9IEZJUk1XQVJFX1RZUEVfQUdFUkUpIHsKKwkJCWNoYXIgKgljdXJyZW50X3ZhbCA9IGN1cnJlbnRfZXYgKyBJV19FVl9MQ1BfTEVOOworCQkJaW50CWk7CisJCQlpbnQJc3RlcDsKKworCQkJaWYgKHByaXYtPmZpcm13YXJlX3R5cGUgPT0gRklSTVdBUkVfVFlQRV9TWU1CT0wpCisJCQkJc3RlcCA9IDI7CisJCQllbHNlCisJCQkJc3RlcCA9IDE7CisKKwkJCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKwkJCS8qIFRob3NlIHR3byBmbGFncyBhcmUgaWdub3JlZC4uLiAqLworCQkJaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOworCQkJLyogTWF4IDEwIHZhbHVlcyAqLworCQkJZm9yIChpID0gMDsgaSA8IDEwOyBpICs9IHN0ZXApIHsKKwkJCQkvKiBOVUxMIHRlcm1pbmF0ZWQgKi8KKwkJCQlpZiAoYXRvbS0+cC5yYXRlc1tpXSA9PSAweDApCisJCQkJCWJyZWFrOworCQkJCS8qIEJpdCByYXRlIGdpdmVuIGluIDUwMCBrYi9zIHVuaXRzICgrIDB4ODApICovCisJCQkJaXdlLnUuYml0cmF0ZS52YWx1ZSA9ICgoYXRvbS0+cC5yYXRlc1tpXSAmIDB4N2YpICogNTAwMDAwKTsKKwkJCQljdXJyZW50X3ZhbCA9IGl3ZV9zdHJlYW1fYWRkX3ZhbHVlKGN1cnJlbnRfZXYsIGN1cnJlbnRfdmFsLAorCQkJCQkJCQkgICBlbmRfYnVmLCAmaXdlLAorCQkJCQkJCQkgICBJV19FVl9QQVJBTV9MRU4pOworCQkJfQorCQkJLyogQ2hlY2sgaWYgd2UgYWRkZWQgYW55IGV2ZW50ICovCisJCQlpZiAoKGN1cnJlbnRfdmFsIC0gY3VycmVudF9ldikgPiBJV19FVl9MQ1BfTEVOKQorCQkJCWN1cnJlbnRfZXYgPSBjdXJyZW50X3ZhbDsKKwkJfQorCisJCS8qIFRoZSBvdGhlciBkYXRhIGluIHRoZSBzY2FuIHJlc3VsdCBhcmUgbm90IHJlYWxseQorCQkgKiBpbnRlcmVzdGluZywgc28gZm9yIG5vdyBkcm9wIGl0IC0gSmVhbiBJSSAqLworCX0KKwlyZXR1cm4gY3VycmVudF9ldiAtIGJ1ZmZlcjsKK30KKworLyogUmV0dXJuIHJlc3VsdHMgb2YgYSBzY2FuICovCitzdGF0aWMgaW50IG9yaW5vY29faW9jdGxfZ2V0c2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaXdfcG9pbnQgKnNycSwKKwkJCQkgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChvcmlub2NvX2xvY2socHJpdiwgJmZsYWdzKSAhPSAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogSWYgbm8gcmVzdWx0cyB5ZXQsIGFzayB0byB0cnkgYWdhaW4gbGF0ZXIgKi8KKwlpZiAocHJpdi0+c2Nhbl9yZXN1bHQgPT0gTlVMTCkgeworCQlpZiAocHJpdi0+c2Nhbl9pbnByb2dyZXNzKQorCQkJLyogSW1wb3J0YW50IG5vdGUgOiB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBjYWxsZXIKKwkJCSAqIHVudGlsIHJlc3VsdHMgYXJlIHJlYWR5IGZvciB2YXJpb3VzIHJlYXNvbnMuCisJCQkgKiBGaXJzdCwgbWFuYWdpbmcgd2FpdCBxdWV1ZXMgaXMgY29tcGxleCBhbmQgcmFjeS4KKwkJCSAqIFNlY29uZCwgd2UgZ3JhYiBzb21lIHJ0bmV0bGluayBsb2NrIGJlZm9yZSBjb21taW5nCisJCQkgKiBoZXJlIChpbiBkZXZfaW9jdGwoKSkuCisJCQkgKiBUaGlyZCwgd2UgZ2VuZXJhdGUgYW4gV2lyZWxlc3MgRXZlbnQsIHNvIHRoZQorCQkJICogY2FsbGVyIGNhbiB3YWl0IGl0c2VsZiBvbiB0aGF0IC0gSmVhbiBJSSAqLworCQkJZXJyID0gLUVBR0FJTjsKKwkJZWxzZQorCQkJLyogQ2xpZW50IGVycm9yLCBubyBzY2FuIHJlc3VsdHMuLi4KKwkJCSAqIFRoZSBjYWxsZXIgbmVlZCB0byByZXN0YXJ0IHRoZSBzY2FuLiAqLworCQkJZXJyID0gLUVOT0RBVEE7CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSBzb21lIHJlc3VsdHMgdG8gcHVzaCBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KKworCQkvKiBUcmFuc2xhdGUgdG8gV0UgZm9ybWF0ICovCisJCXNycS0+bGVuZ3RoID0gb3Jpbm9jb190cmFuc2xhdGVfc2NhbihkZXYsIGV4dHJhLAorCQkJCQkJICAgICBwcml2LT5zY2FuX3Jlc3VsdCwKKwkJCQkJCSAgICAgcHJpdi0+c2Nhbl9sZW4pOworCisJCS8qIFJldHVybiBmbGFncyAqLworCQlzcnEtPmZsYWdzID0gKF9fdTE2KSBwcml2LT5zY2FuX21vZGU7CisKKwkJLyogUmVzdWx0cyBhcmUgaGVyZSwgc28gc2NhbiBubyBsb25nZXIgaW4gcHJvZ3Jlc3MgKi8KKwkJcHJpdi0+c2Nhbl9pbnByb2dyZXNzID0gMDsKKworCQkvKiBJbiBhbnkgY2FzZSwgU2NhbiByZXN1bHRzIHdpbGwgYmUgY2xlYW5lZCB1cCBpbiB0aGUKKwkJICogcmVzZXQgZnVuY3Rpb24gYW5kIHdoZW4gZXhpdGluZyB0aGUgZHJpdmVyLgorCQkgKiBUaGUgcGVyc29uIHRyaWdnZXJpbmcgdGhlIHNjYW5uaW5nIG1heSBuZXZlciBjb21lIHRvCisJCSAqIHBpY2sgdGhlIHJlc3VsdHMsIHNvIHdlIG5lZWQgdG8gZG8gaXQgaW4gdGhvc2UgcGxhY2VzLgorCQkgKiBKZWFuIElJICovCisKKyNpZmRlZiBTQ0FOX1NJTkdMRV9SRUFECisJCS8qIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24sIG9ubHkgb25lIGNsaWVudCAodGhlIGZpcnN0CisJCSAqIG9uZSkgd2lsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIHJlc3VsdCAoYW5kIG9ubHkgb25lCisJCSAqIHRpbWUpLiBJZiB0aGVyZSBpcyBtdWx0aXBsZSBjb25jdXJlbnQgY2xpZW50cyB0aGF0CisJCSAqIHdhbnQgdG8gcmVhZCBzY2FuIHJlc3VsdHMsIHRoaXMgYmVoYXZpb3IgaXMgbm90CisJCSAqIGFkdmlzYWJsZSAtIEplYW4gSUkgKi8KKwkJa2ZyZWUocHJpdi0+c2Nhbl9yZXN1bHQpOworCQlwcml2LT5zY2FuX3Jlc3VsdCA9IE5VTEw7CisjZW5kaWYgLyogU0NBTl9TSU5HTEVfUkVBRCAqLworCQkvKiBIZXJlLCBpZiB0b28gbXVjaCB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIGxhc3Qgc2NhbiwKKwkJICogd2UgbWF5IHdhbnQgdG8gY2xlYW4gdXAgc2NhbiByZXN1bHRzLi4uIC0gSmVhbiBJSSAqLworCX0KKwkgIAorCW9yaW5vY29fdW5sb2NrKHByaXYsICZmbGFncyk7CisJcmV0dXJuIGVycjsKK30KKworLyogQ29tbWl0IGhhbmRsZXIsIGNhbGxlZCBhZnRlciBzZXQgb3BlcmF0aW9ucyAqLworc3RhdGljIGludCBvcmlub2NvX2lvY3RsX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdm9pZCAqd3JxdSwKKwkJCQljaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaGVybWVzICpodyA9ICZwcml2LT5odzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwOworCisJaWYgKCFwcml2LT5vcGVuKQorCQlyZXR1cm4gMDsKKworCWlmIChwcml2LT5icm9rZW5fZGlzYWJsZXBvcnQpIHsKKwkJb3Jpbm9jb19yZXNldChkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3Jpbm9jb19sb2NrKHByaXYsICZmbGFncykgIT0gMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGhlcm1lc19kaXNhYmxlX3BvcnQoaHcsIDApOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byBkaXNhYmxlIHBvcnQgIgorCQkgICAgICAgIndoaWxlIHJlY29uZmlndXJpbmcgY2FyZFxuIiwgZGV2LT5uYW1lKTsKKwkJcHJpdi0+YnJva2VuX2Rpc2FibGVwb3J0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gX19vcmlub2NvX3Byb2dyYW1fcmlkcyhkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuYWJsZSB0byByZWNvbmZpZ3VyZSBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gaGVybWVzX2VuYWJsZV9wb3J0KGh3LCAwKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbmFibGUgdG8gZW5hYmxlIHBvcnQgd2hpbGUgcmVjb25maWd1cmluZyBjYXJkXG4iLAorCQkgICAgICAgZGV2LT5uYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCisgb3V0OgorCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFJlc2V0dGluZyBpbnN0ZWFkLi4uXG4iLCBkZXYtPm5hbWUpOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93b3JrKTsKKwkJZXJyID0gMDsKKwl9CisKKwlvcmlub2NvX3VubG9jayhwcml2LCAmZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIG9yaW5vY29fcHJpdnRhYltdID0geworCXsgU0lPQ0lXRklSU1RQUklWICsgMHgwLCAwLCAwLCAiZm9yY2VfcmVzZXQiIH0sCisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDEsIDAsIDAsICJjYXJkX3Jlc2V0IiB9LAorCXsgU0lPQ0lXRklSU1RQUklWICsgMHgyLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgIDAsICJzZXRfcG9ydDMiIH0sCisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDMsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAgImdldF9wb3J0MyIgfSwKKwl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICAwLCAic2V0X3ByZWFtYmxlIiB9LAorCXsgU0lPQ0lXRklSU1RQUklWICsgMHg1LCAwLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKKwkgICJnZXRfcHJlYW1ibGUiIH0sCisJeyBTSU9DSVdGSVJTVFBSSVYgKyAweDYsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAgMCwgInNldF9pYnNzcG9ydCIgfSwKKwl7IFNJT0NJV0ZJUlNUUFJJViArIDB4NywgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCisJICAiZ2V0X2lic3Nwb3J0IiB9LAorCXsgU0lPQ0lXRklSU1RQUklWICsgMHg5LCAwLCBJV19QUklWX1RZUEVfQllURSB8IE1BWF9SSURfTEVOLAorCSAgImdldF9yaWQiIH0sCit9OworCisKKy8qCisgKiBTdHJ1Y3R1cmVzIHRvIGV4cG9ydCB0aGUgV2lyZWxlc3MgSGFuZGxlcnMKKyAqLworCitzdGF0aWMgY29uc3QgaXdfaGFuZGxlcglvcmlub2NvX2hhbmRsZXJbXSA9IHsKKwlbU0lPQ1NJV0NPTU1JVC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfY29tbWl0LAorCVtTSU9DR0lXTkFNRSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRuYW1lLAorCVtTSU9DU0lXRlJFUSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRmcmVxLAorCVtTSU9DR0lXRlJFUSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRmcmVxLAorCVtTSU9DU0lXTU9ERSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRtb2RlLAorCVtTSU9DR0lXTU9ERSAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRtb2RlLAorCVtTSU9DU0lXU0VOUyAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRzZW5zLAorCVtTSU9DR0lXU0VOUyAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRzZW5zLAorCVtTSU9DR0lXUkFOR0UgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRpd3JhbmdlLAorCVtTSU9DU0lXU1BZICAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRzcHksCisJW1NJT0NHSVdTUFkgICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHNweSwKKwlbU0lPQ1NJV0FQICAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0d2FwLAorCVtTSU9DR0lXQVAgICAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXR3YXAsCisJW1NJT0NTSVdTQ0FOICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldHNjYW4sCisJW1NJT0NHSVdTQ0FOICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHNjYW4sCisJW1NJT0NTSVdFU1NJRCAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldGVzc2lkLAorCVtTSU9DR0lXRVNTSUQgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRlc3NpZCwKKwlbU0lPQ1NJV05JQ0tOIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0bmljaywKKwlbU0lPQ0dJV05JQ0tOIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0bmljaywKKwlbU0lPQ1NJV1JBVEUgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0cmF0ZSwKKwlbU0lPQ0dJV1JBVEUgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cmF0ZSwKKwlbU0lPQ1NJV1JUUyAgIC1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0cnRzLAorCVtTSU9DR0lXUlRTICAgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRydHMsCisJW1NJT0NTSVdGUkFHICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldGZyYWcsCisJW1NJT0NHSVdGUkFHICAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldGZyYWcsCisJW1NJT0NHSVdSRVRSWSAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHJldHJ5LAorCVtTSU9DU0lXRU5DT0RFLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRpd2VuY29kZSwKKwlbU0lPQ0dJV0VOQ09ERS1TSU9DSVdGSVJTVF0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0aXdlbmNvZGUsCisJW1NJT0NTSVdQT1dFUiAtU0lPQ0lXRklSU1RdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldHBvd2VyLAorCVtTSU9DR0lXUE9XRVIgLVNJT0NJV0ZJUlNUXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRwb3dlciwKK307CisKKworLyoKKyAgQWRkZWQgdHlwZWNhc3Rpbmcgc2luY2Ugd2Ugbm8gbG9uZ2VyIHVzZSBpd3JlcV9kYXRhIC0tIE1vdXN0YWZhCisgKi8KK3N0YXRpYyBjb25zdCBpd19oYW5kbGVyCW9yaW5vY29fcHJpdmF0ZV9oYW5kbGVyW10gPSB7CisJWzBdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3Jlc2V0LAorCVsxXSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9yZXNldCwKKwlbMl0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfc2V0cG9ydDMsCisJWzNdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX2dldHBvcnQzLAorCVs0XSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9zZXRwcmVhbWJsZSwKKwlbNV0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cHJlYW1ibGUsCisJWzZdIChpd19oYW5kbGVyKSBvcmlub2NvX2lvY3RsX3NldGlic3Nwb3J0LAorCVs3XSAoaXdfaGFuZGxlcikgb3Jpbm9jb19pb2N0bF9nZXRpYnNzcG9ydCwKKwlbOV0gKGl3X2hhbmRsZXIpIG9yaW5vY29faW9jdGxfZ2V0cmlkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiBvcmlub2NvX2hhbmRsZXJfZGVmID0geworCS5udW1fc3RhbmRhcmQgPSBBUlJBWV9TSVpFKG9yaW5vY29faGFuZGxlciksCisJLm51bV9wcml2YXRlID0gQVJSQVlfU0laRShvcmlub2NvX3ByaXZhdGVfaGFuZGxlciksCisJLm51bV9wcml2YXRlX2FyZ3MgPSBBUlJBWV9TSVpFKG9yaW5vY29fcHJpdnRhYiksCisJLnN0YW5kYXJkID0gb3Jpbm9jb19oYW5kbGVyLAorCS5wcml2YXRlID0gb3Jpbm9jb19wcml2YXRlX2hhbmRsZXIsCisJLnByaXZhdGVfYXJncyA9IG9yaW5vY29fcHJpdnRhYiwKK307CisKK3N0YXRpYyB2b2lkIG9yaW5vY29fZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBvcmlub2NvX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3RybmNweShpbmZvLT5kcml2ZXIsIERSSVZFUl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSAtIDEpOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOworCXN0cm5jcHkoaW5mby0+ZndfdmVyc2lvbiwgcHJpdi0+ZndfbmFtZSwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pIC0gMSk7CisJaWYgKGRldi0+Y2xhc3NfZGV2LmRldikKKwkJc3RybmNweShpbmZvLT5idXNfaW5mbywgZGV2LT5jbGFzc19kZXYuZGV2LT5idXNfaWQsCisJCQlzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSk7CisJZWxzZQorCQlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEsCisJCQkgIlBDTUNJQSAlcCIsIHByaXYtPmh3LmlvYmFzZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgb3Jpbm9jb19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBvcmlub2NvX2dldF9kcnZpbmZvLAorCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBEZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvLmgKaW5kZXggZjc0OWI1MC4uMmYyMTNhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28uaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgX09SSU5PQ09fSAogI2RlZmluZSBfT1JJTk9DT19ICiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTRhbHBoYTIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjE1cmMyIgogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMjIsNiArMjIsOCBAQAogCiAjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKIAorI2RlZmluZSBNQVhfU0NBTl9MRU4JCTQwOTYKKwogI2RlZmluZSBPUklOT0NPX01BWF9LRVlfU0laRQkxNAogI2RlZmluZSBPUklOT0NPX01BWF9LRVlTCTQKIApAQCAtMzAsNiArMzIsMjAgQEAKIAljaGFyIGRhdGFbT1JJTk9DT19NQVhfS0VZX1NJWkVdOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKK3N0cnVjdCBoZWFkZXJfc3RydWN0IHsKKwkvKiA4MDIuMyAqLworCXU4IGRlc3RbRVRIX0FMRU5dOworCXU4IHNyY1tFVEhfQUxFTl07CisJdTE2IGxlbjsKKwkvKiA4MDIuMiAqLworCXU4IGRzYXA7CisJdTggc3NhcDsKKwl1OCBjdHJsOworCS8qIFNOQVAgKi8KKwl1OCBvdWlbM107CisJdTE2IGV0aGVydHlwZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiB0eXBlZGVmIGVudW0gewogCUZJUk1XQVJFX1RZUEVfQUdFUkUsCiAJRklSTVdBUkVfVFlQRV9JTlRFUlNJTCwKQEAgLTQ4LDYgKzY0LDggQEAKIAkvKiBkcml2ZXIgc3RhdGUgKi8KIAlpbnQgb3BlbjsKIAl1MTYgbGFzdF9saW5rc3RhdHVzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBqb2luX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHdldmVudF93b3JrOwogCiAJLyogTmV0IGRldmljZSBzdHVmZiAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwpAQCAtNzQsNyArOTIsOSBAQAogCXVuc2lnbmVkIGludCBoYXNfcG06MTsKIAl1bnNpZ25lZCBpbnQgaGFzX3ByZWFtYmxlOjE7CiAJdW5zaWduZWQgaW50IGhhc19zZW5zaXRpdml0eToxOworCXVuc2lnbmVkIGludCBoYXNfaG9zdHNjYW46MTsKIAl1bnNpZ25lZCBpbnQgYnJva2VuX2Rpc2FibGVwb3J0OjE7CisJdW5zaWduZWQgaW50IGJyb2tlbl9tb25pdG9yOjE7CiAKIAkvKiBDb25maWd1cmF0aW9uIHBhcmFtYXRlcnMgKi8KIAl1MzIgaXdfbW9kZTsKQEAgLTg0LDYgKzEwNCw4IEBACiAJaW50IGJpdHJhdGVtb2RlOwogIAljaGFyIG5pY2tbSVdfRVNTSURfTUFYX1NJWkUrMV07CiAJY2hhciBkZXNpcmVkX2Vzc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOworCWNoYXIgZGVzaXJlZF9ic3NpZFtFVEhfQUxFTl07CisJaW50IGJzc2lkX2ZpeGVkOwogCXUxNiBmcmFnX3RocmVzaCwgbXdvX3JvYnVzdDsKIAl1MTYgY2hhbm5lbDsKIAl1MTYgYXBfZGVuc2l0eSwgcnRzX3RocmVzaDsKQEAgLTk4LDYgKzEyMCwxMiBAQAogCS8qIENvbmZpZ3VyYXRpb24gZGVwZW5kZW50IHZhcmlhYmxlcyAqLwogCWludCBwb3J0X3R5cGUsIGNyZWF0ZWlic3M7CiAJaW50IHByb21pc2N1b3VzLCBtY19jb3VudDsKKworCS8qIFNjYW5uaW5nIHN1cHBvcnQgKi8KKwlpbnQJc2Nhbl9pbnByb2dyZXNzOwkvKiBTY2FuIHBlbmRpbmcuLi4gKi8KKwl1MzIJc2Nhbl9tb2RlOwkJLyogVHlwZSBvZiBzY2FuIGRvbmUgKi8KKwljaGFyICoJc2Nhbl9yZXN1bHQ7CQkvKiBSZXN1bHQgb2YgcHJldmlvdXMgc2NhbiAqLworCWludAlzY2FuX2xlbjsJCS8qIExlbmdodCBvZiByZXN1bHQgKi8KIH07CiAKICNpZmRlZiBPUklOT0NPX0RFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvX2NzLmMKaW5kZXggNzRhODIyNy4uMzY4ZDJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jb19jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY29fY3MuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTg2LDExICsxODUsNiBAQAogCWRldl9saXN0ID0gbGluazsKIAogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJm9yaW5vY29fY3NfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOyAvKiBGSVhNRTogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKi8KIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC02MDgsMTMgKzYwMiw2NSBAQAogCSIgKERhdmlkIEdpYnNvbiA8aGVybWVzQGdpYnNvbi5kcm9wYmVhci5pZC5hdT4sICIKIAkiUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4sIGV0IGFsKSI7CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBvcmlub2NvX2NzX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MzAwKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAwODksIDB4MDAwMSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM4LCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxZWIsIDB4MDgwYSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjYxLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2OCwgMHgwMDAxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNmYsIDB4MDMwNSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMjc0LCAweDE2MTMpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI4YSwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyOGEsIDB4MDY3MyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMmFhLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDJhYywgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDE0ZWEsIDB4YjAwMSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHg1MGMyLCAweDczMDApLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4OTAwNSwgMHgwMDIxKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGMyNTAsIDB4MDAwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4ZDYwMSwgMHgwMDAyKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweGQ2MDEsIDB4MDAwNSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCIzQ29tIiwgIjNDUldFNzM3QSBBaXJDb25uZWN0IFdpcmVsZXNzIExBTiBQQyBDYXJkIiwgMHg0MTI0MGU1YiwgMHg1NjAxMGFmMyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJJbnN0YW50IFdpcmVsZXNzICIsICIgTmV0d29yayBQQyBDQVJEIiwgIlZlcnNpb24gMDEuMDIiLCAweDExZDkwMWFmLCAweDZlOWJkOTI2LCAweDRiNzRiYWEwKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQUNUSU9OVEVDIiwgIlBSSVNNIFdpcmVsZXNzIExBTiBQQyBDYXJkIiwgMHgzOTMwODlkYSwgMHhhNzFlNjlkNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkF2YXlhIENvbW11bmljYXRpb24iLCAiQXZheWEgV2lyZWxlc3MgUEMgQ2FyZCIsIDB4ZDhhNDNiNzgsIDB4MGQzNDExNjkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCVUZGQUxPIiwgIldMSS1QQ00tTDExRyIsIDB4MmRlY2VjZTMsIDB4ZjU3Y2E0YjMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDYWJsZXRyb24iLCAiUm9hbUFib3V0IDgwMi4xMSBEUyIsIDB4MzJkNDQ1ZjUsIDB4ZWRlZmZkOTApLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJjb3JlZ2EgSy5LLiIsICJXaXJlbGVzcyBMQU4gUENDLTExIiwgMHg1MjYxNDQwZiwgMHhhNjQwNTU4NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoImNvcmVnYSBLLksuIiwgIldpcmVsZXNzIExBTiBQQ0NBLTExIiwgMHg1MjYxNDQwZiwgMHhkZjYxMTVmOSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkQiLCAiTGluayBEUkMtNjUwIDExTWJwcyBXTEFOIENhcmQiLCAweDcxYjE4NTg5LCAweGYxNDRlM2FjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRCIsICJMaW5rIERXTC02NTAgMTFNYnBzIFdMQU4gQ2FyZCIsIDB4NzFiMTg1ODksIDB4YjZmMWIwYWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFTFNBIiwgIkFpckxhbmNlciBNQy0xMSIsIDB4NDUwN2EzM2EsIDB4ZWY1NGYwZTMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJIeXBlckxpbmsiLCAiV2lyZWxlc3MgUEMgQ2FyZCAxMU1icHMiLCAweDU2Y2MzZjFhLCAweDBiY2YyMjBjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiSU5URVJTSUwiLCAiSEZBMzg0eC9JRUVFIiwgMHg3NGM1ZTQwZCwgMHhkYjQ3MmExOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkx1Y2VudCBUZWNobm9sb2dpZXMiLCAiV2F2ZUxBTi9JRUVFIiwgMHgyM2ViOTk0OSwgMHhjNTYyZTcyYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1FTENPIiwgIldMSS1QQ00tTDExIiwgMHg0ODFlMDA5NCwgMHg3MzYwZTQxMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1FTENPIiwgIldMSS1QQ00tTDExRyIsIDB4NDgxZTAwOTQsIDB4ZjU3Y2E0YjMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNaWNyb3NvZnQiLCAiV2lyZWxlc3MgTm90ZWJvb2sgQWRhcHRlciBNTi01MjAiLCAweDU5NjFiZjg1LCAweDZlZWM4YzAxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTkNSIiwgIldhdmVMQU4vSUVFRSIsIDB4MjQzNThjZDQsIDB4YzU2MmU3MmEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJORVRHRUFSIE1BNDAxUkEgV2lyZWxlc3MgUEMiLCAiQ2FyZCIsIDB4MDMwNjQ2N2YsIDB4OTc2MmU4ZjEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQTEFORVgiLCAiR2VvV2F2ZS9HVy1DRjExMCIsIDB4MjA5ZjQwYWIsIDB4ZDk3MTUyNjQpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJQUk9YSU0iLCAiTEFOIFBDIENBUkQgSEFSTU9OWSA4MDIxMUIiLCAweGM2NTM2YTVlLCAweDA5MGMzY2Q5KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUFJPWElNIiwgIkxBTiBQQ0kgQ0FSRCBIQVJNT05ZIDgwMjExQiIsIDB4YzY1MzZhNWUsIDB4OWY0OTRlMjYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTQU1TVU5HIiwgIjExTWJwcyBXTEFOIENhcmQiLCAweDQzZDc0Y2I0LCAweDU3OWJkOTFiKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxKCJTeW1ib2wgVGVjaG5vbG9naWVzIiwgMHgzZjAyYjRkNiksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBvcmlub2NvX2NzX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBvcmlub2NvX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gRFJJVkVSX05BTUUsCiAJfSwKIAkuYXR0YWNoCQk9IG9yaW5vY29fY3NfYXR0YWNoLAorCS5ldmVudAkJPSBvcmlub2NvX2NzX2V2ZW50LAogCS5kZXRhY2gJCT0gb3Jpbm9jb19jc19kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gb3Jpbm9jb19jc19pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4eC5jCmluZGV4IDQ0ODFlYzEuLmFkYzc0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmMKQEAgLTExMiwxMCArMTEyLDEwIEBACiB2b2lkCiBpc2wzOHh4X3RyaWdnZXJfZGV2aWNlKGludCBhc2xlZXAsIHZvaWQgX19pb21lbSAqZGV2aWNlX2Jhc2UpCiB7Ci0Jc3RydWN0IHRpbWV2YWwgY3VycmVudF90aW1lOwogCXUzMiByZWcsIGNvdW50ZXIgPSAwOwogCiAjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKKwlzdHJ1Y3QgdGltZXZhbCBjdXJyZW50X3RpbWU7CiAJREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlzbDM4eHggdHJpZ2dlciBkZXZpY2VcbiIpOwogI2VuZGlmCiAKQEAgLTEyNiwxMSArMTI2LDExIEBACiAJCWRvX2dldHRpbWVvZmRheSgmY3VycmVudF90aW1lKTsKIAkJREVCVUcoU0hPV19UUkFDSU5HLCAiJTA4bGkuJTA4bGkgRGV2aWNlIHdha2V1cCB0cmlnZ2VyZWRcbiIsCiAJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjKTsKLSNlbmRpZgogCiAJCURFQlVHKFNIT1dfVFJBQ0lORywgIiUwOGxpLiUwOGxpIERldmljZSByZWdpc3RlciByZWFkICUwOHhcbiIsCiAJCSAgICAgIGN1cnJlbnRfdGltZS50dl9zZWMsIChsb25nKWN1cnJlbnRfdGltZS50dl91c2VjLAogCQkgICAgICByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRykpOworI2VuZGlmCiAJCXVkZWxheShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOwogCiAJCXJlZyA9IHJlYWRsKGRldmljZV9iYXNlICsgSVNMMzhYWF9JTlRfSURFTlRfUkVHKTsKQEAgLTE0OCwxMCArMTQ4LDEyIEBACiAJCQkJY291bnRlcisrOwogCQkJfQogCisjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKIAkJCURFQlVHKFNIT1dfVFJBQ0lORywKIAkJCSAgICAgICIlMDhsaS4lMDhsaSBEZXZpY2UgcmVnaXN0ZXIgcmVhZCAlMDh4XG4iLAogCQkJICAgICAgY3VycmVudF90aW1lLnR2X3NlYywgKGxvbmcpY3VycmVudF90aW1lLnR2X3VzZWMsCiAJCQkgICAgICByZWFkbChkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRykpOworI2VuZGlmCiAJCQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKIAogI2lmIFZFUkJPU0UgPiBTSE9XX0VSUk9SX01FU1NBR0VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDZlNWJkYTUuLjBlMGJhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0zOTMsMTEgKzM5Miw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLSAgICAgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotICAgICAgICBDU19FVkVOVF9SRVNFVF9QSFlTSUNBTCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfAotICAgICAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZyYXlfZXZlbnQ7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTI5MDQsMTMgKzI4OTgsMjEgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgcmF5X2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFhNiwgMHgwMDAwKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHJheV9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcmF5X2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gInJheV9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHJheV9hdHRhY2gsCisJLmV2ZW50CQk9IHJheV9ldmVudCwKIAkuZGV0YWNoCQk9IHJheV9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gcmF5X2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcmF5X2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKaW5kZXggZWM4MzI5Ny4uZjYxMzBhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwpAQCAtNDY4NCwxMiArNDY4NCw2IEBACiAKICAgLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCiAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gIGNsaWVudF9yZWcuRXZlbnRNYXNrID0gCi0gICAgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFIHwKLSAgICBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0gICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwotICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmd2F2ZWxhbl9ldmVudDsKICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICBjbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC00ODg5LDEzICs0ODgzLDI0IEBACiAgIHJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgd2F2ZWxhbl9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQVQmVCIsIldhdmVMQU4vUENNQ0lBIiwgMHhlN2M1YWZmZCwgMHgxYmM1MDk3NSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRpZ2l0YWwiLCAiUm9hbUFib3V0L0RTIiwgMHg5OTk5YWIzNSwgMHgwMGQwNWUwNiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkx1Y2VudCBUZWNobm9sb2dpZXMiLCAiV2F2ZUxBTi9QQ01DSUEiLCAweDIzZWI5OTQ5LCAweDFiYzUwOTc1KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTkNSIiwgIldhdmVMQU4vUENNQ0lBIiwgMHgyNDM1OGNkNCwgMHgxYmM1MDk3NSksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB3YXZlbGFuX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB3YXZlbGFuX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gIndhdmVsYW5fY3MiLAogCX0sCiAJLmF0dGFjaAkJPSB3YXZlbGFuX2F0dGFjaCwKKwkuZXZlbnQJCT0gd2F2ZWxhbl9ldmVudCwKIAkuZGV0YWNoCQk9IHdhdmVsYW5fZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHdhdmVsYW5faWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MucC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmgKaW5kZXggZWEyZWY4ZC4uNjc3ZmY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5wLmgKQEAgLTQ1Miw3ICs0NTIsNiBAQAogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzcmVnLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2RzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KIAogLyogV2F2ZWxhbiBkZWNsYXJhdGlvbnMgKi8KICNpbmNsdWRlICJpODI1OTMuaCIJLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBJbnRlbCBjaGlwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCmluZGV4IDE0MzNlNWEuLmRkOTAyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMzUwMV9jcy5jCkBAIC00OSw3ICs0OSw2IEBACiAKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0yMDA1LDEzICsyMDA0LDYgQEAKIAlsaW5rLT5uZXh0CQkgPSB3bDM1MDFfZGV2X2xpc3Q7CiAJd2wzNTAxX2Rldl9saXN0CQkgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8JID0gJndsMzUwMV9kZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzawkgPSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8Ci0JCQkJICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfAotCQkJCSAgIENTX0VWRU5UX0NBUkRfUkVTRVQgfAotCQkJCSAgIENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCQkJICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8Ci0JCQkJICAgQ1NfRVZFTlRfUE1fUkVTVU1FOwotCWNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9IHdsMzUwMV9ldmVudDsKIAljbGllbnRfcmVnLlZlcnNpb24JID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0yMjM5LDEzICsyMjMxLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCB3bDM1MDFfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhkNjAxLCAweDAwMDEpLAorCVBDTUNJQV9ERVZJQ0VfTlVMTAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCB3bDM1MDFfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHdsMzUwMV9kcml2ZXIgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLmRydiAgICAgICAgICAgID0gewotCQkubmFtZSAgID0gIndsMzUwMV9jcyIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcnYJCT0geworCQkubmFtZQk9ICJ3bDM1MDFfY3MiLAogCX0sCi0JLmF0dGFjaCAgICAgICAgID0gd2wzNTAxX2F0dGFjaCwKLQkuZGV0YWNoICAgICAgICAgPSB3bDM1MDFfZGV0YWNoLAorCS5hdHRhY2gJCT0gd2wzNTAxX2F0dGFjaCwKKwkuZXZlbnQJCT0gd2wzNTAxX2V2ZW50LAorCS5kZXRhY2gJCT0gd2wzNTAxX2RldGFjaCwKKwkuaWRfdGFibGUJPSB3bDM1MDFfaWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgd2wzNTAxX2luaXRfbW9kdWxlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCmluZGV4IDlkYTkyNTQuLjFjMjUwNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCkBAIC03ODYsNyArNzg2LDcgQEAKIAkJc2tiLT5kZXYgPSBkZXY7CQkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCXNrYl9yZXNlcnZlKHNrYiwgMik7CS8qIDE2IGJ5dGUgYWxpZ24gdGhlIElQIGhlYWRlci4gKi8KIAkJeXAtPnJ4X3JpbmdbaV0uYWRkciA9IGNwdV90b19sZTMyKHBjaV9tYXBfc2luZ2xlKHlwLT5wY2lfZGV2LAotCQkJc2tiLT50YWlsLCB5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCXNrYi0+ZGF0YSwgeXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKSk7CiAJfQogCXlwLT5yeF9yaW5nW2ktMV0uZGJkbWFfY21kID0gY3B1X3RvX2xlMzIoQ01EX1NUT1ApOwogCXlwLT5kaXJ0eV9yeCA9ICh1bnNpZ25lZCBpbnQpKGkgLSBSWF9SSU5HX1NJWkUpOwpAQCAtMTExMSw3ICsxMTExLDcgQEAKIAkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHlwLT5wY2lfZGV2LCBkZXNjLT5hZGRyLAogCQkJeXAtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJZGVzY19zdGF0dXMgPSBsZTMyX3RvX2NwdShkZXNjLT5yZXN1bHRfc3RhdHVzKSA+PiAxNjsKLQkJYnVmX2FkZHIgPSByeF9za2ItPnRhaWw7CisJCWJ1Zl9hZGRyID0gcnhfc2tiLT5kYXRhOwogCQlkYXRhX3NpemUgPSAobGUzMl90b19jcHUoZGVzYy0+ZGJkbWFfY21kKSAtIAogCQkJbGUzMl90b19jcHUoZGVzYy0+cmVzdWx0X3N0YXR1cykpICYgMHhmZmZmOwogCQlmcmFtZV9zdGF0dXMgPSBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChzMTYqKSYoYnVmX2FkZHJbZGF0YV9zaXplIC0gMl0pKSk7CkBAIC0xMTg1LDcgKzExODUsNyBAQAogCQkJCQlicmVhazsKIAkJCQlza2ItPmRldiA9IGRldjsKIAkJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiAxNiBieXRlIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KLQkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcnhfc2tiLT50YWlsLCBwa3RfbGVuLCAwKTsKKwkJCQlldGhfY29weV9hbmRfc3VtKHNrYiwgcnhfc2tiLT5kYXRhLCBwa3RfbGVuLCAwKTsKIAkJCQlza2JfcHV0KHNrYiwgcGt0X2xlbik7CiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHlwLT5wY2lfZGV2LCBkZXNjLT5hZGRyLAogCQkJCQkJCQkJCQkgICB5cC0+cnhfYnVmX3N6LApAQCAtMTIxMSw3ICsxMjExLDcgQEAKIAkJCXNrYi0+ZGV2ID0gZGV2OwkvKiBNYXJrIGFzIGJlaW5nIHVzZWQgYnkgdGhpcyBkZXZpY2UuICovCiAJCQlza2JfcmVzZXJ2ZShza2IsIDIpOwkvKiBBbGlnbiBJUCBvbiAxNiBieXRlIGJvdW5kYXJpZXMgKi8KIAkJCXlwLT5yeF9yaW5nW2VudHJ5XS5hZGRyID0gY3B1X3RvX2xlMzIocGNpX21hcF9zaW5nbGUoeXAtPnBjaV9kZXYsCi0JCQkJc2tiLT50YWlsLCB5cC0+cnhfYnVmX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpKTsKKwkJCQlza2ItPmRhdGEsIHlwLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSkpOwogCQl9CiAJCXlwLT5yeF9yaW5nW2VudHJ5XS5kYmRtYV9jbWQgPSBjcHVfdG9fbGUzMihDTURfU1RPUCk7CiAJCXlwLT5yeF9yaW5nW2VudHJ5XS5yZXN1bHRfc3RhdHVzID0gMDsJLyogQ2xlYXIgY29tcGxldGUgYml0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCmluZGV4IDc0NWExNDEuLjUzMWIwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfZXhlY19kY29va2llKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKIHsKLQl1bnNpZ25lZCBsb25nIGNvb2tpZSA9IDA7CisJdW5zaWduZWQgbG9uZyBjb29raWUgPSBOT19DT09LSUU7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOwogIAogCWlmICghbW0pCkBAIC0yMzQsMzUgKzIzNCw0MiBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBsb29rdXBfZGNvb2tpZShzdHJ1Y3QgbW1fc3RydWN0ICogbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgb2ZmX3QgKiBvZmZzZXQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjb29raWUgPSAwOworCXVuc2lnbmVkIGxvbmcgY29va2llID0gTk9fQ09PS0lFOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYTsKIAogCWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyB2bWE7IHZtYSA9IHZtYS0+dm1fbmV4dCkgewogIAotCQlpZiAoIXZtYS0+dm1fZmlsZSkKLQkJCWNvbnRpbnVlOwotCiAJCWlmIChhZGRyIDwgdm1hLT52bV9zdGFydCB8fCBhZGRyID49IHZtYS0+dm1fZW5kKQogCQkJY29udGludWU7CiAKLQkJY29va2llID0gZmFzdF9nZXRfZGNvb2tpZSh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LAotCQkJdm1hLT52bV9maWxlLT5mX3Zmc21udCk7Ci0JCSpvZmZzZXQgPSAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKSArIGFkZHIgLSB2bWEtPnZtX3N0YXJ0OyAKKwkJaWYgKHZtYS0+dm1fZmlsZSkgeworCQkJY29va2llID0gZmFzdF9nZXRfZGNvb2tpZSh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LAorCQkJCXZtYS0+dm1fZmlsZS0+Zl92ZnNtbnQpOworCQkJKm9mZnNldCA9ICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpICsgYWRkciAtCisJCQkJdm1hLT52bV9zdGFydDsKKwkJfSBlbHNlIHsKKwkJCS8qIG11c3QgYmUgYW4gYW5vbnltb3VzIG1hcCAqLworCQkJKm9mZnNldCA9IGFkZHI7CisJCX0KKwogCQlicmVhazsKIAl9CiAKKwlpZiAoIXZtYSkKKwkJY29va2llID0gSU5WQUxJRF9DT09LSUU7CisKIAlyZXR1cm4gY29va2llOwogfQogCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfY29va2llID0gfjBVTDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfY29va2llID0gSU5WQUxJRF9DT09LSUU7CiAgCiBzdGF0aWMgdm9pZCBhZGRfY3B1X3N3aXRjaChpbnQgaSkKIHsKIAlhZGRfZXZlbnRfZW50cnkoRVNDQVBFX0NPREUpOwogCWFkZF9ldmVudF9lbnRyeShDUFVfU1dJVENIX0NPREUpOwogCWFkZF9ldmVudF9lbnRyeShpKTsKLQlsYXN0X2Nvb2tpZSA9IH4wVUw7CisJbGFzdF9jb29raWUgPSBJTlZBTElEX0NPT0tJRTsKIH0KIAogc3RhdGljIHZvaWQgYWRkX2tlcm5lbF9jdHhfc3dpdGNoKHVuc2lnbmVkIGludCBpbl9rZXJuZWwpCkBAIC0zMTcsNyArMzI0LDcgQEAKICAKICAJY29va2llID0gbG9va3VwX2Rjb29raWUobW0sIHMtPmVpcCwgJm9mZnNldCk7CiAgCi0JaWYgKCFjb29raWUpIHsKKwlpZiAoY29va2llID09IElOVkFMSURfQ09PS0lFKSB7CiAJCWF0b21pY19pbmMoJm9wcm9maWxlX3N0YXRzLnNhbXBsZV9sb3N0X25vX21hcHBpbmcpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5oIGIvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuaAppbmRleCA0NDJhYWFkLi4wMTgwMjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5oCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmgKQEAgLTM1LDYgKzM1LDkgQEAKICNkZWZpbmUgVFJBQ0VfQkVHSU5fQ09ERQkJOAogI2RlZmluZSBUUkFDRV9FTkRfQ09ERQkJCTkKICAKKyNkZWZpbmUgSU5WQUxJRF9DT09LSUUgfjBVTAorI2RlZmluZSBOT19DT09LSUUgMFVMCisKIC8qIGFkZCBkYXRhIHRvIHRoZSBldmVudCBidWZmZXIgKi8KIHZvaWQgYWRkX2V2ZW50X2VudHJ5KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAgCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9kaW5vLmMgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKaW5kZXggYjBkMmE3My4uMmYyZGJlZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2Rpbm8uYworKysgYi9kcml2ZXJzL3BhcmlzYy9kaW5vLmMKQEAgLTk5Myw2ICs5OTMsNyBAQAogCWJ1cyA9IHBjaV9zY2FuX2J1c19wYXJlbnRlZCgmZGV2LT5kZXYsIGRpbm9fY3VycmVudF9idXMsCiAJCQkJICAgICZkaW5vX2NmZ19vcHMsIE5VTEwpOwogCWlmKGJ1cykgeworCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiAJCS8qIFRoaXMgY29kZSAqZGVwZW5kcyogb24gc2Nhbm5pbmcgYmVpbmcgc2luZ2xlIHRocmVhZGVkCiAJCSAqIGlmIGl0IGlzbid0LCB0aGlzIGdsb2JhbCBidXMgbnVtYmVyIGNvdW50IHdpbGwgZmFpbAogCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYyBiL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYwppbmRleCBkYzgzODgwLi43ZmRkODBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvbGJhX3BjaS5jCkBAIC0xNTcwLDYgKzE1NzAsOCBAQAogCWxiYV9idXMgPSBsYmFfZGV2LT5oYmEuaGJhX2J1cyA9CiAJCXBjaV9zY2FuX2J1c19wYXJlbnRlZCgmZGV2LT5kZXYsIGxiYV9kZXYtPmhiYS5idXNfbnVtLnN0YXJ0LAogCQkJCWNmZ19vcHMsIE5VTEwpOworCWlmIChsYmFfYnVzKQorCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGxiYV9idXMpOwogCiAJLyogVGhpcyBpcyBpbiBsaWV1IG9mIGNhbGxpbmcgcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpICovCiAJaWYgKGlzX3BkY19wYXQoKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2NzLmMKaW5kZXggYTNmYTgxOC4uMjRlNmFhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfY3MuYworKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9jcy5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnRfcGMuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTMzLDExICsxMzIsNiBAQAogICAgIGxpbmstPm5leHQgPSBkZXZfbGlzdDsKICAgICBkZXZfbGlzdCA9IGxpbms7CiAgICAgY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLSAgICBjbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLSAgICBjbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcGFycG9ydF9ldmVudDsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTM3MywxMyArMzY3LDIzIEBACiAgICAgcmV0dXJuIDA7CiB9IC8qIHBhcnBvcnRfZXZlbnQgKi8KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHBhcnBvcnRfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9GVU5DX0lEKDMpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzNywgMHgwMDAzKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgcGFycG9ydF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcGFycG9ydF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJwYXJwb3J0X2NzIiwKIAl9LAogCS5hdHRhY2gJCT0gcGFycG9ydF9hdHRhY2gsCisJLmV2ZW50CQk9IHBhcnBvcnRfZXZlbnQsCiAJLmRldGFjaAkJPSBwYXJwb3J0X2RldGFjaCwKKwkuaWRfdGFibGUJPSBwYXJwb3J0X2lkcywKKwogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9wYXJwb3J0X2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwppbmRleCA4MGVkZmEzLi40NTk4YzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKQEAgLTMwMDgsNyArMzAwOCw3IEBACiAJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpICE9IE5VTEwpIHsKLQkJaWQgPSBwY2lfbWF0Y2hfZGV2aWNlIChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOworCQlpZCA9IHBjaV9tYXRjaF9pZChwYXJwb3J0X3BjX3BjaV90YmwsIHBkZXYpOwogCQlpZiAoaWQgPT0gTlVMTCB8fCBpZC0+ZHJpdmVyX2RhdGEgPj0gbGFzdF9zaW8pCiAJCQljb250aW51ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQppbmRleCA3ZGVhNDk0Li4zNjU3ZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMTksNiArMTksNyBAQAogIwogIyBTb21lIGFyY2hpdGVjdHVyZXMgdXNlIHRoZSBnZW5lcmljIFBDSSBzZXR1cCBmdW5jdGlvbnMKICMKK29iai0kKENPTkZJR19YODYpICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfQUxQSEEpICs9IHNldHVwLWJ1cy5vIHNldHVwLWlycS5vCiBvYmotJChDT05GSUdfQVJNKSArPSBzZXR1cC1idXMubyBzZXR1cC1pcnEubwogb2JqLSQoQ09ORklHX1BBUklTQykgKz0gc2V0dXAtYnVzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2J1cy5jIGIvZHJpdmVycy9wY2kvYnVzLmMKaW5kZXggZGJkMzM2MC4uZmVkYWU4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvYnVzLmMKQEAgLTEyMSwxMCArMTIxLDEzIEBACiAJCSAqIElmIHRoZXJlIGlzIGFuIHVuYXR0YWNoZWQgc3Vib3JkaW5hdGUgYnVzLCBhdHRhY2gKIAkJICogaXQgYW5kIHRoZW4gc2NhbiBmb3IgdW5hdHRhY2hlZCBQQ0kgZGV2aWNlcy4KIAkJICovCi0JCWlmIChkZXYtPnN1Ym9yZGluYXRlICYmIGxpc3RfZW1wdHkoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUpKSB7Ci0JCQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7Ci0JCQlsaXN0X2FkZF90YWlsKCZkZXYtPnN1Ym9yZGluYXRlLT5ub2RlLCAmZGV2LT5idXMtPmNoaWxkcmVuKTsKLQkJCXNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgeworCQkgICAgICAgaWYgKGxpc3RfZW1wdHkoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUpKSB7CisJCQkgICAgICAgc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQkJICAgICAgIGxpc3RfYWRkX3RhaWwoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUsCisJCQkJCSAgICAgICAmZGV2LT5idXMtPmNoaWxkcmVuKTsKKwkJCSAgICAgICBzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwkJICAgICAgIH0KIAkJCXBjaV9idXNfYWRkX2RldmljZXMoZGV2LT5zdWJvcmRpbmF0ZSk7CiAKIAkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPnN1Ym9yZGluYXRlLT5jbGFzc19kZXYua29iaiwgJmRldi0+ZGV2LmtvYmosICJicmlkZ2UiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcuYwppbmRleCAzOTAzZjhjLi5iODQ0YmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy5jCkBAIC01NCw3ICs1NCw3IEBACiAKIAllbnZwW2krK10gPSBzY3JhdGNoOwogCWxlbmd0aCArPSBzY25wcmludGYgKHNjcmF0Y2gsIGJ1ZmZlcl9zaXplIC0gbGVuZ3RoLAotCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4XG4iLAorCQkJICAgICJNT0RBTElBUz1wY2k6diUwOFhkJTA4WHN2JTA4WHNkJTA4WGJjJTAyWHNjJTAyWGklMDJ4IiwKIAkJCSAgICBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKIAkJCSAgICBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlLAogCQkJICAgICh1OCkocGRldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBkZXYtPmNsYXNzID4+IDgpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnCmluZGV4IDFhNGQ0Y2EuLjljNGEzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL0tjb25maWcKQEAgLTE4Nyw5ICsxODcsMTAgQEAKIAogY29uZmlnIEhPVFBMVUdfUENJX1NHSQogCXRyaXN0YXRlICJTR0kgUENJIEhvdHBsdWcgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhPVFBMVUdfUENJICYmIElBNjRfU0dJX1NOMgorCWRlcGVuZHMgb24gSE9UUExVR19QQ0kgJiYgKElBNjRfU0dJX1NOMiB8fCBJQTY0X0dFTkVSSUMpCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBTR0kgSUE2NCBBbHRpeCBzeXN0ZW0uCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgU0dJIEFsdGl4IEhvdHBsdWcKKwkgIERyaXZlciBmb3IgUENJIGRldmljZXMuCiAKIAkgIFdoZW4gaW4gZG91YnQsIHNheSBOLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9NYWtlZmlsZQppbmRleCA5M2MxMjBkLi4zMWEzMDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDcgQEAKIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9TSFBDKQkJKz0gc2hwY2hwLm8KIG9iai0kKENPTkZJR19IT1RQTFVHX1BDSV9SUEEpCQkrPSBycGFwaHAubwogb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1JQQV9ETFBBUikJKz0gcnBhZGxwYXJfaW8ubworb2JqLSQoQ09ORklHX0hPVFBMVUdfUENJX1NHSSkJCSs9IHNnaV9ob3RwbHVnLm8KIAogcGNpX2hvdHBsdWctb2Jqcwk6PQlwY2lfaG90cGx1Z19jb3JlLm8KIApAQCAtMzYsOSArMzcsNyBAQAogCQkJCWlibXBocF9ocGMubwogCiBhY3BpcGhwLW9ianMJCTo9CWFjcGlwaHBfY29yZS5vCVwKLQkJCQlhY3BpcGhwX2dsdWUubwlcCi0JCQkJYWNwaXBocF9wY2kubwlcCi0JCQkJYWNwaXBocF9yZXMubworCQkJCWFjcGlwaHBfZ2x1ZS5vCiAKIHJwYXBocC1vYmpzCQk6PQlycGFwaHBfY29yZS5vCVwKIAkJCQlycGFwaHBfcGNpLm8JXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAppbmRleCBkOTQ5OTg3Li4yOTM2MDNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaAorKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaApAQCAtNyw2ICs3LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBIaXJvc2hpIEFvbm8gKGgtYW9ub0BhcC5qcC5uZWMuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgVGFrYXlvc2hpIEtvY2hpICh0LWtvY2hpQGJxLmpwLm5lYy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBORUMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE1hdHRoZXcgV2lsY294IChtYXR0aGV3LndpbGNveEBocC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBIZXdsZXR0IFBhY2thcmQKICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTUyLDcgKzU0LDYgQEAKIAogc3RydWN0IGFjcGlwaHBfYnJpZGdlOwogc3RydWN0IGFjcGlwaHBfc2xvdDsKLXN0cnVjdCBwY2lfcmVzb3VyY2U7CiAKIC8qCiAgKiBzdHJ1Y3Qgc2xvdCAtIHNsb3QgaW5mb3JtYXRpb24gZm9yIGVhY2ggKnBoeXNpY2FsKiBzbG90CkBAIC02NSwxNSArNjYsNiBAQAogCXN0cnVjdCBhY3BpcGhwX3Nsb3QJKmFjcGlfc2xvdDsKIH07CiAKLS8qCi0gKiBzdHJ1Y3QgcGNpX3Jlc291cmNlIC0gZGVzY3JpYmVzIHBjaSByZXNvdXJjZSAobWVtLCBwZm1lbSwgaW8sIGJ1cykKLSAqLwotc3RydWN0IHBjaV9yZXNvdXJjZSB7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqIG5leHQ7Ci0JdTY0IGJhc2U7Ci0JdTMyIGxlbmd0aDsKLX07Ci0KIC8qKgogICogc3RydWN0IGhwcF9wYXJhbSAtIEFDUEkgMi4wIF9IUFAgSG90IFBsdWcgUGFyYW1ldGVycwogICogQGNhY2hlX2xpbmVfc2l6ZSBpbiBEV09SRApAQCAtMTAxLDEwICs5Myw2IEBACiAJaW50IHR5cGU7CiAJaW50IG5yX3Nsb3RzOwogCi0JdTggc2VnOwotCXU4IGJ1czsKLQl1OCBzdWI7Ci0KIAl1MzIgZmxhZ3M7CiAKIAkvKiBUaGlzIGJ1cyAoaG9zdCBicmlkZ2UpIG9yIFNlY29uZGFyeSBidXMgKFBDSS10by1QQ0kgYnJpZGdlKSAqLwpAQCAtMTE3LDEyICsxMDUsNiBAQAogCXN0cnVjdCBocHBfcGFyYW0gaHBwOwogCiAJc3BpbmxvY2tfdCByZXNfbG9jazsKLQotCS8qIGF2YWlsYWJsZSByZXNvdXJjZXMgb24gdGhpcyBidXMgKi8KLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICptZW1faGVhZDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpwX21lbV9oZWFkOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKmlvX2hlYWQ7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqYnVzX2hlYWQ7CiB9OwogCiAKQEAgLTE2MywxMiArMTQ1LDYgQEAKIAogCXU4CQlmdW5jdGlvbjsJLyogcGNpIGZ1bmN0aW9uIyAqLwogCXUzMgkJZmxhZ3M7CQkvKiBzZWUgYmVsb3cgKi8KLQotCS8qIHJlc291cmNlcyB1c2VkIGZvciB0aGlzIGZ1bmN0aW9uICovCi0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbWVtX2hlYWQ7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqcF9tZW1faGVhZDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICppb19oZWFkOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKmJ1c19oZWFkOwogfTsKIAogLyoqCkBAIC0yNDMsMjUgKzIxOSw2IEBACiBleHRlcm4gdTggYWNwaXBocF9nZXRfYWRhcHRlcl9zdGF0dXMgKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpOwogZXh0ZXJuIHUzMiBhY3BpcGhwX2dldF9hZGRyZXNzIChzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KTsKIAotLyogYWNwaXBocF9wY2kuYyAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICphY3BpcGhwX2FsbG9jYXRlX3BjaWRldiAoc3RydWN0IHBjaV9idXMgKnBidXMsIGludCBkZXYsIGludCBmbik7Ci1leHRlcm4gaW50IGFjcGlwaHBfY29uZmlndXJlX3Nsb3QgKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpOwotZXh0ZXJuIGludCBhY3BpcGhwX2NvbmZpZ3VyZV9mdW5jdGlvbiAoc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYyk7Ci1leHRlcm4gdm9pZCBhY3BpcGhwX3VuY29uZmlndXJlX2Z1bmN0aW9uIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKTsKLWV4dGVybiBpbnQgYWNwaXBocF9kZXRlY3RfcGNpX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZSk7Ci1leHRlcm4gaW50IGFjcGlwaHBfaW5pdF9mdW5jX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKTsKLQotLyogYWNwaXBocF9yZXMuYyAqLwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfZ2V0X2lvX3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqaGVhZCwgdTMyIHNpemUpOwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfZ2V0X3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqaGVhZCwgdTMyIHNpemUpOwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfZ2V0X3Jlc291cmNlX3dpdGhfYmFzZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQsIHU2NCBiYXNlLCB1MzIgc2l6ZSk7Ci1leHRlcm4gaW50IGFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQpOwotZXh0ZXJuIHN0cnVjdCBwY2lfcmVzb3VyY2UgKmFjcGlwaHBfbWFrZV9yZXNvdXJjZSAodTY0IGJhc2UsIHUzMiBsZW5ndGgpOwotZXh0ZXJuIHZvaWQgYWNwaXBocF9tb3ZlX3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqZnJvbSwgc3RydWN0IHBjaV9yZXNvdXJjZSAqKnRvKTsKLWV4dGVybiB2b2lkIGFjcGlwaHBfZnJlZV9yZXNvdXJjZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKnJlcyk7Ci1leHRlcm4gdm9pZCBhY3BpcGhwX2R1bXBfcmVzb3VyY2UgKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlKTsgLyogZGVidWcgKi8KLWV4dGVybiB2b2lkIGFjcGlwaHBfZHVtcF9mdW5jX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKTsgLyogZGVidWcgKi8KLQogLyogdmFyaWFibGVzICovCiBleHRlcm4gaW50IGFjcGlwaHBfZGVidWc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfY29yZS5jCmluZGV4IDQ1MzllNjEuLjYwYzRjMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2NvcmUuYwpAQCAtNyw2ICs3LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBIaXJvc2hpIEFvbm8gKGgtYW9ub0BhcC5qcC5uZWMuY29tKQogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgVGFrYXlvc2hpIEtvY2hpICh0LWtvY2hpQGJxLmpwLm5lYy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBORUMgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IE1hdHRoZXcgV2lsY294IChtYXR0aGV3LndpbGNveEBocC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBIZXdsZXR0IFBhY2thcmQKICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTUzLDggKzU1LDggQEAKIHN0YXRpYyBpbnQgbnVtX3Nsb3RzOwogc3RhdGljIHN0cnVjdCBhY3BpcGhwX2F0dGVudGlvbl9pbmZvICphdHRlbnRpb25faW5mbzsKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC40IgotI2RlZmluZSBEUklWRVJfQVVUSE9SCSJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEB1cy5pYm0uY29tPiwgVGFrYXlvc2hpIEtvY2hpIDx0LWtvY2hpQGJxLmpwLm5lYy5jb20+IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC41IgorI2RlZmluZSBEUklWRVJfQVVUSE9SCSJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEB1cy5pYm0uY29tPiwgVGFrYXlvc2hpIEtvY2hpIDx0LWtvY2hpQGJxLmpwLm5lYy5jb20+LCBNYXR0aGV3IFdpbGNveCA8d2lsbHlAaHAuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJIkFDUEkgSG90IFBsdWcgUENJIENvbnRyb2xsZXIgRHJpdmVyIgogCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwpAQCAtMjgxLDggKzI4Myw3IEBACiAvKioKICAqIGdldF9hZGRyZXNzIC0gZ2V0IHBjaSBhZGRyZXNzIG9mIGEgc2xvdAogICogQGhvdHBsdWdfc2xvdDogc2xvdCB0byBnZXQgc3RhdHVzCi0gKiBAYnVzZGV2OiBwb2ludGVyIHRvIHN0cnVjdCBwY2lfYnVzZGV2IChzZWcsIGJ1cywgZGV2KQotICoKKyAqIEB2YWx1ZTogcG9pbnRlciB0byBzdHJ1Y3QgcGNpX2J1c2RldiAoc2VnLCBidXMsIGRldikKICAqLwogc3RhdGljIGludCBnZXRfYWRkcmVzcyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3QsIHUzMiAqdmFsdWUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCBlN2Y0MTI5Li40MjRlN2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTQsNiArNCwxMCBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyLDIwMDMgVGFrYXlvc2hpIEtvY2hpICh0LWtvY2hpQGJxLmpwLm5lYy5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSGlyb3NoaSBBb25vIChoLWFvbm9AYXAuanAubmVjLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwMiwyMDAzIE5FQyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgTWF0dGhldyBXaWxjb3ggKG1hdHRoZXcud2lsY294QGhwLmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IEhld2xldHQgUGFja2FyZAorICogQ29weXJpZ2h0IChDKSAyMDA1IFJhamVzaCBTaGFoIChyYWplc2guc2hhaEBpbnRlbC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSW50ZWwgQ29ycG9yYXRpb24KICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTI2LDYgKzMwLDE2IEBACiAgKgogICovCiAKKy8qCisgKiBMaWZldGltZSBydWxlcyBmb3IgcGNpX2RldjoKKyAqICAtIFRoZSBvbmUgaW4gYWNwaXBocF9mdW5jIGhhcyBpdHMgcmVmY291bnQgZWxldmF0ZWQgYnkgcGNpX2dldF9zbG90KCkKKyAqICAgIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQgb3Igd2hlbiBhbiBpbnNlcnRpb24gZXZlbnQgb2NjdXJzLiAgSXQgbG9zZXMKKyAqICAgIGEgcmVmY291bnQgd2hlbiBpdHMgZWplY3RlZCBvciB0aGUgZHJpdmVyIHVubG9hZHMuCisgKiAgLSBUaGUgb25lIGluIGFjcGlwaHBfYnJpZGdlIGhhcyBpdHMgcmVmY291bnQgZWxldmF0ZWQgYnkgcGNpX2dldF9zbG90KCkKKyAqICAgIHdoZW4gdGhlIGJyaWRnZSBpcyBzY2FubmVkIGFuZCBpdCBsb3NlcyBhIHJlZmNvdW50IHdoZW4gdGhlIGJyaWRnZQorICogICAgaXMgcmVtb3ZlZC4KKyAqLworCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC0xNzgsMjEgKzE5MiwxOCBAQAogCiAJCWJyaWRnZS0+bnJfc2xvdHMrKzsKIAotCQlkYmcoImZvdW5kIEFDUEkgUENJIEhvdHBsdWcgc2xvdCBhdCBQQ0kgJTAyeDolMDJ4IFNsb3Q6JWRcbiIsCi0JCSAgICBzbG90LT5icmlkZ2UtPmJ1cywgc2xvdC0+ZGV2aWNlLCBzbG90LT5zdW4pOworCQlkYmcoImZvdW5kIEFDUEkgUENJIEhvdHBsdWcgc2xvdCAlZCBhdCBQQ0kgJTA0eDolMDJ4OiUwMnhcbiIsCisJCQkJc2xvdC0+c3VuLCBwY2lfZG9tYWluX25yKGJyaWRnZS0+cGNpX2J1cyksCisJCQkJYnJpZGdlLT5wY2lfYnVzLT5udW1iZXIsIHNsb3QtPmRldmljZSk7CiAJfQogCiAJbmV3ZnVuYy0+c2xvdCA9IHNsb3Q7CiAJbGlzdF9hZGRfdGFpbCgmbmV3ZnVuYy0+c2libGluZywgJnNsb3QtPmZ1bmNzKTsKIAogCS8qIGFzc29jaWF0ZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgKi8KLQluZXdmdW5jLT5wY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChicmlkZ2UtPmJ1cywKKwluZXdmdW5jLT5wY2lfZGV2ID0gcGNpX2dldF9zbG90KGJyaWRnZS0+cGNpX2J1cywKIAkJCQkJIFBDSV9ERVZGTihkZXZpY2UsIGZ1bmN0aW9uKSk7CiAJaWYgKG5ld2Z1bmMtPnBjaV9kZXYpIHsKLQkJaWYgKGFjcGlwaHBfaW5pdF9mdW5jX3Jlc291cmNlKG5ld2Z1bmMpIDwgMCkgewotCQkJa2ZyZWUobmV3ZnVuYyk7Ci0JCQlyZXR1cm4gQUVfRVJST1I7Ci0JCX0KIAkJc2xvdC0+ZmxhZ3MgfD0gKFNMT1RfRU5BQkxFRCB8IFNMT1RfUE9XRVJFRE9OKTsKIAl9CiAKQEAgLTIyNyw2MiArMjM4LDYgQEAKIH0KIAogCi0vKiBkZWNvZGUgQUNQSSBfQ1JTIGRhdGEgYW5kIGNvbnZlcnQgaW50byBvdXIgaW50ZXJuYWwgcmVzb3VyY2UgbGlzdAotICogVEJEOiBfVFJBLCBldGMuCi0gKi8KLXN0YXRpYyBhY3BpX3N0YXR1cwotZGVjb2RlX2FjcGlfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLCB2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqKSBjb250ZXh0OwotCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyZXNzOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnJlczsKLQotCWlmIChyZXNvdXJjZS0+aWQgIT0gQUNQSV9SU1RZUEVfQUREUkVTUzE2ICYmCi0JICAgIHJlc291cmNlLT5pZCAhPSBBQ1BJX1JTVFlQRV9BRERSRVNTMzIgJiYKLQkgICAgcmVzb3VyY2UtPmlkICE9IEFDUElfUlNUWVBFX0FERFJFU1M2NCkKLQkJcmV0dXJuIEFFX09LOwotCi0JYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQocmVzb3VyY2UsICZhZGRyZXNzKTsKLQotCWlmIChhZGRyZXNzLnByb2R1Y2VyX2NvbnN1bWVyID09IEFDUElfUFJPRFVDRVIgJiYgYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCA+IDApIHsKLQkJZGJnKCJyZXNvdXJjZSB0eXBlOiAlZDogMHglbGx4IC0gMHglbGx4XG4iLCBhZGRyZXNzLnJlc291cmNlX3R5cGUsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHJlc3MubWluX2FkZHJlc3NfcmFuZ2UsCi0JCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHJlc3MubWF4X2FkZHJlc3NfcmFuZ2UpOwotCQlyZXMgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoYWRkcmVzcy5taW5fYWRkcmVzc19yYW5nZSwKLQkJCQkgICAgYWRkcmVzcy5hZGRyZXNzX2xlbmd0aCk7Ci0JCWlmICghcmVzKSB7Ci0JCQllcnIoIm91dCBvZiBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIEFFX09LOwotCQl9Ci0KLQkJc3dpdGNoIChhZGRyZXNzLnJlc291cmNlX3R5cGUpIHsKLQkJY2FzZSBBQ1BJX01FTU9SWV9SQU5HRToKLQkJCWlmIChhZGRyZXNzLmF0dHJpYnV0ZS5tZW1vcnkuY2FjaGVfYXR0cmlidXRlID09IEFDUElfUFJFRkVUQ0hBQkxFX01FTU9SWSkgewotCQkJCXJlcy0+bmV4dCA9IGJyaWRnZS0+cF9tZW1faGVhZDsKLQkJCQlicmlkZ2UtPnBfbWVtX2hlYWQgPSByZXM7Ci0JCQl9IGVsc2UgewotCQkJCXJlcy0+bmV4dCA9IGJyaWRnZS0+bWVtX2hlYWQ7Ci0JCQkJYnJpZGdlLT5tZW1faGVhZCA9IHJlczsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFDUElfSU9fUkFOR0U6Ci0JCQlyZXMtPm5leHQgPSBicmlkZ2UtPmlvX2hlYWQ7Ci0JCQlicmlkZ2UtPmlvX2hlYWQgPSByZXM7Ci0JCQlicmVhazsKLQkJY2FzZSBBQ1BJX0JVU19OVU1CRVJfUkFOR0U6Ci0JCQlyZXMtPm5leHQgPSBicmlkZ2UtPmJ1c19oZWFkOwotCQkJYnJpZGdlLT5idXNfaGVhZCA9IHJlczsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogaW52YWxpZCB0eXBlICovCi0JCQlrZnJlZShyZXMpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gQUVfT0s7Ci19Ci0KIC8qIGRlY29kZSBBQ1BJIDIuMCBfSFBQIGhvdCBwbHVnIHBhcmFtZXRlcnMgKi8KIHN0YXRpYyB2b2lkIGRlY29kZV9ocHAoc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UpCiB7CkBAIC0zNDYsMzQgKzMwMSwyOSBAQAogCS8qIGRlY29kZSBBQ1BJIDIuMCBfSFBQIChob3QgcGx1ZyBwYXJhbWV0ZXJzKSAqLwogCWRlY29kZV9ocHAoYnJpZGdlKTsKIAotCS8qIHN1YnRyYWN0IGFsbCByZXNvdXJjZXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQlhY3BpcGhwX2RldGVjdF9wY2lfcmVzb3VyY2UoYnJpZGdlKTsKLQogCS8qIHJlZ2lzdGVyIGFsbCBzbG90IG9iamVjdHMgdW5kZXIgdGhpcyBicmlkZ2UgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGJyaWRnZS0+aGFuZGxlLCAodTMyKTEsCiAJCQkJICAgICByZWdpc3Rlcl9zbG90LCBicmlkZ2UsIE5VTEwpOwogCiAJLyogaW5zdGFsbCBub3RpZnkgaGFuZGxlciAqLwotCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihicmlkZ2UtPmhhbmRsZSwKKwlpZiAoYnJpZGdlLT50eXBlICE9IEJSSURHRV9UWVBFX0hPU1QpIHsKKwkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGJyaWRnZS0+aGFuZGxlLAogCQkJCQkgICAgIEFDUElfU1lTVEVNX05PVElGWSwKIAkJCQkJICAgICBoYW5kbGVfaG90cGx1Z19ldmVudF9icmlkZ2UsCiAJCQkJCSAgICAgYnJpZGdlKTsKIAotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQllcnIoImZhaWxlZCB0byByZWdpc3RlciBpbnRlcnJ1cHQgbm90aWZ5IGhhbmRsZXJcbiIpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWVycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGludGVycnVwdCBub3RpZnkgaGFuZGxlclxuIik7CisJCX0KIAl9CiAKIAlsaXN0X2FkZCgmYnJpZGdlLT5saXN0LCAmYnJpZGdlX2xpc3QpOwotCi0JZGJnKCJCcmlkZ2UgcmVzb3VyY2U6XG4iKTsKLQlhY3BpcGhwX2R1bXBfcmVzb3VyY2UoYnJpZGdlKTsKIH0KIAogCiAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBob3N0IGJyaWRnZSBkYXRhIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQgYWRkX2hvc3RfYnJpZGdlKGFjcGlfaGFuZGxlICpoYW5kbGUsIGludCBzZWcsIGludCBidXMpCitzdGF0aWMgdm9pZCBhZGRfaG9zdF9icmlkZ2UoYWNwaV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IHBjaV9idXMgKnBjaV9idXMpCiB7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwogCiAJYnJpZGdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlwaHBfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CkBAIC0zODQsNTIgKzMzNCwxOSBAQAogCiAJYnJpZGdlLT50eXBlID0gQlJJREdFX1RZUEVfSE9TVDsKIAlicmlkZ2UtPmhhbmRsZSA9IGhhbmRsZTsKLQlicmlkZ2UtPnNlZyA9IHNlZzsKLQlicmlkZ2UtPmJ1cyA9IGJ1czsKIAotCWJyaWRnZS0+cGNpX2J1cyA9IHBjaV9maW5kX2J1cyhzZWcsIGJ1cyk7CisJYnJpZGdlLT5wY2lfYnVzID0gcGNpX2J1czsKIAogCXNwaW5fbG9ja19pbml0KCZicmlkZ2UtPnJlc19sb2NrKTsKIAotCS8qIHRvIGJlIG92ZXJyaWRkZW4gd2hlbiB3ZSBkZWNvZGUgX0NSUwkqLwotCWJyaWRnZS0+c3ViID0gYnJpZGdlLT5idXM7Ci0KLQkvKiBkZWNvZGUgcmVzb3VyY2VzICovCi0KLQlzdGF0dXMgPSBhY3BpX3dhbGtfcmVzb3VyY2VzKGhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKLQkJZGVjb2RlX2FjcGlfcmVzb3VyY2UsIGJyaWRnZSk7Ci0KLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZXJyKCJmYWlsZWQgdG8gZGVjb2RlIGJyaWRnZSByZXNvdXJjZXNcbiIpOwotCQlrZnJlZShicmlkZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JYWNwaXBocF9yZXNvdXJjZV9zb3J0X2FuZF9jb21iaW5lKCZicmlkZ2UtPmlvX2hlYWQpOwotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmYnJpZGdlLT5tZW1faGVhZCk7Ci0JYWNwaXBocF9yZXNvdXJjZV9zb3J0X2FuZF9jb21iaW5lKCZicmlkZ2UtPnBfbWVtX2hlYWQpOwotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmYnJpZGdlLT5idXNfaGVhZCk7Ci0KLQlkYmcoIkFDUEkgX0NSUyByZXNvdXJjZTpcbiIpOwotCWFjcGlwaHBfZHVtcF9yZXNvdXJjZShicmlkZ2UpOwotCi0JaWYgKGJyaWRnZS0+YnVzX2hlYWQpIHsKLQkJYnJpZGdlLT5idXMgPSBicmlkZ2UtPmJ1c19oZWFkLT5iYXNlOwotCQlicmlkZ2UtPnN1YiA9IGJyaWRnZS0+YnVzX2hlYWQtPmJhc2UgKyBicmlkZ2UtPmJ1c19oZWFkLT5sZW5ndGggLSAxOwotCX0KLQogCWluaXRfYnJpZGdlX21pc2MoYnJpZGdlKTsKIH0KIAogCiAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBQQ0ktdG8tUENJIGJyaWRnZSBkYXRhIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQgYWRkX3AycF9icmlkZ2UoYWNwaV9oYW5kbGUgKmhhbmRsZSwgaW50IHNlZywgaW50IGJ1cywgaW50IGRldiwgaW50IGZuKQorc3RhdGljIHZvaWQgYWRkX3AycF9icmlkZ2UoYWNwaV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CiAJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7Ci0JdTggdG1wODsKLQl1MTYgdG1wMTY7Ci0JdTY0IGJhc2U2NCwgbGltaXQ2NDsKLQl1MzIgYmFzZSwgbGltaXQsIGJhc2UzMnUsIGxpbWl0MzJ1OwogCiAJYnJpZGdlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlwaHBfYnJpZGdlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJyaWRnZSA9PSBOVUxMKSB7CkBAIC00NDEsMTMzICszNTgsMjIgQEAKIAogCWJyaWRnZS0+dHlwZSA9IEJSSURHRV9UWVBFX1AyUDsKIAlicmlkZ2UtPmhhbmRsZSA9IGhhbmRsZTsKLQlicmlkZ2UtPnNlZyA9IHNlZzsKIAotCWJyaWRnZS0+cGNpX2RldiA9IHBjaV9maW5kX3Nsb3QoYnVzLCBQQ0lfREVWRk4oZGV2LCBmbikpOwotCWlmICghYnJpZGdlLT5wY2lfZGV2KSB7Ci0JCWVycigiQ2FuJ3QgZ2V0IHBjaV9kZXZcbiIpOwotCQlrZnJlZShicmlkZ2UpOwotCQlyZXR1cm47Ci0JfQotCi0JYnJpZGdlLT5wY2lfYnVzID0gYnJpZGdlLT5wY2lfZGV2LT5zdWJvcmRpbmF0ZTsKKwlicmlkZ2UtPnBjaV9kZXYgPSBwY2lfZGV2X2dldChwY2lfZGV2KTsKKwlicmlkZ2UtPnBjaV9idXMgPSBwY2lfZGV2LT5zdWJvcmRpbmF0ZTsKIAlpZiAoIWJyaWRnZS0+cGNpX2J1cykgewogCQllcnIoIlRoaXMgaXMgbm90IGEgUENJLXRvLVBDSSBicmlkZ2UhXG4iKTsKLQkJa2ZyZWUoYnJpZGdlKTsKLQkJcmV0dXJuOworCQlnb3RvIGVycjsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmYnJpZGdlLT5yZXNfbG9jayk7CiAKLQlicmlkZ2UtPmJ1cyA9IGJyaWRnZS0+cGNpX2J1cy0+bnVtYmVyOwotCWJyaWRnZS0+c3ViID0gYnJpZGdlLT5wY2lfYnVzLT5zdWJvcmRpbmF0ZTsKLQotCS8qCi0JICogZGVjb2RlIHJlc291cmNlcyB1bmRlciB0aGlzIFAyUCBicmlkZ2UKLQkgKi8KLQotCS8qIEkvTyByZXNvdXJjZXMgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShicmlkZ2UtPnBjaV9kZXYsIFBDSV9JT19CQVNFLCAmdG1wOCk7Ci0JYmFzZSA9IHRtcDg7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfSU9fTElNSVQsICZ0bXA4KTsKLQlsaW1pdCA9IHRtcDg7Ci0KLQlzd2l0Y2ggKGJhc2UgJiBQQ0lfSU9fUkFOR0VfVFlQRV9NQVNLKSB7Ci0JY2FzZSBQQ0lfSU9fUkFOR0VfVFlQRV8xNjoKLQkJYmFzZSA9IChiYXNlIDw8IDgpICYgMHhmMDAwOwotCQlsaW1pdCA9ICgobGltaXQgPDwgOCkgJiAweGYwMDApICsgMHhmZmY7Ci0JCWJyaWRnZS0+aW9faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSgodTY0KWJhc2UsIGxpbWl0IC0gYmFzZSArIDEpOwotCQlpZiAoIWJyaWRnZS0+aW9faGVhZCkgewotCQkJZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJCWtmcmVlKGJyaWRnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGJnKCIxNmJpdCBJL08gcmFuZ2U6ICUwNHgtJTA0eFxuIiwKLQkJICAgICh1MzIpYnJpZGdlLT5pb19oZWFkLT5iYXNlLAotCQkgICAgKHUzMikoYnJpZGdlLT5pb19oZWFkLT5iYXNlICsgYnJpZGdlLT5pb19oZWFkLT5sZW5ndGggLSAxKSk7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0lPX1JBTkdFX1RZUEVfMzI6Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX0lPX0JBU0VfVVBQRVIxNiwgJnRtcDE2KTsKLQkJYmFzZSA9ICgodTMyKXRtcDE2IDw8IDE2KSB8ICgoYmFzZSA8PCA4KSAmIDB4ZjAwMCk7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX0lPX0xJTUlUX1VQUEVSMTYsICZ0bXAxNik7Ci0JCWxpbWl0ID0gKCgodTMyKXRtcDE2IDw8IDE2KSB8ICgobGltaXQgPDwgOCkgJiAweGYwMDApKSArIDB4ZmZmOwotCQlicmlkZ2UtPmlvX2hlYWQgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoKHU2NCliYXNlLCBsaW1pdCAtIGJhc2UgKyAxKTsKLQkJaWYgKCFicmlkZ2UtPmlvX2hlYWQpIHsKLQkJCWVycigib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlrZnJlZShicmlkZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRiZygiMzJiaXQgSS9PIHJhbmdlOiAlMDh4LSUwOHhcbiIsCi0JCSAgICAodTMyKWJyaWRnZS0+aW9faGVhZC0+YmFzZSwKLQkJICAgICh1MzIpKGJyaWRnZS0+aW9faGVhZC0+YmFzZSArIGJyaWRnZS0+aW9faGVhZC0+bGVuZ3RoIC0gMSkpOwotCQlicmVhazsKLQljYXNlIDB4MGY6Ci0JCWRiZygiSS9PIHNwYWNlIHVuc3VwcG9ydGVkXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJd2FybigiVW5rbm93biBJL08gcmFuZ2UgdHlwZVxuIik7Ci0JfQotCi0JLyogTWVtb3J5IHJlc291cmNlcyAobWFuZGF0b3J5IGZvciBQMlAgYnJpZGdlKSAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX01FTU9SWV9CQVNFLCAmdG1wMTYpOwotCWJhc2UgPSAodG1wMTYgJiAweGZmZjApIDw8IDE2OwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZS0+cGNpX2RldiwgUENJX01FTU9SWV9MSU1JVCwgJnRtcDE2KTsKLQlsaW1pdCA9ICgodG1wMTYgJiAweGZmZjApIDw8IDE2KSB8IDB4ZmZmZmY7Ci0JYnJpZGdlLT5tZW1faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSgodTY0KWJhc2UsIGxpbWl0IC0gYmFzZSArIDEpOwotCWlmICghYnJpZGdlLT5tZW1faGVhZCkgewotCQllcnIoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlrZnJlZShicmlkZ2UpOwotCQlyZXR1cm47Ci0JfQotCWRiZygiMzJiaXQgTWVtb3J5IHJhbmdlOiAlMDh4LSUwOHhcbiIsCi0JICAgICh1MzIpYnJpZGdlLT5tZW1faGVhZC0+YmFzZSwKLQkgICAgKHUzMikoYnJpZGdlLT5tZW1faGVhZC0+YmFzZSArIGJyaWRnZS0+bWVtX2hlYWQtPmxlbmd0aC0xKSk7Ci0KLQkvKiBQcmVmZXRjaGFibGUgTWVtb3J5IHJlc291cmNlcyAob3B0aW9uYWwpICovCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfUFJFRl9NRU1PUllfQkFTRSwgJnRtcDE2KTsKLQliYXNlID0gdG1wMTY7Ci0JcGNpX3JlYWRfY29uZmlnX3dvcmQoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfUFJFRl9NRU1PUllfTElNSVQsICZ0bXAxNik7Ci0JbGltaXQgPSB0bXAxNjsKLQotCXN3aXRjaCAoYmFzZSAmIFBDSV9NRU1PUllfUkFOR0VfVFlQRV9NQVNLKSB7Ci0JY2FzZSBQQ0lfUFJFRl9SQU5HRV9UWVBFXzMyOgotCQliYXNlID0gKGJhc2UgJiAweGZmZjApIDw8IDE2OwotCQlsaW1pdCA9ICgobGltaXQgJiAweGZmZjApIDw8IDE2KSB8IDB4ZmZmZmY7Ci0JCWJyaWRnZS0+cF9tZW1faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSgodTY0KWJhc2UsIGxpbWl0IC0gYmFzZSArIDEpOwotCQlpZiAoIWJyaWRnZS0+cF9tZW1faGVhZCkgewotCQkJZXJyKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJCWtmcmVlKGJyaWRnZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZGJnKCIzMmJpdCBQcmVmZXRjaGFibGUgbWVtb3J5IHJhbmdlOiAlMDh4LSUwOHhcbiIsCi0JCSAgICAodTMyKWJyaWRnZS0+cF9tZW1faGVhZC0+YmFzZSwKLQkJICAgICh1MzIpKGJyaWRnZS0+cF9tZW1faGVhZC0+YmFzZSArIGJyaWRnZS0+cF9tZW1faGVhZC0+bGVuZ3RoIC0gMSkpOwotCQlicmVhazsKLQljYXNlIFBDSV9QUkVGX1JBTkdFX1RZUEVfNjQ6Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UtPnBjaV9kZXYsIFBDSV9QUkVGX0JBU0VfVVBQRVIzMiwgJmJhc2UzMnUpOwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLT5wY2lfZGV2LCBQQ0lfUFJFRl9MSU1JVF9VUFBFUjMyLCAmbGltaXQzMnUpOwotCQliYXNlNjQgPSAoKHU2NCliYXNlMzJ1IDw8IDMyKSB8ICgoYmFzZSAmIDB4ZmZmMCkgPDwgMTYpOwotCQlsaW1pdDY0ID0gKCgodTY0KWxpbWl0MzJ1IDw8IDMyKSB8ICgobGltaXQgJiAweGZmZjApIDw8IDE2KSkgKyAweGZmZmZmOwotCi0JCWJyaWRnZS0+cF9tZW1faGVhZCA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShiYXNlNjQsIGxpbWl0NjQgLSBiYXNlNjQgKyAxKTsKLQkJaWYgKCFicmlkZ2UtPnBfbWVtX2hlYWQpIHsKLQkJCWVycigib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlrZnJlZShicmlkZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRiZygiNjRiaXQgUHJlZmV0Y2hhYmxlIG1lbW9yeSByYW5nZTogJTA4eCUwOHgtJTA4eCUwOHhcbiIsCi0JCSAgICAodTMyKShicmlkZ2UtPnBfbWVtX2hlYWQtPmJhc2UgPj4gMzIpLAotCQkgICAgKHUzMikoYnJpZGdlLT5wX21lbV9oZWFkLT5iYXNlICYgMHhmZmZmZmZmZiksCi0JCSAgICAodTMyKSgoYnJpZGdlLT5wX21lbV9oZWFkLT5iYXNlICsgYnJpZGdlLT5wX21lbV9oZWFkLT5sZW5ndGggLSAxKSA+PiAzMiksCi0JCSAgICAodTMyKSgoYnJpZGdlLT5wX21lbV9oZWFkLT5iYXNlICsgYnJpZGdlLT5wX21lbV9oZWFkLT5sZW5ndGggLSAxKSAmIDB4ZmZmZmZmZmYpKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDBmOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQl3YXJuKCJVbmtub3duIHByZWZldGNoYWxlIG1lbW9yeSB0eXBlXG4iKTsKLQl9Ci0KIAlpbml0X2JyaWRnZV9taXNjKGJyaWRnZSk7CisJcmV0dXJuOworIGVycjoKKwlwY2lfZGV2X3B1dChwY2lfZGV2KTsKKwlrZnJlZShicmlkZ2UpOworCXJldHVybjsKIH0KIAogCkBAIC01NzcsMTQgKzM4MywxMCBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSBkdW1teV9oYW5kbGU7Ci0JdW5zaWduZWQgbG9uZyAqc2VnYnVzID0gY29udGV4dDsKIAl1bnNpZ25lZCBsb25nIHRtcDsKLQlpbnQgc2VnLCBidXMsIGRldmljZSwgZnVuY3Rpb247CisJaW50IGRldmljZSwgZnVuY3Rpb247CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKLQotCS8qIGdldCBQQ0kgYWRkcmVzcyAqLwotCXNlZyA9ICgqc2VnYnVzID4+IDgpICYgMHhmZjsKLQlidXMgPSAqc2VnYnVzICYgMHhmZjsKKwlzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cyA9IGNvbnRleHQ7CiAKIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0FEUiIsICZkdW1teV9oYW5kbGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKQEAgLTU5OSwyMCArNDAxLDE5IEBACiAJZGV2aWNlID0gKHRtcCA+PiAxNikgJiAweGZmZmY7CiAJZnVuY3Rpb24gPSB0bXAgJiAweGZmZmY7CiAKLQlkZXYgPSBwY2lfZmluZF9zbG90KGJ1cywgUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pKTsKKwlkZXYgPSBwY2lfZ2V0X3Nsb3QocGNpX2J1cywgUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pKTsKIAotCWlmICghZGV2KQotCQlyZXR1cm4gQUVfT0s7Ci0KLQlpZiAoIWRldi0+c3Vib3JkaW5hdGUpCi0JCXJldHVybiBBRV9PSzsKKwlpZiAoIWRldiB8fCAhZGV2LT5zdWJvcmRpbmF0ZSkKKwkJZ290byBvdXQ7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGJyaWRnZSBoYXMgZWplY3RhYmxlIHNsb3RzICovCiAJaWYgKGRldGVjdF9lamVjdGFibGVfc2xvdHMoaGFuZGxlKSA+IDApIHsKIAkJZGJnKCJmb3VuZCBQQ0ktdG8tUENJIGJyaWRnZSBhdCBQQ0kgJXNcbiIsIHBjaV9uYW1lKGRldikpOwotCQlhZGRfcDJwX2JyaWRnZShoYW5kbGUsIHNlZywgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uKTsKKwkJYWRkX3AycF9icmlkZ2UoaGFuZGxlLCBkZXYpOwogCX0KIAorIG91dDoKKwlwY2lfZGV2X3B1dChkZXYpOwogCXJldHVybiBBRV9PSzsKIH0KIApAQCAtNjI0LDYgKzQyNSw3IEBACiAJdW5zaWduZWQgbG9uZyB0bXA7CiAJaW50IHNlZywgYnVzOwogCWFjcGlfaGFuZGxlIGR1bW15X2hhbmRsZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1czsKIAogCS8qIGlmIHRoZSBicmlkZ2UgZG9lc24ndCBoYXZlIF9TVEEsIHdlIGFzc3VtZSBpdCBpcyBhbHdheXMgdGhlcmUgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX1NUQSIsICZkdW1teV9oYW5kbGUpOwpAQCAtNjUzLDE4ICs0NTUsMjIgQEAKIAkJYnVzID0gMDsKIAl9CiAKLQkvKiBjaGVjayBpZiB0aGlzIGJyaWRnZSBoYXMgZWplY3RhYmxlIHNsb3RzICovCi0JaWYgKGRldGVjdF9lamVjdGFibGVfc2xvdHMoaGFuZGxlKSA+IDApIHsKLQkJZGJnKCJmb3VuZCBQQ0kgaG9zdC1idXMgYnJpZGdlIHdpdGggaG90LXBsdWdnYWJsZSBzbG90c1xuIik7Ci0JCWFkZF9ob3N0X2JyaWRnZShoYW5kbGUsIHNlZywgYnVzKTsKKwlwY2lfYnVzID0gcGNpX2ZpbmRfYnVzKHNlZywgYnVzKTsKKwlpZiAoIXBjaV9idXMpIHsKKwkJZXJyKCJDYW4ndCBmaW5kIGJ1cyAlMDR4OiUwMnhcbiIsIHNlZywgYnVzKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JdG1wID0gc2VnIDw8IDggfCBidXM7CisJLyogY2hlY2sgaWYgdGhpcyBicmlkZ2UgaGFzIGVqZWN0YWJsZSBzbG90cyAqLworCWlmIChkZXRlY3RfZWplY3RhYmxlX3Nsb3RzKGhhbmRsZSkgPiAwKSB7CisJCWRiZygiZm91bmQgUENJIGhvc3QtYnVzIGJyaWRnZSB3aXRoIGhvdC1wbHVnZ2FibGUgc2xvdHNcbiIpOworCQlhZGRfaG9zdF9icmlkZ2UoaGFuZGxlLCBwY2lfYnVzKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJLyogc2VhcmNoIFAyUCBicmlkZ2VzIHVuZGVyIHRoaXMgaG9zdCBicmlkZ2UgKi8KIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwgKHUzMikxLAotCQkJCSAgICAgZmluZF9wMnBfYnJpZGdlLCAmdG1wLCBOVUxMKTsKKwkJCQkgICAgIGZpbmRfcDJwX2JyaWRnZSwgcGNpX2J1cywgTlVMTCk7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXdhcm4oImZpbmRfcDJwX2JyaWRnZSBmYWllZCAoZXJyb3IgY29kZSA9IDB4JXgpXG4iLHN0YXR1cyk7CkBAIC02NzIsMTIgKzQ3OCwyMDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCWxpc3RfZm9yX2VhY2goaGVhZCwgJmJyaWRnZV9saXN0KSB7CisJCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlID0gbGlzdF9lbnRyeShoZWFkLAorCQkJCQkJc3RydWN0IGFjcGlwaHBfYnJpZGdlLCBsaXN0KTsKKwkJaWYgKGJyaWRnZS0+aGFuZGxlID09IGhhbmRsZSkKKwkJCXJldHVybiBicmlkZ2U7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfYnJpZGdlKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsICp0bXA7CisJc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdDsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9oYW5kbGUgaGFuZGxlID0gYnJpZGdlLT5oYW5kbGU7CisKKwlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihoYW5kbGUsIEFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJICAgIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQllcnIoImZhaWxlZCB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOworCisJc2xvdCA9IGJyaWRnZS0+c2xvdHM7CisJd2hpbGUgKHNsb3QpIHsKKwkJc3RydWN0IGFjcGlwaHBfc2xvdCAqbmV4dCA9IHNsb3QtPm5leHQ7CisJCWxpc3RfZm9yX2VhY2hfc2FmZSAobGlzdCwgdG1wLCAmc2xvdC0+ZnVuY3MpIHsKKwkJCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CisJCQlmdW5jID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKKwkJCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGZ1bmMtPmhhbmRsZSwKKwkJCQkJCUFDUElfU1lTVEVNX05PVElGWSwKKwkJCQkJCWhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQkJCWVycigiZmFpbGVkIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7CisJCQlwY2lfZGV2X3B1dChmdW5jLT5wY2lfZGV2KTsKKwkJCWxpc3RfZGVsKGxpc3QpOworCQkJa2ZyZWUoZnVuYyk7CisJCX0KKwkJa2ZyZWUoc2xvdCk7CisJCXNsb3QgPSBuZXh0OworCX0KKworCXBjaV9kZXZfcHV0KGJyaWRnZS0+cGNpX2Rldik7CisJbGlzdF9kZWwoJmJyaWRnZS0+bGlzdCk7CisJa2ZyZWUoYnJpZGdlKTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitjbGVhbnVwX3AycF9icmlkZ2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7CisKKwlpZiAoIShicmlkZ2UgPSBhY3BpcGhwX2hhbmRsZV90b19icmlkZ2UoaGFuZGxlKSkpCisJCXJldHVybiBBRV9PSzsKKwljbGVhbnVwX2JyaWRnZShicmlkZ2UpOworCXJldHVybiBBRV9PSzsKK30KIAogc3RhdGljIHZvaWQgcmVtb3ZlX2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7Ci0JLyogTm8tb3AgZm9yIG5vdyAuLiAqLworCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOworCisJYnJpZGdlID0gYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGhhbmRsZSk7CisJaWYgKGJyaWRnZSkgeworCQljbGVhbnVwX2JyaWRnZShicmlkZ2UpOworCX0gZWxzZSB7CisJCS8qIGNsZWFuLXVwIHAycCBicmlkZ2VzIHVuZGVyIHRoaXMgaG9zdCBicmlkZ2UgKi8KKwkJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCisJCQkJKHUzMikxLCBjbGVhbnVwX3AycF9icmlkZ2UsIE5VTEwsIE5VTEwpOworCX0KIH0KIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2ICogZ2V0X2FwaWNfcGNpX2luZm8oYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCXN0cnVjdCBhY3BpX3BjaV9pZCBpZDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZ2V0X3BjaV9pZChoYW5kbGUsICZpZCkpKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1cyA9IHBjaV9maW5kX2J1cyhpZC5zZWdtZW50LCBpZC5idXMpOworCWlmICghYnVzKQorCQlyZXR1cm4gTlVMTDsKKworCWRldiA9IHBjaV9nZXRfc2xvdChidXMsIFBDSV9ERVZGTihpZC5kZXZpY2UsIGlkLmZ1bmN0aW9uKSk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJaWYgKChkZXYtPmNsYXNzICE9IFBDSV9DTEFTU19TWVNURU1fUElDX0lPQVBJQykgJiYKKwkgICAgKGRldi0+Y2xhc3MgIT0gUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9YQVBJQykpCisJeworCQlwY2lfZGV2X3B1dChkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IGdldF9nc2lfYmFzZShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiAqZ3NpX2Jhc2UpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWludCByZXN1bHQgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGdzYjsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXZvaWQgKnRhYmxlOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9HU0IiLCBOVUxMLCAmZ3NiKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJKmdzaV9iYXNlID0gKHUzMilnc2I7CisJCXJldHVybiAwOworCX0KKworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgIl9NQVQiLCBOVUxMLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgfHwgIWJ1ZmZlci5sZW5ndGggfHwgIWJ1ZmZlci5wb2ludGVyKQorCQlyZXR1cm4gLTE7CisKKwlvYmogPSBidWZmZXIucG9pbnRlcjsKKwlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIpCisJCWdvdG8gb3V0OworCisJdGFibGUgPSBvYmotPmJ1ZmZlci5wb2ludGVyOworCXN3aXRjaCAoKChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqKXRhYmxlKS0+dHlwZSkgeworCWNhc2UgQUNQSV9NQURUX0lPU0FQSUM6CisJCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfdGFibGVfaW9zYXBpYyAqKXRhYmxlKS0+Z2xvYmFsX2lycV9iYXNlOworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwljYXNlIEFDUElfTUFEVF9JT0FQSUM6CisJCSpnc2lfYmFzZSA9ICgoc3RydWN0IGFjcGlfdGFibGVfaW9hcGljICopdGFibGUpLT5nbG9iYWxfaXJxX2Jhc2U7CisJCXJlc3VsdCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKyBvdXQ6CisJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYWNwaV9zdGF0dXMKK2lvYXBpY19hZGQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcnYpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgc3RhOworCWFjcGlfaGFuZGxlIHRtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1MzIgZ3NpX2Jhc2U7CisJdTY0IHBoeXNfYWRkcjsKKworCS8qIEV2YWx1YXRlIF9TVEEgaWYgcHJlc2VudCAqLworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfU1RBIiwgTlVMTCwgJnN0YSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpICYmIHN0YSAhPSBBQ1BJX1NUQV9BTEwpCisJCXJldHVybiBBRV9DVFJMX0RFUFRIOworCisJLyogU2NhbiBvbmx5IFBDSSBidXMgc2NvcGUgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX0hJRCIsICZ0bXApOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKKwkJcmV0dXJuIEFFX0NUUkxfREVQVEg7CisKKwlpZiAoZ2V0X2dzaV9iYXNlKGhhbmRsZSwgJmdzaV9iYXNlKSkKKwkJcmV0dXJuIEFFX09LOworCisJcGRldiA9IGdldF9hcGljX3BjaV9pbmZvKGhhbmRsZSk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gQUVfT0s7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJCXJldHVybiBBRV9PSzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgIkkvTyBBUElDKGFjcGlwaHApIikpIHsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwkJcmV0dXJuIEFFX09LOworCX0KKworCXBoeXNfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwlpZiAoYWNwaV9yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCBwaHlzX2FkZHIsIGdzaV9iYXNlKSkgeworCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcGNpX2Rldl9wdXQocGRldik7CisJCXJldHVybiBBRV9PSzsKKwl9CisKKwlyZXR1cm4gQUVfT0s7Cit9CisKK3N0YXRpYyBpbnQgYWNwaXBocF9jb25maWd1cmVfaW9hcGljcyhhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCisJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfYWRkLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBwb3dlcl9vbl9zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7CkBAIC03MTksOCArNzE4LDYgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IGFyZ19saXN0OwotCXVuaW9uIGFjcGlfb2JqZWN0IGFyZzsKIAogCWludCByZXR2YWwgPSAwOwogCkBAIC03MzEsNyArNzI4LDcgQEAKIAlsaXN0X2Zvcl9lYWNoIChsLCAmc2xvdC0+ZnVuY3MpIHsKIAkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CiAKLQkJaWYgKGZ1bmMtPnBjaV9kZXYgJiYgKGZ1bmMtPmZsYWdzICYgRlVOQ19IQVNfUFMzKSkgeworCQlpZiAoZnVuYy0+ZmxhZ3MgJiBGVU5DX0hBU19QUzMpIHsKIAkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGZ1bmMtPmhhbmRsZSwgIl9QUzMiLCBOVUxMLCBOVUxMKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCXdhcm4oIiVzOiBfUFMzIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTc0MiwyNyArNzM5LDYgQEAKIAkJfQogCX0KIAotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQotCQkvKiBXZSBkb24ndCB3YW50IHRvIGNhbGwgX0VKMCBvbiBub24tZXhpc3RpbmcgZnVuY3Rpb25zLiAqLwotCQlpZiAoZnVuYy0+cGNpX2RldiAmJiAoZnVuYy0+ZmxhZ3MgJiBGVU5DX0hBU19FSjApKSB7Ci0JCQkvKiBfRUowIG1ldGhvZCB0YWtlIG9uZSBhcmd1bWVudCAqLwotCQkJYXJnX2xpc3QuY291bnQgPSAxOwotCQkJYXJnX2xpc3QucG9pbnRlciA9ICZhcmc7Ci0JCQlhcmcudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwotCQkJYXJnLmludGVnZXIudmFsdWUgPSAxOwotCi0JCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChmdW5jLT5oYW5kbGUsICJfRUowIiwgJmFyZ19saXN0LCBOVUxMKTsKLQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJCXdhcm4oIiVzOiBfRUowIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR2YWwgPSAtMTsKLQkJCQlnb3RvIGVycl9leGl0OwotCQkJfSBlbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KIAkvKiBUQkQ6IGV2YWx1YXRlIF9TVEEgdG8gY2hlY2sgaWYgdGhlIHNsb3QgaXMgZGlzYWJsZWQgKi8KIAogCXNsb3QtPmZsYWdzICY9ICh+U0xPVF9QT1dFUkVET04pOwpAQCAtNzgyLDcwICs3NTgsNTYgQEAKICAqLwogc3RhdGljIGludCBlbmFibGVfZGV2aWNlKHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCiB7Ci0JdTggYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0Jc3RydWN0IHBjaV9idXMgKmNoaWxkOworCXN0cnVjdCBwY2lfYnVzICpidXMgPSBzbG90LT5icmlkZ2UtPnBjaV9idXM7CiAJc3RydWN0IGxpc3RfaGVhZCAqbDsKIAlzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jOwogCWludCByZXR2YWwgPSAwOwotCWludCBudW07CisJaW50IG51bSwgbWF4LCBwYXNzOwogCiAJaWYgKHNsb3QtPmZsYWdzICYgU0xPVF9FTkFCTEVEKQogCQlnb3RvIGVycl9leGl0OwogCiAJLyogc2FuaXR5IGNoZWNrOiBkZXYgc2hvdWxkIGJlIE5VTEwgd2hlbiBob3QtcGx1Z2dlZCBpbiAqLwotCWRldiA9IHBjaV9maW5kX3Nsb3Qoc2xvdC0+YnJpZGdlLT5idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKKwlkZXYgPSBwY2lfZ2V0X3Nsb3QoYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLCAwKSk7CiAJaWYgKGRldikgewogCQkvKiBUaGlzIGNhc2Ugc2hvdWxkbid0IGhhcHBlbiAqLwogCQllcnIoInBjaV9kZXYgc3RydWN0dXJlIGFscmVhZHkgZXhpc3RzLlxuIik7CisJCXBjaV9kZXZfcHV0KGRldik7CiAJCXJldHZhbCA9IC0xOwogCQlnb3RvIGVycl9leGl0OwogCX0KIAotCS8qIGFsbG9jYXRlIHJlc291cmNlcyB0byBkZXZpY2UgKi8KLQlyZXR2YWwgPSBhY3BpcGhwX2NvbmZpZ3VyZV9zbG90KHNsb3QpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZXJyX2V4aXQ7Ci0KLQkvKiByZXR1cm5lZCBgZGV2JyBpcyB0aGUgKmZpcnN0IGZ1bmN0aW9uKiBvbmx5ISAqLwotCW51bSA9IHBjaV9zY2FuX3Nsb3Qoc2xvdC0+YnJpZGdlLT5wY2lfYnVzLCBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLCAwKSk7Ci0JaWYgKG51bSkKLQkJcGNpX2J1c19hZGRfZGV2aWNlcyhzbG90LT5icmlkZ2UtPnBjaV9idXMpOwotCWRldiA9IHBjaV9maW5kX3Nsb3Qoc2xvdC0+YnJpZGdlLT5idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKLQotCWlmICghZGV2KSB7CisJbnVtID0gcGNpX3NjYW5fc2xvdChidXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApKTsKKwlpZiAobnVtID09IDApIHsKIAkJZXJyKCJObyBuZXcgZGV2aWNlIGZvdW5kXG4iKTsKIAkJcmV0dmFsID0gLTE7CiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCi0JaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgewotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLCAmYnVzKTsKLQkJY2hpbGQgPSAoc3RydWN0IHBjaV9idXMqKSBwY2lfYWRkX25ld19idXMoZGV2LT5idXMsIGRldiwgYnVzKTsKLQkJcGNpX2RvX3NjYW5fYnVzKGNoaWxkKTsKKwltYXggPSBidXMtPnNlY29uZGFyeTsKKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQkJaWYgKFBDSV9TTE9UKGRldi0+ZGV2Zm4pICE9IHNsb3QtPmRldmljZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9CUklER0UgfHwKKwkJCSAgICBkZXYtPmhkcl90eXBlID09IFBDSV9IRUFERVJfVFlQRV9DQVJEQlVTKQorCQkJCW1heCA9IHBjaV9zY2FuX2JyaWRnZShidXMsIGRldiwgbWF4LCBwYXNzKTsKKwkJfQogCX0KIAorCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOworCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKKwogCS8qIGFzc29jaWF0ZSBwY2lfZGV2IHRvIG91ciByZXByZXNlbnRhdGlvbiAqLwogCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewogCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQotCQlmdW5jLT5wY2lfZGV2ID0gcGNpX2ZpbmRfc2xvdChzbG90LT5icmlkZ2UtPmJ1cywKLQkJCQkJICAgICAgUENJX0RFVkZOKHNsb3QtPmRldmljZSwKKwkJZnVuYy0+cGNpX2RldiA9IHBjaV9nZXRfc2xvdChidXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsCiAJCQkJCQkJZnVuYy0+ZnVuY3Rpb24pKTsKLQkJaWYgKCFmdW5jLT5wY2lfZGV2KQotCQkJY29udGludWU7Ci0KLQkJLyogY29uZmlndXJlIGRldmljZSAqLwotCQlyZXR2YWwgPSBhY3BpcGhwX2NvbmZpZ3VyZV9mdW5jdGlvbihmdW5jKTsKLQkJaWYgKHJldHZhbCkKLQkJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCiAJc2xvdC0+ZmxhZ3MgfD0gU0xPVF9FTkFCTEVEOwogCi0JZGJnKCJBdmFpbGFibGUgcmVzb3VyY2VzOlxuIik7Ci0JYWNwaXBocF9kdW1wX3Jlc291cmNlKHNsb3QtPmJyaWRnZSk7Ci0KICBlcnJfZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtODY2LDkgKzgyOCwxMiBAQAogCiAJbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7CiAJCWZ1bmMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOworCQlpZiAoIWZ1bmMtPnBjaV9kZXYpCisJCQljb250aW51ZTsKIAotCQlpZiAoZnVuYy0+cGNpX2RldikKLQkJCWFjcGlwaHBfdW5jb25maWd1cmVfZnVuY3Rpb24oZnVuYyk7CisJCXBjaV9yZW1vdmVfYnVzX2RldmljZShmdW5jLT5wY2lfZGV2KTsKKwkJcGNpX2Rldl9wdXQoZnVuYy0+cGNpX2Rldik7CisJCWZ1bmMtPnBjaV9kZXYgPSBOVUxMOwogCX0KIAogCXNsb3QtPmZsYWdzICY9ICh+U0xPVF9FTkFCTEVEKTsKQEAgLTkyMCw2ICs4ODUsMzkgQEAKIH0KIAogLyoqCisgKiBhY3BpcGhwX2VqZWN0X3Nsb3QgLSBwaHlzaWNhbGx5IGVqZWN0IHRoZSBzbG90CisgKi8KK3N0YXRpYyBpbnQgYWNwaXBocF9lamVjdF9zbG90KHN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKKwl1bmlvbiBhY3BpX29iamVjdCBhcmc7CisKKwlsaXN0X2Zvcl9lYWNoIChsLCAmc2xvdC0+ZnVuY3MpIHsKKwkJZnVuYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjcGlwaHBfZnVuYywgc2libGluZyk7CisKKwkJLyogV2UgZG9uJ3Qgd2FudCB0byBjYWxsIF9FSjAgb24gbm9uLWV4aXN0aW5nIGZ1bmN0aW9ucy4gKi8KKwkJaWYgKChmdW5jLT5mbGFncyAmIEZVTkNfSEFTX0VKMCkpIHsKKwkJCS8qIF9FSjAgbWV0aG9kIHRha2Ugb25lIGFyZ3VtZW50ICovCisJCQlhcmdfbGlzdC5jb3VudCA9IDE7CisJCQlhcmdfbGlzdC5wb2ludGVyID0gJmFyZzsKKwkJCWFyZy50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CisJCQlhcmcuaW50ZWdlci52YWx1ZSA9IDE7CisKKwkJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGZ1bmMtPmhhbmRsZSwgIl9FSjAiLCAmYXJnX2xpc3QsIE5VTEwpOworCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJd2FybigiJXM6IF9FSjAgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCXJldHVybiAtMTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioKICAqIGFjcGlwaHBfY2hlY2tfYnJpZGdlIC0gcmUtZW51bWVyYXRlIGRldmljZXMKICAqCiAgKiBJdGVyYXRlIG92ZXIgYWxsIHNsb3RzIHVuZGVyIHRoaXMgYnJpZGdlIGFuZCBtYWtlIHN1cmUgdGhhdCBpZiBhCkBAIC05NDIsNiArOTQwLDggQEAKIAkJCWlmIChyZXR2YWwpIHsKIAkJCQllcnIoIkVycm9yIG9jY3VycmVkIGluIGRpc2FibGluZ1xuIik7CiAJCQkJZ290byBlcnJfZXhpdDsKKwkJCX0gZWxzZSB7CisJCQkJYWNwaXBocF9lamVjdF9zbG90KHNsb3QpOwogCQkJfQogCQkJZGlzYWJsZWQrKzsKIAkJfSBlbHNlIHsKQEAgLTk2Miw2ICs5NjIsMTQ0IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIHZvaWQgcHJvZ3JhbV9ocHAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UpCit7CisJdTE2IHBjaV9jbWQsIHBjaV9iY3RsOworCXN0cnVjdCBwY2lfZGV2ICpjZGV2OworCisJLyogUHJvZ3JhbSBocHAgdmFsdWVzIGZvciB0aGlzIGRldmljZSAqLworCWlmICghKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCB8fAorCQkJKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSAmJgorCQkJKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpKSkKKwkJcmV0dXJuOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQlicmlkZ2UtPmhwcC5jYWNoZV9saW5lX3NpemUpOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJYnJpZGdlLT5ocHAubGF0ZW5jeV90aW1lcik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOworCWlmIChicmlkZ2UtPmhwcC5lbmFibGVfU0VSUikKKwkJcGNpX2NtZCB8PSBQQ0lfQ09NTUFORF9TRVJSOworCWVsc2UKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfU0VSUjsKKwlpZiAoYnJpZGdlLT5ocHAuZW5hYmxlX1BFUlIpCisJCXBjaV9jbWQgfD0gUENJX0NPTU1BTkRfUEFSSVRZOworCWVsc2UKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfUEFSSVRZOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKworCS8qIFByb2dyYW0gYnJpZGdlIGNvbnRyb2wgdmFsdWUgYW5kIGNoaWxkIGRldmljZXMgKi8KKwlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX1NFQ19MQVRFTkNZX1RJTUVSLAorCQkJCWJyaWRnZS0+aHBwLmxhdGVuY3lfdGltZXIpOworCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9CUklER0VfQ09OVFJPTCwgJnBjaV9iY3RsKTsKKwkJaWYgKGJyaWRnZS0+aHBwLmVuYWJsZV9TRVJSKQorCQkJcGNpX2JjdGwgfD0gUENJX0JSSURHRV9DVExfU0VSUjsKKwkJZWxzZQorCQkJcGNpX2JjdGwgJj0gflBDSV9CUklER0VfQ1RMX1NFUlI7CisJCWlmIChicmlkZ2UtPmhwcC5lbmFibGVfUEVSUikKKwkJCXBjaV9iY3RsIHw9IFBDSV9CUklER0VfQ1RMX1BBUklUWTsKKwkJZWxzZQorCQkJcGNpX2JjdGwgJj0gflBDSV9CUklER0VfQ1RMX1BBUklUWTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0JSSURHRV9DT05UUk9MLCBwY2lfYmN0bCk7CisJCWlmIChkZXYtPnN1Ym9yZGluYXRlKSB7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNkZXYsICZkZXYtPnN1Ym9yZGluYXRlLT5kZXZpY2VzLAorCQkJCQlidXNfbGlzdCkKKwkJCQlwcm9ncmFtX2hwcChjZGV2LCBicmlkZ2UpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBhY3BpcGhwX3NldF9ocHBfdmFsdWVzKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgYnJpZGdlOworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwltZW1zZXQoJmJyaWRnZSwgMCwgc2l6ZW9mKGJyaWRnZSkpOworCWJyaWRnZS5oYW5kbGUgPSBoYW5kbGU7CisJZGVjb2RlX2hwcCgmYnJpZGdlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCisJCXByb2dyYW1faHBwKGRldiwgJmJyaWRnZSk7CisKK30KKworLyoKKyAqIFJlbW92ZSBkZXZpY2VzIGZvciB3aGljaCB3ZSBjb3VsZCBub3QgYXNzaWduIHJlc291cmNlcywgY2FsbAorICogYXJjaCBzcGVjaWZpYyBjb2RlIHRvIGZpeC11cCB0aGUgYnVzCisgKi8KK3N0YXRpYyB2b2lkIGFjcGlwaHBfc2FuaXRpemVfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHR5cGVfbWFzayA9IElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlmb3IgKGk9MDsgaTxQQ0lfQlJJREdFX1JFU09VUkNFUzsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZkZXYtPnJlc291cmNlW2ldOworCQkJaWYgKChyZXMtPmZsYWdzICYgdHlwZV9tYXNrKSAmJiAhcmVzLT5zdGFydCAmJgorCQkJCQlyZXMtPmVuZCkgeworCQkJCS8qIENvdWxkIG5vdCBhc3NpZ24gYSByZXF1aXJlZCByZXNvdXJjZXMKKwkJCQkgKiBmb3IgdGhpcyBkZXZpY2UsIHJlbW92ZSBpdCAqLworCQkJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKiBQcm9ncmFtIHJlc291cmNlcyBpbiBuZXdseSBpbnNlcnRlZCBicmlkZ2UgKi8KK3N0YXRpYyBpbnQgYWNwaXBocF9jb25maWd1cmVfYnJpZGdlIChhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfcGNpX2lkIHBjaV9pZDsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCisJaWYgKEFDUElfRkFJTFVSRShhY3BpX2dldF9wY2lfaWQoaGFuZGxlLCAmcGNpX2lkKSkpIHsKKwkJZXJyKCJjYW5ub3QgZ2V0IFBDSSBkb21haW4gYW5kIGJ1cyBudW1iZXIgZm9yIGJyaWRnZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlidXMgPSBwY2lfZmluZF9idXMocGNpX2lkLnNlZ21lbnQsIHBjaV9pZC5idXMpOworCWlmICghYnVzKSB7CisJCWVycigiY2Fubm90IGZpbmQgYnVzICVkOiVkXG4iLAorCQkJCXBjaV9pZC5zZWdtZW50LCBwY2lfaWQuYnVzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKKwlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKKwlhY3BpcGhwX3Nhbml0aXplX2J1cyhidXMpOworCWFjcGlwaHBfc2V0X2hwcF92YWx1ZXMoaGFuZGxlLCBidXMpOworCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOworCWFjcGlwaHBfY29uZmlndXJlX2lvYXBpY3MoaGFuZGxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JyaWRnZV9pbnNlcnRpb24oYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgKnBkZXZpY2U7CisJYWNwaV9oYW5kbGUgcGhhbmRsZTsKKworCWlmICgodHlwZSAhPSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0spICYmCisJCQkodHlwZSAhPSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0spKSB7CisJCWVycigidW5leHBlY3RlZCBub3RpZmljYXRpb24gdHlwZSAlZFxuIiwgdHlwZSk7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGhhbmRsZSk7CisJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UocGhhbmRsZSwgJnBkZXZpY2UpKSB7CisJCWRiZygibm8gcGFyZW50IGRldmljZSwgYXNzdW1pbmcgTlVMTFxuIik7CisJCXBkZXZpY2UgPSBOVUxMOworCX0KKwlpZiAoYWNwaV9idXNfYWRkKCZkZXZpY2UsIHBkZXZpY2UsIGhhbmRsZSwgQUNQSV9CVVNfVFlQRV9ERVZJQ0UpKSB7CisJCWVycigiY2Fubm90IGFkZCBicmlkZ2UgdG8gYWNwaSBsaXN0XG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIWFjcGlwaHBfY29uZmlndXJlX2JyaWRnZShoYW5kbGUpICYmCisJCSFhY3BpX2J1c19zdGFydChkZXZpY2UpKQorCQlhZGRfYnJpZGdlKGhhbmRsZSk7CisJZWxzZQorCQllcnIoImNhbm5vdCBjb25maWd1cmUgYW5kIHN0YXJ0IGJyaWRnZVxuIik7CisKK30KKwogLyoKICAqIEFDUEkgZXZlbnQgaGFuZGxlcnMKICAqLwpAQCAtOTgyLDggKzExMjAsMTkgQEAKIAljaGFyIG9iam5hbWVbNjRdOwogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IC5sZW5ndGggPSBzaXplb2Yob2JqbmFtZSksCiAJCQkJICAgICAgLnBvaW50ZXIgPSBvYmpuYW1lIH07CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CiAKLQlicmlkZ2UgPSAoc3RydWN0IGFjcGlwaHBfYnJpZGdlICopY29udGV4dDsKKwlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7CisJCS8qIFRoaXMgYnJpZGdlIG11c3QgaGF2ZSBqdXN0IGJlZW4gcGh5c2ljYWxseSBpbnNlcnRlZCAqLworCQloYW5kbGVfYnJpZGdlX2luc2VydGlvbihoYW5kbGUsIHR5cGUpOworCQlyZXR1cm47CisJfQorCisJYnJpZGdlID0gYWNwaXBocF9oYW5kbGVfdG9fYnJpZGdlKGhhbmRsZSk7CisJaWYgKCFicmlkZ2UpIHsKKwkJZXJyKCJjYW5ub3QgZ2V0IGJyaWRnZSBpbmZvXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCWFjcGlfZ2V0X25hbWUoaGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpOwogCkBAIC0xMDMxLDcgKzExODAsNiBAQAogCX0KIH0KIAotCiAvKioKICAqIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMgLSBoYW5kbGUgQUNQSSBldmVudCBvbiBmdW5jdGlvbnMgKGkuZS4gc2xvdHMpCiAgKgpAQCAtMTA3NCw3ICsxMjIyLDggQEAKIAljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6CiAJCS8qIHJlcXVlc3QgZGV2aWNlIGVqZWN0ICovCiAJCWRiZygiJXM6IERldmljZSBlamVjdCBub3RpZnkgb24gJXNcbiIsIF9fRlVOQ1RJT05fXywgb2JqbmFtZSk7Ci0JCWFjcGlwaHBfZGlzYWJsZV9zbG90KGZ1bmMtPnNsb3QpOworCQlpZiAoIShhY3BpcGhwX2Rpc2FibGVfc2xvdChmdW5jLT5zbG90KSkpCisJCQlhY3BpcGhwX2VqZWN0X3Nsb3QoZnVuYy0+c2xvdCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTEwODMsNiArMTIzMiw0NyBAQAogCX0KIH0KIAorc3RhdGljIGludCBpc19yb290X2JyaWRnZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX2RldmljZV9pbmZvICppbmZvOworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCWludCBpOworCisJc3RhdHVzID0gYWNwaV9nZXRfb2JqZWN0X2luZm8oaGFuZGxlLCAmYnVmZmVyKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJaW5mbyA9IGJ1ZmZlci5wb2ludGVyOworCQlpZiAoKGluZm8tPnZhbGlkICYgQUNQSV9WQUxJRF9ISUQpICYmCisJCQkhc3RyY21wKFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkJCWluZm8tPmhhcmR3YXJlX2lkLnZhbHVlKSkgeworCQkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChpbmZvLT52YWxpZCAmIEFDUElfVkFMSURfQ0lEKSB7CisJCQlmb3IgKGk9MDsgaSA8IGluZm8tPmNvbXBhdGliaWxpdHlfaWQuY291bnQ7IGkrKykgeworCQkJCWlmICghc3RyY21wKFBDSV9ST09UX0hJRF9TVFJJTkcsCisJCQkJCWluZm8tPmNvbXBhdGliaWxpdHlfaWQuaWRbaV0udmFsdWUpKSB7CisJCQkJCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitmaW5kX3Jvb3RfYnJpZGdlcyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKK3sKKwlpbnQgKmNvdW50ID0gKGludCAqKWNvbnRleHQ7CisKKwlpZiAoaXNfcm9vdF9icmlkZ2UoaGFuZGxlKSkgeworCQlhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCisJCQkJaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlLCBOVUxMKTsKKwkJCSgqY291bnQpKys7CisJfQorCXJldHVybiBBRV9PSyA7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9wY2lfZHJpdmVyIGFjcGlfcGNpX2hwX2RyaXZlciA9IHsKIAkuYWRkID0JCWFkZF9icmlkZ2UsCkBAIC0xMDk1LDE1ICsxMjg1LDE1IEBACiAgKi8KIGludCBfX2luaXQgYWNwaXBocF9nbHVlX2luaXQodm9pZCkKIHsKLQlpbnQgbnVtOworCWludCBudW0gPSAwOwogCi0JaWYgKGxpc3RfZW1wdHkoJnBjaV9yb290X2J1c2VzKSkKLQkJcmV0dXJuIC0xOwotCi0JbnVtID0gYWNwaV9wY2lfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3BjaV9ocF9kcml2ZXIpOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKKwkJCUFDUElfVUlOVDMyX01BWCwgZmluZF9yb290X2JyaWRnZXMsICZudW0sIE5VTEwpOwogCiAJaWYgKG51bSA8PSAwKQogCQlyZXR1cm4gLTE7CisJZWxzZQorCQlhY3BpX3BjaV9yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfcGNpX2hwX2RyaXZlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMTYsNDYgKzEzMDYsNiBAQAogICovCiB2b2lkIF9fZXhpdCBhY3BpcGhwX2dsdWVfZXhpdCh2b2lkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmwxLCAqbDIsICpuMSwgKm4yOwotCXN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlOwotCXN0cnVjdCBhY3BpcGhwX3Nsb3QgKnNsb3QsICpuZXh0OwotCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlIChsMSwgbjEsICZicmlkZ2VfbGlzdCkgewotCQlicmlkZ2UgPSAoc3RydWN0IGFjcGlwaHBfYnJpZGdlICopbDE7Ci0JCXNsb3QgPSBicmlkZ2UtPnNsb3RzOwotCQl3aGlsZSAoc2xvdCkgewotCQkJbmV4dCA9IHNsb3QtPm5leHQ7Ci0JCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGwyLCBuMiwgJnNsb3QtPmZ1bmNzKSB7Ci0JCQkJZnVuYyA9IGxpc3RfZW50cnkobDIsIHN0cnVjdCBhY3BpcGhwX2Z1bmMsIHNpYmxpbmcpOwotCQkJCWFjcGlwaHBfZnJlZV9yZXNvdXJjZSgmZnVuYy0+aW9faGVhZCk7Ci0JCQkJYWNwaXBocF9mcmVlX3Jlc291cmNlKCZmdW5jLT5tZW1faGVhZCk7Ci0JCQkJYWNwaXBocF9mcmVlX3Jlc291cmNlKCZmdW5jLT5wX21lbV9oZWFkKTsKLQkJCQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmZ1bmMtPmJ1c19oZWFkKTsKLQkJCQlzdGF0dXMgPSBhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcihmdW5jLT5oYW5kbGUsCi0JCQkJCQkJCSAgICBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQkJCQkJCSAgICBoYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jKTsKLQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCQkJCWVycigiZmFpbGVkIHRvIHJlbW92ZSBub3RpZnkgaGFuZGxlclxuIik7Ci0JCQkJa2ZyZWUoZnVuYyk7Ci0JCQl9Ci0JCQlrZnJlZShzbG90KTsKLQkJCXNsb3QgPSBuZXh0OwotCQl9Ci0JCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGJyaWRnZS0+aGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCi0JCQkJCQkgICAgaGFuZGxlX2hvdHBsdWdfZXZlbnRfYnJpZGdlKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQkJZXJyKCJmYWlsZWQgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKLQotCQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmJyaWRnZS0+aW9faGVhZCk7Ci0JCWFjcGlwaHBfZnJlZV9yZXNvdXJjZSgmYnJpZGdlLT5tZW1faGVhZCk7Ci0JCWFjcGlwaHBfZnJlZV9yZXNvdXJjZSgmYnJpZGdlLT5wX21lbV9oZWFkKTsKLQkJYWNwaXBocF9mcmVlX3Jlc291cmNlKCZicmlkZ2UtPmJ1c19oZWFkKTsKLQotCQlrZnJlZShicmlkZ2UpOwotCX0KLQogCWFjcGlfcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX3BjaV9ocF9kcml2ZXIpOwogfQogCkBAIC0xMTczLDExICsxMzIzLDE0IEBACiAKIAlsaXN0X2Zvcl9lYWNoIChub2RlLCAmYnJpZGdlX2xpc3QpIHsKIAkJYnJpZGdlID0gKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqKW5vZGU7Ci0JCWRiZygiQnVzJWQgJWRzbG90KHMpXG4iLCBicmlkZ2UtPmJ1cywgYnJpZGdlLT5ucl9zbG90cyk7CisJCWRiZygiQnVzICUwNHg6JTAyeCBoYXMgJWQgc2xvdCVzXG4iLAorCQkJCXBjaV9kb21haW5fbnIoYnJpZGdlLT5wY2lfYnVzKSwKKwkJCQlicmlkZ2UtPnBjaV9idXMtPm51bWJlciwgYnJpZGdlLT5ucl9zbG90cywKKwkJCQlicmlkZ2UtPm5yX3Nsb3RzID09IDEgPyAiIiA6ICJzIik7CiAJCW51bV9zbG90cyArPSBicmlkZ2UtPm5yX3Nsb3RzOwogCX0KIAotCWRiZygiVG90YWwgJWRzbG90c1xuIiwgbnVtX3Nsb3RzKTsKKwlkYmcoIlRvdGFsICVkIHNsb3RzXG4iLCBudW1fc2xvdHMpOwogCXJldHVybiBudW1fc2xvdHM7CiB9CiAKQEAgLTEyNTQsNyArMTQwNyw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotCiAvKioKICAqIGFjcGlwaHBfZGlzYWJsZV9zbG90IC0gcG93ZXIgb2ZmIHNsb3QKICAqLwpAQCAtMTI3NCwxMyArMTQyNiw2IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJfZXhpdDsKIAotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmc2xvdC0+YnJpZGdlLT5pb19oZWFkKTsKLQlhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoJnNsb3QtPmJyaWRnZS0+bWVtX2hlYWQpOwotCWFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSgmc2xvdC0+YnJpZGdlLT5wX21lbV9oZWFkKTsKLQlhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoJnNsb3QtPmJyaWRnZS0+YnVzX2hlYWQpOwotCWRiZygiQXZhaWxhYmxlIHJlc291cmNlczpcbiIpOwotCWFjcGlwaHBfZHVtcF9yZXNvdXJjZShzbG90LT5icmlkZ2UpOwotCiAgZXJyX2V4aXQ6CiAJdXAoJnNsb3QtPmNyaXRfc2VjdCk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTEyOTMsMTEgKzE0MzgsNyBAQAogICovCiB1OCBhY3BpcGhwX2dldF9wb3dlcl9zdGF0dXMoc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCkKIHsKLQl1bnNpZ25lZCBpbnQgc3RhOwotCi0Jc3RhID0gZ2V0X3Nsb3Rfc3RhdHVzKHNsb3QpOwotCi0JcmV0dXJuIChzdGEgJiBBQ1BJX1NUQV9FTkFCTEVEKSA/IDEgOiAwOworCXJldHVybiAoc2xvdC0+ZmxhZ3MgJiBTTE9UX1BPV0VSRURPTik7CiB9CiAKIApAQCAtMTMzNSw5ICsxNDc2LDEwIEBACiB1MzIgYWNwaXBocF9nZXRfYWRkcmVzcyhzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KQogewogCXUzMiBhZGRyZXNzOworCXN0cnVjdCBwY2lfYnVzICpwY2lfYnVzID0gc2xvdC0+YnJpZGdlLT5wY2lfYnVzOwogCi0JYWRkcmVzcyA9ICgoc2xvdC0+YnJpZGdlLT5zZWcpIDw8IDE2KSB8Ci0JCSAgKChzbG90LT5icmlkZ2UtPmJ1cykgPDwgOCkgfAorCWFkZHJlc3MgPSAocGNpX2RvbWFpbl9ucihwY2lfYnVzKSA8PCAxNikgfAorCQkgIChwY2lfYnVzLT5udW1iZXIgPDwgOCkgfAogCQkgIHNsb3QtPmRldmljZTsKIAogCXJldHVybiBhZGRyZXNzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX3BjaS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX3BjaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ5N2M5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogQUNQSSBQQ0kgSG90UGx1ZyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBtYW5hZ2VtZW50Ci0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKLSAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIElCTSBDb3JwLgotICogQ29weXJpZ2h0IChDKSAyMDAyIFRha2F5b3NoaSBLb2NoaSAodC1rb2NoaUBicS5qcC5uZWMuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIEhpcm9zaGkgQW9ubyAoaC1hb25vQGFwLmpwLm5lYy5jb20pCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgTkVDIENvcnBvcmF0aW9uCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKiBTZW5kIGZlZWRiYWNrIHRvIDx0LWtvY2hpQGJxLmpwLm5lYy5jb20+Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSAiLi4vcGNpLmgiCi0jaW5jbHVkZSAicGNpX2hvdHBsdWcuaCIKLSNpbmNsdWRlICJhY3BpcGhwLmgiCi0KLSNkZWZpbmUgTVlfTkFNRSAiYWNwaXBocF9wY2kiCi0KLQotLyogYWxsb2NhdGUgbWVtL3BtZW0vaW8gcmVzb3VyY2UgdG8gYSBuZXcgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgaW5pdF9jb25maWdfc3BhY2UgKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCi17Ci0JdTMyIGJhciwgbGVuOwotCXUzMiBhZGRyZXNzW10gPSB7Ci0JCVBDSV9CQVNFX0FERFJFU1NfMCwKLQkJUENJX0JBU0VfQUREUkVTU18xLAotCQlQQ0lfQkFTRV9BRERSRVNTXzIsCi0JCVBDSV9CQVNFX0FERFJFU1NfMywKLQkJUENJX0JBU0VfQUREUkVTU180LAotCQlQQ0lfQkFTRV9BRERSRVNTXzUsCi0JCTAKLQl9OwotCWludCBjb3VudDsKLQlzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZTsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IHBjaV9idXMgKnBidXM7Ci0JaW50IGJ1cywgZGV2aWNlLCBmdW5jdGlvbjsKLQl1bnNpZ25lZCBpbnQgZGV2Zm47Ci0JdTE2IHRtcDsKLQotCWJyaWRnZSA9IGZ1bmMtPnNsb3QtPmJyaWRnZTsKLQlwYnVzID0gYnJpZGdlLT5wY2lfYnVzOwotCWJ1cyA9IGJyaWRnZS0+YnVzOwotCWRldmljZSA9IGZ1bmMtPnNsb3QtPmRldmljZTsKLQlmdW5jdGlvbiA9IGZ1bmMtPmZ1bmN0aW9uOwotCWRldmZuID0gUENJX0RFVkZOKGRldmljZSwgZnVuY3Rpb24pOwotCi0JZm9yIChjb3VudCA9IDA7IGFkZHJlc3NbY291bnRdOyBjb3VudCsrKSB7CS8qIGZvciA2IEJBUnMgKi8KLQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQocGJ1cywgZGV2Zm4sCi0JCQkJCSAgIGFkZHJlc3NbY291bnRdLCAweEZGRkZGRkZGKTsKLQkJcGNpX2J1c19yZWFkX2NvbmZpZ19kd29yZChwYnVzLCBkZXZmbiwgYWRkcmVzc1tjb3VudF0sICZiYXIpOwotCi0JCWlmICghYmFyKQkvKiBUaGlzIEJBUiBpcyBub3QgaW1wbGVtZW50ZWQgKi8KLQkJCWNvbnRpbnVlOwotCi0JCWRiZygiRGV2aWNlICUwMnguJTAyeCBCQVIgJWQgd2FudHMgJXhcbiIsIGRldmljZSwgZnVuY3Rpb24sIGNvdW50LCBiYXIpOwotCi0JCWlmIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7Ci0JCQkvKiBUaGlzIGlzIElPICovCi0KLQkJCWxlbiA9IGJhciAmIChQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgJiAweEZGRkYpOwotCQkJbGVuID0gbGVuICYgfihsZW4gLSAxKTsKLQotCQkJZGJnKCJsZW4gaW4gSU8gJXgsIEJBUiAlZFxuIiwgbGVuLCBjb3VudCk7Ci0KLQkJCXNwaW5fbG9jaygmYnJpZGdlLT5yZXNfbG9jayk7Ci0JCQlyZXMgPSBhY3BpcGhwX2dldF9pb19yZXNvdXJjZSgmYnJpZGdlLT5pb19oZWFkLCBsZW4pOwotCQkJc3Bpbl91bmxvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCi0JCQlpZiAoIXJlcykgewotCQkJCWVycigiY2Fubm90IGFsbG9jYXRlIHJlcXVlc3RlZCBpbyBmb3IgJTAyeDolMDJ4LiVkIGxlbiAleFxuIiwKLQkJCQkgICAgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uLCBsZW4pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKHBidXMsIGRldmZuLAotCQkJCQkJICAgYWRkcmVzc1tjb3VudF0sCi0JCQkJCQkgICAodTMyKXJlcy0+YmFzZSk7Ci0JCQlyZXMtPm5leHQgPSBmdW5jLT5pb19oZWFkOwotCQkJZnVuYy0+aW9faGVhZCA9IHJlczsKLQotCQl9IGVsc2UgewotCQkJLyogVGhpcyBpcyBNZW1vcnkgKi8KLQkJCWlmIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkgewotCQkJCS8qIHBmbWVtICovCi0KLQkJCQlsZW4gPSBiYXIgJiAweEZGRkZGRkYwOwotCQkJCWxlbiA9IH5sZW4gKyAxOwotCi0JCQkJZGJnKCJsZW4gaW4gUEZNRU0gJXgsIEJBUiAlZFxuIiwgbGVuLCBjb3VudCk7Ci0KLQkJCQlzcGluX2xvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQkJCXJlcyA9IGFjcGlwaHBfZ2V0X3Jlc291cmNlKCZicmlkZ2UtPnBfbWVtX2hlYWQsIGxlbik7Ci0JCQkJc3Bpbl91bmxvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCi0JCQkJaWYgKCFyZXMpIHsKLQkJCQkJZXJyKCJjYW5ub3QgYWxsb2NhdGUgcmVxdWVzdGVkIHBmbWVtIGZvciAlMDJ4OiUwMnguJWQgbGVuICV4XG4iLAotCQkJCQkgICAgYnVzLCBkZXZpY2UsIGZ1bmN0aW9uLCBsZW4pOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCi0JCQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQocGJ1cywgZGV2Zm4sCi0JCQkJCQkJICAgYWRkcmVzc1tjb3VudF0sCi0JCQkJCQkJICAgKHUzMilyZXMtPmJhc2UpOwotCi0JCQkJaWYgKGJhciAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpIHsJLyogdGFrZXMgdXAgYW5vdGhlciBkd29yZCAqLwotCQkJCQlkYmcoImluc2lkZSB0aGUgcGZtZW0gNjQgY2FzZSwgY291bnQgJWRcbiIsIGNvdW50KTsKLQkJCQkJY291bnQgKz0gMTsKLQkJCQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQocGJ1cywgZGV2Zm4sCi0JCQkJCQkJCSAgIGFkZHJlc3NbY291bnRdLAotCQkJCQkJCQkgICAodTMyKShyZXMtPmJhc2UgPj4gMzIpKTsKLQkJCQl9Ci0KLQkJCQlyZXMtPm5leHQgPSBmdW5jLT5wX21lbV9oZWFkOwotCQkJCWZ1bmMtPnBfbWVtX2hlYWQgPSByZXM7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJLyogcmVndWxhciBtZW1vcnkgKi8KLQotCQkJCWxlbiA9IGJhciAmIDB4RkZGRkZGRjA7Ci0JCQkJbGVuID0gfmxlbiArIDE7Ci0KLQkJCQlkYmcoImxlbiBpbiBNRU0gJXgsIEJBUiAlZFxuIiwgbGVuLCBjb3VudCk7Ci0KLQkJCQlzcGluX2xvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQkJCXJlcyA9IGFjcGlwaHBfZ2V0X3Jlc291cmNlKCZicmlkZ2UtPm1lbV9oZWFkLCBsZW4pOwotCQkJCXNwaW5fdW5sb2NrKCZicmlkZ2UtPnJlc19sb2NrKTsKLQotCQkJCWlmICghcmVzKSB7Ci0JCQkJCWVycigiY2Fubm90IGFsbG9jYXRlIHJlcXVlc3RlZCBwZm1lbSBmb3IgJTAyeDolMDJ4LiVkIGxlbiAleFxuIiwKLQkJCQkJICAgIGJ1cywgZGV2aWNlLCBmdW5jdGlvbiwgbGVuKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQotCQkJCXBjaV9idXNfd3JpdGVfY29uZmlnX2R3b3JkKHBidXMsIGRldmZuLAotCQkJCQkJCSAgIGFkZHJlc3NbY291bnRdLAotCQkJCQkJCSAgICh1MzIpcmVzLT5iYXNlKTsKLQotCQkJCWlmIChiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSB7Ci0JCQkJCS8qIHRha2VzIHVwIGFub3RoZXIgZHdvcmQgKi8KLQkJCQkJZGJnKCJpbnNpZGUgbWVtIDY0IGNhc2UsIHJlZy4gbWVtLCBjb3VudCAlZFxuIiwgY291bnQpOwotCQkJCQljb3VudCArPSAxOwotCQkJCQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZChwYnVzLCBkZXZmbiwKLQkJCQkJCQkJICAgYWRkcmVzc1tjb3VudF0sCi0JCQkJCQkJCSAgICh1MzIpKHJlcy0+YmFzZSA+PiAzMikpOwotCQkJCX0KLQotCQkJCXJlcy0+bmV4dCA9IGZ1bmMtPm1lbV9oZWFkOwotCQkJCWZ1bmMtPm1lbV9oZWFkID0gcmVzOwotCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBkaXNhYmxlIGV4cGFuc2lvbiByb20gKi8KLQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZChwYnVzLCBkZXZmbiwgUENJX1JPTV9BRERSRVNTLCAweDAwMDAwMDAwKTsKLQotCS8qIHNldCBQQ0kgcGFyYW1ldGVycyBmcm9tIF9IUFAgKi8KLQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19ieXRlKHBidXMsIGRldmZuLCBQQ0lfQ0FDSEVfTElORV9TSVpFLAotCQkJCSAgYnJpZGdlLT5ocHAuY2FjaGVfbGluZV9zaXplKTsKLQlwY2lfYnVzX3dyaXRlX2NvbmZpZ19ieXRlKHBidXMsIGRldmZuLCBQQ0lfTEFURU5DWV9USU1FUiwKLQkJCQkgIGJyaWRnZS0+aHBwLmxhdGVuY3lfdGltZXIpOwotCi0JcGNpX2J1c19yZWFkX2NvbmZpZ193b3JkKHBidXMsIGRldmZuLCBQQ0lfQ09NTUFORCwgJnRtcCk7Ci0JaWYgKGJyaWRnZS0+aHBwLmVuYWJsZV9TRVJSKQotCQl0bXAgfD0gUENJX0NPTU1BTkRfU0VSUjsKLQlpZiAoYnJpZGdlLT5ocHAuZW5hYmxlX1BFUlIpCi0JCXRtcCB8PSBQQ0lfQ09NTUFORF9QQVJJVFk7Ci0JcGNpX2J1c193cml0ZV9jb25maWdfd29yZChwYnVzLCBkZXZmbiwgUENJX0NPTU1BTkQsIHRtcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogZGV0ZWN0X3VzZWRfcmVzb3VyY2UgLSBzdWJ0cmFjdCByZXNvdXJjZSB1bmRlciBkZXYgZnJvbSBicmlkZ2UgKi8KLXN0YXRpYyBpbnQgZGV0ZWN0X3VzZWRfcmVzb3VyY2UgKHN0cnVjdCBhY3BpcGhwX2JyaWRnZSAqYnJpZGdlLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCBjb3VudDsKLQotCWRiZygiRGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgY291bnQrKykgewotCQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpyZXM7Ci0JCXN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkOwotCQl1bnNpZ25lZCBsb25nIGJhc2UgPSBkZXYtPnJlc291cmNlW2NvdW50XS5zdGFydDsKLQkJdW5zaWduZWQgbG9uZyBsZW4gPSBkZXYtPnJlc291cmNlW2NvdW50XS5lbmQgLSBiYXNlICsgMTsKLQkJdW5zaWduZWQgbG9uZyBmbGFncyA9IGRldi0+cmVzb3VyY2VbY291bnRdLmZsYWdzOwotCi0JCWlmICghZmxhZ3MpCi0JCQljb250aW51ZTsKLQotCQlkYmcoIkJBUlslZF0gMHglbHggLSAweCVseCAoMHglbHgpXG4iLCBjb3VudCwgYmFzZSwKLQkJCQliYXNlICsgbGVuIC0gMSwgZmxhZ3MpOwotCi0JCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKLQkJCWhlYWQgPSAmYnJpZGdlLT5pb19oZWFkOwotCQl9IGVsc2UgaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkgewotCQkJaGVhZCA9ICZicmlkZ2UtPnBfbWVtX2hlYWQ7Ci0JCX0gZWxzZSB7Ci0JCQloZWFkID0gJmJyaWRnZS0+bWVtX2hlYWQ7Ci0JCX0KLQotCQlzcGluX2xvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQlyZXMgPSBhY3BpcGhwX2dldF9yZXNvdXJjZV93aXRoX2Jhc2UoaGVhZCwgYmFzZSwgbGVuKTsKLQkJc3Bpbl91bmxvY2soJmJyaWRnZS0+cmVzX2xvY2spOwotCQlpZiAocmVzKQotCQkJa2ZyZWUocmVzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIGFjcGlwaHBfZGV0ZWN0X3BjaV9yZXNvdXJjZSAtIGRldGVjdCByZXNvdXJjZXMgdW5kZXIgYnJpZGdlCi0gKiBAYnJpZGdlOiBkZXRlY3QgYWxsIHJlc291cmNlcyBhbHJlYWR5IHVzZWQgdW5kZXIgdGhpcyBicmlkZ2UKLSAqCi0gKiBjb2xsZWN0IGFsbCByZXNvdXJjZXMgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIGFsbCBkZXZpY2VzIHVuZGVyIGEgYnJpZGdlLgotICovCi1pbnQgYWNwaXBocF9kZXRlY3RfcGNpX3Jlc291cmNlIChzdHJ1Y3QgYWNwaXBocF9icmlkZ2UgKmJyaWRnZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOwotCXN0cnVjdCBwY2lfZGV2ICpkZXY7Ci0KLQlsaXN0X2Zvcl9lYWNoIChsLCAmYnJpZGdlLT5wY2lfYnVzLT5kZXZpY2VzKSB7Ci0JCWRldiA9IHBjaV9kZXZfYihsKTsKLQkJZGV0ZWN0X3VzZWRfcmVzb3VyY2UoYnJpZGdlLCBkZXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLS8qKgotICogYWNwaXBocF9pbml0X3Nsb3RfcmVzb3VyY2UgLSBnYXRoZXIgcmVzb3VyY2UgdXNhZ2UgaW5mb3JtYXRpb24gb2YgYSBzbG90Ci0gKiBAc2xvdDogQUNQSSBzbG90IG9iamVjdCB0byBiZSBjaGVja2VkLCBzaG91bGQgaGF2ZSB2YWxpZCBwY2lfZGV2IG1lbWJlcgotICoKLSAqIFRCRDogUENJLXRvLVBDSSBicmlkZ2UgY2FzZQotICogICAgICB1c2UgcGNpX2Rldi0+cmVzb3VyY2VbXQotICovCi1pbnQgYWNwaXBocF9pbml0X2Z1bmNfcmVzb3VyY2UgKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCi17Ci0JdTY0IGJhc2U7Ci0JdTMyIGJhciwgbGVuOwotCXUzMiBhZGRyZXNzW10gPSB7Ci0JCVBDSV9CQVNFX0FERFJFU1NfMCwKLQkJUENJX0JBU0VfQUREUkVTU18xLAotCQlQQ0lfQkFTRV9BRERSRVNTXzIsCi0JCVBDSV9CQVNFX0FERFJFU1NfMywKLQkJUENJX0JBU0VfQUREUkVTU180LAotCQlQQ0lfQkFTRV9BRERSRVNTXzUsCi0JCTAKLQl9OwotCWludCBjb3VudDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpyZXM7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQotCWRldiA9IGZ1bmMtPnBjaV9kZXY7Ci0JZGJnKCJIb3QtcGx1Z2dhYmxlIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0KLQlmb3IgKGNvdW50ID0gMDsgYWRkcmVzc1tjb3VudF07IGNvdW50KyspIHsJLyogZm9yIDYgQkFScyAqLwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBhZGRyZXNzW2NvdW50XSwgJmJhcik7Ci0KLQkJaWYgKCFiYXIpCS8qIFRoaXMgQkFSIGlzIG5vdCBpbXBsZW1lbnRlZCAqLwotCQkJY29udGludWU7Ci0KLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGFkZHJlc3NbY291bnRdLCAweEZGRkZGRkZGKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgYWRkcmVzc1tjb3VudF0sICZsZW4pOwotCi0JCWlmIChsZW4gJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSB7Ci0JCQkvKiBUaGlzIGlzIElPICovCi0JCQliYXNlID0gYmFyICYgMHhGRkZGRkZGQzsKLQkJCWxlbiA9IGxlbiAmIChQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgJiAweEZGRkYpOwotCQkJbGVuID0gbGVuICYgfihsZW4gLSAxKTsKLQotCQkJZGJnKCJCQVJbJWRdICUwOHggLSAlMDh4IChJTylcbiIsIGNvdW50LCAodTMyKWJhc2UsICh1MzIpYmFzZSArIGxlbiAtIDEpOwotCi0JCQlyZXMgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoYmFzZSwgbGVuKTsKLQkJCWlmICghcmVzKQotCQkJCWdvdG8gbm9fbWVtb3J5OwotCi0JCQlyZXMtPm5leHQgPSBmdW5jLT5pb19oZWFkOwotCQkJZnVuYy0+aW9faGVhZCA9IHJlczsKLQotCQl9IGVsc2UgewotCQkJLyogVGhpcyBpcyBNZW1vcnkgKi8KLQkJCWJhc2UgPSBiYXIgJiAweEZGRkZGRkYwOwotCQkJaWYgKGxlbiAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENIKSB7Ci0JCQkJLyogcGZtZW0gKi8KLQotCQkJCWxlbiAmPSAweEZGRkZGRkYwOwotCQkJCWxlbiA9IH5sZW4gKyAxOwotCi0JCQkJaWYgKGxlbiAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpIHsJLyogdGFrZXMgdXAgYW5vdGhlciBkd29yZCAqLwotCQkJCQlkYmcoInByZWZldGNoIG1lbSA2NFxuIik7Ci0JCQkJCWNvdW50ICs9IDE7Ci0JCQkJfQotCQkJCWRiZygiQkFSWyVkXSAlMDh4IC0gJTA4eCAoUE1FTSlcbiIsIGNvdW50LCAodTMyKWJhc2UsICh1MzIpYmFzZSArIGxlbiAtIDEpOwotCQkJCXJlcyA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShiYXNlLCBsZW4pOwotCQkJCWlmICghcmVzKQotCQkJCQlnb3RvIG5vX21lbW9yeTsKLQotCQkJCXJlcy0+bmV4dCA9IGZ1bmMtPnBfbWVtX2hlYWQ7Ci0JCQkJZnVuYy0+cF9tZW1faGVhZCA9IHJlczsKLQotCQkJfSBlbHNlIHsKLQkJCQkvKiByZWd1bGFyIG1lbW9yeSAqLwotCi0JCQkJbGVuICY9IDB4RkZGRkZGRjA7Ci0JCQkJbGVuID0gfmxlbiArIDE7Ci0KLQkJCQlpZiAobGVuICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkgewotCQkJCQkvKiB0YWtlcyB1cCBhbm90aGVyIGR3b3JkICovCi0JCQkJCWRiZygibWVtIDY0XG4iKTsKLQkJCQkJY291bnQgKz0gMTsKLQkJCQl9Ci0JCQkJZGJnKCJCQVJbJWRdICUwOHggLSAlMDh4IChNRU0pXG4iLCBjb3VudCwgKHUzMiliYXNlLCAodTMyKWJhc2UgKyBsZW4gLSAxKTsKLQkJCQlyZXMgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2UoYmFzZSwgbGVuKTsKLQkJCQlpZiAoIXJlcykKLQkJCQkJZ290byBub19tZW1vcnk7Ci0KLQkJCQlyZXMtPm5leHQgPSBmdW5jLT5tZW1faGVhZDsKLQkJCQlmdW5jLT5tZW1faGVhZCA9IHJlczsKLQotCQkJfQotCQl9Ci0KLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIGFkZHJlc3NbY291bnRdLCBiYXIpOwotCX0KLSNpZiAxCi0JYWNwaXBocF9kdW1wX2Z1bmNfcmVzb3VyY2UoZnVuYyk7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotCi0gbm9fbWVtb3J5OgotCWVycigib3V0IG9mIG1lbW9yeVxuIik7Ci0JYWNwaXBocF9mcmVlX3Jlc291cmNlKCZmdW5jLT5pb19oZWFkKTsKLQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmZ1bmMtPm1lbV9oZWFkKTsKLQlhY3BpcGhwX2ZyZWVfcmVzb3VyY2UoJmZ1bmMtPnBfbWVtX2hlYWQpOwotCi0JcmV0dXJuIC0xOwotfQotCi0KLS8qKgotICogYWNwaXBocF9jb25maWd1cmVfc2xvdCAtIGFsbG9jYXRlIFBDSSByZXNvdXJjZXMKLSAqIEBzbG90OiBzbG90IHRvIGJlIGNvbmZpZ3VyZWQKLSAqCi0gKiBpbml0aWFsaXplcyBhIFBDSSBmdW5jdGlvbnMgb24gYSBkZXZpY2UgaW5zZXJ0ZWQKLSAqIGludG8gdGhlIHNsb3QKLSAqCi0gKi8KLWludCBhY3BpcGhwX2NvbmZpZ3VyZV9zbG90IChzdHJ1Y3QgYWNwaXBocF9zbG90ICpzbG90KQotewotCXN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbDsKLQl1OCBoZHI7Ci0JdTMyIGR2aWQ7Ci0JaW50IHJldHZhbCA9IDA7Ci0JaW50IGlzX211bHRpID0gMDsKLQotCXBjaV9idXNfcmVhZF9jb25maWdfYnl0ZShzbG90LT5icmlkZ2UtPnBjaV9idXMsCi0JCQkJIFBDSV9ERVZGTihzbG90LT5kZXZpY2UsIDApLAotCQkJCSBQQ0lfSEVBREVSX1RZUEUsICZoZHIpOwotCi0JaWYgKGhkciAmIDB4ODApCi0JCWlzX211bHRpID0gMTsKLQotCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgewotCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKLQkJaWYgKGlzX211bHRpIHx8IGZ1bmMtPmZ1bmN0aW9uID09IDApIHsKLQkJCXBjaV9idXNfcmVhZF9jb25maWdfZHdvcmQoc2xvdC0+YnJpZGdlLT5wY2lfYnVzLAotCQkJCQkJICBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlLAotCQkJCQkJCSAgICBmdW5jLT5mdW5jdGlvbiksCi0JCQkJCQkgIFBDSV9WRU5ET1JfSUQsICZkdmlkKTsKLQkJCWlmIChkdmlkICE9IDB4ZmZmZmZmZmYpIHsKLQkJCQlyZXR2YWwgPSBpbml0X2NvbmZpZ19zcGFjZShmdW5jKTsKLQkJCQlpZiAocmV0dmFsKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qKgotICogYWNwaXBocF9jb25maWd1cmVfZnVuY3Rpb24gLSBjb25maWd1cmUgUENJIGZ1bmN0aW9uCi0gKiBAZnVuYzogZnVuY3Rpb24gdG8gYmUgY29uZmlndXJlZAotICoKLSAqIGluaXRpYWxpemVzIGEgUENJIGZ1bmN0aW9ucyBvbiBhIGRldmljZSBpbnNlcnRlZAotICogaW50byB0aGUgc2xvdAotICoKLSAqLwotaW50IGFjcGlwaHBfY29uZmlndXJlX2Z1bmN0aW9uIChzdHJ1Y3QgYWNwaXBocF9mdW5jICpmdW5jKQotewotCS8qIGFsbCBoYW5kbGVkIGJ5IHRoZSBwY2kgY29yZSBub3cgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBhY3BpcGhwX3VuY29uZmlndXJlX2Z1bmN0aW9uIC0gdW5jb25maWd1cmUgUENJIGZ1bmN0aW9uCi0gKiBAZnVuYzogZnVuY3Rpb24gdG8gYmUgdW5jb25maWd1cmVkCi0gKgotICovCi12b2lkIGFjcGlwaHBfdW5jb25maWd1cmVfZnVuY3Rpb24gKHN0cnVjdCBhY3BpcGhwX2Z1bmMgKmZ1bmMpCi17Ci0Jc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2U7Ci0KLQkvKiBpZiBwY2lfZGV2IGlzIE5VTEwsIGlnbm9yZSBpdCAqLwotCWlmICghZnVuYy0+cGNpX2RldikKLQkJcmV0dXJuOwotCi0JcGNpX3JlbW92ZV9idXNfZGV2aWNlKGZ1bmMtPnBjaV9kZXYpOwotCi0JLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCi0JYnJpZGdlID0gZnVuYy0+c2xvdC0+YnJpZGdlOwotCi0Jc3Bpbl9sb2NrKCZicmlkZ2UtPnJlc19sb2NrKTsKLQlhY3BpcGhwX21vdmVfcmVzb3VyY2UoJmZ1bmMtPmlvX2hlYWQsICZicmlkZ2UtPmlvX2hlYWQpOwotCWFjcGlwaHBfbW92ZV9yZXNvdXJjZSgmZnVuYy0+bWVtX2hlYWQsICZicmlkZ2UtPm1lbV9oZWFkKTsKLQlhY3BpcGhwX21vdmVfcmVzb3VyY2UoJmZ1bmMtPnBfbWVtX2hlYWQsICZicmlkZ2UtPnBfbWVtX2hlYWQpOwotCWFjcGlwaHBfbW92ZV9yZXNvdXJjZSgmZnVuYy0+YnVzX2hlYWQsICZicmlkZ2UtPmJ1c19oZWFkKTsKLQlzcGluX3VubG9jaygmYnJpZGdlLT5yZXNfbG9jayk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfcmVzLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfcmVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NGIxZmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX3Jlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAwICswLDAgQEAKLS8qCi0gKiBBQ1BJIFBDSSBIb3RQbHVnIFV0aWxpdHkgZnVuY3Rpb25zCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKLSAqIENvcHlyaWdodCAoQykgMjAwMSBJQk0gQ29ycC4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBIaXJvc2hpIEFvbm8gKGgtYW9ub0BhcC5qcC5uZWMuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIFRha2F5b3NoaSBLb2NoaSAodC1rb2NoaUBicS5qcC5uZWMuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDAyIE5FQyBDb3Jwb3JhdGlvbgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogU2VuZCBmZWVkYmFjayB0byA8Z3JlZ2toQHVzLmlibS5jb20+LCA8dC1rb2NoaUBicS5qcC5uZWMuY29tPgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLQotI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCi0jaW5jbHVkZSAiYWNwaXBocC5oIgotCi0jZGVmaW5lIE1ZX05BTUUgImFjcGlwaHBfcmVzIgotCi0KLS8qCi0gKiBzb3J0X2J5X3NpemUgLSBzb3J0IG5vZGVzIGJ5IHRoZWlyIGxlbmd0aCwgc21hbGxlc3QgZmlyc3QKLSAqLwotc3RhdGljIGludCBzb3J0X2J5X3NpemUoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqY3VycmVudF9yZXM7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbmV4dF9yZXM7Ci0JaW50IG91dF9vZl9vcmRlciA9IDE7Ci0KLQlpZiAoISgqaGVhZCkpCi0JCXJldHVybiAxOwotCi0JaWYgKCEoKCpoZWFkKS0+bmV4dCkpCi0JCXJldHVybiAwOwotCi0Jd2hpbGUgKG91dF9vZl9vcmRlcikgewotCQlvdXRfb2Zfb3JkZXIgPSAwOwotCi0JCS8qIFNwZWNpYWwgY2FzZSBmb3Igc3dhcHBpbmcgbGlzdCBoZWFkICovCi0JCWlmICgoKCpoZWFkKS0+bmV4dCkgJiYKLQkJICAgICgoKmhlYWQpLT5sZW5ndGggPiAoKmhlYWQpLT5uZXh0LT5sZW5ndGgpKSB7Ci0JCQlvdXRfb2Zfb3JkZXIrKzsKLQkJCWN1cnJlbnRfcmVzID0gKmhlYWQ7Ci0JCQkqaGVhZCA9ICgqaGVhZCktPm5leHQ7Ci0JCQljdXJyZW50X3Jlcy0+bmV4dCA9ICgqaGVhZCktPm5leHQ7Ci0JCQkoKmhlYWQpLT5uZXh0ID0gY3VycmVudF9yZXM7Ci0JCX0KLQotCQljdXJyZW50X3JlcyA9ICpoZWFkOwotCi0JCXdoaWxlIChjdXJyZW50X3Jlcy0+bmV4dCAmJiBjdXJyZW50X3Jlcy0+bmV4dC0+bmV4dCkgewotCQkJaWYgKGN1cnJlbnRfcmVzLT5uZXh0LT5sZW5ndGggPiBjdXJyZW50X3Jlcy0+bmV4dC0+bmV4dC0+bGVuZ3RoKSB7Ci0JCQkJb3V0X29mX29yZGVyKys7Ci0JCQkJbmV4dF9yZXMgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJCQljdXJyZW50X3Jlcy0+bmV4dCA9IGN1cnJlbnRfcmVzLT5uZXh0LT5uZXh0OwotCQkJCWN1cnJlbnRfcmVzID0gY3VycmVudF9yZXMtPm5leHQ7Ci0JCQkJbmV4dF9yZXMtPm5leHQgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJCQljdXJyZW50X3Jlcy0+bmV4dCA9IG5leHRfcmVzOwotCQkJfSBlbHNlCi0JCQkJY3VycmVudF9yZXMgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJfQotCX0gIC8qIEVuZCBvZiBvdXRfb2Zfb3JkZXIgbG9vcCAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZiAwCi0vKgotICogc29ydF9ieV9tYXhfc2l6ZSAtIHNvcnQgbm9kZXMgYnkgdGhlaXIgbGVuZ3RoLCBsYXJnZXN0IGZpcnN0Ci0gKi8KLXN0YXRpYyBpbnQgc29ydF9ieV9tYXhfc2l6ZShzdHJ1Y3QgcGNpX3Jlc291cmNlICoqaGVhZCkKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpjdXJyZW50X3JlczsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpuZXh0X3JlczsKLQlpbnQgb3V0X29mX29yZGVyID0gMTsKLQotCWlmICghKCpoZWFkKSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoISgoKmhlYWQpLT5uZXh0KSkKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAob3V0X29mX29yZGVyKSB7Ci0JCW91dF9vZl9vcmRlciA9IDA7Ci0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciBzd2FwcGluZyBsaXN0IGhlYWQgKi8KLQkJaWYgKCgoKmhlYWQpLT5uZXh0KSAmJgotCQkgICAgKCgqaGVhZCktPmxlbmd0aCA8ICgqaGVhZCktPm5leHQtPmxlbmd0aCkpIHsKLQkJCW91dF9vZl9vcmRlcisrOwotCQkJY3VycmVudF9yZXMgPSAqaGVhZDsKLQkJCSpoZWFkID0gKCpoZWFkKS0+bmV4dDsKLQkJCWN1cnJlbnRfcmVzLT5uZXh0ID0gKCpoZWFkKS0+bmV4dDsKLQkJCSgqaGVhZCktPm5leHQgPSBjdXJyZW50X3JlczsKLQkJfQotCi0JCWN1cnJlbnRfcmVzID0gKmhlYWQ7Ci0KLQkJd2hpbGUgKGN1cnJlbnRfcmVzLT5uZXh0ICYmIGN1cnJlbnRfcmVzLT5uZXh0LT5uZXh0KSB7Ci0JCQlpZiAoY3VycmVudF9yZXMtPm5leHQtPmxlbmd0aCA8IGN1cnJlbnRfcmVzLT5uZXh0LT5uZXh0LT5sZW5ndGgpIHsKLQkJCQlvdXRfb2Zfb3JkZXIrKzsKLQkJCQluZXh0X3JlcyA9IGN1cnJlbnRfcmVzLT5uZXh0OwotCQkJCWN1cnJlbnRfcmVzLT5uZXh0ID0gY3VycmVudF9yZXMtPm5leHQtPm5leHQ7Ci0JCQkJY3VycmVudF9yZXMgPSBjdXJyZW50X3Jlcy0+bmV4dDsKLQkJCQluZXh0X3Jlcy0+bmV4dCA9IGN1cnJlbnRfcmVzLT5uZXh0OwotCQkJCWN1cnJlbnRfcmVzLT5uZXh0ID0gbmV4dF9yZXM7Ci0JCQl9IGVsc2UKLQkJCQljdXJyZW50X3JlcyA9IGN1cnJlbnRfcmVzLT5uZXh0OwotCQl9Ci0JfSAgLyogRW5kIG9mIG91dF9vZl9vcmRlciBsb29wICovCi0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKioKLSAqIGdldF9pb19yZXNvdXJjZSAtIGdldCByZXNvdXJjZSBmb3IgSS9PIHBvcnRzCi0gKgotICogdGhpcyBmdW5jdGlvbiBzb3J0cyB0aGUgcmVzb3VyY2UgbGlzdCBieSBzaXplIGFuZCB0aGVuCi0gKiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9mICJzaXplIiBsZW5ndGggdGhhdCBpcyBub3QgaW4gdGhlCi0gKiBJU0EgYWxpYXNpbmcgd2luZG93LiAgSWYgaXQgZmluZHMgYSBub2RlIGxhcmdlciB0aGFuICJzaXplIgotICogaXQgd2lsbCBzcGxpdCBpdCB1cC4KLSAqCi0gKiBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKgotICogZGlmZmVyZW5jZSBmcm9tIGdldF9yZXNvdXJjZSBpcyBoYW5kbGluZyBvZiBJU0EgYWxpYXNpbmcgc3BhY2UuCi0gKgotICovCi1zdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX2dldF9pb19yZXNvdXJjZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQsIHUzMiBzaXplKQotewotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnByZXZub2RlOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKm5vZGU7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqc3BsaXRfbm9kZTsKLQl1NjQgdGVtcF9xd29yZDsKLQotCWlmICghKCpoZWFkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoYWNwaXBocF9yZXNvdXJjZV9zb3J0X2FuZF9jb21iaW5lKGhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChzb3J0X2J5X3NpemUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChub2RlID0gKmhlYWQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0JCWlmIChub2RlLT5sZW5ndGggPCBzaXplKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG5vZGUtPmJhc2UgJiAoc2l6ZSAtIDEpKSB7Ci0JCQkvKiB0aGlzIG9uZSBpc24ndCBiYXNlIGFsaWduZWQgcHJvcGVybHkKLQkJCSAgIHNvIHdlJ2xsIG1ha2UgYSBuZXcgZW50cnkgYW5kIHNwbGl0IGl0IHVwICovCi0JCQl0ZW1wX3F3b3JkID0gKG5vZGUtPmJhc2UgfCAoc2l6ZS0xKSkgKyAxOwotCi0JCQkvKiBTaG9ydCBjaXJjdWl0IGlmIGFkanVzdGVkIHNpemUgaXMgdG9vIHNtYWxsICovCi0JCQlpZiAoKG5vZGUtPmxlbmd0aCAtICh0ZW1wX3F3b3JkIC0gbm9kZS0+YmFzZSkpIDwgc2l6ZSkKLQkJCQljb250aW51ZTsKLQotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShub2RlLT5iYXNlLCB0ZW1wX3F3b3JkIC0gbm9kZS0+YmFzZSk7Ci0KLQkJCWlmICghc3BsaXRfbm9kZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbm9kZS0+YmFzZSA9IHRlbXBfcXdvcmQ7Ci0JCQlub2RlLT5sZW5ndGggLT0gc3BsaXRfbm9kZS0+bGVuZ3RoOwotCi0JCQkvKiBQdXQgaXQgaW4gdGhlIGxpc3QgKi8KLQkJCXNwbGl0X25vZGUtPm5leHQgPSBub2RlLT5uZXh0OwotCQkJbm9kZS0+bmV4dCA9IHNwbGl0X25vZGU7Ci0JCX0gLyogRW5kIG9mIG5vbi1hbGlnbmVkIGJhc2UgKi8KLQotCQkvKiBEb24ndCBuZWVkIHRvIGNoZWNrIGlmIHRvbyBzbWFsbCBzaW5jZSB3ZSBhbHJlYWR5IGRpZCAqLwotCQlpZiAobm9kZS0+bGVuZ3RoID4gc2l6ZSkgewotCQkJLyogdGhpcyBvbmUgaXMgbG9uZ2VyIHRoYW4gd2UgbmVlZAotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXNwbGl0X25vZGUgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2Uobm9kZS0+YmFzZSArIHNpemUsIG5vZGUtPmxlbmd0aCAtIHNpemUpOwotCi0JCQlpZiAoIXNwbGl0X25vZGUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW5vZGUtPmxlbmd0aCA9IHNpemU7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfSAgLyogRW5kIG9mIHRvbyBiaWcgb24gdG9wIGVuZCAqLwotCi0JCS8qIEZvciBJTyBtYWtlIHN1cmUgaXQncyBub3QgaW4gdGhlIElTQSBhbGlhc2luZyBzcGFjZSAqLwotCQlpZiAoKG5vZGUtPmJhc2UgJiAweDMwMEwpICYmICEobm9kZS0+YmFzZSAmIDB4ZmZmZmYwMDApKQotCQkJY29udGludWU7Ci0KLQkJLyogSWYgd2UgZ290IGhlcmUsIHRoZW4gaXQgaXMgdGhlIHJpZ2h0IHNpemUKLQkJICAgTm93IHRha2UgaXQgb3V0IG9mIHRoZSBsaXN0ICovCi0JCWlmICgqaGVhZCA9PSBub2RlKSB7Ci0JCQkqaGVhZCA9IG5vZGUtPm5leHQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2bm9kZSA9ICpoZWFkOwotCQkJd2hpbGUgKHByZXZub2RlLT5uZXh0ICE9IG5vZGUpCi0JCQkJcHJldm5vZGUgPSBwcmV2bm9kZS0+bmV4dDsKLQotCQkJcHJldm5vZGUtPm5leHQgPSBub2RlLT5uZXh0OwotCQl9Ci0JCW5vZGUtPm5leHQgPSBOVUxMOwotCQkvKiBTdG9wIGxvb3BpbmcgKi8KLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG5vZGU7Ci19Ci0KLQotI2lmIDAKLS8qKgotICogZ2V0X21heF9yZXNvdXJjZSAtIGdldCB0aGUgbGFyZ2VzdCByZXNvdXJjZQotICoKLSAqIEdldHMgdGhlIGxhcmdlc3Qgbm9kZSB0aGF0IGlzIGF0IGxlYXN0ICJzaXplIiBiaWcgZnJvbSB0aGUKLSAqIGxpc3QgcG9pbnRlZCB0byBieSBoZWFkLiAgSXQgYWxpZ25zIHRoZSBub2RlIG9uIHRvcCBhbmQgYm90dG9tCi0gKiB0byAic2l6ZSIgYWxpZ25tZW50IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX2dldF9tYXhfcmVzb3VyY2UgKHN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkLCB1MzIgc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICptYXg7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqdGVtcDsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpzcGxpdF9ub2RlOwotCXU2NCB0ZW1wX3F3b3JkOwotCi0JaWYgKCEoKmhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKHNvcnRfYnlfbWF4X3NpemUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChtYXggPSAqaGVhZDttYXg7IG1heCA9IG1heC0+bmV4dCkgewotCi0JCS8qIElmIG5vdCBiaWcgZW5vdWdoIHdlIGNvdWxkIHByb2JhYmx5IGp1c3QgYmFpbCwKLQkJICAgaW5zdGVhZCB3ZSdsbCBjb250aW51ZSB0byB0aGUgbmV4dC4gKi8KLQkJaWYgKG1heC0+bGVuZ3RoIDwgc2l6ZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChtYXgtPmJhc2UgJiAoc2l6ZSAtIDEpKSB7Ci0JCQkvKiB0aGlzIG9uZSBpc24ndCBiYXNlIGFsaWduZWQgcHJvcGVybHkKLQkJCSAgIHNvIHdlJ2xsIG1ha2UgYSBuZXcgZW50cnkgYW5kIHNwbGl0IGl0IHVwICovCi0JCQl0ZW1wX3F3b3JkID0gKG1heC0+YmFzZSB8IChzaXplLTEpKSArIDE7Ci0KLQkJCS8qIFNob3J0IGNpcmN1aXQgaWYgYWRqdXN0ZWQgc2l6ZSBpcyB0b28gc21hbGwgKi8KLQkJCWlmICgobWF4LT5sZW5ndGggLSAodGVtcF9xd29yZCAtIG1heC0+YmFzZSkpIDwgc2l6ZSkKLQkJCQljb250aW51ZTsKLQotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShtYXgtPmJhc2UsIHRlbXBfcXdvcmQgLSBtYXgtPmJhc2UpOwotCi0JCQlpZiAoIXNwbGl0X25vZGUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW1heC0+YmFzZSA9IHRlbXBfcXdvcmQ7Ci0JCQltYXgtPmxlbmd0aCAtPSBzcGxpdF9ub2RlLT5sZW5ndGg7Ci0KLQkJCS8qIFB1dCBpdCBuZXh0IGluIHRoZSBsaXN0ICovCi0JCQlzcGxpdF9ub2RlLT5uZXh0ID0gbWF4LT5uZXh0OwotCQkJbWF4LT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfQotCi0JCWlmICgobWF4LT5iYXNlICsgbWF4LT5sZW5ndGgpICYgKHNpemUgLSAxKSkgewotCQkJLyogdGhpcyBvbmUgaXNuJ3QgZW5kIGFsaWduZWQgcHJvcGVybHkgYXQgdGhlIHRvcAotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXRlbXBfcXdvcmQgPSAoKG1heC0+YmFzZSArIG1heC0+bGVuZ3RoKSAmIH4oc2l6ZSAtIDEpKTsKLQotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZSh0ZW1wX3F3b3JkLAotCQkJCQkJCSAgIG1heC0+bGVuZ3RoICsgbWF4LT5iYXNlIC0gdGVtcF9xd29yZCk7Ci0KLQkJCWlmICghc3BsaXRfbm9kZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbWF4LT5sZW5ndGggLT0gc3BsaXRfbm9kZS0+bGVuZ3RoOwotCi0JCQkvKiBQdXQgaXQgaW4gdGhlIGxpc3QgKi8KLQkJCXNwbGl0X25vZGUtPm5leHQgPSBtYXgtPm5leHQ7Ci0JCQltYXgtPm5leHQgPSBzcGxpdF9ub2RlOwotCQl9Ci0KLQkJLyogTWFrZSBzdXJlIGl0IGRpZG4ndCBzaHJpbmsgdG9vIG11Y2ggd2hlbiB3ZSBhbGlnbmVkIGl0ICovCi0JCWlmIChtYXgtPmxlbmd0aCA8IHNpemUpCi0JCQljb250aW51ZTsKLQotCQkvKiBOb3cgdGFrZSBpdCBvdXQgb2YgdGhlIGxpc3QgKi8KLQkJdGVtcCA9IChzdHJ1Y3QgcGNpX3Jlc291cmNlKikgKmhlYWQ7Ci0JCWlmICh0ZW1wID09IG1heCkgewotCQkJKmhlYWQgPSBtYXgtPm5leHQ7Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAodGVtcCAmJiB0ZW1wLT5uZXh0ICE9IG1heCkgewotCQkJCXRlbXAgPSB0ZW1wLT5uZXh0OwotCQkJfQotCi0JCQl0ZW1wLT5uZXh0ID0gbWF4LT5uZXh0OwotCQl9Ci0KLQkJbWF4LT5uZXh0ID0gTlVMTDsKLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQkvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgY291bGRuJ3QgZmluZCBvbmUgKi8KLQlyZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgotCi0vKioKLSAqIGdldF9yZXNvdXJjZSAtIGdldCByZXNvdXJjZSAobWVtLCBwZm1lbSkKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIHNvcnRzIHRoZSByZXNvdXJjZSBsaXN0IGJ5IHNpemUgYW5kIHRoZW4KLSAqIHJldHVybnMgdGhlIGZpcnN0IG5vZGUgb2YgInNpemUiIGxlbmd0aC4gIElmIGl0IGZpbmRzIGEgbm9kZQotICogbGFyZ2VyIHRoYW4gInNpemUiIGl0IHdpbGwgc3BsaXQgaXQgdXAuCi0gKgotICogc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgotICoKLSAqLwotc3RydWN0IHBjaV9yZXNvdXJjZSAqYWNwaXBocF9nZXRfcmVzb3VyY2UgKHN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkLCB1MzIgc2l6ZSkKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpwcmV2bm9kZTsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpub2RlOwotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnNwbGl0X25vZGU7Ci0JdTY0IHRlbXBfcXdvcmQ7Ci0KLQlpZiAoISgqaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZShoZWFkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoc29ydF9ieV9zaXplKGhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAobm9kZSA9ICpoZWFkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgewotCQlkYmcoIiVzOiByZXFfc2l6ZSA9JXggbm9kZT0lcCwgYmFzZT0leCwgbGVuZ3RoPSV4XG4iLAotCQkgICAgX19GVU5DVElPTl9fLCBzaXplLCBub2RlLCAodTMyKW5vZGUtPmJhc2UsIG5vZGUtPmxlbmd0aCk7Ci0JCWlmIChub2RlLT5sZW5ndGggPCBzaXplKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG5vZGUtPmJhc2UgJiAoc2l6ZSAtIDEpKSB7Ci0JCQlkYmcoIiVzOiBub3QgYWxpZ25lZFxuIiwgX19GVU5DVElPTl9fKTsKLQkJCS8qIHRoaXMgb25lIGlzbid0IGJhc2UgYWxpZ25lZCBwcm9wZXJseQotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXRlbXBfcXdvcmQgPSAobm9kZS0+YmFzZSB8IChzaXplLTEpKSArIDE7Ci0KLQkJCS8qIFNob3J0IGNpcmN1aXQgaWYgYWRqdXN0ZWQgc2l6ZSBpcyB0b28gc21hbGwgKi8KLQkJCWlmICgobm9kZS0+bGVuZ3RoIC0gKHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKSkgPCBzaXplKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzcGxpdF9ub2RlID0gYWNwaXBocF9tYWtlX3Jlc291cmNlKG5vZGUtPmJhc2UsIHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKTsKLQotCQkJaWYgKCFzcGxpdF9ub2RlKQotCQkJCXJldHVybiBOVUxMOwotCi0JCQlub2RlLT5iYXNlID0gdGVtcF9xd29yZDsKLQkJCW5vZGUtPmxlbmd0aCAtPSBzcGxpdF9ub2RlLT5sZW5ndGg7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfSAvKiBFbmQgb2Ygbm9uLWFsaWduZWQgYmFzZSAqLwotCi0JCS8qIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdG9vIHNtYWxsIHNpbmNlIHdlIGFscmVhZHkgZGlkICovCi0JCWlmIChub2RlLT5sZW5ndGggPiBzaXplKSB7Ci0JCQlkYmcoIiVzOiB0b28gYmlnXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJLyogdGhpcyBvbmUgaXMgbG9uZ2VyIHRoYW4gd2UgbmVlZAotCQkJICAgc28gd2UnbGwgbWFrZSBhIG5ldyBlbnRyeSBhbmQgc3BsaXQgaXQgdXAgKi8KLQkJCXNwbGl0X25vZGUgPSBhY3BpcGhwX21ha2VfcmVzb3VyY2Uobm9kZS0+YmFzZSArIHNpemUsIG5vZGUtPmxlbmd0aCAtIHNpemUpOwotCi0JCQlpZiAoIXNwbGl0X25vZGUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0KLQkJCW5vZGUtPmxlbmd0aCA9IHNpemU7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfSAgLyogRW5kIG9mIHRvbyBiaWcgb24gdG9wIGVuZCAqLwotCi0JCWRiZygiJXM6IGdvdCBvbmUhISFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCS8qIElmIHdlIGdvdCBoZXJlLCB0aGVuIGl0IGlzIHRoZSByaWdodCBzaXplCi0JCSAgIE5vdyB0YWtlIGl0IG91dCBvZiB0aGUgbGlzdCAqLwotCQlpZiAoKmhlYWQgPT0gbm9kZSkgewotCQkJKmhlYWQgPSBub2RlLT5uZXh0OwotCQl9IGVsc2UgewotCQkJcHJldm5vZGUgPSAqaGVhZDsKLQkJCXdoaWxlIChwcmV2bm9kZS0+bmV4dCAhPSBub2RlKQotCQkJCXByZXZub2RlID0gcHJldm5vZGUtPm5leHQ7Ci0KLQkJCXByZXZub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKLQkJfQotCQlub2RlLT5uZXh0ID0gTlVMTDsKLQkJLyogU3RvcCBsb29waW5nICovCi0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbm9kZTsKLX0KLQotLyoqCi0gKiBnZXRfcmVzb3VyY2Vfd2l0aF9iYXNlIC0gZ2V0IHJlc291cmNlIHdpdGggc3BlY2lmaWMgYmFzZSBhZGRyZXNzCi0gKgotICogdGhpcyBmdW5jdGlvbgotICogcmV0dXJucyB0aGUgZmlyc3Qgbm9kZSBvZiAic2l6ZSIgbGVuZ3RoIGxvY2F0ZWQgYXQgc3BlY2lmaWVkIGJhc2UgYWRkcmVzcy4KLSAqIElmIGl0IGZpbmRzIGEgbm9kZSBsYXJnZXIgdGhhbiAic2l6ZSIgaXQgd2lsbCBzcGxpdCBpdCB1cC4KLSAqCi0gKiBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCi0gKgotICovCi1zdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX2dldF9yZXNvdXJjZV93aXRoX2Jhc2UgKHN0cnVjdCBwY2lfcmVzb3VyY2UgKipoZWFkLCB1NjQgYmFzZSwgdTMyIHNpemUpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqcHJldm5vZGU7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbm9kZTsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICpzcGxpdF9ub2RlOwotCXU2NCB0ZW1wX3F3b3JkOwotCi0JaWYgKCEoKmhlYWQpKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmIChhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUoaGVhZCkpCi0JCXJldHVybiBOVUxMOwotCi0JZm9yIChub2RlID0gKmhlYWQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0JCWRiZygiOiAxc3QgcmVxX2Jhc2U9JXggcmVxX3NpemUgPSV4IG5vZGU9JXAsIGJhc2U9JXgsIGxlbmd0aD0leFxuIiwKLQkJICAgICh1MzIpYmFzZSwgc2l6ZSwgbm9kZSwgKHUzMilub2RlLT5iYXNlLCBub2RlLT5sZW5ndGgpOwotCQlpZiAobm9kZS0+YmFzZSA+IGJhc2UpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKG5vZGUtPmJhc2UgKyBub2RlLT5sZW5ndGgpIDwgKGJhc2UgKyBzaXplKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChub2RlLT5iYXNlIDwgYmFzZSkgewotCQkJZGJnKCI6IHNwbGl0IDFcbiIpOwotCQkJLyogdGhpcyBvbmUgaXNuJ3QgYmFzZSBhbGlnbmVkIHByb3Blcmx5Ci0JCQkgICBzbyB3ZSdsbCBtYWtlIGEgbmV3IGVudHJ5IGFuZCBzcGxpdCBpdCB1cCAqLwotCQkJdGVtcF9xd29yZCA9IGJhc2U7Ci0KLQkJCS8qIFNob3J0IGNpcmN1aXQgaWYgYWRqdXN0ZWQgc2l6ZSBpcyB0b28gc21hbGwgKi8KLQkJCWlmICgobm9kZS0+bGVuZ3RoIC0gKHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKSkgPCBzaXplKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzcGxpdF9ub2RlID0gYWNwaXBocF9tYWtlX3Jlc291cmNlKG5vZGUtPmJhc2UsIHRlbXBfcXdvcmQgLSBub2RlLT5iYXNlKTsKLQotCQkJaWYgKCFzcGxpdF9ub2RlKQotCQkJCXJldHVybiBOVUxMOwotCi0JCQlub2RlLT5iYXNlID0gdGVtcF9xd29yZDsKLQkJCW5vZGUtPmxlbmd0aCAtPSBzcGxpdF9ub2RlLT5sZW5ndGg7Ci0KLQkJCS8qIFB1dCBpdCBpbiB0aGUgbGlzdCAqLwotCQkJc3BsaXRfbm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCQlub2RlLT5uZXh0ID0gc3BsaXRfbm9kZTsKLQkJfQotCi0JCWRiZygiOiAybmQgcmVxX2Jhc2U9JXggcmVxX3NpemUgPSV4IG5vZGU9JXAsIGJhc2U9JXgsIGxlbmd0aD0leFxuIiwKLQkJICAgICh1MzIpYmFzZSwgc2l6ZSwgbm9kZSwgKHUzMilub2RlLT5iYXNlLCBub2RlLT5sZW5ndGgpOwotCi0JCS8qIERvbid0IG5lZWQgdG8gY2hlY2sgaWYgdG9vIHNtYWxsIHNpbmNlIHdlIGFscmVhZHkgZGlkICovCi0JCWlmIChub2RlLT5sZW5ndGggPiBzaXplKSB7Ci0JCQlkYmcoIjogc3BsaXQgMlxuIik7Ci0JCQkvKiB0aGlzIG9uZSBpcyBsb25nZXIgdGhhbiB3ZSBuZWVkCi0JCQkgICBzbyB3ZSdsbCBtYWtlIGEgbmV3IGVudHJ5IGFuZCBzcGxpdCBpdCB1cCAqLwotCQkJc3BsaXRfbm9kZSA9IGFjcGlwaHBfbWFrZV9yZXNvdXJjZShub2RlLT5iYXNlICsgc2l6ZSwgbm9kZS0+bGVuZ3RoIC0gc2l6ZSk7Ci0KLQkJCWlmICghc3BsaXRfbm9kZSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQkJbm9kZS0+bGVuZ3RoID0gc2l6ZTsKLQotCQkJLyogUHV0IGl0IGluIHRoZSBsaXN0ICovCi0JCQlzcGxpdF9ub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKLQkJCW5vZGUtPm5leHQgPSBzcGxpdF9ub2RlOwotCQl9ICAvKiBFbmQgb2YgdG9vIGJpZyBvbiB0b3AgZW5kICovCi0KLQkJZGJnKCI6IGdvdCBvbmUhISFcbiIpOwotCQkvKiBJZiB3ZSBnb3QgaGVyZSwgdGhlbiBpdCBpcyB0aGUgcmlnaHQgc2l6ZQotCQkgICBOb3cgdGFrZSBpdCBvdXQgb2YgdGhlIGxpc3QgKi8KLQkJaWYgKCpoZWFkID09IG5vZGUpIHsKLQkJCSpoZWFkID0gbm9kZS0+bmV4dDsKLQkJfSBlbHNlIHsKLQkJCXByZXZub2RlID0gKmhlYWQ7Ci0JCQl3aGlsZSAocHJldm5vZGUtPm5leHQgIT0gbm9kZSkKLQkJCQlwcmV2bm9kZSA9IHByZXZub2RlLT5uZXh0OwotCi0JCQlwcmV2bm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0JCX0KLQkJbm9kZS0+bmV4dCA9IE5VTEw7Ci0JCS8qIFN0b3AgbG9vcGluZyAqLwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIG5vZGU7Ci19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX3Jlc291cmNlX3NvcnRfYW5kX2NvbWJpbmUKLSAqCi0gKiBTb3J0cyBhbGwgb2YgdGhlIG5vZGVzIGluIHRoZSBsaXN0IGluIGFzY2VuZGluZyBvcmRlciBieQotICogdGhlaXIgYmFzZSBhZGRyZXNzZXMuICBBbHNvIGRvZXMgZ2FyYmFnZSBjb2xsZWN0aW9uIGJ5Ci0gKiBjb21iaW5pbmcgYWRqYWNlbnQgbm9kZXMuCi0gKgotICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MKLSAqLwotaW50IGFjcGlwaHBfcmVzb3VyY2Vfc29ydF9hbmRfY29tYmluZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmhlYWQpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbm9kZTE7Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqbm9kZTI7Ci0JaW50IG91dF9vZl9vcmRlciA9IDE7Ci0KLQlpZiAoISgqaGVhZCkpCi0JCXJldHVybiAxOwotCi0JZGJnKCIqaGVhZC0+bmV4dCA9ICVwXG4iLCgqaGVhZCktPm5leHQpOwotCi0JaWYgKCEoKmhlYWQpLT5uZXh0KQotCQlyZXR1cm4gMDsJLyogb25seSBvbmUgaXRlbSBvbiB0aGUgbGlzdCwgYWxyZWFkeSBzb3J0ZWQhICovCi0KLQlkYmcoIipoZWFkLT5iYXNlID0gMHgleFxuIiwodTMyKSgqaGVhZCktPmJhc2UpOwotCWRiZygiKmhlYWQtPm5leHQtPmJhc2UgPSAweCV4XG4iLCAodTMyKSgqaGVhZCktPm5leHQtPmJhc2UpOwotCXdoaWxlIChvdXRfb2Zfb3JkZXIpIHsKLQkJb3V0X29mX29yZGVyID0gMDsKLQotCQkvKiBTcGVjaWFsIGNhc2UgZm9yIHN3YXBwaW5nIGxpc3QgaGVhZCAqLwotCQlpZiAoKCgqaGVhZCktPm5leHQpICYmCi0JCSAgICAoKCpoZWFkKS0+YmFzZSA+ICgqaGVhZCktPm5leHQtPmJhc2UpKSB7Ci0JCQlub2RlMSA9ICpoZWFkOwotCQkJKCpoZWFkKSA9ICgqaGVhZCktPm5leHQ7Ci0JCQlub2RlMS0+bmV4dCA9ICgqaGVhZCktPm5leHQ7Ci0JCQkoKmhlYWQpLT5uZXh0ID0gbm9kZTE7Ci0JCQlvdXRfb2Zfb3JkZXIrKzsKLQkJfQotCi0JCW5vZGUxID0gKCpoZWFkKTsKLQotCQl3aGlsZSAobm9kZTEtPm5leHQgJiYgbm9kZTEtPm5leHQtPm5leHQpIHsKLQkJCWlmIChub2RlMS0+bmV4dC0+YmFzZSA+IG5vZGUxLT5uZXh0LT5uZXh0LT5iYXNlKSB7Ci0JCQkJb3V0X29mX29yZGVyKys7Ci0JCQkJbm9kZTIgPSBub2RlMS0+bmV4dDsKLQkJCQlub2RlMS0+bmV4dCA9IG5vZGUxLT5uZXh0LT5uZXh0OwotCQkJCW5vZGUxID0gbm9kZTEtPm5leHQ7Ci0JCQkJbm9kZTItPm5leHQgPSBub2RlMS0+bmV4dDsKLQkJCQlub2RlMS0+bmV4dCA9IG5vZGUyOwotCQkJfSBlbHNlCi0JCQkJbm9kZTEgPSBub2RlMS0+bmV4dDsKLQkJfQotCX0gIC8qIEVuZCBvZiBvdXRfb2Zfb3JkZXIgbG9vcCAqLwotCi0Jbm9kZTEgPSAqaGVhZDsKLQotCXdoaWxlIChub2RlMSAmJiBub2RlMS0+bmV4dCkgewotCQlpZiAoKG5vZGUxLT5iYXNlICsgbm9kZTEtPmxlbmd0aCkgPT0gbm9kZTEtPm5leHQtPmJhc2UpIHsKLQkJCS8qIENvbWJpbmUgKi8KLQkJCWRiZygiOC4uXG4iKTsKLQkJCW5vZGUxLT5sZW5ndGggKz0gbm9kZTEtPm5leHQtPmxlbmd0aDsKLQkJCW5vZGUyID0gbm9kZTEtPm5leHQ7Ci0JCQlub2RlMS0+bmV4dCA9IG5vZGUxLT5uZXh0LT5uZXh0OwotCQkJa2ZyZWUobm9kZTIpOwotCQl9IGVsc2UKLQkJCW5vZGUxID0gbm9kZTEtPm5leHQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX21ha2VfcmVzb3VyY2UgLSBtYWtlIHJlc291cmNlIHN0cnVjdHVyZQotICogQGJhc2U6IGJhc2UgYWRkcmVzcyBvZiBhIHJlc291cmNlCi0gKiBAbGVuZ3RoOiBsZW5ndGggb2YgYSByZXNvdXJjZQotICovCi1zdHJ1Y3QgcGNpX3Jlc291cmNlICphY3BpcGhwX21ha2VfcmVzb3VyY2UgKHU2NCBiYXNlLCB1MzIgbGVuZ3RoKQotewotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnJlczsKLQotCXJlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAocmVzKSB7Ci0JCW1lbXNldChyZXMsIDAsIHNpemVvZihzdHJ1Y3QgcGNpX3Jlc291cmNlKSk7Ci0JCXJlcy0+YmFzZSA9IGJhc2U7Ci0JCXJlcy0+bGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXJldHVybiByZXM7Ci19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX21vdmVfcmVzb3VyY2UgLSBtb3ZlIGxpbmtlZCByZXNvdXJjZXMgZnJvbSBvbmUgdG8gYW5vdGhlcgotICogQGZyb206IGhlYWQgb2YgbGlua2VkIHJlc291cmNlIGxpc3QKLSAqIEB0bzogaGVhZCBvZiBsaW5rZWQgcmVzb3VyY2UgbGlzdAotICovCi12b2lkIGFjcGlwaHBfbW92ZV9yZXNvdXJjZSAoc3RydWN0IHBjaV9yZXNvdXJjZSAqKmZyb20sIHN0cnVjdCBwY2lfcmVzb3VyY2UgKip0bykKLXsKLQlzdHJ1Y3QgcGNpX3Jlc291cmNlICp0bXA7Ci0KLQl3aGlsZSAoKmZyb20pIHsKLQkJdG1wID0gKCpmcm9tKS0+bmV4dDsKLQkJKCpmcm9tKS0+bmV4dCA9ICp0bzsKLQkJKnRvID0gKmZyb207Ci0JCSpmcm9tID0gdG1wOwotCX0KLQotCS8qICpmcm9tID0gTlVMTCBpcyBndWFyYW50ZWVkICovCi19Ci0KLQotLyoqCi0gKiBhY3BpcGhwX2ZyZWVfcmVzb3VyY2UgLSBmcmVlIGFsbCBsaW5rZWQgcmVzb3VyY2VzCi0gKiBAcmVzOiBoZWFkIG9mIGxpbmtlZCByZXNvdXJjZSBsaXN0Ci0gKi8KLXZvaWQgYWNwaXBocF9mcmVlX3Jlc291cmNlIChzdHJ1Y3QgcGNpX3Jlc291cmNlICoqcmVzKQotewotCXN0cnVjdCBwY2lfcmVzb3VyY2UgKnRtcDsKLQotCXdoaWxlICgqcmVzKSB7Ci0JCXRtcCA9ICgqcmVzKS0+bmV4dDsKLQkJa2ZyZWUoKnJlcyk7Ci0JCSpyZXMgPSB0bXA7Ci0JfQotCi0JLyogKnJlcyA9IE5VTEwgaXMgZ3VhcmFudGVlZCAqLwotfQotCi0KLS8qIGRlYnVnIHN1cHBvcnQgZnVuY3Rpb25zOyAgd2lsbCBnbyBhd2F5IHNvbWV0aW1lIDopICovCi1zdGF0aWMgdm9pZCBkdW1wX3Jlc291cmNlKHN0cnVjdCBwY2lfcmVzb3VyY2UgKmhlYWQpCi17Ci0Jc3RydWN0IHBjaV9yZXNvdXJjZSAqcDsKLQlpbnQgY250OwotCi0JcCA9IGhlYWQ7Ci0JY250ID0gMDsKLQotCXdoaWxlIChwKSB7Ci0JCWRiZygiWyUwMmRdICUwOHggLSAlMDh4XG4iLAotCQkgICAgY250KyssICh1MzIpcC0+YmFzZSwgKHUzMilwLT5iYXNlICsgcC0+bGVuZ3RoIC0gMSk7Ci0JCXAgPSBwLT5uZXh0OwotCX0KLX0KLQotdm9pZCBhY3BpcGhwX2R1bXBfcmVzb3VyY2Uoc3RydWN0IGFjcGlwaHBfYnJpZGdlICpicmlkZ2UpCi17Ci0JZGJnKCJJL08gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGJyaWRnZS0+aW9faGVhZCk7Ci0JZGJnKCJNRU0gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGJyaWRnZS0+bWVtX2hlYWQpOwotCWRiZygiUE1FTSByZXNvdXJjZTpcbiIpOwotCWR1bXBfcmVzb3VyY2UoYnJpZGdlLT5wX21lbV9oZWFkKTsKLQlkYmcoIkJVUyByZXNvdXJjZTpcbiIpOwotCWR1bXBfcmVzb3VyY2UoYnJpZGdlLT5idXNfaGVhZCk7Ci19Ci0KLXZvaWQgYWNwaXBocF9kdW1wX2Z1bmNfcmVzb3VyY2Uoc3RydWN0IGFjcGlwaHBfZnVuYyAqZnVuYykKLXsKLQlkYmcoIkkvTyByZXNvdXJjZTpcbiIpOwotCWR1bXBfcmVzb3VyY2UoZnVuYy0+aW9faGVhZCk7Ci0JZGJnKCJNRU0gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGZ1bmMtPm1lbV9oZWFkKTsKLQlkYmcoIlBNRU0gcmVzb3VyY2U6XG4iKTsKLQlkdW1wX3Jlc291cmNlKGZ1bmMtPnBfbWVtX2hlYWQpOwotCWRiZygiQlVTIHJlc291cmNlOlxuIik7Ci0JZHVtcF9yZXNvdXJjZShmdW5jLT5idXNfaGVhZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKaW5kZXggYWZiY2NmYS4uOGM2ZDM5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwpAQCAtNjAsNiArNjAsNyBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqY3BxaHBfcm9tX3N0YXJ0Owogc3RhdGljIGludCBwb3dlcl9tb2RlOwogc3RhdGljIGludCBkZWJ1ZzsKK3N0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuOS44IgogI2RlZmluZSBEUklWRVJfQVVUSE9SCSJEYW4gWmluayA8ZGFuLnppbmtAY29tcGFxLmNvbT4sIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IgpAQCAtMTI3MSw3ICsxMjcyLDYgQEAKIHsKIAlpbnQgbG9vcDsKIAlpbnQgcmV0dmFsID0gMDsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAogCWlmIChpbml0aWFsaXplZCkKIAkJcmV0dXJuIDA7CkBAIC0xNDQxLDcgKzE0NDEsOCBAQAogCX0KIAogCS8vIFN0b3AgdGhlIG5vdGlmaWNhdGlvbiBtZWNoYW5pc20KLQljcHFocF9ldmVudF9zdG9wX3RocmVhZCgpOworCWlmIChpbml0aWFsaXplZCkKKwkJY3BxaHBfZXZlbnRfc3RvcF90aHJlYWQoKTsKIAogCS8vdW5tYXAgdGhlIHJvbSBhZGRyZXNzCiAJaWYgKGNwcWhwX3JvbV9zdGFydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjMwNDFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHdvcmsgd2FzIGJhc2VkIG9uIHRoZSAyLjQvMi42IGtlcm5lbCBkZXZlbG9wbWVudCBieSBEaWNrIFJlaWduZXIuCisgKiBXb3JrIHRvIGFkZCBCSU9TIFBST00gc3VwcG9ydCB3YXMgY29tcGxldGVkIGJ5IE1pa2UgSGFiZWNrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vbDEuaD4KKyNpbmNsdWRlIDxhc20vc24vbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJyX3Byb3ZpZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmg+CisjaW5jbHVkZSA8YXNtL3NuL3BjaWRldi5oPgorI2luY2x1ZGUgPGFzbS9zbi9zbl9zYWwuaD4KKyNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KKworI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgInBjaV9ob3RwbHVnLmgiCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlNHSSAocHJhcml0QHNnaS5jb20sIGRpY2tpZUBzZ2kuY29tLCBoYWJlY2tAc2dpLmNvbSkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0dJIEFsdGl4IEhvdCBQbHVnIFBDSSBDb250cm9sbGVyIERyaXZlciIpOworCisjZGVmaW5lIFBDSUlPX0FTSUNfVFlQRV9USU9DQSAgICAgNAorI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX1VQICAgICAgIDIgICAgIC8qIHNsb3QgYWxyZWFkeSB1cCAqLworI2RlZmluZSBQQ0lfU0xPVF9BTFJFQURZX0RPV04gICAgIDMgICAgIC8qIHNsb3QgYWxyZWFkeSBkb3duICovCisjZGVmaW5lIFBDSV9MMV9FUlIgICAgICAgICAgICAgICAgNyAgICAgLyogTDEgY29uc29sZSBjb21tYW5kIGVycm9yICovCisjZGVmaW5lIFBDSV9FTVBUWV8zM01IWiAgICAgICAgICAxNSAgICAgLyogZW1wdHkgMzMgTUh6IGJ1cyAqLworI2RlZmluZSBQQ0lfTDFfUVNJWkUgICAgICAgICAgICAxMjggICAgIC8qIG91ciBMMSBtZXNzYWdlIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIFNOX01BWF9IUF9TTE9UUwkJIDMyCS8qIG1heCBudW1iZXIgb2YgaG90cGx1ZyBzbG90cyAqLworI2RlZmluZSBTR0lfSE9UUExVR19QUk9NX1JFVgkweDA0MjAgIC8qIE1pbi4gcmVxdWlyZWQgUFJPTSB2ZXJzaW9uICovCisKKy8qIGludGVybmFsIGxpc3QgaGVhZCAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc25faHBfbGlzdDsKKworLyogaG90cGx1Z19zbG90IHN0cnVjdCdzIHByaXZhdGUgcG9pbnRlciAqLworc3RydWN0IHNsb3QgeworCWludCBkZXZpY2VfbnVtOworCXN0cnVjdCBwY2lfYnVzICpwY2lfYnVzOworCS8qIHRoaXMgc3RydWN0IGZvciBnbHVlIGludGVybmFsIG9ubHkgKi8KKwlzdHJ1Y3QgaG90cGx1Z19zbG90ICpob3RwbHVnX3Nsb3Q7CisJc3RydWN0IGxpc3RfaGVhZCBocF9saXN0OworfTsKKworc3RydWN0IHBjaWJyX3Nsb3RfZW5hYmxlX3Jlc3AgeworCWludCByZXNwX3N1Yl9lcnJubzsKKwljaGFyIHJlc3BfbDFfbXNnW1BDSV9MMV9RU0laRSArIDFdOworfTsKKworc3RydWN0IHBjaWJyX3Nsb3RfZGlzYWJsZV9yZXNwIHsKKwlpbnQgcmVzcF9zdWJfZXJybm87CisJY2hhciByZXNwX2wxX21zZ1tQQ0lfTDFfUVNJWkUgKyAxXTsKK307CisKK2VudW0gc25fcGNpX3JlcV9lIHsKKwlQQ0lfUkVRX1NMT1RfRUxJR0lCTEUsCisJUENJX1JFUV9TTE9UX0RJU0FCTEUKK307CisKK3N0YXRpYyBpbnQgZW5hYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqc2xvdCk7CitzdGF0aWMgaW50IGRpc2FibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKK3N0YXRpYyBpbnQgZ2V0X3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCB1OCAqdmFsdWUpOworCitzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdF9vcHMgc25faG90cGx1Z19zbG90X29wcyA9IHsKKwkub3duZXIgICAgICAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5lbmFibGVfc2xvdCAgICAgICAgICAgID0gZW5hYmxlX3Nsb3QsCisJLmRpc2FibGVfc2xvdCAgICAgICAgICAgPSBkaXNhYmxlX3Nsb3QsCisJLmdldF9wb3dlcl9zdGF0dXMgICAgICAgPSBnZXRfcG93ZXJfc3RhdHVzLAorfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgoc25faG90cGx1Z19zZW0pOworCitzdGF0aWMgaW50IHNuX3BjaV9zbG90X3ZhbGlkKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzLCBpbnQgZGV2aWNlKQoreworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJaW50IGJyaWNrdHlwZTsKKwlpbnQgYnVzX251bTsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKTsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGEgdmFsaWQgc2xvdCBvbiAncGNpX2J1cycgKi8KKwlpZiAoIShwY2lidXNfaW5mby0+cGJpX3ZhbGlkX2RldmljZXMgJiAoMSA8PCBkZXZpY2UpKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWJyaWNrdHlwZSA9IE1PRFVMRV9HRVRfQlRZUEUocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCk7CisJYnVzX251bSA9IHBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX3BlcnNpc3RfYnVzbnVtICYgMHhmOworCisJLyogRG8gbm90IGFsbG93IGhvdHBsdWcgb3BlcmF0aW9ucyBvbiBiYXNlIEkvTyBjYXJkcyAqLworCWlmICgoYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV9JWCB8fCAgYnJpY2t0eXBlID09IEwxX0JSSUNLVFlQRV9JQSkgJiYKKwkgICAgKGJ1c19udW0gPT0gMSAmJiBkZXZpY2UgIT0gMSkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzbl9wY2lfYnVzX3ZhbGlkKHN0cnVjdCBwY2lfYnVzICpwY2lfYnVzKQoreworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJaW50IGFzaWNfdHlwZTsKKwlpbnQgYnJpY2t0eXBlOworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpOworCisJLyogRG9uJ3QgcmVnaXN0ZXIgc2xvdHMgaGFuZ2luZyBvZmYgdGhlIFRJT0NBIGJ1cyAqLworCWFzaWNfdHlwZSA9IHBjaWJ1c19pbmZvLT5wYmlfYnVzY29tbW9uLmJzX2FzaWNfdHlwZTsKKwlpZiAoYXNpY190eXBlID09IFBDSUlPX0FTSUNfVFlQRV9USU9DQSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIE9ubHkgcmVnaXN0ZXIgc2xvdHMgaW4gSS9PIEJyaWNrcyB0aGF0IHN1cHBvcnQgaG90cGx1ZyAqLworCWJyaWNrdHlwZSA9IE1PRFVMRV9HRVRfQlRZUEUocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCk7CisJc3dpdGNoIChicmlja3R5cGUpIHsKKwljYXNlIEwxX0JSSUNLVFlQRV9JWDoKKwljYXNlIEwxX0JSSUNLVFlQRV9QWDoKKwljYXNlIEwxX0JSSUNLVFlQRV9JQToKKwljYXNlIEwxX0JSSUNLVFlQRV9QQToKKwkJcmV0dXJuIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRVBFUk07CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IHNuX2hwX3Nsb3RfcHJpdmF0ZV9hbGxvYyhzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJCSAgICBzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cywgaW50IGRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCXN0cnVjdCBzbG90ICpzbG90OworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpOworCisJYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzbG90KSwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisKKwlic3NfaG90cGx1Z19zbG90LT5uYW1lID0ga21hbGxvYygzMywgR0ZQX0tFUk5FTCk7CisJaWYgKCFic3NfaG90cGx1Z19zbG90LT5uYW1lKSB7CisJCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzbG90LT5kZXZpY2VfbnVtID0gZGV2aWNlOworCXNsb3QtPnBjaV9idXMgPSBwY2lfYnVzOworCisJc3ByaW50Zihic3NfaG90cGx1Z19zbG90LT5uYW1lLCAibW9kdWxlXyVjJWMlYyVjJS4yZF9iXyVkX3NfJWQiLAorCQknMCcrUkFDS19HRVRfQ0xBU1MoTU9EVUxFX0dFVF9SQUNLKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKSwKKwkJJzAnK1JBQ0tfR0VUX0dST1VQKE1PRFVMRV9HRVRfUkFDSyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSksCisJCScwJytSQUNLX0dFVF9OVU0oTU9EVUxFX0dFVF9SQUNLKHBjaWJ1c19pbmZvLT5wYmlfbW9kdWxlaWQpKSwKKwkJTU9EVUxFX0dFVF9CVENIQVIocGNpYnVzX2luZm8tPnBiaV9tb2R1bGVpZCksCisJCU1PRFVMRV9HRVRfQlBPUyhwY2lidXNfaW5mby0+cGJpX21vZHVsZWlkKSwKKwkJKChpbnQpcGNpYnVzX2luZm8tPnBiaV9idXNjb21tb24uYnNfcGVyc2lzdF9idXNudW0pICYgMHhmLAorCQlkZXZpY2UgKyAxKTsKKworCXNsb3QtPmhvdHBsdWdfc2xvdCA9IGJzc19ob3RwbHVnX3Nsb3Q7CisJbGlzdF9hZGQoJnNsb3QtPmhwX2xpc3QsICZzbl9ocF9saXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhvdHBsdWdfc2xvdCAqIHNuX2hwX2Rlc3Ryb3kodm9pZCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaChsaXN0LCAmc25faHBfbGlzdCkgeworCQlzbG90ID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc2xvdCwgaHBfbGlzdCk7CisJCWJzc19ob3RwbHVnX3Nsb3QgPSBzbG90LT5ob3RwbHVnX3Nsb3Q7CisJCWxpc3RfZGVsKCYoKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZSktPgorCQkJIGhwX2xpc3QpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGJzc19ob3RwbHVnX3Nsb3Q7Cit9CisKK3N0YXRpYyB2b2lkIHNuX2J1c19hbGxvY19kYXRhKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqc3Vib3JkaW5hdGVfYnVzOworCXN0cnVjdCBwY2lfZGV2ICpjaGlsZDsKKworCXNuX3BjaV9maXh1cF9zbG90KGRldik7CisKKwkvKiBSZWN1cnNpdmVseSBzZXRzIHVwIHRoZSBzbl9pcnFfaW5mbyBzdHJ1Y3RzICovCisJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKKwkJc3Vib3JkaW5hdGVfYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKKwkJbGlzdF9mb3JfZWFjaChub2RlLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzKSB7CisJCQljaGlsZCA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKKwkJCXNuX2J1c19hbGxvY19kYXRhKGNoaWxkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc25fYnVzX2ZyZWVfZGF0YShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5vZGU7CisJc3RydWN0IHBjaV9idXMgKnN1Ym9yZGluYXRlX2J1czsKKwlzdHJ1Y3QgcGNpX2RldiAqY2hpbGQ7CisKKwkvKiBSZWN1cnNpdmVseSBjbGVhbiB1cCBzbl9pcnFfaW5mbyBzdHJ1Y3RzICovCisJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKKwkJc3Vib3JkaW5hdGVfYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKKwkJbGlzdF9mb3JfZWFjaChub2RlLCAmc3Vib3JkaW5hdGVfYnVzLT5kZXZpY2VzKSB7CisJCQljaGlsZCA9IGxpc3RfZW50cnkobm9kZSwgc3RydWN0IHBjaV9kZXYsIGJ1c19saXN0KTsKKwkJCXNuX2J1c19mcmVlX2RhdGEoY2hpbGQpOworCQl9CisJfQorCXNuX3BjaV91bmZpeHVwX3Nsb3QoZGV2KTsKK30KKworc3RhdGljIHU4IHNuX3Bvd2VyX3N0YXR1c19nZXQoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwl1OCByZXR2YWw7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisJcmV0dmFsID0gcGNpYnVzX2luZm8tPnBiaV9lbmFibGVkX2RldmljZXMgJiAoMSA8PCBzbG90LT5kZXZpY2VfbnVtKTsKKworCXJldHVybiByZXR2YWwgPyAxIDogMDsKK30KKworc3RhdGljIHZvaWQgc25fc2xvdF9tYXJrX2VuYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJCWludCBkZXZpY2VfbnVtKQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpYnVzX2luZm8gKnBjaWJ1c19pbmZvOworCisJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHNsb3QtPnBjaV9idXMpOworCXBjaWJ1c19pbmZvLT5wYmlfZW5hYmxlZF9kZXZpY2VzIHw9ICgxIDw8IGRldmljZV9udW0pOworfQorCitzdGF0aWMgdm9pZCBzbl9zbG90X21hcmtfZGlzYWJsZShzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90LAorCQkJCSBpbnQgZGV2aWNlX251bSkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKworCXBjaWJ1c19pbmZvID0gU05fUENJQlVTX0JVU1NPRlRfSU5GTyhzbG90LT5wY2lfYnVzKTsKKwlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyAmPSB+KDEgPDwgZGV2aWNlX251bSk7Cit9CisKK3N0YXRpYyBpbnQgc25fc2xvdF9lbmFibGUoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwKKwkJCSAgaW50IGRldmljZV9udW0pCit7CisJc3RydWN0IHNsb3QgKnNsb3QgPSAoc3RydWN0IHNsb3QgKilic3NfaG90cGx1Z19zbG90LT5wcml2YXRlOworCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm87CisJc3RydWN0IHBjaWJyX3Nsb3RfZW5hYmxlX3Jlc3AgcmVzcDsKKwlpbnQgcmM7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisKKwkvKgorCSAqIFBvd2VyLW9uIGFuZCBpbml0aWFsaXplIHRoZSBzbG90IGluIHRoZSBTTgorCSAqIFBDSSBpbmZyYXN0cnVjdHVyZS4KKwkgKi8KKwlyYyA9IHNhbF9wY2licl9zbG90X2VuYWJsZShwY2lidXNfaW5mbywgZGV2aWNlX251bSwgJnJlc3ApOworCisJaWYgKHJjID09IFBDSV9TTE9UX0FMUkVBRFlfVVApIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAiaXMgYWxyZWFkeSBhY3RpdmVcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChyYyA9PSBQQ0lfTDFfRVJSKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJMMSBmYWlsdXJlICVkIHdpdGggbWVzc2FnZTogJXMiLAorCQkJcmVzcC5yZXNwX3N1Yl9lcnJubywgcmVzcC5yZXNwX2wxX21zZyk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJaWYgKHJjKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJpbnNlcnQgZmFpbGVkIHdpdGggZXJyb3IgJWQgc3ViLWVycm9yICVkXG4iLAorCQkJcmMsIHJlc3AucmVzcF9zdWJfZXJybm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzbl9zbG90X21hcmtfZW5hYmxlKGJzc19ob3RwbHVnX3Nsb3QsIGRldmljZV9udW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25fc2xvdF9kaXNhYmxlKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3QsCisJCQkgICBpbnQgZGV2aWNlX251bSwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbzsKKwlzdHJ1Y3QgcGNpYnJfc2xvdF9kaXNhYmxlX3Jlc3AgcmVzcDsKKwlpbnQgcmM7CisKKwlwY2lidXNfaW5mbyA9IFNOX1BDSUJVU19CVVNTT0ZUX0lORk8oc2xvdC0+cGNpX2J1cyk7CisKKwlyYyA9IHNhbF9wY2licl9zbG90X2Rpc2FibGUocGNpYnVzX2luZm8sIGRldmljZV9udW0sIGFjdGlvbiwgJnJlc3ApOworCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgcmMgPT0gUENJX1NMT1RfQUxSRUFEWV9ET1dOKSB7CisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgIlNsb3QgJXMgYWxyZWFkeSBpbmFjdGl2ZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFICYmIHJjID09IFBDSV9FTVBUWV8zM01IWikgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkiQ2Fubm90IHJlbW92ZSBsYXN0IDMzTUh6IGNhcmRcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFICYmIHJjID09IFBDSV9MMV9FUlIpIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJIkwxIGZhaWx1cmUgJWQgd2l0aCBtZXNzYWdlIFxuJXNcbiIsCisJCQlyZXNwLnJlc3Bfc3ViX2Vycm5vLCByZXNwLnJlc3BfbDFfbXNnKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSAmJiByYykgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQkicmVtb3ZlIGZhaWxlZCB3aXRoIGVycm9yICVkIHN1Yi1lcnJvciAlZFxuIiwKKwkJCXJjLCByZXNwLnJlc3Bfc3ViX2Vycm5vKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUgJiYgIXJjKQorCQlyZXR1cm4gMDsKKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUgJiYgIXJjKSB7CisJCXNuX3Nsb3RfbWFya19kaXNhYmxlKGJzc19ob3RwbHVnX3Nsb3QsIGRldmljZV9udW0pOworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJyZW1vdmUgc3VjY2Vzc2Z1bFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0RJU0FCTEUgJiYgcmMpIHsKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCJyZW1vdmUgZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFibGVfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQoreworCXN0cnVjdCBzbG90ICpzbG90ID0gKHN0cnVjdCBzbG90ICopYnNzX2hvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2J1cyAqbmV3X2J1cyA9IE5VTEw7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgZnVuYywgbnVtX2Z1bmNzOworCWludCBuZXdfcHBiID0gMDsKKwlpbnQgcmM7CisKKwkvKiBTZXJpYWxpemUgdGhlIExpbnV4IFBDSSBpbmZyYXN0cnVjdHVyZSAqLworCWRvd24oJnNuX2hvdHBsdWdfc2VtKTsKKworCS8qCisJICogUG93ZXItb24gYW5kIGluaXRpYWxpemUgdGhlIHNsb3QgaW4gdGhlIFNOCisJICogUENJIGluZnJhc3RydWN0dXJlLgorCSAqLworCXJjID0gc25fc2xvdF9lbmFibGUoYnNzX2hvdHBsdWdfc2xvdCwgc2xvdC0+ZGV2aWNlX251bSk7CisJaWYgKHJjKSB7CisJCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisJCXJldHVybiByYzsKKwl9CisKKwludW1fZnVuY3MgPSBwY2lfc2Nhbl9zbG90KHNsb3QtPnBjaV9idXMsIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtKzEsCisJCQkJCQkJICAgUENJX0ZVTkMoMCkpKTsKKwlpZiAoIW51bV9mdW5jcykgeworCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJubyBkZXZpY2UgaW4gc2xvdFxuIik7CisJCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKHBjaV9kb21haW5fbnIoc2xvdC0+cGNpX2J1cyksCisJCQkJc2xvdC0+cGNpX2J1cy0+bnVtYmVyLAorCQkJCXNsb3QtPnBjaV9idXMpOworCS8qCisJICogTWFwIFNOIHJlc291cmNlcyBmb3IgYWxsIGZ1bmN0aW9ucyBvbiB0aGUgY2FyZAorCSAqIHRvIHRoZSBMaW51eCBQQ0kgaW50ZXJmYWNlIGFuZCB0ZWxsIHRoZSBkcml2ZXJzCisJICogYWJvdXQgdGhlbS4KKwkgKi8KKwlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgbnVtX2Z1bmNzOyAgZnVuYysrKSB7CisJCWRldiA9IHBjaV9nZXRfc2xvdChzbG90LT5wY2lfYnVzLAorCQkJCSAgIFBDSV9ERVZGTihzbG90LT5kZXZpY2VfbnVtICsgMSwKKwkJCQkJICAgICBQQ0lfRlVOQyhmdW5jKSkpOworCisKKwkJaWYgKGRldikgeworCQkJaWYgKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0JSSURHRSkgeworCQkJCXVuc2lnbmVkIGNoYXIgc2VjX2J1czsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TRUNPTkRBUllfQlVTLAorCQkJCQkJICAgICAmc2VjX2J1cyk7CisJCQkJbmV3X2J1cyA9IHBjaV9hZGRfbmV3X2J1cyhkZXYtPmJ1cywgZGV2LAorCQkJCQkJCSAgc2VjX2J1cyk7CisJCQkJcGNpX3NjYW5fY2hpbGRfYnVzKG5ld19idXMpOworCQkJCXNuX3BjaV9jb250cm9sbGVyX2ZpeHVwKHBjaV9kb21haW5fbnIobmV3X2J1cyksCisJCQkJCQkJbmV3X2J1cy0+bnVtYmVyLAorCQkJCQkJCW5ld19idXMpOworCQkJCW5ld19wcGIgPSAxOworCQkJfQorCQkJc25fYnVzX2FsbG9jX2RhdGEoZGV2KTsKKwkJCXBjaV9kZXZfcHV0KGRldik7CisJCX0KKwl9CisKKwkvKiBDYWxsIHRoZSBkcml2ZXIgZm9yIHRoZSBuZXcgZGV2aWNlICovCisJcGNpX2J1c19hZGRfZGV2aWNlcyhzbG90LT5wY2lfYnVzKTsKKwkvKiBDYWxsIHRoZSBkcml2ZXJzIGZvciB0aGUgbmV3IGRldmljZXMgc3Vib3JkaW5hdGUgdG8gUFBCICovCisJaWYgKG5ld19wcGIpCisJCXBjaV9idXNfYWRkX2RldmljZXMobmV3X2J1cyk7CisKKwl1cCgmc25faG90cGx1Z19zZW0pOworCisJaWYgKHJjID09IDApCisJCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwKKwkJCSJpbnNlcnQgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxcbiIpOworCWVsc2UKKwkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQkJImluc2VydCBvcGVyYXRpb24gZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBkaXNhYmxlX3Nsb3Qoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCkKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IChzdHJ1Y3Qgc2xvdCAqKWJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlpbnQgZnVuYzsKKwlpbnQgcmM7CisKKwkvKiBBY3F1aXJlIHVwZGF0ZSBhY2Nlc3MgdG8gdGhlIGJ1cyAqLworCWRvd24oJnNuX2hvdHBsdWdfc2VtKTsKKworCS8qIGlzIGl0IG9rYXkgdG8gYnJpbmcgdGhpcyBzbG90IGRvd24/ICovCisJcmMgPSBzbl9zbG90X2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgc2xvdC0+ZGV2aWNlX251bSwKKwkJCSAgICAgUENJX1JFUV9TTE9UX0VMSUdJQkxFKTsKKwlpZiAocmMpCisJCWdvdG8gbGVhdmluZzsKKworCS8qIEZyZWUgdGhlIFNOIHJlc291cmNlcyBhc3NpZ25lZCB0byB0aGUgTGludXggZGV2aWNlLiovCisJZm9yIChmdW5jID0gMDsgZnVuYyA8IDg7ICBmdW5jKyspIHsKKwkJZGV2ID0gcGNpX2dldF9zbG90KHNsb3QtPnBjaV9idXMsCisJCQkJICAgUENJX0RFVkZOKHNsb3QtPmRldmljZV9udW0rMSwKKwkJCQkgICAJICAgICBQQ0lfRlVOQyhmdW5jKSkpOworCQlpZiAoZGV2KSB7CisJCQkvKgorCQkJICogU29tZSBkcml2ZXJzIG1heSB1c2UgZG1hIGFjY2Vzc2VzIGR1cmluZyB0aGUKKwkJCSAqIGRyaXZlciByZW1vdmUgZnVuY3Rpb24uIFdlIHJlbGVhc2UgdGhlIHN5c2RhdGEKKwkJCSAqIGFyZWFzIGFmdGVyIHRoZSBkcml2ZXIgcmVtb3ZlIGZ1bmN0aW9ucyBoYXZlCisJCQkgKiBiZWVuIGNhbGxlZC4KKwkJCSAqLworCQkJc25fYnVzX3N0b3JlX3N5c2RhdGEoZGV2KTsKKwkJCXNuX2J1c19mcmVlX2RhdGEoZGV2KTsKKwkJCXBjaV9yZW1vdmVfYnVzX2RldmljZShkZXYpOworCQkJcGNpX2Rldl9wdXQoZGV2KTsKKwkJfQorCX0KKworCS8qIGZyZWUgdGhlIGNvbGxlY3RlZCBzeXNkYXRhIHBvaW50ZXJzICovCisJc25fYnVzX2ZyZWVfc3lzZGF0YSgpOworCisJLyogRGVhY3RpdmF0ZSBzbG90ICovCisJcmMgPSBzbl9zbG90X2Rpc2FibGUoYnNzX2hvdHBsdWdfc2xvdCwgc2xvdC0+ZGV2aWNlX251bSwKKwkJCSAgICAgUENJX1JFUV9TTE9UX0RJU0FCTEUpOworIGxlYXZpbmc6CisJLyogUmVsZWFzZSB0aGUgYnVzIGxvY2sgKi8KKwl1cCgmc25faG90cGx1Z19zZW0pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdldF9wb3dlcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdCwgdTggKnZhbHVlKQoreworCWRvd24oJnNuX2hvdHBsdWdfc2VtKTsKKwkqdmFsdWUgPSBzbl9wb3dlcl9zdGF0dXNfZ2V0KGJzc19ob3RwbHVnX3Nsb3QpOworCXVwKCZzbl9ob3RwbHVnX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNuX3JlbGVhc2Vfc2xvdChzdHJ1Y3QgaG90cGx1Z19zbG90ICpic3NfaG90cGx1Z19zbG90KQoreworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPmluZm8pOworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPm5hbWUpOworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QtPnByaXZhdGUpOworCWtmcmVlKGJzc19ob3RwbHVnX3Nsb3QpOworfQorCitzdGF0aWMgaW50IHNuX2hvdHBsdWdfc2xvdF9yZWdpc3RlcihzdHJ1Y3QgcGNpX2J1cyAqcGNpX2J1cykKK3sKKwlpbnQgZGV2aWNlOworCXN0cnVjdCBob3RwbHVnX3Nsb3QgKmJzc19ob3RwbHVnX3Nsb3Q7CisJaW50IHJjID0gMDsKKworCS8qCisJICogQ3VycmVudGx5IG9ubHkgZm91ciBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQsCisJICogaW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXliZSBtb3JlIC0tIHVwIHRvIDMyLgorCSAqLworCisJZm9yIChkZXZpY2UgPSAwOyBkZXZpY2UgPCBTTl9NQVhfSFBfU0xPVFMgOyBkZXZpY2UrKykgeworCQlpZiAoc25fcGNpX3Nsb3RfdmFsaWQocGNpX2J1cywgZGV2aWNlKSAhPSAxKQorCQkJY29udGludWU7CisKKwkJYnNzX2hvdHBsdWdfc2xvdCA9IGtjYWxsb2MoMSxzaXplb2Yoc3RydWN0IGhvdHBsdWdfc2xvdCksCisJCQkJCSAgIEdGUF9LRVJORUwpOworCQlpZiAoIWJzc19ob3RwbHVnX3Nsb3QpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gYWxsb2NfZXJyOworCQl9CisKKwkJYnNzX2hvdHBsdWdfc2xvdC0+aW5mbyA9CisJCQlrY2FsbG9jKDEsc2l6ZW9mKHN0cnVjdCBob3RwbHVnX3Nsb3RfaW5mbyksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghYnNzX2hvdHBsdWdfc2xvdC0+aW5mbykgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBhbGxvY19lcnI7CisJCX0KKworCQlpZiAoc25faHBfc2xvdF9wcml2YXRlX2FsbG9jKGJzc19ob3RwbHVnX3Nsb3QsCisJCQkJCSAgICAgcGNpX2J1cywgZGV2aWNlKSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBhbGxvY19lcnI7CisJCX0KKworCQlic3NfaG90cGx1Z19zbG90LT5vcHMgPSAmc25faG90cGx1Z19zbG90X29wczsKKwkJYnNzX2hvdHBsdWdfc2xvdC0+cmVsZWFzZSA9ICZzbl9yZWxlYXNlX3Nsb3Q7CisKKwkJcmMgPSBwY2lfaHBfcmVnaXN0ZXIoYnNzX2hvdHBsdWdfc2xvdCk7CisJCWlmIChyYykKKwkJCWdvdG8gcmVnaXN0ZXJfZXJyOworCX0KKwlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJSZWdpc3RlcmVkIGJ1cyB3aXRoIGhvdHBsdWdcbiIpOworCXJldHVybiByYzsKKworcmVnaXN0ZXJfZXJyOgorCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgImJ1cyBmYWlsZWQgdG8gcmVnaXN0ZXIgd2l0aCBlcnIgPSAlZFxuIiwKKwkgICAgICAgIHJjKTsKKworYWxsb2NfZXJyOgorCWlmIChyYyA9PSAtRU5PTUVNKQorCQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7CisKKwkvKiBkZXN0cm95IFRISVMgZWxlbWVudCAqLworCWlmIChic3NfaG90cGx1Z19zbG90KQorCQlzbl9yZWxlYXNlX3Nsb3QoYnNzX2hvdHBsdWdfc2xvdCk7CisKKwkvKiBkZXN0cm95IGFueXRoaW5nIGVsc2Ugb24gdGhlIGxpc3QgKi8KKwl3aGlsZSAoKGJzc19ob3RwbHVnX3Nsb3QgPSBzbl9ocF9kZXN0cm95KCkpKQorCQlwY2lfaHBfZGVyZWdpc3Rlcihic3NfaG90cGx1Z19zbG90KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBzbl9wY2lfaG90cGx1Z19pbml0KHZvaWQpCit7CisJc3RydWN0IHBjaV9idXMgKnBjaV9idXMgPSBOVUxMOworCWludCByYzsKKwlpbnQgcmVnaXN0ZXJlZCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmc25faHBfbGlzdCk7CisKKwlpZiAoc25fc2FsX3JldigpIDwgU0dJX0hPVFBMVUdfUFJPTV9SRVYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogUFJPTSB2ZXJzaW9uIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQuMDVcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXdoaWxlICgocGNpX2J1cyA9IHBjaV9maW5kX25leHRfYnVzKHBjaV9idXMpKSkgeworCQlpZiAoIXBjaV9idXMtPnN5c2RhdGEpCisJCQljb250aW51ZTsKKworCQlyYyA9IHNuX3BjaV9idXNfdmFsaWQocGNpX2J1cyk7CisJCWlmIChyYyAhPSAxKSB7CisJCQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJub3QgYSB2YWxpZCBob3RwbHVnIGJ1c1xuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJ2YWxpZCBob3RwbHVnIGJ1c1xuIik7CisKKwkJcmMgPSBzbl9ob3RwbHVnX3Nsb3RfcmVnaXN0ZXIocGNpX2J1cyk7CisJCWlmICghcmMpCisJCQlyZWdpc3RlcmVkID0gMTsKKwkJZWxzZSB7CisJCQlyZWdpc3RlcmVkID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJlZ2lzdGVyZWQgPT0gMSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBzbl9wY2lfaG90cGx1Z19leGl0KHZvaWQpCit7CisJc3RydWN0IGhvdHBsdWdfc2xvdCAqYnNzX2hvdHBsdWdfc2xvdDsKKworCXdoaWxlICgoYnNzX2hvdHBsdWdfc2xvdCA9IHNuX2hwX2Rlc3Ryb3koKSkpIHsKKwkJcGNpX2hwX2RlcmVnaXN0ZXIoYnNzX2hvdHBsdWdfc2xvdCk7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZzbl9ocF9saXN0KSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW50ZXJuYWwgbGlzdCBpcyBub3QgZW1wdHlcbiIsIF9fRklMRV9fKTsKK30KKworbW9kdWxlX2luaXQoc25fcGNpX2hvdHBsdWdfaW5pdCk7Cittb2R1bGVfZXhpdChzbl9wY2lfaG90cGx1Z19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggMzAyMDZhYy4uYjVhYjlhYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0yOCwxMCArMjgsMTAgQEAKIHN0YXRpYyBrbWVtX2NhY2hlX3QqIG1zaV9jYWNoZXA7CiAKIHN0YXRpYyBpbnQgcGNpX21zaV9lbmFibGUgPSAxOwotc3RhdGljIGludCBsYXN0X2FsbG9jX3ZlY3RvciA9IDA7Ci1zdGF0aWMgaW50IG5yX3JlbGVhc2VkX3ZlY3RvcnMgPSAwOworc3RhdGljIGludCBsYXN0X2FsbG9jX3ZlY3RvcjsKK3N0YXRpYyBpbnQgbnJfcmVsZWFzZWRfdmVjdG9yczsKIHN0YXRpYyBpbnQgbnJfcmVzZXJ2ZWRfdmVjdG9ycyA9IE5SX0hQX1JFU0VSVkVEX1ZFQ1RPUlM7Ci1zdGF0aWMgaW50IG5yX21zaXhfZGV2aWNlcyA9IDA7CitzdGF0aWMgaW50IG5yX21zaXhfZGV2aWNlczsKIAogI2lmbmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIGludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OwpAQCAtMTcwLDQ0ICsxNzAsMzAgQEAKIAlyZXR1cm4gMDsJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwogfQogCi1zdGF0aWMgdm9pZCByZWxlYXNlX21zaSh1bnNpZ25lZCBpbnQgdmVjdG9yKTsKLXN0YXRpYyB2b2lkIHNodXRkb3duX21zaV9pcnEodW5zaWduZWQgaW50IHZlY3RvcikKLXsKLQlyZWxlYXNlX21zaSh2ZWN0b3IpOwotfQotCi0jZGVmaW5lIHNodXRkb3duX21zaV9pcnFfd29fbWFza2JpdAlzaHV0ZG93bl9tc2lfaXJxCi1zdGF0aWMgdm9pZCBlbmFibGVfbXNpX2lycV93b19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpIHt9Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX21zaV9pcnFfd29fbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKSB7fQotc3RhdGljIHZvaWQgYWNrX21zaV9pcnFfd29fbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKSB7fQotc3RhdGljIHZvaWQgZW5kX21zaV9pcnFfd29fbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKQotewotCW1vdmVfbXNpKHZlY3Rvcik7Ci0JYWNrX0FQSUNfaXJxKCk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9tc2lfaXJxX3dfbWFza2JpdCh1bnNpZ25lZCBpbnQgdmVjdG9yKQogeworCXN0YXJ0dXBfbXNpX2lycV93b19tYXNrYml0KHZlY3Rvcik7CisJdW5tYXNrX01TSV9pcnEodmVjdG9yKTsKKwlyZXR1cm4gMDsJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworfQorCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9tc2lfaXJxKHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1zaV9sb2NrLCBmbGFncyk7CiAJZW50cnkgPSBtc2lfZGVzY1t2ZWN0b3JdOwotCWlmICghZW50cnkgfHwgIWVudHJ5LT5kZXYpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNpX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVudHJ5LT5tc2lfYXR0cmliLnN0YXRlID0gMTsJLyogTWFyayBpdCBhY3RpdmUgKi8KKwlpZiAoZW50cnkgJiYgZW50cnktPmRldikKKwkJZW50cnktPm1zaV9hdHRyaWIuc3RhdGUgPSAwOwkvKiBNYXJrIGl0IG5vdCBhY3RpdmUgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc2lfbG9jaywgZmxhZ3MpOwotCi0JdW5tYXNrX01TSV9pcnEodmVjdG9yKTsKLQlyZXR1cm4gMDsJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwogfQogCi0jZGVmaW5lIHNodXRkb3duX21zaV9pcnFfd19tYXNrYml0CXNodXRkb3duX21zaV9pcnEKLSNkZWZpbmUgZW5hYmxlX21zaV9pcnFfd19tYXNrYml0CXVubWFza19NU0lfaXJxCi0jZGVmaW5lIGRpc2FibGVfbXNpX2lycV93X21hc2tiaXQJbWFza19NU0lfaXJxCi0jZGVmaW5lIGFja19tc2lfaXJxX3dfbWFza2JpdAkJbWFza19NU0lfaXJxCitzdGF0aWMgdm9pZCBlbmRfbXNpX2lycV93b19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCit7CisJbW92ZV9tc2kodmVjdG9yKTsKKwlhY2tfQVBJQ19pcnEoKTsKK30KIAogc3RhdGljIHZvaWQgZW5kX21zaV9pcnFfd19tYXNrYml0KHVuc2lnbmVkIGludCB2ZWN0b3IpCiB7CkBAIC0yMTYsNiArMjAyLDEwIEBACiAJYWNrX0FQSUNfaXJxKCk7CiB9CiAKK3N0YXRpYyB2b2lkIGRvX25vdGhpbmcodW5zaWduZWQgaW50IHZlY3RvcikKK3sKK30KKwogLyoKICAqIEludGVycnVwdCBUeXBlIGZvciBNU0ktWCBQQ0kvUENJLVgvUENJLUV4cHJlc3MgRGV2aWNlcywKICAqIHdoaWNoIGltcGxlbWVudCB0aGUgTVNJLVggQ2FwYWJpbGl0eSBTdHJ1Y3R1cmUuCkBAIC0yMjMsMTAgKzIxMywxMCBAQAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBtc2l4X2lycV90eXBlID0gewogCS50eXBlbmFtZQk9ICJQQ0ktTVNJLVgiLAogCS5zdGFydHVwCT0gc3RhcnR1cF9tc2lfaXJxX3dfbWFza2JpdCwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZW5hYmxlCQk9IGVuYWJsZV9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbXNpX2lycV93X21hc2tiaXQsCi0JLmFjawkJPSBhY2tfbXNpX2lycV93X21hc2tiaXQsCisJLnNodXRkb3duCT0gc2h1dGRvd25fbXNpX2lycSwKKwkuZW5hYmxlCQk9IHVubWFza19NU0lfaXJxLAorCS5kaXNhYmxlCT0gbWFza19NU0lfaXJxLAorCS5hY2sJCT0gbWFza19NU0lfaXJxLAogCS5lbmQJCT0gZW5kX21zaV9pcnFfd19tYXNrYml0LAogCS5zZXRfYWZmaW5pdHkJPSBzZXRfbXNpX2lycV9hZmZpbml0eQogfTsKQEAgLTIzOSwxMCArMjI5LDEwIEBACiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1zaV9pcnFfd19tYXNrYml0X3R5cGUgPSB7CiAJLnR5cGVuYW1lCT0gIlBDSS1NU0kiLAogCS5zdGFydHVwCT0gc3RhcnR1cF9tc2lfaXJxX3dfbWFza2JpdCwKLQkuc2h1dGRvd24JPSBzaHV0ZG93bl9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZW5hYmxlCQk9IGVuYWJsZV9tc2lfaXJxX3dfbWFza2JpdCwKLQkuZGlzYWJsZQk9IGRpc2FibGVfbXNpX2lycV93X21hc2tiaXQsCi0JLmFjawkJPSBhY2tfbXNpX2lycV93X21hc2tiaXQsCisJLnNodXRkb3duCT0gc2h1dGRvd25fbXNpX2lycSwKKwkuZW5hYmxlCQk9IHVubWFza19NU0lfaXJxLAorCS5kaXNhYmxlCT0gbWFza19NU0lfaXJxLAorCS5hY2sJCT0gbWFza19NU0lfaXJxLAogCS5lbmQJCT0gZW5kX21zaV9pcnFfd19tYXNrYml0LAogCS5zZXRfYWZmaW5pdHkJPSBzZXRfbXNpX2lycV9hZmZpbml0eQogfTsKQEAgLTI1NSwxMCArMjQ1LDEwIEBACiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG1zaV9pcnFfd29fbWFza2JpdF90eXBlID0gewogCS50eXBlbmFtZQk9ICJQQ0ktTVNJIiwKIAkuc3RhcnR1cAk9IHN0YXJ0dXBfbXNpX2lycV93b19tYXNrYml0LAotCS5zaHV0ZG93bgk9IHNodXRkb3duX21zaV9pcnFfd29fbWFza2JpdCwKLQkuZW5hYmxlCQk9IGVuYWJsZV9tc2lfaXJxX3dvX21hc2tiaXQsCi0JLmRpc2FibGUJPSBkaXNhYmxlX21zaV9pcnFfd29fbWFza2JpdCwKLQkuYWNrCQk9IGFja19tc2lfaXJxX3dvX21hc2tiaXQsCisJLnNodXRkb3duCT0gc2h1dGRvd25fbXNpX2lycSwKKwkuZW5hYmxlCQk9IGRvX25vdGhpbmcsCisJLmRpc2FibGUJPSBkb19ub3RoaW5nLAorCS5hY2sJCT0gZG9fbm90aGluZywKIAkuZW5kCQk9IGVuZF9tc2lfaXJxX3dvX21hc2tiaXQsCiAJLnNldF9hZmZpbml0eQk9IHNldF9tc2lfaXJxX2FmZmluaXR5CiB9OwpAQCAtNDA3LDcgKzM5Nyw3IEBACiB7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAotCWVudHJ5ID0gKHN0cnVjdCBtc2lfZGVzYyopIGttZW1fY2FjaGVfYWxsb2MobXNpX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWVudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhtc2lfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTc5NiwxOCArNzg2LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJlbGVhc2VfbXNpKHVuc2lnbmVkIGludCB2ZWN0b3IpCi17Ci0Jc3RydWN0IG1zaV9kZXNjICplbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zaV9sb2NrLCBmbGFncyk7Ci0JZW50cnkgPSBtc2lfZGVzY1t2ZWN0b3JdOwotCWlmIChlbnRyeSAmJiBlbnRyeS0+ZGV2KQotCQllbnRyeS0+bXNpX2F0dHJpYi5zdGF0ZSA9IDA7CS8qIE1hcmsgaXQgbm90IGFjdGl2ZSAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zaV9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbnQgbXNpX2ZyZWVfdmVjdG9yKHN0cnVjdCBwY2lfZGV2KiBkZXYsIGludCB2ZWN0b3IsIGludCByZWFzc2lnbikKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwpAQCAtOTI0LDcgKzkwMiw3IEBACiAvKioKICAqIHBjaV9lbmFibGVfbXNpeCAtIGNvbmZpZ3VyZSBkZXZpY2UncyBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZQogICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpX2RldiBkYXRhIHN0cnVjdHVyZSBvZiBNU0ktWCBkZXZpY2UgZnVuY3Rpb24KLSAqIEBkYXRhOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIE1TSS1YIGVudHJpZXMKKyAqIEBlbnRyaWVzOiBwb2ludGVyIHRvIGFuIGFycmF5IG9mIE1TSS1YIGVudHJpZXMKICAqIEBudmVjOiBudW1iZXIgb2YgTVNJLVggdmVjdG9ycyByZXF1ZXN0ZWQgZm9yIGFsbG9jYXRpb24gYnkgZGV2aWNlIGRyaXZlcgogICoKICAqIFNldHVwIHRoZSBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBvZiBkZXZpY2UgZnVuY3Rpb24gd2l0aCB0aGUgbnVtYmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuaCBiL2RyaXZlcnMvcGNpL21zaS5oCmluZGV4IGJlZjIxYWUuLjM5MGYxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5oCisrKyBiL2RyaXZlcnMvcGNpL21zaS5oCkBAIC00MSwxMSArNDEsMTEgQEAKICNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklSTUFTSwkJKDcgPDwgMCkKICNkZWZpbmUgUENJX01TSVhfRkxBR1NfQklUTUFTSwkJKDEgPDwgMCkKIAotI2RlZmluZSBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSX09GRlNFVAkwCi0jZGVmaW5lIFBDSV9NU0lYX0VOVFJZX1VQUEVSX0FERFJfT0ZGU0VUCTQKLSNkZWZpbmUgUENJX01TSVhfRU5UUllfREFUQV9PRkZTRVQJCTgKLSNkZWZpbmUgUENJX01TSVhfRU5UUllfVkVDVE9SX0NUUkxfT0ZGU0VUCTEyCiAjZGVmaW5lIFBDSV9NU0lYX0VOVFJZX1NJWkUJCQkxNgorI2RlZmluZSAgUENJX01TSVhfRU5UUllfTE9XRVJfQUREUl9PRkZTRVQJMAorI2RlZmluZSAgUENJX01TSVhfRU5UUllfVVBQRVJfQUREUl9PRkZTRVQJNAorI2RlZmluZSAgUENJX01TSVhfRU5UUllfREFUQV9PRkZTRVQJCTgKKyNkZWZpbmUgIFBDSV9NU0lYX0VOVFJZX1ZFQ1RPUl9DVFJMX09GRlNFVAkxMgogCiAjZGVmaW5lIG1zaV9jb250cm9sX3JlZyhiYXNlKQkJKGJhc2UgKyBQQ0lfTVNJX0ZMQUdTKQogI2RlZmluZSBtc2lfbG93ZXJfYWRkcmVzc19yZWcoYmFzZSkJKGJhc2UgKyBQQ0lfTVNJX0FERFJFU1NfTE8pCkBAIC02NCw3ICs2NCw2IEBACiAjZGVmaW5lIG1zaV9lbmFibGUoY29udHJvbCwgbnVtKSBtdWx0aV9tc2lfZW5hYmxlKGNvbnRyb2wsIG51bSk7IFwKIAljb250cm9sIHw9IFBDSV9NU0lfRkxBR1NfRU5BQkxFCiAKLSNkZWZpbmUgbXNpeF9jb250cm9sX3JlZwkJbXNpX2NvbnRyb2xfcmVnCiAjZGVmaW5lIG1zaXhfdGFibGVfb2Zmc2V0X3JlZyhiYXNlKQkoYmFzZSArIDB4MDQpCiAjZGVmaW5lIG1zaXhfcGJhX29mZnNldF9yZWcoYmFzZSkJKGJhc2UgKyAweDA4KQogI2RlZmluZSBtc2l4X2VuYWJsZShjb250cm9sKQkgCWNvbnRyb2wgfD0gUENJX01TSVhfRkxBR1NfRU5BQkxFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCBiYzAxZDM0Li5lOWUzN2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTEsOSArMSwxMCBAQAogLyoKICAqIEZpbGU6CXBjaS1hY3BpLmMKLSAqIFB1cnBvc2U6CVByb3ZpZGUgUENJIHN1cHBvcnRzIGluIEFDUEkKKyAqIFB1cnBvc2U6CVByb3ZpZGUgUENJIHN1cHBvcnQgaW4gQUNQSQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbAotICogQ29weXJpZ2h0IChDKSBUb20gTG9uZyBOZ3V5ZW4gKHRvbS5sLm5ndXllbkBpbnRlbC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgRGF2aWQgU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVG9tIExvbmcgTmd1eWVuIDx0b20ubC5uZ3V5ZW5AaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnAuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xNiw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogCiAjaW5jbHVkZSA8bGludXgvcGNpLWFjcGkuaD4KKyNpbmNsdWRlICJwY2kuaCIKIAogc3RhdGljIHUzMiBjdHJsc2V0X2J1ZlszXSA9IHswLCAwLCAwfTsKIHN0YXRpYyB1MzIgZ2xvYmFsX2N0cmxzZXRzID0gMDsKQEAgLTIwNywzICsyMDksMTA1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX29zY19jb250cm9sX3NldCk7CisKKy8qCisgKiBfU3hEIHJldHVybnMgdGhlIEQtc3RhdGUgd2l0aCB0aGUgaGlnaGVzdCBwb3dlcgorICogKGxvd2VzdCBELXN0YXRlIG51bWJlcikgc3VwcG9ydGVkIGluIHRoZSBTLXN0YXRlICJ4Ii4KKyAqCisgKiBJZiB0aGUgZGV2aWNlcyBkb2VzIG5vdCBoYXZlIGEgX1BSVworICogKFBvd2VyIFJlc291cmNlcyBmb3IgV2FrZSkgc3VwcG9ydGluZyBzeXN0ZW0gd2FrZXVwIGZyb20gIngiCisgKiB0aGVuIHRoZSBPUyBpcyBmcmVlIHRvIGNob29zZSBhIGxvd2VyIHBvd2VyIChoaWdoZXIgbnVtYmVyCisgKiBELXN0YXRlKSB0aGFuIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBfU3hELgorICoKKyAqIEJ1dCBpZiBfUFJXIGlzIGVuYWJsZWQgYXQgUy1zdGF0ZSAieCIsIHRoZSBPUworICogbXVzdCBub3QgY2hvb3NlIGEgcG93ZXIgbG93ZXIgdGhhbiBfU3hEIC0tCisgKiB1bmxlc3MgdGhlIGRldmljZSBoYXMgYW4gX1N4VyBtZXRob2Qgc3BlY2lmeWluZworICogdGhlIGxvd2VzdCBwb3dlciAoaGlnaGVzdCBELXN0YXRlIG51bWJlcikgdGhlIGRldmljZQorICogbWF5IGVudGVyIHdoaWxlIHN0aWxsIGFibGUgdG8gd2FrZSB0aGUgc3lzdGVtLgorICoKKyAqIGllLiBkZXBlbmRpbmcgb24gZ2xvYmFsIE9TIHBvbGljeToKKyAqCisgKiBpZiAoX1BSVyBhdCBTLXN0YXRlIHgpCisgKgljaG9vc2UgZnJvbSBoaWdoZXN0IHBvd2VyIF9TeEQgdG8gbG93ZXN0IHBvd2VyIF9TeFcKKyAqIGVsc2UgLy8gbm8gX1BSVyBhdCBTLXN0YXRlIHgKKyAqIAljaG9vc2UgaGlnaGVzdCBwb3dlciBfU3hEIG9yIGFueSBsb3dlciBwb3dlcgorICoKKyAqIGN1cnJlbnRseSB3ZSBzaW1wbHkgcmV0dXJuIF9TeEQsIGlmIHByZXNlbnQuCisgKi8KKworc3RhdGljIGludCBhY3BpX3BjaV9jaG9vc2Vfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBUQkQgKi8KKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGFjcGlfcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKK3sKKwlhY3BpX2hhbmRsZSBoYW5kbGUgPSBERVZJQ0VfQUNQSV9IQU5ETEUoJmRldi0+ZGV2KTsKKwlzdGF0aWMgaW50IHN0YXRlX2NvbnZbXSA9IHsKKwkJWzBdID0gMCwKKwkJWzFdID0gMSwKKwkJWzJdID0gMiwKKwkJWzNdID0gMywKKwkJWzRdID0gMworCX07CisJaW50IGFjcGlfc3RhdGUgPSBzdGF0ZV9jb252WyhpbnQgX19mb3JjZSkgc3RhdGVdOworCisJaWYgKCFoYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBhY3BpX2J1c19zZXRfcG93ZXIoaGFuZGxlLCBhY3BpX3N0YXRlKTsKK30KKworCisvKiBBQ1BJIGJ1cyB0eXBlICovCitzdGF0aWMgaW50IHBjaV9hY3BpX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXY7CisJYWNwaV9pbnRlZ2VyCWFkZHI7CisKKwlwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOworCS8qIFBsZWFzZSByZWYgdG8gQUNQSSBzcGVjIGZvciB0aGUgc3ludGF4IG9mIF9BRFIgKi8KKwlhZGRyID0gKFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKSA8PCAxNikgfCBQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbik7CisJKmhhbmRsZSA9IGFjcGlfZ2V0X2NoaWxkKERFVklDRV9BQ1BJX0hBTkRMRShkZXYtPnBhcmVudCksIGFkZHIpOworCWlmICghKmhhbmRsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNpX2FjcGlfZmluZF9yb290X2JyaWRnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICpoYW5kbGUpCit7CisJaW50IG51bTsKKwl1bnNpZ25lZCBpbnQgc2VnLCBidXM7CisKKwkvKgorCSAqIFRoZSBzdHJpbmcgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJvb3QgYnJpZGdlJ3MgbmFtZQorCSAqIFBsZWFzZSBsb29rIGF0ICdwY2lfc2Nhbl9idXNfcGFyZW50ZWQnCisJICovCisJbnVtID0gc3NjYW5mKGRldi0+YnVzX2lkLCAicGNpJTA0eDolMDJ4IiwgJnNlZywgJmJ1cyk7CisJaWYgKG51bSAhPSAyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkqaGFuZGxlID0gYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHNlZywgYnVzKTsKKwlpZiAoISpoYW5kbGUpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfYnVzX3R5cGUgcGNpX2FjcGlfYnVzID0geworCS5idXMgPSAmcGNpX2J1c190eXBlLAorCS5maW5kX2RldmljZSA9IHBjaV9hY3BpX2ZpbmRfZGV2aWNlLAorCS5maW5kX2JyaWRnZSA9IHBjaV9hY3BpX2ZpbmRfcm9vdF9icmlkZ2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwY2lfYWNwaV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoJnBjaV9hY3BpX2J1cyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisJcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSA9IGFjcGlfcGNpX2Nob29zZV9zdGF0ZTsKKwlwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlID0gYWNwaV9wY2lfc2V0X3Bvd2VyX3N0YXRlOworCXJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChwY2lfYWNwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCBlNjViZjJiLi5lNDExNWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktZHluaWRzLmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKIC8qCkBAIC0xOCwzNiArMTcsMTIgQEAKICAqIER5bmFtaWMgZGV2aWNlIElEcyBhcmUgZGlzYWJsZWQgZm9yICFDT05GSUdfSE9UUExVRwogICovCiAKLSNpZmRlZiBDT05GSUdfSE9UUExVRwotLyoqCi0gKiBwY2lfZGV2aWNlX3Byb2JlX2R5bmFtaWMoKQotICoKLSAqIFdhbGsgdGhlIGR5bmFtaWMgSUQgbGlzdCBsb29raW5nIGZvciBhIG1hdGNoLgotICogcmV0dXJucyAwIGFuZCBzZXRzIHBjaV9kZXYtPmRyaXZlciB3aGVuIGRydiBjbGFpbXMgcGNpX2RldiwgZWxzZSBlcnJvci4KLSAqLwotc3RhdGljIGludAotcGNpX2RldmljZV9wcm9iZV9keW5hbWljKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQotewotCWludCBlcnJvciA9IC1FTk9ERVY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCXN0cnVjdCBkeW5pZCAqZHluaWQ7CitzdHJ1Y3QgcGNpX2R5bmlkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IHBjaV9kZXZpY2VfaWQgaWQ7Cit9OwogCi0Jc3Bpbl9sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJmRydi0+ZHluaWRzLmxpc3QpIHsKLQkJZHluaWQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGR5bmlkLCBub2RlKTsKLQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKCZkeW5pZC0+aWQsIHBjaV9kZXYpKSB7Ci0JCQlzcGluX3VubG9jaygmZHJ2LT5keW5pZHMubG9jayk7Ci0JCQllcnJvciA9IGRydi0+cHJvYmUocGNpX2RldiwgJmR5bmlkLT5pZCk7Ci0JCQlpZiAoZXJyb3IgPj0gMCkgewotCQkJCXBjaV9kZXYtPmRyaXZlciA9IGRydjsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmZHJ2LT5keW5pZHMubG9jayk7Ci0JcmV0dXJuIGVycm9yOwotfQorI2lmZGVmIENPTkZJR19IT1RQTFVHCiAKIC8qKgogICogc3RvcmVfbmV3X2lkCkBAIC01OCw4ICszMyw3IEBACiBzdGF0aWMgaW5saW5lIHNzaXplX3QKIHN0b3JlX25ld19pZChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgZHluaWQgKmR5bmlkOwotCXN0cnVjdCBidXNfdHlwZSAqIGJ1czsKKwlzdHJ1Y3QgcGNpX2R5bmlkICpkeW5pZDsKIAlzdHJ1Y3QgcGNpX2RyaXZlciAqcGRydiA9IHRvX3BjaV9kcml2ZXIoZHJpdmVyKTsKIAlfX3UzMiB2ZW5kb3I9UENJX0FOWV9JRCwgZGV2aWNlPVBDSV9BTllfSUQsIHN1YnZlbmRvcj1QQ0lfQU5ZX0lELAogCQlzdWJkZXZpY2U9UENJX0FOWV9JRCwgY2xhc3M9MCwgY2xhc3NfbWFzaz0wOwpAQCAtOTEsMzcgKzY1LDIyIEBACiAJbGlzdF9hZGRfdGFpbCgmcGRydi0+ZHluaWRzLmxpc3QsICZkeW5pZC0+bm9kZSk7CiAJc3Bpbl91bmxvY2soJnBkcnYtPmR5bmlkcy5sb2NrKTsKIAotCWJ1cyA9IGdldF9idXMocGRydi0+ZHJpdmVyLmJ1cyk7Ci0JaWYgKGJ1cykgewotCQlpZiAoZ2V0X2RyaXZlcigmcGRydi0+ZHJpdmVyKSkgewotCQkJZG93bl93cml0ZSgmYnVzLT5zdWJzeXMucndzZW0pOwotCQkJZHJpdmVyX2F0dGFjaCgmcGRydi0+ZHJpdmVyKTsKLQkJCXVwX3dyaXRlKCZidXMtPnN1YnN5cy5yd3NlbSk7Ci0JCQlwdXRfZHJpdmVyKCZwZHJ2LT5kcml2ZXIpOwotCQl9Ci0JCXB1dF9idXMoYnVzKTsKKwlpZiAoZ2V0X2RyaXZlcigmcGRydi0+ZHJpdmVyKSkgeworCQlkcml2ZXJfYXR0YWNoKCZwZHJ2LT5kcml2ZXIpOworCQlwdXRfZHJpdmVyKCZwZHJ2LT5kcml2ZXIpOwogCX0KIAogCXJldHVybiBjb3VudDsKIH0KLQogc3RhdGljIERSSVZFUl9BVFRSKG5ld19pZCwgU19JV1VTUiwgTlVMTCwgc3RvcmVfbmV3X2lkKTsKLXN0YXRpYyBpbmxpbmUgdm9pZAotcGNpX2luaXRfZHluaWRzKHN0cnVjdCBwY2lfZHluaWRzICpkeW5pZHMpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmR5bmlkcy0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJmR5bmlkcy0+bGlzdCk7Ci19CiAKIHN0YXRpYyB2b2lkCiBwY2lfZnJlZV9keW5pZHMoc3RydWN0IHBjaV9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOwotCXN0cnVjdCBkeW5pZCAqZHluaWQ7CisJc3RydWN0IHBjaV9keW5pZCAqZHluaWQsICpuOwogCiAJc3Bpbl9sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmZHJ2LT5keW5pZHMubGlzdCkgewotCQlkeW5pZCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZHluaWQsIG5vZGUpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkeW5pZCwgbiwgJmRydi0+ZHluaWRzLmxpc3QsIG5vZGUpIHsKIAkJbGlzdF9kZWwoJmR5bmlkLT5ub2RlKTsKIAkJa2ZyZWUoZHluaWQpOwogCX0KQEAgLTEzOCw4MyArOTcsNzAgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQKLXBjaV9idXNfbWF0Y2hfZHluaWRzKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RydikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7Ci0Jc3RydWN0IGR5bmlkICpkeW5pZDsKLQotCXNwaW5fbG9jaygmcGNpX2Rydi0+ZHluaWRzLmxvY2spOwotCWxpc3RfZm9yX2VhY2gocG9zLCAmcGNpX2Rydi0+ZHluaWRzLmxpc3QpIHsKLQkJZHluaWQgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGR5bmlkLCBub2RlKTsKLQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKCZkeW5pZC0+aWQsIHBjaV9kZXYpKSB7Ci0JCQlzcGluX3VubG9jaygmcGNpX2Rydi0+ZHluaWRzLmxvY2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJnBjaV9kcnYtPmR5bmlkcy5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQogI2Vsc2UgLyogIUNPTkZJR19IT1RQTFVHICovCi1zdGF0aWMgaW5saW5lIGludCBwY2lfZGV2aWNlX3Byb2JlX2R5bmFtaWMoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2luaXRfZHluaWRzKHN0cnVjdCBwY2lfZHluaWRzICpkeW5pZHMpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2ZyZWVfZHluaWRzKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpIHt9CiBzdGF0aWMgaW5saW5lIGludCBwY2lfY3JlYXRlX25ld2lkX2ZpbGUoc3RydWN0IHBjaV9kcml2ZXIgKmRydikKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IHBjaV9idXNfbWF0Y2hfZHluaWRzKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RydikKLXsKLQlyZXR1cm4gMDsKLX0KICNlbmRpZgogCiAvKioKLSAqIHBjaV9tYXRjaF9kZXZpY2UgLSBUZWxsIGlmIGEgUENJIGRldmljZSBzdHJ1Y3R1cmUgaGFzIGEgbWF0Y2hpbmcKLSAqICAgICAgICAgICAgICAgICAgICBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZQorICogcGNpX21hdGNoX2lkIC0gU2VlIGlmIGEgcGNpIGRldmljZSBtYXRjaGVzIGEgZ2l2ZW4gcGNpX2lkIHRhYmxlCiAgKiBAaWRzOiBhcnJheSBvZiBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCi0gKiBAZGV2OiB0aGUgUENJIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAotICogCisgKiBAZGV2OiB0aGUgUENJIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdC4KKyAqCiAgKiBVc2VkIGJ5IGEgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYSBQQ0kgZGV2aWNlIHByZXNlbnQgaW4gdGhlCi0gKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuUmV0dXJucyB0aGUgbWF0Y2hpbmcKKyAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4gIFJldHVybnMgdGhlIG1hdGNoaW5nCiAgKiBwY2lfZGV2aWNlX2lkIHN0cnVjdHVyZSBvciAlTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KKyAqCisgKiBEZXByZWNpYXRlZCwgZG9uJ3QgdXNlIHRoaXMgYXMgaXQgd2lsbCBub3QgY2F0Y2ggYW55IGR5bmFtaWMgaWRzCisgKiB0aGF0IGEgZHJpdmVyIG1pZ2h0IHdhbnQgdG8gY2hlY2sgZm9yLgogICovCi1jb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqCi1wY2lfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsIGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYpCitjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX21hdGNoX2lkKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsCisJCQkJCSBzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXdoaWxlIChpZHMtPnZlbmRvciB8fCBpZHMtPnN1YnZlbmRvciB8fCBpZHMtPmNsYXNzX21hc2spIHsKLQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKGlkcywgZGV2KSkKLQkJCXJldHVybiBpZHM7Ci0JCWlkcysrOworCWlmIChpZHMpIHsKKwkJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgeworCQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKGlkcywgZGV2KSkKKwkJCQlyZXR1cm4gaWRzOworCQkJaWRzKys7CisJCX0KIAl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgotICogcGNpX2RldmljZV9wcm9iZV9zdGF0aWMoKQotICogCi0gKiByZXR1cm5zIDAgYW5kIHNldHMgcGNpX2Rldi0+ZHJpdmVyIHdoZW4gZHJ2IGNsYWltcyBwY2lfZGV2LCBlbHNlIGVycm9yLgorICogcGNpX21hdGNoX2RldmljZSAtIFRlbGwgaWYgYSBQQ0kgZGV2aWNlIHN0cnVjdHVyZSBoYXMgYSBtYXRjaGluZworICogICAgICAgICAgICAgICAgICAgIFBDSSBkZXZpY2UgaWQgc3RydWN0dXJlCisgKiBAaWRzOiBhcnJheSBvZiBQQ0kgZGV2aWNlIGlkIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCisgKiBAZGV2OiB0aGUgUENJIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICogQGRydjogdGhlIFBDSSBkcml2ZXIgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIFVzZWQgYnkgYSBkcml2ZXIgdG8gY2hlY2sgd2hldGhlciBhIFBDSSBkZXZpY2UgcHJlc2VudCBpbiB0aGUKKyAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4gIFJldHVybnMgdGhlIG1hdGNoaW5nCisgKiBwY2lfZGV2aWNlX2lkIHN0cnVjdHVyZSBvciAlTlVMTCBpZiB0aGVyZSBpcyBubyBtYXRjaC4KICAqLwotc3RhdGljIGludAotcGNpX2RldmljZV9wcm9iZV9zdGF0aWMoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17CQkgICAKLQlpbnQgZXJyb3IgPSAtRU5PREVWOworY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9tYXRjaF9kZXZpY2Uoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwKKwkJCQkJICAgICBzdHJ1Y3QgcGNpX2RldiAqZGV2KQorewogCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgcGNpX2R5bmlkICpkeW5pZDsKIAotCWlmICghZHJ2LT5pZF90YWJsZSkKLQkJcmV0dXJuIGVycm9yOwotCWlkID0gcGNpX21hdGNoX2RldmljZShkcnYtPmlkX3RhYmxlLCBwY2lfZGV2KTsKKwlpZCA9IHBjaV9tYXRjaF9pZChkcnYtPmlkX3RhYmxlLCBkZXYpOwogCWlmIChpZCkKLQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsIGlkKTsKLQlpZiAoZXJyb3IgPj0gMCkgewotCQlwY2lfZGV2LT5kcml2ZXIgPSBkcnY7Ci0JCWVycm9yID0gMDsKKwkJcmV0dXJuIGlkOworCisJLyogc3RhdGljIGlkcyBkaWRuJ3QgbWF0Y2gsIGxldHMgbG9vayBhdCB0aGUgZHluYW1pYyBvbmVzICovCisJc3Bpbl9sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGR5bmlkLCAmZHJ2LT5keW5pZHMubGlzdCwgbm9kZSkgeworCQlpZiAocGNpX21hdGNoX29uZV9kZXZpY2UoJmR5bmlkLT5pZCwgZGV2KSkgeworCQkJc3Bpbl91bmxvY2soJmRydi0+ZHluaWRzLmxvY2spOworCQkJcmV0dXJuICZkeW5pZC0+aWQ7CisJCX0KIAl9Ci0JcmV0dXJuIGVycm9yOworCXNwaW5fdW5sb2NrKCZkcnYtPmR5bmlkcy5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoqCkBAIC0yMjUsMTMgKzE3MSwyMCBAQAogICovCiBzdGF0aWMgaW50CiBfX3BjaV9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCi17CQkgICAKK3sKKwljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CiAJaW50IGVycm9yID0gMDsKIAogCWlmICghcGNpX2Rldi0+ZHJpdmVyICYmIGRydi0+cHJvYmUpIHsKLQkJZXJyb3IgPSBwY2lfZGV2aWNlX3Byb2JlX3N0YXRpYyhkcnYsIHBjaV9kZXYpOwotCQlpZiAoZXJyb3IgPT0gLUVOT0RFVikKLQkJCWVycm9yID0gcGNpX2RldmljZV9wcm9iZV9keW5hbWljKGRydiwgcGNpX2Rldik7CisJCWVycm9yID0gLUVOT0RFVjsKKworCQlpZCA9IHBjaV9tYXRjaF9kZXZpY2UoZHJ2LCBwY2lfZGV2KTsKKwkJaWYgKGlkKQorCQkJZXJyb3IgPSBkcnYtPnByb2JlKHBjaV9kZXYsIGlkKTsKKwkJaWYgKGVycm9yID49IDApIHsKKwkJCXBjaV9kZXYtPmRyaXZlciA9IGRydjsKKwkJCWVycm9yID0gMDsKKwkJfQogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0zNzEsMTIgKzMyNCw2IEBACiAJLnN5c2ZzX29wcyA9ICZwY2lfZHJpdmVyX3N5c2ZzX29wcywKIH07CiAKLXN0YXRpYyBpbnQKLXBjaV9wb3B1bGF0ZV9kcml2ZXJfZGlyKHN0cnVjdCBwY2lfZHJpdmVyICpkcnYpCi17Ci0JcmV0dXJuIHBjaV9jcmVhdGVfbmV3aWRfZmlsZShkcnYpOwotfQotCiAvKioKICAqIHBjaV9yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIG5ldyBwY2kgZHJpdmVyCiAgKiBAZHJ2OiB0aGUgZHJpdmVyIHN0cnVjdHVyZSB0byByZWdpc3RlcgpAQCAtNDAxLDEzICszNDgsMTUgQEAKIAkJZHJ2LT5kcml2ZXIuc2h1dGRvd24gPSBwY2lfZGV2aWNlX3NodXRkb3duOwogCWRydi0+ZHJpdmVyLm93bmVyID0gZHJ2LT5vd25lcjsKIAlkcnYtPmRyaXZlci5rb2JqLmt0eXBlID0gJnBjaV9kcml2ZXJfa29ial90eXBlOwotCXBjaV9pbml0X2R5bmlkcygmZHJ2LT5keW5pZHMpOworCisJc3Bpbl9sb2NrX2luaXQoJmRydi0+ZHluaWRzLmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkcnYtPmR5bmlkcy5saXN0KTsKIAogCS8qIHJlZ2lzdGVyIHdpdGggY29yZSAqLwogCWVycm9yID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CiAKIAlpZiAoIWVycm9yKQotCQlwY2lfcG9wdWxhdGVfZHJpdmVyX2RpcihkcnYpOworCQllcnJvciA9IHBjaV9jcmVhdGVfbmV3aWRfZmlsZShkcnYpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtNDYzLDIxICs0MTIsMTcgQEAKICAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy5SZXR1cm5zIHRoZSBtYXRjaGluZwogICogcGNpX2RldmljZV9pZCBzdHJ1Y3R1cmUgb3IgJU5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCiAgKi8KLXN0YXRpYyBpbnQgcGNpX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikgCitzdGF0aWMgaW50IHBjaV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewotCWNvbnN0IHN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgcGNpX2RyaXZlciAqIHBjaV9kcnYgPSB0b19wY2lfZHJpdmVyKGRydik7Ci0JY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKiBpZHMgPSBwY2lfZHJ2LT5pZF90YWJsZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqcGNpX2RydiA9IHRvX3BjaV9kcml2ZXIoZHJ2KTsKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZm91bmRfaWQ7CiAKLQlpZiAoIWlkcykKLQkJcmV0dXJuIDA7Ci0KLQlmb3VuZF9pZCA9IHBjaV9tYXRjaF9kZXZpY2UoaWRzLCBwY2lfZGV2KTsKKwlmb3VuZF9pZCA9IHBjaV9tYXRjaF9kZXZpY2UocGNpX2RydiwgcGNpX2Rldik7CiAJaWYgKGZvdW5kX2lkKQogCQlyZXR1cm4gMTsKIAotCXJldHVybiBwY2lfYnVzX21hdGNoX2R5bmlkcyhwY2lfZGV2LCBwY2lfZHJ2KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01MzYsNiArNDgxLDcgQEAKIAogcG9zdGNvcmVfaW5pdGNhbGwocGNpX2RyaXZlcl9pbml0KTsKIAorRVhQT1JUX1NZTUJPTChwY2lfbWF0Y2hfaWQpOwogRVhQT1JUX1NZTUJPTChwY2lfbWF0Y2hfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlZ2lzdGVyX2RyaXZlcik7CiBFWFBPUlRfU1lNQk9MKHBjaV91bnJlZ2lzdGVyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGExNWY5NDAuLmNjOWQ2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC02MCwxNSArNjAsMTggQEAKIAljaGFyICogc3RyID0gYnVmOwogCWludCBpOwogCWludCBtYXggPSA3OworCXU2NCBzdGFydCwgZW5kOwogCiAJaWYgKHBjaV9kZXYtPnN1Ym9yZGluYXRlKQogCQltYXggPSBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJc3RyICs9IHNwcmludGYoc3RyLCIweCUwMTZseCAweCUwMTZseCAweCUwMTZseFxuIiwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldixpKSwKLQkJCSAgICAgICBwY2lfcmVzb3VyY2VfZW5kKHBjaV9kZXYsaSksCi0JCQkgICAgICAgcGNpX3Jlc291cmNlX2ZsYWdzKHBjaV9kZXYsaSkpOworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICAmcGNpX2Rldi0+cmVzb3VyY2VbaV07CisJCXBjaV9yZXNvdXJjZV90b191c2VyKHBjaV9kZXYsIGksIHJlcywgJnN0YXJ0LCAmZW5kKTsKKwkJc3RyICs9IHNwcmludGYoc3RyLCIweCUwMTZsbHggMHglMDE2bGx4IDB4JTAxNmxseFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0LAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZW5kLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5mbGFncyk7CiAJfQogCXJldHVybiAoc3RyIC0gYnVmKTsKIH0KQEAgLTMxMyw4ICszMTYsMjEgQEAKIAkJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAoc3RydWN0IHJlc291cmNlICopYXR0ci0+cHJpdmF0ZTsKIAllbnVtIHBjaV9tbWFwX3N0YXRlIG1tYXBfdHlwZTsKKwl1NjQgc3RhcnQsIGVuZDsKKwlpbnQgaTsKIAotCXZtYS0+dm1fcGdvZmYgKz0gcmVzLT5zdGFydCA+PiBQQUdFX1NISUZUOworCWZvciAoaSA9IDA7IGkgPCBQQ0lfUk9NX1JFU09VUkNFOyBpKyspCisJCWlmIChyZXMgPT0gJnBkZXYtPnJlc291cmNlW2ldKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gUENJX1JPTV9SRVNPVVJDRSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBwY2lfbW1hcF9wYWdlX3JhbmdlKCkgZXhwZWN0cyB0aGUgc2FtZSBraW5kIG9mIGVudHJ5IGFzIGNvbWluZworCSAqIGZyb20gL3Byb2MvYnVzL3BjaS8gd2hpY2ggaXMgYSAidXNlciB2aXNpYmxlIiB2YWx1ZS4gSWYgdGhpcyBpcworCSAqIGRpZmZlcmVudCBmcm9tIHRoZSByZXNvdXJjZSBpdHNlbGYsIGFyY2ggd2lsbCBkbyBuZWNlc3NhcnkgZml4dXAuCisJICovCisJcGNpX3Jlc291cmNlX3RvX3VzZXIocGRldiwgaSwgcmVzLCAmc3RhcnQsICZlbmQpOworCXZtYS0+dm1fcGdvZmYgKz0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAltbWFwX3R5cGUgPSByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0gPyBwY2lfbW1hcF9tZW0gOiBwY2lfbW1hcF9pbzsKIAogCXJldHVybiBwY2lfbW1hcF9wYWdlX3JhbmdlKHBkZXYsIHZtYSwgbW1hcF90eXBlLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggZjA0YjlmZi4uMWIzNGZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTIzNSw3ICsyMzUsNyBAQAogICogLUVJTyBpZiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBQQ0kgUE0uCiAgKiAwIGlmIHdlIGNhbiBzdWNjZXNzZnVsbHkgY2hhbmdlIHRoZSBwb3dlciBzdGF0ZS4KICAqLwotCitpbnQgKCpwbGF0Zm9ybV9wY2lfc2V0X3Bvd2VyX3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCB0KTsKIGludAogcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwY2lfcG93ZXJfdCBzdGF0ZSkKIHsKQEAgLTI5OSwxMSArMjk5LDIwIEBACiAJCW1zbGVlcCgxMCk7CiAJZWxzZSBpZiAoc3RhdGUgPT0gUENJX0QyIHx8IGRldi0+Y3VycmVudF9zdGF0ZSA9PSBQQ0lfRDIpCiAJCXVkZWxheSgyMDApOwotCWRldi0+Y3VycmVudF9zdGF0ZSA9IHN0YXRlOwogCisJLyoKKwkgKiBHaXZlIGZpcm13YXJlIGEgY2hhbmNlIHRvIGJlIGNhbGxlZCwgc3VjaCBhcyBBQ1BJIF9QUngsIF9QU3gKKwkgKiBGaXJtd2FyZSBtZXRob2QgYWZ0ZXIgbmF0aWNlIG1ldGhvZCA/CisJICovCisJaWYgKHBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUpCisJCXBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBzdGF0ZSk7CisKKwlkZXYtPmN1cnJlbnRfc3RhdGUgPSBzdGF0ZTsKIAlyZXR1cm4gMDsKIH0KIAoraW50ICgqcGxhdGZvcm1fcGNpX2Nob29zZV9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKyAKIC8qKgogICogcGNpX2Nob29zZV9zdGF0ZSAtIENob29zZSB0aGUgcG93ZXIgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCiAgKiBAZGV2OiBQQ0kgZGV2aWNlIHRvIGJlIHN1c3BlbmRlZApAQCAtMzE2LDEwICszMjUsMTcgQEAKIAogcGNpX3Bvd2VyX3QgcGNpX2Nob29zZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CisJaW50IHJldDsKKwogCWlmICghcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfUE0pKQogCQlyZXR1cm4gUENJX0QwOwogCi0Jc3dpdGNoIChzdGF0ZSkgeworCWlmIChwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKSB7CisJCXJldCA9IHBsYXRmb3JtX3BjaV9jaG9vc2Vfc3RhdGUoZGV2LCBzdGF0ZSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCXN0YXRlID0gcmV0OworCX0KKyAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgMDogcmV0dXJuIFBDSV9EMDsKIAljYXNlIDM6IHJldHVybiBQQ0lfRDNob3Q7CiAJZGVmYXVsdDoKQEAgLTMzNCwxMCArMzUwLDYgQEAKIC8qKgogICogcGNpX3NhdmVfc3RhdGUgLSBzYXZlIHRoZSBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZSBvZiBhIGRldmljZSBiZWZvcmUgc3VzcGVuZGluZwogICogQGRldjogLSBQQ0kgZGV2aWNlIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoCi0gKiBAYnVmZmVyOiAtIGJ1ZmZlciB0byBob2xkIGNvbmZpZyBzcGFjZSBjb250ZXh0Ci0gKgotICogQGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUgUENJIDIuMiBjb25maWcgc3BhY2UgCi0gKiAoPj0gNjQgYnl0ZXMpLgogICovCiBpbnQKIHBjaV9zYXZlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0zNTIsOCArMzY0LDYgQEAKIC8qKiAKICAqIHBjaV9yZXN0b3JlX3N0YXRlIC0gUmVzdG9yZSB0aGUgc2F2ZWQgc3RhdGUgb2YgYSBQQ0kgZGV2aWNlCiAgKiBAZGV2OiAtIFBDSSBkZXZpY2UgdGhhdCB3ZSdyZSBkZWFsaW5nIHdpdGgKLSAqIEBidWZmZXI6IC0gc2F2ZWQgUENJIGNvbmZpZyBzcGFjZQotICoKICAqLwogaW50IAogcGNpX3Jlc3RvcmVfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggNzQ0ZGEwZC4uZDk0ZDdhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTExLDYgKzExLDEwIEBACiAJCQkJICB2b2lkICgqYWxpZ25mKSh2b2lkICosIHN0cnVjdCByZXNvdXJjZSAqLAogCQkJCQkgIAkgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyksCiAJCQkJICB2b2lkICphbGlnbmZfZGF0YSk7CisvKiBGaXJtd2FyZSBjYWxsYmFja3MgKi8KK2V4dGVybiBpbnQgKCpwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworZXh0ZXJuIGludCAoKnBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlKTsKKwogLyogUENJIC9wcm9jIGZ1bmN0aW9ucyAqLwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBleHRlcm4gaW50IHBjaV9wcm9jX2F0dGFjaF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnYuaCBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCmluZGV4IDUzN2IzNzIuLmE2M2JkOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCkBAIC0yNyw2ICsyNywxMSBAQAogCiAjZGVmaW5lIGdldF9kZXNjcmlwdG9yX2lkKHR5cGUsIHNlcnZpY2UpICgoKHR5cGUgLSA0KSA8PCA0KSB8IHNlcnZpY2UpCiAKK3N0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCB7CisJaW50IGludGVycnVwdF9tb2RlOwkvKiBbMDpJTlR4IHwgMTpNU0kgfCAyOk1TSS1YXSAqLworCXVuc2lnbmVkIGludCBzYXZlZF9tc2lfY29uZmlnX3NwYWNlWzVdOworfTsKKwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwY2llX3BvcnRfYnVzX3R5cGU7CiBleHRlcm4gaW50IHBjaWVfcG9ydF9kZXZpY2VfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldik7CiBleHRlcm4gaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYwppbmRleCBmNWM1ZjEwLi4zOTNlMGNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKQEAgLTI3NSwxMCArMjc1LDE3IEBACiAKIGludCBwY2llX3BvcnRfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CisJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dDsKIAlpbnQgc3RhdHVzLCB0eXBlLCBjYXBhYmlsaXRpZXMsIGlycV9tb2RlLCBpOwogCWludCB2ZWN0b3JzW1BDSUVfUE9SVF9ERVZJQ0VfTUFYU0VSVklDRVNdOwogCXUxNiByZWcxNjsKIAorCS8qIEFsbG9jYXRlIHBvcnQgZGV2aWNlIGV4dGVuc2lvbiAqLworCWlmICghKHBfZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0KSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHBfZXh0KTsKKwogCS8qIEdldCBwb3J0IHR5cGUgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsCiAJCXBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCkgKwpAQCAtMjg4LDYgKzI5NSw3IEBACiAJLyogTm93IGdldCBwb3J0IHNlcnZpY2VzICovCiAJY2FwYWJpbGl0aWVzID0gZ2V0X3BvcnRfZGV2aWNlX2NhcGFiaWxpdHkoZGV2KTsKIAlpcnFfbW9kZSA9IGFzc2lnbl9pbnRlcnJ1cHRfbW9kZShkZXYsIHZlY3RvcnMsIGNhcGFiaWxpdGllcyk7CisJcF9leHQtPmludGVycnVwdF9tb2RlID0gaXJxX21vZGU7CiAKIAkvKiBBbGxvY2F0ZSBjaGlsZCBzZXJ2aWNlcyBpZiBhbnkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgUENJRV9QT1JUX0RFVklDRV9NQVhTRVJWSUNFUzsgaSsrKSB7CkBAIC0zMTcsNyArMzI1LDcgQEAKIHN0YXRpYyBpbnQgc3VzcGVuZF9pdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpzZXJ2aWNlX2RyaXZlcjsKLQl1MzIgc3RhdGUgPSAodTMyKWRhdGE7CisJcG1fbWVzc2FnZV90IHN0YXRlID0gKiAocG1fbWVzc2FnZV90ICopIGRhdGE7CiAKICAJaWYgKChkZXYtPmJ1cyA9PSAmcGNpZV9wb3J0X2J1c190eXBlKSAmJgogIAkgICAgKGRldi0+ZHJpdmVyKSkgewpAQCAtMzI4LDkgKzMzNiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIHN0YXRlKQoraW50IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgKHZvaWQgKilzdGF0ZSwgc3VzcGVuZF9pdGVyKTsKKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAmc3RhdGUsIHN1c3BlbmRfaXRlcik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCBlOTA5NWVlLi4zMGJhYzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC0yOSw2ICsyOSw3OCBAQAogLyogZ2xvYmFsIGRhdGEgKi8KIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZV9uYW1lW10gPSAicGNpZXBvcnQtZHJpdmVyIjsKIAorc3RhdGljIHZvaWQgcGNpX3NhdmVfbXNpX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaWVfcG9ydF9kZXZpY2VfZXh0ICpwX2V4dCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpID0gMCwgcG9zOworCXUxNiBjb250cm9sOworCisgICAJaWYgKChwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9NU0kpKSA8PSAwKQorCQlyZXR1cm47CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MsICZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwljb250cm9sID0gcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbMF0gPj4gMTY7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9BRERSRVNTX0xPLAorCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTXzY0QklUKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfQUREUkVTU19ISSwKKwkJCSZwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9EQVRBXzY0LAorCQkJJnBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCX0gZWxzZQorCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0RBVEFfMzIsCisJCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTX01BU0tCSVQpCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfTUFTS19CSVQsCisJCQkmcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9yZXN0b3JlX21zaV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCAqcF9leHQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaSA9IDAsIHBvczsKKwl1MTYgY29udHJvbDsKKworICAgCWlmICgocG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfTVNJKSkgPD0gMCkKKwkJcmV0dXJuOworCisJY29udHJvbCA9IHBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10gPj4gMTY7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX01TSV9GTEFHUywgY29udHJvbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfQUREUkVTU19MTywKKwkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTXzY0QklUKSB7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0FERFJFU1NfSEksCisJCQlwX2V4dC0+c2F2ZWRfbXNpX2NvbmZpZ19zcGFjZVtpKytdKTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfREFUQV82NCwKKwkJCXBfZXh0LT5zYXZlZF9tc2lfY29uZmlnX3NwYWNlW2krK10pOworCX0gZWxzZQorCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX01TSV9EQVRBXzMyLAorCQkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7CisJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTX01BU0tCSVQpCisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX01BU0tfQklULAorCQkJcF9leHQtPnNhdmVkX21zaV9jb25maWdfc3BhY2VbaSsrXSk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfcG9ydGRydl9zYXZlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2llX3BvcnRfZGV2aWNlX2V4dCAqcF9leHQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKGRldik7CisJaWYgKHBfZXh0LT5pbnRlcnJ1cHRfbW9kZSA9PSBQQ0lFX1BPUlRfTVNJX01PREUpCisJCXBjaV9zYXZlX21zaV9zdGF0ZShkZXYpOworfQorCitzdGF0aWMgdm9pZCBwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpZV9wb3J0X2RldmljZV9leHQgKnBfZXh0ID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCWlmIChwX2V4dC0+aW50ZXJydXB0X21vZGUgPT0gUENJRV9QT1JUX01TSV9NT0RFKQorCQlwY2lfcmVzdG9yZV9tc2lfc3RhdGUoZGV2KTsKKwlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCXBjaV9zZXRfbWFzdGVyKGRldik7Cit9CisKIC8qCiAgKiBwY2llX3BvcnRkcnZfcHJvYmUgLSBQcm9iZSBQQ0ktRXhwcmVzcyBwb3J0IGRldmljZXMKICAqIEBkZXY6IFBDSS1FeHByZXNzIHBvcnQgZGV2aWNlIGJlaW5nIHByb2JlZApAQCAtNjQsMTYgKzEzNiwyMSBAQAogc3RhdGljIHZvaWQgcGNpZV9wb3J0ZHJ2X3JlbW92ZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlwY2llX3BvcnRfZGV2aWNlX3JlbW92ZShkZXYpOworCWtmcmVlKHBjaV9nZXRfZHJ2ZGF0YShkZXYpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBwY2llX3BvcnRkcnZfc3VzcGVuZCAoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXJldHVybiBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CisJaW50IHJldCA9IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChkZXYsIHN0YXRlKTsKKworCXBjaWVfcG9ydGRydl9zYXZlX2NvbmZpZyhkZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwlwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoZGV2KTsKIAlyZXR1cm4gcGNpZV9wb3J0X2RldmljZV9yZXN1bWUoZGV2KTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggZmQ0OGIyMC4uZGYzYmRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0yMzksOSArMjM5LDggQEAKIAogCWlmIChkZXYtPnRyYW5zcGFyZW50KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVHJhbnNwYXJlbnQgYnJpZGdlIC0gJXNcbiIsIHBjaV9uYW1lKGRldikpOwotCQlmb3IoaSA9IDA7IGkgPCBQQ0lfQlVTX05VTV9SRVNPVVJDRVM7IGkrKykKLQkJCWNoaWxkLT5yZXNvdXJjZVtpXSA9IGNoaWxkLT5wYXJlbnQtPnJlc291cmNlW2ldOwotCQlyZXR1cm47CisJCWZvcihpID0gMzsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKQorCQkJY2hpbGQtPnJlc291cmNlW2ldID0gY2hpbGQtPnBhcmVudC0+cmVzb3VyY2VbaSAtIDNdOwogCX0KIAogCWZvcihpPTA7IGk8MzsgaSsrKQpAQCAtMzc0LDggKzM3MywxMSBAQAogCXN0cnVjdCBwY2lfYnVzICpjaGlsZDsKIAogCWNoaWxkID0gcGNpX2FsbG9jX2NoaWxkX2J1cyhwYXJlbnQsIGRldiwgYnVzbnIpOwotCWlmIChjaGlsZCkKKwlpZiAoY2hpbGQpIHsKKwkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOwogCQlsaXN0X2FkZF90YWlsKCZjaGlsZC0+bm9kZSwgJnBhcmVudC0+Y2hpbGRyZW4pOworCQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl9CiAJcmV0dXJuIGNoaWxkOwogfQogCkBAIC0zOTUsNiArMzk3LDE2IEBACiAJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcnBjYXAgKyBQQ0lfRVhQX1JUQ1RMLCBycGN0bCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKHN0cnVjdCBwY2lfYnVzICpjaGlsZCwgaW50IG1heCkKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcGFyZW50ID0gY2hpbGQtPnBhcmVudDsKKwl3aGlsZSAocGFyZW50LT5wYXJlbnQgJiYgcGFyZW50LT5zdWJvcmRpbmF0ZSA8IG1heCkgeworCQlwYXJlbnQtPnN1Ym9yZGluYXRlID0gbWF4OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGFyZW50LT5zZWxmLCBQQ0lfU1VCT1JESU5BVEVfQlVTLCBtYXgpOworCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwl9Cit9CisKIHVuc2lnbmVkIGludCBfX2RldmluaXQgcGNpX3NjYW5fY2hpbGRfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKgpAQCAtNDExLDcgKzQyMyw3IEBACiB7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCWludCBpc19jYXJkYnVzID0gKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX0NBUkRCVVMpOwotCXUzMiBidXNlczsKKwl1MzIgYnVzZXMsIGk7CiAJdTE2IGJjdGw7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUFJJTUFSWV9CVVMsICZidXNlcyk7CkBAIC00NDcsNyArNDU5LDcgQEAKIAkJCXJldHVybiBtYXg7CiAJCX0KIAotCQljaGlsZCA9IHBjaV9hbGxvY19jaGlsZF9idXMoYnVzLCBkZXYsIGJ1c25yKTsKKwkJY2hpbGQgPSBwY2lfYWRkX25ld19idXMoYnVzLCBkZXYsIGJ1c25yKTsKIAkJaWYgKCFjaGlsZCkKIAkJCXJldHVybiBtYXg7CiAJCWNoaWxkLT5wcmltYXJ5ID0gYnVzZXMgJiAweEZGOwpAQCAtNDcwLDcgKzQ4MiwxMSBAQAogCQkvKiBDbGVhciBlcnJvcnMgKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX1NUQVRVUywgMHhmZmZmKTsKIAotCQljaGlsZCA9IHBjaV9hbGxvY19jaGlsZF9idXMoYnVzLCBkZXYsICsrbWF4KTsKKwkJLyogUHJldmVudCBhc3NpZ25pbmcgYSBidXMgbnVtYmVyIHRoYXQgYWxyZWFkeSBleGlzdHMuCisJCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgYnJpZGdlIGlzIGhvdC1wbHVnZ2VkICovCisJCWlmIChwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSkpCisJCQlyZXR1cm4gbWF4OworCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhidXMsIGRldiwgKyttYXgpOwogCQlidXNlcyA9IChidXNlcyAmIDB4ZmYwMDAwMDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5wcmltYXJ5KSAgICAgPDwgIDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5zZWNvbmRhcnkpICAgPDwgIDgpCkBAIC00OTIsNyArNTA4LDEzIEBACiAKIAkJaWYgKCFpc19jYXJkYnVzKSB7CiAJCQljaGlsZC0+YnJpZGdlX2N0bCA9IFBDSV9CUklER0VfQ1RMX05PX0lTQTsKLQorCQkJLyoKKwkJCSAqIEFkanVzdCBzdWJvcmRpbmF0ZSBidXNuciBpbiBwYXJlbnQgYnVzZXMuCisJCQkgKiBXZSBkbyB0aGlzIGJlZm9yZSBzY2FubmluZyBmb3IgY2hpbGRyZW4gYmVjYXVzZQorCQkJICogc29tZSBkZXZpY2VzIG1heSBub3QgYmUgZGV0ZWN0ZWQgaWYgdGhlIGJpb3MKKwkJCSAqIHdhcyBsYXp5LgorCQkJICovCisJCQlwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKGNoaWxkLCBtYXgpOwogCQkJLyogTm93IHdlIGNhbiBzY2FuIGFsbCBzdWJvcmRpbmF0ZSBidXNlcy4uLiAqLwogCQkJbWF4ID0gcGNpX3NjYW5fY2hpbGRfYnVzKGNoaWxkKTsKIAkJfSBlbHNlIHsKQEAgLTUwMSw3ICs1MjMsMTIgQEAKIAkJCSAqIGFzIGNhcmRzIHdpdGggYSBQQ0ktdG8tUENJIGJyaWRnZSBjYW4gYmUKIAkJCSAqIGluc2VydGVkIGxhdGVyLgogCQkJICovCi0JCQltYXggKz0gQ0FSREJVU19SRVNFUlZFX0JVU05SOworCQkJZm9yIChpPTA7IGk8Q0FSREJVU19SRVNFUlZFX0JVU05SOyBpKyspCisJCQkJaWYgKHBjaV9maW5kX2J1cyhwY2lfZG9tYWluX25yKGJ1cyksCisJCQkJCQkJbWF4K2krMSkpCisJCQkJCWJyZWFrOworCQkJbWF4ICs9IGk7CisJCQlwY2lfZml4dXBfcGFyZW50X3N1Ym9yZGluYXRlX2J1c25yKGNoaWxkLCBtYXgpOwogCQl9CiAJCS8qCiAJCSAqIFNldCB0aGUgc3Vib3JkaW5hdGUgYnVzIG51bWJlciB0byBpdHMgcmVhbCB2YWx1ZS4KQEAgLTc1Nyw3ICs3ODQsOSBAQAogCSAqIGFuZCB0aGUgYnVzIGxpc3QgZm9yIGZpeHVwIGZ1bmN0aW9ucywgZXRjLgogCSAqLwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmdsb2JhbF9saXN0KTsKKwlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5idXNfbGlzdCwgJmJ1cy0+ZGV2aWNlcyk7CisJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CiAKIAlyZXR1cm4gZGV2OwogfQpAQCAtODc4LDcgKzkwNyw5IEBACiAJCXByX2RlYnVnKCJQQ0k6IEJ1cyAlMDR4OiUwMnggYWxyZWFkeSBrbm93blxuIiwgcGNpX2RvbWFpbl9ucihiKSwgYnVzKTsKIAkJZ290byBlcnJfb3V0OwogCX0KKwlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmYi0+bm9kZSwgJnBjaV9yb290X2J1c2VzKTsKKwlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKIAogCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CiAJZGV2LT5wYXJlbnQgPSBwYXJlbnQ7CkBAIC05MTEsOCArOTQyLDYgQEAKIAogCWItPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGIpOwogCi0JcGNpX2J1c19hZGRfZGV2aWNlcyhiKTsKLQogCXJldHVybiBiOwogCiBzeXNfY3JlYXRlX2xpbmtfZXJyOgpAQCAtOTIyLDcgKzk1MSw5IEBACiBjbGFzc19kZXZfcmVnX2VycjoKIAlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogZGV2X3JlZ19lcnI6CisJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOwogCWxpc3RfZGVsKCZiLT5ub2RlKTsKKwlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKIGVycl9vdXQ6CiAJa2ZyZWUoZGV2KTsKIAlrZnJlZShiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2MuYyBiL2RyaXZlcnMvcGNpL3Byb2MuYwppbmRleCBlNjhiYmZiLi43OTg4ZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9jLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYy5jCkBAIC0zNTUsMTQgKzM1NSwyMCBAQAogCQkJZGV2LT5kZXZpY2UsCiAJCQlkZXYtPmlycSk7CiAJLyogSGVyZSBzaG91bGQgYmUgNyBhbmQgbm90IFBDSV9OVU1fUkVTT1VSQ0VTIGFzIHdlIG5lZWQgdG8gcHJlc2VydmUgY29tcGF0aWJpbGl0eSAqLwotCWZvcihpPTA7IGk8NzsgaSsrKQorCWZvciAoaT0wOyBpPDc7IGkrKykgeworCQl1NjQgc3RhcnQsIGVuZDsKKwkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCBMT05HX0ZPUk1BVCwKLQkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgfAorCQkJKCh1bnNpZ25lZCBsb25nKXN0YXJ0KSB8CiAJCQkoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIFBDSV9SRUdJT05fRkxBR19NQVNLKSk7Ci0JZm9yKGk9MDsgaTw3OyBpKyspCisJfQorCWZvciAoaT0wOyBpPDc7IGkrKykgeworCQl1NjQgc3RhcnQsIGVuZDsKKwkJcGNpX3Jlc291cmNlX3RvX3VzZXIoZGV2LCBpLCAmZGV2LT5yZXNvdXJjZVtpXSwgJnN0YXJ0LCAmZW5kKTsKIAkJc2VxX3ByaW50ZihtLCBMT05HX0ZPUk1BVCwKIAkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPCBkZXYtPnJlc291cmNlW2ldLmVuZCA/Ci0JCQlkZXYtPnJlc291cmNlW2ldLmVuZCAtIGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKyAxIDogMCk7CisJCQkodW5zaWduZWQgbG9uZykoZW5kIC0gc3RhcnQpICsgMSA6IDApOworCX0KIAlzZXFfcHV0YyhtLCAnXHQnKTsKIAlpZiAoZHJ2KQogCQlzZXFfcHJpbnRmKG0sICIlcyIsIGRydi0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDk2ODAzM2YuLjE1MjFmZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC03NjcsNiArNzY3LDcgQEAKIAlpZiAodW5saWtlbHkoZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfQVNVU1RFSykpIHsKIAkJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4NDVfSEIpCiAJCQlzd2l0Y2goZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCQljYXNlIDB4ODAyNTogLyogUDRCLUxYICovCiAJCQljYXNlIDB4ODA3MDogLyogUDRCICovCiAJCQljYXNlIDB4ODA4ODogLyogUDRCNTMzICovCiAJCQljYXNlIDB4MTYyNjogLyogTDNDIG5vdGVib29rICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yZW1vdmUuYyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCmluZGV4IDk2ZjA3N2YuLjI3YTI5NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jCisrKyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCkBAIC0xOCwxNyArMTgsMjEgQEAKIAogc3RhdGljIHZvaWQgcGNpX2Rlc3Ryb3lfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JcGNpX3Byb2NfZGV0YWNoX2RldmljZShkZXYpOwotCXBjaV9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKGRldik7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Z2xvYmFsX2xpc3QpKSB7CisJCXBjaV9wcm9jX2RldGFjaF9kZXZpY2UoZGV2KTsKKwkJcGNpX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMoZGV2KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQlsaXN0X2RlbCgmZGV2LT5nbG9iYWxfbGlzdCk7CisJCWRldi0+Z2xvYmFsX2xpc3QubmV4dCA9IGRldi0+Z2xvYmFsX2xpc3QucHJldiA9IE5VTEw7CisJCXNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCX0KIAogCS8qIFJlbW92ZSB0aGUgZGV2aWNlIGZyb20gdGhlIGRldmljZSBsaXN0cywgYW5kIHByZXZlbnQgYW55IGZ1cnRoZXIKIAkgKiBsaXN0IGFjY2Vzc2VzIGZyb20gdGhpcyBkZXZpY2UgKi8KIAlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CiAJbGlzdF9kZWwoJmRldi0+YnVzX2xpc3QpOwotCWxpc3RfZGVsKCZkZXYtPmdsb2JhbF9saXN0KTsKIAlkZXYtPmJ1c19saXN0Lm5leHQgPSBkZXYtPmJ1c19saXN0LnByZXYgPSBOVUxMOwotCWRldi0+Z2xvYmFsX2xpc3QubmV4dCA9IGRldi0+Z2xvYmFsX2xpc3QucHJldiA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CiAKIAlwY2lfZnJlZV9yZXNvdXJjZXMoZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKaW5kZXggYTkwYTUzMy4uMDVmYTkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2VhcmNoLmMKKysrIGIvZHJpdmVycy9wY2kvc2VhcmNoLmMKQEAgLTM3OSw2ICszNzksNyBAQAogRVhQT1JUX1NZTUJPTChwY2lfZGV2X3ByZXNlbnQpOwogCiBFWFBPUlRfU1lNQk9MKHBjaV9maW5kX2J1cyk7CitFWFBPUlRfU1lNQk9MKHBjaV9maW5kX25leHRfYnVzKTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX2ZpbmRfZGV2aWNlX3JldmVyc2UpOwogRVhQT1JUX1NZTUJPTChwY2lfZmluZF9zbG90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggMWJhODRiZS4uOWZlNDhmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTcyLDcgKzcyLDExIEBACiAJZm9yIChsaXN0ID0gaGVhZC5uZXh0OyBsaXN0OykgewogCQlyZXMgPSBsaXN0LT5yZXM7CiAJCWlkeCA9IHJlcyAtICZsaXN0LT5kZXYtPnJlc291cmNlWzBdOwotCQlwY2lfYXNzaWduX3Jlc291cmNlKGxpc3QtPmRldiwgaWR4KTsKKwkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UobGlzdC0+ZGV2LCBpZHgpKSB7CisJCQlyZXMtPnN0YXJ0ID0gMDsKKwkJCXJlcy0+ZW5kID0gMDsKKwkJCXJlcy0+ZmxhZ3MgPSAwOworCQl9CiAJCXRtcCA9IGxpc3Q7CiAJCWxpc3QgPSBsaXN0LT5uZXh0OwogCQlrZnJlZSh0bXApOwpAQCAtMjcwLDYgKzI3NCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgUENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKIAkJciA9IGJ1cy0+cmVzb3VyY2VbaV07CisJCWlmIChyID09ICZpb3BvcnRfcmVzb3VyY2UgfHwgciA9PSAmaW9tZW1fcmVzb3VyY2UpCisJCQljb250aW51ZTsKIAkJaWYgKHIgJiYgKHItPmZsYWdzICYgdHlwZV9tYXNrKSA9PSB0eXBlICYmICFyLT5wYXJlbnQpCiAJCQlyZXR1cm4gcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCAxNGU0MTI0Li42NDg1Zjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTEsOCArMSw1IEBACiAjCi0jIFBDTUNJQSBidXMgc3Vic3lzdGVtIGNvbmZpZ3VyYXRpb24KLSMKLSMgUmlnaHQgbm93IHRoZSBub24tQ2FyZEJ1cyBjaG9pY2VzIGFyZSBub3Qgc3VwcG9ydGVkCi0jIGJ5IHRoZSBpbnRlZ3JhdGVkIGtlcm5lbCBkcml2ZXIuCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIGJ1cyBzdWJzeXN0ZW0gY29uZmlndXJhdGlvbgogIwogCiBtZW51ICJQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0IgpAQCAtMTQsOCArMTEsOCBAQAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBhdHRhY2ggUENNQ0lBLSBvciBQQy1jYXJkcyB0byB5b3VyIExpbnV4CiAJICBjb21wdXRlci4gIFRoZXNlIGFyZSBjcmVkaXQtY2FyZCBzaXplIGRldmljZXMgc3VjaCBhcyBuZXR3b3JrIGNhcmRzLAogCSAgbW9kZW1zIG9yIGhhcmQgZHJpdmVzIG9mdGVuIHVzZWQgd2l0aCBsYXB0b3BzIGNvbXB1dGVycy4gIFRoZXJlIGFyZQotCSAgYWN0dWFsbHkgdHdvIHZhcmlldGllcyBvZiB0aGVzZSBjYXJkczogdGhlIG9sZGVyIDE2IGJpdCBQQ01DSUEgY2FyZHMKLQkgIGFuZCB0aGUgbmV3ZXIgMzIgYml0IENhcmRCdXMgY2FyZHMuCisJICBhY3R1YWxseSB0d28gdmFyaWV0aWVzIG9mIHRoZXNlIGNhcmRzOiAxNiBiaXQgUENNQ0lBIGFuZCAzMiBiaXQKKwkgIENhcmRCdXMgY2FyZHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlcywgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNtY2lhX2NvcmUuCkBAIC0zMiw3ICsyOSw3IEBACiAKIAkgIFRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlOgogCSAgICBwY21jaWFfY29yZS5wY19kZWJ1Zz1OCi0JICAgIGRzLnBjX2RlYnVnPU4KKwkgICAgcGNtY2lhLnBjX2RlYnVnPU4KIAkgICAgc2ExMXh4X2NvcmUucGNfZGVidWc9TgogCiAJICBUaGUgbW9kdWxlIG9wdGlvbiBpcyBjYWxsZWQgcGNfZGVidWc9TgpAQCAtNDIsMjIgKzM5LDUwIEBACiAKIGNvbmZpZyBQQ01DSUEKIAl0cmlzdGF0ZSAiMTYtYml0IFBDTUNJQSBzdXBwb3J0IgorCXNlbGVjdCBDUkMzMgogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIDE2LWJpdCBQQ01DSUEgY2FyZHMuIE1vc3Qgb2xkZXIKIAkgICBQQy1jYXJkcyBhcmUgc3VjaCAxNi1iaXQgUENNQ0lBIGNhcmRzLCBzbyB1bmxlc3MgeW91IGtub3cgeW91J3JlCiAJICAgb25seSB1c2luZyAzMi1iaXQgQ2FyZEJ1cyBjYXJkcywgc2F5IFkgb3IgTSBoZXJlLgogCi0JICAgVG8gdXNlIDE2LWJpdCBQQ01DSUEgY2FyZHMsIHlvdSB3aWxsIG5lZWQgc3VwcG9ydGluZyBzb2Z0d2FyZSBmcm9tIAotCSAgIERhdmlkIEhpbmRzJyBwY21jaWEtY3MgcGFja2FnZSAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4KLSAJICAgZm9yIGxvY2F0aW9uKS4gIFBsZWFzZSBhbHNvIHJlYWQgdGhlIFBDTUNJQS1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCSAgIFRvIHVzZSAxNi1iaXQgUENNQ0lBIGNhcmRzLCB5b3Ugd2lsbCBuZWVkIHN1cHBvcnRpbmcgc29mdHdhcmUgaW4KKwkgICBtb3N0IGNhc2VzLiAoc2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vQ2hhbmdlcz4gZm9yCisJICAgbG9jYXRpb24gYW5kIGRldGFpbHMpLgogCiAJICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGVzLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNtY2lhLgogCiAJICAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIFBDTUNJQV9MT0FEX0NJUworCWJvb2wgIkxvYWQgQ0lTIHVwZGF0ZXMgZnJvbSB1c2Vyc3BhY2UgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ01DSUEgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEZXX0xPQURFUgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNvbWUgUENNQ0lBIGNhcmRzIHJlcXVpcmUgYW4gdXBkYXRlZCBDYXJkIEluZm9ybWF0aW9uIFN0cnVjdHVyZSAoQ0lTKQorCSAgdG8gYmUgbG9hZGVkIGZyb20gdXNlcnNwYWNlIHRvIHdvcmsgY29ycmVjdGx5LiBJZiB5b3Ugc2F5IFkgaGVyZSwKKwkgIGFuZCB5b3VyIHVzZXJzcGFjZSBpcyBhcnJhbmdlZCBjb3JyZWN0bHksIHRoaXMgd2lsbCBiZSBsb2FkZWQKKwkgIGF1dG9tYXRpY2FsbHkgdXNpbmcgdGhlIGluLWtlcm5lbCBmaXJtd2FyZSBsb2FkZXIgYW5kIHRoZSBob3RwbHVnCisJICBzdWJzeXN0ZW0sIGluc3RlYWQgb2YgcmVseWluZyBvbiBjYXJkbWdyIGZyb20gcGNtY2lhLWNzIHRvIGRvIHNvLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUENNQ0lBX0lPQ1RMCisJYm9vbCAiUENNQ0lBIGNvbnRyb2wgaW9jdGwgKG9ic29sZXRlKSIKKwlkZXBlbmRzIG9uIFBDTUNJQQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgZGVwcmVjYXRlZCBpb2N0bCBpbnRlcmZhY2UgdG8gdGhlIFBDTUNJQQorCSAgc3Vic3lzdGVtIHdpbGwgYmUgYnVpbHQuIEl0IGlzIG5lZWRlZCBieSBjYXJkbWdyIGFuZCBjYXJkY3RsCisJICAocGNtY2lhLWNzKSB0byBmdW5jdGlvbiBwcm9wZXJseS4KKworCSAgWW91IHNob3VsZCB1c2UgdGhlIG5ldyBwY21jaWF1dGlscyBwYWNrYWdlIGluc3RlYWQgKHNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPiBmb3IgbG9jYXRpb24gYW5kIGRldGFpbHMpLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgQ0FSREJVUwogCWJvb2wgIjMyLWJpdCBDYXJkQnVzIHN1cHBvcnQiCQogCWRlcGVuZHMgb24gUENJCkBAIC03OCw4ICsxMDMsNyBAQAogY29uZmlnIFlFTlRBCiAJdHJpc3RhdGUgIkNhcmRCdXMgeWVudGEtY29tcGF0aWJsZSBicmlkZ2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQotI2ZpeG1lOiByZW1vdmUgZGVwZW5kZW5kY3kgb24gQ0FSREJVUwotCWRlcGVuZHMgb24gQ0FSREJVUworCXNlbGVjdCBDQVJEQlVTIGlmICFFTUJFRERFRAogCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBDYXJkQnVzIGhvc3QgYnJpZGdlcy4gIFZpcnR1YWxseQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQppbmRleCA1MGMyOTM2Li5lZjY5NGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjbWNpYS9NYWtlZmlsZQpAQCAtMTAsNyArMTAsOCBAQAogcGNtY2lhX2NvcmUtJChDT05GSUdfQ0FSREJVUykJCQkrPSBjYXJkYnVzLm8KIG9iai0kKENPTkZJR19QQ0NBUkQpCQkJCSs9IHBjbWNpYV9jb3JlLm8KIAotcGNtY2lhLXkJCQkJCSs9IGRzLm8gcGNtY2lhX2NvbXBhdC5vCitwY21jaWEteQkJCQkJKz0gZHMubyBwY21jaWFfY29tcGF0Lm8gcGNtY2lhX3Jlc291cmNlLm8KK3BjbWNpYS0kKENPTkZJR19QQ01DSUFfSU9DVEwpCQkJKz0gcGNtY2lhX2lvY3RsLm8KIG9iai0kKENPTkZJR19QQ01DSUEpCQkJCSs9IHBjbWNpYS5vCiAKIG9iai0kKENPTkZJR19QQ0NBUkRfTk9OU1RBVElDKQkJCSs9IHJzcmNfbm9uc3RhdGljLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmggYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCmluZGV4IDQxN2JjMTUuLmQ1MTIyYjFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfZ2VuZXJpYy5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9nZW5lcmljLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNkZWZpbmUgX19BU01fQVUxMDAwX1BDTUNJQV9ICiAKIC8qIGluY2x1ZGUgdGhlIHdvcmxkICovCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF9wYjF4MDAuYwppbmRleCBkZjE5Y2UxLi5kNDE0YTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfcGIxeDAwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvYXUxMDAwX3BiMXgwMC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYyBiL2RyaXZlcnMvcGNtY2lhL2F1MTAwMF94eHMxNTAwLmMKaW5kZXggMWRmYzc3Ni4uZjExM2I2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvYXUxMDAwX3h4czE1MDAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9hdTEwMDBfeHhzMTUwMC5jCkBAIC0zOCw3ICszOCw2IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jIGIvZHJpdmVycy9wY21jaWEvY2FyZGJ1cy5jCmluZGV4IDNjY2I1MjQuLjFkNzU1ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2NhcmRidXMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9jYXJkYnVzLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBJTl9DQVJEX1NFUlZJQ0VTCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2Npc3RwbC5jIGIvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKaW5kZXggZTI5YTZkZC4uZGQ3NjUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKKysrIGIvZHJpdmVycy9wY21jaWEvY2lzdHBsLmMKQEAgLTg5LDggKzg5LDEwIEBACiBzZXRfY2lzX21hcChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGNhcmRfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAgICAgcGNjYXJkX21lbV9tYXAgKm1lbSA9ICZzLT5jaXNfbWVtOworICAgIGludCByZXQ7CisKICAgICBpZiAoIShzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSAmJiBtZW0tPnJlcyA9PSBOVUxMKSB7Ci0JbWVtLT5yZXMgPSBmaW5kX21lbV9yZWdpb24oMCwgcy0+bWFwX3NpemUsIHMtPm1hcF9zaXplLCAwLCBzKTsKKwltZW0tPnJlcyA9IHBjbWNpYV9maW5kX21lbV9yZWdpb24oMCwgcy0+bWFwX3NpemUsIHMtPm1hcF9zaXplLCAwLCBzKTsKIAlpZiAobWVtLT5yZXMgPT0gTlVMTCkgewogCSAgICBwcmludGsoS0VSTl9OT1RJQ0UgImNzOiB1bmFibGUgdG8gbWFwIGNhcmQgbWVtb3J5IVxuIik7CiAJICAgIHJldHVybiBOVUxMOwpAQCAtOTksNyArMTAxLDEyIEBACiAgICAgfQogICAgIG1lbS0+Y2FyZF9zdGFydCA9IGNhcmRfb2Zmc2V0OwogICAgIG1lbS0+ZmxhZ3MgPSBmbGFnczsKLSAgICBzLT5vcHMtPnNldF9tZW1fbWFwKHMsIG1lbSk7CisgICAgcmV0ID0gcy0+b3BzLT5zZXRfbWVtX21hcChzLCBtZW0pOworICAgIGlmIChyZXQpIHsKKwlpb3VubWFwKHMtPmNpc192aXJ0KTsKKwlyZXR1cm4gTlVMTDsKKyAgICB9CisKICAgICBpZiAocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkgewogCWlmIChzLT5jaXNfdmlydCkKIAkgICAgaW91bm1hcChzLT5jaXNfdmlydCk7CkBAIC0xMTksMTMgKzEyNiwxMyBAQAogI2RlZmluZSBJU19BVFRSCQkxCiAjZGVmaW5lIElTX0lORElSRUNUCTgKIAotaW50IHJlYWRfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsIHVfaW50IGFkZHIsCitpbnQgcGNtY2lhX3JlYWRfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsIHVfaW50IGFkZHIsCiAJCSB1X2ludCBsZW4sIHZvaWQgKnB0cikKIHsKICAgICB2b2lkIF9faW9tZW0gKnN5cywgKmVuZDsKICAgICB1bnNpZ25lZCBjaGFyICpidWYgPSBwdHI7CiAgICAgCi0gICAgY3NfZGJnKHMsIDMsICJyZWFkX2Npc19tZW0oJWQsICUjeCwgJXUpXG4iLCBhdHRyLCBhZGRyLCBsZW4pOworICAgIGNzX2RiZyhzLCAzLCAicGNtY2lhX3JlYWRfY2lzX21lbSglZCwgJSN4LCAldSlcbiIsIGF0dHIsIGFkZHIsIGxlbik7CiAKICAgICBpZiAoYXR0ciAmIElTX0lORElSRUNUKSB7CiAJLyogSW5kaXJlY3QgYWNjZXNzZXMgdXNlIGEgYnVuY2ggb2Ygc3BlY2lhbCByZWdpc3RlcnMgYXQgZml4ZWQKQEAgLTE4MiwxNCArMTg5LDE2IEBACiAJICAqKHVfY2hhciAqKShwdHIrMiksICoodV9jaGFyICopKHB0ciszKSk7CiAgICAgcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWFkX2Npc19tZW0pOwogCi12b2lkIHdyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLCB1X2ludCBhZGRyLAorCit2b2lkIHBjbWNpYV93cml0ZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBpbnQgYXR0ciwgdV9pbnQgYWRkciwKIAkJICAgdV9pbnQgbGVuLCB2b2lkICpwdHIpCiB7CiAgICAgdm9pZCBfX2lvbWVtICpzeXMsICplbmQ7CiAgICAgdW5zaWduZWQgY2hhciAqYnVmID0gcHRyOwogICAgIAotICAgIGNzX2RiZyhzLCAzLCAid3JpdGVfY2lzX21lbSglZCwgJSN4LCAldSlcbiIsIGF0dHIsIGFkZHIsIGxlbik7CisgICAgY3NfZGJnKHMsIDMsICJwY21jaWFfd3JpdGVfY2lzX21lbSglZCwgJSN4LCAldSlcbiIsIGF0dHIsIGFkZHIsIGxlbik7CiAKICAgICBpZiAoYXR0ciAmIElTX0lORElSRUNUKSB7CiAJLyogSW5kaXJlY3QgYWNjZXNzZXMgdXNlIGEgYnVuY2ggb2Ygc3BlY2lhbCByZWdpc3RlcnMgYXQgZml4ZWQKQEAgLTIzOSw2ICsyNDgsOCBAQAogCX0KICAgICB9CiB9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV93cml0ZV9jaXNfbWVtKTsKKwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtMjc0LDcgKzI4NSw3IEBACiAJcmV0ID0gcmVhZF9jYl9tZW0ocywgYXR0ciwgYWRkciwgbGVuLCBwdHIpOwogICAgIGVsc2UKICNlbmRpZgotCXJldCA9IHJlYWRfY2lzX21lbShzLCBhdHRyLCBhZGRyLCBsZW4sIHB0cik7CisJcmV0ID0gcGNtY2lhX3JlYWRfY2lzX21lbShzLCBhdHRyLCBhZGRyLCBsZW4sIHB0cik7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJLyogQ29weSBkYXRhIGludG8gdGhlIGNhY2hlICovCkBAIC0zNDgsNyArMzU5LDcgQEAKIAkJCXJlYWRfY2JfbWVtKHMsIGNpcy0+YXR0ciwgY2lzLT5hZGRyLCBsZW4sIGJ1Zik7CiAJCWVsc2UKICNlbmRpZgotCQkJcmVhZF9jaXNfbWVtKHMsIGNpcy0+YXR0ciwgY2lzLT5hZGRyLCBsZW4sIGJ1Zik7CisJCQlwY21jaWFfcmVhZF9jaXNfbWVtKHMsIGNpcy0+YXR0ciwgY2lzLT5hZGRyLCBsZW4sIGJ1Zik7CiAKIAkJaWYgKG1lbWNtcChidWYsIGNpcy0+Y2FjaGUsIGxlbikgIT0gMCkgewogCQkJa2ZyZWUoYnVmKTsKQEAgLTM4MSw2ICszOTIsNyBAQAogICAgIG1lbWNweShzLT5mYWtlX2NpcywgY2lzLT5EYXRhLCBjaXMtPkxlbmd0aCk7CiAgICAgcmV0dXJuIENTX1NVQ0NFU1M7CiB9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXBsYWNlX2Npcyk7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jcy5jIGIvZHJpdmVycy9wY21jaWEvY3MuYwppbmRleCBkMTM2YjNjLi5lMzkxNzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzLmMKQEAgLTMzLDcgKzMzLDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUwotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CkBAIC00MywzNiArNDIsMTEgQEAKICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KICNpbmNsdWRlICJjc19pbnRlcm5hbC5oIgogCi0jaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lfT1BUICIgW3BjaV0iCi0jZWxzZQotI2RlZmluZSBQQ0lfT1BUICIiCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotI2RlZmluZSBDQl9PUFQgIiBbY2FyZGJ1c10iCi0jZWxzZQotI2RlZmluZSBDQl9PUFQgIiIKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QTQotI2RlZmluZSBQTV9PUFQgIiBbcG1dIgotI2Vsc2UKLSNkZWZpbmUgUE1fT1BUICIiCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChDT05GSUdfQ0FSREJVUykgJiYgIWRlZmluZWQoQ09ORklHX1BDSSkgJiYgIWRlZmluZWQoQ09ORklHX1BNKQotI2RlZmluZSBPUFRJT05TICIgbm9uZSIKLSNlbHNlCi0jZGVmaW5lIE9QVElPTlMgUENJX09QVCBDQl9PUFQgUE1fT1BUCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJlbGVhc2UgPSAiTGludXggS2VybmVsIENhcmQgU2VydmljZXMiOwotc3RhdGljIGNvbnN0IGNoYXIgKm9wdGlvbnMgPSAib3B0aW9uczogIiBPUFRJT05TOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KIAogTU9EVUxFX0FVVEhPUigiRGF2aWQgSGluZHMgPGRhaGluZHNAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBLZXJuZWwgQ2FyZCBTZXJ2aWNlc1xub3B0aW9uczoiIE9QVElPTlMpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBLZXJuZWwgQ2FyZCBTZXJ2aWNlcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2OyBtb2R1bGVfcGFyYW0obiwgaW50LCAwNDQ0KQpAQCAtODksOSArNjMsNiBAQAogLyogQWNjZXNzIHNwZWVkIGZvciBhdHRyaWJ1dGUgbWVtb3J5IHdpbmRvd3MgKi8KIElOVF9NT0RVTEVfUEFSTShjaXNfc3BlZWQsCTMwMCk7CQkvKiBucyAqLwogCi0vKiBBY2Nlc3Mgc3BlZWQgZm9yIElPIHdpbmRvd3MgKi8KLUlOVF9NT0RVTEVfUEFSTShpb19zcGVlZCwJMCk7CQkvKiBucyAqLwotCiAjaWZkZWYgREVCVUcKIHN0YXRpYyBpbnQgcGNfZGVidWc7CiAKQEAgLTEwMywzNCArNzQsMjYgQEAKIH0KICNlbmRpZgogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogc29ja2V0X3N0YXRlX3QgZGVhZF9zb2NrZXQgPSB7CiAJLmNzY19tYXNrCT0gU1NfREVURUNULAogfTsKK0VYUE9SVF9TWU1CT0woZGVhZF9zb2NrZXQpOwogCiAKIC8qIExpc3Qgb2YgYWxsIHNvY2tldHMsIHByb3RlY3RlZCBieSBhIHJ3c2VtICovCiBMSVNUX0hFQUQocGNtY2lhX3NvY2tldF9saXN0KTsKLURFQ0xBUkVfUldTRU0ocGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKIEVYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9saXN0KTsKKworREVDTEFSRV9SV1NFTShwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogRVhQT1JUX1NZTUJPTChwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCiAKLSNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCi0vKiBtYXNrIG9mSVJRcyBhbHJlYWR5IHJlc2VydmVkIGJ5IG90aGVyIGNhcmRzLCB3ZSBzaG91bGQgYXZvaWQgdXNpbmcgdGhlbSAqLwotc3RhdGljIHU4IHBjbWNpYV91c2VkX2lycVtOUl9JUlFTXTsKLSNlbmRpZgotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBMb3ctbGV2ZWwgUEMgQ2FyZCBpbnRlcmZhY2UgZHJpdmVycyBuZWVkIHRvIHJlZ2lzdGVyIHdpdGggQ2FyZAotICAgIFNlcnZpY2VzIHVzaW5nIHRoZXNlIGNhbGxzLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KIC8qKgotICogc29ja2V0IGRyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIHVzZSB0aGUgZm9sbG93aW5nIGNhbGxiYWNrcyBpbiB0aGVpciAKKyAqIExvdy1sZXZlbCBQQ01DSUEgc29ja2V0IGRyaXZlcnMgbmVlZCB0byByZWdpc3RlciB3aXRoIHRoZSBQQ0NhcmQKKyAqIGNvcmUgdXNpbmcgcGNtY2lhX3JlZ2lzdGVyX3NvY2tldC4KKyAqCisgKiBzb2NrZXQgZHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzIGluIHRoZWlyCiAgKiAuZHJ2IHN0cnVjdDoKICAqICAtIHBjbWNpYV9zb2NrZXRfZGV2X3N1c3BlbmQKICAqICAtIHBjbWNpYV9zb2NrZXRfZGV2X3Jlc3VtZQpAQCAtMjMwLDggKzE5Myw4IEBACiAJfQogCiAJLyogdHJ5IHRvIG9idGFpbiBhIHNvY2tldCBudW1iZXIgW3llcywgaXQgZ2V0cyB1Z2x5IGlmIHdlCi0JICogcmVnaXN0ZXIgbW9yZSB0aGFuIDJec2l6ZW9mKHVuc2lnbmVkIGludCkgcGNtY2lhIAotCSAqIHNvY2tldHMuLi4gYnV0IHRoZSBzb2NrZXQgbnVtYmVyIGlzIGRlcHJlY2F0ZWQgCisJICogcmVnaXN0ZXIgbW9yZSB0aGFuIDJec2l6ZW9mKHVuc2lnbmVkIGludCkgcGNtY2lhCisJICogc29ja2V0cy4uLiBidXQgdGhlIHNvY2tldCBudW1iZXIgaXMgZGVwcmVjYXRlZAogCSAqIGFueXdheXMsIHNvIEkgZG9uJ3QgY2FyZV0gKi8KIAlkb3duX3dyaXRlKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCWlmIChsaXN0X2VtcHR5KCZwY21jaWFfc29ja2V0X2xpc3QpKQpAQCAtMjUyLDYgKzIxNSwxMyBAQAogCWxpc3RfYWRkX3RhaWwoJnNvY2tldC0+c29ja2V0X2xpc3QsICZwY21jaWFfc29ja2V0X2xpc3QpOwogCXVwX3dyaXRlKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwogCisjaWZuZGVmIENPTkZJR19DQVJEQlVTCisJLyoKKwkgKiBJZiB3ZSBkbyBub3Qgc3VwcG9ydCBDYXJkYnVzLCBlbnN1cmUgdGhhdAorCSAqIHRoZSBDYXJkYnVzIHNvY2tldCBjYXBhYmlsaXR5IGlzIGRpc2FibGVkLgorCSAqLworCXNvY2tldC0+ZmVhdHVyZXMgJj0gflNTX0NBUF9DQVJEQlVTOworI2VuZGlmCiAKIAkvKiBzZXQgcHJvcGVyIHZhbHVlcyBpbiBzb2NrZXQtPmRldiAqLwogCXNvY2tldC0+ZGV2LmNsYXNzX2RhdGEgPSBzb2NrZXQ7CkBAIC0zNDAsNTQgKzMxMCw0OSBAQAogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3NvY2tldF9ieV9ucik7CiAKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBzb2NrZXRfc2V0dXAoKSBhbmQgc2h1dGRvd25fc29ja2V0KCkgYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBldmVudAotICAgIGhhbmRsZXIgd2hlbiBjYXJkIGluc2VydGlvbiBhbmQgcmVtb3ZhbCBldmVudHMgYXJlIHJlY2VpdmVkLgotICAgIHNvY2tldF9zZXR1cCgpIHR1cm5zIG9uIHNvY2tldCBwb3dlciBhbmQgcmVzZXRzIHRoZSBzb2NrZXQsIGluIHR3byBzdGFnZXMuCi0gICAgc2h1dGRvd25fc29ja2V0KCkgdW5jb25maWd1cmVzIGEgc29ja2V0IGFuZCB0dXJucyBvZmYgc29ja2V0IHBvd2VyLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQorLyoqCisgKiBzb2NrZXRfc2V0dXAoKSBhbmQgc2h1dGRvd25fc29ja2V0KCkgYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBldmVudAorICogaGFuZGxlciB3aGVuIGNhcmQgaW5zZXJ0aW9uIGFuZCByZW1vdmFsIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCisgKiBzb2NrZXRfc2V0dXAoKSB0dXJucyBvbiBzb2NrZXQgcG93ZXIgYW5kIHJlc2V0cyB0aGUgc29ja2V0LCBpbiB0d28gc3RhZ2VzLgorICogc2h1dGRvd25fc29ja2V0KCkgdW5jb25maWd1cmVzIGEgc29ja2V0IGFuZCB0dXJucyBvZmYgc29ja2V0IHBvd2VyLgorICovCiBzdGF0aWMgdm9pZCBzaHV0ZG93bl9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7Ci0gICAgY3NfZGJnKHMsIDEsICJzaHV0ZG93bl9zb2NrZXRcbiIpOworCWNzX2RiZyhzLCAxLCAic2h1dGRvd25fc29ja2V0XG4iKTsKIAotICAgIC8qIEJsYW5rIG91dCB0aGUgc29ja2V0IHN0YXRlICovCi0gICAgcy0+c29ja2V0ID0gZGVhZF9zb2NrZXQ7Ci0gICAgcy0+b3BzLT5pbml0KHMpOwotICAgIHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKLSAgICBzLT5pcnEuQXNzaWduZWRJUlEgPSBzLT5pcnEuQ29uZmlnID0gMDsKLSAgICBzLT5sb2NrX2NvdW50ID0gMDsKLSAgICBkZXN0cm95X2Npc19jYWNoZShzKTsKKwkvKiBCbGFuayBvdXQgdGhlIHNvY2tldCBzdGF0ZSAqLworCXMtPnNvY2tldCA9IGRlYWRfc29ja2V0OworCXMtPm9wcy0+aW5pdChzKTsKKwlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7CisJcy0+aXJxLkFzc2lnbmVkSVJRID0gcy0+aXJxLkNvbmZpZyA9IDA7CisJcy0+bG9ja19jb3VudCA9IDA7CisJZGVzdHJveV9jaXNfY2FjaGUocyk7CiAjaWZkZWYgQ09ORklHX0NBUkRCVVMKLSAgICBjYl9mcmVlKHMpOworCWNiX2ZyZWUocyk7CiAjZW5kaWYKLSAgICBzLT5mdW5jdGlvbnMgPSAwOwotICAgIGlmIChzLT5jb25maWcpIHsKLQlrZnJlZShzLT5jb25maWcpOwotCXMtPmNvbmZpZyA9IE5VTEw7Ci0gICAgfQotCi0gICAgewotCWludCBzdGF0dXM7Ci0Jcy0+b3BzLT5nZXRfc3RhdHVzKHMsICZzdGF0dXMpOwotCWlmIChzdGF0dXMgJiBTU19QT1dFUk9OKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENNQ0lBOiBzb2NrZXQgJXA6ICoqKiBEQU5HRVIgKioqIHVuYWJsZSB0byByZW1vdmUgc29ja2V0IHBvd2VyXG4iLCBzKTsKKwlzLT5mdW5jdGlvbnMgPSAwOworCWlmIChzLT5jb25maWcpIHsKKwkJa2ZyZWUocy0+Y29uZmlnKTsKKwkJcy0+Y29uZmlnID0gTlVMTDsKIAl9Ci0gICAgfQorCisJeworCQlpbnQgc3RhdHVzOworCQlzLT5vcHMtPmdldF9zdGF0dXMocywgJnN0YXR1cyk7CisJCWlmIChzdGF0dXMgJiBTU19QT1dFUk9OKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlBDTUNJQTogc29ja2V0ICVwOiAqKiogREFOR0VSICoqKiB1bmFibGUgdG8gcmVtb3ZlIHNvY2tldCBwb3dlclxuIiwgcyk7CisJCX0KKwl9CiB9IC8qIHNodXRkb3duX3NvY2tldCAqLwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgIFRoZSBjZW50cmFsIGV2ZW50IGhhbmRsZXIuICBTZW5kX2V2ZW50KCkgc2VuZHMgYW4gZXZlbnQgdG8gdGhlCi0gICAgMTYtYml0IHN1YnN5c3RlbSwgd2hpY2ggdGhlbiBjYWxscyB0aGUgcmVsZXZhbnQgZGV2aWNlIGRyaXZlcnMuCi0gICAgUGFyc2VfZXZlbnRzKCkgaW50ZXJwcmV0cyB0aGUgZXZlbnQgYml0cyBmcm9tCi0gICAgYSBjYXJkIHN0YXR1cyBjaGFuZ2UgcmVwb3J0LiAgRG9fc2h1dGRvd24oKSBoYW5kbGVzIHRoZSBoaWdoCi0gICAgcHJpb3JpdHkgc3R1ZmYgYXNzb2NpYXRlZCB3aXRoIGEgY2FyZCByZW1vdmFsLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KKy8qKgorICogVGhlIGNlbnRyYWwgZXZlbnQgaGFuZGxlci4gIFNlbmRfZXZlbnQoKSBzZW5kcyBhbiBldmVudCB0byB0aGUKKyAqIDE2LWJpdCBzdWJzeXN0ZW0sIHdoaWNoIHRoZW4gY2FsbHMgdGhlIHJlbGV2YW50IGRldmljZSBkcml2ZXJzLgorICogUGFyc2VfZXZlbnRzKCkgaW50ZXJwcmV0cyB0aGUgZXZlbnQgYml0cyBmcm9tCisgKiBhIGNhcmQgc3RhdHVzIGNoYW5nZSByZXBvcnQuICBEb19zaHV0ZG93bigpIGhhbmRsZXMgdGhlIGhpZ2gKKyAqIHByaW9yaXR5IHN0dWZmIGFzc29jaWF0ZWQgd2l0aCBhIGNhcmQgcmVtb3ZhbC4KKyAqLwogCiAvKiBOT1RFOiBzZW5kX2V2ZW50IG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIHNrdC0+c2VtIGhlbGQuICovCiAKQEAgLTQ5MCwxMSArNDU1LDExIEBACiAJfQogCiAJaWYgKHN0YXR1cyAmIFNTX0NBUkRCVVMpIHsKKwkJaWYgKCEoc2t0LT5mZWF0dXJlcyAmIFNTX0NBUF9DQVJEQlVTKSkgeworCQkJY3NfZXJyKHNrdCwgImNhcmRidXMgY2FyZHMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJCXJldHVybiBDU19CQURfVFlQRTsKKwkJfQogCQlza3QtPnN0YXRlIHw9IFNPQ0tFVF9DQVJEQlVTOwotI2lmbmRlZiBDT05GSUdfQ0FSREJVUwotCQljc19lcnIoc2t0LCAiY2FyZGJ1cyBjYXJkcyBhcmUgbm90IHN1cHBvcnRlZC5cbiIpOwotCQlyZXR1cm4gQ1NfQkFEX1RZUEU7Ci0jZW5kaWYKIAl9CiAKIAkvKgpAQCAtNzE4LDcgKzY4Myw3IEBACiAJCX0KIAogCQlzY2hlZHVsZSgpOwotCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAogCQlpZiAoIXNrdC0+dGhyZWFkKQogCQkJYnJlYWs7CkBAIC03NDYsNDIwICs3MTEsOSBAQAogCQl3YWtlX3VwKCZzLT50aHJlYWRfd2FpdCk7CiAJfQogfSAvKiBwY21jaWFfcGFyc2VfZXZlbnRzICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9wYXJzZV9ldmVudHMpOwogCiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgU3BlY2lhbCBzdHVmZiBmb3IgbWFuYWdpbmcgSU8gd2luZG93cywgYmVjYXVzZSB0aGV5IGFyZSBzY2FyY2UuCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotc3RhdGljIGludCBhbGxvY19pb19zcGFjZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdV9pbnQgYXR0ciwgaW9hZGRyX3QgKmJhc2UsCi0JCQkgIGlvYWRkcl90IG51bSwgdV9pbnQgbGluZXMpCi17Ci0gICAgaW50IGk7Ci0gICAga2lvX2FkZHJfdCB0cnksIGFsaWduOwotCi0gICAgYWxpZ24gPSAoKmJhc2UpID8gKGxpbmVzID8gMTw8bGluZXMgOiAwKSA6IDE7Ci0gICAgaWYgKGFsaWduICYmIChhbGlnbiA8IG51bSkpIHsKLQlpZiAoKmJhc2UpIHsKLQkgICAgY3NfZGJnKHMsIDAsICJvZGQgSU8gcmVxdWVzdDogbnVtICUjeCBhbGlnbiAlI2x4XG4iLAotCQkgICBudW0sIGFsaWduKTsKLQkgICAgYWxpZ24gPSAwOwotCX0gZWxzZQotCSAgICB3aGlsZSAoYWxpZ24gJiYgKGFsaWduIDwgbnVtKSkgYWxpZ24gPDw9IDE7Ci0gICAgfQotICAgIGlmICgqYmFzZSAmIH4oYWxpZ24tMSkpIHsKLQljc19kYmcocywgMCwgIm9kZCBJTyByZXF1ZXN0OiBiYXNlICUjeCBhbGlnbiAlI2x4XG4iLAotCSAgICAgICAqYmFzZSwgYWxpZ24pOwotCWFsaWduID0gMDsKLSAgICB9Ci0gICAgaWYgKChzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSAmJiBzLT5pb19vZmZzZXQpIHsKLQkqYmFzZSA9IHMtPmlvX29mZnNldCB8ICgqYmFzZSAmIDB4MGZmZik7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIC8qIENoZWNrIGZvciBhbiBhbHJlYWR5LWFsbG9jYXRlZCB3aW5kb3cgdGhhdCBtdXN0IGNvbmZsaWN0IHdpdGgKLSAgICAgICB3aGF0IHdhcyBhc2tlZCBmb3IuICBJdCBpcyBhIGhhY2sgYmVjYXVzZSBpdCBkb2VzIG5vdCBjYXRjaCBhbGwKLSAgICAgICBwb3RlbnRpYWwgY29uZmxpY3RzLCBqdXN0IHRoZSBtb3N0IG9idmlvdXMgb25lcy4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKQotCWlmICgocy0+aW9baV0uTnVtUG9ydHMgIT0gMCkgJiYKLQkgICAgKChzLT5pb1tpXS5CYXNlUG9ydCAmIChhbGlnbi0xKSkgPT0gKmJhc2UpKQotCSAgICByZXR1cm4gMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7Ci0JaWYgKHMtPmlvW2ldLk51bVBvcnRzID09IDApIHsKLQkgICAgcy0+aW9baV0ucmVzID0gZmluZF9pb19yZWdpb24oKmJhc2UsIG51bSwgYWxpZ24sIHMpOwotCSAgICBpZiAocy0+aW9baV0ucmVzKSB7Ci0JCXMtPmlvW2ldLkF0dHJpYnV0ZXMgPSBhdHRyOwotCQlzLT5pb1tpXS5CYXNlUG9ydCA9ICpiYXNlID0gcy0+aW9baV0ucmVzLT5zdGFydDsKLQkJcy0+aW9baV0uTnVtUG9ydHMgPSBzLT5pb1tpXS5JblVzZSA9IG51bTsKLQkJYnJlYWs7Ci0JICAgIH0gZWxzZQotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKHMtPmlvW2ldLkF0dHJpYnV0ZXMgIT0gYXR0cikKLQkgICAgY29udGludWU7Ci0JLyogVHJ5IHRvIGV4dGVuZCB0b3Agb2Ygd2luZG93ICovCi0JdHJ5ID0gcy0+aW9baV0uQmFzZVBvcnQgKyBzLT5pb1tpXS5OdW1Qb3J0czsKLQlpZiAoKCpiYXNlID09IDApIHx8ICgqYmFzZSA9PSB0cnkpKQotCSAgICBpZiAoYWRqdXN0X2lvX3JlZ2lvbihzLT5pb1tpXS5yZXMsIHMtPmlvW2ldLnJlcy0+c3RhcnQsCi0JCQkJIHMtPmlvW2ldLnJlcy0+ZW5kICsgbnVtLCBzKSA9PSAwKSB7Ci0JCSpiYXNlID0gdHJ5OwotCQlzLT5pb1tpXS5OdW1Qb3J0cyArPSBudW07Ci0JCXMtPmlvW2ldLkluVXNlICs9IG51bTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkvKiBUcnkgdG8gZXh0ZW5kIGJvdHRvbSBvZiB3aW5kb3cgKi8KLQl0cnkgPSBzLT5pb1tpXS5CYXNlUG9ydCAtIG51bTsKLQlpZiAoKCpiYXNlID09IDApIHx8ICgqYmFzZSA9PSB0cnkpKQotCSAgICBpZiAoYWRqdXN0X2lvX3JlZ2lvbihzLT5pb1tpXS5yZXMsIHMtPmlvW2ldLnJlcy0+c3RhcnQgLSBudW0sCi0JCQkJIHMtPmlvW2ldLnJlcy0+ZW5kLCBzKSA9PSAwKSB7Ci0JCXMtPmlvW2ldLkJhc2VQb3J0ID0gKmJhc2UgPSB0cnk7Ci0JCXMtPmlvW2ldLk51bVBvcnRzICs9IG51bTsKLQkJcy0+aW9baV0uSW5Vc2UgKz0gbnVtOwotCQlicmVhazsKLQkgICAgfQotICAgIH0KLSAgICByZXR1cm4gKGkgPT0gTUFYX0lPX1dJTik7Ci19IC8qIGFsbG9jX2lvX3NwYWNlICovCi0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfaW9fc3BhY2Uoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGlvYWRkcl90IGJhc2UsCi0JCQkgICAgIGlvYWRkcl90IG51bSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspIHsKLQlpZiAoKHMtPmlvW2ldLkJhc2VQb3J0IDw9IGJhc2UpICYmCi0JICAgIChzLT5pb1tpXS5CYXNlUG9ydCtzLT5pb1tpXS5OdW1Qb3J0cyA+PSBiYXNlK251bSkpIHsKLQkgICAgcy0+aW9baV0uSW5Vc2UgLT0gbnVtOwotCSAgICAvKiBGcmVlIHRoZSB3aW5kb3cgaWYgbm8gb25lIGVsc2UgaXMgdXNpbmcgaXQgKi8KLQkgICAgaWYgKHMtPmlvW2ldLkluVXNlID09IDApIHsKLQkJcy0+aW9baV0uTnVtUG9ydHMgPSAwOwotCQlyZWxlYXNlX3Jlc291cmNlKHMtPmlvW2ldLnJlcyk7Ci0JCWtmcmVlKHMtPmlvW2ldLnJlcyk7Ci0JCXMtPmlvW2ldLnJlcyA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIEFjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKCkgcmVhZHMgYW5kIHdyaXRlcyBjb25maWd1cmF0aW9uCi0gICAgcmVnaXN0ZXJzIGluIGF0dHJpYnV0ZSBtZW1vcnkuICBNZW1vcnkgd2luZG93IDAgaXMgcmVzZXJ2ZWQgZm9yCi0gICAgdGhpcyBhbmQgdGhlIHR1cGxlIHJlYWRpbmcgc2VydmljZXMuCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcihzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywKLQkJCQkJIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKLQkJCQkJIGNvbmZfcmVnX3QgKnJlZykKLXsKLSAgICBjb25maWdfdCAqYzsKLSAgICBpbnQgYWRkcjsKLSAgICB1X2NoYXIgdmFsOwotCi0gICAgaWYgKCFzIHx8ICFzLT5jb25maWcpCi0JcmV0dXJuIENTX05PX0NBUkQ7ICAgIAotCi0gICAgYyA9ICZzLT5jb25maWdbZnVuY3Rpb25dOwotCi0gICAgaWYgKGMgPT0gTlVMTCkKLQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLQotICAgIGlmICghKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpCi0JcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwotCi0gICAgYWRkciA9IChjLT5Db25maWdCYXNlICsgcmVnLT5PZmZzZXQpID4+IDE7Ci0gICAgCi0gICAgc3dpdGNoIChyZWctPkFjdGlvbikgewotICAgIGNhc2UgQ1NfUkVBRDoKLQlyZWFkX2Npc19tZW0ocywgMSwgYWRkciwgMSwgJnZhbCk7Ci0JcmVnLT5WYWx1ZSA9IHZhbDsKLQlicmVhazsKLSAgICBjYXNlIENTX1dSSVRFOgotCXZhbCA9IHJlZy0+VmFsdWU7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCBhZGRyLCAxLCAmdmFsKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCXJldHVybiBDU19CQURfQVJHUzsKLQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIGFjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyICovCi1FWFBPUlRfU1lNQk9MKHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcik7Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywKLQkJCQkgIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKLQkJCQkgIGNvbmZpZ19pbmZvX3QgKmNvbmZpZykKLXsKLSAgICBjb25maWdfdCAqYzsKLSAgICAKLSAgICBpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLQotICAgIGNvbmZpZy0+RnVuY3Rpb24gPSBmdW5jdGlvbjsKLQotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0gICAgaWYgKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpIHsKLQltZW1zZXQoY29uZmlnLCAwLCBzaXplb2YoY29uZmlnX2luZm9fdCkpOwotCWNvbmZpZy0+VmNjID0gcy0+c29ja2V0LlZjYzsKLQljb25maWctPlZwcDEgPSBjb25maWctPlZwcDIgPSBzLT5zb2NrZXQuVnBwOwotCWNvbmZpZy0+T3B0aW9uID0gcy0+Y2JfZGV2LT5zdWJvcmRpbmF0ZS0+bnVtYmVyOwotCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTX0NPTkZJRykgewotCSAgICBjb25maWctPkF0dHJpYnV0ZXMgPSBDT05GX1ZBTElEX0NMSUVOVDsKLQkgICAgY29uZmlnLT5JbnRUeXBlID0gSU5UX0NBUkRCVVM7Ci0JICAgIGNvbmZpZy0+QXNzaWduZWRJUlEgPSBzLT5pcnEuQXNzaWduZWRJUlE7Ci0JICAgIGlmIChjb25maWctPkFzc2lnbmVkSVJRKQotCQljb25maWctPkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCSAgICBjb25maWctPkJhc2VQb3J0MSA9IHMtPmlvWzBdLkJhc2VQb3J0OwotCSAgICBjb25maWctPk51bVBvcnRzMSA9IHMtPmlvWzBdLk51bVBvcnRzOwotCX0KLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICBjID0gKHMtPmNvbmZpZyAhPSBOVUxMKSA/ICZzLT5jb25maWdbZnVuY3Rpb25dIDogTlVMTDsKLSAgICAKLSAgICBpZiAoKGMgPT0gTlVMTCkgfHwgIShjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpKSB7Ci0JY29uZmlnLT5BdHRyaWJ1dGVzID0gMDsKLQljb25maWctPlZjYyA9IHMtPnNvY2tldC5WY2M7Ci0JY29uZmlnLT5WcHAxID0gY29uZmlnLT5WcHAyID0gcy0+c29ja2V0LlZwcDsKLQlyZXR1cm4gQ1NfU1VDQ0VTUzsKLSAgICB9Ci0gICAgCi0gICAgLyogISEhIFRoaXMgaXMgYSBoYWNrICEhISAqLwotICAgIG1lbWNweSgmY29uZmlnLT5BdHRyaWJ1dGVzLCAmYy0+QXR0cmlidXRlcywgc2l6ZW9mKGNvbmZpZ190KSk7Ci0gICAgY29uZmlnLT5BdHRyaWJ1dGVzIHw9IENPTkZfVkFMSURfQ0xJRU5UOwotICAgIGNvbmZpZy0+Q2FyZFZhbHVlcyA9IGMtPkNhcmRWYWx1ZXM7Ci0gICAgY29uZmlnLT5JUlFBdHRyaWJ1dGVzID0gYy0+aXJxLkF0dHJpYnV0ZXM7Ci0gICAgY29uZmlnLT5Bc3NpZ25lZElSUSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKLSAgICBjb25maWctPkJhc2VQb3J0MSA9IGMtPmlvLkJhc2VQb3J0MTsKLSAgICBjb25maWctPk51bVBvcnRzMSA9IGMtPmlvLk51bVBvcnRzMTsKLSAgICBjb25maWctPkF0dHJpYnV0ZXMxID0gYy0+aW8uQXR0cmlidXRlczE7Ci0gICAgY29uZmlnLT5CYXNlUG9ydDIgPSBjLT5pby5CYXNlUG9ydDI7Ci0gICAgY29uZmlnLT5OdW1Qb3J0czIgPSBjLT5pby5OdW1Qb3J0czI7Ci0gICAgY29uZmlnLT5BdHRyaWJ1dGVzMiA9IGMtPmlvLkF0dHJpYnV0ZXMyOwotICAgIGNvbmZpZy0+SU9BZGRyTGluZXMgPSBjLT5pby5JT0FkZHJMaW5lczsKLSAgICAKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyAqLwotRVhQT1JUX1NZTUJPTChwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdmVyc2lvbiBvZiBDYXJkIFNlcnZpY2VzLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY21jaWFfZ2V0X2NhcmRfc2VydmljZXNfaW5mbyhzZXJ2aW5mb190ICppbmZvKQotewotICAgIHVuc2lnbmVkIGludCBzb2NrZXRfY291bnQgPSAwOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLSAgICBpbmZvLT5TaWduYXR1cmVbMF0gPSAnQyc7Ci0gICAgaW5mby0+U2lnbmF0dXJlWzFdID0gJ1MnOwotICAgIGRvd25fcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKLSAgICBsaXN0X2Zvcl9lYWNoKHRtcCwgJnBjbWNpYV9zb2NrZXRfbGlzdCkKLQkgICAgc29ja2V0X2NvdW50Kys7Ci0gICAgdXBfcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKLSAgICBpbmZvLT5Db3VudCA9IHNvY2tldF9jb3VudDsKLSAgICBpbmZvLT5SZXZpc2lvbiA9IENTX1JFTEVBU0VfQ09ERTsKLSAgICBpbmZvLT5DU0xldmVsID0gMHgwMjEwOwotICAgIGluZm8tPlZlbmRvclN0cmluZyA9IChjaGFyICopcmVsZWFzZTsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogZ2V0X2NhcmRfc2VydmljZXNfaW5mbyAqLwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX2dldF93aW5kb3coc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHdpbmRvd19oYW5kbGVfdCAqaGFuZGxlLCBpbnQgaWR4LCB3aW5fcmVxX3QgKnJlcSkKLXsKLSAgICB3aW5kb3dfdCAqd2luOwotICAgIGludCB3OwotCi0gICAgaWYgKCFzIHx8ICEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JcmV0dXJuIENTX05PX0NBUkQ7Ci0gICAgZm9yICh3ID0gaWR4OyB3IDwgTUFYX1dJTjsgdysrKQotCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9XSU5fUkVRKHcpKSBicmVhazsKLSAgICBpZiAodyA9PSBNQVhfV0lOKQotCXJldHVybiBDU19OT19NT1JFX0lURU1TOwotICAgIHdpbiA9ICZzLT53aW5bd107Ci0gICAgcmVxLT5CYXNlID0gd2luLT5jdGwucmVzLT5zdGFydDsKLSAgICByZXEtPlNpemUgPSB3aW4tPmN0bC5yZXMtPmVuZCAtIHdpbi0+Y3RsLnJlcy0+c3RhcnQgKyAxOwotICAgIHJlcS0+QWNjZXNzU3BlZWQgPSB3aW4tPmN0bC5zcGVlZDsKLSAgICByZXEtPkF0dHJpYnV0ZXMgPSAwOwotICAgIGlmICh3aW4tPmN0bC5mbGFncyAmIE1BUF9BVFRSSUIpCi0JcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9NRU1PUllfVFlQRV9BTTsKLSAgICBpZiAod2luLT5jdGwuZmxhZ3MgJiBNQVBfQUNUSVZFKQotCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fRU5BQkxFOwotICAgIGlmICh3aW4tPmN0bC5mbGFncyAmIE1BUF8xNkJJVCkKLQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0RBVEFfV0lEVEhfMTY7Ci0gICAgaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQX1VTRV9XQUlUKQotCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fVVNFX1dBSVQ7Ci0gICAgKmhhbmRsZSA9IHdpbjsKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogZ2V0X3dpbmRvdyAqLwotRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3dpbmRvdyk7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSZXR1cm4gdGhlIFBDSSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGEgY2FyZC4uCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQotc3RydWN0IHBjaV9idXMgKnBjbWNpYV9sb29rdXBfYnVzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQotewotCWlmICghcyB8fCAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBzLT5jYl9kZXYtPnN1Ym9yZGluYXRlOwotfQotCi1FWFBPUlRfU1lNQk9MKHBjbWNpYV9sb29rdXBfYnVzKTsKLQotI2VuZGlmCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgR2V0IHRoZSBjdXJyZW50IHNvY2tldCBzdGF0ZSBiaXRzLiAgV2UgZG9uJ3Qgc3VwcG9ydCB0aGUgbGF0Y2hlZAotICAgIFNvY2tldFN0YXRlIHlldDogSSBoYXZlbid0IHNlZW4gYW55IHBvaW50IGZvciBpdC4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNjYXJkX2dldF9zdGF0dXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwgY3Nfc3RhdHVzX3QgKnN0YXR1cykKLXsKLSAgICBjb25maWdfdCAqYzsKLSAgICBpbnQgdmFsOwotICAgIAotICAgIHMtPm9wcy0+Z2V0X3N0YXR1cyhzLCAmdmFsKTsKLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSA9IHN0YXR1cy0+U29ja2V0U3RhdGUgPSAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU19ERVRFQ1QpID8gQ1NfRVZFTlRfQ0FSRF9ERVRFQ1QgOiAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU19DQVJEQlVTKSA/IENTX0VWRU5UX0NCX0RFVEVDVCA6IDA7Ci0gICAgc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTXzNWQ0FSRCkgPyBDU19FVkVOVF8zVkNBUkQgOiAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9ICh2YWwgJiBTU19YVkNBUkQpID8gQ1NfRVZFTlRfWFZDQVJEIDogMDsKLSAgICBpZiAocy0+c3RhdGUgJiBTT0NLRVRfU1VTUEVORCkKLQlzdGF0dXMtPkNhcmRTdGF0ZSB8PSBDU19FVkVOVF9QTV9TVVNQRU5EOwotICAgIGlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCXJldHVybiBDU19OT19DQVJEOwotICAgIAotICAgIGMgPSAocy0+Y29uZmlnICE9IE5VTEwpID8gJnMtPmNvbmZpZ1tmdW5jdGlvbl0gOiBOVUxMOwotICAgIGlmICgoYyAhPSBOVUxMKSAmJiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKSAmJgotCShjLT5JbnRUeXBlICYgKElOVF9NRU1PUllfQU5EX0lPIHwgSU5UX1pPT01FRF9WSURFTykpKSB7Ci0JdV9jaGFyIHJlZzsKLQlpZiAoYy0+UHJlc2VudCAmIFBSRVNFTlRfUElOX1JFUExBQ0UpIHsKLQkgICAgcmVhZF9jaXNfbWVtKHMsIDEsIChjLT5Db25maWdCYXNlK0NJU1JFR19QUlIpPj4xLCAxLCAmcmVnKTsKLQkgICAgc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJKHJlZyAmIFBSUl9XUF9TVEFUVVMpID8gQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCA6IDA7Ci0JICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCShyZWcgJiBQUlJfUkVBRFlfU1RBVFVTKSA/IENTX0VWRU5UX1JFQURZX0NIQU5HRSA6IDA7Ci0JICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JCShyZWcgJiBQUlJfQlZEMl9TVEFUVVMpID8gQ1NfRVZFTlRfQkFUVEVSWV9MT1cgOiAwOwotCSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCQkocmVnICYgUFJSX0JWRDFfU1RBVFVTKSA/IENTX0VWRU5UX0JBVFRFUllfREVBRCA6IDA7Ci0JfSBlbHNlIHsKLQkgICAgLyogTm8gUFJSPyAgVGhlbiBhc3N1bWUgd2UncmUgYWx3YXlzIHJlYWR5ICovCi0JICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9IENTX0VWRU5UX1JFQURZX0NIQU5HRTsKLQl9Ci0JaWYgKGMtPlByZXNlbnQgJiBQUkVTRU5UX0VYVF9TVEFUVVMpIHsKLQkgICAgcmVhZF9jaXNfbWVtKHMsIDEsIChjLT5Db25maWdCYXNlK0NJU1JFR19FU1IpPj4xLCAxLCAmcmVnKTsKLQkgICAgc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkJKHJlZyAmIEVTUl9SRVFfQVRUTikgPyBDU19FVkVOVF9SRVFVRVNUX0FUVEVOVElPTiA6IDA7Ci0JfQotCXJldHVybiBDU19TVUNDRVNTOwotICAgIH0KLSAgICBzdGF0dXMtPkNhcmRTdGF0ZSB8PQotCSh2YWwgJiBTU19XUlBST1QpID8gQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCA6IDA7Ci0gICAgc3RhdHVzLT5DYXJkU3RhdGUgfD0KLQkodmFsICYgU1NfQkFUREVBRCkgPyBDU19FVkVOVF9CQVRURVJZX0RFQUQgOiAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JKHZhbCAmIFNTX0JBVFdBUk4pID8gQ1NfRVZFTlRfQkFUVEVSWV9MT1cgOiAwOwotICAgIHN0YXR1cy0+Q2FyZFN0YXRlIHw9Ci0JKHZhbCAmIFNTX1JFQURZKSA/IENTX0VWRU5UX1JFQURZX0NIQU5HRSA6IDA7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIGdldF9zdGF0dXMgKi8KLUVYUE9SVF9TWU1CT0wocGNjYXJkX2dldF9zdGF0dXMpOwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIENoYW5nZSB0aGUgY2FyZCBhZGRyZXNzIG9mIGFuIGFscmVhZHkgb3BlbiBtZW1vcnkgd2luZG93LgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY21jaWFfZ2V0X21lbV9wYWdlKHdpbmRvd19oYW5kbGVfdCB3aW4sIG1lbXJlcV90ICpyZXEpCi17Ci0gICAgaWYgKCh3aW4gPT0gTlVMTCkgfHwgKHdpbi0+bWFnaWMgIT0gV0lORE9XX01BR0lDKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICByZXEtPlBhZ2UgPSAwOwotICAgIHJlcS0+Q2FyZE9mZnNldCA9IHdpbi0+Y3RsLmNhcmRfc3RhcnQ7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIGdldF9tZW1fcGFnZSAqLwotCi1pbnQgcGNtY2lhX21hcF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKQotewotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIGlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0gICAgaWYgKHJlcS0+UGFnZSAhPSAwKQotCXJldHVybiBDU19CQURfUEFHRTsKLSAgICBzID0gd2luLT5zb2NrOwotICAgIHdpbi0+Y3RsLmNhcmRfc3RhcnQgPSByZXEtPkNhcmRPZmZzZXQ7Ci0gICAgaWYgKHMtPm9wcy0+c2V0X21lbV9tYXAocywgJndpbi0+Y3RsKSAhPSAwKQotCXJldHVybiBDU19CQURfT0ZGU0VUOwotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiBtYXBfbWVtX3BhZ2UgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBNb2RpZnkgYSBsb2NrZWQgc29ja2V0IGNvbmZpZ3VyYXRpb24KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsCi0JCQkJbW9kY29uZl90ICptb2QpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgY29uZmlnX3QgKmM7Ci0gICAgCi0gICAgaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIHMgPSBTT0NLRVQoaGFuZGxlKTsgYyA9IENPTkZJRyhoYW5kbGUpOwotICAgIGlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCXJldHVybiBDU19OT19DQVJEOwotICAgIGlmICghKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpCi0JcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwotICAgIAotICAgIGlmIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX0lSUV9DSEFOR0VfVkFMSUQpIHsKLQlpZiAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7Ci0JICAgIGMtPkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROwotCSAgICBzLT5zb2NrZXQuaW9faXJxID0gcy0+aXJxLkFzc2lnbmVkSVJROwotCX0gZWxzZSB7Ci0JICAgIGMtPkF0dHJpYnV0ZXMgJj0gfkNPTkZfRU5BQkxFX0lSUTsKLQkgICAgcy0+c29ja2V0LmlvX2lycSA9IDA7Ci0JfQotCXMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WQ0NfQ0hBTkdFX1ZBTElEKQotCXJldHVybiBDU19CQURfVkNDOwotCi0gICAgLyogV2Ugb25seSBhbGxvdyBjaGFuZ2luZyBWcHAxIGFuZCBWcHAyIHRvIHRoZSBzYW1lIHZhbHVlICovCi0gICAgaWYgKChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDFfQ0hBTkdFX1ZBTElEKSAmJgotCShtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDJfQ0hBTkdFX1ZBTElEKSkgewotCWlmIChtb2QtPlZwcDEgIT0gbW9kLT5WcHAyKQotCSAgICByZXR1cm4gQ1NfQkFEX1ZQUDsKLQljLT5WcHAxID0gYy0+VnBwMiA9IHMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7Ci0JaWYgKHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KSkKLQkgICAgcmV0dXJuIENTX0JBRF9WUFA7Ci0gICAgfSBlbHNlIGlmICgobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAxX0NIQU5HRV9WQUxJRCkgfHwKLQkgICAgICAgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMl9DSEFOR0VfVkFMSUQpKQotCXJldHVybiBDU19CQURfVlBQOwotCi0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIG1vZGlmeV9jb25maWd1cmF0aW9uICovCi0KIC8qIHJlZ2lzdGVyIHBjbWNpYV9jYWxsYmFjayAqLwogaW50IHBjY2FyZF9yZWdpc3Rlcl9wY21jaWEoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHN0cnVjdCBwY21jaWFfY2FsbGJhY2sgKmMpCiB7CkBAIC0xMTg4LDU0MyArNzQyLDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjY2FyZF9yZWdpc3Rlcl9wY21jaWEpOwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotaW50IHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBwY2NhcmRfaW9fbWFwIGlvID0geyAwLCAwLCAwLCAwLCAxIH07Ci0gICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0gICAgaW50IGk7Ci0gICAgCi0gICAgaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpIHx8Ci0JIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX0NPTkZJR19MT0NLRUQpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIGhhbmRsZS0+c3RhdGUgJj0gfkNMSUVOVF9DT05GSUdfTE9DS0VEOwotICAgIHMgPSBTT0NLRVQoaGFuZGxlKTsKLSAgICAKLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotICAgIGlmIChoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX0NBUkRCVVMpCi0JcmV0dXJuIENTX1NVQ0NFU1M7Ci0jZW5kaWYKLSAgICAKLSAgICBpZiAoIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgewotCWNvbmZpZ190ICpjID0gQ09ORklHKGhhbmRsZSk7Ci0JaWYgKC0tKHMtPmxvY2tfY291bnQpID09IDApIHsKLQkgICAgcy0+c29ja2V0LmZsYWdzID0gU1NfT1VUUFVUX0VOQTsgICAvKiBJcyB0aGlzIGNvcnJlY3Q/ICovCi0JICAgIHMtPnNvY2tldC5WcHAgPSAwOwotCSAgICBzLT5zb2NrZXQuaW9faXJxID0gMDsKLQkgICAgcy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpOwotCX0KLQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKQotCSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7Ci0JCWlmIChzLT5pb1tpXS5OdW1Qb3J0cyA9PSAwKQotCQkgICAgY29udGludWU7Ci0JCXMtPmlvW2ldLkNvbmZpZy0tOwotCQlpZiAocy0+aW9baV0uQ29uZmlnICE9IDApCi0JCSAgICBjb250aW51ZTsKLQkJaW8ubWFwID0gaTsKLQkJcy0+b3BzLT5zZXRfaW9fbWFwKHMsICZpbyk7Ci0JICAgIH0KLQljLT5zdGF0ZSAmPSB+Q09ORklHX0xPQ0tFRDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIHJlbGVhc2VfY29uZmlndXJhdGlvbiAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFJlbGVhc2VfaW8oKSByZWxlYXNlcyB0aGUgSS9PIHJhbmdlcyBhbGxvY2F0ZWQgYnkgYSBjbGllbnQuICBUaGlzCi0gICAgbWF5IGJlIGludm9rZWQgc29tZSB0aW1lIGFmdGVyIGEgY2FyZCBlamVjdGlvbiBoYXMgYWxyZWFkeSBkdW1wZWQKLSAgICB0aGUgYWN0dWFsIHNvY2tldCBjb25maWd1cmF0aW9uLCBzbyBpZiB0aGUgY2xpZW50IGlzICJzdGFsZSIsIHdlCi0gICAgZG9uJ3QgYm90aGVyIGNoZWNraW5nIHRoZSBwb3J0IHJhbmdlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IHNvY2tldAotICAgIHZhbHVlcy4KLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX3JlbGVhc2VfaW8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW9fcmVxX3QgKnJlcSkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICAKLSAgICBpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkgfHwgIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX0lPX1JFUSkpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0gICAgaGFuZGxlLT5zdGF0ZSAmPSB+Q0xJRU5UX0lPX1JFUTsKLSAgICBzID0gU09DS0VUKGhhbmRsZSk7Ci0gICAgCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLSAgICBpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKQotCXJldHVybiBDU19TVUNDRVNTOwotI2VuZGlmCi0gICAgCi0gICAgaWYgKCEoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9TVEFMRSkpIHsKLQljb25maWdfdCAqYyA9IENPTkZJRyhoYW5kbGUpOwotCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCi0JICAgIHJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQlpZiAoKGMtPmlvLkJhc2VQb3J0MSAhPSByZXEtPkJhc2VQb3J0MSkgfHwKLQkgICAgKGMtPmlvLk51bVBvcnRzMSAhPSByZXEtPk51bVBvcnRzMSkgfHwKLQkgICAgKGMtPmlvLkJhc2VQb3J0MiAhPSByZXEtPkJhc2VQb3J0MikgfHwKLQkgICAgKGMtPmlvLk51bVBvcnRzMiAhPSByZXEtPk51bVBvcnRzMikpCi0JICAgIHJldHVybiBDU19CQURfQVJHUzsKLQljLT5zdGF0ZSAmPSB+Q09ORklHX0lPX1JFUTsKLSAgICB9Ci0KLSAgICByZWxlYXNlX2lvX3NwYWNlKHMsIHJlcS0+QmFzZVBvcnQxLCByZXEtPk51bVBvcnRzMSk7Ci0gICAgaWYgKHJlcS0+TnVtUG9ydHMyKQotCXJlbGVhc2VfaW9fc3BhY2UocywgcmVxLT5CYXNlUG9ydDIsIHJlcS0+TnVtUG9ydHMyKTsKLSAgICAKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogcmVsZWFzZV9pbyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9yZWxlYXNlX2lycShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpcnFfcmVxX3QgKnJlcSkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICBpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkgfHwgIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX0lSUV9SRVEpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIGhhbmRsZS0+c3RhdGUgJj0gfkNMSUVOVF9JUlFfUkVROwotICAgIHMgPSBTT0NLRVQoaGFuZGxlKTsKLSAgICAKLSAgICBpZiAoIShoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgewotCWNvbmZpZ190ICpjID0gQ09ORklHKGhhbmRsZSk7Ci0JaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKLQkgICAgcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwotCWlmIChjLT5pcnEuQXR0cmlidXRlcyAhPSByZXEtPkF0dHJpYnV0ZXMpCi0JICAgIHJldHVybiBDU19CQURfQVRUUklCVVRFOwotCWlmIChzLT5pcnEuQXNzaWduZWRJUlEgIT0gcmVxLT5Bc3NpZ25lZElSUSkKLQkgICAgcmV0dXJuIENTX0JBRF9JUlE7Ci0JaWYgKC0tcy0+aXJxLkNvbmZpZyA9PSAwKSB7Ci0JICAgIGMtPnN0YXRlICY9IH5DT05GSUdfSVJRX1JFUTsKLQkgICAgcy0+aXJxLkFzc2lnbmVkSVJRID0gMDsKLQl9Ci0gICAgfQotICAgIAotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpIHsKLQlmcmVlX2lycShyZXEtPkFzc2lnbmVkSVJRLCByZXEtPkluc3RhbmNlKTsKLSAgICB9Ci0KLSNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCi0gICAgcGNtY2lhX3VzZWRfaXJxW3JlcS0+QXNzaWduZWRJUlFdLS07Ci0jZW5kaWYKLQotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiBjc19yZWxlYXNlX2lycSAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyh3aW5kb3dfaGFuZGxlX3Qgd2luKQotewotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIAotICAgIGlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0gICAgcyA9IHdpbi0+c29jazsKLSAgICBpZiAoISh3aW4tPmhhbmRsZS0+c3RhdGUgJiBDTElFTlRfV0lOX1JFUSh3aW4tPmluZGV4KSkpCi0JcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0KLSAgICAvKiBTaHV0IGRvd24gbWVtb3J5IHdpbmRvdyAqLwotICAgIHdpbi0+Y3RsLmZsYWdzICY9IH5NQVBfQUNUSVZFOwotICAgIHMtPm9wcy0+c2V0X21lbV9tYXAocywgJndpbi0+Y3RsKTsKLSAgICBzLT5zdGF0ZSAmPSB+U09DS0VUX1dJTl9SRVEod2luLT5pbmRleCk7Ci0KLSAgICAvKiBSZWxlYXNlIHN5c3RlbSBtZW1vcnkgKi8KLSAgICBpZiAod2luLT5jdGwucmVzKSB7Ci0JcmVsZWFzZV9yZXNvdXJjZSh3aW4tPmN0bC5yZXMpOwotCWtmcmVlKHdpbi0+Y3RsLnJlcyk7Ci0Jd2luLT5jdGwucmVzID0gTlVMTDsKLSAgICB9Ci0gICAgd2luLT5oYW5kbGUtPnN0YXRlICY9IH5DTElFTlRfV0lOX1JFUSh3aW4tPmluZGV4KTsKLQotICAgIHdpbi0+bWFnaWMgPSAwOwotICAgIAotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiByZWxlYXNlX3dpbmRvdyAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwKLQkJCQkgY29uZmlnX3JlcV90ICpyZXEpCi17Ci0gICAgaW50IGk7Ci0gICAgdV9pbnQgYmFzZTsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICBjb25maWdfdCAqYzsKLSAgICBwY2NhcmRfaW9fbWFwIGlvbWFwOwotICAgIAotICAgIGlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICBzID0gU09DS0VUKGhhbmRsZSk7Ci0gICAgaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JcmV0dXJuIENTX05PX0NBUkQ7Ci0gICAgCi0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLSAgICBpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKQotCXJldHVybiBDU19VTlNVUFBPUlRFRF9NT0RFOwotI2VuZGlmCi0gICAgCi0gICAgaWYgKHJlcS0+SW50VHlwZSAmIElOVF9DQVJEQlVTKQotCXJldHVybiBDU19VTlNVUFBPUlRFRF9NT0RFOwotICAgIGMgPSBDT05GSUcoaGFuZGxlKTsKLSAgICBpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQotCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLQotICAgIC8qIERvIHBvd2VyIGNvbnRyb2wuICBXZSBkb24ndCBhbGxvdyBjaGFuZ2VzIGluIFZjYy4gKi8KLSAgICBpZiAocy0+c29ja2V0LlZjYyAhPSByZXEtPlZjYykKLQlyZXR1cm4gQ1NfQkFEX1ZDQzsKLSAgICBpZiAocmVxLT5WcHAxICE9IHJlcS0+VnBwMikKLQlyZXR1cm4gQ1NfQkFEX1ZQUDsKLSAgICBzLT5zb2NrZXQuVnBwID0gcmVxLT5WcHAxOwotICAgIGlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCi0JcmV0dXJuIENTX0JBRF9WUFA7Ci0gICAgCi0gICAgYy0+VmNjID0gcmVxLT5WY2M7IGMtPlZwcDEgPSBjLT5WcHAyID0gcmVxLT5WcHAxOwotICAgIAotICAgIC8qIFBpY2sgbWVtb3J5IG9yIEkvTyBjYXJkLCBETUEgbW9kZSwgaW50ZXJydXB0ICovCi0gICAgYy0+SW50VHlwZSA9IHJlcS0+SW50VHlwZTsKLSAgICBjLT5BdHRyaWJ1dGVzID0gcmVxLT5BdHRyaWJ1dGVzOwotICAgIGlmIChyZXEtPkludFR5cGUgJiBJTlRfTUVNT1JZX0FORF9JTykKLQlzLT5zb2NrZXQuZmxhZ3MgfD0gU1NfSU9DQVJEOwotICAgIGlmIChyZXEtPkludFR5cGUgJiBJTlRfWk9PTUVEX1ZJREVPKQotCXMtPnNvY2tldC5mbGFncyB8PSBTU19aVkNBUkQgfCBTU19JT0NBUkQ7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0RNQSkKLQlzLT5zb2NrZXQuZmxhZ3MgfD0gU1NfRE1BX01PREU7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX1NQS1IpCi0Jcy0+c29ja2V0LmZsYWdzIHw9IFNTX1NQS1JfRU5BOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9JUlEpCi0Jcy0+c29ja2V0LmlvX2lycSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKLSAgICBlbHNlCi0Jcy0+c29ja2V0LmlvX2lycSA9IDA7Ci0gICAgcy0+b3BzLT5zZXRfc29ja2V0KHMsICZzLT5zb2NrZXQpOwotICAgIHMtPmxvY2tfY291bnQrKzsKLSAgICAKLSAgICAvKiBTZXQgdXAgQ0lTIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCi0gICAgYmFzZSA9IGMtPkNvbmZpZ0Jhc2UgPSByZXEtPkNvbmZpZ0Jhc2U7Ci0gICAgYy0+UHJlc2VudCA9IGMtPkNhcmRWYWx1ZXMgPSByZXEtPlByZXNlbnQ7Ci0gICAgaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfQ09QWSkgewotCWMtPkNvcHkgPSByZXEtPkNvcHk7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19TQ1IpPj4xLCAxLCAmYy0+Q29weSk7Ci0gICAgfQotICAgIGlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX09QVElPTikgewotCWlmIChzLT5mdW5jdGlvbnMgPT0gMSkgewotCSAgICBjLT5PcHRpb24gPSByZXEtPkNvbmZpZ0luZGV4ICYgQ09SX0NPTkZJR19NQVNLOwotCX0gZWxzZSB7Ci0JICAgIGMtPk9wdGlvbiA9IHJlcS0+Q29uZmlnSW5kZXggJiBDT1JfTUZDX0NPTkZJR19NQVNLOwotCSAgICBjLT5PcHRpb24gfD0gQ09SX0ZVTkNfRU5BfENPUl9JUkVRX0VOQTsKLQkgICAgaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9CQVNFXzApCi0JCWMtPk9wdGlvbiB8PSBDT1JfQUREUl9ERUNPREU7Ci0JfQotCWlmIChjLT5zdGF0ZSAmIENPTkZJR19JUlFfUkVRKQotCSAgICBpZiAoIShjLT5pcnEuQXR0cmlidXRlcyAmIElSUV9GT1JDRURfUFVMU0UpKQotCQljLT5PcHRpb24gfD0gQ09SX0xFVkVMX1JFUTsKLQl3cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0NPUik+PjEsIDEsICZjLT5PcHRpb24pOwotCW1kZWxheSg0MCk7Ci0gICAgfQotICAgIGlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX1NUQVRVUykgewotCWMtPlN0YXR1cyA9IHJlcS0+U3RhdHVzOwotCXdyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfQ0NTUik+PjEsIDEsICZjLT5TdGF0dXMpOwotICAgIH0KLSAgICBpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9QSU5fUkVQTEFDRSkgewotCWMtPlBpbiA9IHJlcS0+UGluOwotCXdyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfUFJSKT4+MSwgMSwgJmMtPlBpbik7Ci0gICAgfQotICAgIGlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX0VYVF9TVEFUVVMpIHsKLQljLT5FeHRTdGF0dXMgPSByZXEtPkV4dFN0YXR1czsKLQl3cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0VTUik+PjEsIDEsICZjLT5FeHRTdGF0dXMpOwotICAgIH0KLSAgICBpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9JT0JBU0VfMCkgewotCXVfY2hhciBiID0gYy0+aW8uQmFzZVBvcnQxICYgMHhmZjsKLQl3cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0lPQkFTRV8wKT4+MSwgMSwgJmIpOwotCWIgPSAoYy0+aW8uQmFzZVBvcnQxID4+IDgpICYgMHhmZjsKLQl3cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0lPQkFTRV8xKT4+MSwgMSwgJmIpOwotICAgIH0KLSAgICBpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9JT1NJWkUpIHsKLQl1X2NoYXIgYiA9IGMtPmlvLk51bVBvcnRzMSArIGMtPmlvLk51bVBvcnRzMiAtIDE7Ci0Jd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT1NJWkUpPj4xLCAxLCAmYik7Ci0gICAgfQotICAgIAotICAgIC8qIENvbmZpZ3VyZSBJL08gd2luZG93cyAqLwotICAgIGlmIChjLT5zdGF0ZSAmIENPTkZJR19JT19SRVEpIHsKLQlpb21hcC5zcGVlZCA9IGlvX3NwZWVkOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspCi0JICAgIGlmIChzLT5pb1tpXS5OdW1Qb3J0cyAhPSAwKSB7Ci0JCWlvbWFwLm1hcCA9IGk7Ci0JCWlvbWFwLmZsYWdzID0gTUFQX0FDVElWRTsKLQkJc3dpdGNoIChzLT5pb1tpXS5BdHRyaWJ1dGVzICYgSU9fREFUQV9QQVRIX1dJRFRIKSB7Ci0JCWNhc2UgSU9fREFUQV9QQVRIX1dJRFRIXzE2OgotCQkgICAgaW9tYXAuZmxhZ3MgfD0gTUFQXzE2QklUOyBicmVhazsKLQkJY2FzZSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzoKLQkJICAgIGlvbWFwLmZsYWdzIHw9IE1BUF9BVVRPU1o7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICAgYnJlYWs7Ci0JCX0KLQkJaW9tYXAuc3RhcnQgPSBzLT5pb1tpXS5CYXNlUG9ydDsKLQkJaW9tYXAuc3RvcCA9IGlvbWFwLnN0YXJ0ICsgcy0+aW9baV0uTnVtUG9ydHMgLSAxOwotCQlzLT5vcHMtPnNldF9pb19tYXAocywgJmlvbWFwKTsKLQkJcy0+aW9baV0uQ29uZmlnKys7Ci0JICAgIH0KLSAgICB9Ci0gICAgCi0gICAgYy0+c3RhdGUgfD0gQ09ORklHX0xPQ0tFRDsKLSAgICBoYW5kbGUtPnN0YXRlIHw9IENMSUVOVF9DT05GSUdfTE9DS0VEOwotICAgIHJldHVybiBDU19TVUNDRVNTOwotfSAvKiByZXF1ZXN0X2NvbmZpZ3VyYXRpb24gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIAotICAgIFJlcXVlc3RfaW8oKSByZXNlcnZlcyByYW5nZXMgb2YgcG9ydCBhZGRyZXNzZXMgZm9yIGEgc29ja2V0LgotICAgIEkgaGF2ZSBub3QgaW1wbGVtZW50ZWQgcmFuZ2Ugc2hhcmluZyBvciBhbGlhcyBhZGRyZXNzaW5nLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWludCBwY21jaWFfcmVxdWVzdF9pbyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpb19yZXFfdCAqcmVxKQotewotICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotICAgIGNvbmZpZ190ICpjOwotICAgIAotICAgIGlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLSAgICBzID0gU09DS0VUKGhhbmRsZSk7Ci0gICAgaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCi0JcmV0dXJuIENTX05PX0NBUkQ7Ci0KLSAgICBpZiAoaGFuZGxlLT5zdGF0ZSAmIENMSUVOVF9DQVJEQlVTKSB7Ci0jaWZkZWYgQ09ORklHX0NBUkRCVVMKLQloYW5kbGUtPnN0YXRlIHw9IENMSUVOVF9JT19SRVE7Ci0JcmV0dXJuIENTX1NVQ0NFU1M7Ci0jZWxzZQotCXJldHVybiBDU19VTlNVUFBPUlRFRF9GVU5DVElPTjsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmICghcmVxKQotCXJldHVybiBDU19VTlNVUFBPUlRFRF9NT0RFOwotICAgIGMgPSBDT05GSUcoaGFuZGxlKTsKLSAgICBpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQotCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKLSAgICBpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKQotCXJldHVybiBDU19JTl9VU0U7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlczEgJiAoSU9fU0hBUkVEIHwgSU9fRk9SQ0VfQUxJQVNfQUNDRVNTKSkKLQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKLSAgICBpZiAoKHJlcS0+TnVtUG9ydHMyID4gMCkgJiYKLQkocmVxLT5BdHRyaWJ1dGVzMiAmIChJT19TSEFSRUQgfCBJT19GT1JDRV9BTElBU19BQ0NFU1MpKSkKLQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKLQotICAgIGlmIChhbGxvY19pb19zcGFjZShzLCByZXEtPkF0dHJpYnV0ZXMxLCAmcmVxLT5CYXNlUG9ydDEsCi0JCSAgICAgICByZXEtPk51bVBvcnRzMSwgcmVxLT5JT0FkZHJMaW5lcykpCi0JcmV0dXJuIENTX0lOX1VTRTsKLQotICAgIGlmIChyZXEtPk51bVBvcnRzMikgewotCWlmIChhbGxvY19pb19zcGFjZShzLCByZXEtPkF0dHJpYnV0ZXMyLCAmcmVxLT5CYXNlUG9ydDIsCi0JCQkgICByZXEtPk51bVBvcnRzMiwgcmVxLT5JT0FkZHJMaW5lcykpIHsKLQkgICAgcmVsZWFzZV9pb19zcGFjZShzLCByZXEtPkJhc2VQb3J0MSwgcmVxLT5OdW1Qb3J0czEpOwotCSAgICByZXR1cm4gQ1NfSU5fVVNFOwotCX0KLSAgICB9Ci0KLSAgICBjLT5pbyA9ICpyZXE7Ci0gICAgYy0+c3RhdGUgfD0gQ09ORklHX0lPX1JFUTsKLSAgICBoYW5kbGUtPnN0YXRlIHw9IENMSUVOVF9JT19SRVE7Ci0gICAgcmV0dXJuIENTX1NVQ0NFU1M7Ci19IC8qIHJlcXVlc3RfaW8gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSZXF1ZXN0X2lycSgpIHJlc2VydmVzIGFuIGlycSBmb3IgdGhpcyBjbGllbnQuCi0KLSAgICBBbHNvLCBzaW5jZSBMaW51eCBvbmx5IHJlc2VydmVzIGlycSdzIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKLSAgICBob29rZWQsIHdlIGRvbid0IGd1YXJhbnRlZSB0aGF0IGFuIGlycSB3aWxsIHN0aWxsIGJlIGF2YWlsYWJsZQotICAgIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkLiAgTm93IHRoYXQgSSB0aGluayBhYm91dCBpdCwKLSAgICB0aGVyZSBtaWdodCBiZSBhIHdheSB0byBmaXggdGhpcyB1c2luZyBhIGR1bW15IGhhbmRsZXIuCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKLXN0YXRpYyBpcnFyZXR1cm5fdCB0ZXN0X2FjdGlvbihpbnQgY3BsLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXJldHVybiBJUlFfTk9ORTsKLX0KLSNlbmRpZgotCi1pbnQgcGNtY2lhX3JlcXVlc3RfaXJxKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlycV9yZXFfdCAqcmVxKQotewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWNvbmZpZ190ICpjOwotCWludCByZXQgPSBDU19JTl9VU0UsIGlycSA9IDA7Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gaGFuZGxlX3RvX3BkZXYoaGFuZGxlKTsKLQotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQotCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLQljID0gQ09ORklHKGhhbmRsZSk7Ci0JaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKLQkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOwotCWlmIChjLT5zdGF0ZSAmIENPTkZJR19JUlFfUkVRKQotCQlyZXR1cm4gQ1NfSU5fVVNFOwotCi0jaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQotCWlmIChzLT5pcnEuQXNzaWduZWRJUlEgIT0gMCkgewotCQkvKiBJZiB0aGUgaW50ZXJydXB0IGlzIGFscmVhZHkgYXNzaWduZWQsIGl0IG11c3QgYmUgdGhlIHNhbWUgKi8KLQkJaXJxID0gcy0+aXJxLkFzc2lnbmVkSVJROwotCX0gZWxzZSB7Ci0JCWludCB0cnk7Ci0JCXUzMiBtYXNrID0gcy0+aXJxX21hc2s7Ci0JCXZvaWQgKmRhdGEgPSBOVUxMOwotCi0JCWZvciAodHJ5ID0gMDsgdHJ5IDwgNjQ7IHRyeSsrKSB7Ci0JCQlpcnEgPSB0cnkgJSAzMjsKLQotCQkJLyogbWFya2VkIGFzIGF2YWlsYWJsZSBieSBkcml2ZXIsIGFuZCBub3QgYmxvY2tlZCBieSB1c2Vyc3BhY2U/ICovCi0JCQlpZiAoISgobWFzayA+PiBpcnEpICYgMSkpCi0JCQkJY29udGludWU7Ci0KLQkJCS8qIGF2b2lkIGFuIElSUSB3aGljaCBpcyBhbHJlYWR5IHVzZWQgYnkgYSBQQ01DSUEgY2FyZCAqLwotCQkJaWYgKCh0cnkgPCAzMikgJiYgcGNtY2lhX3VzZWRfaXJxW2lycV0pCi0JCQkJY29udGludWU7Ci0KLQkJCS8qIHJlZ2lzdGVyIHRoZSBjb3JyZWN0IGRyaXZlciwgaWYgcG9zc2libGUsIG9mIGNoZWNrIHdoZXRoZXIKLQkJCSAqIHJlZ2lzdGVyaW5nIGEgZHVtbXkgaGFuZGxlIHdvcmtzLCBpLmUuIGlmIHRoZSBJUlEgaXNuJ3QKLQkJCSAqIG1hcmtlZCBhcyB1c2VkIGJ5IHRoZSBrZXJuZWwgcmVzb3VyY2UgbWFuYWdlbWVudCBjb3JlICovCi0JCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsCi0JCQkJCSAgKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkgPyByZXEtPkhhbmRsZXIgOiB0ZXN0X2FjdGlvbiwKLQkJCQkJICAoKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykgfHwKLQkJCQkJICAgKHMtPmZ1bmN0aW9ucyA+IDEpIHx8Ci0JCQkJCSAgIChpcnEgPT0gcy0+cGNpX2lycSkpID8gU0FfU0hJUlEgOiAwLAotCQkJCQkgIHBfZGV2LT5kZXYuYnVzX2lkLAotCQkJCQkgIChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpID8gcmVxLT5JbnN0YW5jZSA6IGRhdGEpOwotCQkJaWYgKCFyZXQpIHsKLQkJCQlpZiAoIShyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpKQotCQkJCQlmcmVlX2lycShpcnEsIGRhdGEpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotI2VuZGlmCi0JaWYgKHJldCkgewotCQlpZiAoIXMtPnBjaV9pcnEpCi0JCQlyZXR1cm4gcmV0OwotCQlpcnEgPSBzLT5wY2lfaXJxOwotCX0KLQotCWlmIChyZXQgJiYgcmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSB7Ci0JCWlmIChyZXF1ZXN0X2lycShpcnEsIHJlcS0+SGFuZGxlciwKLQkJCQkoKHJlcS0+QXR0cmlidXRlcyAmIElSUV9UWVBFX0RZTkFNSUNfU0hBUklORykgfHwKLQkJCQkgKHMtPmZ1bmN0aW9ucyA+IDEpIHx8Ci0JCQkJIChpcnEgPT0gcy0+cGNpX2lycSkpID8gU0FfU0hJUlEgOiAwLAotCQkJCXBfZGV2LT5kZXYuYnVzX2lkLCByZXEtPkluc3RhbmNlKSkKLQkJCXJldHVybiBDU19JTl9VU0U7Ci0JfQotCi0JYy0+aXJxLkF0dHJpYnV0ZXMgPSByZXEtPkF0dHJpYnV0ZXM7Ci0Jcy0+aXJxLkFzc2lnbmVkSVJRID0gcmVxLT5Bc3NpZ25lZElSUSA9IGlycTsKLQlzLT5pcnEuQ29uZmlnKys7Ci0KLQljLT5zdGF0ZSB8PSBDT05GSUdfSVJRX1JFUTsKLQloYW5kbGUtPnN0YXRlIHw9IENMSUVOVF9JUlFfUkVROwotCi0jaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQotCXBjbWNpYV91c2VkX2lycVtpcnFdKys7Ci0jZW5kaWYKLQotCXJldHVybiBDU19TVUNDRVNTOwotfSAvKiBwY21jaWFfcmVxdWVzdF9pcnEgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBSZXF1ZXN0X3dpbmRvdygpIGVzdGFibGlzaGVzIGEgbWFwcGluZyBiZXR3ZWVuIGNhcmQgbWVtb3J5IHNwYWNlCi0gICAgYW5kIHN5c3RlbSBtZW1vcnkgc3BhY2UuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1pbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KGNsaWVudF9oYW5kbGVfdCAqaGFuZGxlLCB3aW5fcmVxX3QgKnJlcSwgd2luZG93X2hhbmRsZV90ICp3aCkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLSAgICB3aW5kb3dfdCAqd2luOwotICAgIHVfbG9uZyBhbGlnbjsKLSAgICBpbnQgdzsKLSAgICAKLSAgICBpZiAoQ0hFQ0tfSEFORExFKCpoYW5kbGUpKQotCXJldHVybiBDU19CQURfSEFORExFOwotICAgIHMgPSAoKmhhbmRsZSktPlNvY2tldDsKLSAgICBpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKLQlyZXR1cm4gQ1NfTk9fQ0FSRDsKLSAgICBpZiAocmVxLT5BdHRyaWJ1dGVzICYgKFdJTl9QQUdFRCB8IFdJTl9TSEFSRUQpKQotCXJldHVybiBDU19CQURfQVRUUklCVVRFOwotCi0gICAgLyogV2luZG93IHNpemUgZGVmYXVsdHMgdG8gc21hbGxlc3QgYXZhaWxhYmxlICovCi0gICAgaWYgKHJlcS0+U2l6ZSA9PSAwKQotCXJlcS0+U2l6ZSA9IHMtPm1hcF9zaXplOwotICAgIGFsaWduID0gKCgocy0+ZmVhdHVyZXMgJiBTU19DQVBfTUVNX0FMSUdOKSB8fAotCSAgICAgIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fU1RSSUNUX0FMSUdOKSkgPwotCSAgICAgcmVxLT5TaXplIDogcy0+bWFwX3NpemUpOwotICAgIGlmIChyZXEtPlNpemUgJiAocy0+bWFwX3NpemUtMSkpCi0JcmV0dXJuIENTX0JBRF9TSVpFOwotICAgIGlmICgocmVxLT5CYXNlICYmIChzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSkgfHwKLQkocmVxLT5CYXNlICYgKGFsaWduLTEpKSkKLQlyZXR1cm4gQ1NfQkFEX0JBU0U7Ci0gICAgaWYgKHJlcS0+QmFzZSkKLQlhbGlnbiA9IDA7Ci0KLSAgICAvKiBBbGxvY2F0ZSBzeXN0ZW0gbWVtb3J5IHdpbmRvdyAqLwotICAgIGZvciAodyA9IDA7IHcgPCBNQVhfV0lOOyB3KyspCi0JaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfV0lOX1JFUSh3KSkpIGJyZWFrOwotICAgIGlmICh3ID09IE1BWF9XSU4pCi0JcmV0dXJuIENTX09VVF9PRl9SRVNPVVJDRTsKLQotICAgIHdpbiA9ICZzLT53aW5bd107Ci0gICAgd2luLT5tYWdpYyA9IFdJTkRPV19NQUdJQzsKLSAgICB3aW4tPmluZGV4ID0gdzsKLSAgICB3aW4tPmhhbmRsZSA9ICpoYW5kbGU7Ci0gICAgd2luLT5zb2NrID0gczsKLQotICAgIGlmICghKHMtPmZlYXR1cmVzICYgU1NfQ0FQX1NUQVRJQ19NQVApKSB7Ci0Jd2luLT5jdGwucmVzID0gZmluZF9tZW1fcmVnaW9uKHJlcS0+QmFzZSwgcmVxLT5TaXplLCBhbGlnbiwKLQkJCQkgICAgICAgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9NQVBfQkVMT1dfMU1CKSwgcyk7Ci0JaWYgKCF3aW4tPmN0bC5yZXMpCi0JICAgIHJldHVybiBDU19JTl9VU0U7Ci0gICAgfQotICAgICgqaGFuZGxlKS0+c3RhdGUgfD0gQ0xJRU5UX1dJTl9SRVEodyk7Ci0KLSAgICAvKiBDb25maWd1cmUgdGhlIHNvY2tldCBjb250cm9sbGVyICovCi0gICAgd2luLT5jdGwubWFwID0gdysxOwotICAgIHdpbi0+Y3RsLmZsYWdzID0gMDsKLSAgICB3aW4tPmN0bC5zcGVlZCA9IHJlcS0+QWNjZXNzU3BlZWQ7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9NRU1PUllfVFlQRSkKLQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfQVRUUklCOwotICAgIGlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fRU5BQkxFKQotCXdpbi0+Y3RsLmZsYWdzIHw9IE1BUF9BQ1RJVkU7Ci0gICAgaWYgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9EQVRBX1dJRFRIXzE2KQotCXdpbi0+Y3RsLmZsYWdzIHw9IE1BUF8xNkJJVDsKLSAgICBpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX1VTRV9XQUlUKQotCXdpbi0+Y3RsLmZsYWdzIHw9IE1BUF9VU0VfV0FJVDsKLSAgICB3aW4tPmN0bC5jYXJkX3N0YXJ0ID0gMDsKLSAgICBpZiAocy0+b3BzLT5zZXRfbWVtX21hcChzLCAmd2luLT5jdGwpICE9IDApCi0JcmV0dXJuIENTX0JBRF9BUkdTOwotICAgIHMtPnN0YXRlIHw9IFNPQ0tFVF9XSU5fUkVRKHcpOwotCi0gICAgLyogUmV0dXJuIHdpbmRvdyBoYW5kbGUgKi8KLSAgICBpZiAocy0+ZmVhdHVyZXMgJiBTU19DQVBfU1RBVElDX01BUCkgewotCXJlcS0+QmFzZSA9IHdpbi0+Y3RsLnN0YXRpY19zdGFydDsKLSAgICB9IGVsc2UgewotCXJlcS0+QmFzZSA9IHdpbi0+Y3RsLnJlcy0+c3RhcnQ7Ci0gICAgfQotICAgICp3aCA9IHdpbjsKLSAgICAKLSAgICByZXR1cm4gQ1NfU1VDQ0VTUzsKLX0gLyogcmVxdWVzdF93aW5kb3cgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgICBJJ20gbm90IHN1cmUgd2hpY2ggInJlc2V0IiBmdW5jdGlvbiB0aGlzIGlzIHN1cHBvc2VkIHRvIHVzZSwKLSAgICBidXQgZm9yIG5vdywgaXQgdXNlcyB0aGUgbG93LWxldmVsIGludGVyZmFjZSdzIHJlc2V0LCBub3QgdGhlCi0gICAgQ0lTIHJlZ2lzdGVyLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBJJ20gbm90IHN1cmUgd2hpY2ggInJlc2V0IiBmdW5jdGlvbiB0aGlzIGlzIHN1cHBvc2VkIHRvIHVzZSwKKyAqIGJ1dCBmb3Igbm93LCBpdCB1c2VzIHRoZSBsb3ctbGV2ZWwgaW50ZXJmYWNlJ3MgcmVzZXQsIG5vdCB0aGUKKyAqIENJUyByZWdpc3Rlci4KKyAqLwogCiBpbnQgcGNjYXJkX3Jlc2V0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpbnQgcmV0OwotICAgIAorCiAJY3NfZGJnKHNrdCwgMSwgInJlc2V0dGluZyBzb2NrZXRcbiIpOwogCiAJZG93bigmc2t0LT5za3Rfc2VtKTsKQEAgLTE3NTcsMTcgKzc4NCwxNCBAQAogfSAvKiByZXNldF9jYXJkICovCiBFWFBPUlRfU1lNQk9MKHBjY2FyZF9yZXNldF9jYXJkKTsKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSAgICBUaGVzZSBzaHV0IGRvd24gb3Igd2FrZSB1cCBhIHNvY2tldC4gIFRoZXkgYXJlIHNvcnQgb2YgdXNlcgotICAgIGluaXRpYXRlZCB2ZXJzaW9ucyBvZiB0aGUgQVBNIHN1c3BlbmQgYW5kIHJlc3VtZSBhY3Rpb25zLgotICAgIAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KKy8qIFRoZXNlIHNodXQgZG93biBvciB3YWtlIHVwIGEgc29ja2V0LiAgVGhleSBhcmUgc29ydCBvZiB1c2VyCisgKiBpbml0aWF0ZWQgdmVyc2lvbnMgb2YgdGhlIEFQTSBzdXNwZW5kIGFuZCByZXN1bWUgYWN0aW9ucy4KKyAqLwogaW50IHBjbWNpYV9zdXNwZW5kX2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlpbnQgcmV0OwotICAgIAorCiAJY3NfZGJnKHNrdCwgMSwgInN1c3BlbmRpbmcgc29ja2V0XG4iKTsKIAogCWRvd24oJnNrdC0+c2t0X3NlbSk7CkBAIC0xNzg2LDYgKzgxMCw4IEBACiAKIAlyZXR1cm4gcmV0OwogfSAvKiBzdXNwZW5kX2NhcmQgKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3N1c3BlbmRfY2FyZCk7CisKIAogaW50IHBjbWNpYV9yZXN1bWVfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogewpAQCAtMTgwOSwxMyArODM1LDEwIEBACiAKIAlyZXR1cm4gcmV0OwogfSAvKiByZXN1bWVfY2FyZCAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfcmVzdW1lX2NhcmQpOwogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgIFRoZXNlIGhhbmRsZSB1c2VyIHJlcXVlc3RzIHRvIGVqZWN0IG9yIGluc2VydCBhIGNhcmQuCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQorLyogVGhlc2UgaGFuZGxlIHVzZXIgcmVxdWVzdHMgdG8gZWplY3Qgb3IgaW5zZXJ0IGEgY2FyZC4gKi8KIGludCBwY21jaWFfZWplY3RfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KQogewogCWludCByZXQ7CkBAIC0xODQyLDYgKzg2NSw4IEBACiAKIAlyZXR1cm4gcmV0OwogfSAvKiBlamVjdF9jYXJkICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9lamVjdF9jYXJkKTsKKwogCiBpbnQgcGNtY2lhX2luc2VydF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCiB7CkBAIC0xODY1LDM3ICs4OTAsMzggQEAKIAogCXJldHVybiByZXQ7CiB9IC8qIGluc2VydF9jYXJkICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgT1Mtc3BlY2lmaWMgbW9kdWxlIGdsdWUgZ29lcyBoZXJlCi0gICAgCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qIGluIGFscGhhIG9yZGVyICovCi1FWFBPUlRfU1lNQk9MKHBjbWNpYV9lamVjdF9jYXJkKTsKLUVYUE9SVF9TWU1CT0wocGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8pOwotRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X21lbV9wYWdlKTsKIEVYUE9SVF9TWU1CT0wocGNtY2lhX2luc2VydF9jYXJkKTsKLUVYUE9SVF9TWU1CT0wocGNtY2lhX21hcF9tZW1fcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbik7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24pOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVsZWFzZV9pbyk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX2lycSk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX3dpbmRvdyk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXBsYWNlX2Npcyk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24pOwotRVhQT1JUX1NZTUJPTChwY21jaWFfcmVxdWVzdF9pbyk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2lycSk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X3dpbmRvdyk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXN1bWVfY2FyZCk7Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9zdXNwZW5kX2NhcmQpOwogCi1FWFBPUlRfU1lNQk9MKGRlYWRfc29ja2V0KTsKLUVYUE9SVF9TWU1CT0wocGNtY2lhX3BhcnNlX2V2ZW50cyk7CisKK3N0YXRpYyBpbnQgcGNtY2lhX3NvY2tldF9ob3RwbHVnKHN0cnVjdCBjbGFzc19kZXZpY2UgKmRldiwgY2hhciAqKmVudnAsCisJCQkJaW50IG51bV9lbnZwLCBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY21jaWFfc29ja2V0LCBkZXYpOworCWludCBpID0gMCwgbGVuZ3RoID0gMDsKKworCWlmIChhZGRfaG90cGx1Z19lbnZfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwgYnVmZmVyLCBidWZmZXJfc2l6ZSwKKwkJCQkmbGVuZ3RoLCAiU09DS0VUX05PPSV1Iiwgcy0+c29jaykpCisJCXJldHVybiAtRU5PTUVNOworCisJZW52cFtpXSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGNvbXBsZXRpb24gcGNtY2lhX3VubG9hZDsKKworc3RhdGljIHZvaWQgcGNtY2lhX3JlbGVhc2Vfc29ja2V0X2NsYXNzKHN0cnVjdCBjbGFzcyAqZGF0YSkKK3sKKwljb21wbGV0ZSgmcGNtY2lhX3VubG9hZCk7Cit9CisKIAogc3RydWN0IGNsYXNzIHBjbWNpYV9zb2NrZXRfY2xhc3MgPSB7CiAJLm5hbWUgPSAicGNtY2lhX3NvY2tldCIsCisgICAgICAgIC5ob3RwbHVnID0gcGNtY2lhX3NvY2tldF9ob3RwbHVnLAogCS5yZWxlYXNlID0gcGNtY2lhX3JlbGVhc2Vfc29ja2V0LAorCS5jbGFzc19yZWxlYXNlID0gcGNtY2lhX3JlbGVhc2Vfc29ja2V0X2NsYXNzLAogfTsKIEVYUE9SVF9TWU1CT0wocGNtY2lhX3NvY2tldF9jbGFzcyk7CiAKQEAgLTE5MDMsOSArOTI5LDggQEAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGNtY2lhX2NzKHZvaWQpCiB7CiAJaW50IHJldDsKLQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgcmVsZWFzZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICAlc1xuIiwgb3B0aW9ucyk7CiAKKwlpbml0X2NvbXBsZXRpb24oJnBjbWNpYV91bmxvYWQpOwogCXJldCA9IGNsYXNzX3JlZ2lzdGVyKCZwY21jaWFfc29ja2V0X2NsYXNzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gKHJldCk7CkBAIC0xOTE0LDEzICs5MzksMTIgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcGNtY2lhX2NzKHZvaWQpCiB7Ci0gICAgcHJpbnRrKEtFUk5fSU5GTyAidW5sb2FkaW5nIEtlcm5lbCBDYXJkIFNlcnZpY2VzXG4iKTsKLSAgICBjbGFzc19pbnRlcmZhY2VfdW5yZWdpc3RlcigmcGNjYXJkX3N5c2ZzX2ludGVyZmFjZSk7Ci0gICAgY2xhc3NfdW5yZWdpc3RlcigmcGNtY2lhX3NvY2tldF9jbGFzcyk7CisJY2xhc3NfaW50ZXJmYWNlX3VucmVnaXN0ZXIoJnBjY2FyZF9zeXNmc19pbnRlcmZhY2UpOworCWNsYXNzX3VucmVnaXN0ZXIoJnBjbWNpYV9zb2NrZXRfY2xhc3MpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmcGNtY2lhX3VubG9hZCk7CiB9CiAKIHN1YnN5c19pbml0Y2FsbChpbml0X3BjbWNpYV9jcyk7CiBtb2R1bGVfZXhpdChleGl0X3BjbWNpYV9jcyk7CiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oIGIvZHJpdmVycy9wY21jaWEvY3NfaW50ZXJuYWwuaAppbmRleCA3OTMzYTdkLi42YmJmYmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9jc19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvcGNtY2lhL2NzX2ludGVybmFsLmgKQEAgLTk5LDIzICs5OSwxMSBAQAogCX0KIH0KIAotI2RlZmluZSBDSEVDS19IQU5ETEUoaCkgXAotICAgICgoKGgpID09IE5VTEwpIHx8ICgoaCktPmNsaWVudF9tYWdpYyAhPSBDTElFTlRfTUFHSUMpKQotCiAjZGVmaW5lIENIRUNLX1NPQ0tFVChzKSBcCiAgICAgKCgocykgPj0gc29ja2V0cykgfHwgKHNvY2tldF90YWJsZVtzXS0+b3BzID09IE5VTEwpKQogCi0jZGVmaW5lIFNPQ0tFVChoKSAoaC0+U29ja2V0KQotI2RlZmluZSBDT05GSUcoaCkgKCZTT0NLRVQoaCktPmNvbmZpZ1soaCktPkZ1bmN0aW9uXSkKLQotI2RlZmluZSBDSEVDS19SRUdJT04ocikgXAotICAgICgoKHIpID09IE5VTEwpIHx8ICgociktPnJlZ2lvbl9tYWdpYyAhPSBSRUdJT05fTUFHSUMpKQotCi0jZGVmaW5lIENIRUNLX0VSQVNFUShxKSBcCi0gICAgKCgocSkgPT0gTlVMTCkgfHwgKChxKS0+ZXJhc2VxX21hZ2ljICE9IEVSQVNFUV9NQUdJQykpCi0KLSNkZWZpbmUgRVZFTlQoaCwgZSwgcCkgXAotICAgICgoaCktPmV2ZW50X2hhbmRsZXIoKGUpLCAocCksICYoaCktPmV2ZW50X2NhbGxiYWNrX2FyZ3MpKQorI2RlZmluZSBTT0NLRVQoaCkgKGgtPnNvY2tldCkKKyNkZWZpbmUgQ09ORklHKGgpICgmU09DS0VUKGgpLT5jb25maWdbKGgpLT5mdW5jXSkKIAogLyogSW4gY2FyZGJ1cy5jICovCiBpbnQgY2JfYWxsb2Moc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwpAQCAtMTIzLDkgKzExMSw5IEBACiBpbnQgcmVhZF9jYl9tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBzcGFjZSwgdV9pbnQgYWRkciwgdV9pbnQgbGVuLCB2b2lkICpwdHIpOwogCiAvKiBJbiBjaXN0cGwuYyAqLwotaW50IHJlYWRfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsCitpbnQgcGNtY2lhX3JlYWRfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsCiAJCSB1X2ludCBhZGRyLCB1X2ludCBsZW4sIHZvaWQgKnB0cik7Ci12b2lkIHdyaXRlX2Npc19tZW0oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGludCBhdHRyLAordm9pZCBwY21jaWFfd3JpdGVfY2lzX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgaW50IGF0dHIsCiAJCSAgIHVfaW50IGFkZHIsIHVfaW50IGxlbiwgdm9pZCAqcHRyKTsKIHZvaWQgcmVsZWFzZV9jaXNfbWVtKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIHZvaWQgZGVzdHJveV9jaXNfY2FjaGUoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwpAQCAtMTM0LDEzICsxMjIsMTIgQEAKIAogLyogSW4gcnNyY19tZ3IgKi8KIHZvaWQgcGNtY2lhX3ZhbGlkYXRlX21lbShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci1zdHJ1Y3QgcmVzb3VyY2UgKmZpbmRfaW9fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKK3N0cnVjdCByZXNvdXJjZSAqcGNtY2lhX2ZpbmRfaW9fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOwotaW50IGFkanVzdF9pb19yZWdpb24oc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgcl9zdGFydCwKK2ludCBwY21jaWFfYWRqdXN0X2lvX3JlZ2lvbihzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgbG9uZyByX3N0YXJ0LAogCQkgICAgIHVuc2lnbmVkIGxvbmcgcl9lbmQsIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLXN0cnVjdCByZXNvdXJjZSAqZmluZF9tZW1fcmVnaW9uKHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtLCB1X2xvbmcgYWxpZ24sCitzdHJ1Y3QgcmVzb3VyY2UgKnBjbWNpYV9maW5kX21lbV9yZWdpb24odV9sb25nIGJhc2UsIHVfbG9uZyBudW0sIHVfbG9uZyBhbGlnbiwKIAkJICAgIGludCBsb3csIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKLWludCBhZGp1c3RfcmVzb3VyY2VfaW5mbyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBhZGp1c3RfdCAqYWRqKTsKIHZvaWQgcmVsZWFzZV9yZXNvdXJjZV9kYihzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7CiAKIC8qIEluIHNvY2tldF9zeXNmcy5jICovCkBAIC0xNTksNyArMTQ2LDcgQEAKIHN0cnVjdCBwY21jaWFfY2FsbGJhY2t7CiAJc3RydWN0IG1vZHVsZQkqb3duZXI7CiAJaW50CQkoKmV2ZW50KSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSk7Ci0JaW50CQkoKnJlc291cmNlc19kb25lKSAoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpOworCXZvaWQJCSgqcmVxdWVyeSkgKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIH07CiAKIGludCBwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBzdHJ1Y3QgcGNtY2lhX2NhbGxiYWNrICpjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzLmMgYi9kcml2ZXJzL3BjbWNpYS9kcy5jCmluZGV4IDU2OWU1NWYuLjNlM2M2ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL2RzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvZHMuYwpAQCAtMTAsNDQgKzEwLDI5IEBACiAgKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiAoQykgMTk5OQkJRGF2aWQgQS4gSGluZHMKLSAqIChDKSAyMDAzIC0gMjAwNAlEb21pbmlrIEJyb2Rvd3NraQorICogKEMpIDIwMDMgLSAyMDA1CURvbWluaWsgQnJvZG93c2tpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9wb2xsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KIAogI2RlZmluZSBJTl9DQVJEX1NFUlZJQ0VTCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KLSNpbmNsdWRlIDxwY21jaWEvYnVsa21lbS5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KICNpbmNsdWRlIDxwY21jaWEvZHMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KIAogI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZHNfaW50ZXJuYWwuaCIKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKQEAgLTcwLDQ5ICs1NSw5IEBACiAjZGVmaW5lIGRzX2RiZyhsdmwsIGZtdCwgYXJnLi4uKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzcGlubG9ja190IHBjbWNpYV9kZXZfbGlzdF9sb2NrOwogCi0vKiBEZXZpY2UgdXNlciBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBNQVhfRVZFTlRTCTMyCi0jZGVmaW5lIFVTRVJfTUFHSUMJMHg3ZWE0Ci0jZGVmaW5lIENIRUNLX1VTRVIodSkgXAotICAgICgoKHUpID09IE5VTEwpIHx8ICgodSktPnVzZXJfbWFnaWMgIT0gVVNFUl9NQUdJQykpCi10eXBlZGVmIHN0cnVjdCB1c2VyX2luZm9fdCB7Ci0gICAgdV9pbnQJCXVzZXJfbWFnaWM7Ci0gICAgaW50CQkJZXZlbnRfaGVhZCwgZXZlbnRfdGFpbDsKLSAgICBldmVudF90CQlldmVudFtNQVhfRVZFTlRTXTsKLSAgICBzdHJ1Y3QgdXNlcl9pbmZvX3QJKm5leHQ7Ci0gICAgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzb2NrZXQ7Ci19IHVzZXJfaW5mb190OwotCi0vKiBTb2NrZXQgc3RhdGUgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCB7Ci0Jc3RydWN0IGtyZWYJCXJlZmNvdW50OwotCXN0cnVjdCBwY21jaWFfY2FsbGJhY2sJY2FsbGJhY2s7Ci0JaW50CQkJc3RhdGU7Ci0JdXNlcl9pbmZvX3QJCSp1c2VyOwotCXdhaXRfcXVldWVfaGVhZF90CXF1ZXVlOwotCXN0cnVjdCBwY21jaWFfc29ja2V0CSpwYXJlbnQ7Ci0KLQkvKiB0aGUgUENNQ0lBIGRldmljZXMgY29ubmVjdGVkIHRvIHRoaXMgc29ja2V0IChub3JtYWxseSBvbmUsIG1vcmUKLQkgKiBmb3IgbXVsdGlmdW5jdGlvbiBkZXZpY2VzOiAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZGV2aWNlc19saXN0OwotCXU4CQkJZGV2aWNlX2NvdW50OyAvKiB0aGUgbnVtYmVyIG9mIGRldmljZXMsIHVzZWQKLQkJCQkJICAgICAgICogb25seSBpbnRlcm5hbGx5IGFuZCBzdWJqZWN0Ci0JCQkJCSAgICAgICAqIHRvIGluY29ycmVjdG5lc3MgYW5kIGNoYW5nZSAqLwotfTsKLXN0YXRpYyBzcGlubG9ja190IHBjbWNpYV9kZXZfbGlzdF9sb2NrOwotCi0jZGVmaW5lIERTX1NPQ0tFVF9QUkVTRU5UCQkweDAxCi0jZGVmaW5lIERTX1NPQ0tFVF9CVVNZCQkJMHgwMgotI2RlZmluZSBEU19TT0NLRVRfUkVNT1ZBTF9QRU5ESU5HCTB4MTAKLSNkZWZpbmUgRFNfU09DS0VUX0RFQUQJCQkweDgwCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IG1ham9yX2RldiA9IC0xOwotCi1zdGF0aWMgaW50IHVuYmluZF9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcyk7CitzdGF0aWMgaW50IHVuYmluZF9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKQEAgLTIxMywxNyArMTU4LDE1IEBACiB9OwogCiAKLWludCBwY21jaWFfcmVwb3J0X2Vycm9yKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGVycm9yX2luZm9fdCAqZXJyKQorc3RhdGljIGludCBwY21jaWFfcmVwb3J0X2Vycm9yKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgZXJyb3JfaW5mb190ICplcnIpCiB7CiAJaW50IGk7CiAJY2hhciAqc2VydjsKIAotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKKwlpZiAoIXBfZGV2KQogCQlwcmludGsoS0VSTl9OT1RJQ0UpOwotCWVsc2UgewotCQlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSBoYW5kbGVfdG9fcGRldihoYW5kbGUpOworCWVsc2UKIAkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogIiwgcF9kZXYtPmRldi5idXNfaWQpOwotCX0KIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlcnZpY2VfdGFibGUpOyBpKyspCiAJCWlmIChzZXJ2aWNlX3RhYmxlW2ldLmtleSA9PSBlcnItPmZ1bmMpCkBAIC0yNDMsNDEgKzE4NiwxMTYgQEAKIAogCXJldHVybiBDU19TVUNDRVNTOwogfSAvKiByZXBvcnRfZXJyb3IgKi8KLUVYUE9SVF9TWU1CT0wocGNtY2lhX3JlcG9ydF9lcnJvcik7CiAKIC8qIGVuZCBvZiBjb2RlIHdoaWNoIHdhcyBpbiBjcy5jIGJlZm9yZSAqLwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi12b2lkIGNzX2Vycm9yKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGludCBmdW5jLCBpbnQgcmV0KQordm9pZCBjc19lcnJvcihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGludCBmdW5jLCBpbnQgcmV0KQogewogCWVycm9yX2luZm9fdCBlcnIgPSB7IGZ1bmMsIHJldCB9OwotCXBjbWNpYV9yZXBvcnRfZXJyb3IoaGFuZGxlLCAmZXJyKTsKKwlwY21jaWFfcmVwb3J0X2Vycm9yKHBfZGV2LCAmZXJyKTsKIH0KIEVYUE9SVF9TWU1CT0woY3NfZXJyb3IpOwogCisKK3N0YXRpYyB2b2lkIHBjbWNpYV9jaGVja19kcml2ZXIoc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2KQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlX2lkICpkaWQgPSBwX2Rydi0+aWRfdGFibGU7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIGhhc2g7CisKKwlpZiAoIXBfZHJ2LT5hdHRhY2ggfHwgIXBfZHJ2LT5ldmVudCB8fCAhcF9kcnYtPmRldGFjaCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBjbWNpYTogJXMgZG9lcyBtaXNzZXMgYSBjYWxsYmFjayBmdW5jdGlvbiIsCisJCSAgICAgICBwX2Rydi0+ZHJ2Lm5hbWUpOworCisJd2hpbGUgKGRpZCAmJiBkaWQtPm1hdGNoX2ZsYWdzKSB7CisJCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQkJaWYgKCFkaWQtPnByb2RfaWRbaV0pCisJCQkJY29udGludWU7CisKKwkJCWhhc2ggPSBjcmMzMigwLCBkaWQtPnByb2RfaWRbaV0sIHN0cmxlbihkaWQtPnByb2RfaWRbaV0pKTsKKwkJCWlmIChoYXNoID09IGRpZC0+cHJvZF9pZF9oYXNoW2ldKQorCQkJCWNvbnRpbnVlOworCisJCQlwcmludGsoS0VSTl9ERUJVRyAicGNtY2lhOiAlczogaW52YWxpZCBoYXNoIGZvciAiCisJCQkgICAgICAgInByb2R1Y3Qgc3RyaW5nIFwiJXNcIjogaXMgMHgleCwgc2hvdWxkICIKKwkJCSAgICAgICAiYmUgMHgleFxuIiwgcF9kcnYtPmRydi5uYW1lLCBkaWQtPnByb2RfaWRbaV0sCisJCQkgICAgICAgZGlkLT5wcm9kX2lkX2hhc2hbaV0sIGhhc2gpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgInBjbWNpYTogc2VlICIKKwkJCQkiRG9jdW1lbnRhdGlvbi9wY21jaWEvZGV2aWNldGFibGUudHh0IGZvciAiCisJCQkJImRldGFpbHNcbiIpOworCQl9CisJCWRpZCsrOworCX0KKworCXJldHVybjsKK30KKworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9MT0FEX0NJUworCisvKioKKyAqIHBjbWNpYV9sb2FkX2Zpcm13YXJlIC0gbG9hZCBDSVMgZnJvbSB1c2Vyc3BhY2UgaWYgZGV2aWNlLXByb3ZpZGVkIGlzIGJyb2tlbgorICogQGRldiAtIHRoZSBwY21jaWEgZGV2aWNlIHdoaWNoIG5lZWRzIGEgQ0lTIG92ZXJyaWRlCisgKiBAZmlsZW5hbWUgLSByZXF1ZXN0ZWQgZmlsZW5hbWUgaW4gL2xpYi9maXJtd2FyZS9jaXMvCisgKgorICogVGhpcyB1c2VzIHRoZSBpbi1rZXJuZWwgZmlybXdhcmUgbG9hZGluZyBtZWNoYW5pc20gdG8gdXNlIGEgImZha2UgQ0lTIiBpZgorICogdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgY2FyZCBpcyBicm9rZW4uIFRoZSBmaXJtd2FyZSBmaWxlcyByZXNpZGUgaW4KKyAqIC9saWIvZmlybXdhcmUvY2lzLyBpbiB1c2Vyc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgcGNtY2lhX2xvYWRfZmlybXdhcmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldiwgY2hhciAqIGZpbGVuYW1lKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gZGV2LT5zb2NrZXQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljaGFyIHBhdGhbMjBdOworCWludCByZXQ9LUVOT01FTTsKKwljaXNkdW1wX3QgKmNpczsKKworCWlmICghZmlsZW5hbWUpCisJCXJldHVybiAtRUlOVkFMOworCisJZHNfZGJnKDEsICJ0cnlpbmcgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwgZmlsZW5hbWUpOworCisJaWYgKHN0cmxlbihmaWxlbmFtZSkgPiAxNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzbnByaW50ZihwYXRoLCAyMCwgIiVzIiwgZmlsZW5hbWUpOworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBwYXRoLCAmZGV2LT5kZXYpID09IDApIHsKKwkJaWYgKGZ3LT5zaXplID49IENJU1RQTF9NQVhfQ0lTX1NJWkUpCisJCQlnb3RvIHJlbGVhc2U7CisKKwkJY2lzID0ga21hbGxvYyhzaXplb2YoY2lzZHVtcF90KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2lzKQorCQkJZ290byByZWxlYXNlOworCisJCW1lbXNldChjaXMsIDAsIHNpemVvZihjaXNkdW1wX3QpKTsKKworCQljaXMtPkxlbmd0aCA9IGZ3LT5zaXplICsgMTsKKwkJbWVtY3B5KGNpcy0+RGF0YSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCQlpZiAoIXBjbWNpYV9yZXBsYWNlX2NpcyhzLCBjaXMpKQorCQkJcmV0ID0gMDsKKwl9CisgcmVsZWFzZToKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiAocmV0KTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19QQ01DSUFfTE9BRF9DSVMgKi8KKworc3RhdGljIGlubGluZSBpbnQgcGNtY2lhX2xvYWRfZmlybXdhcmUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmRldiwgY2hhciAqIGZpbGVuYW1lKQoreworCXJldHVybiAtRU5PREVWOworfQorCisjZW5kaWYKKworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgKiBnZXRfcGNtY2lhX2RyaXZlciAoZGV2X2luZm9fdCAqZGV2X2luZm8pOwotc3RhdGljIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqIGdldF9zb2NrZXRfaW5mb19ieV9ucih1bnNpZ25lZCBpbnQgbnIpOwotCi1zdGF0aWMgdm9pZCBwY21jaWFfcmVsZWFzZV9idXNfc29ja2V0KHN0cnVjdCBrcmVmICpyZWZjb3VudCkKLXsKLQlzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMgPSBjb250YWluZXJfb2YocmVmY291bnQsIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCwgcmVmY291bnQpOwotCXBjbWNpYV9wdXRfc29ja2V0KHMtPnBhcmVudCk7Ci0Ja2ZyZWUocyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjbWNpYV9wdXRfYnVzX3NvY2tldChzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMpCi17Ci0Ja3JlZl9wdXQoJnMtPnJlZmNvdW50LCBwY21jaWFfcmVsZWFzZV9idXNfc29ja2V0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcGNtY2lhX2dldF9idXNfc29ja2V0KHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcykKLXsKLQlrcmVmX2dldCgmcy0+cmVmY291bnQpOwotCXJldHVybiAocyk7Ci19CiAKIC8qKgogICogcGNtY2lhX3JlZ2lzdGVyX2RyaXZlciAtIHJlZ2lzdGVyIGEgUENNQ0lBIGRyaXZlciB3aXRoIHRoZSBidXMgY29yZQpAQCAtMjkyLDYgKzMxMCw4IEBACiAJaWYgKCFkcml2ZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCisJcGNtY2lhX2NoZWNrX2RyaXZlcihkcml2ZXIpOworCiAJLyogaW5pdGlhbGl6ZSBjb21tb24gZmllbGRzICovCiAJZHJpdmVyLT5kcnYuYnVzID0gJnBjbWNpYV9idXNfdHlwZTsKIAlkcml2ZXItPmRydi5vd25lciA9IGRyaXZlci0+b3duZXI7CkBAIC0zMTEsNDIgKzMzMSwxMCBAQAogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfcGNjYXJkID0gTlVMTDsKLQotc3RhdGljIGludCBwcm9jX3JlYWRfZHJpdmVyc19jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyLCB2b2lkICpkKQotewotCWNoYXIgKipwID0gZDsKLQlzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqcF9kcnYgPSBjb250YWluZXJfb2YoZHJpdmVyLAotCQkJCQkJICAgc3RydWN0IHBjbWNpYV9kcml2ZXIsIGRydik7Ci0KLQkqcCArPSBzcHJpbnRmKCpwLCAiJS0yNC4yNHMgMSAlZFxuIiwgcF9kcnYtPmRydi5uYW1lLAotI2lmZGVmIENPTkZJR19NT0RVTEVfVU5MT0FECi0JCSAgICAgIChwX2Rydi0+b3duZXIpID8gbW9kdWxlX3JlZmNvdW50KHBfZHJ2LT5vd25lcikgOiAxCi0jZWxzZQotCQkgICAgICAxCi0jZW5kaWYKLQkpOwotCWQgPSAodm9pZCAqKSBwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvY19yZWFkX2RyaXZlcnMoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IHBvcywKLQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQljaGFyICpwID0gYnVmOwotCi0JYnVzX2Zvcl9lYWNoX2RydigmcGNtY2lhX2J1c190eXBlLCBOVUxMLCAKLQkJCSAodm9pZCAqKSAmcCwgcHJvY19yZWFkX2RyaXZlcnNfY2FsbGJhY2spOwotCi0JcmV0dXJuIChwIC0gYnVmKTsKLX0KLSNlbmRpZgogCiAvKiBwY21jaWFfZGV2aWNlIGhhbmRsaW5nICovCiAKLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBjbWNpYV9nZXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKK3N0cnVjdCBwY21jaWFfZGV2aWNlICogcGNtY2lhX2dldF9kZXYoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKnRtcF9kZXY7CiAJdG1wX2RldiA9IGdldF9kZXZpY2UoJnBfZGV2LT5kZXYpOwpAQCAtMzU1LDcgKzM0Myw3IEBACiAJcmV0dXJuIHRvX3BjbWNpYV9kZXYodG1wX2Rldik7CiB9CiAKLXN0YXRpYyB2b2lkIHBjbWNpYV9wdXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldikKK3ZvaWQgcGNtY2lhX3B1dF9kZXYoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQogewogCWlmIChwX2RldikKIAkJcHV0X2RldmljZSgmcF9kZXYtPmRldik7CkBAIC0zNjUsNyArMzUzLDcgQEAKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAJZHNfZGJnKDEsICJyZWxlYXNpbmcgZGV2ICVwXG4iLCBwX2Rldik7Ci0JcGNtY2lhX3B1dF9idXNfc29ja2V0KHBfZGV2LT5zb2NrZXQtPnBjbWNpYSk7CisJcGNtY2lhX3B1dF9zb2NrZXQocF9kZXYtPnNvY2tldCk7CiAJa2ZyZWUocF9kZXYpOwogfQogCkBAIC0zOTAsNyArMzc4LDcgQEAKIAogCWlmIChwX2Rydi0+YXR0YWNoKSB7CiAJCXBfZGV2LT5pbnN0YW5jZSA9IHBfZHJ2LT5hdHRhY2goKTsKLQkJaWYgKCghcF9kZXYtPmluc3RhbmNlKSB8fCAocF9kZXYtPmNsaWVudC5zdGF0ZSAmIENMSUVOVF9VTkJPVU5EKSkgeworCQlpZiAoKCFwX2Rldi0+aW5zdGFuY2UpIHx8IChwX2Rldi0+c3RhdGUgJiBDTElFTlRfVU5CT1VORCkpIHsKIAkJCXByaW50ayhLRVJOX05PVElDRSAiZHM6IHVuYWJsZSB0byBjcmVhdGUgaW5zdGFuY2UgIgogCQkJICAgICAgICJvZiAnJXMnIVxuIiwgcF9kcnYtPmRydi5uYW1lKTsKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC01MDAsNDIgKzQ4OCw0NSBAQAogICovCiBzdGF0aWMgREVDTEFSRV9NVVRFWChkZXZpY2VfYWRkX2xvY2spOwogCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2UgKiBwY21jaWFfZGV2aWNlX2FkZChzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbikKK3N0cnVjdCBwY21jaWFfZGV2aWNlICogcGNtY2lhX2RldmljZV9hZGQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbikKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXMgPSBwY21jaWFfZ2V0X2J1c19zb2NrZXQocyk7CisJcyA9IHBjbWNpYV9nZXRfc29ja2V0KHMpOwogCWlmICghcykKIAkJcmV0dXJuIE5VTEw7CiAKIAlkb3duKCZkZXZpY2VfYWRkX2xvY2spOwogCisJLyogbWF4IG9mIDIgZGV2aWNlcyBwZXIgY2FyZCAqLworCWlmIChzLT5kZXZpY2VfY291bnQgPT0gMikKKwkJZ290byBlcnJfcHV0OworCiAJcF9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNtY2lhX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghcF9kZXYpCiAJCWdvdG8gZXJyX3B1dDsKIAltZW1zZXQocF9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgcGNtY2lhX2RldmljZSkpOwogCi0JcF9kZXYtPnNvY2tldCA9IHMtPnBhcmVudDsKKwlwX2Rldi0+c29ja2V0ID0gczsKIAlwX2Rldi0+ZGV2aWNlX25vID0gKHMtPmRldmljZV9jb3VudCsrKTsKIAlwX2Rldi0+ZnVuYyAgID0gZnVuY3Rpb247CiAKIAlwX2Rldi0+ZGV2LmJ1cyA9ICZwY21jaWFfYnVzX3R5cGU7Ci0JcF9kZXYtPmRldi5wYXJlbnQgPSBzLT5wYXJlbnQtPmRldi5kZXY7CisJcF9kZXYtPmRldi5wYXJlbnQgPSBzLT5kZXYuZGV2OwogCXBfZGV2LT5kZXYucmVsZWFzZSA9IHBjbWNpYV9yZWxlYXNlX2RldjsKIAlzcHJpbnRmIChwX2Rldi0+ZGV2LmJ1c19pZCwgIiVkLiVkIiwgcF9kZXYtPnNvY2tldC0+c29jaywgcF9kZXYtPmRldmljZV9ubyk7CiAKIAkvKiBjb21wYXQgKi8KLQlwX2Rldi0+Y2xpZW50LmNsaWVudF9tYWdpYyA9IENMSUVOVF9NQUdJQzsKLQlwX2Rldi0+Y2xpZW50LlNvY2tldCA9IHMtPnBhcmVudDsKLQlwX2Rldi0+Y2xpZW50LkZ1bmN0aW9uID0gZnVuY3Rpb247Ci0JcF9kZXYtPmNsaWVudC5zdGF0ZSA9IENMSUVOVF9VTkJPVU5EOworCXBfZGV2LT5zdGF0ZSA9IENMSUVOVF9VTkJPVU5EOwogCiAJLyogQWRkIHRvIHRoZSBsaXN0IGluIHBjbWNpYV9idXNfc29ja2V0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmcF9kZXYtPnNvY2tldF9kZXZpY2VfbGlzdCwgJnMtPmRldmljZXNfbGlzdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKIAorCXBjbWNpYV9kZXZpY2VfcXVlcnkocF9kZXYpOworCiAJaWYgKGRldmljZV9yZWdpc3RlcigmcF9kZXYtPmRldikpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsKCZwX2Rldi0+c29ja2V0X2RldmljZV9saXN0KTsKQEAgLTU1Myw3ICs1NDQsNyBAQAogCXMtPmRldmljZV9jb3VudC0tOwogIGVycl9wdXQ6CiAJdXAoJmRldmljZV9hZGRfbG9jayk7Ci0JcGNtY2lhX3B1dF9idXNfc29ja2V0KHMpOworCXBjbWNpYV9wdXRfc29ja2V0KHMpOwogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC01ODEsMjYgKzU3MiwyNTMgQEAKIAllbHNlCiAJCW5vX2Z1bmNzID0gMTsKIAotCS8qIHRoaXMgZG9lc24ndCBoYW5kbGUgbXVsdGlmdW5jdGlvbiBkZXZpY2VzIG9uIG9uZSBwY21jaWEgZnVuY3Rpb24KLQkgKiB5ZXQuICovCiAJZm9yIChpPTA7IGkgPCBub19mdW5jczsgaSsrKQotCQlwY21jaWFfZGV2aWNlX2FkZChzLT5wY21jaWEsIGkpOworCQlwY21jaWFfZGV2aWNlX2FkZChzLCBpKTsKIAogCXJldHVybiAocmV0KTsKIH0KIAogCitzdGF0aWMgdm9pZCBwY21jaWFfZGVsYXllZF9hZGRfcHNldWRvX2RldmljZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gZGF0YTsKKwlwY21jaWFfZGV2aWNlX2FkZChzLCAwKTsKKwlzLT5wY21jaWFfc3RhdGUuZGV2aWNlX2FkZF9wZW5kaW5nID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBjbWNpYV9hZGRfcHNldWRvX2RldmljZShzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3sKKwlpZiAoIXMtPnBjbWNpYV9zdGF0ZS5kZXZpY2VfYWRkX3BlbmRpbmcpIHsKKwkJc2NoZWR1bGVfd29yaygmcy0+ZGV2aWNlX2FkZCk7CisJCXMtPnBjbWNpYV9zdGF0ZS5kZXZpY2VfYWRkX3BlbmRpbmcgPSAxOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgcGNtY2lhX3JlcXVlcnkoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICogX2RhdGEpCit7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOworCWlmICghcF9kZXYtPmRldi5kcml2ZXIpCisJCXBjbWNpYV9kZXZpY2VfcXVlcnkocF9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBjbWNpYV9idXNfcmVzY2FuKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpCit7CisJaW50IG5vX2RldmljZXM9MDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogbXVzdCBiZSBjYWxsZWQgd2l0aCBza3Rfc2VtIGhlbGQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmc2t0LT5kZXZpY2VzX2xpc3QpKQorCQlub19kZXZpY2VzPTE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKworCS8qIGlmIG5vIGRldmljZXMgd2VyZSBhZGRlZCBmb3IgdGhpcyBzb2NrZXQgeWV0IGJlY2F1c2Ugb2YKKwkgKiBtaXNzaW5nIHJlc291cmNlIGluZm9ybWF0aW9uIG9yIG90aGVyIHRyb3VibGUsIHdlIG5lZWQgdG8KKwkgKiBkbyB0aGlzIG5vdy4gKi8KKwlpZiAobm9fZGV2aWNlcykgeworCQlpbnQgcmV0ID0gcGNtY2lhX2NhcmRfYWRkKHNrdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm47CisJfQorCisJLyogc29tZSBkZXZpY2UgaW5mb3JtYXRpb24gbWlnaHQgaGF2ZSBjaGFuZ2VkIGJlY2F1c2Ugb2YgYSBDSVMKKwkgKiB1cGRhdGUgb3IgYmVjYXVzZSB3ZSBjYW4gZmluYWxseSByZWFkIGl0IGNvcnJlY3RseS4uLiBzbworCSAqIGRldGVybWluZSBpdCBhZ2Fpbiwgb3ZlcndyaXRpbmcgb2xkIHZhbHVlcyBpZiBuZWNlc3NhcnkuICovCisJYnVzX2Zvcl9lYWNoX2RldigmcGNtY2lhX2J1c190eXBlLCBOVUxMLCBOVUxMLCBwY21jaWFfcmVxdWVyeSk7CisKKwkvKiB3ZSByZS1zY2FuIGFsbCBkZXZpY2VzLCBub3QganVzdCB0aGUgb25lcyBjb25uZWN0ZWQgdG8gdGhpcworCSAqIHNvY2tldC4gVGhpcyBkb2VzIG5vdCBtYXR0ZXIsIHRob3VnaC4gKi8KKwlidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBjbWNpYV9kZXZtYXRjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgKmRpZCkKK3sKKwlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfTUFORl9JRCkgeworCQlpZiAoKCFkZXYtPmhhc19tYW5mX2lkKSB8fCAoZGV2LT5tYW5mX2lkICE9IGRpZC0+bWFuZl9pZCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCkgeworCQlpZiAoKCFkZXYtPmhhc19jYXJkX2lkKSB8fCAoZGV2LT5jYXJkX2lkICE9IGRpZC0+Y2FyZF9pZCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ1RJT04pIHsKKwkJaWYgKGRldi0+ZnVuYyAhPSBkaWQtPmZ1bmN0aW9uKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxKSB7CisJCWlmICghZGV2LT5wcm9kX2lkWzBdKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJjbXAoZGlkLT5wcm9kX2lkWzBdLCBkZXYtPnByb2RfaWRbMF0pKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyKSB7CisJCWlmICghZGV2LT5wcm9kX2lkWzFdKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJjbXAoZGlkLT5wcm9kX2lkWzFdLCBkZXYtPnByb2RfaWRbMV0pKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzKSB7CisJCWlmICghZGV2LT5wcm9kX2lkWzJdKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJjbXAoZGlkLT5wcm9kX2lkWzJdLCBkZXYtPnByb2RfaWRbMl0pKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQ0KSB7CisJCWlmICghZGV2LT5wcm9kX2lkWzNdKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdHJjbXAoZGlkLT5wcm9kX2lkWzNdLCBkZXYtPnByb2RfaWRbM10pKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTykgeworCQkvKiBoYW5kbGUgcHNldWRvIG11bHRpZnVuY3Rpb24gZGV2aWNlczoKKwkJICogdGhlcmUgYXJlIGF0IG1vc3QgdHdvIHBzZXVkbyBtdWx0aWZ1bmN0aW9uIGRldmljZXMuCisJCSAqIGlmIHdlJ3JlIG1hdGNoaW5nIGFnYWluc3QgdGhlIGZpcnN0LCBzY2hlZHVsZSBhCisJCSAqIGNhbGwgd2hpY2ggd2lsbCB0aGVuIGNoZWNrIHdoZXRoZXIgdGhlcmUgYXJlIHR3bworCQkgKiBwc2V1ZG8gZGV2aWNlcywgYW5kIGlmIG5vdCwgYWRkIHRoZSBzZWNvbmQgb25lLgorCQkgKi8KKwkJaWYgKGRldi0+ZGV2aWNlX25vID09IDApCisJCQlwY21jaWFfYWRkX3BzZXVkb19kZXZpY2UoZGV2LT5zb2NrZXQpOworCisJCWlmIChkZXYtPmRldmljZV9ubyAhPSBkaWQtPmRldmljZV9ubykKKwkJCXJldHVybiAwOworCX0KKworCWlmIChkaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DX0lEKSB7CisJCWlmICgoIWRldi0+aGFzX2Z1bmNfaWQpIHx8IChkZXYtPmZ1bmNfaWQgIT0gZGlkLT5mdW5jX2lkKSkKKwkJCXJldHVybiAwOworCisJCS8qIGlmIHRoaXMgaXMgYSBwc2V1ZG8tbXVsdGktZnVuY3Rpb24gZGV2aWNlLAorCQkgKiB3ZSBuZWVkIGV4cGxpY2l0IG1hdGNoZXMgKi8KKwkJaWYgKGRpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTykKKwkJCXJldHVybiAwOworCQlpZiAoZGV2LT5kZXZpY2Vfbm8pCisJCQlyZXR1cm4gMDsKKworCQkvKiBhbHNvLCBGVU5DX0lEIG1hdGNoaW5nIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCBieSB1c2Vyc3BhY2UKKwkJICogYWZ0ZXIgaXQgaGFzIHJlLWNoZWNrZWQgdGhhdCB0aGVyZSBpcyBubyBwb3NzaWJsZSBtb2R1bGUKKwkJICogd2l0aCBhIHByb2RfaWQvbWFuZl9pZC9jYXJkX2lkIG1hdGNoLgorCQkgKi8KKwkJaWYgKCFkZXYtPmFsbG93X2Z1bmNfaWRfbWF0Y2gpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMpIHsKKwkJaWYgKCFkZXYtPnNvY2tldC0+ZmFrZV9jaXMpCisJCQlwY21jaWFfbG9hZF9maXJtd2FyZShkZXYsIGRpZC0+Y2lzZmlsZSk7CisKKwkJaWYgKCFkZXYtPnNvY2tldC0+ZmFrZV9jaXMpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfQU5PTllNT1VTKSB7CisJCWludCBpOworCQlmb3IgKGk9MDsgaTw0OyBpKyspCisJCQlpZiAoZGV2LT5wcm9kX2lkW2ldKQorCQkJCXJldHVybiAwOworCQlpZiAoZGV2LT5oYXNfbWFuZl9pZCB8fCBkZXYtPmhhc19jYXJkX2lkIHx8IGRldi0+aGFzX2Z1bmNfaWQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYtPmRldi5kcml2ZXJfZGF0YSA9ICh2b2lkICopIGRpZDsKKworCXJldHVybiAxOworfQorCisKIHN0YXRpYyBpbnQgcGNtY2lhX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikgewogCXN0cnVjdCBwY21jaWFfZGV2aWNlICogcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAJc3RydWN0IHBjbWNpYV9kcml2ZXIgKiBwX2RydiA9IHRvX3BjbWNpYV9kcnYoZHJ2KTsKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCAqZGlkID0gcF9kcnYtPmlkX3RhYmxlOwogCiAJLyogbWF0Y2hpbmcgYnkgY2FyZG1nciAqLwogCWlmIChwX2Rldi0+Y2FyZG1nciA9PSBwX2RydikKIAkJcmV0dXJuIDE7CiAKKwl3aGlsZSAoZGlkICYmIGRpZC0+bWF0Y2hfZmxhZ3MpIHsKKwkJaWYgKHBjbWNpYV9kZXZtYXRjaChwX2RldiwgZGlkKSkKKwkJCXJldHVybiAxOworCQlkaWQrKzsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19IT1RQTFVHCisKK3N0YXRpYyBpbnQgcGNtY2lhX2J1c19ob3RwbHVnKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldjsKKwlpbnQgaSwgbGVuZ3RoID0gMDsKKwl1MzIgaGFzaFs0XSA9IHsgMCwgMCwgMCwgMH07CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwX2RldiA9IHRvX3BjbWNpYV9kZXYoZGV2KTsKKworCS8qIGNhbGN1bGF0ZSBoYXNoZXMgKi8KKwlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJaWYgKCFwX2Rldi0+cHJvZF9pZFtpXSkKKwkJCWNvbnRpbnVlOworCQloYXNoW2ldID0gY3JjMzIoMCwgcF9kZXYtPnByb2RfaWRbaV0sIHN0cmxlbihwX2Rldi0+cHJvZF9pZFtpXSkpOworCX0KKworCWkgPSAwOworCisJaWYgKGFkZF9ob3RwbHVnX2Vudl92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCWJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJIlNPQ0tFVF9OTz0ldSIsCisJCQkJcF9kZXYtPnNvY2tldC0+c29jaykpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGFkZF9ob3RwbHVnX2Vudl92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJCWJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkJIkRFVklDRV9OTz0lMDJYIiwKKwkJCQlwX2Rldi0+ZGV2aWNlX25vKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRkX2hvdHBsdWdfZW52X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCisJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCQkiTU9EQUxJQVM9cGNtY2lhOm0lMDRYYyUwNFhmJTAyWGZuJTAyWHBmbiUwMlgiCisJCQkJInBhJTA4WHBiJTA4WHBjJTA4WHBkJTA4WCIsCisJCQkJcF9kZXYtPmhhc19tYW5mX2lkID8gcF9kZXYtPm1hbmZfaWQgOiAwLAorCQkJCXBfZGV2LT5oYXNfY2FyZF9pZCA/IHBfZGV2LT5jYXJkX2lkIDogMCwKKwkJCQlwX2Rldi0+aGFzX2Z1bmNfaWQgPyBwX2Rldi0+ZnVuY19pZCA6IDAsCisJCQkJcF9kZXYtPmZ1bmMsCisJCQkJcF9kZXYtPmRldmljZV9ubywKKwkJCQloYXNoWzBdLAorCQkJCWhhc2hbMV0sCisJCQkJaGFzaFsyXSwKKwkJCQloYXNoWzNdKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnZwW2ldID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IHBjbWNpYV9idXNfaG90cGx1ZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCQkgICAgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogcGVyLWRldmljZSBzeXNmcyBvdXRwdXQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjZGVmaW5lIHBjbWNpYV9kZXZpY2VfYXR0cihmaWVsZCwgdGVzdCwgZm9ybWF0KQkJCQlcCkBAIC02MjYsNiArODQ0LDQzIEBACiBwY21jaWFfZGV2aWNlX3N0cmluZ2F0dHIocHJvZF9pZDMsIHByb2RfaWRbMl0pOwogcGNtY2lhX2RldmljZV9zdHJpbmdhdHRyKHByb2RfaWQ0LCBwcm9kX2lkWzNdKTsKIAorc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOworCWludCBpOworCXUzMiBoYXNoWzRdID0geyAwLCAwLCAwLCAwfTsKKworCS8qIGNhbGN1bGF0ZSBoYXNoZXMgKi8KKwlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJaWYgKCFwX2Rldi0+cHJvZF9pZFtpXSkKKwkJCWNvbnRpbnVlOworCQloYXNoW2ldID0gY3JjMzIoMCxwX2Rldi0+cHJvZF9pZFtpXSxzdHJsZW4ocF9kZXYtPnByb2RfaWRbaV0pKTsKKwl9CisJcmV0dXJuIHNwcmludGYoYnVmLCAicGNtY2lhOm0lMDRYYyUwNFhmJTAyWGZuJTAyWHBmbiUwMlgiCisJCQkJInBhJTA4WHBiJTA4WHBjJTA4WHBkJTA4WFxuIiwKKwkJCQlwX2Rldi0+aGFzX21hbmZfaWQgPyBwX2Rldi0+bWFuZl9pZCA6IDAsCisJCQkJcF9kZXYtPmhhc19jYXJkX2lkID8gcF9kZXYtPmNhcmRfaWQgOiAwLAorCQkJCXBfZGV2LT5oYXNfZnVuY19pZCA/IHBfZGV2LT5mdW5jX2lkIDogMCwKKwkJCQlwX2Rldi0+ZnVuYywgcF9kZXYtPmRldmljZV9ubywKKwkJCQloYXNoWzBdLCBoYXNoWzFdLCBoYXNoWzJdLCBoYXNoWzNdKTsKK30KKworc3RhdGljIHNzaXplX3QgcGNtY2lhX3N0b3JlX2FsbG93X2Z1bmNfaWRfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOworICAgICAgICBpZiAoIWNvdW50KQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJZG93bigmcF9kZXYtPnNvY2tldC0+c2t0X3NlbSk7CisJcF9kZXYtPmFsbG93X2Z1bmNfaWRfbWF0Y2ggPSAxOworCXVwKCZwX2Rldi0+c29ja2V0LT5za3Rfc2VtKTsKKworCWJ1c19yZXNjYW5fZGV2aWNlcygmcGNtY2lhX2J1c190eXBlKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjbWNpYV9kZXZfYXR0cnNbXSA9IHsKIAlfX0FUVFIoZnVuY3Rpb24sIDA0NDQsIGZ1bmNfc2hvdywgTlVMTCksCiAJX19BVFRSX1JPKGZ1bmNfaWQpLApAQCAtNjM1LDQ2ICs4OTAsMTQgQEAKIAlfX0FUVFJfUk8ocHJvZF9pZDIpLAogCV9fQVRUUl9STyhwcm9kX2lkMyksCiAJX19BVFRSX1JPKHByb2RfaWQ0KSwKKwlfX0FUVFJfUk8obW9kYWxpYXMpLAorCV9fQVRUUihhbGxvd19mdW5jX2lkX21hdGNoLCAwMjAwLCBOVUxMLCBwY21jaWFfc3RvcmVfYWxsb3dfZnVuY19pZF9tYXRjaCksCiAJX19BVFRSX05VTEwsCiB9OwogCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICAgVGhlc2UgbWFuYWdlIGEgcmluZyBidWZmZXIgb2YgZXZlbnRzIHBlbmRpbmcgZm9yIG9uZSB1c2VyIHByb2Nlc3MKLSAgICAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IHF1ZXVlX2VtcHR5KHVzZXJfaW5mb190ICp1c2VyKQotewotICAgIHJldHVybiAodXNlci0+ZXZlbnRfaGVhZCA9PSB1c2VyLT5ldmVudF90YWlsKTsKLX0KLQotc3RhdGljIGV2ZW50X3QgZ2V0X3F1ZXVlZF9ldmVudCh1c2VyX2luZm9fdCAqdXNlcikKLXsKLSAgICB1c2VyLT5ldmVudF90YWlsID0gKHVzZXItPmV2ZW50X3RhaWwrMSkgJSBNQVhfRVZFTlRTOwotICAgIHJldHVybiB1c2VyLT5ldmVudFt1c2VyLT5ldmVudF90YWlsXTsKLX0KLQotc3RhdGljIHZvaWQgcXVldWVfZXZlbnQodXNlcl9pbmZvX3QgKnVzZXIsIGV2ZW50X3QgZXZlbnQpCi17Ci0gICAgdXNlci0+ZXZlbnRfaGVhZCA9ICh1c2VyLT5ldmVudF9oZWFkKzEpICUgTUFYX0VWRU5UUzsKLSAgICBpZiAodXNlci0+ZXZlbnRfaGVhZCA9PSB1c2VyLT5ldmVudF90YWlsKQotCXVzZXItPmV2ZW50X3RhaWwgPSAodXNlci0+ZXZlbnRfdGFpbCsxKSAlIE1BWF9FVkVOVFM7Ci0gICAgdXNlci0+ZXZlbnRbdXNlci0+ZXZlbnRfaGVhZF0gPSBldmVudDsKLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX2V2ZW50KHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCkKLXsKLSAgICB1c2VyX2luZm9fdCAqdXNlcjsKLSAgICBmb3IgKHVzZXIgPSBzLT51c2VyOyB1c2VyOyB1c2VyID0gdXNlci0+bmV4dCkKLQlxdWV1ZV9ldmVudCh1c2VyLCBldmVudCk7Ci0gICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzLT5xdWV1ZSk7Ci19Ci0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KICAgICBUaGUgY2FyZCBzdGF0dXMgZXZlbnQgaGFuZGxlci4KICAgICAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNjg4LDYgKzkxMSw3IEBACiBzdGF0aWMgaW50IHNlbmRfZXZlbnRfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICogX2RhdGEpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gdG9fcGNtY2lhX2RldihkZXYpOworCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKIAlzdHJ1Y3Qgc2VuZF9ldmVudF9kYXRhICpkYXRhID0gX2RhdGE7CiAKIAkvKiB3ZSBnZXQgY2FsbGVkIGZvciBhbGwgc29ja2V0cywgYnV0IG1heSBvbmx5IHBhc3MgdGhlIGV2ZW50CkBAIC02OTUsMzIgKzkxOSwyOSBAQAogCWlmIChwX2Rldi0+c29ja2V0ICE9IGRhdGEtPnNrdCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocF9kZXYtPmNsaWVudC5zdGF0ZSAmIChDTElFTlRfVU5CT1VORHxDTElFTlRfU1RBTEUpKQorCXBfZHJ2ID0gdG9fcGNtY2lhX2RydihwX2Rldi0+ZGV2LmRyaXZlcik7CisJaWYgKCFwX2RydikKIAkJcmV0dXJuIDA7CiAKLQlpZiAocF9kZXYtPmNsaWVudC5FdmVudE1hc2sgJiBkYXRhLT5ldmVudCkKLQkJcmV0dXJuIEVWRU5UKCZwX2Rldi0+Y2xpZW50LCBkYXRhLT5ldmVudCwgZGF0YS0+cHJpb3JpdHkpOworCWlmIChwX2Rldi0+c3RhdGUgJiAoQ0xJRU5UX1VOQk9VTkR8Q0xJRU5UX1NUQUxFKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocF9kcnYtPmV2ZW50KQorCQlyZXR1cm4gcF9kcnYtPmV2ZW50KGRhdGEtPmV2ZW50LCBkYXRhLT5wcmlvcml0eSwKKwkJCQkgICAgJnBfZGV2LT5ldmVudF9jYWxsYmFja19hcmdzKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNlbmRfZXZlbnQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGV2ZW50X3QgZXZlbnQsIGludCBwcmlvcml0eSkKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgc2VuZF9ldmVudF9kYXRhIHByaXZhdGU7Ci0Jc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpza3QgPSBwY21jaWFfZ2V0X2J1c19zb2NrZXQocy0+cGNtY2lhKTsKLQotCWlmICghc2t0KQotCQlyZXR1cm4gMDsKIAogCXByaXZhdGUuc2t0ID0gczsKIAlwcml2YXRlLmV2ZW50ID0gZXZlbnQ7CiAJcHJpdmF0ZS5wcmlvcml0eSA9IHByaW9yaXR5OwogCi0JcmV0ID0gYnVzX2Zvcl9lYWNoX2RldigmcGNtY2lhX2J1c190eXBlLCBOVUxMLCAmcHJpdmF0ZSwgc2VuZF9ldmVudF9jYWxsYmFjayk7Ci0KLQlwY21jaWFfcHV0X2J1c19zb2NrZXQoc2t0KTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBidXNfZm9yX2VhY2hfZGV2KCZwY21jaWFfYnVzX3R5cGUsIE5VTEwsICZwcml2YXRlLCBzZW5kX2V2ZW50X2NhbGxiYWNrKTsKIH0gLyogc2VuZF9ldmVudCAqLwogCiAKQEAgLTczMSwyNSArOTUyLDI1IEBACiAKIHN0YXRpYyBpbnQgZHNfZXZlbnQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCwgZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5KQogewotCXN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcyA9IHNrdC0+cGNtY2lhOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcGNtY2lhX2dldF9zb2NrZXQoc2t0KTsKIAlpbnQgcmV0ID0gMDsKIAogCWRzX2RiZygxLCAiZHNfZXZlbnQoMHglMDZ4LCAlZCwgMHglcClcbiIsCi0JICAgICAgIGV2ZW50LCBwcmlvcml0eSwgcyk7CisJICAgICAgIGV2ZW50LCBwcmlvcml0eSwgc2t0KTsKICAgICAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAKIAljYXNlIENTX0VWRU5UX0NBUkRfUkVNT1ZBTDoKLQkJcy0+c3RhdGUgJj0gfkRTX1NPQ0tFVF9QUkVTRU5UOworCQlzLT5wY21jaWFfc3RhdGUucHJlc2VudCA9IDA7CiAJICAgIAlzZW5kX2V2ZW50KHNrdCwgZXZlbnQsIHByaW9yaXR5KTsKLQkJdW5iaW5kX3JlcXVlc3Qocyk7Ci0JCWhhbmRsZV9ldmVudChzLCBldmVudCk7CisJCXVuYmluZF9yZXF1ZXN0KHNrdCk7CisJCWhhbmRsZV9ldmVudChza3QsIGV2ZW50KTsKIAkJYnJlYWs7CiAJCiAJY2FzZSBDU19FVkVOVF9DQVJEX0lOU0VSVElPTjoKLQkJcy0+c3RhdGUgfD0gRFNfU09DS0VUX1BSRVNFTlQ7CisJCXMtPnBjbWNpYV9zdGF0ZS5wcmVzZW50ID0gMTsKIAkJcGNtY2lhX2NhcmRfYWRkKHNrdCk7Ci0JCWhhbmRsZV9ldmVudChzLCBldmVudCk7CisJCWhhbmRsZV9ldmVudChza3QsIGV2ZW50KTsKIAkJYnJlYWs7CiAKIAljYXNlIENTX0VWRU5UX0VKRUNUSU9OX1JFUVVFU1Q6CkBAIC03NTcsMTM4ICs5NzgsMjMgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQloYW5kbGVfZXZlbnQocywgZXZlbnQpOworCQloYW5kbGVfZXZlbnQoc2t0LCBldmVudCk7CiAJCXNlbmRfZXZlbnQoc2t0LCBldmVudCwgcHJpb3JpdHkpOwogCQlicmVhazsKICAgICB9CiAKKyAgICBwY21jaWFfcHV0X3NvY2tldChzKTsKKwogICAgIHJldHVybiAwOwogfSAvKiBkc19ldmVudCAqLwogCiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gICAgYmluZF9yZXF1ZXN0KCkgYW5kIGJpbmRfZGV2aWNlKCkgYXJlIG1lcmdlZCBieSBub3cuIFJlZ2lzdGVyX2NsaWVudCgpCi0gICAgaXMgY2FsbGVkIHJpZ2h0IGF0IHRoZSBlbmQgb2YgYmluZF9yZXF1ZXN0KCksIGR1cmluZyB0aGUgZHJpdmVyJ3MKLSAgICAtPmF0dGFjaCgpIGNhbGwuIEluZGl2aWR1YWwgZGVzY3JpcHRpb25zOgotCi0gICAgYmluZF9yZXF1ZXN0KCkgY29ubmVjdHMgYSBzb2NrZXQgdG8gYSBwYXJ0aWN1bGFyIGNsaWVudCBkcml2ZXIuCi0gICAgSXQgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBkZXZpY2UgSUQgaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZAotICAgIGRyaXZlcnMsIGJpbmRzIGl0IHRvIHRoZSBzb2NrZXQsIGFuZCB0cmllcyB0byBjcmVhdGUgYW4gaW5zdGFuY2UKLSAgICBvZiB0aGUgZGV2aWNlLiAgdW5iaW5kX3JlcXVlc3QoKSBkZWxldGVzIGEgZHJpdmVyIGluc3RhbmNlLgotICAgIAotICAgIEJpbmRfZGV2aWNlKCkgYXNzb2NpYXRlcyBhIGRldmljZSBkcml2ZXIgd2l0aCBhIHBhcnRpY3VsYXIgc29ja2V0LgotICAgIEl0IGlzIG5vcm1hbGx5IGNhbGxlZCBieSBEcml2ZXIgU2VydmljZXMgYWZ0ZXIgaXQgaGFzIGlkZW50aWZpZWQKLSAgICBhIG5ld2x5IGluc2VydGVkIGNhcmQuICBBbiBpbnN0YW5jZSBvZiB0aGF0IGRyaXZlciB3aWxsIHRoZW4gYmUKLSAgICBlbGlnaWJsZSB0byByZWdpc3RlciBhcyBhIGNsaWVudCBvZiB0aGlzIHNvY2tldC4KLQotICAgIFJlZ2lzdGVyX2NsaWVudCgpIHVzZXMgdGhlIGRldl9pbmZvX3QgaGFuZGxlIHRvIG1hdGNoIHRoZQotICAgIGNhbGxlciB3aXRoIGEgc29ja2V0LiAgVGhlIGRyaXZlciBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGJvdW5kCi0gICAgdG8gYSBzb2NrZXQgd2l0aCBiaW5kX2RldmljZSgpIC0tIGluIGZhY3QsIGJpbmRfZGV2aWNlKCkKLSAgICBhbGxvY2F0ZXMgdGhlIGNsaWVudCBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlIHVzZWQuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IGJpbmRfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnMsIGJpbmRfaW5mb190ICpiaW5kX2luZm8pCitpbnQgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqKmhhbmRsZSwgY2xpZW50X3JlZ190ICpyZXEpCiB7Ci0Jc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OwotCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldjsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcyA9IHBjbWNpYV9nZXRfYnVzX3NvY2tldChzKTsKLQlpZiAoIXMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZHNfZGJnKDIsICJiaW5kX3JlcXVlc3QoJWQsICclcycpXG4iLCBzLT5wYXJlbnQtPnNvY2ssCi0JICAgICAgIChjaGFyICopYmluZF9pbmZvLT5kZXZfaW5mbyk7Ci0KLQlwX2RydiA9IGdldF9wY21jaWFfZHJpdmVyKCZiaW5kX2luZm8tPmRldl9pbmZvKTsKLQlpZiAoIXBfZHJ2KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3B1dDsKLQl9Ci0KLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHBfZHJ2LT5vd25lcikpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcHV0X2RyaXZlcjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLSAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KSB7Ci0JCWlmIChwX2Rldi0+ZnVuYyA9PSBiaW5kX2luZm8tPmZ1bmN0aW9uKSB7Ci0JCQlpZiAoKHBfZGV2LT5kZXYuZHJpdmVyID09ICZwX2Rydi0+ZHJ2KSkgewotCQkJCWlmIChwX2Rldi0+Y2FyZG1ncikgewotCQkJCQkvKiBpZiB0aGVyZSdzIGFscmVhZHkgYSBkZXZpY2UKLQkJCQkJICogcmVnaXN0ZXJlZCwgYW5kIGl0IHdhcyByZWdpc3RlcmVkCi0JCQkJCSAqIGJ5IHVzZXJzcGFjZSBiZWZvcmUsIHdlIG5lZWQgdG8KLQkJCQkJICogcmV0dXJuIHRoZSAiaW5zdGFuY2UiLiAqLwotCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCQkJCQliaW5kX2luZm8tPmluc3RhbmNlID0gcF9kZXYtPmluc3RhbmNlOwotCQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQkJCWdvdG8gZXJyX3B1dF9tb2R1bGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogdGhlIGNvcnJlY3QgZHJpdmVyIG1hbmFnZWQgdG8gYmluZAotCQkJCQkgKiBpdHNlbGYgbWFnaWNhbGx5IHRvIHRoZSBjb3JyZWN0Ci0JCQkJCSAqIGRldmljZS4gKi8KLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQkJCQkJcF9kZXYtPmNhcmRtZ3IgPSBwX2RydjsKLQkJCQkJcmV0ID0gMDsKLQkJCQkJZ290byBlcnJfcHV0X21vZHVsZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCFwX2Rldi0+ZGV2LmRyaXZlcikgewotCQkJCS8qIHRoZXJlJ3MgYWxyZWFkeSBhIGRldmljZSBhdmFpbGFibGUgd2hlcmUKLQkJCQkgKiBubyBkZXZpY2UgaGFzIGJlZW4gYm91bmQgdG8geWV0LiBTbyB3ZSBkb24ndAotCQkJCSAqIG5lZWQgdG8gcmVnaXN0ZXIgYSBkZXZpY2UhICovCi0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKLQkJCQlnb3RvIHJlc2NhbjsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JcF9kZXYgPSBwY21jaWFfZGV2aWNlX2FkZChzLCBiaW5kX2luZm8tPmZ1bmN0aW9uKTsKLQlpZiAoIXBfZGV2KSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZXJyX3B1dF9tb2R1bGU7Ci0JfQotCi1yZXNjYW46Ci0JcF9kZXYtPmNhcmRtZ3IgPSBwX2RydjsKLQotCXBjbWNpYV9kZXZpY2VfcXVlcnkocF9kZXYpOwotCi0JLyoKLQkgKiBQcmV2ZW50IHRoaXMgcmFjaW5nIHdpdGggYSBjYXJkIGluc2VydGlvbi4KLQkgKi8KLQlkb3duKCZzLT5wYXJlbnQtPnNrdF9zZW0pOwotCWJ1c19yZXNjYW5fZGV2aWNlcygmcGNtY2lhX2J1c190eXBlKTsKLQl1cCgmcy0+cGFyZW50LT5za3Rfc2VtKTsKLQotCS8qIGNoZWNrIHdoZXRoZXIgdGhlIGRyaXZlciBpbmRlZWQgbWF0Y2hlZC4gSSBkb24ndCBjYXJlIGlmIHRoaXMKLQkgKiBpcyByYWN5IG9yIG5vdCwgYmVjYXVzZSBpdCBjYW4gb25seSBoYXBwZW4gb24gY2FyZG1nciBhY2Nlc3MKLQkgKiBwYXRocy4uLgotCSAqLwotCWlmICghKHBfZGV2LT5kZXYuZHJpdmVyID09ICZwX2Rydi0+ZHJ2KSkKLQkJcF9kZXYtPmNhcmRtZ3IgPSBOVUxMOwotCi0gZXJyX3B1dF9tb2R1bGU6Ci0JbW9kdWxlX3B1dChwX2Rydi0+b3duZXIpOwotIGVycl9wdXRfZHJpdmVyOgotCXB1dF9kcml2ZXIoJnBfZHJ2LT5kcnYpOwotIGVycl9wdXQ6Ci0JcGNtY2lhX3B1dF9idXNfc29ja2V0KHMpOwotCi0JcmV0dXJuIChyZXQpOwotfSAvKiBiaW5kX3JlcXVlc3QgKi8KLQotCi1pbnQgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgKmhhbmRsZSwgY2xpZW50X3JlZ190ICpyZXEpCi17Ci0JY2xpZW50X3QgKmNsaWVudCA9IE5VTEw7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0Jc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpza3QgPSBOVUxMOworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gTlVMTDsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSBOVUxMOworCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydiA9IE5VTEw7CiAKIAkvKiBMb29rIGZvciB1bmJvdW5kIGNsaWVudCB3aXRoIG1hdGNoaW5nIGRldl9pbmZvICovCiAJZG93bl9yZWFkKCZwY21jaWFfc29ja2V0X2xpc3RfcndzZW0pOwpAQCAtODk4LDU2ICsxMDA0LDQ1IEBACiAJCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKQogCQkJY29udGludWU7CiAKLQkJc2t0ID0gcy0+cGNtY2lhOwotCQlpZiAoIXNrdCkKLQkJCWNvbnRpbnVlOwotCQlza3QgPSBwY21jaWFfZ2V0X2J1c19zb2NrZXQoc2t0KTsKLQkJaWYgKCFza3QpCisJCXMgPSBwY21jaWFfZ2V0X3NvY2tldChzKTsKKwkJaWYgKCFzKQogCQkJY29udGludWU7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfZGV2LCAmc2t0LT5kZXZpY2VzX2xpc3QsIHNvY2tldF9kZXZpY2VfbGlzdCkgewotCQkJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBfZGV2LCAmcy0+ZGV2aWNlc19saXN0LCBzb2NrZXRfZGV2aWNlX2xpc3QpIHsKIAkJCXBfZGV2ID0gcGNtY2lhX2dldF9kZXYocF9kZXYpOwogCQkJaWYgKCFwX2RldikKIAkJCQljb250aW51ZTsKLQkJCWlmICghKHBfZGV2LT5jbGllbnQuc3RhdGUgJiBDTElFTlRfVU5CT1VORCkgfHwKKwkJCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9VTkJPVU5EKSB8fAogCQkJICAgICghcF9kZXYtPmRldi5kcml2ZXIpKSB7CiAJCQkJcGNtY2lhX3B1dF9kZXYocF9kZXYpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQkJcF9kcnYgPSB0b19wY21jaWFfZHJ2KHBfZGV2LT5kZXYuZHJpdmVyKTsKIAkJCWlmICghc3RybmNtcChwX2Rydi0+ZHJ2Lm5hbWUsIChjaGFyICopcmVxLT5kZXZfaW5mbywgREVWX05BTUVfTEVOKSkgewotCQkJCWNsaWVudCA9ICZwX2Rldi0+Y2xpZW50OwogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJCQkJZ290byBmb3VuZDsKIAkJCX0KIAkJCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCQlwY21jaWFfcHV0X2J1c19zb2NrZXQoc2t0KTsKKwkJcGNtY2lhX3B1dF9zb2NrZXQocyk7CiAJfQogIGZvdW5kOgogCXVwX3JlYWQoJnBjbWNpYV9zb2NrZXRfbGlzdF9yd3NlbSk7Ci0JaWYgKCFwX2RldiB8fCAhY2xpZW50KQorCWlmICghcF9kZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcGNtY2lhX3B1dF9idXNfc29ja2V0KHNrdCk7IC8qIHNhZmUsIGFzIHdlIGFscmVhZHkgaG9sZCBhIHJlZmVyZW5jZSBmcm9tIGJpbmRfZGV2aWNlICovCisJcGNtY2lhX3B1dF9zb2NrZXQocyk7IC8qIHNhZmUsIGFzIHdlIGFscmVhZHkgaG9sZCBhIHJlZmVyZW5jZSBmcm9tIGJpbmRfZGV2aWNlICovCiAKLQkqaGFuZGxlID0gY2xpZW50OwotCWNsaWVudC0+c3RhdGUgJj0gfkNMSUVOVF9VTkJPVU5EOwotCWNsaWVudC0+U29ja2V0ID0gczsKLQljbGllbnQtPkV2ZW50TWFzayA9IHJlcS0+RXZlbnRNYXNrOwotCWNsaWVudC0+ZXZlbnRfaGFuZGxlciA9IHJlcS0+ZXZlbnRfaGFuZGxlcjsKLQljbGllbnQtPmV2ZW50X2NhbGxiYWNrX2FyZ3MgPSByZXEtPmV2ZW50X2NhbGxiYWNrX2FyZ3M7Ci0JY2xpZW50LT5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9oYW5kbGUgPSBjbGllbnQ7CisJKmhhbmRsZSA9IHBfZGV2OworCXBfZGV2LT5zdGF0ZSAmPSB+Q0xJRU5UX1VOQk9VTkQ7CisJcF9kZXYtPmV2ZW50X2NhbGxiYWNrX2FyZ3MgPSByZXEtPmV2ZW50X2NhbGxiYWNrX2FyZ3M7CisJcF9kZXYtPmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2hhbmRsZSA9IHBfZGV2OwogCi0JaWYgKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpCi0JCWNsaWVudC0+c3RhdGUgfD0gQ0xJRU5UX0NBUkRCVVM7CiAKLQlpZiAoKCEocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykpICYmIChzLT5mdW5jdGlvbnMgPT0gMCkgJiYKLQkgICAgKGNsaWVudC0+RnVuY3Rpb24gIT0gQklORF9GTl9BTEwpKSB7CisJaWYgKCFzLT5mdW5jdGlvbnMpIHsKIAkJY2lzdHBsX2xvbmdsaW5rX21mY190IG1mYzsKLQkJaWYgKHBjY2FyZF9yZWFkX3R1cGxlKHMsIGNsaWVudC0+RnVuY3Rpb24sIENJU1RQTF9MT05HTElOS19NRkMsICZtZmMpCisJCWlmIChwY2NhcmRfcmVhZF90dXBsZShzLCBwX2Rldi0+ZnVuYywgQ0lTVFBMX0xPTkdMSU5LX01GQywgJm1mYykKIAkJICAgID09IENTX1NVQ0NFU1MpCiAJCQlzLT5mdW5jdGlvbnMgPSBtZmMubmZuOwogCQllbHNlCkBAIC05NjAsMTMgKzEwNTUsMTMgQEAKIAl9CiAKIAlkc19kYmcoMSwgInJlZ2lzdGVyX2NsaWVudCgpOiBjbGllbnQgMHglcCwgZGV2ICVzXG4iLAotCSAgICAgICBjbGllbnQsIHBfZGV2LT5kZXYuYnVzX2lkKTsKLQlpZiAoY2xpZW50LT5FdmVudE1hc2sgJiBDU19FVkVOVF9SRUdJU1RSQVRJT05fQ09NUExFVEUpCi0JCUVWRU5UKGNsaWVudCwgQ1NfRVZFTlRfUkVHSVNUUkFUSU9OX0NPTVBMRVRFLCBDU19FVkVOVF9QUklfTE9XKTsKKwkgICAgICAgcF9kZXYsIHBfZGV2LT5kZXYuYnVzX2lkKTsKIAogCWlmICgocy0+c3RhdGUgJiAoU09DS0VUX1BSRVNFTlR8U09DS0VUX0NBUkRCVVMpKSA9PSBTT0NLRVRfUFJFU0VOVCkgewotCQlpZiAoY2xpZW50LT5FdmVudE1hc2sgJiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikKLQkJCUVWRU5UKGNsaWVudCwgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04sIENTX0VWRU5UX1BSSV9MT1cpOworCQlpZiAocF9kcnYtPmV2ZW50KQorCQkJcF9kcnYtPmV2ZW50KENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OLCBDU19FVkVOVF9QUklfTE9XLAorCQkJCSAgICAgJnBfZGV2LT5ldmVudF9jYWxsYmFja19hcmdzKTsKKwogCX0KIAogCXJldHVybiBDU19TVUNDRVNTOwpAQCAtOTc4LDEwNiArMTA3MywxNSBAQAogRVhQT1JUX1NZTUJPTChwY21jaWFfcmVnaXN0ZXJfY2xpZW50KTsKIAogCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotZXh0ZXJuIHN0cnVjdCBwY2lfYnVzICpwY21jaWFfbG9va3VwX2J1cyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyk7Ci0KLXN0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmZvKHN0cnVjdCBwY21jaWFfYnVzX3NvY2tldCAqcywgYmluZF9pbmZvX3QgKmJpbmRfaW5mbywgaW50IGZpcnN0KQotewotCWRldl9ub2RlX3QgKm5vZGU7Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLSNpZmRlZiBDT05GSUdfQ0FSREJVUwotCS8qCi0JICogU29tZSB1bmJlbGlldmFibHkgdWdseSBjb2RlIHRvIGFzc29jaWF0ZSB0aGUgUENJIGNhcmRidXMKLQkgKiBkZXZpY2UgYW5kIGl0cyBkcml2ZXIgd2l0aCB0aGUgUENNQ0lBICJiaW5kIiBpbmZvcm1hdGlvbi4KLQkgKi8KLQl7Ci0JCXN0cnVjdCBwY2lfYnVzICpidXM7Ci0KLQkJYnVzID0gcGNtY2lhX2xvb2t1cF9idXMocy0+cGFyZW50KTsKLQkJaWYgKGJ1cykgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQkJCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCi0JCQlsaXN0ID0gYnVzLT5kZXZpY2VzLm5leHQ7Ci0JCQl3aGlsZSAobGlzdCAhPSAmYnVzLT5kZXZpY2VzKSB7Ci0JCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwY2lfZGV2X2IobGlzdCk7Ci0JCQkJbGlzdCA9IGxpc3QtPm5leHQ7Ci0KLQkJCQlpZiAoZmlyc3QpIHsKLQkJCQkJZGV2ID0gcGRldjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLyogVHJ5IHRvIGhhbmRsZSAibmV4dCIgaGVyZSBzb21lIHdheT8gKi8KLQkJCX0KLQkJCWlmIChkZXYgJiYgZGV2LT5kcml2ZXIpIHsKLQkJCQlzdHJsY3B5KGJpbmRfaW5mby0+bmFtZSwgZGV2LT5kcml2ZXItPm5hbWUsIERFVl9OQU1FX0xFTik7Ci0JCQkJYmluZF9pbmZvLT5tYWpvciA9IDA7Ci0JCQkJYmluZF9pbmZvLT5taW5vciA9IDA7Ci0JCQkJYmluZF9pbmZvLT5uZXh0ID0gTlVMTDsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KSB7Ci0JCWlmIChwX2Rldi0+ZnVuYyA9PSBiaW5kX2luZm8tPmZ1bmN0aW9uKSB7Ci0JCQlwX2RldiA9IHBjbWNpYV9nZXRfZGV2KHBfZGV2KTsKLQkJCWlmICghcF9kZXYpCi0JCQkJY29udGludWU7Ci0JCQlnb3RvIGZvdW5kOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIC1FTk9ERVY7Ci0KLSBmb3VuZDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCghcF9kZXYtPmluc3RhbmNlKSB8fAotCSAgICAocF9kZXYtPmluc3RhbmNlLT5zdGF0ZSAmIERFVl9DT05GSUdfUEVORElORykpIHsKLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBlcnJfcHV0OwotCX0KLQotCWlmIChmaXJzdCkKLQkJbm9kZSA9IHBfZGV2LT5pbnN0YW5jZS0+ZGV2OwotCWVsc2UKLQkJZm9yIChub2RlID0gcF9kZXYtPmluc3RhbmNlLT5kZXY7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQotCQkJaWYgKG5vZGUgPT0gYmluZF9pbmZvLT5uZXh0KQotCQkJCWJyZWFrOwotCWlmICghbm9kZSkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycl9wdXQ7Ci0JfQotCi0Jc3RybGNweShiaW5kX2luZm8tPm5hbWUsIG5vZGUtPmRldl9uYW1lLCBERVZfTkFNRV9MRU4pOwotCWJpbmRfaW5mby0+bWFqb3IgPSBub2RlLT5tYWpvcjsKLQliaW5kX2luZm8tPm1pbm9yID0gbm9kZS0+bWlub3I7Ci0JYmluZF9pbmZvLT5uZXh0ID0gbm9kZS0+bmV4dDsKLQotIGVycl9wdXQ6Ci0JcGNtY2lhX3B1dF9kZXYocF9kZXYpOwotCXJldHVybiAocmV0KTsKLX0gLyogZ2V0X2RldmljZV9pbmZvICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCiAvKiB1bmJpbmQgX2FsbF8gZGV2aWNlcyBhdHRhY2hlZCB0byBhIGdpdmVuIHBjbWNpYV9idXNfc29ja2V0LiBUaGUKICAqIGRyaXZlcnMgaGF2ZSBiZWVuIGNhbGxlZCB3aXRoIEVWRU5UX0NBUkRfUkVNT1ZBTCBiZWZvcmUuCiAgKi8KLXN0YXRpYyBpbnQgdW5iaW5kX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzKQorc3RhdGljIGludCB1bmJpbmRfcmVxdWVzdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZQkqcF9kZXY7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKLQlkc19kYmcoMiwgInVuYmluZF9yZXF1ZXN0KCVkKVxuIiwgcy0+cGFyZW50LT5zb2NrKTsKKwlkc19kYmcoMiwgInVuYmluZF9yZXF1ZXN0KCVkKVxuIiwgcy0+c29jayk7CiAKIAlzLT5kZXZpY2VfY291bnQgPSAwOwogCkBAIC0xMDkwLDcgKzEwOTQsNyBAQAogCQl9CiAJCXBfZGV2ID0gbGlzdF9lbnRyeSgoJnMtPmRldmljZXNfbGlzdCktPm5leHQsIHN0cnVjdCBwY21jaWFfZGV2aWNlLCBzb2NrZXRfZGV2aWNlX2xpc3QpOwogCQlsaXN0X2RlbCgmcF9kZXYtPnNvY2tldF9kZXZpY2VfbGlzdCk7Ci0JCXBfZGV2LT5jbGllbnQuc3RhdGUgfD0gQ0xJRU5UX1NUQUxFOworCQlwX2Rldi0+c3RhdGUgfD0gQ0xJRU5UX1NUQUxFOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwogCiAJCWRldmljZV91bnJlZ2lzdGVyKCZwX2Rldi0+ZGV2KTsKQEAgLTEwOTksMzEgKzExMDMsMjUgQEAKIAlyZXR1cm4gMDsKIH0gLyogdW5iaW5kX3JlcXVlc3QgKi8KIAotaW50IHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgaGFuZGxlKQoraW50IHBjbWNpYV9kZXJlZ2lzdGVyX2NsaWVudChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CiAJaW50IGk7Ci0Jc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2ID0gaGFuZGxlX3RvX3BkZXYoaGFuZGxlKTsKIAotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJcyA9IHBfZGV2LT5zb2NrZXQ7CisJZHNfZGJnKDEsICJkZXJlZ2lzdGVyX2NsaWVudCglcClcbiIsIHBfZGV2KTsKIAotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlkc19kYmcoMSwgImRlcmVnaXN0ZXJfY2xpZW50KCVwKVxuIiwgaGFuZGxlKTsKLQotCWlmIChoYW5kbGUtPnN0YXRlICYgKENMSUVOVF9JUlFfUkVRfENMSUVOVF9JT19SRVF8Q0xJRU5UX0NPTkZJR19MT0NLRUQpKQorCWlmIChwX2Rldi0+c3RhdGUgJiAoQ0xJRU5UX0lSUV9SRVF8Q0xJRU5UX0lPX1JFUXxDTElFTlRfQ09ORklHX0xPQ0tFRCkpCiAJCWdvdG8gd2Fybl9vdXQ7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9XSU47IGkrKykKLQkJaWYgKGhhbmRsZS0+c3RhdGUgJiBDTElFTlRfV0lOX1JFUShpKSkKKwkJaWYgKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9XSU5fUkVRKGkpKQogCQkJZ290byB3YXJuX291dDsKIAotCWlmIChoYW5kbGUtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSB7Ci0JCWhhbmRsZS0+Y2xpZW50X21hZ2ljID0gMDsKLQkJaGFuZGxlLT5zdGF0ZSAmPSB+Q0xJRU5UX1NUQUxFOworCWlmIChwX2Rldi0+c3RhdGUgJiBDTElFTlRfU1RBTEUpIHsKKwkJcF9kZXYtPnN0YXRlICY9IH5DTElFTlRfU1RBTEU7CiAJCXBjbWNpYV9wdXRfZGV2KHBfZGV2KTsKIAl9IGVsc2UgewotCQloYW5kbGUtPnN0YXRlID0gQ0xJRU5UX1VOQk9VTkQ7Ci0JCWhhbmRsZS0+ZXZlbnRfaGFuZGxlciA9IE5VTEw7CisJCXBfZGV2LT5zdGF0ZSA9IENMSUVOVF9VTkJPVU5EOwogCX0KIAogCXJldHVybiBDU19TVUNDRVNTOwpAQCAtMTEzMyw0MzMgKzExMzEsNTggQEAKIH0gLyogZGVyZWdpc3Rlcl9jbGllbnQgKi8KIEVYUE9SVF9TWU1CT0wocGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KTsKIAotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgIFRoZSB1c2VyLW1vZGUgUEMgQ2FyZCBkZXZpY2UgaW50ZXJmYWNlCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgaW50IGRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0gICAgc29ja2V0X3QgaSA9IGltaW5vcihpbm9kZSk7Ci0gICAgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotCi0gICAgZHNfZGJnKDAsICJkc19vcGVuKHNvY2tldCAlZClcbiIsIGkpOwotCi0gICAgcyA9IGdldF9zb2NrZXRfaW5mb19ieV9ucihpKTsKLSAgICBpZiAoIXMpCi0JICAgIHJldHVybiAtRU5PREVWOwotICAgIHMgPSBwY21jaWFfZ2V0X2J1c19zb2NrZXQocyk7Ci0gICAgaWYgKCFzKQotCSAgICByZXR1cm4gLUVOT0RFVjsKLQotICAgIGlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKLQkgICAgaWYgKHMtPnN0YXRlICYgRFNfU09DS0VUX0JVU1kpIHsKLQkJICAgIHBjbWNpYV9wdXRfYnVzX3NvY2tldChzKTsKLQkJICAgIHJldHVybiAtRUJVU1k7Ci0JICAgIH0KLQllbHNlCi0JICAgIHMtPnN0YXRlIHw9IERTX1NPQ0tFVF9CVVNZOwotICAgIH0KLSAgICAKLSAgICB1c2VyID0ga21hbGxvYyhzaXplb2YodXNlcl9pbmZvX3QpLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoIXVzZXIpIHsKLQkgICAgcGNtY2lhX3B1dF9idXNfc29ja2V0KHMpOwotCSAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0gICAgdXNlci0+ZXZlbnRfdGFpbCA9IHVzZXItPmV2ZW50X2hlYWQgPSAwOwotICAgIHVzZXItPm5leHQgPSBzLT51c2VyOwotICAgIHVzZXItPnVzZXJfbWFnaWMgPSBVU0VSX01BR0lDOwotICAgIHVzZXItPnNvY2tldCA9IHM7Ci0gICAgcy0+dXNlciA9IHVzZXI7Ci0gICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gdXNlcjsKLSAgICAKLSAgICBpZiAocy0+c3RhdGUgJiBEU19TT0NLRVRfUFJFU0VOVCkKLQlxdWV1ZV9ldmVudCh1c2VyLCBDU19FVkVOVF9DQVJEX0lOU0VSVElPTik7Ci0gICAgcmV0dXJuIDA7Ci19IC8qIGRzX29wZW4gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBpbnQgZHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnM7Ci0gICAgdXNlcl9pbmZvX3QgKnVzZXIsICoqbGluazsKLQotICAgIGRzX2RiZygwLCAiZHNfcmVsZWFzZShzb2NrZXQgJWQpXG4iLCBpbWlub3IoaW5vZGUpKTsKLQotICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgaWYgKENIRUNLX1VTRVIodXNlcikpCi0JZ290byBvdXQ7Ci0KLSAgICBzID0gdXNlci0+c29ja2V0OwotCi0gICAgLyogVW5saW5rIHVzZXIgZGF0YSBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7Ci0Jcy0+c3RhdGUgJj0gfkRTX1NPQ0tFVF9CVVNZOwotICAgIH0KLSAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotICAgIGZvciAobGluayA9ICZzLT51c2VyOyAqbGluazsgbGluayA9ICYoKmxpbmspLT5uZXh0KQotCWlmICgqbGluayA9PSB1c2VyKSBicmVhazsKLSAgICBpZiAobGluayA9PSBOVUxMKQotCWdvdG8gb3V0OwotICAgICpsaW5rID0gdXNlci0+bmV4dDsKLSAgICB1c2VyLT51c2VyX21hZ2ljID0gMDsKLSAgICBrZnJlZSh1c2VyKTsKLSAgICBwY21jaWFfcHV0X2J1c19zb2NrZXQocyk7Ci1vdXQ6Ci0gICAgcmV0dXJuIDA7Ci19IC8qIGRzX3JlbGVhc2UgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBzc2l6ZV90IGRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLSAgICBzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnM7Ci0gICAgdXNlcl9pbmZvX3QgKnVzZXI7Ci0gICAgaW50IHJldDsKLQotICAgIGRzX2RiZygyLCAiZHNfcmVhZChzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKLSAgICAKLSAgICBpZiAoY291bnQgPCA0KQotCXJldHVybiAtRUlOVkFMOwotCi0gICAgdXNlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICBpZiAoQ0hFQ0tfVVNFUih1c2VyKSkKLQlyZXR1cm4gLUVJTzsKLSAgICAKLSAgICBzID0gdXNlci0+c29ja2V0OwotICAgIGlmIChzLT5zdGF0ZSAmIERTX1NPQ0tFVF9ERUFEKQotICAgICAgICByZXR1cm4gLUVJTzsKLQotICAgIHJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzLT5xdWV1ZSwgIXF1ZXVlX2VtcHR5KHVzZXIpKTsKLSAgICBpZiAocmV0ID09IDApCi0JcmV0ID0gcHV0X3VzZXIoZ2V0X3F1ZXVlZF9ldmVudCh1c2VyKSwgKGludCBfX3VzZXIgKilidWYpID8gLUVGQVVMVCA6IDQ7Ci0KLSAgICByZXR1cm4gcmV0OwotfSAvKiBkc19yZWFkICovCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgc3NpemVfdCBkc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotICAgIGRzX2RiZygyLCAiZHNfd3JpdGUoc29ja2V0ICVkKVxuIiwgaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7Ci0KLSAgICBpZiAoY291bnQgIT0gNCkKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQotCXJldHVybiAtRUJBREY7Ci0KLSAgICByZXR1cm4gLUVJTzsKLX0gLyogZHNfd3JpdGUgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLwotc3RhdGljIHVfaW50IGRzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzOwotICAgIHVzZXJfaW5mb190ICp1c2VyOwotCi0gICAgZHNfZGJnKDIsICJkc19wb2xsKHNvY2tldCAlZClcbiIsIGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOwotICAgIAotICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgaWYgKENIRUNLX1VTRVIodXNlcikpCi0JcmV0dXJuIFBPTExFUlI7Ci0gICAgcyA9IHVzZXItPnNvY2tldDsKLSAgICAvKgotICAgICAqIFdlIGRvbid0IGNoZWNrIGZvciBhIGRlYWQgc29ja2V0IGhlcmUgc2luY2UgdGhhdAotICAgICAqIHdpbGwgc2VuZCBjYXJkbWdyIGludG8gYW4gZW5kbGVzcyBzcGluLgotICAgICAqLwotICAgIHBvbGxfd2FpdChmaWxlLCAmcy0+cXVldWUsIHdhaXQpOwotICAgIGlmICghcXVldWVfZW1wdHkodXNlcikpCi0JcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0gICAgcmV0dXJuIDA7Ci19IC8qIGRzX3BvbGwgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLWV4dGVybiBpbnQgcGNtY2lhX2FkanVzdF9yZXNvdXJjZV9pbmZvKGFkanVzdF90ICphZGopOwotCi1zdGF0aWMgaW50IGRzX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCi0JCSAgICB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCi17Ci0gICAgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICpzOwotICAgIHZvaWQgX191c2VyICp1YXJnID0gKGNoYXIgX191c2VyICopYXJnOwotICAgIHVfaW50IHNpemU7Ci0gICAgaW50IHJldCwgZXJyOwotICAgIGRzX2lvY3RsX2FyZ190ICpidWY7Ci0gICAgdXNlcl9pbmZvX3QgKnVzZXI7Ci0KLSAgICBkc19kYmcoMiwgImRzX2lvY3RsKHNvY2tldCAlZCwgJSN4LCAlI2x4KVxuIiwgaW1pbm9yKGlub2RlKSwgY21kLCBhcmcpOwotICAgIAotICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgaWYgKENIRUNLX1VTRVIodXNlcikpCi0JcmV0dXJuIC1FSU87Ci0KLSAgICBzID0gdXNlci0+c29ja2V0OwotICAgIGlmIChzLT5zdGF0ZSAmIERTX1NPQ0tFVF9ERUFEKQotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICAKLSAgICBzaXplID0gKGNtZCAmIElPQ1NJWkVfTUFTSykgPj4gSU9DU0laRV9TSElGVDsKLSAgICBpZiAoc2l6ZSA+IHNpemVvZihkc19pb2N0bF9hcmdfdCkpIHJldHVybiAtRUlOVkFMOwotCi0gICAgLyogUGVybWlzc2lvbiBjaGVjayAqLwotICAgIGlmICghKGNtZCAmIElPQ19PVVQpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQotCXJldHVybiAtRVBFUk07Ci0JCi0gICAgaWYgKGNtZCAmIElPQ19JTikgewotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1YXJnLCBzaXplKSkgewotCSAgICBkc19kYmcoMywgImRzX2lvY3RsKCk6IHZlcmlmeV9yZWFkID0gJWRcbiIsIC1FRkFVTFQpOwotCSAgICByZXR1cm4gLUVGQVVMVDsKLQl9Ci0gICAgfQotICAgIGlmIChjbWQgJiBJT0NfT1VUKSB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YXJnLCBzaXplKSkgewotCSAgICBkc19kYmcoMywgImRzX2lvY3RsKCk6IHZlcmlmeV93cml0ZSA9ICVkXG4iLCAtRUZBVUxUKTsKLQkgICAgcmV0dXJuIC1FRkFVTFQ7Ci0JfQotICAgIH0KLSAgICBidWYgPSBrbWFsbG9jKHNpemVvZihkc19pb2N0bF9hcmdfdCksIEdGUF9LRVJORUwpOwotICAgIGlmICghYnVmKQotCXJldHVybiAtRU5PTUVNOwotICAgIAotICAgIGVyciA9IHJldCA9IDA7Ci0gICAgCi0gICAgaWYgKGNtZCAmIElPQ19JTikgX19jb3B5X2Zyb21fdXNlcigoY2hhciAqKWJ1ZiwgdWFyZywgc2l6ZSk7Ci0gICAgCi0gICAgc3dpdGNoIChjbWQpIHsKLSAgICBjYXNlIERTX0FESlVTVF9SRVNPVVJDRV9JTkZPOgotCXJldCA9IHBjbWNpYV9hZGp1c3RfcmVzb3VyY2VfaW5mbygmYnVmLT5hZGp1c3QpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0NBUkRfU0VSVklDRVNfSU5GTzoKLQlyZXQgPSBwY21jaWFfZ2V0X2NhcmRfc2VydmljZXNfaW5mbygmYnVmLT5zZXJ2aW5mbyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfQ09ORklHVVJBVElPTl9JTkZPOgotCWlmIChidWYtPmNvbmZpZy5GdW5jdGlvbiAmJgotCSAgIChidWYtPmNvbmZpZy5GdW5jdGlvbiA+PSBzLT5wYXJlbnQtPmZ1bmN0aW9ucykpCi0JICAgIHJldCA9IENTX0JBRF9BUkdTOwotCWVsc2UKLQkgICAgcmV0ID0gcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8ocy0+cGFyZW50LAotCQkJYnVmLT5jb25maWcuRnVuY3Rpb24sICZidWYtPmNvbmZpZyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfRklSU1RfVFVQTEU6Ci0JZG93bigmcy0+cGFyZW50LT5za3Rfc2VtKTsKLQlwY21jaWFfdmFsaWRhdGVfbWVtKHMtPnBhcmVudCk7Ci0JdXAoJnMtPnBhcmVudC0+c2t0X3NlbSk7Ci0JcmV0ID0gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLT5wYXJlbnQsIEJJTkRfRk5fQUxMLCAmYnVmLT50dXBsZSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19HRVRfTkVYVF9UVVBMRToKLQlyZXQgPSBwY2NhcmRfZ2V0X25leHRfdHVwbGUocy0+cGFyZW50LCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+dHVwbGUpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX1RVUExFX0RBVEE6Ci0JYnVmLT50dXBsZS5UdXBsZURhdGEgPSBidWYtPnR1cGxlX3BhcnNlLmRhdGE7Ci0JYnVmLT50dXBsZS5UdXBsZURhdGFNYXggPSBzaXplb2YoYnVmLT50dXBsZV9wYXJzZS5kYXRhKTsKLQlyZXQgPSBwY2NhcmRfZ2V0X3R1cGxlX2RhdGEocy0+cGFyZW50LCAmYnVmLT50dXBsZSk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19QQVJTRV9UVVBMRToKLQlidWYtPnR1cGxlLlR1cGxlRGF0YSA9IGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YTsKLQlyZXQgPSBwY2NhcmRfcGFyc2VfdHVwbGUoJmJ1Zi0+dHVwbGUsICZidWYtPnR1cGxlX3BhcnNlLnBhcnNlKTsKLQlicmVhazsKLSAgICBjYXNlIERTX1JFU0VUX0NBUkQ6Ci0JcmV0ID0gcGNjYXJkX3Jlc2V0X2NhcmQocy0+cGFyZW50KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9TVEFUVVM6Ci0JaWYgKGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uICYmCi0JICAgKGJ1Zi0+c3RhdHVzLkZ1bmN0aW9uID49IHMtPnBhcmVudC0+ZnVuY3Rpb25zKSkKLQkgICAgcmV0ID0gQ1NfQkFEX0FSR1M7Ci0JZWxzZQotCXJldCA9IHBjY2FyZF9nZXRfc3RhdHVzKHMtPnBhcmVudCwgYnVmLT5zdGF0dXMuRnVuY3Rpb24sICZidWYtPnN0YXR1cyk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19WQUxJREFURV9DSVM6Ci0JZG93bigmcy0+cGFyZW50LT5za3Rfc2VtKTsKLQlwY21jaWFfdmFsaWRhdGVfbWVtKHMtPnBhcmVudCk7Ci0JdXAoJnMtPnBhcmVudC0+c2t0X3NlbSk7Ci0JcmV0ID0gcGNjYXJkX3ZhbGlkYXRlX2NpcyhzLT5wYXJlbnQsIEJJTkRfRk5fQUxMLCAmYnVmLT5jaXNpbmZvKTsKLQlicmVhazsKLSAgICBjYXNlIERTX1NVU1BFTkRfQ0FSRDoKLQlyZXQgPSBwY21jaWFfc3VzcGVuZF9jYXJkKHMtPnBhcmVudCk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBEU19SRVNVTUVfQ0FSRDoKLQlyZXQgPSBwY21jaWFfcmVzdW1lX2NhcmQocy0+cGFyZW50KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0VKRUNUX0NBUkQ6Ci0JZXJyID0gcGNtY2lhX2VqZWN0X2NhcmQocy0+cGFyZW50KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0lOU0VSVF9DQVJEOgotCWVyciA9IHBjbWNpYV9pbnNlcnRfY2FyZChzLT5wYXJlbnQpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfQUNDRVNTX0NPTkZJR1VSQVRJT05fUkVHSVNURVI6Ci0JaWYgKChidWYtPmNvbmZfcmVnLkFjdGlvbiA9PSBDU19XUklURSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKLQkgICAgZXJyID0gLUVQRVJNOwotCSAgICBnb3RvIGZyZWVfb3V0OwotCX0KLQlpZiAoYnVmLT5jb25mX3JlZy5GdW5jdGlvbiAmJgotCSAgIChidWYtPmNvbmZfcmVnLkZ1bmN0aW9uID49IHMtPnBhcmVudC0+ZnVuY3Rpb25zKSkKLQkgICAgcmV0ID0gQ1NfQkFEX0FSR1M7Ci0JZWxzZQotCSAgICByZXQgPSBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIocy0+cGFyZW50LAotCQkJYnVmLT5jb25mX3JlZy5GdW5jdGlvbiwgJmJ1Zi0+Y29uZl9yZWcpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0ZJUlNUX1JFR0lPTjoKLSAgICBjYXNlIERTX0dFVF9ORVhUX1JFR0lPTjoKLSAgICBjYXNlIERTX0JJTkRfTVREOgotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gZnJlZV9vdXQ7Ci0JfSBlbHNlIHsKLQkJc3RhdGljIGludCBwcmludGVkID0gMDsKLQkJaWYgKCFwcmludGVkKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIyLjYuIGtlcm5lbHMgdXNlIHBjbWNpYW10ZCBpbnN0ZWFkIG9mIG1lbW9yeV9jcy5jIGFuZCBkbyBub3QgcmVxdWlyZSBzcGVjaWFsXG4iKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1URCBoYW5kbGluZyBhbnkgbW9yZS5cbiIpOwotCQkJcHJpbnRlZCsrOwotCQl9Ci0JfQotCWVyciA9IC1FSU5WQUw7Ci0JZ290byBmcmVlX291dDsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9GSVJTVF9XSU5ET1c6Ci0JcmV0ID0gcGNtY2lhX2dldF93aW5kb3cocy0+cGFyZW50LCAmYnVmLT53aW5faW5mby5oYW5kbGUsIDAsCi0JCQkmYnVmLT53aW5faW5mby53aW5kb3cpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX05FWFRfV0lORE9XOgotCXJldCA9IHBjbWNpYV9nZXRfd2luZG93KHMtPnBhcmVudCwgJmJ1Zi0+d2luX2luZm8uaGFuZGxlLAotCQkJYnVmLT53aW5faW5mby5oYW5kbGUtPmluZGV4ICsgMSwgJmJ1Zi0+d2luX2luZm8ud2luZG93KTsKLQlicmVhazsKLSAgICBjYXNlIERTX0dFVF9NRU1fUEFHRToKLQlyZXQgPSBwY21jaWFfZ2V0X21lbV9wYWdlKGJ1Zi0+d2luX2luZm8uaGFuZGxlLAotCQkJICAgJmJ1Zi0+d2luX2luZm8ubWFwKTsKLQlicmVhazsKLSAgICBjYXNlIERTX1JFUExBQ0VfQ0lTOgotCXJldCA9IHBjbWNpYV9yZXBsYWNlX2NpcyhzLT5wYXJlbnQsICZidWYtPmNpc2R1bXApOwotCWJyZWFrOwotICAgIGNhc2UgRFNfQklORF9SRVFVRVNUOgotCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gZnJlZV9vdXQ7Ci0JfQotCWVyciA9IGJpbmRfcmVxdWVzdChzLCAmYnVmLT5iaW5kX2luZm8pOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX0RFVklDRV9JTkZPOgotCWVyciA9IGdldF9kZXZpY2VfaW5mbyhzLCAmYnVmLT5iaW5kX2luZm8sIDEpOwotCWJyZWFrOwotICAgIGNhc2UgRFNfR0VUX05FWFRfREVWSUNFOgotCWVyciA9IGdldF9kZXZpY2VfaW5mbyhzLCAmYnVmLT5iaW5kX2luZm8sIDApOwotCWJyZWFrOwotICAgIGNhc2UgRFNfVU5CSU5EX1JFUVVFU1Q6Ci0JZXJyID0gMDsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCWVyciA9IC1FSU5WQUw7Ci0gICAgfQotICAgIAotICAgIGlmICgoZXJyID09IDApICYmIChyZXQgIT0gQ1NfU1VDQ0VTUykpIHsKLQlkc19kYmcoMiwgImRzX2lvY3RsOiByZXQgPSAlZFxuIiwgcmV0KTsKLQlzd2l0Y2ggKHJldCkgewotCWNhc2UgQ1NfQkFEX1NPQ0tFVDogY2FzZSBDU19OT19DQVJEOgotCSAgICBlcnIgPSAtRU5PREVWOyBicmVhazsKLQljYXNlIENTX0JBRF9BUkdTOiBjYXNlIENTX0JBRF9BVFRSSUJVVEU6IGNhc2UgQ1NfQkFEX0lSUToKLQljYXNlIENTX0JBRF9UVVBMRToKLQkgICAgZXJyID0gLUVJTlZBTDsgYnJlYWs7Ci0JY2FzZSBDU19JTl9VU0U6Ci0JICAgIGVyciA9IC1FQlVTWTsgYnJlYWs7Ci0JY2FzZSBDU19PVVRfT0ZfUkVTT1VSQ0U6Ci0JICAgIGVyciA9IC1FTk9TUEM7IGJyZWFrOwotCWNhc2UgQ1NfTk9fTU9SRV9JVEVNUzoKLQkgICAgZXJyID0gLUVOT0RBVEE7IGJyZWFrOwotCWNhc2UgQ1NfVU5TVVBQT1JURURfRlVOQ1RJT046Ci0JICAgIGVyciA9IC1FTk9TWVM7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAgIGVyciA9IC1FSU87IGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoY21kICYgSU9DX09VVCkgewotICAgICAgICBpZiAoX19jb3B5X3RvX3VzZXIodWFyZywgKGNoYXIgKilidWYsIHNpemUpKQotICAgICAgICAgICAgZXJyID0gLUVGQVVMVDsKLSAgICB9Ci0KLWZyZWVfb3V0OgotICAgIGtmcmVlKGJ1Zik7Ci0gICAgcmV0dXJuIGVycjsKLX0gLyogZHNfaW9jdGwgKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRzX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGRzX29wZW4sCi0JLnJlbGVhc2UJPSBkc19yZWxlYXNlLAotCS5pb2N0bAkJPSBkc19pb2N0bCwKLQkucmVhZAkJPSBkc19yZWFkLAotCS53cml0ZQkJPSBkc193cml0ZSwKLQkucG9sbAkJPSBkc19wb2xsLAorc3RhdGljIHN0cnVjdCBwY21jaWFfY2FsbGJhY2sgcGNtY2lhX2J1c19jYWxsYmFjayA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZXZlbnQgPSBkc19ldmVudCwKKwkucmVxdWVyeSA9IHBjbWNpYV9idXNfcmVzY2FuLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgcGNtY2lhX2J1c19hZGRfc29ja2V0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc29ja2V0ID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKLQlzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQgKnM7CiAJaW50IHJldDsKIAotCXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQpLCBHRlBfS0VSTkVMKTsKLQlpZighcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3QgcGNtY2lhX2J1c19zb2NrZXQpKTsKLQotCS8qIGdldCByZWZlcmVuY2UgdG8gcGFyZW50IHNvY2tldCAqLwotCXMtPnBhcmVudCA9IHBjbWNpYV9nZXRfc29ja2V0KHNvY2tldCk7Ci0JaWYgKCFzLT5wYXJlbnQpIHsKKwlzb2NrZXQgPSBwY21jaWFfZ2V0X3NvY2tldChzb2NrZXQpOworCWlmICghc29ja2V0KSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUENNQ0lBIG9idGFpbmluZyByZWZlcmVuY2UgdG8gc29ja2V0ICVwIGZhaWxlZFxuIiwgc29ja2V0KTsKLQkJa2ZyZWUgKHMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlrcmVmX2luaXQoJnMtPnJlZmNvdW50KTsKLSAgICAKIAkvKgogCSAqIFVnbHkuIEJ1dCB3ZSB3YW50IHRvIHdhaXQgZm9yIHRoZSBzb2NrZXQgdGhyZWFkcyB0byBoYXZlIHN0YXJ0ZWQgdXAuCiAJICogV2UgcmVhbGx5IHNob3VsZCBsZXQgdGhlIGRyaXZlcnMgdGhlbXNlbHZlcyBkcml2ZSBzb21lIG9mIHRoaXMuLgogCSAqLwogCW1zbGVlcCgyNTApOwogCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+cXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZzLT5kZXZpY2VzX2xpc3QpOworI2lmZGVmIENPTkZJR19QQ01DSUFfSU9DVEwKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzb2NrZXQtPnF1ZXVlKTsKKyNlbmRpZgorCUlOSVRfTElTVF9IRUFEKCZzb2NrZXQtPmRldmljZXNfbGlzdCk7CisJSU5JVF9XT1JLKCZzb2NrZXQtPmRldmljZV9hZGQsIHBjbWNpYV9kZWxheWVkX2FkZF9wc2V1ZG9fZGV2aWNlLCBzb2NrZXQpOworCW1lbXNldCgmc29ja2V0LT5wY21jaWFfc3RhdGUsIDAsIHNpemVvZih1OCkpOworCXNvY2tldC0+ZGV2aWNlX2NvdW50ID0gMDsKIAotCS8qIFNldCB1cCBob3RsaW5lIHRvIENhcmQgU2VydmljZXMgKi8KLQlzLT5jYWxsYmFjay5vd25lciA9IFRISVNfTU9EVUxFOwotCXMtPmNhbGxiYWNrLmV2ZW50ID0gJmRzX2V2ZW50OwotCXMtPmNhbGxiYWNrLnJlc291cmNlc19kb25lID0gJnBjbWNpYV9jYXJkX2FkZDsKLQlzb2NrZXQtPnBjbWNpYSA9IHM7Ci0KLQlyZXQgPSBwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHNvY2tldCwgJnMtPmNhbGxiYWNrKTsKKwlyZXQgPSBwY2NhcmRfcmVnaXN0ZXJfcGNtY2lhKHNvY2tldCwgJnBjbWNpYV9idXNfY2FsbGJhY2spOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ01DSUEgcmVnaXN0cmF0aW9uIFBDQ2FyZCBjb3JlIGZhaWxlZCBmb3Igc29ja2V0ICVwXG4iLCBzb2NrZXQpOwotCQlwY21jaWFfcHV0X2J1c19zb2NrZXQocyk7Ci0JCXNvY2tldC0+cGNtY2lhID0gTlVMTDsKKwkJcGNtY2lhX3B1dF9zb2NrZXQoc29ja2V0KTsKIAkJcmV0dXJuIChyZXQpOwogCX0KIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIHBjbWNpYV9idXNfcmVtb3ZlX3NvY2tldChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYpCiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2tldCA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CiAKLQlpZiAoIXNvY2tldCB8fCAhc29ja2V0LT5wY21jaWEpCisJaWYgKCFzb2NrZXQpCiAJCXJldHVybjsKIAorCXNvY2tldC0+cGNtY2lhX3N0YXRlLmRlYWQgPSAxOwogCXBjY2FyZF9yZWdpc3Rlcl9wY21jaWEoc29ja2V0LCBOVUxMKTsKIAotCXNvY2tldC0+cGNtY2lhLT5zdGF0ZSB8PSBEU19TT0NLRVRfREVBRDsKLQlwY21jaWFfcHV0X2J1c19zb2NrZXQoc29ja2V0LT5wY21jaWEpOwotCXNvY2tldC0+cGNtY2lhID0gTlVMTDsKKwlwY21jaWFfcHV0X3NvY2tldChzb2NrZXQpOwogCiAJcmV0dXJuOwogfQpAQCAtMTU3NSwzNCArMTE5OCwyMCBAQAogCiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlID0gewogCS5uYW1lID0gInBjbWNpYSIsCisJLmhvdHBsdWcgPSBwY21jaWFfYnVzX2hvdHBsdWcsCiAJLm1hdGNoID0gcGNtY2lhX2J1c19tYXRjaCwKIAkuZGV2X2F0dHJzID0gcGNtY2lhX2Rldl9hdHRycywKIH07Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9idXNfdHlwZSk7CiAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9wY21jaWFfYnVzKHZvaWQpCiB7Ci0JaW50IGk7Ci0KIAlzcGluX2xvY2tfaW5pdCgmcGNtY2lhX2Rldl9saXN0X2xvY2spOwogCiAJYnVzX3JlZ2lzdGVyKCZwY21jaWFfYnVzX3R5cGUpOwogCWNsYXNzX2ludGVyZmFjZV9yZWdpc3RlcigmcGNtY2lhX2J1c19pbnRlcmZhY2UpOwogCi0JLyogU2V0IHVwIGNoYXJhY3RlciBkZXZpY2UgZm9yIHVzZXIgbW9kZSBjbGllbnRzICovCi0JaSA9IHJlZ2lzdGVyX2NocmRldigwLCAicGNtY2lhIiwgJmRzX2ZvcHMpOwotCWlmIChpIDwgMCkKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJ1bmFibGUgdG8gZmluZCBhIGZyZWUgZGV2aWNlICMgZm9yICIKLQkJICAgICAgICJEcml2ZXIgU2VydmljZXMgKGVycm9yPSVkKVxuIiwgaSk7Ci0JZWxzZQotCQltYWpvcl9kZXYgPSBpOwotCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlwcm9jX3BjY2FyZCA9IHByb2NfbWtkaXIoInBjY2FyZCIsIHByb2NfYnVzKTsKLQlpZiAocHJvY19wY2NhcmQpCi0JCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImRyaXZlcnMiLDAscHJvY19wY2NhcmQscHJvY19yZWFkX2RyaXZlcnMsTlVMTCk7Ci0jZW5kaWYKKwlwY21jaWFfc2V0dXBfaW9jdGwoKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYxMiw0OCArMTIyMSwxMyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9wY21jaWFfYnVzKHZvaWQpCiB7Ci0JY2xhc3NfaW50ZXJmYWNlX3VucmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKKwlwY21jaWFfY2xlYW51cF9pb2N0bCgpOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlpZiAocHJvY19wY2NhcmQpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImRyaXZlcnMiLCBwcm9jX3BjY2FyZCk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJwY2NhcmQiLCBwcm9jX2J1cyk7Ci0JfQotI2VuZGlmCi0JaWYgKG1ham9yX2RldiAhPSAtMSkKLQkJdW5yZWdpc3Rlcl9jaHJkZXYobWFqb3JfZGV2LCAicGNtY2lhIik7CisJY2xhc3NfaW50ZXJmYWNlX3VucmVnaXN0ZXIoJnBjbWNpYV9idXNfaW50ZXJmYWNlKTsKIAogCWJ1c191bnJlZ2lzdGVyKCZwY21jaWFfYnVzX3R5cGUpOwogfQogbW9kdWxlX2V4aXQoZXhpdF9wY21jaWFfYnVzKTsKIAogCi0KLS8qIGhlbHBlcnMgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmxlIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgc3RydWN0IHBjbWNpYV9idXNfc29ja2V0ICogZ2V0X3NvY2tldF9pbmZvX2J5X25yKHVuc2lnbmVkIGludCBucikKLXsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqIHMgPSBwY21jaWFfZ2V0X3NvY2tldF9ieV9ucihucik7Ci0JaWYgKHMgJiYgcy0+cGNtY2lhKQotCQlyZXR1cm4gcy0+cGNtY2lhOwotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIGJhY2t3YXJkcy1jb21wYXRpYmxlIGFjY2Vzc2luZyBvZiBkcml2ZXIgLS0tIGJ5IG5hbWUhICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqIGdldF9wY21jaWFfZHJpdmVyIChkZXZfaW5mb190ICpkZXZfaW5mbykKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OwotCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKLQotCWRydiA9IGRyaXZlcl9maW5kKChjaGFyICopIGRldl9pbmZvLCAmcGNtY2lhX2J1c190eXBlKTsKLQlpZiAoIWRydikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwX2RydiA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBwY21jaWFfZHJpdmVyLCBkcnYpOwotCi0JcmV0dXJuIChwX2Rydik7Ci19Ci0KIE1PRFVMRV9BTElBUygiZHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2RzX2ludGVybmFsLmggYi9kcml2ZXJzL3BjbWNpYS9kc19pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTliZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjbWNpYS9kc19pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qIGRzX2ludGVybmFsLmggLSBpbnRlcm5hbCBoZWFkZXIgZm9yIDE2LWJpdCBQQ01DSUEgZGV2aWNlcyBtYW5hZ2VtZW50ICovCisKK2V4dGVybiBzcGlubG9ja190IHBjbWNpYV9kZXZfbGlzdF9sb2NrOworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBwY21jaWFfYnVzX3R5cGU7CisKK2V4dGVybiBzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBjbWNpYV9nZXRfZGV2KHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CitleHRlcm4gdm9pZCBwY21jaWFfcHV0X2RldihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYpOworCitzdHJ1Y3QgcGNtY2lhX2RldmljZSAqIHBjbWNpYV9kZXZpY2VfYWRkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24pOworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9JT0NUTAorZXh0ZXJuIHZvaWQgX19pbml0IHBjbWNpYV9zZXR1cF9pb2N0bCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBwY21jaWFfY2xlYW51cF9pb2N0bCh2b2lkKTsKK2V4dGVybiB2b2lkIGhhbmRsZV9ldmVudChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCk7CitleHRlcm4gaW50IGhhbmRsZV9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBjbWNpYV9zZXR1cF9pb2N0bCh2b2lkKSB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBwY21jaWFfY2xlYW51cF9pb2N0bCh2b2lkKSB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9ldmVudChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCkgeyByZXR1cm47IH0KK3N0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9yZXF1ZXN0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBldmVudF90IGV2ZW50KSB7IHJldHVybiBDU19TVUNDRVNTOyB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2hkNjQ0NjVfc3MuYyBiL2RyaXZlcnMvcGNtY2lhL2hkNjQ0NjVfc3MuYwppbmRleCA1YWI1NWFlLi4zMTZmOGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9oZDY0NDY1X3NzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvaGQ2NDQ2NV9zcy5jCkBAIC00Myw3ICs0Myw2IEBACiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjUvaGQ2NDQ2NS5oPgogI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2lvLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL2k4MjM2NS5jIGIvZHJpdmVycy9wY21jaWEvaTgyMzY1LmMKaW5kZXggOTBhMzM1YS4uYTcxMzAxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvaTgyMzY1LmMKKysrIGIvZHJpdmVycy9wY21jaWEvaTgyMzY1LmMKQEAgLTUzLDcgKzUzLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgpAQCAtNjY5LDExICs2NjgsMTMgQEAKICAgICBpZiAoKHN0YXQgJiBJMzY1X0NTX0RFVEVDVCkgJiYgKHN0YXQgJiBJMzY1X0NTX1BPV0VST04pICYmCiAJKGkzNjVfZ2V0KHNvY2ssIEkzNjVfSU5UQ1RMKSAmIEkzNjVfUENfSU9DQVJEKSAmJgogCShpMzY1X2dldChzb2NrLCBJMzY1X0FERFJXSU4pICYgSTM2NV9FTkFfSU8oMCkpICYmCi0JKGNoZWNrX3JlZ2lvbihzdGFydCwgc3RvcC1zdGFydCsxKSAhPSAwKSAmJgotCSgoc3RhcnQgJiAweGZlZWYpICE9IDB4MDJlOCkpCi0JcmV0dXJuIDE7Ci0gICAgZWxzZQotCXJldHVybiAwOworCSgoc3RhcnQgJiAweGZlZWYpICE9IDB4MDJlOCkpIHsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHN0YXJ0LCBzdG9wLXN0YXJ0KzEsICJpODIzNjUiKSkKKwkgICAgcmV0dXJuIDE7CisJcmVsZWFzZV9yZWdpb24oc3RhcnQsIHN0b3Atc3RhcnQrMSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtNjk2LDggKzY5Nyw2IEBACiAgICAgc3RydWN0IGk4MjM2NV9zb2NrZXQgKnQgPSAmc29ja2V0W3NvY2tldHMtbnNdOwogCiAgICAgYmFzZSA9IHNvY2tldHMtbnM7Ci0gICAgaWYgKHQtPmlvYWRkciA+IDApIHJlcXVlc3RfcmVnaW9uKHQtPmlvYWRkciwgMiwgImk4MjM2NSIpOwotICAgIAogICAgIGlmIChiYXNlID09IDApIHByaW50aygiXG4iKTsKICAgICBwcmludGsoS0VSTl9JTkZPICIgICVzIiwgcGNpY1t0eXBlXS5uYW1lKTsKICAgICBwcmludGsoIiBJU0EtdG8tUENNQ0lBIGF0IHBvcnQgJSNseCBvZnMgMHglMDJ4IiwKQEAgLTgwMyw3ICs4MDIsNyBAQAogICAgIH0KICNlbmRpZgogCi0gICAgaWYgKGNoZWNrX3JlZ2lvbihpMzY1X2Jhc2UsIDIpICE9IDApIHsKKyAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGkzNjVfYmFzZSwgMiwgImk4MjM2NSIpKSB7CiAJaWYgKHNvY2tldHMgPT0gMCkKIAkgICAgcHJpbnRrKCJwb3J0IGNvbmZsaWN0IGF0ICUjbHhcbiIsIGkzNjVfYmFzZSk7CiAJcmV0dXJuOwpAQCAtMTQ0MSw2ICsxNDQwLDcgQEAKIAlpMzY1X3NldChpLCBJMzY1X0NTQ0lOVCwgMCk7CiAJcmVsZWFzZV9yZWdpb24oc29ja2V0W2ldLmlvYWRkciwgMik7CiAgICAgfQorICAgIHJlbGVhc2VfcmVnaW9uKGkzNjVfYmFzZSwgMik7CiAjaWZkZWYgQ09ORklHX1BOUAogICAgIGlmIChpODIzNjVfcG5wZGV2KQogICAgIAkJcG5wX2Rpc2FibGVfZGV2KGk4MjM2NV9wbnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYyBiL2RyaXZlcnMvcGNtY2lhL20zMnJfY2ZjLmMKaW5kZXggYjExMTFjNi4uNjVmM2VlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvbTMycl9jZmMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX2NmYy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMgYi9kcml2ZXJzL3BjbWNpYS9tMzJyX3BjYy5jCmluZGV4IGMwOTk3YzQuLjdiMTRkN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL20zMnJfcGNjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvbTMycl9wY2MuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX2NvbXBhdC5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2NvbXBhdC5jCmluZGV4IDY4YjgwMDguLmViYjE2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9jb21wYXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfY29tcGF0LmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKICNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUwotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2J1bGttZW0uaD4KQEAgLTI4LDk4ICsyNywzOSBAQAogCiAjaW5jbHVkZSAiY3NfaW50ZXJuYWwuaCIKIAotaW50IHBjbWNpYV9nZXRfZmlyc3RfdHVwbGUoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgdHVwbGVfdCAqdHVwbGUpCitpbnQgcGNtY2lhX2dldF9maXJzdF90dXBsZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIHR1cGxlX3QgKnR1cGxlKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCXJldHVybiBwY2NhcmRfZ2V0X2ZpcnN0X3R1cGxlKHMsIGhhbmRsZS0+RnVuY3Rpb24sIHR1cGxlKTsKKwlyZXR1cm4gcGNjYXJkX2dldF9maXJzdF90dXBsZShwX2Rldi0+c29ja2V0LCBwX2Rldi0+ZnVuYywgdHVwbGUpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X2ZpcnN0X3R1cGxlKTsKIAotaW50IHBjbWNpYV9nZXRfbmV4dF90dXBsZShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCB0dXBsZV90ICp0dXBsZSkKK2ludCBwY21jaWFfZ2V0X25leHRfdHVwbGUoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCB0dXBsZV90ICp0dXBsZSkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHMsIGhhbmRsZS0+RnVuY3Rpb24sIHR1cGxlKTsKKwlyZXR1cm4gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLCB0dXBsZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfbmV4dF90dXBsZSk7CiAKLWludCBwY21jaWFfZ2V0X3R1cGxlX2RhdGEoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgdHVwbGVfdCAqdHVwbGUpCitpbnQgcGNtY2lhX2dldF90dXBsZV9kYXRhKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgdHVwbGVfdCAqdHVwbGUpCiB7Ci0Jc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7Ci0JaWYgKENIRUNLX0hBTkRMRShoYW5kbGUpKQotCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKLQlzID0gU09DS0VUKGhhbmRsZSk7Ci0JcmV0dXJuIHBjY2FyZF9nZXRfdHVwbGVfZGF0YShzLCB0dXBsZSk7CisJcmV0dXJuIHBjY2FyZF9nZXRfdHVwbGVfZGF0YShwX2Rldi0+c29ja2V0LCB0dXBsZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfdHVwbGVfZGF0YSk7CiAKLWludCBwY21jaWFfcGFyc2VfdHVwbGUoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgdHVwbGVfdCAqdHVwbGUsIGNpc3BhcnNlX3QgKnBhcnNlKQoraW50IHBjbWNpYV9wYXJzZV90dXBsZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIHR1cGxlX3QgKnR1cGxlLCBjaXNwYXJzZV90ICpwYXJzZSkKIHsKIAlyZXR1cm4gcGNjYXJkX3BhcnNlX3R1cGxlKHR1cGxlLCBwYXJzZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjbWNpYV9wYXJzZV90dXBsZSk7CiAKLWludCBwY21jaWFfdmFsaWRhdGVfY2lzKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNpc2luZm9fdCAqaW5mbykKK2ludCBwY21jaWFfdmFsaWRhdGVfY2lzKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY2lzaW5mb190ICppbmZvKQogewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCXJldHVybiBwY2NhcmRfdmFsaWRhdGVfY2lzKHMsIGhhbmRsZS0+RnVuY3Rpb24sIGluZm8pOworCXJldHVybiBwY2NhcmRfdmFsaWRhdGVfY2lzKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLCBpbmZvKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3ZhbGlkYXRlX2Npcyk7CiAKLWludCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLAotCQkJCSAgY29uZmlnX2luZm9fdCAqY29uZmlnKQorCitpbnQgcGNtY2lhX3Jlc2V0X2NhcmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjbGllbnRfcmVxX3QgKnJlcSkKIHsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQotCWlmICgoQ0hFQ0tfSEFORExFKGhhbmRsZSkpIHx8ICFjb25maWcpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlpZiAoIXMpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXJldHVybiBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzLCBoYW5kbGUtPkZ1bmN0aW9uLCBjb25maWcpOwotfQotRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyk7Ci0KLWludCBwY21jaWFfcmVzZXRfY2FyZChjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjbGllbnRfcmVxX3QgKnJlcSkKLXsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0OwotICAgIAotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0Jc2t0ID0gU09DS0VUKGhhbmRsZSk7Ci0JaWYgKCFza3QpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCi0JcmV0dXJuIHBjY2FyZF9yZXNldF9jYXJkKHNrdCk7CisJcmV0dXJuIHBjY2FyZF9yZXNldF9jYXJkKHBfZGV2LT5zb2NrZXQpOwogfQogRVhQT1JUX1NZTUJPTChwY21jaWFfcmVzZXRfY2FyZCk7Ci0KLWludCBwY21jaWFfZ2V0X3N0YXR1cyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjc19zdGF0dXNfdCAqc3RhdHVzKQotewotCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOwotCWlmIChDSEVDS19IQU5ETEUoaGFuZGxlKSkKLQkJcmV0dXJuIENTX0JBRF9IQU5ETEU7Ci0JcyA9IFNPQ0tFVChoYW5kbGUpOwotCXJldHVybiBwY2NhcmRfZ2V0X3N0YXR1cyhzLCBoYW5kbGUtPkZ1bmN0aW9uLCBzdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3N0YXR1cyk7Ci0KLWludCBwY21jaWFfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwKLQkJCQkJIGNvbmZfcmVnX3QgKnJlZykKLXsKLQlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKLQlpZiAoQ0hFQ0tfSEFORExFKGhhbmRsZSkpCi0JCXJldHVybiBDU19CQURfSEFORExFOwotCXMgPSBTT0NLRVQoaGFuZGxlKTsKLQlyZXR1cm4gcGNjYXJkX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHMsIGhhbmRsZS0+RnVuY3Rpb24sIHJlZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcik7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliYTY0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNtY2lhL3BjbWNpYV9pb2N0bC5jCkBAIC0wLDAgKzEsNzU5IEBACisvKgorICogcGNtY2lhX2lvY3RsLmMgLS0gaW9jdGwgaW50ZXJmYWNlIGZvciBjYXJkbWdyIGFuZCBjYXJkY3RsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGUgaW5pdGlhbCBkZXZlbG9wZXIgb2YgdGhlIG9yaWdpbmFsIGNvZGUgaXMgRGF2aWQgQS4gSGluZHMKKyAqIDxkYWhpbmRzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4uICBQb3J0aW9ucyBjcmVhdGVkIGJ5IERhdmlkIEEuIEhpbmRzCisgKiBhcmUgQ29weXJpZ2h0IChDKSAxOTk5IERhdmlkIEEuIEhpbmRzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAoQykgMTk5OQkJRGF2aWQgQS4gSGluZHMKKyAqIChDKSAyMDAzIC0gMjAwNAlEb21pbmlrIEJyb2Rvd3NraQorICovCisKKy8qCisgKiBUaGlzIGZpbGUgd2lsbCBnbyBhd2F5IHNvb24uCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUworI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgorI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KKyNpbmNsdWRlIDxwY21jaWEvZHMuaD4KKyNpbmNsdWRlIDxwY21jaWEvc3MuaD4KKworI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCisjaW5jbHVkZSAiZHNfaW50ZXJuYWwuaCIKKworc3RhdGljIGludCBtYWpvcl9kZXYgPSAtMTsKKworCisvKiBEZXZpY2UgdXNlciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBNQVhfRVZFTlRTCTMyCisjZGVmaW5lIFVTRVJfTUFHSUMJMHg3ZWE0CisjZGVmaW5lIENIRUNLX1VTRVIodSkgXAorICAgICgoKHUpID09IE5VTEwpIHx8ICgodSktPnVzZXJfbWFnaWMgIT0gVVNFUl9NQUdJQykpCisKK3R5cGVkZWYgc3RydWN0IHVzZXJfaW5mb190IHsKKwl1X2ludAkJCXVzZXJfbWFnaWM7CisJaW50CQkJZXZlbnRfaGVhZCwgZXZlbnRfdGFpbDsKKwlldmVudF90CQkJZXZlbnRbTUFYX0VWRU5UU107CisJc3RydWN0IHVzZXJfaW5mb190CSpuZXh0OworCXN0cnVjdCBwY21jaWFfc29ja2V0CSpzb2NrZXQ7Cit9IHVzZXJfaW5mb190OworCisKKyNpZmRlZiBERUJVRworZXh0ZXJuIGludCBkc19wY19kZWJ1ZzsKKyNkZWZpbmUgY3Nfc29ja2V0X25hbWUoc2t0KSAgICAoKHNrdCktPmRldi5jbGFzc19pZCkKKworI2RlZmluZSBkc19kYmcobHZsLCBmbXQsIGFyZy4uLikgZG8gewkJXAorCWlmIChkc19wY19kZWJ1ZyA+PSBsdmwpCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImRzOiAiIGZtdCAsICMjIGFyZyk7CQlcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgZHNfZGJnKGx2bCwgZm10LCBhcmcuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIGJhY2t3YXJkcy1jb21wYXRpYmxlIGFjY2Vzc2luZyBvZiBkcml2ZXIgLS0tIGJ5IG5hbWUhICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciAqIGdldF9wY21jaWFfZHJpdmVyIChkZXZfaW5mb190ICpkZXZfaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCXN0cnVjdCBwY21jaWFfZHJpdmVyICpwX2RydjsKKworCWRydiA9IGRyaXZlcl9maW5kKChjaGFyICopIGRldl9pbmZvLCAmcGNtY2lhX2J1c190eXBlKTsKKwlpZiAoIWRydikKKwkJcmV0dXJuIE5VTEw7CisKKwlwX2RydiA9IGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBwY21jaWFfZHJpdmVyLCBkcnYpOworCisJcmV0dXJuIChwX2Rydik7Cit9CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3BjY2FyZCA9IE5VTEw7CisKK3N0YXRpYyBpbnQgcHJvY19yZWFkX2RyaXZlcnNfY2FsbGJhY2soc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciwgdm9pZCAqZCkKK3sKKwljaGFyICoqcCA9IGQ7CisJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2ID0gY29udGFpbmVyX29mKGRyaXZlciwKKwkJCQkJCSAgIHN0cnVjdCBwY21jaWFfZHJpdmVyLCBkcnYpOworCisJKnAgKz0gc3ByaW50ZigqcCwgIiUtMjQuMjRzIDEgJWRcbiIsIHBfZHJ2LT5kcnYubmFtZSwKKyNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAorCQkgICAgICAocF9kcnYtPm93bmVyKSA/IG1vZHVsZV9yZWZjb3VudChwX2Rydi0+b3duZXIpIDogMQorI2Vsc2UKKwkJICAgICAgMQorI2VuZGlmCisJKTsKKwlkID0gKHZvaWQgKikgcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfcmVhZF9kcml2ZXJzKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBwb3MsCisJCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJY2hhciAqcCA9IGJ1ZjsKKworCWJ1c19mb3JfZWFjaF9kcnYoJnBjbWNpYV9idXNfdHlwZSwgTlVMTCwKKwkJCSAodm9pZCAqKSAmcCwgcHJvY19yZWFkX2RyaXZlcnNfY2FsbGJhY2spOworCisJcmV0dXJuIChwIC0gYnVmKTsKK30KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZXNlIG1hbmFnZSBhIHJpbmcgYnVmZmVyIG9mIGV2ZW50cyBwZW5kaW5nIGZvciBvbmUgdXNlciBwcm9jZXNzCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKK3N0YXRpYyBpbnQgcXVldWVfZW1wdHkodXNlcl9pbmZvX3QgKnVzZXIpCit7CisgICAgcmV0dXJuICh1c2VyLT5ldmVudF9oZWFkID09IHVzZXItPmV2ZW50X3RhaWwpOworfQorCitzdGF0aWMgZXZlbnRfdCBnZXRfcXVldWVkX2V2ZW50KHVzZXJfaW5mb190ICp1c2VyKQoreworICAgIHVzZXItPmV2ZW50X3RhaWwgPSAodXNlci0+ZXZlbnRfdGFpbCsxKSAlIE1BWF9FVkVOVFM7CisgICAgcmV0dXJuIHVzZXItPmV2ZW50W3VzZXItPmV2ZW50X3RhaWxdOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9ldmVudCh1c2VyX2luZm9fdCAqdXNlciwgZXZlbnRfdCBldmVudCkKK3sKKyAgICB1c2VyLT5ldmVudF9oZWFkID0gKHVzZXItPmV2ZW50X2hlYWQrMSkgJSBNQVhfRVZFTlRTOworICAgIGlmICh1c2VyLT5ldmVudF9oZWFkID09IHVzZXItPmV2ZW50X3RhaWwpCisJdXNlci0+ZXZlbnRfdGFpbCA9ICh1c2VyLT5ldmVudF90YWlsKzEpICUgTUFYX0VWRU5UUzsKKyAgICB1c2VyLT5ldmVudFt1c2VyLT5ldmVudF9oZWFkXSA9IGV2ZW50OworfQorCit2b2lkIGhhbmRsZV9ldmVudChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgZXZlbnRfdCBldmVudCkKK3sKKyAgICB1c2VyX2luZm9fdCAqdXNlcjsKKyAgICBmb3IgKHVzZXIgPSBzLT51c2VyOyB1c2VyOyB1c2VyID0gdXNlci0+bmV4dCkKKwlxdWV1ZV9ldmVudCh1c2VyLCBldmVudCk7CisgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzLT5xdWV1ZSk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBiaW5kX3JlcXVlc3QoKSBhbmQgYmluZF9kZXZpY2UoKSBhcmUgbWVyZ2VkIGJ5IG5vdy4gUmVnaXN0ZXJfY2xpZW50KCkKKyAgICBpcyBjYWxsZWQgcmlnaHQgYXQgdGhlIGVuZCBvZiBiaW5kX3JlcXVlc3QoKSwgZHVyaW5nIHRoZSBkcml2ZXIncworICAgIC0+YXR0YWNoKCkgY2FsbC4gSW5kaXZpZHVhbCBkZXNjcmlwdGlvbnM6CisKKyAgICBiaW5kX3JlcXVlc3QoKSBjb25uZWN0cyBhIHNvY2tldCB0byBhIHBhcnRpY3VsYXIgY2xpZW50IGRyaXZlci4KKyAgICBJdCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGRldmljZSBJRCBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkCisgICAgZHJpdmVycywgYmluZHMgaXQgdG8gdGhlIHNvY2tldCwgYW5kIHRyaWVzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZQorICAgIG9mIHRoZSBkZXZpY2UuICB1bmJpbmRfcmVxdWVzdCgpIGRlbGV0ZXMgYSBkcml2ZXIgaW5zdGFuY2UuCisKKyAgICBCaW5kX2RldmljZSgpIGFzc29jaWF0ZXMgYSBkZXZpY2UgZHJpdmVyIHdpdGggYSBwYXJ0aWN1bGFyIHNvY2tldC4KKyAgICBJdCBpcyBub3JtYWxseSBjYWxsZWQgYnkgRHJpdmVyIFNlcnZpY2VzIGFmdGVyIGl0IGhhcyBpZGVudGlmaWVkCisgICAgYSBuZXdseSBpbnNlcnRlZCBjYXJkLiAgQW4gaW5zdGFuY2Ugb2YgdGhhdCBkcml2ZXIgd2lsbCB0aGVuIGJlCisgICAgZWxpZ2libGUgdG8gcmVnaXN0ZXIgYXMgYSBjbGllbnQgb2YgdGhpcyBzb2NrZXQuCisKKyAgICBSZWdpc3Rlcl9jbGllbnQoKSB1c2VzIHRoZSBkZXZfaW5mb190IGhhbmRsZSB0byBtYXRjaCB0aGUKKyAgICBjYWxsZXIgd2l0aCBhIHNvY2tldC4gIFRoZSBkcml2ZXIgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBib3VuZAorICAgIHRvIGEgc29ja2V0IHdpdGggYmluZF9kZXZpY2UoKSAtLSBpbiBmYWN0LCBiaW5kX2RldmljZSgpCisgICAgYWxsb2NhdGVzIHRoZSBjbGllbnQgc3RydWN0dXJlIHRoYXQgd2lsbCBiZSB1c2VkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIGludCBiaW5kX3JlcXVlc3Qoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGJpbmRfaW5mb190ICpiaW5kX2luZm8pCit7CisJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2OworCXN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcyA9IHBjbWNpYV9nZXRfc29ja2V0KHMpOworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkc19kYmcoMiwgImJpbmRfcmVxdWVzdCglZCwgJyVzJylcbiIsIHMtPnNvY2ssCisJICAgICAgIChjaGFyICopYmluZF9pbmZvLT5kZXZfaW5mbyk7CisKKwlwX2RydiA9IGdldF9wY21jaWFfZHJpdmVyKCZiaW5kX2luZm8tPmRldl9pbmZvKTsKKwlpZiAoIXBfZHJ2KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3B1dDsKKwl9CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHBfZHJ2LT5vd25lcikpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHV0X2RyaXZlcjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KSB7CisJCWlmIChwX2Rldi0+ZnVuYyA9PSBiaW5kX2luZm8tPmZ1bmN0aW9uKSB7CisJCQlpZiAoKHBfZGV2LT5kZXYuZHJpdmVyID09ICZwX2Rydi0+ZHJ2KSkgeworCQkJCWlmIChwX2Rldi0+Y2FyZG1ncikgeworCQkJCQkvKiBpZiB0aGVyZSdzIGFscmVhZHkgYSBkZXZpY2UKKwkJCQkJICogcmVnaXN0ZXJlZCwgYW5kIGl0IHdhcyByZWdpc3RlcmVkCisJCQkJCSAqIGJ5IHVzZXJzcGFjZSBiZWZvcmUsIHdlIG5lZWQgdG8KKwkJCQkJICogcmV0dXJuIHRoZSAiaW5zdGFuY2UiLiAqLworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCQkJCQliaW5kX2luZm8tPmluc3RhbmNlID0gcF9kZXYtPmluc3RhbmNlOworCQkJCQlyZXQgPSAtRUJVU1k7CisJCQkJCWdvdG8gZXJyX3B1dF9tb2R1bGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogdGhlIGNvcnJlY3QgZHJpdmVyIG1hbmFnZWQgdG8gYmluZAorCQkJCQkgKiBpdHNlbGYgbWFnaWNhbGx5IHRvIHRoZSBjb3JyZWN0CisJCQkJCSAqIGRldmljZS4gKi8KKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwkJCQkJcF9kZXYtPmNhcmRtZ3IgPSBwX2RydjsKKwkJCQkJcmV0ID0gMDsKKwkJCQkJZ290byBlcnJfcHV0X21vZHVsZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFwX2Rldi0+ZGV2LmRyaXZlcikgeworCQkJCS8qIHRoZXJlJ3MgYWxyZWFkeSBhIGRldmljZSBhdmFpbGFibGUgd2hlcmUKKwkJCQkgKiBubyBkZXZpY2UgaGFzIGJlZW4gYm91bmQgdG8geWV0LiBTbyB3ZSBkb24ndAorCQkJCSAqIG5lZWQgdG8gcmVnaXN0ZXIgYSBkZXZpY2UhICovCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNtY2lhX2Rldl9saXN0X2xvY2ssIGZsYWdzKTsKKwkJCQlnb3RvIHJlc2NhbjsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCisJcF9kZXYgPSBwY21jaWFfZGV2aWNlX2FkZChzLCBiaW5kX2luZm8tPmZ1bmN0aW9uKTsKKwlpZiAoIXBfZGV2KSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX3B1dF9tb2R1bGU7CisJfQorCityZXNjYW46CisJcF9kZXYtPmNhcmRtZ3IgPSBwX2RydjsKKworCS8qIGlmIGEgZHJpdmVyIGlzIGFscmVhZHkgcnVubmluZywgd2UgY2FuIGFib3J0ICovCisJaWYgKHBfZGV2LT5kZXYuZHJpdmVyKQorCQlnb3RvIGVycl9wdXRfbW9kdWxlOworCisJLyoKKwkgKiBQcmV2ZW50IHRoaXMgcmFjaW5nIHdpdGggYSBjYXJkIGluc2VydGlvbi4KKwkgKi8KKwlkb3duKCZzLT5za3Rfc2VtKTsKKwlidXNfcmVzY2FuX2RldmljZXMoJnBjbWNpYV9idXNfdHlwZSk7CisJdXAoJnMtPnNrdF9zZW0pOworCisJLyogY2hlY2sgd2hldGhlciB0aGUgZHJpdmVyIGluZGVlZCBtYXRjaGVkLiBJIGRvbid0IGNhcmUgaWYgdGhpcworCSAqIGlzIHJhY3kgb3Igbm90LCBiZWNhdXNlIGl0IGNhbiBvbmx5IGhhcHBlbiBvbiBjYXJkbWdyIGFjY2VzcworCSAqIHBhdGhzLi4uCisJICovCisJaWYgKCEocF9kZXYtPmRldi5kcml2ZXIgPT0gJnBfZHJ2LT5kcnYpKQorCQlwX2Rldi0+Y2FyZG1nciA9IE5VTEw7CisKKyBlcnJfcHV0X21vZHVsZToKKwltb2R1bGVfcHV0KHBfZHJ2LT5vd25lcik7CisgZXJyX3B1dF9kcml2ZXI6CisJcHV0X2RyaXZlcigmcF9kcnYtPmRydik7CisgZXJyX3B1dDoKKwlwY21jaWFfcHV0X3NvY2tldChzKTsKKworCXJldHVybiAocmV0KTsKK30gLyogYmluZF9yZXF1ZXN0ICovCisKKyNpZmRlZiBDT05GSUdfQ0FSREJVUworCitzdGF0aWMgc3RydWN0IHBjaV9idXMgKnBjbWNpYV9sb29rdXBfYnVzKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQoreworCWlmICghcyB8fCAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzLT5jYl9kZXYtPnN1Ym9yZGluYXRlOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmZvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBiaW5kX2luZm9fdCAqYmluZF9pbmZvLCBpbnQgZmlyc3QpCit7CisJZGV2X25vZGVfdCAqbm9kZTsKKwlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworI2lmZGVmIENPTkZJR19DQVJEQlVTCisJLyoKKwkgKiBTb21lIHVuYmVsaWV2YWJseSB1Z2x5IGNvZGUgdG8gYXNzb2NpYXRlIHRoZSBQQ0kgY2FyZGJ1cworCSAqIGRldmljZSBhbmQgaXRzIGRyaXZlciB3aXRoIHRoZSBQQ01DSUEgImJpbmQiIGluZm9ybWF0aW9uLgorCSAqLworCXsKKwkJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCQlidXMgPSBwY21jaWFfbG9va3VwX2J1cyhzKTsKKwkJaWYgKGJ1cykgeworCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwkJCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCisJCQlsaXN0ID0gYnVzLT5kZXZpY2VzLm5leHQ7CisJCQl3aGlsZSAobGlzdCAhPSAmYnVzLT5kZXZpY2VzKSB7CisJCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwY2lfZGV2X2IobGlzdCk7CisJCQkJbGlzdCA9IGxpc3QtPm5leHQ7CisKKwkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJZGV2ID0gcGRldjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogVHJ5IHRvIGhhbmRsZSAibmV4dCIgaGVyZSBzb21lIHdheT8gKi8KKwkJCX0KKwkJCWlmIChkZXYgJiYgZGV2LT5kcml2ZXIpIHsKKwkJCQlzdHJsY3B5KGJpbmRfaW5mby0+bmFtZSwgZGV2LT5kcml2ZXItPm5hbWUsIERFVl9OQU1FX0xFTik7CisJCQkJYmluZF9pbmZvLT5tYWpvciA9IDA7CisJCQkJYmluZF9pbmZvLT5taW5vciA9IDA7CisJCQkJYmluZF9pbmZvLT5uZXh0ID0gTlVMTDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwX2RldiwgJnMtPmRldmljZXNfbGlzdCwgc29ja2V0X2RldmljZV9saXN0KSB7CisJCWlmIChwX2Rldi0+ZnVuYyA9PSBiaW5kX2luZm8tPmZ1bmN0aW9uKSB7CisJCQlwX2RldiA9IHBjbWNpYV9nZXRfZGV2KHBfZGV2KTsKKwkJCWlmICghcF9kZXYpCisJCQkJY29udGludWU7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjbWNpYV9kZXZfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIC1FTk9ERVY7CisKKyBmb3VuZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY21jaWFfZGV2X2xpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKCghcF9kZXYtPmluc3RhbmNlKSB8fAorCSAgICAocF9kZXYtPmluc3RhbmNlLT5zdGF0ZSAmIERFVl9DT05GSUdfUEVORElORykpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBlcnJfcHV0OworCX0KKworCWlmIChmaXJzdCkKKwkJbm9kZSA9IHBfZGV2LT5pbnN0YW5jZS0+ZGV2OworCWVsc2UKKwkJZm9yIChub2RlID0gcF9kZXYtPmluc3RhbmNlLT5kZXY7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KQorCQkJaWYgKG5vZGUgPT0gYmluZF9pbmZvLT5uZXh0KQorCQkJCWJyZWFrOworCWlmICghbm9kZSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9wdXQ7CisJfQorCisJc3RybGNweShiaW5kX2luZm8tPm5hbWUsIG5vZGUtPmRldl9uYW1lLCBERVZfTkFNRV9MRU4pOworCWJpbmRfaW5mby0+bWFqb3IgPSBub2RlLT5tYWpvcjsKKwliaW5kX2luZm8tPm1pbm9yID0gbm9kZS0+bWlub3I7CisJYmluZF9pbmZvLT5uZXh0ID0gbm9kZS0+bmV4dDsKKworIGVycl9wdXQ6CisJcGNtY2lhX3B1dF9kZXYocF9kZXYpOworCXJldHVybiAocmV0KTsKK30gLyogZ2V0X2RldmljZV9pbmZvICovCisKKworc3RhdGljIGludCBkc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHNvY2tldF90IGkgPSBpbWlub3IoaW5vZGUpOworICAgIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworICAgIHVzZXJfaW5mb190ICp1c2VyOworCisgICAgZHNfZGJnKDAsICJkc19vcGVuKHNvY2tldCAlZClcbiIsIGkpOworCisgICAgcyA9IHBjbWNpYV9nZXRfc29ja2V0X2J5X25yKGkpOworICAgIGlmICghcykKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgcyA9IHBjbWNpYV9nZXRfc29ja2V0KHMpOworICAgIGlmICghcykKKwkgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZKSB7CisJICAgIGlmIChzLT5wY21jaWFfc3RhdGUuYnVzeSkgeworCQkgICAgcGNtY2lhX3B1dF9zb2NrZXQocyk7CisJCSAgICByZXR1cm4gLUVCVVNZOworCSAgICB9CisJZWxzZQorCSAgICBzLT5wY21jaWFfc3RhdGUuYnVzeSA9IDE7CisgICAgfQorCisgICAgdXNlciA9IGttYWxsb2Moc2l6ZW9mKHVzZXJfaW5mb190KSwgR0ZQX0tFUk5FTCk7CisgICAgaWYgKCF1c2VyKSB7CisJICAgIHBjbWNpYV9wdXRfc29ja2V0KHMpOworCSAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisgICAgdXNlci0+ZXZlbnRfdGFpbCA9IHVzZXItPmV2ZW50X2hlYWQgPSAwOworICAgIHVzZXItPm5leHQgPSBzLT51c2VyOworICAgIHVzZXItPnVzZXJfbWFnaWMgPSBVU0VSX01BR0lDOworICAgIHVzZXItPnNvY2tldCA9IHM7CisgICAgcy0+dXNlciA9IHVzZXI7CisgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gdXNlcjsKKworICAgIGlmIChzLT5wY21jaWFfc3RhdGUucHJlc2VudCkKKwlxdWV1ZV9ldmVudCh1c2VyLCBDU19FVkVOVF9DQVJEX0lOU0VSVElPTik7CisgICAgcmV0dXJuIDA7Cit9IC8qIGRzX29wZW4gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBpbnQgZHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKyAgICB1c2VyX2luZm9fdCAqdXNlciwgKipsaW5rOworCisgICAgZHNfZGJnKDAsICJkc19yZWxlYXNlKHNvY2tldCAlZClcbiIsIGltaW5vcihpbm9kZSkpOworCisgICAgdXNlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICBpZiAoQ0hFQ0tfVVNFUih1c2VyKSkKKwlnb3RvIG91dDsKKworICAgIHMgPSB1c2VyLT5zb2NrZXQ7CisKKyAgICAvKiBVbmxpbmsgdXNlciBkYXRhIHN0cnVjdHVyZSAqLworICAgIGlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFkpIHsKKwlzLT5wY21jaWFfc3RhdGUuYnVzeSA9IDA7CisgICAgfQorICAgIGZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisgICAgZm9yIChsaW5rID0gJnMtPnVzZXI7ICpsaW5rOyBsaW5rID0gJigqbGluayktPm5leHQpCisJaWYgKCpsaW5rID09IHVzZXIpIGJyZWFrOworICAgIGlmIChsaW5rID09IE5VTEwpCisJZ290byBvdXQ7CisgICAgKmxpbmsgPSB1c2VyLT5uZXh0OworICAgIHVzZXItPnVzZXJfbWFnaWMgPSAwOworICAgIGtmcmVlKHVzZXIpOworICAgIHBjbWNpYV9wdXRfc29ja2V0KHMpOworb3V0OgorICAgIHJldHVybiAwOworfSAvKiBkc19yZWxlYXNlICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgc3NpemVfdCBkc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisgICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisgICAgdXNlcl9pbmZvX3QgKnVzZXI7CisgICAgaW50IHJldDsKKworICAgIGRzX2RiZygyLCAiZHNfcmVhZChzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKworICAgIGlmIChjb3VudCA8IDQpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQorCXJldHVybiAtRUlPOworCisgICAgcyA9IHVzZXItPnNvY2tldDsKKyAgICBpZiAocy0+cGNtY2lhX3N0YXRlLmRlYWQpCisgICAgICAgIHJldHVybiAtRUlPOworCisgICAgcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHMtPnF1ZXVlLCAhcXVldWVfZW1wdHkodXNlcikpOworICAgIGlmIChyZXQgPT0gMCkKKwlyZXQgPSBwdXRfdXNlcihnZXRfcXVldWVkX2V2ZW50KHVzZXIpLCAoaW50IF9fdXNlciAqKWJ1ZikgPyAtRUZBVUxUIDogNDsKKworICAgIHJldHVybiByZXQ7Cit9IC8qIGRzX3JlYWQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzc2l6ZV90IGRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisgICAgZHNfZGJnKDIsICJkc193cml0ZShzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKworICAgIGlmIChjb3VudCAhPSA0KQorCXJldHVybiAtRUlOVkFMOworICAgIGlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRE9OTFkpCisJcmV0dXJuIC1FQkFERjsKKworICAgIHJldHVybiAtRUlPOworfSAvKiBkc193cml0ZSAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdV9pbnQgZHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKyAgICBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqczsKKyAgICB1c2VyX2luZm9fdCAqdXNlcjsKKworICAgIGRzX2RiZygyLCAiZHNfcG9sbChzb2NrZXQgJWQpXG4iLCBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpKTsKKworICAgIHVzZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgaWYgKENIRUNLX1VTRVIodXNlcikpCisJcmV0dXJuIFBPTExFUlI7CisgICAgcyA9IHVzZXItPnNvY2tldDsKKyAgICAvKgorICAgICAqIFdlIGRvbid0IGNoZWNrIGZvciBhIGRlYWQgc29ja2V0IGhlcmUgc2luY2UgdGhhdAorICAgICAqIHdpbGwgc2VuZCBjYXJkbWdyIGludG8gYW4gZW5kbGVzcyBzcGluLgorICAgICAqLworICAgIHBvbGxfd2FpdChmaWxlLCAmcy0+cXVldWUsIHdhaXQpOworICAgIGlmICghcXVldWVfZW1wdHkodXNlcikpCisJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisgICAgcmV0dXJuIDA7Cit9IC8qIGRzX3BvbGwgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2V4dGVybiBpbnQgcGNtY2lhX2FkanVzdF9yZXNvdXJjZV9pbmZvKGFkanVzdF90ICphZGopOworCitzdGF0aWMgaW50IGRzX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisJCSAgICB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisgICAgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisgICAgdm9pZCBfX3VzZXIgKnVhcmcgPSAoY2hhciBfX3VzZXIgKilhcmc7CisgICAgdV9pbnQgc2l6ZTsKKyAgICBpbnQgcmV0LCBlcnI7CisgICAgZHNfaW9jdGxfYXJnX3QgKmJ1ZjsKKyAgICB1c2VyX2luZm9fdCAqdXNlcjsKKworICAgIGRzX2RiZygyLCAiZHNfaW9jdGwoc29ja2V0ICVkLCAlI3gsICUjbHgpXG4iLCBpbWlub3IoaW5vZGUpLCBjbWQsIGFyZyk7CisKKyAgICB1c2VyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgIGlmIChDSEVDS19VU0VSKHVzZXIpKQorCXJldHVybiAtRUlPOworCisgICAgcyA9IHVzZXItPnNvY2tldDsKKyAgICBpZiAocy0+cGNtY2lhX3N0YXRlLmRlYWQpCisgICAgICAgIHJldHVybiAtRUlPOworCisgICAgc2l6ZSA9IChjbWQgJiBJT0NTSVpFX01BU0spID4+IElPQ1NJWkVfU0hJRlQ7CisgICAgaWYgKHNpemUgPiBzaXplb2YoZHNfaW9jdGxfYXJnX3QpKSByZXR1cm4gLUVJTlZBTDsKKworICAgIC8qIFBlcm1pc3Npb24gY2hlY2sgKi8KKyAgICBpZiAoIShjbWQgJiBJT0NfT1VUKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwlyZXR1cm4gLUVQRVJNOworCisgICAgaWYgKGNtZCAmIElPQ19JTikgeworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1YXJnLCBzaXplKSkgeworCSAgICBkc19kYmcoMywgImRzX2lvY3RsKCk6IHZlcmlmeV9yZWFkID0gJWRcbiIsIC1FRkFVTFQpOworCSAgICByZXR1cm4gLUVGQVVMVDsKKwl9CisgICAgfQorICAgIGlmIChjbWQgJiBJT0NfT1VUKSB7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YXJnLCBzaXplKSkgeworCSAgICBkc19kYmcoMywgImRzX2lvY3RsKCk6IHZlcmlmeV93cml0ZSA9ICVkXG4iLCAtRUZBVUxUKTsKKwkgICAgcmV0dXJuIC1FRkFVTFQ7CisJfQorICAgIH0KKyAgICBidWYgPSBrbWFsbG9jKHNpemVvZihkc19pb2N0bF9hcmdfdCksIEdGUF9LRVJORUwpOworICAgIGlmICghYnVmKQorCXJldHVybiAtRU5PTUVNOworCisgICAgZXJyID0gcmV0ID0gMDsKKworICAgIGlmIChjbWQgJiBJT0NfSU4pIF9fY29weV9mcm9tX3VzZXIoKGNoYXIgKilidWYsIHVhcmcsIHNpemUpOworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIERTX0FESlVTVF9SRVNPVVJDRV9JTkZPOgorCXJldCA9IHBjbWNpYV9hZGp1c3RfcmVzb3VyY2VfaW5mbygmYnVmLT5hZGp1c3QpOworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX0NPTkZJR1VSQVRJT05fSU5GTzoKKwlpZiAoYnVmLT5jb25maWcuRnVuY3Rpb24gJiYKKwkgICAoYnVmLT5jb25maWcuRnVuY3Rpb24gPj0gcy0+ZnVuY3Rpb25zKSkKKwkgICAgcmV0ID0gQ1NfQkFEX0FSR1M7CisJZWxzZQorCSAgICByZXQgPSBwY2NhcmRfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzLAorCQkJYnVmLT5jb25maWcuRnVuY3Rpb24sICZidWYtPmNvbmZpZyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfRklSU1RfVFVQTEU6CisJZG93bigmcy0+c2t0X3NlbSk7CisJcGNtY2lhX3ZhbGlkYXRlX21lbShzKTsKKwl1cCgmcy0+c2t0X3NlbSk7CisJcmV0ID0gcGNjYXJkX2dldF9maXJzdF90dXBsZShzLCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+dHVwbGUpOworCWJyZWFrOworICAgIGNhc2UgRFNfR0VUX05FWFRfVFVQTEU6CisJcmV0ID0gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHMsIEJJTkRfRk5fQUxMLCAmYnVmLT50dXBsZSk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfVFVQTEVfREFUQToKKwlidWYtPnR1cGxlLlR1cGxlRGF0YSA9IGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YTsKKwlidWYtPnR1cGxlLlR1cGxlRGF0YU1heCA9IHNpemVvZihidWYtPnR1cGxlX3BhcnNlLmRhdGEpOworCXJldCA9IHBjY2FyZF9nZXRfdHVwbGVfZGF0YShzLCAmYnVmLT50dXBsZSk7CisJYnJlYWs7CisgICAgY2FzZSBEU19QQVJTRV9UVVBMRToKKwlidWYtPnR1cGxlLlR1cGxlRGF0YSA9IGJ1Zi0+dHVwbGVfcGFyc2UuZGF0YTsKKwlyZXQgPSBwY2NhcmRfcGFyc2VfdHVwbGUoJmJ1Zi0+dHVwbGUsICZidWYtPnR1cGxlX3BhcnNlLnBhcnNlKTsKKwlicmVhazsKKyAgICBjYXNlIERTX1JFU0VUX0NBUkQ6CisJcmV0ID0gcGNjYXJkX3Jlc2V0X2NhcmQocyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfU1RBVFVTOgorCWlmIChidWYtPnN0YXR1cy5GdW5jdGlvbiAmJgorCSAgIChidWYtPnN0YXR1cy5GdW5jdGlvbiA+PSBzLT5mdW5jdGlvbnMpKQorCSAgICByZXQgPSBDU19CQURfQVJHUzsKKwllbHNlCisJcmV0ID0gcGNjYXJkX2dldF9zdGF0dXMocywgYnVmLT5zdGF0dXMuRnVuY3Rpb24sICZidWYtPnN0YXR1cyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19WQUxJREFURV9DSVM6CisJZG93bigmcy0+c2t0X3NlbSk7CisJcGNtY2lhX3ZhbGlkYXRlX21lbShzKTsKKwl1cCgmcy0+c2t0X3NlbSk7CisJcmV0ID0gcGNjYXJkX3ZhbGlkYXRlX2NpcyhzLCBCSU5EX0ZOX0FMTCwgJmJ1Zi0+Y2lzaW5mbyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19TVVNQRU5EX0NBUkQ6CisJcmV0ID0gcGNtY2lhX3N1c3BlbmRfY2FyZChzKTsKKwlicmVhazsKKyAgICBjYXNlIERTX1JFU1VNRV9DQVJEOgorCXJldCA9IHBjbWNpYV9yZXN1bWVfY2FyZChzKTsKKwlicmVhazsKKyAgICBjYXNlIERTX0VKRUNUX0NBUkQ6CisJZXJyID0gcGNtY2lhX2VqZWN0X2NhcmQocyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19JTlNFUlRfQ0FSRDoKKwllcnIgPSBwY21jaWFfaW5zZXJ0X2NhcmQocyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19BQ0NFU1NfQ09ORklHVVJBVElPTl9SRUdJU1RFUjoKKwlpZiAoKGJ1Zi0+Y29uZl9yZWcuQWN0aW9uID09IENTX1dSSVRFKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCSAgICBlcnIgPSAtRVBFUk07CisJICAgIGdvdG8gZnJlZV9vdXQ7CisJfQorCWlmIChidWYtPmNvbmZfcmVnLkZ1bmN0aW9uICYmCisJICAgKGJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24gPj0gcy0+ZnVuY3Rpb25zKSkKKwkgICAgcmV0ID0gQ1NfQkFEX0FSR1M7CisJZWxzZQorCSAgICByZXQgPSBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIocywKKwkJCWJ1Zi0+Y29uZl9yZWcuRnVuY3Rpb24sICZidWYtPmNvbmZfcmVnKTsKKwlicmVhazsKKyAgICBjYXNlIERTX0dFVF9GSVJTVF9SRUdJT046CisgICAgY2FzZSBEU19HRVRfTkVYVF9SRUdJT046CisgICAgY2FzZSBEU19CSU5EX01URDoKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIGZyZWVfb3V0OworCX0gZWxzZSB7CisJCXN0YXRpYyBpbnQgcHJpbnRlZCA9IDA7CisJCWlmICghcHJpbnRlZCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiMi42LiBrZXJuZWxzIHVzZSBwY21jaWFtdGQgaW5zdGVhZCBvZiBtZW1vcnlfY3MuYyBhbmQgZG8gbm90IHJlcXVpcmUgc3BlY2lhbFxuIik7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNVEQgaGFuZGxpbmcgYW55IG1vcmUuXG4iKTsKKwkJCXByaW50ZWQrKzsKKwkJfQorCX0KKwllcnIgPSAtRUlOVkFMOworCWdvdG8gZnJlZV9vdXQ7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfRklSU1RfV0lORE9XOgorCXJldCA9IHBjbWNpYV9nZXRfd2luZG93KHMsICZidWYtPndpbl9pbmZvLmhhbmRsZSwgMCwKKwkJCSZidWYtPndpbl9pbmZvLndpbmRvdyk7CisJYnJlYWs7CisgICAgY2FzZSBEU19HRVRfTkVYVF9XSU5ET1c6CisJcmV0ID0gcGNtY2lhX2dldF93aW5kb3cocywgJmJ1Zi0+d2luX2luZm8uaGFuZGxlLAorCQkJYnVmLT53aW5faW5mby5oYW5kbGUtPmluZGV4ICsgMSwgJmJ1Zi0+d2luX2luZm8ud2luZG93KTsKKwlicmVhazsKKyAgICBjYXNlIERTX0dFVF9NRU1fUEFHRToKKwlyZXQgPSBwY21jaWFfZ2V0X21lbV9wYWdlKGJ1Zi0+d2luX2luZm8uaGFuZGxlLAorCQkJICAgJmJ1Zi0+d2luX2luZm8ubWFwKTsKKwlicmVhazsKKyAgICBjYXNlIERTX1JFUExBQ0VfQ0lTOgorCXJldCA9IHBjbWNpYV9yZXBsYWNlX2NpcyhzLCAmYnVmLT5jaXNkdW1wKTsKKwlicmVhazsKKyAgICBjYXNlIERTX0JJTkRfUkVRVUVTVDoKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIGZyZWVfb3V0OworCX0KKwllcnIgPSBiaW5kX3JlcXVlc3QocywgJmJ1Zi0+YmluZF9pbmZvKTsKKwlicmVhazsKKyAgICBjYXNlIERTX0dFVF9ERVZJQ0VfSU5GTzoKKwllcnIgPSBnZXRfZGV2aWNlX2luZm8ocywgJmJ1Zi0+YmluZF9pbmZvLCAxKTsKKwlicmVhazsKKyAgICBjYXNlIERTX0dFVF9ORVhUX0RFVklDRToKKwllcnIgPSBnZXRfZGV2aWNlX2luZm8ocywgJmJ1Zi0+YmluZF9pbmZvLCAwKTsKKwlicmVhazsKKyAgICBjYXNlIERTX1VOQklORF9SRVFVRVNUOgorCWVyciA9IDA7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwllcnIgPSAtRUlOVkFMOworICAgIH0KKworICAgIGlmICgoZXJyID09IDApICYmIChyZXQgIT0gQ1NfU1VDQ0VTUykpIHsKKwlkc19kYmcoMiwgImRzX2lvY3RsOiByZXQgPSAlZFxuIiwgcmV0KTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgQ1NfQkFEX1NPQ0tFVDogY2FzZSBDU19OT19DQVJEOgorCSAgICBlcnIgPSAtRU5PREVWOyBicmVhazsKKwljYXNlIENTX0JBRF9BUkdTOiBjYXNlIENTX0JBRF9BVFRSSUJVVEU6IGNhc2UgQ1NfQkFEX0lSUToKKwljYXNlIENTX0JBRF9UVVBMRToKKwkgICAgZXJyID0gLUVJTlZBTDsgYnJlYWs7CisJY2FzZSBDU19JTl9VU0U6CisJICAgIGVyciA9IC1FQlVTWTsgYnJlYWs7CisJY2FzZSBDU19PVVRfT0ZfUkVTT1VSQ0U6CisJICAgIGVyciA9IC1FTk9TUEM7IGJyZWFrOworCWNhc2UgQ1NfTk9fTU9SRV9JVEVNUzoKKwkgICAgZXJyID0gLUVOT0RBVEE7IGJyZWFrOworCWNhc2UgQ1NfVU5TVVBQT1JURURfRlVOQ1RJT046CisJICAgIGVyciA9IC1FTk9TWVM7IGJyZWFrOworCWRlZmF1bHQ6CisJICAgIGVyciA9IC1FSU87IGJyZWFrOworCX0KKyAgICB9CisKKyAgICBpZiAoY21kICYgSU9DX09VVCkgeworICAgICAgICBpZiAoX19jb3B5X3RvX3VzZXIodWFyZywgKGNoYXIgKilidWYsIHNpemUpKQorICAgICAgICAgICAgZXJyID0gLUVGQVVMVDsKKyAgICB9CisKK2ZyZWVfb3V0OgorICAgIGtmcmVlKGJ1Zik7CisgICAgcmV0dXJuIGVycjsKK30gLyogZHNfaW9jdGwgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRzX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRzX29wZW4sCisJLnJlbGVhc2UJPSBkc19yZWxlYXNlLAorCS5pb2N0bAkJPSBkc19pb2N0bCwKKwkucmVhZAkJPSBkc19yZWFkLAorCS53cml0ZQkJPSBkc193cml0ZSwKKwkucG9sbAkJPSBkc19wb2xsLAorfTsKKwordm9pZCBfX2luaXQgcGNtY2lhX3NldHVwX2lvY3RsKHZvaWQpIHsKKwlpbnQgaTsKKworCS8qIFNldCB1cCBjaGFyYWN0ZXIgZGV2aWNlIGZvciB1c2VyIG1vZGUgY2xpZW50cyAqLworCWkgPSByZWdpc3Rlcl9jaHJkZXYoMCwgInBjbWNpYSIsICZkc19mb3BzKTsKKwlpZiAoaSA8IDApCisJCXByaW50ayhLRVJOX05PVElDRSAidW5hYmxlIHRvIGZpbmQgYSBmcmVlIGRldmljZSAjIGZvciAiCisJCSAgICAgICAiRHJpdmVyIFNlcnZpY2VzIChlcnJvcj0lZClcbiIsIGkpOworCWVsc2UKKwkJbWFqb3JfZGV2ID0gaTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJcHJvY19wY2NhcmQgPSBwcm9jX21rZGlyKCJwY2NhcmQiLCBwcm9jX2J1cyk7CisJaWYgKHByb2NfcGNjYXJkKQorCQljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJkcml2ZXJzIiwwLHByb2NfcGNjYXJkLHByb2NfcmVhZF9kcml2ZXJzLE5VTEwpOworI2VuZGlmCit9CisKKwordm9pZCBfX2V4aXQgcGNtY2lhX2NsZWFudXBfaW9jdGwodm9pZCkgeworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJaWYgKHByb2NfcGNjYXJkKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXJzIiwgcHJvY19wY2NhcmQpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicGNjYXJkIiwgcHJvY19idXMpOworCX0KKyNlbmRpZgorCWlmIChtYWpvcl9kZXYgIT0gLTEpCisJCXVucmVnaXN0ZXJfY2hyZGV2KG1ham9yX2RldiwgInBjbWNpYSIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMgYi9kcml2ZXJzL3BjbWNpYS9wY21jaWFfcmVzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODRmNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY21jaWEvcGNtY2lhX3Jlc291cmNlLmMKQEAgLTAsMCArMSw5NDMgQEAKKy8qCisgKiBQQ01DSUEgMTYtYml0IHJlc291cmNlIG1hbmFnZW1lbnQgZnVuY3Rpb25zCisgKgorICogVGhlIGluaXRpYWwgZGV2ZWxvcGVyIG9mIHRoZSBvcmlnaW5hbCBjb2RlIGlzIERhdmlkIEEuIEhpbmRzCisgKiA8ZGFoaW5kc0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+LiAgUG9ydGlvbnMgY3JlYXRlZCBieSBEYXZpZCBBLiBIaW5kcworICogYXJlIENvcHlyaWdodCAoQykgMTk5OSBEYXZpZCBBLiBIaW5kcy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5CSAgICAgRGF2aWQgQS4gSGluZHMKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICAgRG9taW5payBCcm9kb3dza2kKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2RlZmluZSBJTl9DQVJEX1NFUlZJQ0VTCisjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2J1bGttZW0uaD4KKyNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CisjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgorI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgorCisjaW5jbHVkZSAiY3NfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkc19pbnRlcm5hbC5oIgorCisKKy8qIEFjY2VzcyBzcGVlZCBmb3IgSU8gd2luZG93cyAqLworc3RhdGljIGludCBpb19zcGVlZCA9IDA7Cittb2R1bGVfcGFyYW0oaW9fc3BlZWQsIGludCwgMDQ0NCk7CisKKworI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKKy8qIG1hc2sgb2YgSVJRcyBhbHJlYWR5IHJlc2VydmVkIGJ5IG90aGVyIGNhcmRzLCB3ZSBzaG91bGQgYXZvaWQgdXNpbmcgdGhlbSAqLworc3RhdGljIHU4IHBjbWNpYV91c2VkX2lycVtOUl9JUlFTXTsKKyNlbmRpZgorCisKKyNpZmRlZiBERUJVRworZXh0ZXJuIGludCBkc19wY19kZWJ1ZzsKKyNkZWZpbmUgY3Nfc29ja2V0X25hbWUoc2t0KSAgICAoKHNrdCktPmRldi5jbGFzc19pZCkKKworI2RlZmluZSBkc19kYmcoc2t0LCBsdmwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJXAorCWlmIChkc19wY19kZWJ1ZyA+PSBsdmwpCQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHICJwY21jaWFfcmVzb3VyY2U6ICVzOiAiIGZtdCwJXAorCQkJY3Nfc29ja2V0X25hbWUoc2t0KSAsICMjIGFyZyk7CQlcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgZHNfZGJnKGx2bCwgZm10LCBhcmcuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKworLyoqIGFsbG9jX2lvX3NwYWNlCisgKgorICogU3BlY2lhbCBzdHVmZiBmb3IgbWFuYWdpbmcgSU8gd2luZG93cywgYmVjYXVzZSB0aGV5IGFyZSBzY2FyY2UKKyAqLworCitzdGF0aWMgaW50IGFsbG9jX2lvX3NwYWNlKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB1X2ludCBhdHRyLCBpb2FkZHJfdCAqYmFzZSwKKwkJCSAgaW9hZGRyX3QgbnVtLCB1X2ludCBsaW5lcykKK3sKKwlpbnQgaTsKKwlraW9fYWRkcl90IHRyeSwgYWxpZ247CisKKwlhbGlnbiA9ICgqYmFzZSkgPyAobGluZXMgPyAxPDxsaW5lcyA6IDApIDogMTsKKwlpZiAoYWxpZ24gJiYgKGFsaWduIDwgbnVtKSkgeworCQlpZiAoKmJhc2UpIHsKKwkJCWRzX2RiZyhzLCAwLCAib2RkIElPIHJlcXVlc3Q6IG51bSAlI3ggYWxpZ24gJSNseFxuIiwKKwkJCSAgICAgICBudW0sIGFsaWduKTsKKwkJCWFsaWduID0gMDsKKwkJfSBlbHNlCisJCQl3aGlsZSAoYWxpZ24gJiYgKGFsaWduIDwgbnVtKSkgYWxpZ24gPDw9IDE7CisJfQorCWlmICgqYmFzZSAmIH4oYWxpZ24tMSkpIHsKKwkJZHNfZGJnKHMsIDAsICJvZGQgSU8gcmVxdWVzdDogYmFzZSAlI3ggYWxpZ24gJSNseFxuIiwKKwkJICAgICAgICpiYXNlLCBhbGlnbik7CisJCWFsaWduID0gMDsKKwl9CisJaWYgKChzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSAmJiBzLT5pb19vZmZzZXQpIHsKKwkJKmJhc2UgPSBzLT5pb19vZmZzZXQgfCAoKmJhc2UgJiAweDBmZmYpOworCQlzLT5pb1swXS5BdHRyaWJ1dGVzID0gYXR0cjsKKwkJcmV0dXJuIDA7CisJfQorCS8qIENoZWNrIGZvciBhbiBhbHJlYWR5LWFsbG9jYXRlZCB3aW5kb3cgdGhhdCBtdXN0IGNvbmZsaWN0IHdpdGgKKwkgKiB3aGF0IHdhcyBhc2tlZCBmb3IuICBJdCBpcyBhIGhhY2sgYmVjYXVzZSBpdCBkb2VzIG5vdCBjYXRjaCBhbGwKKwkgKiBwb3RlbnRpYWwgY29uZmxpY3RzLCBqdXN0IHRoZSBtb3N0IG9idmlvdXMgb25lcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKQorCQlpZiAoKHMtPmlvW2ldLk51bVBvcnRzICE9IDApICYmCisJCSAgICAoKHMtPmlvW2ldLkJhc2VQb3J0ICYgKGFsaWduLTEpKSA9PSAqYmFzZSkpCisJCQlyZXR1cm4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7CisJCWlmIChzLT5pb1tpXS5OdW1Qb3J0cyA9PSAwKSB7CisJCQlzLT5pb1tpXS5yZXMgPSBwY21jaWFfZmluZF9pb19yZWdpb24oKmJhc2UsIG51bSwgYWxpZ24sIHMpOworCQkJaWYgKHMtPmlvW2ldLnJlcykgeworCQkJCXMtPmlvW2ldLkF0dHJpYnV0ZXMgPSBhdHRyOworCQkJCXMtPmlvW2ldLkJhc2VQb3J0ID0gKmJhc2UgPSBzLT5pb1tpXS5yZXMtPnN0YXJ0OworCQkJCXMtPmlvW2ldLk51bVBvcnRzID0gcy0+aW9baV0uSW5Vc2UgPSBudW07CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChzLT5pb1tpXS5BdHRyaWJ1dGVzICE9IGF0dHIpCisJCQljb250aW51ZTsKKwkJLyogVHJ5IHRvIGV4dGVuZCB0b3Agb2Ygd2luZG93ICovCisJCXRyeSA9IHMtPmlvW2ldLkJhc2VQb3J0ICsgcy0+aW9baV0uTnVtUG9ydHM7CisJCWlmICgoKmJhc2UgPT0gMCkgfHwgKCpiYXNlID09IHRyeSkpCisJCQlpZiAocGNtY2lhX2FkanVzdF9pb19yZWdpb24ocy0+aW9baV0ucmVzLCBzLT5pb1tpXS5yZXMtPnN0YXJ0LAorCQkJCQkJICAgIHMtPmlvW2ldLnJlcy0+ZW5kICsgbnVtLCBzKSA9PSAwKSB7CisJCQkJKmJhc2UgPSB0cnk7CisJCQkJcy0+aW9baV0uTnVtUG9ydHMgKz0gbnVtOworCQkJCXMtPmlvW2ldLkluVXNlICs9IG51bTsKKwkJCQlicmVhazsKKwkJCX0KKwkJLyogVHJ5IHRvIGV4dGVuZCBib3R0b20gb2Ygd2luZG93ICovCisJCXRyeSA9IHMtPmlvW2ldLkJhc2VQb3J0IC0gbnVtOworCQlpZiAoKCpiYXNlID09IDApIHx8ICgqYmFzZSA9PSB0cnkpKQorCQkJaWYgKHBjbWNpYV9hZGp1c3RfaW9fcmVnaW9uKHMtPmlvW2ldLnJlcywgcy0+aW9baV0ucmVzLT5zdGFydCAtIG51bSwKKwkJCQkJCSAgICBzLT5pb1tpXS5yZXMtPmVuZCwgcykgPT0gMCkgeworCQkJCXMtPmlvW2ldLkJhc2VQb3J0ID0gKmJhc2UgPSB0cnk7CisJCQkJcy0+aW9baV0uTnVtUG9ydHMgKz0gbnVtOworCQkJCXMtPmlvW2ldLkluVXNlICs9IG51bTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisJcmV0dXJuIChpID09IE1BWF9JT19XSU4pOworfSAvKiBhbGxvY19pb19zcGFjZSAqLworCisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfaW9fc3BhY2Uoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGlvYWRkcl90IGJhc2UsCisJCQkgICAgIGlvYWRkcl90IG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspIHsKKwkJaWYgKChzLT5pb1tpXS5CYXNlUG9ydCA8PSBiYXNlKSAmJgorCQkgICAgKHMtPmlvW2ldLkJhc2VQb3J0K3MtPmlvW2ldLk51bVBvcnRzID49IGJhc2UrbnVtKSkgeworCQkJcy0+aW9baV0uSW5Vc2UgLT0gbnVtOworCQkJLyogRnJlZSB0aGUgd2luZG93IGlmIG5vIG9uZSBlbHNlIGlzIHVzaW5nIGl0ICovCisJCQlpZiAocy0+aW9baV0uSW5Vc2UgPT0gMCkgeworCQkJCXMtPmlvW2ldLk51bVBvcnRzID0gMDsKKwkJCQlyZWxlYXNlX3Jlc291cmNlKHMtPmlvW2ldLnJlcyk7CisJCQkJa2ZyZWUocy0+aW9baV0ucmVzKTsKKwkJCQlzLT5pb1tpXS5yZXMgPSBOVUxMOworCQkJfQorCQl9CisJfQorfSAvKiByZWxlYXNlX2lvX3NwYWNlICovCisKKworLyoqIHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlcgorICoKKyAqIEFjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKCkgcmVhZHMgYW5kIHdyaXRlcyBjb25maWd1cmF0aW9uCisgKiByZWdpc3RlcnMgaW4gYXR0cmlidXRlIG1lbW9yeS4gIE1lbW9yeSB3aW5kb3cgMCBpcyByZXNlcnZlZCBmb3IKKyAqIHRoaXMgYW5kIHRoZSB0dXBsZSByZWFkaW5nIHNlcnZpY2VzLgorICovCisKK2ludCBwY2NhcmRfYWNjZXNzX2NvbmZpZ3VyYXRpb25fcmVnaXN0ZXIoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCisJCQkJCSB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkJCSBjb25mX3JlZ190ICpyZWcpCit7CisJY29uZmlnX3QgKmM7CisJaW50IGFkZHI7CisJdV9jaGFyIHZhbDsKKworCWlmICghcyB8fCAhcy0+Y29uZmlnKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKworCWMgPSAmcy0+Y29uZmlnW2Z1bmN0aW9uXTsKKworCWlmIChjID09IE5VTEwpCisJCXJldHVybiBDU19OT19DQVJEOworCisJaWYgKCEoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKSkKKwkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOworCisJYWRkciA9IChjLT5Db25maWdCYXNlICsgcmVnLT5PZmZzZXQpID4+IDE7CisKKwlzd2l0Y2ggKHJlZy0+QWN0aW9uKSB7CisJY2FzZSBDU19SRUFEOgorCQlwY21jaWFfcmVhZF9jaXNfbWVtKHMsIDEsIGFkZHIsIDEsICZ2YWwpOworCQlyZWctPlZhbHVlID0gdmFsOworCQlicmVhazsKKwljYXNlIENTX1dSSVRFOgorCQl2YWwgPSByZWctPlZhbHVlOworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCBhZGRyLCAxLCAmdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIENTX0JBRF9BUkdTOworCQlicmVhazsKKwl9CisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjY2FyZF9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3RlciAqLworCitpbnQgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwKKwkJCQkJIGNvbmZfcmVnX3QgKnJlZykKK3sKKwlyZXR1cm4gcGNjYXJkX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHBfZGV2LT5zb2NrZXQsCisJCQkJCQkgICAgcF9kZXYtPmZ1bmMsIHJlZyk7Cit9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9hY2Nlc3NfY29uZmlndXJhdGlvbl9yZWdpc3Rlcik7CisKKworCitpbnQgcGNjYXJkX2dldF9jb25maWd1cmF0aW9uX2luZm8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCisJCQkJICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkJICBjb25maWdfaW5mb190ICpjb25maWcpCit7CisJY29uZmlnX3QgKmM7CisKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisKKwljb25maWctPkZ1bmN0aW9uID0gZnVuY3Rpb247CisKKyNpZmRlZiBDT05GSUdfQ0FSREJVUworCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSB7CisJCW1lbXNldChjb25maWcsIDAsIHNpemVvZihjb25maWdfaW5mb190KSk7CisJCWNvbmZpZy0+VmNjID0gcy0+c29ja2V0LlZjYzsKKwkJY29uZmlnLT5WcHAxID0gY29uZmlnLT5WcHAyID0gcy0+c29ja2V0LlZwcDsKKwkJY29uZmlnLT5PcHRpb24gPSBzLT5jYl9kZXYtPnN1Ym9yZGluYXRlLT5udW1iZXI7CisJCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTX0NPTkZJRykgeworCQkJY29uZmlnLT5BdHRyaWJ1dGVzID0gQ09ORl9WQUxJRF9DTElFTlQ7CisJCQljb25maWctPkludFR5cGUgPSBJTlRfQ0FSREJVUzsKKwkJCWNvbmZpZy0+QXNzaWduZWRJUlEgPSBzLT5pcnEuQXNzaWduZWRJUlE7CisJCQlpZiAoY29uZmlnLT5Bc3NpZ25lZElSUSkKKwkJCQljb25maWctPkF0dHJpYnV0ZXMgfD0gQ09ORl9FTkFCTEVfSVJROworCQkJY29uZmlnLT5CYXNlUG9ydDEgPSBzLT5pb1swXS5CYXNlUG9ydDsKKwkJCWNvbmZpZy0+TnVtUG9ydHMxID0gcy0+aW9bMF0uTnVtUG9ydHM7CisJCX0KKwkJcmV0dXJuIENTX1NVQ0NFU1M7CisJfQorI2VuZGlmCisKKwljID0gKHMtPmNvbmZpZyAhPSBOVUxMKSA/ICZzLT5jb25maWdbZnVuY3Rpb25dIDogTlVMTDsKKworCWlmICgoYyA9PSBOVUxMKSB8fCAhKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkpIHsKKwkJY29uZmlnLT5BdHRyaWJ1dGVzID0gMDsKKwkJY29uZmlnLT5WY2MgPSBzLT5zb2NrZXQuVmNjOworCQljb25maWctPlZwcDEgPSBjb25maWctPlZwcDIgPSBzLT5zb2NrZXQuVnBwOworCQlyZXR1cm4gQ1NfU1VDQ0VTUzsKKwl9CisKKwkvKiAhISEgVGhpcyBpcyBhIGhhY2sgISEhICovCisJbWVtY3B5KCZjb25maWctPkF0dHJpYnV0ZXMsICZjLT5BdHRyaWJ1dGVzLCBzaXplb2YoY29uZmlnX3QpKTsKKwljb25maWctPkF0dHJpYnV0ZXMgfD0gQ09ORl9WQUxJRF9DTElFTlQ7CisJY29uZmlnLT5DYXJkVmFsdWVzID0gYy0+Q2FyZFZhbHVlczsKKwljb25maWctPklSUUF0dHJpYnV0ZXMgPSBjLT5pcnEuQXR0cmlidXRlczsKKwljb25maWctPkFzc2lnbmVkSVJRID0gcy0+aXJxLkFzc2lnbmVkSVJROworCWNvbmZpZy0+QmFzZVBvcnQxID0gYy0+aW8uQmFzZVBvcnQxOworCWNvbmZpZy0+TnVtUG9ydHMxID0gYy0+aW8uTnVtUG9ydHMxOworCWNvbmZpZy0+QXR0cmlidXRlczEgPSBjLT5pby5BdHRyaWJ1dGVzMTsKKwljb25maWctPkJhc2VQb3J0MiA9IGMtPmlvLkJhc2VQb3J0MjsKKwljb25maWctPk51bVBvcnRzMiA9IGMtPmlvLk51bVBvcnRzMjsKKwljb25maWctPkF0dHJpYnV0ZXMyID0gYy0+aW8uQXR0cmlidXRlczI7CisJY29uZmlnLT5JT0FkZHJMaW5lcyA9IGMtPmlvLklPQWRkckxpbmVzOworCisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvICovCisKK2ludCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJICBjb25maWdfaW5mb190ICpjb25maWcpCit7CisJcmV0dXJuIHBjY2FyZF9nZXRfY29uZmlndXJhdGlvbl9pbmZvKHBfZGV2LT5zb2NrZXQsIHBfZGV2LT5mdW5jLAorCQkJCQkgICAgIGNvbmZpZyk7Cit9CitFWFBPUlRfU1lNQk9MKHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKTsKKworCisvKiogcGNtY2lhX2dldF93aW5kb3cKKyAqLworaW50IHBjbWNpYV9nZXRfd2luZG93KHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCB3aW5kb3dfaGFuZGxlX3QgKmhhbmRsZSwKKwkJICAgICAgaW50IGlkeCwgd2luX3JlcV90ICpyZXEpCit7CisJd2luZG93X3QgKndpbjsKKwlpbnQgdzsKKworCWlmICghcyB8fCAhKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKwlmb3IgKHcgPSBpZHg7IHcgPCBNQVhfV0lOOyB3KyspCisJCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9XSU5fUkVRKHcpKQorCQkJYnJlYWs7CisJaWYgKHcgPT0gTUFYX1dJTikKKwkJcmV0dXJuIENTX05PX01PUkVfSVRFTVM7CisJd2luID0gJnMtPndpblt3XTsKKwlyZXEtPkJhc2UgPSB3aW4tPmN0bC5yZXMtPnN0YXJ0OworCXJlcS0+U2l6ZSA9IHdpbi0+Y3RsLnJlcy0+ZW5kIC0gd2luLT5jdGwucmVzLT5zdGFydCArIDE7CisJcmVxLT5BY2Nlc3NTcGVlZCA9IHdpbi0+Y3RsLnNwZWVkOworCXJlcS0+QXR0cmlidXRlcyA9IDA7CisJaWYgKHdpbi0+Y3RsLmZsYWdzICYgTUFQX0FUVFJJQikKKwkJcmVxLT5BdHRyaWJ1dGVzIHw9IFdJTl9NRU1PUllfVFlQRV9BTTsKKwlpZiAod2luLT5jdGwuZmxhZ3MgJiBNQVBfQUNUSVZFKQorCQlyZXEtPkF0dHJpYnV0ZXMgfD0gV0lOX0VOQUJMRTsKKwlpZiAod2luLT5jdGwuZmxhZ3MgJiBNQVBfMTZCSVQpCisJCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fREFUQV9XSURUSF8xNjsKKwlpZiAod2luLT5jdGwuZmxhZ3MgJiBNQVBfVVNFX1dBSVQpCisJCXJlcS0+QXR0cmlidXRlcyB8PSBXSU5fVVNFX1dBSVQ7CisJKmhhbmRsZSA9IHdpbjsKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX2dldF93aW5kb3cgKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX2dldF93aW5kb3cpOworCisKKy8qKiBwY2NhcmRfZ2V0X3N0YXR1cworICoKKyAqIEdldCB0aGUgY3VycmVudCBzb2NrZXQgc3RhdGUgYml0cy4gIFdlIGRvbid0IHN1cHBvcnQgdGhlIGxhdGNoZWQKKyAqIFNvY2tldFN0YXRlIHlldDogSSBoYXZlbid0IHNlZW4gYW55IHBvaW50IGZvciBpdC4KKyAqLworCitpbnQgcGNjYXJkX2dldF9zdGF0dXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBmdW5jdGlvbiwKKwkJICAgICAgY3Nfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwljb25maWdfdCAqYzsKKwlpbnQgdmFsOworCisJcy0+b3BzLT5nZXRfc3RhdHVzKHMsICZ2YWwpOworCXN0YXR1cy0+Q2FyZFN0YXRlID0gc3RhdHVzLT5Tb2NrZXRTdGF0ZSA9IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTX0RFVEVDVCkgPyBDU19FVkVOVF9DQVJEX0RFVEVDVCA6IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTX0NBUkRCVVMpID8gQ1NfRVZFTlRfQ0JfREVURUNUIDogMDsKKwlzdGF0dXMtPkNhcmRTdGF0ZSB8PSAodmFsICYgU1NfM1ZDQVJEKSA/IENTX0VWRU5UXzNWQ0FSRCA6IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0gKHZhbCAmIFNTX1hWQ0FSRCkgPyBDU19FVkVOVF9YVkNBUkQgOiAwOworCWlmIChzLT5zdGF0ZSAmIFNPQ0tFVF9TVVNQRU5EKQorCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PSBDU19FVkVOVF9QTV9TVVNQRU5EOworCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKworCWMgPSAocy0+Y29uZmlnICE9IE5VTEwpID8gJnMtPmNvbmZpZ1tmdW5jdGlvbl0gOiBOVUxMOworCWlmICgoYyAhPSBOVUxMKSAmJiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKSAmJgorCSAgICAoYy0+SW50VHlwZSAmIChJTlRfTUVNT1JZX0FORF9JTyB8IElOVF9aT09NRURfVklERU8pKSkgeworCQl1X2NoYXIgcmVnOworCQlpZiAoYy0+UHJlc2VudCAmIFBSRVNFTlRfUElOX1JFUExBQ0UpIHsKKwkJCXBjbWNpYV9yZWFkX2Npc19tZW0ocywgMSwgKGMtPkNvbmZpZ0Jhc2UrQ0lTUkVHX1BSUik+PjEsIDEsICZyZWcpOworCQkJc3RhdHVzLT5DYXJkU3RhdGUgfD0KKwkJCQkocmVnICYgUFJSX1dQX1NUQVRVUykgPyBDU19FVkVOVF9XUklURV9QUk9URUNUIDogMDsKKwkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCQkJKHJlZyAmIFBSUl9SRUFEWV9TVEFUVVMpID8gQ1NfRVZFTlRfUkVBRFlfQ0hBTkdFIDogMDsKKwkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCQkJKHJlZyAmIFBSUl9CVkQyX1NUQVRVUykgPyBDU19FVkVOVF9CQVRURVJZX0xPVyA6IDA7CisJCQlzdGF0dXMtPkNhcmRTdGF0ZSB8PQorCQkJCShyZWcgJiBQUlJfQlZEMV9TVEFUVVMpID8gQ1NfRVZFTlRfQkFUVEVSWV9ERUFEIDogMDsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vIFBSUj8gIFRoZW4gYXNzdW1lIHdlJ3JlIGFsd2F5cyByZWFkeSAqLworCQkJc3RhdHVzLT5DYXJkU3RhdGUgfD0gQ1NfRVZFTlRfUkVBRFlfQ0hBTkdFOworCQl9CisJCWlmIChjLT5QcmVzZW50ICYgUFJFU0VOVF9FWFRfU1RBVFVTKSB7CisJCQlwY21jaWFfcmVhZF9jaXNfbWVtKHMsIDEsIChjLT5Db25maWdCYXNlK0NJU1JFR19FU1IpPj4xLCAxLCAmcmVnKTsKKwkJCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCQkJKHJlZyAmIEVTUl9SRVFfQVRUTikgPyBDU19FVkVOVF9SRVFVRVNUX0FUVEVOVElPTiA6IDA7CisJCX0KKwkJcmV0dXJuIENTX1NVQ0NFU1M7CisJfQorCXN0YXR1cy0+Q2FyZFN0YXRlIHw9CisJCSh2YWwgJiBTU19XUlBST1QpID8gQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCA6IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0KKwkJKHZhbCAmIFNTX0JBVERFQUQpID8gQ1NfRVZFTlRfQkFUVEVSWV9ERUFEIDogMDsKKwlzdGF0dXMtPkNhcmRTdGF0ZSB8PQorCQkodmFsICYgU1NfQkFUV0FSTikgPyBDU19FVkVOVF9CQVRURVJZX0xPVyA6IDA7CisJc3RhdHVzLT5DYXJkU3RhdGUgfD0KKwkJKHZhbCAmIFNTX1JFQURZKSA/IENTX0VWRU5UX1JFQURZX0NIQU5HRSA6IDA7CisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjY2FyZF9nZXRfc3RhdHVzICovCisKK2ludCBwY21jaWFfZ2V0X3N0YXR1cyhjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBjc19zdGF0dXNfdCAqc3RhdHVzKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCXMgPSBTT0NLRVQoaGFuZGxlKTsKKwlyZXR1cm4gcGNjYXJkX2dldF9zdGF0dXMocywgaGFuZGxlLT5mdW5jLCBzdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X3N0YXR1cyk7CisKKworCisvKiogcGNtY2lhX2dldF9tZW1fcGFnZQorICoKKyAqIENoYW5nZSB0aGUgY2FyZCBhZGRyZXNzIG9mIGFuIGFscmVhZHkgb3BlbiBtZW1vcnkgd2luZG93LgorICovCitpbnQgcGNtY2lhX2dldF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKQoreworCWlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCisJCXJldHVybiBDU19CQURfSEFORExFOworCXJlcS0+UGFnZSA9IDA7CisJcmVxLT5DYXJkT2Zmc2V0ID0gd2luLT5jdGwuY2FyZF9zdGFydDsKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX2dldF9tZW1fcGFnZSAqLworRVhQT1JUX1NZTUJPTChwY21jaWFfZ2V0X21lbV9wYWdlKTsKKworCitpbnQgcGNtY2lhX21hcF9tZW1fcGFnZSh3aW5kb3dfaGFuZGxlX3Qgd2luLCBtZW1yZXFfdCAqcmVxKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCWlmICgod2luID09IE5VTEwpIHx8ICh3aW4tPm1hZ2ljICE9IFdJTkRPV19NQUdJQykpCisJCXJldHVybiBDU19CQURfSEFORExFOworCWlmIChyZXEtPlBhZ2UgIT0gMCkKKwkJcmV0dXJuIENTX0JBRF9QQUdFOworCXMgPSB3aW4tPnNvY2s7CisJd2luLT5jdGwuY2FyZF9zdGFydCA9IHJlcS0+Q2FyZE9mZnNldDsKKwlpZiAocy0+b3BzLT5zZXRfbWVtX21hcChzLCAmd2luLT5jdGwpICE9IDApCisJCXJldHVybiBDU19CQURfT0ZGU0VUOworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY21jaWFfbWFwX21lbV9wYWdlICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9tYXBfbWVtX3BhZ2UpOworCisKKy8qKiBwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24KKyAqCisgKiBNb2RpZnkgYSBsb2NrZWQgc29ja2V0IGNvbmZpZ3VyYXRpb24KKyAqLworaW50IHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJbW9kY29uZl90ICptb2QpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisJY29uZmlnX3QgKmM7CisKKwlzID0gcF9kZXYtPnNvY2tldDsKKwljID0gQ09ORklHKHBfZGV2KTsKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisJaWYgKCEoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKSkKKwkJcmV0dXJuIENTX0NPTkZJR1VSQVRJT05fTE9DS0VEOworCisJaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfSVJRX0NIQU5HRV9WQUxJRCkgeworCQlpZiAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9FTkFCTEVfSVJRKSB7CisJCQljLT5BdHRyaWJ1dGVzIHw9IENPTkZfRU5BQkxFX0lSUTsKKwkJCXMtPnNvY2tldC5pb19pcnEgPSBzLT5pcnEuQXNzaWduZWRJUlE7CisJCX0gZWxzZSB7CisJCQljLT5BdHRyaWJ1dGVzICY9IH5DT05GX0VOQUJMRV9JUlE7CisJCQlzLT5zb2NrZXQuaW9faXJxID0gMDsKKwkJfQorCQlzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCk7CisJfQorCisJaWYgKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVkNDX0NIQU5HRV9WQUxJRCkKKwkJcmV0dXJuIENTX0JBRF9WQ0M7CisKKwkvKiBXZSBvbmx5IGFsbG93IGNoYW5naW5nIFZwcDEgYW5kIFZwcDIgdG8gdGhlIHNhbWUgdmFsdWUgKi8KKwlpZiAoKG1vZC0+QXR0cmlidXRlcyAmIENPTkZfVlBQMV9DSEFOR0VfVkFMSUQpICYmCisJICAgIChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDJfQ0hBTkdFX1ZBTElEKSkgeworCQlpZiAobW9kLT5WcHAxICE9IG1vZC0+VnBwMikKKwkJCXJldHVybiBDU19CQURfVlBQOworCQljLT5WcHAxID0gYy0+VnBwMiA9IHMtPnNvY2tldC5WcHAgPSBtb2QtPlZwcDE7CisJCWlmIChzLT5vcHMtPnNldF9zb2NrZXQocywgJnMtPnNvY2tldCkpCisJCQlyZXR1cm4gQ1NfQkFEX1ZQUDsKKwl9IGVsc2UgaWYgKChtb2QtPkF0dHJpYnV0ZXMgJiBDT05GX1ZQUDFfQ0hBTkdFX1ZBTElEKSB8fAorCQkgICAobW9kLT5BdHRyaWJ1dGVzICYgQ09ORl9WUFAyX0NIQU5HRV9WQUxJRCkpCisJCXJldHVybiBDU19CQURfVlBQOworCisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIG1vZGlmeV9jb25maWd1cmF0aW9uICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9tb2RpZnlfY29uZmlndXJhdGlvbik7CisKKworaW50IHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KQoreworCXBjY2FyZF9pb19tYXAgaW8gPSB7IDAsIDAsIDAsIDAsIDEgfTsKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7CisJaW50IGk7CisKKwlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfQ09ORklHX0xPQ0tFRCkpCisJCXJldHVybiBDU19CQURfSEFORExFOworCXBfZGV2LT5zdGF0ZSAmPSB+Q0xJRU5UX0NPTkZJR19MT0NLRUQ7CisKKwlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfU1RBTEUpKSB7CisJCWNvbmZpZ190ICpjID0gQ09ORklHKHBfZGV2KTsKKwkJaWYgKC0tKHMtPmxvY2tfY291bnQpID09IDApIHsKKwkJCXMtPnNvY2tldC5mbGFncyA9IFNTX09VVFBVVF9FTkE7ICAgLyogSXMgdGhpcyBjb3JyZWN0PyAqLworCQkJcy0+c29ja2V0LlZwcCA9IDA7CisJCQlzLT5zb2NrZXQuaW9faXJxID0gMDsKKwkJCXMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKKwkJfQorCQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKQorCQkJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykgeworCQkJCWlmIChzLT5pb1tpXS5OdW1Qb3J0cyA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlzLT5pb1tpXS5Db25maWctLTsKKwkJCQlpZiAocy0+aW9baV0uQ29uZmlnICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWlvLm1hcCA9IGk7CisJCQkJcy0+b3BzLT5zZXRfaW9fbWFwKHMsICZpbyk7CisJCQl9CisJCWMtPnN0YXRlICY9IH5DT05GSUdfTE9DS0VEOworCX0KKworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24pOworCisKKy8qKiBwY21jaWFfcmVsZWFzZV9pbworICoKKyAqIFJlbGVhc2VfaW8oKSByZWxlYXNlcyB0aGUgSS9PIHJhbmdlcyBhbGxvY2F0ZWQgYnkgYSBjbGllbnQuICBUaGlzCisgKiBtYXkgYmUgaW52b2tlZCBzb21lIHRpbWUgYWZ0ZXIgYSBjYXJkIGVqZWN0aW9uIGhhcyBhbHJlYWR5IGR1bXBlZAorICogdGhlIGFjdHVhbCBzb2NrZXQgY29uZmlndXJhdGlvbiwgc28gaWYgdGhlIGNsaWVudCBpcyAic3RhbGUiLCB3ZQorICogZG9uJ3QgYm90aGVyIGNoZWNraW5nIHRoZSBwb3J0IHJhbmdlcyBhZ2FpbnN0IHRoZSBjdXJyZW50IHNvY2tldAorICogdmFsdWVzLgorICovCitpbnQgcGNtY2lhX3JlbGVhc2VfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gcF9kZXYtPnNvY2tldDsKKworCWlmICghKHBfZGV2LT5zdGF0ZSAmIENMSUVOVF9JT19SRVEpKQorCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9JT19SRVE7CisKKwlpZiAoIShwX2Rldi0+c3RhdGUgJiBDTElFTlRfU1RBTEUpKSB7CisJCWNvbmZpZ190ICpjID0gQ09ORklHKHBfZGV2KTsKKwkJaWYgKGMtPnN0YXRlICYgQ09ORklHX0xPQ0tFRCkKKwkJCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKKwkJaWYgKChjLT5pby5CYXNlUG9ydDEgIT0gcmVxLT5CYXNlUG9ydDEpIHx8CisJCSAgICAoYy0+aW8uTnVtUG9ydHMxICE9IHJlcS0+TnVtUG9ydHMxKSB8fAorCQkgICAgKGMtPmlvLkJhc2VQb3J0MiAhPSByZXEtPkJhc2VQb3J0MikgfHwKKwkJICAgIChjLT5pby5OdW1Qb3J0czIgIT0gcmVxLT5OdW1Qb3J0czIpKQorCQkJcmV0dXJuIENTX0JBRF9BUkdTOworCQljLT5zdGF0ZSAmPSB+Q09ORklHX0lPX1JFUTsKKwl9CisKKwlyZWxlYXNlX2lvX3NwYWNlKHMsIHJlcS0+QmFzZVBvcnQxLCByZXEtPk51bVBvcnRzMSk7CisJaWYgKHJlcS0+TnVtUG9ydHMyKQorCQlyZWxlYXNlX2lvX3NwYWNlKHMsIHJlcS0+QmFzZVBvcnQyLCByZXEtPk51bVBvcnRzMik7CisKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlbGVhc2VfaW8gKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3JlbGVhc2VfaW8pOworCisKK2ludCBwY21jaWFfcmVsZWFzZV9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7CisJaWYgKCEocF9kZXYtPnN0YXRlICYgQ0xJRU5UX0lSUV9SRVEpKQorCQlyZXR1cm4gQ1NfQkFEX0hBTkRMRTsKKwlwX2Rldi0+c3RhdGUgJj0gfkNMSUVOVF9JUlFfUkVROworCisJaWYgKCEocF9kZXYtPnN0YXRlICYgQ0xJRU5UX1NUQUxFKSkgeworCQljb25maWdfdCAqYyA9IENPTkZJRyhwX2Rldik7CisJCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCisJCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJCWlmIChjLT5pcnEuQXR0cmlidXRlcyAhPSByZXEtPkF0dHJpYnV0ZXMpCisJCQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKKwkJaWYgKHMtPmlycS5Bc3NpZ25lZElSUSAhPSByZXEtPkFzc2lnbmVkSVJRKQorCQkJcmV0dXJuIENTX0JBRF9JUlE7CisJCWlmICgtLXMtPmlycS5Db25maWcgPT0gMCkgeworCQkJYy0+c3RhdGUgJj0gfkNPTkZJR19JUlFfUkVROworCQkJcy0+aXJxLkFzc2lnbmVkSVJRID0gMDsKKwkJfQorCX0KKworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpIHsKKwkJZnJlZV9pcnEocmVxLT5Bc3NpZ25lZElSUSwgcmVxLT5JbnN0YW5jZSk7CisJfQorCisjaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQorCXBjbWNpYV91c2VkX2lycVtyZXEtPkFzc2lnbmVkSVJRXS0tOworI2VuZGlmCisKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlbGVhc2VfaXJxICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZWxlYXNlX2lycSk7CisKKworaW50IHBjbWNpYV9yZWxlYXNlX3dpbmRvdyh3aW5kb3dfaGFuZGxlX3Qgd2luKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzOworCisJaWYgKCh3aW4gPT0gTlVMTCkgfHwgKHdpbi0+bWFnaWMgIT0gV0lORE9XX01BR0lDKSkKKwkJcmV0dXJuIENTX0JBRF9IQU5ETEU7CisJcyA9IHdpbi0+c29jazsKKwlpZiAoISh3aW4tPmhhbmRsZS0+c3RhdGUgJiBDTElFTlRfV0lOX1JFUSh3aW4tPmluZGV4KSkpCisJCXJldHVybiBDU19CQURfSEFORExFOworCisJLyogU2h1dCBkb3duIG1lbW9yeSB3aW5kb3cgKi8KKwl3aW4tPmN0bC5mbGFncyAmPSB+TUFQX0FDVElWRTsKKwlzLT5vcHMtPnNldF9tZW1fbWFwKHMsICZ3aW4tPmN0bCk7CisJcy0+c3RhdGUgJj0gflNPQ0tFVF9XSU5fUkVRKHdpbi0+aW5kZXgpOworCisJLyogUmVsZWFzZSBzeXN0ZW0gbWVtb3J5ICovCisJaWYgKHdpbi0+Y3RsLnJlcykgeworCQlyZWxlYXNlX3Jlc291cmNlKHdpbi0+Y3RsLnJlcyk7CisJCWtmcmVlKHdpbi0+Y3RsLnJlcyk7CisJCXdpbi0+Y3RsLnJlcyA9IE5VTEw7CisJfQorCXdpbi0+aGFuZGxlLT5zdGF0ZSAmPSB+Q0xJRU5UX1dJTl9SRVEod2luLT5pbmRleCk7CisKKwl3aW4tPm1hZ2ljID0gMDsKKworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY21jaWFfcmVsZWFzZV93aW5kb3cgKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3JlbGVhc2Vfd2luZG93KTsKKworCitpbnQgcGNtY2lhX3JlcXVlc3RfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsCisJCQkJIGNvbmZpZ19yZXFfdCAqcmVxKQoreworCWludCBpOworCXVfaW50IGJhc2U7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OworCWNvbmZpZ190ICpjOworCXBjY2FyZF9pb19tYXAgaW9tYXA7CisKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIENTX05PX0NBUkQ7CisKKwlpZiAocmVxLT5JbnRUeXBlICYgSU5UX0NBUkRCVVMpCisJCXJldHVybiBDU19VTlNVUFBPUlRFRF9NT0RFOworCWMgPSBDT05GSUcocF9kZXYpOworCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCisJCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKKworCS8qIERvIHBvd2VyIGNvbnRyb2wuICBXZSBkb24ndCBhbGxvdyBjaGFuZ2VzIGluIFZjYy4gKi8KKwlpZiAocy0+c29ja2V0LlZjYyAhPSByZXEtPlZjYykKKwkJcmV0dXJuIENTX0JBRF9WQ0M7CisJaWYgKHJlcS0+VnBwMSAhPSByZXEtPlZwcDIpCisJCXJldHVybiBDU19CQURfVlBQOworCXMtPnNvY2tldC5WcHAgPSByZXEtPlZwcDE7CisJaWYgKHMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KSkKKwkJcmV0dXJuIENTX0JBRF9WUFA7CisKKwljLT5WY2MgPSByZXEtPlZjYzsgYy0+VnBwMSA9IGMtPlZwcDIgPSByZXEtPlZwcDE7CisKKwkvKiBQaWNrIG1lbW9yeSBvciBJL08gY2FyZCwgRE1BIG1vZGUsIGludGVycnVwdCAqLworCWMtPkludFR5cGUgPSByZXEtPkludFR5cGU7CisJYy0+QXR0cmlidXRlcyA9IHJlcS0+QXR0cmlidXRlczsKKwlpZiAocmVxLT5JbnRUeXBlICYgSU5UX01FTU9SWV9BTkRfSU8pCisJCXMtPnNvY2tldC5mbGFncyB8PSBTU19JT0NBUkQ7CisJaWYgKHJlcS0+SW50VHlwZSAmIElOVF9aT09NRURfVklERU8pCisJCXMtPnNvY2tldC5mbGFncyB8PSBTU19aVkNBUkQgfCBTU19JT0NBUkQ7CisJaWYgKHJlcS0+QXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0RNQSkKKwkJcy0+c29ja2V0LmZsYWdzIHw9IFNTX0RNQV9NT0RFOworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBDT05GX0VOQUJMRV9TUEtSKQorCQlzLT5zb2NrZXQuZmxhZ3MgfD0gU1NfU1BLUl9FTkE7CisJaWYgKHJlcS0+QXR0cmlidXRlcyAmIENPTkZfRU5BQkxFX0lSUSkKKwkJcy0+c29ja2V0LmlvX2lycSA9IHMtPmlycS5Bc3NpZ25lZElSUTsKKwllbHNlCisJCXMtPnNvY2tldC5pb19pcnEgPSAwOworCXMtPm9wcy0+c2V0X3NvY2tldChzLCAmcy0+c29ja2V0KTsKKwlzLT5sb2NrX2NvdW50Kys7CisKKwkvKiBTZXQgdXAgQ0lTIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJYmFzZSA9IGMtPkNvbmZpZ0Jhc2UgPSByZXEtPkNvbmZpZ0Jhc2U7CisJYy0+UHJlc2VudCA9IGMtPkNhcmRWYWx1ZXMgPSByZXEtPlByZXNlbnQ7CisJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfQ09QWSkgeworCQljLT5Db3B5ID0gcmVxLT5Db3B5OworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19TQ1IpPj4xLCAxLCAmYy0+Q29weSk7CisJfQorCWlmIChyZXEtPlByZXNlbnQgJiBQUkVTRU5UX09QVElPTikgeworCQlpZiAocy0+ZnVuY3Rpb25zID09IDEpIHsKKwkJCWMtPk9wdGlvbiA9IHJlcS0+Q29uZmlnSW5kZXggJiBDT1JfQ09ORklHX01BU0s7CisJCX0gZWxzZSB7CisJCQljLT5PcHRpb24gPSByZXEtPkNvbmZpZ0luZGV4ICYgQ09SX01GQ19DT05GSUdfTUFTSzsKKwkJCWMtPk9wdGlvbiB8PSBDT1JfRlVOQ19FTkF8Q09SX0lSRVFfRU5BOworCQkJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9CQVNFXzApCisJCQkJYy0+T3B0aW9uIHw9IENPUl9BRERSX0RFQ09ERTsKKwkJfQorCQlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSVJRX1JFUSkKKwkJCWlmICghKGMtPmlycS5BdHRyaWJ1dGVzICYgSVJRX0ZPUkNFRF9QVUxTRSkpCisJCQkJYy0+T3B0aW9uIHw9IENPUl9MRVZFTF9SRVE7CisJCXBjbWNpYV93cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0NPUik+PjEsIDEsICZjLT5PcHRpb24pOworCQltZGVsYXkoNDApOworCX0KKwlpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9TVEFUVVMpIHsKKwkJYy0+U3RhdHVzID0gcmVxLT5TdGF0dXM7CisJCXBjbWNpYV93cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX0NDU1IpPj4xLCAxLCAmYy0+U3RhdHVzKTsKKwl9CisJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfUElOX1JFUExBQ0UpIHsKKwkJYy0+UGluID0gcmVxLT5QaW47CisJCXBjbWNpYV93cml0ZV9jaXNfbWVtKHMsIDEsIChiYXNlICsgQ0lTUkVHX1BSUik+PjEsIDEsICZjLT5QaW4pOworCX0KKwlpZiAocmVxLT5QcmVzZW50ICYgUFJFU0VOVF9FWFRfU1RBVFVTKSB7CisJCWMtPkV4dFN0YXR1cyA9IHJlcS0+RXh0U3RhdHVzOworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19FU1IpPj4xLCAxLCAmYy0+RXh0U3RhdHVzKTsKKwl9CisJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9CQVNFXzApIHsKKwkJdV9jaGFyIGIgPSBjLT5pby5CYXNlUG9ydDEgJiAweGZmOworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT0JBU0VfMCk+PjEsIDEsICZiKTsKKwkJYiA9IChjLT5pby5CYXNlUG9ydDEgPj4gOCkgJiAweGZmOworCQlwY21jaWFfd3JpdGVfY2lzX21lbShzLCAxLCAoYmFzZSArIENJU1JFR19JT0JBU0VfMSk+PjEsIDEsICZiKTsKKwl9CisJaWYgKHJlcS0+UHJlc2VudCAmIFBSRVNFTlRfSU9TSVpFKSB7CisJCXVfY2hhciBiID0gYy0+aW8uTnVtUG9ydHMxICsgYy0+aW8uTnVtUG9ydHMyIC0gMTsKKwkJcGNtY2lhX3dyaXRlX2Npc19tZW0ocywgMSwgKGJhc2UgKyBDSVNSRUdfSU9TSVpFKT4+MSwgMSwgJmIpOworCX0KKworCS8qIENvbmZpZ3VyZSBJL08gd2luZG93cyAqLworCWlmIChjLT5zdGF0ZSAmIENPTkZJR19JT19SRVEpIHsKKwkJaW9tYXAuc3BlZWQgPSBpb19zcGVlZDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9JT19XSU47IGkrKykKKwkJCWlmIChzLT5pb1tpXS5OdW1Qb3J0cyAhPSAwKSB7CisJCQkJaW9tYXAubWFwID0gaTsKKwkJCQlpb21hcC5mbGFncyA9IE1BUF9BQ1RJVkU7CisJCQkJc3dpdGNoIChzLT5pb1tpXS5BdHRyaWJ1dGVzICYgSU9fREFUQV9QQVRIX1dJRFRIKSB7CisJCQkJY2FzZSBJT19EQVRBX1BBVEhfV0lEVEhfMTY6CisJCQkJCWlvbWFwLmZsYWdzIHw9IE1BUF8xNkJJVDsgYnJlYWs7CisJCQkJY2FzZSBJT19EQVRBX1BBVEhfV0lEVEhfQVVUTzoKKwkJCQkJaW9tYXAuZmxhZ3MgfD0gTUFQX0FVVE9TWjsgYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlvbWFwLnN0YXJ0ID0gcy0+aW9baV0uQmFzZVBvcnQ7CisJCQkJaW9tYXAuc3RvcCA9IGlvbWFwLnN0YXJ0ICsgcy0+aW9baV0uTnVtUG9ydHMgLSAxOworCQkJCXMtPm9wcy0+c2V0X2lvX21hcChzLCAmaW9tYXApOworCQkJCXMtPmlvW2ldLkNvbmZpZysrOworCQkJfQorCX0KKworCWMtPnN0YXRlIHw9IENPTkZJR19MT0NLRUQ7CisJcF9kZXYtPnN0YXRlIHw9IENMSUVOVF9DT05GSUdfTE9DS0VEOworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY21jaWFfcmVxdWVzdF9jb25maWd1cmF0aW9uICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24pOworCisKKy8qKiBwY21jaWFfcmVxdWVzdF9pbworICoKKyAqIFJlcXVlc3RfaW8oKSByZXNlcnZlcyByYW5nZXMgb2YgcG9ydCBhZGRyZXNzZXMgZm9yIGEgc29ja2V0LgorICogSSBoYXZlIG5vdCBpbXBsZW1lbnRlZCByYW5nZSBzaGFyaW5nIG9yIGFsaWFzIGFkZHJlc3NpbmcuCisgKi8KK2ludCBwY21jaWFfcmVxdWVzdF9pbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGlvX3JlcV90ICpyZXEpCit7CisJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBwX2Rldi0+c29ja2V0OworCWNvbmZpZ190ICpjOworCisJaWYgKCEocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkpCisJCXJldHVybiBDU19OT19DQVJEOworCisJaWYgKCFyZXEpCisJCXJldHVybiBDU19VTlNVUFBPUlRFRF9NT0RFOworCWMgPSBDT05GSUcocF9kZXYpOworCWlmIChjLT5zdGF0ZSAmIENPTkZJR19MT0NLRUQpCisJCXJldHVybiBDU19DT05GSUdVUkFUSU9OX0xPQ0tFRDsKKwlpZiAoYy0+c3RhdGUgJiBDT05GSUdfSU9fUkVRKQorCQlyZXR1cm4gQ1NfSU5fVVNFOworCWlmIChyZXEtPkF0dHJpYnV0ZXMxICYgKElPX1NIQVJFRCB8IElPX0ZPUkNFX0FMSUFTX0FDQ0VTUykpCisJCXJldHVybiBDU19CQURfQVRUUklCVVRFOworCWlmICgocmVxLT5OdW1Qb3J0czIgPiAwKSAmJgorCSAgICAocmVxLT5BdHRyaWJ1dGVzMiAmIChJT19TSEFSRUQgfCBJT19GT1JDRV9BTElBU19BQ0NFU1MpKSkKKwkJcmV0dXJuIENTX0JBRF9BVFRSSUJVVEU7CisKKwlpZiAoYWxsb2NfaW9fc3BhY2UocywgcmVxLT5BdHRyaWJ1dGVzMSwgJnJlcS0+QmFzZVBvcnQxLAorCQkJICAgcmVxLT5OdW1Qb3J0czEsIHJlcS0+SU9BZGRyTGluZXMpKQorCQlyZXR1cm4gQ1NfSU5fVVNFOworCisJaWYgKHJlcS0+TnVtUG9ydHMyKSB7CisJCWlmIChhbGxvY19pb19zcGFjZShzLCByZXEtPkF0dHJpYnV0ZXMyLCAmcmVxLT5CYXNlUG9ydDIsCisJCQkJICAgcmVxLT5OdW1Qb3J0czIsIHJlcS0+SU9BZGRyTGluZXMpKSB7CisJCQlyZWxlYXNlX2lvX3NwYWNlKHMsIHJlcS0+QmFzZVBvcnQxLCByZXEtPk51bVBvcnRzMSk7CisJCQlyZXR1cm4gQ1NfSU5fVVNFOworCQl9CisJfQorCisJYy0+aW8gPSAqcmVxOworCWMtPnN0YXRlIHw9IENPTkZJR19JT19SRVE7CisJcF9kZXYtPnN0YXRlIHw9IENMSUVOVF9JT19SRVE7CisJcmV0dXJuIENTX1NVQ0NFU1M7Cit9IC8qIHBjbWNpYV9yZXF1ZXN0X2lvICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2lvKTsKKworCisvKiogcGNtY2lhX3JlcXVlc3RfaXJxCisgKgorICogUmVxdWVzdF9pcnEoKSByZXNlcnZlcyBhbiBpcnEgZm9yIHRoaXMgY2xpZW50LgorICoKKyAqIEFsc28sIHNpbmNlIExpbnV4IG9ubHkgcmVzZXJ2ZXMgaXJxJ3Mgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQorICogaG9va2VkLCB3ZSBkb24ndCBndWFyYW50ZWUgdGhhdCBhbiBpcnEgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUKKyAqIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgbG9ja2VkLiAgTm93IHRoYXQgSSB0aGluayBhYm91dCBpdCwKKyAqIHRoZXJlIG1pZ2h0IGJlIGEgd2F5IHRvIGZpeCB0aGlzIHVzaW5nIGEgZHVtbXkgaGFuZGxlci4KKyAqLworCisjaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQorc3RhdGljIGlycXJldHVybl90IHRlc3RfYWN0aW9uKGludCBjcGwsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIElSUV9OT05FOworfQorI2VuZGlmCisKK2ludCBwY21jaWFfcmVxdWVzdF9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHBfZGV2LT5zb2NrZXQ7CisJY29uZmlnX3QgKmM7CisJaW50IHJldCA9IENTX0lOX1VTRSwgaXJxID0gMDsKKworCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKwljID0gQ09ORklHKHBfZGV2KTsKKwlpZiAoYy0+c3RhdGUgJiBDT05GSUdfTE9DS0VEKQorCQlyZXR1cm4gQ1NfQ09ORklHVVJBVElPTl9MT0NLRUQ7CisJaWYgKGMtPnN0YXRlICYgQ09ORklHX0lSUV9SRVEpCisJCXJldHVybiBDU19JTl9VU0U7CisKKyNpZmRlZiBDT05GSUdfUENNQ0lBX1BST0JFCisJaWYgKHMtPmlycS5Bc3NpZ25lZElSUSAhPSAwKSB7CisJCS8qIElmIHRoZSBpbnRlcnJ1cHQgaXMgYWxyZWFkeSBhc3NpZ25lZCwgaXQgbXVzdCBiZSB0aGUgc2FtZSAqLworCQlpcnEgPSBzLT5pcnEuQXNzaWduZWRJUlE7CisJfSBlbHNlIHsKKwkJaW50IHRyeTsKKwkJdTMyIG1hc2sgPSBzLT5pcnFfbWFzazsKKwkJdm9pZCAqZGF0YSA9IE5VTEw7CisKKwkJZm9yICh0cnkgPSAwOyB0cnkgPCA2NDsgdHJ5KyspIHsKKwkJCWlycSA9IHRyeSAlIDMyOworCisJCQkvKiBtYXJrZWQgYXMgYXZhaWxhYmxlIGJ5IGRyaXZlciwgYW5kIG5vdCBibG9ja2VkIGJ5IHVzZXJzcGFjZT8gKi8KKwkJCWlmICghKChtYXNrID4+IGlycSkgJiAxKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogYXZvaWQgYW4gSVJRIHdoaWNoIGlzIGFscmVhZHkgdXNlZCBieSBhIFBDTUNJQSBjYXJkICovCisJCQlpZiAoKHRyeSA8IDMyKSAmJiBwY21jaWFfdXNlZF9pcnFbaXJxXSkKKwkJCQljb250aW51ZTsKKworCQkJLyogcmVnaXN0ZXIgdGhlIGNvcnJlY3QgZHJpdmVyLCBpZiBwb3NzaWJsZSwgb2YgY2hlY2sgd2hldGhlcgorCQkJICogcmVnaXN0ZXJpbmcgYSBkdW1teSBoYW5kbGUgd29ya3MsIGkuZS4gaWYgdGhlIElSUSBpc24ndAorCQkJICogbWFya2VkIGFzIHVzZWQgYnkgdGhlIGtlcm5lbCByZXNvdXJjZSBtYW5hZ2VtZW50IGNvcmUgKi8KKwkJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwKKwkJCQkJICAocmVxLT5BdHRyaWJ1dGVzICYgSVJRX0hBTkRMRV9QUkVTRU5UKSA/IHJlcS0+SGFuZGxlciA6IHRlc3RfYWN0aW9uLAorCQkJCQkgICgocmVxLT5BdHRyaWJ1dGVzICYgSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HKSB8fAorCQkJCQkgICAocy0+ZnVuY3Rpb25zID4gMSkgfHwKKwkJCQkJICAgKGlycSA9PSBzLT5wY2lfaXJxKSkgPyBTQV9TSElSUSA6IDAsCisJCQkJCSAgcF9kZXYtPmRldi5idXNfaWQsCisJCQkJCSAgKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkgPyByZXEtPkluc3RhbmNlIDogZGF0YSk7CisJCQlpZiAoIXJldCkgeworCQkJCWlmICghKHJlcS0+QXR0cmlidXRlcyAmIElSUV9IQU5ETEVfUFJFU0VOVCkpCisJCQkJCWZyZWVfaXJxKGlycSwgZGF0YSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlpZiAocmV0KSB7CisJCWlmICghcy0+cGNpX2lycSkKKwkJCXJldHVybiByZXQ7CisJCWlycSA9IHMtPnBjaV9pcnE7CisJfQorCisJaWYgKHJldCAmJiByZXEtPkF0dHJpYnV0ZXMgJiBJUlFfSEFORExFX1BSRVNFTlQpIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGlycSwgcmVxLT5IYW5kbGVyLAorCQkJCSgocmVxLT5BdHRyaWJ1dGVzICYgSVJRX1RZUEVfRFlOQU1JQ19TSEFSSU5HKSB8fAorCQkJCSAocy0+ZnVuY3Rpb25zID4gMSkgfHwKKwkJCQkgKGlycSA9PSBzLT5wY2lfaXJxKSkgPyBTQV9TSElSUSA6IDAsCisJCQkJcF9kZXYtPmRldi5idXNfaWQsIHJlcS0+SW5zdGFuY2UpKQorCQkJcmV0dXJuIENTX0lOX1VTRTsKKwl9CisKKwljLT5pcnEuQXR0cmlidXRlcyA9IHJlcS0+QXR0cmlidXRlczsKKwlzLT5pcnEuQXNzaWduZWRJUlEgPSByZXEtPkFzc2lnbmVkSVJRID0gaXJxOworCXMtPmlycS5Db25maWcrKzsKKworCWMtPnN0YXRlIHw9IENPTkZJR19JUlFfUkVROworCXBfZGV2LT5zdGF0ZSB8PSBDTElFTlRfSVJRX1JFUTsKKworI2lmZGVmIENPTkZJR19QQ01DSUFfUFJPQkUKKwlwY21jaWFfdXNlZF9pcnFbaXJxXSsrOworI2VuZGlmCisKKwlyZXR1cm4gQ1NfU1VDQ0VTUzsKK30gLyogcGNtY2lhX3JlcXVlc3RfaXJxICovCitFWFBPUlRfU1lNQk9MKHBjbWNpYV9yZXF1ZXN0X2lycSk7CisKKworLyoqIHBjbWNpYV9yZXF1ZXN0X3dpbmRvdworICoKKyAqIFJlcXVlc3Rfd2luZG93KCkgZXN0YWJsaXNoZXMgYSBtYXBwaW5nIGJldHdlZW4gY2FyZCBtZW1vcnkgc3BhY2UKKyAqIGFuZCBzeXN0ZW0gbWVtb3J5IHNwYWNlLgorICovCitpbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KHN0cnVjdCBwY21jaWFfZGV2aWNlICoqcF9kZXYsIHdpbl9yZXFfdCAqcmVxLCB3aW5kb3dfaGFuZGxlX3QgKndoKQoreworCXN0cnVjdCBwY21jaWFfc29ja2V0ICpzID0gKCpwX2RldiktPnNvY2tldDsKKwl3aW5kb3dfdCAqd2luOworCXVfbG9uZyBhbGlnbjsKKwlpbnQgdzsKKworCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQorCQlyZXR1cm4gQ1NfTk9fQ0FSRDsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgKFdJTl9QQUdFRCB8IFdJTl9TSEFSRUQpKQorCQlyZXR1cm4gQ1NfQkFEX0FUVFJJQlVURTsKKworCS8qIFdpbmRvdyBzaXplIGRlZmF1bHRzIHRvIHNtYWxsZXN0IGF2YWlsYWJsZSAqLworCWlmIChyZXEtPlNpemUgPT0gMCkKKwkJcmVxLT5TaXplID0gcy0+bWFwX3NpemU7CisJYWxpZ24gPSAoKChzLT5mZWF0dXJlcyAmIFNTX0NBUF9NRU1fQUxJR04pIHx8CisJCSAgKHJlcS0+QXR0cmlidXRlcyAmIFdJTl9TVFJJQ1RfQUxJR04pKSA/CisJCSByZXEtPlNpemUgOiBzLT5tYXBfc2l6ZSk7CisJaWYgKHJlcS0+U2l6ZSAmIChzLT5tYXBfc2l6ZS0xKSkKKwkJcmV0dXJuIENTX0JBRF9TSVpFOworCWlmICgocmVxLT5CYXNlICYmIChzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSkgfHwKKwkgICAgKHJlcS0+QmFzZSAmIChhbGlnbi0xKSkpCisJCXJldHVybiBDU19CQURfQkFTRTsKKwlpZiAocmVxLT5CYXNlKQorCQlhbGlnbiA9IDA7CisKKwkvKiBBbGxvY2F0ZSBzeXN0ZW0gbWVtb3J5IHdpbmRvdyAqLworCWZvciAodyA9IDA7IHcgPCBNQVhfV0lOOyB3KyspCisJCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1dJTl9SRVEodykpKSBicmVhazsKKwlpZiAodyA9PSBNQVhfV0lOKQorCQlyZXR1cm4gQ1NfT1VUX09GX1JFU09VUkNFOworCisJd2luID0gJnMtPndpblt3XTsKKwl3aW4tPm1hZ2ljID0gV0lORE9XX01BR0lDOworCXdpbi0+aW5kZXggPSB3OworCXdpbi0+aGFuZGxlID0gKnBfZGV2OworCXdpbi0+c29jayA9IHM7CisKKwlpZiAoIShzLT5mZWF0dXJlcyAmIFNTX0NBUF9TVEFUSUNfTUFQKSkgeworCQl3aW4tPmN0bC5yZXMgPSBwY21jaWFfZmluZF9tZW1fcmVnaW9uKHJlcS0+QmFzZSwgcmVxLT5TaXplLCBhbGlnbiwKKwkJCQkJCSAgICAgIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fTUFQX0JFTE9XXzFNQiksIHMpOworCQlpZiAoIXdpbi0+Y3RsLnJlcykKKwkJCXJldHVybiBDU19JTl9VU0U7CisJfQorCSgqcF9kZXYpLT5zdGF0ZSB8PSBDTElFTlRfV0lOX1JFUSh3KTsKKworCS8qIENvbmZpZ3VyZSB0aGUgc29ja2V0IGNvbnRyb2xsZXIgKi8KKwl3aW4tPmN0bC5tYXAgPSB3KzE7CisJd2luLT5jdGwuZmxhZ3MgPSAwOworCXdpbi0+Y3RsLnNwZWVkID0gcmVxLT5BY2Nlc3NTcGVlZDsKKwlpZiAocmVxLT5BdHRyaWJ1dGVzICYgV0lOX01FTU9SWV9UWVBFKQorCQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfQVRUUklCOworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fRU5BQkxFKQorCQl3aW4tPmN0bC5mbGFncyB8PSBNQVBfQUNUSVZFOworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fREFUQV9XSURUSF8xNikKKwkJd2luLT5jdGwuZmxhZ3MgfD0gTUFQXzE2QklUOworCWlmIChyZXEtPkF0dHJpYnV0ZXMgJiBXSU5fVVNFX1dBSVQpCisJCXdpbi0+Y3RsLmZsYWdzIHw9IE1BUF9VU0VfV0FJVDsKKwl3aW4tPmN0bC5jYXJkX3N0YXJ0ID0gMDsKKwlpZiAocy0+b3BzLT5zZXRfbWVtX21hcChzLCAmd2luLT5jdGwpICE9IDApCisJCXJldHVybiBDU19CQURfQVJHUzsKKwlzLT5zdGF0ZSB8PSBTT0NLRVRfV0lOX1JFUSh3KTsKKworCS8qIFJldHVybiB3aW5kb3cgaGFuZGxlICovCisJaWYgKHMtPmZlYXR1cmVzICYgU1NfQ0FQX1NUQVRJQ19NQVApIHsKKwkJcmVxLT5CYXNlID0gd2luLT5jdGwuc3RhdGljX3N0YXJ0OworCX0gZWxzZSB7CisJCXJlcS0+QmFzZSA9IHdpbi0+Y3RsLnJlcy0+c3RhcnQ7CisJfQorCSp3aCA9IHdpbjsKKworCXJldHVybiBDU19TVUNDRVNTOworfSAvKiBwY21jaWFfcmVxdWVzdF93aW5kb3cgKi8KK0VYUE9SVF9TWU1CT0wocGNtY2lhX3JlcXVlc3Rfd2luZG93KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX21nci5jCmluZGV4IGI2ODQzZjguLjA2NjgzODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3JzcmNfbWdyLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcnNyY19tZ3IuYwpAQCAtNzIsNyArNzIsNyBAQAogCQkJLyogeW91IGNhbid0IHVzZSB0aGUgb2xkIGludGVyZmFjZSBpZiB0aGUgbmV3CiAJCQkgKiBvbmUgd2FzIHVzZWQgYmVmb3JlICovCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwotCQkJaWYgKChzLT5yZXNvdXJjZV9zZXR1cF9kb25lKSAmJgorCQkJaWYgKChzLT5yZXNvdXJjZV9zZXR1cF9uZXcpICYmCiAJCQkgICAgIShzLT5yZXNvdXJjZV9zZXR1cF9vbGQpKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOwogCQkJCWNvbnRpbnVlOwpAQCAtMTA1LDI5ICsxMDUsMzIgQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNtY2lhX3ZhbGlkYXRlX21lbSk7CiAKLWludCBhZGp1c3RfaW9fcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIHJfc3RhcnQsCitpbnQgcGNtY2lhX2FkanVzdF9pb19yZWdpb24oc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgcl9zdGFydCwKIAkJICAgICB1bnNpZ25lZCBsb25nIHJfZW5kLCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKIAlpZiAocy0+cmVzb3VyY2Vfb3BzLT5hZGp1c3RfaW9fcmVnaW9uKQogCQlyZXR1cm4gcy0+cmVzb3VyY2Vfb3BzLT5hZGp1c3RfaW9fcmVnaW9uKHJlcywgcl9zdGFydCwgcl9lbmQsIHMpOwogCXJldHVybiAtRU5PTUVNOwogfQorRVhQT1JUX1NZTUJPTChwY21jaWFfYWRqdXN0X2lvX3JlZ2lvbik7CiAKLXN0cnVjdCByZXNvdXJjZSAqZmluZF9pb19yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgbnVtLAorc3RydWN0IHJlc291cmNlICpwY21jaWFfZmluZF9pb19yZWdpb24odW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgbnVtLAogCQkgICB1bnNpZ25lZCBsb25nIGFsaWduLCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKIAlpZiAocy0+cmVzb3VyY2Vfb3BzLT5maW5kX2lvKQogCQlyZXR1cm4gcy0+cmVzb3VyY2Vfb3BzLT5maW5kX2lvKGJhc2UsIG51bSwgYWxpZ24sIHMpOwogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChwY21jaWFfZmluZF9pb19yZWdpb24pOwogCi1zdHJ1Y3QgcmVzb3VyY2UgKmZpbmRfbWVtX3JlZ2lvbih1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwgdV9sb25nIGFsaWduLAorc3RydWN0IHJlc291cmNlICpwY21jaWFfZmluZF9tZW1fcmVnaW9uKHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtLCB1X2xvbmcgYWxpZ24sCiAJCQkJIGludCBsb3csIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewogCWlmIChzLT5yZXNvdXJjZV9vcHMtPmZpbmRfbWVtKQogCQlyZXR1cm4gcy0+cmVzb3VyY2Vfb3BzLT5maW5kX21lbShiYXNlLCBudW0sIGFsaWduLCBsb3csIHMpOwogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChwY21jaWFfZmluZF9tZW1fcmVnaW9uKTsKIAogdm9pZCByZWxlYXNlX3Jlc291cmNlX2RiKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfbm9uc3RhdGljLmMKaW5kZXggNTg3NmJhYi4uYzQyNDU1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcnNyY19ub25zdGF0aWMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9yc3JjX25vbnN0YXRpYy5jCkBAIC0zNzIsNiArMzcyLDkgQEAKIAkgICBiYXNlLCBiYXNlK251bS0xKTsKICAgICBiYWQgPSBmYWlsID0gMDsKICAgICBzdGVwID0gKG51bSA8IDB4MjAwMDApID8gMHgyMDAwIDogKChudW0+PjQpICYgfjB4MWZmZik7CisgICAgLyogZG9uJ3QgYWxsb3cgdG9vIGxhcmdlIHN0ZXBzICovCisgICAgaWYgKHN0ZXAgPiAweDgwMDAwMCkKKwlzdGVwID0gMHg4MDAwMDA7CiAgICAgLyogY2lzX3JlYWRhYmxlIHdhbnRzIHRvIG1hcCAyeCBtYXBfc2l6ZSAqLwogICAgIGlmIChzdGVwIDwgMiAqIHMtPm1hcF9zaXplKQogCXN0ZXAgPSAyICogcy0+bWFwX3NpemU7CkBAIC00NjUsOCArNDY4LDcgQEAKIAogCWZvciAobSA9IHNfZGF0YS0+bWVtX2RiLm5leHQ7IG0gIT0gJnNfZGF0YS0+bWVtX2RiOyBtID0gbW0ubmV4dCkgewogCQltbSA9ICptOwotCQlpZiAoZG9fbWVtX3Byb2JlKG1tLmJhc2UsIG1tLm51bSwgcykpCi0JCQlicmVhazsKKwkJZG9fbWVtX3Byb2JlKG1tLmJhc2UsIG1tLm51bSwgcyk7CiAJfQogfQogCkBAIC02MDEsNyArNjAzLDcgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLXN0cnVjdCByZXNvdXJjZSAqbm9uc3RhdGljX2ZpbmRfaW9fcmVnaW9uKHVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKm5vbnN0YXRpY19maW5kX2lvX3JlZ2lvbih1bnNpZ25lZCBsb25nIGJhc2UsIGludCBudW0sCiAJCSAgIHVuc2lnbmVkIGxvbmcgYWxpZ24sIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQogewogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gbWFrZV9yZXNvdXJjZSgwLCBudW0sIElPUkVTT1VSQ0VfSU8sIHMtPmRldi5jbGFzc19pZCk7CkBAIC02MzUsOCArNjM3LDggQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdHJ1Y3QgcmVzb3VyY2UgKiBub25zdGF0aWNfZmluZF9tZW1fcmVnaW9uKHVfbG9uZyBiYXNlLCB1X2xvbmcgbnVtLCB1X2xvbmcgYWxpZ24sCi0JCQkJIGludCBsb3csIHN0cnVjdCBwY21jaWFfc29ja2V0ICpzKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqIG5vbnN0YXRpY19maW5kX21lbV9yZWdpb24odV9sb25nIGJhc2UsIHVfbG9uZyBudW0sCisJCXVfbG9uZyBhbGlnbiwgaW50IGxvdywgc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSBtYWtlX3Jlc291cmNlKDAsIG51bSwgSU9SRVNPVVJDRV9NRU0sIHMtPmRldi5jbGFzc19pZCk7CiAJc3RydWN0IHNvY2tldF9kYXRhICpzX2RhdGEgPSBzLT5yZXNvdXJjZV9kYXRhOwpAQCAtNjgzLDI3ICs2ODUsMjMgQEAKIH0KIAogCi1zdGF0aWMgaW50IGFkanVzdF9tZW1vcnkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGFkanVzdF90ICphZGopCitzdGF0aWMgaW50IGFkanVzdF9tZW1vcnkoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBhY3Rpb24sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewotCXVfbG9uZyBiYXNlLCBudW07CiAJc3RydWN0IHNvY2tldF9kYXRhICpkYXRhID0gcy0+cmVzb3VyY2VfZGF0YTsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKKwlpbnQgcmV0ID0gMDsKIAotCWJhc2UgPSBhZGotPnJlc291cmNlLm1lbW9yeS5CYXNlOwotCW51bSA9IGFkai0+cmVzb3VyY2UubWVtb3J5LlNpemU7Ci0JaWYgKChudW0gPT0gMCkgfHwgKGJhc2UrbnVtLTEgPCBiYXNlKSkKLQkJcmV0dXJuIENTX0JBRF9TSVpFOwotCi0JcmV0ID0gQ1NfU1VDQ0VTUzsKKwlpZiAoZW5kIDw9IHN0YXJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRvd24oJnJzcmNfc2VtKTsKLQlzd2l0Y2ggKGFkai0+QWN0aW9uKSB7CisJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEFERF9NQU5BR0VEX1JFU09VUkNFOgotCQlyZXQgPSBhZGRfaW50ZXJ2YWwoJmRhdGEtPm1lbV9kYiwgYmFzZSwgbnVtKTsKKwkJcmV0ID0gYWRkX2ludGVydmFsKCZkYXRhLT5tZW1fZGIsIHN0YXJ0LCBzaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBSRU1PVkVfTUFOQUdFRF9SRVNPVVJDRToKLQkJcmV0ID0gc3ViX2ludGVydmFsKCZkYXRhLT5tZW1fZGIsIGJhc2UsIG51bSk7Ci0JCWlmIChyZXQgPT0gQ1NfU1VDQ0VTUykgeworCQlyZXQgPSBzdWJfaW50ZXJ2YWwoJmRhdGEtPm1lbV9kYiwgc3RhcnQsIHNpemUpOworCQlpZiAoIXJldCkgewogCQkJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNvY2tldDsKIAkJCWRvd25fcmVhZCgmcGNtY2lhX3NvY2tldF9saXN0X3J3c2VtKTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoc29ja2V0LCAmcGNtY2lhX3NvY2tldF9saXN0LCBzb2NrZXRfbGlzdCkKQEAgLTcxMiw3ICs3MTAsNyBAQAogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldCA9IENTX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworCQlyZXQgPSAtRUlOVkFMOwogCX0KIAl1cCgmcnNyY19zZW0pOwogCkBAIC03MjAsMzYgKzcxOCwzNSBAQAogfQogCiAKLXN0YXRpYyBpbnQgYWRqdXN0X2lvKHN0cnVjdCBwY21jaWFfc29ja2V0ICpzLCBhZGp1c3RfdCAqYWRqKQorc3RhdGljIGludCBhZGp1c3RfaW8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIHVuc2lnbmVkIGludCBhY3Rpb24sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXN0cnVjdCBzb2NrZXRfZGF0YSAqZGF0YSA9IHMtPnJlc291cmNlX2RhdGE7Ci0Ja2lvX2FkZHJfdCBiYXNlLCBudW07Ci0JaW50IHJldCA9IENTX1NVQ0NFU1M7CisJdW5zaWduZWQgbG9uZyBzaXplID0gZW5kIC0gc3RhcnQgKyAxOworCWludCByZXQgPSAwOwogCi0JYmFzZSA9IGFkai0+cmVzb3VyY2UuaW8uQmFzZVBvcnQ7Ci0JbnVtID0gYWRqLT5yZXNvdXJjZS5pby5OdW1Qb3J0czsKLQlpZiAoKGJhc2UgPCAwKSB8fCAoYmFzZSA+IDB4ZmZmZikpCi0JCXJldHVybiBDU19CQURfQkFTRTsKLQlpZiAoKG51bSA8PSAwKSB8fCAoYmFzZStudW0gPiAweDEwMDAwKSB8fCAoYmFzZStudW0gPD0gYmFzZSkpCi0JCXJldHVybiBDU19CQURfU0laRTsKKwlpZiAoZW5kIDw9IHN0YXJ0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlbmQgPiBJT19TUEFDRV9MSU1JVCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkb3duKCZyc3JjX3NlbSk7Ci0Jc3dpdGNoIChhZGotPkFjdGlvbikgeworCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBBRERfTUFOQUdFRF9SRVNPVVJDRToKLQkJaWYgKGFkZF9pbnRlcnZhbCgmZGF0YS0+aW9fZGIsIGJhc2UsIG51bSkgIT0gMCkgewotCQkJcmV0ID0gQ1NfSU5fVVNFOworCQlpZiAoYWRkX2ludGVydmFsKCZkYXRhLT5pb19kYiwgc3RhcnQsIHNpemUpICE9IDApIHsKKwkJCXJldCA9IC1FQlVTWTsKIAkJCWJyZWFrOwogCQl9CiAjaWZkZWYgQ09ORklHX1BDTUNJQV9QUk9CRQogCQlpZiAocHJvYmVfaW8pCi0JCQlkb19pb19wcm9iZShzLCBiYXNlLCBudW0pOworCQkJZG9faW9fcHJvYmUocywgc3RhcnQsIHNpemUpOwogI2VuZGlmCiAJCWJyZWFrOwogCWNhc2UgUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0U6Ci0JCXN1Yl9pbnRlcnZhbCgmZGF0YS0+aW9fZGIsIGJhc2UsIG51bSk7CisJCXN1Yl9pbnRlcnZhbCgmZGF0YS0+aW9fZGIsIHN0YXJ0LCBzaXplKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0ID0gQ1NfVU5TVVBQT1JURURfRlVOQ1RJT047CisJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAl1cCgmcnNyY19zZW0pOwpAQCAtNzYwLDE1ICs3NTcsODIgQEAKIAogc3RhdGljIGludCBub25zdGF0aWNfYWRqdXN0X3Jlc291cmNlX2luZm8oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGFkanVzdF90ICphZGopCiB7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKIAlzd2l0Y2ggKGFkai0+UmVzb3VyY2UpIHsKIAljYXNlIFJFU19NRU1PUllfUkFOR0U6Ci0JCXJldHVybiBhZGp1c3RfbWVtb3J5KHMsIGFkaik7CisJCWVuZCA9IGFkai0+cmVzb3VyY2UubWVtb3J5LkJhc2UgKyBhZGotPnJlc291cmNlLm1lbW9yeS5TaXplIC0gMTsKKwkJcmV0dXJuIGFkanVzdF9tZW1vcnkocywgYWRqLT5BY3Rpb24sIGFkai0+cmVzb3VyY2UubWVtb3J5LkJhc2UsIGVuZCk7CiAJY2FzZSBSRVNfSU9fUkFOR0U6Ci0JCXJldHVybiBhZGp1c3RfaW8ocywgYWRqKTsKKwkJZW5kID0gYWRqLT5yZXNvdXJjZS5pby5CYXNlUG9ydCArIGFkai0+cmVzb3VyY2UuaW8uTnVtUG9ydHMgLSAxOworCQlyZXR1cm4gYWRqdXN0X2lvKHMsIGFkai0+QWN0aW9uLCBhZGotPnJlc291cmNlLmlvLkJhc2VQb3J0LCBlbmQpOwogCX0KIAlyZXR1cm4gQ1NfVU5TVVBQT1JURURfRlVOQ1RJT047CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW50IG5vbnN0YXRpY19hdXRvYWRkX3Jlc291cmNlcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgZG9uZSA9IDA7CisKKwlpZiAoIXMtPmNiX2RldiB8fCAhcy0+Y2JfZGV2LT5idXMpCisJCXJldHVybiAtRU5PREVWOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19YODZfNjQpCisJLyogSWYgdGhpcyBpcyB0aGUgcm9vdCBidXMsIHRoZSByaXNrIG9mIGhpdHRpbmcKKwkgKiBzb21lIHN0cmFuZ2Ugc3lzdGVtIGRldmljZXMgd2hpY2ggYXJlbid0IHByb3RlY3RlZAorCSAqIGJ5IGVpdGhlciBBQ1BJIHJlc291cmNlIHRhYmxlcyBvciBwcm9wZXJseSByZXF1ZXN0ZWQKKwkgKiByZXNvdXJjZXMgaXMgdG9vIGJpZy4gVGhlcmVmb3JlLCBkb24ndCBkbyBhdXRvLWFkZGluZworCSAqIG9mIHJlc291cmNlcyBhdCB0aGUgbW9tZW50LgorCSAqLworCWlmIChzLT5jYl9kZXYtPmJ1cy0+bnVtYmVyID09IDApCisJCXJldHVybiAtRUlOVkFMOworI2VuZGlmCisKKwlmb3IgKGk9MDsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXJlcyA9IHMtPmNiX2Rldi0+YnVzLT5yZXNvdXJjZVtpXTsKKwkJaWYgKCFyZXMpCisJCQljb250aW51ZTsKKworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJCWlmIChyZXMgPT0gJmlvcG9ydF9yZXNvdXJjZSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ayhLRVJOX0lORk8gInBjbWNpYTogcGFyZW50IFBDSSBicmlkZ2UgSS9PIHdpbmRvdzogMHglbHggLSAweCVseFxuIiwKKwkJCSAgICAgICByZXMtPnN0YXJ0LCByZXMtPmVuZCk7CisJCQlpZiAoIWFkanVzdF9pbyhzLCBBRERfTUFOQUdFRF9SRVNPVVJDRSwgcmVzLT5zdGFydCwgcmVzLT5lbmQpKQorCQkJCWRvbmUgfD0gSU9SRVNPVVJDRV9JTzsKKworCQl9CisKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQkJaWYgKHJlcyA9PSAmaW9tZW1fcmVzb3VyY2UpCisJCQkJY29udGludWU7CisJCQlwcmludGsoS0VSTl9JTkZPICJwY21jaWE6IHBhcmVudCBQQ0kgYnJpZGdlIE1lbW9yeSB3aW5kb3c6IDB4JWx4IC0gMHglbHhcbiIsCisJCQkgICAgICAgcmVzLT5zdGFydCwgcmVzLT5lbmQpOworCQkJaWYgKCFhZGp1c3RfbWVtb3J5KHMsIEFERF9NQU5BR0VEX1JFU09VUkNFLCByZXMtPnN0YXJ0LCByZXMtPmVuZCkpCisJCQkJZG9uZSB8PSBJT1JFU09VUkNFX01FTTsKKwkJfQorCX0KKworCS8qIGlmIHdlIGdvdCBhdCBsZWFzdCBvbmUgb2YgSU8sIGFuZCBvbmUgb2YgTUVNLCB3ZSBjYW4gYmUgZ2xhZCBhbmQKKwkgKiBhY3RpdmF0ZSB0aGUgUENNQ0lBIHN1YnN5c3RlbSAqLworCWlmIChkb25lICYgKElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9JTykpCisJCXMtPnJlc291cmNlX3NldHVwX2RvbmUgPSAxOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IG5vbnN0YXRpY19hdXRvYWRkX3Jlc291cmNlcyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2VuZGlmCisKKwogc3RhdGljIGludCBub25zdGF0aWNfaW5pdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKIHsKIAlzdHJ1Y3Qgc29ja2V0X2RhdGEgKmRhdGE7CkBAIC03ODMsNiArODQ3LDggQEAKIAogCXMtPnJlc291cmNlX2RhdGEgPSAodm9pZCAqKSBkYXRhOwogCisJbm9uc3RhdGljX2F1dG9hZGRfcmVzb3VyY2VzKHMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg0NSwxNyArOTExLDE2IEBACiB7CiAJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMgPSBjbGFzc19nZXRfZGV2ZGF0YShjbGFzc19kZXYpOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHI7Ci0JdW5zaWduZWQgaW50IGFkZCA9IDE7Ci0JYWRqdXN0X3QgYWRqOworCXVuc2lnbmVkIGludCBhZGQgPSBBRERfTUFOQUdFRF9SRVNPVVJDRTsKIAlzc2l6ZV90IHJldCA9IDA7CiAKIAlyZXQgPSBzc2NhbmYgKGJ1ZiwgIisgMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOwogCWlmIChyZXQgIT0gMikgewogCQlyZXQgPSBzc2NhbmYgKGJ1ZiwgIi0gMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOwotCQlhZGQgPSAwOworCQlhZGQgPSBSRU1PVkVfTUFOQUdFRF9SRVNPVVJDRTsKIAkJaWYgKHJldCAhPSAyKSB7CiAJCQlyZXQgPSBzc2NhbmYgKGJ1ZiwgIjB4JWx4IC0gMHglbHgiLCAmc3RhcnRfYWRkciwgJmVuZF9hZGRyKTsKLQkJCWFkZCA9IDE7CisJCQlhZGQgPSBBRERfTUFOQUdFRF9SRVNPVVJDRTsKIAkJCWlmIChyZXQgIT0gMikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtODYzLDEyICs5MjgsOSBAQAogCWlmIChlbmRfYWRkciA8PSBzdGFydF9hZGRyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWFkai5BY3Rpb24gPSBhZGQgPyBBRERfTUFOQUdFRF9SRVNPVVJDRSA6IFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFOwotCWFkai5SZXNvdXJjZSA9IFJFU19JT19SQU5HRTsKLQlhZGoucmVzb3VyY2UuaW8uQmFzZVBvcnQgPSBzdGFydF9hZGRyOwotCWFkai5yZXNvdXJjZS5pby5OdW1Qb3J0cyA9IGVuZF9hZGRyIC0gc3RhcnRfYWRkciArIDE7Ci0KLQlyZXQgPSBhZGp1c3RfaW8ocywgJmFkaik7CisJcmV0ID0gYWRqdXN0X2lvKHMsIGFkZCwgc3RhcnRfYWRkciwgZW5kX2FkZHIpOworCWlmICghcmV0KQorCQlzLT5yZXNvdXJjZV9zZXR1cF9uZXcgPSAxOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQpAQCAtOTAxLDE3ICs5NjMsMTYgQEAKIHsKIAlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyLCBlbmRfYWRkcjsKLQl1bnNpZ25lZCBpbnQgYWRkID0gMTsKLQlhZGp1c3RfdCBhZGo7CisJdW5zaWduZWQgaW50IGFkZCA9IEFERF9NQU5BR0VEX1JFU09VUkNFOwogCXNzaXplX3QgcmV0ID0gMDsKIAogCXJldCA9IHNzY2FuZiAoYnVmLCAiKyAweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7CiAJaWYgKHJldCAhPSAyKSB7CiAJCXJldCA9IHNzY2FuZiAoYnVmLCAiLSAweCVseCAtIDB4JWx4IiwgJnN0YXJ0X2FkZHIsICZlbmRfYWRkcik7Ci0JCWFkZCA9IDA7CisJCWFkZCA9IFJFTU9WRV9NQU5BR0VEX1JFU09VUkNFOwogCQlpZiAocmV0ICE9IDIpIHsKIAkJCXJldCA9IHNzY2FuZiAoYnVmLCAiMHglbHggLSAweCVseCIsICZzdGFydF9hZGRyLCAmZW5kX2FkZHIpOwotCQkJYWRkID0gMTsKKwkJCWFkZCA9IEFERF9NQU5BR0VEX1JFU09VUkNFOwogCQkJaWYgKHJldCAhPSAyKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC05MTksMTIgKzk4MCw5IEBACiAJaWYgKGVuZF9hZGRyIDw9IHN0YXJ0X2FkZHIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYWRqLkFjdGlvbiA9IGFkZCA/IEFERF9NQU5BR0VEX1JFU09VUkNFIDogUkVNT1ZFX01BTkFHRURfUkVTT1VSQ0U7Ci0JYWRqLlJlc291cmNlID0gUkVTX01FTU9SWV9SQU5HRTsKLQlhZGoucmVzb3VyY2UubWVtb3J5LkJhc2UgPSBzdGFydF9hZGRyOwotCWFkai5yZXNvdXJjZS5tZW1vcnkuU2l6ZSA9IGVuZF9hZGRyIC0gc3RhcnRfYWRkciArIDE7Ci0KLQlyZXQgPSBhZGp1c3RfbWVtb3J5KHMsICZhZGopOworCXJldCA9IGFkanVzdF9tZW1vcnkocywgYWRkLCBzdGFydF9hZGRyLCBlbmRfYWRkcik7CisJaWYgKCFyZXQpCisJCXMtPnJlc291cmNlX3NldHVwX25ldyA9IDE7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTAwX2dlbmVyaWMuYwppbmRleCBmMWJiNzkxLi5lOThiYjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMDBfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NhMTEwMF9nZW5lcmljLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9zcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5oCmluZGV4IDcwMGExNTUuLjZmMTQxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uaAorKysgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmgKQEAgLTExLDcgKzExLDYgQEAKIAogLyogaW5jbHVkZSB0aGUgd29ybGQgKi8KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY2tldF9zeXNmcy5jIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKaW5kZXggOGVlZDAzOS4uMTA0MGE2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29ja2V0X3N5c2ZzLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNkZWZpbmUgSU5fQ0FSRF9TRVJWSUNFUwotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL3NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CkBAIC0xNjMsMzAgKzE2MiwxNjYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOwotCWlmICghcy0+cmVzb3VyY2Vfc2V0dXBfZG9uZSkgeworCWlmICghcy0+cmVzb3VyY2Vfc2V0dXBfZG9uZSkKIAkJcy0+cmVzb3VyY2Vfc2V0dXBfZG9uZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKLQotCQlkb3duKCZzLT5za3Rfc2VtKTsKLQkJaWYgKChzLT5jYWxsYmFjaykgJiYKLQkJICAgIChzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSAmJgotCQkgICAgIShzLT5zdGF0ZSAmIFNPQ0tFVF9DQVJEQlVTKSkgewotCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KHMtPmNhbGxiYWNrLT5vd25lcikpIHsKLQkJCQlzLT5jYWxsYmFjay0+cmVzb3VyY2VzX2RvbmUocyk7Ci0JCQkJbW9kdWxlX3B1dChzLT5jYWxsYmFjay0+b3duZXIpOwotCQkJfQotCQl9Ci0JCXVwKCZzLT5za3Rfc2VtKTsKLQotCQlyZXR1cm4gY291bnQ7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIAorCWRvd24oJnMtPnNrdF9zZW0pOworCWlmICgocy0+Y2FsbGJhY2spICYmCisJICAgIChzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSAmJgorCSAgICAhKHMtPnN0YXRlICYgU09DS0VUX0NBUkRCVVMpKSB7CisJCWlmICh0cnlfbW9kdWxlX2dldChzLT5jYWxsYmFjay0+b3duZXIpKSB7CisJCQlzLT5jYWxsYmFjay0+cmVxdWVyeShzKTsKKwkJCW1vZHVsZV9wdXQocy0+Y2FsbGJhY2stPm93bmVyKTsKKwkJfQorCX0KKwl1cCgmcy0+c2t0X3NlbSk7CisKIAlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIoYXZhaWxhYmxlX3Jlc291cmNlc19zZXR1cF9kb25lLCAwNjAwLCBwY2NhcmRfc2hvd19yZXNvdXJjZSwgcGNjYXJkX3N0b3JlX3Jlc291cmNlKTsKIAogCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfZXh0cmFjdF9jaXMoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXR1cGxlX3QgdHVwbGU7CisJaW50IHN0YXR1cywgaTsKKwlsb2ZmX3QgcG9pbnRlciA9IDA7CisJc3NpemVfdCByZXQgPSAwOworCXVfY2hhciAqdHVwbGVidWZmZXI7CisJdV9jaGFyICp0ZW1wYnVmZmVyOworCisJdHVwbGVidWZmZXIgPSBrbWFsbG9jKHNpemVvZih1X2NoYXIpICogMjU2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR1cGxlYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRlbXBidWZmZXIgPSBrbWFsbG9jKHNpemVvZih1X2NoYXIpICogMjU4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRlbXBidWZmZXIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3R1cGxlOworCX0KKworCW1lbXNldCgmdHVwbGUsIDAsIHNpemVvZih0dXBsZV90KSk7CisKKwl0dXBsZS5BdHRyaWJ1dGVzID0gVFVQTEVfUkVUVVJOX0xJTksgfCBUVVBMRV9SRVRVUk5fQ09NTU9OOworCXR1cGxlLkRlc2lyZWRUdXBsZSA9IFJFVFVSTl9GSVJTVF9UVVBMRTsKKwl0dXBsZS5UdXBsZU9mZnNldCA9IDA7CisKKwlzdGF0dXMgPSBwY2NhcmRfZ2V0X2ZpcnN0X3R1cGxlKHMsIEJJTkRfRk5fQUxMLCAmdHVwbGUpOworCXdoaWxlICghc3RhdHVzKSB7CisJCXR1cGxlLlR1cGxlRGF0YSA9IHR1cGxlYnVmZmVyOworCQl0dXBsZS5UdXBsZURhdGFNYXggPSAyNTU7CisJCW1lbXNldCh0dXBsZWJ1ZmZlciwgMCwgc2l6ZW9mKHVfY2hhcikgKiAyNTUpOworCisJCXN0YXR1cyA9IHBjY2FyZF9nZXRfdHVwbGVfZGF0YShzLCAmdHVwbGUpOworCQlpZiAoc3RhdHVzKQorCQkJYnJlYWs7CisKKwkJaWYgKG9mZiA8IChwb2ludGVyICsgMiArIHR1cGxlLlR1cGxlRGF0YUxlbikpIHsKKwkJCXRlbXBidWZmZXJbMF0gPSB0dXBsZS5UdXBsZUNvZGUgJiAweGZmOworCQkJdGVtcGJ1ZmZlclsxXSA9IHR1cGxlLlR1cGxlTGluayAmIDB4ZmY7CisJCQlmb3IgKGkgPSAwOyBpIDwgdHVwbGUuVHVwbGVEYXRhTGVuOyBpKyspCisJCQkJdGVtcGJ1ZmZlcltpICsgMl0gPSB0dXBsZWJ1ZmZlcltpXSAmIDB4ZmY7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAoMiArIHR1cGxlLlR1cGxlRGF0YUxlbik7IGkrKykgeworCQkJCWlmICgoKGkgKyBwb2ludGVyKSA+PSBvZmYpICYmCisJCQkJICAgIChpICsgcG9pbnRlcikgPCAob2ZmICsgY291bnQpKSB7CisJCQkJCWJ1ZltyZXRdID0gdGVtcGJ1ZmZlcltpXTsKKwkJCQkJcmV0Kys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcG9pbnRlciArPSAyICsgdHVwbGUuVHVwbGVEYXRhTGVuOworCisJCWlmIChwb2ludGVyID49IChvZmYgKyBjb3VudCkpCisJCQlicmVhazsKKworCQlpZiAodHVwbGUuVHVwbGVDb2RlID09IENJU1RQTF9FTkQpCisJCQlicmVhazsKKwkJc3RhdHVzID0gcGNjYXJkX2dldF9uZXh0X3R1cGxlKHMsIEJJTkRfRk5fQUxMLCAmdHVwbGUpOworCX0KKworCWtmcmVlKHRlbXBidWZmZXIpOworIGZyZWVfdHVwbGU6CisJa2ZyZWUodHVwbGVidWZmZXIpOworCisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfc2hvd19jaXMoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBzaXplID0gMHgyMDA7CisKKwlpZiAob2ZmID49IHNpemUpCisJCWNvdW50ID0gMDsKKwllbHNlIHsKKwkJc3RydWN0IHBjbWNpYV9zb2NrZXQgKnM7CisJCWNpc2luZm9fdCBjaXNpbmZvOworCisJCWlmIChvZmYgKyBjb3VudCA+IHNpemUpCisJCQljb3VudCA9IHNpemUgLSBvZmY7CisKKwkJcyA9IHRvX3NvY2tldChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNsYXNzX2RldmljZSwga29iaikpOworCisJCWlmICghKHMtPnN0YXRlICYgU09DS0VUX1BSRVNFTlQpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChwY2NhcmRfdmFsaWRhdGVfY2lzKHMsIEJJTkRfRk5fQUxMLCAmY2lzaW5mbykpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKCFjaXNpbmZvLkNoYWlucykKKwkJCXJldHVybiAtRU5PREFUQTsKKworCQljb3VudCA9IHBjY2FyZF9leHRyYWN0X2NpcyhzLCBidWYsIG9mZiwgY291bnQpOworCX0KKworCXJldHVybiAoY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCBwY2NhcmRfc3RvcmVfY2lzKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcyA9IHRvX3NvY2tldChjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNsYXNzX2RldmljZSwga29iaikpOworCWNpc2R1bXBfdCAqY2lzOworCXNzaXplX3QgcmV0ID0gY291bnQ7CisKKwlpZiAob2ZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3VudCA+PSAweDIwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShzLT5zdGF0ZSAmIFNPQ0tFVF9QUkVTRU5UKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljaXMgPSBrbWFsbG9jKHNpemVvZihjaXNkdW1wX3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNpcykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KGNpcywgMCwgc2l6ZW9mKGNpc2R1bXBfdCkpOworCisJY2lzLT5MZW5ndGggPSBjb3VudCArIDE7CisJbWVtY3B5KGNpcy0+RGF0YSwgYnVmLCBjb3VudCk7CisKKwlpZiAocGNtY2lhX3JlcGxhY2VfY2lzKHMsIGNpcykpCisJCXJldCAgPSAtRUlPOworCisJa2ZyZWUoY2lzKTsKKworCWlmICghcmV0KSB7CisJCWRvd24oJnMtPnNrdF9zZW0pOworCQlpZiAoKHMtPmNhbGxiYWNrKSAmJiAocy0+c3RhdGUgJiBTT0NLRVRfUFJFU0VOVCkgJiYKKwkJICAgICEocy0+c3RhdGUgJiBTT0NLRVRfQ0FSREJVUykpIHsKKwkJCWlmICh0cnlfbW9kdWxlX2dldChzLT5jYWxsYmFjay0+b3duZXIpKSB7CisJCQkJcy0+Y2FsbGJhY2stPnJlcXVlcnkocyk7CisJCQkJbW9kdWxlX3B1dChzLT5jYWxsYmFjay0+b3duZXIpOworCQkJfQorCQl9CisJCXVwKCZzLT5za3Rfc2VtKTsKKwl9CisKKworCXJldHVybiAocmV0KTsKK30KKworCiBzdGF0aWMgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKnBjY2FyZF9zb2NrZXRfYXR0cmlidXRlc1tdID0gewogCSZjbGFzc19kZXZpY2VfYXR0cl9jYXJkX3R5cGUsCiAJJmNsYXNzX2RldmljZV9hdHRyX2NhcmRfdm9sdGFnZSwKQEAgLTE5OSw2ICszMzQsMTMgQEAKIAlOVUxMLAogfTsKIAorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHBjY2FyZF9jaXNfYXR0ciA9IHsKKwkuYXR0ciA9IHsgLm5hbWUgPSAiY2lzIiwgLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwgLm93bmVyID0gVEhJU19NT0RVTEV9LAorCS5zaXplID0gMHgyMDAsCisJLnJlYWQgPSBwY2NhcmRfc2hvd19jaXMsCisJLndyaXRlID0gcGNjYXJkX3N0b3JlX2NpcywKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHBjY2FyZF9zeXNmc19hZGRfc29ja2V0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldikKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSAqKmF0dHI7CkBAIC0yMDksNiArMzUxLDggQEAKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCX0KKwlpZiAoIXJldCkKKwkJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZjbGFzc19kZXYtPmtvYmosICZwY2NhcmRfY2lzX2F0dHIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIxNyw2ICszNjEsNyBAQAogewogCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICoqYXR0cjsKIAorCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmY2xhc3NfZGV2LT5rb2JqLCAmcGNjYXJkX2Npc19hdHRyKTsKIAlmb3IgKGF0dHIgPSBwY2NhcmRfc29ja2V0X2F0dHJpYnV0ZXM7ICphdHRyOyBhdHRyKyspCiAJCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZShjbGFzc19kZXYsICphdHRyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3RjaWMuYyBiL2RyaXZlcnMvcGNtY2lhL3RjaWMuYwppbmRleCBhYWNiYmI1Li5kNWE2MWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS90Y2ljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvdGNpYy5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3RpMTEzeC5oIGIvZHJpdmVycy9wY21jaWEvdGkxMTN4LmgKaW5kZXggYzdiYTk5OC4uZmJlMjMzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvdGkxMTN4LmgKKysrIGIvZHJpdmVycy9wY21jaWEvdGkxMTN4LmgKQEAgLTE1NCw4ICsxNTQsNiBAQAogI2RlZmluZSBFTkVfVEVTVF9DOQkJCTB4YzkJLyogOGJpdCAqLwogI2RlZmluZSBFTkVfVEVTVF9DOV9UTFRFTkFCTEUJCTB4MDIKIAotI2lmZGVmIENPTkZJR19DQVJEQlVTCi0KIC8qCiAgKiBUZXhhcyBJbnN0cnVtZW50cyBDYXJkQnVzIGNvbnRyb2xsZXIgb3ZlcnJpZGVzLgogICovCkBAIC04NDMsNyArODQxLDUgQEAKIAlyZXR1cm4gdGkxMnh4X292ZXJyaWRlKHNvY2tldCk7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfQ0FSREJVUyAqLwotCiAjZW5kaWYgLyogX0xJTlVYX1RJMTEzWF9IICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3llbnRhX3NvY2tldC5jIGIvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKaW5kZXggYmVlMDUzNi4uNjgzNzQ5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKKysrIGIvZHJpdmVycy9wY21jaWEveWVudGFfc29ja2V0LmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvc3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KQEAgLTUyOCw2MCArNTI3LDI5IEBACiAgKiBVc2UgYW4gYWRhcHRpdmUgYWxsb2NhdGlvbiBmb3IgdGhlIG1lbW9yeSByZXNvdXJjZSwKICAqIHNvbWV0aW1lcyB0aGUgbWVtb3J5IGJlaGluZCBwY2kgYnJpZGdlcyBpcyBsaW1pdGVkOgogICogMS84IG9mIHRoZSBzaXplIG9mIHRoZSBpbyB3aW5kb3cgb2YgdGhlIHBhcmVudC4KLSAqIG1heCA0IE1CLCBtaW4gMTYga0IuCisgKiBtYXggNCBNQiwgbWluIDE2IGtCLiBXZSB0cnkgdmVyeSBoYXJkIHRvIG5vdCBnZXQgYmVsb3cKKyAqIHRoZSAiQUNDIiB2YWx1ZXMsIHRob3VnaC4KICAqLwogI2RlZmluZSBCUklER0VfTUVNX01BWCA0KjEwMjQqMTAyNAorI2RlZmluZSBCUklER0VfTUVNX0FDQyAxMjgqMTAyNAogI2RlZmluZSBCUklER0VfTUVNX01JTiAxNioxMDI0CiAKLSNkZWZpbmUgQlJJREdFX0lPX01BWCAyNTYKKyNkZWZpbmUgQlJJREdFX0lPX01BWCA1MTIKKyNkZWZpbmUgQlJJREdFX0lPX0FDQyAyNTYKICNkZWZpbmUgQlJJREdFX0lPX01JTiAzMgogCiAjaWZuZGVmIFBDSUJJT1NfTUlOX0NBUkRCVVNfSU8KICNkZWZpbmUgUENJQklPU19NSU5fQ0FSREJVU19JTyBQQ0lCSU9TX01JTl9JTwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3JlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIGludCBuciwgdW5zaWduZWQgdHlwZSkKK3N0YXRpYyBpbnQgeWVudGFfc2VhcmNoX29uZV9yZXMoc3RydWN0IHJlc291cmNlICpyb290LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKKwkJCQl1MzIgbWluKQogewotCXN0cnVjdCBwY2lfYnVzICpidXM7Ci0Jc3RydWN0IHJlc291cmNlICpyb290LCAqcmVzOwotCXUzMiBzdGFydCwgZW5kOwotCXUzMiBhbGlnbiwgc2l6ZSwgbWluOwotCXVuc2lnbmVkIG9mZnNldDsKLQl1bnNpZ25lZCBtYXNrOworCXUzMiBhbGlnbiwgc2l6ZSwgc3RhcnQsIGVuZDsKIAotCS8qIFRoZSBncmFudWxhcml0eSBvZiB0aGUgbWVtb3J5IGxpbWl0IGlzIDRrQiwgb24gSU8gaXQncyA0IGJ5dGVzICovCi0JbWFzayA9IH4weGZmZjsKLQlpZiAodHlwZSAmIElPUkVTT1VSQ0VfSU8pCi0JCW1hc2sgPSB+MzsKLQotCW9mZnNldCA9IDB4MWMgKyA4Km5yOwotCWJ1cyA9IHNvY2tldC0+ZGV2LT5zdWJvcmRpbmF0ZTsKLQlyZXMgPSBzb2NrZXQtPmRldi0+cmVzb3VyY2UgKyBQQ0lfQlJJREdFX1JFU09VUkNFUyArIG5yOwotCXJlcy0+bmFtZSA9IGJ1cy0+bmFtZTsKLQlyZXMtPmZsYWdzID0gdHlwZTsKLQlyZXMtPnN0YXJ0ID0gMDsKLQlyZXMtPmVuZCA9IDA7Ci0Jcm9vdCA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShzb2NrZXQtPmRldiwgcmVzKTsKLQotCWlmICghcm9vdCkKLQkJcmV0dXJuOwotCi0Jc3RhcnQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBvZmZzZXQpICYgbWFzazsKLQllbmQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBvZmZzZXQrNCkgfCB+bWFzazsKLQlpZiAoc3RhcnQgJiYgZW5kID4gc3RhcnQgJiYgIW92ZXJyaWRlX2Jpb3MpIHsKLQkJcmVzLT5zdGFydCA9IHN0YXJ0OwotCQlyZXMtPmVuZCA9IGVuZDsKLQkJaWYgKHJlcXVlc3RfcmVzb3VyY2Uocm9vdCwgcmVzKSA9PSAwKQotCQkJcmV0dXJuOwotCQlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogUHJlYXNzaWduZWQgcmVzb3VyY2UgJWQgYnVzeSwgcmVjb25maWd1cmluZy4uLlxuIiwKLQkJCQlwY2lfbmFtZShzb2NrZXQtPmRldiksIG5yKTsKLQkJcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gMDsKLQl9Ci0KLQlpZiAodHlwZSAmIElPUkVTT1VSQ0VfSU8pIHsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJYWxpZ24gPSAxMDI0OwogCQlzaXplID0gQlJJREdFX0lPX01BWDsKLQkJbWluID0gQlJJREdFX0lPX01JTjsKIAkJc3RhcnQgPSBQQ0lCSU9TX01JTl9DQVJEQlVTX0lPOwogCQllbmQgPSB+MFU7CiAJfSBlbHNlIHsKQEAgLTU5NiwyNiArNTY0LDEwNyBAQAogCQkJCWkrKzsKIAkJCXNpemUgPSAxIDw8IGk7CiAJCX0KLQkJaWYgKHNpemUgPCBCUklER0VfTUVNX01JTikKLQkJCXNpemUgPSBCUklER0VfTUVNX01JTjsKLQkJbWluID0gQlJJREdFX01FTV9NSU47CisJCWlmIChzaXplIDwgbWluKQorCQkJc2l6ZSA9IG1pbjsKIAkJYWxpZ24gPSBzaXplOwogCQlzdGFydCA9IFBDSUJJT1NfTUlOX01FTTsKIAkJZW5kID0gfjBVOwogCX0KLQkKKwogCWRvIHsKLQkJaWYgKGFsbG9jYXRlX3Jlc291cmNlKHJvb3QsIHJlcywgc2l6ZSwgc3RhcnQsIGVuZCwgYWxpZ24sIE5VTEwsIE5VTEwpPT0wKSB7Ci0JCQljb25maWdfd3JpdGVsKHNvY2tldCwgb2Zmc2V0LCByZXMtPnN0YXJ0KTsKLQkJCWNvbmZpZ193cml0ZWwoc29ja2V0LCBvZmZzZXQrNCwgcmVzLT5lbmQpOwotCQkJcmV0dXJuOworCQlpZiAoYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzaXplLCBzdGFydCwgZW5kLCBhbGlnbiwKKwkJCQkgICAgICBOVUxMLCBOVUxMKT09MCkgeworCQkJcmV0dXJuIDE7CiAJCX0KIAkJc2l6ZSA9IHNpemUvMjsKIAkJYWxpZ24gPSBzaXplOwogCX0gd2hpbGUgKHNpemUgPj0gbWluKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgeWVudGFfc2VhcmNoX3JlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJICAgIHUzMiBtaW4pCit7CisJaW50IGk7CisJZm9yIChpPTA7IGk8UENJX0JVU19OVU1fUkVTT1VSQ0VTOyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICogcm9vdCA9IHNvY2tldC0+ZGV2LT5idXMtPnJlc291cmNlW2ldOworCQlpZiAoIXJvb3QpCisJCQljb250aW51ZTsKKworCQlpZiAoKHJlcy0+ZmxhZ3MgXiByb290LT5mbGFncykgJgorCQkgICAgKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfUFJFRkVUQ0gpKQorCQkJY29udGludWU7IC8qIFdyb25nIHR5cGUgKi8KKworCQlpZiAoeWVudGFfc2VhcmNoX29uZV9yZXMocm9vdCwgcmVzLCBtaW4pKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5ZW50YV9hbGxvY2F0ZV9yZXMoc3RydWN0IHllbnRhX3NvY2tldCAqc29ja2V0LCBpbnQgbnIsIHVuc2lnbmVkIHR5cGUsIGludCBhZGRyX3N0YXJ0LCBpbnQgYWRkcl9lbmQpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsICpyZXM7CisJdTMyIHN0YXJ0LCBlbmQ7CisJdW5zaWduZWQgbWFzazsKKworCXJlcyA9IHNvY2tldC0+ZGV2LT5yZXNvdXJjZSArIFBDSV9CUklER0VfUkVTT1VSQ0VTICsgbnI7CisJLyogQWxyZWFkeSBhbGxvY2F0ZWQ/ICovCisJaWYgKHJlcy0+cGFyZW50KQorCQlyZXR1cm47CisKKwkvKiBUaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIG1lbW9yeSBsaW1pdCBpcyA0a0IsIG9uIElPIGl0J3MgNCBieXRlcyAqLworCW1hc2sgPSB+MHhmZmY7CisJaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKQorCQltYXNrID0gfjM7CisKKwlidXMgPSBzb2NrZXQtPmRldi0+c3Vib3JkaW5hdGU7CisJcmVzLT5uYW1lID0gYnVzLT5uYW1lOworCXJlcy0+ZmxhZ3MgPSB0eXBlOworCisJc3RhcnQgPSBjb25maWdfcmVhZGwoc29ja2V0LCBhZGRyX3N0YXJ0KSAmIG1hc2s7CisJZW5kID0gY29uZmlnX3JlYWRsKHNvY2tldCwgYWRkcl9lbmQpIHwgfm1hc2s7CisJaWYgKHN0YXJ0ICYmIGVuZCA+IHN0YXJ0ICYmICFvdmVycmlkZV9iaW9zKSB7CisJCXJlcy0+c3RhcnQgPSBzdGFydDsKKwkJcmVzLT5lbmQgPSBlbmQ7CisJCXJvb3QgPSBwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2Uoc29ja2V0LT5kZXYsIHJlcyk7CisJCWlmIChyb290ICYmIChyZXF1ZXN0X3Jlc291cmNlKHJvb3QsIHJlcykgPT0gMCkpCisJCQlyZXR1cm47CisJCXByaW50ayhLRVJOX0lORk8gInllbnRhICVzOiBQcmVhc3NpZ25lZCByZXNvdXJjZSAlZCBidXN5IG9yIG5vdCBhdmFpbGFibGUsIHJlY29uZmlndXJpbmcuLi5cbiIsCisJCQkJcGNpX25hbWUoc29ja2V0LT5kZXYpLCBucik7CisJfQorCisJaWYgKHR5cGUgJiBJT1JFU09VUkNFX0lPKSB7CisJCWlmICgoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX0lPX01BWCkpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX0lPX0FDQykpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX0lPX01JTikpKSB7CisJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9zdGFydCwgcmVzLT5zdGFydCk7CisJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9lbmQsIHJlcy0+ZW5kKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh0eXBlICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkgeworCQkJaWYgKCh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX01BWCkpIHx8CisJCQkgICAgKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fQUNDKSkgfHwKKwkJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NSU4pKSkgeworCQkJCWNvbmZpZ193cml0ZWwoc29ja2V0LCBhZGRyX3N0YXJ0LCByZXMtPnN0YXJ0KTsKKwkJCQljb25maWdfd3JpdGVsKHNvY2tldCwgYWRkcl9lbmQsIHJlcy0+ZW5kKTsKKwkJCX0KKwkJCS8qIEFwcHJveGltYXRpbmcgcHJlZmV0Y2hhYmxlIGJ5IG5vbi1wcmVmZXRjaGFibGUgKi8KKwkJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKwkJfQorCQlpZiAoKHllbnRhX3NlYXJjaF9yZXMoc29ja2V0LCByZXMsIEJSSURHRV9NRU1fTUFYKSkgfHwKKwkJICAgICh5ZW50YV9zZWFyY2hfcmVzKHNvY2tldCwgcmVzLCBCUklER0VfTUVNX0FDQykpIHx8CisJCSAgICAoeWVudGFfc2VhcmNoX3Jlcyhzb2NrZXQsIHJlcywgQlJJREdFX01FTV9NSU4pKSkgeworCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfc3RhcnQsIHJlcy0+c3RhcnQpOworCQkJY29uZmlnX3dyaXRlbChzb2NrZXQsIGFkZHJfZW5kLCByZXMtPmVuZCk7CisJCX0KKwl9CisKIAlwcmludGsoS0VSTl9JTkZPICJ5ZW50YSAlczogbm8gcmVzb3VyY2Ugb2YgdHlwZSAleCBhdmFpbGFibGUsIHRyeWluZyB0byBjb250aW51ZS4uLlxuIiwKLQkJCXBjaV9uYW1lKHNvY2tldC0+ZGV2KSwgdHlwZSk7Ci0JcmVzLT5zdGFydCA9IHJlcy0+ZW5kID0gMDsKKwkgICAgICAgcGNpX25hbWUoc29ja2V0LT5kZXYpLCB0eXBlKTsKKwlyZXMtPnN0YXJ0ID0gcmVzLT5lbmQgPSByZXMtPmZsYWdzID0gMDsKIH0KIAogLyoKQEAgLTYyMywxMCArNjcyLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIHllbnRhX2FsbG9jYXRlX3Jlc291cmNlcyhzdHJ1Y3QgeWVudGFfc29ja2V0ICpzb2NrZXQpCiB7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMCwgSU9SRVNPVVJDRV9NRU18SU9SRVNPVVJDRV9QUkVGRVRDSCk7Ci0JeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMSwgSU9SRVNPVVJDRV9NRU0pOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDIsIElPUkVTT1VSQ0VfSU8pOwotCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDMsIElPUkVTT1VSQ0VfSU8pOwkvKiBQQ0kgaXNuJ3QgY2xldmVyIGVub3VnaCB0byB1c2UgdGhpcyBvbmUgeWV0ICovCisJeWVudGFfYWxsb2NhdGVfcmVzKHNvY2tldCwgMCwgSU9SRVNPVVJDRV9JTywKKwkJCSAgIFBDSV9DQl9JT19CQVNFXzAsIFBDSV9DQl9JT19MSU1JVF8wKTsKKwl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAxLCBJT1JFU09VUkNFX0lPLAorCQkJICAgUENJX0NCX0lPX0JBU0VfMSwgUENJX0NCX0lPX0xJTUlUXzEpOworCXllbnRhX2FsbG9jYXRlX3Jlcyhzb2NrZXQsIDIsIElPUkVTT1VSQ0VfTUVNfElPUkVTT1VSQ0VfUFJFRkVUQ0gsCisJCQkgICBQQ0lfQ0JfTUVNT1JZX0JBU0VfMCwgUENJX0NCX01FTU9SWV9MSU1JVF8wKTsKKwl5ZW50YV9hbGxvY2F0ZV9yZXMoc29ja2V0LCAzLCBJT1JFU09VUkNFX01FTSwKKwkJCSAgIFBDSV9DQl9NRU1PUllfQkFTRV8xLCBQQ0lfQ0JfTUVNT1JZX0xJTUlUXzEpOwogfQogCiAKQEAgLTg2NSwxNCArOTE4LDExIEBACiAgKi8KIHN0YXRpYyB2b2lkIHllbnRhX2dldF9zb2NrZXRfY2FwYWJpbGl0aWVzKHN0cnVjdCB5ZW50YV9zb2NrZXQgKnNvY2tldCwgdTMyIGlzYV9pcnFfbWFzaykKIHsKLQlzb2NrZXQtPnNvY2tldC5mZWF0dXJlcyB8PSBTU19DQVBfUEFHRV9SRUdTIHwgU1NfQ0FQX1BDQ0FSRCB8IFNTX0NBUF9DQVJEQlVTOwotCXNvY2tldC0+c29ja2V0Lm1hcF9zaXplID0gMHgxMDAwOwogCXNvY2tldC0+c29ja2V0LnBjaV9pcnEgPSBzb2NrZXQtPmNiX2lycTsKIAlpZiAoaXNhX3Byb2JlKQogCQlzb2NrZXQtPnNvY2tldC5pcnFfbWFzayA9IHllbnRhX3Byb2JlX2lycShzb2NrZXQsIGlzYV9pcnFfbWFzayk7CiAJZWxzZQogCQlzb2NrZXQtPnNvY2tldC5pcnFfbWFzayA9IDA7Ci0Jc29ja2V0LT5zb2NrZXQuY2JfZGV2ID0gc29ja2V0LT5kZXY7CiAKIAlwcmludGsoS0VSTl9JTkZPICJZZW50YTogSVNBIElSUSBtYXNrIDB4JTA0eCwgUENJIGlycSAlZFxuIiwKIAkgICAgICAgc29ja2V0LT5zb2NrZXQuaXJxX21hc2ssIHNvY2tldC0+Y2JfaXJxKTsKQEAgLTkzOCw2ICs5ODgsOSBAQAogCXNvY2tldC0+c29ja2V0LmRldi5kZXYgPSAmZGV2LT5kZXY7CiAJc29ja2V0LT5zb2NrZXQuZHJpdmVyX2RhdGEgPSBzb2NrZXQ7CiAJc29ja2V0LT5zb2NrZXQub3duZXIgPSBUSElTX01PRFVMRTsKKwlzb2NrZXQtPnNvY2tldC5mZWF0dXJlcyA9IFNTX0NBUF9QQUdFX1JFR1MgfCBTU19DQVBfUENDQVJEOworCXNvY2tldC0+c29ja2V0Lm1hcF9zaXplID0gMHgxMDAwOworCXNvY2tldC0+c29ja2V0LmNiX2RldiA9IGRldjsKIAogCS8qIHByZXBhcmUgc3RydWN0IHllbnRhX3NvY2tldCAqLwogCXNvY2tldC0+ZGV2ID0gZGV2OwpAQCAtMTAwOCw2ICsxMDYxLDEwIEBACiAJCXNvY2tldC0+cG9sbF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc29ja2V0OwogCQlzb2NrZXQtPnBvbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKIAkJYWRkX3RpbWVyKCZzb2NrZXQtPnBvbGxfdGltZXIpOworCQlwcmludGsoS0VSTl9JTkZPICJZZW50YTogbm8gUENJIElSUSwgQ2FyZEJ1cyBzdXBwb3J0IGRpc2FibGVkIGZvciB0aGlzIHNvY2tldC5cbiIKKwkJICAgICAgIEtFUk5fSU5GTyAiWWVudGE6IGNoZWNrIHlvdXIgQklPUyBDYXJkQnVzLCBCSU9TIElSUSBvciBBQ1BJIHNldHRpbmdzLlxuIik7CisJfSBlbHNlIHsKKwkJc29ja2V0LT5zb2NrZXQuZmVhdHVyZXMgfD0gU1NfQ0FQX0NBUkRCVVM7CiAJfQogCiAJLyogRmlndXJlIG91dCB3aGF0IHRoZSBkYW5nIHRoaW5nIGNhbiBkbyBmb3IgdGhlIFBDTUNJQSBsYXllci4uLiAqLwpAQCAtMTA0OCw2ICsxMTA1LDcgQEAKIAkJcGNpX3NhdmVfc3RhdGUoZGV2KTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgMTYqNCwgJnNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAxNyo0LCAmc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7CisJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogCiAJCS8qCiAJCSAqIFNvbWUgbGFwdG9wcyAoSUJNIFQyMikgZG8gbm90IGxpa2UgdXMgcHV0dGluZyB0aGUgQ2FyZGJ1cwpAQCAtMTA3MSw2ICsxMTI5LDggQEAKIAkJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDE2KjQsIHNvY2tldC0+c2F2ZWRfc3RhdGVbMF0pOwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMTcqNCwgc29ja2V0LT5zYXZlZF9zdGF0ZVsxXSk7CisJCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJCXBjaV9zZXRfbWFzdGVyKGRldik7CiAKIAkJaWYgKHNvY2tldC0+dHlwZSAmJiBzb2NrZXQtPnR5cGUtPnJlc3RvcmVfc3RhdGUpCiAJCQlzb2NrZXQtPnR5cGUtPnJlc3RvcmVfc3RhdGUoc29ja2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NhcmQuYyBiL2RyaXZlcnMvcG5wL2NhcmQuYwppbmRleCAzMjUyNjYyLi5hZGQxMmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jYXJkLmMKKysrIGIvZHJpdmVycy9wbnAvY2FyZC5jCkBAIC0yNTksNyArMjU5LDYgQEAKIAogLyoqCiAgKiBwbnBfcmVtb3ZlX2NhcmRfZGV2aWNlLSByZW1vdmVzIGEgZGV2aWNlIGZyb20gdGhlIHNwZWNpZmllZCBjYXJkCi0gKiBAY2FyZDogcG9pbnRlciB0byB0aGUgY2FyZCB0byByZW1vdmUgZnJvbQogICogQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlIHRvIHJlbW92ZQogICovCiAKQEAgLTI3NCw3ICsyNzMsNyBAQAogCiAvKioKICAqIHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlIC0gU2VhcmNoZXMgZm9yIGEgUG5QIGRldmljZSB1bmRlciB0aGUgc3BlY2lmaWVkIGNhcmQKLSAqIEBsY2FyZDogcG9pbnRlciB0byB0aGUgY2FyZCBsaW5rLCBjYW5ub3QgYmUgTlVMTAorICogQGNsaW5rOiBwb2ludGVyIHRvIHRoZSBjYXJkIGxpbmssIGNhbm5vdCBiZSBOVUxMCiAgKiBAaWQ6IHBvaW50ZXIgdG8gYSBQblAgSUQgc3RydWN0dXJlIHRoYXQgZXhwbGFpbnMgdGhlIHJ1bGVzIGZvciBmaW5kaW5nIHRoZSBkZXZpY2UKICAqIEBmcm9tOiBTdGFydGluZyBwbGFjZSB0byBzZWFyY2ggZnJvbS4gSWYgTlVMTCBpdCB3aWxsIHN0YXJ0IGZyb20gdGhlIGJlZ2luaW5nLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9tYW5hZ2VyLmMgYi9kcml2ZXJzL3BucC9tYW5hZ2VyLmMKaW5kZXggNjVlY2VmNy4uNmM1MTBjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvcG5wL21hbmFnZXIuYwpAQCAtMzkwLDYgKzM5MCw3IEBACiAgKiBwbnBfbWFudWFsX2NvbmZpZ19kZXYgLSBEaXNhYmxlcyBBdXRvIENvbmZpZyBhbmQgTWFudWFsbHkgc2V0cyB0aGUgcmVzb3VyY2UgdGFibGUKICAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIGRlc2lyZWQgZGV2aWNlCiAgKiBAcmVzOiBwb2ludGVyIHRvIHRoZSBuZXcgcmVzb3VyY2UgY29uZmlnCisgKiBAbW9kZTogMCBvciBQTlBfQ09ORklHX0ZPUkNFCiAgKgogICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBkcml2ZXJzIHRoYXQgd2FudCB0byBtYW51YWxseSBzZXQgdGhpZXIgcmVzb3VyY2VzLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggZGQ2MWUwOS4uNzU1NzVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCQkJYWNwaV9yZWdpc3Rlcl9nc2kocmVzLT5kYXRhLmlycS5pbnRlcnJ1cHRzWzBdLAogCQkJCQlyZXMtPmRhdGEuaXJxLmVkZ2VfbGV2ZWwsCiAJCQkJCXJlcy0+ZGF0YS5pcnEuYWN0aXZlX2hpZ2hfbG93KSk7Ci0JCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEocmVzLT5kYXRhLmlycS5pbnRlcnJ1cHRzWzBdKTsKKwkJCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShyZXMtPmRhdGEuaXJxLmludGVycnVwdHNbMF0sIDEpOwogCQl9CiAJCWJyZWFrOwogCkBAIC0xNzEsNyArMTcxLDcgQEAKIAkJCQlhY3BpX3JlZ2lzdGVyX2dzaShyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0sCiAJCQkJCXJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuZWRnZV9sZXZlbCwKIAkJCQkJcmVzLT5kYXRhLmV4dGVuZGVkX2lycS5hY3RpdmVfaGlnaF9sb3cpKTsKLQkJCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxLmludGVycnVwdHNbMF0pOworCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKHJlcy0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0c1swXSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX1JTVFlQRV9ETUE6CkBAIC00NDQsNiArNDQ0LDcgQEAKIAogc3RydWN0IGFjcGlwbnBfcGFyc2Vfb3B0aW9uX3MgewogCXN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb247CisJc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbl9pbmRlcGVuZGVudDsKIAlzdHJ1Y3QgcG5wX2RldiAqZGV2OwogfTsKIApAQCAtNTA3LDcgKzUwOCwxNCBAQAogCQkJcGFyc2VfZGF0YS0+b3B0aW9uID0gb3B0aW9uOwkKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUlNUWVBFX0VORF9EUEY6Ci0JCQlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CisJCQkvKm9ubHkgb25lIEVuZERlcGVuZGVudEZuIGlzIGFsbG93ZWQqLworCQkJaWYgKCFwYXJzZV9kYXRhLT5vcHRpb25faW5kZXBlbmRlbnQpIHsKKwkJCQlwbnBfd2FybigiUG5QQUNQSTogbW9yZSB0aGFuIG9uZSBFbmREZXBlbmRlbnRGbiIpOworCQkJCXJldHVybiBBRV9FUlJPUjsKKwkJCX0KKwkJCXBhcnNlX2RhdGEtPm9wdGlvbiA9IHBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudDsKKwkJCXBhcnNlX2RhdGEtPm9wdGlvbl9pbmRlcGVuZGVudCA9IE5VTEw7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXBucF93YXJuKCJQblBBQ1BJOiB1bmtub3duIHJlc291cmNlIHR5cGUgJWQiLCByZXMtPmlkKTsKIAkJCXJldHVybiBBRV9FUlJPUjsKQEAgLTUyNSw2ICs1MzMsNyBAQAogCXBhcnNlX2RhdGEub3B0aW9uID0gcG5wX3JlZ2lzdGVyX2luZGVwZW5kZW50X29wdGlvbihkZXYpOwogCWlmICghcGFyc2VfZGF0YS5vcHRpb24pCiAJCXJldHVybiBBRV9FUlJPUjsKKwlwYXJzZV9kYXRhLm9wdGlvbl9pbmRlcGVuZGVudCA9IHBhcnNlX2RhdGEub3B0aW9uOwogCXBhcnNlX2RhdGEuZGV2ID0gZGV2OwogCXN0YXR1cyA9IGFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fUFJTLCAKIAkJcG5wYWNwaV9vcHRpb25fcmVzb3VyY2UsICZwYXJzZV9kYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGJpb3MvY29yZS5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKaW5kZXggZTkzOWM5My4uNzc4YTMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9jb3JlLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCQltc2xlZXBfaW50ZXJydXB0aWJsZSgyMDAwKTsKIAogCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJaWYgKHRyeV90b19mcmVlemUoUEZfRlJFRVpFKSkKKwkJCWlmICh0cnlfdG9fZnJlZXplKCkpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jIGIvZHJpdmVycy9wbnAvcG5wYmlvcy9yc3BhcnNlci5jCmluZGV4IDc5YmNlN2IuLjkwMDFiNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3BucGJpb3MvcnNwYXJzZXIuYworKysgYi9kcml2ZXJzL3BucC9wbnBiaW9zL3JzcGFyc2VyLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAkJfQogCQlyZXMtPmlycV9yZXNvdXJjZVtpXS5zdGFydCA9CiAJCXJlcy0+aXJxX3Jlc291cmNlW2ldLmVuZCA9ICh1bnNpZ25lZCBsb25nKSBpcnE7Ci0JCXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpcnEpOworCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaXJxLCAxKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMgYi9kcml2ZXJzL3BucC9yZXNvdXJjZS5jCmluZGV4IDJkMTMyMmQuLjg4N2FkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL3Jlc291cmNlLmMKKysrIGIvZHJpdmVycy9wbnAvcmVzb3VyY2UuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCQlpZiAodGVzdF9iaXQoaSwgZGF0YS0+bWFwKSkKLQkJCQlwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaSk7CisJCQkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGksIDApOwogCX0KICNlbmRpZgogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL0tjb25maWcgYi9kcml2ZXJzL3MzOTAvS2NvbmZpZwppbmRleCA5NjQxM2MyLi5hODZhNjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvS2NvbmZpZworKysgYi9kcml2ZXJzL3MzOTAvS2NvbmZpZwpAQCAtMTg3LDYgKzE4NywxMyBAQAogCSAgKlNZTVBUT00uCiAJICBUaGlzIGRyaXZlciBkZXBlbmRzIG9uIHRoZSBJVUNWIHN1cHBvcnQgZHJpdmVyLgogCitjb25maWcgVk1DUAorCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgei9WTSBDUCBpbnRlcmZhY2UgKFZNIG9ubHkpIgorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlIGNvbnRyb2wKKwkgIHByb2dyYW0gb24gei9WTQorCisKIGNvbmZpZyBNT05SRUFERVIKIAl0cmlzdGF0ZSAiQVBJIGZvciByZWFkaW5nIHovVk0gbW9uaXRvciBzZXJ2aWNlIHJlY29yZHMiCiAJZGVwZW5kcyBvbiBJVUNWCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCBjZWViM2NmLi42NTI3ZmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCQlyZXR1cm4gcmM7CiAKIAkvKiByZWdpc3RlciAnZGV2aWNlJyBkZWJ1ZyBhcmVhLCB1c2VkIGZvciBhbGwgREJGX0RFVl9YWFggY2FsbHMgKi8KLQlkZXZpY2UtPmRlYnVnX2FyZWEgPSBkZWJ1Z19yZWdpc3RlcihkZXZpY2UtPmNkZXYtPmRldi5idXNfaWQsIDAsIDIsCisJZGV2aWNlLT5kZWJ1Z19hcmVhID0gZGVidWdfcmVnaXN0ZXIoZGV2aWNlLT5jZGV2LT5kZXYuYnVzX2lkLCAxLCAyLAogCQkJCQkgICAgOCAqIHNpemVvZiAobG9uZykpOwogCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoZGV2aWNlLT5kZWJ1Z19hcmVhLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKIAlkZWJ1Z19zZXRfbGV2ZWwoZGV2aWNlLT5kZWJ1Z19hcmVhLCBEQkZfRU1FUkcpOwpAQCAtMTk1MiwyNiArMTk1MiwyNCBAQAogICogQXV0b21hdGljYWxseSBvbmxpbmUgZWl0aGVyIGFsbCBkYXNkIGRldmljZXMgKGRhc2RfYXV0b2RldGVjdCkgb3IKICAqIGFsbCBkZXZpY2VzIHNwZWNpZmllZCB3aXRoIGRhc2Q9IHBhcmFtZXRlcnMuCiAgKi8KK3N0YXRpYyBpbnQKK19fZGFzZF9hdXRvX29ubGluZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CisKKwljZGV2ID0gdG9fY2N3ZGV2KGRldik7CisJaWYgKGRhc2RfYXV0b2RldGVjdCB8fCBkYXNkX2J1c2lkX2tub3duKGNkZXYtPmRldi5idXNfaWQpID09IDApCisJCWNjd19kZXZpY2Vfc2V0X29ubGluZShjZGV2KTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZAogZGFzZF9nZW5lcmljX2F1dG9fb25saW5lIChzdHJ1Y3QgY2N3X2RyaXZlciAqZGFzZF9kaXNjaXBsaW5lX2RyaXZlcikKIHsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OwotCXN0cnVjdCBkZXZpY2UgKmQsICpkZXY7Ci0Jc3RydWN0IGNjd19kZXZpY2UgKmNkZXY7CiAKIAlkcnYgPSBnZXRfZHJpdmVyKCZkYXNkX2Rpc2NpcGxpbmVfZHJpdmVyLT5kcml2ZXIpOwotCWRvd25fcmVhZCgmZHJ2LT5idXMtPnN1YnN5cy5yd3NlbSk7Ci0JZGV2ID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZkcnYtPmRldmljZXMsIGRyaXZlcl9saXN0KSB7Ci0JCWRldiA9IGdldF9kZXZpY2UoZCk7Ci0JCWlmICghZGV2KQotCQkJY29udGludWU7Ci0JCWNkZXYgPSB0b19jY3dkZXYoZGV2KTsKLQkJaWYgKGRhc2RfYXV0b2RldGVjdCB8fCBkYXNkX2J1c2lkX2tub3duKGNkZXYtPmRldi5idXNfaWQpID09IDApCi0JCQljY3dfZGV2aWNlX3NldF9vbmxpbmUoY2Rldik7Ci0JCXB1dF9kZXZpY2UoZGV2KTsKLQl9Ci0JdXBfcmVhZCgmZHJ2LT5idXMtPnN1YnN5cy5yd3NlbSk7CisJZHJpdmVyX2Zvcl9lYWNoX2RldmljZShkcnYsIE5VTEwsIE5VTEwsIF9fZGFzZF9hdXRvX29ubGluZSk7CiAJcHV0X2RyaXZlcihkcnYpOwogfQogCkBAIC0xOTgzLDcgKzE5ODEsNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRhc2RfaW5pdF93YWl0cSk7CiAKIAkvKiByZWdpc3RlciAnY29tbW9uJyBEQVNEIGRlYnVnIGFyZWEsIHVzZWQgZm9yIGFsbCBEQkZfWFhYIGNhbGxzICovCi0JZGFzZF9kZWJ1Z19hcmVhID0gZGVidWdfcmVnaXN0ZXIoImRhc2QiLCAwLCAyLCA4ICogc2l6ZW9mIChsb25nKSk7CisJZGFzZF9kZWJ1Z19hcmVhID0gZGVidWdfcmVnaXN0ZXIoImRhc2QiLCAxLCAyLCA4ICogc2l6ZW9mIChsb25nKSk7CiAJaWYgKGRhc2RfZGVidWdfYXJlYSA9PSBOVUxMKSB7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKaW5kZXggZDdmMTk3NC4uNDNjMzRmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYwpAQCAtOSwxMyArOSwxNCBAQAogICoKICAqIC9wcm9jIGludGVyZmFjZSBmb3IgdGhlIGRhc2QgZHJpdmVyLgogICoKLSAqICRSZXZpc2lvbjogMS4zMSAkCisgKiAkUmV2aXNpb246IDEuMzIgJAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAogI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCAxNmFiOGQzLi40ZmRlNDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTM1LDE0ICszNSwxNyBAQAogc3RhdGljIGludCBkY3NzYmxrX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIGludCBkY3NzYmxrX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIGludCBkY3NzYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKK3N0YXRpYyBpbnQgZGNzc2Jsa19kaXJlY3RfYWNjZXNzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY251bSwKKwkJCQkgdW5zaWduZWQgbG9uZyAqZGF0YSk7CiAKIHN0YXRpYyBjaGFyIGRjc3NibGtfc2VnbWVudHNbRENTU0JMS19QQVJNX0xFTl0gPSAiXDAiOwogCiBzdGF0aWMgaW50IGRjc3NibGtfbWFqb3I7CiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGRjc3NibGtfZGV2b3BzID0gewotCS5vd25lciAgID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gICAgPSBkY3NzYmxrX29wZW4sCi0JLnJlbGVhc2UgPSBkY3NzYmxrX3JlbGVhc2UsCisJLm93bmVyICAgCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgCT0gZGNzc2Jsa19vcGVuLAorCS5yZWxlYXNlIAk9IGRjc3NibGtfcmVsZWFzZSwKKwkuZGlyZWN0X2FjY2VzcyAJPSBkY3NzYmxrX2RpcmVjdF9hY2Nlc3MsCiB9OwogCiBzdGF0aWMgc3NpemVfdCBkY3NzYmxrX2FkZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqIGJ1ZiwKQEAgLTY0MSw2ICs2NDQsMjAgQEAKIAkJLyogUmVxdWVzdCBiZXlvbmQgZW5kIG9mIERDU1Mgc2VnbWVudC4gKi8KIAkJZ290byBmYWlsOwogCX0KKwkvKiB2ZXJpZnkgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KKwlpZiAoZGV2X2luZm8tPmlzX3NoYXJlZCkgeworCQlzd2l0Y2ggKGRldl9pbmZvLT5zZWdtZW50X3R5cGUpIHsKKwkJY2FzZSBTRUdfVFlQRV9TUjoKKwkJY2FzZSBTRUdfVFlQRV9FUjoKKwkJY2FzZSBTRUdfVFlQRV9TQzoKKwkJCS8qIGNhbm5vdCB3cml0ZSB0byB0aGVzZSBzZWdtZW50cyAqLworCQkJaWYgKGJpb19kYXRhX2RpcihiaW8pID09IFdSSVRFKSB7CisJCQkJUFJJTlRfV0FSTigicmVqZWN0aW5nIHdyaXRlIHRvIHJvIHNlZ21lbnQgJXNcbiIsIGRldl9pbmZvLT5kZXYuYnVzX2lkKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwl9CisKIAlpbmRleCA9IChiaW8tPmJpX3NlY3RvciA+PiAzKTsKIAliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpIHsKIAkJcGFnZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpCkBAIC02NjEsNyArNjc4LDI2IEBACiAJYmlvX2VuZGlvKGJpbywgYnl0ZXNfZG9uZSwgMCk7CiAJcmV0dXJuIDA7CiBmYWlsOgotCWJpb19pb19lcnJvcihiaW8sIGJ5dGVzX2RvbmUpOworCWJpb19pb19lcnJvcihiaW8sIGJpby0+Ymlfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Rjc3NibGtfZGlyZWN0X2FjY2VzcyAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjbnVtLAorCQkJdW5zaWduZWQgbG9uZyAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGNzc2Jsa19kZXZfaW5mbyAqZGV2X2luZm87CisJdW5zaWduZWQgbG9uZyBwZ29mZjsKKworCWRldl9pbmZvID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOworCWlmICghZGV2X2luZm8pCisJCXJldHVybiAtRU5PREVWOworCWlmIChzZWNudW0gJSAoUEFHRV9TSVpFLzUxMikpCisJCXJldHVybiAtRUlOVkFMOworCXBnb2ZmID0gc2VjbnVtIC8gKFBBR0VfU0laRSAvIDUxMik7CisJaWYgKChwZ29mZisxKSpQQUdFX1NJWkUtMSA+IGRldl9pbmZvLT5lbmQgLSBkZXZfaW5mby0+c3RhcnQpCisJCXJldHVybiAtRVJBTkdFOworCSpkYXRhID0gKHVuc2lnbmVkIGxvbmcpIChkZXZfaW5mby0+c3RhcnQrcGdvZmYqUEFHRV9TSVpFKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjgyLDcgKzcxOCw3IEBACiAJCQlidWZbai1pXSA9IGRjc3NibGtfc2VnbWVudHNbal07CiAJCX0KIAkJYnVmW2otaV0gPSAnXDAnOwotCQlyYyA9IGRjc3NibGtfYWRkX3N0b3JlKGRjc3NibGtfcm9vdF9kZXYsIGJ1Ziwgai1pKTsKKwkJcmMgPSBkY3NzYmxrX2FkZF9zdG9yZShkY3NzYmxrX3Jvb3RfZGV2LCBOVUxMLCBidWYsIGotaSk7CiAJCWlmICgocmMgPj0gMCkgJiYgKGRjc3NibGtfc2VnbWVudHNbal0gPT0gJygnKSkgewogCQkJZm9yIChrID0gMDsgYnVmW2tdICE9ICdcMCc7IGsrKykKIAkJCQlidWZba10gPSB0b3VwcGVyKGJ1ZltrXSk7CkBAIC02OTIsNyArNzI4LDcgQEAKIAkJCQl1cF9yZWFkKCZkY3NzYmxrX2RldmljZXNfc2VtKTsKIAkJCQlpZiAoZGV2X2luZm8pCiAJCQkJCWRjc3NibGtfc2hhcmVkX3N0b3JlKCZkZXZfaW5mby0+ZGV2LAotCQkJCQkJCSAgICAgIjBcbiIsIDIpOworCQkJCQkJCSAgICAgTlVMTCwgIjBcbiIsIDIpOwogCQkJfQogCQl9CiAJCXdoaWxlICgoZGNzc2Jsa19zZWdtZW50c1tqXSAhPSAnLCcpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvczM5MC9jaGFyL01ha2VmaWxlCmluZGV4IDE0ZThjY2UuLjYzNzdhOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiAKIG9iai0kKENPTkZJR19aVk1fV0FUQ0hET0cpICs9IHZtd2F0Y2hkb2cubwogb2JqLSQoQ09ORklHX1ZNTE9HUkRSKSArPSB2bWxvZ3Jkci5vCitvYmotJChDT05GSUdfVk1DUCkgKz0gdm1jcC5vCiAKIHRhcGUtJChDT05GSUdfUzM5MF9UQVBFX0JMT0NLKSArPSB0YXBlX2Jsb2NrLm8KIHRhcGUtJChDT05GSUdfUFJPQ19GUykgKz0gdGFwZV9wcm9jLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyMTUuYwppbmRleCAwMjJmMTdiLi5mMTFhNjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjE1LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzIxNS5jCkBAIC04NjAsOCArODYwLDggQEAKIAogCS8qIFNldCB0aGUgY29uc29sZSBtb2RlIGZvciBWTSAqLwogCWlmIChNQUNISU5FX0lTX1ZNKSB7Ci0JCWNwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDApOwotCQljcGNtZCgiVEVSTSBBVVRPQ1IgT0ZGIiwgTlVMTCwgMCk7CisJCWNwY21kKCJURVJNIENPTk1PREUgMzIxNSIsIE5VTEwsIDAsIE5VTEwpOworCQljcGNtZCgiVEVSTSBBVVRPQ1IgT0ZGIiwgTlVMTCwgMCwgTlVMTCk7CiAJfQogCiAJLyogYWxsb2NhdGUgMzIxNSByZXF1ZXN0IHN0cnVjdHVyZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYyBiL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYwppbmRleCBkNTJmYjU3Li5mYzdhMjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCkBAIC01OTEsOCArNTkxLDggQEAKIAogCS8qIFNldCB0aGUgY29uc29sZSBtb2RlIGZvciBWTSAqLwogCWlmIChNQUNISU5FX0lTX1ZNKSB7Ci0JCWNwY21kKCJURVJNIENPTk1PREUgMzI3MCIsIDAsIDApOwotCQljcGNtZCgiVEVSTSBBVVRPQ1IgT0ZGIiwgMCwgMCk7CisJCWNwY21kKCJURVJNIENPTk1PREUgMzI3MCIsIE5VTEwsIDAsIE5VTEwpOworCQljcGNtZCgiVEVSTSBBVVRPQ1IgT0ZGIiwgTlVMTCwgMCwgTlVMTCk7CiAJfQogCiAJY2RldiA9IGNjd19kZXZpY2VfcHJvYmVfY29uc29sZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYwppbmRleCA0ODBlYzg3Li4yMGJlODhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlXzM0eHguYwpAQCAtMTM1MSwxMyArMTM1MSwxMyBAQAogewogCWludCByYzsKIAotCVRBUEVfREJGX0FSRUEgPSBkZWJ1Z19yZWdpc3RlciAoICJ0YXBlXzM0eHgiLCAxLCAyLCA0KnNpemVvZihsb25nKSk7CisJVEFQRV9EQkZfQVJFQSA9IGRlYnVnX3JlZ2lzdGVyICggInRhcGVfMzR4eCIsIDIsIDIsIDQqc2l6ZW9mKGxvbmcpKTsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3KFRBUEVfREJGX0FSRUEsICZkZWJ1Z19zcHJpbnRmX3ZpZXcpOwogI2lmZGVmIERCRl9MSUtFX0hFTEwKIAlkZWJ1Z19zZXRfbGV2ZWwoVEFQRV9EQkZfQVJFQSwgNik7CiAjZW5kaWYKIAotCURCRl9FVkVOVCgzLCAiMzR4eCBpbml0OiAkUmV2aXNpb246IDEuMjEgJFxuIik7CisJREJGX0VWRU5UKDMsICIzNHh4IGluaXQ6ICRSZXZpc2lvbjogMS4yMyAkXG4iKTsKIAkvKiBSZWdpc3RlciBkcml2ZXIgZm9yIDM0ODAvMzQ5MCB0YXBlcy4gKi8KIAlyYyA9IGNjd19kcml2ZXJfcmVnaXN0ZXIoJnRhcGVfMzR4eF9kcml2ZXIpOwogCWlmIChyYykKQEAgLTEzNzgsNyArMTM3OCw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKGNjdywgdGFwZV8zNHh4X2lkcyk7CiBNT0RVTEVfQVVUSE9SKCIoQykgMjAwMS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJIIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IG9uIHpTZXJpZXMgY2hhbm5lbCBhdHRhY2hlZCAzNDgwIHRhcGUgIgotCQkgICAiZGV2aWNlIGRyaXZlciAoJFJldmlzaW9uOiAxLjIxICQpIik7CisJCSAgICJkZXZpY2UgZHJpdmVyICgkUmV2aXNpb246IDEuMjMgJCkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogbW9kdWxlX2luaXQodGFwZV8zNHh4X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9jb3JlLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYwppbmRleCBiNGRmNGE1Li4wNTk3YWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2NvcmUuYwpAQCAtMTE4Niw3ICsxMTg2LDcgQEAKIHN0YXRpYyBpbnQKIHRhcGVfaW5pdCAodm9pZCkKIHsKLQlUQVBFX0RCRl9BUkVBID0gZGVidWdfcmVnaXN0ZXIgKCAidGFwZSIsIDEsIDIsIDQqc2l6ZW9mKGxvbmcpKTsKKwlUQVBFX0RCRl9BUkVBID0gZGVidWdfcmVnaXN0ZXIgKCAidGFwZSIsIDIsIDIsIDQqc2l6ZW9mKGxvbmcpKTsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3KFRBUEVfREJGX0FSRUEsICZkZWJ1Z19zcHJpbnRmX3ZpZXcpOwogI2lmZGVmIERCRl9MSUtFX0hFTEwKIAlkZWJ1Z19zZXRfbGV2ZWwoVEFQRV9EQkZfQVJFQSwgNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX3Byb2MuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfcHJvYy5jCmluZGV4IDgwMWQxN2MuLjVmZWMwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfcHJvYy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCiAjZGVmaW5lIFRBUEVfREJGX0FSRUEJdGFwZV9jb3JlX2RiZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxMWE2MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtY3AuYwpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IElCTSBDb3Jwb3JhdGlvbgorICogSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHYvVk0gY29udHJvbCBwcm9ncmFtCisgKiBBdXRob3Iocyk6IENocmlzdGlhbiBCb3JudHJhZWdlciA8Y2Jvcm50cmFAZGUuaWJtLmNvbT4KKyAqCisgKgorICogei9WTXMgQ1Agb2ZmZXJzIHRoZSBwb3NzaWJpbGl0eSB0byBpc3N1ZSBjb21tYW5kcyB2aWEgdGhlIGRpYWdub3NlIGNvZGUgOAorICogdGhpcyBkcml2ZXIgaW1wbGVtZW50cyBhIGNoYXJhY3RlciBkZXZpY2UgdGhhdCBpc3N1ZXMgdGhlc2UgY29tbWFuZHMgYW5kCisgKiByZXR1cm5zIHRoZSBhbnN3ZXIgb2YgQ1AuCisKKyAqIFRoZSBpZGVhIG9mIHRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGNwaW50IGZyb20gTmVhbGUgRmVyZ3Vzb24gYW5kICNDUCBpbiBDTVMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9jcGNtZC5oPgorI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAidm1jcC5oIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaHJpc3RpYW4gQm9ybnRyYWVnZXIgPGNib3JudHJhQGRlLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInovVk0gQ1AgaW50ZXJmYWNlIik7CisKK3N0YXRpYyBkZWJ1Z19pbmZvX3QgKnZtY3BfZGVidWc7CisKK3N0YXRpYyBpbnQgdm1jcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2bWNwX3Nlc3Npb24gKnNlc3Npb247CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzZXNzaW9uID0ga21hbGxvYyhzaXplb2YoKnNlc3Npb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlc3Npb24pCisJCXJldHVybiAtRU5PTUVNOworCXNlc3Npb24tPmJ1ZnNpemUgPSBQQUdFX1NJWkU7CisJc2Vzc2lvbi0+cmVzcG9uc2UgPSBOVUxMOworCXNlc3Npb24tPnJlc3Bfc2l6ZSA9IDA7CisJaW5pdF9NVVRFWCgmc2Vzc2lvbi0+bXV0ZXgpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHNlc3Npb247CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHZtY3BfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgdm1jcF9zZXNzaW9uICpzZXNzaW9uOworCisJc2Vzc2lvbiA9IChzdHJ1Y3Qgdm1jcF9zZXNzaW9uICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylzZXNzaW9uLT5yZXNwb25zZSwgZ2V0X29yZGVyKHNlc3Npb24tPmJ1ZnNpemUpKTsKKwlrZnJlZShzZXNzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK3ZtY3BfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWZmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc2l6ZV90IHRvY29weTsKKwlzdHJ1Y3Qgdm1jcF9zZXNzaW9uICpzZXNzaW9uOworCisJc2Vzc2lvbiA9IChzdHJ1Y3Qgdm1jcF9zZXNzaW9uICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNlc3Npb24tPm11dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlpZiAoIXNlc3Npb24tPnJlc3BvbnNlKSB7CisJCXVwKCZzZXNzaW9uLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKnBwb3MgPiBzZXNzaW9uLT5yZXNwX3NpemUpIHsKKwkJdXAoJnNlc3Npb24tPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCXRvY29weSA9IG1pbihzZXNzaW9uLT5yZXNwX3NpemUgLSAoc2l6ZV90KSAoKnBwb3MpLCBjb3VudCk7CisJdG9jb3B5ID0gbWluKHRvY29weSxzZXNzaW9uLT5idWZzaXplIC0gKHNpemVfdCkgKCpwcG9zKSk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZmYsIHNlc3Npb24tPnJlc3BvbnNlICsgKCpwcG9zKSwgdG9jb3B5KSkgeworCQl1cCgmc2Vzc2lvbi0+bXV0ZXgpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJdXAoJnNlc3Npb24tPm11dGV4KTsKKwkqcHBvcyArPSB0b2NvcHk7CisJcmV0dXJuIHRvY29weTsKK30KKworc3RhdGljIHNzaXplX3QKK3ZtY3Bfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogYnVmZiwgc2l6ZV90IGNvdW50LAorCSAgIGxvZmZfdCAqIHBwb3MpCit7CisJY2hhciAqY21kOworCXN0cnVjdCB2bWNwX3Nlc3Npb24gKnNlc3Npb247CisKKwlpZiAoY291bnQgPiAyNDApCisJCXJldHVybiAtRUlOVkFMOworCWNtZCA9IGttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKGNtZCwgYnVmZiwgY291bnQpKSB7CisJCWtmcmVlKGNtZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwljbWRbY291bnRdID0gJ1wwJzsKKwlzZXNzaW9uID0gKHN0cnVjdCB2bWNwX3Nlc3Npb24gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2Vzc2lvbi0+bXV0ZXgpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCWlmICghc2Vzc2lvbi0+cmVzcG9uc2UpCisJCXNlc3Npb24tPnJlc3BvbnNlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwKKwkJCQkJCXwgX19HRlBfUkVQRUFUIAl8IEdGUF9ETUEsCisJCQkJCQlnZXRfb3JkZXIoc2Vzc2lvbi0+YnVmc2l6ZSkpOworCWlmICghc2Vzc2lvbi0+cmVzcG9uc2UpIHsKKwkJdXAoJnNlc3Npb24tPm11dGV4KTsKKwkJa2ZyZWUoY21kKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRlYnVnX3RleHRfZXZlbnQodm1jcF9kZWJ1ZywgMSwgY21kKTsKKwlzZXNzaW9uLT5yZXNwX3NpemUgPSBjcGNtZChjbWQsIHNlc3Npb24tPnJlc3BvbnNlLAorCQkJCSAgIHNlc3Npb24tPmJ1ZnNpemUsCisJCQkJICAgJnNlc3Npb24tPnJlc3BfY29kZSk7CisJdXAoJnNlc3Npb24tPm11dGV4KTsKKwlrZnJlZShjbWQpOworCSpwcG9zID0gMDsJCS8qIHJlc2V0IHRoZSBmaWxlIHBvaW50ZXIgYWZ0ZXIgYSBjb21tYW5kICovCisJcmV0dXJuIGNvdW50OworfQorCisKKy8qCisgKiBUaGVzZSBpb2N0bHMgYXJlIGF2YWlsYWJsZSwgYXMgdGhlIHNlbWFudGljcyBvZiB0aGUgZGlhZ25vc2UgOCBjYWxsCisgKiBkb2VzIG5vdCBmaXQgdmVyeSB3ZWxsIGludG8gYSBMaW51eCBjYWxsLiBEaWFnbm9zZSBYJzA4JyBpcyBkZXNjcmliZWQgaW4KKyAqIENQIFByb2dyYW1taW5nIFNlcnZpY2VzIFNDMjQtNjA4NC0wMAorICoKKyAqIFZNQ1BfR0VUQ09ERTogZ2l2ZXMgdGhlIENQIHJldHVybiBjb2RlIGJhY2sgdG8gdXNlciBzcGFjZQorICogVk1DUF9TRVRCVUY6IHNldHMgdGhlIHJlc3BvbnNlIGJ1ZmZlciBmb3IgdGhlIG5leHQgd3JpdGUgY2FsbC4gZGlhZ25vc2UgOAorICogZXhwZWN0cyBhZGphY2VudCBwYWdlcyBpbiByZWFsIHN0b3JhZ2UgYW5kIHRvIG1ha2UgbWF0dGVycyB3b3JzZSwgd2UKKyAqIGRvbnQga25vdyB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UuIFRoZXJlZm9yZSB3ZSBkZWZhdWx0IHRvIFBBR0VTSVpFIGFuZAorICogbGV0IHVzZXJzcGFjZSB0byBjaGFuZ2UgdGhlIHJlc3BvbnNlIHNpemUsIGlmIHVzZXJzcGFjZSBleHBlY3RzIGEgYmlnZ2VyCisgKiByZXNwb25zZQorICovCitzdGF0aWMgbG9uZyB2bWNwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgdm1jcF9zZXNzaW9uICpzZXNzaW9uOworCWludCB0ZW1wOworCisJc2Vzc2lvbiA9IChzdHJ1Y3Qgdm1jcF9zZXNzaW9uICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNlc3Npb24tPm11dGV4KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVk1DUF9HRVRDT0RFOgorCQl0ZW1wID0gc2Vzc2lvbi0+cmVzcF9jb2RlOworCQl1cCgmc2Vzc2lvbi0+bXV0ZXgpOworCQlyZXR1cm4gcHV0X3VzZXIodGVtcCwgKGludCBfX3VzZXIgKilhcmcpOworCWNhc2UgVk1DUF9TRVRCVUY6CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc2Vzc2lvbi0+cmVzcG9uc2UsCisJCQkJZ2V0X29yZGVyKHNlc3Npb24tPmJ1ZnNpemUpKTsKKwkJc2Vzc2lvbi0+cmVzcG9uc2U9TlVMTDsKKwkJdGVtcCA9IGdldF91c2VyKHNlc3Npb24tPmJ1ZnNpemUsIChpbnQgX191c2VyICopYXJnKTsKKwkJaWYgKGdldF9vcmRlcihzZXNzaW9uLT5idWZzaXplKSA+IDgpIHsKKwkJCXNlc3Npb24tPmJ1ZnNpemUgPSBQQUdFX1NJWkU7CisJCQl0ZW1wID0gLUVJTlZBTDsKKwkJfQorCQl1cCgmc2Vzc2lvbi0+bXV0ZXgpOworCQlyZXR1cm4gdGVtcDsKKwljYXNlIFZNQ1BfR0VUU0laRToKKwkJdGVtcCA9IHNlc3Npb24tPnJlc3Bfc2l6ZTsKKwkJdXAoJnNlc3Npb24tPm11dGV4KTsKKwkJcmV0dXJuIHB1dF91c2VyKHRlbXAsIChpbnQgX191c2VyICopYXJnKTsKKwlkZWZhdWx0OgorCQl1cCgmc2Vzc2lvbi0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdm1jcF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSAmdm1jcF9vcGVuLAorCS5yZWxlYXNlCT0gJnZtY3BfcmVsZWFzZSwKKwkucmVhZAkJPSAmdm1jcF9yZWFkLAorCS5sbHNlZWsJCT0gJm5vX2xsc2VlaywKKwkud3JpdGUJCT0gJnZtY3Bfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gJnZtY3BfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9ICZ2bWNwX2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugdm1jcF9kZXYgPSB7CisJLm5hbWUJPSAidm1jcCIsCisJLm1pbm9yCT0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5mb3BzCT0gJnZtY3BfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZtY3BfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlpZiAoIU1BQ0hJTkVfSVNfVk0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInovVk0gQ1AgaW50ZXJmYWNlIGlzIG9ubHkgYXZhaWxhYmxlIHVuZGVyIHovVk1cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0ID0gbWlzY19yZWdpc3Rlcigmdm1jcF9kZXYpOworCWlmICghcmV0KQorCQlwcmludGsoS0VSTl9JTkZPICJ6L1ZNIENQIGludGVyZmFjZSBsb2FkZWRcbiIpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInovVk0gQ1AgaW50ZXJmYWNlIG5vdCBsb2FkZWQuIENvdWxkIG5vdCByZWdpc3RlciBtaXNjIGRldmljZS5cbiIpOworCXZtY3BfZGVidWcgPSBkZWJ1Z19yZWdpc3Rlcigidm1jcCIsIDEsIDEsIDI0MCk7CisJZGVidWdfcmVnaXN0ZXJfdmlldyh2bWNwX2RlYnVnLCAmZGVidWdfaGV4X2FzY2lpX3ZpZXcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2bWNwX2V4aXQodm9pZCkKK3sKKwlXQVJOX09OKG1pc2NfZGVyZWdpc3Rlcigmdm1jcF9kZXYpICE9IDApOworCWRlYnVnX3VucmVnaXN0ZXIodm1jcF9kZWJ1Zyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiei9WTSBDUCBpbnRlcmZhY2UgdW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2luaXQodm1jcF9pbml0KTsKK21vZHVsZV9leGl0KHZtY3BfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmggYi9kcml2ZXJzL3MzOTAvY2hhci92bWNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczODllNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtY3AuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbgorICogSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHYvVk0gY29udHJvbCBwcm9ncmFtCisgKiBWZXJzaW9uIDEuMAorICogQXV0aG9yKHMpOiBDaHJpc3RpYW4gQm9ybnRyYWVnZXIgPGNib3JudHJhQGRlLmlibS5jb20+CisgKgorICoKKyAqIHovVk1zIENQIG9mZmVycyB0aGUgcG9zc2liaWxpdHkgdG8gaXNzdWUgY29tbWFuZHMgdmlhIHRoZSBkaWFnbm9zZSBjb2RlIDgKKyAqIHRoaXMgZHJpdmVyIGltcGxlbWVudHMgYSBjaGFyYWN0ZXIgZGV2aWNlIHRoYXQgaXNzdWVzIHRoZXNlIGNvbW1hbmRzIGFuZAorICogcmV0dXJucyB0aGUgYW5zd2VyIG9mIENQLgorICoKKyAqIFRoZSBpZGVhIG9mIHRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGNwaW50IGZyb20gTmVhbGUgRmVyZ3Vzb24KKyAqLworCisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgVk1DUF9HRVRDT0RFIF9JT1IoMHgxMCwgMSwgaW50KQorI2RlZmluZSBWTUNQX1NFVEJVRiBfSU9XKDB4MTAsIDIsIGludCkKKyNkZWZpbmUgVk1DUF9HRVRTSVpFIF9JT1IoMHgxMCwgMywgaW50KQorCitzdHJ1Y3Qgdm1jcF9zZXNzaW9uIHsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsKKwljaGFyICpyZXNwb25zZTsKKwlpbnQgcmVzcF9zaXplOworCWludCByZXNwX2NvZGU7CisJLyogQXMgd2UgdXNlIGNvcHlfZnJvbS90b191c2VyLCB3aGljaCBtaWdodCAgICAgKgorCSAqIHNsZWVwIGFuZCBjYW5ub3QgdXNlIGEgc3BpbmxvY2sgICAgICAgICAgICAgICovCisJc3RydWN0IHNlbWFwaG9yZSBtdXRleDsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdm1sb2dyZHIuYwppbmRleCBmNzcxNzMyLi40OTFmMDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci92bWxvZ3Jkci5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3ZtbG9ncmRyLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCWludCBsZW4saTsKIAogCXByaW50ayAoS0VSTl9ERUJVRyAidm1sb2dyZHI6IHF1ZXJ5IGNvbW1hbmQ6ICVzXG4iLCBjcF9jb21tYW5kKTsKLQljcGNtZChjcF9jb21tYW5kLCBjcF9yZXNwb25zZSwgc2l6ZW9mKGNwX3Jlc3BvbnNlKSk7CisJY3BjbWQoY3BfY29tbWFuZCwgY3BfcmVzcG9uc2UsIHNpemVvZihjcF9yZXNwb25zZSksIE5VTEwpOwogCXByaW50ayAoS0VSTl9ERUJVRyAidm1sb2dyZHI6IHJlc3BvbnNlOiAlcyIsIGNwX3Jlc3BvbnNlKTsKIAlsZW4gPSBzdHJubGVuKGNwX3Jlc3BvbnNlLHNpemVvZihjcF9yZXNwb25zZSkpOwogCS8vIG5vdyB0aGUgcGFyc2luZwpAQCAtMjg4LDcgKzI4OCw3IEBACiAKIAkJcHJpbnRrIChLRVJOX0RFQlVHICJ2bWxvZ3JkcjogcmVjb3JkaW5nIGNvbW1hbmQ6ICVzXG4iLAogCQkJY3BfY29tbWFuZCk7Ci0JCWNwY21kKGNwX2NvbW1hbmQsIGNwX3Jlc3BvbnNlLCBzaXplb2YoY3BfcmVzcG9uc2UpKTsKKwkJY3BjbWQoY3BfY29tbWFuZCwgY3BfcmVzcG9uc2UsIHNpemVvZihjcF9yZXNwb25zZSksIE5VTEwpOwogCQlwcmludGsgKEtFUk5fREVCVUcgInZtbG9ncmRyOiByZWNvcmRpbmcgcmVzcG9uc2U6ICVzIiwKIAkJCWNwX3Jlc3BvbnNlKTsKIAl9CkBAIC0zMDEsNyArMzAxLDcgQEAKIAkJcWlkX3N0cmluZyk7CiAKIAlwcmludGsgKEtFUk5fREVCVUcgInZtbG9ncmRyOiByZWNvcmRpbmcgY29tbWFuZDogJXNcbiIsIGNwX2NvbW1hbmQpOwotCWNwY21kKGNwX2NvbW1hbmQsIGNwX3Jlc3BvbnNlLCBzaXplb2YoY3BfcmVzcG9uc2UpKTsKKwljcGNtZChjcF9jb21tYW5kLCBjcF9yZXNwb25zZSwgc2l6ZW9mKGNwX3Jlc3BvbnNlKSwgTlVMTCk7CiAJcHJpbnRrIChLRVJOX0RFQlVHICJ2bWxvZ3JkcjogcmVjb3JkaW5nIHJlc3BvbnNlOiAlcyIsCiAJCWNwX3Jlc3BvbnNlKTsKIAkvKiBUaGUgcmVjb3JkaW5nIGNvbW1hbmQgd2lsbCB1c3VhbGx5IGFuc3dlciB3aXRoICdDb21tYW5kIGNvbXBsZXRlJwpAQCAtNjA3LDcgKzYwNyw3IEBACiAJCQkgcHJpdi0+cmVjb3JkaW5nX25hbWUpOwogCiAJcHJpbnRrIChLRVJOX0RFQlVHICJ2bWxvZ3JkcjogcmVjb3JkaW5nIGNvbW1hbmQ6ICVzXG4iLCBjcF9jb21tYW5kKTsKLQljcGNtZChjcF9jb21tYW5kLCBjcF9yZXNwb25zZSwgc2l6ZW9mKGNwX3Jlc3BvbnNlKSk7CisJY3BjbWQoY3BfY29tbWFuZCwgY3BfcmVzcG9uc2UsIHNpemVvZihjcF9yZXNwb25zZSksIE5VTEwpOwogCXByaW50ayAoS0VSTl9ERUJVRyAidm1sb2dyZHI6IHJlY29yZGluZyByZXNwb25zZTogJXMiLAogCQljcF9yZXNwb25zZSk7CiAKQEAgLTY4Miw3ICs2ODIsNyBAQAogCWNoYXIgY3BfY29tbWFuZFtdID0gIlFVRVJZIFJFQ09SRElORyAiOwogCWludCBsZW47CiAKLQljcGNtZChjcF9jb21tYW5kLCBidWYsIDQwOTYpOworCWNwY21kKGNwX2NvbW1hbmQsIGJ1ZiwgNDA5NiwgTlVMTCk7CiAJbGVuID0gc3RybGVuKGJ1Zik7CiAJcmV0dXJuIGxlbjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwppbmRleCAzMDY1MjVhYy4uOTFlYThlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jY3dncm91cC5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2N3Z3JvdXAuYwpAQCAtNDAzLDM0ICs0MDMsMjIgQEAKIAlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZjZHJpdmVyLT5kcml2ZXIpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKgotX19nZXRfbmV4dF9jY3dncm91cF9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3N0YXRpYyBpbnQKK19fY2N3Z3JvdXBfZHJpdmVyX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYsICpkOwotCi0JZG93bl9yZWFkKCZkcnYtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKLQlkZXYgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRydi0+ZGV2aWNlcywgZHJpdmVyX2xpc3QpIHsKLQkJZGV2ID0gZ2V0X2RldmljZShkKTsKLQkJaWYgKGRldikKLQkJCWJyZWFrOwotCX0KLQl1cF9yZWFkKCZkcnYtPmJ1cy0+c3Vic3lzLnJ3c2VtKTsKLQlyZXR1cm4gZGV2OworCV9fY2N3Z3JvdXBfcmVtb3ZlX3N5bWxpbmtzKHRvX2Njd2dyb3VwZGV2KGRldikpOworCWRldmljZV91bnJlZ2lzdGVyKGRldik7CisJcHV0X2RldmljZShkZXYpOworCXJldHVybiAwOwogfQogCiB2b2lkCiBjY3dncm91cF9kcml2ZXJfdW5yZWdpc3RlciAoc3RydWN0IGNjd2dyb3VwX2RyaXZlciAqY2RyaXZlcikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0KIAkvKiBXZSBkb24ndCB3YW50IGNjd2dyb3VwIGRldmljZXMgdG8gbGl2ZSBsb25nZXIgdGhhbiB0aGVpciBkcml2ZXIuICovCiAJZ2V0X2RyaXZlcigmY2RyaXZlci0+ZHJpdmVyKTsKLQl3aGlsZSAoKGRldiA9IF9fZ2V0X25leHRfY2N3Z3JvdXBfZGV2aWNlKCZjZHJpdmVyLT5kcml2ZXIpKSkgewotCQlfX2Njd2dyb3VwX3JlbW92ZV9zeW1saW5rcyh0b19jY3dncm91cGRldihkZXYpKTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQkJcHV0X2RldmljZShkZXYpOwotCX07CisJZHJpdmVyX2Zvcl9lYWNoX2RldmljZSgmY2RyaXZlci0+ZHJpdmVyLCBOVUxMLCBOVUxMLAorCQkJICAgICAgIF9fY2N3Z3JvdXBfZHJpdmVyX3VucmVnaXN0ZXJfZGV2aWNlKTsKIAlwdXRfZHJpdmVyKCZjZHJpdmVyLT5kcml2ZXIpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZjZHJpdmVyLT5kcml2ZXIpOwogfQpAQCAtNDQ5LDcgKzQzNyw3IEBACiAJaWYgKGNkZXYtPmRldi5kcml2ZXJfZGF0YSkgewogCQlnZGV2ID0gKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKiljZGV2LT5kZXYuZHJpdmVyX2RhdGE7CiAJCWlmIChnZXRfZGV2aWNlKCZnZGV2LT5kZXYpKSB7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJmdkZXYtPmRldi5ub2RlKSkKKwkJCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZnZGV2LT5kZXYua25vZGVfYnVzKSkKIAkJCQlyZXR1cm4gZ2RldjsKIAkJCXB1dF9kZXZpY2UoJmdkZXYtPmRldik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCmluZGV4IDFkOWIzZjEuLmVhODEzYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgZHJpdmVycy9zMzkwL2Npby9jaW8uYwogICogICBTLzM5MCBjb21tb24gSS9PIHJvdXRpbmVzIC0tIGxvdyBsZXZlbCBpL28gY2FsbHMKLSAqICAgJFJldmlzaW9uOiAxLjEzMyAkCisgKiAgICRSZXZpc2lvbjogMS4xMzQgJAogICoKICAqICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyIElCTSBEZXV0c2NobGFuZCBFbnR3aWNrbHVuZyBHbWJILAogICoJCQkgICAgICBJQk0gQ29ycG9yYXRpb24KQEAgLTYzLDE3ICs2MywxNyBAQAogc3RhdGljIGludCBfX2luaXQKIGNpb19kZWJ1Z19pbml0ICh2b2lkKQogewotCWNpb19kZWJ1Z19tc2dfaWQgPSBkZWJ1Z19yZWdpc3RlciAoImNpb19tc2ciLCA0LCA0LCAxNipzaXplb2YgKGxvbmcpKTsKKwljaW9fZGVidWdfbXNnX2lkID0gZGVidWdfcmVnaXN0ZXIgKCJjaW9fbXNnIiwgMTYsIDQsIDE2KnNpemVvZiAobG9uZykpOwogCWlmICghY2lvX2RlYnVnX21zZ19pZCkKIAkJZ290byBvdXRfdW5yZWdpc3RlcjsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3IChjaW9fZGVidWdfbXNnX2lkLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKIAlkZWJ1Z19zZXRfbGV2ZWwgKGNpb19kZWJ1Z19tc2dfaWQsIDIpOwotCWNpb19kZWJ1Z190cmFjZV9pZCA9IGRlYnVnX3JlZ2lzdGVyICgiY2lvX3RyYWNlIiwgNCwgNCwgOCk7CisJY2lvX2RlYnVnX3RyYWNlX2lkID0gZGVidWdfcmVnaXN0ZXIgKCJjaW9fdHJhY2UiLCAxNiwgNCwgOCk7CiAJaWYgKCFjaW9fZGVidWdfdHJhY2VfaWQpCiAJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAJZGVidWdfcmVnaXN0ZXJfdmlldyAoY2lvX2RlYnVnX3RyYWNlX2lkLCAmZGVidWdfaGV4X2FzY2lpX3ZpZXcpOwogCWRlYnVnX3NldF9sZXZlbCAoY2lvX2RlYnVnX3RyYWNlX2lkLCAyKTsKLQljaW9fZGVidWdfY3J3X2lkID0gZGVidWdfcmVnaXN0ZXIgKCJjaW9fY3J3IiwgMiwgNCwgMTYqc2l6ZW9mIChsb25nKSk7CisJY2lvX2RlYnVnX2Nyd19pZCA9IGRlYnVnX3JlZ2lzdGVyICgiY2lvX2NydyIsIDQsIDQsIDE2KnNpemVvZiAobG9uZykpOwogCWlmICghY2lvX2RlYnVnX2Nyd19pZCkKIAkJZ290byBvdXRfdW5yZWdpc3RlcjsKIAlkZWJ1Z19yZWdpc3Rlcl92aWV3IChjaW9fZGVidWdfY3J3X2lkLCAmZGVidWdfc3ByaW50Zl92aWV3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCmluZGV4IDg3YmQ3MGUuLjU1NTExOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuYwpAQCAtMTI4LDM0ICsxMjgsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50CitjaGVja19zdWJjaGFubmVsKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHZvaWQgKiBkYXRhKQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisJaW50IGlycSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisKKwlzY2ggPSB0b19zdWJjaGFubmVsKGRldik7CisJcmV0dXJuIChzY2gtPmlycSA9PSBpcnEpOworfQorCiBzdHJ1Y3Qgc3ViY2hhbm5lbCAqCiBnZXRfc3ViY2hhbm5lbF9ieV9zY2hpZChpbnQgaXJxKQogewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCi0JaWYgKCFnZXRfYnVzKCZjc3NfYnVzX3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlkb3duX3JlYWQoJmNzc19idXNfdHlwZS5zdWJzeXMucndzZW0pOwotCXNjaCA9IE5VTEw7Ci0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzc19idXNfdHlwZS5kZXZpY2VzLmxpc3QpIHsKLQkJZGV2ID0gZ2V0X2RldmljZShjb250YWluZXJfb2YoZW50cnksCi0JCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UsIGJ1c19saXN0KSk7Ci0JCWlmICghZGV2KQotCQkJY29udGludWU7Ci0JCXNjaCA9IHRvX3N1YmNoYW5uZWwoZGV2KTsKLQkJaWYgKHNjaC0+aXJxID09IGlycSkKLQkJCWJyZWFrOwotCQlwdXRfZGV2aWNlKGRldik7Ci0JCXNjaCA9IE5VTEw7Ci0JfQotCXVwX3JlYWQoJmNzc19idXNfdHlwZS5zdWJzeXMucndzZW0pOwotCXB1dF9idXMoJmNzc19idXNfdHlwZSk7CisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZjc3NfYnVzX3R5cGUsIE5VTEwsCisJCQkgICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWlycSwgY2hlY2tfc3ViY2hhbm5lbCk7CiAKLQlyZXR1cm4gc2NoOworCXJldHVybiBkZXYgPyB0b19zdWJjaGFubmVsKGRldikgOiBOVUxMOwogfQogCisKIHN0YXRpYyBpbmxpbmUgaW50CiBjc3NfZ2V0X3N1YmNoYW5uZWxfc3RhdHVzKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGludCBzY2hpZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCmluZGV4IDgwOWUxMTAuLjE0Yzc2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwpAQCAtNTE0LDM2ICs1MTQsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdHJ1Y3QgbWF0Y2hfZGF0YSB7CisJdW5zaWduZWQgaW50ICBkZXZubzsKKwlzdHJ1Y3QgY2N3X2RldmljZSAqIHNpYmxpbmc7Cit9OworCitzdGF0aWMgaW50CittYXRjaF9kZXZubyhzdHJ1Y3QgZGV2aWNlICogZGV2LCB2b2lkICogZGF0YSkKK3sKKwlzdHJ1Y3QgbWF0Y2hfZGF0YSAqIGQgPSAoc3RydWN0IG1hdGNoX2RhdGEgKilkYXRhOworCXN0cnVjdCBjY3dfZGV2aWNlICogY2RldjsKKworCWNkZXYgPSB0b19jY3dkZXYoZGV2KTsKKwlpZiAoKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9ESVNDT05ORUNURUQpICYmCisJICAgIChjZGV2LT5wcml2YXRlLT5kZXZubyA9PSBkLT5kZXZubykgJiYKKwkgICAgKGNkZXYgIT0gZC0+c2libGluZykpIHsKKwkJY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPSBERVZfU1RBVEVfTk9UX09QRVI7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBjY3dfZGV2aWNlICoKIGdldF9kaXNjX2Njd2Rldl9ieV9kZXZubyh1bnNpZ25lZCBpbnQgZGV2bm8sIHN0cnVjdCBjY3dfZGV2aWNlICpzaWJsaW5nKQogewotCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWF0Y2hfZGF0YSBkYXRhID0geworCQkuZGV2bm8gID0gZGV2bm8sCisJCS5zaWJsaW5nID0gc2libGluZywKKwl9OwogCi0JaWYgKCFnZXRfYnVzKCZjY3dfYnVzX3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlkb3duX3JlYWQoJmNjd19idXNfdHlwZS5zdWJzeXMucndzZW0pOwotCWNkZXYgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2goZW50cnksICZjY3dfYnVzX3R5cGUuZGV2aWNlcy5saXN0KSB7Ci0JCWRldiA9IGdldF9kZXZpY2UoY29udGFpbmVyX29mKGVudHJ5LAotCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlLCBidXNfbGlzdCkpOwotCQlpZiAoIWRldikKLQkJCWNvbnRpbnVlOwotCQljZGV2ID0gdG9fY2N3ZGV2KGRldik7Ci0JCWlmICgoY2Rldi0+cHJpdmF0ZS0+c3RhdGUgPT0gREVWX1NUQVRFX0RJU0NPTk5FQ1RFRCkgJiYKLQkJICAgIChjZGV2LT5wcml2YXRlLT5kZXZubyA9PSBkZXZubykgJiYKLQkJICAgIChjZGV2ICE9IHNpYmxpbmcpKSB7Ci0JCQljZGV2LT5wcml2YXRlLT5zdGF0ZSA9IERFVl9TVEFURV9OT1RfT1BFUjsKLQkJCWJyZWFrOwotCQl9Ci0JCXB1dF9kZXZpY2UoZGV2KTsKLQkJY2RldiA9IE5VTEw7Ci0JfQotCXVwX3JlYWQoJmNjd19idXNfdHlwZS5zdWJzeXMucndzZW0pOwotCXB1dF9idXMoJmNjd19idXNfdHlwZSk7CisJZGV2ID0gYnVzX2ZpbmRfZGV2aWNlKCZjc3NfYnVzX3R5cGUsIE5VTEwsICZkYXRhLCBtYXRjaF9kZXZubyk7CiAKLQlyZXR1cm4gY2RldjsKKwlyZXR1cm4gZGV2ID8gdG9fY2N3ZGV2KGRldikgOiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNjQ3LDcgKzY1MCw3IEBACiAJY2RldiA9IChzdHJ1Y3QgY2N3X2RldmljZSAqKSBkYXRhOwogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CiAKLQlpZiAoIWxpc3RfZW1wdHkoJnNjaC0+ZGV2LmNoaWxkcmVuKSkgeworCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZjZGV2LT5kZXYua25vZGVfcGFyZW50KSkgewogCQlidXNfcmVzY2FuX2RldmljZXMoJmNjd19idXNfdHlwZSk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEwMTksMzAgKzEwMjIsMjkgQEAKIC8qCiAgKiBnZXQgY2N3X2RldmljZSBtYXRjaGluZyB0aGUgYnVzaWQsIGJ1dCBvbmx5IGlmIG93bmVkIGJ5IGNkcnYKICAqLworc3RhdGljIGludAorX19jY3dkZXZfY2hlY2tfYnVzaWQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICppZCkKK3sKKwljaGFyICpidXNfaWQ7CisKKwlidXNfaWQgPSAoY2hhciAqKWlkOworCisJcmV0dXJuIChzdHJuY21wKGJ1c19pZCwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKSA9PSAwKTsKK30KKworCiBzdHJ1Y3QgY2N3X2RldmljZSAqCiBnZXRfY2N3ZGV2X2J5X2J1c2lkKHN0cnVjdCBjY3dfZHJpdmVyICpjZHJ2LCBjb25zdCBjaGFyICpidXNfaWQpCiB7Ci0Jc3RydWN0IGRldmljZSAqZCwgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKIAogCWRydiA9IGdldF9kcml2ZXIoJmNkcnYtPmRyaXZlcik7CiAJaWYgKCFkcnYpCi0JCXJldHVybiAwOworCQlyZXR1cm4gTlVMTDsKIAotCWRvd25fcmVhZCgmZHJ2LT5idXMtPnN1YnN5cy5yd3NlbSk7Ci0KLQlkZXYgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmRydi0+ZGV2aWNlcywgZHJpdmVyX2xpc3QpIHsKLQkJZGV2ID0gZ2V0X2RldmljZShkKTsKLQotCQlpZiAoZGV2ICYmICFzdHJuY21wKGJ1c19pZCwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKSkKLQkJCWJyZWFrOwotCQllbHNlIGlmIChkZXYpIHsKLQkJCXB1dF9kZXZpY2UoZGV2KTsKLQkJCWRldiA9IE5VTEw7Ci0JCX0KLQl9Ci0JdXBfcmVhZCgmZHJ2LT5idXMtPnN1YnN5cy5yd3NlbSk7CisJZGV2ID0gZHJpdmVyX2ZpbmRfZGV2aWNlKGRydiwgTlVMTCwgKHZvaWQgKilidXNfaWQsCisJCQkJIF9fY2N3ZGV2X2NoZWNrX2J1c2lkKTsKIAlwdXRfZHJpdmVyKGRydik7CiAKIAlyZXR1cm4gZGV2ID8gdG9fY2N3ZGV2KGRldikgOiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwppbmRleCBiYmU5ZjQ1Li44MjE5NGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uYwpAQCAtNTYsNyArNTYsNyBAQAogI2luY2x1ZGUgImlvYXNtLmgiCiAjaW5jbHVkZSAiY2hzYy5oIgogCi0jZGVmaW5lIFZFUlNJT05fUURJT19DICIkUmV2aXNpb246IDEuOTggJCIKKyNkZWZpbmUgVkVSU0lPTl9RRElPX0MgIiRSZXZpc2lvbjogMS4xMDEgJCIKIAogLyoqKioqKioqKioqKioqKioqKiBNT0RVTEUgUEFSQU1FVEVSIFZBUklBQkxFUyAqKioqKioqKioqKioqKioqKioqKi8KIE1PRFVMRV9BVVRIT1IoIlV0eiBCYWNoZXIgPHV0ei5iYWNoZXJAZGUuaWJtLmNvbT4iKTsKQEAgLTMzNDIsNyArMzM0Miw3IEBACiBxZGlvX3JlZ2lzdGVyX2RiZl92aWV3cyh2b2lkKQogewogCXFkaW9fZGJmX3NldHVwPWRlYnVnX3JlZ2lzdGVyKFFESU9fREJGX1NFVFVQX05BTUUsCi0JCQkJICAgICAgUURJT19EQkZfU0VUVVBfSU5ERVgsCisJCQkJICAgICAgUURJT19EQkZfU0VUVVBfUEFHRVMsCiAJCQkJICAgICAgUURJT19EQkZfU0VUVVBfTlJfQVJFQVMsCiAJCQkJICAgICAgUURJT19EQkZfU0VUVVBfTEVOKTsKIAlpZiAoIXFkaW9fZGJmX3NldHVwKQpAQCAtMzM1MSw3ICszMzUxLDcgQEAKIAlkZWJ1Z19zZXRfbGV2ZWwocWRpb19kYmZfc2V0dXAsUURJT19EQkZfU0VUVVBfTEVWRUwpOwogCiAJcWRpb19kYmZfc2JhbD1kZWJ1Z19yZWdpc3RlcihRRElPX0RCRl9TQkFMX05BTUUsCi0JCQkJICAgICBRRElPX0RCRl9TQkFMX0lOREVYLAorCQkJCSAgICAgUURJT19EQkZfU0JBTF9QQUdFUywKIAkJCQkgICAgIFFESU9fREJGX1NCQUxfTlJfQVJFQVMsCiAJCQkJICAgICBRRElPX0RCRl9TQkFMX0xFTik7CiAJaWYgKCFxZGlvX2RiZl9zYmFsKQpAQCAtMzM2MSw3ICszMzYxLDcgQEAKIAlkZWJ1Z19zZXRfbGV2ZWwocWRpb19kYmZfc2JhbCxRRElPX0RCRl9TQkFMX0xFVkVMKTsKIAogCXFkaW9fZGJmX3NlbnNlPWRlYnVnX3JlZ2lzdGVyKFFESU9fREJGX1NFTlNFX05BTUUsCi0JCQkJICAgICAgUURJT19EQkZfU0VOU0VfSU5ERVgsCisJCQkJICAgICAgUURJT19EQkZfU0VOU0VfUEFHRVMsCiAJCQkJICAgICAgUURJT19EQkZfU0VOU0VfTlJfQVJFQVMsCiAJCQkJICAgICAgUURJT19EQkZfU0VOU0VfTEVOKTsKIAlpZiAoIXFkaW9fZGJmX3NlbnNlKQpAQCAtMzM3MSw3ICszMzcxLDcgQEAKIAlkZWJ1Z19zZXRfbGV2ZWwocWRpb19kYmZfc2Vuc2UsUURJT19EQkZfU0VOU0VfTEVWRUwpOwogCiAJcWRpb19kYmZfdHJhY2U9ZGVidWdfcmVnaXN0ZXIoUURJT19EQkZfVFJBQ0VfTkFNRSwKLQkJCQkgICAgICBRRElPX0RCRl9UUkFDRV9JTkRFWCwKKwkJCQkgICAgICBRRElPX0RCRl9UUkFDRV9QQUdFUywKIAkJCQkgICAgICBRRElPX0RCRl9UUkFDRV9OUl9BUkVBUywKIAkJCQkgICAgICBRRElPX0RCRl9UUkFDRV9MRU4pOwogCWlmICghcWRpb19kYmZfdHJhY2UpCkBAIC0zMzgyLDcgKzMzODIsNyBAQAogCiAjaWZkZWYgQ09ORklHX1FESU9fREVCVUcKICAgICAgICAgcWRpb19kYmZfc2xzYl9vdXQ9ZGVidWdfcmVnaXN0ZXIoUURJT19EQkZfU0xTQl9PVVRfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUURJT19EQkZfU0xTQl9PVVRfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFESU9fREJGX1NMU0JfT1VUX1BBR0VTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRElPX0RCRl9TTFNCX09VVF9OUl9BUkVBUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUURJT19EQkZfU0xTQl9PVVRfTEVOKTsKICAgICAgICAgaWYgKCFxZGlvX2RiZl9zbHNiX291dCkKQEAgLTMzOTEsNyArMzM5MSw3IEBACiAgICAgICAgIGRlYnVnX3NldF9sZXZlbChxZGlvX2RiZl9zbHNiX291dCxRRElPX0RCRl9TTFNCX09VVF9MRVZFTCk7CiAKICAgICAgICAgcWRpb19kYmZfc2xzYl9pbj1kZWJ1Z19yZWdpc3RlcihRRElPX0RCRl9TTFNCX0lOX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUURJT19EQkZfU0xTQl9JTl9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRElPX0RCRl9TTFNCX0lOX1BBR0VTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFESU9fREJGX1NMU0JfSU5fTlJfQVJFQVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUURJT19EQkZfU0xTQl9JTl9MRU4pOwogICAgICAgICBpZiAoIXFkaW9fZGJmX3Nsc2JfaW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCmluZGV4IGI2ZGFhZGEuLjZiOGFhNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAotI2RlZmluZSBWRVJTSU9OX0NJT19RRElPX0ggIiRSZXZpc2lvbjogMS4zMiAkIgorI2RlZmluZSBWRVJTSU9OX0NJT19RRElPX0ggIiRSZXZpc2lvbjogMS4zMyAkIgogCiAjaWZkZWYgQ09ORklHX1FESU9fREVCVUcKICNkZWZpbmUgUURJT19WRVJCT1NFX0xFVkVMIDkKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAjZGVmaW5lIFFESU9fREJGX1NFVFVQX05BTUUgInFkaW9fc2V0dXAiCiAjZGVmaW5lIFFESU9fREJGX1NFVFVQX0xFTiA4Ci0jZGVmaW5lIFFESU9fREJGX1NFVFVQX0lOREVYIDIKKyNkZWZpbmUgUURJT19EQkZfU0VUVVBfUEFHRVMgNAogI2RlZmluZSBRRElPX0RCRl9TRVRVUF9OUl9BUkVBUyAxCiAjaWZkZWYgQ09ORklHX1FESU9fREVCVUcKICNkZWZpbmUgUURJT19EQkZfU0VUVVBfTEVWRUwgNgpAQCAtMTQyLDcgKzE0Miw3IEBACiAKICNkZWZpbmUgUURJT19EQkZfU0JBTF9OQU1FICJxZGlvX2xhYnMiIC8qIHNiYWwgKi8KICNkZWZpbmUgUURJT19EQkZfU0JBTF9MRU4gMjU2Ci0jZGVmaW5lIFFESU9fREJGX1NCQUxfSU5ERVggMgorI2RlZmluZSBRRElPX0RCRl9TQkFMX1BBR0VTIDQKICNkZWZpbmUgUURJT19EQkZfU0JBTF9OUl9BUkVBUyAyCiAjaWZkZWYgQ09ORklHX1FESU9fREVCVUcKICNkZWZpbmUgUURJT19EQkZfU0JBTF9MRVZFTCA2CkBAIC0xNTQsMTYgKzE1NCwxNiBAQAogI2RlZmluZSBRRElPX0RCRl9UUkFDRV9MRU4gOAogI2RlZmluZSBRRElPX0RCRl9UUkFDRV9OUl9BUkVBUyAyCiAjaWZkZWYgQ09ORklHX1FESU9fREVCVUcKLSNkZWZpbmUgUURJT19EQkZfVFJBQ0VfSU5ERVggNAorI2RlZmluZSBRRElPX0RCRl9UUkFDRV9QQUdFUyAxNgogI2RlZmluZSBRRElPX0RCRl9UUkFDRV9MRVZFTCA0IC8qIC0tLS0tLS0tIGNvdWxkIGJlIGV2ZW4gbW9yZSB2ZXJib3NlIGhlcmUgKi8KICNlbHNlIC8qIENPTkZJR19RRElPX0RFQlVHICovCi0jZGVmaW5lIFFESU9fREJGX1RSQUNFX0lOREVYIDIKKyNkZWZpbmUgUURJT19EQkZfVFJBQ0VfUEFHRVMgNAogI2RlZmluZSBRRElPX0RCRl9UUkFDRV9MRVZFTCAyCiAjZW5kaWYgLyogQ09ORklHX1FESU9fREVCVUcgKi8KIAogI2RlZmluZSBRRElPX0RCRl9TRU5TRV9OQU1FICJxZGlvX3NlbnNlIgogI2RlZmluZSBRRElPX0RCRl9TRU5TRV9MRU4gNjQKLSNkZWZpbmUgUURJT19EQkZfU0VOU0VfSU5ERVggMQorI2RlZmluZSBRRElPX0RCRl9TRU5TRV9QQUdFUyAyCiAjZGVmaW5lIFFESU9fREJGX1NFTlNFX05SX0FSRUFTIDEKICNpZmRlZiBDT05GSUdfUURJT19ERUJVRwogI2RlZmluZSBRRElPX0RCRl9TRU5TRV9MRVZFTCA2CkBAIC0xNzYsMTMgKzE3NiwxMyBAQAogCiAjZGVmaW5lIFFESU9fREJGX1NMU0JfT1VUX05BTUUgInFkaW9fc2xzYl9vdXQiCiAjZGVmaW5lIFFESU9fREJGX1NMU0JfT1VUX0xFTiBRRElPX01BWF9CVUZGRVJTX1BFUl9RCi0jZGVmaW5lIFFESU9fREJGX1NMU0JfT1VUX0lOREVYIDgKKyNkZWZpbmUgUURJT19EQkZfU0xTQl9PVVRfUEFHRVMgMjU2CiAjZGVmaW5lIFFESU9fREJGX1NMU0JfT1VUX05SX0FSRUFTIDEKICNkZWZpbmUgUURJT19EQkZfU0xTQl9PVVRfTEVWRUwgNgogCiAjZGVmaW5lIFFESU9fREJGX1NMU0JfSU5fTkFNRSAicWRpb19zbHNiX2luIgogI2RlZmluZSBRRElPX0RCRl9TTFNCX0lOX0xFTiBRRElPX01BWF9CVUZGRVJTX1BFUl9RCi0jZGVmaW5lIFFESU9fREJGX1NMU0JfSU5fSU5ERVggOAorI2RlZmluZSBRRElPX0RCRl9TTFNCX0lOX1BBR0VTIDI1NgogI2RlZmluZSBRRElPX0RCRl9TTFNCX0lOX05SX0FSRUFTIDEKICNkZWZpbmUgUURJT19EQkZfU0xTQl9JTl9MRVZFTCA2CiAjZW5kaWYgLyogQ09ORklHX1FESU9fREVCVUcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jIGIvZHJpdmVycy9zMzkwL25ldC9jbGF3LmMKaW5kZXggYTk5OTI3ZDUuLjI0YzBhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCkBAIC0xNDYsOCArMTQ2LDggQEAKIHN0YXRpYyBpbnQKIGNsYXdfcmVnaXN0ZXJfZGVidWdfZmFjaWxpdHkodm9pZCkKIHsKLQljbGF3X2RiZl9zZXR1cCA9IGRlYnVnX3JlZ2lzdGVyKCJjbGF3X3NldHVwIiwgMSwgMSwgOCk7Ci0JY2xhd19kYmZfdHJhY2UgPSBkZWJ1Z19yZWdpc3RlcigiY2xhd190cmFjZSIsIDEsIDIsIDgpOworCWNsYXdfZGJmX3NldHVwID0gZGVidWdfcmVnaXN0ZXIoImNsYXdfc2V0dXAiLCAyLCAxLCA4KTsKKwljbGF3X2RiZl90cmFjZSA9IGRlYnVnX3JlZ2lzdGVyKCJjbGF3X3RyYWNlIiwgMiwgMiwgOCk7CiAJaWYgKGNsYXdfZGJmX3NldHVwID09IE5VTEwgfHwgY2xhd19kYmZfdHJhY2UgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZGVidWcgZmFjaWxpdHkuXG4iKTsKIAkJY2xhd191bnJlZ2lzdGVyX2RlYnVnX2ZhY2lsaXR5KCk7CkBAIC00MjgsNyArNDI4LDcgQEAKIAluZXdfc2tiID0gTlVMTDsJCS8qIGFzc3VtZSBubyBkaWNlICovCiAJcGt0X2NudCA9IDA7CiAJQ0xBV19EQkZfVEVYVCg0LHRyYWNlLCJQYWNrU0tCZSIpOwotCWlmIChza2JfcXVldWVfbGVuKCZwX2NoLT5jb2xsZWN0X3F1ZXVlKSA+IDApIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcF9jaC0+Y29sbGVjdF9xdWV1ZSkpIHsKIAkvKiBzb21lIGRhdGEgKi8KIAkJaGVsZF9za2IgPSBza2JfZGVxdWV1ZSgmcF9jaC0+Y29sbGVjdF9xdWV1ZSk7CiAJCWlmIChwX2Vudi0+cGFja2luZyAhPSBET19QQUNLRUQpCkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogCXByaXZwdHIgPSAoc3RydWN0IGNsYXdfcHJpdmJrICopIGRldi0+cHJpdjsKICAgICAgICAgY2xhd19mcmVlX3dydF9idWYoIGRldiApOwogCWlmICgocHJpdnB0ci0+d3JpdGVfZnJlZV9jb3VudCA+IDApICYmCi0JICAgIChza2JfcXVldWVfbGVuKCZwX2NoLT5jb2xsZWN0X3F1ZXVlKSA+IDApKSB7CisJICAgICFza2JfcXVldWVfZW1wdHkoJnBfY2gtPmNvbGxlY3RfcXVldWUpKSB7CiAJICAJcGtfc2tiID0gY2xhd19wYWNrX3NrYihwcml2cHRyKTsKIAkJd2hpbGUgKHBrX3NrYiAhPSBOVUxMKSB7CiAJCQlyYyA9IGNsYXdfaHdfdHgoIHBrX3NrYiwgZGV2LDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdGNkYnVnLmMgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y2RidWcuYwppbmRleCAyYzg2YmZhLi4wZTJhOGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y2RidWcuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y2RidWcuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKgotICogbGludXgvZHJpdmVycy9zMzkwL25ldC9jdGNkYnVnLmMgKCRSZXZpc2lvbjogMS40ICQpCisgKiBsaW51eC9kcml2ZXJzL3MzOTAvbmV0L2N0Y2RidWcuYyAoJFJldmlzaW9uOiAxLjYgJCkKICAqCiAgKiBDVEMgLyBFU0NPTiBuZXR3b3JrIGRyaXZlciAtIHMzOTAgZGJmIGV4cGxvaXQuCiAgKgpAQCAtOSw3ICs5LDcgQEAKICAqICAgIEF1dGhvcihzKTogT3JpZ2luYWwgQ29kZSB3cml0dGVuIGJ5CiAgKgkJCSAgUGV0ZXIgVGllZGVtYW5uIChwdGllZGVtQGRlLmlibS5jb20pCiAgKgotICogICAgJFJldmlzaW9uOiAxLjQgJAkgJERhdGU6IDIwMDQvMDgvMDQgMTA6MTE6NTkgJAorICogICAgJFJldmlzaW9uOiAxLjYgJAkgJERhdGU6IDIwMDUvMDUvMTEgMDg6MTA6MTcgJAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNTEsMTUgKzUxLDE1IEBACiBjdGNfcmVnaXN0ZXJfZGJmX3ZpZXdzKHZvaWQpCiB7CiAJY3RjX2RiZl9zZXR1cCA9IGRlYnVnX3JlZ2lzdGVyKENUQ19EQkZfU0VUVVBfTkFNRSwKLQkJCQkJQ1RDX0RCRl9TRVRVUF9JTkRFWCwKKwkJCQkJQ1RDX0RCRl9TRVRVUF9QQUdFUywKIAkJCQkJQ1RDX0RCRl9TRVRVUF9OUl9BUkVBUywKIAkJCQkJQ1RDX0RCRl9TRVRVUF9MRU4pOwogCWN0Y19kYmZfZGF0YSA9IGRlYnVnX3JlZ2lzdGVyKENUQ19EQkZfREFUQV9OQU1FLAotCQkJCSAgICAgICBDVENfREJGX0RBVEFfSU5ERVgsCisJCQkJICAgICAgIENUQ19EQkZfREFUQV9QQUdFUywKIAkJCQkgICAgICAgQ1RDX0RCRl9EQVRBX05SX0FSRUFTLAogCQkJCSAgICAgICBDVENfREJGX0RBVEFfTEVOKTsKIAljdGNfZGJmX3RyYWNlID0gZGVidWdfcmVnaXN0ZXIoQ1RDX0RCRl9UUkFDRV9OQU1FLAotCQkJCQlDVENfREJGX1RSQUNFX0lOREVYLAorCQkJCQlDVENfREJGX1RSQUNFX1BBR0VTLAogCQkJCQlDVENfREJGX1RSQUNFX05SX0FSRUFTLAogCQkJCQlDVENfREJGX1RSQUNFX0xFTik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvY3RjZGJ1Zy5oIGIvZHJpdmVycy9zMzkwL25ldC9jdGNkYnVnLmgKaW5kZXggN2ZlMmViZC4uN2Q2YWZhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9jdGNkYnVnLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9jdGNkYnVnLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICoKLSAqIGxpbnV4L2RyaXZlcnMvczM5MC9uZXQvY3RjZGJ1Zy5oICgkUmV2aXNpb246IDEuNSAkKQorICogbGludXgvZHJpdmVycy9zMzkwL25ldC9jdGNkYnVnLmggKCRSZXZpc2lvbjogMS42ICQpCiAgKgogICogQ1RDIC8gRVNDT04gbmV0d29yayBkcml2ZXIgLSBzMzkwIGRiZiBleHBsb2l0LgogICoKQEAgLTksNyArOSw3IEBACiAgKiAgICBBdXRob3Iocyk6IE9yaWdpbmFsIENvZGUgd3JpdHRlbiBieQogICoJCQkgIFBldGVyIFRpZWRlbWFubiAocHRpZWRlbUBkZS5pYm0uY29tKQogICoKLSAqICAgICRSZXZpc2lvbjogMS41ICQJICREYXRlOiAyMDA1LzAyLzI3IDE5OjQ2OjQ0ICQKKyAqICAgICRSZXZpc2lvbjogMS42ICQJICREYXRlOiAyMDA1LzA1LzExIDA4OjEwOjE3ICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTM1LDE5ICszNSwxOSBAQAogICovCiAjZGVmaW5lIENUQ19EQkZfU0VUVVBfTkFNRSAiY3RjX3NldHVwIgogI2RlZmluZSBDVENfREJGX1NFVFVQX0xFTiAxNgotI2RlZmluZSBDVENfREJGX1NFVFVQX0lOREVYIDMKKyNkZWZpbmUgQ1RDX0RCRl9TRVRVUF9QQUdFUyA4CiAjZGVmaW5lIENUQ19EQkZfU0VUVVBfTlJfQVJFQVMgMQogI2RlZmluZSBDVENfREJGX1NFVFVQX0xFVkVMIDMKIAogI2RlZmluZSBDVENfREJGX0RBVEFfTkFNRSAiY3RjX2RhdGEiCiAjZGVmaW5lIENUQ19EQkZfREFUQV9MRU4gMTI4Ci0jZGVmaW5lIENUQ19EQkZfREFUQV9JTkRFWCAzCisjZGVmaW5lIENUQ19EQkZfREFUQV9QQUdFUyA4CiAjZGVmaW5lIENUQ19EQkZfREFUQV9OUl9BUkVBUyAxCiAjZGVmaW5lIENUQ19EQkZfREFUQV9MRVZFTCAzCiAKICNkZWZpbmUgQ1RDX0RCRl9UUkFDRV9OQU1FICJjdGNfdHJhY2UiCiAjZGVmaW5lIENUQ19EQkZfVFJBQ0VfTEVOIDE2Ci0jZGVmaW5lIENUQ19EQkZfVFJBQ0VfSU5ERVggMgorI2RlZmluZSBDVENfREJGX1RSQUNFX1BBR0VTIDQKICNkZWZpbmUgQ1RDX0RCRl9UUkFDRV9OUl9BUkVBUyAyCiAjZGVmaW5lIENUQ19EQkZfVFJBQ0VfTEVWRUwgMwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y3R0eS5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGN0dHkuYwppbmRleCAzMDgwMzkzLi45NjhmMmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L2N0Y3R0eS5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvY3RjdHR5LmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCQkJCQlza2JfcXVldWVfaGVhZCgmaW5mby0+cnhfcXVldWUsIHNrYik7CiAJCQkJZWxzZSB7CiAJCQkJCWtmcmVlX3NrYihza2IpOwotCQkJCQlyZXQgPSBza2JfcXVldWVfbGVuKCZpbmZvLT5yeF9xdWV1ZSk7CisJCQkJCXJldCA9ICFza2JfcXVldWVfZW1wdHkoJmluZm8tPnJ4X3F1ZXVlKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTUzMCw3ICs1MzAsNyBAQAogCQl0b3RhbCArPSBjOwogCQljb3VudCAtPSBjOwogCX0KLQlpZiAoc2tiX3F1ZXVlX2xlbigmaW5mby0+dHhfcXVldWUpKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmluZm8tPnR4X3F1ZXVlKSkgewogCQlpbmZvLT5sc3IgJj0gflVBUlRfTFNSX1RFTVQ7CiAJCXRhc2tsZXRfc2NoZWR1bGUoJmluZm8tPnRhc2tsZXQpOwogCX0KQEAgLTU5NCw3ICs1OTQsNyBAQAogCQlyZXR1cm47CiAJaWYgKGN0Y190dHlfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAiY3RjX3R0eV9mbHVzaF9jaGFycyIpKQogCQlyZXR1cm47Ci0JaWYgKHR0eS0+c3RvcHBlZCB8fCB0dHktPmh3X3N0b3BwZWQgfHwgKCFza2JfcXVldWVfbGVuKCZpbmZvLT50eF9xdWV1ZSkpKQorCWlmICh0dHktPnN0b3BwZWQgfHwgdHR5LT5od19zdG9wcGVkIHx8IHNrYl9xdWV1ZV9lbXB0eSgmaW5mby0+dHhfcXVldWUpKQogCQlyZXR1cm47CiAJdGFza2xldF9zY2hlZHVsZSgmaW5mby0+dGFza2xldCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2l1Y3YuaCBiL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5oCmluZGV4IDE5ODMzMDIuLjBjNDY0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvaXVjdi5oCkBAIC0zNywxOSArMzcsMTkgQEAKICAqLwogI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9OQU1FICJpdWN2X3NldHVwIgogI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9MRU4gMzIKLSNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfSU5ERVggMQorI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9QQUdFUyAyCiAjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX05SX0FSRUFTIDEKICNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfTEVWRUwgMwogCiAjZGVmaW5lIElVQ1ZfREJGX0RBVEFfTkFNRSAiaXVjdl9kYXRhIgogI2RlZmluZSBJVUNWX0RCRl9EQVRBX0xFTiAxMjgKLSNkZWZpbmUgSVVDVl9EQkZfREFUQV9JTkRFWCAxCisjZGVmaW5lIElVQ1ZfREJGX0RBVEFfUEFHRVMgMgogI2RlZmluZSBJVUNWX0RCRl9EQVRBX05SX0FSRUFTIDEKICNkZWZpbmUgSVVDVl9EQkZfREFUQV9MRVZFTCAyCiAKICNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfTkFNRSAiaXVjdl90cmFjZSIKICNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfTEVOIDE2Ci0jZGVmaW5lIElVQ1ZfREJGX1RSQUNFX0lOREVYIDIKKyNkZWZpbmUgSVVDVl9EQkZfVFJBQ0VfUEFHRVMgNAogI2RlZmluZSBJVUNWX0RCRl9UUkFDRV9OUl9BUkVBUyAxCiAjZGVmaW5lIElVQ1ZfREJGX1RSQUNFX0xFVkVMIDMKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYyBiL2RyaXZlcnMvczM5MC9uZXQvbGNzLmMKaW5kZXggYWIwODYyNC4uNDZmMzRiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9sY3MuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2xjcy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKgkJCSAgRnJhbmsgUGF2bGljIChwYXZsaWNAZGUuaWJtLmNvbSkgYW5kCiAgKgkJIAkgIE1hcnRpbiBTY2h3aWRlZnNreSA8c2Nod2lkZWZza3lAZGUuaWJtLmNvbT4KICAqCi0gKiAgICAkUmV2aXNpb246IDEuOTggJAkgJERhdGU6IDIwMDUvMDQvMTggMTM6NDE6MjkgJAorICogICAgJFJldmlzaW9uOiAxLjk5ICQJICREYXRlOiAyMDA1LzA1LzExIDA4OjEwOjE3ICQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU5LDcgKzU5LDcgQEAKIC8qKgogICogaW5pdGlhbGl6YXRpb24gc3RyaW5nIGZvciBvdXRwdXQKICAqLwotI2RlZmluZSBWRVJTSU9OX0xDU19DICAiJFJldmlzaW9uOiAxLjk4ICQiCisjZGVmaW5lIFZFUlNJT05fTENTX0MgICIkUmV2aXNpb246IDEuOTkgJCIKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdIF9faW5pdGRhdGEgPSAiTENTIGRyaXZlciAoIlZFUlNJT05fTENTX0MgIi8iIFZFUlNJT05fTENTX0ggIikiOwogc3RhdGljIGNoYXIgZGVidWdfYnVmZmVyWzI1NV07CkBAIC05Myw4ICs5Myw4IEBACiBzdGF0aWMgaW50CiBsY3NfcmVnaXN0ZXJfZGVidWdfZmFjaWxpdHkodm9pZCkKIHsKLQlsY3NfZGJmX3NldHVwID0gZGVidWdfcmVnaXN0ZXIoImxjc19zZXR1cCIsIDEsIDEsIDgpOwotCWxjc19kYmZfdHJhY2UgPSBkZWJ1Z19yZWdpc3RlcigibGNzX3RyYWNlIiwgMSwgMiwgOCk7CisJbGNzX2RiZl9zZXR1cCA9IGRlYnVnX3JlZ2lzdGVyKCJsY3Nfc2V0dXAiLCAyLCAxLCA4KTsKKwlsY3NfZGJmX3RyYWNlID0gZGVidWdfcmVnaXN0ZXIoImxjc190cmFjZSIsIDIsIDIsIDgpOwogCWlmIChsY3NfZGJmX3NldHVwID09IE5VTEwgfHwgbGNzX2RiZl90cmFjZSA9PSBOVUxMKSB7CiAJCVBSSU5UX0VSUigiTm90IGVub3VnaCBtZW1vcnkgZm9yIGRlYnVnIGZhY2lsaXR5LlxuIik7CiAJCWxjc191bnJlZ2lzdGVyX2RlYnVnX2ZhY2lsaXR5KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCmluZGV4IDNmZDRmYjcuLjY5NDI1YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvbmV0aXVjdi5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogbmV0aXVjdi5jLHYgMS42MyAyMDA0LzA3LzI3IDEzOjM2OjA1IG1zY2h3aWRlIEV4cCAkCisgKiAkSWQ6IG5ldGl1Y3YuYyx2IDEuNjYgMjAwNS8wNS8xMSAwODoxMDoxNyBob2x6aGV1IEV4cCAkCiAgKgogICogSVVDViBuZXR3b3JrIGRyaXZlcgogICoKQEAgLTMwLDcgKzMwLDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqCi0gKiBSRUxFQVNFLVRBRzogSVVDViBuZXR3b3JrIGRyaXZlciAkUmV2aXNpb246IDEuNjMgJAorICogUkVMRUFTRS1UQUc6IElVQ1YgbmV0d29yayBkcml2ZXIgJFJldmlzaW9uOiAxLjY2ICQKICAqCiAgKi8KIAwKQEAgLTM5MSwxNSArMzkxLDE1IEBACiBpdWN2X3JlZ2lzdGVyX2RiZl92aWV3cyh2b2lkKQogewogCWl1Y3ZfZGJmX3NldHVwID0gZGVidWdfcmVnaXN0ZXIoSVVDVl9EQkZfU0VUVVBfTkFNRSwKLQkJCQkJSVVDVl9EQkZfU0VUVVBfSU5ERVgsCisJCQkJCUlVQ1ZfREJGX1NFVFVQX1BBR0VTLAogCQkJCQlJVUNWX0RCRl9TRVRVUF9OUl9BUkVBUywKIAkJCQkJSVVDVl9EQkZfU0VUVVBfTEVOKTsKIAlpdWN2X2RiZl9kYXRhID0gZGVidWdfcmVnaXN0ZXIoSVVDVl9EQkZfREFUQV9OQU1FLAotCQkJCSAgICAgICBJVUNWX0RCRl9EQVRBX0lOREVYLAorCQkJCSAgICAgICBJVUNWX0RCRl9EQVRBX1BBR0VTLAogCQkJCSAgICAgICBJVUNWX0RCRl9EQVRBX05SX0FSRUFTLAogCQkJCSAgICAgICBJVUNWX0RCRl9EQVRBX0xFTik7CiAJaXVjdl9kYmZfdHJhY2UgPSBkZWJ1Z19yZWdpc3RlcihJVUNWX0RCRl9UUkFDRV9OQU1FLAotCQkJCQlJVUNWX0RCRl9UUkFDRV9JTkRFWCwKKwkJCQkJSVVDVl9EQkZfVFJBQ0VfUEFHRVMsCiAJCQkJCUlVQ1ZfREJGX1RSQUNFX05SX0FSRUFTLAogCQkJCQlJVUNWX0RCRl9UUkFDRV9MRU4pOwogCkBAIC0yMDc2LDcgKzIwNzYsNyBAQAogc3RhdGljIHZvaWQKIG5ldGl1Y3ZfYmFubmVyKHZvaWQpCiB7Ci0JY2hhciB2YnVmW10gPSAiJFJldmlzaW9uOiAxLjYzICQiOworCWNoYXIgdmJ1ZltdID0gIiRSZXZpc2lvbjogMS42NiAkIjsKIAljaGFyICp2ZXJzaW9uID0gdmJ1ZjsKIAogCWlmICgodmVyc2lvbiA9IHN0cmNocih2ZXJzaW9uLCAnOicpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGguaAppbmRleCBhNzU1YjU3Li4wMDhlMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGguaAorKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGguaApAQCAtNDIsNDQgKzQyLDQ0IEBACiAgKi8KICNkZWZpbmUgUUVUSF9EQkZfU0VUVVBfTkFNRSAicWV0aF9zZXR1cCIKICNkZWZpbmUgUUVUSF9EQkZfU0VUVVBfTEVOIDgKLSNkZWZpbmUgUUVUSF9EQkZfU0VUVVBfSU5ERVggMworI2RlZmluZSBRRVRIX0RCRl9TRVRVUF9QQUdFUyA4CiAjZGVmaW5lIFFFVEhfREJGX1NFVFVQX05SX0FSRUFTIDEKICNkZWZpbmUgUUVUSF9EQkZfU0VUVVBfTEVWRUwgNQogCiAjZGVmaW5lIFFFVEhfREJGX01JU0NfTkFNRSAicWV0aF9taXNjIgogI2RlZmluZSBRRVRIX0RCRl9NSVNDX0xFTiAxMjgKLSNkZWZpbmUgUUVUSF9EQkZfTUlTQ19JTkRFWCAxCisjZGVmaW5lIFFFVEhfREJGX01JU0NfUEFHRVMgMgogI2RlZmluZSBRRVRIX0RCRl9NSVNDX05SX0FSRUFTIDEKICNkZWZpbmUgUUVUSF9EQkZfTUlTQ19MRVZFTCAyCiAKICNkZWZpbmUgUUVUSF9EQkZfREFUQV9OQU1FICJxZXRoX2RhdGEiCiAjZGVmaW5lIFFFVEhfREJGX0RBVEFfTEVOIDk2Ci0jZGVmaW5lIFFFVEhfREJGX0RBVEFfSU5ERVggMworI2RlZmluZSBRRVRIX0RCRl9EQVRBX1BBR0VTIDgKICNkZWZpbmUgUUVUSF9EQkZfREFUQV9OUl9BUkVBUyAxCiAjZGVmaW5lIFFFVEhfREJGX0RBVEFfTEVWRUwgMgogCiAjZGVmaW5lIFFFVEhfREJGX0NPTlRST0xfTkFNRSAicWV0aF9jb250cm9sIgogI2RlZmluZSBRRVRIX0RCRl9DT05UUk9MX0xFTiAyNTYKLSNkZWZpbmUgUUVUSF9EQkZfQ09OVFJPTF9JTkRFWCAzCisjZGVmaW5lIFFFVEhfREJGX0NPTlRST0xfUEFHRVMgOAogI2RlZmluZSBRRVRIX0RCRl9DT05UUk9MX05SX0FSRUFTIDIKICNkZWZpbmUgUUVUSF9EQkZfQ09OVFJPTF9MRVZFTCA1CiAKICNkZWZpbmUgUUVUSF9EQkZfVFJBQ0VfTkFNRSAicWV0aF90cmFjZSIKICNkZWZpbmUgUUVUSF9EQkZfVFJBQ0VfTEVOIDgKLSNkZWZpbmUgUUVUSF9EQkZfVFJBQ0VfSU5ERVggMgorI2RlZmluZSBRRVRIX0RCRl9UUkFDRV9QQUdFUyA0CiAjZGVmaW5lIFFFVEhfREJGX1RSQUNFX05SX0FSRUFTIDIKICNkZWZpbmUgUUVUSF9EQkZfVFJBQ0VfTEVWRUwgMwogZXh0ZXJuIGRlYnVnX2luZm9fdCAqcWV0aF9kYmZfdHJhY2U7CiAKICNkZWZpbmUgUUVUSF9EQkZfU0VOU0VfTkFNRSAicWV0aF9zZW5zZSIKICNkZWZpbmUgUUVUSF9EQkZfU0VOU0VfTEVOIDY0Ci0jZGVmaW5lIFFFVEhfREJGX1NFTlNFX0lOREVYIDEKKyNkZWZpbmUgUUVUSF9EQkZfU0VOU0VfUEFHRVMgMgogI2RlZmluZSBRRVRIX0RCRl9TRU5TRV9OUl9BUkVBUyAxCiAjZGVmaW5lIFFFVEhfREJGX1NFTlNFX0xFVkVMIDIKIAogI2RlZmluZSBRRVRIX0RCRl9RRVJSX05BTUUgInFldGhfcWVyciIKICNkZWZpbmUgUUVUSF9EQkZfUUVSUl9MRU4gOAotI2RlZmluZSBRRVRIX0RCRl9RRVJSX0lOREVYIDEKKyNkZWZpbmUgUUVUSF9EQkZfUUVSUl9QQUdFUyAyCiAjZGVmaW5lIFFFVEhfREJGX1FFUlJfTlJfQVJFQVMgMgogI2RlZmluZSBRRVRIX0RCRl9RRVJSX0xFVkVMIDIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKaW5kZXggMjA4MTI3YS4uOGY0ZDI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCkBAIC0yMjEwLDcgKzIyMTAsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0CitzdGF0aWMgaW5saW5lIF9fYmUxNgogcWV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZDsKQEAgLTc2MzksMzEgKzc2MzksMzEgQEAKIHFldGhfcmVnaXN0ZXJfZGJmX3ZpZXdzKHZvaWQpCiB7CiAJcWV0aF9kYmZfc2V0dXAgPSBkZWJ1Z19yZWdpc3RlcihRRVRIX0RCRl9TRVRVUF9OQU1FLAotCQkJCQlRRVRIX0RCRl9TRVRVUF9JTkRFWCwKKwkJCQkJUUVUSF9EQkZfU0VUVVBfUEFHRVMsCiAJCQkJCVFFVEhfREJGX1NFVFVQX05SX0FSRUFTLAogCQkJCQlRRVRIX0RCRl9TRVRVUF9MRU4pOwogCXFldGhfZGJmX21pc2MgPSBkZWJ1Z19yZWdpc3RlcihRRVRIX0RCRl9NSVNDX05BTUUsCi0JCQkJICAgICAgIFFFVEhfREJGX01JU0NfSU5ERVgsCisJCQkJICAgICAgIFFFVEhfREJGX01JU0NfUEFHRVMsCiAJCQkJICAgICAgIFFFVEhfREJGX01JU0NfTlJfQVJFQVMsCiAJCQkJICAgICAgIFFFVEhfREJGX01JU0NfTEVOKTsKIAlxZXRoX2RiZl9kYXRhID0gZGVidWdfcmVnaXN0ZXIoUUVUSF9EQkZfREFUQV9OQU1FLAotCQkJCSAgICAgICBRRVRIX0RCRl9EQVRBX0lOREVYLAorCQkJCSAgICAgICBRRVRIX0RCRl9EQVRBX1BBR0VTLAogCQkJCSAgICAgICBRRVRIX0RCRl9EQVRBX05SX0FSRUFTLAogCQkJCSAgICAgICBRRVRIX0RCRl9EQVRBX0xFTik7CiAJcWV0aF9kYmZfY29udHJvbCA9IGRlYnVnX3JlZ2lzdGVyKFFFVEhfREJGX0NPTlRST0xfTkFNRSwKLQkJCQkJICBRRVRIX0RCRl9DT05UUk9MX0lOREVYLAorCQkJCQkgIFFFVEhfREJGX0NPTlRST0xfUEFHRVMsCiAJCQkJCSAgUUVUSF9EQkZfQ09OVFJPTF9OUl9BUkVBUywKIAkJCQkJICBRRVRIX0RCRl9DT05UUk9MX0xFTik7CiAJcWV0aF9kYmZfc2Vuc2UgPSBkZWJ1Z19yZWdpc3RlcihRRVRIX0RCRl9TRU5TRV9OQU1FLAotCQkJCQlRRVRIX0RCRl9TRU5TRV9JTkRFWCwKKwkJCQkJUUVUSF9EQkZfU0VOU0VfUEFHRVMsCiAJCQkJCVFFVEhfREJGX1NFTlNFX05SX0FSRUFTLAogCQkJCQlRRVRIX0RCRl9TRU5TRV9MRU4pOwogCXFldGhfZGJmX3FlcnIgPSBkZWJ1Z19yZWdpc3RlcihRRVRIX0RCRl9RRVJSX05BTUUsCi0JCQkJICAgICAgIFFFVEhfREJGX1FFUlJfSU5ERVgsCisJCQkJICAgICAgIFFFVEhfREJGX1FFUlJfUEFHRVMsCiAJCQkJICAgICAgIFFFVEhfREJGX1FFUlJfTlJfQVJFQVMsCiAJCQkJICAgICAgIFFFVEhfREJGX1FFUlJfTEVOKTsKIAlxZXRoX2RiZl90cmFjZSA9IGRlYnVnX3JlZ2lzdGVyKFFFVEhfREJGX1RSQUNFX05BTUUsCi0JCQkJCVFFVEhfREJGX1RSQUNFX0lOREVYLAorCQkJCQlRRVRIX0RCRl9UUkFDRV9QQUdFUywKIAkJCQkJUUVUSF9EQkZfVFJBQ0VfTlJfQVJFQVMsCiAJCQkJCVFFVEhfREJGX1RSQUNFX0xFTik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYyBiL2RyaXZlcnMvczM5MC9uZXQvc21zZ2l1Y3YuYwppbmRleCAxZTNmN2YzLi5kNjQ2OWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3Ntc2dpdWN2LmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9zbXNnaXVjdi5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIHNtc2dfZXhpdCh2b2lkKQogewogCWlmIChzbXNnX2hhbmRsZSA+IDApIHsKLQkJY3BjbWQoIlNFVCBTTVNHIE9GRiIsIDAsIDApOworCQljcGNtZCgiU0VUIFNNU0cgT0ZGIiwgTlVMTCwgMCwgTlVMTCk7CiAJCWl1Y3Zfc2V2ZXIoc21zZ19wYXRoaWQsIDApOwogCQlpdWN2X3VucmVnaXN0ZXJfcHJvZ3JhbShzbXNnX2hhbmRsZSk7CiAJCWRyaXZlcl91bnJlZ2lzdGVyKCZzbXNnX2RyaXZlcik7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJc21zZ19oYW5kbGUgPSAwOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JY3BjbWQoIlNFVCBTTVNHIElVQ1YiLCAwLCAwKTsKKwljcGNtZCgiU0VUIFNNU0cgSVVDViIsIE5VTEwsIDAsIE5VTEwpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvczM5MG1hY2guYyBiL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCmluZGV4IGZmYTk5NmMuLjViYjI1NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCisrKyBiL2RyaXZlcnMvczM5MC9zMzkwbWFjaC5jCkBAIC0zMSwxNCArMzEsMTQgQEAKIGV4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc2xvd19wYXRoX3dxOwogZXh0ZXJuIHN0cnVjdCB3b3JrX3N0cnVjdCBzbG93X3BhdGhfd29yazsKIAotc3RhdGljIHZvaWQKK3N0YXRpYyBOT1JFVF9UWVBFIHZvaWQKIHMzOTBfaGFuZGxlX2RhbWFnZShjaGFyICptc2cpCiB7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIiVzXG4iLCBtc2cpOwogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfc2VuZF9zdG9wKCk7CiAjZW5kaWYKIAlkaXNhYmxlZF93YWl0KCh1bnNpZ25lZCBsb25nKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCWZvcig7Oyk7CiB9CiAKIC8qCkBAIC0xMjIsNDAgKzEyMiwzOSBAQAogCXJldHVybiAwOwogfQogCitzdHJ1Y3QgbWNja19zdHJ1Y3QgeworCWludCBraWxsX3Rhc2s7CisJaW50IGNoYW5uZWxfcmVwb3J0OworCWludCB3YXJuaW5nOworCXVuc2lnbmVkIGxvbmcgbG9uZyBtY2NrX2NvZGU7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG1jY2tfc3RydWN0LCBjcHVfbWNjayk7CisKIC8qCi0gKiBtYWNoaW5lIGNoZWNrIGhhbmRsZXIuCisgKiBNYWluIG1hY2hpbmUgY2hlY2sgaGFuZGxlciBmdW5jdGlvbi4gV2lsbCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQKKyAqIG9yIGRpc2FibGVkIGFuZCBtYWNoaW5lIGNoZWNrcyBlbmFibGVkIG9yIGRpc2FibGVkLgogICovCiB2b2lkCi1zMzkwX2RvX21hY2hpbmVfY2hlY2sodm9pZCkKK3MzOTBfaGFuZGxlX21jY2sodm9pZCkKIHsKLQlzdHJ1Y3QgbWNpICptY2k7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWNja19zdHJ1Y3QgbWNjazsKIAotCW1jaSA9IChzdHJ1Y3QgbWNpICopICZTMzkwX2xvd2NvcmUubWNja19pbnRlcnJ1cHRpb25fY29kZTsKKwkvKgorCSAqIERpc2FibGUgbWFjaGluZSBjaGVja3MgYW5kIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhY2N1bXVsYXRlZAorCSAqIG1hY2hpbmUgY2hlY2tzLiBBZnRlcndhcmRzIGRlbGV0ZSB0aGUgb2xkIHN0YXRlIGFuZCBlbmFibGUgbWFjaGluZQorCSAqIGNoZWNrcyBhZ2Fpbi4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfbWNja19kaXNhYmxlKCk7CisJbWNjayA9IF9fZ2V0X2NwdV92YXIoY3B1X21jY2spOworCW1lbXNldCgmX19nZXRfY3B1X3ZhcihjcHVfbWNjayksIDAsIHNpemVvZihzdHJ1Y3QgbWNja19zdHJ1Y3QpKTsKKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfTUNDS19QRU5ESU5HKTsKKwlsb2NhbF9tY2NrX2VuYWJsZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCWlmIChtY2ktPnNkKQkJLyogc3lzdGVtIGRhbWFnZSAqLwotCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInJlY2VpdmVkIHN5c3RlbSBkYW1hZ2UgbWFjaGluZSBjaGVja1xuIik7Ci0KLQlpZiAobWNpLT5wZCkJCS8qIGluc3RydWN0aW9uIHByb2Nlc3NpbmcgZGFtYWdlICovCi0JCXMzOTBfaGFuZGxlX2RhbWFnZSgicmVjZWl2ZWQgaW5zdHJ1Y3Rpb24gcHJvY2Vzc2luZyAiCi0JCQkJICAgImRhbWFnZSBtYWNoaW5lIGNoZWNrXG4iKTsKLQotCWlmIChtY2ktPnNlKQkJLyogc3RvcmFnZSBlcnJvciB1bmNvcnJlY3RlZCAqLwotCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInJlY2VpdmVkIHN0b3JhZ2UgZXJyb3IgdW5jb3JyZWN0ZWQgIgotCQkJCSAgICJtYWNoaW5lIGNoZWNrXG4iKTsKLQotCWlmIChtY2ktPnNjKQkJLyogc3RvcmFnZSBlcnJvciBjb3JyZWN0ZWQgKi8KLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgInJlY2VpdmVkIHN0b3JhZ2UgZXJyb3IgY29ycmVjdGVkIG1hY2hpbmUgY2hlY2tcbiIpOwotCi0JaWYgKG1jaS0+a2UpCQkvKiBzdG9yYWdlIGtleS1lcnJvciB1bmNvcnJlY3RlZCAqLwotCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInJlY2VpdmVkIHN0b3JhZ2Uga2V5LWVycm9yIHVuY29ycmVjdGVkICIKLQkJCQkgICAibWFjaGluZSBjaGVja1xuIik7Ci0KLQlpZiAobWNpLT5kcyAmJiBtY2ktPmZhKQkvKiBzdG9yYWdlIGRlZ3JhZGF0aW9uICovCi0JCXMzOTBfaGFuZGxlX2RhbWFnZSgicmVjZWl2ZWQgc3RvcmFnZSBkZWdyYWRhdGlvbiBtYWNoaW5lICIKLQkJCQkgICAiY2hlY2tcbiIpOwotCi0JaWYgKG1jaS0+Y3ApCQkvKiBjaGFubmVsIHJlcG9ydCB3b3JkIHBlbmRpbmcgKi8KKwlpZiAobWNjay5jaGFubmVsX3JlcG9ydCkKIAkJdXAoJm1fc2VtKTsKIAogI2lmZGVmIENPTkZJR19NQUNIQ0hLX1dBUk5JTkcKQEAgLTE2OCw3ICsxNjcsNyBAQAogICogT24gVk0gd2Ugb25seSBnZXQgb25lIGludGVycnVwdCBwZXIgdmlydGFsbHkgcHJlc2VudGVkIG1hY2hpbmVjaGVjay4KICAqIFRob3VnaCBvbmUgc3VmZmljZXMsIHdlIG1heSBnZXQgb25lIGludGVycnVwdCBwZXIgKHZpcnR1YWwpIHByb2Nlc3Nvci4KICAqLwotCWlmIChtY2ktPncpIHsJLyogV0FSTklORyBwZW5kaW5nID8gKi8KKwlpZiAobWNjay53YXJuaW5nKSB7CS8qIFdBUk5JTkcgcGVuZGluZyA/ICovCiAJCXN0YXRpYyBpbnQgbWNoY2hrX3duZ19wb3N0ZWQgPSAwOwogCQkvKgogCQkgKiBVc2Ugc2luZ2xlIG1hY2hpbmUgY2xlYXIsIGFzIHdlIGNhbm5vdCBoYW5kbGUgc21wIHJpZ2h0IG5vdwpAQCAtMTc4LDYgKzE3NywyNjEgQEAKIAkJCWtpbGxfcHJvYygxLCBTSUdQV1IsIDEpOwogCX0KICNlbmRpZgorCisJaWYgKG1jY2sua2lsbF90YXNrKSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIm1jY2s6IFRlcm1pbmF0aW5nIHRhc2sgYmVjYXVzZSBvZiBtYWNoaW5lICIKKwkJICAgICAgICJtYWxmdW5jdGlvbiAoY29kZSAweCUwMTZsbHgpLlxuIiwgbWNjay5tY2NrX2NvZGUpOworCQlwcmludGsoS0VSTl9FTUVSRyAibWNjazogdGFzazogJXMsIHBpZDogJWQuXG4iLAorCQkgICAgICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKKwkJZG9fZXhpdChTSUdTRUdWKTsKKwl9Cit9CisKKy8qCisgKiByZXR1cm5zIDAgaWYgYWxsIHJlZ2lzdGVycyBjb3VsZCBiZSB2YWxpZGF0ZWQKKyAqIHJldHVybnMgMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludAorczM5MF9yZXZhbGlkYXRlX3JlZ2lzdGVycyhzdHJ1Y3QgbWNpICptY2kpCit7CisJaW50IGtpbGxfdGFzazsKKwl1NjQgdG1wY2xvY2s7CisJdTY0IHplcm87CisJdm9pZCAqZnB0X3NhdmVfYXJlYSwgKmZwdF9jcmVnX3NhdmVfYXJlYTsKKworCWtpbGxfdGFzayA9IDA7CisJemVybyA9IDA7CisJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLworCWlmICghbWNpLT5ncikKKwkJLyoKKwkJICogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBjb3VsZG4ndCBiZSByZXN0b3JlZCBhbmQgaGF2ZQorCQkgKiB1bmtub3duIGNvbnRlbnRzLiBQcm9jZXNzIG5lZWRzIHRvIGJlIHRlcm1pbmF0ZWQuCisJCSAqLworCQlraWxsX3Rhc2sgPSAxOworCisJLyogUmV2YWxpZGF0ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKwlpZiAoIW1jaS0+ZnApCisJCS8qCisJCSAqIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBjYW4ndCBiZSByZXN0b3JlZCBhbmQKKwkJICogdGhlcmVmb3JlIHRoZSBwcm9jZXNzIG5lZWRzIHRvIGJlIHRlcm1pbmF0ZWQuCisJCSAqLworCQlraWxsX3Rhc2sgPSAxOworCisjaWZuZGVmIF9fczM5MHhfXworCWFzbSB2b2xhdGlsZSgibGQgMCwwKCUwKVxuIgorCQkgICAgICJsZCAyLDgoJTApXG4iCisJCSAgICAgImxkIDQsMTYoJTApXG4iCisJCSAgICAgImxkIDYsMjQoJTApIgorCQkgICAgIDogOiAiYSIgKCZTMzkwX2xvd2NvcmUuZmxvYXRpbmdfcHRfc2F2ZV9hcmVhKSk7CisjZW5kaWYKKworCWlmIChNQUNISU5FX0hBU19JRUVFKSB7CisjaWZkZWYgX19zMzkweF9fCisJCWZwdF9zYXZlX2FyZWEgPSAmUzM5MF9sb3djb3JlLmZsb2F0aW5nX3B0X3NhdmVfYXJlYTsKKwkJZnB0X2NyZWdfc2F2ZV9hcmVhID0gJlMzOTBfbG93Y29yZS5mcHRfY3JlZ19zYXZlX2FyZWE7CisjZWxzZQorCQlmcHRfc2F2ZV9hcmVhID0gKHZvaWQgKikgUzM5MF9sb3djb3JlLmV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyOworCQlmcHRfY3JlZ19zYXZlX2FyZWEgPSBmcHRfc2F2ZV9hcmVhKzEyODsKKyNlbmRpZgorCQkvKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovCisJCWlmICghbWNpLT5mYykgeworCQkJLyoKKwkJCSAqIEZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXIgY2FuJ3QgYmUgcmVzdG9yZWQuCisJCQkgKiBUYXNrIHdpbGwgYmUgdGVybWluYXRlZC4KKwkJCSAqLworCQkJYXNtIHZvbGF0aWxlICgibGZwYyAwKCUwKSIgOiA6ICJhIiAoJnplcm8pKTsKKwkJCWtpbGxfdGFzayA9IDE7CisKKwkJfQorCQllbHNlCisJCQlhc20gdm9sYXRpbGUgKAorCQkJCSJsZnBjIDAoJTApIgorCQkJCTogOiAiYSIgKGZwdF9jcmVnX3NhdmVfYXJlYSkpOworCisJCWFzbSB2b2xhdGlsZSgibGQgIDAsMCglMClcbiIKKwkJCSAgICAgImxkICAxLDgoJTApXG4iCisJCQkgICAgICJsZCAgMiwxNiglMClcbiIKKwkJCSAgICAgImxkICAzLDI0KCUwKVxuIgorCQkJICAgICAibGQgIDQsMzIoJTApXG4iCisJCQkgICAgICJsZCAgNSw0MCglMClcbiIKKwkJCSAgICAgImxkICA2LDQ4KCUwKVxuIgorCQkJICAgICAibGQgIDcsNTYoJTApXG4iCisJCQkgICAgICJsZCAgOCw2NCglMClcbiIKKwkJCSAgICAgImxkICA5LDcyKCUwKVxuIgorCQkJICAgICAibGQgMTAsODAoJTApXG4iCisJCQkgICAgICJsZCAxMSw4OCglMClcbiIKKwkJCSAgICAgImxkIDEyLDk2KCUwKVxuIgorCQkJICAgICAibGQgMTMsMTA0KCUwKVxuIgorCQkJICAgICAibGQgMTQsMTEyKCUwKVxuIgorCQkJICAgICAibGQgMTUsMTIwKCUwKVxuIgorCQkJICAgICA6IDogImEiIChmcHRfc2F2ZV9hcmVhKSk7CisJfQorCisJLyogUmV2YWxpZGF0ZSBhY2Nlc3MgcmVnaXN0ZXJzICovCisJYXNtIHZvbGF0aWxlKCJsYW0gMCwxNSwwKCUwKSIKKwkJICAgICA6IDogImEiICgmUzM5MF9sb3djb3JlLmFjY2Vzc19yZWdzX3NhdmVfYXJlYSkpOworCWlmICghbWNpLT5hcikKKwkJLyoKKwkJICogQWNjZXNzIHJlZ2lzdGVycyBoYXZlIHVua25vd24gY29udGVudHMuCisJCSAqIFRlcm1pbmF0aW5nIHRhc2suCisJCSAqLworCQlraWxsX3Rhc2sgPSAxOworCisJLyogUmV2YWxpZGF0ZSBjb250cm9sIHJlZ2lzdGVycyAqLworCWlmICghbWNpLT5jcikKKwkJLyoKKwkJICogQ29udHJvbCByZWdpc3RlcnMgaGF2ZSB1bmtub3duIGNvbnRlbnRzLgorCQkgKiBDYW4ndCByZWNvdmVyIGFuZCB0aGVyZWZvcmUgc3RvcHBpbmcgbWFjaGluZS4KKwkJICovCisJCXMzOTBfaGFuZGxlX2RhbWFnZSgiaW52YWxpZCBjb250cm9sIHJlZ2lzdGVycy4iKTsKKwllbHNlCisjaWZkZWYgX19zMzkweF9fCisJCWFzbSB2b2xhdGlsZSgibGN0bGcgMCwxNSwwKCUwKSIKKwkJCSAgICAgOiA6ICJhIiAoJlMzOTBfbG93Y29yZS5jcmVnc19zYXZlX2FyZWEpKTsKKyNlbHNlCisJCWFzbSB2b2xhdGlsZSgibGN0bCAwLDE1LDAoJTApIgorCQkJICAgICA6IDogImEiICgmUzM5MF9sb3djb3JlLmNyZWdzX3NhdmVfYXJlYSkpOworI2VuZGlmCisKKwkvKgorCSAqIFdlIGRvbid0IGV2ZW4gdHJ5IHRvIHJldmFsaWRhdGUgdGhlIFRPRCByZWdpc3Rlciwgc2luY2Ugd2Ugc2ltcGx5CisJICogY2FuJ3Qgd3JpdGUgc29tZXRoaW5nIHNlbnNpYmxlIGludG8gdGhhdCByZWdpc3Rlci4KKwkgKi8KKworI2lmZGVmIF9fczM5MHhfXworCS8qCisJICogU2VlIGlmIHdlIGNhbiByZXZhbGlkYXRlIHRoZSBUT0QgcHJvZ3JhbW1hYmxlIHJlZ2lzdGVyIHdpdGggaXRzCisJICogb2xkIGNvbnRlbnRzIChzaG91bGQgYmUgemVybykgb3RoZXJ3aXNlIHNldCBpdCB0byB6ZXJvLgorCSAqLworCWlmICghbWNpLT5wcikKKwkJYXNtIHZvbGF0aWxlKCJzciAwLDBcbiIKKwkJCSAgICAgInNja3BmIgorCQkJICAgICA6IDogOiAiMCIsICJjYyIpOworCWVsc2UKKwkJYXNtIHZvbGF0aWxlKAorCQkJImwgMCwwKCUwKVxuIgorCQkJInNja3BmIgorCQkJOiA6ICJhIiAoJlMzOTBfbG93Y29yZS50b2RfcHJvZ3JlZ19zYXZlX2FyZWEpIDogIjAiLCAiY2MiKTsKKyNlbmRpZgorCisJLyogUmV2YWxpZGF0ZSBjbG9jayBjb21wYXJhdG9yIHJlZ2lzdGVyICovCisJYXNtIHZvbGF0aWxlICgic3RjayAwKCUxKVxuIgorCQkgICAgICAic2NrYyAwKCUxKSIKKwkJICAgICAgOiAiPW0iICh0bXBjbG9jaykgOiAiYSIgKCYodG1wY2xvY2spKSA6ICJjYyIsICJtZW1vcnkiKTsKKworCS8qIENoZWNrIGlmIG9sZCBQU1cgaXMgdmFsaWQgKi8KKwlpZiAoIW1jaS0+d3ApCisJCS8qCisJCSAqIENhbid0IHRlbGwgaWYgd2UgY29tZSBmcm9tIHVzZXIgb3Iga2VybmVsIG1vZGUKKwkJICogLT4gc3RvcHBpbmcgbWFjaGluZS4KKwkJICovCisJCXMzOTBfaGFuZGxlX2RhbWFnZSgib2xkIHBzdyBpbnZhbGlkLiIpOworCisJaWYgKCFtY2ktPm1zIHx8ICFtY2ktPnBtIHx8ICFtY2ktPmlhKQorCQlraWxsX3Rhc2sgPSAxOworCisJcmV0dXJuIGtpbGxfdGFzazsKK30KKworLyoKKyAqIG1hY2hpbmUgY2hlY2sgaGFuZGxlci4KKyAqLwordm9pZAorczM5MF9kb19tYWNoaW5lX2NoZWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBtY2kgKm1jaTsKKwlzdHJ1Y3QgbWNja19zdHJ1Y3QgKm1jY2s7CisJaW50IHVtb2RlOworCisJbWNpID0gKHN0cnVjdCBtY2kgKikgJlMzOTBfbG93Y29yZS5tY2NrX2ludGVycnVwdGlvbl9jb2RlOworCW1jY2sgPSAmX19nZXRfY3B1X3ZhcihjcHVfbWNjayk7CisJdW1vZGUgPSB1c2VyX21vZGUocmVncyk7CisKKwlpZiAobWNpLT5zZCkKKwkJLyogU3lzdGVtIGRhbWFnZSAtPiBzdG9wcGluZyBtYWNoaW5lICovCisJCXMzOTBfaGFuZGxlX2RhbWFnZSgicmVjZWl2ZWQgc3lzdGVtIGRhbWFnZSBtYWNoaW5lIGNoZWNrLiIpOworCisJaWYgKG1jaS0+cGQpIHsKKwkJaWYgKG1jaS0+YikgeworCQkJLyogUHJvY2Vzc2luZyBiYWNrdXAgLT4gdmVyaWZ5IGlmIHdlIGNhbiBzdXJ2aXZlIHRoaXMgKi8KKwkJCXU2NCB6X21jaWMsIG9fbWNpYywgdF9tY2ljOworI2lmZGVmIF9fczM5MHhfXworCQkJel9tY2ljID0gKDFVTEw8PDYzIHwgMVVMTDw8NTkgfCAxVUxMPDwyOSk7CisJCQlvX21jaWMgPSAoMVVMTDw8NDMgfCAxVUxMPDw0MiB8IDFVTEw8PDQxIHwgMVVMTDw8NDAgfAorCQkJCSAgMVVMTDw8MzYgfCAxVUxMPDwzNSB8IDFVTEw8PDM0IHwgMVVMTDw8MzIgfAorCQkJCSAgMVVMTDw8MzAgfCAxVUxMPDwyMSB8IDFVTEw8PDIwIHwgMVVMTDw8MTcgfAorCQkJCSAgMVVMTDw8MTYpOworI2Vsc2UKKwkJCXpfbWNpYyA9ICgxVUxMPDw2MyB8IDFVTEw8PDU5IHwgMVVMTDw8NTcgfCAxVUxMPDw1MCB8CisJCQkJICAxVUxMPDwyOSk7CisJCQlvX21jaWMgPSAoMVVMTDw8NDMgfCAxVUxMPDw0MiB8IDFVTEw8PDQxIHwgMVVMTDw8NDAgfAorCQkJCSAgMVVMTDw8MzYgfCAxVUxMPDwzNSB8IDFVTEw8PDM0IHwgMVVMTDw8MzIgfAorCQkJCSAgMVVMTDw8MzAgfCAxVUxMPDwyMCB8IDFVTEw8PDE3IHwgMVVMTDw8MTYpOworI2VuZGlmCisJCQl0X21jaWMgPSAqKHU2NCAqKW1jaTsKKworCQkJaWYgKCgodF9tY2ljICYgel9tY2ljKSAhPSAwKSB8fAorCQkJICAgICgodF9tY2ljICYgb19tY2ljKSAhPSBvX21jaWMpKSB7CisJCQkJczM5MF9oYW5kbGVfZGFtYWdlKCJwcm9jZXNzaW5nIGJhY2t1cCBtYWNoaW5lICIKKwkJCQkJCSAgICJjaGVjayB3aXRoIGRhbWFnZS4iKTsKKwkJCX0KKwkJCWlmICghdW1vZGUpCisJCQkJczM5MF9oYW5kbGVfZGFtYWdlKCJwcm9jZXNzaW5nIGJhY2t1cCBtYWNoaW5lICIKKwkJCQkJCSAgICJjaGVjayBpbiBrZXJuZWwgbW9kZS4iKTsKKwkJCW1jY2stPmtpbGxfdGFzayA9IDE7CisJCQltY2NrLT5tY2NrX2NvZGUgPSAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSBtY2k7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBQcm9jZXNzaW5nIGRhbWFnZSAtPiBzdG9wcGluZyBtYWNoaW5lICovCisJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInJlY2VpdmVkIGluc3RydWN0aW9uIHByb2Nlc3NpbmcgIgorCQkJCQkgICAiZGFtYWdlIG1hY2hpbmUgY2hlY2suIik7CisJCX0KKwl9CisJaWYgKHMzOTBfcmV2YWxpZGF0ZV9yZWdpc3RlcnMobWNpKSkgeworCQlpZiAodW1vZGUpIHsKKwkJCS8qCisJCQkgKiBDb3VsZG4ndCByZXN0b3JlIGFsbCByZWdpc3RlciBjb250ZW50cyB3aGlsZSBpbgorCQkJICogdXNlciBtb2RlIC0+IG1hcmsgdGFzayBmb3IgdGVybWluYXRpb24uCisJCQkgKi8KKwkJCW1jY2stPmtpbGxfdGFzayA9IDE7CisJCQltY2NrLT5tY2NrX2NvZGUgPSAqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSBtY2k7CisJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX01DQ0tfUEVORElORyk7CisJCX0KKwkJZWxzZQorCQkJLyoKKwkJCSAqIENvdWxkbid0IHJlc3RvcmUgYWxsIHJlZ2lzdGVyIGNvbnRlbnRzIHdoaWxlIGluCisJCQkgKiBrZXJuZWwgbW9kZSAtPiBzdG9wcGluZyBtYWNoaW5lLgorCQkJICovCisJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInVuYWJsZSB0byByZXZhbGlkYXRlIHJlZ2lzdGVycy4iKTsKKwl9CisKKwlpZiAobWNpLT5zZSkKKwkJLyogU3RvcmFnZSBlcnJvciB1bmNvcnJlY3RlZCAqLworCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInJlY2VpdmVkIHN0b3JhZ2UgZXJyb3IgdW5jb3JyZWN0ZWQgIgorCQkJCSAgICJtYWNoaW5lIGNoZWNrLiIpOworCisJaWYgKG1jaS0+a2UpCisJCS8qIFN0b3JhZ2Uga2V5LWVycm9yIHVuY29ycmVjdGVkICovCisJCXMzOTBfaGFuZGxlX2RhbWFnZSgicmVjZWl2ZWQgc3RvcmFnZSBrZXktZXJyb3IgdW5jb3JyZWN0ZWQgIgorCQkJCSAgICJtYWNoaW5lIGNoZWNrLiIpOworCisJaWYgKG1jaS0+ZHMgJiYgbWNpLT5mYSkKKwkJLyogU3RvcmFnZSBkZWdyYWRhdGlvbiAqLworCQlzMzkwX2hhbmRsZV9kYW1hZ2UoInJlY2VpdmVkIHN0b3JhZ2UgZGVncmFkYXRpb24gbWFjaGluZSAiCisJCQkJICAgImNoZWNrLiIpOworCisJaWYgKG1jaS0+Y3ApIHsKKwkJLyogQ2hhbm5lbCByZXBvcnQgd29yZCBwZW5kaW5nICovCisJCW1jY2stPmNoYW5uZWxfcmVwb3J0ID0gMTsKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl9NQ0NLX1BFTkRJTkcpOworCX0KKworCWlmIChtY2ktPncpIHsKKwkJLyogV2FybmluZyBwZW5kaW5nICovCisJCW1jY2stPndhcm5pbmcgPSAxOworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX01DQ0tfUEVORElORyk7CisJfQogfQogCiAvKgpAQCAtMTg5LDkgKzQ0Myw4IEBACiBtYWNoaW5lX2NoZWNrX2luaXQodm9pZCkKIHsKIAlpbml0X01VVEVYX0xPQ0tFRCgmbV9zZW0pOwotCWN0bF9jbGVhcl9iaXQoMTQsIDI1KTsJLyogZGlzYWJsZSBkYW1hZ2UgTUNIICovCi0JY3RsX3NldF9iaXQoMTQsIDI2KTsJLyogZW5hYmxlIGRlZ3JhZGF0aW9uIE1DSCAqLwotCWN0bF9zZXRfYml0KDE0LCAyNyk7CS8qIGVuYWJsZSBzeXN0ZW0gcmVjb3ZlcnkgTUNIICovCisJY3RsX2NsZWFyX2JpdCgxNCwgMjUpOwkvKiBkaXNhYmxlIGV4dGVybmFsIGRhbWFnZSBNQ0ggKi8KKwljdGxfc2V0X2JpdCgxNCwgMjcpOyAgICAvKiBlbmFibGUgc3lzdGVtIHJlY292ZXJ5IE1DSCAqLwogI2lmZGVmIENPTkZJR19NQUNIQ0hLX1dBUk5JTkcKIAljdGxfc2V0X2JpdCgxNCwgMjQpOwkvKiBlbmFibGUgd2FybmluZyBNQ0ggKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3MzOTBtYWNoLmggYi9kcml2ZXJzL3MzOTAvczM5MG1hY2guaAppbmRleCA3ZTI2ZjBmLi40ZWFhNzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvczM5MG1hY2guaAorKysgYi9kcml2ZXJzL3MzOTAvczM5MG1hY2guaApAQCAtMTYsMjAgKzE2LDQ1IEBACiAJX191MzIgICBzZCAgICAgICAgICAgICAgOiAgMTsgLyogMDAgc3lzdGVtIGRhbWFnZSAqLwogCV9fdTMyICAgcGQgICAgICAgICAgICAgIDogIDE7IC8qIDAxIGluc3RydWN0aW9uLXByb2Nlc3NpbmcgZGFtYWdlICovCiAJX191MzIgICBzciAgICAgICAgICAgICAgOiAgMTsgLyogMDIgc3lzdGVtIHJlY292ZXJ5ICovCi0JX191MzIgICB0b19iZV9kZWZpbmVkXzEgOiAgNDsgLyogMDMtMDYgKi8KKwlfX3UzMiAgIHRvX2JlX2RlZmluZWRfMSA6ICAxOyAvKiAwMyAqLworCV9fdTMyICAgY2QgICAgICAgICAgICAgIDogIDE7IC8qIDA0IHRpbWluZy1mYWNpbGl0eSBkYW1hZ2UgKi8KKwlfX3UzMiAgIGVkICAgICAgICAgICAgICA6ICAxOyAvKiAwNSBleHRlcm5hbCBkYW1hZ2UgKi8KKwlfX3UzMiAgIHRvX2JlX2RlZmluZWRfMiA6ICAxOyAvKiAwNiAqLwogCV9fdTMyICAgZGcgICAgICAgICAgICAgIDogIDE7IC8qIDA3IGRlZ3JhZGF0aW9uICovCiAJX191MzIgICB3ICAgICAgICAgICAgICAgOiAgMTsgLyogMDggd2FybmluZyBwZW5kaW5nICovCiAJX191MzIgICBjcCAgICAgICAgICAgICAgOiAgMTsgLyogMDkgY2hhbm5lbC1yZXBvcnQgcGVuZGluZyAqLwotCV9fdTMyICAgdG9fYmVfZGVmaW5lZF8yIDogIDY7IC8qIDEwLTE1ICovCisJX191MzIgICBzcCAgICAgICAgICAgICAgOiAgMTsgLyogMTAgc2VydmljZS1wcm9jZXNzb3IgZGFtYWdlICovCisJX191MzIgICBjayAgICAgICAgICAgICAgOiAgMTsgLyogMTEgY2hhbm5lbC1zdWJzeXN0ZW0gZGFtYWdlICovCisJX191MzIgICB0b19iZV9kZWZpbmVkXzMgOiAgMjsgLyogMTItMTMgKi8KKwlfX3UzMiAgIGIgICAgICAgICAgICAgICA6ICAxOyAvKiAxNCBiYWNrZWQgdXAgKi8KKwlfX3UzMiAgIHRvX2JlX2RlZmluZWRfNCA6ICAxOyAvKiAxNSAqLwogCV9fdTMyICAgc2UgICAgICAgICAgICAgIDogIDE7IC8qIDE2IHN0b3JhZ2UgZXJyb3IgdW5jb3JyZWN0ZWQgKi8KIAlfX3UzMiAgIHNjICAgICAgICAgICAgICA6ICAxOyAvKiAxNyBzdG9yYWdlIGVycm9yIGNvcnJlY3RlZCAqLwogCV9fdTMyICAga2UgICAgICAgICAgICAgIDogIDE7IC8qIDE4IHN0b3JhZ2Uta2V5IGVycm9yIHVuY29ycmVjdGVkICovCiAJX191MzIgICBkcyAgICAgICAgICAgICAgOiAgMTsgLyogMTkgc3RvcmFnZSBkZWdyYWRhdGlvbiAqLwotCV9fdTMyCXRvX2JlX2RlZmluZWRfMyA6ICA0OyAvKiAyMC0yMyAqLworCV9fdTMyICAgd3AgICAgICAgICAgICAgIDogIDE7IC8qIDIwIHBzdyBtd3AgdmFsaWRpdHkgKi8KKwlfX3UzMiAgIG1zICAgICAgICAgICAgICA6ICAxOyAvKiAyMSBwc3cgbWFzayBhbmQga2V5IHZhbGlkaXR5ICovCisJX191MzIgICBwbSAgICAgICAgICAgICAgOiAgMTsgLyogMjIgcHN3IHByb2dyYW0gbWFzayBhbmQgY2MgdmFsaWRpdHkgKi8KKwlfX3UzMiAgIGlhICAgICAgICAgICAgICA6ICAxOyAvKiAyMyBwc3cgaW5zdHJ1Y3Rpb24gYWRkcmVzcyB2YWxpZGl0eSAqLwogCV9fdTMyICAgZmEgICAgICAgICAgICAgIDogIDE7IC8qIDI0IGZhaWxpbmcgc3RvcmFnZSBhZGRyZXNzIHZhbGlkaXR5ICovCi0JX191MzIgICB0b19iZV9kZWZpbmVkXzQgOiAgNzsgLyogMjUtMzEgKi8KKwlfX3UzMiAgIHRvX2JlX2RlZmluZWRfNSA6ICAxOyAvKiAyNSAqLworCV9fdTMyICAgZWMgICAgICAgICAgICAgIDogIDE7IC8qIDI2IGV4dGVybmFsIGRhbWFnZSBjb2RlIHZhbGlkaXR5ICovCisJX191MzIgICBmcCAgICAgICAgICAgICAgOiAgMTsgLyogMjcgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgdmFsaWRpdHkgKi8KKwlfX3UzMiAgIGdyICAgICAgICAgICAgICA6ICAxOyAvKiAyOCBnZW5lcmFsIHJlZ2lzdGVyIHZhbGlkaXR5ICovCisJX191MzIgICBjciAgICAgICAgICAgICAgOiAgMTsgLyogMjkgY29udHJvbCByZWdpc3RlciB2YWxpZGl0eSAqLworCV9fdTMyICAgdG9fYmVfZGVmaW5lZF82IDogIDE7IC8qIDMwICovCisJX191MzIgICBzdCAgICAgICAgICAgICAgOiAgMTsgLyogMzEgc3RvcmFnZSBsb2dpY2FsIHZhbGlkaXR5ICovCiAJX191MzIgICBpZSAgICAgICAgICAgICAgOiAgMTsgLyogMzIgaW5kaXJlY3Qgc3RvcmFnZSBlcnJvciAqLwotCV9fdTMyCXRvX2JlX2RlZmluZWRfNSA6IDMxOyAvKiAzMy02MyAqLworCV9fdTMyICAgYXIgICAgICAgICAgICAgIDogIDE7IC8qIDMzIGFjY2VzcyByZWdpc3RlciB2YWxpZGl0eSAqLworCV9fdTMyICAgZGEgICAgICAgICAgICAgIDogIDE7IC8qIDM0IGRlbGF5ZWQgYWNjZXNzIGV4Y2VwdGlvbiAqLworCV9fdTMyICAgdG9fYmVfZGVmaW5lZF83IDogIDc7IC8qIDM1LTQxICovCisJX191MzIgICBwciAgICAgICAgICAgICAgOiAgMTsgLyogNDIgdG9kIHByb2dyYW1tYWJsZSByZWdpc3RlciB2YWxpZGl0eSAqLworCV9fdTMyICAgZmMgICAgICAgICAgICAgIDogIDE7IC8qIDQzIGZwIGNvbnRyb2wgcmVnaXN0ZXIgdmFsaWRpdHkgKi8KKwlfX3UzMiAgIGFwICAgICAgICAgICAgICA6ICAxOyAvKiA0NCBhbmNpbGxhcnkgcmVwb3J0ICovCisJX191MzIgICB0b19iZV9kZWZpbmVkXzggOiAgMTsgLyogNDUgKi8KKwlfX3UzMiAgIGN0ICAgICAgICAgICAgICA6ICAxOyAvKiA0NiBjcHUgdGltZXIgdmFsaWRpdHkgKi8KKwlfX3UzMiAgIGNjICAgICAgICAgICAgICA6ICAxOyAvKiA0NyBjbG9jayBjb21wYXJhdG9yIHZhbGlkaXR5ICovCisJX191MzIJdG9fYmVfZGVmaW5lZF85IDogMTY7IC8qIDQ3LTYzICovCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYnBwLmMgYi9kcml2ZXJzL3NidXMvY2hhci9icHAuYwppbmRleCA4ZjBmNDY5Li44NzMwMmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9icHAuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9icHAuYwpAQCAtNzksMTAgKzc5LDYgQEAKIAogICAgICAgdW5zaWduZWQgY2hhciBydW5fbGVuZ3RoOwogICAgICAgdW5zaWduZWQgY2hhciByZXBlYXRfYnl0ZTsKLQotICAgICAgLyogVGhlc2UgbWVtYmVycyBtYW5hZ2UgdGltZW91dHMgZm9yIHByb2dyYW1tZWQgZGVsYXlzICovCi0gICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOwotICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdGltZXJfbGlzdDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW5zdCBpbnN0YW5jZXNbQlBQX05PXTsKQEAgLTI5NywxNiArMjkzLDEwIEBACiAKICNlbmRpZiAvKiBfX3NwYXJjX18gKi8KIAotc3RhdGljIHZvaWQgYnBwX3dha2VfdXAodW5zaWduZWQgbG9uZyB2YWwpCi17IHdha2VfdXAoJmluc3RhbmNlc1t2YWxdLndhaXRfcXVldWUpOyB9Ci0KIHN0YXRpYyB2b2lkIHNub296ZSh1bnNpZ25lZCBsb25nIHNub296ZV90aW1lLCB1bnNpZ25lZCBtaW5vcikKIHsKLSAgICAgIGluaXRfdGltZXIoJmluc3RhbmNlc1ttaW5vcl0udGltZXJfbGlzdCk7Ci0gICAgICBpbnN0YW5jZXNbbWlub3JdLnRpbWVyX2xpc3QuZXhwaXJlcyA9IGppZmZpZXMgKyBzbm9vemVfdGltZSArIDE7Ci0gICAgICBpbnN0YW5jZXNbbWlub3JdLnRpbWVyX2xpc3QuZGF0YSAgICA9IG1pbm9yOwotICAgICAgYWRkX3RpbWVyKCZpbnN0YW5jZXNbbWlub3JdLnRpbWVyX2xpc3QpOwotICAgICAgc2xlZXBfb24gKCZpbnN0YW5jZXNbbWlub3JdLndhaXRfcXVldWUpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KHNub296ZV90aW1lICsgMSk7CiB9CiAKIHN0YXRpYyBpbnQgd2FpdF9mb3IodW5zaWduZWQgc2hvcnQgc2V0LCB1bnNpZ25lZCBzaG9ydCBjbHIsCkBAIC04ODAsMTEgKzg3MCw4IEBACiAgICAgICBpbnN0YW5jZXNbaWR4XS5lbmhhbmNlZCA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5kaXJlY3Rpb24gPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0ubW9kZSA9IENPTVBBVElCSUxJVFk7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS53YWl0X3F1ZXVlID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLnJ1bl9sZW5ndGggPSAwOwogICAgICAgaW5zdGFuY2VzW2lkeF0ucnVuX2ZsYWcgPSAwOwotICAgICAgaW5pdF90aW1lcigmaW5zdGFuY2VzW2lkeF0udGltZXJfbGlzdCk7Ci0gICAgICBpbnN0YW5jZXNbaWR4XS50aW1lcl9saXN0LmZ1bmN0aW9uID0gYnBwX3dha2VfdXA7CiAgICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKGxwQWRkciwzLCBkZXZfbmFtZSkpIHJldHVybjsKIAogICAgICAgLyoKQEAgLTk3NywxMSArOTY0LDggQEAKICAgICAgIGluc3RhbmNlc1tpZHhdLmVuaGFuY2VkID0gMDsKICAgICAgIGluc3RhbmNlc1tpZHhdLmRpcmVjdGlvbiA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5tb2RlID0gQ09NUEFUSUJJTElUWTsKLSAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmluc3RhbmNlc1tpZHhdLndhaXRfcXVldWUpOwogICAgICAgaW5zdGFuY2VzW2lkeF0ucnVuX2xlbmd0aCA9IDA7CiAgICAgICBpbnN0YW5jZXNbaWR4XS5ydW5fZmxhZyA9IDA7Ci0gICAgICBpbml0X3RpbWVyKCZpbnN0YW5jZXNbaWR4XS50aW1lcl9saXN0KTsKLSAgICAgIGluc3RhbmNlc1tpZHhdLnRpbWVyX2xpc3QuZnVuY3Rpb24gPSBicHBfd2FrZV91cDsKIAogICAgICAgaWYgKCFycCkgcmV0dXJuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jIGIvZHJpdmVycy9zY3NpLzN3LTl4eHguYwppbmRleCAzNGRiYzM3Li5iYzZlNDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3ctOXh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS8zdy05eHh4LmMKQEAgLTE5MTYsOSArMTkxNiw5IEBACiB9IC8qIEVuZCBfX3R3YV9zaHV0ZG93bigpICovCiAKIC8qIFdyYXBwZXIgZm9yIF9fdHdhX3NodXRkb3duICovCi1zdGF0aWMgdm9pZCB0d2Ffc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdHdhX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEodG9fcGNpX2RldihkZXYpKTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCVRXX0RldmljZV9FeHRlbnNpb24gKnR3X2RldiA9IChUV19EZXZpY2VfRXh0ZW5zaW9uICopaG9zdC0+aG9zdGRhdGE7CiAKIAlfX3R3YV9zaHV0ZG93bih0d19kZXYpOwpAQCAtMjE0MCw5ICsyMTQwLDcgQEAKIAkuaWRfdGFibGUJPSB0d2FfcGNpX3RibCwKIAkucHJvYmUJCT0gdHdhX3Byb2JlLAogCS5yZW1vdmUJCT0gdHdhX3JlbW92ZSwKLQkuZHJpdmVyCQk9IHsKLQkJLnNodXRkb3duID0gdHdhX3NodXRkb3duCi0JfQorCS5zaHV0ZG93bgk9IHR3YV9zaHV0ZG93bgogfTsKIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvM3cteHh4eC5jIGIvZHJpdmVycy9zY3NpLzN3LXh4eHguYwppbmRleCBiNmRjNTc2Li45NzNjNTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvM3cteHh4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS8zdy14eHh4LmMKQEAgLTIyNjQsOSArMjI2NCw5IEBACiB9IC8qIEVuZCBfX3R3X3NodXRkb3duKCkgKi8KIAogLyogV3JhcHBlciBmb3IgX190d19zaHV0ZG93biAqLwotc3RhdGljIHZvaWQgdHdfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgdHdfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJVFdfRGV2aWNlX0V4dGVuc2lvbiAqdHdfZGV2ID0gKFRXX0RldmljZV9FeHRlbnNpb24gKilob3N0LT5ob3N0ZGF0YTsKIAogCV9fdHdfc2h1dGRvd24odHdfZGV2KTsKQEAgLTI0NTEsOSArMjQ1MSw3IEBACiAJLmlkX3RhYmxlCT0gdHdfcGNpX3RibCwKIAkucHJvYmUJCT0gdHdfcHJvYmUsCiAJLnJlbW92ZQkJPSB0d19yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5zaHV0ZG93biA9IHR3X3NodXRkb3duCi0JfQorCS5zaHV0ZG93bgk9IHR3X3NodXRkb3duLAogfTsKIAogLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZHJpdmVyIGluaXRpYWxpemF0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbWN0cmwuYwppbmRleCAxZmVmOTJkLi4zOTBjZDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tY3RybC5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1jdHJsLmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JdXNlcl9zcmJjbWQgPSBrbWFsbG9jKEdGUF9LRVJORUwsIGZpYnNpemUpOworCXVzZXJfc3JiY21kID0ga21hbGxvYyhmaWJzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzZXJfc3JiY21kKSB7CiAJCWRwcmludGsoKEtFUk5fREVCVUciYWFjcmFpZDogQ291bGQgbm90IG1ha2UgYSBjb3B5IG9mIHRoZSBzcmJcbiIpKTsKIAkJcmNvZGUgPSAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoY2kuYyBiL2RyaXZlcnMvc2NzaS9haGNpLmMKaW5kZXggOWE1NDdjYS4uYzU2MjM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FoY2kuYworKysgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCkBAIC0zMDQsMjYgKzMwNCwxOSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFwLT5ob3N0X3NldC0+ZGV2OwogCXN0cnVjdCBhaGNpX2hvc3RfcHJpdiAqaHByaXYgPSBhcC0+aG9zdF9zZXQtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwOwotCWludCByYzsKIAl2b2lkICptZW0sICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CiAJdm9pZCAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwogCWRtYV9hZGRyX3QgbWVtX2RtYTsKIAotCXJjID0gYXRhX3BvcnRfc3RhcnQoYXApOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCiAJcHAgPSBrbWFsbG9jKHNpemVvZigqcHApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBwKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KKwlpZiAoIXBwKQorCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQocHAsIDAsIHNpemVvZigqcHApKTsKIAogCW1lbSA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIEFIQ0lfUE9SVF9QUklWX0RNQV9TWiwgJm1lbV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghbWVtKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0X2tmcmVlOworCQlrZnJlZShwcCk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1zZXQobWVtLCAwLCBBSENJX1BPUlRfUFJJVl9ETUFfU1opOwogCkBAIC0zNzMsMTIgKzM2Niw2IEBACiAJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOyAvKiBmbHVzaCAqLwogCiAJcmV0dXJuIDA7Ci0KLWVycl9vdXRfa2ZyZWU6Ci0Ja2ZyZWUocHApOwotZXJyX291dDoKLQlhdGFfcG9ydF9zdG9wKGFwKTsKLQlyZXR1cm4gcmM7CiB9CiAKIApAQCAtNDA0LDcgKzM5MSw2IEBACiAJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBBSENJX1BPUlRfUFJJVl9ETUFfU1osCiAJCQkgIHBwLT5jbWRfc2xvdCwgcHAtPmNtZF9zbG90X2RtYSk7CiAJa2ZyZWUocHApOwotCWF0YV9wb3J0X3N0b3AoYXApOwogfQogCiBzdGF0aWMgdTMyIGFoY2lfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWdfaW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHB0X2kyby5jIGIvZHJpdmVycy9zY3NpL2RwdF9pMm8uYwppbmRleCBhNjk5YzMwLi5iYmUzNDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZHB0X2kyby5jCisrKyBiL2RyaXZlcnMvc2NzaS9kcHRfaTJvLmMKQEAgLTM0LDcgKzM0LDYgQEAKIAogI2RlZmluZSBBRERSMzIgKDApCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkRlYW5uYSBCb25kcywgd2l0aCBfbG90c18gb2YgaGVscCBmcm9tIE1hcmsgU2FseXp5biIpOwpAQCAtMTgxMSw5ICsxODEwLDkgQEAKIAltZW1zZXQoJnNpLCAwLCBzaXplb2Yoc2kpKTsKIAogCXNpLm9zVHlwZSA9IE9TX0xJTlVYOwotCXNpLm9zTWFqb3JWZXJzaW9uID0gKHU4KSAoTElOVVhfVkVSU0lPTl9DT0RFID4+IDE2KTsKLQlzaS5vc01pbm9yVmVyc2lvbiA9ICh1OCkgKExJTlVYX1ZFUlNJT05fQ09ERSA+PiA4ICYgMHgwZmYpOwotCXNpLm9zUmV2aXNpb24gPSAgICAgKHU4KSAoTElOVVhfVkVSU0lPTl9DT0RFICYgMHgwZmYpOworCXNpLm9zTWFqb3JWZXJzaW9uID0gMDsKKwlzaS5vc01pbm9yVmVyc2lvbiA9IDA7CisJc2kub3NSZXZpc2lvbiA9IDA7CiAJc2kuYnVzVHlwZSA9IFNJX1BDSV9CVVM7CiAJc2kucHJvY2Vzc29yRmFtaWx5ID0gRFBUSV9zaWcuZHNQcm9jZXNzb3JGYW1pbHk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kcHRpLmggYi9kcml2ZXJzL3Njc2kvZHB0aS5oCmluZGV4IDk4MjE3ODMuLjQ4OTE5NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kcHRpLmgKKysrIGIvZHJpdmVycy9zY3NpL2RwdGkuaApAQCAtMjAsMTUgKzIwLDcgQEAKICNpZm5kZWYgX0RQVF9ICiAjZGVmaW5lIF9EUFRfSAogCi0jaWZuZGVmIExJTlVYX1ZFUlNJT05fQ09ERQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNlbmRpZgotCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDAwKQotI2RlZmluZSBNQVhfVE9fSU9QX01FU1NBR0VTICAgKDIxMCkKLSNlbHNlCiAjZGVmaW5lIE1BWF9UT19JT1BfTUVTU0FHRVMgICAoMjU1KQotI2VuZGlmCiAjZGVmaW5lIE1BWF9GUk9NX0lPUF9NRVNTQUdFUyAoMjU1KQogCiAKQEAgLTMyMSwxMCArMzEzLDYgQEAKIHN0YXRpYyB2b2lkIGFkcHRfZGVsYXkoaW50IG1pbGxpc2VjKTsKICNlbmRpZgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw0LDApCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYqIGFkcHRfcGNpX2ZpbmRfZGV2aWNlKHVpbnQgdmVuZG9yLCBzdHJ1Y3QgcGNpX2RldiogZnJvbSk7Ci0jZW5kaWYKLQogI2lmIGRlZmluZWQgX19pYTY0X18gCiBzdGF0aWMgdm9pZCBhZHB0X2lhNjRfaW5mbyhzeXNJbmZvX1MqIHNpKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hvc3RzLmMgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwppbmRleCBiYTM0NzU3Li5kN2EzOGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaG9zdHMuYworKysgYi9kcml2ZXJzL3Njc2kvaG9zdHMuYwpAQCAtNTYsNyArNTYsNyBAQAogICogQHNob3N0Oglwb2ludGVyIHRvIHN0cnVjdCBTY3NpX0hvc3QKICAqIHJlY292ZXJ5OglyZWNvdmVyeSByZXF1ZXN0ZWQgdG8gcnVuLgogICoqLwotdm9pZCBzY3NpX2hvc3RfY2FuY2VsKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgcmVjb3ZlcnkpCitzdGF0aWMgdm9pZCBzY3NpX2hvc3RfY2FuY2VsKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCBpbnQgcmVjb3ZlcnkpCiB7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW5pdGlvLmMgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmMKaW5kZXggZjdkZGM5Zi4uMjA5NGQ0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2luaXRpby5jCisrKyBiL2RyaXZlcnMvc2NzaS9pbml0aW8uYwpAQCAtMjIzLDcgKzIyMyw3IEBACiBzdGF0aWMgdm9pZCB0dWxfc2VsZWN0X2F0bjMoSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYik7CiBzdGF0aWMgdm9pZCB0dWxfc2VsZWN0X2F0bl9zdG9wKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpOwogc3RhdGljIGludCBpbnRfdHVsX2J1c2ZyZWUoSENTICogcEN1ckhjYik7Ci1pbnQgaW50X3R1bF9zY3NpX3JzdChIQ1MgKiBwQ3VySGNiKTsKK3N0YXRpYyBpbnQgaW50X3R1bF9zY3NpX3JzdChIQ1MgKiBwQ3VySGNiKTsKIHN0YXRpYyBpbnQgaW50X3R1bF9iYWRfc2VxKEhDUyAqIHBDdXJIY2IpOwogc3RhdGljIGludCBpbnRfdHVsX3Jlc2VsKEhDUyAqIHBDdXJIY2IpOwogc3RhdGljIGludCB0dWxfc3luY19kb25lKEhDUyAqIHBDdXJIY2IpOwpAQCAtMjQwLDkgKzI0MCw4IEBACiBzdGF0aWMgdm9pZCB0dWxfc2UyX3VwZGF0ZV9hbGwoV09SRCBDdXJCYXNlKTsJLyogc2V0dXAgZGVmYXVsdCBwYXR0ZXJuICovCiBzdGF0aWMgdm9pZCB0dWxfcmVhZF9lZXByb20oV09SRCBDdXJCYXNlKTsKIAotCQkJCS8qIC0tLS0gRVhURVJOQUwgVkFSSUFCTEVTIC0tLS0gKi8KLUhDUyB0dWxfaGNzW01BWF9TVVBQT1JURURfQURBUFRFUlNdOwogCQkJCS8qIC0tLS0gSU5URVJOQUwgVkFSSUFCTEVTIC0tLS0gKi8KK3N0YXRpYyBIQ1MgdHVsX2hjc1tNQVhfU1VQUE9SVEVEX0FEQVBURVJTXTsKIHN0YXRpYyBJTklfQURQVF9TVFJVQ1QgaTkxdV9hZHB0W01BWF9TVVBQT1JURURfQURBUFRFUlNdOwogCiAvKk5WUkFNIG52cmFtLCAqbnZyYW1wID0gJm52cmFtOyAqLwpAQCAtMzgxLDcgKzM4MCw3IEBACiAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0dWxfc2UyX2luc3RyKFdPUkQgQ3VyQmFzZSwgVUNIQVIgaW5zdHIpCitzdGF0aWMgdm9pZCB0dWxfc2UyX2luc3RyKFdPUkQgQ3VyQmFzZSwgVUNIQVIgaW5zdHIpCiB7CiAJaW50IGk7CiAJVUNIQVIgYjsKQEAgLTQzNyw3ICs0MzYsNyBAQAogCUlucHV0ICA6YWRkcmVzcyBvZiBTZXJpYWwgRTJQUk9NCiAJT3V0cHV0IDp2YWx1ZSBzdG9yZWQgaW4gIFNlcmlhbCBFMlBST00KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1VU0hPUlQgdHVsX3NlMl9yZChXT1JEIEN1ckJhc2UsIFVMT05HIGFkcikKK3N0YXRpYyBVU0hPUlQgdHVsX3NlMl9yZChXT1JEIEN1ckJhc2UsIFVMT05HIGFkcikKIHsKIAlVQ0hBUiBpbnN0ciwgcmVhZEJ5dGU7CiAJVVNIT1JUIHJlYWRXb3JkOwpAQCAtNDY4LDcgKzQ2Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgSW5wdXQ6IG5ldyB2YWx1ZSBpbiAgU2VyaWFsIEUyUFJPTSwgYWRkcmVzcyBvZiBTZXJpYWwgRTJQUk9NCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0dWxfc2UyX3dyKFdPUkQgQ3VyQmFzZSwgVUNIQVIgYWRyLCBVU0hPUlQgd3JpdGVXb3JkKQorc3RhdGljIHZvaWQgdHVsX3NlMl93cihXT1JEIEN1ckJhc2UsIFVDSEFSIGFkciwgVVNIT1JUIHdyaXRlV29yZCkKIHsKIAlVQ0hBUiByZWFkQnl0ZTsKIAlVQ0hBUiBpbnN0cjsKQEAgLTU4NCw4ICs1ODMsOCBAQAogCVRVTF9XUihDdXJCYXNlICsgVFVMX0dDVFJMLCBnY3RybCAmIH5UVUxfR0NUUkxfRUVQUk9NX0JJVCk7CiB9CQkJCS8qIHJlYWRfZWVwcm9tICovCiAKLWludCBBZGRpOTF1X2ludG9fQWRhcHRlcl90YWJsZShXT1JEIHdCSU9TLCBXT1JEIHdCQVNFLCBCWVRFIGJJbnRlcnJ1cHQsCi0JCQkgICAgICAgQllURSBiQnVzLCBCWVRFIGJEZXZpY2UpCitzdGF0aWMgaW50IEFkZGk5MXVfaW50b19BZGFwdGVyX3RhYmxlKFdPUkQgd0JJT1MsIFdPUkQgd0JBU0UsIEJZVEUgYkludGVycnVwdCwKKwkJCQkgICAgICBCWVRFIGJCdXMsIEJZVEUgYkRldmljZSkKIHsKIAlpbnQgaSwgajsKIApAQCAtNjE2LDcgKzYxNSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQgaW5pdF9pOTF1QWRhcHRlcl90YWJsZSh2b2lkKQorc3RhdGljIHZvaWQgaW5pdF9pOTF1QWRhcHRlcl90YWJsZSh2b2lkKQogewogCWludCBpOwogCkBAIC02MzAsNyArNjI5LDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgdHVsX3N0b3BfYm0oSENTICogcEN1ckhjYikKK3N0YXRpYyB2b2lkIHR1bF9zdG9wX2JtKEhDUyAqIHBDdXJIY2IpCiB7CiAKIAlpZiAoVFVMX1JEKHBDdXJIY2ItPkhDU19CYXNlLCBUVUxfWFN0YXR1cykgJiBYUEVORCkgewkvKiBpZiBETUEgeGZlciBpcyBwZW5kaW5nLCBhYm9ydCBETUEgeGZlciAqLwpAQCAtNjQyLDcgKzY0MSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGdldF90dWxpcFBDSUNvbmZpZyhIQ1MgKiBwQ3VySGNiLCBpbnQgY2hfaWR4KQorc3RhdGljIHZvaWQgZ2V0X3R1bGlwUENJQ29uZmlnKEhDUyAqIHBDdXJIY2IsIGludCBjaF9pZHgpCiB7CiAJcEN1ckhjYi0+SENTX0Jhc2UgPSBpOTF1X2FkcHRbY2hfaWR4XS5BRFBUX0JBU0U7CS8qIFN1cHBseSBiYXNlIGFkZHJlc3MgICovCiAJcEN1ckhjYi0+SENTX0JJT1MgPSBpOTF1X2FkcHRbY2hfaWR4XS5BRFBUX0JJT1M7CS8qIFN1cHBseSBCSU9TIGFkZHJlc3MgICovCkBAIC02NTEsNyArNjUwLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB0dWxfcmVzZXRfc2NzaShIQ1MgKiBwQ3VySGNiLCBpbnQgc2Vjb25kcykKK3N0YXRpYyBpbnQgdHVsX3Jlc2V0X3Njc2koSENTICogcEN1ckhjYiwgaW50IHNlY29uZHMpCiB7CiAJVFVMX1dSKHBDdXJIY2ItPkhDU19CYXNlICsgVFVMX1NDdHJsMCwgVFNDX1JTVF9CVVMpOwogCkBAIC02NzAsNyArNjY5LDggQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBpbml0X3R1bGlwKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHNjYnAsIGludCB0dWxfbnVtX3NjYiwgQllURSAqIHBiQmlvc0FkciwgaW50IHNlY29uZHMpCitzdGF0aWMgaW50IGluaXRfdHVsaXAoSENTICogcEN1ckhjYiwgU0NCICogc2NicCwgaW50IHR1bF9udW1fc2NiLAorCQkgICAgICBCWVRFICogcGJCaW9zQWRyLCBpbnQgc2Vjb25kcykKIHsKIAlpbnQgaTsKIAlCWVRFICpwd0ZsYWdzOwpAQCAtNzg4LDcgKzc4OCw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TQ0IgKnR1bF9hbGxvY19zY2IoSENTICogaGNzcCkKK3N0YXRpYyBTQ0IgKnR1bF9hbGxvY19zY2IoSENTICogaGNzcCkKIHsKIAlTQ0IgKnBUbXBTY2I7CiAJVUxPTkcgZmxhZ3M7CkBAIC04MDcsNyArODA3LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdHVsX3JlbGVhc2Vfc2NiKEhDUyAqIGhjc3AsIFNDQiAqIHNjYnApCitzdGF0aWMgdm9pZCB0dWxfcmVsZWFzZV9zY2IoSENTICogaGNzcCwgU0NCICogc2NicCkKIHsKIAlVTE9ORyBmbGFnczsKIApAQCAtODI5LDcgKzgyOSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHR1bF9hcHBlbmRfcGVuZF9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKK3N0YXRpYyB2b2lkIHR1bF9hcHBlbmRfcGVuZF9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKIHsKIAogI2lmIERFQlVHX1FVRVVFCkBAIC04NDcsNyArODQ3LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdHVsX3B1c2hfcGVuZF9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKK3N0YXRpYyB2b2lkIHR1bF9wdXNoX3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHNjYnApCiB7CiAKICNpZiBERUJVR19RVUVVRQpAQCAtODYzLDcgKzg2Myw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1TQ0IgKnR1bF9maW5kX2ZpcnN0X3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IpCitzdGF0aWMgU0NCICp0dWxfZmluZF9maXJzdF9wZW5kX3NjYihIQ1MgKiBwQ3VySGNiKQogewogCVNDQiAqcEZpcnN0UGVuZDsKIApAQCAtODk0LDI0ICs4OTQsNyBAQAogCXJldHVybiAocEZpcnN0UGVuZCk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotU0NCICp0dWxfcG9wX3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IpCi17Ci0JU0NCICpwVG1wU2NiOwotCi0JaWYgKChwVG1wU2NiID0gcEN1ckhjYi0+SENTX0ZpcnN0UGVuZCkgIT0gTlVMTCkgewotCQlpZiAoKHBDdXJIY2ItPkhDU19GaXJzdFBlbmQgPSBwVG1wU2NiLT5TQ0JfTnh0U2NiKSA9PSBOVUxMKQotCQkJcEN1ckhjYi0+SENTX0xhc3RQZW5kID0gTlVMTDsKLQkJcFRtcFNjYi0+U0NCX054dFNjYiA9IE5VTEw7Ci0JfQotI2lmIERFQlVHX1FVRVVFCi0JcHJpbnRrKCJQb3AgcGVuZCBTQ0IgJWx4OyAiLCAoVUxPTkcpIHBUbXBTY2IpOwotI2VuZGlmCi0JcmV0dXJuIChwVG1wU2NiKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCB0dWxfdW5saW5rX3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCitzdGF0aWMgdm9pZCB0dWxfdW5saW5rX3BlbmRfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCiB7CiAJU0NCICpwVG1wU2NiLCAqcFByZXZTY2I7CiAKQEAgLTkzOSw3ICs5MjIsNyBAQAogCXJldHVybjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHR1bF9hcHBlbmRfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKK3N0YXRpYyB2b2lkIHR1bF9hcHBlbmRfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgU0NCICogc2NicCkKIHsKIAogI2lmIERFQlVHX1FVRVVFCkBAIC05NjEsNyArOTQ0LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVNDQiAqdHVsX3BvcF9idXN5X3NjYihIQ1MgKiBwQ3VySGNiKQorc3RhdGljIFNDQiAqdHVsX3BvcF9idXN5X3NjYihIQ1MgKiBwQ3VySGNiKQogewogCVNDQiAqcFRtcFNjYjsKIApAQCAtOTgyLDcgKzk2NSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHR1bF91bmxpbmtfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYikKK3N0YXRpYyB2b2lkIHR1bF91bmxpbmtfYnVzeV9zY2IoSENTICogcEN1ckhjYiwgU0NCICogcEN1clNjYikKIHsKIAlTQ0IgKnBUbXBTY2IsICpwUHJldlNjYjsKIApAQCAtMTAzNyw3ICsxMDIwLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgdHVsX2FwcGVuZF9kb25lX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBzY2JwKQorc3RhdGljIHZvaWQgdHVsX2FwcGVuZF9kb25lX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBzY2JwKQogewogCiAjaWYgREVCVUdfUVVFVUUKQEAgLTEwNzMsNyArMTA1Niw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgdHVsX2Fib3J0X3NyYihIQ1MgKiBwQ3VySGNiLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmJwKQorc3RhdGljIGludCB0dWxfYWJvcnRfc3JiKEhDUyAqIHBDdXJIY2IsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYnApCiB7CiAJVUxPTkcgZmxhZ3M7CiAJU0NCICpwVG1wU2NiLCAqcFByZXZTY2I7CkBAIC0xMTYzLDcgKzExNDYsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IHR1bF9iYWRfc2VxKEhDUyAqIHBDdXJIY2IpCitzdGF0aWMgaW50IHR1bF9iYWRfc2VxKEhDUyAqIHBDdXJIY2IpCiB7CiAJU0NCICpwQ3VyU2NiOwogCkBAIC0xMTgyLDkgKzExNjUsMTEgQEAKIAlyZXR1cm4gKHR1bF9wb3N0X3Njc2lfcnN0KHBDdXJIY2IpKTsKIH0KIAorI2lmIDAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCB0dWxfZGV2aWNlX3Jlc2V0KEhDUyAqIHBDdXJIY2IsIHN0cnVjdCBzY3NpX2NtbmQgKnBTcmIsCi0JCXVuc2lnbmVkIGludCB0YXJnZXQsIHVuc2lnbmVkIGludCBSZXNldEZsYWdzKQorc3RhdGljIGludCB0dWxfZGV2aWNlX3Jlc2V0KEhDUyAqIHBDdXJIY2IsIHN0cnVjdCBzY3NpX2NtbmQgKnBTcmIsCisJCQkgICAgdW5zaWduZWQgaW50IHRhcmdldCwgdW5zaWduZWQgaW50IFJlc2V0RmxhZ3MpCiB7CiAJVUxPTkcgZmxhZ3M7CiAJU0NCICpwU2NiOwpAQCAtMTI1NSw3ICsxMjQwLDcgQEAKIAlyZXR1cm4gU0NTSV9SRVNFVF9QRU5ESU5HOwogfQogCi1pbnQgdHVsX3Jlc2V0X3Njc2lfYnVzKEhDUyAqIHBDdXJIY2IpCitzdGF0aWMgaW50IHR1bF9yZXNldF9zY3NpX2J1cyhIQ1MgKiBwQ3VySGNiKQogewogCVVMT05HIGZsYWdzOwogCkBAIC0xMjg0LDggKzEyNjksMTAgQEAKIAlyZXR1cm4gKFNDU0lfUkVTRVRfU1VDQ0VTUyB8IFNDU0lfUkVTRVRfSE9TVF9SRVNFVCk7CiB9CiAKKyNlbmRpZiAgLyogIDAgICovCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIHR1bF9leGVjX3NjYihIQ1MgKiBwQ3VySGNiLCBTQ0IgKiBwQ3VyU2NiKQorc3RhdGljIHZvaWQgdHVsX2V4ZWNfc2NiKEhDUyAqIHBDdXJIY2IsIFNDQiAqIHBDdXJTY2IpCiB7CiAJVUxPTkcgZmxhZ3M7CiAKQEAgLTEzMTgsNyArMTMwNSw3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgdHVsX2lzcihIQ1MgKiBwQ3VySGNiKQorc3RhdGljIGludCB0dWxfaXNyKEhDUyAqIHBDdXJIY2IpCiB7CiAJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbiAgICAgICAqLwogCkBAIC0yMTA4LDcgKzIwOTUsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogc2NzaSBidXMgcmVzZXQgKi8KLWludCBpbnRfdHVsX3Njc2lfcnN0KEhDUyAqIHBDdXJIY2IpCitzdGF0aWMgaW50IGludF90dWxfc2NzaV9yc3QoSENTICogcEN1ckhjYikKIHsKIAlTQ0IgKnBDdXJTY2I7CiAJaW50IGk7CkBAIC0yMjE0LDcgKzIyMDEsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgaW50X3R1bF9iYWRfc2VxKEhDUyAqIHBDdXJIY2IpCitzdGF0aWMgaW50IGludF90dWxfYmFkX3NlcShIQ1MgKiBwQ3VySGNiKQogewkJCQkvKiB0YXJnZXQgd3JvbmcgcGhhc2UgICAgICAgICAgICovCiAJU0NCICpwQ3VyU2NiOwogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luaXRpby5oIGIvZHJpdmVycy9zY3NpL2luaXRpby5oCmluZGV4IGRmM2VkN2MuLjNlZmIxMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pbml0aW8uaAorKysgYi9kcml2ZXJzL3Njc2kvaW5pdGlvLmgKQEAgLTcxOSwyMSArNzE5LDMgQEAKICNkZWZpbmUgU0NTSV9SRVNFVF9IT1NUX1JFU0VUIDB4MjAwCiAjZGVmaW5lIFNDU0lfUkVTRVRfQUNUSU9OICAgMHhmZgogCi1leHRlcm4gdm9pZCBpbml0X2k5MXVBZGFwdGVyX3RhYmxlKHZvaWQpOwotZXh0ZXJuIGludCBBZGRpOTF1X2ludG9fQWRhcHRlcl90YWJsZShXT1JELCBXT1JELCBCWVRFLCBCWVRFLCBCWVRFKTsKLWV4dGVybiBpbnQgdHVsX1JldHVybk51bWJlck9mQWRhcHRlcnModm9pZCk7Ci1leHRlcm4gdm9pZCBnZXRfdHVsaXBQQ0lDb25maWcoSENTICogcEhDQiwgaW50IGlDaGFubmVsX2luZGV4KTsKLWV4dGVybiBpbnQgaW5pdF90dWxpcChIQ1MgKiBwSENCLCBTQ0IgKiBwU0NCLCBpbnQgdHVsX251bV9zY2IsIEJZVEUgKiBwYkJpb3NBZHIsIGludCByZXNldF90aW1lKTsKLWV4dGVybiBTQ0IgKnR1bF9hbGxvY19zY2IoSENTICogcEhDQik7Ci1leHRlcm4gaW50IHR1bF9hYm9ydF9zcmIoSENTICogcEhDQiwgc3RydWN0IHNjc2lfY21uZCAqIHBTUkIpOwotZXh0ZXJuIHZvaWQgdHVsX2V4ZWNfc2NiKEhDUyAqIHBIQ0IsIFNDQiAqIHBTQ0IpOwotZXh0ZXJuIHZvaWQgdHVsX3JlbGVhc2Vfc2NiKEhDUyAqIHBIQ0IsIFNDQiAqIHBTQ0IpOwotZXh0ZXJuIHZvaWQgdHVsX3N0b3BfYm0oSENTICogcEhDQik7Ci1leHRlcm4gaW50IHR1bF9yZXNldF9zY3NpKEhDUyAqIHBDdXJIY2IsIGludCBzZWNvbmRzKTsKLWV4dGVybiBpbnQgdHVsX2lzcihIQ1MgKiBwSENCKTsKLWV4dGVybiBpbnQgdHVsX3Jlc2V0KEhDUyAqIHBIQ0IsIHN0cnVjdCBzY3NpX2NtbmQgKiBwU1JCLCB1bnNpZ25lZCBjaGFyIHRhcmdldCk7Ci1leHRlcm4gaW50IHR1bF9yZXNldF9zY3NpX2J1cyhIQ1MgKiBwQ3VySGNiKTsKLWV4dGVybiBpbnQgdHVsX2RldmljZV9yZXNldChIQ1MgKiBwQ3VySGNiLCBzdHJ1Y3Qgc2NzaV9jbW5kICpwU3JiLAotCQl1bnNpZ25lZCBpbnQgdGFyZ2V0LCB1bnNpZ25lZCBpbnQgUmVzZXRGbGFncyk7Ci0JCQkJLyogLS0tLSBFWFRFUk5BTCBWQVJJQUJMRVMgLS0tLSAqLwotZXh0ZXJuIEhDUyB0dWxfaGNzW107CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmMgYi9kcml2ZXJzL3Njc2kvaXByLmMKaW5kZXggODBkMDIyNi4uYmFiZDQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5jCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuYwpAQCAtNjAxMiw3ICs2MDEyLDcgQEAKIAogLyoqCiAgKiBpcHJfc2h1dGRvd24gLSBTaHV0ZG93biBoYW5kbGVyLgotICogQGRldjoJZGV2aWNlIHN0cnVjdAorICogQHBkZXY6CXBjaSBkZXZpY2Ugc3RydWN0CiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHVwb24gc3lzdGVtIHNodXRkb3duL3JlYm9vdC4gSXQgd2lsbCBpc3N1ZQogICogYW4gYWRhcHRlciBzaHV0ZG93biB0byB0aGUgYWRhcHRlciB0byBmbHVzaCB0aGUgd3JpdGUgY2FjaGUuCkBAIC02MDIwLDkgKzYwMjAsOSBAQAogICogUmV0dXJuIHZhbHVlOgogICogCW5vbmUKICAqKi8KLXN0YXRpYyB2b2lkIGlwcl9zaHV0ZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBpcHJfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHRvX3BjaV9kZXYoZGV2KSk7CisJc3RydWN0IGlwcl9pb2FfY2ZnICppb2FfY2ZnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFncyA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOwpAQCAtNjA2OCw5ICs2MDY4LDcgQEAKIAkuaWRfdGFibGUgPSBpcHJfcGNpX3RhYmxlLAogCS5wcm9iZSA9IGlwcl9wcm9iZSwKIAkucmVtb3ZlID0gaXByX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkuc2h1dGRvd24gPSBpcHJfc2h1dGRvd24sCi0JfSwKKwkuc2h1dGRvd24gPSBpcHJfc2h1dGRvd24sCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKaW5kZXggMzZiNDAxZi4uY2I1MzVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMKQEAgLTE0MDgsNyArMTQwOCw5IEBACiAJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1NBVEFfUkVTRVQpIHsKIAkJLyogaXNzdWUgcGh5IHdha2UvcmVzZXQgKi8KIAkJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDEpOwotCQl1ZGVsYXkoNDAwKTsJCQkvKiBGSVhNRTogYSBndWVzcyAqLworCQkvKiBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIGluIFNBVEEgSS9JSSBzcGVjcywgYnV0CisJCSAqIEFIQ0ktMS4xIDEwLjQuMiBzYXlzIGF0IGxlYXN0IDEgbXMuICovCisJCW1kZWxheSgxKTsKIAl9CiAJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOyAvKiBwaHkgd2FrZS9jbGVhciByZXNldCAqLwogCkBAIC0xOTIwLDYgKzE5MjIsNyBAQAogCSJISVRBQ0hJIENEUi04MzM1IiwKIAkiSElUQUNISSBDRFItODQzNSIsCiAJIlRvc2hpYmEgQ0QtUk9NIFhNLTYyMDJCIiwKKwkiVE9TSElCQSBDRC1ST00gWE0tMTcwMkJDIiwKIAkiQ0QtNTMyRS1BIiwKIAkiRS1JREUgQ0QtUk9NIENSLTg0MCIsCiAJIkNELVJPTSBEcml2ZS9GNUEiLApAQCAtMTkyNyw3ICsxOTMwLDYgQEAKIAkiU0FNU1VORyBDRC1ST00gU0MtMTQ4QyIsCiAJIlNBTVNVTkcgQ0QtUk9NIFNDIiwKIAkiU2FuRGlzayBTRFAzQi02NCIsCi0JIlNBTVNVTkcgQ0QtUk9NIFNOLTEyNCIsCiAJIkFUQVBJIENELVJPTSBEUklWRSA0MFggTUFYSU1VTSIsCiAJIl9ORUMgRFY1ODAwQSIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwppbmRleCA3YTRhZGM0Li43OTRmYjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLXNjc2kuYwpAQCAtMTE3Niw4ICsxMTc2LDEyIEBACiAJCW5fc2VjdG9ycyA9IGF0YV9pZF91MzIoYXJncy0+aWQsIDYwKTsKIAluX3NlY3RvcnMtLTsJCS8qIEFUQSBUb3RhbFVzZXJTZWN0b3JzIC0gMSAqLwogCi0JdG1wID0gbl9zZWN0b3JzOwkvKiBub3RlOiB0cnVuY2F0ZXMsIGlmIGxiYTQ4ICovCiAJaWYgKGFyZ3MtPmNtZC0+Y21uZFswXSA9PSBSRUFEX0NBUEFDSVRZKSB7CisJCWlmKCBuX3NlY3RvcnMgPj0gMHhmZmZmZmZmZlVMTCApCisJCQl0bXAgPSAweGZmZmZmZmZmIDsgIC8qIFJldHVybiBtYXggY291bnQgb24gb3ZlcmZsb3cgKi8KKwkJZWxzZQorCQkJdG1wID0gbl9zZWN0b3JzIDsKKwogCQkvKiBzZWN0b3IgY291bnQsIDMyLWJpdCAqLwogCQlyYnVmWzBdID0gdG1wID4+ICg4ICogMyk7CiAJCXJidWZbMV0gPSB0bXAgPj4gKDggKiAyKTsKQEAgLTExOTEsMTAgKzExOTUsMTIgQEAKIAogCX0gZWxzZSB7CiAJCS8qIHNlY3RvciBjb3VudCwgNjQtYml0ICovCi0JCXJidWZbMl0gPSBuX3NlY3RvcnMgPj4gKDggKiA3KTsKLQkJcmJ1ZlszXSA9IG5fc2VjdG9ycyA+PiAoOCAqIDYpOwotCQlyYnVmWzRdID0gbl9zZWN0b3JzID4+ICg4ICogNSk7Ci0JCXJidWZbNV0gPSBuX3NlY3RvcnMgPj4gKDggKiA0KTsKKwkJdG1wID0gbl9zZWN0b3JzID4+ICg4ICogNCk7CisJCXJidWZbMl0gPSB0bXAgPj4gKDggKiAzKTsKKwkJcmJ1ZlszXSA9IHRtcCA+PiAoOCAqIDIpOworCQlyYnVmWzRdID0gdG1wID4+ICg4ICogMSk7CisJCXJidWZbNV0gPSB0bXA7CisJCXRtcCA9IG5fc2VjdG9yczsKIAkJcmJ1Zls2XSA9IHRtcCA+PiAoOCAqIDMpOwogCQlyYnVmWzddID0gdG1wID4+ICg4ICogMik7CiAJCXJidWZbOF0gPSB0bXAgPj4gKDggKiAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tYWM1M2M5NC5jIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKaW5kZXggZWRkNDdkMS4uOTMyZGNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKKysrIGIvZHJpdmVycy9zY3NpL21hYzUzYzk0LmMKQEAgLTQyNCw3ICs0MjQsNyBAQAogCS51c2VfY2x1c3RlcmluZwk9IERJU0FCTEVfQ0xVU1RFUklORywKIH07CiAKLXN0YXRpYyBpbnQgbWFjNTNjOTRfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgbWFjNTNjOTRfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gbWFjaW9fZ2V0X29mX25vZGUobWRldik7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBtYWNpb19nZXRfcGNpX2RldihtZGV2KTsKQEAgLTU0NCwxNSArNTQ0LDE0IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBvZl9tYXRjaCBtYWM1M2M5NF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtYWM1M2M5NF9tYXRjaFtdID0gCiB7CiAJewogCS5uYW1lIAkJPSAiNTNjOTQiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRSAob2YsIG1hYzUzYzk0X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgbWFjNTNjOTRfZHJpdmVyID0gCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCmluZGV4IGVjODE1MzIuLmE3MGNkZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC5jCkBAIC01MDM2LDkgKzUwMzYsOSBAQAogfQogCiBzdGF0aWMgdm9pZAotbWVnYXJhaWRfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQorbWVnYXJhaWRfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YSh0b19wY2lfZGV2KGRldikpOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJYWRhcHRlcl90ICphZGFwdGVyID0gKGFkYXB0ZXJfdCAqKWhvc3QtPmhvc3RkYXRhOwogCiAJX19tZWdhcmFpZF9zaHV0ZG93bihhZGFwdGVyKTsKQEAgLTUwNzAsOSArNTA3MCw3IEBACiAJLmlkX3RhYmxlCT0gbWVnYXJhaWRfcGNpX3RibCwKIAkucHJvYmUJCT0gbWVnYXJhaWRfcHJvYmVfb25lLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobWVnYXJhaWRfcmVtb3ZlX29uZSksCi0JLmRyaXZlcgkJPSB7Ci0JCS5zaHV0ZG93biA9IG1lZ2FyYWlkX3NodXRkb3duLAotCX0sCisJLnNodXRkb3duCT0gbWVnYXJhaWRfc2h1dGRvd24sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBtZWdhcmFpZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVzaC5jIGIvZHJpdmVycy9zY3NpL21lc2guYwppbmRleCBiMDU3MzdhLi5mZjE5MzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVzaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKQEAgLTE4NDcsNyArMTg0Nyw3IEBACiAJLnVzZV9jbHVzdGVyaW5nCQkJPSBESVNBQkxFX0NMVVNURVJJTkcsCiB9OwogCi1zdGF0aWMgaW50IG1lc2hfcHJvYmUoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX21hdGNoICptYXRjaCkKK3N0YXRpYyBpbnQgbWVzaF9wcm9iZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1lc2ggPSBtYWNpb19nZXRfb2Zfbm9kZShtZGV2KTsKIAlzdHJ1Y3QgcGNpX2RldiogcGRldiA9IG1hY2lvX2dldF9wY2lfZGV2KG1kZXYpOwpAQCAtMjAxMiwyMCArMjAxMiwxOCBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggbWVzaF9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtZXNoX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJtZXNoIiwKLQkudHlwZQkJPSBPRl9BTllfTUFUQ0gsCi0JLmNvbXBhdGlibGUJPSBPRl9BTllfTUFUQ0gKIAl9LAogCXsKLQkubmFtZSAJCT0gT0ZfQU5ZX01BVENILAogCS50eXBlCQk9ICJzY3NpIiwKIAkuY29tcGF0aWJsZQk9ICJjaHJwLG1lc2gwIgogCX0sCiAJe30sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRSAob2YsIG1lc2hfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBtZXNoX2RyaXZlciA9IAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvYWhhMTUyeF9zdHViLmMKaW5kZXggZTYwYjRjMC4uN2M1MzA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9haGExNTJ4X3N0dWIuYworKysgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2FoYTE1Mnhfc3R1Yi5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KICNpbmNsdWRlICJhaGExNTJ4LmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTEzNCwxMSArMTMzLDYgQEAKICAgICBsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAgICAgZGV2X2xpc3QgPSBsaW5rOwogICAgIGNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0gICAgY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJmFoYTE1MnhfZXZlbnQ7Ci0gICAgY2xpZW50X3JlZy5FdmVudE1hc2sgPQotCUNTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKICAgICBjbGllbnRfcmVnLlZlcnNpb24gPSAweDAyMTA7CiAgICAgY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKICAgICByZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTMxOCwxMyArMzEyLDI1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBhaGExNTJ4X2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTmV3IE1lZGlhIiwgIlNDU0kiLCAiQnVzIFRvYXN0ZXIiLCAweGNkZjdlNGNjLCAweDM1ZjI2NDc2LCAweGE4ODUxZDZlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIk5PVEVXT1JUSFkiLCAiU0NTSSIsICJCdXMgVG9hc3RlciIsIDB4YWQ4OWM2ZTgsIDB4MzVmMjY0NzYsIDB4YTg4NTFkNmUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJBZGFwdGVjLCBJbmMuIiwgIkFQQS0xNDYwIFNDU0kgSG9zdCBBZGFwdGVyIiwgMHgyNGJhOTczOCwgMHgzYTNjM2QyMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5ldyBNZWRpYSBDb3Jwb3JhdGlvbiIsICJNdWx0aW1lZGlhIFNvdW5kL1NDU0kiLCAweDA4NWE4NTBiLCAweDgwYTY1MzVjKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTk9URVdPUlRIWSIsICJOV0NPTUIwMiBTQ1NJL0FVRElPIENPTUJPIENBUkQiLCAweGFkODljNmU4LCAweDVmOWE2MTViKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGFoYTE1MnhfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIGFoYTE1MnhfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSAiYWhhMTUyeF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGFoYTE1MnhfYXR0YWNoLAorCS5ldmVudAkJPSBhaGExNTJ4X2V2ZW50LAogCS5kZXRhY2gJCT0gYWhhMTUyeF9kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gYWhhMTUyeF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2FoYTE1MnhfY3Modm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMgYi9kcml2ZXJzL3Njc2kvcGNtY2lhL2Zkb21haW5fc3R1Yi5jCmluZGV4IDNkZjdiYzcuLmRiOGY1Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wY21jaWEvZmRvbWFpbl9zdHViLmMKKysrIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9mZG9tYWluX3N0dWIuYwpAQCAtNDcsNyArNDcsNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAiZmRvbWFpbi5oIgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC0xMjAsMTEgKzExOSw2IEBACiAgICAgbGluay0+bmV4dCA9IGRldl9saXN0OwogICAgIGRldl9saXN0ID0gbGluazsKICAgICBjbGllbnRfcmVnLmRldl9pbmZvID0gJmRldl9pbmZvOwotICAgIGNsaWVudF9yZWcuZXZlbnRfaGFuZGxlciA9ICZmZG9tYWluX2V2ZW50OwotICAgIGNsaWVudF9yZWcuRXZlbnRNYXNrID0KLQlDU19FVkVOVF9SRVNFVF9SRVFVRVNUIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVCB8Ci0JQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCUNTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CiAgICAgY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogICAgIGNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAgICAgcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0yOTksMTMgKzI5MywyNCBAQAogICAgIHJldHVybiAwOwogfSAvKiBmZG9tYWluX2V2ZW50ICovCiAKKworc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGZkb21haW5faWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklCTSBDb3JwLiIsICJTQ1NJIFBDTUNJQSBDYXJkIiwgMHhlMzczNmM4OCwgMHg4NTljYWQyMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiU0NTSSBQQ01DSUEgQWRhcHRlciBDYXJkIiwgMHg4ZGFjYjU3ZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIiBTSU1QTEUgVEVDSE5PTE9HWSBDb3Jwb3JhdGlvbiIsICJTQ1NJIFBDTUNJQSBDcmVkaXQgQ2FyZCBDb250cm9sbGVyIiwgMHgxODJiZGFmZSwgMHhjODBkMTA2ZiksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBmZG9tYWluX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciBmZG9tYWluX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gImZkb21haW5fY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBmZG9tYWluX2F0dGFjaCwKKwkuZXZlbnQJCT0gZmRvbWFpbl9ldmVudCwKIAkuZGV0YWNoCQk9IGZkb21haW5fZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IGZkb21haW5faWRzLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9mZG9tYWluX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9uc3BfY3MuYwppbmRleCAzZGRkYjMyLi4zY2QzYjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL25zcF9jcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvbnNwX2NzLmMKQEAgLTUxLDcgKzUxLDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaW9jdGwuaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMTY0MiwxMSArMTY0MSw2IEBACiAJbGluay0+bmV4dCAgICAgICAgICAgICAgID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgICAgICAgICAgICAgICAgID0gbGluazsKIAljbGllbnRfcmVnLmRldl9pbmZvCSA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzawkgPQotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8Ci0JCUNTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVAl8Ci0JCUNTX0VWRU5UX1BNX1NVU1BFTkQJfCBDU19FVkVOVF9QTV9SRVNVTUUJIDsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmbnNwX2NzX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbgkgPSAweDAyMTA7CiAJY2xpZW50X3JlZy5ldmVudF9jYWxsYmFja19hcmdzLmNsaWVudF9kYXRhID0gbGluazsKIAlyZXQgPSBwY21jaWFfcmVnaXN0ZXJfY2xpZW50KCZsaW5rLT5oYW5kbGUsICZjbGllbnRfcmVnKTsKQEAgLTIxMjUsMTMgKzIxMTksMjcgQEAKICAqCW1vZHVsZSBlbnRyeSBwb2ludAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAjaWYgKExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNjgpKQorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIG5zcF9jc19pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIklPIERBVEEiLCAiQ0JTQzE2ICAgICAgICIsICIxIiwgMHg1NDdlNjZkYywgMHgwZDYzYTNmZCwgMHg1MWRlMDAzYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJLTUUgICAgIiwgIlNDU0ktQ0FSRC0wMDEiLCAiMSIsIDB4NTM0YzAyYmMsIDB4NTIwMDg0MDgsIDB4NTFkZTAwM2EpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiS01FICAgICIsICJTQ1NJLUNBUkQtMDAyIiwgIjEiLCAweDUzNGMwMmJjLCAweGNiMDlkNWIyLCAweDUxZGUwMDNhKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIktNRSAgICAiLCAiU0NTSS1DQVJELTAwMyIsICIxIiwgMHg1MzRjMDJiYywgMHhiYzBlZTUyNCwgMHg1MWRlMDAzYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJLTUUgICAgIiwgIlNDU0ktQ0FSRC0wMDQiLCAiMSIsIDB4NTM0YzAyYmMsIDB4MjI2YTcwODcsIDB4NTFkZTAwM2EpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiV0JUIiwgIk5pbmphU0NTSS0zIiwgIlIxLjAiLCAweGM3YmE4MDVmLCAweGZkYzdjOTdkLCAweDY5NzM3MTBlKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIldPUktCSVQiLCAiVWx0cmFOaW5qYS0xNiIsICIxIiwgMHgyODE5MTQxOCwgMHhiNzBmNGIwOSwgMHg1MWRlMDAzYSksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIG5zcF9jc19pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgbnNwX2RyaXZlciA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkuZHJ2ICAgICAgICAgICAgPSB7Ci0JCS5uYW1lICAgPSAibnNwX2NzIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gIm5zcF9jcyIsCiAJfSwKLQkuYXR0YWNoICAgICAgICAgPSBuc3BfY3NfYXR0YWNoLAotCS5kZXRhY2ggICAgICAgICA9IG5zcF9jc19kZXRhY2gsCisJLmF0dGFjaAkJPSBuc3BfY3NfYXR0YWNoLAorCS5ldmVudAkJPSBuc3BfY3NfZXZlbnQsCisJLmRldGFjaAkJPSBuc3BfY3NfZGV0YWNoLAorCS5pZF90YWJsZQk9IG5zcF9jc19pZHMsCiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwppbmRleCBhMDE3NWY1Li43YTUxNmYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BjbWNpYS9xbG9naWNfc3R1Yi5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvcWxvZ2ljX3N0dWIuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAjaW5jbHVkZSAiLi4vcWxvZ2ljZmFzNDA4LmgiCiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTE5NCw4ICsxOTMsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmcWxvZ2ljX2V2ZW50OwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0gQ1NfRVZFTlRfUkVTRVRfUkVRVUVTVCB8IENTX0VWRU5UX0NBUkRfUkVTRVQgfCBDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTCB8IENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUU7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC0zOTUsNiArMzkyLDI3IEBACiAJcmV0dXJuIDA7CiB9CQkJCS8qIHFsb2dpY19ldmVudCAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgcWxvZ2ljX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJFSWdlciBMYWJzIiwgIlBDTUNJQS10by1TQ1NJIEFkYXB0ZXIiLCAweDg4Mzk1ZmE3LCAweDMzYjdhNWU2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiRVBTT04iLCAiU0NTSS0yIFBDIENhcmQgU0MyMDAiLCAweGQzNjE3NzJmLCAweDI5OWQxNzUxKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiTUFDTklDQSIsICJNSVJBQ0xFIFNDU0ktSUkgbVBTMTEwIiwgMHgyMDg0MWI2OCwgMHhhYjNjM2I2ZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1JRE9SSSBFTEVDVFJPTklDUyAiLCAiQ04tU0M0MyIsIDB4NjUzNDM4MmEsIDB4ZDY3ZWVlNzkpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJORUMiLCAiUEMtOTgwMU4tSjAzUiIsIDB4MThkZjBiYTAsIDB4MjQ2NjJlOGEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJLTUUgIiwgIktYTEMwMDMiLCAweDgyMzc1YTI3LCAweGY2OGU1YmY3KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiS01FICIsICJLWExDMDA0IiwgMHg4MjM3NWEyNywgMHg2OGVhY2U1NCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIktNRSIsICJLWExDMTAxIiwgMHgzZmFlZTY3NiwgMHgxOTQyNTBlYyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlFMT0dJQyBDT1JQT1JBVElPTiIsICJwYzA1IiwgMHhkNzdiMjkzMCwgMHhhODViMjczNSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlFMT0dJQyBDT1JQT1JBVElPTiIsICJwYzA1IHJldiAxLjEwIiwgMHhkNzdiMjkzMCwgMHg3MGY4YjVmOCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKCJLTUUiLCAiS1hMQzAwMiIsICIwMCIsIDB4M2ZhZWU2NzYsIDB4ODE4OTZiNjEsIDB4Zjk5ZjA2NWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJSQVRPQyBTeXN0ZW0gSW5jLiIsICJTQ1NJMiBDQVJEIDM3IiwgMHg4NWMxMGUxNywgMHgxYTI2NDBjMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRPU0hJQkEiLCAiU0NTQzIwMEEgUEMgQ0FSRCBTQ1NJIiwgMHhiNDU4NWExYSwgMHhhNmYwNmViZSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRPU0hJQkEiLCAiU0NTQzIwMEIgUEMgQ0FSRCBTQ1NJLTEwIiwgMHhiNDU4NWExYSwgMHgwYTg4ZGVhMCksCisJLyogdGhlc2UgY29uZmxpY3Qgd2l0aCBvdGhlciBjYXJkcyEgKi8KKwkvKiBQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIk1BQ05JQ0EiLCAiTUlSQUNMRSBTQ1NJIiwgIm1QUzEwMCIsIDB4MjA4NDFiNjgsIDB4ZjhkZWRhZWIsIDB4ODlmN2ZhZmIpLCAqLworCS8qIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygiTUFDTklDQSIsICJNSVJBQ0xFIFNDU0kiLCAibVBTMTAwIiwgMHgyMDg0MWI2OCwgMHhmOGRlZGFlYiwgMHg4OWY3ZmFmYiksICovCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBxbG9naWNfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHFsb2dpY19jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtNDAyLDcgKzQyMCw5IEBACiAJLm5hbWUJCT0gInFsb2dpY19jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHFsb2dpY19hdHRhY2gsCisJLmV2ZW50CQk9IHFsb2dpY19ldmVudCwKIAkuZGV0YWNoCQk9IHFsb2dpY19kZXRhY2gsCisJLmlkX3RhYmxlICAgICAgID0gcWxvZ2ljX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcWxvZ2ljX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jIGIvZHJpdmVycy9zY3NpL3BjbWNpYS9zeW01M2M1MDBfY3MuYwppbmRleCAxNjY3ZGE5Li5iNGIzYTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcGNtY2lhL3N5bTUzYzUwMF9jcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9wY21jaWEvc3ltNTNjNTAwX2NzLmMKQEAgLTk3OSwxMCArOTc5LDYgQEAKIAlsaW5rLT5uZXh0ID0gZGV2X2xpc3Q7CiAJZGV2X2xpc3QgPSBsaW5rOwogCWNsaWVudF9yZWcuZGV2X2luZm8gPSAmZGV2X2luZm87Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJlNZTTUzQzUwMF9ldmVudDsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9IENTX0VWRU5UX1JFU0VUX1JFUVVFU1QgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfQ0FSRF9JTlNFUlRJT04gfCBDU19FVkVOVF9DQVJEX1JFTU9WQUwgfAotCSAgICBDU19FVkVOVF9QTV9TVVNQRU5EIHwgQ1NfRVZFTlRfUE1fUkVTVU1FOwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtOTk5LDEzICs5OTUsMjMgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU1lNNTNDNTAwIFBDTUNJQSBTQ1NJIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgc3ltNTNjNTAwX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCQVNJQ1MgYnkgTmV3IE1lZGlhIENvcnBvcmF0aW9uIiwgIlNDU0kgU3ltNTNDNTAwIiwgMHgyM2M3OGE5ZCwgMHgwMDk5ZTdmNyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk5ldyBNZWRpYSBDb3Jwb3JhdGlvbiIsICJTQ1NJIEJ1cyBUb2FzdGVyIFN5bTUzQzUwMCIsIDB4MDg1YTg1MGIsIDB4NDU0MzJlYjgpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDIoIlNDU0k5MDAwIiwgMHgyMTY0OGY0NCksCisJUENNQ0lBX0RFVklDRV9OVUxMLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNtY2lhLCBzeW01M2M1MDBfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHN5bTUzYzUwMF9jc19kcml2ZXIgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5kcnYJCT0gewogCQkubmFtZQk9ICJzeW01M2M1MDBfY3MiLAogCX0sCiAJLmF0dGFjaAkJPSBTWU01M0M1MDBfYXR0YWNoLAorCS5ldmVudAkJPSBTWU01M0M1MDBfZXZlbnQsCiAJLmRldGFjaAkJPSBTWU01M0M1MDBfZGV0YWNoLAorCS5pZF90YWJsZSAgICAgICA9IHN5bTUzYzUwMF9pZHMsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggNTU3OGFlOS4uMWNiNWY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC02OCw2ICs2OCw4IEBACiAjaW5jbHVkZSAic2NzaV9wcml2LmgiCiAjaW5jbHVkZSAic2NzaV9sb2dnaW5nLmgiCiAKK3N0YXRpYyB2b2lkIHNjc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworc3RhdGljIGludCBzY3NpX3JldHJ5X2NvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKIAogLyoKICAqIERlZmluaXRpb25zIGFuZCBjb25zdGFudHMuCkBAIC03NDEsNyArNzQzLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVycnVwdCBjb250ZXh0IHNhZmUuCiAgKi8KLXZvaWQgc2NzaV9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyB2b2lkIHNjc2lfZG9uZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCiB7CiAJLyoKIAkgKiBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoaXMgb25lIHRpbWluZyBvdXQgYW55IG1vcmUuCkBAIC04MzYsNyArODM4LDcgQEAKICAqICAgICAgICAgICAgICBsZXZlbCBkcml2ZXJzIHNob3VsZCBub3QgYmVjb21lIHJlLWVudHJhbnQgYXMgYSByZXN1bHQgb2YKICAqICAgICAgICAgICAgICB0aGlzLgogICovCi1pbnQgc2NzaV9yZXRyeV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3N0YXRpYyBpbnQgc2NzaV9yZXRyeV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKIHsKIAkvKgogCSAqIFJlc3RvcmUgdGhlIFNDU0kgY29tbWFuZCBzdGF0ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IGUwMjA4ODguLjMyMmI1YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtMTc4Myw3ICsxNzgzLDcgQEAKIGRldmljZV9pbml0Y2FsbChzY3NpX2RlYnVnX2luaXQpOwogbW9kdWxlX2V4aXQoc2NzaV9kZWJ1Z19leGl0KTsKIAotdm9pZCBwc2V1ZG9fMF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCitzdGF0aWMgdm9pZCBwc2V1ZG9fMF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CiAJaWYgKFNDU0lfREVCVUdfT1BUX05PSVNFICYgc2NzaV9kZWJ1Z19vcHRzKQogCQlwcmludGsoS0VSTl9JTkZPICJzY3NpX2RlYnVnOiBwc2V1ZG9fMF9yZWxlYXNlKCkgY2FsbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggOWY5OTY0OS4uMTA1MDZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKICNlbmRpZgogCiAjZGVmaW5lIFNQKHgpIHsgeCwgInNncG9vbC0iICN4IH0gCi1zdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgc2NzaV9zZ19wb29sc1tdID0geyAKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgc2NzaV9zZ19wb29sc1tdID0gewogCVNQKDgpLAogCVNQKDE2KSwKIAlTUCgzMiksCkBAIC02MzIsNyArNjMyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9ob3N0X3NnX3Bvb2wgKnNncDsKIAotCUJVR19PTihpbmRleCA+IFNHX01FTVBPT0xfTlIpOworCUJVR19PTihpbmRleCA+PSBTR19NRU1QT09MX05SKTsKIAogCXNncCA9IHNjc2lfc2dfcG9vbHMgKyBpbmRleDsKIAltZW1wb29sX2ZyZWUoc2dsLCBzZ3AtPnBvb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCmluZGV4IGMwMTU4MGRmLi45NmQ0Zjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCkBAIC02MSw4ICs2MSw2IEBACiBleHRlcm4gaW50IHNjc2lfZGlzcGF0Y2hfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gaW50IHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBleHRlcm4gdm9pZCBzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7Ci1leHRlcm4gdm9pZCBzY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKLWV4dGVybiBpbnQgc2NzaV9yZXRyeV9jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiBleHRlcm4gaW50IHNjc2lfaW5zZXJ0X3NwZWNpYWxfcmVxKHN0cnVjdCBzY3NpX3JlcXVlc3QgKnNyZXEsIGludCk7CiBleHRlcm4gdm9pZCBzY3NpX2luaXRfY21kX2Zyb21fcmVxKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKIAkJc3RydWN0IHNjc2lfcmVxdWVzdCAqc3JlcSk7CkBAIC0xMzYsNyArMTM0LDYgQEAKICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKIC8qIHNjc2lfc3lzZnMuYyAqLwotZXh0ZXJuIHZvaWQgc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqKTsKIGV4dGVybiBpbnQgc2NzaV9zeXNmc19hZGRfc2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gaW50IHNjc2lfc3lzZnNfYWRkX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqKTsKIGV4dGVybiBpbnQgc2NzaV9zeXNmc19yZWdpc3Rlcih2b2lkKTsKQEAgLTE0NSw3ICsxNDIsNiBAQAogZXh0ZXJuIGludCBzY3NpX3N5c2ZzX3RhcmdldF9pbml0aWFsaXplKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKIGV4dGVybiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgYmxhbmtfdHJhbnNwb3J0X3RlbXBsYXRlOwogCi1leHRlcm4gc3RydWN0IGNsYXNzIHNkZXZfY2xhc3M7CiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHNjc2lfYnVzX3R5cGU7CiAKIC8qIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3N5c2ZzLmMKaW5kZXggOTNiNDExMC4uYmVlZDdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc3lzZnMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9zeXNmcy5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlwdXRfZGV2aWNlKCZzZGV2LT5zZGV2X2dlbmRldik7CiB9CiAKLXZvaWQgc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHZvaWQgc2NzaV9kZXZpY2VfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CkBAIC0xODUsNyArMTg1LDcgQEAKIAkJcHV0X2RldmljZShwYXJlbnQpOwogfQogCi1zdHJ1Y3QgY2xhc3Mgc2Rldl9jbGFzcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3Mgc2Rldl9jbGFzcyA9IHsKIAkubmFtZQkJPSAic2NzaV9kZXZpY2UiLAogCS5yZWxlYXNlCT0gc2NzaV9kZXZpY2VfY2xzX3JlbGVhc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsLzY4MzI4c2VyaWFsLmMKaW5kZXggZGI5MmEwYy4uZDI3ZmI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvNjgzMjhzZXJpYWwuYworKysgYi9kcml2ZXJzL3NlcmlhbC82ODMyOHNlcmlhbC5jCkBAIC05OTIsMTggKzk5MiwxNyBAQAogLyoKICAqIFRoaXMgcm91dGluZSBzZW5kcyBhIGJyZWFrIGNoYXJhY3RlciBvdXQgdGhlIHNlcmlhbCBwb3J0LgogICovCi1zdGF0aWMgdm9pZCBzZW5kX2JyZWFrKAlzdHJ1Y3QgbTY4a19zZXJpYWwgKiBpbmZvLCBpbnQgZHVyYXRpb24pCitzdGF0aWMgdm9pZCBzZW5kX2JyZWFrKHN0cnVjdCBtNjhrX3NlcmlhbCAqIGluZm8sIHVuc2lnbmVkIGludCBkdXJhdGlvbikKIHsKIAltNjgzMjhfdWFydCAqdWFydCA9ICZ1YXJ0X2FkZHJbaW5mby0+bGluZV07CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgIGlmICghaW5mby0+cG9ydCkKICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAgICAgICAgIHNhdmVfZmxhZ3MoZmxhZ3MpOwogICAgICAgICBjbGkoKTsKICNpZmRlZiBVU0VfSU5UUwkKIAl1YXJ0LT51dHgudyB8PSBVVFhfU0VORF9CUkVBSzsKLSAgICAgICAgc2NoZWR1bGVfdGltZW91dChkdXJhdGlvbik7CisJbXNsZWVwX2ludGVycnVwdGlibGUoZHVyYXRpb24pOwogCXVhcnQtPnV0eC53ICY9IH5VVFhfU0VORF9CUkVBSzsKICNlbmRpZgkJCiAgICAgICAgIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOwpAQCAtMTAzMywxNCArMTAzMiwxNCBAQAogCQkJCXJldHVybiByZXR2YWw7CiAJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7CiAJCQlpZiAoIWFyZykKLQkJCQlzZW5kX2JyZWFrKGluZm8sIEhaLzQpOwkvKiAxLzQgc2Vjb25kICovCisJCQkJc2VuZF9icmVhayhpbmZvLCAyNTApOwkvKiAxLzQgc2Vjb25kICovCiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBUQ1NCUktQOgkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCiAJCQlyZXR2YWwgPSB0dHlfY2hlY2tfY2hhbmdlKHR0eSk7CiAJCQlpZiAocmV0dmFsKQogCQkJCXJldHVybiByZXR2YWw7CiAJCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgMCk7Ci0JCQlzZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisJCQlzZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyooMTAwKSA6IDI1MCk7CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBUSU9DR1NPRlRDQVI6CiAJCQllcnJvciA9IHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwKQEAgLTE0OTgsMjMgKzE0OTcsNiBAQAogCXJldHVybiAwOwogfQogCi0KLQotLyoKLSAqIHJlZ2lzdGVyX3NlcmlhbCBhbmQgdW5yZWdpc3Rlcl9zZXJpYWwgYWxsb3dzIGZvciBzZXJpYWwgcG9ydHMgdG8gYmUKLSAqIGNvbmZpZ3VyZWQgYXQgcnVuLXRpbWUsIHRvIHN1cHBvcnQgUENNQ0lBIG1vZGVtcy4KLSAqLwotLyogU1BBUkM6IFVudXNlZCBhdCB0aGlzIHRpbWUsIGp1c3QgaGVyZSB0byBtYWtlIHRoaW5ncyBsaW5rLiAqLwotaW50IHJlZ2lzdGVyX3NlcmlhbChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqcmVxKQotewotCXJldHVybiAtMTsKLX0KLQotdm9pZCB1bnJlZ2lzdGVyX3NlcmlhbChpbnQgbGluZSkKLXsKLQlyZXR1cm47Ci19Ci0JCiBtb2R1bGVfaW5pdChyczY4MzI4X2luaXQpOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMgYi9kcml2ZXJzL3NlcmlhbC82ODM2MHNlcmlhbC5jCmluZGV4IGYxNDgwMjIuLmIxMTYxMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsLzY4MzYwc2VyaWFsLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvNjgzNjBzZXJpYWwuYwpAQCAtMTM5NCwxNCArMTM5NCwxMyBAQAogLyoKICAqIFRoaXMgcm91dGluZSBzZW5kcyBhIGJyZWFrIGNoYXJhY3RlciBvdXQgdGhlIHNlcmlhbCBwb3J0LgogICovCi1zdGF0aWMgdm9pZCBzZW5kX2JyZWFrKHNlcl9pbmZvX3QgKmluZm8sIGludCBkdXJhdGlvbikKK3N0YXRpYyB2b2lkIHNlbmRfYnJlYWsoc2VyX2luZm9fdCAqaW5mbywgdW5zaWduZWQgaW50IGR1cmF0aW9uKQogewotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAjaWZkZWYgU0VSSUFMX0RFQlVHX1NFTkRfQlJFQUsKIAlwcmludGsoInJzX3NlbmRfYnJlYWsoJWQpIGppZmY9JWx1Li4uIiwgZHVyYXRpb24sIGppZmZpZXMpOwogI2VuZGlmCiAJYmVnaW5fYnJlYWsoaW5mbyk7Ci0Jc2NoZWR1bGVfdGltZW91dChkdXJhdGlvbik7CisJbXNsZWVwX2ludGVycnVwdGlibGUoZHVyYXRpb24pOwogCWVuZF9icmVhayhpbmZvKTsKICNpZmRlZiBTRVJJQUxfREVCVUdfU0VORF9CUkVBSwogCXByaW50aygiZG9uZSBqaWZmaWVzPSVsdVxuIiwgamlmZmllcyk7CkBAIC0xNDM2LDcgKzE0MzUsNyBAQAogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCXJldHVybiAtRUlOVFI7CiAJCQlpZiAoIWFyZykgewotCQkJCXNlbmRfYnJlYWsoaW5mbywgSFovNCk7CS8qIDEvNCBzZWNvbmQgKi8KKwkJCQlzZW5kX2JyZWFrKGluZm8sIDI1MCk7CS8qIDEvNCBzZWNvbmQgKi8KIAkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJCXJldHVybiAtRUlOVFI7CiAJCQl9CkBAIC0xNDQ4LDcgKzE0NDcsNyBAQAogCQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCXJldHVybiAtRUlOVFI7Ci0JCQlzZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyooSFovMTApIDogSFovNCk7CisJCQlzZW5kX2JyZWFrKGluZm8sIGFyZyA/IGFyZyoxMDAgOiAyNTApOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCXJldHVybiAtRUlOVFI7CiAJCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwppbmRleCAzMGU4YmViLi43ZThmYzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MC5jCkBAIC03NywyMyArNzcsOSBAQAogICovCiAjZGVmaW5lIGlzX3JlYWxfaW50ZXJydXB0KGlycSkJKChpcnEpICE9IDApCiAKLS8qCi0gKiBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIG5ldyBDT05GSUdfIHN5bWJvbHMgdG8gdGhlIHN5bWJvbHMKLSAqIHRoYXQgYXNtL3NlcmlhbC5oIGV4cGVjdHMuICBZb3UgX05FRURfIHRvIGNvbW1lbnQgb3V0IHRoZQotICogbGludXgvY29uZmlnLmggaW5jbHVkZSBjb250YWluZWQgaW5zaWRlIGFzbS9zZXJpYWwuaCBmb3IKLSAqIHRoaXMgdG8gd29yay4KLSAqLwotI3VuZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI3VuZGVmIENPTkZJR19TRVJJQUxfREVURUNUX0lSUQotI3VuZGVmIENPTkZJR19TRVJJQUxfTVVMVElQT1JUCi0jdW5kZWYgQ09ORklHX0hVQjYKLQogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRCiAjZGVmaW5lIENPTkZJR19TRVJJQUxfREVURUNUX0lSUSAxCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfTVVMVElQT1JUCi0jZGVmaW5lIENPTkZJR19TRVJJQUxfTVVMVElQT1JUIDEKLSNlbmRpZgogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTCiAjZGVmaW5lIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUyAxCiAjZW5kaWYKQEAgLTExOSw3ICsxMDUsNyBAQAogCVNFUklBTF9QT1JUX0RGTlMgLyogZGVmaW5lZCBpbiBhc20vc2VyaWFsLmggKi8KIH07CiAKLSNkZWZpbmUgVUFSVF9OUgkoQVJSQVlfU0laRShvbGRfc2VyaWFsX3BvcnQpICsgQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTKQorI2RlZmluZSBVQVJUX05SCUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUwogCiAjaWZkZWYgQ09ORklHX1NFUklBTF84MjUwX1JTQQogCkBAIC0xMzIsOSArMTE4LDkgQEAKIAlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7CiAJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CQkvKiAibm8gaXJxIiB0aW1lciAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJCS8qIHBvcnRzIG9uIHRoaXMgSVJRICovCi0JdW5zaWduZWQgaW50CQljYXBhYmlsaXRpZXM7CS8qIHBvcnQgY2FwYWJpbGl0aWVzICovCisJdW5zaWduZWQgc2hvcnQJCWNhcGFiaWxpdGllczsJLyogcG9ydCBjYXBhYmlsaXRpZXMgKi8KKwl1bnNpZ25lZCBzaG9ydAkJYnVnczsJCS8qIHBvcnQgYnVncyAqLwogCXVuc2lnbmVkIGludAkJdHhfbG9hZHN6OwkvKiB0cmFuc21pdCBmaWZvIGxvYWQgc2l6ZSAqLwotCXVuc2lnbmVkIHNob3J0CQlyZXY7CiAJdW5zaWduZWQgY2hhcgkJYWNyOwogCXVuc2lnbmVkIGNoYXIJCWllcjsKIAl1bnNpZ25lZCBjaGFyCQlsY3I7CkBAIC01NjAsNyArNTQ2LDE0IEBACiAJaWYgKGlkMSA9PSAweDE2ICYmIGlkMiA9PSAweEM5ICYmCiAJICAgIChpZDMgPT0gMHg1MCB8fCBpZDMgPT0gMHg1MiB8fCBpZDMgPT0gMHg1NCkpIHsKIAkJdXAtPnBvcnQudHlwZSA9IFBPUlRfMTZDOTUwOwotCQl1cC0+cmV2ID0gcmV2IHwgKGlkMyA8PCA4KTsKKworCQkvKgorCQkgKiBFbmFibGUgd29yayBhcm91bmQgZm9yIHRoZSBPeGZvcmQgU2VtaWNvbmR1Y3RvciA5NTIgcmV2IEIKKwkJICogY2hpcCB3aGljaCBjYXVzZXMgaXQgdG8gc2VyaW91c2x5IG1pc2NhbGN1bGF0ZSBiYXVkIHJhdGVzCisJCSAqIHdoZW4gRExMIGlzIDAuCisJCSAqLworCQlpZiAoaWQzID09IDB4NTIgJiYgcmV2ID09IDB4MDEpCisJCQl1cC0+YnVncyB8PSBVQVJUX0JVR19RVU9UOwogCQlyZXR1cm47CiAJfQogCQpAQCAtNTc3LDggKzU3MCw2IEBACiAKIAlpZDIgPSBpZDEgPj4gODsKIAlpZiAoaWQyID09IDB4MTAgfHwgaWQyID09IDB4MTIgfHwgaWQyID09IDB4MTQpIHsKLQkJaWYgKGlkMiA9PSAweDEwKQotCQkJdXAtPnJldiA9IGlkMSAmIDI1NTsKIAkJdXAtPnBvcnQudHlwZSA9IFBPUlRfMTY4NTA7CiAJCXJldHVybjsKIAl9CkBAIC04MDksNiArODAwLDcgQEAKIC8vCXNhdmVfZmxhZ3MoZmxhZ3MpOyBjbGkoKTsKIAogCXVwLT5jYXBhYmlsaXRpZXMgPSAwOworCXVwLT5idWdzID0gMDsKIAogCWlmICghKHVwLT5wb3J0LmZsYWdzICYgVVBGX0JVR0dZX1VBUlQpKSB7CiAJCS8qCkBAIC0xMDAxLDI2ICs5OTMsMzEgQEAKIAl1cC0+cG9ydC5pcnEgPSAoaXJxID4gMCkgPyBpcnEgOiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdG9wX3R4KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCkKK3sKKwlpZiAocC0+aWVyICYgVUFSVF9JRVJfVEhSSSkgeworCQlwLT5pZXIgJj0gflVBUlRfSUVSX1RIUkk7CisJCXNlcmlhbF9vdXQocCwgVUFSVF9JRVIsIHAtPmllcik7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzZXJpYWw4MjUwX3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdG9wKQogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICopcG9ydDsKIAotCWlmICh1cC0+aWVyICYgVUFSVF9JRVJfVEhSSSkgewotCQl1cC0+aWVyICY9IH5VQVJUX0lFUl9USFJJOwotCQlzZXJpYWxfb3V0KHVwLCBVQVJUX0lFUiwgdXAtPmllcik7Ci0JfQorCV9fc3RvcF90eCh1cCk7CiAKIAkvKgotCSAqIFdlIG9ubHkgZG8gdGhpcyBmcm9tIHVhcnRfc3RvcCAtIGlmIHdlIHJ1biBvdXQgb2YKLQkgKiBjaGFyYWN0ZXJzIHRvIHNlbmQsIHdlIGRvbid0IHdhbnQgdG8gcHJldmVudCB0aGUKLQkgKiBGSUZPIGZyb20gZW1wdHlpbmcuCisJICogV2UgcmVhbGx5IHdhbnQgdG8gc3RvcCB0aGUgdHJhbnNtaXR0ZXIgZnJvbSBzZW5kaW5nLgogCSAqLwotCWlmICh1cC0+cG9ydC50eXBlID09IFBPUlRfMTZDOTUwICYmIHR0eV9zdG9wKSB7CisJaWYgKHVwLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkM5NTApIHsKIAkJdXAtPmFjciB8PSBVQVJUX0FDUl9UWERJUzsKIAkJc2VyaWFsX2ljcl93cml0ZSh1cCwgVUFSVF9BQ1IsIHVwLT5hY3IpOwogCX0KIH0KIAorc3RhdGljIHZvaWQgdHJhbnNtaXRfY2hhcnMoc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCk7CisKIHN0YXRpYyB2b2lkIHNlcmlhbDgyNTBfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHR0eV9zdGFydCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqKXBvcnQ7CkBAIC0xMDI4LDExICsxMDI1LDIwIEBACiAJaWYgKCEodXAtPmllciAmIFVBUlRfSUVSX1RIUkkpKSB7CiAJCXVwLT5pZXIgfD0gVUFSVF9JRVJfVEhSSTsKIAkJc2VyaWFsX291dCh1cCwgVUFSVF9JRVIsIHVwLT5pZXIpOworCisJCWlmICh1cC0+YnVncyAmIFVBUlRfQlVHX1RYRU4pIHsKKwkJCXVuc2lnbmVkIGNoYXIgbHNyLCBpaXI7CisJCQlsc3IgPSBzZXJpYWxfaW4odXAsIFVBUlRfTFNSKTsKKwkJCWlpciA9IHNlcmlhbF9pbih1cCwgVUFSVF9JSVIpOworCQkJaWYgKGxzciAmIFVBUlRfTFNSX1RFTVQgJiYgaWlyICYgVUFSVF9JSVJfTk9fSU5UKQorCQkJCXRyYW5zbWl0X2NoYXJzKHVwKTsKKwkJfQogCX0KKwogCS8qCi0JICogV2Ugb25seSBkbyB0aGlzIGZyb20gdWFydF9zdGFydAorCSAqIFJlLWVuYWJsZSB0aGUgdHJhbnNtaXR0ZXIgaWYgd2UgZGlzYWJsZWQgaXQuCiAJICovCi0JaWYgKHR0eV9zdGFydCAmJiB1cC0+cG9ydC50eXBlID09IFBPUlRfMTZDOTUwKSB7CisJaWYgKHVwLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkM5NTAgJiYgdXAtPmFjciAmIFVBUlRfQUNSX1RYRElTKSB7CiAJCXVwLT5hY3IgJj0gflVBUlRfQUNSX1RYRElTOwogCQlzZXJpYWxfaWNyX3dyaXRlKHVwLCBVQVJUX0FDUiwgdXAtPmFjcik7CiAJfQpAQCAtMTE1Myw3ICsxMTU5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpIHx8IHVhcnRfdHhfc3RvcHBlZCgmdXAtPnBvcnQpKSB7Ci0JCXNlcmlhbDgyNTBfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlfX3N0b3BfdHgodXApOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTcyLDcgKzExNzgsNyBAQAogCURFQlVHX0lOVFIoIlRIUkUuLi4iKTsKIAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCXNlcmlhbDgyNTBfc3RvcF90eCgmdXAtPnBvcnQsIDApOworCQlfX3N0b3BfdHgodXApOwogfQogCiBzdGF0aWMgX0lOTElORV8gdm9pZCBjaGVja19tb2RlbV9zdGF0dXMoc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCkKQEAgLTEzNzQsMTMgKzEzODAsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsODI1MF9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqKXBvcnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAlzdGF0dXMgPSBzZXJpYWxfaW4odXAsIFVBUlRfTVNSKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKIAlyZXQgPSAwOwogCWlmIChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpCkBAIC0xNDMzLDYgKzE0MzYsNyBAQAogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICopcG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbHNyLCBpaXI7CiAJaW50IHJldHZhbDsKIAogCXVwLT5jYXBhYmlsaXRpZXMgPSB1YXJ0X2NvbmZpZ1t1cC0+cG9ydC50eXBlXS5mbGFnczsKQEAgLTE1MzYsNiArMTU0MCwyNiBAQAogCQkJdXAtPnBvcnQubWN0cmwgfD0gVElPQ01fT1VUMjsKIAogCXNlcmlhbDgyNTBfc2V0X21jdHJsKCZ1cC0+cG9ydCwgdXAtPnBvcnQubWN0cmwpOworCisJLyoKKwkgKiBEbyBhIHF1aWNrIHRlc3QgdG8gc2VlIGlmIHdlIHJlY2VpdmUgYW4KKwkgKiBpbnRlcnJ1cHQgd2hlbiB3ZSBlbmFibGUgdGhlIFRYIGlycS4KKwkgKi8KKwlzZXJpYWxfb3V0cCh1cCwgVUFSVF9JRVIsIFVBUlRfSUVSX1RIUkkpOworCWxzciA9IHNlcmlhbF9pbih1cCwgVUFSVF9MU1IpOworCWlpciA9IHNlcmlhbF9pbih1cCwgVUFSVF9JSVIpOworCXNlcmlhbF9vdXRwKHVwLCBVQVJUX0lFUiwgMCk7CisKKwlpZiAobHNyICYgVUFSVF9MU1JfVEVNVCAmJiBpaXIgJiBVQVJUX0lJUl9OT19JTlQpIHsKKwkJaWYgKCEodXAtPmJ1Z3MgJiBVQVJUX0JVR19UWEVOKSkgeworCQkJdXAtPmJ1Z3MgfD0gVUFSVF9CVUdfVFhFTjsKKwkJCXByX2RlYnVnKCJ0dHlTJWQgLSBlbmFibGluZyBiYWQgdHggc3RhdHVzIHdvcmthcm91bmRzXG4iLAorCQkJCSBwb3J0LT5saW5lKTsKKwkJfQorCX0gZWxzZSB7CisJCXVwLT5idWdzICY9IH5VQVJUX0JVR19UWEVOOworCX0KKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCS8qCkBAIC0xNjQ1LDIyICsxNjY5LDIyIEBACiAKIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewogCWNhc2UgQ1M1OgotCQljdmFsID0gMHgwMDsKKwkJY3ZhbCA9IFVBUlRfTENSX1dMRU41OwogCQlicmVhazsKIAljYXNlIENTNjoKLQkJY3ZhbCA9IDB4MDE7CisJCWN2YWwgPSBVQVJUX0xDUl9XTEVONjsKIAkJYnJlYWs7CiAJY2FzZSBDUzc6Ci0JCWN2YWwgPSAweDAyOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJY2FzZSBDUzg6Ci0JCWN2YWwgPSAweDAzOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjg7CiAJCWJyZWFrOwogCX0KIAogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQljdmFsIHw9IDB4MDQ7CisJCWN2YWwgfD0gVUFSVF9MQ1JfU1RPUDsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKIAkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7CiAJaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCkBAIC0xNjc3LDEyICsxNzAxLDkgQEAKIAlxdW90ID0gc2VyaWFsODI1MF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKIAogCS8qCi0JICogV29yayBhcm91bmQgYSBidWcgaW4gdGhlIE94Zm9yZCBTZW1pY29uZHVjdG9yIDk1MiByZXYgQgotCSAqIGNoaXAgd2hpY2ggY2F1c2VzIGl0IHRvIHNlcmlvdXNseSBtaXNjYWxjdWxhdGUgYmF1ZCByYXRlcwotCSAqIHdoZW4gRExMIGlzIDAuCisJICogT3hmb3JkIFNlbWkgOTUyIHJldiBCIHdvcmthcm91bmQKIAkgKi8KLQlpZiAoKHF1b3QgJiAweGZmKSA9PSAwICYmIHVwLT5wb3J0LnR5cGUgPT0gUE9SVF8xNkM5NTAgJiYKLQkgICAgdXAtPnJldiA9PSAweDUyMDEpCisJaWYgKHVwLT5idWdzICYgVUFSVF9CVUdfUVVPVCAmJiAocXVvdCAmIDB4ZmYpID09IDApCiAJCXF1b3QgKys7CiAKIAlpZiAodXAtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0FQX0ZJRk8gJiYgdXAtPnBvcnQuZmlmb3NpemUgPiAxKSB7CkBAIC0yMDQwLDcgKzIwNjEsOCBAQAogCQl1cC0+cG9ydC5vcHMgPSAmc2VyaWFsODI1MF9wb3BzOwogCX0KIAotCWZvciAoaSA9IDAsIHVwID0gc2VyaWFsODI1MF9wb3J0czsgaSA8IEFSUkFZX1NJWkUob2xkX3NlcmlhbF9wb3J0KTsKKwlmb3IgKGkgPSAwLCB1cCA9IHNlcmlhbDgyNTBfcG9ydHM7CisJICAgICBpIDwgQVJSQVlfU0laRShvbGRfc2VyaWFsX3BvcnQpICYmIGkgPCBVQVJUX05SOwogCSAgICAgaSsrLCB1cCsrKSB7CiAJCXVwLT5wb3J0LmlvYmFzZSAgID0gb2xkX3NlcmlhbF9wb3J0W2ldLnBvcnQ7CiAJCXVwLT5wb3J0LmlycSAgICAgID0gaXJxX2Nhbm9uaWNhbGl6ZShvbGRfc2VyaWFsX3BvcnRbaV0uaXJxKTsKQEAgLTIyODksMTAgKzIzMTEsMTEgQEAKIHsKIAlzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgKnAgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OworCWludCByZXQsIGk7CiAKIAltZW1zZXQoJnBvcnQsIDAsIHNpemVvZihzdHJ1Y3QgdWFydF9wb3J0KSk7CiAKLQlmb3IgKDsgcCAmJiBwLT5mbGFncyAhPSAwOyBwKyspIHsKKwlmb3IgKGkgPSAwOyBwICYmIHAtPmZsYWdzICE9IDA7IHArKywgaSsrKSB7CiAJCXBvcnQuaW9iYXNlCT0gcC0+aW9iYXNlOwogCQlwb3J0Lm1lbWJhc2UJPSBwLT5tZW1iYXNlOwogCQlwb3J0LmlycQk9IHAtPmlycTsKQEAgLTIzMDEsMTAgKzIzMjQsMTYgQEAKIAkJcG9ydC5pb3R5cGUJPSBwLT5pb3R5cGU7CiAJCXBvcnQuZmxhZ3MJPSBwLT5mbGFnczsKIAkJcG9ydC5tYXBiYXNlCT0gcC0+bWFwYmFzZTsKKwkJcG9ydC5odWI2CT0gcC0+aHViNjsKIAkJcG9ydC5kZXYJPSBkZXY7CiAJCWlmIChzaGFyZV9pcnFzKQogCQkJcG9ydC5mbGFncyB8PSBVUEZfU0hBUkVfSVJROwotCQlzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOworCQlyZXQgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyX3BvcnQoJnBvcnQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgcG9ydCBhdCBpbmRleCAlZCAiCisJCQkJIihJTyVseCBNRU0lbHggSVJRJWQpOiAlZFxuIiwgaSwKKwkJCQlwLT5pb2Jhc2UsIHAtPm1hcGJhc2UsIHAtPmlycSwgcmV0KTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTAuaCBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuaAppbmRleCA0ZjNkNjJmLi45MjI1YzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC84MjUwLmgKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MC5oCkBAIC01MSw2ICs1MSw5IEBACiAjZGVmaW5lIFVBUlRfQ0FQX0FGRQkoMSA8PCAxMSkJLyogTUNSLWJhc2VkIGh3IGZsb3cgY29udHJvbCAqLwogI2RlZmluZSBVQVJUX0NBUF9VVUUJKDEgPDwgMTIpCS8qIFVBUlQgbmVlZHMgSUVSIGJpdCA2IHNldCAoWHNjYWxlKSAqLwogCisjZGVmaW5lIFVBUlRfQlVHX1FVT1QJKDEgPDwgMCkJLyogVUFSVCBoYXMgYnVnZ3kgcXVvdCBMU0IgKi8KKyNkZWZpbmUgVUFSVF9CVUdfVFhFTgkoMSA8PCAxKQkvKiBVQVJUIGhhcyBidWdneSBUWCBJSVIgc3RhdHVzICovCisKICNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiAoZGVmaW5lZChDT05GSUdfTTM4NikgfHwgZGVmaW5lZChDT05GSUdfTTQ4NikpCiAjZGVmaW5lIF9JTkxJTkVfIGlubGluZQogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsLzgyNTBfYWNjZW50LmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjY2VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMmMyNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2FjY2VudC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9zZXJpYWwvODI1MF9hY2NlbnQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgUnVzc2VsbCBLaW5nLgorICogIERhdGEgdGFrZW4gZnJvbSBpbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjZGVmaW5lIFBPUlQoX2Jhc2UsX2lycSkJCQkJXAorCXsJCQkJCQlcCisJCS5pb2Jhc2UJCT0gX2Jhc2UsCQlcCisJCS5pcnEJCT0gX2lycSwJCQlcCisJCS51YXJ0Y2xrCT0gMTg0MzIwMCwJCVwKKwkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCQlcCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwJXAorCX0KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBhY2NlbnRfZGF0YVtdID0geworCVBPUlQoMHgzMzAsIDQpLAorCVBPUlQoMHgzMzgsIDQpLAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFjY2VudF9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDIsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IGFjY2VudF9kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhY2NlbnRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmFjY2VudF9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChhY2NlbnRfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MjUwIHNlcmlhbCBwcm9iZSBtb2R1bGUgZm9yIEFjY2VudCBBc3luYyBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9ib2NhLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2JvY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVjOWVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9ib2NhLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NlcmlhbC84MjUwX2JvY2EuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgUnVzc2VsbCBLaW5nLgorICogIERhdGEgdGFrZW4gZnJvbSBpbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjZGVmaW5lIFBPUlQoX2Jhc2UsX2lycSkJCQkJXAorCXsJCQkJCQlcCisJCS5pb2Jhc2UJCT0gX2Jhc2UsCQlcCisJCS5pcnEJCT0gX2lycSwJCQlcCisJCS51YXJ0Y2xrCT0gMTg0MzIwMCwJCVwKKwkJLmlvdHlwZQkJPSBVUElPX1BPUlQsCQlcCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwJXAorCX0KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBib2NhX2RhdGFbXSA9IHsKKwlQT1JUKDB4MTAwLCAxMiksCisJUE9SVCgweDEwOCwgMTIpLAorCVBPUlQoMHgxMTAsIDEyKSwKKwlQT1JUKDB4MTE4LCAxMiksCisJUE9SVCgweDEyMCwgMTIpLAorCVBPUlQoMHgxMjgsIDEyKSwKKwlQT1JUKDB4MTMwLCAxMiksCisJUE9SVCgweDEzOCwgMTIpLAorCVBPUlQoMHgxNDAsIDEyKSwKKwlQT1JUKDB4MTQ4LCAxMiksCisJUE9SVCgweDE1MCwgMTIpLAorCVBPUlQoMHgxNTgsIDEyKSwKKwlQT1JUKDB4MTYwLCAxMiksCisJUE9SVCgweDE2OCwgMTIpLAorCVBPUlQoMHgxNzAsIDEyKSwKKwlQT1JUKDB4MTc4LCAxMiksCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYm9jYV9kZXZpY2UgPSB7CisJLm5hbWUJCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCQk9IDMsCisJLmRldgkJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IGJvY2FfZGF0YSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYm9jYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYm9jYV9kZXZpY2UpOworfQorCittb2R1bGVfaW5pdChib2NhX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiODI1MCBzZXJpYWwgcHJvYmUgbW9kdWxlIGZvciBCb2NhIGNhcmRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwX2ZvdXJwb3J0LmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2ZvdXJwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliNGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfZm91cnBvcnQuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc2VyaWFsLzgyNTBfZm91cnBvcnQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgUnVzc2VsbCBLaW5nLgorICogIERhdGEgdGFrZW4gZnJvbSBpbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjZGVmaW5lIFBPUlQoX2Jhc2UsX2lycSkJCQkJCQlcCisJewkJCQkJCQkJXAorCQkuaW9iYXNlCQk9IF9iYXNlLAkJCQlcCisJCS5pcnEJCT0gX2lycSwJCQkJCVwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAkJCQlcCisJCS5pb3R5cGUJCT0gVVBJT19QT1JULAkJCQlcCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9GT1VSUE9SVCwJXAorCX0KKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCBmb3VycG9ydF9kYXRhW10gPSB7CisJUE9SVCgweDFhMCwgOSksCisJUE9SVCgweDFhOCwgOSksCisJUE9SVCgweDFiMCwgOSksCisJUE9SVCgweDFiOCwgOSksCisJUE9SVCgweDJhMCwgNSksCisJUE9SVCgweDJhOCwgNSksCisJUE9SVCgweDJiMCwgNSksCisJUE9SVCgweDJiOCwgNSksCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZm91cnBvcnRfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSAxLAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBmb3VycG9ydF9kYXRhLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmb3VycG9ydF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZm91cnBvcnRfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoZm91cnBvcnRfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI4MjUwIHNlcmlhbCBwcm9iZSBtb2R1bGUgZm9yIEFTVCBGb3VycG9ydCBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9odWI2LmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2YzOTZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvODI1MF9odWI2LmMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NlcmlhbC84MjUwX2h1YjYuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUgUnVzc2VsbCBLaW5nLgorICogIERhdGEgdGFrZW4gZnJvbSBpbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorCisjZGVmaW5lIEhVQjYoY2FyZCxwb3J0KQkJCQkJCQlcCisJewkJCQkJCQkJXAorCQkuaW9iYXNlCQk9IDB4MzAyLAkJCQlcCisJCS5pcnEJCT0gMywJCQkJCVwKKwkJLnVhcnRjbGsJPSAxODQzMjAwLAkJCQlcCisJCS5pb3R5cGUJCT0gVVBJT19IVUI2LAkJCQlcCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwJCQlcCisJCS5odWI2CQk9IChjYXJkKSA8PCA2IHwgKHBvcnQpIDw8IDMgfCAxLAlcCisJfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGh1YjZfZGF0YVtdID0geworCUhVQjYoMCwwKSwKKwlIVUI2KDAsMSksCisJSFVCNigwLDIpLAorCUhVQjYoMCwzKSwKKwlIVUI2KDAsNCksCisJSFVCNigwLDUpLAorCUhVQjYoMSwwKSwKKwlIVUI2KDEsMSksCisJSFVCNigxLDIpLAorCUhVQjYoMSwzKSwKKwlIVUI2KDEsNCksCisJSFVCNigxLDUpLAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGh1YjZfZGV2aWNlID0geworCS5uYW1lCQkJPSAic2VyaWFsODI1MCIsCisJLmlkCQkJPSA0LAorCS5kZXYJCQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBodWI2X2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh1YjZfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmh1YjZfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQoaHViNl9pbml0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIjgyNTAgc2VyaWFsIHByb2JlIG1vZHVsZSBmb3IgSHViNiBjYXJkcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9tY2EuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfbWNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjNDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfbWNhLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NlcmlhbC84MjUwX21jYS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBSdXNzZWxsIEtpbmcuCisgKiAgRGF0YSB0YWtlbiBmcm9tIGluY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKy8qCisgKiBGSVhNRTogU2hvdWxkIHdlIGJlIGRvaW5nIEFVVE9fSVJRIGhlcmU/CisgKi8KKyNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUQorI2RlZmluZSBNQ0FfRkxBR1MJVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUIHwgVVBGX0FVVE9fSVJRCisjZWxzZQorI2RlZmluZSBNQ0FfRkxBR1MJVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUCisjZW5kaWYKKworI2RlZmluZSBQT1JUKF9iYXNlLF9pcnEpCQkJXAorCXsJCQkJCVwKKwkJLmlvYmFzZQkJPSBfYmFzZSwJXAorCQkuaXJxCQk9IF9pcnEsCQlcCisJCS51YXJ0Y2xrCT0gMTg0MzIwMCwJXAorCQkuaW90eXBlCQk9IFVQSU9fUE9SVCwJXAorCQkuZmxhZ3MJCT0gTUNBX0ZMQUdTLAlcCisJfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IG1jYV9kYXRhW10gPSB7CisJUE9SVCgweDMyMjAsIDMpLAorCVBPUlQoMHgzMjI4LCAzKSwKKwlQT1JUKDB4NDIyMCwgMyksCisJUE9SVCgweDQyMjgsIDMpLAorCVBPUlQoMHg1MjIwLCAzKSwKKwlQT1JUKDB4NTIyOCwgMyksCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWNhX2RldmljZSA9IHsKKwkubmFtZQkJCT0gInNlcmlhbDgyNTAiLAorCS5pZAkJCT0gNSwKKwkuZGV2CQkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gbWNhX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1jYV9pbml0KHZvaWQpCit7CisJaWYgKCFNQ0FfYnVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtY2FfZGV2aWNlKTsKK30KKworbW9kdWxlX2luaXQobWNhX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJSdXNzZWxsIEtpbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiODI1MCBzZXJpYWwgcHJvYmUgbW9kdWxlIGZvciBNQ0EgcG9ydHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IDI1ZmNlZjIuLmUwZDBhNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtODYsMTQgKzg2LDE0IEBACiAJICBuYW1lc3BhY2UsIHNheSBZIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgU0VSSUFMXzgyNTBfTlJfVUFSVFMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIG5vbi1sZWdhY3kgODI1MC8xNjU1MCBzZXJpYWwgcG9ydHMiCisJaW50ICJNYXhpbXVtIG51bWJlciBvZiA4MjUwLzE2NTUwIHNlcmlhbCBwb3J0cyIKIAlkZXBlbmRzIG9uIFNFUklBTF84MjUwCiAJZGVmYXVsdCAiNCIKLQktLS1oZWxwLS0tCi0JICBTZXQgdGhpcyB0byB0aGUgbnVtYmVyIG9mIG5vbi1sZWdhY3kgc2VyaWFsIHBvcnRzIHlvdSB3YW50Ci0JICB0aGUgZHJpdmVyIHRvIHN1cHBvcnQuICBUaGlzIGluY2x1ZGVzIGFueSBwb3J0cyBkaXNjb3ZlcmVkCi0JICB2aWEgQUNQSSBvciBQQ0kgZW51bWVyYXRpb24gYW5kIGFueSBwb3J0cyB0aGF0IG1heSBiZSBhZGRlZAotCSAgYXQgcnVuLXRpbWUgdmlhIGhvdC1wbHVnLgorCWhlbHAKKwkgIFNldCB0aGlzIHRvIHRoZSBudW1iZXIgb2Ygc2VyaWFsIHBvcnRzIHlvdSB3YW50IHRoZSBkcml2ZXIKKwkgIHRvIHN1cHBvcnQuICBUaGlzIGluY2x1ZGVzIGFueSBwb3J0cyBkaXNjb3ZlcmVkIHZpYSBBQ1BJIG9yCisJICBQQ0kgZW51bWVyYXRpb24gYW5kIGFueSBwb3J0cyB0aGF0IG1heSBiZSBhZGRlZCBhdCBydW4tdGltZQorCSAgdmlhIGhvdC1wbHVnLCBvciBhbnkgSVNBIG11bHRpLXBvcnQgc2VyaWFsIGNhcmRzLgogCiBjb25maWcgU0VSSUFMXzgyNTBfRVhURU5ERUQKIAlib29sICJFeHRlbmRlZCA4MjUwLzE2NTUwIHNlcmlhbCBkcml2ZXIgb3B0aW9ucyIKQEAgLTE0MSwzMSArMTQxLDc0IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBTRVJJQUxfODI1MF9NVUxUSVBPUlQKLQlib29sICJTdXBwb3J0IHNwZWNpYWwgbXVsdGlwb3J0IGJvYXJkcyIKLQlkZXBlbmRzIG9uIFNFUklBTF84MjUwX0VYVEVOREVECi0JaGVscAotCSAgU29tZSBtdWx0aXBvcnQgc2VyaWFsIHBvcnRzIGhhdmUgc3BlY2lhbCBwb3J0cyB3aGljaCBhcmUgdXNlZCB0bwotCSAgc2lnbmFsIHdoZW4gdGhlcmUgYXJlIGFueSBzZXJpYWwgcG9ydHMgb24gdGhlIGJvYXJkIHdoaWNoIG5lZWQKLQkgIHNlcnZpY2luZy4gU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIHNlcmlhbCBkcml2ZXIgdG8gdGFrZSBhZHZhbnRhZ2UKLQkgIG9mIHRob3NlIHNwZWNpYWwgSS9PIHBvcnRzLgotCiBjb25maWcgU0VSSUFMXzgyNTBfUlNBCiAJYm9vbCAiU3VwcG9ydCBSU0Egc2VyaWFsIHBvcnRzIgogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTBfRVhURU5ERUQKIAloZWxwCiAJICA6OjogVG8gYmUgd3JpdHRlbiA6OjoKIAotY29tbWVudCAiTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydCIKKyMKKyMgTXVsdGktcG9ydCBzZXJpYWwgY2FyZHMKKyMKKworY29uZmlnIFNFUklBTF84MjUwX0ZPVVJQT1JUCisJdHJpc3RhdGUgIlN1cHBvcnQgRm91cnBvcnQgY2FyZHMiCisJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAhPSBuICYmIElTQSAmJiBTRVJJQUxfODI1MF9NQU5ZX1BPUlRTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBBU1QgRm91clBvcnQgc2VyaWFsIGJvYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MjUwX2ZvdXJwb3J0LgorCitjb25maWcgU0VSSUFMXzgyNTBfQUNDRU5UCisJdHJpc3RhdGUgIlN1cHBvcnQgQWNjZW50IGNhcmRzIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gQWNjZW50IEFzeW5jIHNlcmlhbCBib2FyZC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9hY2NlbnQuCisKKworY29uZmlnIFNFUklBTF84MjUwX0JPQ0EKKwl0cmlzdGF0ZSAiU3VwcG9ydCBCb2NhIGNhcmRzIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBJU0EgJiYgU0VSSUFMXzgyNTBfTUFOWV9QT1JUUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBCb2NhIHNlcmlhbCBib2FyZC4gIFBsZWFzZSByZWFkIHRoZSBCb2NhCisJICBtaW5pLUhPV1RPLCBhdmFpYWxibGUgZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIDgyNTBfYm9jYS4KKworCitjb25maWcgU0VSSUFMXzgyNTBfSFVCNgorCXRyaXN0YXRlICJTdXBwb3J0IEh1YjYgY2FyZHMiCisJZGVwZW5kcyBvbiBTRVJJQUxfODI1MCAhPSBuICYmIElTQSAmJiBTRVJJQUxfODI1MF9NQU5ZX1BPUlRTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIEhVQjYgc2VyaWFsIGJvYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MjUwX2h1YjYuCisKK2NvbmZpZyBTRVJJQUxfODI1MF9NQ0EKKwl0cmlzdGF0ZSAiU3VwcG9ydCA4MjUwLXR5cGUgcG9ydHMgb24gTUNBIGJ1c2VzIgorCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgIT0gbiAmJiBNQ0EKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgTUNBIHNlcmlhbCBwb3J0cy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgODI1MF9tY2EuCiAKIGNvbmZpZyBTRVJJQUxfODI1MF9BQ09STgogCXRyaXN0YXRlICJBY29ybiBleHBhbnNpb24gY2FyZCBzZXJpYWwgcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfQUNPUk4gJiYgU0VSSUFMXzgyNTAKKwlkZXBlbmRzIG9uIEFSQ0hfQUNPUk4gJiYgU0VSSUFMXzgyNTAKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhbiBBdG9td2lkZSBTZXJpYWwgY2FyZCBvciBTZXJpYWwgUG9ydCBjYXJkIGZvciBhbiBBY29ybgogCSAgc3lzdGVtLCBzYXkgWSB0byB0aGlzIG9wdGlvbi4gIFRoZSBkcml2ZXIgY2FuIGhhbmRsZSAxLCAyLCBvciAzIHBvcnQKIAkgIGNhcmRzLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29tbWVudCAiTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwogY29uZmlnIFNFUklBTF9BTUJBX1BMMDEwCiAJdHJpc3RhdGUgIkFSTSBBTUJBIFBMMDEwIHNlcmlhbCBwb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUk1fQU1CQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQppbmRleCA4ZjFjZGRlLi42NWJkNDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NlcmlhbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsMTEgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9DUykgKz0gc2VyaWFsX2NzLm8KIG9iai0kKENPTkZJR19TRVJJQUxfODI1MF9BQ09STikgKz0gODI1MF9hY29ybi5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRSkgKz0gODI1MF9lYXJseS5vCitvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfRk9VUlBPUlQpICs9IDgyNTBfZm91cnBvcnQubworb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0FDQ0VOVCkgKz0gODI1MF9hY2NlbnQubworb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0JPQ0EpICs9IDgyNTBfYm9jYS5vCitvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfSFVCNikgKz0gODI1MF9odWI2Lm8KK29iai0kKENPTkZJR19TRVJJQUxfODI1MF9NQ0EpICs9IDgyNTBfbWNhLm8KIG9iai0kKENPTkZJR19TRVJJQUxfQU1CQV9QTDAxMCkgKz0gYW1iYS1wbDAxMC5vCiBvYmotJChDT05GSUdfU0VSSUFMX0FNQkFfUEwwMTEpICs9IGFtYmEtcGwwMTEubwogb2JqLSQoQ09ORklHX1NFUklBTF9DTFBTNzExWCkgKz0gY2xwczcxMXgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvYXUxeDAwX3VhcnQuYyBiL2RyaXZlcnMvc2VyaWFsL2F1MXgwMF91YXJ0LmMKaW5kZXggYjZkM2Q1MC4uNjEwNGFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYXUxeDAwX3VhcnQuYworKysgYi9kcml2ZXJzL3NlcmlhbC9hdTF4MDBfdWFydC5jCkBAIC01NTYsMTMgKzU1NiwxMCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzZXJpYWw4MjUwX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfODI1MF9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCXN0YXR1cyA9IHNlcmlhbF9pbih1cCwgVUFSVF9NU1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXJldCA9IDA7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKQEAgLTc3MywyMiArNzcwLDIyIEBACiAKIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewogCWNhc2UgQ1M1OgotCQljdmFsID0gMHgwMDsKKwkJY3ZhbCA9IFVBUlRfTENSX1dMRU41OwogCQlicmVhazsKIAljYXNlIENTNjoKLQkJY3ZhbCA9IDB4MDE7CisJCWN2YWwgPSBVQVJUX0xDUl9XTEVONjsKIAkJYnJlYWs7CiAJY2FzZSBDUzc6Ci0JCWN2YWwgPSAweDAyOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJY2FzZSBDUzg6Ci0JCWN2YWwgPSAweDAzOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjg7CiAJCWJyZWFrOwogCX0KIAogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQljdmFsIHw9IDB4MDQ7CisJCWN2YWwgfD0gVUFSVF9MQ1JfU1RPUDsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKIAkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7CiAJaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMgYi9kcml2ZXJzL3NlcmlhbC9jcG1fdWFydC9jcG1fdWFydF9jcG0xLmMKaW5kZXggZGUyNmNmNy4uNzkxMTkxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvY3BtX3VhcnQvY3BtX3VhcnRfY3BtMS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2NwbV91YXJ0L2NwbV91YXJ0X2NwbTEuYwpAQCAtOTQsMTIgKzk0LDQyIEBACiAJCSgoaW1tYXBfdCAqKUlNQVBfQUREUiktPmltX2lvcG9ydC5pb3BfcGFvZHIgJj0gfmlvYml0czsKIAl9CiAKKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisJLyogRW5hYmxlIFNNQzEgdHJhbnNjZWl2ZXJzICovCisJeworCQl2b2xhdGlsZSB1aW50IF9faW9tZW0gKmJjc3IxID0gaW9yZW1hcChCQ1NSMSwgNCk7CisJCXVpbnQgdG1wOworCisJCXRtcCA9IGluX2JlMzIoYmNzcjEpOworCQl0bXAgJj0gfkJDU1IxX1JTMjMyRU5fMTsKKwkJb3V0X2JlMzIoYmNzcjEsIHRtcCk7CisJCWlvdW5tYXAoYmNzcjEpOworCX0KKyNlbmRpZgorCiAJcGluZm8tPmJyZyA9IDE7CiB9CiAKIHZvaWQgc21jMl9saW5laWYoc3RydWN0IHVhcnRfY3BtX3BvcnQgKnBpbmZvKQogewotCS8qIFhYWCBTTUMyOiBpbnNlcnQgcG9ydCBjb25maWd1cmF0aW9uIGhlcmUgKi8KKyNpZmRlZiBDT05GSUdfTVBDODg1QURTCisJdm9sYXRpbGUgY3BtOHh4X3QgKmNwID0gY3BtcDsKKwl2b2xhdGlsZSB1aW50IF9faW9tZW0gKmJjc3IxOworCXVpbnQgdG1wOworCisJY3AtPmNwX3BlcGFyIHw9IDB4MDAwMDBjMDA7CisJY3AtPmNwX3BlZGlyICY9IH4weDAwMDAwYzAwOworCWNwLT5jcF9wZXNvICY9IH4weDAwMDAwNDAwOworCWNwLT5jcF9wZXNvIHw9IDB4MDAwMDA4MDA7CisKKwkvKiBFbmFibGUgU01DMiB0cmFuc2NlaXZlcnMgKi8KKwliY3NyMSA9IGlvcmVtYXAoQkNTUjEsIDQpOworCXRtcCA9IGluX2JlMzIoYmNzcjEpOworCXRtcCAmPSB+QkNTUjFfUlMyMzJFTl8yOworCW91dF9iZTMyKGJjc3IxLCB0bXApOworCWlvdW5tYXAoYmNzcjEpOworI2VuZGlmCisKIAlwaW5mby0+YnJnID0gMjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvaWNvbS5oIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5oCmluZGV4IDIzZGMwZjcuLjc5OGYxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2ljb20uaAorKysgYi9kcml2ZXJzL3NlcmlhbC9pY29tLmgKQEAgLTI4Niw1ICsyODYsMyBAQAogCXUzMglfX2lvbWVtICpnbG9iYWxfaW50X21hc2s7CiAJdW5zaWduZWQgbG9uZwlwcm9jZXNzb3JfaWQ7CiB9OwotCi0jZGVmaW5lIE1TRUNTX1RPX0pJRkZJRVMobXMpICgoKG1zKSpIWis5OTkpLzEwMDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pcDIyemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCmluZGV4IDNlYTQ2YzAuLmVhNWJmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lwMjJ6aWxvZy5jCkBAIC01MTgsMjcgKzUxOCwyOCBAQAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBpcDIyemlsb2dfcmVhZF9jaGFubmVsX3N0YXR1cyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB6aWxvZ19jaGFubmVsICpjaGFubmVsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwotCiAJY2hhbm5lbCA9IFpJTE9HX0NIQU5ORUxfRlJPTV9QT1JUKHBvcnQpOwogCXN0YXR1cyA9IHJlYWRiKCZjaGFubmVsLT5jb250cm9sKTsKIAlaU0RFTEFZKCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXAyMnppbG9nX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCXN0YXR1cyA9IGlwMjJ6aWxvZ19yZWFkX2NoYW5uZWxfc3RhdHVzKHBvcnQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCiAJaWYgKHN0YXR1cyAmIFR4X0JVRl9FTVApCiAJCXJldCA9IFRJT0NTRVJfVEVNVDsKIAllbHNlCkBAIC01NDcsNyArNTQ4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLiAgKi8KKy8qIFRoZSBwb3J0IGxvY2sgaXMgaGVsZCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBpcDIyemlsb2dfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tMzJyX3Npby5jIGIvZHJpdmVycy9zZXJpYWwvbTMycl9zaW8uYwppbmRleCAwOGQ2MWYxLi4wMzAxZmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9tMzJyX3Npby5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL20zMnJfc2lvLmMKQEAgLTcyNCwyMiArNzI0LDIyIEBACiAKIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewogCWNhc2UgQ1M1OgotCQljdmFsID0gMHgwMDsKKwkJY3ZhbCA9IFVBUlRfTENSX1dMRU41OwogCQlicmVhazsKIAljYXNlIENTNjoKLQkJY3ZhbCA9IDB4MDE7CisJCWN2YWwgPSBVQVJUX0xDUl9XTEVONjsKIAkJYnJlYWs7CiAJY2FzZSBDUzc6Ci0JCWN2YWwgPSAweDAyOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJY2FzZSBDUzg6Ci0JCWN2YWwgPSAweDAzOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjg7CiAJCWJyZWFrOwogCX0KIAogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQljdmFsIHw9IDB4MDQ7CisJCWN2YWwgfD0gVUFSVF9MQ1JfU1RPUDsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKIAkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7CiAJaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9tcHNjLmMgYi9kcml2ZXJzL3NlcmlhbC9tcHNjLmMKaW5kZXggYTgzMTRhZS4uZTQzMjc2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvbXBzYy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL21wc2MuYwpAQCAtNjcsNyArNjcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBtcHNjX3BvcnRfaW5mbyBtcHNjX3BvcnRzW01QU0NfTlVNX0NUTFJTXTsKIHN0YXRpYyBzdHJ1Y3QgbXBzY19zaGFyZWRfcmVncyBtcHNjX3NoYXJlZF9yZWdzOworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBtcHNjX3JlZzsKIAorc3RhdGljIHZvaWQgbXBzY19zdGFydF9yeChzdHJ1Y3QgbXBzY19wb3J0X2luZm8gKnBpKTsKK3N0YXRpYyB2b2lkIG1wc2NfZnJlZV9yaW5nX21lbShzdHJ1Y3QgbXBzY19wb3J0X2luZm8gKnBpKTsKK3N0YXRpYyB2b2lkIG1wc2NfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwogLyoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01NDYsNyArNTUwLDYgQEAKIG1wc2NfYWxsb2NfcmluZ19tZW0oc3RydWN0IG1wc2NfcG9ydF9pbmZvICpwaSkKIHsKIAlpbnQgcmMgPSAwOwotCXN0YXRpYyB2b2lkIG1wc2NfZnJlZV9yaW5nX21lbShzdHJ1Y3QgbXBzY19wb3J0X2luZm8gKnBpKTsKIAogCXByX2RlYnVnKCJtcHNjX2FsbG9jX3JpbmdfbWVtWyVkXTogQWxsb2NhdGluZyByaW5nIG1lbVxuIiwKIAkJcGktPnBvcnQubGluZSk7CkBAIC03NDUsNyArNzQ4LDYgQEAKIAlpbnQJcmMgPSAwOwogCXU4CSpicDsKIAljaGFyCWZsYWcgPSBUVFlfTk9STUFMOwotCXN0YXRpYyB2b2lkIG1wc2Nfc3RhcnRfcngoc3RydWN0IG1wc2NfcG9ydF9pbmZvICpwaSk7CiAKIAlwcl9kZWJ1ZygibXBzY19yeF9pbnRyWyVkXTogSGFuZGxpbmcgUnggaW50clxuIiwgcGktPnBvcnQubGluZSk7CiAKQEAgLTEwNTYsMTIgKzEwNTgsOSBAQAogewogCXN0cnVjdCBtcHNjX3BvcnRfaW5mbyAqcGkgPSAoc3RydWN0IG1wc2NfcG9ydF9pbmZvICopcG9ydDsKIAl1MzIgbWZsYWdzLCBzdGF0dXM7Ci0JdWxvbmcgaWZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBpLT5wb3J0LmxvY2ssIGlmbGFncyk7CiAJc3RhdHVzID0gKHBpLT5taXJyb3JfcmVncykgPyBwaS0+TVBTQ19DSFJfMTBfbSA6CiAJCXJlYWRsKHBpLT5tcHNjX2Jhc2UgKyBNUFNDX0NIUl8xMCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGktPnBvcnQubG9jaywgaWZsYWdzKTsKIAogCW1mbGFncyA9IDA7CiAJaWYgKHN0YXR1cyAmIDB4MSkKQEAgLTExNzgsNyArMTE3Nyw2IEBACiBtcHNjX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IG1wc2NfcG9ydF9pbmZvICpwaSA9IChzdHJ1Y3QgbXBzY19wb3J0X2luZm8gKilwb3J0OwotCXN0YXRpYyB2b2lkIG1wc2NfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwogCiAJcHJfZGVidWcoIm1wc2Nfc2h1dGRvd25bJWRdOiBTaHV0dGluZyBkb3duIE1QU0NcbiIsIHBvcnQtPmxpbmUpOwogCkBAIC0xNDQ4LDcgKzE0NDYsNiBAQAogCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKCZwaS0+cG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgdWFydF9kcml2ZXIgbXBzY19yZWc7CiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgbXBzY19jb25zb2xlID0gewogCS5uYW1lICAgPSBNUFNDX0RFVl9OQU1FLAogCS53cml0ZSAgPSBtcHNjX2NvbnNvbGVfd3JpdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9wbWFjX3ppbG9nLmMKaW5kZXggODVhYmQ4YS4uN2RiMmYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcG1hY196aWxvZy5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3BtYWNfemlsb2cuYwpAQCAtNjA0LDcgKzYwNCw3IEBACiAvKiAKICAqIEdldCBNb2RlbSBDb250cm9sIGJpdHMgKG9ubHkgdGhlIGlucHV0IG9uZXMsIHRoZSBjb3JlIHdpbGwKICAqIG9yIHRoYXQgd2l0aCBhIGNhY2hlZCB2YWx1ZSBvZiB0aGUgY29udHJvbCBvbmVzKQotICogVGhlIHBvcnQgbG9jayBpcyBub3QgaGVsZC4KKyAqIFRoZSBwb3J0IGxvY2sgaXMgaGVsZCBhbmQgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgcG16X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewpAQCAtNjE1LDcgKzYxNSw3IEBACiAJaWYgKFpTX0lTX0FTTEVFUCh1YXApIHx8IHVhcC0+bm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCXN0YXR1cyA9IHBtel9wZWVrX3N0YXR1cyh0b19wbXoocG9ydCkpOworCXN0YXR1cyA9IHJlYWRfenNyZWcodWFwLCBSMCk7CiAKIAlyZXQgPSAwOwogCWlmIChzdGF0dXMgJiBEQ0QpCkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogLyoKICAqIENhbGxlZCB1cG9uIG1hdGNoIHdpdGggYW4gZXNjYyBub2RlIGluIHRoZSBkZXZpdmUtdHJlZS4KICAqLwotc3RhdGljIGludCBwbXpfYXR0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IHBtel9hdHRhY2goc3RydWN0IG1hY2lvX2RldiAqbWRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7CiAJaW50IGk7CiAJCkBAIC0xODUwLDIwICsxODUwLDE3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX21hdGNoIHBtel9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwbXpfbWF0Y2hbXSA9IAogewogCXsKIAkubmFtZSAJCT0gImNoLWEiLAotCS50eXBlCQk9IE9GX0FOWV9NQVRDSCwKLQkuY29tcGF0aWJsZQk9IE9GX0FOWV9NQVRDSAogCX0sCiAJewogCS5uYW1lIAkJPSAiY2gtYiIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENICiAJfSwKIAl7fSwKIH07CitNT0RVTEVfREVWSUNFX1RBQkxFIChvZiwgcG16X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBtYWNpb19kcml2ZXIgcG16X2RyaXZlciA9IAogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvcHhhLmMgYi9kcml2ZXJzL3NlcmlhbC9weGEuYwppbmRleCA5ZGMxNTFkLi40NjFjODFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9weGEuYworKysgYi9kcml2ZXJzL3NlcmlhbC9weGEuYwpAQCAtMjc0LDE0ICsyNzQsMTEgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsX3B4YV9nZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdWFydF9weGFfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfcHhhX3BvcnQgKilwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAJdW5zaWduZWQgaW50IHJldDsKIAogcmV0dXJuIFRJT0NNX0NUUyB8IFRJT0NNX0RTUiB8IFRJT0NNX0NBUjsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCXN0YXR1cyA9IHNlcmlhbF9pbih1cCwgVUFSVF9NU1IpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCXJldCA9IDA7CiAJaWYgKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkKQEAgLTQ1NSwyMiArNDUyLDIyIEBACiAKIAlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgewogCWNhc2UgQ1M1OgotCQljdmFsID0gMHgwMDsKKwkJY3ZhbCA9IFVBUlRfTENSX1dMRU41OwogCQlicmVhazsKIAljYXNlIENTNjoKLQkJY3ZhbCA9IDB4MDE7CisJCWN2YWwgPSBVQVJUX0xDUl9XTEVONjsKIAkJYnJlYWs7CiAJY2FzZSBDUzc6Ci0JCWN2YWwgPSAweDAyOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJY2FzZSBDUzg6Ci0JCWN2YWwgPSAweDAzOworCQljdmFsID0gVUFSVF9MQ1JfV0xFTjg7CiAJCWJyZWFrOwogCX0KIAogCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQljdmFsIHw9IDB4MDQ7CisJCWN2YWwgfD0gVUFSVF9MQ1JfU1RPUDsKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKIAkJY3ZhbCB8PSBVQVJUX0xDUl9QQVJJVFk7CiAJaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKaW5kZXggMmE5ZjdhZC4uNzM2NWQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKIC8qIHRyYW5zbGF0ZSBhIHBvcnQgdG8gdGhlIGRldmljZSBuYW1lICovCiAKLXN0YXRpYyBpbmxpbmUgY2hhciAqczNjMjR4eF9zZXJpYWxfcG9ydG5hbWUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqczNjMjR4eF9zZXJpYWxfcG9ydG5hbWUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlyZXR1cm4gdG9fcGxhdGZvcm1fZGV2aWNlKHBvcnQtPmRldiktPm5hbWU7CiB9CkBAIC01MjIsMTQgKzUyMiwxMSBAQAogc3RhdGljIGludCBzM2MyNHh4X3NlcmlhbF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHMzYzI0eHhfdWFydF9wb3J0ICpvdXJwb3J0ID0gdG9fb3VycG9ydChwb3J0KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKIAlkYmcoInMzYzI0eHhfc2VyaWFsX3N0YXJ0dXA6IHBvcnQ9JXAgKCUwOGx4LCVwKVxuIiwKIAkgICAgcG9ydC0+bWFwYmFzZSwgcG9ydC0+bWVtYmFzZSk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAlyeF9lbmFibGVkKHBvcnQpID0gMTsKIAogCXJldCA9IHJlcXVlc3RfaXJxKFJYX0lSUShwb3J0KSwKQEAgLTU2MywxMiArNTYwLDEwIEBACiAJLyogdGhlIHBvcnQgcmVzZXQgY29kZSBzaG91bGQgaGF2ZSBkb25lIHRoZSBjb3JyZWN0CiAJICogcmVnaXN0ZXIgc2V0dXAgZm9yIHRoZSBwb3J0IGNvbnRyb2xzICovCiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIHJldDsKIAogIGVycjoKIAlzM2MyNHh4X3NlcmlhbF9zaHV0ZG93bihwb3J0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTAzLDcgKzg5OCw3IEBACiAKIHN0YXRpYyBpbnQgczNjMjR4eF9zZXJpYWxfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JY2hhciAqbmFtZSA9IHMzYzI0eHhfc2VyaWFsX3BvcnRuYW1lKHBvcnQpOworCWNvbnN0IGNoYXIgKm5hbWUgPSBzM2MyNHh4X3NlcmlhbF9wb3J0bmFtZShwb3J0KTsKIAlyZXR1cm4gcmVxdWVzdF9tZW1fcmVnaW9uKHBvcnQtPm1hcGJhc2UsIE1BUF9TSVpFLCBuYW1lKSA/IDAgOiAtRUJVU1k7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IDM2YjFhZTAuLjU0Njk5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NvcmUuYwpAQCAtMTgyLDYgKzE4MiwxMyBAQAogCQkJCXVhcnRfc2V0X21jdHJsKHBvcnQsIFRJT0NNX1JUUyB8IFRJT0NNX0RUUik7CiAJCX0KIAorCQlpZiAoaW5mby0+ZmxhZ3MgJiBVSUZfQ1RTX0ZMT1cpIHsKKwkJCXNwaW5fbG9ja19pcnEoJnBvcnQtPmxvY2spOworCQkJaWYgKCEocG9ydC0+b3BzLT5nZXRfbWN0cmwocG9ydCkgJiBUSU9DTV9DVFMpKQorCQkJCWluZm8tPnR0eS0+aHdfc3RvcHBlZCA9IDE7CisJCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworCQl9CisKIAkJaW5mby0+ZmxhZ3MgfD0gVUlGX0lOSVRJQUxJWkVEOwogCiAJCWNsZWFyX2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKQEAgLTgyOCw3ICs4MzUsMTAgQEAKIAlpZiAoKCFmaWxlIHx8ICF0dHlfaHVuZ191cF9wKGZpbGUpKSAmJgogCSAgICAhKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewogCQlyZXN1bHQgPSBwb3J0LT5tY3RybDsKKworCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKIAkJcmVzdWx0IHw9IHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpOworCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwogCX0KIAl1cCgmc3RhdGUtPnNlbSk7CiAKQEAgLTExMzEsNiArMTE0MSwxNiBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOwogCX0KIAorCS8qIEhhbmRsZSB0dXJuaW5nIG9uIENSVFNDVFMgKi8KKwlpZiAoIShvbGRfdGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpICYmIChjZmxhZyAmIENSVFNDVFMpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+cG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoIShzdGF0ZS0+cG9ydC0+b3BzLT5nZXRfbWN0cmwoc3RhdGUtPnBvcnQpICYgVElPQ01fQ1RTKSkgeworCQkJdHR5LT5od19zdG9wcGVkID0gMTsKKwkJCXN0YXRlLT5wb3J0LT5vcHMtPnN0b3BfdHgoc3RhdGUtPnBvcnQsIDApOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5wb3J0LT5sb2NrLCBmbGFncyk7CisJfQorCiAjaWYgMAogCS8qCiAJICogTm8gbmVlZCB0byB3YWtlIHVwIHByb2Nlc3NlcyBpbiBvcGVuIHdhaXQsIHNpbmNlIHRoZXkKQEAgLTEzNjksNiArMTM4OSw3IEBACiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJc3RydWN0IHVhcnRfaW5mbyAqaW5mbyA9IHN0YXRlLT5pbmZvOwogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSBzdGF0ZS0+cG9ydDsKKwl1bnNpZ25lZCBpbnQgbWN0cmw7CiAKIAlpbmZvLT5ibG9ja2VkX29wZW4rKzsKIAlzdGF0ZS0+Y291bnQtLTsKQEAgLTE0MTYsNyArMTQzNywxMCBAQAogCQkgKiBhbmQgd2FpdCBmb3IgdGhlIGNhcnJpZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUKIAkJICogbW9kZW0gaXMgcmVhZHkgZm9yIHVzLgogCQkgKi8KLQkJaWYgKHBvcnQtPm9wcy0+Z2V0X21jdHJsKHBvcnQpICYgVElPQ01fQ0FSKQorCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJbWN0cmwgPSBwb3J0LT5vcHMtPmdldF9tY3RybChwb3J0KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKwkJaWYgKG1jdHJsICYgVElPQ01fQ0FSKQogCQkJYnJlYWs7CiAKIAkJdXAoJnN0YXRlLT5zZW0pOwpAQCAtMTYxOCw3ICsxNjQyLDkgQEAKIAogCWlmKGNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJeworCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKIAkJc3RhdHVzID0gcG9ydC0+b3BzLT5nZXRfbWN0cmwocG9ydCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAKIAkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiIHR4OiVkIHJ4OiVkIiwKIAkJCQlwb3J0LT5pY291bnQudHgsIHBvcnQtPmljb3VudC5yeCk7CkBAIC0xNzgyLDYgKzE4MDgsMTIgQEAKIAlzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwogCWludCBpOwogCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgc2VyaWFsIGNvbnNvbGUgbG9jayBpcyBpbml0aWFsaXNlZAorCSAqIGVhcmx5LgorCSAqLworCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKKwogCW1lbXNldCgmdGVybWlvcywgMCwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSk7CiAKIAl0ZXJtaW9zLmNfY2ZsYWcgPSBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOwpAQCAtMjE3MCwxMCArMjIwMiwxNiBAQAogCiAJc3RhdGUtPnBvcnQgPSBwb3J0OwogCi0Jc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOwogCXBvcnQtPmNvbnMgPSBkcnYtPmNvbnM7CiAJcG9ydC0+aW5mbyA9IHN0YXRlLT5pbmZvOwogCisJLyoKKwkgKiBJZiB0aGlzIHBvcnQgaXMgYSBjb25zb2xlLCB0aGVuIHRoZSBzcGlubG9jayBpcyBhbHJlYWR5CisJICogaW5pdGlhbGlzZWQuCisJICovCisJaWYgKCF1YXJ0X2NvbnNvbGUocG9ydCkpCisJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKKwogCXVhcnRfY29uZmlndXJlX3BvcnQoZHJ2LCBzdGF0ZSwgcG9ydCk7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2VyaWFsX2NzLmMgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYwppbmRleCAwZDdiNjVmLi5kZTAxMzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfY3MuYwpAQCAtNDUsNyArNDUsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotI2luY2x1ZGUgPHBjbWNpYS92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgpAQCAtMjMyLDExICsyMzEsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmc2VyaWFsX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtNzcyLDEzICs3NjYsMTIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCBzZXJpYWxfaWRzW10gPSB7CisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDA1NywgMHgwMDIxKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMDg5LCAweDExMGEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxMDQsIDB4MDAwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDEwNSwgMHhlYTE1KSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTA5LCAweDA1MDEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxMzgsIDB4MTEwYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDE0MCwgMHgwMDBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTQzLCAweDMzNDEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxNDMsIDB4YzBhYiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDE2YywgMHgwMDgxKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMjFiLCAweDAxMDEpLAorCVBDTUNJQV9QRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDA4YTEsIDB4YzBhYiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDEwNSwgMHgwZDBhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTA1LCAweDBlMGEpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMjMoMSwgIk1FR0FIRVJUWiIsICJDQy9YSkVNMzI4OCIsICJEQVRBL0ZBWC9DRUxMIEVUSEVSTkVUIE1PREVNIiwgMHhmNTEwZGIwNCwgMHgwNGNkMjk4OCwgMHg0NmE1MmQ2MyksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMygxLCAiTUVHQUhFUlRaIiwgIkNDL1hKRU0zMzM2IiwgIkRBVEEvRkFYL0NFTEwgRVRIRVJORVQgTU9ERU0iLCAweGY1MTBkYjA0LCAweDAxNDNiNzczLCAweDQ2YTUyZDYzKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIzKDEsICJNRUdBSEVSVFoiLCAiRU0xMTQ0VCIsICJQQ01DSUEgTU9ERU0iLCAweGY1MTBkYjA0LCAweDg1NmQ2NmM4LCAweGJkNmM0M2VmKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIzKDEsICJNRUdBSEVSVFoiLCAiWEpFTTExNDQvQ0NFTTExNDQiLCAiUENNQ0lBIE1PREVNIiwgMHhmNTEwZGIwNCwgMHg1MmQyMWUxZSwgMHhiZDZjNDNlZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDEsICJYaXJjb20iLCAiQ0VNMjgiLCAweDJlM2VlODQ1LCAweDBlYTk3OGVhKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMSwgIlhpcmNvbSIsICJDRU0zMyIsIDB4MmUzZWU4NDUsIDB4ODA2MDkwMjMpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMygxLCAiWGlyY29tIiwgIkNFTTU2IiwgMHgyZTNlZTg0NSwgMHhhNjUwYzMyYSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEzKDEsICJYaXJjb20iLCAiUkVNMTAiLCAweDJlM2VlODQ1LCAweDc2ZGYxZDI5KSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTMoMSwgIlhpcmNvbSIsICJYRU01NjAwIiwgMHgyZTNlZTg0NSwgMHhmMTQwMzcxOSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJBbnlDb20iLCAiRmFzdCBFdGhlcm5ldCAiLCAweDU3OGJhNmU3LCAweDAyZDkyZDFlKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIkQtTGluayIsICJETUUzMzZUIiwgMHgxYTQyNGExYywgMHhiMjM4OTdmZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJHYXRld2F5IDIwMDAiLCAiWEpFTTMzMzYiLCAweGRkOTk4OWJlLCAweDY2MmMzOTRjKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIkdyZXkgQ2VsbCIsICJHQ1MzMDAwIiwgMHgyYTE1MWZhYywgMHg0OGI5MzJhZSksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJMaW5rc3lzIiwgIkV0aGVyRmFzdCAxMCYxMDAgKyA1NksgUEMgQ2FyZCAoUENNTE01NikiLCAweDA3MzNjYzgxLCAweGIzNzY1MDMzKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIkxJTktTWVMiLCAiUENNTE0zMzYiLCAweGY3Y2IwYjA3LCAweDdhODIxYjU4KSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIk1FR0FIRVJUWiIsICJYSkVNMTE0NC9DQ0VNMTE0NCIsIDB4ZjUxMGRiMDQsIDB4NTJkMjFlMWUpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiT3NpdGVjaCIsICJUcnVtcGNhcmQiLCAweDBjMmY4MGNkLCAweDA1NzNjMjlmKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIk9zaXRlY2giLCAiVHJ1bXBjYXJkIiwgMHgwYzJmODBjZCwgMHgwNTczYzI5ZiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJQQ01DSUFzIiwgIkNvbWJvQ2FyZCIsIDB4ZGNmZTEyZDMsIDB4Y2Q4OTA2Y2MpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiUENNQ0lBcyIsICJMYW5Nb2RlbSIsIDB4ZGNmZTEyZDMsIDB4YzY3YzY0OGYpLAorCVBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMigxLCAiVERLIiwgIkdsb2JhbE5ldHdvcmtlciAzNDEwLzM0MTIiLCAweDFlYWU5NDc1LCAweGQ5YTkzYmVkKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIoMSwgIlhpcmNvbSIsICJDcmVkaXRDYXJkIEV0aGVybmV0IiwgMHgyZTNlZTg0NSwgMHhjMGU3NzhjMiksCisJUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDEwNCwgMHgwMDcwKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTAxLCAweDA1NjIpLAorCVBDTUNJQV9NRkNfREVWSUNFX01BTkZfQ0FSRCgxLCAweDAxMDQsIDB4MDA3MCksCisJUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKDEsIDB4MDE2YywgMHgwMDIwKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIzKDEsICJBUEVYIERBVEEiLCAiTVVMVElDQVJEIiwgIkVUSEVSTkVULU1PREVNIiwgMHgxMWMyZGEwOSwgMHg3Mjg5ZGM1ZCwgMHhhYWQ5NWUxZiksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJJQk0iLCAiSG9tZSBhbmQgQXdheSAyOC44IFBDIENhcmQgICAgICAgIiwgMHhiNTY5YTZlNSwgMHg1YmQ0ZmYyYyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJJQk0iLCAiSG9tZSBhbmQgQXdheSBDcmVkaXQgQ2FyZCBBZGFwdGVyIiwgMHhiNTY5YTZlNSwgMHg0YmRmMTVjMyksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDEsICJJQk0iLCAidzk1IEhvbWUgYW5kIEF3YXkgQ3JlZGl0IENhcmQgIiwgMHhiNTY5YTZlNSwgMHhhZTkxMWMxNSksCisJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEoMSwgIk1vdG9yb2xhIE1BUlFVSVMiLCAweGYwM2U0ZTc3KSwKKwlQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMigxLCAiRkFYL01vZGVtL0V0aGVybmV0IENvbWJvIENhcmQgIiwgMHgxZWQ1OTMwMiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMDg5LCAweDAzMDEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwMSwgMHgwMDM5KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDQsIDB4MDAwNiksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTA1LCAweDQxMGEpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwYiwgMHgwZDUwKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMGIsIDB4MGQ1MSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTBiLCAweDBkNTIpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEwYiwgMHgwZDUzKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMGIsIDB4ZDE4MCksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM3LCAweDAwMGUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzNywgMHgwMDFiKSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMzcsIDB4MDAyNSksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHgwMTM3LCAweDAwNDUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDEzNywgMHgwMDUyKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMzQoIkFEViIsICJURUNIIiwgIkNPTXBhZC0zMi84NSIsIDB4Njc0NTk5MzcsIDB4OTE2ZDAyYmEsIDB4OGZiZTkyYWUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyNCgiR0FURVdBWTIwMDAiLCAiQ0MzMTQ0IiwgIlBDTUNJQSBNT0RFTSIsIDB4NTA2YmNjYWUsIDB4Y2IzNjg1ZjEsIDB4YmQ2YzQzZWYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDE0KCJNRUdBSEVSVFoiLCAiUENNQ0lBIE1PREVNIiwgMHhmNTEwZGIwNCwgMHhiZDZjNDNlZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTI0KCJUT1NISUJBIiwgIlQxNDRQRiIsICJQQ01DSUEgTU9ERU0iLCAweGI0NTg1YTFhLCAweDcyNzE0MDljLCAweGJkNmM0M2VmKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoIkZVSklUU1UiLCAiRkMxNEYgIiwgIk1CSDEwMjEzIiwgMHg2ZWU1YTNkOCwgMHgzMGVhZDEyYiwgMHhiMDBmMDVhMCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTMoIk1FR0FIRVJUWiIsICJWLjM0IFBDTUNJQSBNT0RFTSIsIDB4ZjUxMGRiMDQsIDB4YmIyY2NlNGEpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJCcmFpbiBCb3hlcyIsICJCbHVldG9vdGggUEMgQ2FyZCIsIDB4ZWUxMzgzODIsIDB4ZDRjZTliMDIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDSVJSVVMgTE9HSUMiLCAiRkFYIE1PREVNIiwgMHhlNjI1ZjQ1MSwgMHhjZWNkNmRmYSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkNPTVBBUSIsICJQQ01DSUEgMjg4MDAgRkFYL0RBVEEgTU9ERU0iLCAweGEzYTMwNjJjLCAweDhjYmQ3Yzc2KSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiQ09NUEFRIiwgIlBDTUNJQSAzMzYwMCBGQVgvREFUQSBNT0RFTSIsIDB4YTNhMzA2MmMsIDB4NWEwMGNlOTUpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJDb21wdXRlcmJvYXJkcywgSW5jLiIsICJQQ00tQ09NNDIyIiwgMHhkMGI3OGY1MSwgMHg3ZTJkNDllZCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkRyLiBOZXVoYXVzIiwgIkZVUlkgQ0FSRCAxNEs0IiwgMHg3Njk0MjgxMywgMHg4Yjk2Y2U2NSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIkludGVsbGlnZW50IiwgIkFOR0lBIEZBWC9NT0RFTSIsIDB4YjQ5NmU2NWUsIDB4ZjMxNjAyYTYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJJbnRlbCIsICJNT0RFTSAyNDAwIiwgMHg4MTZjYzgxNSwgMHgyMzUzOWI4MCksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIklPVGVjaCBJbmMgIiwgIlBDTUNJQSBEdWFsIFJTLTIzMiBTZXJpYWwgUG9ydCBDYXJkIiwgMHgzYmQyZDg5OCwgMHg5MmFiYzkyZiksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk1BQ1JPTklYIiwgIkZBWC9NT0RFTSIsIDB4NjY4Mzg4YjMsIDB4M2Y5YmRmMmYpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJNdWx0aS1UZWNoIiwgIk1UMTQzMkxUIiwgMHg1ZjczYmU1MSwgMHgwYjNlMjM4MyksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIk11bHRpLVRlY2giLCAiTVQyODM0TFQiLCAweDVmNzNiZTUxLCAweDRjZDdjMDllKSwKKwlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiT0VNICAgICAgIiwgIkMyODhNWCAgICAgIiwgMHhiNTcyZDM2MCwgMHhkMjM4NWI3YSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlBDTUNJQSAgICIsICJDMzM2TVggICAgICIsIDB4OTliY2FmZTksIDB4YWEyNWJjYWIpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJRdWF0ZWNoIEluYyIsICJQQ01DSUEgRHVhbCBSUy0yMzIgU2VyaWFsIFBvcnQgQ2FyZCIsIDB4YzQ0MjBiMzUsIDB4OTJhYmM5MmYpLAorCVBDTUNJQV9QRkNfREVWSUNFX0NJU19QUk9EX0lEMTIoMSwgIlBDTUNJQSIsICJFTjIyMTgtTEFOL01PREVNIiwgMHgyODFmMWM1ZCwgMHg1NzBmMzQ4ZSwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiUENNQ0lBIiwgIlVFMjIxOC1MQU4vTU9ERU0iLCAweDI4MWYxYzVkLCAweDZmZGNhY2VlLCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDEsICJQc2lvbiBEYWNvbSIsICJHb2xkIENhcmQgVjM0IEV0aGVybmV0IiwgMHhmNWYwMjVjMiwgMHgzMzhlODE1NSwgIlBDTUxNMjguY2lzIiksCisJUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMigxLCAiUHNpb24gRGFjb20iLCAiR29sZCBDYXJkIFYzNCBFdGhlcm5ldCBHU00iLCAweGY1ZjAyNWMyLCAweDRhZTg1ZDM1LCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfUEZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDEsICJMSU5LU1lTIiwgIlBDTUxNMjgiLCAweGY3Y2IwYjA3LCAweDY2ODgxODc0LCAiUENNTE0yOC5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfUFJPRF9JRDEyKDEsICJEQVlOQSBDT01NVU5JQ0FUSU9OUyIsICJMQU4gQU5EIE1PREVNIE1VTFRJRlVOQ1RJT04iLCAweDhmZGY4Zjg5LCAweGRkNWVkOWU4LCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfUFJPRF9JRDQoMSwgIk5TQyBNRiBMQU4vTW9kZW0iLCAweDU4ZmM2MDU2LCAiRFA4MzkwMy5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwNTU2LCAiM0NDRkVNNTU2LmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMSwgMHgwMTc1LCAweDAwMDAsICJEUDgzOTAzLmNpcyIpLAorCVBDTUNJQV9NRkNfREVWSUNFX0NJU19NQU5GX0NBUkQoMSwgMHgwMTAxLCAweDAwMzUsICIzQ1hFTTU1Ni5jaXMiKSwKKwlQQ01DSUFfTUZDX0RFVklDRV9DSVNfTUFORl9DQVJEKDEsIDB4MDEwMSwgMHgwMDNkLCAiM0NYRU01NTYuY2lzIiksCisJUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKCJNdWx0aVRlY2giLCAiUENNQ0lBIDU2SyBEYXRhRmF4IiwgMHg4NDIwNDdlZSwgMHhjMmVmY2YwMywgIk1UNTYzNFpMWC5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIoIkFEVkFOVEVDSCIsICJDT01wYWQtMzIvODVCLTQiLCAweDk2OTEzYTg1LCAweGNlYzhmMTAyLCAiQ09NcGFkNC5jaXMiKSwKKwlQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIzKCJBRFZBTlRFQ0giLCAiQ09NcGFkLTMyLzg1IiwgIjEuMCIsIDB4OTY5MTNhODUsIDB4OGZiZTkyYWUsIDB4MDg3N2I2MjcsICJDT01wYWQyLmNpcyIpLAorCVBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQyKCJSUy1DT00gMlAiLCAweGFkMjBiMTU2LCAiUlMtQ09NLTJQLmNpcyIpLAorCS8qIHRvbyBnZW5lcmljICovCisJLyogUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKDAsIDB4MDE2MCwgMHgwMDAyKSwgKi8KKwkvKiBQQ01DSUFfTUZDX0RFVklDRV9NQU5GX0NBUkQoMSwgMHgwMTYwLCAweDAwMDIpLCAqLworCVBDTUNJQV9ERVZJQ0VfRlVOQ19JRCgyKSwKKwlQQ01DSUFfREVWSUNFX05VTEwsCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHNlcmlhbF9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgc2VyaWFsX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gInNlcmlhbF9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IHNlcmlhbF9hdHRhY2gsCisJLmV2ZW50CQk9IHNlcmlhbF9ldmVudCwKIAkuZGV0YWNoCQk9IHNlcmlhbF9kZXRhY2gsCisJLmlkX3RhYmxlCT0gc2VyaWFsX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfc2VyaWFsX2NzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jIGIvZHJpdmVycy9zZXJpYWwvc2VyaWFsX3R4eDkuYwppbmRleCAzZjEwNTFhLi5kMDg1MDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zZXJpYWxfdHh4OS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3NlcmlhbF90eHg5LmMKQEAgLTQ0MiwxMyArNDQyLDEwIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNlcmlhbF90eHg5X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3R4eDlfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfdHh4OV9wb3J0ICopcG9ydDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCXJldCA9ICAoKHNpb19pbih1cCwgVFhYOV9TSUZMQ1IpICYgVFhYOV9TSUZMQ1JfUlRTU0MpID8gMCA6IFRJT0NNX1JUUykKIAkJfCAoKHNpb19pbih1cCwgVFhYOV9TSUNJU1IpICYgVFhYOV9TSUNJU1JfQ1RTUykgPyAwIDogVElPQ01fQ1RTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwppbmRleCAxMGUyOTkwLi44ZDE5ODg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW5zYWIuYwpAQCAtNDI2LDE4ICs0MjYsMTUgQEAKIAkJc3Vuc2FiX3R4X2lkbGUodXApOwogfQogCi0vKiBwb3J0LT5sb2NrIGlzIG5vdCBoZWxkLiAgKi8KKy8qIHBvcnQtPmxvY2sgaXMgaGVsZCBieSBjYWxsZXIgYW5kIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3Vuc2FiX2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0X3N1bnNhYl9wb3J0ICp1cCA9IChzdHJ1Y3QgdWFydF9zdW5zYWJfcG9ydCAqKSBwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciB2YWw7CiAJdW5zaWduZWQgaW50IHJlc3VsdDsKIAogCXJlc3VsdCA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwotCiAJdmFsID0gcmVhZGIoJnVwLT5yZWdzLT5yLnB2cik7CiAJcmVzdWx0IHw9ICh2YWwgJiB1cC0+cHZyX2Rzcl9iaXQpID8gMCA6IFRJT0NNX0RTUjsKIApAQCAtNDQ3LDggKzQ0NCw2IEBACiAJdmFsID0gcmVhZGIoJnVwLT5yZWdzLT5yLnN0YXIpOwogCXJlc3VsdCB8PSAodmFsICYgU0FCODI1MzJfU1RBUl9DVFMpID8gVElPQ01fQ1RTIDogMDsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVwLT5wb3J0LmxvY2ssIGZsYWdzKTsKLQogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCmluZGV4IGRkYzk3YzkuLmQ1N2EzNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwpAQCAtNTcyLDEzICs1NzIsMTAgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3Vuc3VfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVhcnRfc3Vuc3VfcG9ydCAqdXAgPSAoc3RydWN0IHVhcnRfc3Vuc3VfcG9ydCAqKSBwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CiAJdW5zaWduZWQgaW50IHJldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ1cC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJc3RhdHVzID0gc2VyaWFsX2luKHVwLCBVQVJUX01TUik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXAtPnBvcnQubG9jaywgZmxhZ3MpOwogCiAJcmV0ID0gMDsKIAlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYyBiL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKaW5kZXggNWM0MjMxYS4uYmZmNDJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCkBAIC02MTAsMjcgKzYxMCwyOCBAQAogc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBzdW56aWxvZ19yZWFkX2NoYW5uZWxfc3RhdHVzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHppbG9nX2NoYW5uZWwgX19pb21lbSAqY2hhbm5lbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQogCWNoYW5uZWwgPSBaSUxPR19DSEFOTkVMX0ZST01fUE9SVChwb3J0KTsKIAlzdGF0dXMgPSBzYnVzX3JlYWRiKCZjaGFubmVsLT5jb250cm9sKTsKIAlaU0RFTEFZKCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBUaGUgcG9ydCBsb2NrIGlzIG5vdCBoZWxkLiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3Vuemlsb2dfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCiAJc3RhdHVzID0gc3Vuemlsb2dfcmVhZF9jaGFubmVsX3N0YXR1cyhwb3J0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChzdGF0dXMgJiBUeF9CVUZfRU1QKQogCQlyZXQgPSBUSU9DU0VSX1RFTVQ7CiAJZWxzZQpAQCAtNjM5LDcgKzY0MCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogVGhlIHBvcnQgbG9jayBpcyBub3QgaGVsZC4gICovCisvKiBUaGUgcG9ydCBsb2NrIGlzIGhlbGQgYW5kIGludGVycnVwdHMgYXJlIGRpc2FibGVkLiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3Vuemlsb2dfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJdW5zaWduZWQgY2hhciBzdGF0dXM7CkBAIC0xMDcxLDcgKzEwNzIsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IHppbG9nX2xheW91dCBfX2lvbWVtICogX19pbml0IGdldF96c19zdW40dShpbnQgY2hpcCwgaW50IHpzbm9kZSkKIHsKLQl1bnNpZ25lZCBsb25nIG1hcHBlZF9hZGRyOworCXZvaWQgX19pb21lbSAqbWFwcGVkX2FkZHI7CiAJdW5zaWduZWQgaW50IHN1bjR1X2lubzsKIAlzdHJ1Y3Qgc2J1c19idXMgKnNidXMgPSBOVUxMOwogCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IE5VTEw7CkBAIC0xMTExLDkgKzExMTIsOSBAQAogCQlhcHBseV9maGNfcmFuZ2VzKGNlbnRyYWxfYnVzLT5jaGlsZCwKIAkJCQkgJnpzcmVnc1swXSwgMSk7CiAJCWFwcGx5X2NlbnRyYWxfcmFuZ2VzKGNlbnRyYWxfYnVzLCAmenNyZWdzWzBdLCAxKTsKLQkJbWFwcGVkX2FkZHIgPQotCQkJKCgodTY0KXpzcmVnc1swXS53aGljaF9pbyk8PDMyVUwpIHwKLQkJCSgodTY0KXpzcmVnc1swXS5waHlzX2FkZHIpOworCQltYXBwZWRfYWRkciA9ICh2b2lkIF9faW9tZW0gKikKKwkJCSgoKCh1NjQpenNyZWdzWzBdLndoaWNoX2lvKTw8MzJVTCkgfAorCQkJKCh1NjQpenNyZWdzWzBdLnBoeXNfYWRkcikpOwogCX0KIAogCWlmICh6aWxvZ19pcnEgPT0gLTEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4ai5jIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKaW5kZXggZDU4NjNiOC4uZjJjOWZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqLmMKQEAgLTMyOSwxMCArMzI5LDggQEAKIAogc3RhdGljIHZvaWQgaXhqX2Zza19mcmVlKElYSiAqaikKIHsKLQlpZihqLT5mc2tkYXRhICE9IE5VTEwpIHsKLQkJa2ZyZWUoai0+ZnNrZGF0YSk7Ci0JCWotPmZza2RhdGEgPSBOVUxMOwotCX0KKwlrZnJlZShqLT5mc2tkYXRhKTsKKwlqLT5mc2tkYXRhID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgaXhqX2Zza19hbGxvYyhJWEogKmopCkBAIC0zODY3LDEzICszODY1LDExIEBACiAJCWotPnJlY19tb2RlID0gNzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJa2ZyZWUoai0+cmVhZF9idWZmZXIpOwogCQlqLT5yZWNfZnJhbWVfc2l6ZSA9IDA7CiAJCWotPnJlY19tb2RlID0gLTE7Ci0JCWlmIChqLT5yZWFkX2J1ZmZlcikgewotCQkJa2ZyZWUoai0+cmVhZF9idWZmZXIpOwotCQkJai0+cmVhZF9idWZmZXIgPSBOVUxMOwotCQkJai0+cmVhZF9idWZmZXJfc2l6ZSA9IDA7Ci0JCX0KKwkJai0+cmVhZF9idWZmZXIgPSBOVUxMOworCQlqLT5yZWFkX2J1ZmZlcl9zaXplID0gMDsKIAkJcmV0dmFsID0gMTsKIAkJYnJlYWs7CiAJfQpAQCAtMzk5MSwxNCArMzk4NywxMiBAQAogCiBzdGF0aWMgdm9pZCBpeGpfcmVjb3JkX3N0b3AoSVhKICpqKQogewotCWlmKGl4amRlYnVnICYgMHgwMDAyKQorCWlmIChpeGpkZWJ1ZyAmIDB4MDAwMikKIAkJcHJpbnRrKCJJWEogJWQgU3RvcHBpbmcgUmVjb3JkIENvZGVjICVkIGF0ICVsZFxuIiwgai0+Ym9hcmQsIGotPnJlY19jb2RlYywgamlmZmllcyk7CiAKLQlpZiAoai0+cmVhZF9idWZmZXIpIHsKLQkJa2ZyZWUoai0+cmVhZF9idWZmZXIpOwotCQlqLT5yZWFkX2J1ZmZlciA9IE5VTEw7Ci0JCWotPnJlYWRfYnVmZmVyX3NpemUgPSAwOwotCX0KKwlrZnJlZShqLT5yZWFkX2J1ZmZlcik7CisJai0+cmVhZF9idWZmZXIgPSBOVUxMOworCWotPnJlYWRfYnVmZmVyX3NpemUgPSAwOwogCWlmIChqLT5yZWNfbW9kZSA+IC0xKSB7CiAJCWl4al9Xcml0ZURTUENvbW1hbmQoMHg1MTIwLCBqKTsKIAkJai0+cmVjX21vZGUgPSAtMTsKQEAgLTQ0NDksMTMgKzQ0NDMsMTEgQEAKIAkJai0+cGxheV9tb2RlID0gNTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJa2ZyZWUoai0+d3JpdGVfYnVmZmVyKTsKIAkJai0+cGxheV9mcmFtZV9zaXplID0gMDsKIAkJai0+cGxheV9tb2RlID0gLTE7Ci0JCWlmIChqLT53cml0ZV9idWZmZXIpIHsKLQkJCWtmcmVlKGotPndyaXRlX2J1ZmZlcik7Ci0JCQlqLT53cml0ZV9idWZmZXIgPSBOVUxMOwotCQkJai0+d3JpdGVfYnVmZmVyX3NpemUgPSAwOwotCQl9CisJCWotPndyaXRlX2J1ZmZlciA9IE5VTEw7CisJCWotPndyaXRlX2J1ZmZlcl9zaXplID0gMDsKIAkJcmV0dmFsID0gMTsKIAkJYnJlYWs7CiAJfQpAQCAtNDU3OCwxNCArNDU3MCwxMiBAQAogCiBzdGF0aWMgdm9pZCBpeGpfcGxheV9zdG9wKElYSiAqaikKIHsKLQlpZihpeGpkZWJ1ZyAmIDB4MDAwMikKKwlpZiAoaXhqZGVidWcgJiAweDAwMDIpCiAJCXByaW50aygiSVhKICVkIFN0b3BwaW5nIFBsYXkgQ29kZWMgJWQgYXQgJWxkXG4iLCBqLT5ib2FyZCwgai0+cGxheV9jb2RlYywgamlmZmllcyk7CiAKLQlpZiAoai0+d3JpdGVfYnVmZmVyKSB7Ci0JCWtmcmVlKGotPndyaXRlX2J1ZmZlcik7Ci0JCWotPndyaXRlX2J1ZmZlciA9IE5VTEw7Ci0JCWotPndyaXRlX2J1ZmZlcl9zaXplID0gMDsKLQl9CisJa2ZyZWUoai0+d3JpdGVfYnVmZmVyKTsKKwlqLT53cml0ZV9idWZmZXIgPSBOVUxMOworCWotPndyaXRlX2J1ZmZlcl9zaXplID0gMDsKIAlpZiAoai0+cGxheV9tb2RlID4gLTEpIHsKIAkJaXhqX1dyaXRlRFNQQ29tbWFuZCgweDUyMjEsIGopOwkvKiBTdG9wIHBsYXliYWNrIGFuZCBmbHVzaCBidWZmZXJzLiAgODAyMiByZWZlcmVuY2UgcGFnZSA5LTQwICovCiAKQEAgLTU4MTAsOSArNTgwMCw3IEBACiAJCWl4al9wbGF5X3RvbmUoaiwgMCk7CiAJCWotPnRvbmVfc3RhdGUgPSBqLT50b25lX2NhZGVuY2Vfc3RhdGUgPSAwOwogCQlpZiAoai0+Y2FkZW5jZV90KSB7Ci0JCQlpZiAoai0+Y2FkZW5jZV90LT5jZSkgewotCQkJCWtmcmVlKGotPmNhZGVuY2VfdC0+Y2UpOwotCQkJfQorCQkJa2ZyZWUoai0+Y2FkZW5jZV90LT5jZSk7CiAJCQlrZnJlZShqLT5jYWRlbmNlX3QpOwogCQkJai0+Y2FkZW5jZV90ID0gTlVMTDsKIAkJfQpAQCAtNzQ5NywxMCArNzQ4NSw4IEBACiAJCQkJCXByaW50ayhLRVJOX0lORk8gIklYSjogUmVsZWFzaW5nIFhJTElOWCBhZGRyZXNzIGZvciAvZGV2L3Bob25lJWRcbiIsIGNudCk7CiAJCQkJcmVsZWFzZV9yZWdpb24oai0+WElMSU5YYmFzZSwgNCk7CiAJCQl9Ci0JCQlpZiAoai0+cmVhZF9idWZmZXIpCi0JCQkJa2ZyZWUoai0+cmVhZF9idWZmZXIpOwotCQkJaWYgKGotPndyaXRlX2J1ZmZlcikKLQkJCQlrZnJlZShqLT53cml0ZV9idWZmZXIpOworCQkJa2ZyZWUoai0+cmVhZF9idWZmZXIpOworCQkJa2ZyZWUoai0+d3JpdGVfYnVmZmVyKTsKIAkJCWlmIChqLT5kZXYpCiAJCQkJcG5wX2RldmljZV9kZXRhY2goai0+ZGV2KTsKIAkJCWlmIChpeGpkZWJ1ZyAmIDB4MDAwMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYyBiL2RyaXZlcnMvdGVsZXBob255L2l4al9wY21jaWEuYwppbmRleCBlMWVmMGQ3Li41N2MwYzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RlbGVwaG9ueS9peGpfcGNtY2lhLmMKKysrIGIvZHJpdmVycy90ZWxlcGhvbnkvaXhqX3BjbWNpYS5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlIDxwY21jaWEvY3NfdHlwZXMuaD4KICNpbmNsdWRlIDxwY21jaWEvY3MuaD4KICNpbmNsdWRlIDxwY21jaWEvY2lzdHBsLmg+CkBAIC02OSwxMSArNjgsNiBAQAogCWxpbmstPm5leHQgPSBkZXZfbGlzdDsKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JICAgIENTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkgICAgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkgICAgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmaXhqX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCXJldCA9IHBjbWNpYV9yZWdpc3Rlcl9jbGllbnQoJmxpbmstPmhhbmRsZSwgJmNsaWVudF9yZWcpOwpAQCAtMjk1LDEzICsyODksMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIGl4al9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAyNTcsIDB4MDYwMCksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIGl4al9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgaXhqX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gIml4al9jcyIsCiAJfSwKIAkuYXR0YWNoCQk9IGl4al9hdHRhY2gsCisJLmV2ZW50CQk9IGl4al9ldmVudCwKIAkuZGV0YWNoCQk9IGl4al9kZXRhY2gsCisJLmlkX3RhYmxlCT0gaXhqX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGl4al9wY21jaWFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQppbmRleCBhNjFkNDQzLi5kZjAxNGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9NYWtlZmlsZQpAQCAtOSw2ICs5LDcgQEAKIG9iai0kKENPTkZJR19VU0JfTU9OKQkJKz0gbW9uLwogCiBvYmotJChDT05GSUdfVVNCX0VIQ0lfSENEKQkrPSBob3N0Lworb2JqLSQoQ09ORklHX1VTQl9JU1AxMTZYX0hDRCkJKz0gaG9zdC8KIG9iai0kKENPTkZJR19VU0JfT0hDSV9IQ0QpCSs9IGhvc3QvCiBvYmotJChDT05GSUdfVVNCX1VIQ0lfSENEKQkrPSBob3N0Lwogb2JqLSQoQ09ORklHX1VTQl9TTDgxMV9IQ0QpCSs9IGhvc3QvCkBAIC0zMSw2ICszMiw3IEBACiBvYmotJChDT05GSUdfVVNCX01UT1VDSCkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX1BPV0VSTUFURSkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX1dBQ09NKQkJKz0gaW5wdXQvCitvYmotJChDT05GSUdfVVNCX0FDRUNBRCkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX1hQQUQpCQkrPSBpbnB1dC8KIAogb2JqLSQoQ09ORklHX1VTQl9EQUJVU0IpCSs9IG1lZGlhLwpAQCAtNjMsMTIgKzY1LDE0IEBACiBvYmotJChDT05GSUdfVVNCX0VNSTYyKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfSURNT1VTRSkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfTENEKQkJKz0gbWlzYy8KK29iai0kKENPTkZJR19VU0JfTEQpCQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9MRUQpCQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9MRUdPVE9XRVIpCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVEVTVCkJCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX1VTUzcyMCkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfUEhJREdFVFNFUlZPKQkrPSBtaXNjLworb2JqLSQoQ09ORklHX1VTQl9TSVNVU0JWR0EpCSs9IG1pc2MvCiAKIG9iai0kKENPTkZJR19VU0JfQVRNKQkJKz0gYXRtLwogb2JqLSQoQ09ORklHX1VTQl9TUEVFRFRPVUNIKQkrPSBhdG0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2F0bS9LY29uZmlnCmluZGV4IDBkOWY1MzcuLmY0Mjk4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2F0bS9LY29uZmlnCkBAIC0xLDMwICsxLDYwIEBACiAjCi0jIFVTQiBBVE0gZHJpdmVyIGNvbmZpZ3VyYXRpb24KKyMgVVNCL0FUTSBEU0wgY29uZmlndXJhdGlvbgogIwotY29tbWVudCAiVVNCIEFUTS9EU0wgZHJpdmVycyIKKworbWVudSAiVVNCIERTTCBtb2RlbSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCCiAKIGNvbmZpZyBVU0JfQVRNCi0JdHJpc3RhdGUgIkdlbmVyaWMgVVNCIEFUTS9EU0wgY29yZSBJL08gc3VwcG9ydCIKKwl0cmlzdGF0ZSAiVVNCIERTTCBtb2RlbSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIEFUTQogCXNlbGVjdCBDUkMzMgogCWRlZmF1bHQgbgogCWhlbHAKLQkgIFRoaXMgcHJvdmlkZXMgYSBsaWJyYXJ5IHdoaWNoIGlzIHVzZWQgZm9yIHBhY2tldCBJL08gYnkgVVNCIERTTAotCSAgbW9kZW1zLCBzdWNoIGFzIHRoZSBTcGVlZFRvdWNoIGRyaXZlciBiZWxvdy4gCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBVU0IgRGlnaXRhbCBTdWJzY3JpYmVyIExpbmUgKERTTCkKKwkgIG1vZGVtIHRvIHlvdXIgY29tcHV0ZXIncyBVU0IgcG9ydC4gIFlvdSB3aWxsIHRoZW4gbmVlZCB0byBjaG9vc2UgeW91cgorCSAgbW9kZW0gZnJvbSB0aGUgbGlzdCBiZWxvdy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdXNiX2F0bS4KKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1c2JhdG0uCiAKIGNvbmZpZyBVU0JfU1BFRURUT1VDSAotCXRyaXN0YXRlICJBbGNhdGVsIFNwZWVkdG91Y2ggVVNCIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IgJiYgQVRNCi0Jc2VsZWN0IFVTQl9BVE0KKwl0cmlzdGF0ZSAiU3BlZWR0b3VjaCBVU0Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9BVE0KKwlzZWxlY3QgRldfTE9BREVSCiAJaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhbiBBbGNhdGVsIFNwZWVkVG91Y2ggVVNCIG9yIFNwZWVkVG91Y2ggMzMwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGFuIFNwZWVkVG91Y2ggVVNCIG9yIFNwZWVkVG91Y2ggMzMwCiAJICBtb2RlbS4gIEluIG9yZGVyIHRvIHVzZSB5b3VyIG1vZGVtIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgCiAJICB0d28gcGFydHMgb2YgdGhlIGZpcm13YXJlLCBleHRyYWN0ZWQgYnkgdGhlIHVzZXIgc3BhY2UgdG9vbHM7IHNlZQogCSAgPGh0dHA6Ly93d3cubGludXgtdXNiLm9yZy9TcGVlZFRvdWNoLz4gZm9yIGRldGFpbHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNwZWVkdGNoLgorCitjb25maWcgVVNCX0NYQUNSVQorCXRyaXN0YXRlICJDb25leGFudCBBY2Nlc3NSdW5uZXIgVVNCIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0JfQVRNCisJc2VsZWN0IEZXX0xPQURFUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gQURTTCBVU0IgbW9kZW0gYmFzZWQgb24gdGhlIENvbmV4YW50CisJICBBY2Nlc3NSdW5uZXIgY2hpcHNldC4gIEluIG9yZGVyIHRvIHVzZSB5b3VyIG1vZGVtIHlvdSB3aWxsIG5lZWQgdG8KKwkgIGluc3RhbGwgdGhlIGZpcm13YXJlLCBleHRyYWN0ZWQgYnkgdGhlIHVzZXIgc3BhY2UgdG9vbHM7IHNlZQorCSAgPGh0dHA6Ly9hY2Nlc3NydW5uZXIuc291cmNlZm9yZ2UubmV0Lz4gZm9yIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGN4YWNydS4KKworY29uZmlnIFVTQl9YVVNCQVRNCisJdHJpc3RhdGUgIk90aGVyIFVTQiBEU0wgbW9kZW0gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9BVE0KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgRFNMIFVTQiBtb2RlbSBub3QgZXhwbGljaXRseSBzdXBwb3J0ZWQgYnkKKwkgIGFub3RoZXIgVVNCIERTTCBkcml2ZXJzLiAgSW4gb3JkZXIgdG8gdXNlIHlvdXIgbW9kZW0geW91IHdpbGwgbmVlZCB0bworCSAgcGFzcyB0aGUgdmVuZG9yIElELCBwcm9kdWN0IElELCBhbmQgZW5kcG9pbnQgbnVtYmVycyBmb3IgdHJhbnNtaXNzaW9uCisJICBhbmQgcmVjZXB0aW9uIGFzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgWW91IG1heSBuZWVkIHRvIGluaXRpYWxpemUgdGhlCisJICB0aGUgbW9kZW0gdXNpbmcgYSB1c2VyIHNwYWNlIHV0aWxpdHkgKGEgZmlybXdhcmUgbG9hZGVyIGZvciBleGFtcGxlKS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgeHVzYmF0bS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL01ha2VmaWxlIGIvZHJpdmVycy91c2IvYXRtL01ha2VmaWxlCmluZGV4IDkyMTNiOGI5Li43NTFmMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvYXRtL01ha2VmaWxlCkBAIC0xLDcgKzEsOCBAQAogIwotIyBNYWtlZmlsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIFVTQiBkcml2ZXJzCi0jICh0aGUgb25lcyB0aGF0IGRvbid0IGZpdCBpbnRvIGFueSBvdGhlciBjYXRlZ29yaWVzKQorIyBNYWtlZmlsZSBmb3IgVVNCIEFUTS94RFNMIGRyaXZlcnMKICMKIAotb2JqLSQoQ09ORklHX1VTQl9BVE0pCQkrPSB1c2JfYXRtLm8KK29iai0kKENPTkZJR19VU0JfQ1hBQ1JVKQkrPSBjeGFjcnUubwogb2JqLSQoQ09ORklHX1VTQl9TUEVFRFRPVUNIKQkrPSBzcGVlZHRjaC5vCitvYmotJChDT05GSUdfVVNCX0FUTSkJCSs9IHVzYmF0bS5vCitvYmotJChDT05GSUdfVVNCX1hVU0JBVE0pCSs9IHh1c2JhdG0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jIGIvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMTg0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9hdG0vY3hhY3J1LmMKQEAgLTAsMCArMSw4NzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBjeGFjcnUuYyAgLSAgZHJpdmVyIGZvciBVU0IgQURTTCBtb2RlbXMgYmFzZWQgb24KKyAqICAgICAgICAgICAgICAgQ29uZXhhbnQgQWNjZXNzUnVubmVyIGNoaXBzZXQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IERhdmlkIFdvb2Rob3VzZSwgRHVuY2FuIFNhbmRzLCBSb21hbiBLYWdhbgorICogIENvcHlyaWdodCAoQykgMjAwNSBEdW5jYW4gU2FuZHMsIFJvbWFuIEthZ2FuIChya2FnYW4gJSBtYWlsICEgcnUpCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogIENyZWRpdCBpcyBkdWUgZm9yIEpvc2VwIENvbWFzLCB3aG8gY3JlYXRlZCB0aGUgb3JpZ2luYWwgcGF0Y2ggdG8gc3BlZWR0Y2guYworICogIHRvIHN1cHBvcnQgdGhlIGRpZmZlcmVudCBwYWRkaW5nIHVzZWQgYnkgdGhlIEFjY2Vzc1J1bm5lciAobm93IGdlbmVyYWxpemVkCisgKiAgaW50byB1c2JhdG0pLCBhbmQgdGhlIHVzZXJzcGFjZSBmaXJtd2FyZSBsb2FkaW5nIHV0aWxpdHkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CS8qIEZJWE1FOiBsaW51eC9maXJtd2FyZS5oIHNob3VsZCBpbmNsdWRlIGl0IGl0c2VsZiAqLworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKKyNpbmNsdWRlICJ1c2JhdG0uaCIKKworI2RlZmluZSBEUklWRVJfQVVUSE9SCSJSb21hbiBLYWdhbiwgRGF2aWQgV29vZGhvdXNlLCBEdW5jYW4gU2FuZHMiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjIiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJDb25leGFudCBBY2Nlc3NSdW5uZXIgQURTTCBVU0IgbW9kZW0gZHJpdmVyIgorCitzdGF0aWMgY29uc3QgY2hhciBjeGFjcnVfZHJpdmVyX25hbWVbXSA9ICJjeGFjcnUiOworCisjZGVmaW5lIENYQUNSVV9FUF9DTUQJCTB4MDEJLyogQnVsay9pbnRlcnJ1cHQgaW4vb3V0ICovCisjZGVmaW5lIENYQUNSVV9FUF9EQVRBCQkweDAyCS8qIEJ1bGsgaW4vb3V0ICovCisKKyNkZWZpbmUgQ01EX1BBQ0tFVF9TSVpFCQk2NAkvKiBTaG91bGQgYmUgbWF4cGFja2V0KGVwKT8gKi8KKworLyogQWRkcmVzc2VzICovCisjZGVmaW5lIFBMTEZDTEtfQUREUgkweDAwMzUwMDY4CisjZGVmaW5lIFBMTEJDTEtfQUREUgkweDAwMzUwMDZjCisjZGVmaW5lIFNEUkFNRU5fQUREUgkweDAwMzUwMDEwCisjZGVmaW5lIEZXX0FERFIJCTB4MDA4MDEwMDAKKyNkZWZpbmUgQlJfQUREUgkJMHgwMDE4MDYwMAorI2RlZmluZSBTSUdfQUREUgkweDAwMTgwNTAwCisjZGVmaW5lIEJSX1NUQUNLX0FERFIJMHgwMDE4N2YxMAorCisvKiBWYWx1ZXMgKi8KKyNkZWZpbmUgU0RSQU1fRU5BCTB4MQorCisjZGVmaW5lIENNRF9USU1FT1VUCTIwMDAJLyogbXNlY3MgKi8KKyNkZWZpbmUgUE9MTF9JTlRFUlZBTAk1MDAwCS8qIG1zZWNzICovCisKKy8qIGNvbW1hbmRzIGZvciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBtb2RlbSB0aHJvdWdoIHRoZSBjb250cm9sIGNoYW5uZWwgYmVmb3JlCisgKiBmaXJtd2FyZSBpcyBsb2FkZWQgICovCitlbnVtIGN4YWNydV9md19yZXF1ZXN0IHsKKwlGV19DTURfRVJSLAorCUZXX0dFVF9WRVIsCisJRldfUkVBRF9NRU0sCisJRldfV1JJVEVfTUVNLAorCUZXX1JNV19NRU0sCisJRldfQ0hFQ0tTVU1fTUVNLAorCUZXX0dPVE9fTUVNLAorfTsKKworLyogY29tbWFuZHMgZm9yIGludGVyYWN0aW9uIHdpdGggdGhlIG1vZGVtIHRocm91Z2ggdGhlIGNvbnRyb2wgY2hhbm5lbCBvbmNlCisgKiBmaXJtd2FyZSBpcyBsb2FkZWQgICovCitlbnVtIGN4YWNydV9jbV9yZXF1ZXN0IHsKKwlDTV9SRVFVRVNUX1VOREVGSU5FRCA9IDB4ODAsCisJQ01fUkVRVUVTVF9URVNULAorCUNNX1JFUVVFU1RfQ0hJUF9HRVRfTUFDX0FERFJFU1MsCisJQ01fUkVRVUVTVF9DSElQX0dFVF9EUF9WRVJTSU9OUywKKwlDTV9SRVFVRVNUX0NISVBfQURTTF9MSU5FX1NUQVJULAorCUNNX1JFUVVFU1RfQ0hJUF9BRFNMX0xJTkVfU1RPUCwKKwlDTV9SRVFVRVNUX0NISVBfQURTTF9MSU5FX0dFVF9TVEFUVVMsCisJQ01fUkVRVUVTVF9DSElQX0FEU0xfTElORV9HRVRfU1BFRUQsCisJQ01fUkVRVUVTVF9DQVJEX0lORk9fR0VULAorCUNNX1JFUVVFU1RfQ0FSRF9EQVRBX0dFVCwKKwlDTV9SRVFVRVNUX0NBUkRfREFUQV9TRVQsCisJQ01fUkVRVUVTVF9DT01NQU5EX0hXX0lPLAorCUNNX1JFUVVFU1RfSU5URVJGQUNFX0hXX0lPLAorCUNNX1JFUVVFU1RfQ0FSRF9TRVJJQUxfREFUQV9QQVRIX0dFVCwKKwlDTV9SRVFVRVNUX0NBUkRfU0VSSUFMX0RBVEFfUEFUSF9TRVQsCisJQ01fUkVRVUVTVF9DQVJEX0NPTlRST0xMRVJfVkVSU0lPTl9HRVQsCisJQ01fUkVRVUVTVF9DQVJEX0dFVF9TVEFUVVMsCisJQ01fUkVRVUVTVF9DQVJEX0dFVF9NQUNfQUREUkVTUywKKwlDTV9SRVFVRVNUX0NBUkRfR0VUX0RBVEFfTElOS19TVEFUVVMsCisJQ01fUkVRVUVTVF9NQVgsCit9OworCisvKiByZXBseSBjb2RlcyB0byB0aGUgY29tbWFuZHMgYWJvdmUgKi8KK2VudW0gY3hhY3J1X2NtX3N0YXR1cyB7CisJQ01fU1RBVFVTX1VOREVGSU5FRCwKKwlDTV9TVEFUVVNfU1VDQ0VTUywKKwlDTV9TVEFUVVNfRVJST1IsCisJQ01fU1RBVFVTX1VOU1VQUE9SVEVELAorCUNNX1NUQVRVU19VTklNUExFTUVOVEVELAorCUNNX1NUQVRVU19QQVJBTUVURVJfRVJST1IsCisJQ01fU1RBVFVTX0RCR19MT09QQkFDSywKKwlDTV9TVEFUVVNfTUFYLAorfTsKKworLyogaW5kaWNlcyBpbnRvIENBUkRfSU5GT19HRVQgcmV0dXJuIGFycmF5ICovCitlbnVtIGN4YWNydV9pbmZvX2lkeCB7CisJQ1hJTkZfRE9XTlNUUkVBTV9SQVRFLAorCUNYSU5GX1VQU1RSRUFNX1JBVEUsCisJQ1hJTkZfTElOS19TVEFUVVMsCisJQ1hJTkZfTElORV9TVEFUVVMsCisJQ1hJTkZfTUFDX0FERFJFU1NfSElHSCwKKwlDWElORl9NQUNfQUREUkVTU19MT1csCisJQ1hJTkZfVVBTVFJFQU1fU05SX01BUkdJTiwKKwlDWElORl9ET1dOU1RSRUFNX1NOUl9NQVJHSU4sCisJQ1hJTkZfVVBTVFJFQU1fQVRURU5VQVRJT04sCisJQ1hJTkZfRE9XTlNUUkVBTV9BVFRFTlVBVElPTiwKKwlDWElORl9UUkFOU01JVFRFUl9QT1dFUiwKKwlDWElORl9VUFNUUkVBTV9CSVRTX1BFUl9GUkFNRSwKKwlDWElORl9ET1dOU1RSRUFNX0JJVFNfUEVSX0ZSQU1FLAorCUNYSU5GX1NUQVJUVVBfQVRURU1QVFMsCisJQ1hJTkZfVVBTVFJFQU1fQ1JDX0VSUk9SUywKKwlDWElORl9ET1dOU1RSRUFNX0NSQ19FUlJPUlMsCisJQ1hJTkZfVVBTVFJFQU1fRkVDX0VSUk9SUywKKwlDWElORl9ET1dOU1RSRUFNX0ZFQ19FUlJPUlMsCisJQ1hJTkZfVVBTVFJFQU1fSEVDX0VSUk9SUywKKwlDWElORl9ET1dOU1RSRUFNX0hFQ19FUlJPUlMsCisJQ1hJTkZfTElORV9TVEFSVEFCTEUsCisJQ1hJTkZfTU9EVUxBVElPTiwKKwlDWElORl9BRFNMX0hFQURFTkQsCisJQ1hJTkZfQURTTF9IRUFERU5EX0VOVklST05NRU5ULAorCUNYSU5GX0NPTlRST0xMRVJfVkVSU0lPTiwKKwkvKiBkdW5ubyB3aGF0IHRoZSBtaXNzaW5nIHR3byBtZWFuICovCisJQ1hJTkZfTUFYID0gMHgxYywKK307CisKK3N0cnVjdCBjeGFjcnVfbW9kZW1fdHlwZSB7CisJdTMyIHBsbF9mX2NsazsKKwl1MzIgcGxsX2JfY2xrOworCWludCBib290X3JvbV9wYXRjaDsKK307CisKK3N0cnVjdCBjeGFjcnVfZGF0YSB7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG07CisKKwljb25zdCBzdHJ1Y3QgY3hhY3J1X21vZGVtX3R5cGUgKm1vZGVtX3R5cGU7CisKKwlpbnQgbGluZV9zdGF0dXM7CisJc3RydWN0IHdvcmtfc3RydWN0IHBvbGxfd29yazsKKworCS8qIGNvbnRvbCBoYW5kbGVzICovCisJc3RydWN0IHNlbWFwaG9yZSBjbV9zZXJpYWxpemU7CisJdTggKnJjdl9idWY7CisJdTggKnNuZF9idWY7CisJc3RydWN0IHVyYiAqcmN2X3VyYjsKKwlzdHJ1Y3QgdXJiICpzbmRfdXJiOworCXN0cnVjdCBjb21wbGV0aW9uIHJjdl9kb25lOworCXN0cnVjdCBjb21wbGV0aW9uIHNuZF9kb25lOworfTsKKworLyogdGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYXJlIHN0b2xlbiBmcm9tIGRyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jICovCitzdGF0aWMgdm9pZCBjeGFjcnVfYmxvY2tpbmdfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNvbXBsZXRlKChzdHJ1Y3QgY29tcGxldGlvbiAqKXVyYi0+Y29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIGN4YWNydV90aW1lb3V0X2tpbGwodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXVzYl91bmxpbmtfdXJiKChzdHJ1Y3QgdXJiICopIGRhdGEpOworfQorCitzdGF0aWMgaW50IGN4YWNydV9zdGFydF93YWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBjb21wbGV0aW9uICpkb25lLAorCQkJCSBpbnQqIGFjdHVhbF9sZW5ndGgpCit7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisJaW50IHN0YXR1czsKKworCWluaXRfdGltZXIoJnRpbWVyKTsKKwl0aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQ01EX1RJTUVPVVQpOworCXRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgdXJiOworCXRpbWVyLmZ1bmN0aW9uID0gY3hhY3J1X3RpbWVvdXRfa2lsbDsKKwlhZGRfdGltZXIoJnRpbWVyKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKGRvbmUpOworCXN0YXR1cyA9IHVyYi0+c3RhdHVzOworCWlmIChzdGF0dXMgPT0gLUVDT05OUkVTRVQpCisJCXN0YXR1cyA9IC1FVElNRURPVVQ7CisJZGVsX3RpbWVyX3N5bmMoJnRpbWVyKTsKKworCWlmIChhY3R1YWxfbGVuZ3RoKQorCQkqYWN0dWFsX2xlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGN4YWNydV9jbShzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlLCBlbnVtIGN4YWNydV9jbV9yZXF1ZXN0IGNtLAorCQkgICAgIHU4ICp3ZGF0YSwgaW50IHdzaXplLCB1OCAqcmRhdGEsIGludCByc2l6ZSkKK3sKKwlpbnQgcmV0LCBhY3RsZW47CisJaW50IG9mZmIsIG9mZmQ7CisJY29uc3QgaW50IHN0cmlkZSA9IENNRF9QQUNLRVRfU0laRSAtIDQ7CisJdTggKndidWYgPSBpbnN0YW5jZS0+c25kX2J1ZjsKKwl1OCAqcmJ1ZiA9IGluc3RhbmNlLT5yY3ZfYnVmOworCWludCB3YnVmbGVuID0gKCh3c2l6ZSAtIDEpIC8gc3RyaWRlICsgMSkgKiBDTURfUEFDS0VUX1NJWkU7CisJaW50IHJidWZsZW4gPSAoKHJzaXplIC0gMSkgLyBzdHJpZGUgKyAxKSAqIENNRF9QQUNLRVRfU0laRTsKKworCWlmICh3YnVmbGVuID4gUEFHRV9TSVpFIHx8IHJidWZsZW4gPiBQQUdFX1NJWkUpIHsKKwkJZGJnKCJ0b28gYmlnIHRyYW5zZmVyIHJlcXVlc3RlZCIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJZG93bigmaW5zdGFuY2UtPmNtX3NlcmlhbGl6ZSk7CisKKwkvKiBzdWJtaXQgcmVhZGluZyB1cmIgYmVmb3JlIHRoZSB3cml0aW5nIG9uZSAqLworCWluaXRfY29tcGxldGlvbigmaW5zdGFuY2UtPnJjdl9kb25lKTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihpbnN0YW5jZS0+cmN2X3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGJnKCJzdWJtaXR0aW5nIHJlYWQgdXJiIGZvciBjbSAlI3ggZmFpbGVkIiwgY20pOworCQlyZXQgPSByZXQ7CisJCWdvdG8gZmFpbDsKKwl9CisKKwltZW1zZXQod2J1ZiwgMCwgd2J1Zmxlbik7CisJLyogaGFuZGxlIHdzaXplID09IDAgKi8KKwl3YnVmWzBdID0gY207CisJZm9yIChvZmZiID0gb2ZmZCA9IDA7IG9mZmQgPCB3c2l6ZTsgb2ZmZCArPSBzdHJpZGUsIG9mZmIgKz0gQ01EX1BBQ0tFVF9TSVpFKSB7CisJCXdidWZbb2ZmYl0gPSBjbTsKKwkJbWVtY3B5KHdidWYgKyBvZmZiICsgNCwgd2RhdGEgKyBvZmZkLCBtaW5fdChpbnQsIHN0cmlkZSwgd3NpemUgLSBvZmZkKSk7CisJfQorCisJaW5zdGFuY2UtPnNuZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB3YnVmbGVuOworCWluaXRfY29tcGxldGlvbigmaW5zdGFuY2UtPnNuZF9kb25lKTsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihpbnN0YW5jZS0+c25kX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGJnKCJzdWJtaXR0aW5nIHdyaXRlIHVyYiBmb3IgY20gJSN4IGZhaWxlZCIsIGNtKTsKKwkJcmV0ID0gcmV0OworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gY3hhY3J1X3N0YXJ0X3dhaXRfdXJiKGluc3RhbmNlLT5zbmRfdXJiLCAmaW5zdGFuY2UtPnNuZF9kb25lLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkYmcoInNlbmRpbmcgY20gJSN4IGZhaWxlZCIsIGNtKTsKKwkJcmV0ID0gcmV0OworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0ID0gY3hhY3J1X3N0YXJ0X3dhaXRfdXJiKGluc3RhbmNlLT5yY3ZfdXJiLCAmaW5zdGFuY2UtPnJjdl9kb25lLCAmYWN0bGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlkYmcoInJlY2VpdmluZyBjbSAlI3ggZmFpbGVkIiwgY20pOworCQlyZXQgPSByZXQ7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKGFjdGxlbiAlIENNRF9QQUNLRVRfU0laRSB8fCAhYWN0bGVuKSB7CisJCWRiZygicmVzcG9uc2UgaXMgbm90IGEgcG9zaXRpdmUgbXVsdGlwbGUgb2YgJWQ6ICUjeCIsCisJCQkJQ01EX1BBQ0tFVF9TSVpFLCBhY3RsZW4pOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogY2hlY2sgdGhlIHJldHVybiBzdGF0dXMgYW5kIGNvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIsIGlmIG5lZWRlZCAqLworCWZvciAob2ZmYiA9IG9mZmQgPSAwOyBvZmZkIDwgcnNpemUgJiYgb2ZmYiA8IGFjdGxlbjsgb2ZmYiArPSBDTURfUEFDS0VUX1NJWkUpIHsKKwkJaWYgKHJidWZbb2ZmYl0gIT0gY20pIHsKKwkJCWRiZygid3JvbmcgY20gJSN4IGluIHJlc3BvbnNlIiwgcmJ1ZltvZmZiXSk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBmYWlsOworCQl9CisJCWlmIChyYnVmW29mZmIgKyAxXSAhPSBDTV9TVEFUVVNfU1VDQ0VTUykgeworCQkJZGJnKCJyZXNwb25zZSBmYWlsZWQ6ICUjeCIsIHJidWZbb2ZmYiArIDFdKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKG9mZmQgPj0gcnNpemUpCisJCQlicmVhazsKKwkJbWVtY3B5KHJkYXRhICsgb2ZmZCwgcmJ1ZiArIG9mZmIgKyA0LCBtaW5fdChpbnQsIHN0cmlkZSwgcnNpemUgLSBvZmZkKSk7CisJCW9mZmQgKz0gc3RyaWRlOworCX0KKworCXJldCA9IG9mZmQ7CisJZGJnKCJjbSAlI3giLCBjbSk7CitmYWlsOgorCXVwKCZpbnN0YW5jZS0+Y21fc2VyaWFsaXplKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN4YWNydV9jbV9nZXRfYXJyYXkoc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZSwgZW51bSBjeGFjcnVfY21fcmVxdWVzdCBjbSwKKwkJCSAgICAgICB1MzIgKmRhdGEsIGludCBzaXplKQoreworCWludCByZXQsIGxlbjsKKwl1MzIgKmJ1ZjsKKwlpbnQgb2ZmYiwgb2ZmZDsKKwljb25zdCBpbnQgc3RyaWRlID0gQ01EX1BBQ0tFVF9TSVpFIC8gKDQgKiAyKSAtIDE7CisJaW50IGJ1ZmxlbiA9ICAoKHNpemUgLSAxKSAvIHN0cmlkZSArIDEgKyBzaXplICogMikgKiA0OworCisJYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGN4YWNydV9jbShpbnN0YW5jZSwgY20sIE5VTEwsIDAsICh1OCAqKSBidWYsIGJ1Zmxlbik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2xlYW51cDsKKworCS8qIGxlbiA+IDAgJiYgbGVuICUgNCA9PSAwIGd1YXJhbnRlZWQgYnkgY3hhY3J1X2NtKCkgKi8KKwlsZW4gPSByZXQgLyA0OworCWZvciAob2ZmYiA9IDA7IG9mZmIgPCBsZW47ICkgeworCQlpbnQgbCA9IGxlMzJfdG9fY3B1KGJ1ZltvZmZiKytdKTsKKwkJaWYgKGwgPiBzdHJpZGUgfHwgbCA+IChsZW4gLSBvZmZiKSAvIDIpIHsKKwkJCWRiZygid3JvbmcgZGF0YSBsZW5ndGggJSN4IGluIHJlc3BvbnNlIiwgbCk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXdoaWxlIChsLS0pIHsKKwkJCW9mZmQgPSBsZTMyX3RvX2NwdShidWZbb2ZmYisrXSk7CisJCQlpZiAob2ZmZCA+PSBzaXplKSB7CisJCQkJZGJnKCJ3cm9uZyBpbmRleCAlI3ggaW4gcmVzcG9uc2UiLCBvZmZkKTsKKwkJCQlyZXQgPSAtRUlPOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCWRhdGFbb2ZmZF0gPSBsZTMyX3RvX2NwdShidWZbb2ZmYisrXSk7CisJCX0KKwl9CisKKwlyZXQgPSAwOworCitjbGVhbnVwOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjeGFjcnVfY2FyZF9zdGF0dXMoc3RydWN0IGN4YWNydV9kYXRhICppbnN0YW5jZSkKK3sKKwlpbnQgcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBDTV9SRVFVRVNUX0NBUkRfR0VUX1NUQVRVUywgTlVMTCwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsJCS8qIGZpcm13YXJlIG5vdCBsb2FkZWQgKi8KKwkJZGJnKCJjeGFjcnVfYWRzbF9zdGFydDogQ0FSRF9HRVRfU1RBVFVTIHJldHVybmVkICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGN4YWNydV9wb2xsX3N0YXR1cyhzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlKTsKKworc3RhdGljIGludCBjeGFjcnVfYXRtX3N0YXJ0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAorCQlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldikKK3sKKwlzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlID0gdXNiYXRtX2luc3RhbmNlLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdXNiYXRtX2luc3RhbmNlLT51c2JfaW50Zi0+ZGV2OworCS8qCisJc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYgPSB1c2JhdG1faW5zdGFuY2UtPmF0bV9kZXY7CisJKi8KKwlpbnQgcmV0OworCisJZGJnKCJjeGFjcnVfYXRtX3N0YXJ0Iik7CisKKwkvKiBSZWFkIE1BQyBhZGRyZXNzICovCisJcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBDTV9SRVFVRVNUX0NBUkRfR0VUX01BQ19BRERSRVNTLCBOVUxMLCAwLAorCQkJYXRtX2Rldi0+ZXNpLCBzaXplb2YoYXRtX2Rldi0+ZXNpKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJjeGFjcnVfYXRtX3N0YXJ0OiBDQVJEX0dFVF9NQUNfQUREUkVTUyByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzdGFydCBBRFNMICovCisJcmV0ID0gY3hhY3J1X2NtKGluc3RhbmNlLCBDTV9SRVFVRVNUX0NISVBfQURTTF9MSU5FX1NUQVJULCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImN4YWNydV9hdG1fc3RhcnQ6IENISVBfQURTTF9MSU5FX1NUQVJUIHJldHVybmVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFN0YXJ0IHN0YXR1cyBwb2xsaW5nICovCisJY3hhY3J1X3BvbGxfc3RhdHVzKGluc3RhbmNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3hhY3J1X3BvbGxfc3RhdHVzKHN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UpCit7CisJdTMyIGJ1ZltDWElORl9NQVhdID0ge307CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmluc3RhbmNlLT51c2JhdG0tPnVzYl9pbnRmLT5kZXY7CisJc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYgPSBpbnN0YW5jZS0+dXNiYXRtLT5hdG1fZGV2OworCWludCByZXQ7CisKKwlyZXQgPSBjeGFjcnVfY21fZ2V0X2FycmF5KGluc3RhbmNlLCBDTV9SRVFVRVNUX0NBUkRfSU5GT19HRVQsIGJ1ZiwgQ1hJTkZfTUFYKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfd2FybihkZXYsICJwb2xsIHN0YXR1czogZXJyb3IgJWRcbiIsIHJldCk7CisJCWdvdG8gcmVzY2hlZHVsZTsKKwl9CisKKwlpZiAoaW5zdGFuY2UtPmxpbmVfc3RhdHVzID09IGJ1ZltDWElORl9MSU5FX1NUQVRVU10pCisJCWdvdG8gcmVzY2hlZHVsZTsKKworCWluc3RhbmNlLT5saW5lX3N0YXR1cyA9IGJ1ZltDWElORl9MSU5FX1NUQVRVU107CisJc3dpdGNoIChpbnN0YW5jZS0+bGluZV9zdGF0dXMpIHsKKwljYXNlIDA6CisJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCWRldl9pbmZvKGRldiwgIkFEU0wgbGluZTogZG93blxuIik7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IGF0dGVtdHBpbmcgdG8gYWN0aXZhdGVcbiIpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJZGV2X2luZm8oZGV2LCAiQURTTCBsaW5lOiB0cmFpbmluZ1xuIik7CisJCWJyZWFrOworCisJY2FzZSAzOgorCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQlkZXZfaW5mbyhkZXYsICJBRFNMIGxpbmU6IGNoYW5uZWwgYW5hbHlzaXNcbiIpOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJZGV2X2luZm8oZGV2LCAiQURTTCBsaW5lOiBleGNoYW5nZVxuIik7CisJCWJyZWFrOworCisJY2FzZSA1OgorCQlhdG1fZGV2LT5saW5rX3JhdGUgPSBidWZbQ1hJTkZfRE9XTlNUUkVBTV9SQVRFXSAqIDEwMDAgLyA0MjQ7CisJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0ZPVU5EOworCisJCWRldl9pbmZvKGRldiwgIkFEU0wgbGluZTogdXAgKCVkIGtiL3MgZG93biB8ICVkIGtiL3MgdXApXG4iLAorCQkgICAgIGJ1ZltDWElORl9ET1dOU1RSRUFNX1JBVEVdLCBidWZbQ1hJTkZfVVBTVFJFQU1fUkFURV0pOworCQlicmVhazsKKworCWNhc2UgNjoKKwkJYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKKwkJZGV2X2luZm8oZGV2LCAiQURTTCBsaW5lOiB3YWl0aW5nXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDc6CisJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7CisJCWRldl9pbmZvKGRldiwgIkFEU0wgbGluZTogaW5pdGlhbGl6aW5nXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19VTktOT1dOOworCQlkZXZfaW5mbyhkZXYsICJVbmtub3duIGxpbmUgc3RhdGUgJTAyeFxuIiwgaW5zdGFuY2UtPmxpbmVfc3RhdHVzKTsKKwkJYnJlYWs7CisJfQorcmVzY2hlZHVsZToKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluc3RhbmNlLT5wb2xsX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoUE9MTF9JTlRFUlZBTCkpOworfQorCitzdGF0aWMgaW50IGN4YWNydV9mdyhzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgZW51bSBjeGFjcnVfZndfcmVxdWVzdCBmdywKKwkJICAgICB1OCBjb2RlMSwgdTggY29kZTIsIHUzMiBhZGRyLCB1OCAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IHJldDsKKwl1OCAqYnVmOworCWludCBvZmZkLCBvZmZiOworCWNvbnN0IGludCBzdHJpZGUgPSBDTURfUEFDS0VUX1NJWkUgLSA4OworCisJYnVmID0gKHU4ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvZmZiID0gb2ZmZCA9IDA7CisJZG8geworCQlpbnQgbCA9IG1pbl90KGludCwgc3RyaWRlLCBzaXplIC0gb2ZmZCk7CisJCWJ1ZltvZmZiKytdID0gZnc7CisJCWJ1ZltvZmZiKytdID0gbDsKKwkJYnVmW29mZmIrK10gPSBjb2RlMTsKKwkJYnVmW29mZmIrK10gPSBjb2RlMjsKKwkJKigodTMyICopIChidWYgKyBvZmZiKSkgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwkJb2ZmYiArPSA0OworCQlhZGRyICs9IGw7CisJCWlmKGwpCisJCQltZW1jcHkoYnVmICsgb2ZmYiwgZGF0YSArIG9mZmQsIGwpOworCQlpZiAobCA8IHN0cmlkZSkKKwkJCW1lbXNldChidWYgKyBvZmZiICsgbCwgMCwgc3RyaWRlIC0gbCk7CisJCW9mZmIgKz0gc3RyaWRlOworCQlvZmZkICs9IHN0cmlkZTsKKwkJaWYgKChvZmZiID49IFBBR0VfU0laRSkgfHwgKG9mZmQgPj0gc2l6ZSkpIHsKKwkJCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0NNRCksCisJCQkJCSAgIGJ1Ziwgb2ZmYiwgTlVMTCwgQ01EX1RJTUVPVVQpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkYmcoInNlbmRpbmcgZncgJSN4IGZhaWxlZCIsIGZ3KTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlvZmZiID0gMDsKKwkJfQorCX0gd2hpbGUob2ZmZCA8IHNpemUpOworCWRiZygic2VudCBmdyAlI3giLCBmdyk7CisKKwlyZXQgPSAwOworCitjbGVhbnVwOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjeGFjcnVfdXBsb2FkX2Zpcm13YXJlKHN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2UsCisJCQkJICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmJwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqY2YpCit7CisJaW50IHJldDsKKwlpbnQgb2ZmOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW5zdGFuY2UtPnVzYmF0bS0+dXNiX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW5zdGFuY2UtPnVzYmF0bS0+dXNiX2ludGYtPmRldjsKKwl1MTYgc2lnbmF0dXJlW10gPSB7IHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0IH07CisJdTMyIHZhbDsKKworCWRiZygiY3hhY3J1X3VwbG9hZF9maXJtd2FyZSIpOworCisJLyogRmlybXdhcmVQbGxGQ2xrVmFsdWUgKi8KKwl2YWwgPSBjcHVfdG9fbGUzMihpbnN0YW5jZS0+bW9kZW1fdHlwZS0+cGxsX2ZfY2xrKTsKKwlyZXQgPSBjeGFjcnVfZncodXNiX2RldiwgRldfV1JJVEVfTUVNLCAweDIsIDB4MCwgUExMRkNMS19BRERSLCAodTggKikgJnZhbCwgNCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZpcm13YXJlUGxsRkNsa1ZhbHVlIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaXJtd2FyZVBsbEJDbGtWYWx1ZSAqLworCXZhbCA9IGNwdV90b19sZTMyKGluc3RhbmNlLT5tb2RlbV90eXBlLT5wbGxfYl9jbGspOworCXJldCA9IGN4YWNydV9mdyh1c2JfZGV2LCBGV19XUklURV9NRU0sIDB4MiwgMHgwLCBQTExCQ0xLX0FERFIsICh1OCAqKSAmdmFsLCA0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmlybXdhcmVQbGxCQ2xrVmFsdWUgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIEVuYWJsZSBTRFJBTSAqLworCXZhbCA9IGNwdV90b19sZTMyKFNEUkFNX0VOQSk7CisJcmV0ID0gY3hhY3J1X2Z3KHVzYl9kZXYsIEZXX1dSSVRFX01FTSwgMHgyLCAweDAsIFNEUkFNRU5fQUREUiwgKHU4ICopICZ2YWwsIDQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJFbmFibGUgU0RSQU0gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZpcm13YXJlICovCisJcmV0ID0gY3hhY3J1X2Z3KHVzYl9kZXYsIEZXX1dSSVRFX01FTSwgMHgyLCAweDAsIEZXX0FERFIsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZpcm13YXJlIHVwbG9hZCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJLyogQm9vdCBST00gcGF0Y2ggKi8KKwlpZiAoaW5zdGFuY2UtPm1vZGVtX3R5cGUtPmJvb3Rfcm9tX3BhdGNoKSB7CisJCXJldCA9IGN4YWNydV9mdyh1c2JfZGV2LCBGV19XUklURV9NRU0sIDB4MiwgMHgwLCBCUl9BRERSLCBicC0+ZGF0YSwgYnAtPnNpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIkJvb3QgUk9NIHBhdGNoaW5nIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBTaWduYXR1cmUgKi8KKwlyZXQgPSBjeGFjcnVfZncodXNiX2RldiwgRldfV1JJVEVfTUVNLCAweDIsIDB4MCwgU0lHX0FERFIsICh1OCAqKSBzaWduYXR1cmUsIDQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJTaWduYXR1cmUgc3RvcmluZyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJaWYgKGluc3RhbmNlLT5tb2RlbV90eXBlLT5ib290X3JvbV9wYXRjaCkgeworCQl2YWwgPSBjcHVfdG9fbGUzMihCUl9BRERSKTsKKwkJcmV0ID0gY3hhY3J1X2Z3KHVzYl9kZXYsIEZXX1dSSVRFX01FTSwgMHgyLCAweDAsIEJSX1NUQUNLX0FERFIsICh1OCAqKSAmdmFsLCA0KTsKKwl9CisJZWxzZSB7CisJCXJldCA9IGN4YWNydV9mdyh1c2JfZGV2LCBGV19HT1RPX01FTSwgMHgwLCAweDAsIEZXX0FERFIsIE5VTEwsIDApOworCX0KKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiUGFzc2luZyBjb250cm9sIHRvIGZpcm13YXJlIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEZWxheSB0byBhbGxvdyBmaXJtd2FyZSB0byBzdGFydCB1cC4gKi8KKwltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKKworCXVzYl9jbGVhcl9oYWx0KHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBDWEFDUlVfRVBfQ01EKSk7CisJdXNiX2NsZWFyX2hhbHQodXNiX2RldiwgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIENYQUNSVV9FUF9DTUQpKTsKKwl1c2JfY2xlYXJfaGFsdCh1c2JfZGV2LCB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0RBVEEpKTsKKwl1c2JfY2xlYXJfaGFsdCh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgQ1hBQ1JVX0VQX0RBVEEpKTsKKworCXJldCA9IGN4YWNydV9jbShpbnN0YW5jZSwgQ01fUkVRVUVTVF9DQVJEX0dFVF9TVEFUVVMsIE5VTEwsIDAsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibW9kZW0gZmFpbGVkIHRvIGluaXRpYWxpemU6ICVkXG4iLCByZXQpOworCQlyZXR1cm47CisJfQorCisJLyogTG9hZCBjb25maWcgZGF0YSAobGUzMiksIGRvaW5nIG9uZSBwYWNrZXQgYXQgYSB0aW1lICovCisJaWYgKGNmKQorCQlmb3IgKG9mZiA9IDA7IG9mZiA8IGNmLT5zaXplIC8gNDsgKSB7CisJCQl1MzIgYnVmW0NNRF9QQUNLRVRfU0laRSAvIDQgLSAxXTsKKwkJCWludCBpLCBsZW4gPSBtaW5fdChpbnQsIGNmLT5zaXplIC8gNCAtIG9mZiwgQ01EX1BBQ0tFVF9TSVpFIC8gNCAvIDIgLSAxKTsKKwkJCWJ1ZlswXSA9IGNwdV90b19sZTMyKGxlbik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIG9mZisrKSB7CisJCQkJYnVmW2kgKiAyICsgMV0gPSBjcHVfdG9fbGUzMihvZmYpOworCQkJCW1lbWNweShidWYgKyBpICogMiArIDIsIGNmLT5kYXRhICsgb2ZmICogNCwgNCk7CisJCQl9CisJCQlyZXQgPSBjeGFjcnVfY20oaW5zdGFuY2UsIENNX1JFUVVFU1RfQ0FSRF9EQVRBX1NFVCwKKwkJCQkJKHU4ICopIGJ1ZiwgbGVuLCBOVUxMLCAwKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2VycihkZXYsICJsb2FkIGNvbmZpZyBkYXRhIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwltc2xlZXBfaW50ZXJydXB0aWJsZSg0MDAwKTsKK30KKworc3RhdGljIGludCBjeGFjcnVfZmluZF9maXJtd2FyZShzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlLAorCQkJCWNoYXIqIHBoYXNlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmd19wKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbnN0YW5jZS0+dXNiYXRtLT51c2JfaW50Zi0+ZGV2OworCWNoYXIgYnVmWzE2XTsKKworCXNwcmludGYoYnVmLCAiY3hhY3J1LSVzLmJpbiIsIHBoYXNlKTsKKwlkYmcoImN4YWNydV9maW5kX2Zpcm13YXJlOiBsb29raW5nIGZvciAlcyIsIGJ1Zik7CisKKwlpZiAocmVxdWVzdF9maXJtd2FyZShmd19wLCBidWYsIGRldikpIHsKKwkJZGV2X2RiZyhkZXYsICJubyBzdGFnZSAlcyBmaXJtd2FyZSBmb3VuZFxuIiwgcGhhc2UpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJmb3VuZCBmaXJtd2FyZSAlc1xuIiwgYnVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4YWNydV9oZWF2eV9pbml0KHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAorCQkJICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2ludGYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVzYmF0bV9pbnN0YW5jZS0+dXNiX2ludGYtPmRldjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCAqYnAsICpjZjsKKwlzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlID0gdXNiYXRtX2luc3RhbmNlLT5kcml2ZXJfZGF0YTsKKworCWludCByZXQgPSBjeGFjcnVfZmluZF9maXJtd2FyZShpbnN0YW5jZSwgImZ3IiwgJmZ3KTsKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKGRldiwgImZpcm13YXJlIChjeGFjcnUtZncuYmluKSB1bmF2YWlsYWJsZSAoaG90cGx1ZyBtaXNjb25maWd1cmF0aW9uPylcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChpbnN0YW5jZS0+bW9kZW1fdHlwZS0+Ym9vdF9yb21fcGF0Y2gpIHsKKwkJcmV0ID0gY3hhY3J1X2ZpbmRfZmlybXdhcmUoaW5zdGFuY2UsICJicCIsICZicCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKGRldiwgImJvb3QgUk9NIHBhdGNoIChjeGFjcnUtYnAuYmluKSB1bmF2YWlsYWJsZSAoaG90cGx1ZyBtaXNjb25maWd1cmF0aW9uPylcbiIpOworCQkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKGN4YWNydV9maW5kX2Zpcm13YXJlKGluc3RhbmNlLCAiY2YiLCAmY2YpKQkJLyogb3B0aW9uYWwgKi8KKwkJY2YgPSBOVUxMOworCisJY3hhY3J1X3VwbG9hZF9maXJtd2FyZShpbnN0YW5jZSwgZncsIGJwLCBjZik7CisKKwlpZiAoY2YpCisJCXJlbGVhc2VfZmlybXdhcmUoY2YpOworCWlmIChpbnN0YW5jZS0+bW9kZW1fdHlwZS0+Ym9vdF9yb21fcGF0Y2gpCisJCXJlbGVhc2VfZmlybXdhcmUoYnApOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0ID0gY3hhY3J1X2NhcmRfc3RhdHVzKGluc3RhbmNlKTsKKwlpZiAocmV0KQorCQlkYmcoIm1vZGVtIGluaXRpYWxpc2F0aW9uIGZhaWxlZCIpOworCWVsc2UKKwkJZGJnKCJkb25lIHNldHRpbmcgdXAgdGhlIG1vZGVtIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN4YWNydV9iaW5kKHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAorCQkgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwKKwkJICAgICAgIGludCAqbmVlZF9oZWF2eV9pbml0KQoreworCXN0cnVjdCBjeGFjcnVfZGF0YSAqaW5zdGFuY2U7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWludCByZXQ7CisKKwkvKiBpbnN0YW5jZSBpbml0ICovCisJaW5zdGFuY2UgPSBrbWFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRiZygiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3IgaW5zdGFuY2UgZGF0YSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoaW5zdGFuY2UsIDAsIHNpemVvZigqaW5zdGFuY2UpKTsKKworCWluc3RhbmNlLT51c2JhdG0gPSB1c2JhdG1faW5zdGFuY2U7CisJaW5zdGFuY2UtPm1vZGVtX3R5cGUgPSAoc3RydWN0IGN4YWNydV9tb2RlbV90eXBlICopIGlkLT5kcml2ZXJfaW5mbzsKKworCWluc3RhbmNlLT5yY3ZfYnVmID0gKHU4ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlLT5yY3ZfYnVmKSB7CisJCWRiZygiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3IgcmN2X2J1ZiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCWluc3RhbmNlLT5zbmRfYnVmID0gKHU4ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlLT5zbmRfYnVmKSB7CisJCWRiZygiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3Igc25kX2J1ZiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCWluc3RhbmNlLT5yY3ZfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlLT5yY3ZfdXJiKSB7CisJCWRiZygiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3IgcmN2X3VyYiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCWluc3RhbmNlLT5zbmRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc3RhbmNlLT5zbmRfdXJiKSB7CisJCWRiZygiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3Igc25kX3VyYiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJdXNiX2ZpbGxfaW50X3VyYihpbnN0YW5jZS0+cmN2X3VyYiwKKwkJCXVzYl9kZXYsIHVzYl9yY3ZpbnRwaXBlKHVzYl9kZXYsIENYQUNSVV9FUF9DTUQpLAorCQkJaW5zdGFuY2UtPnJjdl9idWYsIFBBR0VfU0laRSwKKwkJCWN4YWNydV9ibG9ja2luZ19jb21wbGV0aW9uLCAmaW5zdGFuY2UtPnJjdl9kb25lLCAxKTsKKwlpbnN0YW5jZS0+cmN2X3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsKKworCXVzYl9maWxsX2ludF91cmIoaW5zdGFuY2UtPnNuZF91cmIsCisJCQl1c2JfZGV2LCB1c2Jfc25kaW50cGlwZSh1c2JfZGV2LCBDWEFDUlVfRVBfQ01EKSwKKwkJCWluc3RhbmNlLT5zbmRfYnVmLCBQQUdFX1NJWkUsCisJCQljeGFjcnVfYmxvY2tpbmdfY29tcGxldGlvbiwgJmluc3RhbmNlLT5zbmRfZG9uZSwgNCk7CisJaW5zdGFuY2UtPnNuZF91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7CisKKwlpbml0X01VVEVYKCZpbnN0YW5jZS0+Y21fc2VyaWFsaXplKTsKKworCUlOSVRfV09SSygmaW5zdGFuY2UtPnBvbGxfd29yaywgKHZvaWQgKiljeGFjcnVfcG9sbF9zdGF0dXMsIGluc3RhbmNlKTsKKworCXVzYmF0bV9pbnN0YW5jZS0+ZHJpdmVyX2RhdGEgPSBpbnN0YW5jZTsKKworCSpuZWVkX2hlYXZ5X2luaXQgPSBjeGFjcnVfY2FyZF9zdGF0dXMoaW5zdGFuY2UpOworCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5zdGFuY2UtPnNuZF9idWYpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgaW5zdGFuY2UtPnJjdl9idWYpOworCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+c25kX3VyYik7CisJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5yY3ZfdXJiKTsKKwlrZnJlZShpbnN0YW5jZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjeGFjcnVfdW5iaW5kKHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAorCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgY3hhY3J1X2RhdGEgKmluc3RhbmNlID0gdXNiYXRtX2luc3RhbmNlLT5kcml2ZXJfZGF0YTsKKworCWRiZygiY3hhY3J1X3VuYmluZCBlbnRlcmVkIik7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRiZygiY3hhY3J1X3VuYmluZDogTlVMTCBpbnN0YW5jZSEiKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlICghY2FuY2VsX2RlbGF5ZWRfd29yaygmaW5zdGFuY2UtPnBvbGxfd29yaykpCisJICAgICAgIGZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CisKKwl1c2Jfa2lsbF91cmIoaW5zdGFuY2UtPnNuZF91cmIpOworCXVzYl9raWxsX3VyYihpbnN0YW5jZS0+cmN2X3VyYik7CisJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5zbmRfdXJiKTsKKwl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPnJjdl91cmIpOworCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbnN0YW5jZS0+c25kX2J1Zik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBpbnN0YW5jZS0+cmN2X2J1Zik7CisJa2ZyZWUoaW5zdGFuY2UpOworCisJdXNiYXRtX2luc3RhbmNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hhY3J1X21vZGVtX3R5cGUgY3hhY3J1X2NhZmUgPSB7CisJLnBsbF9mX2NsayA9IDB4MDJkODc0ZGYsCisJLnBsbF9iX2NsayA9IDB4MDE5NmE1MWEsCisJLmJvb3Rfcm9tX3BhdGNoID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3hhY3J1X21vZGVtX3R5cGUgY3hhY3J1X2NiMDAgPSB7CisJLnBsbF9mX2NsayA9IDB4NSwKKwkucGxsX2JfY2xrID0gMHgzLAorCS5ib290X3JvbV9wYXRjaCA9IDAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgY3hhY3J1X3VzYl9pZHNbXSA9IHsKKwl7IC8qIFYgPSBDb25leGFudAkJCVAgPSBBRFNMIG1vZGVtIChFdXBocmF0ZXMgcHJvamVjdCkJKi8KKwkJVVNCX0RFVklDRSgweDA1NzIsIDB4Y2FmZSksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NhZmUKKwl9LAorCXsgLyogViA9IENvbmV4YW50CQkJUCA9IEFEU0wgbW9kZW0gKEhhc2JhbmkgcHJvamVjdCkJKi8KKwkJVVNCX0RFVklDRSgweDA1NzIsIDB4Y2IwMCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IENvbmV4YW50CQkJUCA9IEFEU0wgbW9kZW0JCQkJKi8KKwkJVVNCX0RFVklDRSgweDA1NzIsIDB4Y2IwMSksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IENvbmV4YW50CQkJUCA9IEFEU0wgbW9kZW0JCQkJKi8KKwkJVVNCX0RFVklDRSgweDA1NzIsIDB4Y2IwNiksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IE9saXRlYwkJCQlQID0gQURTTCBtb2RlbSB2ZXJzaW9uIDIJCSovCisJCVVTQl9ERVZJQ0UoMHgwOGUzLCAweDAxMDApLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYWZlCisJfSwKKwl7IC8qIFYgPSBPbGl0ZWMJCQkJUCA9IEFEU0wgbW9kZW0gdmVyc2lvbiAzCQkqLworCQlVU0JfREVWSUNFKDB4MDhlMywgMHgwMTAyKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gVHJ1c3QvQW1pZ28gVGVjaG5vbG9neSBDby4JUCA9IEFNWC1DQTg2VQkJCQkqLworCQlVU0JfREVWSUNFKDB4MGViMCwgMHgzNDU3KSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2FmZQorCX0sCisJeyAvKiBWID0gWm9vbQkJCQlQID0gNTUxMAkJCQkqLworCQlVU0JfREVWSUNFKDB4MTgwMywgMHg1NTEwKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gRHJheXRlawkJCVAgPSBWaWdvciAzMTgJCQkJKi8KKwkJVVNCX0RFVklDRSgweDA2NzUsIDB4MDIwMCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IFp5eGVsCQkJCVAgPSA2MzAtQzEgYWthIE9NTkkgQURTTCBVU0IgKEFubmV4IEEpCSovCisJCVVTQl9ERVZJQ0UoMHgwNTg2LCAweDMzMGEpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKKwl7IC8qIFYgPSBaeXhlbAkJCQlQID0gNjMwLUMzIGFrYSBPTU5JIEFEU0wgVVNCIChBbm5leCBCKQkqLworCQlVU0JfREVWSUNFKDB4MDU4NiwgMHgzMzBiKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gQWV0aHJhCQkJCVAgPSBTdGFybW9kZW0gVU0xMDIwCQkJKi8KKwkJVVNCX0RFVklDRSgweDA2NTksIDB4MDAyMCksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IEF6dGVjaCBTeXN0ZW1zCQkJUCA9ID8gQUtBIFBpcmVsbGkgQVVBLTAxMAkJKi8KKwkJVVNCX0RFVklDRSgweDA1MDksIDB4MDgxMiksCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmY3hhY3J1X2NiMDAKKwl9LAorCXsgLyogViA9IE5ldG9waWEJCQlQID0gQ2F5bWFuIDMzNDEoQW5uZXggQSkvMzM1MShBbm5leCBCKQkqLworCQlVU0JfREVWSUNFKDB4MTAwZCwgMHhjYjAxKSwJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeGFjcnVfY2IwMAorCX0sCisJeyAvKiBWID0gTmV0b3BpYQkJCVAgPSBDYXltYW4gMzM0MihBbm5leCBBKS8zMzUyKEFubmV4IEIpCSovCisJCVVTQl9ERVZJQ0UoMHgxMDBkLCAweDMzNDIpLAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmN4YWNydV9jYjAwCisJfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGN4YWNydV91c2JfaWRzKTsKKworc3RhdGljIHN0cnVjdCB1c2JhdG1fZHJpdmVyIGN4YWNydV9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZQk9IGN4YWNydV9kcml2ZXJfbmFtZSwKKwkuYmluZAkJPSBjeGFjcnVfYmluZCwKKwkuaGVhdnlfaW5pdAk9IGN4YWNydV9oZWF2eV9pbml0LAorCS51bmJpbmQJCT0gY3hhY3J1X3VuYmluZCwKKwkuYXRtX3N0YXJ0CT0gY3hhY3J1X2F0bV9zdGFydCwKKwkuaW4JCT0gQ1hBQ1JVX0VQX0RBVEEsCisJLm91dAkJPSBDWEFDUlVfRVBfREFUQSwKKwkucnhfcGFkZGluZwk9IDMsCisJLnR4X3BhZGRpbmcJPSAxMSwKK307CisKK3N0YXRpYyBpbnQgY3hhY3J1X3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiB1c2JhdG1fdXNiX3Byb2JlKGludGYsIGlkLCAmY3hhY3J1X2RyaXZlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjeGFjcnVfdXNiX2RyaXZlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gY3hhY3J1X2RyaXZlcl9uYW1lLAorCS5wcm9iZQkJPSBjeGFjcnVfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gdXNiYXRtX3VzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IGN4YWNydV91c2JfaWRzCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjeGFjcnVfaW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJmN4YWNydV91c2JfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGN4YWNydV9jbGVhbnVwKHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJmN4YWNydV91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY3hhY3J1X2luaXQpOworbW9kdWxlX2V4aXQoY3hhY3J1X2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKaW5kZXggMmExNjk3Yi4uZDBjYmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3NwZWVkdGNoLmMKQEAgLTUsNiArNSw4IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLCBEdW5jYW4gU2FuZHMKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIERhdmlkIFdvb2Rob3VzZQogICoKKyAqICBCYXNlZCBvbiAibW9kZW1fcnVuLmMiLCBjb3B5cmlnaHQgKEMpIDIwMDEsIEJlbm9pdCBQYXBpbGxhdWx0CisgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKICAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCkBAIC0yMSw0NjcgKzIzLDE5MSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG0uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCi0jaW5jbHVkZSAidXNiX2F0bS5oIgotCi0jaWYgZGVmaW5lZChDT05GSUdfRldfTE9BREVSKSB8fCBkZWZpbmVkKENPTkZJR19GV19MT0FERVJfTU9EVUxFKQotIwlkZWZpbmUgVVNFX0ZXX0xPQURFUgotI2VuZGlmCisjaW5jbHVkZSAidXNiYXRtLmgiCiAKICNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiSm9oYW4gVmVycmVwdCwgRHVuY2FuIFNhbmRzIDxkdW5jYW4uc2FuZHNAZnJlZS5mcj4iCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjgiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjkiCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJBbGNhdGVsIFNwZWVkVG91Y2ggVVNCIGRyaXZlciB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04KIAogc3RhdGljIGNvbnN0IGNoYXIgc3BlZWR0Y2hfZHJpdmVyX25hbWVbXSA9ICJzcGVlZHRjaCI7CiAKLSNkZWZpbmUgU1BFRURUT1VDSF9WRU5ET1JJRAkJMHgwNmI5Ci0jZGVmaW5lIFNQRUVEVE9VQ0hfUFJPRFVDVElECQkweDQwNjEKKyNkZWZpbmUgQ1RSTF9USU1FT1VUIDIwMDAJLyogbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIERBVEFfVElNRU9VVCAyMDAwCS8qIG1pbGxpc2Vjb25kcyAqLwogCi0vKiBUaW1lb3V0IGluIGppZmZpZXMgKi8KLSNkZWZpbmUgQ1RSTF9USU1FT1VUIDIwMDAKLSNkZWZpbmUgREFUQV9USU1FT1VUIDIwMDAKKyNkZWZpbmUgT0ZGU0VUXzcJMAkJLyogc2l6ZSAxICovCisjZGVmaW5lIE9GRlNFVF9iCTEJCS8qIHNpemUgOCAqLworI2RlZmluZSBPRkZTRVRfZAk5CQkvKiBzaXplIDQgKi8KKyNkZWZpbmUgT0ZGU0VUX2UJMTMJCS8qIHNpemUgMSAqLworI2RlZmluZSBPRkZTRVRfZgkxNAkJLyogc2l6ZSAxICovCisjZGVmaW5lIFRPVEFMCQkxNQogCi0jZGVmaW5lIE9GRlNFVF83ICAwCQkvKiBzaXplIDEgKi8KLSNkZWZpbmUgT0ZGU0VUX2IgIDEJCS8qIHNpemUgOCAqLwotI2RlZmluZSBPRkZTRVRfZCAgOQkJLyogc2l6ZSA0ICovCi0jZGVmaW5lIE9GRlNFVF9lIDEzCQkvKiBzaXplIDEgKi8KLSNkZWZpbmUgT0ZGU0VUX2YgMTQJCS8qIHNpemUgMSAqLwotI2RlZmluZSBUT1RBTCAgICAxNQorI2RlZmluZSBTSVpFXzcJCTEKKyNkZWZpbmUgU0laRV9iCQk4CisjZGVmaW5lIFNJWkVfZAkJNAorI2RlZmluZSBTSVpFX2UJCTEKKyNkZWZpbmUgU0laRV9mCQkxCiAKLSNkZWZpbmUgU0laRV83IDEKLSNkZWZpbmUgU0laRV9iIDgKLSNkZWZpbmUgU0laRV9kIDQKLSNkZWZpbmUgU0laRV9lIDEKLSNkZWZpbmUgU0laRV9mIDEKKyNkZWZpbmUgTUlOX1BPTExfREVMQVkJCTUwMDAJLyogbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIE1BWF9QT0xMX0RFTEFZCQk2MDAwMAkvKiBtaWxsaXNlY29uZHMgKi8KIAotc3RhdGljIGludCBkbF81MTJfZmlyc3QgPSAwOwotc3RhdGljIGludCBzd19idWZmZXJpbmcgPSAwOworI2RlZmluZSBSRVNVQk1JVF9ERUxBWQkJMTAwMAkvKiBtaWxsaXNlY29uZHMgKi8KIAotbW9kdWxlX3BhcmFtKGRsXzUxMl9maXJzdCwgYm9vbCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRsXzUxMl9maXJzdCwgIlJlYWQgNTEyIGJ5dGVzIGJlZm9yZSBzZW5kaW5nIGZpcm13YXJlIik7CisjZGVmaW5lIERFRkFVTFRfQUxUU0VUVElORwkxCisjZGVmaW5lIERFRkFVTFRfRExfNTEyX0ZJUlNUCTAKKyNkZWZpbmUgREVGQVVMVF9TV19CVUZGRVJJTkcJMAogCi1tb2R1bGVfcGFyYW0oc3dfYnVmZmVyaW5nLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moc3dfYnVmZmVyaW5nLCAiRW5hYmxlIHNvZnR3YXJlIGJ1ZmZlcmluZyIpOworc3RhdGljIGludCBhbHRzZXR0aW5nID0gREVGQVVMVF9BTFRTRVRUSU5HOworc3RhdGljIGludCBkbF81MTJfZmlyc3QgPSBERUZBVUxUX0RMXzUxMl9GSVJTVDsKK3N0YXRpYyBpbnQgc3dfYnVmZmVyaW5nID0gREVGQVVMVF9TV19CVUZGRVJJTkc7CiAKLSNkZWZpbmUgVURTTF9JT0NUTF9MSU5FX1VQCQkxCi0jZGVmaW5lIFVEU0xfSU9DVExfTElORV9ET1dOCQkyCittb2R1bGVfcGFyYW0oYWx0c2V0dGluZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGFsdHNldHRpbmcsCisJCSAiQWx0ZXJuYXRpdmUgc2V0dGluZyBmb3IgZGF0YSBpbnRlcmZhY2UgKGRlZmF1bHQ6ICIKKwkJIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX0FMVFNFVFRJTkcpICIpIik7CiAKLSNkZWZpbmUgU1BFRURUQ0hfRU5EUE9JTlRfSU5UCQkweDgxCi0jZGVmaW5lIFNQRUVEVENIX0VORFBPSU5UX0RBVEEJCTB4MDcKLSNkZWZpbmUgU1BFRURUQ0hfRU5EUE9JTlRfRklSTVdBUkUJMHgwNQorbW9kdWxlX3BhcmFtKGRsXzUxMl9maXJzdCwgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkbF81MTJfZmlyc3QsCisJCSAiUmVhZCA1MTIgYnl0ZXMgYmVmb3JlIHNlbmRpbmcgZmlybXdhcmUgKGRlZmF1bHQ6ICIKKwkJIF9fTU9EVUxFX1NUUklORyhERUZBVUxUX0RMXzUxMl9GSVJTVCkgIikiKTsKKworbW9kdWxlX3BhcmFtKHN3X2J1ZmZlcmluZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhzd19idWZmZXJpbmcsCisJCSAiRW5hYmxlIHNvZnR3YXJlIGJ1ZmZlcmluZyAoZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKERFRkFVTFRfU1dfQlVGRkVSSU5HKSAiKSIpOworCisjZGVmaW5lIEVORFBPSU5UX0lOVAkJMHg4MQorI2RlZmluZSBFTkRQT0lOVF9EQVRBCQkweDA3CisjZGVmaW5lIEVORFBPSU5UX0ZJUk1XQVJFCTB4MDUKIAogI2RlZmluZSBoZXgyaW50KGMpICggKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpID8gKGMgLSAnMCcpIDogKChjICYgMHhmKSArIDkpICkKIAotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHNwZWVkdGNoX3VzYl9pZHNbXSA9IHsKLQl7VVNCX0RFVklDRShTUEVFRFRPVUNIX1ZFTkRPUklELCBTUEVFRFRPVUNIX1BST0RVQ1RJRCl9LAotCXt9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgc3BlZWR0Y2hfdXNiX2lkcyk7Ci0KIHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhIHsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhIHU7CisJc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG07CiAKLQkvKiBTdGF0dXMgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhdHVzX2NoZWNrZXI7CisKKwl1bnNpZ25lZCBjaGFyIGxhc3Rfc3RhdHVzOworCisJaW50IHBvbGxfZGVsYXk7IC8qIG1pbGxpc2Vjb25kcyAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgcmVzdWJtaXRfdGltZXI7CiAJc3RydWN0IHVyYiAqaW50X3VyYjsKIAl1bnNpZ25lZCBjaGFyIGludF9kYXRhWzE2XTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcG9sbF93b3JrOwotCXN0cnVjdCB0aW1lcl9saXN0IHBvbGxfdGltZXI7Ci19OwotLyogVVNCICovCiAKLXN0YXRpYyBpbnQgc3BlZWR0Y2hfdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyB2b2lkIHNwZWVkdGNoX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLXN0YXRpYyBpbnQgc3BlZWR0Y2hfdXNiX2lvY3RsKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1bnNpZ25lZCBpbnQgY29kZSwKLQkJCSAgICAgIHZvaWQgKnVzZXJfZGF0YSk7Ci1zdGF0aWMgdm9pZCBzcGVlZHRjaF9oYW5kbGVfaW50KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotc3RhdGljIHZvaWQgc3BlZWR0Y2hfcG9sbF9zdGF0dXMoc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNwZWVkdGNoX3VzYl9kcml2ZXIgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9IHNwZWVkdGNoX2RyaXZlcl9uYW1lLAotCS5wcm9iZQkJPSBzcGVlZHRjaF91c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QJPSBzcGVlZHRjaF91c2JfZGlzY29ubmVjdCwKLQkuaW9jdGwJCT0gc3BlZWR0Y2hfdXNiX2lvY3RsLAotCS5pZF90YWJsZQk9IHNwZWVkdGNoX3VzYl9pZHMsCisJdW5zaWduZWQgY2hhciBzY3JhdGNoX2J1ZmZlcltUT1RBTF07CiB9OwogCiAvKioqKioqKioqKioqKioqCiAqKiAgZmlybXdhcmUgICoqCiAqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIHNwZWVkdGNoX2dvdF9maXJtd2FyZShzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCi0JCQkJICBpbnQgZ290X2l0KQorc3RhdGljIHZvaWQgc3BlZWR0Y2hfc2V0X3N3YnVmZihzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsIGludCBzdGF0ZSkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwotCi0JZG93bigmaW5zdGFuY2UtPnUuc2VyaWFsaXplKTsJLyogdnMgc2VsZiwgc3BlZWR0Y2hfZmlybXdhcmVfc3RhcnQgKi8KLQlpZiAoaW5zdGFuY2UtPnUuc3RhdHVzID09IFVEU0xfTE9BREVEX0ZJUk1XQVJFKQotCQlnb3RvIG91dDsKLQlpZiAoIWdvdF9pdCkgewotCQlpbnN0YW5jZS0+dS5zdGF0dXMgPSBVRFNMX05PX0ZJUk1XQVJFOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKChlcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShpbnN0YW5jZS0+dS51c2JfZGV2LCAxLCAxKSkgPCAwKSB7Ci0JCWRiZygic3BlZWR0Y2hfZ290X2Zpcm13YXJlOiB1c2Jfc2V0X2ludGVyZmFjZSByZXR1cm5lZCAlZCEiLCBlcnIpOwotCQlpbnN0YW5jZS0+dS5zdGF0dXMgPSBVRFNMX05PX0ZJUk1XQVJFOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBTZXQgdXAgaW50ZXJydXB0IGVuZHBvaW50ICovCi0JaW50ZiA9IHVzYl9pZm51bV90b19pZihpbnN0YW5jZS0+dS51c2JfZGV2LCAwKTsKLQlpZiAoaW50ZiAmJiAhdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoJnNwZWVkdGNoX3VzYl9kcml2ZXIsIGludGYsIE5VTEwpKSB7Ci0KLQkJaW5zdGFuY2UtPmludF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoaW5zdGFuY2UtPmludF91cmIpIHsKLQotCQkJdXNiX2ZpbGxfaW50X3VyYihpbnN0YW5jZS0+aW50X3VyYiwgaW5zdGFuY2UtPnUudXNiX2RldiwKLQkJCQkJIHVzYl9yY3ZpbnRwaXBlKGluc3RhbmNlLT51LnVzYl9kZXYsIFNQRUVEVENIX0VORFBPSU5UX0lOVCksCi0JCQkJCSBpbnN0YW5jZS0+aW50X2RhdGEsCi0JCQkJCSBzaXplb2YoaW5zdGFuY2UtPmludF9kYXRhKSwKLQkJCQkJIHNwZWVkdGNoX2hhbmRsZV9pbnQsIGluc3RhbmNlLCA1MCk7Ci0JCQllcnIgPSB1c2Jfc3VibWl0X3VyYihpbnN0YW5jZS0+aW50X3VyYiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJLyogRG9lc24ndCBtYXR0ZXI7IHdlJ2xsIHBvbGwgYW55d2F5ICovCi0JCQkJZGJnKCJzcGVlZHRjaF9nb3RfZmlybXdhcmU6IFN1Ym1pc3Npb24gb2YgaW50ZXJydXB0IFVSQiBmYWlsZWQgJWQiLCBlcnIpOwotCQkJCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+aW50X3VyYik7Ci0JCQkJaW5zdGFuY2UtPmludF91cmIgPSBOVUxMOwotCQkJCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJnNwZWVkdGNoX3VzYl9kcml2ZXIsIGludGYpOwotCQkJfQotCQl9Ci0JfQotCS8qIFN0YXJ0IHN0YXR1cyBwb2xsaW5nICovCi0JbW9kX3RpbWVyKCZpbnN0YW5jZS0+cG9sbF90aW1lciwgamlmZmllcyArICgxICogSFopKTsKLQotCWluc3RhbmNlLT51LnN0YXR1cyA9IFVEU0xfTE9BREVEX0ZJUk1XQVJFOwotCXRhc2tsZXRfc2NoZWR1bGUoJmluc3RhbmNlLT51LnJlY2VpdmVfdGFza2xldCk7Ci0gb3V0OgotCXVwKCZpbnN0YW5jZS0+dS5zZXJpYWxpemUpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5zdGFuY2UtPnUuZmlybXdhcmVfd2FpdGVycyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3BlZWR0Y2hfc2V0X3N3YnVmZihzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCi0JCQkgICAgICAgaW50IHN0YXRlKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnN0YW5jZS0+dS51c2JfZGV2OworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVzYmF0bS0+dXNiX2RldjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDMyLCAweDQwLCBzdGF0ZSA/IDB4MDEgOiAweDAwLAotCQkJICAgICAgMHgwMCwgTlVMTCwgMCwgMTAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoIldhcm5pbmc6ICVzYWJsaW5nIFNXIGJ1ZmZlcmluZzogdXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVkXG4iLAotCQkgICAgIHN0YXRlID8gIkVuIiA6ICJEaXMiLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWRiZygic3BlZWR0Y2hfc2V0X3N3YnVmZjogJXNibGVkIFNXIGJ1ZmZlcmluZyIsIHN0YXRlID8gIkVuIiA6ICJEaXMiKTsKLQlyZXR1cm4gMDsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3NuZGN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgzMiwgMHg0MCwgc3RhdGUgPyAweDAxIDogMHgwMCwgMHgwMCwgTlVMTCwgMCwgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkKKwkJdXNiX3dhcm4odXNiYXRtLAorCQkJICIlc2FibGluZyBTVyBidWZmZXJpbmc6IHVzYl9jb250cm9sX21zZyByZXR1cm5lZCAlZFxuIiwKKwkJCSBzdGF0ZSA/ICJFbiIgOiAiRGlzIiwgcmV0KTsKKwllbHNlCisJCWRiZygic3BlZWR0Y2hfc2V0X3N3YnVmZjogJXNibGVkIFNXIGJ1ZmZlcmluZyIsIHN0YXRlID8gIkVuIiA6ICJEaXMiKTsKIH0KIAogc3RhdGljIHZvaWQgc3BlZWR0Y2hfdGVzdF9zZXF1ZW5jZShzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCiB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGluc3RhbmNlLT51LnVzYl9kZXY7Ci0JdW5zaWduZWQgY2hhciBidWZbMTBdOworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVzYmF0bS0+dXNiX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBpbnN0YW5jZS0+c2NyYXRjaF9idWZmZXI7CiAJaW50IHJldDsKIAogCS8qIFVSQiAxNDcgKi8KIAlidWZbMF0gPSAweDFjOwogCWJ1ZlsxXSA9IDB4NTA7Ci0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDAxLCAweDQwLCAweDBiLCAweDAwLCBidWYsIDIsIDEwMCk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9zbmRjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MDEsIDB4NDAsIDB4MGIsIDB4MDAsIGJ1ZiwgMiwgQ1RSTF9USU1FT1VUKTsKIAlpZiAocmV0IDwgMCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgZmFpbGVkIG9uIFVSQjE0NzogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQl1c2Jfd2Fybih1c2JhdG0sICIlcyBmYWlsZWQgb24gVVJCMTQ3OiAlZFxuIiwgX19mdW5jX18sIHJldCk7CiAKIAkvKiBVUkIgMTQ4ICovCiAJYnVmWzBdID0gMHgzMjsKIAlidWZbMV0gPSAweDAwOwotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgwMSwgMHg0MCwgMHgwMiwgMHgwMCwgYnVmLCAyLCAxMDApOworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweDQwLCAweDAyLCAweDAwLCBidWYsIDIsIENUUkxfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGZhaWxlZCBvbiBVUkIxNDg6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJdXNiX3dhcm4odXNiYXRtLCAiJXMgZmFpbGVkIG9uIFVSQjE0ODogJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCiAJLyogVVJCIDE0OSAqLwogCWJ1ZlswXSA9IDB4MDE7CiAJYnVmWzFdID0gMHgwMDsKIAlidWZbMl0gPSAweDAxOwotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgwMSwgMHg0MCwgMHgwMywgMHgwMCwgYnVmLCAzLCAxMDApOworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweDQwLCAweDAzLCAweDAwLCBidWYsIDMsIENUUkxfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGZhaWxlZCBvbiBVUkIxNDk6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJdXNiX3dhcm4odXNiYXRtLCAiJXMgZmFpbGVkIG9uIFVSQjE0OTogJWRcbiIsIF9fZnVuY19fLCByZXQpOwogCiAJLyogVVJCIDE1MCAqLwogCWJ1ZlswXSA9IDB4MDE7CiAJYnVmWzFdID0gMHgwMDsKIAlidWZbMl0gPSAweDAxOwotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgwMSwgMHg0MCwgMHgwNCwgMHgwMCwgYnVmLCAzLCAxMDApOworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2Jfc25kY3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweDQwLCAweDA0LCAweDAwLCBidWYsIDMsIENUUkxfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIGZhaWxlZCBvbiBVUkIxNTA6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJdXNiX3dhcm4odXNiYXRtLCAiJXMgZmFpbGVkIG9uIFVSQjE1MDogJWRcbiIsIF9fZnVuY19fLCByZXQpOwogfQogCi1zdGF0aWMgaW50IHNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnN0YW5jZS0+dS51c2JfZGV2OwotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwotCWludCByZXQ7Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MDQsIDB4MDAsCi0JCQkgICAgICBidWYsIHNpemVvZihidWYpLCBDVFJMX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlNwZWVkVG91Y2g6IEZhaWxlZCB0byBzdGFydCBBRFNMIHN5bmNocm9uaXNhdGlvbjogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZGJnKCJzcGVlZHRjaF9zdGFydF9zeW5jaHJvOiBtb2RlbSBwcm9kZGVkLiAlZCBCeXRlcyByZXR1cm5lZDogJTAyeCAlMDJ4IiwgcmV0LCBidWZbMF0sIGJ1ZlsxXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHNwZWVkdGNoX2hhbmRsZV9pbnQoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCWludCByZXQ7Ci0KLQkvKiBUaGUgbWFnaWMgaW50ZXJydXB0IGZvciAidXAgc3RhdGUiICovCi0JY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgdXBfaW50WzZdICAgPSB7IDB4YTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLQkvKiBUaGUgbWFnaWMgaW50ZXJydXB0IGZvciAiZG93biBzdGF0ZSIgKi8KLQljb25zdCBzdGF0aWMgdW5zaWduZWQgY2hhciBkb3duX2ludFs2XSA9IHsgMHhhMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi0Jc3dpdGNoICh1cmItPnN0YXR1cykgewotCWNhc2UgMDoKLQkJLyogc3VjY2VzcyAqLwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgotCWNhc2UgLUVOT0VOVDoKLQljYXNlIC1FU0hVVERPV046Ci0JCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQ7IGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGNvdW50IDwgNikgewotCQlkYmcoIiVzIC0gaW50IHBhY2tldCB0b28gc2hvcnQiLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoIW1lbWNtcCh1cF9pbnQsIGluc3RhbmNlLT5pbnRfZGF0YSwgNikpIHsKLQkJZGVsX3RpbWVyKCZpbnN0YW5jZS0+cG9sbF90aW1lcik7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiRFNMIGxpbmUgZ29lcyB1cFxuIik7Ci0JfSBlbHNlIGlmICghbWVtY21wKGRvd25faW50LCBpbnN0YW5jZS0+aW50X2RhdGEsIDYpKSB7Ci0JCXByaW50ayhLRVJOX05PVElDRSAiRFNMIGxpbmUgZ29lcyBkb3duXG4iKTsKLQl9IGVsc2UgewotCQlpbnQgaTsKLQotCQlwcmludGsoS0VSTl9ERUJVRyAiVW5rbm93biBpbnRlcnJ1cHQgcGFja2V0IG9mICVkIGJ5dGVzOiIsIGNvdW50KTsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQlwcmludGsoIiAlMDJ4IiwgaW5zdGFuY2UtPmludF9kYXRhW2ldKTsKLQkJcHJpbnRrKCJcbiIpOwotCX0KLQlzY2hlZHVsZV93b3JrKCZpbnN0YW5jZS0+cG9sbF93b3JrKTsKLQotIGV4aXQ6Ci0Jcm1iKCk7Ci0JaWYgKCFpbnN0YW5jZS0+aW50X3VyYikKLQkJcmV0dXJuOwotCi0JcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0KQotCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwgX19mdW5jX18sIHJldCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3BlZWR0Y2hfZ2V0X3N0YXR1cyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCi0JCQkgICAgICAgdW5zaWduZWQgY2hhciAqYnVmKQotewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnN0YW5jZS0+dS51c2JfZGV2OwotCWludCByZXQ7Ci0KLQltZW1zZXQoYnVmLCAwLCBUT1RBTCk7Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MDcsIDB4MDAsIGJ1ZiArIE9GRlNFVF83LCBTSVpFXzcsCi0JCQkgICAgICBDVFJMX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygiTVNHIDcgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDEyLCAweGMwLCAweDBiLCAweDAwLCBidWYgKyBPRkZTRVRfYiwgU0laRV9iLAotCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoIk1TRyBCIGZhaWxlZCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAotCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwZCwgMHgwMCwgYnVmICsgT0ZGU0VUX2QsIFNJWkVfZCwKLQkJCSAgICAgIENUUkxfVElNRU9VVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGJnKCJNU0cgRCBmYWlsZWQiKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKLQkJCSAgICAgIDB4MDEsIDB4YzAsIDB4MGUsIDB4MDAsIGJ1ZiArIE9GRlNFVF9lLCBTSVpFX2UsCi0JCQkgICAgICBDVFJMX1RJTUVPVVQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRiZygiTVNHIEUgZmFpbGVkIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDAxLCAweGMwLCAweDBmLCAweDAwLCBidWYgKyBPRkZTRVRfZiwgU0laRV9mLAotCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkYmcoIk1TRyBGIGZhaWxlZCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzcGVlZHRjaF9wb2xsX3N0YXR1cyhzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCi17Ci0JdW5zaWduZWQgY2hhciBidWZbVE9UQUxdOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzcGVlZHRjaF9nZXRfc3RhdHVzKGluc3RhbmNlLCBidWYpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIlNwZWVkVG91Y2g6IEVycm9yICVkIGZldGNoaW5nIGRldmljZSBzdGF0dXNcbiIsIHJldCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkYmcoIkxpbmUgc3RhdGUgJTAyeCIsIGJ1ZltPRkZTRVRfN10pOwotCi0Jc3dpdGNoIChidWZbT0ZGU0VUXzddKSB7Ci0JY2FzZSAwOgotCQlpZiAoaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX0xPU1QpIHsKLQkJCWluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFEU0wgbGluZSBpcyBkb3duXG4iKTsKLQkJCS8qIEl0J2xsIG5ldmVyIHJlc3luYyBhZ2FpbiB1bmxlc3Mgd2UgYXNrIGl0IHRvLi4uICovCi0JCQlzcGVlZHRjaF9zdGFydF9zeW5jaHJvKGluc3RhbmNlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgMHgwODoKLQkJaWYgKGluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCAhPSBBVE1fUEhZX1NJR19VTktOT1dOKSB7Ci0JCQlpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19VTktOT1dOOwotCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBRFNMIGxpbmUgaXMgYmxvY2tlZD9cbiIpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAweDEwOgotCQlpZiAoaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX0xPU1QpIHsKLQkJCWluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX0xPU1Q7Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFEU0wgbGluZSBpcyBzeW5jaHJvbmlzaW5nXG4iKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgMHgyMDoKLQkJaWYgKGluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCAhPSBBVE1fUEhZX1NJR19GT1VORCkgewotCQkJaW50IGRvd25fc3BlZWQgPSBidWZbT0ZGU0VUX2JdIHwgKGJ1ZltPRkZTRVRfYiArIDFdIDw8IDgpCi0JCQkJfCAoYnVmW09GRlNFVF9iICsgMl0gPDwgMTYpIHwgKGJ1ZltPRkZTRVRfYiArIDNdIDw8IDI0KTsKLQkJCWludCB1cF9zcGVlZCA9IGJ1ZltPRkZTRVRfYiArIDRdIHwgKGJ1ZltPRkZTRVRfYiArIDVdIDw8IDgpCi0JCQkJfCAoYnVmW09GRlNFVF9iICsgNl0gPDwgMTYpIHwgKGJ1ZltPRkZTRVRfYiArIDddIDw8IDI0KTsKLQotCQkJaWYgKCEoZG93bl9zcGVlZCAmIDB4MDAwMGZmZmYpICYmCi0JCQkgICAgISh1cF9zcGVlZCAmIDB4MDAwMGZmZmYpKSB7Ci0JCQkJZG93bl9zcGVlZCA+Pj0gMTY7Ci0JCQkJdXBfc3BlZWQgPj49IDE2OwotCQkJfQotCQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+bGlua19yYXRlID0gZG93bl9zcGVlZCAqIDEwMDAgLyA0MjQ7Ci0JCQlpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19GT1VORDsKLQotCQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkgICAgICAgIkFEU0wgbGluZSBpcyB1cCAoJWQgS2liL3MgZG93biB8ICVkIEtpYi9zIHVwKVxuIiwKLQkJCSAgICAgICBkb3duX3NwZWVkLCB1cF9zcGVlZCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlpZiAoaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsICE9IEFUTV9QSFlfU0lHX1VOS05PV04pIHsKLQkJCWluc3RhbmNlLT51LmF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047Ci0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVua25vd24gbGluZSBzdGF0ZSAlMDJ4XG4iLCBidWZbT0ZGU0VUXzddKTsKLQkJfQotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNwZWVkdGNoX3RpbWVyX3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9ICh2b2lkICopZGF0YTsKLQotCXNjaGVkdWxlX3dvcmsoJmluc3RhbmNlLT5wb2xsX3dvcmspOwotCW1vZF90aW1lcigmaW5zdGFuY2UtPnBvbGxfdGltZXIsIGppZmZpZXMgKyAoNSAqIEhaKSk7Ci19Ci0KLSNpZmRlZiBVU0VfRldfTE9BREVSCi1zdGF0aWMgdm9pZCBzcGVlZHRjaF91cGxvYWRfZmlybXdhcmUoc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlLAorc3RhdGljIGludCBzcGVlZHRjaF91cGxvYWRfZmlybXdhcmUoc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzEsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3MikKIHsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBpbnN0YW5jZS0+dS51c2JfZGV2OworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKLQlpbnQgYWN0dWFsX2xlbmd0aCwgcmV0OworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gdXNiYXRtLT51c2JfZGV2OworCWludCBhY3R1YWxfbGVuZ3RoOworCWludCByZXQgPSAwOwogCWludCBvZmZzZXQ7CiAKLQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZSIpOwotCi0JaWYgKCEoaW50ZiA9IHVzYl9pZm51bV90b19pZih1c2JfZGV2LCAyKSkpIHsKLQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IGludGVyZmFjZSBub3QgZm91bmQhIik7Ci0JCWdvdG8gZmFpbDsKLQl9CisJdXNiX2RiZyh1c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIShidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSkpIHsKLQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IG5vIG1lbW9yeSBmb3IgYnVmZmVyISIpOwotCQlnb3RvIGZhaWw7CisJCXJldCA9IC1FTk9NRU07CisJCXVzYl9kYmcodXNiYXRtLCAiJXM6IG5vIG1lbW9yeSBmb3IgYnVmZmVyIVxuIiwgX19mdW5jX18pOworCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBBIHVzZXItc3BhY2UgZmlybXdhcmUgbG9hZGVyIG1heSBhbHJlYWR5IGhhdmUgY2xhaW1lZCBpbnRlcmZhY2UgIzIgKi8KLQlpZiAoKHJldCA9Ci0JICAgICB1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmc3BlZWR0Y2hfdXNiX2RyaXZlciwgaW50ZiwgTlVMTCkpIDwgMCkgewotCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogaW50ZXJmYWNlIGluIHVzZSAoJWQpISIsIHJldCk7Ci0JCWdvdG8gZmFpbF9mcmVlOworCWlmICghKGludGYgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgMikpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCXVzYl9kYmcodXNiYXRtLCAiJXM6IGludGVyZmFjZSBub3QgZm91bmQhXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJLyogVVJCIDcgKi8KIAlpZiAoZGxfNTEyX2ZpcnN0KSB7CS8qIHNvbWUgbW9kZW1zIG5lZWQgYSByZWFkIGJlZm9yZSB3cml0aW5nIHRoZSBmaXJtd2FyZSAqLwotCQlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIFNQRUVEVENIX0VORFBPSU5UX0ZJUk1XQVJFKSwKKwkJcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9yY3ZidWxrcGlwZSh1c2JfZGV2LCBFTkRQT0lOVF9GSVJNV0FSRSksCiAJCQkJICAgYnVmZmVyLCAweDIwMCwgJmFjdHVhbF9sZW5ndGgsIDIwMDApOwogCiAJCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRVRJTUVET1VUKQotCQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IHJlYWQgQkxPQ0swIGZyb20gbW9kZW0gZmFpbGVkICglZCkhIiwgcmV0KTsKKwkJCXVzYl9kYmcodXNiYXRtLCAiJXM6IHJlYWQgQkxPQ0swIGZyb20gbW9kZW0gZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAkJZWxzZQotCQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IEJMT0NLMCBkb3dubG9hZGVkICglZCBieXRlcykiLCByZXQpOworCQkJdXNiX2RiZyh1c2JhdG0sICIlczogQkxPQ0swIGRvd25sb2FkZWQgKCVkIGJ5dGVzKVxuIiwgX19mdW5jX18sIHJldCk7CiAJfQogCiAJLyogVVJCIDggOiBib3RoIGxlZHMgYXJlIHN0YXRpYyBncmVlbiAqLwpAQCAtNDg5LDYwICsyMTUsNjAgQEAKIAkJaW50IHRoaXNsZW4gPSBtaW5fdChpbnQsIFBBR0VfU0laRSwgZncxLT5zaXplIC0gb2Zmc2V0KTsKIAkJbWVtY3B5KGJ1ZmZlciwgZncxLT5kYXRhICsgb2Zmc2V0LCB0aGlzbGVuKTsKIAotCQlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIFNQRUVEVENIX0VORFBPSU5UX0ZJUk1XQVJFKSwKKwkJcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBFTkRQT0lOVF9GSVJNV0FSRSksCiAJCQkJICAgYnVmZmVyLCB0aGlzbGVuLCAmYWN0dWFsX2xlbmd0aCwgREFUQV9USU1FT1VUKTsKIAogCQlpZiAocmV0IDwgMCkgewotCQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IHdyaXRlIEJMT0NLMSB0byBtb2RlbSBmYWlsZWQgKCVkKSEiLCByZXQpOwotCQkJZ290byBmYWlsX3JlbGVhc2U7CisJCQl1c2JfZGJnKHVzYmF0bSwgIiVzOiB3cml0ZSBCTE9DSzEgdG8gbW9kZW0gZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KLQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IEJMT0NLMSB1cGxvYWRlZCAoJXp1IGJ5dGVzKSIsIGZ3MS0+c2l6ZSk7CisJCXVzYl9kYmcodXNiYXRtLCAiJXM6IEJMT0NLMSB1cGxvYWRlZCAoJXp1IGJ5dGVzKVxuIiwgX19mdW5jX18sIGZ3MS0+c2l6ZSk7CiAJfQogCiAJLyogVVNCIGxlZCBibGlua2luZyBncmVlbiwgQURTTCBsZWQgb2ZmICovCiAKIAkvKiBVUkIgMTEgKi8KLQlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIFNQRUVEVENIX0VORFBPSU5UX0ZJUk1XQVJFKSwKKwlyZXQgPSB1c2JfYnVsa19tc2codXNiX2RldiwgdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIEVORFBPSU5UX0ZJUk1XQVJFKSwKIAkJCSAgIGJ1ZmZlciwgMHgyMDAsICZhY3R1YWxfbGVuZ3RoLCBEQVRBX1RJTUVPVVQpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IHJlYWQgQkxPQ0syIGZyb20gbW9kZW0gZmFpbGVkICglZCkhIiwgcmV0KTsKLQkJZ290byBmYWlsX3JlbGVhc2U7CisJCXVzYl9kYmcodXNiYXRtLCAiJXM6IHJlYWQgQkxPQ0syIGZyb20gbW9kZW0gZmFpbGVkICglZCkhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBvdXRfZnJlZTsKIAl9Ci0JZGJnKCJzcGVlZHRjaF91cGxvYWRfZmlybXdhcmU6IEJMT0NLMiBkb3dubG9hZGVkICglZCBieXRlcykiLCBhY3R1YWxfbGVuZ3RoKTsKKwl1c2JfZGJnKHVzYmF0bSwgIiVzOiBCTE9DSzIgZG93bmxvYWRlZCAoJWQgYnl0ZXMpXG4iLCBfX2Z1bmNfXywgYWN0dWFsX2xlbmd0aCk7CiAKIAkvKiBVUkJzIDEyIHRvIDEzOSAtIFVTQiBsZWQgYmxpbmtpbmcgZ3JlZW4sIEFEU0wgbGVkIG9mZiAqLwogCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZncyLT5zaXplOyBvZmZzZXQgKz0gUEFHRV9TSVpFKSB7CiAJCWludCB0aGlzbGVuID0gbWluX3QoaW50LCBQQUdFX1NJWkUsIGZ3Mi0+c2l6ZSAtIG9mZnNldCk7CiAJCW1lbWNweShidWZmZXIsIGZ3Mi0+ZGF0YSArIG9mZnNldCwgdGhpc2xlbik7CiAKLQkJcmV0ID0gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBTUEVFRFRDSF9FTkRQT0lOVF9GSVJNV0FSRSksCisJCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgRU5EUE9JTlRfRklSTVdBUkUpLAogCQkJCSAgIGJ1ZmZlciwgdGhpc2xlbiwgJmFjdHVhbF9sZW5ndGgsIERBVEFfVElNRU9VVCk7CiAKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRiZygic3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlOiB3cml0ZSBCTE9DSzMgdG8gbW9kZW0gZmFpbGVkICglZCkhIiwgcmV0KTsKLQkJCWdvdG8gZmFpbF9yZWxlYXNlOworCQkJdXNiX2RiZyh1c2JhdG0sICIlczogd3JpdGUgQkxPQ0szIHRvIG1vZGVtIGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7CisJCQlnb3RvIG91dF9mcmVlOwogCQl9CiAJfQotCWRiZygic3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlOiBCTE9DSzMgdXBsb2FkZWQgKCV6dSBieXRlcykiLCBmdzItPnNpemUpOworCXVzYl9kYmcodXNiYXRtLCAiJXM6IEJMT0NLMyB1cGxvYWRlZCAoJXp1IGJ5dGVzKVxuIiwgX19mdW5jX18sIGZ3Mi0+c2l6ZSk7CiAKIAkvKiBVU0IgbGVkIHN0YXRpYyBncmVlbiwgQURTTCBsZWQgc3RhdGljIHJlZCAqLwogCiAJLyogVVJCIDE0MiAqLwotCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgU1BFRURUQ0hfRU5EUE9JTlRfRklSTVdBUkUpLAorCXJldCA9IHVzYl9idWxrX21zZyh1c2JfZGV2LCB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgRU5EUE9JTlRfRklSTVdBUkUpLAogCQkJICAgYnVmZmVyLCAweDIwMCwgJmFjdHVhbF9sZW5ndGgsIERBVEFfVElNRU9VVCk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogcmVhZCBCTE9DSzQgZnJvbSBtb2RlbSBmYWlsZWQgKCVkKSEiLCByZXQpOwotCQlnb3RvIGZhaWxfcmVsZWFzZTsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogcmVhZCBCTE9DSzQgZnJvbSBtb2RlbSBmYWlsZWQgKCVkKSFcbiIsIF9fZnVuY19fLCByZXQpOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCS8qIHN1Y2Nlc3MgKi8KLQlkYmcoInNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZTogQkxPQ0s0IGRvd25sb2FkZWQgKCVkIGJ5dGVzKSIsIGFjdHVhbF9sZW5ndGgpOworCXVzYl9kYmcodXNiYXRtLCAiJXM6IEJMT0NLNCBkb3dubG9hZGVkICglZCBieXRlcylcbiIsIF9fZnVuY19fLCBhY3R1YWxfbGVuZ3RoKTsKIAogCS8qIERlbGF5IHRvIGFsbG93IGZpcm13YXJlIHRvIHN0YXJ0IHVwLiBXZSBjYW4gZG8gdGhpcyBoZXJlCiAJICAgYmVjYXVzZSB3ZSdyZSBpbiBvdXIgb3duIGtlcm5lbCB0aHJlYWQgYW55d2F5LiAqLwotCW1zbGVlcCgxMDAwKTsKKwltc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwKTsKIAogCS8qIEVuYWJsZSBzb2Z0d2FyZSBidWZmZXJpbmcsIGlmIHJlcXVlc3RlZCAqLwogCWlmIChzd19idWZmZXJpbmcpCkBAIC01NTEsMjkxICsyNzcsNTQzIEBACiAJLyogTWFnaWMgc3BlbGw7IGRvbid0IGFzayB1cyB3aGF0IHRoaXMgZG9lcyAqLwogCXNwZWVkdGNoX3Rlc3Rfc2VxdWVuY2UoaW5zdGFuY2UpOwogCi0JLyogU3RhcnQgbW9kZW0gc3luY2hyb25pc2F0aW9uICovCi0JaWYgKHNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oaW5zdGFuY2UpKQotCQlkYmcoInNwZWVkdGNoX3N0YXJ0X3N5bmNocm86IGZhaWxlZCIpOworCXJldCA9IDA7CiAKLQlzcGVlZHRjaF9nb3RfZmlybXdhcmUoaW5zdGFuY2UsIDEpOwotCitvdXRfZnJlZToKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKLQlyZXR1cm47Ci0KLSBmYWlsX3JlbGVhc2U6Ci0JLyogT25seSByZWxlYXNlIGludGVyZmFjZSAjMiBpZiB1cGxvYWRpbmcgZmFpbGVkOyB3ZSBkb24ndCByZWxlYXNlIGl0Ci0JICAgd2Ugc3VjY2VlZGVkLiAgVGhpcyBwcmV2ZW50cyB0aGUgdXNlcnNwYWNlIHRvb2xzIGZyb20gdHJ5aW5nIHRvIGxvYWQKLQkgICB0aGUgZmlybXdhcmUgdGhlbXNlbHZlcyAqLwotCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJnNwZWVkdGNoX3VzYl9kcml2ZXIsIGludGYpOwotIGZhaWxfZnJlZToKLQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyKTsKLSBmYWlsOgotCXNwZWVkdGNoX2dvdF9maXJtd2FyZShpbnN0YW5jZSwgMCk7CitvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzcGVlZHRjaF9maW5kX2Zpcm13YXJlKHN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhCi0JCQkJICAqaW5zdGFuY2UsIGludCBwaGFzZSwKK3N0YXRpYyBpbnQgc3BlZWR0Y2hfZmluZF9maXJtd2FyZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgaW50IHBoYXNlLAogCQkJCSAgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZndfcCkKIHsKLQljaGFyIGJ1ZlsyNF07Ci0JY29uc3QgdTE2IGJjZERldmljZSA9IGxlMTZfdG9fY3B1KGluc3RhbmNlLT51LnVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50Zi0+ZGV2OworCWNvbnN0IHUxNiBiY2REZXZpY2UgPSBsZTE2X3RvX2NwdShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLT5kZXNjcmlwdG9yLmJjZERldmljZSk7CiAJY29uc3QgdTggbWFqb3JfcmV2aXNpb24gPSBiY2REZXZpY2UgPj4gODsKIAljb25zdCB1OCBtaW5vcl9yZXZpc2lvbiA9IGJjZERldmljZSAmIDB4ZmY7CisJY2hhciBidWZbMjRdOwogCiAJc3ByaW50ZihidWYsICJzcGVlZHRjaC0lZC5iaW4uJXguJTAyeCIsIHBoYXNlLCBtYWpvcl9yZXZpc2lvbiwgbWlub3JfcmV2aXNpb24pOwotCWRiZygic3BlZWR0Y2hfZmluZF9maXJtd2FyZTogbG9va2luZyBmb3IgJXMiLCBidWYpOworCWRldl9kYmcoZGV2LCAiJXM6IGxvb2tpbmcgZm9yICVzXG4iLCBfX2Z1bmNfXywgYnVmKTsKIAotCWlmIChyZXF1ZXN0X2Zpcm13YXJlKGZ3X3AsIGJ1ZiwgJmluc3RhbmNlLT51LnVzYl9kZXYtPmRldikpIHsKKwlpZiAocmVxdWVzdF9maXJtd2FyZShmd19wLCBidWYsIGRldikpIHsKIAkJc3ByaW50ZihidWYsICJzcGVlZHRjaC0lZC5iaW4uJXgiLCBwaGFzZSwgbWFqb3JfcmV2aXNpb24pOwotCQlkYmcoInNwZWVkdGNoX2ZpbmRfZmlybXdhcmU6IGxvb2tpbmcgZm9yICVzIiwgYnVmKTsKKwkJZGV2X2RiZyhkZXYsICIlczogbG9va2luZyBmb3IgJXNcbiIsIF9fZnVuY19fLCBidWYpOwogCi0JCWlmIChyZXF1ZXN0X2Zpcm13YXJlKGZ3X3AsIGJ1ZiwgJmluc3RhbmNlLT51LnVzYl9kZXYtPmRldikpIHsKKwkJaWYgKHJlcXVlc3RfZmlybXdhcmUoZndfcCwgYnVmLCBkZXYpKSB7CiAJCQlzcHJpbnRmKGJ1ZiwgInNwZWVkdGNoLSVkLmJpbiIsIHBoYXNlKTsKLQkJCWRiZygic3BlZWR0Y2hfZmluZF9maXJtd2FyZTogbG9va2luZyBmb3IgJXMiLCBidWYpOworCQkJZGV2X2RiZyhkZXYsICIlczogbG9va2luZyBmb3IgJXNcbiIsIF9fZnVuY19fLCBidWYpOwogCi0JCQlpZiAocmVxdWVzdF9maXJtd2FyZShmd19wLCBidWYsICZpbnN0YW5jZS0+dS51c2JfZGV2LT5kZXYpKSB7Ci0JCQkJZGV2X3dhcm4oJmluc3RhbmNlLT51LnVzYl9kZXYtPmRldiwgIm5vIHN0YWdlICVkIGZpcm13YXJlIGZvdW5kISIsIHBoYXNlKTsKKwkJCWlmIChyZXF1ZXN0X2Zpcm13YXJlKGZ3X3AsIGJ1ZiwgZGV2KSkgeworCQkJCWRldl93YXJuKGRldiwgIm5vIHN0YWdlICVkIGZpcm13YXJlIGZvdW5kIVxuIiwgcGhhc2UpOwogCQkJCXJldHVybiAtRU5PRU5UOwogCQkJfQogCQl9CiAJfQogCi0JZGV2X2luZm8oJmluc3RhbmNlLT51LnVzYl9kZXYtPmRldiwgImZvdW5kIHN0YWdlICVkIGZpcm13YXJlICVzXG4iLCBwaGFzZSwgYnVmKTsKKwlkZXZfaW5mbyhkZXYsICJmb3VuZCBzdGFnZSAlZCBmaXJtd2FyZSAlc1xuIiwgcGhhc2UsIGJ1Zik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzcGVlZHRjaF9sb2FkX2Zpcm13YXJlKHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgc3BlZWR0Y2hfaGVhdnlfaW5pdChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzEsICpmdzI7Ci0Jc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gYXJnOworCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHVzYmF0bS0+ZHJpdmVyX2RhdGE7CisJaW50IHJldDsKIAotCUJVR19PTighaW5zdGFuY2UpOworCWlmICgocmV0ID0gc3BlZWR0Y2hfZmluZF9maXJtd2FyZShpbnRmLCAxLCAmZncxKSkgPCAwKQorCQkJcmV0dXJuIHJldDsKIAotCWRhZW1vbml6ZSgiZmlybXdhcmUvc3BlZWR0Y2giKTsKLQotCWlmICghc3BlZWR0Y2hfZmluZF9maXJtd2FyZShpbnN0YW5jZSwgMSwgJmZ3MSkpIHsKLQkJaWYgKCFzcGVlZHRjaF9maW5kX2Zpcm13YXJlKGluc3RhbmNlLCAyLCAmZncyKSkgewotCQkJc3BlZWR0Y2hfdXBsb2FkX2Zpcm13YXJlKGluc3RhbmNlLCBmdzEsIGZ3Mik7Ci0JCQlyZWxlYXNlX2Zpcm13YXJlKGZ3Mik7Ci0JCX0KKwlpZiAoKHJldCA9IHNwZWVkdGNoX2ZpbmRfZmlybXdhcmUoaW50ZiwgMiwgJmZ3MikpIDwgMCkgewogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3MSk7CisJCXJldHVybiByZXQ7CiAJfQogCi0JLyogSW4gY2FzZSB3ZSBmYWlsZWQsIHNldCBzdGF0ZSBiYWNrIHRvIE5PX0ZJUk1XQVJFIHNvIHRoYXQKLQkgICBhbm90aGVyIGxhdGVyIGF0dGVtcHQgbWF5IHdvcmsuIE90aGVyd2lzZSwgd2UgbmV2ZXIgYWN0dWFsbHkKLQkgICBtYW5hZ2UgdG8gcmVjb3ZlciBpZiwgZm9yIGV4YW1wbGUsIHRoZSBmaXJtd2FyZSBpcyBvbiAvdXNyIGFuZAotCSAgIHdlIGxvb2sgZm9yIGl0IHRvbyBlYXJseS4gKi8KLQlzcGVlZHRjaF9nb3RfZmlybXdhcmUoaW5zdGFuY2UsIDApOworCXJldCA9IHNwZWVkdGNoX3VwbG9hZF9maXJtd2FyZShpbnN0YW5jZSwgZncxLCBmdzIpOwogCi0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci0JdWRzbF9wdXRfaW5zdGFuY2UoJmluc3RhbmNlLT51KTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3Mik7CisJcmVsZWFzZV9maXJtd2FyZShmdzEpOworCisJcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKgorKiogIEFUTSAgKioKKyoqKioqKioqKiovCisKK3N0YXRpYyBpbnQgc3BlZWR0Y2hfcmVhZF9zdGF0dXMoc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVzYmF0bS0+dXNiX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBpbnN0YW5jZS0+c2NyYXRjaF9idWZmZXI7CisJaW50IHJldDsKKworCW1lbXNldChidWYsIDAsIFRPVEFMKTsKKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDEyLCAweGMwLCAweDA3LCAweDAwLCBidWYgKyBPRkZTRVRfNywgU0laRV83LAorCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBNU0cgNyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwYiwgMHgwMCwgYnVmICsgT0ZGU0VUX2IsIFNJWkVfYiwKKwkJCSAgICAgIENUUkxfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJYXRtX2RiZyh1c2JhdG0sICIlczogTVNHIEIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MGQsIDB4MDAsIGJ1ZiArIE9GRlNFVF9kLCBTSVpFX2QsCisJCQkgICAgICBDVFJMX1RJTUVPVVQpOworCWlmIChyZXQgPCAwKSB7CisJCWF0bV9kYmcodXNiYXRtLCAiJXM6IE1TRyBEIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCisJCQkgICAgICAweDAxLCAweGMwLCAweDBlLCAweDAwLCBidWYgKyBPRkZTRVRfZSwgU0laRV9lLAorCQkJICAgICAgQ1RSTF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiBNU0cgRSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgwMSwgMHhjMCwgMHgwZiwgMHgwMCwgYnVmICsgT0ZGU0VUX2YsIFNJWkVfZiwKKwkJCSAgICAgIENUUkxfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJYXRtX2RiZyh1c2JhdG0sICIlczogTVNHIEYgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXQ7CisJfQorCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogVVNFX0ZXX0xPQURFUiAqLwogCi1zdGF0aWMgdm9pZCBzcGVlZHRjaF9maXJtd2FyZV9zdGFydChzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCitzdGF0aWMgaW50IHNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKQogewotI2lmZGVmIFVTRV9GV19MT0FERVIKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSA9IGluc3RhbmNlLT51c2JhdG07CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1c2JhdG0tPnVzYl9kZXY7CisJdW5zaWduZWQgY2hhciAqYnVmID0gaW5zdGFuY2UtPnNjcmF0Y2hfYnVmZmVyOwogCWludCByZXQ7Ci0jZW5kaWYKIAotCWRiZygic3BlZWR0Y2hfZmlybXdhcmVfc3RhcnQiKTsKKwlhdG1fZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKIAotCWRvd24oJmluc3RhbmNlLT51LnNlcmlhbGl6ZSk7CS8qIHZzIHNlbGYsIHNwZWVkdGNoX2dvdF9maXJtd2FyZSAqLworCW1lbXNldChidWYsIDAsIDIpOwogCi0JaWYgKGluc3RhbmNlLT51LnN0YXR1cyA+PSBVRFNMX0xPQURJTkdfRklSTVdBUkUpIHsKLQkJdXAoJmluc3RhbmNlLT51LnNlcmlhbGl6ZSk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYl9kZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2JfZGV2LCAwKSwKKwkJCSAgICAgIDB4MTIsIDB4YzAsIDB4MDQsIDB4MDAsCisJCQkgICAgICBidWYsIDIsIENUUkxfVElNRU9VVCk7CisKKwlpZiAocmV0IDwgMCkKKwkJYXRtX3dhcm4odXNiYXRtLCAiZmFpbGVkIHRvIHN0YXJ0IEFEU0wgc3luY2hyb25pc2F0aW9uOiAlZFxuIiwgcmV0KTsKKwllbHNlCisJCWF0bV9kYmcodXNiYXRtLCAiJXM6IG1vZGVtIHByb2RkZWQuICVkIGJ5dGVzIHJldHVybmVkOiAlMDJ4ICUwMnhcbiIsCisJCQlfX2Z1bmNfXywgcmV0LCBidWZbMF0sIGJ1ZlsxXSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzcGVlZHRjaF9jaGVja19zdGF0dXMoc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtID0gaW5zdGFuY2UtPnVzYmF0bTsKKwlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldiA9IHVzYmF0bS0+YXRtX2RldjsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBpbnN0YW5jZS0+c2NyYXRjaF9idWZmZXI7CisJaW50IGRvd25fc3BlZWQsIHVwX3NwZWVkLCByZXQ7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwlhdG1fZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworCXJldCA9IHNwZWVkdGNoX3JlYWRfc3RhdHVzKGluc3RhbmNlKTsKKwlpZiAocmV0IDwgMCkgeworCQlhdG1fd2Fybih1c2JhdG0sICJlcnJvciAlZCBmZXRjaGluZyBkZXZpY2Ugc3RhdHVzXG4iLCByZXQpOworCQlpbnN0YW5jZS0+cG9sbF9kZWxheSA9IG1pbigyICogaW5zdGFuY2UtPnBvbGxfZGVsYXksIE1BWF9QT0xMX0RFTEFZKTsKIAkJcmV0dXJuOwogCX0KIAotCWluc3RhbmNlLT51LnN0YXR1cyA9IFVEU0xfTE9BRElOR19GSVJNV0FSRTsKLQl1cCgmaW5zdGFuY2UtPnUuc2VyaWFsaXplKTsKKwlpbnN0YW5jZS0+cG9sbF9kZWxheSA9IG1heChpbnN0YW5jZS0+cG9sbF9kZWxheSAvIDIsIE1JTl9QT0xMX0RFTEFZKTsKIAotI2lmZGVmIFVTRV9GV19MT0FERVIKLQl1ZHNsX2dldF9pbnN0YW5jZSgmaW5zdGFuY2UtPnUpOwotCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlzdGF0dXMgPSBidWZbT0ZGU0VUXzddOwogCi0JcmV0ID0ga2VybmVsX3RocmVhZChzcGVlZHRjaF9sb2FkX2Zpcm13YXJlLCBpbnN0YW5jZSwKLQkJCSAgICBDTE9ORV9GUyB8IENMT05FX0ZJTEVTKTsKKwlhdG1fZGJnKHVzYmF0bSwgIiVzOiBsaW5lIHN0YXRlICUwMnhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwogCi0JaWYgKHJldCA+PSAwKQotCQlyZXR1cm47CQkvKiBPSyAqLworCWlmICgoc3RhdHVzICE9IGluc3RhbmNlLT5sYXN0X3N0YXR1cykgfHwgIXN0YXR1cykgeworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIDA6CisJCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQkJaWYgKGluc3RhbmNlLT5sYXN0X3N0YXR1cykKKwkJCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmUgaXMgZG93blxuIik7CisJCQkvKiBJdCBtYXkgbmV2ZXIgcmVzeW5jIGFnYWluIHVubGVzcyB3ZSBhc2sgaXQgdG8uLi4gKi8KKwkJCXJldCA9IHNwZWVkdGNoX3N0YXJ0X3N5bmNocm8oaW5zdGFuY2UpOworCQkJYnJlYWs7CiAKLQlkYmcoInNwZWVkdGNoX2Zpcm13YXJlX3N0YXJ0OiBrZXJuZWxfdGhyZWFkIGZhaWxlZCAoJWQpISIsIHJldCk7CisJCWNhc2UgMHgwODoKKwkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisJCQlhdG1faW5mbyh1c2JhdG0sICJBRFNMIGxpbmUgaXMgYmxvY2tlZD9cbiIpOworCQkJYnJlYWs7CiAKLQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKLQl1ZHNsX3B1dF9pbnN0YW5jZSgmaW5zdGFuY2UtPnUpOwotCS8qIEp1c3QgcHJldGVuZCBpdCBuZXZlciBoYXBwZW5lZC4uLiBob3BlIG1vZGVtX3J1biBoYXBwZW5zICovCi0jZW5kaWYJCQkJLyogVVNFX0ZXX0xPQURFUiAqLworCQljYXNlIDB4MTA6CisJCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19MT1NUOworCQkJYXRtX2luZm8odXNiYXRtLCAiQURTTCBsaW5lIGlzIHN5bmNocm9uaXNpbmdcbiIpOworCQkJYnJlYWs7CiAKLQlzcGVlZHRjaF9nb3RfZmlybXdhcmUoaW5zdGFuY2UsIDApOworCQljYXNlIDB4MjA6CisJCQlkb3duX3NwZWVkID0gYnVmW09GRlNFVF9iXSB8IChidWZbT0ZGU0VUX2IgKyAxXSA8PCA4KQorCQkJCXwgKGJ1ZltPRkZTRVRfYiArIDJdIDw8IDE2KSB8IChidWZbT0ZGU0VUX2IgKyAzXSA8PCAyNCk7CisJCQl1cF9zcGVlZCA9IGJ1ZltPRkZTRVRfYiArIDRdIHwgKGJ1ZltPRkZTRVRfYiArIDVdIDw8IDgpCisJCQkJfCAoYnVmW09GRlNFVF9iICsgNl0gPDwgMTYpIHwgKGJ1ZltPRkZTRVRfYiArIDddIDw8IDI0KTsKKworCQkJaWYgKCEoZG93bl9zcGVlZCAmIDB4MDAwMGZmZmYpICYmICEodXBfc3BlZWQgJiAweDAwMDBmZmZmKSkgeworCQkJCWRvd25fc3BlZWQgPj49IDE2OworCQkJCXVwX3NwZWVkID4+PSAxNjsKKwkJCX0KKworCQkJYXRtX2Rldi0+bGlua19yYXRlID0gZG93bl9zcGVlZCAqIDEwMDAgLyA0MjQ7CisJCQlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19GT1VORDsKKworCQkJYXRtX2luZm8odXNiYXRtLAorCQkJCSAiQURTTCBsaW5lIGlzIHVwICglZCBrYi9zIGRvd24gfCAlZCBrYi9zIHVwKVxuIiwKKwkJCQkgZG93bl9zcGVlZCwgdXBfc3BlZWQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWF0bV9kZXYtPnNpZ25hbCA9IEFUTV9QSFlfU0lHX1VOS05PV047CisJCQlhdG1faW5mbyh1c2JhdG0sICJVbmtub3duIGxpbmUgc3RhdGUgJTAyeFxuIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaW5zdGFuY2UtPmxhc3Rfc3RhdHVzID0gc3RhdHVzOworCX0KIH0KIAotc3RhdGljIGludCBzcGVlZHRjaF9maXJtd2FyZV93YWl0KHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKQorc3RhdGljIHZvaWQgc3BlZWR0Y2hfc3RhdHVzX3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXNwZWVkdGNoX2Zpcm13YXJlX3N0YXJ0KCh2b2lkICopaW5zdGFuY2UpOworCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9ICh2b2lkICopZGF0YTsKIAotCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaW5zdGFuY2UtPmZpcm13YXJlX3dhaXRlcnMsIGluc3RhbmNlLT5zdGF0dXMgIT0gVURTTF9MT0FESU5HX0ZJUk1XQVJFKSA8IDApCi0JCXJldHVybiAtRVJFU1RBUlRTWVM7CisJc2NoZWR1bGVfd29yaygmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyKTsKIAotCXJldHVybiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBVRFNMX0xPQURFRF9GSVJNV0FSRSkgPyAwIDogLUVBR0FJTjsKKwkvKiBUaGUgZm9sbG93aW5nIGNoZWNrIGlzIHJhY3ksIGJ1dCB0aGUgcmFjZSBpcyBoYXJtbGVzcyAqLworCWlmIChpbnN0YW5jZS0+cG9sbF9kZWxheSA8IE1BWF9QT0xMX0RFTEFZKQorCQltb2RfdGltZXIoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlci50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoaW5zdGFuY2UtPnBvbGxfZGVsYXkpKTsKKwllbHNlCisJCWF0bV93YXJuKGluc3RhbmNlLT51c2JhdG0sICJUb28gbWFueSBmYWlsdXJlcyAtIGRpc2FibGluZyBsaW5lIHN0YXR1cyBwb2xsaW5nXG4iKTsKIH0KIAorc3RhdGljIHZvaWQgc3BlZWR0Y2hfcmVzdWJtaXRfaW50KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSAodm9pZCAqKWRhdGE7CisJc3RydWN0IHVyYiAqaW50X3VyYiA9IGluc3RhbmNlLT5pbnRfdXJiOworCWludCByZXQ7CisKKwlhdG1fZGJnKGluc3RhbmNlLT51c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoaW50X3VyYikgeworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihpbnRfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFyZXQpCisJCQlzY2hlZHVsZV93b3JrKCZpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIpOworCQllbHNlIHsKKwkJCWF0bV9kYmcoaW5zdGFuY2UtPnVzYmF0bSwgIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJbW9kX3RpbWVyKCZpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFU1VCTUlUX0RFTEFZKSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkdGNoX2hhbmRsZV9pbnQoc3RydWN0IHVyYiAqaW50X3VyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gaW50X3VyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSA9IGluc3RhbmNlLT51c2JhdG07CisJdW5zaWduZWQgaW50IGNvdW50ID0gaW50X3VyYi0+YWN0dWFsX2xlbmd0aDsKKwlpbnQgcmV0ID0gaW50X3VyYi0+c3RhdHVzOworCisJLyogVGhlIG1hZ2ljIGludGVycnVwdCBmb3IgInVwIHN0YXRlIiAqLworCWNvbnN0IHN0YXRpYyB1bnNpZ25lZCBjaGFyIHVwX2ludFs2XSAgID0geyAweGExLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwIH07CisJLyogVGhlIG1hZ2ljIGludGVycnVwdCBmb3IgImRvd24gc3RhdGUiICovCisJY29uc3Qgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG93bl9pbnRbNl0gPSB7IDB4YTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworCWF0bV9kYmcodXNiYXRtLCAiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOworCisJaWYgKHJldCA8IDApIHsKKwkJYXRtX2RiZyh1c2JhdG0sICIlczogbm9uemVybyB1cmIgc3RhdHVzICVkIVxuIiwgX19mdW5jX18sIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoKGNvdW50ID09IDYpICYmICFtZW1jbXAodXBfaW50LCBpbnN0YW5jZS0+aW50X2RhdGEsIDYpKSB7CisJCWRlbF90aW1lcigmaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLnRpbWVyKTsKKwkJYXRtX2luZm8odXNiYXRtLCAiRFNMIGxpbmUgZ29lcyB1cFxuIik7CisJfSBlbHNlIGlmICgoY291bnQgPT0gNikgJiYgIW1lbWNtcChkb3duX2ludCwgaW5zdGFuY2UtPmludF9kYXRhLCA2KSkgeworCQlhdG1faW5mbyh1c2JhdG0sICJEU0wgbGluZSBnb2VzIGRvd25cbiIpOworCX0gZWxzZSB7CisJCWludCBpOworCisJCWF0bV9kYmcodXNiYXRtLCAiJXM6IHVua25vd24gaW50ZXJydXB0IHBhY2tldCBvZiBsZW5ndGggJWQ6IiwgX19mdW5jX18sIGNvdW50KTsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlwcmludGsoIiAlMDJ4IiwgaW5zdGFuY2UtPmludF9kYXRhW2ldKTsKKwkJcHJpbnRrKCJcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKChpbnRfdXJiID0gaW5zdGFuY2UtPmludF91cmIpKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKGludF91cmIsIEdGUF9BVE9NSUMpOworCQlzY2hlZHVsZV93b3JrKCZpbnN0YW5jZS0+c3RhdHVzX2NoZWNrZXIpOworCQlpZiAocmV0IDwgMCkgeworCQkJYXRtX2RiZyh1c2JhdG0sICIlczogdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCXJldHVybjsKKworZmFpbDoKKwlpZiAoKGludF91cmIgPSBpbnN0YW5jZS0+aW50X3VyYikpCisJCW1vZF90aW1lcigmaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhSRVNVQk1JVF9ERUxBWSkpOworfQorCitzdGF0aWMgaW50IHNwZWVkdGNoX2F0bV9zdGFydChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bSwgc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSB1c2JhdG0tPnVzYl9kZXY7CisJc3RydWN0IHNwZWVkdGNoX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gdXNiYXRtLT5kcml2ZXJfZGF0YTsKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGNoYXIgbWFjX3N0clsxM107CisKKwlhdG1fZGJnKHVzYmF0bSwgIiVzIGVudGVyZWRcbiIsIF9fZnVuY19fKTsKKworCWlmICgocmV0ID0gdXNiX3NldF9pbnRlcmZhY2UodXNiX2RldiwgMSwgYWx0c2V0dGluZykpIDwgMCkgeworCQlhdG1fZGJnKHVzYmF0bSwgIiVzOiB1c2Jfc2V0X2ludGVyZmFjZSByZXR1cm5lZCAlZCFcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFNldCBNQUMgYWRkcmVzcywgaXQgaXMgc3RvcmVkIGluIHRoZSBzZXJpYWwgbnVtYmVyICovCisJbWVtc2V0KGF0bV9kZXYtPmVzaSwgMCwgc2l6ZW9mKGF0bV9kZXYtPmVzaSkpOworCWlmICh1c2Jfc3RyaW5nKHVzYl9kZXYsIHVzYl9kZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgbWFjX3N0ciwgc2l6ZW9mKG1hY19zdHIpKSA9PSAxMikgeworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJYXRtX2Rldi0+ZXNpW2ldID0gKGhleDJpbnQobWFjX3N0cltpICogMl0pICogMTYpICsgKGhleDJpbnQobWFjX3N0cltpICogMiArIDFdKSk7CisJfQorCisJLyogU3RhcnQgbW9kZW0gc3luY2hyb25pc2F0aW9uICovCisJcmV0ID0gc3BlZWR0Y2hfc3RhcnRfc3luY2hybyhpbnN0YW5jZSk7CisKKwkvKiBTZXQgdXAgaW50ZXJydXB0IGVuZHBvaW50ICovCisJaWYgKGluc3RhbmNlLT5pbnRfdXJiKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKGluc3RhbmNlLT5pbnRfdXJiLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qIERvZXNuJ3QgbWF0dGVyOyB3ZSdsbCBwb2xsIGFueXdheSAqLworCQkJYXRtX2RiZyh1c2JhdG0sICIlczogc3VibWlzc2lvbiBvZiBpbnRlcnJ1cHQgVVJCIGZhaWxlZCAoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7CisJCQl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPmludF91cmIpOworCQkJaW5zdGFuY2UtPmludF91cmIgPSBOVUxMOworCQl9CisJfQorCisJLyogU3RhcnQgc3RhdHVzIHBvbGxpbmcgKi8KKwltb2RfdGltZXIoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlci50aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwZWVkdGNoX2F0bV9zdG9wKHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtLCBzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldikKK3sKKwlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOworCXN0cnVjdCB1cmIgKmludF91cmIgPSBpbnN0YW5jZS0+aW50X3VyYjsKKworCWF0bV9kYmcodXNiYXRtLCAiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOworCisJZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlci50aW1lcik7CisKKwkvKgorCSAqIFNpbmNlIHJlc3VibWl0X3RpbWVyIGFuZCBpbnRfdXJiIGNhbiBzY2hlZHVsZSB0aGVtc2VsdmVzIGFuZAorCSAqIGVhY2ggb3RoZXIsIHNodXR0aW5nIHRoZW0gZG93biBjb3JyZWN0bHkgdGFrZXMgc29tZSBjYXJlCisJICovCisJaW5zdGFuY2UtPmludF91cmIgPSBOVUxMOyAvKiBzaWduYWwgc2h1dGRvd24gKi8KKwltYigpOworCXVzYl9raWxsX3VyYihpbnRfdXJiKTsKKwlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyKTsKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHNwZWVkdGNoX2hhbmRsZV9pbnQgYW5kIHNwZWVkdGNoX3Jlc3VibWl0X2ludAorCSAqIGNhbiBydW4gb3IgYmUgcnVubmluZywgYnV0IGluc3RhbmNlLT5pbnRfdXJiID09IE5VTEwgbWVhbnMgdGhhdAorCSAqIHRoZXkgd2lsbCBub3QgcmVzY2hlZHVsZQorCSAqLworCXVzYl9raWxsX3VyYihpbnRfdXJiKTsKKwlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyKTsKKwl1c2JfZnJlZV91cmIoaW50X3VyYik7CisKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCisKIC8qKioqKioqKioqCiAqKiAgVVNCICAqKgogKioqKioqKioqKi8KIAotc3RhdGljIGludCBzcGVlZHRjaF91c2JfaW9jdGwoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHVuc2lnbmVkIGludCBjb2RlLAotCQkJICAgICAgdm9pZCAqdXNlcl9kYXRhKQotewotCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgc3BlZWR0Y2hfdXNiX2lkc1tdID0geworCXtVU0JfREVWSUNFKDB4MDZiOSwgMHg0MDYxKX0sCisJe30KK307CiAKLQlkYmcoInNwZWVkdGNoX3VzYl9pb2N0bCBlbnRlcmVkIik7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgc3BlZWR0Y2hfdXNiX2lkcyk7CiAKLQlpZiAoIWluc3RhbmNlKSB7Ci0JCWRiZygic3BlZWR0Y2hfdXNiX2lvY3RsOiBOVUxMIGluc3RhbmNlISIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CitzdGF0aWMgaW50IHNwZWVkdGNoX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqKTsKIAotCXN3aXRjaCAoY29kZSkgewotCWNhc2UgVURTTF9JT0NUTF9MSU5FX1VQOgotCQlpbnN0YW5jZS0+dS5hdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19GT1VORDsKLQkJc3BlZWR0Y2hfZ290X2Zpcm13YXJlKGluc3RhbmNlLCAxKTsKLQkJcmV0dXJuIChpbnN0YW5jZS0+dS5zdGF0dXMgPT0gVURTTF9MT0FERURfRklSTVdBUkUpID8gMCA6IC1FSU87Ci0JY2FzZSBVRFNMX0lPQ1RMX0xJTkVfRE9XTjoKLQkJaW5zdGFuY2UtPnUuYXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfTE9TVDsKLQkJcmV0dXJuIDA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9UVFk7Ci0JfQorc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNwZWVkdGNoX3VzYl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9IHNwZWVkdGNoX2RyaXZlcl9uYW1lLAorCS5wcm9iZQkJPSBzcGVlZHRjaF91c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QJPSB1c2JhdG1fdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlCT0gc3BlZWR0Y2hfdXNiX2lkcworfTsKKworc3RhdGljIHZvaWQgc3BlZWR0Y2hfcmVsZWFzZV9pbnRlcmZhY2VzKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LCBpbnQgbnVtX2ludGVyZmFjZXMpIHsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY3VyX2ludGY7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBudW1faW50ZXJmYWNlczsgaSsrKQorCQlpZiAoKGN1cl9pbnRmID0gdXNiX2lmbnVtX3RvX2lmKHVzYl9kZXYsIGkpKSkgeworCQkJdXNiX3NldF9pbnRmZGF0YShjdXJfaW50ZiwgTlVMTCk7CisJCQl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKCZzcGVlZHRjaF91c2JfZHJpdmVyLCBjdXJfaW50Zik7CisJCX0KIH0KIAotc3RhdGljIGludCBzcGVlZHRjaF91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IHNwZWVkdGNoX2JpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0sCisJCQkgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLAorCQkJIGludCAqbmVlZF9oZWF2eV9pbml0KQogewotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCWludCBpZm51bSA9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmN1cl9pbnRmOwogCXN0cnVjdCBzcGVlZHRjaF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZTsKLQl1bnNpZ25lZCBjaGFyIG1hY19zdHJbMTNdOwotCWludCByZXQsIGk7Ci0JY2hhciBidWY3W1NJWkVfN107CisJaW50IGlmbnVtID0gaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCWludCBudW1faW50ZXJmYWNlcyA9IHVzYl9kZXYtPmFjdGNvbmZpZy0+ZGVzYy5iTnVtSW50ZXJmYWNlczsKKwlpbnQgaSwgcmV0OwogCi0JZGJnKCJzcGVlZHRjaF91c2JfcHJvYmU6IHRyeWluZyBkZXZpY2Ugd2l0aCB2ZW5kb3I9MHgleCwgcHJvZHVjdD0weCV4LCBpZm51bSAlZCIsCi0JICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCi0JICAgIGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLCBpZm51bSk7CisJdXNiX2RiZyh1c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoKGRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgIT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKSB8fCAKLQkgICAgKGlmbnVtICE9IDEpKQorCWlmICh1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcyAhPSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMpIHsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogd3JvbmcgZGV2aWNlIGNsYXNzICVkXG4iLCBfX2Z1bmNfXywgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MpOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKLQlkYmcoInNwZWVkdGNoX3VzYl9wcm9iZTogZGV2aWNlIGFjY2VwdGVkIik7CisJLyogY2xhaW0gYWxsIGludGVyZmFjZXMgKi8KIAotCS8qIGluc3RhbmNlIGluaXQgKi8KKwlmb3IgKGk9MDsgaSA8IG51bV9pbnRlcmZhY2VzOyBpKyspIHsKKwkJY3VyX2ludGYgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgaSk7CisKKwkJaWYgKChpICE9IGlmbnVtKSAmJiBjdXJfaW50ZikgeworCQkJcmV0ID0gdXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UoJnNwZWVkdGNoX3VzYl9kcml2ZXIsIGN1cl9pbnRmLCB1c2JhdG0pOworCisJCQlpZiAocmV0IDwgMCkgeworCQkJCXVzYl9kYmcodXNiYXRtLCAiJXM6IGZhaWxlZCB0byBjbGFpbSBpbnRlcmZhY2UgJWQgKCVkKVxuIiwgX19mdW5jX18sIGksIHJldCk7CisJCQkJc3BlZWR0Y2hfcmVsZWFzZV9pbnRlcmZhY2VzKHVzYl9kZXYsIGkpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwl9CisKIAlpbnN0YW5jZSA9IGttYWxsb2Moc2l6ZW9mKCppbnN0YW5jZSksIEdGUF9LRVJORUwpOworCiAJaWYgKCFpbnN0YW5jZSkgewotCQlkYmcoInNwZWVkdGNoX3VzYl9wcm9iZTogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhISIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJdXNiX2RiZyh1c2JhdG0sICIlczogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhIVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWxfcmVsZWFzZTsKIAl9CiAKIAltZW1zZXQoaW5zdGFuY2UsIDAsIHNpemVvZihzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSkpOwogCi0JaWYgKChyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYsIDAsIDApKSA8IDApCi0JCWdvdG8gZmFpbDsKKwlpbnN0YW5jZS0+dXNiYXRtID0gdXNiYXRtOwogCi0JaWYgKChyZXQgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYsIDIsIDApKSA8IDApCi0JCWdvdG8gZmFpbDsKKwlJTklUX1dPUksoJmluc3RhbmNlLT5zdGF0dXNfY2hlY2tlciwgKHZvaWQgKilzcGVlZHRjaF9jaGVja19zdGF0dXMsIGluc3RhbmNlKTsKIAotCWluc3RhbmNlLT51LmRhdGFfZW5kcG9pbnQgPSBTUEVFRFRDSF9FTkRQT0lOVF9EQVRBOwotCWluc3RhbmNlLT51LmZpcm13YXJlX3dhaXQgPSBzcGVlZHRjaF9maXJtd2FyZV93YWl0OwotCWluc3RhbmNlLT51LmRyaXZlcl9uYW1lID0gc3BlZWR0Y2hfZHJpdmVyX25hbWU7CisJaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLnRpbWVyLmZ1bmN0aW9uID0gc3BlZWR0Y2hfc3RhdHVzX3BvbGw7CisJaW5zdGFuY2UtPnN0YXR1c19jaGVja2VyLnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbnN0YW5jZTsKKwlpbnN0YW5jZS0+bGFzdF9zdGF0dXMgPSAweGZmOworCWluc3RhbmNlLT5wb2xsX2RlbGF5ID0gTUlOX1BPTExfREVMQVk7CiAKLQlyZXQgPSB1ZHNsX2luc3RhbmNlX3NldHVwKGRldiwgJmluc3RhbmNlLT51KTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWw7CisJaW5pdF90aW1lcigmaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyKTsKKwlpbnN0YW5jZS0+cmVzdWJtaXRfdGltZXIuZnVuY3Rpb24gPSBzcGVlZHRjaF9yZXN1Ym1pdF9pbnQ7CisJaW5zdGFuY2UtPnJlc3VibWl0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbnN0YW5jZTsKIAotCWluaXRfdGltZXIoJmluc3RhbmNlLT5wb2xsX3RpbWVyKTsKLQlpbnN0YW5jZS0+cG9sbF90aW1lci5mdW5jdGlvbiA9IHNwZWVkdGNoX3RpbWVyX3BvbGw7Ci0JaW5zdGFuY2UtPnBvbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWluc3RhbmNlOworCWluc3RhbmNlLT5pbnRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAotCUlOSVRfV09SSygmaW5zdGFuY2UtPnBvbGxfd29yaywgKHZvaWQgKilzcGVlZHRjaF9wb2xsX3N0YXR1cywgaW5zdGFuY2UpOworCWlmIChpbnN0YW5jZS0+aW50X3VyYikKKwkJdXNiX2ZpbGxfaW50X3VyYihpbnN0YW5jZS0+aW50X3VyYiwgdXNiX2RldiwKKwkJCQkgdXNiX3JjdmludHBpcGUodXNiX2RldiwgRU5EUE9JTlRfSU5UKSwKKwkJCQkgaW5zdGFuY2UtPmludF9kYXRhLCBzaXplb2YoaW5zdGFuY2UtPmludF9kYXRhKSwKKwkJCQkgc3BlZWR0Y2hfaGFuZGxlX2ludCwgaW5zdGFuY2UsIDUwKTsKKwllbHNlCisJCXVzYl9kYmcodXNiYXRtLCAiJXM6IG5vIG1lbW9yeSBmb3IgaW50ZXJydXB0IHVyYiFcbiIsIF9fZnVuY19fKTsKIAotCS8qIHNldCBNQUMgYWRkcmVzcywgaXQgaXMgc3RvcmVkIGluIHRoZSBzZXJpYWwgbnVtYmVyICovCi0JbWVtc2V0KGluc3RhbmNlLT51LmF0bV9kZXYtPmVzaSwgMCwgc2l6ZW9mKGluc3RhbmNlLT51LmF0bV9kZXYtPmVzaSkpOwotCWlmICh1c2Jfc3RyaW5nKGRldiwgZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIG1hY19zdHIsIHNpemVvZihtYWNfc3RyKSkgPT0gMTIpIHsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCWluc3RhbmNlLT51LmF0bV9kZXYtPmVzaVtpXSA9Ci0JCQkJKGhleDJpbnQobWFjX3N0cltpICogMl0pICogMTYpICsgKGhleDJpbnQobWFjX3N0cltpICogMiArIDFdKSk7Ci0JfQorCS8qIGNoZWNrIHdoZXRoZXIgdGhlIG1vZGVtIGFscmVhZHkgc2VlbXMgdG8gYmUgYWxpdmUgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJICAgICAgMHgxMiwgMHhjMCwgMHgwNywgMHgwMCwKKwkJCSAgICAgIGluc3RhbmNlLT5zY3JhdGNoX2J1ZmZlciArIE9GRlNFVF83LCBTSVpFXzcsIDUwMCk7CiAKLQkvKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZSBtb2RlbSBhbHJlYWR5IHNlZW1zIHRvIGJlIGFsaXZlICovCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCi0JCQkgICAgICAweDEyLCAweGMwLCAweDA3LCAweDAwLCBidWY3LCBTSVpFXzcsIDUwMCk7CisJKm5lZWRfaGVhdnlfaW5pdCA9IChyZXQgIT0gU0laRV83KTsKIAotCWlmIChyZXQgPT0gU0laRV83KSB7Ci0JCWRiZygiZmlybXdhcmUgYXBwZWFycyB0byBiZSBhbHJlYWR5IGxvYWRlZCIpOwotCQlzcGVlZHRjaF9nb3RfZmlybXdhcmUoaW5zdGFuY2UsIDEpOwotCQlzcGVlZHRjaF9wb2xsX3N0YXR1cyhpbnN0YW5jZSk7Ci0JfSBlbHNlIHsKLQkJc3BlZWR0Y2hfZmlybXdhcmVfc3RhcnQoaW5zdGFuY2UpOwotCX0KKwl1c2JfZGJnKHVzYmF0bSwgIiVzOiBmaXJtd2FyZSAlcyBsb2FkZWRcbiIsIF9fZnVuY19fLCBuZWVkX2hlYXZ5X2luaXQgPyAibm90IiA6ICJhbHJlYWR5Iik7CiAKLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGluc3RhbmNlKTsKKwlpZiAoKm5lZWRfaGVhdnlfaW5pdCkKKwkJaWYgKChyZXQgPSB1c2JfcmVzZXRfZGV2aWNlKHVzYl9kZXYpKSA8IDApCisJCQlnb3RvIGZhaWxfZnJlZTsKKworICAgICAgICB1c2JhdG0tPmRyaXZlcl9kYXRhID0gaW5zdGFuY2U7CiAKIAlyZXR1cm4gMDsKIAotIGZhaWw6CitmYWlsX2ZyZWU6CisJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5pbnRfdXJiKTsKIAlrZnJlZShpbnN0YW5jZSk7Ci0KLQlyZXR1cm4gLUVOT01FTTsKK2ZhaWxfcmVsZWFzZToKKwlzcGVlZHRjaF9yZWxlYXNlX2ludGVyZmFjZXModXNiX2RldiwgbnVtX2ludGVyZmFjZXMpOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNwZWVkdGNoX3VzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIHZvaWQgc3BlZWR0Y2hfdW5iaW5kKHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qgc3BlZWR0Y2hfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB1c2JhdG0tPmRyaXZlcl9kYXRhOwogCi0JZGJnKCJzcGVlZHRjaF91c2JfZGlzY29ubmVjdCBlbnRlcmVkIik7CisJdXNiX2RiZyh1c2JhdG0sICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CiAKLQlpZiAoIWluc3RhbmNlKSB7Ci0JCWRiZygic3BlZWR0Y2hfdXNiX2Rpc2Nvbm5lY3Q6IE5VTEwgaW5zdGFuY2UhIik7Ci0JCXJldHVybjsKLQl9Ci0KLS8qUVEgbmVlZCB0byBoYW5kbGUgZGlzY29ubmVjdHMgb24gaW50ZXJmYWNlICMyIHdoaWxlIHVwbG9hZGluZyBmaXJtd2FyZSAqLwotLypRUSBhbmQgd2hhdCBhYm91dCBpbnRlcmZhY2UgIzE/ICovCi0KLQlpZiAoaW5zdGFuY2UtPmludF91cmIpIHsKLQkJc3RydWN0IHVyYiAqaW50X3VyYiA9IGluc3RhbmNlLT5pbnRfdXJiOwotCQlpbnN0YW5jZS0+aW50X3VyYiA9IE5VTEw7Ci0JCXdtYigpOwotCQl1c2JfdW5saW5rX3VyYihpbnRfdXJiKTsKLQkJdXNiX2ZyZWVfdXJiKGludF91cmIpOwotCX0KLQotCWluc3RhbmNlLT5pbnRfZGF0YVswXSA9IDE7Ci0JZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5wb2xsX3RpbWVyKTsKLQl3bWIoKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JdWRzbF9pbnN0YW5jZV9kaXNjb25uZWN0KCZpbnN0YW5jZS0+dSk7Ci0KLQkvKiBjbGVhbiB1cCAqLwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7Ci0JdWRzbF9wdXRfaW5zdGFuY2UoJmluc3RhbmNlLT51KTsKKwlzcGVlZHRjaF9yZWxlYXNlX2ludGVyZmFjZXModXNiX2RldiwgdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzKTsKKwl1c2JfZnJlZV91cmIoaW5zdGFuY2UtPmludF91cmIpOworCWtmcmVlKGluc3RhbmNlKTsKIH0KIAorCiAvKioqKioqKioqKioKICoqICBpbml0ICAqKgogKioqKioqKioqKiovCiAKK3N0YXRpYyBzdHJ1Y3QgdXNiYXRtX2RyaXZlciBzcGVlZHRjaF91c2JhdG1fZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZHJpdmVyX25hbWUJPSBzcGVlZHRjaF9kcml2ZXJfbmFtZSwKKwkuYmluZAkJPSBzcGVlZHRjaF9iaW5kLAorCS5oZWF2eV9pbml0CT0gc3BlZWR0Y2hfaGVhdnlfaW5pdCwKKwkudW5iaW5kCQk9IHNwZWVkdGNoX3VuYmluZCwKKwkuYXRtX3N0YXJ0CT0gc3BlZWR0Y2hfYXRtX3N0YXJ0LAorCS5hdG1fc3RvcAk9IHNwZWVkdGNoX2F0bV9zdG9wLAorCS5pbgkJPSBFTkRQT0lOVF9EQVRBLAorCS5vdXQJCT0gRU5EUE9JTlRfREFUQQorfTsKKworc3RhdGljIGludCBzcGVlZHRjaF91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gdXNiYXRtX3VzYl9wcm9iZShpbnRmLCBpZCwgJnNwZWVkdGNoX3VzYmF0bV9kcml2ZXIpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBzcGVlZHRjaF91c2JfaW5pdCh2b2lkKQogewotCWRiZygic3BlZWR0Y2hfdXNiX2luaXQ6IGRyaXZlciB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04pOworCWRiZygiJXM6IGRyaXZlciB2ZXJzaW9uICVzIiwgX19mdW5jX18sIERSSVZFUl9WRVJTSU9OKTsKIAogCXJldHVybiB1c2JfcmVnaXN0ZXIoJnNwZWVkdGNoX3VzYl9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3BlZWR0Y2hfdXNiX2NsZWFudXAodm9pZCkKIHsKLQlkYmcoInNwZWVkdGNoX3VzYl9jbGVhbnVwIGVudGVyZWQiKTsKKwlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJdXNiX2RlcmVnaXN0ZXIoJnNwZWVkdGNoX3VzYl9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VzYl9hdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91c2JfYXRtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Y2Q0NDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy91c2IvYXRtL3VzYl9hdG0uYworKysgL2Rldi9udWxsCkBAIC0xLDExODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIHVzYl9hdG0uYyAtIEdlbmVyaWMgVVNCIHhEU0wgZHJpdmVyIGNvcmUKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxLCBBbGNhdGVsCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzLCBEdW5jYW4gU2FuZHMsIFNvbE5lZ3JvLCBKb3NlcCBDb21hcwotICogIENvcHlyaWdodCAoQykgMjAwNCwgRGF2aWQgV29vZGhvdXNlCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiAgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKLSAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogIFdyaXR0ZW4gYnkgSm9oYW4gVmVycmVwdCwgbWFpbnRhaW5lZCBieSBEdW5jYW4gU2FuZHMgKGR1bmNhbi5zYW5kc0BmcmVlLmZyKQotICoKLSAqICAxLjcrOgktIFNlZSB0aGUgY2hlY2staW4gbG9ncwotICoKLSAqICAxLjY6CS0gTm8gbG9uZ2VyIG9wZW5zIGEgY29ubmVjdGlvbiBpZiB0aGUgZmlybXdhcmUgaXMgbm90IGxvYWRlZAotICogIAkJLSBBZGRlZCBzdXBwb3J0IGZvciB0aGUgc3BlZWR0b3VjaCAzMzAKLSAqICAJCS0gUmVtb3ZlZCB0aGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBkZXZpY2VzCi0gKiAgCQktIE1vZHVsZSBub3cgYXV0b2xvYWRzIG9uIGRldmljZSBwbHVnaW4KLSAqICAJCS0gTWVyZ2VkIHJlbGV2YW50IHBhcnRzIG9mIHNhcmxpYgotICogIAkJLSBSZXBsYWNlZCB0aGUga2VybmVsIHRocmVhZCB3aXRoIGEgdGFza2xldAotICogIAkJLSBOZXcgcGFja2V0IHRyYW5zbWlzc2lvbiBjb2RlCi0gKiAgCQktIENoYW5nZWQgcHJvYyBmaWxlIGNvbnRlbnRzCi0gKiAgCQktIEZpeGVkIGFsbCBrbm93biBTTVAgcmFjZXMKLSAqICAJCS0gTWFueSBmaXhlcyBhbmQgY2xlYW51cHMKLSAqICAJCS0gVmFyaW91cyBmaXhlcyBieSBPbGl2ZXIgTmV1a3VtIChvbGl2ZXJAbmV1a3VtLm5hbWUpCi0gKgotICogIDEuNUE6CS0gVmVyc2lvbiBmb3IgaW5jbHVzaW9uIGluIDIuNSBzZXJpZXMga2VybmVsCi0gKgkJLSBNb2RpZmljYXRpb25zIGJ5IFJpY2hhcmQgUHVyZGllIChycHVyZGllQHJwc3lzLm5ldCkKLSAqCQktIG1hZGUgY29tcGF0aWJsZSB3aXRoIGtlcm5lbCAyLjUuNiBvbndhcmRzIGJ5IGNoYW5naW5nCi0gKgkJdWRzbF91c2Jfc2VuZF9kYXRhX2NvbnRleHQtPnVyYiB0byBhIHBvaW50ZXIgYW5kIGFkZGluZyBjb2RlCi0gKgkJdG8gYWxsb2MgYW5kIGZyZWUgaXQKLSAqCQktIHJlbW92ZV93YWl0X3F1ZXVlKCkgYWRkZWQgdG8gdWRzbF9hdG1fcHJvY2Vzc3F1ZXVlX3RocmVhZCgpCi0gKgotICogIDEuNToJLSBmaXhlZCBtZW1vcnkgbGVhayB3aGVuIGF0bXNhcl9kZWNvZGVfYWFsNSByZXR1cm5lZCBOVUxMLgotICoJCShyZXBvcnRlZCBieSBzdGVwaGVuLnJvYmluc29uQHplbi5jby51aykKLSAqCi0gKiAgMS40OgktIGNoYW5nZWQgdGhlIHNwaW5fbG9jaygpIHVuZGVyIGludGVycnVwdCB0byBzcGluX2xvY2tfaXJxc2F2ZSgpCi0gKgkJLSB1bmxpbmsgYWxsIGFjdGl2ZSBzZW5kIHVyYnMgb2YgYSB2Y2MgdGhhdCBpcyBiZWluZyBjbG9zZWQuCi0gKgotICogIDEuMy4xOgktIGFkZGVkIHRoZSB2ZXJzaW9uIG51bWJlcgotICoKLSAqICAxLjM6CS0gQWRkZWQgbXVsdGlwbGUgc2VuZCB1cmIgc3VwcG9ydAotICoJCS0gZml4ZWQgbWVtb3J5IGxlYWsgYW5kIHZjYy0+dHhfaW51c2Ugc3RhcnZhdGlvbiBidWcKLSAqCQkgIHdoZW4gbm90IGVub3VnaCBtZW1vcnkgbGVmdCBpbiB2Y2MuCi0gKgotICogIDEuMjoJLSBGaXhlZCByYWNlIGNvbmRpdGlvbiBpbiB1ZHNsX3VzYl9zZW5kX2RhdGEoKQotICogIDEuMToJLSBUdXJuZWQgb2ZmIHBhY2tldCBkZWJ1Z2dpbmcKLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG0uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG1kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotCi0jaW5jbHVkZSAidXNiX2F0bS5oIgotCi0jaWZkZWYgVkVSQk9TRV9ERUJVRwotc3RhdGljIGludCB1ZHNsX3ByaW50X3BhY2tldChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKLSNkZWZpbmUgUEFDS0VUREVCVUcoYXJnLi4uKQl1ZHNsX3ByaW50X3BhY2tldCAoYXJnKQotI2RlZmluZSB2ZGJnKGFyZy4uLikJCWRiZyAoYXJnKQotI2Vsc2UKLSNkZWZpbmUgUEFDS0VUREVCVUcoYXJnLi4uKQotI2RlZmluZSB2ZGJnKGFyZy4uLikKLSNlbmRpZgotCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IJIkpvaGFuIFZlcnJlcHQsIER1bmNhbiBTYW5kcyA8ZHVuY2FuLnNhbmRzQGZyZWUuZnI+IgotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMS44IgotI2RlZmluZSBEUklWRVJfREVTQwkiR2VuZXJpYyBVU0IgQVRNL0RTTCBJL08sIHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTgotCi1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9yY3ZfdXJicyA9IFVEU0xfREVGQVVMVF9SQ1ZfVVJCUzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3NuZF91cmJzID0gVURTTF9ERUZBVUxUX1NORF9VUkJTOwotc3RhdGljIHVuc2lnbmVkIGludCBudW1fcmN2X2J1ZnMgPSBVRFNMX0RFRkFVTFRfUkNWX0JVRlM7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9zbmRfYnVmcyA9IFVEU0xfREVGQVVMVF9TTkRfQlVGUzsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmN2X2J1Zl9zaXplID0gVURTTF9ERUZBVUxUX1JDVl9CVUZfU0laRTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2J1Zl9zaXplID0gVURTTF9ERUZBVUxUX1NORF9CVUZfU0laRTsKLQotbW9kdWxlX3BhcmFtKG51bV9yY3ZfdXJicywgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG51bV9yY3ZfdXJicywKLQkJICJOdW1iZXIgb2YgdXJicyB1c2VkIGZvciByZWNlcHRpb24gKHJhbmdlOiAwLSIKLQkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9SQ1ZfVVJCUykgIiwgZGVmYXVsdDogIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9SQ1ZfVVJCUykgIikiKTsKLQotbW9kdWxlX3BhcmFtKG51bV9zbmRfdXJicywgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG51bV9zbmRfdXJicywKLQkJICJOdW1iZXIgb2YgdXJicyB1c2VkIGZvciB0cmFuc21pc3Npb24gKHJhbmdlOiAwLSIKLQkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9TTkRfVVJCUykgIiwgZGVmYXVsdDogIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9TTkRfVVJCUykgIikiKTsKLQotbW9kdWxlX3BhcmFtKG51bV9yY3ZfYnVmcywgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG51bV9yY3ZfYnVmcywKLQkJICJOdW1iZXIgb2YgYnVmZmVycyB1c2VkIGZvciByZWNlcHRpb24gKHJhbmdlOiAwLSIKLQkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9SQ1ZfQlVGUykgIiwgZGVmYXVsdDogIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9SQ1ZfQlVGUykgIikiKTsKLQotbW9kdWxlX3BhcmFtKG51bV9zbmRfYnVmcywgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG51bV9zbmRfYnVmcywKLQkJICJOdW1iZXIgb2YgYnVmZmVycyB1c2VkIGZvciB0cmFuc21pc3Npb24gKHJhbmdlOiAwLSIKLQkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9TTkRfQlVGUykgIiwgZGVmYXVsdDogIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9TTkRfQlVGUykgIikiKTsKLQotbW9kdWxlX3BhcmFtKHJjdl9idWZfc2l6ZSwgdWludCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJjdl9idWZfc2l6ZSwKLQkJICJTaXplIG9mIHRoZSBidWZmZXJzIHVzZWQgZm9yIHJlY2VwdGlvbiAocmFuZ2U6IDAtIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1JDVl9CVUZfU0laRSkgIiwgZGVmYXVsdDogIgotCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9SQ1ZfQlVGX1NJWkUpICIpIik7Ci0KLW1vZHVsZV9wYXJhbShzbmRfYnVmX3NpemUsIHVpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhzbmRfYnVmX3NpemUsCi0JCSAiU2l6ZSBvZiB0aGUgYnVmZmVycyB1c2VkIGZvciB0cmFuc21pc3Npb24gKHJhbmdlOiAwLSIKLQkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9TTkRfQlVGX1NJWkUpICIsIGRlZmF1bHQ6ICIKLQkJIF9fTU9EVUxFX1NUUklORyhVRFNMX0RFRkFVTFRfU05EX0JVRl9TSVpFKSAiKSIpOwotCi0vKiBBVE0gKi8KLQotc3RhdGljIHZvaWQgdWRzbF9hdG1fZGV2X2Nsb3NlKHN0cnVjdCBhdG1fZGV2ICpkZXYpOwotc3RhdGljIGludCB1ZHNsX2F0bV9vcGVuKHN0cnVjdCBhdG1fdmNjICp2Y2MpOwotc3RhdGljIHZvaWQgdWRzbF9hdG1fY2xvc2Uoc3RydWN0IGF0bV92Y2MgKnZjYyk7Ci1zdGF0aWMgaW50IHVkc2xfYXRtX2lvY3RsKHN0cnVjdCBhdG1fZGV2ICpkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKLXN0YXRpYyBpbnQgdWRzbF9hdG1fc2VuZChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXN0YXRpYyBpbnQgdWRzbF9hdG1fcHJvY19yZWFkKHN0cnVjdCBhdG1fZGV2ICphdG1fZGV2LCBsb2ZmX3QgKiBwb3MsIGNoYXIgKnBhZ2UpOwotCi1zdGF0aWMgc3RydWN0IGF0bWRldl9vcHMgdWRzbF9hdG1fZGV2b3BzID0gewotCS5kZXZfY2xvc2UJPSB1ZHNsX2F0bV9kZXZfY2xvc2UsCi0JLm9wZW4JCT0gdWRzbF9hdG1fb3BlbiwKLQkuY2xvc2UJCT0gdWRzbF9hdG1fY2xvc2UsCi0JLmlvY3RsCQk9IHVkc2xfYXRtX2lvY3RsLAotCS5zZW5kCQk9IHVkc2xfYXRtX3NlbmQsCi0JLnByb2NfcmVhZAk9IHVkc2xfYXRtX3Byb2NfcmVhZCwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi19OwotCi0vKioqKioqKioqKioKLSoqICBtaXNjICAqKgotKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1ZHNsX3BvcChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICh2Y2MtPnBvcCkKLQkJdmNjLT5wb3AodmNjLCBza2IpOwotCWVsc2UKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotfQotCi0vKioqKioqKioqKioqKgotKiogIGRlY29kZSAgKioKLSoqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHVkc2xfdmNjX2RhdGEgKnVkc2xfZmluZF92Y2Moc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCi0JCQkJCQkgIHNob3J0IHZwaSwgaW50IHZjaSkKLXsKLQlzdHJ1Y3QgdWRzbF92Y2NfZGF0YSAqdmNjOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh2Y2MsICZpbnN0YW5jZS0+dmNjX2xpc3QsIGxpc3QpCi0JCWlmICgodmNjLT52Y2kgPT0gdmNpKSAmJiAodmNjLT52cGkgPT0gdnBpKSkKLQkJCXJldHVybiB2Y2M7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHVkc2xfZXh0cmFjdF9jZWxscyhzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBob3dtYW55KQotewotCXN0cnVjdCB1ZHNsX3ZjY19kYXRhICpjYWNoZWRfdmNjID0gTlVMTDsKLQlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOwotCXN0cnVjdCBza19idWZmICpzYXJiOwotCXN0cnVjdCB1ZHNsX3ZjY19kYXRhICp2Y2NfZGF0YTsKLQlpbnQgY2FjaGVkX3ZjaSA9IDA7Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHB0aTsKLQlpbnQgdmNpOwotCXNob3J0IGNhY2hlZF92cGkgPSAwOwotCXNob3J0IHZwaTsKLQotCWZvciAoaSA9IDA7IGkgPCBob3dtYW55OwotCSAgICAgaSsrLCBzb3VyY2UgKz0gQVRNX0NFTExfU0laRSArIGluc3RhbmNlLT5yY3ZfcGFkZGluZykgewotCQl2cGkgPSAoKHNvdXJjZVswXSAmIDB4MGYpIDw8IDQpIHwgKHNvdXJjZVsxXSA+PiA0KTsKLQkJdmNpID0gKChzb3VyY2VbMV0gJiAweDBmKSA8PCAxMikgfCAoc291cmNlWzJdIDw8IDQpIHwgKHNvdXJjZVszXSA+PiA0KTsKLQkJcHRpID0gKHNvdXJjZVszXSAmIDB4MikgIT0gMDsKLQotCQl2ZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IHZwaSAlaGQsIHZjaSAlZCwgcHRpICVkIiwgdnBpLCB2Y2ksIHB0aSk7Ci0KLQkJaWYgKGNhY2hlZF92Y2MgJiYgKHZjaSA9PSBjYWNoZWRfdmNpKSAmJiAodnBpID09IGNhY2hlZF92cGkpKQotCQkJdmNjX2RhdGEgPSBjYWNoZWRfdmNjOwotCQllbHNlIGlmICgodmNjX2RhdGEgPSB1ZHNsX2ZpbmRfdmNjKGluc3RhbmNlLCB2cGksIHZjaSkpKSB7Ci0JCQljYWNoZWRfdmNjID0gdmNjX2RhdGE7Ci0JCQljYWNoZWRfdnBpID0gdnBpOwotCQkJY2FjaGVkX3ZjaSA9IHZjaTsKLQkJfSBlbHNlIHsKLQkJCWRiZygidWRzbF9leHRyYWN0X2NlbGxzOiB1bmtub3duIHZwaS92Y2kgKCVoZC8lZCkhIiwgdnBpLCB2Y2kpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQl2Y2MgPSB2Y2NfZGF0YS0+dmNjOwotCQlzYXJiID0gdmNjX2RhdGEtPnNhcmI7Ci0KLQkJaWYgKHNhcmItPnRhaWwgKyBBVE1fQ0VMTF9QQVlMT0FEID4gc2FyYi0+ZW5kKSB7Ci0JCQlkYmcoInVkc2xfZXh0cmFjdF9jZWxsczogYnVmZmVyIG92ZXJydW4gKHNhcmItPmxlbiAldSwgdmNjOiAweCVwKSEiLCBzYXJiLT5sZW4sIHZjYyk7Ci0JCQkvKiBkaXNjYXJkIGNlbGxzIGFscmVhZHkgcmVjZWl2ZWQgKi8KLQkJCXNrYl90cmltKHNhcmIsIDApOwotCQl9Ci0KLQkJbWVtY3B5KHNhcmItPnRhaWwsIHNvdXJjZSArIEFUTV9DRUxMX0hFQURFUiwgQVRNX0NFTExfUEFZTE9BRCk7Ci0JCV9fc2tiX3B1dChzYXJiLCBBVE1fQ0VMTF9QQVlMT0FEKTsKLQotCQlpZiAocHRpKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCQkJdW5zaWduZWQgaW50IGxlbmd0aDsKLQkJCXVuc2lnbmVkIGludCBwZHVfbGVuZ3RoOwotCi0JCQlsZW5ndGggPSAoc291cmNlW0FUTV9DRUxMX1NJWkUgLSA2XSA8PCA4KSArIHNvdXJjZVtBVE1fQ0VMTF9TSVpFIC0gNV07Ci0KLQkJCS8qIGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3cgKi8KLQkJCWlmIChsZW5ndGggPiBBVE1fTUFYX0FBTDVfUERVKSB7Ci0JCQkJZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IGJvZ3VzIGxlbmd0aCAldSAodmNjOiAweCVwKSEiLCBsZW5ndGgsIHZjYyk7Ci0JCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJcGR1X2xlbmd0aCA9IFVEU0xfTlVNX0NFTExTKGxlbmd0aCkgKiBBVE1fQ0VMTF9QQVlMT0FEOwotCi0JCQlpZiAoc2FyYi0+bGVuIDwgcGR1X2xlbmd0aCkgewotCQkJCWRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBib2d1cyBwZHVfbGVuZ3RoICV1IChzYXJiLT5sZW46ICV1LCB2Y2M6IDB4JXApISIsIHBkdV9sZW5ndGgsIHNhcmItPmxlbiwgdmNjKTsKLQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlpZiAoY3JjMzJfYmUofjAsIHNhcmItPnRhaWwgLSBwZHVfbGVuZ3RoLCBwZHVfbGVuZ3RoKSAhPSAweGM3MDRkZDdiKSB7Ci0JCQkJZGJnKCJ1ZHNsX2V4dHJhY3RfY2VsbHM6IHBhY2tldCBmYWlsZWQgY3JjIGNoZWNrICh2Y2M6IDB4JXApISIsIHZjYyk7Ci0JCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJdmRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBnb3QgcGFja2V0IChsZW5ndGg6ICV1LCBwZHVfbGVuZ3RoOiAldSwgdmNjOiAweCVwKSIsIGxlbmd0aCwgcGR1X2xlbmd0aCwgdmNjKTsKLQotCQkJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgpKSkgewotCQkJCWRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBubyBtZW1vcnkgZm9yIHNrYiAobGVuZ3RoOiAldSkhIiwgbGVuZ3RoKTsKLQkJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9kcm9wKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJdmRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBhbGxvY2F0ZWQgbmV3IHNrX2J1ZmYgKHNrYjogMHglcCwgc2tiLT50cnVlc2l6ZTogJXUpIiwgc2tiLCBza2ItPnRydWVzaXplKTsKLQotCQkJaWYgKCFhdG1fY2hhcmdlKHZjYywgc2tiLT50cnVlc2l6ZSkpIHsKLQkJCQlkYmcoInVkc2xfZXh0cmFjdF9jZWxsczogZmFpbGVkIGF0bV9jaGFyZ2UgKHNrYi0+dHJ1ZXNpemU6ICV1KSEiLCBza2ItPnRydWVzaXplKTsKLQkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCQkJZ290byBvdXQ7CS8qIGF0bV9jaGFyZ2UgaW5jcmVtZW50cyByeF9kcm9wICovCi0JCQl9Ci0KLQkJCW1lbWNweShza2ItPmRhdGEsIHNhcmItPnRhaWwgLSBwZHVfbGVuZ3RoLCBsZW5ndGgpOwotCQkJX19za2JfcHV0KHNrYiwgbGVuZ3RoKTsKLQotCQkJdmRiZygidWRzbF9leHRyYWN0X2NlbGxzOiBzZW5kaW5nIHNrYiAweCVwLCBza2ItPmxlbiAldSwgc2tiLT50cnVlc2l6ZSAldSIsIHNrYiwgc2tiLT5sZW4sIHNrYi0+dHJ1ZXNpemUpOwotCi0JCQlQQUNLRVRERUJVRyhza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQotCQkJdmNjLT5wdXNoKHZjYywgc2tiKTsKLQotCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cngpOwotCQlvdXQ6Ci0JCQlza2JfdHJpbShzYXJiLCAwKTsKLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioKLSoqICBlbmNvZGUgICoqCi0qKioqKioqKioqKioqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdWRzbF9maWxsX2NlbGxfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKnRhcmdldCwgc3RydWN0IGF0bV92Y2MgKnZjYykKLXsKLQl0YXJnZXRbMF0gPSB2Y2MtPnZwaSA+PiA0OwotCXRhcmdldFsxXSA9ICh2Y2MtPnZwaSA8PCA0KSB8ICh2Y2MtPnZjaSA+PiAxMik7Ci0JdGFyZ2V0WzJdID0gdmNjLT52Y2kgPj4gNDsKLQl0YXJnZXRbM10gPSB2Y2MtPnZjaSA8PCA0OwotCXRhcmdldFs0XSA9IDB4ZWM7Ci19Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHplcm9zW0FUTV9DRUxMX1BBWUxPQURdOwotCi1zdGF0aWMgdm9pZCB1ZHNsX2dyb29tX3NrYihzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCB1ZHNsX2NvbnRyb2wgKmN0cmwgPSBVRFNMX1NLQihza2IpOwotCXVuc2lnbmVkIGludCB6ZXJvX3BhZGRpbmc7Ci0JdTMyIGNyYzsKLQotCWN0cmwtPmF0bV9kYXRhLnZjYyA9IHZjYzsKLQotCWN0cmwtPm51bV9jZWxscyA9IFVEU0xfTlVNX0NFTExTKHNrYi0+bGVuKTsKLQljdHJsLT5udW1fZW50aXJlID0gc2tiLT5sZW4gLyBBVE1fQ0VMTF9QQVlMT0FEOwotCi0JemVyb19wYWRkaW5nID0gY3RybC0+bnVtX2NlbGxzICogQVRNX0NFTExfUEFZTE9BRCAtIHNrYi0+bGVuIC0gQVRNX0FBTDVfVFJBSUxFUjsKLQotCWlmIChjdHJsLT5udW1fZW50aXJlICsgMSA8IGN0cmwtPm51bV9jZWxscykKLQkJY3RybC0+cGR1X3BhZGRpbmcgPSB6ZXJvX3BhZGRpbmcgLSAoQVRNX0NFTExfUEFZTE9BRCAtIEFUTV9BQUw1X1RSQUlMRVIpOwotCWVsc2UKLQkJY3RybC0+cGR1X3BhZGRpbmcgPSB6ZXJvX3BhZGRpbmc7Ci0KLQljdHJsLT5hYWw1X3RyYWlsZXJbMF0gPSAwOwkvKiBVVSA9IDAgKi8KLQljdHJsLT5hYWw1X3RyYWlsZXJbMV0gPSAwOwkvKiBDUEkgPSAwICovCi0JY3RybC0+YWFsNV90cmFpbGVyWzJdID0gc2tiLT5sZW4gPj4gODsKLQljdHJsLT5hYWw1X3RyYWlsZXJbM10gPSBza2ItPmxlbjsKLQotCWNyYyA9IGNyYzMyX2JlKH4wLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQljcmMgPSBjcmMzMl9iZShjcmMsIHplcm9zLCB6ZXJvX3BhZGRpbmcpOwotCWNyYyA9IGNyYzMyX2JlKGNyYywgY3RybC0+YWFsNV90cmFpbGVyLCA0KTsKLQljcmMgPSB+Y3JjOwotCi0JY3RybC0+YWFsNV90cmFpbGVyWzRdID0gY3JjID4+IDI0OwotCWN0cmwtPmFhbDVfdHJhaWxlcls1XSA9IGNyYyA+PiAxNjsKLQljdHJsLT5hYWw1X3RyYWlsZXJbNl0gPSBjcmMgPj4gODsKLQljdHJsLT5hYWw1X3RyYWlsZXJbN10gPSBjcmM7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdWRzbF93cml0ZV9jZWxscyhzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBob3dtYW55LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgdW5zaWduZWQgY2hhciAqKnRhcmdldF9wKQotewotCXN0cnVjdCB1ZHNsX2NvbnRyb2wgKmN0cmwgPSBVRFNMX1NLQihza2IpOwotCXVuc2lnbmVkIGNoYXIgKnRhcmdldCA9ICp0YXJnZXRfcDsKLQl1bnNpZ25lZCBpbnQgbmMsIG5lLCBpOwotCi0JdmRiZygidWRzbF93cml0ZV9jZWxsczogaG93bWFueT0ldSwgc2tiLT5sZW49JWQsIG51bV9jZWxscz0ldSwgbnVtX2VudGlyZT0ldSwgcGR1X3BhZGRpbmc9JXUiLCBob3dtYW55LCBza2ItPmxlbiwgY3RybC0+bnVtX2NlbGxzLCBjdHJsLT5udW1fZW50aXJlLCBjdHJsLT5wZHVfcGFkZGluZyk7Ci0KLQluYyA9IGN0cmwtPm51bV9jZWxsczsKLQluZSA9IG1pbihob3dtYW55LCBjdHJsLT5udW1fZW50aXJlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuZTsgaSsrKSB7Ci0JCXVkc2xfZmlsbF9jZWxsX2hlYWRlcih0YXJnZXQsIGN0cmwtPmF0bV9kYXRhLnZjYyk7Ci0JCXRhcmdldCArPSBBVE1fQ0VMTF9IRUFERVI7Ci0JCW1lbWNweSh0YXJnZXQsIHNrYi0+ZGF0YSwgQVRNX0NFTExfUEFZTE9BRCk7Ci0JCXRhcmdldCArPSBBVE1fQ0VMTF9QQVlMT0FEOwotCQlpZiAoaW5zdGFuY2UtPnNuZF9wYWRkaW5nKSB7Ci0JCQltZW1zZXQodGFyZ2V0LCAwLCBpbnN0YW5jZS0+c25kX3BhZGRpbmcpOwotCQkJdGFyZ2V0ICs9IGluc3RhbmNlLT5zbmRfcGFkZGluZzsKLQkJfQotCQlfX3NrYl9wdWxsKHNrYiwgQVRNX0NFTExfUEFZTE9BRCk7Ci0JfQotCi0JY3RybC0+bnVtX2VudGlyZSAtPSBuZTsKLQotCWlmICghKGN0cmwtPm51bV9jZWxscyAtPSBuZSkgfHwgIShob3dtYW55IC09IG5lKSkKLQkJZ290byBvdXQ7Ci0KLQl1ZHNsX2ZpbGxfY2VsbF9oZWFkZXIodGFyZ2V0LCBjdHJsLT5hdG1fZGF0YS52Y2MpOwotCXRhcmdldCArPSBBVE1fQ0VMTF9IRUFERVI7Ci0JbWVtY3B5KHRhcmdldCwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JdGFyZ2V0ICs9IHNrYi0+bGVuOwotCV9fc2tiX3B1bGwoc2tiLCBza2ItPmxlbik7Ci0JbWVtc2V0KHRhcmdldCwgMCwgY3RybC0+cGR1X3BhZGRpbmcpOwotCXRhcmdldCArPSBjdHJsLT5wZHVfcGFkZGluZzsKLQotCWlmICgtLWN0cmwtPm51bV9jZWxscykgewotCQlpZiAoIS0taG93bWFueSkgewotCQkJY3RybC0+cGR1X3BhZGRpbmcgPSBBVE1fQ0VMTF9QQVlMT0FEIC0gQVRNX0FBTDVfVFJBSUxFUjsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKGluc3RhbmNlLT5zbmRfcGFkZGluZykgewotCQkJbWVtc2V0KHRhcmdldCwgMCwgaW5zdGFuY2UtPnNuZF9wYWRkaW5nKTsKLQkJCXRhcmdldCArPSBpbnN0YW5jZS0+c25kX3BhZGRpbmc7Ci0JCX0KLQkJdWRzbF9maWxsX2NlbGxfaGVhZGVyKHRhcmdldCwgY3RybC0+YXRtX2RhdGEudmNjKTsKLQkJdGFyZ2V0ICs9IEFUTV9DRUxMX0hFQURFUjsKLQkJbWVtc2V0KHRhcmdldCwgMCwgQVRNX0NFTExfUEFZTE9BRCAtIEFUTV9BQUw1X1RSQUlMRVIpOwotCQl0YXJnZXQgKz0gQVRNX0NFTExfUEFZTE9BRCAtIEFUTV9BQUw1X1RSQUlMRVI7Ci0KLQkJLS1jdHJsLT5udW1fY2VsbHM7Ci0JCVVEU0xfQVNTRVJUKCFjdHJsLT5udW1fY2VsbHMpOwotCX0KLQotCW1lbWNweSh0YXJnZXQsIGN0cmwtPmFhbDVfdHJhaWxlciwgQVRNX0FBTDVfVFJBSUxFUik7Ci0JdGFyZ2V0ICs9IEFUTV9BQUw1X1RSQUlMRVI7Ci0JLyogc2V0IHB0aSBiaXQgaW4gbGFzdCBjZWxsICovCi0JKih0YXJnZXQgKyAzIC0gQVRNX0NFTExfU0laRSkgfD0gMHgyOwotCWlmIChpbnN0YW5jZS0+c25kX3BhZGRpbmcpIHsKLQkJbWVtc2V0KHRhcmdldCwgMCwgaW5zdGFuY2UtPnNuZF9wYWRkaW5nKTsKLQkJdGFyZ2V0ICs9IGluc3RhbmNlLT5zbmRfcGFkZGluZzsKLQl9Ci0gb3V0OgotCSp0YXJnZXRfcCA9IHRhcmdldDsKLQlyZXR1cm4gbmMgLSBjdHJsLT5udW1fY2VsbHM7Ci19Ci0KLS8qKioqKioqKioqKioqKgotKiogIHJlY2VpdmUgICoqCi0qKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdWRzbF9jb21wbGV0ZV9yZWNlaXZlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZTsKLQlzdHJ1Y3QgdWRzbF9yZWNlaXZlciAqcmN2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXVyYiB8fCAhKHJjdiA9IHVyYi0+Y29udGV4dCkpIHsKLQkJZGJnKCJ1ZHNsX2NvbXBsZXRlX3JlY2VpdmU6IGJhZCB1cmIhIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbnN0YW5jZSA9IHJjdi0+aW5zdGFuY2U7Ci0JYnVmID0gcmN2LT5idWZmZXI7Ci0KLQlidWYtPmZpbGxlZF9jZWxscyA9IHVyYi0+YWN0dWFsX2xlbmd0aCAvIChBVE1fQ0VMTF9TSVpFICsgaW5zdGFuY2UtPnJjdl9wYWRkaW5nKTsKLQotCXZkYmcoInVkc2xfY29tcGxldGVfcmVjZWl2ZTogdXJiIDB4JXAsIHN0YXR1cyAlZCwgYWN0dWFsX2xlbmd0aCAlZCwgZmlsbGVkX2NlbGxzICV1LCByY3YgMHglcCwgYnVmIDB4JXAiLCB1cmIsIHVyYi0+c3RhdHVzLCB1cmItPmFjdHVhbF9sZW5ndGgsIGJ1Zi0+ZmlsbGVkX2NlbGxzLCByY3YsIGJ1Zik7Ci0KLQlVRFNMX0FTU0VSVChidWYtPmZpbGxlZF9jZWxscyA8PSByY3ZfYnVmX3NpemUpOwotCi0JLyogbWF5IG5vdCBiZSBpbl9pbnRlcnJ1cHQoKSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrLCBmbGFncyk7Ci0JbGlzdF9hZGQoJnJjdi0+bGlzdCwgJmluc3RhbmNlLT5zcGFyZV9yZWNlaXZlcnMpOwotCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJmluc3RhbmNlLT5maWxsZWRfcmVjZWl2ZV9idWZmZXJzKTsKLQlpZiAobGlrZWx5KCF1cmItPnN0YXR1cykpCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmluc3RhbmNlLT5yZWNlaXZlX3Rhc2tsZXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgdWRzbF9wcm9jZXNzX3JlY2VpdmUodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB1ZHNsX3JlY2VpdmVfYnVmZmVyICpidWY7Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSAoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqKWRhdGE7Ci0Jc3RydWN0IHVkc2xfcmVjZWl2ZXIgKnJjdjsKLQlpbnQgZXJyOwotCi0gbWFkZV9wcm9ncmVzczoKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmluc3RhbmNlLT5zcGFyZV9yZWNlaXZlX2J1ZmZlcnMpKSB7Ci0JCXNwaW5fbG9ja19pcnEoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2spOwotCQlpZiAobGlzdF9lbXB0eSgmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVycykpIHsKLQkJCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnJlY2VpdmVfbG9jayk7Ci0JCQlicmVhazsKLQkJfQotCQlyY3YgPSBsaXN0X2VudHJ5KGluc3RhbmNlLT5zcGFyZV9yZWNlaXZlcnMubmV4dCwKLQkJCQkgc3RydWN0IHVkc2xfcmVjZWl2ZXIsIGxpc3QpOwotCQlsaXN0X2RlbCgmcmN2LT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQotCQlidWYgPSBsaXN0X2VudHJ5KGluc3RhbmNlLT5zcGFyZV9yZWNlaXZlX2J1ZmZlcnMubmV4dCwKLQkJCQkgc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIsIGxpc3QpOwotCQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKLQotCQlyY3YtPmJ1ZmZlciA9IGJ1ZjsKLQotCQl1c2JfZmlsbF9idWxrX3VyYihyY3YtPnVyYiwgaW5zdGFuY2UtPnVzYl9kZXYsCi0JCQkJICB1c2JfcmN2YnVsa3BpcGUoaW5zdGFuY2UtPnVzYl9kZXYsIGluc3RhbmNlLT5kYXRhX2VuZHBvaW50KSwKLQkJCQkgIGJ1Zi0+YmFzZSwKLQkJCQkgIHJjdl9idWZfc2l6ZSAqIChBVE1fQ0VMTF9TSVpFICsgaW5zdGFuY2UtPnJjdl9wYWRkaW5nKSwKLQkJCQkgIHVkc2xfY29tcGxldGVfcmVjZWl2ZSwgcmN2KTsKLQotCQl2ZGJnKCJ1ZHNsX3Byb2Nlc3NfcmVjZWl2ZTogc2VuZGluZyB1cmIgMHglcCwgcmN2IDB4JXAsIGJ1ZiAweCVwIiwKLQkJICAgICByY3YtPnVyYiwgcmN2LCBidWYpOwotCi0JCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIocmN2LT51cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKLQkJCWRiZygidWRzbF9wcm9jZXNzX3JlY2VpdmU6IHVyYiBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpISIsIGVycik7Ci0JCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycyk7Ci0JCQlzcGluX2xvY2tfaXJxKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQkJCWxpc3RfYWRkKCZyY3YtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZXJzKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnJlY2VpdmVfbG9jayk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXNwaW5fbG9ja19pcnEoJmluc3RhbmNlLT5yZWNlaXZlX2xvY2spOwotCWlmIChsaXN0X2VtcHR5KCZpbnN0YW5jZS0+ZmlsbGVkX3JlY2VpdmVfYnVmZmVycykpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQkJcmV0dXJuOwkJLyogZG9uZSAtIG5vIG1vcmUgYnVmZmVycyAqLwotCX0KLQlidWYgPSBsaXN0X2VudHJ5KGluc3RhbmNlLT5maWxsZWRfcmVjZWl2ZV9idWZmZXJzLm5leHQsCi0JCQkgc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIsIGxpc3QpOwotCWxpc3RfZGVsKCZidWYtPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnJlY2VpdmVfbG9jayk7Ci0KLQl2ZGJnKCJ1ZHNsX3Byb2Nlc3NfcmVjZWl2ZTogcHJvY2Vzc2luZyBidWYgMHglcCIsIGJ1Zik7Ci0JdWRzbF9leHRyYWN0X2NlbGxzKGluc3RhbmNlLCBidWYtPmJhc2UsIGJ1Zi0+ZmlsbGVkX2NlbGxzKTsKLQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycyk7Ci0JZ290byBtYWRlX3Byb2dyZXNzOwotfQotCi0vKioqKioqKioqKioKLSoqICBzZW5kICAqKgotKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHVkc2xfY29tcGxldGVfc2VuZChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlOwotCXN0cnVjdCB1ZHNsX3NlbmRlciAqc25kOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXVyYiB8fCAhKHNuZCA9IHVyYi0+Y29udGV4dCkgfHwgIShpbnN0YW5jZSA9IHNuZC0+aW5zdGFuY2UpKSB7Ci0JCWRiZygidWRzbF9jb21wbGV0ZV9zZW5kOiBiYWQgdXJiISIpOwotCQlyZXR1cm47Ci0JfQotCi0JdmRiZygidWRzbF9jb21wbGV0ZV9zZW5kOiB1cmIgMHglcCwgc3RhdHVzICVkLCBzbmQgMHglcCwgYnVmIDB4JXAiLCB1cmIsCi0JICAgICB1cmItPnN0YXR1cywgc25kLCBzbmQtPmJ1ZmZlcik7Ci0KLQkvKiBtYXkgbm90IGJlIGluX2ludGVycnVwdCgpICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmluc3RhbmNlLT5zZW5kX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZCgmc25kLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3NlbmRlcnMpOwotCWxpc3RfYWRkKCZzbmQtPmJ1ZmZlci0+bGlzdCwgJmluc3RhbmNlLT5zcGFyZV9zZW5kX2J1ZmZlcnMpOwotCXRhc2tsZXRfc2NoZWR1bGUoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluc3RhbmNlLT5zZW5kX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgdWRzbF9wcm9jZXNzX3NlbmQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyICpidWY7Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSAoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqKWRhdGE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgdWRzbF9zZW5kZXIgKnNuZDsKLQlpbnQgZXJyOwotCXVuc2lnbmVkIGludCBudW1fd3JpdHRlbjsKLQotIG1hZGVfcHJvZ3Jlc3M6Ci0Jc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZpbnN0YW5jZS0+c3BhcmVfc2VuZGVycykpIHsKLQkJaWYgKCFsaXN0X2VtcHR5KCZpbnN0YW5jZS0+ZmlsbGVkX3NlbmRfYnVmZmVycykpIHsKLQkJCWJ1ZiA9IGxpc3RfZW50cnkoaW5zdGFuY2UtPmZpbGxlZF9zZW5kX2J1ZmZlcnMubmV4dCwKLQkJCQkJIHN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyLCBsaXN0KTsKLQkJCWxpc3RfZGVsKCZidWYtPmxpc3QpOwotCQl9IGVsc2UgaWYgKChidWYgPSBpbnN0YW5jZS0+Y3VycmVudF9idWZmZXIpKSB7Ci0JCQlpbnN0YW5jZS0+Y3VycmVudF9idWZmZXIgPSBOVUxMOwotCQl9IGVsc2UJCS8qIGFsbCBidWZmZXJzIGVtcHR5ICovCi0JCQlicmVhazsKLQotCQlzbmQgPSBsaXN0X2VudHJ5KGluc3RhbmNlLT5zcGFyZV9zZW5kZXJzLm5leHQsCi0JCQkJIHN0cnVjdCB1ZHNsX3NlbmRlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZzbmQtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5zZW5kX2xvY2spOwotCi0JCXNuZC0+YnVmZmVyID0gYnVmOwotCQl1c2JfZmlsbF9idWxrX3VyYihzbmQtPnVyYiwgaW5zdGFuY2UtPnVzYl9kZXYsCi0JCQkJICB1c2Jfc25kYnVsa3BpcGUoaW5zdGFuY2UtPnVzYl9kZXYsIGluc3RhbmNlLT5kYXRhX2VuZHBvaW50KSwKLQkJCQkgIGJ1Zi0+YmFzZSwKLQkJCQkgIChzbmRfYnVmX3NpemUgLSBidWYtPmZyZWVfY2VsbHMpICogKEFUTV9DRUxMX1NJWkUgKyBpbnN0YW5jZS0+c25kX3BhZGRpbmcpLAotCQkJCSAgdWRzbF9jb21wbGV0ZV9zZW5kLCBzbmQpOwotCi0JCXZkYmcoInVkc2xfcHJvY2Vzc19zZW5kOiBzdWJtaXR0aW5nIHVyYiAweCVwICglZCBjZWxscyksIHNuZCAweCVwLCBidWYgMHglcCIsCi0JCSAgICAgc25kLT51cmIsIHNuZF9idWZfc2l6ZSAtIGJ1Zi0+ZnJlZV9jZWxscywgc25kLCBidWYpOwotCi0JCWlmICgoZXJyID0gdXNiX3N1Ym1pdF91cmIoc25kLT51cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKLQkJCWRiZygidWRzbF9wcm9jZXNzX3NlbmQ6IHVyYiBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpISIsIGVycik7Ci0JCQlzcGluX2xvY2tfaXJxKCZpbnN0YW5jZS0+c2VuZF9sb2NrKTsKLQkJCWxpc3RfYWRkKCZzbmQtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfc2VuZGVycyk7Ci0JCQlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5zZW5kX2xvY2spOwotCQkJbGlzdF9hZGQoJmJ1Zi0+bGlzdCwgJmluc3RhbmNlLT5maWxsZWRfc2VuZF9idWZmZXJzKTsKLQkJCXJldHVybjsJLyogYmFpbCBvdXQgKi8KLQkJfQotCi0JCXNwaW5fbG9ja19pcnEoJmluc3RhbmNlLT5zZW5kX2xvY2spOwotCX0JCQkvKiB3aGlsZSAqLwotCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0KLQlpZiAoIWluc3RhbmNlLT5jdXJyZW50X3NrYikKLQkJaW5zdGFuY2UtPmN1cnJlbnRfc2tiID0gc2tiX2RlcXVldWUoJmluc3RhbmNlLT5zbmRxdWV1ZSk7Ci0JaWYgKCFpbnN0YW5jZS0+Y3VycmVudF9za2IpCi0JCXJldHVybjsJCS8qIGRvbmUgLSBubyBtb3JlIHNrYnMgKi8KLQotCXNrYiA9IGluc3RhbmNlLT5jdXJyZW50X3NrYjsKLQotCWlmICghKGJ1ZiA9IGluc3RhbmNlLT5jdXJyZW50X2J1ZmZlcikpIHsKLQkJc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0JCWlmIChsaXN0X2VtcHR5KCZpbnN0YW5jZS0+c3BhcmVfc2VuZF9idWZmZXJzKSkgewotCQkJaW5zdGFuY2UtPmN1cnJlbnRfYnVmZmVyID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrX2lycSgmaW5zdGFuY2UtPnNlbmRfbG9jayk7Ci0JCQlyZXR1cm47CS8qIGRvbmUgLSBubyBtb3JlIGJ1ZmZlcnMgKi8KLQkJfQotCQlidWYgPSBsaXN0X2VudHJ5KGluc3RhbmNlLT5zcGFyZV9zZW5kX2J1ZmZlcnMubmV4dCwKLQkJCSAgICAgICBzdHJ1Y3QgdWRzbF9zZW5kX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZidWYtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5zZW5kX2xvY2spOwotCi0JCWJ1Zi0+ZnJlZV9zdGFydCA9IGJ1Zi0+YmFzZTsKLQkJYnVmLT5mcmVlX2NlbGxzID0gc25kX2J1Zl9zaXplOwotCi0JCWluc3RhbmNlLT5jdXJyZW50X2J1ZmZlciA9IGJ1ZjsKLQl9Ci0KLQludW1fd3JpdHRlbiA9IHVkc2xfd3JpdGVfY2VsbHMoaW5zdGFuY2UsIGJ1Zi0+ZnJlZV9jZWxscywgc2tiLCAmYnVmLT5mcmVlX3N0YXJ0KTsKLQotCXZkYmcoInVkc2xfcHJvY2Vzc19zZW5kOiB3cm90ZSAldSBjZWxscyBmcm9tIHNrYiAweCVwIHRvIGJ1ZmZlciAweCVwIiwKLQkgICAgIG51bV93cml0dGVuLCBza2IsIGJ1Zik7Ci0KLQlpZiAoIShidWYtPmZyZWVfY2VsbHMgLT0gbnVtX3dyaXR0ZW4pKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJmluc3RhbmNlLT5maWxsZWRfc2VuZF9idWZmZXJzKTsKLQkJaW5zdGFuY2UtPmN1cnJlbnRfYnVmZmVyID0gTlVMTDsKLQl9Ci0KLQl2ZGJnKCJ1ZHNsX3Byb2Nlc3Nfc2VuZDogYnVmZmVyIGNvbnRhaW5zICVkIGNlbGxzLCAlZCBsZWZ0IiwKLQkgICAgIHNuZF9idWZfc2l6ZSAtIGJ1Zi0+ZnJlZV9jZWxscywgYnVmLT5mcmVlX2NlbGxzKTsKLQotCWlmICghVURTTF9TS0Ioc2tiKS0+bnVtX2NlbGxzKSB7Ci0JCXN0cnVjdCBhdG1fdmNjICp2Y2MgPSBVRFNMX1NLQihza2IpLT5hdG1fZGF0YS52Y2M7Ci0KLQkJdWRzbF9wb3AodmNjLCBza2IpOwotCQlpbnN0YW5jZS0+Y3VycmVudF9za2IgPSBOVUxMOwotCi0JCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnR4KTsKLQl9Ci0KLQlnb3RvIG1hZGVfcHJvZ3Jlc3M7Ci19Ci0KLXN0YXRpYyB2b2lkIHVkc2xfY2FuY2VsX3NlbmQoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UsCi0JCQkgICAgIHN0cnVjdCBhdG1fdmNjICp2Y2MpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm47Ci0KLQlkYmcoInVkc2xfY2FuY2VsX3NlbmQgZW50ZXJlZCIpOwotCXNwaW5fbG9ja19pcnEoJmluc3RhbmNlLT5zbmRxdWV1ZS5sb2NrKTsKLQlmb3IgKHNrYiA9IGluc3RhbmNlLT5zbmRxdWV1ZS5uZXh0LCBuID0gc2tiLT5uZXh0OwotCSAgICAgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKSZpbnN0YW5jZS0+c25kcXVldWU7Ci0JICAgICBza2IgPSBuLCBuID0gc2tiLT5uZXh0KQotCQlpZiAoVURTTF9TS0Ioc2tiKS0+YXRtX2RhdGEudmNjID09IHZjYykgewotCQkJZGJnKCJ1ZHNsX2NhbmNlbF9zZW5kOiBwb3BwaW5nIHNrYiAweCVwIiwgc2tiKTsKLQkJCV9fc2tiX3VubGluayhza2IsICZpbnN0YW5jZS0+c25kcXVldWUpOwotCQkJdWRzbF9wb3AodmNjLCBza2IpOwotCQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZpbnN0YW5jZS0+c25kcXVldWUubG9jayk7Ci0KLQl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCWlmICgoc2tiID0gaW5zdGFuY2UtPmN1cnJlbnRfc2tiKSAmJiAoVURTTF9TS0Ioc2tiKS0+YXRtX2RhdGEudmNjID09IHZjYykpIHsKLQkJZGJnKCJ1ZHNsX2NhbmNlbF9zZW5kOiBwb3BwaW5nIGN1cnJlbnQgc2tiICgweCVwKSIsIHNrYik7Ci0JCWluc3RhbmNlLT5jdXJyZW50X3NrYiA9IE5VTEw7Ci0JCXVkc2xfcG9wKHZjYywgc2tiKTsKLQl9Ci0JdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCWRiZygidWRzbF9jYW5jZWxfc2VuZCBkb25lIik7Ci19Ci0KLXN0YXRpYyBpbnQgdWRzbF9hdG1fc2VuZChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlID0gdmNjLT5kZXYtPmRldl9kYXRhOwotCWludCBlcnI7Ci0KLQl2ZGJnKCJ1ZHNsX2F0bV9zZW5kIGNhbGxlZCAoc2tiIDB4JXAsIGxlbiAldSkiLCBza2IsIHNrYi0+bGVuKTsKLQotCWlmICghaW5zdGFuY2UpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9zZW5kOiBOVUxMIGRhdGEhIik7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAodmNjLT5xb3MuYWFsICE9IEFUTV9BQUw1KSB7Ci0JCWRiZygidWRzbF9hdG1fc2VuZDogdW5zdXBwb3J0ZWQgQVRNIHR5cGUgJWQhIiwgdmNjLT5xb3MuYWFsKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmIChza2ItPmxlbiA+IEFUTV9NQVhfQUFMNV9QRFUpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9zZW5kOiBwYWNrZXQgdG9vIGxvbmcgKCVkIHZzICVkKSEiLCBza2ItPmxlbiwKLQkJICAgIEFUTV9NQVhfQUFMNV9QRFUpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JUEFDS0VUREVCVUcoc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0KLQl1ZHNsX2dyb29tX3NrYih2Y2MsIHNrYik7Ci0Jc2tiX3F1ZXVlX3RhaWwoJmluc3RhbmNlLT5zbmRxdWV1ZSwgc2tiKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZpbnN0YW5jZS0+c2VuZF90YXNrbGV0KTsKLQotCXJldHVybiAwOwotCi0gZmFpbDoKLQl1ZHNsX3BvcCh2Y2MsIHNrYik7Ci0JcmV0dXJuIGVycjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqCi0qKiAgYmVhbiBjb3VudGluZyAgKioKLSoqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCB1ZHNsX2Rlc3Ryb3lfaW5zdGFuY2Uoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPQotCSAgICBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSwgcmVmY291bnQpOwotCi0JdGFza2xldF9raWxsKCZpbnN0YW5jZS0+cmVjZWl2ZV90YXNrbGV0KTsKLQl0YXNrbGV0X2tpbGwoJmluc3RhbmNlLT5zZW5kX3Rhc2tsZXQpOwotCXVzYl9wdXRfZGV2KGluc3RhbmNlLT51c2JfZGV2KTsKLQlrZnJlZShpbnN0YW5jZSk7Ci19Ci0KLXZvaWQgdWRzbF9nZXRfaW5zdGFuY2Uoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCi17Ci0Ja3JlZl9nZXQoJmluc3RhbmNlLT5yZWZjb3VudCk7Ci19Ci0KLXZvaWQgdWRzbF9wdXRfaW5zdGFuY2Uoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCi17Ci0Ja3JlZl9wdXQoJmluc3RhbmNlLT5yZWZjb3VudCwgdWRzbF9kZXN0cm95X2luc3RhbmNlKTsKLX0KLQotLyoqKioqKioqKioKLSoqICBBVE0gICoqCi0qKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCB1ZHNsX2F0bV9kZXZfY2xvc2Uoc3RydWN0IGF0bV9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IGRldi0+ZGV2X2RhdGE7Ci0KLQlkZXYtPmRldl9kYXRhID0gTlVMTDsKLQl1ZHNsX3B1dF9pbnN0YW5jZShpbnN0YW5jZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdWRzbF9hdG1fcHJvY19yZWFkKHN0cnVjdCBhdG1fZGV2ICphdG1fZGV2LCBsb2ZmX3QgKiBwb3MsIGNoYXIgKnBhZ2UpCi17Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSBhdG1fZGV2LT5kZXZfZGF0YTsKLQlpbnQgbGVmdCA9ICpwb3M7Ci0KLQlpZiAoIWluc3RhbmNlKSB7Ci0JCWRiZygidWRzbF9hdG1fcHJvY19yZWFkOiBOVUxMIGluc3RhbmNlISIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoIWxlZnQtLSkKLQkJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBpbnN0YW5jZS0+ZGVzY3JpcHRpb24pOwotCi0JaWYgKCFsZWZ0LS0pCi0JCXJldHVybiBzcHJpbnRmKHBhZ2UsICJNQUM6ICUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCQkJICAgICAgIGF0bV9kZXYtPmVzaVswXSwgYXRtX2Rldi0+ZXNpWzFdLAotCQkJICAgICAgIGF0bV9kZXYtPmVzaVsyXSwgYXRtX2Rldi0+ZXNpWzNdLAotCQkJICAgICAgIGF0bV9kZXYtPmVzaVs0XSwgYXRtX2Rldi0+ZXNpWzVdKTsKLQotCWlmICghbGVmdC0tKQotCQlyZXR1cm4gc3ByaW50ZihwYWdlLAotCQkJICAgICAgICJBQUw1OiB0eCAlZCAoICVkIGVyciApLCByeCAlZCAoICVkIGVyciwgJWQgZHJvcCApXG4iLAotCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnR4KSwKLQkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS50eF9lcnIpLAotCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnJ4KSwKLQkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS5yeF9lcnIpLAotCQkJICAgICAgIGF0b21pY19yZWFkKCZhdG1fZGV2LT5zdGF0cy5hYWw1LnJ4X2Ryb3ApKTsKLQotCWlmICghbGVmdC0tKSB7Ci0JCXN3aXRjaCAoYXRtX2Rldi0+c2lnbmFsKSB7Ci0JCWNhc2UgQVRNX1BIWV9TSUdfRk9VTkQ6Ci0JCQlzcHJpbnRmKHBhZ2UsICJMaW5lIHVwIik7Ci0JCQlicmVhazsKLQkJY2FzZSBBVE1fUEhZX1NJR19MT1NUOgotCQkJc3ByaW50ZihwYWdlLCAiTGluZSBkb3duIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNwcmludGYocGFnZSwgIkxpbmUgc3RhdGUgdW5rbm93biIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaW5zdGFuY2UtPnVzYl9kZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKLQkJCXN0cmNhdChwYWdlLCAiLCBkaXNjb25uZWN0ZWRcbiIpOwotCQllbHNlIHsKLQkJCWlmIChpbnN0YW5jZS0+c3RhdHVzID09IFVEU0xfTE9BREVEX0ZJUk1XQVJFKQotCQkJCXN0cmNhdChwYWdlLCAiLCBmaXJtd2FyZSBsb2FkZWRcbiIpOwotCQkJZWxzZSBpZiAoaW5zdGFuY2UtPnN0YXR1cyA9PSBVRFNMX0xPQURJTkdfRklSTVdBUkUpCi0JCQkJc3RyY2F0KHBhZ2UsICIsIGZpcm13YXJlIGxvYWRpbmdcbiIpOwotCQkJZWxzZQotCQkJCXN0cmNhdChwYWdlLCAiLCBubyBmaXJtd2FyZVxuIik7Ci0JCX0KLQotCQlyZXR1cm4gc3RybGVuKHBhZ2UpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHVkc2xfYXRtX29wZW4oc3RydWN0IGF0bV92Y2MgKnZjYykKLXsKLQlzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSA9IHZjYy0+ZGV2LT5kZXZfZGF0YTsKLQlzdHJ1Y3QgdWRzbF92Y2NfZGF0YSAqbmV3OwotCXVuc2lnbmVkIGludCBtYXhfcGR1OwotCWludCB2Y2kgPSB2Y2MtPnZjaTsKLQlzaG9ydCB2cGkgPSB2Y2MtPnZwaTsKLQlpbnQgZXJyOwotCi0JZGJnKCJ1ZHNsX2F0bV9vcGVuOiB2cGkgJWhkLCB2Y2kgJWQiLCB2cGksIHZjaSk7Ci0KLQlpZiAoIWluc3RhbmNlKSB7Ci0JCWRiZygidWRzbF9hdG1fb3BlbjogTlVMTCBkYXRhISIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBvbmx5IHN1cHBvcnQgQUFMNSAqLwotCWlmICgodmNjLT5xb3MuYWFsICE9IEFUTV9BQUw1KSB8fCAodmNjLT5xb3Mucnh0cC5tYXhfc2R1IDwgMCkKLQkgICAgfHwgKHZjYy0+cW9zLnJ4dHAubWF4X3NkdSA+IEFUTV9NQVhfQUFMNV9QRFUpKSB7Ci0JCWRiZygidWRzbF9hdG1fb3BlbjogdW5zdXBwb3J0ZWQgQVRNIHR5cGUgJWQhIiwgdmNjLT5xb3MuYWFsKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGluc3RhbmNlLT5maXJtd2FyZV93YWl0ICYmCi0JICAgIChlcnIgPSBpbnN0YW5jZS0+ZmlybXdhcmVfd2FpdChpbnN0YW5jZSkpIDwgMCkgewotCQlkYmcoInVkc2xfYXRtX29wZW46IGZpcm13YXJlIG5vdCBsb2FkZWQgKCVkKSEiLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWRvd24oJmluc3RhbmNlLT5zZXJpYWxpemUpOwkvKiB2cyBzZWxmLCB1ZHNsX2F0bV9jbG9zZSAqLwotCi0JaWYgKHVkc2xfZmluZF92Y2MoaW5zdGFuY2UsIHZwaSwgdmNpKSkgewotCQlkYmcoInVkc2xfYXRtX29wZW46ICVoZC8lZCBhbHJlYWR5IGluIHVzZSEiLCB2cGksIHZjaSk7Ci0JCXVwKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKLQkJcmV0dXJuIC1FQUREUklOVVNFOwotCX0KLQotCWlmICghKG5ldyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZHNsX3ZjY19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7Ci0JCWRiZygidWRzbF9hdG1fb3Blbjogbm8gbWVtb3J5IGZvciB2Y2NfZGF0YSEiKTsKLQkJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1zZXQobmV3LCAwLCBzaXplb2Yoc3RydWN0IHVkc2xfdmNjX2RhdGEpKTsKLQluZXctPnZjYyA9IHZjYzsKLQluZXctPnZwaSA9IHZwaTsKLQluZXctPnZjaSA9IHZjaTsKLQotCS8qIHVkc2xfZXh0cmFjdF9jZWxscyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgY2VsbCAqLwotCW1heF9wZHUgPSBtYXgoMSwgVURTTF9OVU1fQ0VMTFModmNjLT5xb3Mucnh0cC5tYXhfc2R1KSkgKiBBVE1fQ0VMTF9QQVlMT0FEOwotCWlmICghKG5ldy0+c2FyYiA9IGFsbG9jX3NrYihtYXhfcGR1LCBHRlBfS0VSTkVMKSkpIHsKLQkJZGJnKCJ1ZHNsX2F0bV9vcGVuOiBubyBtZW1vcnkgZm9yIFNBUiBidWZmZXIhIik7Ci0JCWtmcmVlKG5ldyk7Ci0JCXVwKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdmNjLT5kZXZfZGF0YSA9IG5ldzsKLQotCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0JbGlzdF9hZGQoJm5ldy0+bGlzdCwgJmluc3RhbmNlLT52Y2NfbGlzdCk7Ci0JdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT5yZWNlaXZlX3Rhc2tsZXQpOwotCi0Jc2V0X2JpdChBVE1fVkZfQUREUiwgJnZjYy0+ZmxhZ3MpOwotCXNldF9iaXQoQVRNX1ZGX1BBUlRJQUwsICZ2Y2MtPmZsYWdzKTsKLQlzZXRfYml0KEFUTV9WRl9SRUFEWSwgJnZjYy0+ZmxhZ3MpOwotCi0JdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCi0JdGFza2xldF9zY2hlZHVsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0KLQlkYmcoInVkc2xfYXRtX29wZW46IGFsbG9jYXRlZCB2Y2MgZGF0YSAweCVwIChtYXhfcGR1OiAldSkiLCBuZXcsIG1heF9wZHUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHVkc2xfYXRtX2Nsb3NlKHN0cnVjdCBhdG1fdmNjICp2Y2MpCi17Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UgPSB2Y2MtPmRldi0+ZGV2X2RhdGE7Ci0Jc3RydWN0IHVkc2xfdmNjX2RhdGEgKnZjY19kYXRhID0gdmNjLT5kZXZfZGF0YTsKLQotCWRiZygidWRzbF9hdG1fY2xvc2UgY2FsbGVkIik7Ci0KLQlpZiAoIWluc3RhbmNlIHx8ICF2Y2NfZGF0YSkgewotCQlkYmcoInVkc2xfYXRtX2Nsb3NlOiBOVUxMIGRhdGEhIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlkYmcoInVkc2xfYXRtX2Nsb3NlOiBkZWFsbG9jYXRpbmcgdmNjIDB4JXAgd2l0aCB2cGkgJWQgdmNpICVkIiwKLQkgICAgdmNjX2RhdGEsIHZjY19kYXRhLT52cGksIHZjY19kYXRhLT52Y2kpOwotCi0JdWRzbF9jYW5jZWxfc2VuZChpbnN0YW5jZSwgdmNjKTsKLQotCWRvd24oJmluc3RhbmNlLT5zZXJpYWxpemUpOwkvKiB2cyBzZWxmLCB1ZHNsX2F0bV9vcGVuICovCi0KLQl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT5yZWNlaXZlX3Rhc2tsZXQpOwotCWxpc3RfZGVsKCZ2Y2NfZGF0YS0+bGlzdCk7Ci0JdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT5yZWNlaXZlX3Rhc2tsZXQpOwotCi0Ja2ZyZWVfc2tiKHZjY19kYXRhLT5zYXJiKTsKLQl2Y2NfZGF0YS0+c2FyYiA9IE5VTEw7Ci0KLQlrZnJlZSh2Y2NfZGF0YSk7Ci0JdmNjLT5kZXZfZGF0YSA9IE5VTEw7Ci0KLQl2Y2MtPnZwaSA9IEFUTV9WUElfVU5TUEVDOwotCXZjYy0+dmNpID0gQVRNX1ZDSV9VTlNQRUM7Ci0JY2xlYXJfYml0KEFUTV9WRl9SRUFEWSwgJnZjYy0+ZmxhZ3MpOwotCWNsZWFyX2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOwotCWNsZWFyX2JpdChBVE1fVkZfQUREUiwgJnZjYy0+ZmxhZ3MpOwotCi0JdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCi0JZGJnKCJ1ZHNsX2F0bV9jbG9zZSBzdWNjZXNzZnVsIik7Ci19Ci0KLXN0YXRpYyBpbnQgdWRzbF9hdG1faW9jdGwoc3RydWN0IGF0bV9kZXYgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKLQkJCSAgdm9pZCBfX3VzZXIgKiBhcmcpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEFUTV9RVUVSWUxPT1A6Ci0JCXJldHVybiBwdXRfdXNlcihBVE1fTE1fTk9ORSwgKGludCBfX3VzZXIgKilhcmcpID8gLUVGQVVMVCA6IDA7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKLQl9Ci19Ci0KLS8qKioqKioqKioqCi0qKiAgVVNCICAqKgotKioqKioqKioqKi8KLQotaW50IHVkc2xfaW5zdGFuY2Vfc2V0dXAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKQotewotCWNoYXIgKmJ1ZjsKLQlpbnQgaSwgbGVuZ3RoOwotCi0Ja3JlZl9pbml0KCZpbnN0YW5jZS0+cmVmY291bnQpOwkvKiBvbmUgZm9yIFVTQiAqLwotCXVkc2xfZ2V0X2luc3RhbmNlKGluc3RhbmNlKTsJLyogb25lIGZvciBBVE0gKi8KLQotCWluaXRfTVVURVgoJmluc3RhbmNlLT5zZXJpYWxpemUpOwotCi0JaW5zdGFuY2UtPnVzYl9kZXYgPSBkZXY7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnZjY19saXN0KTsKLQotCWluc3RhbmNlLT5zdGF0dXMgPSBVRFNMX05PX0ZJUk1XQVJFOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluc3RhbmNlLT5maXJtd2FyZV93YWl0ZXJzKTsKLQotCXNwaW5fbG9ja19pbml0KCZpbnN0YW5jZS0+cmVjZWl2ZV9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVycyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5maWxsZWRfcmVjZWl2ZV9idWZmZXJzKTsKLQotCXRhc2tsZXRfaW5pdCgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCwgdWRzbF9wcm9jZXNzX3JlY2VpdmUsICh1bnNpZ25lZCBsb25nKWluc3RhbmNlKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycyk7Ci0KLQlza2JfcXVldWVfaGVhZF9pbml0KCZpbnN0YW5jZS0+c25kcXVldWUpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmluc3RhbmNlLT5zZW5kX2xvY2spOwotCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+c3BhcmVfc2VuZGVycyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5zcGFyZV9zZW5kX2J1ZmZlcnMpOwotCi0JdGFza2xldF9pbml0KCZpbnN0YW5jZS0+c2VuZF90YXNrbGV0LCB1ZHNsX3Byb2Nlc3Nfc2VuZCwKLQkJICAgICAodW5zaWduZWQgbG9uZylpbnN0YW5jZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5maWxsZWRfc2VuZF9idWZmZXJzKTsKLQotCS8qIHJlY2VpdmUgaW5pdCAqLwotCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnM7IGkrKykgewotCQlzdHJ1Y3QgdWRzbF9yZWNlaXZlciAqcmN2ID0gJihpbnN0YW5jZS0+cmVjZWl2ZXJzW2ldKTsKLQotCQlpZiAoIShyY3YtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpKSB7Ci0JCQlkYmcoInVkc2xfdXNiX3Byb2JlOiBubyBtZW1vcnkgZm9yIHJlY2VpdmUgdXJiICVkISIsIGkpOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJcmN2LT5pbnN0YW5jZSA9IGluc3RhbmNlOwotCi0JCWxpc3RfYWRkKCZyY3YtPmxpc3QsICZpbnN0YW5jZS0+c3BhcmVfcmVjZWl2ZXJzKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl9idWZzOyBpKyspIHsKLQkJc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIgKmJ1ZiA9Ci0JCSAgICAmKGluc3RhbmNlLT5yZWNlaXZlX2J1ZmZlcnNbaV0pOwotCi0JCWJ1Zi0+YmFzZSA9IGttYWxsb2MocmN2X2J1Zl9zaXplICogKEFUTV9DRUxMX1NJWkUgKyBpbnN0YW5jZS0+cmN2X3BhZGRpbmcpLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYtPmJhc2UpIHsKLQkJCWRiZygidWRzbF91c2JfcHJvYmU6IG5vIG1lbW9yeSBmb3IgcmVjZWl2ZSBidWZmZXIgJWQhIiwgaSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlsaXN0X2FkZCgmYnVmLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycyk7Ci0JfQotCi0JLyogc2VuZCBpbml0ICovCi0JZm9yIChpID0gMDsgaSA8IG51bV9zbmRfdXJiczsgaSsrKSB7Ci0JCXN0cnVjdCB1ZHNsX3NlbmRlciAqc25kID0gJihpbnN0YW5jZS0+c2VuZGVyc1tpXSk7Ci0KLQkJaWYgKCEoc25kLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpKSkgewotCQkJZGJnKCJ1ZHNsX3VzYl9wcm9iZTogbm8gbWVtb3J5IGZvciBzZW5kIHVyYiAlZCEiLCBpKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCXNuZC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKLQotCQlsaXN0X2FkZCgmc25kLT5saXN0LCAmaW5zdGFuY2UtPnNwYXJlX3NlbmRlcnMpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBudW1fc25kX2J1ZnM7IGkrKykgewotCQlzdHJ1Y3QgdWRzbF9zZW5kX2J1ZmZlciAqYnVmID0gJihpbnN0YW5jZS0+c2VuZF9idWZmZXJzW2ldKTsKLQotCQlidWYtPmJhc2UgPSBrbWFsbG9jKHNuZF9idWZfc2l6ZSAqIChBVE1fQ0VMTF9TSVpFICsgaW5zdGFuY2UtPnNuZF9wYWRkaW5nKSwKLQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYnVmLT5iYXNlKSB7Ci0JCQlkYmcoInVkc2xfdXNiX3Byb2JlOiBubyBtZW1vcnkgZm9yIHNlbmQgYnVmZmVyICVkISIsIGkpOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJbGlzdF9hZGQoJmJ1Zi0+bGlzdCwgJmluc3RhbmNlLT5zcGFyZV9zZW5kX2J1ZmZlcnMpOwotCX0KLQotCS8qIEFUTSBpbml0ICovCi0JaW5zdGFuY2UtPmF0bV9kZXYgPSBhdG1fZGV2X3JlZ2lzdGVyKGluc3RhbmNlLT5kcml2ZXJfbmFtZSwKLQkJCQkJICAgICAmdWRzbF9hdG1fZGV2b3BzLCAtMSwgTlVMTCk7Ci0JaWYgKCFpbnN0YW5jZS0+YXRtX2RldikgewotCQlkYmcoInVkc2xfdXNiX3Byb2JlOiBmYWlsZWQgdG8gcmVnaXN0ZXIgQVRNIGRldmljZSEiKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWluc3RhbmNlLT5hdG1fZGV2LT5jaV9yYW5nZS52cGlfYml0cyA9IEFUTV9DSV9NQVg7Ci0JaW5zdGFuY2UtPmF0bV9kZXYtPmNpX3JhbmdlLnZjaV9iaXRzID0gQVRNX0NJX01BWDsKLQlpbnN0YW5jZS0+YXRtX2Rldi0+c2lnbmFsID0gQVRNX1BIWV9TSUdfVU5LTk9XTjsKLQotCS8qIHRlbXAgaW5pdCBBVE0gZGV2aWNlLCBzZXQgdG8gMTI4a2JpdCAqLwotCWluc3RhbmNlLT5hdG1fZGV2LT5saW5rX3JhdGUgPSAxMjggKiAxMDAwIC8gNDI0OwotCi0JLyogZGV2aWNlIGRlc2NyaXB0aW9uICovCi0JYnVmID0gaW5zdGFuY2UtPmRlc2NyaXB0aW9uOwotCWxlbmd0aCA9IHNpemVvZihpbnN0YW5jZS0+ZGVzY3JpcHRpb24pOwotCi0JaWYgKChpID0gdXNiX3N0cmluZyhkZXYsIGRldi0+ZGVzY3JpcHRvci5pUHJvZHVjdCwgYnVmLCBsZW5ndGgpKSA8IDApCi0JCWdvdG8gZmluaXNoOwotCi0JYnVmICs9IGk7Ci0JbGVuZ3RoIC09IGk7Ci0KLQlpID0gc2NucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiICgiKTsKLQlidWYgKz0gaTsKLQlsZW5ndGggLT0gaTsKLQotCWlmIChsZW5ndGggPD0gMCB8fCAoaSA9IHVzYl9tYWtlX3BhdGgoZGV2LCBidWYsIGxlbmd0aCkpIDwgMCkKLQkJZ290byBmaW5pc2g7Ci0KLQlidWYgKz0gaTsKLQlsZW5ndGggLT0gaTsKLQotCXNucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiKSIpOwotCi0gZmluaXNoOgotCS8qIHJlYWR5IGZvciBBVE0gY2FsbGJhY2tzICovCi0Jd21iKCk7Ci0JaW5zdGFuY2UtPmF0bV9kZXYtPmRldl9kYXRhID0gaW5zdGFuY2U7Ci0KLQl1c2JfZ2V0X2RldihkZXYpOwotCi0JcmV0dXJuIDA7Ci0KLSBmYWlsOgotCWZvciAoaSA9IDA7IGkgPCBudW1fc25kX2J1ZnM7IGkrKykKLQkJa2ZyZWUoaW5zdGFuY2UtPnNlbmRfYnVmZmVyc1tpXS5iYXNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fc25kX3VyYnM7IGkrKykKLQkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5zZW5kZXJzW2ldLnVyYik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl9idWZzOyBpKyspCi0JCWtmcmVlKGluc3RhbmNlLT5yZWNlaXZlX2J1ZmZlcnNbaV0uYmFzZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzOyBpKyspCi0JCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+cmVjZWl2ZXJzW2ldLnVyYik7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotdm9pZCB1ZHNsX2luc3RhbmNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2UpCi17Ci0JaW50IGk7Ci0KLQlkYmcoInVkc2xfaW5zdGFuY2VfZGlzY29ubmVjdCBlbnRlcmVkIik7Ci0KLQlpZiAoIWluc3RhbmNlKSB7Ci0JCWRiZygidWRzbF9pbnN0YW5jZV9kaXNjb25uZWN0OiBOVUxMIGluc3RhbmNlISIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogcmVjZWl2ZSBmaW5hbGl6ZSAqLwotCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzOyBpKyspCi0JCXVzYl9raWxsX3VyYihpbnN0YW5jZS0+cmVjZWl2ZXJzW2ldLnVyYik7Ci0KLQkvKiBubyBuZWVkIHRvIHRha2UgdGhlIHNwaW5sb2NrICovCi0JSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5maWxsZWRfcmVjZWl2ZV9idWZmZXJzKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnNwYXJlX3JlY2VpdmVfYnVmZmVycyk7Ci0KLQl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnJlY2VpdmVfdGFza2xldCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzOyBpKyspCi0JCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+cmVjZWl2ZXJzW2ldLnVyYik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl9idWZzOyBpKyspCi0JCWtmcmVlKGluc3RhbmNlLT5yZWNlaXZlX2J1ZmZlcnNbaV0uYmFzZSk7Ci0KLQkvKiBzZW5kIGZpbmFsaXplICovCi0JdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+c2VuZF90YXNrbGV0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fc25kX3VyYnM7IGkrKykKLQkJdXNiX2tpbGxfdXJiKGluc3RhbmNlLT5zZW5kZXJzW2ldLnVyYik7Ci0KLQkvKiBubyBuZWVkIHRvIHRha2UgdGhlIHNwaW5sb2NrICovCi0JSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT5zcGFyZV9zZW5kZXJzKTsKLQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnNwYXJlX3NlbmRfYnVmZmVycyk7Ci0JaW5zdGFuY2UtPmN1cnJlbnRfYnVmZmVyID0gTlVMTDsKLQotCXRhc2tsZXRfZW5hYmxlKCZpbnN0YW5jZS0+c2VuZF90YXNrbGV0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fc25kX3VyYnM7IGkrKykKLQkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT5zZW5kZXJzW2ldLnVyYik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NuZF9idWZzOyBpKyspCi0JCWtmcmVlKGluc3RhbmNlLT5zZW5kX2J1ZmZlcnNbaV0uYmFzZSk7Ci0KLQkvKiBBVE0gZmluYWxpemUgKi8KLQlzaHV0ZG93bl9hdG1fZGV2KGluc3RhbmNlLT5hdG1fZGV2KTsKLX0KLQotRVhQT1JUX1NZTUJPTF9HUEwodWRzbF9nZXRfaW5zdGFuY2UpOwotRVhQT1JUX1NZTUJPTF9HUEwodWRzbF9wdXRfaW5zdGFuY2UpOwotRVhQT1JUX1NZTUJPTF9HUEwodWRzbF9pbnN0YW5jZV9zZXR1cCk7Ci1FWFBPUlRfU1lNQk9MX0dQTCh1ZHNsX2luc3RhbmNlX2Rpc2Nvbm5lY3QpOwotCi0vKioqKioqKioqKioKLSoqICBpbml0ICAqKgotKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgX19pbml0IHVkc2xfdXNiX2luaXQodm9pZCkKLXsKLQlkYmcoInVkc2xfdXNiX2luaXQ6IGRyaXZlciB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04pOwotCi0JaWYgKHNpemVvZihzdHJ1Y3QgdWRzbF9jb250cm9sKSA+IHNpemVvZigoKHN0cnVjdCBza19idWZmICopIDApLT5jYikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIF9fRklMRV9fICI6IHVudXNhYmxlIHdpdGggdGhpcyBrZXJuZWwhXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKChudW1fcmN2X3VyYnMgPiBVRFNMX01BWF9SQ1ZfVVJCUykKLQkgICAgfHwgKG51bV9zbmRfdXJicyA+IFVEU0xfTUFYX1NORF9VUkJTKQotCSAgICB8fCAobnVtX3Jjdl9idWZzID4gVURTTF9NQVhfUkNWX0JVRlMpCi0JICAgIHx8IChudW1fc25kX2J1ZnMgPiBVRFNMX01BWF9TTkRfQlVGUykKLQkgICAgfHwgKHJjdl9idWZfc2l6ZSA+IFVEU0xfTUFYX1JDVl9CVUZfU0laRSkKLQkgICAgfHwgKHNuZF9idWZfc2l6ZSA+IFVEU0xfTUFYX1NORF9CVUZfU0laRSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB1ZHNsX3VzYl9leGl0KHZvaWQpCi17Ci19Ci0KLW1vZHVsZV9pbml0KHVkc2xfdXNiX2luaXQpOwotbW9kdWxlX2V4aXQodWRzbF91c2JfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwotCi0vKioqKioqKioqKioqCi0qKiAgZGVidWcgICoqCi0qKioqKioqKioqKiovCi0KLSNpZmRlZiBWRVJCT1NFX0RFQlVHCi1zdGF0aWMgaW50IHVkc2xfcHJpbnRfcGFja2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbMjU2XTsKLQlpbnQgaSA9IDAsIGogPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjspIHsKLQkJYnVmZmVyWzBdID0gJ1wwJzsKLQkJc3ByaW50ZihidWZmZXIsICIlLjNkIDoiLCBpKTsKLQkJZm9yIChqID0gMDsgKGogPCAxNikgJiYgKGkgPCBsZW4pOyBqKyssIGkrKykgewotCQkJc3ByaW50ZihidWZmZXIsICIlcyAlMi4yeCIsIGJ1ZmZlciwgZGF0YVtpXSk7Ci0JCX0KLQkJZGJnKCIlcyIsIGJ1ZmZlcik7Ci0JfQotCXJldHVybiBpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiX2F0bS5oIGIvZHJpdmVycy91c2IvYXRtL3VzYl9hdG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4YzUzMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdXNiX2F0bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICB1c2JfYXRtLmggLSBHZW5lcmljIFVTQiB4RFNMIGRyaXZlciBjb3JlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMSwgQWxjYXRlbAotICogIENvcHlyaWdodCAoQykgMjAwMywgRHVuY2FuIFNhbmRzLCBTb2xOZWdybywgSm9zZXAgQ29tYXMKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQsIERhdmlkIFdvb2Rob3VzZQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiAgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRtLmg+Ci0jaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotCi0vKgotI2RlZmluZSBERUJVRwotI2RlZmluZSBWRVJCT1NFX0RFQlVHCi0qLwotCi0jaWYgIWRlZmluZWQgKERFQlVHKSAmJiBkZWZpbmVkIChDT05GSUdfVVNCX0RFQlVHKQotIwlkZWZpbmUgREVCVUcKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBVRFNMX0FTU0VSVCh4KQlCVUdfT04oISh4KSkKLSNlbHNlCi0jZGVmaW5lIFVEU0xfQVNTRVJUKHgpCWRvIHsgaWYgKCEoeCkpIHdhcm4oImZhaWxlZCBhc3NlcnRpb24gJyIgI3ggIicgYXQgbGluZSAlZCIsIF9fTElORV9fKTsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNkZWZpbmUgVURTTF9NQVhfUkNWX1VSQlMJCTQKLSNkZWZpbmUgVURTTF9NQVhfU05EX1VSQlMJCTQKLSNkZWZpbmUgVURTTF9NQVhfUkNWX0JVRlMJCTgKLSNkZWZpbmUgVURTTF9NQVhfU05EX0JVRlMJCTgKLSNkZWZpbmUgVURTTF9NQVhfUkNWX0JVRl9TSVpFCQkxMDI0CS8qIEFUTSBjZWxscyAqLwotI2RlZmluZSBVRFNMX01BWF9TTkRfQlVGX1NJWkUJCTEwMjQJLyogQVRNIGNlbGxzICovCi0jZGVmaW5lIFVEU0xfREVGQVVMVF9SQ1ZfVVJCUwkJMgotI2RlZmluZSBVRFNMX0RFRkFVTFRfU05EX1VSQlMJCTIKLSNkZWZpbmUgVURTTF9ERUZBVUxUX1JDVl9CVUZTCQk0Ci0jZGVmaW5lIFVEU0xfREVGQVVMVF9TTkRfQlVGUwkJNAotI2RlZmluZSBVRFNMX0RFRkFVTFRfUkNWX0JVRl9TSVpFCTY0CS8qIEFUTSBjZWxscyAqLwotI2RlZmluZSBVRFNMX0RFRkFVTFRfU05EX0JVRl9TSVpFCTY0CS8qIEFUTSBjZWxscyAqLwotCi0jZGVmaW5lIEFUTV9DRUxMX0hFQURFUgkJCShBVE1fQ0VMTF9TSVpFIC0gQVRNX0NFTExfUEFZTE9BRCkKLSNkZWZpbmUgVURTTF9OVU1fQ0VMTFMoeCkJCSgoKHgpICsgQVRNX0FBTDVfVFJBSUxFUiArIEFUTV9DRUxMX1BBWUxPQUQgLSAxKSAvIEFUTV9DRUxMX1BBWUxPQUQpCi0KLS8qIHJlY2VpdmUgKi8KLQotc3RydWN0IHVkc2xfcmVjZWl2ZV9idWZmZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1bnNpZ25lZCBjaGFyICpiYXNlOwotCXVuc2lnbmVkIGludCBmaWxsZWRfY2VsbHM7Ci19OwotCi1zdHJ1Y3QgdWRzbF9yZWNlaXZlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXN0cnVjdCB1ZHNsX3JlY2VpdmVfYnVmZmVyICpidWZmZXI7Ci0Jc3RydWN0IHVyYiAqdXJiOwotCXN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlOwotfTsKLQotc3RydWN0IHVkc2xfdmNjX2RhdGEgewotCS8qIHZwaS92Y2kgbG9va3VwICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXNob3J0IHZwaTsKLQlpbnQgdmNpOwotCXN0cnVjdCBhdG1fdmNjICp2Y2M7Ci0KLQkvKiByYXcgY2VsbCByZWFzc2VtYmx5ICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNhcmI7Ci19OwotCi0vKiBzZW5kICovCi0KLXN0cnVjdCB1ZHNsX3NlbmRfYnVmZmVyIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JdW5zaWduZWQgY2hhciAqYmFzZTsKLQl1bnNpZ25lZCBjaGFyICpmcmVlX3N0YXJ0OwotCXVuc2lnbmVkIGludCBmcmVlX2NlbGxzOwotfTsKLQotc3RydWN0IHVkc2xfc2VuZGVyIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHVkc2xfc2VuZF9idWZmZXIgKmJ1ZmZlcjsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0Jc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSAqaW5zdGFuY2U7Ci19OwotCi1zdHJ1Y3QgdWRzbF9jb250cm9sIHsKLQlzdHJ1Y3QgYXRtX3NrYl9kYXRhIGF0bV9kYXRhOwotCXVuc2lnbmVkIGludCBudW1fY2VsbHM7Ci0JdW5zaWduZWQgaW50IG51bV9lbnRpcmU7Ci0JdW5zaWduZWQgaW50IHBkdV9wYWRkaW5nOwotCXVuc2lnbmVkIGNoYXIgYWFsNV90cmFpbGVyW0FUTV9BQUw1X1RSQUlMRVJdOwotfTsKLQotI2RlZmluZSBVRFNMX1NLQih4KQkJKChzdHJ1Y3QgdWRzbF9jb250cm9sICopKHgpLT5jYikKLQotLyogbWFpbiBkcml2ZXIgZGF0YSAqLwotCi1lbnVtIHVkc2xfc3RhdHVzIHsKLQlVRFNMX05PX0ZJUk1XQVJFLAotCVVEU0xfTE9BRElOR19GSVJNV0FSRSwKLQlVRFNMX0xPQURFRF9GSVJNV0FSRQotfTsKLQotc3RydWN0IHVkc2xfaW5zdGFuY2VfZGF0YSB7Ci0Jc3RydWN0IGtyZWYgcmVmY291bnQ7Ci0Jc3RydWN0IHNlbWFwaG9yZSBzZXJpYWxpemU7Ci0KLQkvKiBVU0IgZGV2aWNlIHBhcnQgKi8KLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldjsKLQljaGFyIGRlc2NyaXB0aW9uWzY0XTsKLQlpbnQgZGF0YV9lbmRwb2ludDsKLQlpbnQgc25kX3BhZGRpbmc7Ci0JaW50IHJjdl9wYWRkaW5nOwotCWNvbnN0IGNoYXIgKmRyaXZlcl9uYW1lOwotCi0JLyogQVRNIGRldmljZSBwYXJ0ICovCi0Jc3RydWN0IGF0bV9kZXYgKmF0bV9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2Y2NfbGlzdDsKLQotCS8qIGZpcm13YXJlICovCi0JaW50ICgqZmlybXdhcmVfd2FpdCkgKHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKik7Ci0JZW51bSB1ZHNsX3N0YXR1cyBzdGF0dXM7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgZmlybXdhcmVfd2FpdGVyczsKLQotCS8qIHJlY2VpdmUgKi8KLQlzdHJ1Y3QgdWRzbF9yZWNlaXZlciByZWNlaXZlcnNbVURTTF9NQVhfUkNWX1VSQlNdOwotCXN0cnVjdCB1ZHNsX3JlY2VpdmVfYnVmZmVyIHJlY2VpdmVfYnVmZmVyc1tVRFNMX01BWF9SQ1ZfQlVGU107Ci0KLQlzcGlubG9ja190IHJlY2VpdmVfbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNwYXJlX3JlY2VpdmVyczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGxlZF9yZWNlaXZlX2J1ZmZlcnM7Ci0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcmVjZWl2ZV90YXNrbGV0OwotCXN0cnVjdCBsaXN0X2hlYWQgc3BhcmVfcmVjZWl2ZV9idWZmZXJzOwotCi0JLyogc2VuZCAqLwotCXN0cnVjdCB1ZHNsX3NlbmRlciBzZW5kZXJzW1VEU0xfTUFYX1NORF9VUkJTXTsKLQlzdHJ1Y3QgdWRzbF9zZW5kX2J1ZmZlciBzZW5kX2J1ZmZlcnNbVURTTF9NQVhfU05EX0JVRlNdOwotCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBzbmRxdWV1ZTsKLQotCXNwaW5sb2NrX3Qgc2VuZF9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgc3BhcmVfc2VuZGVyczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNwYXJlX3NlbmRfYnVmZmVyczsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBzZW5kX3Rhc2tsZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKmN1cnJlbnRfc2tiOwkJCS8qIGJlaW5nIGVtcHRpZWQgKi8KLQlzdHJ1Y3QgdWRzbF9zZW5kX2J1ZmZlciAqY3VycmVudF9idWZmZXI7CS8qIGJlaW5nIGZpbGxlZCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZmlsbGVkX3NlbmRfYnVmZmVyczsKLX07Ci0KLWV4dGVybiBpbnQgdWRzbF9pbnN0YW5jZV9zZXR1cChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCB1ZHNsX2luc3RhbmNlX2RhdGEgKmluc3RhbmNlKTsKLWV4dGVybiB2b2lkIHVkc2xfaW5zdGFuY2VfZGlzY29ubmVjdChzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSk7Ci1leHRlcm4gdm9pZCB1ZHNsX2dldF9pbnN0YW5jZShzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSk7Ci1leHRlcm4gdm9pZCB1ZHNsX3B1dF9pbnN0YW5jZShzdHJ1Y3QgdWRzbF9pbnN0YW5jZV9kYXRhICppbnN0YW5jZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxZGIxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYwpAQCAtMCwwICsxLDEyMzAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICB1c2JhdG0uYyAtIEdlbmVyaWMgVVNCIHhEU0wgZHJpdmVyIGNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCBBbGNhdGVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLCBEdW5jYW4gU2FuZHMsIFNvbE5lZ3JvLCBKb3NlcCBDb21hcworICogIENvcHlyaWdodCAoQykgMjAwNCwgRGF2aWQgV29vZGhvdXNlLCBSb21hbiBLYWdhbgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBXcml0dGVuIGJ5IEpvaGFuIFZlcnJlcHQsIER1bmNhbiBTYW5kcyAoZHVuY2FuLnNhbmRzQGZyZWUuZnIpIGFuZCBEYXZpZCBXb29kaG91c2UKKyAqCisgKiAgMS43KzoJLSBTZWUgdGhlIGNoZWNrLWluIGxvZ3MKKyAqCisgKiAgMS42OgktIE5vIGxvbmdlciBvcGVucyBhIGNvbm5lY3Rpb24gaWYgdGhlIGZpcm13YXJlIGlzIG5vdCBsb2FkZWQKKyAqICAJCS0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHNwZWVkdG91Y2ggMzMwCisgKiAgCQktIFJlbW92ZWQgdGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZGV2aWNlcworICogIAkJLSBNb2R1bGUgbm93IGF1dG9sb2FkcyBvbiBkZXZpY2UgcGx1Z2luCisgKiAgCQktIE1lcmdlZCByZWxldmFudCBwYXJ0cyBvZiBzYXJsaWIKKyAqICAJCS0gUmVwbGFjZWQgdGhlIGtlcm5lbCB0aHJlYWQgd2l0aCBhIHRhc2tsZXQKKyAqICAJCS0gTmV3IHBhY2tldCB0cmFuc21pc3Npb24gY29kZQorICogIAkJLSBDaGFuZ2VkIHByb2MgZmlsZSBjb250ZW50cworICogIAkJLSBGaXhlZCBhbGwga25vd24gU01QIHJhY2VzCisgKiAgCQktIE1hbnkgZml4ZXMgYW5kIGNsZWFudXBzCisgKiAgCQktIFZhcmlvdXMgZml4ZXMgYnkgT2xpdmVyIE5ldWt1bSAob2xpdmVyQG5ldWt1bS5uYW1lKQorICoKKyAqICAxLjVBOgktIFZlcnNpb24gZm9yIGluY2x1c2lvbiBpbiAyLjUgc2VyaWVzIGtlcm5lbAorICoJCS0gTW9kaWZpY2F0aW9ucyBieSBSaWNoYXJkIFB1cmRpZSAocnB1cmRpZUBycHN5cy5uZXQpCisgKgkJLSBtYWRlIGNvbXBhdGlibGUgd2l0aCBrZXJuZWwgMi41LjYgb253YXJkcyBieSBjaGFuZ2luZworICoJCXVzYmF0bV91c2Jfc2VuZF9kYXRhX2NvbnRleHQtPnVyYiB0byBhIHBvaW50ZXIgYW5kIGFkZGluZyBjb2RlCisgKgkJdG8gYWxsb2MgYW5kIGZyZWUgaXQKKyAqCQktIHJlbW92ZV93YWl0X3F1ZXVlKCkgYWRkZWQgdG8gdXNiYXRtX2F0bV9wcm9jZXNzcXVldWVfdGhyZWFkKCkKKyAqCisgKiAgMS41OgktIGZpeGVkIG1lbW9yeSBsZWFrIHdoZW4gYXRtc2FyX2RlY29kZV9hYWw1IHJldHVybmVkIE5VTEwuCisgKgkJKHJlcG9ydGVkIGJ5IHN0ZXBoZW4ucm9iaW5zb25AemVuLmNvLnVrKQorICoKKyAqICAxLjQ6CS0gY2hhbmdlZCB0aGUgc3Bpbl9sb2NrKCkgdW5kZXIgaW50ZXJydXB0IHRvIHNwaW5fbG9ja19pcnFzYXZlKCkKKyAqCQktIHVubGluayBhbGwgYWN0aXZlIHNlbmQgdXJicyBvZiBhIHZjYyB0aGF0IGlzIGJlaW5nIGNsb3NlZC4KKyAqCisgKiAgMS4zLjE6CS0gYWRkZWQgdGhlIHZlcnNpb24gbnVtYmVyCisgKgorICogIDEuMzoJLSBBZGRlZCBtdWx0aXBsZSBzZW5kIHVyYiBzdXBwb3J0CisgKgkJLSBmaXhlZCBtZW1vcnkgbGVhayBhbmQgdmNjLT50eF9pbnVzZSBzdGFydmF0aW9uIGJ1ZworICoJCSAgd2hlbiBub3QgZW5vdWdoIG1lbW9yeSBsZWZ0IGluIHZjYy4KKyAqCisgKiAgMS4yOgktIEZpeGVkIHJhY2UgY29uZGl0aW9uIGluIHVzYmF0bV91c2Jfc2VuZF9kYXRhKCkKKyAqICAxLjE6CS0gVHVybmVkIG9mZiBwYWNrZXQgZGVidWdnaW5nCisgKgorICovCisKKyNpbmNsdWRlICJ1c2JhdG0uaCIKKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2lmZGVmIFZFUkJPU0VfREVCVUcKK3N0YXRpYyBpbnQgdXNiYXRtX3ByaW50X3BhY2tldChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKKyNkZWZpbmUgUEFDS0VUREVCVUcoYXJnLi4uKQl1c2JhdG1fcHJpbnRfcGFja2V0IChhcmcpCisjZGVmaW5lIHZkYmcoYXJnLi4uKQkJZGJnIChhcmcpCisjZWxzZQorI2RlZmluZSBQQUNLRVRERUJVRyhhcmcuLi4pCisjZGVmaW5lIHZkYmcoYXJnLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiSm9oYW4gVmVycmVwdCwgRHVuY2FuIFNhbmRzIDxkdW5jYW4uc2FuZHNAZnJlZS5mcj4iCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIxLjkiCisjZGVmaW5lIERSSVZFUl9ERVNDCSJHZW5lcmljIFVTQiBBVE0vRFNMIEkvTywgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OCisKK3N0YXRpYyBjb25zdCBjaGFyIHVzYmF0bV9kcml2ZXJfbmFtZVtdID0gInVzYmF0bSI7CisKKyNkZWZpbmUgVURTTF9NQVhfUkNWX1VSQlMJCTE2CisjZGVmaW5lIFVEU0xfTUFYX1NORF9VUkJTCQkxNgorI2RlZmluZSBVRFNMX01BWF9SQ1ZfQlVGX1NJWkUJCTEwMjQJLyogQVRNIGNlbGxzICovCisjZGVmaW5lIFVEU0xfTUFYX1NORF9CVUZfU0laRQkJMTAyNAkvKiBBVE0gY2VsbHMgKi8KKyNkZWZpbmUgVURTTF9ERUZBVUxUX1JDVl9VUkJTCQk0CisjZGVmaW5lIFVEU0xfREVGQVVMVF9TTkRfVVJCUwkJNAorI2RlZmluZSBVRFNMX0RFRkFVTFRfUkNWX0JVRl9TSVpFCTY0CS8qIEFUTSBjZWxscyAqLworI2RlZmluZSBVRFNMX0RFRkFVTFRfU05EX0JVRl9TSVpFCTY0CS8qIEFUTSBjZWxscyAqLworCisjZGVmaW5lIEFUTV9DRUxMX0hFQURFUgkJCShBVE1fQ0VMTF9TSVpFIC0gQVRNX0NFTExfUEFZTE9BRCkKKworI2RlZmluZSBUSFJPVFRMRV9NU0VDUwkJCTEwMAkvKiBkZWxheSB0byByZWNvdmVyIHByb2Nlc3NpbmcgYWZ0ZXIgdXJiIHN1Ym1pc3Npb24gZmFpbHMgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBudW1fcmN2X3VyYnMgPSBVRFNMX0RFRkFVTFRfUkNWX1VSQlM7CitzdGF0aWMgdW5zaWduZWQgaW50IG51bV9zbmRfdXJicyA9IFVEU0xfREVGQVVMVF9TTkRfVVJCUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmN2X2J1Zl9zaXplID0gVURTTF9ERUZBVUxUX1JDVl9CVUZfU0laRTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2J1Zl9zaXplID0gVURTTF9ERUZBVUxUX1NORF9CVUZfU0laRTsKKworbW9kdWxlX3BhcmFtKG51bV9yY3ZfdXJicywgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG51bV9yY3ZfdXJicywKKwkJICJOdW1iZXIgb2YgdXJicyB1c2VkIGZvciByZWNlcHRpb24gKHJhbmdlOiAwLSIKKwkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9SQ1ZfVVJCUykgIiwgZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9SQ1ZfVVJCUykgIikiKTsKKworbW9kdWxlX3BhcmFtKG51bV9zbmRfdXJicywgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG51bV9zbmRfdXJicywKKwkJICJOdW1iZXIgb2YgdXJicyB1c2VkIGZvciB0cmFuc21pc3Npb24gKHJhbmdlOiAwLSIKKwkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9TTkRfVVJCUykgIiwgZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9TTkRfVVJCUykgIikiKTsKKworbW9kdWxlX3BhcmFtKHJjdl9idWZfc2l6ZSwgdWludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJjdl9idWZfc2l6ZSwKKwkJICJTaXplIG9mIHRoZSBidWZmZXJzIHVzZWQgZm9yIHJlY2VwdGlvbiBpbiBBVE0gY2VsbHMgKHJhbmdlOiAxLSIKKwkJIF9fTU9EVUxFX1NUUklORyhVRFNMX01BWF9SQ1ZfQlVGX1NJWkUpICIsIGRlZmF1bHQ6ICIKKwkJIF9fTU9EVUxFX1NUUklORyhVRFNMX0RFRkFVTFRfUkNWX0JVRl9TSVpFKSAiKSIpOworCittb2R1bGVfcGFyYW0oc25kX2J1Zl9zaXplLCB1aW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0Moc25kX2J1Zl9zaXplLAorCQkgIlNpemUgb2YgdGhlIGJ1ZmZlcnMgdXNlZCBmb3IgdHJhbnNtaXNzaW9uIGluIEFUTSBjZWxscyAocmFuZ2U6IDEtIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfTUFYX1NORF9CVUZfU0laRSkgIiwgZGVmYXVsdDogIgorCQkgX19NT0RVTEVfU1RSSU5HKFVEU0xfREVGQVVMVF9TTkRfQlVGX1NJWkUpICIpIik7CisKKworLyogcmVjZWl2ZSAqLworCitzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhIHsKKwkvKiB2cGkvdmNpIGxvb2t1cCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzaG9ydCB2cGk7CisJaW50IHZjaTsKKwlzdHJ1Y3QgYXRtX3ZjYyAqdmNjOworCisJLyogcmF3IGNlbGwgcmVhc3NlbWJseSAqLworCXN0cnVjdCBza19idWZmICpzYXJiOworfTsKKworCisvKiBzZW5kICovCisKK3N0cnVjdCB1c2JhdG1fY29udHJvbCB7CisJc3RydWN0IGF0bV9za2JfZGF0YSBhdG07CisJdTMyIGxlbjsKKwl1MzIgY3JjOworfTsKKworI2RlZmluZSBVRFNMX1NLQih4KQkJKChzdHJ1Y3QgdXNiYXRtX2NvbnRyb2wgKikoeCktPmNiKQorCisKKy8qIEFUTSAqLworCitzdGF0aWMgdm9pZCB1c2JhdG1fYXRtX2Rldl9jbG9zZShzdHJ1Y3QgYXRtX2RldiAqZGV2KTsKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9vcGVuKHN0cnVjdCBhdG1fdmNjICp2Y2MpOworc3RhdGljIHZvaWQgdXNiYXRtX2F0bV9jbG9zZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjKTsKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9pb2N0bChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZyk7CitzdGF0aWMgaW50IHVzYmF0bV9hdG1fc2VuZChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9wcm9jX3JlYWQoc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYsIGxvZmZfdCAqIHBvcywgY2hhciAqcGFnZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXRtZGV2X29wcyB1c2JhdG1fYXRtX2Rldm9wcyA9IHsKKwkuZGV2X2Nsb3NlCT0gdXNiYXRtX2F0bV9kZXZfY2xvc2UsCisJLm9wZW4JCT0gdXNiYXRtX2F0bV9vcGVuLAorCS5jbG9zZQkJPSB1c2JhdG1fYXRtX2Nsb3NlLAorCS5pb2N0bAkJPSB1c2JhdG1fYXRtX2lvY3RsLAorCS5zZW5kCQk9IHVzYmF0bV9hdG1fc2VuZCwKKwkucHJvY19yZWFkCT0gdXNiYXRtX2F0bV9wcm9jX3JlYWQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworCisvKioqKioqKioqKioKKyoqICBtaXNjICAqKgorKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHVzYmF0bV9wZHVfbGVuZ3RoKHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJbGVuZ3RoICs9IEFUTV9DRUxMX1BBWUxPQUQgLSAxICsgQVRNX0FBTDVfVFJBSUxFUjsKKwlyZXR1cm4gbGVuZ3RoIC0gbGVuZ3RoICUgQVRNX0NFTExfUEFZTE9BRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVzYmF0bV9wb3Aoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAodmNjLT5wb3ApCisJCXZjYy0+cG9wKHZjYywgc2tiKTsKKwllbHNlCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKK30KKworCisvKioqKioqKioqKioKKyoqICB1cmJzICAqKgorKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1cmIgKnVzYmF0bV9wb3BfdXJiKHN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgdXJiICp1cmI7CisKKwlzcGluX2xvY2tfaXJxKCZjaGFubmVsLT5sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmY2hhbm5lbC0+bGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdXJiID0gbGlzdF9lbnRyeShjaGFubmVsLT5saXN0Lm5leHQsIHN0cnVjdCB1cmIsIHVyYl9saXN0KTsKKwlsaXN0X2RlbCgmdXJiLT51cmJfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5sb2NrKTsKKworCXJldHVybiB1cmI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVzYmF0bV9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwgPSB1cmItPmNvbnRleHQ7CisJaW50IHJldDsKKworCXZkYmcoIiVzOiBzdWJtaXR0aW5nIHVyYiAweCVwLCBzaXplICV1IiwKKwkgICAgIF9fZnVuY19fLCB1cmIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXQpIHsKKwkJYXRtX2RiZyhjaGFubmVsLT51c2JhdG0sICIlczogdXJiIDB4JXAgc3VibWlzc2lvbiBmYWlsZWQgKCVkKSFcbiIsCisJCQlfX2Z1bmNfXywgdXJiLCByZXQpOworCisJCS8qIGNvbnNpZGVyIGFsbCBlcnJvcnMgdHJhbnNpZW50IGFuZCByZXR1cm4gdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBxdWV1ZSAqLworCQl1cmItPnN0YXR1cyA9IC1FQUdBSU47CisJCXNwaW5fbG9ja19pcnEoJmNoYW5uZWwtPmxvY2spOworCisJCS8qIG11c3QgYWRkIHRvIHRoZSBmcm9udCB3aGVuIHNlbmRpbmc7IGRvZXNuJ3QgbWF0dGVyIHdoZW4gcmVjZWl2aW5nICovCisJCWxpc3RfYWRkKCZ1cmItPnVyYl9saXN0LCAmY2hhbm5lbC0+bGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxKCZjaGFubmVsLT5sb2NrKTsKKworCQkvKiBtYWtlIHN1cmUgdGhlIGNoYW5uZWwgZG9lc24ndCBzdGFsbCAqLworCQltb2RfdGltZXIoJmNoYW5uZWwtPmRlbGF5LCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUSFJPVFRMRV9NU0VDUykpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmF0bV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2JhdG1fY2hhbm5lbCAqY2hhbm5lbCA9IHVyYi0+Y29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdmRiZygiJXM6IHVyYiAweCVwLCBzdGF0dXMgJWQsIGFjdHVhbF9sZW5ndGggJWQiLAorCSAgICAgX19mdW5jX18sIHVyYiwgdXJiLT5zdGF0dXMsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwkvKiB1c3VhbGx5IGluX2ludGVycnVwdCgpLCBidXQgbm90IGFsd2F5cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBtdXN0IGFkZCB0byB0aGUgYmFjayB3aGVuIHJlY2VpdmluZzsgZG9lc24ndCBtYXR0ZXIgd2hlbiBzZW5kaW5nICovCisJbGlzdF9hZGRfdGFpbCgmdXJiLT51cmJfbGlzdCwgJmNoYW5uZWwtPmxpc3QpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzKSkKKwkJLyogdGhyb3R0bGUgcHJvY2Vzc2luZyBpbiBjYXNlIG9mIGFuIGVycm9yICovCisJCW1vZF90aW1lcigmY2hhbm5lbC0+ZGVsYXksIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRIUk9UVExFX01TRUNTKSk7CisJZWxzZQorCQl0YXNrbGV0X3NjaGVkdWxlKCZjaGFubmVsLT50YXNrbGV0KTsKK30KKworCisvKioqKioqKioqKioqKgorKiogIGRlY29kZSAgKioKKyoqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYmF0bV92Y2NfZGF0YSAqdXNiYXRtX2ZpbmRfdmNjKHN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UsCisJCQkJCQkgIHNob3J0IHZwaSwgaW50IHZjaSkKK3sKKwlzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhICp2Y2M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZjYywgJmluc3RhbmNlLT52Y2NfbGlzdCwgbGlzdCkKKwkJaWYgKCh2Y2MtPnZjaSA9PSB2Y2kpICYmICh2Y2MtPnZwaSA9PSB2cGkpKQorCQkJcmV0dXJuIHZjYzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdXNiYXRtX2V4dHJhY3RfY2VsbHMoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpzb3VyY2UsIHVuc2lnbmVkIGludCBhdmFpbF9kYXRhKQoreworCXN0cnVjdCB1c2JhdG1fdmNjX2RhdGEgKmNhY2hlZF92Y2MgPSBOVUxMOworCXN0cnVjdCBhdG1fdmNjICp2Y2M7CisJc3RydWN0IHNrX2J1ZmYgKnNhcmI7CisJdW5zaWduZWQgaW50IHN0cmlkZSA9IGluc3RhbmNlLT5yeF9jaGFubmVsLnN0cmlkZTsKKwlpbnQgdmNpLCBjYWNoZWRfdmNpID0gMDsKKwlzaG9ydCB2cGksIGNhY2hlZF92cGkgPSAwOworCXU4IHB0aTsKKworCWZvciAoOyBhdmFpbF9kYXRhID49IHN0cmlkZTsgYXZhaWxfZGF0YSAtPSBzdHJpZGUsIHNvdXJjZSArPSBzdHJpZGUpIHsKKwkJdnBpID0gKChzb3VyY2VbMF0gJiAweDBmKSA8PCA0KSAgfCAoc291cmNlWzFdID4+IDQpOworCQl2Y2kgPSAoKHNvdXJjZVsxXSAmIDB4MGYpIDw8IDEyKSB8IChzb3VyY2VbMl0gPDwgNCkgfCAoc291cmNlWzNdID4+IDQpOworCQlwdGkgPSAoKHNvdXJjZVszXSAmIDB4ZSkgPj4gMSk7CisKKwkJdmRiZygiJXM6IHZwaSAlaGQsIHZjaSAlZCwgcHRpICVkIiwgX19mdW5jX18sIHZwaSwgdmNpLCBwdGkpOworCisJCWlmICgodmNpICE9IGNhY2hlZF92Y2kpIHx8ICh2cGkgIT0gY2FjaGVkX3ZwaSkpIHsKKwkJCWNhY2hlZF92cGkgPSB2cGk7CisJCQljYWNoZWRfdmNpID0gdmNpOworCisJCQljYWNoZWRfdmNjID0gdXNiYXRtX2ZpbmRfdmNjKGluc3RhbmNlLCB2cGksIHZjaSk7CisKKwkJCWlmICghY2FjaGVkX3ZjYykKKwkJCQlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHVua25vd24gdnBpL3ZjaSAoJWhkLyVkKSFcbiIsIF9fZnVuY19fLCB2cGksIHZjaSk7CisJCX0KKworCQlpZiAoIWNhY2hlZF92Y2MpCisJCQljb250aW51ZTsKKworCQl2Y2MgPSBjYWNoZWRfdmNjLT52Y2M7CisKKwkJLyogT0FNIEY1IGVuZC10by1lbmQgKi8KKwkJaWYgKHB0aSA9PSBBVE1fUFRJX0UyRUY1KSB7CisJCQlhdG1fd2FybihpbnN0YW5jZSwgIiVzOiBPQU0gbm90IHN1cHBvcnRlZCAodnBpICVkLCB2Y2kgJWQpIVxuIiwgX19mdW5jX18sIHZwaSwgdmNpKTsKKwkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Vycik7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNhcmIgPSBjYWNoZWRfdmNjLT5zYXJiOworCisJCWlmIChzYXJiLT50YWlsICsgQVRNX0NFTExfUEFZTE9BRCA+IHNhcmItPmVuZCkgeworCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBidWZmZXIgb3ZlcnJ1biAoc2FyYi0+bGVuICV1LCB2Y2M6IDB4JXApIVxuIiwKKwkJCQkJX19mdW5jX18sIHNhcmItPmxlbiwgdmNjKTsKKwkJCS8qIGRpc2NhcmQgY2VsbHMgYWxyZWFkeSByZWNlaXZlZCAqLworCQkJc2tiX3RyaW0oc2FyYiwgMCk7CisJCQlVRFNMX0FTU0VSVChzYXJiLT50YWlsICsgQVRNX0NFTExfUEFZTE9BRCA8PSBzYXJiLT5lbmQpOworCQl9CisKKwkJbWVtY3B5KHNhcmItPnRhaWwsIHNvdXJjZSArIEFUTV9DRUxMX0hFQURFUiwgQVRNX0NFTExfUEFZTE9BRCk7CisJCV9fc2tiX3B1dChzYXJiLCBBVE1fQ0VMTF9QQVlMT0FEKTsKKworCQlpZiAocHRpICYgMSkgeworCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJCXVuc2lnbmVkIGludCBsZW5ndGg7CisJCQl1bnNpZ25lZCBpbnQgcGR1X2xlbmd0aDsKKworCQkJbGVuZ3RoID0gKHNvdXJjZVtBVE1fQ0VMTF9TSVpFIC0gNl0gPDwgOCkgKyBzb3VyY2VbQVRNX0NFTExfU0laRSAtIDVdOworCisJCQkvKiBndWFyZCBhZ2FpbnN0IG92ZXJmbG93ICovCisJCQlpZiAobGVuZ3RoID4gQVRNX01BWF9BQUw1X1BEVSkgeworCQkJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogYm9ndXMgbGVuZ3RoICV1ICh2Y2M6IDB4JXApIVxuIiwKKwkJCQkJCV9fZnVuY19fLCBsZW5ndGgsIHZjYyk7CisJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcGR1X2xlbmd0aCA9IHVzYmF0bV9wZHVfbGVuZ3RoKGxlbmd0aCk7CisKKwkJCWlmIChzYXJiLT5sZW4gPCBwZHVfbGVuZ3RoKSB7CisJCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBib2d1cyBwZHVfbGVuZ3RoICV1IChzYXJiLT5sZW46ICV1LCB2Y2M6IDB4JXApIVxuIiwKKwkJCQkJCV9fZnVuY19fLCBwZHVfbGVuZ3RoLCBzYXJiLT5sZW4sIHZjYyk7CisJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJaWYgKGNyYzMyX2JlKH4wLCBzYXJiLT50YWlsIC0gcGR1X2xlbmd0aCwgcGR1X2xlbmd0aCkgIT0gMHhjNzA0ZGQ3YikgeworCQkJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogcGFja2V0IGZhaWxlZCBjcmMgY2hlY2sgKHZjYzogMHglcCkhXG4iLAorCQkJCQkJX19mdW5jX18sIHZjYyk7CisJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJdmRiZygiJXM6IGdvdCBwYWNrZXQgKGxlbmd0aDogJXUsIHBkdV9sZW5ndGg6ICV1LCB2Y2M6IDB4JXApIiwgX19mdW5jX18sIGxlbmd0aCwgcGR1X2xlbmd0aCwgdmNjKTsKKworCQkJaWYgKCEoc2tiID0gZGV2X2FsbG9jX3NrYihsZW5ndGgpKSkgeworCQkJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogbm8gbWVtb3J5IGZvciBza2IgKGxlbmd0aDogJXUpIVxuIiwgX19mdW5jX18sIGxlbmd0aCk7CisJCQkJYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZHJvcCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXZkYmcoIiVzOiBhbGxvY2F0ZWQgbmV3IHNrX2J1ZmYgKHNrYjogMHglcCwgc2tiLT50cnVlc2l6ZTogJXUpIiwgX19mdW5jX18sIHNrYiwgc2tiLT50cnVlc2l6ZSk7CisKKwkJCWlmICghYXRtX2NoYXJnZSh2Y2MsIHNrYi0+dHJ1ZXNpemUpKSB7CisJCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBmYWlsZWQgYXRtX2NoYXJnZSAoc2tiLT50cnVlc2l6ZTogJXUpIVxuIiwgX19mdW5jX18sIHNrYi0+dHJ1ZXNpemUpOworCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCQlnb3RvIG91dDsJLyogYXRtX2NoYXJnZSBpbmNyZW1lbnRzIHJ4X2Ryb3AgKi8KKwkJCX0KKworCQkJbWVtY3B5KHNrYi0+ZGF0YSwgc2FyYi0+dGFpbCAtIHBkdV9sZW5ndGgsIGxlbmd0aCk7CisJCQlfX3NrYl9wdXQoc2tiLCBsZW5ndGgpOworCisJCQl2ZGJnKCIlczogc2VuZGluZyBza2IgMHglcCwgc2tiLT5sZW4gJXUsIHNrYi0+dHJ1ZXNpemUgJXUiLAorCQkJICAgICBfX2Z1bmNfXywgc2tiLCBza2ItPmxlbiwgc2tiLT50cnVlc2l6ZSk7CisKKwkJCVBBQ0tFVERFQlVHKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJCQl2Y2MtPnB1c2godmNjLCBza2IpOworCisJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeCk7CisJCW91dDoKKwkJCXNrYl90cmltKHNhcmIsIDApOworCQl9CisJfQorfQorCisKKy8qKioqKioqKioqKioqCisqKiAgZW5jb2RlICAqKgorKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGludCB1c2JhdG1fd3JpdGVfY2VsbHMoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgICAgdTggKnRhcmdldCwgdW5zaWduZWQgaW50IGF2YWlsX3NwYWNlKQoreworCXN0cnVjdCB1c2JhdG1fY29udHJvbCAqY3RybCA9IFVEU0xfU0tCKHNrYik7CisJc3RydWN0IGF0bV92Y2MgKnZjYyA9IGN0cmwtPmF0bS52Y2M7CisJdW5zaWduZWQgaW50IG51bV93cml0dGVuOworCXVuc2lnbmVkIGludCBzdHJpZGUgPSBpbnN0YW5jZS0+dHhfY2hhbm5lbC5zdHJpZGU7CisKKwl2ZGJnKCIlczogc2tiLT5sZW49JWQsIGF2YWlsX3NwYWNlPSV1IiwgX19mdW5jX18sIHNrYi0+bGVuLCBhdmFpbF9zcGFjZSk7CisJVURTTF9BU1NFUlQoIShhdmFpbF9zcGFjZSAlIHN0cmlkZSkpOworCisJZm9yIChudW1fd3JpdHRlbiA9IDA7IG51bV93cml0dGVuIDwgYXZhaWxfc3BhY2UgJiYgY3RybC0+bGVuOworCSAgICAgbnVtX3dyaXR0ZW4gKz0gc3RyaWRlLCB0YXJnZXQgKz0gc3RyaWRlKSB7CisJCXVuc2lnbmVkIGludCBkYXRhX2xlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIEFUTV9DRUxMX1BBWUxPQUQpOworCQl1bnNpZ25lZCBpbnQgbGVmdCA9IEFUTV9DRUxMX1BBWUxPQUQgLSBkYXRhX2xlbjsKKwkJdTggKnB0ciA9IHRhcmdldDsKKworCQlwdHJbMF0gPSB2Y2MtPnZwaSA+PiA0OworCQlwdHJbMV0gPSAodmNjLT52cGkgPDwgNCkgfCAodmNjLT52Y2kgPj4gMTIpOworCQlwdHJbMl0gPSB2Y2MtPnZjaSA+PiA0OworCQlwdHJbM10gPSB2Y2MtPnZjaSA8PCA0OworCQlwdHJbNF0gPSAweGVjOworCQlwdHIgKz0gQVRNX0NFTExfSEVBREVSOworCisJCW1lbWNweShwdHIsIHNrYi0+ZGF0YSwgZGF0YV9sZW4pOworCQlwdHIgKz0gZGF0YV9sZW47CisJCV9fc2tiX3B1bGwoc2tiLCBkYXRhX2xlbik7CisKKwkJaWYoIWxlZnQpCisJCQljb250aW51ZTsKKworCQltZW1zZXQocHRyLCAwLCBsZWZ0KTsKKworCQlpZiAobGVmdCA+PSBBVE1fQUFMNV9UUkFJTEVSKSB7CS8qIHRyYWlsZXIgd2lsbCBnbyBpbiB0aGlzIGNlbGwgKi8KKwkJCXU4ICp0cmFpbGVyID0gdGFyZ2V0ICsgQVRNX0NFTExfU0laRSAtIEFUTV9BQUw1X1RSQUlMRVI7CisJCQkvKiB0cmFpbGVyWzBdID0gMDsJCVVVID0gMCAqLworCQkJLyogdHJhaWxlclsxXSA9IDA7CQlDUEkgPSAwICovCisJCQl0cmFpbGVyWzJdID0gY3RybC0+bGVuID4+IDg7CisJCQl0cmFpbGVyWzNdID0gY3RybC0+bGVuOworCisJCQljdHJsLT5jcmMgPSB+IGNyYzMyX2JlKGN0cmwtPmNyYywgcHRyLCBsZWZ0IC0gNCk7CisKKwkJCXRyYWlsZXJbNF0gPSBjdHJsLT5jcmMgPj4gMjQ7CisJCQl0cmFpbGVyWzVdID0gY3RybC0+Y3JjID4+IDE2OworCQkJdHJhaWxlcls2XSA9IGN0cmwtPmNyYyA+PiA4OworCQkJdHJhaWxlcls3XSA9IGN0cmwtPmNyYzsKKworCQkJdGFyZ2V0WzNdIHw9IDB4MjsJLyogYWRqdXN0IFBUSSAqLworCisJCQljdHJsLT5sZW4gPSAwOwkJLyogdGFnIHRoaXMgc2tiIGZpbmlzaGVkICovCisJCX0KKwkJZWxzZQorCQkJY3RybC0+Y3JjID0gY3JjMzJfYmUoY3RybC0+Y3JjLCBwdHIsIGxlZnQpOworCX0KKworCXJldHVybiBudW1fd3JpdHRlbjsKK30KKworCisvKioqKioqKioqKioqKioKKyoqICByZWNlaXZlICAqKgorKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHVzYmF0bV9yeF9wcm9jZXNzKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gKHN0cnVjdCB1c2JhdG1fZGF0YSAqKWRhdGE7CisJc3RydWN0IHVyYiAqdXJiOworCisJd2hpbGUgKCh1cmIgPSB1c2JhdG1fcG9wX3VyYigmaW5zdGFuY2UtPnJ4X2NoYW5uZWwpKSkgeworCQl2ZGJnKCIlczogcHJvY2Vzc2luZyB1cmIgMHglcCIsIF9fZnVuY19fLCB1cmIpOworCisJCWlmICh1c2JfcGlwZWlzb2ModXJiLT5waXBlKSkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKQorCQkJCWlmICghdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMpCisJCQkJCXVzYmF0bV9leHRyYWN0X2NlbGxzKGluc3RhbmNlLAorCQkJCQkJCSAgICAgKHU4ICopdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldCwKKwkJCQkJCQkgICAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aCk7CisJCX0KKwkJZWxzZQorCQkJaWYgKCF1cmItPnN0YXR1cykKKwkJCQl1c2JhdG1fZXh0cmFjdF9jZWxscyhpbnN0YW5jZSwgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisKKwkJaWYgKHVzYmF0bV9zdWJtaXRfdXJiKHVyYikpCisJCQlyZXR1cm47CisJfQorfQorCisKKy8qKioqKioqKioqKgorKiogIHNlbmQgICoqCisqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdXNiYXRtX3R4X3Byb2Nlc3ModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSAoc3RydWN0IHVzYmF0bV9kYXRhICopZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaW5zdGFuY2UtPmN1cnJlbnRfc2tiOworCXN0cnVjdCB1cmIgKnVyYiA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgaW50IGJ1Zl9zaXplID0gaW5zdGFuY2UtPnR4X2NoYW5uZWwuYnVmX3NpemU7CisJdW5zaWduZWQgaW50IG51bV93cml0dGVuID0gMDsKKwl1OCAqYnVmZmVyID0gTlVMTDsKKworCWlmICghc2tiKQorCQlza2IgPSBza2JfZGVxdWV1ZSgmaW5zdGFuY2UtPnNuZHF1ZXVlKTsKKworCXdoaWxlIChza2IpIHsKKwkJaWYgKCF1cmIpIHsKKwkJCXVyYiA9IHVzYmF0bV9wb3BfdXJiKCZpbnN0YW5jZS0+dHhfY2hhbm5lbCk7CisJCQlpZiAoIXVyYikKKwkJCQlicmVhazsJCS8qIG5vIG1vcmUgc2VuZGVycyAqLworCQkJYnVmZmVyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCQludW1fd3JpdHRlbiA9ICh1cmItPnN0YXR1cyA9PSAtRUFHQUlOKSA/CisJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIDogMDsKKwkJfQorCisJCW51bV93cml0dGVuICs9IHVzYmF0bV93cml0ZV9jZWxscyhpbnN0YW5jZSwgc2tiLAorCQkJCQkJICBidWZmZXIgKyBudW1fd3JpdHRlbiwKKwkJCQkJCSAgYnVmX3NpemUgLSBudW1fd3JpdHRlbik7CisKKwkJdmRiZygiJXM6IHdyb3RlICV1IGJ5dGVzIGZyb20gc2tiIDB4JXAgdG8gdXJiIDB4JXAiLAorCQkgICAgIF9fZnVuY19fLCBudW1fd3JpdHRlbiwgc2tiLCB1cmIpOworCisJCWlmICghVURTTF9TS0Ioc2tiKS0+bGVuKSB7CisJCQlzdHJ1Y3QgYXRtX3ZjYyAqdmNjID0gVURTTF9TS0Ioc2tiKS0+YXRtLnZjYzsKKworCQkJdXNiYXRtX3BvcCh2Y2MsIHNrYik7CisJCQlhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT50eCk7CisKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZpbnN0YW5jZS0+c25kcXVldWUpOworCQl9CisKKwkJaWYgKG51bV93cml0dGVuID09IGJ1Zl9zaXplIHx8ICghc2tiICYmIG51bV93cml0dGVuKSkgeworCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbnVtX3dyaXR0ZW47CisKKwkJCWlmICh1c2JhdG1fc3VibWl0X3VyYih1cmIpKQorCQkJCWJyZWFrOworCQkJdXJiID0gTlVMTDsKKwkJfQorCX0KKworCWluc3RhbmNlLT5jdXJyZW50X3NrYiA9IHNrYjsKK30KKworc3RhdGljIHZvaWQgdXNiYXRtX2NhbmNlbF9zZW5kKHN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UsCisJCQkgICAgICAgc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbjsKKworCWF0bV9kYmcoaW5zdGFuY2UsICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisJc3Bpbl9sb2NrX2lycSgmaW5zdGFuY2UtPnNuZHF1ZXVlLmxvY2spOworCWZvciAoc2tiID0gaW5zdGFuY2UtPnNuZHF1ZXVlLm5leHQsIG4gPSBza2ItPm5leHQ7CisJICAgICBza2IgIT0gKHN0cnVjdCBza19idWZmICopJmluc3RhbmNlLT5zbmRxdWV1ZTsKKwkgICAgIHNrYiA9IG4sIG4gPSBza2ItPm5leHQpCisJCWlmIChVRFNMX1NLQihza2IpLT5hdG0udmNjID09IHZjYykgeworCQkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBwb3BwaW5nIHNrYiAweCVwXG4iLCBfX2Z1bmNfXywgc2tiKTsKKwkJCV9fc2tiX3VubGluayhza2IsICZpbnN0YW5jZS0+c25kcXVldWUpOworCQkJdXNiYXRtX3BvcCh2Y2MsIHNrYik7CisJCX0KKwlzcGluX3VubG9ja19pcnEoJmluc3RhbmNlLT5zbmRxdWV1ZS5sb2NrKTsKKworCXRhc2tsZXRfZGlzYWJsZSgmaW5zdGFuY2UtPnR4X2NoYW5uZWwudGFza2xldCk7CisJaWYgKChza2IgPSBpbnN0YW5jZS0+Y3VycmVudF9za2IpICYmIChVRFNMX1NLQihza2IpLT5hdG0udmNjID09IHZjYykpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBwb3BwaW5nIGN1cnJlbnQgc2tiICgweCVwKVxuIiwgX19mdW5jX18sIHNrYik7CisJCWluc3RhbmNlLT5jdXJyZW50X3NrYiA9IE5VTEw7CisJCXVzYmF0bV9wb3AodmNjLCBza2IpOworCX0KKwl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnR4X2NoYW5uZWwudGFza2xldCk7CisJYXRtX2RiZyhpbnN0YW5jZSwgIiVzIGRvbmVcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGludCB1c2JhdG1fYXRtX3NlbmQoc3RydWN0IGF0bV92Y2MgKnZjYywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gdmNjLT5kZXYtPmRldl9kYXRhOworCXN0cnVjdCB1c2JhdG1fY29udHJvbCAqY3RybCA9IFVEU0xfU0tCKHNrYik7CisJaW50IGVycjsKKworCXZkYmcoIiVzIGNhbGxlZCAoc2tiIDB4JXAsIGxlbiAldSkiLCBfX2Z1bmNfXywgc2tiLCBza2ItPmxlbik7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRiZygiJXM6IE5VTEwgZGF0YSEiLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAodmNjLT5xb3MuYWFsICE9IEFUTV9BQUw1KSB7CisJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogdW5zdXBwb3J0ZWQgQVRNIHR5cGUgJWQhXG4iLCBfX2Z1bmNfXywgdmNjLT5xb3MuYWFsKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChza2ItPmxlbiA+IEFUTV9NQVhfQUFMNV9QRFUpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBwYWNrZXQgdG9vIGxvbmcgKCVkIHZzICVkKSFcbiIsCisJCQkJX19mdW5jX18sIHNrYi0+bGVuLCBBVE1fTUFYX0FBTDVfUERVKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCVBBQ0tFVERFQlVHKHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJLyogaW5pdGlhbGl6ZSB0aGUgY29udHJvbCBibG9jayAqLworCWN0cmwtPmF0bS52Y2MgPSB2Y2M7CisJY3RybC0+bGVuID0gc2tiLT5sZW47CisJY3RybC0+Y3JjID0gY3JjMzJfYmUofjAsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJc2tiX3F1ZXVlX3RhaWwoJmluc3RhbmNlLT5zbmRxdWV1ZSwgc2tiKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZpbnN0YW5jZS0+dHhfY2hhbm5lbC50YXNrbGV0KTsKKworCXJldHVybiAwOworCisgZmFpbDoKKwl1c2JhdG1fcG9wKHZjYywgc2tiKTsKKwlyZXR1cm4gZXJyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKgorKiogIGJlYW4gY291bnRpbmcgICoqCisqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdXNiYXRtX2Rlc3Ryb3lfaW5zdGFuY2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdXNiYXRtX2RhdGEsIHJlZmNvdW50KTsKKworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CisKKwl0YXNrbGV0X2tpbGwoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQpOworCXRhc2tsZXRfa2lsbCgmaW5zdGFuY2UtPnR4X2NoYW5uZWwudGFza2xldCk7CisJdXNiX3B1dF9kZXYoaW5zdGFuY2UtPnVzYl9kZXYpOworCWtmcmVlKGluc3RhbmNlKTsKK30KKwordm9pZCB1c2JhdG1fZ2V0X2luc3RhbmNlKHN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UpCit7CisJZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCWtyZWZfZ2V0KCZpbnN0YW5jZS0+cmVmY291bnQpOworfQorCit2b2lkIHVzYmF0bV9wdXRfaW5zdGFuY2Uoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSkKK3sKKwlkYmcoIiVzIiwgX19mdW5jX18pOworCisJa3JlZl9wdXQoJmluc3RhbmNlLT5yZWZjb3VudCwgdXNiYXRtX2Rlc3Ryb3lfaW5zdGFuY2UpOworfQorCisKKy8qKioqKioqKioqCisqKiAgQVRNICAqKgorKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdXNiYXRtX2F0bV9kZXZfY2xvc2Uoc3RydWN0IGF0bV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gZGV2LT5kZXZfZGF0YTsKKworCWRiZygiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWluc3RhbmNlKQorCQlyZXR1cm47CisKKwlkZXYtPmRldl9kYXRhID0gTlVMTDsKKwl1c2JhdG1fcHV0X2luc3RhbmNlKGluc3RhbmNlKTsJLyogdGFrZW4gaW4gdXNiYXRtX2F0bV9pbml0ICovCit9CisKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9wcm9jX3JlYWQoc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYsIGxvZmZfdCAqIHBvcywgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gYXRtX2Rldi0+ZGV2X2RhdGE7CisJaW50IGxlZnQgPSAqcG9zOworCisJaWYgKCFpbnN0YW5jZSkgeworCQlkYmcoIiVzOiBOVUxMIGluc3RhbmNlISIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFsZWZ0LS0pCisJCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlc1xuIiwgaW5zdGFuY2UtPmRlc2NyaXB0aW9uKTsKKworCWlmICghbGVmdC0tKQorCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiTUFDOiAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJCSAgICAgICBhdG1fZGV2LT5lc2lbMF0sIGF0bV9kZXYtPmVzaVsxXSwKKwkJCSAgICAgICBhdG1fZGV2LT5lc2lbMl0sIGF0bV9kZXYtPmVzaVszXSwKKwkJCSAgICAgICBhdG1fZGV2LT5lc2lbNF0sIGF0bV9kZXYtPmVzaVs1XSk7CisKKwlpZiAoIWxlZnQtLSkKKwkJcmV0dXJuIHNwcmludGYocGFnZSwKKwkJCSAgICAgICAiQUFMNTogdHggJWQgKCAlZCBlcnIgKSwgcnggJWQgKCAlZCBlcnIsICVkIGRyb3AgKVxuIiwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS50eCksCisJCQkgICAgICAgYXRvbWljX3JlYWQoJmF0bV9kZXYtPnN0YXRzLmFhbDUudHhfZXJyKSwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS5yeCksCisJCQkgICAgICAgYXRvbWljX3JlYWQoJmF0bV9kZXYtPnN0YXRzLmFhbDUucnhfZXJyKSwKKwkJCSAgICAgICBhdG9taWNfcmVhZCgmYXRtX2Rldi0+c3RhdHMuYWFsNS5yeF9kcm9wKSk7CisKKwlpZiAoIWxlZnQtLSkKKwkJc3dpdGNoIChhdG1fZGV2LT5zaWduYWwpIHsKKwkJY2FzZSBBVE1fUEhZX1NJR19GT1VORDoKKwkJCXJldHVybiBzcHJpbnRmKHBhZ2UsICJMaW5lIHVwXG4iKTsKKwkJY2FzZSBBVE1fUEhZX1NJR19MT1NUOgorCQkJcmV0dXJuIHNwcmludGYocGFnZSwgIkxpbmUgZG93blxuIik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gc3ByaW50ZihwYWdlLCAiTGluZSBzdGF0ZSB1bmtub3duXG4iKTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9vcGVuKHN0cnVjdCBhdG1fdmNjICp2Y2MpCit7CisJc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSA9IHZjYy0+ZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhICpuZXcgPSBOVUxMOworCWludCByZXQ7CisJaW50IHZjaSA9IHZjYy0+dmNpOworCXNob3J0IHZwaSA9IHZjYy0+dnBpOworCisJaWYgKCFpbnN0YW5jZSkgeworCQlkYmcoIiVzOiBOVUxMIGRhdGEhIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IHZwaSAlaGQsIHZjaSAlZFxuIiwgX19mdW5jX18sIHZwaSwgdmNpKTsKKworCS8qIG9ubHkgc3VwcG9ydCBBQUw1ICovCisJaWYgKCh2Y2MtPnFvcy5hYWwgIT0gQVRNX0FBTDUpIHx8ICh2Y2MtPnFvcy5yeHRwLm1heF9zZHUgPCAwKQorCSAgICB8fCAodmNjLT5xb3Mucnh0cC5tYXhfc2R1ID4gQVRNX01BWF9BQUw1X1BEVSkpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiB1bnN1cHBvcnRlZCBBVE0gdHlwZSAlZCFcbiIsIF9fZnVuY19fLCB2Y2MtPnFvcy5hYWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkb3duKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsJLyogdnMgc2VsZiwgdXNiYXRtX2F0bV9jbG9zZSAqLworCisJaWYgKHVzYmF0bV9maW5kX3ZjYyhpbnN0YW5jZSwgdnBpLCB2Y2kpKSB7CisJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogJWhkLyVkIGFscmVhZHkgaW4gdXNlIVxuIiwgX19mdW5jX18sIHZwaSwgdmNpKTsKKwkJcmV0ID0gLUVBRERSSU5VU0U7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIShuZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogbm8gbWVtb3J5IGZvciB2Y2NfZGF0YSFcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCW1lbXNldChuZXcsIDAsIHNpemVvZihzdHJ1Y3QgdXNiYXRtX3ZjY19kYXRhKSk7CisJbmV3LT52Y2MgPSB2Y2M7CisJbmV3LT52cGkgPSB2cGk7CisJbmV3LT52Y2kgPSB2Y2k7CisKKwluZXctPnNhcmIgPSBhbGxvY19za2IodXNiYXRtX3BkdV9sZW5ndGgodmNjLT5xb3Mucnh0cC5tYXhfc2R1KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXctPnNhcmIpIHsKKwkJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBubyBtZW1vcnkgZm9yIFNBUiBidWZmZXIhXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwl2Y2MtPmRldl9kYXRhID0gbmV3OworCisJdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+cnhfY2hhbm5lbC50YXNrbGV0KTsKKwlsaXN0X2FkZCgmbmV3LT5saXN0LCAmaW5zdGFuY2UtPnZjY19saXN0KTsKKwl0YXNrbGV0X2VuYWJsZSgmaW5zdGFuY2UtPnJ4X2NoYW5uZWwudGFza2xldCk7CisKKwlzZXRfYml0KEFUTV9WRl9BRERSLCAmdmNjLT5mbGFncyk7CisJc2V0X2JpdChBVE1fVkZfUEFSVElBTCwgJnZjYy0+ZmxhZ3MpOworCXNldF9iaXQoQVRNX1ZGX1JFQURZLCAmdmNjLT5mbGFncyk7CisKKwl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisKKwlhdG1fZGJnKGluc3RhbmNlLCAiJXM6IGFsbG9jYXRlZCB2Y2MgZGF0YSAweCVwXG4iLCBfX2Z1bmNfXywgbmV3KTsKKworCXJldHVybiAwOworCitmYWlsOgorCWtmcmVlKG5ldyk7CisJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmF0bV9hdG1fY2xvc2Uoc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gdmNjLT5kZXYtPmRldl9kYXRhOworCXN0cnVjdCB1c2JhdG1fdmNjX2RhdGEgKnZjY19kYXRhID0gdmNjLT5kZXZfZGF0YTsKKworCWlmICghaW5zdGFuY2UgfHwgIXZjY19kYXRhKSB7CisJCWRiZygiJXM6IE5VTEwgZGF0YSEiLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlhdG1fZGJnKGluc3RhbmNlLCAiJXMgZW50ZXJlZFxuIiwgX19mdW5jX18pOworCisJYXRtX2RiZyhpbnN0YW5jZSwgIiVzOiBkZWFsbG9jYXRpbmcgdmNjIDB4JXAgd2l0aCB2cGkgJWQgdmNpICVkXG4iLAorCQlfX2Z1bmNfXywgdmNjX2RhdGEsIHZjY19kYXRhLT52cGksIHZjY19kYXRhLT52Y2kpOworCisJdXNiYXRtX2NhbmNlbF9zZW5kKGluc3RhbmNlLCB2Y2MpOworCisJZG93bigmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CS8qIHZzIHNlbGYsIHVzYmF0bV9hdG1fb3BlbiAqLworCisJdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+cnhfY2hhbm5lbC50YXNrbGV0KTsKKwlsaXN0X2RlbCgmdmNjX2RhdGEtPmxpc3QpOworCXRhc2tsZXRfZW5hYmxlKCZpbnN0YW5jZS0+cnhfY2hhbm5lbC50YXNrbGV0KTsKKworCWtmcmVlX3NrYih2Y2NfZGF0YS0+c2FyYik7CisJdmNjX2RhdGEtPnNhcmIgPSBOVUxMOworCisJa2ZyZWUodmNjX2RhdGEpOworCXZjYy0+ZGV2X2RhdGEgPSBOVUxMOworCisJdmNjLT52cGkgPSBBVE1fVlBJX1VOU1BFQzsKKwl2Y2MtPnZjaSA9IEFUTV9WQ0lfVU5TUEVDOworCWNsZWFyX2JpdChBVE1fVkZfUkVBRFksICZ2Y2MtPmZsYWdzKTsKKwljbGVhcl9iaXQoQVRNX1ZGX1BBUlRJQUwsICZ2Y2MtPmZsYWdzKTsKKwljbGVhcl9iaXQoQVRNX1ZGX0FERFIsICZ2Y2MtPmZsYWdzKTsKKworCXVwKCZpbnN0YW5jZS0+c2VyaWFsaXplKTsKKworCWF0bV9kYmcoaW5zdGFuY2UsICIlcyBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyBpbnQgdXNiYXRtX2F0bV9pb2N0bChzdHJ1Y3QgYXRtX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVRNX1FVRVJZTE9PUDoKKwkJcmV0dXJuIHB1dF91c2VyKEFUTV9MTV9OT05FLCAoaW50IF9fdXNlciAqKWFyZykgPyAtRUZBVUxUIDogMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KK30KKworc3RhdGljIGludCB1c2JhdG1fYXRtX2luaXQoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSkKK3sKKwlzdHJ1Y3QgYXRtX2RldiAqYXRtX2RldjsKKwlpbnQgcmV0LCBpOworCisJLyogQVRNIGluaXQgKi8KKwlhdG1fZGV2ID0gYXRtX2Rldl9yZWdpc3RlcihpbnN0YW5jZS0+ZHJpdmVyX25hbWUsICZ1c2JhdG1fYXRtX2Rldm9wcywgLTEsIE5VTEwpOworCWlmICghYXRtX2RldikgeworCQl1c2JfZGJnKGluc3RhbmNlLCAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBBVE0gZGV2aWNlIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaW5zdGFuY2UtPmF0bV9kZXYgPSBhdG1fZGV2OworCisJYXRtX2Rldi0+Y2lfcmFuZ2UudnBpX2JpdHMgPSBBVE1fQ0lfTUFYOworCWF0bV9kZXYtPmNpX3JhbmdlLnZjaV9iaXRzID0gQVRNX0NJX01BWDsKKwlhdG1fZGV2LT5zaWduYWwgPSBBVE1fUEhZX1NJR19VTktOT1dOOworCisJLyogdGVtcCBpbml0IEFUTSBkZXZpY2UsIHNldCB0byAxMjhrYml0ICovCisJYXRtX2Rldi0+bGlua19yYXRlID0gMTI4ICogMTAwMCAvIDQyNDsKKworCWlmIChpbnN0YW5jZS0+ZHJpdmVyLT5hdG1fc3RhcnQgJiYgKChyZXQgPSBpbnN0YW5jZS0+ZHJpdmVyLT5hdG1fc3RhcnQoaW5zdGFuY2UsIGF0bV9kZXYpKSA8IDApKSB7CisJCWF0bV9kYmcoaW5zdGFuY2UsICIlczogYXRtX3N0YXJ0IGZhaWxlZDogJWQhXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHJlYWR5IGZvciBBVE0gY2FsbGJhY2tzICovCisJdXNiYXRtX2dldF9pbnN0YW5jZShpbnN0YW5jZSk7CS8qIGRyb3BwZWQgaW4gdXNiYXRtX2F0bV9kZXZfY2xvc2UgKi8KKwltYigpOworCWF0bV9kZXYtPmRldl9kYXRhID0gaW5zdGFuY2U7CisKKwkvKiBzdWJtaXQgYWxsIHJ4IFVSQnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzOyBpKyspCisJCXVzYmF0bV9zdWJtaXRfdXJiKGluc3RhbmNlLT51cmJzW2ldKTsKKworCXJldHVybiAwOworCisgZmFpbDoKKwlpbnN0YW5jZS0+YXRtX2RldiA9IE5VTEw7CisJc2h1dGRvd25fYXRtX2RldihhdG1fZGV2KTsgLyogdXNiYXRtX2F0bV9kZXZfY2xvc2Ugd2lsbCBldmVudHVhbGx5IGJlIGNhbGxlZCAqLworCXJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioKKyoqICBVU0IgICoqCisqKioqKioqKioqLworCitzdGF0aWMgaW50IHVzYmF0bV9kb19oZWF2eV9pbml0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKmluc3RhbmNlID0gYXJnOworCWludCByZXQ7CisKKwlkYWVtb25pemUoaW5zdGFuY2UtPmRyaXZlci0+ZHJpdmVyX25hbWUpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCWNvbXBsZXRlKCZpbnN0YW5jZS0+dGhyZWFkX3N0YXJ0ZWQpOworCisJcmV0ID0gaW5zdGFuY2UtPmRyaXZlci0+aGVhdnlfaW5pdChpbnN0YW5jZSwgaW5zdGFuY2UtPnVzYl9pbnRmKTsKKworCWlmICghcmV0KQorCQlyZXQgPSB1c2JhdG1fYXRtX2luaXQoaW5zdGFuY2UpOworCisJZG93bigmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisJaW5zdGFuY2UtPnRocmVhZF9waWQgPSAtMTsKKwl1cCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQsIHJldCk7Cit9CisKK3N0YXRpYyBpbnQgdXNiYXRtX2hlYXZ5X2luaXQoc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZSkKK3sKKwlpbnQgcmV0ID0ga2VybmVsX3RocmVhZCh1c2JhdG1fZG9faGVhdnlfaW5pdCwgaW5zdGFuY2UsIENMT05FX0tFUk5FTCk7CisKKwlpZiAocmV0IDwgMCkgeworCQl1c2JfZGJnKGluc3RhbmNlLCAiJXM6IGZhaWxlZCB0byBjcmVhdGUga2VybmVsX3RocmVhZCAoJWQpIVxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZG93bigmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisJaW5zdGFuY2UtPnRocmVhZF9waWQgPSByZXQ7CisJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9zdGFydGVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2JhdG1fdGFza2xldF9zY2hlZHVsZSh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJdGFza2xldF9zY2hlZHVsZSgoc3RydWN0IHRhc2tsZXRfc3RydWN0ICopIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiYXRtX2luaXRfY2hhbm5lbChzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Bpbl9sb2NrX2luaXQoJmNoYW5uZWwtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZjaGFubmVsLT5saXN0KTsKKwljaGFubmVsLT5kZWxheS5mdW5jdGlvbiA9IHVzYmF0bV90YXNrbGV0X3NjaGVkdWxlOworCWNoYW5uZWwtPmRlbGF5LmRhdGEgPSAodW5zaWduZWQgbG9uZykgJmNoYW5uZWwtPnRhc2tsZXQ7CisJaW5pdF90aW1lcigmY2hhbm5lbC0+ZGVsYXkpOworfQorCitpbnQgdXNiYXRtX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLAorCQkgICAgIHN0cnVjdCB1c2JhdG1fZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmludGYtPmRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYmF0bV9kYXRhICppbnN0YW5jZTsKKwljaGFyICpidWY7CisJaW50IGVycm9yID0gLUVOT01FTTsKKwlpbnQgaSwgbGVuZ3RoOworCWludCBuZWVkX2hlYXZ5OworCisJZGV2X2RiZyhkZXYsICIlczogdHJ5aW5nIGRyaXZlciAlcyB3aXRoIHZlbmRvcj0weCV4LCBwcm9kdWN0PTB4JXgsIGlmbnVtICVkXG4iLAorCQkJX19mdW5jX18sIGRyaXZlci0+ZHJpdmVyX25hbWUsCisJCQlsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJCWxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkJCWludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CisKKwkvKiBpbnN0YW5jZSBpbml0ICovCisJaW5zdGFuY2UgPSBrY2FsbG9jKDEsIHNpemVvZigqaW5zdGFuY2UpICsgc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiAobnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnN0YW5jZSkgeworCQlkZXZfZGJnKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHB1YmxpYyBmaWVsZHMgKi8KKworCWluc3RhbmNlLT5kcml2ZXIgPSBkcml2ZXI7CisJc25wcmludGYoaW5zdGFuY2UtPmRyaXZlcl9uYW1lLCBzaXplb2YoaW5zdGFuY2UtPmRyaXZlcl9uYW1lKSwgZHJpdmVyLT5kcml2ZXJfbmFtZSk7CisKKwlpbnN0YW5jZS0+dXNiX2RldiA9IHVzYl9kZXY7CisJaW5zdGFuY2UtPnVzYl9pbnRmID0gaW50ZjsKKworCWJ1ZiA9IGluc3RhbmNlLT5kZXNjcmlwdGlvbjsKKwlsZW5ndGggPSBzaXplb2YoaW5zdGFuY2UtPmRlc2NyaXB0aW9uKTsKKworCWlmICgoaSA9IHVzYl9zdHJpbmcodXNiX2RldiwgdXNiX2Rldi0+ZGVzY3JpcHRvci5pUHJvZHVjdCwgYnVmLCBsZW5ndGgpKSA8IDApCisJCWdvdG8gYmluZDsKKworCWJ1ZiArPSBpOworCWxlbmd0aCAtPSBpOworCisJaSA9IHNjbnByaW50ZihidWYsIGxlbmd0aCwgIiAoIik7CisJYnVmICs9IGk7CisJbGVuZ3RoIC09IGk7CisKKwlpZiAobGVuZ3RoIDw9IDAgfHwgKGkgPSB1c2JfbWFrZV9wYXRoKHVzYl9kZXYsIGJ1ZiwgbGVuZ3RoKSkgPCAwKQorCQlnb3RvIGJpbmQ7CisKKwlidWYgKz0gaTsKKwlsZW5ndGggLT0gaTsKKworCXNucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiKSIpOworCisgYmluZDoKKwluZWVkX2hlYXZ5ID0gMTsKKwlpZiAoZHJpdmVyLT5iaW5kICYmIChlcnJvciA9IGRyaXZlci0+YmluZChpbnN0YW5jZSwgaW50ZiwgaWQsICZuZWVkX2hlYXZ5KSkgPCAwKSB7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBiaW5kIGZhaWxlZDogJWQhXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworCQkJZ290byBmYWlsX2ZyZWU7CisJfQorCisJLyogcHJpdmF0ZSBmaWVsZHMgKi8KKworCWtyZWZfaW5pdCgmaW5zdGFuY2UtPnJlZmNvdW50KTsJCS8qIGRyb3BwZWQgaW4gdXNiYXRtX3VzYl9kaXNjb25uZWN0ICovCisJaW5pdF9NVVRFWCgmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisKKwlpbnN0YW5jZS0+dGhyZWFkX3BpZCA9IC0xOworCWluaXRfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9zdGFydGVkKTsKKwlpbml0X2NvbXBsZXRpb24oJmluc3RhbmNlLT50aHJlYWRfZXhpdGVkKTsKKworCUlOSVRfTElTVF9IRUFEKCZpbnN0YW5jZS0+dmNjX2xpc3QpOworCisJdXNiYXRtX2luaXRfY2hhbm5lbCgmaW5zdGFuY2UtPnJ4X2NoYW5uZWwpOworCXVzYmF0bV9pbml0X2NoYW5uZWwoJmluc3RhbmNlLT50eF9jaGFubmVsKTsKKwl0YXNrbGV0X2luaXQoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQsIHVzYmF0bV9yeF9wcm9jZXNzLCAodW5zaWduZWQgbG9uZylpbnN0YW5jZSk7CisJdGFza2xldF9pbml0KCZpbnN0YW5jZS0+dHhfY2hhbm5lbC50YXNrbGV0LCB1c2JhdG1fdHhfcHJvY2VzcywgKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UpOworCWluc3RhbmNlLT5yeF9jaGFubmVsLmVuZHBvaW50ID0gdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIGRyaXZlci0+aW4pOworCWluc3RhbmNlLT50eF9jaGFubmVsLmVuZHBvaW50ID0gdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIGRyaXZlci0+b3V0KTsKKwlpbnN0YW5jZS0+cnhfY2hhbm5lbC5zdHJpZGUgPSBBVE1fQ0VMTF9TSVpFICsgZHJpdmVyLT5yeF9wYWRkaW5nOworCWluc3RhbmNlLT50eF9jaGFubmVsLnN0cmlkZSA9IEFUTV9DRUxMX1NJWkUgKyBkcml2ZXItPnR4X3BhZGRpbmc7CisJaW5zdGFuY2UtPnJ4X2NoYW5uZWwuYnVmX3NpemUgPSByY3ZfYnVmX3NpemUgKiBpbnN0YW5jZS0+cnhfY2hhbm5lbC5zdHJpZGU7CisJaW5zdGFuY2UtPnR4X2NoYW5uZWwuYnVmX3NpemUgPSBzbmRfYnVmX3NpemUgKiBpbnN0YW5jZS0+dHhfY2hhbm5lbC5zdHJpZGU7CisJaW5zdGFuY2UtPnJ4X2NoYW5uZWwudXNiYXRtID0gaW5zdGFuY2UtPnR4X2NoYW5uZWwudXNiYXRtID0gaW5zdGFuY2U7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZpbnN0YW5jZS0+c25kcXVldWUpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yY3ZfdXJicyArIG51bV9zbmRfdXJiczsgaSsrKSB7CisJCXN0cnVjdCB1cmIgKnVyYjsKKwkJdTggKmJ1ZmZlcjsKKwkJdW5zaWduZWQgaW50IGlzb19wYWNrZXRzID0gMCwgaXNvX3NpemUgPSAwOworCQlzdHJ1Y3QgdXNiYXRtX2NoYW5uZWwgKmNoYW5uZWwgPSBpIDwgbnVtX3Jjdl91cmJzID8KKwkJCSZpbnN0YW5jZS0+cnhfY2hhbm5lbCA6ICZpbnN0YW5jZS0+dHhfY2hhbm5lbDsKKworCQlpZiAodXNiX3BpcGVpc29jKGNoYW5uZWwtPmVuZHBvaW50KSkgeworCQkJLyogZG9uJ3QgZXhwZWN0IGlzbyBvdXQgZW5kcG9pbnRzICovCisJCQlpc29fc2l6ZSA9IHVzYl9tYXhwYWNrZXQoaW5zdGFuY2UtPnVzYl9kZXYsIGNoYW5uZWwtPmVuZHBvaW50LCAwKTsKKwkJCWlzb19zaXplIC09IGlzb19zaXplICUgY2hhbm5lbC0+c3RyaWRlOwkvKiBhbGlnbm1lbnQgKi8KKwkJCUJVR19PTighaXNvX3NpemUpOworCQkJaXNvX3BhY2tldHMgPSAoY2hhbm5lbC0+YnVmX3NpemUgLSAxKSAvIGlzb19zaXplICsgMTsKKwkJfQorCisJCXVyYiA9IHVzYl9hbGxvY191cmIoaXNvX3BhY2tldHMsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYikgeworCQkJZGV2X2RiZyhkZXYsICIlczogbm8gbWVtb3J5IGZvciB1cmIgJWQhXG4iLCBfX2Z1bmNfXywgaSk7CisJCQlnb3RvIGZhaWxfdW5iaW5kOworCQl9CisKKwkJaW5zdGFuY2UtPnVyYnNbaV0gPSB1cmI7CisKKwkJYnVmZmVyID0ga21hbGxvYyhjaGFubmVsLT5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmZmVyKSB7CisJCQlkZXZfZGJnKGRldiwgIiVzOiBubyBtZW1vcnkgZm9yIGJ1ZmZlciAlZCFcbiIsIF9fZnVuY19fLCBpKTsKKwkJCWdvdG8gZmFpbF91bmJpbmQ7CisJCX0KKwkJbWVtc2V0KGJ1ZmZlciwgMCwgY2hhbm5lbC0+YnVmX3NpemUpOworCisJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgaW5zdGFuY2UtPnVzYl9kZXYsIGNoYW5uZWwtPmVuZHBvaW50LAorCQkJCSAgYnVmZmVyLCBjaGFubmVsLT5idWZfc2l6ZSwgdXNiYXRtX2NvbXBsZXRlLCBjaGFubmVsKTsKKwkJaWYgKGlzb19wYWNrZXRzKSB7CisJCQlpbnQgajsKKwkJCXVyYi0+aW50ZXJ2YWwgPSAxOworCQkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJCXVyYi0+bnVtYmVyX29mX3BhY2tldHMgPSBpc29fcGFja2V0czsKKwkJCWZvciAoaiA9IDA7IGogPCBpc29fcGFja2V0czsgaisrKSB7CisJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBpc29fc2l6ZSAqIGo7CisJCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBtaW5fdChpbnQsIGlzb19zaXplLAorCQkJCQkJCQkgICAgICBjaGFubmVsLT5idWZfc2l6ZSAtIHVyYi0+aXNvX2ZyYW1lX2Rlc2Nbal0ub2Zmc2V0KTsKKwkJCX0KKwkJfQorCisJCS8qIHB1dCBhbGwgdHggVVJCcyBvbiB0aGUgbGlzdCBvZiBzcGFyZXMgKi8KKwkJaWYgKGkgPj0gbnVtX3Jjdl91cmJzKQorCQkJbGlzdF9hZGRfdGFpbCgmdXJiLT51cmJfbGlzdCwgJmNoYW5uZWwtPmxpc3QpOworCisJCXZkYmcoIiVzOiBhbGxvY2VkIGJ1ZmZlciAweCVwIGJ1ZiBzaXplICV1IHVyYiAweCVwIiwKKwkJICAgICBfX2Z1bmNfXywgdXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgdXJiKTsKKwl9CisKKwlpZiAobmVlZF9oZWF2eSAmJiBkcml2ZXItPmhlYXZ5X2luaXQpIHsKKwkJZXJyb3IgPSB1c2JhdG1faGVhdnlfaW5pdChpbnN0YW5jZSk7CisJfSBlbHNlIHsKKwkJY29tcGxldGUoJmluc3RhbmNlLT50aHJlYWRfZXhpdGVkKTsJLyogcHJldGVuZCB0aGF0IGhlYXZ5X2luaXQgd2FzIHJ1biAqLworCQllcnJvciA9IHVzYmF0bV9hdG1faW5pdChpbnN0YW5jZSk7CisJfQorCisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBmYWlsX3VuYmluZDsKKworCXVzYl9nZXRfZGV2KHVzYl9kZXYpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgaW5zdGFuY2UpOworCisJcmV0dXJuIDA7CisKKyBmYWlsX3VuYmluZDoKKwlpZiAoaW5zdGFuY2UtPmRyaXZlci0+dW5iaW5kKQorCQlpbnN0YW5jZS0+ZHJpdmVyLT51bmJpbmQoaW5zdGFuY2UsIGludGYpOworIGZhaWxfZnJlZToKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Jjdl91cmJzICsgbnVtX3NuZF91cmJzOyBpKyspIHsKKwkJaWYgKGluc3RhbmNlLT51cmJzW2ldKQorCQkJa2ZyZWUoaW5zdGFuY2UtPnVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYihpbnN0YW5jZS0+dXJic1tpXSk7CisJfQorCisJa2ZyZWUgKGluc3RhbmNlKTsKKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYmF0bV91c2JfcHJvYmUpOworCit2b2lkIHVzYmF0bV91c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW50Zi0+ZGV2OworCXN0cnVjdCB1c2JhdG1fZGF0YSAqaW5zdGFuY2UgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCWludCBpOworCisJZGV2X2RiZyhkZXYsICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIWluc3RhbmNlKSB7CisJCWRldl9kYmcoZGV2LCAiJXM6IE5VTEwgaW5zdGFuY2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJZG93bigmaW5zdGFuY2UtPnNlcmlhbGl6ZSk7CisJaWYgKGluc3RhbmNlLT50aHJlYWRfcGlkID49IDApCisJCWtpbGxfcHJvYyhpbnN0YW5jZS0+dGhyZWFkX3BpZCwgU0lHVEVSTSwgMSk7CisJdXAoJmluc3RhbmNlLT5zZXJpYWxpemUpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmaW5zdGFuY2UtPnRocmVhZF9leGl0ZWQpOworCisJdGFza2xldF9kaXNhYmxlKCZpbnN0YW5jZS0+cnhfY2hhbm5lbC50YXNrbGV0KTsKKwl0YXNrbGV0X2Rpc2FibGUoJmluc3RhbmNlLT50eF9jaGFubmVsLnRhc2tsZXQpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9yY3ZfdXJicyArIG51bV9zbmRfdXJiczsgaSsrKQorCQl1c2Jfa2lsbF91cmIoaW5zdGFuY2UtPnVyYnNbaV0pOworCisJZGVsX3RpbWVyX3N5bmMoJmluc3RhbmNlLT5yeF9jaGFubmVsLmRlbGF5KTsKKwlkZWxfdGltZXJfc3luYygmaW5zdGFuY2UtPnR4X2NoYW5uZWwuZGVsYXkpOworCisJaWYgKGluc3RhbmNlLT5hdG1fZGV2ICYmIGluc3RhbmNlLT5kcml2ZXItPmF0bV9zdG9wKQorCQlpbnN0YW5jZS0+ZHJpdmVyLT5hdG1fc3RvcChpbnN0YW5jZSwgaW5zdGFuY2UtPmF0bV9kZXYpOworCisJaWYgKGluc3RhbmNlLT5kcml2ZXItPnVuYmluZCkKKwkJaW5zdGFuY2UtPmRyaXZlci0+dW5iaW5kKGluc3RhbmNlLCBpbnRmKTsKKworCWluc3RhbmNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7CisKKwkvKiB0dXJuIHVzYmF0bV9bcnRdeF9wcm9jZXNzIGludG8gbm9vcCAqLworCS8qIG5vIG5lZWQgdG8gdGFrZSB0aGUgc3BpbmxvY2sgKi8KKwlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPnJ4X2NoYW5uZWwubGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmluc3RhbmNlLT50eF9jaGFubmVsLmxpc3QpOworCisJdGFza2xldF9lbmFibGUoJmluc3RhbmNlLT5yeF9jaGFubmVsLnRhc2tsZXQpOworCXRhc2tsZXRfZW5hYmxlKCZpbnN0YW5jZS0+dHhfY2hhbm5lbC50YXNrbGV0KTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcmN2X3VyYnMgKyBudW1fc25kX3VyYnM7IGkrKykgeworCQlrZnJlZShpbnN0YW5jZS0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJdXNiX2ZyZWVfdXJiKGluc3RhbmNlLT51cmJzW2ldKTsKKwl9CisKKwkvKiBBVE0gZmluYWxpemUgKi8KKwlpZiAoaW5zdGFuY2UtPmF0bV9kZXYpCisJCXNodXRkb3duX2F0bV9kZXYoaW5zdGFuY2UtPmF0bV9kZXYpOworCisJdXNiYXRtX3B1dF9pbnN0YW5jZShpbnN0YW5jZSk7CS8qIHRha2VuIGluIHVzYmF0bV91c2JfcHJvYmUgKi8KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYmF0bV91c2JfZGlzY29ubmVjdCk7CisKKworLyoqKioqKioqKioqCisqKiAgaW5pdCAgKioKKyoqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCB1c2JhdG1fdXNiX2luaXQodm9pZCkKK3sKKwlkYmcoIiVzOiBkcml2ZXIgdmVyc2lvbiAlcyIsIF9fZnVuY19fLCBEUklWRVJfVkVSU0lPTik7CisKKwlpZiAoc2l6ZW9mKHN0cnVjdCB1c2JhdG1fY29udHJvbCkgPiBzaXplb2YoKChzdHJ1Y3Qgc2tfYnVmZiAqKSAwKS0+Y2IpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgdW51c2FibGUgd2l0aCB0aGlzIGtlcm5lbCFcbiIsIHVzYmF0bV9kcml2ZXJfbmFtZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICgobnVtX3Jjdl91cmJzID4gVURTTF9NQVhfUkNWX1VSQlMpCisJICAgIHx8IChudW1fc25kX3VyYnMgPiBVRFNMX01BWF9TTkRfVVJCUykKKwkgICAgfHwgKHJjdl9idWZfc2l6ZSA8IDEpCisJICAgIHx8IChyY3ZfYnVmX3NpemUgPiBVRFNMX01BWF9SQ1ZfQlVGX1NJWkUpCisJICAgIHx8IChzbmRfYnVmX3NpemUgPCAxKQorCSAgICB8fCAoc25kX2J1Zl9zaXplID4gVURTTF9NQVhfU05EX0JVRl9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHVzYmF0bV91c2JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JhdG1fdXNiX2V4aXQodm9pZCkKK3sKKwlkYmcoIiVzIiwgX19mdW5jX18pOworfQorbW9kdWxlX2V4aXQodXNiYXRtX3VzYl9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CisKKy8qKioqKioqKioqKioKKyoqICBkZWJ1ZyAgKioKKyoqKioqKioqKioqKi8KKworI2lmZGVmIFZFUkJPU0VfREVCVUcKK3N0YXRpYyBpbnQgdXNiYXRtX3ByaW50X3BhY2tldChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzI1Nl07CisJaW50IGkgPSAwLCBqID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47KSB7CisJCWJ1ZmZlclswXSA9ICdcMCc7CisJCXNwcmludGYoYnVmZmVyLCAiJS4zZCA6IiwgaSk7CisJCWZvciAoaiA9IDA7IChqIDwgMTYpICYmIChpIDwgbGVuKTsgaisrLCBpKyspIHsKKwkJCXNwcmludGYoYnVmZmVyLCAiJXMgJTIuMngiLCBidWZmZXIsIGRhdGFbaV0pOworCQl9CisJCWRiZygiJXMiLCBidWZmZXIpOworCX0KKwlyZXR1cm4gaTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5oIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjY0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICB1c2JhdG0uaCAtIEdlbmVyaWMgVVNCIHhEU0wgZHJpdmVyIGNvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCBBbGNhdGVsCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzLCBEdW5jYW4gU2FuZHMsIFNvbE5lZ3JvLCBKb3NlcCBDb21hcworICogIENvcHlyaWdodCAoQykgMjAwNCwgRGF2aWQgV29vZGhvdXNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmCV9VU0JBVE1fSF8KKyNkZWZpbmUJX1VTQkFUTV9IXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisjZGVmaW5lIERFQlVHCisjZGVmaW5lIFZFUkJPU0VfREVCVUcKKyovCisKKyNpZiAhZGVmaW5lZCAoREVCVUcpICYmIGRlZmluZWQgKENPTkZJR19VU0JfREVCVUcpCisjCWRlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvYXRtLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpZmRlZiBERUJVRworI2RlZmluZSBVRFNMX0FTU0VSVCh4KQlCVUdfT04oISh4KSkKKyNlbHNlCisjZGVmaW5lIFVEU0xfQVNTRVJUKHgpCWRvIHsgaWYgKCEoeCkpIHdhcm4oImZhaWxlZCBhc3NlcnRpb24gJyVzJyBhdCBsaW5lICVkIiwgX19zdHJpbmdpZnkoeCksIF9fTElORV9fKTsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgdXNiX2VycihpbnN0YW5jZSwgZm9ybWF0LCBhcmcuLi4pCVwKKwlkZXZfZXJyKCYoaW5zdGFuY2UpLT51c2JfaW50Zi0+ZGV2ICwgZm9ybWF0ICwgIyMgYXJnKQorI2RlZmluZSB1c2JfaW5mbyhpbnN0YW5jZSwgZm9ybWF0LCBhcmcuLi4pCVwKKwlkZXZfaW5mbygmKGluc3RhbmNlKS0+dXNiX2ludGYtPmRldiAsIGZvcm1hdCAsICMjIGFyZykKKyNkZWZpbmUgdXNiX3dhcm4oaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJZGV2X3dhcm4oJihpbnN0YW5jZSktPnVzYl9pbnRmLT5kZXYgLCBmb3JtYXQgLCAjIyBhcmcpCisjZGVmaW5lIHVzYl9kYmcoaW5zdGFuY2UsIGZvcm1hdCwgYXJnLi4uKQlcCisJZGV2X2RiZygmKGluc3RhbmNlKS0+dXNiX2ludGYtPmRldiAsIGZvcm1hdCAsICMjIGFyZykKKworLyogRklYTUU6IG1vdmUgdG8gZGV2Xyogb25jZSBBVE0gaXMgZHJpdmVyIG1vZGVsIGF3YXJlICovCisjZGVmaW5lIGF0bV9wcmludGsobGV2ZWwsIGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCXByaW50ayhsZXZlbCAiQVRNIGRldiAlZDogIiBmb3JtYXQgLAkJXAorCShpbnN0YW5jZSktPmF0bV9kZXYtPm51bWJlciAsICMjIGFyZykKKworI2RlZmluZSBhdG1fZXJyKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWF0bV9wcmludGsoS0VSTl9FUlIsIGluc3RhbmNlICwgZm9ybWF0ICwgIyMgYXJnKQorI2RlZmluZSBhdG1faW5mbyhpbnN0YW5jZSwgZm9ybWF0LCBhcmcuLi4pCVwKKwlhdG1fcHJpbnRrKEtFUk5fSU5GTywgaW5zdGFuY2UgLCBmb3JtYXQgLCAjIyBhcmcpCisjZGVmaW5lIGF0bV93YXJuKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWF0bV9wcmludGsoS0VSTl9XQVJOSU5HLCBpbnN0YW5jZSAsIGZvcm1hdCAsICMjIGFyZykKKyNpZmRlZiBERUJVRworI2RlZmluZSBhdG1fZGJnKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWF0bV9wcmludGsoS0VSTl9ERUJVRywgaW5zdGFuY2UgLCBmb3JtYXQgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBhdG1fZGJnKGluc3RhbmNlLCBmb3JtYXQsIGFyZy4uLikJXAorCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyogbWluaSBkcml2ZXIgKi8KKworc3RydWN0IHVzYmF0bV9kYXRhOworCisvKgorKiAgQXNzdW1pbmcgYWxsIG1ldGhvZHMgZXhpc3QgYW5kIHN1Y2NlZWQsIHRoZXkgYXJlIGNhbGxlZCBpbiB0aGlzIG9yZGVyOgorKgorKiAgCWJpbmQsIGhlYXZ5X2luaXQsIGF0bV9zdGFydCwgLi4uLCBhdG1fc3RvcCwgdW5iaW5kCisqLworCitzdHJ1Y3QgdXNiYXRtX2RyaXZlciB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwljb25zdCBjaGFyICpkcml2ZXJfbmFtZTsKKworCS8qCisJKiAgaW5pdCBkZXZpY2UgLi4uIGNhbiBzbGVlcCwgb3IgY2F1c2UgcHJvYmUoKSBmYWlsdXJlLiAgRHJpdmVycyB3aXRoIGEgaGVhdnlfaW5pdAorCSogIG1ldGhvZCBjYW4gYXZvaWQgaGF2aW5nIGl0IGNhbGxlZCBieSBzZXR0aW5nIG5lZWRfaGVhdnlfaW5pdCB0byB6ZXJvLgorCSovCisgICAgICAgIGludCAoKmJpbmQpIChzdHJ1Y3QgdXNiYXRtX2RhdGEgKiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQsIGludCAqbmVlZF9oZWF2eV9pbml0KTsKKworCS8qIGFkZGl0aW9uYWwgZGV2aWNlIGluaXRpYWxpemF0aW9uIHRoYXQgaXMgdG9vIHNsb3cgdG8gYmUgZG9uZSBpbiBwcm9iZSgpICovCisgICAgICAgIGludCAoKmhlYXZ5X2luaXQpIChzdHJ1Y3QgdXNiYXRtX2RhdGEgKiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKik7CisKKwkvKiBjbGVhbnVwIGRldmljZSAuLi4gY2FuIHNsZWVwLCBidXQgY2FuJ3QgZmFpbCAqLworICAgICAgICB2b2lkICgqdW5iaW5kKSAoc3RydWN0IHVzYmF0bV9kYXRhICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOworCisJLyogaW5pdCBBVE0gZGV2aWNlIC4uLiBjYW4gc2xlZXAsIG9yIGNhdXNlIEFUTSBpbml0aWFsaXphdGlvbiBmYWlsdXJlICovCisJaW50ICgqYXRtX3N0YXJ0KSAoc3RydWN0IHVzYmF0bV9kYXRhICosIHN0cnVjdCBhdG1fZGV2ICopOworCisJLyogY2xlYW51cCBBVE0gZGV2aWNlIC4uLiBjYW4gc2xlZXAsIGJ1dCBjYW4ndCBmYWlsICovCisJdm9pZCAoKmF0bV9zdG9wKSAoc3RydWN0IHVzYmF0bV9kYXRhICosIHN0cnVjdCBhdG1fZGV2ICopOworCisgICAgICAgIGludCBpbjsJCS8qIHJ4IGVuZHBvaW50ICovCisgICAgICAgIGludCBvdXQ7CS8qIHR4IGVuZHBvaW50ICovCisKKwl1bnNpZ25lZCByeF9wYWRkaW5nOworCXVuc2lnbmVkIHR4X3BhZGRpbmc7Cit9OworCitleHRlcm4gaW50IHVzYmF0bV91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwKKwkJc3RydWN0IHVzYmF0bV9kcml2ZXIgKmRyaXZlcik7CitleHRlcm4gdm9pZCB1c2JhdG1fdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCisKK3N0cnVjdCB1c2JhdG1fY2hhbm5lbCB7CisJaW50IGVuZHBvaW50OwkJCS8qIHVzYiBwaXBlICovCisJdW5zaWduZWQgaW50IHN0cmlkZTsJCS8qIEFUTSBjZWxsIHNpemUgKyBwYWRkaW5nICovCisJdW5zaWduZWQgaW50IGJ1Zl9zaXplOwkJLyogdXJiIGJ1ZmZlciBzaXplICovCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBkZWxheTsKKwlzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bTsKK307CisKKy8qIG1haW4gZHJpdmVyIGRhdGEgKi8KKworc3RydWN0IHVzYmF0bV9kYXRhIHsKKwkvKioqKioqKioqKioqKioqKioqCisJKiAgcHVibGljIGZpZWxkcyAgKgorICAgICAgICAqKioqKioqKioqKioqKioqKiovCisKKwkvKiBtaW5pIGRyaXZlciAqLworCXN0cnVjdCB1c2JhdG1fZHJpdmVyICpkcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7CisJY2hhciBkcml2ZXJfbmFtZVsxNl07CisKKwkvKiBVU0IgZGV2aWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9pbnRmOworCWNoYXIgZGVzY3JpcHRpb25bNjRdOworCisJLyogQVRNIGRldmljZSAqLworCXN0cnVjdCBhdG1fZGV2ICphdG1fZGV2OworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKiAgcHJpdmF0ZSBmaWVsZHMgLSBkbyBub3QgdXNlICAqCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJc3RydWN0IGtyZWYgcmVmY291bnQ7CisJc3RydWN0IHNlbWFwaG9yZSBzZXJpYWxpemU7CisKKwkvKiBoZWF2eSBpbml0ICovCisJaW50IHRocmVhZF9waWQ7CisJc3RydWN0IGNvbXBsZXRpb24gdGhyZWFkX3N0YXJ0ZWQ7CisJc3RydWN0IGNvbXBsZXRpb24gdGhyZWFkX2V4aXRlZDsKKworCS8qIEFUTSBkZXZpY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZjY19saXN0OworCisJc3RydWN0IHVzYmF0bV9jaGFubmVsIHJ4X2NoYW5uZWw7CisJc3RydWN0IHVzYmF0bV9jaGFubmVsIHR4X2NoYW5uZWw7CisKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNuZHF1ZXVlOworCXN0cnVjdCBza19idWZmICpjdXJyZW50X3NrYjsJCQkvKiBiZWluZyBlbXB0aWVkICovCisKKwlzdHJ1Y3QgdXJiICp1cmJzWzBdOworfTsKKworI2VuZGlmCS8qIF9VU0JBVE1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS94dXNiYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0veHVzYmF0bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTdmYjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9hdG0veHVzYmF0bS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgeHVzYmF0bS5jIC0JZHVtYiB1c2JhdG0tYmFzZWQgZHJpdmVyIGZvciBtb2RlbXMgaW5pdGlhbGl6ZWQgaW4gdXNlcnNwYWNlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBEdW5jYW4gU2FuZHMsIFJvbWFuIEthZ2FuIChya2FnYW4gJSBtYWlsICEgcnUpCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CQkvKiBGSVhNRTogcmVxdWlyZWQgYnkgbGludXgvZXRoZXJkZXZpY2UuaCAqLworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CQkvKiBmb3IgcmFuZG9tX2V0aGVyX2FkZHIoKSAqLworCisjaW5jbHVkZSAidXNiYXRtLmgiCisKKworI2RlZmluZSBYVVNCQVRNX0RSSVZFUlNfTUFYCTgKKworI2RlZmluZSBYVVNCQVRNX1BBUk0obmFtZSwgdHlwZSwgcGFybXR5cGUsIGRlc2MpIFwKKwlzdGF0aWMgdHlwZSBuYW1lW1hVU0JBVE1fRFJJVkVSU19NQVhdOyBcCisJc3RhdGljIGludCBudW1fIyNuYW1lOyBcCisJbW9kdWxlX3BhcmFtX2FycmF5KG5hbWUsIHBhcm10eXBlLCAmbnVtXyMjbmFtZSwgMDQ0NCk7IFwKKwlNT0RVTEVfUEFSTV9ERVNDKG5hbWUsIGRlc2MpCisKK1hVU0JBVE1fUEFSTSh2ZW5kb3IsIHVuc2lnbmVkIHNob3J0LCB1c2hvcnQsICJVU0IgZGV2aWNlIHZlbmRvciIpOworWFVTQkFUTV9QQVJNKHByb2R1Y3QsIHVuc2lnbmVkIHNob3J0LCB1c2hvcnQsICJVU0IgZGV2aWNlIHByb2R1Y3QiKTsKKworWFVTQkFUTV9QQVJNKHJ4X2VuZHBvaW50LCB1bnNpZ25lZCBjaGFyLCBieXRlLCAicnggZW5kcG9pbnQgbnVtYmVyIik7CitYVVNCQVRNX1BBUk0odHhfZW5kcG9pbnQsIHVuc2lnbmVkIGNoYXIsIGJ5dGUsICJ0eCBlbmRwb2ludCBudW1iZXIiKTsKK1hVU0JBVE1fUEFSTShyeF9wYWRkaW5nLCB1bnNpZ25lZCBjaGFyLCBieXRlLCAicnggcGFkZGluZyAoZGVmYXVsdCAwKSIpOworWFVTQkFUTV9QQVJNKHR4X3BhZGRpbmcsIHVuc2lnbmVkIGNoYXIsIGJ5dGUsICJ0eCBwYWRkaW5nIChkZWZhdWx0IDApIik7CisKK3N0YXRpYyBjb25zdCBjaGFyIHh1c2JhdG1fZHJpdmVyX25hbWVbXSA9ICJ4dXNiYXRtIjsKKworc3RhdGljIHN0cnVjdCB1c2JhdG1fZHJpdmVyIHh1c2JhdG1fZHJpdmVyc1tYVVNCQVRNX0RSSVZFUlNfTUFYXTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB4dXNiYXRtX3VzYl9pZHNbWFVTQkFUTV9EUklWRVJTX01BWCArIDFdOworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHh1c2JhdG1fdXNiX2RyaXZlcjsKKworc3RhdGljIGludCB1c2JfaW50Zl9oYXNfZXAoY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHU4IGVwKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGludGYtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKKwkJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0ID0gaW50Zi0+YWx0c2V0dGluZzsKKwkJZm9yIChqID0gMDsgaiA8IGFsdC0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBqKyspCisJCQlpZiAoKGFsdC0+ZW5kcG9pbnRbaV0uZGVzYy5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLKSA9PSBlcCkKKwkJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeHVzYmF0bV9iaW5kKHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtX2luc3RhbmNlLAorCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCwKKwkJCWludCAqbmVlZF9oZWF2eV9pbml0KQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQgZHJ2X2l4ID0gaWQgLSB4dXNiYXRtX3VzYl9pZHM7CisJaW50IHJ4X2VwX3ByZXNlbnQgPSB1c2JfaW50Zl9oYXNfZXAoaW50ZiwgcnhfZW5kcG9pbnRbZHJ2X2l4XSk7CisJaW50IHR4X2VwX3ByZXNlbnQgPSB1c2JfaW50Zl9oYXNfZXAoaW50ZiwgdHhfZW5kcG9pbnRbZHJ2X2l4XSk7CisJdTggc2VhcmNoZWRfZXAgPSByeF9lcF9wcmVzZW50ID8gdHhfZW5kcG9pbnRbZHJ2X2l4XSA6IHJ4X2VuZHBvaW50W2Rydl9peF07CisJaW50IGksIHJldDsKKworCXVzYl9kYmcodXNiYXRtX2luc3RhbmNlLCAiJXM6IGJpbmRpbmcgZHJpdmVyICVkOiB2ZW5kb3IgJSN4IHByb2R1Y3QgJSN4IgorCQkiIHJ4OiBlcCAlI3ggcGFkZCAlZCB0eDogZXAgJSN4IHBhZGQgJWRcbiIsCisJCV9fZnVuY19fLCBkcnZfaXgsIHZlbmRvcltkcnZfaXhdLCBwcm9kdWN0W2Rydl9peF0sCisJCXJ4X2VuZHBvaW50W2Rydl9peF0sIHJ4X3BhZGRpbmdbZHJ2X2l4XSwKKwkJdHhfZW5kcG9pbnRbZHJ2X2l4XSwgdHhfcGFkZGluZ1tkcnZfaXhdKTsKKworCWlmICghcnhfZXBfcHJlc2VudCAmJiAhdHhfZXBfcHJlc2VudCkgeworCQl1c2JfZGJnKHVzYmF0bV9pbnN0YW5jZSwgIiVzOiBpbnRmICMlZCBoYXMgbmVpdGhlciByeCAoJSN4KSBub3IgdHggKCUjeCkgZW5kcG9pbnRcbiIsCisJCQlfX2Z1bmNfXywgaW50Zi0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJcnhfZW5kcG9pbnRbZHJ2X2l4XSwgdHhfZW5kcG9pbnRbZHJ2X2l4XSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChyeF9lcF9wcmVzZW50ICYmIHR4X2VwX3ByZXNlbnQpCisJCXJldHVybiAwOworCisJZm9yKGkgPSAwOyBpIDwgdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmN1cl9pZiA9IHVzYl9kZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCisJCWlmIChjdXJfaWYgIT0gaW50ZiAmJiB1c2JfaW50Zl9oYXNfZXAoY3VyX2lmLCBzZWFyY2hlZF9lcCkpIHsKKwkJCXJldCA9IHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCZ4dXNiYXRtX3VzYl9kcml2ZXIsCisJCQkJCQkJIGN1cl9pZiwgdXNiYXRtX2luc3RhbmNlKTsKKwkJCWlmICghcmV0KQorCQkJCXVzYl9lcnIodXNiYXRtX2luc3RhbmNlLCAiJXM6IGZhaWxlZCB0byBjbGFpbSBpbnRlcmZhY2UgIyVkICglZClcbiIsCisJCQkJCV9fZnVuY19fLCBjdXJfaWYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwl1c2JfZXJyKHVzYmF0bV9pbnN0YW5jZSwgIiVzOiBubyBpbnRlcmZhY2UgaGFzIGVuZHBvaW50ICUjeFxuIiwKKwkJX19mdW5jX18sIHNlYXJjaGVkX2VwKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgeHVzYmF0bV91bmJpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG1faW5zdGFuY2UsCisJCQkgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJaW50IGk7CisJdXNiX2RiZyh1c2JhdG1faW5zdGFuY2UsICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlmb3IoaSA9IDA7IGkgPCB1c2JfZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqY3VyX2lmID0gdXNiX2Rldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07CisJCXVzYl9zZXRfaW50ZmRhdGEoY3VyX2lmLCBOVUxMKTsKKwkJdXNiX2RyaXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmeHVzYmF0bV91c2JfZHJpdmVyLCBjdXJfaWYpOworCX0KK30KKworc3RhdGljIGludCB4dXNiYXRtX2F0bV9zdGFydChzdHJ1Y3QgdXNiYXRtX2RhdGEgKnVzYmF0bV9pbnN0YW5jZSwKKwkJCSAgICAgc3RydWN0IGF0bV9kZXYgKmF0bV9kZXYpCit7CisJYXRtX2RiZyh1c2JhdG1faW5zdGFuY2UsICIlcyBlbnRlcmVkXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiB1c2UgcmFuZG9tIE1BQyBhcyB3ZSd2ZSBubyB3YXkgdG8gZ2V0IGl0IGZyb20gdGhlIGRldmljZSAqLworCXJhbmRvbV9ldGhlcl9hZGRyKGF0bV9kZXYtPmVzaSk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHh1c2JhdG1fdXNiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIHVzYmF0bV91c2JfcHJvYmUoaW50ZiwgaWQsCisJCQkJeHVzYmF0bV9kcml2ZXJzICsgKGlkIC0geHVzYmF0bV91c2JfaWRzKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB4dXNiYXRtX3VzYl9kcml2ZXIgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9IHh1c2JhdG1fZHJpdmVyX25hbWUsCisJLnByb2JlCQk9IHh1c2JhdG1fdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0CT0gdXNiYXRtX3VzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IHh1c2JhdG1fdXNiX2lkcworfTsKKworc3RhdGljIGludCBfX2luaXQgeHVzYmF0bV9pbml0KHZvaWQpCit7CisJaW50IGk7CisKKwlkYmcoInh1c2JhdG1faW5pdCIpOworCisJaWYgKCFudW1fdmVuZG9yIHx8CisJICAgIG51bV92ZW5kb3IgIT0gbnVtX3Byb2R1Y3QgfHwKKwkgICAgbnVtX3ZlbmRvciAhPSBudW1fcnhfZW5kcG9pbnQgfHwKKwkgICAgbnVtX3ZlbmRvciAhPSBudW1fdHhfZW5kcG9pbnQpIHsKKwkJd2FybigibWFsZm9ybWVkIG1vZHVsZSBwYXJhbWV0ZXJzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fdmVuZG9yOyBpKyspIHsKKwkJeHVzYmF0bV91c2JfaWRzW2ldLm1hdGNoX2ZsYWdzCT0gVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0U7CisJCXh1c2JhdG1fdXNiX2lkc1tpXS5pZFZlbmRvcgk9IHZlbmRvcltpXTsKKwkJeHVzYmF0bV91c2JfaWRzW2ldLmlkUHJvZHVjdAk9IHByb2R1Y3RbaV07CisKKworCQl4dXNiYXRtX2RyaXZlcnNbaV0ub3duZXIJPSBUSElTX01PRFVMRTsKKwkJeHVzYmF0bV9kcml2ZXJzW2ldLmRyaXZlcl9uYW1lCT0geHVzYmF0bV9kcml2ZXJfbmFtZTsKKwkJeHVzYmF0bV9kcml2ZXJzW2ldLmJpbmQJCT0geHVzYmF0bV9iaW5kOworCQl4dXNiYXRtX2RyaXZlcnNbaV0udW5iaW5kCT0geHVzYmF0bV91bmJpbmQ7CisJCXh1c2JhdG1fZHJpdmVyc1tpXS5hdG1fc3RhcnQJPSB4dXNiYXRtX2F0bV9zdGFydDsKKwkJeHVzYmF0bV9kcml2ZXJzW2ldLmluCQk9IHJ4X2VuZHBvaW50W2ldOworCQl4dXNiYXRtX2RyaXZlcnNbaV0ub3V0CQk9IHR4X2VuZHBvaW50W2ldOworCQl4dXNiYXRtX2RyaXZlcnNbaV0ucnhfcGFkZGluZwk9IHJ4X3BhZGRpbmdbaV07CisJCXh1c2JhdG1fZHJpdmVyc1tpXS50eF9wYWRkaW5nCT0gdHhfcGFkZGluZ1tpXTsKKwl9CisKKwlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZ4dXNiYXRtX3VzYl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoeHVzYmF0bV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHh1c2JhdG1fZXhpdCh2b2lkKQoreworCWRiZygieHVzYmF0bV9leGl0IGVudGVyZWQiKTsKKworCXVzYl9kZXJlZ2lzdGVyKCZ4dXNiYXRtX3VzYl9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoeHVzYmF0bV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUm9tYW4gS2FnYW4sIER1bmNhbiBTYW5kcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFVTQiBBRFNMIG1vZGVtcyBpbml0aWFsaXplZCBpbiB1c2Vyc3BhY2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCA2ZDFmOWI2Li5hZGZmNWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0xMDYsNiArMTA2LDExMSBAQAogCWFjbV9jdHJsX21zZyhhY20sIFVTQl9DRENfUkVRX1NFTkRfQlJFQUssIG1zLCBOVUxMLCAwKQogCiAvKgorICogV3JpdGUgYnVmZmVyIG1hbmFnZW1lbnQuCisgKiBBbGwgb2YgdGhlc2UgYXNzdW1lIHByb3BlciBsb2NrcyB0YWtlbiBieSB0aGUgY2FsbGVyLgorICovCisKK3N0YXRpYyBpbnQgYWNtX3diX2FsbG9jKHN0cnVjdCBhY20gKmFjbSkKK3sKKwlpbnQgaSwgd2JuOworCXN0cnVjdCBhY21fd2IgKndiOworCisJd2JuID0gYWNtLT53cml0ZV9jdXJyZW50OworCWkgPSAwOworCWZvciAoOzspIHsKKwkJd2IgPSAmYWNtLT53Ylt3Ym5dOworCQlpZiAoIXdiLT51c2UpIHsKKwkJCXdiLT51c2UgPSAxOworCQkJcmV0dXJuIHdibjsKKwkJfQorCQl3Ym4gPSAod2JuICsgMSkgJSBBQ01fTldCOworCQlpZiAoKytpID49IEFDTV9OV0IpCisJCQlyZXR1cm4gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBhY21fd2JfZnJlZShzdHJ1Y3QgYWNtICphY20sIGludCB3Ym4pCit7CisJYWNtLT53Ylt3Ym5dLnVzZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYWNtX3diX2lzX2F2YWlsKHN0cnVjdCBhY20gKmFjbSkKK3sKKwlpbnQgaSwgbjsKKworCW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBBQ01fTldCOyBpKyspIHsKKwkJaWYgKCFhY20tPndiW2ldLnVzZSkKKwkJCW4rKzsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFjbV93Yl9pc191c2VkKHN0cnVjdCBhY20gKmFjbSwgaW50IHdibikKK3sKKwlyZXR1cm4gYWNtLT53Ylt3Ym5dLnVzZTsKK30KKworLyoKKyAqIEZpbmlzaCB3cml0ZS4KKyAqLworc3RhdGljIHZvaWQgYWNtX3dyaXRlX2RvbmUoc3RydWN0IGFjbSAqYWNtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdibjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKKwlhY20tPndyaXRlX3JlYWR5ID0gMTsKKwl3Ym4gPSBhY20tPndyaXRlX2N1cnJlbnQ7CisJYWNtX3diX2ZyZWUoYWNtLCB3Ym4pOworCWFjbS0+d3JpdGVfY3VycmVudCA9ICh3Ym4gKyAxKSAlIEFDTV9OV0I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBQb2tlIHdyaXRlLgorICovCitzdGF0aWMgaW50IGFjbV93cml0ZV9zdGFydChzdHJ1Y3QgYWNtICphY20pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2JuOworCXN0cnVjdCBhY21fd2IgKndiOworCWludCByYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWFjbS0+ZGV2KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWFjbS0+d3JpdGVfcmVhZHkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOwkvKiBBIHdoaXRlIGxpZSAqLworCX0KKworCXdibiA9IGFjbS0+d3JpdGVfY3VycmVudDsKKwlpZiAoIWFjbV93Yl9pc191c2VkKGFjbSwgd2JuKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXdiID0gJmFjbS0+d2Jbd2JuXTsKKworCWFjbS0+d3JpdGVfcmVhZHkgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCisJYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gd2ItPmJ1ZjsKKwlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9kbWEgPSB3Yi0+ZG1haDsKKwlhY20tPndyaXRldXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gd2ItPmxlbjsKKwlhY20tPndyaXRldXJiLT5kZXYgPSBhY20tPmRldjsKKworCWlmICgocmMgPSB1c2Jfc3VibWl0X3VyYihhY20tPndyaXRldXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7CisJCWRiZygidXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkOiAlZCIsIHJjKTsKKwkJYWNtX3dyaXRlX2RvbmUoYWNtKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKgogICogSW50ZXJydXB0IGhhbmRsZXJzIGZvciB2YXJpb3VzIEFDTSBkZXZpY2UgcmVzcG9uc2VzCiAgKi8KIApAQCAtMjM3LDE3ICszNDIsMTMgQEAKIHN0YXRpYyB2b2lkIGFjbV93cml0ZV9idWxrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGFjbSAqYWNtID0gKHN0cnVjdCBhY20gKil1cmItPmNvbnRleHQ7CisKIAlkYmcoIkVudGVyaW5nIGFjbV93cml0ZV9idWxrIHdpdGggc3RhdHVzICVkXG4iLCB1cmItPnN0YXR1cyk7CiAKLQlpZiAoIUFDTV9SRUFEWShhY20pKQotCQlnb3RvIG91dDsKLQotCWlmICh1cmItPnN0YXR1cykKLQkJZGJnKCJub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIHVyYi0+c3RhdHVzKTsKLQotCXNjaGVkdWxlX3dvcmsoJmFjbS0+d29yayk7Ci1vdXQ6Ci0JYWNtLT5yZWFkeV9mb3Jfd3JpdGUgPSAxOworCWFjbV93cml0ZV9kb25lKGFjbSk7CisJYWNtX3dyaXRlX3N0YXJ0KGFjbSk7CisJaWYgKEFDTV9SRUFEWShhY20pKQorCQlzY2hlZHVsZV93b3JrKCZhY20tPndvcmspOwogfQogCiBzdGF0aWMgdm9pZCBhY21fc29mdGludCh2b2lkICpwcml2YXRlKQpAQCAtMzIxLDYgKzQyMiwxNyBAQAogCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgdm9pZCBhY21fdHR5X3VucmVnaXN0ZXIoc3RydWN0IGFjbSAqYWNtKQoreworCXR0eV91bnJlZ2lzdGVyX2RldmljZShhY21fdHR5X2RyaXZlciwgYWNtLT5taW5vcik7CisJdXNiX3B1dF9pbnRmKGFjbS0+Y29udHJvbCk7CisJYWNtX3RhYmxlW2FjbS0+bWlub3JdID0gTlVMTDsKKwl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKKwl1c2JfZnJlZV91cmIoYWNtLT5yZWFkdXJiKTsKKwl1c2JfZnJlZV91cmIoYWNtLT53cml0ZXVyYik7CisJa2ZyZWUoYWNtKTsKK30KKwogc3RhdGljIHZvaWQgYWNtX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwpAQCAtMzM1LDE0ICs0NDcsOCBAQAogCQkJdXNiX2tpbGxfdXJiKGFjbS0+Y3RybHVyYik7CiAJCQl1c2Jfa2lsbF91cmIoYWNtLT53cml0ZXVyYik7CiAJCQl1c2Jfa2lsbF91cmIoYWNtLT5yZWFkdXJiKTsKLQkJfSBlbHNlIHsKLQkJCXR0eV91bnJlZ2lzdGVyX2RldmljZShhY21fdHR5X2RyaXZlciwgYWNtLT5taW5vcik7Ci0JCQlhY21fdGFibGVbYWNtLT5taW5vcl0gPSBOVUxMOwotCQkJdXNiX2ZyZWVfdXJiKGFjbS0+Y3RybHVyYik7Ci0JCQl1c2JfZnJlZV91cmIoYWNtLT5yZWFkdXJiKTsKLQkJCXVzYl9mcmVlX3VyYihhY20tPndyaXRldXJiKTsKLQkJCWtmcmVlKGFjbSk7Ci0JCX0KKwkJfSBlbHNlCisJCQlhY21fdHR5X3VucmVnaXN0ZXIoYWNtKTsKIAl9CiAJdXAoJm9wZW5fc2VtKTsKIH0KQEAgLTM1MSwzMiArNDU3LDMzIEBACiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgc3RhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3Ym47CisJc3RydWN0IGFjbV93YiAqd2I7CisKIAlkYmcoIkVudGVyaW5nIGFjbV90dHlfd3JpdGUgdG8gd3JpdGUgJWQgYnl0ZXMsXG4iLCBjb3VudCk7CiAKIAlpZiAoIUFDTV9SRUFEWShhY20pKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWFjbS0+cmVhZHlfZm9yX3dyaXRlKQotCQlyZXR1cm4gMDsKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAotCWNvdW50ID0gKGNvdW50ID4gYWNtLT53cml0ZXNpemUpID8gYWNtLT53cml0ZXNpemUgOiBjb3VudDsKLQotCWRiZygiR2V0ICVkIGJ5dGVzLi4uIiwgY291bnQpOwotCW1lbWNweShhY20tPndyaXRlX2J1ZmZlciwgYnVmLCBjb3VudCk7Ci0JZGJnKCIgIFN1Y2Nlc3NmdWxseSBjb3BpZWQuXG4iKTsKLQotCWFjbS0+d3JpdGV1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBjb3VudDsKLQlhY20tPndyaXRldXJiLT5kZXYgPSBhY20tPmRldjsKLQotCWFjbS0+cmVhZHlfZm9yX3dyaXRlID0gMDsKLQlzdGF0ID0gdXNiX3N1Ym1pdF91cmIoYWNtLT53cml0ZXVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHN0YXQgPCAwKSB7Ci0JCWRiZygidXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkIik7Ci0JCWFjbS0+cmVhZHlfZm9yX3dyaXRlID0gMTsKLQkJcmV0dXJuIHN0YXQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOworCWlmICgod2JuID0gYWNtX3diX2FsbG9jKGFjbSkpIDwgMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJYWNtX3dyaXRlX3N0YXJ0KGFjbSk7CisJCXJldHVybiAwOwogCX0KKwl3YiA9ICZhY20tPndiW3dibl07CiAKKwljb3VudCA9IChjb3VudCA+IGFjbS0+d3JpdGVzaXplKSA/IGFjbS0+d3JpdGVzaXplIDogY291bnQ7CisJZGJnKCJHZXQgJWQgYnl0ZXMuLi4iLCBjb3VudCk7CisJbWVtY3B5KHdiLT5idWYsIGJ1ZiwgY291bnQpOworCXdiLT5sZW4gPSBjb3VudDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCWlmICgoc3RhdCA9IGFjbV93cml0ZV9zdGFydChhY20pKSA8IDApCisJCXJldHVybiBzdGF0OwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzg1LDcgKzQ5MiwxMSBAQAogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKCFBQ01fUkVBRFkoYWNtKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuICFhY20tPnJlYWR5X2Zvcl93cml0ZSA/IDAgOiBhY20tPndyaXRlc2l6ZTsKKwkvKgorCSAqIERvIG5vdCBsZXQgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBrbm93IHRoYXQgd2UgaGF2ZSBhIHJlc2VydmUsCisJICogb3IgaXQgbWlnaHQgZ2V0IHRvbyBlbnRodXNpYXN0aWMuCisJICovCisJcmV0dXJuIChhY20tPndyaXRlX3JlYWR5ICYmIGFjbV93Yl9pc19hdmFpbChhY20pKSA/IGFjbS0+d3JpdGVzaXplIDogMDsKIH0KIAogc3RhdGljIGludCBhY21fdHR5X2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQpAQCAtMzkzLDcgKzUwNCwxMCBAQAogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaWYgKCFBQ01fUkVBRFkoYWNtKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuICFhY20tPnJlYWR5X2Zvcl93cml0ZSA/IGFjbS0+d3JpdGV1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggOiAwOworCS8qCisJICogVGhpcyBpcyBpbmFjY3VyYXRlIChvdmVyY291bnRzKSwgYnV0IGl0IHdvcmtzLgorCSAqLworCXJldHVybiAoQUNNX05XQiAtIGFjbV93Yl9pc19hdmFpbChhY20pKSAqIGFjbS0+d3JpdGVzaXplOwogfQogCiBzdGF0aWMgdm9pZCBhY21fdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCkBAIC01MjYsNiArNjQwLDM5IEBACiAgKiBVU0IgcHJvYmUgYW5kIGRpc2Nvbm5lY3Qgcm91dGluZXMuCiAgKi8KIAorLyogTGl0dGxlIGhlbHBlcjogd3JpdGUgYnVmZmVycyBmcmVlICovCitzdGF0aWMgdm9pZCBhY21fd3JpdGVfYnVmZmVyc19mcmVlKHN0cnVjdCBhY20gKmFjbSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWNtX3diICp3YjsKKworCWZvciAod2IgPSAmYWNtLT53YlswXSwgaSA9IDA7IGkgPCBBQ01fTldCOyBpKyssIHdiKyspIHsKKwkJdXNiX2J1ZmZlcl9mcmVlKGFjbS0+ZGV2LCBhY20tPndyaXRlc2l6ZSwgd2ItPmJ1Ziwgd2ItPmRtYWgpOworCX0KK30KKworLyogTGl0dGxlIGhlbHBlcjogd3JpdGUgYnVmZmVycyBhbGxvY2F0ZSAqLworc3RhdGljIGludCBhY21fd3JpdGVfYnVmZmVyc19hbGxvYyhzdHJ1Y3QgYWNtICphY20pCit7CisJaW50IGk7CisJc3RydWN0IGFjbV93YiAqd2I7CisKKwlmb3IgKHdiID0gJmFjbS0+d2JbMF0sIGkgPSAwOyBpIDwgQUNNX05XQjsgaSsrLCB3YisrKSB7CisJCXdiLT5idWYgPSB1c2JfYnVmZmVyX2FsbG9jKGFjbS0+ZGV2LCBhY20tPndyaXRlc2l6ZSwgR0ZQX0tFUk5FTCwKKwkJICAgICZ3Yi0+ZG1haCk7CisJCWlmICghd2ItPmJ1ZikgeworCQkJd2hpbGUgKGkgIT0gMCkgeworCQkJCS0taTsKKwkJCQktLXdiOworCQkJCXVzYl9idWZmZXJfZnJlZShhY20tPmRldiwgYWNtLT53cml0ZXNpemUsCisJCQkJICAgIHdiLT5idWYsIHdiLT5kbWFoKTsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFjbV9wcm9iZSAoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKQEAgLTcwMCw3ICs4NDcsOCBAQAogCWFjbS0+YmguZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBhY207CiAJSU5JVF9XT1JLKCZhY20tPndvcmssIGFjbV9zb2Z0aW50LCBhY20pOwogCXNwaW5fbG9ja19pbml0KCZhY20tPnRocm90dGxlX2xvY2spOwotCWFjbS0+cmVhZHlfZm9yX3dyaXRlID0gMTsKKwlzcGluX2xvY2tfaW5pdCgmYWNtLT53cml0ZV9sb2NrKTsKKwlhY20tPndyaXRlX3JlYWR5ID0gMTsKIAogCWJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModXNiX2RldiwgY3RybHNpemUsIEdGUF9LRVJORUwsICZhY20tPmN0cmxfZG1hKTsKIAlpZiAoIWJ1ZikgewpAQCAtNzE2LDEyICs4NjQsMTAgQEAKIAl9CiAJYWNtLT5yZWFkX2J1ZmZlciA9IGJ1ZjsKIAotCWJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModXNiX2RldiwgYWNtLT53cml0ZXNpemUsIEdGUF9LRVJORUwsICZhY20tPndyaXRlX2RtYSk7Ci0JaWYgKCFidWYpIHsKKwlpZiAoYWNtX3dyaXRlX2J1ZmZlcnNfYWxsb2MoYWNtKSA8IDApIHsKIAkJZGV2X2RiZygmaW50Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSAod3JpdGUgYnVmZmVyIGFsbG9jKVxuIik7CiAJCWdvdG8gYWxsb2NfZmFpbDQ7CiAJfQotCWFjbS0+d3JpdGVfYnVmZmVyID0gYnVmOwkKIAogCWFjbS0+Y3RybHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhY20tPmN0cmx1cmIpIHsKQEAgLTc1MCw5ICs4OTYsOSBAQAogCWFjbS0+cmVhZHVyYi0+dHJhbnNmZXJfZG1hID0gYWNtLT5yZWFkX2RtYTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKGFjbS0+d3JpdGV1cmIsIHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBlcHdyaXRlLT5iRW5kcG9pbnRBZGRyZXNzKSwKLQkJCSAgYWNtLT53cml0ZV9idWZmZXIsIGFjbS0+d3JpdGVzaXplLCBhY21fd3JpdGVfYnVsaywgYWNtKTsKKwkJCSAgTlVMTCwgYWNtLT53cml0ZXNpemUsIGFjbV93cml0ZV9idWxrLCBhY20pOwogCWFjbS0+d3JpdGV1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19GU0JSIHwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfZG1hID0gYWNtLT53cml0ZV9kbWE7CisJLyogYWNtLT53cml0ZXVyYi0+dHJhbnNmZXJfZG1hID0gMDsgKi8KIAogCWRldl9pbmZvKCZpbnRmLT5kZXYsICJ0dHlBQ00lZDogVVNCIEFDTSBkZXZpY2VcbiIsIG1pbm9yKTsKIApAQCAtNzY0LDcgKzkxMCw4IEBACiAKIAl1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmYWNtX2RyaXZlciwgZGF0YV9pbnRlcmZhY2UsIGFjbSk7CiAKLQl0dHlfcmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBtaW5vciwgJmludGYtPmRldik7CisJdXNiX2dldF9pbnRmKGNvbnRyb2xfaW50ZXJmYWNlKTsKKwl0dHlfcmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBtaW5vciwgJmNvbnRyb2xfaW50ZXJmYWNlLT5kZXYpOwogCiAJYWNtX3RhYmxlW21pbm9yXSA9IGFjbTsKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBhY20pOwpAQCAtNzc1LDcgKzkyMiw3IEBACiBhbGxvY19mYWlsNjoKIAl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKIGFsbG9jX2ZhaWw1OgotCXVzYl9idWZmZXJfZnJlZSh1c2JfZGV2LCBhY20tPndyaXRlc2l6ZSwgYWNtLT53cml0ZV9idWZmZXIsIGFjbS0+d3JpdGVfZG1hKTsKKwlhY21fd3JpdGVfYnVmZmVyc19mcmVlKGFjbSk7CiBhbGxvY19mYWlsNDoKIAl1c2JfYnVmZmVyX2ZyZWUodXNiX2RldiwgcmVhZHNpemUsIGFjbS0+cmVhZF9idWZmZXIsIGFjbS0+cmVhZF9kbWEpOwogYWxsb2NfZmFpbDM6CkBAIC04MDYsMTkgKzk1MywxNCBAQAogCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsgLyogd2FpdCBmb3IgYWNtX3NvZnRpbnQgKi8KIAotCXVzYl9idWZmZXJfZnJlZSh1c2JfZGV2LCBhY20tPndyaXRlc2l6ZSwgYWNtLT53cml0ZV9idWZmZXIsIGFjbS0+d3JpdGVfZG1hKTsKKwlhY21fd3JpdGVfYnVmZmVyc19mcmVlKGFjbSk7CiAJdXNiX2J1ZmZlcl9mcmVlKHVzYl9kZXYsIGFjbS0+cmVhZHNpemUsIGFjbS0+cmVhZF9idWZmZXIsIGFjbS0+cmVhZF9kbWEpOwogCXVzYl9idWZmZXJfZnJlZSh1c2JfZGV2LCBhY20tPmN0cmxzaXplLCBhY20tPmN0cmxfYnVmZmVyLCBhY20tPmN0cmxfZG1hKTsKIAogCXVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UoJmFjbV9kcml2ZXIsIGFjbS0+ZGF0YSk7CiAKIAlpZiAoIWFjbS0+dXNlZCkgewotCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoYWNtX3R0eV9kcml2ZXIsIGFjbS0+bWlub3IpOwotCQlhY21fdGFibGVbYWNtLT5taW5vcl0gPSBOVUxMOwotCQl1c2JfZnJlZV91cmIoYWNtLT5jdHJsdXJiKTsKLQkJdXNiX2ZyZWVfdXJiKGFjbS0+cmVhZHVyYik7Ci0JCXVzYl9mcmVlX3VyYihhY20tPndyaXRldXJiKTsKLQkJa2ZyZWUoYWNtKTsKKwkJYWNtX3R0eV91bnJlZ2lzdGVyKGFjbSk7CiAJCXVwKCZvcGVuX3NlbSk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmggYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKaW5kZXggOTAwOTExNC4uOTYzYTVkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaApAQCAtNTEsMTQgKzUxLDM0IEBACiAgKiBJbnRlcm5hbCBkcml2ZXIgc3RydWN0dXJlcy4KICAqLwogCisvKgorICogVGhlIG9ubHkgcmVhc29uIHRvIGhhdmUgc2V2ZXJhbCBidWZmZXJzIGlzIHRvIGFjY29tb2RhdGUgYXNzdW1wdGlvbnMKKyAqIGluIGxpbmUgZGlzY2lwbGluZXMuIFRoZXkgYXNrIGZvciBlbXB0eSBzcGFjZSBhbW91bnQsIHJlY2VpdmUgb3VyIFVSQiBzaXplLAorICogYW5kIHByb2NlZWQgdG8gaXNzdWUgc2V2ZXJhbCAxLWNoYXJhY3RlciB3cml0ZXMsIGFzc3VtaW5nIHRoZXkgd2lsbCBmaXQuCisgKiBUaGUgdmVyeSBmaXJzdCB3cml0ZSB0YWtlcyBhIGNvbXBsZXRlIFVSQi4gRm9ydHVuYXRlbHksIHRoaXMgb25seSBoYXBwZW5zCisgKiB3aGVuIHByb2Nlc3Npbmcgb25sY3IsIHNvIHdlIG9ubHkgbmVlZCAyIGJ1ZmZlcnMuCisgKi8KKyNkZWZpbmUgQUNNX05XQiAgMgorc3RydWN0IGFjbV93YiB7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWRtYV9hZGRyX3QgZG1haDsKKwlpbnQgbGVuOworCWludCB1c2U7Cit9OworCiBzdHJ1Y3QgYWNtIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwkJCQkvKiB0aGUgY29ycmVzcG9uZGluZyB1c2IgZGV2aWNlICovCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmNvbnRyb2w7CQkJLyogY29udHJvbCBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZGF0YTsJCQkvKiBkYXRhIGludGVyZmFjZSAqLwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CQkJCS8qIHRoZSBjb3JyZXNwb25kaW5nIHR0eSAqLwogCXN0cnVjdCB1cmIgKmN0cmx1cmIsICpyZWFkdXJiLCAqd3JpdGV1cmI7CS8qIHVyYnMgKi8KLQl1OCAqY3RybF9idWZmZXIsICpyZWFkX2J1ZmZlciwgKndyaXRlX2J1ZmZlcjsJLyogYnVmZmVycyBvZiB1cmJzICovCi0JZG1hX2FkZHJfdCBjdHJsX2RtYSwgcmVhZF9kbWEsIHdyaXRlX2RtYTsJLyogZG1hIGhhbmRsZXMgb2YgYnVmZmVycyAqLworCXU4ICpjdHJsX2J1ZmZlciwgKnJlYWRfYnVmZmVyOwkJCS8qIGJ1ZmZlcnMgb2YgdXJicyAqLworCWRtYV9hZGRyX3QgY3RybF9kbWEsIHJlYWRfZG1hOwkJCS8qIGRtYSBoYW5kbGVzIG9mIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgYWNtX3diIHdiW0FDTV9OV0JdOworCWludCB3cml0ZV9jdXJyZW50OwkJCQkvKiBjdXJyZW50IHdyaXRlIGJ1ZmZlciAqLworCWludCB3cml0ZV91c2VkOwkJCQkJLyogbnVtYmVyIG9mIG5vbi1lbXB0eSB3cml0ZSBidWZmZXJzICovCisJaW50IHdyaXRlX3JlYWR5OwkJCQkvKiB3cml0ZSB1cmIgaXMgbm90IHJ1bm5pbmcgKi8KKwlzcGlubG9ja190IHdyaXRlX2xvY2s7CiAJc3RydWN0IHVzYl9jZGNfbGluZV9jb2RpbmcgbGluZTsJCS8qIGJpdHMsIHN0b3AsIHBhcml0eSAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwkJCS8qIHdvcmsgcXVldWUgZW50cnkgZm9yIGxpbmUgZGlzY2lwbGluZSB3YWtpbmcgdXAgKi8KIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgYmg7CQkJLyogcnggcHJvY2Vzc2luZyAqLwpAQCAtNzEsNyArOTEsNiBAQAogCXVuc2lnbmVkIGludCBtaW5vcjsJCQkJLyogYWNtIG1pbm9yIG51bWJlciAqLwogCXVuc2lnbmVkIGNoYXIgdGhyb3R0bGU7CQkJCS8qIHRocm90dGxlZCBieSB0dHkgbGF5ZXIgKi8KIAl1bnNpZ25lZCBjaGFyIGNsb2NhbDsJCQkJLyogdGVybWlvcyBDTE9DQUwgKi8KLQl1bnNpZ25lZCBjaGFyIHJlYWR5X2Zvcl93cml0ZTsJCQkvKiB3cml0ZSB1cmIgY2FuIGJlIHVzZWQgKi8KIAl1bnNpZ25lZCBjaGFyIHJlc3VibWl0X3RvX3VudGhyb3R0bGU7CQkvKiB0aHJvdHRlbGluZyBoYXMgZGlzYWJsZWQgdGhlIHJlYWQgdXJiICovCiAJdW5zaWduZWQgaW50IGN0cmxfY2FwczsJCQkJLyogY29udHJvbCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgY2xhc3Mgc3BlY2lmaWMgaGVhZGVyICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKaW5kZXggYmJhMjJlOS4uN2NlNDNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy91c2JscC5jCkBAIC0zNzksNiArMzc5LDggQEAKIAl1c2JscC0+d3JpdGV1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAwOwogCXVzYmxwLT53Y29tcGxldGUgPSAxOyAvKiB3ZSBiZWdpbiB3cml0ZWFibGUgKi8KIAl1c2JscC0+cmNvbXBsZXRlID0gMDsKKwl1c2JscC0+d3JpdGV1cmItPnN0YXR1cyA9IDA7CisJdXNibHAtPnJlYWR1cmItPnN0YXR1cyA9IDA7CiAKIAlpZiAodXNibHAtPmJpZGlyKSB7CiAJCXVzYmxwLT5yZWFkY291bnQgPSAwOwpAQCAtNzUxLDYgKzc1Myw3IEBACiAJCQkJc2NoZWR1bGUoKTsKIAkJCX0gZWxzZSB7CiAJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQlkb3duKCZ1c2JscC0+c2VtKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWRvd24gKCZ1c2JscC0+c2VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvYnVmZmVyLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jCmluZGV4IGI3ODI3ZGYuLmZjMTViNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvYnVmZmVyLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9idWZmZXIuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiB2b2lkICpoY2RfYnVmZmVyX2FsbG9jICgKIAlzdHJ1Y3QgdXNiX2J1cyAJCSpidXMsCiAJc2l6ZV90CQkJc2l6ZSwKLQlpbnQJCQltZW1fZmxhZ3MsCisJdW5zaWduZWQJCW1lbV9mbGFncywKIAlkbWFfYWRkcl90CQkqZG1hCiApCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggNmJmYWI0Yi4uNzg3YzI3YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKQEAgLTc4NCwxNiArNzg0LDE2IEBACiAgCQlmb3IgKGkgPSAwOyBpIDwgYWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyArK2kpIHsKICAJCQlpZiAodXNiX2ludGVyZmFjZV9jbGFpbWVkKGFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldKSkgewogCQkJCWRldl93YXJuICgmcHMtPmRldi0+ZGV2LAotCQkJCQkidXNiZnM6IGludGVyZmFjZSAlZCBjbGFpbWVkICIKKwkJCQkJInVzYmZzOiBpbnRlcmZhY2UgJWQgY2xhaW1lZCBieSAlcyAiCiAJCQkJCSJ3aGlsZSAnJXMnIHNldHMgY29uZmlnICMlZFxuIiwKIAkJCQkJYWN0Y29uZmlnLT5pbnRlcmZhY2VbaV0KIAkJCQkJCS0+Y3VyX2FsdHNldHRpbmcKIAkJCQkJCS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAorCQkJCQlhY3Rjb25maWctPmludGVyZmFjZVtpXQorCQkJCQkJLT5kZXYuZHJpdmVyLT5uYW1lLAogCQkJCQljdXJyZW50LT5jb21tLCB1KTsKLSNpZiAwCS8qIEZJWE1FOiAgZW5hYmxlIGluIDIuNi4xMCBvciBzbyAqLwogIAkJCQlzdGF0dXMgPSAtRUJVU1k7CiAJCQkJYnJlYWs7Ci0jZW5kaWYKIAkJCX0KICAJCX0KICAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9oY2QtcGNpLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwppbmRleCA3MWI0YThkLi5mYzA1NjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYwpAQCAtMzgwLDYgKzM4MCw3IEBACiAJCXVzYl9oY19kaWVkIChoY2QpOwogCX0KIAorCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIEVYUE9SVF9TWU1CT0wgKHVzYl9oY2RfcGNpX3Jlc3VtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwppbmRleCAwZGEyMzczLi44NjE2MzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKQEAgLTUxOSwxMTkgKzUxOSwxMjAgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCi0gKiBSb290IEh1YiBpbnRlcnJ1cHQgdHJhbnNmZXJzIGFyZSBzeW50aGVzaXplZCB3aXRoIGEgdGltZXIuCi0gKiBDb21wbGV0aW9ucyBhcmUgY2FsbGVkIGluX2ludGVycnVwdCgpIGJ1dCBub3QgaW5faXJxKCkuCisgKiBSb290IEh1YiBpbnRlcnJ1cHQgdHJhbnNmZXJzIGFyZSBwb2xsZWQgdXNpbmcgYSB0aW1lciBpZiB0aGUKKyAqIGRyaXZlciByZXF1ZXN0cyBpdDsgb3RoZXJ3aXNlIHRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yCisgKiBjYWxsaW5nIHVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoKSB3aGVuIGFuIGV2ZW50IG9jY3Vycy4KICAqCi0gKiBOb3RlOiBzb21lIHJvb3QgaHVicyAoaW5jbHVkaW5nIGNvbW1vbiBVSENJIGJhc2VkIGRlc2lnbnMpIGNhbid0Ci0gKiBjb3JyZWN0bHkgaXNzdWUgcG9ydCBjaGFuZ2UgSVJRcy4gIFRoZXkncmUgdGhlIG9uZXMgdGhhdCBfbmVlZF8gYQotICogdGltZXI7IG1vc3Qgb3RoZXIgcm9vdCBodWJzIGRvbid0LiAgU29tZSBzeXN0ZW1zIGNvdWxkIHNhdmUgYQotICogbG90IG9mIGJhdHRlcnkgcG93ZXIgYnkgZWxpbWluYXRpbmcgdGhlc2Ugcm9vdCBodWIgdGltZXIgSVJRcy4KKyAqIENvbXBsZXRpb25zIGFyZSBjYWxsZWQgaW5faW50ZXJydXB0KCksIGJ1dCB0aGV5IG1heSBvciBtYXkgbm90CisgKiBiZSBpbl9pcnEoKS4KICAqLwotCi1zdGF0aWMgdm9pZCByaF9yZXBvcnRfc3RhdHVzICh1bnNpZ25lZCBsb25nIHB0cik7Ci0KLXN0YXRpYyBpbnQgcmhfc3RhdHVzX3VyYiAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiKSAKLXsKLQlpbnQJbGVuID0gMSArICh1cmItPmRldi0+bWF4Y2hpbGQgLyA4KTsKLQotCS8qIHJoX3RpbWVyIHByb3RlY3RlZCBieSBoY2RfZGF0YV9sb2NrICovCi0JaWYgKGhjZC0+cmhfdGltZXIuZGF0YSB8fCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPCBsZW4pIHsKLQkJZGV2X2RiZyAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsCi0JCQkJIm5vdCBxdWV1aW5nIHJoIHN0YXR1cyB1cmIsIHN0YXQgJWRcbiIsCi0JCQkJdXJiLT5zdGF0dXMpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpbml0X3RpbWVyICgmaGNkLT5yaF90aW1lcik7Ci0JaGNkLT5yaF90aW1lci5mdW5jdGlvbiA9IHJoX3JlcG9ydF9zdGF0dXM7Ci0JaGNkLT5yaF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHVyYjsKLQkvKiBVU0IgMi4wIHNwZWMgc2F5cyAyNTZtc2VjOyB0aGlzIGlzIGNsb3NlIGVub3VnaCAqLwotCWhjZC0+cmhfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWi80OwotCWFkZF90aW1lciAoJmhjZC0+cmhfdGltZXIpOwotCXVyYi0+aGNwcml2ID0gaGNkOwkvKiBub256ZXJvIHRvIGluZGljYXRlIGl0J3MgcXVldWVkICovCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHRpbWVyIGNhbGxiYWNrICovCi0KLXN0YXRpYyB2b2lkIHJoX3JlcG9ydF9zdGF0dXMgKHVuc2lnbmVkIGxvbmcgcHRyKQordm9pZCB1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHVyYgkqdXJiOwotCXN0cnVjdCB1c2JfaGNkCSpoY2Q7Ci0JaW50CQlsZW5ndGggPSAwOworCWludAkJbGVuZ3RoOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJY2hhcgkJYnVmZmVyWzRdOwkvKiBBbnkgcm9vdCBodWJzIHdpdGggPiAzMSBwb3J0cz8gKi8KIAotCXVyYiA9IChzdHJ1Y3QgdXJiICopIHB0cjsKLQlsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOwotCXNwaW5fbG9jayAoJnVyYi0+bG9jayk7Ci0KLQkvKiBkbyBub3RoaW5nIGlmIHRoZSB1cmIncyBiZWVuIHVubGlua2VkICovCi0JaWYgKCF1cmItPmRldgotCQkJfHwgdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTCi0JCQl8fCAoaGNkID0gdXJiLT5kZXYtPmJ1cy0+aGNwcml2KSA9PSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrICgmdXJiLT5sb2NrKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUgKGZsYWdzKTsKKwlpZiAoIWhjZC0+dXNlc19uZXdfcG9sbGluZyAmJiAhaGNkLT5zdGF0dXNfdXJiKQogCQlyZXR1cm47Ci0JfQogCi0JLyogY29tcGxldGUgdGhlIHN0YXR1cyB1cmIsIG9yIHJldHJpZ2dlciB0aGUgdGltZXIgKi8KLQlzcGluX2xvY2sgKCZoY2RfZGF0YV9sb2NrKTsKLQlpZiAodXJiLT5kZXYtPnN0YXRlID09IFVTQl9TVEFURV9DT05GSUdVUkVEKSB7Ci0JCWxlbmd0aCA9IGhjZC0+ZHJpdmVyLT5odWJfc3RhdHVzX2RhdGEgKAotCQkJCQloY2QsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKLQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCWhjZC0+cmhfdGltZXIuZGF0YSA9IDA7Ci0JCQl1cmItPmFjdHVhbF9sZW5ndGggPSBsZW5ndGg7Ci0JCQl1cmItPnN0YXR1cyA9IDA7Ci0JCQl1cmItPmhjcHJpdiA9IE5VTEw7CisJbGVuZ3RoID0gaGNkLT5kcml2ZXItPmh1Yl9zdGF0dXNfZGF0YShoY2QsIGJ1ZmZlcik7CisJaWYgKGxlbmd0aCA+IDApIHsKKworCQkvKiB0cnkgdG8gY29tcGxldGUgdGhlIHN0YXR1cyB1cmIgKi8KKwkJbG9jYWxfaXJxX3NhdmUgKGZsYWdzKTsKKwkJc3Bpbl9sb2NrKCZoY2Rfcm9vdF9odWJfbG9jayk7CisJCXVyYiA9IGhjZC0+c3RhdHVzX3VyYjsKKwkJaWYgKHVyYikgeworCQkJc3Bpbl9sb2NrKCZ1cmItPmxvY2spOworCQkJaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworCQkJCWhjZC0+cG9sbF9wZW5kaW5nID0gMDsKKwkJCQloY2QtPnN0YXR1c191cmIgPSBOVUxMOworCQkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCQl1cmItPmhjcHJpdiA9IE5VTEw7CisJCQkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuZ3RoOworCQkJCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyLCBsZW5ndGgpOworCQkJfSBlbHNlCQkvKiB1cmIgaGFzIGJlZW4gdW5saW5rZWQgKi8KKwkJCQlsZW5ndGggPSAwOworCQkJc3Bpbl91bmxvY2soJnVyYi0+bG9jayk7CiAJCX0gZWxzZQotCQkJbW9kX3RpbWVyICgmaGNkLT5yaF90aW1lciwgamlmZmllcyArIEhaLzQpOwotCX0KLQlzcGluX3VubG9jayAoJmhjZF9kYXRhX2xvY2spOwotCXNwaW5fdW5sb2NrICgmdXJiLT5sb2NrKTsKKwkJCWxlbmd0aCA9IDA7CisJCXNwaW5fdW5sb2NrKCZoY2Rfcm9vdF9odWJfbG9jayk7CiAKLQkvKiBsb2NhbCBpcnFzIGFyZSBhbHdheXMgYmxvY2tlZCBpbiBjb21wbGV0aW9ucyAqLwotCWlmIChsZW5ndGggPiAwKQotCQl1c2JfaGNkX2dpdmViYWNrX3VyYiAoaGNkLCB1cmIsIE5VTEwpOwotCWxvY2FsX2lycV9yZXN0b3JlIChmbGFncyk7CisJCS8qIGxvY2FsIGlycXMgYXJlIGFsd2F5cyBibG9ja2VkIGluIGNvbXBsZXRpb25zICovCisJCWlmIChsZW5ndGggPiAwKQorCQkJdXNiX2hjZF9naXZlYmFja191cmIgKGhjZCwgdXJiLCBOVUxMKTsKKwkJZWxzZQorCQkJaGNkLT5wb2xsX3BlbmRpbmcgPSAxOworCQlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOworCX0KKworCS8qIFRoZSBVU0IgMi4wIHNwZWMgc2F5cyAyNTYgbXMuICBUaGlzIGlzIGNsb3NlIGVub3VnaCBhbmQgd29uJ3QKKwkgKiBleGNlZWQgdGhhdCBsaW1pdCBpZiBIWiBpcyAxMDAuICovCisJaWYgKGhjZC0+dXNlc19uZXdfcG9sbGluZyA/IGhjZC0+cG9sbF9yaCA6CisJCQkobGVuZ3RoID09IDAgJiYgaGNkLT5zdGF0dXNfdXJiICE9IE5VTEwpKQorCQltb2RfdGltZXIgKCZoY2QtPnJoX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2RfcG9sbF9yaF9zdGF0dXMpOworCisvKiB0aW1lciBjYWxsYmFjayAqLworc3RhdGljIHZvaWQgcmhfdGltZXJfZnVuYyAodW5zaWduZWQgbG9uZyBfaGNkKQoreworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMoKHN0cnVjdCB1c2JfaGNkICopIF9oY2QpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitzdGF0aWMgaW50IHJoX3F1ZXVlX3N0YXR1cyAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiKQoreworCWludAkJcmV0dmFsOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50CQlsZW4gPSAxICsgKHVyYi0+ZGV2LT5tYXhjaGlsZCAvIDgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZoY2Rfcm9vdF9odWJfbG9jaywgZmxhZ3MpOworCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCS8qIGFscmVhZHkgdW5saW5rZWQgKi8KKwkJcmV0dmFsID0gdXJiLT5zdGF0dXM7CisJZWxzZSBpZiAoaGNkLT5zdGF0dXNfdXJiIHx8IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA8IGxlbikgeworCQlkZXZfZGJnIChoY2QtPnNlbGYuY29udHJvbGxlciwgIm5vdCBxdWV1aW5nIHJoIHN0YXR1cyB1cmJcbiIpOworCQlyZXR2YWwgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCWhjZC0+c3RhdHVzX3VyYiA9IHVyYjsKKwkJdXJiLT5oY3ByaXYgPSBoY2Q7CS8qIGluZGljYXRlIGl0J3MgcXVldWVkICovCisKKwkJaWYgKCFoY2QtPnVzZXNfbmV3X3BvbGxpbmcpCisJCQltb2RfdGltZXIgKCZoY2QtPnJoX3RpbWVyLCBqaWZmaWVzICsKKwkJCQkJbXNlY3NfdG9famlmZmllcygyNTApKTsKKworCQkvKiBJZiBhIHN0YXR1cyBjaGFuZ2UgaGFzIGFscmVhZHkgb2NjdXJyZWQsIHJlcG9ydCBpdCBBU0FQICovCisJCWVsc2UgaWYgKGhjZC0+cG9sbF9wZW5kaW5nKQorCQkJbW9kX3RpbWVyICgmaGNkLT5yaF90aW1lciwgamlmZmllcyk7CisJCXJldHZhbCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZoY2Rfcm9vdF9odWJfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKIHN0YXRpYyBpbnQgcmhfdXJiX2VucXVldWUgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikKIHsKLQlpZiAodXNiX3BpcGVpbnQgKHVyYi0+cGlwZSkpIHsKLQkJaW50CQlyZXR2YWw7Ci0JCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZoY2RfZGF0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHZhbCA9IHJoX3N0YXR1c191cmIgKGhjZCwgdXJiKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmhjZF9kYXRhX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9CisJaWYgKHVzYl9waXBlaW50ICh1cmItPnBpcGUpKQorCQlyZXR1cm4gcmhfcXVldWVfc3RhdHVzIChoY2QsIHVyYik7CiAJaWYgKHVzYl9waXBlY29udHJvbCAodXJiLT5waXBlKSkKIAkJcmV0dXJuIHJoX2NhbGxfY29udHJvbCAoaGNkLCB1cmIpOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKy8qIEFzeW5jaHJvbm91cyB1bmxpbmtzIG9mIHJvb3QtaHViIGNvbnRyb2wgVVJCcyBhcmUgbGVnYWwsIGJ1dCB0aGV5CisgKiBkb24ndCBkbyBhbnl0aGluZy4gIFN0YXR1cyBVUkIgdW5saW5rcyBtdXN0IGJlIG1hZGUgaW4gcHJvY2VzcyBjb250ZXh0CisgKiB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KKyAqLwogc3RhdGljIGludCB1c2JfcmhfdXJiX2RlcXVldWUgKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikKIHsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOworCWlmICh1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkgPT0gMCkgewkvKiBDb250cm9sIFVSQiAqLworCQlpZiAoaW5faW50ZXJydXB0KCkpCisJCQlyZXR1cm4gMDsJCS8qIG5vdGhpbmcgdG8gZG8gKi8KIAotCS8qIG5vdGU6ICBhbHdheXMgYSBzeW5jaHJvbm91cyB1bmxpbmsgKi8KLQlpZiAoKHVuc2lnbmVkIGxvbmcpIHVyYiA9PSBoY2QtPnJoX3RpbWVyLmRhdGEpIHsKLQkJZGVsX3RpbWVyX3N5bmMgKCZoY2QtPnJoX3RpbWVyKTsKLQkJaGNkLT5yaF90aW1lci5kYXRhID0gMDsKLQotCQlsb2NhbF9pcnFfc2F2ZSAoZmxhZ3MpOwotCQl1cmItPmhjcHJpdiA9IE5VTEw7Ci0JCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiIChoY2QsIHVyYiwgTlVMTCk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlIChmbGFncyk7Ci0KLQl9IGVsc2UgaWYgKHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSA9PSAwKSB7CiAJCXNwaW5fbG9ja19pcnEoJnVyYi0+bG9jayk7CS8qIGZyb20gdXNiX2tpbGxfdXJiICovCiAJCSsrdXJiLT5yZWplY3Q7CiAJCXNwaW5fdW5sb2NrX2lycSgmdXJiLT5sb2NrKTsKQEAgLTY0Miw4ICs2NDMsMjIgQEAKIAkJc3Bpbl9sb2NrX2lycSgmdXJiLT5sb2NrKTsKIAkJLS11cmItPnJlamVjdDsKIAkJc3Bpbl91bmxvY2tfaXJxKCZ1cmItPmxvY2spOwotCX0gZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gZWxzZSB7CQkJCS8qIFN0YXR1cyBVUkIgKi8KKwkJaWYgKCFoY2QtPnVzZXNfbmV3X3BvbGxpbmcpCisJCQlkZWxfdGltZXJfc3luYyAoJmhjZC0+cmhfdGltZXIpOworCQlsb2NhbF9pcnFfZGlzYWJsZSAoKTsKKwkJc3Bpbl9sb2NrICgmaGNkX3Jvb3RfaHViX2xvY2spOworCQlpZiAodXJiID09IGhjZC0+c3RhdHVzX3VyYikgeworCQkJaGNkLT5zdGF0dXNfdXJiID0gTlVMTDsKKwkJCXVyYi0+aGNwcml2ID0gTlVMTDsKKwkJfSBlbHNlCisJCQl1cmIgPSBOVUxMOwkJLyogd2Fzbid0IGZ1bGx5IHF1ZXVlZCAqLworCQlzcGluX3VubG9jayAoJmhjZF9yb290X2h1Yl9sb2NrKTsKKwkJaWYgKHVyYikKKwkJCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiIChoY2QsIHVyYiwgTlVMTCk7CisJCWxvY2FsX2lycV9lbmFibGUgKCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04MTcsMzAgKzgzMiwyMiBAQAogfQogCiAvKioKLSAqIHVzYl9oY2RfcmVnaXN0ZXJfcm9vdF9odWIgLSBjYWxsZWQgYnkgSENEIHRvIHJlZ2lzdGVyIGl0cyByb290IGh1YiAKKyAqIHJlZ2lzdGVyX3Jvb3RfaHViIC0gY2FsbGVkIGJ5IHVzYl9hZGRfaGNkKCkgdG8gcmVnaXN0ZXIgYSByb290IGh1YgogICogQHVzYl9kZXY6IHRoZSB1c2Igcm9vdCBodWIgZGV2aWNlIHRvIGJlIHJlZ2lzdGVyZWQuCiAgKiBAaGNkOiBob3N0IGNvbnRyb2xsZXIgZm9yIHRoaXMgcm9vdCBodWIKICAqCi0gKiBUaGUgVVNCIGhvc3QgY29udHJvbGxlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHJlZ2lzdGVyIHRoZSByb290IGh1YgotICogcHJvcGVybHkgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbS4gIEl0IHNldHMgdXAgdGhlIGRldmljZSBwcm9wZXJseSBpbgotICogdGhlIGRldmljZSB0cmVlIGFuZCBzdG9yZXMgdGhlIHJvb3RfaHViIHBvaW50ZXIgaW4gdGhlIGJ1cyBzdHJ1Y3R1cmUsCi0gKiB0aGVuIGNhbGxzIHVzYl9uZXdfZGV2aWNlKCkgdG8gcmVnaXN0ZXIgdGhlIHVzYiBkZXZpY2UuICBJdCBhbHNvCi0gKiBhc3NpZ25zIHRoZSByb290IGh1YidzIFVTQiBhZGRyZXNzIChhbHdheXMgMSkuCisgKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyB0aGUgcm9vdCBodWIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbS4gIEl0IHNldHMgdXAKKyAqIHRoZSBkZXZpY2UgcHJvcGVybHkgaW4gdGhlIGRldmljZSB0cmVlIGFuZCBzdG9yZXMgdGhlIHJvb3RfaHViIHBvaW50ZXIKKyAqIGluIHRoZSBidXMgc3RydWN0dXJlLCB0aGVuIGNhbGxzIHVzYl9uZXdfZGV2aWNlKCkgdG8gcmVnaXN0ZXIgdGhlIHVzYgorICogZGV2aWNlLiAgSXQgYWxzbyBhc3NpZ25zIHRoZSByb290IGh1YidzIFVTQiBhZGRyZXNzIChhbHdheXMgMSkuCiAgKi8KLWludCB1c2JfaGNkX3JlZ2lzdGVyX3Jvb3RfaHViIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHVzYl9oY2QgKmhjZCkKK3N0YXRpYyBpbnQgcmVnaXN0ZXJfcm9vdF9odWIgKHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2LAorCQlzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYgPSBoY2QtPnNlbGYuY29udHJvbGxlcjsKIAljb25zdCBpbnQgZGV2bnVtID0gMTsKIAlpbnQgcmV0dmFsOwogCi0JLyogaGNkLT5kcml2ZXItPnN0YXJ0KCkgcmVwb3J0ZWQgY2FuX3dha2V1cCwgcHJvYmFibHkgd2l0aAotCSAqIGFzc2lzdGFuY2UgZnJvbSBib2FyZCdzIGJvb3QgZmlybXdhcmUuCi0JICogTk9URTogIG5vcm1hbCBkZXZpY2VzIHdvbid0IGVuYWJsZSB3YWtldXAgYnkgZGVmYXVsdC4KLQkgKi8KLQlpZiAoaGNkLT5jYW5fd2FrZXVwKQotCQlkZXZfZGJnIChwYXJlbnRfZGV2LCAic3VwcG9ydHMgVVNCIHJlbW90ZSB3YWtldXBcbiIpOwotCWhjZC0+cmVtb3RlX3dha2V1cCA9IGhjZC0+Y2FuX3dha2V1cDsKLQogCXVzYl9kZXYtPmRldm51bSA9IGRldm51bTsKIAl1c2JfZGV2LT5idXMtPmRldm51bV9uZXh0ID0gZGV2bnVtICsgMTsKIAltZW1zZXQgKCZ1c2JfZGV2LT5idXMtPmRldm1hcC5kZXZpY2VtYXAsIDAsCkBAIC04ODMsNyArODkwLDE2IEBACiAKIAlyZXR1cm4gcmV0dmFsOwogfQotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1Yik7CisKK3ZvaWQgdXNiX2VuYWJsZV9yb290X2h1Yl9pcnEgKHN0cnVjdCB1c2JfYnVzICpidXMpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKworCWhjZCA9IGNvbnRhaW5lcl9vZiAoYnVzLCBzdHJ1Y3QgdXNiX2hjZCwgc2VsZik7CisJaWYgKGhjZC0+ZHJpdmVyLT5odWJfaXJxX2VuYWJsZSAmJiAhaGNkLT5wb2xsX3JoICYmCisJCQloY2QtPnN0YXRlICE9IEhDX1NUQVRFX0hBTFQpCisJCWhjZC0+ZHJpdmVyLT5odWJfaXJxX2VuYWJsZSAoaGNkKTsKK30KIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTA5Niw3ICsxMTEyLDcgQEAKICAqIGV4cGVjdHMgdXNiX3N1Ym1pdF91cmIoKSB0byBoYXZlIHNhbml0eSBjaGVja2VkIGFuZCBjb25kaXRpb25lZCBhbGwKICAqIGlucHV0cyBpbiB0aGUgdXJiCiAgKi8KLXN0YXRpYyBpbnQgaGNkX3N1Ym1pdF91cmIgKHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncykKK3N0YXRpYyBpbnQgaGNkX3N1Ym1pdF91cmIgKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWludAkJCXN0YXR1czsKIAlzdHJ1Y3QgdXNiX2hjZAkJKmhjZCA9IHVyYi0+ZGV2LT5idXMtPmhjcHJpdjsKQEAgLTEzNDgsNyArMTM2NCw4IEBACiAKIAloY2QgPSB1ZGV2LT5idXMtPmhjcHJpdjsKIAotCVdBUk5fT04gKCFIQ19JU19SVU5OSU5HIChoY2QtPnN0YXRlKSAmJiBoY2QtPnN0YXRlICE9IEhDX1NUQVRFX0hBTFQpOworCVdBUk5fT04gKCFIQ19JU19SVU5OSU5HIChoY2QtPnN0YXRlKSAmJiBoY2QtPnN0YXRlICE9IEhDX1NUQVRFX0hBTFQgJiYKKwkJCXVkZXYtPnN0YXRlICE9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCk7CiAKIAlsb2NhbF9pcnFfZGlzYWJsZSAoKTsKIApAQCAtMTYxMiw2ICsxNjI5LDggQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmaGNkX3Jvb3RfaHViX2xvY2ssIGZsYWdzKTsKIAlpZiAoaGNkLT5yaF9yZWdpc3RlcmVkKSB7CisJCWhjZC0+cG9sbF9yaCA9IDA7CisJCWRlbF90aW1lcigmaGNkLT5yaF90aW1lcik7CiAKIAkJLyogbWFrZSBraHViZCBjbGVhbiB1cCBvbGQgdXJicyBhbmQgZGV2aWNlcyAqLwogCQl1c2Jfc2V0X2RldmljZV9zdGF0ZSAoaGNkLT5zZWxmLnJvb3RfaHViLApAQCAtMTY2NSw2ICsxNjg0LDggQEAKIAloY2QtPnNlbGYuYnVzX25hbWUgPSBidXNfbmFtZTsKIAogCWluaXRfdGltZXIoJmhjZC0+cmhfdGltZXIpOworCWhjZC0+cmhfdGltZXIuZnVuY3Rpb24gPSByaF90aW1lcl9mdW5jOworCWhjZC0+cmhfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBoY2Q7CiAKIAloY2QtPmRyaXZlciA9IGRyaXZlcjsKIAloY2QtPnByb2R1Y3RfZGVzYyA9IChkcml2ZXItPnByb2R1Y3RfZGVzYykgPyBkcml2ZXItPnByb2R1Y3RfZGVzYyA6CkBAIC0xNjk0LDcgKzE3MTUsOCBAQAogaW50IHVzYl9hZGRfaGNkKHN0cnVjdCB1c2JfaGNkICpoY2QsCiAJCXVuc2lnbmVkIGludCBpcnFudW0sIHVuc2lnbmVkIGxvbmcgaXJxZmxhZ3MpCiB7Ci0JaW50CXJldHZhbDsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCB1c2JfZGV2aWNlICpyaGRldjsKIAogCWRldl9pbmZvKGhjZC0+c2VsZi5jb250cm9sbGVyLCAiJXNcbiIsIGhjZC0+cHJvZHVjdF9kZXNjKTsKIApAQCAtMTcxMCw3ICsxNzMyLDcgQEAKIAl9CiAKIAlpZiAoKHJldHZhbCA9IHVzYl9yZWdpc3Rlcl9idXMoJmhjZC0+c2VsZikpIDwgMCkKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl9yZWdpc3Rlcl9idXM7CiAKIAlpZiAoaGNkLT5kcml2ZXItPmlycSkgewogCQljaGFyCWJ1Zls4XSwgKmJ1ZnAgPSBidWY7CkBAIC0xNzI3LDcgKzE3NDksNyBAQAogCQkJCWhjZC0+aXJxX2Rlc2NyLCBoY2QpKSAhPSAwKSB7CiAJCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLAogCQkJCQkicmVxdWVzdCBpbnRlcnJ1cHQgJXMgZmFpbGVkXG4iLCBidWZwKTsKLQkJCWdvdG8gZXJyMjsKKwkJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOwogCQl9CiAJCWhjZC0+aXJxID0gaXJxbnVtOwogCQlkZXZfaW5mbyhoY2QtPnNlbGYuY29udHJvbGxlciwgImlycSAlcywgJXMgMHglMDhsbHhcbiIsIGJ1ZnAsCkBAIC0xNzQzLDE5ICsxNzY1LDU1IEBACiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaGNkLT5yc3JjX3N0YXJ0KTsKIAl9CiAKKwkvKiBBbGxvY2F0ZSB0aGUgcm9vdCBodWIgYmVmb3JlIGNhbGxpbmcgaGNkLT5kcml2ZXItPnN0YXJ0KCksCisJICogYnV0IGRvbid0IHJlZ2lzdGVyIGl0IHVudGlsIGFmdGVyd2FyZCBzbyB0aGF0IHRoZSBoYXJkd2FyZQorCSAqIGlzIHJ1bm5pbmcuCisJICovCisJaWYgKChyaGRldiA9IHVzYl9hbGxvY19kZXYoTlVMTCwgJmhjZC0+c2VsZiwgMCkpID09IE5VTEwpIHsKKwkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwgInVuYWJsZSB0byBhbGxvY2F0ZSByb290IGh1YlxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jYXRlX3Jvb3RfaHViOworCX0KKwlyaGRldi0+c3BlZWQgPSAoaGNkLT5kcml2ZXItPmZsYWdzICYgSENEX1VTQjIpID8gVVNCX1NQRUVEX0hJR0ggOgorCQkJVVNCX1NQRUVEX0ZVTEw7CisKKwkvKiBBbHRob3VnaCBpbiBwcmluY2lwbGUgaGNkLT5kcml2ZXItPnN0YXJ0KCkgbWlnaHQgbmVlZCB0byB1c2UgcmhkZXYsCisJICogbm9uZSBvZiB0aGUgY3VycmVudCBkcml2ZXJzIGRvLgorCSAqLwogCWlmICgocmV0dmFsID0gaGNkLT5kcml2ZXItPnN0YXJ0KGhjZCkpIDwgMCkgewogCQlkZXZfZXJyKGhjZC0+c2VsZi5jb250cm9sbGVyLCAic3RhcnR1cCBlcnJvciAlZFxuIiwgcmV0dmFsKTsKLQkJZ290byBlcnIzOworCQlnb3RvIGVycl9oY2RfZHJpdmVyX3N0YXJ0OwogCX0KIAorCS8qIGhjZC0+ZHJpdmVyLT5zdGFydCgpIHJlcG9ydGVkIGNhbl93YWtldXAsIHByb2JhYmx5IHdpdGgKKwkgKiBhc3Npc3RhbmNlIGZyb20gYm9hcmQncyBib290IGZpcm13YXJlLgorCSAqIE5PVEU6ICBub3JtYWwgZGV2aWNlcyB3b24ndCBlbmFibGUgd2FrZXVwIGJ5IGRlZmF1bHQuCisJICovCisJaWYgKGhjZC0+Y2FuX3dha2V1cCkKKwkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgInN1cHBvcnRzIFVTQiByZW1vdGUgd2FrZXVwXG4iKTsKKwloY2QtPnJlbW90ZV93YWtldXAgPSBoY2QtPmNhbl93YWtldXA7CisKKwlpZiAoKHJldHZhbCA9IHJlZ2lzdGVyX3Jvb3RfaHViKHJoZGV2LCBoY2QpKSAhPSAwKQorCQlnb3RvIGVycl9yZWdpc3Rlcl9yb290X2h1YjsKKworCWlmIChoY2QtPnVzZXNfbmV3X3BvbGxpbmcgJiYgaGNkLT5wb2xsX3JoKQorCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CiAJcmV0dXJuIHJldHZhbDsKIAotIGVycjM6CisgZXJyX3JlZ2lzdGVyX3Jvb3RfaHViOgorCWhjZC0+ZHJpdmVyLT5zdG9wKGhjZCk7CisKKyBlcnJfaGNkX2RyaXZlcl9zdGFydDoKKwl1c2JfcHV0X2RldihyaGRldik7CisKKyBlcnJfYWxsb2NhdGVfcm9vdF9odWI6CiAJaWYgKGhjZC0+aXJxID49IDApCiAJCWZyZWVfaXJxKGlycW51bSwgaGNkKTsKLSBlcnIyOgorCisgZXJyX3JlcXVlc3RfaXJxOgogCXVzYl9kZXJlZ2lzdGVyX2J1cygmaGNkLT5zZWxmKTsKLSBlcnIxOgorCisgZXJyX3JlZ2lzdGVyX2J1czoKIAloY2RfYnVmZmVyX2Rlc3Ryb3koaGNkKTsKIAlyZXR1cm4gcmV0dmFsOwogfSAKQEAgLTE3ODIsNiArMTg0MCw5IEBACiAJc3Bpbl91bmxvY2tfaXJxICgmaGNkX3Jvb3RfaHViX2xvY2spOwogCXVzYl9kaXNjb25uZWN0KCZoY2QtPnNlbGYucm9vdF9odWIpOwogCisJaGNkLT5wb2xsX3JoID0gMDsKKwlkZWxfdGltZXJfc3luYygmaGNkLT5yaF90aW1lcik7CisKIAloY2QtPmRyaXZlci0+c3RvcChoY2QpOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaAppbmRleCAzMjVhNTE2Li42N2RiNGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKQEAgLTY1LDcgKzY1LDggQEAKIAljb25zdCBjaGFyCQkqcHJvZHVjdF9kZXNjOwkvKiBwcm9kdWN0L3ZlbmRvciBzdHJpbmcgKi8KIAljaGFyCQkJaXJxX2Rlc2NyWzI0XTsJLyogZHJpdmVyICsgYnVzICMgKi8KIAotCXN0cnVjdCB0aW1lcl9saXN0CXJoX3RpbWVyOwkvKiBkcml2ZXMgcm9vdCBodWIgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdAlyaF90aW1lcjsJLyogZHJpdmVzIHJvb3QtaHViIHBvbGxpbmcgKi8KKwlzdHJ1Y3QgdXJiCQkqc3RhdHVzX3VyYjsJLyogdGhlIGN1cnJlbnQgc3RhdHVzIHVyYiAqLwogCiAJLyoKIAkgKiBoYXJkd2FyZSBpbmZvL3N0YXRlCkBAIC03NiwxMCArNzcsMTcgQEAKIAl1bnNpZ25lZAkJcmVtb3RlX3dha2V1cDoxOy8qIHN3IHNob3VsZCB1c2Ugd2FrZXVwPyAqLwogCXVuc2lnbmVkCQlyaF9yZWdpc3RlcmVkOjE7LyogaXMgcm9vdCBodWIgcmVnaXN0ZXJlZD8gKi8KIAorCS8qIFRoZSBuZXh0IGZsYWcgaXMgYSBzdG9wZ2FwLCB0byBiZSByZW1vdmVkIHdoZW4gYWxsIHRoZSBIQ0RzCisJICogc3VwcG9ydCB0aGUgbmV3IHJvb3QtaHViIHBvbGxpbmcgbWVjaGFuaXNtLiAqLworCXVuc2lnbmVkCQl1c2VzX25ld19wb2xsaW5nOjE7CisJdW5zaWduZWQJCXBvbGxfcmg6MTsJLyogcG9sbCBmb3Igcmggc3RhdHVzPyAqLworCXVuc2lnbmVkCQlwb2xsX3BlbmRpbmc6MTsJLyogc3RhdHVzIGhhcyBjaGFuZ2VkPyAqLworCiAJaW50CQkJaXJxOwkJLyogaXJxIGFsbG9jYXRlZCAqLwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CQkvKiBkZXZpY2UgbWVtb3J5L2lvICovCiAJdTY0CQkJcnNyY19zdGFydDsJLyogbWVtb3J5L2lvIHJlc291cmNlIHN0YXJ0ICovCiAJdTY0CQkJcnNyY19sZW47CS8qIG1lbW9yeS9pbyByZXNvdXJjZSBsZW5ndGggKi8KKwl1bnNpZ25lZAkJcG93ZXJfYnVkZ2V0OwkvKiBpbiBtQSwgMCA9IG5vIGxpbWl0ICovCiAKICNkZWZpbmUgSENEX0JVRkZFUl9QT09MUwk0CiAJc3RydWN0IGRtYV9wb29sCQkqcG9vbCBbSENEX0JVRkZFUl9QT09MU107CkBAIC0xMzQsMTIgKzE0MiwxMiBAQAogCiBzdHJ1Y3QgdXNiX29wZXJhdGlvbnMgewogCWludCAoKmdldF9mcmFtZV9udW1iZXIpIChzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldik7Ci0JaW50ICgqc3VibWl0X3VyYikgKHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncyk7CisJaW50ICgqc3VibWl0X3VyYikgKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKTsKIAlpbnQgKCp1bmxpbmtfdXJiKSAoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsKIAogCS8qIGFsbG9jYXRlIGRtYS1jb25zaXN0ZW50IGJ1ZmZlciBmb3IgVVJCX0RNQV9OT01BUFBJTkcgKi8KIAl2b2lkICooKmJ1ZmZlcl9hbGxvYykoc3RydWN0IHVzYl9idXMgKmJ1cywgc2l6ZV90IHNpemUsCi0JCQlpbnQgbWVtX2ZsYWdzLAorCQkJdW5zaWduZWQgbWVtX2ZsYWdzLAogCQkJZG1hX2FkZHJfdCAqZG1hKTsKIAl2b2lkICgqYnVmZmVyX2ZyZWUpKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLAogCQkJdm9pZCAqYWRkciwgZG1hX2FkZHJfdCBkbWEpOwpAQCAtMTkyLDcgKzIwMCw3IEBACiAJaW50CSgqdXJiX2VucXVldWUpIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLAogCQkJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAogCQkJCQlzdHJ1Y3QgdXJiICp1cmIsCi0JCQkJCWludCBtZW1fZmxhZ3MpOworCQkJCQl1bnNpZ25lZCBtZW1fZmxhZ3MpOwogCWludAkoKnVyYl9kZXF1ZXVlKSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiKTsKIAogCS8qIGh3IHN5bmNoLCBmcmVlaW5nIGVuZHBvaW50IHJlc291cmNlcyB0aGF0IHVyYl9kZXF1ZXVlIGNhbid0ICovCkBAIC0yMDcsNiArMjE1LDggQEAKIAlpbnQJCSgqaHViX3N1c3BlbmQpKHN0cnVjdCB1c2JfaGNkICopOwogCWludAkJKCpodWJfcmVzdW1lKShzdHJ1Y3QgdXNiX2hjZCAqKTsKIAlpbnQJCSgqc3RhcnRfcG9ydF9yZXNldCkoc3RydWN0IHVzYl9oY2QgKiwgdW5zaWduZWQgcG9ydF9udW0pOworCXZvaWQJCSgqaHViX2lycV9lbmFibGUpKHN0cnVjdCB1c2JfaGNkICopOworCQkvKiBOZWVkZWQgb25seSBpZiBwb3J0LWNoYW5nZSBJUlFzIGFyZSBsZXZlbC10cmlnZ2VyZWQgKi8KIH07CiAKIGV4dGVybiB2b2lkIHVzYl9oY2RfZ2l2ZWJhY2tfdXJiIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKQEAgLTIzNywxMyArMjQ3LDE1IEBACiB2b2lkIGhjZF9idWZmZXJfZGVzdHJveSAoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiAKIHZvaWQgKmhjZF9idWZmZXJfYWxsb2MgKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLAotCWludCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSk7CisJdW5zaWduZWQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOwogdm9pZCBoY2RfYnVmZmVyX2ZyZWUgKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLAogCXZvaWQgKmFkZHIsIGRtYV9hZGRyX3QgZG1hKTsKIAogLyogZ2VuZXJpYyBidXMgZ2x1ZSwgbmVlZGVkIGZvciBob3N0IGNvbnRyb2xsZXJzIHRoYXQgZG9uJ3QgdXNlIFBDSSAqLwogZXh0ZXJuIGlycXJldHVybl90IHVzYl9oY2RfaXJxIChpbnQgaXJxLCB2b2lkICpfX2hjZCwgc3RydWN0IHB0X3JlZ3MgKnIpOworCiBleHRlcm4gdm9pZCB1c2JfaGNfZGllZCAoc3RydWN0IHVzYl9oY2QgKmhjZCk7CitleHRlcm4gdm9pZCB1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0zNDEsOSArMzUzLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCB1c2JfYnVzICp1c2JfYWxsb2NfYnVzIChzdHJ1Y3QgdXNiX29wZXJhdGlvbnMgKik7CiAKLWV4dGVybiBpbnQgdXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1YiAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsCi0JCXN0cnVjdCB1c2JfaGNkICpoY2QpOwotCiBleHRlcm4gdm9pZCB1c2JfaGNkX3Jlc3VtZV9yb290X2h1YiAoc3RydWN0IHVzYl9oY2QgKmhjZCk7CiAKIGV4dGVybiB2b2lkIHVzYl9zZXRfZGV2aWNlX3N0YXRlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LApAQCAtMzYwLDYgKzM2OSw4IEBACiBleHRlcm4gc3RydWN0IHVzYl9idXMgKnVzYl9idXNfZ2V0IChzdHJ1Y3QgdXNiX2J1cyAqYnVzKTsKIGV4dGVybiB2b2lkIHVzYl9idXNfcHV0IChzdHJ1Y3QgdXNiX2J1cyAqYnVzKTsKIAorZXh0ZXJuIHZvaWQgdXNiX2VuYWJsZV9yb290X2h1Yl9pcnEgKHN0cnVjdCB1c2JfYnVzICpidXMpOworCiBleHRlcm4gaW50IHVzYl9maW5kX2ludGVyZmFjZV9kcml2ZXIgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IGQyZDY0OGUuLmMzZTQ2ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiZGV2aWNlX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00Nyw4ICs0OCw3IEBACiAvKiBXYWtlcyB1cCBraHViZCAqLwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGtodWJkX3dhaXQpOwogCi1zdGF0aWMgcGlkX3Qga2h1YmRfcGlkID0gMDsJCQkvKiBQSUQgb2Yga2h1YmQgKi8KLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oa2h1YmRfZXhpdGVkKTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtodWJkX3Rhc2s7CiAKIC8qIGN5Y2xlIGxlZHMgb24gaHVicyB0aGF0IGFyZW4ndCBibGlua2luZyBmb3IgYXR0ZW50aW9uICovCiBzdGF0aWMgaW50IGJsaW5rZW5saWdodHMgPSAwOwpAQCAtNjQzLDE1ICs2NDMsMjEgQEAKIAkJbWVzc2FnZSA9ICJjYW4ndCBnZXQgaHViIHN0YXR1cyI7CiAJCWdvdG8gZmFpbDsKIAl9Ci0JY3B1X3RvX2xlMTZzKCZodWJzdGF0dXMpOwotCWlmICgoaHVic3RhdHVzICYgKDEgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQpKSA9PSAwKSB7CisJbGUxNl90b19jcHVzKCZodWJzdGF0dXMpOworCWlmIChoZGV2ID09IGhkZXYtPmJ1cy0+cm9vdF9odWIpIHsKKwkJc3RydWN0IHVzYl9oY2QgKmhjZCA9CisJCQkJY29udGFpbmVyX29mKGhkZXYtPmJ1cywgc3RydWN0IHVzYl9oY2QsIHNlbGYpOworCisJCWh1Yi0+cG93ZXJfYnVkZ2V0ID0gbWluKDUwMHUsIGhjZC0+cG93ZXJfYnVkZ2V0KSAvIDI7CisJfSBlbHNlIGlmICgoaHVic3RhdHVzICYgKDEgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQpKSA9PSAwKSB7CiAJCWRldl9kYmcoaHViX2RldiwgImh1YiBjb250cm9sbGVyIGN1cnJlbnQgcmVxdWlyZW1lbnQ6ICVkbUFcbiIsCiAJCQlodWItPmRlc2NyaXB0b3ItPmJIdWJDb250ckN1cnJlbnQpOwogCQlodWItPnBvd2VyX2J1ZGdldCA9ICg1MDEgLSBodWItPmRlc2NyaXB0b3ItPmJIdWJDb250ckN1cnJlbnQpCiAJCQkJCS8gMjsKKwl9CisJaWYgKGh1Yi0+cG93ZXJfYnVkZ2V0KQogCQlkZXZfZGJnKGh1Yl9kZXYsICIlZG1BIGJ1cyBwb3dlciBidWRnZXQgZm9yIGNoaWxkcmVuXG4iLAogCQkJaHViLT5wb3dlcl9idWRnZXQgKiAyKTsKLQl9CiAKIAogCXJldCA9IGh1Yl9odWJfc3RhdHVzKGh1YiwgJmh1YnN0YXR1cywgJmh1YmNoYW5nZSk7CkBAIC0xNzI3LDcgKzE3MzMsNyBAQAogCQkJc3RydWN0IHVzYl9kcml2ZXIJKmRyaXZlcjsKIAogCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOwotCQkJaWYgKGludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9PSBQTVNHX1NVU1BFTkQpCisJCQlpZiAoaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID09IFBNU0dfT04pCiAJCQkJY29udGludWU7CiAJCQlpZiAoIWludGYtPmRldi5kcml2ZXIpIHsKIAkJCQkvKiBGSVhNRSBtYXliZSBmb3JjZSB0byBhbHQgMCAqLwpAQCAtMjc4Nyw2ICsyNzkzLDExIEBACiAKIAkJaHViLT5hY3RpdmF0aW5nID0gMDsKIAorCQkvKiBJZiB0aGlzIGlzIGEgcm9vdCBodWIsIHRlbGwgdGhlIEhDRCBpdCdzIG9rYXkgdG8KKwkJICogcmUtZW5hYmxlIHBvcnQtY2hhbmdlIGludGVycnVwdHMgbm93LiAqLworCQlpZiAoIWhkZXYtPnBhcmVudCkKKwkJCXVzYl9lbmFibGVfcm9vdF9odWJfaXJxKGhkZXYtPmJ1cyk7CisKIGxvb3A6CiAJCXVzYl91bmxvY2tfZGV2aWNlKGhkZXYpOwogCQl1c2JfcHV0X2ludGYoaW50Zik7CkBAIC0yNzk2LDIzICsyODA3LDE2IEBACiAKIHN0YXRpYyBpbnQgaHViX3RocmVhZCh2b2lkICpfX3VudXNlZCkKIHsKLQkvKgotCSAqIFRoaXMgdGhyZWFkIGRvZXNuJ3QgbmVlZCBhbnkgdXNlci1sZXZlbCBhY2Nlc3MsCi0JICogc28gZ2V0IHJpZCBvZiBhbGwgb3VyIHJlc291cmNlcwotCSAqLwotCi0JZGFlbW9uaXplKCJraHViZCIpOwotCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKLQotCS8qIFNlbmQgbWUgYSBzaWduYWwgdG8gZ2V0IG1lIGRpZSAoZm9yIGRlYnVnZ2luZykgKi8KIAlkbyB7CiAJCWh1Yl9ldmVudHMoKTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGtodWJkX3dhaXQsICFsaXN0X2VtcHR5KCZodWJfZXZlbnRfbGlzdCkpOyAKLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOwotCX0gd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShraHViZF93YWl0LAorCQkJCSFsaXN0X2VtcHR5KCZodWJfZXZlbnRfbGlzdCkgfHwKKwkJCQlrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOworCQl0cnlfdG9fZnJlZXplKCk7CisJfSB3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCAhbGlzdF9lbXB0eSgmaHViX2V2ZW50X2xpc3QpKTsKIAotCXByX2RlYnVnICgiJXM6IGtodWJkIGV4aXRpbmdcbiIsIHVzYmNvcmVfbmFtZSk7Ci0JY29tcGxldGVfYW5kX2V4aXQoJmtodWJkX2V4aXRlZCwgMCk7CisJcHJfZGVidWcoIiVzOiBraHViZCBleGl0aW5nXG4iLCB1c2Jjb3JlX25hbWUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaHViX2lkX3RhYmxlIFtdID0gewpAQCAtMjgzOCwyMCArMjg0MiwxNSBAQAogCiBpbnQgdXNiX2h1Yl9pbml0KHZvaWQpCiB7Ci0JcGlkX3QgcGlkOwotCiAJaWYgKHVzYl9yZWdpc3RlcigmaHViX2RyaXZlcikgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IHJlZ2lzdGVyIGh1YiBkcml2ZXJcbiIsCiAJCQl1c2Jjb3JlX25hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcGlkID0ga2VybmVsX3RocmVhZChodWJfdGhyZWFkLCBOVUxMLCBDTE9ORV9LRVJORUwpOwotCWlmIChwaWQgPj0gMCkgewotCQlraHViZF9waWQgPSBwaWQ7Ci0KKwlraHViZF90YXNrID0ga3RocmVhZF9ydW4oaHViX3RocmVhZCwgTlVMTCwgImtodWJkIik7CisJaWYgKCFJU19FUlIoa2h1YmRfdGFzaykpCiAJCXJldHVybiAwOwotCX0KIAogCS8qIEZhbGwgdGhyb3VnaCBpZiBrZXJuZWxfdGhyZWFkIGZhaWxlZCAqLwogCXVzYl9kZXJlZ2lzdGVyKCZodWJfZHJpdmVyKTsKQEAgLTI4NjIsMTIgKzI4NjEsNyBAQAogCiB2b2lkIHVzYl9odWJfY2xlYW51cCh2b2lkKQogewotCWludCByZXQ7Ci0KLQkvKiBLaWxsIHRoZSB0aHJlYWQgKi8KLQlyZXQgPSBraWxsX3Byb2Moa2h1YmRfcGlkLCBTSUdLSUxMLCAxKTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmtodWJkX2V4aXRlZCk7CisJa3RocmVhZF9zdG9wKGtodWJkX3Rhc2spOwogCiAJLyoKIAkgKiBIdWIgcmVzb3VyY2VzIGFyZSBmcmVlZCBmb3IgdXMgYnkgdXNiX2RlcmVnaXN0ZXIuIEl0IGNhbGxzCkBAIC0yODc5LDcgKzI4NzMsNiBAQAogCXVzYl9kZXJlZ2lzdGVyKCZodWJfZHJpdmVyKTsKIH0gLyogdXNiX2h1Yl9jbGVhbnVwKCkgKi8KIAotCiBzdGF0aWMgaW50IGNvbmZpZ19kZXNjcmlwdG9yc19jaGFuZ2VkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCXVuc2lnbmVkCQkJaW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oIGIvZHJpdmVycy91c2IvY29yZS9odWIuaAppbmRleCBkMTE0Yjg0Li41M2JmNTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKQEAgLTIyNCwxNSArMjI0LDQgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbGVkczsKIH07CiAKLS8qIHVzZSB0aGlzIGZvciBsb3ctcG93ZXJlZCByb290IGh1YnMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaHViX3NldF9wb3dlcl9idWRnZXQgKHN0cnVjdCB1c2JfZGV2aWNlICpodWJkZXYsIHVuc2lnbmVkIG1BKQotewotCXN0cnVjdCB1c2JfaHViCSpodWI7Ci0KLQlodWIgPSAoc3RydWN0IHVzYl9odWIgKikKLQkJdXNiX2dldF9pbnRmZGF0YSAoaHViZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXSk7Ci0JaHViLT5wb3dlcl9idWRnZXQgPSBtaW4obUEsKHVuc2lnbmVkKTUwMCkvMjsKLX0KLQogI2VuZGlmIC8qIF9fTElOVVhfSFVCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKaW5kZXggZjUwYWFmMi4uYTQyOGVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9tZXNzYWdlLmMKQEAgLTMyMCw3ICszMjAsNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdAkqc2csCiAJaW50CQkJbmVudHMsCiAJc2l6ZV90CQkJbGVuZ3RoLAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkKIHsKIAlpbnQJCQlpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCmluZGV4IDc0MGNiNGMuLjAwMjk3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKQEAgLTE5Niw2ICsxOTYsNyBAQAogdXNiX2Rlc2NyaXB0b3JfYXR0ciAoYkRldmljZVN1YkNsYXNzLCAiJTAyeFxuIikKIHVzYl9kZXNjcmlwdG9yX2F0dHIgKGJEZXZpY2VQcm90b2NvbCwgIiUwMnhcbiIpCiB1c2JfZGVzY3JpcHRvcl9hdHRyIChiTnVtQ29uZmlndXJhdGlvbnMsICIlZFxuIikKK3VzYl9kZXNjcmlwdG9yX2F0dHIgKGJNYXhQYWNrZXRTaXplMCwgIiVkXG4iKQogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGV2X2F0dHJzW10gPSB7CiAJLyogY3VycmVudCBjb25maWd1cmF0aW9uJ3MgYXR0cmlidXRlcyAqLwpAQCAtMjExLDYgKzIxMiw3IEBACiAJJmRldl9hdHRyX2JEZXZpY2VTdWJDbGFzcy5hdHRyLAogCSZkZXZfYXR0cl9iRGV2aWNlUHJvdG9jb2wuYXR0ciwKIAkmZGV2X2F0dHJfYk51bUNvbmZpZ3VyYXRpb25zLmF0dHIsCisJJmRldl9hdHRyX2JNYXhQYWNrZXRTaXplMC5hdHRyLAogCSZkZXZfYXR0cl9zcGVlZC5hdHRyLAogCSZkZXZfYXR0cl9kZXZudW0uYXR0ciwKIAkmZGV2X2F0dHJfdmVyc2lvbi5hdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91cmIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKaW5kZXggMGZhZjE4ZC4uYzBmZWVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91cmIuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VyYi5jCkBAIC02MCw3ICs2MCw3IEBACiAgKgogICogVGhlIGRyaXZlciBtdXN0IGNhbGwgdXNiX2ZyZWVfdXJiKCkgd2hlbiBpdCBpcyBmaW5pc2hlZCB3aXRoIHRoZSB1cmIuCiAgKi8KLXN0cnVjdCB1cmIgKnVzYl9hbGxvY191cmIoaW50IGlzb19wYWNrZXRzLCBpbnQgbWVtX2ZsYWdzKQorc3RydWN0IHVyYiAqdXNiX2FsbG9jX3VyYihpbnQgaXNvX3BhY2tldHMsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgdXJiICp1cmI7CiAKQEAgLTIyNCw3ICsyMjQsNyBAQAogICogICAgICBHRlBfTk9JTywgdW5sZXNzIGIpIG9yIGMpIGFwcGx5CiAgKgogICovCi1pbnQgdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQoraW50IHVzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWludAkJCXBpcGUsIHRlbXAsIG1heDsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggYTNjNDIyMC4uOTljODVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC0xMTI5LDcgKzExMjksNyBAQAogdm9pZCAqdXNiX2J1ZmZlcl9hbGxvYyAoCiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKIAlzaXplX3Qgc2l6ZSwKLQlpbnQgbWVtX2ZsYWdzLAorCXVuc2lnbmVkIG1lbV9mbGFncywKIAlkbWFfYWRkcl90ICpkbWEKICkKIHsKQEAgLTE1MzIsNiArMTUzMiw5IEBACiBFWFBPUlRfU1lNQk9MKHVzYl9kZXJlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0wodXNiX2Rpc2FibGVkKTsKIAorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2dldF9pbnRmKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9wdXRfaW50Zik7CisKIEVYUE9SVF9TWU1CT0wodXNiX2FsbG9jX2Rldik7CiBFWFBPUlRfU1lNQk9MKHVzYl9wdXRfZGV2KTsKIEVYUE9SVF9TWU1CT0wodXNiX2dldF9kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCAzYjI0ZjlmLi5mZjA3NWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtNTMsNiArNTMsOSBAQAogCSAgIGRyaXZlciBvbiBhIG5ldyBib2FyZC4gICBFbmFibGUgdGhlc2UgZmlsZXMgYnkgY2hvb3NpbmcgIlkiCiAJICAgaGVyZS4gIElmIGluIGRvdWJ0LCBvciB0byBjb25zZXJ2ZSBrZXJuZWwgbWVtb3J5LCBzYXkgIk4iLgogCitjb25maWcJVVNCX0dBREdFVF9TRUxFQ1RFRAorCWJvb2xlYW4KKwogIwogIyBVU0IgUGVyaXBoZXJhbCBDb250cm9sbGVyIFN1cHBvcnQKICMKQEAgLTg1LDYgKzg4LDcgQEAKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gVVNCX0dBREdFVF9ORVQyMjgwCiAJZGVmYXVsdCBVU0JfR0FER0VUCisJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAogY29uZmlnIFVTQl9HQURHRVRfUFhBMlhYCiAJYm9vbGVhbiAiUFhBIDI1eCBvciBJWFAgNHh4IgpAQCAtMTA1LDYgKzEwOSw3IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVRfUFhBMlhYCiAJZGVmYXVsdCBVU0JfR0FER0VUCisJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAogIyBpZiB0aGVyZSdzIG9ubHkgb25lIGdhZGdldCBkcml2ZXIsIHVzaW5nIG9ubHkgdHdvIGJ1bGsgZW5kcG9pbnRzLAogIyBkb24ndCB3YXN0ZSBtZW1vcnkgZm9yIHRoZSBvdGhlciBlbmRwb2ludHMKQEAgLTEzNCw2ICsxMzksNyBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUX0dPS1UKIAlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiAKIGNvbmZpZyBVU0JfR0FER0VUX0xIN0E0MFgKQEAgLTE0Niw2ICsxNTIsNyBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUX0xIN0E0MFgKIAlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiAKIGNvbmZpZyBVU0JfR0FER0VUX09NQVAKQEAgLTE2Nyw2ICsxNzQsNyBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBVU0JfR0FER0VUX09NQVAKIAlkZWZhdWx0IFVTQl9HQURHRVQKKwlzZWxlY3QgVVNCX0dBREdFVF9TRUxFQ1RFRAogCiBjb25maWcgVVNCX09URwogCWJvb2xlYW4gIk9URyBTdXBwb3J0IgpAQCAtMjA3LDYgKzIxNSw3IEBACiAJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIFVTQl9HQURHRVRfRFVNTVlfSENECiAJZGVmYXVsdCBVU0JfR0FER0VUCisJc2VsZWN0IFVTQl9HQURHRVRfU0VMRUNURUQKIAogIyBOT1RFOiAgUGxlYXNlIGtlZXAgZHVtbXlfaGNkIExBU1Qgc28gdGhhdCAicmVhbCBoYXJkd2FyZSIgYXBwZWFycwogIyBmaXJzdCBhbmQgd2lsbCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LgpAQCAtMjI2LDcgKzIzNSw3IEBACiAjCiBjaG9pY2UKIAl0cmlzdGF0ZSAiVVNCIEdhZGdldCBEcml2ZXJzIgotCWRlcGVuZHMgb24gVVNCX0dBREdFVAorCWRlcGVuZHMgb24gVVNCX0dBREdFVCAmJiBVU0JfR0FER0VUX1NFTEVDVEVECiAJZGVmYXVsdCBVU0JfRVRICiAJaGVscAogCSAgQSBMaW51eCAiR2FkZ2V0IERyaXZlciIgdGFsa3MgdG8gdGhlIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYwppbmRleCBjMDM5ZDJmLi41ODNkYjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCkBAIC02NSw3ICs2NSw3IEBACiAKIAogI2RlZmluZSBEUklWRVJfREVTQwkiVVNCIEhvc3QrR2FkZ2V0IEVtdWxhdG9yIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMTcgRGVjIDIwMDQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwMiBNYXkgMjAwNSIKIAogc3RhdGljIGNvbnN0IGNoYXIJZHJpdmVyX25hbWUgW10gPSAiZHVtbXlfaGNkIjsKIHN0YXRpYyBjb25zdCBjaGFyCWRyaXZlcl9kZXNjIFtdID0gIlVTQiBIb3N0K0dhZGdldCBFbXVsYXRvciI7CkBAIC0xNDEsNiArMTQxLDggQEAKIH07CiAjZGVmaW5lIERVTU1ZX0VORFBPSU5UUwkoc2l6ZW9mKGVwX25hbWUpL3NpemVvZihjaGFyICopKQogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiAjZGVmaW5lIEZJRk9fU0laRQkJNjQKIAogc3RydWN0IHVyYnAgewpAQCAtMTQ4LDYgKzE1MCwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJdXJicF9saXN0OwogfTsKIAorCitlbnVtIGR1bW15X3JoX3N0YXRlIHsKKwlEVU1NWV9SSF9SRVNFVCwKKwlEVU1NWV9SSF9TVVNQRU5ERUQsCisJRFVNTVlfUkhfUlVOTklORworfTsKKwogc3RydWN0IGR1bW15IHsKIAlzcGlubG9ja190CQkJbG9jazsKIApAQCAtMTYxLDEyICsxNzAsMTggQEAKIAlzdHJ1Y3QgZHVtbXlfcmVxdWVzdAkJZmlmb19yZXE7CiAJdTgJCQkJZmlmb19idWYgW0ZJRk9fU0laRV07CiAJdTE2CQkJCWRldnN0YXR1czsKKwl1bnNpZ25lZAkJCXVkY19zdXNwZW5kZWQ6MTsKKwl1bnNpZ25lZAkJCXB1bGx1cDoxOworCXVuc2lnbmVkCQkJYWN0aXZlOjE7CisJdW5zaWduZWQJCQlvbGRfYWN0aXZlOjE7CiAKIAkvKgogCSAqIE1BU1RFUi9IT1NUIHNpZGUgc3VwcG9ydAogCSAqLworCWVudW0gZHVtbXlfcmhfc3RhdGUJCXJoX3N0YXRlOwogCXN0cnVjdCB0aW1lcl9saXN0CQl0aW1lcjsKIAl1MzIJCQkJcG9ydF9zdGF0dXM7CisJdTMyCQkJCW9sZF9zdGF0dXM7CiAJdW5zaWduZWQJCQlyZXN1bWluZzoxOwogCXVuc2lnbmVkIGxvbmcJCQlyZV90aW1lb3V0OwogCkBAIC0xODksNiArMjA0LDExIEBACiAJcmV0dXJuIGR1bW15X3RvX2hjZChkdW0pLT5zZWxmLmNvbnRyb2xsZXI7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqdWRjX2RldiAoc3RydWN0IGR1bW15ICpkdW0pCit7CisJcmV0dXJuIGR1bS0+Z2FkZ2V0LmRldi5wYXJlbnQ7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGR1bW15ICplcF90b19kdW1teSAoc3RydWN0IGR1bW15X2VwICplcCkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mIChlcC0+Z2FkZ2V0LCBzdHJ1Y3QgZHVtbXksIGdhZGdldCk7CkBAIC0yMDgsMTYgKzIyOCw5OCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKgotICogVGhpcyAiaGFyZHdhcmUiIG1heSBsb29rIGEgYml0IG9kZCBpbiBkaWFnbm9zdGljcyBzaW5jZSBpdCdzIGdvdCBib3RoCi0gKiBob3N0IGFuZCBkZXZpY2Ugc2lkZXM7IGFuZCBpdCBiaW5kcyBkaWZmZXJlbnQgZHJpdmVycyB0byBlYWNoIHNpZGUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQl0aGVfcGRldjsKKy8qIFNMQVZFL0dBREdFVCBTSURFIFVUSUxJVFkgUk9VVElORVMgKi8KIAotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGR1bW15X2RyaXZlciA9IHsKLQkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKLQkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKLX07CisvKiBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBudWtlIChzdHJ1Y3QgZHVtbXkgKmR1bSwgc3RydWN0IGR1bW15X2VwICplcCkKK3sKKwl3aGlsZSAoIWxpc3RfZW1wdHkgKCZlcC0+cXVldWUpKSB7CisJCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CisKKwkJcmVxID0gbGlzdF9lbnRyeSAoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBkdW1teV9yZXF1ZXN0LCBxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQgKCZyZXEtPnF1ZXVlKTsKKwkJcmVxLT5yZXEuc3RhdHVzID0gLUVTSFVURE9XTjsKKworCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7CisJCXJlcS0+cmVxLmNvbXBsZXRlICgmZXAtPmVwLCAmcmVxLT5yZXEpOworCQlzcGluX2xvY2sgKCZkdW0tPmxvY2spOworCX0KK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBsb2NrICovCitzdGF0aWMgdm9pZAorc3RvcF9hY3Rpdml0eSAoc3RydWN0IGR1bW15ICpkdW0pCit7CisJc3RydWN0IGR1bW15X2VwCSplcDsKKworCS8qIHByZXZlbnQgYW55IG1vcmUgcmVxdWVzdHMgKi8KKwlkdW0tPmFkZHJlc3MgPSAwOworCisJLyogVGhlIHRpbWVyIGlzIGxlZnQgcnVubmluZyBzbyB0aGF0IG91dHN0YW5kaW5nIFVSQnMgY2FuIGZhaWwgKi8KKworCS8qIG51a2UgYW55IHBlbmRpbmcgcmVxdWVzdHMgZmlyc3QsIHNvIGRyaXZlciBpL28gaXMgcXVpZXNjZWQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5IChlcCwgJmR1bS0+Z2FkZ2V0LmVwX2xpc3QsIGVwLmVwX2xpc3QpCisJCW51a2UgKGR1bSwgZXApOworCisJLyogZHJpdmVyIG5vdyBkb2VzIGFueSBub24tdXNiIHF1aWVzY2luZyBuZWNlc3NhcnkgKi8KK30KKworLyogY2FsbGVyIG11c3QgaG9sZCBsb2NrICovCitzdGF0aWMgdm9pZAorc2V0X2xpbmtfc3RhdGUgKHN0cnVjdCBkdW1teSAqZHVtKQoreworCWR1bS0+YWN0aXZlID0gMDsKKwlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1BPV0VSKSA9PSAwKQorCQlkdW0tPnBvcnRfc3RhdHVzID0gMDsKKworCS8qIFVEQyBzdXNwZW5kIG11c3QgY2F1c2UgYSBkaXNjb25uZWN0ICovCisJZWxzZSBpZiAoIWR1bS0+cHVsbHVwIHx8IGR1bS0+dWRjX3N1c3BlbmRlZCkgeworCQlkdW0tPnBvcnRfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJVVNCX1BPUlRfU1RBVF9FTkFCTEUgfAorCQkJCQlVU0JfUE9SVF9TVEFUX0xPV19TUEVFRCB8CisJCQkJCVVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRCB8CisJCQkJCVVTQl9QT1JUX1NUQVRfU1VTUEVORCk7CisJCWlmICgoZHVtLT5vbGRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSAhPSAwKQorCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gPDwgMTYpOworCX0gZWxzZSB7CisJCWR1bS0+cG9ydF9zdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OOworCQlpZiAoKGR1bS0+b2xkX3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgPT0gMCkKKwkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gKFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIDw8IDE2KTsKKwkJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpID09IDApCisJCQlkdW0tPnBvcnRfc3RhdHVzICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CisJCWVsc2UgaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSA9PSAwICYmCisJCQkJZHVtLT5yaF9zdGF0ZSAhPSBEVU1NWV9SSF9TVVNQRU5ERUQpCisJCQlkdW0tPmFjdGl2ZSA9IDE7CisJfQorCisJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUpID09IDAgfHwgZHVtLT5hY3RpdmUpCisJCWR1bS0+cmVzdW1pbmcgPSAwOworCisJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OKSA9PSAwIHx8CisJCQkoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUkVTRVQpICE9IDApIHsKKwkJaWYgKChkdW0tPm9sZF9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pICE9IDAgJiYKKwkJCQkoZHVtLT5vbGRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9SRVNFVCkgPT0gMCAmJgorCQkJCWR1bS0+ZHJpdmVyKSB7CisJCQlzdG9wX2FjdGl2aXR5IChkdW0pOworCQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOworCQkJZHVtLT5kcml2ZXItPmRpc2Nvbm5lY3QgKCZkdW0tPmdhZGdldCk7CisJCQlzcGluX2xvY2sgKCZkdW0tPmxvY2spOworCQl9CisJfSBlbHNlIGlmIChkdW0tPmFjdGl2ZSAhPSBkdW0tPm9sZF9hY3RpdmUpIHsKKwkJaWYgKGR1bS0+b2xkX2FjdGl2ZSAmJiBkdW0tPmRyaXZlci0+c3VzcGVuZCkgeworCQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOworCQkJZHVtLT5kcml2ZXItPnN1c3BlbmQgKCZkdW0tPmdhZGdldCk7CisJCQlzcGluX2xvY2sgKCZkdW0tPmxvY2spOworCQl9IGVsc2UgaWYgKCFkdW0tPm9sZF9hY3RpdmUgJiYgZHVtLT5kcml2ZXItPnJlc3VtZSkgeworCQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOworCQkJZHVtLT5kcml2ZXItPnJlc3VtZSAoJmR1bS0+Z2FkZ2V0KTsKKwkJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7CisJCX0KKwl9CisKKwlkdW0tPm9sZF9zdGF0dXMgPSBkdW0tPnBvcnRfc3RhdHVzOworCWR1bS0+b2xkX2FjdGl2ZSA9IGR1bS0+YWN0aXZlOworfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0zMjQsNyArNDI2LDcgQEAKIAlfZXAtPm1heHBhY2tldCA9IG1heDsKIAllcC0+ZGVzYyA9IGRlc2M7CiAKLQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgImVuYWJsZWQgJXMgKGVwJWQlcy0lcykgbWF4cGFja2V0ICVkXG4iLAorCWRldl9kYmcgKHVkY19kZXYoZHVtKSwgImVuYWJsZWQgJXMgKGVwJWQlcy0lcykgbWF4cGFja2V0ICVkXG4iLAogCQlfZXAtPm5hbWUsCiAJCWRlc2MtPmJFbmRwb2ludEFkZHJlc3MgJiAweDBmLAogCQkoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pID8gImluIiA6ICJvdXQiLApAQCAtMzQ1LDIyICs0NDcsNiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLS8qIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQgKi8KLXN0YXRpYyB2b2lkIG51a2UgKHN0cnVjdCBkdW1teSAqZHVtLCBzdHJ1Y3QgZHVtbXlfZXAgKmVwKQotewotCXdoaWxlICghbGlzdF9lbXB0eSAoJmVwLT5xdWV1ZSkpIHsKLQkJc3RydWN0IGR1bW15X3JlcXVlc3QJKnJlcTsKLQotCQlyZXEgPSBsaXN0X2VudHJ5IChlcC0+cXVldWUubmV4dCwgc3RydWN0IGR1bW15X3JlcXVlc3QsIHF1ZXVlKTsKLQkJbGlzdF9kZWxfaW5pdCAoJnJlcS0+cXVldWUpOwotCQlyZXEtPnJlcS5zdGF0dXMgPSAtRVNIVVRET1dOOwotCi0JCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKLQkJcmVxLT5yZXEuY29tcGxldGUgKCZlcC0+ZXAsICZyZXEtPnJlcSk7Ci0JCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7Ci0JfQotfQotCiBzdGF0aWMgaW50IGR1bW15X2Rpc2FibGUgKHN0cnVjdCB1c2JfZXAgKl9lcCkKIHsKIAlzdHJ1Y3QgZHVtbXlfZXAJCSplcDsKQEAgLTM3OSwxMiArNDY1LDEyIEBACiAJbnVrZSAoZHVtLCBlcCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwogCi0JZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJkaXNhYmxlZCAlc1xuIiwgX2VwLT5uYW1lKTsKKwlkZXZfZGJnICh1ZGNfZGV2KGR1bSksICJkaXNhYmxlZCAlc1xuIiwgX2VwLT5uYW1lKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLWR1bW15X2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IG1lbV9mbGFncykKK2R1bW15X2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwogCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CkBAIC00MjEsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgdXNiX2VwICpfZXAsCiAJdW5zaWduZWQgYnl0ZXMsCiAJZG1hX2FkZHJfdCAqZG1hLAotCWludCBtZW1fZmxhZ3MKKwl1bnNpZ25lZCBtZW1fZmxhZ3MKICkgewogCWNoYXIJCQkqcmV0dmFsOwogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwpAQCAtNDU0LDcgKzU0MCw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWR1bW15X3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgaW50IG1lbV9mbGFncykKK2R1bW15X3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwKKwkJdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBkdW1teV9lcAkJKmVwOwogCXN0cnVjdCBkdW1teV9yZXF1ZXN0CSpyZXE7CkBAIC00NzQsNyArNTYxLDcgQEAKIAkJcmV0dXJuIC1FU0hVVERPV047CiAKICNpZiAwCi0JZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJlcCAlcCBxdWV1ZSByZXEgJXAgdG8gJXMsIGxlbiAlZCBidWYgJXBcbiIsCisJZGV2X2RiZyAodWRjX2RldihkdW0pLCAiZXAgJXAgcXVldWUgcmVxICVwIHRvICVzLCBsZW4gJWQgYnVmICVwXG4iLAogCQkJZXAsIF9yZXEsIF9lcC0+bmFtZSwgX3JlcS0+bGVuZ3RoLCBfcmVxLT5idWYpOwogI2VuZGlmCiAKQEAgLTUzNyw3ICs2MjQsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKIAogCWlmIChyZXR2YWwgPT0gMCkgewotCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwKKwkJZGV2X2RiZyAodWRjX2RldihkdW0pLAogCQkJCSJkZXF1ZXVlZCByZXEgJXAgZnJvbSAlcywgbGVuICVkIGJ1ZiAlcFxuIiwKIAkJCQlyZXEsIF9lcC0+bmFtZSwgX3JlcS0+bGVuZ3RoLCBfcmVxLT5idWYpOwogCQlfcmVxLT5jb21wbGV0ZSAoX2VwLCBfcmVxKTsKQEAgLTYwMSwxMyArNjg4LDIxIEBACiAJc3RydWN0IGR1bW15CSpkdW07CiAKIAlkdW0gPSBnYWRnZXRfdG9fZHVtbXkgKF9nYWRnZXQpOwotCWlmICgoZHVtLT5kZXZzdGF0dXMgJiAoMSA8PCBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApKSA9PSAwCi0JCQl8fCAhKGR1bS0+cG9ydF9zdGF0dXMgJiAoMSA8PCBVU0JfUE9SVF9GRUFUX1NVU1BFTkQpKSkKKwlpZiAoIShkdW0tPmRldnN0YXR1cyAmCSggKDEgPDwgVVNCX0RFVklDRV9CX0hOUF9FTkFCTEUpCisJCQkJfCAoMSA8PCBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApKSkpCiAJCXJldHVybiAtRUlOVkFMOworCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTikgPT0gMCkKKwkJcmV0dXJuIC1FTk9MSU5LOworCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkgPT0gMCAmJgorCQkJIGR1bS0+cmhfc3RhdGUgIT0gRFVNTVlfUkhfU1VTUEVOREVEKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEZJWE1FOiBXaGF0IGlmIHRoZSByb290IGh1YiBpcyBzdXNwZW5kZWQgYnV0IHRoZSBwb3J0IGlzbid0PyAqLwogCiAJLyogaHViIG5vdGljZXMgb3VyIHJlcXVlc3QsIGlzc3VlcyBkb3duc3RyZWFtIHJlc3VtZSwgZXRjICovCiAJZHVtLT5yZXN1bWluZyA9IDE7Ci0JZHVtLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORCk7CisJZHVtLT5yZV90aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCW1vZF90aW1lciAoJmR1bW15X3RvX2hjZCAoZHVtKS0+cmhfdGltZXIsIGR1bS0+cmVfdGltZW91dCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYyMywxMCArNzE4LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHVtbXlfcHVsbHVwIChzdHJ1Y3QgdXNiX2dhZGdldCAqX2dhZGdldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBkdW1teQkqZHVtOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlkdW0gPSBnYWRnZXRfdG9fZHVtbXkgKF9nYWRnZXQpOworCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7CisJZHVtLT5wdWxsdXAgPSAodmFsdWUgIT0gMCk7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOworCisJdXNiX2hjZF9wb2xsX3JoX3N0YXR1cyAoZHVtbXlfdG9faGNkIChkdW0pKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBkdW1teV9vcHMgPSB7CiAJLmdldF9mcmFtZQk9IGR1bW15X2dfZ2V0X2ZyYW1lLAogCS53YWtldXAJCT0gZHVtbXlfd2FrZXVwLAogCS5zZXRfc2VsZnBvd2VyZWQgPSBkdW1teV9zZXRfc2VsZnBvd2VyZWQsCisJLnB1bGx1cAkJPSBkdW1teV9wdWxsdXAsCiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjQxLDcgKzc1Miw3IEBACiAJCXJldHVybiAwOwogCXJldHVybiBzY25wcmludGYgKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGR1bS0+ZHJpdmVyLT5mdW5jdGlvbik7CiB9Ci1ERVZJQ0VfQVRUUiAoZnVuY3Rpb24sIFNfSVJVR08sIHNob3dfZnVuY3Rpb24sIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSIChmdW5jdGlvbiwgU19JUlVHTywgc2hvd19mdW5jdGlvbiwgTlVMTCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTY1OSwzOCArNzcwLDYgQEAKICAqIGZvciBlYWNoIGRyaXZlciB0aGF0IHJlZ2lzdGVyczogIGp1c3QgYWRkIHRvIGEgYmlnIHJvb3QgaHViLgogICovCiAKLXN0YXRpYyB2b2lkCi1kdW1teV91ZGNfcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCi1zdGF0aWMgdm9pZAotZHVtbXlfcGRldl9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci19Ci0KLXN0YXRpYyBpbnQKLWR1bW15X3JlZ2lzdGVyX3VkYyAoc3RydWN0IGR1bW15ICpkdW0pCi17Ci0JaW50CQlyYzsKLQotCXN0cmNweSAoZHVtLT5nYWRnZXQuZGV2LmJ1c19pZCwgInVkYyIpOwotCWR1bS0+Z2FkZ2V0LmRldi5wYXJlbnQgPSBkdW1teV9kZXYoZHVtKTsKLQlkdW0tPmdhZGdldC5kZXYucmVsZWFzZSA9IGR1bW15X3VkY19yZWxlYXNlOwotCi0JcmMgPSBkZXZpY2VfcmVnaXN0ZXIgKCZkdW0tPmdhZGdldC5kZXYpOwotCWlmIChyYyA9PSAwKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkdW0tPmdhZGdldC5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZAotZHVtbXlfdW5yZWdpc3Rlcl91ZGMgKHN0cnVjdCBkdW1teSAqZHVtKQotewotCWRldmljZV9yZW1vdmVfZmlsZSAoJmR1bS0+Z2FkZ2V0LmRldiwgJmRldl9hdHRyX2Z1bmN0aW9uKTsKLQlkZXZpY2VfdW5yZWdpc3RlciAoJmR1bS0+Z2FkZ2V0LmRldik7Ci19Ci0KIGludAogdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewpAQCAtNzA5LDEyICs3ODgsOCBAQAogCSAqIFNMQVZFIHNpZGUgaW5pdCAuLi4gdGhlIGxheWVyIGFib3ZlIGhhcmR3YXJlLCB3aGljaAogCSAqIGNhbid0IGVudW1lcmF0ZSB3aXRob3V0IGhlbHAgZnJvbSB0aGUgZHJpdmVyIHdlJ3JlIGJpbmRpbmcuCiAJICovCi0JZHVtLT5nYWRnZXQubmFtZSA9IGdhZGdldF9uYW1lOwotCWR1bS0+Z2FkZ2V0Lm9wcyA9ICZkdW1teV9vcHM7Ci0JZHVtLT5nYWRnZXQuaXNfZHVhbHNwZWVkID0gMTsKIAogCWR1bS0+ZGV2c3RhdHVzID0gMDsKLQlkdW0tPnJlc3VtaW5nID0gMDsKIAogCUlOSVRfTElTVF9IRUFEICgmZHVtLT5nYWRnZXQuZXBfbGlzdCk7CiAJZm9yIChpID0gMDsgaSA8IERVTU1ZX0VORFBPSU5UUzsgaSsrKSB7CkBAIC03NDAsNyArODE1LDcgQEAKIAogCWR1bS0+ZHJpdmVyID0gZHJpdmVyOwogCWR1bS0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7Ci0JZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJiaW5kaW5nIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKKwlkZXZfZGJnICh1ZGNfZGV2KGR1bSksICJiaW5kaW5nIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKIAkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCWlmICgocmV0dmFsID0gZHJpdmVyLT5iaW5kICgmZHVtLT5nYWRnZXQpKSAhPSAwKSB7CiAJCWR1bS0+ZHJpdmVyID0gTlVMTDsKQEAgLTc0OCw0MiArODIzLDIxIEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JLy8gRklYTUU6IENoZWNrIHRoZXNlIGNhbGxzIGZvciBlcnJvcnMgYW5kIHJlLW9yZGVyCiAJZHJpdmVyLT5kcml2ZXIuYnVzID0gZHVtLT5nYWRnZXQuZGV2LnBhcmVudC0+YnVzOwogCWRyaXZlcl9yZWdpc3RlciAoJmRyaXZlci0+ZHJpdmVyKTsKLQogCWRldmljZV9iaW5kX2RyaXZlciAoJmR1bS0+Z2FkZ2V0LmRldik7CiAKIAkvKiBraHViZCB3aWxsIGVudW1lcmF0ZSB0aGlzIGluIGEgd2hpbGUgKi8KLQlkdW0tPnBvcnRfc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTgotCQl8ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKTsKKwlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKKwlkdW0tPnB1bGx1cCA9IDE7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKKworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MICh1c2JfZ2FkZ2V0X3JlZ2lzdGVyX2RyaXZlcik7CiAKLS8qIGNhbGxlciBtdXN0IGhvbGQgbG9jayAqLwotc3RhdGljIHZvaWQKLXN0b3BfYWN0aXZpdHkgKHN0cnVjdCBkdW1teSAqZHVtLCBzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKLXsKLQlzdHJ1Y3QgZHVtbXlfZXAJKmVwOwotCi0JLyogcHJldmVudCBhbnkgbW9yZSByZXF1ZXN0cyAqLwotCWR1bS0+YWRkcmVzcyA9IDA7Ci0KLQkvKiBUaGUgdGltZXIgaXMgbGVmdCBydW5uaW5nIHNvIHRoYXQgb3V0c3RhbmRpbmcgVVJCcyBjYW4gZmFpbCAqLwotCi0JLyogbnVrZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBmaXJzdCwgc28gZHJpdmVyIGkvbyBpcyBxdWllc2NlZCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKGVwLCAmZHVtLT5nYWRnZXQuZXBfbGlzdCwgZXAuZXBfbGlzdCkKLQkJbnVrZSAoZHVtLCBlcCk7Ci0KLQkvKiBkcml2ZXIgbm93IGRvZXMgYW55IG5vbi11c2IgcXVpZXNjaW5nIG5lY2Vzc2FyeSAqLwotCWlmIChkcml2ZXIpIHsKLQkJc3Bpbl91bmxvY2sgKCZkdW0tPmxvY2spOwotCQlkcml2ZXItPmRpc2Nvbm5lY3QgKCZkdW0tPmdhZGdldCk7Ci0JCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7Ci0JfQotfQotCiBpbnQKIHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewpAQCAtNzk1LDM1ICs4NDksMTM4IEBACiAJaWYgKCFkcml2ZXIgfHwgZHJpdmVyICE9IGR1bS0+ZHJpdmVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRldl9kYmcgKGR1bW15X2RldihkdW0pLCAidW5yZWdpc3RlciBnYWRnZXQgZHJpdmVyICclcydcbiIsCisJZGV2X2RiZyAodWRjX2RldihkdW0pLCAidW5yZWdpc3RlciBnYWRnZXQgZHJpdmVyICclcydcbiIsCiAJCQlkcml2ZXItPmRyaXZlci5uYW1lKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7Ci0Jc3RvcF9hY3Rpdml0eSAoZHVtLCBkcml2ZXIpOwotCWR1bS0+cG9ydF9zdGF0dXMgJj0gfihVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04gfCBVU0JfUE9SVF9TVEFUX0VOQUJMRSB8Ci0JCQlVU0JfUE9SVF9TVEFUX0xPV19TUEVFRCB8IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRCk7Ci0JZHVtLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTik7CisJZHVtLT5wdWxsdXAgPSAwOworCXNldF9saW5rX3N0YXRlIChkdW0pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKIAogCWRyaXZlci0+dW5iaW5kICgmZHVtLT5nYWRnZXQpOwogCWR1bS0+ZHJpdmVyID0gTlVMTDsKIAogCWRldmljZV9yZWxlYXNlX2RyaXZlciAoJmR1bS0+Z2FkZ2V0LmRldik7Ci0KIAlkcml2ZXJfdW5yZWdpc3RlciAoJmRyaXZlci0+ZHJpdmVyKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7CisJZHVtLT5wdWxsdXAgPSAwOworCXNldF9saW5rX3N0YXRlIChkdW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZkdW0tPmxvY2ssIGZsYWdzKTsKKworCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGR1bW15X3RvX2hjZCAoZHVtKSk7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MICh1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKTsKIAogI3VuZGVmIGlzX2VuYWJsZWQKIAorLyoganVzdCBkZWNsYXJlIHRoaXMgaW4gYW55IGRyaXZlciB0aGF0IHJlYWxseSBuZWVkIGl0ICovCitleHRlcm4gaW50IG5ldDIyODBfc2V0X2ZpZm9fbW9kZSAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IG1vZGUpOworCiBpbnQgbmV0MjI4MF9zZXRfZmlmb19tb2RlIChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBpbnQgbW9kZSkKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIEVYUE9SVF9TWU1CT0wgKG5ldDIyODBfc2V0X2ZpZm9fbW9kZSk7CiAKKworLyogVGhlIGdhZGdldCBzdHJ1Y3R1cmUgaXMgc3RvcmVkIGluc2lkZSB0aGUgaGNkIHN0cnVjdHVyZSBhbmQgd2lsbCBiZQorICogcmVsZWFzZWQgYWxvbmcgd2l0aCBpdC4gKi8KK3N0YXRpYyB2b2lkCitkdW1teV9nYWRnZXRfcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworI2lmIDAJCS8qIHVzYl9idXNfcHV0IGlzbid0IEVYUE9SVGVkISAqLworCXN0cnVjdCBkdW1teQkqZHVtID0gZ2FkZ2V0X2Rldl90b19kdW1teSAoZGV2KTsKKworCXVzYl9idXNfcHV0ICgmZHVtbXlfdG9faGNkIChkdW0pLT5zZWxmKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGR1bW15X3VkY19wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkdW1teQkqZHVtID0gdGhlX2NvbnRyb2xsZXI7CisJaW50CQlyYzsKKworCWR1bS0+Z2FkZ2V0Lm5hbWUgPSBnYWRnZXRfbmFtZTsKKwlkdW0tPmdhZGdldC5vcHMgPSAmZHVtbXlfb3BzOworCWR1bS0+Z2FkZ2V0LmlzX2R1YWxzcGVlZCA9IDE7CisKKwkvKiBtYXliZSBjbGFpbSBPVEcgc3VwcG9ydCwgdGhvdWdoIHdlIHdvbid0IGNvbXBsZXRlIEhOUCAqLworCWR1bS0+Z2FkZ2V0LmlzX290ZyA9IChkdW1teV90b19oY2QoZHVtKS0+c2VsZi5vdGdfcG9ydCAhPSAwKTsKKworCXN0cmNweSAoZHVtLT5nYWRnZXQuZGV2LmJ1c19pZCwgImdhZGdldCIpOworCWR1bS0+Z2FkZ2V0LmRldi5wYXJlbnQgPSBkZXY7CisJZHVtLT5nYWRnZXQuZGV2LnJlbGVhc2UgPSBkdW1teV9nYWRnZXRfcmVsZWFzZTsKKwlyYyA9IGRldmljZV9yZWdpc3RlciAoJmR1bS0+Z2FkZ2V0LmRldik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisjaWYgMAkJLyogdXNiX2J1c19nZXQgaXNuJ3QgRVhQT1JUZWQhICovCisJdXNiX2J1c19nZXQgKCZkdW1teV90b19oY2QgKGR1bSktPnNlbGYpOworI2VuZGlmCisKKwlkZXZfc2V0X2RydmRhdGEgKGRldiwgZHVtKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkdW0tPmdhZGdldC5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGR1bW15X3VkY19yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHVtbXkJKmR1bSA9IGRldl9nZXRfZHJ2ZGF0YSAoZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YSAoZGV2LCBOVUxMKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUgKCZkdW0tPmdhZGdldC5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CisJZGV2aWNlX3VucmVnaXN0ZXIgKCZkdW0tPmdhZGdldC5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bW15X3VkY19zdXNwZW5kIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwKKwkJdTMyIGxldmVsKQoreworCXN0cnVjdCBkdW1teQkqZHVtID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAobGV2ZWwgIT0gU1VTUEVORF9ESVNBQkxFKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcgKGRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCXNwaW5fbG9ja19pcnEgKCZkdW0tPmxvY2spOworCWR1bS0+dWRjX3N1c3BlbmRlZCA9IDE7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKKworCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBzdGF0ZTsKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzIChkdW1teV90b19oY2QgKGR1bSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bW15X3VkY19yZXN1bWUgKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCBkdW1teQkqZHVtID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAobGV2ZWwgIT0gUkVTVU1FX0VOQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlzcGluX2xvY2tfaXJxICgmZHVtLT5sb2NrKTsKKwlkdW0tPnVkY19zdXNwZW5kZWQgPSAwOworCXNldF9saW5rX3N0YXRlIChkdW0pOworCXNwaW5fdW5sb2NrX2lycSAoJmR1bS0+bG9jayk7CisKKwlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzIChkdW1teV90b19oY2QgKGR1bSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgZHVtbXlfdWRjX2RyaXZlciA9IHsKKwkubmFtZQkJPSAoY2hhciAqKSBnYWRnZXRfbmFtZSwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gZHVtbXlfdWRjX3Byb2JlLAorCS5yZW1vdmUJCT0gZHVtbXlfdWRjX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGR1bW15X3VkY19zdXNwZW5kLAorCS5yZXN1bWUJCT0gZHVtbXlfdWRjX3Jlc3VtZSwKK307CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIE1BU1RFUi9IT1NUIFNJREUgRFJJVkVSCkBAIC04NDIsNyArOTk5LDcgQEAKIAlzdHJ1Y3QgdXNiX2hjZAkJCSpoY2QsCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50CSplcCwKIAlzdHJ1Y3QgdXJiCQkJKnVyYiwKLQlpbnQJCQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCQltZW1fZmxhZ3MKICkgewogCXN0cnVjdCBkdW1teQkqZHVtOwogCXN0cnVjdCB1cmJwCSp1cmJwOwpAQCAtODgwLDcgKzEwMzcsMTYgQEAKIAogc3RhdGljIGludCBkdW1teV91cmJfZGVxdWV1ZSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiKQogewotCS8qIGdpdmViYWNrIGhhcHBlbnMgYXV0b21hdGljYWxseSBpbiB0aW1lciBjYWxsYmFjayAqLworCXN0cnVjdCBkdW1teQkqZHVtOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwkvKiBnaXZlYmFjayBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgaW4gdGltZXIgY2FsbGJhY2ssCisJICogc28gbWFrZSBzdXJlIHRoZSBjYWxsYmFjayBoYXBwZW5zICovCisJZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOworCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7CisJaWYgKGR1bS0+cmhfc3RhdGUgIT0gRFVNTVlfUkhfUlVOTklORyAmJiAhbGlzdF9lbXB0eSgmZHVtLT51cmJwX2xpc3QpKQorCQltb2RfdGltZXIgKCZkdW0tPnRpbWVyLCBqaWZmaWVzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMjUsNyArMTE5MSw2IEBACiAKIAkJLyogaGlnaCBiYW5kd2lkdGggbW9kZSAqLwogCQl0bXAgPSBsZTE2X3RvX2NwdShlcC0+ZGVzYy0+d01heFBhY2tldFNpemUpOwotCQl0bXAgPSBsZTE2X3RvX2NwdSAodG1wKTsKIAkJdG1wID0gKHRtcCA+PiAxMSkgJiAweDAzOwogCQl0bXAgKj0gOCAvKiBhcHBsaWVzIHRvIGVudGlyZSBmcmFtZSAqLzsKIAkJbGltaXQgKz0gbGltaXQgKiB0bXA7CkBAIC0xMTIzLDcgKzEyODgsOCBAQAogCQlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB7CiAJCQkvKiBsaWtlbHkgaXQgd2FzIGp1c3QgdW5saW5rZWQgKi8KIAkJCWdvdG8gcmV0dXJuX3VyYjsKLQkJfQorCQl9IGVsc2UgaWYgKGR1bS0+cmhfc3RhdGUgIT0gRFVNTVlfUkhfUlVOTklORykKKwkJCWNvbnRpbnVlOwogCQl0eXBlID0gdXNiX3BpcGV0eXBlICh1cmItPnBpcGUpOwogCiAJCS8qIHVzZWQgdXAgdGhpcyBmcmFtZSdzIG5vbi1wZXJpb2RpYyBiYW5kd2lkdGg/CkBAIC0xMTY4LDEyICsxMzM0LDE0IEBACiAJCQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0CQlzZXR1cDsKIAkJCWludAkJCQl2YWx1ZSA9IDE7CiAJCQlzdHJ1Y3QgZHVtbXlfZXAJCQkqZXAyOworCQkJdW5zaWduZWQJCQl3X2luZGV4OworCQkJdW5zaWduZWQJCQl3X3ZhbHVlOwogCiAJCQlzZXR1cCA9ICooc3RydWN0IHVzYl9jdHJscmVxdWVzdCopIHVyYi0+c2V0dXBfcGFja2V0OwotCQkJbGUxNl90b19jcHVzICgmc2V0dXAud0luZGV4KTsKLQkJCWxlMTZfdG9fY3B1cyAoJnNldHVwLndWYWx1ZSk7Ci0JCQlsZTE2X3RvX2NwdXMgKCZzZXR1cC53TGVuZ3RoKTsKLQkJCWlmIChzZXR1cC53TGVuZ3RoICE9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkgeworCQkJd19pbmRleCA9IGxlMTZfdG9fY3B1KHNldHVwLndJbmRleCk7CisJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoc2V0dXAud1ZhbHVlKTsKKwkJCWlmIChsZTE2X3RvX2NwdShzZXR1cC53TGVuZ3RoKSAhPQorCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKIAkJCQltYXliZV9zZXRfc3RhdHVzICh1cmIsIC1FT1ZFUkZMT1cpOwogCQkJCWdvdG8gcmV0dXJuX3VyYjsKIAkJCX0KQEAgLTExODIsNyArMTM1MCw3IEBACiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CiAJCQkJbGlzdF9kZWxfaW5pdCAoJnJlcS0+cXVldWUpOwogCQkJCXJlcS0+cmVxLnN0YXR1cyA9IC1FT1ZFUkZMT1c7Ci0JCQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJzdGFsZSByZXEgPSAlcFxuIiwKKwkJCQlkZXZfZGJnICh1ZGNfZGV2KGR1bSksICJzdGFsZSByZXEgPSAlcFxuIiwKIAkJCQkJCXJlcSk7CiAKIAkJCQlzcGluX3VubG9jayAoJmR1bS0+bG9jayk7CkBAIC0xMjAzLDMxICsxMzcxLDQwIEBACiAJCQljYXNlIFVTQl9SRVFfU0VUX0FERFJFU1M6CiAJCQkJaWYgKHNldHVwLmJSZXF1ZXN0VHlwZSAhPSBEZXZfUmVxdWVzdCkKIAkJCQkJYnJlYWs7Ci0JCQkJZHVtLT5hZGRyZXNzID0gc2V0dXAud1ZhbHVlOworCQkJCWR1bS0+YWRkcmVzcyA9IHdfdmFsdWU7CiAJCQkJbWF5YmVfc2V0X3N0YXR1cyAodXJiLCAwKTsKLQkJCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwgInNldF9hZGRyZXNzID0gJWRcbiIsCi0JCQkJCQlzZXR1cC53VmFsdWUpOworCQkJCWRldl9kYmcgKHVkY19kZXYoZHVtKSwgInNldF9hZGRyZXNzID0gJWRcbiIsCisJCQkJCQl3X3ZhbHVlKTsKIAkJCQl2YWx1ZSA9IDA7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFVTQl9SRVFfU0VUX0ZFQVRVUkU6CiAJCQkJaWYgKHNldHVwLmJSZXF1ZXN0VHlwZSA9PSBEZXZfUmVxdWVzdCkgewogCQkJCQl2YWx1ZSA9IDA7Ci0JCQkJCXN3aXRjaCAoc2V0dXAud1ZhbHVlKSB7CisJCQkJCXN3aXRjaCAod192YWx1ZSkgewogCQkJCQljYXNlIFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDoKIAkJCQkJCWJyZWFrOworCQkJCQljYXNlIFVTQl9ERVZJQ0VfQl9ITlBfRU5BQkxFOgorCQkJCQkJZHVtLT5nYWRnZXQuYl9obnBfZW5hYmxlID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFVTQl9ERVZJQ0VfQV9ITlBfU1VQUE9SVDoKKwkJCQkJCWR1bS0+Z2FkZ2V0LmFfaG5wX3N1cHBvcnQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgVVNCX0RFVklDRV9BX0FMVF9ITlBfU1VQUE9SVDoKKwkJCQkJCWR1bS0+Z2FkZ2V0LmFfYWx0X2hucF9zdXBwb3J0CisJCQkJCQkJPSAxOworCQkJCQkJYnJlYWs7CiAJCQkJCWRlZmF1bHQ6CiAJCQkJCQl2YWx1ZSA9IC1FT1BOT1RTVVBQOwogCQkJCQl9CiAJCQkJCWlmICh2YWx1ZSA9PSAwKSB7CiAJCQkJCQlkdW0tPmRldnN0YXR1cyB8PQotCQkJCQkJCSgxIDw8IHNldHVwLndWYWx1ZSk7CisJCQkJCQkJKDEgPDwgd192YWx1ZSk7CiAJCQkJCQltYXliZV9zZXRfc3RhdHVzICh1cmIsIDApOwogCQkJCQl9CiAKIAkJCQl9IGVsc2UgaWYgKHNldHVwLmJSZXF1ZXN0VHlwZSA9PSBFcF9SZXF1ZXN0KSB7CiAJCQkJCS8vIGVuZHBvaW50IGhhbHQKLQkJCQkJZXAyID0gZmluZF9lbmRwb2ludCAoZHVtLAotCQkJCQkJCXNldHVwLndJbmRleCk7CisJCQkJCWVwMiA9IGZpbmRfZW5kcG9pbnQgKGR1bSwgd19pbmRleCk7CiAJCQkJCWlmICghZXAyKSB7CiAJCQkJCQl2YWx1ZSA9IC1FT1BOT1RTVVBQOwogCQkJCQkJYnJlYWs7CkBAIC0xMjM5LDcgKzE0MTYsNyBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CiAJCQkJaWYgKHNldHVwLmJSZXF1ZXN0VHlwZSA9PSBEZXZfUmVxdWVzdCkgewotCQkJCQlzd2l0Y2ggKHNldHVwLndWYWx1ZSkgeworCQkJCQlzd2l0Y2ggKHdfdmFsdWUpIHsKIAkJCQkJY2FzZSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA6CiAJCQkJCQlkdW0tPmRldnN0YXR1cyAmPSB+KDEgPDwKIAkJCQkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApOwpAQCAtMTI1Miw4ICsxNDI5LDcgQEAKIAkJCQkJfQogCQkJCX0gZWxzZSBpZiAoc2V0dXAuYlJlcXVlc3RUeXBlID09IEVwX1JlcXVlc3QpIHsKIAkJCQkJLy8gZW5kcG9pbnQgaGFsdAotCQkJCQllcDIgPSBmaW5kX2VuZHBvaW50IChkdW0sCi0JCQkJCQkJc2V0dXAud0luZGV4KTsKKwkJCQkJZXAyID0gZmluZF9lbmRwb2ludCAoZHVtLCB3X2luZGV4KTsKIAkJCQkJaWYgKCFlcDIpIHsKIAkJCQkJCXZhbHVlID0gLUVPUE5PVFNVUFA7CiAJCQkJCQlicmVhazsKQEAgLTEyNzksNyArMTQ1NSw3IEBACiAJCQkJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiAwKSB7CiAJCQkJCQlpZiAoc2V0dXAuYlJlcXVlc3RUeXBlID09CiAJCQkJCQkJCUVwX0luUmVxdWVzdCkgewotCWVwMiA9IGZpbmRfZW5kcG9pbnQgKGR1bSwgc2V0dXAud0luZGV4KTsKKwllcDIgPSBmaW5kX2VuZHBvaW50IChkdW0sIHdfaW5kZXgpOwogCWlmICghZXAyKSB7CiAJCXZhbHVlID0gLUVPUE5PVFNVUFA7CiAJCWJyZWFrOwpAQCAtMTMyMSw3ICsxNDk3LDcgQEAKIAogCQkJaWYgKHZhbHVlIDwgMCkgewogCQkJCWlmICh2YWx1ZSAhPSAtRU9QTk9UU1VQUCkKLQkJCQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksCisJCQkJCWRldl9kYmcgKHVkY19kZXYoZHVtKSwKIAkJCQkJCSJzZXR1cCAtLT4gJWRcbiIsCiAJCQkJCQl2YWx1ZSk7CiAJCQkJbWF5YmVfc2V0X3N0YXR1cyAodXJiLCAtRVBJUEUpOwpAQCAtMTM3NywxMiArMTU1MywxMiBAQAogCQlnb3RvIHJlc3RhcnQ7CiAJfQogCi0JLyogd2FudCBhIDEgbXNlYyBkZWxheSBoZXJlICovCi0JaWYgKCFsaXN0X2VtcHR5ICgmZHVtLT51cmJwX2xpc3QpKQotCQltb2RfdGltZXIgKCZkdW0tPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JZWxzZSB7CisJaWYgKGxpc3RfZW1wdHkgKCZkdW0tPnVyYnBfbGlzdCkpIHsKIAkJdXNiX3B1dF9kZXYgKGR1bS0+dWRldik7CiAJCWR1bS0+dWRldiA9IE5VTEw7CisJfSBlbHNlIGlmIChkdW0tPnJoX3N0YXRlID09IERVTU1ZX1JIX1JVTk5JTkcpIHsKKwkJLyogd2FudCBhIDEgbXNlYyBkZWxheSBoZXJlICovCisJCW1vZF90aW1lciAoJmR1bS0+dGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZHVtLT5sb2NrLCBmbGFncyk7CkBAIC0xMzkxLDI5ICsxNTY3LDM5IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjZGVmaW5lIFBPUlRfQ19NQVNLIFwKLQkgKCgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OKSBcCi0JfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFKSBcCi0JfCAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORCkgXAotCXwgKDEgPDwgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVCkgXAotCXwgKDEgPDwgVVNCX1BPUlRfRkVBVF9DX1JFU0VUKSkKKwkoKFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIFwKKwl8IFVTQl9QT1JUX1NUQVRfQ19FTkFCTEUgXAorCXwgVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgXAorCXwgVVNCX1BPUlRfU1RBVF9DX09WRVJDVVJSRU5UIFwKKwl8IFVTQl9QT1JUX1NUQVRfQ19SRVNFVCkgPDwgMTYpCiAKIHN0YXRpYyBpbnQgZHVtbXlfaHViX3N0YXR1cyAoc3RydWN0IHVzYl9oY2QgKmhjZCwgY2hhciAqYnVmKQogewogCXN0cnVjdCBkdW1teQkJKmR1bTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlpbnQJCQlyZXR2YWw7CisJaW50CQkJcmV0dmFsID0gMDsKIAogCWR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlICgmZHVtLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCEoZHVtLT5wb3J0X3N0YXR1cyAmIFBPUlRfQ19NQVNLKSkKLQkJcmV0dmFsID0gMDsKLQllbHNlIHsKKwlpZiAoaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9SVU5OSU5HKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoZHVtLT5yZXN1bWluZyAmJiB0aW1lX2FmdGVyX2VxIChqaWZmaWVzLCBkdW0tPnJlX3RpbWVvdXQpKSB7CisJCWR1bS0+cG9ydF9zdGF0dXMgfD0gKFVTQl9QT1JUX1NUQVRfQ19TVVNQRU5EIDw8IDE2KTsKKwkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9TVVNQRU5EOworCQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwl9CisKKwlpZiAoKGR1bS0+cG9ydF9zdGF0dXMgJiBQT1JUX0NfTUFTSykgIT0gMCkgewogCQkqYnVmID0gKDEgPDwgMSk7CiAJCWRldl9kYmcgKGR1bW15X2RldihkdW0pLCAicG9ydCBzdGF0dXMgMHglMDh4IGhhcyBjaGFuZ2VzXG4iLAotCQkJZHVtLT5wb3J0X3N0YXR1cyk7CisJCQkJZHVtLT5wb3J0X3N0YXR1cyk7CiAJCXJldHZhbCA9IDE7CisJCWlmIChkdW0tPnJoX3N0YXRlID09IERVTU1ZX1JIX1NVU1BFTkRFRCkKKwkJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViIChoY2QpOwogCX0KK2RvbmU6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC0xNDI0LDcgKzE2MTAsOCBAQAogCW1lbXNldCAoZGVzYywgMCwgc2l6ZW9mICpkZXNjKTsKIAlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OwogCWRlc2MtPmJEZXNjTGVuZ3RoID0gOTsKLQlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMDAxKTsKKwlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gKF9fZm9yY2UgX191MTYpCisJCQkoX19jb25zdGFudF9jcHVfdG9fbGUxNiAoMHgwMDAxKSk7CiAJZGVzYy0+Yk5iclBvcnRzID0gMTsKIAlkZXNjLT5iaXRtYXAgWzBdID0gMHhmZjsKIAlkZXNjLT5iaXRtYXAgWzFdID0gMHhmZjsKQEAgLTE0NDIsNiArMTYyOSw5IEBACiAJaW50CQlyZXR2YWwgPSAwOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKKwlpZiAoaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwogCWR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmR1bS0+bG9jaywgZmxhZ3MpOwogCXN3aXRjaCAodHlwZVJlcSkgewpAQCAtMTQ1MCwyNyArMTY0MCwyNyBAQAogCWNhc2UgQ2xlYXJQb3J0RmVhdHVyZToKIAkJc3dpdGNoICh3VmFsdWUpIHsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6Ci0JCQlpZiAoZHVtLT5wb3J0X3N0YXR1cyAmICgxIDw8IFVTQl9QT1JUX0ZFQVRfU1VTUEVORCkpIHsKKwkJCWlmIChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSB7CiAJCQkJLyogMjBtc2VjIHJlc3VtZSBzaWduYWxpbmcgKi8KIAkJCQlkdW0tPnJlc3VtaW5nID0gMTsKIAkJCQlkdW0tPnJlX3RpbWVvdXQgPSBqaWZmaWVzICsKLQkJCQkJCQltc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjApOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKLQkJCWR1bS0+cG9ydF9zdGF0dXMgPSAwOwotCQkJZHVtLT5yZXN1bWluZyA9IDA7Ci0JCQlzdG9wX2FjdGl2aXR5KGR1bSwgZHVtLT5kcml2ZXIpOwotCQkJYnJlYWs7CisJCQlpZiAoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUE9XRVIpCisJCQkJZGV2X2RiZyAoZHVtbXlfZGV2KGR1bSksICJwb3dlci1vZmZcbiIpOworCQkJLyogRkFMTFMgVEhST1VHSCAqLwogCQlkZWZhdWx0OgogCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgd1ZhbHVlKTsKKwkJCXNldF9saW5rX3N0YXRlIChkdW0pOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgR2V0SHViRGVzY3JpcHRvcjoKIAkJaHViX2Rlc2NyaXB0b3IgKChzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICopIGJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgR2V0SHViU3RhdHVzOgotCQkqKHUzMiAqKSBidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKKwkJKihfX2xlMzIgKikgYnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCWJyZWFrOwogCWNhc2UgR2V0UG9ydFN0YXR1czoKIAkJaWYgKHdJbmRleCAhPSAxKQpAQCAtMTQ3OSwyMyArMTY2OSwxNiBAQAogCQkvKiB3aG9ldmVyIHJlc2V0cyBvciByZXN1bWVzIG11c3QgR2V0UG9ydFN0YXR1cyB0bwogCQkgKiBjb21wbGV0ZSBpdCEhCiAJCSAqLwotCQlpZiAoZHVtLT5yZXN1bWluZyAmJiB0aW1lX2FmdGVyIChqaWZmaWVzLCBkdW0tPnJlX3RpbWVvdXQpKSB7Ci0JCQlkdW0tPnBvcnRfc3RhdHVzIHw9ICgxIDw8IFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EKTsKLQkJCWR1bS0+cG9ydF9zdGF0dXMgJj0gfigxIDw8IFVTQl9QT1JUX0ZFQVRfU1VTUEVORCk7Ci0JCQlkdW0tPnJlc3VtaW5nID0gMDsKLQkJCWR1bS0+cmVfdGltZW91dCA9IDA7Ci0JCQlpZiAoZHVtLT5kcml2ZXIgJiYgZHVtLT5kcml2ZXItPnJlc3VtZSkgewotCQkJCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKLQkJCQlkdW0tPmRyaXZlci0+cmVzdW1lICgmZHVtLT5nYWRnZXQpOwotCQkJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7Ci0JCQl9CisJCWlmIChkdW0tPnJlc3VtaW5nICYmCisJCQkJdGltZV9hZnRlcl9lcSAoamlmZmllcywgZHVtLT5yZV90aW1lb3V0KSkgeworCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgPDwgMTYpOworCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9TVVNQRU5EOwogCQl9Ci0JCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmICgxIDw8IFVTQl9QT1JUX0ZFQVRfUkVTRVQpKSAhPSAwCi0JCQkJJiYgdGltZV9hZnRlciAoamlmZmllcywgZHVtLT5yZV90aW1lb3V0KSkgewotCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCBVU0JfUE9SVF9GRUFUX0NfUkVTRVQpOwotCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+KDEgPDwgVVNCX1BPUlRfRkVBVF9SRVNFVCk7Ci0JCQlkdW0tPnJlX3RpbWVvdXQgPSAwOwotCQkJaWYgKGR1bS0+ZHJpdmVyKSB7CisJCWlmICgoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUkVTRVQpICE9IDAgJiYKKwkJCQl0aW1lX2FmdGVyX2VxIChqaWZmaWVzLCBkdW0tPnJlX3RpbWVvdXQpKSB7CisJCQlkdW0tPnBvcnRfc3RhdHVzIHw9IChVU0JfUE9SVF9TVEFUX0NfUkVTRVQgPDwgMTYpOworCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9SRVNFVDsKKwkJCWlmIChkdW0tPnB1bGx1cCkgewogCQkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9FTkFCTEU7CiAJCQkJLyogZ2l2ZSBpdCB0aGUgYmVzdCBzcGVlZCB3ZSBhZ3JlZSBvbiAqLwogCQkJCWR1bS0+Z2FkZ2V0LnNwZWVkID0gZHVtLT5kcml2ZXItPnNwZWVkOwpAQCAtMTUxNiw4ICsxNjk5LDkgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQkJKCh1MTYgKikgYnVmKVswXSA9IGNwdV90b19sZTE2IChkdW0tPnBvcnRfc3RhdHVzKTsKLQkJKCh1MTYgKikgYnVmKVsxXSA9IGNwdV90b19sZTE2IChkdW0tPnBvcnRfc3RhdHVzID4+IDE2KTsKKwkJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJCSgoX19sZTE2ICopIGJ1ZilbMF0gPSBjcHVfdG9fbGUxNiAoZHVtLT5wb3J0X3N0YXR1cyk7CisJCSgoX19sZTE2ICopIGJ1ZilbMV0gPSBjcHVfdG9fbGUxNiAoZHVtLT5wb3J0X3N0YXR1cyA+PiAxNik7CiAJCWJyZWFrOwogCWNhc2UgU2V0SHViRmVhdHVyZToKIAkJcmV0dmFsID0gLUVQSVBFOwpAQCAtMTUyNSwzNiArMTcwOSwzNyBAQAogCWNhc2UgU2V0UG9ydEZlYXR1cmU6CiAJCXN3aXRjaCAod1ZhbHVlKSB7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgotCQkJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgKDEgPDwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EKSkKLQkJCQkJPT0gMCkgewotCQkJCWR1bS0+cG9ydF9zdGF0dXMgfD0KLQkJCQkJCSgxIDw8IFVTQl9QT1JUX0ZFQVRfU1VTUEVORCk7Ci0JCQkJaWYgKGR1bS0+ZHJpdmVyICYmIGR1bS0+ZHJpdmVyLT5zdXNwZW5kKSB7Ci0JCQkJCXNwaW5fdW5sb2NrICgmZHVtLT5sb2NrKTsKLQkJCQkJZHVtLT5kcml2ZXItPnN1c3BlbmQgKCZkdW0tPmdhZGdldCk7Ci0JCQkJCXNwaW5fbG9jayAoJmR1bS0+bG9jayk7Ci0JCQkJfQorCQkJaWYgKGR1bS0+YWN0aXZlKSB7CisJCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CisKKwkJCQkvKiBITlAgd291bGQgaGFwcGVuIGhlcmU7IGZvciBub3cgd2UKKwkJCQkgKiBhc3N1bWUgYl9idXNfcmVxIGlzIGFsd2F5cyB0cnVlLgorCQkJCSAqLworCQkJCXNldF9saW5rX3N0YXRlIChkdW0pOworCQkJCWlmICgoKDEgPDwgVVNCX0RFVklDRV9CX0hOUF9FTkFCTEUpCisJCQkJCQkmIGR1bS0+ZGV2c3RhdHVzKSAhPSAwKQorCQkJCQlkZXZfZGJnIChkdW1teV9kZXYoZHVtKSwKKwkJCQkJCQkibm8gSE5QIHlldCFcbiIpOwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9QT1dFUjsKKwkJCXNldF9saW5rX3N0YXRlIChkdW0pOworCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKLQkJCS8qIGlmIGl0J3MgYWxyZWFkeSBydW5uaW5nLCBkaXNjb25uZWN0IGZpcnN0ICovCi0JCQlpZiAoZHVtLT5wb3J0X3N0YXR1cyAmIFVTQl9QT1JUX1NUQVRfRU5BQkxFKSB7Ci0JCQkJZHVtLT5wb3J0X3N0YXR1cyAmPSB+KFVTQl9QT1JUX1NUQVRfRU5BQkxFCi0JCQkJCQl8IFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVECi0JCQkJCQl8IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRCk7Ci0JCQkJaWYgKGR1bS0+ZHJpdmVyKSB7Ci0JCQkJCWRldl9kYmcgKGR1bW15X2RldihkdW0pLAotCQkJCQkJCSJkaXNjb25uZWN0XG4iKTsKLQkJCQkJc3RvcF9hY3Rpdml0eSAoZHVtLCBkdW0tPmRyaXZlcik7Ci0JCQkJfQotCi0JCQkJLyogRklYTUUgdGVzdCB0aGF0IGNvZGUgcGF0aCEgKi8KLQkJCX0KKwkJCS8qIGlmIGl0J3MgYWxyZWFkeSBlbmFibGVkLCBkaXNhYmxlICovCisJCQlkdW0tPnBvcnRfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9FTkFCTEUKKwkJCQkJfCBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRAorCQkJCQl8IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRCk7CisJCQlkdW0tPmRldnN0YXR1cyA9IDA7CiAJCQkvKiA1MG1zZWMgcmVzZXQgc2lnbmFsaW5nICovCiAJCQlkdW0tPnJlX3RpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MCk7Ci0JCQkvKiBGQUxMVEhST1VHSCAqLworCQkJLyogRkFMTFMgVEhST1VHSCAqLwogCQlkZWZhdWx0OgotCQkJZHVtLT5wb3J0X3N0YXR1cyB8PSAoMSA8PCB3VmFsdWUpOworCQkJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9QT1dFUikgIT0gMCkgeworCQkJCWR1bS0+cG9ydF9zdGF0dXMgfD0gKDEgPDwgd1ZhbHVlKTsKKwkJCQlzZXRfbGlua19zdGF0ZSAoZHVtKTsKKwkJCX0KIAkJfQogCQlicmVhazsKIApAQCAtMTU2Nyw5ICsxNzUyLDM1IEBACiAJCXJldHZhbCA9IC1FUElQRTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmR1bS0+bG9jaywgZmxhZ3MpOworCisJaWYgKChkdW0tPnBvcnRfc3RhdHVzICYgUE9SVF9DX01BU0spICE9IDApCisJCXVzYl9oY2RfcG9sbF9yaF9zdGF0dXMgKGhjZCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGludCBkdW1teV9odWJfc3VzcGVuZCAoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgZHVtbXkgKmR1bSA9IGhjZF90b19kdW1teSAoaGNkKTsKKworCXNwaW5fbG9ja19pcnEgKCZkdW0tPmxvY2spOworCWR1bS0+cmhfc3RhdGUgPSBEVU1NWV9SSF9TVVNQRU5ERUQ7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJc3Bpbl91bmxvY2tfaXJxICgmZHVtLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdW1teV9odWJfcmVzdW1lIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBkdW1teSAqZHVtID0gaGNkX3RvX2R1bW15IChoY2QpOworCisJc3Bpbl9sb2NrX2lycSAoJmR1bS0+bG9jayk7CisJZHVtLT5yaF9zdGF0ZSA9IERVTU1ZX1JIX1JVTk5JTkc7CisJc2V0X2xpbmtfc3RhdGUgKGR1bSk7CisJaWYgKCFsaXN0X2VtcHR5KCZkdW0tPnVyYnBfbGlzdCkpCisJCW1vZF90aW1lciAoJmR1bS0+dGltZXIsIGppZmZpZXMpOworCXNwaW5fdW5sb2NrX2lycSAoJmR1bS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTE2MjUsOCArMTgzNiw2IEBACiBzdGF0aWMgaW50IGR1bW15X3N0YXJ0IChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBkdW1teQkJKmR1bTsKLQlzdHJ1Y3QgdXNiX2RldmljZQkqcm9vdDsKLQlpbnQJCQlyZXR2YWw7CiAKIAlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CiAKQEAgLTE2MzksMzggKzE4NDgsMjIgQEAKIAlpbml0X3RpbWVyICgmZHVtLT50aW1lcik7CiAJZHVtLT50aW1lci5mdW5jdGlvbiA9IGR1bW15X3RpbWVyOwogCWR1bS0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkdW07CisJZHVtLT5yaF9zdGF0ZSA9IERVTU1ZX1JIX1JVTk5JTkc7CiAKIAlJTklUX0xJU1RfSEVBRCAoJmR1bS0+dXJicF9saXN0KTsKIAotCXJvb3QgPSB1c2JfYWxsb2NfZGV2IChOVUxMLCAmaGNkLT5zZWxmLCAwKTsKLQlpZiAoIXJvb3QpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogcm9vdCBodWIgZW50ZXJzIGFkZHJlc3NlZCBzdGF0ZS4uLiAqLwotCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOwotCXJvb3QtPnNwZWVkID0gVVNCX1NQRUVEX0hJR0g7Ci0KLQkvKiAuLi50aGVuIGNvbmZpZ3VyZWQsIHNvIGtodWJkIHNlZXMgdXMuICovCi0JaWYgKChyZXR2YWwgPSB1c2JfaGNkX3JlZ2lzdGVyX3Jvb3RfaHViIChyb290LCBoY2QpKSAhPSAwKSB7Ci0JCWdvdG8gZXJyMTsKLQl9Ci0KIAkvKiBvbmx5IHNob3cgYSBsb3ctcG93ZXIgcG9ydDoganVzdCA4bUEgKi8KLQlodWJfc2V0X3Bvd2VyX2J1ZGdldCAocm9vdCwgOCk7CisJaGNkLT5wb3dlcl9idWRnZXQgPSA4OworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCWhjZC0+dXNlc19uZXdfcG9sbGluZyA9IDE7CiAKLQlpZiAoKHJldHZhbCA9IGR1bW15X3JlZ2lzdGVyX3VkYyAoZHVtKSkgIT0gMCkKLQkJZ290byBlcnIyOworI2lmZGVmIENPTkZJR19VU0JfT1RHCisJaGNkLT5zZWxmLm90Z19wb3J0ID0gMTsKKyNlbmRpZgogCiAJLyogRklYTUUgJ3VyYnMnIHNob3VsZCBiZSBhIHBlci1kZXZpY2UgdGhpbmcsIG1heWJlIGluIHVzYmNvcmUgKi8KIAlkZXZpY2VfY3JlYXRlX2ZpbGUgKGR1bW15X2RldihkdW0pLCAmZGV2X2F0dHJfdXJicyk7CiAJcmV0dXJuIDA7Ci0KLSBlcnIyOgotCXVzYl9kaXNjb25uZWN0ICgmaGNkLT5zZWxmLnJvb3RfaHViKTsKLSBlcnIxOgotCXVzYl9wdXRfZGV2IChyb290KTsKLQloY2QtPnN0YXRlID0gSENfU1RBVEVfUVVJRVNDSU5HOwotCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIGR1bW15X3N0b3AgKHN0cnVjdCB1c2JfaGNkICpoY2QpCkBAIC0xNjgwLDEwICsxODczLDcgQEAKIAlkdW0gPSBoY2RfdG9fZHVtbXkgKGhjZCk7CiAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUgKGR1bW15X2RldihkdW0pLCAmZGV2X2F0dHJfdXJicyk7Ci0KIAl1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyIChkdW0tPmRyaXZlcik7Ci0JZHVtbXlfdW5yZWdpc3Rlcl91ZGMgKGR1bSk7Ci0KIAlkZXZfaW5mbyAoZHVtbXlfZGV2KGR1bSksICJzdG9wcGVkXG4iKTsKIH0KIApAQCAtMTcxMSw5ICsxOTAxLDExIEBACiAKIAkuaHViX3N0YXR1c19kYXRhID0gCWR1bW15X2h1Yl9zdGF0dXMsCiAJLmh1Yl9jb250cm9sID0gCQlkdW1teV9odWJfY29udHJvbCwKKwkuaHViX3N1c3BlbmQgPQkJZHVtbXlfaHViX3N1c3BlbmQsCisJLmh1Yl9yZXN1bWUgPQkJZHVtbXlfaHViX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgZHVtbXlfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZHVtbXlfaGNkX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CiAJaW50CQkJcmV0dmFsOwpAQCAtMTczMyw3ICsxOTI1LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBkdW1teV9yZW1vdmUgKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZHVtbXlfaGNkX3JlbW92ZSAoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB1c2JfaGNkCQkqaGNkOwogCkBAIC0xNzQxLDM1ICsxOTMzLDg3IEBACiAJdXNiX3JlbW92ZV9oY2QgKGhjZCk7CiAJdXNiX3B1dF9oY2QgKGhjZCk7CiAJdGhlX2NvbnRyb2xsZXIgPSBOVUxMOworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGR1bW15X2hjZF9zdXNwZW5kIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwKKwkJdTMyIGxldmVsKQoreworCXN0cnVjdCB1c2JfaGNkCQkqaGNkOworCisJaWYgKGxldmVsICE9IFNVU1BFTkRfRElTQUJMRSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnIChkZXYsICIlc1xuIiwgX19GVU5DVElPTl9fKTsKKwloY2QgPSBkZXZfZ2V0X2RydmRhdGEgKGRldik7CisKKyNpZm5kZWYgQ09ORklHX1VTQl9TVVNQRU5ECisJLyogT3RoZXJ3aXNlIHRoaXMgd291bGQgbmV2ZXIgaGFwcGVuICovCisJdXNiX2xvY2tfZGV2aWNlIChoY2QtPnNlbGYucm9vdF9odWIpOworCWR1bW15X2h1Yl9zdXNwZW5kIChoY2QpOworCXVzYl91bmxvY2tfZGV2aWNlIChoY2QtPnNlbGYucm9vdF9odWIpOworI2VuZGlmCisKKwloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bW15X2hjZF9yZXN1bWUgKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQoreworCXN0cnVjdCB1c2JfaGNkCQkqaGNkOworCisJaWYgKGxldmVsICE9IFJFU1VNRV9FTkFCTEUpCisJCXJldHVybiAwOworCisJZGV2X2RiZyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJaGNkID0gZGV2X2dldF9kcnZkYXRhIChkZXYpOworCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCisjaWZuZGVmIENPTkZJR19VU0JfU1VTUEVORAorCS8qIE90aGVyd2lzZSB0aGlzIHdvdWxkIG5ldmVyIGhhcHBlbiAqLworCXVzYl9sb2NrX2RldmljZSAoaGNkLT5zZWxmLnJvb3RfaHViKTsKKwlkdW1teV9odWJfcmVzdW1lIChoY2QpOworCXVzYl91bmxvY2tfZGV2aWNlIChoY2QtPnNlbGYucm9vdF9odWIpOworI2VuZGlmCisKKwl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzIChoY2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgZHVtbXlfaGNkX2RyaXZlciA9IHsKKwkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKKwkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKKwkucHJvYmUJCT0gZHVtbXlfaGNkX3Byb2JlLAorCS5yZW1vdmUJCT0gZHVtbXlfaGNkX3JlbW92ZSwKKwkuc3VzcGVuZAk9IGR1bW15X2hjZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZHVtbXlfaGNkX3Jlc3VtZSwKK307CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBpbnQgZHVtbXlfcGRldl9kZXRlY3QgKHZvaWQpCi17Ci0JaW50CQkJcmV0dmFsOworLyogVGhlc2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBiZWNhdXNlIHRoZSBwZGV2IHN0cnVjdHVyZXMgYXJlCisgKiBzdGF0aWNhbGx5IGFsbG9jYXRlZC4gKi8KK3N0YXRpYyB2b2lkCitkdW1teV91ZGNfcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2KSB7fQogCi0JcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyICgmZHVtbXlfZHJpdmVyKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIHJldHZhbDsKK3N0YXRpYyB2b2lkCitkdW1teV9oY2RfcmVsZWFzZSAoc3RydWN0IGRldmljZSAqZGV2KSB7fQogCi0JdGhlX3BkZXYubmFtZSA9ICJoYyI7Ci0JdGhlX3BkZXYuZGV2LmRyaXZlciA9ICZkdW1teV9kcml2ZXI7Ci0JdGhlX3BkZXYuZGV2LnJlbGVhc2UgPSBkdW1teV9wZGV2X3JlbGVhc2U7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkJdGhlX3VkY19wZGV2ID0geworCS5uYW1lCQk9IChjaGFyICopIGdhZGdldF9uYW1lLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnJlbGVhc2UJPSBkdW1teV91ZGNfcmVsZWFzZSwKKwl9LAorfTsKIAotCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlciAoJnRoZV9wZGV2KTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJZHJpdmVyX3VucmVnaXN0ZXIgKCZkdW1teV9kcml2ZXIpOwotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkIGR1bW15X3BkZXZfcmVtb3ZlICh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyICgmdGhlX3BkZXYpOwotCWRyaXZlcl91bnJlZ2lzdGVyICgmZHVtbXlfZHJpdmVyKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQl0aGVfaGNkX3BkZXYgPSB7CisJLm5hbWUJCT0gKGNoYXIgKikgZHJpdmVyX25hbWUsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucmVsZWFzZQk9IGR1bW15X2hjZF9yZWxlYXNlLAorCX0sCit9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0ICh2b2lkKQogewpAQCAtMTc3NywxNyArMjAyMSwzOSBAQAogCiAJaWYgKHVzYl9kaXNhYmxlZCAoKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKChyZXR2YWwgPSBkdW1teV9wZGV2X2RldGVjdCAoKSkgIT0gMCkKKworCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlciAoJmR1bW15X2hjZF9kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKQogCQlyZXR1cm4gcmV0dmFsOwotCWlmICgocmV0dmFsID0gZHVtbXlfcHJvYmUgKCZ0aGVfcGRldi5kZXYpKSAhPSAwKQotCQlkdW1teV9wZGV2X3JlbW92ZSAoKTsKKworCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlciAoJmR1bW15X3VkY19kcml2ZXIpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycl9yZWdpc3Rlcl91ZGNfZHJpdmVyOworCisJcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyICgmdGhlX2hjZF9wZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfcmVnaXN0ZXJfaGNkOworCisJcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyICgmdGhlX3VkY19wZGV2KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnJfcmVnaXN0ZXJfdWRjOworCXJldHVybiByZXR2YWw7CisKK2Vycl9yZWdpc3Rlcl91ZGM6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIgKCZ0aGVfaGNkX3BkZXYpOworZXJyX3JlZ2lzdGVyX2hjZDoKKwlkcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X3VkY19kcml2ZXIpOworZXJyX3JlZ2lzdGVyX3VkY19kcml2ZXI6CisJZHJpdmVyX3VucmVnaXN0ZXIgKCZkdW1teV9oY2RfZHJpdmVyKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogbW9kdWxlX2luaXQgKGluaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cCAodm9pZCkKIHsKLQlkdW1teV9yZW1vdmUgKCZ0aGVfcGRldi5kZXYpOwotCWR1bW15X3BkZXZfcmVtb3ZlICgpOworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyICgmdGhlX3VkY19wZGV2KTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlciAoJnRoZV9oY2RfcGRldik7CisJZHJpdmVyX3VucmVnaXN0ZXIgKCZkdW1teV91ZGNfZHJpdmVyKTsKKwlkcml2ZXJfdW5yZWdpc3RlciAoJmR1bW15X2hjZF9kcml2ZXIpOwogfQogbW9kdWxlX2V4aXQgKGNsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwppbmRleCAzZjc4M2NiLi44NTA5ZTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYwpAQCAtODQsMTggKzg0LDE5IEBACiAgKi8KIAogI2RlZmluZSBEUklWRVJfREVTQwkJIkV0aGVybmV0IEdhZGdldCIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJFcXVpbm94IDIwMDQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiTWF5IERheSAyMDA1IgogCiBzdGF0aWMgY29uc3QgY2hhciBzaG9ydG5hbWUgW10gPSAiZXRoZXIiOwogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX2Rlc2MgW10gPSBEUklWRVJfREVTQzsKIAogI2RlZmluZSBSWF9FWFRSQQkyMAkJLyogZ3VhcmQgYWdhaW5zdCByeCBvdmVyZmxvd3MgKi8KIAotI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCiAjaW5jbHVkZSAicm5kaXMuaCIKLSNlbHNlCi0jZGVmaW5lIHJuZGlzX2luaXQoKSAwCi0jZGVmaW5lIHJuZGlzX2V4aXQoKSBkb3t9d2hpbGUoMCkKKworI2lmbmRlZglDT05GSUdfVVNCX0VUSF9STkRJUworI2RlZmluZSBybmRpc191bmluaXQoeCkJCWRve313aGlsZSgwKQorI2RlZmluZSBybmRpc19kZXJlZ2lzdGVyKGMpCWRve313aGlsZSgwKQorI2RlZmluZSBybmRpc19leGl0KCkJCWRve313aGlsZSgwKQogI2VuZGlmCiAKIC8qIENEQyBhbmQgUk5ESVMgc3VwcG9ydCB0aGUgc2FtZSBob3N0LWNob3NlbiBvdXRnb2luZyBwYWNrZXQgZmlsdGVycy4gKi8KQEAgLTE0MCw5ICsxNDEsNiBAQAogICogSXQgYWxzbyBBU1NVTUVTIGEgc2VsZi1wb3dlcmVkIGRldmljZSwgd2l0aG91dCByZW1vdGUgd2FrZXVwLAogICogYWx0aG91Z2ggcmVtb3RlIHdha2V1cCBzdXBwb3J0IHdvdWxkIG1ha2Ugc2Vuc2UuCiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpFUF9JTl9OQU1FOwotc3RhdGljIGNvbnN0IGNoYXIgKkVQX09VVF9OQU1FOwotc3RhdGljIGNvbnN0IGNoYXIgKkVQX1NUQVRVU19OQU1FOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0zMTIsNiArMzEwLDcgQEAKICNkZWZpbmUJRlNfQlBTCQkoMTkgKiAgNjQgKiAxICogMTAwMCAqIDgpCiAKICNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQKKyNkZWZpbmUJREVWU1BFRUQJVVNCX1NQRUVEX0hJR0gKIAogc3RhdGljIHVuc2lnbmVkIHFtdWx0ID0gNTsKIG1vZHVsZV9wYXJhbSAocW11bHQsIHVpbnQsIFNfSVJVR098U19JV1VTUik7CkBAIC0zMzAsNiArMzI5LDggQEAKIH0KIAogI2Vsc2UJLyogZnVsbCBzcGVlZCAobG93IHNwZWVkIGRvZXNuJ3QgZG8gYnVsaykgKi8KKyNkZWZpbmUJREVWU1BFRUQJVVNCX1NQRUVEX0ZVTEwKKwogI2RlZmluZSBxbGVuKGdhZGdldCkgREVGQVVMVF9RTEVOCiAKIHN0YXRpYyBpbmxpbmUgaW50IEJJVFJBVEUoc3RydWN0IHVzYl9nYWRnZXQgKmcpCkBAIC0zOTUsNyArMzk2LDggQEAKICNkZWZpbmUgU1RSSU5HX1NVQlNFVAkJCTgKICNkZWZpbmUgU1RSSU5HX1JORElTCQkJOQogCi0jZGVmaW5lIFVTQl9CVUZTSVoJMjU2CQkvKiBob2xkcyBvdXIgYmlnZ2VzdCBkZXNjcmlwdG9yICovCisvKiBob2xkcyBvdXIgYmlnZ2VzdCBkZXNjcmlwdG9yIChvciBSTkRJUyByZXNwb25zZSkgKi8KKyNkZWZpbmUgVVNCX0JVRlNJWgkyNTYKIAogLyoKICAqIFRoaXMgZGV2aWNlIGFkdmVydGlzZXMgb25lIGNvbmZpZ3VyYXRpb24sIGV0aF9jb25maWcsIHVubGVzcyBSTkRJUwpAQCAtNTM4LDcgKzU0MCw3IEBACiAJLmJEYXRhSW50ZXJmYWNlID0gCTB4MDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9jZGNfYWNtX2Rlc2NyaXB0b3IgYWNtX2Rlc2NyaXB0b3IgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9jZGNfYWNtX2Rlc2NyaXB0b3IgYWNtX2Rlc2NyaXB0b3IgPSB7CiAJLmJMZW5ndGggPSAgCQlzaXplb2YgYWNtX2Rlc2NyaXB0b3IsCiAJLmJEZXNjcmlwdG9yVHlwZSA9IAlVU0JfRFRfQ1NfSU5URVJGQUNFLAogCS5iRGVzY3JpcHRvclN1YlR5cGUgPSAJVVNCX0NEQ19BQ01fVFlQRSwKQEAgLTg0Niw3ICs4NDgsNyBAQAogI2Vsc2UKIAogLyogaWYgdGhlcmUncyBubyBoaWdoIHNwZWVkIHN1cHBvcnQsIG1heHBhY2tldCBkb2Vzbid0IGNoYW5nZS4gKi8KLSNkZWZpbmUgZXBfZGVzYyhnLGhzLGZzKSBmcworI2RlZmluZSBlcF9kZXNjKGcsaHMsZnMpICgoKHZvaWQpKGcpKSwgKGZzKSkKIAogc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBoc19zdWJzZXRfZGVzY3JpcHRvcnModm9pZCkKIHsKQEAgLTk0MywxMyArOTQ1LDM2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIGV0aF9zdGFydCAoc3RydWN0IGV0aF9kZXYgKmRldiwgaW50IGdmcF9mbGFncyk7Ci1zdGF0aWMgaW50IGFsbG9jX3JlcXVlc3RzIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBuLCBpbnQgZ2ZwX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIGV0aF9zdGFydCAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKTsKK3N0YXRpYyBpbnQgYWxsb2NfcmVxdWVzdHMgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG4sIHVuc2lnbmVkIGdmcF9mbGFncyk7CiAKLSNpZmRlZglERVZfQ09ORklHX0NEQwotc3RhdGljIGlubGluZSBpbnQgZXRoZXJfYWx0X2VwX3NldHVwIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCBzdHJ1Y3QgdXNiX2VwICplcCkKK3N0YXRpYyBpbnQKK3NldF9ldGhlcl9jb25maWcgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKLQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmQ7CisJaW50CQkJCQlyZXN1bHQgPSAwOworCXN0cnVjdCB1c2JfZ2FkZ2V0CQkJKmdhZGdldCA9IGRldi0+Z2FkZ2V0OworCisjaWYgZGVmaW5lZChERVZfQ09ORklHX0NEQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKKwkvKiBzdGF0dXMgZW5kcG9pbnQgdXNlZCBmb3IgUk5ESVMgYW5kIChvcHRpb25hbGx5KSBDREMgKi8KKwlpZiAoIXN1YnNldF9hY3RpdmUoZGV2KSAmJiBkZXYtPnN0YXR1c19lcCkgeworCQlkZXYtPnN0YXR1cyA9IGVwX2Rlc2MgKGdhZGdldCwgJmhzX3N0YXR1c19kZXNjLAorCQkJCQkJJmZzX3N0YXR1c19kZXNjKTsKKwkJZGV2LT5zdGF0dXNfZXAtPmRyaXZlcl9kYXRhID0gZGV2OworCisJCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUgKGRldi0+c3RhdHVzX2VwLCBkZXYtPnN0YXR1cyk7CisJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJREVCVUcgKGRldiwgImVuYWJsZSAlcyAtLT4gJWRcbiIsIAorCQkJCWRldi0+c3RhdHVzX2VwLT5uYW1lLCByZXN1bHQpOworCQkJZ290byBkb25lOworCQl9CisJfQorI2VuZGlmCisKKwlkZXYtPmluID0gZXBfZGVzYyAoZGV2LT5nYWRnZXQsICZoc19zb3VyY2VfZGVzYywgJmZzX3NvdXJjZV9kZXNjKTsKKwlkZXYtPmluX2VwLT5kcml2ZXJfZGF0YSA9IGRldjsKKworCWRldi0+b3V0ID0gZXBfZGVzYyAoZGV2LT5nYWRnZXQsICZoc19zaW5rX2Rlc2MsICZmc19zaW5rX2Rlc2MpOworCWRldi0+b3V0X2VwLT5kcml2ZXJfZGF0YSA9IGRldjsKIAogCS8qIFdpdGggQ0RDLCAgdGhlIGhvc3QgaXNuJ3QgYWxsb3dlZCB0byB1c2UgdGhlc2UgdHdvIGRhdGEKIAkgKiBlbmRwb2ludHMgaW4gdGhlIGRlZmF1bHQgYWx0c2V0dGluZyBmb3IgdGhlIGludGVyZmFjZS4KQEAgLTk1OSwxMzUgKzk4NCwzMyBAQAogCSAqIGEgc2lkZSBlZmZlY3Qgb2Ygc2V0dGluZyBhIHBhY2tldCBmaWx0ZXIuICBEZWFjdGl2YXRpb24gaXMKIAkgKiBmcm9tIFJFTU9URV9ORElTX0hBTFRfTVNHLCByZXNldCBmcm9tIFJFTU9URV9ORElTX1JFU0VUX01TRy4KIAkgKi8KLQotCS8qIG9uZSBlbmRwb2ludCB3cml0ZXMgZGF0YSBiYWNrIElOIHRvIHRoZSBob3N0ICovCi0JaWYgKHN0cmNtcCAoZXAtPm5hbWUsIEVQX0lOX05BTUUpID09IDApIHsKLQkJZCA9IGVwX2Rlc2MgKGRldi0+Z2FkZ2V0LCAmaHNfc291cmNlX2Rlc2MsICZmc19zb3VyY2VfZGVzYyk7Ci0JCWVwLT5kcml2ZXJfZGF0YSA9IGRldjsKLQkJZGV2LT5pbiA9IGQ7Ci0KLQkvKiBvbmUgZW5kcG9pbnQganVzdCByZWFkcyBPVVQgcGFja2V0cyAqLwotCX0gZWxzZSBpZiAoc3RyY21wIChlcC0+bmFtZSwgRVBfT1VUX05BTUUpID09IDApIHsKLQkJZCA9IGVwX2Rlc2MgKGRldi0+Z2FkZ2V0LCAmaHNfc2lua19kZXNjLCAmZnNfc2lua19kZXNjKTsKLQkJZXAtPmRyaXZlcl9kYXRhID0gZGV2OwotCQlkZXYtPm91dCA9IGQ7Ci0KLQkvKiBvcHRpb25hbCBzdGF0dXMvbm90aWZpY2F0aW9uIGVuZHBvaW50ICovCi0JfSBlbHNlIGlmIChFUF9TVEFUVVNfTkFNRSAmJgotCQkJc3RyY21wIChlcC0+bmFtZSwgRVBfU1RBVFVTX05BTUUpID09IDApIHsKLQkJaW50CQkJcmVzdWx0OwotCi0JCWQgPSBlcF9kZXNjIChkZXYtPmdhZGdldCwgJmhzX3N0YXR1c19kZXNjLCAmZnNfc3RhdHVzX2Rlc2MpOwotCQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlIChlcCwgZCk7Ci0JCWlmIChyZXN1bHQgPCAwKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQllcC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0JCWRldi0+c3RhdHVzID0gZDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2lmCWRlZmluZWQoREVWX0NPTkZJR19TVUJTRVQpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FVEhfUk5ESVMpCi1zdGF0aWMgaW5saW5lIGludCBldGhlcl9lcF9zZXR1cCAoc3RydWN0IGV0aF9kZXYgKmRldiwgc3RydWN0IHVzYl9lcCAqZXApCi17Ci0JaW50CQkJCQlyZXN1bHQ7Ci0JY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCSpkOwotCi0JLyogQ0RDIHN1YnNldCBpcyBzaW1wbGVyOiAgaWYgdGhlIGRldmljZSBpcyB0aGVyZSwKLQkgKiBpdCdzIGxpdmUgd2l0aCByeCBhbmQgdHggZW5kcG9pbnRzLgotCSAqCi0JICogRG8gdGhpcyBhcyBhIHNob3J0Y3V0IGZvciBSTkRJUyB0b28uCi0JICovCi0KLQkvKiBvbmUgZW5kcG9pbnQgd3JpdGVzIGRhdGEgYmFjayBJTiB0byB0aGUgaG9zdCAqLwotCWlmIChzdHJjbXAgKGVwLT5uYW1lLCBFUF9JTl9OQU1FKSA9PSAwKSB7Ci0JCWQgPSBlcF9kZXNjIChkZXYtPmdhZGdldCwgJmhzX3NvdXJjZV9kZXNjLCAmZnNfc291cmNlX2Rlc2MpOwotCQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlIChlcCwgZCk7Ci0JCWlmIChyZXN1bHQgPCAwKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQllcC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0JCWRldi0+aW4gPSBkOwotCi0JLyogb25lIGVuZHBvaW50IGp1c3QgcmVhZHMgT1VUIHBhY2tldHMgKi8KLQl9IGVsc2UgaWYgKHN0cmNtcCAoZXAtPm5hbWUsIEVQX09VVF9OQU1FKSA9PSAwKSB7Ci0JCWQgPSBlcF9kZXNjIChkZXYtPmdhZGdldCwgJmhzX3NpbmtfZGVzYywgJmZzX3NpbmtfZGVzYyk7Ci0JCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUgKGVwLCBkKTsKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCWVwLT5kcml2ZXJfZGF0YSA9IGRldjsKLQkJZGV2LT5vdXQgPSBkOwotCX0KLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXNldF9ldGhlcl9jb25maWcgKHN0cnVjdCBldGhfZGV2ICpkZXYsIGludCBnZnBfZmxhZ3MpCi17Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgdXNiX2VwCQkqZXA7Ci0Jc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldCA9IGRldi0+Z2FkZ2V0OwotCi0JZ2FkZ2V0X2Zvcl9lYWNoX2VwIChlcCwgZ2FkZ2V0KSB7Ci0jaWZkZWYJREVWX0NPTkZJR19DREMKLQkJaWYgKCFkZXYtPnJuZGlzICYmIGRldi0+Y2RjKSB7Ci0JCQlyZXN1bHQgPSBldGhlcl9hbHRfZXBfc2V0dXAgKGRldiwgZXApOwotCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0jZW5kaWYKLQotI2lmZGVmCUNPTkZJR19VU0JfRVRIX1JORElTCi0JCWlmIChkZXYtPnJuZGlzICYmIHN0cmNtcCAoZXAtPm5hbWUsIEVQX1NUQVRVU19OQU1FKSA9PSAwKSB7Ci0JCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJKmQ7Ci0JCQlkID0gZXBfZGVzYyAoZ2FkZ2V0LCAmaHNfc3RhdHVzX2Rlc2MsICZmc19zdGF0dXNfZGVzYyk7Ci0JCQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlIChlcCwgZCk7Ci0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQllcC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0JCQkJZGV2LT5zdGF0dXMgPSBkOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9IGVsc2UKLSNlbmRpZgotCi0JCXsKLSNpZglkZWZpbmVkKERFVl9DT05GSUdfU1VCU0VUKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQotCQkJcmVzdWx0ID0gZXRoZXJfZXBfc2V0dXAgKGRldiwgZXApOwotCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCWNvbnRpbnVlOwotI2VuZGlmCisJaWYgKCFjZGNfYWN0aXZlKGRldikpIHsKKwkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZSAoZGV2LT5pbl9lcCwgZGV2LT5pbik7CisJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJREVCVUcoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwgCisJCQkJZGV2LT5pbl9lcC0+bmFtZSwgcmVzdWx0KTsKKwkJCWdvdG8gZG9uZTsKIAkJfQogCi0JCS8qIHN0b3Agb24gZXJyb3IgKi8KLQkJRVJST1IgKGRldiwgImNhbid0IGVuYWJsZSAlcywgcmVzdWx0ICVkXG4iLCBlcC0+bmFtZSwgcmVzdWx0KTsKLQkJYnJlYWs7CisJCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUgKGRldi0+b3V0X2VwLCBkZXYtPm91dCk7CisJCWlmIChyZXN1bHQgIT0gMCkgeworCQkJREVCVUcgKGRldiwgImVuYWJsZSAlcyAtLT4gJWRcbiIsIAorCQkJCWRldi0+aW5fZXAtPm5hbWUsIHJlc3VsdCk7CisJCQlnb3RvIGRvbmU7CisJCX0KIAl9Ci0JaWYgKCFyZXN1bHQgJiYgKCFkZXYtPmluX2VwIHx8ICFkZXYtPm91dF9lcCkpCi0JCXJlc3VsdCA9IC1FTk9ERVY7CiAKK2RvbmU6CiAJaWYgKHJlc3VsdCA9PSAwKQogCQlyZXN1bHQgPSBhbGxvY19yZXF1ZXN0cyAoZGV2LCBxbGVuIChnYWRnZXQpLCBnZnBfZmxhZ3MpOwogCiAJLyogb24gZXJyb3IsIGRpc2FibGUgYW55IGVuZHBvaW50cyAgKi8KIAlpZiAocmVzdWx0IDwgMCkgewotI2lmIGRlZmluZWQoREVWX0NPTkZJR19DREMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FVEhfUk5ESVMpCi0JCWlmIChkZXYtPnN0YXR1cykKKwkJaWYgKCFzdWJzZXRfYWN0aXZlKGRldikpCiAJCQkodm9pZCkgdXNiX2VwX2Rpc2FibGUgKGRldi0+c3RhdHVzX2VwKTsKLSNlbmRpZgogCQlkZXYtPnN0YXR1cyA9IE5VTEw7Ci0jaWYgZGVmaW5lZChERVZfQ09ORklHX1NVQlNFVCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKLQkJaWYgKGRldi0+cm5kaXMgfHwgIWRldi0+Y2RjKSB7Ci0JCQlpZiAoZGV2LT5pbikKLQkJCQkodm9pZCkgdXNiX2VwX2Rpc2FibGUgKGRldi0+aW5fZXApOwotCQkJaWYgKGRldi0+b3V0KQotCQkJCSh2b2lkKSB1c2JfZXBfZGlzYWJsZSAoZGV2LT5vdXRfZXApOwotCQl9Ci0jZW5kaWYKKwkJKHZvaWQpIHVzYl9lcF9kaXNhYmxlIChkZXYtPmluX2VwKTsKKwkJKHZvaWQpIHVzYl9lcF9kaXNhYmxlIChkZXYtPm91dF9lcCk7CiAJCWRldi0+aW4gPSBOVUxMOwogCQlkZXYtPm91dCA9IE5VTEw7CiAJfSBlbHNlCkBAIC0xMDk1LDggKzEwMTgsNyBAQAogCS8qIGFjdGl2YXRlIG5vbi1DREMgY29uZmlncyByaWdodCBhd2F5CiAJICogdGhpcyBpc24ndCBzdHJpY3RseSBhY2NvcmRpbmcgdG8gdGhlIFJORElTIHNwZWMKIAkgKi8KLSNpZiBkZWZpbmVkKERFVl9DT05GSUdfU1VCU0VUKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQotCWlmIChkZXYtPnJuZGlzIHx8ICFkZXYtPmNkYykgeworCWlmICghY2RjX2FjdGl2ZSAoZGV2KSkgewogCQluZXRpZl9jYXJyaWVyX29uIChkZXYtPm5ldCk7CiAJCWlmIChuZXRpZl9ydW5uaW5nIChkZXYtPm5ldCkpIHsKIAkJCXNwaW5fdW5sb2NrICgmZGV2LT5sb2NrKTsKQEAgLTExMDQsNyArMTAyNiw2IEBACiAJCQlzcGluX2xvY2sgKCZkZXYtPmxvY2spOwogCQl9CiAJfQotI2VuZGlmCiAKIAlpZiAocmVzdWx0ID09IDApCiAJCURFQlVHIChkZXYsICJxbGVuICVkXG4iLCBxbGVuIChnYWRnZXQpKTsKQEAgLTExMjQsNiArMTA0NSw3IEBACiAKIAluZXRpZl9zdG9wX3F1ZXVlIChkZXYtPm5ldCk7CiAJbmV0aWZfY2Fycmllcl9vZmYgKGRldi0+bmV0KTsKKwlybmRpc191bmluaXQoZGV2LT5ybmRpc19jb25maWcpOwogCiAJLyogZGlzYWJsZSBlbmRwb2ludHMsIGZvcmNpbmcgKHN5bmNocm9ub3VzKSBjb21wbGV0aW9uIG9mCiAJICogcGVuZGluZyBpL28uICB0aGVuIGZyZWUgdGhlIHJlcXVlc3RzLgpAQCAtMTE1MCw2ICsxMDcyLDggQEAKIAlpZiAoZGV2LT5zdGF0dXMpIHsKIAkJdXNiX2VwX2Rpc2FibGUgKGRldi0+c3RhdHVzX2VwKTsKIAl9CisJZGV2LT5ybmRpcyA9IDA7CisJZGV2LT5jZGNfZmlsdGVyID0gMDsKIAlkZXYtPmNvbmZpZyA9IDA7CiB9CiAKQEAgLTExNTcsMTQgKzEwODEsMTEgQEAKICAqIHRoYXQgcmV0dXJucyBjb25maWcgZGVzY3JpcHRvcnMsIGFuZCBhbHRzZXR0aW5nIGNvZGUuCiAgKi8KIHN0YXRpYyBpbnQKLWV0aF9zZXRfY29uZmlnIChzdHJ1Y3QgZXRoX2RldiAqZGV2LCB1bnNpZ25lZCBudW1iZXIsIGludCBnZnBfZmxhZ3MpCitldGhfc2V0X2NvbmZpZyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgbnVtYmVyLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgdXNiX2dhZGdldAkqZ2FkZ2V0ID0gZGV2LT5nYWRnZXQ7CiAKLQlpZiAobnVtYmVyID09IGRldi0+Y29uZmlnKQotCQlyZXR1cm4gMDsKLQogCWlmIChnYWRnZXRfaXNfc2ExMTAwIChnYWRnZXQpCiAJCQkmJiBkZXYtPmNvbmZpZwogCQkJJiYgYXRvbWljX3JlYWQgKCZkZXYtPnR4X3FsZW4pICE9IDApIHsKQEAgLTExNzQsMTIgKzEwOTUsOCBAQAogCX0KIAlldGhfcmVzZXRfY29uZmlnIChkZXYpOwogCi0JLyogZGVmYXVsdDogIHBhc3MgYWxsIHBhY2tldHMsIG5vIG11bHRpY2FzdCBmaWx0ZXJpbmcgKi8KLQlkZXYtPmNkY19maWx0ZXIgPSBERUZBVUxUX0ZJTFRFUjsKLQogCXN3aXRjaCAobnVtYmVyKSB7CiAJY2FzZSBERVZfQ09ORklHX1ZBTFVFOgotCQlkZXYtPnJuZGlzID0gMDsKIAkJcmVzdWx0ID0gc2V0X2V0aGVyX2NvbmZpZyAoZGV2LCBnZnBfZmxhZ3MpOwogCQlicmVhazsKICNpZmRlZglDT05GSUdfVVNCX0VUSF9STkRJUwpAQCAtMTIxOCw5ICsxMTM1LDkgQEAKIAkJZGV2LT5jb25maWcgPSBudW1iZXI7CiAJCUlORk8gKGRldiwgIiVzIHNwZWVkIGNvbmZpZyAjJWQ6ICVkIG1BLCAlcywgdXNpbmcgJXNcbiIsCiAJCQkJc3BlZWQsIG51bWJlciwgcG93ZXIsIGRyaXZlcl9kZXNjLAotCQkJCWRldi0+cm5kaXMKKwkJCQlybmRpc19hY3RpdmUoZGV2KQogCQkJCQk/ICJSTkRJUyIKLQkJCQkJOiAoZGV2LT5jZGMKKwkJCQkJOiAoY2RjX2FjdGl2ZShkZXYpCiAJCQkJCQk/ICJDREMgRXRoZXJuZXQiCiAJCQkJCQk6ICJDREMgRXRoZXJuZXQgU3Vic2V0IikpOwogCX0KQEAgLTEyMzEsNiArMTE0OCwxMyBAQAogCiAjaWZkZWYJREVWX0NPTkZJR19DREMKIAorLyogVGhlIGludGVycnVwdCBlbmRwb2ludCBpcyB1c2VkIGluIENEQyBuZXR3b3JraW5nIG1vZGVscyAoRXRoZXJuZXQsIEFUTSkKKyAqIG9ubHkgdG8gbm90aWZ5IHRoZSBob3N0IGFib3V0IGxpbmsgc3RhdHVzIGNoYW5nZXMgKHdoaWNoIHdlIHN1cHBvcnQpIG9yCisgKiByZXBvcnQgY29tcGxldGlvbiBvZiBzb21lIGVuY2Fwc3VsYXRlZCBjb21tYW5kIChhcyB1c2VkIGluIFJORElTKS4gIFNpbmNlCisgKiB3ZSB3YW50IHRoaXMgQ0RDIEV0aGVybmV0IGNvZGUgdG8gYmUgdmVuZG9yLW5ldXRyYWwsIHdlIGRvbid0IHVzZSB0aGF0CisgKiBjb21tYW5kIG1lY2hhbmlzbTsgYW5kIG9ubHkgb25lIHN0YXR1cyByZXF1ZXN0IGlzIGV2ZXIgcXVldWVkLgorICovCisKIHN0YXRpYyB2b2lkIGV0aF9zdGF0dXNfY29tcGxldGUgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKIHsKIAlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24JKmV2ZW50ID0gcmVxLT5idWY7CkBAIC0xMjU5LDcgKzExODMsNyBAQAogCX0gZWxzZSBpZiAodmFsdWUgIT0gLUVDT05OUkVTRVQpCiAJCURFQlVHIChkZXYsICJldmVudCAlMDJ4IC0tPiAlZFxuIiwKIAkJCWV2ZW50LT5iTm90aWZpY2F0aW9uVHlwZSwgdmFsdWUpOwotCWV2ZW50LT5ibVJlcXVlc3RUeXBlID0gMHhmZjsKKwlyZXEtPmNvbnRleHQgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBpc3N1ZV9zdGFydF9zdGF0dXMgKHN0cnVjdCBldGhfZGV2ICpkZXYpCkBAIC0xMjc2LDYgKzEyMDAsOCBAQAogCSAqIGEgImNhbmNlbCB0aGUgd2hvbGUgcXVldWUiIHByaW1pdGl2ZSBzaW5jZSBhbnkKIAkgKiB1bmxpbmstb25lIHByaW1pdGl2ZSBoYXMgd2F5IHRvbyBtYW55IGVycm9yIG1vZGVzLgogCSAqIGhlcmUsIHdlICJrbm93IiB0b2dnbGUgaXMgYWxyZWFkeSBjbGVhci4uLgorCSAqCisJICogRklYTUUgaWZmIHJlcS0+Y29udGV4dCAhPSBudWxsIGp1c3QgZGVxdWV1ZSBpdAogCSAqLwogCXVzYl9lcF9kaXNhYmxlIChkZXYtPnN0YXR1c19lcCk7CiAJdXNiX2VwX2VuYWJsZSAoZGV2LT5zdGF0dXNfZXAsIGRldi0+c3RhdHVzKTsKQEAgLTEyOTIsNiArMTIxOCw4IEBACiAKIAlyZXEtPmxlbmd0aCA9IHNpemVvZiAqZXZlbnQ7CiAJcmVxLT5jb21wbGV0ZSA9IGV0aF9zdGF0dXNfY29tcGxldGU7CisJcmVxLT5jb250ZXh0ID0gZGV2OworCiAJdmFsdWUgPSB1c2JfZXBfcXVldWUgKGRldi0+c3RhdHVzX2VwLCByZXEsIEdGUF9BVE9NSUMpOwogCWlmICh2YWx1ZSA8IDApCiAJCURFQlVHIChkZXYsICJzdGF0dXMgYnVmIHF1ZXVlIC0tPiAlZFxuIiwgdmFsdWUpOwpAQCAtMTM1MSw5ICsxMjc5LDkgQEAKIAlzdHJ1Y3QgZXRoX2RldgkJKmRldiA9IGdldF9nYWRnZXRfZGF0YSAoZ2FkZ2V0KTsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGRldi0+cmVxOwogCWludAkJCXZhbHVlID0gLUVPUE5PVFNVUFA7Ci0JdTE2CQkJd0luZGV4ID0gKF9fZm9yY2UgdTE2KSBjdHJsLT53SW5kZXg7Ci0JdTE2CQkJd1ZhbHVlID0gKF9fZm9yY2UgdTE2KSBjdHJsLT53VmFsdWU7Ci0JdTE2CQkJd0xlbmd0aCA9IChfX2ZvcmNlIHUxNikgY3RybC0+d0xlbmd0aDsKKwl1MTYJCQl3SW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNgkJCXdWYWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2CQkJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCiAJLyogZGVzY3JpcHRvcnMganVzdCBnbyBpbnRvIHRoZSBwcmUtYWxsb2NhdGVkIGVwMCBidWZmZXIsCiAJICogd2hpbGUgY29uZmlnIGNoYW5nZSBldmVudHMgbWF5IGVuYWJsZSBuZXR3b3JrIHRyYWZmaWMuCkBAIC0xNDI0LDcgKzEzNTIsNyBAQAogCQkJCXx8ICFkZXYtPmNvbmZpZwogCQkJCXx8IHdJbmRleCA+IDEpCiAJCQlicmVhazsKLQkJaWYgKCFkZXYtPmNkYyAmJiB3SW5kZXggIT0gMCkKKwkJaWYgKCFjZGNfYWN0aXZlKGRldikgJiYgd0luZGV4ICE9IDApCiAJCQlicmVhazsKIAkJc3Bpbl9sb2NrICgmZGV2LT5sb2NrKTsKIApAQCAtMTQ1Niw5ICsxMzg0LDExIEBACiAKIAkJCS8qIENEQyByZXF1aXJlcyB0aGUgZGF0YSB0cmFuc2ZlcnMgbm90IGJlIGRvbmUgZnJvbQogCQkJICogdGhlIGRlZmF1bHQgaW50ZXJmYWNlIHNldHRpbmcgLi4uIGFsc28sIHNldHRpbmcKLQkJCSAqIHRoZSBub24tZGVmYXVsdCBpbnRlcmZhY2UgY2xlYXJzIGZpbHRlcnMgZXRjLgorCQkJICogdGhlIG5vbi1kZWZhdWx0IGludGVyZmFjZSByZXNldHMgZmlsdGVycyBldGMuCiAJCQkgKi8KIAkJCWlmICh3VmFsdWUgPT0gMSkgeworCQkJCWlmICghY2RjX2FjdGl2ZSAoZGV2KSkKKwkJCQkJYnJlYWs7CiAJCQkJdXNiX2VwX2VuYWJsZSAoZGV2LT5pbl9lcCwgZGV2LT5pbik7CiAJCQkJdXNiX2VwX2VuYWJsZSAoZGV2LT5vdXRfZXAsIGRldi0+b3V0KTsKIAkJCQlkZXYtPmNkY19maWx0ZXIgPSBERUZBVUxUX0ZJTFRFUjsKQEAgLTE0OTIsMTEgKzE0MjIsMTEgQEAKIAkJCQl8fCAhZGV2LT5jb25maWcKIAkJCQl8fCB3SW5kZXggPiAxKQogCQkJYnJlYWs7Ci0JCWlmICghKGRldi0+Y2RjIHx8IGRldi0+cm5kaXMpICYmIHdJbmRleCAhPSAwKQorCQlpZiAoIShjZGNfYWN0aXZlKGRldikgfHwgcm5kaXNfYWN0aXZlKGRldikpICYmIHdJbmRleCAhPSAwKQogCQkJYnJlYWs7CiAKIAkJLyogZm9yIENEQywgaWZmIGNhcnJpZXIgaXMgb24sIGRhdGEgaW50ZXJmYWNlIGlzIGFjdGl2ZS4gKi8KLQkJaWYgKGRldi0+cm5kaXMgfHwgd0luZGV4ICE9IDEpCisJCWlmIChybmRpc19hY3RpdmUoZGV2KSB8fCB3SW5kZXggIT0gMSkKIAkJCSoodTggKilyZXEtPmJ1ZiA9IDA7CiAJCWVsc2UKIAkJCSoodTggKilyZXEtPmJ1ZiA9IG5ldGlmX2NhcnJpZXJfb2sgKGRldi0+bmV0KSA/IDEgOiAwOwpAQCAtMTUwOSw4ICsxNDM5LDcgQEAKIAkJICogd1ZhbHVlID0gcGFja2V0IGZpbHRlciBiaXRtYXAKIAkJICovCiAJCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9UWVBFX0NMQVNTfFVTQl9SRUNJUF9JTlRFUkZBQ0UpCi0JCQkJfHwgIWRldi0+Y2RjCi0JCQkJfHwgZGV2LT5ybmRpcworCQkJCXx8ICFjZGNfYWN0aXZlKGRldikKIAkJCQl8fCB3TGVuZ3RoICE9IDAKIAkJCQl8fCB3SW5kZXggPiAxKQogCQkJYnJlYWs7CkBAIC0xNTM0LDcgKzE0NjMsNyBAQAogCSAqLwogCWNhc2UgVVNCX0NEQ19TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5EOgogCQlpZiAoY3RybC0+YlJlcXVlc3RUeXBlICE9IChVU0JfVFlQRV9DTEFTU3xVU0JfUkVDSVBfSU5URVJGQUNFKQotCQkJCXx8ICFkZXYtPnJuZGlzCisJCQkJfHwgIXJuZGlzX2FjdGl2ZShkZXYpCiAJCQkJfHwgd0xlbmd0aCA+IFVTQl9CVUZTSVoKIAkJCQl8fCB3VmFsdWUKIAkJCQl8fCBybmRpc19jb250cm9sX2ludGYuYkludGVyZmFjZU51bWJlcgpAQCAtMTU0OSw3ICsxNDc4LDcgQEAKIAljYXNlIFVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRToKIAkJaWYgKChVU0JfRElSX0lOfFVTQl9UWVBFX0NMQVNTfFVTQl9SRUNJUF9JTlRFUkZBQ0UpCiAJCQkJCT09IGN0cmwtPmJSZXF1ZXN0VHlwZQotCQkJCSYmIGRldi0+cm5kaXMKKwkJCQkmJiBybmRpc19hY3RpdmUoZGV2KQogCQkJCS8vICYmIHdMZW5ndGggPj0gMHgwNDAwCiAJCQkJJiYgIXdWYWx1ZQogCQkJCSYmIHJuZGlzX2NvbnRyb2xfaW50Zi5iSW50ZXJmYWNlTnVtYmVyCkBAIC0xNjY5LDcgKzE1OTgsNyBAQAogc3RhdGljIHZvaWQgcnhfY29tcGxldGUgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSk7CiAKIHN0YXRpYyBpbnQKLXJ4X3N1Ym1pdCAoc3RydWN0IGV0aF9kZXYgKmRldiwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIGludCBnZnBfZmxhZ3MpCityeF9zdWJtaXQgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHNrX2J1ZmYJCSpza2I7CiAJaW50CQkJcmV0dmFsID0gLUVOT01FTTsKQEAgLTE2ODgsMTAgKzE2MTcsOCBAQAogCSAqLwogCXNpemUgPSAoc2l6ZW9mIChzdHJ1Y3QgZXRoaGRyKSArIGRldi0+bmV0LT5tdHUgKyBSWF9FWFRSQSk7CiAJc2l6ZSArPSBkZXYtPm91dF9lcC0+bWF4cGFja2V0IC0gMTsKLSNpZmRlZiBDT05GSUdfVVNCX0VUSF9STkRJUwotCWlmIChkZXYtPnJuZGlzKQorCWlmIChybmRpc19hY3RpdmUoZGV2KSkKIAkJc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBybmRpc19wYWNrZXRfbXNnX3R5cGUpOwotI2VuZGlmCQogCXNpemUgLT0gc2l6ZSAlIGRldi0+b3V0X2VwLT5tYXhwYWNrZXQ7CiAKIAlpZiAoKHNrYiA9IGFsbG9jX3NrYiAoc2l6ZSArIE5FVF9JUF9BTElHTiwgZ2ZwX2ZsYWdzKSkgPT0gMCkgewpAQCAtMTczNSwxMSArMTY2Miw5IEBACiAJLyogbm9ybWFsIGNvbXBsZXRpb24gKi8KIAljYXNlIDA6CiAJCXNrYl9wdXQgKHNrYiwgcmVxLT5hY3R1YWwpOwotI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCiAJCS8qIHdlIGtub3cgTWF4UGFja2V0c1BlclRyYW5zZmVyID09IDEgaGVyZSAqLwotCQlpZiAoZGV2LT5ybmRpcykKKwkJaWYgKHJuZGlzX2FjdGl2ZShkZXYpKQogCQkJc3RhdHVzID0gcm5kaXNfcm1faGRyIChza2IpOwotI2VuZGlmCiAJCWlmIChzdGF0dXMgPCAwCiAJCQkJfHwgRVRIX0hMRU4gPiBza2ItPmxlbgogCQkJCXx8IHNrYi0+bGVuID4gRVRIX0ZSQU1FX0xFTikgewpAQCAtMTc5OSw3ICsxNzI0LDcgQEAKIH0KIAogc3RhdGljIGludCBwcmVhbGxvYyAoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IHVzYl9lcCAqZXAsCi0JCQl1bnNpZ25lZCBuLCBpbnQgZ2ZwX2ZsYWdzKQorCQkJdW5zaWduZWQgbiwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXVuc2lnbmVkCQlpOwogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwpAQCAtMTgzOCw3ICsxNzYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhbGxvY19yZXF1ZXN0cyAoc3RydWN0IGV0aF9kZXYgKmRldiwgdW5zaWduZWQgbiwgaW50IGdmcF9mbGFncykKK3N0YXRpYyBpbnQgYWxsb2NfcmVxdWVzdHMgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIG4sIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC0xODU0LDEzICsxNzc5LDExIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgcnhfZmlsbCAoc3RydWN0IGV0aF9kZXYgKmRldiwgaW50IGdmcF9mbGFncykKK3N0YXRpYyB2b2lkIHJ4X2ZpbGwgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAotCWNsZWFyX2JpdCAoV09SS19SWF9NRU1PUlksICZkZXYtPnRvZG8pOwotCiAJLyogZmlsbCB1bnVzZWQgcnhxIHNsb3RzIHdpdGggc29tZSBza2IgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSAoJmRldi0+bG9jaywgZmxhZ3MpOwogCXdoaWxlICghbGlzdF9lbXB0eSAoJmRldi0+cnhfcmVxcykpIHsKQEAgLTE4ODMsMTEgKzE4MDYsOSBAQAogewogCXN0cnVjdCBldGhfZGV2CQkqZGV2ID0gX2RldjsKIAotCWlmICh0ZXN0X2JpdCAoV09SS19SWF9NRU1PUlksICZkZXYtPnRvZG8pKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCAoV09SS19SWF9NRU1PUlksICZkZXYtPnRvZG8pKSB7CiAJCWlmIChuZXRpZl9ydW5uaW5nIChkZXYtPm5ldCkpCiAJCQlyeF9maWxsIChkZXYsIEdGUF9LRVJORUwpOwotCQllbHNlCi0JCQljbGVhcl9iaXQgKFdPUktfUlhfTUVNT1JZLCAmZGV2LT50b2RvKTsKIAl9CiAKIAlpZiAoZGV2LT50b2RvKQpAQCAtMTk3MSw4ICsxODkyLDcgQEAKIAkgKiBvciB0aGUgaGFyZHdhcmUgY2FuJ3QgdXNlIHNrYiBidWZmZXJzLgogCSAqIG9yIHRoZXJlJ3Mgbm90IGVub3VnaCBzcGFjZSBmb3IgYW55IFJORElTIGhlYWRlcnMgd2UgbmVlZAogCSAqLwotI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCi0JaWYgKGRldi0+cm5kaXMpIHsKKwlpZiAocm5kaXNfYWN0aXZlKGRldikpIHsKIAkJc3RydWN0IHNrX2J1ZmYJKnNrYl9ybmRpczsKIAogCQlza2Jfcm5kaXMgPSBza2JfcmVhbGxvY19oZWFkcm9vbSAoc2tiLApAQCAtMTk4NSw3ICsxOTA1LDYgQEAKIAkJcm5kaXNfYWRkX2hkciAoc2tiKTsKIAkJbGVuZ3RoID0gc2tiLT5sZW47CiAJfQotI2VuZGlmCiAJcmVxLT5idWYgPSBza2ItPmRhdGE7CiAJcmVxLT5jb250ZXh0ID0gc2tiOwogCXJlcS0+Y29tcGxldGUgPSB0eF9jb21wbGV0ZTsKQEAgLTIwMTgsOSArMTkzNyw3IEBACiAJfQogCiAJaWYgKHJldHZhbCkgewotI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCiBkcm9wOgotI2VuZGlmCiAJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQlkZXZfa2ZyZWVfc2tiX2FueSAoc2tiKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUgKCZkZXYtPmxvY2ssIGZsYWdzKTsKQEAgLTIwMzYsMjcgKzE5NTMsMzEgQEAKIAogI2lmZGVmIENPTkZJR19VU0JfRVRIX1JORElTCiAKLXN0YXRpYyB2b2lkIHJuZGlzX3NlbmRfbWVkaWFfc3RhdGUgKHN0cnVjdCBldGhfZGV2ICpkZXYsIGludCBjb25uZWN0KQotewotCWlmICghZGV2KQotCQlyZXR1cm47Ci0JCi0JaWYgKGNvbm5lY3QpIHsKLQkJaWYgKHJuZGlzX3NpZ25hbF9jb25uZWN0IChkZXYtPnJuZGlzX2NvbmZpZykpCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJaWYgKHJuZGlzX3NpZ25hbF9kaXNjb25uZWN0IChkZXYtPnJuZGlzX2NvbmZpZykpCi0JCQlyZXR1cm47Ci0JfQotfQorLyogVGhlIGludGVycnVwdCBlbmRwb2ludCBpcyB1c2VkIGluIFJORElTIHRvIG5vdGlmeSB0aGUgaG9zdCB3aGVuIG1lc3NhZ2VzCisgKiBvdGhlciB0aGFuIGRhdGEgcGFja2V0cyBhcmUgYXZhaWxhYmxlIC4uLiBub3RhYmx5IHRoZSBSRU1PVEVfTkRJU18qX0NNUExUCisgKiBtZXNzYWdlcywgYnV0IGFsc28gUkVNT1RFX05ESVNfSU5ESUNBVEVfU1RBVFVTX01TRyBhbmQgcG90ZW50aWFsbHkgZXZlbgorICogUkVNT1RFX05ESVNfS0VFUEFMSVZFX01TRy4KKyAqCisgKiBUaGUgUk5ESVMgY29udHJvbCBxdWV1ZSBpcyBwcm9jZXNzZWQgYnkgR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSwgYW5kCisgKiBub3JtYWxseSBqdXN0IG9uZSBub3RpZmljYXRpb24gd2lsbCBiZSBxdWV1ZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqZXRoX3JlcV9hbGxvYyAoc3RydWN0IHVzYl9lcCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZXRoX3JlcV9mcmVlIChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpOwogCiBzdGF0aWMgdm9pZAogcm5kaXNfY29udHJvbF9hY2tfY29tcGxldGUgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKIHsKKwlzdHJ1Y3QgZXRoX2RldiAgICAgICAgICAqZGV2ID0gZXAtPmRyaXZlcl9kYXRhOworCiAJaWYgKHJlcS0+c3RhdHVzIHx8IHJlcS0+YWN0dWFsICE9IHJlcS0+bGVuZ3RoKQotCQlERUJVRyAoKHN0cnVjdCBldGhfZGV2ICopIGVwLT5kcml2ZXJfZGF0YSwKKwkJREVCVUcgKGRldiwKIAkJCSJybmRpcyBjb250cm9sIGFjayBjb21wbGV0ZSAtLT4gJWQsICVkLyVkXG4iLAogCQkJcmVxLT5zdGF0dXMsIHJlcS0+YWN0dWFsLCByZXEtPmxlbmd0aCk7CisJcmVxLT5jb250ZXh0ID0gTlVMTDsKKworCWlmIChyZXEgIT0gZGV2LT5zdGF0X3JlcSkKKwkJZXRoX3JlcV9mcmVlKGVwLCByZXEpOwogfQogCiBzdGF0aWMgaW50IHJuZGlzX2NvbnRyb2xfYWNrIChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQpAQCAtMjA3MSwxMSArMTk5MiwxOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwkvKiBpbiBjYXNlIHF1ZXVlIGxlbmd0aCA+IDEgKi8KKwlpZiAocmVzcC0+Y29udGV4dCkgeworCQlyZXNwID0gZXRoX3JlcV9hbGxvYyAoZGV2LT5zdGF0dXNfZXAsIDgsIEdGUF9BVE9NSUMpOworCQlpZiAoIXJlc3ApCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAkvKiBTZW5kIFJORElTIFJFU1BPTlNFX0FWQUlMQUJMRSBub3RpZmljYXRpb247CiAJICogVVNCX0NEQ19OT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFIHNob3VsZCB3b3JrIHRvbwogCSAqLwogCXJlc3AtPmxlbmd0aCA9IDg7CiAJcmVzcC0+Y29tcGxldGUgPSBybmRpc19jb250cm9sX2Fja19jb21wbGV0ZTsKKwlyZXNwLT5jb250ZXh0ID0gZGV2OwogCQogCSooKF9fbGUzMiAqKSByZXNwLT5idWYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMSk7CiAJKigoX19sZTMyICopIHJlc3AtPmJ1ZiArIDEpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CkBAIC0yMDg5LDkgKzIwMTgsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2Vsc2UKKworI2RlZmluZQlybmRpc19jb250cm9sX2FjawlOVUxMCisKICNlbmRpZgkvKiBSTkRJUyAqLwogCi1zdGF0aWMgdm9pZCBldGhfc3RhcnQgKHN0cnVjdCBldGhfZGV2ICpkZXYsIGludCBnZnBfZmxhZ3MpCitzdGF0aWMgdm9pZCBldGhfc3RhcnQgKHN0cnVjdCBldGhfZGV2ICpkZXYsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlERUJVRyAoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTIxMDEsMTQgKzIwMzQsMTIgQEAKIAkvKiBhbmQgb3BlbiB0aGUgdHggZmxvb2RnYXRlcyAqLyAKIAlhdG9taWNfc2V0ICgmZGV2LT50eF9xbGVuLCAwKTsKIAluZXRpZl93YWtlX3F1ZXVlIChkZXYtPm5ldCk7Ci0jaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKLQlpZiAoZGV2LT5ybmRpcykgeworCWlmIChybmRpc19hY3RpdmUoZGV2KSkgewogCQlybmRpc19zZXRfcGFyYW1fbWVkaXVtIChkZXYtPnJuZGlzX2NvbmZpZywKIAkJCQkJTkRJU19NRURJVU1fODAyXzMsCiAJCQkJCUJJVFJBVEUoZGV2LT5nYWRnZXQpLzEwMCk7Ci0JCXJuZGlzX3NlbmRfbWVkaWFfc3RhdGUgKGRldiwgMSk7CisJCSh2b2lkKSBybmRpc19zaWduYWxfY29ubmVjdCAoZGV2LT5ybmRpc19jb25maWcpOwogCX0KLSNlbmRpZgkKIH0KIAogc3RhdGljIGludCBldGhfb3BlbiAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKQEAgLTIxNDksMjggKzIwODAsMjcgQEAKIAkJfQogCX0KIAkKLSNpZmRlZglDT05GSUdfVVNCX0VUSF9STkRJUwotCWlmIChkZXYtPnJuZGlzKSB7CisJaWYgKHJuZGlzX2FjdGl2ZShkZXYpKSB7CiAJCXJuZGlzX3NldF9wYXJhbV9tZWRpdW0gKGRldi0+cm5kaXNfY29uZmlnLAogCQkJCQlORElTX01FRElVTV84MDJfMywgMCk7Ci0JCXJuZGlzX3NlbmRfbWVkaWFfc3RhdGUgKGRldiwgMCk7CisJCSh2b2lkKSBybmRpc19zaWduYWxfZGlzY29ubmVjdCAoZGV2LT5ybmRpc19jb25maWcpOwogCX0KLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmV0aF9yZXFfYWxsb2MgKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBzaXplKQorc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCitldGhfcmVxX2FsbG9jIChzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwogCi0JcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QgKGVwLCBHRlBfS0VSTkVMKTsKKwlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdCAoZXAsIGdmcF9mbGFncyk7CiAJaWYgKCFyZXEpCiAJCXJldHVybiBOVUxMOwogCi0JcmVxLT5idWYgPSBrbWFsbG9jIChzaXplLCBHRlBfS0VSTkVMKTsKKwlyZXEtPmJ1ZiA9IGttYWxsb2MgKHNpemUsIGdmcF9mbGFncyk7CiAJaWYgKCFyZXEtPmJ1ZikgewogCQl1c2JfZXBfZnJlZV9yZXF1ZXN0IChlcCwgcmVxKTsKIAkJcmVxID0gTlVMTDsKQEAgLTIxOTIsMTAgKzIxMjIsOCBAQAogCXN0cnVjdCBldGhfZGV2CQkqZGV2ID0gZ2V0X2dhZGdldF9kYXRhIChnYWRnZXQpOwogCiAJREVCVUcgKGRldiwgInVuYmluZFxuIik7Ci0jaWZkZWYgQ09ORklHX1VTQl9FVEhfUk5ESVMKIAlybmRpc19kZXJlZ2lzdGVyIChkZXYtPnJuZGlzX2NvbmZpZyk7CiAJcm5kaXNfZXhpdCAoKTsKLSNlbmRpZgogCiAJLyogd2UndmUgYWxyZWFkeSBiZWVuIGRpc2Nvbm5lY3RlZCAuLi4gbm8gaS9vIGlzIGFjdGl2ZSAqLwogCWlmIChkZXYtPnJlcSkgewpAQCAtMjM2OCwxMyArMjI5NiwxMSBAQAogCQkJZ2FkZ2V0LT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCUVQX0lOX05BTUUgPSBpbl9lcC0+bmFtZTsKIAlpbl9lcC0+ZHJpdmVyX2RhdGEgPSBpbl9lcDsJLyogY2xhaW0gKi8KIAkKIAlvdXRfZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyAoZ2FkZ2V0LCAmZnNfc2lua19kZXNjKTsKIAlpZiAoIW91dF9lcCkKIAkJZ290byBhdXRvY29uZl9mYWlsOwotCUVQX09VVF9OQU1FID0gb3V0X2VwLT5uYW1lOwogCW91dF9lcC0+ZHJpdmVyX2RhdGEgPSBvdXRfZXA7CS8qIGNsYWltICovCiAKICNpZiBkZWZpbmVkKERFVl9DT05GSUdfQ0RDKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRVRIX1JORElTKQpAQCAtMjM4NCw3ICsyMzEwLDYgQEAKIAlpZiAoY2RjIHx8IHJuZGlzKSB7CiAJCXN0YXR1c19lcCA9IHVzYl9lcF9hdXRvY29uZmlnIChnYWRnZXQsICZmc19zdGF0dXNfZGVzYyk7CiAJCWlmIChzdGF0dXNfZXApIHsKLQkJCUVQX1NUQVRVU19OQU1FID0gc3RhdHVzX2VwLT5uYW1lOwogCQkJc3RhdHVzX2VwLT5kcml2ZXJfZGF0YSA9IHN0YXR1c19lcDsJLyogY2xhaW0gKi8KIAkJfSBlbHNlIGlmIChybmRpcykgewogCQkJZGV2X2VyciAoJmdhZGdldC0+ZGV2LApAQCAtMjQyNiw3ICsyMzUxLDcgQEAKIAloc19zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAloc19zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogI2lmIGRlZmluZWQoREVWX0NPTkZJR19DREMpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FVEhfUk5ESVMpCi0JaWYgKEVQX1NUQVRVU19OQU1FKQorCWlmIChzdGF0dXNfZXApCiAJCWhzX3N0YXR1c19kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQogCQkJCWZzX3N0YXR1c19kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAjZW5kaWYKQEAgLTI0OTksMjAgKzI0MjQsMjMgQEAKIAlTRVRfRVRIVE9PTF9PUFMobmV0LCAmb3BzKTsKIAogCS8qIHByZWFsbG9jYXRlIGNvbnRyb2wgbWVzc2FnZSBkYXRhIGFuZCBidWZmZXIgKi8KLQlkZXYtPnJlcSA9IGV0aF9yZXFfYWxsb2MgKGdhZGdldC0+ZXAwLCBVU0JfQlVGU0laKTsKKwlkZXYtPnJlcSA9IGV0aF9yZXFfYWxsb2MgKGdhZGdldC0+ZXAwLCBVU0JfQlVGU0laLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+cmVxKQogCQlnb3RvIGZhaWw7CiAJZGV2LT5yZXEtPmNvbXBsZXRlID0gZXRoX3NldHVwX2NvbXBsZXRlOwogCiAJLyogLi4uIGFuZCBtYXliZSBsaWtld2lzZSBmb3Igc3RhdHVzIHRyYW5zZmVyICovCisjaWYgZGVmaW5lZChERVZfQ09ORklHX0NEQykgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VUSF9STkRJUykKIAlpZiAoZGV2LT5zdGF0dXNfZXApIHsKIAkJZGV2LT5zdGF0X3JlcSA9IGV0aF9yZXFfYWxsb2MgKGRldi0+c3RhdHVzX2VwLAotCQkJCQlTVEFUVVNfQllURUNPVU5UKTsKKwkJCQkJU1RBVFVTX0JZVEVDT1VOVCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZGV2LT5zdGF0X3JlcSkgewogCQkJZXRoX3JlcV9mcmVlIChnYWRnZXQtPmVwMCwgZGV2LT5yZXEpOwogCQkJZ290byBmYWlsOwogCQl9CisJCWRldi0+c3RhdF9yZXEtPmNvbnRleHQgPSBOVUxMOwogCX0KKyNlbmRpZgogCiAJLyogZmluaXNoIGhvb2t1cCB0byBsb3dlciBsYXllciAuLi4gKi8KIAlkZXYtPmdhZGdldCA9IGdhZGdldDsKQEAgLTI1MjYsMTYgKzI0NTQsMTYgQEAKIAluZXRpZl9zdG9wX3F1ZXVlIChkZXYtPm5ldCk7CiAJbmV0aWZfY2Fycmllcl9vZmYgKGRldi0+bmV0KTsKIAotIAkvLyBTRVRfTkVUREVWX0RFViAoZGV2LT5uZXQsICZnYWRnZXQtPmRldik7CisgCVNFVF9ORVRERVZfREVWIChkZXYtPm5ldCwgJmdhZGdldC0+ZGV2KTsKICAJc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2IChkZXYtPm5ldCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCWdvdG8gZmFpbDE7CiAKIAlJTkZPIChkZXYsICIlcywgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iLCBkcml2ZXJfZGVzYyk7CiAJSU5GTyAoZGV2LCAidXNpbmcgJXMsIE9VVCAlcyBJTiAlcyVzJXNcbiIsIGdhZGdldC0+bmFtZSwKLQkJRVBfT1VUX05BTUUsIEVQX0lOX05BTUUsCi0JCUVQX1NUQVRVU19OQU1FID8gIiBTVEFUVVMgIiA6ICIiLAotCQlFUF9TVEFUVVNfTkFNRSA/IEVQX1NUQVRVU19OQU1FIDogIiIKKwkJb3V0X2VwLT5uYW1lLCBpbl9lcC0+bmFtZSwKKwkJc3RhdHVzX2VwID8gIiBTVEFUVVMgIiA6ICIiLAorCQlzdGF0dXNfZXAgPyBzdGF0dXNfZXAtPm5hbWUgOiAiIgogCQkpOwogCUlORk8gKGRldiwgIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKIAkJbmV0LT5kZXZfYWRkciBbMF0sIG5ldC0+ZGV2X2FkZHIgWzFdLApAQCAtMjU0OCw3ICsyNDc2LDYgQEAKIAkJCWRldi0+aG9zdF9tYWMgWzJdLCBkZXYtPmhvc3RfbWFjIFszXSwKIAkJCWRldi0+aG9zdF9tYWMgWzRdLCBkZXYtPmhvc3RfbWFjIFs1XSk7CiAKLSNpZmRlZglDT05GSUdfVVNCX0VUSF9STkRJUwogCWlmIChybmRpcykgewogCQl1MzIJdmVuZG9ySUQgPSAwOwogCkBAIC0yNTY1LDcgKzI0OTIsNyBAQAogCQkvKiB0aGVzZSBzZXQgdXAgYSBsb3Qgb2YgdGhlIE9JRHMgdGhhdCBSTkRJUyBuZWVkcyAqLwogCQlybmRpc19zZXRfaG9zdF9tYWMgKGRldi0+cm5kaXNfY29uZmlnLCBkZXYtPmhvc3RfbWFjKTsKIAkJaWYgKHJuZGlzX3NldF9wYXJhbV9kZXYgKGRldi0+cm5kaXNfY29uZmlnLCBkZXYtPm5ldCwKLQkJCQkJICZkZXYtPnN0YXRzKSkKKwkJCQkJICZkZXYtPnN0YXRzLCAmZGV2LT5jZGNfZmlsdGVyKSkKIAkJCWdvdG8gZmFpbDA7CiAJCWlmIChybmRpc19zZXRfcGFyYW1fdmVuZG9yIChkZXYtPnJuZGlzX2NvbmZpZywgdmVuZG9ySUQsCiAJCQkJCSAgICBtYW51ZmFjdHVyZXIpKQpAQCAtMjU3Niw3ICsyNTAzLDYgQEAKIAkJCWdvdG8gZmFpbDA7CiAJCUlORk8gKGRldiwgIlJORElTIHJlYWR5XG4iKTsKIAl9Ci0jZW5kaWYJCiAKIAlyZXR1cm4gc3RhdHVzOwogCkBAIC0yNjEwLDExICsyNTM2LDggQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgZXRoX2RyaXZlciA9IHsKLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQKLQkuc3BlZWQJCT0gVVNCX1NQRUVEX0hJR0gsCi0jZWxzZQotCS5zcGVlZAkJPSBVU0JfU1BFRURfRlVMTCwKLSNlbmRpZgorCS5zcGVlZAkJPSBERVZTUEVFRCwKKwogCS5mdW5jdGlvbgk9IChjaGFyICopIGRyaXZlcl9kZXNjLAogCS5iaW5kCQk9IGV0aF9iaW5kLAogCS51bmJpbmQJCT0gZXRoX3VuYmluZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYwppbmRleCAwMzdhN2YxLi40ZjU3MDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCkBAIC04MSw2ICs4MSwxMCBAQAogICoJcmVtb3ZhYmxlCQlEZWZhdWx0IGZhbHNlLCBib29sZWFuIGZvciByZW1vdmFibGUgbWVkaWEKICAqCWx1bnM9TgkJCURlZmF1bHQgTiA9IG51bWJlciBvZiBmaWxlbmFtZXMsIG51bWJlciBvZgogICoJCQkJCUxVTnMgdG8gc3VwcG9ydAorICoJc3RhbGwJCQlEZWZhdWx0IGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mCisgKgkJCQkJVVNCIGRldmljZSBjb250cm9sbGVyICh1c3VhbGx5IHRydWUpLAorICoJCQkJCWJvb2xlYW4gdG8gcGVybWl0IHRoZSBkcml2ZXIgdG8gaGFsdAorICoJCQkJCWJ1bGsgZW5kcG9pbnRzCiAgKgl0cmFuc3BvcnQ9WFhYCQlEZWZhdWx0IEJCQiwgdHJhbnNwb3J0IG5hbWUgKENCLCBDQkksIG9yIEJCQikKICAqCXByb3RvY29sPVlZWQkJRGVmYXVsdCBTQ1NJLCBwcm90b2NvbCBuYW1lIChSQkMsIDgwMjAgb3IKICAqCQkJCQlBVEFQSSwgUUlDLCBVRkksIDgwNzAsIG9yIFNDU0k7CkBAIC05MSwxNCArOTUsMTAgQEAKICAqCWJ1Zmxlbj1OCQlEZWZhdWx0IE49MTYzODQsIGJ1ZmZlciBzaXplIHVzZWQgKHdpbGwgYmUKICAqCQkJCQlyb3VuZGVkIGRvd24gdG8gYSBtdWx0aXBsZSBvZgogICoJCQkJCVBBR0VfQ0FDSEVfU0laRSkKLSAqCXN0YWxsCQkJRGVmYXVsdCBkZXRlcm1pbmVkIGFjY29yZGluZyB0byB0aGUgdHlwZSBvZgotICoJCQkJCVVTQiBkZXZpY2UgY29udHJvbGxlciAodXN1YWxseSB0cnVlKSwKLSAqCQkJCQlib29sZWFuIHRvIHBlcm1pdCB0aGUgZHJpdmVyIHRvIGhhbHQKLSAqCQkJCQlidWxrIGVuZHBvaW50cwogICoKICAqIElmIENPTkZJR19VU0JfRklMRV9TVE9SQUdFX1RFU1QgaXMgbm90IHNldCwgb25seSB0aGUgImZpbGUiLCAicm8iLAotICogInJlbW92YWJsZSIsIGFuZCAibHVucyIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOyBkZWZhdWx0IHZhbHVlcyBhcmUgdXNlZAotICogZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KKyAqICJyZW1vdmFibGUiLCAibHVucyIsIGFuZCAic3RhbGwiIG9wdGlvbnMgYXJlIGF2YWlsYWJsZTsgZGVmYXVsdCB2YWx1ZXMKKyAqIGFyZSB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuCiAgKgogICogVGhlIHBhdGhuYW1lcyBvZiB0aGUgYmFja2luZyBmaWxlcyBhbmQgdGhlIHJvIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgaW4KICAqIHRoZSBhdHRyaWJ1dGUgZmlsZXMgImZpbGUiIGFuZCAicm8iIGluIHRoZSBsdW48bj4gc3ViZGlyZWN0b3J5IG9mIHRoZQpAQCAtMzQyLDE0ICszNDIsMTUgQEAKIAlpbnQJCW51bV9yb3M7CiAJdW5zaWduZWQgaW50CW5sdW5zOwogCisJaW50CQlyZW1vdmFibGU7CisJaW50CQljYW5fc3RhbGw7CisKIAljaGFyCQkqdHJhbnNwb3J0X3Bhcm07CiAJY2hhcgkJKnByb3RvY29sX3Bhcm07Ci0JaW50CQlyZW1vdmFibGU7CiAJdW5zaWduZWQgc2hvcnQJdmVuZG9yOwogCXVuc2lnbmVkIHNob3J0CXByb2R1Y3Q7CiAJdW5zaWduZWQgc2hvcnQJcmVsZWFzZTsKIAl1bnNpZ25lZCBpbnQJYnVmbGVuOwotCWludAkJY2FuX3N0YWxsOwogCiAJaW50CQl0cmFuc3BvcnRfdHlwZTsKIAljaGFyCQkqdHJhbnNwb3J0X25hbWU7CkBAIC0zNjAsMTEgKzM2MSwxMSBAQAogCS50cmFuc3BvcnRfcGFybQkJPSAiQkJCIiwKIAkucHJvdG9jb2xfcGFybQkJPSAiU0NTSSIsCiAJLnJlbW92YWJsZQkJPSAwLAorCS5jYW5fc3RhbGwJCT0gMSwKIAkudmVuZG9yCQkJPSBEUklWRVJfVkVORE9SX0lELAogCS5wcm9kdWN0CQk9IERSSVZFUl9QUk9EVUNUX0lELAogCS5yZWxlYXNlCQk9IDB4ZmZmZiwJLy8gVXNlIGNvbnRyb2xsZXIgY2hpcCB0eXBlCiAJLmJ1ZmxlbgkJCT0gMTYzODQsCi0JLmNhbl9zdGFsbAkJPSAxLAogCX07CiAKIApAQCAtMzgwLDYgKzM4MSw5IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQocmVtb3ZhYmxlLCBtb2RfZGF0YS5yZW1vdmFibGUsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhyZW1vdmFibGUsICJ0cnVlIHRvIHNpbXVsYXRlIHJlbW92YWJsZSBtZWRpYSIpOwogCittb2R1bGVfcGFyYW1fbmFtZWQoc3RhbGwsIG1vZF9kYXRhLmNhbl9zdGFsbCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHN0YWxsLCAiZmFsc2UgdG8gcHJldmVudCBidWxrIHN0YWxscyIpOworCiAKIC8qIEluIHRoZSBub24tVEVTVCB2ZXJzaW9uLCBvbmx5IHRoZSBtb2R1bGUgcGFyYW1ldGVycyBsaXN0ZWQgYWJvdmUKICAqIGFyZSBhdmFpbGFibGUuICovCkBAIC00MDQsOSArNDA4LDYgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChidWZsZW4sIG1vZF9kYXRhLmJ1ZmxlbiwgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGJ1ZmxlbiwgIkkvTyBidWZmZXIgc2l6ZSIpOwogCi1tb2R1bGVfcGFyYW1fbmFtZWQoc3RhbGwsIG1vZF9kYXRhLmNhbl9zdGFsbCwgYm9vbCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN0YWxsLCAiZmFsc2UgdG8gcHJldmVudCBidWxrIHN0YWxscyIpOwotCiAjZW5kaWYgLyogQ09ORklHX1VTQl9GSUxFX1NUT1JBR0VfVEVTVCAqLwogCiAKQEAgLTgxOCw3ICs4MTksNyBAQAogCWJ1ZlswXSA9IHZhbCA+PiAyNDsKIAlidWZbMV0gPSB2YWwgPj4gMTY7CiAJYnVmWzJdID0gdmFsID4+IDg7Ci0JYnVmWzNdID0gdmFsOworCWJ1ZlszXSA9IHZhbCAmIDB4ZmY7CiB9CiAKIApAQCAtMTI3Niw4ICsxMjc3LDggQEAKIHsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGZzZy0+ZXAwcmVxOwogCWludAkJCXZhbHVlID0gLUVPUE5PVFNVUFA7Ci0JdTE2CQkJd19pbmRleCA9IGN0cmwtPndJbmRleDsKLQl1MTYJCQl3X2xlbmd0aCA9IGN0cmwtPndMZW5ndGg7CisJdTE2CQkJd19pbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2CQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAogCWlmICghZnNnLT5jb25maWcpCiAJCXJldHVybiB2YWx1ZTsKQEAgLTEzMTIsNyArMTMxMyw3IEBACiAJCQl9CiAJCQlWREJHKGZzZywgImdldCBtYXggTFVOXG4iKTsKIAkJCSoodTggKikgcmVxLT5idWYgPSBmc2ctPm5sdW5zIC0gMTsKLQkJCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KSAxKTsKKwkJCXZhbHVlID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTM0NCw3ICsxMzQ1LDcgQEAKIAkJCSJ1bmtub3duIGNsYXNzLXNwZWNpZmljIGNvbnRyb2wgcmVxICIKIAkJCSIlMDJ4LiUwMnggdiUwNHggaSUwNHggbCV1XG4iLAogCQkJY3RybC0+YlJlcXVlc3RUeXBlLCBjdHJsLT5iUmVxdWVzdCwKLQkJCWN0cmwtPndWYWx1ZSwgd19pbmRleCwgd19sZW5ndGgpOworCQkJbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKSwgd19pbmRleCwgd19sZW5ndGgpOwogCXJldHVybiB2YWx1ZTsKIH0KIApAQCAtMTM1OCw5ICsxMzU5LDggQEAKIHsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGZzZy0+ZXAwcmVxOwogCWludAkJCXZhbHVlID0gLUVPUE5PVFNVUFA7Ci0JdTE2CQkJd19pbmRleCA9IGN0cmwtPndJbmRleDsKLQl1MTYJCQl3X3ZhbHVlID0gY3RybC0+d1ZhbHVlOwotCXUxNgkJCXdfbGVuZ3RoID0gY3RybC0+d0xlbmd0aDsKKwl1MTYJCQl3X2luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MTYJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKIAogCS8qIFVzdWFsbHkgdGhpcyBqdXN0IHN0b3JlcyByZXBseSBkYXRhIGluIHRoZSBwcmUtYWxsb2NhdGVkIGVwMCBidWZmZXIsCiAJICogYnV0IGNvbmZpZyBjaGFuZ2UgZXZlbnRzIHdpbGwgYWxzbyByZWNvbmZpZ3VyZSBoYXJkd2FyZS4gKi8KQEAgLTEzNzQsNyArMTM3NCw3IEBACiAKIAkJY2FzZSBVU0JfRFRfREVWSUNFOgogCQkJVkRCRyhmc2csICJnZXQgZGV2aWNlIGRlc2NyaXB0b3JcbiIpOwotCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpIHNpemVvZiBkZXZpY2VfZGVzYyk7CisJCQl2YWx1ZSA9IHNpemVvZiBkZXZpY2VfZGVzYzsKIAkJCW1lbWNweShyZXEtPmJ1ZiwgJmRldmljZV9kZXNjLCB2YWx1ZSk7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9EVUFMU1BFRUQKQEAgLTEzODIsNyArMTM4Miw3IEBACiAJCQlWREJHKGZzZywgImdldCBkZXZpY2UgcXVhbGlmaWVyXG4iKTsKIAkJCWlmICghZnNnLT5nYWRnZXQtPmlzX2R1YWxzcGVlZCkKIAkJCQlicmVhazsKLQkJCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KSBzaXplb2YgZGV2X3F1YWxpZmllcik7CisJCQl2YWx1ZSA9IHNpemVvZiBkZXZfcXVhbGlmaWVyOwogCQkJbWVtY3B5KHJlcS0+YnVmLCAmZGV2X3F1YWxpZmllciwgdmFsdWUpOwogCQkJYnJlYWs7CiAKQEAgLTE0MDEsOCArMTQwMSw2IEBACiAJCQkJCXJlcS0+YnVmLAogCQkJCQl3X3ZhbHVlID4+IDgsCiAJCQkJCXdfdmFsdWUgJiAweGZmKTsKLQkJCWlmICh2YWx1ZSA+PSAwKQotCQkJCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KSB2YWx1ZSk7CiAJCQlicmVhazsKIAogCQljYXNlIFVTQl9EVF9TVFJJTkc6CkBAIC0xNDExLDggKzE0MDksNiBAQAogCQkJLyogd0luZGV4ID09IGxhbmd1YWdlIGNvZGUgKi8KIAkJCXZhbHVlID0gdXNiX2dhZGdldF9nZXRfc3RyaW5nKCZzdHJpbmd0YWIsCiAJCQkJCXdfdmFsdWUgJiAweGZmLCByZXEtPmJ1Zik7Ci0JCQlpZiAodmFsdWUgPj0gMCkKLQkJCQl2YWx1ZSA9IG1pbih3X2xlbmd0aCwgKHUxNikgdmFsdWUpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0xNDM4LDcgKzE0MzQsNyBAQAogCQkJYnJlYWs7CiAJCVZEQkcoZnNnLCAiZ2V0IGNvbmZpZ3VyYXRpb25cbiIpOwogCQkqKHU4ICopIHJlcS0+YnVmID0gZnNnLT5jb25maWc7Ci0JCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KSAxKTsKKwkJdmFsdWUgPSAxOwogCQlicmVhazsKIAogCWNhc2UgVVNCX1JFUV9TRVRfSU5URVJGQUNFOgpAQCAtMTQ2NiwxNCArMTQ2MiwxNCBAQAogCQl9CiAJCVZEQkcoZnNnLCAiZ2V0IGludGVyZmFjZVxuIik7CiAJCSoodTggKikgcmVxLT5idWYgPSAwOwotCQl2YWx1ZSA9IG1pbih3X2xlbmd0aCwgKHUxNikgMSk7CisJCXZhbHVlID0gMTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlWREJHKGZzZywKIAkJCSJ1bmtub3duIGNvbnRyb2wgcmVxICUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJXVcbiIsCiAJCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LAotCQkJd192YWx1ZSwgd19pbmRleCwgd19sZW5ndGgpOworCQkJd192YWx1ZSwgd19pbmRleCwgbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCkpOwogCX0KIAogCXJldHVybiB2YWx1ZTsKQEAgLTE0ODUsNiArMTQ4MSw3IEBACiB7CiAJc3RydWN0IGZzZ19kZXYJCSpmc2cgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKIAlpbnQJCQlyYzsKKwlpbnQJCQl3X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwogCiAJKytmc2ctPmVwMF9yZXFfdGFnOwkJLy8gUmVjb3JkIGFycml2YWwgb2YgYSBuZXcgcmVxdWVzdAogCWZzZy0+ZXAwcmVxLT5jb250ZXh0ID0gTlVMTDsKQEAgLTE0OTgsOSArMTQ5NSw5IEBACiAKIAkvKiBSZXNwb25kIHdpdGggZGF0YS9zdGF0dXMgb3IgZGVmZXIgdW50aWwgbGF0ZXI/ICovCiAJaWYgKHJjID49IDAgJiYgcmMgIT0gREVMQVlFRF9TVEFUVVMpIHsKKwkJcmMgPSBtaW4ocmMsIHdfbGVuZ3RoKTsKIAkJZnNnLT5lcDByZXEtPmxlbmd0aCA9IHJjOwotCQlmc2ctPmVwMHJlcS0+emVybyA9IChyYyA8IGN0cmwtPndMZW5ndGggJiYKLQkJCQkocmMgJSBnYWRnZXQtPmVwMC0+bWF4cGFja2V0KSA9PSAwKTsKKwkJZnNnLT5lcDByZXEtPnplcm8gPSByYyA8IHdfbGVuZ3RoOwogCQlmc2ctPmVwMHJlcV9uYW1lID0gKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4gPwogCQkJCSJlcDAtaW4iIDogImVwMC1vdXQiKTsKIAkJcmMgPSBlcDBfcXVldWUoZnNnKTsKQEAgLTE1NTQsOCArMTU1MSw3IEBACiAJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZnNnLT50aHJlYWRfd3FoLAogCQkJZnNnLT50aHJlYWRfd2FrZXVwX25lZWRlZCk7CiAJZnNnLT50aHJlYWRfd2FrZXVwX25lZWRlZCA9IDA7Ci0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQotCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwl0cnlfdG9fZnJlZXplKCk7CiAJcmV0dXJuIChyYyA/IC1FSU5UUiA6IDApOwogfQogCkBAIC0yNjYxLDcgKzI2NTcsNyBAQAogCQl9CiAJfQogCi0JLyogQ2hlY2sgdGhhdCB0aGUgTFVOIHZhbHVlcyBhcmUgb29uc2lzdGVudCAqLworCS8qIENoZWNrIHRoYXQgdGhlIExVTiB2YWx1ZXMgYXJlIGNvbnNpc3RlbnQgKi8KIAlpZiAodHJhbnNwb3J0X2lzX2JiYigpKSB7CiAJCWlmIChmc2ctPmx1biAhPSBsdW4pCiAJCQlEQkcoZnNnLCAidXNpbmcgTFVOICVkIGZyb20gQ0JXLCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZ29rdV91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCmluZGV4IDAwNWRiN2MuLmVhYWIyNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9nb2t1X3VkYy5jCkBAIC03MCw3ICs3MCw3IEBACiAgKiBzZWVtIHRvIGJlaGF2ZSBxdWl0ZSBhcyBleHBlY3RlZC4gIFVzZWQgYnkgZGVmYXVsdC4KICAqCiAgKiBPVVQgZG1hIGRvY3VtZW50cyBkZXNpZ24gcHJvYmxlbXMgaGFuZGxpbmcgdGhlIGNvbW1vbiAic2hvcnQgcGFja2V0IgotICogdHJhbnNmZXIgdGVybWluYXRpb24gcG9saWN5OyBpdCBjb3VsZG4ndCBlbmFibGVkIGJ5IGRlZmF1bHQsIGV2ZW4KKyAqIHRyYW5zZmVyIHRlcm1pbmF0aW9uIHBvbGljeTsgaXQgY291bGRuJ3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0LCBldmVuCiAgKiBpZiB0aGUgT1VULWRtYSBhYm9ydCBwcm9ibGVtcyBoYWQgYSByZXNvbHV0aW9uLgogICovCiBzdGF0aWMgdW5zaWduZWQgdXNlX2RtYSA9IDE7CkBAIC0yNjksNyArMjY5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotZ29rdV9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IGdmcF9mbGFncykKK2dva3VfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICpfZXAsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3QgZ29rdV9yZXF1ZXN0CSpyZXE7CiAKQEAgLTMxMyw3ICszMTMsNyBAQAogI2lmCWRlZmluZWQoQ09ORklHX1g4NikKICNkZWZpbmUgVVNFX0tNQUxMT0MKIAotI2VsaWYJZGVmaW5lZChDT05GSUdfTUlQUykgJiYgIWRlZmluZWQoQ09ORklHX05PTkNPSEVSRU5UX0lPKQorI2VsaWYJZGVmaW5lZChDT05GSUdfTUlQUykgJiYgIWRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkKICNkZWZpbmUgVVNFX0tNQUxMT0MKIAogI2VsaWYJZGVmaW5lZChDT05GSUdfUFBDKSAmJiAhZGVmaW5lZChDT05GSUdfTk9UX0NPSEVSRU5UX0NBQ0hFKQpAQCAtMzI3LDcgKzMyNyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkICoKIGdva3VfYWxsb2NfYnVmZmVyKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgYnl0ZXMsCi0JCQlkbWFfYWRkcl90ICpkbWEsIGludCAgZ2ZwX2ZsYWdzKQorCQkJZG1hX2FkZHJfdCAqZG1hLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJdm9pZAkJKnJldHZhbDsKIAlzdHJ1Y3QgZ29rdV9lcAkqZXA7CkBAIC03ODksNyArNzg5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQKLWdva3VfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIGludCBnZnBfZmxhZ3MpCitnb2t1X3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGdva3VfcmVxdWVzdAkqcmVxOwogCXN0cnVjdCBnb2t1X2VwCQkqZXA7CkBAIC0xNTI0LDkgKzE1MjQsMTIgQEAKIAkvKiByZWFkIFNFVFVQIHBhY2tldCBhbmQgZW50ZXIgREFUQSBzdGFnZSAqLwogCWN0cmwuYlJlcXVlc3RUeXBlID0gcmVhZGwoJnJlZ3MtPmJSZXF1ZXN0VHlwZSk7CiAJY3RybC5iUmVxdWVzdCA9IHJlYWRsKCZyZWdzLT5iUmVxdWVzdCk7Ci0JY3RybC53VmFsdWUgID0gKHJlYWRsKCZyZWdzLT53VmFsdWVIKSAgPDwgOCkgfCByZWFkbCgmcmVncy0+d1ZhbHVlTCk7Ci0JY3RybC53SW5kZXggID0gKHJlYWRsKCZyZWdzLT53SW5kZXhIKSAgPDwgOCkgfCByZWFkbCgmcmVncy0+d0luZGV4TCk7Ci0JY3RybC53TGVuZ3RoID0gKHJlYWRsKCZyZWdzLT53TGVuZ3RoSCkgPDwgOCkgfCByZWFkbCgmcmVncy0+d0xlbmd0aEwpOworCWN0cmwud1ZhbHVlICA9IGNwdV90b19sZTE2KChyZWFkbCgmcmVncy0+d1ZhbHVlSCkgIDw8IDgpCisJCQkJCXwgcmVhZGwoJnJlZ3MtPndWYWx1ZUwpKTsKKwljdHJsLndJbmRleCAgPSBjcHVfdG9fbGUxNigocmVhZGwoJnJlZ3MtPndJbmRleEgpICA8PCA4KQorCQkJCQl8IHJlYWRsKCZyZWdzLT53SW5kZXhMKSk7CisJY3RybC53TGVuZ3RoID0gY3B1X3RvX2xlMTYoKHJlYWRsKCZyZWdzLT53TGVuZ3RoSCkgPDwgOCkKKwkJCQkJfCByZWFkbCgmcmVncy0+d0xlbmd0aEwpKTsKIAl3cml0ZWwoMCwgJnJlZ3MtPlNldHVwUmVjdik7CiAKIAludWtlKCZkZXYtPmVwWzBdLCAwKTsKQEAgLTE1NDgsMTggKzE1NTEsMjAgQEAKIAkJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CiAJCQlzd2l0Y2ggKGN0cmwuYlJlcXVlc3RUeXBlKSB7CiAJCQljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKLQkJCQl0bXAgPSBjdHJsLndJbmRleCAmIDB4MGY7CisJCQkJdG1wID0gbGUxNl90b19jcHUoY3RybC53SW5kZXgpICYgMHgwZjsKIAkJCQkvKiBhY3RpdmUgZW5kcG9pbnQgKi8KIAkJCQlpZiAodG1wID4gMyB8fCAoIWRldi0+ZXBbdG1wXS5kZXNjICYmIHRtcCAhPSAwKSkKIAkJCQkJZ290byBzdGFsbDsKLQkJCQlpZiAoY3RybC53SW5kZXggJiBVU0JfRElSX0lOKSB7CisJCQkJaWYgKGN0cmwud0luZGV4ICYgX19jb25zdGFudF9jcHVfdG9fbGUxNigKKwkJCQkJCVVTQl9ESVJfSU4pKSB7CiAJCQkJCWlmICghZGV2LT5lcFt0bXBdLmlzX2luKQogCQkJCQkJZ290byBzdGFsbDsKIAkJCQl9IGVsc2UgewogCQkJCQlpZiAoZGV2LT5lcFt0bXBdLmlzX2luKQogCQkJCQkJZ290byBzdGFsbDsKIAkJCQl9Ci0JCQkJaWYgKGN0cmwud1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUKQorCQkJCWlmIChjdHJsLndWYWx1ZSAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KAorCQkJCQkJVVNCX0VORFBPSU5UX0hBTFQpKQogCQkJCQlnb3RvIHN0YWxsOwogCQkJCWlmICh0bXApCiAJCQkJCWdva3VfY2xlYXJfaGFsdCgmZGV2LT5lcFt0bXBdKTsKQEAgLTE1NzEsNyArMTU3Niw3IEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBVU0JfUkVDSVBfREVWSUNFOgogCQkJCS8qIGRldmljZSByZW1vdGUgd2FrZXVwOiBhbHdheXMgY2xlYXIgKi8KLQkJCQlpZiAoY3RybC53VmFsdWUgIT0gMSkKKwkJCQlpZiAoY3RybC53VmFsdWUgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKSkKIAkJCQkJZ290byBzdGFsbDsKIAkJCQlWREJHKGRldiwgImNsZWFyIGRldiByZW1vdGUgd2FrZXVwXG4iKTsKIAkJCQlnb3RvIHN1Y2NlZWQ7CkBAIC0xNTg5LDE0ICsxNTk0LDE1IEBACiAjaWZkZWYgVVNCX1RSQUNFCiAJVkRCRyhkZXYsICJTRVRVUCAlMDJ4LiUwMnggdiUwNHggaSUwNHggbCUwNHhcbiIsCiAJCWN0cmwuYlJlcXVlc3RUeXBlLCBjdHJsLmJSZXF1ZXN0LAotCQljdHJsLndWYWx1ZSwgY3RybC53SW5kZXgsIGN0cmwud0xlbmd0aCk7CisJCWxlMTZfdG9fY3B1KGN0cmwud1ZhbHVlKSwgbGUxNl90b19jcHUoY3RybC53SW5kZXgpLAorCQlsZTE2X3RvX2NwdShjdHJsLndMZW5ndGgpKTsKICNlbmRpZgogCiAJLyogaHcgd2FudHMgdG8ga25vdyB3aGVuIHdlJ3JlIGNvbmZpZ3VyZWQgKG9yIG5vdCkgKi8KIAlkZXYtPnJlcV9jb25maWcgPSAoY3RybC5iUmVxdWVzdCA9PSBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OCiAJCQkJJiYgY3RybC5iUmVxdWVzdFR5cGUgPT0gVVNCX1JFQ0lQX0RFVklDRSk7CiAJaWYgKHVubGlrZWx5KGRldi0+cmVxX2NvbmZpZykpCi0JCWRldi0+Y29uZmlndXJlZCA9IChjdHJsLndWYWx1ZSAhPSAwKTsKKwkJZGV2LT5jb25maWd1cmVkID0gKGN0cmwud1ZhbHVlICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMCkpOwogCiAJLyogZGVsZWdhdGUgZXZlcnl0aGluZyB0byB0aGUgZ2FkZ2V0IGRyaXZlci4KIAkgKiBpdCBtYXkgcmVzcG9uZCBhZnRlciB0aGlzIGlycSBoYW5kbGVyIHJldHVybnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCmluZGV4IDFlNWU2ZGQuLjAyMDgxNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jCkBAIC00MTcsOCArNDE3LDggQEAKIAkJZ290byBmcmVlMTsKIAogCXZhbHVlID0gZXBfaW8gKGRhdGEsIGtidWYsIGxlbik7Ci0JVkRFQlVHIChkYXRhLT5kZXYsICIlcyByZWFkICVkIE9VVCwgc3RhdHVzICVkXG4iLAotCQlkYXRhLT5uYW1lLCBsZW4sIHZhbHVlKTsKKwlWREVCVUcgKGRhdGEtPmRldiwgIiVzIHJlYWQgJXp1IE9VVCwgc3RhdHVzICVkXG4iLAorCQlkYXRhLT5uYW1lLCBsZW4sIChpbnQpIHZhbHVlKTsKIAlpZiAodmFsdWUgPj0gMCAmJiBjb3B5X3RvX3VzZXIgKGJ1Ziwga2J1ZiwgdmFsdWUpKQogCQl2YWx1ZSA9IC1FRkFVTFQ7CiAKQEAgLTQ2NSw4ICs0NjUsOCBAQAogCX0KIAogCXZhbHVlID0gZXBfaW8gKGRhdGEsIGtidWYsIGxlbik7Ci0JVkRFQlVHIChkYXRhLT5kZXYsICIlcyB3cml0ZSAlZCBJTiwgc3RhdHVzICVkXG4iLAotCQlkYXRhLT5uYW1lLCBsZW4sIHZhbHVlKTsKKwlWREVCVUcgKGRhdGEtPmRldiwgIiVzIHdyaXRlICV6dSBJTiwgc3RhdHVzICVkXG4iLAorCQlkYXRhLT5uYW1lLCBsZW4sIChpbnQpIHZhbHVlKTsKIGZyZWUxOgogCXVwICgmZGF0YS0+bG9jayk7CiAJa2ZyZWUgKGtidWYpOwpAQCAtMTMxOCw4ICsxMzE4LDggQEAKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSpyZXEgPSBkZXYtPnJlcTsKIAlpbnQJCQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKIAlzdHJ1Y3QgdXNiX2dhZGdldGZzX2V2ZW50CSpldmVudDsKLQl1MTYJCQkJd192YWx1ZSA9IGN0cmwtPndWYWx1ZTsKLQl1MTYJCQkJd19sZW5ndGggPSBjdHJsLT53TGVuZ3RoOworCXUxNgkJCQl3X3ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKwl1MTYJCQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAogCXNwaW5fbG9jayAoJmRldi0+bG9jayk7CiAJZGV2LT5zZXR1cF9hYm9ydCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGg3YTQweF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCmluZGV4IGRmNzVhYjYuLjQ4NDI1NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9saDdhNDB4X3VkYy5jCkBAIC0xMTA2LDcgKzExMDYsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICpsaDdhNDB4X2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsCi0JCQkJCQkgaW50IGdmcF9mbGFncykKKwkJCQkJCSB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGxoN2E0MHhfcmVxdWVzdCAqcmVxOwogCkBAIC0xMTM0LDcgKzExMzQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCAqbGg3YTQweF9hbGxvY19idWZmZXIoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGJ5dGVzLAotCQkJCSAgZG1hX2FkZHJfdCAqIGRtYSwgaW50IGdmcF9mbGFncykKKwkJCQkgIGRtYV9hZGRyX3QgKiBkbWEsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAljaGFyICpyZXR2YWw7CiAKQEAgLTExNTgsNyArMTE1OCw3IEBACiAgKiAgTk9URTogU2V0cyBJTkRFWCByZWdpc3RlcgogICovCiBzdGF0aWMgaW50IGxoN2E0MHhfcXVldWUoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsCi0JCQkgaW50IGdmcF9mbGFncykKKwkJCSB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IGxoN2E0MHhfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBsaDdhNDB4X2VwICplcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZGlzLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmRpcy5oCmluZGV4IGM1NTNiYmYuLjA5ZTNlZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZGlzLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25kaXMuaApAQCAtNDcsMTcgKzQ3LDE3IEBACiAjZGVmaW5lIE5ESVNfREVWSUNFX1dBS0VfT05fTUFHSUNfUEFDS0VUX0VOQUJMRSAgIDB4MDAwMDAwMDQKIAogc3RydWN0IE5ESVNfUE5QX0NBUEFCSUxJVElFUyB7Ci0JdTMyCQkJCQlGbGFnczsKKwlfX2xlMzIJCQkJCUZsYWdzOwogCXN0cnVjdCBORElTX1BNX1dBS0VfVVBfQ0FQQUJJTElUSUVTCVdha2VVcENhcGFiaWxpdGllczsKIH07CiAKIHN0cnVjdCBORElTX1BNX1BBQ0tFVF9QQVRURVJOIHsKLQl1MzIJUHJpb3JpdHk7Ci0JdTMyCVJlc2VydmVkOwotCXUzMglNYXNrU2l6ZTsKLQl1MzIJUGF0dGVybk9mZnNldDsKLQl1MzIJUGF0dGVyblNpemU7Ci0JdTMyCVBhdHRlcm5GbGFnczsKKwlfX2xlMzIJUHJpb3JpdHk7CisJX19sZTMyCVJlc2VydmVkOworCV9fbGUzMglNYXNrU2l6ZTsKKwlfX2xlMzIJUGF0dGVybk9mZnNldDsKKwlfX2xlMzIJUGF0dGVyblNpemU7CisJX19sZTMyCVBhdHRlcm5GbGFnczsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKaW5kZXggZTQ3ZTM5OC4uNDc3ZmFiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCkBAIC0zNzYsNyArMzc2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotbmV0MjI4MF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICpfZXAsIGludCBnZnBfZmxhZ3MpCituZXQyMjgwX2FsbG9jX3JlcXVlc3QgKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBuZXQyMjgwX2VwCSplcDsKIAlzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0CSpyZXE7CkBAIC00NDgsNyArNDQ4LDcgQEAKICNlbGlmCWRlZmluZWQoQ09ORklHX1BQQykgJiYgIWRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKICNkZWZpbmUgVVNFX0tNQUxMT0MKIAotI2VsaWYJZGVmaW5lZChDT05GSUdfTUlQUykgJiYgIWRlZmluZWQoQ09ORklHX05PTkNPSEVSRU5UX0lPKQorI2VsaWYJZGVmaW5lZChDT05GSUdfTUlQUykgJiYgIWRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkKICNkZWZpbmUgVVNFX0tNQUxMT0MKIAogLyogRklYTUUgdGhlcmUgYXJlIG90aGVyIGNhc2VzLCBpbmNsdWRpbmcgYW4geDg2LTY0IG9uZSAuLi4gICovCkBAIC00NjMsNyArNDYzLDcgQEAKIAlzdHJ1Y3QgdXNiX2VwCQkqX2VwLAogCXVuc2lnbmVkCQlieXRlcywKIAlkbWFfYWRkcl90CQkqZG1hLAotCWludAkJCWdmcF9mbGFncworCXVuc2lnbmVkCQlnZnBfZmxhZ3MKICkKIHsKIAl2b2lkCQkJKnJldHZhbDsKQEAgLTg5Nyw3ICs4OTcsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludAotbmV0MjI4MF9xdWV1ZSAoc3RydWN0IHVzYl9lcCAqX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKl9yZXEsIGludCBnZnBfZmxhZ3MpCituZXQyMjgwX3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBuZXQyMjgwX3JlcXVlc3QJKnJlcTsKIAlzdHJ1Y3QgbmV0MjI4MF9lcAkqZXA7CkBAIC0xMTEzLDcgKzExMTMsNyBAQAogCQlpZiAoZXAtPmluX2ZpZm9fdmFsaWRhdGUpCiAJCQlkbWFjdGwgfD0gKDEgPDwgRE1BX0ZJRk9fVkFMSURBVEUpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5IChlbnRyeSwgJmVwLT5xdWV1ZSwgcXVldWUpIHsKLQkJCXUzMgkJZG1hY291bnQ7CisJCQlfX2xlMzIJCWRtYWNvdW50OwogCiAJCQlpZiAoZW50cnkgPT0gcmVxKQogCQkJCWNvbnRpbnVlOwpAQCAtMTIzOCw3ICsxMjM4LDcgQEAKIAkJCQkmZXAtPmRtYS0+ZG1hZGVzYyk7CiAJCQlpZiAocmVxLT50ZC0+ZG1hY291bnQgJiBkbWFfZG9uZV9pZSkKIAkJCQl3cml0ZWwgKHJlYWRsICgmZXAtPmRtYS0+ZG1hY291bnQpCi0JCQkJCQl8IGRtYV9kb25lX2llLAorCQkJCQkJfCBsZTMyX3RvX2NwdShkbWFfZG9uZV9pZSksCiAJCQkJCSZlcC0+ZG1hLT5kbWFjb3VudCk7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0CSpwcmV2OwpAQCAtMTQ5MCw3ICsxNDkwLDcgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlpbnQJCQlpOwogCXUzMgkJCXQxLCB0MjsKLQljaGFyCQkJKnM7CisJY29uc3QgY2hhcgkJKnM7CiAKIAlkZXYgPSBkZXZfZ2V0X2RydmRhdGEgKF9kZXYpOwogCW5leHQgPSBidWY7CkBAIC0xNzc5LDYgKzE3NzksOSBAQAogCWxpc3RfYWRkX3RhaWwgKCZkZXYtPmVwIFs2XS5lcC5lcF9saXN0LCAmZGV2LT5nYWRnZXQuZXBfbGlzdCk7CiB9CiAKKy8qIGp1c3QgZGVjbGFyZSB0aGlzIGluIGFueSBkcml2ZXIgdGhhdCByZWFsbHkgbmVlZCBpdCAqLworZXh0ZXJuIGludCBuZXQyMjgwX3NldF9maWZvX21vZGUgKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBtb2RlKTsKKwogLyoqCiAgKiBuZXQyMjgwX3NldF9maWZvX21vZGUgLSBjaGFuZ2UgYWxsb2NhdGlvbiBvZiBmaWZvIGJ1ZmZlcnMKICAqIEBnYWRnZXQ6IGFjY2VzcyB0byB0aGUgbmV0MjI4MCBkZXZpY2UgdGhhdCB3aWxsIGJlIHVwZGF0ZWQKQEAgLTIzODIsOSArMjM4NSw5IEBACiAJCWNwdV90b19sZTMycyAoJnUucmF3IFswXSk7CiAJCWNwdV90b19sZTMycyAoJnUucmF3IFsxXSk7CiAKLQkJbGUxNl90b19jcHVzICgmdS5yLndWYWx1ZSk7Ci0JCWxlMTZfdG9fY3B1cyAoJnUuci53SW5kZXgpOwotCQlsZTE2X3RvX2NwdXMgKCZ1LnIud0xlbmd0aCk7CisjZGVmaW5lCXdfdmFsdWUJCWxlMTZfdG9fY3B1cCAoJnUuci53VmFsdWUpCisjZGVmaW5lCXdfaW5kZXgJCWxlMTZfdG9fY3B1cCAoJnUuci53SW5kZXgpCisjZGVmaW5lCXdfbGVuZ3RoCWxlMTZfdG9fY3B1cCAoJnUuci53TGVuZ3RoKQogCiAJCS8qIGFjayB0aGUgaXJxICovCiAJCXdyaXRlbCAoMSA8PCBTRVRVUF9QQUNLRVRfSU5URVJSVVBULCAmZGV2LT5yZWdzLT5pcnFzdGF0MCk7CkBAIC0yNDEzLDI1ICsyNDE2LDI1IEBACiAJCXN3aXRjaCAodS5yLmJSZXF1ZXN0KSB7CiAJCWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOiB7CiAJCQlzdHJ1Y3QgbmV0MjI4MF9lcAkqZTsKLQkJCXUxNgkJCXN0YXR1czsKKwkJCV9fbGUzMgkJCXN0YXR1czsKIAogCQkJLyogaHcgaGFuZGxlcyBkZXZpY2UgYW5kIGludGVyZmFjZSBzdGF0dXMgKi8KIAkJCWlmICh1LnIuYlJlcXVlc3RUeXBlICE9IChVU0JfRElSX0lOfFVTQl9SRUNJUF9FTkRQT0lOVCkpCiAJCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmICgoZSA9IGdldF9lcF9ieV9hZGRyIChkZXYsIHUuci53SW5kZXgpKSA9PSAwCi0JCQkJCXx8IHUuci53TGVuZ3RoID4gMikKKwkJCWlmICgoZSA9IGdldF9lcF9ieV9hZGRyIChkZXYsIHdfaW5kZXgpKSA9PSAwCisJCQkJCXx8IHdfbGVuZ3RoID4gMikKIAkJCQlnb3RvIGRvX3N0YWxsOwogCiAJCQlpZiAocmVhZGwgKCZlLT5yZWdzLT5lcF9yc3ApCiAJCQkJCSYgKDEgPDwgU0VUX0VORFBPSU5UX0hBTFQpKQotCQkJCXN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDEpOworCQkJCXN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDEpOwogCQkJZWxzZQotCQkJCXN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYgKDApOworCQkJCXN0YXR1cyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCiAJCQkvKiBkb24ndCBib3RoZXIgd2l0aCBhIHJlcXVlc3Qgb2JqZWN0ISAqLwogCQkJd3JpdGVsICgwLCAmZGV2LT5lcHJlZ3MgWzBdLmVwX2lycWVuYik7Ci0JCQlzZXRfZmlmb19ieXRlY291bnQgKGVwLCB1LnIud0xlbmd0aCk7Ci0JCQl3cml0ZWwgKHN0YXR1cywgJmRldi0+ZXByZWdzIFswXS5lcF9kYXRhKTsKKwkJCXNldF9maWZvX2J5dGVjb3VudCAoZXAsIHdfbGVuZ3RoKTsKKwkJCXdyaXRlbCAoKF9fZm9yY2UgdTMyKXN0YXR1cywgJmRldi0+ZXByZWdzIFswXS5lcF9kYXRhKTsKIAkJCWFsbG93X3N0YXR1cyAoZXApOwogCQkJVkRFQlVHIChkZXYsICIlcyBzdGF0ICUwMnhcbiIsIGVwLT5lcC5uYW1lLCBzdGF0dXMpOwogCQkJZ290byBuZXh0X2VuZHBvaW50czsKQEAgLTI0NDMsMTAgKzI0NDYsMTAgQEAKIAkJCS8qIGh3IGhhbmRsZXMgZGV2aWNlIGZlYXR1cmVzICovCiAJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCiAJCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmICh1LnIud1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUCi0JCQkJCXx8IHUuci53TGVuZ3RoICE9IDApCisJCQlpZiAod192YWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVAorCQkJCQl8fCB3X2xlbmd0aCAhPSAwKQogCQkJCWdvdG8gZG9fc3RhbGw7Ci0JCQlpZiAoKGUgPSBnZXRfZXBfYnlfYWRkciAoZGV2LCB1LnIud0luZGV4KSkgPT0gMCkKKwkJCWlmICgoZSA9IGdldF9lcF9ieV9hZGRyIChkZXYsIHdfaW5kZXgpKSA9PSAwKQogCQkJCWdvdG8gZG9fc3RhbGw7CiAJCQljbGVhcl9oYWx0IChlKTsKIAkJCWFsbG93X3N0YXR1cyAoZXApOwpAQCAtMjQ2MCwxMCArMjQ2MywxMCBAQAogCQkJLyogaHcgaGFuZGxlcyBkZXZpY2UgZmVhdHVyZXMgKi8KIAkJCWlmICh1LnIuYlJlcXVlc3RUeXBlICE9IFVTQl9SRUNJUF9FTkRQT0lOVCkKIAkJCQlnb3RvIGRlbGVnYXRlOwotCQkJaWYgKHUuci53VmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQKLQkJCQkJfHwgdS5yLndMZW5ndGggIT0gMCkKKwkJCWlmICh3X3ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUCisJCQkJCXx8IHdfbGVuZ3RoICE9IDApCiAJCQkJZ290byBkb19zdGFsbDsKLQkJCWlmICgoZSA9IGdldF9lcF9ieV9hZGRyIChkZXYsIHUuci53SW5kZXgpKSA9PSAwKQorCQkJaWYgKChlID0gZ2V0X2VwX2J5X2FkZHIgKGRldiwgd19pbmRleCkpID09IDApCiAJCQkJZ290byBkb19zdGFsbDsKIAkJCXNldF9oYWx0IChlKTsKIAkJCWFsbG93X3N0YXR1cyAoZXApOwpAQCAtMjQ3MywxMCArMjQ3NiwxMCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiBkZWxlZ2F0ZToKLQkJCVZERUJVRyAoZGV2LCAic2V0dXAgJTAyeC4lMDJ4IHYlMDR4IGklMDR4ICIKKwkJCVZERUJVRyAoZGV2LCAic2V0dXAgJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4IgogCQkJCSJlcF9jZmcgJTA4eFxuIiwKIAkJCQl1LnIuYlJlcXVlc3RUeXBlLCB1LnIuYlJlcXVlc3QsCi0JCQkJdS5yLndWYWx1ZSwgdS5yLndJbmRleCwKKwkJCQl3X3ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCwKIAkJCQlyZWFkbCAoJmVwLT5yZWdzLT5lcF9jZmcpKTsKIAkJCXNwaW5fdW5sb2NrICgmZGV2LT5sb2NrKTsKIAkJCXRtcCA9IGRldi0+ZHJpdmVyLT5zZXR1cCAoJmRldi0+Z2FkZ2V0LCAmdS5yKTsKQEAgLTI0OTcsNiArMjUwMCwxMCBAQAogCQkgKi8KIAl9CiAKKyN1bmRlZgl3X3ZhbHVlCisjdW5kZWYJd19pbmRleAorI3VuZGVmCXdfbGVuZ3RoCisKIG5leHRfZW5kcG9pbnRzOgogCS8qIGVuZHBvaW50IGRhdGEgaXJxID8gKi8KIAlzY3JhdGNoID0gc3RhdCAmIDB4N2Y7CkBAIC0yNjUzLDcgKzI2NjAsNyBAQAogCQkJCXJlc3RhcnRfZG1hIChlcCk7CiAJCQllbHNlIGlmIChlcC0+aXNfaW4gJiYgdXNlX2RtYV9jaGFpbmluZykgewogCQkJCXN0cnVjdCBuZXQyMjgwX3JlcXVlc3QJKnJlcTsKLQkJCQl1MzIJCQlkbWFjb3VudDsKKwkJCQlfX2xlMzIJCQlkbWFjb3VudDsKIAogCQkJCS8qIHRoZSBkZXNjcmlwdG9yIGF0IHRoZSBoZWFkIG9mIHRoZSBjaGFpbgogCQkJCSAqIG1heSBzdGlsbCBoYXZlIFZBTElEX0JJVCBjbGVhcjsgdGhhdCdzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCmluZGV4IDk4Y2JjYmMuLmZmNTUzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jCkBAIC01Miw3ICs1Miw2IEBACiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3VzYi5oPgogCiAjaW5jbHVkZSAib21hcF91ZGMuaCIKQEAgLTE2Nyw3ICsxNjYsNyBAQAogCW1heHAgPSBsZTE2X3RvX2NwdSAoZGVzYy0+d01heFBhY2tldFNpemUpOwogCWlmICgoZGVzYy0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKIAkJCQkmJiBtYXhwICE9IGVwLT5tYXhwYWNrZXQpCi0JCQl8fCBkZXNjLT53TWF4UGFja2V0U2l6ZSA+IGVwLT5tYXhwYWNrZXQKKwkJCXx8IGxlMTZfdG9fY3B1KGRlc2MtPndNYXhQYWNrZXRTaXplKSA+IGVwLT5tYXhwYWNrZXQKIAkJCXx8ICFkZXNjLT53TWF4UGFja2V0U2l6ZSkgewogCQlEQkcoIiVzLCBiYWQgJXMgbWF4cGFja2V0XG4iLCBfX0ZVTkNUSU9OX18sIF9lcC0+bmFtZSk7CiAJCXJldHVybiAtRVJBTkdFOwpAQCAtMjE0LDcgKzIxMyw3IEBACiAJZXAtPmhhc19kbWEgPSAwOwogCWVwLT5sY2ggPSAtMTsKIAl1c2VfZXAoZXAsIFVEQ19FUF9TRUwpOwotCVVEQ19DVFJMX1JFRyA9IFVEQ19SRVNFVF9FUDsKKwlVRENfQ1RSTF9SRUcgPSB1ZGMtPmNscl9oYWx0OwogCWVwLT5hY2t3YWl0ID0gMDsKIAlkZXNlbGVjdF9lcCgpOwogCkBAIC0yNTMsNyArMjUyLDcgQEAKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPnVkYy0+bG9jaywgZmxhZ3MpOwotCWVwLT5kZXNjID0gMDsKKwllcC0+ZGVzYyA9IE5VTEw7CiAJbnVrZSAoZXAsIC1FU0hVVERPV04pOwogCWVwLT5lcC5tYXhwYWNrZXQgPSBlcC0+bWF4cGFja2V0OwogCWVwLT5oYXNfZG1hID0gMDsKQEAgLTI3MCw3ICsyNjksNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCi1vbWFwX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsIGludCBnZnBfZmxhZ3MpCitvbWFwX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlzdHJ1Y3Qgb21hcF9yZXEJKnJlcTsKIApAQCAtMjk5LDcgKzI5OCw3IEBACiAJc3RydWN0IHVzYl9lcAkqX2VwLAogCXVuc2lnbmVkCWJ5dGVzLAogCWRtYV9hZGRyX3QJKmRtYSwKLQlpbnQJCWdmcF9mbGFncworCXVuc2lnbmVkCWdmcF9mbGFncwogKQogewogCXZvaWQJCSpyZXR2YWw7CkBAIC0zODgsOCArMzg3LDggQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2RlZmluZQlGSUZPX0ZVTEwJKFVEQ19OT05fSVNPX0ZJRk9fRlVMTCB8IFVEQ19JU09fRklGT19GVUxMKQotI2RlZmluZQlGSUZPX1VOV1JJVEFCTEUJKFVEQ19FUF9IQUxURUQgfCBGSUZPX0ZVTEwpCisjZGVmaW5lIFVEQ19GSUZPX0ZVTEwJCShVRENfTk9OX0lTT19GSUZPX0ZVTEwgfCBVRENfSVNPX0ZJRk9fRlVMTCkKKyNkZWZpbmUgVURDX0ZJRk9fVU5XUklUQUJMRQkoVURDX0VQX0hBTFRFRCB8IFVEQ19GSUZPX0ZVTEwpCiAKICNkZWZpbmUgRklGT19FTVBUWQkoVURDX05PTl9JU09fRklGT19FTVBUWSB8IFVEQ19JU09fRklGT19FTVBUWSkKICNkZWZpbmUgRklGT19VTlJFQURBQkxFIChVRENfRVBfSEFMVEVEIHwgRklGT19FTVBUWSkKQEAgLTQzMyw3ICs0MzIsNyBAQAogCiAJLyogUElPLUlOIGlzbid0IGRvdWJsZSBidWZmZXJlZCBleGNlcHQgZm9yIGlzbyAqLwogCWVwX3N0YXQgPSBVRENfU1RBVF9GTEdfUkVHOwotCWlmIChlcF9zdGF0ICYgRklGT19VTldSSVRBQkxFKQorCWlmIChlcF9zdGF0ICYgVURDX0ZJRk9fVU5XUklUQUJMRSkKIAkJcmV0dXJuIDA7CiAKIAljb3VudCA9IGVwLT5lcC5tYXhwYWNrZXQ7CkBAIC01MDQsNyArNTAzLDcgQEAKIAkJaWYgKGVwX3N0YXQgJiBVRENfRVBfSEFMVEVEKQogCQkJYnJlYWs7CiAKLQkJaWYgKGVwX3N0YXQgJiBGSUZPX0ZVTEwpCisJCWlmIChlcF9zdGF0ICYgVURDX0ZJRk9fRlVMTCkKIAkJCWF2YWlsID0gZXAtPmVwLm1heHBhY2tldDsKIAkJZWxzZSAgewogCQkJYXZhaWwgPSBVRENfUlhGU1RBVF9SRUc7CkBAIC01MzgsNiArNTM3LDMyIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfY3NhYyh1bnNpZ25lZCBsY2gpCit7CisJZG1hX2FkZHJfdAljc2FjOworCisJLyogb21hcCAzLjIvMy4zIGVycmF0dW06IHNvbWV0aW1lcyAwIGlzIHJldHVybmVkIGlmIENTQUMvQ0RBQyBpcworCSAqIHJlYWQgYmVmb3JlIHRoZSBETUEgY29udHJvbGxlciBmaW5pc2hlZCBkaXNhYmxpbmcgdGhlIGNoYW5uZWwuCisJICovCisJY3NhYyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NBQyhsY2gpKTsKKwlpZiAoY3NhYyA9PSAwKQorCQljc2FjID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0FDKGxjaCkpOworCXJldHVybiBjc2FjOworfQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgZG1hX2NkYWModW5zaWduZWQgbGNoKQoreworCWRtYV9hZGRyX3QJY2RhYzsKKworCS8qIG9tYXAgMy4yLzMuMyBlcnJhdHVtOiBzb21ldGltZXMgMCBpcyByZXR1cm5lZCBpZiBDU0FDL0NEQUMgaXMKKwkgKiByZWFkIGJlZm9yZSB0aGUgRE1BIGNvbnRyb2xsZXIgZmluaXNoZWQgZGlzYWJsaW5nIHRoZSBjaGFubmVsLgorCSAqLworCWNkYWMgPSBvbWFwX3JlYWR3KE9NQVBfRE1BX0NEQUMobGNoKSk7CisJaWYgKGNkYWMgPT0gMCkKKwkJY2RhYyA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ0RBQyhsY2gpKTsKKwlyZXR1cm4gY2RhYzsKK30KKwogc3RhdGljIHUxNiBkbWFfc3JjX2xlbihzdHJ1Y3Qgb21hcF9lcCAqZXAsIGRtYV9hZGRyX3Qgc3RhcnQpCiB7CiAJZG1hX2FkZHJfdAllbmQ7CkBAIC01NDgsNyArNTczLDcgQEAKIAlpZiAoY3B1X2lzX29tYXAxNXh4KCkpCiAJCXJldHVybiAwOwogCi0JZW5kID0gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0FDKGVwLT5sY2gpKTsKKwllbmQgPSBkbWFfY3NhYyhlcC0+bGNoKTsKIAlpZiAoZW5kID09IGVwLT5kbWFfY291bnRlcikKIAkJcmV0dXJuIDA7CiAKQEAgLTU1OSwxNCArNTg0LDE0IEBACiB9CiAKICNkZWZpbmUgRE1BX0RFU1RfTEFTVCh4KSAoY3B1X2lzX29tYXAxNXh4KCkgXAotCQk/IE9NQVBfRE1BX0NTQUMoeCkgLyogcmVhbGx5OiBDUEMgKi8gXAotCQk6IE9NQVBfRE1BX0NEQUMoeCkpCisJCT8gb21hcF9yZWFkdyhPTUFQX0RNQV9DU0FDKHgpKSAvKiByZWFsbHk6IENQQyAqLyBcCisJCTogZG1hX2NkYWMoeCkpCiAKIHN0YXRpYyB1MTYgZG1hX2Rlc3RfbGVuKHN0cnVjdCBvbWFwX2VwICplcCwgZG1hX2FkZHJfdCBzdGFydCkKIHsKIAlkbWFfYWRkcl90CWVuZDsKIAotCWVuZCA9IG9tYXBfcmVhZHcoRE1BX0RFU1RfTEFTVChlcC0+bGNoKSk7CisJZW5kID0gRE1BX0RFU1RfTEFTVChlcC0+bGNoKTsKIAlpZiAoZW5kID09IGVwLT5kbWFfY291bnRlcikKIAkJcmV0dXJuIDA7CiAKQEAgLTU5Myw3ICs2MTgsNyBAQAogCQkJCTogT01BUF9ETUFfU1lOQ19FTEVNRU5UOwogCiAJLyogbWVhc3VyZSBsZW5ndGggaW4gZWl0aGVyIGJ5dGVzIG9yIHBhY2tldHMgKi8KLQlpZiAoKGNwdV9pc19vbWFwMTZ4eCgpICYmIGxlbmd0aCA8PSAoVURDX1RYTl9UU0MgKyAxKSkKKwlpZiAoKGNwdV9pc19vbWFwMTZ4eCgpICYmIGxlbmd0aCA8PSBVRENfVFhOX1RTQykKIAkJCXx8IChjcHVfaXNfb21hcDE1eHgoKSAmJiBsZW5ndGggPCBlcC0+bWF4cGFja2V0KSkgewogCQl0eGRtYV9jdHJsID0gVURDX1RYTl9FT1QgfCBsZW5ndGg7CiAJCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMoZXAtPmxjaCwgT01BUF9ETUFfREFUQV9UWVBFX1M4LApAQCAtNjAyLDE1ICs2MjcsMTUgQEAKIAkJbGVuZ3RoID0gbWluKGxlbmd0aCAvIGVwLT5tYXhwYWNrZXQsCiAJCQkJKHVuc2lnbmVkKSBVRENfVFhOX1RTQyArIDEpOwogIAkJdHhkbWFfY3RybCA9IGxlbmd0aDsKLQkJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhlcC0+bGNoLCBPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCi0JCQkJZXAtPmVwLm1heHBhY2tldCwgbGVuZ3RoLCBzeW5jX21vZGUpOworCQlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKGVwLT5sY2gsIE9NQVBfRE1BX0RBVEFfVFlQRV9TMTYsCisJCQkJZXAtPmVwLm1heHBhY2tldCA+PiAxLCBsZW5ndGgsIHN5bmNfbW9kZSk7CiAJCWxlbmd0aCAqPSBlcC0+bWF4cGFja2V0OwogCX0KIAlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhlcC0+bGNoLCBPTUFQX0RNQV9QT1JUX0VNSUZGLAogCQlPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywgcmVxLT5yZXEuZG1hICsgcmVxLT5yZXEuYWN0dWFsKTsKIAogCW9tYXBfc3RhcnRfZG1hKGVwLT5sY2gpOwotCWVwLT5kbWFfY291bnRlciA9IG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NBQyhlcC0+bGNoKSk7CisJZXAtPmRtYV9jb3VudGVyID0gZG1hX2NzYWMoZXAtPmxjaCk7CiAJVURDX0RNQV9JUlFfRU5fUkVHIHw9IFVEQ19UWF9ET05FX0lFKGVwLT5kbWFfY2hhbm5lbCk7CiAJVURDX1RYRE1BX1JFRyhlcC0+ZG1hX2NoYW5uZWwpID0gVURDX1RYTl9TVEFSVCB8IHR4ZG1hX2N0cmw7CiAJcmVxLT5kbWFfYnl0ZXMgPSBsZW5ndGg7CkBAIC02NTAsMTIgKzY3NSwxMiBAQAogCXBhY2tldHMgPSAocmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsKSAvIGVwLT5lcC5tYXhwYWNrZXQ7CiAJcGFja2V0cyA9IG1pbihwYWNrZXRzLCAodW5zaWduZWQpVURDX1JYTl9UQyArIDEpOwogCXJlcS0+ZG1hX2J5dGVzID0gcGFja2V0cyAqIGVwLT5lcC5tYXhwYWNrZXQ7Ci0Jb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyhlcC0+bGNoLCBPTUFQX0RNQV9EQVRBX1RZUEVfUzgsCi0JCQllcC0+ZXAubWF4cGFja2V0LCBwYWNrZXRzLAorCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXMoZXAtPmxjaCwgT01BUF9ETUFfREFUQV9UWVBFX1MxNiwKKwkJCWVwLT5lcC5tYXhwYWNrZXQgPj4gMSwgcGFja2V0cywKIAkJCU9NQVBfRE1BX1NZTkNfRUxFTUVOVCk7CiAJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKGVwLT5sY2gsIE9NQVBfRE1BX1BPUlRfRU1JRkYsCiAJCU9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLCByZXEtPnJlcS5kbWEgKyByZXEtPnJlcS5hY3R1YWwpOwotCWVwLT5kbWFfY291bnRlciA9IG9tYXBfcmVhZHcoRE1BX0RFU1RfTEFTVChlcC0+bGNoKSk7CisJZXAtPmRtYV9jb3VudGVyID0gRE1BX0RFU1RfTEFTVChlcC0+bGNoKTsKIAogCVVEQ19SWERNQV9SRUcoZXAtPmRtYV9jaGFubmVsKSA9IFVEQ19SWE5fU1RPUCB8IChwYWNrZXRzIC0gMSk7CiAJVURDX0RNQV9JUlFfRU5fUkVHIHw9IFVEQ19SWF9FT1RfSUUoZXAtPmRtYV9jaGFubmVsKTsKQEAgLTc2Myw3ICs3ODgsNyBAQAogCQlyZWcgPSBVRENfVFhETUFfQ0ZHX1JFRzsKIAllbHNlCiAJCXJlZyA9IFVEQ19SWERNQV9DRkdfUkVHOwotCXJlZyB8PSAxIDw8IDEyOwkJLyogInB1bHNlIiBhY3RpdmF0ZWQgKi8KKwlyZWcgfD0gVURDX0RNQV9SRVE7CQkvKiAicHVsc2UiIGFjdGl2YXRlZCAqLwogCiAJZXAtPmRtYV9jaGFubmVsID0gMDsKIAllcC0+bGNoID0gLTE7CkBAIC03ODcsNiArODEyLDExIEBACiAJCQllcC0+ZXAubmFtZSwgZG1hX2Vycm9yLCBlcCwgJmVwLT5sY2gpOwogCQlpZiAoc3RhdHVzID09IDApIHsKIAkJCVVEQ19UWERNQV9DRkdfUkVHID0gcmVnOworCQkJLyogRU1JRkYgKi8KKwkJCW9tYXBfc2V0X2RtYV9zcmNfYnVyc3RfbW9kZShlcC0+bGNoLAorCQkJCQkJT01BUF9ETUFfREFUQV9CVVJTVF80KTsKKwkJCW9tYXBfc2V0X2RtYV9zcmNfZGF0YV9wYWNrKGVwLT5sY2gsIDEpOworCQkJLyogVElQQiAqLwogCQkJb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKGVwLT5sY2gsCiAJCQkJT01BUF9ETUFfUE9SVF9USVBCLAogCQkJCU9NQVBfRE1BX0FNT0RFX0NPTlNUQU5ULApAQCAtNzk3LDEwICs4MjcsMTUgQEAKIAkJCWVwLT5lcC5uYW1lLCBkbWFfZXJyb3IsIGVwLCAmZXAtPmxjaCk7CiAJCWlmIChzdGF0dXMgPT0gMCkgewogCQkJVURDX1JYRE1BX0NGR19SRUcgPSByZWc7CisJCQkvKiBUSVBCICovCiAJCQlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyhlcC0+bGNoLAogCQkJCU9NQVBfRE1BX1BPUlRfVElQQiwKIAkJCQlPTUFQX0RNQV9BTU9ERV9DT05TVEFOVCwKIAkJCQkodW5zaWduZWQgbG9uZykgaW9fdjJwKCh1MzIpJlVEQ19EQVRBX0RNQV9SRUcpKTsKKwkJCS8qIEVNSUZGICovCisJCQlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKGVwLT5sY2gsCisJCQkJCQlPTUFQX0RNQV9EQVRBX0JVUlNUXzQpOworCQkJb21hcF9zZXRfZG1hX2Rlc3RfZGF0YV9wYWNrKGVwLT5sY2gsIDEpOwogCQl9CiAJfQogCWlmIChzdGF0dXMpCkBAIC04NTYsNyArODkxLDcgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCiAJCXJlcSA9IGNvbnRhaW5lcl9vZihlcC0+cXVldWUubmV4dCwgc3RydWN0IG9tYXBfcmVxLCBxdWV1ZSk7CiAJZWxzZQotCQlyZXEgPSAwOworCQlyZXEgPSBOVUxMOwogCiAJYWN0aXZlID0gKCgxIDw8IDcpICYgb21hcF9yZWFkbChPTUFQX0RNQV9DQ1IoZXAtPmxjaCkpKSAhPSAwOwogCkBAIC04NjUsOSArOTAwLDEzIEBACiAJCQkoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSA/ICd0JyA6ICdyJywKIAkJCWVwLT5kbWFfY2hhbm5lbCAtIDEsIHJlcSk7CiAKKwkvKiBOT1RFOiByZS1zZXR0aW5nIFJYX1JFUS9UWF9SRVEgYmVjYXVzZSBvZiBhIGNoaXAgYnVnIChiZWZvcmUKKwkgKiBPTUFQIDE3MTAgRVMyLjApIHdoZXJlIHJlYWRpbmcgdGhlIERNQV9DRkcgY2FuIGNsZWFyIHRoZW0uCisJICovCisKIAkvKiB3YWl0IHRpbGwgY3VycmVudCBwYWNrZXQgRE1BIGZpbmlzaGVzLCBhbmQgZmlmbyBlbXB0aWVzICovCiAJaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgewotCQlVRENfVFhETUFfQ0ZHX1JFRyAmPSB+bWFzazsKKwkJVURDX1RYRE1BX0NGR19SRUcgPSAoVURDX1RYRE1BX0NGR19SRUcgJiB+bWFzaykgfCBVRENfRE1BX1JFUTsKIAogCQlpZiAocmVxKSB7CiAJCQlmaW5pc2hfaW5fZG1hKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKQEAgLTg4MCw3ICs5MTksNyBAQAogCQl3aGlsZSAoVURDX1RYRE1BX0NGR19SRUcgJiBtYXNrKQogCQkJdWRlbGF5KDEwKTsKIAl9IGVsc2UgewotCQlVRENfUlhETUFfQ0ZHX1JFRyAmPSB+bWFzazsKKwkJVURDX1JYRE1BX0NGR19SRUcgPSAoVURDX1JYRE1BX0NGR19SRUcgJiB+bWFzaykgfCBVRENfRE1BX1JFUTsKIAogCQkvKiBkbWEgZW1wdGllcyB0aGUgZmlmbyAqLwogCQl3aGlsZSAoVURDX1JYRE1BX0NGR19SRUcgJiBtYXNrKQpAQCAtODk4LDcgKzkzNyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgaW50Ci1vbWFwX2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpfcmVxLCBpbnQgZ2ZwX2ZsYWdzKQorb21hcF9lcF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBvbWFwX2VwCSplcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBvbWFwX2VwLCBlcCk7CiAJc3RydWN0IG9tYXBfcmVxCSpyZXEgPSBjb250YWluZXJfb2YoX3JlcSwgc3RydWN0IG9tYXBfcmVxLCByZXEpOwpAQCAtOTk3LDE4ICsxMDM2LDE5IEBACiAJCQkJCVVEQ19JUlFfRU5fUkVHID0gaXJxX2VuOwogCQkJCX0KIAotCQkJCS8qIFNUQVRVUyBpcyByZXZlcnNlIGRpcmVjdGlvbiAqLwotCQkJCVVEQ19FUF9OVU1fUkVHID0gaXNfaW4KLQkJCQkJCT8gVURDX0VQX1NFTAotCQkJCQkJOiAoVURDX0VQX1NFTHxVRENfRVBfRElSKTsKKwkJCQkvKiBTVEFUVVMgZm9yIHplcm8gbGVuZ3RoIERBVEEgc3RhZ2VzIGlzCisJCQkJICogYWx3YXlzIGFuIElOIC4uLiBldmVuIGZvciBJTiB0cmFuc2ZlcnMsCisJCQkJICogYSB3aWVyZCBjYXNlIHdoaWNoIHNlZW0gdG8gc3RhbGwgT01BUC4KKwkJCQkgKi8KKwkJCQlVRENfRVBfTlVNX1JFRyA9IChVRENfRVBfU0VMfFVEQ19FUF9ESVIpOwogCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19DTFJfRVA7CiAJCQkJVURDX0NUUkxfUkVHID0gVURDX1NFVF9GSUZPX0VOOwotCQkJCVVEQ19FUF9OVU1fUkVHID0gdWRjLT5lcDBfaW4gPyAwIDogVURDX0VQX0RJUjsKKwkJCQlVRENfRVBfTlVNX1JFRyA9IFVEQ19FUF9ESVI7CiAKIAkJCQkvKiBjbGVhbnVwICovCiAJCQkJdWRjLT5lcDBfcGVuZGluZyA9IDA7CiAJCQkJZG9uZShlcCwgcmVxLCAwKTsKLQkJCQlyZXEgPSAwOworCQkJCXJlcSA9IE5VTEw7CiAKIAkJCS8qIG5vbi1lbXB0eSBEQVRBIHN0YWdlICovCiAJCQl9IGVsc2UgaWYgKGlzX2luKSB7CkBAIC0xMDI5LDcgKzEwNjksNyBAQAogCQkJKGlzX2luID8gbmV4dF9pbl9kbWEgOiBuZXh0X291dF9kbWEpKGVwLCByZXEpOwogCQllbHNlIGlmIChyZXEpIHsKIAkJCWlmICgoaXNfaW4gPyB3cml0ZV9maWZvIDogcmVhZF9maWZvKShlcCwgcmVxKSA9PSAxKQotCQkJCXJlcSA9IDA7CisJCQkJcmVxID0gTlVMTDsKIAkJCWRlc2VsZWN0X2VwKCk7CiAJCQlpZiAoIWlzX2luKSB7CiAJCQkJVURDX0NUUkxfUkVHID0gVURDX1NFVF9GSUZPX0VOOwpAQCAtMTA0MSw3ICsxMDgxLDcgQEAKIAogaXJxX3dhaXQ6CiAJLyogaXJxIGhhbmRsZXIgYWR2YW5jZXMgdGhlIHF1ZXVlICovCi0JaWYgKHJlcSAhPSAwKQorCWlmIChyZXEgIT0gTlVMTCkKIAkJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKQEAgLTExNDAsNyArMTE4MCw3IEBACiAJCQkJZG1hX2NoYW5uZWxfY2xhaW0oZXAsIGNoYW5uZWwpOwogCQl9IGVsc2UgewogCQkJdXNlX2VwKGVwLCAwKTsKLQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19SRVNFVF9FUDsKKwkJCVVEQ19DVFJMX1JFRyA9IGVwLT51ZGMtPmNscl9oYWx0OwogCQkJZXAtPmFja3dhaXQgPSAwOwogCQkJaWYgKCEoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSkgewogCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19TRVRfRklGT19FTjsKQEAgLTEyMzgsNiArMTI3OCw4IEBACiAKIHN0YXRpYyB2b2lkIHB1bGx1cF9lbmFibGUoc3RydWN0IG9tYXBfdWRjICp1ZGMpCiB7CisJdWRjLT5nYWRnZXQuZGV2LnBhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXVkYy0+Z2FkZ2V0LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJVURDX1NZU0NPTjFfUkVHIHw9IFVEQ19QVUxMVVBfRU47CiAjaWZuZGVmIENPTkZJR19VU0JfT1RHCiAJaWYgKCFjcHVfaXNfb21hcDE1eHgoKSkKQEAgLTEzODIsNyArMTQyNCw3IEBACiBzdGF0aWMgdm9pZCBlcDBfaXJxKHN0cnVjdCBvbWFwX3VkYyAqdWRjLCB1MTYgaXJxX3NyYykKIHsKIAlzdHJ1Y3Qgb21hcF9lcAkqZXAwID0gJnVkYy0+ZXBbMF07Ci0Jc3RydWN0IG9tYXBfcmVxCSpyZXEgPSAwOworCXN0cnVjdCBvbWFwX3JlcQkqcmVxID0gTlVMTDsKIAogCWVwMC0+aXJxcysrOwogCkBAIC0xNDM4LDcgKzE0ODAsNyBAQAogCQkJCWlmIChyZXEpCiAJCQkJCWRvbmUoZXAwLCByZXEsIDApOwogCQkJfQotCQkJcmVxID0gMDsKKwkJCXJlcSA9IE5VTEw7CiAJCX0gZWxzZSBpZiAoc3RhdCAmIFVEQ19TVEFMTCkgewogCQkJVURDX0NUUkxfUkVHID0gVURDX0NMUl9IQUxUOwogCQkJVURDX0VQX05VTV9SRUcgPSBVRENfRVBfRElSOwpAQCAtMTUxMSw5ICsxNTUzLDEwIEBACiAJCQl1LndvcmRbM10gPSBVRENfREFUQV9SRUc7CiAJCQlVRENfRVBfTlVNX1JFRyA9IDA7CiAJCX0gd2hpbGUgKFVEQ19JUlFfU1JDX1JFRyAmIFVEQ19TRVRVUCk7Ci0JCWxlMTZfdG9fY3B1cyAoJnUuci53VmFsdWUpOwotCQlsZTE2X3RvX2NwdXMgKCZ1LnIud0luZGV4KTsKLQkJbGUxNl90b19jcHVzICgmdS5yLndMZW5ndGgpOworCisjZGVmaW5lCXdfdmFsdWUJCWxlMTZfdG9fY3B1cCAoJnUuci53VmFsdWUpCisjZGVmaW5lCXdfaW5kZXgJCWxlMTZfdG9fY3B1cCAoJnUuci53SW5kZXgpCisjZGVmaW5lCXdfbGVuZ3RoCWxlMTZfdG9fY3B1cCAoJnUuci53TGVuZ3RoKQogCiAJCS8qIERlbGVnYXRlIGFsbW9zdCBhbGwgY29udHJvbCByZXF1ZXN0cyB0byB0aGUgZ2FkZ2V0IGRyaXZlciwKIAkJICogZXhjZXB0IGZvciBhIGhhbmRmdWwgb2YgY2g5IHN0YXR1cy9mZWF0dXJlIHJlcXVlc3RzIHRoYXQKQEAgLTE1MjksMTEgKzE1NzIsMTEgQEAKIAkJCS8qIHVkYyBuZWVkcyB0byBrbm93IHdoZW4gZXAgIT0gMCBpcyB2YWxpZCAqLwogCQkJaWYgKHUuci5iUmVxdWVzdFR5cGUgIT0gVVNCX1JFQ0lQX0RFVklDRSkKIAkJCQlnb3RvIGRlbGVnYXRlOwotCQkJaWYgKHUuci53TGVuZ3RoICE9IDApCisJCQlpZiAod19sZW5ndGggIT0gMCkKIAkJCQlnb3RvIGRvX3N0YWxsOwogCQkJdWRjLT5lcDBfc2V0X2NvbmZpZyA9IDE7Ci0JCQl1ZGMtPmVwMF9yZXNldF9jb25maWcgPSAodS5yLndWYWx1ZSA9PSAwKTsKLQkJCVZEQkcoInNldCBjb25maWcgJWRcbiIsIHUuci53VmFsdWUpOworCQkJdWRjLT5lcDBfcmVzZXRfY29uZmlnID0gKHdfdmFsdWUgPT0gMCk7CisJCQlWREJHKCJzZXQgY29uZmlnICVkXG4iLCB3X3ZhbHVlKTsKIAogCQkJLyogdXBkYXRlIHVkYyBOT1cgc2luY2UgZ2FkZ2V0IGRyaXZlciBtYXkgc3RhcnQKIAkJCSAqIHF1ZXVlaW5nIHJlcXVlc3RzIGltbWVkaWF0ZWx5OyBjbGVhciBjb25maWcKQEAgLTE1NDksMjMgKzE1OTIsMjggQEAKIAkJCS8qIGNsZWFyIGVuZHBvaW50IGhhbHQgKi8KIAkJCWlmICh1LnIuYlJlcXVlc3RUeXBlICE9IFVTQl9SRUNJUF9FTkRQT0lOVCkKIAkJCQlnb3RvIGRlbGVnYXRlOwotCQkJaWYgKHUuci53VmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQKLQkJCQkJfHwgdS5yLndMZW5ndGggIT0gMCkKKwkJCWlmICh3X3ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUCisJCQkJCXx8IHdfbGVuZ3RoICE9IDApCiAJCQkJZ290byBkb19zdGFsbDsKLQkJCWVwID0gJnVkYy0+ZXBbdS5yLndJbmRleCAmIDB4Zl07CisJCQllcCA9ICZ1ZGMtPmVwW3dfaW5kZXggJiAweGZdOwogCQkJaWYgKGVwICE9IGVwMCkgewotCQkJCWlmICh1LnIud0luZGV4ICYgVVNCX0RJUl9JTikKKwkJCQlpZiAod19pbmRleCAmIFVTQl9ESVJfSU4pCiAJCQkJCWVwICs9IDE2OwogCQkJCWlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MKIAkJCQkJCXx8ICFlcC0+ZGVzYykKIAkJCQkJZ290byBkb19zdGFsbDsKIAkJCQl1c2VfZXAoZXAsIDApOwotCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19SRVNFVF9FUDsKKwkJCQlVRENfQ1RSTF9SRUcgPSB1ZGMtPmNscl9oYWx0OwogCQkJCWVwLT5hY2t3YWl0ID0gMDsKIAkJCQlpZiAoIShlcC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pKSB7CiAJCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19TRVRfRklGT19FTjsKIAkJCQkJZXAtPmFja3dhaXQgPSAxICsgZXAtPmRvdWJsZV9idWY7CiAJCQkJfQorCQkJCS8qIE5PVEU6ICBhc3N1bWVzIHRoZSBob3N0IGJlaGF2ZXMgc2FuZWx5LAorCQkJCSAqIG9ubHkgY2xlYXJpbmcgcmVhbCBoYWx0cy4gIEVsc2Ugd2UgbWF5CisJCQkJICogbmVlZCB0byBraWxsIHBlbmRpbmcgdHJhbnNmZXJzIGFuZCB0aGVuCisJCQkJICogcmVzdGFydCB0aGUgcXVldWUuLi4gdmVyeSBtZXNzeSBmb3IgRE1BIQorCQkJCSAqLwogCQkJfQogCQkJVkRCRygiJXMgaGFsdCBjbGVhcmVkIGJ5IGhvc3RcbiIsIGVwLT5uYW1lKTsKIAkJCWdvdG8gZXAwb3V0X3N0YXR1c19zdGFnZTsKQEAgLTE1NzMsMTEgKzE2MjEsMTEgQEAKIAkJCS8qIHNldCBlbmRwb2ludCBoYWx0ICovCiAJCQlpZiAodS5yLmJSZXF1ZXN0VHlwZSAhPSBVU0JfUkVDSVBfRU5EUE9JTlQpCiAJCQkJZ290byBkZWxlZ2F0ZTsKLQkJCWlmICh1LnIud1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUCi0JCQkJCXx8IHUuci53TGVuZ3RoICE9IDApCisJCQlpZiAod192YWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVAorCQkJCQl8fCB3X2xlbmd0aCAhPSAwKQogCQkJCWdvdG8gZG9fc3RhbGw7Ci0JCQllcCA9ICZ1ZGMtPmVwW3Uuci53SW5kZXggJiAweGZdOwotCQkJaWYgKHUuci53SW5kZXggJiBVU0JfRElSX0lOKQorCQkJZXAgPSAmdWRjLT5lcFt3X2luZGV4ICYgMHhmXTsKKwkJCWlmICh3X2luZGV4ICYgVVNCX0RJUl9JTikKIAkJCQllcCArPSAxNjsKIAkJCWlmIChlcC0+Ym1BdHRyaWJ1dGVzID09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MKIAkJCQkJfHwgZXAgPT0gZXAwIHx8ICFlcC0+ZGVzYykKQEAgLTE2MTUsMTMgKzE2NjMsMTMgQEAKIAkJCVVEQ19DVFJMX1JFRyA9IFVEQ19TRVRfRklGT19FTjsKIAkJCVVEQ19FUF9OVU1fUkVHID0gVURDX0VQX0RJUjsKIAkJCXN0YXR1cyA9IDA7Ci0JCQlWREJHKCJHRVRfU1RBVFVTLCBpbnRlcmZhY2UgJWRcbiIsIHUuci53SW5kZXgpOworCQkJVkRCRygiR0VUX1NUQVRVUywgaW50ZXJmYWNlICVkXG4iLCB3X2luZGV4KTsKIAkJCS8qIG5leHQsIHN0YXR1cyBzdGFnZSAqLwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiBkZWxlZ2F0ZToKIAkJCS8qIGFjdGl2YXRlIHRoZSBlcDBvdXQgZmlmbyByaWdodCBhd2F5ICovCi0JCQlpZiAoIXVkYy0+ZXAwX2luICYmIHUuci53TGVuZ3RoKSB7CisJCQlpZiAoIXVkYy0+ZXAwX2luICYmIHdfbGVuZ3RoKSB7CiAJCQkJVURDX0VQX05VTV9SRUcgPSAwOwogCQkJCVVEQ19DVFJMX1JFRyA9IFVEQ19TRVRfRklGT19FTjsKIAkJCX0KQEAgLTE2MzIsNyArMTY4MCwxMSBAQAogCQkJICovCiAJCQlWREJHKCJTRVRVUCAlMDJ4LiUwMnggdiUwNHggaSUwNHggbCUwNHhcbiIsCiAJCQkJdS5yLmJSZXF1ZXN0VHlwZSwgdS5yLmJSZXF1ZXN0LAotCQkJCXUuci53VmFsdWUsIHUuci53SW5kZXgsIHUuci53TGVuZ3RoKTsKKwkJCQl3X3ZhbHVlLCB3X2luZGV4LCB3X2xlbmd0aCk7CisKKyN1bmRlZgl3X3ZhbHVlCisjdW5kZWYJd19pbmRleAorI3VuZGVmCXdfbGVuZ3RoCiAKIAkJCS8qIFRoZSBnYWRnZXQgZHJpdmVyIG1heSByZXR1cm4gYW4gZXJyb3IgaGVyZSwKIAkJCSAqIGNhdXNpbmcgYW4gaW1tZWRpYXRlIHByb3RvY29sIHN0YWxsLgpAQCAtMjAxMyw3ICsyMDY1LDcgQEAKIAl1ZGMtPnNvZnRjb25uZWN0ID0gMTsKIAogCS8qIGhvb2sgdXAgdGhlIGRyaXZlciAqLwotCWRyaXZlci0+ZHJpdmVyLmJ1cyA9IDA7CisJZHJpdmVyLT5kcml2ZXIuYnVzID0gTlVMTDsKIAl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKIAl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gJmRyaXZlci0+ZHJpdmVyOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwpAQCAtMjAyMSw4ICsyMDczLDggQEAKIAlzdGF0dXMgPSBkcml2ZXItPmJpbmQgKCZ1ZGMtPmdhZGdldCk7CiAJaWYgKHN0YXR1cykgewogCQlEQkcoImJpbmQgdG8gJXMgLS0+ICVkXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lLCBzdGF0dXMpOwotCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gMDsKLQkJdWRjLT5kcml2ZXIgPSAwOworCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKKwkJdWRjLT5kcml2ZXIgPSBOVUxMOwogCQlnb3RvIGRvbmU7CiAJfQogCURCRygiYm91bmQgdG8gZHJpdmVyICVzXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKQEAgLTIwMzUsOCArMjA4Nyw4IEBACiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlFUlIoImNhbid0IGJpbmQgdG8gdHJhbnNjZWl2ZXJcbiIpOwogCQkJZHJpdmVyLT51bmJpbmQgKCZ1ZGMtPmdhZGdldCk7Ci0JCQl1ZGMtPmdhZGdldC5kZXYuZHJpdmVyID0gMDsKLQkJCXVkYy0+ZHJpdmVyID0gMDsKKwkJCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCQkJdWRjLT5kcml2ZXIgPSBOVUxMOwogCQkJZ290byBkb25lOwogCQl9CiAJfSBlbHNlIHsKQEAgLTIwNzEsNyArMjEyMyw3IEBACiAJCW9tYXBfdmJ1c19zZXNzaW9uKCZ1ZGMtPmdhZGdldCwgMCk7CiAKIAlpZiAodWRjLT50cmFuc2NlaXZlcikKLQkJKHZvaWQpIG90Z19zZXRfcGVyaXBoZXJhbCh1ZGMtPnRyYW5zY2VpdmVyLCAwKTsKKwkJKHZvaWQpIG90Z19zZXRfcGVyaXBoZXJhbCh1ZGMtPnRyYW5zY2VpdmVyLCBOVUxMKTsKIAllbHNlCiAJCXB1bGx1cF9kaXNhYmxlKHVkYyk7CiAKQEAgLTIwODAsOSArMjEzMiw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKIAlkcml2ZXItPnVuYmluZCgmdWRjLT5nYWRnZXQpOwotCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSAwOwotCXVkYy0+ZHJpdmVyID0gMDsKLQorCXVkYy0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOworCXVkYy0+ZHJpdmVyID0gTlVMTDsKIAogCURCRygidW5yZWdpc3RlcmVkIGRyaXZlciAnJXMnXG4iLCBkcml2ZXItPmRyaXZlci5uYW1lKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjE3OCwxNCArMjIyOSwxNCBAQAogCiAJdG1wID0gT1RHX1JFVl9SRUc7CiAJdHJhbnMgPSBVU0JfVFJBTlNDRUlWRVJfQ1RSTF9SRUc7Ci0Jc2VxX3ByaW50ZihzLCAiT1RHIHJldiAlZC4lZCwgdHJhbnNjZWl2ZXJfY3RybCAlMDN4XG4iLAorCXNlcV9wcmludGYocywgIlxuT1RHIHJldiAlZC4lZCwgdHJhbnNjZWl2ZXJfY3RybCAlMDV4XG4iLAogCQl0bXAgPj4gNCwgdG1wICYgMHhmLCB0cmFucyk7CiAJdG1wID0gT1RHX1NZU0NPTl8xX1JFRzsKIAlzZXFfcHJpbnRmKHMsICJvdGdfc3lzY29uMSAlMDh4IHVzYjIgJXMsIHVzYjEgJXMsIHVzYjAgJXMsIgogCQkJRk9VUkJJVFMgIlxuIiwgdG1wLAogCQl0cnhfbW9kZShVU0IyX1RSWF9NT0RFKHRtcCksIHRyYW5zICYgQ09ORl9VU0IyX1VOSV9SKSwKIAkJdHJ4X21vZGUoVVNCMV9UUlhfTU9ERSh0bXApLCB0cmFucyAmIENPTkZfVVNCMV9VTklfUiksCi0JCShVU0IwX1RSWF9NT0RFKHRtcCkgPT0gMCkKKwkJKFVTQjBfVFJYX01PREUodG1wKSA9PSAwICYmICFjcHVfaXNfb21hcDE3MTAoKSkKIAkJCT8gImludGVybmFsIgogCQkJOiB0cnhfbW9kZShVU0IwX1RSWF9NT0RFKHRtcCksIDEpLAogCQkodG1wICYgT1RHX0lETEVfRU4pID8gIiAhb3RnIiA6ICIiLApAQCAtMjIzNSw2ICsyMjg2LDcgQEAKIAlzZXFfcHJpbnRmKHMsICJvdGdfb3V0Y3RybCAlMDR4IiAiXG4iLCB0bXApOwogCXRtcCA9IE9UR19URVNUX1JFRzsKIAlzZXFfcHJpbnRmKHMsICJvdGdfdGVzdCAgICAlMDR4IiAiXG4iLCB0bXApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHByb2NfdWRjX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpfKQpAQCAtMjM3OCw3ICsyNDMwLDcgQEAKIAogc3RhdGljIGludCBwcm9jX3VkY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX3VkY19zaG93LCAwKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcHJvY191ZGNfc2hvdywgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb3BzID0gewpAQCAtMjM5OSw3ICsyNDUxLDcgQEAKIAogc3RhdGljIHZvaWQgcmVtb3ZlX3Byb2NfZmlsZSh2b2lkKQogewotCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfZmlsZW5hbWUsIDApOworCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfZmlsZW5hbWUsIE5VTEwpOwogfQogCiAjZWxzZQpAQCAtMjQxNCw2ICsyNDY2LDEwIEBACiAvKiBCZWZvcmUgdGhpcyBjb250cm9sbGVyIGNhbiBlbnVtZXJhdGUsIHdlIG5lZWQgdG8gcGljayBhbiBlbmRwb2ludAogICogY29uZmlndXJhdGlvbiwgb3IgImZpZm9fbW9kZSIgIFRoYXQgaW52b2x2ZXMgYWxsb2NhdGluZyAyS0Igb2YgcGFja2V0CiAgKiBidWZmZXIgc3BhY2UgYW1vbmcgdGhlIGVuZHBvaW50cyB3ZSdsbCBiZSBvcGVyYXRpbmcuCisgKgorICogTk9URTogYXMgb2YgT01BUCAxNzEwIEVTMi4wLCB3cml0aW5nIGEgbmV3IGVuZHBvaW50IGNvbmZpZyB3aGVuCisgKiBVRENfU1lTQ09OXzFfUkVHLkNGR19MT0NLIGlzIHNldCBjYW4gbm93IHdvcmsuICBXZSB3b24ndCB1c2UgdGhhdAorICogY2FwYWJpbGl0eSB5ZXQgdGhvdWdoLgogICovCiBzdGF0aWMgdW5zaWduZWQgX19pbml0CiBvbWFwX2VwX3NldHVwKGNoYXIgKm5hbWUsIHU4IGFkZHIsIHU4IHR5cGUsCkBAIC0yNTA1LDcgKzI1NjEsNyBAQAogewogCWNvbXBsZXRlKHVkYy0+ZG9uZSk7CiAJa2ZyZWUgKHVkYyk7Ci0JdWRjID0gMDsKKwl1ZGMgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IF9faW5pdApAQCAtMjU3NywyMyArMjYzMywzMyBAQAogCWNhc2UgMToKIAkJT01BUF9CVUxLX0VQKCJlcDFpbiIsICBVU0JfRElSX0lOICB8IDEpOwogCQlPTUFQX0JVTEtfRVAoImVwMm91dCIsIFVTQl9ESVJfT1VUIHwgMik7CisJCU9NQVBfSU5UX0VQKCJlcDlpbiIsICAgVVNCX0RJUl9JTiAgfCA5LCAxNik7CisKIAkJT01BUF9CVUxLX0VQKCJlcDNpbiIsICBVU0JfRElSX0lOICB8IDMpOwogCQlPTUFQX0JVTEtfRVAoImVwNG91dCIsIFVTQl9ESVJfT1VUIHwgNCk7CisJCU9NQVBfSU5UX0VQKCJlcDEwaW4iLCAgVVNCX0RJUl9JTiAgfCAxMCwgMTYpOwogCiAJCU9NQVBfQlVMS19FUCgiZXA1aW4iLCAgVVNCX0RJUl9JTiAgfCA1KTsKIAkJT01BUF9CVUxLX0VQKCJlcDVvdXQiLCBVU0JfRElSX09VVCB8IDUpOworCQlPTUFQX0lOVF9FUCgiZXAxMWluIiwgIFVTQl9ESVJfSU4gIHwgMTEsIDE2KTsKKwogCQlPTUFQX0JVTEtfRVAoImVwNmluIiwgIFVTQl9ESVJfSU4gIHwgNik7CiAJCU9NQVBfQlVMS19FUCgiZXA2b3V0IiwgVVNCX0RJUl9PVVQgfCA2KTsKKwkJT01BUF9JTlRfRVAoImVwMTJpbiIsICBVU0JfRElSX0lOICB8IDEyLCAxNik7CiAKIAkJT01BUF9CVUxLX0VQKCJlcDdpbiIsICBVU0JfRElSX0lOICB8IDcpOwogCQlPTUFQX0JVTEtfRVAoImVwN291dCIsIFVTQl9ESVJfT1VUIHwgNyk7CisJCU9NQVBfSU5UX0VQKCJlcDEzaW4iLCAgVVNCX0RJUl9JTiAgfCAxMywgMTYpOworCQlPTUFQX0lOVF9FUCgiZXAxM291dCIsIFVTQl9ESVJfT1VUIHwgMTMsIDE2KTsKKwogCQlPTUFQX0JVTEtfRVAoImVwOGluIiwgIFVTQl9ESVJfSU4gIHwgOCk7CiAJCU9NQVBfQlVMS19FUCgiZXA4b3V0IiwgVVNCX0RJUl9PVVQgfCA4KTsKKwkJT01BUF9JTlRfRVAoImVwMTRpbiIsICBVU0JfRElSX0lOICB8IDE0LCAxNik7CisJCU9NQVBfSU5UX0VQKCJlcDE0b3V0IiwgVVNCX0RJUl9PVVQgfCAxNCwgMTYpOwogCi0JCU9NQVBfSU5UX0VQKCJlcDlpbiIsICAgVVNCX0RJUl9JTiAgfCA5LCAxNik7Ci0JCU9NQVBfSU5UX0VQKCJlcDEwb3V0IiwgVVNCX0RJUl9JTiAgfCAxMCwgMTYpOwotCQlPTUFQX0lOVF9FUCgiZXAxMWluIiwgIFVTQl9ESVJfSU4gIHwgOSwgMTYpOwotCQlPTUFQX0lOVF9FUCgiZXAxMm91dCIsIFVTQl9ESVJfSU4gIHwgMTAsIDE2KTsKKwkJT01BUF9CVUxLX0VQKCJlcDE1aW4iLCAgVVNCX0RJUl9JTiAgfCAxNSk7CisJCU9NQVBfQlVMS19FUCgiZXAxNW91dCIsIFVTQl9ESVJfT1VUIHwgMTUpOworCiAJCWJyZWFrOwogCiAjaWZkZWYJVVNFX0lTTwpAQCAtMjY0MCw4ICsyNzA2LDggQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpvZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJaW50CQkJc3RhdHVzID0gLUVOT0RFVjsKIAlpbnQJCQlobWM7Ci0Jc3RydWN0IG90Z190cmFuc2NlaXZlcgkqeGNlaXYgPSAwOwotCWNvbnN0IGNoYXIJCSp0eXBlID0gMDsKKwlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyCSp4Y2VpdiA9IE5VTEw7CisJY29uc3QgY2hhcgkJKnR5cGUgPSBOVUxMOwogCXN0cnVjdCBvbWFwX3VzYl9jb25maWcJKmNvbmZpZyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAogCS8qIE5PVEU6ICAia25vd3MiIHRoZSBvcmRlciBvZiB0aGUgcmVzb3VyY2VzISAqLwpAQCAtMjY3Niw1NCArMjc0Miw3OCBAQAogCQkJRlVOQ19NVVhfQ1RSTF8wX1JFRyA9IHRtcDsKIAkJfQogCX0gZWxzZSB7CisJCS8qIFRoZSB0cmFuc2NlaXZlciBtYXkgcGFja2FnZSBzb21lIEdQSU8gbG9naWMgb3IgaGFuZGxlCisJCSAqIGxvb3BiYWNrIGFuZC9vciB0cmFuc2NlaXZlcmxlc3Mgc2V0dXA7IGlmIHdlIGZpbmQgb25lLAorCQkgKiB1c2UgaXQuICBFeGNlcHQgZm9yIE9URywgd2UgZG9uJ3QgX25lZWRfIHRvIHRhbGsgdG8gb25lOworCQkgKiBidXQgbm90IGhhdmluZyBvbmUgcHJvYmFibHkgbWVhbnMgbm8gVkJVUyBkZXRlY3Rpb24uCisJCSAqLworCQl4Y2VpdiA9IG90Z19nZXRfdHJhbnNjZWl2ZXIoKTsKKwkJaWYgKHhjZWl2KQorCQkJdHlwZSA9IHhjZWl2LT5sYWJlbDsKKwkJZWxzZSBpZiAoY29uZmlnLT5vdGcpIHsKKwkJCURCRygiT1RHIHJlcXVpcmVzIGV4dGVybmFsIHRyYW5zY2VpdmVyIVxuIik7CisJCQlnb3RvIGNsZWFudXAwOworCQl9CisKIAkJaG1jID0gSE1DXzE2MTA7CiAJCXN3aXRjaCAoaG1jKSB7CisJCWNhc2UgMDoJCQkvKiBQT1dFUlVQIERFRkFVTFQgPT0gMCAqLworCQljYXNlIDQ6CisJCWNhc2UgMTI6CisJCWNhc2UgMjA6CisJCQlpZiAoIWNwdV9pc19vbWFwMTcxMCgpKSB7CisJCQkJdHlwZSA9ICJpbnRlZ3JhdGVkIjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEZBTEwgVEhST1VHSCAqLwogCQljYXNlIDM6CiAJCWNhc2UgMTE6CiAJCWNhc2UgMTY6CiAJCWNhc2UgMTk6CiAJCWNhc2UgMjU6Ci0JCQl4Y2VpdiA9IG90Z19nZXRfdHJhbnNjZWl2ZXIoKTsKIAkJCWlmICgheGNlaXYpIHsKIAkJCQlEQkcoImV4dGVybmFsIHRyYW5zY2VpdmVyIG5vdCByZWdpc3RlcmVkIVxuIik7Ci0JCQkJaWYgKGNvbmZpZy0+b3RnKQotCQkJCQlnb3RvIGNsZWFudXAwOwotCQkJCXR5cGUgPSAiKHVua25vd24gZXh0ZXJuYWwpIjsKLQkJCX0gZWxzZQotCQkJCXR5cGUgPSB4Y2Vpdi0+bGFiZWw7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgkJCS8qIFBPV0VSVVAgREVGQVVMVCA9PSAwICovCi0JCWNhc2UgNDoKLQkJY2FzZSAxMjoKLQkJY2FzZSAyMDoKLQkJCXR5cGUgPSAiSU5URUdSQVRFRCI7CisJCQkJdHlwZSA9ICJ1bmtub3duIjsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIDIxOgkJCS8qIGludGVybmFsIGxvb3BiYWNrICovCi0JCQl0eXBlID0gIihsb29wYmFjaykiOworCQkJdHlwZSA9ICJsb29wYmFjayI7CiAJCQlicmVhazsKIAkJY2FzZSAxNDoJCQkvKiB0cmFuc2NlaXZlcmxlc3MgKi8KLQkJCXR5cGUgPSAiKG5vbmUpIjsKKwkJCWlmIChjcHVfaXNfb21hcDE3MTAoKSkKKwkJCQlnb3RvIGJhZF9vbl8xNzEwOworCQkJLyogRkFMTCBUSFJPVUdIICovCisJCWNhc2UgMTM6CisJCWNhc2UgMTU6CisJCQl0eXBlID0gIm5vIjsKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6CitiYWRfb25fMTcxMDoKIAkJCUVSUigidW5yZWNvZ25pemVkIFVEQyBITUMgbW9kZSAlZFxuIiwgaG1jKTsKLQkJCXJldHVybiAtRU5PREVWOworCQkJZ290byBjbGVhbnVwMDsKIAkJfQogCX0KLQlJTkZPKCJobWMgbW9kZSAlZCwgdHJhbnNjZWl2ZXIgJXNcbiIsIGhtYywgdHlwZSk7CisJSU5GTygiaG1jIG1vZGUgJWQsICVzIHRyYW5zY2VpdmVyXG4iLCBobWMsIHR5cGUpOwogCiAJLyogYSAiZ2FkZ2V0IiBhYnN0cmFjdHMvdmlydHVhbGl6ZXMgdGhlIGNvbnRyb2xsZXIgKi8KIAlzdGF0dXMgPSBvbWFwX3VkY19zZXR1cChvZGV2LCB4Y2Vpdik7CiAJaWYgKHN0YXR1cykgewogCQlnb3RvIGNsZWFudXAwOwogCX0KLQl4Y2VpdiA9IDA7CisJeGNlaXYgPSBOVUxMOwogCS8vICJ1ZGMiIGlzIG5vdyB2YWxpZAogCXB1bGx1cF9kaXNhYmxlKHVkYyk7CiAjaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQogCXVkYy0+Z2FkZ2V0LmlzX290ZyA9IChjb25maWctPm90ZyAhPSAwKTsKICNlbmRpZgogCisJLyogc3RhcnRpbmcgd2l0aCBvbWFwMTcxMCBlczIuMCwgY2xlYXIgdG9nZ2xlIGlzIGEgc2VwYXJhdGUgYml0ICovCisJaWYgKFVEQ19SRVZfUkVHID49IDB4NjEpCisJCXVkYy0+Y2xyX2hhbHQgPSBVRENfUkVTRVRfRVAgfCBVRENfQ0xSREFUQV9UT0dHTEU7CisJZWxzZQorCQl1ZGMtPmNscl9oYWx0ID0gVURDX1JFU0VUX0VQOworCiAJLyogVVNCIGdlbmVyYWwgcHVycG9zZSBJUlE6ICBlcDAsIHN0YXRlIGNoYW5nZXMsIGRtYSwgZXRjICovCiAJc3RhdHVzID0gcmVxdWVzdF9pcnEob2Rldi0+cmVzb3VyY2VbMV0uc3RhcnQsIG9tYXBfdWRjX2lycSwKIAkJCVNBX1NBTVBMRV9SQU5ET00sIGRyaXZlcl9uYW1lLCB1ZGMpOwpAQCAtMjc2NSw3ICsyODU1LDcgQEAKIAogY2xlYW51cDE6CiAJa2ZyZWUgKHVkYyk7Ci0JdWRjID0gMDsKKwl1ZGMgPSBOVUxMOwogCiBjbGVhbnVwMDoKIAlpZiAoeGNlaXYpCkBAIC0yNzg4LDcgKzI4NzgsNyBAQAogCXB1bGx1cF9kaXNhYmxlKHVkYyk7CiAJaWYgKHVkYy0+dHJhbnNjZWl2ZXIpIHsKIAkJcHV0X2RldmljZSh1ZGMtPnRyYW5zY2VpdmVyLT5kZXYpOwotCQl1ZGMtPnRyYW5zY2VpdmVyID0gMDsKKwkJdWRjLT50cmFuc2NlaXZlciA9IE5VTEw7CiAJfQogCVVEQ19TWVNDT04xX1JFRyA9IDA7CiAKQEAgLTI4MDksMTMgKzI4OTksMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvbWFwX3VkY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCB1MzIgbGV2ZWwpCi17Ci0JaWYgKGxldmVsICE9IDApCi0JCXJldHVybiAwOworLyogc3VzcGVuZC9yZXN1bWUvd2FrZXVwIGZyb20gc3lzZnMgKGVjaG8gPiBwb3dlci9zdGF0ZSkgb3Igd2hlbiB0aGUKKyAqIHN5c3RlbSBpcyBmb3JjZWQgaW50byBkZWVwIHNsZWVwCisgKgorICogUkVWSVNJVCB3ZSBzaG91bGQgcHJvYmFibHkgcmVqZWN0IHN1c3BlbmQgcmVxdWVzdHMgd2hlbiB0aGVyZSdzIGEgaG9zdAorICogc2Vzc2lvbiBhY3RpdmUsIHJhdGhlciB0aGFuIGRpc2Nvbm5lY3RpbmcsIGF0IGxlYXN0IG9uIGJvYXJkcyB0aGF0IGNhbgorICogcmVwb3J0IFZCVVMgaXJxcyAoVURDX0RFVlNUQVRfUkVHLlVEQ19BVFQpLiAgQW5kIGluIGFueSBjYXNlLCB3ZSBuZWVkIHRvCisgKiBtYWtlIGhvc3QgcmVzdW1lcyBhbmQgVkJVUyBkZXRlY3Rpb24gdHJpZ2dlciBPTUFQIHdha2V1cCBldmVudHM7IHRoYXQKKyAqIG1heSBpbnZvbHZlIHRhbGtpbmcgdG8gYW4gZXh0ZXJuYWwgdHJhbnNjZWl2ZXIgKGUuZy4gaXNwMTMwMSkuCisgKi8KIAotCURCRygic3VzcGVuZCwgc3RhdGUgJWRcbiIsIHN0YXRlKTsKLQlvbWFwX3B1bGx1cCgmdWRjLT5nYWRnZXQsIDApOworc3RhdGljIGludCBvbWFwX3VkY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UsIHUzMiBsZXZlbCkKK3sKKwl1MzIJZGV2c3RhdDsKKworCWlmIChsZXZlbCAhPSBTVVNQRU5EX1BPV0VSX0RPV04pCisJCXJldHVybiAwOworCWRldnN0YXQgPSBVRENfREVWU1RBVF9SRUc7CisKKwkvKiB3ZSdyZSByZXF1ZXN0aW5nIDQ4IE1IeiBjbG9jayBpZiB0aGUgcHVsbHVwIGlzIGVuYWJsZWQKKwkgKiAoPT0gd2UncmUgYXR0YWNoZWQgdG8gdGhlIGhvc3QpIGFuZCB3ZSdyZSBub3Qgc3VzcGVuZGVkLAorCSAqIHdoaWNoIHdvdWxkIHByZXZlbnQgZW50cnkgdG8gZGVlcCBzbGVlcC4uLgorCSAqLworCWlmICgoZGV2c3RhdCAmIFVEQ19BVFQpICE9IDAgJiYgKGRldnN0YXQgJiBVRENfU1VTKSA9PSAwKSB7CisJCVdBUk4oInNlc3Npb24gYWN0aXZlOyBzdXNwZW5kIHJlcXVpcmVzIGRpc2Nvbm5lY3RcbiIpOworCQlvbWFwX3B1bGx1cCgmdWRjLT5nYWRnZXQsIDApOworCX0KKwogCXVkYy0+Z2FkZ2V0LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAl1ZGMtPmdhZGdldC5kZXYucGFyZW50LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKIAlyZXR1cm4gMDsKQEAgLTI4MjMsMTIgKzI5MzMsMTAgQEAKIAogc3RhdGljIGludCBvbWFwX3VkY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbGV2ZWwpCiB7Ci0JaWYgKGxldmVsICE9IDApCisJaWYgKGxldmVsICE9IFJFU1VNRV9QT1dFUl9PTikKIAkJcmV0dXJuIDA7CiAKIAlEQkcoInJlc3VtZSArIHdha2V1cC9TUlBcbiIpOwotCXVkYy0+Z2FkZ2V0LmRldi5wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1ZGMtPmdhZGdldC5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCW9tYXBfcHVsbHVwKCZ1ZGMtPmdhZGdldCwgMSk7CiAKIAkvKiBtYXliZSB0aGUgaG9zdCB3b3VsZCBlbnVtZXJhdGUgdXMgaWYgd2UgbnVkZ2VkIGl0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvb21hcF91ZGMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5oCmluZGV4IGM5ZTY4NTQuLjY1MmVlNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5oCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lCVVEQ19DVFJMX1JFRwkJCVVEQ19SRUcoMHgwQykJLyogRW5kcG9pbnQgY29udHJvbCAqLwogIwlkZWZpbmUJVURDX0NMUl9IQUxUCQkoMSA8PCA3KQogIwlkZWZpbmUJVURDX1NFVF9IQUxUCQkoMSA8PCA2KQorIwlkZWZpbmUJVURDX0NMUkRBVEFfVE9HR0xFCSgxIDw8IDMpCiAjCWRlZmluZQlVRENfU0VUX0ZJRk9fRU4JCSgxIDw8IDIpCiAjCWRlZmluZQlVRENfQ0xSX0VQCQkoMSA8PCAxKQogIwlkZWZpbmUJVURDX1JFU0VUX0VQCQkoMSA8PCAwKQpAQCAtOTksNiArMTAwLDcgQEAKIAogLyogRE1BIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzOiAgdXAgdG8gdGhyZWUgY2hhbm5lbHMgaW4gZWFjaCBkaXJlY3Rpb24uICAqLwogI2RlZmluZQlVRENfUlhETUFfQ0ZHX1JFRwkJVURDX1JFRygweDQwKQkvKiAzIGVwcyBmb3IgUlggRE1BICovCisjCWRlZmluZQlVRENfRE1BX1JFUQkJKDEgPDwgMTIpCiAjZGVmaW5lCVVEQ19UWERNQV9DRkdfUkVHCQlVRENfUkVHKDB4NDQpCS8qIDMgZXBzIGZvciBUWCBETUEgKi8KICNkZWZpbmUJVURDX0RBVEFfRE1BX1JFRwkJVURDX1JFRygweDQ4KQkvKiByeC90eCBmaWZvIGFkZHIgKi8KIApAQCAtMTYyLDYgKzE2NCw3IEBACiAJc3BpbmxvY2tfdAkJCWxvY2s7CiAJc3RydWN0IG9tYXBfZXAJCQllcFszMl07CiAJdTE2CQkJCWRldnN0YXQ7CisJdTE2CQkJCWNscl9oYWx0OwogCXN0cnVjdCBvdGdfdHJhbnNjZWl2ZXIJCSp0cmFuc2NlaXZlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlpc287CiAJdW5zaWduZWQJCQlzb2Z0Y29ubmVjdDoxOwpAQCAtMTcxLDcgKzE3NCw2IEBACiAJdW5zaWduZWQJCQllcDBfc2V0X2NvbmZpZzoxOwogCXVuc2lnbmVkCQkJZXAwX3Jlc2V0X2NvbmZpZzoxOwogCXVuc2lnbmVkCQkJZXAwX3NldHVwOjE7Ci0KIAlzdHJ1Y3QgY29tcGxldGlvbgkJKmRvbmU7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwppbmRleCBiOGI0NTI0Li4xNTA3NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogbGludXgvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwotICogSW50ZWwgUFhBMnh4IGFuZCBJWFA0eHggb24tY2hpcCBmdWxsIHNwZWVkIFVTQiBkZXZpY2UgY29udHJvbGxlcnMKKyAqIEludGVsIFBYQTI1eCBhbmQgSVhQNHh4IG9uLWNoaXAgZnVsbCBzcGVlZCBVU0IgZGV2aWNlIGNvbnRyb2xsZXJzCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyIEludHJpbnN5YywgSW5jLiAoRnJhbmsgQmVja2VyKQogICogQ29weXJpZ2h0IChDKSAyMDAzIFJvYmVydCBTY2h3ZWJlbCwgUGVuZ3V0cm9uaXgKQEAgLTYzLDcgKzYzLDcgQEAKIAogCiAvKgotICogVGhpcyBkcml2ZXIgaGFuZGxlcyB0aGUgVVNCIERldmljZSBDb250cm9sbGVyIChVREMpIGluIEludGVsJ3MgUFhBIDJ4eAorICogVGhpcyBkcml2ZXIgaGFuZGxlcyB0aGUgVVNCIERldmljZSBDb250cm9sbGVyIChVREMpIGluIEludGVsJ3MgUFhBIDI1eAogICogc2VyaWVzIHByb2Nlc3NvcnMuICBUaGUgVURDIGZvciB0aGUgSVhQIDR4eCBzZXJpZXMgaXMgdmVyeSBzaW1pbGFyLgogICogVGhlcmUgYXJlIGZpZnRlZW4gZW5kcG9pbnRzLCBpbiBhZGRpdGlvbiB0byBlcDAuCiAgKgpAQCAtNzksOCArNzksOCBAQAogICogcHhhMjUwIGEwL2ExIGIwL2IxL2IyIHN1cmUgYWN0IGxpa2UgdGhleSdyZSBzdGlsbCB0aGVyZS4KICAqLwogCi0jZGVmaW5lCURSSVZFUl9WRVJTSU9OCSIxNC1EZWMtMjAwMyIKLSNkZWZpbmUJRFJJVkVSX0RFU0MJIlBYQSAyeHggVVNCIERldmljZSBDb250cm9sbGVyIGRyaXZlciIKKyNkZWZpbmUJRFJJVkVSX1ZFUlNJT04JIjQtTWF5LTIwMDUiCisjZGVmaW5lCURSSVZFUl9ERVNDCSJQWEEgMjV4IFVTQiBEZXZpY2UgQ29udHJvbGxlciBkcml2ZXIiCiAKIAogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWUgW10gPSAicHhhMnh4X3VkYyI7CkBAIC0yOTAsNiArMjkwLDcgQEAKIHN0YXRpYyBpbnQgcHhhMnh4X2VwX2Rpc2FibGUgKHN0cnVjdCB1c2JfZXAgKl9lcCkKIHsKIAlzdHJ1Y3QgcHhhMnh4X2VwCSplcDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAogCWVwID0gY29udGFpbmVyX29mIChfZXAsIHN0cnVjdCBweGEyeHhfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCAhZXAtPmRlc2MpIHsKQEAgLTI5Nyw2ICsyOTgsOCBAQAogCQkJX2VwID8gZXAtPmVwLm5hbWUgOiBOVUxMKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwogCW51a2UgKGVwLCAtRVNIVVRET1dOKTsKIAogI2lmZGVmCVVTRV9ETUEKQEAgLTMxMyw2ICszMTYsNyBAQAogCWVwLT5kZXNjID0gTlVMTDsKIAllcC0+c3RvcHBlZCA9IDE7CiAKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJREJHKERCR19WRVJCT1NFLCAiJXMgZGlzYWJsZWRcbiIsIF9lcC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMjgsNyArMzMyLDcgQEAKICAqIAlweGEyeHhfZXBfYWxsb2NfcmVxdWVzdCAtIGFsbG9jYXRlIGEgcmVxdWVzdCBkYXRhIHN0cnVjdHVyZQogICovCiBzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLXB4YTJ4eF9lcF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICpfZXAsIGludCBnZnBfZmxhZ3MpCitweGEyeHhfZXBfYWxsb2NfcmVxdWVzdCAoc3RydWN0IHVzYl9lcCAqX2VwLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHB4YTJ4eF9yZXF1ZXN0ICpyZXE7CiAKQEAgLTM2Myw3ICszNjcsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqCiBweGEyeHhfZXBfYWxsb2NfYnVmZmVyKHN0cnVjdCB1c2JfZXAgKl9lcCwgdW5zaWduZWQgYnl0ZXMsCi0JZG1hX2FkZHJfdCAqZG1hLCBpbnQgZ2ZwX2ZsYWdzKQorCWRtYV9hZGRyX3QgKmRtYSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCWNoYXIJCQkqcmV0dmFsOwogCkBAIC04NzAsNyArODc0LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIHN0YXRpYyBpbnQKLXB4YTJ4eF9lcF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgaW50IGdmcF9mbGFncykKK3B4YTJ4eF9lcF9xdWV1ZShzdHJ1Y3QgdXNiX2VwICpfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqX3JlcSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBweGEyeHhfcmVxdWVzdAkqcmVxOwogCXN0cnVjdCBweGEyeHhfZXAJKmVwOwpAQCAtOTcxLDEwICs5NzUsMTAgQEAKIAkJCWtpY2tfZG1hKGVwLCByZXEpOwogI2VuZGlmCiAJCS8qIGNhbiB0aGUgRklGTyBjYW4gc2F0aXNmeSB0aGUgcmVxdWVzdCBpbW1lZGlhdGVseT8gKi8KLQkJfSBlbHNlIGlmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAhPSAwCi0JCQkJJiYgKCplcC0+cmVnX3VkY2NzICYgVURDQ1NfQklfVEZTKSAhPSAwCi0JCQkJJiYgd3JpdGVfZmlmbyhlcCwgcmVxKSkgewotCQkJcmVxID0gTlVMTDsKKwkJfSBlbHNlIGlmICgoZXAtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSAhPSAwKSB7CisJCQlpZiAoKCplcC0+cmVnX3VkY2NzICYgVURDQ1NfQklfVEZTKSAhPSAwCisJCQkJCSYmIHdyaXRlX2ZpZm8oZXAsIHJlcSkpCisJCQkJcmVxID0gTlVMTDsKIAkJfSBlbHNlIGlmICgoKmVwLT5yZWdfdWRjY3MgJiBVRENDU19CT19SRlMpICE9IDAKIAkJCQkmJiByZWFkX2ZpZm8oZXAsIHJlcSkpIHsKIAkJCXJlcSA9IE5VTEw7CkBAIC0xMjkwLDcgKzEyOTQsNyBAQAogCQkiJXMgdmVyc2lvbjogJXNcbkdhZGdldCBkcml2ZXI6ICVzXG5Ib3N0ICVzXG5cbiIsCiAJCWRyaXZlcl9uYW1lLCBEUklWRVJfVkVSU0lPTiBTSVpFX1NUUiBETUFTVFIsCiAJCWRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPmRyaXZlci5uYW1lIDogIihub25lKSIsCi0JCWlzX3VzYl9jb25uZWN0ZWQoKSA/ICJmdWxsIHNwZWVkIiA6ICJkaXNjb25uZWN0ZWQiKTsKKwkJaXNfdmJ1c19wcmVzZW50KCkgPyAiZnVsbCBzcGVlZCIgOiAiZGlzY29ubmVjdGVkIik7CiAJc2l6ZSAtPSB0OwogCW5leHQgKz0gdDsKIApAQCAtMTMzOSw3ICsxMzQzLDcgQEAKIAkJbmV4dCArPSB0OwogCX0KIAotCWlmICghaXNfdXNiX2Nvbm5lY3RlZCgpIHx8ICFkZXYtPmRyaXZlcikKKwlpZiAoIWlzX3ZidXNfcHJlc2VudCgpIHx8ICFkZXYtPmRyaXZlcikKIAkJZ290byBkb25lOwogCiAJdCA9IHNjbnByaW50ZihuZXh0LCBzaXplLCAiZXAwIElOICVsdS8lbHUsIE9VVCAlbHUvJWx1XG5pcnFzICVsdVxuXG4iLApAQCAtMTQ1NCw3ICsxNDU4LDcgQEAKIAlVRk5SSCA9IFVGTlJIX1NJTTsKIAogCS8qIGlmIGhhcmR3YXJlIHN1cHBvcnRzIGl0LCBkaXNjb25uZWN0IGZyb20gdXNiICovCi0JbWFrZV91c2JfZGlzYXBwZWFyKCk7CisJcHVsbHVwX29mZigpOwogCiAJdWRjX2NsZWFyX21hc2tfVURDQ1IoVURDQ1JfVURFKTsKIApAQCAtMTU2Nyw3ICsxNTcxLDcgQEAKIAlVSUNSMCAmPSB+VUlDUjBfSU0wOwogCiAJLyogaWYgaGFyZHdhcmUgc3VwcG9ydHMgaXQsIHB1bGx1cCBEKyBhbmQgd2FpdCBmb3IgcmVzZXQgKi8KLQlsZXRfdXNiX2FwcGVhcigpOworCXB1bGx1cF9vbigpOwogfQogCiAKQEAgLTIwNTIsMTAgKzIwNTYsMTAgQEAKIAkJaWYgKHVubGlrZWx5KHVkY2NyICYgVURDQ1JfU1VTSVIpKSB7CiAJCQl1ZGNfYWNrX2ludF9VRENDUihVRENDUl9TVVNJUik7CiAJCQloYW5kbGVkID0gMTsKLQkJCURCRyhEQkdfVkVSQk9TRSwgIlVTQiBzdXNwZW5kJXNcbiIsIGlzX3VzYl9jb25uZWN0ZWQoKQorCQkJREJHKERCR19WRVJCT1NFLCAiVVNCIHN1c3BlbmQlc1xuIiwgaXNfdmJ1c19wcmVzZW50KCkKIAkJCQk/ICIiIDogIitkaXNjb25uZWN0Iik7CiAKLQkJCWlmICghaXNfdXNiX2Nvbm5lY3RlZCgpKQorCQkJaWYgKCFpc192YnVzX3ByZXNlbnQoKSkKIAkJCQlzdG9wX2FjdGl2aXR5KGRldiwgZGV2LT5kcml2ZXIpOwogCQkJZWxzZSBpZiAoZGV2LT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04KIAkJCQkJJiYgZGV2LT5kcml2ZXIKQEAgLTIwNzMsNyArMjA3Nyw3IEBACiAJCQlpZiAoZGV2LT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04KIAkJCQkJJiYgZGV2LT5kcml2ZXIKIAkJCQkJJiYgZGV2LT5kcml2ZXItPnJlc3VtZQotCQkJCQkmJiBpc191c2JfY29ubmVjdGVkKCkpCisJCQkJCSYmIGlzX3ZidXNfcHJlc2VudCgpKQogCQkJCWRldi0+ZHJpdmVyLT5yZXN1bWUoJmRldi0+Z2FkZ2V0KTsKIAkJfQogCkBAIC0yNTA5LDcgKzI1MTMsNyBAQAogCXVkY19kaXNhYmxlKGRldik7CiAJdWRjX3JlaW5pdChkZXYpOwogCi0JZGV2LT52YnVzID0gaXNfdXNiX2Nvbm5lY3RlZCgpOworCWRldi0+dmJ1cyA9IGlzX3ZidXNfcHJlc2VudCgpOwogCiAJLyogaXJxIHNldHVwIGFmdGVyIG9sZCBoYXJkd2FyZSBzdGF0ZSBpcyBjbGVhbmVkIHVwICovCiAJcmV0dmFsID0gcmVxdWVzdF9pcnEoSVJRX1VTQiwgcHhhMnh4X3VkY19pcnEsCkBAIC0yNTU1LDYgKzI1NTksMTIgQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgdm9pZCBweGEyeHhfdWRjX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpCit7CisJcHVsbHVwX29mZigpOworfQorCiBzdGF0aWMgaW50IF9fZXhpdCBweGEyeHhfdWRjX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogewogCXN0cnVjdCBweGEyeHhfdWRjICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CkBAIC0yNjI0LDYgKzI2MzQsNyBAQAogCS5uYW1lCQk9ICJweGEyeHgtdWRjIiwKIAkuYnVzCQk9ICZwbGF0Zm9ybV9idXNfdHlwZSwKIAkucHJvYmUJCT0gcHhhMnh4X3VkY19wcm9iZSwKKwkuc2h1dGRvd24JPSBweGEyeHhfdWRjX3NodXRkb3duLAogCS5yZW1vdmUJCT0gX19leGl0X3AocHhhMnh4X3VkY19yZW1vdmUpLAogCS5zdXNwZW5kCT0gcHhhMnh4X3VkY19zdXNwZW5kLAogCS5yZXN1bWUJCT0gcHhhMnh4X3VkY19yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuaAppbmRleCAxZjNhN2Q5Li5kMGJjMzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmgKQEAgLTE3NywyMyArMTc3LDIzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHhhMnh4X3VkYyAqdGhlX2NvbnRyb2xsZXI7CiAKLS8qIG9uZSBHUElPIHNob3VsZCBiZSB1c2VkIHRvIGRldGVjdCBob3N0IGRpc2Nvbm5lY3QgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlzX3VzYl9jb25uZWN0ZWQodm9pZCkKKy8qIG9uZSBHUElPIHNob3VsZCBiZSB1c2VkIHRvIGRldGVjdCBWQlVTIGZyb20gdGhlIGhvc3QgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3ZidXNfcHJlc2VudCh2b2lkKQogewogCWlmICghdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19pc19jb25uZWN0ZWQpCiAJCXJldHVybiAxOwogCXJldHVybiB0aGVfY29udHJvbGxlci0+bWFjaC0+dWRjX2lzX2Nvbm5lY3RlZCgpOwogfQogCi0vKiBvbmUgR1BJTyBzaG91bGQgZm9yY2UgdGhlIGhvc3QgdG8gc2VlIHRoaXMgZGV2aWNlIChvciBub3QpICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFrZV91c2JfZGlzYXBwZWFyKHZvaWQpCisvKiBvbmUgR1BJTyBzaG91bGQgY29udHJvbCBhIEQrIHB1bGx1cCwgc28gaG9zdCBzZWVzIHRoaXMgZGV2aWNlIChvciBub3QpICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHVsbHVwX29mZih2b2lkKQogewogCWlmICghdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19jb21tYW5kKQogCQlyZXR1cm47CiAJdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19jb21tYW5kKFBYQTJYWF9VRENfQ01EX0RJU0NPTk5FQ1QpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbGV0X3VzYl9hcHBlYXIodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdWxsdXBfb24odm9pZCkKIHsKIAlpZiAoIXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfY29tbWFuZCkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3JuZGlzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYwppbmRleCA3NDU3MjY4Li4wNmI2ZWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuYwpAQCAtNDEsNiArNDEsNyBAQAogCiAKICN1bmRlZglSTkRJU19QTQorI3VuZGVmCVJORElTX1dBS0VVUAogI3VuZGVmCVZFUkJPU0UKIAogI2luY2x1ZGUgInJuZGlzLmgiCkBAIC02MCw3ICs2MSw3IEBACiAJfSB3aGlsZSAoMCkKIHN0YXRpYyBpbnQgcm5kaXNfZGVidWcgPSAwOwogCi1tb2R1bGVfcGFyYW0gKHJuZGlzX2RlYnVnLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSAocm5kaXNfZGVidWcsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDIChybmRpc19kZWJ1ZywgImVuYWJsZSBkZWJ1Z2dpbmciKTsKIAogI2Vsc2UKQEAgLTc4LDIyICs3OSwxMDMgQEAKIHN0YXRpYyBjb25zdCBfX2xlMzIgcm5kaXNfZHJpdmVyX3ZlcnNpb24gPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxKTsKIAogLyogRnVuY3Rpb24gUHJvdG90eXBlcyAqLwotc3RhdGljIGludCBybmRpc19pbml0X3Jlc3BvbnNlIChpbnQgY29uZmlnTnIsIHJuZGlzX2luaXRfbXNnX3R5cGUgKmJ1Zik7Ci1zdGF0aWMgaW50IHJuZGlzX3F1ZXJ5X3Jlc3BvbnNlIChpbnQgY29uZmlnTnIsIHJuZGlzX3F1ZXJ5X21zZ190eXBlICpidWYpOwotc3RhdGljIGludCBybmRpc19zZXRfcmVzcG9uc2UgKGludCBjb25maWdOciwgcm5kaXNfc2V0X21zZ190eXBlICpidWYpOwotc3RhdGljIGludCBybmRpc19yZXNldF9yZXNwb25zZSAoaW50IGNvbmZpZ05yLCBybmRpc19yZXNldF9tc2dfdHlwZSAqYnVmKTsKLXN0YXRpYyBpbnQgcm5kaXNfa2VlcGFsaXZlX3Jlc3BvbnNlIChpbnQgY29uZmlnTnIsIAotCQkJCSAgICAgcm5kaXNfa2VlcGFsaXZlX21zZ190eXBlICpidWYpOwotCiBzdGF0aWMgcm5kaXNfcmVzcF90ICpybmRpc19hZGRfcmVzcG9uc2UgKGludCBjb25maWdOciwgdTMyIGxlbmd0aCk7CiAKIAorLyogc3VwcG9ydGVkIE9JRHMgKi8KK3N0YXRpYyBjb25zdCB1MzIgb2lkX3N1cHBvcnRlZF9saXN0IFtdID0gCit7CisJLyogdGhlIGdlbmVyYWwgc3R1ZmYgKi8KKwlPSURfR0VOX1NVUFBPUlRFRF9MSVNULAorCU9JRF9HRU5fSEFSRFdBUkVfU1RBVFVTLAorCU9JRF9HRU5fTUVESUFfU1VQUE9SVEVELAorCU9JRF9HRU5fTUVESUFfSU5fVVNFLAorCU9JRF9HRU5fTUFYSU1VTV9GUkFNRV9TSVpFLAorCU9JRF9HRU5fTElOS19TUEVFRCwKKwlPSURfR0VOX1RSQU5TTUlUX0JMT0NLX1NJWkUsCisJT0lEX0dFTl9SRUNFSVZFX0JMT0NLX1NJWkUsCisJT0lEX0dFTl9WRU5ET1JfSUQsCisJT0lEX0dFTl9WRU5ET1JfREVTQ1JJUFRJT04sCisJT0lEX0dFTl9WRU5ET1JfRFJJVkVSX1ZFUlNJT04sCisJT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVIsCisJT0lEX0dFTl9NQVhJTVVNX1RPVEFMX1NJWkUsCisJT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVUywKKwlPSURfR0VOX1BIWVNJQ0FMX01FRElVTSwKKyNpZiAwCisJT0lEX0dFTl9STkRJU19DT05GSUdfUEFSQU1FVEVSLAorI2VuZGlmCisJCisJLyogdGhlIHN0YXRpc3RpY2FsIHN0dWZmICovCisJT0lEX0dFTl9YTUlUX09LLAorCU9JRF9HRU5fUkNWX09LLAorCU9JRF9HRU5fWE1JVF9FUlJPUiwKKwlPSURfR0VOX1JDVl9FUlJPUiwKKwlPSURfR0VOX1JDVl9OT19CVUZGRVIsCisjaWZkZWYJUk5ESVNfT1BUSU9OQUxfU1RBVFMKKwlPSURfR0VOX0RJUkVDVEVEX0JZVEVTX1hNSVQsCisJT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfWE1JVCwKKwlPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19YTUlULAorCU9JRF9HRU5fTVVMVElDQVNUX0ZSQU1FU19YTUlULAorCU9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1hNSVQsCisJT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1hNSVQsCisJT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19SQ1YsCisJT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfUkNWLAorCU9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1JDViwKKwlPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWLAorCU9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1JDViwKKwlPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfUkNWLAorCU9JRF9HRU5fUkNWX0NSQ19FUlJPUiwKKwlPSURfR0VOX1RSQU5TTUlUX1FVRVVFX0xFTkdUSCwKKyNlbmRpZgkvKiBSTkRJU19PUFRJT05BTF9TVEFUUyAqLworCisgICAgCS8qIG1hbmRhdG9yeSA4MDIuMyAqLworCS8qIHRoZSBnZW5lcmFsIHN0dWZmICovCisJT0lEXzgwMl8zX1BFUk1BTkVOVF9BRERSRVNTLAorCU9JRF84MDJfM19DVVJSRU5UX0FERFJFU1MsCisJT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNULAorCU9JRF84MDJfM19NQUNfT1BUSU9OUywKKwlPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkUsCisJCisJLyogdGhlIHN0YXRpc3RpY2FsIHN0dWZmICovCisJT0lEXzgwMl8zX1JDVl9FUlJPUl9BTElHTk1FTlQsCisJT0lEXzgwMl8zX1hNSVRfT05FX0NPTExJU0lPTiwKKwlPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlMsCisjaWZkZWYJUk5ESVNfT1BUSU9OQUxfU1RBVFMKKwlPSURfODAyXzNfWE1JVF9ERUZFUlJFRCwKKwlPSURfODAyXzNfWE1JVF9NQVhfQ09MTElTSU9OUywKKwlPSURfODAyXzNfUkNWX09WRVJSVU4sCisJT0lEXzgwMl8zX1hNSVRfVU5ERVJSVU4sCisJT0lEXzgwMl8zX1hNSVRfSEVBUlRCRUFUX0ZBSUxVUkUsCisJT0lEXzgwMl8zX1hNSVRfVElNRVNfQ1JTX0xPU1QsCisJT0lEXzgwMl8zX1hNSVRfTEFURV9DT0xMSVNJT05TLAorI2VuZGlmCS8qIFJORElTX09QVElPTkFMX1NUQVRTICovCisKKyNpZmRlZglSTkRJU19QTQorCS8qIFBNIGFuZCB3YWtldXAgYXJlIG1hbmRhdG9yeSBmb3IgVVNCOiAqLworCisJLyogcG93ZXIgbWFuYWdlbWVudCAqLworCU9JRF9QTlBfQ0FQQUJJTElUSUVTLAorCU9JRF9QTlBfUVVFUllfUE9XRVIsCisJT0lEX1BOUF9TRVRfUE9XRVIsCisKKyNpZmRlZglSTkRJU19XQUtFVVAKKwkvKiB3YWtlIHVwIGhvc3QgKi8KKwlPSURfUE5QX0VOQUJMRV9XQUtFX1VQLAorCU9JRF9QTlBfQUREX1dBS0VfVVBfUEFUVEVSTiwKKwlPSURfUE5QX1JFTU9WRV9XQUtFX1VQX1BBVFRFUk4sCisjZW5kaWYJLyogUk5ESVNfV0FLRVVQICovCisjZW5kaWYJLyogUk5ESVNfUE0gKi8KK307CisKKwogLyogTkRJUyBGdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgZ2VuX25kaXNfcXVlcnlfcmVzcCAoaW50IGNvbmZpZ05yLCB1MzIgT0lELCBybmRpc19yZXNwX3QgKnIpCitzdGF0aWMgaW50CitnZW5fbmRpc19xdWVyeV9yZXNwIChpbnQgY29uZmlnTnIsIHUzMiBPSUQsIHU4ICpidWYsIHVuc2lnbmVkIGJ1Zl9sZW4sCisJCXJuZGlzX3Jlc3BfdCAqcikKIHsKIAlpbnQgCQkJcmV0dmFsID0gLUVOT1RTVVBQOwotCXUzMiAJCQlsZW5ndGggPSAwOwotCV9fbGUzMgkJCSp0bXA7CisJdTMyIAkJCWxlbmd0aCA9IDQ7CS8qIHVzdWFsbHkgKi8KKwlfX2xlMzIJCQkqb3V0YnVmOwogCWludAkJCWksIGNvdW50OwogCXJuZGlzX3F1ZXJ5X2NtcGx0X3R5cGUJKnJlc3A7CiAKQEAgLTEwMSw3ICsxODMsMjIgQEAKIAlyZXNwID0gKHJuZGlzX3F1ZXJ5X2NtcGx0X3R5cGUgKikgci0+YnVmOwogCiAJaWYgKCFyZXNwKSByZXR1cm4gLUVOT01FTTsKLQkKKworCWlmIChidWZfbGVuICYmIHJuZGlzX2RlYnVnID4gMSkgeworCQlERUJVRygicXVlcnkgT0lEICUwOHggdmFsdWUsIGxlbiAlZDpcbiIsIE9JRCwgYnVmX2xlbik7CisJCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpICs9IDE2KSB7CisJCQlERUJVRyAoIiUwM2Q6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2ldKSwKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSZidWZbaSArIDRdKSwKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSZidWZbaSArIDhdKSwKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSZidWZbaSArIDEyXSkpOworCQl9CisJfQorCisJLyogcmVzcG9uc2UgZ29lcyBoZXJlLCByaWdodCBhZnRlciB0aGUgaGVhZGVyICovCisJb3V0YnVmID0gKF9fbGUzMiAqKSAmcmVzcFsxXTsKKwlyZXNwLT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDE2KTsKKwogCXN3aXRjaCAoT0lEKSB7CiAKIAkvKiBnZW5lcmFsIG9pZHMgKHRhYmxlIDQtMSkgKi8KQEAgLTExMSw0MiArMjA4LDM2IEBACiAJCURFQlVHICgiJXM6IE9JRF9HRU5fU1VQUE9SVEVEX0xJU1RcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWxlbmd0aCA9IHNpemVvZiAob2lkX3N1cHBvcnRlZF9saXN0KTsKIAkJY291bnQgID0gbGVuZ3RoIC8gc2l6ZW9mICh1MzIpOwotCQl0bXAgPSAoX19sZTMyICopICgodTggKilyZXNwICsgMjQpOwogCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCXRtcFtpXSA9IGNwdV90b19sZTMyIChvaWRfc3VwcG9ydGVkX2xpc3RbaV0pOworCQkJb3V0YnVmW2ldID0gY3B1X3RvX2xlMzIgKG9pZF9zdXBwb3J0ZWRfbGlzdFtpXSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fSEFSRFdBUkVfU1RBVFVTOgogCQlERUJVRygiJXM6IE9JRF9HRU5fSEFSRFdBUkVfU1RBVFVTXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwogCQkvKiBCb2d1cyBxdWVzdGlvbiEgCiAJCSAqIEhhcmR3YXJlIG11c3QgYmUgcmVhZHkgdG8gcmVjZWl2ZSBoaWdoIGxldmVsIHByb3RvY29scy4KIAkJICogQlRXOiAKIAkJICogcmVkZGl0ZSBlcmdvIHF1YWUgc3VudCBDYWVzYXJpcyBDYWVzYXJpCiAJCSAqIGV0IHF1YWUgc3VudCBEZWkgRGVvIQogCQkgKi8KLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTUVESUFfU1VQUE9SVEVEOgogCQlERUJVRygiJXM6IE9JRF9HRU5fTUVESUFfU1VQUE9SVEVEXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGl1bSk7CisJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0pOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01FRElBX0lOX1VTRToKIAkJREVCVUcoIiVzOiBPSURfR0VOX01FRElBX0lOX1VTRVxuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKIAkJLyogb25lIG1lZGl1bSwgb25lIHRyYW5zcG9ydC4uLiAobWF5YmUgeW91IGRvIGl0IGJldHRlcikgKi8KLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpdW0pOworCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0ubWVkaXVtKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJCQpAQCAtMTU0LDI1ICsyNDUsMjEgQEAKIAljYXNlIE9JRF9HRU5fTUFYSU1VTV9GUkFNRV9TSVpFOgogCQlERUJVRygiJXM6IE9JRF9HRU5fTUFYSU1VTV9GUkFNRV9TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldi0+bXR1KTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTElOS19TUEVFRDoKLS8vCQlERUJVRygiJXM6IE9JRF9HRU5fTElOS19TUEVFRFxuIiwgX19GVU5DVElPTl9fKTsKLQkJbGVuZ3RoID0gNDsKKwkJaWYgKHJuZGlzX2RlYnVnID4gMSkKKwkJCURFQlVHKCIlczogT0lEX0dFTl9MSU5LX1NQRUVEXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5tZWRpYV9zdGF0ZQotCQkJPT0gTkRJU19NRURJQV9TVEFURV9ESVNDT05ORUNURUQpCi0JCSAgICAqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CisJCQkJPT0gTkRJU19NRURJQV9TVEFURV9ESVNDT05ORUNURUQpCisJCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCWVsc2UKLQkJICAgICooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3BlZWQpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKQEAgLTE4MSw4ICsyNjgsNyBAQAogCWNhc2UgT0lEX0dFTl9UUkFOU01JVF9CTE9DS19TSVpFOgogCQlERUJVRygiJXM6IE9JRF9HRU5fVFJBTlNNSVRfQkxPQ0tfU0laRVxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uZGV2KSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYtPm10dSk7CiAJCQlyZXR2YWwgPSAwOwogCQl9CkBAIC0xOTIsOCArMjc4LDcgQEAKIAljYXNlIE9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFOgogCQlERUJVRygiJXM6IE9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldi0+bXR1KTsKIAkJCXJldHZhbCA9IDA7CiAJCX0KQEAgLTIwMiw4ICsyODcsNyBAQAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9WRU5ET1JfSUQ6CiAJCURFQlVHKCIlczogT0lEX0dFTl9WRU5ET1JfSURcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCisJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnZlbmRvcklEKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CkBAIC0yMTIsNTEgKzI5Niw0NCBAQAogCWNhc2UgT0lEX0dFTl9WRU5ET1JfREVTQ1JJUFRJT046CiAJCURFQlVHKCIlczogT0lEX0dFTl9WRU5ET1JfREVTQ1JJUFRJT05cbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWxlbmd0aCA9IHN0cmxlbiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS52ZW5kb3JEZXNjcik7Ci0JCW1lbWNweSAoKHU4ICopIHJlc3AgKyAyNCwgCisJCW1lbWNweSAob3V0YnVmLAogCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS52ZW5kb3JEZXNjciwgbGVuZ3RoKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OOgogCQlERUJVRygiJXM6IE9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwogCQkvKiBDcmVhdGVkIGFzIExFICovCi0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBybmRpc19kcml2ZXJfdmVyc2lvbjsKKwkJKm91dGJ1ZiA9IHJuZGlzX2RyaXZlcl92ZXJzaW9uOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVI6CiAJCURFQlVHKCIlczogT0lEX0dFTl9DVVJSRU5UX1BBQ0tFVF9GSUxURVJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zW2NvbmZpZ05yXS5maWx0ZXIpOworCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKCpybmRpc19wZXJfZGV2X3BhcmFtc1tjb25maWdOcl0uZmlsdGVyKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fTUFYSU1VTV9UT1RBTF9TSVpFOgogCQlERUJVRygiJXM6IE9JRF9HRU5fTUFYSU1VTV9UT1RBTF9TSVpFXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKLQkJCQkJUk5ESVNfTUFYX1RPVEFMX1NJWkUpOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMihSTkRJU19NQVhfVE9UQUxfU0laRSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX01FRElBX0NPTk5FQ1RfU1RBVFVTOgotCQlERUJVRygiJXM6IE9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJaWYgKHJuZGlzX2RlYnVnID4gMSkKKwkJCURFQlVHKCIlczogT0lEX0dFTl9NRURJQV9DT05ORUNUX1NUQVRVU1xuIiwgX19GVU5DVElPTl9fKTsKKwkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCQkubWVkaWFfc3RhdGUpOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAogCWNhc2UgT0lEX0dFTl9QSFlTSUNBTF9NRURJVU06CiAJCURFQlVHKCIlczogT0lEX0dFTl9QSFlTSUNBTF9NRURJVU1cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIApAQCAtMjY2LDggKzM0Myw3IEBACiAJICovCiAJY2FzZSBPSURfR0VOX01BQ19PUFRJT05TOgkJLyogZnJvbSBXaW5NRSAqLwogCQlERUJVRygiJXM6IE9JRF9HRU5fTUFDX09QVElPTlNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKAorCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigKIAkJCSAgTkRJU19NQUNfT1BUSU9OX1JFQ0VJVkVfU0VSSUFMSVpFRAogCQkJfCBORElTX01BQ19PUFRJT05fRlVMTF9EVVBMRVgpOwogCQlyZXR2YWwgPSAwOwpAQCAtMjc3LDYyICszNTMsNDkgQEAKIAogCS8qIG1hbmRhdG9yeSAqLwogCWNhc2UgT0lEX0dFTl9YTUlUX09LOgotCQlERUJVRygiJXM6IE9JRF9HRU5fWE1JVF9PS1xuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKHJuZGlzX2RlYnVnID4gMSkKKwkJCURFQlVHKCIlczogT0lEX0dFTl9YTUlUX09LXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJbGVuZ3RoID0gNDsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKAogCQkJICAgIHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMtPnR4X3BhY2tldHMgLSAKIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT50eF9lcnJvcnMgLQogCQkJICAgIHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMtPnR4X2Ryb3BwZWQpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fUkNWX09LOgotCQlERUJVRygiJXM6IE9JRF9HRU5fUkNWX09LXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAocm5kaXNfZGVidWcgPiAxKQorCQkJREVCVUcoIiVzOiBPSURfR0VOX1JDVl9PS1xuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT5yeF9wYWNrZXRzIC0gCiAJCQkgICAgcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cy0+cnhfZXJyb3JzIC0KIAkJCSAgICBybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzLT5yeF9kcm9wcGVkKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF9HRU5fWE1JVF9FUlJPUjoKLQkJREVCVUcoIiVzOiBPSURfR0VOX1hNSVRfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmIChybmRpc19kZWJ1ZyA+IDEpCisJCQlERUJVRygiJXM6IE9JRF9HRU5fWE1JVF9FUlJPUlxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnR4X2Vycm9ycyk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfR0VOX1JDVl9FUlJPUjoKLQkJREVCVUcoIiVzOiBPSURfR0VOX1JDVl9FUlJPUlxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKHJuZGlzX2RlYnVnID4gMSkKKwkJCURFQlVHKCIlczogT0lEX0dFTl9SQ1ZfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X2Vycm9ycyk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCkBAIC0zNDAsMTMgKzQwMyw5IEBACiAJY2FzZSBPSURfR0VOX1JDVl9OT19CVUZGRVI6CiAJCURFQlVHKCIlczogT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9kcm9wcGVkKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zNTksOCArNDE4LDcgQEAKIAkJICogZGl2aWRlZCBieSB3ZWlnaHQgb2YgQWxwaGEgQ2VudGF1cmkKIAkJICovCiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQlsZW5ndGggPSA0OwotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAoCiAJCQkJKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9wYWNrZXRzIC0gCiAJCQkJIHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KQEAgLTM2OSw5ICs0MjcsNiBAQAogCQkJCQkgLnN0YXRzLT50eF9kcm9wcGVkKQogCQkJCSogMTIzKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKQEAgLTM3OSw4ICs0MzQsNyBAQAogCQlERUJVRygiJXM6IE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCS8qIGRpdG8gKi8KIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCWxlbmd0aCA9IDQ7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyICgKIAkJCQkocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnR4X3BhY2tldHMgLSAKIAkJCQkgcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQpAQCAtMzg5LDE0NCArNDQzLDEwNSBAQAogCQkJCQkgLnN0YXRzLT50eF9kcm9wcGVkKQogCQkJCS8gMTIzKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1hNSVQ6CiAJCURFQlVHKCIlczogT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfWE1JVFxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+bXVsdGljYXN0KjEyMzQpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVQ6CiAJCURFQlVHKCIlczogT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCiAJY2FzZSBPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19YTUlUOgogCQlERUJVRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1hNSVRcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnR4X3BhY2tldHMvNDIqMjU1KTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlUOgogCQlERUJVRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlUXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT50eF9wYWNrZXRzLzQyKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fRElSRUNURURfQllURVNfUkNWOgogCQlERUJVRygiJXM6IE9JRF9HRU5fRElSRUNURURfQllURVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CisJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9ESVJFQ1RFRF9GUkFNRVNfUkNWOgogCQlERUJVRygiJXM6IE9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fTVVMVElDQVNUX0JZVEVTX1JDVjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1ZcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPm11bHRpY2FzdCAqIDExMTEpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1JDVjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5tdWx0aWNhc3QpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9CUk9BRENBU1RfQllURVNfUkNWOgogCQlERUJVRygiJXM6IE9JRF9HRU5fQlJPQURDQVNUX0JZVEVTX1JDVlxuIiwgX19GVU5DVElPTl9fKTsKIAkJaWYgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdHMpIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfcGFja2V0cy80MioyNTUpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDVjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX0JST0FEQ0FTVF9GUkFNRVNfUkNWXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IGNwdV90b19sZTMyICgKLQkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCisJCQkqb3V0YnVmID0gY3B1X3RvX2xlMzIgKHJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KIAkJCQkJLnN0YXRzLT5yeF9wYWNrZXRzLzQyKTsKIAkJCXJldHZhbCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7Ci0JCQlyZXR2YWwgPSAwOwogCQl9CiAJCWJyZWFrOwogCQkKIAljYXNlIE9JRF9HRU5fUkNWX0NSQ19FUlJPUjoKIAkJREVCVUcoIiVzOiBPSURfR0VOX1JDVl9DUkNfRVJST1JcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzKSB7Ci0JCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gY3B1X3RvX2xlMzIgKAotCQkJCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0KKwkJCSpvdXRidWYgPSBjcHVfdG9fbGUzMiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQogCQkJCQkuc3RhdHMtPnJ4X2NyY19lcnJvcnMpOwogCQkJcmV0dmFsID0gMDsKLQkJfSBlbHNlIHsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKLQkJCXJldHZhbCA9IDA7CiAJCX0KIAkJYnJlYWs7CiAJCQogCWNhc2UgT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEg6CiAJCURFQlVHKCIlczogT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEhcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKICNlbmRpZgkvKiBSTkRJU19PUFRJT05BTF9TVEFUUyAqLwpAQCAtNTM4LDEzICs1NTMsMTAgQEAKIAkJREVCVUcoIiVzOiBPSURfODAyXzNfUEVSTUFORU5UX0FERFJFU1NcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCWlmIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgewogCQkJbGVuZ3RoID0gRVRIX0FMRU47Ci0JCQltZW1jcHkgKCh1OCAqKSByZXNwICsgMjQsCisJCQltZW1jcHkgKG91dGJ1ZiwKIAkJCQlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmhvc3RfbWFjLAogCQkJCWxlbmd0aCk7CiAJCQlyZXR2YWwgPSAwOwotCQl9IGVsc2UgewotCQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwotCQkJcmV0dmFsID0gMDsKIAkJfQogCQlicmVhazsKIAkJCkBAIC01NTMsNyArNTY1LDcgQEAKIAkJREVCVUcoIiVzOiBPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5kZXYpIHsKIAkJCWxlbmd0aCA9IEVUSF9BTEVOOwotCQkJbWVtY3B5ICgodTggKikgcmVzcCArIDI0LAorCQkJbWVtY3B5IChvdXRidWYsCiAJCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5ob3N0X21hYywKIAkJCQlsZW5ndGgpOwogCQkJcmV0dmFsID0gMDsKQEAgLTU2MywxOCArNTc1LDE2IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfTVVMVElDQVNUX0xJU1Q6CiAJCURFQlVHKCIlczogT0lEXzgwMl8zX01VTFRJQ0FTVF9MSVNUXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwogCQkvKiBNdWx0aWNhc3QgYmFzZSBhZGRyZXNzIG9ubHkgKi8KLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDB4RTAwMDAwMDApOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMHhFMDAwMDAwMCk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19NQVhJTVVNX0xJU1RfU0laRToKIAkJREVCVUcoIiVzOiBPSURfODAyXzNfTUFYSU1VTV9MSVNUX1NJWkVcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCSBsZW5ndGggPSA0OwogCQkvKiBNdWx0aWNhc3QgYmFzZSBhZGRyZXNzIG9ubHkgKi8KLQkJKigoX19sZTMyICopIHJlc3AgKyA2KSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDEpOworCQkqb3V0YnVmID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMSk7CiAJCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCQkKQEAgLTU4NywxMSArNTk3LDggQEAKIAkvKiBtYW5kYXRvcnkgKi8KIAljYXNlIE9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5UOgogCQlERUJVRygiJXM6IE9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5UXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykKLQkJewotCQkJbGVuZ3RoID0gNDsKLQkJCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBjcHVfdG9fbGUzMiAoCi0JCQkJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXQorCQlpZiAocm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5zdGF0cykgeworCQkJKm91dGJ1ZiA9IGNwdV90b19sZTMyIChybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdCiAJCQkJCS5zdGF0cy0+cnhfZnJhbWVfZXJyb3JzKTsKIAkJCXJldHZhbCA9IDA7CiAJCX0KQEAgLTYwMCwxNiArNjA3LDE0IEBACiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfWE1JVF9PTkVfQ09MTElTSU9OOgogCQlERUJVRygiJXM6IE9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT05cbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWxlbmd0aCA9IDQ7Ci0JCSooKF9fbGUzMiAqKSByZXNwICsgNikgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKKwkJKm91dGJ1ZiA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDApOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKIAkJCiAJLyogbWFuZGF0b3J5ICovCiAJY2FzZSBPSURfODAyXzNfWE1JVF9NT1JFX0NPTExJU0lPTlM6CiAJCURFQlVHKCIlczogT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlsZW5ndGggPSA0OwotCQkqKChfX2xlMzIgKikgcmVzcCArIDYpID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCk7CisJCSpvdXRidWYgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJCQpAQCAtNjU1LDI3ICs2NjAsMTggQEAKIAljYXNlIE9JRF9QTlBfQ0FQQUJJTElUSUVTOgogCQlERUJVRygiJXM6IE9JRF9QTlBfQ0FQQUJJTElUSUVTXG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JCS8qIGp1c3QgUE0sIGFuZCByZW1vdGUgd2FrZXVwIG9uIGxpbmsgc3RhdHVzIGNoYW5nZQotCQkgKiAobm90IG1hZ2ljIHBhY2tldCBvciBwYXR0ZXJuIG1hdGNoKQotCQkgKi8KKwkJLyogZm9yIG5vdywgbm8gd2FrZXVwIGNhcGFiaWxpdGllcyAqLwogCQlsZW5ndGggPSBzaXplb2YgKHN0cnVjdCBORElTX1BOUF9DQVBBQklMSVRJRVMpOwotCQltZW1zZXQgKHJlc3AsIDAsIGxlbmd0aCk7Ci0JCXsKLQkJCXN0cnVjdCBORElTX1BOUF9DQVBBQklMSVRJRVMgKmNhcHMgPSAodm9pZCAqKSByZXNwOwotCi0JCQljYXBzLT5GbGFncyA9IE5ESVNfREVWSUNFX1dBS0VfVVBfRU5BQkxFOwotCQkJY2Fwcy0+V2FrZVVwQ2FwYWJpbGl0aWVzLk1pbkxpbmtDaGFuZ2VXYWtlVXAgCi0JCQkJID0gTmRpc0RldmljZVN0YXRlRDM7Ci0KLQkJCS8qIEZJWE1FIHRoZW4gdXNlIHVzYl9nYWRnZXRfd2FrZXVwKCksIGFuZAotCQkJICogc2V0IFVTQl9DT05GSUdfQVRUX1dBS0VVUCBpbiBjb25maWcgZGVzYwotCQkJICovCi0JCX0KKwkJbWVtc2V0KG91dGJ1ZiwgMCwgbGVuZ3RoKTsKIAkJcmV0dmFsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBPSURfUE5QX1FVRVJZX1BPV0VSOgotCQlERUJVRygiJXM6IE9JRF9QTlBfUVVFUllfUE9XRVJcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCS8qIHN1cmUsIGhhbmRsZSBhbnkgcG93ZXIgc3RhdGUgdGhhdCBtYXBzIHRvIFVTQiBzdXNwZW5kICovCisJCURFQlVHKCIlczogT0lEX1BOUF9RVUVSWV9QT1dFUiBEJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSBidWYpIC0gMSk7CisJCS8qIG9ubHkgc3VzcGVuZCBpcyBhIHJlYWwgcG93ZXIgc3RhdGUsIGFuZAorCQkgKiBpdCBjYW4ndCBiZSBlbnRlcmVkIGJ5IE9JRF9QTlBfU0VUX1BPV0VSLi4uCisJCSAqLworCQlsZW5ndGggPSAwOwogCQlyZXR2YWwgPSAwOwogCQlicmVhazsKICNlbmRpZgpAQCAtNjg0LDExICs2ODAsMTIgQEAKIAkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBxdWVyeSB1bmtub3duIE9JRCAweCUwOFhcbiIsIAogCQkJIF9fRlVOQ1RJT05fXywgT0lEKTsKIAl9CisJaWYgKHJldHZhbCA8IDApCisJCWxlbmd0aCA9IDA7CiAJCi0JcmVzcC0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgxNik7CiAJcmVzcC0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPSBjcHVfdG9fbGUzMiAobGVuZ3RoKTsKLQlyZXNwLT5NZXNzYWdlTGVuZ3RoID0gY3B1X3RvX2xlMzIgKDI0ICsgbGVuZ3RoKTsKLQlyLT5sZW5ndGggPSAyNCArIGxlbmd0aDsKKwlyLT5sZW5ndGggPSBsZW5ndGggKyBzaXplb2YgKnJlc3A7CisJcmVzcC0+TWVzc2FnZUxlbmd0aCA9IGNwdV90b19sZTMyIChyLT5sZW5ndGgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTcwNSw0NSArNzAyLDQwIEBACiAJaWYgKCFyZXNwKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCURFQlVHKCJzZXQgT0lEICUwOHggdmFsdWUsIGxlbiAlZDpcbiIsIE9JRCwgYnVmX2xlbik7Ci0JZm9yIChpID0gMDsgaSA8IGJ1Zl9sZW47IGkgKz0gMTYpIHsKLQkJREVCVUcgKCIlMDNkOiAiCi0JCQkiICUwMnggJTAyeCAlMDJ4ICUwMngiCi0JCQkiICUwMnggJTAyeCAlMDJ4ICUwMngiCi0JCQkiICUwMnggJTAyeCAlMDJ4ICUwMngiCi0JCQkiICUwMnggJTAyeCAlMDJ4ICUwMngiCi0JCQkiXG4iLAotCQkJaSwKLQkJCWJ1ZltpXSwgYnVmIFtpKzFdLAotCQkJCWJ1ZltpKzJdLCBidWZbaSszXSwKLQkJCWJ1ZltpKzRdLCBidWYgW2krNV0sCi0JCQkJYnVmW2krNl0sIGJ1ZltpKzddLAotCQkJYnVmW2krOF0sIGJ1ZiBbaSs5XSwKLQkJCQlidWZbaSsxMF0sIGJ1ZltpKzExXSwKLQkJCWJ1ZltpKzEyXSwgYnVmIFtpKzEzXSwKLQkJCQlidWZbaSsxNF0sIGJ1ZltpKzE1XSk7CisJaWYgKGJ1Zl9sZW4gJiYgcm5kaXNfZGVidWcgPiAxKSB7CisJCURFQlVHKCJzZXQgT0lEICUwOHggdmFsdWUsIGxlbiAlZDpcbiIsIE9JRCwgYnVmX2xlbik7CisJCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpICs9IDE2KSB7CisJCQlERUJVRyAoIiUwM2Q6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGksCisJCQkJbGUzMl90b19jcHVwKChfX2xlMzIgKikmYnVmW2ldKSwKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSZidWZbaSArIDRdKSwKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSZidWZbaSArIDhdKSwKKwkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSZidWZbaSArIDEyXSkpOworCQl9CiAJfQogCisJcGFyYW1zID0gJnJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl07CiAJc3dpdGNoIChPSUQpIHsKIAljYXNlIE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSOgotCQlwYXJhbXMgPSAmcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXTsKLQkJcmV0dmFsID0gMDsKIAotCQkvKiBGSVhNRSB1c2UgdGhlc2UgTkRJU19QQUNLRVRfVFlQRV8qIGJpdGZsYWdzIHRvCi0JCSAqIHNldCB0aGUgY2RjX2ZpbHRlcjsgaXQncyBub3QgUk5ESVMtc3BlY2lmaWMKKwkJLyogdGhlc2UgTkRJU19QQUNLRVRfVFlQRV8qIGJpdGZsYWdzIGFyZSBzaGFyZWQgd2l0aAorCQkgKiBjZGNfZmlsdGVyOyBpdCdzIG5vdCBSTkRJUy1zcGVjaWZpYwogCQkgKiBORElTX1BBQ0tFVF9UWVBFX3ggPT0gVVNCX0NEQ19QQUNLRVRfVFlQRV94IGZvciB4IGluOgogCQkgKglQUk9NSVNDVU9VUywgRElSRUNURUQsCiAJCSAqCU1VTFRJQ0FTVCwgQUxMX01VTFRJQ0FTVCwgQlJPQURDQVNUCiAJCSAqLwotCQlwYXJhbXMtPmZpbHRlciA9IGxlMzJfdG9fY3B1cCgoX19sZTMyICopYnVmKTsKKwkJKnBhcmFtcy0+ZmlsdGVyID0gKHUxNikgbGUzMl90b19jcHVwKChfX2xlMzIgKilidWYpOwogCQlERUJVRygiJXM6IE9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSICUwOHhcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIHBhcmFtcy0+ZmlsdGVyKTsKKwkJCV9fRlVOQ1RJT05fXywgKnBhcmFtcy0+ZmlsdGVyKTsKIAogCQkvKiB0aGlzIGNhbGwgaGFzIGEgc2lnbmlmaWNhbnQgc2lkZSBlZmZlY3Q6ICBpdCdzCiAJCSAqIHdoYXQgbWFrZXMgdGhlIHBhY2tldCBmbG93IHN0YXJ0IGFuZCBzdG9wLCBsaWtlCiAJCSAqIGFjdGl2YXRpbmcgdGhlIENEQyBFdGhlcm5ldCBhbHRzZXR0aW5nLgogCQkgKi8KLQkJaWYgKHBhcmFtcy0+ZmlsdGVyKSB7CisjaWZkZWYJUk5ESVNfUE0KK3VwZGF0ZV9saW5rc3RhdGU6CisjZW5kaWYKKwkJcmV0dmFsID0gMDsKKwkJaWYgKCpwYXJhbXMtPmZpbHRlcikgewogCQkJcGFyYW1zLT5zdGF0ZSA9IFJORElTX0RBVEFfSU5JVElBTElaRUQ7CiAJCQluZXRpZl9jYXJyaWVyX29uKHBhcmFtcy0+ZGV2KTsKIAkJCWlmIChuZXRpZl9ydW5uaW5nKHBhcmFtcy0+ZGV2KSkKQEAgLTc3NiwyMSArNzY4LDM0IEBACiAKICNpZmRlZglSTkRJU19QTQogCWNhc2UgT0lEX1BOUF9TRVRfUE9XRVI6Ci0JCURFQlVHICgiT0lEX1BOUF9TRVRfUE9XRVJcbiIpOwotCQkvKiBzdXJlLCBoYW5kbGUgYW55IHBvd2VyIHN0YXRlIHRoYXQgbWFwcyB0byBVU0Igc3VzcGVuZCAqLwotCQlyZXR2YWwgPSAwOworCQkvKiBUaGUgb25seSByZWFsIHBvd2VyIHN0YXRlIGlzIFVTQiBzdXNwZW5kLCBhbmQgUk5ESVMgcmVxdWVzdHMKKwkJICogY2FuJ3QgZW50ZXIgaXQ7IHRoaXMgb25lIGlzbid0IHJlYWxseSBhYm91dCBwb3dlci4gIEFmdGVyCisJCSAqIHJlc3VtaW5nLCBXaW5kb3dzIGZvcmNlcyBhIHJlc2V0LCBhbmQgdGhlbiBTRVRfUE9XRVIgRDAuCisJCSAqIEZJWE1FIC4uLiB0aGVuIHRoaW5ncyBnbyBiYXR0eTsgV2luZG93cyB3ZWRnZXMgaXRzZWxmLgorCQkgKi8KKwkJaSA9IGxlMzJfdG9fY3B1cCgoX19mb3JjZSBfX2xlMzIgKilidWYpOworCQlERUJVRygiJXM6IE9JRF9QTlBfU0VUX1BPV0VSIEQlZFxuIiwgX19GVU5DVElPTl9fLCBpIC0gMSk7CisJCXN3aXRjaCAoaSkgeworCQljYXNlIE5kaXNEZXZpY2VTdGF0ZUQwOgorCQkJKnBhcmFtcy0+ZmlsdGVyID0gcGFyYW1zLT5zYXZlZF9maWx0ZXI7CisJCQlnb3RvIHVwZGF0ZV9saW5rc3RhdGU7CisJCWNhc2UgTmRpc0RldmljZVN0YXRlRDM6CisJCWNhc2UgTmRpc0RldmljZVN0YXRlRDI6CisJCWNhc2UgTmRpc0RldmljZVN0YXRlRDE6CisJCQlwYXJhbXMtPnNhdmVkX2ZpbHRlciA9ICpwYXJhbXMtPmZpbHRlcjsKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAotCWNhc2UgT0lEX1BOUF9FTkFCTEVfV0FLRV9VUDoKLQkJLyogYWx3YXlzLWNvbm5lY3RlZCAuLi4gKi8KLQkJREVCVUcgKCJPSURfUE5QX0VOQUJMRV9XQUtFX1VQXG4iKTsKLQkJcmV0dmFsID0gMDsKLQkJYnJlYWs7Ci0KLQkvLyBubyBQTSByZXN1bWUgcGF0dGVybnMgc3VwcG9ydGVkIChzcGVjaWZpZWQgd2hlcmU/KQotCS8vIHNvIE9JRF9QTlBfe0FERCxSRU1PVkV9X1dBS0VfVVBfUEFUVEVSTiBhbHdheXMgZmFpbHMKKyNpZmRlZglSTkRJU19XQUtFVVAKKwkvLyBubyB3YWtldXAgc3VwcG9ydCBhZHZlcnRpc2VkLCBzbyB3YWtldXAgT0lEcyBhbHdheXMgZmFpbDoKKwkvLyAgLSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQCisJLy8gIC0gT0lEX1BOUF97QURELFJFTU9WRX1fV0FLRV9VUF9QQVRURVJOCiAjZW5kaWYKIAorI2VuZGlmCS8qIFJORElTX1BNICovCisKIAlkZWZhdWx0OgogCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6IHNldCB1bmtub3duIE9JRCAweCUwOFgsIHNpemUgJWRcbiIsIAogCQkJIF9fRlVOQ1RJT05fXywgT0lELCBidWZfbGVuKTsKQEAgLTgxMSwxMyArODE2LDEwIEBACiAJaWYgKCFybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldikgcmV0dXJuIC1FTk9UU1VQUDsKIAkKIAlyID0gcm5kaXNfYWRkX3Jlc3BvbnNlIChjb25maWdOciwgc2l6ZW9mIChybmRpc19pbml0X2NtcGx0X3R5cGUpKTsKLQkKLQlpZiAoIXIpIHJldHVybiAtRU5PTUVNOwotCQorCWlmICghcikKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmVzcCA9IChybmRpc19pbml0X2NtcGx0X3R5cGUgKikgci0+YnVmOwogCQotCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07Ci0JCiAJcmVzcC0+TWVzc2FnZVR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgKIAkJCVJFTU9URV9ORElTX0lOSVRJQUxJWkVfQ01QTFQpOwogCXJlc3AtPk1lc3NhZ2VMZW5ndGggPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICg1Mik7CkBAIC04NTcsMjAgKzg1OSwyMiBAQAogCSAqIG9pZF9zdXBwb3J0ZWRfbGlzdCBpcyB0aGUgbGFyZ2VzdCBhbnN3ZXIgCiAJICovCiAJciA9IHJuZGlzX2FkZF9yZXNwb25zZSAoY29uZmlnTnIsIHNpemVvZiAob2lkX3N1cHBvcnRlZF9saXN0KSk7Ci0JCi0JaWYgKCFyKSByZXR1cm4gLUVOT01FTTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOwogCXJlc3AgPSAocm5kaXNfcXVlcnlfY21wbHRfdHlwZSAqKSByLT5idWY7CiAJCi0JaWYgKCFyZXNwKSByZXR1cm4gLUVOT01FTTsKLQkKIAlyZXNwLT5NZXNzYWdlVHlwZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKFJFTU9URV9ORElTX1FVRVJZX0NNUExUKTsKLQlyZXNwLT5NZXNzYWdlTGVuZ3RoID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMjQpOwogCXJlc3AtPlJlcXVlc3RJRCA9IGJ1Zi0+UmVxdWVzdElEOyAvKiBTdGlsbCBMRSBpbiBtc2cgYnVmZmVyICovCi0JCi0JaWYgKGdlbl9uZGlzX3F1ZXJ5X3Jlc3AgKGNvbmZpZ05yLCBsZTMyX3RvX2NwdSAoYnVmLT5PSUQpLCByKSkgeworICAJCisJaWYgKGdlbl9uZGlzX3F1ZXJ5X3Jlc3AgKGNvbmZpZ05yLCBsZTMyX3RvX2NwdSAoYnVmLT5PSUQpLAorCQkJbGUzMl90b19jcHUoYnVmLT5JbmZvcm1hdGlvbkJ1ZmZlck9mZnNldCkKKwkJCQkJKyA4ICsgKHU4ICopIGJ1ZiwKKwkJCWxlMzJfdG9fY3B1KGJ1Zi0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGgpLAorCQkJcikpIHsKIAkJLyogT0lEIG5vdCBzdXBwb3J0ZWQgKi8KIAkJcmVzcC0+U3RhdHVzID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoCiAJCQkJUk5ESVNfU1RBVFVTX05PVF9TVVBQT1JURUQpOworCQlyZXNwLT5NZXNzYWdlTGVuZ3RoID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoc2l6ZW9mICpyZXNwKTsKIAkJcmVzcC0+SW5mb3JtYXRpb25CdWZmZXJMZW5ndGggPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAkJcmVzcC0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgwKTsKIAl9IGVsc2UKQEAgLTg4OSwxMCArODkzLDkgQEAKIAlybmRpc19yZXNwX3QJCSpyOwogCQogCXIgPSBybmRpc19hZGRfcmVzcG9uc2UgKGNvbmZpZ05yLCBzaXplb2YgKHJuZGlzX3NldF9jbXBsdF90eXBlKSk7Ci0JCi0JaWYgKCFyKSByZXR1cm4gLUVOT01FTTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOwogCXJlc3AgPSAocm5kaXNfc2V0X2NtcGx0X3R5cGUgKikgci0+YnVmOwotCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07CiAKIAlCdWZMZW5ndGggPSBsZTMyX3RvX2NwdSAoYnVmLT5JbmZvcm1hdGlvbkJ1ZmZlckxlbmd0aCk7CiAJQnVmT2Zmc2V0ID0gbGUzMl90b19jcHUgKGJ1Zi0+SW5mb3JtYXRpb25CdWZmZXJPZmZzZXQpOwpAQCAtOTMwLDEwICs5MzMsOSBAQAogCXJuZGlzX3Jlc3BfdAkJKnI7CiAJCiAJciA9IHJuZGlzX2FkZF9yZXNwb25zZSAoY29uZmlnTnIsIHNpemVvZiAocm5kaXNfcmVzZXRfY21wbHRfdHlwZSkpOwotCQotCWlmICghcikgcmV0dXJuIC1FTk9NRU07CisJaWYgKCFyKQorCQlyZXR1cm4gLUVOT01FTTsKIAlyZXNwID0gKHJuZGlzX3Jlc2V0X2NtcGx0X3R5cGUgKikgci0+YnVmOwotCWlmICghcmVzcCkgcmV0dXJuIC1FTk9NRU07CiAJCiAJcmVzcC0+TWVzc2FnZVR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyIChSRU1PVEVfTkRJU19SRVNFVF9DTVBMVCk7CiAJcmVzcC0+TWVzc2FnZUxlbmd0aCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDE2KTsKQEAgLTk1Nyw4ICs5NTksOSBAQAogCS8qIGhvc3QgInNob3VsZCIgY2hlY2sgb25seSBpbiBSTkRJU19EQVRBX0lOSVRJQUxJWkVEIHN0YXRlICovCiAKIAlyID0gcm5kaXNfYWRkX3Jlc3BvbnNlIChjb25maWdOciwgc2l6ZW9mIChybmRpc19rZWVwYWxpdmVfY21wbHRfdHlwZSkpOworCWlmICghcikKKwkJcmV0dXJuIC1FTk9NRU07CiAJcmVzcCA9IChybmRpc19rZWVwYWxpdmVfY21wbHRfdHlwZSAqKSByLT5idWY7Ci0JaWYgKCFyZXNwKSByZXR1cm4gLUVOT01FTTsKIAkJCiAJcmVzcC0+TWVzc2FnZVR5cGUgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyICgKIAkJCVJFTU9URV9ORElTX0tFRVBBTElWRV9DTVBMVCk7CkBAIC05ODcsMTAgKzk5MCw5IEBACiAJCiAJciA9IHJuZGlzX2FkZF9yZXNwb25zZSAoY29uZmlnTnIsIAogCQkJCXNpemVvZiAocm5kaXNfaW5kaWNhdGVfc3RhdHVzX21zZ190eXBlKSk7Ci0JaWYgKCFyKSByZXR1cm4gLUVOT01FTTsKLQkKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PTUVNOwogCXJlc3AgPSAocm5kaXNfaW5kaWNhdGVfc3RhdHVzX21zZ190eXBlICopIHItPmJ1ZjsKLQlpZiAoIXJlc3ApIHJldHVybiAtRU5PTUVNOwogCQogCXJlc3AtPk1lc3NhZ2VUeXBlID0gX19jb25zdGFudF9jcHVfdG9fbGUzMiAoCiAJCQlSRU1PVEVfTkRJU19JTkRJQ0FURV9TVEFUVVNfTVNHKTsKQEAgLTEwMjEsNiArMTAyMywyMSBAQAogCQkJCQkgIFJORElTX1NUQVRVU19NRURJQV9ESVNDT05ORUNUKTsKIH0KIAordm9pZCBybmRpc191bmluaXQgKGludCBjb25maWdOcikKK3sKKwl1OCAqYnVmOworCXUzMiBsZW5ndGg7CisKKwlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpCisJCXJldHVybjsKKwlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnVzZWQgPSAwOworCXJuZGlzX3Blcl9kZXZfcGFyYW1zIFtjb25maWdOcl0uc3RhdGUgPSBSTkRJU19VTklOSVRJQUxJWkVEOworCisJLyogZHJhaW4gdGhlIHJlc3BvbnNlIHF1ZXVlICovCisJd2hpbGUgKChidWYgPSBybmRpc19nZXRfbmV4dF9yZXNwb25zZShjb25maWdOciwgJmxlbmd0aCkpKQorCQlybmRpc19mcmVlX3Jlc3BvbnNlKGNvbmZpZ05yLCBidWYpOworfQorCiB2b2lkIHJuZGlzX3NldF9ob3N0X21hYyAoaW50IGNvbmZpZ05yLCBjb25zdCB1OCAqYWRkcikKIHsKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmhvc3RfbWFjID0gYWRkcjsKQEAgLTEwNDYsOSArMTA2MywxMyBAQAogCQlyZXR1cm4gLUVOT1RTVVBQOwogCXBhcmFtcyA9ICZybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdOwogCQorCS8qIE5PVEU6IFJORElTIGlzICpFWFRSRU1FTFkqIGNoYXR0eSAuLi4gV2luZG93cyBjb25zdGFudGx5IHBvbGxzIGZvcgorCSAqIHJ4L3R4IHN0YXRpc3RpY3MgYW5kIGxpbmsgc3RhdHVzLCBpbiBhZGRpdGlvbiB0byBLRUVQQUxJVkUgdHJhZmZpYworCSAqIGFuZCBub3JtYWwgSEMgbGV2ZWwgcG9sbGluZyB0byBzZWUgaWYgdGhlcmUncyBhbnkgSU4gdHJhZmZpYy4KKwkgKi8KKwogCS8qIEZvciBVU0I6IHJlc3BvbnNlcyBtYXkgdGFrZSB1cCB0byAxMCBzZWNvbmRzICovCi0Jc3dpdGNoIChNc2dUeXBlKQotCXsKKwlzd2l0Y2ggKE1zZ1R5cGUpIHsKIAljYXNlIFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHOgogCQlERUJVRygiJXM6IFJFTU9URV9ORElTX0lOSVRJQUxJWkVfTVNHXG4iLCAKIAkJCV9fRlVOQ1RJT05fXyApOwpAQCAtMTA4MiwxMCArMTEwMyw5IEBACiAKIAljYXNlIFJFTU9URV9ORElTX0tFRVBBTElWRV9NU0c6CiAJCS8qIEZvciBVU0I6IGhvc3QgZG9lcyB0aGlzIGV2ZXJ5IDUgc2Vjb25kcyAqLwotI2lmZGVmCVZFUkJPU0UKLQkJREVCVUcoIiVzOiBSRU1PVEVfTkRJU19LRUVQQUxJVkVfTVNHXG4iLCAKLQkJCV9fRlVOQ1RJT05fXyApOwotI2VuZGlmCisJCWlmIChybmRpc19kZWJ1ZyA+IDEpCisJCQlERUJVRygiJXM6IFJFTU9URV9ORElTX0tFRVBBTElWRV9NU0dcbiIsIAorCQkJCV9fRlVOQ1RJT05fXyApOwogCQlyZXR1cm4gcm5kaXNfa2VlcGFsaXZlX3Jlc3BvbnNlIChjb25maWdOciwKIAkJCQkJCSAocm5kaXNfa2VlcGFsaXZlX21zZ190eXBlICopIAogCQkJCQkJIGJ1Zik7CkBAIC0xMTUyLDcgKzExNzIsOCBAQAogfQogCiBpbnQgcm5kaXNfc2V0X3BhcmFtX2RldiAodTggY29uZmlnTnIsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIAotCQkJIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cykKKwkJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMsCisJCQkgdTE2ICpjZGNfZmlsdGVyKQogewogCURFQlVHKCIlczpcbiIsIF9fRlVOQ1RJT05fXyApOwogCWlmICghZGV2IHx8ICFzdGF0cykgcmV0dXJuIC0xOwpAQCAtMTE2MCw2ICsxMTgxLDcgQEAKIAkKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLmRldiA9IGRldjsKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLnN0YXRzID0gc3RhdHM7CisJcm5kaXNfcGVyX2Rldl9wYXJhbXMgW2NvbmZpZ05yXS5maWx0ZXIgPSBjZGNfZmlsdGVyOwogCQogCXJldHVybiAwOwogfQpAQCAtMTE3OCw3ICsxMjAwLDcgQEAKIAogaW50IHJuZGlzX3NldF9wYXJhbV9tZWRpdW0gKHU4IGNvbmZpZ05yLCB1MzIgbWVkaXVtLCB1MzIgc3BlZWQpCiB7Ci0JREVCVUcoIiVzOlxuIiwgX19GVU5DVElPTl9fICk7CisJREVCVUcoIiVzOiAldSAldVxuIiwgX19GVU5DVElPTl9fLCBtZWRpdW0sIHNwZWVkKTsKIAlpZiAoY29uZmlnTnIgPj0gUk5ESVNfTUFYX0NPTkZJR1MpIHJldHVybiAtMTsKIAkKIAlybmRpc19wZXJfZGV2X3BhcmFtcyBbY29uZmlnTnJdLm1lZGl1bSA9IG1lZGl1bTsKQEAgLTEyNDIsNiArMTI2NCw3IEBACiB7CiAJcm5kaXNfcmVzcF90CSpyOwogCQorCS8qIE5PVEU6ICB0aGlzIGdldHMgY29waWVkIGludG8gZXRoZXIuYyBVU0JfQlVGU0laIGJ5dGVzIC4uLiAqLwogCXIgPSBrbWFsbG9jIChzaXplb2YgKHJuZGlzX3Jlc3BfdCkgKyBsZW5ndGgsIEdGUF9BVE9NSUMpOwogCWlmICghcikgcmV0dXJuIE5VTEw7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcm5kaXMuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5oCmluZGV4IDJiNWI1NWQuLjk1YjRjNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ybmRpcy5oCkBAIC02OSw5MCArNjksNiBAQAogI2RlZmluZSBPSURfUE5QX0VOQUJMRV9XQUtFX1VQCQkJMHhGRDAxMDEwNgogCiAKLS8qIHN1cHBvcnRlZCBPSURzICovCi1zdGF0aWMgY29uc3QgdTMyIG9pZF9zdXBwb3J0ZWRfbGlzdCBbXSA9IAotewotCS8qIHRoZSBnZW5lcmFsIHN0dWZmICovCi0JT0lEX0dFTl9TVVBQT1JURURfTElTVCwKLQlPSURfR0VOX0hBUkRXQVJFX1NUQVRVUywKLQlPSURfR0VOX01FRElBX1NVUFBPUlRFRCwKLQlPSURfR0VOX01FRElBX0lOX1VTRSwKLQlPSURfR0VOX01BWElNVU1fRlJBTUVfU0laRSwKLQlPSURfR0VOX0xJTktfU1BFRUQsCi0JT0lEX0dFTl9UUkFOU01JVF9CTE9DS19TSVpFLAotCU9JRF9HRU5fUkVDRUlWRV9CTE9DS19TSVpFLAotCU9JRF9HRU5fVkVORE9SX0lELAotCU9JRF9HRU5fVkVORE9SX0RFU0NSSVBUSU9OLAotCU9JRF9HRU5fVkVORE9SX0RSSVZFUl9WRVJTSU9OLAotCU9JRF9HRU5fQ1VSUkVOVF9QQUNLRVRfRklMVEVSLAotCU9JRF9HRU5fTUFYSU1VTV9UT1RBTF9TSVpFLAotCU9JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMsCi0JT0lEX0dFTl9QSFlTSUNBTF9NRURJVU0sCi0jaWYgMAotCU9JRF9HRU5fUk5ESVNfQ09ORklHX1BBUkFNRVRFUiwKLSNlbmRpZgotCQotCS8qIHRoZSBzdGF0aXN0aWNhbCBzdHVmZiAqLwotCU9JRF9HRU5fWE1JVF9PSywKLQlPSURfR0VOX1JDVl9PSywKLQlPSURfR0VOX1hNSVRfRVJST1IsCi0JT0lEX0dFTl9SQ1ZfRVJST1IsCi0JT0lEX0dFTl9SQ1ZfTk9fQlVGRkVSLAotI2lmZGVmCVJORElTX09QVElPTkFMX1NUQVRTCi0JT0lEX0dFTl9ESVJFQ1RFRF9CWVRFU19YTUlULAotCU9JRF9HRU5fRElSRUNURURfRlJBTUVTX1hNSVQsCi0JT0lEX0dFTl9NVUxUSUNBU1RfQllURVNfWE1JVCwKLQlPSURfR0VOX01VTFRJQ0FTVF9GUkFNRVNfWE1JVCwKLQlPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19YTUlULAotCU9JRF9HRU5fQlJPQURDQVNUX0ZSQU1FU19YTUlULAotCU9JRF9HRU5fRElSRUNURURfQllURVNfUkNWLAotCU9JRF9HRU5fRElSRUNURURfRlJBTUVTX1JDViwKLQlPSURfR0VOX01VTFRJQ0FTVF9CWVRFU19SQ1YsCi0JT0lEX0dFTl9NVUxUSUNBU1RfRlJBTUVTX1JDViwKLQlPSURfR0VOX0JST0FEQ0FTVF9CWVRFU19SQ1YsCi0JT0lEX0dFTl9CUk9BRENBU1RfRlJBTUVTX1JDViwKLQlPSURfR0VOX1JDVl9DUkNfRVJST1IsCi0JT0lEX0dFTl9UUkFOU01JVF9RVUVVRV9MRU5HVEgsCi0jZW5kaWYJLyogUk5ESVNfT1BUSU9OQUxfU1RBVFMgKi8KLQotICAgIAkvKiBtYW5kYXRvcnkgODAyLjMgKi8KLQkvKiB0aGUgZ2VuZXJhbCBzdHVmZiAqLwotCU9JRF84MDJfM19QRVJNQU5FTlRfQUREUkVTUywKLQlPSURfODAyXzNfQ1VSUkVOVF9BRERSRVNTLAotCU9JRF84MDJfM19NVUxUSUNBU1RfTElTVCwKLQlPSURfODAyXzNfTUFDX09QVElPTlMsCi0JT0lEXzgwMl8zX01BWElNVU1fTElTVF9TSVpFLAotCQotCS8qIHRoZSBzdGF0aXN0aWNhbCBzdHVmZiAqLwotCU9JRF84MDJfM19SQ1ZfRVJST1JfQUxJR05NRU5ULAotCU9JRF84MDJfM19YTUlUX09ORV9DT0xMSVNJT04sCi0JT0lEXzgwMl8zX1hNSVRfTU9SRV9DT0xMSVNJT05TLAotI2lmZGVmCVJORElTX09QVElPTkFMX1NUQVRTCi0JT0lEXzgwMl8zX1hNSVRfREVGRVJSRUQsCi0JT0lEXzgwMl8zX1hNSVRfTUFYX0NPTExJU0lPTlMsCi0JT0lEXzgwMl8zX1JDVl9PVkVSUlVOLAotCU9JRF84MDJfM19YTUlUX1VOREVSUlVOLAotCU9JRF84MDJfM19YTUlUX0hFQVJUQkVBVF9GQUlMVVJFLAotCU9JRF84MDJfM19YTUlUX1RJTUVTX0NSU19MT1NULAotCU9JRF84MDJfM19YTUlUX0xBVEVfQ09MTElTSU9OUywKLSNlbmRpZgkvKiBSTkRJU19PUFRJT05BTF9TVEFUUyAqLwotCi0jaWZkZWYJUk5ESVNfUE0KLQkvKiBQTSBhbmQgd2FrZXVwIGFyZSBtYW5kYXRvcnkgZm9yIFVTQjogKi8KLQotCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQlPSURfUE5QX0NBUEFCSUxJVElFUywKLQlPSURfUE5QX1FVRVJZX1BPV0VSLAotCU9JRF9QTlBfU0VUX1BPV0VSLAotCi0JLyogd2FrZSB1cCBob3N0ICovCi0JT0lEX1BOUF9FTkFCTEVfV0FLRV9VUCwKLQlPSURfUE5QX0FERF9XQUtFX1VQX1BBVFRFUk4sCi0JT0lEX1BOUF9SRU1PVkVfV0FLRV9VUF9QQVRURVJOLAotI2VuZGlmCi19OwotCi0KIHR5cGVkZWYgc3RydWN0IHJuZGlzX2luaXRfbXNnX3R5cGUgCiB7CiAJX19sZTMyCU1lc3NhZ2VUeXBlOwpAQCAtMzA5LDE1ICsyMjUsMTggQEAKIHR5cGVkZWYgc3RydWN0IHJuZGlzX3BhcmFtcwogewogCXU4CQkJY29uZmlnbnI7Ci0JaW50CQkJdXNlZDsKKwl1OAkJCXVzZWQ7CisJdTE2CQkJc2F2ZWRfZmlsdGVyOwogCWVudW0gcm5kaXNfc3RhdGUJc3RhdGU7Ci0JdTMyCQkJZmlsdGVyOwogCXUzMgkJCW1lZGl1bTsKIAl1MzIJCQlzcGVlZDsKIAl1MzIJCQltZWRpYV9zdGF0ZTsKKwogCWNvbnN0IHU4CQkqaG9zdF9tYWM7CisJdTE2CQkJKmZpbHRlcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAJKmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHM7CisKIAl1MzIJCQl2ZW5kb3JJRDsKIAljb25zdCBjaGFyCQkqdmVuZG9yRGVzY3I7CiAJaW50IAkJCSgqYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKik7CkBAIC0zMjksNyArMjQ4LDggQEAKIGludCAgcm5kaXNfcmVnaXN0ZXIgKGludCAoKnJuZGlzX2NvbnRyb2xfYWNrKSAoc3RydWN0IG5ldF9kZXZpY2UgKikpOwogdm9pZCBybmRpc19kZXJlZ2lzdGVyIChpbnQgY29uZmlnTnIpOwogaW50ICBybmRpc19zZXRfcGFyYW1fZGV2ICh1OCBjb25maWdOciwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMpOworCQkJIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cywKKwkJCSB1MTYgKmNkY19maWx0ZXIpOwogaW50ICBybmRpc19zZXRfcGFyYW1fdmVuZG9yICh1OCBjb25maWdOciwgdTMyIHZlbmRvcklELCAKIAkJCSAgICBjb25zdCBjaGFyICp2ZW5kb3JEZXNjcik7CiBpbnQgIHJuZGlzX3NldF9wYXJhbV9tZWRpdW0gKHU4IGNvbmZpZ05yLCB1MzIgbWVkaXVtLCB1MzIgc3BlZWQpOwpAQCAtMzM4LDYgKzI1OCw3IEBACiB1OCAgICpybmRpc19nZXRfbmV4dF9yZXNwb25zZSAoaW50IGNvbmZpZ05yLCB1MzIgKmxlbmd0aCk7CiB2b2lkIHJuZGlzX2ZyZWVfcmVzcG9uc2UgKGludCBjb25maWdOciwgdTggKmJ1Zik7CiAKK3ZvaWQgcm5kaXNfdW5pbml0IChpbnQgY29uZmlnTnIpOwogaW50ICBybmRpc19zaWduYWxfY29ubmVjdCAoaW50IGNvbmZpZ05yKTsKIGludCAgcm5kaXNfc2lnbmFsX2Rpc2Nvbm5lY3QgKGludCBjb25maWdOcik7CiBpbnQgIHJuZGlzX3N0YXRlIChpbnQgY29uZmlnTnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCmluZGV4IDRkNTkxYzcuLjllNGYxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKQEAgLTMwMCwxOCArMzAwLDE4IEBACiAJCXU4IHR5cGUsIHVuc2lnbmVkIGludCBpbmRleCwgaW50IGlzX290Zyk7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmdzX2FsbG9jX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgaW50IGxlbiwKLQlpbnQga21hbGxvY19mbGFncyk7CisJdW5zaWduZWQga21hbGxvY19mbGFncyk7CiBzdGF0aWMgdm9pZCBnc19mcmVlX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpOwogCiBzdGF0aWMgc3RydWN0IGdzX3JlcV9lbnRyeSAqZ3NfYWxsb2NfcmVxX2VudHJ5KHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBsZW4sCi0JaW50IGttYWxsb2NfZmxhZ3MpOworCXVuc2lnbmVkIGttYWxsb2NfZmxhZ3MpOwogc3RhdGljIHZvaWQgZ3NfZnJlZV9yZXFfZW50cnkoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCBnc19yZXFfZW50cnkgKnJlcSk7CiAKLXN0YXRpYyBpbnQgZ3NfYWxsb2NfcG9ydHMoc3RydWN0IGdzX2RldiAqZGV2LCBpbnQga21hbGxvY19mbGFncyk7CitzdGF0aWMgaW50IGdzX2FsbG9jX3BvcnRzKHN0cnVjdCBnc19kZXYgKmRldiwgdW5zaWduZWQga21hbGxvY19mbGFncyk7CiBzdGF0aWMgdm9pZCBnc19mcmVlX3BvcnRzKHN0cnVjdCBnc19kZXYgKmRldik7CiAKIC8qIGNpcmN1bGFyIGJ1ZmZlciAqLwotc3RhdGljIHN0cnVjdCBnc19idWYgKmdzX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGttYWxsb2NfZmxhZ3MpOworc3RhdGljIHN0cnVjdCBnc19idWYgKmdzX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQga21hbGxvY19mbGFncyk7CiBzdGF0aWMgdm9pZCBnc19idWZfZnJlZShzdHJ1Y3QgZ3NfYnVmICpnYik7CiBzdGF0aWMgdm9pZCBnc19idWZfY2xlYXIoc3RydWN0IGdzX2J1ZiAqZ2IpOwogc3RhdGljIHVuc2lnbmVkIGludCBnc19idWZfZGF0YV9hdmFpbChzdHJ1Y3QgZ3NfYnVmICpnYik7CkBAIC0xNjA3LDkgKzE2MDcsOSBAQAogCWludCByZXQgPSAtRU9QTk9UU1VQUDsKIAlzdHJ1Y3QgZ3NfZGV2ICpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IGRldi0+ZGV2X2N0cmxfcmVxOwotCXUxNiB3SW5kZXggPSBjdHJsLT53SW5kZXg7Ci0JdTE2IHdWYWx1ZSA9IGN0cmwtPndWYWx1ZTsKLQl1MTYgd0xlbmd0aCA9IGN0cmwtPndMZW5ndGg7CisJdTE2IHdJbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2IHdWYWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2IHdMZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAogCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgewogCWNhc2UgVVNCX1RZUEVfU1RBTkRBUkQ6CkBAIC0xNjUxLDkgKzE2NTEsOSBAQAogCWludCByZXQgPSAtRU9QTk9UU1VQUDsKIAlzdHJ1Y3QgZ3NfZGV2ICpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IGRldi0+ZGV2X2N0cmxfcmVxOwotCXUxNiB3SW5kZXggPSBjdHJsLT53SW5kZXg7Ci0JdTE2IHdWYWx1ZSA9IGN0cmwtPndWYWx1ZTsKLQl1MTYgd0xlbmd0aCA9IGN0cmwtPndMZW5ndGg7CisJdTE2IHdJbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2IHdWYWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2IHdMZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAogCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKIAljYXNlIFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I6CkBAIC0xNzgyLDkgKzE3ODIsOSBAQAogCXN0cnVjdCBnc19kZXYgKmRldiA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOwogCXN0cnVjdCBnc19wb3J0ICpwb3J0ID0gZGV2LT5kZXZfcG9ydFswXTsJLyogQUNNIG9ubHkgaGFzIG9uZSBwb3J0ICovCiAJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSBkZXYtPmRldl9jdHJsX3JlcTsKLQl1MTYgd0luZGV4ID0gY3RybC0+d0luZGV4OwotCXUxNiB3VmFsdWUgPSBjdHJsLT53VmFsdWU7Ci0JdTE2IHdMZW5ndGggPSBjdHJsLT53TGVuZ3RoOworCXUxNiB3SW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNiB3VmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOworCXUxNiB3TGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKIAlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CiAJY2FzZSBVU0JfQ0RDX1JFUV9TRVRfTElORV9DT0RJTkc6CkBAIC0yMTE5LDcgKzIxMTksOCBAQAogICogQWxsb2NhdGUgYSB1c2JfcmVxdWVzdCBhbmQgaXRzIGJ1ZmZlci4gIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZQogICogdXNiX3JlcXVlc3Qgb3IgTlVMTCBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAqLwotc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqZ3NfYWxsb2NfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQga21hbGxvY19mbGFncykKK3N0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgorZ3NfYWxsb2NfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBrbWFsbG9jX2ZsYWdzKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOwogCkBAIC0yMTU5LDcgKzIxNjAsOCBAQAogICogQWxsb2NhdGVzIGEgcmVxdWVzdCBhbmQgaXRzIGJ1ZmZlciwgdXNpbmcgdGhlIGdpdmVuCiAgKiBlbmRwb2ludCwgYnVmZmVyIGxlbiwgYW5kIGttYWxsb2MgZmxhZ3MuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZ3NfcmVxX2VudHJ5ICpnc19hbGxvY19yZXFfZW50cnkoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGxlbiwgaW50IGttYWxsb2NfZmxhZ3MpCitzdGF0aWMgc3RydWN0IGdzX3JlcV9lbnRyeSAqCitnc19hbGxvY19yZXFfZW50cnkoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQga21hbGxvY19mbGFncykKIHsKIAlzdHJ1Y3QgZ3NfcmVxX2VudHJ5CSpyZXE7CiAKQEAgLTIyMDAsNyArMjIwMiw3IEBACiAgKgogICogVGhlIGRldmljZSBsb2NrIGlzIG5vcm1hbGx5IGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgZ3NfYWxsb2NfcG9ydHMoc3RydWN0IGdzX2RldiAqZGV2LCBpbnQga21hbGxvY19mbGFncykKK3N0YXRpYyBpbnQgZ3NfYWxsb2NfcG9ydHMoc3RydWN0IGdzX2RldiAqZGV2LCB1bnNpZ25lZCBrbWFsbG9jX2ZsYWdzKQogewogCWludCBpOwogCXN0cnVjdCBnc19wb3J0ICpwb3J0OwpAQCAtMjI4Miw3ICsyMjg0LDcgQEAKICAqCiAgKiBBbGxvY2F0ZSBhIGNpcmN1bGFyIGJ1ZmZlciBhbmQgYWxsIGFzc29jaWF0ZWQgbWVtb3J5LgogICovCi1zdGF0aWMgc3RydWN0IGdzX2J1ZiAqZ3NfYnVmX2FsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQga21hbGxvY19mbGFncykKK3N0YXRpYyBzdHJ1Y3QgZ3NfYnVmICpnc19idWZfYWxsb2ModW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGttYWxsb2NfZmxhZ3MpCiB7CiAJc3RydWN0IGdzX2J1ZiAqZ2I7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvemVyby5jCmluZGV4IDZlNDk0MzIuLmJiOWIyZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC96ZXJvLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3plcm8uYwpAQCAtNjEyLDcgKzYxMiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgotc291cmNlX3Npbmtfc3RhcnRfZXAgKHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgZ2ZwX2ZsYWdzKQorc291cmNlX3Npbmtfc3RhcnRfZXAgKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CiAJaW50CQkJc3RhdHVzOwpAQCAtNjQwLDcgKzY0MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9zb3VyY2Vfc2lua19jb25maWcgKHN0cnVjdCB6ZXJvX2RldiAqZGV2LCBpbnQgZ2ZwX2ZsYWdzKQorc2V0X3NvdXJjZV9zaW5rX2NvbmZpZyAoc3RydWN0IHplcm9fZGV2ICpkZXYsIHVuc2lnbmVkIGdmcF9mbGFncykKIHsKIAlpbnQJCQlyZXN1bHQgPSAwOwogCXN0cnVjdCB1c2JfZXAJCSplcDsKQEAgLTc0NCw3ICs3NDQsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfbG9vcGJhY2tfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgaW50IGdmcF9mbGFncykKK3NldF9sb29wYmFja19jb25maWcgKHN0cnVjdCB6ZXJvX2RldiAqZGV2LCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgdXNiX2VwCQkqZXA7CkBAIC04NDUsNyArODQ1LDcgQEAKICAqIGJ5IGxpbWl0aW5nIGNvbmZpZ3VyYXRpb24gY2hvaWNlcyAobGlrZSB0aGUgcHhhMnh4KS4KICAqLwogc3RhdGljIGludAotemVyb19zZXRfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgdW5zaWduZWQgbnVtYmVyLCBpbnQgZ2ZwX2ZsYWdzKQoremVyb19zZXRfY29uZmlnIChzdHJ1Y3QgemVyb19kZXYgKmRldiwgdW5zaWduZWQgbnVtYmVyLCB1bnNpZ25lZCBnZnBfZmxhZ3MpCiB7CiAJaW50CQkJcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgdXNiX2dhZGdldAkqZ2FkZ2V0ID0gZGV2LT5nYWRnZXQ7CkBAIC05MTksOSArOTE5LDkgQEAKIAlzdHJ1Y3QgemVyb19kZXYJCSpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEgKGdhZGdldCk7CiAJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXEgPSBkZXYtPnJlcTsKIAlpbnQJCQl2YWx1ZSA9IC1FT1BOT1RTVVBQOwotCXUxNgkJCXdfaW5kZXggPSBjdHJsLT53SW5kZXg7Ci0JdTE2CQkJd192YWx1ZSA9IGN0cmwtPndWYWx1ZTsKLQl1MTYJCQl3X2xlbmd0aCA9IGN0cmwtPndMZW5ndGg7CisJdTE2CQkJd19pbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2CQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2CQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKIAogCS8qIHVzdWFsbHkgdGhpcyBzdG9yZXMgcmVwbHkgZGF0YSBpbiB0aGUgcHJlLWFsbG9jYXRlZCBlcDAgYnVmZmVyLAogCSAqIGJ1dCBjb25maWcgY2hhbmdlIGV2ZW50cyB3aWxsIHJlY29uZmlndXJlIGhhcmR3YXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCmluZGV4IDE5ZTU5OGMuLmVkMTg5OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTQ5LDYgKzQ5LDE5IEBACiAKIAkgIFRoaXMgc3VwcG9ydHMgdGhlIEVIQ0kgaW1wbGVtZW50YXRpb24gZnJvbSBUcmFuc0RpbWVuc2lvbiBJbmMuCiAKK2NvbmZpZyBVU0JfSVNQMTE2WF9IQ0QKKwl0cmlzdGF0ZSAiSVNQMTE2WCBIQ0Qgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwkgIFRoZSBJU1AxMTYwIGFuZCBJU1AxMTYxIGNoaXBzIGFyZSBVU0IgaG9zdCBjb250cm9sbGVycy4gRW5hYmxlIHRoaXMKKwkgIG9wdGlvbiBpZiB5b3VyIGJvYXJkIGhhcyB0aGlzIGNoaXAuIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaXNvY2hyb25vdXMgdHJhbnNmZXJzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpc3AxMTZ4LWhjZC4KKwogY29uZmlnIFVTQl9PSENJX0hDRAogCXRyaXN0YXRlICJPSENJIEhDRCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFVTQl9BUkNIX0hBU19PSENJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQppbmRleCA1ZGJkM2U3Li4zNTBkMTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAjCiAKIG9iai0kKENPTkZJR19VU0JfRUhDSV9IQ0QpCSs9IGVoY2ktaGNkLm8KK29iai0kKENPTkZJR19VU0JfSVNQMTE2WF9IQ0QpCSs9IGlzcDExNngtaGNkLm8KIG9iai0kKENPTkZJR19VU0JfT0hDSV9IQ0QpCSs9IG9oY2ktaGNkLm8KIG9iai0kKENPTkZJR19VU0JfVUhDSV9IQ0QpCSs9IHVoY2ktaGNkLm8KIG9iai0kKENPTkZJR19VU0JfU0w4MTFfSENEKQkrPSBzbDgxMS1oY2QubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCmluZGV4IDJmZjExZDUuLjUwY2IwMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCX0KIAogCXJldHVybiBzY25wcmludGYgKGJ1ZiwgbGVuLAotCQkiJXMlc3BvcnQgJWQgc3RhdHVzICUwNnglcyVzIHNpZz0lcyAlcyVzJXMlcyVzJXMlcyVzJXMiLAorCQkiJXMlc3BvcnQgJWQgc3RhdHVzICUwNnglcyVzIHNpZz0lcyVzJXMlcyVzJXMlcyVzJXMlcyIsCiAJCWxhYmVsLCBsYWJlbCBbMF0gPyAiICIgOiAiIiwgcG9ydCwgc3RhdHVzLAogCQkoc3RhdHVzICYgUE9SVF9QT1dFUikgPyAiIFBPV0VSIiA6ICIiLAogCQkoc3RhdHVzICYgUE9SVF9PV05FUikgPyAiIE9XTkVSIiA6ICIiLApAQCAtNjQ0LDkgKzY0NCwxMSBAQAogCWlmIChidXMtPmNvbnRyb2xsZXItPnBvd2VyLnBvd2VyX3N0YXRlKSB7CiAJCXNpemUgPSBzY25wcmludGYgKG5leHQsIHNpemUsCiAJCQkiYnVzICVzLCBkZXZpY2UgJXMgKGRyaXZlciAiIERSSVZFUl9WRVJTSU9OICIpXG4iCisJCQkiJXNcbiIKIAkJCSJTVVNQRU5ERUQgKG5vIHJlZ2lzdGVyIGFjY2VzcylcbiIsCiAJCQloY2QtPnNlbGYuY29udHJvbGxlci0+YnVzLT5uYW1lLAotCQkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1c19pZCk7CisJCQloY2QtPnNlbGYuY29udHJvbGxlci0+YnVzX2lkLAorCQkJaGNkLT5wcm9kdWN0X2Rlc2MpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC02NTQsMTMgKzY1Niw1MyBAQAogCWkgPSBIQ19WRVJTSU9OKHJlYWRsICgmZWhjaS0+Y2Fwcy0+aGNfY2FwYmFzZSkpOwogCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsCiAJCSJidXMgJXMsIGRldmljZSAlcyAoZHJpdmVyICIgRFJJVkVSX1ZFUlNJT04gIilcbiIKKwkJIiVzXG4iCiAJCSJFSENJICV4LiUwMngsIGhjZCBzdGF0ZSAlZFxuIiwKIAkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1cy0+bmFtZSwKIAkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1c19pZCwKKwkJaGNkLT5wcm9kdWN0X2Rlc2MsCiAJCWkgPj4gOCwgaSAmIDB4MGZmLCBoY2QtPnN0YXRlKTsKIAlzaXplIC09IHRlbXA7CiAJbmV4dCArPSB0ZW1wOwogCisjaWZkZWYJQ09ORklHX1BDSQorCS8qIEVIQ0kgMC45NiBhbmQgbGF0ZXIgbWF5IGhhdmUgImV4dGVuZGVkIGNhcGFiaWxpdGllcyIgKi8KKwlpZiAoaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJCXN0cnVjdCBwY2lfZGV2CSpwZGV2OworCQl1MzIJCW9mZnNldCwgY2FwLCBjYXAyOworCQl1bnNpZ25lZAljb3VudCA9IDI1Ni80OworCisJCXBkZXYgPSB0b19wY2lfZGV2KGVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmNvbnRyb2xsZXIpOworCQlvZmZzZXQgPSBIQ0NfRVhUX0NBUFMgKHJlYWRsICgmZWhjaS0+Y2Fwcy0+aGNjX3BhcmFtcykpOworCQl3aGlsZSAob2Zmc2V0ICYmIGNvdW50LS0pIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgb2Zmc2V0LCAmY2FwKTsKKwkJCXN3aXRjaCAoY2FwICYgMHhmZikgeworCQkJY2FzZSAxOgorCQkJCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsCisJCQkJCSJvd25lcnNoaXAgJTA4eCVzJXNcbiIsIGNhcCwKKwkJCQkJKGNhcCAmICgxIDw8IDI0KSkgPyAiIGxpbnV4IiA6ICIiLAorCQkJCQkoY2FwICYgKDEgPDwgMTYpKSA/ICIgZmlybXdhcmUiIDogIiIpOworCQkJCXNpemUgLT0gdGVtcDsKKwkJCQluZXh0ICs9IHRlbXA7CisKKwkJCQlvZmZzZXQgKz0gNDsKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKHBkZXYsIG9mZnNldCwgJmNhcDIpOworCQkJCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsCisJCQkJCSJTTUkgc3RzL2VuYWJsZSAweCUwOHhcbiIsIGNhcDIpOworCQkJCXNpemUgLT0gdGVtcDsKKwkJCQluZXh0ICs9IHRlbXA7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CQkvKiBpbGxlZ2FsIHJlc2VydmVkIGNhcGFiaWxpdHkgKi8KKwkJCQljYXAgPSAwOworCQkJCS8qIEZBTExUSFJPVUdIICovCisJCQlkZWZhdWx0OgkJLyogdW5rbm93biAqLworCQkJCWJyZWFrOworCQkJfQorCQkJdGVtcCA9IChjYXAgPj4gOCkgJiAweGZmOworCQl9CisJfQorI2VuZGlmCisKIAkvLyBGSVhNRSBpbnRlcnByZXQgYm90aCB0eXBlcyBvZiBwYXJhbXMKIAlpID0gcmVhZGwgKCZlaGNpLT5jYXBzLT5oY3NfcGFyYW1zKTsKIAl0ZW1wID0gc2NucHJpbnRmIChuZXh0LCBzaXplLCAic3RydWN0dXJhbCBwYXJhbXMgMHglMDh4XG4iLCBpKTsKQEAgLTY5NiwxMiArNzM4LDE5IEBACiAJc2l6ZSAtPSB0ZW1wOwogCW5leHQgKz0gdGVtcDsKIAotCWZvciAoaSA9IDA7IGkgPCBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7IGkrKykgewotCQl0ZW1wID0gZGJnX3BvcnRfYnVmIChzY3JhdGNoLCBzaXplb2Ygc2NyYXRjaCwgbGFiZWwsIGkgKyAxLAotCQkJCXJlYWRsICgmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKSk7CisJZm9yIChpID0gMTsgaSA8PSBIQ1NfTl9QT1JUUyAoZWhjaS0+aGNzX3BhcmFtcyk7IGkrKykgeworCQl0ZW1wID0gZGJnX3BvcnRfYnVmIChzY3JhdGNoLCBzaXplb2Ygc2NyYXRjaCwgbGFiZWwsIGksCisJCQkJcmVhZGwgKCZlaGNpLT5yZWdzLT5wb3J0X3N0YXR1cyBbaSAtIDFdKSk7CiAJCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsIGZtdCwgdGVtcCwgc2NyYXRjaCk7CiAJCXNpemUgLT0gdGVtcDsKIAkJbmV4dCArPSB0ZW1wOworCQlpZiAoaSA9PSBIQ1NfREVCVUdfUE9SVChlaGNpLT5oY3NfcGFyYW1zKSAmJiBlaGNpLT5kZWJ1ZykgeworCQkJdGVtcCA9IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwKKwkJCQkJIiAgICBkZWJ1ZyBjb250cm9sICUwOHhcbiIsCisJCQkJCXJlYWRsICgmZWhjaS0+ZGVidWctPmNvbnRyb2wpKTsKKwkJCXNpemUgLT0gdGVtcDsKKwkJCW5leHQgKz0gdGVtcDsKKwkJfQogCX0KIAogCWlmIChlaGNpLT5yZWNsYWltKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggYmM2OWJkNy4uMTQ5YjEzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtMzA0LDMwICszMDQsMzEgQEAKICAqLwogc3RhdGljIGludCBiaW9zX2hhbmRvZmYgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgaW50IHdoZXJlLCB1MzIgY2FwKQogeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyKTsKKworCS8qIGFsd2F5cyBzYXkgTGludXggd2lsbCBvd24gdGhlIGhhcmR3YXJlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIHdoZXJlICsgMywgMSk7CisKKwkvKiBtYXliZSB3YWl0IGEgd2hpbGUgZm9yIEJJT1MgdG8gcmVzcG9uZCAqLwogCWlmIChjYXAgJiAoMSA8PCAxNikpIHsKIAkJaW50IG1zZWMgPSA1MDAwOwotCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9Ci0JCQkJdG9fcGNpX2RldihlaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyKTsKIAotCQkvKiByZXF1ZXN0IGhhbmRvZmYgdG8gT1MgKi8KLQkJY2FwIHw9IDEgPDwgMjQ7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgd2hlcmUsIGNhcCk7Ci0KLQkJLyogYW5kIHdhaXQgYSB3aGlsZSBmb3IgaXQgdG8gaGFwcGVuICovCiAJCWRvIHsKIAkJCW1zbGVlcCgxMCk7CiAJCQltc2VjIC09IDEwOwogCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIHdoZXJlLCAmY2FwKTsKIAkJfSB3aGlsZSAoKGNhcCAmICgxIDw8IDE2KSkgJiYgbXNlYyk7CiAJCWlmIChjYXAgJiAoMSA8PCAxNikpIHsKLQkJCWVoY2lfZXJyIChlaGNpLCAiQklPUyBoYW5kb2ZmIGZhaWxlZCAoJWQsICUwNHgpXG4iLAorCQkJZWhjaV9lcnIoZWhjaSwgIkJJT1MgaGFuZG9mZiBmYWlsZWQgKCVkLCAlMDh4KVxuIiwKIAkJCQl3aGVyZSwgY2FwKTsKIAkJCS8vIHNvbWUgQklPUyB2ZXJzaW9ucyBzZWVtIGJ1Z2d5Li4uCiAJCQkvLyByZXR1cm4gMTsKIAkJCWVoY2lfd2FybiAoZWhjaSwgImNvbnRpbnVpbmcgYWZ0ZXIgQklPUyBidWcuLi5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0gCi0JCWVoY2lfZGJnIChlaGNpLCAiQklPUyBoYW5kb2ZmIHN1Y2NlZWRlZFxuIik7CisJCQkvKiBkaXNhYmxlIGFsbCBTTUlzLCBhbmQgY2xlYXIgIkJJT1Mgb3ducyIgZmxhZyAqLworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCB3aGVyZSArIDQsIDApOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIHdoZXJlICsgMiwgMCk7CisJCX0gZWxzZQorCQkJZWhjaV9kYmcoZWhjaSwgIkJJT1MgaGFuZG9mZiBzdWNjZWVkZWRcbiIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQ5Miw4ICs0OTMsNiBAQAogewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKIAl1MzIJCQl0ZW1wOwotCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwotCXN0cnVjdCB1c2JfYnVzCQkqYnVzOwogCWludAkJCXJldHZhbDsKIAl1MzIJCQloY2NfcGFyYW1zOwogCXU4ICAgICAgICAgICAgICAgICAgICAgIHNicm4gPSAwOwpAQCAtNTg4LDggKzU4Nyw4IEBACiAJCXdyaXRlbCAoMCwgJmVoY2ktPnJlZ3MtPnNlZ21lbnQpOwogI2lmIDAKIC8vIHRoaXMgaXMgZGVlcGx5IGJyb2tlbiBvbiBhbG1vc3QgYWxsIGFyY2hpdGVjdHVyZXMKLQkJaWYgKCFwY2lfc2V0X2RtYV9tYXNrICh0b19wY2lfZGV2KGhjZC0+c2VsZi5jb250cm9sbGVyKSwgMHhmZmZmZmZmZmZmZmZmZmZmVUxMKSkKLQkJCWVoY2lfaW5mbyAoZWhjaSwgImVuYWJsZWQgNjRiaXQgUENJIERNQVxuIik7CisJCWlmICghZG1hX3NldF9tYXNrIChoY2QtPnNlbGYuY29udHJvbGxlciwgRE1BXzY0QklUX01BU0spKQorCQkJZWhjaV9pbmZvIChlaGNpLCAiZW5hYmxlZCA2NGJpdCBETUFcbiIpOwogI2VuZGlmCiAJfQogCkBAIC02MzEsMTcgKzYzMCw2IEBACiAKIAkvKiBzZXQgYXN5bmMgc2xlZXAgdGltZSA9IDEwIHVzIC4uLiA/ICovCiAKLQkvKiB3aXJlIHVwIHRoZSByb290IGh1YiAqLwotCWJ1cyA9IGhjZF90b19idXMgKGhjZCk7Ci0JdWRldiA9IGZpcnN0ID8gdXNiX2FsbG9jX2RldiAoTlVMTCwgYnVzLCAwKSA6IGJ1cy0+cm9vdF9odWI7Ci0JaWYgKCF1ZGV2KSB7Ci1kb25lMjoKLQkJZWhjaV9tZW1fY2xlYW51cCAoZWhjaSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQl1ZGV2LT5zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOwotCXVkZXYtPnN0YXRlID0gZmlyc3QgPyBVU0JfU1RBVEVfQVRUQUNIRUQgOiBVU0JfU1RBVEVfQ09ORklHVVJFRDsKLQogCS8qCiAJICogU3RhcnQsIGVuYWJsaW5nIGZ1bGwgVVNCIDIuMCBmdW5jdGlvbmFsaXR5IC4uLiB1c2IgMS4xIGRldmljZXMKIAkgKiBhcmUgZXhwbGljaXRseSBoYW5kZWQgdG8gY29tcGFuaW9uIGNvbnRyb2xsZXIocyksIHNvIG5vIFRUIGlzCkBAIC02NjQsMjQgKzY1Miw2IEBACiAJCWZpcnN0ID8gImluaXRpYWxpemVkIiA6ICJyZXN0YXJ0ZWQiLAogCQl0ZW1wID4+IDgsIHRlbXAgJiAweGZmLCBEUklWRVJfVkVSU0lPTik7CiAKLQkvKgotCSAqIEZyb20gaGVyZSBvbiwga2h1YmQgY29uY3VycmVudGx5IGFjY2Vzc2VzIHRoZSByb290Ci0JICogaHViOyBkcml2ZXJzIHdpbGwgYmUgdGFsa2luZyB0byBlbnVtZXJhdGVkIGRldmljZXMuCi0JICogKE9uIHJlc3RhcnQgcGF0aHMsIGtodWJkIGFscmVhZHkga25vd3MgYWJvdXQgdGhlIHJvb3QKLQkgKiBodWIgYW5kIGNvdWxkIGZpbmQgd29yayBhcyBzb29uIGFzIHdlIHdyb3RlIEZMQUdfQ0YuKQotCSAqCi0JICogQmVmb3JlIHRoaXMgcG9pbnQgdGhlIEhDIHdhcyBpZGxlL3JlYWR5LiAgQWZ0ZXIsIGtodWJkCi0JICogYW5kIGRldmljZSBkcml2ZXJzIG1heSBzdGFydCBpdCBydW5uaW5nLgotCSAqLwotCWlmIChmaXJzdCAmJiB1c2JfaGNkX3JlZ2lzdGVyX3Jvb3RfaHViICh1ZGV2LCBoY2QpICE9IDApIHsKLQkJaWYgKGhjZC0+c3RhdGUgPT0gSENfU1RBVEVfUlVOTklORykKLQkJCWVoY2lfcXVpZXNjZSAoZWhjaSk7Ci0JCWVoY2lfcmVzZXQgKGVoY2kpOwotCQl1c2JfcHV0X2RldiAodWRldik7IAotCQlyZXR2YWwgPSAtRU5PREVWOwotCQlnb3RvIGRvbmUyOwotCX0KLQogCXdyaXRlbCAoSU5UUl9NQVNLLCAmZWhjaS0+cmVncy0+aW50cl9lbmFibGUpOyAvKiBUdXJuIE9uIEludGVycnVwdHMgKi8KIAogCWlmIChmaXJzdCkKQEAgLTk5MCw3ICs5NjAsNyBAQAogCXN0cnVjdCB1c2JfaGNkCSpoY2QsCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKIAlzdHJ1Y3QgdXJiCSp1cmIsCi0JaW50CQltZW1fZmxhZ3MKKwl1bnNpZ25lZAltZW1fZmxhZ3MKICkgewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSBoY2RfdG9fZWhjaSAoaGNkKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXF0ZF9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCmluZGV4IGQ3YjRmNzkuLjM2Y2MxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgYnkgRGF2aWQgQnJvd25lbGwKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IERhdmlkIEJyb3duZWxsCiAgKiAKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCmluZGV4IDdkZjliOWEuLmQ3NGIyZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBieSBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgYnkgRGF2aWQgQnJvd25lbGwKICAqIAogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtODk4LDcgKzg5OCw3IEBACiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKIAlzdHJ1Y3QgdXJiCQkqdXJiLAogCXN0cnVjdCBsaXN0X2hlYWQJKnF0ZF9saXN0LAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICkgewogCXN0cnVjdCBlaGNpX3F0ZAkJKnF0ZDsKIAlpbnQJCQllcG51bTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggMmZhMWZmZS4uOWFmNGY2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTU4OCw3ICs1ODgsNyBAQAogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCiAJc3RydWN0IHVyYgkJKnVyYiwKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpxdGRfbGlzdCwKLQlpbnQJCQltZW1fZmxhZ3MKKwl1bnNpZ25lZAkJbWVtX2ZsYWdzCiApIHsKIAl1bnNpZ25lZAkJZXBudW07CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CkBAIC02MzMsMTMgKzYzMywxMiBAQAogLyogZWhjaV9pc29fc3RyZWFtIG9wcyB3b3JrIHdpdGggYm90aCBJVEQgYW5kIFNJVEQgKi8KIAogc3RhdGljIHN0cnVjdCBlaGNpX2lzb19zdHJlYW0gKgotaXNvX3N0cmVhbV9hbGxvYyAoaW50IG1lbV9mbGFncykKK2lzb19zdHJlYW1fYWxsb2MgKHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgZWhjaV9pc29fc3RyZWFtICpzdHJlYW07CiAKLQlzdHJlYW0gPSBrbWFsbG9jKHNpemVvZiAqc3RyZWFtLCBtZW1fZmxhZ3MpOworCXN0cmVhbSA9IGtjYWxsb2MoMSwgc2l6ZW9mICpzdHJlYW0sIG1lbV9mbGFncyk7CiAJaWYgKGxpa2VseSAoc3RyZWFtICE9IE5VTEwpKSB7Ci0JCW1lbXNldCAoc3RyZWFtLCAwLCBzaXplb2YoKnN0cmVhbSkpOwogCQlJTklUX0xJU1RfSEVBRCgmc3RyZWFtLT50ZF9saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJnN0cmVhbS0+ZnJlZV9saXN0KTsKIAkJc3RyZWFtLT5uZXh0X3VmcmFtZSA9IC0xOwpAQCAtODQ3LDcgKzg0Niw3IEBACiAvKiBlaGNpX2lzb19zY2hlZCBvcHMgY2FuIGJlIElURC1vbmx5IG9yIFNJVEQtb25seSAqLwogCiBzdGF0aWMgc3RydWN0IGVoY2lfaXNvX3NjaGVkICoKLWlzb19zY2hlZF9hbGxvYyAodW5zaWduZWQgcGFja2V0cywgaW50IG1lbV9mbGFncykKK2lzb19zY2hlZF9hbGxvYyAodW5zaWduZWQgcGFja2V0cywgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCXN0cnVjdCBlaGNpX2lzb19zY2hlZAkqaXNvX3NjaGVkOwogCWludAkJCXNpemUgPSBzaXplb2YgKmlzb19zY2hlZDsKQEAgLTg5NCw3ICs4OTMsNyBAQAogCQl0cmFucyB8PSBsZW5ndGggPDwgMTY7CiAJCXVmcmFtZS0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUzMiAodHJhbnMpOwogCi0JCS8qIG1pZ2h0IG5lZWQgdG8gY3Jvc3MgYSBidWZmZXIgcGFnZSB3aXRoaW4gYSB0ZCAqLworCQkvKiBtaWdodCBuZWVkIHRvIGNyb3NzIGEgYnVmZmVyIHBhZ2Ugd2l0aGluIGEgdWZyYW1lICovCiAJCXVmcmFtZS0+YnVmcCA9IChidWYgJiB+KHU2NCkweDBmZmYpOwogCQlidWYgKz0gbGVuZ3RoOwogCQlpZiAodW5saWtlbHkgKCh1ZnJhbWUtPmJ1ZnAgIT0gKGJ1ZiAmIH4odTY0KTB4MGZmZikpKSkKQEAgLTkyMCw3ICs5MTksNyBAQAogCXN0cnVjdCBlaGNpX2lzb19zdHJlYW0JKnN0cmVhbSwKIAlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpLAogCXN0cnVjdCB1cmIJCSp1cmIsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKQogewogCXN0cnVjdCBlaGNpX2l0ZAkJKml0ZDsKQEAgLTExOTQsNiArMTE5Myw3IEBACiB7CiAJaW50IGk7CiAKKwkvKiBpdCdzIGJlZW4gcmVjZW50bHkgemVyb2VkICovCiAJaXRkLT5od19uZXh0ID0gRUhDSV9MSVNUX0VORDsKIAlpdGQtPmh3X2J1ZnAgWzBdID0gc3RyZWFtLT5idWYwOwogCWl0ZC0+aHdfYnVmcCBbMV0gPSBzdHJlYW0tPmJ1ZjE7CkBAIC0xMjEwLDggKzEyMTAsNyBAQAogCXN0cnVjdCBlaGNpX2l0ZAkJKml0ZCwKIAlzdHJ1Y3QgZWhjaV9pc29fc2NoZWQJKmlzb19zY2hlZCwKIAl1bnNpZ25lZAkJaW5kZXgsCi0JdTE2CQkJdWZyYW1lLAotCWludAkJCWZpcnN0CisJdTE2CQkJdWZyYW1lCiApCiB7CiAJc3RydWN0IGVoY2lfaXNvX3BhY2tldAkqdWYgPSAmaXNvX3NjaGVkLT5wYWNrZXQgW2luZGV4XTsKQEAgLTEyMjgsNyArMTIyNyw3IEBACiAJaXRkLT5od19idWZwX2hpIFtwZ10gfD0gY3B1X3RvX2xlMzIgKCh1MzIpKHVmLT5idWZwID4+IDMyKSk7CiAKIAkvKiBpc29fZnJhbWVfZGVzY1tdLm9mZnNldCBtdXN0IGJlIHN0cmljdGx5IGluY3JlYXNpbmcgKi8KLQlpZiAodW5saWtlbHkgKCFmaXJzdCAmJiB1Zi0+Y3Jvc3MpKSB7CisJaWYgKHVubGlrZWx5ICh1Zi0+Y3Jvc3MpKSB7CiAJCXU2NAlidWZwID0gdWYtPmJ1ZnAgKyA0MDk2OwogCQlpdGQtPnBnID0gKytwZzsKIAkJaXRkLT5od19idWZwIFtwZ10gfD0gY3B1X3RvX2xlMzIgKGJ1ZnAgJiB+KHUzMikwKTsKQEAgLTEyNTcsNyArMTI1Niw3IEBACiAJc3RydWN0IGVoY2lfaXNvX3N0cmVhbQkqc3RyZWFtCiApCiB7Ci0JaW50CQkJcGFja2V0LCBmaXJzdCA9IDE7CisJaW50CQkJcGFja2V0OwogCXVuc2lnbmVkCQluZXh0X3VmcmFtZSwgdWZyYW1lLCBmcmFtZTsKIAlzdHJ1Y3QgZWhjaV9pc29fc2NoZWQJKmlzb19zY2hlZCA9IHVyYi0+aGNwcml2OwogCXN0cnVjdCBlaGNpX2l0ZAkJKml0ZDsKQEAgLTEyOTAsNyArMTI4OSw2IEBACiAJCQlsaXN0X21vdmVfdGFpbCAoJml0ZC0+aXRkX2xpc3QsICZzdHJlYW0tPnRkX2xpc3QpOwogCQkJaXRkLT5zdHJlYW0gPSBpc29fc3RyZWFtX2dldCAoc3RyZWFtKTsKIAkJCWl0ZC0+dXJiID0gdXNiX2dldF91cmIgKHVyYik7Ci0JCQlmaXJzdCA9IDE7CiAJCQlpdGRfaW5pdCAoc3RyZWFtLCBpdGQpOwogCQl9CiAKQEAgLTEyOTgsOCArMTI5Niw3IEBACiAJCWZyYW1lID0gbmV4dF91ZnJhbWUgPj4gMzsKIAogCQlpdGQtPnVzZWNzIFt1ZnJhbWVdID0gc3RyZWFtLT51c2VjczsKLQkJaXRkX3BhdGNoIChpdGQsIGlzb19zY2hlZCwgcGFja2V0LCB1ZnJhbWUsIGZpcnN0KTsKLQkJZmlyc3QgPSAwOworCQlpdGRfcGF0Y2ggKGl0ZCwgaXNvX3NjaGVkLCBwYWNrZXQsIHVmcmFtZSk7CiAKIAkJbmV4dF91ZnJhbWUgKz0gc3RyZWFtLT5pbnRlcnZhbDsKIAkJc3RyZWFtLT5kZXB0aCArPSBzdHJlYW0tPmludGVydmFsOwpAQCAtMTQxNSw3ICsxNDEyLDggQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBpdGRfc3VibWl0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncykKK3N0YXRpYyBpbnQgaXRkX3N1Ym1pdCAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgdXJiICp1cmIsCisJdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWludAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CkBAIC0xNTI2LDcgKzE1MjQsNyBAQAogCXN0cnVjdCBlaGNpX2lzb19zdHJlYW0JKnN0cmVhbSwKIAlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpLAogCXN0cnVjdCB1cmIJCSp1cmIsCi0JaW50CQkJbWVtX2ZsYWdzCisJdW5zaWduZWQJCW1lbV9mbGFncwogKQogewogCXN0cnVjdCBlaGNpX3NpdGQJKnNpdGQ7CkBAIC0xNzc1LDcgKzE3NzMsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgc2l0ZF9zdWJtaXQgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQorc3RhdGljIGludCBzaXRkX3N1Ym1pdCAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgdXJiICp1cmIsCisJdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWludAkJCXN0YXR1cyA9IC1FSU5WQUw7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CkBAIC0xODI1LDcgKzE4MjQsOCBAQAogI2Vsc2UKIAogc3RhdGljIGlubGluZSBpbnQKLXNpdGRfc3VibWl0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncykKK3NpdGRfc3VibWl0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCB1cmIgKnVyYiwKKwl1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJZWhjaV9kYmcgKGVoY2ksICJzcGxpdCBpc28gc3VwcG9ydCBpcyBkaXNhYmxlZFxuIik7CiAJcmV0dXJuIC1FTk9TWVM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2hjX2NyaXN2MTAuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCmluZGV4IGQ5ODgzZDcuLjgxZjhmNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaGNfY3Jpc3YxMC5jCkBAIC00NjMsNyArNDYzLDggQEAKIAogc3RhdGljIGludCBldHJheF9yZW1vdmVfZnJvbV9zYl9saXN0KHN0cnVjdCB1cmIgKnVyYik7CiAKLXN0YXRpYyB2b2lkKiBldHJheF91c2JfYnVmZmVyX2FsbG9jKHN0cnVjdCB1c2JfYnVzKiBidXMsIHNpemVfdCBzaXplLCBpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOworc3RhdGljIHZvaWQqIGV0cmF4X3VzYl9idWZmZXJfYWxsb2Moc3RydWN0IHVzYl9idXMqIGJ1cywgc2l6ZV90IHNpemUsCisJdW5zaWduZWQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpOwogc3RhdGljIHZvaWQgZXRyYXhfdXNiX2J1ZmZlcl9mcmVlKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLCB2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSk7CiAKIHN0YXRpYyB2b2lkIGV0cmF4X3VzYl9hZGRfdG9fYnVsa19zYl9saXN0KHN0cnVjdCB1cmIgKnVyYiwgaW50IGVwaWQpOwpAQCAtNDc2LDcgKzQ3Nyw3IEBACiBzdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfaW50cl91cmIoc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyBpbnQgZXRyYXhfdXNiX3N1Ym1pdF9pc29jX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogCi1zdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IG1lbV9mbGFncyk7CitzdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKTsKIHN0YXRpYyBpbnQgZXRyYXhfdXNiX3VubGlua191cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsKIHN0YXRpYyBpbnQgZXRyYXhfdXNiX2dldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpOwogCkBAIC0xMjYyLDcgKzEyNjMsNyBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBldHJheF91c2Jfc3VibWl0X3VyYihzdHJ1Y3QgdXJiICp1cmIsIGludCBtZW1fZmxhZ3MpCitzdGF0aWMgaW50IGV0cmF4X3VzYl9zdWJtaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgdW5zaWduZWQgbWVtX2ZsYWdzKQogewogCWV0cmF4X2hjX3QgKmhjOwogCWludCByZXQgPSAtRUlOVkFMOwpAQCAtNDI3Nyw3ICs0Mjc4LDggQEAKIH0KIAogc3RhdGljIHZvaWQqCi1ldHJheF91c2JfYnVmZmVyX2FsbG9jKHN0cnVjdCB1c2JfYnVzKiBidXMsIHNpemVfdCBzaXplLCBpbnQgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpCitldHJheF91c2JfYnVmZmVyX2FsbG9jKHN0cnVjdCB1c2JfYnVzKiBidXMsIHNpemVfdCBzaXplLAorCXVuc2lnbmVkIG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKQogewogICByZXR1cm4ga21hbGxvYyhzaXplLCBtZW1fZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjE5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKQEAgLTAsMCArMSwxODcxIEBACisvKgorICogSVNQMTE2eCBIQ0QgKEhvc3QgQ29udHJvbGxlciBEcml2ZXIpIGZvciBVU0IuCisgKgorICogRGVyaXZlZCBmcm9tIHRoZSBTTDgxMSBIQ0QsIHJld3JpdHRlbiBmb3IgSVNQMTE2eC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBPbGF2IEtvbmdhcyA8b2tAYXJ0ZWNkZXNpZ24uZWU+CisgKgorICogUG9ydGlvbnM6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUHNpb24gVGVrbG9naXggKGZvciBOZXRCb29rIFBSTykKKyAqIENvcHlyaWdodCAoQykgMjAwNCBEYXZpZCBCcm93bmVsbAorICoKKyAqIFBlcmlvZGljIHNjaGVkdWxpbmcgaXMgYmFzZWQgb24gUm9tYW4ncyBPSENJIGNvZGUKKyAqIENvcHlyaWdodCAoQykgMTk5OSBSb21hbiBXZWlzc2dhZXJiZXIKKyAqCisgKi8KKworLyoKKyAqIFRoZSBkcml2ZXIgYmFzaWNhbGx5IHdvcmtzLiBBIG51bWJlciBvZiBwZW9wbGUgaGF2ZSB1c2VkIGl0IHdpdGggYSByYW5nZQorICogb2YgZGV2aWNlcy4KKyAqCisgKiBUaGUgZHJpdmVyIHBhc3NlcyBhbGwgdXNidGVzdHMgMS0xNC4KKyAqCisgKiBTdXNwZW5kaW5nL3Jlc3VtaW5nIG9mIHJvb3QgaHViIHZpYSBzeXNmcyB3b3Jrcy4gUmVtb3RlIHdha2V1cCB3b3JrcyB0b28uCisgKiBBbmQgc3VzcGVuZGluZy9yZXN1bWluZyBvZiBwbGF0Zm9ybSBkZXZpY2Ugd29ya3MgdG9vLiBTdXNwZW5kL3Jlc3VtZQorICogdmlhIEhDRCBvcGVyYXRpb25zIHZlY3RvciBpcyBub3QgaW1wbGVtZW50ZWQuCisgKgorICogSXNvIHRyYW5zZmVyIHN1cHBvcnQgaXMgbm90IGltcGxlbWVudGVkLiBBZGRpbmcgdGhpcyB3b3VsZCBpbmNsdWRlCisgKiBpbXBsZW1lbnRpbmcgcmVjb3ZlcnkgZnJvbSB0aGUgZmFpbHVyZSB0byBzZXJ2aWNlIHRoZSBwcm9jZXNzZWQgSVRMCisgKiBmaWZvIHJhbSBpbiB0aW1lLCB3aGljaCB3aWxsIGludm9sdmUgY2hpcCByZXNldC4KKyAqCisgKiBUT0RPOgorICsgTW9yZSB0ZXN0aW5nIG9mIHN1c3BlbmQvcmVzdW1lLgorKi8KKworLyoKKyAgSVNQMTE2eCBjaGlwcyByZXF1aXJlIGNlcnRhaW4gZGVsYXlzIGJldHdlZW4gYWNjZXNzZXMgdG8gaXRzCisgIHJlZ2lzdGVycy4gVGhlIGZvbGxvd2luZyB0aW1pbmcgb3B0aW9ucyBleGlzdC4KKworICAxLiBDb25maWd1cmUgeW91ciBtZW1vcnkgY29udHJvbGxlciAodGhlIGJlc3QpCisgIDIuIEltcGxlbWVudCBwbGF0Zm9ybS1zcGVjaWZpYyBkZWxheSBmdW5jdGlvbiBwb3NzaWJseQorICBjb21iaW5lZCB3aXRoIGNvbmZpZ3VyaW5nIHRoZSBtZW1vcnkgY29udHJvbGxlcjsgc2VlCisgIGluY2x1ZGUvbGludXgvdXNiLWlzcDExNnguaCBmb3IgbW9yZSBpbmZvLiBTb21lIGJyb2tlbgorICBtZW1vcnkgY29udHJvbGxlcnMgbGluZSBMSDdBNDAwIFNNQyBuZWVkIHRoaXMuIEFsc28sCisgIHVuY29tbWVudCBmb3IgdGhhdCB0byB3b3JrIHRoZSBmb2xsb3dpbmcKKyAgVVNFX1BMQVRGT1JNX0RFTEFZIG1hY3JvLgorICAzLiBVc2UgbmRlbGF5IChlYXNpZXN0LCBwb29yZXN0KS4gRm9yIHRoYXQsIHVuY29tbWVudAorICB0aGUgZm9sbG93aW5nIFVTRV9OREVMQVkgbWFjcm8uCisqLworI2RlZmluZSBVU0VfUExBVEZPUk1fREVMQVkKKy8vI2RlZmluZSBVU0VfTkRFTEFZCisKKy8vI2RlZmluZSBERUJVRworLy8jZGVmaW5lIFZFUkJPU0UKKy8qIFRyYW5zZmVyIGRlc2NyaXB0b3JzLiBTZWUgZHVtcF9wdGQoKSBmb3IgcHJpbnRvdXQgZm9ybWF0ICAqLworLy8jZGVmaW5lIFBURF9UUkFDRQorLyogZW5xdWV1aW5nL2ZpbmlzaGluZyBsb2cgb2YgdXJicyAqLworLy8jZGVmaW5lIFVSQl9UUkFDRQorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl9pc3AxMTZ4Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmbmRlZiBERUJVRworIwlkZWZpbmUJU1RVQl9ERUJVR19GSUxFCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2NvcmUvaGNkLmgiCisjaW5jbHVkZSAiaXNwMTE2eC5oIgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwOCBBcHIgMjAwNSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MJIklTUDExNnggVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXIiCisKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1lW10gPSAiaXNwMTE2eC1oY2QiOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAgV3JpdGUgbGVuIGJ5dGVzIHRvIGZpZm8sIHBhZCB0aWxsIDMyLWJpdCBib3VuZGFyeQorICovCitzdGF0aWMgdm9pZCB3cml0ZV9wdGRkYXRhX3RvX2ZpZm8oc3RydWN0IGlzcDExNnggKmlzcDExNngsIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwl1OCAqZHAgPSAodTggKikgYnVmOworCXUxNiAqZHAyID0gKHUxNiAqKSBidWY7CisJdTE2IHc7CisJaW50IHF1b3QgPSBsZW4gJSA0OworCisJaWYgKCh1bnNpZ25lZCBsb25nKWRwMiAmIDEpIHsKKwkJLyogbm90IGFsaWduZWQgKi8KKwkJZm9yICg7IGxlbiA+IDE7IGxlbiAtPSAyKSB7CisJCQl3ID0gKmRwKys7CisJCQl3IHw9ICpkcCsrIDw8IDg7CisJCQlpc3AxMTZ4X3Jhd193cml0ZV9kYXRhMTYoaXNwMTE2eCwgdyk7CisJCX0KKwkJaWYgKGxlbikKKwkJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsICh1MTYpICogZHApOworCX0gZWxzZSB7CisJCS8qIGFsaWduZWQgKi8KKwkJZm9yICg7IGxlbiA+IDE7IGxlbiAtPSAyKQorCQkJaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KGlzcDExNngsICpkcDIrKyk7CisJCWlmIChsZW4pCisJCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCAweGZmICYgKigodTggKikgZHAyKSk7CisJfQorCWlmIChxdW90ID09IDEgfHwgcXVvdCA9PSAyKQorCQlpc3AxMTZ4X3Jhd193cml0ZV9kYXRhMTYoaXNwMTE2eCwgMCk7Cit9CisKKy8qCisgIFJlYWQgbGVuIGJ5dGVzIGZyb20gZmlmbyBhbmQgdGhlbiByZWFkIHRpbGwgMzItYml0IGJvdW5kYXJ5LgorICovCitzdGF0aWMgdm9pZCByZWFkX3B0ZGRhdGFfZnJvbV9maWZvKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdTggKmRwID0gKHU4ICopIGJ1ZjsKKwl1MTYgKmRwMiA9ICh1MTYgKikgYnVmOworCXUxNiB3OworCWludCBxdW90ID0gbGVuICUgNDsKKworCWlmICgodW5zaWduZWQgbG9uZylkcDIgJiAxKSB7CisJCS8qIG5vdCBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikgeworCQkJdyA9IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQkJKmRwKysgPSB3ICYgMHhmZjsKKwkJCSpkcCsrID0gKHcgPj4gOCkgJiAweGZmOworCQl9CisJCWlmIChsZW4pCisJCQkqZHAgPSAweGZmICYgaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwl9IGVsc2UgeworCQkvKiBhbGlnbmVkICovCisJCWZvciAoOyBsZW4gPiAxOyBsZW4gLT0gMikKKwkJCSpkcDIrKyA9IGlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlpZiAobGVuKQorCQkJKih1OCAqKSBkcDIgPSAweGZmICYgaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwl9CisJaWYgKHF1b3QgPT0gMSB8fCBxdW90ID09IDIpCisJCWlzcDExNnhfcmF3X3JlYWRfZGF0YTE2KGlzcDExNngpOworfQorCisvKgorICBXcml0ZSBwdGQncyBhbmQgZGF0YSBmb3Igc2NoZWR1bGVkIHRyYW5zZmVycyBpbnRvCisgIHRoZSBmaWZvIHJhbS4gRmlmbyBtdXN0IGJlIGVtcHR5IGFuZCByZWFkeS4KKyovCitzdGF0aWMgdm9pZCBwYWNrX2ZpZm8oc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwOworCXN0cnVjdCBwdGQgKnB0ZDsKKwlpbnQgYnVmbGVuID0gaXNwMTE2eC0+YXRsX2xhc3RfZGlyID09IFBURF9ESVJfSU4KKwkgICAgPyBpc3AxMTZ4LT5hdGxfYnVmc2hydCA6IGlzcDExNngtPmF0bF9idWZsZW47CisJaW50IHB0ZF9jb3VudCA9IDA7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIEhDdVBJTlRfQUlJRU9UKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDWEZFUkNUUiwgYnVmbGVuKTsKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgSENBVExQT1JUIHwgSVNQMTE2eF9XUklURV9PRkZTRVQpOworCWZvciAoZXAgPSBpc3AxMTZ4LT5hdGxfYWN0aXZlOyBlcDsgZXAgPSBlcC0+YWN0aXZlKSB7CisJCSsrcHRkX2NvdW50OworCQlwdGQgPSAmZXAtPnB0ZDsKKwkJZHVtcF9wdGQocHRkKTsKKwkJZHVtcF9wdGRfb3V0X2RhdGEocHRkLCBlcC0+ZGF0YSk7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZC0+Y291bnQpOworCQlpc3AxMTZ4X3dyaXRlX2RhdGExNihpc3AxMTZ4LCBwdGQtPm1wcyk7CisJCWlzcDExNnhfd3JpdGVfZGF0YTE2KGlzcDExNngsIHB0ZC0+bGVuKTsKKwkJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgcHRkLT5mYWRkcik7CisJCWJ1ZmxlbiAtPSBzaXplb2Yoc3RydWN0IHB0ZCk7CisJCS8qIFNraXAgd3JpdGluZyBkYXRhIGZvciBsYXN0IElOIFBURCAqLworCQlpZiAoZXAtPmFjdGl2ZSB8fCAoaXNwMTE2eC0+YXRsX2xhc3RfZGlyICE9IFBURF9ESVJfSU4pKSB7CisJCQl3cml0ZV9wdGRkYXRhX3RvX2ZpZm8oaXNwMTE2eCwgZXAtPmRhdGEsIGVwLT5sZW5ndGgpOworCQkJYnVmbGVuIC09IEFMSUdOKGVwLT5sZW5ndGgsIDQpOworCQl9CisJfQorCUJVR19PTihidWZsZW4pOworfQorCisvKgorICBSZWFkIHRoZSBwcm9jZXNzZWQgcHRkJ3MgYW5kIGRhdGEgZnJvbSBmaWZvIHJhbSBiYWNrIHRvCisgIFVSQnMnIGJ1ZmZlcnMuIEZpZm8gbXVzdCBiZSBmdWxsIGFuZCBkb25lCisqLworc3RhdGljIHZvaWQgdW5wYWNrX2ZpZm8oc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwOworCXN0cnVjdCBwdGQgKnB0ZDsKKwlpbnQgYnVmbGVuID0gaXNwMTE2eC0+YXRsX2xhc3RfZGlyID09IFBURF9ESVJfSU4KKwkgICAgPyBpc3AxMTZ4LT5hdGxfYnVmbGVuIDogaXNwMTE2eC0+YXRsX2J1ZnNocnQ7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIEhDdVBJTlRfQUlJRU9UKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDWEZFUkNUUiwgYnVmbGVuKTsKKwlpc3AxMTZ4X3dyaXRlX2FkZHIoaXNwMTE2eCwgSENBVExQT1JUKTsKKwlmb3IgKGVwID0gaXNwMTE2eC0+YXRsX2FjdGl2ZTsgZXA7IGVwID0gZXAtPmFjdGl2ZSkgeworCQlwdGQgPSAmZXAtPnB0ZDsKKwkJcHRkLT5jb3VudCA9IGlzcDExNnhfcmVhZF9kYXRhMTYoaXNwMTE2eCk7CisJCXB0ZC0+bXBzID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJcHRkLT5sZW4gPSBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworCQlwdGQtPmZhZGRyID0gaXNwMTE2eF9yZWFkX2RhdGExNihpc3AxMTZ4KTsKKwkJYnVmbGVuIC09IHNpemVvZihzdHJ1Y3QgcHRkKTsKKwkJLyogU2tpcCByZWFkaW5nIGRhdGEgZm9yIGxhc3QgU2V0dXAgb3IgT3V0IFBURCAqLworCQlpZiAoZXAtPmFjdGl2ZSB8fCAoaXNwMTE2eC0+YXRsX2xhc3RfZGlyID09IFBURF9ESVJfSU4pKSB7CisJCQlyZWFkX3B0ZGRhdGFfZnJvbV9maWZvKGlzcDExNngsIGVwLT5kYXRhLCBlcC0+bGVuZ3RoKTsKKwkJCWJ1ZmxlbiAtPSBBTElHTihlcC0+bGVuZ3RoLCA0KTsKKwkJfQorCQlkdW1wX3B0ZChwdGQpOworCQlkdW1wX3B0ZF9pbl9kYXRhKHB0ZCwgZXAtPmRhdGEpOworCX0KKwlCVUdfT04oYnVmbGVuKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICBTZXQgdXAgUFREJ3MuCisqLworc3RhdGljIHZvaWQgcHJlcHJvY19hdGxfcXVldWUoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwOworCXN0cnVjdCB1cmIgKnVyYjsKKwlzdHJ1Y3QgcHRkICpwdGQ7CisJdTE2IHRvZ2dsZSA9IDAsIGRpciA9IFBURF9ESVJfU0VUVVAsIGxlbjsKKworCWZvciAoZXAgPSBpc3AxMTZ4LT5hdGxfYWN0aXZlOyBlcDsgZXAgPSBlcC0+YWN0aXZlKSB7CisJCUJVR19PTihsaXN0X2VtcHR5KCZlcC0+aGVwLT51cmJfbGlzdCkpOworCQl1cmIgPSBjb250YWluZXJfb2YoZXAtPmhlcC0+dXJiX2xpc3QubmV4dCwKKwkJCQkgICBzdHJ1Y3QgdXJiLCB1cmJfbGlzdCk7CisJCXB0ZCA9ICZlcC0+cHRkOworCQlsZW4gPSBlcC0+bGVuZ3RoOworCQlzcGluX2xvY2soJnVyYi0+bG9jayk7CisJCWVwLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKil1cmItPnRyYW5zZmVyX2J1ZmZlcgorCQkgICAgKyB1cmItPmFjdHVhbF9sZW5ndGg7CisKKwkJc3dpdGNoIChlcC0+bmV4dHBpZCkgeworCQljYXNlIFVTQl9QSURfSU46CisJCQl0b2dnbGUgPSB1c2JfZ2V0dG9nZ2xlKHVyYi0+ZGV2LCBlcC0+ZXBudW0sIDApOworCQkJZGlyID0gUFREX0RJUl9JTjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfT1VUOgorCQkJdG9nZ2xlID0gdXNiX2dldHRvZ2dsZSh1cmItPmRldiwgZXAtPmVwbnVtLCAxKTsKKwkJCWRpciA9IFBURF9ESVJfT1VUOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BJRF9TRVRVUDoKKwkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KTsKKwkJCWVwLT5kYXRhID0gdXJiLT5zZXR1cF9wYWNrZXQ7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUElEX0FDSzoKKwkJCXRvZ2dsZSA9IDE7CisJCQlsZW4gPSAwOworCQkJZGlyID0gKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aAorCQkJICAgICAgICYmIHVzYl9waXBlaW4odXJiLT5waXBlKSkKKwkJCSAgICA/IFBURF9ESVJfT1VUIDogUFREX0RJUl9JTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRVJSKCIlcyAlZDogZXAtPm5leHRwaWQgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJCSAgICBlcC0+bmV4dHBpZCk7CisJCQlCVUcoKTsKKwkJfQorCisJCXB0ZC0+Y291bnQgPSBQVERfQ0NfTVNLIHwgUFREX0FDVElWRV9NU0sgfCBQVERfVE9HR0xFKHRvZ2dsZSk7CisJCXB0ZC0+bXBzID0gUFREX01QUyhlcC0+bWF4cGFja2V0KQorCQkgICAgfCBQVERfU1BEKHVyYi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfTE9XKQorCQkgICAgfCBQVERfRVAoZXAtPmVwbnVtKTsKKwkJcHRkLT5sZW4gPSBQVERfTEVOKGxlbikgfCBQVERfRElSKGRpcik7CisJCXB0ZC0+ZmFkZHIgPSBQVERfRkEodXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSk7CisJCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOworCQlpZiAoIWVwLT5hY3RpdmUpIHsKKwkJCXB0ZC0+bXBzIHw9IFBURF9MQVNUX01TSzsKKwkJCWlzcDExNngtPmF0bF9sYXN0X2RpciA9IGRpcjsKKwkJfQorCQlpc3AxMTZ4LT5hdGxfYnVmc2hydCA9IHNpemVvZihzdHJ1Y3QgcHRkKSArIGlzcDExNngtPmF0bF9idWZsZW47CisJCWlzcDExNngtPmF0bF9idWZsZW4gPSBpc3AxMTZ4LT5hdGxfYnVmc2hydCArIEFMSUdOKGxlbiwgNCk7CisJfQorfQorCisvKgorICBBbmFseXplIHRyYW5zZmVyIHJlc3VsdHMsIGhhbmRsZSBwYXJ0aWFsIHRyYW5zZmVycyBhbmQgZXJyb3JzCisqLworc3RhdGljIHZvaWQgcG9zdHByb2NfYXRsX3F1ZXVlKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXN0cnVjdCBpc3AxMTZ4X2VwICplcDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHB0ZCAqcHRkOworCWludCBzaG9ydF9ub3Rfb2s7CisJdTggY2M7CisKKwlmb3IgKGVwID0gaXNwMTE2eC0+YXRsX2FjdGl2ZTsgZXA7IGVwID0gZXAtPmFjdGl2ZSkgeworCQlCVUdfT04obGlzdF9lbXB0eSgmZXAtPmhlcC0+dXJiX2xpc3QpKTsKKwkJdXJiID0KKwkJICAgIGNvbnRhaW5lcl9vZihlcC0+aGVwLT51cmJfbGlzdC5uZXh0LCBzdHJ1Y3QgdXJiLCB1cmJfbGlzdCk7CisJCXVkZXYgPSB1cmItPmRldjsKKwkJcHRkID0gJmVwLT5wdGQ7CisJCWNjID0gUFREX0dFVF9DQyhwdGQpOworCisJCXNwaW5fbG9jaygmdXJiLT5sb2NrKTsKKwkJc2hvcnRfbm90X29rID0gMTsKKworCQkvKiBEYXRhIHVuZGVycnVuIGlzIHNwZWNpYWwuIEZvciBhbGxvd2VkIHVuZGVycnVuCisJCSAgIHdlIGNsZWFyIHRoZSBlcnJvciBhbmQgY29udGludWUgYXMgbm9ybWFsLiBGb3IKKwkJICAgZm9yYmlkZGVuIHVuZGVycnVuIHdlIGZpbmlzaCB0aGUgREFUQSBzdGFnZQorCQkgICBpbW1lZGlhdGVseSB3aGlsZSBmb3IgY29udHJvbCB0cmFuc2ZlciwKKwkJICAgd2UgZG8gYSBTVEFUVVMgc3RhZ2UuICovCisJCWlmIChjYyA9PSBURF9EQVRBVU5ERVJSVU4pIHsKKwkJCWlmICghKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSkgeworCQkJCURCRygiQWxsb3dlZCBkYXRhIHVuZGVycnVuXG4iKTsKKwkJCQljYyA9IFREX0NDX05PRVJST1I7CisJCQkJc2hvcnRfbm90X29rID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZXAtPmVycm9yX2NvdW50ID0gMTsKKwkJCQlpZiAodXNiX3BpcGVjb250cm9sKHVyYi0+cGlwZSkpCisJCQkJCWVwLT5uZXh0cGlkID0gVVNCX1BJRF9BQ0s7CisJCQkJZWxzZQorCQkJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYsIGVwLT5lcG51bSwKKwkJCQkJCSAgICAgIGVwLT5uZXh0cGlkID09CisJCQkJCQkgICAgICBVU0JfUElEX09VVCwKKwkJCQkJCSAgICAgIFBURF9HRVRfVE9HR0xFKHB0ZCkgXiAxKTsKKwkJCQl1cmItPnN0YXR1cyA9IGNjX3RvX2Vycm9yW1REX0RBVEFVTkRFUlJVTl07CisJCQkJc3Bpbl91bmxvY2soJnVyYi0+bG9jayk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogS2VlcCB1bmRlcnJ1biBlcnJvciB0aHJvdWdoIHRoZSBTVEFUVVMgc3RhZ2UgKi8KKwkJaWYgKHVyYi0+c3RhdHVzID09IGNjX3RvX2Vycm9yW1REX0RBVEFVTkRFUlJVTl0pCisJCQljYyA9IFREX0RBVEFVTkRFUlJVTjsKKworCQlpZiAoY2MgIT0gVERfQ0NfTk9FUlJPUiAmJiBjYyAhPSBURF9OT1RBQ0NFU1NFRAorCQkgICAgJiYgKCsrZXAtPmVycm9yX2NvdW50ID49IDMgfHwgY2MgPT0gVERfQ0NfU1RBTEwKKwkJCXx8IGNjID09IFREX0RBVEFPVkVSUlVOKSkgeworCQkJaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJCQl1cmItPnN0YXR1cyA9IGNjX3RvX2Vycm9yW2NjXTsKKwkJCWlmIChlcC0+bmV4dHBpZCA9PSBVU0JfUElEX0FDSykKKwkJCQllcC0+bmV4dHBpZCA9IDA7CisJCQlzcGluX3VubG9jaygmdXJiLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEFjY29yZGluZyB0byB1c2Igc3BlYywgemVyby1sZW5ndGggSW50IHRyYW5zZmVyIHNpZ25hbHMKKwkJICAgZmluaXNoaW5nIG9mIHRoZSB1cmIuIEhleSwgZG9lcyB0aGlzIGFwcGx5IG9ubHkKKwkJICAgZm9yIElOIGVuZHBvaW50cz8gKi8KKwkJaWYgKHVzYl9waXBlaW50KHVyYi0+cGlwZSkgJiYgIVBURF9HRVRfTEVOKHB0ZCkpIHsKKwkJCWlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCQkJdXJiLT5zdGF0dXMgPSAwOworCQkJc3Bpbl91bmxvY2soJnVyYi0+bG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJlbGF4IGFmdGVyIHByZXZpb3VzbHkgZmFpbGVkLCBidXQgbGF0ZXIgc3VjY2VlZGVkCisJCSAgIG9yIGNvcnJlY3RseSBOQUsnZWQgcmV0cmFuc21pc3Npb24gYXR0ZW1wdCAqLworCQlpZiAoZXAtPmVycm9yX2NvdW50CisJCSAgICAmJiAoY2MgPT0gVERfQ0NfTk9FUlJPUiB8fCBjYyA9PSBURF9OT1RBQ0NFU1NFRCkpCisJCQllcC0+ZXJyb3JfY291bnQgPSAwOworCisJCS8qIFRha2UgaW50byBhY2NvdW50IGlkaW9zeW5jcmFjaWVzIG9mIHRoZSBpc3AxMTZ4IGNoaXAKKwkJICAgcmVnYXJkaW5nIHRvZ2dsZSBiaXQgZm9yIGZhaWxlZCB0cmFuc2ZlcnMgKi8KKwkJaWYgKGVwLT5uZXh0cGlkID09IFVTQl9QSURfT1VUKQorCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LCBlcC0+ZXBudW0sIDEsIFBURF9HRVRfVE9HR0xFKHB0ZCkKKwkJCQkgICAgICBeIChlcC0+ZXJyb3JfY291bnQgPiAwKSk7CisJCWVsc2UgaWYgKGVwLT5uZXh0cGlkID09IFVTQl9QSURfSU4pCisJCQl1c2Jfc2V0dG9nZ2xlKHVkZXYsIGVwLT5lcG51bSwgMCwgUFREX0dFVF9UT0dHTEUocHRkKQorCQkJCSAgICAgIF4gKGVwLT5lcnJvcl9jb3VudCA+IDApKTsKKworCQlzd2l0Y2ggKGVwLT5uZXh0cGlkKSB7CisJCWNhc2UgVVNCX1BJRF9JTjoKKwkJY2FzZSBVU0JfUElEX09VVDoKKwkJCXVyYi0+YWN0dWFsX2xlbmd0aCArPSBQVERfR0VUX0NPVU5UKHB0ZCk7CisJCQlpZiAoUFREX0dFVF9BQ1RJVkUocHRkKQorCQkJICAgIHx8IChjYyAhPSBURF9DQ19OT0VSUk9SICYmIGNjIDwgMHgwRSkpCisJCQkJYnJlYWs7CisJCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoICE9IHVyYi0+YWN0dWFsX2xlbmd0aCkgeworCQkJCWlmIChzaG9ydF9ub3Rfb2spCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9aRVJPX1BBQ0tFVAorCQkJCSAgICAmJiBlcC0+bmV4dHBpZCA9PSBVU0JfUElEX09VVAorCQkJCSAgICAmJiAhKFBURF9HRVRfQ09VTlQocHRkKSAlIGVwLT5tYXhwYWNrZXQpKSB7CisJCQkJCURCRygiWmVybyBwYWNrZXQgcmVxdWVzdGVkXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJLyogQWxsIGRhdGEgZm9yIHRoaXMgVVJCIGlzIHRyYW5zZmVycmVkLCBsZXQncyBmaW5pc2ggKi8KKwkJCWlmICh1c2JfcGlwZWNvbnRyb2wodXJiLT5waXBlKSkKKwkJCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfQUNLOworCQkJZWxzZSBpZiAodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfU0VUVVA6CisJCQlpZiAoUFREX0dFVF9BQ1RJVkUocHRkKQorCQkJICAgIHx8IChjYyAhPSBURF9DQ19OT0VSUk9SICYmIGNjIDwgMHgwRSkpCisJCQkJYnJlYWs7CisJCQlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID09IHVyYi0+YWN0dWFsX2xlbmd0aCkKKwkJCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfQUNLOworCQkJZWxzZSBpZiAodXNiX3BpcGVvdXQodXJiLT5waXBlKSkgeworCQkJCXVzYl9zZXR0b2dnbGUodWRldiwgMCwgMSwgMSk7CisJCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX09VVDsKKwkJCX0gZWxzZSB7CisJCQkJdXNiX3NldHRvZ2dsZSh1ZGV2LCAwLCAwLCAxKTsKKwkJCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfSU47CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUElEX0FDSzoKKwkJCWlmIChQVERfR0VUX0FDVElWRShwdGQpCisJCQkgICAgfHwgKGNjICE9IFREX0NDX05PRVJST1IgJiYgY2MgPCAweDBFKSkKKwkJCQlicmVhazsKKwkJCWlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCQkJdXJiLT5zdGF0dXMgPSAwOworCQkJZXAtPm5leHRwaWQgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUdfT04oMSk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnVyYi0+bG9jayk7CisJfQorfQorCisvKgorICBUYWtlIGRvbmUgb3IgZmFpbGVkIHJlcXVlc3RzIG91dCBvZiBzY2hlZHVsZS4gR2l2ZSBiYWNrCisgIHByb2Nlc3NlZCB1cmJzLgorKi8KK3N0YXRpYyB2b2lkIGZpbmlzaF9yZXF1ZXN0KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCBzdHJ1Y3QgaXNwMTE2eF9lcCAqZXAsCisJCQkgICBzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorX19yZWxlYXNlcyhpc3AxMTZ4LT5sb2NrKSBfX2FjcXVpcmVzKGlzcDExNngtPmxvY2spCit7CisJdW5zaWduZWQgaTsKKworCXVyYi0+aGNwcml2ID0gTlVMTDsKKwllcC0+ZXJyb3JfY291bnQgPSAwOworCisJaWYgKHVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpKQorCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfU0VUVVA7CisKKwl1cmJfZGJnKHVyYiwgIkZpbmlzaCIpOworCisJc3Bpbl91bmxvY2soJmlzcDExNngtPmxvY2spOworCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGlzcDExNnhfdG9faGNkKGlzcDExNngpLCB1cmIsIHJlZ3MpOworCXNwaW5fbG9jaygmaXNwMTE2eC0+bG9jayk7CisKKwkvKiB0YWtlIGlkbGUgZW5kcG9pbnRzIG91dCBvZiB0aGUgc2NoZWR1bGUgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5oZXAtPnVyYl9saXN0KSkKKwkJcmV0dXJuOworCisJLyogYXN5bmMgZGVzY2hlZHVsZSAqLworCWlmICghbGlzdF9lbXB0eSgmZXAtPnNjaGVkdWxlKSkgeworCQlsaXN0X2RlbF9pbml0KCZlcC0+c2NoZWR1bGUpOworCQlyZXR1cm47CisJfQorCisJLyogcGVyaW9kaWMgZGVzY2hlZHVsZSAqLworCURCRygiZGVzY2hlZHVsZSBxaCVkLyVwIGJyYW5jaCAlZFxuIiwgZXAtPnBlcmlvZCwgZXAsIGVwLT5icmFuY2gpOworCWZvciAoaSA9IGVwLT5icmFuY2g7IGkgPCBQRVJJT0RJQ19TSVpFOyBpICs9IGVwLT5wZXJpb2QpIHsKKwkJc3RydWN0IGlzcDExNnhfZXAgKnRlbXA7CisJCXN0cnVjdCBpc3AxMTZ4X2VwICoqcHJldiA9ICZpc3AxMTZ4LT5wZXJpb2RpY1tpXTsKKworCQl3aGlsZSAoKnByZXYgJiYgKCh0ZW1wID0gKnByZXYpICE9IGVwKSkKKwkJCXByZXYgPSAmdGVtcC0+bmV4dDsKKwkJaWYgKCpwcmV2KQorCQkJKnByZXYgPSBlcC0+bmV4dDsKKwkJaXNwMTE2eC0+bG9hZFtpXSAtPSBlcC0+bG9hZDsKKwl9CisJZXAtPmJyYW5jaCA9IFBFUklPRElDX1NJWkU7CisJaXNwMTE2eF90b19oY2QoaXNwMTE2eCktPnNlbGYuYmFuZHdpZHRoX2FsbG9jYXRlZCAtPQorCSAgICBlcC0+bG9hZCAvIGVwLT5wZXJpb2Q7CisKKwkvKiBzd2l0Y2ggaXJxIHR5cGU/ICovCisJaWYgKCEtLWlzcDExNngtPnBlcmlvZGljX2NvdW50KSB7CisJCWlzcDExNngtPmlycWVuYiAmPSB+SEN1UElOVF9TT0Y7CisJCWlzcDExNngtPmlycWVuYiB8PSBIQ3VQSU5UX0FUTDsKKwl9Cit9CisKKy8qCisgIFNjYW4gdHJhbnNmZXIgbGlzdHMsIHNjaGVkdWxlIHRyYW5zZmVycywgc2VuZCBkYXRhIG9mZgorICB0byBjaGlwLgorICovCitzdGF0aWMgdm9pZCBzdGFydF9hdGxfdHJhbnNmZXJzKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCXN0cnVjdCBpc3AxMTZ4X2VwICpsYXN0X2VwID0gTlVMTCwgKmVwOworCXN0cnVjdCB1cmIgKnVyYjsKKwl1MTYgbG9hZCA9IDA7CisJaW50IGxlbiwgaW5kZXgsIHNwZWVkLCBieXRlX3RpbWU7CisKKwlpZiAoYXRvbWljX3JlYWQoJmlzcDExNngtPmF0bF9maW5pc2hpbmcpKQorCQlyZXR1cm47CisKKwlpZiAoIUhDX0lTX1JVTk5JTkcoaXNwMTE2eF90b19oY2QoaXNwMTE2eCktPnN0YXRlKSkKKwkJcmV0dXJuOworCisJLyogRklGTyBub3QgZW1wdHk/ICovCisJaWYgKGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ0JVRlNUQVQpICYgSENCVUZTVEFUX0FUTF9GVUxMKQorCQlyZXR1cm47CisKKwlpc3AxMTZ4LT5hdGxfYWN0aXZlID0gTlVMTDsKKwlpc3AxMTZ4LT5hdGxfYnVmbGVuID0gaXNwMTE2eC0+YXRsX2J1ZnNocnQgPSAwOworCisJLyogU2NoZWR1bGUgaW50IHRyYW5zZmVycyAqLworCWlmIChpc3AxMTZ4LT5wZXJpb2RpY19jb3VudCkgeworCQlpc3AxMTZ4LT5mbWluZGV4ID0gaW5kZXggPQorCQkgICAgKGlzcDExNngtPmZtaW5kZXggKyAxKSAmIChQRVJJT0RJQ19TSVpFIC0gMSk7CisJCWlmICgobG9hZCA9IGlzcDExNngtPmxvYWRbaW5kZXhdKSkgeworCQkJLyogQnJpbmcgYWxsIGludCB0cmFuc2ZlcnMgZm9yIHRoaXMgZnJhbWUKKwkJCSAgIGludG8gdGhlIGFjdGl2ZSBxdWV1ZSAqLworCQkJaXNwMTE2eC0+YXRsX2FjdGl2ZSA9IGxhc3RfZXAgPQorCQkJICAgIGlzcDExNngtPnBlcmlvZGljW2luZGV4XTsKKwkJCXdoaWxlIChsYXN0X2VwLT5uZXh0KQorCQkJCWxhc3RfZXAgPSAobGFzdF9lcC0+YWN0aXZlID0gbGFzdF9lcC0+bmV4dCk7CisJCQlsYXN0X2VwLT5hY3RpdmUgPSBOVUxMOworCQl9CisJfQorCisJLyogU2NoZWR1bGUgY29udHJvbC9idWxrIHRyYW5zZmVycyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXAsICZpc3AxMTZ4LT5hc3luYywgc2NoZWR1bGUpIHsKKwkJdXJiID0gY29udGFpbmVyX29mKGVwLT5oZXAtPnVyYl9saXN0Lm5leHQsCisJCQkJICAgc3RydWN0IHVyYiwgdXJiX2xpc3QpOworCQlzcGVlZCA9IHVyYi0+ZGV2LT5zcGVlZDsKKwkJYnl0ZV90aW1lID0gc3BlZWQgPT0gVVNCX1NQRUVEX0xPVworCQkgICAgPyBCWVRFX1RJTUVfTE9XU1BFRUQgOiBCWVRFX1RJTUVfRlVMTFNQRUVEOworCisJCWlmIChlcC0+bmV4dHBpZCA9PSBVU0JfUElEX1NFVFVQKSB7CisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCk7CisJCX0gZWxzZSBpZiAoZXAtPm5leHRwaWQgPT0gVVNCX1BJRF9BQ0spIHsKKwkJCWxlbiA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBGaW5kIGN1cnJlbnQgZnJlZSBsZW5ndGggLi4uICovCisJCQlsZW4gPSAoTUFYX0xPQURfTElNSVQgLSBsb2FkKSAvIGJ5dGVfdGltZTsKKworCQkJLyogLi4uIHRoZW4gbGltaXQgaXQgdG8gY29uZmlndXJlZCBtYXggc2l6ZSAuLi4gKi8KKwkJCWxlbiA9IG1pbihsZW4sIHNwZWVkID09IFVTQl9TUEVFRF9MT1cgPworCQkJCSAgTUFYX1RSQU5TRkVSX1NJWkVfTE9XU1BFRUQgOgorCQkJCSAgTUFYX1RSQU5TRkVSX1NJWkVfRlVMTFNQRUVEKTsKKworCQkJLyogLi4uIGFuZCBmaW5hbGx5IGN1dCB0byB0aGUgbXVsdGlwbGUgb2YgTWF4UGFja2V0U2l6ZSwKKwkJCSAgIG9yIHRvIHRoZSByZWFsIGxlbmd0aCBpZiB0aGVyZSdzIGVub3VnaCByb29tLiAqLworCQkJaWYgKGxlbiA8CisJCQkgICAgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtCisJCQkgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCkpIHsKKwkJCQlsZW4gLT0gbGVuICUgZXAtPm1heHBhY2tldDsKKwkJCQlpZiAoIWxlbikKKwkJCQkJY29udGludWU7CisJCQl9IGVsc2UKKwkJCQlsZW4gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggLQorCQkJCSAgICB1cmItPmFjdHVhbF9sZW5ndGg7CisJCQlCVUdfT04obGVuIDwgMCk7CisJCX0KKworCQlsb2FkICs9IGxlbiAqIGJ5dGVfdGltZTsKKwkJaWYgKGxvYWQgPiBNQVhfTE9BRF9MSU1JVCkKKwkJCWJyZWFrOworCisJCWVwLT5hY3RpdmUgPSBOVUxMOworCQllcC0+bGVuZ3RoID0gbGVuOworCQlpZiAobGFzdF9lcCkKKwkJCWxhc3RfZXAtPmFjdGl2ZSA9IGVwOworCQllbHNlCisJCQlpc3AxMTZ4LT5hdGxfYWN0aXZlID0gZXA7CisJCWxhc3RfZXAgPSBlcDsKKwl9CisKKwkvKiBBdm9pZCBzdGFydmluZyBvZiBlbmRwb2ludHMgKi8KKwlpZiAoKCZpc3AxMTZ4LT5hc3luYyktPm5leHQgIT0gKCZpc3AxMTZ4LT5hc3luYyktPnByZXYpCisJCWxpc3RfbW92ZSgmaXNwMTE2eC0+YXN5bmMsICgmaXNwMTE2eC0+YXN5bmMpLT5uZXh0KTsKKworCWlmIChpc3AxMTZ4LT5hdGxfYWN0aXZlKSB7CisJCXByZXByb2NfYXRsX3F1ZXVlKGlzcDExNngpOworCQlwYWNrX2ZpZm8oaXNwMTE2eCk7CisJfQorfQorCisvKgorICBGaW5pc2ggdGhlIHByb2Nlc3NlZCB0cmFuc2ZlcnMKKyovCitzdGF0aWMgdm9pZCBmaW5pc2hfYXRsX3RyYW5zZmVycyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwOworCXN0cnVjdCB1cmIgKnVyYjsKKworCWlmICghaXNwMTE2eC0+YXRsX2FjdGl2ZSkKKwkJcmV0dXJuOworCS8qIEZpZm8gbm90IHJlYWR5PyAqLworCWlmICghKGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ0JVRlNUQVQpICYgSENCVUZTVEFUX0FUTF9ET05FKSkKKwkJcmV0dXJuOworCisJYXRvbWljX2luYygmaXNwMTE2eC0+YXRsX2ZpbmlzaGluZyk7CisJdW5wYWNrX2ZpZm8oaXNwMTE2eCk7CisJcG9zdHByb2NfYXRsX3F1ZXVlKGlzcDExNngpOworCWZvciAoZXAgPSBpc3AxMTZ4LT5hdGxfYWN0aXZlOyBlcDsgZXAgPSBlcC0+YWN0aXZlKSB7CisJCXVyYiA9CisJCSAgICBjb250YWluZXJfb2YoZXAtPmhlcC0+dXJiX2xpc3QubmV4dCwgc3RydWN0IHVyYiwgdXJiX2xpc3QpOworCQkvKiBVU0JfUElEX0FDSyBjaGVjayBoZXJlIGF2b2lkcyBmaW5pc2hpbmcgb2YKKwkJICAgY29udHJvbCB0cmFuc2ZlcnMsIGZvciB3aGljaCBURF9EQVRBVU5ERVJSVU4KKwkJICAgb2NjdXJlZCwgd2hpbGUgVVJCX1NIT1JUX05PVF9PSyB3YXMgc2V0ICovCisJCWlmICh1cmIgJiYgdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTCisJCSAgICAmJiBlcC0+bmV4dHBpZCAhPSBVU0JfUElEX0FDSykKKwkJCWZpbmlzaF9yZXF1ZXN0KGlzcDExNngsIGVwLCB1cmIsIHJlZ3MpOworCX0KKwlhdG9taWNfZGVjKCZpc3AxMTZ4LT5hdGxfZmluaXNoaW5nKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlzcDExNnhfaXJxKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwl1MTYgaXJxc3RhdDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmaXNwMTE2eC0+bG9jayk7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5URU5CLCAwKTsKKwlpcnFzdGF0ID0gaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDdVBJTlQpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCwgaXJxc3RhdCk7CisKKwlpZiAoaXJxc3RhdCAmIChIQ3VQSU5UX0FUTCB8IEhDdVBJTlRfU09GKSkgeworCQlyZXQgPSBJUlFfSEFORExFRDsKKwkJZmluaXNoX2F0bF90cmFuc2ZlcnMoaXNwMTE2eCwgcmVncyk7CisJfQorCisJaWYgKGlycXN0YXQgJiBIQ3VQSU5UX09QUikgeworCQl1MzIgaW50c3RhdCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0lOVFNUQVQpOworCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDSU5UU1RBVCwgaW50c3RhdCk7CisJCWlmIChpbnRzdGF0ICYgSENJTlRfVUUpIHsKKwkJCUVSUigiVW5yZWNvdmVyYWJsZSBlcnJvclxuIik7CisJCQkvKiBXaGF0IHNob3VsZCB3ZSBkbyBoZXJlPyBSZXNldD8gICovCisJCX0KKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9SSFNDKSB7CisJCQlpc3AxMTZ4LT5yaHN0YXR1cyA9CisJCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMpOworCQkJaXNwMTE2eC0+cmhwb3J0WzBdID0KKwkJCSAgICBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFBPUlQxKTsKKwkJCWlzcDExNngtPnJocG9ydFsxXSA9CisJCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMik7CisJCX0KKwkJaWYgKGludHN0YXQgJiBIQ0lOVF9SRCkgeworCQkJREJHKCItLS0tIHJlbW90ZSB3YWtldXBcbiIpOworCQkJc2NoZWR1bGVfd29yaygmaXNwMTE2eC0+cmhfcmVzdW1lKTsKKwkJCXJldCA9IElSUV9IQU5ETEVEOworCQl9CisJCWlycXN0YXQgJj0gfkhDdVBJTlRfT1BSOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAoaXJxc3RhdCAmIChIQ3VQSU5UX0FUTCB8IEhDdVBJTlRfU09GKSkgeworCQlzdGFydF9hdGxfdHJhbnNmZXJzKGlzcDExNngpOworCX0KKworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgaXNwMTE2eC0+aXJxZW5iKTsKKwlzcGluX3VubG9jaygmaXNwMTE2eC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIHVzYiAxLjEgc2F5cyBtYXggOTAlIG9mIGEgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMuCisgKiB0aGlzIGRyaXZlciBkb2Vzbid0IHByb21pc2UgdGhhdCBtdWNoIHNpbmNlIGl0J3MgZ290IHRvIGhhbmRsZSBhbgorICogSVJRIHBlciBwYWNrZXQ7IGlycSBoYW5kbGluZyBsYXRlbmNpZXMgYWxzbyB1c2UgdXAgdGhhdCB0aW1lLgorICovCisKKy8qIG91dCBvZiAxMDAwIHVzICovCisjZGVmaW5lCU1BWF9QRVJJT0RJQ19MT0FECTYwMAorc3RhdGljIGludCBiYWxhbmNlKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MTYgcGVyaW9kLCB1MTYgbG9hZCkKK3sKKwlpbnQgaSwgYnJhbmNoID0gLUVOT1NQQzsKKworCS8qIHNlYXJjaCBmb3IgdGhlIGxlYXN0IGxvYWRlZCBzY2hlZHVsZSBicmFuY2ggb2YgdGhhdCBwZXJpb2QKKwkgICB3aGljaCBoYXMgZW5vdWdoIGJhbmR3aWR0aCBsZWZ0IHVucmVzZXJ2ZWQuICovCisJZm9yIChpID0gMDsgaSA8IHBlcmlvZDsgaSsrKSB7CisJCWlmIChicmFuY2ggPCAwIHx8IGlzcDExNngtPmxvYWRbYnJhbmNoXSA+IGlzcDExNngtPmxvYWRbaV0pIHsKKwkJCWludCBqOworCisJCQlmb3IgKGogPSBpOyBqIDwgUEVSSU9ESUNfU0laRTsgaiArPSBwZXJpb2QpIHsKKwkJCQlpZiAoKGlzcDExNngtPmxvYWRbal0gKyBsb2FkKQorCQkJCSAgICA+IE1BWF9QRVJJT0RJQ19MT0FEKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChqIDwgUEVSSU9ESUNfU0laRSkKKwkJCQljb250aW51ZTsKKwkJCWJyYW5jaCA9IGk7CisJCX0KKwl9CisJcmV0dXJuIGJyYW5jaDsKK30KKworLyogTkIhIEFMTCB0aGUgY29kZSBhYm92ZSB0aGlzIHBvaW50IHJ1bnMgd2l0aCBpc3AxMTZ4LT5sb2NrCisgICBoZWxkLCBpcnFzIG9mZgorKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgaXNwMTE2eF91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJICAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwLCBzdHJ1Y3QgdXJiICp1cmIsCisJCQkgICAgICAgdW5zaWduZWQgbWVtX2ZsYWdzKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHVyYi0+ZGV2OworCXVuc2lnbmVkIGludCBwaXBlID0gdXJiLT5waXBlOworCWludCBpc19vdXQgPSAhdXNiX3BpcGVpbihwaXBlKTsKKwlpbnQgdHlwZSA9IHVzYl9waXBldHlwZShwaXBlKTsKKwlpbnQgZXBudW0gPSB1c2JfcGlwZWVuZHBvaW50KHBpcGUpOworCXN0cnVjdCBpc3AxMTZ4X2VwICplcCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKworCXVyYl9kYmcodXJiLCAiRW5xdWV1ZSIpOworCisJaWYgKHR5cGUgPT0gUElQRV9JU09DSFJPTk9VUykgeworCQlFUlIoIklzb2Nocm9ub3VzIHRyYW5zZmVycyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJdXJiX2RiZyh1cmIsICJSZWZ1c2VkIHRvIGVucXVldWUiKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJLyogYXZvaWQgYWxsIGFsbG9jYXRpb25zIHdpdGhpbiBzcGlubG9ja3M6IHJlcXVlc3Qgb3IgZW5kcG9pbnQgKi8KKwlpZiAoIWhlcC0+aGNwcml2KSB7CisJCWVwID0ga2NhbGxvYygxLCBzaXplb2YgKmVwLCBtZW1fZmxhZ3MpOworCQlpZiAoIWVwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIUhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCWlmIChoZXAtPmhjcHJpdikKKwkJZXAgPSBoZXAtPmhjcHJpdjsKKwllbHNlIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmVwLT5zY2hlZHVsZSk7CisJCWVwLT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CisJCWVwLT5lcG51bSA9IGVwbnVtOworCQllcC0+bWF4cGFja2V0ID0gdXNiX21heHBhY2tldCh1ZGV2LCB1cmItPnBpcGUsIGlzX291dCk7CisJCXVzYl9zZXR0b2dnbGUodWRldiwgZXBudW0sIGlzX291dCwgMCk7CisKKwkJaWYgKHR5cGUgPT0gUElQRV9DT05UUk9MKSB7CisJCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfU0VUVVA7CisJCX0gZWxzZSBpZiAoaXNfb3V0KSB7CisJCQllcC0+bmV4dHBpZCA9IFVTQl9QSURfT1VUOworCQl9IGVsc2UgeworCQkJZXAtPm5leHRwaWQgPSBVU0JfUElEX0lOOworCQl9CisKKwkJaWYgKHVyYi0+aW50ZXJ2YWwpIHsKKwkJCS8qCisJCQkgICBXaXRoIElOVCBVUkJzIHN1Ym1pdHRlZCwgdGhlIGRyaXZlciB3b3JrcyB3aXRoIFNPRgorCQkJICAgaW50ZXJydXB0IGVuYWJsZWQgYW5kIEFUTCBpbnRlcnJ1cHQgZGlzYWJsZWQuIEFmdGVyCisJCQkgICB0aGUgUFREcyBhcmUgd3JpdHRlbiB0byBmaWZvIHJhbSwgdGhlIGNoaXAgc3RhcnRzCisJCQkgICBmaWZvIHByb2Nlc3NpbmcgYW5kIHVzYiB0cmFuc2ZlcnMgYWZ0ZXIgdGhlIG5leHQKKwkJCSAgIFNPRiBhbmQgY29udGludWVzIHVudGlsIHRoZSB0cmFuc2ZlcnMgYXJlIGZpbmlzaGVkCisJCQkgICAoc3VjY2VlZGVkIG9yIGZhaWxlZCkgb3IgdGhlIGZyYW1lIGVuZHMuIFRoZXJlZm9yZSwKKwkJCSAgIHRoZSB0cmFuc2ZlcnMgb2NjdXIgb25seSBpbiBldmVyeSBzZWNvbmQgZnJhbWUsCisJCQkgICB3aGlsZSBmaWZvIHJlYWRpbmcvd3JpdGluZyBhbmQgZGF0YSBwcm9jZXNzaW5nCisJCQkgICBvY2N1ciBpbiBldmVyeSBvdGhlciBzZWNvbmQgZnJhbWUuICovCisJCQlpZiAodXJiLT5pbnRlcnZhbCA8IDIpCisJCQkJdXJiLT5pbnRlcnZhbCA9IDI7CisJCQlpZiAodXJiLT5pbnRlcnZhbCA+IDIgKiBQRVJJT0RJQ19TSVpFKQorCQkJCXVyYi0+aW50ZXJ2YWwgPSAyICogUEVSSU9ESUNfU0laRTsKKwkJCWVwLT5wZXJpb2QgPSB1cmItPmludGVydmFsID4+IDE7CisJCQllcC0+YnJhbmNoID0gUEVSSU9ESUNfU0laRTsKKwkJCWVwLT5sb2FkID0gdXNiX2NhbGNfYnVzX3RpbWUodWRldi0+c3BlZWQsCisJCQkJCQkgICAgICFpc19vdXQsCisJCQkJCQkgICAgICh0eXBlID09IFBJUEVfSVNPQ0hST05PVVMpLAorCQkJCQkJICAgICB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsCisJCQkJCQkJCSAgIGlzX291dCkpIC8KKwkJCSAgICAxMDAwOworCQl9CisJCWhlcC0+aGNwcml2ID0gZXA7CisJCWVwLT5oZXAgPSBoZXA7CisJfQorCisJLyogbWF5YmUgcHV0IGVuZHBvaW50IGludG8gc2NoZWR1bGUgKi8KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFBJUEVfQ09OVFJPTDoKKwljYXNlIFBJUEVfQlVMSzoKKwkJaWYgKGxpc3RfZW1wdHkoJmVwLT5zY2hlZHVsZSkpCisJCQlsaXN0X2FkZF90YWlsKCZlcC0+c2NoZWR1bGUsICZpc3AxMTZ4LT5hc3luYyk7CisJCWJyZWFrOworCWNhc2UgUElQRV9JTlRFUlJVUFQ6CisJCXVyYi0+aW50ZXJ2YWwgPSBlcC0+cGVyaW9kOworCQllcC0+bGVuZ3RoID0gbWluKChpbnQpZXAtPm1heHBhY2tldCwKKwkJCQkgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKworCQkvKiB1cmIgc3VibWl0dGVkIGZvciBhbHJlYWR5IGV4aXN0aW5nIGVuZHBvaW50ICovCisJCWlmIChlcC0+YnJhbmNoIDwgUEVSSU9ESUNfU0laRSkKKwkJCWJyZWFrOworCisJCXJldCA9IGVwLT5icmFuY2ggPSBiYWxhbmNlKGlzcDExNngsIGVwLT5wZXJpb2QsIGVwLT5sb2FkKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZhaWw7CisJCXJldCA9IDA7CisKKwkJdXJiLT5zdGFydF9mcmFtZSA9IChpc3AxMTZ4LT5mbWluZGV4ICYgKFBFUklPRElDX1NJWkUgLSAxKSkKKwkJICAgICsgZXAtPmJyYW5jaDsKKworCQkvKiBzb3J0IGVhY2ggc2NoZWR1bGUgYnJhbmNoIGJ5IHBlcmlvZCAoc2xvdyBiZWZvcmUgZmFzdCkKKwkJICAgdG8gc2hhcmUgdGhlIGZhc3RlciBwYXJ0cyBvZiB0aGUgdHJlZSB3aXRob3V0IG5lZWRpbmcKKwkJICAgZHVtbXkvcGxhY2Vob2xkZXIgbm9kZXMgKi8KKwkJREJHKCJzY2hlZHVsZSBxaCVkLyVwIGJyYW5jaCAlZFxuIiwgZXAtPnBlcmlvZCwgZXAsIGVwLT5icmFuY2gpOworCQlmb3IgKGkgPSBlcC0+YnJhbmNoOyBpIDwgUEVSSU9ESUNfU0laRTsgaSArPSBlcC0+cGVyaW9kKSB7CisJCQlzdHJ1Y3QgaXNwMTE2eF9lcCAqKnByZXYgPSAmaXNwMTE2eC0+cGVyaW9kaWNbaV07CisJCQlzdHJ1Y3QgaXNwMTE2eF9lcCAqaGVyZSA9ICpwcmV2OworCisJCQl3aGlsZSAoaGVyZSAmJiBlcCAhPSBoZXJlKSB7CisJCQkJaWYgKGVwLT5wZXJpb2QgPiBoZXJlLT5wZXJpb2QpCisJCQkJCWJyZWFrOworCQkJCXByZXYgPSAmaGVyZS0+bmV4dDsKKwkJCQloZXJlID0gKnByZXY7CisJCQl9CisJCQlpZiAoZXAgIT0gaGVyZSkgeworCQkJCWVwLT5uZXh0ID0gaGVyZTsKKwkJCQkqcHJldiA9IGVwOworCQkJfQorCQkJaXNwMTE2eC0+bG9hZFtpXSArPSBlcC0+bG9hZDsKKwkJfQorCQloY2QtPnNlbGYuYmFuZHdpZHRoX2FsbG9jYXRlZCArPSBlcC0+bG9hZCAvIGVwLT5wZXJpb2Q7CisKKwkJLyogc3dpdGNoIG92ZXIgdG8gU09GaW50ICovCisJCWlmICghaXNwMTE2eC0+cGVyaW9kaWNfY291bnQrKykgeworCQkJaXNwMTE2eC0+aXJxZW5iICY9IH5IQ3VQSU5UX0FUTDsKKwkJCWlzcDExNngtPmlycWVuYiB8PSBIQ3VQSU5UX1NPRjsKKwkJCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwKKwkJCQkJICAgIGlzcDExNngtPmlycWVuYik7CisJCX0KKwl9CisKKwkvKiBpbiBjYXNlIG9mIHVubGluay1kdXJpbmctc3VibWl0ICovCisJc3Bpbl9sb2NrKCZ1cmItPmxvY2spOworCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJc3Bpbl91bmxvY2soJnVyYi0+bG9jayk7CisJCWZpbmlzaF9yZXF1ZXN0KGlzcDExNngsIGVwLCB1cmIsIE5VTEwpOworCQlyZXQgPSAwOworCQlnb3RvIGZhaWw7CisJfQorCXVyYi0+aGNwcml2ID0gaGVwOworCXNwaW5fdW5sb2NrKCZ1cmItPmxvY2spOworCXN0YXJ0X2F0bF90cmFuc2ZlcnMoaXNwMTE2eCk7CisKKyAgICAgIGZhaWw6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgICBEZXF1ZXVlIFVSQnMuCisqLworc3RhdGljIGludCBpc3AxMTZ4X3VyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXA7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwLCAqZXBfYWN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCWhlcCA9IHVyYi0+aGNwcml2OworCS8qIFVSQiBhbHJlYWR5IHVubGlua2VkIChvciBuZXZlciBsaW5rZWQpPyAqLworCWlmICghaGVwKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCWVwID0gaGVwLT5oY3ByaXY7CisJV0FSTl9PTihoZXAgIT0gZXAtPmhlcCk7CisKKwkvKiBJbiBmcm9udCBvZiBxdWV1ZT8gKi8KKwlpZiAoZXAtPmhlcC0+dXJiX2xpc3QubmV4dCA9PSAmdXJiLT51cmJfbGlzdCkKKwkJLyogYWN0aXZlPyAqLworCQlmb3IgKGVwX2FjdCA9IGlzcDExNngtPmF0bF9hY3RpdmU7IGVwX2FjdDsKKwkJICAgICBlcF9hY3QgPSBlcF9hY3QtPmFjdGl2ZSkKKwkJCWlmIChlcF9hY3QgPT0gZXApIHsKKwkJCQlWREJHKCJkZXF1ZXVlLCB1cmIgJXAgYWN0aXZlOyB3YWl0IGZvciBpcnFcbiIsCisJCQkJICAgICB1cmIpOworCQkJCXVyYiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisKKwlpZiAodXJiKQorCQlmaW5pc2hfcmVxdWVzdChpc3AxMTZ4LCBlcCwgdXJiLCBOVUxMKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsCisJCQkJICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqZXAgPSBoZXAtPmhjcHJpdjs7CisKKwlpZiAoIWVwKQorCQlyZXR1cm47CisKKwkvKiBhc3N1bWUgd2UnZCBqdXN0IHdhaXQgZm9yIHRoZSBpcnEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwICYmICFsaXN0X2VtcHR5KCZoZXAtPnVyYl9saXN0KTsgaSsrKQorCQltc2xlZXAoMyk7CisJaWYgKCFsaXN0X2VtcHR5KCZoZXAtPnVyYl9saXN0KSkKKwkJV0FSTigiZXAgJXAgbm90IGVtcHR5P1xuIiwgZXApOworCisJdXNiX3B1dF9kZXYoZXAtPnVkZXYpOworCWtmcmVlKGVwKTsKKwloZXAtPmhjcHJpdiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXNwMTE2eF9nZXRfZnJhbWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJdTMyIGZtbnVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCWZtbnVtID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDRk1OVU0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKGludClmbW51bTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAgQWRhcHRlZCBmcm9tIG9oY2ktaHViLmMuIEN1cnJlbnRseSB3ZSBkb24ndCBzdXBwb3J0IGF1dG9zdXNwZW5kLgorKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9odWJfc3RhdHVzX2RhdGEoc3RydWN0IHVzYl9oY2QgKmhjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwlpbnQgcG9ydHMsIGksIGNoYW5nZWQgPSAwOworCisJaWYgKCFIQ19JU19SVU5OSU5HKGhjZC0+c3RhdGUpKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXBvcnRzID0gaXNwMTE2eC0+cmhkZXNjYSAmIFJIX0FfTkRQOworCisJLyogaW5pdCBzdGF0dXMgKi8KKwlpZiAoaXNwMTE2eC0+cmhzdGF0dXMgJiAoUkhfSFNfTFBTQyB8IFJIX0hTX09DSUMpKQorCQlidWZbMF0gPSBjaGFuZ2VkID0gMTsKKwllbHNlCisJCWJ1ZlswXSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykgeworCQl1MzIgc3RhdHVzID0gaXNwMTE2eC0+cmhwb3J0W2ldOworCisJCWlmIChzdGF0dXMgJiAoUkhfUFNfQ1NDIHwgUkhfUFNfUEVTQyB8IFJIX1BTX1BTU0MKKwkJCSAgICAgIHwgUkhfUFNfT0NJQyB8IFJIX1BTX1BSU0MpKSB7CisJCQljaGFuZ2VkID0gMTsKKwkJCWJ1ZlswXSB8PSAxIDw8IChpICsgMSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIHZvaWQgaXNwMTE2eF9odWJfZGVzY3JpcHRvcihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwKKwkJCQkgICBzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjKQoreworCXUzMiByZWcgPSBpc3AxMTZ4LT5yaGRlc2NhOworCisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY0xlbmd0aCA9IDk7CisJZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7CisJZGVzYy0+Yk5iclBvcnRzID0gKHU4KSAocmVnICYgMHgzKTsKKwkvKiBQb3dlciBzd2l0Y2hpbmcsIGRldmljZSB0eXBlLCBvdmVyY3VycmVudC4gKi8KKwlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0KKwkgICAgKF9fZm9yY2UgX191MTYpIGNwdV90b19sZTE2KCh1MTYpICgocmVnID4+IDgpICYgMHgxZikpOworCWRlc2MtPmJQd3JPbjJQd3JHb29kID0gKHU4KSAoKHJlZyA+PiAyNCkgJiAweGZmKTsKKwkvKiB0d28gYml0bWFwczogIHBvcnRzIHJlbW92YWJsZSwgYW5kIGxlZ2FjeSBQb3J0UHdyQ3RybE1hc2sgKi8KKwlkZXNjLT5iaXRtYXBbMF0gPSBkZXNjLT5iTmJyUG9ydHMgPT0gMSA/IDEgPDwgMSA6IDMgPDwgMTsKKwlkZXNjLT5iaXRtYXBbMV0gPSB+MDsKK30KKworLyogUGVyZm9ybSByZXNldCBvZiBhIGdpdmVuIHBvcnQuCisgICBJdCB3b3VsZCBiZSBncmVhdCB0byBqdXN0IHN0YXJ0IHRoZSByZXNldCBhbmQgbGV0IHRoZQorICAgVVNCIGNvcmUgdG8gY2xlYXIgdGhlIHJlc2V0IGluIGR1ZSB0aW1lLiBIb3dldmVyLAorICAgcm9vdCBodWIgcG9ydHMgc2hvdWxkIGJlIHJlc2V0IGZvciBhdCBsZWFzdCA1MCBtcywgd2hpbGUKKyAgIG91ciBjaGlwIHN0YXlzIGluIHJlc2V0IGZvciBhYm91dCAxMCBtcy4gSS5lLiwgd2UgbXVzdAorICAgcmVwZWF0ZWRseSByZXNldCBpdCBvdXJzZWxmIGhlcmUuCisqLworc3RhdGljIGlubGluZSB2b2lkIHJvb3RfcG9ydF9yZXNldChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcG9ydCkKK3sKKwl1MzIgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHQ7CisKKwkvKiBSb290IGh1YiByZXNldCBzaG91bGQgYmUgNTAgbXMsIGJ1dCBzb21lIGRldmljZXMKKwkgICB3YW50IGl0IGV2ZW4gbG9uZ2VyLiAqLworCXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCS8qIHNwaW4gdW50aWwgYW55IGN1cnJlbnQgcmVzZXQgZmluaXNoZXMgKi8KKwkJZm9yICg7OykgeworCQkJdG1wID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIHBvcnQgPworCQkJCQkJIEhDUkhQT1JUMiA6IEhDUkhQT1JUMSk7CisJCQlpZiAoISh0bXAgJiBSSF9QU19QUlMpKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDUwMCk7CisJCX0KKwkJLyogRG9uJ3QgcmVzZXQgYSBkaXNjb25uZWN0ZWQgcG9ydCAqLworCQlpZiAoISh0bXAgJiBSSF9QU19DQ1MpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCQkvKiBSZXNldCBsYXN0cyAxMG1zIChjbGFpbXMgZGF0YXNoZWV0KSAqLworCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIHBvcnQgPyBIQ1JIUE9SVDIgOgorCQkJCSAgICBIQ1JIUE9SVDEsIChSSF9QU19QUlMpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQltc2xlZXAoMTApOworCX0KK30KKworLyogQWRhcHRlZCBmcm9tIG9oY2ktaHViLmMgKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9odWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJICAgICAgIHUxNiB0eXBlUmVxLAorCQkJICAgICAgIHUxNiB3VmFsdWUsIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJc3RydWN0IGlzcDExNnggKmlzcDExNnggPSBoY2RfdG9faXNwMTE2eChoY2QpOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBvcnRzID0gaXNwMTE2eC0+cmhkZXNjYSAmIFJIX0FfTkRQOworCXUzMiB0bXAgPSAwOworCisJc3dpdGNoICh0eXBlUmVxKSB7CisJY2FzZSBDbGVhckh1YkZlYXR1cmU6CisJCURCRygiQ2xlYXJIdWJGZWF0dXJlOiAiKTsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBDX0hVQl9PVkVSX0NVUlJFTlQ6CisJCQlEQkcoIkNfSFVCX09WRVJfQ1VSUkVOVFxuIik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIU1RBVFVTLCBSSF9IU19PQ0lDKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJY2FzZSBDX0hVQl9MT0NBTF9QT1dFUjoKKwkJCURCRygiQ19IVUJfTE9DQUxfUE9XRVJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisJCWJyZWFrOworCWNhc2UgU2V0SHViRmVhdHVyZToKKwkJREJHKCJTZXRIdWJGZWF0dXJlOiAiKTsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBDX0hVQl9PVkVSX0NVUlJFTlQ6CisJCWNhc2UgQ19IVUJfTE9DQUxfUE9XRVI6CisJCQlEQkcoIkNfSFVCX09WRVJfQ1VSUkVOVCBvciBDX0hVQl9MT0NBTF9QT1dFUlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgorCQlEQkcoIkdldEh1YkRlc2NyaXB0b3JcbiIpOworCQlpc3AxMTZ4X2h1Yl9kZXNjcmlwdG9yKGlzcDExNngsCisJCQkJICAgICAgIChzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCURCRygiR2V0SHViU3RhdHVzXG4iKTsKKwkJKihfX2xlMzIgKikgYnVmID0gMDsKKwkJYnJlYWs7CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlEQkcoIkdldFBvcnRTdGF0dXNcbiIpOworCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBwb3J0cykKKwkJCWdvdG8gZXJyb3I7CisJCXRtcCA9IGlzcDExNngtPnJocG9ydFstLXdJbmRleF07CisJCSooX19sZTMyICopIGJ1ZiA9IGNwdV90b19sZTMyKHRtcCk7CisJCURCRygiR2V0UG9ydFN0YXR1czogcG9ydFslZF0gICUwOHhcbiIsIHdJbmRleCArIDEsIHRtcCk7CisJCWJyZWFrOworCWNhc2UgQ2xlYXJQb3J0RmVhdHVyZToKKwkJREJHKCJDbGVhclBvcnRGZWF0dXJlOiAiKTsKKwkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gcG9ydHMpCisJCQlnb3RvIGVycm9yOworCQl3SW5kZXgtLTsKKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVTQl9QT1JUX0ZFQVRfRU5BQkxFOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX0VOQUJMRVxuIik7CisJCQl0bXAgPSBSSF9QU19DQ1M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX0NfRU5BQkxFXG4iKTsKKwkJCXRtcCA9IFJIX1BTX1BFU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCQlEQkcoIlVTQl9QT1JUX0ZFQVRfU1VTUEVORFxuIik7CisJCQl0bXAgPSBSSF9QU19QT0NJOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CisJCQlEQkcoIlVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EXG4iKTsKKwkJCXRtcCA9IFJIX1BTX1BTU0M7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX1BPV0VSXG4iKTsKKwkJCXRtcCA9IFJIX1BTX0xTREE7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT05cbiIpOworCQkJdG1wID0gUkhfUFNfQ1NDOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDoKKwkJCURCRygiVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVFxuIik7CisJCQl0bXAgPSBSSF9QU19PQ0lDOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX0NfUkVTRVRcbiIpOworCQkJdG1wID0gUkhfUFNfUFJTQzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIHdJbmRleAorCQkJCSAgICA/IEhDUkhQT1JUMiA6IEhDUkhQT1JUMSwgdG1wKTsKKwkJaXNwMTE2eC0+cmhwb3J0W3dJbmRleF0gPQorCQkgICAgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIHdJbmRleCA/IEhDUkhQT1JUMiA6IEhDUkhQT1JUMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBTZXRQb3J0RmVhdHVyZToKKwkJREJHKCJTZXRQb3J0RmVhdHVyZTogIik7CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IHBvcnRzKQorCQkJZ290byBlcnJvcjsKKwkJd0luZGV4LS07CisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJREJHKCJVU0JfUE9SVF9GRUFUX1NVU1BFTkRcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgd0luZGV4CisJCQkJCSAgICA/IEhDUkhQT1JUMiA6IEhDUkhQT1JUMSwgUkhfUFNfUFNTKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCQlEQkcoIlVTQl9QT1JUX0ZFQVRfUE9XRVJcbiIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwkJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgd0luZGV4CisJCQkJCSAgICA/IEhDUkhQT1JUMiA6IEhDUkhQT1JUMSwgUkhfUFNfUFBTKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCQlEQkcoIlVTQl9QT1JUX0ZFQVRfUkVTRVRcbiIpOworCQkJcm9vdF9wb3J0X3Jlc2V0KGlzcDExNngsIHdJbmRleCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlzcDExNngtPnJocG9ydFt3SW5kZXhdID0KKwkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCB3SW5kZXggPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgICBlcnJvcjoKKwkJLyogInByb3RvY29sIHN0YWxsIiBvbiBlcnJvciAqLworCQlEQkcoIlBST1RPQ09MIFNUQUxMXG4iKTsKKwkJcmV0ID0gLUVQSVBFOworCX0KKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYJQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgaXNwMTE2eF9odWJfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCk7CisJc3dpdGNoICh2YWwgJiBIQ0NPTlRST0xfSENGUykgeworCWNhc2UgSENDT05UUk9MX1VTQl9PUEVSOgorCQloY2QtPnN0YXRlID0gSENfU1RBVEVfUVVJRVNDSU5HOworCQl2YWwgJj0gKH5IQ0NPTlRST0xfSENGUyAmIH5IQ0NPTlRST0xfUldFKTsKKwkJdmFsIHw9IEhDQ09OVFJPTF9VU0JfU1VTUEVORDsKKwkJaWYgKGhjZC0+cmVtb3RlX3dha2V1cCkKKwkJCXZhbCB8PSBIQ0NPTlRST0xfUldFOworCQkvKiBXYWl0IGZvciB1c2IgdHJhbnNmZXJzIHRvIGZpbmlzaCAqLworCQltZGVsYXkoMik7CisJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLCB2YWwpOworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOworCQkvKiBXYWl0IGZvciBkZXZpY2VzIHRvIHN1c3BlbmQgKi8KKwkJbWRlbGF5KDUpOworCWNhc2UgSENDT05UUk9MX1VTQl9TVVNQRU5EOgorCQlicmVhazsKKwljYXNlIEhDQ09OVFJPTF9VU0JfUkVTVU1FOgorCQlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCwKKwkJCQkgICAgKHZhbCAmIH5IQ0NPTlRST0xfSENGUykgfAorCQkJCSAgICBIQ0NPTlRST0xfVVNCX1JFU0VUKTsKKwljYXNlIEhDQ09OVFJPTF9VU0JfUkVTRVQ6CisJCXJldCA9IC1FQlVTWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc3AxMTZ4X2h1Yl9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJdTMyIHZhbDsKKwlpbnQgcmV0ID0gLUVJTlBST0dSRVNTOworCisJbXNsZWVwKDUpOworCXNwaW5fbG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCisJdmFsID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCk7CisJc3dpdGNoICh2YWwgJiBIQ0NPTlRST0xfSENGUykgeworCWNhc2UgSENDT05UUk9MX1VTQl9TVVNQRU5EOgorCQl2YWwgJj0gfkhDQ09OVFJPTF9IQ0ZTOworCQl2YWwgfD0gSENDT05UUk9MX1VTQl9SRVNVTUU7CisJCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLCB2YWwpOworCWNhc2UgSENDT05UUk9MX1VTQl9SRVNVTUU6CisJCWJyZWFrOworCWNhc2UgSENDT05UUk9MX1VTQl9PUEVSOgorCQkvKiBXaXRob3V0IHNldHRpbmcgcG93ZXJfc3RhdGUgaGVyZSB0aGUKKwkJICAgU1VTUEVOREVEIHN0YXRlIHdvbid0IGJlIHJlbW92ZWQgZnJvbQorCQkgICBzeXNmcy91c2JOL3Bvd2VyLnN0YXRlIGFzIGEgcmVzcG9uc2UgdG8gcmVtb3RlCisJCSAgIHdha2V1cC4gTWF5YmUgaW4gdGhlIGZ1dHVyZS4gKi8KKwkJaGNkLT5zZWxmLnJvb3RfaHViLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUJVU1k7CisJfQorCisJaWYgKHJldCAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl2YWwgPSBpc3AxMTZ4LT5yaGRlc2NhICYgUkhfQV9ORFA7CisJd2hpbGUgKHZhbC0tKSB7CisJCXUzMiBzdGF0ID0KKwkJICAgIGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCB2YWwgPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEpOworCQkvKiBmb3JjZSBnbG9iYWwsIG5vdCBzZWxlY3RpdmUsIHJlc3VtZSAqLworCQlpZiAoIShzdGF0ICYgUkhfUFNfUFNTKSkKKwkJCWNvbnRpbnVlOworCQlEQkcoIiVzOiBSZXN1bWluZyBwb3J0ICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwkJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBSSF9QU19QT0NJLCB2YWwKKwkJCQkgICAgPyBIQ1JIUE9SVDIgOiBIQ1JIUE9SVDEpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JFU1VNSU5HOworCW1kZWxheSgyMCk7CisKKwkvKiBHbyBvcGVyYXRpb25hbCAqLworCXNwaW5fbG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ0NPTlRST0wpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENDT05UUk9MLAorCQkJICAgICh2YWwgJiB+SENDT05UUk9MX0hDRlMpIHwgSENDT05UUk9MX1VTQl9PUEVSKTsKKwlzcGluX3VubG9ja19pcnEoJmlzcDExNngtPmxvY2spOworCS8qIHNlZSBhbmFsb2dvdXMgY29tbWVudCBhYm92ZSAqLworCWhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKKwloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3JoX3Jlc3VtZSh2b2lkICpfaGNkKQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBfaGNkOworCisJdXNiX3Jlc3VtZV9kZXZpY2UoaGNkLT5zZWxmLnJvb3RfaHViKTsKK30KKworI2Vsc2UKKworI2RlZmluZQlpc3AxMTZ4X2h1Yl9zdXNwZW5kCU5VTEwKKyNkZWZpbmUJaXNwMTE2eF9odWJfcmVzdW1lCU5VTEwKKworc3RhdGljIHZvaWQgaXNwMTE2eF9yaF9yZXN1bWUodm9pZCAqX2hjZCkKK3sKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgU1RVQl9ERUJVR19GSUxFCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcmVhdGVfZGVidWdfZmlsZShzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9kZWJ1Z19maWxlKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworfQorCisjZWxzZQorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKK3N0YXRpYyB2b2lkIGR1bXBfaXJxKHN0cnVjdCBzZXFfZmlsZSAqcywgY2hhciAqbGFiZWwsIHUxNiBtYXNrKQoreworCXNlcV9wcmludGYocywgIiVzICUwNHglcyVzJXMlcyVzJXNcbiIsIGxhYmVsLCBtYXNrLAorCQkgICBtYXNrICYgSEN1UElOVF9DTEtSRFkgPyAiIGNsa3JkeSIgOiAiIiwKKwkJICAgbWFzayAmIEhDdVBJTlRfU1VTUCA/ICIgc3VzcCIgOiAiIiwKKwkJICAgbWFzayAmIEhDdVBJTlRfT1BSID8gIiBvcHIiIDogIiIsCisJCSAgIG1hc2sgJiBIQ3VQSU5UX0FJSUVPVCA/ICIgZW90IiA6ICIiLAorCQkgICBtYXNrICYgSEN1UElOVF9BVEwgPyAiIGF0bCIgOiAiIiwKKwkJICAgbWFzayAmIEhDdVBJTlRfU09GID8gIiBzb2YiIDogIiIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2ludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNoYXIgKmxhYmVsLCB1MzIgbWFzaykKK3sKKwlzZXFfcHJpbnRmKHMsICIlcyAlMDh4JXMlcyVzJXMlcyVzJXNcbiIsIGxhYmVsLCBtYXNrLAorCQkgICBtYXNrICYgSENJTlRfTUlFID8gIiBNSUUiIDogIiIsCisJCSAgIG1hc2sgJiBIQ0lOVF9SSFNDID8gIiByaHNjIiA6ICIiLAorCQkgICBtYXNrICYgSENJTlRfRk5PID8gIiBmbm8iIDogIiIsCisJCSAgIG1hc2sgJiBIQ0lOVF9VRSA/ICIgdWUiIDogIiIsCisJCSAgIG1hc2sgJiBIQ0lOVF9SRCA/ICIgcmQiIDogIiIsCisJCSAgIG1hc2sgJiBIQ0lOVF9TRiA/ICIgc29mIiA6ICIiLCBtYXNrICYgSENJTlRfU08gPyAiIHNvIiA6ICIiKTsKK30KKworc3RhdGljIGludCBwcm9jX2lzcDExNnhfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IHMtPnByaXZhdGU7CisJc3RydWN0IGlzcDExNnhfZXAgKmVwOworCXN0cnVjdCB1cmIgKnVyYjsKKwl1bnNpZ25lZCBpOworCWNoYXIgKnN0cjsKKworCXNlcV9wcmludGYocywgIiVzXG4lcyB2ZXJzaW9uICVzXG4iLAorCQkgICBpc3AxMTZ4X3RvX2hjZChpc3AxMTZ4KS0+cHJvZHVjdF9kZXNjLCBoY2RfbmFtZSwKKwkJICAgRFJJVkVSX1ZFUlNJT04pOworCisJaWYgKEhDX0lTX1NVU1BFTkRFRChpc3AxMTZ4X3RvX2hjZChpc3AxMTZ4KS0+c3RhdGUpKSB7CisJCXNlcV9wcmludGYocywgIkhDRCBpcyBzdXNwZW5kZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFIQ19JU19SVU5OSU5HKGlzcDExNnhfdG9faGNkKGlzcDExNngpLT5zdGF0ZSkpIHsKKwkJc2VxX3ByaW50ZihzLCAiSENEIG5vdCBydW5uaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7CisKKwlkdW1wX2lycShzLCAiaGNfaXJxX2VuYWJsZSIsIGlzcDExNnhfcmVhZF9yZWcxNihpc3AxMTZ4LCBIQ3VQSU5URU5CKSk7CisJZHVtcF9pcnEocywgImhjX2lycV9zdGF0dXMiLCBpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSEN1UElOVCkpOworCWR1bXBfaW50KHMsICJoY19pbnRfZW5hYmxlIiwgaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDSU5URU5CKSk7CisJZHVtcF9pbnQocywgImhjX2ludF9zdGF0dXMiLCBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENJTlRTVEFUKSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVwLCAmaXNwMTE2eC0+YXN5bmMsIHNjaGVkdWxlKSB7CisKKwkJc3dpdGNoIChlcC0+bmV4dHBpZCkgeworCQljYXNlIFVTQl9QSURfSU46CisJCQlzdHIgPSAiaW4iOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BJRF9PVVQ6CisJCQlzdHIgPSAib3V0IjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QSURfU0VUVVA6CisJCQlzdHIgPSAic2V0dXAiOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BJRF9BQ0s6CisJCQlzdHIgPSAic3RhdHVzIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RyID0gIj8iOworCQkJYnJlYWs7CisJCX07CisJCXNlcV9wcmludGYocywgIiVwLCBlcCVkJXMsIG1heHBhY2tldCAlZDpcbiIsIGVwLAorCQkJICAgZXAtPmVwbnVtLCBzdHIsIGVwLT5tYXhwYWNrZXQpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVyYiwgJmVwLT5oZXAtPnVyYl9saXN0LCB1cmJfbGlzdCkgeworCQkJc2VxX3ByaW50ZihzLCAiICB1cmIlcCwgJWQvJWRcbiIsIHVyYiwKKwkJCQkgICB1cmItPmFjdHVhbF9sZW5ndGgsCisJCQkJICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKKwkJfQorCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmlzcDExNngtPmFzeW5jKSkKKwkJc2VxX3ByaW50ZihzLCAiXG4iKTsKKworCXNlcV9wcmludGYocywgInBlcmlvZGljIHNpemU9ICVkXG4iLCBQRVJJT0RJQ19TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBQRVJJT0RJQ19TSVpFOyBpKyspIHsKKwkJZXAgPSBpc3AxMTZ4LT5wZXJpb2RpY1tpXTsKKwkJaWYgKCFlcCkKKwkJCWNvbnRpbnVlOworCQlzZXFfcHJpbnRmKHMsICIlMmQgWyUzZF06XG4iLCBpLCBpc3AxMTZ4LT5sb2FkW2ldKTsKKworCQkvKiBEVU1COiBwcmludHMgc2hhcmVkIGVudHJpZXMgbXVsdGlwbGUgdGltZXMgKi8KKwkJZG8geworCQkJc2VxX3ByaW50ZihzLCAiICAgJWQvJXAgKCVzZGV2JWQgZXAlZCVzIG1heCAlZClcbiIsCisJCQkJICAgZXAtPnBlcmlvZCwgZXAsCisJCQkJICAgKGVwLT51ZGV2LT5zcGVlZCA9PQorCQkJCSAgICBVU0JfU1BFRURfRlVMTCkgPyAiIiA6ICJscyAiLAorCQkJCSAgIGVwLT51ZGV2LT5kZXZudW0sIGVwLT5lcG51bSwKKwkJCQkgICAoZXAtPmVwbnVtID09CisJCQkJICAgIDApID8gIiIgOiAoKGVwLT5uZXh0cGlkID09CisJCQkJCQlVU0JfUElEX0lOKSA/ICJpbiIgOiAib3V0IiksCisJCQkJICAgZXAtPm1heHBhY2tldCk7CisJCQllcCA9IGVwLT5uZXh0OworCQl9IHdoaWxlIChlcCk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7CisJc2VxX3ByaW50ZihzLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2NfaXNwMTE2eF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwcm9jX2lzcDExNnhfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb3BzID0geworCS5vcGVuID0gcHJvY19pc3AxMTZ4X29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBleHBlY3QganVzdCBvbmUgaXNwMTE2eCBwZXIgc3lzdGVtICovCitzdGF0aWMgY29uc3QgY2hhciBwcm9jX2ZpbGVuYW1lW10gPSAiZHJpdmVyL2lzcDExNngiOworCitzdGF0aWMgdm9pZCBjcmVhdGVfZGVidWdfZmlsZShzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXBkZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KHByb2NfZmlsZW5hbWUsIDAsIE5VTEwpOworCWlmIChwZGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcGRlLT5wcm9jX2ZvcHMgPSAmcHJvY19vcHM7CisJcGRlLT5kYXRhID0gaXNwMTE2eDsKKwlpc3AxMTZ4LT5wZGUgPSBwZGU7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9kZWJ1Z19maWxlKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4KQoreworCWlmIChpc3AxMTZ4LT5wZGUpCisJCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfZmlsZW5hbWUsIE5VTEwpOworfQorCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgIFNvZnR3YXJlIHJlc2V0IC0gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZWN0LgorKi8KK3N0YXRpYyBpbnQgaXNwMTE2eF9zd19yZXNldChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpbnQgcmV0cmllcyA9IDE1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSENTV1JFUywgSENTV1JFU19NQUdJQyk7CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ0NNRFNUQVQsIEhDQ01EU1RBVF9IQ1IpOworCXdoaWxlICgtLXJldHJpZXMpIHsKKwkJLyogSXQgdXN1YWxseSByZXNldHMgd2l0aGluIDEgbXMgKi8KKwkJbWRlbGF5KDEpOworCQlpZiAoIShpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENDTURTVEFUKSAmIEhDQ01EU1RBVF9IQ1IpKQorCQkJYnJlYWs7CisJfQorCWlmICghcmV0cmllcykgeworCQlFUlIoIlNvZnR3YXJlIHJlc2V0IHRpbWVvdXRcbiIpOworCQlyZXQgPSAtRVRJTUU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICBSZXNldC4gVHJpZXMgdG8gcGVyZm9ybSBwbGF0Zm9ybS1zcGVjaWZpYyBoYXJkd2FyZQorICByZXNldCBmaXJzdDsgZmFsbHMgYmFjayB0byBzb2Z0d2FyZSByZXNldC4KKyovCitzdGF0aWMgaW50IGlzcDExNnhfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJdW5zaWduZWQgbG9uZyB0OworCXUxNiBjbGtyZHkgPSAwOworCWludCByZXQgPSAwLCB0aW1lb3V0ID0gMTUgLyogbXMgKi8gOworCisJaWYgKGlzcDExNngtPmJvYXJkICYmIGlzcDExNngtPmJvYXJkLT5yZXNldCkgeworCQkvKiBIYXJkd2FyZSByZXNldCAqLworCQlpc3AxMTZ4LT5ib2FyZC0+cmVzZXQoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDEpOworCQltc2xlZXAoMTApOworCQlpZiAoaXNwMTE2eC0+Ym9hcmQtPmNsb2NrKQorCQkJaXNwMTE2eC0+Ym9hcmQtPmNsb2NrKGhjZC0+c2VsZi5jb250cm9sbGVyLCAxKTsKKwkJbXNsZWVwKDEpOworCQlpc3AxMTZ4LT5ib2FyZC0+cmVzZXQoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDApOworCX0gZWxzZQorCQlyZXQgPSBpc3AxMTZ4X3N3X3Jlc2V0KGlzcDExNngpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKKwl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdCkpIHsKKwkJbXNsZWVwKDQpOworCQlzcGluX2xvY2tfaXJxKCZpc3AxMTZ4LT5sb2NrKTsKKwkJY2xrcmR5ID0gaXNwMTE2eF9yZWFkX3JlZzE2KGlzcDExNngsIEhDdVBJTlQpICYgSEN1UElOVF9DTEtSRFk7CisJCXNwaW5fdW5sb2NrX2lycSgmaXNwMTE2eC0+bG9jayk7CisJCWlmIChjbGtyZHkpCisJCQlicmVhazsKKwl9CisJaWYgKCFjbGtyZHkpIHsKKwkJRVJSKCJDbG9jayBub3QgcmVhZHkgYWZ0ZXIgMjBtc1xuIik7CisJCS8qIEFmdGVyIHN3X3Jlc2V0IHRoZSBjbG9jayB3b24ndCByZXBvcnQgdG8gYmUgcmVhZHksIGlmCisJCSAgIEhfV0FLRVVQIHBpbiBpcyBoaWdoLiAqLworCQlpZiAoIWlzcDExNngtPmJvYXJkIHx8ICFpc3AxMTZ4LT5ib2FyZC0+cmVzZXQpCisJCQlFUlIoIlRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBoYXJkd2FyZSB3YWtldXAuXG4iKTsKKwkJCUVSUigiUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBIX1dBS0VVUCBwaW4gIgorCQkJCSJpcyBwdWxsZWQgbG93IVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGlzcDExNnhfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisKKwkvKiBTd2l0Y2ggb2ZmIHBvcnRzJyBwb3dlciwgc29tZSBkZXZpY2VzIGRvbid0IGNvbWUgdXAKKwkgICBhZnRlciBuZXh0ICdpbnNtb2QnIHdpdGhvdXQgdGhpcyAqLworCXZhbCA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0EpOworCXZhbCAmPSB+KFJIX0FfTlBTIHwgUkhfQV9QU00pOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSERFU0NBLCB2YWwpOworCWlzcDExNnhfd3JpdGVfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUywgUkhfSFNfTFBTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc3AxMTZ4LT5sb2NrLCBmbGFncyk7CisKKwkvKiBQdXQgdGhlIGNoaXAgaW50byByZXNldCBzdGF0ZSAqLworCWlmIChpc3AxMTZ4LT5ib2FyZCAmJiBpc3AxMTZ4LT5ib2FyZC0+cmVzZXQpCisJCWlzcDExNngtPmJvYXJkLT5yZXNldChoY2QtPnNlbGYuY29udHJvbGxlciwgMCk7CisJZWxzZQorCQlpc3AxMTZ4X3N3X3Jlc2V0KGlzcDExNngpOworCisJLyogU3RvcCB0aGUgY2xvY2sgKi8KKwlpZiAoaXNwMTE2eC0+Ym9hcmQgJiYgaXNwMTE2eC0+Ym9hcmQtPmNsb2NrKQorCQlpc3AxMTZ4LT5ib2FyZC0+Y2xvY2soaGNkLT5zZWxmLmNvbnRyb2xsZXIsIDApOworfQorCisvKgorICBDb25maWd1cmUgdGhlIGNoaXAuIFRoZSBjaGlwIG11c3QgYmUgc3VjY2Vzc2Z1bGx5IHJlc2V0IGJ5IG5vdy4KKyovCitzdGF0aWMgaW50IGlzcDExNnhfc3RhcnQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCA9IGhjZF90b19pc3AxMTZ4KGhjZCk7CisJc3RydWN0IGlzcDExNnhfcGxhdGZvcm1fZGF0YSAqYm9hcmQgPSBpc3AxMTZ4LT5ib2FyZDsKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCisJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgZGlzYWJsZSBhbGwgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDdVBJTlQsIDB4ZmYpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgMCk7CisKKwl2YWwgPSBpc3AxMTZ4X3JlYWRfcmVnMTYoaXNwMTE2eCwgSENDSElQSUQpOworCWlmICgodmFsICYgSENDSElQSURfTUFTSykgIT0gSENDSElQSURfTUFHSUMpIHsKKwkJRVJSKCJJbnZhbGlkIGNoaXAgSUQgJTA0eFxuIiwgdmFsKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNwMTE2eC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDSVRMQlVGTEVOLCBJU1AxMTZ4X0lUTF9CVUZTSVpFKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzE2KGlzcDExNngsIEhDQVRMQlVGTEVOLCBJU1AxMTZ4X0FUTF9CVUZTSVpFKTsKKworCS8qIC0tLS0tIEhXIGNvbmYgKi8KKwl2YWwgPSBIQ0hXQ0ZHX0lOVF9FTkFCTEUgfCBIQ0hXQ0ZHX0RCV0lEVEgoMSk7CisJaWYgKGJvYXJkLT5zZWwxNUtyZXMpCisJCXZhbCB8PSBIQ0hXQ0ZHXzE1S1JTRUw7CisJLyogUmVtb3RlIHdha2V1cCB3b24ndCB3b3JrIHdpdGhvdXQgd29ya2luZyBjbG9jayAqLworCWlmIChib2FyZC0+Y2xrbm90c3RvcCB8fCBib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCXZhbCB8PSBIQ0hXQ0ZHX0NMS05PVFNUT1A7CisJaWYgKGJvYXJkLT5vY19lbmFibGUpCisJCXZhbCB8PSBIQ0hXQ0ZHX0FOQUxPR19PQzsKKwlpZiAoYm9hcmQtPmludF9hY3RfaGlnaCkKKwkJdmFsIHw9IEhDSFdDRkdfSU5UX1BPTDsKKwlpZiAoYm9hcmQtPmludF9lZGdlX3RyaWdnZXJlZCkKKwkJdmFsIHw9IEhDSFdDRkdfSU5UX1RSSUdHRVI7CisJaXNwMTE2eF93cml0ZV9yZWcxNihpc3AxMTZ4LCBIQ0hXQ0ZHLCB2YWwpOworCisJLyogLS0tLS0gUm9vdCBodWIgY29uZiAqLworCXZhbCA9IDA7CisJLyogQU4xMDAwM18xLnBkZiByZWNvbW1lbmRzIE5QUyB0byBiZSBhbHdheXMgMSAqLworCWlmIChib2FyZC0+bm9fcG93ZXJfc3dpdGNoaW5nKQorCQl2YWwgfD0gUkhfQV9OUFM7CisJaWYgKGJvYXJkLT5wb3dlcl9zd2l0Y2hpbmdfbW9kZSkKKwkJdmFsIHw9IFJIX0FfUFNNOworCWlmIChib2FyZC0+cG90cGcpCisJCXZhbCB8PSAoYm9hcmQtPnBvdHBnIDw8IDI0KSAmIFJIX0FfUE9UUEdUOworCWVsc2UKKwkJdmFsIHw9ICgyNSA8PCAyNCkgJiBSSF9BX1BPVFBHVDsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSwgdmFsKTsKKwlpc3AxMTZ4LT5yaGRlc2NhID0gaXNwMTE2eF9yZWFkX3JlZzMyKGlzcDExNngsIEhDUkhERVNDQSk7CisKKwl2YWwgPSBSSF9CX1BQQ007CisJaXNwMTE2eF93cml0ZV9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0IsIHZhbCk7CisJaXNwMTE2eC0+cmhkZXNjYiA9IGlzcDExNnhfcmVhZF9yZWczMihpc3AxMTZ4LCBIQ1JIREVTQ0IpOworCisJdmFsID0gMDsKKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKSB7CisJCWhjZC0+Y2FuX3dha2V1cCA9IDE7CisJCXZhbCB8PSBSSF9IU19EUldFOworCX0KKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhTVEFUVVMsIHZhbCk7CisJaXNwMTE2eC0+cmhzdGF0dXMgPSBpc3AxMTZ4X3JlYWRfcmVnMzIoaXNwMTE2eCwgSENSSFNUQVRVUyk7CisKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDRk1JTlRWTCwgMHgyNzc4MmVkZik7CisKKwloY2QtPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKworCS8qIFNldCB1cCBpbnRlcnJ1cHRzICovCisJaXNwMTE2eC0+aW50ZW5iID0gSENJTlRfTUlFIHwgSENJTlRfUkhTQyB8IEhDSU5UX1VFOworCWlmIChib2FyZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpCisJCWlzcDExNngtPmludGVuYiB8PSBIQ0lOVF9SRDsKKwlpc3AxMTZ4LT5pcnFlbmIgPSBIQ3VQSU5UX0FUTCB8IEhDdVBJTlRfT1BSOwkvKiB8IEhDdVBJTlRfU1VTUDsgKi8KKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDSU5URU5CLCBpc3AxMTZ4LT5pbnRlbmIpOworCWlzcDExNnhfd3JpdGVfcmVnMTYoaXNwMTE2eCwgSEN1UElOVEVOQiwgaXNwMTE2eC0+aXJxZW5iKTsKKworCS8qIEdvIG9wZXJhdGlvbmFsICovCisJdmFsID0gSENDT05UUk9MX1VTQl9PUEVSOworCS8qIFJlbW90ZSB3YWtldXAgY29ubmVjdGVkIC0gTk9UIFNVUFBPUlRFRCAqLworCS8qICBpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfY29ubmVjdGVkKQorCSAgIHZhbCB8PSBIQ0NPTlRST0xfUldDOyAgKi8KKwlpZiAoYm9hcmQtPnJlbW90ZV93YWtldXBfZW5hYmxlKQorCQl2YWwgfD0gSENDT05UUk9MX1JXRTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDQ09OVFJPTCwgdmFsKTsKKworCS8qIERpc2FibGUgcG9ydHMgdG8gYXZvaWQgcmFjZSBpbiBkZXZpY2UgZW51bWVyYXRpb24gKi8KKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMSwgUkhfUFNfQ0NTKTsKKwlpc3AxMTZ4X3dyaXRlX3JlZzMyKGlzcDExNngsIEhDUkhQT1JUMiwgUkhfUFNfQ0NTKTsKKworCWlzcDExNnhfc2hvd19yZWdzKGlzcDExNngpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzcDExNngtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIGlzcDExNnhfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5wcm9kdWN0X2Rlc2MgPSAiSVNQMTE2eCBIb3N0IENvbnRyb2xsZXIiLAorCS5oY2RfcHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpc3AxMTZ4KSwKKworCS5pcnEgPSBpc3AxMTZ4X2lycSwKKwkuZmxhZ3MgPSBIQ0RfVVNCMTEsCisKKwkucmVzZXQgPSBpc3AxMTZ4X3Jlc2V0LAorCS5zdGFydCA9IGlzcDExNnhfc3RhcnQsCisJLnN0b3AgPSBpc3AxMTZ4X3N0b3AsCisKKwkudXJiX2VucXVldWUgPSBpc3AxMTZ4X3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IGlzcDExNnhfdXJiX2RlcXVldWUsCisJLmVuZHBvaW50X2Rpc2FibGUgPSBpc3AxMTZ4X2VuZHBvaW50X2Rpc2FibGUsCisKKwkuZ2V0X2ZyYW1lX251bWJlciA9IGlzcDExNnhfZ2V0X2ZyYW1lLAorCisJLmh1Yl9zdGF0dXNfZGF0YSA9IGlzcDExNnhfaHViX3N0YXR1c19kYXRhLAorCS5odWJfY29udHJvbCA9IGlzcDExNnhfaHViX2NvbnRyb2wsCisJLmh1Yl9zdXNwZW5kID0gaXNwMTE2eF9odWJfc3VzcGVuZCwKKwkuaHViX3Jlc3VtZSA9IGlzcDExNnhfaHViX3Jlc3VtZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19pbml0X29yX21vZHVsZSBpc3AxMTZ4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlpZighaGNkKQorCQlyZXR1cm4gMDsKKwlpc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwlwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKKwlyZW1vdmVfZGVidWdfZmlsZShpc3AxMTZ4KTsKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCisJaW91bm1hcChpc3AxMTZ4LT5kYXRhX3JlZyk7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgMik7CisJaW91bm1hcChpc3AxMTZ4LT5hZGRyX3JlZyk7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgMik7CisKKwl1c2JfcHV0X2hjZChoY2QpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIHJlc291cmNlX2xlbihyKSAoKChyKS0+ZW5kIC0gKHIpLT5zdGFydCkgKyAxKQorCitzdGF0aWMgaW50IF9faW5pdCBpc3AxMTZ4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkOworCXN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlc291cmNlICphZGRyLCAqZGF0YTsKKwl2b2lkIF9faW9tZW0gKmFkZHJfcmVnOworCXZvaWQgX19pb21lbSAqZGF0YV9yZWc7CisJaW50IGlycTsKKwlpbnQgcmV0ID0gMDsKKworCXBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCWlmIChwZGV2LT5udW1fcmVzb3VyY2VzIDwgMykgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCisJZGF0YSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYWRkciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoIWFkZHIgfHwgIWRhdGEgfHwgaXJxIDwgMCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycjE7CisJfQorCisJaWYgKGRldi0+ZG1hX21hc2spIHsKKwkJREJHKCJETUEgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLT5zdGFydCwgMiwgaGNkX25hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnIxOworCX0KKwlhZGRyX3JlZyA9IGlvcmVtYXAoYWRkci0+c3RhcnQsIHJlc291cmNlX2xlbihhZGRyKSk7CisJaWYgKGFkZHJfcmVnID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnIyOworCX0KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihkYXRhLT5zdGFydCwgMiwgaGNkX25hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnIzOworCX0KKwlkYXRhX3JlZyA9IGlvcmVtYXAoZGF0YS0+c3RhcnQsIHJlc291cmNlX2xlbihkYXRhKSk7CisJaWYgKGRhdGFfcmVnID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI0OworCX0KKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGhjZCAqLworCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZpc3AxMTZ4X2hjX2RyaXZlciwgZGV2LCBkZXYtPmJ1c19pZCk7CisJaWYgKCFoY2QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnI1OworCX0KKwkvKiB0aGlzIHJzcmNfc3RhcnQgaXMgYm9ndXMgKi8KKwloY2QtPnJzcmNfc3RhcnQgPSBhZGRyLT5zdGFydDsKKwlpc3AxMTZ4ID0gaGNkX3RvX2lzcDExNngoaGNkKTsKKwlpc3AxMTZ4LT5kYXRhX3JlZyA9IGRhdGFfcmVnOworCWlzcDExNngtPmFkZHJfcmVnID0gYWRkcl9yZWc7CisJc3Bpbl9sb2NrX2luaXQoJmlzcDExNngtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZpc3AxMTZ4LT5hc3luYyk7CisJSU5JVF9XT1JLKCZpc3AxMTZ4LT5yaF9yZXN1bWUsIGlzcDExNnhfcmhfcmVzdW1lLCBoY2QpOworCWlzcDExNngtPmJvYXJkID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJaWYgKCFpc3AxMTZ4LT5ib2FyZCkgeworCQlFUlIoIlBsYXRmb3JtIGRhdGEgc3RydWN0dXJlIG5vdCBpbml0aWFsaXplZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyNjsKKwl9CisJaWYgKGlzcDExNnhfY2hlY2tfcGxhdGZvcm1fZGVsYXkoaXNwMTE2eCkpIHsKKwkJRVJSKCJVU0VfUExBVEZPUk1fREVMQVkgZGVmaW5lZCwgYnV0IGRlbGF5IGZ1bmN0aW9uIG5vdCAiCisJCSAgICAiaW1wbGVtZW50ZWQuXG4iKTsKKwkJRVJSKCJTZWUgY29tbWVudHMgaW4gZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI2OworCX0KKworCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgaXJxLCBTQV9JTlRFUlJVUFQpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBlcnI2OworCisJY3JlYXRlX2RlYnVnX2ZpbGUoaXNwMTE2eCk7CisJcmV0dXJuIDA7CisKKyAgICAgIGVycjY6CisJdXNiX3B1dF9oY2QoaGNkKTsKKyAgICAgIGVycjU6CisJaW91bm1hcChkYXRhX3JlZyk7CisgICAgICBlcnI0OgorCXJlbGVhc2VfbWVtX3JlZ2lvbihkYXRhLT5zdGFydCwgMik7CisgICAgICBlcnIzOgorCWlvdW5tYXAoYWRkcl9yZWcpOworICAgICAgZXJyMjoKKwlyZWxlYXNlX21lbV9yZWdpb24oYWRkci0+c3RhcnQsIDIpOworICAgICAgZXJyMToKKwlFUlIoImluaXQgZXJyb3IsICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZglDT05GSUdfUE0KKy8qCisgIFN1c3BlbmQgb2YgcGxhdGZvcm0gZGV2aWNlCisqLworc3RhdGljIGludCBpc3AxMTZ4X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBwaGFzZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlWREJHKCIlczogc3RhdGUgJXgsIHBoYXNlICV4XG4iLCBfX2Z1bmNfXywgc3RhdGUsIHBoYXNlKTsKKworCWlmIChwaGFzZSAhPSBTVVNQRU5EX0RJU0FCTEUgJiYgcGhhc2UgIT0gU1VTUEVORF9QT1dFUl9ET1dOKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHVzYl9zdXNwZW5kX2RldmljZShoY2QtPnNlbGYucm9vdF9odWIsIHN0YXRlKTsKKwlpZiAoIXJldCkgeworCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJCUlORk8oIiVzIHN1c3BlbmRlZFxuIiwgaGNkX25hbWUpOworCX0gZWxzZQorCQlFUlIoIiVzIHN1c3BlbmQgZmFpbGVkXG4iLCBoY2RfbmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICBSZXN1bWUgcGxhdGZvcm0gZGV2aWNlCisqLworc3RhdGljIGludCBpc3AxMTZ4X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBwaGFzZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlWREJHKCIlczogIHN0YXRlICV4LCBwaGFzZSAleFxuIiwgX19mdW5jX18sIGRldi0+cG93ZXIucG93ZXJfc3RhdGUsCisJICAgICBwaGFzZSk7CisJaWYgKHBoYXNlICE9IFJFU1VNRV9QT1dFUl9PTikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB1c2JfcmVzdW1lX2RldmljZShoY2QtPnNlbGYucm9vdF9odWIpOworCWlmICghcmV0KSB7CisJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCQlWREJHKCIlcyByZXN1bWVkXG4iLCAoY2hhciAqKWhjZF9uYW1lKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2Vsc2UKKworI2RlZmluZQlpc3AxMTZ4X3N1c3BlbmQgICAgTlVMTAorI2RlZmluZQlpc3AxMTZ4X3Jlc3VtZSAgICAgTlVMTAorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGlzcDExNnhfZHJpdmVyID0geworCS5uYW1lID0gKGNoYXIgKiloY2RfbmFtZSwKKwkuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlLAorCS5wcm9iZSA9IGlzcDExNnhfcHJvYmUsCisJLnJlbW92ZSA9IGlzcDExNnhfcmVtb3ZlLAorCS5zdXNwZW5kID0gaXNwMTE2eF9zdXNwZW5kLAorCS5yZXN1bWUgPSBpc3AxMTZ4X3Jlc3VtZSwKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9faW5pdCBpc3AxMTZ4X2luaXQodm9pZCkKK3sKKwlpZiAodXNiX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCisJSU5GTygiZHJpdmVyICVzLCAlc1xuIiwgaGNkX25hbWUsIERSSVZFUl9WRVJTSU9OKTsKKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZpc3AxMTZ4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGlzcDExNnhfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpc3AxMTZ4X2NsZWFudXAodm9pZCkKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmaXNwMTE2eF9kcml2ZXIpOworfQorCittb2R1bGVfZXhpdChpc3AxMTZ4X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LmggYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg3MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LmgKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBJU1AxMTZ4IHJlZ2lzdGVyIGRlY2xhcmF0aW9ucyBhbmQgSENEIGRhdGEgc3RydWN0dXJlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBPbGF2IEtvbmdhcyA8b2tAYXJ0ZWNkZXNpZ24uZWU+CisgKiBQb3J0aW9uczoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBMb3RoYXIgV2Fzc21hbm4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBQc2lvbiBUZWtsb2dpeAorICogQ29weXJpZ2h0IChDKSAyMDA0IERhdmlkIEJyb3duZWxsCisgKi8KKworLyogdXMgb2YgMW1zIGZyYW1lICovCisjZGVmaW5lICBNQVhfTE9BRF9MSU1JVAkJODUwCisKKy8qIEZ1bGwgc3BlZWQ6IG1heCAjIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGZvciBhIHNpbmdsZSB1cmIKKyAgIGF0IGEgdGltZSBtdXN0IGJlIDwgMTAyNCAmJiBtdXN0IGJlIG11bHRpcGxlIG9mIDY0LgorICAgODMyIGFsbG93cyB0cmFuc2ZlcmluZyA0a2lCIHdpdGhpbiA1IGZyYW1lcy4gKi8KKyNkZWZpbmUgTUFYX1RSQU5TRkVSX1NJWkVfRlVMTFNQRUVECTgzMgorCisvKiBMb3cgc3BlZWQ6IHRoZXJlIGlzIG5vIHJlYXNvbiB0byBzY2hlZHVsZSBpbiB2ZXJ5IGJpZworICAgY2h1bmtzOyBvZnRlbiB0aGUgcmVxdWVzdGVkIGxvbmcgdHJhbnNmZXJzIGFyZSBmb3IKKyAgIHN0cmluZyBkZXNjcmlwdG9ycyBjb250YWluaW5nIHNob3J0IHN0cmluZ3MuICovCisjZGVmaW5lIE1BWF9UUkFOU0ZFUl9TSVpFX0xPV1NQRUVECTY0CisKKy8qIEJ5dGV0aW1lICh1cyksIGEgcm91Z2ggaW5kaWNhdGlvbiBvZiBob3cgbXVjaCB0aW1lIGl0CisgICB3b3VsZCB0YWtlIHRvIHRyYW5zZmVyIGEgYnl0ZSBvZiB1c2VmdWwgZGF0YSBvdmVyIFVTQiAqLworI2RlZmluZSBCWVRFX1RJTUVfRlVMTFNQRUVECTEKKyNkZWZpbmUgQllURV9USU1FX0xPV1NQRUVECTIwCisKKy8qIEJ1ZmZlciBzaXplcyAqLworI2RlZmluZSBJU1AxMTZ4X0JVRl9TSVpFCTQwOTYKKyNkZWZpbmUgSVNQMTE2eF9JVExfQlVGU0laRQkwCisjZGVmaW5lIElTUDExNnhfQVRMX0JVRlNJWkUJKChJU1AxMTZ4X0JVRl9TSVpFKSAtIDIqKElTUDExNnhfSVRMX0JVRlNJWkUpKQorCisjZGVmaW5lIElTUDExNnhfV1JJVEVfT0ZGU0VUCTB4ODAKKworLyotLS0tLS0tLS0tLS0gSVNQMTE2eCByZWdpc3RlcnMvYml0cyAtLS0tLS0tLS0tLS0qLworI2RlZmluZQlIQ1JFVklTSU9OCTB4MDAKKyNkZWZpbmUJSENDT05UUk9MCTB4MDEKKyNkZWZpbmUJCUhDQ09OVFJPTF9IQ0ZTCSgzIDw8IDYpCS8qIGhvc3QgY29udHJvbGxlcgorCQkJCQkJICAgZnVuY3Rpb25hbCBzdGF0ZSAqLworI2RlZmluZQkJSENDT05UUk9MX1VTQl9SRVNFVAkoMCA8PCA2KQorI2RlZmluZQkJSENDT05UUk9MX1VTQl9SRVNVTUUJKDEgPDwgNikKKyNkZWZpbmUJCUhDQ09OVFJPTF9VU0JfT1BFUgkoMiA8PCA2KQorI2RlZmluZQkJSENDT05UUk9MX1VTQl9TVVNQRU5ECSgzIDw8IDYpCisjZGVmaW5lCQlIQ0NPTlRST0xfUldDCSgxIDw8IDkpCS8qIHJlbW90ZSB3YWtldXAgY29ubmVjdGVkICovCisjZGVmaW5lCQlIQ0NPTlRST0xfUldFCSgxIDw8IDEwKQkvKiByZW1vdGUgd2FrZXVwIGVuYWJsZSAqLworI2RlZmluZQlIQ0NNRFNUQVQJMHgwMgorI2RlZmluZQkJSENDTURTVEFUX0hDUgkoMSA8PCAwKQkvKiBob3N0IGNvbnRyb2xsZXIgcmVzZXQgKi8KKyNkZWZpbmUJCUhDQ01EU1RBVF9TT0MJKDMgPDwgMTYpCS8qIHNjaGVkdWxpbmcgb3ZlcnJ1biBjb3VudCAqLworI2RlZmluZQlIQ0lOVFNUQVQJMHgwMworI2RlZmluZQkJSENJTlRfU08JKDEgPDwgMCkJLyogc2NoZWR1bGluZyBvdmVycnVuICovCisjZGVmaW5lCQlIQ0lOVF9XREgJKDEgPDwgMSkJLyogd3JpdGViYWNrIG9mIGRvbmVfaGVhZCAqLworI2RlZmluZQkJSENJTlRfU0YJKDEgPDwgMikJLyogc3RhcnQgZnJhbWUgKi8KKyNkZWZpbmUJCUhDSU5UX1JECSgxIDw8IDMpCS8qIHJlc3VtZSBkZXRlY3QgKi8KKyNkZWZpbmUJCUhDSU5UX1VFCSgxIDw8IDQpCS8qIHVucmVjb3ZlcmFibGUgZXJyb3IgKi8KKyNkZWZpbmUJCUhDSU5UX0ZOTwkoMSA8PCA1KQkvKiBmcmFtZSBudW1iZXIgb3ZlcmZsb3cgKi8KKyNkZWZpbmUJCUhDSU5UX1JIU0MJKDEgPDwgNikJLyogcm9vdCBodWIgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQkJSENJTlRfT0MJKDEgPDwgMzApCS8qIG93bmVyc2hpcCBjaGFuZ2UgKi8KKyNkZWZpbmUJCUhDSU5UX01JRQkoMSA8PCAzMSkJLyogbWFzdGVyIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSENJTlRFTkIJMHgwNAorI2RlZmluZQlIQ0lOVERJUwkweDA1CisjZGVmaW5lCUhDRk1JTlRWTAkweDBkCisjZGVmaW5lCUhDRk1SRU0JCTB4MGUKKyNkZWZpbmUJSENGTU5VTQkJMHgwZgorI2RlZmluZQlIQ0xTVEhSRVNICTB4MTEKKyNkZWZpbmUJSENSSERFU0NBCTB4MTIKKyNkZWZpbmUJCVJIX0FfTkRQCSgweDMgPDwgMCkJLyogIyBkb3duc3RyZWFtIHBvcnRzICovCisjZGVmaW5lCQlSSF9BX1BTTQkoMSA8PCA4KQkvKiBwb3dlciBzd2l0Y2hpbmcgbW9kZSAqLworI2RlZmluZQkJUkhfQV9OUFMJKDEgPDwgOSkJLyogbm8gcG93ZXIgc3dpdGNoaW5nICovCisjZGVmaW5lCQlSSF9BX0RUCQkoMSA8PCAxMCkJLyogZGV2aWNlIHR5cGUgKG1ieikgKi8KKyNkZWZpbmUJCVJIX0FfT0NQTQkoMSA8PCAxMSkJLyogb3ZlcmN1cnJlbnQgcHJvdGVjdGlvbgorCQkJCQkJICAgbW9kZSAqLworI2RlZmluZQkJUkhfQV9OT0NQCSgxIDw8IDEyKQkvKiBubyBvdmVyY3VycmVudCBwcm90ZWN0aW9uICovCisjZGVmaW5lCQlSSF9BX1BPVFBHVAkoMHhmZiA8PCAyNCkJLyogcG93ZXIgb24gLT4gcG93ZXIgZ29vZAorCQkJCQkJICAgdGltZSAqLworI2RlZmluZQlIQ1JIREVTQ0IJMHgxMworI2RlZmluZQkJUkhfQl9EUgkJKDB4ZmZmZiA8PCAwKQkvKiBkZXZpY2UgcmVtb3ZhYmxlIGZsYWdzICovCisjZGVmaW5lCQlSSF9CX1BQQ00JKDB4ZmZmZiA8PCAxNikJLyogcG9ydCBwb3dlciBjb250cm9sIG1hc2sgKi8KKyNkZWZpbmUJSENSSFNUQVRVUwkweDE0CisjZGVmaW5lCQlSSF9IU19MUFMJKDEgPDwgMCkJLyogbG9jYWwgcG93ZXIgc3RhdHVzICovCisjZGVmaW5lCQlSSF9IU19PQ0kJKDEgPDwgMSkJLyogb3ZlciBjdXJyZW50IGluZGljYXRvciAqLworI2RlZmluZQkJUkhfSFNfRFJXRQkoMSA8PCAxNSkJLyogZGV2aWNlIHJlbW90ZSB3YWtldXAKKwkJCQkJCSAgIGVuYWJsZSAqLworI2RlZmluZQkJUkhfSFNfTFBTQwkoMSA8PCAxNikJLyogbG9jYWwgcG93ZXIgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQkJUkhfSFNfT0NJQwkoMSA8PCAxNykJLyogb3ZlciBjdXJyZW50IGluZGljYXRvcgorCQkJCQkJICAgY2hhbmdlICovCisjZGVmaW5lCQlSSF9IU19DUldFCSgxIDw8IDMxKQkvKiBjbGVhciByZW1vdGUgd2FrZXVwCisJCQkJCQkgICBlbmFibGUgKi8KKyNkZWZpbmUJSENSSFBPUlQxCTB4MTUKKyNkZWZpbmUJCVJIX1BTX0NDUwkoMSA8PCAwKQkvKiBjdXJyZW50IGNvbm5lY3Qgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19QRVMJKDEgPDwgMSkJLyogcG9ydCBlbmFibGUgc3RhdHVzICovCisjZGVmaW5lCQlSSF9QU19QU1MJKDEgPDwgMikJLyogcG9ydCBzdXNwZW5kIHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfUE9DSQkoMSA8PCAzKQkvKiBwb3J0IG92ZXIgY3VycmVudAorCQkJCQkJICAgaW5kaWNhdG9yICovCisjZGVmaW5lCQlSSF9QU19QUlMJKDEgPDwgNCkJLyogcG9ydCByZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUJCVJIX1BTX1BQUwkoMSA8PCA4KQkvKiBwb3J0IHBvd2VyIHN0YXR1cyAqLworI2RlZmluZQkJUkhfUFNfTFNEQQkoMSA8PCA5KQkvKiBsb3cgc3BlZWQgZGV2aWNlIGF0dGFjaGVkICovCisjZGVmaW5lCQlSSF9QU19DU0MJKDEgPDwgMTYpCS8qIGNvbm5lY3Qgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQkJUkhfUFNfUEVTQwkoMSA8PCAxNykJLyogcG9ydCBlbmFibGUgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQkJUkhfUFNfUFNTQwkoMSA8PCAxOCkJLyogcG9ydCBzdXNwZW5kIHN0YXR1cworCQkJCQkJICAgY2hhbmdlICovCisjZGVmaW5lCQlSSF9QU19PQ0lDCSgxIDw8IDE5KQkvKiBvdmVyIGN1cnJlbnQgaW5kaWNhdG9yCisJCQkJCQkgICBjaGFuZ2UgKi8KKyNkZWZpbmUJCVJIX1BTX1BSU0MJKDEgPDwgMjApCS8qIHBvcnQgcmVzZXQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQkJSENSSFBPUlRfQ0xSTUFTSwkoMHgxZiA8PCAxNikKKyNkZWZpbmUJSENSSFBPUlQyCTB4MTYKKyNkZWZpbmUJSENIV0NGRwkJMHgyMAorI2RlZmluZQkJSENIV0NGR18xNUtSU0VMCQkoMSA8PCAxMikKKyNkZWZpbmUJCUhDSFdDRkdfQ0xLTk9UU1RPUAkoMSA8PCAxMSkKKyNkZWZpbmUJCUhDSFdDRkdfQU5BTE9HX09DCSgxIDw8IDEwKQorI2RlZmluZQkJSENIV0NGR19EQUNLX01PREUJKDEgPDwgOCkKKyNkZWZpbmUJCUhDSFdDRkdfRU9UX1BPTAkJKDEgPDwgNykKKyNkZWZpbmUJCUhDSFdDRkdfREFDS19QT0wJKDEgPDwgNikKKyNkZWZpbmUJCUhDSFdDRkdfRFJFUV9QT0wJKDEgPDwgNSkKKyNkZWZpbmUJCUhDSFdDRkdfREJXSURUSF9NQVNLCSgweDAzIDw8IDMpCisjZGVmaW5lCQlIQ0hXQ0ZHX0RCV0lEVEgobikJKCgobikgPDwgMykgJiBIQ0hXQ0ZHX0RCV0lEVEhfTUFTSykKKyNkZWZpbmUJCUhDSFdDRkdfSU5UX1BPTAkJKDEgPDwgMikKKyNkZWZpbmUJCUhDSFdDRkdfSU5UX1RSSUdHRVIJKDEgPDwgMSkKKyNkZWZpbmUJCUhDSFdDRkdfSU5UX0VOQUJMRQkoMSA8PCAwKQorI2RlZmluZQlIQ0RNQUNGRwkweDIxCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU5fTUFTSwkoMHgwMyA8PCA1KQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOKG4pCSgoKG4pIDw8IDUpICYgSENETUFDRkdfQlVSU1RfTEVOX01BU0spCisjZGVmaW5lCQlIQ0RNQUNGR19CVVJTVF9MRU5fMQlIQ0RNQUNGR19CVVJTVF9MRU4oMCkKKyNkZWZpbmUJCUhDRE1BQ0ZHX0JVUlNUX0xFTl80CUhDRE1BQ0ZHX0JVUlNUX0xFTigxKQorI2RlZmluZQkJSENETUFDRkdfQlVSU1RfTEVOXzgJSENETUFDRkdfQlVSU1RfTEVOKDIpCisjZGVmaW5lCQlIQ0RNQUNGR19ETUFfRU5BQkxFCSgxIDw8IDQpCisjZGVmaW5lCQlIQ0RNQUNGR19CVUZfVFlQRV9NQVNLCSgweDA3IDw8IDEpCisjZGVmaW5lCQlIQ0RNQUNGR19DVFJfU0VMCSgxIDw8IDIpCisjZGVmaW5lCQlIQ0RNQUNGR19JVExBVExfU0VMCSgxIDw8IDEpCisjZGVmaW5lCQlIQ0RNQUNGR19ETUFfUldfU0VMRUNUCSgxIDw8IDApCisjZGVmaW5lCUhDWEZFUkNUUgkweDIyCisjZGVmaW5lCUhDdVBJTlQJCTB4MjQKKyNkZWZpbmUJCUhDdVBJTlRfU09GCQkoMSA8PCAwKQorI2RlZmluZQkJSEN1UElOVF9BVEwJCSgxIDw8IDEpCisjZGVmaW5lCQlIQ3VQSU5UX0FJSUVPVAkJKDEgPDwgMikKKyNkZWZpbmUJCUhDdVBJTlRfT1BSCQkoMSA8PCA0KQorI2RlZmluZQkJSEN1UElOVF9TVVNQCQkoMSA8PCA1KQorI2RlZmluZQkJSEN1UElOVF9DTEtSRFkJCSgxIDw8IDYpCisjZGVmaW5lCUhDdVBJTlRFTkIJMHgyNQorI2RlZmluZQlIQ0NISVBJRAkweDI3CisjZGVmaW5lCQlIQ0NISVBJRF9NQVNLCQkweGZmMDAKKyNkZWZpbmUJCUhDQ0hJUElEX01BR0lDCQkweDYxMDAKKyNkZWZpbmUJSENTQ1JBVENICTB4MjgKKyNkZWZpbmUJSENTV1JFUwkJMHgyOQorI2RlZmluZQkJSENTV1JFU19NQUdJQwkJMHgwMGY2CisjZGVmaW5lCUhDSVRMQlVGTEVOCTB4MmEKKyNkZWZpbmUJSENBVExCVUZMRU4JMHgyYgorI2RlZmluZQlIQ0JVRlNUQVQJMHgyYworI2RlZmluZQkJSENCVUZTVEFUX0lUTDBfRlVMTAkoMSA8PCAwKQorI2RlZmluZQkJSENCVUZTVEFUX0lUTDFfRlVMTAkoMSA8PCAxKQorI2RlZmluZQkJSENCVUZTVEFUX0FUTF9GVUxMCSgxIDw8IDIpCisjZGVmaW5lCQlIQ0JVRlNUQVRfSVRMMF9ET05FCSgxIDw8IDMpCisjZGVmaW5lCQlIQ0JVRlNUQVRfSVRMMV9ET05FCSgxIDw8IDQpCisjZGVmaW5lCQlIQ0JVRlNUQVRfQVRMX0RPTkUJKDEgPDwgNSkKKyNkZWZpbmUJSENSRElUTDBMRU4JMHgyZAorI2RlZmluZQlIQ1JESVRMMUxFTgkweDJlCisjZGVmaW5lCUhDSVRMUE9SVAkweDQwCisjZGVmaW5lCUhDQVRMUE9SVAkweDQxCisKKy8qIFBoaWxpcHMgdHJhbnNmZXIgZGVzY3JpcHRvciAqLworc3RydWN0IHB0ZCB7CisJdTE2IGNvdW50OworI2RlZmluZQlQVERfQ09VTlRfTVNLCSgweDNmZiA8PCAwKQorI2RlZmluZQlQVERfVE9HR0xFX01TSwkoMSA8PCAxMCkKKyNkZWZpbmUJUFREX0FDVElWRV9NU0sJKDEgPDwgMTEpCisjZGVmaW5lCVBURF9DQ19NU0sJKDB4ZiA8PCAxMikKKwl1MTYgbXBzOworI2RlZmluZQlQVERfTVBTX01TSwkoMHgzZmYgPDwgMCkKKyNkZWZpbmUJUFREX1NQRF9NU0sJKDEgPDwgMTApCisjZGVmaW5lCVBURF9MQVNUX01TSwkoMSA8PCAxMSkKKyNkZWZpbmUJUFREX0VQX01TSwkoMHhmIDw8IDEyKQorCXUxNiBsZW47CisjZGVmaW5lCVBURF9MRU5fTVNLCSgweDNmZiA8PCAwKQorI2RlZmluZQlQVERfRElSX01TSwkoMyA8PCAxMCkKKyNkZWZpbmUJUFREX0RJUl9TRVRVUAkoMCkKKyNkZWZpbmUJUFREX0RJUl9PVVQJKDEpCisjZGVmaW5lCVBURF9ESVJfSU4JKDIpCisjZGVmaW5lCVBURF9CNV81X01TSwkoMSA8PCAxMykKKwl1MTYgZmFkZHI7CisjZGVmaW5lCVBURF9GQV9NU0sJKDB4N2YgPDwgMCkKKyNkZWZpbmUJUFREX0ZNVF9NU0sJKDEgPDwgNykKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCgyKSkpOworCisvKiBQVEQgYWNjZXNzb3IgbWFjcm9zLiAqLworI2RlZmluZSBQVERfR0VUX0NPVU5UKHApCSgoKHApLT5jb3VudCAmIFBURF9DT1VOVF9NU0spID4+IDApCisjZGVmaW5lIFBURF9DT1VOVCh2KQkJKCgodikgPDwgMCkgJiBQVERfQ09VTlRfTVNLKQorI2RlZmluZSBQVERfR0VUX1RPR0dMRShwKQkoKChwKS0+Y291bnQgJiBQVERfVE9HR0xFX01TSykgPj4gMTApCisjZGVmaW5lIFBURF9UT0dHTEUodikJCSgoKHYpIDw8IDEwKSAmIFBURF9UT0dHTEVfTVNLKQorI2RlZmluZSBQVERfR0VUX0FDVElWRShwKQkoKChwKS0+Y291bnQgJiBQVERfQUNUSVZFX01TSykgPj4gMTEpCisjZGVmaW5lIFBURF9BQ1RJVkUodikJCSgoKHYpIDw8IDExKSAmIFBURF9BQ1RJVkVfTVNLKQorI2RlZmluZSBQVERfR0VUX0NDKHApCQkoKChwKS0+Y291bnQgJiBQVERfQ0NfTVNLKSA+PiAxMikKKyNkZWZpbmUgUFREX0NDKHYpCQkoKCh2KSA8PCAxMikgJiBQVERfQ0NfTVNLKQorI2RlZmluZSBQVERfR0VUX01QUyhwKQkJKCgocCktPm1wcyAmIFBURF9NUFNfTVNLKSA+PiAwKQorI2RlZmluZSBQVERfTVBTKHYpCQkoKCh2KSA8PCAwKSAmIFBURF9NUFNfTVNLKQorI2RlZmluZSBQVERfR0VUX1NQRChwKQkJKCgocCktPm1wcyAmIFBURF9TUERfTVNLKSA+PiAxMCkKKyNkZWZpbmUgUFREX1NQRCh2KQkJKCgodikgPDwgMTApICYgUFREX1NQRF9NU0spCisjZGVmaW5lIFBURF9HRVRfTEFTVChwKQkJKCgocCktPm1wcyAmIFBURF9MQVNUX01TSykgPj4gMTEpCisjZGVmaW5lIFBURF9MQVNUKHYpCQkoKCh2KSA8PCAxMSkgJiBQVERfTEFTVF9NU0spCisjZGVmaW5lIFBURF9HRVRfRVAocCkJCSgoKHApLT5tcHMgJiBQVERfRVBfTVNLKSA+PiAxMikKKyNkZWZpbmUgUFREX0VQKHYpCQkoKCh2KSA8PCAxMikgJiBQVERfRVBfTVNLKQorI2RlZmluZSBQVERfR0VUX0xFTihwKQkJKCgocCktPmxlbiAmIFBURF9MRU5fTVNLKSA+PiAwKQorI2RlZmluZSBQVERfTEVOKHYpCQkoKCh2KSA8PCAwKSAmIFBURF9MRU5fTVNLKQorI2RlZmluZSBQVERfR0VUX0RJUihwKQkJKCgocCktPmxlbiAmIFBURF9ESVJfTVNLKSA+PiAxMCkKKyNkZWZpbmUgUFREX0RJUih2KQkJKCgodikgPDwgMTApICYgUFREX0RJUl9NU0spCisjZGVmaW5lIFBURF9HRVRfQjVfNShwKQkJKCgocCktPmxlbiAmIFBURF9CNV81X01TSykgPj4gMTMpCisjZGVmaW5lIFBURF9CNV81KHYpCQkoKCh2KSA8PCAxMykgJiBQVERfQjVfNV9NU0spCisjZGVmaW5lIFBURF9HRVRfRkEocCkJCSgoKHApLT5mYWRkciAmIFBURF9GQV9NU0spID4+IDApCisjZGVmaW5lIFBURF9GQSh2KQkJKCgodikgPDwgMCkgJiBQVERfRkFfTVNLKQorI2RlZmluZSBQVERfR0VUX0ZNVChwKQkJKCgocCktPmZhZGRyICYgUFREX0ZNVF9NU0spID4+IDcpCisjZGVmaW5lIFBURF9GTVQodikJCSgoKHYpIDw8IDcpICYgUFREX0ZNVF9NU0spCisKKy8qICBIYXJkd2FyZSB0cmFuc2ZlciBzdGF0dXMgY29kZXMgLS0gQ0MgZnJvbSBwdGQtPmNvdW50ICovCisjZGVmaW5lIFREX0NDX05PRVJST1IgICAgICAweDAwCisjZGVmaW5lIFREX0NDX0NSQyAgICAgICAgICAweDAxCisjZGVmaW5lIFREX0NDX0JJVFNUVUZGSU5HICAweDAyCisjZGVmaW5lIFREX0NDX0RBVEFUT0dHTEVNICAweDAzCisjZGVmaW5lIFREX0NDX1NUQUxMICAgICAgICAweDA0CisjZGVmaW5lIFREX0RFVk5PVFJFU1AgICAgICAweDA1CisjZGVmaW5lIFREX1BJRENIRUNLRkFJTCAgICAweDA2CisjZGVmaW5lIFREX1VORVhQRUNURURQSUQgICAweDA3CisjZGVmaW5lIFREX0RBVEFPVkVSUlVOICAgICAweDA4CisjZGVmaW5lIFREX0RBVEFVTkRFUlJVTiAgICAweDA5CisgICAgLyogMHgwQSwgMHgwQiByZXNlcnZlZCBmb3IgaGFyZHdhcmUgKi8KKyNkZWZpbmUgVERfQlVGRkVST1ZFUlJVTiAgIDB4MEMKKyNkZWZpbmUgVERfQlVGRkVSVU5ERVJSVU4gIDB4MEQKKyAgICAvKiAweDBFLCAweDBGIHJlc2VydmVkIGZvciBIQ0QgKi8KKyNkZWZpbmUgVERfTk9UQUNDRVNTRUQgICAgIDB4MEYKKworLyogbWFwIFBURCBzdGF0dXMgY29kZXMgKENDKSB0byBlcnJubyB2YWx1ZXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgY2NfdG9fZXJyb3JbMTZdID0geworCS8qIE5vICBFcnJvciAgKi8gMCwKKwkvKiBDUkMgRXJyb3IgICovIC1FSUxTRVEsCisJLyogQml0IFN0dWZmICAqLyAtRVBST1RPLAorCS8qIERhdGEgVG9nZyAgKi8gLUVJTFNFUSwKKwkvKiBTdGFsbCAgICAgICovIC1FUElQRSwKKwkvKiBEZXZOb3RSZXNwICovIC1FVElNRURPVVQsCisJLyogUElEQ2hlY2sgICAqLyAtRVBST1RPLAorCS8qIFVuRXhwUElEICAgKi8gLUVQUk9UTywKKwkvKiBEYXRhT3ZlciAgICovIC1FT1ZFUkZMT1csCisJLyogRGF0YVVuZGVyICAqLyAtRVJFTU9URUlPLAorCS8qIChmb3IgaHcpICAgKi8gLUVJTywKKwkvKiAoZm9yIGh3KSAgICovIC1FSU8sCisJLyogQnVmZmVyT3ZlciAqLyAtRUNPTU0sCisJLyogQnVmZlVuZGVyICAqLyAtRU5PU1IsCisJLyogKGZvciBIQ0QpICAqLyAtRUFMUkVBRFksCisJLyogKGZvciBIQ0QpICAqLyAtRUFMUkVBRFkKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lCUxPRzJfUEVSSU9ESUNfU0laRQk1CS8qIGFyYml0cmFyeTsgdGhpcyBtYXRjaGVzIE9IQ0kgKi8KKyNkZWZpbmUJUEVSSU9ESUNfU0laRQkJKDEgPDwgTE9HMl9QRVJJT0RJQ19TSVpFKQorCitzdHJ1Y3QgaXNwMTE2eCB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByaF9yZXN1bWU7CisKKwl2b2lkIF9faW9tZW0gKmFkZHJfcmVnOworCXZvaWQgX19pb21lbSAqZGF0YV9yZWc7CisKKwlzdHJ1Y3QgaXNwMTE2eF9wbGF0Zm9ybV9kYXRhICpib2FyZDsKKworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGRlOworCXVuc2lnbmVkIGxvbmcgc3RhdDEsIHN0YXQyLCBzdGF0NCwgc3RhdDgsIHN0YXQxNjsKKworCS8qIEhDIHJlZ2lzdGVycyAqLworCXUzMiBpbnRlbmI7CQkvKiAiT0hDSSIgaW50ZXJydXB0cyAqLworCXUxNiBpcnFlbmI7CQkvKiB1UCBpbnRlcnJ1cHRzICovCisKKwkvKiBSb290IGh1YiByZWdpc3RlcnMgKi8KKwl1MzIgcmhkZXNjYTsKKwl1MzIgcmhkZXNjYjsKKwl1MzIgcmhzdGF0dXM7CisJdTMyIHJocG9ydFsyXTsKKworCS8qIGFzeW5jIHNjaGVkdWxlOiBjb250cm9sLCBidWxrICovCisJc3RydWN0IGxpc3RfaGVhZCBhc3luYzsKKworCS8qIHBlcmlvZGljIHNjaGVkdWxlOiBpbnQgKi8KKwl1MTYgbG9hZFtQRVJJT0RJQ19TSVpFXTsKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqcGVyaW9kaWNbUEVSSU9ESUNfU0laRV07CisJdW5zaWduZWQgcGVyaW9kaWNfY291bnQ7CisJdTE2IGZtaW5kZXg7CisKKwkvKiBTY2hlZHVsZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgKi8KKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqYXRsX2FjdGl2ZTsKKwlpbnQgYXRsX2J1ZmxlbjsKKwlpbnQgYXRsX2J1ZnNocnQ7CisJaW50IGF0bF9sYXN0X2RpcjsKKwlhdG9taWNfdCBhdGxfZmluaXNoaW5nOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXNwMTE2eCAqaGNkX3RvX2lzcDExNngoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBpc3AxMTZ4ICopKGhjZC0+aGNkX3ByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaGNkICppc3AxMTZ4X3RvX2hjZChzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopaXNwMTE2eCwgc3RydWN0IHVzYl9oY2QsIGhjZF9wcml2KTsKK30KKworc3RydWN0IGlzcDExNnhfZXAgeworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCXN0cnVjdCBwdGQgcHRkOworCisJdTggbWF4cGFja2V0OworCXU4IGVwbnVtOworCXU4IG5leHRwaWQ7CisJdTE2IGVycm9yX2NvdW50OworCXUxNiBsZW5ndGg7CQkvKiBvZiBjdXJyZW50IHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CS8qIHRvIGRhdGFidWYgKi8KKwkvKiBxdWV1ZSBvZiBhY3RpdmUgRVAncyAodGhlIG9uZXMgc2NoZWR1bGVkIGZvciB0aGUKKwkgICBjdXJyZW50IGZyYW1lKSAqLworCXN0cnVjdCBpc3AxMTZ4X2VwICphY3RpdmU7CisKKwkvKiBwZXJpb2RpYyBzY2hlZHVsZSAqLworCXUxNiBwZXJpb2Q7CisJdTE2IGJyYW5jaDsKKwl1MTYgbG9hZDsKKwlzdHJ1Y3QgaXNwMTE2eF9lcCAqbmV4dDsKKworCS8qIGFzeW5jIHNjaGVkdWxlICovCisJc3RydWN0IGxpc3RfaGVhZCBzY2hlZHVsZTsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9ERUJVRyAiMTE2eDogIiBzdHVmZikKKyNlbHNlCisjZGVmaW5lIERCRyhzdHVmZi4uLikJCWRve313aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBWRVJCT1NFCisjICAgIGRlZmluZSBWREJHCQlEQkcKKyNlbHNlCisjICAgIGRlZmluZSBWREJHKHN0dWZmLi4uKQlkb3t9d2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIEVSUihzdHVmZi4uLikJCXByaW50ayhLRVJOX0VSUiAiMTE2eDogIiBzdHVmZikKKyNkZWZpbmUgV0FSTihzdHVmZi4uLikJCXByaW50ayhLRVJOX1dBUk5JTkcgIjExNng6ICIgc3R1ZmYpCisjZGVmaW5lIElORk8oc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9JTkZPICIxMTZ4OiAiIHN0dWZmKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKFVTRV9QTEFURk9STV9ERUxBWSkKKyNpZiBkZWZpbmVkKFVTRV9OREVMQVkpCisjZXJyb3IgVVNFX1BMQVRGT1JNX0RFTEFZIGFuZCBVU0VfTkRFTEFZIHNpbXVsdGFuZW91c2x5IGRlZmluZWQuCisjZW5kaWYKKyNkZWZpbmUJaXNwMTE2eF9kZWxheShoLGQpCShoKS0+Ym9hcmQtPmRlbGF5KAlcCisJCQkJaXNwMTE2eF90b19oY2QoaCktPnNlbGYuY29udHJvbGxlcixkKQorI2RlZmluZSBpc3AxMTZ4X2NoZWNrX3BsYXRmb3JtX2RlbGF5KGgpCSgoaCktPmJvYXJkLT5kZWxheSA9PSBOVUxMKQorI2VsaWYgZGVmaW5lZChVU0VfTkRFTEFZKQorI2RlZmluZQlpc3AxMTZ4X2RlbGF5KGgsZCkJbmRlbGF5KGQpCisjZGVmaW5lIGlzcDExNnhfY2hlY2tfcGxhdGZvcm1fZGVsYXkoaCkJMAorI2Vsc2UKKyNkZWZpbmUJaXNwMTE2eF9kZWxheShoLGQpCWRve313aGlsZSgwKQorI2RlZmluZSBpc3AxMTZ4X2NoZWNrX3BsYXRmb3JtX2RlbGF5KGgpCTAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERUJVRykKKyNkZWZpbmUJSVJRX1RFU1QoKQlCVUdfT04oIWlycXNfZGlzYWJsZWQoKSkKKyNlbHNlCisjZGVmaW5lCUlSUV9URVNUKCkJZG97fXdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfd3JpdGVfYWRkcihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCUlSUV9URVNUKCk7CisJd3JpdGV3KHJlZyAmIDB4ZmYsIGlzcDExNngtPmFkZHJfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDMwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3dyaXRlX2RhdGExNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdTE2IHZhbCkKK3sKKwl3cml0ZXcodmFsLCBpc3AxMTZ4LT5kYXRhX3JlZyk7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAxNTApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXNwMTE2eF9yYXdfd3JpdGVfZGF0YTE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MTYgdmFsKQoreworCV9fcmF3X3dyaXRldyh2YWwsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDE1MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGlzcDExNnhfcmVhZF9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDE1MCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MTYgaXNwMTE2eF9yYXdfcmVhZF9kYXRhMTYoc3RydWN0IGlzcDExNnggKmlzcDExNngpCit7CisJdTE2IHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWR3KGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDE1MCk7CisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlzcDExNnhfd3JpdGVfZGF0YTMyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1MzIgdmFsKQoreworCXdyaXRldyh2YWwgJiAweGZmZmYsIGlzcDExNngtPmRhdGFfcmVnKTsKKwlpc3AxMTZ4X2RlbGF5KGlzcDExNngsIDE1MCk7CisJd3JpdGV3KHZhbCA+PiAxNiwgaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgMTUwKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaXNwMTE2eF9yZWFkX2RhdGEzMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKHUzMikgcmVhZHcoaXNwMTE2eC0+ZGF0YV9yZWcpOworCWlzcDExNnhfZGVsYXkoaXNwMTE2eCwgMTUwKTsKKwl2YWwgfD0gKCh1MzIpIHJlYWR3KGlzcDExNngtPmRhdGFfcmVnKSkgPDwgMTY7CisJaXNwMTE2eF9kZWxheShpc3AxMTZ4LCAxNTApOworCXJldHVybiB2YWw7Cit9CisKKy8qIExldCdzIGtlZXAgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyBvdXQgb2YgbGluZS4gSGludDoKKyAgIHdlIHdhaXQgYXQgbGVhc3QgMTUwIG5zIGF0IGV2ZXJ5IGFjY2Vzcy4KKyovCitzdGF0aWMgdTE2IGlzcDExNnhfcmVhZF9yZWcxNihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcpOworCXJldHVybiBpc3AxMTZ4X3JlYWRfZGF0YTE2KGlzcDExNngpOworfQorCitzdGF0aWMgdTMyIGlzcDExNnhfcmVhZF9yZWczMihzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCwgdW5zaWduZWQgcmVnKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcpOworCXJldHVybiBpc3AxMTZ4X3JlYWRfZGF0YTMyKGlzcDExNngpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3dyaXRlX3JlZzE2KHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcsCisJCQkJdW5zaWduZWQgdmFsKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisJaXNwMTE2eF93cml0ZV9kYXRhMTYoaXNwMTE2eCwgKHUxNikgKHZhbCAmIDB4ZmZmZikpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMTZ4X3dyaXRlX3JlZzMyKHN0cnVjdCBpc3AxMTZ4ICppc3AxMTZ4LCB1bnNpZ25lZCByZWcsCisJCQkJdW5zaWduZWQgdmFsKQoreworCWlzcDExNnhfd3JpdGVfYWRkcihpc3AxMTZ4LCByZWcgfCBJU1AxMTZ4X1dSSVRFX09GRlNFVCk7CisJaXNwMTE2eF93cml0ZV9kYXRhMzIoaXNwMTE2eCwgKHUzMikgdmFsKTsKK30KKworI2RlZmluZSBpc3AxMTZ4X3Nob3dfcmVnKGQscikgewkJCQkJXAorCWlmICgocikgPCAweDIwKSB7CQkJICAgICAgICAgICAgICAgIFwKKwkJREJHKCIlLTEyc1slMDJ4XTogJTA4eFxuIiwgI3IsCQkJXAorCQkJciwgaXNwMTE2eF9yZWFkX3JlZzMyKGQsIHIpKTsJCVwKKwl9IGVsc2UgewkJCQkJCVwKKwkJREJHKCIlLTEyc1slMDJ4XTogICAgICUwNHhcbiIsICNyLAkJXAorCQkJciwgaXNwMTE2eF9yZWFkX3JlZzE2KGQsIHIpKTsJICAgIAlcCisJfQkJCQkJCQlcCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMTZ4X3Nob3dfcmVncyhzdHJ1Y3QgaXNwMTE2eCAqaXNwMTE2eCkKK3sKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDUkVWSVNJT04pOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENDT05UUk9MKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDQ01EU1RBVCk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ0lOVFNUQVQpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENJTlRFTkIpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENGTUlOVFZMKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDRk1SRU0pOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENGTU5VTSk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ0xTVEhSRVNIKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDUkhERVNDQSk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1JIREVTQ0IpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENSSFNUQVRVUyk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1JIUE9SVDEpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENSSFBPUlQyKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDSFdDRkcpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENETUFDRkcpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENYRkVSQ1RSKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDdVBJTlQpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSEN1UElOVEVOQik7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ0NISVBJRCk7CisJaXNwMTE2eF9zaG93X3JlZyhpc3AxMTZ4LCBIQ1NDUkFUQ0gpOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENJVExCVUZMRU4pOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENBVExCVUZMRU4pOworCWlzcDExNnhfc2hvd19yZWcoaXNwMTE2eCwgSENCVUZTVEFUKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDUkRJVEwwTEVOKTsKKwlpc3AxMTZ4X3Nob3dfcmVnKGlzcDExNngsIEhDUkRJVEwxTEVOKTsKK30KKworI2lmIGRlZmluZWQoVVJCX1RSQUNFKQorCisjZGVmaW5lIFBJUEVUWVBFKHBpcGUpICAoeyBjaGFyICpfX3M7CQkJXAorCWlmICh1c2JfcGlwZWNvbnRyb2wocGlwZSkpCV9fcyA9ICJjdHJsIjsJXAorCWVsc2UgaWYgKHVzYl9waXBlaW50KHBpcGUpKQlfX3MgPSAiaW50IjsJXAorCWVsc2UgaWYgKHVzYl9waXBlYnVsayhwaXBlKSkJX19zID0gImJ1bGsiOwlcCisJZWxzZQkJCQlfX3MgPSAiaXNvIjsJXAorCV9fczt9KQorI2RlZmluZSBQSVBFRElSKHBpcGUpICAgKHsgdXNiX3BpcGVpbihwaXBlKSA/ICJpbiIgOiAib3V0IjsgfSkKKyNkZWZpbmUgVVJCX05PVFNIT1JUKHVyYikgKHsgKHVyYiktPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSyA/IFwKKwkic2hvcnRfbm90X29rIiA6ICIiOyB9KQorCisvKiBwcmludCBkZWJ1ZyBpbmZvIGFib3V0IHRoZSBVUkIgKi8KK3N0YXRpYyB2b2lkIHVyYl9kYmcoc3RydWN0IHVyYiAqdXJiLCBjaGFyICptc2cpCit7CisJdW5zaWduZWQgaW50IHBpcGU7CisKKwlpZiAoIXVyYikgeworCQlEQkcoIiVzOiB6ZXJvIHVyYlxuIiwgbXNnKTsKKwkJcmV0dXJuOworCX0KKwlwaXBlID0gdXJiLT5waXBlOworCURCRygiJXM6IEZBICVkIGVwJWQlcyAlczogbGVuICVkLyVkICVzXG4iLCBtc2csCisJICAgIHVzYl9waXBlZGV2aWNlKHBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLAorCSAgICBQSVBFRElSKHBpcGUpLCBQSVBFVFlQRShwaXBlKSwKKwkgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgsIFVSQl9OT1RTSE9SVCh1cmIpKTsKK30KKworI2Vsc2UKKworI2RlZmluZSAgdXJiX2RiZyh1cmIsbXNnKSAgIGRve313aGlsZSgwKQorCisjZW5kaWYJCQkJLyogISBkZWZpbmVkKFVSQl9UUkFDRSkgKi8KKworI2lmIGRlZmluZWQoUFREX1RSQUNFKQorCisjZGVmaW5lIFBURF9ESVJfU1RSKHB0ZCkgICh7Y2hhciBfX2M7CQlcCisJc3dpdGNoKFBURF9HRVRfRElSKHB0ZCkpewkJXAorCWNhc2UgMDogIF9fYyA9ICdzJzsgYnJlYWs7CQlcCisJY2FzZSAxOiAgX19jID0gJ28nOyBicmVhazsJCVwKKwlkZWZhdWx0OiBfX2MgPSAnaSc7IGJyZWFrOwkJXAorCX07IF9fYzt9KQorCisvKgorICBEdW1wIFBURCBpbmZvLiBUaGUgY29kZSBkb2N1bWVudHMgdGhlIGZvcm1hdAorICBwZXJmZWN0bHksIHJpZ2h0IDopCisqLworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcHRkKHN0cnVjdCBwdGQgKnB0ZCkKK3sKKwlwcmludGsoInRkOiAleCAlZCVjJWQgJWQsJWQsJWQgICV4ICV4JXgleFxuIiwKKwkgICAgICAgUFREX0dFVF9DQyhwdGQpLCBQVERfR0VUX0ZBKHB0ZCksCisJICAgICAgIFBURF9ESVJfU1RSKHB0ZCksIFBURF9HRVRfRVAocHRkKSwKKwkgICAgICAgUFREX0dFVF9DT1VOVChwdGQpLCBQVERfR0VUX0xFTihwdGQpLCBQVERfR0VUX01QUyhwdGQpLAorCSAgICAgICBQVERfR0VUX1RPR0dMRShwdGQpLCBQVERfR0VUX0FDVElWRShwdGQpLAorCSAgICAgICBQVERfR0VUX1NQRChwdGQpLCBQVERfR0VUX0xBU1QocHRkKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX3B0ZF9vdXRfZGF0YShzdHJ1Y3QgcHRkICpwdGQsIHU4ICogYnVmKQoreworCWludCBrOworCisJaWYgKFBURF9HRVRfRElSKHB0ZCkgIT0gUFREX0RJUl9JTiAmJiBQVERfR0VUX0xFTihwdGQpKSB7CisJCXByaW50aygiLT4gIik7CisJCWZvciAoayA9IDA7IGsgPCBQVERfR0VUX0xFTihwdGQpOyArK2spCisJCQlwcmludGsoIiUwMnggIiwgKCh1OCAqKSBidWYpW2tdKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfcHRkX2luX2RhdGEoc3RydWN0IHB0ZCAqcHRkLCB1OCAqIGJ1ZikKK3sKKwlpbnQgazsKKworCWlmIChQVERfR0VUX0RJUihwdGQpID09IFBURF9ESVJfSU4gJiYgUFREX0dFVF9DT1VOVChwdGQpKSB7CisJCXByaW50aygiPC0gIik7CisJCWZvciAoayA9IDA7IGsgPCBQVERfR0VUX0NPVU5UKHB0ZCk7ICsraykKKwkJCXByaW50aygiJTAyeCAiLCAoKHU4ICopIGJ1Zilba10pOworCQlwcmludGsoIlxuIik7CisJfQorCWlmIChQVERfR0VUX0xBU1QocHRkKSkKKwkJcHJpbnRrKCItXG4iKTsKK30KKworI2Vsc2UKKworI2RlZmluZSBkdW1wX3B0ZChwdGQpICAgICAgICAgICAgICAgZG97fXdoaWxlKDApCisjZGVmaW5lIGR1bXBfcHRkX2luX2RhdGEocHRkLGJ1ZikgICBkb3t9d2hpbGUoMCkKKyNkZWZpbmUgZHVtcF9wdGRfb3V0X2RhdGEocHRkLGJ1ZikgIGRve313aGlsZSgwKQorCisjZW5kaWYJCQkJLyogISBkZWZpbmVkKFBURF9UUkFDRSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYwppbmRleCAxZTI3ZjEwLi42OGRlY2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCkBAIC05NSwxMiArOTUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+ICAvKiBmb3IgaW5faW50ZXJydXB0ICgpICovCiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiX290Zy5oPgotI2luY2x1ZGUgIi4uL2NvcmUvaGNkLmgiCiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4gCi0jaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPiAgICAvKiBuZWVkZWQgYnkgb2hjaS1tZW0uYyB3aGVuIG5vIFBDSSAqLworI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KQEAgLTEwOCw4ICsxMDcsOSBAQAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKKyNpbmNsdWRlICIuLi9jb3JlL2hjZC5oIgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIyMDA0IE5vdiAwOCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjIwMDUgQXByaWwgMjIiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlJvbWFuIFdlaXNzZ2FlcmJlciwgRGF2aWQgQnJvd25lbGwiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgMS4xICdPcGVuJyBIb3N0IENvbnRyb2xsZXIgKE9IQ0kpIERyaXZlciIKIApAQCAtMTQxLDYgKzE0MSw3IEBACiBzdGF0aWMgdm9pZCBvaGNpX2R1bXAgKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSwgaW50IHZlcmJvc2UpOwogc3RhdGljIGludCBvaGNpX2luaXQgKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSk7CiBzdGF0aWMgdm9pZCBvaGNpX3N0b3AgKHN0cnVjdCB1c2JfaGNkICpoY2QpOworc3RhdGljIGludCBvaGNpX3JlYm9vdCAoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgLCB2b2lkICopOwogCiAjaW5jbHVkZSAib2hjaS1odWIuYyIKICNpbmNsdWRlICJvaGNpLWRiZy5jIgpAQCAtMTc5LDcgKzE4MCw3IEBACiAJc3RydWN0IHVzYl9oY2QJKmhjZCwKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAogCXN0cnVjdCB1cmIJKnVyYiwKLQlpbnQJCW1lbV9mbGFncworCXVuc2lnbmVkCW1lbV9mbGFncwogKSB7CiAJc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAJc3RydWN0IGVkCSplZDsKQEAgLTQyMCw2ICs0MjEsMjMgQEAKIAlvaGNpX3dyaXRlbCAob2hjaSwgb2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwogfQogCisvKiByZWJvb3Qgbm90aWZpZXIgZm9yY2libHkgZGlzYWJsZXMgSVJRcyBhbmQgRE1BLCBoZWxwaW5nIGtleGVjIGFuZAorICogb3RoZXIgY2FzZXMgd2hlcmUgdGhlIG5leHQgc29mdHdhcmUgbWF5IGV4cGVjdCBjbGVhbiBzdGF0ZSBmcm9tIHRoZQorICogImZpcm13YXJlIi4gIHRoaXMgaXMgYnVzLW5ldXRyYWwsIHVubGlrZSBzaHV0ZG93bigpIG1ldGhvZHMuCisgKi8KK3N0YXRpYyBpbnQKK29oY2lfcmVib290IChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmJsb2NrLCB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKm51bGwpCit7CisJc3RydWN0IG9oY2lfaGNkICpvaGNpOworCisJb2hjaSA9IGNvbnRhaW5lcl9vZiAoYmxvY2ssIHN0cnVjdCBvaGNpX2hjZCwgcmVib290X25vdGlmaWVyKTsKKwlvaGNpX3dyaXRlbCAob2hjaSwgT0hDSV9JTlRSX01JRSwgJm9oY2ktPnJlZ3MtPmludHJkaXNhYmxlKTsKKwlvaGNpX3VzYl9yZXNldCAob2hjaSk7CisJLyogZmx1c2ggdGhlIHdyaXRlcyAqLworCSh2b2lkKSBvaGNpX3JlYWRsIChvaGNpLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CisJcmV0dXJuIDA7Cit9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKICAqIEhDIGZ1bmN0aW9ucwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQ4NywxMyArNTA1LDEwIEBACiAvKiBTdGFydCBhbiBPSENJIGNvbnRyb2xsZXIsIHNldCB0aGUgQlVTIG9wZXJhdGlvbmFsCiAgKiByZXNldHMgVVNCIGFuZCBjb250cm9sbGVyCiAgKiBlbmFibGUgaW50ZXJydXB0cyAKLSAqIGNvbm5lY3QgdGhlIHZpcnR1YWwgcm9vdCBodWIKICAqLwogc3RhdGljIGludCBvaGNpX3J1biAoc3RydWN0IG9oY2lfaGNkICpvaGNpKQogewogICAJdTMyCQkJbWFzaywgdGVtcDsKLSAgCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwotICAJc3RydWN0IHVzYl9idXMJCSpidXM7CiAJaW50CQkJZmlyc3QgPSBvaGNpLT5mbWludGVydmFsID09IDA7CiAKIAlkaXNhYmxlIChvaGNpKTsKQEAgLTY1NCwzNyArNjY5LDE1IEBACiAKIAkvLyBQT1RQR1QgZGVsYXkgaXMgYml0cyAyNC0zMSwgaW4gMiBtcyB1bml0cy4KIAltZGVsYXkgKCh0ZW1wID4+IDIzKSAmIDB4MWZlKTsKLQlidXMgPSAmb2hjaV90b19oY2Qob2hjaSktPnNlbGY7CiAJb2hjaV90b19oY2Qob2hjaSktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKIAogCW9oY2lfZHVtcCAob2hjaSwgMSk7CiAKLQl1ZGV2ID0gYnVzLT5yb290X2h1YjsKLQlpZiAodWRldikgewotCQlyZXR1cm4gMDsKLQl9Ci0gCi0JLyogY29ubmVjdCB0aGUgdmlydHVhbCByb290IGh1YiAqLwotCXVkZXYgPSB1c2JfYWxsb2NfZGV2IChOVUxMLCBidXMsIDApOwotCWlmICghdWRldikgewotCQlkaXNhYmxlIChvaGNpKTsKLQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0hDRlM7Ci0JCW9oY2lfd3JpdGVsIChvaGNpLCBvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0JCXJldHVybiAtRU5PTUVNOworCWlmIChvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1YiA9PSBOVUxMKSB7CisJCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllciAoJm9oY2ktPnJlYm9vdF9ub3RpZmllcik7CisJCWNyZWF0ZV9kZWJ1Z19maWxlcyAob2hjaSk7CiAJfQogCi0JdWRldi0+c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKLQlpZiAodXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1YiAodWRldiwgb2hjaV90b19oY2Qob2hjaSkpICE9IDApIHsKLQkJdXNiX3B1dF9kZXYgKHVkZXYpOwotCQlkaXNhYmxlIChvaGNpKTsKLQkJb2hjaS0+aGNfY29udHJvbCAmPSB+T0hDSV9DVFJMX0hDRlM7Ci0JCW9oY2lfd3JpdGVsIChvaGNpLCBvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlpZiAob2hjaS0+cG93ZXJfYnVkZ2V0KQotCQlodWJfc2V0X3Bvd2VyX2J1ZGdldCh1ZGV2LCBvaGNpLT5wb3dlcl9idWRnZXQpOwotCi0JY3JlYXRlX2RlYnVnX2ZpbGVzIChvaGNpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzgxLDYgKzc3NCw3IEBACiAJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CiAJCiAJcmVtb3ZlX2RlYnVnX2ZpbGVzIChvaGNpKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllciAoJm9oY2ktPnJlYm9vdF9ub3RpZmllcik7CiAJb2hjaV9tZW1fY2xlYW51cCAob2hjaSk7CiAJaWYgKG9oY2ktPmhjY2EpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQgKGhjZC0+c2VsZi5jb250cm9sbGVyLCAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYwppbmRleCBlMmZjNDEyLi44M2NhNDU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCkBAIC00MTksMTAgKzQxOSwxMSBAQAogCiAJLyogdHdvIGJpdG1hcHM6ICBwb3J0cyByZW1vdmFibGUsIGFuZCB1c2IgMS4wIGxlZ2FjeSBQb3J0UHdyQ3RybE1hc2sgKi8KIAlyaCA9IHJvb3RodWJfYiAob2hjaSk7CisJbWVtc2V0KGRlc2MtPmJpdG1hcCwgMHhmZiwgc2l6ZW9mKGRlc2MtPmJpdG1hcCkpOwogCWRlc2MtPmJpdG1hcCBbMF0gPSByaCAmIFJIX0JfRFI7CiAJaWYgKHBvcnRzID4gNykgewogCQlkZXNjLT5iaXRtYXAgWzFdID0gKHJoICYgUkhfQl9EUikgPj4gODsKLQkJZGVzYy0+Yml0bWFwIFsyXSA9IGRlc2MtPmJpdG1hcCBbM10gPSAweGZmOworCQlkZXNjLT5iaXRtYXAgWzJdID0gMHhmZjsKIAl9IGVsc2UKIAkJZGVzYy0+Yml0bWFwIFsxXSA9IDB4ZmY7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbWVtLmMKaW5kZXggZTU1NjgyYi4uZmQzYzRkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1tZW0uYwpAQCAtMjksNiArMjksNyBAQAogCXNwaW5fbG9ja19pbml0ICgmb2hjaS0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQgKCZvaGNpLT5wZW5kaW5nKTsKIAlJTklUX1dPUksgKCZvaGNpLT5yaF9yZXN1bWUsIG9oY2lfcmhfcmVzdW1lLCBvaGNpX3RvX2hjZChvaGNpKSk7CisJb2hjaS0+cmVib290X25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBvaGNpX3JlYm9vdDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTgzLDcgKzg0LDcgQEAKIAogLyogVERzIC4uLiAqLwogc3RhdGljIHN0cnVjdCB0ZCAqCi10ZF9hbGxvYyAoc3RydWN0IG9oY2lfaGNkICpoYywgaW50IG1lbV9mbGFncykKK3RkX2FsbG9jIChzdHJ1Y3Qgb2hjaV9oY2QgKmhjLCB1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJZG1hX2FkZHJfdAlkbWE7CiAJc3RydWN0IHRkCSp0ZDsKQEAgLTExNyw3ICsxMTgsNyBAQAogCiAvKiBFRHMgLi4uICovCiBzdGF0aWMgc3RydWN0IGVkICoKLWVkX2FsbG9jIChzdHJ1Y3Qgb2hjaV9oY2QgKmhjLCBpbnQgbWVtX2ZsYWdzKQorZWRfYWxsb2MgKHN0cnVjdCBvaGNpX2hjZCAqaGMsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlkbWFfYWRkcl90CWRtYTsKIAlzdHJ1Y3QgZWQJKmVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKaW5kZXggOGFhYjU5MC4uNWNkZTc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAlpZiAoY29uZmlnLT5vdGcpIHsKIAkJb2hjaV90b19oY2Qob2hjaSktPnNlbGYub3RnX3BvcnQgPSBjb25maWctPm90ZzsKIAkJLyogZGVmYXVsdC9taW5pbXVtIE9URyBwb3dlciBidWRnZXQ6ICA4IG1BICovCi0JCW9oY2ktPnBvd2VyX2J1ZGdldCA9IDg7CisJCW9oY2lfdG9faGNkKG9oY2kpLT5wb3dlcl9idWRnZXQgPSA4OwogCX0KIAogCS8qIGJvYXJkcyBjYW4gdXNlIE9URyB0cmFuc2NlaXZlcnMgaW4gbm9uLU9URyBtb2RlcyAqLwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAkJLyogVFBTMjA0NSBzd2l0Y2ggZm9yIGludGVybmFsIHRyYW5zY2VpdmVyIChwb3J0IDEpICovCiAJCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKLQkJCW9oY2ktPnBvd2VyX2J1ZGdldCA9IDI1MDsKKwkJCW9oY2lfdG9faGNkKG9oY2kpLT5wb3dlcl9idWRnZXQgPSAyNTA7CiAKIAkJCXJoICY9IH5SSF9BX05PQ1A7CiAKQEAgLTQ1NiwzNCArNDU2LDIyIEBACiAKICNpZmRlZglDT05GSUdfUE0KIAotLyogc3RhdGVzIG1hdGNoIFBDSSB1c2FnZSwgYWx3YXlzIHN1c3BlbmRpbmcgdGhlIHJvb3QgaHViIGV4Y2VwdCB0aGF0Ci0gKiA0IH49IEQzY29sZCAoQUNQSSBEMykgd2l0aCBjbG9jayBvZmYgKHJlc3VtZSBzZWVzIHJlc2V0KS4KLSAqCi0gKiBGSVhNRTogYWJvdmUgY29tbWVudCBpcyBub3QgcmlnaHQsIGFuZCBjb2RlIGlzIHdyb25nLCB0b28gOi0oLgotICovCi0KLXN0YXRpYyBpbnQgb2hjaV9vbWFwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIHUzMiBsZXZlbCkKK3N0YXRpYyBpbnQgb2hjaV9vbWFwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSwgdTMyIGxldmVsKQogewogCXN0cnVjdCBvaGNpX2hjZAkqb2hjaSA9IGhjZF90b19vaGNpKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIAlpbnQJCXN0YXR1cyA9IC1FSU5WQUw7CiAKIAlpZiAobGV2ZWwgIT0gU1VTUEVORF9QT1dFUl9ET1dOKQogCQlyZXR1cm4gMDsKLQlpZiAoc3RhdGUgPD0gZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSkKLQkJcmV0dXJuIDA7CiAKLQlkZXZfZGJnKGRldiwgInN1c3BlbmQgdG8gJWRcbiIsIHN0YXRlKTsKIAlkb3duKCZvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c2VyaWFsaXplKTsKIAlzdGF0dXMgPSBvaGNpX2h1Yl9zdXNwZW5kKG9oY2lfdG9faGNkKG9oY2kpKTsKIAlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKHN0YXRlID49IDQpIHsKLQkJCW9tYXBfb2hjaV9jbG9ja19wb3dlcigwKTsKLQkJCW9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViLT5zdGF0ZSA9Ci0JCQkJCVVTQl9TVEFURV9TVVNQRU5ERUQ7Ci0JCQlzdGF0ZSA9IDQ7Ci0JCX0KKwkJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDApOworCQlvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c3RhdGUgPQorCQkJVVNCX1NUQVRFX1NVU1BFTkRFRDsKIAkJb2hjaV90b19oY2Qob2hjaSktPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOwotCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJCWRldi0+cG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CiAJfQogCXVwKCZvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c2VyaWFsaXplKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNDk3LDI5ICs0ODUsMjAgQEAKIAlpZiAobGV2ZWwgIT0gUkVTVU1FX1BPV0VSX09OKQogCQlyZXR1cm4gMDsKIAotCXN3aXRjaCAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSkgewotCWNhc2UgMDoKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSkpCi0JCQltc2xlZXAoNSk7Ci0JCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwotCQlvbWFwX29oY2lfY2xvY2tfcG93ZXIoMSk7Ci0JCS8qIEZBTExUSFJPVUdIICovCi0JZGVmYXVsdDoKLQkJZGV2X2RiZyhkZXYsICJyZXN1bWUgZnJvbSAlZFxuIiwgZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSk7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQorCQltc2xlZXAoNSk7CisJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXM7CisJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDEpOwogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAotCQkvKiBnZXQgZXh0cmEgY2xlYW51cCBldmVuIGlmIHJlbW90ZSB3YWtldXAgaXNuJ3QgaW4gdXNlICovCi0JCXN0YXR1cyA9IHVzYl9yZXN1bWVfZGV2aWNlKG9oY2lfdG9faGNkKG9oY2kpLT5zZWxmLnJvb3RfaHViKTsKKwkvKiBnZXQgZXh0cmEgY2xlYW51cCBldmVuIGlmIHJlbW90ZSB3YWtldXAgaXNuJ3QgaW4gdXNlICovCisJc3RhdHVzID0gdXNiX3Jlc3VtZV9kZXZpY2Uob2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWIpOwogI2Vsc2UKLQkJZG93bigmb2hjaV90b19oY2Qob2hjaSktPnNlbGYucm9vdF9odWItPnNlcmlhbGl6ZSk7Ci0JCXN0YXR1cyA9IG9oY2lfaHViX3Jlc3VtZShvaGNpX3RvX2hjZChvaGNpKSk7Ci0JCXVwKCZvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c2VyaWFsaXplKTsKKwlkb3duKCZvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c2VyaWFsaXplKTsKKwlzdGF0dXMgPSBvaGNpX2h1Yl9yZXN1bWUob2hjaV90b19oY2Qob2hjaSkpOworCXVwKCZvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5yb290X2h1Yi0+c2VyaWFsaXplKTsKICNlbmRpZgotCQlpZiAoc3RhdHVzID09IDApCi0JCQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gMDsKLQkJYnJlYWs7Ci0JfQorCWlmIChzdGF0dXMgPT0gMCkKKwkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CiAJcmV0dXJuIHN0YXR1czsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCmluZGV4IDU3ZmQwN2QuLmVlZGU2YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKQEAgLTE0LDE0ICsxNCwxMSBAQAogICogVGhpcyBmaWxlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KICAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QUENfUE1BQwogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9wY2ktYnJpZGdlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KLSNpZm5kZWYgQ09ORklHX1BNCi0jCWRlZmluZSBDT05GSUdfUE0KLSNlbmRpZgogI2VuZGlmCiAKICNpZm5kZWYgQ09ORklHX1BDSQpAQCAtMTMyLDcgKzEyOSw3IEBACiAJLyogbGV0IHRoaW5ncyBzZXR0bGUgZG93biBhIGJpdCAqLwogCW1zbGVlcCAoMTAwKTsKIAkKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QUENfUE1BQwogCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSB7CiAJICAgCXN0cnVjdCBkZXZpY2Vfbm9kZQkqb2Zfbm9kZTsKICAKQEAgLTE0MSw3ICsxMzgsNyBAQAogCQlpZiAob2Zfbm9kZSkKIAkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1VTQl9FTkFCTEUsIG9mX25vZGUsIDAsIDApOwogCX0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwogCXJldHVybiAwOwogfQogCkBAIC0xNTEsNyArMTQ4LDcgQEAKIAlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAJaW50CQkJcmV0dmFsID0gMDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiAJaWYgKF9tYWNoaW5lID09IF9NQUNIX1BtYWMpIHsKIAkJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwogCkBAIC0xNjAsNyArMTU3LDcgQEAKIAkJaWYgKG9mX25vZGUpCiAJCQlwbWFjX2NhbGxfZmVhdHVyZSAoUE1BQ19GVFJfVVNCX0VOQUJMRSwgb2Zfbm9kZSwgMCwgMSk7CiAJfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCiAKIAkvKiByZXN1bWUgcm9vdCBodWIgKi8KIAlpZiAodGltZV9iZWZvcmUgKGppZmZpZXMsIG9oY2ktPm5leHRfc3RhdGVjaGFuZ2UpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaAppbmRleCAyMmUxYWMxLi43MWNkZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaApAQCAtMzcxLDcgKzM3MSw2IEBACiAJICogb3RoZXIgZXh0ZXJuYWwgdHJhbnNjZWl2ZXJzIHNob3VsZCBiZSBzb2Z0d2FyZS10cmFuc3BhcmVudCAKIAkgKi8KIAlzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyCSp0cmFuc2NlaXZlcjsKLQl1bnNpZ25lZAkJcG93ZXJfYnVkZ2V0OwogCiAJLyoKIAkgKiBtZW1vcnkgbWFuYWdlbWVudCBmb3IgcXVldWUgZGF0YSBzdHJ1Y3R1cmVzCkBAIC0zOTAsNiArMzg5LDcgQEAKIAl1MzIJCQlmbWludGVydmFsOwkJLyogc2F2ZWQgcmVnaXN0ZXIgKi8KIAogCXN0cnVjdCB3b3JrX3N0cnVjdAlyaF9yZXN1bWU7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCXJlYm9vdF9ub3RpZmllcjsKIAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogZm9yIEhDIGJ1Z3MgKi8KICNkZWZpbmUJT0hDSV9RVUlSS19BTUQ3NTYJMHgwMQkJCS8qIGVycmF0dW0gIzQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCmluZGV4IDk5ZDQzZjcuLjdhODkwYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYwpAQCAtODE1LDcgKzgxNSw3IEBACiAJc3RydWN0IHVzYl9oY2QJCSpoY2QsCiAJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAsCiAJc3RydWN0IHVyYgkJKnVyYiwKLQlpbnQJCQltZW1fZmxhZ3MKKwl1bnNpZ25lZAkJbWVtX2ZsYWdzCiApIHsKIAlzdHJ1Y3Qgc2w4MTEJCSpzbDgxMSA9IGhjZF90b19zbDgxMShoY2QpOwogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gdXJiLT5kZXY7CkBAIC0xNTYzLDI5ICsxNTYzLDE1IEBACiBzbDgxMWhfc3RhcnQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3Qgc2w4MTEJCSpzbDgxMSA9IGhjZF90b19zbDgxMShoY2QpOwotCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwogCiAJLyogY2hpcCBoYXMgYmVlbiByZXNldCwgVkJVUyBwb3dlciBpcyBvZmYgKi8KLQotCXVkZXYgPSB1c2JfYWxsb2NfZGV2KE5VTEwsICZoY2QtPnNlbGYsIDApOwotCWlmICghdWRldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl1ZGV2LT5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOwogCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOwogCi0JaWYgKHNsODExLT5ib2FyZCkKKwlpZiAoc2w4MTEtPmJvYXJkKSB7CiAJCWhjZC0+Y2FuX3dha2V1cCA9IHNsODExLT5ib2FyZC0+Y2FuX3dha2V1cDsKLQotCWlmICh1c2JfaGNkX3JlZ2lzdGVyX3Jvb3RfaHViKHVkZXYsIGhjZCkgIT0gMCkgewotCQl1c2JfcHV0X2Rldih1ZGV2KTsKLQkJc2w4MTFoX3N0b3AoaGNkKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCWhjZC0+cG93ZXJfYnVkZ2V0ID0gc2w4MTEtPmJvYXJkLT5wb3dlciAqIDI7CiAJfQogCi0JaWYgKHNsODExLT5ib2FyZCAmJiBzbDgxMS0+Ym9hcmQtPnBvd2VyKQotCQlodWJfc2V0X3Bvd2VyX2J1ZGdldCh1ZGV2LCBzbDgxMS0+Ym9hcmQtPnBvd2VyICogMik7Ci0KIAkvKiBlbmFibGUgcG93ZXIgYW5kIGludGVydXB0cyAqLwogCXBvcnRfcG93ZXIoc2w4MTEsIDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExX2NzLmMKaW5kZXggNmUxNzMyNi4uMzhhZWJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMV9jcy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTFfY3MuYwpAQCAtMjAsNyArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jc190eXBlcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jcy5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXN0cGwuaD4KQEAgLTY4LDEzICs2Nyw2IEBACiAKIHN0YXRpYyBkZXZfbGlua190ICpkZXZfbGlzdCA9IE5VTEw7CiAKLXN0YXRpYyBpbnQgaXJxX2xpc3RbNF0gPSB7IC0xIH07Ci1zdGF0aWMgaW50IGlycV9saXN0X2NvdW50OwotCi1tb2R1bGVfcGFyYW1fYXJyYXkoaXJxX2xpc3QsIGludCwgJmlycV9saXN0X2NvdW50LCAwNDQ0KTsKLQotSU5UX01PRFVMRV9QQVJNKGlycV9tYXNrLCAweGRlYjgpOwotCiB0eXBlZGVmIHN0cnVjdCBsb2NhbF9pbmZvX3QgewogCWRldl9saW5rX3QJCWxpbms7CiAJZGV2X25vZGVfdAkJbm9kZTsKQEAgLTM3Myw3ICszNjUsNyBAQAogCWxvY2FsX2luZm9fdCAqbG9jYWw7CiAJZGV2X2xpbmtfdCAqbGluazsKIAljbGllbnRfcmVnX3QgY2xpZW50X3JlZzsKLQlpbnQgcmV0LCBpOworCWludCByZXQ7CiAKIAlsb2NhbCA9IGttYWxsb2Moc2l6ZW9mKGxvY2FsX2luZm9fdCksIEdGUF9LRVJORUwpOwogCWlmICghbG9jYWwpCkBAIC0zODUsMTEgKzM3Nyw2IEBACiAJLyogSW5pdGlhbGl6ZSAqLwogCWxpbmstPmlycS5BdHRyaWJ1dGVzID0gSVJRX1RZUEVfRVhDTFVTSVZFOwogCWxpbmstPmlycS5JUlFJbmZvMSA9IElSUV9JTkZPMl9WQUxJRHxJUlFfTEVWRUxfSUQ7Ci0JaWYgKGlycV9saXN0WzBdID09IC0xKQotCQlsaW5rLT5pcnEuSVJRSW5mbzIgPSBpcnFfbWFzazsKLQllbHNlCi0JCWZvciAoaSA9IDA7IGkgPCBpcnFfbGlzdF9jb3VudDsgaSsrKQotCQkJbGluay0+aXJxLklSUUluZm8yIHw9IDEgPDwgaXJxX2xpc3RbaV07CiAJbGluay0+aXJxLkhhbmRsZXIgPSBOVUxMOwogCiAJbGluay0+Y29uZi5BdHRyaWJ1dGVzID0gMDsKQEAgLTQwMSwxMSArMzg4LDYgQEAKIAlkZXZfbGlzdCA9IGxpbms7CiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9IChkZXZfaW5mb190ICopICZkcml2ZXJfbmFtZTsKIAljbGllbnRfcmVnLkF0dHJpYnV0ZXMgPSBJTkZPX0lPX0NMSUVOVCB8IElORk9fQ0FSRF9TSEFSRTsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9Ci0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMIHwKLQkJQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUIHwKLQkJQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmc2w4MTFfY3NfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAJcmV0ID0gcGNtY2lhX3JlZ2lzdGVyX2NsaWVudCgmbGluay0+aGFuZGxlLCAmY2xpZW50X3JlZyk7CkBAIC00MTgsMTMgKzQwMCwyMSBAQAogCXJldHVybiBsaW5rOwogfQogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgc2w4MTFfaWRzW10gPSB7CisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkQoMHhjMDE1LCAweDAwMDEpLCAvKiBSQVRPQyBVU0IgSE9TVCBDRisgQ2FyZCAqLworCVBDTUNJQV9ERVZJQ0VfTlVMTCwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgc2w4MTFfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBwY21jaWFfZHJpdmVyIHNsODExX2NzX2RyaXZlciA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmRydgkJPSB7CiAJCS5uYW1lCT0gKGNoYXIgKilkcml2ZXJfbmFtZSwKIAl9LAogCS5hdHRhY2gJCT0gc2w4MTFfY3NfYXR0YWNoLAorCS5ldmVudAkJPSBzbDgxMV9jc19ldmVudCwKIAkuZGV0YWNoCQk9IHNsODExX2NzX2RldGFjaCwKKwkuaWRfdGFibGUJPSBzbDgxMV9pZHMsCiB9OwogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1kZWJ1Zy5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWRlYnVnLmMKaW5kZXggMjRjNzNjNS4uNDUzOGE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWRlYnVnLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWRlYnVnLmMKQEAgLTIzNyw2ICsyMzcsMzcgQEAKIAlyZXR1cm4gb3V0IC0gYnVmOwogfQogCitzdGF0aWMgaW50IHVoY2lfc2hvd19yb290X2h1Yl9zdGF0ZShzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyICpvdXQgPSBidWY7CisJY2hhciAqcmhfc3RhdGU7CisKKwkvKiBUcnkgdG8gbWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIG1lbW9yeSAqLworCWlmIChsZW4gPCA2MCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHVoY2ktPnJoX3N0YXRlKSB7CisJICAgIGNhc2UgVUhDSV9SSF9SRVNFVDoKKwkJcmhfc3RhdGUgPSAicmVzZXQiOwkJYnJlYWs7CisJICAgIGNhc2UgVUhDSV9SSF9TVVNQRU5ERUQ6CisJCXJoX3N0YXRlID0gInN1c3BlbmRlZCI7CQlicmVhazsKKwkgICAgY2FzZSBVSENJX1JIX0FVVE9fU1RPUFBFRDoKKwkJcmhfc3RhdGUgPSAiYXV0by1zdG9wcGVkIjsJYnJlYWs7CisJICAgIGNhc2UgVUhDSV9SSF9SRVNVTUlORzoKKwkJcmhfc3RhdGUgPSAicmVzdW1pbmciOwkJYnJlYWs7CisJICAgIGNhc2UgVUhDSV9SSF9TVVNQRU5ESU5HOgorCQlyaF9zdGF0ZSA9ICJzdXNwZW5kaW5nIjsJYnJlYWs7CisJICAgIGNhc2UgVUhDSV9SSF9SVU5OSU5HOgorCQlyaF9zdGF0ZSA9ICJydW5uaW5nIjsJCWJyZWFrOworCSAgICBjYXNlIFVIQ0lfUkhfUlVOTklOR19OT0RFVlM6CisJCXJoX3N0YXRlID0gInJ1bm5pbmcsIG5vIGRldnMiOwlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcmhfc3RhdGUgPSAiPyI7CQkJYnJlYWs7CisJfQorCW91dCArPSBzcHJpbnRmKG91dCwgIlJvb3QtaHViIHN0YXRlOiAlc1xuIiwgcmhfc3RhdGUpOworCXJldHVybiBvdXQgLSBidWY7Cit9CisKIHN0YXRpYyBpbnQgdWhjaV9zaG93X3N0YXR1cyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2ksIGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAljaGFyICpvdXQgPSBidWY7CkBAIC00MDgsNiArNDM5LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CiAKKwlvdXQgKz0gdWhjaV9zaG93X3Jvb3RfaHViX3N0YXRlKHVoY2ksIG91dCwgbGVuIC0gKG91dCAtIGJ1ZikpOwogCW91dCArPSBzcHJpbnRmKG91dCwgIkhDIHN0YXR1c1xuIik7CiAJb3V0ICs9IHVoY2lfc2hvd19zdGF0dXModWhjaSwgb3V0LCBsZW4gLSAob3V0IC0gYnVmKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwppbmRleCA0OWJkODNlLi4wZDVkMjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCkBAIC0xMywxOCArMTMsMTMgQEAKICAqIChDKSBDb3B5cmlnaHQgMjAwMCBZZ2dkcmFzaWwgQ29tcHV0aW5nLCBJbmMuIChwb3J0IG9mIG5ldyBQQ0kgaW50ZXJmYWNlCiAgKiAgICAgICAgICAgICAgIHN1cHBvcnQgZnJvbSB1c2Itb2hjaS5jIGJ5IEFkYW0gUmljaHRlciwgYWRhbUB5Z2dkcmFzaWwuY29tKS4KICAqIChDKSBDb3B5cmlnaHQgMTk5OSBHcmVnb3J5IFAuIFNtaXRoIChmcm9tIHVzYi1vaGNpLmMpCi0gKiAoQykgQ29weXJpZ2h0IDIwMDQgQWxhbiBTdGVybiwgc3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdQorICogKEMpIENvcHlyaWdodCAyMDA0LTIwMDUgQWxhbiBTdGVybiwgc3Rlcm5Acm93bGFuZC5oYXJ2YXJkLmVkdQogICoKICAqIEludGVsIGRvY3VtZW50cyB0aGlzIGZhaXJseSB3ZWxsLCBhbmQgYXMgZmFyIGFzIEkga25vdyB0aGVyZQogICogYXJlIG5vIHJveWFsdGllcyBvciBhbnl0aGluZyBsaWtlIHRoYXQsIGJ1dCBldmVuIHNvIHRoZXJlIGFyZQogICogcGVvcGxlIHdobyBkZWNpZGVkIHRoYXQgdGhleSB3YW50IHRvIGRvIHRoZSBzYW1lIHRoaW5nIGluIGEKICAqIGNvbXBsZXRlbHkgZGlmZmVyZW50IHdheS4KICAqCi0gKiBXQVJOSU5HISBUaGUgVVNCIGRvY3VtZW50YXRpb24gaXMgZG93bnJpZ2h0IGV2aWwuIE1vc3Qgb2YgaXQKLSAqIGlzIGp1c3QgY3JhcCwgd3JpdHRlbiBieSBhIGNvbW1pdHRlZS4gWW91J3JlIGJldHRlciBvZmYgaWdub3JpbmcKLSAqIG1vc3Qgb2YgaXQsIHRoZSBpbXBvcnRhbnQgc3R1ZmYgaXM6Ci0gKiAgLSB0aGUgbG93LWxldmVsIHByb3RvY29sIChmYWlybHkgc2ltcGxlIGJ1dCBsb3RzIG9mIHNtYWxsIGRldGFpbHMpCi0gKiAgLSB3b3JraW5nIGFyb3VuZCB0aGUgaG9ycmlkbmVzcyBvZiB0aGUgcmVzdAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTY0LDcgKzU5LDcgQEAKIC8qCiAgKiBWZXJzaW9uIEluZm9ybWF0aW9uCiAgKi8KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYyLjIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4zIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJMaW51cyAnRnJvZG8gUmFiYml0JyBUb3J2YWxkcywgSm9oYW5uZXMgRXJkZmVsdCwgXAogUmFuZHkgRHVubGFwLCBHZW9yZyBBY2hlciwgRGV0aSBGbGllZ2wsIFRob21hcyBTYWlsZXIsIFJvbWFuIFdlaXNzZ2FlcmJlciwgXAogQWxhbiBTdGVybiIKQEAgLTg5LDggKzg0LDkgQEAKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqdWhjaV91cF9jYWNoZXA7CS8qIHVyYl9wcml2ICovCiAKK3N0YXRpYyB2b2lkIHN1c3BlbmRfcmgoc3RydWN0IHVoY2lfaGNkICp1aGNpLCBlbnVtIHVoY2lfcmhfc3RhdGUgbmV3X3N0YXRlKTsKK3N0YXRpYyB2b2lkIHdha2V1cF9yaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpOwogc3RhdGljIHZvaWQgdWhjaV9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIoc3RydWN0IHVoY2lfaGNkICp1aGNpKTsKLXN0YXRpYyB2b2lkIGhjX3N0YXRlX3RyYW5zaXRpb25zKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSk7CiAKIC8qIElmIGEgdHJhbnNmZXIgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIHRoaXMgbXVjaCB0aW1lLCB0dXJuIG9mZiBGU0JSICovCiAjZGVmaW5lIElETEVfVElNRU9VVAltc2Vjc190b19qaWZmaWVzKDUwKQpAQCAtMTAxLDc3ICs5NywzMTIgQEAKIC8qIHRvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGhvZyBhbGwgb2YgdGhlIGJhbmR3aWR0aCAqLwogI2RlZmluZSBERVBUSF9JTlRFUlZBTCA1CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0YXJ0X3RpbWVyKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwltb2RfdGltZXIoJnVoY2ktPnN0YWxsX3RpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApKTsKK30KKwogI2luY2x1ZGUgInVoY2ktaHViLmMiCiAjaW5jbHVkZSAidWhjaS1kZWJ1Zy5jIgogI2luY2x1ZGUgInVoY2ktcS5jIgogCi1zdGF0aWMgaW50IGluaXRfc3RhbGxfdGltZXIoc3RydWN0IHVzYl9oY2QgKmhjZCk7Ci0KLXN0YXRpYyB2b2lkIHN0YWxsX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgcHRyKQorLyoKKyAqIE1ha2Ugc3VyZSB0aGUgY29udHJvbGxlciBpcyBjb21wbGV0ZWx5IGluYWN0aXZlLCB1bmFibGUgdG8KKyAqIGdlbmVyYXRlIGludGVycnVwdHMgb3IgZG8gRE1BLgorICovCitzdGF0aWMgdm9pZCByZXNldF9oYyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCiB7Ci0Jc3RydWN0IHVzYl9oY2QgKmhjZCA9IChzdHJ1Y3QgdXNiX2hjZCAqKXB0cjsKLQlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOwotCXN0cnVjdCB1cmJfcHJpdiAqdXA7CisJaW50IHBvcnQ7CisKKwkvKiBUdXJuIG9mZiBQSVJRIGVuYWJsZSBhbmQgU01JIGVuYWJsZS4gIChUaGlzIGFsc28gdHVybnMgb2ZmIHRoZQorCSAqIEJJT1MncyBVU0IgTGVnYWN5IFN1cHBvcnQuKSAgVHVybiBvZmYgYWxsIHRoZSBSL1dDIGJpdHMgdG9vLgorCSAqLworCXBjaV93cml0ZV9jb25maWdfd29yZCh0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKSwgVVNCTEVHU1VQLAorCQkJVVNCTEVHU1VQX1JXQyk7CisKKwkvKiBSZXNldCB0aGUgSEMgLSB0aGlzIHdpbGwgZm9yY2UgdXMgdG8gZ2V0IGEKKwkgKiBuZXcgbm90aWZpY2F0aW9uIG9mIGFueSBhbHJlYWR5IGNvbm5lY3RlZAorCSAqIHBvcnRzIGR1ZSB0byB0aGUgdmlydHVhbCBkaXNjb25uZWN0IHRoYXQgaXQKKwkgKiBpbXBsaWVzLgorCSAqLworCW91dHcoVVNCQ01EX0hDUkVTRVQsIHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCW1iKCk7CisJdWRlbGF5KDUpOworCWlmIChpbncodWhjaS0+aW9fYWRkciArIFVTQkNNRCkgJiBVU0JDTURfSENSRVNFVCkKKwkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJIQ1JFU0VUIG5vdCBjb21wbGV0ZWQgeWV0IVxuIik7CisKKwkvKiBKdXN0IHRvIGJlIHNhZmUsIGRpc2FibGUgaW50ZXJydXB0IHJlcXVlc3RzIGFuZAorCSAqIG1ha2Ugc3VyZSB0aGUgY29udHJvbGxlciBpcyBzdG9wcGVkLgorCSAqLworCW91dHcoMCwgdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOworCW91dHcoMCwgdWhjaS0+aW9fYWRkciArIFVTQkNNRCk7CisKKwkvKiBIQ1JFU0VUIGRvZXNuJ3QgYWZmZWN0IHRoZSBTdXNwZW5kLCBSZXNldCwgYW5kIFJlc3VtZSBEZXRlY3QKKwkgKiBiaXRzIGluIHRoZSBwb3J0IHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlcnMuCisJICogV2UgaGF2ZSB0byBjbGVhciB0aGVtIGJ5IGhhbmQuCisJICovCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHVoY2ktPnJoX251bXBvcnRzOyArK3BvcnQpCisJCW91dHcoMCwgdWhjaS0+aW9fYWRkciArIFVTQlBPUlRTQzEgKyAocG9ydCAqIDIpKTsKKworCXVoY2ktPnBvcnRfY19zdXNwZW5kID0gdWhjaS0+c3VzcGVuZGVkX3BvcnRzID0KKwkJCXVoY2ktPnJlc3VtaW5nX3BvcnRzID0gMDsKKwl1aGNpLT5yaF9zdGF0ZSA9IFVIQ0lfUkhfUkVTRVQ7CisJdWhjaS0+aXNfc3RvcHBlZCA9IFVIQ0lfSVNfU1RPUFBFRDsKKwl1aGNpX3RvX2hjZCh1aGNpKS0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCXVoY2lfdG9faGNkKHVoY2kpLT5wb2xsX3JoID0gMDsKK30KKworLyoKKyAqIExhc3Qgcml0ZXMgZm9yIGEgZGVmdW5jdC9ub25mdW5jdGlvbmFsIGNvbnRyb2xsZXIKKyAqIG9yIG9uZSB3ZSBkb24ndCB3YW50IHRvIHVzZSBhbnkgbW9yZS4KKyAqLworc3RhdGljIHZvaWQgaGNfZGllZChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCit7CisJcmVzZXRfaGModWhjaSk7CisJdWhjaS0+aGNfaW5hY2Nlc3NpYmxlID0gMTsKKwlkZWxfdGltZXIoJnVoY2ktPnN0YWxsX3RpbWVyKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBjb250cm9sbGVyIHRoYXQgd2FzIG5ld2x5IGRpc2NvdmVyZWQgb3IgaGFzIGp1c3QgYmVlbgorICogcmVzdW1lZC4gIEluIGVpdGhlciBjYXNlIHdlIGNhbid0IGJlIHN1cmUgb2YgaXRzIHByZXZpb3VzIHN0YXRlLgorICovCitzdGF0aWMgdm9pZCBjaGVja19hbmRfcmVzZXRfaGMoc3RydWN0IHVoY2lfaGNkICp1aGNpKQoreworCXUxNiBsZWdzdXA7CisJdW5zaWduZWQgaW50IGNtZCwgaW50cjsKKworCS8qCisJICogV2hlbiByZXN0YXJ0aW5nIGEgc3VzcGVuZGVkIGNvbnRyb2xsZXIsIHdlIGV4cGVjdCBhbGwgdGhlCisJICogc2V0dGluZ3MgdG8gYmUgdGhlIHNhbWUgYXMgd2UgbGVmdCB0aGVtOgorCSAqCisJICoJUElSUSBhbmQgU01JIGRpc2FibGVkLCBubyBSL1cgYml0cyBzZXQgaW4gVVNCTEVHU1VQOworCSAqCUNvbnRyb2xsZXIgaXMgc3RvcHBlZCBhbmQgY29uZmlndXJlZCB3aXRoIEVHU00gc2V0OworCSAqCU5vIGludGVycnVwdHMgZW5hYmxlZCBleGNlcHQgcG9zc2libHkgUmVzdW1lIERldGVjdC4KKwkgKgorCSAqIElmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGFyZSB2aW9sYXRlZCB3ZSBkbyBhIGNvbXBsZXRlIHJlc2V0LgorCSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsICZsZWdzdXApOworCWlmIChsZWdzdXAgJiB+KFVTQkxFR1NVUF9STyB8IFVTQkxFR1NVUF9SV0MpKSB7CisJCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlczogbGVnc3VwID0gMHglMDR4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgbGVnc3VwKTsKKwkJZ290byByZXNldF9uZWVkZWQ7CisJfQorCisJY21kID0gaW53KHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCWlmICgoY21kICYgVVNCQ01EX1JTKSB8fCAhKGNtZCAmIFVTQkNNRF9DRikgfHwgIShjbWQgJiBVU0JDTURfRUdTTSkpIHsKKwkJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzOiBjbWQgPSAweCUwNHhcbiIsCisJCQkJX19GVU5DVElPTl9fLCBjbWQpOworCQlnb3RvIHJlc2V0X25lZWRlZDsKKwl9CisKKwlpbnRyID0gaW53KHVoY2ktPmlvX2FkZHIgKyBVU0JJTlRSKTsKKwlpZiAoaW50ciAmICh+VVNCSU5UUl9SRVNVTUUpKSB7CisJCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlczogaW50ciA9IDB4JTA0eFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGludHIpOworCQlnb3RvIHJlc2V0X25lZWRlZDsKKwl9CisJcmV0dXJuOworCityZXNldF9uZWVkZWQ6CisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIlBlcmZvcm1pbmcgZnVsbCByZXNldFxuIik7CisJcmVzZXRfaGModWhjaSk7Cit9CisKKy8qCisgKiBTdG9yZSB0aGUgYmFzaWMgcmVnaXN0ZXIgc2V0dGluZ3MgbmVlZGVkIGJ5IHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgdm9pZCBjb25maWd1cmVfaGMoc3RydWN0IHVoY2lfaGNkICp1aGNpKQoreworCS8qIFNldCB0aGUgZnJhbWUgbGVuZ3RoIHRvIHRoZSBkZWZhdWx0OiAxIG1zIGV4YWN0bHkgKi8KKwlvdXRiKFVTQlNPRl9ERUZBVUxULCB1aGNpLT5pb19hZGRyICsgVVNCU09GKTsKKworCS8qIFN0b3JlIHRoZSBmcmFtZSBsaXN0IGJhc2UgYWRkcmVzcyAqLworCW91dGwodWhjaS0+ZmwtPmRtYV9oYW5kbGUsIHVoY2ktPmlvX2FkZHIgKyBVU0JGTEJBU0VBREQpOworCisJLyogU2V0IHRoZSBjdXJyZW50IGZyYW1lIG51bWJlciAqLworCW91dHcodWhjaS0+ZnJhbWVfbnVtYmVyLCB1aGNpLT5pb19hZGRyICsgVVNCRlJOVU0pOworCisJLyogTWFyayBjb250cm9sbGVyIGFzIHJ1bm5pbmcgYmVmb3JlIHdlIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJdWhjaV90b19oY2QodWhjaSktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKwltYigpOworCisJLyogRW5hYmxlIFBJUlEgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSksIFVTQkxFR1NVUCwKKwkJCVVTQkxFR1NVUF9ERUZBVUxUKTsKK30KKworCitzdGF0aWMgaW50IHJlc3VtZV9kZXRlY3RfaW50ZXJydXB0c19hcmVfYnJva2VuKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwlpbnQgcG9ydDsKKworCXN3aXRjaCAodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSktPnZlbmRvcikgeworCSAgICBkZWZhdWx0OgorCQlicmVhazsKKworCSAgICBjYXNlIFBDSV9WRU5ET1JfSURfR0VORVNZUzoKKwkJLyogR2VuZXN5cyBMb2dpYydzIEdMODgwUyBjb250cm9sbGVycyBkb24ndCBnZW5lcmF0ZQorCQkgKiByZXN1bWUtZGV0ZWN0IGludGVycnVwdHMuCisJCSAqLworCQlyZXR1cm4gMTsKKworCSAgICBjYXNlIFBDSV9WRU5ET1JfSURfSU5URUw6CisJCS8qIFNvbWUgb2YgSW50ZWwncyBVU0IgY29udHJvbGxlcnMgaGF2ZSBhIGJ1ZyB0aGF0IGNhdXNlcworCQkgKiByZXN1bWUtZGV0ZWN0IGludGVycnVwdHMgaWYgYW55IHBvcnQgaGFzIGFuIG92ZXItY3VycmVudAorCQkgKiBjb25kaXRpb24uICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHNvbWUgbW90aGVyYm9hcmRzCisJCSAqIGhhcmR3aXJlIHVudXNlZCBVU0IgcG9ydHMnIG92ZXItY3VycmVudCBpbnB1dHMgYWN0aXZlIQorCQkgKiBUbyBwcmV2ZW50IHByb2JsZW1zLCB3ZSB3aWxsIG5vdCBlbmFibGUgcmVzdW1lLWRldGVjdAorCQkgKiBpbnRlcnJ1cHRzIGlmIGFueSBwb3J0cyBhcmUgT0MuCisJCSAqLworCQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgdWhjaS0+cmhfbnVtcG9ydHM7ICsrcG9ydCkgeworCQkJaWYgKGludyh1aGNpLT5pb19hZGRyICsgVVNCUE9SVFNDMSArIHBvcnQgKiAyKSAmCisJCQkJCVVTQlBPUlRTQ19PQykKKwkJCQlyZXR1cm4gMTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1c3BlbmRfcmgoc3RydWN0IHVoY2lfaGNkICp1aGNpLCBlbnVtIHVoY2lfcmhfc3RhdGUgbmV3X3N0YXRlKQorX19yZWxlYXNlcyh1aGNpLT5sb2NrKQorX19hY3F1aXJlcyh1aGNpLT5sb2NrKQoreworCWludCBhdXRvX3N0b3A7CisJaW50IGludF9lbmFibGU7CisKKwlhdXRvX3N0b3AgPSAobmV3X3N0YXRlID09IFVIQ0lfUkhfQVVUT19TVE9QUEVEKTsKKwlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXMlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJKGF1dG9fc3RvcCA/ICIgKGF1dG8tc3RvcCkiIDogIiIpKTsKKworCS8qIElmIHdlIGdldCBhIHN1c3BlbmQgcmVxdWVzdCB3aGVuIHdlJ3JlIGFscmVhZHkgYXV0by1zdG9wcGVkCisJICogdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKHVoY2ktPnJoX3N0YXRlID09IFVIQ0lfUkhfQVVUT19TVE9QUEVEKSB7CisJCXVoY2ktPnJoX3N0YXRlID0gbmV3X3N0YXRlOworCQlyZXR1cm47CisJfQorCisJLyogRW5hYmxlIHJlc3VtZS1kZXRlY3QgaW50ZXJydXB0cyBpZiB0aGV5IHdvcmsuCisJICogVGhlbiBlbnRlciBHbG9iYWwgU3VzcGVuZCBtb2RlLCBzdGlsbCBjb25maWd1cmVkLgorCSAqLworCWludF9lbmFibGUgPSAocmVzdW1lX2RldGVjdF9pbnRlcnJ1cHRzX2FyZV9icm9rZW4odWhjaSkgPworCQkJMCA6IFVTQklOVFJfUkVTVU1FKTsKKwlvdXR3KGludF9lbmFibGUsIHVoY2ktPmlvX2FkZHIgKyBVU0JJTlRSKTsKKwlvdXR3KFVTQkNNRF9FR1NNIHwgVVNCQ01EX0NGLCB1aGNpLT5pb19hZGRyICsgVVNCQ01EKTsKKwltYigpOworCXVkZWxheSg1KTsKKworCS8qIElmIHdlJ3JlIGF1dG8tc3RvcHBpbmcgdGhlbiBubyBkZXZpY2VzIGhhdmUgYmVlbiBhdHRhY2hlZAorCSAqIGZvciBhIHdoaWxlLCBzbyB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IGFjdGl2ZSBVUkJzIGFuZCB0aGUKKwkgKiBjb250cm9sbGVyIHNob3VsZCBzdG9wIGFmdGVyIGEgZmV3IG1pY3Jvc2Vjb25kcy4gIE90aGVyd2lzZQorCSAqIHdlIHdpbGwgZ2l2ZSB0aGUgY29udHJvbGxlciBvbmUgZnJhbWUgdG8gc3RvcC4KKwkgKi8KKwlpZiAoIWF1dG9fc3RvcCAmJiAhKGludyh1aGNpLT5pb19hZGRyICsgVVNCU1RTKSAmIFVTQlNUU19IQ0gpKSB7CisJCXVoY2ktPnJoX3N0YXRlID0gVUhDSV9SSF9TVVNQRU5ESU5HOworCQlzcGluX3VubG9ja19pcnEoJnVoY2ktPmxvY2spOworCQltc2xlZXAoMSk7CisJCXNwaW5fbG9ja19pcnEoJnVoY2ktPmxvY2spOworCQlpZiAodWhjaS0+aGNfaW5hY2Nlc3NpYmxlKQkvKiBEaWVkICovCisJCQlyZXR1cm47CisJfQorCWlmICghKGludyh1aGNpLT5pb19hZGRyICsgVVNCU1RTKSAmIFVTQlNUU19IQ0gpKQorCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgIkNvbnRyb2xsZXIgbm90IHN0b3BwZWQgeWV0IVxuIik7CisKKwl1aGNpX2dldF9jdXJyZW50X2ZyYW1lX251bWJlcih1aGNpKTsKKwlzbXBfd21iKCk7CisKKwl1aGNpLT5yaF9zdGF0ZSA9IG5ld19zdGF0ZTsKKwl1aGNpLT5pc19zdG9wcGVkID0gVUhDSV9JU19TVE9QUEVEOworCWRlbF90aW1lcigmdWhjaS0+c3RhbGxfdGltZXIpOworCXVoY2lfdG9faGNkKHVoY2kpLT5wb2xsX3JoID0gIWludF9lbmFibGU7CisKKwl1aGNpX3NjYW5fc2NoZWR1bGUodWhjaSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X3JoKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwl1aGNpLT5pc19zdG9wcGVkID0gMDsKKwlzbXBfd21iKCk7CisKKwkvKiBNYXJrIGl0IGNvbmZpZ3VyZWQgYW5kIHJ1bm5pbmcgd2l0aCBhIDY0LWJ5dGUgbWF4IHBhY2tldC4KKwkgKiBBbGwgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCwgZXZlbiB0aG91Z2ggUkVTVU1FIHdvbid0IGRvIGFueXRoaW5nLgorCSAqLworCW91dHcoVVNCQ01EX1JTIHwgVVNCQ01EX0NGIHwgVVNCQ01EX01BWFAsIHVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCW91dHcoVVNCSU5UUl9USU1FT1VUIHwgVVNCSU5UUl9SRVNVTUUgfCBVU0JJTlRSX0lPQyB8IFVTQklOVFJfU1AsCisJCQl1aGNpLT5pb19hZGRyICsgVVNCSU5UUik7CisJbWIoKTsKKwl1aGNpLT5yaF9zdGF0ZSA9IFVIQ0lfUkhfUlVOTklORzsKKwl1aGNpX3RvX2hjZCh1aGNpKS0+cG9sbF9yaCA9IDE7CisJcmVzdGFydF90aW1lcih1aGNpKTsKK30KKworc3RhdGljIHZvaWQgd2FrZXVwX3JoKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK19fcmVsZWFzZXModWhjaS0+bG9jaykKK19fYWNxdWlyZXModWhjaS0+bG9jaykKK3sKKwlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXMlc1xuIiwgX19GVU5DVElPTl9fLAorCQkJdWhjaS0+cmhfc3RhdGUgPT0gVUhDSV9SSF9BVVRPX1NUT1BQRUQgPworCQkJCSIgKGF1dG8tc3RhcnQpIiA6ICIiKTsKKworCS8qIElmIHdlIGFyZSBhdXRvLXN0b3BwZWQgdGhlbiBubyBkZXZpY2VzIGFyZSBhdHRhY2hlZCBzbyB0aGVyZSdzCisJICogbm8gbmVlZCBmb3Igd2FrZXVwIHNpZ25hbHMuICBPdGhlcndpc2Ugd2Ugc2VuZCBHbG9iYWwgUmVzdW1lCisJICogZm9yIDIwIG1zLgorCSAqLworCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX1NVU1BFTkRFRCkgeworCQl1aGNpLT5yaF9zdGF0ZSA9IFVIQ0lfUkhfUkVTVU1JTkc7CisJCW91dHcoVVNCQ01EX0ZHUiB8IFVTQkNNRF9FR1NNIHwgVVNCQ01EX0NGLAorCQkJCXVoY2ktPmlvX2FkZHIgKyBVU0JDTUQpOworCQlzcGluX3VubG9ja19pcnEoJnVoY2ktPmxvY2spOworCQltc2xlZXAoMjApOworCQlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwkJaWYgKHVoY2ktPmhjX2luYWNjZXNzaWJsZSkJLyogRGllZCAqLworCQkJcmV0dXJuOworCisJCS8qIEVuZCBHbG9iYWwgUmVzdW1lIGFuZCB3YWl0IGZvciBFT1AgdG8gYmUgc2VudCAqLworCQlvdXR3KFVTQkNNRF9DRiwgdWhjaS0+aW9fYWRkciArIFVTQkNNRCk7CisJCW1iKCk7CisJCXVkZWxheSg0KTsKKwkJaWYgKGludyh1aGNpLT5pb19hZGRyICsgVVNCQ01EKSAmIFVTQkNNRF9GR1IpCisJCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgIkZHUiBub3Qgc3RvcHBlZCB5ZXQhXG4iKTsKKwl9CisKKwlzdGFydF9yaCh1aGNpKTsKKworCS8qIFJlc3RhcnQgcm9vdCBodWIgcG9sbGluZyAqLworCW1vZF90aW1lcigmdWhjaV90b19oY2QodWhjaSktPnJoX3RpbWVyLCBqaWZmaWVzKTsKK30KKworc3RhdGljIHZvaWQgc3RhbGxfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBfdWhjaSkKK3sKKwlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSAoc3RydWN0IHVoY2lfaGNkICopIF91aGNpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWhjaS0+bG9jaywgZmxhZ3MpOwogCXVoY2lfc2Nhbl9zY2hlZHVsZSh1aGNpLCBOVUxMKTsKKwljaGVja19mc2JyKHVoY2kpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh1cCwgJnVoY2ktPnVyYl9saXN0LCB1cmJfbGlzdCkgewotCQlzdHJ1Y3QgdXJiICp1ID0gdXAtPnVyYjsKLQotCQlzcGluX2xvY2soJnUtPmxvY2spOwotCi0JCS8qIENoZWNrIGlmIHRoZSBGU0JSIHRpbWVkIG91dCAqLwotCQlpZiAodXAtPmZzYnIgJiYgIXVwLT5mc2JyX3RpbWVvdXQgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCB1cC0+ZnNicnRpbWUgKyBJRExFX1RJTUVPVVQpKQotCQkJdWhjaV9mc2JyX3RpbWVvdXQodWhjaSwgdSk7Ci0KLQkJc3Bpbl91bmxvY2soJnUtPmxvY2spOwotCX0KLQotCS8qIFJlYWxseSBkaXNhYmxlIEZTQlIgKi8KLQlpZiAoIXVoY2ktPmZzYnIgJiYgdWhjaS0+ZnNicnRpbWVvdXQgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCB1aGNpLT5mc2JydGltZW91dCkpIHsKLQkJdWhjaS0+ZnNicnRpbWVvdXQgPSAwOwotCQl1aGNpLT5za2VsX3Rlcm1fcWgtPmxpbmsgPSBVSENJX1BUUl9URVJNOwotCX0KLQotCS8qIFBvbGwgZm9yIGFuZCBwZXJmb3JtIHN0YXRlIHRyYW5zaXRpb25zICovCi0JaGNfc3RhdGVfdHJhbnNpdGlvbnModWhjaSk7Ci0JaWYgKHVubGlrZWx5KHVoY2ktPnN1c3BlbmRlZF9wb3J0cyAmJiB1aGNpLT5zdGF0ZSAhPSBVSENJX1NVU1BFTkRFRCkpCi0JCXVoY2lfY2hlY2tfcG9ydHModWhjaSk7Ci0KLQlpbml0X3N0YWxsX3RpbWVyKGhjZCk7CisJaWYgKCF1aGNpLT5pc19zdG9wcGVkKQorCQlyZXN0YXJ0X3RpbWVyKHVoY2kpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBpbml0X3N0YWxsX3RpbWVyKHN0cnVjdCB1c2JfaGNkICpoY2QpCi17Ci0Jc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKLQotCWluaXRfdGltZXIoJnVoY2ktPnN0YWxsX3RpbWVyKTsKLQl1aGNpLT5zdGFsbF90aW1lci5mdW5jdGlvbiA9IHN0YWxsX2NhbGxiYWNrOwotCXVoY2ktPnN0YWxsX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZyloY2Q7Ci0JdWhjaS0+c3RhbGxfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7Ci0JYWRkX3RpbWVyKCZ1aGNpLT5zdGFsbF90aW1lcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlycXJldHVybl90IHVoY2lfaXJxKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qCiAJICogUmVhZCB0aGUgaW50ZXJydXB0IHN0YXR1cywgYW5kIHdyaXRlIGl0IGJhY2sgdG8gY2xlYXIgdGhlCiAJICogaW50ZXJydXB0IGNhdXNlLiAgQ29udHJhcnkgdG8gdGhlIFVIQ0kgc3BlY2lmaWNhdGlvbiwgdGhlCiAJICogIkhDIEhhbHRlZCIgc3RhdHVzIGJpdCBpcyBwZXJzaXN0ZW50OiBpdCBpcyBSTywgbm90IFIvV0MuCiAJICovCi0Jc3RhdHVzID0gaW53KGlvX2FkZHIgKyBVU0JTVFMpOworCXN0YXR1cyA9IGludyh1aGNpLT5pb19hZGRyICsgVVNCU1RTKTsKIAlpZiAoIShzdGF0dXMgJiB+VVNCU1RTX0hDSCkpCS8qIHNoYXJlZCBpbnRlcnJ1cHQsIG5vdCBtaW5lICovCiAJCXJldHVybiBJUlFfTk9ORTsKLQlvdXR3KHN0YXR1cywgaW9fYWRkciArIFVTQlNUUyk7CQkvKiBDbGVhciBpdCAqLworCW91dHcoc3RhdHVzLCB1aGNpLT5pb19hZGRyICsgVVNCU1RTKTsJCS8qIENsZWFyIGl0ICovCiAKIAlpZiAoc3RhdHVzICYgfihVU0JTVFNfVVNCSU5UIHwgVVNCU1RTX0VSUk9SIHwgVVNCU1RTX1JEKSkgewogCQlpZiAoc3RhdHVzICYgVVNCU1RTX0hTRSkKQEAgLTE4MCwxNzkgKzQxMSwzMCBAQAogCQlpZiAoc3RhdHVzICYgVVNCU1RTX0hDUEUpCiAJCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLCAiaG9zdCBjb250cm9sbGVyIHByb2Nlc3MgIgogCQkJCQkiZXJyb3IsIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQhXG4iKTsKLQkJaWYgKChzdGF0dXMgJiBVU0JTVFNfSENIKSAmJiB1aGNpLT5zdGF0ZSA+IDApIHsKLQkJCWRldl9lcnIodWhjaV9kZXYodWhjaSksICJob3N0IGNvbnRyb2xsZXIgaGFsdGVkLCAiCisJCWlmIChzdGF0dXMgJiBVU0JTVFNfSENIKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdWhjaS0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHVoY2ktPnJoX3N0YXRlID49IFVIQ0lfUkhfUlVOTklORykgeworCQkJCWRldl9lcnIodWhjaV9kZXYodWhjaSksCisJCQkJCSJob3N0IGNvbnRyb2xsZXIgaGFsdGVkLCAiCiAJCQkJCSJ2ZXJ5IGJhZCFcbiIpOwotCQkJLyogRklYTUU6IFJlc2V0IHRoZSBjb250cm9sbGVyLCBmaXggdGhlIG9mZmVuZGluZyBURCAqLworCQkJCWhjX2RpZWQodWhjaSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWhjaS0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKIAkJfQogCX0KIAogCWlmIChzdGF0dXMgJiBVU0JTVFNfUkQpCi0JCXVoY2ktPnJlc3VtZV9kZXRlY3QgPSAxOworCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CiAKLQlzcGluX2xvY2soJnVoY2ktPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CiAJdWhjaV9zY2FuX3NjaGVkdWxlKHVoY2ksIHJlZ3MpOwotCXNwaW5fdW5sb2NrKCZ1aGNpLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1aGNpLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJlc2V0X2hjKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKLXsKLQl1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSB1aGNpLT5pb19hZGRyOwotCi0JLyogVHVybiBvZmYgUElSUSwgU01JLCBhbmQgYWxsIGludGVycnVwdHMuICBUaGlzIGFsc28gdHVybnMgb2ZmCi0JICogdGhlIEJJT1MncyBVU0IgTGVnYWN5IFN1cHBvcnQuCi0JICovCi0JcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsIDApOwotCW91dHcoMCwgdWhjaS0+aW9fYWRkciArIFVTQklOVFIpOwotCi0JLyogR2xvYmFsIHJlc2V0IGZvciA1MG1zICovCi0JdWhjaS0+c3RhdGUgPSBVSENJX1JFU0VUOwotCW91dHcoVVNCQ01EX0dSRVNFVCwgaW9fYWRkciArIFVTQkNNRCk7Ci0JbXNsZWVwKDUwKTsKLQlvdXR3KDAsIGlvX2FkZHIgKyBVU0JDTUQpOwotCi0JLyogQW5vdGhlciAxMG1zIGRlbGF5ICovCi0JbXNsZWVwKDEwKTsKLQl1aGNpLT5yZXN1bWVfZGV0ZWN0ID0gMDsKLQl1aGNpLT5pc19zdG9wcGVkID0gVUhDSV9JU19TVE9QUEVEOwotfQotCi1zdGF0aWMgdm9pZCBzdXNwZW5kX2hjKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKLXsKLQl1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSB1aGNpLT5pb19hZGRyOwotCi0JZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCXVoY2ktPnN0YXRlID0gVUhDSV9TVVNQRU5ERUQ7Ci0JdWhjaS0+cmVzdW1lX2RldGVjdCA9IDA7Ci0Jb3V0dyhVU0JDTURfRUdTTSwgaW9fYWRkciArIFVTQkNNRCk7Ci0KLQkvKiBGSVhNRTogV2FpdCBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gYWN0dWFsbHkgc3RvcCAqLwotCXVoY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHVoY2kpOwotCXVoY2ktPmlzX3N0b3BwZWQgPSBVSENJX0lTX1NUT1BQRUQ7Ci0KLQl1aGNpX3NjYW5fc2NoZWR1bGUodWhjaSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdha2V1cF9oYyhzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKLQotCXN3aXRjaCAodWhjaS0+c3RhdGUpIHsKLQkJY2FzZSBVSENJX1NVU1BFTkRFRDoJCS8qIFN0YXJ0IHRoZSByZXN1bWUgKi8KLQkJCWRldl9kYmcodWhjaV9kZXYodWhjaSksICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQotCQkJLyogR2xvYmFsIHJlc3VtZSBmb3IgPj0gMjBtcyAqLwotCQkJb3V0dyhVU0JDTURfRkdSIHwgVVNCQ01EX0VHU00sIGlvX2FkZHIgKyBVU0JDTUQpOwotCQkJdWhjaS0+c3RhdGUgPSBVSENJX1JFU1VNSU5HXzE7Ci0JCQl1aGNpLT5zdGF0ZV9lbmQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7Ci0JCQl1aGNpLT5pc19zdG9wcGVkID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVUhDSV9SRVNVTUlOR18xOgkJLyogRW5kIGdsb2JhbCByZXN1bWUgKi8KLQkJCXVoY2ktPnN0YXRlID0gVUhDSV9SRVNVTUlOR18yOwotCQkJb3V0dygwLCBpb19hZGRyICsgVVNCQ01EKTsKLQkJCS8qIEZhbGxzIHRocm91Z2ggKi8KLQotCQljYXNlIFVIQ0lfUkVTVU1JTkdfMjoJCS8qIFdhaXQgZm9yIEVPUCB0byBiZSBzZW50ICovCi0JCQlpZiAoaW53KGlvX2FkZHIgKyBVU0JDTUQpICYgVVNCQ01EX0ZHUikKLQkJCQlicmVhazsKLQotCQkJLyogUnVuIGZvciBhdCBsZWFzdCAxIHNlY29uZCwgYW5kCi0JCQkgKiBtYXJrIGl0IGNvbmZpZ3VyZWQgd2l0aCBhIDY0LWJ5dGUgbWF4IHBhY2tldCAqLwotCQkJdWhjaS0+c3RhdGUgPSBVSENJX1JVTk5JTkdfR1JBQ0U7Ci0JCQl1aGNpLT5zdGF0ZV9lbmQgPSBqaWZmaWVzICsgSFo7Ci0JCQlvdXR3KFVTQkNNRF9SUyB8IFVTQkNNRF9DRiB8IFVTQkNNRF9NQVhQLAotCQkJCQlpb19hZGRyICsgVVNCQ01EKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVUhDSV9SVU5OSU5HX0dSQUNFOgkvKiBOb3cgYWxsb3dlZCB0byBzdXNwZW5kICovCi0JCQl1aGNpLT5zdGF0ZSA9IFVIQ0lfUlVOTklORzsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcG9ydHNfYWN0aXZlKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKLXsKLQl1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSB1aGNpLT5pb19hZGRyOwotCWludCBjb25uZWN0aW9uID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCB1aGNpLT5yaF9udW1wb3J0czsgaSsrKQotCQljb25uZWN0aW9uIHw9IChpbncoaW9fYWRkciArIFVTQlBPUlRTQzEgKyBpICogMikgJiBVU0JQT1JUU0NfQ0NTKTsKLQotCXJldHVybiBjb25uZWN0aW9uOwotfQotCi1zdGF0aWMgaW50IHN1c3BlbmRfYWxsb3dlZChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCi17Ci0JdW5zaWduZWQgbG9uZyBpb19hZGRyID0gdWhjaS0+aW9fYWRkcjsKLQlpbnQgaTsKLQotCWlmICh0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKS0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfSU5URUwpCi0JCXJldHVybiAxOwotCi0JLyogU29tZSBvZiBJbnRlbCdzIFVTQiBjb250cm9sbGVycyBoYXZlIGEgYnVnIHRoYXQgY2F1c2VzIGZhbHNlCi0JICogcmVzdW1lIGluZGljYXRpb25zIGlmIGFueSBwb3J0IGhhcyBhbiBvdmVyIGN1cnJlbnQgY29uZGl0aW9uLgotCSAqIFRvIHByZXZlbnQgcHJvYmxlbXMsIHdlIHdpbGwgbm90IGFsbG93IGEgZ2xvYmFsIHN1c3BlbmQgaWYKLQkgKiBhbnkgcG9ydHMgYXJlIE9DLgotCSAqCi0JICogU29tZSBtb3RoZXJib2FyZHMgdXNpbmcgSW50ZWwncyBjaGlwc2V0cyAoYnV0IG5vdCB1c2luZyBhbGwKLQkgKiB0aGUgVVNCIHBvcnRzKSBhcHBlYXIgdG8gaGFyZHdpcmUgdGhlIG92ZXIgY3VycmVudCBpbnB1dHMgYWN0aXZlCi0JICogdG8gZGlzYWJsZSB0aGUgVVNCIHBvcnRzLgotCSAqLwotCi0JLyogY2hlY2sgZm9yIG92ZXIgY3VycmVudCBjb25kaXRpb24gb24gYW55IHBvcnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdWhjaS0+cmhfbnVtcG9ydHM7IGkrKykgewotCQlpZiAoaW53KGlvX2FkZHIgKyBVU0JQT1JUU0MxICsgaSAqIDIpICYgVVNCUE9SVFNDX09DKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGhjX3N0YXRlX3RyYW5zaXRpb25zKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKLXsKLQlzd2l0Y2ggKHVoY2ktPnN0YXRlKSB7Ci0JCWNhc2UgVUhDSV9SVU5OSU5HOgotCi0JCQkvKiBnbG9iYWwgc3VzcGVuZCBpZiBub3RoaW5nIGNvbm5lY3RlZCBmb3IgMSBzZWNvbmQgKi8KLQkJCWlmICghcG9ydHNfYWN0aXZlKHVoY2kpICYmIHN1c3BlbmRfYWxsb3dlZCh1aGNpKSkgewotCQkJCXVoY2ktPnN0YXRlID0gVUhDSV9TVVNQRU5ESU5HX0dSQUNFOwotCQkJCXVoY2ktPnN0YXRlX2VuZCA9IGppZmZpZXMgKyBIWjsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgVUhDSV9TVVNQRU5ESU5HX0dSQUNFOgotCQkJaWYgKHBvcnRzX2FjdGl2ZSh1aGNpKSkKLQkJCQl1aGNpLT5zdGF0ZSA9IFVIQ0lfUlVOTklORzsKLQkJCWVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdWhjaS0+c3RhdGVfZW5kKSkKLQkJCQlzdXNwZW5kX2hjKHVoY2kpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVSENJX1NVU1BFTkRFRDoKLQotCQkJLyogd2FrZXVwIGlmIHJlcXVlc3RlZCBieSBhIGRldmljZSAqLwotCQkJaWYgKHVoY2ktPnJlc3VtZV9kZXRlY3QpCi0JCQkJd2FrZXVwX2hjKHVoY2kpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBVSENJX1JFU1VNSU5HXzE6Ci0JCWNhc2UgVUhDSV9SRVNVTUlOR18yOgotCQljYXNlIFVIQ0lfUlVOTklOR19HUkFDRToKLQkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHVoY2ktPnN0YXRlX2VuZCkpCi0JCQkJd2FrZXVwX2hjKHVoY2kpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLX0KLQogLyoKICAqIFN0b3JlIHRoZSBjdXJyZW50IGZyYW1lIG51bWJlciBpbiB1aGNpLT5mcmFtZV9udW1iZXIgaWYgdGhlIGNvbnRyb2xsZXIKICAqIGlzIHJ1bm5uaW5nCkBAIC0zNjMsNDggKzQ0NSw2IEBACiAJCXVoY2ktPmZyYW1lX251bWJlciA9IGludyh1aGNpLT5pb19hZGRyICsgVVNCRlJOVU0pOwogfQogCi1zdGF0aWMgaW50IHN0YXJ0X2hjKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKLXsKLQl1bnNpZ25lZCBsb25nIGlvX2FkZHIgPSB1aGNpLT5pb19hZGRyOwotCWludCB0aW1lb3V0ID0gMTA7Ci0KLQkvKgotCSAqIFJlc2V0IHRoZSBIQyAtIHRoaXMgd2lsbCBmb3JjZSB1cyB0byBnZXQgYQotCSAqIG5ldyBub3RpZmljYXRpb24gb2YgYW55IGFscmVhZHkgY29ubmVjdGVkCi0JICogcG9ydHMgZHVlIHRvIHRoZSB2aXJ0dWFsIGRpc2Nvbm5lY3QgdGhhdCBpdAotCSAqIGltcGxpZXMuCi0JICovCi0Jb3V0dyhVU0JDTURfSENSRVNFVCwgaW9fYWRkciArIFVTQkNNRCk7Ci0Jd2hpbGUgKGludyhpb19hZGRyICsgVVNCQ01EKSAmIFVTQkNNRF9IQ1JFU0VUKSB7Ci0JCWlmICgtLXRpbWVvdXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLCAiVVNCQ01EX0hDUkVTRVQgdGltZWQgb3V0IVxuIik7Ci0JCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQkJfQotCQltc2xlZXAoMSk7Ci0JfQotCi0JLyogTWFyayBjb250cm9sbGVyIGFzIHJ1bm5pbmcgYmVmb3JlIHdlIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JdWhjaV90b19oY2QodWhjaSktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKLQotCS8qIFR1cm4gb24gUElSUSBhbmQgYWxsIGludGVycnVwdHMgKi8KLQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSksIFVTQkxFR1NVUCwKLQkJCVVTQkxFR1NVUF9ERUZBVUxUKTsKLQlvdXR3KFVTQklOVFJfVElNRU9VVCB8IFVTQklOVFJfUkVTVU1FIHwgVVNCSU5UUl9JT0MgfCBVU0JJTlRSX1NQLAotCQlpb19hZGRyICsgVVNCSU5UUik7Ci0KLQkvKiBTdGFydCBhdCBmcmFtZSAwICovCi0Jb3V0dygwLCBpb19hZGRyICsgVVNCRlJOVU0pOwotCW91dGwodWhjaS0+ZmwtPmRtYV9oYW5kbGUsIGlvX2FkZHIgKyBVU0JGTEJBU0VBREQpOwotCi0JLyogUnVuIGFuZCBtYXJrIGl0IGNvbmZpZ3VyZWQgd2l0aCBhIDY0LWJ5dGUgbWF4IHBhY2tldCAqLwotCXVoY2ktPnN0YXRlID0gVUhDSV9SVU5OSU5HX0dSQUNFOwotCXVoY2ktPnN0YXRlX2VuZCA9IGppZmZpZXMgKyBIWjsKLQlvdXR3KFVTQkNNRF9SUyB8IFVTQkNNRF9DRiB8IFVTQkNNRF9NQVhQLCBpb19hZGRyICsgVVNCQ01EKTsKLQl1aGNpLT5pc19zdG9wcGVkID0gMDsKLQotCXJldHVybiAwOwotfQotCiAvKgogICogRGUtYWxsb2NhdGUgYWxsIHJlc291cmNlcwogICovCkBAIC00NDgsMTYgKzQ4OCw1OCBAQAogc3RhdGljIGludCB1aGNpX3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKKwl1bnNpZ25lZCBpb19zaXplID0gKHVuc2lnbmVkKSBoY2QtPnJzcmNfbGVuOworCWludCBwb3J0OwogCiAJdWhjaS0+aW9fYWRkciA9ICh1bnNpZ25lZCBsb25nKSBoY2QtPnJzcmNfc3RhcnQ7CiAKLQkvKiBLaWNrIEJJT1Mgb2ZmIHRoaXMgaGFyZHdhcmUgYW5kIHJlc2V0LCBzbyB3ZSB3b24ndCBnZXQKLQkgKiBpbnRlcnJ1cHRzIGZyb20gYW55IHByZXZpb3VzIHNldHVwLgorCS8qIFRoZSBVSENJIHNwZWMgc2F5cyBkZXZpY2VzIG11c3QgaGF2ZSAyIHBvcnRzLCBhbmQgZ29lcyBvbiB0byBzYXkKKwkgKiB0aGV5IG1heSBoYXZlIG1vcmUgYnV0IGdpdmVzIG5vIHdheSB0byBkZXRlcm1pbmUgaG93IG1hbnkgdGhlcmUKKwkgKiBhcmUuICBIb3dldmVyIGFjY29yZGluZyB0byB0aGUgVUhDSSBzcGVjLCBCaXQgNyBvZiB0aGUgcG9ydAorCSAqIHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlciBpcyBhbHdheXMgc2V0IHRvIDEuICBTbyB3ZSB0cnkgdG8KKwkgKiB1c2UgdGhpcyB0byBvdXIgYWR2YW50YWdlLiAgQW5vdGhlciBjb21tb24gZmFpbHVyZSBtb2RlIHdoZW4KKwkgKiBhIG5vbmV4aXN0ZW50IHJlZ2lzdGVyIGlzIGFkZHJlc3NlZCBpcyB0byByZXR1cm4gYWxsIG9uZXMsIHNvCisJICogd2UgdGVzdCBmb3IgdGhhdCBhbHNvLgogCSAqLwotCXJlc2V0X2hjKHVoY2kpOworCWZvciAocG9ydCA9IDA7IHBvcnQgPCAoaW9fc2l6ZSAtIFVTQlBPUlRTQzEpIC8gMjsgcG9ydCsrKSB7CisJCXVuc2lnbmVkIGludCBwb3J0c3RhdHVzOworCisJCXBvcnRzdGF0dXMgPSBpbncodWhjaS0+aW9fYWRkciArIFVTQlBPUlRTQzEgKyAocG9ydCAqIDIpKTsKKwkJaWYgKCEocG9ydHN0YXR1cyAmIDB4MDA4MCkgfHwgcG9ydHN0YXR1cyA9PSAweGZmZmYpCisJCQlicmVhazsKKwl9CisJaWYgKGRlYnVnKQorCQlkZXZfaW5mbyh1aGNpX2Rldih1aGNpKSwgImRldGVjdGVkICVkIHBvcnRzXG4iLCBwb3J0KTsKKworCS8qIEFueXRoaW5nIGdyZWF0ZXIgdGhhbiA3IGlzIHdlaXJkIHNvIHdlJ2xsIGlnbm9yZSBpdC4gKi8KKwlpZiAocG9ydCA+IFVIQ0lfUkhfTUFYQ0hJTEQpIHsKKwkJZGV2X2luZm8odWhjaV9kZXYodWhjaSksICJwb3J0IGNvdW50IG1pc2RldGVjdGVkPyAiCisJCQkJImZvcmNpbmcgdG8gMiBwb3J0c1xuIik7CisJCXBvcnQgPSAyOworCX0KKwl1aGNpLT5yaF9udW1wb3J0cyA9IHBvcnQ7CisKKwkvKiBLaWNrIEJJT1Mgb2ZmIHRoaXMgaGFyZHdhcmUgYW5kIHJlc2V0IGlmIHRoZSBjb250cm9sbGVyCisJICogaXNuJ3QgYWxyZWFkeSBzYWZlbHkgcXVpZXNjZW50LgorCSAqLworCWNoZWNrX2FuZF9yZXNldF9oYyh1aGNpKTsKIAlyZXR1cm4gMDsKIH0KIAorLyogTWFrZSBzdXJlIHRoZSBjb250cm9sbGVyIGlzIHF1aWVzY2VudCBhbmQgdGhhdCB3ZSdyZSBub3QgdXNpbmcgaXQKKyAqIGFueSBtb3JlLiAgVGhpcyBpcyBtYWlubHkgZm9yIHRoZSBiZW5lZml0IG9mIHByb2dyYW1zIHdoaWNoLCBsaWtlIGtleGVjLAorICogZXhwZWN0IHRoZSBoYXJkd2FyZSB0byBiZSBpZGxlOiBub3QgZG9pbmcgRE1BIG9yIGdlbmVyYXRpbmcgSVJRcy4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbWF5IGJlIGNhbGxlZCBpbiBhIGRhbWFnZWQgb3IgZmFpbGluZyBrZXJuZWwuICBIZW5jZSB3ZQorICogZG8gbm90IGFjcXVpcmUgdGhlIHNwaW5sb2NrIGJlZm9yZSBzaHV0dGluZyBkb3duIHRoZSBjb250cm9sbGVyLgorICovCitzdGF0aWMgdm9pZCB1aGNpX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSAoc3RydWN0IHVzYl9oY2QgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaGNfZGllZChoY2RfdG9fdWhjaShoY2QpKTsKK30KKwogLyoKICAqIEFsbG9jYXRlIGEgZnJhbWUgbGlzdCwgYW5kIHRoZW4gc2V0dXAgdGhlIHNrZWxldG9uCiAgKgpAQCAtNDc4LDE3ICs1NjAsMjAgQEAKIHsKIAlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOwogCWludCByZXR2YWwgPSAtRUJVU1k7Ci0JaW50IGksIHBvcnQ7Ci0JdW5zaWduZWQgaW9fc2l6ZTsKKwlpbnQgaTsKIAlkbWFfYWRkcl90IGRtYV9oYW5kbGU7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCi0JaW9fc2l6ZSA9ICh1bnNpZ25lZCkgaGNkLT5yc3JjX2xlbjsKKwloY2QtPnVzZXNfbmV3X3BvbGxpbmcgPSAxOworCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBQQ0lfQ0FQX0lEX1BNKSkKKwkJaGNkLT5jYW5fd2FrZXVwID0gMTsJCS8qIEFzc3VtZSBpdCBzdXBwb3J0cyBQTUUjICovCiAKLQlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGhjZC0+c2VsZi5idXNfbmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsIHVoY2lfZGVidWdmc19yb290LCB1aGNpLCAmdWhjaV9kZWJ1Z19vcGVyYXRpb25zKTsKKwlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGhjZC0+c2VsZi5idXNfbmFtZSwKKwkJCVNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLCB1aGNpX2RlYnVnZnNfcm9vdCwgdWhjaSwKKwkJCSZ1aGNpX2RlYnVnX29wZXJhdGlvbnMpOwogCWlmICghZGVudHJ5KSB7Ci0JCWRldl9lcnIodWhjaV9kZXYodWhjaSksICJjb3VsZG4ndCBjcmVhdGUgdWhjaSBkZWJ1Z2ZzIGVudHJ5XG4iKTsKKwkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwKKwkJCQkiY291bGRuJ3QgY3JlYXRlIHVoY2kgZGVidWdmcyBlbnRyeVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2NyZWF0ZV9kZWJ1Z19lbnRyeTsKIAl9CkBAIC01MTAsNiArNTk1LDEwIEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ1aGNpLT53YWl0cWgpOwogCisJaW5pdF90aW1lcigmdWhjaS0+c3RhbGxfdGltZXIpOworCXVoY2ktPnN0YWxsX3RpbWVyLmZ1bmN0aW9uID0gc3RhbGxfY2FsbGJhY2s7CisJdWhjaS0+c3RhbGxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB1aGNpOworCiAJdWhjaS0+ZmwgPSBkbWFfYWxsb2NfY29oZXJlbnQodWhjaV9kZXYodWhjaSksIHNpemVvZigqdWhjaS0+ZmwpLAogCQkJJmRtYV9oYW5kbGUsIDApOwogCWlmICghdWhjaS0+ZmwpIHsKQEAgLTUzNiw0NiArNjI1LDE0IEBACiAJCWdvdG8gZXJyX2NyZWF0ZV9xaF9wb29sOwogCX0KIAotCS8qIEluaXRpYWxpemUgdGhlIHJvb3QgaHViICovCi0KLQkvKiBVSENJIHNwZWNzIHNheXMgZGV2aWNlcyBtdXN0IGhhdmUgMiBwb3J0cywgYnV0IGdvZXMgb24gdG8gc2F5ICovCi0JLyogIHRoZXkgbWF5IGhhdmUgbW9yZSBidXQgZ2l2ZSBubyB3YXkgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IHRoZXkgKi8KLQkvKiAgaGF2ZS4gSG93ZXZlciwgYWNjb3JkaW5nIHRvIHRoZSBVSENJIHNwZWMsIEJpdCA3IGlzIGFsd2F5cyBzZXQgKi8KLQkvKiAgdG8gMS4gU28gd2UgdHJ5IHRvIHVzZSB0aGlzIHRvIG91ciBhZHZhbnRhZ2UgKi8KLQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgKGlvX3NpemUgLSAweDEwKSAvIDI7IHBvcnQrKykgewotCQl1bnNpZ25lZCBpbnQgcG9ydHN0YXR1czsKLQotCQlwb3J0c3RhdHVzID0gaW53KHVoY2ktPmlvX2FkZHIgKyAweDEwICsgKHBvcnQgKiAyKSk7Ci0JCWlmICghKHBvcnRzdGF0dXMgJiAweDAwODApKQotCQkJYnJlYWs7Ci0JfQotCWlmIChkZWJ1ZykKLQkJZGV2X2luZm8odWhjaV9kZXYodWhjaSksICJkZXRlY3RlZCAlZCBwb3J0c1xuIiwgcG9ydCk7Ci0KLQkvKiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBzbyBhbnl0aGluZyBsZXNzIHRoYW4gMiBvciBncmVhdGVyIHRoYW4gOCBpcyAqLwotCS8qICBzb21ldGhpbmcgd2VpcmQgYW5kIHdlJ2xsIGlnbm9yZSBpdCAqLwotCWlmIChwb3J0IDwgMiB8fCBwb3J0ID4gVUhDSV9SSF9NQVhDSElMRCkgewotCQlkZXZfaW5mbyh1aGNpX2Rldih1aGNpKSwgInBvcnQgY291bnQgbWlzZGV0ZWN0ZWQ/ICIKLQkJCQkiZm9yY2luZyB0byAyIHBvcnRzXG4iKTsKLQkJcG9ydCA9IDI7Ci0JfQotCi0JdWhjaS0+cmhfbnVtcG9ydHMgPSBwb3J0OwotCi0JdWRldiA9IHVzYl9hbGxvY19kZXYoTlVMTCwgJmhjZC0+c2VsZiwgMCk7Ci0JaWYgKCF1ZGV2KSB7Ci0JCWRldl9lcnIodWhjaV9kZXYodWhjaSksICJ1bmFibGUgdG8gYWxsb2NhdGUgcm9vdCBodWJcbiIpOwotCQlnb3RvIGVycl9hbGxvY19yb290X2h1YjsKLQl9Ci0KLQl1aGNpLT50ZXJtX3RkID0gdWhjaV9hbGxvY190ZCh1aGNpLCB1ZGV2KTsKKwl1aGNpLT50ZXJtX3RkID0gdWhjaV9hbGxvY190ZCh1aGNpKTsKIAlpZiAoIXVoY2ktPnRlcm1fdGQpIHsKIAkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwgInVuYWJsZSB0byBhbGxvY2F0ZSB0ZXJtaW5hdGluZyBURFxuIik7CiAJCWdvdG8gZXJyX2FsbG9jX3Rlcm1fdGQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IFVIQ0lfTlVNX1NLRUxRSDsgaSsrKSB7Ci0JCXVoY2ktPnNrZWxxaFtpXSA9IHVoY2lfYWxsb2NfcWgodWhjaSwgdWRldik7CisJCXVoY2ktPnNrZWxxaFtpXSA9IHVoY2lfYWxsb2NfcWgodWhjaSk7CiAJCWlmICghdWhjaS0+c2tlbHFoW2ldKSB7CiAJCQlkZXZfZXJyKHVoY2lfZGV2KHVoY2kpLCAidW5hYmxlIHRvIGFsbG9jYXRlIFFIXG4iKTsKIAkJCWdvdG8gZXJyX2FsbG9jX3NrZWxxaDsKQEAgLTY0MSwzMiArNjk4LDE3IEBACiAKIAkvKgogCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyByZXF1aXJlIGEgZnVsbCBtYigpIHRvIGVuZm9yY2UgY29tcGxldGlvbiBvZgotCSAqIHRoZSBtZW1vcnkgd3JpdGVzIGFib3ZlIGJlZm9yZSB0aGUgSS9PIHRyYW5zZmVycyBpbiBzdGFydF9oYygpLgorCSAqIHRoZSBtZW1vcnkgd3JpdGVzIGFib3ZlIGJlZm9yZSB0aGUgSS9PIHRyYW5zZmVycyBpbiBjb25maWd1cmVfaGMoKS4KIAkgKi8KIAltYigpOwotCWlmICgocmV0dmFsID0gc3RhcnRfaGModWhjaSkpICE9IDApCi0JCWdvdG8gZXJyX2FsbG9jX3NrZWxxaDsKIAotCWluaXRfc3RhbGxfdGltZXIoaGNkKTsKLQotCXVkZXYtPnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7Ci0KLQlpZiAodXNiX2hjZF9yZWdpc3Rlcl9yb290X2h1Yih1ZGV2LCBoY2QpICE9IDApIHsKLQkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwgInVuYWJsZSB0byBzdGFydCByb290IGh1YlxuIik7Ci0JCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3N0YXJ0X3Jvb3RfaHViOwotCX0KLQorCWNvbmZpZ3VyZV9oYyh1aGNpKTsKKwlzdGFydF9yaCh1aGNpKTsKIAlyZXR1cm4gMDsKIAogLyoKICAqIGVycm9yIGV4aXRzOgogICovCi1lcnJfc3RhcnRfcm9vdF9odWI6Ci0JcmVzZXRfaGModWhjaSk7Ci0KLQlkZWxfdGltZXJfc3luYygmdWhjaS0+c3RhbGxfdGltZXIpOwotCiBlcnJfYWxsb2Nfc2tlbHFoOgogCWZvciAoaSA9IDA7IGkgPCBVSENJX05VTV9TS0VMUUg7IGkrKykKIAkJaWYgKHVoY2ktPnNrZWxxaFtpXSkgewpAQCAtNjc4LDkgKzcyMCw2IEBACiAJdWhjaS0+dGVybV90ZCA9IE5VTEw7CiAKIGVycl9hbGxvY190ZXJtX3RkOgotCXVzYl9wdXRfZGV2KHVkZXYpOwotCi1lcnJfYWxsb2Nfcm9vdF9odWI6CiAJZG1hX3Bvb2xfZGVzdHJveSh1aGNpLT5xaF9wb29sKTsKIAl1aGNpLT5xaF9wb29sID0gTlVMTDsKIApAQCAtNzA1LDczICs3NDQsMTE0IEBACiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKIAotCWRlbF90aW1lcl9zeW5jKCZ1aGNpLT5zdGFsbF90aW1lcik7Ci0JcmVzZXRfaGModWhjaSk7Ci0KIAlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwlyZXNldF9oYyh1aGNpKTsKIAl1aGNpX3NjYW5fc2NoZWR1bGUodWhjaSwgTlVMTCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKLQkKKworCWRlbF90aW1lcl9zeW5jKCZ1aGNpLT5zdGFsbF90aW1lcik7CiAJcmVsZWFzZV91aGNpKHVoY2kpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHVoY2lfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3N0YXRpYyBpbnQgdWhjaV9yaF9zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKIAogCXNwaW5fbG9ja19pcnEoJnVoY2ktPmxvY2spOwotCi0JLyogRG9uJ3QgdHJ5IHRvIHN1c3BlbmQgYnJva2VuIG1vdGhlcmJvYXJkcywgcmVzZXQgaW5zdGVhZCAqLwotCWlmIChzdXNwZW5kX2FsbG93ZWQodWhjaSkpCi0JCXN1c3BlbmRfaGModWhjaSk7Ci0JZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmdWhjaS0+bG9jayk7Ci0JCXJlc2V0X2hjKHVoY2kpOwotCQlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKLQkJdWhjaV9zY2FuX3NjaGVkdWxlKHVoY2ksIE5VTEwpOwotCX0KLQorCWlmICghdWhjaS0+aGNfaW5hY2Nlc3NpYmxlKQkJLyogTm90IGRlYWQgKi8KKwkJc3VzcGVuZF9yaCh1aGNpLCBVSENJX1JIX1NVU1BFTkRFRCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB1aGNpX3JoX3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CisJaW50IHJjID0gMDsKKworCXNwaW5fbG9ja19pcnEoJnVoY2ktPmxvY2spOworCWlmICh1aGNpLT5oY19pbmFjY2Vzc2libGUpIHsKKwkJaWYgKHVoY2ktPnJoX3N0YXRlID09IFVIQ0lfUkhfU1VTUEVOREVEKSB7CisJCQlkZXZfd2Fybih1aGNpX2Rldih1aGNpKSwgIkhDIGlzbid0IHJ1bm5pbmchXG4iKTsKKwkJCXJjID0gLUVOT0RFVjsKKwkJfQorCQkvKiBPdGhlcndpc2UgdGhlIEhDIGlzIGRlYWQgKi8KKwl9IGVsc2UKKwkJd2FrZXVwX3JoKHVoY2kpOworCXNwaW5fdW5sb2NrX2lycSgmdWhjaS0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHVoY2lfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOworCWludCByYyA9IDA7CisKKwlkZXZfZGJnKHVoY2lfZGV2KHVoY2kpLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzcGluX2xvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKKwlpZiAodWhjaS0+aGNfaW5hY2Nlc3NpYmxlKQkvKiBEZWFkIG9yIGFscmVhZHkgc3VzcGVuZGVkICovCisJCWdvdG8gZG9uZTsKKworI2lmbmRlZiBDT05GSUdfVVNCX1NVU1BFTkQKKwkvKiBPdGhlcndpc2UgdGhpcyB3b3VsZCBuZXZlciBoYXBwZW4gKi8KKwlzdXNwZW5kX3JoKHVoY2ksIFVIQ0lfUkhfU1VTUEVOREVEKTsKKyNlbmRpZgorCisJaWYgKHVoY2ktPnJoX3N0YXRlID4gVUhDSV9SSF9TVVNQRU5ERUQpIHsKKwkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJSb290IGh1YiBpc24ndCBzdXNwZW5kZWQhXG4iKTsKKwkJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJCXJjID0gLUVCVVNZOworCQlnb3RvIGRvbmU7CisJfTsKKworCS8qIEFsbCBQQ0kgaG9zdCBjb250cm9sbGVycyBhcmUgcmVxdWlyZWQgdG8gZGlzYWJsZSBJUlEgZ2VuZXJhdGlvbgorCSAqIGF0IHRoZSBzb3VyY2UsIHNvIHdlIG11c3QgdHVybiBvZmYgUElSUS4KKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSksIFVTQkxFR1NVUCwgMCk7CisJdWhjaS0+aGNfaW5hY2Nlc3NpYmxlID0gMTsKKworCS8qIEZJWE1FOiBFbmFibGUgbm9uLVBNRSMgcmVtb3RlIHdha2V1cD8gKi8KKworZG9uZToKKwlzcGluX3VubG9ja19pcnEoJnVoY2ktPmxvY2spOworCWlmIChyYyA9PSAwKQorCQlkZWxfdGltZXJfc3luYygmaGNkLT5yaF90aW1lcik7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IHVoY2lfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKLQlpbnQgcmM7CiAKLQlwY2lfc2V0X21hc3Rlcih0b19wY2lfZGV2KHVoY2lfZGV2KHVoY2kpKSk7CisJZGV2X2RiZyh1aGNpX2Rldih1aGNpKSwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCisJaWYgKHVoY2ktPnJoX3N0YXRlID09IFVIQ0lfUkhfUkVTRVQpCS8qIERlYWQgKi8KKwkJcmV0dXJuIDA7CiAJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7CiAKLQlpZiAodWhjaS0+c3RhdGUgPT0gVUhDSV9TVVNQRU5ERUQpIHsKKwkvKiBGSVhNRTogRGlzYWJsZSBub24tUE1FIyByZW1vdGUgd2FrZXVwPyAqLwogCi0JCS8qCi0JCSAqIFNvbWUgc3lzdGVtcyBkb24ndCBtYWludGFpbiB0aGUgVUhDSSByZWdpc3RlciB2YWx1ZXMKLQkJICogZHVyaW5nIGEgUE0gc3VzcGVuZC9yZXN1bWUgY3ljbGUsIHNvIHJlaW5pdGlhbGl6ZQotCQkgKiB0aGUgRnJhbWUgTnVtYmVyLCBGcmFtZWxpc3QgQmFzZSBBZGRyZXNzLCBJbnRlcnJ1cHQKLQkJICogRW5hYmxlLCBhbmQgTGVnYWN5IFN1cHBvcnQgcmVnaXN0ZXJzLgotCQkgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHRvX3BjaV9kZXYodWhjaV9kZXYodWhjaSkpLCBVU0JMRUdTVVAsCi0JCQkJMCk7Ci0JCW91dHcodWhjaS0+ZnJhbWVfbnVtYmVyLCB1aGNpLT5pb19hZGRyICsgVVNCRlJOVU0pOwotCQlvdXRsKHVoY2ktPmZsLT5kbWFfaGFuZGxlLCB1aGNpLT5pb19hZGRyICsgVVNCRkxCQVNFQUREKTsKLQkJb3V0dyhVU0JJTlRSX1RJTUVPVVQgfCBVU0JJTlRSX1JFU1VNRSB8IFVTQklOVFJfSU9DIHwKLQkJCQlVU0JJTlRSX1NQLCB1aGNpLT5pb19hZGRyICsgVVNCSU5UUik7Ci0JCXVoY2ktPnJlc3VtZV9kZXRlY3QgPSAxOwotCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodG9fcGNpX2Rldih1aGNpX2Rldih1aGNpKSksIFVTQkxFR1NVUCwKLQkJCQlVU0JMRUdTVVBfREVGQVVMVCk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ1aGNpLT5sb2NrKTsKLQkJcmVzZXRfaGModWhjaSk7Ci0JCWlmICgocmMgPSBzdGFydF9oYyh1aGNpKSkgIT0gMCkKLQkJCXJldHVybiByYzsKLQkJc3Bpbl9sb2NrX2lycSgmdWhjaS0+bG9jayk7Ci0JfQotCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9SVU5OSU5HOworCXVoY2ktPmhjX2luYWNjZXNzaWJsZSA9IDA7CisKKwkvKiBUaGUgQklPUyBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBjb250cm9sbGVyIHNldHRpbmdzIGR1cmluZyBhCisJICogc3lzdGVtIHdha2V1cC4gIENoZWNrIGl0IGFuZCByZWNvbmZpZ3VyZSB0byBhdm9pZCBwcm9ibGVtcy4KKwkgKi8KKwljaGVja19hbmRfcmVzZXRfaGModWhjaSk7CisJY29uZmlndXJlX2hjKHVoY2kpOworCisjaWZuZGVmIENPTkZJR19VU0JfU1VTUEVORAorCS8qIE90aGVyd2lzZSB0aGlzIHdvdWxkIG5ldmVyIGhhcHBlbiAqLworCXdha2V1cF9yaCh1aGNpKTsKKyNlbmRpZgorCWlmICh1aGNpLT5yaF9zdGF0ZSA9PSBVSENJX1JIX1JFU0VUKQorCQlzdXNwZW5kX3JoKHVoY2ksIFVIQ0lfUkhfU1VTUEVOREVEKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmdWhjaS0+bG9jayk7CisKKwlpZiAoaGNkLT5wb2xsX3JoKQorCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKQEAgLTc4OCwxMyArODY4LDE1IEBACiBzdGF0aWMgaW50IHVoY2lfaGNkX2dldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kgPSBoY2RfdG9fdWhjaShoY2QpOwotCWludCBmcmFtZV9udW1iZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaXNfc3RvcHBlZDsKKwlpbnQgZnJhbWVfbnVtYmVyOwogCiAJLyogTWluaW1pemUgbGF0ZW5jeSBieSBhdm9pZGluZyB0aGUgc3BpbmxvY2sgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jcm1iKCk7Ci0JZnJhbWVfbnVtYmVyID0gKHVoY2ktPmlzX3N0b3BwZWQgPyB1aGNpLT5mcmFtZV9udW1iZXIgOgorCWlzX3N0b3BwZWQgPSB1aGNpLT5pc19zdG9wcGVkOworCXNtcF9ybWIoKTsKKwlmcmFtZV9udW1iZXIgPSAoaXNfc3RvcHBlZCA/IHVoY2ktPmZyYW1lX251bWJlciA6CiAJCQlpbncodWhjaS0+aW9fYWRkciArIFVTQkZSTlVNKSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiBmcmFtZV9udW1iZXI7CkBAIC04MTcsNiArODk5LDggQEAKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZCA9CQl1aGNpX3N1c3BlbmQsCiAJLnJlc3VtZSA9CQl1aGNpX3Jlc3VtZSwKKwkuaHViX3N1c3BlbmQgPQkJdWhjaV9yaF9zdXNwZW5kLAorCS5odWJfcmVzdW1lID0JCXVoY2lfcmhfcmVzdW1lLAogI2VuZGlmCiAJLnN0b3AgPQkJCXVoY2lfc3RvcCwKIApAQCAtODQ1LDYgKzkyOSw3IEBACiAKIAkucHJvYmUgPQl1c2JfaGNkX3BjaV9wcm9iZSwKIAkucmVtb3ZlID0JdXNiX2hjZF9wY2lfcmVtb3ZlLAorCS5zaHV0ZG93biA9CXVoY2lfc2h1dGRvd24sCiAKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZCA9CXVzYl9oY2RfcGNpX3N1c3BlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmggYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmgKaW5kZXggMDIyNTVkNi4uYmY5YzVmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuaApAQCAtNDEsNiArNDEsNyBAQAogI2RlZmluZSBVU0JGUk5VTQk2CiAjZGVmaW5lIFVTQkZMQkFTRUFERAk4CiAjZGVmaW5lIFVTQlNPRgkJMTIKKyNkZWZpbmUgICBVU0JTT0ZfREVGQVVMVAk2NAkvKiBGcmFtZSBsZW5ndGggaXMgZXhhY3RseSAxIG1zICovCiAKIC8qIFVTQiBwb3J0IHN0YXR1cyBhbmQgY29udHJvbCByZWdpc3RlcnMgKi8KICNkZWZpbmUgVVNCUE9SVFNDMQkxNgpAQCAtNjYsNiArNjcsOCBAQAogLyogTGVnYWN5IHN1cHBvcnQgcmVnaXN0ZXIgKi8KICNkZWZpbmUgVVNCTEVHU1VQCQkweGMwCiAjZGVmaW5lICAgVVNCTEVHU1VQX0RFRkFVTFQJMHgyMDAwCS8qIG9ubHkgUElSUSBlbmFibGUgc2V0ICovCisjZGVmaW5lICAgVVNCTEVHU1VQX1JXQwkJMHg4ZjAwCS8qIHRoZSBSL1dDIGJpdHMgKi8KKyNkZWZpbmUgICBVU0JMRUdTVVBfUk8JCTB4NTA0MAkvKiBSL08gYW5kIHJlc2VydmVkIGJpdHMgKi8KIAogI2RlZmluZSBVSENJX05VTExfREFUQV9TSVpFCTB4N0ZGCS8qIGZvciBVSENJIGNvbnRyb2xsZXIgVEQgKi8KIApAQCAtMTExLDcgKzExNCw2IEBACiAJLyogU29mdHdhcmUgZmllbGRzICovCiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwogCi0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdXJiX3ByaXYgKnVyYnA7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBQOiB1aGNpLT5mcmFtZV9saXN0X2xvY2sgKi8KQEAgLTIwMyw3ICsyMDUsNiBAQAogCS8qIFNvZnR3YXJlIGZpZWxkcyAqLwogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAotCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CiAJc3RydWN0IHVyYiAqdXJiOwogCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogUDogdXJiLT5sb2NrICovCkBAIC0zMTQsMjYgKzMxNSwzMiBAQAogfQogCiAvKgotICogRGV2aWNlIHN0YXRlcyBmb3IgdGhlIGhvc3QgY29udHJvbGxlci4KKyAqIFN0YXRlcyBmb3IgdGhlIHJvb3QgaHViLgogICoKICAqIFRvIHByZXZlbnQgImJvdW5jaW5nIiBpbiB0aGUgcHJlc2VuY2Ugb2YgZWxlY3RyaWNhbCBub2lzZSwKLSAqIHdlIGluc2lzdCBvbiBhIDEtc2Vjb25kICJncmFjZSIgcGVyaW9kLCBiZWZvcmUgc3dpdGNoaW5nIHRvCi0gKiB0aGUgUlVOTklORyBvciBTVVNQRU5ERUQgc3RhdGVzLCBkdXJpbmcgd2hpY2ggdGhlIHN0YXRlIGlzCi0gKiBub3QgYWxsb3dlZCB0byBjaGFuZ2UuCi0gKgotICogVGhlIHJlc3VtZSBwcm9jZXNzIGlzIGRpdmlkZWQgaW50byBzdWJzdGF0ZXMgaW4gb3JkZXIgdG8gYXZvaWQKLSAqIHBvdGVudGlhbGx5IGxlbmd0aCBkZWxheXMgZHVyaW5nIHRoZSB0aW1lciBoYW5kbGVyLgotICoKLSAqIFN0YXRlcyBpbiB3aGljaCB0aGUgaG9zdCBjb250cm9sbGVyIGlzIGhhbHRlZCBtdXN0IGhhdmUgdmFsdWVzIDw9IDAuCisgKiB3aGVuIHRoZXJlIGFyZSBubyBkZXZpY2VzIGF0dGFjaGVkIHdlIGRlbGF5IGZvciAxIHNlY29uZCBpbiB0aGUKKyAqIFJVTk5JTkdfTk9ERVZTIHN0YXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gdGhlIEFVVE9fU1RPUFBFRCBzdGF0ZS4KKyAqIAorICogKE5vdGUgdGhhdCB0aGUgQVVUT19TVE9QUEVEIHN0YXRlIHdvbid0IGJlIG5lY2Vzc2FyeSBvbmNlIHRoZSBodWIKKyAqIGRyaXZlciBsZWFybnMgdG8gYXV0b3N1c3BlbmQuKQogICovCi1lbnVtIHVoY2lfc3RhdGUgewotCVVIQ0lfUkVTRVQsCi0JVUhDSV9SVU5OSU5HX0dSQUNFLAkJLyogQmVmb3JlIFJVTk5JTkcgKi8KLQlVSENJX1JVTk5JTkcsCQkJLyogVGhlIG5vcm1hbCBzdGF0ZSAqLwotCVVIQ0lfU1VTUEVORElOR19HUkFDRSwJCS8qIEJlZm9yZSBTVVNQRU5ERUQgKi8KLQlVSENJX1NVU1BFTkRFRCA9IC0xMCwJCS8qIFdoZW4gbm8gZGV2aWNlcyBhcmUgYXR0YWNoZWQgKi8KLQlVSENJX1JFU1VNSU5HXzEsCi0JVUhDSV9SRVNVTUlOR18yCitlbnVtIHVoY2lfcmhfc3RhdGUgeworCS8qIEluIHRoZSBmb2xsb3dpbmcgc3RhdGVzIHRoZSBIQyBtdXN0IGJlIGhhbHRlZC4KKwkgKiBUaGVzZSB0d28gbXVzdCBjb21lIGZpcnN0ICovCisJVUhDSV9SSF9SRVNFVCwKKwlVSENJX1JIX1NVU1BFTkRFRCwKKworCVVIQ0lfUkhfQVVUT19TVE9QUEVELAorCVVIQ0lfUkhfUkVTVU1JTkcsCisKKwkvKiBJbiB0aGlzIHN0YXRlIHRoZSBIQyBjaGFuZ2VzIGZyb20gcnVubmluZyB0byBoYWx0ZWQsCisJICogc28gaXQgY2FuIGxlZ2FsbHkgYXBwZWFyIGVpdGhlciB3YXkuICovCisJVUhDSV9SSF9TVVNQRU5ESU5HLAorCisJLyogSW4gdGhlIGZvbGxvd2luZyBzdGF0ZXMgaXQncyBhbiBlcnJvciBpZiB0aGUgSEMgaXMgaGFsdGVkLgorCSAqIFRoZXNlIHR3byBtdXN0IGNvbWUgbGFzdCAqLworCVVIQ0lfUkhfUlVOTklORywJCS8qIFRoZSBub3JtYWwgc3RhdGUgKi8KKwlVSENJX1JIX1JVTk5JTkdfTk9ERVZTLAkJLyogUnVubmluZyB3aXRoIG5vIGRldmljZXMgYXR0YWNoZWQgKi8KIH07CiAKIC8qCkBAIC0zNjMsMTUgKzM3MCwxNiBAQAogCWludCBmc2JyOwkJCQkvKiBGdWxsLXNwZWVkIGJhbmR3aWR0aCByZWNsYW1hdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcgZnNicnRpbWVvdXQ7CQkvKiBGU0JSIGRlbGF5ICovCiAKLQllbnVtIHVoY2lfc3RhdGUgc3RhdGU7CQkJLyogRklYTUU6IG5lZWRzIGEgc3BpbmxvY2sgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXRlX2VuZDsJCS8qIFRpbWUgb2YgbmV4dCB0cmFuc2l0aW9uICovCisJZW51bSB1aGNpX3JoX3N0YXRlIHJoX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgYXV0b19zdG9wX3RpbWU7CQkvKiBXaGVuIHRvIEFVVE9fU1RPUCAqLworCiAJdW5zaWduZWQgaW50IGZyYW1lX251bWJlcjsJCS8qIEFzIG9mIGxhc3QgY2hlY2sgKi8KIAl1bnNpZ25lZCBpbnQgaXNfc3RvcHBlZDsKICNkZWZpbmUgVUhDSV9JU19TVE9QUEVECQk5OTk5CQkvKiBMYXJnZXIgdGhhbiBhIGZyYW1lICMgKi8KIAogCXVuc2lnbmVkIGludCBzY2FuX2luX3Byb2dyZXNzOjE7CS8qIFNjaGVkdWxlIHNjYW4gaXMgcnVubmluZyAqLwogCXVuc2lnbmVkIGludCBuZWVkX3Jlc2NhbjoxOwkJLyogUmVkbyB0aGUgc2NoZWR1bGUgc2NhbiAqLwotCXVuc2lnbmVkIGludCByZXN1bWVfZGV0ZWN0OjE7CQkvKiBOZWVkIGEgR2xvYmFsIFJlc3VtZSAqLworCXVuc2lnbmVkIGludCBoY19pbmFjY2Vzc2libGU6MTsJCS8qIEhDIGlzIHN1c3BlbmRlZCBvciBkZWFkICovCiAKIAkvKiBTdXBwb3J0IGZvciBwb3J0IHN1c3BlbmQvcmVzdW1lL3Jlc2V0ICovCiAJdW5zaWduZWQgbG9uZyBwb3J0X2Nfc3VzcGVuZDsJCS8qIEJpdC1hcnJheXMgb2YgcG9ydHMgKi8KQEAgLTQ1MSw0ICs0NTksMTEgQEAKICAqICMyIHVyYi0+bG9jawogICovCiAKKworLyogU29tZSBzcGVjaWFsIElEcyAqLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfR0VORVNZUwkJMHgxN2EwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfR0w4ODBTX1VIQ0kJMHg4MDgzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfR0w4ODBTX0VIQ0kJMHg4MDg0CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWh1Yi5jCmluZGV4IDRjNDViYTguLjRlYWNlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaHViLmMKQEAgLTMzLDkgKzMzLDI0IEBACiAvKiBzdGF0dXMgY2hhbmdlIGJpdHM6ICBub256ZXJvIHdyaXRlcyB3aWxsIGNsZWFyICovCiAjZGVmaW5lIFJXQ19CSVRTCShVU0JQT1JUU0NfT0NDIHwgVVNCUE9SVFNDX1BFQyB8IFVTQlBPUlRTQ19DU0MpCiAKLXN0YXRpYyBpbnQgdWhjaV9odWJfc3RhdHVzX2RhdGEoc3RydWN0IHVzYl9oY2QgKmhjZCwgY2hhciAqYnVmKQorLyogQSBwb3J0IHRoYXQgZWl0aGVyIGlzIGNvbm5lY3RlZCBvciBoYXMgYSBjaGFuZ2VkLWJpdCBzZXQgd2lsbCBwcmV2ZW50CisgKiB1cyBmcm9tIEFVVE9fU1RPUFBJTkcuCisgKi8KK3N0YXRpYyBpbnQgYW55X3BvcnRzX2FjdGl2ZShzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCiB7Ci0Jc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaGNkX3RvX3VoY2koaGNkKTsKKwlpbnQgcG9ydDsKKworCWZvciAocG9ydCA9IDA7IHBvcnQgPCB1aGNpLT5yaF9udW1wb3J0czsgKytwb3J0KSB7CisJCWlmICgoaW53KHVoY2ktPmlvX2FkZHIgKyBVU0JQT1JUU0MxICsgcG9ydCAqIDIpICYKKwkJCQkoVVNCUE9SVFNDX0NDUyB8IFJXQ19CSVRTKSkgfHwKKwkJCQl0ZXN0X2JpdChwb3J0LCAmdWhjaS0+cG9ydF9jX3N1c3BlbmQpKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgY2hhciAqYnVmKQorewogCWludCBwb3J0OwogCiAJKmJ1ZiA9IDA7CkBAIC00NCw4ICs1OSw2IEBACiAJCQkJdGVzdF9iaXQocG9ydCwgJnVoY2ktPnBvcnRfY19zdXNwZW5kKSkKIAkJCSpidWYgfD0gKDEgPDwgKHBvcnQgKyAxKSk7CiAJfQotCWlmICgqYnVmICYmIHVoY2ktPnN0YXRlID09IFVIQ0lfU1VTUEVOREVEKQotCQl1aGNpLT5yZXN1bWVfZGV0ZWN0ID0gMTsKIAlyZXR1cm4gISEqYnVmOwogfQogCkBAIC0xMTUsNiArMTI4LDExIEBACiAJCQkJc2V0X2JpdChwb3J0LCAmdWhjaS0+cmVzdW1pbmdfcG9ydHMpOwogCQkJCXVoY2ktPnBvcnRzX3RpbWVvdXQgPSBqaWZmaWVzICsKIAkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjApOworCisJCQkJLyogTWFrZSBzdXJlIHdlIHNlZSB0aGUgcG9ydCBhZ2FpbgorCQkJCSAqIGFmdGVyIHRoZSByZXN1bWluZyBwZXJpb2QgaXMgb3Zlci4gKi8KKwkJCQltb2RfdGltZXIoJnVoY2lfdG9faGNkKHVoY2kpLT5yaF90aW1lciwKKwkJCQkJCXVoY2ktPnBvcnRzX3RpbWVvdXQpOwogCQkJfSBlbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsCiAJCQkJCQl1aGNpLT5wb3J0c190aW1lb3V0KSkgewogCQkJCXVoY2lfZmluaXNoX3N1c3BlbmQodWhjaSwgcG9ydCwgcG9ydF9hZGRyKTsKQEAgLTEyMyw2ICsxNDEsNjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgdWhjaV9odWJfc3RhdHVzX2RhdGEoc3RydWN0IHVzYl9oY2QgKmhjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKKwlpZiAodWhjaS0+aGNfaW5hY2Nlc3NpYmxlKSB7CisJCXN0YXR1cyA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl1aGNpX2NoZWNrX3BvcnRzKHVoY2kpOworCXN0YXR1cyA9IGdldF9odWJfc3RhdHVzX2RhdGEodWhjaSwgYnVmKTsKKworCXN3aXRjaCAodWhjaS0+cmhfc3RhdGUpIHsKKwkgICAgY2FzZSBVSENJX1JIX1NVU1BFTkRJTkc6CisJICAgIGNhc2UgVUhDSV9SSF9TVVNQRU5ERUQ6CisJCS8qIGlmIHBvcnQgY2hhbmdlLCBhc2sgdG8gYmUgcmVzdW1lZCAqLworCQlpZiAoc3RhdHVzKQorCQkJdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoaGNkKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSBVSENJX1JIX0FVVE9fU1RPUFBFRDoKKwkJLyogaWYgcG9ydCBjaGFuZ2UsIGF1dG8gc3RhcnQgKi8KKwkJaWYgKHN0YXR1cykKKwkJCXdha2V1cF9yaCh1aGNpKTsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSBVSENJX1JIX1JVTk5JTkc6CisJCS8qIGFyZSBhbnkgZGV2aWNlcyBhdHRhY2hlZD8gKi8KKwkJaWYgKCFhbnlfcG9ydHNfYWN0aXZlKHVoY2kpKSB7CisJCQl1aGNpLT5yaF9zdGF0ZSA9IFVIQ0lfUkhfUlVOTklOR19OT0RFVlM7CisJCQl1aGNpLT5hdXRvX3N0b3BfdGltZSA9IGppZmZpZXMgKyBIWjsKKwkJfQorCQlicmVhazsKKworCSAgICBjYXNlIFVIQ0lfUkhfUlVOTklOR19OT0RFVlM6CisJCS8qIGF1dG8tc3RvcCBpZiBub3RoaW5nIGNvbm5lY3RlZCBmb3IgMSBzZWNvbmQgKi8KKwkJaWYgKGFueV9wb3J0c19hY3RpdmUodWhjaSkpCisJCQl1aGNpLT5yaF9zdGF0ZSA9IFVIQ0lfUkhfUlVOTklORzsKKwkJZWxzZSBpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB1aGNpLT5hdXRvX3N0b3BfdGltZSkpCisJCQlzdXNwZW5kX3JoKHVoY2ksIFVIQ0lfUkhfQVVUT19TVE9QUEVEKTsKKwkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVoY2ktPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKiBzaXplIG9mIHJldHVybmVkIGJ1ZmZlciBpcyBwYXJ0IG9mIFVTQiBzcGVjICovCiBzdGF0aWMgaW50IHVoY2lfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwgdTE2IHR5cGVSZXEsIHUxNiB3VmFsdWUsCiAJCQl1MTYgd0luZGV4LCBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKQpAQCAtMTM0LDYgKzIwNiw5IEBACiAJdTE2IHdQb3J0Q2hhbmdlLCB3UG9ydFN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaWYgKHVoY2ktPmhjX2luYWNjZXNzaWJsZSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWhjaS0+bG9jaywgZmxhZ3MpOwogCXN3aXRjaCAodHlwZVJlcSkgewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLXEuYwppbmRleCAyYTdjMTk1Li5iYmIzNmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktcS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1xLmMKQEAgLTMyLDYgKzMyLDggQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHVoY2lfc2V0X25leHRfaW50ZXJydXB0KHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKIHsKKwlpZiAodWhjaS0+aXNfc3RvcHBlZCkKKwkJbW9kX3RpbWVyKCZ1aGNpLT5zdGFsbF90aW1lciwgamlmZmllcyk7CiAJdWhjaS0+dGVybV90ZC0+c3RhdHVzIHw9IGNwdV90b19sZTMyKFREX0NUUkxfSU9DKTsgCiB9CiAKQEAgLTQ2LDcgKzQ4LDcgQEAKIAlsaXN0X21vdmVfdGFpbCgmdXJicC0+dXJiX2xpc3QsICZ1aGNpLT5jb21wbGV0ZV9saXN0KTsKIH0KIAotc3RhdGljIHN0cnVjdCB1aGNpX3RkICp1aGNpX2FsbG9jX3RkKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgdWhjaV90ZCAqdWhjaV9hbGxvY190ZChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCiB7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwogCXN0cnVjdCB1aGNpX3RkICp0ZDsKQEAgLTYxLDE0ICs2MywxMSBAQAogCXRkLT5idWZmZXIgPSAwOwogCiAJdGQtPmZyYW1lID0gLTE7Ci0JdGQtPmRldiA9IGRldjsKIAogCUlOSVRfTElTVF9IRUFEKCZ0ZC0+bGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRkLT5yZW1vdmVfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnRkLT5mbF9saXN0KTsKIAotCXVzYl9nZXRfZGV2KGRldik7Ci0KIAlyZXR1cm4gdGQ7CiB9CiAKQEAgLTE2OCwxMyArMTY3LDEwIEBACiAJaWYgKCFsaXN0X2VtcHR5KCZ0ZC0+ZmxfbGlzdCkpCiAJCWRldl93YXJuKHVoY2lfZGV2KHVoY2kpLCAidGQgJXAgc3RpbGwgaW4gZmxfbGlzdCFcbiIsIHRkKTsKIAotCWlmICh0ZC0+ZGV2KQotCQl1c2JfcHV0X2Rldih0ZC0+ZGV2KTsKLQogCWRtYV9wb29sX2ZyZWUodWhjaS0+dGRfcG9vbCwgdGQsIHRkLT5kbWFfaGFuZGxlKTsKIH0KIAotc3RhdGljIHN0cnVjdCB1aGNpX3FoICp1aGNpX2FsbG9jX3FoKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSwgc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgdWhjaV9xaCAqdWhjaV9hbGxvY19xaChzdHJ1Y3QgdWhjaV9oY2QgKnVoY2kpCiB7CiAJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOwogCXN0cnVjdCB1aGNpX3FoICpxaDsKQEAgLTE4OCwxNCArMTg0LDExIEBACiAJcWgtPmVsZW1lbnQgPSBVSENJX1BUUl9URVJNOwogCXFoLT5saW5rID0gVUhDSV9QVFJfVEVSTTsKIAotCXFoLT5kZXYgPSBkZXY7CiAJcWgtPnVyYnAgPSBOVUxMOwogCiAJSU5JVF9MSVNUX0hFQUQoJnFoLT5saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcWgtPnJlbW92ZV9saXN0KTsKIAotCXVzYl9nZXRfZGV2KGRldik7Ci0KIAlyZXR1cm4gcWg7CiB9CiAKQEAgLTIwNiw5ICsxOTksNiBAQAogCWlmICghbGlzdF9lbXB0eSgmcWgtPnJlbW92ZV9saXN0KSkKIAkJZGV2X3dhcm4odWhjaV9kZXYodWhjaSksICJxaCAlcCBzdGlsbCBpbiByZW1vdmVfbGlzdCFcbiIsIHFoKTsKIAotCWlmIChxaC0+ZGV2KQotCQl1c2JfcHV0X2RldihxaC0+ZGV2KTsKLQogCWRtYV9wb29sX2ZyZWUodWhjaS0+cWhfcG9vbCwgcWgsIHFoLT5kbWFfaGFuZGxlKTsKIH0KIApAQCAtNTk3LDcgKzU4Nyw3IEBACiAJLyoKIAkgKiBCdWlsZCB0aGUgVEQgZm9yIHRoZSBjb250cm9sIHJlcXVlc3Qgc2V0dXAgcGFja2V0CiAJICovCi0JdGQgPSB1aGNpX2FsbG9jX3RkKHVoY2ksIHVyYi0+ZGV2KTsKKwl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJaWYgKCF0ZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTYyNiw3ICs2MTYsNyBAQAogCQlpZiAocGt0c3plID4gbWF4c3plKQogCQkJcGt0c3plID0gbWF4c3plOwogCi0JCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpLCB1cmItPmRldik7CisJCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpKTsKIAkJaWYgKCF0ZCkKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NDQsNyArNjM0LDcgQEAKIAkvKgogCSAqIEJ1aWxkIHRoZSBmaW5hbCBURCBmb3IgY29udHJvbCBzdGF0dXMgCiAJICovCi0JdGQgPSB1aGNpX2FsbG9jX3RkKHVoY2ksIHVyYi0+ZGV2KTsKKwl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJaWYgKCF0ZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTY2Niw3ICs2NTYsNyBAQAogCXVoY2lfZmlsbF90ZCh0ZCwgc3RhdHVzIHwgVERfQ1RSTF9JT0MsCiAJCWRlc3RpbmF0aW9uIHwgdWhjaV9leHBsZW4oVUhDSV9OVUxMX0RBVEFfU0laRSksIDApOwogCi0JcWggPSB1aGNpX2FsbG9jX3FoKHVoY2ksIHVyYi0+ZGV2KTsKKwlxaCA9IHVoY2lfYWxsb2NfcWgodWhjaSk7CiAJaWYgKCFxaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTg2NSw3ICs4NTUsNyBAQAogCQkJCXN0YXR1cyAmPSB+VERfQ1RSTF9TUEQ7CiAJCX0KIAotCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSwgdXJiLT5kZXYpOworCQl0ZCA9IHVoY2lfYWxsb2NfdGQodWhjaSk7CiAJCWlmICghdGQpCiAJCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtODkxLDcgKzg4MSw3IEBACiAJICovCiAJaWYgKHVzYl9waXBlb3V0KHVyYi0+cGlwZSkgJiYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfWkVST19QQUNLRVQpICYmCiAJICAgICFsZW4gJiYgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSB7Ci0JCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpLCB1cmItPmRldik7CisJCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpKTsKIAkJaWYgKCF0ZCkKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC05MTMsNyArOTAzLDcgQEAKIAkgKiBmbGFnIHNldHRpbmcuICovCiAJdGQtPnN0YXR1cyB8PSBjcHVfdG9fbGUzMihURF9DVFJMX0lPQyk7CiAKLQlxaCA9IHVoY2lfYWxsb2NfcWgodWhjaSwgdXJiLT5kZXYpOworCXFoID0gdWhjaV9hbGxvY19xaCh1aGNpKTsKIAlpZiAoIXFoKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTA5Niw3ICsxMDg2LDcgQEAKIAkJaWYgKCF1cmItPmlzb19mcmFtZV9kZXNjW2ldLmxlbmd0aCkKIAkJCWNvbnRpbnVlOwogCi0JCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpLCB1cmItPmRldik7CisJCXRkID0gdWhjaV9hbGxvY190ZCh1aGNpKTsKIAkJaWYgKCF0ZCkKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMTc0LDcgKzExNjQsNyBAQAogCiBzdGF0aWMgaW50IHVoY2lfdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwKIAkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKLQkJc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKQorCQlzdHJ1Y3QgdXJiICp1cmIsIHVuc2lnbmVkIG1lbV9mbGFncykKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGhjZF90b191aGNpKGhjZCk7CkBAIC0xNDk3LDYgKzE0ODcsNyBAQAogIHJlc2NhbjoKIAl1aGNpLT5uZWVkX3Jlc2NhbiA9IDA7CiAKKwl1aGNpX2NsZWFyX25leHRfaW50ZXJydXB0KHVoY2kpOwogCXVoY2lfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKHVoY2kpOwogCiAJaWYgKHVoY2ktPmZyYW1lX251bWJlciArIHVoY2ktPmlzX3N0b3BwZWQgIT0gdWhjaS0+cWhfcmVtb3ZlX2FnZSkKQEAgLTE1MzcsMyArMTUyOCwyNiBAQAogCS8qIFdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIGFuIFVSQiB0byBjb21wbGV0ZSAqLwogCXdha2VfdXBfYWxsKCZ1aGNpLT53YWl0cWgpOwogfQorCitzdGF0aWMgdm9pZCBjaGVja19mc2JyKHN0cnVjdCB1aGNpX2hjZCAqdWhjaSkKK3sKKwlzdHJ1Y3QgdXJiX3ByaXYgKnVwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1cCwgJnVoY2ktPnVyYl9saXN0LCB1cmJfbGlzdCkgeworCQlzdHJ1Y3QgdXJiICp1ID0gdXAtPnVyYjsKKworCQlzcGluX2xvY2soJnUtPmxvY2spOworCisJCS8qIENoZWNrIGlmIHRoZSBGU0JSIHRpbWVkIG91dCAqLworCQlpZiAodXAtPmZzYnIgJiYgIXVwLT5mc2JyX3RpbWVvdXQgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCB1cC0+ZnNicnRpbWUgKyBJRExFX1RJTUVPVVQpKQorCQkJdWhjaV9mc2JyX3RpbWVvdXQodWhjaSwgdSk7CisKKwkJc3Bpbl91bmxvY2soJnUtPmxvY2spOworCX0KKworCS8qIFJlYWxseSBkaXNhYmxlIEZTQlIgKi8KKwlpZiAoIXVoY2ktPmZzYnIgJiYgdWhjaS0+ZnNicnRpbWVvdXQgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCB1aGNpLT5mc2JydGltZW91dCkpIHsKKwkJdWhjaS0+ZnNicnRpbWVvdXQgPSAwOworCQl1aGNpLT5za2VsX3Rlcm1fcWgtPmxpbmsgPSBVSENJX1BUUl9URVJNOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCmluZGV4IGQyOGU3ZWEuLjI5OGU0YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZwpAQCAtMTUxLDYgKzE1MSwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgd2Fjb20uCiAKK2NvbmZpZyBVU0JfQUNFQ0FECisJdHJpc3RhdGUgIkFjZWNhZCBGbGFpciB0YWJsZXQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBVU0IgdmVyc2lvbiBvZiB0aGUgQWNlY2FkIEZsYWlyCisJICB0YWJsZXQuICBNYWtlIHN1cmUgdG8gc2F5IFkgdG8gIk1vdXNlIHN1cHBvcnQiCisJICAoQ09ORklHX0lOUFVUX01PVVNFREVWKSBhbmQvb3IgIkV2ZW50IGludGVyZmFjZSBzdXBwb3J0IgorCSAgKENPTkZJR19JTlBVVF9FVkRFVikgYXMgd2VsbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWNlY2FkLgorCiBjb25maWcgVVNCX0tCVEFCCiAJdHJpc3RhdGUgIktCIEdlYXIgSmFtU3R1ZGlvIHRhYmxldCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIElOUFVUCkBAIC0xOTAsNiArMjAyLDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtdG91Y2h1c2IuCiAKK2NvbmZpZyBVU0JfSVRNVE9VQ0gKKwl0cmlzdGF0ZSAiSVRNIFRvdWNoIFVTQiBUb3VjaHNjcmVlbiBEcml2ZXIiCisJZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBhIElUTSBUb3VjaCBVU0IKKwkgIFRvdWNoc2NyZWVuIGNvbnRyb2xsZXIuCisKKwkgIFRoaXMgdG91Y2hzY3JlZW4gaXMgdXNlZCBpbiBMRyAxNTEwU0YgbW9uaXRvcnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGl0bXRvdWNoLgorCiBjb25maWcgVVNCX0VHQUxBWAogCXRyaXN0YXRlICJlR2FsYXggVG91Y2hLaXQgVVNCIFRvdWNoc2NyZWVuIERyaXZlciIKIAlkZXBlbmRzIG9uIFVTQiAmJiBJTlBVVApAQCAtMjM1LDMgKzI1OSwxNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgYXRpX3JlbW90ZS4KIAorY29uZmlnIFVTQl9LRVlTUEFOX1JFTU9URQorCXRyaXN0YXRlICJLZXlzcGFuIERNUiBVU0IgcmVtb3RlIGNvbnRyb2wgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0IgJiYgSU5QVVQgJiYgRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBLZXlzcGFuIERNUiBVU0IgcmVtb3RlIGNvbnRyb2wuCisJICBDdXJyZW50bHkgb25seSB0aGUgVUlBLTExIHR5cGUgb2YgcmVjZWl2ZXIgaGFzIGJlZW4gdGVzdGVkLiAgVGhlIHRhZworCSAgb24gdGhlIHJlY2VpdmVyIHRoYXQgY29ubmVjdHMgdG8gdGhlIFVTQiBwb3J0IHNob3VsZCBoYXZlIGEgUC9OIHRoYXQKKwkgIHdpbGwgdGVsbCB5b3Ugd2hhdCB0eXBlIG9mIERNUiB5b3UgaGF2ZS4gIFRoZSBVSUEtMTAgdHlwZSBpcyBub3QKKwkgIHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUuICBUaGlzIGRyaXZlciBtYXBzIGFsbCBidXR0b25zIHRvIGtleXByZXNzCisJICBldmVudHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGtleXNwYW5fcmVtb3RlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQppbmRleCA2YmNlZGQxLi5mMTU0N2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQpAQCAtMzEsOSArMzEsMTIgQEAKIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gdXNiaGlkLm8KIG9iai0kKENPTkZJR19VU0JfS0JEKQkJKz0gdXNia2JkLm8KIG9iai0kKENPTkZJR19VU0JfS0JUQUIpCQkrPSBrYnRhYi5vCitvYmotJChDT05GSUdfVVNCX0tFWVNQQU5fUkVNT1RFKQkrPSBrZXlzcGFuX3JlbW90ZS5vCiBvYmotJChDT05GSUdfVVNCX01PVVNFKQkJKz0gdXNibW91c2Uubwogb2JqLSQoQ09ORklHX1VTQl9NVE9VQ0gpCSs9IG10b3VjaHVzYi5vCitvYmotJChDT05GSUdfVVNCX0lUTVRPVUNIKQkrPSBpdG10b3VjaC5vCiBvYmotJChDT05GSUdfVVNCX0VHQUxBWCkJKz0gdG91Y2hraXR1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9QT1dFUk1BVEUpCSs9IHBvd2VybWF0ZS5vCiBvYmotJChDT05GSUdfVVNCX1dBQ09NKQkJKz0gd2Fjb20ubworb2JqLSQoQ09ORklHX1VTQl9BQ0VDQUQpCSs9IGFjZWNhZC5vCiBvYmotJChDT05GSUdfVVNCX1hQQUQpCQkrPSB4cGFkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jIGIvZHJpdmVycy91c2IvaW5wdXQvYWNlY2FkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjZjdjOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAwMS0yMDA1IEVkb3VhcmQgVElTU0VSQU5UICAgPGVkb3VhcmQudGlzc2VyYW50QHdhbmFkb28uZnI+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU3RlcGhhbmUgVk9MVFogICAgICA8c3ZvbHR6QG51bWVyaWNhYmxlLmZyPgorICoKKyAqICBVU0IgQWNlY2FkICJBY2VjYWQgRmxhaXIiIHRhYmxldCBzdXBwb3J0CisgKgorICogIENoYW5nZWxvZzoKKyAqICAgICAgdjMuMiAtIEFkZGVkIHN5c2ZzIHN1cHBvcnQKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworLyoKKyAqIFZlcnNpb24gSW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjMuMiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgIlVTQiBBY2VjYWQgRmxhaXIgdGFibGV0IGRyaXZlciIKKyNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgIkVkb3VhcmQgVElTU0VSQU5UIDxlZG91YXJkLnRpc3NlcmFudEB3YW5hZG9vLmZyPiIKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRShEUklWRVJfTElDRU5TRSk7CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQJMHgwNDYwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRkxBSVIJMHgwMDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMzAyCTB4MDAwOAorCitzdHJ1Y3QgdXNiX2FjZWNhZCB7CisJY2hhciBuYW1lWzEyOF07CisJY2hhciBwaHlzWzY0XTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgZGV2OworCXN0cnVjdCB1cmIgKmlycTsKKworCXNpZ25lZCBjaGFyICpkYXRhOworCWRtYV9hZGRyX3QgZGF0YV9kbWE7Cit9OworCitzdGF0aWMgdm9pZCB1c2JfYWNlY2FkX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2JfYWNlY2FkICphY2VjYWQgPSB1cmItPmNvbnRleHQ7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IGFjZWNhZC0+ZGF0YTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmYWNlY2FkLT5kZXY7CisJaW50IHByb3gsIHN0YXR1czsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwkJY2FzZSAwOgorCQkJLyogc3VjY2VzcyAqLworCQkJYnJlYWs7CisJCWNhc2UgLUVDT05OUkVTRVQ6CisJCWNhc2UgLUVOT0VOVDoKKwkJY2FzZSAtRVNIVVRET1dOOgorCQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlnb3RvIHJlc3VibWl0OworCX0KKworCXByb3ggPSAoZGF0YVswXSAmIDB4MDQpID4+IDI7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1BFTiwgcHJveCk7CisKKwlpZiAocHJveCkgeworCQlpbnQgeCA9IGRhdGFbMV0gfCAoZGF0YVsyXSA8PCA4KTsKKwkJaW50IHkgPSBkYXRhWzNdIHwgKGRhdGFbNF0gPDwgOCk7CisJCS8qUHJlc3N1cmUgc2hvdWxkIGNvbXB1dGUgdGhlIHNhbWUgd2F5IGZvciBmbGFpciBhbmQgMzAyKi8KKwkJaW50IHByZXNzdXJlID0gZGF0YVs1XSB8ICgoaW50KWRhdGFbNl0gPDwgOCk7CisJCWludCB0b3VjaCA9IGRhdGFbMF0gJiAweDAxOworCQlpbnQgc3R5bHVzID0gKGRhdGFbMF0gJiAweDEwKSA+PiA0OworCQlpbnQgc3R5bHVzMiA9IChkYXRhWzBdICYgMHgyMCkgPj4gNTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCB4KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCB5KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgcHJlc3N1cmUpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCB0b3VjaCk7CisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTLCBzdHlsdXMpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsIHN0eWx1czIpOworCX0KKworCS8qIGV2ZW50IHRlcm1pbmF0aW9uICovCisJaW5wdXRfc3luYyhkZXYpOworCityZXN1Ym1pdDoKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKQorCQllcnIgKCJjYW4ndCByZXN1Ym1pdCBpbnRyLCAlcy0lcy9pbnB1dDAsIHN0YXR1cyAlZCIsCisJCQlhY2VjYWQtPnVzYmRldi0+YnVzLT5idXNfbmFtZSwgYWNlY2FkLT51c2JkZXYtPmRldnBhdGgsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgdXNiX2FjZWNhZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2FjZWNhZCAqYWNlY2FkID0gZGV2LT5wcml2YXRlOworCisJYWNlY2FkLT5pcnEtPmRldiA9IGFjZWNhZC0+dXNiZGV2OworCWlmICh1c2Jfc3VibWl0X3VyYihhY2VjYWQtPmlycSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9hY2VjYWRfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2JfYWNlY2FkICphY2VjYWQgPSBkZXYtPnByaXZhdGU7CisKKwl1c2Jfa2lsbF91cmIoYWNlY2FkLT5pcnEpOworfQorCitzdGF0aWMgaW50IHVzYl9hY2VjYWRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXN0cnVjdCB1c2JfYWNlY2FkICphY2VjYWQ7CisJaW50IHBpcGUsIG1heHA7CisJY2hhciBwYXRoWzY0XTsKKworCWlmIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKworCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgIT0gMykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQoZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CisKKwlhY2VjYWQgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgdXNiX2FjZWNhZCksIEdGUF9LRVJORUwpOworCWlmICghYWNlY2FkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFjZWNhZC0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCA4LCBTTEFCX0tFUk5FTCwgJmFjZWNhZC0+ZGF0YV9kbWEpOworCWlmICghYWNlY2FkLT5kYXRhKQorCQlnb3RvIGZhaWwxOworCisJYWNlY2FkLT5pcnEgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghYWNlY2FkLT5pcnEpCisJCWdvdG8gZmFpbDI7CisKKwlpZiAoZGV2LT5tYW51ZmFjdHVyZXIpCisJCXN0cmxjcHkoYWNlY2FkLT5uYW1lLCBkZXYtPm1hbnVmYWN0dXJlciwgc2l6ZW9mKGFjZWNhZC0+bmFtZSkpOworCisJaWYgKGRldi0+cHJvZHVjdCkgeworCQlpZiAoZGV2LT5tYW51ZmFjdHVyZXIpCisJCQlzdHJsY2F0KGFjZWNhZC0+bmFtZSwgIiAiLCBzaXplb2YoYWNlY2FkLT5uYW1lKSk7CisJCXN0cmxjYXQoYWNlY2FkLT5uYW1lLCBkZXYtPnByb2R1Y3QsIHNpemVvZihhY2VjYWQtPm5hbWUpKTsKKwl9CisKKwl1c2JfbWFrZV9wYXRoKGRldiwgcGF0aCwgc2l6ZW9mKHBhdGgpKTsKKwlzbnByaW50ZihhY2VjYWQtPnBoeXMsIHNpemVvZihhY2VjYWQtPnBoeXMpLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisKKwlhY2VjYWQtPnVzYmRldiA9IGRldjsKKworCWFjZWNhZC0+ZGV2LmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKKwlhY2VjYWQtPmRldi5hYnNiaXRbMF0gPSBCSVQoQUJTX1gpIHwgQklUKEFCU19ZKSB8IEJJVChBQlNfUFJFU1NVUkUpOworCWFjZWNhZC0+ZGV2LmtleWJpdFtMT05HKEJUTl9MRUZUKV0gPSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7CisJYWNlY2FkLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSA9IEJJVChCVE5fVE9PTF9QRU4pIHxCSVQoQlROX1RPVUNIKSB8IEJJVChCVE5fU1RZTFVTKSB8IEJJVChCVE5fU1RZTFVTMik7CisKKwlzd2l0Y2ggKGlkLT5kcml2ZXJfaW5mbykgeworCQljYXNlIDA6CisJCQlhY2VjYWQtPmRldi5hYnNtYXhbQUJTX1hdID0gNTAwMDsKKwkJCWFjZWNhZC0+ZGV2LmFic21heFtBQlNfWV0gPSAzNzUwOworCQkJYWNlY2FkLT5kZXYuYWJzbWF4W0FCU19QUkVTU1VSRV0gPSA1MTI7CisJCQlpZiAoIXN0cmxlbihhY2VjYWQtPm5hbWUpKQorCQkJCXNucHJpbnRmKGFjZWNhZC0+bmFtZSwgc2l6ZW9mKGFjZWNhZC0+bmFtZSksCisJCQkJCSJVU0IgQWNlY2FkIEZsYWlyIFRhYmxldCAlMDR4OiUwNHgiLAorCQkJCQlkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsIGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWFjZWNhZC0+ZGV2LmFic21heFtBQlNfWF0gPSAzMDAwOworCQkJYWNlY2FkLT5kZXYuYWJzbWF4W0FCU19ZXSA9IDIyNTA7CisJCQlhY2VjYWQtPmRldi5hYnNtYXhbQUJTX1BSRVNTVVJFXSA9IDEwMjQ7CisJCQlpZiAoIXN0cmxlbihhY2VjYWQtPm5hbWUpKQorCQkJCXNucHJpbnRmKGFjZWNhZC0+bmFtZSwgc2l6ZW9mKGFjZWNhZC0+bmFtZSksCisJCQkJCSJVU0IgQWNlY2FkIDMwMiBUYWJsZXQgJTA0eDolMDR4IiwKKwkJCQkJZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yLCBkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwkJCWJyZWFrOworCX0KKworCWFjZWNhZC0+ZGV2LmFic2Z1enpbQUJTX1hdID0gNDsKKwlhY2VjYWQtPmRldi5hYnNmdXp6W0FCU19ZXSA9IDQ7CisKKwlhY2VjYWQtPmRldi5wcml2YXRlID0gYWNlY2FkOworCWFjZWNhZC0+ZGV2Lm9wZW4gPSB1c2JfYWNlY2FkX29wZW47CisJYWNlY2FkLT5kZXYuY2xvc2UgPSB1c2JfYWNlY2FkX2Nsb3NlOworCisJYWNlY2FkLT5kZXYubmFtZSA9IGFjZWNhZC0+bmFtZTsKKwlhY2VjYWQtPmRldi5waHlzID0gYWNlY2FkLT5waHlzOworCWFjZWNhZC0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfVVNCOworCWFjZWNhZC0+ZGV2LmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJYWNlY2FkLT5kZXYuaWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCWFjZWNhZC0+ZGV2LmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwlhY2VjYWQtPmRldi5kZXYgPSAmaW50Zi0+ZGV2OworCisJdXNiX2ZpbGxfaW50X3VyYihhY2VjYWQtPmlycSwgZGV2LCBwaXBlLAorCQkJYWNlY2FkLT5kYXRhLCBtYXhwID4gOCA/IDggOiBtYXhwLAorCQkJdXNiX2FjZWNhZF9pcnEsIGFjZWNhZCwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJYWNlY2FkLT5pcnEtPnRyYW5zZmVyX2RtYSA9IGFjZWNhZC0+ZGF0YV9kbWE7CisJYWNlY2FkLT5pcnEtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZhY2VjYWQtPmRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJpbnB1dDogJXMgd2l0aCBwYWNrZXQgc2l6ZSAlZCBvbiAlc1xuIiwKKwkJYWNlY2FkLT5uYW1lLCBtYXhwLCBwYXRoKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgYWNlY2FkKTsKKworCXJldHVybiAwOworCisgZmFpbDI6CXVzYl9idWZmZXJfZnJlZShkZXYsIDgsIGFjZWNhZC0+ZGF0YSwgYWNlY2FkLT5kYXRhX2RtYSk7CisgZmFpbDE6CWtmcmVlKGFjZWNhZCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHVzYl9hY2VjYWRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgdXNiX2FjZWNhZCAqYWNlY2FkID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJaWYgKGFjZWNhZCkgeworCQl1c2Jfa2lsbF91cmIoYWNlY2FkLT5pcnEpOworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmYWNlY2FkLT5kZXYpOworCQl1c2JfZnJlZV91cmIoYWNlY2FkLT5pcnEpOworCQl1c2JfYnVmZmVyX2ZyZWUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgMTAsIGFjZWNhZC0+ZGF0YSwgYWNlY2FkLT5kYXRhX2RtYSk7CisJCWtmcmVlKGFjZWNhZCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX2FjZWNhZF9pZF90YWJsZSBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfRkxBSVIpLCAuZHJpdmVyX2luZm8gPSAwIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEXzMwMiksCSAuZHJpdmVyX2luZm8gPSAxIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX2FjZWNhZF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JfYWNlY2FkX2RyaXZlciA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkidXNiX2FjZWNhZCIsCisJLnByb2JlID0JdXNiX2FjZWNhZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXVzYl9hY2VjYWRfZGlzY29ubmVjdCwKKwkuaWRfdGFibGUgPQl1c2JfYWNlY2FkX2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX2FjZWNhZF9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCA9IHVzYl9yZWdpc3RlcigmdXNiX2FjZWNhZF9kcml2ZXIpOworCWlmIChyZXN1bHQgPT0gMCkKKwkJaW5mbyhEUklWRVJfVkVSU0lPTiAiOiIgRFJJVkVSX0RFU0MpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1c2JfYWNlY2FkX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmdXNiX2FjZWNhZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh1c2JfYWNlY2FkX2luaXQpOworbW9kdWxlX2V4aXQodXNiX2FjZWNhZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2FpcHRlay5jIGIvZHJpdmVycy91c2IvaW5wdXQvYWlwdGVrLmMKaW5kZXggZTk5MWY3ZS4uNmJiMGYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYWlwdGVrLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYWlwdGVrLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogIE5hdGl2ZSBzdXBwb3J0IGZvciB0aGUgQWlwdGVrIEh5cGVyUGVuIFVTQiBUYWJsZXRzCiAgKiAgKDQwMDBVLzUwMDBVLzYwMDBVLzgwMDBVLzEyMDAwVSkKLSAqICAKKyAqCiAgKiAgQ29weXJpZ2h0IChjKSAyMDAxICAgICAgQ2hyaXMgQXRlbmFzaW8gICA8Y2hyaXNAY3J1ZC5uZXQ+CiAgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQnJ5YW4gVy4gSGVhZGxleSA8YndoZWFkbGV5QGVhcnRobGluay5uZXQ+CiAgKgpAQCAtMzEsNyArMzEsNyBAQAogICogICAgICAgICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHN5c2ZzIGludGVyZmFjZSwgZGVwcmVjYXRpbmcgdGhlCiAgKiAgICAgICAgICAgICBwcm9jZnMgaW50ZXJmYWNlIGZvciAyLjUueCBrZXJuZWwuIEFsc28gYWRkZWQgc3VwcG9ydCBmb3IKICAqICAgICAgICAgICAgIFdoZWVsIGNvbW1hbmQuIEJyeWFuIFcuIEhlYWRsZXkgSnVseS0xNS0yMDAzLgotICogICAgICB2MS4yIC0gUmV3b3JrZWQgaml0dGVyIHRpbWVyIGFzIGEga2VybmVsIHRocmVhZC4gCisgKiAgICAgIHYxLjIgLSBSZXdvcmtlZCBqaXR0ZXIgdGltZXIgYXMgYSBrZXJuZWwgdGhyZWFkLgogICogICAgICAgICAgICAgQnJ5YW4gVy4gSGVhZGxleSBOb3ZlbWJlci0yOC0yMDAzL0phbi0xMC0yMDA0LgogICogICAgICB2MS4zIC0gUmVwYWlyZWQgaXNzdWUgb2Yga2VybmVsIHRocmVhZCBnb2luZyBudXRzIG9uIHNpbmdsZS1wcm9jZXNzb3IKICAqICAgICAgICAgICAgIG1hY2hpbmVzLCBpbnRyb2R1Y2VkIHByb2dyYW1tYWJsZURlbGF5IGFzIGEgY29tbWFuZCBsaW5lCkBAIC00OSwxMCArNDksMTAgQEAKICAqIE5PVEU6CiAgKiAgICAgIFRoaXMga2VybmVsIGRyaXZlciBpcyBhdWdtZW50ZWQgYnkgdGhlICJBaXB0ZWsiIFhGcmVlODYgaW5wdXQKICAqICAgICAgZHJpdmVyIGZvciB5b3VyIFggc2VydmVyLCBhcyB3ZWxsIGFzIHRoZSBHYWlwdGVrIEdVSSBGcm9udC1lbmQKLSAqICAgICAgIlRhYmxldCBNYW5hZ2VyIi4gCi0gKiAgICAgIFRoZXNlIHRocmVlIHByb2R1Y3RzIGFyZSBoaWdobHkgaW50ZXJhY3RpdmUgd2l0aCBvbmUgYW5vdGhlciwgCisgKiAgICAgICJUYWJsZXQgTWFuYWdlciIuCisgKiAgICAgIFRoZXNlIHRocmVlIHByb2R1Y3RzIGFyZSBoaWdobHkgaW50ZXJhY3RpdmUgd2l0aCBvbmUgYW5vdGhlciwKICAqICAgICAgc28gdGhlcmVmb3JlIGl0J3MgZWFzaWVyIHRvIGRvY3VtZW50IHRoZW0gYWxsIGFzIG9uZSBzdWJzeXN0ZW0uCi0gKiAgICAgIFBsZWFzZSB2aXNpdCB0aGUgcHJvamVjdCdzICJob21lIHBhZ2UiLCBsb2NhdGVkIGF0LCAKKyAqICAgICAgUGxlYXNlIHZpc2l0IHRoZSBwcm9qZWN0J3MgImhvbWUgcGFnZSIsIGxvY2F0ZWQgYXQsCiAgKiAgICAgIGh0dHA6Ly9haXB0ZWt0YWJsZXQuc291cmNlZm9yZ2UubmV0LgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNTYsNyArMTU2LDcgQEAKICAqIENvbW1hbmQvRGF0YSAgICBEZXNjcmlwdGlvbiAgICAgUmV0dXJuIEJ5dGVzICAgIFJldHVybiBWYWx1ZQogICogMHgxMC8weDAwICAgICAgIFN3aXRjaFRvTW91c2UgICAgICAgMAogICogMHgxMC8weDAxICAgICAgIFN3aXRjaFRvVGFibGV0ICAgICAgMAotICogMHgxOC8weDA0ICAgICAgIFNldFJlc29sdXRpb24gICAgICAgMCAKKyAqIDB4MTgvMHgwNCAgICAgICBTZXRSZXNvbHV0aW9uICAgICAgIDAKICAqIDB4MTIvMHhGRiAgICAgICBBdXRvR2Fpbk9uICAgICAgICAgIDAKICAqIDB4MTcvMHgwMCAgICAgICBGaWx0ZXJPbiAgICAgICAgICAgIDAKICAqIDB4MDEvMHgwMCAgICAgICBHZXRYRXh0ZW5zaW9uICAgICAgIDIgICAgICAgICAgIE1heFgKQEAgLTI0Nyw3ICsyNDcsNyBAQAogI2RlZmluZSBBSVBURUtfRElBR05PU1RJQ19TRU5ESU5HX0FCU09MVVRFX0lOX1JFTEFUSVZFCTIKICNkZWZpbmUgQUlQVEVLX0RJQUdOT1NUSUNfVE9PTF9ESVNBTExPV0VECQkzCiAKLQkvKiBUaW1lIHRvIHdhaXQgKGluIG1zKSB0byBoZWxwIG1hc2sgaGFuZCBqaXR0ZXJpbmcgCisJLyogVGltZSB0byB3YWl0IChpbiBtcykgdG8gaGVscCBtYXNrIGhhbmQgaml0dGVyaW5nCiAJICogd2hlbiBwcmVzc2luZyB0aGUgc3R5bHVzIGJ1dHRvbnMuCiAJICovCiAjZGVmaW5lIEFJUFRFS19KSVRURVJfREVMQVlfREVGQVVMVAkJCTUwCkBAIC0zMjQsNyArMzI0LDYgQEAKIAlzdHJ1Y3QgYWlwdGVrX3NldHRpbmdzIGN1clNldHRpbmc7CS8qIHRhYmxldCdzIGN1cnJlbnQgcHJvZ3JhbW1hYmxlICovCiAJc3RydWN0IGFpcHRla19zZXR0aW5ncyBuZXdTZXR0aW5nOwkvKiAuLi4gYW5kIG5ldyBwYXJhbSBzZXR0aW5ncyAgICAqLwogCXVuc2lnbmVkIGludCBpZm51bTsJCQkvKiBpbnRlcmZhY2UgbnVtYmVyIGZvciBJTyAgICAgICAqLwotCWludCBvcGVuQ291bnQ7CQkJCS8qIG1vZHVsZSB1c2UgY291bnRlciAgICAgICAgICAgICovCiAJaW50IGRpYWdub3N0aWM7CQkJCS8qIHRhYmxldCBkaWFnbm9zdGljIGNvZGVzICAgICAgICovCiAJdW5zaWduZWQgbG9uZyBldmVudENvdW50OwkJLyogZXZlbnQgY291bnQgICAgICAgICAgICAgICAgICAgKi8KIAlpbnQgaW5EZWxheTsJCQkJLyogaml0dGVyOiBpbiBqaXR0ZXIgZGVsYXk/ICAgICAgKi8KQEAgLTc5MSw3ICs3OTAsNyBAQAogICogc3BlY2lmaWMgQWlwdGVrIG1vZGVsIG51bWJlcnMsIGJlY2F1c2UgdGhlcmUgaGFzIGJlZW4gb3ZlcmxhcHMsCiAgKiB1c2UsIGFuZCByZXVzZSBvZiBpZCdzIGluIGV4aXN0aW5nIG1vZGVscy4gQ2VydGFpbiBtb2RlbHMgaGF2ZQogICogYmVlbiBrbm93biB0byB1c2UgbW9yZSB0aGFuIG9uZSBJRCwgaW5kaWNhdGl2ZSBwZXJoYXBzIG9mCi0gKiBtYW51ZmFjdHVyaW5nIHJldmlzaW9ucy4gSW4gYW55IGV2ZW50LCB3ZSBjb25zaWRlciB0aGVzZSAKKyAqIG1hbnVmYWN0dXJpbmcgcmV2aXNpb25zLiBJbiBhbnkgZXZlbnQsIHdlIGNvbnNpZGVyIHRoZXNlCiAgKiBJRHMgdG8gbm90IGJlIG1vZGVsLXNwZWNpZmljIG5vciB1bmlxdWUuCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBhaXB0ZWtfaWRzW10gPSB7CkBAIC04MTQsMTUgKzgxMyw5IEBACiB7CiAJc3RydWN0IGFpcHRlayAqYWlwdGVrID0gaW5wdXRkZXYtPnByaXZhdGU7CiAKLQlpZiAoYWlwdGVrLT5vcGVuQ291bnQrKyA+IDApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJYWlwdGVrLT51cmItPmRldiA9IGFpcHRlay0+dXNiZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYihhaXB0ZWstPnVyYiwgR0ZQX0tFUk5FTCkgIT0gMCkgewotCQlhaXB0ZWstPm9wZW5Db3VudC0tOworCWlmICh1c2Jfc3VibWl0X3VyYihhaXB0ZWstPnVyYiwgR0ZQX0tFUk5FTCkgIT0gMCkKIAkJcmV0dXJuIC1FSU87Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC04MzQsMTMgKzgyNywxMSBAQAogewogCXN0cnVjdCBhaXB0ZWsgKmFpcHRlayA9IGlucHV0ZGV2LT5wcml2YXRlOwogCi0JaWYgKC0tYWlwdGVrLT5vcGVuQ291bnQgPT0gMCkgewotCQl1c2Jfa2lsbF91cmIoYWlwdGVrLT51cmIpOwotCX0KKwl1c2Jfa2lsbF91cmIoYWlwdGVrLT51cmIpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIGFpcHRla19zZXRfcmVwb3J0IGFuZCBhaXB0ZWtfZ2V0X3JlcG9ydCgpIGFyZSBib3Jyb3dlZCBmcm9tIExpbnV4IDIuNC54LCAKKyAqIGFpcHRla19zZXRfcmVwb3J0IGFuZCBhaXB0ZWtfZ2V0X3JlcG9ydCgpIGFyZSBib3Jyb3dlZCBmcm9tIExpbnV4IDIuNC54LAogICogd2hlcmUgdGhleSB3ZXJlIGtub3duIGFzIHVzYl9zZXRfcmVwb3J0IGFuZCB1c2JfZ2V0X3JlcG9ydC4KICAqLwogc3RhdGljIGludApAQCAtMjI1Miw3ICsyMjQzLDYgQEAKIAkJCQlBSVBURUtfUEFDS0VUX0xFTkdUSCwKIAkJCQlhaXB0ZWstPmRhdGEsIGFpcHRlay0+ZGF0YV9kbWEpOwogCQlrZnJlZShhaXB0ZWspOwotCQlhaXB0ZWsgPSBOVUxMOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jCmluZGV4IDg2MGRmMjYuLjY1NGFjNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlLmMKQEAgLTEsMTUgKzEsMTUgQEAKLS8qIAorLyoKICAqICBVU0IgQVRJIFJlbW90ZSBzdXBwb3J0CiAgKgogICogIFZlcnNpb24gMi4yLjAgQ29weXJpZ2h0IChjKSAyMDA0IFRvcnJleSBIb2ZmbWFuIDx0aG9mZm1hbkBhcm5vci5uZXQ+CiAgKiAgVmVyc2lvbiAyLjEuMSBDb3B5cmlnaHQgKGMpIDIwMDIgVmxhZGltaXIgRGVyZ2FjaGV2CiAgKgogICogIFRoaXMgMi4yLjAgdmVyc2lvbiBpcyBhIHJld3JpdGUgLyBjbGVhbnVwIG9mIHRoZSAyLjEuMSBkcml2ZXIsIGluY2x1ZGluZwotICogIHBvcnRpbmcgdG8gdGhlIDIuNiBrZXJuZWwgaW50ZXJmYWNlcywgYWxvbmcgd2l0aCBvdGhlciBtb2RpZmljYXRpb24gCisgKiAgcG9ydGluZyB0byB0aGUgMi42IGtlcm5lbCBpbnRlcmZhY2VzLCBhbG9uZyB3aXRoIG90aGVyIG1vZGlmaWNhdGlvbgogICogIHRvIGJldHRlciBtYXRjaCB0aGUgc3R5bGUgb2YgdGhlIGV4aXN0aW5nIHVzYi9pbnB1dCBkcml2ZXJzLiAgSG93ZXZlciwgdGhlCiAgKiAgcHJvdG9jb2wgYW5kIGhhcmR3YXJlIGhhbmRsaW5nIGlzIGVzc2VudGlhbGx5IHVuY2hhbmdlZCBmcm9tIDIuMS4xLgotICogIAotICogIFRoZSAyLjEuMSBkcml2ZXIgd2FzIGRlcml2ZWQgZnJvbSB0aGUgdXNiYXRpX3JlbW90ZSBhbmQgdXNia2JkIGRyaXZlcnMgYnkgCisgKgorICogIFRoZSAyLjEuMSBkcml2ZXIgd2FzIGRlcml2ZWQgZnJvbSB0aGUgdXNiYXRpX3JlbW90ZSBhbmQgdXNia2JkIGRyaXZlcnMgYnkKICAqICBWb2p0ZWNoIFBhdmxpay4KICAqCiAgKiAgQ2hhbmdlczoKQEAgLTIzLDY0ICsyMyw2NCBAQAogICogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgIkxvbGEiIHJlbW90ZSBjb250cmlidXRlZCBieToKICAqICAgICAgICAgICAgICAgIFNldGggQ29obiA8c2V0aGNvaG5AeWFob28uY29tPgogICoKLSAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogCisgKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAotICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAKKyAqCisgKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqCiAgKgogICogSGFyZHdhcmUgJiBzb2Z0d2FyZSBub3RlcwogICoKLSAqIFRoZXNlIHJlbW90ZSBjb250cm9scyBhcmUgZGlzdHJpYnV0ZWQgYnkgQVRJIGFzIHBhcnQgb2YgdGhlaXIgCi0gKiAiQWxsLUluLVdvbmRlciIgdmlkZW8gY2FyZCBwYWNrYWdlcy4gIFRoZSByZWNlaXZlciBzZWxmLWlkZW50aWZpZXMgYXMgYSAKKyAqIFRoZXNlIHJlbW90ZSBjb250cm9scyBhcmUgZGlzdHJpYnV0ZWQgYnkgQVRJIGFzIHBhcnQgb2YgdGhlaXIKKyAqICJBbGwtSW4tV29uZGVyIiB2aWRlbyBjYXJkIHBhY2thZ2VzLiAgVGhlIHJlY2VpdmVyIHNlbGYtaWRlbnRpZmllcyBhcyBhCiAgKiAiVVNCIFJlY2VpdmVyIiB3aXRoIG1hbnVmYWN0dXJlciAiWDEwIFdpcmVsZXNzIFRlY2hub2xvZ3kgSW5jIi4KICAqCi0gKiBUaGUgIkxvbGEiIHJlbW90ZSBpcyBhdmFpbGFibGUgZnJvbSBYMTAuICBTZWU6IAorICogVGhlICJMb2xhIiByZW1vdGUgaXMgYXZhaWxhYmxlIGZyb20gWDEwLiAgU2VlOgogICogICAgaHR0cDovL3d3dy54MTAuY29tL3Byb2R1Y3RzL2xvbGFfc2cxLmh0bQogICogVGhlIExvbGEgaXMgc2ltaWxhciB0byB0aGUgQVRJIHJlbW90ZSBidXQgaGFzIG5vIG1vdXNlIHN1cHBvcnQsIGFuZCBzbGlnaHRseQogICogZGlmZmVyZW50IGtleXMuCiAgKgotICogSXQgaXMgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHJlY2VpdmVycyBhbmQgcmVtb3RlcyBvbiBtdWx0aXBsZSBjb21wdXRlcnMgCisgKiBJdCBpcyBwb3NzaWJsZSB0byB1c2UgbXVsdGlwbGUgcmVjZWl2ZXJzIGFuZCByZW1vdGVzIG9uIG11bHRpcGxlIGNvbXB1dGVycwogICogc2ltdWx0YW5lb3VzbHkgYnkgY29uZmlndXJpbmcgdGhlbSB0byB1c2Ugc3BlY2lmaWMgY2hhbm5lbHMuCi0gKiAKLSAqIFRoZSBSRiBwcm90b2NvbCB1c2VkIGJ5IHRoZSByZW1vdGUgc3VwcG9ydHMgMTYgZGlzdGluY3QgY2hhbm5lbHMsIDEgdG8gMTYuICAKLSAqIEFjdHVhbGx5LCBpdCBtYXkgZXZlbiBzdXBwb3J0IG1vcmUsIGF0IGxlYXN0IGluIHNvbWUgcmV2aXNpb25zIG9mIHRoZSAKKyAqCisgKiBUaGUgUkYgcHJvdG9jb2wgdXNlZCBieSB0aGUgcmVtb3RlIHN1cHBvcnRzIDE2IGRpc3RpbmN0IGNoYW5uZWxzLCAxIHRvIDE2LgorICogQWN0dWFsbHksIGl0IG1heSBldmVuIHN1cHBvcnQgbW9yZSwgYXQgbGVhc3QgaW4gc29tZSByZXZpc2lvbnMgb2YgdGhlCiAgKiBoYXJkd2FyZS4KICAqCiAgKiBFYWNoIHJlbW90ZSBjYW4gYmUgY29uZmlndXJlZCB0byB0cmFuc21pdCBvbiBvbmUgY2hhbm5lbCBhcyBmb2xsb3dzOgotICogICAtIFByZXNzIGFuZCBob2xkIHRoZSAiaGFuZCBpY29uIiBidXR0b24uICAKLSAqICAgLSBXaGVuIHRoZSByZWQgTEVEIHN0YXJ0cyB0byBibGluaywgbGV0IGdvIG9mIHRoZSAiaGFuZCBpY29uIiBidXR0b24uIAotICogICAtIFdoZW4gaXQgc3RvcHMgYmxpbmtpbmcsIGlucHV0IHRoZSBjaGFubmVsIGNvZGUgYXMgdHdvIGRpZ2l0cywgZnJvbSAwMSAKKyAqICAgLSBQcmVzcyBhbmQgaG9sZCB0aGUgImhhbmQgaWNvbiIgYnV0dG9uLgorICogICAtIFdoZW4gdGhlIHJlZCBMRUQgc3RhcnRzIHRvIGJsaW5rLCBsZXQgZ28gb2YgdGhlICJoYW5kIGljb24iIGJ1dHRvbi4KKyAqICAgLSBXaGVuIGl0IHN0b3BzIGJsaW5raW5nLCBpbnB1dCB0aGUgY2hhbm5lbCBjb2RlIGFzIHR3byBkaWdpdHMsIGZyb20gMDEKICAqICAgICB0byAxNiwgYW5kIHByZXNzIHRoZSBoYW5kIGljb24gYWdhaW4uCi0gKiAKKyAqCiAgKiBUaGUgdGltaW5nIGNhbiBiZSBhIGxpdHRsZSB0cmlja3kuICBUcnkgbG9hZGluZyB0aGUgbW9kdWxlIHdpdGggZGVidWc9MQogICogdG8gaGF2ZSB0aGUga2VybmVsIHByaW50IG91dCBtZXNzYWdlcyBhYm91dCB0aGUgcmVtb3RlIGNvbnRyb2wgbnVtYmVyCiAgKiBhbmQgbWFzay4gIE5vdGU6IGRlYnVnZ2luZyBwcmludHMgcmVtb3RlIG51bWJlcnMgYXMgemVyby1iYXNlZCBoZXhhZGVjaW1hbC4KICAqCiAgKiBUaGUgZHJpdmVyIGhhcyBhICJjaGFubmVsX21hc2siIHBhcmFtZXRlci4gVGhpcyBiaXRtYXNrIHNwZWNpZmllcyB3aGljaAotICogY2hhbm5lbHMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtb2R1bGUuICBUbyBtYXNrIG91dCBjaGFubmVscywganVzdCBhZGQgCisgKiBjaGFubmVscyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1vZHVsZS4gIFRvIG1hc2sgb3V0IGNoYW5uZWxzLCBqdXN0IGFkZAogICogYWxsIHRoZSAyXmNoYW5uZWxfbnVtYmVyIHZhbHVlcyB0b2dldGhlci4KICAqCiAgKiBGb3IgaW5zdGFuY2UsIHNldCBjaGFubmVsX21hc2sgPSAyXjQgPSAxNiAoYmluYXJ5IDEwMDAwKSB0byBtYWtlIGF0aV9yZW1vdGUKLSAqIGlnbm9yZSBzaWduYWxzIGNvbWluZyBmcm9tIHJlbW90ZSBjb250cm9scyB0cmFuc21pdHRpbmcgb24gY2hhbm5lbCA0LCBidXQgCisgKiBpZ25vcmUgc2lnbmFscyBjb21pbmcgZnJvbSByZW1vdGUgY29udHJvbHMgdHJhbnNtaXR0aW5nIG9uIGNoYW5uZWwgNCwgYnV0CiAgKiBhY2NlcHQgYWxsIG90aGVyIGNoYW5uZWxzLgogICoKLSAqIE9yLCBzZXQgY2hhbm5lbF9tYXNrID0gNjU1MzMsICgweEZGRkQpLCBhbmQgYWxsIGNoYW5uZWxzIGV4Y2VwdCAxIHdpbGwgYmUgCisgKiBPciwgc2V0IGNoYW5uZWxfbWFzayA9IDY1NTMzLCAoMHhGRkZEKSwgYW5kIGFsbCBjaGFubmVscyBleGNlcHQgMSB3aWxsIGJlCiAgKiBpZ25vcmVkLgogICoKLSAqIFRoZSBkZWZhdWx0IGlzIDAgKHJlc3BvbmQgdG8gYWxsIGNoYW5uZWxzKS4gQml0IDAgYW5kIGJpdHMgMTctMzIgb2YgdGhpcyAKKyAqIFRoZSBkZWZhdWx0IGlzIDAgKHJlc3BvbmQgdG8gYWxsIGNoYW5uZWxzKS4gQml0IDAgYW5kIGJpdHMgMTctMzIgb2YgdGhpcwogICogcGFyYW1ldGVyIGFyZSB1bnVzZWQuCiAgKgogICovCkBAIC05OSwxMyArOTksMTMgQEAKIC8qCiAgKiBNb2R1bGUgYW5kIFZlcnNpb24gSW5mb3JtYXRpb24sIE1vZHVsZSBQYXJhbWV0ZXJzCiAgKi8KLSAKLSNkZWZpbmUgQVRJX1JFTU9URV9WRU5ET1JfSUQgCTB4MGJjNwotI2RlZmluZSBBVElfUkVNT1RFX1BST0RVQ1RfSUQgCTB4MDA0Ci0jZGVmaW5lIExPTEFfUkVNT1RFX1BST0RVQ1RfSUQgCTB4MDAyCisKKyNkZWZpbmUgQVRJX1JFTU9URV9WRU5ET1JfSUQJMHgwYmM3CisjZGVmaW5lIEFUSV9SRU1PVEVfUFJPRFVDVF9JRAkweDAwNAorI2RlZmluZSBMT0xBX1JFTU9URV9QUk9EVUNUX0lECTB4MDAyCiAjZGVmaW5lIE1FRElPTl9SRU1PVEVfUFJPRFVDVF9JRCAweDAwNgogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OIAkgICAgICAgICIyLjIuMSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JICAgICAgICAiMi4yLjEiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgICAgICAgICAgICJUb3JyZXkgSG9mZm1hbiA8dGhvZmZtYW5AYXJub3IubmV0PiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICAgICAgICAgIkFUSS9YMTAgUkYgVVNCIFJlbW90ZSBDb250cm9sIgogCkBAIC0xMTMsMTggKzExMywxOCBAQAogI2RlZmluZSBEQVRBX0JVRlNJWkUgICAgICA2MyAgICAvKiBzaXplIG9mIFVSQiBkYXRhIGJ1ZmZlcnMgKi8KICNkZWZpbmUgQVRJX0lOUFVUTlVNICAgICAgMSAgICAgLyogV2hpY2ggaW5wdXQgZGV2aWNlIHRvIHJlZ2lzdGVyIGFzICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoYW5uZWxfbWFzayA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjaGFubmVsX21hc2s7CiBtb2R1bGVfcGFyYW0oY2hhbm5lbF9tYXNrLCB1bG9uZywgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWxfbWFzaywgIkJpdG1hc2sgb2YgcmVtb3RlIGNvbnRyb2wgY2hhbm5lbHMgdG8gaWdub3JlIik7CiAKLXN0YXRpYyBpbnQgZGVidWcgPSAwOworc3RhdGljIGludCBkZWJ1ZzsKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZXh0cmEgZGVidWcgbWVzc2FnZXMgYW5kIGluZm9ybWF0aW9uIik7CiAKICNkZWZpbmUgZGJnaW5mbyhkZXYsIGZvcm1hdCwgYXJnLi4uKSBkbyB7IGlmIChkZWJ1ZykgZGV2X2luZm8oZGV2ICwgZm9ybWF0ICwgIyMgYXJnKTsgfSB3aGlsZSAoMCkKICN1bmRlZiBlcnIKICNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9FUlIgZm9ybWF0ICwgIyMgYXJnKQotIAorCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgYXRpX3JlbW90ZV90YWJsZVtdID0gewogCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgQVRJX1JFTU9URV9QUk9EVUNUX0lEKSB9LAogCXsgVVNCX0RFVklDRShBVElfUkVNT1RFX1ZFTkRPUl9JRCwgTE9MQV9SRU1PVEVfUFJPRFVDVF9JRCkgfSwKQEAgLTE0OCw3ICsxNDgsNyBAQAogLyogQWNjZWxlcmF0aW9uIGN1cnZlIGZvciBkaXJlY3Rpb25hbCBjb250cm9sIHBhZCAqLwogc3RhdGljIGNoYXIgYWNjZWxbXSA9IHsgMSwgMiwgNCwgNiwgOSwgMTMsIDIwIH07CiAKLS8qIER1cGxpY2F0ZSBldmVudCBmaWx0ZXJpbmcgdGltZS4gCisvKiBEdXBsaWNhdGUgZXZlbnQgZmlsdGVyaW5nIHRpbWUuCiAgKiBTZXF1ZW50aWFsLCBpZGVudGljYWwgS0lORF9GSUxURVJFRCBpbnB1dHMgd2l0aCBsZXNzIHRoYW4KICAqIEZJTFRFUl9USU1FIGppZmZpZXMgYmV0d2VlbiB0aGVtIGFyZSBjb25zaWRlcmVkIGFzIHJlcGVhdAogICogZXZlbnRzLiBUaGUgaGFyZHdhcmUgZ2VuZXJhdGVzIDUgZXZlbnRzIGZvciB0aGUgZmlyc3Qga2V5cHJlc3MKQEAgLTE2MSwxMCArMTYxLDEwIEBACiBzdGF0aWMgREVDTEFSRV9NVVRFWChkaXNjb25uZWN0X3NlbSk7CiAKIHN0cnVjdCBhdGlfcmVtb3RlIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2IGlkZXY7CQkKKwlzdHJ1Y3QgaW5wdXRfZGV2IGlkZXY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKLQkJCisKIAlzdHJ1Y3QgdXJiICppcnFfdXJiOwogCXN0cnVjdCB1cmIgKm91dF91cmI7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludF9pbjsKQEAgLTE3NCwxMyArMTc0LDExIEBACiAJZG1hX2FkZHJfdCBpbmJ1Zl9kbWE7CiAJZG1hX2FkZHJfdCBvdXRidWZfZG1hOwogCi0JaW50IG9wZW47ICAgICAgICAgICAgICAgICAgIC8qIG9wZW4gY291bnRlciAqLwotCQogCXVuc2lnbmVkIGNoYXIgb2xkX2RhdGFbMl07ICAvKiBEZXRlY3QgZHVwbGljYXRlIGV2ZW50cyAqLwogCXVuc2lnbmVkIGxvbmcgb2xkX2ppZmZpZXM7CiAJdW5zaWduZWQgbG9uZyBhY2NfamlmZmllczsgIC8qIGhhbmRsZSBhY2NlbGVyYXRpb24gKi8KIAl1bnNpZ25lZCBpbnQgcmVwZWF0X2NvdW50OwotCQorCiAJY2hhciBuYW1lW05BTUVfQlVGU0laRV07CiAJY2hhciBwaHlzW05BTUVfQlVGU0laRV07CiAKQEAgLTIwNiwxNCArMjA0LDE0IEBACiAJaW50IHR5cGU7CiAJdW5zaWduZWQgaW50IGNvZGU7CiAJaW50IHZhbHVlOwotfSAgYXRpX3JlbW90ZV90YmxbXSA9IAorfSAgYXRpX3JlbW90ZV90YmxbXSA9CiB7CiAJLyogRGlyZWN0aW9uYWwgY29udHJvbCBwYWQgYXhlcyAqLwogCXtLSU5EX0FDQ0VMLCAgIDB4MzUsIDB4NzAsIEVWX1JFTCwgUkVMX1gsIC0xfSwJIC8qIGxlZnQgKi8KIAl7S0lORF9BQ0NFTCwgICAweDM2LCAweDcxLCBFVl9SRUwsIFJFTF9YLCAxfSwgICAgLyogcmlnaHQgKi8KIAl7S0lORF9BQ0NFTCwgICAweDM3LCAweDcyLCBFVl9SRUwsIFJFTF9ZLCAtMX0sCSAvKiB1cCAqLwogCXtLSU5EX0FDQ0VMLCAgIDB4MzgsIDB4NzMsIEVWX1JFTCwgUkVMX1ksIDF9LCAgICAvKiBkb3duICovCi0JLyogRGlyZWN0aW9uYWwgY29udHJvbCBwYWQgZGlhZ29uYWxzICovCQorCS8qIERpcmVjdGlvbmFsIGNvbnRyb2wgcGFkIGRpYWdvbmFscyAqLwogCXtLSU5EX0xVLCAgICAgIDB4MzksIDB4NzQsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IHVwICovCiAJe0tJTkRfUlUsICAgICAgMHgzYSwgMHg3NSwgRVZfUkVMLCAwLCAwfSwgICAgICAgIC8qIHJpZ2h0IHVwICovCiAJe0tJTkRfTEQsICAgICAgMHgzYywgMHg3NywgRVZfUkVMLCAwLCAwfSwgICAgICAgIC8qIGxlZnQgZG93biAqLwpAQCAtMjI1LDcgKzIyMyw3IEBACiAJe0tJTkRfTElURVJBTCwgMHg0MSwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCiAJe0tJTkRfTElURVJBTCwgMHg0MiwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLwogCi0JLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4gCisJLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KIAkgKiBUaGV5IGFyZSBtYXBwZWQgdG8gdGhlICJzaWRlIiBhbmQgImV4dHJhIiBtb3VzZSBidXR0b25zIGhlcmUuICovCiAJe0tJTkRfRklMVEVSRUQsIDB4M2YsIDB4N2EsIEVWX0tFWSwgQlROX1NJREUsIDF9LCAvKiBsZWZ0IGRibGNsaWNrICovCiAJe0tJTkRfRklMVEVSRUQsIDB4NDMsIDB4N2UsIEVWX0tFWSwgQlROX0VYVFJBLCAxfSwvKiByaWdodCBkYmxjbGljayAqLwpAQCAtMjczLDE1ICsyNzEsMTUgQEAKIAl7S0lORF9GSUxURVJFRCwgMHhlYSwgMHgyNSwgRVZfS0VZLCBLRVlfUExBWSwgMX0sICAgICAgIC8qICggPikgKi8KIAl7S0lORF9GSUxURVJFRCwgMHhlOSwgMHgyNCwgRVZfS0VZLCBLRVlfUkVXSU5ELCAxfSwgICAgIC8qICg8PCkgKi8KIAl7S0lORF9GSUxURVJFRCwgMHhlYiwgMHgyNiwgRVZfS0VZLCBLRVlfRk9SV0FSRCwgMX0sICAgIC8qICg+PikgKi8KLQl7S0lORF9GSUxURVJFRCwgMHhlZCwgMHgyOCwgRVZfS0VZLCBLRVlfU1RPUCwgMX0sICAgICAgIC8qIChbXSkgKi8gCisJe0tJTkRfRklMVEVSRUQsIDB4ZWQsIDB4MjgsIEVWX0tFWSwgS0VZX1NUT1AsIDF9LCAgICAgICAvKiAoW10pICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZWUsIDB4MjksIEVWX0tFWSwgS0VZX1BBVVNFLCAxfSwgICAgICAvKiAoJycpICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZjAsIDB4MmIsIEVWX0tFWSwgS0VZX1BSRVZJT1VTLCAxfSwgICAvKiAoPC0pICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZWYsIDB4MmEsIEVWX0tFWSwgS0VZX05FWFQsIDF9LCAgICAgICAvKiAoPispICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZjIsIDB4MkQsIEVWX0tFWSwgS0VZX0lORk8sIDF9LCAgICAgICAvKiBQTEFZSU5HICovCiAJe0tJTkRfRklMVEVSRUQsIDB4ZjMsIDB4MkUsIEVWX0tFWSwgS0VZX0hPTUUsIDF9LCAgICAgICAvKiBUT1AgKi8KIAl7S0lORF9GSUxURVJFRCwgMHhmNCwgMHgyRiwgRVZfS0VZLCBLRVlfRU5ELCAxfSwgICAgICAgIC8qIEVORCAqLwotCXtLSU5EX0ZJTFRFUkVELCAweGY1LCAweDMwLCBFVl9LRVksIEtFWV9TRUxFQ1QsIDF9LCAgICAgLyogU0VMRUNUICovCQotCQorCXtLSU5EX0ZJTFRFUkVELCAweGY1LCAweDMwLCBFVl9LRVksIEtFWV9TRUxFQ1QsIDF9LCAgICAgLyogU0VMRUNUICovCisKIAl7S0lORF9FTkQsIDB4MDAsIDB4MDAsIEVWX01BWCArIDEsIDAsIDB9CiB9OwogCkBAIC0zMTUsNyArMzEzLDcgQEAKIAlpZiAoKGxlbiA9PSAxKSAmJiAoZGF0YVswXSAhPSAodW5zaWduZWQgY2hhcikweGZmKSAmJiAoZGF0YVswXSAhPSAweDAwKSkKIAkJd2FybigiV2VpcmQgYnl0ZSAweCUwMngiLCBkYXRhWzBdKTsKIAllbHNlIGlmIChsZW4gPT0gNCkKLQkJd2FybigiV2VpcmQga2V5ICUwMnggJTAyeCAlMDJ4ICUwMngiLCAKKwkJd2FybigiV2VpcmQga2V5ICUwMnggJTAyeCAlMDJ4ICUwMngiLAogCQkgICAgIGRhdGFbMF0sIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10pOwogCWVsc2UKIAkJd2FybigiV2VpcmQgZGF0YSwgbGVuPSVkICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4IC4uLiIsCkBAIC0zMjgsMjUgKzMyNiwxNiBAQAogc3RhdGljIGludCBhdGlfcmVtb3RlX29wZW4oc3RydWN0IGlucHV0X2RldiAqaW5wdXRkZXYpCiB7CiAJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSBpbnB1dGRldi0+cHJpdmF0ZTsKLQlpbnQgcmV0dmFsID0gMDsKLQotCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKLQotCWlmIChhdGlfcmVtb3RlLT5vcGVuKyspCi0JCWdvdG8gZXhpdDsKIAogCS8qIE9uIGZpcnN0IG9wZW4sIHN1Ym1pdCB0aGUgcmVhZCB1cmIgd2hpY2ggd2FzIHNldCB1cCBwcmV2aW91c2x5LiAqLwogCWF0aV9yZW1vdGUtPmlycV91cmItPmRldiA9IGF0aV9yZW1vdGUtPnVkZXY7CiAJaWYgKHVzYl9zdWJtaXRfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIsIEdGUF9LRVJORUwpKSB7Ci0JCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAKKwkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCiAJCQkiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWF0aV9yZW1vdGUtPm9wZW4tLTsKLQkJcmV0dmFsID0gLUVJTzsKKwkJcmV0dXJuIC1FSU87CiAJfQogCi1leGl0OgotCXVwKCZkaXNjb25uZWN0X3NlbSk7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTM1NSw5ICszNDQsOCBAQAogc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dGRldikKIHsKIAlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IGlucHV0ZGV2LT5wcml2YXRlOwotCQotCWlmICghLS1hdGlfcmVtb3RlLT5vcGVuKQotCQl1c2Jfa2lsbF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYik7CisKKwl1c2Jfa2lsbF91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYik7CiB9CiAKIC8qCkBAIC0zNjYsMTMgKzM1NCwxMyBAQAogc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pcnFfb3V0KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUgPSB1cmItPmNvbnRleHQ7Ci0JCisKIAlpZiAodXJiLT5zdGF0dXMpIHsKIAkJZGV2X2RiZygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICIlczogc3RhdHVzICVkXG4iLAogCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKIAl9Ci0JCisKIAlhdGlfcmVtb3RlLT5zZW5kX2ZsYWdzIHw9IFNFTkRfRkxBR19DT01QTEVURTsKIAl3bWIoKTsKIAl3YWtlX3VwKCZhdGlfcmVtb3RlLT53YWl0KTsKQEAgLTM4MCwxNiArMzY4LDE2IEBACiAKIC8qCiAgKglhdGlfcmVtb3RlX3NlbmRwYWNrZXQKLSAqCQkKKyAqCiAgKglVc2VkIHRvIHNlbmQgZGV2aWNlIGluaXRpYWxpemF0aW9uIHN0cmluZ3MKICAqLwogc3RhdGljIGludCBhdGlfcmVtb3RlX3NlbmRwYWNrZXQoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUsIHUxNiBjbWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7CiAJaW50IHJldHZhbCA9IDA7Ci0JCisKIAkvKiBTZXQgdXAgb3V0X3VyYiAqLwogCW1lbWNweShhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIgKyAxLCBkYXRhLCBMTyhjbWQpKTsKLQkoKGNoYXIgKikgYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKVswXSA9IEhJKGNtZCk7CQorCSgoY2hhciAqKSBhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXIpWzBdID0gSEkoY21kKTsKIAogCWF0aV9yZW1vdGUtPm91dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBMTyhjbWQpICsgMTsKIAlhdGlfcmVtb3RlLT5vdXRfdXJiLT5kZXYgPSBhdGlfcmVtb3RlLT51ZGV2OwpAQCAtMzk3LDE3ICszODUsMTcgQEAKIAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpIHsKLQkJZGV2X2RiZygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsIAorCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwKIAkJCSAic2VuZHBhY2tldDogdXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwgcmV0dmFsKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKIAl3YWl0X2V2ZW50X3RpbWVvdXQoYXRpX3JlbW90ZS0+d2FpdCwKIAkJKChhdGlfcmVtb3RlLT5vdXRfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKSB8fAotCQkgCShhdGlfcmVtb3RlLT5zZW5kX2ZsYWdzICYgU0VORF9GTEFHX0NPTVBMRVRFKSksCisJCQkoYXRpX3JlbW90ZS0+c2VuZF9mbGFncyAmIFNFTkRfRkxBR19DT01QTEVURSkpLAogCQlIWik7CiAJdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOwotCQorCiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNDE5LDE1ICs0MDcsMTUgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGF0aV9yZW1vdGVfdGJsW2ldLmtpbmQgIT0gS0lORF9FTkQ7IGkrKykgewotCQkvKiAKLQkJICogRGVjaWRlIGlmIHRoZSB0YWJsZSBlbnRyeSBtYXRjaGVzIHRoZSByZW1vdGUgaW5wdXQuIAorCQkvKgorCQkgKiBEZWNpZGUgaWYgdGhlIHRhYmxlIGVudHJ5IG1hdGNoZXMgdGhlIHJlbW90ZSBpbnB1dC4KIAkJICovCiAJCWlmICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSAmIDB4MGYpID09IChkMSAmIDB4MGYpKSkgJiYKLQkJICAgICgoKChhdGlfcmVtb3RlX3RibFtpXS5kYXRhMSA+PiA0KSAtIAotCQkgICAgICAgKGQxID4+IDQpICsgcmVtKSAmIDB4MGYpID09IDB4MGYpICYmIAorCQkgICAgKCgoKGF0aV9yZW1vdGVfdGJsW2ldLmRhdGExID4+IDQpIC0KKwkJICAgICAgIChkMSA+PiA0KSArIHJlbSkgJiAweDBmKSA9PSAweDBmKSAmJgogCQkgICAgKGF0aV9yZW1vdGVfdGJsW2ldLmRhdGEyID09IGQyKSkKIAkJCXJldHVybiBpOwotCQkKKwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC00MzUsMTYgKzQyMywxNiBAQAogLyoKICAqCWF0aV9yZW1vdGVfcmVwb3J0X2lucHV0CiAgKi8KLXN0YXRpYyB2b2lkIGF0aV9yZW1vdGVfaW5wdXRfcmVwb3J0KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCQorc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9pbnB1dF9yZXBvcnQoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZSA9IHVyYi0+Y29udGV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhPSBhdGlfcmVtb3RlLT5pbmJ1ZjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSAmYXRpX3JlbW90ZS0+aWRldjsgCisJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gJmF0aV9yZW1vdGUtPmlkZXY7CiAJaW50IGluZGV4LCBhY2M7CiAJaW50IHJlbW90ZV9udW07Ci0JCisKIAkvKiBEZWFsIHdpdGggc3RyYW5nZSBsb29raW5nIGlucHV0cyAqLwotCWlmICggKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA0KSB8fCAoZGF0YVswXSAhPSAweDE0KSB8fCAKKwlpZiAoICh1cmItPmFjdHVhbF9sZW5ndGggIT0gNCkgfHwgKGRhdGFbMF0gIT0gMHgxNCkgfHwKIAkJKChkYXRhWzNdICYgMHgwZikgIT0gMHgwMCkgKSB7CiAJCWF0aV9yZW1vdGVfZHVtcChkYXRhLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCQlyZXR1cm47CkBAIC00NTMsNyArNDQxLDcgQEAKIAkvKiBNYXNrIHVud2FudGVkIHJlbW90ZSBjaGFubmVscy4gICovCiAJLyogbm90ZTogcmVtb3RlX251bSBpcyAwLWJhc2VkLCBjaGFubmVsIDEgb24gcmVtb3RlID09IDAgaGVyZSAqLwogCXJlbW90ZV9udW0gPSAoZGF0YVszXSA+PiA0KSAmIDB4MGY7Ci0gICAgICAgIGlmIChjaGFubmVsX21hc2sgJiAoMSA8PCAocmVtb3RlX251bSArIDEpKSkgeyAKKyAgICAgICAgaWYgKGNoYW5uZWxfbWFzayAmICgxIDw8IChyZW1vdGVfbnVtICsgMSkpKSB7CiAJCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAogCQkJIk1hc2tlZCBpbnB1dCBmcm9tIGNoYW5uZWwgMHglMDJ4OiBkYXRhICUwMngsJTAyeCwgbWFzaz0gMHglMDJseFxuIiwKIAkJCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIGNoYW5uZWxfbWFzayk7CkBAIC00NjMsMzcgKzQ1MSwzNiBAQAogCS8qIExvb2sgdXAgZXZlbnQgY29kZSBpbmRleCBpbiB0cmFuc2xhdGlvbiB0YWJsZSAqLwogCWluZGV4ID0gYXRpX3JlbW90ZV9ldmVudF9sb29rdXAocmVtb3RlX251bSwgZGF0YVsxXSwgZGF0YVsyXSk7CiAJaWYgKGluZGV4IDwgMCkgewotCQlkZXZfd2FybigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsIAotCQkJICJVbmtub3duIGlucHV0IGZyb20gY2hhbm5lbCAweCUwMng6IGRhdGEgJTAyeCwlMDJ4XG4iLCAKKwkJZGV2X3dhcm4oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAorCQkJICJVbmtub3duIGlucHV0IGZyb20gY2hhbm5lbCAweCUwMng6IGRhdGEgJTAyeCwlMDJ4XG4iLAogCQkJIHJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0pOwogCQlyZXR1cm47Ci0JfSAKLQlkYmdpbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgCisJfQorCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAogCQkiY2hhbm5lbCAweCUwMng7IGRhdGEgJTAyeCwlMDJ4OyBpbmRleCAlZDsga2V5Y29kZSAlZFxuIiwKIAkJcmVtb3RlX251bSwgZGF0YVsxXSwgZGF0YVsyXSwgaW5kZXgsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS5jb2RlKTsKLQkKKwogCWlmIChhdGlfcmVtb3RlX3RibFtpbmRleF0ua2luZCA9PSBLSU5EX0xJVEVSQUwpIHsKIAkJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwogCQlpbnB1dF9ldmVudChkZXYsIGF0aV9yZW1vdGVfdGJsW2luZGV4XS50eXBlLAogCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUsCiAJCQlhdGlfcmVtb3RlX3RibFtpbmRleF0udmFsdWUpOwogCQlpbnB1dF9zeW5jKGRldik7Ci0JCQorCiAJCWF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzID0gamlmZmllczsKIAkJcmV0dXJuOwogCX0KLQkKKwogCWlmIChhdGlfcmVtb3RlX3RibFtpbmRleF0ua2luZCA9PSBLSU5EX0ZJTFRFUkVEKSB7CiAJCS8qIEZpbHRlciBkdXBsaWNhdGUgZXZlbnRzIHdoaWNoIGhhcHBlbiAidG9vIGNsb3NlIiB0b2dldGhlci4gKi8KLQkJaWYgKChhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9PSBkYXRhWzFdKSAmJiAKLQkgCQkoYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPT0gZGF0YVsyXSkgJiYgCi0JIAkJKChhdGlfcmVtb3RlLT5vbGRfamlmZmllcyArIEZJTFRFUl9USU1FKSA+IGppZmZpZXMpKSB7CisJCWlmICgoYXRpX3JlbW90ZS0+b2xkX2RhdGFbMF0gPT0gZGF0YVsxXSkgJiYKKwkJCShhdGlfcmVtb3RlLT5vbGRfZGF0YVsxXSA9PSBkYXRhWzJdKSAmJgorCQkJKChhdGlfcmVtb3RlLT5vbGRfamlmZmllcyArIEZJTFRFUl9USU1FKSA+IGppZmZpZXMpKSB7CiAJCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQrKzsKLQkJfSAKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPSAwOwogCQl9Ci0JCQorCiAJCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzBdID0gZGF0YVsxXTsKIAkJYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPSBkYXRhWzJdOwogCQlhdGlfcmVtb3RlLT5vbGRfamlmZmllcyA9IGppZmZpZXM7CkBAIC01MDEsNyArNDg4LDcgQEAKIAkJaWYgKChhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQgPiAwKQogCQkgICAgJiYgKGF0aV9yZW1vdGUtPnJlcGVhdF9jb3VudCA8IDUpKQogCQkJcmV0dXJuOwotCQkKKwogCiAJCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKIAkJaW5wdXRfZXZlbnQoZGV2LCBhdGlfcmVtb3RlX3RibFtpbmRleF0udHlwZSwKQEAgLTUxMSwxMyArNDk4LDEzIEBACiAJCWlucHV0X3N5bmMoZGV2KTsKIAogCQlyZXR1cm47Ci0JfQkJCQotCQotCS8qIAorCX0KKworCS8qCiAJICogT3RoZXIgZXZlbnQga2luZHMgYXJlIGZyb20gdGhlIGRpcmVjdGlvbmFsIGNvbnRyb2wgcGFkLCBhbmQgaGF2ZSBhbgogCSAqIGFjY2VsZXJhdGlvbiBmYWN0b3IgYXBwbGllZCB0byB0aGVtLiAgV2l0aG91dCB0aGlzIGFjY2VsZXJhdGlvbiwgdGhlCiAJICogY29udHJvbCBwYWQgaXMgbW9zdGx5IHVudXNhYmxlLgotCSAqIAorCSAqCiAJICogSWYgZWxhcHNlZCB0aW1lIHNpbmNlIGxhc3QgZXZlbnQgaXMgPiAxLzQgc2Vjb25kLCB1c2VyICJzdG9wcGVkIiwKIAkgKiBzbyByZXNldCBhY2NlbGVyYXRpb24uIE90aGVyd2lzZSwgdXNlciBpcyBwcm9iYWJseSBob2xkaW5nIHRoZSBjb250cm9sCiAJICogcGFkIGRvd24sIHNvIHdlIGluY3JlYXNlIGFjY2VsZXJhdGlvbiwgcmFtcGluZyB1cCBvdmVyIHR3byBzZWNvbmRzIHRvCkBAIC01NTksNyArNTQ2LDcgQEAKIAkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9ZLCBhY2MpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZGJnKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgImF0aV9yZW1vdGUga2luZD0lZFxuIiwgCisJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiYXRpX3JlbW90ZSBraW5kPSVkXG4iLAogCQkJYXRpX3JlbW90ZV90YmxbaW5kZXhdLmtpbmQpOwogCX0KIAlpbnB1dF9zeW5jKGRldik7CkBAIC01ODYsMTIgKzU3MywxMiBAQAogCWNhc2UgLUVTSFVURE9XTjoKIAkJZGV2X2RiZygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsICIlczogdXJiIGVycm9yIHN0YXR1cywgdW5saW5rPyBcbiIsCiAJCQlfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm47CQorCQlyZXR1cm47CiAJZGVmYXVsdDoJCS8qIGVycm9yICovCi0JCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IE5vbnplcm8gdXJiIHN0YXR1cyAlZFxuIiwgCisJCWRldl9kYmcoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IE5vbnplcm8gdXJiIHN0YXR1cyAlZFxuIiwKIAkJCV9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCX0KLQkKKwogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgU0xBQl9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiJXM6IHVzYl9zdWJtaXRfdXJiKCk9JWRcbiIsCkBAIC02MDMsOCArNTkwLDYgQEAKICAqLwogc3RhdGljIHZvaWQgYXRpX3JlbW90ZV9kZWxldGUoc3RydWN0IGF0aV9yZW1vdGUgKmF0aV9yZW1vdGUpCiB7Ci0JaWYgKCFhdGlfcmVtb3RlKSByZXR1cm47Ci0KIAlpZiAoYXRpX3JlbW90ZS0+aXJxX3VyYikKIAkJdXNiX2tpbGxfdXJiKGF0aV9yZW1vdGUtPmlycV91cmIpOwogCkBAIC02MTQsMTYgKzU5OSwxNiBAQAogCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZhdGlfcmVtb3RlLT5pZGV2KTsKIAogCWlmIChhdGlfcmVtb3RlLT5pbmJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwgCisJCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCiAJCQkJYXRpX3JlbW90ZS0+aW5idWYsIGF0aV9yZW1vdGUtPmluYnVmX2RtYSk7Ci0JCQorCiAJaWYgKGF0aV9yZW1vdGUtPm91dGJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGF0aV9yZW1vdGUtPnVkZXYsIERBVEFfQlVGU0laRSwgCisJCXVzYl9idWZmZXJfZnJlZShhdGlfcmVtb3RlLT51ZGV2LCBEQVRBX0JVRlNJWkUsCiAJCQkJYXRpX3JlbW90ZS0+b3V0YnVmLCBhdGlfcmVtb3RlLT5vdXRidWZfZG1hKTsKLQkKKwogCWlmIChhdGlfcmVtb3RlLT5pcnFfdXJiKQogCQl1c2JfZnJlZV91cmIoYXRpX3JlbW90ZS0+aXJxX3VyYik7Ci0JCisKIAlpZiAoYXRpX3JlbW90ZS0+b3V0X3VyYikKIAkJdXNiX2ZyZWVfdXJiKGF0aV9yZW1vdGUtPm91dF91cmIpOwogCkBAIC02MzYsNTEgKzYyMSw1MiBAQAogCWludCBpOwogCiAJaWRldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9SRUwpOwotCWlkZXYtPmtleWJpdFtMT05HKEJUTl9NT1VTRSldID0gKCBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCAKKwlpZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9ICggQklUKEJUTl9MRUZUKSB8IEJJVChCVE5fUklHSFQpIHwKIAkJCQkJICBCSVQoQlROX1NJREUpIHwgQklUKEJUTl9FWFRSQSkgKTsKIAlpZGV2LT5yZWxiaXRbMF0gPSBCSVQoUkVMX1gpIHwgQklUKFJFTF9ZKTsKIAlmb3IgKGkgPSAwOyBhdGlfcmVtb3RlX3RibFtpXS5raW5kICE9IEtJTkRfRU5EOyBpKyspCiAJCWlmIChhdGlfcmVtb3RlX3RibFtpXS50eXBlID09IEVWX0tFWSkKIAkJCXNldF9iaXQoYXRpX3JlbW90ZV90YmxbaV0uY29kZSwgaWRldi0+a2V5Yml0KTsKLQkKKwogCWlkZXYtPnByaXZhdGUgPSBhdGlfcmVtb3RlOwogCWlkZXYtPm9wZW4gPSBhdGlfcmVtb3RlX29wZW47CiAJaWRldi0+Y2xvc2UgPSBhdGlfcmVtb3RlX2Nsb3NlOwotCQorCiAJaWRldi0+bmFtZSA9IGF0aV9yZW1vdGUtPm5hbWU7CiAJaWRldi0+cGh5cyA9IGF0aV9yZW1vdGUtPnBoeXM7Ci0JCi0JaWRldi0+aWQuYnVzdHlwZSA9IEJVU19VU0I7CQkKKworCWlkZXYtPmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwogCWlkZXYtPmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KGF0aV9yZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwogCWlkZXYtPmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7CiAJaWRldi0+aWQudmVyc2lvbiA9IGxlMTZfdG9fY3B1KGF0aV9yZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKKwlpZGV2LT5kZXYgPSAmKGF0aV9yZW1vdGUtPnVkZXYtPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgYXRpX3JlbW90ZV9pbml0aWFsaXplKHN0cnVjdCBhdGlfcmVtb3RlICphdGlfcmVtb3RlKQogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gYXRpX3JlbW90ZS0+dWRldjsKIAlpbnQgcGlwZSwgbWF4cDsKLQkJCisKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZhdGlfcmVtb3RlLT53YWl0KTsKIAogCS8qIFNldCB1cCBpcnFfdXJiICovCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKHVkZXYsIGF0aV9yZW1vdGUtPmVuZHBvaW50X2luLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAltYXhwID0gdXNiX21heHBhY2tldCh1ZGV2LCBwaXBlLCB1c2JfcGlwZW91dChwaXBlKSk7CiAJbWF4cCA9IChtYXhwID4gREFUQV9CVUZTSVpFKSA/IERBVEFfQlVGU0laRSA6IG1heHA7Ci0JCi0JdXNiX2ZpbGxfaW50X3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiLCB1ZGV2LCBwaXBlLCBhdGlfcmVtb3RlLT5pbmJ1ZiwgCi0JCQkgbWF4cCwgYXRpX3JlbW90ZV9pcnFfaW4sIGF0aV9yZW1vdGUsIAorCisJdXNiX2ZpbGxfaW50X3VyYihhdGlfcmVtb3RlLT5pcnFfdXJiLCB1ZGV2LCBwaXBlLCBhdGlfcmVtb3RlLT5pbmJ1ZiwKKwkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9pbiwgYXRpX3JlbW90ZSwKIAkJCSBhdGlfcmVtb3RlLT5lbmRwb2ludF9pbi0+YkludGVydmFsKTsKIAlhdGlfcmVtb3RlLT5pcnFfdXJiLT50cmFuc2Zlcl9kbWEgPSBhdGlfcmVtb3RlLT5pbmJ1Zl9kbWE7CiAJYXRpX3JlbW90ZS0+aXJxX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7Ci0JCisKIAkvKiBTZXQgdXAgb3V0X3VyYiAqLwogCXBpcGUgPSB1c2Jfc25kaW50cGlwZSh1ZGV2LCBhdGlfcmVtb3RlLT5lbmRwb2ludF9vdXQtPmJFbmRwb2ludEFkZHJlc3MpOwogCW1heHAgPSB1c2JfbWF4cGFja2V0KHVkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKIAltYXhwID0gKG1heHAgPiBEQVRBX0JVRlNJWkUpID8gREFUQV9CVUZTSVpFIDogbWF4cDsKIAotCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+b3V0YnVmLCAKLQkJCSBtYXhwLCBhdGlfcmVtb3RlX2lycV9vdXQsIGF0aV9yZW1vdGUsIAorCXVzYl9maWxsX2ludF91cmIoYXRpX3JlbW90ZS0+b3V0X3VyYiwgdWRldiwgcGlwZSwgYXRpX3JlbW90ZS0+b3V0YnVmLAorCQkJIG1heHAsIGF0aV9yZW1vdGVfaXJxX291dCwgYXRpX3JlbW90ZSwKIAkJCSBhdGlfcmVtb3RlLT5lbmRwb2ludF9vdXQtPmJJbnRlcnZhbCk7CiAJYXRpX3JlbW90ZS0+b3V0X3VyYi0+dHJhbnNmZXJfZG1hID0gYXRpX3JlbW90ZS0+b3V0YnVmX2RtYTsKIAlhdGlfcmVtb3RlLT5vdXRfdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKQEAgLTY4OCwxMSArNjc0LDExIEBACiAJLyogc2VuZCBpbml0aWFsaXphdGlvbiBzdHJpbmdzICovCiAJaWYgKChhdGlfcmVtb3RlX3NlbmRwYWNrZXQoYXRpX3JlbW90ZSwgMHg4MDA0LCBpbml0MSkpIHx8CiAJICAgIChhdGlfcmVtb3RlX3NlbmRwYWNrZXQoYXRpX3JlbW90ZSwgMHg4MDA3LCBpbml0MikpKSB7Ci0JCWRldl9lcnIoJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAKKwkJZGV2X2VycigmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCiAJCQkgIkluaXRpYWxpemluZyBhdGlfcmVtb3RlIGhhcmR3YXJlIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gMTsKIAl9Ci0JCisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzY5LDcgKzc1NSw3IEBACiAKIAlpZiAoIXN0cmxlbihhdGlfcmVtb3RlLT5uYW1lKSkKIAkJc3ByaW50ZihhdGlfcmVtb3RlLT5uYW1lLCBEUklWRVJfREVTQyAiKCUwNHgsJTA0eCkiLAotCQkJbGUxNl90b19jcHUoYXRpX3JlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksIAorCQkJbGUxNl90b19jcHUoYXRpX3JlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCiAJCQlsZTE2X3RvX2NwdShhdGlfcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwogCiAJLyogRGV2aWNlIEhhcmR3YXJlIEluaXRpYWxpemF0aW9uIC0gZmlsbHMgaW4gYXRpX3JlbW90ZS0+aWRldiBmcm9tIHVkZXYuICovCkBAIC03ODEsMTEgKzc2NywxMSBAQAogCWF0aV9yZW1vdGVfaW5wdXRfaW5pdChhdGlfcmVtb3RlKTsKIAlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJmF0aV9yZW1vdGUtPmlkZXYpOwogCi0JZGV2X2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LCAiSW5wdXQgcmVnaXN0ZXJlZDogJXMgb24gJXNcbiIsIAorCWRldl9pbmZvKCZhdGlfcmVtb3RlLT5pbnRlcmZhY2UtPmRldiwgIklucHV0IHJlZ2lzdGVyZWQ6ICVzIG9uICVzXG4iLAogCQkgYXRpX3JlbW90ZS0+bmFtZSwgcGF0aCk7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgYXRpX3JlbW90ZSk7Ci0JCisKIGVycm9yOgogCWlmIChyZXR2YWwpCiAJCWF0aV9yZW1vdGVfZGVsZXRlKGF0aV9yZW1vdGUpOwpAQCAtODAwLDE4ICs3ODYsMTQgQEAKIHsKIAlzdHJ1Y3QgYXRpX3JlbW90ZSAqYXRpX3JlbW90ZTsKIAotCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKLQogCWF0aV9yZW1vdGUgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCWlmICghYXRpX3JlbW90ZSkgewogCQl3YXJuKCIlcyAtIG51bGwgZGV2aWNlP1xuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KLQkKLQlhdGlfcmVtb3RlX2RlbGV0ZShhdGlfcmVtb3RlKTsKIAotCXVwKCZkaXNjb25uZWN0X3NlbSk7CisJYXRpX3JlbW90ZV9kZWxldGUoYXRpX3JlbW90ZSk7CiB9CiAKIC8qCkBAIC04MjAsNyArODAyLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGF0aV9yZW1vdGVfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7Ci0JCisKIAlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmF0aV9yZW1vdGVfZHJpdmVyKTsKIAlpZiAocmVzdWx0KQogCQllcnIoInVzYl9yZWdpc3RlciBlcnJvciAjJWRcbiIsIHJlc3VsdCk7CkBAIC04MzgsOCArODIwLDggQEAKIAl1c2JfZGVyZWdpc3RlcigmYXRpX3JlbW90ZV9kcml2ZXIpOwogfQogCi0vKiAKLSAqCW1vZHVsZSBzcGVjaWZpY2F0aW9uIAorLyoKKyAqCW1vZHVsZSBzcGVjaWZpY2F0aW9uCiAgKi8KIAogbW9kdWxlX2luaXQoYXRpX3JlbW90ZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCmluZGV4IDc0MGRlYzEuLjIzNTBlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUuYwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJcmVwb3J0LT5zaXplICs9IHBhcnNlci0+Z2xvYmFsLnJlcG9ydF9zaXplICogcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50OwogCiAJaWYgKCFwYXJzZXItPmxvY2FsLnVzYWdlX2luZGV4KSAvKiBJZ25vcmUgcGFkZGluZyBmaWVsZHMgKi8KLQkJcmV0dXJuIDA7IAorCQlyZXR1cm4gMDsKIAogCXVzYWdlcyA9IG1heF90KGludCwgcGFyc2VyLT5sb2NhbC51c2FnZV9pbmRleCwgcGFyc2VyLT5nbG9iYWwucmVwb3J0X2NvdW50KTsKIApAQCAtNzY1LDcgKzc2NSw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBleHRyYWN0KF9fdTggKnJlcG9ydCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuKQogewogCXJlcG9ydCArPSAob2Zmc2V0ID4+IDUpIDw8IDI7IG9mZnNldCAmPSAzMTsKLQlyZXR1cm4gKGxlNjRfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGU2NCopcmVwb3J0KSkgPj4gb2Zmc2V0KSAmICgoMSA8PCBuKSAtIDEpOworCXJldHVybiAobGU2NF90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19sZTY0KilyZXBvcnQpKSA+PiBvZmZzZXQpICYgKCgxVUxMIDw8IG4pIC0gMSk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgaW1wbGVtZW50KF9fdTggKnJlcG9ydCwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBuLCBfX3UzMiB2YWx1ZSkKQEAgLTEyMzMsNiArMTIzMywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGhpZF9zZXRfaWRsZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgaWZudW0sIGludCByZXBvcnQsIGludCBpZGxlKQoreworCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJSElEX1JFUV9TRVRfSURMRSwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLCAoaWRsZSA8PCA4KSB8IHJlcG9ydCwKKwkJaWZudW0sIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKK30KKwogc3RhdGljIGludCBoaWRfZ2V0X2NsYXNzX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgaW50IGlmbnVtLAogCQl1bnNpZ25lZCBjaGFyIHR5cGUsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCiB7CkBAIC0xMzAxLDEwICsxMzA4LDYgQEAKIAogCWlmIChlcnIpCiAJCXdhcm4oInRpbWVvdXQgaW5pdGlhbGl6aW5nIHJlcG9ydHNcbiIpOwotCi0JdXNiX2NvbnRyb2xfbXNnKGhpZC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoaGlkLT5kZXYsIDApLAotCQlISURfUkVRX1NFVF9JRExFLCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsIDAsCi0JCWhpZC0+aWZudW0sIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIH0KIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1dBQ09NCQkweDA1NmEKQEAgLTEzMTgsNiArMTMyMSwxMCBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1dBQ09NX0lOVFVPUzMJMHgwMEIwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfV0FDT01fQ0lOVElRCTB4MDAzRgogCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUNFQ0FECQkweDA0NjAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9BQ0VDQURfRkxBSVIJMHgwMDA0CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQUNFQ0FEXzMwMgkweDAwMDgKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0tCR0VBUgkJMHgwODRlCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfS0JHRUFSX0pBTVNUVURJTwkweDEwMDEKIApAQCAtMTQyMSw2ICsxNDI4LDE5IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQCTB4MDAwMwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUwkweDAwMDQKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0xECQkweDBmMTEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DQVNTWSAgICAgICAgCTB4MTAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZCTB4MTAxMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX01PQklMRUNBU1NZCTB4MTAyMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0pXTQkJMHgxMDgwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRE1NUAkJMHgxMDgxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVU1JUAkJMHgxMDkwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVklERU9DT00JCTB4MTIwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPTTNMQUIJCTB4MjAwMAorI2RlZmluZSBVU0JfREVWSUNFX0lEX1RFTEVQT1JUCQkweDIwMTAKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORVRXT1JLQU5BTFlTRVIJMHgyMDIwCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9XRVJDT05UUk9MCTB4MjAzMAorCiAKIC8qCiAgKiBBbHBoYWJldGljYWxseSBzb3J0ZWQgYmxhY2tsaXN0IGJ5IHF1aXJrIHR5cGUuCkBAIC0xNDU2LDYgKzE0NzYsMTcgQEAKIAl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9QT1dFUk1BVEUsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfR1JJRkZJTiwgVVNCX0RFVklDRV9JRF9TT1VOREtOT0IsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfS0JHRUFSLCBVU0JfREVWSUNFX0lEX0tCR0VBUl9KQU1TVFVESU8sIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfQ0FTU1ksIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfUE9DS0VUQ0FTU1ksIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfTU9CSUxFQ0FTU1ksIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfSldNLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0RNTVAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfVU1JUCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9WSURFT0NPTSwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9DT00zTEFCLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1RFTEVQT1JULCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX05FVFdPUktBTkFMWVNFUiwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9QT1dFUkNPTlRST0wsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfTUNDLCBVU0JfREVWSUNFX0lEX01DQ19QTUQxMDI0TFMsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfTUNDLCBVU0JfREVWSUNFX0lEX01DQ19QTUQxMjA4TFMsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfTUdFLCBVU0JfREVWSUNFX0lEX01HRV9VUFMsIEhJRF9RVUlSS19JR05PUkUgfSwKQEAgLTE1MDIsNiArMTUzMyw5IEBACiAJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18yMCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKIAorCXsgVVNCX1ZFTkRPUl9JRF9BQ0VDQUQsIFVTQl9ERVZJQ0VfSURfQUNFQ0FEX0ZMQUlSLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0FDRUNBRCwgVVNCX0RFVklDRV9JRF9BQ0VDQURfMzAyLCBISURfUVVJUktfSUdOT1JFIH0sCisKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOX1VDMTAwS00sIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9BVEVOLCBVU0JfREVWSUNFX0lEX0FURU5fQ1MxMjRVLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzJQT1JUS1ZNLCBISURfUVVJUktfTk9HRVQgfSwKQEAgLTE1OTAsNiArMTYyNCw4IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCWhpZF9zZXRfaWRsZShkZXYsIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAwLCAwKTsKKwogCWlmICgobiA9IGhpZF9nZXRfY2xhc3NfZGVzY3JpcHRvcihkZXYsIGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBISURfRFRfUkVQT1JULCByZGVzYywgcnNpemUpKSA8IDApIHsKIAkJZGJnKCJyZWFkaW5nIHJlcG9ydCBkZXNjcmlwdG9yIGZhaWxlZCIpOwogCQlrZnJlZShyZGVzYyk7CkBAIC0xNjM1LDcgKzE2NzEsNyBAQAogCQkvKiBDaGFuZ2UgdGhlIHBvbGxpbmcgaW50ZXJ2YWwgb2YgbWljZS4gKi8KIAkJaWYgKGhpZC0+Y29sbGVjdGlvbi0+dXNhZ2UgPT0gSElEX0dEX01PVVNFICYmIGhpZF9tb3VzZXBvbGxfaW50ZXJ2YWwgPiAwKQogCQkJaW50ZXJ2YWwgPSBoaWRfbW91c2Vwb2xsX2ludGVydmFsOwotCQkKKwogCQlpZiAoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRElSX0lOKSB7CiAJCQlpZiAoaGlkLT51cmJpbikKIAkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1kZWJ1Zy5oIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWRlYnVnLmgKaW5kZXggMmI5MTcwNS4uNTI0MzdlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaGlkLWRlYnVnLmgKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWRlYnVnLmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgIHswLCAweDQ0LCAiVmJyeSJ9LAogICAgICAgezAsIDB4NDUsICJWYnJ6In0sCiAgICAgICB7MCwgMHg0NiwgIlZubyJ9LAotICAgIHswLCAweDgwLCAiU3lzdGVtQ29udHJvbCJ9LCAKKyAgICB7MCwgMHg4MCwgIlN5c3RlbUNvbnRyb2wifSwKICAgICAgIHswLCAweDgxLCAiU3lzdGVtUG93ZXJEb3duIn0sCiAgICAgICB7MCwgMHg4MiwgIlN5c3RlbVNsZWVwIn0sCiAgICAgICB7MCwgMHg4MywgIlN5c3RlbVdha2VVcCJ9LApAQCAtMzQ3LDcgKzM0Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGhpZF9kdW1wX2ZpZWxkKHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLCBpbnQgbikgewogCWludCBqOwotCQorCiAJaWYgKGZpZWxkLT5waHlzaWNhbCkgewogCQl0YWIobik7CiAJCXByaW50aygiUGh5c2ljYWwoIik7CkBAIC00MDgsNyArNDA4LDcgQEAKIAkJCQkJcHJpbnRrKCIlcyIsIHVuaXRzW3N5c11baV0pOwogCQkJCQlpZihuaWJibGUgIT0gMSkgewogCQkJCQkJLyogVGhpcyBpcyBhIF9zaWduZWRfIG5pYmJsZSghKSAqLwotCQorCiAJCQkJCQlpbnQgdmFsID0gbmliYmxlICYgMHg3OwogCQkJCQkJaWYobmliYmxlICYgMHgwOCkKIAkJCQkJCQl2YWwgPSAtKCgweDcgJiB+dmFsKSArMSk7CkBAIC00NDMsNyArNDQzLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCXVuc2lnbmVkIGksazsKIAlzdGF0aWMgY2hhciAqdGFibGVbXSA9IHsiSU5QVVQiLCAiT1VUUFVUIiwgIkZFQVRVUkUifTsKLQkKKwogCWZvciAoaSA9IDA7IGkgPCBISURfUkVQT1JUX1RZUEVTOyBpKyspIHsKIAkJcmVwb3J0X2VudW0gPSBkZXZpY2UtPnJlcG9ydF9lbnVtICsgaTsKIAkJbGlzdCA9IHJlcG9ydF9lbnVtLT5yZXBvcnRfbGlzdC5uZXh0OwpAQCAtNjY0LDggKzY2NCw4IEBACiBzdGF0aWMgY2hhciAqcmVsYXRpdmVzW1JFTF9NQVggKyAxXSA9IHsKIAlbUkVMX1hdID0gIlgiLAkJCVtSRUxfWV0gPSAiWSIsCiAJW1JFTF9aXSA9ICJaIiwJCQlbUkVMX0hXSEVFTF0gPSAiSFdoZWVsIiwKLQlbUkVMX0RJQUxdID0gIkRpYWwiLAkJW1JFTF9XSEVFTF0gPSAiV2hlZWwiLCAKLQlbUkVMX01JU0NdID0gIk1pc2MiLAkKKwlbUkVMX0RJQUxdID0gIkRpYWwiLAkJW1JFTF9XSEVFTF0gPSAiV2hlZWwiLAorCVtSRUxfTUlTQ10gPSAiTWlzYyIsCiB9OwogCiBzdGF0aWMgY2hhciAqYWJzb2x1dGVzW0FCU19NQVggKyAxXSA9IHsKQEAgLTY5MCw5ICs2OTAsOSBAQAogfTsKIAogc3RhdGljIGNoYXIgKmxlZHNbTEVEX01BWCArIDFdID0gewotCVtMRURfTlVNTF0gPSAiTnVtTG9jayIsCQlbTEVEX0NBUFNMXSA9ICJDYXBzTG9jayIsIAorCVtMRURfTlVNTF0gPSAiTnVtTG9jayIsCQlbTEVEX0NBUFNMXSA9ICJDYXBzTG9jayIsCiAJW0xFRF9TQ1JPTExMXSA9ICJTY3JvbGxMb2NrIiwJW0xFRF9DT01QT1NFXSA9ICJDb21wb3NlIiwKLQlbTEVEX0tBTkFdID0gIkthbmEiLAkJW0xFRF9TTEVFUF0gPSAiU2xlZXAiLCAKKwlbTEVEX0tBTkFdID0gIkthbmEiLAkJW0xFRF9TTEVFUF0gPSAiU2xlZXAiLAogCVtMRURfU1VTUEVORF0gPSAiU3VzcGVuZCIsCVtMRURfTVVURV0gPSAiTXV0ZSIsCiAJW0xFRF9NSVNDXSA9ICJNaXNjIiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCmluZGV4IDU1NTNjMzUuLjlhYzFlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1pbnB1dC5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAkJCQljYXNlIEhJRF9HRF9YOiBjYXNlIEhJRF9HRF9ZOiBjYXNlIEhJRF9HRF9aOgogCQkJCWNhc2UgSElEX0dEX1JYOiBjYXNlIEhJRF9HRF9SWTogY2FzZSBISURfR0RfUlo6CiAJCQkJY2FzZSBISURfR0RfU0xJREVSOiBjYXNlIEhJRF9HRF9ESUFMOiBjYXNlIEhJRF9HRF9XSEVFTDoKLQkJCQkJaWYgKGZpZWxkLT5mbGFncyAmIEhJRF9NQUlOX0lURU1fUkVMQVRJVkUpIAorCQkJCQlpZiAoZmllbGQtPmZsYWdzICYgSElEX01BSU5fSVRFTV9SRUxBVElWRSkKIAkJCQkJCW1hcF9yZWwodXNhZ2UtPmhpZCAmIDB4Zik7CiAJCQkJCWVsc2UKIAkJCQkJCW1hcF9hYnModXNhZ2UtPmhpZCAmIDB4Zik7CkBAIC0yOTcsNyArMjk3LDcgQEAKIAkJY2FzZSBISURfVVBfTVNWRU5ET1I6CiAKIAkJCWdvdG8gaWdub3JlOwotCQkJCisKIAkJY2FzZSBISURfVVBfUElEOgogCiAJCQlzZXRfYml0KEVWX0ZGLCBpbnB1dC0+ZXZiaXQpOwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJCWdvdG8gaWdub3JlOwogCiAJaWYgKChkZXZpY2UtPnF1aXJrcyAmIChISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNyB8IEhJRF9RVUlSS18yV0hFRUxfTU9VU0VfSEFDS181KSkgJiYKLQkJICh1c2FnZS0+dHlwZSA9PSBFVl9SRUwpICYmICh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpKSAKKwkJICh1c2FnZS0+dHlwZSA9PSBFVl9SRUwpICYmICh1c2FnZS0+Y29kZSA9PSBSRUxfV0hFRUwpKQogCQkJc2V0X2JpdChSRUxfSFdIRUVMLCBiaXQpOwogCiAJaWYgKCgoZGV2aWNlLT5xdWlya3MgJiBISURfUVVJUktfMldIRUVMX01PVVNFX0hBQ0tfNSkgJiYgKHVzYWdlLT5oaWQgPT0gMHgwMDA5MDAwNSkpCkBAIC0zNjUsMTEgKzM2NSwxMSBAQAogCQkJYSA9IGZpZWxkLT5sb2dpY2FsX21pbmltdW0gPSAwOwogCQkJYiA9IGZpZWxkLT5sb2dpY2FsX21heGltdW0gPSAyNTU7CiAJCX0KLQkJCisKIAkJaWYgKGZpZWxkLT5hcHBsaWNhdGlvbiA9PSBISURfR0RfR0FNRVBBRCB8fCBmaWVsZC0+YXBwbGljYXRpb24gPT0gSElEX0dEX0pPWVNUSUNLKQogCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAoYiAtIGEpID4+IDgsIChiIC0gYSkgPj4gNCk7CiAJCWVsc2UJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIHVzYWdlLT5jb2RlLCBhLCBiLCAwLCAwKTsKLQkJCisKIAl9CiAKIAlpZiAodXNhZ2UtPmhhdF9taW4gPCB1c2FnZS0+aGF0X21heCB8fCB1c2FnZS0+aGF0X2RpcikgewpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAodXNhZ2UtPmhhdF9taW4gPCB1c2FnZS0+aGF0X21heCB8fCB1c2FnZS0+aGF0X2RpcikgeyAKKwlpZiAodXNhZ2UtPmhhdF9taW4gPCB1c2FnZS0+aGF0X21heCB8fCB1c2FnZS0+aGF0X2RpcikgewogCQlpbnQgaGF0X2RpciA9IHVzYWdlLT5oYXRfZGlyOwogCQlpZiAoIWhhdF9kaXIpCiAJCQloYXRfZGlyID0gKHZhbHVlIC0gdXNhZ2UtPmhhdF9taW4pICogOCAvICh1c2FnZS0+aGF0X21heCAtIHVzYWdlLT5oYXRfbWluICsgMSkgKyAxOwpAQCAtNTUxLDcgKzU1MSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGhpZC0+bWF4Y29sbGVjdGlvbjsgaSsrKQogCQlpZiAoaGlkLT5jb2xsZWN0aW9uW2ldLnR5cGUgPT0gSElEX0NPTExFQ1RJT05fQVBQTElDQVRJT04gfHwKIAkJICAgIGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09IEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKQotCQkgICAgCWlmIChJU19JTlBVVF9BUFBMSUNBVElPTihoaWQtPmNvbGxlY3Rpb25baV0udXNhZ2UpKQorCQkJaWYgKElTX0lOUFVUX0FQUExJQ0FUSU9OKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSkpCiAJCQkJYnJlYWs7CiAKIAlpZiAoaSA9PSBoaWQtPm1heGNvbGxlY3Rpb24pCkBAIC01OTIsNyArNTkyLDcgQEAKIAkJCQlmb3IgKGogPSAwOyBqIDwgcmVwb3J0LT5maWVsZFtpXS0+bWF4dXNhZ2U7IGorKykKIAkJCQkJaGlkaW5wdXRfY29uZmlndXJlX3VzYWdlKGhpZGlucHV0LCByZXBvcnQtPmZpZWxkW2ldLAogCQkJCQkJCQkgcmVwb3J0LT5maWVsZFtpXS0+dXNhZ2UgKyBqKTsKLQkJCQorCiAJCQlpZiAoaGlkLT5xdWlya3MgJiBISURfUVVJUktfTVVMVElfSU5QVVQpIHsKIAkJCQkvKiBUaGlzIHdpbGwgbGVhdmUgaGlkaW5wdXQgTlVMTCwgc28gdGhhdCBpdAogCQkJCSAqIGFsbG9jYXRlcyBhbm90aGVyIG9uZSBpZiB3ZSBoYXZlIG1vcmUgaW5wdXRzIG9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtbGdmZi5jIGIvZHJpdmVycy91c2IvaW5wdXQvaGlkLWxnZmYuYwppbmRleCAwZDc0MDRiLi4wYzRjNzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtbGdmZi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1sZ2ZmLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAkJCQkJaXNuJ3QgcmVhbGx5IG5lY2Vzc2FyeSAqLwogCiAJdW5zaWduZWQgbG9uZyBmbGFnc1sxXTsgICAgICAvKiBDb250YWlucyB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCQkJCSAgICAgICAgc3RhdGUgb2YgdGhlIGRyaXZlciBmb3IgdGhpcyBkZXZpY2UgKi8JCisJCQkJICAgICAgICBzdGF0ZSBvZiB0aGUgZHJpdmVyIGZvciB0aGlzIGRldmljZSAqLwogCiAJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CiB9OwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJCWtmcmVlKHJldCk7CiAJCXJldHVybiBOVUxMOwogCX0KLQltZW1zZXQocmV0LT5maWVsZFswXS0+dmFsdWUsIDAsIHNpemVvZihzMzJbOF0pKTsJCisJbWVtc2V0KHJldC0+ZmllbGRbMF0tPnZhbHVlLCAwLCBzaXplb2YoczMyWzhdKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjk1LDExICsyOTUsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHR5cGUgIT0gRVZfRkYpICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgCWlmICghTEdGRl9DSEVDS19PV05FUlNISVAoY29kZSwgbGdmZikpIHJldHVybiAtRUFDQ0VTOworCWlmICghTEdGRl9DSEVDS19PV05FUlNISVAoY29kZSwgbGdmZikpIHJldHVybiAtRUFDQ0VTOwogCWlmICh2YWx1ZSA8IDApICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmxnZmYtPmxvY2ssIGZsYWdzKTsKLQkKKwogCWlmICh2YWx1ZSA+IDApIHsKIAkJaWYgKHRlc3RfYml0KEVGRkVDVF9TVEFSVEVELCBlZmZlY3QtPmZsYWdzKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGdmZi0+bG9jaywgZmxhZ3MpOwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAJCSAgYW5kIHBlcmZvcm0gaW9jdGxzIG9uIHRoZSBzYW1lIGZkIGFsbCBhdCB0aGUgc2FtZSB0aW1lICovCiAJCWlmICggY3VycmVudC0+cGlkID09IGxnZmYtPmVmZmVjdHNbaV0ub3duZXIKIAkJICAgICAmJiB0ZXN0X2JpdChFRkZFQ1RfVVNFRCwgbGdmZi0+ZWZmZWN0c1tpXS5mbGFncykpIHsKLQkJCQorCiAJCQlpZiAoaGlkX2xnZmZfZXJhc2UoZGV2LCBpKSkKIAkJCQl3YXJuKCJlcmFzZSBlZmZlY3QgJWQgZmFpbGVkIiwgaSk7CiAJCX0KQEAgLTM3OCw3ICszNzgsNyBAQAogCXN0cnVjdCBsZ2ZmX2VmZmVjdCBuZXc7CiAJaW50IGlkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCisKIAlkYmcoImlvY3RsIHJ1bWJsZSIpOwogCiAJaWYgKCF0ZXN0X2JpdChlZmZlY3QtPnR5cGUsIGlucHV0LT5mZmJpdCkpIHJldHVybiAtRUlOVkFMOwpAQCAtNDQxLDcgKzQ0MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbGdmZi0+bG9jaywgZmxhZ3MpOwogCi0gCWZvciAoaT0wOyBpPExHRkZfRUZGRUNUUzsgKytpKSB7CisJZm9yIChpPTA7IGk8TEdGRl9FRkZFQ1RTOyArK2kpIHsKIAkJc3RydWN0IGxnZmZfZWZmZWN0KiBlZmZlY3QgPSBsZ2ZmLT5lZmZlY3RzICtpOwogCiAJCWlmICh0ZXN0X2JpdChFRkZFQ1RfUExBWUlORywgZWZmZWN0LT5mbGFncykpIHsKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCQkJCXNldF9iaXQoRUZGRUNUX1BMQVlJTkcsIGxnZmYtPmVmZmVjdHNbaV0uZmxhZ3MpOwogCQkJfQogCQl9Ci0gCX0KKwl9CiAKICNkZWZpbmUgQ0xBTVAoeCkgaWYgKHggPCAwKSB4ID0gMDsgaWYgKHggPiAweGZmKSB4ID0gMHhmZgogCkBAIC01MjQsNSArNTI0LDUgQEAKIAkJYWRkX3RpbWVyKCZsZ2ZmLT50aW1lcik7CiAJfQogCi0gCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxnZmYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsZ2ZmLT5sb2NrLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQuaCBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCmluZGV4IDZkOTMyOWMuLmMxYjZiNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC5oCkBAIC0xMTgsNyArMTE4LDcgQEAKICNkZWZpbmUgSElEX01BSU5fSVRFTV9DT05TVEFOVAkJMHgwMDEKICNkZWZpbmUgSElEX01BSU5fSVRFTV9WQVJJQUJMRQkJMHgwMDIKICNkZWZpbmUgSElEX01BSU5fSVRFTV9SRUxBVElWRQkJMHgwMDQKLSNkZWZpbmUgSElEX01BSU5fSVRFTV9XUkFQCQkweDAwOAkKKyNkZWZpbmUgSElEX01BSU5fSVRFTV9XUkFQCQkweDAwOAogI2RlZmluZSBISURfTUFJTl9JVEVNX05PTkxJTkVBUgkJMHgwMTAKICNkZWZpbmUgSElEX01BSU5fSVRFTV9OT19QUkVGRVJSRUQJMHgwMjAKICNkZWZpbmUgSElEX01BSU5fSVRFTV9OVUxMX1NUQVRFCTB4MDQwCkBAIC0xNzIsMTQgKzE3MiwxNCBAQAogI2RlZmluZSBISURfVVNBR0VfUEFHRQkJMHhmZmZmMDAwMAogCiAjZGVmaW5lIEhJRF9VUF9VTkRFRklORUQJMHgwMDAwMDAwMAotI2RlZmluZSBISURfVVBfR0VOREVTSyAJCTB4MDAwMTAwMDAKLSNkZWZpbmUgSElEX1VQX0tFWUJPQVJEIAkweDAwMDcwMDAwCi0jZGVmaW5lIEhJRF9VUF9MRUQgCQkweDAwMDgwMDAwCi0jZGVmaW5lIEhJRF9VUF9CVVRUT04gCQkweDAwMDkwMDAwCi0jZGVmaW5lIEhJRF9VUF9PUkRJTkFMIAkJMHgwMDBhMDAwMAorI2RlZmluZSBISURfVVBfR0VOREVTSwkJMHgwMDAxMDAwMAorI2RlZmluZSBISURfVVBfS0VZQk9BUkQJCTB4MDAwNzAwMDAKKyNkZWZpbmUgSElEX1VQX0xFRAkJMHgwMDA4MDAwMAorI2RlZmluZSBISURfVVBfQlVUVE9OCQkweDAwMDkwMDAwCisjZGVmaW5lIEhJRF9VUF9PUkRJTkFMCQkweDAwMGEwMDAwCiAjZGVmaW5lIEhJRF9VUF9DT05TVU1FUgkJMHgwMDBjMDAwMAotI2RlZmluZSBISURfVVBfRElHSVRJWkVSIAkweDAwMGQwMDAwCi0jZGVmaW5lIEhJRF9VUF9QSUQgCQkweDAwMGYwMDAwCisjZGVmaW5lIEhJRF9VUF9ESUdJVElaRVIJMHgwMDBkMDAwMAorI2RlZmluZSBISURfVVBfUElECQkweDAwMGYwMDAwCiAjZGVmaW5lIEhJRF9VUF9IUFZFTkRPUiAgICAgICAgIDB4ZmY3ZjAwMDAKICNkZWZpbmUgSElEX1VQX01TVkVORE9SCQkweGZmMDAwMDAwCiAKQEAgLTQwNiw3ICs0MDYsNyBAQAogCWRtYV9hZGRyX3Qgb3V0YnVmX2RtYTsJCQkJCQkvKiBPdXRwdXQgYnVmZmVyIGRtYSAqLwogCXNwaW5sb2NrX3Qgb3V0bG9jazsJCQkJCQkvKiBPdXRwdXQgZmlmbyBzcGlubG9jayAqLwogCi0JdW5zaWduZWQgY2xhaW1lZDsJCQkJCQkvKiBDbGFpbWVkIGJ5IGhpZGlucHV0LCBoaWRkZXY/ICovCQorCXVuc2lnbmVkIGNsYWltZWQ7CQkJCQkJLyogQ2xhaW1lZCBieSBoaWRpbnB1dCwgaGlkZGV2PyAqLwogCXVuc2lnbmVkIHF1aXJrczsJCQkJCQkvKiBWYXJpb3VzIHF1aXJrcyB0aGUgZGV2aWNlIGNhbiBwdWxsIG9uIHVzICovCiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGlucHV0czsJCQkJCS8qIFRoZSBsaXN0IG9mIGlucHV0cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwppbmRleCA5NmI3YzkwLi40YzEzMzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwpAQCAtOTUsNyArOTUsNyBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCXJpbmZvLT5yZXBvcnRfaWQgPSAoKHN0cnVjdCBoaWRfcmVwb3J0ICopIGxpc3QpLT5pZDsKIAkJYnJlYWs7Ci0JCQorCiAJY2FzZSBISURfUkVQT1JUX0lEX05FWFQ6CiAJCWxpc3QgPSAoc3RydWN0IGxpc3RfaGVhZCAqKQogCQkJcmVwb3J0X2VudW0tPnJlcG9ydF9pZF9oYXNoW3JpbmZvLT5yZXBvcnRfaWQgJiBISURfUkVQT1JUX0lEX01BU0tdOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCQlyZXR1cm4gTlVMTDsKIAkJcmluZm8tPnJlcG9ydF9pZCA9ICgoc3RydWN0IGhpZF9yZXBvcnQgKikgbGlzdCktPmlkOwogCQlicmVhazsKLQkJCisKIAlkZWZhdWx0OgogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xNTgsNyArMTU4LDcgQEAKIAkJaWYgKHVyZWYtPmZpZWxkX2luZGV4ICE9IEhJRF9GSUVMRF9JTkRFWF9OT05FIHx8CiAJCSAgICAobGlzdC0+ZmxhZ3MgJiBISURERVZfRkxBR19SRVBPUlQpICE9IDApIHsKIAkJCWxpc3QtPmJ1ZmZlcltsaXN0LT5oZWFkXSA9ICp1cmVmOwotCQkJbGlzdC0+aGVhZCA9IChsaXN0LT5oZWFkICsgMSkgJiAKKwkJCWxpc3QtPmhlYWQgPSAobGlzdC0+aGVhZCArIDEpICYKIAkJCQkoSElEREVWX0JVRkZFUl9TSVpFIC0gMSk7CiAJCQlraWxsX2Zhc3luYygmbGlzdC0+ZmFzeW5jLCBTSUdJTywgUE9MTF9JTik7CiAJCX0KQEAgLTE3OSw5ICsxNzksOSBAQAogCXVuc2lnbmVkIHR5cGUgPSBmaWVsZC0+cmVwb3J0X3R5cGU7CiAJc3RydWN0IGhpZGRldl91c2FnZV9yZWYgdXJlZjsKIAotCXVyZWYucmVwb3J0X3R5cGUgPSAKKwl1cmVmLnJlcG9ydF90eXBlID0KIAkgICh0eXBlID09IEhJRF9JTlBVVF9SRVBPUlQpID8gSElEX1JFUE9SVF9UWVBFX0lOUFVUIDoKLQkgICgodHlwZSA9PSBISURfT1VUUFVUX1JFUE9SVCkgPyBISURfUkVQT1JUX1RZUEVfT1VUUFVUIDogCisJICAoKHR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpID8gSElEX1JFUE9SVF9UWVBFX09VVFBVVCA6CiAJICAgKCh0eXBlID09IEhJRF9GRUFUVVJFX1JFUE9SVCkgPyBISURfUkVQT1JUX1RZUEVfRkVBVFVSRTowKSk7CiAJdXJlZi5yZXBvcnRfaWQgPSBmaWVsZC0+cmVwb3J0LT5pZDsKIAl1cmVmLmZpZWxkX2luZGV4ID0gZmllbGQtPmluZGV4OwpAQCAtMTk5LDkgKzE5OSw5IEBACiAJc3RydWN0IGhpZGRldl91c2FnZV9yZWYgdXJlZjsKIAogCW1lbXNldCgmdXJlZiwgMCwgc2l6ZW9mKHVyZWYpKTsKLQl1cmVmLnJlcG9ydF90eXBlID0gCisJdXJlZi5yZXBvcnRfdHlwZSA9CiAJICAodHlwZSA9PSBISURfSU5QVVRfUkVQT1JUKSA/IEhJRF9SRVBPUlRfVFlQRV9JTlBVVCA6Ci0JICAoKHR5cGUgPT0gSElEX09VVFBVVF9SRVBPUlQpID8gSElEX1JFUE9SVF9UWVBFX09VVFBVVCA6IAorCSAgKCh0eXBlID09IEhJRF9PVVRQVVRfUkVQT1JUKSA/IEhJRF9SRVBPUlRfVFlQRV9PVVRQVVQgOgogCSAgICgodHlwZSA9PSBISURfRkVBVFVSRV9SRVBPUlQpID8gSElEX1JFUE9SVF9UWVBFX0ZFQVRVUkU6MCkpOwogCXVyZWYucmVwb3J0X2lkID0gcmVwb3J0LT5pZDsKIAl1cmVmLmZpZWxkX2luZGV4ID0gSElEX0ZJRUxEX0lOREVYX05PTkU7CkBAIC0yMzYsNyArMjM2LDcgQEAKIAkqbGlzdHB0ciA9ICgqbGlzdHB0ciktPm5leHQ7CiAKIAlpZiAoIS0tbGlzdC0+aGlkZGV2LT5vcGVuKSB7Ci0JCWlmIChsaXN0LT5oaWRkZXYtPmV4aXN0KSAKKwkJaWYgKGxpc3QtPmhpZGRldi0+ZXhpc3QpCiAJCQloaWRfY2xvc2UobGlzdC0+aGlkZGV2LT5oaWQpOwogCQllbHNlCiAJCQlrZnJlZShsaXN0LT5oaWRkZXYpOwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJCWlmIChsaXN0LT5oZWFkID09IGxpc3QtPnRhaWwpIHsKIAkJCWFkZF93YWl0X3F1ZXVlKCZsaXN0LT5oaWRkZXYtPndhaXQsICZ3YWl0KTsKIAkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkKKwogCQkJd2hpbGUgKGxpc3QtPmhlYWQgPT0gbGlzdC0+dGFpbCkgewogCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewogCQkJCQlyZXR2YWwgPSAtRUFHQUlOOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAJCQkJCXJldHZhbCA9IC1FSU87CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQkKKwogCQkJCXNjaGVkdWxlKCk7CiAJCQl9CiAKQEAgLTMyOSw3ICszMjksNyBAQAogCQkJcmV0dXJuIHJldHZhbDsKIAogCi0JCXdoaWxlIChsaXN0LT5oZWFkICE9IGxpc3QtPnRhaWwgJiYgCisJCXdoaWxlIChsaXN0LT5oZWFkICE9IGxpc3QtPnRhaWwgJiYKIAkJICAgICAgIHJldHZhbCArIGV2ZW50X3NpemUgPD0gY291bnQpIHsKIAkJCWlmICgobGlzdC0+ZmxhZ3MgJiBISURERVZfRkxBR19VUkVGKSA9PSAwKSB7CiAJCQkJaWYgKGxpc3QtPmJ1ZmZlcltsaXN0LT50YWlsXS5maWVsZF9pbmRleCAhPQpAQCAtNDA1LDEwICs0MDUsMTAgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCWZvciAoaSA9IDA7IGkgPCBoaWQtPm1heGNvbGxlY3Rpb247IGkrKykKLQkJCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSAKKwkJCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PQogCQkJICAgIEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OICYmIGFyZy0tID09IDApCiAJCQkJYnJlYWs7Ci0JCQorCiAJCWlmIChpID09IGhpZC0+bWF4Y29sbGVjdGlvbikKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC01NjIsNyArNTYyLDcgQEAKIAkJaWYgKCF1cmVmX211bHRpKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCXVyZWYgPSAmdXJlZl9tdWx0aS0+dXJlZjsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKHVyZWYsIHVzZXJfYXJnLCBzaXplb2YoKnVyZWYpKSkgCisJCWlmIChjb3B5X2Zyb21fdXNlcih1cmVmLCB1c2VyX2FyZywgc2l6ZW9mKCp1cmVmKSkpCiAJCQlnb3RvIGZhdWx0OwogCiAJCXJpbmZvLnJlcG9ydF90eXBlID0gdXJlZi0+cmVwb3J0X3R5cGU7CkBAIC01OTUsNyArNTk1LDcgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCQl1cmVmID0gJnVyZWZfbXVsdGktPnVyZWY7CiAJCWlmIChjbWQgPT0gSElESU9DR1VTQUdFUyB8fCBjbWQgPT0gSElESU9DU1VTQUdFUykgewotCQkJaWYgKGNvcHlfZnJvbV91c2VyKHVyZWZfbXVsdGksIHVzZXJfYXJnLCAKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih1cmVmX211bHRpLCB1c2VyX2FyZywKIAkJCQkJICAgc2l6ZW9mKCp1cmVmX211bHRpKSkpCiAJCQkJZ290byBmYXVsdDsKIAkJfSBlbHNlIHsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCQkJCWdvdG8gZmF1bHQ7CiAJCX0KIAotCQlpZiAoY21kICE9IEhJRElPQ0dVU0FHRSAmJiAKKwkJaWYgKGNtZCAhPSBISURJT0NHVVNBR0UgJiYKIAkJICAgIGNtZCAhPSBISURJT0NHVVNBR0VTICYmCiAJCSAgICB1cmVmLT5yZXBvcnRfdHlwZSA9PSBISURfUkVQT1JUX1RZUEVfSU5QVVQpCiAJCQlnb3RvIGludmFsOwpAQCAtNjUxLDE2ICs2NTEsMTYgQEAKIAkJCQlyZXR1cm4gZmllbGQtPnVzYWdlW3VyZWYtPnVzYWdlX2luZGV4XS5jb2xsZWN0aW9uX2luZGV4OwogCQkJY2FzZSBISURJT0NHVVNBR0VTOgogCQkJCWZvciAoaSA9IDA7IGkgPCB1cmVmX211bHRpLT5udW1fdmFsdWVzOyBpKyspCi0JCQkJCXVyZWZfbXVsdGktPnZhbHVlc1tpXSA9IAorCQkJCQl1cmVmX211bHRpLT52YWx1ZXNbaV0gPQogCQkJCQkgICAgZmllbGQtPnZhbHVlW3VyZWYtPnVzYWdlX2luZGV4ICsgaV07Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgdXJlZl9tdWx0aSwgCisJCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgdXJlZl9tdWx0aSwKIAkJCQkJCSBzaXplb2YoKnVyZWZfbXVsdGkpKSkKIAkJCQkJZ290byBmYXVsdDsKIAkJCQlnb3RvIGdvb2RyZXR1cm47CiAJCQljYXNlIEhJRElPQ1NVU0FHRVM6CiAJCQkJZm9yIChpID0gMDsgaSA8IHVyZWZfbXVsdGktPm51bV92YWx1ZXM7IGkrKykKLQkJCQkJZmllbGQtPnZhbHVlW3VyZWYtPnVzYWdlX2luZGV4ICsgaV0gPSAKLQkJCQkgIAkgICAgdXJlZl9tdWx0aS0+dmFsdWVzW2ldOworCQkJCQlmaWVsZC0+dmFsdWVbdXJlZi0+dXNhZ2VfaW5kZXggKyBpXSA9CisJCQkJCSAgICB1cmVmX211bHRpLT52YWx1ZXNbaV07CiAJCQkJZ290byBnb29kcmV0dXJuOwogCQl9CiAKQEAgLTY3MCw3ICs2NzAsNyBAQAogZmF1bHQ6CiAJCWtmcmVlKHVyZWZfbXVsdGkpOwogCQlyZXR1cm4gLUVGQVVMVDsKLWludmFsOgkJCitpbnZhbDoKIAkJa2ZyZWUodXJlZl9tdWx0aSk7CiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03MzQsNyArNzM0LDcgQEAKIAkubmFtZSA9CQkidXNiL2hpZC9oaWRkZXYlZCIsCiAJLmZvcHMgPQkJJmhpZGRldl9mb3BzLAogCS5tb2RlID0JCVNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VTUiwKLSAgICAgICAJLm1pbm9yX2Jhc2UgPQlISURERVZfTUlOT1JfQkFTRSwKKwkubWlub3JfYmFzZSA9CUhJRERFVl9NSU5PUl9CQVNFLAogfTsKIAogLyoKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCWludCByZXR2YWw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaGlkLT5tYXhjb2xsZWN0aW9uOyBpKyspCi0JCWlmIChoaWQtPmNvbGxlY3Rpb25baV0udHlwZSA9PSAKKwkJaWYgKGhpZC0+Y29sbGVjdGlvbltpXS50eXBlID09CiAJCSAgICBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTiAmJgogCQkgICAgIUlTX0lOUFVUX0FQUExJQ0FUSU9OKGhpZC0+Y29sbGVjdGlvbltpXS51c2FnZSkpCiAJCQlicmVhazsKQEAgLTc1NSwxMSArNzU1LDExIEBACiAJaWYgKGkgPT0gaGlkLT5tYXhjb2xsZWN0aW9uICYmIChoaWQtPnF1aXJrcyAmIEhJRF9RVUlSS19ISURERVYpID09IDApCiAJCXJldHVybiAtMTsKIAotIAlpZiAoIShoaWRkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkZGV2KSwgR0ZQX0tFUk5FTCkpKQorCWlmICghKGhpZGRldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRkZXYpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtMTsKIAltZW1zZXQoaGlkZGV2LCAwLCBzaXplb2Yoc3RydWN0IGhpZGRldikpOwogCi0gCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaGlkLT5pbnRmLCAmaGlkZGV2X2NsYXNzKTsKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGhpZC0+aW50ZiwgJmhpZGRldl9jbGFzcyk7CiAJaWYgKHJldHZhbCkgewogCQllcnIoIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS4iKTsKIAkJa2ZyZWUoaGlkZGV2KTsKQEAgLTc2OCwxMiArNzY4LDEyIEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoaWRkZXYtPndhaXQpOwogCi0gCWhpZGRldl90YWJsZVtoaWQtPmludGYtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gaGlkZGV2OworCWhpZGRldl90YWJsZVtoaWQtPmludGYtPm1pbm9yIC0gSElEREVWX01JTk9SX0JBU0VdID0gaGlkZGV2OwogCiAJaGlkZGV2LT5oaWQgPSBoaWQ7CiAJaGlkZGV2LT5leGlzdCA9IDE7CiAKLSAJaGlkLT5taW5vciA9IGhpZC0+aW50Zi0+bWlub3I7CisJaGlkLT5taW5vciA9IGhpZC0+aW50Zi0+bWlub3I7CiAJaGlkLT5oaWRkZXYgPSBoaWRkZXY7CiAKIAlyZXR1cm4gMDsKQEAgLTgxOCw3ICs4MTgsNyBAQAogLyogV2UgbmV2ZXIgYXR0YWNoIGluIHRoaXMgbWFubmVyLCBhbmQgcmVseSBvbiBISUQgdG8gY29ubmVjdCB1cy4gIFRoaXMKICAqIGlzIHdoeSB0aGVyZSBpcyBubyBkaXNjb25uZWN0IHJvdXRpbmUgZGVmaW5lZCBpbiB0aGUgdXNiX2RyaXZlciBlaXRoZXIuCiAgKi8KLXN0YXRpYyBpbnQgaGlkZGV2X3VzYmRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIAorc3RhdGljIGludCBoaWRkZXZfdXNiZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmhpZGRldl9pbmZvKQogewogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaXRtdG91Y2guYyBiL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkZWM2YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGl0bXRvdWNoLmMgIC0tICBEcml2ZXIgZm9yIElUTSB0b3VjaHNjcmVlbiBwYW5lbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEJhc2VkIHVwb24gb3JpZ2luYWwgd29yayBieSBDaHJpcyBDb2xsaW5zIDx4ZmlyZS1pdG10b3VjaEB4d2FyZS5jeD4uCisgKgorICogS3Vkb3MgdG8gSVRNIGZvciBwcm92aWRpbmcgbWUgd2l0aCB0aGUgZGF0YXNoZWV0IGZvciB0aGUgcGFuZWwsCisgKiBldmVuIHRob3VnaCBpdCB3YXMgYSBkYXkgbGF0ZXIgdGhhbiBJIGhhZCBmaW5pc2hlZCB3cml0aW5nIHRoaXMKKyAqIGRyaXZlci4KKyAqCisgKiBJdCBoYXMgbWVhbnQgdGhhdCBJJ3ZlIGJlZW4gYWJsZSB0byBjb3JyZWN0IG15IGludGVycHJldGF0aW9uIG9mIHRoZQorICogcHJvdG9jb2wgcGFja2V0cyBob3dldmVyLgorICoKKyAqIENDIC0tIDIwMDMvOS8yOQorICoKKyAqIEhpc3RvcnkKKyAqIDEuMCAmIDEuMSAgMjAwMyAoQ0MpIHZvanRlY2hAc3VzZS5jegorICogICBPcmlnaW5hbCB2ZXJzaW9uIGZvciAyLjQueCBrZXJuZWxzCisgKgorICogMS4yICAwMi8wMy8yMDA1IChIQ0UpIGhjQG1pdnUubm8KKyAqICAgQ29tcGxldGUgcmV3cml0ZSB0byBzdXBwb3J0IExpbnV4IDIuNi4xMCwgdGhhbmtzIHRvIG10b3VjaHVzYi5jIGZvciBoaW50cy4KKyAqICAgVW5mb3J0dW5hdGVseSBubyBjYWxpYnJhdGlvbiBzdXBwb3J0IGF0IHRoaXMgdGltZS4KKyAqCisgKiAxLjIuMSAgMDkvMDMvMjAwNSAoSENFKSBoY0BtaXZ1Lm5vCisgKiAgIENvZGUgY2xlYW51cCBhbmQgYWRqdXN0aW5nIHN5bnRheCB0byBzdGFydCBtYXRjaGluZyBrZXJuZWwgc3RhbmRhcmRzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfVVNCX0RFQlVHCisJI2RlZmluZSBERUJVRworI2Vsc2UKKwkjdW5kZWYgREVCVUcKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCisvKiBvbmx5IGFuIDggYnl0ZSBidWZmZXIgbmVjZXNzYXJ5IGZvciBhIHNpbmdsZSBwYWNrZXQgKi8KKyNkZWZpbmUgSVRNX0JVRlNJWkUJCQk4CisjZGVmaW5lIFBBVEhfU0laRQkJCTY0CisKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9JVE1JTkMJCTB4MDQwMworI2RlZmluZSBVU0JfUFJPRFVDVF9JRF9UT1VDSFBBTkVMCTB4ZjllOQorCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkhhbnMtQ2hyaXN0aWFuIEVndHZlZHQgPGhjQG1pdnUubm8+IgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuMi4xIgorI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIElUTSBJbmMgVG91Y2ggUGFuZWwgRHJpdmVyIgorI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgorCitNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CitNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfTElDRU5TRSggRFJJVkVSX0xJQ0VOU0UgKTsKKworc3RydWN0IGl0bXRvdWNoX2RldiB7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVzYmRldjsgLyogdXNiIGRldmljZSAqLworCXN0cnVjdCBpbnB1dF9kZXYJaW5wdXRkZXY7IC8qIGlucHV0IGRldmljZSAqLworCXN0cnVjdCB1cmIJCSpyZWFkdXJiOyAvKiB1cmIgKi8KKwljaGFyCQkJcmJ1ZltJVE1fQlVGU0laRV07IC8qIGRhdGEgKi8KKwlpbnQJCQl1c2VyczsKKwljaGFyIG5hbWVbMTI4XTsKKwljaGFyIHBoeXNbNjRdOworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGl0bXRvdWNoX2lkcyBbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9JVE1JTkMsIFVTQl9QUk9EVUNUX0lEX1RPVUNIUEFORUwpIH0sCisJeyB9Cit9OworCitzdGF0aWMgdm9pZCBpdG10b3VjaF9pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaXRtdG91Y2hfZGV2ICogaXRtdG91Y2ggPSB1cmItPmNvbnRleHQ7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZpdG10b3VjaC0+aW5wdXRkZXY7CisJaW50IHJldHZhbDsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRVRJTUVET1VUOgorCQkvKiB0aGlzIHVyYiBpcyB0aW1pbmcgb3V0ICovCisJCWRiZygiJXMgLSB1cmIgdGltZWQgb3V0IC0gd2FzIHRoZSBkZXZpY2UgdW5wbHVnZ2VkPyIsCisJCSAgICBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLAorCQkgICAgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpbnB1dF9yZWdzKGRldiwgcmVncyk7CisKKwkvKiBpZiBwcmVzc3VyZSBoYXMgYmVlbiByZWxlYXNlZCwgdGhlbiBkb24ndCByZXBvcnQgWC9ZICovCisJaWYgKGRhdGFbN10gJiAweDIwKSB7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgKGRhdGFbMF0gJiAweDFGKSA8PCA3IHwgKGRhdGFbM10gJiAweDdGKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgKGRhdGFbMV0gJiAweDFGKSA8PCA3IHwgKGRhdGFbNF0gJiAweDdGKSk7CisJfQorCisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgKGRhdGFbMl0gJiAxKSA8PCA3IHwgKGRhdGFbNV0gJiAweDdGKSk7CisJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgfmRhdGFbN10gJiAweDIwKTsKKwlpbnB1dF9zeW5jKGRldik7CisKK2V4aXQ6CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldHZhbCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdDogJWQiLAorCQkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKK30KKworc3RhdGljIGludCBpdG10b3VjaF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworCXN0cnVjdCBpdG10b3VjaF9kZXYgKml0bXRvdWNoID0gaW5wdXQtPnByaXZhdGU7CisKKwlpdG10b3VjaC0+cmVhZHVyYi0+ZGV2ID0gaXRtdG91Y2gtPnVzYmRldjsKKworCWlmICh1c2Jfc3VibWl0X3VyYihpdG10b3VjaC0+cmVhZHVyYiwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGl0bXRvdWNoX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQoreworCXN0cnVjdCBpdG10b3VjaF9kZXYgKml0bXRvdWNoID0gaW5wdXQtPnByaXZhdGU7CisKKwl1c2Jfa2lsbF91cmIoaXRtdG91Y2gtPnJlYWR1cmIpOworfQorCitzdGF0aWMgaW50IGl0bXRvdWNoX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGl0bXRvdWNoX2RldiAqaXRtdG91Y2g7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXVuc2lnbmVkIGludCBwaXBlOworCXVuc2lnbmVkIGludCBtYXhwOworCWNoYXIgcGF0aFtQQVRIX1NJWkVdOworCisJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOworCisJaWYgKCEoaXRtdG91Y2ggPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaXRtdG91Y2hfZGV2KSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5LiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWl0bXRvdWNoLT51c2JkZXYgPSB1ZGV2OworCisJaXRtdG91Y2gtPmlucHV0ZGV2LnByaXZhdGUgPSBpdG10b3VjaDsKKwlpdG10b3VjaC0+aW5wdXRkZXYub3BlbiA9IGl0bXRvdWNoX29wZW47CisJaXRtdG91Y2gtPmlucHV0ZGV2LmNsb3NlID0gaXRtdG91Y2hfY2xvc2U7CisKKwl1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIFBBVEhfU0laRSk7CisKKwlpdG10b3VjaC0+aW5wdXRkZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOworCWl0bXRvdWNoLT5pbnB1dGRldi5hYnNiaXRbMF0gPSBCSVQoQUJTX1gpIHwgQklUKEFCU19ZKSB8IEJJVChBQlNfUFJFU1NVUkUpOworCWl0bXRvdWNoLT5pbnB1dGRldi5rZXliaXRbTE9ORyhCVE5fVE9VQ0gpXSA9IEJJVChCVE5fVE9VQ0gpOworCisJaXRtdG91Y2gtPmlucHV0ZGV2Lm5hbWUgPSBpdG10b3VjaC0+bmFtZTsKKwlpdG10b3VjaC0+aW5wdXRkZXYucGh5cyA9IGl0bXRvdWNoLT5waHlzOworCWl0bXRvdWNoLT5pbnB1dGRldi5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwlpdG10b3VjaC0+aW5wdXRkZXYuaWQudmVuZG9yID0gdWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcjsKKwlpdG10b3VjaC0+aW5wdXRkZXYuaWQucHJvZHVjdCA9IHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0OworCWl0bXRvdWNoLT5pbnB1dGRldi5pZC52ZXJzaW9uID0gdWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2U7CisJaXRtdG91Y2gtPmlucHV0ZGV2LmRldiA9ICZpbnRmLT5kZXY7CisKKwlpZiAoIXN0cmxlbihpdG10b3VjaC0+bmFtZSkpCisJCXNwcmludGYoaXRtdG91Y2gtPm5hbWUsICJVU0IgSVRNIHRvdWNoc2NyZWVuIik7CisKKwkvKiBkZXZpY2UgbGltaXRzICovCisJLyogYXMgc3BlY2lmaWVkIGJ5IHRoZSBJVE0gZGF0YXNoZWV0LCBYIGFuZCBZIGFyZSAxMmJpdCwKKwkgKiBaIChwcmVzc3VyZSkgaXMgOCBiaXQuIEhvd2V2ZXIsIHRoZSBmaWVsZHMgYXJlIGRlZmluZWQgdXAKKwkgKiB0byAxNCBiaXRzIGZvciBmdXR1cmUgcG9zc2libGUgZXhwYW5zaW9uLgorCSAqLworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZpdG10b3VjaC0+aW5wdXRkZXYsIEFCU19YLCAwLCAweDBGRkYsIDIsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZpdG10b3VjaC0+aW5wdXRkZXYsIEFCU19ZLCAwLCAweDBGRkYsIDIsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKCZpdG10b3VjaC0+aW5wdXRkZXYsIEFCU19QUkVTU1VSRSwgMCwgMHhGRiwgMiwgMCk7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBVUkIgc28gd2UgY2FuIHJlYWQgZnJvbSB0aGUgdHJhbnNwb3J0IHN0cmVhbSAqLworCXBpcGUgPSB1c2JfcmN2aW50cGlwZShpdG10b3VjaC0+dXNiZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CisJbWF4cCA9IHVzYl9tYXhwYWNrZXQodWRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCisJaWYgKG1heHAgPiBJVE1fQlVGU0laRSkKKwkJbWF4cCA9IElUTV9CVUZTSVpFOworCisJaXRtdG91Y2gtPnJlYWR1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCisJaWYgKCFpdG10b3VjaC0+cmVhZHVyYikgeworCQlkYmcoIiVzIC0gdXNiX2FsbG9jX3VyYiBmYWlsZWQ6IGl0bXRvdWNoLT5yZWFkdXJiIiwgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUoaXRtdG91Y2gpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl1c2JfZmlsbF9pbnRfdXJiKGl0bXRvdWNoLT5yZWFkdXJiLCBpdG10b3VjaC0+dXNiZGV2LCBwaXBlLCBpdG10b3VjaC0+cmJ1ZiwKKwkJCSBtYXhwLCBpdG10b3VjaF9pcnEsIGl0bXRvdWNoLCBlbmRwb2ludC0+YkludGVydmFsKTsKKworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmaXRtdG91Y2gtPmlucHV0ZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIml0bXRvdWNoOiAlcyByZWdpc3RlcmVkIG9uICVzXG4iLCBpdG10b3VjaC0+bmFtZSwgcGF0aCk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBpdG10b3VjaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXRtdG91Y2hfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgaXRtdG91Y2hfZGV2ICppdG10b3VjaCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCisJaWYgKGl0bXRvdWNoKSB7CisJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZpdG10b3VjaC0+aW5wdXRkZXYpOworCQl1c2Jfa2lsbF91cmIoaXRtdG91Y2gtPnJlYWR1cmIpOworCQl1c2JfZnJlZV91cmIoaXRtdG91Y2gtPnJlYWR1cmIpOworCQlrZnJlZShpdG10b3VjaCk7CisJfQorfQorCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaXRtdG91Y2hfaWRzKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGl0bXRvdWNoX2RyaXZlciA9IHsKKwkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCisJLm5hbWUgPSAgICAgICAgICJpdG10b3VjaCIsCisJLnByb2JlID0gICAgICAgIGl0bXRvdWNoX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gICBpdG10b3VjaF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9ICAgICBpdG10b3VjaF9pZHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpdG10b3VjaF9pbml0KHZvaWQpCit7CisJaW5mbyhEUklWRVJfREVTQyAiICIgRFJJVkVSX1ZFUlNJT04pOworCWluZm8oRFJJVkVSX0FVVEhPUik7CisJcmV0dXJuIHVzYl9yZWdpc3RlcigmaXRtdG91Y2hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGl0bXRvdWNoX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3RlcigmaXRtdG91Y2hfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaXRtdG91Y2hfaW5pdCk7Cittb2R1bGVfZXhpdChpdG10b3VjaF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2tidGFiLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9rYnRhYi5jCmluZGV4IGE2OGM1YjQuLmQyZjBmOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2tidGFiLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQva2J0YWIuYwpAQCAtMzYsNyArMzYsNiBAQAogCXN0cnVjdCBpbnB1dF9kZXYgZGV2OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CiAJc3RydWN0IHVyYiAqaXJxOwotCWludCBvcGVuOwogCWludCB4LCB5OwogCWludCBidXR0b247CiAJaW50IHByZXNzdXJlOwpAQCAtNzksMTIgKzc4LDEyIEBACiAJLyppbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNIICwgZGF0YVswXSAmIDB4MDEpOyovCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgZGF0YVswXSAmIDB4MDIpOwogCi0JaWYoIC0xID09IGtiX3ByZXNzdXJlX2NsaWNrKXsgCisJaWYgKC0xID09IGtiX3ByZXNzdXJlX2NsaWNrKSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIGtidGFiLT5wcmVzc3VyZSk7CiAJfSBlbHNlIHsKIAkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAoa2J0YWItPnByZXNzdXJlID4ga2JfcHJlc3N1cmVfY2xpY2spID8gMSA6IDApOwogCX07Ci0JCisKIAlpbnB1dF9zeW5jKGRldik7CiAKICBleGl0OgpAQCAtMTA1LDE0ICsxMDQsOSBAQAogewogCXN0cnVjdCBrYnRhYiAqa2J0YWIgPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAoa2J0YWItPm9wZW4rKykKLQkJcmV0dXJuIDA7Ci0KIAlrYnRhYi0+aXJxLT5kZXYgPSBrYnRhYi0+dXNiZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYihrYnRhYi0+aXJxLCBHRlBfS0VSTkVMKSkgewotCQlrYnRhYi0+b3Blbi0tOworCWlmICh1c2Jfc3VibWl0X3VyYihrYnRhYi0+aXJxLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FSU87Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjEsOCArMTE1LDcgQEAKIHsKIAlzdHJ1Y3Qga2J0YWIgKmtidGFiID0gZGV2LT5wcml2YXRlOwogCi0JaWYgKCEtLWtidGFiLT5vcGVuKQotCQl1c2Jfa2lsbF91cmIoa2J0YWItPmlycSk7CisJdXNiX2tpbGxfdXJiKGtidGFiLT5pcnEpOwogfQogCiBzdGF0aWMgaW50IGtidGFiX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCkBAIC0xNjEsNyArMTU0LDcgQEAKIAlrYnRhYi0+ZGV2LmFic21heFtBQlNfWF0gPSAweDIwMDA7CiAJa2J0YWItPmRldi5hYnNtYXhbQUJTX1ldID0gMHgxNzUwOwogCWtidGFiLT5kZXYuYWJzbWF4W0FCU19QUkVTU1VSRV0gPSAweGZmOwotCQorCiAJa2J0YWItPmRldi5hYnNmdXp6W0FCU19YXSA9IDQ7CiAJa2J0YWItPmRldi5hYnNmdXp6W0FCU19ZXSA9IDQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZGM5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICoga2V5c3Bhbl9yZW1vdGU6IFVTQiBkcml2ZXIgZm9yIHRoZSBLZXlzcGFuIERNUgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBaeW1ldGEgQ29ycG9yYXRpb24gLSBNaWNoYWVsIERvd25leSAoZG93bmV5QHp5bWV0YS5jb20pCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBkcml2ZXIgaGFzIGJlZW4gcHV0IHRvZ2V0aGVyIHdpdGggdGhlIHN1cHBvcnQgb2YgSW5ub3N5cywgSW5jLgorICogYW5kIEtleXNwYW4sIEluYyB0aGUgbWFudWZhY3R1cmVycyBvZiB0aGUgS2V5c3BhbiBVU0IgRE1SIHByb2R1Y3QuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JInYwLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJIk1pY2hhZWwgRG93bmV5IDxkb3duZXlAenltZXRhLmNvbT4iCisjZGVmaW5lIERSSVZFUl9ERVNDCSJEcml2ZXIgZm9yIHRoZSBVU0IgS2V5c3BhbiByZW1vdGUgY29udHJvbC4iCisjZGVmaW5lIERSSVZFUl9MSUNFTlNFCSJHUEwiCisKKy8qIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBkcml2ZXIuICovCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBleHRyYSBkZWJ1ZyBtZXNzYWdlcyBhbmQgaW5mb3JtYXRpb24iKTsKKworLyogVmVuZG9yIGFuZCBwcm9kdWN0IGlkcyAqLworI2RlZmluZSBVU0JfS0VZU1BBTl9WRU5ET1JfSUQJCTB4MDZDRAorI2RlZmluZSBVU0JfS0VZU1BBTl9QUk9EVUNUX1VJQTExCTB4MDIwMgorCisvKiBEZWZpbmVzIGZvciBjb252ZXJ0aW5nIHRoZSBkYXRhIGZyb20gdGhlIHJlbW90ZS4gKi8KKyNkZWZpbmUgWkVSTwkJMHgxOAorI2RlZmluZSBaRVJPX01BU0sJMHgxRgkvKiA1IGJpdHMgZm9yIGEgMCAqLworI2RlZmluZSBPTkUJCTB4M0MKKyNkZWZpbmUgT05FX01BU0sJMHgzRgkvKiA2IGJpdHMgZm9yIGEgMSAqLworI2RlZmluZSBTWU5DCQkweDNGODAKKyNkZWZpbmUgU1lOQ19NQVNLCTB4M0ZGRgkvKiAxNCBiaXRzIGZvciBhIFNZTkMgc2VxdWVuY2UgKi8KKyNkZWZpbmUgU1RPUAkJMHgwMAorI2RlZmluZSBTVE9QX01BU0sJMHgxRgkvKiA1IGJpdHMgZm9yIHRoZSBTVE9QIHNlcXVlbmNlICovCisjZGVmaW5lIEdBUAkJMHhGRgorCisjZGVmaW5lIFJFQ1ZfU0laRQk4CS8qIFRoZSBVSUEtMTEgdHlwZSBoYXZlIGEgOCBieXRlIGxpbWl0LiAqLworCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQga2V5c3Bhbl90YWJsZVtdID0geworCXsgVVNCX0RFVklDRShVU0JfS0VZU1BBTl9WRU5ET1JfSUQsIFVTQl9LRVlTUEFOX1BST0RVQ1RfVUlBMTEpIH0sCisJeyB9CQkJCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworLyogU3RydWN0dXJlIHRvIHN0b3JlIGFsbCB0aGUgcmVhbCBzdHVmZiB0aGF0IGEgcmVtb3RlIHNlbmRzIHRvIHVzLiAqLworc3RydWN0IGtleXNwYW5fbWVzc2FnZSB7CisJdTE2CXN5c3RlbTsKKwl1OAlidXR0b247CisJdTgJdG9nZ2xlOworfTsKKworLyogU3RydWN0dXJlIHVzZWQgZm9yIGFsbCB0aGUgYml0IHRlc3RpbmcgbWFnaWMgbmVlZGVkIHRvIGJlIGRvbmUuICovCitzdHJ1Y3QgYml0X3Rlc3RlciB7CisJdTMyCXRlc3RlcjsKKwlpbnQJbGVuOworCWludAlwb3M7CisJaW50CWJpdHNfbGVmdDsKKwl1OAlidWZmZXJbMzJdOworfTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkcml2ZXIgc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCB1c2Jfa2V5c3BhbiB7CisJY2hhcgkJCQluYW1lWzEyOF07CisJY2hhcgkJCQlwaHlzWzY0XTsKKwlzdHJ1Y3QgdXNiX2RldmljZSoJCXVkZXY7CisJc3RydWN0IGlucHV0X2RldgkJaW5wdXQ7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UqCQlpbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbl9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJCWlycV91cmI7CisJaW50CQkJCW9wZW47CisJZG1hX2FkZHJfdAkJCWluX2RtYTsKKwl1bnNpZ25lZCBjaGFyKgkJCWluX2J1ZmZlcjsKKworCS8qIHZhcmlhYmxlcyB1c2VkIHRvIHBhcnNlIG1lc3NhZ2VzIGZyb20gcmVtb3RlLiAqLworCXN0cnVjdCBiaXRfdGVzdGVyCQlkYXRhOworCWludAkJCQlzdGFnZTsKKwlpbnQJCQkJdG9nZ2xlOworfTsKKworLyoKKyAqIFRhYmxlIHRoYXQgbWFwcyB0aGUgMzEgcG9zc2libGUga2V5Y29kZXMgdG8gaW5wdXQga2V5cy4KKyAqIEN1cnJlbnRseSB0aGVyZSBhcmUgMTUgYW5kIDE3IGJ1dHRvbiBtb2RlbHMgc28gUkVTRVJWRUQgY29kZXMKKyAqIGFyZSBibGFuayBhcmVhcyBpbiB0aGUgbWFwcGluZy4KKyAqLworc3RhdGljIGludCBrZXlzcGFuX2tleV90YWJsZVtdID0geworCUtFWV9SRVNFUlZFRCwJCS8qIDAgaXMganVzdCBhIHBsYWNlIGhvbGRlci4gKi8KKwlLRVlfUkVTRVJWRUQsCisJS0VZX1NUT1AsCisJS0VZX1BMQVlDRCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1BSRVZJT1VTU09ORywKKwlLRVlfUkVXSU5ELAorCUtFWV9GT1JXQVJELAorCUtFWV9ORVhUU09ORywKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUEFVU0UsCisJS0VZX1ZPTFVNRVVQLAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVELAorCUtFWV9WT0xVTUVET1dOLAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfVVAsCisJS0VZX1JFU0VSVkVELAorCUtFWV9NVVRFLAorCUtFWV9MRUZULAorCUtFWV9FTlRFUiwKKwlLRVlfUklHSFQsCisJS0VZX1JFU0VSVkVELAorCUtFWV9SRVNFUlZFRCwKKwlLRVlfRE9XTiwKKwlLRVlfUkVTRVJWRUQsCisJS0VZX0tQQVNURVJJU0ssCisJS0VZX1JFU0VSVkVELAorCUtFWV9NRU5VCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIga2V5c3Bhbl9kcml2ZXI7CisKKy8qCisgKiBEZWJ1ZyByb3V0aW5lIHRoYXQgcHJpbnRzIG91dCB3aGF0IHdlJ3ZlIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZS4KKyAqLworc3RhdGljIHZvaWQga2V5c3Bhbl9wcmludChzdHJ1Y3QgdXNiX2tleXNwYW4qIGRldikgLyp1bnNpZ25lZCBjaGFyKiBkYXRhKSovCit7CisJY2hhciBjb2Rlc1s0KlJFQ1ZfU0laRV07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVDVl9TSVpFOyBpKyspIHsKKwkJc25wcmludGYoY29kZXMraSozLCA0LCAiJTAyeCAiLCBkZXYtPmluX2J1ZmZlcltpXSk7CisJfQorCisJZGV2X2luZm8oJmRldi0+dWRldi0+ZGV2LCAiJXNcbiIsIGNvZGVzKTsKK30KKworLyoKKyAqIFJvdXRpbmUgdGhhdCBtYW5hZ2VzIHRoZSBiaXRfdGVzdGVyIHN0cnVjdHVyZS4gIEl0IG1ha2VzIHN1cmUgdGhhdCB0aGVyZSBhcmUKKyAqIGF0IGxlYXN0IGJpdHNfbmVlZGVkIGJpdHMgbG9hZGVkIGludG8gdGhlIHRlc3Rlci4KKyAqLworc3RhdGljIGludCBrZXlzcGFuX2xvYWRfdGVzdGVyKHN0cnVjdCB1c2Jfa2V5c3BhbiogZGV2LCBpbnQgYml0c19uZWVkZWQpCit7CisJaWYgKGRldi0+ZGF0YS5iaXRzX2xlZnQgPj0gYml0c19uZWVkZWQpCisJCXJldHVybigwKTsKKworCS8qCisJICogU29tZWhvdyB3ZSd2ZSBtaXNzZWQgdGhlIGxhc3QgbWVzc2FnZS4gVGhlIG1lc3NhZ2Ugd2lsbCBiZSByZXBlYXRlZAorCSAqIHRob3VnaCBzbyBpdCdzIG5vdCB0b28gYmlnIGEgZGVhbAorCSAqLworCWlmIChkZXYtPmRhdGEucG9zID49IGRldi0+ZGF0YS5sZW4pIHsKKwkJZGV2X2RiZygmZGV2LT51ZGV2LCAiJXMgLSBFcnJvciByYW4gb3V0IG9mIGRhdGEuIHBvczogJWQsIGxlbjogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGRldi0+ZGF0YS5wb3MsIGRldi0+ZGF0YS5sZW4pOworCQlyZXR1cm4oLTEpOworCX0KKworCS8qIExvYWQgYXMgbXVjaCBhcyB3ZSBjYW4gaW50byB0aGUgdGVzdGVyLiAqLworCXdoaWxlICgoZGV2LT5kYXRhLmJpdHNfbGVmdCArIDcgPCAoc2l6ZW9mKGRldi0+ZGF0YS50ZXN0ZXIpICogOCkpICYmCisJICAgICAgIChkZXYtPmRhdGEucG9zIDwgZGV2LT5kYXRhLmxlbikpIHsKKwkJZGV2LT5kYXRhLnRlc3RlciArPSAoZGV2LT5kYXRhLmJ1ZmZlcltkZXYtPmRhdGEucG9zKytdIDw8IGRldi0+ZGF0YS5iaXRzX2xlZnQpOworCQlkZXYtPmRhdGEuYml0c19sZWZ0ICs9IDg7CisJfQorCisJcmV0dXJuKDApOworfQorCisvKgorICogUm91dGluZSB0aGF0IGhhbmRsZXMgYWxsIHRoZSBsb2dpYyBuZWVkZWQgdG8gcGFyc2Ugb3V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIHJlbW90ZS4KKyAqLworc3RhdGljIHZvaWQga2V5c3Bhbl9jaGVja19kYXRhKHN0cnVjdCB1c2Jfa2V5c3BhbiAqcmVtb3RlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBrZXlzcGFuX21lc3NhZ2UgbWVzc2FnZTsKKworCXN3aXRjaChyZW1vdGUtPnN0YWdlKSB7CisJY2FzZSAwOgorCQkvKgorCQkgKiBJbiBzdGFnZSAwIHdlIHdhbnQgdG8gZmluZCB0aGUgc3RhcnQgb2YgYSBtZXNzYWdlLiAgVGhlIHJlbW90ZSBzZW5kcyBhIDB4RkYgYXMgZmlsbGVyLgorCQkgKiBTbyB0aGUgZmlyc3QgYnl0ZSB0aGF0IGlzbid0IGEgRkYgc2hvdWxkIGJlIHRoZSBzdGFydCBvZiBhIG5ldyBtZXNzYWdlLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFJFQ1ZfU0laRSAmJiByZW1vdGUtPmluX2J1ZmZlcltpXSA9PSBHQVA7ICsraSk7CisKKwkJaWYgKGkgPCBSRUNWX1NJWkUpIHsKKwkJCW1lbWNweShyZW1vdGUtPmRhdGEuYnVmZmVyLCByZW1vdGUtPmluX2J1ZmZlciwgUkVDVl9TSVpFKTsKKwkJCXJlbW90ZS0+ZGF0YS5sZW4gPSBSRUNWX1NJWkU7CisJCQlyZW1vdGUtPmRhdGEucG9zID0gMDsKKwkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSAwOworCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCA9IDA7CisJCQlyZW1vdGUtPnN0YWdlID0gMTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMToKKwkJLyoKKwkJICogU3RhZ2UgMSB3ZSBzaG91bGQgaGF2ZSAxNiBieXRlcyBhbmQgc2hvdWxkIGJlIGFibGUgdG8gZGV0ZWN0IGEKKwkJICogU1lOQy4gIFRoZSBTWU5DIGlzIDE0IGJpdHMsIDcgMCdzIGFuZCB0aGVuIDcgMSdzLgorCQkgKi8KKwkJbWVtY3B5KHJlbW90ZS0+ZGF0YS5idWZmZXIgKyByZW1vdGUtPmRhdGEubGVuLCByZW1vdGUtPmluX2J1ZmZlciwgUkVDVl9TSVpFKTsKKwkJcmVtb3RlLT5kYXRhLmxlbiArPSBSRUNWX1NJWkU7CisKKwkJZm91bmQgPSAwOworCQl3aGlsZSAoKHJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgPj0gMTQgfHwgcmVtb3RlLT5kYXRhLnBvcyA8IHJlbW90ZS0+ZGF0YS5sZW4pICYmICFmb3VuZCkgeworCQkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQkJCWlmIChrZXlzcGFuX2xvYWRfdGVzdGVyKHJlbW90ZSwgMTQpICE9IDApIHsKKwkJCQkJcmVtb3RlLT5zdGFnZSA9IDA7CisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQlpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBTWU5DX01BU0spID09IFNZTkMpIHsKKwkJCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gMTQ7CisJCQkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gMTQ7CisJCQkJCWZvdW5kID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gMTsKKwkJCQkJLS1yZW1vdGUtPmRhdGEuYml0c19sZWZ0OworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghZm91bmQpIHsKKwkJCXJlbW90ZS0+c3RhZ2UgPSAwOworCQkJcmVtb3RlLT5kYXRhLmxlbiA9IDA7CisJCX0gZWxzZSB7CisJCQlyZW1vdGUtPnN0YWdlID0gMjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgMjoKKwkJLyoKKwkJICogU3RhZ2UgMiB3ZSBzaG91bGQgaGF2ZSAyNCBieXRlcyB3aGljaCB3aWxsIGJlIGVub3VnaCBmb3IgYSBmdWxsCisJCSAqIG1lc3NhZ2UuICBXZSBuZWVkIHRvIHBhcnNlIG91dCB0aGUgc3lzdGVtIGNvZGUsIGJ1dHRvbiBjb2RlLAorCQkgKiB0b2dnbGUgY29kZSwgYW5kIHN0b3AuCisJCSAqLworCQltZW1jcHkocmVtb3RlLT5kYXRhLmJ1ZmZlciArIHJlbW90ZS0+ZGF0YS5sZW4sIHJlbW90ZS0+aW5fYnVmZmVyLCBSRUNWX1NJWkUpOworCQlyZW1vdGUtPmRhdGEubGVuICs9IFJFQ1ZfU0laRTsKKworCQltZXNzYWdlLnN5c3RlbSA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKKwkJCWtleXNwYW5fbG9hZF90ZXN0ZXIocmVtb3RlLCA2KTsKKworCQkJaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgWkVST19NQVNLKSA9PSBaRVJPKSB7CisJCQkJbWVzc2FnZS5zeXN0ZW0gPSBtZXNzYWdlLnN5c3RlbSA8PCAxOworCQkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDU7CisJCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA1OworCQkJfSBlbHNlIGlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIE9ORV9NQVNLKSA9PSBPTkUpIHsKKwkJCQltZXNzYWdlLnN5c3RlbSA9IChtZXNzYWdlLnN5c3RlbSA8PCAxKSArIDE7CisJCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNjsKKwkJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDY7CisJCQl9IGVsc2UgeworCQkJCWVycigiJXMgLSBVbmtub3duIHNlcXVlbmNlIGZvdW5kIGluIHN5c3RlbSBkYXRhLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZW1vdGUtPnN0YWdlID0gMDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQltZXNzYWdlLmJ1dHRvbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWtleXNwYW5fbG9hZF90ZXN0ZXIocmVtb3RlLCA2KTsKKworCQkJaWYgKChyZW1vdGUtPmRhdGEudGVzdGVyICYgWkVST19NQVNLKSA9PSBaRVJPKSB7CisJCQkJbWVzc2FnZS5idXR0b24gPSBtZXNzYWdlLmJ1dHRvbiA8PCAxOworCQkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDU7CisJCQkJcmVtb3RlLT5kYXRhLmJpdHNfbGVmdCAtPSA1OworCQkJfSBlbHNlIGlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIE9ORV9NQVNLKSA9PSBPTkUpIHsKKwkJCQltZXNzYWdlLmJ1dHRvbiA9IChtZXNzYWdlLmJ1dHRvbiA8PCAxKSArIDE7CisJCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNjsKKwkJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDY7CisJCQl9IGVsc2UgeworCQkJCWVycigiJXMgLSBVbmtub3duIHNlcXVlbmNlIGZvdW5kIGluIGJ1dHRvbiBkYXRhLlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlyZW1vdGUtPnN0YWdlID0gMDsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQlrZXlzcGFuX2xvYWRfdGVzdGVyKHJlbW90ZSwgNik7CisJCWlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIFpFUk9fTUFTSykgPT0gWkVSTykgeworCQkJbWVzc2FnZS50b2dnbGUgPSAwOworCQkJcmVtb3RlLT5kYXRhLnRlc3RlciA9IHJlbW90ZS0+ZGF0YS50ZXN0ZXIgPj4gNTsKKwkJCXJlbW90ZS0+ZGF0YS5iaXRzX2xlZnQgLT0gNTsKKwkJfSBlbHNlIGlmICgocmVtb3RlLT5kYXRhLnRlc3RlciAmIE9ORV9NQVNLKSA9PSBPTkUpIHsKKwkJCW1lc3NhZ2UudG9nZ2xlID0gMTsKKwkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDY7CisJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDY7CisJCX0gZWxzZSB7CisJCQllcnIoIiVzIC0gRXJyb3IgaW4gbWVzc2FnZSwgaW52YWxpZCB0b2dnbGUuXG4iLCBfX0ZVTkNUSU9OX18pOworCQl9CisKKwkJa2V5c3Bhbl9sb2FkX3Rlc3RlcihyZW1vdGUsIDUpOworCQlpZiAoKHJlbW90ZS0+ZGF0YS50ZXN0ZXIgJiBTVE9QX01BU0spID09IFNUT1ApIHsKKwkJCXJlbW90ZS0+ZGF0YS50ZXN0ZXIgPSByZW1vdGUtPmRhdGEudGVzdGVyID4+IDU7CisJCQlyZW1vdGUtPmRhdGEuYml0c19sZWZ0IC09IDU7CisJCX0gZWxzZSB7CisJCQllcnIoIkJhZCBtZXNzYWdlIHJlY2lldmVkLCBubyBzdG9wIGJpdCBmb3VuZC5cbiIpOworCQl9CisKKwkJZGV2X2RiZygmcmVtb3RlLT51ZGV2LAorCQkJIiVzIGZvdW5kIHZhbGlkIG1lc3NhZ2U6IHN5c3RlbTogJWQsIGJ1dHRvbjogJWQsIHRvZ2dsZTogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIG1lc3NhZ2Uuc3lzdGVtLCBtZXNzYWdlLmJ1dHRvbiwgbWVzc2FnZS50b2dnbGUpOworCisJCWlmIChtZXNzYWdlLnRvZ2dsZSAhPSByZW1vdGUtPnRvZ2dsZSkgeworCQkJaW5wdXRfcmVncygmcmVtb3RlLT5pbnB1dCwgcmVncyk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KCZyZW1vdGUtPmlucHV0LCBrZXlzcGFuX2tleV90YWJsZVttZXNzYWdlLmJ1dHRvbl0sIDEpOworCQkJaW5wdXRfcmVwb3J0X2tleSgmcmVtb3RlLT5pbnB1dCwga2V5c3Bhbl9rZXlfdGFibGVbbWVzc2FnZS5idXR0b25dLCAwKTsKKwkJCWlucHV0X3N5bmMoJnJlbW90ZS0+aW5wdXQpOworCQkJcmVtb3RlLT50b2dnbGUgPSBtZXNzYWdlLnRvZ2dsZTsKKwkJfQorCisJCXJlbW90ZS0+c3RhZ2UgPSAwOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBSb3V0aW5lIGZvciBzZW5kaW5nIGFsbCB0aGUgaW5pdGlhbGl6YXRpb24gbWVzc2FnZXMgdG8gdGhlIHJlbW90ZS4KKyAqLworc3RhdGljIGludCBrZXlzcGFuX3NldHVwKHN0cnVjdCB1c2JfZGV2aWNlKiBkZXYpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCQkgMHgxMSwgMHg0MCwgMHg1NjAxLCAweDAsIE5VTEwsIDAsIDApOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICIlcyAtIGZhaWxlZCB0byBzZXQgYml0IHJhdGUgZHVlIHRvIGVycm9yOiAlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCisJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkJIDB4NDQsIDB4NDAsIDB4MCwgMHgwLCBOVUxMLCAwLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9kYmcoJmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gc2V0IHJlc3VtZSBzZW5zaXRpdml0eSBkdWUgdG8gZXJyb3I6ICVkXG4iLAorCQkJX19GVU5DVElPTl9fLCByZXR2YWwpOworCQlyZXR1cm4ocmV0dmFsKTsKKwl9CisKKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKKwkJCQkgMHgyMiwgMHg0MCwgMHgwLCAweDAsIE5VTEwsIDAsIDApOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2RiZygmZGV2LT5kZXYsICIlcyAtIGZhaWxlZCB0byB0dXJuIHJlY2VpdmUgb24gZHVlIHRvIGVycm9yOiAlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCisJZGV2X2RiZygmZGV2LT5kZXYsICIlcyAtIFNldHVwIGNvbXBsZXRlLlxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIFJvdXRpbmUgdXNlZCB0byBoYW5kbGUgYSBuZXcgbWVzc2FnZSB0aGF0IGhhcyBjb21lIGluLgorICovCitzdGF0aWMgdm9pZCBrZXlzcGFuX2lycV9yZWN2KHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVzYl9rZXlzcGFuICpkZXYgPSB1cmItPmNvbnRleHQ7CisJaW50IHJldHZhbDsKKworCS8qIENoZWNrIG91ciBzdGF0dXMgaW4gY2FzZSB3ZSBuZWVkIHRvIGJhaWwgb3V0IGVhcmx5LiAqLworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCisJLyogRGV2aWNlIHdlbnQgYXdheSBzbyBkb24ndCBrZWVwIHRyeWluZyB0byByZWFkIGZyb20gaXQuICovCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQlnb3RvIHJlc3VibWl0OworCQlicmVhazsKKwl9CisKKwlpZiAoZGVidWcpCisJCWtleXNwYW5fcHJpbnQoZGV2KTsKKworCWtleXNwYW5fY2hlY2tfZGF0YShkZXYsIHJlZ3MpOworCityZXN1Ym1pdDoKKwlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2YWwpCisJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0OiAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKK30KKworc3RhdGljIGludCBrZXlzcGFuX29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCB1c2Jfa2V5c3BhbiAqcmVtb3RlID0gZGV2LT5wcml2YXRlOworCisJaWYgKHJlbW90ZS0+b3BlbisrKQorCQlyZXR1cm4gMDsKKworCXJlbW90ZS0+aXJxX3VyYi0+ZGV2ID0gcmVtb3RlLT51ZGV2OworCWlmICh1c2Jfc3VibWl0X3VyYihyZW1vdGUtPmlycV91cmIsIEdGUF9LRVJORUwpKSB7CisJCXJlbW90ZS0+b3Blbi0tOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga2V5c3Bhbl9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl9rZXlzcGFuICpyZW1vdGUgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIS0tcmVtb3RlLT5vcGVuKQorCQl1c2Jfa2lsbF91cmIocmVtb3RlLT5pcnFfdXJiKTsKK30KKworLyoKKyAqIFJvdXRpbmUgdGhhdCBzZXRzIHVwIHRoZSBkcml2ZXIgdG8gaGFuZGxlIGEgc3BlY2lmaWMgVVNCIGRldmljZSBkZXRlY3RlZCBvbiB0aGUgYnVzLgorICovCitzdGF0aWMgaW50IGtleXNwYW5fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCWNoYXIgcGF0aFs2NF07CisJY2hhciAqYnVmOworCXN0cnVjdCB1c2Jfa2V5c3BhbiAqcmVtb3RlID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworCisJLyogU2VlIGlmIHRoZSBvZmZlcmVkIGRldmljZSBtYXRjaGVzIHdoYXQgd2UgY2FuIGFjY2VwdCAqLworCWlmICgodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciAhPSBVU0JfS0VZU1BBTl9WRU5ET1JfSUQpIHx8CisJICAgICh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCAhPSBVU0JfS0VZU1BBTl9QUk9EVUNUX1VJQTExKSApCisJCXJldHVybiAtRU5PREVWOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCisJcmVtb3RlID0ga21hbGxvYyhzaXplb2YoKnJlbW90ZSksIEdGUF9LRVJORUwpOworCWlmIChyZW1vdGUgPT0gTlVMTCkgeworCQllcnIoIk91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwltZW1zZXQocmVtb3RlLCAweDAwLCBzaXplb2YoKnJlbW90ZSkpOworCisJcmVtb3RlLT51ZGV2ID0gdWRldjsKKwlyZW1vdGUtPmludGVyZmFjZSA9IGludGVyZmFjZTsKKwlyZW1vdGUtPnRvZ2dsZSA9IC0xOwkvKiBTZXQgdG8gLTEgc28gd2Ugd2lsbCBhbHdheXMgbm90IG1hdGNoIHRoZSB0b2dnbGUgZnJvbSB0aGUgZmlyc3QgcmVtb3RlIG1lc3NhZ2UuICovCisKKwkvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCisJLyogdXNlIG9ubHkgdGhlIGZpcnN0IGluIGludGVycnVwdCBlbmRwb2ludCAqLworCWlmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOworCisJCWlmICghcmVtb3RlLT5pbl9lbmRwb2ludCAmJgorCQkgICAgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgJiYKKwkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCQkvKiB3ZSBmb3VuZCBvdXIgaW50ZXJydXB0IGluIGVuZHBvaW50ICovCisJCQlyZW1vdGUtPmluX2VuZHBvaW50ID0gZW5kcG9pbnQ7CisKKwkJCXJlbW90ZS0+aW5fYnVmZmVyID0gdXNiX2J1ZmZlcl9hbGxvYyhyZW1vdGUtPnVkZXYsIFJFQ1ZfU0laRSwgU0xBQl9BVE9NSUMsICZyZW1vdGUtPmluX2RtYSk7CisJCQlpZiAoIXJlbW90ZS0+aW5fYnVmZmVyKSB7CisJCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJfQorCisJaWYgKCFyZW1vdGUtPmluX2VuZHBvaW50KSB7CisJCWVycigiQ291bGQgbm90IGZpbmQgaW50ZXJydXB0IGlucHV0IGVuZHBvaW50LlxuIik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmVtb3RlLT5pcnFfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlbW90ZS0+aXJxX3VyYikgeworCQllcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIuXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR2YWwgPSBrZXlzcGFuX3NldHVwKHJlbW90ZS0+dWRldik7CisJaWYgKHJldHZhbCkgeworCQllcnIoIkZhaWxlZCB0byBzZXR1cCBkZXZpY2UuXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKgorCSAqIFNldHVwIHRoZSBpbnB1dCBzeXN0ZW0gd2l0aCB0aGUgYml0cyB3ZSBhcmUgZ29pbmcgdG8gYmUgcmVwb3J0aW5nCisJICovCisJcmVtb3RlLT5pbnB1dC5ldmJpdFswXSA9IEJJVChFVl9LRVkpOwkJLyogV2Ugd2lsbCBvbmx5IHJlcG9ydCBLRVkgZXZlbnRzLiAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CisJCWlmIChrZXlzcGFuX2tleV90YWJsZVtpXSAhPSBLRVlfUkVTRVJWRUQpIHsKKwkJCXNldF9iaXQoa2V5c3Bhbl9rZXlfdGFibGVbaV0sIHJlbW90ZS0+aW5wdXQua2V5Yml0KTsKKwkJfQorCX0KKworCXJlbW90ZS0+aW5wdXQucHJpdmF0ZSA9IHJlbW90ZTsKKwlyZW1vdGUtPmlucHV0Lm9wZW4gPSBrZXlzcGFuX29wZW47CisJcmVtb3RlLT5pbnB1dC5jbG9zZSA9IGtleXNwYW5fY2xvc2U7CisKKwl1c2JfbWFrZV9wYXRoKHJlbW90ZS0+dWRldiwgcGF0aCwgNjQpOworCXNwcmludGYocmVtb3RlLT5waHlzLCAiJXMvaW5wdXQwIiwgcGF0aCk7CisKKwlyZW1vdGUtPmlucHV0Lm5hbWUgPSByZW1vdGUtPm5hbWU7CisJcmVtb3RlLT5pbnB1dC5waHlzID0gcmVtb3RlLT5waHlzOworCXJlbW90ZS0+aW5wdXQuaWQuYnVzdHlwZSA9IEJVU19VU0I7CisJcmVtb3RlLT5pbnB1dC5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShyZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCXJlbW90ZS0+aW5wdXQuaWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpOworCXJlbW90ZS0+aW5wdXQuaWQudmVyc2lvbiA9IGxlMTZfdG9fY3B1KHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCisJaWYgKCEoYnVmID0ga21hbGxvYyg2MywgR0ZQX0tFUk5FTCkpKSB7CisJCXVzYl9idWZmZXJfZnJlZShyZW1vdGUtPnVkZXYsIFJFQ1ZfU0laRSwgcmVtb3RlLT5pbl9idWZmZXIsIHJlbW90ZS0+aW5fZG1hKTsKKwkJa2ZyZWUocmVtb3RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pTWFudWZhY3R1cmVyICYmCisJICAgIHVzYl9zdHJpbmcocmVtb3RlLT51ZGV2LCByZW1vdGUtPnVkZXYtPmRlc2NyaXB0b3IuaU1hbnVmYWN0dXJlciwgYnVmLCA2MykgPiAwKQorCQlzdHJjYXQocmVtb3RlLT5uYW1lLCBidWYpOworCisJaWYgKHJlbW90ZS0+dWRldi0+ZGVzY3JpcHRvci5pUHJvZHVjdCAmJgorCSAgICB1c2Jfc3RyaW5nKHJlbW90ZS0+dWRldiwgcmVtb3RlLT51ZGV2LT5kZXNjcmlwdG9yLmlQcm9kdWN0LCBidWYsIDYzKSA+IDApCisJCXNwcmludGYocmVtb3RlLT5uYW1lLCAiJXMgJXMiLCByZW1vdGUtPm5hbWUsIGJ1Zik7CisKKwlpZiAoIXN0cmxlbihyZW1vdGUtPm5hbWUpKQorCQlzcHJpbnRmKHJlbW90ZS0+bmFtZSwgIlVTQiBLZXlzcGFuIFJlbW90ZSAlMDR4OiUwNHgiLAorCQkJcmVtb3RlLT5pbnB1dC5pZC52ZW5kb3IsIHJlbW90ZS0+aW5wdXQuaWQucHJvZHVjdCk7CisKKwlrZnJlZShidWYpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBVUkIgdG8gYWNjZXNzIHRoZSBkZXZpY2UuIFRoZSB1cmIgZ2V0cyBzZW50IHRvIHRoZSBkZXZpY2UgaW4ga2V5c3Bhbl9vcGVuKCkKKwkgKi8KKwl1c2JfZmlsbF9pbnRfdXJiKHJlbW90ZS0+aXJxX3VyYiwKKwkJCSByZW1vdGUtPnVkZXYsIHVzYl9yY3ZpbnRwaXBlKHJlbW90ZS0+dWRldiwgcmVtb3RlLT5pbl9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgcmVtb3RlLT5pbl9idWZmZXIsIFJFQ1ZfU0laRSwga2V5c3Bhbl9pcnFfcmVjdiwgcmVtb3RlLAorCQkJIHJlbW90ZS0+aW5fZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJcmVtb3RlLT5pcnFfdXJiLT50cmFuc2Zlcl9kbWEgPSByZW1vdGUtPmluX2RtYTsKKwlyZW1vdGUtPmlycV91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmcmVtb3RlLT5pbnB1dCk7CisKKwkvKiBzYXZlIG91ciBkYXRhIHBvaW50ZXIgaW4gdGhpcyBpbnRlcmZhY2UgZGV2aWNlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIHJlbW90ZSk7CisKKwkvKiBsZXQgdGhlIHVzZXIga25vdyB3aGF0IG5vZGUgdGhpcyBkZXZpY2UgaXMgbm93IGF0dGFjaGVkIHRvICovCisJaW5mbygiY29ubmVjdGVkOiAlcyBvbiAlcyIsIHJlbW90ZS0+bmFtZSwgcGF0aCk7CisJcmV0dXJuIDA7CisKK2Vycm9yOgorCS8qCisJICogSW4gY2FzZSBvZiBlcnJvciB3ZSBuZWVkIHRvIGNsZWFuIHVwIGFueSBhbGxvY2F0ZWQgYnVmZmVycworCSAqLworCWlmIChyZW1vdGUtPmlycV91cmIpCisJCXVzYl9mcmVlX3VyYihyZW1vdGUtPmlycV91cmIpOworCisJaWYgKHJlbW90ZS0+aW5fYnVmZmVyKQorCQl1c2JfYnVmZmVyX2ZyZWUocmVtb3RlLT51ZGV2LCBSRUNWX1NJWkUsIHJlbW90ZS0+aW5fYnVmZmVyLCByZW1vdGUtPmluX2RtYSk7CisKKwlpZiAocmVtb3RlKQorCQlrZnJlZShyZW1vdGUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIFJvdXRpbmUgY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkIGZyb20gdGhlIFVTQi4KKyAqLworc3RhdGljIHZvaWQga2V5c3Bhbl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHVzYl9rZXlzcGFuICpyZW1vdGU7CisKKwkvKiBwcmV2ZW50IGtleXNwYW5fb3BlbigpIGZyb20gcmFjaW5nIGtleXNwYW5fZGlzY29ubmVjdCgpICovCisJbG9ja19rZXJuZWwoKTsKKworCXJlbW90ZSA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisKKwlpZiAocmVtb3RlKSB7CS8qIFdlIGhhdmUgYSB2YWxpZCBkcml2ZXIgc3RydWN0dXJlIHNvIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgd2UgYWxsb2NhdGVkLiAqLworCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmcmVtb3RlLT5pbnB1dCk7CisJCXVzYl9raWxsX3VyYihyZW1vdGUtPmlycV91cmIpOworCQl1c2JfZnJlZV91cmIocmVtb3RlLT5pcnFfdXJiKTsKKwkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwgUkVDVl9TSVpFLCByZW1vdGUtPmluX2J1ZmZlciwgcmVtb3RlLT5pbl9kbWEpOworCQlrZnJlZShyZW1vdGUpOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKKworCWluZm8oIlVTQiBLZXlzcGFuIG5vdyBkaXNjb25uZWN0ZWQiKTsKK30KKworLyoKKyAqIFN0YW5kYXJkIGRyaXZlciBzZXQgdXAgc2VjdGlvbnMKKyAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGtleXNwYW5fZHJpdmVyID0KK3sKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkia2V5c3Bhbl9yZW1vdGUiLAorCS5wcm9iZSA9CWtleXNwYW5fcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQlrZXlzcGFuX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0Ja2V5c3Bhbl90YWJsZQorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX2tleXNwYW5faW5pdCh2b2lkKQoreworCWludCByZXN1bHQ7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZrZXlzcGFuX2RyaXZlcik7CisJaWYgKHJlc3VsdCkKKwkJZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdXNiX2tleXNwYW5fZXhpdCh2b2lkKQoreworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZrZXlzcGFuX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHVzYl9rZXlzcGFuX2luaXQpOworbW9kdWxlX2V4aXQodXNiX2tleXNwYW5fZXhpdCk7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBrZXlzcGFuX3RhYmxlKTsKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoRFJJVkVSX0xJQ0VOU0UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvbXRvdWNodXNiLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYwppbmRleCBhYjFhMmEzLi4wOWI1Y2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYwpAQCAtNDIsOSArNDIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogCiAjaWZkZWYgQ09ORklHX1VTQl9ERUJVRwotICAgICAgICAjZGVmaW5lIERFQlVHCisJI2RlZmluZSBERUJVRwogI2Vsc2UKLSAgICAgICAgI3VuZGVmIERFQlVHCisJI3VuZGVmIERFQlVHCiAjZW5kaWYKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtOTMsMjc1ICs5MywyNTUgQEAKIE1PRFVMRV9QQVJNX0RFU0MocmF3X2Nvb3JkaW5hdGVzLCAicmVwb3J0IHJhdyBjb29yZGluYXRlIHZhbHVlcyAoeSwgZGVmYXVsdCkgb3IgaGFyZHdhcmUtY2FsaWJyYXRlZCBjb29yZGluYXRlIHZhbHVlcyAobikiKTsKIAogc3RydWN0IG10b3VjaF91c2IgewotICAgICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICAgICBkbWFfYWRkcl90IGRhdGFfZG1hOwotICAgICAgICBzdHJ1Y3QgdXJiICppcnE7Ci0gICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwotICAgICAgICBzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0OwotICAgICAgICBpbnQgb3BlbjsKLSAgICAgICAgY2hhciBuYW1lWzEyOF07Ci0gICAgICAgIGNoYXIgcGh5c1s2NF07CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOworCXN0cnVjdCB1cmIgKmlycTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0OworCWNoYXIgbmFtZVsxMjhdOworCWNoYXIgcGh5c1s2NF07CiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbXRvdWNodXNiX2RldmljZXMgW10gPSB7Ci0gICAgICAgIHsgVVNCX0RFVklDRSgweDA1OTYsIDB4MDAwMSkgfSwKLSAgICAgICAgeyB9CitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbXRvdWNodXNiX2RldmljZXNbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoMHgwNTk2LCAweDAwMDEpIH0sCisJeyB9CiB9OwogCiBzdGF0aWMgdm9pZCBtdG91Y2h1c2JfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIHN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSB1cmItPmNvbnRleHQ7Ci0gICAgICAgIGludCByZXR2YWw7CisJc3RydWN0IG10b3VjaF91c2IgKm10b3VjaCA9IHVyYi0+Y29udGV4dDsKKwlpbnQgcmV0dmFsOwogCi0gICAgICAgIHN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIC1FVElNRURPVVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIHVyYiBpcyB0aW1pbmcgb3V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBkYmcoIiVzIC0gdXJiIHRpbWVkIG91dCAtIHdhcyB0aGUgZGV2aWNlIHVucGx1Z2dlZD8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSAtRUNPTk5SRVNFVDoKLSAgICAgICAgICAgICAgICBjYXNlIC1FTk9FTlQ6Ci0gICAgICAgICAgICAgICAgY2FzZSAtRVNIVVRET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoKKwkJLyogdGhpcyB1cmIgaXMgdGltaW5nIG91dCAqLworCQlkYmcoIiVzIC0gdXJiIHRpbWVkIG91dCAtIHdhcyB0aGUgZGV2aWNlIHVucGx1Z2dlZD8iLAorCQkgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KKwkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlnb3RvIGV4aXQ7CisJfQogCi0gICAgICAgIGlucHV0X3JlZ3MoJm10b3VjaC0+aW5wdXQsIHJlZ3MpOwotICAgICAgICBpbnB1dF9yZXBvcnRfa2V5KCZtdG91Y2gtPmlucHV0LCBCVE5fVE9VQ0gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTVRPVUNIVVNCX0dFVF9UT1VDSEVEKG10b3VjaC0+ZGF0YSkpOwotICAgICAgICBpbnB1dF9yZXBvcnRfYWJzKCZtdG91Y2gtPmlucHV0LCBBQlNfWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNVE9VQ0hVU0JfR0VUX1hDKG10b3VjaC0+ZGF0YSkpOwotICAgICAgICBpbnB1dF9yZXBvcnRfYWJzKCZtdG91Y2gtPmlucHV0LCBBQlNfWSwKKwlpbnB1dF9yZWdzKCZtdG91Y2gtPmlucHV0LCByZWdzKTsKKwlpbnB1dF9yZXBvcnRfa2V5KCZtdG91Y2gtPmlucHV0LCBCVE5fVE9VQ0gsCisJCQkgTVRPVUNIVVNCX0dFVF9UT1VDSEVEKG10b3VjaC0+ZGF0YSkpOworCWlucHV0X3JlcG9ydF9hYnMoJm10b3VjaC0+aW5wdXQsIEFCU19YLCBNVE9VQ0hVU0JfR0VUX1hDKG10b3VjaC0+ZGF0YSkpOworCWlucHV0X3JlcG9ydF9hYnMoJm10b3VjaC0+aW5wdXQsIEFCU19ZLAogCQkJIChyYXdfY29vcmRpbmF0ZXMgPyBNVE9VQ0hVU0JfTUFYX1JBV19ZQyA6IE1UT1VDSFVTQl9NQVhfQ0FMSUJfWUMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLSBNVE9VQ0hVU0JfR0VUX1lDKG10b3VjaC0+ZGF0YSkpOwotICAgICAgICBpbnB1dF9zeW5jKCZtdG91Y2gtPmlucHV0KTsKKwkJCSAtIE1UT1VDSFVTQl9HRVRfWUMobXRvdWNoLT5kYXRhKSk7CisJaW5wdXRfc3luYygmbXRvdWNoLT5pbnB1dCk7CiAKIGV4aXQ6Ci0gICAgICAgIHJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwotICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIGVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0OiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0dmFsKQorCQllcnIoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0OiAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgbXRvdWNodXNiX29wZW4gKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0KQorc3RhdGljIGludCBtdG91Y2h1c2Jfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKIHsKLSAgICAgICAgc3RydWN0IG10b3VjaF91c2IgKm10b3VjaCA9IGlucHV0LT5wcml2YXRlOworCXN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSBpbnB1dC0+cHJpdmF0ZTsKIAotICAgICAgICBpZiAobXRvdWNoLT5vcGVuKyspCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJbXRvdWNoLT5pcnEtPmRldiA9IG10b3VjaC0+dWRldjsKIAotICAgICAgICBtdG91Y2gtPmlycS0+ZGV2ID0gbXRvdWNoLT51ZGV2OworCWlmICh1c2Jfc3VibWl0X3VyYihtdG91Y2gtPmlycSwgR0ZQX0FUT01JQykpCisJCXJldHVybiAtRUlPOwogCi0gICAgICAgIGlmICh1c2Jfc3VibWl0X3VyYiAobXRvdWNoLT5pcnEsIEdGUF9BVE9NSUMpKSB7Ci0gICAgICAgICAgICAgICAgbXRvdWNoLT5vcGVuLS07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXRvdWNodXNiX2Nsb3NlIChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3N0YXRpYyB2b2lkIG10b3VjaHVzYl9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKIHsKLSAgICAgICAgc3RydWN0IG10b3VjaF91c2IgKm10b3VjaCA9IGlucHV0LT5wcml2YXRlOworCXN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSBpbnB1dC0+cHJpdmF0ZTsKIAotICAgICAgICBpZiAoIS0tbXRvdWNoLT5vcGVuKQotICAgICAgICAgICAgICAgIHVzYl9raWxsX3VyYiAobXRvdWNoLT5pcnEpOworCXVzYl9raWxsX3VyYihtdG91Y2gtPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgbXRvdWNodXNiX2FsbG9jX2J1ZmZlcnMoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2gpCiB7Ci0gICAgICAgIGRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOwogCi0gICAgICAgIG10b3VjaC0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2ModWRldiwgTVRPVUNIVVNCX1JFUE9SVF9EQVRBX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xBQl9BVE9NSUMsICZtdG91Y2gtPmRhdGFfZG1hKTsKKwltdG91Y2gtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHVkZXYsIE1UT1VDSFVTQl9SRVBPUlRfREFUQV9TSVpFLAorCQkJCQlTTEFCX0FUT01JQywgJm10b3VjaC0+ZGF0YV9kbWEpOwogCi0gICAgICAgIGlmICghbXRvdWNoLT5kYXRhKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwlpZiAoIW10b3VjaC0+ZGF0YSkKKwkJcmV0dXJuIC0xOwogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBtdG91Y2h1c2JfZnJlZV9idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoKQogewotICAgICAgICBkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKKwlkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKIAotICAgICAgICBpZiAobXRvdWNoLT5kYXRhKQotICAgICAgICAgICAgICAgIHVzYl9idWZmZXJfZnJlZSh1ZGV2LCBNVE9VQ0hVU0JfUkVQT1JUX0RBVEFfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRvdWNoLT5kYXRhLCBtdG91Y2gtPmRhdGFfZG1hKTsKKwlpZiAobXRvdWNoLT5kYXRhKQorCQl1c2JfYnVmZmVyX2ZyZWUodWRldiwgTVRPVUNIVVNCX1JFUE9SVF9EQVRBX1NJWkUsCisJCQkJbXRvdWNoLT5kYXRhLCBtdG91Y2gtPmRhdGFfZG1hKTsKIH0KIAogc3RhdGljIGludCBtdG91Y2h1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLSAgICAgICAgc3RydWN0IG10b3VjaF91c2IgKm10b3VjaDsKLSAgICAgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOwotICAgICAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwotICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYgKGludGYpOwotICAgICAgICBjaGFyIHBhdGhbNjRdOwotICAgICAgICBpbnQgblJldDsKKwlzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoOworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwljaGFyIHBhdGhbNjRdOworCWludCBuUmV0OwogCi0gICAgICAgIGRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworCWRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOwogCi0gICAgICAgIGRiZygiJXMgLSBzZXR0aW5nIGludGVyZmFjZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWRiZygiJXMgLSBzZXR0aW5nIGludGVyZmFjZSIsIF9fRlVOQ1RJT05fXyk7CisJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAKLSAgICAgICAgZGJnKCIlcyAtIHNldHRpbmcgZW5kcG9pbnQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBlbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CisJZGJnKCIlcyAtIHNldHRpbmcgZW5kcG9pbnQiLCBfX0ZVTkNUSU9OX18pOworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKIAotICAgICAgICBpZiAoIShtdG91Y2ggPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBtdG91Y2hfdXNiKSwgR0ZQX0tFUk5FTCkpKSB7Ci0gICAgICAgICAgICAgICAgZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkuIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQorCWlmICghKG10b3VjaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtdG91Y2hfdXNiKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVycigiJXMgLSBPdXQgb2YgbWVtb3J5LiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAotICAgICAgICBtZW1zZXQobXRvdWNoLCAwLCBzaXplb2Yoc3RydWN0IG10b3VjaF91c2IpKTsKLSAgICAgICAgbXRvdWNoLT51ZGV2ID0gdWRldjsKKwltZW1zZXQobXRvdWNoLCAwLCBzaXplb2Yoc3RydWN0IG10b3VjaF91c2IpKTsKKwltdG91Y2gtPnVkZXYgPSB1ZGV2OwogCi0gICAgICAgIGRiZygiJXMgLSBhbGxvY2F0aW5nIGJ1ZmZlcnMiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBpZiAobXRvdWNodXNiX2FsbG9jX2J1ZmZlcnModWRldiwgbXRvdWNoKSkgewotICAgICAgICAgICAgICAgIG10b3VjaHVzYl9mcmVlX2J1ZmZlcnModWRldiwgbXRvdWNoKTsKLSAgICAgICAgICAgICAgICBrZnJlZShtdG91Y2gpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICB9CisJZGJnKCIlcyAtIGFsbG9jYXRpbmcgYnVmZmVycyIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKG10b3VjaHVzYl9hbGxvY19idWZmZXJzKHVkZXYsIG10b3VjaCkpIHsKKwkJbXRvdWNodXNiX2ZyZWVfYnVmZmVycyh1ZGV2LCBtdG91Y2gpOworCQlrZnJlZShtdG91Y2gpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5wcml2YXRlID0gbXRvdWNoOwotICAgICAgICBtdG91Y2gtPmlucHV0Lm9wZW4gPSBtdG91Y2h1c2Jfb3BlbjsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5jbG9zZSA9IG10b3VjaHVzYl9jbG9zZTsKKwltdG91Y2gtPmlucHV0LnByaXZhdGUgPSBtdG91Y2g7CisJbXRvdWNoLT5pbnB1dC5vcGVuID0gbXRvdWNodXNiX29wZW47CisJbXRvdWNoLT5pbnB1dC5jbG9zZSA9IG10b3VjaHVzYl9jbG9zZTsKIAotICAgICAgICB1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIDY0KTsKLSAgICAgICAgc3ByaW50ZihtdG91Y2gtPnBoeXMsICIlcy9pbnB1dDAiLCBwYXRoKTsKKwl1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIDY0KTsKKwlzcHJpbnRmKG10b3VjaC0+cGh5cywgIiVzL2lucHV0MCIsIHBhdGgpOwogCi0gICAgICAgIG10b3VjaC0+aW5wdXQubmFtZSA9IG10b3VjaC0+bmFtZTsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5waHlzID0gbXRvdWNoLT5waHlzOwotICAgICAgICBtdG91Y2gtPmlucHV0LmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwotICAgICAgICBtdG91Y2gtPmlucHV0LmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotICAgICAgICBtdG91Y2gtPmlucHV0LmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuaWQudmVyc2lvbiA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKTsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5kZXYgPSAmaW50Zi0+ZGV2OworCW10b3VjaC0+aW5wdXQubmFtZSA9IG10b3VjaC0+bmFtZTsKKwltdG91Y2gtPmlucHV0LnBoeXMgPSBtdG91Y2gtPnBoeXM7CisJbXRvdWNoLT5pbnB1dC5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwltdG91Y2gtPmlucHV0LmlkLnZlbmRvciA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOworCW10b3VjaC0+aW5wdXQuaWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwltdG91Y2gtPmlucHV0LmlkLnZlcnNpb24gPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7CisJbXRvdWNoLT5pbnB1dC5kZXYgPSAmaW50Zi0+ZGV2OwogCi0gICAgICAgIG10b3VjaC0+aW5wdXQuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOwotICAgICAgICBtdG91Y2gtPmlucHV0LmFic2JpdFswXSA9IEJJVChBQlNfWCkgfCBCSVQoQUJTX1kpOwotICAgICAgICBtdG91Y2gtPmlucHV0LmtleWJpdFtMT05HKEJUTl9UT1VDSCldID0gQklUKEJUTl9UT1VDSCk7CisJbXRvdWNoLT5pbnB1dC5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CisJbXRvdWNoLT5pbnB1dC5hYnNiaXRbMF0gPSBCSVQoQUJTX1gpIHwgQklUKEFCU19ZKTsKKwltdG91Y2gtPmlucHV0LmtleWJpdFtMT05HKEJUTl9UT1VDSCldID0gQklUKEJUTl9UT1VDSCk7CiAKLSAgICAgICAgLyogVXNlZCB0byBTY2FsZSBDb21wZW5zYXRlZCBEYXRhIGFuZCBGbGlwIFkgKi8KLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNtaW5bQUJTX1hdID0gIE1UT1VDSFVTQl9NSU5fWEM7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuYWJzbWF4W0FCU19YXSA9ICByYXdfY29vcmRpbmF0ZXMgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVE9VQ0hVU0JfTUFYX1JBV19YQyA6IE1UT1VDSFVTQl9NQVhfQ0FMSUJfWEM7Ci0gICAgICAgIG10b3VjaC0+aW5wdXQuYWJzZnV6eltBQlNfWF0gPSBNVE9VQ0hVU0JfWENfRlVaWjsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNmbGF0W0FCU19YXSA9IE1UT1VDSFVTQl9YQ19GTEFUOwotICAgICAgICBtdG91Y2gtPmlucHV0LmFic21pbltBQlNfWV0gPSAgTVRPVUNIVVNCX01JTl9ZQzsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNtYXhbQUJTX1ldID0gIHJhd19jb29yZGluYXRlcyA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT1VDSFVTQl9NQVhfUkFXX1lDIDogTVRPVUNIVVNCX01BWF9DQUxJQl9ZQzsKLSAgICAgICAgbXRvdWNoLT5pbnB1dC5hYnNmdXp6W0FCU19ZXSA9IE1UT1VDSFVTQl9ZQ19GVVpaOwotICAgICAgICBtdG91Y2gtPmlucHV0LmFic2ZsYXRbQUJTX1ldID0gTVRPVUNIVVNCX1lDX0ZMQVQ7CisJLyogVXNlZCB0byBTY2FsZSBDb21wZW5zYXRlZCBEYXRhIGFuZCBGbGlwIFkgKi8KKwltdG91Y2gtPmlucHV0LmFic21pbltBQlNfWF0gPSBNVE9VQ0hVU0JfTUlOX1hDOworCW10b3VjaC0+aW5wdXQuYWJzbWF4W0FCU19YXSA9IHJhd19jb29yZGluYXRlcyA/CisJCQkJCU1UT1VDSFVTQl9NQVhfUkFXX1hDIDogTVRPVUNIVVNCX01BWF9DQUxJQl9YQzsKKwltdG91Y2gtPmlucHV0LmFic2Z1enpbQUJTX1hdID0gTVRPVUNIVVNCX1hDX0ZVWlo7CisJbXRvdWNoLT5pbnB1dC5hYnNmbGF0W0FCU19YXSA9IE1UT1VDSFVTQl9YQ19GTEFUOworCW10b3VjaC0+aW5wdXQuYWJzbWluW0FCU19ZXSA9IE1UT1VDSFVTQl9NSU5fWUM7CisJbXRvdWNoLT5pbnB1dC5hYnNtYXhbQUJTX1ldID0gcmF3X2Nvb3JkaW5hdGVzID8KKwkJCQkJTVRPVUNIVVNCX01BWF9SQVdfWUMgOiBNVE9VQ0hVU0JfTUFYX0NBTElCX1lDOworCW10b3VjaC0+aW5wdXQuYWJzZnV6eltBQlNfWV0gPSBNVE9VQ0hVU0JfWUNfRlVaWjsKKwltdG91Y2gtPmlucHV0LmFic2ZsYXRbQUJTX1ldID0gTVRPVUNIVVNCX1lDX0ZMQVQ7CiAKIAlpZiAodWRldi0+bWFudWZhY3R1cmVyKQogCQlzdHJjYXQobXRvdWNoLT5uYW1lLCB1ZGV2LT5tYW51ZmFjdHVyZXIpOwogCWlmICh1ZGV2LT5wcm9kdWN0KQogCQlzcHJpbnRmKG10b3VjaC0+bmFtZSwgIiVzICVzIiwgbXRvdWNoLT5uYW1lLCB1ZGV2LT5wcm9kdWN0KTsKIAotICAgICAgICBpZiAoIXN0cmxlbihtdG91Y2gtPm5hbWUpKQotICAgICAgICAgICAgICAgIHNwcmludGYobXRvdWNoLT5uYW1lLCAiVVNCIFRvdWNoc2NyZWVuICUwNHg6JTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtdG91Y2gtPmlucHV0LmlkLnZlbmRvciwgbXRvdWNoLT5pbnB1dC5pZC5wcm9kdWN0KTsKKwlpZiAoIXN0cmxlbihtdG91Y2gtPm5hbWUpKQorCQlzcHJpbnRmKG10b3VjaC0+bmFtZSwgIlVTQiBUb3VjaHNjcmVlbiAlMDR4OiUwNHgiLAorCQkJbXRvdWNoLT5pbnB1dC5pZC52ZW5kb3IsIG10b3VjaC0+aW5wdXQuaWQucHJvZHVjdCk7CiAKLSAgICAgICAgblJldCA9IHVzYl9jb250cm9sX21zZyhtdG91Y2gtPnVkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UT1VDSFVTQl9SRVNFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Ci0gICAgICAgIGRiZygiJXMgLSB1c2JfY29udHJvbF9tc2cgLSBNVE9VQ0hVU0JfUkVTRVQgLSBieXRlc3xlcnI6ICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgblJldCk7CisJblJldCA9IHVzYl9jb250cm9sX21zZyhtdG91Y2gtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgICBNVE9VQ0hVU0JfUkVTRVQsCisJCQkgICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgIDEsIDAsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlkYmcoIiVzIC0gdXNiX2NvbnRyb2xfbXNnIC0gTVRPVUNIVVNCX1JFU0VUIC0gYnl0ZXN8ZXJyOiAlZCIsCisJICAgIF9fRlVOQ1RJT05fXywgblJldCk7CiAKLSAgICAgICAgZGJnKCIlcyAtIHVzYl9hbGxvY191cmI6IG10b3VjaC0+aXJxIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbXRvdWNoLT5pcnEgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoIW10b3VjaC0+aXJxKSB7Ci0gICAgICAgICAgICAgICAgZGJnKCIlcyAtIHVzYl9hbGxvY191cmIgZmFpbGVkOiBtdG91Y2gtPmlycSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgbXRvdWNodXNiX2ZyZWVfYnVmZmVycyh1ZGV2LCBtdG91Y2gpOwotICAgICAgICAgICAgICAgIGtmcmVlKG10b3VjaCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KKwlkYmcoIiVzIC0gdXNiX2FsbG9jX3VyYjogbXRvdWNoLT5pcnEiLCBfX0ZVTkNUSU9OX18pOworCW10b3VjaC0+aXJxID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10b3VjaC0+aXJxKSB7CisJCWRiZygiJXMgLSB1c2JfYWxsb2NfdXJiIGZhaWxlZDogbXRvdWNoLT5pcnEiLCBfX0ZVTkNUSU9OX18pOworCQltdG91Y2h1c2JfZnJlZV9idWZmZXJzKHVkZXYsIG10b3VjaCk7CisJCWtmcmVlKG10b3VjaCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAotICAgICAgICBkYmcoIiVzIC0gdXNiX2ZpbGxfaW50X3VyYiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHVzYl9maWxsX2ludF91cmIobXRvdWNoLT5pcnEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXRvdWNoLT51ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9yY3ZpbnRwaXBlKG10b3VjaC0+dWRldiwgMHg4MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXRvdWNoLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIE1UT1VDSFVTQl9SRVBPUlRfREFUQV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgIG10b3VjaHVzYl9pcnEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXRvdWNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworCWRiZygiJXMgLSB1c2JfZmlsbF9pbnRfdXJiIiwgX19GVU5DVElPTl9fKTsKKwl1c2JfZmlsbF9pbnRfdXJiKG10b3VjaC0+aXJxLCBtdG91Y2gtPnVkZXYsCisJCQkgdXNiX3JjdmludHBpcGUobXRvdWNoLT51ZGV2LCAweDgxKSwKKwkJCSBtdG91Y2gtPmRhdGEsIE1UT1VDSFVTQl9SRVBPUlRfREFUQV9TSVpFLAorCQkJIG10b3VjaHVzYl9pcnEsIG10b3VjaCwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CiAKLSAgICAgICAgZGJnKCIlcyAtIGlucHV0X3JlZ2lzdGVyX2RldmljZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGlucHV0X3JlZ2lzdGVyX2RldmljZSgmbXRvdWNoLT5pbnB1dCk7CisJZGJnKCIlcyAtIGlucHV0X3JlZ2lzdGVyX2RldmljZSIsIF9fRlVOQ1RJT05fXyk7CisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZtdG91Y2gtPmlucHV0KTsKIAotICAgICAgICBuUmV0ID0gdXNiX2NvbnRyb2xfbXNnKG10b3VjaC0+dWRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRPVUNIVVNCX0FTWU5DX1JFUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Ci0gICAgICAgIGRiZygiJXMgLSB1c2JfY29udHJvbF9tc2cgLSBNVE9VQ0hVU0JfQVNZTkNfUkVQT1JUIC0gYnl0ZXN8ZXJyOiAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5SZXQpOworCW5SZXQgPSB1c2JfY29udHJvbF9tc2cobXRvdWNoLT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCisJCQkgICAgICAgTVRPVUNIVVNCX0FTWU5DX1JFUE9SVCwKKwkJCSAgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICAgMSwgMSwgTlVMTCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCWRiZygiJXMgLSB1c2JfY29udHJvbF9tc2cgLSBNVE9VQ0hVU0JfQVNZTkNfUkVQT1JUIC0gYnl0ZXN8ZXJyOiAlZCIsCisJICAgIF9fRlVOQ1RJT05fXywgblJldCk7CiAKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzXG4iLCBtdG91Y2gtPm5hbWUsIHBhdGgpOwotICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGYsIG10b3VjaCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzXG4iLCBtdG91Y2gtPm5hbWUsIHBhdGgpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgbXRvdWNoKTsKIAotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbXRvdWNodXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0gICAgICAgIHN0cnVjdCBtdG91Y2hfdXNiICptdG91Y2ggPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKwlzdHJ1Y3QgbXRvdWNoX3VzYiAqbXRvdWNoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAotICAgICAgICBkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKLSAgICAgICAgaWYgKG10b3VjaCkgewotICAgICAgICAgICAgICAgIGRiZygiJXMgLSBtdG91Y2ggaXMgaW5pdGlhbGl6ZWQsIGNsZWFuaW5nIHVwIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgICAgICB1c2Jfa2lsbF91cmIobXRvdWNoLT5pcnEpOwotICAgICAgICAgICAgICAgIGlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZtdG91Y2gtPmlucHV0KTsKLSAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIobXRvdWNoLT5pcnEpOwotICAgICAgICAgICAgICAgIG10b3VjaHVzYl9mcmVlX2J1ZmZlcnMoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgbXRvdWNoKTsKLSAgICAgICAgICAgICAgICBrZnJlZShtdG91Y2gpOwotICAgICAgICB9CisJZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwlpZiAobXRvdWNoKSB7CisJCWRiZygiJXMgLSBtdG91Y2ggaXMgaW5pdGlhbGl6ZWQsIGNsZWFuaW5nIHVwIiwgX19GVU5DVElPTl9fKTsKKwkJdXNiX2tpbGxfdXJiKG10b3VjaC0+aXJxKTsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJm10b3VjaC0+aW5wdXQpOworCQl1c2JfZnJlZV91cmIobXRvdWNoLT5pcnEpOworCQltdG91Y2h1c2JfZnJlZV9idWZmZXJzKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIG10b3VjaCk7CisJCWtmcmVlKG10b3VjaCk7CisJfQogfQogCi1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIG10b3VjaHVzYl9kZXZpY2VzKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBtdG91Y2h1c2JfZGV2aWNlcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtdG91Y2h1c2JfZHJpdmVyID0gewotICAgICAgICAub3duZXIgPSAgICAgIFRISVNfTU9EVUxFLAotICAgICAgICAubmFtZSA9ICAgICAgICJtdG91Y2h1c2IiLAotICAgICAgICAucHJvYmUgPSAgICAgIG10b3VjaHVzYl9wcm9iZSwKLSAgICAgICAgLmRpc2Nvbm5lY3QgPSBtdG91Y2h1c2JfZGlzY29ubmVjdCwKLSAgICAgICAgLmlkX3RhYmxlID0gICBtdG91Y2h1c2JfZGV2aWNlcywKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm10b3VjaHVzYiIsCisJLnByb2JlCQk9IG10b3VjaHVzYl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IG10b3VjaHVzYl9kaXNjb25uZWN0LAorCS5pZF90YWJsZQk9IG10b3VjaHVzYl9kZXZpY2VzLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgbXRvdWNodXNiX2luaXQodm9pZCkgewotICAgICAgICBkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIHVzYl9yZWdpc3RlcigmbXRvdWNodXNiX2RyaXZlcik7CitzdGF0aWMgaW50IF9faW5pdCBtdG91Y2h1c2JfaW5pdCh2b2lkKQoreworCWRiZygiJXMgLSBjYWxsZWQiLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiB1c2JfcmVnaXN0ZXIoJm10b3VjaHVzYl9kcml2ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXRvdWNodXNiX2NsZWFudXAodm9pZCkgewotICAgICAgICBkYmcoIiVzIC0gY2FsbGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgdXNiX2RlcmVnaXN0ZXIoJm10b3VjaHVzYl9kcml2ZXIpOworc3RhdGljIHZvaWQgX19leGl0IG10b3VjaHVzYl9jbGVhbnVwKHZvaWQpCit7CisJZGJnKCIlcyAtIGNhbGxlZCIsIF9fRlVOQ1RJT05fXyk7CisJdXNiX2RlcmVnaXN0ZXIoJm10b3VjaHVzYl9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChtdG91Y2h1c2JfaW5pdCk7CiBtb2R1bGVfZXhpdChtdG91Y2h1c2JfY2xlYW51cCk7CiAKLU1PRFVMRV9BVVRIT1IoIERSSVZFUl9BVVRIT1IgKTsKLU1PRFVMRV9ERVNDUklQVElPTiggRFJJVkVSX0RFU0MgKTsKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvcG93ZXJtYXRlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYwppbmRleCA3ZmEyZjliLi4zOTc1YjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYwpAQCAtMTAsNyArMTAsNyBAQAogICogYmFjayB0byB0aGUgaG9zdCB3aGVuIHBvbGxlZCBieSB0aGUgVVNCIGNvbnRyb2xsZXIuCiAgKgogICogVGVzdGluZyB3aXRoIHRoZSBrbm9iIEkgaGF2ZSBoYXMgc2hvd24gdGhhdCBpdCBtZWFzdXJlcyBhcHByb3hpbWF0ZWx5IDk0ICJjbGlja3MiCi0gKiBmb3Igb25lIGZ1bGwgcm90YXRpb24uIFRlc3Rpbmcgd2l0aCBteSBIaWdoIFNwZWVkIFJvdGF0aW9uIEFjdHVhdG9yIChvaywgaXQgd2FzIAorICogZm9yIG9uZSBmdWxsIHJvdGF0aW9uLiBUZXN0aW5nIHdpdGggbXkgSGlnaCBTcGVlZCBSb3RhdGlvbiBBY3R1YXRvciAob2ssIGl0IHdhcwogICogYSB2YXJpYWJsZSBzcGVlZCBjb3JkbGVzcyBlbGVjdHJpYyBkcmlsbCkgaGFzIHNob3duIHRoYXQgdGhlIGRldmljZSBjYW4gbWVhc3VyZQogICogc3BlZWRzIG9mIHVwIHRvIDcgY2xpY2tzIGVpdGhlciBjbG9ja3dpc2Ugb3IgYW50aWNsb2Nrd2lzZSBiZXR3ZWVuIHBvbGxpbmdzIGZyb20KICAqIHRoZSBob3N0LiBJZiBpdCBjb3VudHMgbW9yZSB0aGFuIDcgY2xpY2tzIGJlZm9yZSBpdCBpcyBwb2xsZWQsIGl0IHdpbGwgd3JhcCBiYWNrCkBAIC0xMjAsOSArMTIwLDkgQEAKIC8qIERlY2lkZSBpZiB3ZSBuZWVkIHRvIGlzc3VlIGEgY29udHJvbCBtZXNzYWdlIGFuZCBkbyBzby4gTXVzdCBiZSBjYWxsZWQgd2l0aCBwbS0+bG9jayB0YWtlbiAqLwogc3RhdGljIHZvaWQgcG93ZXJtYXRlX3N5bmNfc3RhdGUoc3RydWN0IHBvd2VybWF0ZV9kZXZpY2UgKnBtKQogewotCWlmIChwbS0+cmVxdWlyZXNfdXBkYXRlID09IDApIAorCWlmIChwbS0+cmVxdWlyZXNfdXBkYXRlID09IDApCiAJCXJldHVybjsgLyogbm8gdXBkYXRlcyBhcmUgcmVxdWlyZWQgKi8KLQlpZiAocG0tPmNvbmZpZy0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgCisJaWYgKHBtLT5jb25maWctPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCXJldHVybjsgLyogYW4gdXBkYXRlIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3M7IGl0J2xsIGlzc3VlIHRoaXMgdXBkYXRlIHdoZW4gaXQgY29tcGxldGVzICovCiAKIAlpZiAocG0tPnJlcXVpcmVzX3VwZGF0ZSAmIFVQREFURV9QVUxTRV9BU0xFRVApewpAQCAtMTQyLDcgKzE0Miw3IEBACiAJCSAgIDI6IG11bHRpcGx5IHRoZSBzcGVlZAogCQkgICB0aGUgYXJndW1lbnQgb25seSBoYXMgYW4gZWZmZWN0IGZvciBvcGVyYXRpb25zIDAgYW5kIDIsIGFuZCByYW5nZXMgYmV0d2VlbgogCQkgICAxIChsZWFzdCBlZmZlY3QpIHRvIDI1NSAobWF4aW11bSBlZmZlY3QpLgotICAgICAgIAorCiAJCSAgIHRodXMsIHNldmVyYWwgc3RhdGVzIGFyZSBlcXVpdmFsZW50IGFuZCBhcmUgY29hbGVzY2VkIGludG8gb25lIHN0YXRlLgogCiAJCSAgIHdlIG1hcCB0aGlzIG9udG8gYSByYW5nZSBmcm9tIDAgdG8gNTEwLCB3aXRoOgpAQCAtMTUxLDcgKzE1MSw3IEBACiAJCSAgIDI1NiAtLSA1MTAgIC0tIHVzZSBtdWx0aXBsZSAoNTEwID0gZmFzdGVzdCkuCiAKIAkJICAgT25seSB2YWx1ZXMgb2YgJ2FyZycgcXVpdGUgY2xvc2UgdG8gMjU1IGFyZSBwYXJ0aWN1bGFybHkgdXNlZnVsL3NwZWN0YWN1bGFyLgotCQkqLyAgICAKKwkJKi8KIAkJaWYgKHBtLT5wdWxzZV9zcGVlZCA8IDI1NSl7CiAJCQlvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIGRpdmlkZQogCQkJYXJnID0gMjU1IC0gcG0tPnB1bHNlX3NwZWVkOwpAQCAtMTk5LDE0ICsxOTksMTQgQEAKIAogCWlmICh1cmItPnN0YXR1cykKIAkJcHJpbnRrKEtFUk5fRVJSICJwb3dlcm1hdGU6IGNvbmZpZyB1cmIgcmV0dXJuZWQgJWRcbiIsIHVyYi0+c3RhdHVzKTsKLQkKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZwbS0+bG9jaywgZmxhZ3MpOwogCXBvd2VybWF0ZV9zeW5jX3N0YXRlKHBtKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbS0+bG9jaywgZmxhZ3MpOwogfQogCiAvKiBTZXQgdGhlIExFRCB1cCBhcyBkZXNjcmliZWQgYW5kIGJlZ2luIHRoZSBzeW5jIHdpdGggdGhlIGhhcmR3YXJlIGlmIHJlcXVpcmVkICovCi1zdGF0aWMgdm9pZCBwb3dlcm1hdGVfcHVsc2VfbGVkKHN0cnVjdCBwb3dlcm1hdGVfZGV2aWNlICpwbSwgaW50IHN0YXRpY19icmlnaHRuZXNzLCBpbnQgcHVsc2Vfc3BlZWQsIAorc3RhdGljIHZvaWQgcG93ZXJtYXRlX3B1bHNlX2xlZChzdHJ1Y3QgcG93ZXJtYXRlX2RldmljZSAqcG0sIGludCBzdGF0aWNfYnJpZ2h0bmVzcywgaW50IHB1bHNlX3NwZWVkLAogCQkJCWludCBwdWxzZV90YWJsZSwgaW50IHB1bHNlX2FzbGVlcCwgaW50IHB1bHNlX2F3YWtlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yMjksNyArMjI5LDcgQEAKIAkvKiBtYXJrIHN0YXRlIHVwZGF0ZXMgd2hpY2ggYXJlIHJlcXVpcmVkICovCiAJaWYgKHN0YXRpY19icmlnaHRuZXNzICE9IHBtLT5zdGF0aWNfYnJpZ2h0bmVzcyl7CiAJCXBtLT5zdGF0aWNfYnJpZ2h0bmVzcyA9IHN0YXRpY19icmlnaHRuZXNzOwotCQlwbS0+cmVxdWlyZXNfdXBkYXRlIHw9IFVQREFURV9TVEFUSUNfQlJJR0hUTkVTUzsJCQorCQlwbS0+cmVxdWlyZXNfdXBkYXRlIHw9IFVQREFURV9TVEFUSUNfQlJJR0hUTkVTUzsKIAl9CiAJaWYgKHB1bHNlX2FzbGVlcCAhPSBwbS0+cHVsc2VfYXNsZWVwKXsKIAkJcG0tPnB1bHNlX2FzbGVlcCA9IHB1bHNlX2FzbGVlcDsKQEAgLTI0Niw3ICsyNDYsNyBAQAogCX0KIAogCXBvd2VybWF0ZV9zeW5jX3N0YXRlKHBtKTsKLSAgIAorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG0tPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjU3LDE5ICsyNTcsMTkgQEAKIAlzdHJ1Y3QgcG93ZXJtYXRlX2RldmljZSAqcG0gPSBkZXYtPnByaXZhdGU7CiAKIAlpZiAodHlwZSA9PSBFVl9NU0MgJiYgY29kZSA9PSBNU0NfUFVMU0VMRUQpewotCQkvKiAgCisJCS8qCiAJCSAgICBiaXRzICAwLSA3OiA4IGJpdHM6IExFRCBicmlnaHRuZXNzCiAJCSAgICBiaXRzICA4LTE2OiA5IGJpdHM6IHB1bHNpbmcgc3BlZWQgbW9kaWZpZXIgKDAgLi4uIDUxMCk7IDAtMjU0ID0gc2xvd2VyLCAyNTUgPSBzdGFuZGFyZCwgMjU2LTUxMCA9IGZhc3Rlci4KIAkJICAgIGJpdHMgMTctMTg6IDIgYml0czogcHVsc2UgdGFibGUgKDAsIDEsIDIgdmFsaWQpCiAJCSAgICBiaXQgICAgIDE5OiAxIGJpdCA6IHB1bHNlIHdoaWxzdCBhc2xlZXA/CiAJCSAgICBiaXQgICAgIDIwOiAxIGJpdCA6IHB1bHNlIGNvbnN0YW50bHk/Ci0JCSovICAKKwkJKi8KIAkJaW50IHN0YXRpY19icmlnaHRuZXNzID0gY29tbWFuZCAmIDB4RkY7ICAgLy8gYml0cyAwLTcKIAkJaW50IHB1bHNlX3NwZWVkID0gKGNvbW1hbmQgPj4gOCkgJiAweDFGRjsgLy8gYml0cyA4LTE2CiAJCWludCBwdWxzZV90YWJsZSA9IChjb21tYW5kID4+IDE3KSAmIDB4MzsgIC8vIGJpdHMgMTctMTgKIAkJaW50IHB1bHNlX2FzbGVlcCA9IChjb21tYW5kID4+IDE5KSAmIDB4MTsgLy8gYml0IDE5CiAJCWludCBwdWxzZV9hd2FrZSAgPSAoY29tbWFuZCA+PiAyMCkgJiAweDE7IC8vIGJpdCAyMAotICAKKwogCQlwb3dlcm1hdGVfcHVsc2VfbGVkKHBtLCBzdGF0aWNfYnJpZ2h0bmVzcywgcHVsc2Vfc3BlZWQsIHB1bHNlX3RhYmxlLCBwdWxzZV9hc2xlZXAsIHB1bHNlX2F3YWtlKTsKIAl9CiAKQEAgLTM3OCw3ICszNzgsNyBAQAogCXN3aXRjaCAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSB7CiAJY2FzZSBQT1dFUk1BVEVfUFJPRFVDVF9ORVc6IHBtLT5pbnB1dC5uYW1lID0gcG1fbmFtZV9wb3dlcm1hdGU7IGJyZWFrOwogCWNhc2UgUE9XRVJNQVRFX1BST0RVQ1RfT0xEOiBwbS0+aW5wdXQubmFtZSA9IHBtX25hbWVfc291bmRrbm9iOyBicmVhazsKLQlkZWZhdWx0OiAKKwlkZWZhdWx0OgogCQlwbS0+aW5wdXQubmFtZSA9IHBtX25hbWVfc291bmRrbm9iOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJwb3dlcm1hdGU6IHVua25vd24gcHJvZHVjdCBpZCAlMDR4XG4iLAogCQkgICAgICAgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKQEAgLTQwMiwxMSArNDAyLDExIEBACiAJdXNiX21ha2VfcGF0aCh1ZGV2LCBwYXRoLCA2NCk7CiAJc25wcmludGYocG0tPnBoeXMsIDY0LCAiJXMvaW5wdXQwIiwgcGF0aCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzXG4iLCBwbS0+aW5wdXQubmFtZSwgcG0tPmlucHV0LnBoeXMpOwotCQorCiAJLyogZm9yY2UgYW4gdXBkYXRlIG9mIGV2ZXJ5dGhpbmcgKi8KIAlwbS0+cmVxdWlyZXNfdXBkYXRlID0gVVBEQVRFX1BVTFNFX0FTTEVFUCB8IFVQREFURV9QVUxTRV9BV0FLRSB8IFVQREFURV9QVUxTRV9NT0RFIHwgVVBEQVRFX1NUQVRJQ19CUklHSFRORVNTOwogCXBvd2VybWF0ZV9wdWxzZV9sZWQocG0sIDB4ODAsIDI1NSwgMCwgMSwgMCk7IC8vIHNldCBkZWZhdWx0IHB1bHNlIHBhcmFtZXRlcnMKLSAgCisKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHBtKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3RvdWNoa2l0dXNiLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC90b3VjaGtpdHVzYi5jCmluZGV4IGE3MWYxYmIuLjM4NjU5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3RvdWNoa2l0dXNiLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdG91Y2hraXR1c2IuYwpAQCAtNjksNyArNjksNiBAQAogCXN0cnVjdCB1cmIgKmlycTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlzdHJ1Y3QgaW5wdXRfZGV2IGlucHV0OwotCWludCBvcGVuOwogCWNoYXIgbmFtZVsxMjhdOwogCWNoYXIgcGh5c1s2NF07CiB9OwpAQCAtMTM0LDE1ICsxMzMsMTAgQEAKIHsKIAlzdHJ1Y3QgdG91Y2hraXRfdXNiICp0b3VjaGtpdCA9IGlucHV0LT5wcml2YXRlOwogCi0JaWYgKHRvdWNoa2l0LT5vcGVuKyspCi0JCXJldHVybiAwOwotCiAJdG91Y2hraXQtPmlycS0+ZGV2ID0gdG91Y2hraXQtPnVkZXY7CiAKLQlpZiAodXNiX3N1Ym1pdF91cmIodG91Y2hraXQtPmlycSwgR0ZQX0FUT01JQykpIHsKLQkJdG91Y2hraXQtPm9wZW4tLTsKKwlpZiAodXNiX3N1Ym1pdF91cmIodG91Y2hraXQtPmlycSwgR0ZQX0FUT01JQykpCiAJCXJldHVybiAtRUlPOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTUxLDggKzE0NSw3IEBACiB7CiAJc3RydWN0IHRvdWNoa2l0X3VzYiAqdG91Y2hraXQgPSBpbnB1dC0+cHJpdmF0ZTsKIAotCWlmICghLS10b3VjaGtpdC0+b3BlbikKLQkJdXNiX2tpbGxfdXJiKHRvdWNoa2l0LT5pcnEpOworCXVzYl9raWxsX3VyYih0b3VjaGtpdC0+aXJxKTsKIH0KIAogc3RhdGljIGludCB0b3VjaGtpdF9hbGxvY19idWZmZXJzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvdXNia2JkLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYwppbmRleCA3MDM4ZmI5Li5mMzVkYjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2JrYmQuYwpAQCAtOSwxOCArOSwxOCBAQAogLyoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKiAKKyAqCiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKiAKKyAqCiAgKiBTaG91bGQgeW91IG5lZWQgdG8gY29udGFjdCBtZSwgdGhlIGF1dGhvciwgeW91IGNhbiBkbyBzbyBlaXRoZXIgYnkKICAqIGUtbWFpbCAtIG1haWwgeW91ciBtZXNzYWdlIHRvIDx2b2p0ZWNoQHVjdy5jej4sIG9yIGJ5IHBhcGVyIG1haWw6CiAgKiBWb2p0ZWNoIFBhdmxpaywgU2ltdW5rb3ZhIDE1OTQsIFByYWd1ZSA4LCAxODIgMDAgQ3plY2ggUmVwdWJsaWMKQEAgLTcyLDcgKzcyLDYgQEAKIAl1bnNpZ25lZCBjaGFyIG5ld2xlZHM7CiAJY2hhciBuYW1lWzEyOF07CiAJY2hhciBwaHlzWzY0XTsKLQlpbnQgb3BlbjsKIAogCXVuc2lnbmVkIGNoYXIgKm5ldzsKIAlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcjsKQEAgLTE2Niw3ICsxNjUsNyBAQAogCiAJaWYgKHVyYi0+c3RhdHVzKQogCQl3YXJuKCJsZWQgdXJiIHN0YXR1cyAlZCByZWNlaXZlZCIsIHVyYi0+c3RhdHVzKTsKLQkKKwogCWlmICgqKGtiZC0+bGVkcykgPT0ga2JkLT5uZXdsZWRzKQogCQlyZXR1cm47CiAKQEAgLTE4MCwxNCArMTc5LDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gZGV2LT5wcml2YXRlOwogCi0JaWYgKGtiZC0+b3BlbisrKQotCQlyZXR1cm4gMDsKLQogCWtiZC0+aXJxLT5kZXYgPSBrYmQtPnVzYmRldjsKLQlpZiAodXNiX3N1Ym1pdF91cmIoa2JkLT5pcnEsIEdGUF9LRVJORUwpKSB7Ci0JCWtiZC0+b3Blbi0tOworCWlmICh1c2Jfc3VibWl0X3VyYihrYmQtPmlycSwgR0ZQX0tFUk5FTCkpCiAJCXJldHVybiAtRUlPOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTk2LDggKzE5MCw3IEBACiB7CiAJc3RydWN0IHVzYl9rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKIAotCWlmICghLS1rYmQtPm9wZW4pCi0JCXVzYl9raWxsX3VyYihrYmQtPmlycSk7CisJdXNiX2tpbGxfdXJiKGtiZC0+aXJxKTsKIH0KIAogc3RhdGljIGludCB1c2Jfa2JkX2FsbG9jX21lbShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzdHJ1Y3QgdXNiX2tiZCAqa2JkKQpAQCAtMjMwLDcgKzIyMyw3IEBACiAJCXVzYl9idWZmZXJfZnJlZShkZXYsIDEsIGtiZC0+bGVkcywga2JkLT5sZWRzX2RtYSk7CiB9CiAKLXN0YXRpYyBpbnQgdXNiX2tiZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UsIAorc3RhdGljIGludCB1c2Jfa2JkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwKIAkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKiBkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGlmYWNlKTsKQEAgLTI3Miw3ICsyNjUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykKIAkJc2V0X2JpdCh1c2Jfa2JkX2tleWNvZGVbaV0sIGtiZC0+ZGV2LmtleWJpdCk7CiAJY2xlYXJfYml0KDAsIGtiZC0+ZGV2LmtleWJpdCk7Ci0JCisKIAlrYmQtPmRldi5wcml2YXRlID0ga2JkOwogCWtiZC0+ZGV2LmV2ZW50ID0gdXNiX2tiZF9ldmVudDsKIAlrYmQtPmRldi5vcGVuID0gdXNiX2tiZF9vcGVuOwpAQCAtMjk0LDcgKzI4Nyw3IEBACiAJc3ByaW50ZihrYmQtPnBoeXMsICIlcy9pbnB1dDAiLCBwYXRoKTsKIAogCWtiZC0+ZGV2Lm5hbWUgPSBrYmQtPm5hbWU7Ci0Ja2JkLT5kZXYucGh5cyA9IGtiZC0+cGh5czsJCisJa2JkLT5kZXYucGh5cyA9IGtiZC0+cGh5czsKIAlrYmQtPmRldi5pZC5idXN0eXBlID0gQlVTX1VTQjsKIAlrYmQtPmRldi5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwogCWtiZC0+ZGV2LmlkLnByb2R1Y3QgPSBsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKQEAgLTMyOSw3ICszMjIsNyBAQAogc3RhdGljIHZvaWQgdXNiX2tiZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2Jfa2JkICprYmQgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKLQkKKwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJaWYgKGtiZCkgewogCQl1c2Jfa2lsbF91cmIoa2JkLT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYm1vdXNlLmMKaW5kZXggMDExNTViYi4uMWVjNDFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jCkBAIC05LDE4ICs5LDE4IEBACiAvKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqIAorICoKICAqIFNob3VsZCB5b3UgbmVlZCB0byBjb250YWN0IG1lLCB0aGUgYXV0aG9yLCB5b3UgY2FuIGRvIHNvIGVpdGhlciBieQogICogZS1tYWlsIC0gbWFpbCB5b3VyIG1lc3NhZ2UgdG8gPHZvanRlY2hAdWN3LmN6Piwgb3IgYnkgcGFwZXIgbWFpbDoKICAqIFZvanRlY2ggUGF2bGlrLCBTaW11bmtvdmEgMTU5NCwgUHJhZ3VlIDgsIDE4MiAwMCBDemVjaCBSZXB1YmxpYwpAQCAtNTEsNyArNTEsNiBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CiAJc3RydWN0IGlucHV0X2RldiBkZXY7CiAJc3RydWN0IHVyYiAqaXJxOwotCWludCBvcGVuOwogCiAJc2lnbmVkIGNoYXIgKmRhdGE7CiAJZG1hX2FkZHJfdCBkYXRhX2RtYTsKQEAgLTEwMSwxNCArMTAwLDkgQEAKIHsKIAlzdHJ1Y3QgdXNiX21vdXNlICptb3VzZSA9IGRldi0+cHJpdmF0ZTsKIAotCWlmIChtb3VzZS0+b3BlbisrKQotCQlyZXR1cm4gMDsKLQogCW1vdXNlLT5pcnEtPmRldiA9IG1vdXNlLT51c2JkZXY7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKG1vdXNlLT5pcnEsIEdGUF9LRVJORUwpKSB7Ci0JCW1vdXNlLT5vcGVuLS07CisJaWYgKHVzYl9zdWJtaXRfdXJiKG1vdXNlLT5pcnEsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExNyw4ICsxMTEsNyBAQAogewogCXN0cnVjdCB1c2JfbW91c2UgKm1vdXNlID0gZGV2LT5wcml2YXRlOwogCi0JaWYgKCEtLW1vdXNlLT5vcGVuKQotCQl1c2Jfa2lsbF91cmIobW91c2UtPmlycSk7CisJdXNiX2tpbGxfdXJiKG1vdXNlLT5pcnEpOwogfQogCiBzdGF0aWMgaW50IHVzYl9tb3VzZV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqIGludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICogaWQpCkBAIC0xMzIsMTkgKzEyNSwxOSBAQAogCiAJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAKLQlpZiAoaW50ZXJmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHMgIT0gMSkgCisJaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDEpCiAJCXJldHVybiAtRU5PREVWOwogCiAJZW5kcG9pbnQgPSAmaW50ZXJmYWNlLT5lbmRwb2ludFswXS5kZXNjOwotCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkpIAorCWlmICghKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkpCiAJCXJldHVybiAtRU5PREVWOwotCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpICE9IDMpIAorCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpICE9IDMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOwogCW1heHAgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOwogCi0JaWYgKCEobW91c2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX21vdXNlKSwgR0ZQX0tFUk5FTCkpKSAKKwlpZiAoIShtb3VzZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfbW91c2UpLCBHRlBfS0VSTkVMKSkpCiAJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChtb3VzZSwgMCwgc2l6ZW9mKHN0cnVjdCB1c2JfbW91c2UpKTsKIApAQCAtMjA5LDcgKzIwMiw3IEBACiBzdGF0aWMgdm9pZCB1c2JfbW91c2VfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNiX21vdXNlICptb3VzZSA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwotCQorCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlpZiAobW91c2UpIHsKIAkJdXNiX2tpbGxfdXJiKG1vdXNlLT5pcnEpOwpAQCAtMjM4LDcgKzIzMSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB1c2JfbW91c2VfaW5pdCh2b2lkKQogewogCWludCByZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJnVzYl9tb3VzZV9kcml2ZXIpOwotCWlmIChyZXR2YWwgPT0gMCkgCisJaWYgKHJldHZhbCA9PSAwKQogCQlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jCmluZGV4IGZlYzA0ZGQuLmY2YjM0YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uYwpAQCAtOSw3ICs5LDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMDAgRGFuaWVsIEVnZ2VyCQk8ZWdnZXJAc3VzZS5kZT4KICAqICBDb3B5cmlnaHQgKGMpIDIwMDEgRnJlZGVyaWMgTGVwaWVkCQk8ZmxlcGllZEBtYW5kcmFrZXNvZnQuY29tPgogICogIENvcHlyaWdodCAoYykgMjAwNCBQYW5hZ2lvdGlzIElzc2FyaXMJPHBhbmFnaW90aXMuaXNzYXJpc0BtZWNoLmt1bGV1dmVuLmFjLmJlPgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IFBpbmcgQ2hlbmcJCTxwaW5nY0B3YWNvbS5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDUgUGluZyBDaGVuZwkJPHBpbmdjQHdhY29tLmNvbT4KICAqCiAgKiAgQ2hhbmdlTG9nOgogICogICAgICB2MC4xICh2cCkgIC0gSW5pdGlhbCByZWxlYXNlCkBAIC0xOCw3ICsxOCw3IEBACiAgKgl2MC40IChzbSkgIC0gU3VwcG9ydCBmb3IgbW9yZSBJbnR1b3MgbW9kZWxzLCBtZW51c3RyaXAKICAqCQkJcmVsYXRpdmUgbW9kZSwgcHJveGltaXR5LgogICoJdjAuNSAodnApICAtIEJpZyBjbGVhbnVwLCBuaWZ0eSBmZWF0dXJlcyByZW1vdmVkLAotICogCQkJdGhleSBiZWxvbmcgaW4gdXNlcnNwYWNlCisgKgkJCXRoZXkgYmVsb25nIGluIHVzZXJzcGFjZQogICoJdjEuOCAodnApICAtIFN1Ym1pdCBVUkIgb25seSB3aGVuIG9wZXJhdGluZywgbW92ZWQgdG8gQ1ZTLAogICoJCQl1c2UgaW5wdXRfcmVwb3J0X2tleSBpbnN0ZWFkIG9mIHJlcG9ydF9idG4gYW5kCiAgKgkJCW90aGVyIGNsZWFudXBzCkBAIC01MSw2ICs1MSw5IEBACiAgKgkJICAgLSBDbGVhbnVwcyBoZXJlIGFuZCB0aGVyZQogICogICAgdjEuMzAuMSAocGkpIC0gQWRkZWQgR3JhcGhpcmUzIHN1cHBvcnQKICAqCXYxLjQwIChwYykgLSBBZGQgc3VwcG9ydCBmb3Igc2V2ZXJhbCBuZXcgZGV2aWNlcywgZml4IGVyYXNlciByZXBvcnRpbmcsIC4uLgorICoJdjEuNDMgKHBjKSAtIEFkZGVkIHN1cHBvcnQgZm9yIENpbnRpcSAyMVVYCisJCSAgIC0gRml4ZWQgYSBHcmFwaGlyZSBidWcKKwkJICAgLSBNZXJnZWQgd2Fjb21faW50dW9zM19pcnEgaW50byB3YWNvbV9pbnR1b3NfaXJxCiAgKi8KIAogLyoKQEAgLTcyLDcgKzc1LDcgQEAKIC8qCiAgKiBWZXJzaW9uIEluZm9ybWF0aW9uCiAgKi8KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjQwIgorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNDMiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgV2Fjb20gR3JhcGhpcmUgYW5kIFdhY29tIEludHVvcyB0YWJsZXQgZHJpdmVyIgogI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgpAQCAtODMsNiArODYsMTYgQEAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1dBQ09NCTB4MDU2YQogCitlbnVtIHsKKwlQRU5QQVJUTkVSID0gMCwKKwlHUkFQSElSRSwKKwlQTCwKKwlJTlRVT1MsCisJSU5UVU9TMywKKwlDSU5USVEsCisJTUFYX1RZUEUKK307CisKIHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB7CiAJY2hhciAqbmFtZTsKIAlpbnQgcGt0bGVuOwpAQCAtMTAyLDcgKzExNSw2IEBACiAJc3RydWN0IHVyYiAqaXJxOwogCXN0cnVjdCB3YWNvbV9mZWF0dXJlcyAqZmVhdHVyZXM7CiAJaW50IHRvb2xbMl07Ci0JaW50IG9wZW47CiAJX191MzIgc2VyaWFsWzJdOwogCWNoYXIgcGh5c1szMl07CiB9OwpAQCAtMTQ5LDcgKzE2MSw3IEBACiAJcHJveCA9IGRhdGFbMV0gJiAweDQwOwogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwotCQorCiAJaWYgKHByb3gpIHsKIAogCQlwcmVzc3VyZSA9IChzaWduZWQgY2hhcikoKGRhdGFbN10gPDwgMSkgfCAoKGRhdGFbNF0gPj4gMikgJiAxKSk7CkBAIC0xNjYsOCArMTc4LDcgQEAKIAkJaWYgKCF3YWNvbS0+dG9vbFswXSkgewogCQkJLyogR29pbmcgaW50byBwcm94aW1pdHkgc2VsZWN0IHRvb2wgKi8KIAkJCXdhY29tLT50b29sWzFdID0gKGRhdGFbNF0gJiAweDIwKT8gQlROX1RPT0xfUlVCQkVSIDogQlROX1RPT0xfUEVOOwotCQl9Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJLyogd2FzIGVudGVyZWQgd2l0aCBzdHlsdXMyIHByZXNzZWQgKi8KIAkJCWlmICh3YWNvbS0+dG9vbFsxXSA9PSBCVE5fVE9PTF9SVUJCRVIgJiYgIShkYXRhWzRdICYgMHgyMCkgKSB7CiAJCQkJLyogcmVwb3J0IG91dCBwcm94aW1pdHkgZm9yIHByZXZpb3VzIHRvb2wgKi8KQEAgLTE4MiwxNiArMTkzLDE1IEBACiAJCQl3YWNvbS0+dG9vbFsxXSA9IEJUTl9UT09MX1BFTjsKIAkJfQogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgd2Fjb20tPnRvb2xbMV0sIHByb3gpOyAvKiByZXBvcnQgaW4gcHJveGltaXR5IGZvciB0b29sICovCi0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgZGF0YVszXSB8ICgoX191MzIpZGF0YVsyXSA8PCA3KSB8ICgoX191MzIpKGRhdGFbMV0gJiAweDAzKSA8PCAxNCkpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGRhdGFbNl0gfCAoKF9fdTMyKWRhdGFbNV0gPDwgNykgfCAoKF9fdTMyKShkYXRhWzRdICYgMHgwMykgPDwgMTQpKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBkYXRhWzNdIHwgKGRhdGFbMl0gPDwgNykgfCAoKGRhdGFbMV0gJiAweDAzKSA8PCAxNCkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGRhdGFbNl0gfCAoZGF0YVs1XSA8PCA3KSB8ICgoZGF0YVs0XSAmIDB4MDMpIDw8IDE0KSk7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIHByZXNzdXJlKTsKIAogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPVUNILCBkYXRhWzRdICYgMHgwOCk7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTLCBkYXRhWzRdICYgMHgxMCk7CiAJCS8qIE9ubHkgYWxsb3cgdGhlIHN0eWx1czIgYnV0dG9uIHRvIGJlIHJlcG9ydGVkIGZvciB0aGUgcGVuIHRvb2wuICovCiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTMiwgKHdhY29tLT50b29sWzFdID09IEJUTl9UT09MX1BFTikgJiYgKGRhdGFbNF0gJiAweDIwKSk7Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIHJlcG9ydCBwcm94aW1pdHktb3V0IG9mIGEgKHZhbGlkKSB0b29sICovCiAJCWlmICh3YWNvbS0+dG9vbFsxXSAhPSBCVE5fVE9PTF9SVUJCRVIpIHsKIAkJCS8qIFVua25vd24gdG9vbCBzZWxlY3RlZCBkZWZhdWx0IHRvIHBlbiB0b29sICovCkBAIC0yMDMsNyArMjEzLDcgQEAKIAl3YWNvbS0+dG9vbFswXSA9IHByb3g7IC8qIFNhdmUgcHJveGltaXR5IHN0YXRlICovCiAJaW5wdXRfc3luYyhkZXYpOwogCi1leGl0OgorIGV4aXQ6CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLApAQCAtMjMyLDIwICsyNDIsMTYgQEAKIAkJZ290byBleGl0OwogCX0KIAotCWlmIChkYXRhWzBdICE9IDIpCi0JeworCWlmIChkYXRhWzBdICE9IDIpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAid2Fjb21fcHR1X2lycTogcmVjZWl2ZWQgdW5rbm93biByZXBvcnQgIyVkXG4iLCBkYXRhWzBdKTsKIAkJZ290byBleGl0OwogCX0KIAogCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKLQlpZiAoZGF0YVsxXSAmIDB4MDQpCi0JeworCWlmIChkYXRhWzFdICYgMHgwNCkgewogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfUlVCQkVSLCBkYXRhWzFdICYgMHgyMCk7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDA4KTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfUEVOLCBkYXRhWzFdICYgMHgyMCk7CiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDAxKTsKIAl9CkBAIC0yNTcsNyArMjYzLDcgQEAKIAogCWlucHV0X3N5bmMoZGV2KTsKIAotZXhpdDoKKyBleGl0OgogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXR2YWwpCiAJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKQEAgLTMwMCw3ICszMDYsNyBAQAogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTLCAoZGF0YVs1XSAmIDB4NDApKTsKIAlpbnB1dF9zeW5jKGRldik7CiAKLWV4aXQ6CisgZXhpdDoKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQogCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCkBAIC0zNDAsNDcgKzM0Niw0NyBAQAogCiAJaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwogCi0Jc3dpdGNoICgoZGF0YVsxXSA+PiA1KSAmIDMpIHsKKwlpZiAoZGF0YVsxXSAmIDB4MTApIHsgLyogaW4gcHJveCAqLwogCi0JCWNhc2UgMDoJLyogUGVuICovCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfUEVOLCBkYXRhWzFdICYgMHg4MCk7Ci0JCQlicmVhazsKKwkJc3dpdGNoICgoZGF0YVsxXSA+PiA1KSAmIDMpIHsKIAotCQljYXNlIDE6IC8qIFJ1YmJlciAqLwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT09MX1JVQkJFUiwgZGF0YVsxXSAmIDB4ODApOwotCQkJYnJlYWs7CisJCQljYXNlIDA6CS8qIFBlbiAqLworCQkJCXdhY29tLT50b29sWzBdID0gQlROX1RPT0xfUEVOOworCQkJCWJyZWFrOwogCi0JCWNhc2UgMjogLyogTW91c2Ugd2l0aCB3aGVlbCAqLwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbMV0gJiAweDA0KTsKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsIChzaWduZWQgY2hhcikgZGF0YVs2XSk7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJCWNhc2UgMTogLyogUnViYmVyICovCisJCQkJd2Fjb20tPnRvb2xbMF0gPSBCVE5fVE9PTF9SVUJCRVI7CisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBjYXNlIDM6IC8qIE1vdXNlIHdpdGhvdXQgd2hlZWwgKi8KLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9NT1VTRSwgZGF0YVs3XSA+IDI0KTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgZGF0YVsxXSAmIDB4MDEpOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgZGF0YVsxXSAmIDB4MDIpOwotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgZGF0YVs3XSk7CisJCQljYXNlIDI6IC8qIE1vdXNlIHdpdGggd2hlZWwgKi8KKwkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVsxXSAmIDB4MDQpOworCQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsIChzaWduZWQgY2hhcikgZGF0YVs2XSk7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCiAKLQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkpOwotCi0JCQlpbnB1dF9zeW5jKGRldik7Ci0JCQlnb3RvIGV4aXQ7CisJCQljYXNlIDM6IC8qIE1vdXNlIHdpdGhvdXQgd2hlZWwgKi8KKwkJCQl3YWNvbS0+dG9vbFswXSA9IEJUTl9UT09MX01PVVNFOworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgZGF0YVsxXSAmIDB4MDEpOworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGRhdGFbMV0gJiAweDAyKTsKKwkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCBkYXRhWzddKTsKKwkJCQlicmVhazsKKwkJfQogCX0KIAogCWlmIChkYXRhWzFdICYgMHg4MCkgewogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIHgpOwogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIHkpOwogCX0KKwlpZiAod2Fjb20tPnRvb2xbMF0gIT0gQlROX1RPT0xfTU9VU0UpIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmRhdGFbNl0pKTsKKwkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZGF0YVsxXSAmIDB4MDEpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgZGF0YVsxXSAmIDB4MDIpOworCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsIGRhdGFbMV0gJiAweDA0KTsKKwl9CiAKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1BSRVNTVVJFLCBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAmZGF0YVs2XSkpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDAxKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgZGF0YVsxXSAmIDB4MDIpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTMiwgZGF0YVsxXSAmIDB4MDQpOwotCisJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzBdLCBkYXRhWzFdICYgMHgxMCk7CiAJaW5wdXRfc3luYyhkZXYpOwogCi1leGl0OgorIGV4aXQ6CiAJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldHZhbCkKIAkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLApAQCAtMzk4LDE0ICs0MDQsMTMgQEAKIAlpZHggPSBkYXRhWzFdICYgMHgwMTsKIAogCS8qIEVudGVyIHJlcG9ydCAqLwotCWlmICgoZGF0YVsxXSAmIDB4ZmMpID09IDB4YzApCi0JeworCWlmICgoZGF0YVsxXSAmIDB4ZmMpID09IDB4YzApIHsKIAkJLyogc2VyaWFsIG51bWJlciBvZiB0aGUgdG9vbCAqLwotCQl3YWNvbS0+c2VyaWFsW2lkeF0gPSAoKF9fdTMyKShkYXRhWzNdICYgMHgwZikgPDwgMjgpICsKLQkJCSgoX191MzIpZGF0YVs0XSA8PCAyMCkgKyAoKF9fdTMyKWRhdGFbNV0gPDwgMTIpICsKLQkJCSgoX191MzIpZGF0YVs2XSA8PCA0KSArIChkYXRhWzddID4+IDQpOworCQl3YWNvbS0+c2VyaWFsW2lkeF0gPSAoKGRhdGFbM10gJiAweDBmKSA8PCAyOCkgKworCQkJKGRhdGFbNF0gPDwgMjApICsgKGRhdGFbNV0gPDwgMTIpICsKKwkJCShkYXRhWzZdIDw8IDQpICsgKGRhdGFbN10gPj4gNCk7CiAKLQkJc3dpdGNoICgoKF9fdTMyKWRhdGFbMl0gPDwgNCkgfCAoZGF0YVszXSA+PiA0KSkgeworCQlzd2l0Y2ggKChkYXRhWzJdIDw8IDQpIHwgKGRhdGFbM10gPj4gNCkpIHsKIAkJCWNhc2UgMHg4MTI6IC8qIElua2luZyBwZW4gKi8KIAkJCWNhc2UgMHg4MDE6IC8qIEludHVvczMgSW5raW5nIHBlbiAqLwogCQkJY2FzZSAweDAxMjoKQEAgLTQ0OSw3ICs0NTQsNyBAQAogCQkJY2FzZSAweDExMjoKIAkJCWNhc2UgMHg5MTM6IC8qIEludHVvczMgQWlyYnJ1c2ggKi8KIAkJCQl3YWNvbS0+dG9vbFtpZHhdID0gQlROX1RPT0xfQUlSQlJVU0g7Ci0JCQkJYnJlYWs7CS8qIEFpcmJydXNoICovCisJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OiAvKiBVbmtub3duIHRvb2wgKi8KIAkJCQl3YWNvbS0+dG9vbFtpZHhdID0gQlROX1RPT0xfUEVOOwogCQl9CkBAIC00NzgsOSArNDgzLDggQEAKIAl1bnNpZ25lZCBpbnQgdDsKIAogCS8qIGdlbmVyYWwgcGVuIHBhY2tldCAqLwotCWlmICgoZGF0YVsxXSAmIDB4YjgpID09IDB4YTApCi0JewotCQl0ID0gKChfX3UzMilkYXRhWzZdIDw8IDIpIHwgKChkYXRhWzddID4+IDYpICYgMyk7CisJaWYgKChkYXRhWzFdICYgMHhiOCkgPT0gMHhhMCkgeworCQl0ID0gKGRhdGFbNl0gPDwgMikgfCAoKGRhdGFbN10gPj4gNikgJiAzKTsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgdCk7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVElMVF9YLAogCQkJCSgoZGF0YVs3XSA8PCAxKSAmIDB4N2UpIHwgKGRhdGFbOF0gPj4gNykpOwpAQCAtNDkxLDEwICs0OTUsOSBAQAogCX0KIAogCS8qIGFpcmJydXNoIHNlY29uZCBwYWNrZXQgKi8KLQlpZiAoKGRhdGFbMV0gJiAweGJjKSA9PSAweGI0KQotCXsKKwlpZiAoKGRhdGFbMV0gJiAweGJjKSA9PSAweGI0KSB7CiAJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfV0hFRUwsCi0JCQkJKChfX3UzMilkYXRhWzZdIDw8IDIpIHwgKChkYXRhWzddID4+IDYpICYgMykpOworCQkJCShkYXRhWzZdIDw8IDIpIHwgKChkYXRhWzddID4+IDYpICYgMykpOwogCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RJTFRfWCwKIAkJCQkoKGRhdGFbN10gPDwgMSkgJiAweDdlKSB8IChkYXRhWzhdID4+IDcpKTsKIAkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19USUxUX1ksIGRhdGFbOF0gJiAweDdmKTsKQEAgLTUyNiw3ICs1MjksNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKGRhdGFbMF0gIT0gMiAmJiBkYXRhWzBdICE9IDUgJiYgZGF0YVswXSAhPSA2KSB7CisJaWYgKGRhdGFbMF0gIT0gMiAmJiBkYXRhWzBdICE9IDUgJiYgZGF0YVswXSAhPSA2ICYmIGRhdGFbMF0gIT0gMTIpIHsKIAkJZGJnKCJ3YWNvbV9pbnR1b3NfaXJxOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWQiLCBkYXRhWzBdKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTUzNiwxMDcgKzUzOSwxMCBAQAogCS8qIHRvb2wgbnVtYmVyICovCiAJaWR4ID0gZGF0YVsxXSAmIDB4MDE7CiAKLQkvKiBwcm9jZXNzIGluL291dCBwcm94IGV2ZW50cyAqLwotCWlmICh3YWNvbV9pbnR1b3NfaW5vdXQodXJiKSkgZ290byBleGl0OwotCi0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSAmZGF0YVsyXSkpOwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgYmUxNl90b19jcHUoKihfX2JlMTYgKikgJmRhdGFbNF0pKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCBkYXRhWzldKTsKLQotCS8qIHByb2Nlc3MgZ2VuZXJhbCBwYWNrZXRzICovCi0Jd2Fjb21faW50dW9zX2dlbmVyYWwodXJiKTsKLQkKLQlpZiAoKGRhdGFbMV0gJiAweGJjKSA9PSAweGE4IHx8IChkYXRhWzFdICYgMHhiZSkgPT0gMHhiMCkgewkJLyogNEQgbW91c2Ugb3IgTGVucyBjdXJzb3IgcGFja2V0cyAqLwotCi0JCWlmIChkYXRhWzFdICYgMHgwMikgewkJCQkJCS8qIFJvdGF0aW9uIHBhY2tldCAqLwotCi0JCQl0ID0gKChfX3UzMilkYXRhWzZdIDw8IDMpIHwgKChkYXRhWzddID4+IDUpICYgNyk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JaLCAoZGF0YVs3XSAmIDB4MjApID8gKCh0IC0gMSkgLyAyKSA6IC10IC8gMik7Ci0KLQkJfSBlbHNlIHsKLQotCSAJCWlmICgoZGF0YVsxXSAmIDB4MTApID09IDApIHsJCQkJLyogNEQgbW91c2UgcGFja2V0cyAqLwotCi0JCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDIpOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgwNCk7Ci0KLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MjApOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgxMCk7Ci0JCQkJdCA9ICgoX191MzIpZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpOwotCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVEhST1RUTEUsIChkYXRhWzhdICYgMHgwOCkgPyAtdCA6IHQpOwotCi0JCQl9IGVsc2UgewotCQkJCWlmICh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX01PVVNFKSB7CS8qIDJEIG1vdXNlIHBhY2tldHMgKi8JCi0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwNCk7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwOCk7Ci0JCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgxMCk7Ci0JCQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsIAotCQkJCQkgICAgKC0oX191MzIpKGRhdGFbOF0gJiAweDAxKSArIChfX3UzMikoKGRhdGFbOF0gJiAweDAyKSA+PiAxKSkpOwotCQkJCX0KLQkJCQllbHNlIHsgICAgIC8qIExlbnMgY3Vyc29yIHBhY2tldHMgKi8KLQkJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKLQkJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDAyKTsKLQkJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgIGRhdGFbOF0gJiAweDA0KTsKLQkJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TSURFLCAgIGRhdGFbOF0gJiAweDEwKTsKLQkJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDA4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sW2lkeF0sIDEpOwotCWlucHV0X2V2ZW50KGRldiwgRVZfTVNDLCBNU0NfU0VSSUFMLCB3YWNvbS0+c2VyaWFsW2lkeF0pOwotCWlucHV0X3N5bmMoZGV2KTsKLQotZXhpdDoKLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0dmFsKQotCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOwotfQotCi1zdGF0aWMgdm9pZCB3YWNvbV9pbnR1b3MzX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZ3YWNvbS0+ZGV2OwotCXVuc2lnbmVkIGludCB0OwotCWludCBpZHgsIHJldHZhbDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6Ci0JCS8qIHN1Y2Nlc3MgKi8KLQkJYnJlYWs7Ci0JY2FzZSAtRUNPTk5SRVNFVDoKLQljYXNlIC1FTk9FTlQ6Ci0JY2FzZSAtRVNIVVRET1dOOgotCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogY2hlY2sgZm9yIHZhbGlkIHJlcG9ydCAqLwotCWlmIChkYXRhWzBdICE9IDIgJiYgZGF0YVswXSAhPSA1ICYmIGRhdGFbMF0gIT0gMTIpCi0JewotCQlwcmludGsoS0VSTl9JTkZPICJ3YWNvbV9pbnR1b3MzX2lycTogcmVjZWl2ZWQgdW5rbm93biByZXBvcnQgIyVkXG4iLCBkYXRhWzBdKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKLQotCS8qIHRvb2wgaW5kZXggaXMgYWx3YXlzIDAgaGVyZSBzaW5jZSB0aGVyZSBpcyBubyBkdWFsIGlucHV0IHRvb2wgKi8KLQlpZHggPSBkYXRhWzFdICYgMHgwMTsKLQogCS8qIHBhZCBwYWNrZXRzLiBXb3JrcyBhcyBhIHNlY29uZCB0b29sIGFuZCBpcyBhbHdheXMgaW4gcHJveCAqLwotCWlmIChkYXRhWzBdID09IDEyKQotCXsKKwlpZiAoZGF0YVswXSA9PSAxMikgewogCQkvKiBpbml0aWF0ZSB0aGUgcGFkIGFzIGEgZGV2aWNlICovCi0JCWlmICh3YWNvbS0+dG9vbFsxXSAhPSBCVE5fVE9PTF9GSU5HRVIpCi0JCXsKKwkJaWYgKHdhY29tLT50b29sWzFdICE9IEJUTl9UT09MX0ZJTkdFUikgewogCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9GSU5HRVI7CiAJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgd2Fjb20tPnRvb2xbMV0sIDEpOwogCQl9CkBAIC02NTYsMzcgKzU2Miw3OCBAQAogCX0KIAogCS8qIHByb2Nlc3MgaW4vb3V0IHByb3ggZXZlbnRzICovCi0JaWYgKHdhY29tX2ludHVvc19pbm91dCh1cmIpKSBnb3RvIGV4aXQ7CisJaWYgKHdhY29tX2ludHVvc19pbm91dCh1cmIpKQorCQlnb3RvIGV4aXQ7CiAKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsICgoX191MzIpZGF0YVsyXSA8PCA5KSB8ICgoX191MzIpZGF0YVszXSA8PCAxKSB8ICgoZGF0YVs5XSA+PiAxKSAmIDEpKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksICgoX191MzIpZGF0YVs0XSA8PCA5KSB8ICgoX191MzIpZGF0YVs1XSA8PCAxKSB8IChkYXRhWzldICYgMSkpOwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfRElTVEFOQ0UsICgoZGF0YVs5XSA+PiAyKSAmIDB4M2YpKTsKKwkvKiBDaW50aXEgZG9lc24ndCBzZW5kIGRhdGEgd2hlbiBSRFkgYml0IGlzbid0IHNldCAqLworCWlmICgod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IENJTlRJUSkgJiYgIShkYXRhWzFdICYgMHg0MCkpCisJCXJldHVybjsKKworCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPj0gSU5UVU9TMykgeworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIChkYXRhWzJdIDw8IDkpIHwgKGRhdGFbM10gPDwgMSkgfCAoKGRhdGFbOV0gPj4gMSkgJiAxKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgKGRhdGFbNF0gPDwgOSkgfCAoZGF0YVs1XSA8PCAxKSB8IChkYXRhWzldICYgMSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCAoKGRhdGFbOV0gPj4gMikgJiAweDNmKSk7CisJfSBlbHNlIHsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSAmZGF0YVsyXSkpOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGJlMTZfdG9fY3B1KCooX19iZTE2ICopICZkYXRhWzRdKSk7CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfRElTVEFOQ0UsICgoZGF0YVs5XSA+PiAzKSAmIDB4MWYpKTsKKwl9CiAKIAkvKiBwcm9jZXNzIGdlbmVyYWwgcGFja2V0cyAqLwogCXdhY29tX2ludHVvc19nZW5lcmFsKHVyYik7CiAKLQlpZiAoKGRhdGFbMV0gJiAweGJjKSA9PSAweGE4IHx8IChkYXRhWzFdICYgMHhiZSkgPT0gMHhiMCkKLQl7Ci0JCS8qIE1hcmtlciBwZW4gcm90YXRpb24gcGFja2V0LiBSZXBvcnRlZCBhcyB3aGVlbCBkdWUgdG8gdmFsdWF0b3IgbGltaXRhdGlvbiAqLwotCQlpZiAoZGF0YVsxXSAmIDB4MDIpCi0JCXsKLQkJCXQgPSAoKF9fdTMyKWRhdGFbNl0gPDwgMykgfCAoKGRhdGFbN10gPj4gNSkgJiA3KTsKLQkJCXQgPSAoZGF0YVs3XSAmIDB4MjApID8gKCh0ID4gOTAwKSA/ICgodC0xKSAvIDIgLSAxMzUwKSA6Ci0JCQkJKCh0LTEpIC8gMiArIDQ1MCkpIDogKDQ1MCAtIHQgLyAyKSA7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1dIRUVMLCB0KTsKLQkJfQorCS8qIDREIG1vdXNlLCAyRCBtb3VzZSwgbWFya2VyIHBlbiByb3RhdGlvbiwgb3IgTGVucyBjdXJzb3IgcGFja2V0cyAqLworCWlmICgoZGF0YVsxXSAmIDB4YmMpID09IDB4YTggfHwgKGRhdGFbMV0gJiAweGJlKSA9PSAweGIwKSB7CiAKLQkJLyogMkQgbW91c2UgcGFja2V0cyAqLwotCQlpZiAod2Fjb20tPnRvb2xbaWR4XSA9PSBCVE5fVE9PTF9NT1VTRSkKLQkJeworCQlpZiAoZGF0YVsxXSAmIDB4MDIpIHsKKwkJCS8qIFJvdGF0aW9uIHBhY2tldCAqLworCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA+PSBJTlRVT1MzKSB7CisJCQkJLyogSTMgbWFya2VyIHBlbiByb3RhdGlvbiByZXBvcnRlZCBhcyB3aGVlbAorCQkJCSAqIGR1ZSB0byB2YWx1YXRvciBsaW1pdGF0aW9uCisJCQkJICovCisJCQkJdCA9IChkYXRhWzZdIDw8IDMpIHwgKChkYXRhWzddID4+IDUpICYgNyk7CisJCQkJdCA9IChkYXRhWzddICYgMHgyMCkgPyAoKHQgPiA5MDApID8gKCh0LTEpIC8gMiAtIDEzNTApIDoKKwkJCQkJKCh0LTEpIC8gMiArIDQ1MCkpIDogKDQ1MCAtIHQgLyAyKSA7CisJCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19XSEVFTCwgdCk7CisJCQl9IGVsc2UgeworCQkJCS8qIDREIG1vdXNlIHJvdGF0aW9uIHBhY2tldCAqLworCQkJCXQgPSAoZGF0YVs2XSA8PCAzKSB8ICgoZGF0YVs3XSA+PiA1KSAmIDcpOworCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlosIChkYXRhWzddICYgMHgyMCkgPworCQkJCQkoKHQgLSAxKSAvIDIpIDogLXQgLyAyKTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCEoZGF0YVsxXSAmIDB4MTApICYmIHdhY29tLT5mZWF0dXJlcy0+dHlwZSA8IElOVFVPUzMpIHsKKwkJCS8qIDREIG1vdXNlIHBhY2tldCAqLworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwMik7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgZGF0YVs4XSAmIDB4MDQpOworCisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MjApOworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDEwKTsKKwkJCXQgPSAoZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpOworCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19USFJPVFRMRSwgKGRhdGFbOF0gJiAweDA4KSA/IC10IDogdCk7CisKKwkJfSBlbHNlIGlmICh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX01PVVNFKSB7CisJCQkvKiAyRCBtb3VzZSBwYWNrZXQgKi8KIAkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwNCk7CiAJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDgpOwogCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgIGRhdGFbOF0gJiAweDEwKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0lERSwgICBkYXRhWzhdICYgMHg0MCk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0VYVFJBLCAgZGF0YVs4XSAmIDB4MjApOwotCQkJLyogbW91c2Ugd2hlZWwgaXMgcG9zaXRpdmUgd2hlbiByb2xsZWQgYmFja3dhcmRzICovCi0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCAgKChfX3UzMikoKGRhdGFbOF0gJiAweDAyKSA+PiAxKQotCQkJCQkgLSAoX191MzIpKGRhdGFbOF0gJiAweDAxKSkpOworCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgKChkYXRhWzhdICYgMHgwMikgPj4gMSkKKwkJCQkJCSAtIChkYXRhWzhdICYgMHgwMSkpOworCisJCQkvKiBJMyAyRCBtb3VzZSBzaWRlIGJ1dHRvbnMgKi8KKwkJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMykgeworCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0lERSwgICBkYXRhWzhdICYgMHg0MCk7CisJCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDIwKTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA8IElOVFVPUzMpIHsKKwkJCS8qIExlbnMgY3Vyc29yIHBhY2tldHMgKi8KKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwMSk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDIpOworCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgIGRhdGFbOF0gJiAweDA0KTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU0lERSwgICBkYXRhWzhdICYgMHgxMCk7CisJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0VYVFJBLCAgZGF0YVs4XSAmIDB4MDgpOwogCQl9CiAJfQogCkBAIC03MDIsMzUgKzY0OSwzNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzW10gPSB7Ci0JeyAiV2Fjb20gUGVucGFydG5lciIsICAgIDcsICAgNTA0MCwgIDM3ODAsICAyNTUsIDMyLCAwLCB3YWNvbV9wZW5wYXJ0bmVyX2lycSB9LAotICAgICAgICB7ICJXYWNvbSBHcmFwaGlyZSIsICAgICAgOCwgIDEwMjA2LCAgNzQyMiwgIDUxMSwgMzIsIDEsIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMiA0eDUiLCA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCAzMiwgMSwgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0gCXsgIldhY29tIEdyYXBoaXJlMiA1eDciLCA4LCAgMTM5MTgsIDEwMjA2LCAgNTExLCAzMiwgMSwgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmUzIiwgICAgIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCAxLCB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTMgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgMzIsIDEsIHdhY29tX2dyYXBoaXJlX2lycSB9LAotICAJeyAiV2Fjb20gSW50dW9zIDR4NSIsICAgMTAsICAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCAyLCB3YWNvbV9pbnR1b3NfaXJxIH0sCi0gCXsgIldhY29tIEludHVvcyA2eDgiLCAgIDEwLCAgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotIAl7ICJXYWNvbSBJbnR1b3MgOXgxMiIsICAxMCwgIDMwNDgwLCAyNDA2MCwgMTAyMywgMTUsIDIsIHdhY29tX2ludHVvc19pcnEgfSwKLSAJeyAiV2Fjb20gSW50dW9zIDEyeDEyIiwgMTAsICAzMDQ4MCwgMzE2ODAsIDEwMjMsIDE1LCAyLCB3YWNvbV9pbnR1b3NfaXJxIH0sCi0gCXsgIldhY29tIEludHVvcyAxMngxOCIsIDEwLCAgNDU3MjAsIDMxNjgwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotIAl7ICJXYWNvbSBQTDQwMCIsICAgICAgICAgOCwgICA1NDA4LCAgNDA1NiwgIDI1NSwgMzIsIDMsIHdhY29tX3BsX2lycSB9LAotIAl7ICJXYWNvbSBQTDUwMCIsICAgICAgICAgOCwgICA2MTQ0LCAgNDYwOCwgIDI1NSwgMzIsIDMsIHdhY29tX3BsX2lycSB9LAotIAl7ICJXYWNvbSBQTDYwMCIsICAgICAgICAgOCwgICA2MTI2LCAgNDYwNCwgIDI1NSwgMzIsIDMsIHdhY29tX3BsX2lycSB9LAotIAl7ICJXYWNvbSBQTDYwMFNYIiwgICAgICAgOCwgICA2MjYwLCAgNTAxNiwgIDI1NSwgMzIsIDMsIHdhY29tX3BsX2lycSB9LAotIAl7ICJXYWNvbSBQTDU1MCIsICAgICAgICAgOCwgICA2MTQ0LCAgNDYwOCwgIDUxMSwgMzIsIDMsIHdhY29tX3BsX2lycSB9LAotIAl7ICJXYWNvbSBQTDgwMCIsICAgICAgICAgOCwgICA3MjIwLCAgNTc4MCwgIDUxMSwgMzIsIDMsIHdhY29tX3BsX2lycSB9LAotCXsgIldhY29tIEludHVvczIgNHg1IiwgICAxMCwgMTI3MDAsIDEwNjAwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotCXsgIldhY29tIEludHVvczIgNng4IiwgICAxMCwgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotCXsgIldhY29tIEludHVvczIgOXgxMiIsICAxMCwgMzA0ODAsIDI0MDYwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotCXsgIldhY29tIEludHVvczIgMTJ4MTIiLCAxMCwgMzA0ODAsIDMxNjgwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotCXsgIldhY29tIEludHVvczIgMTJ4MTgiLCAxMCwgNDU3MjAsIDMxNjgwLCAxMDIzLCAxNSwgMiwgd2Fjb21faW50dW9zX2lycSB9LAotCXsgIldhY29tIFZvbGl0byIsICAgICAgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgMSwgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gQ2ludGlxIFBhcnRuZXIiLDgsICAyMDQ4MCwgMTUzNjAsICA1MTEsIDMyLCAzLCB3YWNvbV9wdHVfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA0eDUiLCAgIDEwLCAyNTQwMCwgMjAzMjAsIDEwMjMsIDE1LCA0LCB3YWNvbV9pbnR1b3MzX2lycSB9LAotCXsgIldhY29tIEludHVvczMgNng4IiwgICAxMCwgNDA2NDAsIDMwNDgwLCAxMDIzLCAxNSwgNCwgd2Fjb21faW50dW9zM19pcnEgfSwKLQl7ICJXYWNvbSBJbnR1b3MzIDl4MTIiLCAgMTAsIDYwOTYwLCA0NTcyMCwgMTAyMywgMTUsIDQsIHdhY29tX2ludHVvczNfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCAyLCB3YWNvbV9pbnR1b3NfaXJxIH0sCi0gCXsgfQorCXsgIldhY29tIFBlbnBhcnRuZXIiLCAgICA3LCAgIDUwNDAsICAzNzgwLCAgMjU1LCAzMiwgUEVOUEFSVE5FUiwgd2Fjb21fcGVucGFydG5lcl9pcnEgfSwKKyAgICAgICAgeyAiV2Fjb20gR3JhcGhpcmUiLCAgICAgIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTIgNHg1IiwgOCwgIDEwMjA2LCAgNzQyMiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAorCXsgIldhY29tIEdyYXBoaXJlMiA1eDciLCA4LCAgMTM5MTgsIDEwMjA2LCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUzIiwgICAgIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTMgNng4IiwgOCwgIDE2NzA0LCAxMjA2NCwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAorCXsgIldhY29tIEludHVvcyA0eDUiLCAgIDEwLCAgMTI3MDAsIDEwNjAwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvcyA2eDgiLCAgIDEwLCAgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvcyA5eDEyIiwgIDEwLCAgMzA0ODAsIDI0MDYwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvcyAxMngxMiIsIDEwLCAgMzA0ODAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvcyAxMngxOCIsIDEwLCAgNDU3MjAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIFBMNDAwIiwgICAgICAgICA4LCAgIDU0MDgsICA0MDU2LCAgMjU1LCAzMiwgUEwsICAgICAgICAgd2Fjb21fcGxfaXJxIH0sCisJeyAiV2Fjb20gUEw1MDAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICAyNTUsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKKwl7ICJXYWNvbSBQTDYwMCIsICAgICAgICAgOCwgICA2MTI2LCAgNDYwNCwgIDI1NSwgMzIsIFBMLCAgICAgICAgIHdhY29tX3BsX2lycSB9LAorCXsgIldhY29tIFBMNjAwU1giLCAgICAgICA4LCAgIDYyNjAsICA1MDE2LCAgMjU1LCAzMiwgUEwsICAgICAgICAgd2Fjb21fcGxfaXJxIH0sCisJeyAiV2Fjb20gUEw1NTAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICA1MTEsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKKwl7ICJXYWNvbSBQTDgwMCIsICAgICAgICAgOCwgICA3MjIwLCAgNTc4MCwgIDUxMSwgMzIsIFBMLCAgICAgICAgIHdhY29tX3BsX2lycSB9LAorCXsgIldhY29tIEludHVvczIgNHg1IiwgICAxMCwgMTI3MDAsIDEwNjAwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczIgNng4IiwgICAxMCwgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczIgOXgxMiIsICAxMCwgMzA0ODAsIDI0MDYwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczIgMTJ4MTIiLCAxMCwgMzA0ODAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIEludHVvczIgMTJ4MTgiLCAxMCwgNDU3MjAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLCAgICAgd2Fjb21faW50dW9zX2lycSB9LAorCXsgIldhY29tIFZvbGl0byIsICAgICAgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCisJeyAiV2Fjb20gQ2ludGlxIFBhcnRuZXIiLDgsICAyMDQ4MCwgMTUzNjAsICA1MTEsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wdHVfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMyA0eDUiLCAgIDEwLCAyNTQwMCwgMjAzMjAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMyA2eDgiLCAgIDEwLCA0MDY0MCwgMzA0ODAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMyA5eDEyIiwgIDEwLCA2MDk2MCwgNDU3MjAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCisJeyAiV2Fjb20gQ2ludGlxIDIxVVgiLCAgIDEwLCA4NzIwMCwgNjU2MDAsIDEwMjMsIDE1LCBDSU5USVEsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCisJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2Fjb21faWRzW10gPSB7CkBAIC03NjEsNiArNzA5LDcgQEAKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhCMCkgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhCMSkgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHhCMikgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHgzRikgfSwKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XQUNPTSwgMHg0NykgfSwKIAl7IH0KIH07CkBAIC03NzEsMTQgKzcyMCw5IEBACiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IGRldi0+cHJpdmF0ZTsKIAotCWlmICh3YWNvbS0+b3BlbisrKQotCQlyZXR1cm4gMDsKLQogCXdhY29tLT5pcnEtPmRldiA9IHdhY29tLT51c2JkZXY7Ci0JaWYgKHVzYl9zdWJtaXRfdXJiKHdhY29tLT5pcnEsIEdGUF9LRVJORUwpKSB7Ci0JCXdhY29tLT5vcGVuLS07CisJaWYgKHVzYl9zdWJtaXRfdXJiKHdhY29tLT5pcnEsIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVJTzsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc4Nyw4ICs3MzEsNyBAQAogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAoIS0td2Fjb20tPm9wZW4pCi0JCXVzYl9raWxsX3VyYih3YWNvbS0+aXJxKTsKKwl1c2Jfa2lsbF91cmIod2Fjb20tPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgd2Fjb21fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTgyMywzMiArNzY2LDMzIEBACiAJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9QRU4pIHwgQklUKEJUTl9UT1VDSCkgfCBCSVQoQlROX1NUWUxVUyk7CiAKIAlzd2l0Y2ggKHdhY29tLT5mZWF0dXJlcy0+dHlwZSkgewotCQljYXNlIDE6CisJCWNhc2UgR1JBUEhJUkU6CiAJCQl3YWNvbS0+ZGV2LmV2Yml0WzBdIHw9IEJJVChFVl9SRUwpOwogCQkJd2Fjb20tPmRldi5yZWxiaXRbMF0gfD0gQklUKFJFTF9XSEVFTCk7CiAJCQl3YWNvbS0+ZGV2LmFic2JpdFswXSB8PSBCSVQoQUJTX0RJU1RBTkNFKTsKIAkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7Ci0gCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9SVUJCRVIpIHwgQklUKEJUTl9UT09MX01PVVNFKSB8IEJJVChCVE5fU1RZTFVTMik7CisJCQl3YWNvbS0+ZGV2LmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9UT09MX1JVQkJFUikgfCBCSVQoQlROX1RPT0xfTU9VU0UpIHwgQklUKEJUTl9TVFlMVVMyKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgNDogLyogbmV3IGZ1bmN0aW9ucyBmb3IgSW50dW9zMyAqLworCQljYXNlIElOVFVPUzM6CisJCWNhc2UgQ0lOVElROgogCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9GSU5HRVIpOwogCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fTEVGVCldIHw9IEJJVChCVE5fMCkgfCBCSVQoQlROXzEpIHwgQklUKEJUTl8yKSB8IEJJVChCVE5fMykgfCBCSVQoQlROXzQpIHwgQklUKEJUTl81KSB8IEJJVChCVE5fNikgfCBCSVQoQlROXzcpOwogCQkJd2Fjb20tPmRldi5hYnNiaXRbMF0gfD0gQklUKEFCU19SWCkgfCBCSVQoQUJTX1JZKTsKIAkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCi0JCWNhc2UgMjoKKwkJY2FzZSBJTlRVT1M6CiAJCQl3YWNvbS0+ZGV2LmV2Yml0WzBdIHw9IEJJVChFVl9NU0MpIHwgQklUKEVWX1JFTCk7CiAJCQl3YWNvbS0+ZGV2Lm1zY2JpdFswXSB8PSBCSVQoTVNDX1NFUklBTCk7CiAJCQl3YWNvbS0+ZGV2LnJlbGJpdFswXSB8PSBCSVQoUkVMX1dIRUVMKTsKIAkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSkgfCBCSVQoQlROX1NJREUpIHwgQklUKEJUTl9FWFRSQSk7Ci0gCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9SVUJCRVIpIHwgQklUKEJUTl9UT09MX01PVVNFKQl8IEJJVChCVE5fVE9PTF9CUlVTSCkKKwkJCXdhY29tLT5kZXYua2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfUlVCQkVSKSB8IEJJVChCVE5fVE9PTF9NT1VTRSkJfCBCSVQoQlROX1RPT0xfQlJVU0gpCiAJCQkJCQkJICB8IEJJVChCVE5fVE9PTF9QRU5DSUwpIHwgQklUKEJUTl9UT09MX0FJUkJSVVNIKSB8IEJJVChCVE5fVE9PTF9MRU5TKSB8IEJJVChCVE5fU1RZTFVTMik7CiAJCQl3YWNvbS0+ZGV2LmFic2JpdFswXSB8PSBCSVQoQUJTX0RJU1RBTkNFKSB8IEJJVChBQlNfV0hFRUwpIHwgQklUKEFCU19USUxUX1gpIHwgQklUKEFCU19USUxUX1kpIHwgQklUKEFCU19SWikgfCBCSVQoQUJTX1RIUk9UVExFKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgMzoKLSAJCQl3YWNvbS0+ZGV2LmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9TVFlMVVMyKSB8IEJJVChCVE5fVE9PTF9SVUJCRVIpOworCQljYXNlIFBMOgorCQkJd2Fjb20tPmRldi5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fU1RZTFVTMikgfCBCSVQoQlROX1RPT0xfUlVCQkVSKTsKIAkJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQveHBhZC5jIGIvZHJpdmVycy91c2IvaW5wdXQveHBhZC5jCmluZGV4IGQ2NWVkYjIuLmE3ZmExYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3hwYWQuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC94cGFkLmMKQEAgLTEwNCwxMyArMTA0LDEyIEBACiBzdHJ1Y3QgdXNiX3hwYWQgewogCXN0cnVjdCBpbnB1dF9kZXYgZGV2OwkJCS8qIGlucHV0IGRldmljZSBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsJCS8qIHVzYiBkZXZpY2UgKi8KLQkKKwogCXN0cnVjdCB1cmIgKmlycV9pbjsJCQkvKiB1cmIgZm9yIGludGVycnVwdCBpbiByZXBvcnQgKi8KIAl1bnNpZ25lZCBjaGFyICppZGF0YTsJCQkvKiBpbnB1dCBkYXRhICovCiAJZG1hX2FkZHJfdCBpZGF0YV9kbWE7Ci0JCisKIAljaGFyIHBoeXNbNjVdOwkJCQkvKiBwaHlzaWNhbCBkZXZpY2UgcGF0aCAqLwotCWludCBvcGVuX2NvdW50OwkJCQkvKiByZWZlcmVuY2UgY291bnQgKi8KIH07CiAKIC8qCkBAIC0xMjgsMzUgKzEyNywzNSBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9ICZ4cGFkLT5kZXY7CiAKIAlpbnB1dF9yZWdzKGRldiwgcmVncyk7Ci0JCisKIAkvKiBsZWZ0IHN0aWNrICovCiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCAoX19zMTYpICgoKF9fczE2KWRhdGFbMTNdIDw8IDgpIHwgZGF0YVsxMl0pKTsKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIChfX3MxNikgKCgoX19zMTYpZGF0YVsxNV0gPDwgOCkgfCBkYXRhWzE0XSkpOwotCQorCiAJLyogcmlnaHQgc3RpY2sgKi8KIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLCAoX19zMTYpICgoKF9fczE2KWRhdGFbMTddIDw8IDgpIHwgZGF0YVsxNl0pKTsKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JZLCAoX19zMTYpICgoKF9fczE2KWRhdGFbMTldIDw8IDgpIHwgZGF0YVsxOF0pKTsKLQkKKwogCS8qIHRyaWdnZXJzIGxlZnQvcmlnaHQgKi8KIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1osIGRhdGFbMTBdKTsKIAlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JaLCBkYXRhWzExXSk7Ci0JCisKIAkvKiBkaWdpdGFsIHBhZCAqLwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfSEFUMFgsICEhKGRhdGFbMl0gJiAweDA4KSAtICEhKGRhdGFbMl0gJiAweDA0KSk7CiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19IQVQwWSwgISEoZGF0YVsyXSAmIDB4MDIpIC0gISEoZGF0YVsyXSAmIDB4MDEpKTsKLQkKKwogCS8qIHN0YXJ0L2JhY2sgYnV0dG9ucyBhbmQgc3RpY2sgcHJlc3MgbGVmdC9yaWdodCAqLwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RBUlQsIChkYXRhWzJdICYgMHgxMCkgPj4gNCk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9CQUNLLCAoZGF0YVsyXSAmIDB4MjApID4+IDUpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVEhVTUJMLCAoZGF0YVsyXSAmIDB4NDApID4+IDYpOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVEhVTUJSLCBkYXRhWzJdID4+IDcpOwotCQorCiAJLyogImFuYWxvZyIgYnV0dG9ucyBBLCBCLCBYLCBZICovCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9BLCBkYXRhWzRdKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0IsIGRhdGFbNV0pOwogCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fWCwgZGF0YVs2XSk7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9ZLCBkYXRhWzddKTsKLQkKKwogCS8qICJhbmFsb2ciIGJ1dHRvbnMgYmxhY2ssIHdoaXRlICovCiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9DLCBkYXRhWzhdKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1osIGRhdGFbOV0pOwpAQCAtMTY4LDcgKzE2Nyw3IEBACiB7CiAJc3RydWN0IHVzYl94cGFkICp4cGFkID0gdXJiLT5jb250ZXh0OwogCWludCByZXR2YWw7Ci0JCisKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOgogCQkvKiBzdWNjZXNzICovCkBAIC0xODMsNyArMTgyLDcgQEAKIAkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKIAkJZ290byBleGl0OwogCX0KLQkKKwogCXhwYWRfcHJvY2Vzc19wYWNrZXQoeHBhZCwgMCwgeHBhZC0+aWRhdGEsIHJlZ3MpOwogCiBleGl0OgpAQCAtMTk2LDI1ICsxOTUsMTkgQEAKIHN0YXRpYyBpbnQgeHBhZF9vcGVuIChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IHVzYl94cGFkICp4cGFkID0gZGV2LT5wcml2YXRlOwotCQotCWlmICh4cGFkLT5vcGVuX2NvdW50KyspCi0JCXJldHVybiAwOwotCQorCiAJeHBhZC0+aXJxX2luLT5kZXYgPSB4cGFkLT51ZGV2OwotCWlmICh1c2Jfc3VibWl0X3VyYih4cGFkLT5pcnFfaW4sIEdGUF9LRVJORUwpKSB7Ci0JCXhwYWQtPm9wZW5fY291bnQtLTsKKwlpZiAodXNiX3N1Ym1pdF91cmIoeHBhZC0+aXJxX2luLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FSU87Ci0JfQotCQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHhwYWRfY2xvc2UgKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgdXNiX3hwYWQgKnhwYWQgPSBkZXYtPnByaXZhdGU7Ci0JCi0JaWYgKCEtLXhwYWQtPm9wZW5fY291bnQpCi0JCXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4pOworCisJdXNiX2tpbGxfdXJiKHhwYWQtPmlycV9pbik7CiB9CiAKIHN0YXRpYyBpbnQgeHBhZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQpAQCAtMjI0LDE5ICsyMTcsMTkgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2lycV9pbjsKIAljaGFyIHBhdGhbNjRdOwogCWludCBpOwotCQorCiAJZm9yIChpID0gMDsgeHBhZF9kZXZpY2VbaV0uaWRWZW5kb3I7IGkrKykgewogCQlpZiAoKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpID09IHhwYWRfZGV2aWNlW2ldLmlkVmVuZG9yKSAmJgogCQkgICAgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSB4cGFkX2RldmljZVtpXS5pZFByb2R1Y3QpKQogCQkJYnJlYWs7CiAJfQotCQorCiAJaWYgKCh4cGFkID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCB1c2JfeHBhZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CiAJCWVycigiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IHBhZCIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbWVtc2V0KHhwYWQsIDAsIHNpemVvZihzdHJ1Y3QgdXNiX3hwYWQpKTsKLQkKKwogCXhwYWQtPmlkYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyh1ZGV2LCBYUEFEX1BLVF9MRU4sCiAJCQkJICAgICAgIFNMQUJfQVRPTUlDLCAmeHBhZC0+aWRhdGFfZG1hKTsKIAlpZiAoIXhwYWQtPmlkYXRhKSB7CkBAIC0yNTEsMTggKzI0NCwxOCBAQAogICAgICAgICAgICAgICAgIGtmcmVlKHhwYWQpOwogCQlyZXR1cm4gLUVOT01FTTsKICAgICAgICAgfQotCQorCiAJZXBfaXJxX2luID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOwotCQorCiAJdXNiX2ZpbGxfaW50X3VyYih4cGFkLT5pcnFfaW4sIHVkZXYsCiAJCQkgdXNiX3JjdmludHBpcGUodWRldiwgZXBfaXJxX2luLT5iRW5kcG9pbnRBZGRyZXNzKSwKIAkJCSB4cGFkLT5pZGF0YSwgWFBBRF9QS1RfTEVOLCB4cGFkX2lycV9pbiwKIAkJCSB4cGFkLCBlcF9pcnFfaW4tPmJJbnRlcnZhbCk7CiAJeHBhZC0+aXJxX2luLT50cmFuc2Zlcl9kbWEgPSB4cGFkLT5pZGF0YV9kbWE7CiAJeHBhZC0+aXJxX2luLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQkKKwogCXhwYWQtPnVkZXYgPSB1ZGV2OwotCQorCiAJeHBhZC0+ZGV2LmlkLmJ1c3R5cGUgPSBCVVNfVVNCOwogCXhwYWQtPmRldi5pZC52ZW5kb3IgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKIAl4cGFkLT5kZXYuaWQucHJvZHVjdCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKQEAgLTI3MywyMSArMjY2LDIxIEBACiAJeHBhZC0+ZGV2LnBoeXMgPSB4cGFkLT5waHlzOwogCXhwYWQtPmRldi5vcGVuID0geHBhZF9vcGVuOwogCXhwYWQtPmRldi5jbG9zZSA9IHhwYWRfY2xvc2U7Ci0JCisKIAl1c2JfbWFrZV9wYXRoKHVkZXYsIHBhdGgsIDY0KTsKIAlzbnByaW50Zih4cGFkLT5waHlzLCA2NCwgICIlcy9pbnB1dDAiLCBwYXRoKTsKLQkKKwogCXhwYWQtPmRldi5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7Ci0JCisKIAlmb3IgKGkgPSAwOyB4cGFkX2J0bltpXSA+PSAwOyBpKyspCiAJCXNldF9iaXQoeHBhZF9idG5baV0sIHhwYWQtPmRldi5rZXliaXQpOwotCQorCiAJZm9yIChpID0gMDsgeHBhZF9hYnNbaV0gPj0gMDsgaSsrKSB7Ci0JCQorCiAJCXNpZ25lZCBzaG9ydCB0ID0geHBhZF9hYnNbaV07Ci0JCQorCiAJCXNldF9iaXQodCwgeHBhZC0+ZGV2LmFic2JpdCk7Ci0JCQorCiAJCXN3aXRjaCAodCkgewogCQkJY2FzZSBBQlNfWDoKIAkJCWNhc2UgQUJTX1k6CkBAIC0zMTAsMTEgKzMwMywxMSBAQAogCQkJCWJyZWFrOwogCQl9CiAJfQotCQorCiAJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZ4cGFkLT5kZXYpOwotCQorCiAJcHJpbnRrKEtFUk5fSU5GTyAiaW5wdXQ6ICVzIG9uICVzIiwgeHBhZC0+ZGV2Lm5hbWUsIHBhdGgpOwotCQorCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCB4cGFkKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMyMiw3ICszMTUsNyBAQAogc3RhdGljIHZvaWQgeHBhZF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfeHBhZCAqeHBhZCA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwotCQorCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlpZiAoeHBhZCkgewogCQl1c2Jfa2lsbF91cmIoeHBhZC0+aXJxX2luKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL01ha2VmaWxlIGIvZHJpdmVycy91c2IvbWVkaWEvTWFrZWZpbGUKaW5kZXggMmI3NmRmNy4uZDgzYWRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBVU0IgTWVkaWEgZHJpdmVycwogIwogCi1zbjljMTAyLW9ianMJOj0gc245YzEwMl9jb3JlLm8gc245YzEwMl9odjcxMzFkLm8gc245YzEwMl9taTAzNDMubyBzbjljMTAyX3BhczEwNmIubyBzbjljMTAyX3BhczIwMmJjYi5vIHNuOWMxMDJfdGFzNTExMGMxYi5vIHNuOWMxMDJfdGFzNTEzMGQxYi5vCitzbjljMTAyLW9ianMJOj0gc245YzEwMl9jb3JlLm8gc245YzEwMl9odjcxMzFkLm8gc245YzEwMl9taTAzNDMubyBzbjljMTAyX292NzYzMC5vIHNuOWMxMDJfcGFzMTA2Yi5vIHNuOWMxMDJfcGFzMjAyYmNiLm8gc245YzEwMl90YXM1MTEwYzFiLm8gc245YzEwMl90YXM1MTMwZDFiLm8KIAogb2JqLSQoQ09ORklHX1VTQl9EQUJVU0IpCSs9IGRhYnVzYi5vCiBvYmotJChDT05GSUdfVVNCX0RTQlIpCQkrPSBkc2JyMTAwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDIuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDIuaAppbmRleCA4YjhhNGM4Li5lNWNlYTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyLmgKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMi5oCkBAIC01Niw3ICs1Niw3IEBACiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0FVVEhPUiAgICIoQykgMjAwNC0yMDA1IEx1Y2EgUmlzb2xpYSIKICNkZWZpbmUgU045QzEwMl9BVVRIT1JfRU1BSUwgICAgIjxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIKICNkZWZpbmUgU045QzEwMl9NT0RVTEVfTElDRU5TRSAgIkdQTCIKLSNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTiAgIjE6MS4yNCIKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTiAgIjE6MS4yNGEiCiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMSwgMCwgMjQpCiAKIGVudW0gc245YzEwMl9icmlkZ2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2NvcmUuYwppbmRleCAzMWQ1NzQwLi5jZjhjZmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX2NvcmUuYwpAQCAtNDI5LDcgKzQyOSw3IEBACiB9CiAKIAotc3RhdGljIGludCAKK2ludAogc245YzEwMl9pMmNfdHJ5X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAogICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBhZGRyZXNzLCB1OCB2YWx1ZSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfb3Y3NjMwLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX292NzYzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyN2M1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX292NzYzMC5jCkBAIC0wLDAgKzEsMzk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbHVnLWluIGZvciBPVjc2MzAgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgU045QzEweCBQQyBDYW1lcmEgICAgICAqCisgKiBDb250cm9sbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqCisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAgICAgICAqCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAqCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAqCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAic245YzEwMl9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG92NzYzMDsKKworCitzdGF0aWMgaW50IG92NzYzMF9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQoreworCWludCBlcnIgPSAwOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgxNCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgxNyk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwZiwgMHgxOCk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg1MCwgMHgxOSk7CisKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAweDhkKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDExLCAweDAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE1LCAweDM0KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE2LCAweDAzKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE3LCAweDFjKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE4LCAweGJkKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE5LCAweDA2KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDFhLCAweGY2KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDFiLCAweDA0KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIwLCAweDQ0KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDIzLCAweGVlKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI2LCAweGEwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI3LCAweDlhKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI4LCAweDIwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI5LCAweDMwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDJmLCAweDNkKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMwLCAweDI0KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDMyLCAweDg2KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDYwLCAweGE5KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDYxLCAweDQyKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDY1LCAweDAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDY5LCAweDM4KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDZmLCAweDg4KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDcwLCAweDBiKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDcxLCAweDAwKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDc0LCAweDIxKTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDdkLCAweGY3KTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBvdjc2MzBfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdjRsMl9jb250cm9sKiBjdHJsKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTAsIGN0cmwtPnZhbHVlID4+IDIpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDc2LCBjdHJsLT52YWx1ZSAmIDB4MDMpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAyLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAzLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfR0FJTjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMCwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQllcnIgKz0gY3RybC0+dmFsdWUgPyBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHJsLT52YWx1ZS0xKSB8IDB4MjApCisJCSAgICAgICAgICAgICAgICAgICA6IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNSwgMHgwMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNiwgY3RybC0+dmFsdWUpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDMsIGN0cmwtPnZhbHVlIDw8IDQpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJZXJyICs9IGN0cmwtPnZhbHVlID8gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDA0LAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3RybC0+dmFsdWUtMSkgfCAweDIwKQorCQkgICAgICAgICAgICAgICAgICAgOiBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MDQsIDB4MDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGMsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9XSElURU5FU1M6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGQsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTIsIChjdHJsLT52YWx1ZSA8PCAyKSB8IDB4MDkpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEzLCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfVkZMSVA6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NzUsIDB4MGUgfCAoY3RybC0+dmFsdWUgPDwgNykpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JMQUNLX0xFVkVMOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDI1LCBjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9CUklHSFRfTEVWRUw6CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjQsIGN0cmwtPnZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dBTU1BOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE0LCAoY3RybC0+dmFsdWUgPDwgMikgfCAweDgwKTsKKwkJYnJlYWs7CisJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0JBTkRfRklMVEVSOgorCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDJkLCBjdHJsLT52YWx1ZSA8PCAyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVyciA/IC1FSU8gOiAwOworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjMwX3NldF9jcm9wKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcmVjdCogcmVjdCkKK3sKKwlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSAmb3Y3NjMwOworCWludCBlcnIgPSAwOworCXU4IHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyAxOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgb3Y3NjMwX3NldF9waXhfZm9ybWF0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCogcGl4KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpCisJCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTkpOworCWVsc2UKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg1MCwgMHgxOSk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3Igb3Y3NjMwID0geworCS5uYW1lID0gIk9WNzYzMCIsCisJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCisJLnN5c2ZzX29wcyA9IFNOOUMxMDJfSTJDX1dSSVRFLAorCS5mcmVxdWVuY3kgPSBTTjlDMTAyX0kyQ18xMDBLSFosCisJLmludGVyZmFjZSA9IFNOOUMxMDJfSTJDXzJXSVJFUywKKwkuaTJjX3NsYXZlX2lkID0gMHgyMSwKKwkuaW5pdCA9ICZvdjc2MzBfaW5pdCwKKwkucWN0cmwgPSB7CisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0dBSU4sCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJnbG9iYWwgZ2FpbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4M2YsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MTQsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9IVUUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJodWUiLAorCQkJLm1pbmltdW0gPSAweDAwLAorCQkJLm1heGltdW0gPSAweDFmKzEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAic2F0dXJhdGlvbiIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MGYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDgsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImNvbnRyYXN0IiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgxZisxLAorCQkJLnN0ZXAgPSAweDAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAwLAorCQkJLmZsYWdzID0gMCwKKwkJfSwKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJleHBvc3VyZSIsCisJCQkubWluaW11bSA9IDB4MDAwLAorCQkJLm1heGltdW0gPSAweDNmZiwKKwkJCS5zdGVwID0gMHgwMDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4ODM8PDIsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gInJlZCBiYWxhbmNlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHhmZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgzYSwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJsdWUgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4ZmYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4NzcsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CUklHSFRORVNTLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiYnJpZ2h0bmVzcyIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4ZmYsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4YTAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAid2hpdGUgYmFsYW5jZSBiYWNrZ3JvdW5kOiBibHVlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgzZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgyMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1dISVRFTkVTUywKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gIndoaXRlIGJhbGFuY2UgYmFja2dyb3VuZDogcmVkIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgzZiwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgyMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJCS5uYW1lID0gImF1dG8gd2hpdGUgYmFsYW5jZSIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDEsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImdhaW4gJiBleHBvc3VyZSBtb2RlIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwMywKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFY0TDJfQ0lEX1ZGTElQLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgPSAidmVydGljYWwgZmxpcCIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDEsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBWNEwyX0NJRF9CTEFDS19MRVZFTCwKKwkJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lID0gImJsYWNrIHBpeGVsIHJhdGlvIiwKKwkJCS5taW5pbXVtID0gMHgwMSwKKwkJCS5tYXhpbXVtID0gMHg5YSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHg4YSwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfQlJJR0hUX0xFVkVMLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkJLm5hbWUgPSAiYnJpZ2h0IHBpeGVsIHJhdGlvIiwKKwkJCS5taW5pbXVtID0gMHgwMSwKKwkJCS5tYXhpbXVtID0gMHg5YSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgxMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfQkFORF9GSUxURVIsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJiYW5kIGZpbHRlciIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCisJCQkuZmxhZ3MgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSBTTjlDMTAyX1Y0TDJfQ0lEX0dBTU1BLAorCQkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkJLm5hbWUgPSAicmdiIGdhbW1hIiwKKwkJCS5taW5pbXVtID0gMHgwMCwKKwkJCS5tYXhpbXVtID0gMHgwMSwKKwkJCS5zdGVwID0gMHgwMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJfSwKKwkuc2V0X2N0cmwgPSAmb3Y3NjMwX3NldF9jdHJsLAorCS5jcm9wY2FwID0geworCQkuYm91bmRzID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCQkuZGVmcmVjdCA9IHsKKwkJCS5sZWZ0ID0gMCwKKwkJCS50b3AgPSAwLAorCQkJLndpZHRoID0gNjQwLAorCQkJLmhlaWdodCA9IDQ4MCwKKwkJfSwKKwl9LAorCS5zZXRfY3JvcCA9ICZvdjc2MzBfc2V0X2Nyb3AsCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDY0MCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLnByaXYgPSA4LAorCX0sCisJLnNldF9waXhfZm9ybWF0ID0gJm92NzYzMF9zZXRfcGl4X2Zvcm1hdAorfTsKKworCitpbnQgc245YzEwMl9wcm9iZV9vdjc2MzAoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCit7CisJaW50IGVyciA9IDA7CisKKwlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmb3Y3NjMwKTsKKworCWlmIChsZTE2X3RvX2NwdShvdjc2MzAudXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgIT0gMHg2MDhmICYmCisJICAgIGxlMTZfdG9fY3B1KG92NzYzMC51c2JkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSAhPSAweDYwMmMpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMSwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgwMSk7CisJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyOCwgMHgxNyk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MGIsIDApOworCWlmIChlcnIpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3NlbnNvci5oIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl9zZW5zb3IuaAppbmRleCA2YTdhZGViLi5hNDUxNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3NlbnNvci5oCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfc2Vuc29yLmgKQEAgLTY0LDYgKzY0LDcgQEAKICovCiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfaHY3MTMxZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfbWkwMzQzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKTsKK2V4dGVybiBpbnQgc245YzEwMl9wcm9iZV9vdjc2MzAoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX3BhczEwNmIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pOwogZXh0ZXJuIGludCBzbjljMTAyX3Byb2JlX3BhczIwMmJjYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CiBleHRlcm4gaW50IHNuOWMxMDJfcHJvYmVfdGFzNTExMGMxYihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSk7CkBAIC04MCw2ICs4MSw3IEBACiAJJnNuOWMxMDJfcHJvYmVfcGFzMTA2YiwgLyogc3Ryb25nIGRldGVjdGlvbiBiYXNlZCBvbiBTRU5TT1IgaWRzICovICAgIFwKIAkmc245YzEwMl9wcm9iZV9wYXMyMDJiY2IsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLyAgXAogCSZzbjljMTAyX3Byb2JlX2h2NzEzMWQsIC8qIHN0cm9uZyBkZXRlY3Rpb24gYmFzZWQgb24gU0VOU09SIGlkcyAqLyAgICBcCisJJnNuOWMxMDJfcHJvYmVfb3Y3NjMwLCAvKiBkZXRlY3Rpb24gbW9zdGx5IGJhc2VkIG9uIFVTQiBwaWQvdmlkICovICAgIFwKIAkmc245YzEwMl9wcm9iZV90YXM1MTEwYzFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8gICAgICAgXAogCSZzbjljMTAyX3Byb2JlX3RhczUxMzBkMWIsIC8qIGRldGVjdGlvbiBiYXNlZCBvbiBVU0IgcGlkL3ZpZCAqLyAgICAgICBcCiAJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEwMyw3ICsxMDUsOCBAQAogCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyOSksIH0sIC8qIFBBUzEwNkIgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJhKSwgfSwgLyogSFY3MTMxRCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmIpLCB9LCAvKiBNSS0wMzQzICovICAgICAgICAgICAgICAgICAgICAgICAgXAotCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAyYyksIH0sIC8qIE9WNzYyMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDJjKSwgfSwgLyogT1Y3NjMwICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwMmQpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCXsgVVNCX0RFVklDRSgweDBjNDUsIDB4NjAzMCksIH0sIC8qIE1JMDN4ICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBVU0JfREVWSUNFKDB4MGM0NSwgMHg2MDgwKSwgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl7IFVTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwODIpLCB9LCAvKiBNSTAzNDMgYW5kIE1JMDM2MCAqLyAgICAgICAgICAgICAgXApAQCAtMTQ1LDYgKzE0OCw4IEBACiAqLwogCiAvKiBUaGUgInRyeSIgSTJDIEkvTyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuIHByb2JpbmcgdGhlIHNlbnNvciAqLworZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKixzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggYWRkcmVzcywgdTggdmFsdWUpOwogZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfcmVhZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLHN0cnVjdCBzbjljMTAyX3NlbnNvciosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MpOwogCkBAIC0yMDEsNiArMjA2LDggQEAKIAlTTjlDMTAyX0kyQ18zV0lSRVMsCiB9OwogCisjZGVmaW5lIFNOOUMxMDJfTUFYX0NUUkxTIFY0TDJfQ0lEX0xBU1RQMS1WNEwyX0NJRF9CQVNFKzEwCisKIHN0cnVjdCBzbjljMTAyX3NlbnNvciB7CiAJY2hhciBuYW1lWzMyXSwgLyogc2Vuc29yIG5hbWUgKi8KIAkgICAgIG1haW50YWluZXJbNjRdOyAvKiBuYW1lIG9mIHRoZSBtYW50YWluZXIgPGVtYWlsPiAqLwpAQCAtMjQzLDcgKzI1MCw3IEBACiAJICAgc2Vuc29yIGFjY29yZGluZyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMgYmVsb3cuCiAJKi8KIAotCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxY3RybFtWNEwyX0NJRF9MQVNUUDEtVjRMMl9DSURfQkFTRV07CisJc3RydWN0IHY0bDJfcXVlcnljdHJsIHFjdHJsW1NOOUMxMDJfTUFYX0NUUkxTXTsKIAkvKgogCSAgIE9wdGlvbmFsIGxpc3Qgb2YgZGVmYXVsdCBjb250cm9scywgZGVmaW5lZCBhcyBpbmRpY2F0ZWQgaW4gdGhlIAogCSAgIFY0TDIgQVBJLiBNZW51IHR5cGUgY29udHJvbHMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgaW50ZXJmYWNlLgpAQCAtMzU2LDcgKzM2Myw3IEBACiAJICAgY29yZSBtb2R1bGUgdG8gc3RvcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgdmFsdWVzIG9mIHRoZSBhYm92ZQogCSAgIHNldHRpbmdzLCBmb3Igcm9sbGJhY2tzLi5ldGMuLmluIGNhc2Ugb2YgZXJyb3JzIGR1cmluZyBhdG9taWMgSS9PCiAJKi8KLQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgX3FjdHJsW1Y0TDJfQ0lEX0xBU1RQMS1WNEwyX0NJRF9CQVNFXTsKKwlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgX3FjdHJsW1NOOUMxMDJfTUFYX0NUUkxTXTsKIAlzdHJ1Y3QgdjRsMl9yZWN0IF9yZWN0OwogfTsKIApAQCAtMzY3LDUgKzM3NCw4IEBACiAjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRSBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxCiAjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfUkVTRVRfTEVWRUwgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMgogI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX1BJWEVMX0JJQVNfVk9MVEFHRSBWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzCisjZGVmaW5lIFNOOUMxMDJfVjRMMl9DSURfR0FNTUEgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNAorI2RlZmluZSBTTjlDMTAyX1Y0TDJfQ0lEX0JBTkRfRklMVEVSIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUKKyNkZWZpbmUgU045QzEwMl9WNEwyX0NJRF9CUklHSFRfTEVWRUwgVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNgogCiAjZW5kaWYgLyogX1NOOUMxMDJfU0VOU09SX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zbjljMTAyX3RhczUxMTBjMWIuYyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTExMGMxYi5jCmluZGV4IDY5MGQ2MjEuLjg3NzU5OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTExMGMxYi5jCisrKyBiL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTExMGMxYi5jCkBAIC0yNCw4ICsyNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTExMGMxYjsKIAotc3RhdGljIHN0cnVjdCB2NGwyX2NvbnRyb2wgdGFzNTExMGMxYl9nYWluOwotCiAKIHN0YXRpYyBpbnQgdGFzNTExMGMxYl9pbml0KHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewpAQCAtNDYsMjEgKzQ0LDYgQEAKIH0KIAogCi1zdGF0aWMgaW50IHRhczUxMTBjMWJfZ2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCi17Ci0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJY3RybC0+dmFsdWUgPSB0YXM1MTEwYzFiX2dhaW4udmFsdWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyBpbnQgdGFzNTExMGMxYl9zZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKIHsKQEAgLTY4LDggKzUxLDcgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICghKGVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjAsIDB4ZjYgLSBjdHJsLT52YWx1ZSkpKQotCQkJdGFzNTExMGMxYl9nYWluLnZhbHVlID0gY3RybC0+dmFsdWU7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjAsIDB4ZjYgLSBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ3LDcgKzEyOSw2IEBACiAJCQkuaGVpZ2h0ID0gMjg4LAogCQl9LAogCX0sCi0JLmdldF9jdHJsID0gJnRhczUxMTBjMWJfZ2V0X2N0cmwsCiAJLnNldF9jcm9wID0gJnRhczUxMTBjMWJfc2V0X2Nyb3AsCiAJLnBpeF9mb3JtYXQgPSB7CiAJCS53aWR0aCA9IDM1MiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21lZGlhL3NuOWMxMDJfdGFzNTEzMGQxYi5jIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTMwZDFiLmMKaW5kZXggYjM3OGU5NC4uOTI3ZWFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTMwZDFiLmMKKysrIGIvZHJpdmVycy91c2IvbWVkaWEvc245YzEwMl90YXM1MTMwZDFiLmMKQEAgLTI0LDggKzI0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTMwZDFiOwogCi1zdGF0aWMgc3RydWN0IHY0bDJfY29udHJvbCB0YXM1MTMwZDFiX2dhaW4sIHRhczUxMzBkMWJfZXhwb3N1cmU7Ci0KIAogc3RhdGljIGludCB0YXM1MTMwZDFiX2luaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7CkBAIC00NCwyNCArNDIsNiBAQAogfQogCiAKLXN0YXRpYyBpbnQgdGFzNTEzMGQxYl9nZXRfY3RybChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKLXsKLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQljdHJsLT52YWx1ZSA9IHRhczUxMzBkMWJfZ2Fpbi52YWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJY3RybC0+dmFsdWUgPSB0YXM1MTMwZDFiX2V4cG9zdXJlLnZhbHVlOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgaW50IHRhczUxMzBkMWJfc2V0X2N0cmwoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB2NGwyX2NvbnRyb2wqIGN0cmwpCiB7CkBAIC02OSwxMiArNDksMTAgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWlmICghKGVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjAsIDB4ZjYgLSBjdHJsLT52YWx1ZSkpKQotCQkJdGFzNTEzMGQxYl9nYWluLnZhbHVlID0gY3RybC0+dmFsdWU7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MjAsIDB4ZjYgLSBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6Ci0JCWlmICghKGVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NDAsIDB4NDcgLSBjdHJsLT52YWx1ZSkpKQotCQkJdGFzNTEzMGQxYl9leHBvc3VyZS52YWx1ZSA9IGN0cmwtPnZhbHVlOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDQwLCAweDQ3IC0gY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0Nyw3ICsxMjUsNiBAQAogCQkJLmZsYWdzID0gMCwKIAkJfSwKIAl9LAotCS5nZXRfY3RybCA9ICZ0YXM1MTMwZDFiX2dldF9jdHJsLAogCS5zZXRfY3RybCA9ICZ0YXM1MTMwZDFiX3NldF9jdHJsLAogCS5jcm9wY2FwID0gewogCQkuYm91bmRzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWVkaWEvc3R2NjgwLmMgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwppbmRleCBhZTQ1NWM4Li43Mzk4YTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYworKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuYwpAQCAtMTM3NSw5ICsxMzc1LDEzIEBACiAJICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfUEVOQ0FNX1BST0RVQ1RfSUQpKSB7CiAJCWNhbWVyYV9uYW1lID0gIlNUVjA2ODAiOwogCQlQREVCVUcgKDAsICJTVFYoaSk6IFNUVjA2ODAgY2FtZXJhIGZvdW5kLiIpOworCX0gZWxzZSBpZiAoKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gVVNCX0NSRUFUSVZFR09NSU5JX1ZFTkRPUl9JRCkgJiYKKwkJICAgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9DUkVBVElWRUdPTUlOSV9QUk9EVUNUX0lEKSkgeworCQljYW1lcmFfbmFtZSA9ICJDcmVhdGl2ZSBXZWJDYW0gR28gTWluaSI7CisJCVBERUJVRyAoMCwgIlNUVihpKTogQ3JlYXRpdmUgV2ViQ2FtIEdvIE1pbmkgZm91bmQuIik7CiAJfSBlbHNlIHsKLQkJUERFQlVHICgwLCAiU1RWKGUpOiBWZW5kb3IvUHJvZHVjdCBJRCBkbyBub3QgbWF0Y2ggU1RWMDY4MCB2YWx1ZXMuIik7Ci0JCVBERUJVRyAoMCwgIlNUVihlKTogQ2hlY2sgdGhhdCB0aGUgU1RWMDY4MCBjYW1lcmEgaXMgY29ubmVjdGVkIHRvIHRoZSBjb21wdXRlci4iKTsKKwkJUERFQlVHICgwLCAiU1RWKGUpOiBWZW5kb3IvUHJvZHVjdCBJRCBkbyBub3QgbWF0Y2ggU1RWMDY4MCBvciBDcmVhdGl2ZSBXZWJDYW0gR28gTWluaSB2YWx1ZXMuIik7CisJCVBERUJVRyAoMCwgIlNUVihlKTogQ2hlY2sgdGhhdCB0aGUgU1RWMDY4MCBvciBDcmVhdGl2ZSBXZWJDYW0gR28gTWluaSBjYW1lcmEgaXMgY29ubmVjdGVkIHRvIHRoZSBjb21wdXRlci4iKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuaCBiL2RyaXZlcnMvdXNiL21lZGlhL3N0djY4MC5oCmluZGV4IDdlMGUzMTRkLi40NDU5NDA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuaAorKysgYi9kcml2ZXJzL3VzYi9tZWRpYS9zdHY2ODAuaApAQCAtNDEsMTIgKzQxLDE3IEBACiAKICNkZWZpbmUgVVNCX1BFTkNBTV9WRU5ET1JfSUQJMHgwNTUzCiAjZGVmaW5lIFVTQl9QRU5DQU1fUFJPRFVDVF9JRAkweDAyMDIKKworI2RlZmluZSBVU0JfQ1JFQVRJVkVHT01JTklfVkVORE9SX0lECTB4MDQxZQorI2RlZmluZSBVU0JfQ1JFQVRJVkVHT01JTklfUFJPRFVDVF9JRAkweDQwMDcKKwogI2RlZmluZSBQRU5DQU1fVElNRU9VVCAgICAgICAgICAxMDAwCiAvKiBmbXQgNCAqLwogI2RlZmluZSBTVFZfVklERU9fUEFMRVRURSAgICAgICBWSURFT19QQUxFVFRFX1JHQjI0CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKIAl7VVNCX0RFVklDRSAoVVNCX1BFTkNBTV9WRU5ET1JfSUQsIFVTQl9QRU5DQU1fUFJPRFVDVF9JRCl9LAorCXtVU0JfREVWSUNFIChVU0JfQ1JFQVRJVkVHT01JTklfVkVORE9SX0lELCBVU0JfQ1JFQVRJVkVHT01JTklfUFJPRFVDVF9JRCl9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBkZXZpY2VfdGFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCmluZGV4IDNhODk2OTUuLjY2NDk1MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKQEAgLTEzOSw2ICsxMzksMTYgQEAKIAogc291cmNlICJkcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9LY29uZmlnIgogCitjb25maWcgVVNCX0xECisJdHJpc3RhdGUgIlVTQiBMRCBkcml2ZXIiCisJZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaXMgZm9yIGdlbmVyaWMgVVNCIGRldmljZXMgdGhhdCB1c2UgaW50ZXJydXB0IHRyYW5zZmVycywKKwkgIGxpa2UgTEQgRGlkYWN0aWMncyBVU0IgZGV2aWNlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGR1c2IuCisKIGNvbmZpZyBVU0JfVEVTVAogCXRyaXN0YXRlICJVU0IgdGVzdGluZyBkcml2ZXIgKERFVkVMT1BNRU5UKSIKIAlkZXBlbmRzIG9uIFVTQiAmJiBVU0JfREVWSUNFRlMgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQppbmRleCA0YTM4MTRjLi44NjJlNDBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKQEAgLTksNiArOSw3IEBACiBvYmotJChDT05GSUdfVVNCX0VNSTYyKQkJKz0gZW1pNjIubwogb2JqLSQoQ09ORklHX1VTQl9JRE1PVVNFKQkrPSBpZG1vdXNlLm8KIG9iai0kKENPTkZJR19VU0JfTENEKQkJKz0gdXNibGNkLm8KK29iai0kKENPTkZJR19VU0JfTEQpCQkrPSBsZHVzYi5vCiBvYmotJChDT05GSUdfVVNCX0xFRCkJCSs9IHVzYmxlZC5vCiBvYmotJChDT05GSUdfVVNCX0xFR09UT1dFUikJKz0gbGVnb3VzYnRvd2VyLm8KIG9iai0kKENPTkZJR19VU0JfUEhJREdFVEtJVCkJKz0gcGhpZGdldGtpdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYyBiL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCmluZGV4IGNlMDMwZDEuLjczM2FjYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogU2llbWVucyBJRCBNb3VzZSBkcml2ZXIgdjAuNQorLyogU2llbWVucyBJRCBNb3VzZSBkcml2ZXIgdjAuNgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKQEAgLTExLDYgKzExLDkgQEAKICAgRGVyaXZlZCBmcm9tIHRoZSBVU0IgU2tlbGV0b24gZHJpdmVyIDEuMSwKICAgQ29weXJpZ2h0IChDKSAyMDAzIEdyZWcgS3JvYWgtSGFydG1hbiAoZ3JlZ0Brcm9haC5jb20pCiAKKyAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBNYXJ0aW4gUmVpc2luZworICA8TWFydGluLlJlaXNpbmdAbmF0dXJhbC1jb21wdXRpbmcuZGU+CisKICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTI1LDI5ICsyOCw0NCBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAKKy8qIGltYWdlIGNvbnN0YW50cyAqLwogI2RlZmluZSBXSURUSCAyMjUKLSNkZWZpbmUgSEVJR0hUIDI4OAotI2RlZmluZSBIRUFERVIgIlA1IDIyNSAyODggMjU1ICIKKyNkZWZpbmUgSEVJR0hUIDI4OQorI2RlZmluZSBIRUFERVIgIlA1IDIyNSAyODkgMjU1ICIKICNkZWZpbmUgSU1HU0laRSAoKFdJRFRIICogSEVJR0hUKSArIHNpemVvZihIRUFERVIpLTEpCiAKLS8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuNSIKKy8qIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuNiIKICNkZWZpbmUgRFJJVkVSX1NIT1JUICAgImlkbW91c2UiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgICJGbG9yaWFuICdGbG9lJyBFY2h0bGVyIDxlY2h0bGVyQGZzLnR1bS5kZT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICAgICJTaWVtZW5zIElEIE1vdXNlIEZpbmdlclRJUCBTZW5zb3IgRHJpdmVyIgogCi0vKiBTaWVtZW5zIElEIE1vdXNlICovCi0jZGVmaW5lIFVTQl9JRE1PVVNFX1ZFTkRPUl9JRCAgMHgwNjgxCi0jZGVmaW5lIFVTQl9JRE1PVVNFX1BST0RVQ1RfSUQgMHgwMDA1Ci0KLS8qIHdlIHN0aWxsIG5lZWQgYSBtaW5vciBudW1iZXIgKi8KKy8qIG1pbm9yIG51bWJlciBmb3IgbWlzYyBVU0IgZGV2aWNlcyAqLwogI2RlZmluZSBVU0JfSURNT1VTRV9NSU5PUl9CQVNFIDEzMgogCisvKiB2ZW5kb3IgYW5kIGRldmljZSBJRHMgKi8KKyNkZWZpbmUgSURfU0lFTUVOUyAweDA2ODEKKyNkZWZpbmUgSURfSURNT1VTRSAweDAwMDUKKyNkZWZpbmUgSURfQ0hFUlJZICAweDAwMTAKKworLyogZGV2aWNlIElEIHRhYmxlICovCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRtb3VzZV90YWJsZVtdID0gewotCXtVU0JfREVWSUNFKFVTQl9JRE1PVVNFX1ZFTkRPUl9JRCwgVVNCX0lETU9VU0VfUFJPRFVDVF9JRCl9LAotCXt9IC8qIG51bGwgZW50cnkgYXQgdGhlIGVuZCAqLworCXtVU0JfREVWSUNFKElEX1NJRU1FTlMsIElEX0lETU9VU0UpfSwgLyogU2llbWVucyBJRCBNb3VzZSAoUHJvZmVzc2lvbmFsKSAqLworCXtVU0JfREVWSUNFKElEX1NJRU1FTlMsIElEX0NIRVJSWSApfSwgLyogQ2hlcnJ5IEZpbmdlclRJUCBJRCBCb2FyZCAgICAgICAqLworCXt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYXRpbmcgbnVsbCBlbnRyeSAgICAgICAgICAqLwogfTsKIAorLyogc2Vuc29yIGNvbW1hbmRzICovCisjZGVmaW5lIEZUSVBfUkVTRVQgICAweDIwCisjZGVmaW5lIEZUSVBfQUNRVUlSRSAweDIxCisjZGVmaW5lIEZUSVBfUkVMRUFTRSAweDIyCisjZGVmaW5lIEZUSVBfQkxJTksgICAweDIzICAvKiBMU0Igb2YgdmFsdWUgPSBibGluayBwdWxzZSB3aWR0aCAqLworI2RlZmluZSBGVElQX1NDUk9MTCAgMHgyNAorCisjZGVmaW5lIGZ0aXBfY29tbWFuZChkZXYsIGNvbW1hbmQsIHZhbHVlLCBpbmRleCkgXAorCXVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksIGNvbW1hbmQsIFwKKwlVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfRU5EUE9JTlQgfCBVU0JfRElSX09VVCwgdmFsdWUsIGluZGV4LCBOVUxMLCAwLCAxMDAwKQorCiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRtb3VzZV90YWJsZSk7CiAKIC8qIHN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmICovCkBAIC01Nyw3ICs3NSw4IEBACiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsgLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KIAogCXVuc2lnbmVkIGNoYXIgKmJ1bGtfaW5fYnVmZmVyOyAvKiB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgZGF0YSAqLwotCXNpemVfdCBidWxrX2luX3NpemU7IC8qIHRoZSBzaXplIG9mIHRoZSByZWNlaXZlIGJ1ZmZlciAqLworCXNpemVfdCBidWxrX2luX3NpemU7IC8qIHRoZSBtYXhpbXVtIGJ1bGsgcGFja2V0IHNpemUgKi8KKwlzaXplX3Qgb3JpZ19iaV9zaXplOyAvKiBzYW1lIGFzIGFib3ZlLCBidXQgcmVwb3J0ZWQgYnkgdGhlIGRldmljZSAqLwogCV9fdTggYnVsa19pbl9lbmRwb2ludEFkZHI7IC8qIHRoZSBhZGRyZXNzIG9mIHRoZSBidWxrIGluIGVuZHBvaW50ICovCiAKIAlpbnQgb3BlbjsgLyogaWYgdGhlIHBvcnQgaXMgb3BlbiBvciBub3QgKi8KQEAgLTEwMyw3ICsxMjIsNyBAQAogCS5pZF90YWJsZSA9IGlkbW91c2VfdGFibGUsCiB9OwogCi0vLyBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0KCkKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLwogc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOwogCiBzdGF0aWMgaW50IGlkbW91c2VfY3JlYXRlX2ltYWdlKHN0cnVjdCB1c2JfaWRtb3VzZSAqZGV2KQpAQCAtMTEyLDQyICsxMzEsMzQgQEAKIAlpbnQgYnVsa19yZWFkID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWlmIChkZXYtPmJ1bGtfaW5fc2l6ZSA8IHNpemVvZihIRUFERVIpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbWNweShkZXYtPmJ1bGtfaW5fYnVmZmVyLEhFQURFUixzaXplb2YoSEVBREVSKS0xKTsKKwltZW1jcHkoZGV2LT5idWxrX2luX2J1ZmZlciwgSEVBREVSLCBzaXplb2YoSEVBREVSKS0xKTsKIAlieXRlc19yZWFkICs9IHNpemVvZihIRUFERVIpLTE7CiAKLQkvKiBEdW1wIHRoZSBzZXR1cCBwYWNrZXRzLiBZZXMsIHRoZXkgYXJlIHVuY29tbWVudGVkLCBzaW1wbHkgCi0JICAgYmVjYXVzZSB0aGV5IHdlcmUgc25pZmZlZCB1bmRlciBXaW5kb3dzIHVzaW5nIFNub29weVByby4KLQkgICBJIF9ndWVzc18gdGhhdCAweDIyIGlzIGEga2luZCBvZiByZXNldCBjb21tYW5kIGFuZCAweDIxIAotCSAgIG1lYW5zIGluaXQuLgotCSovCi0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJCQkweDIxLCAweDQyLCAweDAwMDEsIDB4MDAwMiwgTlVMTCwgMCwgMTAwMCk7CisJLyogcmVzZXQgdGhlIGRldmljZSBhbmQgc2V0IGEgZmFzdCBibGluayByYXRlICovCisJcmVzdWx0ID0gZnRpcF9jb21tYW5kKGRldiwgRlRJUF9SRUxFQVNFLCAwLCAwKTsKIAlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlIChkZXYtPnVkZXYsIDApLAotCQkJCTB4MjAsIDB4NDIsIDB4MDAwMSwgMHgwMDAyLCBOVUxMLCAwLCAxMDAwKTsKKwkJZ290byByZXNldDsKKwlyZXN1bHQgPSBmdGlwX2NvbW1hbmQoZGV2LCBGVElQX0JMSU5LLCAgIDEsIDApOwogCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OwotCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyAoZGV2LT51ZGV2LCB1c2Jfc25kY3RybHBpcGUgKGRldi0+dWRldiwgMCksCi0JCQkJMHgyMiwgMHg0MiwgMHgwMDAwLCAweDAwMDIsIE5VTEwsIDAsIDEwMDApOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OworCQlnb3RvIHJlc2V0OwogCi0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJCQkweDIxLCAweDQyLCAweDAwMDEsIDB4MDAwMiwgTlVMTCwgMCwgMTAwMCk7CisJLyogaW5pdGlhbGl6ZSB0aGUgc2Vuc29yIC0gc2VuZGluZyB0aGlzIGNvbW1hbmQgdHdpY2UgKi8KKwkvKiBzaWduaWZpY2FudGx5IHJlZHVjZXMgdGhlIHJhdGUgb2YgZmFpbGVkIHJlYWRzICAgICAqLworCXJlc3VsdCA9IGZ0aXBfY29tbWFuZChkZXYsIEZUSVBfQUNRVUlSRSwgMCwgMCk7CiAJaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJCQkweDIwLCAweDQyLCAweDAwMDEsIDB4MDAwMiwgTlVMTCwgMCwgMTAwMCk7CisJCWdvdG8gcmVzZXQ7CisJcmVzdWx0ID0gZnRpcF9jb21tYW5kKGRldiwgRlRJUF9BQ1FVSVJFLCAwLCAwKTsKIAlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2cgKGRldi0+dWRldiwgdXNiX3NuZGN0cmxwaXBlIChkZXYtPnVkZXYsIDApLAotCQkJCTB4MjAsIDB4NDIsIDB4MDAwMCwgMHgwMDAyLCBOVUxMLCAwLCAxMDAwKTsKKwkJZ290byByZXNldDsKKworCS8qIHN0YXJ0IHRoZSByZWFkb3V0IC0gc2VuZGluZyB0aGlzIGNvbW1hbmQgdHdpY2UgKi8KKwkvKiBwcmVzdW1hYmx5IGVuYWJsZXMgdGhlIGhpZ2ggZHluYW1pYyByYW5nZSBtb2RlICovCisJcmVzdWx0ID0gZnRpcF9jb21tYW5kKGRldiwgRlRJUF9SRVNFVCwgICAwLCAwKTsKIAlpZiAocmVzdWx0IDwgMCkKLQkJcmV0dXJuIHJlc3VsdDsKKwkJZ290byByZXNldDsKKwlyZXN1bHQgPSBmdGlwX2NvbW1hbmQoZGV2LCBGVElQX1JFU0VULCAgIDAsIDApOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIHJlc2V0OwogCiAJLyogbG9vcCBvdmVyIGEgYmxvY2tpbmcgYnVsayByZWFkIHRvIGdldCBkYXRhIGZyb20gdGhlIGRldmljZSAqLwogCXdoaWxlIChieXRlc19yZWFkIDwgSU1HU0laRSkgewpAQCAtMTU1LDIyICsxNjYsNDAgQEAKIAkJCQl1c2JfcmN2YnVsa3BpcGUgKGRldi0+dWRldiwgZGV2LT5idWxrX2luX2VuZHBvaW50QWRkciksCiAJCQkJZGV2LT5idWxrX2luX2J1ZmZlciArIGJ5dGVzX3JlYWQsCiAJCQkJZGV2LT5idWxrX2luX3NpemUsICZidWxrX3JlYWQsIDUwMDApOwotCQlpZiAocmVzdWx0IDwgMCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHVybiAtRUlOVFI7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkvKiBNYXliZSB0aGlzIGVycm9yIHdhcyBjYXVzZWQgYnkgdGhlIGluY3JlYXNlZCBwYWNrZXQgc2l6ZT8gKi8KKwkJCS8qIFJlc2V0IHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBhbmQgdGVsbCB1c2Vyc3BhY2UgdG8gcmV0cnkuICAqLworCQkJaWYgKGRldi0+YnVsa19pbl9zaXplICE9IGRldi0+b3JpZ19iaV9zaXplKSB7CisJCQkJZGV2LT5idWxrX2luX3NpemUgPSBkZXYtPm9yaWdfYmlfc2l6ZTsKKwkJCQlyZXN1bHQgPSAtRUFHQUlOOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXN1bHQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQogCQlieXRlc19yZWFkICs9IGJ1bGtfcmVhZDsKIAl9CiAKIAkvKiByZXNldCB0aGUgZGV2aWNlICovCi0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChkZXYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LT51ZGV2LCAwKSwKLQkJCQkweDIyLCAweDQyLCAweDAwMDAsIDB4MDAwMiwgTlVMTCwgMCwgMTAwMCk7Ci0JaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiByZXN1bHQ7CityZXNldDoKKwlmdGlwX2NvbW1hbmQoZGV2LCBGVElQX1JFTEVBU0UsIDAsIDApOwogCi0JLyogc2hvdWxkIGJlIElNR1NJWkUgPT0gNjQ4MTUgKi8KKwkvKiBjaGVjayBmb3IgdmFsaWQgaW1hZ2UgKi8KKwkvKiByaWdodCBib3JkZXIgc2hvdWxkIGJlIGJsYWNrICgweDAwKSAqLworCWZvciAoYnl0ZXNfcmVhZCA9IHNpemVvZihIRUFERVIpLTEgKyBXSURUSC0xOyBieXRlc19yZWFkIDwgSU1HU0laRTsgYnl0ZXNfcmVhZCArPSBXSURUSCkKKwkJaWYgKGRldi0+YnVsa19pbl9idWZmZXJbYnl0ZXNfcmVhZF0gIT0gMHgwMCkKKwkJCXJldHVybiAtRUFHQUlOOworCisJLyogbG93ZXIgYm9yZGVyIHNob3VsZCBiZSB3aGl0ZSAoMHhGRikgKi8KKwlmb3IgKGJ5dGVzX3JlYWQgPSBJTUdTSVpFLVdJRFRIOyBieXRlc19yZWFkIDwgSU1HU0laRS0xOyBieXRlc19yZWFkKyspCisJCWlmIChkZXYtPmJ1bGtfaW5fYnVmZmVyW2J5dGVzX3JlYWRdICE9IDB4RkYpCisJCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIHNob3VsZCBiZSBJTUdTSVpFID09IDY1MDQwICovCiAJZGJnKCJyZWFkICVkIGJ5dGVzIGZpbmdlcnByaW50IGRhdGEiLCBieXRlc19yZWFkKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWRtb3VzZV9kZWxldGUoc3RydWN0IHVzYl9pZG1vdXNlICpkZXYpCkBAIC0yODIsMTAgKzMxMSwxMCBAQAogCiAJZGV2ID0gKHN0cnVjdCB1c2JfaWRtb3VzZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLQkvLyBsb2NrIHRoaXMgb2JqZWN0CisJLyogbG9jayB0aGlzIG9iamVjdCAqLwogCWRvd24gKCZkZXYtPnNlbSk7CiAKLQkvLyB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgZGV2aWNlIHdhc24ndCB1bnBsdWdnZWQgKi8KIAlpZiAoIWRldi0+cHJlc2VudCkgewogCQl1cCAoJmRldi0+c2VtKTsKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yOTYsOCArMzI1LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKGNvdW50ID4gSU1HU0laRSAtICpwcG9zKQotCQljb3VudCA9IElNR1NJWkUgLSAqcHBvczsKKwljb3VudCA9IG1pbiAoKGxvZmZfdCljb3VudCwgSU1HU0laRSAtICgqcHBvcykpOwogCiAJaWYgKGNvcHlfdG9fdXNlciAoYnVmZmVyLCBkZXYtPmJ1bGtfaW5fYnVmZmVyICsgKnBwb3MsIGNvdW50KSkgewogCQlyZXN1bHQgPSAtRUZBVUxUOwpAQCAtMzA2LDcgKzMzNCw3IEBACiAJCSpwcG9zICs9IGNvdW50OwogCX0KIAotCS8vIHVubG9jayB0aGUgZGV2aWNlIAorCS8qIHVubG9jayB0aGUgZGV2aWNlICovCiAJdXAoJmRldi0+c2VtKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtMzE4LDcgKzM0Niw2IEBACiAJc3RydWN0IHVzYl9pZG1vdXNlICpkZXYgPSBOVUxMOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmlmYWNlX2Rlc2M7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKLQlzaXplX3QgYnVmZmVyX3NpemU7CiAJaW50IHJlc3VsdDsKIAogCS8qIGNoZWNrIGlmIHdlIGhhdmUgZ290dGVuIHRoZSBkYXRhIG9yIHRoZSBoaWQgaW50ZXJmYWNlICovCkBAIC0zNDQsMTEgKzM3MSwxMSBAQAogCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSkgewogCiAJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLwotCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7Ci0JCWRldi0+YnVsa19pbl9zaXplID0gYnVmZmVyX3NpemU7CisJCWRldi0+b3JpZ19iaV9zaXplID0gbGUxNl90b19jcHUoZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJZGV2LT5idWxrX2luX3NpemUgPSAweDIwMDsgLyogd29ya3MgX211Y2hfIGZhc3RlciAqLwogCQlkZXYtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CiAJCWRldi0+YnVsa19pbl9idWZmZXIgPQotCQkJa21hbGxvYyhJTUdTSVpFICsgYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQkJa21hbGxvYyhJTUdTSVpFICsgZGV2LT5idWxrX2luX3NpemUsIEdGUF9LRVJORUwpOwogCiAJCWlmICghZGV2LT5idWxrX2luX2J1ZmZlcikgewogCQkJZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgaW5wdXQgYnVmZmVyLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKQEAgLTAsMCArMSw3OTQgQEAKKy8qKgorICogR2VuZXJpYyBVU0IgZHJpdmVyIGZvciByZXBvcnQgYmFzZWQgaW50ZXJydXB0IGluL291dCBkZXZpY2VzCisgKiBsaWtlIExEIERpZGFjdGljJ3MgVVNCIGRldmljZXMuIExEIERpZGFjdGljJ3MgVVNCIGRldmljZXMgYXJlCisgKiBISUQgZGV2aWNlcyB3aGljaCBkbyBub3QgdXNlIEhJRCByZXBvcnQgZGVmaW5pdG9ucyAodGhleSB1c2UKKyAqIHJhdyBpbnRlcnJ1cHQgaW4gYW5kIG91ciByZXBvcnRzIG9ubHkgZm9yIGNvbW11bmljYXRpb24pLgorICoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgYSByaW5nIGJ1ZmZlciBmb3IgdGltZSBjcml0aWNhbCByZWFkaW5nIG9mCisgKiBpbnRlcnJ1cHQgaW4gcmVwb3J0cyBhbmQgcHJvdmlkZXMgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcyBmb3IKKyAqIHJhdyBpbnRlcnJ1cHQgcmVwb3J0cyAoc2ltaWxhciB0byB0aGUgV2luZG93cyBISUQgZHJpdmVyKS4KKyAqIERldmljZXMgYmFzZWQgb24gdGhlIGJvb2sgVVNCIENPTVBMRVRFIGJ5IEphbiBBeGVsc29uIG1heSBuZWVkCisgKiBzdWNoIGEgY29tcGF0aWJpbGl0eSB0byB0aGUgV2luZG93cyBISUQgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBNaWNoYWVsIEh1bmQgPG1odW5kQGxkLWRpZGFjdGljLmRlPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKglwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICoJdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRGVyaXZlZCBmcm9tIExlZ28gVVNCIFRvd2VyIGRyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIEdsYW5jZSA8YWR2aWRnc2ZAc291cmNlZm9yZ2UubmV0PgorICoJCSAyMDAxLTIwMDQgSnVlcmdlbiBTdHViZXIgPHN0YXJibHVlQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBWMC4xICAobWgpIEluaXRpYWwgdmVyc2lvbgorICogVjAuMTEgKG1oKSBBZGRlZCByYXcgc3VwcG9ydCBmb3IgSElEIDEuMCBkZXZpY2VzIChubyBpbnRlcnJ1cHQgb3V0IGVuZHBvaW50KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorCisvKiBEZWZpbmUgdGhlc2UgdmFsdWVzIHRvIG1hdGNoIHlvdXIgZGV2aWNlcyAqLworI2RlZmluZSBVU0JfVkVORE9SX0lEX0xECQkweDBmMTEJLyogVVNCIFZlbmRvciBJRCBvZiBMRCBEaWRhY3RpYyBHbWJIICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfQ0FTU1kJCTB4MTAwMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgYWxsIENBU1NZLVMgbW9kdWxlcyAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZCTB4MTAxMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgUG9ja2V0LUNBU1NZICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTU9CSUxFQ0FTU1kJMHgxMDIwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBNb2JpbGUtQ0FTU1kgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9KV00JCTB4MTA4MAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgSm91bGUgYW5kIFdhdHRtZXRlciAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0RNTVAJCTB4MTA4MQkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgRGlnaXRhbCBNdWx0aW1ldGVyIFAgKHJlc2VydmVkKSAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1VNSVAJCTB4MTA5MAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgVU1JIFAgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9WSURFT0NPTQkJMHgxMjAwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBWaWRlb0NvbSAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPTTNMQUIJCTB4MjAwMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgQ09NM0xBQiAqLworI2RlZmluZSBVU0JfREVWSUNFX0lEX1RFTEVQT1JUCQkweDIwMTAJLyogVVNCIFByb2R1Y3QgSUQgZm9yIFRlcm1pbmFsIEFkYXB0ZXIgKi8KKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9ORVRXT1JLQU5BTFlTRVIJMHgyMDIwCS8qIFVTQiBQcm9kdWN0IElEIGZvciBOZXR3b3JrIEFuYWx5c2VyICovCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUE9XRVJDT05UUk9MCTB4MjAzMAkvKiBVU0IgUHJvZHVjdCBJRCBmb3IgQ29udHJvbGxpbmcgZGV2aWNlIGZvciBQb3dlciBFbGVjdHJvbmljcyAqLworCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfVkVSTklFUgkJMHgwOGY3CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8JMHgwMDAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9HT1RFTVAJMHgwMDAyCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9TS0lQCTB4MDAwMworI2RlZmluZSBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUwkweDAwMDQKKworCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBVU0JfTERfTUlOT1JfQkFTRQkwCisjZWxzZQorI2RlZmluZSBVU0JfTERfTUlOT1JfQkFTRQkxNzYKKyNlbmRpZgorCisvKiB0YWJsZSBvZiBkZXZpY2VzIHRoYXQgd29yayB3aXRoIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgbGRfdXNiX3RhYmxlIFtdID0geworCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0NBU1NZKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1BPQ0tFVENBU1NZKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX01PQklMRUNBU1NZKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX0pXTSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9ETU1QKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xELCBVU0JfREVWSUNFX0lEX1VNSVApIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfVklERU9DT00pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfQ09NM0xBQikgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9URUxFUE9SVCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MRCwgVVNCX0RFVklDRV9JRF9ORVRXT1JLQU5BTFlTRVIpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEQsIFVTQl9ERVZJQ0VfSURfUE9XRVJDT05UUk9MKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1ZFUk5JRVIsIFVTQl9ERVZJQ0VfSURfVkVSTklFUl9MQUJQUk8pIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVkVSTklFUiwgVVNCX0RFVklDRV9JRF9WRVJOSUVSX0dPVEVNUCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfU0tJUCkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUykgfSwKKwl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGxkX3VzYl90YWJsZSk7CitNT0RVTEVfVkVSU0lPTigiVjAuMTEiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSHVuZCA8bWh1bmRAbGQtZGlkYWN0aWMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxEIFVTQiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJMRCBVU0IgRGV2aWNlcyIpOworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworCXN0YXRpYyBpbnQgZGVidWcgPSAxOworI2Vsc2UKKwlzdGF0aWMgaW50IGRlYnVnID0gMDsKKyNlbmRpZgorCisvKiBVc2Ugb3VyIG93biBkYmcgbWFjcm8gKi8KKyNkZWZpbmUgZGJnX2luZm8oZGV2LCBmb3JtYXQsIGFyZy4uLikgZG8geyBpZiAoZGVidWcpIGRldl9pbmZvKGRldiAsIGZvcm1hdCAsICMjIGFyZyk7IH0gd2hpbGUgKDApCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKy8qIEFsbCBpbnRlcnJ1cHQgaW4gdHJhbnNmZXJzIGFyZSBjb2xsZWN0ZWQgaW4gYSByaW5nIGJ1ZmZlciB0bworICogYXZvaWQgcmFjaW5nIGNvbmRpdGlvbnMgYW5kIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2Ugb2YgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCByaW5nX2J1ZmZlcl9zaXplID0gMTI4OworbW9kdWxlX3BhcmFtKHJpbmdfYnVmZmVyX3NpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJpbmdfYnVmZmVyX3NpemUsICJSZWFkIHJpbmcgYnVmZmVyIHNpemUgaW4gcmVwb3J0cyIpOworCisvKiBUaGUgd3JpdGVfYnVmZmVyIGNhbiBjb250YWluIG1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IG91dCB0cmFuc2Zlci4KKyAqLworc3RhdGljIGludCB3cml0ZV9idWZmZXJfc2l6ZSA9IDEwOworbW9kdWxlX3BhcmFtKHdyaXRlX2J1ZmZlcl9zaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3cml0ZV9idWZmZXJfc2l6ZSwgIldyaXRlIGJ1ZmZlciBzaXplIGluIHJlcG9ydHMiKTsKKworLyogQXMgb2Yga2VybmVsIHZlcnNpb24gMi42LjQgZWhjaS1oY2QgdXNlcyBhbgorICogIm9ubHkgb25lIGludGVycnVwdCB0cmFuc2ZlciBwZXIgZnJhbWUiIHNob3J0Y3V0CisgKiB0byBzaW1wbGlmeSB0aGUgc2NoZWR1bGluZyBvZiBwZXJpb2RpYyB0cmFuc2ZlcnMuCisgKiBUaGlzIGNvbmZsaWN0cyB3aXRoIG91ciBzdGFuZGFyZCAxbXMgaW50ZXJ2YWxzIGZvciBpbiBhbmQgb3V0IFVSQnMuCisgKiBXZSB1c2UgZGVmYXVsdCBpbnRlcnZhbHMgb2YgMm1zIGZvciBpbiBhbmQgMm1zIGZvciBvdXQgdHJhbnNmZXJzLAorICogd2hpY2ggc2hvdWxkIGJlIGZhc3QgZW5vdWdoLgorICogSW5jcmVhc2UgdGhlIGludGVydmFsIHRvIGFsbG93IG1vcmUgZGV2aWNlcyB0aGF0IGRvIGludGVycnVwdCB0cmFuc2ZlcnMsCisgKiBvciBzZXQgdG8gMSB0byB1c2UgdGhlIHN0YW5kYXJkIGludGVydmFsIGZyb20gdGhlIGVuZHBvaW50IGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSAyOworbW9kdWxlX3BhcmFtKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBpbiBpbnRlcnZhbCBpbiBtcyIpOworCitzdGF0aWMgaW50IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gMjsKK21vZHVsZV9wYXJhbShtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwsICJNaW5pbXVtIGludGVycnVwdCBvdXQgaW50ZXJ2YWwgaW4gbXMiKTsKKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCBsZF91c2IgeworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogbG9ja3MgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSoJaW50ZjsJCS8qIHNhdmUgb2ZmIHRoZSB1c2IgaW50ZXJmYWNlIHBvaW50ZXIgKi8KKworCWludAkJCW9wZW5fY291bnQ7CS8qIG51bWJlciBvZiB0aW1lcyB0aGlzIHBvcnQgaGFzIGJlZW4gb3BlbmVkICovCisKKwljaGFyKgkJCXJpbmdfYnVmZmVyOworCXVuc2lnbmVkIGludAkJcmluZ19oZWFkOworCXVuc2lnbmVkIGludAkJcmluZ190YWlsOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJcmVhZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXQ7CisKKwljaGFyKgkJCWludGVycnVwdF9pbl9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfaW5fZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9pbl91cmI7CisJaW50CQkJaW50ZXJydXB0X2luX2ludGVydmFsOworCXNpemVfdAkJCWludGVycnVwdF9pbl9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9pbl9ydW5uaW5nOworCWludAkJCWludGVycnVwdF9pbl9kb25lOworCisJY2hhcioJCQlpbnRlcnJ1cHRfb3V0X2J1ZmZlcjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IqIGludGVycnVwdF9vdXRfZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9vdXRfdXJiOworCWludAkJCWludGVycnVwdF9vdXRfaW50ZXJ2YWw7CisJc2l6ZV90CQkJaW50ZXJydXB0X291dF9lbmRwb2ludF9zaXplOworCWludAkJCWludGVycnVwdF9vdXRfYnVzeTsKK307CisKKy8qIHByZXZlbnQgcmFjZXMgYmV0d2VlbiBvcGVuKCkgYW5kIGRpc2Nvbm5lY3QoKSAqLworc3RhdGljIERFQ0xBUkVfTVVURVgoZGlzY29ubmVjdF9zZW0pOworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgbGRfdXNiX2RyaXZlcjsKKworLyoqCisgKglsZF91c2JfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIGxkX3VzYl9hYm9ydF90cmFuc2ZlcnMoc3RydWN0IGxkX3VzYiAqZGV2KQoreworCS8qIHNodXRkb3duIHRyYW5zZmVyICovCisJaWYgKGRldi0+aW50ZXJydXB0X2luX3J1bm5pbmcpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyA9IDA7CisJCWlmIChkZXYtPmludGYpCisJCQl1c2Jfa2lsbF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl9CisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQlpZiAoZGV2LT5pbnRmKQorCQkJdXNiX2tpbGxfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIpOworfQorCisvKioKKyAqCWxkX3VzYl9kZWxldGUKKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2RlbGV0ZShzdHJ1Y3QgbGRfdXNiICpkZXYpCit7CisJbGRfdXNiX2Fib3J0X3RyYW5zZmVycyhkZXYpOworCisJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CisJa2ZyZWUoZGV2LT5yaW5nX2J1ZmZlcik7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKTsKKwlrZnJlZShkZXYpOworfQorCisvKioKKyAqCWxkX3VzYl9pbnRlcnJ1cHRfaW5fY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBsZF91c2IgKmRldiA9IHVyYi0+Y29udGV4dDsKKwlzaXplX3QgKmFjdHVhbF9idWZmZXI7CisJdW5zaWduZWQgaW50IG5leHRfcmluZ19oZWFkOworCWludCByZXR2YWw7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CisJCQlnb3RvIGV4aXQ7CisJCX0gZWxzZSB7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJCSBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCWdvdG8gcmVzdWJtaXQ7IC8qIG1heWJlIHdlIGNhbiByZWNvdmVyICovCisJCX0KKwl9CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkgeworCQluZXh0X3JpbmdfaGVhZCA9IChkZXYtPnJpbmdfaGVhZCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisJCWlmIChuZXh0X3JpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkgeworCQkJYWN0dWFsX2J1ZmZlciA9IChzaXplX3QqKShkZXYtPnJpbmdfYnVmZmVyICsgZGV2LT5yaW5nX2hlYWQqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpKTsKKwkJCS8qIGFjdHVhbF9idWZmZXIgZ2V0cyB1cmItPmFjdHVhbF9sZW5ndGggKyBpbnRlcnJ1cHRfaW5fYnVmZmVyICovCisJCQkqYWN0dWFsX2J1ZmZlciA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJCW1lbWNweShhY3R1YWxfYnVmZmVyKzEsIGRldi0+aW50ZXJydXB0X2luX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCWRldi0+cmluZ19oZWFkID0gbmV4dF9yaW5nX2hlYWQ7CisJCQlkYmdfaW5mbygmZGV2LT5pbnRmLT5kZXYsICIlczogcmVjZWl2ZWQgJWQgYnl0ZXNcbiIsCisJCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJfSBlbHNlCisJCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsCisJCQkJICJSaW5nIGJ1ZmZlciBvdmVyZmxvdywgJWQgYnl0ZXMgZHJvcHBlZFxuIiwKKwkJCQkgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9CisKK3Jlc3VibWl0OgorCS8qIHJlc3VibWl0IGlmIHdlJ3JlIHN0aWxsIHJ1bm5pbmcgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fcnVubmluZyAmJiBkZXYtPmludGYpIHsKKwkJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+aW50Zi0+ZGV2LAorCQkJCSJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKKwl9CisKK2V4aXQ6CisJZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7Cit9CisKKy8qKgorICoJbGRfdXNiX2ludGVycnVwdF9vdXRfY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2ludGVycnVwdF9vdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbGRfdXNiICpkZXYgPSB1cmItPmNvbnRleHQ7CisKKwkvKiBzeW5jL2FzeW5jIHVubGluayBmYXVsdHMgYXJlbid0IGVycm9ycyAqLworCWlmICh1cmItPnN0YXR1cyAmJiAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkJCSAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpCisJCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwKKwkJCSAiJXMgLSBub256ZXJvIHdyaXRlIGludGVycnVwdCBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53cml0ZV93YWl0KTsKK30KKworLyoqCisgKglsZF91c2Jfb3BlbgorICovCitzdGF0aWMgaW50IGxkX3VzYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCW5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCXN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKKworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmbGRfdXNiX2RyaXZlciwgc3VibWlub3IpOworCisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJZXJyKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCSAgICAgX19GVU5DVElPTl9fLCBzdWJtaW5vcik7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIWRldikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHVubG9ja19kaXNjb25uZWN0X2V4aXQ7CisJfQorCisJLyogbG9jayB0aGlzIGRldmljZSAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkgeworCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gdW5sb2NrX2Rpc2Nvbm5lY3RfZXhpdDsKKwl9CisKKwkvKiBhbGxvdyBvcGVuaW5nIG9ubHkgb25jZSAqLworCWlmIChkZXYtPm9wZW5fY291bnQpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPm9wZW5fY291bnQgPSAxOworCisJLyogaW5pdGlhbGl6ZSBpbiBkaXJlY3Rpb24gKi8KKwlkZXYtPnJpbmdfaGVhZCA9IDA7CisJZGV2LT5yaW5nX3RhaWwgPSAwOworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSwKKwkJCSB1c2JfcmN2aW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSksCisJCQkJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9idWZmZXIsCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRfc2l6ZSwKKwkJCSBsZF91c2JfaW50ZXJydXB0X2luX2NhbGxiYWNrLAorCQkJIGRldiwKKwkJCSBkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCk7CisKKwlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMTsKKwlkZXYtPmludGVycnVwdF9pbl9kb25lID0gMDsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfaW5fdXJiICVkXG4iLCByZXR2YWwpOworCQlkZXYtPmludGVycnVwdF9pbl9ydW5uaW5nID0gMDsKKwkJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzYXZlIGRldmljZSBpbiB0aGUgZmlsZSdzIHByaXZhdGUgc3RydWN0dXJlICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCit1bmxvY2tfZXhpdDoKKwl1cCgmZGV2LT5zZW0pOworCit1bmxvY2tfZGlzY29ubmVjdF9leGl0OgorCXVwKCZkaXNjb25uZWN0X3NlbSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCWxkX3VzYl9yZWxlYXNlCisgKi8KK3N0YXRpYyBpbnQgbGRfdXNiX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2OworCWludCByZXR2YWwgPSAwOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKGRldi0+b3Blbl9jb3VudCAhPSAxKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQkvKiB0aGUgZGV2aWNlIHdhcyB1bnBsdWdnZWQgYmVmb3JlIHRoZSBmaWxlIHdhcyByZWxlYXNlZCAqLworCQl1cCgmZGV2LT5zZW0pOworCQkvKiB1bmxvY2sgaGVyZSBhcyBsZF91c2JfZGVsZXRlIGZyZWVzIGRldiAqLworCQlsZF91c2JfZGVsZXRlKGRldik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB3YWl0IHVudGlsIHdyaXRlIHRyYW5zZmVyIGlzIGZpbmlzaGVkICovCisJaWYgKGRldi0+aW50ZXJydXB0X291dF9idXN5KQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndyaXRlX3dhaXQsICFkZXYtPmludGVycnVwdF9vdXRfYnVzeSwgMiAqIEhaKTsKKwlsZF91c2JfYWJvcnRfdHJhbnNmZXJzKGRldik7CisJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwordW5sb2NrX2V4aXQ6CisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqCWxkX3VzYl9wb2xsCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGRfdXNiX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2OworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT5yZWFkX3dhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmZGV2LT53cml0ZV93YWl0LCB3YWl0KTsKKworCWlmIChkZXYtPnJpbmdfaGVhZCAhPSBkZXYtPnJpbmdfdGFpbCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlyZXR1cm4gbWFzazsKK30KKworLyoqCisgKglsZF91c2JfcmVhZAorICovCitzdGF0aWMgc3NpemVfdCBsZF91c2JfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlzaXplX3QgKmFjdHVhbF9idWZmZXI7CisJc2l6ZV90IGJ5dGVzX3RvX3JlYWQ7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byByZWFkICovCisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gZXhpdDsKKworCS8qIGxvY2sgdGhpcyBvYmplY3QgKi8KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSkpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKGRldi0+aW50ZiA9PSBOVUxMKSB7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWVycigiTm8gZGV2aWNlIG9yIGRldmljZSB1bnBsdWdnZWQgJWRcbiIsIHJldHZhbCk7CisJCWdvdG8gdW5sb2NrX2V4aXQ7CisJfQorCisJLyogd2FpdCBmb3IgZGF0YSAqLworCWlmIChkZXYtPnJpbmdfaGVhZCA9PSBkZXYtPnJpbmdfdGFpbCkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIHVubG9ja19leGl0OworCQl9CisJCXJldHZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnJlYWRfd2FpdCwgZGV2LT5pbnRlcnJ1cHRfaW5fZG9uZSk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBhY3R1YWxfYnVmZmVyIGNvbnRhaW5zIGFjdHVhbF9sZW5ndGggKyBpbnRlcnJ1cHRfaW5fYnVmZmVyICovCisJYWN0dWFsX2J1ZmZlciA9IChzaXplX3QqKShkZXYtPnJpbmdfYnVmZmVyICsgZGV2LT5yaW5nX3RhaWwqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpKTsKKwlieXRlc190b19yZWFkID0gbWluKGNvdW50LCAqYWN0dWFsX2J1ZmZlcik7CisJaWYgKGJ5dGVzX3RvX3JlYWQgPCAqYWN0dWFsX2J1ZmZlcikKKwkJZGV2X3dhcm4oJmRldi0+aW50Zi0+ZGV2LCAiUmVhZCBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsCisJCQkgKmFjdHVhbF9idWZmZXItYnl0ZXNfdG9fcmVhZCk7CisKKwkvKiBjb3B5IG9uZSBpbnRlcnJ1cHRfaW5fYnVmZmVyIGZyb20gcmluZ19idWZmZXIgaW50byB1c2Vyc3BhY2UgKi8KKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgYWN0dWFsX2J1ZmZlcisxLCBieXRlc190b19yZWFkKSkgeworCQlyZXR2YWwgPSAtRUZBVUxUOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKwlkZXYtPnJpbmdfdGFpbCA9IChkZXYtPnJpbmdfdGFpbCsxKSAlIHJpbmdfYnVmZmVyX3NpemU7CisKKwlyZXR2YWwgPSBieXRlc190b19yZWFkOworCit1bmxvY2tfZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSAqLworCXVwKCZkZXYtPnNlbSk7CisKK2V4aXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglsZF91c2Jfd3JpdGUKKyAqLworc3RhdGljIHNzaXplX3QgbGRfdXNiX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBsZF91c2IgKmRldjsKKwlzaXplX3QgYnl0ZXNfdG9fd3JpdGU7CisJaW50IHJldHZhbCA9IDA7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkvKiB2ZXJpZnkgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIHNvbWUgZGF0YSB0byB3cml0ZSAqLworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBsb2NrIHRoaXMgb2JqZWN0ICovCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPmludGYgPT0gTlVMTCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkXG4iLCByZXR2YWwpOworCQlnb3RvIHVubG9ja19leGl0OworCX0KKworCS8qIHdhaXQgdW50aWwgcHJldmlvdXMgdHJhbnNmZXIgaXMgZmluaXNoZWQgKi8KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCQlyZXR2YWwgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT53cml0ZV93YWl0LCAhZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJfQorCX0KKworCS8qIHdyaXRlIHRoZSBkYXRhIGludG8gaW50ZXJydXB0X291dF9idWZmZXIgZnJvbSB1c2Vyc3BhY2UgKi8KKwlieXRlc190b193cml0ZSA9IG1pbihjb3VudCwgd3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUpOworCWlmIChieXRlc190b193cml0ZSA8IGNvdW50KQorCQlkZXZfd2FybigmZGV2LT5pbnRmLT5kZXYsICJXcml0ZSBidWZmZXIgb3ZlcmZsb3csICVkIGJ5dGVzIGRyb3BwZWRcbiIsY291bnQtYnl0ZXNfdG9fd3JpdGUpOworCWRiZ19pbmZvKCZkZXYtPmludGYtPmRldiwgIiVzOiBjb3VudCA9ICVkLCBieXRlc190b193cml0ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNvdW50LCBieXRlc190b193cml0ZSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgYnVmZmVyLCBieXRlc190b193cml0ZSkpIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpIHsKKwkJLyogdHJ5IEhJRF9SRVFfU0VUX1JFUE9SVD05IG9uIGNvbnRyb2xfZW5kcG9pbnQgaW5zdGVhZCBvZiBpbnRlcnJ1cHRfb3V0X2VuZHBvaW50ICovCisJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCSB1c2Jfc25kY3RybHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihkZXYtPmludGYpLCAwKSwKKwkJCQkJIDksCisJCQkJCSBVU0JfVFlQRV9DTEFTUyB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKKwkJCQkJIDEgPDwgOCwgMCwKKwkJCQkJIGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsCisJCQkJCSBieXRlc190b193cml0ZSwKKwkJCQkJIFVTQl9DVFJMX1NFVF9USU1FT1VUICogSFopOworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWVycigiQ291bGRuJ3Qgc3VibWl0IEhJRF9SRVFfU0VUX1JFUE9SVCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisKKwkvKiBzZW5kIG9mZiB0aGUgdXJiICovCisJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLAorCQkJIGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRmKSwKKwkJCSB1c2Jfc25kaW50cGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGRldi0+aW50ZiksCisJCQkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwKKwkJCSBieXRlc190b193cml0ZSwKKwkJCSBsZF91c2JfaW50ZXJydXB0X291dF9jYWxsYmFjaywKKwkJCSBkZXYsCisJCQkgZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsKTsKKworCWRldi0+aW50ZXJydXB0X291dF9idXN5ID0gMTsKKwl3bWIoKTsKKworCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGRldi0+aW50ZXJydXB0X291dF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kgPSAwOworCQllcnIoIkNvdWxkbid0IHN1Ym1pdCBpbnRlcnJ1cHRfb3V0X3VyYiAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byB1bmxvY2tfZXhpdDsKKwl9CisJcmV0dmFsID0gYnl0ZXNfdG9fd3JpdGU7CisKK3VubG9ja19leGl0OgorCS8qIHVubG9jayB0aGUgZGV2aWNlICovCisJdXAoJmRldi0+c2VtKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBmaWxlIG9wZXJhdGlvbnMgbmVlZGVkIHdoZW4gd2UgcmVnaXN0ZXIgdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxkX3VzYl9mb3BzID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5yZWFkICA9CWxkX3VzYl9yZWFkLAorCS53cml0ZSA9CWxkX3VzYl93cml0ZSwKKwkub3BlbiA9CQlsZF91c2Jfb3BlbiwKKwkucmVsZWFzZSA9CWxkX3VzYl9yZWxlYXNlLAorCS5wb2xsID0JCWxkX3VzYl9wb2xsLAorfTsKKworLyoKKyAqIHVzYiBjbGFzcyBkcml2ZXIgaW5mbyBpbiBvcmRlciB0byBnZXQgYSBtaW5vciBudW1iZXIgZnJvbSB0aGUgdXNiIGNvcmUsCisgKiBhbmQgdG8gaGF2ZSB0aGUgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBkZXZmcyBhbmQgdGhlIGRyaXZlciBjb3JlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBsZF91c2JfY2xhc3MgPSB7CisJLm5hbWUgPQkJImxkdXNiJWQiLAorCS5mb3BzID0JCSZsZF91c2JfZm9wcywKKwkubWlub3JfYmFzZSA9CVVTQl9MRF9NSU5PUl9CQVNFLAorfTsKKworLyoqCisgKglsZF91c2JfcHJvYmUKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcworICoJdGhpcyBkcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworc3RhdGljIGludCBsZF91c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IGxkX3VzYiAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJY2hhciAqYnVmZmVyOworCWludCBpOworCWludCByZXR2YWwgPSAtRU5PTUVNOworCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbnRpYWxpemUgaXQgKi8KKworCWRldiA9IGttYWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRldiwgMHgwMCwgc2l6ZW9mKCpkZXYpKTsKKwlpbml0X01VVEVYKCZkZXYtPnNlbSk7CisJZGV2LT5pbnRmID0gaW50ZjsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlYWRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cml0ZV93YWl0KTsKKworCS8qIHdvcmthcm91bmQgZm9yIGVhcmx5IGZpcm13YXJlIHZlcnNpb25zIG9uIGZhc3QgY29tcHV0ZXJzICovCisJaWYgKChsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBVU0JfVkVORE9SX0lEX0xEKSAmJgorCSAgICAoKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWSUNFX0lEX0NBU1NZKSB8fAorCSAgICAgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWSUNFX0lEX0NPTTNMQUIpKSAmJgorCSAgICAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpIDw9IDB4MTAzKSkgeworCQlidWZmZXIgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7CisJCS8qIHVzYl9zdHJpbmcgbWFrZXMgU0VUVVArU1RBTEwgdG8gbGVhdmUgYWx3YXlzIENvbnRyb2xSZWFkTG9vcCAqLworCQl1c2Jfc3RyaW5nKHVkZXYsIDI1NSwgYnVmZmVyLCAyNTYpOworCQlrZnJlZShidWZmZXIpOworCX0KKworCWlmYWNlX2Rlc2MgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKKworCS8qIHNldCB1cCB0aGUgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKKwkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykgPT0gVVNCX0RJUl9JTikgJiYKKwkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9IGVuZHBvaW50OworCQl9CisKKwkJaWYgKCgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID09IFVTQl9ESVJfT1VUKSAmJgorCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKKwkJCWRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCA9IGVuZHBvaW50OworCQl9CisJfQorCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkludGVycnVwdCBpbiBlbmRwb2ludCBub3QgZm91bmRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID09IE5VTEwpCisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgb3V0IGVuZHBvaW50IG5vdCBmb3VuZCAodXNpbmcgY29udHJvbCBlbmRwb2ludCBpbnN0ZWFkKVxuIik7CisKKwlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplID0gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwlkZXYtPnJpbmdfYnVmZmVyID0ga21hbGxvYyhyaW5nX2J1ZmZlcl9zaXplKihzaXplb2Yoc2l6ZV90KStkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPnJpbmdfYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJpbmdfYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgPSBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPyBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSA6CisJCQkJCQkJCQkgdWRldi0+ZGVzY3JpcHRvci5iTWF4UGFja2V0U2l6ZTA7CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2Mod3JpdGVfYnVmZmVyX3NpemUqZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X3VyYlxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X2luX2ludGVydmFsID0gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWwgPyBtaW5faW50ZXJydXB0X2luX2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbDsKKwlpZiAoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50KQorCQlkZXYtPmludGVycnVwdF9vdXRfaW50ZXJ2YWwgPSBtaW5faW50ZXJydXB0X291dF9pbnRlcnZhbCA+IGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbDsKKworCS8qIHdlIGNhbiByZWdpc3RlciB0aGUgZGV2aWNlIG5vdywgYXMgaXQgaXMgcmVhZHkgKi8KKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CisKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXJfZGV2KGludGYsICZsZF91c2JfY2xhc3MpOworCWlmIChyZXR2YWwpIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWRldl9lcnIoJmludGYtPmRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiTEQgVVNCIERldmljZSAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICVkIG1pbm9yICVkXG4iLAorCQkoaW50Zi0+bWlub3IgLSBVU0JfTERfTUlOT1JfQkFTRSksIFVTQl9NQUpPUiwgaW50Zi0+bWlub3IpOworCitleGl0OgorCXJldHVybiByZXR2YWw7CisKK2Vycm9yOgorCWxkX3VzYl9kZWxldGUoZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICoJbGRfdXNiX2Rpc2Nvbm5lY3QKKyAqCisgKglDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgbGRfdXNiX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGxkX3VzYiAqZGV2OworCWludCBtaW5vcjsKKworCWRvd24oJmRpc2Nvbm5lY3Rfc2VtKTsKKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKworCWRvd24oJmRldi0+c2VtKTsKKworCW1pbm9yID0gaW50Zi0+bWlub3I7CisKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KGludGYsICZsZF91c2JfY2xhc3MpOworCisJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLworCWlmICghZGV2LT5vcGVuX2NvdW50KSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCWxkX3VzYl9kZWxldGUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXYtPmludGYgPSBOVUxMOworCQl1cCgmZGV2LT5zZW0pOworCX0KKworCXVwKCZkaXNjb25uZWN0X3NlbSk7CisKKwlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiTEQgVVNCIERldmljZSAjJWQgbm93IGRpc2Nvbm5lY3RlZFxuIiwKKwkJIChtaW5vciAtIFVTQl9MRF9NSU5PUl9CQVNFKSk7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBsZF91c2JfZHJpdmVyID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJsZHVzYiIsCisJLnByb2JlID0JbGRfdXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JbGRfdXNiX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JbGRfdXNiX3RhYmxlLAorfTsKKworLyoqCisgKglsZF91c2JfaW5pdAorICovCitzdGF0aWMgaW50IF9faW5pdCBsZF91c2JfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSBVU0Igc3Vic3lzdGVtICovCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZsZF91c2JfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQllcnIoInVzYl9yZWdpc3RlciBmYWlsZWQgZm9yIHRoZSAiX19GSUxFX18iIGRyaXZlci4gRXJyb3IgbnVtYmVyICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKglsZF91c2JfZXhpdAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgbGRfdXNiX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmbGRfdXNiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGxkX3VzYl9pbml0KTsKK21vZHVsZV9leGl0KGxkX3VzYl9leGl0KTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2J0ZXN0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwppbmRleCAzMTA0ZjI4Li5jZGE3MjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYnRlc3QuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCByZWFsd29ybGQgPSAxOwogbW9kdWxlX3BhcmFtIChyZWFsd29ybGQsIHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyAocmVhbHdvcmxkLCAiY2xlYXIgdG8gZGVtYW5kIHN0cmljdGVyIGNoOSBjb21wbGlhbmNlIik7CitNT0RVTEVfUEFSTV9ERVNDIChyZWFsd29ybGQsICJjbGVhciB0byBkZW1hbmQgc3RyaWN0ZXIgc3BlYyBjb21wbGlhbmNlIik7CiAKIHN0YXRpYyBpbnQgZ2V0X2FsdHNldHRpbmcgKHN0cnVjdCB1c2J0ZXN0X2RldiAqZGV2KQogewpAQCAtNjA0LDkgKzYwNCw4IEBACiAJCQkJVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCQkJMCwgMCwgZGV2LT5idWYsIDEsIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKIAkJaWYgKHJldHZhbCAhPSAxIHx8IGRldi0+YnVmIFswXSAhPSBleHBlY3RlZCkgewotCQkJZGV2X2RiZyAoJmlmYWNlLT5kZXYsCi0JCQkJImdldCBjb25maWcgLS0+ICVkICglZClcbiIsIHJldHZhbCwKLQkJCQlleHBlY3RlZCk7CisJCQlkZXZfZGJnICgmaWZhY2UtPmRldiwgImdldCBjb25maWcgLS0+ICVkICVkICgxICVkKVxuIiwKKwkJCQlyZXR2YWwsIGRldi0+YnVmWzBdLCBleHBlY3RlZCk7CiAJCQlyZXR1cm4gKHJldHZhbCA8IDApID8gcmV0dmFsIDogLUVET007CiAJCX0KIAl9CkBAIC0xMjQzLDcgKzEyNDIsNyBAQAogCWNoYXIJCQkqd2hhdCA9ICI/IjsKIAlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldjsKIAkKLQlpZiAobGVuZ3RoID4gMHhmZmZmIHx8IHZhcnkgPj0gbGVuZ3RoKQorCWlmIChsZW5ndGggPCAxIHx8IGxlbmd0aCA+IDB4ZmZmZiB8fCB2YXJ5ID49IGxlbmd0aCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlidWYgPSBrbWFsbG9jKGxlbmd0aCwgU0xBQl9LRVJORUwpOwpAQCAtMTI2Niw2ICsxMjY1LDExIEBACiAJCQkJMCwgMCwgYnVmLCBsZW4sIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAkJaWYgKHJldHZhbCAhPSBsZW4pIHsKIAkJCXdoYXQgPSAid3JpdGUiOworCQkJaWYgKHJldHZhbCA+PSAwKSB7CisJCQkJSU5GTyhkZXYsICJjdHJsX291dCwgd2xlbiAlZCAoZXhwZWN0ZWQgJWQpXG4iLAorCQkJCQkJcmV0dmFsLCBsZW4pOworCQkJCXJldHZhbCA9IC1FQkFETVNHOworCQkJfQogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTI3NSw2ICsxMjc5LDExIEBACiAJCQkJMCwgMCwgYnVmLCBsZW4sIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKIAkJaWYgKHJldHZhbCAhPSBsZW4pIHsKIAkJCXdoYXQgPSAicmVhZCI7CisJCQlpZiAocmV0dmFsID49IDApIHsKKwkJCQlJTkZPKGRldiwgImN0cmxfb3V0LCBybGVuICVkIChleHBlY3RlZCAlZClcbiIsCisJCQkJCQlyZXR2YWwsIGxlbik7CisJCQkJcmV0dmFsID0gLUVCQURNU0c7CisJCQl9CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMjkzLDggKzEzMDIsMTMgQEAKIAkJfQogCiAJCWxlbiArPSB2YXJ5OworCisJCS8qIFtyZWFsIHdvcmxkXSB0aGUgInplcm8gYnl0ZXMgSU4iIGNhc2UgaXNuJ3QgcmVhbGx5IHVzZWQuCisJCSAqIGhhcmR3YXJlIGNhbiBlYXNpbHkgdHJpcCB1cCBpbiB0aGlzIHdpZXJkIGNhc2UsIHNpbmNlIGl0cworCQkgKiBzdGF0dXMgc3RhZ2UgaXMgSU4sIG5vdCBPVVQgbGlrZSBvdGhlciBlcDBpbiB0cmFuc2ZlcnMuCisJCSAqLwogCQlpZiAobGVuID4gbGVuZ3RoKQotCQkJbGVuID0gMDsKKwkJCWxlbiA9IHJlYWx3b3JsZCA/IDEgOiAwOwogCX0KIAogCWlmIChyZXR2YWwgPCAwKQpAQCAtMTUxOSw2ICsxNTMzLDExIEBACiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmRldi0+c2VtKSkKIAkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKIAorCWlmIChpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgIT0gUE1TR19PTikgeworCQl1cCAoJmRldi0+c2VtKTsKKwkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisJfQorCiAJLyogc29tZSBkZXZpY2VzLCBsaWtlIGV6LXVzYiBkZWZhdWx0IGRldmljZXMsIG5lZWQgYSBub24tZGVmYXVsdAogCSAqIGFsdHNldHRpbmcgdG8gaGF2ZSBhbnkgYWN0aXZlIGVuZHBvaW50cy4gIHNvbWUgdGVzdHMgY2hhbmdlCiAJICogYWx0c2V0dGluZ3M7IGZvcmNlIGEgZGVmYXVsdCBzbyBtb3N0IHRlc3RzIGRvbid0IG5lZWQgdG8gY2hlY2suCkBAIC0xNzYyLDggKzE3ODEsMTAgQEAKIAljYXNlIDE0OgogCQlpZiAoIWRldi0+aW5mby0+Y3RybF9vdXQpCiAJCQlicmVhazsKLQkJZGV2X2RiZyAoJmludGYtPmRldiwgIlRFU1QgMTQ6ICAlZCBlcDBvdXQsIDAuLiVkIHZhcnkgJWRcbiIsCi0JCQkJcGFyYW0tPml0ZXJhdGlvbnMsIHBhcmFtLT5sZW5ndGgsIHBhcmFtLT52YXJ5KTsKKwkJZGV2X2RiZyAoJmludGYtPmRldiwgIlRFU1QgMTQ6ICAlZCBlcDBvdXQsICVkLi4lZCB2YXJ5ICVkXG4iLAorCQkJCXBhcmFtLT5pdGVyYXRpb25zLAorCQkJCXJlYWx3b3JsZCA/IDEgOiAwLCBwYXJhbS0+bGVuZ3RoLAorCQkJCXBhcmFtLT52YXJ5KTsKIAkJcmV0dmFsID0gY3RybF9vdXQgKGRldiwgcGFyYW0tPml0ZXJhdGlvbnMsIAogCQkJCXBhcmFtLT5sZW5ndGgsIHBhcmFtLT52YXJ5KTsKIAkJYnJlYWs7CkBAIC0xOTI3LDYgKzE5NDgsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB1c2J0ZXN0X3N1c3BlbmQgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgdXNidGVzdF9kZXYJKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOworCisJZG93biAoJmRldi0+c2VtKTsKKwlpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX1NVU1BFTkQ7CisJdXAgKCZkZXYtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNidGVzdF9yZXN1bWUgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2J0ZXN0X2RldgkqZGV2ID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CisKKwlkb3duICgmZGV2LT5zZW0pOworCWludGYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisJdXAgKCZkZXYtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIHZvaWQgdXNidGVzdF9kaXNjb25uZWN0IChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdXNidGVzdF9kZXYJKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwpAQCAtMjExNSw2ICsyMTU3LDggQEAKIAkucHJvYmUgPQl1c2J0ZXN0X3Byb2JlLAogCS5pb2N0bCA9CXVzYnRlc3RfaW9jdGwsCiAJLmRpc2Nvbm5lY3QgPQl1c2J0ZXN0X2Rpc2Nvbm5lY3QsCisJLnN1c3BlbmQgPQl1c2J0ZXN0X3N1c3BlbmQsCisJLnJlc3VtZSA9CXVzYnRlc3RfcmVzdW1lLAogfTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKaW5kZXggNzU1YTQ1Ny4uMjYyNjZiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jCkBAIC0xOSwxMSArMTksMTYgQEAKICNkZWZpbmUgREFUQV9NQVggIDMyCiAKIC8qCisgKiBEZWZpbmVkIGJ5IFVTQiAyLjAgY2xhdXNlIDkuMywgdGFibGUgOS4yLgorICovCisjZGVmaW5lIFNFVFVQX01BWCAgOAorCisvKgogICogVGhpcyBsaW1pdCBleGlzdHMgdG8gcHJldmVudCBPT01zIHdoZW4gdGhlIHVzZXIgcHJvY2VzcyBzdG9wcyByZWFkaW5nLgogICovCiAjZGVmaW5lIEVWRU5UX01BWCAgMjUKIAotI2RlZmluZSBQUklOVEZfREZMICAxMjAKKyNkZWZpbmUgUFJJTlRGX0RGTCAgMTMwCiAKIHN0cnVjdCBtb25fZXZlbnRfdGV4dCB7CiAJc3RydWN0IGxpc3RfaGVhZCBlX2xpbms7CkBAIC0zMyw3ICszOCw5IEBACiAJdW5zaWduZWQgaW50IHRzdGFtcDsKIAlpbnQgbGVuZ3RoOwkJLyogRGVwZW5kcyBvbiB0eXBlOiB4ZmVyIGxlbmd0aCBvciBhY3QgbGVuZ3RoICovCiAJaW50IHN0YXR1czsKKwljaGFyIHNldHVwX2ZsYWc7CiAJY2hhciBkYXRhX2ZsYWc7CisJdW5zaWduZWQgY2hhciBzZXR1cFtTRVRVUF9NQVhdOwogCXVuc2lnbmVkIGNoYXIgZGF0YVtEQVRBX01BWF07CiB9OwogCkBAIC02NCw2ICs3MSwyMiBAQAogICogVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgd2hvbGUgbW9uX2J1cyBsb2NrZWQsIHNvIG5vIGFkZGl0aW9uYWwgbG9jay4KICAqLwogCitzdGF0aWMgaW5saW5lIGNoYXIgbW9uX3RleHRfZ2V0X3NldHVwKHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXAsCisgICAgc3RydWN0IHVyYiAqdXJiLCBjaGFyIGV2X3R5cGUpCit7CisKKwlpZiAoIXVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpIHx8IGV2X3R5cGUgIT0gJ1MnKQorCQlyZXR1cm4gJy0nOworCisJaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fU0VUVVBfRE1BX01BUCkKKwkJcmV0dXJuICdEJzsKKwlpZiAodXJiLT5zZXR1cF9wYWNrZXQgPT0gTlVMTCkKKwkJcmV0dXJuICdaJzsJLyogJzAnIHdvdWxkIGJlIG5vdCBhcyBwcmV0dHkuICovCisKKwltZW1jcHkoZXAtPnNldHVwLCB1cmItPnNldHVwX3BhY2tldCwgU0VUVVBfTUFYKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBjaGFyIG1vbl90ZXh0X2dldF9kYXRhKHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXAsIHN0cnVjdCB1cmIgKnVyYiwKICAgICBpbnQgbGVuLCBjaGFyIGV2X3R5cGUpCiB7CkBAIC05MCw3ICsxMTMsNiBAQAogCiAJLyoKIAkgKiBCdWxrIGlzIGVhc3kgdG8gc2hvcnRjdXQgcmVsaWFibHkuIAotCSAqIFhYWCBDb250cm9sIG5lZWRzIHNldHVwIHBhY2tldCB0YWtlbi4KIAkgKiBYWFggT3RoZXIgcGlwZSB0eXBlcyBuZWVkIGNvbnNpZGVyYXRpb24uIEN1cnJlbnRseSwgd2Ugb3ZlcmRvIGl0CiAJICogYW5kIGNvbGxlY3QgZ2FyYmFnZSBmb3IgdGhlbTogYmV0dGVyIG1vcmUgdGhhbiBsZXNzLgogCSAqLwpAQCAtMTQ0LDYgKzE2Niw3IEBACiAJLyogQ29sbGVjdGluZyBzdGF0dXMgbWFrZXMgZGVidWdnaW5nIHNlbnNlIGZvciBzdWJtaXRzLCB0b28gKi8KIAllcC0+c3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKKwllcC0+c2V0dXBfZmxhZyA9IG1vbl90ZXh0X2dldF9zZXR1cChlcCwgdXJiLCBldl90eXBlKTsKIAllcC0+ZGF0YV9mbGFnID0gbW9uX3RleHRfZ2V0X2RhdGEoZXAsIHVyYiwgZXAtPmxlbmd0aCwgZXZfdHlwZSk7CiAKIAlycC0+bmV2ZW50cysrOwpAQCAtMjk5LDEwICszMjIsMjUgQEAKIAlkZWZhdWx0OiAvKiBQSVBFX0JVTEsgKi8gIHV0eXBlID0gJ0InOwogCX0KIAljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsCi0JICAgICIlbHggJXUgJWMgJWMlYzolMDN1OiUwMnUgJWQgJWQiLAorCSAgICAiJWx4ICV1ICVjICVjJWM6JTAzdTolMDJ1IiwKIAkgICAgZXAtPmlkLCBlcC0+dHN0YW1wLCBlcC0+dHlwZSwKLQkgICAgdXR5cGUsIHVkaXIsIHVzYl9waXBlZGV2aWNlKGVwLT5waXBlKSwgdXNiX3BpcGVlbmRwb2ludChlcC0+cGlwZSksCi0JICAgIGVwLT5zdGF0dXMsIGVwLT5sZW5ndGgpOworCSAgICB1dHlwZSwgdWRpciwgdXNiX3BpcGVkZXZpY2UoZXAtPnBpcGUpLCB1c2JfcGlwZWVuZHBvaW50KGVwLT5waXBlKSk7CisKKwlpZiAoZXAtPnNldHVwX2ZsYWcgPT0gMCkgeyAgIC8qIFNldHVwIHBhY2tldCBpcyBwcmVzZW50IGFuZCBjYXB0dXJlZCAqLworCQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsCisJCSAgICAiIHMgJTAyeCAlMDJ4ICUwNHggJTA0eCAlMDR4IiwKKwkJICAgIGVwLT5zZXR1cFswXSwKKwkJICAgIGVwLT5zZXR1cFsxXSwKKwkJICAgIChlcC0+c2V0dXBbM10gPDwgOCkgfCBlcC0+c2V0dXBbMl0sCisJCSAgICAoZXAtPnNldHVwWzVdIDw8IDgpIHwgZXAtPnNldHVwWzRdLAorCQkgICAgKGVwLT5zZXR1cFs3XSA8PCA4KSB8IGVwLT5zZXR1cFs2XSk7CisJfSBlbHNlIGlmIChlcC0+c2V0dXBfZmxhZyAhPSAnLScpIHsgLyogVW5hYmxlIHRvIGNhcHR1cmUgc2V0dXAgcGFja2V0ICovCisJCWNudCArPSBzbnByaW50ZihwYnVmICsgY250LCBsaW1pdCAtIGNudCwKKwkJICAgICIgJWMgX18gX18gX19fXyBfX19fIF9fX18iLCBlcC0+c2V0dXBfZmxhZyk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzZXR1cCBmb3IgdGhpcyBraW5kIG9mIFVSQiAqLworCQljbnQgKz0gc25wcmludGYocGJ1ZiArIGNudCwgbGltaXQgLSBjbnQsICIgJWQiLCBlcC0+c3RhdHVzKTsKKwl9CisJY250ICs9IHNucHJpbnRmKHBidWYgKyBjbnQsIGxpbWl0IC0gY250LCAiICVkIiwgZXAtPmxlbmd0aCk7CiAKIAlpZiAoKGRhdGFfbGVuID0gZXAtPmxlbmd0aCkgPiAwKSB7CiAJCWlmIChlcC0+ZGF0YV9mbGFnID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYyBiL2RyaXZlcnMvdXNiL25ldC9rYXdldGguYwppbmRleCBmZDZmZjRjLi43ZmZhOTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQva2F3ZXRoLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L2thd2V0aC5jCkBAIC00NzcsNyArNDc3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQga2F3ZXRoX3VzYl9yZWNlaXZlKHN0cnVjdCB1cmIgKiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotc3RhdGljIGludCBrYXdldGhfcmVzdWJtaXRfcnhfdXJiKHN0cnVjdCBrYXdldGhfZGV2aWNlICosIGludCk7CitzdGF0aWMgaW50IGthd2V0aF9yZXN1Ym1pdF9yeF91cmIoc3RydWN0IGthd2V0aF9kZXZpY2UgKiwgdW5zaWduZWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCWludF9jYWxsYmFjawpAQCAtNTUwLDcgKzU1MCw3IEBACiAgKiAgICAga2F3ZXRoX3Jlc3VibWl0X3J4X3VyYgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IGthd2V0aF9yZXN1Ym1pdF9yeF91cmIoc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCwKLQkJCQkJCWludCBtZW1fZmxhZ3MpCisJCQkJCQl1bnNpZ25lZCBtZW1fZmxhZ3MpCiB7CiAJaW50IHJlc3VsdDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYyBiL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKaW5kZXggZDk3Njc5MC4uNWY0NDk2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCkBAIC0xMTY2LDcgKzExNjYsNyBAQAogCQlwZWdhc3VzLT5ldGhfcmVnc1tFdGhDdHJsMl0gfD0gUlhfUFJPTUlTQ1VPVVM7CiAJCWlmIChuZXRpZl9tc2dfbGluayhwZWdhc3VzKSkKIAkJCXByX2luZm8oIiVzOiBQcm9taXNjdW91cyBtb2RlIGVuYWJsZWQuXG4iLCBuZXQtPm5hbWUpOwotCX0gZWxzZSBpZiAoKG5ldC0+bWNfY291bnQgPiBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0KSB8fAorCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCB8fAogCQkgICAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSSkpIHsKIAkJcGVnYXN1cy0+ZXRoX3JlZ3NbRXRoQ3RybDBdIHw9IFJYX01VTFRJQ0FTVDsKIAkJcGVnYXN1cy0+ZXRoX3JlZ3NbRXRoQ3RybDJdICY9IH5SWF9QUk9NSVNDVU9VUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmggYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5oCmluZGV4IDEzY2NlZGUuLmI5OGYyYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmgKKysrIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuaApAQCAtMjQ5LDYgKzI0OSw4IEBACiAJCURFRkFVTFRfR1BJT19SRVNFVCkKIFBFR0FTVVNfREVWKCAiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMDIsCiAJCURFRkFVTFRfR1BJT19SRVNFVCApCitQRUdBU1VTX0RFViggIkxBTkVFRCBVU0IgRXRoZXJuZXQgTEQtVVNCTC9UWCIsIFZFTkRPUl9MQU5FRUQsIDB4NDAwNSwKKwkJREVGQVVMVF9HUElPX1JFU0VUIHwgUEVHQVNVU19JSSkKIFBFR0FTVVNfREVWKCAiTEFORUVEIFVTQiBFdGhlcm5ldCBMRC1VU0IvVFgiLCBWRU5ET1JfTEFORUVELCAweDQwMGIsCiAJCURFRkFVTFRfR1BJT19SRVNFVCB8IFBFR0FTVVNfSUkgKQogUEVHQVNVU19ERVYoICJMQU5FRUQgVVNCIEV0aGVybmV0IExELVVTQi9UIiwgVkVORE9SX0xBTkVFRCwgMHhhYmMxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYyBiL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKaW5kZXggOGZiMjIzMy4uNjI2YjAxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCkBAIC02NjcsNyArNjY3LDcgQEAKIAlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCWRldi0+cnhfY3JlZyB8PSBjcHVfdG9fbGUxNigweDAwMDEpOwogCQlpbmZvKCIlczogcHJvbWlzY3VvdXMgbW9kZSIsIG5ldGRldi0+bmFtZSk7Ci0JfSBlbHNlIGlmICgobmV0ZGV2LT5tY19jb3VudCA+IG11bHRpY2FzdF9maWx0ZXJfbGltaXQpIHx8CisJfSBlbHNlIGlmIChuZXRkZXYtPm1jX2NvdW50IHx8CiAJCSAgIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgewogCQlkZXYtPnJ4X2NyZWcgJj0gY3B1X3RvX2xlMTYoMHhmZmZlKTsKIAkJZGV2LT5yeF9jcmVnIHw9IGNwdV90b19sZTE2KDB4MDAwMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKaW5kZXggNGNiYjQwOC4uNTc2ZjNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYwpAQCAtMTQyOSw3ICsxNDI5LDcgQEAKIAkJCWluZm8tPmV0aGVyID0gKHZvaWQgKikgYnVmOwogCQkJaWYgKGluZm8tPmV0aGVyLT5iTGVuZ3RoICE9IHNpemVvZiAqaW5mby0+ZXRoZXIpIHsKIAkJCQlkZXZfZGJnICgmaW50Zi0+ZGV2LCAiQ0RDIGV0aGVyIGxlbiAldVxuIiwKLQkJCQkJaW5mby0+dS0+Ykxlbmd0aCk7CisJCQkJCWluZm8tPmV0aGVyLT5iTGVuZ3RoKTsKIAkJCQlnb3RvIGJhZF9kZXNjOwogCQkJfQogCQkJZGV2LT5uZXQtPm10dSA9IGxlMTZfdG9fY3B1cCAoCkBAIC0zMjI3LDkgKzMyMjcsOSBAQAogCXRlbXAgPSB1bmxpbmtfdXJicyAoZGV2LCAmZGV2LT50eHEpICsgdW5saW5rX3VyYnMgKGRldiwgJmRldi0+cnhxKTsKIAogCS8vIG1heWJlIHdhaXQgZm9yIGRlbGV0aW9ucyB0byBmaW5pc2guCi0Jd2hpbGUgKHNrYl9xdWV1ZV9sZW4gKCZkZXYtPnJ4cSkKLQkJCSYmIHNrYl9xdWV1ZV9sZW4gKCZkZXYtPnR4cSkKLQkJCSYmIHNrYl9xdWV1ZV9sZW4gKCZkZXYtPmRvbmUpKSB7CisJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJmRldi0+cnhxKSAmJgorCSAgICAgICAhc2tiX3F1ZXVlX2VtcHR5KCZkZXYtPnR4cSkgJiYKKwkgICAgICAgIXNrYl9xdWV1ZV9lbXB0eSgmZGV2LT5kb25lKSkgewogCQltc2xlZXAoVU5MSU5LX1RJTUVPVVRfTVMpOwogCQlpZiAobmV0aWZfbXNnX2lmZG93biAoZGV2KSkKIAkJCWRldmRiZyAoZGV2LCAid2FpdGVkIGZvciAlZCB1cmIgY29tcGxldGlvbnMiLCB0ZW1wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuYyBiL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuYwppbmRleCAzNDFhZTVmLi4zYjM4N2IwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5jCkBAIC0xODg0LDEyICsxODg0LDUzIEBACiAJa2ZyZWUoemQpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgemQxMjAxX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJCSAgIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCB6ZDEyMDEgKnpkID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCisJbmV0aWZfZGV2aWNlX2RldGFjaCh6ZC0+ZGV2KTsKKworCXpkLT53YXNfZW5hYmxlZCA9IHpkLT5tYWNfZW5hYmxlZDsKKworCWlmICh6ZC0+d2FzX2VuYWJsZWQpCisJCXJldHVybiB6ZDEyMDFfZGlzYWJsZSh6ZCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6ZDEyMDFfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHpkMTIwMSAqemQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisKKwlpZiAoIXpkIHx8ICF6ZC0+ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5ldGlmX2RldmljZV9hdHRhY2goemQtPmRldik7CisKKwlpZiAoemQtPndhc19lbmFibGVkKQorCQlyZXR1cm4gemQxMjAxX2VuYWJsZSh6ZCk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2RlZmluZSB6ZDEyMDFfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHpkMTIwMV9yZXN1bWUgIE5VTEwKKworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB6ZDEyMDFfdXNiID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5uYW1lID0gInpkMTIwMSIsCiAJLnByb2JlID0gemQxMjAxX3Byb2JlLAogCS5kaXNjb25uZWN0ID0gemQxMjAxX2Rpc2Nvbm5lY3QsCiAJLmlkX3RhYmxlID0gemQxMjAxX3RhYmxlLAorCS5zdXNwZW5kID0gemQxMjAxX3N1c3BlbmQsCisJLnJlc3VtZSA9IHpkMTIwMV9yZXN1bWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB6ZDEyMDFfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5oIGIvZHJpdmVycy91c2IvbmV0L3pkMTIwMS5oCmluZGV4IDE2MjdjNzEuLjIzNWYwZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC96ZDEyMDEuaAorKysgYi9kcml2ZXJzL3VzYi9uZXQvemQxMjAxLmgKQEAgLTQ2LDYgKzQ2LDcgQEAKIAljaGFyCQkJZXNzaWRbSVdfRVNTSURfTUFYX1NJWkUrMV07CiAJaW50CQkJZXNzaWRsZW47CiAJaW50CQkJbWFjX2VuYWJsZWQ7CisJaW50CQkJd2FzX2VuYWJsZWQ7CiAJaW50CQkJbW9uaXRvcjsKIAlpbnQJCQllbmNvZGVfZW5hYmxlZDsKIAlpbnQJCQllbmNvZGVfcmVzdHJpY3RlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYwppbmRleCA0NmEyMDRjLi5iNWI0MzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCkBAIC0yMTMsMTAgKzIxMywxNCBAQAogCQlyZXR1cm4gKDApOwogCX0KIAotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgeworCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAl9CisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOworCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTIyNCw2ICsyMjgsNyBAQAogCQkvKiBUbyBtdWNoIGRhdGEgZm9yIGJ1ZmZlci4gUmVzZXQgYnVmZmVyLiAqLwogCQlwcml2LT53cmZpbGxlZD0wOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJcmV0dXJuICgwKTsKIAl9CiAKQEAgLTI2OCw2ICsyNzMsNyBAQAogCQkJcHJpdi0+d3JmaWxsZWQ9MDsKIAkJCXByaXYtPndyc2VudD0wOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCQkJcmV0dXJuIDA7CiAJCX0KIApAQCAtNDEyLDcgKzQxOCw4IEBACiAJc3RydWN0IGN5YmVyamFja19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7Ci0JCisKKwlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJaWYgKHVyYi0+c3RhdHVzKSB7CiAJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CkBAIC00MjQsMTIgKzQzMSw2IEBACiAJaWYoIHByaXYtPndyZmlsbGVkICkgewogCQlpbnQgbGVuZ3RoLCBibGtzaXplLCByZXN1bHQ7CiAKLQkJaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7Ci0JCQlyZXR1cm47Ci0JCX0KLQogCQlkYmcoIiVzIC0gdHJhbnNtaXR0aW5nIGRhdGEgKGZyYW1lIG4pIiwgX19GVU5DVElPTl9fKTsKIAogCQlsZW5ndGggPSAoKHByaXYtPndyZmlsbGVkIC0gcHJpdi0+d3JzZW50KSA+IHBvcnQtPmJ1bGtfb3V0X3NpemUpID8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggZDg4MmZhMy4uMGIwM2RkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTI2NCwxNiArMjY0LDI2IEBACiAvKgogICogVmVyc2lvbiBJbmZvcm1hdGlvbgogICovCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS40LjIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS40LjMiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+LCBCaWxsIFJ5ZGVyIDxicnlkZXJAc2dpLmNvbT4sIEt1YmEgT2JlciA8a3ViYUBtYXJlaW1icml1bS5vcmc+IgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIEZUREkgU2VyaWFsIENvbnZlcnRlcnMgRHJpdmVyIgogCiBzdGF0aWMgaW50IGRlYnVnOwogCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfc2lvIFtdID0gewotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9TSU9fUElEKSB9LAotCXsgVVNCX0RFVklDRShNT0JJTElUWV9WSUQsIE1PQklMSVRZX1VTQl9TRVJJQUxfUElEKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCisvKiBzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgaXMgdXNlZCBieSBkZXZpY2VzIHJlcXVpcmluZyBzcGVjaWFsIGF0dGVudGlvbi4gKi8KK3N0cnVjdCBmdGRpX3Npb19xdWlyayB7CisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgdXNiX3NlcmlhbCAqKTsgLyogU3BlY2lhbCBzZXR0aW5ncyBkdXJpbmcgc3RhcnR1cC4gKi8KK307CisKK3N0YXRpYyB2b2lkICBmdGRpX1VTQl9VSVJUX3NldHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyB2b2lkICBmdGRpX0hFX1RJUkExX3NldHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKKworc3RhdGljIHN0cnVjdCBmdGRpX3Npb19xdWlyayBmdGRpX1VTQl9VSVJUX3F1aXJrID0geworCS5zZXR1cCA9IGZ0ZGlfVVNCX1VJUlRfc2V0dXAsCit9OworCitzdGF0aWMgc3RydWN0IGZ0ZGlfc2lvX3F1aXJrIGZ0ZGlfSEVfVElSQTFfcXVpcmsgPSB7CisJLnNldHVwID0gZnRkaV9IRV9USVJBMV9zZXR1cCwKIH07CiAKIC8qCkBAIC0yODgsMjM3ICsyOTgsMTEgQEAKICAqIHRoZSBiY2REZXZpY2UgdmFsdWUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIEZUMjMyQk0gYW5kIEZUMjQ1Qk0gZnJvbQogICogdGhlIGVhcmxpZXIgRlQ4VTIzMkFNIGFuZCBGVDhVMjMyQk0uICBGb3Igbm93LCBpbmNsdWRlIGFsbCBrbm93biBWSUQvUElECiAgKiBjb21iaW5hdGlvbnMgaW4gYm90aCB0YWJsZXMuCi0gKiBGSVhNRTogcGVyaGFwcyBiY2REZXZpY2UgY2FuIGFsc28gaWRlbnRpZnkgMTJNSHogZGV2aWNlcywgYnV0IEkgZG9uJ3Qga25vdwotICogaWYgdGhvc2UgZXZlciB3ZW50IGludG8gbWFzcyBwcm9kdWN0aW9uLiBbSWFuIEFiYm90dF0KKyAqIEZJWE1FOiBwZXJoYXBzIGJjZERldmljZSBjYW4gYWxzbyBpZGVudGlmeSAxMk1IeiBGVDhVMjMyQU0gZGV2aWNlcywKKyAqIGJ1dCBJIGRvbid0IGtub3cgaWYgdGhvc2UgZXZlciB3ZW50IGludG8gbWFzcyBwcm9kdWN0aW9uLiBbSWFuIEFiYm90dF0KICAqLwogCiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV84VTIzMkFNIFtdID0gewotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfSVJUUkFOU19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfOFUyMzJBTV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfOFUyMzJBTV9BTFRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1JFTEFJU19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRShJTlRFUkJJT01FVFJJQ1NfVklELCBJTlRFUkJJT01FVFJJQ1NfSU9CT0FSRF9QSUQpIH0sCi0JeyBVU0JfREVWSUNFKElOVEVSQklPTUVUUklDU19WSUQsIElOVEVSQklPTUVUUklDU19NSU5JX0lPQk9BUkRfUElEKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9ORl9SSUNfVklELCBGVERJX05GX1JJQ19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjMyX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzU0N19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjMzX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzNV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjQwX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82NDJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1ZOSENQQ1VTQl9EX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9EU1MyMF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAxX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTA0X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAxXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMjAzXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjIwM18yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAxXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMV8zX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwMl8yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAyXzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM18xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yNDAzXzNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjQwM180X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzJfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV8zX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzVfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMV82X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfN19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAxXzhfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl8xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzNfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl80X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAyXzZfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwMl83X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfOF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzFfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM18yX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfM19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM181X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yODAzXzdfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM184X1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJRFRFQ0hfVklELCBJRFRFQ0hfSURUMTIyMVVfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKE9DVF9WSUQsIE9DVF9VUzEwMV9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8xLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1IyWDAsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8zLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfNCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9FTFZfVU8xMDBfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0VMVl9VTTEwMF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIElOU0lERV9BQ0NFU1NPLCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfTkVPVklfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZBTENPTV9WSUQsIEZBTENPTV9UV0lTVF9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfU1VVTlRPX1NQT1JUU19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUk1fQ0FOVklFV19QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoQkFOREJfVklELCBCQU5EQl9VU09UTDRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNUTDRfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPOU1MMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEVWRVJfRUNPX1BST19DRFMsIDAsIDB4M2ZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzBfUElELCAwLCAweDNmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzROX0dBTEFYWV9ERV8xX1BJRCwgMCwgMHgzZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQsIDAsIDB4M2ZmKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9GVDIzMkJNIFtdID0gewotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfSVJUUkFOU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV84VTIzMkFNX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJXzhVMjMyQU1fQUxUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1JFTEFJU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX05GX1JJQ19WSUQsIEZURElfTkZfUklDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNTQ3X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzYzM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82MzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfWEZfNjM1X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1hGXzY0MF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9YRl82NDJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfVk5IQ1BDVVNCX0RfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRFNTMjBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzNfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfTVRYT1JCXzZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfUEVSTEVfVUxUUkFQT1JUX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX1BJRUdST1VQX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIxMDJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAzX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjEwNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDFfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDJfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzIyMDNfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDFfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDJfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI0MDNfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfNl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfN19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDFfOF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfNl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfN19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDJfOF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfNl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfN19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihTRUFMRVZFTF9WSUQsIFNFQUxFVkVMXzI4MDNfOF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihJRFRFQ0hfVklELCBJRFRFQ0hfSURUMTIyMVVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoT0NUX1ZJRCwgT0NUX1VTMTAxX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMSwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBQUk9URUdPX1IyWDAsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzMsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4OF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODlfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhBX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4Ql9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OENfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhEX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEZfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfRUxWX1VPMTAwX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0VMVl9VTTEwMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfU0RNVVNCUVNTX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9NQVNURVJERVZFTDJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8wX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9GVVRVUkVfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9DQ1NJQ0RVMjBfMF9QSUQpIH0sCi0JeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX0NDU0lDRFU0MF8xX1BJRCkgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBJTlNJREVfQUNDRVNTTywgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKElOVFJFUElEX1ZJRCwgSU5UUkVQSURfVkFMVUVDQU5fUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoSU5UUkVQSURfVklELCBJTlRSRVBJRF9ORU9WSV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGQUxDT01fVklELCBGQUxDT01fVFdJU1RfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfU1VVTlRPX1NQT1JUU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9STV9DQU5WSUVXX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNPVEw0X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEJBTkRCX1ZJRCwgQkFOREJfVVNUTDRfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoQkFOREJfVklELCBCQU5EQl9VU085TUwyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBFVkVSX0VDT19QUk9fQ0RTLCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzBfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KLX07Ci0KLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX1VTQl9VSVJUIFtdID0gewotCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9VU0JfVUlSVF9QSUQpIH0sCi0JeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KLX07Ci0KLQotc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlX0hFX1RJUkExIFtdID0gewotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfSEVfVElSQTFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9GVDIyMzJDW10gPSB7Ci0JeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJXzhVMjIzMkNfUElEKSB9LAotCXsgfQkJCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZV9jb21iaW5lZCBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfSVJUUkFOU19QSUQpIH0sCkBAIC01NDAsMTQgKzMyNCwxNCBAQAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9EU1MyMF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfTkZfUklDX1ZJRCwgRlRESV9ORl9SSUNfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9WTkhDUENVU0JfRF9QSUQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfMV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfMl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfM19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfNF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfNV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9NVFhPUkJfNl9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9QRVJMRV9VTFRSQVBPUlRfUElELCAweDQwMCwgMHhmZmZmKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfMF9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl8xX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfM19QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX01UWE9SQl80X1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfTVRYT1JCXzVfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9NVFhPUkJfNl9QSUQpIH0sCisJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BFUkxFX1VMVFJBUE9SVF9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBGVERJX1BJRUdST1VQX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAxX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoU0VBTEVWRUxfVklELCBTRUFMRVZFTF8yMTAyX1BJRCkgfSwKQEAgLTU5NywzNSArMzgxLDM3IEBACiAJeyBVU0JfREVWSUNFKFNFQUxFVkVMX1ZJRCwgU0VBTEVWRUxfMjgwM184X1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoSURURUNIX1ZJRCwgSURURUNIX0lEVDEyMjFVX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoT0NUX1ZJRCwgT0NUX1VTMTAxX1BJRCkgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0hFX1RJUkExX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCX1VJUlRfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9IRV9USVJBMV9QSUQpLAorCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJmZ0ZGlfSEVfVElSQTFfcXVpcmsgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfVVNCX1VJUlRfUElEKSwKKwkJLmRyaXZlcl9pbmZvID0gKGtlcm5lbF91bG9uZ190KSZmdGRpX1VTQl9VSVJUX3F1aXJrIH0sCiAJeyBVU0JfREVWSUNFKEZURElfVklELCBQUk9URUdPX1NQRUNJQUxfMSkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fUjJYMCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIFBST1RFR09fU1BFQ0lBTF8zKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgUFJPVEVHT19TUEVDSUFMXzQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDhfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODA5X1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwQV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEJfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBDX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTgwRF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEVfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODBGX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4OF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODlfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhBX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4Ql9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OENfUElELCAweDQwMCwgMHhmZmZmKSB9LAotCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIEZURElfR1VERUFEU19FODhEX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLQl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBGVERJX0dVREVBRFNfRTg4RV9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEZfUElELCAweDQwMCwgMHhmZmZmKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDhfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MDlfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEFfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MENfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MERfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEVfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4MEZfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODhfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4ODlfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEFfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEJfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OENfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OERfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEVfUElEKSB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9HVURFQURTX0U4OEZfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVU8xMDBfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFZfVU0xMDBfUElEKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfTUFTVEVSREVWRUwyX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKLSAJeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgTElOWF9GVVRVUkVfMF9QSUQsIDB4NDAwLCAweGZmZmYpIH0sCi0gCXsgVVNCX0RFVklDRV9WRVIoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElELCAweDQwMCwgMHhmZmZmKSB9LAotIAl7IFVTQl9ERVZJQ0VfVkVSKEZURElfVklELCBMSU5YX0ZVVFVSRV8yX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKKyAJeyBVU0JfREVWSUNFKEZURElfVklELCBMSU5YX1NETVVTQlFTU19QSUQpIH0sCisgCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgTElOWF9NQVNURVJERVZFTDJfUElEKSB9LAorIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzBfUElEKSB9LAorIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzFfUElEKSB9LAorIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIExJTlhfRlVUVVJFXzJfUElEKSB9LAogIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTIwXzBfUElEKSB9LAogIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQ0NTSUNEVTQwXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgSU5TSURFX0FDQ0VTU08pIH0sCkBAIC02NDIsNyArNDI4LDcgQEAKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfNE5fR0FMQVhZX0RFXzFfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV80Tl9HQUxBWFlfREVfMl9QSUQpIH0sCiAJeyBVU0JfREVWSUNFKE1PQklMSVRZX1ZJRCwgTU9CSUxJVFlfVVNCX1NFUklBTF9QSUQpIH0sCi0JeyBVU0JfREVWSUNFX1ZFUihGVERJX1ZJRCwgRlRESV9BQ1RJVkVfUk9CT1RTX1BJRCwgMHg0MDAsIDB4ZmZmZikgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfQUNUSVZFX1JPQk9UU19QSUQpIH0sCiAJeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKQEAgLTcwNSwxMiArNDkxLDggQEAKICBBU1lOQ19TUERfQ1VTVCB8IEFTWU5DX1NQRF9TSEkgfCBBU1lOQ19TUERfV0FSUCApCiAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGEgRlRESSBzZXJpYWwgY29udmVydGVyICovCi1zdGF0aWMgaW50ICBmdGRpX1NJT19zdGFydHVwCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7Ci1zdGF0aWMgaW50ICBmdGRpXzhVMjMyQU1fc3RhcnR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7Ci1zdGF0aWMgaW50ICBmdGRpX0ZUMjMyQk1fc3RhcnR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7Ci1zdGF0aWMgaW50ICBmdGRpX0ZUMjIzMkNfc3RhcnR1cAkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7Ci1zdGF0aWMgaW50ICBmdGRpX1VTQl9VSVJUX3N0YXJ0dXAJKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIGludCAgZnRkaV9IRV9USVJBMV9zdGFydHVwCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKK3N0YXRpYyBpbnQgIGZ0ZGlfc2lvX3Byb2JlCShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOworc3RhdGljIGludCAgZnRkaV9zaW9fYXR0YWNoCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgdm9pZCBmdGRpX3NodXRkb3duCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgaW50ICBmdGRpX29wZW4JCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwogc3RhdGljIHZvaWQgZnRkaV9jbG9zZQkJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CkBAIC03MzMsMTQgKzUxNSwxNiBAQAogc3RhdGljIF9fdTMyIGZ0ZGlfMjMyYm1fYmF1ZF9iYXNlX3RvX2Rpdmlzb3IgKGludCBiYXVkLCBpbnQgYmFzZSk7CiBzdGF0aWMgX191MzIgZnRkaV8yMzJibV9iYXVkX3RvX2Rpdmlzb3IgKGludCBiYXVkKTsKIAotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfU0lPX2RldmljZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX3Npb19kZXZpY2UgPSB7CiAJLm93bmVyID0JCVRISVNfTU9EVUxFLAotCS5uYW1lID0JCQkiRlRESSBTSU8iLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV9zaW8sCisJLm5hbWUgPQkJCSJGVERJIFVTQiBTZXJpYWwgRGV2aWNlIiwKKwkuc2hvcnRfbmFtZSA9CQkiZnRkaV9zaW8iLAorCS5pZF90YWJsZSA9CQlpZF90YWJsZV9jb21iaW5lZCwKIAkubnVtX2ludGVycnVwdF9pbiA9CTAsCiAJLm51bV9idWxrX2luID0JCTEsCiAJLm51bV9idWxrX291dCA9CQkxLAogCS5udW1fcG9ydHMgPQkJMSwKKwkucHJvYmUgPQkJZnRkaV9zaW9fcHJvYmUsCiAJLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKIAkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKIAkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKQEAgLTc1NSwxNDMgKzUzOSwxMCBAQAogCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAogCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAogCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCi0JLmF0dGFjaCA9CQlmdGRpX1NJT19zdGFydHVwLAorCS5hdHRhY2ggPQkJZnRkaV9zaW9fYXR0YWNoLAogCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAogfTsKIAotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfOFUyMzJBTV9kZXZpY2UgPSB7Ci0JLm93bmVyID0JCVRISVNfTU9EVUxFLAotCS5uYW1lID0JCQkiRlRESSA4VTIzMkFNIENvbXBhdGlibGUiLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV84VTIzMkFNLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCi0JLm51bV9wb3J0cyA9CQkxLAotCS5vcGVuID0JCQlmdGRpX29wZW4sCi0JLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCi0JLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPQkJZnRkaV91bnRocm90dGxlLAotCS53cml0ZSA9CQlmdGRpX3dyaXRlLAotCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0JZnRkaV9jaGFyc19pbl9idWZmZXIsCi0JLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAotCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAotCS50aW9jbWdldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21nZXQsCi0JLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKLQkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKLQkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKLQkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAotCS5hdHRhY2ggPQkJZnRkaV84VTIzMkFNX3N0YXJ0dXAsCi0JLnNodXRkb3duID0JCWZ0ZGlfc2h1dGRvd24sCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZGV2aWNlX3R5cGUgZnRkaV9GVDIzMkJNX2RldmljZSA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJGVERJIEZUMjMyQk0gQ29tcGF0aWJsZSIsCi0JLmlkX3RhYmxlID0JCWlkX3RhYmxlX0ZUMjMyQk0sCi0JLm51bV9pbnRlcnJ1cHRfaW4gPQkwLAotCS5udW1fYnVsa19pbiA9CQkxLAotCS5udW1fYnVsa19vdXQgPQkJMSwKLQkubnVtX3BvcnRzID0JCTEsCi0JLm9wZW4gPQkJCWZ0ZGlfb3BlbiwKLQkuY2xvc2UgPQkJZnRkaV9jbG9zZSwKLQkudGhyb3R0bGUgPQkJZnRkaV90aHJvdHRsZSwKLQkudW50aHJvdHRsZSA9CQlmdGRpX3VudGhyb3R0bGUsCi0JLndyaXRlID0JCWZ0ZGlfd3JpdGUsCi0JLndyaXRlX3Jvb20gPQkJZnRkaV93cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXIgPQlmdGRpX2NoYXJzX2luX2J1ZmZlciwKLQkucmVhZF9idWxrX2NhbGxiYWNrID0JZnRkaV9yZWFkX2J1bGtfY2FsbGJhY2ssCi0JLndyaXRlX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3dyaXRlX2J1bGtfY2FsbGJhY2ssCi0JLnRpb2NtZ2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbWdldCwKLQkudGlvY21zZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2Ntc2V0LAotCS5pb2N0bCA9CQlmdGRpX2lvY3RsLAotCS5zZXRfdGVybWlvcyA9CQlmdGRpX3NldF90ZXJtaW9zLAotCS5icmVha19jdGwgPQkJZnRkaV9icmVha19jdGwsCi0JLmF0dGFjaCA9CQlmdGRpX0ZUMjMyQk1fc3RhcnR1cCwKLQkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX0ZUMjIzMkNfZGV2aWNlID0gewotCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIkZUREkgRlQyMjMyQyBDb21wYXRpYmxlIiwKLQkuaWRfdGFibGUgPQkJaWRfdGFibGVfRlQyMjMyQywKLQkubnVtX2ludGVycnVwdF9pbiA9CTAsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJZnRkaV9vcGVuLAotCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAotCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAotCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKLQkud3JpdGUgPQkJZnRkaV93cml0ZSwKLQkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKLQkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCi0JLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCi0JLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKLQkuYXR0YWNoID0JCWZ0ZGlfRlQyMjMyQ19zdGFydHVwLAotCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RldmljZV90eXBlIGZ0ZGlfVVNCX1VJUlRfZGV2aWNlID0gewotCS5vd25lciA9CQlUSElTX01PRFVMRSwKLQkubmFtZSA9CQkJIlVTQi1VSVJUIEluZnJhcmVkIFRyYW5jZWl2ZXIiLAotCS5pZF90YWJsZSA9CQlpZF90YWJsZV9VU0JfVUlSVCwKLQkubnVtX2ludGVycnVwdF9pbiA9CTAsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJZnRkaV9vcGVuLAotCS5jbG9zZSA9CQlmdGRpX2Nsb3NlLAotCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAotCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKLQkud3JpdGUgPQkJZnRkaV93cml0ZSwKLQkud3JpdGVfcm9vbSA9CQlmdGRpX3dyaXRlX3Jvb20sCi0JLmNoYXJzX2luX2J1ZmZlciA9CWZ0ZGlfY2hhcnNfaW5fYnVmZmVyLAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlmdGRpX3JlYWRfYnVsa19jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CWZ0ZGlfd3JpdGVfYnVsa19jYWxsYmFjaywKLQkudGlvY21nZXQgPSAgICAgICAgICAgICBmdGRpX3Rpb2NtZ2V0LAotCS50aW9jbXNldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21zZXQsCi0JLmlvY3RsID0JCWZ0ZGlfaW9jdGwsCi0JLnNldF90ZXJtaW9zID0JCWZ0ZGlfc2V0X3Rlcm1pb3MsCi0JLmJyZWFrX2N0bCA9CQlmdGRpX2JyZWFrX2N0bCwKLQkuYXR0YWNoID0JCWZ0ZGlfVVNCX1VJUlRfc3RhcnR1cCwKLQkuc2h1dGRvd24gPQkJZnRkaV9zaHV0ZG93biwKLX07Ci0KLS8qIFRoZSBUSVJBMSBpcyBiYXNlZCBvbiBhICBGVDIzMkJNIHdoaWNoIHJlcXVpcmVzIGEgZml4ZWQgYmF1ZCByYXRlIG9mIDEwMDAwMAotICogYW5kIHdoaWNoIHJlcXVpcmVzIFJUUy1DVFMgdG8gYmUgZW5hYmxlZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgdXNiX3NlcmlhbF9kZXZpY2VfdHlwZSBmdGRpX0hFX1RJUkExX2RldmljZSA9IHsKLQkub3duZXIgPQkJVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJCSJIb21lLUVsZWN0cm9uaWNzIFRJUkEtMSBJUiBUcmFuc2NlaXZlciIsCi0JLmlkX3RhYmxlID0JCWlkX3RhYmxlX0hFX1RJUkExLAotCS5udW1faW50ZXJydXB0X2luID0JMCwKLQkubnVtX2J1bGtfaW4gPQkJMSwKLQkubnVtX2J1bGtfb3V0ID0JCTEsCi0JLm51bV9wb3J0cyA9CQkxLAotCS5vcGVuID0JCQlmdGRpX29wZW4sCi0JLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCi0JLnRocm90dGxlID0JCWZ0ZGlfdGhyb3R0bGUsCi0JLnVudGhyb3R0bGUgPQkJZnRkaV91bnRocm90dGxlLAotCS53cml0ZSA9CQlmdGRpX3dyaXRlLAotCS53cml0ZV9yb29tID0JCWZ0ZGlfd3JpdGVfcm9vbSwKLQkuY2hhcnNfaW5fYnVmZmVyID0JZnRkaV9jaGFyc19pbl9idWZmZXIsCi0JLnJlYWRfYnVsa19jYWxsYmFjayA9CWZ0ZGlfcmVhZF9idWxrX2NhbGxiYWNrLAotCS53cml0ZV9idWxrX2NhbGxiYWNrID0JZnRkaV93cml0ZV9idWxrX2NhbGxiYWNrLAotCS50aW9jbWdldCA9ICAgICAgICAgICAgIGZ0ZGlfdGlvY21nZXQsCi0JLnRpb2Ntc2V0ID0gICAgICAgICAgICAgZnRkaV90aW9jbXNldCwKLQkuaW9jdGwgPQkJZnRkaV9pb2N0bCwKLQkuc2V0X3Rlcm1pb3MgPQkJZnRkaV9zZXRfdGVybWlvcywKLQkuYnJlYWtfY3RsID0JCWZ0ZGlfYnJlYWtfY3RsLAotCS5hdHRhY2ggPQkJZnRkaV9IRV9USVJBMV9zdGFydHVwLAotCS5zaHV0ZG93biA9CQlmdGRpX3NodXRkb3duLAotfTsKLQotCiAKICNkZWZpbmUgV0RSX1RJTUVPVVQgNTAwMCAvKiBkZWZhdWx0IHVyYiB0aW1lb3V0ICovCiAKQEAgLTEyMTIsNiArODYzLDU5IEBACiB9IC8qIHNldF9zZXJpYWxfaW5mbyAqLwogCiAKKy8qIERldGVybWluZSB0eXBlIG9mIEZUREkgY2hpcCBiYXNlZCBvbiBVU0IgY29uZmlnIGFuZCBkZXNjcmlwdG9yLiAqLworc3RhdGljIHZvaWQgZnRkaV9kZXRlcm1pbmVfdHlwZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHNlcmlhbC0+ZGV2OworCXVuc2lnbmVkIHZlcnNpb247CisJdW5zaWduZWQgaW50ZXJmYWNlczsKKworCS8qIEFzc3VtZSBpdCBpcyBub3QgdGhlIG9yaWdpbmFsIFNJTyBkZXZpY2UgZm9yIG5vdy4gKi8KKwlwcml2LT5iYXVkX2Jhc2UgPSA0ODAwMDAwMCAvIDE2OworCXByaXYtPndyaXRlX29mZnNldCA9IDA7CisKKwl2ZXJzaW9uID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOworCWludGVyZmFjZXMgPSB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7CisJZGJnKCIlczogYmNkRGV2aWNlID0gMHgleCwgYk51bUludGVyZmFjZXMgPSAldSIsIF9fRlVOQ1RJT05fXywKKwkJCXZlcnNpb24sIGludGVyZmFjZXMpOworCWlmIChpbnRlcmZhY2VzID4gMSkgeworCQlpbnQgaW50ZXI7CisKKwkJLyogTXVsdGlwbGUgaW50ZXJmYWNlcy4gIEFzc3VtZSBGVDIyMzJDLiAqLworCQlwcml2LT5jaGlwX3R5cGUgPSBGVDIyMzJDOworCQkvKiBEZXRlcm1pbmUgaW50ZXJmYWNlIGNvZGUuICovCisJCWludGVyID0gc2VyaWFsLT5pbnRlcmZhY2UtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwkJaWYgKGludGVyID09IDApIHsKKwkJCXByaXYtPmludGVyZmFjZSA9IFBJVF9TSU9BOworCQl9IGVsc2UgeworCQkJcHJpdi0+aW50ZXJmYWNlID0gUElUX1NJT0I7CisJCX0KKwkJLyogQk0tdHlwZSBkZXZpY2VzIGhhdmUgYSBidWcgd2hlcmUgYmNkRGV2aWNlIGdldHMgc2V0CisJCSAqIHRvIDB4MjAwIHdoZW4gaVNlcmlhbE51bWJlciBpcyAwLiAgKi8KKwkJaWYgKHZlcnNpb24gPCAweDUwMCkgeworCQkJZGJnKCIlczogc29tZXRoaW5nIGZpc2h5IC0gYmNkRGV2aWNlIHRvbyBsb3cgZm9yIG11bHRpLWludGVyZmFjZSBkZXZpY2UiLAorCQkJCQlfX0ZVTkNUSU9OX18pOworCQl9CisJfSBlbHNlIGlmICh2ZXJzaW9uIDwgMHgyMDApIHsKKwkJLyogT2xkIGRldmljZS4gIEFzc3VtZSBpdHMgdGhlIG9yaWdpbmFsIFNJTy4gKi8KKwkJcHJpdi0+Y2hpcF90eXBlID0gU0lPOworCQlwcml2LT5iYXVkX2Jhc2UgPSAxMjAwMDAwMCAvIDE2OworCQlwcml2LT53cml0ZV9vZmZzZXQgPSAxOworCX0gZWxzZSBpZiAodmVyc2lvbiA8IDB4NDAwKSB7CisJCS8qIEFzc3VtZSBpdHMgYW4gRlQ4VTIzMkFNIChvciBGVDhVMjQ1QU0pICovCisJCS8qIChJdCBtaWdodCBiZSBhIEJNIGJlY2F1c2Ugb2YgdGhlIGlTZXJpYWxOdW1iZXIgYnVnLAorCQkgKiBidXQgaXQgd2lsbCBzdGlsbCB3b3JrIGFzIGFuIEFNIGRldmljZS4pICovCisJCXByaXYtPmNoaXBfdHlwZSA9IEZUOFUyMzJBTTsKKwl9IGVsc2UgeworCQkvKiBBc3N1bWUgaXRzIGFuIEZUMjMyQk0gKG9yIEZUMjQ1Qk0pICovCisJCXByaXYtPmNoaXBfdHlwZSA9IEZUMjMyQk07CisJfQorCWluZm8oIkRldGVjdGVkICVzIiwgZnRkaV9jaGlwX25hbWVbcHJpdi0+Y2hpcF90eXBlXSk7Cit9CisKKwogLyoKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU3lzZnMgQXR0cmlidXRlCkBAIC0xMzU1LDEyICsxMDU5LDIwIEBACiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwogCi0vKiBDb21tb24gc3RhcnR1cCBzdWJyb3V0aW5lICovCi0vKiBDYWxsZWQgZnJvbSBmdGRpX1NJT19zdGFydHVwLCBldGMuICovCi1zdGF0aWMgaW50IGZ0ZGlfY29tbW9uX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCisvKiBQcm9iZSBmdW5jdGlvbiB0byBjaGVjayBmb3Igc3BlY2lhbCBkZXZpY2VzICovCitzdGF0aWMgaW50IGZ0ZGlfc2lvX3Byb2JlIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJdXNiX3NldF9zZXJpYWxfZGF0YShzZXJpYWwsICh2b2lkICopaWQtPmRyaXZlcl9pbmZvKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qIGF0dGFjaCBzdWJyb3V0aW5lICovCitzdGF0aWMgaW50IGZ0ZGlfc2lvX2F0dGFjaCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CisJc3RydWN0IGZ0ZGlfc2lvX3F1aXJrICpxdWlyazsKIAkKIAlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwogCkBAIC0xNDAwLDE1MCArMTExMiw0OSBAQAogCXBvcnQtPmJ1bGtfb3V0X2J1ZmZlciA9IE5VTEw7CiAKIAl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdLCBwcml2KTsKKworCWZ0ZGlfZGV0ZXJtaW5lX3R5cGUgKHNlcmlhbC0+cG9ydFswXSk7CisJY3JlYXRlX3N5c2ZzX2F0dHJzKHNlcmlhbCk7CisKKwkvKiBDaGVjayBmb3IgZGV2aWNlIHJlcXVpcmluZyBzcGVjaWFsIHNldCB1cC4gKi8KKwlxdWlyayA9IChzdHJ1Y3QgZnRkaV9zaW9fcXVpcmsgKil1c2JfZ2V0X3NlcmlhbF9kYXRhKHNlcmlhbCk7CisJaWYgKHF1aXJrICYmIHF1aXJrLT5zZXR1cCkgeworCQlxdWlyay0+c2V0dXAoc2VyaWFsKTsKKwl9CiAJCiAJcmV0dXJuICgwKTsKLX0KK30gLyogZnRkaV9zaW9fYXR0YWNoICovCiAKIAotLyogU3RhcnR1cCBmb3IgdGhlIFNJTyBjaGlwICovCisvKiBTZXR1cCBmb3IgdGhlIFVTQi1VSVJUIGRldmljZSwgd2hpY2ggcmVxdWlyZXMgaGFyZHdpcmVkCisgKiBiYXVkcmF0ZSAoMzg0MDAgZ2V0cyBtYXBwZWQgdG8gMzEyNTAwKSAqLwogLyogQ2FsbGVkIGZyb20gdXNic2VyaWFsOnNlcmlhbF9wcm9iZSAqLwotc3RhdGljIGludCBmdGRpX1NJT19zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQorc3RhdGljIHZvaWQgZnRkaV9VU0JfVUlSVF9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwotCWludCBlcnI7CiAKIAlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwogCi0JZXJyID0gZnRkaV9jb21tb25fc3RhcnR1cChzZXJpYWwpOwotCWlmIChlcnIpewotCQlyZXR1cm4gKGVycik7Ci0JfQotCi0JcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwotCXByaXYtPmNoaXBfdHlwZSA9IFNJTzsKLQlwcml2LT5iYXVkX2Jhc2UgPSAxMjAwMDAwMCAvIDE2OwotCXByaXYtPndyaXRlX29mZnNldCA9IDE7Ci0JCi0JcmV0dXJuICgwKTsKLX0KLQotLyogU3RhcnR1cCBmb3IgdGhlIDhVMjMyQU0gY2hpcCAqLwotLyogQ2FsbGVkIGZyb20gdXNic2VyaWFsOnNlcmlhbF9wcm9iZSAqLwotc3RhdGljIGludCBmdGRpXzhVMjMyQU1fc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsgLyogZnRkaV84VTIzMkFNX3N0YXJ0dXAgKi8KLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwotCWludCBlcnI7Ci0KLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwotCWVyciA9IGZ0ZGlfY29tbW9uX3N0YXJ0dXAoc2VyaWFsKTsKLQlpZiAoZXJyKXsKLQkJcmV0dXJuIChlcnIpOwotCX0KLQotCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0WzBdKTsKLQlwcml2LT5jaGlwX3R5cGUgPSBGVDhVMjMyQU07Ci0JcHJpdi0+YmF1ZF9iYXNlID0gNDgwMDAwMDAgLyAyOyAvKiBXb3VsZCBiZSAvIDE2LCBidXQgRlRESSBzdXBwb3J0cyAwLjEyNSwgMC4yNSBhbmQgMC41IGRpdmlzb3IgZnJhY3Rpb25zISAqLwotCQotCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOwotCQotCXJldHVybiAoMCk7Ci19IC8qIGZ0ZGlfOFUyMzJBTV9zdGFydHVwICovCi0KLS8qIFN0YXJ0dXAgZm9yIHRoZSBGVDIzMkJNIGNoaXAgKi8KLS8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV9GVDIzMkJNX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCi17IC8qIGZ0ZGlfRlQyMzJCTV9zdGFydHVwICovCi0Jc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdjsKLQlpbnQgZXJyOwotCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpX2NvbW1vbl9zdGFydHVwKHNlcmlhbCk7Ci0JaWYgKGVycil7Ci0JCXJldHVybiAoZXJyKTsKLQl9Ci0KLQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Ci0JcHJpdi0+Y2hpcF90eXBlID0gRlQyMzJCTTsKLQlwcml2LT5iYXVkX2Jhc2UgPSA0ODAwMDAwMCAvIDI7IC8qIFdvdWxkIGJlIC8gMTYsIGJ1dCBGVDIzMkJNIHN1cHBvcnRzIG11bHRpcGxlIG9mIDAuMTI1IGRpdmlzb3IgZnJhY3Rpb25zISAqLwotCQotCWNyZWF0ZV9zeXNmc19hdHRycyhzZXJpYWwpOwotCi0JcmV0dXJuICgwKTsKLX0gLyogZnRkaV9GVDIzMkJNX3N0YXJ0dXAgKi8KLQotLyogU3RhcnR1cCBmb3IgdGhlIEZUMjIzMkMgY2hpcCAqLwotLyogQ2FsbGVkIGZyb20gdXNic2VyaWFsOnNlcmlhbF9wcm9iZSAqLwotc3RhdGljIGludCBmdGRpX0ZUMjIzMkNfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsgLyogZnRkaV9GVDIyMzJDX3N0YXJ0dXAgKi8KLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwotCWludCBlcnI7Ci0JaW50IGludGVyOwotCi0JZGJnKCIlcyIsX19GVU5DVElPTl9fKTsKLQllcnIgPSBmdGRpX2NvbW1vbl9zdGFydHVwKHNlcmlhbCk7Ci0JaWYgKGVycil7Ci0JCXJldHVybiAoZXJyKTsKLQl9Ci0KLQlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7Ci0JcHJpdi0+Y2hpcF90eXBlID0gRlQyMjMyQzsKLQlpbnRlciA9IHNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7Ci0KLQlpZiAoaW50ZXIpIHsKLQkJcHJpdi0+aW50ZXJmYWNlID0gUElUX1NJT0I7Ci0JfQotCWVsc2UgIHsKLQkJcHJpdi0+aW50ZXJmYWNlID0gUElUX1NJT0E7Ci0JfQotCXByaXYtPmJhdWRfYmFzZSA9IDQ4MDAwMDAwIC8gMjsgLyogV291bGQgYmUgLyAxNiwgYnV0IEZUMjIzMkMgc3VwcG9ydHMgbXVsdGlwbGUgb2YgMC4xMjUgZGl2aXNvciBmcmFjdGlvbnMhICovCi0JCi0JY3JlYXRlX3N5c2ZzX2F0dHJzKHNlcmlhbCk7Ci0KLQlyZXR1cm4gKDApOwotfSAvKiBmdGRpX0ZUMjIzMkNfc3RhcnR1cCAqLwotCi0vKiBTdGFydHVwIGZvciB0aGUgVVNCLVVJUlQgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQgYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDMxMjUwMCkgKi8KLS8qIENhbGxlZCBmcm9tIHVzYnNlcmlhbDpzZXJpYWxfcHJvYmUgKi8KLXN0YXRpYyBpbnQgZnRkaV9VU0JfVUlSVF9zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoteyAvKiBmdGRpX1VTQl9VSVJUX3N0YXJ0dXAgKi8KLQlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwotCWludCBlcnI7Ci0KLQlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwotCWVyciA9IGZ0ZGlfOFUyMzJBTV9zdGFydHVwKHNlcmlhbCk7Ci0JaWYgKGVycil7Ci0JCXJldHVybiAoZXJyKTsKLQl9Ci0KIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7CiAJcHJpdi0+ZmxhZ3MgfD0gQVNZTkNfU1BEX0NVU1Q7CiAJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSA3NzsKIAlwcml2LT5mb3JjZV9iYXVkID0gQjM4NDAwOwotCQotCXJldHVybiAoMCk7Ci19IC8qIGZ0ZGlfVVNCX1VJUlRfc3RhcnR1cCAqLworfSAvKiBmdGRpX1VTQl9VSVJUX3NldHVwICovCiAKLS8qIFN0YXJ0dXAgZm9yIHRoZSBIRS1USVJBMSBkZXZpY2UsIHdoaWNoIHJlcXVpcmVzIGhhcmR3aXJlZAotICogYmF1ZHJhdGUgKDM4NDAwIGdldHMgbWFwcGVkIHRvIDEwMDAwMCkgKi8KLXN0YXRpYyBpbnQgZnRkaV9IRV9USVJBMV9zdGFydHVwIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoteyAvKiBmdGRpX0hFX1RJUkExX3N0YXJ0dXAgKi8KKy8qIFNldHVwIGZvciB0aGUgSEUtVElSQTEgZGV2aWNlLCB3aGljaCByZXF1aXJlcyBoYXJkd2lyZWQKKyAqIGJhdWRyYXRlICgzODQwMCBnZXRzIG1hcHBlZCB0byAxMDAwMDApIGFuZCBSVFMtQ1RTIGVuYWJsZWQuICAqLworc3RhdGljIHZvaWQgZnRkaV9IRV9USVJBMV9zZXR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwotCWludCBlcnI7CiAKIAlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwotCWVyciA9IGZ0ZGlfRlQyMzJCTV9zdGFydHVwKHNlcmlhbCk7Ci0JaWYgKGVycil7Ci0JCXJldHVybiAoZXJyKTsKLQl9CiAKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFswXSk7CiAJcHJpdi0+ZmxhZ3MgfD0gQVNZTkNfU1BEX0NVU1Q7CiAJcHJpdi0+Y3VzdG9tX2Rpdmlzb3IgPSAyNDA7CiAJcHJpdi0+Zm9yY2VfYmF1ZCA9IEIzODQwMDsKIAlwcml2LT5mb3JjZV9ydHNjdHMgPSAxOwotCQotCXJldHVybiAoMCk7Ci19IC8qIGZ0ZGlfSEVfVElSQTFfc3RhcnR1cCAqLworfSAvKiBmdGRpX0hFX1RJUkExX3NldHVwICovCiAKIAogLyogZnRkaV9zaHV0ZG93biBpcyBjYWxsZWQgZnJvbSB1c2JzZXJpYWw6dXNiX3NlcmlhbF9kaXNjb25uZWN0IApAQCAtMjM2Nyw2MCArMTk3OCwxMSBAQAogewogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlpbnQgIHJldCwgbWFzazsKLQkKIAlkYmcoIiVzIGNtZCAweCUwNHgiLCBfX0ZVTkNUSU9OX18sIGNtZCk7CiAKIAkvKiBCYXNlZCBvbiBjb2RlIGZyb20gYWNtLmMgYW5kIG90aGVycyAqLwogCXN3aXRjaCAoY21kKSB7CiAKLQljYXNlIFRJT0NNQklTOiAvKiB0dXJucyBvbiAoU2V0cykgdGhlIGxpbmVzIGFzIHNwZWNpZmllZCBieSB0aGUgbWFzayAqLwotCQlkYmcoIiVzIFRJT0NNQklTIiwgX19GVU5DVElPTl9fKTsKLSAJICAgICAgICBpZiAoZ2V0X3VzZXIobWFzaywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLSAgCSAgICAgICAgaWYgKG1hc2sgJiBUSU9DTV9EVFIpewotCQkJaWYgKChyZXQgPSBzZXRfZHRyKHBvcnQsIEhJR0gpKSA8IDApIHsKLQkJCQllcnIoIlVyYiB0byBzZXQgRFRSIGZhaWxlZCIpOwotCQkJCXJldHVybihyZXQpOwotCQkJfQotCQl9Ci0JCWlmIChtYXNrICYgVElPQ01fUlRTKSB7Ci0JCQlpZiAoKHJldCA9IHNldF9ydHMocG9ydCwgSElHSCkpIDwgMCl7Ci0JCQkJZXJyKCJVcmIgdG8gc2V0IFJUUyBmYWlsZWQiKTsKLQkJCQlyZXR1cm4ocmV0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4oMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUSU9DTUJJQzogLyogdHVybnMgb2ZmIChDbGVhcnMpIHRoZSBsaW5lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIG1hc2sgKi8KLQkJZGJnKCIlcyBUSU9DTUJJQyIsIF9fRlVOQ1RJT05fXyk7Ci0gCSAgICAgICAgaWYgKGdldF91c2VyKG1hc2ssICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0gIAkgICAgICAgIGlmIChtYXNrICYgVElPQ01fRFRSKXsKLQkJCWlmICgocmV0ID0gc2V0X2R0cihwb3J0LCBMT1cpKSA8IDApewotCQkJCWVycigiVXJiIHRvIHVuc2V0IERUUiBmYWlsZWQiKTsKLQkJCQlyZXR1cm4ocmV0KTsKLQkJCX0KLQkJfQkKLQkJaWYgKG1hc2sgJiBUSU9DTV9SVFMpIHsKLQkJCWlmICgocmV0ID0gc2V0X3J0cyhwb3J0LCBMT1cpKSA8IDApewotCQkJCWVycigiVXJiIHRvIHVuc2V0IFJUUyBmYWlsZWQiKTsKLQkJCQlyZXR1cm4ocmV0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4oMCk7Ci0JCWJyZWFrOwotCi0JCS8qCi0JCSAqIEkgaGFkIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgVENTRVR7QSxTfXssRixXfSBhbmQKLQkJICogVENHRVR7QSxTfSBoZXJlIHNlcGFyYXRlbHksIGhvd2V2ZXIgd2hlbiB0ZXN0aW5nIEkKLQkJICogZm91bmQgdGhhdCB0aGUgaGlnaGVyIGxheWVycyBhY3R1YWxseSBkbyB0aGUgdGVybWlvcwotCQkgKiBjb252ZXJzaW9ucyB0aGVtc2VsdmVzIGFuZCBwYXNzIHRoZSBjYWxsIG9udG8KLQkJICogZnRkaV9zaW9fc2V0X3Rlcm1pb3MuIAotCQkgKgotCQkgKi8KLQogCWNhc2UgVElPQ0dTRVJJQUw6IC8qIGdldHMgc2VyaWFsIHBvcnQgZGF0YSAqLwogCQlyZXR1cm4gZ2V0X3NlcmlhbF9pbmZvKHBvcnQsIChzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKikgYXJnKTsKIApAQCAtMjUxNiwyNCArMjA3OCw5IEBACiAJaW50IHJldHZhbDsKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfU0lPX2RldmljZSk7CisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9zaW9fZGV2aWNlKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9TSU9fcmVnaXN0ZXI7Ci0JcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV84VTIzMkFNX2RldmljZSk7Ci0JaWYgKHJldHZhbCkKLQkJZ290byBmYWlsZWRfOFUyMzJBTV9yZWdpc3RlcjsKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZmdGRpX0ZUMjMyQk1fZGV2aWNlKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9GVDIzMkJNX3JlZ2lzdGVyOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfRlQyMjMyQ19kZXZpY2UpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZmFpbGVkX0ZUMjIzMkNfcmVnaXN0ZXI7Ci0JcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmZnRkaV9VU0JfVUlSVF9kZXZpY2UpOwotCWlmIChyZXR2YWwpCi0JCWdvdG8gZmFpbGVkX1VTQl9VSVJUX3JlZ2lzdGVyOwotCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmZ0ZGlfSEVfVElSQTFfZGV2aWNlKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGZhaWxlZF9IRV9USVJBMV9yZWdpc3RlcjsKKwkJZ290byBmYWlsZWRfc2lvX3JlZ2lzdGVyOwogCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmZnRkaV9kcml2ZXIpOwogCWlmIChyZXR2YWwpIAogCQlnb3RvIGZhaWxlZF91c2JfcmVnaXN0ZXI7CkBAIC0yNTQxLDE4ICsyMDg4LDggQEAKIAlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CiAJcmV0dXJuIDA7CiBmYWlsZWRfdXNiX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9IRV9USVJBMV9kZXZpY2UpOwotZmFpbGVkX0hFX1RJUkExX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9VU0JfVUlSVF9kZXZpY2UpOwotZmFpbGVkX1VTQl9VSVJUX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9GVDIyMzJDX2RldmljZSk7Ci1mYWlsZWRfRlQyMjMyQ19yZWdpc3RlcjoKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmZ0ZGlfRlQyMzJCTV9kZXZpY2UpOwotZmFpbGVkX0ZUMjMyQk1fcmVnaXN0ZXI6Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZmdGRpXzhVMjMyQU1fZGV2aWNlKTsKLWZhaWxlZF84VTIzMkFNX3JlZ2lzdGVyOgotCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmZnRkaV9TSU9fZGV2aWNlKTsKLWZhaWxlZF9TSU9fcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZmdGRpX3Npb19kZXZpY2UpOworZmFpbGVkX3Npb19yZWdpc3RlcjoKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC0yNTYzLDEyICsyMTAwLDcgQEAKIAlkYmcoIiVzIiwgX19GVU5DVElPTl9fKTsKIAogCXVzYl9kZXJlZ2lzdGVyICgmZnRkaV9kcml2ZXIpOwotCXVzYl9zZXJpYWxfZGVyZWdpc3RlciAoJmZ0ZGlfSEVfVElSQTFfZGV2aWNlKTsKLQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIgKCZmdGRpX1VTQl9VSVJUX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9GVDIyMzJDX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9GVDIzMkJNX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV84VTIzMkFNX2RldmljZSk7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmZnRkaV9TSU9fZGV2aWNlKTsKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIgKCZmdGRpX3Npb19kZXZpY2UpOwogCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IDk5MjE0YWEuLmRkZGU1ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtMTc0LDEwICsxNzQsMTQgQEAKIAogCS8qIG9ubHkgZG8gc29tZXRoaW5nIGlmIHdlIGhhdmUgYSBidWxrIG91dCBlbmRwb2ludCAqLwogCWlmIChzZXJpYWwtPm51bV9idWxrX291dCkgewotCQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CisJCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisJCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgeworCQkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCQkJZGJnKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlyZXR1cm4gKDApOworCQkJcmV0dXJuIDA7CiAJCX0KKwkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOworCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAkJY291bnQgPSAoY291bnQgPiBwb3J0LT5idWxrX291dF9zaXplKSA/IHBvcnQtPmJ1bGtfb3V0X3NpemUgOiBjb3VudDsKIApAQCAtMTk1LDE3ICsxOTksMjAgQEAKIAkJCQkgICAgIHVzYl9zZXJpYWxfZ2VuZXJpY193cml0ZV9idWxrX2NhbGxiYWNrKSwgcG9ydCk7CiAKIAkJLyogc2VuZCB0aGUgZGF0YSBvdXQgdGhlIGJ1bGsgcG9ydCAqLworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDE7CiAJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyZXN1bHQpCisJCWlmIChyZXN1bHQpIHsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwotCQllbHNlCisJCQkvKiBkb24ndCBoYXZlIHRvIGdyYWIgdGhlIGxvY2sgaGVyZSwgYXMgd2Ugd2lsbCByZXRyeSBpZiAhPSAwICovCisJCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CisJCX0gZWxzZQogCQkJcmVzdWx0ID0gY291bnQ7CiAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKIAkvKiBubyBidWxrIG91dCwgc28gcmV0dXJuIDAgYnl0ZXMgd3JpdHRlbiAqLwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIGludCB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGVfcm9vbSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKQEAgLTIxNCw5ICsyMjEsOSBAQAogCWludCByb29tID0gMDsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwotCQorCiAJaWYgKHNlcmlhbC0+bnVtX2J1bGtfb3V0KSB7Ci0JCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCisJCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJCXJvb20gPSBwb3J0LT5idWxrX291dF9zaXplOwogCX0KIApAQCAtMjMyLDcgKzIzOSw3IEBACiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CiAKIAlpZiAoc2VyaWFsLT5udW1fYnVsa19vdXQpIHsKLQkJaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5KQogCQkJY2hhcnMgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7CiAJfQogCkBAIC0yOTEsNiArMjk4LDcgQEAKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCWlmICh1cmItPnN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKaW5kZXggM2JkNjljNC4uYzA1YzJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCkBAIC04MTgsMTEgKzgxOCw2IEBACiAJc3RydWN0IGlwYXFfcGFja2V0CSpwa3QsICp0bXA7CiAJc3RydWN0IHVyYgkJKnVyYiA9IHBvcnQtPndyaXRlX3VyYjsKIAotCWlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwotCQllcnIoIiVzIC0gZmx1c2hpbmcgd2hpbGUgdXJiIGlzIGFjdGl2ZSAhIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuOwotCX0KIAlyb29tID0gVVJCREFUQV9TSVpFOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwa3QsIHRtcCwgJnByaXYtPnF1ZXVlLCBsaXN0KSB7CiAJCWNvdW50ID0gbWluKHJvb20sIChpbnQpKHBrdC0+bGVuIC0gcGt0LT53cml0dGVuKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKaW5kZXggMTExMDVkNy4uODVlMjQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYwpAQCAtMzk5LDE2ICszOTksMjEgQEAKIAkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAwOwogCX0KLQkKLQkvKiBSYWN5IGFuZCBicm9rZW4sIEZJWE1FIHByb3Blcmx5ISAqLwotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgeworCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gMDsKKwl9CisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOworCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAogCWNvdW50ID0gbWluKGNvdW50LCBwb3J0LT5idWxrX291dF9zaXplKTsKIAltZW1jcHkocG9ydC0+YnVsa19vdXRfYnVmZmVyLCBidWYsIGNvdW50KTsKIAogCWRiZygiJXMgY291bnQgbm93OiVkIiwgX19GVU5DVElPTl9fLCBjb3VudCk7Ci0JCisKIAl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT53cml0ZV91cmIsIGRldiwKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKGRldiwgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKSwKIAkJCSAgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsCkBAIC00MTgsNiArNDIzLDcgQEAKIAogCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJldCAhPSAwKSB7CisJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAkJZGJnKCIlcyAtIHVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZCB3aXRoIGVycm9yID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCmluZGV4IDU5ZjIzNGQuLjkzN2IyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKQEAgLTM0MSwxMCArMzQxLDE0IEBACiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAwOwogCi0JaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIDA7CiAJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAl0cmFuc2Zlcl9idWZmZXIgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAl0cmFuc2Zlcl9zaXplID0gbWluKGNvdW50LCBwb3J0LT5idWxrX291dF9zaXplIC0gMSk7CkBAIC0zNzQsOSArMzc4LDEwIEBACiAJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9aRVJPX1BBQ0tFVDsKIAogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXN1bHQpCisJaWYgKHJlc3VsdCkgeworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwotCWVsc2UKKwl9IGVsc2UKIAkJcmVzdWx0ID0gdHJhbnNmZXJfc2l6ZTsKIAogCXJldHVybiByZXN1bHQ7CkBAIC0zODcsNyArMzkyLDggQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKil1cmItPmNvbnRleHQ7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQkKKworCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlpZiAodXJiLT5zdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggN2ZkMGFhOS4uNjM1YzM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTUyMCw5ICs1MjAsMTMgQEAKIAkgICB0aGUgVFggdXJiIGlzIGluLWZsaWdodCAod2FpdCB1bnRpbCBpdCBjb21wbGV0ZXMpCiAJICAgdGhlIGRldmljZSBpcyBmdWxsICh3YWl0IHVudGlsIGl0IHNheXMgdGhlcmUgaXMgcm9vbSkKIAkqLwotCWlmIChwb3J0LT53cml0ZV91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MgfHwgcHJpdi0+dHhfdGhyb3R0bGVkICkgewotCQlyZXR1cm4oIDAgKTsKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSB8fCBwcml2LT50eF90aHJvdHRsZWQpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCQlyZXR1cm4gMDsKIAl9CisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOworCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAogCS8qIEF0IHRoaXMgcG9pbnQgdGhlIFVSQiBpcyBpbiBvdXIgY29udHJvbCwgbm9ib2R5IGVsc2UgY2FuIHN1Ym1pdCBpdAogCSAgIGFnYWluICh0aGUgb25seSBzdWRkZW4gdHJhbnNpdGlvbiB3YXMgdGhlIG9uZSBmcm9tIEVJTlBST0dSRVNTIHRvCkBAIC01NzAsNyArNTc0LDcgQEAKIAkJbWVtY3B5IChwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwgYnVmLCBjb3VudCk7CiAJCS8qIHNlbmQgdGhlIGRhdGEgb3V0IHRoZSBidWxrIHBvcnQgKi8KIAkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7Ci0JCQorCiAJCXByaXYtPnR4X3Jvb20gLT0gY291bnQ7CiAKIAkJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKQEAgLTU5Myw2ICs1OTcsOCBAQAogCiAJcmMgPSBjb3VudDsKIGV4aXQ6CisJaWYgKHJjIDwgMCkKKwkJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCXJldHVybiByYzsKIH0KIApAQCAtNjAyLDYgKzYwOCw3IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwogCXN0cnVjdCBrZXlzcGFuX3BkYV9wcml2YXRlICpwcml2OwogCisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAwOwogCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAkvKiBxdWV1ZSB1cCBhIHdha2V1cCBhdCBzY2hlZHVsZXIgdGltZSAqLwpAQCAtNjI2LDEyICs2MzMsMTIgQEAKIHN0YXRpYyBpbnQga2V5c3Bhbl9wZGFfY2hhcnNfaW5fYnVmZmVyIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBrZXlzcGFuX3BkYV9wcml2YXRlICpwcml2OwotCQorCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQkKKwogCS8qIHdoZW4gdGhyb3R0bGVkLCByZXR1cm4gYXQgbGVhc3QgV0FLRVVQX0NIQVJTIHRvIHRlbGwgc2VsZWN0KCkgKHZpYQogCSAgIG5fdHR5LmM6bm9ybWFsX3BvbGwoKSApIHRoYXQgd2UncmUgbm90IHdyaXRlYWJsZS4gKi8KLQlpZiggcG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTIHx8IHByaXYtPnR4X3Rocm90dGxlZCApCisJaWYgKHBvcnQtPndyaXRlX3VyYl9idXN5IHx8IHByaXYtPnR4X3Rocm90dGxlZCkKIAkJcmV0dXJuIDI1NjsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCmluZGV4IGI1ZjJjMDYuLjZhOTlhZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYwpAQCAtMjU0LDEwICsyNTQsMTUgQEAKIAkJZGJnKCIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAoMCk7CiAJfQotCWlmICh3cG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CisKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkgeworCQlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAJCWRiZygiJXMgLSBhbHJlYWR5IHdyaXRpbmciLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAl9CisJcG9ydC0+d3JpdGVfdXJiX2J1c3kgPSAxOworCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAogCWNvdW50ID0gKGNvdW50ID4gT01OSU5FVF9CVUxLT1VUU0laRSkgPyBPTU5JTkVUX0JVTEtPVVRTSVpFIDogY291bnQ7CiAKQEAgLTI3NSw5ICsyODAsMTAgQEAKIAogCXdwb3J0LT53cml0ZV91cmItPmRldiA9IHNlcmlhbC0+ZGV2OwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHdwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXN1bHQpCisJaWYgKHJlc3VsdCkgeworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwotCWVsc2UKKwl9IGVsc2UKIAkJcmVzdWx0ID0gY291bnQ7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjkxLDcgKzI5Nyw3IEBACiAKIAlpbnQgcm9vbSA9IDA7IC8vIERlZmF1bHQ6IG5vIHJvb20KIAotCWlmICh3cG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQorCWlmICh3cG9ydC0+d3JpdGVfdXJiX2J1c3kpCiAJCXJvb20gPSB3cG9ydC0+YnVsa19vdXRfc2l6ZSAtIE9NTklORVRfSEVBREVSTEVOOwogCiAvLwlkYmcoIm9tbmluZXRfd3JpdGVfcm9vbSByZXR1cm5zICVkIiwgcm9vbSk7CkBAIC0zMDYsNiArMzEyLDcgQEAKIAogLy8JZGJnKCJvbW5pbmV0X3dyaXRlX2J1bGtfY2FsbGJhY2ssIHBvcnQgJTB4XG4iLCBwb3J0KTsKIAorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKIAlpZiAodXJiLT5zdGF0dXMpIHsKIAkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zYWZlX3NlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKaW5kZXggMGU4NWVkNi4uOTZhMTc1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NhZmVfc2VyaWFsLmMKQEAgLTI5OSwxMCArMjk5LDE0IEBACiAJCWRiZyAoIiVzIC0gd3JpdGUgcmVxdWVzdCBvZiAwIGJ5dGVzIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuICgwKTsKIAl9Ci0JaWYgKHBvcnQtPndyaXRlX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQlkYmcgKCIlcyAtIGFscmVhZHkgd3JpdGluZyIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAoMCk7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKKwlpZiAocG9ydC0+d3JpdGVfdXJiX2J1c3kpIHsKKwkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCQlkYmcoIiVzIC0gYWxyZWFkeSB3cml0aW5nIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIDA7CiAJfQorCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAKIAlwYWNrZXRfbGVuZ3RoID0gcG9ydC0+YnVsa19vdXRfc2l6ZTsJLy8gZ2V0IG1heCBwYWNrZXRzaXplCiAKQEAgLTM1NCw2ICszNTgsNyBAQAogI2VuZGlmCiAJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAlpZiAoKHJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiIChwb3J0LT53cml0ZV91cmIsIEdGUF9LRVJORUwpKSkgeworCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CiAJCWVyciAoIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzY4LDcgKzM3Myw3IEBACiAKIAlkYmcgKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAocG9ydC0+d3JpdGVfdXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTKQorCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKIAkJcm9vbSA9IHBvcnQtPmJ1bGtfb3V0X3NpemUgLSAoc2FmZSA/IDIgOiAwKTsKIAogCWlmIChyb29tKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCA1ZGE3NmRkLi4wMjY3YjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTEwNDcsNiArMTA0Nyw3IEBACiAJCW1lbXNldChwb3J0LCAweDAwLCBzaXplb2Yoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCkpOwogCQlwb3J0LT5udW1iZXIgPSBpICsgc2VyaWFsLT5taW5vcjsKIAkJcG9ydC0+c2VyaWFsID0gc2VyaWFsOworCQlzcGluX2xvY2tfaW5pdCgmcG9ydC0+bG9jayk7CiAJCUlOSVRfV09SSygmcG9ydC0+d29yaywgdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQsIHBvcnQpOwogCQlzZXJpYWwtPnBvcnRbaV0gPSBwb3J0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5oCmluZGV4IGQxZjBjNDAuLjU3ZjkyZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuaApAQCAtNjksNiArNjksNyBAQAogICogdXNiX3NlcmlhbF9wb3J0OiBzdHJ1Y3R1cmUgZm9yIHRoZSBzcGVjaWZpYyBwb3J0cyBvZiBhIGRldmljZS4KICAqIEBzZXJpYWw6IHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IHVzYl9zZXJpYWwgb3duZXIgb2YgdGhpcyBwb3J0LgogICogQHR0eTogcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyB0dHkgZm9yIHRoaXMgcG9ydC4KKyAqIEBsb2NrOiBzcGlubG9jayB0byBncmFiIHdoZW4gdXBkYXRpbmcgcG9ydGlvbnMgb2YgdGhpcyBzdHJ1Y3R1cmUuCiAgKiBAbnVtYmVyOiB0aGUgbnVtYmVyIG9mIHRoZSBwb3J0ICh0aGUgbWlub3IgbnVtYmVyKS4KICAqIEBpbnRlcnJ1cHRfaW5fYnVmZmVyOiBwb2ludGVyIHRvIHRoZSBpbnRlcnJ1cHQgaW4gYnVmZmVyIGZvciB0aGlzIHBvcnQuCiAgKiBAaW50ZXJydXB0X2luX3VyYjogcG9pbnRlciB0byB0aGUgaW50ZXJydXB0IGluIHN0cnVjdCB1cmIgZm9yIHRoaXMgcG9ydC4KQEAgLTk4LDYgKzk5LDcgQEAKIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgewogCXN0cnVjdCB1c2Jfc2VyaWFsICoJc2VyaWFsOwogCXN0cnVjdCB0dHlfc3RydWN0ICoJdHR5OworCXNwaW5sb2NrX3QJCWxvY2s7CiAJdW5zaWduZWQgY2hhcgkJbnVtYmVyOwogCiAJdW5zaWduZWQgY2hhciAqCQlpbnRlcnJ1cHRfaW5fYnVmZmVyOwpAQCAtMTE3LDYgKzExOSw3IEBACiAJdW5zaWduZWQgY2hhciAqCQlidWxrX291dF9idWZmZXI7CiAJaW50CQkJYnVsa19vdXRfc2l6ZTsKIAlzdHJ1Y3QgdXJiICoJCXdyaXRlX3VyYjsKKwlpbnQJCQl3cml0ZV91cmJfYnVzeTsKIAlfX3U4CQkJYnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzOwogCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd3JpdGVfd2FpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYwppbmRleCBlNDNlZGRjLi5hZjI5NGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCkBAIC0xNTUsNiArMTU1LDE1IEBACiAJCSAqIElmIHRoaXMgZGV2aWNlIG1ha2VzIHRoYXQgbWlzdGFrZSwgdGVsbCB0aGUgc2QgZHJpdmVyLiAqLwogCQlpZiAodXMtPmZsYWdzICYgVVNfRkxfRklYX0NBUEFDSVRZKQogCQkJc2Rldi0+Zml4X2NhcGFjaXR5ID0gMTsKKworCQkvKiBVU0ItSURFIGJyaWRnZXMgdGVuZCB0byByZXBvcnQgU0sgPSAweDA0IChOb24tcmVjb3ZlcmFibGUKKwkJICogSGFyZHdhcmUgRXJyb3IpIHdoZW4gYW55IGxvdy1sZXZlbCBlcnJvciBvY2N1cnMsCisJCSAqIHJlY292ZXJhYmxlIG9yIG5vdC4gIFNldHRpbmcgdGhpcyBmbGFnIHRlbGxzIHRoZSBTQ1NJCisJCSAqIG1pZGxheWVyIHRvIHJldHJ5IHN1Y2ggY29tbWFuZHMsIHdoaWNoIGZyZXF1ZW50bHkgd2lsbAorCQkgKiBzdWNjZWVkIGFuZCBmaXggdGhlIGVycm9yLiAgVGhlIHdvcnN0IHRoaXMgY2FuIGxlYWQgdG8KKwkJICogaXMgYW4gb2NjYXNpb25hbCBzZXJpZXMgb2YgcmV0cmllcyB0aGF0IHdpbGwgYWxsIGZhaWwuICovCisJCXNkZXYtPnJldHJ5X2h3ZXJyb3IgPSAxOworCiAJfSBlbHNlIHsKIAogCQkvKiBOb24tZGlzay10eXBlIGRldmljZXMgZG9uJ3QgbmVlZCB0byBibGFja2xpc3QgYW55IHBhZ2VzCkBAIC0yNTUsNTAgKzI2NCwyMyBAQAogCiAJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzIGFuZCBkbyB0aGUgcmVzZXQgKi8KIAlkb3duKCYodXMtPmRldl9zZW1hcGhvcmUpKTsKLQlpZiAodGVzdF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncykpIHsKLQkJcmVzdWx0ID0gRkFJTEVEOwotCQlVU19ERUJVR1AoIk5vIHJlc2V0IGR1cmluZyBkaXNjb25uZWN0XG4iKTsKLQl9IGVsc2UKLQkJcmVzdWx0ID0gdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CisJcmVzdWx0ID0gdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CiAJdXAoJih1cy0+ZGV2X3NlbWFwaG9yZSkpOwogCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcmVzdWx0IDwgMCA/IEZBSUxFRCA6IFNVQ0NFU1M7CiB9CiAKLS8qIFRoaXMgcmVzZXRzIHRoZSBkZXZpY2UncyBVU0IgcG9ydC4gKi8KLS8qIEl0IHJlZnVzZXMgdG8gd29yayBpZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGluCi0gKiB0aGUgZGV2aWNlLCBzbyB0aGF0IG90aGVyIHVzZXJzIGFyZSBub3QgYWZmZWN0ZWQuICovCisvKiBTaW11bGF0ZSBhIFNDU0kgYnVzIHJlc2V0IGJ5IHJlc2V0dGluZyB0aGUgZGV2aWNlJ3MgVVNCIHBvcnQuICovCiAvKiBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBzY3NpX2xvY2soaG9zdCkgaGVsZCAqLwogc3RhdGljIGludCBidXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewogCXN0cnVjdCB1c19kYXRhICp1cyA9IGhvc3RfdG9fdXMoc3JiLT5kZXZpY2UtPmhvc3QpOwotCWludCByZXN1bHQsIHJjOworCWludCByZXN1bHQ7CiAKIAlVU19ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKIAotCS8qIFRoZSBVU0Igc3Vic3lzdGVtIGRvZXNuJ3QgaGFuZGxlIHN5bmNocm9uaXNhdGlvbiBiZXR3ZWVuCi0JICogYSBkZXZpY2UncyBzZXZlcmFsIGRyaXZlcnMuIFRoZXJlZm9yZSB3ZSByZXNldCBvbmx5IGRldmljZXMKLQkgKiB3aXRoIGp1c3Qgb25lIGludGVyZmFjZSwgd2hpY2ggd2Ugb2YgY291cnNlIG93bi4gKi8KLQogCWRvd24oJih1cy0+ZGV2X3NlbWFwaG9yZSkpOwotCWlmICh0ZXN0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKSkgewotCQlyZXN1bHQgPSAtRUlPOwotCQlVU19ERUJVR1AoIk5vIHJlc2V0IGR1cmluZyBkaXNjb25uZWN0XG4iKTsKLQl9IGVsc2UgaWYgKHVzLT5wdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEpIHsKLQkJcmVzdWx0ID0gLUVCVVNZOwotCQlVU19ERUJVR1AoIlJlZnVzaW5nIHRvIHJlc2V0IGEgbXVsdGktaW50ZXJmYWNlIGRldmljZVxuIik7Ci0JfSBlbHNlIHsKLQkJcmMgPSB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHVzLT5wdXNiX2RldiwgdXMtPnB1c2JfaW50Zik7Ci0JCWlmIChyYyA8IDApIHsKLQkJCVVTX0RFQlVHUCgidW5hYmxlIHRvIGxvY2sgZGV2aWNlIGZvciByZXNldDogJWRcbiIsIHJjKTsKLQkJCXJlc3VsdCA9IHJjOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gdXNiX3Jlc2V0X2RldmljZSh1cy0+cHVzYl9kZXYpOwotCQkJaWYgKHJjKQotCQkJCXVzYl91bmxvY2tfZGV2aWNlKHVzLT5wdXNiX2Rldik7Ci0JCQlVU19ERUJVR1AoInVzYl9yZXNldF9kZXZpY2UgcmV0dXJucyAlZFxuIiwgcmVzdWx0KTsKLQkJfQotCX0KKwlyZXN1bHQgPSB1c2Jfc3Rvcl9wb3J0X3Jlc2V0KHVzKTsKIAl1cCgmKHVzLT5kZXZfc2VtYXBob3JlKSk7CiAKIAkvKiBsb2NrIHRoZSBob3N0IGZvciB0aGUgcmV0dXJuICovCkBAIC0zMjAsNiArMzAyLDE0IEBACiAJfQogfQogCisvKiBSZXBvcnQgYSBkcml2ZXItaW5pdGlhdGVkIGJ1cyByZXNldCB0byB0aGUgU0NTSSBsYXllci4KKyAqIENhbGxpbmcgdGhpcyBmb3IgYSBTQ1NJLWluaXRpYXRlZCByZXNldCBpcyB1bm5lY2Vzc2FyeSBidXQgaGFybWxlc3MuCisgKiBUaGUgY2FsbGVyIG11c3Qgb3duIHRoZSBTQ1NJIGhvc3QgbG9jay4gKi8KK3ZvaWQgdXNiX3N0b3JfcmVwb3J0X2J1c19yZXNldChzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KHVzX3RvX2hvc3QodXMpLCAwKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAvcHJvYy9zY3NpLyBmdW5jdGlvbnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuaAppbmRleCBkMGE0OWFmLi43MzdlNGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5oCkBAIC00Miw2ICs0Miw3IEBACiAjZGVmaW5lIF9TQ1NJR0xVRV9IXwogCiBleHRlcm4gdm9pZCB1c2Jfc3Rvcl9yZXBvcnRfZGV2aWNlX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cyk7CitleHRlcm4gdm9pZCB1c2Jfc3Rvcl9yZXBvcnRfYnVzX3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cyk7CiAKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHVzYl9zdG9yX3NlbnNlX2ludmFsaWRDREJbMThdOwogZXh0ZXJuIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgdXNiX3N0b3JfaG9zdF90ZW1wbGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IDk3NDNlMjguLmU2YjFjNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtMjY2LDggKzI2Niw5IEBACiAJCU5VTEwsIDAsIDMqSFopOwogCiAJLyogcmVzZXQgdGhlIGVuZHBvaW50IHRvZ2dsZSAqLwotCXVzYl9zZXR0b2dnbGUodXMtPnB1c2JfZGV2LCB1c2JfcGlwZWVuZHBvaW50KHBpcGUpLAotCQl1c2JfcGlwZW91dChwaXBlKSwgMCk7CisJaWYgKHJlc3VsdCA+PSAwKQorCQl1c2Jfc2V0dG9nZ2xlKHVzLT5wdXNiX2RldiwgdXNiX3BpcGVlbmRwb2ludChwaXBlKSwKKwkJCQl1c2JfcGlwZW91dChwaXBlKSwgMCk7CiAKIAlVU19ERUJVR1AoIiVzOiByZXN1bHQgPSAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwogCXJldHVybiByZXN1bHQ7CkBAIC01NDAsMTUgKzU0MSwxNSBAQAogCSAqLwogCWlmICh0ZXN0X2JpdChVU19GTElEWF9USU1FRF9PVVQsICZ1cy0+ZmxhZ3MpKSB7CiAJCVVTX0RFQlVHUCgiLS0gY29tbWFuZCB3YXMgYWJvcnRlZFxuIik7Ci0JCWdvdG8gSGFuZGxlX0Fib3J0OworCQlzcmItPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKKwkJZ290byBIYW5kbGVfRXJyb3JzOwogCX0KIAogCS8qIGlmIHRoZXJlIGlzIGEgdHJhbnNwb3J0IGVycm9yLCByZXNldCBhbmQgZG9uJ3QgYXV0by1zZW5zZSAqLwogCWlmIChyZXN1bHQgPT0gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SKSB7CiAJCVVTX0RFQlVHUCgiLS0gdHJhbnNwb3J0IGluZGljYXRlcyBlcnJvciwgcmVzZXR0aW5nXG4iKTsKLQkJdXMtPnRyYW5zcG9ydF9yZXNldCh1cyk7CiAJCXNyYi0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwotCQlyZXR1cm47CisJCWdvdG8gSGFuZGxlX0Vycm9yczsKIAl9CiAKIAkvKiBpZiB0aGUgdHJhbnNwb3J0IHByb3ZpZGVkIGl0cyBvd24gc2Vuc2UgZGF0YSwgZG9uJ3QgYXV0by1zZW5zZSAqLwpAQCAtNjY4LDcgKzY2OSw4IEBACiAKIAkJaWYgKHRlc3RfYml0KFVTX0ZMSURYX1RJTUVEX09VVCwgJnVzLT5mbGFncykpIHsKIAkJCVVTX0RFQlVHUCgiLS0gYXV0by1zZW5zZSBhYm9ydGVkXG4iKTsKLQkJCWdvdG8gSGFuZGxlX0Fib3J0OworCQkJc3JiLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlnb3RvIEhhbmRsZV9FcnJvcnM7CiAJCX0KIAkJaWYgKHRlbXBfcmVzdWx0ICE9IFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EKSB7CiAJCQlVU19ERUJVR1AoIi0tIGF1dG8tc2Vuc2UgZmFpbHVyZVxuIik7CkBAIC02NzcsOSArNjc5LDkgQEAKIAkJCSAqIG11bHRpLXRhcmdldCBkZXZpY2UsIHNpbmNlIGZhaWx1cmUgb2YgYW4KIAkJCSAqIGF1dG8tc2Vuc2UgaXMgcGVyZmVjdGx5IHZhbGlkCiAJCQkgKi8KLQkJCWlmICghKHVzLT5mbGFncyAmIFVTX0ZMX1NDTV9NVUxUX1RBUkcpKQotCQkJCXVzLT50cmFuc3BvcnRfcmVzZXQodXMpOwogCQkJc3JiLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CisJCQlpZiAoISh1cy0+ZmxhZ3MgJiBVU19GTF9TQ01fTVVMVF9UQVJHKSkKKwkJCQlnb3RvIEhhbmRsZV9FcnJvcnM7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtNzIwLDEyICs3MjIsMjggQEAKIAogCXJldHVybjsKIAotCS8qIGFib3J0IHByb2Nlc3Npbmc6IHRoZSBidWxrLW9ubHkgdHJhbnNwb3J0IHJlcXVpcmVzIGEgcmVzZXQKLQkgKiBmb2xsb3dpbmcgYW4gYWJvcnQgKi8KLSAgSGFuZGxlX0Fib3J0OgotCXNyYi0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwotCWlmICh1cy0+cHJvdG9jb2wgPT0gVVNfUFJfQlVMSykKKwkvKiBFcnJvciBhbmQgYWJvcnQgcHJvY2Vzc2luZzogdHJ5IHRvIHJlc3luY2hyb25pemUgd2l0aCB0aGUgZGV2aWNlCisJICogYnkgaXNzdWluZyBhIHBvcnQgcmVzZXQuICBJZiB0aGF0IGZhaWxzLCB0cnkgYSBjbGFzcy1zcGVjaWZpYworCSAqIGRldmljZSByZXNldC4gKi8KKyAgSGFuZGxlX0Vycm9yczoKKworCS8qIExldCB0aGUgU0NTSSBsYXllciBrbm93IHdlIGFyZSBkb2luZyBhIHJlc2V0LCBzZXQgdGhlCisJICogUkVTRVRUSU5HIGJpdCwgYW5kIGNsZWFyIHRoZSBBQk9SVElORyBiaXQgc28gdGhhdCB0aGUgcmVzZXQKKwkgKiBtYXkgcHJvY2VlZC4gKi8KKwlzY3NpX2xvY2sodXNfdG9faG9zdCh1cykpOworCXVzYl9zdG9yX3JlcG9ydF9idXNfcmVzZXQodXMpOworCXNldF9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKKwljbGVhcl9iaXQoVVNfRkxJRFhfQUJPUlRJTkcsICZ1cy0+ZmxhZ3MpOworCXNjc2lfdW5sb2NrKHVzX3RvX2hvc3QodXMpKTsKKworCXJlc3VsdCA9IHVzYl9zdG9yX3BvcnRfcmVzZXQodXMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXNjc2lfbG9jayh1c190b19ob3N0KHVzKSk7CisJCXVzYl9zdG9yX3JlcG9ydF9kZXZpY2VfcmVzZXQodXMpOworCQlzY3NpX3VubG9jayh1c190b19ob3N0KHVzKSk7CiAJCXVzLT50cmFuc3BvcnRfcmVzZXQodXMpOworCX0KKwljbGVhcl9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKIH0KIAogLyogU3RvcCB0aGUgY3VycmVudCBVUkIgdHJhbnNmZXIgKi8KQEAgLTExMjQsNyArMTE0Miw3IEBACiAgKiBJdCdzIGhhbmR5IHRoYXQgZXZlcnkgdHJhbnNwb3J0IG1lY2hhbmlzbSB1c2VzIHRoZSBjb250cm9sIGVuZHBvaW50IGZvcgogICogcmVzZXRzLgogICoKLSAqIEJhc2ljYWxseSwgd2Ugc2VuZCBhIHJlc2V0IHdpdGggYSAyMC1zZWNvbmQgdGltZW91dCwgc28gd2UgZG9uJ3QgZ2V0CisgKiBCYXNpY2FsbHksIHdlIHNlbmQgYSByZXNldCB3aXRoIGEgNS1zZWNvbmQgdGltZW91dCwgc28gd2UgZG9uJ3QgZ2V0CiAgKiBqYW1tZWQgYXR0ZW1wdGluZyB0byBkbyB0aGUgcmVzZXQuCiAgKi8KIHN0YXRpYyBpbnQgdXNiX3N0b3JfcmVzZXRfY29tbW9uKHN0cnVjdCB1c19kYXRhICp1cywKQEAgLTExMzMsMjggKzExNTEsMTggQEAKIHsKIAlpbnQgcmVzdWx0OwogCWludCByZXN1bHQyOwotCWludCByYyA9IEZBSUxFRDsKIAotCS8qIExldCB0aGUgU0NTSSBsYXllciBrbm93IHdlIGFyZSBkb2luZyBhIHJlc2V0LCBzZXQgdGhlCi0JICogUkVTRVRUSU5HIGJpdCwgYW5kIGNsZWFyIHRoZSBBQk9SVElORyBiaXQgc28gdGhhdCB0aGUgcmVzZXQKLQkgKiBtYXkgcHJvY2VlZC4KLQkgKi8KLQlzY3NpX2xvY2sodXNfdG9faG9zdCh1cykpOwotCXVzYl9zdG9yX3JlcG9ydF9kZXZpY2VfcmVzZXQodXMpOwotCXNldF9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKLQljbGVhcl9iaXQoVVNfRkxJRFhfQUJPUlRJTkcsICZ1cy0+ZmxhZ3MpOwotCXNjc2lfdW5sb2NrKHVzX3RvX2hvc3QodXMpKTsKKwlpZiAodGVzdF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncykpIHsKKwkJVVNfREVCVUdQKCJObyByZXNldCBkdXJpbmcgZGlzY29ubmVjdFxuIik7CisJCXJldHVybiAtRUlPOworCX0KIAotCS8qIEEgMjAtc2Vjb25kIHRpbWVvdXQgbWF5IHNlZW0gcmF0aGVyIGxvbmcsIGJ1dCBhIExhQ2llCi0JICogU3R1ZGlvRHJpdmUgVVNCMiBkZXZpY2UgdGFrZXMgMTYrIHNlY29uZHMgdG8gZ2V0IGdvaW5nCi0JICogZm9sbG93aW5nIGEgcG93ZXJ1cCBvciBVU0IgYXR0YWNoIGV2ZW50LgotCSAqLwogCXJlc3VsdCA9IHVzYl9zdG9yX2NvbnRyb2xfbXNnKHVzLCB1cy0+c2VuZF9jdHJsX3BpcGUsCiAJCQlyZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplLAotCQkJMjAqSFopOworCQkJNSpIWik7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJVVNfREVCVUdQKCJTb2Z0IHJlc2V0IGZhaWxlZDogJWRcbiIsIHJlc3VsdCk7Ci0JCWdvdG8gRG9uZTsKKwkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKICAJLyogR2l2ZSB0aGUgZGV2aWNlIHNvbWUgdGltZSB0byByZWNvdmVyIGZyb20gdGhlIHJlc2V0LApAQCAtMTE2NCw3ICsxMTcyLDcgQEAKICAJCQlIWio2KTsKIAlpZiAodGVzdF9iaXQoVVNfRkxJRFhfRElTQ09OTkVDVElORywgJnVzLT5mbGFncykpIHsKIAkJVVNfREVCVUdQKCJSZXNldCBpbnRlcnJ1cHRlZCBieSBkaXNjb25uZWN0XG4iKTsKLQkJZ290byBEb25lOworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlVU19ERUJVR1AoIlNvZnQgcmVzZXQ6IGNsZWFyaW5nIGJ1bGstaW4gZW5kcG9pbnQgaGFsdFxuIik7CkBAIC0xMTczLDE3ICsxMTgxLDE0IEBACiAJVVNfREVCVUdQKCJTb2Z0IHJlc2V0OiBjbGVhcmluZyBidWxrLW91dCBlbmRwb2ludCBoYWx0XG4iKTsKIAlyZXN1bHQyID0gdXNiX3N0b3JfY2xlYXJfaGFsdCh1cywgdXMtPnNlbmRfYnVsa19waXBlKTsKIAotCS8qIHJldHVybiBhIHJlc3VsdCBjb2RlIGJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNvbnRyb2wgbWVzc2FnZSAqLwotCWlmIChyZXN1bHQgPCAwIHx8IHJlc3VsdDIgPCAwKSB7CisJLyogcmV0dXJuIGEgcmVzdWx0IGNvZGUgYmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgY2xlYXItaGFsdHMgKi8KKwlpZiAocmVzdWx0ID49IDApCisJCXJlc3VsdCA9IHJlc3VsdDI7CisJaWYgKHJlc3VsdCA8IDApCiAJCVVTX0RFQlVHUCgiU29mdCByZXNldCBmYWlsZWRcbiIpOwotCQlnb3RvIERvbmU7Ci0JfQotCVVTX0RFQlVHUCgiU29mdCByZXNldCBkb25lXG4iKTsKLQlyYyA9IFNVQ0NFU1M7Ci0KLSAgRG9uZToKLQljbGVhcl9iaXQoVVNfRkxJRFhfUkVTRVRUSU5HLCAmdXMtPmZsYWdzKTsKLQlyZXR1cm4gcmM7CisJZWxzZQorCQlVU19ERUJVR1AoIlNvZnQgcmVzZXQgZG9uZVxuIik7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogVGhpcyBpc3N1ZXMgYSBDQltJXSBSZXNldCB0byB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uCkBAIC0xMjEzLDMgKzEyMTgsMzIgQEAKIAkJCQkgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAogCQkJCSAwLCB1cy0+aWZudW0sIE5VTEwsIDApOwogfQorCisvKiBJc3N1ZSBhIFVTQiBwb3J0IHJlc2V0IHRvIHRoZSBkZXZpY2UuICBCdXQgZG9uJ3QgZG8gYW55dGhpbmcgaWYKKyAqIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaW4gdGhlIGRldmljZSwgc28gdGhhdCBvdGhlciB1c2VycworICogYXJlIG5vdCBhZmZlY3RlZC4gKi8KK2ludCB1c2Jfc3Rvcl9wb3J0X3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKK3sKKwlpbnQgcmVzdWx0LCByYzsKKworCWlmICh0ZXN0X2JpdChVU19GTElEWF9ESVNDT05ORUNUSU5HLCAmdXMtPmZsYWdzKSkgeworCQlyZXN1bHQgPSAtRUlPOworCQlVU19ERUJVR1AoIk5vIHJlc2V0IGR1cmluZyBkaXNjb25uZWN0XG4iKTsKKwl9IGVsc2UgaWYgKHVzLT5wdXNiX2Rldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzICE9IDEpIHsKKwkJcmVzdWx0ID0gLUVCVVNZOworCQlVU19ERUJVR1AoIlJlZnVzaW5nIHRvIHJlc2V0IGEgbXVsdGktaW50ZXJmYWNlIGRldmljZVxuIik7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gcmMgPQorCQkJdXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCh1cy0+cHVzYl9kZXYsIHVzLT5wdXNiX2ludGYpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJVVNfREVCVUdQKCJ1bmFibGUgdG8gbG9jayBkZXZpY2UgZm9yIHJlc2V0OiAlZFxuIiwKKwkJCQkJcmVzdWx0KTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IHVzYl9yZXNldF9kZXZpY2UodXMtPnB1c2JfZGV2KTsKKwkJCWlmIChyYykKKwkJCQl1c2JfdW5sb2NrX2RldmljZSh1cy0+cHVzYl9kZXYpOworCQkJVVNfREVCVUdQKCJ1c2JfcmVzZXRfZGV2aWNlIHJldHVybnMgJWRcbiIsIHJlc3VsdCk7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5oCmluZGV4IGUyNWY4ZDguLjhkOWUwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuaApAQCAtMTcxLDQgKzE3MSw1IEBACiBleHRlcm4gaW50IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfc2coc3RydWN0IHVzX2RhdGEgKnVzLCB1bnNpZ25lZCBpbnQgcGlwZSwKIAkJdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCBpbnQgdXNlX3NnLCBpbnQgKnJlc2lkdWFsKTsKIAorZXh0ZXJuIGludCB1c2Jfc3Rvcl9wb3J0X3Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCmluZGV4IDlmY2M3YmQuLmJkMGFiMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaApAQCAtNjk3LDcgKzY5Nyw3IEBACiBVTlVTVUFMX0RFViggIDB4MDdhZiwgMHgwMDA1LCAweDAxMDAsIDB4MDEwMCwgCiAJCSJNaWNyb3RlY2giLAogCQkiVVNCLVNDU0ktSEQ1MCIsCi0JCVVTX1NDX1NDU0ksIFVTX1BSX0JVTEssIHVzYl9zdG9yX2V1c2NzaV9pbml0LAorCQlVU19TQ19ERVZJQ0UsIFVTX1BSX0RFVklDRSwgdXNiX3N0b3JfZXVzY3NpX2luaXQsCiAJCVVTX0ZMX1NDTV9NVUxUX1RBUkcgKSwgCiAKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKaW5kZXggMzVjMWNhNi4uNzdlN2ZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCkBAIC04NDcsMTAgKzg0Nyw4IEBACiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHVzLT5kZWxheV93YWl0LAogCQkJCXRlc3RfYml0KFVTX0ZMSURYX0RJU0NPTk5FQ1RJTkcsICZ1cy0+ZmxhZ3MpLAogCQkJCWRlbGF5X3VzZSAqIEhaKTsKLQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7Ci0JCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJaWYgKHRyeV90b19mcmVlemUoKSkKIAkJCWdvdG8gcmV0cnk7Ci0JCX0KIAl9CiAKIAkvKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGNvbm5lY3RlZCwgcGVyZm9ybSB0aGUgc2Nhbm5pbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IDk3ODkxMTUuLjdiYzFkNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtMzUwLDEwICszNTAsOCBAQAogc3RhdGljIGludCBkZWZhdWx0X2Ntb2RlIF9faW5pdGRhdGEgPSBDTU9ERV84OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogc3RhdGljIGludCBkZWZhdWx0X2NydF9vbiBfX2luaXRkYXRhID0gMDsKIHN0YXRpYyBpbnQgZGVmYXVsdF9sY2Rfb24gX19pbml0ZGF0YSA9IDE7Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19NVFJSCiBzdGF0aWMgaW50IG10cnIgPSAxOwpAQCAtMTI0OSw3ICsxMjQ3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiBzdGF0aWMgdm9pZCBhdHkxMjhfc2V0X2NydF9lbmFibGUoc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyLCBpbnQgb24pCiB7CiAJaWYgKG9uKSB7CkBAIC0xMjg0LDcgKzEyODEsNiBAQAogCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOwogCX0KIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwogCiBzdGF0aWMgdm9pZCBhdHkxMjhfc2V0X3BsbChzdHJ1Y3QgYXR5MTI4X3BsbCAqcGxsLCBjb25zdCBzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIpCiB7CkBAIC0xNDkxLDEyICsxNDg3LDEwIEBACiAJaW5mby0+Zml4LnZpc3VhbCA9IHBhci0+Y3J0Yy5icHAgPT0gOCA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUgogCQk6IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJaWYgKHBhci0+Y2hpcF9nZW4gPT0gcmFnZV9NMykgewogCQlhdHkxMjhfc2V0X2NydF9lbmFibGUocGFyLCBwYXItPmNydF9vbik7CiAJCWF0eTEyOF9zZXRfbGNkX2VuYWJsZShwYXIsIHBhci0+bGNkX29uKTsKIAl9Ci0jZW5kaWYKIAlpZiAocGFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKQogCQlhdHkxMjhfaW5pdF9lbmdpbmUocGFyKTsKIApAQCAtMTY1Miw3ICsxNjQ2LDYgQEAKIAkJcmV0dXJuIDA7CiAKIAl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKIAkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibGNkOiIsIDQpKSB7CiAJCQlkZWZhdWx0X2xjZF9vbiA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzQsIE5VTEwsIDApOwogCQkJY29udGludWU7CkBAIC0xNjYwLDcgKzE2NTMsNiBAQAogCQkJZGVmYXVsdF9jcnRfb24gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs0LCBOVUxMLCAwKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfTVRSUgogCQlpZighc3RybmNtcCh0aGlzX29wdCwgIm5vbXRyciIsIDYpKSB7CiAJCQltdHJyID0gMDsKQEAgLTE3NTIsMTAgKzE3NDQsOCBAQAogCWluZm8tPmZib3BzID0gJmF0eTEyOGZiX29wczsKIAlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogCXBhci0+bGNkX29uID0gZGVmYXVsdF9sY2Rfb247CiAJcGFyLT5jcnRfb24gPSBkZWZhdWx0X2NydF9vbjsKLSNlbmRpZgogCiAJdmFyID0gZGVmYXVsdF92YXI7CiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCkBAIC0yMDM1LDEyICsyMDI1LDEwIEBACiAKIAlhdHlfc3RfOChDUlRDX0VYVF9DTlRMKzEsIHN0YXRlKTsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCiAJaWYgKHBhci0+Y2hpcF9nZW4gPT0gcmFnZV9NMykgewogCQlhdHkxMjhfc2V0X2NydF9lbmFibGUocGFyLCBwYXItPmNydF9vbiAmJiAhYmxhbmspOwogCQlhdHkxMjhfc2V0X2xjZF9lbmFibGUocGFyLCBwYXItPmxjZF9vbiAmJiAhYmxhbmspOwogCX0KLSNlbmRpZgkKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKIAlpZiAoKF9tYWNoaW5lID09IF9NQUNIX1BtYWMpICYmICFibGFuaykKIAkJc2V0X2JhY2tsaWdodF9lbmFibGUoMSk7CkBAIC0yMTI0LDcgKzIxMTIsNiBAQAogc3RhdGljIGludCBhdHkxMjhmYl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAogCQkJICB1X2xvbmcgYXJnLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwogCXN0cnVjdCBhdHkxMjhmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAl1MzIgdmFsdWU7CiAJaW50IHJjOwpAQCAtMjE0OSw3ICsyMTM2LDYgQEAKIAkJdmFsdWUgPSAocGFyLT5jcnRfb24gPDwgMSkgfCBwYXItPmxjZF9vbjsKIAkJcmV0dXJuIHB1dF91c2VyKHZhbHVlLCAoX191MzIgX191c2VyICopYXJnKTsKIAl9Ci0jZW5kaWYKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdTExMDBmYi5jIGIvZHJpdmVycy92aWRlby9hdTExMDBmYi5jCmluZGV4IGNhY2Q4OGMuLmI2ZmUzMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXUxMTAwZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F1MTEwMGZiLmMKQEAgLTExMSwxNSArMTExLDE1IEBACiB2b2lkIGF1MTEwMF9ub2N1cnNvcihzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IG1vZGUsIGludCB4eCwgaW50IHl5KXt9OwogCiBzdGF0aWMgc3RydWN0IGZiX29wcyBhdTExMDBmYl9vcHMgPSB7Ci0Jb3duZXI6CQlUSElTX01PRFVMRSwKLQlmYl9nZXRfZml4OglmYmdlbl9nZXRfZml4LAotCWZiX2dldF92YXI6CWZiZ2VuX2dldF92YXIsCi0JZmJfc2V0X3ZhcjoJZmJnZW5fc2V0X3ZhciwKLQlmYl9nZXRfY21hcDoJZmJnZW5fZ2V0X2NtYXAsCi0JZmJfc2V0X2NtYXA6CWZiZ2VuX3NldF9jbWFwLAotCWZiX3Bhbl9kaXNwbGF5OiBmYmdlbl9wYW5fZGlzcGxheSwKLSAgICAgICAgZmJfaW9jdGw6ICAgICAgIGF1MTEwMGZiX2lvY3RsLAotCWZiX21tYXA6ICAgICAgICBhdTExMDBmYl9tbWFwLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZmJfZ2V0X2ZpeAk9IGZiZ2VuX2dldF9maXgsCisJLmZiX2dldF92YXIJPSBmYmdlbl9nZXRfdmFyLAorCS5mYl9zZXRfdmFyCT0gZmJnZW5fc2V0X3ZhciwKKwkuZmJfZ2V0X2NtYXAJPSBmYmdlbl9nZXRfY21hcCwKKwkuZmJfc2V0X2NtYXAJPSBmYmdlbl9zZXRfY21hcCwKKwkuZmJfcGFuX2Rpc3BsYXkJPSBmYmdlbl9wYW5fZGlzcGxheSwKKyAgICAgICAgLmZiX2lvY3RsCT0gYXUxMTAwZmJfaW9jdGwsCisJLmZiX21tYXAJPSBhdTExMDBmYl9tbWFwLAogfTsKIAogc3RhdGljIHZvaWQgYXUxMTAwX2RldGVjdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jaGlwc2ZiLmMgYi9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYwppbmRleCA5NWU3MjU1Li5lNzVhOTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2NoaXBzZmIuYwpAQCAtMjgsMjIgKzI4LDE3IEBACiAjaW5jbHVkZSA8bGludXgvZmIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCiAjaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKLSNpbmNsdWRlIDxsaW51eC9hZGIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbXUuaD4KLSNlbmRpZgogCiAvKgogICogU2luY2Ugd2UgYWNjZXNzIHRoZSBkaXNwbGF5IHdpdGggaW5iL291dGIgdG8gZml4ZWQgcG9ydCBudW1iZXJzLAogICogd2UgY2FuIG9ubHkgaGFuZGxlIG9uZSA2NTU1eCBjaGlwLiAgLS0gcGF1bHVzCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyBjaGlwc2ZiX2luZm87Ci0KICNkZWZpbmUgd3JpdGVfaW5kKG51bSwgdmFsLCBhcCwgZHApCWRvIHsgXAogCW91dGIoKG51bSksIChhcCkpOyBvdXRiKCh2YWwpLCAoZHApKTsgXAogfSB3aGlsZSAoMCkKQEAgLTc0LDE0ICs2OSw2IEBACiAJaW5iKDB4M2RhKTsgcmVhZF9pbmQobnVtLCB2YXIsIDB4M2MwLCAweDNjMSk7IFwKIH0gd2hpbGUgKDApCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKnNhdmVfZnJhbWVidWZmZXI7Ci1pbnQgY2hpcHNfc2xlZXBfbm90aWZ5KHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKTsKLXN0YXRpYyBzdHJ1Y3QgcG11X3NsZWVwX25vdGlmaWVyIGNoaXBzX3NsZWVwX25vdGlmaWVyID0gewotCWNoaXBzX3NsZWVwX25vdGlmeSwgU0xFRVBfTEVWRUxfVklERU8sCi19OwotI2VuZGlmCi0KIC8qCiAgKiBFeHBvcnRlZCBmdW5jdGlvbnMKICAqLwpAQCAtMzU2LDYgKzM0Myw4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2NoaXBzKHN0cnVjdCBmYl9pbmZvICpwLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJbWVtc2V0KHAtPnNjcmVlbl9iYXNlLCAwLCAweDEwMDAwMCk7CisKIAlwLT5maXggPSBjaGlwc2ZiX2ZpeDsKIAlwLT5maXguc21lbV9zdGFydCA9IGFkZHI7CiAKQEAgLTM2NiwzNCArMzU1LDQxIEBACiAKIAlmYl9hbGxvY19jbWFwKCZwLT5jbWFwLCAyNTYsIDApOwogCi0JaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHApIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkMmVCA2NTU1MCBmcmFtZWJ1ZmZlciBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogQ2hpcHMgNjU1NTAgZnJhbWUgYnVmZmVyICglZEsgUkFNIGRldGVjdGVkKVxuIiwKLQkJcC0+bm9kZSwgcC0+Zml4LnNtZW1fbGVuIC8gMTAyNCk7Ci0KIAljaGlwc19od19pbml0KCk7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBjaGlwc2ZiX3BjaV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkcCwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKLQlzdHJ1Y3QgZmJfaW5mbyAqcCA9ICZjaGlwc2ZiX2luZm87CisJc3RydWN0IGZiX2luZm8gKnA7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplOwogCXVuc2lnbmVkIHNob3J0IGNtZDsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKGRwKSA8IDApIHsKKwkJZGV2X2VycigmZHAtPmRldiwgIkNhbm5vdCBlbmFibGUgUENJIGRldmljZVxuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CiAKIAlpZiAoKGRwLT5yZXNvdXJjZVswXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSA9PSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJZ290byBlcnJfZGlzYWJsZTsKIAlhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRwLCAwKTsKIAlzaXplID0gcGNpX3Jlc291cmNlX2xlbihkcCwgMCk7CiAJaWYgKGFkZHIgPT0gMCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKHAtPnNjcmVlbl9iYXNlICE9IDApCi0JCXJldHVybiAtRUJVU1k7Ci0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oYWRkciwgc2l6ZSwgImNoaXBzZmIiKSkKLQkJcmV0dXJuIC1FQlVTWTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKworCXAgPSBmcmFtZWJ1ZmZlcl9hbGxvYygwLCAmZHAtPmRldik7CisJaWYgKHAgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZkcC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIGZyYW1lYnVmZmVyIHN0cnVjdHVyZVxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9uKGRwLCAwLCAiY2hpcHNmYiIpICE9IDApIHsKKwkJZGV2X2VycigmZHAtPmRldiwgIkNhbm5vdCByZXF1ZXN0IGZyYW1lYnVmZmVyXG4iKTsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlbGVhc2VfZmI7CisJfQogCiAjaWZkZWYgX19CSUdfRU5ESUFOCiAJYWRkciArPSAweDgwMDAwMDsJLy8gVXNlIGJpZy1lbmRpYW4gYXBlcnR1cmUKQEAgLTQxMSwzOCArNDA3LDkwIEBACiAJc2V0X2JhY2tsaWdodF9lbmFibGUoMSk7CiAjZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiAKKyNpZmRlZiBDT05GSUdfUFBDCiAJcC0+c2NyZWVuX2Jhc2UgPSBfX2lvcmVtYXAoYWRkciwgMHgyMDAwMDAsIF9QQUdFX05PX0NBQ0hFKTsKKyNlbHNlCisJcC0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGFkZHIsIDB4MjAwMDAwKTsKKyNlbmRpZgogCWlmIChwLT5zY3JlZW5fYmFzZSA9PSBOVUxMKSB7Ci0JCXJlbGVhc2VfbWVtX3JlZ2lvbihhZGRyLCBzaXplKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCWRldl9lcnIoJmRwLT5kZXYsICJDYW5ub3QgbWFwIGZyYW1lYnVmZmVyXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWxlYXNlX3BjaTsKIAl9Ci0JcC0+ZGV2aWNlID0gJmRwLT5kZXY7Ci0JaW5pdF9jaGlwcyhwLCBhZGRyKTsKLQotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCi0JcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZjaGlwc19zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KIAogCXBjaV9zZXRfZHJ2ZGF0YShkcCwgcCk7CisJcC0+ZGV2aWNlID0gJmRwLT5kZXY7CisKKwlpbml0X2NoaXBzKHAsIGFkZHIpOworCisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHApIDwgMCkgeworCQlkZXZfZXJyKCZkcC0+ZGV2LCJDJlQgNjU1NTAgZnJhbWVidWZmZXIgZmFpbGVkIHRvIHJlZ2lzdGVyXG4iKTsKKwkJZ290byBlcnJfdW5tYXA7CisJfQorCisJZGV2X2luZm8oJmRwLT5kZXYsImZiJWQ6IENoaXBzIDY1NTUwIGZyYW1lIGJ1ZmZlciIKKwkJICIgKCVkSyBSQU0gZGV0ZWN0ZWQpXG4iLAorCQkgcC0+bm9kZSwgcC0+Zml4LnNtZW1fbGVuIC8gMTAyNCk7CisKIAlyZXR1cm4gMDsKKworIGVycl91bm1hcDoKKwlpb3VubWFwKHAtPnNjcmVlbl9iYXNlKTsKKyBlcnJfcmVsZWFzZV9wY2k6CisJcGNpX3JlbGVhc2VfcmVnaW9uKGRwLCAwKTsKKyBlcnJfcmVsZWFzZV9mYjoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKHApOworIGVycl9kaXNhYmxlOgorIGVycl9vdXQ6CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgY2hpcHNmYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRwKQogewogCXN0cnVjdCBmYl9pbmZvICpwID0gcGNpX2dldF9kcnZkYXRhKGRwKTsKIAotCWlmIChwICE9ICZjaGlwc2ZiX2luZm8gfHwgcC0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkKKwlpZiAocC0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkKIAkJcmV0dXJuOwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIocCk7CiAJaW91bm1hcChwLT5zY3JlZW5fYmFzZSk7CiAJcC0+c2NyZWVuX2Jhc2UgPSBOVUxMOwotCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQoZHAsIDApLCBwY2lfcmVzb3VyY2VfbGVuKGRwLCAwKSk7Ci0KLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSwotCXBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZjaGlwc19zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKwlwY2lfcmVsZWFzZV9yZWdpb24oZHAsIDApOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGNoaXBzZmJfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKyAgICAgICAgc3RydWN0IGZiX2luZm8gKnAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoc3RhdGUgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RhdGUgIT0gUE1fU1VTUEVORF9NRU0pCisJCWdvdG8gZG9uZTsKKworCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKKwljaGlwc2ZiX2JsYW5rKDEsIHApOworCWZiX3NldF9zdXNwZW5kKHAsIDEpOworCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKyBkb25lOgorCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoaXBzZmJfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKyAgICAgICAgc3RydWN0IGZiX2luZm8gKnAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CisJZmJfc2V0X3N1c3BlbmQocCwgMCk7CisJY2hpcHNmYl9ibGFuaygwLCBwKTsKKwlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwlwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjaGlwc2ZiX3BjaV90YmxbXSA9IHsKIAl7IFBDSV9WRU5ET1JfSURfQ1QsIFBDSV9ERVZJQ0VfSURfQ1RfNjU1NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQgfSwKIAl7IDAgfQpAQCAtNDU1LDYgKzUwMywxMCBAQAogCS5pZF90YWJsZSA9CWNoaXBzZmJfcGNpX3RibCwKIAkucHJvYmUgPQljaGlwc2ZiX3BjaV9pbml0LAogCS5yZW1vdmUgPQlfX2RldmV4aXRfcChjaGlwc2ZiX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPQljaGlwc2ZiX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgPQljaGlwc2ZiX3BjaV9yZXN1bWUsCisjZW5kaWYKIH07CiAKIGludCBfX2luaXQgY2hpcHNfaW5pdCh2b2lkKQpAQCAtNDcyLDQ4ICs1MjQsNCBAQAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2hpcHNmYl9kcml2ZXIpOwogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKLS8qCi0gKiBTYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhbWUgYnVmZmVyIHdoZW4gd2UgZ28gdG8gc2xlZXAsCi0gKiBhbmQgcmVzdG9yZSBpdCB3aGVuIHdlIHdha2UgdXAgYWdhaW4uCi0gKi8KLWludAotY2hpcHNfc2xlZXBfbm90aWZ5KHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQotewotCXN0cnVjdCBmYl9pbmZvICpwID0gJmNoaXBzZmJfaW5mbzsKLQlpbnQgbmIgPSBwLT52YXIueXJlcyAqIHAtPmZpeC5saW5lX2xlbmd0aDsKLQotCWlmIChwLT5zY3JlZW5fYmFzZSA9PSBOVUxMKQotCQlyZXR1cm4gUEJPT0tfU0xFRVBfT0s7Ci0KLQlzd2l0Y2ggKHdoZW4pIHsKLQljYXNlIFBCT09LX1NMRUVQX1JFUVVFU1Q6Ci0JCXNhdmVfZnJhbWVidWZmZXIgPSB2bWFsbG9jKG5iKTsKLQkJaWYgKHNhdmVfZnJhbWVidWZmZXIgPT0gTlVMTCkKLQkJCXJldHVybiBQQk9PS19TTEVFUF9SRUZVU0U7Ci0JCWJyZWFrOwotCWNhc2UgUEJPT0tfU0xFRVBfUkVKRUNUOgotCQlpZiAoc2F2ZV9mcmFtZWJ1ZmZlcikgewotCQkJdmZyZWUoc2F2ZV9mcmFtZWJ1ZmZlcik7Ci0JCQlzYXZlX2ZyYW1lYnVmZmVyID0gTlVMTDsKLQkJfQotCQlicmVhazsKLQljYXNlIFBCT09LX1NMRUVQX05PVzoKLQkJY2hpcHNmYl9ibGFuaygxLCBwKTsKLQkJaWYgKHNhdmVfZnJhbWVidWZmZXIpCi0JCQltZW1jcHkoc2F2ZV9mcmFtZWJ1ZmZlciwgcC0+c2NyZWVuX2Jhc2UsIG5iKTsKLQkJYnJlYWs7Ci0JY2FzZSBQQk9PS19XQUtFOgotCQlpZiAoc2F2ZV9mcmFtZWJ1ZmZlcikgewotCQkJbWVtY3B5KHAtPnNjcmVlbl9iYXNlLCBzYXZlX2ZyYW1lYnVmZmVyLCBuYik7Ci0JCQl2ZnJlZShzYXZlX2ZyYW1lYnVmZmVyKTsKLQkJCXNhdmVfZnJhbWVidWZmZXIgPSBOVUxMOwotCQl9Ci0JCWNoaXBzZmJfYmxhbmsoMCwgcCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUEJPT0tfU0xFRVBfT0s7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwppbmRleCBlNGI5MWE0Li5jYmZmOTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwpAQCAtMTU2LDcgKzE1Niw2IEBACiBjb25maWcgRk9OVF83eDE0CiAJYm9vbCAiY29uc29sZSA3eDE0IGZvbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMpIiBpZiBGT05UUwogCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQotCWRlZmF1bHQgeSBpZiAhU1BBUkMzMiAmJiAhU1BBUkM2NCAmJiAhRk9OVFMKIAloZWxwCiAJICBDb25zb2xlIGZvbnQgd2l0aCBjaGFyYWN0ZXJzIGp1c3QgYSBiaXQgc21hbGxlciB0aGFuIHRoZSBkZWZhdWx0LgogCSAgSWYgdGhlIHN0YW5kYXJkIDh4MTYgZm9udCBpcyBhIGxpdHRsZSB0b28gYmlnIGZvciB5b3UsIHNheSBZLgpAQCAtMTk3LDggKzE5Niw4IEBACiAJICBzdGFuZGFyZCBmb250IGlzIHVucmVhZGFibGUgZm9yIHlvdSwgc2F5IFksIG90aGVyd2lzZSBzYXkgTi4KIAogY29uZmlnIEZPTlRfMTB4MTgKLQlib29sICJjb25zb2xlIDEweDE4IGZvbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMpIgotCWRlcGVuZHMgb24gRk9OVFMKKwlib29sICJjb25zb2xlIDEweDE4IGZvbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMpIiBpZiBGT05UUworCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQogCWhlbHAKIAkgIFRoaXMgaXMgYSBoaWdoIHJlc29sdXRpb24gY29uc29sZSBmb250IGZvciBtYWNoaW5lcyB3aXRoIHZlcnkKIAkgIGJpZyBsZXR0ZXJzLiBJdCBmaXRzIGJldHdlZW4gdGhlIHN1biAxMngyMiBhbmQgdGhlIG5vcm1hbCA4eDE2IGZvbnQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvZmJjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCmluZGV4IGIyMDlhZGIuLjlkZDBmYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9mYmNvbi5jCkBAIC0xNDIsNyArMTQyLDYgQEAKICNkZWZpbmUgQ1VSU09SX0RSQVdfREVMQVkJCSgxKQogCiAvKiAjIFZCTCBpbnRzIGJldHdlZW4gY3Vyc29yIHN0YXRlIGNoYW5nZXMgKi8KLSNkZWZpbmUgQVJNX0NVUlNPUl9CTElOS19SQVRFCQkoMTApCiAjZGVmaW5lIEFUQVJJX0NVUlNPUl9CTElOS19SQVRFCQkoNDIpCiAjZGVmaW5lIE1BQ19DVVJTT1JfQkxJTktfUkFURQkJKDMyKQogI2RlZmluZSBERUZBVUxUX0NVUlNPUl9CTElOS19SQVRFCSgyMCkKQEAgLTI4OCw3ICsyODcsNyBAQAogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIH0KIAotI2lmIChkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoSVJRX1ZTWU5DUFVMU0UpKSB8fCBkZWZpbmVkKENPTkZJR19BVEFSSSkgfHwgZGVmaW5lZChDT05GSUdfTUFDKQorI2lmIGRlZmluZWQoQ09ORklHX0FUQVJJKSB8fCBkZWZpbmVkKENPTkZJR19NQUMpCiBzdGF0aWMgaW50IGN1cnNvcl9ibGlua19yYXRlOwogc3RhdGljIGlycXJldHVybl90IGZiX3ZibF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewpAQCAtODc4LDExICs4NzcsNiBAQAogCX0KICNlbmRpZgkJCQkvKiBDT05GSUdfTUFDICovCiAKLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoSVJRX1ZTWU5DUFVMU0UpCi0JY3Vyc29yX2JsaW5rX3JhdGUgPSBBUk1fQ1VSU09SX0JMSU5LX1JBVEU7Ci0JaXJxcmVzID0gcmVxdWVzdF9pcnEoSVJRX1ZTWU5DUFVMU0UsIGZiX3ZibF9oYW5kbGVyLCBTQV9TSElSUSwKLQkJCSAgICAgImZyYW1lYnVmZmVyIHZibCIsIGluZm8pOwotI2VuZGlmCiAJLyogSW5pdGlhbGl6ZSB0aGUgd29yayBxdWV1ZS4gSWYgdGhlIGRyaXZlciBwcm92aWRlcyBpdHMKIAkgKiBvd24gd29yayBxdWV1ZSB0aGlzIG1lYW5zIGl0IHdpbGwgdXNlIHNvbWV0aGluZyBiZXNpZGVzIAogCSAqIGRlZmF1bHQgdGltZXIgdG8gZmxhc2ggdGhlIGN1cnNvci4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJzeXNmcy5jIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKaW5kZXggMjc3ZDczMy4uZGRjOTQ0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMKQEAgLTIyOCw4ICsyMjgsNiBAQAogCWlmIChsYXN0IC0gYnVmID49IGNvdW50KQogCQlyZXR1cm4gLUVJTlZBTDsKIAl2YXIueXJlc192aXJ0dWFsID0gc2ltcGxlX3N0cnRvdWwobGFzdCwgJmxhc3QsIDApOwotCXByaW50ayhLRVJOX0VSUiAiZmI6IHhyZXMgJWQgeXJlcyAlZFxuIiwgdmFyLnhyZXNfdmlydHVhbCwKLQkgICAgICAgdmFyLnlyZXNfdmlydHVhbCk7CiAKIAlpZiAoKGVyciA9IGFjdGl2YXRlKGZiX2luZm8sICZ2YXIpKSkKIAkJcmV0dXJuIGVycjsKQEAgLTI1OCw3ICsyNTYsNyBAQAogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwLCBpOwogCiAJaWYgKCFmYl9pbmZvLT5jbWFwLnJlZCB8fCAhZmJfaW5mby0+Y21hcC5ibHVlIHx8Ci0JICAgIGZiX2luZm8tPmNtYXAuZ3JlZW4gfHwgZmJfaW5mby0+Y21hcC50cmFuc3ApCisJICAgICFmYl9pbmZvLT5jbWFwLmdyZWVuIHx8ICFmYl9pbmZvLT5jbWFwLnRyYW5zcCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZmJfaW5mby0+Y21hcC5sZW47IGkrKykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9sb2dvL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwppbmRleCA2YmExMGUzLi4zZTljY2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vS2NvbmZpZwpAQCAtNjMsNSArNjMsMTAgQEAKIAlkZXBlbmRzIG9uIExPR08gJiYgU1VQRVJICiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBMT0dPX00zMlJfQ0xVVDIyNAorCWJvb2wgIjIyNC1jb2xvciBNMzJSIExpbnV4IGxvZ28iCisJZGVwZW5kcyBvbiBMT0dPICYmIE0zMlIKKwlkZWZhdWx0IHkKKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKaW5kZXggYjBkOTk1MC4uZDAyNDRjMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbG9nby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2xvZ28vTWFrZWZpbGUKQEAgLTEyLDYgKzEyLDcgQEAKIG9iai0kKENPTkZJR19MT0dPX1NVUEVSSF9NT05PKQkJKz0gbG9nb19zdXBlcmhfbW9uby5vCiBvYmotJChDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYpCQkrPSBsb2dvX3N1cGVyaF92Z2ExNi5vCiBvYmotJChDT05GSUdfTE9HT19TVVBFUkhfQ0xVVDIyNCkJKz0gbG9nb19zdXBlcmhfY2x1dDIyNC5vCitvYmotJChDT05GSUdfTE9HT19NMzJSX0NMVVQyMjQpCQkrPSBsb2dvX20zMnJfY2x1dDIyNC5vCiAKICMgSG93IHRvIGdlbmVyYXRlIGxvZ28ncwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ28uYwppbmRleCA3N2I2MjIwLi43ODhmYTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nby5jCisrKyBiL2RyaXZlcnMvdmlkZW8vbG9nby9sb2dvLmMKQEAgLTMzLDYgKzMzLDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbGludXhfbG9nbyBsb2dvX3N1cGVyaF9tb25vOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3VwZXJoX3ZnYTE2OwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBsaW51eF9sb2dvIGxvZ29fc3VwZXJoX2NsdXQyMjQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gbG9nb19tMzJyX2NsdXQyMjQ7CiAKIAogY29uc3Qgc3RydWN0IGxpbnV4X2xvZ28gKmZiX2ZpbmRfbG9nbyhpbnQgZGVwdGgpCkBAIC05Nyw2ICs5OCwxMCBAQAogCQkvKiBTdXBlckggTGludXggbG9nbyAqLwogCQlsb2dvID0gJmxvZ29fc3VwZXJoX2NsdXQyMjQ7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTE9HT19NMzJSX0NMVVQyMjQKKwkJLyogTTMyUiBMaW51eCBsb2dvICovCisJCWxvZ28gPSAmbG9nb19tMzJyX2NsdXQyMjQ7CisjZW5kaWYKIAl9CiAJcmV0dXJuIGxvZ287CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2xvZ28vbG9nb19tMzJyX2NsdXQyMjQucHBtIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fbTMycl9jbHV0MjI0LnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI5ODNjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9sb2dvL2xvZ29fbTMycl9jbHV0MjI0LnBwbQpAQCAtMCwwICsxLDEyOTIgQEAKK1AzCisjIENSRUFUT1I6IFRoZSBHSU1QJ3MgUE5NIEZpbHRlciBWZXJzaW9uIDEuMAorIworIyBOb3RlOiBob3cgdG8gY29udmVydCBwcG0gdG8gcG5tKGFzY2lpKS4KKyMgICAkIGNvbnZlcnQgLXBvc3Rlcml6ZSAyMjQgbTMyci5wcG0gLSB8IHBubTJhc2MgLWY1ID5sb2dvX20zMnJfY2x1dDIyNC5wcG0KKyMKKyMgY29udmVydCAtIGltYWdlbWFnaWNrOiAvdXNyL2Jpbi9jb252ZXJ0CisjIHBubTJhc2MgLSBwbm0gdG8gYXNjaWktcG5tIGZvcm1hdCBjb252ZXJ0ZXIKKyMgICBodHRwOi8vd3d3LmlzLmFpc3QuZ28uanAvZXRsY2RiL3V0aWwvcDJhLmh0bSNFbmdsaXNoCisKKzgwIDgwCisyNTUKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNDMgNDMgNDMgIDc1IDc1IDc1ICAyNyAyNyAyNyAgMiAyIDMKKyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNTkgNTkgNTkgIDEyMyAxMjMgMTIzICA2NyA2NyA2NyAgMjcgMjcgMjcKKyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMTAgNiAzICA1OSA1OSA1OSAgODAgODAgODAgIDQzIDQzIDQzICAyNyAyNyAyNworICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTAgNiAzICAxMCA2IDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMCA2IDMgIDExIDExIDExICAxMSAxMSAxMSAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyNyAyNyAyNyAgMTAgNiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxOSAxOSAxOSAgMiAyIDMgIDIgMiAzICA1MSA1MSA1MSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAxMjMgMTIzIDEyMyAgMTk2IDE5NiAxOTYgIDExNSAxMTUgMTE1ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICA3NSA3NSA3NSAgMTQxIDE0MSAxNDAKKyAgMTcyIDE3MiAxNzIgIDE5NiAxOTYgMTk2ICAxOTAgMTg5IDE4OCAgMiAyIDMgIDExIDExIDExCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyNyAyNyAyNyAgMTY0IDE2NCAxNjQgIDIyOCAyMjggMjI4ICAyMjEgMjIxIDIyMCAgMTAgNiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDE3MiAxNzIgMTcyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIyMSAyMjEgMjIwICAzNSAzNSAzNSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDE2NCAxNjQgMTY0ICAyMjggMjI4IDIyOCAgMzUgMzUgMzUgIDIzNiAyMzYgMjM2ICAyMzYgMjM2IDIzNgorICAyIDIgMyAgMTEgMTEgMTEgIDIgMiAzICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMiAyIDMgIDc1IDc1IDc1ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyMTIgMjEyIDIxMiAgMiAyIDMgIDUxIDUxIDUxICAxMSAxMSAxMSAgMjQ1IDI0NSAyNDUKKyAgMjcgMjcgMjcgIDgwIDgwIDgwICAxMCA2IDMgIDI1NCAyNTQgMjUyICAyIDIgMworICAyIDIgMyAgOTEgOTEgOTEgIDE5IDE5IDE5ICAyNTQgMjU0IDI1MiAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDE5NiAxOTYgMTk2ICAxMCA2IDMgIDIgMiAzICAxMSAxMSAxMSAgMTA3IDEwNyAxMDcKKyAgNDkgMzUgNSAgNTcgNDIgMTEgIDMxIDIyIDMgIDIzNiAyMzYgMjM2ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyNTQgMjU0IDI1MiAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDEwNyAxMDcgMTA3ICAyMjEgMjIxIDIyMCAgMiAyIDMgIDY0IDQzIDcgIDE5NCAxNDggMTAKKyAgMjM2IDE4OCAxMCAgMjI1IDE4MCAxMCAgMTcwIDEyNiAxMCAgMjM2IDE4OCAxMCAgOTQgODYgNjcKKyAgMiAyIDMgIDIgMiAzICAyMDQgMjA0IDIwNCAgMjM2IDIzNiAyMzYgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMjI4IDIyOCAyMjggIDE4MiAxMjYgMTAgIDIxOCAxNjQgOSAgMjM2IDE4OCAxMAorICAyMzYgMTg4IDEwICAyMzcgMjA0IDE0ICAyMzYgMjA1IDQwICAyNDYgMjE0IDQ4ICAyNDYgMjE0IDQ4CisgIDI0NSAxODkgMTEgIDIwOSAxNTYgOSAgMTk2IDE5NiAxOTYgIDExIDExIDExICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDE2NSAxMTQgMTAgIDIwNyAxNDggNyAgMjI5IDE3MiA5ICAyMzYgMTgwIDEwCisgIDIzNiAxOTYgMTEgIDIzNyAyMDQgMTQgIDI0MiAyMTggNDMgIDI0NiAyMTggNzUgIDI0NiAyMTggMTkKKyAgMjQ2IDIxMyAxMyAgMjQ2IDIxOCAxOSAgMjQ0IDIwNSAxMSAgMjE4IDE2NCA5ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMTY0IDEwOSA1ICAxOTIgMTMzIDcgIDIyNCAxNjUgOSAgMjM2IDE4MCAxMCAgMjM2IDE4OCAxMAorICAyMzYgMTk2IDExICAyNDEgMjEyIDQyICAyNDYgMjE4IDc1ICAyNDYgMjE4IDE5ICAyNDYgMjE4IDE5CisgIDI0NiAyMTggMTkgIDIzNiAxOTYgMTEgIDE1MCAxMTQgMTAgIDIyOSAxNzIgOSAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDE2NSAxMTQgMTAgIDIwMSAxNDIgNyAgMjI5IDE3MiA5ICAyNDIgMTgyIDExICAyMzYgMTg4IDEwCisgIDIzNyAyMDQgMTQgIDI0NSAyMTMgNjcgIDI0NiAyMTggMTkgIDI0NiAyMTMgMTMgIDI0NiAyMTMgMTMKKyAgMTU0IDExOSAxMCAgMjA3IDE0OCA3ICAyMTggMTY0IDkgIDIxNiAxNTYgOCAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMTIwIDc4IDMgIDIyNSAxODAgMTAgIDI0NSAxODkgMTEgIDIzNiAyMDUgNDAKKyAgMjQxIDIxMiA0MiAgMjQxIDIxMiAxNyAgMjM3IDIwNCAxNCAgMTQ4IDEwNyA5ICAxODIgMTI2IDEwCisgIDIxNiAxNTYgOCAgMjE4IDE2NCA5ICAyMDcgMTQ4IDcgIDgyIDcwIDQzICAyIDIgMworICAyIDIgMyAgMTIzIDEyMyAxMjMgIDM1IDM1IDM1ICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDEwIDYgMyAgMTgwIDE4MCAxODAgIDE1NiAxMDIgNSAgMTM1IDg4IDUgIDE0MiAxMDYgNworICAxMjYgOTggMTEgIDE2NSAxMTQgMTAgIDE4NSAxMzIgOSAgMjA3IDE0OCA3ICAyMTUgMTUwIDEzCisgIDE5OSAxNDAgOCAgMTg4IDE0OCA3MSAgMTk2IDE5NiAxOTYgIDE5MCAxODkgMTg4ICAyIDIgMworICAyIDIgMyAgMTEgMTEgMTEgIDEzMiAxMzIgMTMyICA3NSA3NSA3NSAgMiAyIDMKKyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAxMCA2IDMgIDE5MCAxODkgMTg4ICAxOTAgMTg5IDE4OCAgMTUxIDk3IDUgIDE5MiAxMzMgNworICAyMDcgMTQ4IDcgIDIwNiAxNDIgOCAgMTk5IDE0MCA4ICAxODAgMTIxIDcgIDE4MCAxMzIgMzEKKyAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAyMTIgMjEyIDIxMiAgMjEyIDIxMiAyMTIgIDEwNyAxMDcgMTA3CisgIDIgMiAzICAyIDIgMyAgOTkgOTkgOTkgIDUxIDUxIDUxICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzCisgIDIgMiAzICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAxMzYgOTUgNworICAxNTEgOTcgNSAgMTUxIDk3IDUgIDE1MSA5NyA1ICAxODMgMTU2IDkxICAxOTAgMTg5IDE4OAorICAxOTAgMTg5IDE4OCAgMjI4IDIyOCAyMjggIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjIxIDIyMSAyMjAKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAxMCA2IDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgNzUgNzUgNzUgIDI0NSAyNDUgMjQ1ICAxOTYgMTk2IDE5NiAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4CisgIDE5MCAxODkgMTg4ICAxOTYgMTk2IDE5NiAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4ICAyMDQgMjA0IDIwNAorICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMzUgMzUgMzUgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyNyAyNyAyNyAgMiAyIDMKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMTkwIDE4OSAxODggIDE5MCAxODkgMTg4CisgIDE5MCAxODkgMTg4ICAxOTAgMTg5IDE4OCAgMTkwIDE4OSAxODggIDIxMiAyMTIgMjEyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDEwIDYgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAxMzIgMTMyIDEzMgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMzYgMjM2IDIzNiAgMTk2IDE5NiAxOTYKKyAgMTkwIDE4OSAxODggIDIwNCAyMDQgMjA0ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgODAgODAgODAgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTIgMjEyIDIxMiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMDQgMjA0IDIwNCAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDIzNiAyMzYgMjM2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDE2NCAxNjQgMTY0ICAyMTIgMjEyIDIxMgorICAyMzYgMjM2IDIzNiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyMzYgMjM2IDIzNiAgMjIxIDIyMSAyMjAKKyAgMjIxIDIyMSAyMjAgIDIyOCAyMjggMjI4ICAyNDUgMjQ1IDI0NSAgMjQ1IDI0NSAyNDUgIDI0NSAyNDUgMjQ1CisgIDIzNiAyMzYgMjM2ICAyMjEgMjIxIDIyMCAgMjEyIDIxMiAyMTIgIDIwNCAyMDQgMjA0ICAyMDQgMjA0IDIwNAorICAxOTYgMTk2IDE5NiAgMjA0IDIwNCAyMDQgIDU5IDU5IDU5ICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjcgMjcgMjcgIDE3MiAxNzIgMTcyICAyMTIgMjEyIDIxMgorICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjI4IDIyOCAyMjgKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjIxIDIyMSAyMjAgIDIwNCAyMDQgMjA0ICAxOTYgMTk2IDE5NgorICAxOTYgMTk2IDE5NiAgMTk2IDE5NiAxOTYgIDIyOCAyMjggMjI4ICAxOSAxOSAxOSAgMiAyIDMKKyAgODAgODAgODAgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMSAxMSAxMSAgMiAyIDMgIDE2NCAxNjQgMTY0ICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjM2IDIzNiAyMzYgIDIxMiAyMTIgMjEyICAxOTYgMTk2IDE5NiAgMjQ1IDI0NSAyNDUgIDIgMiAzCisgIDIgMiAzICAxMSAxMSAxMSAgNTEgNTEgNTEgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDg2IDg2IDgzCisgIDIgMiAzICAyNyAyNyAyNyAgMjM2IDIzNiAyMzYgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIxMiAyMTIgMjEyICAxOTYgMTk2IDE5NiAgOTEgOTEgOTEKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIyMSAyMjEgMjIwICAyNDUgMjQ1IDI0NQorICAyIDIgMyAgMTEgMTEgMTEgIDQzIDQzIDQzICAxOSAxOSAxOSAgMTAgNiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgODAgODAgODAgIDIgMiAzCisgIDIgMiAzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgNDMgNDMgNDMgIDI3IDI3IDI3ICA4MCA4MCA4MCAgMTkgMTkgMTkgIDgwIDgwIDgwCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIzNiAyMzYgMjM2ICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAxMSAxMSAxMSAgMTEgMTEgMTEgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMiAyIDMgIDY3IDY3IDY3ICAyIDIgMyAgMTkgMTkgMTkKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjI4IDIyOCAyMjggIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAxMSAxMSAxMSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIgMiAzICAxMCA2IDMgIDExIDExIDExICAyIDIgMyAgMjI4IDIyOCAyMjgKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDI3IDI3IDI3ICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMTEgMTEgMTEgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMiAyIDMKKyAgMiAyIDMgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNDUgMjQ1IDI0NSAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMworICAyIDIgMyAgMTkgMTkgMTkgIDIgMiAzICAxOSAxOSAxOSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMjU0IDI1NCAyNTIKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDQzIDQzIDQzICAyIDIgMyAgNDMgNDMgNDMgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzICAyNTQgMjU0IDI1MiAgMTcgMTEgMjMzCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMTcgMTEgMjMzCisgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMKKyAgMTcgMTEgMjMzICAxNyAxMSAyMzMgIDE3IDExIDIzMyAgMTcgMTEgMjMzICAxNyAxMSAyMzMKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNzUgNzUgNzUgIDIgMiAzICA5OSA5OSA5OSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDE3IDExIDIzMyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAxNyAxMSAyMzMgIDE3IDExIDIzMworICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDc1IDc1IDc1CisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMSAxMSAxMSAgMTA3IDEwNyAxMDcgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMzYgMjM2IDIzNiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDE5IDE5IDE5CisgIDExIDExIDExICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyIDIgMyAgMTEgMTEgMTEKKyAgMTQwIDEwMiAzICAxMSAxMSAxMSAgMTAgNiAzICA2NyA2NyA2NyAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDIyOCAyMjggMjI4ICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMiAyIDMgIDQzIDQzIDQzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICA2NyA2NyA2NyAgMTEgMTEgMTEgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTg1IDEzMiA5ICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDQ5IDM1IDUgIDIgMiAzICAyMjggMjI4IDIyOAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjI4IDIyOCAyMjggIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDIzOCAyMjIgIDIzMiAxODkgOTQKKyAgMjI2IDE4NiA5OSAgNDMgNDMgNDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgNTkgNTkgNTkgIDIgMiAzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE2IDE1NiA4ICAyMzYgMTgwIDIyCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDQ5IDM1IDUgIDExIDExIDExCisgIDIxMiAyMTIgMjEyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjkgMTcyIDkgIDI0NiAyMTggMTkKKyAgMjQ2IDIxOCAxOSAgNDEgMjcgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDE5IDE5IDE5ICAyNyAyNyAyNyAgMTk2IDE1NCAxNAorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDE5OSAxNDAgOCAgMjI5IDE3MiA5ICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NCAxOTYgMTAgIDIgMiAzCisgIDIgMiAzICAxMTUgMTE1IDExNSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyMjggMjI4IDIyOCAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyMjQgMTY1IDkgIDI0NSAxODkgMTEKKyAgMjM2IDE5NiAxMSAgMTkgMTkgMTkgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDIzNiAxOTYgMTEKKyAgMjQ0IDIwNSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTgyIDEyNiAxMCAgMjA5IDE1NiA5ICAyMTUgMTUwIDEzCisgIDE5MyAxNDAgMTAgIDIwNyAxNDggMjQgIDIxNiAxNTYgOCAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyMDkgMTU2IDkKKyAgMiAyIDMgIDIgMiAzICA0MyA0MyA0MyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjM2IDIzNiAyMzYgIDIxNiAxNTYgOCAgMjQ1IDE4OSAxMQorICAyMjkgMTcyIDkgIDY0IDQzIDcgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMjA3IDE0OCA3ICAyMzYgMTg4IDEwCisgIDI0NSAxODkgMTEgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE4MCAxMjEgNyAgMjE2IDE1NiA4ICAyNDIgMTgyIDExICAyMzYgMTgwIDEwCisgIDIyOSAxNzIgOSAgMjQyIDE4MiAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyMzcgMjA0IDE0CisgIDE3MCAxMjYgMTAgIDIgMiAzICAyIDIgMyAgMTEgMTEgMTEgIDIzNiAyMzYgMjM2CisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyMDQgMjA0IDIwNCAgMTk2IDE5NiAxOTYgIDIxNiAxNTYgOCAgMjM2IDE4MCAxMAorICAyMjQgMTY1IDkgIDE4MiAxMjYgMTAgIDczIDQ4IDYgIDIgMiAzICAyIDIgMworICAyIDIgMyAgNDEgMjcgMyAgMTk5IDE0MCA4ICAyMjkgMTcyIDkgIDIzNiAxODAgMTAKKyAgMjQ1IDE4OSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTg1IDEzMiA5ICAyMjkgMTcyIDkgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDIyNiAxODggMTEgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDExIDExIDExCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAxOTYgMTk2IDE5NiAgMTk2IDE5NiAxOTYgIDIxNSAxNTAgMTMgIDIzNiAxODAgMTAKKyAgMjI5IDE3MiA5ICAyMDEgMTQyIDcgIDE4NSAxMzIgOSAgMTgwIDEyMSA3ICAxNzMgMTIwIDEwCisgIDE4MCAxMjEgNyAgMTkyIDEzMyA3ICAyMjkgMTcyIDkgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTgwIDEyNiA0NyAgMjI0IDE2NSA5ICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyMzYgMTg4IDEwICAxOTMgMTQwIDEwICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyMTIgMjEyIDIxMiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNDUgMjQ1IDI0NQorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyMDQgMjA0IDIwNCAgMTk2IDE5NiAxOTYgIDE5OSAxNDAgOCAgMjI5IDE3MiA5CisgIDIzNiAxODAgMTAgIDIxOCAxNjQgOSAgMjE1IDE1MCAxMyAgMjA3IDE0OCA3ICAyMDcgMTQ4IDcKKyAgMjE2IDE1NiA4ICAyMjkgMTcyIDkgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMTg1IDEzMiA5ICAyMTYgMTU2IDggIDI0MiAxODIgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDIzNiAxOTYgMTEgIDE5IDE5IDE5ICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjQ1IDI0NSAyNDUgIDIyMSAyMjEgMjIwICAxOTYgMTk2IDE5NiAgMTg1IDEzMiA5ICAyMjkgMTcyIDkKKyAgMjQyIDE4MiAxMSAgMjI5IDE3MiA5ICAyMjQgMTY1IDkgIDIxOCAxNjQgOSAgMjI0IDE2NSA5CisgIDIyOSAxNzIgOSAgMjM2IDE4MCAxMCAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyMzYgMTgwIDIyICAyNDIgMTgyIDExICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMzYgMTgwIDIyICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyMzYgMTg4IDEwICAyMjUgMTgwIDEwICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDExIDExIDExICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIyMSAyMjEgMjIwICAxOSAxOSAxOSAgMTg1IDEzMiA5ICAyMjQgMTY1IDkKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjM2IDE4MCAxMCAgMjM2IDE4MCAxMAorICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDE5NiAxNTQgMTQKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIwNyAxNDggNyAgMjM2IDE4MCAyMiAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjM3IDIwNCAxNCAgMTM1IDg4IDUgIDIgMiAzCisgIDI3IDI3IDI3ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICA2NyA2NyA2NyAgMTkgMTMgMyAgMTg1IDEzMiA5ICAyMjkgMTcyIDkKKyAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjM2IDE4MCAyMiAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDIzNiAxODggMTAgIDIyNiAxODggMTEgIDEwNCA4MyA0OAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjQ1IDI0NSAyNDUKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1CisgIDI1NCAyNTQgMjUyICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyIDIgMyAgMiAyIDMgIDU2IDM4IDUgIDE4NSAxMzIgOSAgMjI5IDE3MiA5CisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExCisgIDIyOSAxNzIgOSAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE4MiAxMjYgMTAgIDIxNSAxNTAgMTMgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDIzNiAxOTYgMTEgIDIxNiAxNTYgOAorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyCisgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI0NSAyNDUgMjQ1ICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDc1IDU0IDMgIDE4MiAxMjYgMTAgIDIyOSAxNzIgOQorICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjI5IDE3MiA5CisgIDIwNyAxNDggMjQgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAxOTIgMTMzIDcgIDIyOSAxNzIgOSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjI1IDE4MCAxMCAgMjI0IDE2NSA5CisgIDEwNyA2OSA1ICAyNDUgMjQ1IDI0NSAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MgorICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDI1NCAyNTQgMjUyICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIKKyAgMjU0IDI1NCAyNTIgIDIzNiAyMzYgMjM2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgOTEgNjcgOSAgMTgyIDEyNiAxMCAgMjI5IDE3MiA5CisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyMTYgMTU2IDggIDE4MCAxMjYgNDcKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIwNiAxNDIgOCAgMjI0IDE2NSA5ICAyNDUgMTg5IDExICAyNDIgMTgyIDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyNDIgMTgyIDExICAyMTYgMTU2IDgKKyAgMTU2IDEwMiA1ICAxOSAxMyAzICA0MyA0MyA0MyAgMTk2IDE5NiAxOTYgIDI1NCAyNTQgMjUyCisgIDI0NSAyNDUgMjQ1ICAyNTQgMjU0IDI1MiAgMjU0IDI1NCAyNTIgIDIwNCAyMDQgMjA0ICA1MSA1MSA1MQorICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICA5NSA2MiA1ICAxODUgMTMyIDkgIDIyOSAxNzIgOQorICAyNDIgMTgyIDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjM2IDE4MCAyMiAgMjE2IDE1NiA4ICAyMDYgMTQyIDggIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE5MiAxMzMgNyAgMjE1IDE1MCAxMyAgMjI5IDE3MiA5ICAyMjkgMTcyIDkKKyAgMjM2IDE4MCAxMCAgMjM2IDE4MCAyMiAgMjQyIDE4MiAxMSAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMQorICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExICAyNDUgMTg5IDExCisgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDIyOSAxNzIgOSAgMjE2IDE1NiA4CisgIDE1NiAxMDIgNSAgODMgNTQgNiAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMTE1IDczIDMgIDE4NSAxMzIgOSAgMjI5IDE3MiA5CisgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEgIDI0NSAxODkgMTEKKyAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjI5IDE3MiA5ICAyMjkgMTcyIDkgIDIxNiAxNTYgOAorICAxODAgMTIxIDcgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDE4MCAxMjEgNyAgMTgyIDEyNiAxMCAgMTkyIDEzMyA3ICAxOTkgMTQwIDgKKyAgMjA3IDE0OCA3ICAyMTUgMTUwIDEzICAyMTYgMTU2IDggIDIyNCAxNjUgOSAgMjI5IDE3MiA5CisgIDIzNiAxODAgMjIgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEgIDI0NSAxODkgMTEgIDI0MiAxODIgMTEKKyAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMSAgMjI5IDE3MiA5ICAxOTkgMTQwIDgKKyAgMTUxIDk3IDUgIDEwMSA2NyA3ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICAxMTUgNzMgMyAgMTgwIDEyMSA3ICAyMTYgMTU2IDgKKyAgMjM2IDE4MCAyMiAgMjQyIDE4MiAxMSAgMjQ1IDE4OSAxMSAgMjQ1IDE4OSAxMSAgMjQyIDE4MiAxMQorICAyMzYgMTgwIDEwICAyMjQgMTY1IDkgIDIxNSAxNTAgMTMgIDIwNiAxNDIgOCAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDE1NiAxMDIgNSAgMTY0IDEwOSA1ICAxNzIgMTE0IDUgIDE4MCAxMjEgNyAgMTgwIDEyMSA3CisgIDE5MiAxMzMgNyAgMjAxIDE0MiA3ICAyMTYgMTU2IDggIDIyNCAxNjUgOSAgMjM2IDE4MCAyMgorICAyNDUgMTg5IDExICAyNDIgMTgyIDExICAyMjkgMTcyIDkgIDIwMSAxNDIgNyAgMTcyIDExNCA1CisgIDEyNSA4MyA1ICA4MyA1NCA2ICAyIDIgMyAgMiAyIDMgIDIgMiAzCisgIDIgMiAzICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMworICAyIDIgMyAgMiAyIDMgIDIgMiAzICAyIDIgMyAgMiAyIDMKKyAgMiAyIDMgIDIgMiAzICA5MSA1OCA1ICAxNTYgMTAyIDUgIDE5MiAxMzMgNworICAyMTYgMTU2IDggIDIyOSAxNzIgOSAgMjM2IDE4MCAxMCAgMjM2IDE4MCAxMCAgMjI5IDE3MiA5CisgIDIxNSAxNTAgMTMgIDE5OSAxNDAgOCAgMTY0IDEwOSA1ICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMTIwIDc4IDMgIDEzMiA4MiAzCisgIDE1MSA5NyA1ICAxNTcgMTA2IDcgIDE4MCAxMjEgNyAgMTg1IDEzMiA5ICAxOTMgMTQwIDEwCisgIDIwNyAxNDggNyAgMjA3IDE0OCA3ICAxOTIgMTMzIDcgIDE3MiAxMTQgNSAgMTMyIDgyIDMKKyAgMTAxIDY3IDcgIDQxIDI3IDMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDczIDQ4IDYgIDE0MyA5MCAzICAxODAgMTIxIDcKKyAgMTkyIDEzMyA3ICAyMDcgMTQ4IDcgIDIwNyAxNDggNyAgMjAxIDE0MiA3ICAxODUgMTMyIDkKKyAgMTczIDEyMCAxMCAgMTM2IDk1IDcgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDkxIDU4IDUgIDEyNSA4MyA1ICAxMzUgODggNQorICAxNDQgOTUgNyAgMTUxIDk3IDUgIDEzMiA4MiAzICAxMTUgNzMgMyAgOTUgNjIgNQorICA2NCA0MyA3ICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICA2NCA0MyA3ICA5MSA1OCA1ICAxNTEgOTcgNQorICAxNTcgMTA2IDcgIDE3MiAxMTQgNSAgMTcyIDExNCA1ICAxNjQgMTA5IDUgIDE1MSA5NyA1CisgIDg1IDU5IDYgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDczIDQ4IDYKKyAgOTEgNTggNSAgOTUgNjIgNSAgOTUgNjIgNSAgOTEgNTggNSAgNTYgMzggNQorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICA4MyA1NCA2CisgIDEwNyA2OSA1ICAxMzIgODIgMyAgMTI1IDgzIDUgIDEwMSA2NyA3ICA3MSA0NyAzMQorICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKKyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMyAgMjE1IDE1MCAxMworICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzICAyMTUgMTUwIDEzCisgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMgIDIxNSAxNTAgMTMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21pc2MuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX21pc2MuYwppbmRleCA3NmZkM2E1Li5hMThkZDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9taXNjLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfbWlzYy5jCkBAIC0xOTcsMTAgKzE5Nyw3IEBACiAJREJHKF9fRlVOQ1RJT05fXykKIAogCWh3LT5TRVFbMF0gPSAweDAwOwotCWlmIChmd2lkdGggPT0gOSkKLQkJaHctPlNFUVsxXSA9IDB4MDA7Ci0JZWxzZQotCQlody0+U0VRWzFdID0gMHgwMTsJLyogb3IgMHgwOSAqLworCWh3LT5TRVFbMV0gPSAweDAxOwkvKiBvciAweDA5ICovCiAJaHctPlNFUVsyXSA9IDB4MEY7CS8qIGJpdHBsYW5lcyAqLwogCWh3LT5TRVFbM10gPSAweDAwOwogCWh3LT5TRVFbNF0gPSAweDBFOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbGF0aW51bWZiLmMgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwppbmRleCAzZGQxZGUxLi5iMDA4ODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BsYXRpbnVtZmIuYwpAQCAtNTIzLDcgKzUyMyw3IEBACiAjZGVmaW5lIGludmFsaWRhdGVfY2FjaGUoYWRkcikKICNlbmRpZgogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwbGF0aW51bWZiX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIG9kZXYsIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2gpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbGF0aW51bWZiX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UqIG9kZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqZHAgPSBvZGV2LT5ub2RlOwogCXN0cnVjdCBmYl9pbmZvCQkqaW5mbzsKQEAgLTY0NywxMiArNjQ3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfbWF0Y2ggcGxhdGludW1mYl9tYXRjaFtdID0gCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwbGF0aW51bWZiX21hdGNoW10gPSAKIHsKIAl7CiAJLm5hbWUgCQk9ICJwbGF0aW51bSIsCi0JLnR5cGUJCT0gT0ZfQU5ZX01BVENILAotCS5jb21wYXRpYmxlCT0gT0ZfQU5ZX01BVENILAogCX0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9weGFmYi5jIGIvZHJpdmVycy92aWRlby9weGFmYi5jCmluZGV4IDgxNWZiYzguLjE2ZTM3YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcHhhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3B4YWZiLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2JpdGZpZWxkLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcHhhZmIuaD4KQEAgLTQ2MCw3ICs0NjEsNyBAQAogICAgICAgICAgKiBzcGVlZHMgKi8KIAogCXBjZCA9ICh1bnNpZ25lZCBsb25nIGxvbmcpZ2V0X2xjZGNsa19mcmVxdWVuY3lfMTBraHooKSAqIHBpeGNsb2NrOwotCXBjZCAvPSAxMDAwMDAwMDAgKiAyOworCWRvX2RpdihwY2QsIDEwMDAwMDAwMCAqIDIpOwogCS8qIG5vIG5lZWQgZm9yIHRoaXMsIHNpbmNlIHdlIHNob3VsZCBzdWJ0cmFjdCAxIGFueXdheS4gdGhleSBjYW5jZWwgKi8KIAkvKiBwY2QgKz0gMTsgKi8gLyogbWFrZSB1cCBmb3IgaW50ZWdlciBtYXRoIHRydW5jYXRpb25zICovCiAJcmV0dXJuICh1bnNpZ25lZCBpbnQpcGNkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9zMWQxM3h4eGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYwppbmRleCA3ODlkZTEzLi4zODQ4YmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3MxZDEzeHh4ZmIuYwpAQCAtNjcsMTIgKzY3LDE4IEBACiBzdGF0aWMgaW5saW5lIHU4CiBzMWQxM3h4eGZiX3JlYWRyZWcoc3RydWN0IHMxZDEzeHh4ZmJfcGFyICpwYXIsIHUxNiByZWdubykKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisJcmVnbm89KChyZWdubyAmIDEpID8gKHJlZ25vICYgfjFMKSA6IChyZWdubyArIDEpKTsKKyNlbmRpZgogCXJldHVybiByZWFkYihwYXItPnJlZ3MgKyByZWdubyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogczFkMTN4eHhmYl93cml0ZXJlZyhzdHJ1Y3QgczFkMTN4eHhmYl9wYXIgKnBhciwgdTE2IHJlZ25vLCB1OCB2YWx1ZSkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisJcmVnbm89KChyZWdubyAmIDEpID8gKHJlZ25vICYgfjFMKSA6IChyZWdubyArIDEpKTsKKyNlbmRpZgogCXdyaXRlYih2YWx1ZSwgcGFyLT5yZWdzICsgcmVnbm8pOwogfQogCkBAIC0yNTksNyArMjY1LDExIEBACiAJCQlkYmcoInMxZDEzeHh4ZmJfc2V0Y29scmVnOiBwc2V1ZG8gJWQsIHZhbCAlMDh4XG4iLAogCQkJCSAgICByZWdubywgcHNldWRvX3ZhbCk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJKQorCQkJKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gY3B1X3RvX2xlMTYocHNldWRvX3ZhbCk7CisjZWxzZQogCQkJKCh1MzIgKilpbmZvLT5wc2V1ZG9fcGFsZXR0ZSlbcmVnbm9dID0gcHNldWRvX3ZhbDsKKyNlbmRpZgogCiAJCQlicmVhazsKIAkJY2FzZSBGQl9WSVNVQUxfUFNFVURPQ09MT1I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IDhmYWRjZGEuLmY0NjMzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC0yMTEzLDcgKzIxMTMsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICJzdGF0ZTogJXVcbiIsIHN0YXRlKTsKIAogCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKLQlmYl9zZXRfc3VzcGVuZChpbmZvLCBzdGF0ZSk7CisJZmJfc2V0X3N1c3BlbmQoaW5mbywgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7CiAJc2F2YWdlX2Rpc2FibGVfbW1pbyhwYXIpOwogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby92ZXNhZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmVzYWZiLmMKaW5kZXggZjMwNjliMC4uOWVkMWE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby92ZXNhZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3Zlc2FmYi5jCkBAIC0zODksMTAgKzM4OSwxMSBAQAogCQl1bnNpZ25lZCBpbnQgdGVtcF9zaXplID0gc2l6ZV90b3RhbDsKIAkJLyogRmluZCB0aGUgbGFyZ2VzdCBwb3dlci1vZi10d28gKi8KIAkJd2hpbGUgKHRlbXBfc2l6ZSAmICh0ZW1wX3NpemUgLSAxKSkKLSAgICAgICAgICAgICAgICAJdGVtcF9zaXplICY9ICh0ZW1wX3NpemUgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qIFRyeSBhbmQgZmluZCBhIHBvd2VyIG9mIHR3byB0byBhZGQgKi8KLQkJd2hpbGUgKHRlbXBfc2l6ZSAmJiBtdHJyX2FkZCh2ZXNhZmJfZml4LnNtZW1fc3RhcnQsIHRlbXBfc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwgMSk9PS1FSU5WQUwpIHsKKwkJCXRlbXBfc2l6ZSAmPSAodGVtcF9zaXplIC0gMSk7CisKKwkJLyogVHJ5IGFuZCBmaW5kIGEgcG93ZXIgb2YgdHdvIHRvIGFkZCAqLworCQl3aGlsZSAodGVtcF9zaXplID4gUEFHRV9TSVpFICYmCisJCQltdHJyX2FkZCh2ZXNhZmJfZml4LnNtZW1fc3RhcnQsIHRlbXBfc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwgMSk9PS1FSU5WQUwpIHsKIAkJCXRlbXBfc2l6ZSA+Pj0gMTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCBiNDYwOTI3Li44YTljNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC01MTYsNiArNTE2LDcgQEAKIAlzdHJ1Y3QgdzFfcmVnX251bSAqdG1wOwogCWludCBmYW1pbHlfZm91bmQgPSAwOwogCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwl1NjQgcm5fbGUgPSBjcHVfdG9fbGU2NChybik7CiAKIAlkZXYgPSB3MV9zZWFyY2hfbWFzdGVyKGRhdGEpOwogCWlmICghZGV2KSB7CkBAIC01NDQsMTAgKzU0NSw4IEBACiAJCXNsYXZlX2NvdW50Kys7CiAJfQogCi0Jcm4gPSBjcHVfdG9fbGU2NChybik7Ci0KIAlpZiAoc2xhdmVfY291bnQgPT0gZGV2LT5zbGF2ZV9jb3VudCAmJgotCQlybiAmJiAoKGxlNjRfdG9fY3B1KHJuKSA+PiA1NikgJiAweGZmKSA9PSB3MV9jYWxjX2NyYzgoKHU4ICopJnJuLCA3KSkgeworCQlybiAmJiAoKHJuID4+IDU2KSAmIDB4ZmYpID09IHcxX2NhbGNfY3JjOCgodTggKikmcm5fbGUsIDcpKSB7CiAJCXcxX2F0dGFjaF9zbGF2ZV9kZXZpY2UoZGV2LCB0bXApOwogCX0KIApAQCAtNjQ2LDcgKzY0NSw3IEBACiAJd2hpbGUgKCFjb250cm9sX25lZWRzX2V4aXQgfHwgaGF2ZV90b193YWl0KSB7CiAJCWhhdmVfdG9fd2FpdCA9IDA7CiAKLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHcxX3RpbWVvdXQgKiAxMDAwKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCkBAIC03MjUsNyArNzI0LDcgQEAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAKIAl3aGlsZSAoIXRlc3RfYml0KFcxX01BU1RFUl9ORUVEX0VYSVQsICZkZXYtPmZsYWdzKSkgewotCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAkJbXNsZWVwX2ludGVycnVwdGlibGUodzFfdGltZW91dCAqIDEwMDApOwogCiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IGE3YzBjYzMuLjVkMGM0YmUgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtMjksNiArMjksNyBAQAogY29uZmlnIEVYVDJfRlNfUE9TSVhfQUNMCiAJYm9vbCAiRXh0MiBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKIAlkZXBlbmRzIG9uIEVYVDJfRlNfWEFUVFIKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJaGVscAogCSAgUG9zaXggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAogCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgpAQCAtNTAsNiArNTEsMjMgQEAKIAkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGEgc2VjdXJpdHkgbW9kdWxlIHRoYXQgcmVxdWlyZXMgdXNpbmcKIAkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGZpbGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KIAorY29uZmlnIEVYVDJfRlNfWElQCisJYm9vbCAiRXh0MiBleGVjdXRlIGluIHBsYWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFWFQyX0ZTCisJaGVscAorCSAgRXhlY3V0ZSBpbiBwbGFjZSBjYW4gYmUgdXNlZCBvbiBtZW1vcnktYmFja2VkIGJsb2NrIGRldmljZXMuIElmIHlvdQorCSAgZW5hYmxlIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCB0byBtb3VudCBibG9jayBkZXZpY2VzIHdoaWNoIGFyZQorCSAgY2FwYWJsZSBvZiB0aGlzIGZlYXR1cmUgd2l0aG91dCB1c2luZyB0aGUgcGFnZSBjYWNoZS4KKworCSAgSWYgeW91IGRvIG5vdCB1c2UgYSBibG9jayBkZXZpY2UgdGhhdCBpcyBjYXBhYmxlIG9mIHVzaW5nIHRoaXMsCisJICBvciBpZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRlNfWElQCisjIGV4ZWN1dGUgaW4gcGxhY2UKKwlib29sCisJZGVwZW5kcyBvbiBFWFQyX0ZTX1hJUAorCWRlZmF1bHQgeQorCiBjb25maWcgRVhUM19GUwogCXRyaXN0YXRlICJFeHQzIGpvdXJuYWxsaW5nIGZpbGUgc3lzdGVtIHN1cHBvcnQiCiAJaGVscApAQCAtOTcsNiArMTE1LDcgQEAKIGNvbmZpZyBFWFQzX0ZTX1BPU0lYX0FDTAogCWJvb2wgIkV4dDMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCiAJZGVwZW5kcyBvbiBFWFQzX0ZTX1hBVFRSCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIFBvc2l4IEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKIAkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KQEAgLTIyNCw2ICsyNDMsNyBAQAogY29uZmlnIFJFSVNFUkZTX0ZTX1BPU0lYX0FDTAogCWJvb2wgIlJlaXNlckZTIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgogCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJaGVscAogCSAgUG9zaXggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAogCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgpAQCAtMjU3LDYgKzI3Nyw3IEBACiBjb25maWcgSkZTX1BPU0lYX0FDTAogCWJvb2wgIkpGUyBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKIAlkZXBlbmRzIG9uIEpGU19GUworCXNlbGVjdCBGU19QT1NJWF9BQ0wKIAloZWxwCiAJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCiAJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCkBAIC0zMDEsOCArMzIyLDcgQEAKICMgCU5ldmVyIHVzZSB0aGlzIHN5bWJvbCBmb3IgaWZkZWZzLgogIwogCWJvb2wKLQlkZXBlbmRzIG9uIEVYVDJfRlNfUE9TSVhfQUNMIHx8IEVYVDNfRlNfUE9TSVhfQUNMIHx8IEpGU19QT1NJWF9BQ0wgfHwgUkVJU0VSRlNfRlNfUE9TSVhfQUNMIHx8IE5GU0RfVjQKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IG4KIAogc291cmNlICJmcy94ZnMvS2NvbmZpZyIKIApAQCAtMzM5LDYgKzM1OSwxOSBAQAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hldGhlciB5b3UgbmVlZCBpdCwgdGhlbiB5b3UgZG9uJ3QgbmVlZCBpdDoKIAkgIGFuc3dlciBOLgogCitjb25maWcgSU5PVElGWQorCWJvb2wgIklub3RpZnkgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgaW5vdGlmeSBzdXBwb3J0IGFuZCB0aGUgL2Rldi9pbm90aWZ5IGNoYXJhY3RlcgorCSAgZGV2aWNlLiAgSW5vdGlmeSBpcyBhIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0gYW5kIGEKKwkgIHJlcGxhY2VtZW50IGZvciBkbm90aWZ5LiAgSW5vdGlmeSBmaXhlcyBudW1lcm91cyBzaG9ydGNvbWluZ3MgaW4KKwkgIGRub3RpZnkgYW5kIGludHJvZHVjZXMgc2V2ZXJhbCBuZXcgZmVhdHVyZXMuICBJdCBhbGxvd3MgbW9uaXRvcmluZworCSAgb2YgYm90aCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdmlhIGEgc2luZ2xlIG9wZW4gZmQuICBNdWx0aXBsZSBmaWxlCisJICBldmVudHMgYXJlIHN1cHBvcnRlZC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKwogY29uZmlnIFFVT1RBCiAJYm9vbCAiUXVvdGEgc3VwcG9ydCIKIAloZWxwCkBAIC03MTcsNiArNzUwLDEyIEBACiAJYm9vbCAiL3Byb2Mva2NvcmUgc3VwcG9ydCIgaWYgIUFSTQogCWRlcGVuZHMgb24gUFJPQ19GUyAmJiBNTVUKIAorY29uZmlnIFBST0NfVk1DT1JFCisgICAgICAgIGJvb2wgIi9wcm9jL3ZtY29yZSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIFBST0NfRlMgJiYgRU1CRURERUQgJiYgRVhQRVJJTUVOVEFMICYmIENSQVNIX0RVTVAKKyAgICAgICAgaGVscAorICAgICAgICBFeHBvcnRzIHRoZSBkdW1wIGltYWdlIG9mIGNyYXNoZWQga2VybmVsIGluIEVMRiBmb3JtYXQuCisKIGNvbmZpZyBTWVNGUwogCWJvb2wgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGlmIEVNQkVEREVECiAJZGVmYXVsdCB5CkBAIC0xMDEzLDI2ICsxMDUyLDE4IEBACiAJICBJZiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZiB0aGUKIAkgIG1lc3NhZ2VzIGF0IGRlYnVnIGxldmVsIDEgd2hpbGUgdGhlIG1pc2JlaGF2aW91ciB3YXMgb2NjdXJyaW5nLgogCi1jb25maWcgSkZGUzJfRlNfTkFORAotCWJvb2wgIkpGRlMyIHN1cHBvcnQgZm9yIE5BTkQgZmxhc2giCitjb25maWcgSkZGUzJfRlNfV1JJVEVCVUZGRVIKKwlib29sICJKRkZTMiB3cml0ZS1idWZmZXJpbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEpGRlMyX0ZTCi0JZGVmYXVsdCBuCisJZGVmYXVsdCB5CiAJaGVscAotCSAgVGhpcyBlbmFibGVzIHRoZSBzdXBwb3J0IGZvciBOQU5EIGZsYXNoIGluIEpGRlMyLiBOQU5EIGlzIGEgbmV3ZXIKLQkgIHR5cGUgb2YgZmxhc2ggY2hpcCBkZXNpZ24gdGhhbiB0aGUgdHJhZGl0aW9uYWwgTk9SIGZsYXNoLCB3aXRoCi0JICBoaWdoZXIgZGVuc2l0eSBidXQgYSBoYW5kZnVsIG9mIGNoYXJhY3RlcmlzdGljcyB3aGljaCBtYWtlIGl0IG1vcmUKLQkgIGludGVyZXN0aW5nIGZvciB0aGUgZmlsZSBzeXN0ZW0gdG8gdXNlLgorCSAgVGhpcyBlbmFibGVzIHRoZSB3cml0ZS1idWZmZXJpbmcgc3VwcG9ydCBpbiBKRkZTMi4KIAotCSAgU2F5ICdOJyB1bmxlc3MgeW91IGhhdmUgTkFORCBmbGFzaC4KLQotY29uZmlnIEpGRlMyX0ZTX05PUl9FQ0MKLSAgICAgICAgYm9vbCAiSkZGUzIgc3VwcG9ydCBmb3IgRUNDJ2QgTk9SIGZsYXNoIChFWFBFUklNRU5UQUwpIgotICAgICAgICBkZXBlbmRzIG9uIEpGRlMyX0ZTICYmIEVYUEVSSU1FTlRBTAotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgaGVscAotICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIE5PUiBmbGFzaCB3aXRoIHRyYW5zcGFyZW50Ci0gICAgICAgICAgRUNDIGZvciBKRkZTMi4gVGhpcyB0eXBlIG9mIGZsYXNoIGNoaXAgaXMgbm90IGNvbW1vbiwgaG93ZXZlciBpdCBpcwotICAgICAgICAgIGF2YWlsYWJsZSBmcm9tIFNUIE1pY3JvZWxlY3Ryb25pY3MuCisJICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBKRkZTMiBvbiB0aGUgZm9sbG93aW5nCisJICB0eXBlcyBvZiBmbGFzaCBkZXZpY2VzOgorCSAgICAtIE5BTkQgZmxhc2gKKwkgICAgLSBOT1IgZmxhc2ggd2l0aCB0cmFuc3BhcmVudCBFQ0MKKwkgICAgLSBEYXRhRmxhc2gKIAogY29uZmlnIEpGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMKIAlib29sICJBZHZhbmNlZCBjb21wcmVzc2lvbiBvcHRpb25zIGZvciBKRkZTMiIKQEAgLTE0MTMsNiArMTQ0NCw5IEBACiAJYm9vbCAiUHJvdmlkZSBORlN2NCBzZXJ2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIE5GU0RfVjMgJiYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IE5GU0RfVENQCisJc2VsZWN0IENSWVBUT19NRDUKKwlzZWxlY3QgQ1JZUFRPCisJc2VsZWN0IEZTX1BPU0lYX0FDTAogCWhlbHAKIAkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3Y0IHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgogCSAgYW5kIE5GU3YzIHNlcnZlcnMsIHNheSBZIGhlcmUuICBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsLCBhbmQKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggZmM5MmU1OS4uY2Y5NWViOCAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDkgQEAKIAkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCiAJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8ubyBcCiAJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIG1wYWdlLm8gZGlyZWN0LWlvLm8gXAorCQlpb3ByaW8ubwogCitvYmotJChDT05GSUdfSU5PVElGWSkJCSs9IGlub3RpZnkubwogb2JqLSQoQ09ORklHX0VQT0xMKQkJKz0gZXZlbnRwb2xsLm8KIG9iai0kKENPTkZJR19DT01QQVQpCQkrPSBjb21wYXQubwogCmRpZmYgLS1naXQgYS9mcy9hZnMva2Fmc2FzeW5jZC5jIGIvZnMvYWZzL2thZnNhc3luY2QuYwppbmRleCA2ZmM4OGFlLi43YWMwN2QwIDEwMDY0NAotLS0gYS9mcy9hZnMva2Fmc2FzeW5jZC5jCisrKyBiL2ZzL2Fmcy9rYWZzYXN5bmNkLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc2FzeW5jZF9zbGVlcHEsICZteXNlbGYpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCi0JCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOwogCiAJCS8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCiAJCWFmc19kaXNjYXJkX215X3NpZ25hbHMoKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9rYWZzdGltb2QuYyBiL2ZzL2Fmcy9rYWZzdGltb2QuYwppbmRleCA4NmU3MTBkLi42NWJjMDVhIDEwMDY0NAotLS0gYS9mcy9hZnMva2Fmc3RpbW9kLmMKKysrIGIvZnMvYWZzL2thZnN0aW1vZC5jCkBAIC05MSw3ICs5MSw3IEBACiAJCQljb21wbGV0ZV9hbmRfZXhpdCgma2Fmc3RpbW9kX2RlYWQsIDApOwogCQl9CiAKLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAKIAkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KIAkJYWZzX2Rpc2NhcmRfbXlfc2lnbmFscygpOwpkaWZmIC0tZ2l0IGEvZnMvYWlvLmMgYi9mcy9haW8uYwppbmRleCA3YWZhMjIyLi4wNmQ3ZDQzIDEwMDY0NAotLS0gYS9mcy9haW8uYworKysgYi9mcy9haW8uYwpAQCAtNTgsNiArNTgsNyBAQAogc3RhdGljIExJU1RfSEVBRChmcHV0X2hlYWQpOwogCiBzdGF0aWMgdm9pZCBhaW9fa2lja19oYW5kbGVyKHZvaWQgKik7CitzdGF0aWMgdm9pZCBhaW9fcXVldWVfd29yayhzdHJ1Y3Qga2lvY3R4ICopOwogCiAvKiBhaW9fc2V0dXAKICAqCUNyZWF0ZXMgdGhlIHNsYWIgY2FjaGVzIHVzZWQgYnkgdGhlIGFpbyByb3V0aW5lcywgcGFuaWMgb24KQEAgLTc0Nyw2ICs3NDgsMTQgQEAKIAkJICogaGFzIGFscmVhZHkgYmVlbiBraWNrZWQgKi8KIAkJaWYgKGtpb2NiSXNLaWNrZWQoaW9jYikpIHsKIAkJCV9fcXVldWVfa2lja2VkX2lvY2IoaW9jYik7CisKKwkJCS8qCisJCQkgKiBfX3F1ZXVlX2tpY2tlZF9pb2NiIHdpbGwgYWx3YXlzIHJldHVybiAxIGhlcmUsIGJlY2F1c2UKKwkJCSAqIGlvY2ItPmtpX3J1bl9saXN0IGlzIGVtcHR5IGF0IHRoaXMgcG9pbnQgc28gaXQgc2hvdWxkCisJCQkgKiBiZSBzYWZlIHRvIHVuY29uZGl0aW9uYWxseSBxdWV1ZSB0aGUgY29udGV4dCBpbnRvIHRoZQorCQkJICogd29yayBxdWV1ZS4KKwkJCSAqLworCQkJYWlvX3F1ZXVlX3dvcmsoY3R4KTsKIAkJfQogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZnMvYXR0ci5jIGIvZnMvYXR0ci5jCmluZGV4IGMzYzc2ZmUuLmIxNzk2ZmIgMTAwNjQ0Ci0tLSBhL2ZzL2F0dHIuYworKysgYi9mcy9hdHRyLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CkBAIC0xMDcsMzEgKzEwNyw4IEBACiBvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQotCiBFWFBPUlRfU1lNQk9MKGlub2RlX3NldGF0dHIpOwogCi1pbnQgc2V0YXR0cl9tYXNrKHVuc2lnbmVkIGludCBpYV92YWxpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGRuX21hc2sgPSAwOwotCi0JaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpCi0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKQotCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKLQlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCi0JCWRuX21hc2sgfD0gRE5fTU9ESUZZOwotCS8qIGJvdGggdGltZXMgaW1wbGllcyBhIHV0aW1lKHMpIGNhbGwgKi8KLQlpZiAoKGlhX3ZhbGlkICYgKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpID09IChBVFRSX0FUSU1FfEFUVFJfTVRJTUUpKQotCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKLQllbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpCi0JCWRuX21hc2sgfD0gRE5fQUNDRVNTOwotCWVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKLQkJZG5fbWFzayB8PSBETl9NT0RJRlk7Ci0JaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKQotCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKLQlyZXR1cm4gZG5fbWFzazsKLX0KLQogaW50IG5vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGlhdHRyICogYXR0cikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwpAQCAtMTk3LDExICsxNzQsOSBAQAogCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKIAkJdXBfd3JpdGUoJmRlbnRyeS0+ZF9pbm9kZS0+aV9hbGxvY19zZW0pOwogCi0JaWYgKCFlcnJvcikgewotCQl1bnNpZ25lZCBsb25nIGRuX21hc2sgPSBzZXRhdHRyX21hc2soaWFfdmFsaWQpOwotCQlpZiAoZG5fbWFzaykKLQkJCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgZG5fbWFzayk7Ci0JfQorCWlmICghZXJyb3IpCisJCWZzbm90aWZ5X2NoYW5nZShkZW50cnksIGlhX3ZhbGlkKTsKKwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC93YWl0cS5jIGIvZnMvYXV0b2ZzNC93YWl0cS5jCmluZGV4IGZhMjM0OGQuLjNkZjg2MjggMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvd2FpdHEuYworKysgYi9mcy9hdXRvZnM0L3dhaXRxLmMKQEAgLTIzMSw4ICsyMzEsOCBAQAogCQlpbnQgdHlwZSA9IChub3RpZnkgPT0gTkZZX01PVU5UID8KIAkJCWF1dG9mc19wdHlwZV9taXNzaW5nIDogYXV0b2ZzX3B0eXBlX2V4cGlyZV9tdWx0aSk7CiAKLQkJRFBSSU5USygoIm5ldyB3YWl0IGlkID0gMHglMDhseCwgbmFtZSA9ICUuKnMsIG5meT0lZFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKSB3cS0+d2FpdF9xdWV1ZV90b2tlbiwgd3EtPmxlbiwgd3EtPm5hbWUsIG5vdGlmeSkpOworCQlEUFJJTlRLKCJuZXcgd2FpdCBpZCA9IDB4JTA4bHgsIG5hbWUgPSAlLipzLCBuZnk9JWRcbiIsCisJCQkodW5zaWduZWQgbG9uZykgd3EtPndhaXRfcXVldWVfdG9rZW4sIHdxLT5sZW4sIHdxLT5uYW1lLCBub3RpZnkpOwogCiAJCS8qIGF1dG9mczRfbm90aWZ5X2RhZW1vbigpIG1heSBibG9jayAqLwogCQlhdXRvZnM0X25vdGlmeV9kYWVtb24oc2JpLCB3cSwgdHlwZSk7CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDNhMTQ3MmEuLmNhOGY3YTggMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC01Miw3ICs1Miw3IEBACiAgKi8KIAogI2RlZmluZSBCVih4KSB7IC5ucl92ZWNzID0geCwgLm5hbWUgPSAiYmlvdmVjLSJfX3N0cmluZ2lmeSh4KSB9Ci1zdGF0aWMgc3RydWN0IGJpb3ZlY19zbGFiIGJ2ZWNfc2xhYnNbQklPVkVDX05SX1BPT0xTXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgYmlvdmVjX3NsYWIgYnZlY19zbGFic1tCSU9WRUNfTlJfUE9PTFNdIF9fcmVhZF9tb3N0bHkgPSB7CiAJQlYoMSksIEJWKDQpLCBCVigxNiksIEJWKDY0KSwgQlYoMTI4KSwgQlYoQklPX01BWF9QQUdFUyksCiB9OwogI3VuZGVmIEJWCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDEzZTU5MzguLjZhMjVkN2QgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0yNzgsNyArMjc4LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZG9fc3luYyh1bnNpZ25lZCBsb25nIHdhaXQpCiB7Ci0Jd2FrZXVwX2JkZmx1c2goMCk7CisJd2FrZXVwX3BkZmx1c2goMCk7CiAJc3luY19pbm9kZXMoMCk7CQkvKiBBbGwgbWFwcGluZ3MsIGlub2RlcyBhbmQgdGhlaXIgYmxvY2tkZXZzICovCiAJRFFVT1RfU1lOQyhOVUxMKTsKIAlzeW5jX3N1cGVycygpOwkJLyogV3JpdGUgdGhlIHN1cGVyYmxvY2tzICovCkBAIC00OTcsNyArNDk3LDcgQEAKIAlzdHJ1Y3Qgem9uZSAqKnpvbmVzOwogCXBnX2RhdGFfdCAqcGdkYXQ7CiAKLQl3YWtldXBfYmRmbHVzaCgxMDI0KTsKKwl3YWtldXBfcGRmbHVzaCgxMDI0KTsKIAl5aWVsZCgpOwogCiAJZm9yX2VhY2hfcGdkYXQocGdkYXQpIHsKQEAgLTUxMyw4ICs1MTMsOCBAQAogICovCiBzdGF0aWMgdm9pZCBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQogewotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGFnZV91cHRvZGF0ZV9sb2NrKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3Q7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IHBhZ2VfdXB0b2RhdGUgPSAxOwpAQCAtNTM2LDcgKzUzNiw5IEBACiAJICogdHdvIGJ1ZmZlciBoZWFkcyBlbmQgSU8gYXQgYWxtb3N0IHRoZSBzYW1lIHRpbWUgYW5kIGJvdGgKIAkgKiBkZWNpZGUgdGhhdCB0aGUgcGFnZSBpcyBub3cgY29tcGxldGVseSBkb25lLgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwlmaXJzdCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYml0X3NwaW5fbG9jayhCSF9VcHRvZGF0ZV9Mb2NrLCAmZmlyc3QtPmJfc3RhdGUpOwogCWNsZWFyX2J1ZmZlcl9hc3luY19yZWFkKGJoKTsKIAl1bmxvY2tfYnVmZmVyKGJoKTsKIAl0bXAgPSBiaDsKQEAgLTU0OSw3ICs1NTEsOCBAQAogCQl9CiAJCXRtcCA9IHRtcC0+Yl90aGlzX3BhZ2U7CiAJfSB3aGlsZSAodG1wICE9IGJoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAkvKgogCSAqIElmIG5vbmUgb2YgdGhlIGJ1ZmZlcnMgaGFkIGVycm9ycyBhbmQgdGhleSBhcmUgYWxsCkBAIC01NjEsNyArNTY0LDggQEAKIAlyZXR1cm47CiAKIHN0aWxsX2J1c3k6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJYml0X3NwaW5fdW5sb2NrKEJIX1VwdG9kYXRlX0xvY2ssICZmaXJzdC0+Yl9zdGF0ZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybjsKIH0KIApAQCAtNTcyLDggKzU3Niw4IEBACiB2b2lkIGVuZF9idWZmZXJfYXN5bmNfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQogewogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZpcnN0OwogCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wOwogCXN0cnVjdCBwYWdlICpwYWdlOwogCkBAIC01OTQsNyArNTk4LDEwIEBACiAJCVNldFBhZ2VFcnJvcihwYWdlKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJZmlyc3QgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWJpdF9zcGluX2xvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwogCWNsZWFyX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CiAJdW5sb2NrX2J1ZmZlcihiaCk7CiAJdG1wID0gYmgtPmJfdGhpc19wYWdlOwpAQCAtNjA1LDEyICs2MTIsMTQgQEAKIAkJfQogCQl0bXAgPSB0bXAtPmJfdGhpc19wYWdlOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCXJldHVybjsKIAogc3RpbGxfYnVzeToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwliaXRfc3Bpbl91bmxvY2soQkhfVXB0b2RhdGVfTG9jaywgJmZpcnN0LT5iX3N0YXRlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCBlODJhYWM5Li4zYjFiMWVlIDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogCXN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QgKmNkID0gTlVMTCwgKipjcDsKIAlpbnQgaSA9IG1ham9yX3RvX2luZGV4KG1ham9yKTsKIAotCXVwKCZjaHJkZXZzX2xvY2spOworCWRvd24oJmNocmRldnNfbG9jayk7CiAJZm9yIChjcCA9ICZjaHJkZXZzW2ldOyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQogCQlpZiAoKCpjcCktPm1ham9yID09IG1ham9yICYmCiAJCSAgICAoKmNwKS0+YmFzZW1pbm9yID09IGJhc2VtaW5vciAmJgpAQCAtMjc3LDggKzI3Nyw5IEBACiB2b2lkIGNkZXZfcHV0KHN0cnVjdCBjZGV2ICpwKQogewogCWlmIChwKSB7CisJCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gcC0+b3duZXI7CiAJCWtvYmplY3RfcHV0KCZwLT5rb2JqKTsKLQkJbW9kdWxlX3B1dChwLT5vd25lcik7CisJCW1vZHVsZV9wdXQob3duZXIpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCA3MjhjZDgzLi42YjA2YjZiIDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGlyZW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KQEAgLTEzMDcsOSArMTMwNywxMyBAQAogb3V0OgogCWlmIChpb3YgIT0gaW92c3RhY2spCiAJCWtmcmVlKGlvdik7Ci0JaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKQotCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwKLQkJCQkodHlwZSA9PSBSRUFEKSA/IEROX0FDQ0VTUyA6IEROX01PRElGWSk7CisJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCQlpZiAodHlwZSA9PSBSRUFEKQorCQkJZnNub3RpZnlfYWNjZXNzKGRlbnRyeSk7CisJCWVsc2UKKwkJCWZzbm90aWZ5X21vZGlmeShkZW50cnkpOworCX0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwppbmRleCA1ODFhYWM5Li4wMmFhMGRkIDEwMDY0NAotLS0gYS9mcy9kY29va2llcy5jCisrKyBiL2ZzL2Rjb29raWVzLmMKQEAgLTk0LDEyICs5NCwxMCBAQAogCWlmICghZGNzKQogCQlyZXR1cm4gTlVMTDsKIAotCWF0b21pY19pbmMoJmRlbnRyeS0+ZF9jb3VudCk7Ci0JYXRvbWljX2luYygmdmZzbW50LT5tbnRfY291bnQpOwogCWRlbnRyeS0+ZF9jb29raWUgPSBkY3M7CiAKLQlkY3MtPmRlbnRyeSA9IGRlbnRyeTsKLQlkY3MtPnZmc21udCA9IHZmc21udDsKKwlkY3MtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKKwlkY3MtPnZmc21udCA9IG1udGdldCh2ZnNtbnQpOwogCWhhc2hfZGNvb2tpZShkY3MpOwogCiAJcmV0dXJuIGRjczsKZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggMWQ1NWU3ZS4uMGQwNjA5NyAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogc3RhdGljIHZvaWQgZGlvX2NvbXBsZXRlKHN0cnVjdCBkaW8gKmRpbywgbG9mZl90IG9mZnNldCwgc3NpemVfdCBieXRlcykKIHsKIAlpZiAoZGlvLT5lbmRfaW8gJiYgZGlvLT5yZXN1bHQpCi0JCWRpby0+ZW5kX2lvKGRpby0+aW5vZGUsIG9mZnNldCwgYnl0ZXMsIGRpby0+bWFwX2JoLmJfcHJpdmF0ZSk7CisJCWRpby0+ZW5kX2lvKGRpby0+aW9jYiwgb2Zmc2V0LCBieXRlcywgZGlvLT5tYXBfYmguYl9wcml2YXRlKTsKIAlpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpCiAJCXVwX3JlYWQoJmRpby0+aW5vZGUtPmlfYWxsb2Nfc2VtKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2RxdW90LmMgYi9mcy9kcXVvdC5jCmluZGV4IDM3MjEyYjAuLmI5NzMyMzMgMTAwNjQ0Ci0tLSBhL2ZzL2RxdW90LmMKKysrIGIvZnMvZHF1b3QuYwpAQCAtNDA5LDEzICs0MDksMTAgQEAKICAqIGZvciB0aGlzIHNiK3R5cGUgYXQgYWxsLiAqLwogc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9kcXVvdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IGRxdW90ICpkcXVvdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBkcXVvdCAqZHF1b3QsICp0bXA7CiAKIAlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7Ci0JZm9yIChoZWFkID0gaW51c2VfbGlzdC5uZXh0OyBoZWFkICE9ICZpbnVzZV9saXN0OykgewotCQlkcXVvdCA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IGRxdW90LCBkcV9pbnVzZSk7Ci0JCWhlYWQgPSBoZWFkLT5uZXh0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkcXVvdCwgdG1wLCAmaW51c2VfbGlzdCwgZHFfaW51c2UpIHsKIAkJaWYgKGRxdW90LT5kcV9zYiAhPSBzYikKIAkJCWNvbnRpbnVlOwogCQlpZiAoZHF1b3QtPmRxX3R5cGUgIT0gdHlwZSkKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCA0ODg3MTkxLi4yMjJhYjFjIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC02NDIsNiArNjQyLDE4IEBACiAJY291bnQgPSAyOwogCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKQogCQljb3VudCA9IDE7CisJZWxzZSB7CisJCS8qCisJCSAqIFRoZSBTSUdBTFJNIHRpbWVyIHN1cnZpdmVzIHRoZSBleGVjLCBidXQgbmVlZHMgdG8gcG9pbnQKKwkJICogYXQgdXMgYXMgdGhlIG5ldyBncm91cCBsZWFkZXIgbm93LiAgV2UgaGF2ZSBhIHJhY2Ugd2l0aAorCQkgKiBhIHRpbWVyIGZpcmluZyBub3cgZ2V0dGluZyB0aGUgb2xkIGxlYWRlciwgc28gd2UgbmVlZCB0bworCQkgKiBzeW5jaHJvbml6ZSB3aXRoIGFueSBmaXJpbmcgKGJ5IGNhbGxpbmcgZGVsX3RpbWVyX3N5bmMpCisJCSAqIGJlZm9yZSB3ZSBjYW4gc2FmZWx5IGxldCB0aGUgb2xkIGdyb3VwIGxlYWRlciBkaWUuCisJCSAqLworCQlzaWctPnJlYWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnQ7CisJCWlmIChkZWxfdGltZXJfc3luYygmc2lnLT5yZWFsX3RpbWVyKSkKKwkJCWFkZF90aW1lcigmc2lnLT5yZWFsX3RpbWVyKTsKKwl9CiAJd2hpbGUgKGF0b21pY19yZWFkKCZzaWctPmNvdW50KSA+IGNvdW50KSB7CiAJCXNpZy0+Z3JvdXBfZXhpdF90YXNrID0gY3VycmVudDsKIAkJc2lnLT5ub3RpZnlfY291bnQgPSBjb3VudDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvTWFrZWZpbGUgYi9mcy9leHQyL01ha2VmaWxlCmluZGV4IGVlMjQwYTEuLmM1ZDAyZGEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvTWFrZWZpbGUKKysrIGIvZnMvZXh0Mi9NYWtlZmlsZQpAQCAtMTAsMyArMTAsNCBAQAogZXh0Mi0kKENPTkZJR19FWFQyX0ZTX1hBVFRSKQkgKz0geGF0dHIubyB4YXR0cl91c2VyLm8geGF0dHJfdHJ1c3RlZC5vCiBleHQyLSQoQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMKSArPSBhY2wubwogZXh0Mi0kKENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZKQkgKz0geGF0dHJfc2VjdXJpdHkubworZXh0Mi0kKENPTkZJR19FWFQyX0ZTX1hJUCkJICs9IHhpcC5vCmRpZmYgLS1naXQgYS9mcy9leHQyL2V4dDIuaCBiL2ZzL2V4dDIvZXh0Mi5oCmluZGV4IDhmMGZkNzIuLmU5NzdmODUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZXh0Mi5oCisrKyBiL2ZzL2V4dDIvZXh0Mi5oCkBAIC0yLDYgKzIsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CiAKIC8qCisgKiBleHQyIG1vdW50IG9wdGlvbnMKKyAqLworc3RydWN0IGV4dDJfbW91bnRfb3B0aW9ucyB7CisJdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKKwl1aWRfdCBzX3Jlc3VpZDsKKwlnaWRfdCBzX3Jlc2dpZDsKK307CisKKy8qCiAgKiBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gaW5vZGUgZGF0YSBpbiBtZW1vcnkKICAqLwogc3RydWN0IGV4dDJfaW5vZGVfaW5mbyB7CkBAIC0xNDcsOSArMTU2LDExIEBACiAvKiBmaWxlLmMgKi8KIGV4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml94aXBfZmlsZV9vcGVyYXRpb25zOwogCiAvKiBpbm9kZS5jICovCiBleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleHQyX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleHQyX2FvcHNfeGlwOwogZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHM7CiAKIC8qIG5hbWVpLmMgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZmlsZS5jIGIvZnMvZXh0Mi9maWxlLmMKaW5kZXggZjVlODYxNC4uYTQ4NDQxMiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9maWxlLmMKKysrIGIvZnMvZXh0Mi9maWxlLmMKQEAgLTU1LDYgKzU1LDIwIEBACiAJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAogfTsKIAorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hJUAorc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX3hpcF9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IHhpcF9maWxlX3JlYWQsCisJLndyaXRlCQk9IHhpcF9maWxlX3dyaXRlLAorCS5pb2N0bAkJPSBleHQyX2lvY3RsLAorCS5tbWFwCQk9IHhpcF9maWxlX21tYXAsCisJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCisJLnJlbGVhc2UJPSBleHQyX3JlbGVhc2VfZmlsZSwKKwkuZnN5bmMJCT0gZXh0Ml9zeW5jX2ZpbGUsCisJLnNlbmRmaWxlCT0geGlwX2ZpbGVfc2VuZGZpbGUsCit9OworI2VuZGlmCisKIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewogCS50cnVuY2F0ZQk9IGV4dDJfdHJ1bmNhdGUsCiAjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCBhNTBkOWRiLi41M2RjZWIwIDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlICJleHQyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCisjaW5jbHVkZSAieGlwLmgiCiAKIE1PRFVMRV9BVVRIT1IoIlJlbXkgQ2FyZCBhbmQgb3RoZXJzIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNlY29uZCBFeHRlbmRlZCBGaWxlc3lzdGVtIik7CkBAIC01OTQsNiArNTk1LDE2IEBACiAJaWYgKGVycikKIAkJZ290byBjbGVhbnVwOwogCisJaWYgKGV4dDJfdXNlX3hpcChpbm9kZS0+aV9zYikpIHsKKwkJLyoKKwkJICogd2UgbmVlZCB0byBjbGVhciB0aGUgYmxvY2sKKwkJICovCisJCWVyciA9IGV4dDJfY2xlYXJfeGlwX3RhcmdldCAoaW5vZGUsCisJCQlsZTMyX3RvX2NwdShjaGFpbltkZXB0aC0xXS5rZXkpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gY2xlYW51cDsKKwl9CisKIAlpZiAoZXh0Ml9zcGxpY2VfYnJhbmNoKGlub2RlLCBpYmxvY2ssIGNoYWluLCBwYXJ0aWFsLCBsZWZ0KSA8IDApCiAJCWdvdG8gY2hhbmdlZDsKIApAQCAtNjkxLDYgKzcwMiwxMSBAQAogCS53cml0ZXBhZ2VzCQk9IGV4dDJfd3JpdGVwYWdlcywKIH07CiAKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9hb3BzX3hpcCA9IHsKKwkuYm1hcAkJCT0gZXh0Ml9ibWFwLAorCS5nZXRfeGlwX3BhZ2UJCT0gZXh0Ml9nZXRfeGlwX3BhZ2UsCit9OworCiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDJfbm9iaF9hb3BzID0gewogCS5yZWFkcGFnZQkJPSBleHQyX3JlYWRwYWdlLAogCS5yZWFkcGFnZXMJCT0gZXh0Ml9yZWFkcGFnZXMsCkBAIC05MTAsNyArOTI2LDkgQEAKIAlpYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIGJsb2Nrc2l6ZS0xKQogCQkJCQk+PiBFWFQyX0JMT0NLX1NJWkVfQklUUyhpbm9kZS0+aV9zYik7CiAKLQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCWlmIChtYXBwaW5nX2lzX3hpcChpbm9kZS0+aV9tYXBwaW5nKSkKKwkJeGlwX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CisJZWxzZSBpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQogCQlub2JoX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSk7CiAJZWxzZQogCQlibG9ja190cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsCkBAIC0xMTEwLDExICsxMTI4LDE2IEBACiAKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlpbm9kZS0+aV9vcCA9ICZleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOwotCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQlpZiAoZXh0Ml91c2VfeGlwKGlub2RlLT5pX3NiKSkgeworCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzX3hpcDsKKwkJCWlub2RlLT5pX2ZvcCA9ICZleHQyX3hpcF9maWxlX29wZXJhdGlvbnM7CisJCX0gZWxzZSBpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKSB7CiAJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKLQkJZWxzZQorCQkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOworCQl9IGVsc2UgewogCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCQkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOworCQl9CiAJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCWlub2RlLT5pX29wID0gJmV4dDJfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX2ZvcCA9ICZleHQyX2Rpcl9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9uYW1laS5jIGIvZnMvZXh0Mi9uYW1laS5jCmluZGV4IDMxNzZiM2QuLmM1NTEzOTUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvbmFtZWkuYworKysgYi9mcy9leHQyL25hbWVpLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlICJleHQyLmgiCiAjaW5jbHVkZSAieGF0dHIuaCIKICNpbmNsdWRlICJhY2wuaCIKKyNpbmNsdWRlICJ4aXAuaCIKIAogLyoKICAqIENvdXBsZSBvZiBoZWxwZXIgZnVuY3Rpb25zIC0gbWFrZSB0aGUgY29kZSBzbGlnaHRseSBjbGVhbmVyLgpAQCAtMTI3LDExICsxMjgsMTYgQEAKIAlpbnQgZXJyID0gUFRSX0VSUihpbm9kZSk7CiAJaWYgKCFJU19FUlIoaW5vZGUpKSB7CiAJCWlub2RlLT5pX29wID0gJmV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9maWxlX29wZXJhdGlvbnM7Ci0JCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCWlmIChleHQyX3VzZV94aXAoaW5vZGUtPmlfc2IpKSB7CisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX2FvcHNfeGlwOworCQkJaW5vZGUtPmlfZm9wID0gJmV4dDJfeGlwX2ZpbGVfb3BlcmF0aW9uczsKKwkJfSBlbHNlIGlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpIHsKIAkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfbm9iaF9hb3BzOwotCQllbHNlCisJCQlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9maWxlX29wZXJhdGlvbnM7CisJCX0gZWxzZSB7CiAJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX2FvcHM7CisJCQlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9maWxlX29wZXJhdGlvbnM7CisJCX0KIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCWVyciA9IGV4dDJfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKaW5kZXggNjYxYzNkOS4uZGNmZTMzMSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9zdXBlci5jCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgImV4dDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogI2luY2x1ZGUgImFjbC5oIgorI2luY2x1ZGUgInhpcC5oIgogCiBzdGF0aWMgdm9pZCBleHQyX3N5bmNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMpOwpAQCAtMjU3LDcgKzI1OCw3IEBACiAJT3B0X2JzZF9kZiwgT3B0X21pbml4X2RmLCBPcHRfZ3JwaWQsIE9wdF9ub2dycGlkLAogCU9wdF9yZXNnaWQsIE9wdF9yZXN1aWQsIE9wdF9zYiwgT3B0X2Vycl9jb250LCBPcHRfZXJyX3BhbmljLCBPcHRfZXJyX3JvLAogCU9wdF9ub3VpZDMyLCBPcHRfY2hlY2ssIE9wdF9ub2NoZWNrLCBPcHRfZGVidWcsIE9wdF9vbGRhbGxvYywgT3B0X29ybG92LCBPcHRfbm9iaCwKLQlPcHRfdXNlcl94YXR0ciwgT3B0X25vdXNlcl94YXR0ciwgT3B0X2FjbCwgT3B0X25vYWNsLAorCU9wdF91c2VyX3hhdHRyLCBPcHRfbm91c2VyX3hhdHRyLCBPcHRfYWNsLCBPcHRfbm9hY2wsIE9wdF94aXAsCiAJT3B0X2lnbm9yZSwgT3B0X2VyciwKIH07CiAKQEAgLTI4Niw2ICsyODcsNyBAQAogCXtPcHRfbm91c2VyX3hhdHRyLCAibm91c2VyX3hhdHRyIn0sCiAJe09wdF9hY2wsICJhY2wifSwKIAl7T3B0X25vYWNsLCAibm9hY2wifSwKKwl7T3B0X3hpcCwgInhpcCJ9LAogCXtPcHRfaWdub3JlLCAiZ3JwcXVvdGEifSwKIAl7T3B0X2lnbm9yZSwgIm5vcXVvdGEifSwKIAl7T3B0X2lnbm9yZSwgInF1b3RhIn0sCkBAIC0zOTcsNiArMzk5LDEzIEBACiAJCQlwcmludGsoIkVYVDIgKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQkJYnJlYWs7CiAjZW5kaWYKKwkJY2FzZSBPcHRfeGlwOgorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hJUAorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgWElQKTsKKyNlbHNlCisJCQlwcmludGsoIkVYVDIgeGlwIG9wdGlvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKyNlbmRpZgorCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2lnbm9yZToKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNjQwLDYgKzY0OSw5IEBACiAJCSgoRVhUMl9TQihzYiktPnNfbW91bnRfb3B0ICYgRVhUMl9NT1VOVF9QT1NJWF9BQ0wpID8KIAkJIE1TX1BPU0lYQUNMIDogMCk7CiAKKwlleHQyX3hpcF92ZXJpZnlfc2Ioc2IpOyAvKiBzZWUgaWYgYmRldiBzdXBwb3J0cyB4aXAsIHVuc2V0CisJCQkJICAgIEVYVDJfTU9VTlRfWElQIGlmIG5vdCAqLworCiAJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPT0gRVhUMl9HT09EX09MRF9SRVYgJiYKIAkgICAgKEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CiAJICAgICBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fApAQCAtNjY4LDYgKzY4MCwxMyBAQAogCiAJYmxvY2tzaXplID0gQkxPQ0tfU0laRSA8PCBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfbG9nX2Jsb2NrX3NpemUpOwogCisJaWYgKChleHQyX3VzZV94aXAoc2IpKSAmJiAoKGJsb2Nrc2l6ZSAhPSBQQUdFX1NJWkUpIHx8CisJCQkJICAoc2ItPnNfYmxvY2tzaXplICE9IGJsb2Nrc2l6ZSkpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJYSVA6IFVuc3VwcG9ydGVkIGJsb2Nrc2l6ZVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwogCS8qIElmIHRoZSBibG9ja3NpemUgZG9lc24ndCBtYXRjaCwgcmUtcmVhZCB0aGUgdGhpbmcuLiAqLwogCWlmIChzYi0+c19ibG9ja3NpemUgIT0gYmxvY2tzaXplKSB7CiAJCWJyZWxzZShiaCk7CkBAIC05MTYsMTcgKzkzNSwzNCBAQAogewogCXN0cnVjdCBleHQyX3NiX2luZm8gKiBzYmkgPSBFWFQyX1NCKHNiKTsKIAlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzOworCXVuc2lnbmVkIGxvbmcgb2xkX21vdW50X29wdCA9IHNiaS0+c19tb3VudF9vcHQ7CisJc3RydWN0IGV4dDJfbW91bnRfb3B0aW9ucyBvbGRfb3B0czsKKwl1bnNpZ25lZCBsb25nIG9sZF9zYl9mbGFnczsKKwlpbnQgZXJyOworCisJLyogU3RvcmUgdGhlIG9sZCBvcHRpb25zICovCisJb2xkX3NiX2ZsYWdzID0gc2ItPnNfZmxhZ3M7CisJb2xkX29wdHMuc19tb3VudF9vcHQgPSBzYmktPnNfbW91bnRfb3B0OworCW9sZF9vcHRzLnNfcmVzdWlkID0gc2JpLT5zX3Jlc3VpZDsKKwlvbGRfb3B0cy5zX3Jlc2dpZCA9IHNiaS0+c19yZXNnaWQ7CiAKIAkvKgogCSAqIEFsbG93IHRoZSAiY2hlY2siIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYSByZW1vdW50IG9wdGlvbi4KIAkgKi8KLQlpZiAoIXBhcnNlX29wdGlvbnMgKGRhdGEsIHNiaSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICghcGFyc2Vfb3B0aW9ucyAoZGF0YSwgc2JpKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHJlc3RvcmVfb3B0czsKKwl9CiAKIAlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAogCQkoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQyX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOwogCiAJZXMgPSBzYmktPnNfZXM7CisJaWYgKCgoc2JpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfWElQKSAhPQorCSAgICAob2xkX21vdW50X29wdCAmIEVYVDJfTU9VTlRfWElQKSkgJiYKKwkgICAgaW52YWxpZGF0ZV9pbm9kZXMoc2IpKQorCQlleHQyX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgImJ1c3kgaW5vZGVzIHdoaWxlIHJlbW91bnRpbmcgIlwKKwkJCSAgICAgInhpcCByZW1haW4gaW4gY2FjaGUgKG5vIGZ1bmN0aW9uYWwgcHJvYmxlbSkiKTsKIAlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKIAkJcmV0dXJuIDA7CiAJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgewpAQCAtOTQ2LDcgKzk4Miw4IEBACiAJCQlwcmludGsoIkVYVDItZnM6ICVzOiBjb3VsZG4ndCByZW1vdW50IFJEV1IgYmVjYXVzZSBvZiAiCiAJCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAogCQkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShyZXQpKTsKLQkJCXJldHVybiAtRVJPRlM7CisJCQllcnIgPSAtRVJPRlM7CisJCQlnb3RvIHJlc3RvcmVfb3B0czsKIAkJfQogCQkvKgogCQkgKiBNb3VudGluZyBhIFJET05MWSBwYXJ0aXRpb24gcmVhZC13cml0ZSwgc28gcmVyZWFkIGFuZApAQCAtOTU5LDYgKzk5NiwxMiBAQAogCX0KIAlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKIAlyZXR1cm4gMDsKK3Jlc3RvcmVfb3B0czoKKwlzYmktPnNfbW91bnRfb3B0ID0gb2xkX29wdHMuc19tb3VudF9vcHQ7CisJc2JpLT5zX3Jlc3VpZCA9IG9sZF9vcHRzLnNfcmVzdWlkOworCXNiaS0+c19yZXNnaWQgPSBvbGRfb3B0cy5zX3Jlc2dpZDsKKwlzYi0+c19mbGFncyA9IG9sZF9zYl9mbGFnczsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGV4dDJfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGtzdGF0ZnMgKiBidWYpCmRpZmYgLS1naXQgYS9mcy9leHQyL3hpcC5jIGIvZnMvZXh0Mi94aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ0MzFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi94aXAuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIveGlwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IENhcnN0ZW4gT3R0ZSAoY290dGVAZGUuaWJtLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzX3NiLmg+CisjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4aXAuaCIKKworc3RhdGljIGlubGluZSBpbnQKK19faW5vZGVfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBzZWN0b3IsIHVuc2lnbmVkIGxvbmcgKmRhdGEpIHsKKwlCVUdfT04oIWlub2RlLT5pX3NiLT5zX2JkZXYtPmJkX2Rpc2stPmZvcHMtPmRpcmVjdF9hY2Nlc3MpOworCXJldHVybiBpbm9kZS0+aV9zYi0+c19iZGV2LT5iZF9kaXNrLT5mb3BzCisJCS0+ZGlyZWN0X2FjY2Vzcyhpbm9kZS0+aV9zYi0+c19iZGV2LHNlY3RvcixkYXRhKTsKK30KKworaW50CitleHQyX2NsZWFyX3hpcF90YXJnZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrKSB7CisJc2VjdG9yX3Qgc2VjdG9yID0gYmxvY2sqKFBBR0VfU0laRS81MTIpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwlpbnQgcmM7CisKKwlyYyA9IF9faW5vZGVfZGlyZWN0X2FjY2Vzcyhpbm9kZSwgc2VjdG9yLCAmZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJY2xlYXJfcGFnZSgodm9pZCopZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXh0Ml94aXBfdmVyaWZ5X3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisKKwlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQyX01PVU5UX1hJUCkpIHsKKwkJaWYgKChzYi0+c19iZGV2ID09IE5VTEwpIHx8CisJCQlzYi0+c19iZGV2LT5iZF9kaXNrID09IE5VTEwgfHwKKwkJCXNiLT5zX2JkZXYtPmJkX2Rpc2stPmZvcHMgPT0gTlVMTCB8fAorCQkJc2ItPnNfYmRldi0+YmRfZGlzay0+Zm9wcy0+ZGlyZWN0X2FjY2VzcyA9PSBOVUxMKSB7CisJCQlzYmktPnNfbW91bnRfb3B0ICY9ICh+RVhUMl9NT1VOVF9YSVApOworCQkJZXh0Ml93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJImlnbm9yaW5nIHhpcCBvcHRpb24gLSBub3Qgc3VwcG9ydGVkIGJ5IGJkZXYiKTsKKwkJfQorCX0KK30KKworc3RydWN0IHBhZ2UqCitleHQyX2dldF94aXBfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2tubywKKwkJICAgaW50IGNyZWF0ZSkKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCB0bXA7CisKKwl0bXAuYl9zdGF0ZSA9IDA7CisJdG1wLmJfYmxvY2tuciA9IDA7CisJcmMgPSBleHQyX2dldF9ibG9jayhtYXBwaW5nLT5ob3N0LCBibG9ja25vLyhQQUdFX1NJWkUvNTEyKSAsICZ0bXAsCisJCQkJY3JlYXRlKTsKKwlpZiAocmMpCisJCXJldHVybiBFUlJfUFRSKHJjKTsKKwlpZiAodG1wLmJfYmxvY2tuciA9PSAwKSB7CisJCS8qIFNQQVJTRSBibG9jayAqLworCQlCVUdfT04oY3JlYXRlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RBVEEpOworCX0KKworCXJjID0gX19pbm9kZV9kaXJlY3RfYWNjZXNzCisJCShtYXBwaW5nLT5ob3N0LHRtcC5iX2Jsb2NrbnIqKFBBR0VfU0laRS81MTIpICwmZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gRVJSX1BUUihyYyk7CisKKwlTZXRQYWdlVXB0b2RhdGUodmlydF90b19wYWdlKGRhdGEpKTsKKwlyZXR1cm4gdmlydF90b19wYWdlKGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi94aXAuaCBiL2ZzL2V4dDIveGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4NTMzMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGlwLmgKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL3hpcC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IElCTSBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBDYXJzdGVuIE90dGUgKGNvdHRlQGRlLmlibS5jb20pCisgKi8KKworI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hJUAorZXh0ZXJuIHZvaWQgZXh0Ml94aXBfdmVyaWZ5X3NiIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gaW50IGV4dDJfY2xlYXJfeGlwX3RhcmdldCAoc3RydWN0IGlub2RlICosIGludCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfdXNlX3hpcCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwlyZXR1cm4gKHNiaS0+c19tb3VudF9vcHQgJiBFWFQyX01PVU5UX1hJUCk7Cit9CitzdHJ1Y3QgcGFnZSogZXh0Ml9nZXRfeGlwX3BhZ2UgKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHNlY3Rvcl90LCBpbnQpOworI2RlZmluZSBtYXBwaW5nX2lzX3hpcChtYXApIHVubGlrZWx5KG1hcC0+YV9vcHMtPmdldF94aXBfcGFnZSkKKyNlbHNlCisjZGVmaW5lIG1hcHBpbmdfaXNfeGlwKG1hcCkJCQkwCisjZGVmaW5lIGV4dDJfeGlwX3ZlcmlmeV9zYihzYikJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGV4dDJfdXNlX3hpcChzYikJCQkwCisjZGVmaW5lIGV4dDJfY2xlYXJfeGlwX3RhcmdldChpbm9kZSwgY2hhaW4pCTAKKyNkZWZpbmUgZXh0Ml9nZXRfeGlwX3BhZ2UJCQlOVUxMCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYWNsLmMgYi9mcy9leHQzL2FjbC5jCmluZGV4IDEzM2Y1YWEuLjNhYzM4MjYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYWNsLmMKKysrIGIvZnMvZXh0My9hY2wuYwpAQCAtMzkzLDcgKzM5Myw4IEBACiAJCWludCByZXRyaWVzID0gMDsKIAogCXJldHJ5OgotCQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MpOworCQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsCisJCQkJRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwogCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKIAkJCWVycm9yID0gUFRSX0VSUihoYW5kbGUpOwogCQkJZXh0M19zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycm9yKTsKQEAgLTUwMyw3ICs1MDQsNyBAQAogCQlhY2wgPSBOVUxMOwogCiByZXRyeToKLQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLCB0eXBlLCBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9iYWxsb2MuYyBiL2ZzL2V4dDMvYmFsbG9jLmMKaW5kZXggY2NkNjMyZi4uZTQ2M2RjYSAxMDA2NDQKLS0tIGEvZnMvZXh0My9iYWxsb2MuYworKysgYi9mcy9leHQzL2JhbGxvYy5jCkBAIC03NDksMjQgKzc0OSwyNCBAQAogICogCXRvIGZpbmQgYSBmcmVlIHJlZ2lvbiB0aGF0IGlzIG9mIG15IHNpemUgYW5kIGhhcyBub3QKICAqIAliZWVuIHJlc2VydmVkLgogICoKLSAqCW9uIHN1Y2NlZWQsIGl0IHJldHVybnMgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0byBiZSBhcHBlbmRlZCB0by4KLSAqCWZhaWxlZCwgcmV0dXJuIE5VTEwuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coCitzdGF0aWMgaW50IGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygKIAkJCQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpzZWFyY2hfaGVhZCwKLQkJCQl1bnNpZ25lZCBsb25nIHNpemUsIGludCAqc3RhcnRfYmxvY2ssCisJCQkJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2LAorCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgc3RhcnRfYmxvY2ssCiAJCQkJaW50IGxhc3RfYmxvY2spCiB7CiAJc3RydWN0IHJiX25vZGUgKm5leHQ7CiAJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2LCAqcHJldjsKIAlpbnQgY3VyOworCWludCBzaXplID0gbXlfcnN2LT5yc3ZfZ29hbF9zaXplOwogCiAJLyogVE9ETzogbWFrZSB0aGUgc3RhcnQgb2YgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBieXRlLWFsaWduZWQgKi8KIAkvKiBjdXIgPSAqc3RhcnRfYmxvY2sgJiB+NzsqLwotCWN1ciA9ICpzdGFydF9ibG9jazsKKwljdXIgPSBzdGFydF9ibG9jazsKIAlyc3YgPSBzZWFyY2hfaGVhZDsKIAlpZiAoIXJzdikKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAtMTsKIAogCXdoaWxlICgxKSB7CiAJCWlmIChjdXIgPD0gcnN2LT5yc3ZfZW5kKQpAQCAtNzgyLDExICs3ODIsMTEgQEAKIAkJICogc3BhY2Ugd2l0aCBleHBlY3RlZC1zaXplIChvciBtb3JlKS4uLgogCQkgKi8KIAkJaWYgKGN1ciA+IGxhc3RfYmxvY2spCi0JCQlyZXR1cm4gTlVMTDsJCS8qIGZhaWwgKi8KKwkJCXJldHVybiAtMTsJCS8qIGZhaWwgKi8KIAogCQlwcmV2ID0gcnN2OwogCQluZXh0ID0gcmJfbmV4dCgmcnN2LT5yc3Zfbm9kZSk7Ci0JCXJzdiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCQlyc3YgPSBsaXN0X2VudHJ5KG5leHQsc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSxyc3Zfbm9kZSk7CiAKIAkJLyoKIAkJICogUmVhY2hlZCB0aGUgbGFzdCByZXNlcnZhdGlvbiwgd2UgY2FuIGp1c3QgYXBwZW5kIHRvIHRoZQpAQCAtODEzLDggKzgxMywyNSBAQAogCSAqIHJldHVybiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IHRoYXQgd2UgY291bGQgYXBwZW5kIHRvLgogCSAqIHN1Y2NlZWQuCiAJICovCi0JKnN0YXJ0X2Jsb2NrID0gY3VyOwotCXJldHVybiBwcmV2OworCisJaWYgKChwcmV2ICE9IG15X3JzdikgJiYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpKQorCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKKworCS8qCisJICogTGV0J3MgYm9vayB0aGUgd2hvbGUgYXZhbGlhYmxlIHdpbmRvdyBmb3Igbm93LiAgV2Ugd2lsbCBjaGVjayB0aGUKKwkgKiBkaXNrIGJpdG1hcCBsYXRlciBhbmQgdGhlbiwgaWYgdGhlcmUgYXJlIGZyZWUgYmxvY2tzIHRoZW4gd2UgYWRqdXN0CisJICogdGhlIHdpbmRvdyBzaXplIGlmIGl0J3MgbGFyZ2VyIHRoYW4gcmVxdWVzdGVkLgorCSAqIE90aGVyd2lzZSwgd2Ugd2lsbCByZW1vdmUgdGhpcyBub2RlIGZyb20gdGhlIHRyZWUgbmV4dCB0aW1lCisJICogY2FsbCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3cuCisJICovCisJbXlfcnN2LT5yc3Zfc3RhcnQgPSBjdXI7CisJbXlfcnN2LT5yc3ZfZW5kID0gY3VyICsgc2l6ZSAtIDE7CisJbXlfcnN2LT5yc3ZfYWxsb2NfaGl0ID0gMDsKKworCWlmIChwcmV2ICE9IG15X3JzdikKKwkJZXh0M19yc3Zfd2luZG93X2FkZChzYiwgbXlfcnN2KTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTg1Miw2ICs4NjksNyBAQAogICoJQHNiOiB0aGUgc3VwZXIgYmxvY2sKICAqCUBncm91cDogdGhlIGdyb3VwIHdlIGFyZSB0cnlpbmcgdG8gYWxsb2NhdGUgaW4KICAqCUBiaXRtYXBfYmg6IHRoZSBibG9jayBncm91cCBibG9jayBiaXRtYXAKKyAqCiAgKi8KIHN0YXRpYyBpbnQgYWxsb2NfbmV3X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKIAkJaW50IGdvYWwsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC04NjAsMTAgKzg3OCwxMCBAQAogCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnNlYXJjaF9oZWFkOwogCWludCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrLCBzdGFydF9ibG9jazsKIAlpbnQgZmlyc3RfZnJlZV9ibG9jazsKLQlpbnQgcmVzZXJ2YWJsZV9zcGFjZV9zdGFydDsKLQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpwcmV2X3JzdjsKIAlzdHJ1Y3QgcmJfcm9vdCAqZnNfcnN2X3Jvb3QgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290OwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0OworCXNwaW5sb2NrX3QgKnJzdl9sb2NrID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKIAogCWdyb3VwX2ZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKwogCQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKQEAgLTg3NSw2ICs4OTMsNyBAQAogCQlzdGFydF9ibG9jayA9IGdvYWwgKyBncm91cF9maXJzdF9ibG9jazsKIAogCXNpemUgPSBteV9yc3YtPnJzdl9nb2FsX3NpemU7CisKIAlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkgewogCQkvKgogCQkgKiBpZiB0aGUgb2xkIHJlc2VydmF0aW9uIGlzIGNyb3NzIGdyb3VwIGJvdW5kYXJ5CkBAIC05MDgsNiArOTI3LDggQEAKIAkJCW15X3Jzdi0+cnN2X2dvYWxfc2l6ZT0gc2l6ZTsKIAkJfQogCX0KKworCXNwaW5fbG9jayhyc3ZfbG9jayk7CiAJLyoKIAkgKiBzaGlmdCB0aGUgc2VhcmNoIHN0YXJ0IHRvIHRoZSB3aW5kb3cgbmVhciB0aGUgZ29hbCBibG9jawogCSAqLwpAQCAtOTIxLDExICs5NDIsMTYgQEAKIAkgKiBuZWVkIHRvIGNoZWNrIHRoZSBiaXRtYXAgYWZ0ZXIgd2UgZm91bmQgYSByZXNlcnZhYmxlIHdpbmRvdy4KIAkgKi8KIHJldHJ5OgotCXByZXZfcnN2ID0gZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KHNlYXJjaF9oZWFkLCBzaXplLAotCQkJCQkJJnN0YXJ0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2spOwotCWlmIChwcmV2X3JzdiA9PSBOVUxMKQotCQlnb3RvIGZhaWxlZDsKLQlyZXNlcnZhYmxlX3NwYWNlX3N0YXJ0ID0gc3RhcnRfYmxvY2s7CisJcmV0ID0gZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KHNlYXJjaF9oZWFkLCBteV9yc3YsIHNiLAorCQkJCQkJc3RhcnRfYmxvY2ssIGdyb3VwX2VuZF9ibG9jayk7CisKKwlpZiAocmV0ID09IC0xKSB7CisJCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQorCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisJCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCS8qCiAJICogT24gc3VjY2VzcywgZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KCkgcmV0dXJucyB0aGUKIAkgKiByZXNlcnZhdGlvbiB3aW5kb3cgd2hlcmUgdGhlcmUgaXMgYSByZXNlcnZhYmxlIHNwYWNlIGFmdGVyIGl0LgpAQCAtOTM3LDggKzk2Myw5IEBACiAJICogYmxvY2suIFNlYXJjaCBzdGFydCBmcm9tIHRoZSBzdGFydCBibG9jayBvZiB0aGUgcmVzZXJ2YWJsZSBzcGFjZQogCSAqIHdlIGp1c3QgZm91bmQuCiAJICovCisJc3Bpbl91bmxvY2socnN2X2xvY2spOwogCWZpcnN0X2ZyZWVfYmxvY2sgPSBiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKAotCQkJcmVzZXJ2YWJsZV9zcGFjZV9zdGFydCAtIGdyb3VwX2ZpcnN0X2Jsb2NrLAorCQkJbXlfcnN2LT5yc3Zfc3RhcnQgLSBncm91cF9maXJzdF9ibG9jaywKIAkJCWJpdG1hcF9iaCwgZ3JvdXBfZW5kX2Jsb2NrIC0gZ3JvdXBfZmlyc3RfYmxvY2sgKyAxKTsKIAogCWlmIChmaXJzdF9mcmVlX2Jsb2NrIDwgMCkgewpAQCAtOTQ2LDU0ICs5NzMsMjkgQEAKIAkJICogbm8gZnJlZSBibG9jayBsZWZ0IG9uIHRoZSBiaXRtYXAsIG5vIHBvaW50CiAJCSAqIHRvIHJlc2VydmUgdGhlIHNwYWNlLiByZXR1cm4gZmFpbGVkLgogCQkgKi8KLQkJZ290byBmYWlsZWQ7CisJCXNwaW5fbG9jayhyc3ZfbG9jayk7CisJCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQorCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisJCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKKwkJcmV0dXJuIC0xOwkJLyogZmFpbGVkICovCiAJfQorCiAJc3RhcnRfYmxvY2sgPSBmaXJzdF9mcmVlX2Jsb2NrICsgZ3JvdXBfZmlyc3RfYmxvY2s7CiAJLyoKIAkgKiBjaGVjayBpZiB0aGUgZmlyc3QgZnJlZSBibG9jayBpcyB3aXRoaW4gdGhlCi0JICogZnJlZSBzcGFjZSB3ZSBqdXN0IGZvdW5kCisJICogZnJlZSBzcGFjZSB3ZSBqdXN0IHJlc2VydmVkCiAJICovCi0JaWYgKChzdGFydF9ibG9jayA+PSByZXNlcnZhYmxlX3NwYWNlX3N0YXJ0KSAmJgotCSAgKHN0YXJ0X2Jsb2NrIDwgcmVzZXJ2YWJsZV9zcGFjZV9zdGFydCArIHNpemUpKQotCQlnb3RvIGZvdW5kX3Jzdl93aW5kb3c7CisJaWYgKHN0YXJ0X2Jsb2NrID49IG15X3Jzdi0+cnN2X3N0YXJ0ICYmIHN0YXJ0X2Jsb2NrIDwgbXlfcnN2LT5yc3ZfZW5kKQorCQlyZXR1cm4gMDsJCS8qIHN1Y2Nlc3MgKi8KIAkvKgogCSAqIGlmIHRoZSBmaXJzdCBmcmVlIGJpdCB3ZSBmb3VuZCBpcyBvdXQgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKLQkgKiB0aGlzIG1lYW5zIHRoZXJlIGlzIG5vIGZyZWUgYmxvY2sgb24gdGhlIHJlc2VydmFibGUgc3BhY2UKLQkgKiB3ZSBzaG91bGQgY29udGludWUgc2VhcmNoIGZvciBuZXh0IHJlc2VydmFibGUgc3BhY2UsCisJICogY29udGludWUgc2VhcmNoIGZvciBuZXh0IHJlc2VydmFibGUgc3BhY2UsCiAJICogc3RhcnQgZnJvbSB3aGVyZSB0aGUgZnJlZSBibG9jayBpcywKIAkgKiB3ZSBhbHNvIHNoaWZ0IHRoZSBsaXN0IGhlYWQgdG8gd2hlcmUgd2Ugc3RvcHBlZCBsYXN0IHRpbWUKIAkgKi8KLQlzZWFyY2hfaGVhZCA9IHByZXZfcnN2OworCXNlYXJjaF9oZWFkID0gbXlfcnN2OworCXNwaW5fbG9jayhyc3ZfbG9jayk7CiAJZ290byByZXRyeTsKLQotZm91bmRfcnN2X3dpbmRvdzoKLQkvKgotCSAqIGdyZWF0ISB0aGUgcmVzZXJ2YWJsZSBzcGFjZSBjb250YWlucyBzb21lIGZyZWUgYmxvY2tzLgotCSAqIGlmIHRoZSBzZWFyY2ggcmV0dXJucyB0aGF0IHdlIHNob3VsZCBhZGQgdGhlIG5ldwotCSAqIHdpbmRvdyBqdXN0IG5leHQgdG8gd2hlcmUgdGhlIG9sZCB3aW5kb3csIHdlIGRvbid0Ci0gCSAqIG5lZWQgdG8gcmVtb3ZlIHRoZSBvbGQgd2luZG93IGZpcnN0IHRoZW4gYWRkIGl0IHRvIHRoZQotCSAqIHNhbWUgcGxhY2UsIGp1c3QgdXBkYXRlIHRoZSBuZXcgc3RhcnQgYW5kIG5ldyBlbmQuCi0JICovCi0JaWYgKG15X3JzdiAhPSBwcmV2X3JzdikgIHsKLQkJaWYgKCFyc3ZfaXNfZW1wdHkoJm15X3Jzdi0+cnN2X3dpbmRvdykpCi0JCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKLQl9Ci0JbXlfcnN2LT5yc3Zfc3RhcnQgPSByZXNlcnZhYmxlX3NwYWNlX3N0YXJ0OwotCW15X3Jzdi0+cnN2X2VuZCA9IG15X3Jzdi0+cnN2X3N0YXJ0ICsgc2l6ZSAtIDE7Ci0JbXlfcnN2LT5yc3ZfYWxsb2NfaGl0ID0gMDsKLQlpZiAobXlfcnN2ICE9IHByZXZfcnN2KSAgewotCQlleHQzX3Jzdl93aW5kb3dfYWRkKHNiLCBteV9yc3YpOwotCX0KLQlyZXR1cm4gMDsJCS8qIHN1Y2NlZWQgKi8KLWZhaWxlZDoKLQkvKgotCSAqIGZhaWxlZCB0byBmaW5kIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdyBpbiB0aGUgY3VycmVudAotCSAqIGdyb3VwLCByZW1vdmUgdGhlIGN1cnJlbnQoc3RhbGUpIHJlc2VydmF0aW9uIHdpbmRvdwotCSAqIGlmIHRoZXJlIGlzIGFueQotCSAqLwotCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQotCQlyc3Zfd2luZG93X3JlbW92ZShzYiwgbXlfcnN2KTsKLQlyZXR1cm4gLTE7CQkvKiBmYWlsZWQgKi8KIH0KIAogLyoKQEAgLTEwMjMsNyArMTAyNSw2IEBACiAJCQlpbnQgZ29hbCwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqIG15X3JzdiwKIAkJCWludCAqZXJycCkKIHsKLQlzcGlubG9ja190ICpyc3ZfbG9jazsKIAl1bnNpZ25lZCBsb25nIGdyb3VwX2ZpcnN0X2Jsb2NrOwogCWludCByZXQgPSAwOwogCWludCBmYXRhbDsKQEAgLTEwNTIsNyArMTA1Myw2IEBACiAJCXJldCA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHNiLCBoYW5kbGUsIGdyb3VwLCBiaXRtYXBfYmgsIGdvYWwsIE5VTEwpOwogCQlnb3RvIG91dDsKIAl9Ci0JcnN2X2xvY2sgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19sb2NrOwogCS8qCiAJICogZ29hbCBpcyBhIGdyb3VwIHJlbGF0aXZlIGJsb2NrIG51bWJlciAoaWYgdGhlcmUgaXMgYSBnb2FsKQogCSAqIDAgPCBnb2FsIDwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQpAQCAtMTA3OCwzMCArMTA3OCwyMSBAQAogCSAqIHRoZW4gd2UgY291bGQgZ28gdG8gYWxsb2NhdGUgZnJvbSB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGRpcmVjdGx5LgogCSAqLwogCXdoaWxlICgxKSB7Ci0JCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93IHJzdl9jb3B5OwotCi0JCXJzdl9jb3B5Ll9yc3Zfc3RhcnQgPSBteV9yc3YtPnJzdl9zdGFydDsKLQkJcnN2X2NvcHkuX3Jzdl9lbmQgPSBteV9yc3YtPnJzdl9lbmQ7Ci0KLQkJaWYgKHJzdl9pc19lbXB0eSgmcnN2X2NvcHkpIHx8IChyZXQgPCAwKSB8fAotCQkJIWdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oJnJzdl9jb3B5LCBnb2FsLCBncm91cCwgc2IpKSB7Ci0JCQlzcGluX2xvY2socnN2X2xvY2spOworCQlpZiAocnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpIHx8IChyZXQgPCAwKSB8fAorCQkJIWdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oJm15X3Jzdi0+cnN2X3dpbmRvdywgZ29hbCwgZ3JvdXAsIHNiKSkgewogCQkJcmV0ID0gYWxsb2NfbmV3X3Jlc2VydmF0aW9uKG15X3JzdiwgZ29hbCwgc2IsCiAJCQkJCQkJZ3JvdXAsIGJpdG1hcF9iaCk7Ci0JCQlyc3ZfY29weS5fcnN2X3N0YXJ0ID0gbXlfcnN2LT5yc3Zfc3RhcnQ7Ci0JCQlyc3ZfY29weS5fcnN2X2VuZCA9IG15X3Jzdi0+cnN2X2VuZDsKLQkJCXNwaW5fdW5sb2NrKHJzdl9sb2NrKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWJyZWFrOwkJCS8qIGZhaWxlZCAqLwogCi0JCQlpZiAoIWdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oJnJzdl9jb3B5LCBnb2FsLCBncm91cCwgc2IpKQorCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdvYWwsIGdyb3VwLCBzYikpCiAJCQkJZ29hbCA9IC0xOwogCQl9Ci0JCWlmICgocnN2X2NvcHkuX3Jzdl9zdGFydCA+PSBncm91cF9maXJzdF9ibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCi0JCSAgICB8fCAocnN2X2NvcHkuX3Jzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCisJCWlmICgobXlfcnN2LT5yc3Zfc3RhcnQgPj0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQkgICAgfHwgKG15X3Jzdi0+cnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkKIAkJCUJVRygpOwogCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLCBnb2FsLAotCQkJCQkgICAmcnN2X2NvcHkpOworCQkJCQkgICAmbXlfcnN2LT5yc3Zfd2luZG93KTsKIAkJaWYgKHJldCA+PSAwKSB7CiAJCQlteV9yc3YtPnJzdl9hbGxvY19oaXQrKzsKIAkJCWJyZWFrOwkJCQkvKiBzdWNjZWVkICovCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZpbGUuYyBiL2ZzL2V4dDMvZmlsZS5jCmluZGV4IDVhZDhjZjAyLi45OGU3ODM0IDEwMDY0NAotLS0gYS9mcy9leHQzL2ZpbGUuYworKysgYi9mcy9leHQzL2ZpbGUuYwpAQCAtMzYsNyArMzYsMTEgQEAKIAkvKiBpZiB3ZSBhcmUgdGhlIGxhc3Qgd3JpdGVyIG9uIHRoZSBpbm9kZSwgZHJvcCB0aGUgYmxvY2sgcmVzZXJ2YXRpb24gKi8KIAlpZiAoKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJgogCQkJKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA9PSAxKSkKKwl7CisJCWRvd24oJkVYVDNfSShpbm9kZSktPnRydW5jYXRlX3NlbSk7CiAJCWV4dDNfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CisJCXVwKCZFWFQzX0koaW5vZGUpLT50cnVuY2F0ZV9zZW0pOworCX0KIAlpZiAoaXNfZHgoaW5vZGUpICYmIGZpbHAtPnByaXZhdGVfZGF0YSkKIAkJZXh0M19odHJlZV9mcmVlX2Rpcl9pbmZvKGZpbHAtPnByaXZhdGVfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwppbmRleCAwZDVmYTczLi45OTg5ZmRjIDEwMDY0NAotLS0gYS9mcy9leHQzL2lub2RlLmMKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlpZiAobmVlZGVkID4gRVhUM19NQVhfVFJBTlNfREFUQSkgCiAJCW5lZWRlZCA9IEVYVDNfTUFYX1RSQU5TX0RBVEE7CiAKLQlyZXR1cm4gRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArIG5lZWRlZDsKKwlyZXR1cm4gRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikgKyBuZWVkZWQ7CiB9CiAKIC8qIApAQCAtMjY2Myw3ICsyNjYzLDcgQEAKIAl9IGVsc2UgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgRVhUM19OX0JMT0NLUzsgYmxvY2srKykKIAkJcmF3X2lub2RlLT5pX2Jsb2NrW2Jsb2NrXSA9IGVpLT5pX2RhdGFbYmxvY2tdOwogCi0JaWYgKEVYVDNfSU5PREVfU0laRShpbm9kZS0+aV9zYikgPiBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpCisJaWYgKGVpLT5pX2V4dHJhX2lzaXplKQogCQlyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBjcHVfdG9fbGUxNihlaS0+aV9leHRyYV9pc2l6ZSk7CiAKIAlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOwpAQCAtMjc2Myw3ICsyNzYzLDggQEAKIAogCQkvKiAodXNlcitncm91cCkqKG9sZCtuZXcpIHN0cnVjdHVyZSwgaW5vZGUgd3JpdGUgKHNiLAogCQkgKiBpbm9kZSBibG9jaywgPyAtIGJ1dCB0cnVuY2F0ZSBpbm9kZSB1cGRhdGUgaGFzIGl0KSAqLwotCQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIDQqRVhUM19RVU9UQV9JTklUX0JMT0NLUyszKTsKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKihFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKSsKKwkJCQkJRVhUM19RVU9UQV9ERUxfQkxPQ0tTKGlub2RlLT5pX3NiKSkrMyk7CiAJCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQkJZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCQlnb3RvIGVycl9vdXQ7CkBAIC0yODYxLDcgKzI4NjIsNyBAQAogI2lmZGVmIENPTkZJR19RVU9UQQogCS8qIFdlIGtub3cgdGhhdCBzdHJ1Y3R1cmUgd2FzIGFscmVhZHkgYWxsb2NhdGVkIGR1cmluZyBEUVVPVF9JTklUIHNvCiAJICogd2Ugd2lsbCBiZSB1cGRhdGluZyBvbmx5IHRoZSBkYXRhIGJsb2NrcyArIGlub2RlcyAqLwotCXJldCArPSAyKkVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTOworCXJldCArPSAyKkVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKICNlbmRpZgogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCA2MGU0NGU2ZC4uNTAzNzhkOCAxMDA2NDQKLS0tIGEvZnMvZXh0My9uYW1laS5jCisrKyBiL2ZzL2V4dDMvbmFtZWkuYwpAQCAtMTY0NSw5ICsxNjQ1LDkgQEAKIAlpbnQgZXJyLCByZXRyaWVzID0gMDsKIAogcmV0cnk6Ci0JaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKIAkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKLQkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIApAQCAtMTY3OSw5ICsxNjc5LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIHJldHJ5OgotCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MgKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSArCiAJCQkgCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDMgKwotCQkJCQkyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MpOworCQkJCQkyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MoZGlyLT5pX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCkBAIC0xNzE1LDkgKzE3MTUsOSBAQAogCQlyZXR1cm4gLUVNTElOSzsKIAogcmV0cnk6Ci0JaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKIAkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKLQkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIApAQCAtMjAwNiw3ICsyMDA2LDcgQEAKIAkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28gaW4KIAkgKiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLwogCURRVU9UX0lOSVQoZGVudHJ5LT5kX2lub2RlKTsKLQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RFTEVURV9UUkFOU19CTE9DS1MpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREVMRVRFX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKQEAgLTIwNjUsNyArMjA2NSw3IEBACiAJLyogSW5pdGlhbGl6ZSBxdW90YXMgYmVmb3JlIHNvIHRoYXQgZXZlbnR1YWwgd3JpdGVzIGdvCiAJICogaW4gc2VwYXJhdGUgdHJhbnNhY3Rpb24gKi8KIAlEUVVPVF9JTklUKGRlbnRyeS0+ZF9pbm9kZSk7Ci0JaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19ERUxFVEVfVFJBTlNfQkxPQ0tTKTsKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RFTEVURV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCkBAIC0yMTIwLDkgKzIxMjAsOSBAQAogCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAogcmV0cnk6Ci0JaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKIAkJCSAJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgNSArCi0JCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKQEAgLTIxNzQsNyArMjE3NCw3IEBACiAJCXJldHVybiAtRU1MSU5LOwogCiByZXRyeToKLQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikgKwogCQkJCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwpAQCAtMjIxNiw3ICsyMjE2LDggQEAKIAkgKiBpbiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLwogCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKQogCQlEUVVPVF9JTklUKG5ld19kZW50cnktPmRfaW5vZGUpOwotCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChvbGRfZGlyLCAyICogRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KG9sZF9kaXIsIDIgKgorCQkJCQlFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKG9sZF9kaXItPmlfc2IpICsKIAkJCSAJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMik7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDk2MzBmYmYuLjNjM2M2ZTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTU4OSw3ICs1ODksNyBAQAogCU9wdF9jb21taXQsIE9wdF9qb3VybmFsX3VwZGF0ZSwgT3B0X2pvdXJuYWxfaW51bSwKIAlPcHRfYWJvcnQsIE9wdF9kYXRhX2pvdXJuYWwsIE9wdF9kYXRhX29yZGVyZWQsIE9wdF9kYXRhX3dyaXRlYmFjaywKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAotCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwKKwlPcHRfanFmbXRfdmZzb2xkLCBPcHRfanFmbXRfdmZzdjAsIE9wdF9xdW90YSwgT3B0X25vcXVvdGEsCiAJT3B0X2lnbm9yZSwgT3B0X2JhcnJpZXIsIE9wdF9lcnIsIE9wdF9yZXNpemUsCiB9OwogCkBAIC02MzQsMTAgKzYzNCwxMCBAQAogCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCiAJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKIAl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKLQl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCi0Je09wdF9pZ25vcmUsICJub3F1b3RhIn0sCi0Je09wdF9pZ25vcmUsICJxdW90YSJ9LAotCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X3F1b3RhLCAiZ3JwcXVvdGEifSwKKwl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCisJe09wdF9xdW90YSwgInF1b3RhIn0sCisJe09wdF9xdW90YSwgInVzcnF1b3RhIn0sCiAJe09wdF9iYXJyaWVyLCAiYmFycmllcj0ldSJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIAl7T3B0X3Jlc2l6ZSwgInJlc2l6ZSJ9LApAQCAtODc2LDYgKzg3Niw3IEBACiAJCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9vZmZ1c3JqcXVvdGE6CiAJCQlxdHlwZSA9IFVTUlFVT1RBOwpAQCAtODg5LDcgKzg5MCwxMCBAQAogCQkJCQkicXVvdGEgdHVybmVkIG9uLlxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbcXR5cGVdKTsKKwkJCS8qCisJCQkgKiBUaGUgc3BhY2Ugd2lsbCBiZSByZWxlYXNlZCBsYXRlciB3aGVuIGFsbCBvcHRpb25zCisJCQkgKiBhcmUgY29uZmlybWVkIHRvIGJlIGNvcnJlY3QKKwkJCSAqLwogCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfanFmbXRfdmZzb2xkOgpAQCAtODk4LDYgKzkwMiwxNyBAQAogCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKIAkJCXNiaS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfVjA7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfcXVvdGE6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFFVT1RBKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3F1b3RhOgorCQkJaWYgKHNiX2FueV9xdW90YV9lbmFibGVkKHNiKSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogQ2Fubm90IGNoYW5nZSBxdW90YSAiCisJCQkJCSJvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOworCQkJYnJlYWs7CiAjZWxzZQogCQljYXNlIE9wdF91c3JqcXVvdGE6CiAJCWNhc2UgT3B0X2dycGpxdW90YToKQEAgLTkwOSw2ICs5MjQsOSBAQAogCQkJCSJFWFQzLWZzOiBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKIAkJCQkic3VwcG9ydGVkLlxuIik7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfcXVvdGE6CisJCWNhc2UgT3B0X25vcXVvdGE6CisJCQlicmVhazsKICNlbmRpZgogCQljYXNlIE9wdF9hYm9ydDoKIAkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQUJPUlQpOwpAQCAtOTI0LDEyICs5NDIsMTMgQEAKIAkJY2FzZSBPcHRfaWdub3JlOgogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3Jlc2l6ZToKLQkJCWlmICghbl9ibG9ja3NfY291bnQpIHsKKwkJCWlmICghaXNfcmVtb3VudCkgewogCQkJCXByaW50aygiRVhUMy1mczogcmVzaXplIG9wdGlvbiBvbmx5IGF2YWlsYWJsZSAiCiAJCQkJCSJmb3IgcmVtb3VudFxuIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCQltYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pOworCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikgIT0gMCkKKwkJCQlyZXR1cm4gMDsKIAkJCSpuX2Jsb2Nrc19jb3VudCA9IG9wdGlvbjsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub2JoOgpAQCAtMjA5MywxNCArMjExMiwzMyBAQAogewogCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXM7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7Ci0JdW5zaWduZWQgbG9uZyB0bXA7CiAJdW5zaWduZWQgbG9uZyBuX2Jsb2Nrc19jb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBvbGRfc2JfZmxhZ3M7CisJc3RydWN0IGV4dDNfbW91bnRfb3B0aW9ucyBvbGRfb3B0czsKKwlpbnQgZXJyOworI2lmZGVmIENPTkZJR19RVU9UQQorCWludCBpOworI2VuZGlmCisKKwkvKiBTdG9yZSB0aGUgb3JpZ2luYWwgb3B0aW9ucyAqLworCW9sZF9zYl9mbGFncyA9IHNiLT5zX2ZsYWdzOworCW9sZF9vcHRzLnNfbW91bnRfb3B0ID0gc2JpLT5zX21vdW50X29wdDsKKwlvbGRfb3B0cy5zX3Jlc3VpZCA9IHNiaS0+c19yZXN1aWQ7CisJb2xkX29wdHMuc19yZXNnaWQgPSBzYmktPnNfcmVzZ2lkOworCW9sZF9vcHRzLnNfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlvbGRfb3B0cy5zX2pxdW90YV9mbXQgPSBzYmktPnNfanF1b3RhX2ZtdDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCW9sZF9vcHRzLnNfcWZfbmFtZXNbaV0gPSBzYmktPnNfcWZfbmFtZXNbaV07CisjZW5kaWYKIAogCS8qCiAJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgogCSAqLwotCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYiwgJnRtcCwgJm5fYmxvY2tzX2NvdW50LCAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCBOVUxMLCAmbl9ibG9ja3NfY291bnQsIDEpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gcmVzdG9yZV9vcHRzOworCX0KIAogCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkKIAkJZXh0M19hYm9ydChzYiwgX19GVU5DVElPTl9fLCAiQWJvcnQgZm9yY2VkIGJ5IHVzZXIiKTsKQEAgLTIxMTQsOCArMjE1MiwxMCBAQAogCiAJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpICE9IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgfHwKIAkJbl9ibG9ja3NfY291bnQgPiBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7Ci0JCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkKLQkJCXJldHVybiAtRVJPRlM7CisJCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkgeworCQkJZXJyID0gLUVST0ZTOworCQkJZ290byByZXN0b3JlX29wdHM7CisJCX0KIAogCQlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKSB7CiAJCQkvKgpAQCAtMjE0Miw3ICsyMTgyLDggQEAKIAkJCQkgICAgICAgInJlbW91bnQgUkRXUiBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkICIKIAkJCQkgICAgICAgIm9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAogCQkJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUocmV0KSk7Ci0JCQkJcmV0dXJuIC1FUk9GUzsKKwkJCQllcnIgPSAtRVJPRlM7CisJCQkJZ290byByZXN0b3JlX29wdHM7CiAJCQl9CiAJCQkvKgogCQkJICogTW91bnRpbmcgYSBSRE9OTFkgcGFydGl0aW9uIHJlYWQtd3JpdGUsIHNvIHJlcmVhZApAQCAtMjE1MiwxMyArMjE5MywzOCBAQAogCQkJICovCiAJCQlleHQzX2NsZWFyX2pvdXJuYWxfZXJyKHNiLCBlcyk7CiAJCQlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7Ci0JCQlpZiAoKHJldCA9IGV4dDNfZ3JvdXBfZXh0ZW5kKHNiLCBlcywgbl9ibG9ja3NfY291bnQpKSkKLQkJCQlyZXR1cm4gcmV0OworCQkJaWYgKChyZXQgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpIHsKKwkJCQllcnIgPSByZXQ7CisJCQkJZ290byByZXN0b3JlX29wdHM7CisJCQl9CiAJCQlpZiAoIWV4dDNfc2V0dXBfc3VwZXIgKHNiLCBlcywgMCkpCiAJCQkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKIAkJfQogCX0KKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBSZWxlYXNlIG9sZCBxdW90YSBmaWxlIG5hbWVzICovCisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQorCQlpZiAob2xkX29wdHMuc19xZl9uYW1lc1tpXSAmJgorCQkgICAgb2xkX29wdHMuc19xZl9uYW1lc1tpXSAhPSBzYmktPnNfcWZfbmFtZXNbaV0pCisJCQlrZnJlZShvbGRfb3B0cy5zX3FmX25hbWVzW2ldKTsKKyNlbmRpZgogCXJldHVybiAwOworcmVzdG9yZV9vcHRzOgorCXNiLT5zX2ZsYWdzID0gb2xkX3NiX2ZsYWdzOworCXNiaS0+c19tb3VudF9vcHQgPSBvbGRfb3B0cy5zX21vdW50X29wdDsKKwlzYmktPnNfcmVzdWlkID0gb2xkX29wdHMuc19yZXN1aWQ7CisJc2JpLT5zX3Jlc2dpZCA9IG9sZF9vcHRzLnNfcmVzZ2lkOworCXNiaS0+c19jb21taXRfaW50ZXJ2YWwgPSBvbGRfb3B0cy5zX2NvbW1pdF9pbnRlcnZhbDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlzYmktPnNfanF1b3RhX2ZtdCA9IG9sZF9vcHRzLnNfanF1b3RhX2ZtdDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKHNiaS0+c19xZl9uYW1lc1tpXSAmJgorCQkgICAgb2xkX29wdHMuc19xZl9uYW1lc1tpXSAhPSBzYmktPnNfcWZfbmFtZXNbaV0pCisJCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbaV0pOworCQlzYmktPnNfcWZfbmFtZXNbaV0gPSBvbGRfb3B0cy5zX3FmX25hbWVzW2ldOworCX0KKyNlbmRpZgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgZXh0M19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1ZikKQEAgLTIyMzgsNyArMjMwNCw3IEBACiAJaW50IHJldCwgZXJyOwogCiAJLyogV2UgbWF5IGNyZWF0ZSBxdW90YSBzdHJ1Y3R1cmUgc28gd2UgbmVlZCB0byByZXNlcnZlIGVub3VnaCBibG9ja3MgKi8KLQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAJcmV0ID0gZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7CkBAIC0yMjU0LDcgKzIzMjAsNyBAQAogCWludCByZXQsIGVycjsKIAogCS8qIFdlIG1heSBkZWxldGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCi0JaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgMipFWFQzX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAJcmV0ID0gZHF1b3RfZHJvcChpbm9kZSk7CkBAIC0yMjcyLDcgKzIzMzgsNyBAQAogCiAJaW5vZGUgPSBkcXVvdF90b19pbm9kZShkcXVvdCk7CiAJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLAotCQkJCQlFWFQzX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisJCQkJCUVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRxdW90LT5kcV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAlyZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOwpAQCAtMjI4OCw3ICsyMzU0LDcgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCiAJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKLQkJCQkJRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJCQkJCUVYVDNfUVVPVEFfSU5JVF9CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCXJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOwpAQCAtMjMwNCw3ICsyMzcwLDcgQEAKIAloYW5kbGVfdCAqaGFuZGxlOwogCiAJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKLQkJCQkJRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJCQkJCUVYVDNfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAJcmV0ID0gZHF1b3RfcmVsZWFzZShkcXVvdCk7CkBAIC0yMzYxLDYgKzI0MjcsOCBAQAogCWludCBlcnI7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAorCWlmICghdGVzdF9vcHQoc2IsIFFVT1RBKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJLyogTm90IGpvdXJuYWxsaW5nIHF1b3RhPyAqLwogCWlmICghRVhUM19TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCiAJICAgICFFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pCmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyLmMgYi9mcy9leHQzL3hhdHRyLmMKaW5kZXggNGNiYzZkMC4uM2Y5ZGZhNiAxMDA2NDQKLS0tIGEvZnMvZXh0My94YXR0ci5jCisrKyBiL2ZzL2V4dDMveGF0dHIuYwpAQCAtMTA0NCw3ICsxMDQ0LDcgQEAKIAlpbnQgZXJyb3IsIHJldHJpZXMgPSAwOwogCiByZXRyeToKLQloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZnMvZmF0L2NhY2hlLmMgYi9mcy9mYXQvY2FjaGUuYwppbmRleCA3YzUyZTQ2Li43N2MyNGZjIDEwMDY0NAotLS0gYS9mcy9mYXQvY2FjaGUuYworKysgYi9mcy9mYXQvY2FjaGUuYwpAQCAtNTYsNyArNTYsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9fZXhpdCBmYXRfY2FjaGVfZGVzdHJveSh2b2lkKQordm9pZCBmYXRfY2FjaGVfZGVzdHJveSh2b2lkKQogewogCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koZmF0X2NhY2hlX2NhY2hlcCkpCiAJCXByaW50ayhLRVJOX0lORk8gImZhdF9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCA4Y2NlZTg0Li45NmFlODViIDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtMTMyNywxNiArMTMyNywyNSBAQAogRVhQT1JUX1NZTUJPTChmYXRfZmlsbF9zdXBlcik7CiAKIGludCBfX2luaXQgZmF0X2NhY2hlX2luaXQodm9pZCk7Ci12b2lkIF9fZXhpdCBmYXRfY2FjaGVfZGVzdHJveSh2b2lkKTsKK3ZvaWQgZmF0X2NhY2hlX2Rlc3Ryb3kodm9pZCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfZmF0X2ZzKHZvaWQpCiB7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gZmF0X2NhY2hlX2luaXQoKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gZmF0X2luaXRfaW5vZGVjYWNoZSgpOworCWVyciA9IGZhdF9jYWNoZV9pbml0KCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGZhdF9pbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWxlZDsKKworCXJldHVybiAwOworCitmYWlsZWQ6CisJZmF0X2NhY2hlX2Rlc3Ryb3koKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9mYXRfZnModm9pZCkKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCBmYTc4NDlmLi4xZDNkZTc4IDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKKysrIGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXZlbnRwb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KIAogLyogc3lzY3RsIHR1bmFibGVzLi4uICovCiBzdHJ1Y3QgZmlsZXNfc3RhdF9zdHJ1Y3QgZmlsZXNfc3RhdCA9IHsKQEAgLTEyNiw2ICsxMjcsOCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKIAltaWdodF9zbGVlcCgpOworCisJZnNub3RpZnlfY2xvc2UoZmlsZSk7CiAJLyoKIAkgKiBUaGUgZnVuY3Rpb24gZXZlbnRwb2xsX3JlbGVhc2UoKSBzaG91bGQgYmUgdGhlIGZpcnN0IGNhbGxlZAogCSAqIGluIHRoZSBmaWxlIGNsZWFudXAgY2hhaW4uCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmgKaW5kZXggOGRhMDI1Mi4uNTgzYmQ3OCAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmcy5oCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnMuaApAQCAtMzcsNyArMzcsNiBAQAogICogc3VwZXJibG9ja3Mgb2YgdGhlIFZlcml0YXMgRmlsZXN5c3RlbS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSAidnhmc19rY29tcGF0LmgiCiAKIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMKaW5kZXggYmM0YjU3ZC4uZDNmNmIyOCAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogCXJldHVybiAwOwogCiBmYWlsX3NpemU6Ci0JcHJpbnRrKCJ2eGZzOiBpbmRpcmVjdCBleHRlbnQgdG8gYmlnIVxuIik7CisJcHJpbnRrKCJ2eGZzOiBpbmRpcmVjdCBleHRlbnQgdG9vIGJpZyFcbiIpOwogZmFpbF9idWY6CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYwppbmRleCAwNWIxOWY3Li42ZGVlMTA5IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMKQEAgLTc4LDE3ICs3OCwxOCBAQAogCXN0cnVjdCBidWZmZXJfaGVhZAkJKmJwOwogCiAJYnAgPSB2eGZzX2JyZWFkKGlwLCB3aGljaCk7Ci0JaWYgKGJ1ZmZlcl9tYXBwZWQoYnApKSB7CisJaWYgKGJwKSB7CiAJCXN0cnVjdCB2eGZzX2ZzaAkJKmZocDsKIAotCQlpZiAoIShmaHAgPSBrbWFsbG9jKHNpemVvZigqZmhwKSwgU0xBQl9LRVJORUwpKSkKLQkJCXJldHVybiBOVUxMOworCQlpZiAoIShmaHAgPSBrbWFsbG9jKHNpemVvZigqZmhwKSwgR0ZQX0tFUk5FTCkpKQorCQkJZ290byBvdXQ7CiAJCW1lbWNweShmaHAsIGJwLT5iX2RhdGEsIHNpemVvZigqZmhwKSk7CiAKLQkJYnJlbHNlKGJwKTsKKwkJcHV0X2JoKGJwKTsKIAkJcmV0dXJuIChmaHApOwogCX0KLQorb3V0OgorCWJyZWxzZShicCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfa2NvbXBhdC5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19rY29tcGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmE0Y2MuLjAwMDAwMDAKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19rY29tcGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jaWZuZGVmIF9WWEZTX0tDT01QQVRfSAotI2RlZmluZSBfVlhGU19LQ09NUEFUX0gKLQotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCi0KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLQotdHlwZWRlZiBsb25nIHNlY3Rvcl90OwotCi0vKiBGcm9tIGluY2x1ZGUvbGludXgvZnMuaCAoTGludXggMi41LjItcHJlMykgICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNiX2JyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKLXsKLQlyZXR1cm4gYnJlYWQoc2ItPnNfZGV2LCBibG9jaywgc2ItPnNfYmxvY2tzaXplKTsKLX0KLQotLyogRGl0by4gICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFwX2JoKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKLXsKLQliaC0+Yl9zdGF0ZSB8PSAxIDw8IEJIX01hcHBlZDsKLQliaC0+Yl9kZXYgPSBzYi0+c19kZXY7Ci0JYmgtPmJfYmxvY2tuciA9IGJsb2NrOwotfQotCi0vKiBGcm9tIGZzL2Jsb2NrX2Rldi5jIChMaW51eCAyLjUuMi1wcmUyKSAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNiX3NldF9ibG9ja3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHNpemUpCi17Ci0JaW50IGJpdHM7Ci0JaWYgKHNldF9ibG9ja3NpemUoc2ItPnNfZGV2LCBzaXplKSA8IDApCi0JCXJldHVybiAwOwotCXNiLT5zX2Jsb2Nrc2l6ZSA9IHNpemU7Ci0JZm9yIChiaXRzID0gOSwgc2l6ZSA+Pj0gOTsgc2l6ZSA+Pj0gMTsgYml0cysrKQotCQk7Ci0Jc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBiaXRzOwotCXJldHVybiBzYi0+c19ibG9ja3NpemU7Ci19Ci0KLS8qIERpdG8uICAqLwotc3RhdGljIGlubGluZSBpbnQgc2JfbWluX2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKLXsKLQlpbnQgbWluc2l6ZSA9IGdldF9oYXJkc2VjdF9zaXplKHNiLT5zX2Rldik7Ci0JaWYgKHNpemUgPCBtaW5zaXplKQotCQlzaXplID0gbWluc2l6ZTsKLQlyZXR1cm4gc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgc2l6ZSk7Ci19Ci0KLSNlbmRpZiAvKiBLZXJuZWwgMi40ICovCi0jZW5kaWYgLyogX1ZYRlNfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwppbmRleCA1MDZhZTI1Li41NTRlYjQ1IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfbG9va3VwLmMKQEAgLTYxLDEzICs2MSwxMyBAQAogfTsKIAogIAotc3RhdGljIF9faW5saW5lX18gdV9sb25nCitzdGF0aWMgaW5saW5lIHVfbG9uZwogZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJcmV0dXJuIChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKIH0KICAKLXN0YXRpYyBfX2lubGluZV9fIHVfbG9uZworc3RhdGljIGlubGluZSB1X2xvbmcKIGRpcl9ibG9ja3Moc3RydWN0IGlub2RlICppcCkKIHsKIAl1X2xvbmcJCQlic2l6ZSA9IGlwLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKQEAgLTc5LDcgKzc5LDcgQEAKICAqCiAgKiBsZW4gPD0gVlhGU19OQU1FTEVOIGFuZCBkZSAhPSBOVUxMIGFyZSBndWFyYW50ZWVkIGJ5IGNhbGxlci4KICAqLwotc3RhdGljIF9faW5saW5lX18gaW50CitzdGF0aWMgaW5saW5lIGludAogdnhmc19tYXRjaChpbnQgbGVuLCBjb25zdCBjaGFyICogY29uc3QgbmFtZSwgc3RydWN0IHZ4ZnNfZGlyZWN0ICpkZSkKIHsKIAlpZiAobGVuICE9IGRlLT5kX25hbWVsZW4pCkBAIC04OSw3ICs4OSw3IEBACiAJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPmRfbmFtZSwgbGVuKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gc3RydWN0IHZ4ZnNfZGlyZWN0ICoKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZ4ZnNfZGlyZWN0ICoKIHZ4ZnNfbmV4dF9lbnRyeShzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlKQogewogCXJldHVybiAoKHN0cnVjdCB2eGZzX2RpcmVjdCAqKSgoY2hhciopZGUgKyBkZS0+ZF9yZWNsZW4pKTsKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMgYi9mcy9mcmVldnhmcy92eGZzX29sdC5jCmluZGV4IDdhMjA0ZTMuLjEzMzQ3NjIgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgInZ4ZnNfb2x0LmgiCiAKIAotc3RhdGljIF9faW5saW5lX18gdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiB2eGZzX2dldF9mc2hlYWQoc3RydWN0IHZ4ZnNfb2x0ZnNoZWFkICpmc2hwLCBzdHJ1Y3Qgdnhmc19zYl9pbmZvICppbmZwKQogewogCWlmIChpbmZwLT52c2lfZnNoaW5vKQpAQCAtNDYsNyArNDYsNyBAQAogCWluZnAtPnZzaV9mc2hpbm8gPSBmc2hwLT5vbHRfZnNpbm9bMF07CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogdnhmc19nZXRfaWxpc3Qoc3RydWN0IHZ4ZnNfb2x0aWxpc3QgKmlsaXN0cCwgc3RydWN0IHZ4ZnNfc2JfaW5mbyAqaW5mcCkKIHsKIAlpZiAoaW5mcC0+dnNpX2lleHQpCkBAIC01NCw3ICs1NCw3IEBACiAJaW5mcC0+dnNpX2lleHQgPSBpbGlzdHAtPm9sdF9pZXh0WzBdOyAKIH0KIAotc3RhdGljIF9faW5saW5lX18gdV9sb25nCitzdGF0aWMgaW5saW5lIHVfbG9uZwogdnhmc19vYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGRhZGRyX3QgYmxvY2ssIHVfbG9uZyBic2l6ZSkKIHsKIAlpZiAoc2JwLT5zX2Jsb2Nrc2l6ZSAlIGJzaXplKQpAQCAtMTA0LDggKzEwNCw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlvYWRkciA9IChjaGFyICopYnAtPmJfZGF0YSArIG9wLT5vbHRfc2l6ZTsKLQllYWRkciA9IChjaGFyICopYnAtPmJfZGF0YSArIChpbmZwLT52c2lfb2x0c2l6ZSAqIHNicC0+c19ibG9ja3NpemUpOworCW9hZGRyID0gYnAtPmJfZGF0YSArIG9wLT5vbHRfc2l6ZTsKKwllYWRkciA9IGJwLT5iX2RhdGEgKyAoaW5mcC0+dnNpX29sdHNpemUgKiBzYnAtPnNfYmxvY2tzaXplKTsKIAogCXdoaWxlIChvYWRkciA8IGVhZGRyKSB7CiAJCXN0cnVjdCB2eGZzX29sdGNvbW1vbgkqb2NwID0KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMKaW5kZXggNWUzMDU2MS4uNTBhYWU3NyAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogCi0jaW5jbHVkZSAidnhmc19rY29tcGF0LmgiCiAjaW5jbHVkZSAidnhmc19leHRlcm4uaCIKIAogCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKaW5kZXggMGFlMmM3Yi4uMjdmNjZkMyAxMDA2NDQKLS0tIGEvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpAQCAtMTU1LDEyICsxNTUsMTEgQEAKIAogCXNicC0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAKLQlpbmZwID0ga21hbGxvYyhzaXplb2YoKmluZnApLCBHRlBfS0VSTkVMKTsKKwlpbmZwID0ga2NhbGxvYygxLCBzaXplb2YoKmluZnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZnApIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAidnhmczogdW5hYmxlIHRvIGFsbG9jYXRlIGluY29yZSBzdXBlcmJsb2NrXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChpbmZwLCAwLCBzaXplb2YoKmluZnApKTsKIAogCWJzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYnAsIEJMT0NLX1NJWkUpOwogCWlmICghYnNpemUpIHsKQEAgLTE5Niw3ICsxOTUsNyBAQAogI2VuZGlmCiAKIAlzYnAtPnNfbWFnaWMgPSByc2JwLT52c19tYWdpYzsKLQlzYnAtPnNfZnNfaW5mbyA9ICh2b2lkICopaW5mcDsKKwlzYnAtPnNfZnNfaW5mbyA9IGluZnA7CiAKIAlpbmZwLT52c2lfcmF3ID0gcnNicDsKIAlpbmZwLT52c2lfYnAgPSBicDsKQEAgLTI2Myw3ICsyNjIsNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCB2eGZzX2lub2RlX2luZm8pLCAwLCAKIAkJCVNMQUJfUkVDTEFJTV9BQ0NPVU5ULCBOVUxMLCBOVUxMKTsKIAlpZiAodnhmc19pbm9kZV9jYWNoZXApCi0JCXJldHVybiAocmVnaXN0ZXJfZmlsZXN5c3RlbSgmdnhmc19mc190eXBlKSk7CisJCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZ2eGZzX2ZzX3R5cGUpOwogCXJldHVybiAtRU5PTUVNOwogfQogCmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKaW5kZXggZjhlMGNiZC4uNmY1NTNlMSAxMDA2NDQKLS0tIGEvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwpAQCAtNCw2ICs0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ5MSw3ICs0OTIsNyBAQAogCQlmZCA9IG9wZW5faG9zdF9zb2NrKGhvc3RfZmlsZSwgJmZpbHRlcik7CiAJCWlmKGZkID4gMCl7CiAJCQlkYXRhLT5jb250ZW50cyA9IGhwcGZzX2dldF9kYXRhKGZkLCBmaWx0ZXIsCi0JCQkJCQkJJmRhdGEtPnByb2NfZmlsZSwKKwkJCQkJCQlkYXRhLT5wcm9jX2ZpbGUsCiAJCQkJCQkJZmlsZSwgJmRhdGEtPmxlbik7CiAJCQlpZighSVNfRVJSKGRhdGEtPmNvbnRlbnRzKSkKIAkJCQlkYXRhLT5ob3N0X2ZkID0gZmQ7CkBAIC01NDMsNyArNTQ0LDcgQEAKIHN0YXRpYyBsb2ZmX3QgaHBwZnNfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlcmUpCiB7CiAJc3RydWN0IGhwcGZzX3ByaXZhdGUgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGZpbGUgKnByb2NfZmlsZSA9ICZkYXRhLT5wcm9jX2ZpbGU7CisJc3RydWN0IGZpbGUgKnByb2NfZmlsZSA9IGRhdGEtPnByb2NfZmlsZTsKIAlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIAlsb2ZmX3QgcmV0OwogCkBAIC01ODYsNyArNTg3LDcgQEAKIHN0YXRpYyBpbnQgaHBwZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKIAlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gJmRhdGEtPnByb2NfZmlsZTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gZGF0YS0+cHJvY19maWxlOwogCWludCAoKnJlYWRkaXIpKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKIAlzdHJ1Y3QgaHBwZnNfZGlyZW50IGRpcmVudCA9ICgoc3RydWN0IGhwcGZzX2RpcmVudCkKIAkJICAgICAgICAgICAgICAgICAgICAgIHsgLnZmc19kaXJlbnQgIAk9IGVudCwKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDFmOWEzYTIuLjk2MzY0ZmEgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KIAogLyoKICAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKQEAgLTIwMiw2ICsyMDMsMTAgQEAKIAlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGF0YS5pX21tYXBfbm9ubGluZWFyKTsKIAlzcGluX2xvY2tfaW5pdCgmaW5vZGUtPmlfbG9jayk7CiAJaV9zaXplX29yZGVyZWRfaW5pdChpbm9kZSk7CisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcyk7CisJc2VtYV9pbml0KCZpbm9kZS0+aW5vdGlmeV9zZW0sIDEpOworI2VuZGlmCiB9CiAKIEVYUE9SVF9TWU1CT0woaW5vZGVfaW5pdF9vbmNlKTsKQEAgLTI4Miw2ICsyODcsMTMgQEAKIAkJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKIAkJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKIAkJY2xlYXJfaW5vZGUoaW5vZGUpOworCisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCWhsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9oYXNoKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQl3YWtlX3VwX2lub2RlKGlub2RlKTsKIAkJZGVzdHJveV9pbm9kZShpbm9kZSk7CiAJCW5yX2Rpc3Bvc2VkKys7CiAJfQpAQCAtMzE3LDggKzMyOSw2IEBACiAJCWlub2RlID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBpbm9kZSwgaV9zYl9saXN0KTsKIAkJaW52YWxpZGF0ZV9pbm9kZV9idWZmZXJzKGlub2RlKTsKIAkJaWYgKCFhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKSB7Ci0JCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7Ci0JCQlsaXN0X2RlbCgmaW5vZGUtPmlfc2JfbGlzdCk7CiAJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsIGRpc3Bvc2UpOwogCQkJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOwogCQkJY291bnQrKzsKQEAgLTM0Niw2ICszNTYsNyBAQAogCiAJZG93bigmaXBydW5lX3NlbSk7CiAJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlpbm90aWZ5X3VubW91bnRfaW5vZGVzKCZzYi0+c19pbm9kZXMpOwogCWJ1c3kgPSBpbnZhbGlkYXRlX2xpc3QoJnNiLT5zX2lub2RlcywgJnRocm93X2F3YXkpOwogCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKIApAQCAtNDM5LDggKzQ1MCw2IEBACiAJCQlpZiAoIWNhbl91bnVzZShpbm9kZSkpCiAJCQkJY29udGludWU7CiAJCX0KLQkJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOwotCQlsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9zYl9saXN0KTsKIAkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmZnJlZWFibGUpOwogCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0ZSRUVJTkc7CiAJCW5yX3BydW5lZCsrOwpAQCAtMTA1Miw3ICsxMDYxLDcgQEAKICAqIGlub2RlIHdoZW4gdGhlIHVzYWdlIGNvdW50IGRyb3BzIHRvIHplcm8sIGFuZAogICogaV9ubGluayBpcyB6ZXJvLgogICovCi1zdGF0aWMgdm9pZCBnZW5lcmljX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgZ2VuZXJpY19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaWYgKCFpbm9kZS0+aV9ubGluaykKIAkJZ2VuZXJpY19kZWxldGVfaW5vZGUoaW5vZGUpOwpAQCAtMTA2MCw2ICsxMDY5LDggQEAKIAkJZ2VuZXJpY19mb3JnZXRfaW5vZGUoaW5vZGUpOwogfQogCitFWFBPUlRfU1lNQk9MX0dQTChnZW5lcmljX2Ryb3BfaW5vZGUpOworCiAvKgogICogQ2FsbGVkIHdoZW4gd2UncmUgZHJvcHBpbmcgdGhlIGxhc3QgcmVmZXJlbmNlCiAgKiB0byBhbiBpbm9kZS4gCkBAIC0xMjQyLDI5ICsxMjUzLDIxIEBACiB9CiAKIC8qCi0gKiBJZiB3ZSB0cnkgdG8gZmluZCBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB3aGlsZSBpdCBpcyBiZWluZyBkZWxldGVkLCB3ZQotICogaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBmaWxlc3lzdGVtIGNvbXBsZXRlcyBpdHMgZGVsZXRpb24gYmVmb3JlIHJlcG9ydGluZwotICogdGhhdCBpdCBpc24ndCBmb3VuZC4gIFRoaXMgaXMgYmVjYXVzZSBpZ2V0IHdpbGwgaW1tZWRpYXRlbHkgY2FsbAotICogLT5yZWFkX2lub2RlLCBhbmQgd2Ugd2FudCB0byBiZSBzdXJlIHRoYXQgZXZpZGVuY2Ugb2YgdGhlIGRlbGV0aW9uIGlzIGZvdW5kCi0gKiBieSAtPnJlYWRfaW5vZGUuCisgKiBJZiB3ZSB0cnkgdG8gZmluZCBhbiBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB3aGlsZSBpdCBpcyBiZWluZworICogZGVsZXRlZCwgd2UgaGF2ZSB0byB3YWl0IHVudGlsIHRoZSBmaWxlc3lzdGVtIGNvbXBsZXRlcyBpdHMKKyAqIGRlbGV0aW9uIGJlZm9yZSByZXBvcnRpbmcgdGhhdCBpdCBpc24ndCBmb3VuZC4gIFRoaXMgZnVuY3Rpb24gd2FpdHMKKyAqIHVudGlsIHRoZSBkZWxldGlvbiBfbWlnaHRfIGhhdmUgY29tcGxldGVkLiAgQ2FsbGVycyBhcmUgcmVzcG9uc2libGUKKyAqIHRvIHJlY2hlY2sgaW5vZGUgc3RhdGUuCisgKgorICogSXQgZG9lc24ndCBtYXR0ZXIgaWYgSV9MT0NLIGlzIG5vdCBzZXQgaW5pdGlhbGx5LCBhIGNhbGwgdG8KKyAqIHdha2VfdXBfaW5vZGUoKSBhZnRlciByZW1vdmluZyBmcm9tIHRoZSBoYXNoIGxpc3Qgd2lsbCBEVFJULgorICoKICAqIFRoaXMgaXMgY2FsbGVkIHdpdGggaW5vZGVfbG9jayBoZWxkLgogICovCiBzdGF0aWMgdm9pZCBfX3dhaXRfb25fZnJlZWluZ19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXdhaXRfcXVldWVfaGVhZF90ICp3cTsKIAlERUZJTkVfV0FJVF9CSVQod2FpdCwgJmlub2RlLT5pX3N0YXRlLCBfX0lfTE9DSyk7Ci0KLQkvKgotCSAqIElfRlJFRUlORyBhbmQgSV9DTEVBUiBhcmUgY2xlYXJlZCBpbiBwcm9jZXNzIGNvbnRleHQgdW5kZXIKLQkgKiBpbm9kZV9sb2NrLCBzbyB3ZSBoYXZlIHRvIGdpdmUgdGhlIHRhc2tzIHdobyB3b3VsZCBjbGVhciB0aGVtCi0JICogYSBjaGFuY2UgdG8gcnVuIGFuZCBhY3F1aXJlIGlub2RlX2xvY2suCi0JICovCi0JaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spKSB7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKLQkJeWllbGQoKTsKLQkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKLQkJcmV0dXJuOwotCX0KIAl3cSA9IGJpdF93YWl0cXVldWUoJmlub2RlLT5pX3N0YXRlLCBfX0lfTE9DSyk7CiAJcHJlcGFyZV90b193YWl0KHdxLCAmd2FpdC53YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvaW5vdGlmeS5jIGIvZnMvaW5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjNiZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pbm90aWZ5LmMKQEAgLTAsMCArMSw5OTkgQEAKKy8qCisgKiBmcy9pbm90aWZ5LmMgLSBpbm9kZS1iYXNlZCBmaWxlIGV2ZW50IG5vdGlmaWNhdGlvbnMKKyAqCisgKiBBdXRob3JzOgorICoJSm9obiBNY0N1dGNoYW4JPHR0YkB0ZW50YWNsZS5kaHMub3JnPgorICoJUm9iZXJ0IExvdmUJPHJtbEBub3ZlbGwuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBKb2huIE1jQ3V0Y2hhbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KKworI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworc3RhdGljIGF0b21pY190IGlub3RpZnlfY29va2llOworCitzdGF0aWMga21lbV9jYWNoZV90ICp3YXRjaF9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90ICpldmVudF9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmlub3RpZnlfbW50OworCisvKiBUaGVzZSBhcmUgY29uZmlndXJhYmxlIHZpYSAvcHJvYy9zeXMvaW5vdGlmeSAqLworaW50IGlub3RpZnlfbWF4X3VzZXJfZGV2aWNlczsKK2ludCBpbm90aWZ5X21heF91c2VyX3dhdGNoZXM7CitpbnQgaW5vdGlmeV9tYXhfcXVldWVkX2V2ZW50czsKKworLyoKKyAqIExvY2sgb3JkZXJpbmc6CisgKgorICogZGVudHJ5LT5kX2xvY2sgKHVzZWQgdG8ga2VlcCBkX21vdmUoKSBhd2F5IGZyb20gZGVudHJ5LT5kX3BhcmVudCkKKyAqIGlwcnVuZV9zZW0gKHN5bmNocm9uaXplIHNocmlua19pY2FjaGVfbWVtb3J5KCkpCisgKiAJaW5vZGVfbG9jayAocHJvdGVjdHMgdGhlIHN1cGVyX2Jsb2NrLT5zX2lub2RlcyBsaXN0KQorICogCWlub2RlLT5pbm90aWZ5X3NlbSAocHJvdGVjdHMgaW5vZGUtPmlub3RpZnlfd2F0Y2hlcyBhbmQgd2F0Y2hlcy0+aV9saXN0KQorICogCQlpbm90aWZ5X2Rldi0+c2VtIChwcm90ZWN0cyBpbm90aWZ5X2RldmljZSBhbmQgd2F0Y2hlcy0+ZF9saXN0KQorICovCisKKy8qCisgKiBMaWZldGltZXMgb2YgdGhlIHRocmVlIG1haW4gZGF0YSBzdHJ1Y3R1cmVzLS1pbm90aWZ5X2RldmljZSwgaW5vZGUsIGFuZAorICogaW5vdGlmeV93YXRjaC0tYXJlIG1hbmFnZWQgYnkgcmVmZXJlbmNlIGNvdW50LgorICoKKyAqIGlub3RpZnlfZGV2aWNlOiBMaWZldGltZSBpcyBmcm9tIG9wZW4gdW50aWwgcmVsZWFzZS4gIEFkZGl0aW9uYWwgcmVmZXJlbmNlcworICogY2FuIGJ1bXAgdGhlIGNvdW50IHZpYSBnZXRfaW5vdGlmeV9kZXYoKSBhbmQgZHJvcCB0aGUgY291bnQgdmlhCisgKiBwdXRfaW5vdGlmeV9kZXYoKS4KKyAqCisgKiBpbm90aWZ5X3dhdGNoOiBMaWZldGltZSBpcyBmcm9tIGNyZWF0ZV93YXRjaCgpIHRvIGRlc3Rvcnlfd2F0Y2goKS4KKyAqIEFkZGl0aW9uYWwgcmVmZXJlbmNlcyBjYW4gYnVtcCB0aGUgY291bnQgdmlhIGdldF9pbm90aWZ5X3dhdGNoKCkgYW5kIGRyb3AKKyAqIHRoZSBjb3VudCB2aWEgcHV0X2lub3RpZnlfd2F0Y2goKS4KKyAqCisgKiBpbm9kZTogUGlubmVkIHNvIGxvbmcgYXMgdGhlIGlub2RlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHdhdGNoLCBmcm9tCisgKiBjcmVhdGVfd2F0Y2goKSB0byBwdXRfaW5vdGlmeV93YXRjaCgpLgorICovCisKKy8qCisgKiBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgLSByZXByZXNlbnRzIGFuIG9wZW4gaW5zdGFuY2Ugb2YgYW4gaW5vdGlmeSBkZXZpY2UKKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNlbWFwaG9yZSAnc2VtJy4KKyAqLworc3RydWN0IGlub3RpZnlfZGV2aWNlIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAJd3E7CQkvKiB3YWl0IHF1ZXVlIGZvciBpL28gKi8KKwlzdHJ1Y3QgaWRyCQlpZHI7CQkvKiBpZHIgbWFwcGluZyB3ZCAtPiB3YXRjaCAqLworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOwkJLyogcHJvdGVjdHMgdGhpcyBiYWQgYm95ICovCisJc3RydWN0IGxpc3RfaGVhZCAJZXZlbnRzOwkJLyogbGlzdCBvZiBxdWV1ZWQgZXZlbnRzICovCisJc3RydWN0IGxpc3RfaGVhZAl3YXRjaGVzOwkvKiBsaXN0IG9mIHdhdGNoZXMgKi8KKwlhdG9taWNfdAkJY291bnQ7CQkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJKnVzZXI7CQkvKiB1c2VyIHdobyBvcGVuZWQgdGhpcyBkZXYgKi8KKwl1bnNpZ25lZCBpbnQJCXF1ZXVlX3NpemU7CS8qIHNpemUgb2YgdGhlIHF1ZXVlIChieXRlcykgKi8KKwl1bnNpZ25lZCBpbnQJCWV2ZW50X2NvdW50OwkvKiBudW1iZXIgb2YgcGVuZGluZyBldmVudHMgKi8KKwl1bnNpZ25lZCBpbnQJCW1heF9ldmVudHM7CS8qIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyAqLworfTsKKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAtIEFuIGlub3RpZnkgZXZlbnQsIG9yaWdpbmF0aW5nIGZyb20gYSB3YXRjaCBhbmQKKyAqIHF1ZXVlZCBmb3IgdXNlci1zcGFjZS4gIEEgbGlzdCBvZiB0aGVzZSBpcyBhdHRhY2hlZCB0byBlYWNoIGluc3RhbmNlIG9mIHRoZQorICogZGV2aWNlLiAgSW4gcmVhZCgpLCB0aGlzIGxpc3QgaXMgd2Fsa2VkIGFuZCBhbGwgZXZlbnRzIHRoYXQgY2FuIGZpdCBpbiB0aGUKKyAqIGJ1ZmZlciBhcmUgcmV0dXJuZWQuCisgKgorICogUHJvdGVjdGVkIGJ5IGRldi0+c2VtIG9mIHRoZSBkZXZpY2UgaW4gd2hpY2ggd2UgYXJlIHF1ZXVlZC4KKyAqLworc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50IHsKKwlzdHJ1Y3QgaW5vdGlmeV9ldmVudAlldmVudDsJLyogdGhlIHVzZXItc3BhY2UgZXZlbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBsaXN0OwkvKiBlbnRyeSBpbiBpbm90aWZ5X2RldmljZSdzIGxpc3QgKi8KKwljaGFyCQkJKm5hbWU7CS8qIGZpbGVuYW1lLCBpZiBhbnkgKi8KK307CisKKy8qCisgKiBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAtIHJlcHJlc2VudHMgYSB3YXRjaCByZXF1ZXN0IG9uIGEgc3BlY2lmaWMgaW5vZGUKKyAqCisgKiBkX2xpc3QgaXMgcHJvdGVjdGVkIGJ5IGRldi0+c2VtIG9mIHRoZSBhc3NvY2lhdGVkIHdhdGNoLT5kZXYuCisgKiBpX2xpc3QgYW5kIG1hc2sgYXJlIHByb3RlY3RlZCBieSBpbm9kZS0+aW5vdGlmeV9zZW0gb2YgdGhlIGFzc29jaWF0ZWQgaW5vZGUuCisgKiBkZXYsIGlub2RlLCBhbmQgd2QgYXJlIG5ldmVyIHdyaXR0ZW4gdG8gb25jZSB0aGUgd2F0Y2ggaXMgY3JlYXRlZC4KKyAqLworc3RydWN0IGlub3RpZnlfd2F0Y2ggeworCXN0cnVjdCBsaXN0X2hlYWQJZF9saXN0OwkvKiBlbnRyeSBpbiBpbm90aWZ5X2RldmljZSdzIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWlfbGlzdDsJLyogZW50cnkgaW4gaW5vZGUncyBsaXN0ICovCisJYXRvbWljX3QJCWNvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UJKmRldjsJLyogYXNzb2NpYXRlZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsJLyogYXNzb2NpYXRlZCBpbm9kZSAqLworCXMzMiAJCQl3ZDsJLyogd2F0Y2ggZGVzY3JpcHRvciAqLworCXUzMgkJCW1hc2s7CS8qIGV2ZW50IG1hc2sgZm9yIHRoaXMgd2F0Y2ggKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfaW5vdGlmeV9kZXYoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJYXRvbWljX2luYygmZGV2LT5jb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaW5vdGlmeV9kZXYoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+Y291bnQpKSB7CisJCWF0b21pY19kZWMoJmRldi0+dXNlci0+aW5vdGlmeV9kZXZzKTsKKwkJZnJlZV91aWQoZGV2LT51c2VyKTsKKwkJa2ZyZWUoZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfaW5vdGlmeV93YXRjaChzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gpCit7CisJYXRvbWljX2luYygmd2F0Y2gtPmNvdW50KTsKK30KKworLyoKKyAqIHB1dF9pbm90aWZ5X3dhdGNoIC0gZGVjcmVtZW50cyB0aGUgcmVmIGNvdW50IG9uIGEgZ2l2ZW4gd2F0Y2guICBjbGVhbnMgdXAKKyAqIHRoZSB3YXRjaCBhbmQgaXRzIHJlZmVyZW5jZXMgaWYgdGhlIGNvdW50IHJlYWNoZXMgemVyby4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pbm90aWZ5X3dhdGNoKHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmd2F0Y2gtPmNvdW50KSkgeworCQlwdXRfaW5vdGlmeV9kZXYod2F0Y2gtPmRldik7CisJCWlwdXQod2F0Y2gtPmlub2RlKTsKKwkJa21lbV9jYWNoZV9mcmVlKHdhdGNoX2NhY2hlcCwgd2F0Y2gpOworCX0KK30KKworLyoKKyAqIGtlcm5lbF9ldmVudCAtIGNyZWF0ZSBhIG5ldyBrZXJuZWwgZXZlbnQgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLgorICovCitzdGF0aWMgc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICoga2VybmVsX2V2ZW50KHMzMiB3ZCwgdTMyIG1hc2ssIHUzMiBjb29raWUsCisJCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQ7CisKKwlrZXZlbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGV2ZW50X2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFrZXZlbnQpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHdlIGhhbmQgdGhpcyBvdXQgdG8gdXNlci1zcGFjZSwgc28gemVybyBpdCBqdXN0IGluIGNhc2UgKi8KKwltZW1zZXQoJmtldmVudC0+ZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpOworCisJa2V2ZW50LT5ldmVudC53ZCA9IHdkOworCWtldmVudC0+ZXZlbnQubWFzayA9IG1hc2s7CisJa2V2ZW50LT5ldmVudC5jb29raWUgPSBjb29raWU7CisKKwlJTklUX0xJU1RfSEVBRCgma2V2ZW50LT5saXN0KTsKKworCWlmIChuYW1lKSB7CisJCXNpemVfdCBsZW4sIHJlbSwgZXZlbnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBwYWQgdGhlIGZpbGVuYW1lIHNvIGFzIHRvIHByb3Blcmx5IGFsaWduIGFuCisJCSAqIGFycmF5IG9mIGlub3RpZnlfZXZlbnQgc3RydWN0dXJlcy4gIEJlY2F1c2UgdGhlIHN0cnVjdHVyZSBpcworCQkgKiBzbWFsbCBhbmQgdGhlIGNvbW1vbiBjYXNlIGlzIGEgc21hbGwgZmlsZW5hbWUsIHdlIGp1c3Qgcm91bmQKKwkJICogdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgdGhlIHN0cnVjdHVyZSdzIHNpemVvZi4gIFRoaXMgaXMKKwkJICogc2ltcGxlIGFuZCBzYWZlIGZvciBhbGwgYXJjaGl0ZWN0dXJlcy4KKwkJICovCisJCWxlbiA9IHN0cmxlbihuYW1lKSArIDE7CisJCXJlbSA9IGV2ZW50X3NpemUgLSBsZW47CisJCWlmIChsZW4gPiBldmVudF9zaXplKSB7CisJCQlyZW0gPSBldmVudF9zaXplIC0gKGxlbiAlIGV2ZW50X3NpemUpOworCQkJaWYgKGxlbiAlIGV2ZW50X3NpemUgPT0gMCkKKwkJCQlyZW0gPSAwOworCQl9CisKKwkJa2V2ZW50LT5uYW1lID0ga21hbGxvYyhsZW4gKyByZW0sIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoIWtldmVudC0+bmFtZSkpIHsKKwkJCWttZW1fY2FjaGVfZnJlZShldmVudF9jYWNoZXAsIGtldmVudCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQltZW1jcHkoa2V2ZW50LT5uYW1lLCBuYW1lLCBsZW4pOworCQlpZiAocmVtKQorCQkJbWVtc2V0KGtldmVudC0+bmFtZSArIGxlbiwgMCwgcmVtKTsJCQorCQlrZXZlbnQtPmV2ZW50LmxlbiA9IGxlbiArIHJlbTsKKwl9IGVsc2UgeworCQlrZXZlbnQtPmV2ZW50LmxlbiA9IDA7CisJCWtldmVudC0+bmFtZSA9IE5VTEw7CisJfQorCisJcmV0dXJuIGtldmVudDsKK30KKworLyoKKyAqIGlub3RpZnlfZGV2X2dldF9ldmVudCAtIHJldHVybiB0aGUgbmV4dCBldmVudCBpbiB0aGUgZ2l2ZW4gZGV2J3MgcXVldWUKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGRldi0+c2VtLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqCitpbm90aWZ5X2Rldl9nZXRfZXZlbnQoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoZGV2LT5ldmVudHMubmV4dCwgc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50LCBsaXN0KTsKK30KKworLyoKKyAqIGlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50IC0gYWRkIGEgbmV3IGV2ZW50IHRvIHRoZSBnaXZlbiBkZXZpY2UKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIGRldi0+c2VtLiAgQ2FuIHNsZWVwIChjYWxscyBrZXJuZWxfZXZlbnQoKSkuCisgKi8KK3N0YXRpYyB2b2lkIGlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsIHUzMiBtYXNrLAorCQkJCSAgICB1MzIgY29va2llLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50LCAqbGFzdDsKKworCS8qIGNvYWxlc2Npbmc6IGRyb3AgdGhpcyBldmVudCBpZiBpdCBpcyBhIGR1cGUgb2YgdGhlIHByZXZpb3VzICovCisJbGFzdCA9IGlub3RpZnlfZGV2X2dldF9ldmVudChkZXYpOworCWlmIChsYXN0ICYmIGxhc3QtPmV2ZW50Lm1hc2sgPT0gbWFzayAmJiBsYXN0LT5ldmVudC53ZCA9PSB3YXRjaC0+d2QgJiYKKwkJCWxhc3QtPmV2ZW50LmNvb2tpZSA9PSBjb29raWUpIHsKKwkJY29uc3QgY2hhciAqbGFzdG5hbWUgPSBsYXN0LT5uYW1lOworCisJCWlmICghbmFtZSAmJiAhbGFzdG5hbWUpCisJCQlyZXR1cm47CisJCWlmIChuYW1lICYmIGxhc3RuYW1lICYmICFzdHJjbXAobGFzdG5hbWUsIG5hbWUpKQorCQkJcmV0dXJuOworCX0KKworCS8qIHRoZSBxdWV1ZSBvdmVyZmxvd2VkIGFuZCB3ZSBhbHJlYWR5IHNlbnQgdGhlIFFfT1ZFUkZMT1cgZXZlbnQgKi8KKwlpZiAodW5saWtlbHkoZGV2LT5ldmVudF9jb3VudCA+IGRldi0+bWF4X2V2ZW50cykpCisJCXJldHVybjsKKworCS8qIGlmIHRoZSBxdWV1ZSBvdmVyZmxvd3MsIHdlIG5lZWQgdG8gbm90aWZ5IHVzZXIgc3BhY2UgKi8KKwlpZiAodW5saWtlbHkoZGV2LT5ldmVudF9jb3VudCA9PSBkZXYtPm1heF9ldmVudHMpKQorCQlrZXZlbnQgPSBrZXJuZWxfZXZlbnQoLTEsIElOX1FfT1ZFUkZMT1csIGNvb2tpZSwgTlVMTCk7CisJZWxzZQorCQlrZXZlbnQgPSBrZXJuZWxfZXZlbnQod2F0Y2gtPndkLCBtYXNrLCBjb29raWUsIG5hbWUpOworCisJaWYgKHVubGlrZWx5KCFrZXZlbnQpKQorCQlyZXR1cm47CisKKwkvKiBxdWV1ZSB0aGUgZXZlbnQgYW5kIHdha2UgdXAgYW55b25lIHdhaXRpbmcgKi8KKwlkZXYtPmV2ZW50X2NvdW50Kys7CisJZGV2LT5xdWV1ZV9zaXplICs9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBrZXZlbnQtPmV2ZW50LmxlbjsKKwlsaXN0X2FkZF90YWlsKCZrZXZlbnQtPmxpc3QsICZkZXYtPmV2ZW50cyk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndxKTsKK30KKworLyoKKyAqIHJlbW92ZV9rZXZlbnQgLSBjbGVhbnMgdXAgYW5kIHVsdGltYXRlbHkgZnJlZXMgdGhlIGdpdmVuIGtldmVudAorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5zZW0uCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9rZXZlbnQoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50KQoreworCWxpc3RfZGVsKCZrZXZlbnQtPmxpc3QpOworCisJZGV2LT5ldmVudF9jb3VudC0tOworCWRldi0+cXVldWVfc2l6ZSAtPSBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpICsga2V2ZW50LT5ldmVudC5sZW47CisKKwlrZnJlZShrZXZlbnQtPm5hbWUpOworCWttZW1fY2FjaGVfZnJlZShldmVudF9jYWNoZXAsIGtldmVudCk7Cit9CisKKy8qCisgKiBpbm90aWZ5X2Rldl9ldmVudF9kZXF1ZXVlIC0gZGVzdHJveSBhbiBldmVudCBvbiB0aGUgZ2l2ZW4gZGV2aWNlCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPnNlbS4KKyAqLworc3RhdGljIHZvaWQgaW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZShzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKSkgeworCQlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudDsKKwkJa2V2ZW50ID0gaW5vdGlmeV9kZXZfZ2V0X2V2ZW50KGRldik7CisJCXJlbW92ZV9rZXZlbnQoZGV2LCBrZXZlbnQpOworCX0KK30KKworLyoKKyAqIGlub3RpZnlfZGV2X2dldF93ZCAtIHJldHVybnMgdGhlIG5leHQgV0QgZm9yIHVzZSBieSB0aGUgZ2l2ZW4gZGV2CisgKgorICogQ2FsbGVycyBtdXN0IGhvbGQgZGV2LT5zZW0uICBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KKyAqLworc3RhdGljIGludCBpbm90aWZ5X2Rldl9nZXRfd2Qoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gpCit7CisJaW50IHJldDsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KCFpZHJfcHJlX2dldCgmZGV2LT5pZHIsIEdGUF9LRVJORUwpKSkKKwkJCXJldHVybiAtRU5PU1BDOworCQlyZXQgPSBpZHJfZ2V0X25ldygmZGV2LT5pZHIsIHdhdGNoLCAmd2F0Y2gtPndkKTsKKwl9IHdoaWxlIChyZXQgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZmluZF9pbm9kZSAtIHJlc29sdmUgYSB1c2VyLWdpdmVuIHBhdGggdG8gYSBzcGVjaWZpYyBpbm9kZSBhbmQgcmV0dXJuIGEgbmQKKyAqLworc3RhdGljIGludCBmaW5kX2lub2RlKGNvbnN0IGNoYXIgX191c2VyICpkaXJuYW1lLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IF9fdXNlcl93YWxrKGRpcm5hbWUsIExPT0tVUF9GT0xMT1csIG5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwkvKiB5b3UgY2FuIG9ubHkgd2F0Y2ggYW4gaW5vZGUgaWYgeW91IGhhdmUgcmVhZCBwZXJtaXNzaW9ucyBvbiBpdCAqLworCWVycm9yID0gcGVybWlzc2lvbihuZC0+ZGVudHJ5LT5kX2lub2RlLCBNQVlfUkVBRCwgTlVMTCk7CisJaWYgKGVycm9yKSAKKwkJcGF0aF9yZWxlYXNlIChuZCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogY3JlYXRlX3dhdGNoIC0gY3JlYXRlcyBhIHdhdGNoIG9uIHRoZSBnaXZlbiBkZXZpY2UuCisgKgorICogQ2FsbGVycyBtdXN0IGhvbGQgZGV2LT5zZW0uICBDYWxscyBpbm90aWZ5X2Rldl9nZXRfd2QoKSBzbyBtYXkgc2xlZXAuCisgKiBCb3RoICdkZXYnIGFuZCAnaW5vZGUnIChieSB3YXkgb2YgbmFtZWlkYXRhKSBuZWVkIHRvIGJlIHBpbm5lZC4KKyAqLworc3RhdGljIHN0cnVjdCBpbm90aWZ5X3dhdGNoICpjcmVhdGVfd2F0Y2goc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsCisJCQkJCSAgdTMyIG1hc2ssIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoOworCWludCByZXQ7CisKKwlpZiAoYXRvbWljX3JlYWQoJmRldi0+dXNlci0+aW5vdGlmeV93YXRjaGVzKSA+PSBpbm90aWZ5X21heF91c2VyX3dhdGNoZXMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCisJd2F0Y2ggPSBrbWVtX2NhY2hlX2FsbG9jKHdhdGNoX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCF3YXRjaCkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0ID0gaW5vdGlmeV9kZXZfZ2V0X3dkKGRldiwgd2F0Y2gpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWttZW1fY2FjaGVfZnJlZSh3YXRjaF9jYWNoZXAsIHdhdGNoKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwl3YXRjaC0+bWFzayA9IG1hc2s7CisJYXRvbWljX3NldCgmd2F0Y2gtPmNvdW50LCAwKTsKKwlJTklUX0xJU1RfSEVBRCgmd2F0Y2gtPmRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJndhdGNoLT5pX2xpc3QpOworCisJLyogc2F2ZSBhIHJlZmVyZW5jZSB0byBkZXZpY2UgYW5kIGJ1bXAgdGhlIGNvdW50IHRvIG1ha2UgaXQgb2ZmaWNpYWwgKi8KKwlnZXRfaW5vdGlmeV9kZXYoZGV2KTsKKwl3YXRjaC0+ZGV2ID0gZGV2OworCisJLyoKKwkgKiBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZSBhbmQgYnVtcCB0aGUgcmVmIGNvdW50IHRvIG1ha2UgaXQKKwkgKiBvZmZpY2lhbC4gIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gbmFtZWlkYXRhLCB3aGljaCBtYWtlcyB0aGlzIHNhZmUuCisJICovCisJd2F0Y2gtPmlub2RlID0gaWdyYWIoaW5vZGUpOworCisJLyogYnVtcCBvdXIgb3duIGNvdW50LCBjb3JyZXNwb25kaW5nIHRvIG91ciBlbnRyeSBpbiBkZXYtPndhdGNoZXMgKi8KKwlnZXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisKKwlhdG9taWNfaW5jKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcyk7CisKKwlyZXR1cm4gd2F0Y2g7Cit9CisKKy8qCisgKiBpbm90aWZ5X2ZpbmRfZGV2IC0gZmluZCB0aGUgd2F0Y2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbm9kZSBhbmQgZGV2CisgKgorICogQ2FsbGVycyBtdXN0IGhvbGQgaW5vZGUtPmlub3RpZnlfc2VtLgorICovCitzdGF0aWMgc3RydWN0IGlub3RpZnlfd2F0Y2ggKmlub2RlX2ZpbmRfZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdhdGNoLCAmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcywgaV9saXN0KSB7CisJCWlmICh3YXRjaC0+ZGV2ID09IGRldikKKwkJCXJldHVybiB3YXRjaDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHJlbW92ZV93YXRjaF9ub19ldmVudCAtIHJlbW92ZV93YXRjaCgpIHdpdGhvdXQgdGhlIElOX0lHTk9SRUQgZXZlbnQuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV93YXRjaF9ub19ldmVudChzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsCisJCQkJICBzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldikKK3sKKwlsaXN0X2RlbCgmd2F0Y2gtPmlfbGlzdCk7CisJbGlzdF9kZWwoJndhdGNoLT5kX2xpc3QpOworCisJYXRvbWljX2RlYygmZGV2LT51c2VyLT5pbm90aWZ5X3dhdGNoZXMpOworCWlkcl9yZW1vdmUoJmRldi0+aWRyLCB3YXRjaC0+d2QpOworCXB1dF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKK30KKworLyoKKyAqIHJlbW92ZV93YXRjaCAtIFJlbW92ZSBhIHdhdGNoIGZyb20gYm90aCB0aGUgZGV2aWNlIGFuZCB0aGUgaW5vZGUuICBTZW5kcworICogdGhlIElOX0lHTk9SRUQgZXZlbnQgdG8gdGhlIGdpdmVuIGRldmljZSBzaWduaWZ5aW5nIHRoYXQgdGhlIGlub2RlIGlzIG5vCisgKiBsb25nZXIgd2F0Y2hlZC4KKyAqCisgKiBDYWxsZXJzIG11c3QgaG9sZCBib3RoIGlub2RlLT5pbm90aWZ5X3NlbSBhbmQgZGV2LT5zZW0uICBXZSBkcm9wIGEKKyAqIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgYmVmb3JlIHJldHVybmluZy4KKyAqCisgKiBUaGUgaW5vZGUgaXMgbm90IGlwdXQoKSBzbyBhcyB0byByZW1haW4gYXRvbWljLiAgSWYgdGhlIGlub2RlIG5lZWRzIHRvIGJlCisgKiBpcHV0KCksIHRoZSBjYWxsIHJldHVybnMgb25lLiAgT3RoZXJ3aXNlLCBpdCByZXR1cm5zIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV93YXRjaChzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCit7CisJaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQoZGV2LCB3YXRjaCwgSU5fSUdOT1JFRCwgMCwgTlVMTCk7CisJcmVtb3ZlX3dhdGNoX25vX2V2ZW50KHdhdGNoLCBkZXYpOworfQorCisvKgorICogaW5vdGlmeV9pbm9kZV93YXRjaGVkIC0gcmV0dXJucyBub256ZXJvIGlmIHRoZXJlIGFyZSB3YXRjaGVzIG9uIHRoaXMgaW5vZGUKKyAqIGFuZCB6ZXJvIG90aGVyd2lzZS4gIFdlIGNhbGwgdGhpcyBsb2NrbGVzcywgd2UgZG8gbm90IGNhcmUgaWYgd2UgcmFjZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaW5vdGlmeV9pbm9kZV93YXRjaGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZpbm9kZS0+aW5vdGlmeV93YXRjaGVzKTsKK30KKworLyogS2VybmVsIEFQSSAqLworCisvKioKKyAqIGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQgLSBxdWV1ZSBhbiBldmVudCB0byBhbGwgd2F0Y2hlcyBvbiB0aGlzIGlub2RlCisgKiBAaW5vZGU6IGlub2RlIGV2ZW50IGlzIG9yaWdpbmF0aW5nIGZyb20KKyAqIEBtYXNrOiBldmVudCBtYXNrIGRlc2NyaWJpbmcgdGhpcyBldmVudAorICogQGNvb2tpZTogY29va2llIGZvciBzeW5jaHJvbml6YXRpb24sIG9yIHplcm8KKyAqIEBuYW1lOiBmaWxlbmFtZSwgaWYgYW55CisgKi8KK3ZvaWQgaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgbWFzaywgdTMyIGNvb2tpZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwgKm5leHQ7CisKKwlpZiAoIWlub3RpZnlfaW5vZGVfd2F0Y2hlZChpbm9kZSkpCisJCXJldHVybjsKKworCWRvd24oJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdhdGNoLCBuZXh0LCAmaW5vZGUtPmlub3RpZnlfd2F0Y2hlcywgaV9saXN0KSB7CisJCXUzMiB3YXRjaF9tYXNrID0gd2F0Y2gtPm1hc2s7CisJCWlmICh3YXRjaF9tYXNrICYgbWFzaykgeworCQkJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYgPSB3YXRjaC0+ZGV2OworCQkJZ2V0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCQkJZG93bigmZGV2LT5zZW0pOworCQkJaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQoZGV2LCB3YXRjaCwgbWFzaywgY29va2llLCBuYW1lKTsKKwkJCWlmICh3YXRjaF9tYXNrICYgSU5fT05FU0hPVCkKKwkJCQlyZW1vdmVfd2F0Y2hfbm9fZXZlbnQod2F0Y2gsIGRldik7CisJCQl1cCgmZGV2LT5zZW0pOworCQkJcHV0X2lub3RpZnlfd2F0Y2god2F0Y2gpOworCQl9CisJfQorCXVwKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudCk7CisKKy8qKgorICogaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50IC0gcXVldWUgYW4gZXZlbnQgdG8gYSBkZW50cnkncyBwYXJlbnQKKyAqIEBkZW50cnk6IHRoZSBkZW50cnkgaW4gcXVlc3Rpb24sIHdlIHF1ZXVlIGFnYWluc3QgdGhpcyBkZW50cnkncyBwYXJlbnQKKyAqIEBtYXNrOiBldmVudCBtYXNrIGRlc2NyaWJpbmcgdGhpcyBldmVudAorICogQGNvb2tpZTogY29va2llIGZvciBzeW5jaHJvbml6YXRpb24sIG9yIHplcm8KKyAqIEBuYW1lOiBmaWxlbmFtZSwgaWYgYW55CisgKi8KK3ZvaWQgaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdTMyIG1hc2ssCisJCQkJICAgICAgIHUzMiBjb29raWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCWlub2RlID0gcGFyZW50LT5kX2lub2RlOworCisJaWYgKGlub3RpZnlfaW5vZGVfd2F0Y2hlZChpbm9kZSkpIHsKKwkJZGdldChwYXJlbnQpOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCBjb29raWUsIG5hbWUpOworCQlkcHV0KHBhcmVudCk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQpOworCisvKioKKyAqIGlub3RpZnlfZ2V0X2Nvb2tpZSAtIHJldHVybiBhIHVuaXF1ZSBjb29raWUgZm9yIHVzZSBpbiBzeW5jaHJvbml6aW5nIGV2ZW50cy4KKyAqLwordTMyIGlub3RpZnlfZ2V0X2Nvb2tpZSh2b2lkKQoreworCXJldHVybiBhdG9taWNfaW5jX3JldHVybigmaW5vdGlmeV9jb29raWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5vdGlmeV9nZXRfY29va2llKTsKKworLyoqCisgKiBpbm90aWZ5X3VubW91bnRfaW5vZGVzIC0gYW4gc2IgaXMgdW5tb3VudGluZy4gIGhhbmRsZSBhbnkgd2F0Y2hlZCBpbm9kZXMuCisgKiBAbGlzdDogbGlzdCBvZiBpbm9kZXMgYmVpbmcgdW5tb3VudGVkIChzYi0+c19pbm9kZXMpCisgKgorICogQ2FsbGVkIHdpdGggaW5vZGVfbG9jayBoZWxkLCBwcm90ZWN0aW5nIHRoZSB1bm1vdW50aW5nIHN1cGVyIGJsb2NrJ3MgbGlzdAorICogb2YgaW5vZGVzLCBhbmQgd2l0aCBpcHJ1bmVfc2VtIGhlbGQsIGtlZXBpbmcgc2hyaW5rX2ljYWNoZV9tZW1vcnkoKSBhdCBiYXkuCisgKiBXZSB0ZW1wb3JhcmlseSBkcm9wIGlub2RlX2xvY2ssIGhvd2V2ZXIsIGFuZCBDQU4gYmxvY2suCisgKi8KK3ZvaWQgaW5vdGlmeV91bm1vdW50X2lub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpuZXh0X2ksICpuZWVkX2lwdXQgPSBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlub2RlLCBuZXh0X2ksIGxpc3QsIGlfc2JfbGlzdCkgeworCQlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2gsICpuZXh0X3c7CisJCXN0cnVjdCBpbm9kZSAqbmVlZF9pcHV0X3RtcDsKKwkJc3RydWN0IGxpc3RfaGVhZCAqd2F0Y2hlczsKKworCQkvKgorCQkgKiBJZiBpX2NvdW50IGlzIHplcm8sIHRoZSBpbm9kZSBjYW5ub3QgaGF2ZSBhbnkgd2F0Y2hlcyBhbmQKKwkJICogZG9pbmcgYW4gX19pZ2V0L2lwdXQgd2l0aCBNU19BQ1RJVkUgY2xlYXIgd291bGQgYWN0dWFsbHkKKwkJICogZXZpY3QgYWxsIGlub2RlcyB3aXRoIHplcm8gaV9jb3VudCBmcm9tIGljYWNoZSB3aGljaCBpcworCQkgKiB1bm5lY2Vzc2FyaWx5IHZpb2xlbnQgYW5kIG1heSBpbiBmYWN0IGJlIGlsbGVnYWwgdG8gZG8uCisJCSAqLworCQlpZiAoIWF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXZSBjYW5ub3QgX19pZ2V0KCkgYW4gaW5vZGUgaW4gc3RhdGUgSV9DTEVBUiwgSV9GUkVFSU5HLCBvcgorCQkgKiBJX1dJTExfRlJFRSB3aGljaCBpcyBmaW5lIGJlY2F1c2UgYnkgdGhhdCBwb2ludCB0aGUgaW5vZGUKKwkJICogY2Fubm90IGhhdmUgYW55IGFzc29jaWF0ZWQgd2F0Y2hlcy4KKwkJICovCisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0NMRUFSIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpKQorCQkJY29udGludWU7CisKKwkJbmVlZF9pcHV0X3RtcCA9IG5lZWRfaXB1dDsKKwkJbmVlZF9pcHV0ID0gTlVMTDsKKwkJLyogSW4gY2FzZSB0aGUgcmVtb3ZlX3dhdGNoKCkgZHJvcHMgYSByZWZlcmVuY2UuICovCisJCWlmIChpbm9kZSAhPSBuZWVkX2lwdXRfdG1wKQorCQkJX19pZ2V0KGlub2RlKTsKKwkJZWxzZQorCQkJbmVlZF9pcHV0X3RtcCA9IE5VTEw7CisJCS8qIEluIGNhc2UgdGhlIGRyb3BwaW5nIG9mIGEgcmVmZXJlbmNlIHdvdWxkIG51a2UgbmV4dF9pLiAqLworCQlpZiAoKCZuZXh0X2ktPmlfc2JfbGlzdCAhPSBsaXN0KSAmJgorCQkJCWF0b21pY19yZWFkKCZuZXh0X2ktPmlfY291bnQpICYmCisJCQkJIShuZXh0X2ktPmlfc3RhdGUgJiAoSV9DTEVBUiB8IElfRlJFRUlORyB8CisJCQkJCUlfV0lMTF9GUkVFKSkpIHsKKwkJCV9faWdldChuZXh0X2kpOworCQkJbmVlZF9pcHV0ID0gbmV4dF9pOworCQl9CisKKwkJLyoKKwkJICogV2UgY2FuIHNhZmVseSBkcm9wIGlub2RlX2xvY2sgaGVyZSBiZWNhdXNlIHdlIGhvbGQKKwkJICogcmVmZXJlbmNlcyBvbiBib3RoIGlub2RlIGFuZCBuZXh0X2kuICBBbHNvIG5vIG5ldyBpbm9kZXMKKwkJICogd2lsbCBiZSBhZGRlZCBzaW5jZSB0aGUgdW1vdW50IGhhcyBiZWd1bi4gIEZpbmFsbHksCisJCSAqIGlwcnVuZV9zZW0ga2VlcHMgc2hyaW5rX2ljYWNoZV9tZW1vcnkoKSBhd2F5LgorCQkgKi8KKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJCWlmIChuZWVkX2lwdXRfdG1wKQorCQkJaXB1dChuZWVkX2lwdXRfdG1wKTsKKworCQkvKiBmb3IgZWFjaCB3YXRjaCwgc2VuZCBJTl9VTk1PVU5UIGFuZCB0aGVuIHJlbW92ZSBpdCAqLworCQlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCQl3YXRjaGVzID0gJmlub2RlLT5pbm90aWZ5X3dhdGNoZXM7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgbmV4dF93LCB3YXRjaGVzLCBpX2xpc3QpIHsKKwkJCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2ID0gd2F0Y2gtPmRldjsKKwkJCWRvd24oJmRldi0+c2VtKTsKKwkJCWlub3RpZnlfZGV2X3F1ZXVlX2V2ZW50KGRldiwgd2F0Y2gsIElOX1VOTU9VTlQsMCxOVUxMKTsKKwkJCXJlbW92ZV93YXRjaCh3YXRjaCwgZGV2KTsKKwkJCXVwKCZkZXYtPnNlbSk7CisJCX0KKwkJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJCWlwdXQoaW5vZGUpOwkJCisKKwkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbm90aWZ5X3VubW91bnRfaW5vZGVzKTsKKworLyoqCisgKiBpbm90aWZ5X2lub2RlX2lzX2RlYWQgLSBhbiBpbm9kZSBoYXMgYmVlbiBkZWxldGVkLCBjbGVhbnVwIGFueSB3YXRjaGVzCisgKiBAaW5vZGU6IGlub2RlIHRoYXQgaXMgYWJvdXQgdG8gYmUgcmVtb3ZlZAorICovCit2b2lkIGlub3RpZnlfaW5vZGVfaXNfZGVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm90aWZ5X3dhdGNoICp3YXRjaCwgKm5leHQ7CisKKwlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3YXRjaCwgbmV4dCwgJmlub2RlLT5pbm90aWZ5X3dhdGNoZXMsIGlfbGlzdCkgeworCQlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IHdhdGNoLT5kZXY7CisJCWRvd24oJmRldi0+c2VtKTsKKwkJcmVtb3ZlX3dhdGNoKHdhdGNoLCBkZXYpOworCQl1cCgmZGV2LT5zZW0pOworCX0KKwl1cCgmaW5vZGUtPmlub3RpZnlfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlub3RpZnlfaW5vZGVfaXNfZGVhZCk7CisKKy8qIERldmljZSBJbnRlcmZhY2UgKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBpbm90aWZ5X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmRldi0+d3EsIHdhaXQpOworCWRvd24oJmRldi0+c2VtKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKSkKKwkJcmV0ID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl1cCgmZGV2LT5zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgaW5vdGlmeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCit7CisJc2l6ZV90IGV2ZW50X3NpemUgPSBzaXplb2YgKHN0cnVjdCBpbm90aWZ5X2V2ZW50KTsKKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldjsKKwljaGFyIF9fdXNlciAqc3RhcnQ7CisJaW50IHJldDsKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXN0YXJ0ID0gYnVmOworCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXdoaWxlICgxKSB7CisJCWludCBldmVudHM7CisKKwkJcHJlcGFyZV90b193YWl0KCZkZXYtPndxLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCQlkb3duKCZkZXYtPnNlbSk7CisJCWV2ZW50cyA9ICFsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cyk7CisJCXVwKCZkZXYtPnNlbSk7CisJCWlmIChldmVudHMpIHsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCisJCXNjaGVkdWxlKCk7CisJfQorCisJZmluaXNoX3dhaXQoJmRldi0+d3EsICZ3YWl0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZG93bigmZGV2LT5zZW0pOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OworCisJCXJldCA9IGJ1ZiAtIHN0YXJ0OworCQlpZiAobGlzdF9lbXB0eSgmZGV2LT5ldmVudHMpKQorCQkJYnJlYWs7CisKKwkJa2V2ZW50ID0gaW5vdGlmeV9kZXZfZ2V0X2V2ZW50KGRldik7CisJCWlmIChldmVudF9zaXplICsga2V2ZW50LT5ldmVudC5sZW4gPiBjb3VudCkKKwkJCWJyZWFrOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAma2V2ZW50LT5ldmVudCwgZXZlbnRfc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlidWYgKz0gZXZlbnRfc2l6ZTsKKwkJY291bnQgLT0gZXZlbnRfc2l6ZTsKKworCQlpZiAoa2V2ZW50LT5uYW1lKSB7CisJCQlpZiAoY29weV90b191c2VyKGJ1Ziwga2V2ZW50LT5uYW1lLCBrZXZlbnQtPmV2ZW50LmxlbikpeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlidWYgKz0ga2V2ZW50LT5ldmVudC5sZW47CisJCQljb3VudCAtPSBrZXZlbnQtPmV2ZW50LmxlbjsKKwkJfQorCisJCXJlbW92ZV9rZXZlbnQoZGV2LCBrZXZlbnQpOworCX0KKwl1cCgmZGV2LT5zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbm90aWZ5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppZ25vcmVkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qCisJICogRGVzdHJveSBhbGwgb2YgdGhlIHdhdGNoZXMgb24gdGhpcyBkZXZpY2UuICBVbmZvcnR1bmF0ZWx5LCBub3QgdmVyeQorCSAqIHByZXR0eS4gIFdlIGNhbm5vdCBkbyBhIHNpbXBsZSBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCwgYmVjYXVzZSB3ZQorCSAqIGRvIG5vdCBrbm93IHRoZSBpbm9kZSB1bnRpbCB3ZSBpdGVyYXRlIHRvIHRoZSB3YXRjaC4gIEJ1dCB3ZSBuZWVkIHRvCisJICogaG9sZCBpbm9kZS0+aW5vdGlmeV9zZW0gYmVmb3JlIGRldi0+c2VtLiAgVGhlIGZvbGxvd2luZyB3b3Jrcy4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7CisJCXN0cnVjdCBsaXN0X2hlYWQgKndhdGNoZXM7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJZG93bigmZGV2LT5zZW0pOworCQl3YXRjaGVzID0gJmRldi0+d2F0Y2hlczsKKwkJaWYgKGxpc3RfZW1wdHkod2F0Y2hlcykpIHsKKwkJCXVwKCZkZXYtPnNlbSk7CisJCQlicmVhazsKKwkJfQorCQl3YXRjaCA9IGxpc3RfZW50cnkod2F0Y2hlcy0+bmV4dCwgc3RydWN0IGlub3RpZnlfd2F0Y2gsIGRfbGlzdCk7CisJCWdldF9pbm90aWZ5X3dhdGNoKHdhdGNoKTsKKwkJdXAoJmRldi0+c2VtKTsKKworCQlpbm9kZSA9IHdhdGNoLT5pbm9kZTsKKwkJZG93bigmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwkJZG93bigmZGV2LT5zZW0pOworCQlyZW1vdmVfd2F0Y2hfbm9fZXZlbnQod2F0Y2gsIGRldik7CisJCXVwKCZkZXYtPnNlbSk7CisJCXVwKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCQlwdXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisJfQorCisJLyogZGVzdHJveSBhbGwgb2YgdGhlIGV2ZW50cyBvbiB0aGlzIGRldmljZSAqLworCWRvd24oJmRldi0+c2VtKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKSkKKwkJaW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZShkZXYpOworCXVwKCZkZXYtPnNlbSk7CisKKwkvKiBmcmVlIHRoaXMgZGV2aWNlOiB0aGUgcHV0IG1hdGNoaW5nIHRoZSBnZXQgaW4gaW5vdGlmeV9vcGVuKCkgKi8KKwlwdXRfaW5vdGlmeV9kZXYoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKgorICogaW5vdGlmeV9pZ25vcmUgLSBoYW5kbGUgdGhlIElOT1RJRllfSUdOT1JFIGlvY3RsLCBhc2tpbmcgdGhhdCBhIGdpdmVuIHdkIGJlCisgKiByZW1vdmVkIGZyb20gdGhlIGRldmljZS4KKyAqCisgKiBDYW4gc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgaW5vdGlmeV9pZ25vcmUoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsIHMzMiB3ZCkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqd2F0Y2g7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWRvd24oJmRldi0+c2VtKTsKKwl3YXRjaCA9IGlkcl9maW5kKCZkZXYtPmlkciwgd2QpOworCWlmICh1bmxpa2VseSghd2F0Y2gpKSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlnZXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisJaW5vZGUgPSB3YXRjaC0+aW5vZGU7CisJdXAoJmRldi0+c2VtKTsKKworCWRvd24oJmlub2RlLT5pbm90aWZ5X3NlbSk7CisJZG93bigmZGV2LT5zZW0pOworCisJLyogbWFrZSBzdXJlIHRoYXQgd2UgZGlkIG5vdCByYWNlICovCisJd2F0Y2ggPSBpZHJfZmluZCgmZGV2LT5pZHIsIHdkKTsKKwlpZiAobGlrZWx5KHdhdGNoKSkKKwkJcmVtb3ZlX3dhdGNoKHdhdGNoLCBkZXYpOworCisJdXAoJmRldi0+c2VtKTsKKwl1cCgmaW5vZGUtPmlub3RpZnlfc2VtKTsKKwlwdXRfaW5vdGlmeV93YXRjaCh3YXRjaCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgaW5vdGlmeV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJdm9pZCBfX3VzZXIgKnA7CisJaW50IHJldCA9IC1FTk9UVFk7CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcCA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRklPTlJFQUQ6CisJCXJldCA9IHB1dF91c2VyKGRldi0+cXVldWVfc2l6ZSwgKGludCBfX3VzZXIgKikgcCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlub3RpZnlfZm9wcyA9IHsKKwkucG9sbCAgICAgICAgICAgPSBpbm90aWZ5X3BvbGwsCisJLnJlYWQgICAgICAgICAgID0gaW5vdGlmeV9yZWFkLAorCS5yZWxlYXNlICAgICAgICA9IGlub3RpZnlfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBpbm90aWZ5X2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBpbm90aWZ5X2lvY3RsLAorfTsKKworYXNtbGlua2FnZSBsb25nIHN5c19pbm90aWZ5X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7CisJaW50IHJldCA9IC1FTk9UVFk7CisJaW50IGZkOworCXN0cnVjdCBmaWxlICpmaWxwOworCisJZmQgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKGZkIDwgMCkgeworCQlyZXQgPSBmZDsKKwkJZ290byBvdXQ7CisJfQorCisJZmlscCA9IGdldF9lbXB0eV9maWxwKCk7CisJaWYgKCFmaWxwKSB7CisJCXB1dF91bnVzZWRfZmQoZmQpOworCQlyZXQgPSAtRU5GSUxFOworCQlnb3RvIG91dDsKKwl9CisJZmlscC0+Zl9vcCA9ICZpbm90aWZ5X2ZvcHM7CisJZmlscC0+Zl92ZnNtbnQgPSBtbnRnZXQoaW5vdGlmeV9tbnQpOworCWZpbHAtPmZfZGVudHJ5ID0gZGdldChpbm90aWZ5X21udC0+bW50X3Jvb3QpOworCWZpbHAtPmZfbWFwcGluZyA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CisJZmlscC0+Zl9tb2RlID0gRk1PREVfUkVBRDsKKwlmaWxwLT5mX2ZsYWdzID0gT19SRE9OTFk7CisKKwl1c2VyID0gZ2V0X3VpZChjdXJyZW50LT51c2VyKTsKKworCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmdXNlci0+aW5vdGlmeV9kZXZzKSA+PSBpbm90aWZ5X21heF91c2VyX2RldmljZXMpKSB7CisJCXJldCA9IC1FTUZJTEU7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWRldikpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlkcl9pbml0KCZkZXYtPmlkcik7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZXZlbnRzKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT53YXRjaGVzKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndxKTsKKwlzZW1hX2luaXQoJmRldi0+c2VtLCAxKTsKKwlkZXYtPmV2ZW50X2NvdW50ID0gMDsKKwlkZXYtPnF1ZXVlX3NpemUgPSAwOworCWRldi0+bWF4X2V2ZW50cyA9IGlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHM7CisJZGV2LT51c2VyID0gdXNlcjsKKwlhdG9taWNfc2V0KCZkZXYtPmNvdW50LCAwKTsKKworCWdldF9pbm90aWZ5X2RldihkZXYpOworCWF0b21pY19pbmMoJnVzZXItPmlub3RpZnlfZGV2cyk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJZmRfaW5zdGFsbCAoZmQsIGZpbHApOworCXJldHVybiBmZDsKK291dF9lcnI6CisJcHV0X3VudXNlZF9mZCAoZmQpOworCXB1dF9maWxwIChmaWxwKTsKKwlmcmVlX3VpZCh1c2VyKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoKGludCBmZCwgY29uc3QgY2hhciAqcGF0aCwgdTMyIG1hc2spCit7CisJc3RydWN0IGlub3RpZnlfd2F0Y2ggKndhdGNoLCAqb2xkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlpbnQgcmV0OworCisJZmlscCA9IGZnZXQoZmQpOworCWlmICghZmlscCkKKwkJcmV0dXJuIC1FQkFERjsKKworCWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCXJldCA9IGZpbmRfaW5vZGUgKChjb25zdCBjaGFyIF9fdXNlciopcGF0aCwgJm5kKTsKKwlpZiAocmV0KQorCQlnb3RvIGZwdXRfYW5kX291dDsKKworCS8qIEhlbGQgaW4gcGxhY2UgYnkgcmVmZXJlbmNlIGluIG5kICovCisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisKKwlkb3duKCZpbm9kZS0+aW5vdGlmeV9zZW0pOworCWRvd24oJmRldi0+c2VtKTsKKworCS8qIGRvbid0IGxldCB1c2VyLXNwYWNlIHNldCBpbnZhbGlkIGJpdHM6IHdlIGRvbid0IHdhbnQgZmxhZ3Mgc2V0ICovCisJbWFzayAmPSBJTl9BTExfRVZFTlRTOworCWlmICghbWFzaykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgY2FzZSBvZiByZS1hZGRpbmcgYSB3YXRjaCBvbiBhbiAoaW5vZGUsZGV2KSBwYWlyIHRoYXQgd2UKKwkgKiBhcmUgYWxyZWFkeSB3YXRjaGluZy4gIFdlIGp1c3QgdXBkYXRlIHRoZSBtYXNrIGFuZCByZXR1cm4gaXRzIHdkLgorCSAqLworCW9sZCA9IGlub2RlX2ZpbmRfZGV2KGlub2RlLCBkZXYpOworCWlmICh1bmxpa2VseShvbGQpKSB7CisJCW9sZC0+bWFzayA9IG1hc2s7CisJCXJldCA9IG9sZC0+d2Q7CisJCWdvdG8gb3V0OworCX0KKworCXdhdGNoID0gY3JlYXRlX3dhdGNoKGRldiwgbWFzaywgaW5vZGUpOworCWlmICh1bmxpa2VseShJU19FUlIod2F0Y2gpKSkgeworCQlyZXQgPSBQVFJfRVJSKHdhdGNoKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQWRkIHRoZSB3YXRjaCB0byB0aGUgZGV2aWNlJ3MgYW5kIHRoZSBpbm9kZSdzIGxpc3QgKi8KKwlsaXN0X2FkZCgmd2F0Y2gtPmRfbGlzdCwgJmRldi0+d2F0Y2hlcyk7CisJbGlzdF9hZGQoJndhdGNoLT5pX2xpc3QsICZpbm9kZS0+aW5vdGlmeV93YXRjaGVzKTsKKwlyZXQgPSB3YXRjaC0+d2Q7CitvdXQ6CisJcGF0aF9yZWxlYXNlICgmbmQpOworCXVwKCZkZXYtPnNlbSk7CisJdXAoJmlub2RlLT5pbm90aWZ5X3NlbSk7CitmcHV0X2FuZF9vdXQ6CisJZnB1dChmaWxwKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2goaW50IGZkLCB1MzIgd2QpCit7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJaW50IHJldDsKKworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCXJldHVybiAtRUJBREY7CisJZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXJldCA9IGlub3RpZnlfaWdub3JlIChkZXYsIHdkKTsKKwlmcHV0KGZpbHApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgoraW5vdGlmeV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKKwkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisgICAgcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgImlub3RpZnkiLCBOVUxMLCAweEJBRDFERUEpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaW5vdGlmeV9mc190eXBlID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJpbm90aWZ5ZnMiLAorICAgIC5nZXRfc2IgICAgICAgICA9IGlub3RpZnlfZ2V0X3NiLAorICAgIC5raWxsX3NiICAgICAgICA9IGtpbGxfYW5vbl9zdXBlciwKK307CisKKy8qCisgKiBpbm90aWZ5X2luaXQgLSBPdXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICBOb3RlIHRoYXQgd2UgY2Fubm5vdCByZXR1cm4KKyAqIGVycm9yIGJlY2F1c2Ugd2UgaGF2ZSBjb21waWxlZC1pbiBWRlMgaG9va3MuICBTbyBhbiAodW5saWtlbHkpIGZhaWx1cmUgaGVyZQorICogbXVzdCByZXN1bHQgaW4gcGFuaWMoKS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaW5vdGlmeV9pbml0KHZvaWQpCit7CisJcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaW5vdGlmeV9mc190eXBlKTsKKwlpbm90aWZ5X21udCA9IGtlcm5fbW91bnQoJmlub3RpZnlfZnNfdHlwZSk7CisKKwlpbm90aWZ5X21heF9xdWV1ZWRfZXZlbnRzID0gODE5MjsKKwlpbm90aWZ5X21heF91c2VyX2RldmljZXMgPSAxMjg7CisJaW5vdGlmeV9tYXhfdXNlcl93YXRjaGVzID0gODE5MjsKKworCWF0b21pY19zZXQoJmlub3RpZnlfY29va2llLCAwKTsKKworCXdhdGNoX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm90aWZ5X3dhdGNoX2NhY2hlIiwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV93YXRjaCksCisJCQkJCSAwLCBTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKwlldmVudF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaW5vdGlmeV9ldmVudF9jYWNoZSIsCisJCQkJCSBzaXplb2Yoc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50KSwKKwkJCQkJIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiaW5vdGlmeSBzeXNjYWxsXG4iKTsKKworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChpbm90aWZ5X2luaXQpOwpkaWZmIC0tZ2l0IGEvZnMvaW9wcmlvLmMgYi9mcy9pb3ByaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2UxZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaW9wcmlvLmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBmcy9pb3ByaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgorICoKKyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIHNldHRpbmcvcXVlcnlpbmcgaW8gcHJpb3JpdGllcyBvZiBwcm9jZXNzZXMuIFRoZQorICogc3lzdGVtIGNhbGxzIGNsb3NlbHkgbWltbWljayBnZXRwcmlvcml0eS9zZXRwcmlvcml0eSwgc2VlIHRoZSBtYW4gcGFnZSBmb3IKKyAqIHRob3NlLiBUaGUgcHJpbyBhcmd1bWVudCBpcyBhIGNvbXBvc2l0ZSBvZiBwcmlvIGNsYXNzIGFuZCBwcmlvIGRhdGEsIHdoZXJlCisgKiB0aGUgZGF0YSBhcmd1bWVudCBoYXMgbWVhbmluZyB3aXRoaW4gdGhhdCBjbGFzcy4gVGhlIHN0YW5kYXJkIHNjaGVkdWxpbmcKKyAqIGNsYXNzZXMgaGF2ZSA4IGRpc3RpbmN0IHByaW8gbGV2ZWxzLCB3aXRoIDAgYmVpbmcgdGhlIGhpZ2hlc3QgcHJpbyBhbmQgNworICogYmVpbmcgdGhlIGxvd2VzdC4KKyAqCisgKiBJT1csIHNldHRpbmcgQkUgc2NoZWR1bGluZyBjbGFzcyB3aXRoIHByaW8gMiBpcyBkb25lIGFsYToKKyAqCisgKiB1bnNpZ25lZCBpbnQgcHJpbyA9IChJT1BSSU9fQ0xBU1NfQkUgPDwgSU9QUklPX0NMQVNTX1NISUZUKSB8IDI7CisgKgorICogaW9wcmlvX3NldChQUklPX1BST0NFU1MsIHBpZCwgcHJpbyk7CisgKgorICogU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9ibG9jay9pb3ByaW8udHh0CisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW9wcmlvLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisKK3N0YXRpYyBpbnQgc2V0X3Rhc2tfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGlvcHJpbykKK3sKKwlzdHJ1Y3QgaW9fY29udGV4dCAqaW9jOworCisJaWYgKHRhc2stPnVpZCAhPSBjdXJyZW50LT5ldWlkICYmCisJICAgIHRhc2stPnVpZCAhPSBjdXJyZW50LT51aWQgJiYgIWNhcGFibGUoQ0FQX1NZU19OSUNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXRhc2tfbG9jayh0YXNrKTsKKworCXRhc2stPmlvcHJpbyA9IGlvcHJpbzsKKworCWlvYyA9IHRhc2stPmlvX2NvbnRleHQ7CisJaWYgKGlvYyAmJiBpb2MtPnNldF9pb3ByaW8pCisJCWlvYy0+c2V0X2lvcHJpbyhpb2MsIGlvcHJpbyk7CisKKwl0YXNrX3VubG9jayh0YXNrKTsKKwlyZXR1cm4gMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19pb3ByaW9fc2V0KGludCB3aGljaCwgaW50IHdobywgaW50IGlvcHJpbykKK3sKKwlpbnQgY2xhc3MgPSBJT1BSSU9fUFJJT19DTEFTUyhpb3ByaW8pOworCWludCBkYXRhID0gSU9QUklPX1BSSU9fREFUQShpb3ByaW8pOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgKmc7CisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNsYXNzKSB7CisJCWNhc2UgSU9QUklPX0NMQVNTX1JUOgorCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQkvKiBmYWxsIHRocm91Z2gsIHJ0IGhhcyBwcmlvIGZpZWxkIHRvbyAqLworCQljYXNlIElPUFJJT19DTEFTU19CRToKKwkJCWlmIChkYXRhID49IElPUFJJT19CRV9OUiB8fCBkYXRhIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX0NMQVNTX0lETEU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IC1FU1JDSDsKKwlyZWFkX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwlzd2l0Y2ggKHdoaWNoKSB7CisJCWNhc2UgSU9QUklPX1dIT19QUk9DRVNTOgorCQkJaWYgKCF3aG8pCisJCQkJcCA9IGN1cnJlbnQ7CisJCQllbHNlCisJCQkJcCA9IGZpbmRfdGFza19ieV9waWQod2hvKTsKKwkJCWlmIChwKQorCQkJCXJldCA9IHNldF90YXNrX2lvcHJpbyhwLCBpb3ByaW8pOworCQkJYnJlYWs7CisJCWNhc2UgSU9QUklPX1dIT19QR1JQOgorCQkJaWYgKCF3aG8pCisJCQkJd2hvID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwkJCWRvX2VhY2hfdGFza19waWQod2hvLCBQSURUWVBFX1BHSUQsIHApIHsKKwkJCQlyZXQgPSBzZXRfdGFza19pb3ByaW8ocCwgaW9wcmlvKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh3aG8sIFBJRFRZUEVfUEdJRCwgcCk7CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fV0hPX1VTRVI6CisJCQlpZiAoIXdobykKKwkJCQl1c2VyID0gY3VycmVudC0+dXNlcjsKKwkJCWVsc2UKKwkJCQl1c2VyID0gZmluZF91c2VyKHdobyk7CisKKwkJCWlmICghdXNlcikKKwkJCQlicmVhazsKKworCQkJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQkJCWlmIChwLT51aWQgIT0gd2hvKQorCQkJCQljb250aW51ZTsKKwkJCQlyZXQgPSBzZXRfdGFza19pb3ByaW8ocCwgaW9wcmlvKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CisKKwkJCWlmICh3aG8pCisJCQkJZnJlZV91aWQodXNlcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmVhZF91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOworCWludCByZXQgPSAtRVNSQ0g7CisKKwlyZWFkX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwlzd2l0Y2ggKHdoaWNoKSB7CisJCWNhc2UgSU9QUklPX1dIT19QUk9DRVNTOgorCQkJaWYgKCF3aG8pCisJCQkJcCA9IGN1cnJlbnQ7CisJCQllbHNlCisJCQkJcCA9IGZpbmRfdGFza19ieV9waWQod2hvKTsKKwkJCWlmIChwKQorCQkJCXJldCA9IHAtPmlvcHJpbzsKKwkJCWJyZWFrOworCQljYXNlIElPUFJJT19XSE9fUEdSUDoKKwkJCWlmICghd2hvKQorCQkJCXdobyA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisJCQlkb19lYWNoX3Rhc2tfcGlkKHdobywgUElEVFlQRV9QR0lELCBwKSB7CisJCQkJaWYgKHJldCA9PSAtRVNSQ0gpCisJCQkJCXJldCA9IHAtPmlvcHJpbzsKKwkJCQllbHNlCisJCQkJCXJldCA9IGlvcHJpb19iZXN0KHJldCwgcC0+aW9wcmlvKTsKKwkJCX0gd2hpbGVfZWFjaF90YXNrX3BpZCh3aG8sIFBJRFRZUEVfUEdJRCwgcCk7CisJCQlicmVhazsKKwkJY2FzZSBJT1BSSU9fV0hPX1VTRVI6CisJCQlpZiAoIXdobykKKwkJCQl1c2VyID0gY3VycmVudC0+dXNlcjsKKwkJCWVsc2UKKwkJCQl1c2VyID0gZmluZF91c2VyKHdobyk7CisKKwkJCWlmICghdXNlcikKKwkJCQlicmVhazsKKworCQkJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQkJCWlmIChwLT51aWQgIT0gdXNlci0+dWlkKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocmV0ID09IC1FU1JDSCkKKwkJCQkJcmV0ID0gcC0+aW9wcmlvOworCQkJCWVsc2UKKwkJCQkJcmV0ID0gaW9wcmlvX2Jlc3QocmV0LCBwLT5pb3ByaW8pOworCQkJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKKworCQkJaWYgKHdobykKKwkJCQlmcmVlX3VpZCh1c2VyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZWFkX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2piZC9qb3VybmFsLmMgYi9mcy9qYmQvam91cm5hbC5jCmluZGV4IDFlNmYyZTIuLjVlN2I0MzkgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9qb3VybmFsLmMKKysrIGIvZnMvamJkL2pvdXJuYWwuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAJfQogCiAJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKKwlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKIAkJLyoKIAkJICogVGhlIHNpbXBsZXIgdGhlIGJldHRlci4gRmx1c2hpbmcgam91cm5hbCBpc24ndCBhCiAJCSAqIGdvb2QgaWRlYSwgYmVjYXVzZSB0aGF0IGRlcGVuZHMgb24gdGhyZWFkcyB0aGF0IG1heQpAQCAtMTc1LDcgKzE3NSw3IEBACiAJCSAqLwogCQlqYmRfZGVidWcoMSwgIk5vdyBzdXNwZW5kaW5nIGtqb3VybmFsZFxuIik7CiAJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwotCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJcmVmcmlnZXJhdG9yKCk7CiAJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAl9IGVsc2UgewogCQkvKgpkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbnRyZXAuYyBiL2ZzL2pmZnMvaW50cmVwLmMKaW5kZXggOGNjNjg5My4uZmM1ODlkZCAxMDA2NDQKLS0tIGEvZnMvamZmcy9pbnRyZXAuYworKysgYi9mcy9qZmZzL2ludHJlcC5jCkBAIC0xNzUsOCArMTc1LDY0IEBACiAJfQogfQogCisvKiBQcmludCB0aGUgY29udGVudHMgb2YgYSBub2RlLiAgKi8KK3N0YXRpYyB2b2lkCitqZmZzX3ByaW50X25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbikKK3sKKwlEKHByaW50aygiamZmc19ub2RlOiAweCVwXG4iLCBuKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHZlcnNpb24gICovXG4iLCBuLT52ZXJzaW9uKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBkYXRhX29mZnNldCAgKi9cbiIsIG4tPmRhdGFfb2Zmc2V0KSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBkYXRhX3NpemUgICovXG4iLCBuLT5kYXRhX3NpemUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHJlbW92ZWRfc2l6ZSAgKi9cbiIsIG4tPnJlbW92ZWRfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZm1fb2Zmc2V0ICAqL1xuIiwgbi0+Zm1fb2Zmc2V0KSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBuYW1lX3NpemUgICovXG4iLCBuLT5uYW1lX3NpemUpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiBmbSwgIGZtLT5vZmZzZXQ6ICV1ICAqL1xuIiwKKwkJIG4tPmZtLCAobi0+Zm0gPyBuLT5mbS0+b2Zmc2V0IDogMCkpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB2ZXJzaW9uX3ByZXYgICovXG4iLCBuLT52ZXJzaW9uX3ByZXYpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB2ZXJzaW9uX25leHQgICovXG4iLCBuLT52ZXJzaW9uX25leHQpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiByYW5nZV9wcmV2ICAqL1xuIiwgbi0+cmFuZ2VfcHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHJhbmdlX25leHQgICovXG4iLCBuLT5yYW5nZV9uZXh0KSk7CisJRChwcmludGsoIn1cbiIpKTsKK30KKwogI2VuZGlmCiAKKy8qIFByaW50IHRoZSBjb250ZW50cyBvZiBhIHJhdyBpbm9kZS4gICovCitzdGF0aWMgdm9pZAoramZmc19wcmludF9yYXdfaW5vZGUoc3RydWN0IGpmZnNfcmF3X2lub2RlICpyYXdfaW5vZGUpCit7CisJRChwcmludGsoImpmZnNfcmF3X2lub2RlOiBpbm9kZSBudW1iZXI6ICV1XG4iLCByYXdfaW5vZGUtPmlubykpOworCUQocHJpbnRrKCJ7XG4iKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBtYWdpYyAgKi9cbiIsIHJhd19pbm9kZS0+bWFnaWMpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGlubyAgKi9cbiIsIHJhd19pbm9kZS0+aW5vKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBwaW5vICAqL1xuIiwgcmF3X2lub2RlLT5waW5vKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiB2ZXJzaW9uICAqL1xuIiwgcmF3X2lub2RlLT52ZXJzaW9uKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBtb2RlICAqL1xuIiwgcmF3X2lub2RlLT5tb2RlKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDR4LCAgICAgLyogdWlkICAqL1xuIiwgcmF3X2lub2RlLT51aWQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiBnaWQgICovXG4iLCByYXdfaW5vZGUtPmdpZCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogYXRpbWUgICovXG4iLCByYXdfaW5vZGUtPmF0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBtdGltZSAgKi9cbiIsIHJhd19pbm9kZS0+bXRpbWUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGN0aW1lICAqL1xuIiwgcmF3X2lub2RlLT5jdGltZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogb2Zmc2V0ICAqL1xuIiwgcmF3X2lub2RlLT5vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRzaXplICAqL1xuIiwgcmF3X2lub2RlLT5kc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogcnNpemUgICovXG4iLCByYXdfaW5vZGUtPnJzaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBuc2l6ZSAgKi9cbiIsIHJhd19pbm9kZS0+bnNpemUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5saW5rICAqL1xuIiwgcmF3X2lub2RlLT5ubGluaykpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogc3BhcmUgICovXG4iLAorCQkgcmF3X2lub2RlLT5zcGFyZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAgICAgICAgICAvKiByZW5hbWUgICovXG4iLAorCQkgcmF3X2lub2RlLT5yZW5hbWUpKTsKKwlEKHByaW50aygiICAgICAgICAldSwgICAgICAgICAgLyogZGVsZXRlZCAgKi9cbiIsCisJCSByYXdfaW5vZGUtPmRlbGV0ZWQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIGFjY3VyYXRlICAqL1xuIiwKKwkJIHJhd19pbm9kZS0+YWNjdXJhdGUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRjaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPmRjaGtzdW0pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiBuY2hrc3VtICAqL1xuIiwgcmF3X2lub2RlLT5uY2hrc3VtKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDR4LCAgICAgLyogY2hrc3VtICAqL1xuIiwgcmF3X2lub2RlLT5jaGtzdW0pKTsKKwlEKHByaW50aygifVxuIikpOworfQorCiAjZGVmaW5lIGZsYXNoX3NhZmVfYWNxdWlyZShhcmcpCiAjZGVmaW5lIGZsYXNoX3NhZmVfcmVsZWFzZShhcmcpCiAKQEAgLTI1MDcsNjQgKzI1NjMsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBQcmludCB0aGUgY29udGVudHMgb2YgYSBub2RlLiAgKi8KLXZvaWQKLWpmZnNfcHJpbnRfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpuKQotewotCUQocHJpbnRrKCJqZmZzX25vZGU6IDB4JXBcbiIsIG4pKTsKLQlEKHByaW50aygie1xuIikpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogdmVyc2lvbiAgKi9cbiIsIG4tPnZlcnNpb24pKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRhdGFfb2Zmc2V0ICAqL1xuIiwgbi0+ZGF0YV9vZmZzZXQpKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRhdGFfc2l6ZSAgKi9cbiIsIG4tPmRhdGFfc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogcmVtb3ZlZF9zaXplICAqL1xuIiwgbi0+cmVtb3ZlZF9zaXplKSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBmbV9vZmZzZXQgICovXG4iLCBuLT5mbV9vZmZzZXQpKTsKLQlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5hbWVfc2l6ZSAgKi9cbiIsIG4tPm5hbWVfc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGZtLCAgZm0tPm9mZnNldDogJXUgICovXG4iLAotCQkgbi0+Zm0sIChuLT5mbSA/IG4tPmZtLT5vZmZzZXQgOiAwKSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHZlcnNpb25fcHJldiAgKi9cbiIsIG4tPnZlcnNpb25fcHJldikpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHZlcnNpb25fbmV4dCAgKi9cbiIsIG4tPnZlcnNpb25fbmV4dCkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHJhbmdlX3ByZXYgICovXG4iLCBuLT5yYW5nZV9wcmV2KSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcmFuZ2VfbmV4dCAgKi9cbiIsIG4tPnJhbmdlX25leHQpKTsKLQlEKHByaW50aygifVxuIikpOwotfQotCi0KLS8qIFByaW50IHRoZSBjb250ZW50cyBvZiBhIHJhdyBpbm9kZS4gICovCi12b2lkCi1qZmZzX3ByaW50X3Jhd19pbm9kZShzdHJ1Y3QgamZmc19yYXdfaW5vZGUgKnJhd19pbm9kZSkKLXsKLQlEKHByaW50aygiamZmc19yYXdfaW5vZGU6IGlub2RlIG51bWJlcjogJXVcbiIsIHJhd19pbm9kZS0+aW5vKSk7Ci0JRChwcmludGsoIntcbiIpKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1hZ2ljICAqL1xuIiwgcmF3X2lub2RlLT5tYWdpYykpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogaW5vICAqL1xuIiwgcmF3X2lub2RlLT5pbm8pKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHBpbm8gICovXG4iLCByYXdfaW5vZGUtPnBpbm8pKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHZlcnNpb24gICovXG4iLCByYXdfaW5vZGUtPnZlcnNpb24pKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1vZGUgICovXG4iLCByYXdfaW5vZGUtPm1vZGUpKTsKLQlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiB1aWQgICovXG4iLCByYXdfaW5vZGUtPnVpZCkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA0eCwgICAgIC8qIGdpZCAgKi9cbiIsIHJhd19pbm9kZS0+Z2lkKSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBhdGltZSAgKi9cbiIsIHJhd19pbm9kZS0+YXRpbWUpKTsKLQlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG10aW1lICAqL1xuIiwgcmF3X2lub2RlLT5tdGltZSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogY3RpbWUgICovXG4iLCByYXdfaW5vZGUtPmN0aW1lKSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBvZmZzZXQgICovXG4iLCByYXdfaW5vZGUtPm9mZnNldCkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZHNpemUgICovXG4iLCByYXdfaW5vZGUtPmRzaXplKSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiByc2l6ZSAgKi9cbiIsIHJhd19pbm9kZS0+cnNpemUpKTsKLQlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5zaXplICAqL1xuIiwgcmF3X2lub2RlLT5uc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogbmxpbmsgICovXG4iLCByYXdfaW5vZGUtPm5saW5rKSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBzcGFyZSAgKi9cbiIsCi0JCSByYXdfaW5vZGUtPnNwYXJlKSk7Ci0JRChwcmludGsoIiAgICAgICAgJXUsICAgICAgICAgIC8qIHJlbmFtZSAgKi9cbiIsCi0JCSByYXdfaW5vZGUtPnJlbmFtZSkpOwotCUQocHJpbnRrKCIgICAgICAgICV1LCAgICAgICAgICAvKiBkZWxldGVkICAqL1xuIiwKLQkJIHJhd19pbm9kZS0+ZGVsZXRlZCkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogYWNjdXJhdGUgICovXG4iLAotCQkgcmF3X2lub2RlLT5hY2N1cmF0ZSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZGNoa3N1bSAgKi9cbiIsIHJhd19pbm9kZS0+ZGNoa3N1bSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JTA0eCwgICAgIC8qIG5jaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPm5jaGtzdW0pKTsKLQlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiBjaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPmNoa3N1bSkpOwotCUQocHJpbnRrKCJ9XG4iKSk7Ci19Ci0KLQogLyogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4gICovCiAjaWYgMAogaW50CmRpZmYgLS1naXQgYS9mcy9qZmZzL2ludHJlcC5oIGIvZnMvamZmcy9pbnRyZXAuaAppbmRleCA0YWU5N2IxLi41YzdhYmUwIDEwMDY0NAotLS0gYS9mcy9qZmZzL2ludHJlcC5oCisrKyBiL2ZzL2pmZnMvaW50cmVwLmgKQEAgLTQ5LDggKzQ5LDYgQEAKIHZvaWQgamZmc19nYXJiYWdlX2NvbGxlY3RfdHJpZ2dlcihzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKIAogLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gICovCi12b2lkIGpmZnNfcHJpbnRfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpuKTsKLXZvaWQgamZmc19wcmludF9yYXdfaW5vZGUoc3RydWN0IGpmZnNfcmF3X2lub2RlICpyYXdfaW5vZGUpOwogI2lmIDAKIGludCBqZmZzX3ByaW50X2ZpbGUoc3RydWN0IGpmZnNfZmlsZSAqZik7CiAjZW5kaWYgIC8qICAwICAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmcy9qZmZzX2ZtLmMgYi9mcy9qZmZzL2pmZnNfZm0uYwppbmRleCAwY2FiOGRhLi4wNTNlM2E5IDEwMDY0NAotLS0gYS9mcy9qZmZzL2pmZnNfZm0uYworKysgYi9mcy9qZmZzL2pmZnNfZm0uYwpAQCAtMzEsNiArMzEsNjAgQEAKIGV4dGVybiBrbWVtX2NhY2hlX3QgICAgICpmbV9jYWNoZTsKIGV4dGVybiBrbWVtX2NhY2hlX3QgICAgICpub2RlX2NhY2hlOwogCisjaWYgQ09ORklHX0pGRlNfRlNfVkVSQk9TRSA+IDAKK3ZvaWQKK2pmZnNfcHJpbnRfZm1jb250cm9sKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCUQocHJpbnRrKCJzdHJ1Y3QgamZmc19mbWNvbnRyb2w6IDB4JXBcbiIsIGZtYykpOworCUQocHJpbnRrKCJ7XG4iKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIGZsYXNoX3NpemUgICovXG4iLCBmbWMtPmZsYXNoX3NpemUpKTsKKwlEKHByaW50aygiICAgICAgICAldSwgLyogdXNlZF9zaXplICAqL1xuIiwgZm1jLT51c2VkX3NpemUpKTsKKwlEKHByaW50aygiICAgICAgICAldSwgLyogZGlydHlfc2l6ZSAgKi9cbiIsIGZtYy0+ZGlydHlfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBmcmVlX3NpemUgICovXG4iLCBmbWMtPmZyZWVfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBzZWN0b3Jfc2l6ZSAgKi9cbiIsIGZtYy0+c2VjdG9yX3NpemUpKTsKKwlEKHByaW50aygiICAgICAgICAldSwgLyogbWluX2ZyZWVfc2l6ZSAgKi9cbiIsIGZtYy0+bWluX2ZyZWVfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBtYXhfY2h1bmtfc2l6ZSAgKi9cbiIsIGZtYy0+bWF4X2NodW5rX3NpemUpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiBtdGQgICovXG4iLCBmbWMtPm10ZCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhlYWQgICovICAgICIKKwkJICIoaGVhZC0+b2Zmc2V0ID0gMHglMDh4KVxuIiwKKwkJIGZtYy0+aGVhZCwgKGZtYy0+aGVhZCA/IGZtYy0+aGVhZC0+b2Zmc2V0IDogMCkpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB0YWlsICAqLyAgICAiCisJCSAiKHRhaWwtPm9mZnNldCArIHRhaWwtPnNpemUgPSAweCUwOHgpXG4iLAorCQkgZm1jLT50YWlsLAorCQkgKGZtYy0+dGFpbCA/IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplIDogMCkpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiBoZWFkX2V4dHJhICAqL1xuIiwgZm1jLT5oZWFkX2V4dHJhKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogdGFpbF9leHRyYSAgKi9cbiIsIGZtYy0+dGFpbF9leHRyYSkpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisjZW5kaWYgIC8qICBDT05GSUdfSkZGU19GU19WRVJCT1NFID4gMCAgKi8KKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAyCitzdGF0aWMgdm9pZAoramZmc19wcmludF9mbShzdHJ1Y3QgamZmc19mbSAqZm0pCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX2ZtOiAweCVwXG4iLCBmbSkpOworCUQocHJpbnRrKCJ7XG4iKSk7CisJRChwcmludGsoIiAgICAgICAweCUwOHgsIC8qIG9mZnNldCAgKi9cbiIsIGZtLT5vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICV1LCAvKiBzaXplICAqL1xuIiwgZm0tPnNpemUpKTsKKwlEKHByaW50aygiICAgICAgIDB4JXAsIC8qIHByZXYgICovXG4iLCBmbS0+cHJldikpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIGZtLT5uZXh0KSk7CisJRChwcmludGsoIiAgICAgICAweCVwLCAvKiBub2RlcyAgKi9cbiIsIGZtLT5ub2RlcykpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisjZW5kaWYgIC8qICBDT05GSUdfSkZGU19GU19WRVJCT1NFID4gMiAgKi8KKworI2lmIDAKK3ZvaWQKK2pmZnNfcHJpbnRfbm9kZV9yZWYoc3RydWN0IGpmZnNfbm9kZV9yZWYgKnJlZikKK3sKKwlEKHByaW50aygic3RydWN0IGpmZnNfbm9kZV9yZWY6IDB4JXBcbiIsIHJlZikpOworCUQocHJpbnRrKCJ7XG4iKSk7CisJRChwcmludGsoIiAgICAgICAweCVwLCAvKiBub2RlICAqL1xuIiwgcmVmLT5ub2RlKSk7CisJRChwcmludGsoIiAgICAgICAweCVwLCAvKiBuZXh0ICAqL1xuIiwgcmVmLT5uZXh0KSk7CisJRChwcmludGsoIn1cbiIpKTsKK30KKyNlbmRpZiAgLyogIDAgICovCisKIC8qIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5ldyBzaGlueSBmbGFzaCBtZW1vcnkgY29udHJvbCBzdHJ1Y3R1cmUuICAqLwogc3RydWN0IGpmZnNfZm1jb250cm9sICoKIGpmZnNfYnVpbGRfYmVnaW4oc3RydWN0IGpmZnNfY29udHJvbCAqYywgaW50IHVuaXQpCkBAIC03NDIsNTQgKzc5NiwzIEBACiB7CiAJcmV0dXJuIG5vX2pmZnNfbm9kZTsKIH0KLQotdm9pZAotamZmc19wcmludF9mbWNvbnRyb2woc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCi17Ci0JRChwcmludGsoInN0cnVjdCBqZmZzX2ZtY29udHJvbDogMHglcFxuIiwgZm1jKSk7Ci0JRChwcmludGsoIntcbiIpKTsKLQlEKHByaW50aygiICAgICAgICAldSwgLyogZmxhc2hfc2l6ZSAgKi9cbiIsIGZtYy0+Zmxhc2hfc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiB1c2VkX3NpemUgICovXG4iLCBmbWMtPnVzZWRfc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBkaXJ0eV9zaXplICAqL1xuIiwgZm1jLT5kaXJ0eV9zaXplKSk7Ci0JRChwcmludGsoIiAgICAgICAgJXUsIC8qIGZyZWVfc2l6ZSAgKi9cbiIsIGZtYy0+ZnJlZV9zaXplKSk7Ci0JRChwcmludGsoIiAgICAgICAgJXUsIC8qIHNlY3Rvcl9zaXplICAqL1xuIiwgZm1jLT5zZWN0b3Jfc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBtaW5fZnJlZV9zaXplICAqL1xuIiwgZm1jLT5taW5fZnJlZV9zaXplKSk7Ci0JRChwcmludGsoIiAgICAgICAgJXUsIC8qIG1heF9jaHVua19zaXplICAqL1xuIiwgZm1jLT5tYXhfY2h1bmtfc2l6ZSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIG10ZCAgKi9cbiIsIGZtYy0+bXRkKSk7Ci0JRChwcmludGsoIiAgICAgICAgMHglcCwgLyogaGVhZCAgKi8gICAgIgotCQkgIihoZWFkLT5vZmZzZXQgPSAweCUwOHgpXG4iLAotCQkgZm1jLT5oZWFkLCAoZm1jLT5oZWFkID8gZm1jLT5oZWFkLT5vZmZzZXQgOiAwKSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHRhaWwgICovICAgICIKLQkJICIodGFpbC0+b2Zmc2V0ICsgdGFpbC0+c2l6ZSA9IDB4JTA4eClcbiIsCi0JCSBmbWMtPnRhaWwsCi0JCSAoZm1jLT50YWlsID8gZm1jLT50YWlsLT5vZmZzZXQgKyBmbWMtPnRhaWwtPnNpemUgOiAwKSkpOwotCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhlYWRfZXh0cmEgICovXG4iLCBmbWMtPmhlYWRfZXh0cmEpKTsKLQlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB0YWlsX2V4dHJhICAqL1xuIiwgZm1jLT50YWlsX2V4dHJhKSk7Ci0JRChwcmludGsoIn1cbiIpKTsKLX0KLQotdm9pZAotamZmc19wcmludF9mbShzdHJ1Y3QgamZmc19mbSAqZm0pCi17Ci0JRChwcmludGsoInN0cnVjdCBqZmZzX2ZtOiAweCVwXG4iLCBmbSkpOwotCUQocHJpbnRrKCJ7XG4iKSk7Ci0JRChwcmludGsoIiAgICAgICAweCUwOHgsIC8qIG9mZnNldCAgKi9cbiIsIGZtLT5vZmZzZXQpKTsKLQlEKHByaW50aygiICAgICAgICV1LCAvKiBzaXplICAqL1xuIiwgZm0tPnNpemUpKTsKLQlEKHByaW50aygiICAgICAgIDB4JXAsIC8qIHByZXYgICovXG4iLCBmbS0+cHJldikpOwotCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIGZtLT5uZXh0KSk7Ci0JRChwcmludGsoIiAgICAgICAweCVwLCAvKiBub2RlcyAgKi9cbiIsIGZtLT5ub2RlcykpOwotCUQocHJpbnRrKCJ9XG4iKSk7Ci19Ci0KLSNpZiAwCi12b2lkCi1qZmZzX3ByaW50X25vZGVfcmVmKHN0cnVjdCBqZmZzX25vZGVfcmVmICpyZWYpCi17Ci0JRChwcmludGsoInN0cnVjdCBqZmZzX25vZGVfcmVmOiAweCVwXG4iLCByZWYpKTsKLQlEKHByaW50aygie1xuIikpOwotCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbm9kZSAgKi9cbiIsIHJlZi0+bm9kZSkpOwotCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIHJlZi0+bmV4dCkpOwotCUQocHJpbnRrKCJ9XG4iKSk7Ci19Ci0jZW5kaWYgIC8qICAwICAqLwotCmRpZmYgLS1naXQgYS9mcy9qZmZzL2pmZnNfZm0uaCBiL2ZzL2pmZnMvamZmc19mbS5oCmluZGV4IGJjMjkxYzQuLmY2NDE1MWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvamZmc19mbS5oCisrKyBiL2ZzL2pmZnMvamZmc19mbS5oCkBAIC0xMzksOCArMTM5LDkgQEAKIHZvaWQgamZmc19mbWZyZWVfcGFydGx5KHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBzdHJ1Y3QgamZmc19mbSAqZm0sCiAJCQlfX3UzMiBzaXplKTsKIAorI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAwCiB2b2lkIGpmZnNfcHJpbnRfZm1jb250cm9sKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKTsKLXZvaWQgamZmc19wcmludF9mbShzdHJ1Y3QgamZmc19mbSAqZm0pOworI2VuZGlmCiAjaWYgMAogdm9pZCBqZmZzX3ByaW50X25vZGVfcmVmKHN0cnVjdCBqZmZzX25vZGVfcmVmICpyZWYpOwogI2VuZGlmICAvKiAgMCAgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL01ha2VmaWxlIGIvZnMvamZmczIvTWFrZWZpbGUKaW5kZXggZTNjMzhjYy4uZjFhZmU2OCAxMDA2NDQKLS0tIGEvZnMvamZmczIvTWFrZWZpbGUKKysrIGIvZnMvamZmczIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gdjIgKEpGRlMyKQogIwotIyAkSWQ6IE1ha2VmaWxlLmNvbW1vbix2IDEuNyAyMDA0LzExLzAzIDEyOjU3OjM4IGp3Ym95ZXIgRXhwICQKKyMgJElkOiBNYWtlZmlsZS5jb21tb24sdiAxLjkgMjAwNS8wMi8wOSAwOToyMzo1MyBwYXZsb3YgRXhwICQKICMKIAogb2JqLSQoQ09ORklHX0pGRlMyX0ZTKSArPSBqZmZzMi5vCkBAIC0xMSw4ICsxMSw3IEBACiBqZmZzMi15CSs9IHN5bWxpbmsubyBidWlsZC5vIGVyYXNlLm8gYmFja2dyb3VuZC5vIGZzLm8gd3JpdGV2Lm8KIGpmZnMyLXkJKz0gc3VwZXIubwogCi1qZmZzMi0kKENPTkZJR19KRkZTMl9GU19OQU5EKQkrPSB3YnVmLm8KLWpmZnMyLSQoQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MpICs9IHdidWYubworamZmczItJChDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIpCSs9IHdidWYubwogamZmczItJChDT05GSUdfSkZGUzJfUlVCSU4pCSs9IGNvbXByX3J1YmluLm8KIGpmZnMyLSQoQ09ORklHX0pGRlMyX1JUSU1FKQkrPSBjb21wcl9ydGltZS5vCiBqZmZzMi0kKENPTkZJR19KRkZTMl9aTElCKQkrPSBjb21wcl96bGliLm8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL1JFQURNRS5Mb2NraW5nIGIvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKaW5kZXggNDk3NzFjZi4uYjc5NDM0MyAxMDA2NDQKLS0tIGEvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKKysrIGIvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKQEAgLTEsNCArMSw0IEBACi0JJElkOiBSRUFETUUuTG9ja2luZyx2IDEuOSAyMDA0LzExLzIwIDEwOjM1OjQwIGR3bXcyIEV4cCAkCisJJElkOiBSRUFETUUuTG9ja2luZyx2IDEuMTIgMjAwNS8wNC8xMyAxMzoyMjozNSBkd213MiBFeHAgJAogCiAJSkZGUzIgTE9DS0lORyBET0NVTUVOVEFUSU9OCiAJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDgsNiArMTA4LDEwIEBACiBjb3JyZXNwb25kZW50IGpmZnMyX2lub2RlX2NhY2hlIG9iamVjdCkuIFNvLCB0aGUgaW5vY2FjaGVfbG9jawogaGFzIHRvIGJlIGxvY2tlZCB3aGlsZSB3YWxraW5nIHRoZSBjLT5pbm9jYWNoZV9saXN0IGhhc2ggYnVja2V0cy4KIAorVGhpcyBzcGlubG9jayBhbHNvIGNvdmVycyBhbGxvY2F0aW9uIG9mIG5ldyBpbm9kZSBudW1iZXJzLCB3aGljaCBpcworY3VycmVudGx5IGp1c3QgJysrLT5oaWdoZXN0X2lubysrJywgYnV0IG1pZ2h0IG9uZSBkYXkgZ2V0IG1vcmUgY29tcGxpY2F0ZWQKK2lmIHdlIG5lZWQgdG8gZGVhbCB3aXRoIHdyYXBwaW5nIGFmdGVyIDQgbWlsbGlhcmQgaW5vZGUgbnVtYmVycyBhcmUgdXNlZC4KKwogTm90ZSwgdGhlIGYtPnNlbSBndWFyYW50ZWVzIHRoYXQgdGhlIGNvcnJlc3BvbmRlbnQgamZmczJfaW5vZGVfY2FjaGUKIHdpbGwgbm90IGJlIHJlbW92ZWQuIFNvLCBpdCBpcyBhbGxvd2VkIHRvIGFjY2VzcyBpdCB3aXRob3V0IGxvY2tpbmcKIHRoZSBpbm9jYWNoZV9sb2NrIHNwaW5sb2NrLiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2JhY2tncm91bmQuYyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwppbmRleCAxYmU2ZGUyLi4wZjIyNDM4IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKKysrIGIvZnMvamZmczIvYmFja2dyb3VuZC5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBiYWNrZ3JvdW5kLmMsdiAxLjUwIDIwMDQvMTEvMTYgMjA6MzY6MTAgZHdtdzIgRXhwICQKKyAqICRJZDogYmFja2dyb3VuZC5jLHYgMS41NCAyMDA1LzA1LzIwIDIxOjM3OjEyIGdsZWl4bmVyIEV4cCAkCiAgKgogICovCiAKQEAgLTM3LDcgKzM3LDcgQEAKIAlpZiAoYy0+Z2NfdGFzaykKIAkJQlVHKCk7CiAKLQlpbml0X01VVEVYX0xPQ0tFRCgmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwlpbml0X2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9zdGFydCk7CiAJaW5pdF9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfZXhpdCk7CiAKIAlwaWQgPSBrZXJuZWxfdGhyZWFkKGpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQsIGMsIENMT05FX0ZTfENMT05FX0ZJTEVTKTsKQEAgLTQ4LDcgKzQ4LDcgQEAKIAl9IGVsc2UgewogCQkvKiBXYWl0IGZvciBpdC4uLiAqLwogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiSkZGUzI6IEdhcmJhZ2UgY29sbGVjdCB0aHJlYWQgaXMgcGlkICVkXG4iLCBwaWQpKTsKLQkJZG93bigmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKIAl9CiAgCiAJcmV0dXJuIHJldDsKQEAgLTU2LDEzICs1NiwxNiBAQAogCiB2b2lkIGpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKIHsKKwlpbnQgd2FpdCA9IDA7CiAJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCWlmIChjLT5nY190YXNrKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMjogS2lsbGluZyBHQyB0YXNrICVkXG4iLCBjLT5nY190YXNrLT5waWQpKTsKIAkJc2VuZF9zaWcoU0lHS0lMTCwgYy0+Z2NfdGFzaywgMSk7CisJCXdhaXQgPSAxOwogCX0KIAlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfZXhpdCk7CisJaWYgKHdhaXQpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKIH0KIAogc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHZvaWQgKl9jKQpAQCAtNzUsNyArNzgsNyBAQAogCWFsbG93X3NpZ25hbChTSUdDT05UKTsKIAogCWMtPmdjX3Rhc2sgPSBjdXJyZW50OwotCXVwKCZjLT5nY190aHJlYWRfc3RhcnQpOworCWNvbXBsZXRlKCZjLT5nY190aHJlYWRfc3RhcnQpOwogCiAJc2V0X3VzZXJfbmljZShjdXJyZW50LCAxMCk7CiAKQEAgLTkyLDcgKzk1LDcgQEAKIAkJCXNjaGVkdWxlKCk7CiAJCX0KIAotCQlpZiAodHJ5X3RvX2ZyZWV6ZSgwKSkKKwkJaWYgKHRyeV90b19mcmVlemUoKSkKIAkJCWNvbnRpbnVlOwogCiAJCWNvbmRfcmVzY2hlZCgpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYnVpbGQuYyBiL2ZzL2pmZnMyL2J1aWxkLmMKaW5kZXggYTAxZGQ1Zi4uM2RkNTM5NCAxMDA2NDQKLS0tIGEvZnMvamZmczIvYnVpbGQuYworKysgYi9mcy9qZmZzMi9idWlsZC5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBidWlsZC5jLHYgMS42OSAyMDA0LzEyLzE2IDIwOjIyOjE4IGRtYXJsaW4gRXhwICQKKyAqICRJZDogYnVpbGQuYyx2IDEuNzAgMjAwNS8wMi8yOCAwODoyMTowNSBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC05NywxNCArOTcsMTYgQEAKIAkvKiBGaXJzdCwgc2NhbiB0aGUgbWVkaXVtIGFuZCBidWlsZCBhbGwgdGhlIGlub2RlIGNhY2hlcyB3aXRoCiAJICAgbGlzdHMgb2YgcGh5c2ljYWwgbm9kZXMgKi8KIAotCWMtPmZsYWdzIHw9IEpGRlMyX1NCX0ZMQUdfTU9VTlRJTkc7CisJYy0+ZmxhZ3MgfD0gSkZGUzJfU0JfRkxBR19TQ0FOTklORzsKIAlyZXQgPSBqZmZzMl9zY2FuX21lZGl1bShjKTsKKwljLT5mbGFncyAmPSB+SkZGUzJfU0JfRkxBR19TQ0FOTklORzsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiU2Nhbm5lZCBmbGFzaCBjb21wbGV0ZWx5XG4iKSk7CiAJRDIoamZmczJfZHVtcF9ibG9ja19saXN0cyhjKSk7CiAKKwljLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX0JVSUxESU5HOwogCS8qIE5vdyBzY2FuIHRoZSBkaXJlY3RvcnkgdHJlZSwgaW5jcmVhc2luZyBubGluayBhY2NvcmRpbmcgdG8gZXZlcnkgZGlyZW50IGZvdW5kLiAqLwogCWZvcl9lYWNoX2lub2RlKGksIGMsIGljKSB7CiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQYXNzIDE6IGlubyAjJXVcbiIsIGljLT5pbm8pKTsKQEAgLTExNiw3ICsxMTgsNiBAQAogCQkJY29uZF9yZXNjaGVkKCk7CiAJCX0KIAl9Ci0JYy0+ZmxhZ3MgJj0gfkpGRlMyX1NCX0ZMQUdfTU9VTlRJTkc7CiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAxIGNvbXBsZXRlXG4iKSk7CiAKQEAgLTE2NCw2ICsxNjUsOCBAQAogCQlpYy0+c2Nhbl9kZW50cyA9IE5VTEw7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KKwljLT5mbGFncyAmPSB+SkZGUzJfU0JfRkxBR19CVUlMRElORzsKKwkKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAzIGNvbXBsZXRlXG4iKSk7CiAJRDIoamZmczJfZHVtcF9ibG9ja19saXN0cyhjKSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYyBiL2ZzL2pmZnMyL2NvbXByX3psaWIuYwppbmRleCAwNzhhMzBlLi44M2Y3ZTA3IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9jb21wcl96bGliLmMKKysrIGIvZnMvamZmczIvY29tcHJfemxpYi5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBjb21wcl96bGliLmMsdiAxLjI5IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqICRJZDogY29tcHJfemxpYi5jLHYgMS4zMSAyMDA1LzA1LzIwIDE5OjMwOjA2IGdsZWl4bmVyIEV4cCAkCiAgKgogICovCiAKQEAgLTE3LDEwICsxNywxMCBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvemxpYi5oPgogI2luY2x1ZGUgPGxpbnV4L3p1dGlsLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAjaW5jbHVkZSAiY29tcHIuaCIKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvZGlyLmMgYi9mcy9qZmZzMi9kaXIuYwppbmRleCA3NTczMDZmLi4zY2EwZDI1IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9kaXIuYworKysgYi9mcy9qZmZzMi9kaXIuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZGlyLmMsdiAxLjg0IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqICRJZDogZGlyLmMsdiAxLjg2IDIwMDUvMDcvMDYgMTI6MTM6MDkgZHdtdzIgRXhwICQKICAqCiAgKi8KIApAQCAtMjIsMTYgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSAibm9kZWxpc3QuaCIKIAotLyogVXJnaC4gUGxlYXNlIHRlbGwgbWUgdGhlcmUncyBhIG5pY2VyIHdheSBvZiBkb2luZyB0aGVzZS4gKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDQ4KQotdHlwZWRlZiBpbnQgbWtub2RfYXJnX3Q7Ci0jZGVmaW5lIE5BTUVJX0NPTVBBVCh4KSAoKHZvaWQgKil4KQotI2Vsc2UKLXR5cGVkZWYgZGV2X3QgbWtub2RfYXJnX3Q7Ci0jZGVmaW5lIE5BTUVJX0NPTVBBVCh4KSAoeCkKLSNlbmRpZgotCiBzdGF0aWMgaW50IGpmZnMyX3JlYWRkaXIgKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKIAogc3RhdGljIGludCBqZmZzMl9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsCkBAIC00Myw3ICszMyw3IEBACiBzdGF0aWMgaW50IGpmZnMyX3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixjb25zdCBjaGFyICopOwogc3RhdGljIGludCBqZmZzMl9ta2RpciAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGludCk7CiBzdGF0aWMgaW50IGpmZnMyX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOwotc3RhdGljIGludCBqZmZzMl9ta25vZCAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGludCxta25vZF9hcmdfdCk7CitzdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LGRldl90KTsKIHN0YXRpYyBpbnQgamZmczJfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CiAKQEAgLTU4LDggKzQ4LDggQEAKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfZGlyX2lub2RlX29wZXJhdGlvbnMgPQogewotCS5jcmVhdGUgPQlOQU1FSV9DT01QQVQoamZmczJfY3JlYXRlKSwKLQkubG9va3VwID0JTkFNRUlfQ09NUEFUKGpmZnMyX2xvb2t1cCksCisJLmNyZWF0ZSA9CWpmZnMyX2NyZWF0ZSwKKwkubG9va3VwID0JamZmczJfbG9va3VwLAogCS5saW5rID0JCWpmZnMyX2xpbmssCiAJLnVubGluayA9CWpmZnMyX3VubGluaywKIAkuc3ltbGluayA9CWpmZnMyX3N5bWxpbmssCkBAIC0yOTYsMTEgKzI4NiwxMSBAQAogCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CiAJaW50IG5hbWVsZW47CiAJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOwotCWludCByZXQ7CisJaW50IHJldCwgdGFyZ2V0bGVuID0gc3RybGVuKHRhcmdldCk7CiAKIAkvKiBGSVhNRTogSWYgeW91IGNhcmUuIFdlJ2QgbmVlZCB0byB1c2UgZnJhZ3MgZm9yIHRoZSB0YXJnZXQKIAkgICBpZiBpdCBncm93cyBtdWNoIG1vcmUgdGhhbiB0aGlzICovCi0JaWYgKHN0cmxlbih0YXJnZXQpID4gMjU0KQorCWlmICh0YXJnZXRsZW4gPiAyNTQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmkgPSBqZmZzMl9hbGxvY19yYXdfaW5vZGUoKTsKQEAgLTMxNCw3ICszMDQsNyBAQAogCSAqIEp1c3QgdGhlIG5vZGUgd2lsbCBkbyBmb3Igbm93LCB0aG91Z2ggCiAJICovCiAJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKLQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgc3RybGVuKHRhcmdldCksICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyB0YXJnZXRsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOwogCiAJaWYgKHJldCkgewogCQlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CkBAIC0zMzMsMTYgKzMyMywxNiBAQAogCiAJZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOwogCi0JaW5vZGUtPmlfc2l6ZSA9IHN0cmxlbih0YXJnZXQpOworCWlub2RlLT5pX3NpemUgPSB0YXJnZXRsZW47CiAJcmktPmlzaXplID0gcmktPmRzaXplID0gcmktPmNzaXplID0gY3B1X3RvX2plMzIoaW5vZGUtPmlfc2l6ZSk7CiAJcmktPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmkpICsgaW5vZGUtPmlfc2l6ZSk7CiAJcmktPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKIAogCXJpLT5jb21wciA9IEpGRlMyX0NPTVBSX05PTkU7Ci0JcmktPmRhdGFfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgdGFyZ2V0LCBzdHJsZW4odGFyZ2V0KSkpOworCXJpLT5kYXRhX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHRhcmdldCwgdGFyZ2V0bGVuKSk7CiAJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKIAkKLQlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCB0YXJnZXQsIHN0cmxlbih0YXJnZXQpLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCB0YXJnZXQsIHRhcmdldGxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CiAKIAlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CiAKQEAgLTM1Myw2ICszNDMsMjAgQEAKIAkJamZmczJfY2xlYXJfaW5vZGUoaW5vZGUpOwogCQlyZXR1cm4gUFRSX0VSUihmbik7CiAJfQorCisJLyogV2UgdXNlIGYtPmRlbnRzIGZpZWxkIHRvIHN0b3JlIHRoZSB0YXJnZXQgcGF0aC4gKi8KKwlmLT5kZW50cyA9IGttYWxsb2ModGFyZ2V0bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmLT5kZW50cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBhbGxvY2F0ZSAlZCBieXRlcyBvZiBtZW1vcnlcbiIsIHRhcmdldGxlbiArIDEpOworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtY3B5KGYtPmRlbnRzLCB0YXJnZXQsIHRhcmdldGxlbiArIDEpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zeW1saW5rOiBzeW1saW5rJ3MgdGFyZ2V0ICclcycgY2FjaGVkXG4iLCAoY2hhciAqKWYtPmRlbnRzKSk7CisKIAkvKiBObyBkYXRhIGhlcmUuIE9ubHkgYSBtZXRhZGF0YSBub2RlLCB3aGljaCB3aWxsIGJlIAogCSAgIG9ic29sZXRlZCBieSB0aGUgZmlyc3QgZGF0YSB3cml0ZQogCSovCkBAIC01NjQsNyArNTY4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBta25vZF9hcmdfdCByZGV2KQorc3RhdGljIGludCBqZmZzMl9ta25vZCAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKIHsKIAlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgKmRpcl9mOwogCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZXJhc2UuYyBiL2ZzL2pmZnMyL2VyYXNlLmMKaW5kZXggNDE0NTFlOC4uNmE0YzBhMyAxMDA2NDQKLS0tIGEvZnMvamZmczIvZXJhc2UuYworKysgYi9mcy9qZmZzMi9lcmFzZS5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBlcmFzZS5jLHYgMS42NiAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGVyYXNlLmMsdiAxLjc2IDIwMDUvMDUvMDMgMTU6MTE6NDAgZGVkZWtpbmQgRXhwICQKICAqCiAgKi8KIApAQCAtNDgsNiArNDgsNyBAQAogI2Vsc2UgLyogTGludXggKi8KIAlzdHJ1Y3QgZXJhc2VfaW5mbyAqaW5zdHI7CiAKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZXJhc2VfYmxvY2soKTogZXJhc2UgYmxvY2sgJSN4IChyYW5nZSAlI3gtJSN4KVxuIiwgamViLT5vZmZzZXQsIGplYi0+b2Zmc2V0LCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplKSk7CiAJaW5zdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykgKyBzaXplb2Yoc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnN0cikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJrbWFsbG9jIGZvciBzdHJ1Y3QgZXJhc2VfaW5mbyBpbiBqZmZzMl9lcmFzZV9ibG9jayBmYWlsZWQuIFJlZmlsaW5nIGJsb2NrIGZvciBsYXRlclxuIik7CkBAIC0yMzMsNyArMjM0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9IAogCi0JCWlmICgoKCpwcmV2KS0+Zmxhc2hfb2Zmc2V0ICYgfihjLT5zZWN0b3Jfc2l6ZSAtMSkpID09IGplYi0+b2Zmc2V0KSB7CisJCWlmIChTRUNUT1JfQUREUigoKnByZXYpLT5mbGFzaF9vZmZzZXQpID09IGplYi0+b2Zmc2V0KSB7CiAJCQkvKiBJdCdzIGluIHRoZSBibG9jayB3ZSdyZSBlcmFzaW5nICovCiAJCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICp0aGlzOwogCkBAIC0yNzcsMTEgKzI3OCw4IEBACiAJCXByaW50aygiXG4iKTsKIAl9KTsKIAotCWlmIChpYy0+bm9kZXMgPT0gKHZvaWQgKilpYykgewotCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5vY2FjaGUgZm9yIGlubyAjJXUgaXMgYWxsIGdvbmUgbm93LiBGcmVlaW5nXG4iLCBpYy0+aW5vKSk7CisJaWYgKGljLT5ub2RlcyA9PSAodm9pZCAqKWljICYmIGljLT5ubGluayA9PSAwKQogCQlqZmZzMl9kZWxfaW5vX2NhY2hlKGMsIGljKTsKLQkJamZmczJfZnJlZV9pbm9kZV9jYWNoZShpYyk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBqZmZzMl9mcmVlX2FsbF9ub2RlX3JlZnMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCkBAIC0zMTAsNyArMzA4LDcgQEAKIAlpbnQgcmV0OwogCXVpbnQzMl90IGJhZF9vZmZzZXQ7CiAKLQlpZiAoIWpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgeworCWlmICgoIWpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgJiYgKGMtPmNsZWFubWFya2VyX3NpemUgPiAwKSkgewogCQltYXJrZXJfcmVmID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCk7CiAJCWlmICghbWFya2VyX3JlZikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlIHJhdyBub2RlIHJlZiBmb3IgY2xlYW4gbWFya2VyXG4iKTsKQEAgLTMzNSw3ICszMzMsOCBAQAogCiAJCQliYWRfb2Zmc2V0ID0gb2ZzOwogCi0JCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIG9mcywgcmVhZGxlbiwgJnJldGxlbiwgZWJ1Zik7CisJCQlyZXQgPSBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIHJlYWRsZW4sICZyZXRsZW4sIGVidWYpOworCiAJCQlpZiAocmV0KSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBvZiBuZXdseS1lcmFzZWQgYmxvY2sgYXQgMHglMDh4IGZhaWxlZDogJWQuIFB1dHRpbmcgb24gYmFkX2xpc3RcbiIsIG9mcywgcmV0KTsKIAkJCQlnb3RvIGJhZDsKQEAgLTM1MSw3ICszNTAsNyBAQAogCQkJCQliYWRfb2Zmc2V0ICs9IGk7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5ld2x5LWVyYXNlZCBibG9jayBjb250YWluZWQgd29yZCAweCVseCBhdCBvZmZzZXQgMHglMDh4XG4iLCBkYXR1bSwgYmFkX29mZnNldCk7CiAJCQkJYmFkOiAKLQkJCQkJaWYgKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCisJCQkJCWlmICgoIWpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgJiYgKGMtPmNsZWFubWFya2VyX3NpemUgPiAwKSkKIAkJCQkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG1hcmtlcl9yZWYpOwogCQkJCQlrZnJlZShlYnVmKTsKIAkJCQliYWQyOgpAQCAtMzg3LDYgKzM4NiwxMyBAQAogCQlqZWItPnVzZWRfc2l6ZSA9IDA7CiAJCWplYi0+ZGlydHlfc2l6ZSA9IDA7CiAJCWplYi0+d2FzdGVkX3NpemUgPSAwOworCX0gZWxzZSBpZiAoYy0+Y2xlYW5tYXJrZXJfc2l6ZSA9PSAwKSB7CisJCWplYi0+Zmlyc3Rfbm9kZSA9IGplYi0+bGFzdF9ub2RlID0gTlVMTDsKKworCQlqZWItPmZyZWVfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQlqZWItPnVzZWRfc2l6ZSA9IDA7CisJCWplYi0+ZGlydHlfc2l6ZSA9IDA7CisJCWplYi0+d2FzdGVkX3NpemUgPSAwOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBrdmVjIHZlY3NbMV07CiAJCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgbWFya2VyID0gewpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCmluZGV4IDc3MWE1NTQuLmJkOWVkOWIgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZpbGUuYworKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTcsMTEgKzcsMTAgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogZmlsZS5jLHYgMS45OSAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGZpbGUuYyx2IDEuMTAyIDIwMDUvMDcvMDYgMTI6MTM6MDkgZHdtdzIgRXhwICQKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTUxLDkgKzUwLDcgQEAKIAkuaW9jdGwgPQlqZmZzMl9pb2N0bCwKIAkubW1hcCA9CQlnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKIAkuZnN5bmMgPQlqZmZzMl9mc3luYywKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw1LDI5KQogCS5zZW5kZmlsZSA9CWdlbmVyaWNfZmlsZV9zZW5kZmlsZQotI2VuZGlmCiB9OwogCiAvKiBqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZzLmMgYi9mcy9qZmZzMi9mcy5jCmluZGV4IDMwYWIyMzMuLjU2ODdjM2YgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtNywxMSArNywxMCBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBmcy5jLHYgMS41MSAyMDA0LzExLzI4IDEyOjE5OjM3IGRlZGVraW5kIEV4cCAkCisgKiAkSWQ6IGZzLmMsdiAxLjU2IDIwMDUvMDcvMDYgMTI6MTM6MDkgZHdtdzIgRXhwICQKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNDUwLDExICs0NDksMTUgQEAKIAogCWMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKIAotI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAlpZiAoYy0+bXRkLT50eXBlID09IE1URF9OQU5ERkxBU0gpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJqZmZzMjogQ2Fubm90IG9wZXJhdGUgb24gTkFORCBmbGFzaCB1bmxlc3MgamZmczIgTkFORCBzdXBwb3J0IGlzIGNvbXBpbGVkIGluLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKwlpZiAoYy0+bXRkLT50eXBlID09IE1URF9EQVRBRkxBU0gpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzMjogQ2Fubm90IG9wZXJhdGUgb24gRGF0YUZsYXNoIHVubGVzcyBqZmZzMiBEYXRhRmxhc2ggc3VwcG9ydCBpcyBjb21waWxlZCBpbi5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAjZW5kaWYKIAogCWMtPmZsYXNoX3NpemUgPSBjLT5tdGQtPnNpemU7CkBAIC01MjIsOSArNTI1LDcgQEAKIAlpZiAoIXNiLT5zX3Jvb3QpCiAJCWdvdG8gb3V0X3Jvb3RfaTsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSAweDIwNDAzCiAJc2ItPnNfbWF4Ynl0ZXMgPSAweEZGRkZGRkZGOwotI2VuZGlmCiAJc2ItPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gUEFHRV9DQUNIRV9TSElGVDsKIAlzYi0+c19tYWdpYyA9IEpGRlMyX1NVUEVSX01BR0lDOwpAQCAtNjYxLDYgKzY2MiwxNCBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CisJCisJLyogYW5kIERhdGFmbGFzaCAqLworCWlmIChqZmZzMl9kYXRhZmxhc2goYykpIHsKKwkJcmV0ID0gamZmczJfZGF0YWZsYXNoX3NldHVwKGMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjc0LDQgKzY4Myw5IEBACiAJaWYgKGpmZnMyX25vcl9lY2MoYykpIHsKIAkJamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpOwogCX0KKwkKKwkvKiBhbmQgRGF0YUZsYXNoICovCisJaWYgKGpmZnMyX2RhdGFmbGFzaChjKSkgeworCQlqZmZzMl9kYXRhZmxhc2hfY2xlYW51cChjKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9nYy5jIGIvZnMvamZmczIvZ2MuYwppbmRleCA4N2VjNzRmLi43MDg2Y2Q2IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9nYy5jCisrKyBiL2ZzL2pmZnMyL2djLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IGdjLmMsdiAxLjE0NCAyMDA0LzEyLzIxIDExOjE4OjUwIGR3bXcyIEV4cCAkCisgKiAkSWQ6IGdjLmMsdiAxLjE0OCAyMDA1LzA0LzA5IDEwOjQ3OjAwIGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTUwLDYgKzUwLDcgQEAKIAkgICBwdXQgdGhlIGNsZXZlciB3ZWFyLWxldmVsbGluZyBhbGdvcml0aG1zLiBFdmVudHVhbGx5LiAgKi8KIAkvKiBXZSBwb3NzaWJseSB3YW50IHRvIGZhdm91ciB0aGUgZGlydGllciBibG9ja3MgbW9yZSB3aGVuIHRoZQogCSAgIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpcyBsb3cuICovCithZ2FpbjoKIAlpZiAoIWxpc3RfZW1wdHkoJmMtPmJhZF91c2VkX2xpc3QpICYmIGMtPm5yX2ZyZWVfYmxvY2tzID4gYy0+cmVzdl9ibG9ja3NfZ2NiYWQpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBpY2tpbmcgYmxvY2sgZnJvbSBiYWRfdXNlZF9saXN0IHRvIEdDIG5leHRcbiIpKTsKIAkJbmV4dGxpc3QgPSAmYy0+YmFkX3VzZWRfbGlzdDsKQEAgLTc5LDYgKzgwLDEzIEBACiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gZXJhc2FibGVfbGlzdCB0byBHQyBuZXh0IChjbGVhbl9saXN0IGFuZCB7dmVyeV8sfWRpcnR5X2xpc3Qgd2VyZSBlbXB0eSlcbiIpKTsKIAogCQluZXh0bGlzdCA9ICZjLT5lcmFzYWJsZV9saXN0OworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0KSkgeworCQkvKiBUaGVyZSBhcmUgYmxvY2tzIGFyZSB3YXRpbmcgZm9yIHRoZSB3YnVmIHN5bmMgKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlN5bmNoaW5nIHdidWYgaW4gb3JkZXIgdG8gcmV1c2UgZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QgYmxvY2tzXG4iKSk7CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlqZmZzMl9mbHVzaF93YnVmX3BhZChjKTsKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlnb3RvIGFnYWluOwogCX0gZWxzZSB7CiAJCS8qIEVlcC4gQWxsIHdlcmUgZW1wdHkgKi8KIAkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMjogTm8gY2xlYW4sIGRpcnR5IF9vcl8gZXJhc2FibGUgYmxvY2tzIHRvIEdDIGZyb20hIFdoZXJlIGFyZSB0aGV5IGFsbD9cbiIpKTsKQEAgLTY2MSw5ICs2NjksMTAgQEAKIHsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbmV3X2ZuOwogCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgcmk7CisJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqbGFzdF9mcmFnOwogCWppbnQxNl90IGRldjsKIAljaGFyICptZGF0YSA9IE5VTEwsIG1kYXRhbGVuID0gMDsKLQl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzLCBpbGVuOwogCWludCByZXQ7CiAKIAlpZiAoU19JU0JMSyhKRkZTMl9GX0lfTU9ERShmKSkgfHwKQEAgLTY5OSw2ICs3MDgsMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCQorCWxhc3RfZnJhZyA9IGZyYWdfbGFzdCgmZi0+ZnJhZ3RyZWUpOworCWlmIChsYXN0X2ZyYWcpCisJCS8qIEZldGNoIHRoZSBpbm9kZSBsZW5ndGggZnJvbSB0aGUgZnJhZ3RyZWUgcmF0aGVyIHRoZW4KKwkJICogZnJvbSBpX3NpemUgc2luY2UgaV9zaXplIG1heSBoYXZlIG5vdCBiZWVuIHVwZGF0ZWQgeWV0ICovCisJCWlsZW4gPSBsYXN0X2ZyYWctPm9mcyArIGxhc3RfZnJhZy0+c2l6ZTsKKwllbHNlCisJCWlsZW4gPSBKRkZTMl9GX0lfU0laRShmKTsKKwkKIAltZW1zZXQoJnJpLCAwLCBzaXplb2YocmkpKTsKIAlyaS5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOwogCXJpLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfSU5PREUpOwpAQCAtNzEwLDcgKzcyNyw3IEBACiAJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoSkZGUzJfRl9JX01PREUoZikpOwogCXJpLnVpZCA9IGNwdV90b19qZTE2KEpGRlMyX0ZfSV9VSUQoZikpOwogCXJpLmdpZCA9IGNwdV90b19qZTE2KEpGRlMyX0ZfSV9HSUQoZikpOwotCXJpLmlzaXplID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX1NJWkUoZikpOworCXJpLmlzaXplID0gY3B1X3RvX2plMzIoaWxlbik7CiAJcmkuYXRpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQVRJTUUoZikpOwogCXJpLmN0aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX0NUSU1FKGYpKTsKIAlyaS5tdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9NVElNRShmKSk7CkBAIC04MTYsOCArODMzLDcgQEAKIAogCQkJLyogRG9lc24ndCBtYXR0ZXIgaWYgdGhlcmUncyBvbmUgaW4gdGhlIHNhbWUgZXJhc2UgYmxvY2suIFdlJ3JlIGdvaW5nIHRvIAogCQkJICAgZGVsZXRlIGl0IHRvbyBhdCB0aGUgc2FtZSB0aW1lLiAqLwotCQkJaWYgKChyYXctPmZsYXNoX29mZnNldCAmIH4oYy0+c2VjdG9yX3NpemUtMSkpID09Ci0JCQkgICAgKGZkLT5yYXctPmZsYXNoX29mZnNldCAmIH4oYy0+c2VjdG9yX3NpemUtMSkpKQorCQkJaWYgKFNFQ1RPUl9BRERSKHJhdy0+Zmxhc2hfb2Zmc2V0KSA9PSBTRUNUT1JfQUREUihmZC0+cmF3LT5mbGFzaF9vZmZzZXQpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2sgcG90ZW50aWFsIGRlbGV0aW9uIGRpcmVudCBhdCAlMDh4XG4iLCByZWZfb2Zmc2V0KHJhdykpKTsKQEAgLTg5MSw3ICs5MDcsNyBAQAogCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgcmk7CiAJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZzsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbmV3X2ZuOwotCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnMsIGlsZW47CiAJaW50IHJldDsKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIHJlcGxhY2VtZW50IGhvbGUgbm9kZSBmb3IgaW5vICMldSBmcm9tIG9mZnNldCAweCV4IHRvIDB4JXhcbiIsCkBAIC05NTEsMTAgKzk2NywxOSBAQAogCQlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKDApOwogCQlyaS5jb21wciA9IEpGRlMyX0NPTVBSX1pFUk87CiAJfQorCQorCWZyYWcgPSBmcmFnX2xhc3QoJmYtPmZyYWd0cmVlKTsKKwlpZiAoZnJhZykKKwkJLyogRmV0Y2ggdGhlIGlub2RlIGxlbmd0aCBmcm9tIHRoZSBmcmFndHJlZSByYXRoZXIgdGhlbgorCQkgKiBmcm9tIGlfc2l6ZSBzaW5jZSBpX3NpemUgbWF5IGhhdmUgbm90IGJlZW4gdXBkYXRlZCB5ZXQgKi8KKwkJaWxlbiA9IGZyYWctPm9mcyArIGZyYWctPnNpemU7CisJZWxzZQorCQlpbGVuID0gSkZGUzJfRl9JX1NJWkUoZik7CisKIAlyaS5tb2RlID0gY3B1X3RvX2plbW9kZShKRkZTMl9GX0lfTU9ERShmKSk7CiAJcmkudWlkID0gY3B1X3RvX2plMTYoSkZGUzJfRl9JX1VJRChmKSk7CiAJcmkuZ2lkID0gY3B1X3RvX2plMTYoSkZGUzJfRl9JX0dJRChmKSk7Ci0JcmkuaXNpemUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfU0laRShmKSk7CisJcmkuaXNpemUgPSBjcHVfdG9famUzMihpbGVuKTsKIAlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CiAJcmkuY3RpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQ1RJTUUoZikpOwogCXJpLm10aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX01USU1FKGYpKTsKQEAgLTExNjEsNyArMTE4Niw3IEBACiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFeHBhbmRlZCBkbm9kZSB0byB3cml0ZSBmcm9tICgweCV4LTB4JXgpIHRvICgweCV4LTB4JXgpXG4iLCAKIAkJCSAgb3JpZ19zdGFydCwgb3JpZ19lbmQsIHN0YXJ0LCBlbmQpKTsKIAotCQlCVUdfT04oZW5kID4gSkZGUzJfRl9JX1NJWkUoZikpOworCQlEMShCVUdfT04oZW5kID4gZnJhZ19sYXN0KCZmLT5mcmFndHJlZSktPm9mcyArIGZyYWdfbGFzdCgmZi0+ZnJhZ3RyZWUpLT5zaXplKSk7CiAJCUJVR19PTihlbmQgPCBvcmlnX2VuZCk7CiAJCUJVR19PTihzdGFydCA+IG9yaWdfc3RhcnQpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmMgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCmluZGV4IGNkNmE4YmQuLmM3YmJkZWUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL25vZGVsaXN0LmMKKysrIGIvZnMvamZmczIvbm9kZWxpc3QuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogbm9kZWxpc3QuYyx2IDEuOTAgMjAwNC8xMi8wOCAxNzo1OToyMCBkd213MiBFeHAgJAorICogJElkOiBub2RlbGlzdC5jLHYgMS45NyAyMDA1LzA3LzA2IDE1OjE4OjQxIGR3bXcyIEV4cCAkCiAgKgogICovCiAKQEAgLTU4LDI3ICs1OCw2MCBAQAogLyogUHV0IGEgbmV3IHRtcF9kbm9kZV9pbmZvIGludG8gdGhlIGxpc3QsIGtlZXBpbmcgdGhlIGxpc3QgaW4gCiAgICBvcmRlciBvZiBpbmNyZWFzaW5nIHZlcnNpb24KICovCi1zdGF0aWMgdm9pZCBqZmZzMl9hZGRfdG5fdG9fbGlzdChzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKipsaXN0KQorCitzdGF0aWMgdm9pZCBqZmZzMl9hZGRfdG5fdG9fbGlzdChzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCkKIHsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKipwcmV2ID0gbGlzdDsKLQkKLQl3aGlsZSAoKCpwcmV2KSAmJiAoKnByZXYpLT52ZXJzaW9uIDwgdG4tPnZlcnNpb24pIHsKLQkJcHJldiA9ICYoKCpwcmV2KS0+bmV4dCk7Ci0JfQotCXRuLT5uZXh0ID0gKCpwcmV2KTsKLSAgICAgICAgKnByZXYgPSB0bjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmbGlzdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqIHBhcmVudCA9IE5VTEw7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0aGlzOworCisJd2hpbGUgKCpwKSB7CisJCXBhcmVudCA9ICpwOworCQl0aGlzID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8sIHJiKTsKKworCQkvKiBUaGVyZSBtYXkgYWN0dWFsbHkgYmUgYSBjb2xsaXNpb24gaGVyZSwgYnV0IGl0IGRvZXNuJ3QKKwkJICAgYWN0dWFsbHkgbWF0dGVyLiBBcyBsb25nIGFzIHRoZSB0d28gbm9kZXMgd2l0aCB0aGUgc2FtZQorCQkgICB2ZXJzaW9uIGFyZSB0b2dldGhlciwgaXQncyBhbGwgZmluZS4gKi8KKwkJaWYgKHRuLT52ZXJzaW9uIDwgdGhpcy0+dmVyc2lvbikKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKyAgICAgICAgfQorCisJcmJfbGlua19ub2RlKCZ0bi0+cmIsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZ0bi0+cmIsIGxpc3QpOwogfQogCi1zdGF0aWMgdm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvX2xpc3Qoc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKK3N0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm9fbGlzdChzdHJ1Y3QgcmJfcm9vdCAqbGlzdCkKIHsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQ7CisJc3RydWN0IHJiX25vZGUgKnRoaXM7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bjsKIAotCXdoaWxlICh0bikgewotCQluZXh0ID0gdG47Ci0JCXRuID0gdG4tPm5leHQ7Ci0JCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShuZXh0LT5mbik7Ci0JCWpmZnMyX2ZyZWVfdG1wX2Rub2RlX2luZm8obmV4dCk7CisJdGhpcyA9IGxpc3QtPnJiX25vZGU7CisKKwkvKiBOb3cgYXQgYm90dG9tIG9mIHRyZWUgKi8KKwl3aGlsZSAodGhpcykgeworCQlpZiAodGhpcy0+cmJfbGVmdCkKKwkJCXRoaXMgPSB0aGlzLT5yYl9sZWZ0OworCQllbHNlIGlmICh0aGlzLT5yYl9yaWdodCkKKwkJCXRoaXMgPSB0aGlzLT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQl0biA9IHJiX2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbywgcmIpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKHRuLT5mbik7CisJCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRuKTsKKworCQkJdGhpcyA9IHRoaXMtPnJiX3BhcmVudDsKKwkJCWlmICghdGhpcykKKwkJCQlicmVhazsKKworCQkJaWYgKHRoaXMtPnJiX2xlZnQgPT0gJnRuLT5yYikKKwkJCQl0aGlzLT5yYl9sZWZ0ID0gTlVMTDsKKwkJCWVsc2UgaWYgKHRoaXMtPnJiX3JpZ2h0ID09ICZ0bi0+cmIpCisJCQkJdGhpcy0+cmJfcmlnaHQgPSBOVUxMOworCQkJZWxzZSBCVUcoKTsKKwkJfQogCX0KKwlsaXN0LT5yYl9ub2RlID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgamZmczJfZnJlZV9mdWxsX2RpcmVudF9saXN0KHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpCkBAIC0xMDgsMTIgKzE0MSwxMyBAQAogICAgd2l0aCB0aGlzIGlubywgcmV0dXJuaW5nIHRoZSBmb3JtZXIgaW4gb3JkZXIgb2YgdmVyc2lvbiAqLwogCiBpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKLQkJCSAgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCisJCQkgIHN0cnVjdCByYl9yb290ICp0bnAsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmZkcCwKIAkJCSAgdWludDMyX3QgKmhpZ2hlc3RfdmVyc2lvbiwgdWludDMyX3QgKmxhdGVzdF9tY3RpbWUsCiAJCQkgIHVpbnQzMl90ICptY3RpbWVfdmVyKQogewogCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZiwgKnZhbGlkX3JlZjsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCAqcmV0X3RuID0gTlVMTDsKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuOworCXN0cnVjdCByYl9yb290IHJldF90biA9IFJCX1JPT1Q7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZCwgKnJldF9mZCA9IE5VTEw7CiAJdW5pb24gamZmczJfbm9kZV91bmlvbiBub2RlOwogCXNpemVfdCByZXRsZW47CkBAIC0xMjcsNyArMTYxLDcgQEAKIAogCXZhbGlkX3JlZiA9IGpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUoZi0+aW5vY2FjaGUtPm5vZGVzKTsKIAotCWlmICghdmFsaWRfcmVmKQorCWlmICghdmFsaWRfcmVmICYmIChmLT5pbm9jYWNoZS0+aW5vICE9IDEpKQogCQlwcmludGsoS0VSTl9XQVJOSU5HICJFZXAuIE5vIHZhbGlkIG5vZGVzIGZvciBpbm8gIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKIAogCXdoaWxlICh2YWxpZF9yZWYpIHsKQEAgLTQ1MCw3ICs0ODQsNyBAQAogCXJldHVybiAwOwogCiAgZnJlZV9vdXQ6Ci0JamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KHJldF90bik7CisJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KCZyZXRfdG4pOwogCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnRfbGlzdChyZXRfZmQpOwogCXJldHVybiBlcnI7CiB9CkBAIC00ODksOSArNTIzLDEzIEBACiB2b2lkIGpmZnMyX2FkZF9pbm9fY2FjaGUgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKm5ldykKIHsKIAlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKipwcmV2OwotCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9hZGRfaW5vX2NhY2hlOiBBZGQgJXAgKGlubyAjJXUpXG4iLCBuZXcsIG5ldy0+aW5vKSk7CisKIAlzcGluX2xvY2soJmMtPmlub2NhY2hlX2xvY2spOwotCQorCWlmICghbmV3LT5pbm8pCisJCW5ldy0+aW5vID0gKytjLT5oaWdoZXN0X2lubzsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9hZGRfaW5vX2NhY2hlOiBBZGQgJXAgKGlubyAjJXUpXG4iLCBuZXcsIG5ldy0+aW5vKSk7CisKIAlwcmV2ID0gJmMtPmlub2NhY2hlX2xpc3RbbmV3LT5pbm8gJSBJTk9DQUNIRV9IQVNIU0laRV07CiAKIAl3aGlsZSAoKCpwcmV2KSAmJiAoKnByZXYpLT5pbm8gPCBuZXctPmlubykgewpAQCAtNTA2LDcgKzU0NCw3IEBACiB2b2lkIGpmZnMyX2RlbF9pbm9fY2FjaGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqb2xkKQogewogCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKnByZXY7Ci0JRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RlbF9pbm9fY2FjaGU6IERlbCAlcCAoaW5vICMldSlcbiIsIG9sZCwgb2xkLT5pbm8pKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZGVsX2lub19jYWNoZTogRGVsICVwIChpbm8gIyV1KVxuIiwgb2xkLCBvbGQtPmlubykpOwogCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CiAJCiAJcHJldiA9ICZjLT5pbm9jYWNoZV9saXN0W29sZC0+aW5vICUgSU5PQ0FDSEVfSEFTSFNJWkVdOwpAQCAtNTE4LDYgKzU1NiwxNCBAQAogCQkqcHJldiA9IG9sZC0+bmV4dDsKIAl9CiAKKwkvKiBGcmVlIGl0IG5vdyB1bmxlc3MgaXQncyBpbiBSRUFESU5HIG9yIENMRUFSSU5HIHN0YXRlLCB3aGljaAorCSAgIGFyZSB0aGUgdHJhbnNpdGlvbnMgdXBvbiByZWFkX2lub2RlKCkgYW5kIGNsZWFyX2lub2RlKCkuIFRoZQorCSAgIHJlc3Qgb2YgdGhlIHRpbWUgd2Uga25vdyBub2JvZHkgZWxzZSBpcyBsb29raW5nIGF0IGl0LCBhbmQgCisJICAgaWYgaXQncyBoZWxkIGJ5IHJlYWRfaW5vZGUoKSBvciBjbGVhcl9pbm9kZSgpIHRoZXknbGwgZnJlZSBpdAorCSAgIGZvciB0aGVtc2VsdmVzLiAqLworCWlmIChvbGQtPnN0YXRlICE9IElOT19TVEFURV9SRUFESU5HICYmIG9sZC0+c3RhdGUgIT0gSU5PX1NUQVRFX0NMRUFSSU5HKQorCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKG9sZCk7CisKIAlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CiB9CiAKQEAgLTUzMCw3ICs1NzYsNiBAQAogCQl0aGlzID0gYy0+aW5vY2FjaGVfbGlzdFtpXTsKIAkJd2hpbGUgKHRoaXMpIHsKIAkJCW5leHQgPSB0aGlzLT5uZXh0OwotCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZyZWVfaW5vX2NhY2hlczogRnJlZWluZyBpbm8gIyV1IGF0ICVwXG4iLCB0aGlzLT5pbm8sIHRoaXMpKTsKIAkJCWpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUodGhpcyk7CiAJCQl0aGlzID0gbmV4dDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbm9kZWxpc3QuaCBiL2ZzL2pmZnMyL25vZGVsaXN0LmgKaW5kZXggYTQ4NjRkMC4uYjM0YzM5NyAxMDA2NDQKLS0tIGEvZnMvamZmczIvbm9kZWxpc3QuaAorKysgYi9mcy9qZmZzMi9ub2RlbGlzdC5oCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBub2RlbGlzdC5oLHYgMS4xMjYgMjAwNC8xMS8xOSAxNTowNjoyOSBkZWRla2luZCBFeHAgJAorICogJElkOiBub2RlbGlzdC5oLHYgMS4xMzEgMjAwNS8wNy8wNSAyMTowMzowNyBkd213MiBFeHAgJAogICoKICAqLwogCkBAIC0xMzUsNiArMTM1LDcgQEAKICNkZWZpbmUgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQJMwkvKiBDaGVja2VkLCBjbGVhcmVkIGFnYWluICovCiAjZGVmaW5lIElOT19TVEFURV9HQwkJNAkvKiBHQ2luZyBhICdwcmlzdGluZScgbm9kZSAqLwogI2RlZmluZSBJTk9fU1RBVEVfUkVBRElORwk1CS8qIEluIHJlYWRfaW5vZGUoKSAqLworI2RlZmluZSBJTk9fU1RBVEVfQ0xFQVJJTkcJNgkvKiBJbiBjbGVhcl9pbm9kZSgpICovCiAKICNkZWZpbmUgSU5PQ0FDSEVfSEFTSFNJWkUgMTI4CiAKQEAgLTE2MCw3ICsxNjEsNyBAQAogKi8KIHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbwogewotCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqbmV4dDsKKwlzdHJ1Y3QgcmJfbm9kZSByYjsKIAlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm47CiAJdWludDMyX3QgdmVyc2lvbjsKIH07ICAgICAgIApAQCAtMzYyLDYgKzM2MywxOCBAQAogCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKIAlyZXR1cm4gcmJfZW50cnkobm9kZSwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpOwogfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWdfbGFzdChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJvb3QtPnJiX25vZGU7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXdoaWxlKG5vZGUtPnJiX3JpZ2h0KQorCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJcmV0dXJuIHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKTsKK30KKwogI2RlZmluZSByYl9wYXJlbnQocmIpICgocmIpLT5yYl9wYXJlbnQpCiAjZGVmaW5lIGZyYWdfbmV4dChmcmFnKSByYl9lbnRyeShyYl9uZXh0KCYoZnJhZyktPnJiKSwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpCiAjZGVmaW5lIGZyYWdfcHJldihmcmFnKSByYl9lbnRyeShyYl9wcmV2KCYoZnJhZyktPnJiKSwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpCkBAIC0zNzQsNyArMzg3LDcgQEAKIEQyKHZvaWQgamZmczJfcHJpbnRfZnJhZ19saXN0KHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKSk7CiB2b2lkIGpmZnMyX2FkZF9mZF90b19saXN0KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKm5ldywgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqbGlzdCk7CiBpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKLQkJCSAgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCisJCQkgIHN0cnVjdCByYl9yb290ICp0bnAsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKmZkcCwKIAkJCSAgdWludDMyX3QgKmhpZ2hlc3RfdmVyc2lvbiwgdWludDMyX3QgKmxhdGVzdF9tY3RpbWUsCiAJCQkgIHVpbnQzMl90ICptY3RpbWVfdmVyKTsKIHZvaWQgamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljLCBpbnQgc3RhdGUpOwpAQCAtNDYyLDcgKzQ3NSw3IEBACiAvKiBlcmFzZS5jICovCiB2b2lkIGpmZnMyX2VyYXNlX3BlbmRpbmdfYmxvY2tzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBpbnQgY291bnQpOwogCi0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05BTkQKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIC8qIHdidWYuYyAqLwogaW50IGpmZnMyX2ZsdXNoX3didWZfZ2Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IGlubyk7CiBpbnQgamZmczJfZmx1c2hfd2J1Zl9wYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbm9kZW1nbXQuYyBiL2ZzL2pmZnMyL25vZGVtZ210LmMKaW5kZXggMjY1MTEzNS4uYzFkOGI1ZSAxMDA2NDQKLS0tIGEvZnMvamZmczIvbm9kZW1nbXQuYworKysgYi9mcy9qZmZzMi9ub2RlbWdtdC5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBub2RlbWdtdC5jLHYgMS4xMTUgMjAwNC8xMS8yMiAxMTowNzoyMSBkd213MiBFeHAgJAorICogJElkOiBub2RlbWdtdC5jLHYgMS4xMjIgMjAwNS8wNS8wNiAwOTozMDoyNyBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC03NSw3ICs3NSw3IEBACiAJCQlkaXJ0eSA9IGMtPmRpcnR5X3NpemUgKyBjLT5lcmFzaW5nX3NpemUgLSBjLT5ucl9lcmFzaW5nX2Jsb2NrcyAqIGMtPnNlY3Rvcl9zaXplICsgYy0+dW5jaGVja2VkX3NpemU7CiAJCQlpZiAoZGlydHkgPCBjLT5ub3NwY19kaXJ0eV9zaXplKSB7CiAJCQkJaWYgKHByaW8gPT0gQUxMT0NfREVMRVRJT04gJiYgYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+PSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbikgewotCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIGRpcnR5IHNwYWNlIHRvIEdDLCBidXQgaXQncyBhIGRlbGV0aW9uLiBBbGxvd2luZy4uLlxuIik7CisJCQkJCUQxKHByaW50ayhLRVJOX05PVElDRSAiamZmczJfcmVzZXJ2ZV9zcGFjZSgpOiBMb3cgb24gZGlydHkgc3BhY2UgdG8gR0MsIGJ1dCBpdCdzIGEgZGVsZXRpb24uIEFsbG93aW5nLi4uXG4iKSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZGlydHkgc2l6ZSAweCUwOHggKyB1bmNoZWNrZWRfc2l6ZSAweCUwOHggPCBub3NwY19kaXJ0eV9zaXplIDB4JTA4eCwgcmV0dXJuaW5nIC1FTk9TUENcbiIsCkBAIC05OCw3ICs5OCw3IEBACiAJCQlhdmFpbCA9IGMtPmZyZWVfc2l6ZSArIGMtPmRpcnR5X3NpemUgKyBjLT5lcmFzaW5nX3NpemUgKyBjLT51bmNoZWNrZWRfc2l6ZTsKIAkJCWlmICggKGF2YWlsIC8gYy0+c2VjdG9yX3NpemUpIDw9IGJsb2Nrc25lZWRlZCkgewogCQkJCWlmIChwcmlvID09IEFMTE9DX0RFTEVUSU9OICYmIGMtPm5yX2ZyZWVfYmxvY2tzICsgYy0+bnJfZXJhc2luZ19ibG9ja3MgPj0gYy0+cmVzdl9ibG9ja3NfZGVsZXRpb24pIHsKLQkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IExvdyBvbiBwb3NzaWJseSBhdmFpbGFibGUgc3BhY2UsIGJ1dCBpdCdzIGEgZGVsZXRpb24uIEFsbG93aW5nLi4uXG4iKTsKKwkJCQkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IExvdyBvbiBwb3NzaWJseSBhdmFpbGFibGUgc3BhY2UsIGJ1dCBpdCdzIGEgZGVsZXRpb24uIEFsbG93aW5nLi4uXG4iKSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIApAQCAtMzA4LDcgKzMwOCwxMCBAQAogCiAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZigpOiBOb2RlIGF0IDB4JXgoJWQpLCBzaXplIDB4JXhcbiIsIHJlZl9vZmZzZXQobmV3KSwgcmVmX2ZsYWdzKG5ldyksIGxlbikpOwogI2lmIDEKLQlpZiAoamViICE9IGMtPm5leHRibG9jayB8fCAocmVmX29mZnNldChuZXcpKSAhPSBqZWItPm9mZnNldCArIChjLT5zZWN0b3Jfc2l6ZSAtIGplYi0+ZnJlZV9zaXplKSkgeworCS8qIHdlIGNvdWxkIGdldCBzb21lIG9ic29sZXRlIG5vZGVzIGFmdGVyIG5leHRibG9jayB3YXMgcmVmaWxlZAorCSAgIGluIHdidWYuYyAqLworCWlmICgoYy0+bmV4dGJsb2NrIHx8ICFyZWZfb2Jzb2xldGUobmV3KSkKKwkgICAgJiYoamViICE9IGMtPm5leHRibG9jayB8fCByZWZfb2Zmc2V0KG5ldykgIT0gamViLT5vZmZzZXQgKyAoYy0+c2VjdG9yX3NpemUgLSBqZWItPmZyZWVfc2l6ZSkpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImFyZ2guIG5vZGUgYWRkZWQgaW4gd3JvbmcgcGxhY2VcbiIpOwogCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihuZXcpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMzMiw3ICszMzUsNyBAQAogCQljLT51c2VkX3NpemUgKz0gbGVuOwogCX0KIAotCWlmICghamViLT5mcmVlX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSkgeworCWlmICghamViLT5mcmVlX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSAmJiAhSVNESVJUWShqZWItPndhc3RlZF9zaXplKSkgewogCQkvKiBJZiBpdCBsaXZlcyBvbiB0aGUgZGlydHlfbGlzdCwgamZmczJfcmVzZXJ2ZV9zcGFjZSB3aWxsIHB1dCBpdCB0aGVyZSAqLwogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIGNsZWFuX2xpc3QgKGZyZWUgMHglMDh4LCBkaXJ0eSAweCUwOHgsIHVzZWQgMHglMDh4XG4iLAogCQkJICBqZWItPm9mZnNldCwgamViLT5mcmVlX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT51c2VkX3NpemUpKTsKQEAgLTQwMCw3ICs0MDMsNyBAQAogCWplYiA9ICZjLT5ibG9ja3NbYmxvY2tucl07CiAKIAlpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgJiYgIWpmZnMyX2lzX3JlYWRvbmx5KGMpICYmCi0JICAgICEoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX01PVU5USU5HKSkgeworCSAgICAhKGMtPmZsYWdzICYgKEpGRlMyX1NCX0ZMQUdfU0NBTk5JTkcgfCBKRkZTMl9TQl9GTEFHX0JVSUxESU5HKSkpIHsKIAkJLyogSG0uIFRoaXMgbWF5IGNvbmZ1c2Ugc3RhdGljIGxvY2sgYW5hbHlzaXMuIElmIGFueSBvZiB0aGUgYWJvdmUgCiAJCSAgIHRocmVlIGNvbmRpdGlvbnMgaXMgZmFsc2UsIHdlJ3JlIGdvaW5nIHRvIHJldHVybiBmcm9tIHRoaXMgCiAJCSAgIGZ1bmN0aW9uIHdpdGhvdXQgYWN0dWFsbHkgb2JsaXRlcmF0aW5nIGFueSBub2RlcyBvciBmcmVlaW5nCkBAIC00MzQsNyArNDM3LDcgQEAKIAogCS8vIFRha2UgY2FyZSwgdGhhdCB3YXN0ZWQgc2l6ZSBpcyB0YWtlbiBpbnRvIGNvbmNlcm4KIAlpZiAoKGplYi0+ZGlydHlfc2l6ZSB8fCBJU0RJUlRZKGplYi0+d2FzdGVkX3NpemUgKyByZWZfdG90bGVuKGMsIGplYiwgcmVmKSkpICYmIGplYiAhPSBjLT5uZXh0YmxvY2spIHsKLQkJRDEocHJpbnRrKCJEaXJ0eWluZ1xuIikpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGlydHlpbmdcbiIpKTsKIAkJYWRkZWRzaXplID0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CiAJCWplYi0+ZGlydHlfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKIAkJYy0+ZGlydHlfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKQEAgLTQ1Niw3ICs0NTksNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJRDEocHJpbnRrKCJXYXN0aW5nXG4iKSk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJXYXN0aW5nXG4iKSk7CiAJCWFkZGVkc2l6ZSA9IDA7CiAJCWplYi0+d2FzdGVkX3NpemUgKz0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CiAJCWMtPndhc3RlZF9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwkKQEAgLTQ2Nyw4ICs0NzAsOCBAQAogCiAJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKIAotCWlmIChjLT5mbGFncyAmIEpGRlMyX1NCX0ZMQUdfTU9VTlRJTkcpIHsKLQkJLyogTW91bnQgaW4gcHJvZ3Jlc3MuIERvbid0IG11Y2sgYWJvdXQgd2l0aCB0aGUgYmxvY2sKKwlpZiAoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX1NDQU5OSU5HKSB7CisJCS8qIEZsYXNoIHNjYW5uaW5nIGlzIGluIHByb2dyZXNzLiBEb24ndCBtdWNrIGFib3V0IHdpdGggdGhlIGJsb2NrCiAJCSAgIGxpc3RzIGJlY2F1c2UgdGhleSdyZSBub3QgcmVhZHkgeWV0LCBhbmQgZG9uJ3QgYWN0dWFsbHkKIAkJICAgb2JsaXRlcmF0ZSBub2RlcyB0aGF0IGxvb2sgb2Jzb2xldGUuIElmIHRoZXkgd2VyZW4ndCAKIAkJICAgbWFya2VkIG9ic29sZXRlIG9uIHRoZSBmbGFzaCBhdCB0aGUgdGltZSB0aGV5IF9iZWNhbWVfCkBAIC01MjcsNyArNTMwLDggQEAKIAogCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCi0JaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSB8fCBqZmZzMl9pc19yZWFkb25seShjKSkgeworCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgfHwgamZmczJfaXNfcmVhZG9ubHkoYykgfHwKKwkJKGMtPmZsYWdzICYgSkZGUzJfU0JfRkxBR19CVUlMRElORykpIHsKIAkJLyogV2UgZGlkbid0IGxvY2sgdGhlIGVyYXNlX2ZyZWVfc2VtICovCiAJCXJldHVybjsKIAl9CkBAIC01OTAsMTEgKzU5NCw4IEBACiAJCSpwID0gcmVmLT5uZXh0X2luX2lubzsKIAkJcmVmLT5uZXh0X2luX2lubyA9IE5VTEw7CiAKLQkJaWYgKGljLT5ub2RlcyA9PSAodm9pZCAqKWljKSB7Ci0JCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5vY2FjaGUgZm9yIGlubyAjJXUgaXMgYWxsIGdvbmUgbm93LiBGcmVlaW5nXG4iLCBpYy0+aW5vKSk7CisJCWlmIChpYy0+bm9kZXMgPT0gKHZvaWQgKilpYyAmJiBpYy0+bmxpbmsgPT0gMCkKIAkJCWpmZnMyX2RlbF9pbm9fY2FjaGUoYywgaWMpOwotCQkJamZmczJfZnJlZV9pbm9kZV9jYWNoZShpYyk7Ci0JCX0KIAogCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKIAl9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9vcy1saW51eC5oIGIvZnMvamZmczIvb3MtbGludXguaAppbmRleCAwM2IwYWNjLi43YmY3MmUwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9vcy1saW51eC5oCisrKyBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKQEAgLTcsNDEgKzcsMjQgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogb3MtbGludXguaCx2IDEuNTEgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICogJElkOiBvcy1saW51eC5oLHYgMS41NyAyMDA1LzA3LzA2IDEyOjEzOjA5IGR3bXcyIEV4cCAkCiAgKgogICovCiAKICNpZm5kZWYgX19KRkZTMl9PU19MSU5VWF9IX18KICNkZWZpbmUgX19KRkZTMl9PU19MSU5VWF9IX18KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKIC8qIEpGRlMyIHVzZXMgTGludXggbW9kZSBiaXRzIG5hdGl2ZWx5IC0tIG5vIG5lZWQgZm9yIGNvbnZlcnNpb24gKi8KICNkZWZpbmUgb3NfdG9famZmczJfbW9kZSh4KSAoeCkKICNkZWZpbmUgamZmczJfdG9fb3NfbW9kZSh4KSAoeCkKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNSw3MykKLSNkZWZpbmUga3N0YXRmcyBzdGF0ZnMKLSNlbmRpZgotCiBzdHJ1Y3Qga3N0YXRmczsKIHN0cnVjdCBrdmVjOwogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDIpCiAjZGVmaW5lIEpGRlMyX0lOT0RFX0lORk8oaSkgKGxpc3RfZW50cnkoaSwgc3RydWN0IGpmZnMyX2lub2RlX2luZm8sIHZmc19pbm9kZSkpCiAjZGVmaW5lIE9GTklfRURPTklfMlNGRkooZikgICgmKGYpLT52ZnNfaW5vZGUpCiAjZGVmaW5lIEpGRlMyX1NCX0lORk8oc2IpIChzYi0+c19mc19pbmZvKQogI2RlZmluZSBPRk5JX0JTXzJTRkZKKGMpICAoKHN0cnVjdCBzdXBlcl9ibG9jayAqKWMtPm9zX3ByaXYpCi0jZWxpZiBkZWZpbmVkKEpGRlMyX09VVF9PRl9LRVJORUwpCi0jZGVmaW5lIEpGRlMyX0lOT0RFX0lORk8oaSkgKChzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqKSAmKGkpLT51KQotI2RlZmluZSBPRk5JX0VET05JXzJTRkZKKGYpICAoKHN0cnVjdCBpbm9kZSAqKSAoICgoY2hhciAqKWYpIC0gKChjaGFyICopKCYoKHN0cnVjdCBpbm9kZSAqKU5VTEwpLT51KSkgKSApCi0jZGVmaW5lIEpGRlMyX1NCX0lORk8oc2IpICgoc3RydWN0IGpmZnMyX3NiX2luZm8gKikgJihzYiktPnUpCi0jZGVmaW5lIE9GTklfQlNfMlNGRkooYykgICgoc3RydWN0IHN1cGVyX2Jsb2NrICopICggKChjaGFyICopYykgLSAoKGNoYXIgKikoJigoc3RydWN0IHN1cGVyX2Jsb2NrICopTlVMTCktPnUpKSApICkKLSNlbHNlCi0jZGVmaW5lIEpGRlMyX0lOT0RFX0lORk8oaSkgKCZpLT51LmpmZnMyX2kpCi0jZGVmaW5lIE9GTklfRURPTklfMlNGRkooZikgICgoc3RydWN0IGlub2RlICopICggKChjaGFyICopZikgLSAoKGNoYXIgKikoJigoc3RydWN0IGlub2RlICopTlVMTCktPnUpKSApICkKLSNkZWZpbmUgSkZGUzJfU0JfSU5GTyhzYikgKCZzYi0+dS5qZmZzMl9zYikKLSNkZWZpbmUgT0ZOSV9CU18yU0ZGSihjKSAgKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgKCAoKGNoYXIgKiljKSAtICgoY2hhciAqKSgmKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKilOVUxMKS0+dSkpICkgKQotI2VuZGlmCiAKIAogI2RlZmluZSBKRkZTMl9GX0lfU0laRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9zaXplKQpAQCAtNDksMjggKzMyLDE0IEBACiAjZGVmaW5lIEpGRlMyX0ZfSV9VSUQoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfdWlkKQogI2RlZmluZSBKRkZTMl9GX0lfR0lEKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2dpZCkKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwxKQogI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKGltaW5vcihPRk5JX0VET05JXzJTRkZKKGYpKSkKICNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChpbWFqb3IoT0ZOSV9FRE9OSV8yU0ZGSihmKSkpCi0jZWxzZQotI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKE1JTk9SKHRvX2tkZXZfdChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3JkZXYpKSkKLSNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChNQUpPUih0b19rZGV2X3QoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9yZGV2KSkpCi0jZW5kaWYKIAotLyogVXJnaC4gVGhlIHRoaW5ncyB3ZSBkbyB0byBrZWVwIHRoZSAyLjQgYnVpbGQgd29ya2luZyAqLwotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0NykKICNkZWZpbmUgSVRJTUUoc2VjKSAoKHN0cnVjdCB0aW1lc3BlYyl7c2VjLCAwfSkKICNkZWZpbmUgSV9TRUModHYpICgodHYpLnR2X3NlYykKICNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lLnR2X3NlYykKICNkZWZpbmUgSkZGUzJfRl9JX01USU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX210aW1lLnR2X3NlYykKICNkZWZpbmUgSkZGUzJfRl9JX0FUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2F0aW1lLnR2X3NlYykKLSNlbHNlCi0jZGVmaW5lIElUSU1FKHgpICh4KQotI2RlZmluZSBJX1NFQyh4KSAoeCkKLSNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lKQotI2RlZmluZSBKRkZTMl9GX0lfTVRJTUUoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfbXRpbWUpCi0jZGVmaW5lIEpGRlMyX0ZfSV9BVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9hdGltZSkKLSNlbmRpZgogCiAjZGVmaW5lIHNsZWVwX29uX3NwaW51bmxvY2sod3EsIHMpCQkJCVwKIAlkbyB7CQkJCQkJCVwKQEAgLTg0LDIzICs1MywyMSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgamZmczJfaW5pdF9pbm9kZV9pbmZvKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQogewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwyKQogCWYtPmhpZ2hlc3RfdmVyc2lvbiA9IDA7CiAJZi0+ZnJhZ3RyZWUgPSBSQl9ST09UOwogCWYtPm1ldGFkYXRhID0gTlVMTDsKIAlmLT5kZW50cyA9IE5VTEw7CiAJZi0+ZmxhZ3MgPSAwOwogCWYtPnVzZXJjb21wciA9IDA7Ci0jZWxzZQotCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKLQlpbml0X01VVEVYX0xPQ0tFRCgmZi0+c2VtKTsKLSNlbmRpZgogfQogCisKICNkZWZpbmUgamZmczJfaXNfcmVhZG9ubHkoYykgKE9GTklfQlNfMlNGRkooYyktPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAKLSNpZiAoIWRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgJiYgIWRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MpCisjaWZuZGVmIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUgorI2RlZmluZSBTRUNUT1JfQUREUih4KSAoICgodW5zaWduZWQgbG9uZykoeCkgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSApCiAjZGVmaW5lIGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICgxKQorI2RlZmluZSBqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpICgwKQogI2RlZmluZSBqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykgKDApCiAjZGVmaW5lIGpmZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoYyxqZWIpICgtRUlPKQogCkBAIC0xMTYsMTEgKzgzLDE0IEBACiAjZGVmaW5lIGpmZnMyX3didWZfdGltZW91dCBOVUxMCiAjZGVmaW5lIGpmZnMyX3didWZfcHJvY2VzcyBOVUxMCiAjZGVmaW5lIGpmZnMyX25vcl9lY2MoYykgKDApCisjZGVmaW5lIGpmZnMyX2RhdGFmbGFzaChjKSAoMCkKICNkZWZpbmUgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChjKSAoMCkKICNkZWZpbmUgamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpIGRvIHt9IHdoaWxlICgwKQogCiAjZWxzZSAvKiBOQU5EIGFuZC9vciBFQ0MnZCBOT1Igc3VwcG9ydCBwcmVzZW50ICovCiAKKyNkZWZpbmUgamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSAoYy0+d2J1ZiAhPSBOVUxMKQorI2RlZmluZSBTRUNUT1JfQUREUih4KSAoICgodW5zaWduZWQgbG9uZykoeCkgLyAodW5zaWduZWQgbG9uZykoYy0+c2VjdG9yX3NpemUpKSAqIGMtPnNlY3Rvcl9zaXplICkKICNkZWZpbmUgamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgKChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmICEoYy0+bXRkLT5mbGFncyAmIE1URF9FQ0MpKSB8fCBjLT5tdGQtPnR5cGUgPT0gTVREX1JBTSkKICNkZWZpbmUgamZmczJfY2xlYW5tYXJrZXJfb29iKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05BTkRGTEFTSCkKIApAQCAtMTQyLDE2ICsxMTIsMTYgQEAKIGludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CiBpbnQgamZmczJfbmFuZF9mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CiB2b2lkIGpmZnMyX25hbmRfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Ci0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKwogI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmIChjLT5tdGQtPmZsYWdzICYgTVREX0VDQykpCiBpbnQgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CiB2b2lkIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Ci0jZWxzZQotI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpICgwKQotI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKGMpICgwKQotI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX2NsZWFudXAoYykgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYgLyogTk9SIEVDQyAqLwotI2VuZGlmIC8qIE5BTkQgKi8KKworI2RlZmluZSBqZmZzMl9kYXRhZmxhc2goYykgKGMtPm10ZC0+dHlwZSA9PSBNVERfREFUQUZMQVNIKQoraW50IGpmZnMyX2RhdGFmbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Cit2b2lkIGpmZnMyX2RhdGFmbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKKworI2VuZGlmIC8qIFdSSVRFQlVGRkVSICovCiAKIC8qIGVyYXNlLmMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9yZWFkLmMgYi9mcy9qZmZzMi9yZWFkLmMKaW5kZXggZWI0OTNkYy4uYzdmOTA2OCAxMDA2NDQKLS0tIGEvZnMvamZmczIvcmVhZC5jCisrKyBiL2ZzL2pmZnMyL3JlYWQuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogcmVhZC5jLHYgMS4zOCAyMDA0LzExLzE2IDIwOjM2OjEyIGR3bXcyIEV4cCAkCisgKiAkSWQ6IHJlYWQuYyx2IDEuMzkgMjAwNS8wMy8wMSAxMDozNDowMyBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC0yMTQsMzMgKzIxNCwzIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIENvcmUgZnVuY3Rpb24gdG8gcmVhZCBzeW1saW5rIHRhcmdldC4gKi8KLWNoYXIgKmpmZnMyX2dldGxpbmsoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQotewotCWNoYXIgKmJ1ZjsKLQlpbnQgcmV0OwotCi0JZG93bigmZi0+c2VtKTsKLQotCWlmICghZi0+bWV0YWRhdGEpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBtZXRhZGF0YSBmb3Igc3ltbGluayBpbm9kZSAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOwotCQl1cCgmZi0+c2VtKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCWJ1ZiA9IGttYWxsb2MoZi0+bWV0YWRhdGEtPnNpemUrMSwgR0ZQX1VTRVIpOwotCWlmICghYnVmKSB7Ci0JCXVwKCZmLT5zZW0pOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0JYnVmW2YtPm1ldGFkYXRhLT5zaXplXT0wOwotCi0JcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgYnVmLCAwLCBmLT5tZXRhZGF0YS0+c2l6ZSk7Ci0KLQl1cCgmZi0+c2VtKTsKLQotCWlmIChyZXQpIHsKLQkJa2ZyZWUoYnVmKTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQl9Ci0JcmV0dXJuIGJ1ZjsKLX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jIGIvZnMvamZmczIvcmVhZGlub2RlLmMKaW5kZXggYWNhNGEwYi4uMDgxNjU2YyAxMDA2NDQKLS0tIGEvZnMvamZmczIvcmVhZGlub2RlLmMKKysrIGIvZnMvamZmczIvcmVhZGlub2RlLmMKQEAgLTcsNyArNyw3IEBACiAgKgogICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KICAqCi0gKiAkSWQ6IHJlYWRpbm9kZS5jLHYgMS4xMTcgMjAwNC8xMS8yMCAxODowNjo1NCBkd213MiBFeHAgJAorICogJElkOiByZWFkaW5vZGUuYyx2IDEuMTIwIDIwMDUvMDcvMDUgMjE6MDM6MDcgZHdtdzIgRXhwICQKICAqCiAgKi8KIApAQCAtNTAwLDcgKzUwMCw5IEBACiAJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAogCQkJCQlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpsYXRlc3Rfbm9kZSkKIHsKLQlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuX2xpc3QsICp0bjsKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuID0gTlVMTDsKKwlzdHJ1Y3QgcmJfcm9vdCB0bl9saXN0OworCXN0cnVjdCByYl9ub2RlICpyYiwgKnJlcGxfcmI7CiAJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZF9saXN0OwogCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiA9IE5VTEw7CiAJdWludDMyX3QgY3JjOwpAQCAtNTIyLDkgKzUyNCwxMCBAQAogCX0KIAlmLT5kZW50cyA9IGZkX2xpc3Q7CiAKLQl3aGlsZSAodG5fbGlzdCkgewotCQl0biA9IHRuX2xpc3Q7CisJcmIgPSByYl9maXJzdCgmdG5fbGlzdCk7CiAKKwl3aGlsZSAocmIpIHsKKwkJdG4gPSByYl9lbnRyeShyYiwgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvLCByYik7CiAJCWZuID0gdG4tPmZuOwogCiAJCWlmIChmLT5tZXRhZGF0YSkgewpAQCAtNTU2LDcgKzU1OSwzMCBAQAogCQkJbWRhdGFfdmVyID0gdG4tPnZlcnNpb247CiAJCX0KIAluZXh0X3RuOgotCQl0bl9saXN0ID0gdG4tPm5leHQ7CisJCUJVR19PTihyYi0+cmJfbGVmdCk7CisJCXJlcGxfcmIgPSBOVUxMOworCQlpZiAocmItPnJiX3BhcmVudCAmJiByYi0+cmJfcGFyZW50LT5yYl9sZWZ0ID09IHJiKSB7CisJCQkvKiBXZSB3ZXJlIHRoZW4gbGVmdC1oYW5kIGNoaWxkIG9mIG91ciBwYXJlbnQuIFdlIG5lZWQKKwkJCSAgIHRvIG1vdmUgb3VyIG93biByaWdodC1oYW5kIGNoaWxkIGludG8gb3VyIHBsYWNlLiAqLworCQkJcmVwbF9yYiA9IHJiLT5yYl9yaWdodDsKKwkJCWlmIChyZXBsX3JiKQorCQkJCXJlcGxfcmItPnJiX3BhcmVudCA9IHJiLT5yYl9wYXJlbnQ7CisJCX0gZWxzZQorCQkJcmVwbF9yYiA9IE5VTEw7CisKKwkJcmIgPSByYl9uZXh0KHJiKTsKKworCQkvKiBSZW1vdmUgdGhlIHNwZW50IHRuIGZyb20gdGhlIHRyZWU7IGRvbid0IGJvdGhlciByZWJhbGFuY2luZworCQkgICBidXQgcHV0IG91ciByaWdodC1oYW5kIGNoaWxkIGluIG91ciBvd24gcGxhY2UuICovCisJCWlmICh0bi0+cmIucmJfcGFyZW50KSB7CisJCQlpZiAodG4tPnJiLnJiX3BhcmVudC0+cmJfbGVmdCA9PSAmdG4tPnJiKQorCQkJCXRuLT5yYi5yYl9wYXJlbnQtPnJiX2xlZnQgPSByZXBsX3JiOworCQkJZWxzZSBpZiAodG4tPnJiLnJiX3BhcmVudC0+cmJfcmlnaHQgPT0gJnRuLT5yYikKKwkJCQl0bi0+cmIucmJfcGFyZW50LT5yYl9yaWdodCA9IHJlcGxfcmI7CisJCQllbHNlIEJVRygpOworCQl9IGVsc2UgaWYgKHRuLT5yYi5yYl9yaWdodCkKKwkJCXRuLT5yYi5yYl9yaWdodC0+cmJfcGFyZW50ID0gTlVMTDsKKwogCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRuKTsKIAl9CiAJRDEoamZmczJfc2FuaXR5Y2hlY2tfZnJhZ3RyZWUoZikpOwpAQCAtNjIzLDYgKzY0OSw0MCBAQAogCQkgICBjYXNlLiAqLwogCQlpZiAoIWplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5pc2l6ZSkpCiAJCQlsYXRlc3Rfbm9kZS0+aXNpemUgPSBsYXRlc3Rfbm9kZS0+ZHNpemU7CisKKwkJaWYgKGYtPmlub2NhY2hlLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tJTkcpIHsKKwkJCS8qIFN5bWxpbmsncyBpbm9kZSBkYXRhIGlzIHRoZSB0YXJnZXQgcGF0aC4gUmVhZCBpdCBhbmQKKwkJCSAqIGtlZXAgaW4gUkFNIHRvIGZhY2lsaXRhdGUgcXVpY2sgZm9sbG93IHN5bWxpbmsgb3BlcmF0aW9uLgorCQkJICogV2UgdXNlIGYtPmRlbnRzIGZpZWxkIHRvIHN0b3JlIHRoZSB0YXJnZXQgcGF0aCwgd2hpY2gKKwkJCSAqIGlzIHNvbWV3aGF0IHVnbHkuICovCisJCQlmLT5kZW50cyA9IGttYWxsb2MoamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmNzaXplKSArIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCFmLT5kZW50cykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IGFsbG9jYXRlICVkIGJ5dGVzIG9mIG1lbW9yeSAiCisJCQkJCQkiZm9yIHRoZSBzeW1saW5rIHRhcmdldCBwYXRoIGNhY2hlXG4iLAorCQkJCQkJamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmNzaXplKSk7CisJCQkJdXAoJmYtPnNlbSk7CisJCQkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQkKKwkJCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgcmVmX29mZnNldChmbi0+cmF3KSArIHNpemVvZigqbGF0ZXN0X25vZGUpLAorCQkJCQkJamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmNzaXplKSwgJnJldGxlbiwgKGNoYXIgKilmLT5kZW50cyk7CisJCQkKKwkJCWlmIChyZXQgIHx8IHJldGxlbiAhPSBqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+Y3NpemUpKSB7CisJCQkJaWYgKHJldGxlbiAhPSBqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+Y3NpemUpKQorCQkJCQlyZXQgPSAtRUlPOworCQkJCWtmcmVlKGYtPmRlbnRzKTsKKwkJCQlmLT5kZW50cyA9IE5VTEw7CisJCQkJdXAoJmYtPnNlbSk7CisJCQkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CisJCQkJcmV0dXJuIC1yZXQ7CisJCQl9CisKKwkJCSgoY2hhciAqKWYtPmRlbnRzKVtqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+Y3NpemUpXSA9ICdcMCc7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBzeW1saW5rJ3MgdGFyZ2V0ICclcycgY2FjaGVkXG4iLAorCQkJCQkJKGNoYXIgKilmLT5kZW50cykpOworCQl9CisJCQogCQkvKiBmYWxsIHRocm91Z2guLi4gKi8KIAogCWNhc2UgU19JRkJMSzoKQEAgLTY3Miw2ICs3MzIsOSBAQAogCWRvd24oJmYtPnNlbSk7CiAJZGVsZXRlZCA9IGYtPmlub2NhY2hlICYmICFmLT5pbm9jYWNoZS0+bmxpbms7CiAKKwlpZiAoZi0+aW5vY2FjaGUgJiYgZi0+aW5vY2FjaGUtPnN0YXRlICE9IElOT19TVEFURV9DSEVDS0lORykKKwkJamZmczJfc2V0X2lub2NhY2hlX3N0YXRlKGMsIGYtPmlub2NhY2hlLCBJTk9fU1RBVEVfQ0xFQVJJTkcpOworCiAJaWYgKGYtPm1ldGFkYXRhKSB7CiAJCWlmIChkZWxldGVkKQogCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOwpAQCAtNjgwLDE2ICs3NDMsMjcgQEAKIAogCWpmZnMyX2tpbGxfZnJhZ3RyZWUoJmYtPmZyYWd0cmVlLCBkZWxldGVkP2M6TlVMTCk7CiAKLQlmZHMgPSBmLT5kZW50czsKKwkvKiBGb3Igc3ltbGluayBpbm9kZXMgd2UgdXMgZi0+ZGVudHMgdG8gc3RvcmUgdGhlIHRhcmdldCBwYXRoIG5hbWUgKi8KKwlpZiAoU19JU0xOSyhPRk5JX0VET05JXzJTRkZKKGYpLT5pX21vZGUpKSB7CisJCWlmIChmLT5kZW50cykgeworCQkJa2ZyZWUoZi0+ZGVudHMpOworCQkJZi0+ZGVudHMgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJZmRzID0gZi0+ZGVudHM7CiAKLQl3aGlsZShmZHMpIHsKLQkJZmQgPSBmZHM7Ci0JCWZkcyA9IGZkLT5uZXh0OwotCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwkJd2hpbGUoZmRzKSB7CisJCQlmZCA9IGZkczsKKwkJCWZkcyA9IGZkLT5uZXh0OworCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCX0KIAl9CiAKLQlpZiAoZi0+aW5vY2FjaGUgJiYgZi0+aW5vY2FjaGUtPnN0YXRlICE9IElOT19TVEFURV9DSEVDS0lORykKKwlpZiAoZi0+aW5vY2FjaGUgJiYgZi0+aW5vY2FjaGUtPnN0YXRlICE9IElOT19TVEFURV9DSEVDS0lORykgewogCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DSEVDS0VEQUJTRU5UKTsKKwkJaWYgKGYtPmlub2NhY2hlLT5ub2RlcyA9PSAodm9pZCAqKWYtPmlub2NhY2hlKQorCQkJamZmczJfZGVsX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CisJfQogCiAJdXAoJmYtPnNlbSk7CiB9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zY2FuLmMgYi9mcy9qZmZzMi9zY2FuLmMKaW5kZXggZGVkNTM1OC4uYjYzMTYwZiAxMDA2NDQKLS0tIGEvZnMvamZmczIvc2Nhbi5jCisrKyBiL2ZzL2pmZnMyL3NjYW4uYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogc2Nhbi5jLHYgMS4xMTUgMjAwNC8xMS8xNyAxMjo1OTowOCBkZWRla2luZCBFeHAgJAorICogJElkOiBzY2FuLmMsdiAxLjExOSAyMDA1LzAyLzE3IDE3OjUxOjEzIGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlICJub2RlbGlzdC5oIgogCi0jZGVmaW5lIEVNUFRZX1NDQU5fU0laRSAxMDI0CisjZGVmaW5lIERFRkFVTFRfRU1QVFlfU0NBTl9TSVpFIDEwMjQKIAogI2RlZmluZSBESVJUWV9TUEFDRSh4KSBkbyB7IHR5cGVvZih4KSBfeCA9ICh4KTsgXAogCQljLT5mcmVlX3NpemUgLT0gX3g7IGMtPmRpcnR5X3NpemUgKz0gX3g7IFwKQEAgLTY4LDEzICs2OCwyMSBAQAogc3RhdGljIGlubGluZSBpbnQgbWluX2ZyZWUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCiB7CiAJdWludDMyX3QgbWluID0gMiAqIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKTsKLSNpZiBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OQU5EIHx8IGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmIG1pbiA8IGMtPndidWZfcGFnZXNpemUpCiAJCXJldHVybiBjLT53YnVmX3BhZ2VzaXplOwogI2VuZGlmCiAJcmV0dXJuIG1pbjsKIAogfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IEVNUFRZX1NDQU5fU0laRSh1aW50MzJfdCBzZWN0b3Jfc2l6ZSkgeworCWlmIChzZWN0b3Jfc2l6ZSA8IERFRkFVTFRfRU1QVFlfU0NBTl9TSVpFKQorCQlyZXR1cm4gc2VjdG9yX3NpemU7CisJZWxzZQorCQlyZXR1cm4gREVGQVVMVF9FTVBUWV9TQ0FOX1NJWkU7Cit9CisKIGludCBqZmZzMl9zY2FuX21lZGl1bShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKIHsKIAlpbnQgaSwgcmV0OwpAQCAtMjIwLDcgKzIyOCw3IEBACiAJCWMtPmRpcnR5X3NpemUgLT0gYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplOwogCQljLT5uZXh0YmxvY2stPmRpcnR5X3NpemUgPSAwOwogCX0KLSNpZiBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OQU5EIHx8IGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmIGMtPm5leHRibG9jayAmJiAoYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUgJiAoYy0+d2J1Zl9wYWdlc2l6ZS0xKSkpIHsKIAkJLyogSWYgd2UncmUgZ29pbmcgdG8gc3RhcnQgd3JpdGluZyBpbnRvIGEgYmxvY2sgd2hpY2ggYWxyZWFkeSAKIAkJICAgY29udGFpbnMgZGF0YSwgYW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgaXNuJ3QgcGFnZS1hbGlnbmVkLApAQCAtMjg2LDcgKzI5NCw3IEBACiAJdWludDMyX3QgaGRyX2NyYywgYnVmX29mcywgYnVmX2xlbjsKIAlpbnQgZXJyOwogCWludCBub2lzZSA9IDA7Ci0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05BTkQKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAlpbnQgY2xlYW5tYXJrZXJmb3VuZCA9IDA7CiAjZW5kaWYKIApAQCAtMjk1LDcgKzMwMyw3IEBACiAKIAlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2Nhbl9lcmFzZWJsb2NrKCk6IFNjYW5uaW5nIGJsb2NrIGF0IDB4JXhcbiIsIG9mcykpOwogCi0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05BTkQKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CiAJCWludCByZXQgPSBqZmZzMl9jaGVja19uYW5kX2NsZWFubWFya2VyKGMsIGplYik7CiAJCUQyKHByaW50ayhLRVJOX05PVElDRSAiamZmc19jaGVja19uYW5kX2NsZWFubWFya2VyIHJldHVybmVkICVkXG4iLHJldCkpOwpAQCAtMzE2LDcgKzMyNCw3IEBACiAJaWYgKCFidWZfc2l6ZSkgewogCQlidWZfbGVuID0gYy0+c2VjdG9yX3NpemU7CiAJfSBlbHNlIHsKLQkJYnVmX2xlbiA9IEVNUFRZX1NDQU5fU0laRTsKKwkJYnVmX2xlbiA9IEVNUFRZX1NDQU5fU0laRShjLT5zZWN0b3Jfc2l6ZSk7CiAJCWVyciA9IGpmZnMyX2ZpbGxfc2Nhbl9idWYoYywgYnVmLCBidWZfb2ZzLCBidWZfbGVuKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CkBAIC0zMjYsMTEgKzMzNCwxMSBAQAogCW9mcyA9IDA7CiAKIAkvKiBTY2FuIG9ubHkgNEtpQiBvZiAweEZGIGJlZm9yZSBkZWNsYXJpbmcgaXQncyBlbXB0eSAqLwotCXdoaWxlKG9mcyA8IEVNUFRZX1NDQU5fU0laRSAmJiAqKHVpbnQzMl90ICopKCZidWZbb2ZzXSkgPT0gMHhGRkZGRkZGRikKKwl3aGlsZShvZnMgPCBFTVBUWV9TQ0FOX1NJWkUoYy0+c2VjdG9yX3NpemUpICYmICoodWludDMyX3QgKikoJmJ1ZltvZnNdKSA9PSAweEZGRkZGRkZGKQogCQlvZnMgKz0gNDsKIAotCWlmIChvZnMgPT0gRU1QVFlfU0NBTl9TSVpFKSB7Ci0jaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05BTkQKKwlpZiAob2ZzID09IEVNUFRZX1NDQU5fU0laRShjLT5zZWN0b3Jfc2l6ZSkpIHsKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIKIAkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgewogCQkJLyogc2NhbiBvb2IsIHRha2UgY2FyZSBvZiBjbGVhbm1hcmtlciAqLwogCQkJaW50IHJldCA9IGpmZnMyX2NoZWNrX29vYl9lbXB0eShjLCBqZWIsIGNsZWFubWFya2VyZm91bmQpOwpAQCAtMzQzLDcgKzM1MSwxMCBAQAogCQl9CiAjZW5kaWYKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eCBpcyBlbXB0eSAoZXJhc2VkKVxuIiwgamViLT5vZmZzZXQpKTsKLQkJcmV0dXJuIEJMS19TVEFURV9BTExGRjsJLyogT0sgdG8gZXJhc2UgaWYgYWxsIGJsb2NrcyBhcmUgbGlrZSB0aGlzICovCisJCWlmIChjLT5jbGVhbm1hcmtlcl9zaXplID09IDApCisJCQlyZXR1cm4gQkxLX1NUQVRFX0NMRUFOTUFSS0VSOwkvKiBkb24ndCBib3RoZXIgd2l0aCByZS1lcmFzZSAqLworCQllbHNlCisJCQlyZXR1cm4gQkxLX1NUQVRFX0FMTEZGOwkvKiBPSyB0byBlcmFzZSBpZiBhbGwgYmxvY2tzIGFyZSBsaWtlIHRoaXMgKi8KIAl9CiAJaWYgKG9mcykgewogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRnJlZSBzcGFjZSBhdCAlMDh4IGVuZHMgYXQgJTA4eFxuIiwgamViLT5vZmZzZXQsCkBAIC00MjIsOCArNDMzLDggQEAKIAkJCS8qIElmIHdlJ3JlIG9ubHkgY2hlY2tpbmcgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrIHdpdGggYSBjbGVhbm1hcmtlciwKIAkJCSAgIGJhaWwgbm93ICovCiAJCQlpZiAoYnVmX29mcyA9PSBqZWItPm9mZnNldCAmJiBqZWItPnVzZWRfc2l6ZSA9PSBQQUQoYy0+Y2xlYW5tYXJrZXJfc2l6ZSkgJiYgCi0JCQkgICAgYy0+Y2xlYW5tYXJrZXJfc2l6ZSAmJiAhamViLT5kaXJ0eV9zaXplICYmICFqZWItPmZpcnN0X25vZGUtPm5leHRfaW5faW5vKSB7Ci0JCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIiVkIGJ5dGVzIGF0IHN0YXJ0IG9mIGJsb2NrIHNlZW1zIGNsZWFuLi4uIGFzc3VtaW5nIGFsbCBjbGVhblxuIiwgRU1QVFlfU0NBTl9TSVpFKSk7CisJCQkgICAgYy0+Y2xlYW5tYXJrZXJfc2l6ZSAmJiAhamViLT5kaXJ0eV9zaXplICYmICFqZWItPmZpcnN0X25vZGUtPm5leHRfcGh5cykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIlZCBieXRlcyBhdCBzdGFydCBvZiBibG9jayBzZWVtcyBjbGVhbi4uLiBhc3N1bWluZyBhbGwgY2xlYW5cbiIsIEVNUFRZX1NDQU5fU0laRShjLT5zZWN0b3Jfc2l6ZSkpKTsKIAkJCQlyZXR1cm4gQkxLX1NUQVRFX0NMRUFOTUFSS0VSOwogCQkJfQogCkBAIC02MTgsNyArNjI5LDcgQEAKIAl9CiAKIAlpZiAoKGplYi0+dXNlZF9zaXplICsgamViLT51bmNoZWNrZWRfc2l6ZSkgPT0gUEFEKGMtPmNsZWFubWFya2VyX3NpemUpICYmICFqZWItPmRpcnR5X3NpemUgCi0JCSYmICghamViLT5maXJzdF9ub2RlIHx8ICFqZWItPmZpcnN0X25vZGUtPm5leHRfaW5faW5vKSApCisJCSYmICghamViLT5maXJzdF9ub2RlIHx8ICFqZWItPmZpcnN0X25vZGUtPm5leHRfcGh5cykgKQogCQlyZXR1cm4gQkxLX1NUQVRFX0NMRUFOTUFSS0VSOwogCQkKIAkvKiBtb3ZlIGJsb2NrcyB3aXRoIG1heCA0IGJ5dGUgZGlydHkgc3BhY2UgdG8gY2xlYW5saXN0ICovCQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggNmIyYTQ0MS4uMmNmMTRjZiAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBzdXBlci5jLHYgMS4xMDQgMjAwNC8xMS8yMyAxNTozNzozMSBnbGVpeG5lciBFeHAgJAorICogJElkOiBzdXBlci5jLHYgMS4xMDYgMjAwNS8wNS8xOCAxMTozNzoyNSBkZWRla2luZCBFeHAgJAogICoKICAqLwogCkBAIC0yNzAsOCArMjcwLDYgQEAKIAogCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMjogamZmczJfcHV0X3N1cGVyKClcbiIpKTsKIAotCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKLQkJamZmczJfc3RvcF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKGMpOwogCWRvd24oJmMtPmFsbG9jX3NlbSk7CiAJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CiAJdXAoJmMtPmFsbG9jX3NlbSk7CkBAIC0yOTIsNiArMjkwLDggQEAKIHN0YXRpYyB2b2lkIGpmZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJamZmczJfc3RvcF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKGMpOwogCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOwogCXB1dF9tdGRfZGV2aWNlKGMtPm10ZCk7CiAJa2ZyZWUoYyk7CkBAIC0zMDksNyArMzA5LDcgQEAKIAlpbnQgcmV0OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiSkZGUzIgdmVyc2lvbiAyLjIuIgotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJICAgICAgICIgKE5BTkQpIgogI2VuZGlmCiAJICAgICAgICIgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N5bWxpbmsuYyBiL2ZzL2pmZnMyL3N5bWxpbmsuYwppbmRleCA3YjE4MjBkLi42NWFiNmIwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9zeW1saW5rLmMKKysrIGIvZnMvamZmczIvc3ltbGluay5jCkBAIC03LDcgKzcsNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiBzeW1saW5rLmMsdiAxLjE0IDIwMDQvMTEvMTYgMjA6MzY6MTIgZHdtdzIgRXhwICQKKyAqICRJZDogc3ltbGluay5jLHYgMS4xNiAyMDA1LzAzLzAxIDEwOjUwOjQ4IGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTE5LDI3ICsxOSw0NSBAQAogI2luY2x1ZGUgIm5vZGVsaXN0LmgiCiAKIHN0YXRpYyBpbnQgamZmczJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7Ci1zdGF0aWMgdm9pZCBqZmZzMl9wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0KIHsJCiAJLnJlYWRsaW5rID0JZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsgPQlqZmZzMl9mb2xsb3dfbGluaywKLQkucHV0X2xpbmsgPQlqZmZzMl9wdXRfbGluaywKIAkuc2V0YXR0ciA9CWpmZnMyX3NldGF0dHIKIH07CiAKIHN0YXRpYyBpbnQgamZmczJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQl1bnNpZ25lZCBjaGFyICpidWY7Ci0JYnVmID0gamZmczJfZ2V0bGluayhKRkZTMl9TQl9JTkZPKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYiksIEpGRlMyX0lOT0RFX0lORk8oZGVudHJ5LT5kX2lub2RlKSk7Ci0JbmRfc2V0X2xpbmsobmQsIGJ1Zik7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKGRlbnRyeS0+ZF9pbm9kZSk7CisJCisJLyoKKwkgKiBXZSBkb24ndCBhY3F1aXJlIHRoZSBmLT5zZW0gbXV0ZXggaGVyZSBzaW5jZSB0aGUgb25seSBkYXRhIHdlCisJICogdXNlIGlzIGYtPmRlbnRzIHdoaWNoIGluIGNhc2Ugb2YgdGhlIHN5bWxpbmsgaW5vZGUgcG9pbnRzIHRvIHRoZQorCSAqIHN5bWxpbmsncyB0YXJnZXQgcGF0aC4KKwkgKgorCSAqIDEuIElmIHdlIGFyZSBoZXJlIHRoZSBpbm9kZSBoYXMgYWxyZWFkeSBidWlsdCBhbmQgZi0+ZGVudHMgaGFzCisJICogdG8gcG9pbnQgdG8gdGhlIHRhcmdldCBwYXRoLgorCSAqIDIuIE5vYm9keSB1c2VzIGYtPmRlbnRzIChpZiB0aGUgaW5vZGUgaXMgc3ltbGluaydzIGlub2RlKS4gVGhlCisJICogZXhjZXB0aW9uIGlzIGlub2RlIGZyZWVpbmcgZnVuY3Rpb24gd2hpY2ggZnJlZXMgZi0+ZGVudHMuIEJ1dAorCSAqIGl0IGNhbid0IGJlIGNhbGxlZCB3aGlsZSB3ZSBhcmUgaGVyZSBhbmQgYmVmb3JlIFZGUyBoYXMKKwkgKiBzdG9wcGVkIHVzaW5nIG91ciBmLT5kZW50cyBzdHJpbmcgd2hpY2ggd2UgcHJvdmlkZSBieSBtZWFucyBvZgorCSAqIG5kX3NldF9saW5rKCkgY2FsbC4KKwkgKi8KKwkKKwlpZiAoIWYtPmRlbnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmczJfZm9sbG93X2xpbmsoKTogY2FuJ3QgZmluZCBzeW1saW5rIHRhZXJnZXRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZvbGxvd19saW5rKCk6IHRhcmdldCBwYXRoIGlzICclcydcbiIsIChjaGFyICopIGYtPmRlbnRzKSk7CisKKwluZF9zZXRfbGluayhuZCwgKGNoYXIgKilmLT5kZW50cyk7CisJCisJLyoKKwkgKiBXZSB1bmxvY2sgdGhlIGYtPnNlbSBtdXRleCBidXQgVkZTIHdpbGwgdXNlIHRoZSBmLT5kZW50cyBzdHJpbmcuIFRoaXMgaXMgc2FmZQorCSAqIHNpbmNlIHRoZSBvbmx5IHdheSB0aGF0IG1heSBjYXVzZSBmLT5kZW50cyB0byBiZSBjaGFuZ2VkIGlzIGlwdXQoKSBvcGVyYXRpb24uCisJICogQnV0IFZGUyB3aWxsIG5vdCB1c2UgZi0+ZGVudHMgYWZ0ZXIgaXB1dCgpIGhhcyBiZWVuIGNhbGxlZC4KKwkgKi8KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgamZmczJfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQljaGFyICpzID0gbmRfZ2V0X2xpbmsobmQpOwotCWlmICghSVNfRVJSKHMpKQotCQlrZnJlZShzKTsKLX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3didWYuYyBiL2ZzL2pmZnMyL3didWYuYwppbmRleCBjODEyODA2Li45OTZkOTIyIDEwMDY0NAotLS0gYS9mcy9qZmZzMi93YnVmLmMKKysrIGIvZnMvamZmczIvd2J1Zi5jCkBAIC05LDcgKzksNyBAQAogICoKICAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCiAgKgotICogJElkOiB3YnVmLmMsdiAxLjgyIDIwMDQvMTEvMjAgMjI6MDg6MzEgZHdtdzIgRXhwICQKKyAqICRJZDogd2J1Zi5jLHYgMS45MiAyMDA1LzA0LzA1IDEyOjUxOjU0IGRlZGVraW5kIEV4cCAkCiAgKgogICovCiAKQEAgLTgzLDcgKzgzLDcgQEAKIAlzdHJ1Y3QgamZmczJfaW5vZGlydHkgKm5ldzsKIAogCS8qIE1hcmsgdGhlIHN1cGVyYmxvY2sgZGlydHkgc28gdGhhdCBrdXBkYXRlZCB3aWxsIGZsdXNoLi4uICovCi0JT0ZOSV9CU18yU0ZGSihjKS0+c19kaXJ0ID0gMTsKKwlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CiAKIAlpZiAoamZmczJfd2J1Zl9wZW5kaW5nX2Zvcl9pbm8oYywgaW5vKSkKIAkJcmV0dXJuOwpAQCAtMTMwLDcgKzEzMCwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgamZmczJfYmxvY2tfcmVmaWxlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQorI2RlZmluZSBSRUZJTEVfTk9URU1QVFkgMAorI2RlZmluZSBSRUZJTEVfQU5ZV0FZICAgMQorCitzdGF0aWMgdm9pZCBqZmZzMl9ibG9ja19yZWZpbGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIGludCBhbGxvd19lbXB0eSkKIHsKIAlEMShwcmludGsoIkFib3V0IHRvIHJlZmlsZSBiYWQgYmxvY2sgYXQgJTA4eFxuIiwgamViLT5vZmZzZXQpKTsKIApAQCAtMTQ0LDcgKzE0Nyw3IEBACiAJCUQxKHByaW50aygiUmVmaWxpbmcgYmxvY2sgYXQgJTA4eCB0byBiYWRfdXNlZF9saXN0XG4iLCBqZWItPm9mZnNldCkpOwogCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+YmFkX3VzZWRfbGlzdCk7CiAJfSBlbHNlIHsKLQkJQlVHKCk7CisJCUJVR19PTihhbGxvd19lbXB0eSA9PSBSRUZJTEVfTk9URU1QVFkpOwogCQkvKiBJdCBoYXMgdG8gaGF2ZSBoYWQgc29tZSBub2RlcyBvciB3ZSBjb3VsZG4ndCBiZSBoZXJlICovCiAJCUQxKHByaW50aygiUmVmaWxpbmcgYmxvY2sgYXQgJTA4eCB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIsIGplYi0+b2Zmc2V0KSk7CiAJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOwpAQCAtMTc5LDcgKzE4Miw3IEBACiAKIAlqZWIgPSAmYy0+YmxvY2tzW2MtPndidWZfb2ZzIC8gYy0+c2VjdG9yX3NpemVdOwogCi0JamZmczJfYmxvY2tfcmVmaWxlKGMsIGplYik7CisJamZmczJfYmxvY2tfcmVmaWxlKGMsIGplYiwgUkVGSUxFX05PVEVNUFRZKTsKIAogCS8qIEZpbmQgdGhlIGZpcnN0IG5vZGUgdG8gYmUgcmVjb3ZlcmVkLCBieSBza2lwcGluZyBvdmVyIGV2ZXJ5CiAJICAgbm9kZSB3aGljaCBlbmRzIGJlZm9yZSB0aGUgd2J1ZiBzdGFydHMsIG9yIHdoaWNoIGlzIG9ic29sZXRlLiAqLwpAQCAtMjY0LDE3ICsyNjcsMTYgQEAKIAlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIGVuZC1zdGFydCwgJm9mcywgJmxlbik7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJGYWlsZWQgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHdidWYgcmVjb3ZlcnkuIERhdGEgbG9zcyBlbnN1ZXMuXG4iKTsKLQkJaWYgKGJ1ZikKLQkJCWtmcmVlKGJ1Zik7CisJCWtmcmVlKGJ1Zik7CiAJCXJldHVybjsKIAl9CiAJaWYgKGVuZC1zdGFydCA+PSBjLT53YnVmX3BhZ2VzaXplKSB7Ci0JCS8qIE5lZWQgdG8gZG8gYW5vdGhlciB3cml0ZSBpbW1lZGlhdGVseS4gVGhpcywgYnR3LAotCQkgbWVhbnMgdGhhdCB3ZSdsbCBiZSB3cml0aW5nIGZyb20gJ2J1ZicgYW5kIG5vdCBmcm9tCi0JCSB0aGUgd2J1Zi4gU2luY2UgaWYgd2UncmUgd3JpdGluZyBmcm9tIHRoZSB3YnVmIHRoZXJlCi0JCSB3b24ndCBiZSBtb3JlIHRoYW4gYSB3YnVmIGZ1bGwgb2YgZGF0YSwgbm93IHdpbGwKLQkJIHRoZXJlPyA6KSAqLwotCisJCS8qIE5lZWQgdG8gZG8gYW5vdGhlciB3cml0ZSBpbW1lZGlhdGVseSwgYnV0IGl0J3MgcG9zc2libGUKKwkJICAgdGhhdCB0aGlzIGlzIGp1c3QgYmVjYXVzZSB0aGUgd2J1ZiBpdHNlbGYgaXMgY29tcGxldGVseQorCQkgICBmdWxsLCBhbmQgdGhlcmUncyBub3RoaW5nIGVhcmxpZXIgcmVhZCBiYWNrIGZyb20gdGhlIAorCQkgICBmbGFzaC4gSGVuY2UgJ2J1ZicgaXNuJ3QgbmVjZXNzYXJpbHkgd2hhdCB3ZSdyZSB3cml0aW5nIAorCQkgICBmcm9tLiAqLworCQl1bnNpZ25lZCBjaGFyICpyZXdyaXRlX2J1ZiA9IGJ1Zj86Yy0+d2J1ZjsKIAkJdWludDMyX3QgdG93cml0ZSA9IChlbmQtc3RhcnQpIC0gKChlbmQtc3RhcnQpJWMtPndidWZfcGFnZXNpemUpOwogCiAJCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0ZSAweCV4IGJ5dGVzIGF0IDB4JTA4eCBpbiB3YnVmIHJlY292ZXJcbiIsCkBAIC0yOTIsOSArMjk0LDkgQEAKICNlbmRpZgogCQlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQogCQkJcmV0ID0gYy0+bXRkLT53cml0ZV9lY2MoYy0+bXRkLCBvZnMsIHRvd3JpdGUsICZyZXRsZW4sCi0JCQkJCQlidWYsIE5VTEwsIGMtPm9vYmluZm8pOworCQkJCQkJcmV3cml0ZV9idWYsIE5VTEwsIGMtPm9vYmluZm8pOwogCQllbHNlCi0JCQlyZXQgPSBjLT5tdGQtPndyaXRlKGMtPm10ZCwgb2ZzLCB0b3dyaXRlLCAmcmV0bGVuLCBidWYpOworCQkJcmV0ID0gYy0+bXRkLT53cml0ZShjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwgcmV3cml0ZV9idWYpOwogCiAJCWlmIChyZXQgfHwgcmV0bGVuICE9IHRvd3JpdGUpIHsKIAkJCS8qIEFyZ2guIFdlIHRyaWVkLiBSZWFsbHkgd2UgZGlkLiAqLwpAQCAtMzIxLDEwICszMjMsMTAgQEAKIAogCQljLT53YnVmX2xlbiA9IChlbmQgLSBzdGFydCkgLSB0b3dyaXRlOwogCQljLT53YnVmX29mcyA9IG9mcyArIHRvd3JpdGU7Ci0JCW1lbWNweShjLT53YnVmLCBidWYgKyB0b3dyaXRlLCBjLT53YnVmX2xlbik7CisJCW1lbW1vdmUoYy0+d2J1ZiwgcmV3cml0ZV9idWYgKyB0b3dyaXRlLCBjLT53YnVmX2xlbik7CiAJCS8qIERvbid0IG11Y2sgYWJvdXQgd2l0aCBjLT53YnVmX2lub2Rlcy4gRmFsc2UgcG9zaXRpdmVzIGFyZSBoYXJtbGVzcy4gKi8KLQotCQlrZnJlZShidWYpOworCQlpZiAoYnVmKQorCQkJa2ZyZWUoYnVmKTsKIAl9IGVsc2UgewogCQkvKiBPSywgbm93IHdlJ3JlIGxlZnQgd2l0aCB0aGUgZHJlZ3MgaW4gd2hpY2hldmVyIGJ1ZmZlciB3ZSdyZSB1c2luZyAqLwogCQlpZiAoYnVmKSB7CkBAIC00MTMsOSArNDE1LDkgQEAKIAlpbnQgcmV0OwogCXNpemVfdCByZXRsZW47CiAKLQkvKiBOb3RoaW5nIHRvIGRvIGlmIG5vdCBOQU5EIGZsYXNoLiBJbiBwYXJ0aWN1bGFyLCB3ZSBzaG91bGRuJ3QKKwkvKiBOb3RoaW5nIHRvIGRvIGlmIG5vdCB3cml0ZS1idWZmZXJpbmcgdGhlIGZsYXNoLiBJbiBwYXJ0aWN1bGFyLCB3ZSBzaG91bGRuJ3QKIAkgICBkZWxfdGltZXIoKSB0aGUgdGltZXIgd2UgbmV2ZXIgaW5pdGlhbGlzZWQuICovCi0JaWYgKGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpKQorCWlmICghamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWRvd25fdHJ5bG9jaygmYy0+YWxsb2Nfc2VtKSkgewpAQCAtNDI0LDcgKzQyNiw3IEBACiAJCUJVRygpOwogCX0KIAotCWlmKCFjLT53YnVmIHx8ICFjLT53YnVmX2xlbikKKwlpZiAoIWMtPndidWZfbGVuKQkvKiBhbHJlYWR5IGNoZWNrZWQgYy0+d2J1ZiBhYm92ZSAqLwogCQlyZXR1cm4gMDsKIAogCS8qIGNsYWltIHJlbWFpbmluZyBzcGFjZSBvbiB0aGUgcGFnZQpAQCAtNDMzLDcgKzQzNSw3IEBACiAJICAgaWYgd2UgaGF2ZSBhIHN3aXRjaCB0byBuZXh0IHBhZ2UsIHdlIHdpbGwgbm90IGhhdmUKIAkgICBlbm91Z2ggcmVtYWluaW5nIHNwYWNlIGZvciB0aGlzLiAKIAkqLwotCWlmIChwYWQpIHsKKwlpZiAocGFkICYmICFqZmZzMl9kYXRhZmxhc2goYykpIHsKIAkJYy0+d2J1Zl9sZW4gPSBQQUQoYy0+d2J1Zl9sZW4pOwogCiAJCS8qIFBhZCB3aXRoIEpGRlMyX0RJUlRZX0JJVE1BU0sgaW5pdGlhbGx5LiAgdGhpcyBoZWxwcyBvdXQgRUNDJ2QgTk9SCkBAIC00ODQsNyArNDg2LDcgQEAKIAlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CiAKIAkvKiBBZGp1c3QgZnJlZSBzaXplIG9mIHRoZSBibG9jayBpZiB3ZSBwYWRkZWQuICovCi0JaWYgKHBhZCkgeworCWlmIChwYWQgJiYgIWpmZnMyX2RhdGFmbGFzaChjKSkgewogCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOwogCiAJCWplYiA9ICZjLT5ibG9ja3NbYy0+d2J1Zl9vZnMgLyBjLT5zZWN0b3Jfc2l6ZV07CkBAIC01MzIsNiArNTM0LDkgQEAKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mbHVzaF93YnVmX2djKCkgY2FsbGVkIGZvciBpbm8gIyV1Li4uXG4iLCBpbm8pKTsKIAorCWlmICghYy0+d2J1ZikKKwkJcmV0dXJuIDA7CisKIAlkb3duKCZjLT5hbGxvY19zZW0pOwogCWlmICghamZmczJfd2J1Zl9wZW5kaW5nX2Zvcl9pbm8oYywgaW5vKSkgewogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiSW5vICMlZCBub3QgcGVuZGluZyBpbiB3YnVmLiBSZXR1cm5pbmdcbiIsIGlubykpOwpAQCAtNTQ3LDYgKzU1MiwxMCBAQAogCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIHBhZGRpbmcuIE5vdCBmaW5pc2hlZCBjaGVja2luZ1xuIikpOwogCQlkb3duX3dyaXRlKCZjLT53YnVmX3NlbSk7CiAJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfQUNDT1VOVElORyk7CisJCS8qIHJldHJ5IGZsdXNoaW5nIHdidWYgaW4gY2FzZSBqZmZzMl93YnVmX3JlY292ZXIKKwkJICAgbGVmdCBzb21lIGRhdGEgaW4gdGhlIHdidWYgKi8KKwkJaWYgKHJldCkKKwkJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfQUNDT1VOVElORyk7CiAJCXVwX3dyaXRlKCZjLT53YnVmX3NlbSk7CiAJfSBlbHNlIHdoaWxlIChvbGRfd2J1Zl9sZW4gJiYKIAkJICAgICAgb2xkX3didWZfb2ZzID09IGMtPndidWZfb2ZzKSB7CkBAIC01NjEsNiArNTcwLDEwIEBACiAJCQlkb3duKCZjLT5hbGxvY19zZW0pOwogCQkJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCQkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKKwkJCS8qIHJldHJ5IGZsdXNoaW5nIHdidWYgaW4gY2FzZSBqZmZzMl93YnVmX3JlY292ZXIKKwkJCSAgIGxlZnQgc29tZSBkYXRhIGluIHRoZSB3YnVmICovCisJCQlpZiAocmV0KQorCQkJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfQUNDT1VOVElORyk7CiAJCQl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU3OCwxNSArNTkxLDI3IEBACiB7CiAJaW50IHJldDsKIAorCWlmICghYy0+d2J1ZikKKwkJcmV0dXJuIDA7CisKIAlkb3duX3dyaXRlKCZjLT53YnVmX3NlbSk7CiAJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9OT0FDQ09VTlQpOworCS8qIHJldHJ5IC0gbWF5YmUgd2J1ZiByZWNvdmVyIGxlZnQgc29tZSBkYXRhIGluIHdidWYuICovCisJaWYgKHJldCkKKwkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9OT0FDQ09VTlQpOwogCXVwX3dyaXRlKCZjLT53YnVmX3NlbSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCisjZGVmaW5lIFBBR0VfRElWKHgpICggKCh1bnNpZ25lZCBsb25nKSh4KSAvICh1bnNpZ25lZCBsb25nKShjLT53YnVmX3BhZ2VzaXplKSkgKiAodW5zaWduZWQgbG9uZykoYy0+d2J1Zl9wYWdlc2l6ZSkgKQorI2RlZmluZSBQQUdFX01PRCh4KSAoICh1bnNpZ25lZCBsb25nKSh4KSAlICh1bnNpZ25lZCBsb25nKShjLT53YnVmX3BhZ2VzaXplKSApCisjZWxzZQogI2RlZmluZSBQQUdFX0RJVih4KSAoICh4KSAmICh+KGMtPndidWZfcGFnZXNpemUgLSAxKSkgKQogI2RlZmluZSBQQUdFX01PRCh4KSAoICh4KSAmIChjLT53YnVmX3BhZ2VzaXplIC0gMSkgKQorI2VuZGlmCisKIGludCBqZmZzMl9mbGFzaF93cml0ZXYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBrdmVjICppbnZlY3MsIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4sIHVpbnQzMl90IGlubykKIHsKIAlzdHJ1Y3Qga3ZlYyBvdXR2ZWNzWzNdOwpAQCAtNjAxLDcgKzYyNiw3IEBACiAJdWludDMyX3Qgb3V0dmVjX3RvID0gdG87CiAKIAkvKiBJZiBub3QgTkFORCBmbGFzaCwgZG9uJ3QgYm90aGVyICovCi0JaWYgKCFjLT53YnVmKQorCWlmICghamZmczJfaXNfd3JpdGVidWZmZXJlZChjKSkKIAkJcmV0dXJuIGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgaW52ZWNzLCBjb3VudCwgdG8sIHJldGxlbik7CiAJCiAJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOwpAQCAtNjMwLDcgKzY1NSw3IEBACiAJICAgZXJhc2UgYmxvY2suIEFueXRoaW5nIGVsc2UsIGFuZCB5b3UgZGllLgogCSAgIE5ldyBibG9jayBzdGFydHMgYXQgeHh4MDAwYyAoMC1iID0gYmxvY2sgaGVhZGVyKQogCSovCi0JaWYgKCAodG8gJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSAhPSAoYy0+d2J1Zl9vZnMgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSApIHsKKwlpZiAoU0VDVE9SX0FERFIodG8pICE9IFNFQ1RPUl9BRERSKGMtPndidWZfb2ZzKSkgewogCQkvKiBJdCdzIGEgd3JpdGUgdG8gYSBuZXcgYmxvY2sgKi8KIAkJaWYgKGMtPndidWZfbGVuKSB7CiAJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmxhc2hfd3JpdGV2KCkgdG8gMHglbHggY2F1c2VzIGZsdXNoIG9mIHdidWYgYXQgMHglMDh4XG4iLCAodW5zaWduZWQgbG9uZyl0bywgYy0+d2J1Zl9vZnMpKTsKQEAgLTc2Miw5ICs3ODcsMTggQEAKIAkJCiAJCWlmIChyZXQgPCAwIHx8IHdidWZfcmV0bGVuICE9IFBBR0VfRElWKHRvdGxlbikpIHsKIAkJCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBubyBwcm9ibGVtLAotCQkJICAgYy0+d2J1ZiBpcyBlbXB0eS4gCisJCQkgICBjLT53YnVmIGlzIGVtcHR5LiBIb3dldmVyIHJlZmlsZSBuZXh0YmxvY2sgdG8gYXZvaWQKKwkJCSAgIHdyaXRpbmcgYWdhaW4gdG8gc2FtZSBhZGRyZXNzLgogCQkJKi8KLQkJCSpyZXRsZW4gPSBkb25lbGVuOworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKKworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCQlqZWIgPSAmYy0+YmxvY2tzW291dHZlY190byAvIGMtPnNlY3Rvcl9zaXplXTsKKwkJCWpmZnMyX2Jsb2NrX3JlZmlsZShjLCBqZWIsIFJFRklMRV9BTllXQVkpOworCisJCQkqcmV0bGVuID0gMDsKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOwogCQkJZ290byBleGl0OwogCQl9CiAJCQpAQCAtODE5LDcgKzg1Myw3IEBACiB7CiAJc3RydWN0IGt2ZWMgdmVjc1sxXTsKIAotCWlmIChqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkKKwlpZiAoIWpmZnMyX2lzX3dyaXRlYnVmZmVyZWQoYykpCiAJCXJldHVybiBjLT5tdGQtPndyaXRlKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKTsKIAogCXZlY3NbMF0uaW92X2Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CkBAIC04MzUsMzkgKzg2OSwzOCBAQAogCWxvZmZfdAlvcmJmID0gMCwgb3diZiA9IDAsIGx3YmYgPSAwOwogCWludAlyZXQ7CiAKLQkvKiBSZWFkIGZsYXNoICovCi0JaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkgewotCQlkb3duX3JlYWQoJmMtPndidWZfc2VtKTsKLQotCQlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQotCQkJcmV0ID0gYy0+bXRkLT5yZWFkX2VjYyhjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7Ci0JCWVsc2UKLQkJCXJldCA9IGMtPm10ZC0+cmVhZChjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7Ci0KLQkJaWYgKCAocmV0ID09IC1FQkFETVNHKSAmJiAoKnJldGxlbiA9PSBsZW4pICkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRkLT5yZWFkKDB4JXp4IGJ5dGVzIGZyb20gMHglbGx4KSByZXR1cm5lZCBFQ0MgZXJyb3JcbiIsCi0JCQkgICAgICAgbGVuLCBvZnMpOwotCQkJLyogCi0JCQkgKiBXZSBoYXZlIHRoZSByYXcgZGF0YSB3aXRob3V0IEVDQyBjb3JyZWN0aW9uIGluIHRoZSBidWZmZXIsIG1heWJlIAotCQkJICogd2UgYXJlIGx1Y2t5IGFuZCBhbGwgZGF0YSBvciBwYXJ0cyBhcmUgY29ycmVjdC4gV2UgY2hlY2sgdGhlIG5vZGUuCi0JCQkgKiBJZiBkYXRhIGFyZSBjb3JydXB0ZWQgbm9kZSBjaGVjayB3aWxsIHNvcnQgaXQgb3V0LgotCQkJICogV2Uga2VlcCB0aGlzIGJsb2NrLCBpdCB3aWxsIGZhaWwgb24gd3JpdGUgb3IgZXJhc2UgYW5kIHRoZSB3ZQotCQkJICogbWFyayBpdCBiYWQuIE9yIHNob3VsZCB3ZSBkbyB0aGF0IG5vdz8gQnV0IHdlIHNob3VsZCBnaXZlIGhpbSBhIGNoYW5jZS4KLQkJCSAqIE1heWJlIHdlIGhhZCBhIHN5c3RlbSBjcmFzaCBvciBwb3dlciBsb3NzIGJlZm9yZSB0aGUgZWNjIHdyaXRlIG9yICAKLQkJCSAqIGEgZXJhc2Ugd2FzIGNvbXBsZXRlZC4KLQkJCSAqIFNvIHdlIHJldHVybiBzdWNjZXNzLiA6KQotCQkJICovCi0JCSAJcmV0ID0gMDsKLQkJIH0JCi0JfSBlbHNlCisJaWYgKCFqZmZzMl9pc193cml0ZWJ1ZmZlcmVkKGMpKQogCQlyZXR1cm4gYy0+bXRkLT5yZWFkKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKTsKIAorCS8qIFJlYWQgZmxhc2ggKi8KKwlkb3duX3JlYWQoJmMtPndidWZfc2VtKTsKKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQorCQlyZXQgPSBjLT5tdGQtPnJlYWRfZWNjKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmLCBOVUxMLCBjLT5vb2JpbmZvKTsKKwllbHNlCisJCXJldCA9IGMtPm10ZC0+cmVhZChjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7CisKKwlpZiAoIChyZXQgPT0gLUVCQURNU0cpICYmICgqcmV0bGVuID09IGxlbikgKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm10ZC0+cmVhZCgweCV6eCBieXRlcyBmcm9tIDB4JWxseCkgcmV0dXJuZWQgRUNDIGVycm9yXG4iLAorCQkgICAgICAgbGVuLCBvZnMpOworCQkvKiAKKwkJICogV2UgaGF2ZSB0aGUgcmF3IGRhdGEgd2l0aG91dCBFQ0MgY29ycmVjdGlvbiBpbiB0aGUgYnVmZmVyLCBtYXliZSAKKwkJICogd2UgYXJlIGx1Y2t5IGFuZCBhbGwgZGF0YSBvciBwYXJ0cyBhcmUgY29ycmVjdC4gV2UgY2hlY2sgdGhlIG5vZGUuCisJCSAqIElmIGRhdGEgYXJlIGNvcnJ1cHRlZCBub2RlIGNoZWNrIHdpbGwgc29ydCBpdCBvdXQuCisJCSAqIFdlIGtlZXAgdGhpcyBibG9jaywgaXQgd2lsbCBmYWlsIG9uIHdyaXRlIG9yIGVyYXNlIGFuZCB0aGUgd2UKKwkJICogbWFyayBpdCBiYWQuIE9yIHNob3VsZCB3ZSBkbyB0aGF0IG5vdz8gQnV0IHdlIHNob3VsZCBnaXZlIGhpbSBhIGNoYW5jZS4KKwkJICogTWF5YmUgd2UgaGFkIGEgc3lzdGVtIGNyYXNoIG9yIHBvd2VyIGxvc3MgYmVmb3JlIHRoZSBlY2Mgd3JpdGUgb3IgIAorCQkgKiBhIGVyYXNlIHdhcyBjb21wbGV0ZWQuCisJCSAqIFNvIHdlIHJldHVybiBzdWNjZXNzLiA6KQorCQkgKi8KKwkgCXJldCA9IDA7CisJfQkKKwogCS8qIGlmIG5vIHdyaXRlYnVmZmVyIGF2YWlsYWJsZSBvciB3cml0ZSBidWZmZXIgZW1wdHksIHJldHVybiAqLwogCWlmICghYy0+d2J1Zl9wYWdlc2l6ZSB8fCAhYy0+d2J1Zl9sZW4pCiAJCWdvdG8gZXhpdDsKIAogCS8qIGlmIHdlIHJlYWQgaW4gYSBkaWZmZXJlbnQgYmxvY2ssIHJldHVybiAqLwotCWlmICggKG9mcyAmIH4oYy0+c2VjdG9yX3NpemUtMSkpICE9IChjLT53YnVmX29mcyAmIH4oYy0+c2VjdG9yX3NpemUtMSkpICkgCisJaWYgKFNFQ1RPUl9BRERSKG9mcykgIT0gU0VDVE9SX0FERFIoYy0+d2J1Zl9vZnMpKQogCQlnb3RvIGV4aXQ7CiAKIAlpZiAob2ZzID49IGMtPndidWZfb2ZzKSB7CkBAIC0xMTYxLDcgKzExOTQsMjcgQEAKIAlrZnJlZShjLT53YnVmKTsKIH0KIAotI2lmZGVmIENPTkZJR19KRkZTMl9GU19OT1JfRUNDCitpbnQgamZmczJfZGF0YWZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisJYy0+Y2xlYW5tYXJrZXJfc2l6ZSA9IDA7CQkvKiBObyBjbGVhbm1hcmtlcnMgbmVlZGVkICovCisJCisJLyogSW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgKi8KKwlpbml0X3J3c2VtKCZjLT53YnVmX3NlbSk7CisJYy0+d2J1Zl9wYWdlc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCWMtPndidWZfb2ZzID0gMHhGRkZGRkZGRjsKKworCWMtPndidWYgPSBrbWFsbG9jKGMtPndidWZfcGFnZXNpemUsIEdGUF9LRVJORUwpOworCWlmICghYy0+d2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcmludGsoS0VSTl9JTkZPICJKRkZTMiB3cml0ZS1idWZmZXJpbmcgZW5hYmxlZCAoJWkpXG4iLCBjLT53YnVmX3BhZ2VzaXplKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGpmZnMyX2RhdGFmbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisJa2ZyZWUoYy0+d2J1Zik7Cit9CisKIGludCBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CiAJLyogQ2xlYW5tYXJrZXIgaXMgYWN0dWFsbHkgbGFyZ2VyIG9uIHRoZSBmbGFzaGVzICovCiAJYy0+Y2xlYW5tYXJrZXJfc2l6ZSA9IDE2OwpAQCAtMTE4MSw0ICsxMjM0LDMgQEAKIHZvaWQgamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CiAJa2ZyZWUoYy0+d2J1Zik7CiB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRlLmMgYi9mcy9qZmZzMi93cml0ZS5jCmluZGV4IDgwYTVkYjUuLjY5MTAwNjEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL3dyaXRlLmMKKysrIGIvZnMvamZmczIvd3JpdGUuYwpAQCAtNyw3ICs3LDcgQEAKICAqCiAgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgogICoKLSAqICRJZDogd3JpdGUuYyx2IDEuODcgMjAwNC8xMS8xNiAyMDozNjoxMiBkd213MiBFeHAgJAorICogJElkOiB3cml0ZS5jLHYgMS45MiAyMDA1LzA0LzEzIDEzOjIyOjM1IGR3bXcyIEV4cCAkCiAgKgogICovCiAKQEAgLTM1LDEzICszNSwxMiBAQAogCWYtPmlub2NhY2hlID0gaWM7CiAJZi0+aW5vY2FjaGUtPm5saW5rID0gMTsKIAlmLT5pbm9jYWNoZS0+bm9kZXMgPSAoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKWYtPmlub2NhY2hlOwotCWYtPmlub2NhY2hlLT5pbm8gPSArK2MtPmhpZ2hlc3RfaW5vOwogCWYtPmlub2NhY2hlLT5zdGF0ZSA9IElOT19TVEFURV9QUkVTRU5UOwogCi0JcmktPmlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOwogCi0JRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX25ld19pbm9kZSgpOiBBc3NpZ25lZCBpbm8jICVkXG4iLCBmLT5pbm9jYWNoZS0+aW5vKSk7CiAJamZmczJfYWRkX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX25ld19pbm9kZSgpOiBBc3NpZ25lZCBpbm8jICVkXG4iLCBmLT5pbm9jYWNoZS0+aW5vKSk7CisJcmktPmlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOwogCiAJcmktPm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CiAJcmktPm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfSU5PREUpOwpAQCAtMTM2LDYgKzEzNSwxNSBAQAogCXJhdy0+X190b3RsZW4gPSBQQUQoc2l6ZW9mKCpyaSkrZGF0YWxlbik7CiAJcmF3LT5uZXh0X3BoeXMgPSBOVUxMOwogCisJaWYgKChhbGxvY19tb2RlIT1BTExPQ19HQykgJiYgKGplMzJfdG9fY3B1KHJpLT52ZXJzaW9uKSA8IGYtPmhpZ2hlc3RfdmVyc2lvbikpIHsKKwkJQlVHX09OKCFyZXRyaWVkKTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2Rub2RlIDogZG5vZGVfdmVyc2lvbiAlZCwgIgorCQkJCSJoaWdoZXN0IHZlcnNpb24gJWQgLT4gdXBkYXRpbmcgZG5vZGVcbiIsIAorCQkJCWplMzJfdG9fY3B1KHJpLT52ZXJzaW9uKSwgZi0+aGlnaGVzdF92ZXJzaW9uKSk7CisJCXJpLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCQlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOworCX0KKwogCXJldCA9IGpmZnMyX2ZsYXNoX3dyaXRldihjLCB2ZWNzLCBjbnQsIGZsYXNoX29mcywgJnJldGxlbiwKIAkJCQkgKGFsbG9jX21vZGU9PUFMTE9DX0dDKT8wOmYtPmlub2NhY2hlLT5pbm8pOwogCkBAIC0yODAsNiArMjg4LDE2IEBACiAJcmF3LT5fX3RvdGxlbiA9IFBBRChzaXplb2YoKnJkKStuYW1lbGVuKTsKIAlyYXctPm5leHRfcGh5cyA9IE5VTEw7CiAKKwlpZiAoKGFsbG9jX21vZGUhPUFMTE9DX0dDKSAmJiAoamUzMl90b19jcHUocmQtPnZlcnNpb24pIDwgZi0+aGlnaGVzdF92ZXJzaW9uKSkgeworCQlCVUdfT04oIXJldHJpZWQpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfd3JpdGVfZGlyZW50IDogZGlyZW50X3ZlcnNpb24gJWQsICIKKwkJCQkgICAgICJoaWdoZXN0IHZlcnNpb24gJWQgLT4gdXBkYXRpbmcgZGlyZW50XG4iLAorCQkJCSAgICAgamUzMl90b19jcHUocmQtPnZlcnNpb24pLCBmLT5oaWdoZXN0X3ZlcnNpb24pKTsKKwkJcmQtPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJCWZkLT52ZXJzaW9uID0gamUzMl90b19jcHUocmQtPnZlcnNpb24pOworCQlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCX0KKwogCXJldCA9IGpmZnMyX2ZsYXNoX3dyaXRldihjLCB2ZWNzLCAyLCBmbGFzaF9vZnMsICZyZXRsZW4sCiAJCQkJIChhbGxvY19tb2RlPT1BTExPQ19HQyk/MDpqZTMyX3RvX2NwdShyZC0+cGlubykpOwogCWlmIChyZXQgfHwgKHJldGxlbiAhPSBzaXplb2YoKnJkKSArIG5hbWVsZW4pKSB7CkBAIC02MjUsMjAgKzY0MywyMyBAQAogCiAJCWRvd24oJmRlYWRfZi0+c2VtKTsKIAotCQl3aGlsZSAoZGVhZF9mLT5kZW50cykgewotCQkJLyogVGhlcmUgY2FuIGJlIG9ubHkgZGVsZXRlZCBvbmVzICovCi0JCQlmZCA9IGRlYWRfZi0+ZGVudHM7Ci0JCQkKLQkJCWRlYWRfZi0+ZGVudHMgPSBmZC0+bmV4dDsKLQkJCQotCQkJaWYgKGZkLT5pbm8pIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZWxldGluZyBpbm9kZSAjJXUgd2l0aCBhY3RpdmUgZGVudHJ5IFwiJXNcIi0+aW5vICMldVxuIiwKLQkJCQkgICAgICAgZGVhZF9mLT5pbm9jYWNoZS0+aW5vLCBmZC0+bmFtZSwgZmQtPmlubyk7Ci0JCQl9IGVsc2UgewotCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmluZyBkZWxldGlvbiBkaXJlbnQgZm9yIFwiJXNcIiBmcm9tIGRpciBpbm8gIyV1XG4iLCBmZC0+bmFtZSwgZGVhZF9mLT5pbm9jYWNoZS0+aW5vKSk7CisJCWlmIChTX0lTRElSKE9GTklfRURPTklfMlNGRkooZGVhZF9mKS0+aV9tb2RlKSkgeworCQkJd2hpbGUgKGRlYWRfZi0+ZGVudHMpIHsKKwkJCQkvKiBUaGVyZSBjYW4gYmUgb25seSBkZWxldGVkIG9uZXMgKi8KKwkJCQlmZCA9IGRlYWRfZi0+ZGVudHM7CisJCQkJCisJCQkJZGVhZF9mLT5kZW50cyA9IGZkLT5uZXh0OworCQkJCQorCQkJCWlmIChmZC0+aW5vKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRlbGV0aW5nIGlub2RlICMldSB3aXRoIGFjdGl2ZSBkZW50cnkgXCIlc1wiLT5pbm8gIyV1XG4iLAorCQkJCQkgICAgICAgZGVhZF9mLT5pbm9jYWNoZS0+aW5vLCBmZC0+bmFtZSwgZmQtPmlubyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlbW92aW5nIGRlbGV0aW9uIGRpcmVudCBmb3IgXCIlc1wiIGZyb20gZGlyIGlubyAjJXVcbiIsCisJCQkJCQlmZC0+bmFtZSwgZGVhZF9mLT5pbm9jYWNoZS0+aW5vKSk7CisJCQkJfQorCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmZC0+cmF3KTsKKwkJCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKIAkJCX0KLQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmZC0+cmF3KTsKLQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOwogCQl9CiAKIAkJZGVhZF9mLT5pbm9jYWNoZS0+bmxpbmstLTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMgYi9mcy9qZnMvamZzX2xvZ21nci5jCmluZGV4IDdjODM4N2UuLjc5ZDA3NjIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbG9nbWdyLmMKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtMjM1OSw5ICsyMzU5LDkgQEAKIAkJCWxibVN0YXJ0SU8oYnApOwogCQkJc3Bpbl9sb2NrX2lycSgmbG9nX3JlZHJpdmVfbG9jayk7CiAJCX0KLQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCWlmIChmcmVlemluZyhjdXJyZW50KSkgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZsb2dfcmVkcml2ZV9sb2NrKTsKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCQkJcmVmcmlnZXJhdG9yKCk7CiAJCX0gZWxzZSB7CiAJCQlhZGRfd2FpdF9xdWV1ZSgmamZzX0lPX3RocmVhZF93YWl0LCAmd3EpOwogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdHhubWdyLmMgYi9mcy9qZnMvamZzX3R4bm1nci5jCmluZGV4IDhjYmFhZmYuLjEyMWM5ODEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfdHhubWdyLmMKKysrIGIvZnMvamZzL2pmc190eG5tZ3IuYwpAQCAtMjc4OCw5ICsyNzg4LDkgQEAKIAkJLyogSW4gY2FzZSBhIHdha2V1cCBjYW1lIHdoaWxlIGFsbCB0aHJlYWRzIHdlcmUgYWN0aXZlICovCiAJCWpmc19jb21taXRfdGhyZWFkX3dha2luZyA9IDA7CiAKLQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCWlmIChmcmVlemluZyhjdXJyZW50KSkgewogCQkJTEFaWV9VTkxPQ0soZmxhZ3MpOwotCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCQlyZWZyaWdlcmF0b3IoKTsKIAkJfSBlbHNlIHsKIAkJCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKIApAQCAtMjk4Nyw5ICsyOTg3LDkgQEAKIAkJLyogQWRkIGFub25fbGlzdDIgYmFjayB0byBhbm9uX2xpc3QgKi8KIAkJbGlzdF9zcGxpY2VfaW5pdCgmVHhBbmNob3IuYW5vbl9saXN0MiwgJlR4QW5jaG9yLmFub25fbGlzdCk7CiAKLQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCWlmIChmcmVlemluZyhjdXJyZW50KSkgewogCQkJVFhOX1VOTE9DSygpOwotCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCQlyZWZyaWdlcmF0b3IoKTsKIAkJfSBlbHNlIHsKIAkJCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKIApkaWZmIC0tZ2l0IGEvZnMvbGliZnMuYyBiL2ZzL2xpYmZzLmMKaW5kZXggNTAyNTU2My4uNTgxMDFkZiAxMDA2NDQKLS0tIGEvZnMvbGliZnMuYworKysgYi9mcy9saWJmcy5jCkBAIC0xODMsNiArMTgzLDcgQEAKIAkubGxzZWVrCQk9IGRjYWNoZV9kaXJfbHNlZWssCiAJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKIAkucmVhZGRpcgk9IGRjYWNoZV9yZWFkZGlyLAorCS5mc3luYwkJPSBzaW1wbGVfc3luY19maWxlLAogfTsKIAogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggZmQ3N2VkMS4uMTRiM2NlOCAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIAlwcmVwYXJlX3RvX3dhaXQocXVldWUsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCWlmICghc2lnbmFsbGVkICgpKSB7CiAJCXNjaGVkdWxlX3RpbWVvdXQoTkxNQ0xOVF9HUkFDRV9XQUlUKTsKLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmICghc2lnbmFsbGVkICgpKQogCQkJc3RhdHVzID0gMDsKIAl9CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmMuYyBiL2ZzL2xvY2tkL3N2Yy5jCmluZGV4IGI4MmU0NzAuLjZlMjQyNTUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL3N2Yy5jCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC0xOTEsNyArMTkxLDkgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCSJsb2NrZDogbmV3IHByb2Nlc3MsIHNraXBwaW5nIGhvc3Qgc2h1dGRvd25cbiIpOwogCXdha2VfdXAoJmxvY2tkX2V4aXQpOwotCQkKKworCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisKIAkvKiBFeGl0IHRoZSBSUEMgdGhyZWFkICovCiAJc3ZjX2V4aXRfdGhyZWFkKHJxc3RwKTsKIApkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggYTBiYzAzNC4uMjlmYTVkYSAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0xMjc2LDcgKzEyNzYsNyBAQAogICovCiBzdGF0aWMgaW50IF9fc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQogewotCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2UgPSAqZmxwOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2U7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgZXJyb3IsIHJkbGVhc2VfY291bnQgPSAwLCB3cmxlYXNlX2NvdW50ID0gMDsKQEAgLTEyODcsNiArMTI4Nyw4IEBACiAJaWYgKCFmbHAgfHwgISgqZmxwKSB8fCAhKCpmbHApLT5mbF9sbW9wcyB8fCAhKCpmbHApLT5mbF9sbW9wcy0+ZmxfYnJlYWspCiAJCWdvdG8gb3V0OwogCisJbGVhc2UgPSAqZmxwOworCiAJZXJyb3IgPSAtRUFHQUlOOwogCWlmICgoYXJnID09IEZfUkRMQ0spICYmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPiAwKSkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBmYThkZjgxLi4wMmE4MjRjIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgpAQCAtMzE0LDcgKzMxNCw3IEBACiB2b2lkIHBhdGhfcmVsZWFzZV9vbl91bW91bnQoc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJZHB1dChuZC0+ZGVudHJ5KTsKLQlfbW50cHV0KG5kLT5tbnQpOworCW1udHB1dF9ub19leHBpcmUobmQtPm1udCk7CiB9CiAKIC8qCkBAIC0xMzEyLDcgKzEzMTIsNyBAQAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+Y3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlLCBuZCk7CiAJaWYgKCFlcnJvcikgewotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJZnNub3RpZnlfY3JlYXRlKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMTYzNyw3ICsxNjM3LDcgQEAKIAlEUVVPVF9JTklUKGRpcik7CiAJZXJyb3IgPSBkaXItPmlfb3AtPm1rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogCWlmICghZXJyb3IpIHsKLQkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCWZzbm90aWZ5X2NyZWF0ZShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOwogCX0KIAlyZXR1cm4gZXJyb3I7CkBAIC0xNzEwLDcgKzE3MTAsNyBAQAogCURRVU9UX0lOSVQoZGlyKTsKIAllcnJvciA9IGRpci0+aV9vcC0+bWtkaXIoZGlyLCBkZW50cnksIG1vZGUpOwogCWlmICghZXJyb3IpIHsKLQkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCWZzbm90aWZ5X21rZGlyKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIoZGlyLGRlbnRyeSwgbW9kZSk7CiAJfQogCXJldHVybiBlcnJvcjsKQEAgLTE4MDEsNyArMTgwMSw3IEBACiAJfQogCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCQlmc25vdGlmeV9ybWRpcihkZW50cnksIGRlbnRyeS0+ZF9pbm9kZSwgZGlyKTsKIAkJZF9kZWxldGUoZGVudHJ5KTsKIAl9CiAJZHB1dChkZW50cnkpOwpAQCAtMTg3NCw5ICsxODc0LDEwIEBACiAKIAkvKiBXZSBkb24ndCBkX2RlbGV0ZSgpIE5GUyBzaWxseXJlbmFtZWQgZmlsZXMtLXRoZXkgc3RpbGwgZXhpc3QuICovCiAJaWYgKCFlcnJvciAmJiAhKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKSkgeworCQlmc25vdGlmeV91bmxpbmsoZGVudHJ5LCBkaXIpOwogCQlkX2RlbGV0ZShkZW50cnkpOwotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsKIAl9CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE5NTAsNyArMTk1MSw3IEBACiAJRFFVT1RfSU5JVChkaXIpOwogCWVycm9yID0gZGlyLT5pX29wLT5zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKIAlpZiAoIWVycm9yKSB7Ci0JCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOworCQlmc25vdGlmeV9jcmVhdGUoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMjAyMyw3ICsyMDI0LDcgQEAKIAllcnJvciA9IGRpci0+aV9vcC0+bGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOwogCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CiAJaWYgKCFlcnJvcikgewotCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJZnNub3RpZnlfY3JlYXRlKGRpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQlzZWN1cml0eV9pbm9kZV9wb3N0X2xpbmsob2xkX2RlbnRyeSwgZGlyLCBuZXdfZGVudHJ5KTsKIAl9CiAJcmV0dXJuIGVycm9yOwpAQCAtMjE4Nyw2ICsyMTg4LDcgQEAKIHsKIAlpbnQgZXJyb3I7CiAJaW50IGlzX2RpciA9IFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKTsKKwljb25zdCBjaGFyICpvbGRfbmFtZTsKIAogCWlmIChvbGRfZGVudHJ5LT5kX2lub2RlID09IG5ld19kZW50cnktPmRfaW5vZGUpCiAgCQlyZXR1cm4gMDsKQEAgLTIyMDgsMTggKzIyMTAsMTggQEAKIAlEUVVPVF9JTklUKG9sZF9kaXIpOwogCURRVU9UX0lOSVQobmV3X2Rpcik7CiAKKwlvbGRfbmFtZSA9IGZzbm90aWZ5X29sZG5hbWVfaW5pdChvbGRfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKIAlpZiAoaXNfZGlyKQogCQllcnJvciA9IHZmc19yZW5hbWVfZGlyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOwogCWVsc2UKIAkJZXJyb3IgPSB2ZnNfcmVuYW1lX290aGVyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOwogCWlmICghZXJyb3IpIHsKLQkJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKLQkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fUkVOQU1FKTsKLQkJZWxzZSB7Ci0JCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7Ci0JCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7Ci0JCX0KKwkJY29uc3QgY2hhciAqbmV3X25hbWUgPSBvbGRfZGVudHJ5LT5kX25hbWUubmFtZTsKKwkJZnNub3RpZnlfbW92ZShvbGRfZGlyLCBuZXdfZGlyLCBvbGRfbmFtZSwgbmV3X25hbWUsIGlzX2Rpcik7CiAJfQorCWZzbm90aWZ5X29sZG5hbWVfZnJlZShvbGRfbmFtZSk7CisKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggM2I5M2U1ZC4uNTg3ZWIwZCAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2NoaWxkKTsKIAkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X21vdW50cyk7CiAJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9saXN0KTsKLQkJSU5JVF9MSVNUX0hFQUQoJm1udC0+bW50X2ZzbGluayk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9leHBpcmUpOwogCQlpZiAobmFtZSkgewogCQkJaW50IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKIAkJCWNoYXIgKm5ld25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwpAQCAtMTY1LDggKzE2NSw4IEBACiAJCS8qIHN0aWNrIHRoZSBkdXBsaWNhdGUgbW91bnQgb24gdGhlIHNhbWUgZXhwaXJ5IGxpc3QKIAkJICogYXMgdGhlIG9yaWdpbmFsIGlmIHRoYXQgd2FzIG9uIG9uZSAqLwogCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJm9sZC0+bW50X2ZzbGluaykpCi0JCQlsaXN0X2FkZCgmbW50LT5tbnRfZnNsaW5rLCAmb2xkLT5tbnRfZnNsaW5rKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZvbGQtPm1udF9leHBpcmUpKQorCQkJbGlzdF9hZGQoJm1udC0+bW50X2V4cGlyZSwgJm9sZC0+bW50X2V4cGlyZSk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9CiAJcmV0dXJuIG1udDsKQEAgLTMzNyw3ICszMzcsNyBAQAogCiBFWFBPUlRfU1lNQk9MKG1heV91bW91bnQpOwogCi12b2lkIHVtb3VudF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50KQorc3RhdGljIHZvaWQgdW1vdW50X3RyZWUoc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJc3RydWN0IHZmc21vdW50ICpwOwogCUxJU1RfSEVBRChraWxsKTsKQEAgLTM0NSwxMiArMzQ1LDEzIEBACiAJZm9yIChwID0gbW50OyBwOyBwID0gbmV4dF9tbnQocCwgbW50KSkgewogCQlsaXN0X2RlbCgmcC0+bW50X2xpc3QpOwogCQlsaXN0X2FkZCgmcC0+bW50X2xpc3QsICZraWxsKTsKKwkJcC0+bW50X25hbWVzcGFjZSA9IE5VTEw7CiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZraWxsKSkgewogCQltbnQgPSBsaXN0X2VudHJ5KGtpbGwubmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwogCQlpZiAobW50LT5tbnRfcGFyZW50ID09IG1udCkgewogCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCQl9IGVsc2UgewpAQCAtNjQ0LDcgKzY0NSw3IEBACiAJaWYgKG1udCkgewogCQkvKiBzdG9wIGJpbmQgbW91bnRzIGZyb20gZXhwaXJpbmcgKi8KIAkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZnNsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZXhwaXJlKTsKIAkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCiAJCWVyciA9IGdyYWZ0X3RyZWUobW50LCBuZCk7CkBAIC03NDMsNyArNzQ0LDcgQEAKIAogCS8qIGlmIHRoZSBtb3VudCBpcyBtb3ZlZCwgaXQgc2hvdWxkIG5vIGxvbmdlciBiZSBleHBpcmUKIAkgKiBhdXRvbWF0aWNhbGx5ICovCi0JbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2ZzbGluayk7CisJbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2V4cGlyZSk7CiBvdXQyOgogCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIG91dDE6CkBAIC04MDcsMTIgKzgwOCwxMyBAQAogCQlnb3RvIHVubG9jazsKIAogCW5ld21udC0+bW50X2ZsYWdzID0gbW50X2ZsYWdzOworCW5ld21udC0+bW50X25hbWVzcGFjZSA9IGN1cnJlbnQtPm5hbWVzcGFjZTsKIAllcnIgPSBncmFmdF90cmVlKG5ld21udCwgbmQpOwogCiAJaWYgKGVyciA9PSAwICYmIGZzbGlzdCkgewogCQkvKiBhZGQgdG8gdGhlIHNwZWNpZmllZCBleHBpcmF0aW9uIGxpc3QgKi8KIAkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmbmV3bW50LT5tbnRfZnNsaW5rLCBmc2xpc3QpOworCQlsaXN0X2FkZF90YWlsKCZuZXdtbnQtPm1udF9leHBpcmUsIGZzbGlzdCk7CiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAl9CiAKQEAgLTgyNCw2ICs4MjYsNTQgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoZG9fYWRkX21vdW50KTsKIAorc3RhdGljIHZvaWQgZXhwaXJlX21vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpCit7CisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCS8qCisJICogQ2hlY2sgaWYgbW91bnQgaXMgc3RpbGwgYXR0YWNoZWQsIGlmIG5vdCwgbGV0IHdob2V2ZXIgaG9sZHMgaXQgZGVhbAorCSAqIHdpdGggdGhlIHN1Y2tlcgorCSAqLworCWlmIChtbnQtPm1udF9wYXJlbnQgPT0gbW50KSB7CisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCBpdCBpcyBzdGlsbCBkZWFkOiB0aGUgY291bnQgc2hvdWxkIG5vdyBiZSAyIC0gYXMKKwkgKiBjb250cmlidXRlZCBieSB0aGUgdmZzbW91bnQgcGFyZW50IGFuZCB0aGUgbW50Z2V0IGFib3ZlCisJICovCisJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgeworCQlzdHJ1Y3QgbmFtZWlkYXRhIG9sZF9uZDsKKworCQkvKiBkZWxldGUgZnJvbSB0aGUgbmFtZXNwYWNlICovCisJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOworCQlkZXRhY2hfbW50KG1udCwgJm9sZF9uZCk7CisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCisJCS8qCisJCSAqIE5vdyBsYXkgaXQgdG8gcmVzdCBpZiB0aGlzIHdhcyB0aGUgbGFzdCByZWYgb24gdGhlIHN1cGVyYmxvY2sKKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmbW50LT5tbnRfc2ItPnNfYWN0aXZlKSA9PSAxKSB7CisJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCQlsb2NrX2tlcm5lbCgpOworCQkJRFFVT1RfT0ZGKG1udC0+bW50X3NiKTsKKwkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCX0KKwkJbW50cHV0KG1udCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU29tZW9uZSBicm91Z2h0IGl0IGJhY2sgdG8gbGlmZSB3aGlsc3Qgd2UgZGlkbid0IGhhdmUgYW55CisJCSAqIGxvY2tzIGhlbGQgc28gcmV0dXJuIGl0IHRvIHRoZSBleHBpcmF0aW9uIGxpc3QKKwkJICovCisJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2V4cGlyZSwgbW91bnRzKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KK30KKwogLyoKICAqIHByb2Nlc3MgYSBsaXN0IG9mIGV4cGlyYWJsZSBtb3VudHBvaW50cyB3aXRoIHRoZSBpbnRlbnQgb2YgZGlzY2FyZGluZyBhbnkKICAqIG1vdW50cG9pbnRzIHRoYXQgYXJlbid0IGluIHVzZSBhbmQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgc2luY2UgbGFzdCB3ZSBjYW1lCkBAIC04NDYsMTMgKzg5NiwxMyBAQAogCSAqIC0gc3RpbGwgbWFya2VkIGZvciBleHBpcnkgKG1hcmtlZCBvbiB0aGUgbGFzdCBjYWxsIGhlcmU7IG1hcmtzIGFyZQogCSAqICAgY2xlYXJlZCBieSBtbnRwdXQoKSkKIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9mc2xpbmspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9leHBpcmUpIHsKIAkJaWYgKCF4Y2hnKCZtbnQtPm1udF9leHBpcnlfbWFyaywgMSkgfHwKIAkJICAgIGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgIT0gMSkKIAkJCWNvbnRpbnVlOwogCiAJCW1udGdldChtbnQpOwotCQlsaXN0X21vdmUoJm1udC0+bW50X2ZzbGluaywgJmdyYXZleWFyZCk7CisJCWxpc3RfbW92ZSgmbW50LT5tbnRfZXhwaXJlLCAmZ3JhdmV5YXJkKTsKIAl9CiAKIAkvKgpAQCAtODYyLDYxICs5MTIsMTkgQEAKIAkgKiAtIGRpc3Bvc2Ugb2YgdGhlIGNvcnBzZQogCSAqLwogCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgewotCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9mc2xpbmspOwotCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9leHBpcmUpOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOwogCiAJCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKIAkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCiAJCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKLQkJaWYgKCFuYW1lc3BhY2UgfHwgYXRvbWljX3JlYWQoJm5hbWVzcGFjZS0+Y291bnQpIDw9IDApCisJCWlmICghbmFtZXNwYWNlIHx8ICFuYW1lc3BhY2UtPnJvb3QpCiAJCQljb250aW51ZTsKIAkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOwogCiAJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAkJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOwotCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOwotCi0JCS8qIGNoZWNrIHRoYXQgaXQgaXMgc3RpbGwgZGVhZDogdGhlIGNvdW50IHNob3VsZCBub3cgYmUgMiAtIGFzCi0JCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSB2ZnNtb3VudCBwYXJlbnQgYW5kIHRoZSBtbnRnZXQgYWJvdmUgKi8KLQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgewotCQkJc3RydWN0IHZmc21vdW50ICp4ZG1udDsKLQkJCXN0cnVjdCBkZW50cnkgKnhkZW50cnk7Ci0KLQkJCS8qIGRlbGV0ZSBmcm9tIHRoZSBuYW1lc3BhY2UgKi8KLQkJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOwotCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfY2hpbGQpOwotCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7Ci0JCQltbnQtPm1udF9tb3VudHBvaW50LT5kX21vdW50ZWQtLTsKLQotCQkJeGRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7Ci0JCQltbnQtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfcm9vdDsKLQkJCXhkbW50ID0gbW50LT5tbnRfcGFyZW50OwotCQkJbW50LT5tbnRfcGFyZW50ID0gbW50OwotCi0JCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7Ci0KLQkJCW1udHB1dCh4ZG1udCk7Ci0JCQlkcHV0KHhkZW50cnkpOwotCi0JCQkvKiBub3cgbGF5IGl0IHRvIHJlc3QgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmIG9uIHRoZQotCQkJICogc3VwZXJibG9jayAqLwotCQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9zYi0+c19hY3RpdmUpID09IDEpIHsKLQkJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCi0JCQkJbG9ja19rZXJuZWwoKTsKLQkJCQlEUVVPVF9PRkYobW50LT5tbnRfc2IpOwotCQkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7Ci0JCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJfQotCi0JCQltbnRwdXQobW50KTsKLQkJfSBlbHNlIHsKLQkJCS8qIHNvbWVvbmUgYnJvdWdodCBpdCBiYWNrIHRvIGxpZmUgd2hpbHN0IHdlIGRpZG4ndAotCQkJICogaGF2ZSBhbnkgbG9ja3MgaGVsZCBzbyByZXR1cm4gaXQgdG8gdGhlIGV4cGlyYXRpb24KLQkJCSAqIGxpc3QgKi8KLQkJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2ZzbGluaywgbW91bnRzKTsKLQkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJfQotCisJCWV4cGlyZV9tb3VudChtbnQsIG1vdW50cyk7CiAJCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAKIAkJbW50cHV0KG1udCk7CkBAIC0xNDQ5LDE2ICsxNDU3LDEyIEBACiAKIHZvaWQgX19wdXRfbmFtZXNwYWNlKHN0cnVjdCBuYW1lc3BhY2UgKm5hbWVzcGFjZSkKIHsKLQlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKLQorCXN0cnVjdCB2ZnNtb3VudCAqcm9vdCA9IG5hbWVzcGFjZS0+cm9vdDsKKwluYW1lc3BhY2UtPnJvb3QgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIAlkb3duX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobW50LCAmbmFtZXNwYWNlLT5saXN0LCBtbnRfbGlzdCkgewotCQltbnQtPm1udF9uYW1lc3BhY2UgPSBOVUxMOwotCX0KLQotCXVtb3VudF90cmVlKG5hbWVzcGFjZS0+cm9vdCk7CisJdW1vdW50X3RyZWUocm9vdCk7CiAJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOwogCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CiAJa2ZyZWUobmFtZXNwYWNlKTsKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2Rpci5jIGIvZnMvbmNwZnMvZGlyLmMKaW5kZXggMmRjMmQ4Ni4uYTlmN2E4YSAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZGlyLmMKKysrIGIvZnMvbmNwZnMvZGlyLmMKQEAgLTcwNSwxOCArNzA1LDYgQEAKIAkJRFBSSU5USygibmNwX2RvX3JlYWRkaXI6IGluaXQgZmFpbGVkLCBlcnI9JWRcbiIsIGVycik7CiAJCXJldHVybjsKIAl9Ci0jaWZkZWYgVVNFX09MRF9TTE9XX0RJUkVDVE9SWV9MSVNUSU5HCi0JZm9yICg7OykgewotCQllcnIgPSBuY3Bfc2VhcmNoX2Zvcl9maWxlX29yX3N1YmRpcihzZXJ2ZXIsICZzZXEsICZlbnRyeS5pKTsKLQkJaWYgKGVycikgewotCQkJRFBSSU5USygibmNwX2RvX3JlYWRkaXI6IHNlYXJjaCBmYWlsZWQsIGVycj0lZFxuIiwgZXJyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVudHJ5LnZvbHVtZSA9IGVudHJ5Lmkudm9sTnVtYmVyOwotCQlpZiAoIW5jcF9maWxsX2NhY2hlKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsLCAmZW50cnkpKQotCQkJYnJlYWs7Ci0JfQotI2Vsc2UKIAkvKiBXZSBNVVNUIE5PVCB1c2Ugc2VydmVyLT5idWZmZXJfc2l6ZSBoYW5kc2hha2VkIHdpdGggc2VydmVyIGlmIHdlIGFyZQogCSAgIHVzaW5nIFVEUCwgYXMgZm9yIFVEUCBzZXJ2ZXIgdXNlcyBtYXguIGJ1ZmZlciBzaXplIGRldGVybWluZWQgYnkKIAkgICBNVFUsIGFuZCBmb3IgVENQIHNlcnZlciB1c2VzIGhhcmR3aXJlZCB2YWx1ZSA2NUtCICg9PSA2NjU2MCBieXRlcykuIApAQCAtNzU0LDcgKzc0Miw2IEBACiAJCX0KIAl9IHdoaWxlIChtb3JlKTsKIAl2ZnJlZShidWYpOwotI2VuZGlmCiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMgYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMKaW5kZXggZTRlYjVlZC4uYzc1NWUxOCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jCisrKyBiL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuYwpAQCAtODQ1LDQ2ICs4NDUsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qIFNlYXJjaCBmb3IgZXZlcnl0aGluZyAqLwotaW50IG5jcF9zZWFyY2hfZm9yX2ZpbGVfb3Jfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCi0JCQkJICBzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlICpzZXEsCi0JCQkJICBzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QgKnRhcmdldCkKLXsKLQlpbnQgcmVzdWx0OwotCi0JbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOwotCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDMpOwkvKiBzdWJmdW5jdGlvbiAqLwotCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVtzZXEtPnZvbE51bWJlcl0pOwotCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiBkYXRhIHN0cmVhbSAoPz8/KSAqLwotCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGNwdV90b19sZTE2KDB4ODAwNikpOwkvKiBTZWFyY2ggYXR0cmlicyAqLwotCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBSSU1fQUxMKTsJCS8qIHJldHVybiBpbmZvIG1hc2sgKi8KLQluY3BfYWRkX21lbShzZXJ2ZXIsIHNlcSwgOSk7Ci0jaWZkZWYgQ09ORklHX05DUEZTX05GU19OUwotCWlmIChzZXJ2ZXItPm5hbWVfc3BhY2Vbc2VxLT52b2xOdW1iZXJdID09IE5XX05TX05GUykgewotCQluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogMCBieXRlIHBhdHRlcm4gKi8KLQl9IGVsc2UgCi0jZW5kaWYKLQl7Ci0JCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDIpOwkvKiAyIGJ5dGUgcGF0dGVybiAqLwotCQluY3BfYWRkX2J5dGUoc2VydmVyLCAweGZmKTsJLyogZm9sbG93aW5nIGlzIGEgd2lsZGNhcmQgKi8KLQkJbmNwX2FkZF9ieXRlKHNlcnZlciwgJyonKTsKLQl9Ci0JCi0JaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KSkgIT0gMCkKLQkJZ290byBvdXQ7Ci0JbWVtY3B5KHNlcSwgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAwKSwgc2l6ZW9mKCpzZXEpKTsKLQluY3BfZXh0cmFjdF9maWxlX2luZm8obmNwX3JlcGx5X2RhdGEoc2VydmVyLCAxMCksIHRhcmdldCk7Ci0KLQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOwotCQotCXJlc3VsdCA9IG5jcF9vYnRhaW5fbmZzX2luZm8oc2VydmVyLCB0YXJnZXQpOwotCXJldHVybiByZXN1bHQ7Ci0KLW91dDoKLQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KIGludCBuY3Bfc2VhcmNoX2Zvcl9maWxlc2V0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCiAJCQkgICBzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlICpzZXEsCiAJCQkgICBpbnQqIG1vcmUsCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmggYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmgKaW5kZXggMDVlYzJlOS4uOWU0ZGMzMCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oCisrKyBiL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaApAQCAtODcsOSArODcsNiBAQAogCiBpbnQgbmNwX2luaXRpYWxpemVfc2VhcmNoKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqLAogCQkgICAgICBzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlICp0YXJnZXQpOwotaW50IG5jcF9zZWFyY2hfZm9yX2ZpbGVfb3Jfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCi0JCQkgICAgICBzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlICpzZXEsCi0JCQkgICAgICBzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QgKnRhcmdldCk7CiBpbnQgbmNwX3NlYXJjaF9mb3JfZmlsZXNldChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAogCQkJICAgc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSAqc2VxLAogCQkJICAgaW50KiBtb3JlLCBpbnQqIGNudCwKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzYWNsLmMgYi9mcy9uZnMvbmZzM2FjbC5jCmluZGV4IGVlMzUzNmYuLjFiN2EzZWYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMzYWNsLmMKKysrIGIvZnMvbmZzL25mczNhY2wuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzYWNsLmg+CiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCU5GU0RCR19QUk9DCkBAIC01Myw5ICs1Myw5IEBACiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCWludCB0eXBlLCBlcnJvciA9IDA7CiAKLQlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfQUNMX0FDQ0VTUykgPT0gMCkKKwlpZiAoc3RyY21wKG5hbWUsIFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpID09IDApCiAJCXR5cGUgPSBBQ0xfVFlQRV9BQ0NFU1M7Ci0JZWxzZSBpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfQUNMX0RFRkFVTFQpID09IDApCisJZWxzZSBpZiAoc3RyY21wKG5hbWUsIFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSA9PSAwKQogCQl0eXBlID0gQUNMX1RZUEVfREVGQVVMVDsKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTgyLDkgKzgyLDkgQEAKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IHR5cGUsIGVycm9yOwogCi0JaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpID09IDApCisJaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKSA9PSAwKQogCQl0eXBlID0gQUNMX1RZUEVfQUNDRVNTOwotCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKSA9PSAwKQorCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgPT0gMCkKIAkJdHlwZSA9IEFDTF9UWVBFX0RFRkFVTFQ7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0xMDMsOSArMTAzLDkgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCWludCB0eXBlOwogCi0JaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpID09IDApCisJaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKSA9PSAwKQogCQl0eXBlID0gQUNMX1RZUEVfQUNDRVNTOwotCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKSA9PSAwKQorCWVsc2UgaWYgKHN0cmNtcChuYW1lLCBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgPT0gMCkKIAkJdHlwZSA9IEFDTF9UWVBFX0RFRkFVTFQ7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9mcy9uZnNkL01ha2VmaWxlIGIvZnMvbmZzZC9NYWtlZmlsZQppbmRleCA5ZjA0M2Y0Li5jZTM0MWRjIDEwMDY0NAotLS0gYS9mcy9uZnNkL01ha2VmaWxlCisrKyBiL2ZzL25mc2QvTWFrZWZpbGUKQEAgLTEwLDUgKzEwLDUgQEAKIG5mc2QtJChDT05GSUdfTkZTRF9WMykJKz0gbmZzM3Byb2MubyBuZnMzeGRyLm8KIG5mc2QtJChDT05GSUdfTkZTRF9WM19BQ0wpICs9IG5mczNhY2wubwogbmZzZC0kKENPTkZJR19ORlNEX1Y0KQkrPSBuZnM0cHJvYy5vIG5mczR4ZHIubyBuZnM0c3RhdGUubyBuZnM0aWRtYXAubyBcCi0JCQkgICBuZnM0YWNsLm8gbmZzNGNhbGxiYWNrLm8KKwkJCSAgIG5mczRhY2wubyBuZnM0Y2FsbGJhY2subyBuZnM0cmVjb3Zlci5vCiBuZnNkLW9ianMJCTo9ICQobmZzZC15KQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0YWNsLmMgYi9mcy9uZnNkL25mczRhY2wuYwppbmRleCAxMWViZjZjLi40YTIxMDU1IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRhY2wuYworKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiBzdGF0aWMgaW50IF9wb3NpeF90b19uZnN2NF9vbmUoc3RydWN0IHBvc2l4X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKiwgdW5zaWduZWQgaW50KTsKIHN0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpfbmZzdjRfdG9fcG9zaXhfb25lKHN0cnVjdCBuZnM0X2FjbCAqLCB1bnNpZ25lZCBpbnQpOwogaW50IG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOwotaW50IG5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKik7CitzdGF0aWMgaW50IG5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKik7CiAKIHN0cnVjdCBuZnM0X2FjbCAqCiBuZnM0X2FjbF9wb3NpeF90b19uZnN2NChzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICpkcGFjbCwKQEAgLTc3NSw3ICs3NzUsNyBAQAogCXJldHVybiBwYWNsOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIG5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBzdHJ1Y3QgbmZzNF9hY2wgKmRhY2wpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqaCwgKm47CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCA2MzQ0NjVlLi41ODNjMDcxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTU0LDcgKzU0LDYgQEAKIAogLyogZGVjbGFyYXRpb25zICovCiBzdGF0aWMgdm9pZCBuZnM0X2NiX251bGwoc3RydWN0IHJwY190YXNrICp0YXNrKTsKLWV4dGVybiBzcGlubG9ja190IHJlY2FsbF9sb2NrOwogCiAvKiBJbmRleCBvZiBwcmVkZWZpbmVkIExpbnV4IGNhbGxiYWNrIGNsaWVudCBvcGVyYXRpb25zICovCiAKQEAgLTMyOSwxMiArMzI4LDEyIEBACiAgICAgICAgIC5wX2J1ZnNpeiA9IE1BWChORlM0XyMjYXJndHlwZSMjX3N6LE5GUzRfIyNyZXN0eXBlIyNfc3opIDw8IDIsICBcCiB9CiAKLXN0cnVjdCBycGNfcHJvY2luZm8gICAgIG5mczRfY2JfcHJvY2VkdXJlc1tdID0geworc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8gICAgIG5mczRfY2JfcHJvY2VkdXJlc1tdID0gewogICAgIFBST0MoQ0JfTlVMTCwgICAgICBOVUxMLCAgICAgZW5jX2NiX251bGwsICAgICBkZWNfY2JfbnVsbCksCiAgICAgUFJPQyhDQl9SRUNBTEwsICAgIENPTVBPVU5ELCAgIGVuY19jYl9yZWNhbGwsICAgICAgZGVjX2NiX3JlY2FsbCksCiB9OwogCi1zdHJ1Y3QgcnBjX3ZlcnNpb24gICAgICAgICAgICAgIG5mc19jYl92ZXJzaW9uNCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gICAgICAgbmZzX2NiX3ZlcnNpb240ID0gewogICAgICAgICAubnVtYmVyICAgICAgICAgICAgICAgICA9IDEsCiAgICAgICAgIC5ucnByb2NzICAgICAgICAgICAgICAgID0gc2l6ZW9mKG5mczRfY2JfcHJvY2VkdXJlcykvc2l6ZW9mKG5mczRfY2JfcHJvY2VkdXJlc1swXSksCiAgICAgICAgIC5wcm9jcyAgICAgICAgICAgICAgICAgID0gbmZzNF9jYl9wcm9jZWR1cmVzCkBAIC0zNDgsNyArMzQ3LDcgQEAKIC8qCiAgKiBVc2UgdGhlIFNFVENMSUVOVElEIGNyZWRlbnRpYWwKICAqLwotc3RydWN0IHJwY19jcmVkICoKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NyZWQgKgogbmZzZDRfbG9va3VwY3JlZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgaW50IHRhc2tmbGFncykKIHsKICAgICAgICAgc3RydWN0IGF1dGhfY3JlZCBhY3JlZDsKQEAgLTM4Nyw5ICszODYsNyBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lWzMyXTsKIAlpbnQgc3RhdHVzOwogCi0JZHByaW50aygiTkZTRDogcHJvYmVfY2FsbGJhY2suIGNiX3BhcnNlZCAlZCBjYl9zZXQgJWRcbiIsCi0JCQljYi0+Y2JfcGFyc2VkLCBhdG9taWNfcmVhZCgmY2ItPmNiX3NldCkpOwotCWlmICghY2ItPmNiX3BhcnNlZCB8fCBhdG9taWNfcmVhZCgmY2ItPmNiX3NldCkpCisJaWYgKGF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSkKIAkJcmV0dXJuOwogCiAJLyogSW5pdGlhbGl6ZSBhZGRyZXNzICovCkBAIC00MjcsNyArNDI0LDcgQEAKIAkgKiBYWFggQVVUSF9VTklYIG9ubHkgLSBuZWVkIEFVVEhfR1NTLi4uLgogCSAqLwogCXNwcmludGYoaG9zdG5hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKLQljbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgaG9zdG5hbWUsIHByb2dyYW0sIDEsIFJQQ19BVVRIX1VOSVgpOworCWNsbnQgPSBycGNfbmV3X2NsaWVudCh4cHJ0LCBob3N0bmFtZSwgcHJvZ3JhbSwgMSwgUlBDX0FVVEhfVU5JWCk7CiAJaWYgKElTX0VSUihjbG50KSkgewogCQlkcHJpbnRrKCJORlNEOiBjb3VsZG4ndCBjcmVhdGUgY2FsbGJhY2sgY2xpZW50XG4iKTsKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0aWRtYXAuYyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKaW5kZXggNGJhNTQwOC4uNTYwNWEyNiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0aWRtYXAuYworKysgYi9mcy9uZnNkL25mczRpZG1hcC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAllbnRfaW5pdChuZXcsIGl0bSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBlbnRfcHV0KHN0cnVjdCBjYWNoZV9oZWFkICpjaCwgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCiB7CiAJaWYgKGNhY2hlX3B1dChjaCwgY2QpKSB7CkBAIC0xODYsNyArMTg2LDcgQEAKIHN0YXRpYyBpbnQgICAgICAgICBpZHRvbmFtZV9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICosIGNoYXIgKiwgaW50KTsKIHN0YXRpYyBzdHJ1Y3QgZW50ICppZHRvbmFtZV9sb29rdXAoc3RydWN0IGVudCAqLCBpbnQpOwogCi1zdHJ1Y3QgY2FjaGVfZGV0YWlsIGlkdG9uYW1lX2NhY2hlID0geworc3RhdGljIHN0cnVjdCBjYWNoZV9kZXRhaWwgaWR0b25hbWVfY2FjaGUgPSB7CiAJLmhhc2hfc2l6ZQk9IEVOVF9IQVNITUFYLAogCS5oYXNoX3RhYmxlCT0gaWR0b25hbWVfdGFibGUsCiAJLm5hbWUJCT0gIm5mczQuaWR0b25hbWUiLApAQCAtMjc3LDcgKzI3Nyw3IEBACiAJcmV0dXJuIGhhc2hfc3RyKGVudC0+bmFtZSwgRU5UX0hBU0hCSVRTKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG5hbWV0b2lkX3JlcXVlc3Qoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIHN0cnVjdCBjYWNoZV9oZWFkICpjaCwgY2hhciAqKmJwcCwKICAgICBpbnQgKmJsZW4pCiB7CkBAIC0zMTcsOSArMzE3LDkgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBlbnQgKm5hbWV0b2lkX2xvb2t1cChzdHJ1Y3QgZW50ICosIGludCk7Ci1pbnQgICAgICAgICAgICAgICAgbmFtZXRvaWRfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqLCBjaGFyICosIGludCk7CitzdGF0aWMgaW50ICAgICAgICAgbmFtZXRvaWRfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqLCBjaGFyICosIGludCk7CiAKLXN0cnVjdCBjYWNoZV9kZXRhaWwgbmFtZXRvaWRfY2FjaGUgPSB7CitzdGF0aWMgc3RydWN0IGNhY2hlX2RldGFpbCBuYW1ldG9pZF9jYWNoZSA9IHsKIAkuaGFzaF9zaXplCT0gRU5UX0hBU0hNQVgsCiAJLmhhc2hfdGFibGUJPSBuYW1ldG9pZF90YWJsZSwKIAkubmFtZQkJPSAibmZzNC5uYW1ldG9pZCIsCkBAIC0zMzAsNyArMzMwLDcgQEAKIAkud2Fybl9ub19saXN0ZW5lciA9IHdhcm5fbm9faWRtYXBkLAogfTsKIAotaW50CitzdGF0aWMgaW50CiBuYW1ldG9pZF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQogewogCXN0cnVjdCBlbnQgZW50LCAqcmVzOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0cHJvYy5jIGIvZnMvbmZzZC9uZnM0cHJvYy5jCmluZGV4IGU4MTU4NzQuLmUwOGVkYzEgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNHByb2MuYworKysgYi9mcy9uZnNkL25mczRwcm9jLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KQEAgLTE2OCwxMiArMTY5LDYgQEAKIAkJKGludClvcGVuLT5vcF9mbmFtZS5sZW4sIG9wZW4tPm9wX2ZuYW1lLmRhdGEsCiAJCW9wZW4tPm9wX3N0YXRlb3duZXIpOwogCi0JaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKLQkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKLQotCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQotCQlyZXR1cm4gbmZzZXJyX25vX2dyYWNlOwotCiAJLyogVGhpcyBjaGVjayByZXF1aXJlZCBieSBzcGVjLiAqLwogCWlmIChvcGVuLT5vcF9jcmVhdGUgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fTlVMTCkKIAkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKQEAgLTE5OCw2ICsxOTMsMTEgQEAKIAlpZiAoc3RhdHVzKQogCQlnb3RvIG91dDsKIAlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgorCQkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCQkJaWYgKG9wZW4tPm9wX2NyZWF0ZSkKKwkJCQlnb3RvIG91dDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgogCQkJLyoKIAkJCSAqICgxKSBzZXQgQ1VSUkVOVF9GSCB0byB0aGUgZmlsZSBiZWluZyBvcGVuZWQsCkBAIC0yMjAsNyArMjIwLDYgQEAKIAkJCWlmIChzdGF0dXMpCiAJCQkJZ290byBvdXQ7CiAJCQlicmVhazsKLQkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgogICAgICAgICAgICAgIAljYXNlIE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9QUkVWOgogCQkJcHJpbnRrKCJORlNEOiB1bnN1cHBvcnRlZCBPUEVOIGNsYWltIHR5cGUgJWRcbiIsCiAJCQkJb3Blbi0+b3BfY2xhaW1fdHlwZSk7CkBAIC00NzMsMjYgKzQ3MiwyNyBAQAogbmZzZDRfcmVhZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcmVhZCAqcmVhZCkKIHsKIAlpbnQgc3RhdHVzOwotCXN0cnVjdCBmaWxlICpmaWxwID0gTlVMTDsKIAogCS8qIG5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbiAtIHRoaXMgd2lsbCBiZSBkb25lIGluIG5mc2RfcmVhZCgpICovCiAKKwlyZWFkLT5yZF9maWxwID0gTlVMTDsKIAlpZiAocmVhZC0+cmRfb2Zmc2V0ID49IE9GRlNFVF9NQVgpCiAJCXJldHVybiBuZnNlcnJfaW52YWw7CiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAkvKiBjaGVjayBzdGF0ZWlkICovCiAJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChjdXJyZW50X2ZoLCAmcmVhZC0+cmRfc3RhdGVpZCwKLQkJCQkJQ0hFQ0tfRkggfCBSRF9TVEFURSwgJmZpbHApKSkgeworCQkJCUNIRUNLX0ZIIHwgUkRfU1RBVEUsICZyZWFkLT5yZF9maWxwKSkpIHsKIAkJZHByaW50aygiTkZTRDogbmZzZDRfcmVhZDogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7CiAJCWdvdG8gb3V0OwogCX0KKwlpZiAocmVhZC0+cmRfZmlscCkKKwkJZ2V0X2ZpbGUocmVhZC0+cmRfZmlscCk7CiAJc3RhdHVzID0gbmZzX29rOwogb3V0OgogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAJcmVhZC0+cmRfcnFzdHAgPSBycXN0cDsKIAlyZWFkLT5yZF9maHAgPSBjdXJyZW50X2ZoOwotCXJlYWQtPnJkX2ZpbHAgPSBmaWxwOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTUzMiw2ICs1MzIsOCBAQAogewogCWludCBzdGF0dXM7CiAKKwlpZiAobmZzNF9pbl9ncmFjZSgpKQorCQlyZXR1cm4gbmZzZXJyX2dyYWNlOwogCXN0YXR1cyA9IG5mc2RfdW5saW5rKHJxc3RwLCBjdXJyZW50X2ZoLCAwLCByZW1vdmUtPnJtX25hbWUsIHJlbW92ZS0+cm1fbmFtZWxlbik7CiAJaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKIAkJcmV0dXJuIG5mc2Vycl9ub3RkaXI7CkBAIC01NTAsNiArNTUyLDkgQEAKIAogCWlmICghc2F2ZV9maC0+ZmhfZGVudHJ5KQogCQlyZXR1cm4gc3RhdHVzOworCWlmIChuZnM0X2luX2dyYWNlKCkgJiYgIShzYXZlX2ZoLT5maF9leHBvcnQtPmV4X2ZsYWdzCisJCQkJCSYgTkZTRVhQX05PU1VCVFJFRUNIRUNLKSkKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKIAlzdGF0dXMgPSBuZnNkX3JlbmFtZShycXN0cCwgc2F2ZV9maCwgcmVuYW1lLT5ybl9zbmFtZSwKIAkJCSAgICAgcmVuYW1lLT5ybl9zbmFtZWxlbiwgY3VycmVudF9maCwKIAkJCSAgICAgcmVuYW1lLT5ybl90bmFtZSwgcmVuYW1lLT5ybl90bmFtZWxlbik7CkBAIC02MjQsNiArNjI5LDggQEAKIAkJZHByaW50aygiTkZTRDogbmZzZDRfd3JpdGU6IGNvdWxkbid0IHByb2Nlc3Mgc3RhdGVpZCFcbiIpOwogCQlnb3RvIG91dDsKIAl9CisJaWYgKGZpbHApCisJCWdldF9maWxlKGZpbHApOwogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAKIAl3cml0ZS0+d3JfYnl0ZXNfd3JpdHRlbiA9IHdyaXRlLT53cl9idWZsZW47CkBAIC02MzUsNiArNjQyLDggQEAKIAlzdGF0dXMgPSAgbmZzZF93cml0ZShycXN0cCwgY3VycmVudF9maCwgZmlscCwgd3JpdGUtPndyX29mZnNldCwKIAkJCXdyaXRlLT53cl92ZWMsIHdyaXRlLT53cl92bGVuLCB3cml0ZS0+d3JfYnVmbGVuLAogCQkJJndyaXRlLT53cl9ob3dfd3JpdHRlbik7CisJaWYgKGZpbHApCisJCWZwdXQoZmlscCk7CiAKIAlpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQogCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CkBAIC05MjMsNiArOTMyLDkgQEAKIAkJCW5mczRfcHV0X3N0YXRlb3duZXIocmVwbGF5X293bmVyKTsKIAkJCXJlcGxheV9vd25lciA9IE5VTEw7CiAJCX0KKwkJLyogWFhYIFVnaCwgd2UgbmVlZCB0byBnZXQgcmlkIG9mIHRoaXMga2luZCBvZiBzcGVjaWFsIGNhc2U6ICovCisJCWlmIChvcC0+b3BudW0gPT0gT1BfUkVBRCAmJiBvcC0+dS5yZWFkLnJkX2ZpbHApCisJCQlmcHV0KG9wLT51LnJlYWQucmRfZmlscCk7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRyZWNvdmVyLmMgYi9mcy9uZnNkL25mczRyZWNvdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlZDUwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzNHJlY292ZXIuYwpAQCAtMCwwICsxLDQyMSBAQAorLyoKKyogIGxpbnV4L2ZzL25mc2QvbmZzNHJlY292ZXIuYworKgorKiAgQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorKgorKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyogIGFyZSBtZXQ6CisqCisqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3hkcjQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisKKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZICAgICAgICAgICAgICAgIE5GU0REQkdfUFJPQworCisvKiBHbG9iYWxzICovCitzdGF0aWMgc3RydWN0IG5hbWVpZGF0YSByZWNfZGlyOworc3RhdGljIGludCByZWNfZGlyX2luaXQgPSAwOworCitzdGF0aWMgdm9pZAorbmZzNF9zYXZlX3VzZXIodWlkX3QgKnNhdmV1aWQsIGdpZF90ICpzYXZlZ2lkKQoreworCSpzYXZldWlkID0gY3VycmVudC0+ZnN1aWQ7CisJKnNhdmVnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwljdXJyZW50LT5mc3VpZCA9IDA7CisJY3VycmVudC0+ZnNnaWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9yZXNldF91c2VyKHVpZF90IHNhdmV1aWQsIGdpZF90IHNhdmVnaWQpCit7CisJY3VycmVudC0+ZnN1aWQgPSBzYXZldWlkOworCWN1cnJlbnQtPmZzZ2lkID0gc2F2ZWdpZDsKK30KKworc3RhdGljIHZvaWQKK21kNV90b19oZXgoY2hhciAqb3V0LCBjaGFyICptZDUpCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IG1kNVtpXTsKKworCQkqb3V0KysgPSAnMCcgKyAoKGMmMHhmMCk+PjQpICsgKGM+PTB4YTApKignYSctJzknLTEpOworCQkqb3V0KysgPSAnMCcgKyAoYyYweDBmKSArICgoYyYweDBmKT49MHgwYSkqKCdhJy0nOSctMSk7CisJfQorCSpvdXQgPSAnXDAnOworfQorCitpbnQKK25mczRfbWFrZV9yZWNfY2xpZG5hbWUoY2hhciAqZG5hbWUsIHN0cnVjdCB4ZHJfbmV0b2JqICpjbG5hbWUpCit7CisJc3RydWN0IHhkcl9uZXRvYmogY2tzdW07CisJc3RydWN0IGNyeXB0b190Zm0gKnRmbTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMV07CisJaW50IHN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKworCWRwcmludGsoIk5GU0Q6IG5mczRfbWFrZV9yZWNfY2xpZG5hbWUgZm9yICUuKnNcbiIsCisJCQljbG5hbWUtPmxlbiwgY2xuYW1lLT5kYXRhKTsKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfdGZtKCJtZDUiLCAwKTsKKwlpZiAodGZtID09IE5VTEwpCisJCWdvdG8gb3V0OworCWNrc3VtLmxlbiA9IGNyeXB0b190Zm1fYWxnX2RpZ2VzdHNpemUodGZtKTsKKwlja3N1bS5kYXRhID0ga21hbGxvYyhja3N1bS5sZW4sIEdGUF9LRVJORUwpOworCWlmIChja3N1bS5kYXRhID09IE5VTEwpCisgCQlnb3RvIG91dDsKKwljcnlwdG9fZGlnZXN0X2luaXQodGZtKTsKKworCXNnWzBdLnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoY2xuYW1lLT5kYXRhKTsKKwlzZ1swXS5vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShjbG5hbWUtPmRhdGEpOworCXNnWzBdLmxlbmd0aCA9IGNsbmFtZS0+bGVuOworCisJY3J5cHRvX2RpZ2VzdF91cGRhdGUodGZtLCBzZywgMSk7CisJY3J5cHRvX2RpZ2VzdF9maW5hbCh0Zm0sIGNrc3VtLmRhdGEpOworCisJbWQ1X3RvX2hleChkbmFtZSwgY2tzdW0uZGF0YSk7CisKKwlrZnJlZShja3N1bS5kYXRhKTsKKwlzdGF0dXMgPSBuZnNfb2s7CitvdXQ6CisJaWYgKHRmbSkKKwkJY3J5cHRvX2ZyZWVfdGZtKHRmbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X3N5bmNfcmVjX2Rpcih2b2lkKQoreworCWRvd24oJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbmZzZF9zeW5jX2RpcihyZWNfZGlyLmRlbnRyeSk7CisJdXAoJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7Cit9CisKK2ludAorbmZzZDRfY3JlYXRlX2NsaWRfZGlyKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCWNoYXIgKmRuYW1lID0gY2xwLT5jbF9yZWNkaXI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2NyZWF0ZV9jbGlkX2RpciBmb3IgXCIlc1wiXG4iLCBkbmFtZSk7CisKKwlpZiAoIXJlY19kaXJfaW5pdCB8fCBjbHAtPmNsX2ZpcnN0c3RhdGUpCisJCXJldHVybiAwOworCisJbmZzNF9zYXZlX3VzZXIoJnVpZCwgJmdpZCk7CisKKwkvKiBsb2NrIHRoZSBwYXJlbnQgKi8KKwlkb3duKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCisJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZG5hbWUsIHJlY19kaXIuZGVudHJ5LCBIRVhESVJfTEVOLTEpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJc3RhdHVzID0gLUVFWElTVDsKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2NyZWF0ZV9jbGlkX2RpcjogRElSRUNUT1JZIEVYSVNUU1xuIik7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisJc3RhdHVzID0gdmZzX21rZGlyKHJlY19kaXIuZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIFNfSVJXWFUpOworb3V0X3B1dDoKKwlkcHV0KGRlbnRyeSk7CitvdXRfdW5sb2NrOgorCXVwKCZyZWNfZGlyLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCWlmIChzdGF0dXMgPT0gMCkgeworCQljbHAtPmNsX2ZpcnN0c3RhdGUgPSAxOworCQluZnNkNF9zeW5jX3JlY19kaXIoKTsKKwl9CisJbmZzNF9yZXNldF91c2VyKHVpZCwgZ2lkKTsKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9jcmVhdGVfY2xpZF9kaXIgcmV0dXJucyAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit0eXBlZGVmIGludCAocmVjZGlyX2Z1bmMpKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTsKKworc3RydWN0IGRlbnRyeV9saXN0IHsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGRlbnRyeV9saXN0X2FyZyB7CisJc3RydWN0IGxpc3RfaGVhZCBkZW50cmllczsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7Cit9OworCitzdGF0aWMgaW50CituZnNkNF9idWlsZF9kZW50cnlsaXN0KHZvaWQgKmFyZywgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWxlbiwKKwkJbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBkZW50cnlfbGlzdF9hcmcgKmRsYSA9IGFyZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpkZW50cmllcyA9ICZkbGEtPmRlbnRyaWVzOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRsYS0+cGFyZW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5X2xpc3QgKmNoaWxkOworCisJaWYgKG5hbWUgJiYgaXNkb3RlbnQobmFtZSwgbmFtbGVuKSkKKwkJcmV0dXJuIG5mc19vazsKKwlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBwYXJlbnQsIG5hbWxlbik7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihkZW50cnkpOworCWNoaWxkID0ga21hbGxvYyhzaXplb2YoKmNoaWxkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNoaWxkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNoaWxkLT5kZW50cnkgPSBkZW50cnk7CisJbGlzdF9hZGQoJmNoaWxkLT5saXN0LCBkZW50cmllcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2xpc3RfcmVjX2RpcihzdHJ1Y3QgZGVudHJ5ICpkaXIsIHJlY2Rpcl9mdW5jICpmKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBkZW50cnlfbGlzdF9hcmcgZGxhID0geworCQkucGFyZW50ID0gZGlyLAorCX07CisJc3RydWN0IGxpc3RfaGVhZCAqZGVudHJpZXMgPSAmZGxhLmRlbnRyaWVzOworCXN0cnVjdCBkZW50cnlfbGlzdCAqY2hpbGQ7CisJdWlkX3QgdWlkOworCWdpZF90IGdpZDsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFyZWNfZGlyX2luaXQpCisJCXJldHVybiAwOworCisJbmZzNF9zYXZlX3VzZXIoJnVpZCwgJmdpZCk7CisKKwlmaWxwID0gZGVudHJ5X29wZW4oZGdldChkaXIpLCBtbnRnZXQocmVjX2Rpci5tbnQpLAorCQkJT19SRFdSKTsKKwlzdGF0dXMgPSBQVFJfRVJSKGZpbHApOworCWlmIChJU19FUlIoZmlscCkpCisJCWdvdG8gb3V0OworCUlOSVRfTElTVF9IRUFEKGRlbnRyaWVzKTsKKwlzdGF0dXMgPSB2ZnNfcmVhZGRpcihmaWxwLCBuZnNkNF9idWlsZF9kZW50cnlsaXN0LCAmZGxhKTsKKwlmcHV0KGZpbHApOworCXdoaWxlICghbGlzdF9lbXB0eShkZW50cmllcykpIHsKKwkJY2hpbGQgPSBsaXN0X2VudHJ5KGRlbnRyaWVzLT5uZXh0LCBzdHJ1Y3QgZGVudHJ5X2xpc3QsIGxpc3QpOworCQlzdGF0dXMgPSBmKGRpciwgY2hpbGQtPmRlbnRyeSk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwkJbGlzdF9kZWwoJmNoaWxkLT5saXN0KTsKKwkJZHB1dChjaGlsZC0+ZGVudHJ5KTsKKwkJa2ZyZWUoY2hpbGQpOworCX0KK291dDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoZGVudHJpZXMpKSB7CisJCWNoaWxkID0gbGlzdF9lbnRyeShkZW50cmllcy0+bmV4dCwgc3RydWN0IGRlbnRyeV9saXN0LCBsaXN0KTsKKwkJbGlzdF9kZWwoJmNoaWxkLT5saXN0KTsKKwkJZHB1dChjaGlsZC0+ZGVudHJ5KTsKKwkJa2ZyZWUoY2hpbGQpOworCX0KKwluZnM0X3Jlc2V0X3VzZXIodWlkLCBnaWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X3JlbW92ZV9jbGlkX2ZpbGUoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHN0YXR1czsKKworCWlmICghU19JU1JFRyhkaXItPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJcHJpbnRrKCJuZnNkNDogbm9uLWZpbGUgZm91bmQgaW4gY2xpZW50IHJlY292ZXJ5IGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwlzdGF0dXMgPSB2ZnNfdW5saW5rKGRpci0+ZF9pbm9kZSwgZGVudHJ5KTsKKwl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzZDRfY2xlYXJfY2xpZF9kaXIoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHN0YXR1czsKKworCS8qIEZvciBub3cgdGhpcyBkaXJlY3Rvcnkgc2hvdWxkIGFscmVhZHkgYmUgZW1wdHksIGJ1dCB3ZSBlbXB0eSBpdCBvZgorCSAqIGFueSByZWd1bGFyIGZpbGVzIGFueXdheSwganVzdCBpbiBjYXNlIHRoZSBkaXJlY3Rvcnkgd2FzIGNyZWF0ZWQgYnkKKwkgKiBhIGtlcm5lbCBmcm9tIHRoZSBmdXR1cmUuLi4uICovCisJbmZzZDRfbGlzdF9yZWNfZGlyKGRlbnRyeSwgbmZzZDRfcmVtb3ZlX2NsaWRfZmlsZSk7CisJZG93bigmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJc3RhdHVzID0gdmZzX3JtZGlyKGRpci0+ZF9pbm9kZSwgZGVudHJ5KTsKKwl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzZDRfdW5saW5rX2NsaWRfZGlyKGNoYXIgKm5hbWUsIGludCBuYW1sZW4pCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF91bmxpbmtfY2xpZF9kaXIuIG5hbWUgJS4qc1xuIiwgbmFtbGVuLCBuYW1lKTsKKworCWRvd24oJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcmVjX2Rpci5kZW50cnksIG5hbWxlbik7CisJdXAoJnJlY19kaXIuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoZGVudHJ5KTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJc3RhdHVzID0gLUVOT0VOVDsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJZ290byBvdXQ7CisKKwlzdGF0dXMgPSBuZnNkNF9jbGVhcl9jbGlkX2RpcihyZWNfZGlyLmRlbnRyeSwgZGVudHJ5KTsKK291dDoKKwlkcHV0KGRlbnRyeSk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAorbmZzZDRfcmVtb3ZlX2NsaWRfZGlyKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJaW50IHN0YXR1czsKKworCWlmICghcmVjX2Rpcl9pbml0IHx8ICFjbHAtPmNsX2ZpcnN0c3RhdGUpCisJCXJldHVybjsKKworCWNscC0+Y2xfZmlyc3RzdGF0ZSA9IDA7CisJbmZzNF9zYXZlX3VzZXIoJnVpZCwgJmdpZCk7CisJc3RhdHVzID0gbmZzZDRfdW5saW5rX2NsaWRfZGlyKGNscC0+Y2xfcmVjZGlyLCBIRVhESVJfTEVOLTEpOworCW5mczRfcmVzZXRfdXNlcih1aWQsIGdpZCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQluZnNkNF9zeW5jX3JlY19kaXIoKTsKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoIk5GU0Q6IEZhaWxlZCB0byByZW1vdmUgZXhwaXJlZCBjbGllbnQgc3RhdGUgZGlyZWN0b3J5IgorCQkJCSIgJS4qc1xuIiwgSEVYRElSX0xFTiwgY2xwLT5jbF9yZWNkaXIpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorcHVyZ2Vfb2xkKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJaW50IHN0YXR1czsKKworCWlmIChuZnM0X2hhc19yZWNsYWltZWRfc3RhdGUoY2hpbGQtPmRfbmFtZS5uYW1lKSkKKwkJcmV0dXJuIG5mc19vazsKKworCXN0YXR1cyA9IG5mc2Q0X2NsZWFyX2NsaWRfZGlyKHBhcmVudCwgY2hpbGQpOworCWlmIChzdGF0dXMpCisJCXByaW50aygiZmFpbGVkIHRvIHJlbW92ZSBjbGllbnQgcmVjb3ZlcnkgZGlyZWN0b3J5ICVzXG4iLAorCQkJCWNoaWxkLT5kX25hbWUubmFtZSk7CisJLyogS2VlcCB0cnlpbmcsIHN1Y2Nlc3Mgb3IgZmFpbHVyZTogKi8KKwlyZXR1cm4gbmZzX29rOworfQorCit2b2lkCituZnNkNF9yZWNkaXJfcHVyZ2Vfb2xkKHZvaWQpIHsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFyZWNfZGlyX2luaXQpCisJCXJldHVybjsKKwlzdGF0dXMgPSBuZnNkNF9saXN0X3JlY19kaXIocmVjX2Rpci5kZW50cnksIHB1cmdlX29sZCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQluZnNkNF9zeW5jX3JlY19kaXIoKTsKKwlpZiAoc3RhdHVzKQorCQlwcmludGsoIm5mc2Q0OiBmYWlsZWQgdG8gcHVyZ2Ugb2xkIGNsaWVudHMgZnJvbSByZWNvdmVyeSIKKwkJCSIgZGlyZWN0b3J5ICVzXG4iLCByZWNfZGlyLmRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorbG9hZF9yZWNkaXIoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKwlpZiAoY2hpbGQtPmRfbmFtZS5sZW4gIT0gSEVYRElSX0xFTiAtIDEpIHsKKwkJcHJpbnRrKCJuZnNkNDogaWxsZWdhbCBuYW1lICVzIGluIHJlY292ZXJ5IGRpcmVjdG9yeVxuIiwKKwkJCQljaGlsZC0+ZF9uYW1lLm5hbWUpOworCQkvKiBLZWVwIHRyeWluZzsgbWF5YmUgdGhlIG90aGVycyBhcmUgT0s6ICovCisJCXJldHVybiBuZnNfb2s7CisJfQorCW5mczRfY2xpZW50X3RvX3JlY2xhaW0oY2hpbGQtPmRfbmFtZS5uYW1lKTsKKwlyZXR1cm4gbmZzX29rOworfQorCitpbnQKK25mc2Q0X3JlY2Rpcl9sb2FkKHZvaWQpIHsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbmZzZDRfbGlzdF9yZWNfZGlyKHJlY19kaXIuZGVudHJ5LCBsb2FkX3JlY2Rpcik7CisJaWYgKHN0YXR1cykKKwkJcHJpbnRrKCJuZnNkNDogZmFpbGVkIGxvYWRpbmcgY2xpZW50cyBmcm9tIHJlY292ZXJ5IgorCQkJIiBkaXJlY3RvcnkgJXNcbiIsIHJlY19kaXIuZGVudHJ5LT5kX25hbWUubmFtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEhvbGQgcmVmZXJlbmNlIHRvIHRoZSByZWNvdmVyeSBkaXJlY3RvcnkuCisgKi8KKwordm9pZAorbmZzZDRfaW5pdF9yZWNkaXIoY2hhciAqcmVjX2Rpcm5hbWUpCit7CisJdWlkX3QJCQl1aWQgPSAwOworCWdpZF90CQkJZ2lkID0gMDsKKwlpbnQgCQkJc3RhdHVzOworCisJcHJpbnRrKCJORlNEOiBVc2luZyAlcyBhcyB0aGUgTkZTdjQgc3RhdGUgcmVjb3ZlcnkgZGlyZWN0b3J5XG4iLAorCQkJcmVjX2Rpcm5hbWUpOworCisJQlVHX09OKHJlY19kaXJfaW5pdCk7CisKKwluZnM0X3NhdmVfdXNlcigmdWlkLCAmZ2lkKTsKKworCXN0YXR1cyA9IHBhdGhfbG9va3VwKHJlY19kaXJuYW1lLCBMT09LVVBfRk9MTE9XLCAmcmVjX2Rpcik7CisJaWYgKHN0YXR1cyA9PSAtRU5PRU5UKQorCQlwcmludGsoIk5GU0Q6IHJlY292ZXJ5IGRpcmVjdG9yeSAlcyBkb2Vzbid0IGV4aXN0XG4iLAorCQkJCXJlY19kaXJuYW1lKTsKKworCWlmICghc3RhdHVzKQorCQlyZWNfZGlyX2luaXQgPSAxOworCW5mczRfcmVzZXRfdXNlcih1aWQsIGdpZCk7Cit9CisKK3ZvaWQKK25mc2Q0X3NodXRkb3duX3JlY2Rpcih2b2lkKQoreworCWlmICghcmVjX2Rpcl9pbml0KQorCQlyZXR1cm47CisJcmVjX2Rpcl9pbml0ID0gMDsKKwlwYXRoX3JlbGVhc2UoJnJlY19kaXIpOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggNzVlOGIxMy4uYjgzZjhmYiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC00OCwzOSArNDgsMzIgQEAKICNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyNC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAKICNkZWZpbmUgTkZTRERCR19GQUNJTElUWSAgICAgICAgICAgICAgICBORlNEREJHX1BST0MKIAogLyogR2xvYmFscyAqLwogc3RhdGljIHRpbWVfdCBsZWFzZV90aW1lID0gOTA7ICAgICAvKiBkZWZhdWx0IGxlYXNlIHRpbWUgKi8KLXN0YXRpYyB0aW1lX3Qgb2xkX2xlYXNlX3RpbWUgPSA5MDsgLyogcGFzdCBpbmNhcm5hdGlvbiBsZWFzZSB0aW1lICovCi1zdGF0aWMgdTMyIG5mczRfcmVjbGFpbV9pbml0ID0gMDsKLXRpbWVfdCBib290X3RpbWU7Ci1zdGF0aWMgdGltZV90IGdyYWNlX2VuZCA9IDA7CitzdGF0aWMgdGltZV90IHVzZXJfbGVhc2VfdGltZSA9IDkwOworc3RhdGljIHRpbWVfdCBib290X3RpbWU7CitzdGF0aWMgaW50IGluX2dyYWNlID0gMTsKIHN0YXRpYyB1MzIgY3VycmVudF9jbGllbnRpZCA9IDE7CiBzdGF0aWMgdTMyIGN1cnJlbnRfb3duZXJpZCA9IDE7CiBzdGF0aWMgdTMyIGN1cnJlbnRfZmlsZWlkID0gMTsKIHN0YXRpYyB1MzIgY3VycmVudF9kZWxlZ2lkID0gMTsKIHN0YXRpYyB1MzIgbmZzNF9pbml0Owotc3RhdGVpZF90IHplcm9zdGF0ZWlkOyAgICAgICAgICAgICAvKiBiaXRzIGFsbCAwICovCi1zdGF0ZWlkX3Qgb25lc3RhdGVpZDsgICAgICAgICAgICAgIC8qIGJpdHMgYWxsIDEgKi8KK3N0YXRpYyBzdGF0ZWlkX3QgemVyb3N0YXRlaWQ7ICAgICAgICAgICAgIC8qIGJpdHMgYWxsIDAgKi8KK3N0YXRpYyBzdGF0ZWlkX3Qgb25lc3RhdGVpZDsgICAgICAgICAgICAgIC8qIGJpdHMgYWxsIDEgKi8KIAotLyogZGVidWcgY291bnRlcnMgKi8KLXUzMiBsaXN0X2FkZF9wZXJmaWxlID0gMDsgCi11MzIgbGlzdF9kZWxfcGVyZmlsZSA9IDA7Ci11MzIgYWRkX3BlcmNsaWVudCA9IDA7Ci11MzIgZGVsX3BlcmNsaWVudCA9IDA7Ci11MzIgYWxsb2NfZmlsZSA9IDA7Ci11MzIgZnJlZV9maWxlID0gMDsKLXUzMiB2ZnNvcGVuID0gMDsKLXUzMiB2ZnNjbG9zZSA9IDA7Ci11MzIgYWxsb2NfZGVsZWdhdGlvbj0gMDsKLXUzMiBmcmVlX2RlbGVnYXRpb249IDA7CisjZGVmaW5lIFpFUk9fU1RBVEVJRChzdGF0ZWlkKSAoIW1lbWNtcCgoc3RhdGVpZCksICZ6ZXJvc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpKQorI2RlZmluZSBPTkVfU1RBVEVJRChzdGF0ZWlkKSAgKCFtZW1jbXAoKHN0YXRlaWQpLCAmb25lc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpKQogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotc3RydWN0IG5mczRfc3RhdGVpZCAqIGZpbmRfc3RhdGVpZChzdGF0ZWlkX3QgKnN0aWQsIGludCBmbGFncyk7CitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVpZCAqIGZpbmRfc3RhdGVpZChzdGF0ZWlkX3QgKnN0aWQsIGludCBmbGFncyk7CiBzdGF0aWMgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqIGZpbmRfZGVsZWdhdGlvbl9zdGF0ZWlkKHN0cnVjdCBpbm9kZSAqaW5vLCBzdGF0ZWlkX3QgKnN0aWQpOwogc3RhdGljIHZvaWQgcmVsZWFzZV9zdGF0ZWlkX2xvY2tvd25lcnMoc3RydWN0IG5mczRfc3RhdGVpZCAqb3Blbl9zdHApOworc3RhdGljIGNoYXIgdXNlcl9yZWNvdmVyeV9kaXJuYW1lW1BBVEhfTUFYXSA9ICIvdmFyL2xpYi9uZnMvdjRyZWNvdmVyeSI7CitzdGF0aWMgdm9pZCBuZnM0X3NldF9yZWNkaXIoY2hhciAqcmVjZGlyKTsKIAogLyogTG9ja2luZzoKICAqCkBAIC05MCw2ICs4MywxMSBAQAogICovCiBzdGF0aWMgREVDTEFSRV9NVVRFWChjbGllbnRfc2VtYSk7CiAKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnN0YXRlb3duZXJfc2xhYiA9IE5VTEw7CitzdGF0aWMga21lbV9jYWNoZV90ICpmaWxlX3NsYWIgPSBOVUxMOworc3RhdGljIGttZW1fY2FjaGVfdCAqc3RhdGVpZF9zbGFiID0gTlVMTDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRlbGVnX3NsYWIgPSBOVUxMOworCiB2b2lkCiBuZnM0X2xvY2tfc3RhdGUodm9pZCkKIHsKQEAgLTExOCwxNiArMTE2LDM2IEBACiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogc3RhdGljIHZvaWQgcmVsZWFzZV9zdGF0ZW93bmVyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCk7CiBzdGF0aWMgdm9pZCByZWxlYXNlX3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZ3MpOwotc3RhdGljIHZvaWQgcmVsZWFzZV9maWxlKHN0cnVjdCBuZnM0X2ZpbGUgKmZwKTsKIAogLyoKICAqIERlbGVnYXRpb24gc3RhdGUKICAqLwogCiAvKiByZWNhbGxfbG9jayBwcm90ZWN0cyB0aGUgZGVsX3JlY2FsbF9scnUgKi8KLXNwaW5sb2NrX3QgcmVjYWxsX2xvY2s7CitzdGF0aWMgc3BpbmxvY2tfdCByZWNhbGxfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGRlbF9yZWNhbGxfbHJ1OwogCitzdGF0aWMgdm9pZAorZnJlZV9uZnM0X2ZpbGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IG5mczRfZmlsZSAqZnAgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IG5mczRfZmlsZSwgZmlfcmVmKTsKKwlsaXN0X2RlbCgmZnAtPmZpX2hhc2gpOworCWlwdXQoZnAtPmZpX2lub2RlKTsKKwlrbWVtX2NhY2hlX2ZyZWUoZmlsZV9zbGFiLCBmcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcHV0X25mczRfZmlsZShzdHJ1Y3QgbmZzNF9maWxlICpmaSkKK3sKKwlrcmVmX3B1dCgmZmktPmZpX3JlZiwgZnJlZV9uZnM0X2ZpbGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dldF9uZnM0X2ZpbGUoc3RydWN0IG5mczRfZmlsZSAqZmkpCit7CisJa3JlZl9nZXQoJmZpLT5maV9yZWYpOworfQorCiBzdGF0aWMgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqCiBhbGxvY19pbml0X2RlbGVnKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHUzMiB0eXBlKQogewpAQCAtMTM2LDEzICsxNTQsMTQgQEAKIAlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmc3RwLT5zdF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsX2NhbGxiYWNrOwogCiAJZHByaW50aygiTkZTRCBhbGxvY19pbml0X2RlbGVnXG4iKTsKLQlpZiAoKGRwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfZGVsZWdhdGlvbiksCi0JCUdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWRwID0ga21lbV9jYWNoZV9hbGxvYyhkZWxlZ19zbGFiLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHAgPT0gTlVMTCkKIAkJcmV0dXJuIGRwOwotCUlOSVRfTElTVF9IRUFEKCZkcC0+ZGxfZGVsX3BlcmZpbGUpOwotCUlOSVRfTElTVF9IRUFEKCZkcC0+ZGxfZGVsX3BlcmNsbnQpOworCUlOSVRfTElTVF9IRUFEKCZkcC0+ZGxfcGVyZmlsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRwLT5kbF9wZXJjbG50KTsKIAlJTklUX0xJU1RfSEVBRCgmZHAtPmRsX3JlY2FsbF9scnUpOwogCWRwLT5kbF9jbGllbnQgPSBjbHA7CisJZ2V0X25mczRfZmlsZShmcCk7CiAJZHAtPmRsX2ZpbGUgPSBmcDsKIAlkcC0+ZGxfZmxvY2sgPSBOVUxMOwogCWdldF9maWxlKHN0cC0+c3RfdmZzX2ZpbGUpOwpAQCAtMTYwLDkgKzE3OSw4IEBACiAJCSAgICAgICAgY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX3NpemUpOwogCWRwLT5kbF90aW1lID0gMDsKIAlhdG9taWNfc2V0KCZkcC0+ZGxfY291bnQsIDEpOwotCWxpc3RfYWRkKCZkcC0+ZGxfZGVsX3BlcmZpbGUsICZmcC0+ZmlfZGVsX3BlcmZpbGUpOwotCWxpc3RfYWRkKCZkcC0+ZGxfZGVsX3BlcmNsbnQsICZjbHAtPmNsX2RlbF9wZXJjbG50KTsKLQlhbGxvY19kZWxlZ2F0aW9uKys7CisJbGlzdF9hZGQoJmRwLT5kbF9wZXJmaWxlLCAmZnAtPmZpX2RlbGVnYXRpb25zKTsKKwlsaXN0X2FkZCgmZHAtPmRsX3BlcmNsbnQsICZjbHAtPmNsX2RlbGVnYXRpb25zKTsKIAlyZXR1cm4gZHA7CiB9CiAKQEAgLTE3MSw4ICsxODksOCBAQAogewogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkcC0+ZGxfY291bnQpKSB7CiAJCWRwcmludGsoIk5GU0Q6IGZyZWVpbmcgZHAgJXBcbiIsZHApOwotCQlrZnJlZShkcCk7Ci0JCWZyZWVfZGVsZWdhdGlvbisrOworCQlwdXRfbmZzNF9maWxlKGRwLT5kbF9maWxlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGRlbGVnX3NsYWIsIGRwKTsKIAl9CiB9CiAKQEAgLTE5MywxNSArMjExLDE0IEBACiAJaWYgKGRwLT5kbF9mbG9jaykKIAkJc2V0bGVhc2UoZmlscCwgRl9VTkxDSywgJmRwLT5kbF9mbG9jayk7CiAJbmZzZF9jbG9zZShmaWxwKTsKLQl2ZnNjbG9zZSsrOwogfQogCiAvKiBDYWxsZWQgdW5kZXIgdGhlIHN0YXRlIGxvY2suICovCiBzdGF0aWMgdm9pZAogdW5oYXNoX2RlbGVnYXRpb24oc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApCiB7Ci0JbGlzdF9kZWxfaW5pdCgmZHAtPmRsX2RlbF9wZXJmaWxlKTsKLQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfZGVsX3BlcmNsbnQpOworCWxpc3RfZGVsX2luaXQoJmRwLT5kbF9wZXJmaWxlKTsKKwlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfcGVyY2xudCk7CiAJc3Bpbl9sb2NrKCZyZWNhbGxfbG9jayk7CiAJbGlzdF9kZWxfaW5pdCgmZHAtPmRsX3JlY2FsbF9scnUpOwogCXNwaW5fdW5sb2NrKCZyZWNhbGxfbG9jayk7CkBAIC0yMjAsOCArMjM3LDggQEAKIAogI2RlZmluZSBjbGllbnRpZF9oYXNodmFsKGlkKSBcCiAJKChpZCkgJiBDTElFTlRfSEFTSF9NQVNLKQotI2RlZmluZSBjbGllbnRzdHJfaGFzaHZhbChuYW1lLCBuYW1lbGVuKSBcCi0JKG9wYXF1ZV9oYXNodmFsKChuYW1lKSwgKG5hbWVsZW4pKSAmIENMSUVOVF9IQVNIX01BU0spCisjZGVmaW5lIGNsaWVudHN0cl9oYXNodmFsKG5hbWUpIFwKKwkob3BhcXVlX2hhc2h2YWwoKG5hbWUpLCA4KSAmIENMSUVOVF9IQVNIX01BU0spCiAvKgogICogcmVjbGFpbV9zdHJfaGFzaHRibFtdIGhvbGRzIGtub3duIGNsaWVudCBpbmZvIGZyb20gcHJldmlvdXMgcmVzZXQvcmVib290CiAgKiB1c2VkIGluIHJlYm9vdC9yZXNldCBsZWFzZSBncmFjZSBwZXJpb2QgcHJvY2Vzc2luZwpAQCAtMzMxLDExICszNDgsMTEgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZyZWFwbGlzdCk7CiAJc3Bpbl9sb2NrKCZyZWNhbGxfbG9jayk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjbHAtPmNsX2RlbF9wZXJjbG50KSkgewotCQlkcCA9IGxpc3RfZW50cnkoY2xwLT5jbF9kZWxfcGVyY2xudC5uZXh0LCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9kZWxfcGVyY2xudCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbHAtPmNsX2RlbGVnYXRpb25zKSkgeworCQlkcCA9IGxpc3RfZW50cnkoY2xwLT5jbF9kZWxlZ2F0aW9ucy5uZXh0LCBzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uLCBkbF9wZXJjbG50KTsKIAkJZHByaW50aygiTkZTRDogZXhwaXJlIGNsaWVudC4gZHAgJXAsIGZwICVwXG4iLCBkcCwKIAkJCQlkcC0+ZGxfZmxvY2spOwotCQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfZGVsX3BlcmNsbnQpOworCQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfcGVyY2xudCk7CiAJCWxpc3RfbW92ZSgmZHAtPmRsX3JlY2FsbF9scnUsICZyZWFwbGlzdCk7CiAJfQogCXNwaW5fdW5sb2NrKCZyZWNhbGxfbG9jayk7CkBAIC0zNDcsMjYgKzM2NCwyNiBAQAogCWxpc3RfZGVsKCZjbHAtPmNsX2lkaGFzaCk7CiAJbGlzdF9kZWwoJmNscC0+Y2xfc3RyaGFzaCk7CiAJbGlzdF9kZWwoJmNscC0+Y2xfbHJ1KTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfcGVyY2xpZW50KSkgewotCQlzb3AgPSBsaXN0X2VudHJ5KGNscC0+Y2xfcGVyY2xpZW50Lm5leHQsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIsIHNvX3BlcmNsaWVudCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbHAtPmNsX29wZW5vd25lcnMpKSB7CisJCXNvcCA9IGxpc3RfZW50cnkoY2xwLT5jbF9vcGVub3duZXJzLm5leHQsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIsIHNvX3BlcmNsaWVudCk7CiAJCXJlbGVhc2Vfc3RhdGVvd25lcihzb3ApOwogCX0KIAlwdXRfbmZzNF9jbGllbnQoY2xwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnM0X2NsaWVudCAqCi1jcmVhdGVfY2xpZW50KHN0cnVjdCB4ZHJfbmV0b2JqIG5hbWUpIHsKK2NyZWF0ZV9jbGllbnQoc3RydWN0IHhkcl9uZXRvYmogbmFtZSwgY2hhciAqcmVjZGlyKSB7CiAJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CiAKIAlpZiAoIShjbHAgPSBhbGxvY19jbGllbnQobmFtZSkpKQogCQlnb3RvIG91dDsKKwltZW1jcHkoY2xwLT5jbF9yZWNkaXIsIHJlY2RpciwgSEVYRElSX0xFTik7CiAJYXRvbWljX3NldCgmY2xwLT5jbF9jb3VudCwgMSk7CiAJYXRvbWljX3NldCgmY2xwLT5jbF9jYWxsYmFjay5jYl9zZXQsIDApOwotCWNscC0+Y2xfY2FsbGJhY2suY2JfcGFyc2VkID0gMDsKIAlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9pZGhhc2gpOwogCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3N0cmhhc2gpOwotCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3BlcmNsaWVudCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfZGVsX3BlcmNsbnQpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX29wZW5vd25lcnMpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX2RlbGVnYXRpb25zKTsKIAlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9scnUpOwogb3V0OgogCXJldHVybiBjbHA7CkBAIC0zOTIsMTEgKzQwOSw5IEBACiAJZ2V0X2dyb3VwX2luZm8odGFyZ2V0LT5jcl9ncm91cF9pbmZvKTsKIH0KIAotc3RhdGljIGludAotY21wX25hbWUoc3RydWN0IHhkcl9uZXRvYmogKm4xLCBzdHJ1Y3QgeGRyX25ldG9iaiAqbjIpIHsKLQlpZiAoIW4xIHx8ICFuMikKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuKChuMS0+bGVuID09IG4yLT5sZW4pICYmICFtZW1jbXAobjEtPmRhdGEsIG4yLT5kYXRhLCBuMi0+bGVuKSk7CitzdGF0aWMgaW5saW5lIGludAorc2FtZV9uYW1lKGNvbnN0IGNoYXIgKm4xLCBjb25zdCBjaGFyICpuMikgeworCXJldHVybiAwID09IG1lbWNtcChuMSwgbjIsIEhFWERJUl9MRU4pOwogfQogCiBzdGF0aWMgaW50CkBAIC00NDYsNyArNDYxLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGFkZF90b191bmNvbmZpcm1lZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgdW5zaWduZWQgaW50IHN0cmhhc2h2YWwpCiB7CiAJdW5zaWduZWQgaW50IGlkaGFzaHZhbDsKQEAgLTQ1OCw3ICs0NzMsNyBAQAogCWNscC0+Y2xfdGltZSA9IGdldF9zZWNvbmRzKCk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBtb3ZlX3RvX2NvbmZpcm1lZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKIHsKIAl1bnNpZ25lZCBpbnQgaWRoYXNodmFsID0gY2xpZW50aWRfaGFzaHZhbChjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKQEAgLTQ2OCw4ICs0ODMsNyBAQAogCWxpc3RfZGVsX2luaXQoJmNscC0+Y2xfc3RyaGFzaCk7CiAJbGlzdF9kZWxfaW5pdCgmY2xwLT5jbF9pZGhhc2gpOwogCWxpc3RfYWRkKCZjbHAtPmNsX2lkaGFzaCwgJmNvbmZfaWRfaGFzaHRibFtpZGhhc2h2YWxdKTsKLQlzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwoY2xwLT5jbF9uYW1lLmRhdGEsIAotCQkJY2xwLT5jbF9uYW1lLmxlbik7CisJc3RyaGFzaHZhbCA9IGNsaWVudHN0cl9oYXNodmFsKGNscC0+Y2xfcmVjZGlyKTsKIAlsaXN0X2FkZCgmY2xwLT5jbF9zdHJoYXNoLCAmY29uZl9zdHJfaGFzaHRibFtzdHJoYXNodmFsXSk7CiAJcmVuZXdfY2xpZW50KGNscCk7CiB9CkBAIC01MDAsNiArNTE0LDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9jbGllbnQgKgorZmluZF9jb25maXJtZWRfY2xpZW50X2J5X3N0cihjb25zdCBjaGFyICpkbmFtZSwgdW5zaWduZWQgaW50IGhhc2h2YWwpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscCwgJmNvbmZfc3RyX2hhc2h0YmxbaGFzaHZhbF0sIGNsX3N0cmhhc2gpIHsKKwkJaWYgKHNhbWVfbmFtZShjbHAtPmNsX3JlY2RpciwgZG5hbWUpKQorCQkJcmV0dXJuIGNscDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9jbGllbnQgKgorZmluZF91bmNvbmZpcm1lZF9jbGllbnRfYnlfc3RyKGNvbnN0IGNoYXIgKmRuYW1lLCB1bnNpZ25lZCBpbnQgaGFzaHZhbCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmdW5jb25mX3N0cl9oYXNodGJsW2hhc2h2YWxdLCBjbF9zdHJoYXNoKSB7CisJCWlmIChzYW1lX25hbWUoY2xwLT5jbF9yZWNkaXIsIGRuYW1lKSkKKwkJCXJldHVybiBjbHA7CisJfQorCXJldHVybiBOVUxMOworfQorCiAvKiBhIGhlbHBlciBmdW5jdGlvbiBmb3IgcGFyc2VfY2FsbGJhY2sgKi8KIHN0YXRpYyBpbnQKIHBhcnNlX29jdGV0KHVuc2lnbmVkIGludCAqbGVucCwgY2hhciAqKmFkZHJwKQpAQCAtNTM0LDcgKzU3Miw3IEBACiB9CiAKIC8qIHBhcnNlIGFuZCBzZXQgdGhlIHNldGNsaWVudGlkIGlwdjQgY2FsbGJhY2sgYWRkcmVzcyAqLwotaW50CitzdGF0aWMgaW50CiBwYXJzZV9pcHY0KHVuc2lnbmVkIGludCBhZGRyX2xlbiwgY2hhciAqYWRkcl92YWwsIHVuc2lnbmVkIGludCAqY2JhZGRycCwgdW5zaWduZWQgc2hvcnQgKmNicG9ydHApCiB7CiAJaW50IHRlbXAgPSAwOwpAQCAtNTcwLDcgKzYwOCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBnZW5fY2FsbGJhY2soc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2UpCiB7CiAJc3RydWN0IG5mczRfY2FsbGJhY2sgKmNiID0gJmNscC0+Y2xfY2FsbGJhY2s7CkBAIC01ODQsMTQgKzYyMiwxMiBAQAogCQlnb3RvIG91dF9lcnI7CiAJY2ItPmNiX3Byb2cgPSBzZS0+c2VfY2FsbGJhY2tfcHJvZzsKIAljYi0+Y2JfaWRlbnQgPSBzZS0+c2VfY2FsbGJhY2tfaWRlbnQ7Ci0JY2ItPmNiX3BhcnNlZCA9IDE7CiAJcmV0dXJuOwogb3V0X2VycjoKIAlwcmludGsoS0VSTl9JTkZPICJORlNEOiB0aGlzIGNsaWVudCAoY2xpZW50aWQgJTA4eC8lMDh4KSAiCiAJCSJ3aWxsIG5vdCByZWNlaXZlIGRlbGVnYXRpb25zXG4iLAogCQljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QsIGNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOwogCi0JY2ItPmNiX3BhcnNlZCA9IDA7CiAJcmV0dXJuOwogfQogCkBAIC02MzgsNTkgKzY3NCw0MyBAQAogCX07CiAJbmZzNF92ZXJpZmllcgkJY2x2ZXJpZmllciA9IHNldGNsaWQtPnNlX3ZlcmY7CiAJdW5zaWduZWQgaW50IAkJc3RyaGFzaHZhbDsKLQlzdHJ1Y3QgbmZzNF9jbGllbnQgKgljb25mLCAqIHVuY29uZiwgKiBuZXcsICogY2xwOworCXN0cnVjdCBuZnM0X2NsaWVudAkqY29uZiwgKnVuY29uZiwgKm5ldzsKIAlpbnQgCQkJc3RhdHVzOworCWNoYXIgICAgICAgICAgICAgICAgICAgIGRuYW1lW0hFWERJUl9MRU5dOwogCQogCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKIAlpZiAoIWNoZWNrX25hbWUoY2xuYW1lKSkKIAkJZ290byBvdXQ7CiAKKwlzdGF0dXMgPSBuZnM0X21ha2VfcmVjX2NsaWRuYW1lKGRuYW1lLCAmY2xuYW1lKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwogCS8qIAogCSAqIFhYWCBUaGUgRHVwbGljYXRlIFJlcXVlc3QgQ2FjaGUgKERSQykgaGFzIGJlZW4gY2hlY2tlZCAoPz8pCiAJICogV2UgZ2V0IGhlcmUgb24gYSBEUkMgbWlzcy4KIAkgKi8KIAotCXN0cmhhc2h2YWwgPSBjbGllbnRzdHJfaGFzaHZhbChjbG5hbWUuZGF0YSwgY2xuYW1lLmxlbik7CisJc3RyaGFzaHZhbCA9IGNsaWVudHN0cl9oYXNodmFsKGRuYW1lKTsKIAotCWNvbmYgPSBOVUxMOwogCW5mczRfbG9ja19zdGF0ZSgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmY29uZl9zdHJfaGFzaHRibFtzdHJoYXNodmFsXSwgY2xfc3RyaGFzaCkgewotCQlpZiAoIWNtcF9uYW1lKCZjbHAtPmNsX25hbWUsICZjbG5hbWUpKQotCQkJY29udGludWU7CisJY29uZiA9IGZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIoZG5hbWUsIHN0cmhhc2h2YWwpOworCWlmIChjb25mKSB7CiAJCS8qIAogCQkgKiBDQVNFIDA6CiAJCSAqIGNsbmFtZSBtYXRjaCwgY29uZmlybWVkLCBkaWZmZXJlbnQgcHJpbmNpcGFsCiAJCSAqIG9yIGRpZmZlcmVudCBpcF9hZGRyZXNzCiAJCSAqLwogCQlzdGF0dXMgPSBuZnNlcnJfY2xpZF9pbnVzZTsKLQkJaWYgKCFjbXBfY3JlZHMoJmNscC0+Y2xfY3JlZCwmcnFzdHAtPnJxX2NyZWQpKSB7CisJCWlmICghY21wX2NyZWRzKCZjb25mLT5jbF9jcmVkLCAmcnFzdHAtPnJxX2NyZWQpCisJCQkJfHwgY29uZi0+Y2xfYWRkciAhPSBpcF9hZGRyKSB7CiAJCQlwcmludGsoIk5GU0Q6IHNldGNsaWVudGlkOiBzdHJpbmcgaW4gdXNlIGJ5IGNsaWVudCIKIAkJCSIoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwKLQkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCQljb25mLT5jbF9jbGllbnRpZC5jbF9ib290LCBjb25mLT5jbF9jbGllbnRpZC5jbF9pZCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpZiAoY2xwLT5jbF9hZGRyICE9IGlwX2FkZHIpIHsgCi0JCQlwcmludGsoIk5GU0Q6IHNldGNsaWVudGlkOiBzdHJpbmcgaW4gdXNlIGJ5IGNsaWVudCIKLQkJCSIoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwKLQkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qIAotCSAJICogY2xfbmFtZSBtYXRjaCBmcm9tIGEgcHJldmlvdXMgU0VUQ0xJRU5USUQgb3BlcmF0aW9uCi0JIAkgKiBYWFggY2hlY2sgZm9yIGFkZGl0aW9uYWwgbWF0Y2hlcz8KLQkJICovCi0JCWNvbmYgPSBjbHA7Ci0JCWJyZWFrOwogCX0KLQl1bmNvbmYgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmdW5jb25mX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdLCBjbF9zdHJoYXNoKSB7Ci0JCWlmICghY21wX25hbWUoJmNscC0+Y2xfbmFtZSwgJmNsbmFtZSkpCi0JCQljb250aW51ZTsKLQkJLyogY2xfbmFtZSBtYXRjaCBmcm9tIGEgcHJldmlvdXMgU0VUQ0xJRU5USUQgb3BlcmF0aW9uICovCi0JCXVuY29uZiA9IGNscDsKLQkJYnJlYWs7Ci0JfQorCXVuY29uZiA9IGZpbmRfdW5jb25maXJtZWRfY2xpZW50X2J5X3N0cihkbmFtZSwgc3RyaGFzaHZhbCk7CiAJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOwogCWlmICghY29uZikgewogCQkvKiAKQEAgLTY5OSw3ICs3MTksOCBAQAogCQkgKi8KIAkJaWYgKHVuY29uZikKIAkJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKLQkJaWYgKCEobmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUpKSkKKwkJbmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUsIGRuYW1lKTsKKwkJaWYgKG5ldyA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAJCWNvcHlfdmVyZihuZXcsICZjbHZlcmlmaWVyKTsKIAkJbmV3LT5jbF9hZGRyID0gaXBfYWRkcjsKQEAgLTcyMiwxMiArNzQzLDE2IEBACiAJCSAqIG5mczRfY2xpZW50LCAgYnV0IHdpdGggdGhlIG5ldyBjYWxsYmFjayBpbmZvIGFuZCBhIAogCQkgKiBuZXcgY2xfY29uZmlybQogCQkgKi8KLQkJaWYgKCh1bmNvbmYpICYmIAotCQkgICAgY21wX3ZlcmYoJnVuY29uZi0+Y2xfdmVyaWZpZXIsICZjb25mLT5jbF92ZXJpZmllcikgJiYKLQkJICAgICBjbXBfY2xpZCgmdW5jb25mLT5jbF9jbGllbnRpZCwgJmNvbmYtPmNsX2NsaWVudGlkKSkgewotCQkJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKKwkJaWYgKHVuY29uZikgeworCQkJLyogTm90ZSB0aGlzIGlzIHJlbW92aW5nIHVuY29uZmlybWVkIHsqeCoqKn0sCisJCQkgKiB3aGljaCBpcyBzdHJvbmdlciB0aGFuIFJGQyByZWNvbW1lbmRlZCB7dnhjKip9LgorCQkJICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZXJlIGlzIGF0IG1vc3QKKwkJCSAqIG9uZSB7KngqKip9IGluIGVpdGhlciBsaXN0IGF0IGFueSB0aW1lLgorCQkJICovCisJCQlleHBpcmVfY2xpZW50KHVuY29uZik7CiAJCX0KLQkJaWYgKCEobmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUpKSkKKwkJbmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUsIGRuYW1lKTsKKwkJaWYgKG5ldyA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAJCWNvcHlfdmVyZihuZXcsJmNvbmYtPmNsX3ZlcmlmaWVyKTsKIAkJbmV3LT5jbF9hZGRyID0gaXBfYWRkcjsKQEAgLTc0NSw3ICs3NzAsOCBAQAogCQkgKiB1c2luZyBpbnB1dCBjbHZlcmlmaWVyLCBjbG5hbWUsIGFuZCBjYWxsYmFjayBpbmZvCiAJCSAqIGFuZCBnZW5lcmF0ZSBhIG5ldyBjbF9jbGllbnRpZCBhbmQgY2xfY29uZmlybS4KIAkJICovCi0JCWlmICghKG5ldyA9IGNyZWF0ZV9jbGllbnQoY2xuYW1lKSkpCisJCW5ldyA9IGNyZWF0ZV9jbGllbnQoY2xuYW1lLCBkbmFtZSk7CisJCWlmIChuZXcgPT0gTlVMTCkKIAkJCWdvdG8gb3V0OwogCQljb3B5X3ZlcmYobmV3LCZjbHZlcmlmaWVyKTsKIAkJbmV3LT5jbF9hZGRyID0gaXBfYWRkcjsKQEAgLTc3MSw3ICs3OTcsOCBAQAogCQkgKiBuZXcgY2xfdmVyaWZpZXIgYW5kIGEgbmV3IGNsX2NvbmZpcm0KIAkJICovCiAJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKLQkJaWYgKCEobmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUpKSkKKwkJbmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUsIGRuYW1lKTsKKwkJaWYgKG5ldyA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAJCWNvcHlfdmVyZihuZXcsJmNsdmVyaWZpZXIpOwogCQluZXctPmNsX2FkZHIgPSBpcF9hZGRyOwpAQCAtODA3LDcgKzgzNCw3IEBACiBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtICpzZXRjbGllbnRpZF9jb25maXJtKQogewogCXUzMiBpcF9hZGRyID0gcnFzdHAtPnJxX2FkZHIuc2luX2FkZHIuc19hZGRyOwotCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCAqY29uZiA9IE5VTEwsICp1bmNvbmYgPSBOVUxMOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY29uZiwgKnVuY29uZjsKIAluZnM0X3ZlcmlmaWVyIGNvbmZpcm0gPSBzZXRjbGllbnRpZF9jb25maXJtLT5zY19jb25maXJtOyAKIAljbGllbnRpZF90ICogY2xpZCA9ICZzZXRjbGllbnRpZF9jb25maXJtLT5zY19jbGllbnRpZDsKIAlpbnQgc3RhdHVzOwpAQCAtODIwLDEwMiArODQ3LDkxIEBACiAJICovCiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKLQljbHAgPSBmaW5kX2NvbmZpcm1lZF9jbGllbnQoY2xpZCk7Ci0JaWYgKGNscCkgewotCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7Ci0JCS8qIAotCQkgKiBGb3VuZCBhIHJlY29yZCBmb3IgdGhpcyBjbGllbnRpZC4gSWYgdGhlIElQIGFkZHJlc3NlcwotCQkgKiBkb24ndCBtYXRjaCwgcmV0dXJuIEVSUl9JTlZBTCBqdXN0IGFzIGlmIHRoZSByZWNvcmQgaGFkCi0JCSAqIG5vdCBiZWVuIGZvdW5kLgotCQkgKi8KLQkJaWYgKGNscC0+Y2xfYWRkciAhPSBpcF9hZGRyKSB7IAotCQkJcHJpbnRrKCJORlNEOiBzZXRjbGllbnRpZDogc3RyaW5nIGluIHVzZSBieSBjbGllbnQiCi0JCQkiKGNsaWVudGlkICUwOHgvJTA4eClcbiIsCi0JCQljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QsIGNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJY29uZiA9IGNscDsKLQl9Ci0JY2xwID0gZmluZF91bmNvbmZpcm1lZF9jbGllbnQoY2xpZCk7Ci0JaWYgKGNscCkgewotCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7Ci0JCWlmIChjbHAtPmNsX2FkZHIgIT0gaXBfYWRkcikgeyAKLQkJCXByaW50aygiTkZTRDogc2V0Y2xpZW50aWQ6IHN0cmluZyBpbiB1c2UgYnkgY2xpZW50IgotCQkJIihjbGllbnRpZCAlMDh4LyUwOHgpXG4iLAotCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9ib290LCBjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXVuY29uZiA9IGNscDsKLQl9Ci0JLyogQ0FTRSAxOiAKLQkqIHVuY29uZiByZWNvcmQgdGhhdCBtYXRjaGVzIGlucHV0IGNsaWVudGlkIGFuZCBpbnB1dCBjb25maXJtLgotCSogY29uZiByZWNvcmQgdGhhdCBtYXRjaGVzIGlucHV0IGNsaWVudGlkLgotCSogY29uZiAgYW5kIHVuY29uZiByZWNvcmRzIG1hdGNoIG5hbWVzLCB2ZXJpZmllcnMgCi0JKi8KKworCWNvbmYgPSBmaW5kX2NvbmZpcm1lZF9jbGllbnQoY2xpZCk7CisJdW5jb25mID0gZmluZF91bmNvbmZpcm1lZF9jbGllbnQoY2xpZCk7CisKKwlzdGF0dXMgPSBuZnNlcnJfY2xpZF9pbnVzZTsKKwlpZiAoY29uZiAmJiBjb25mLT5jbF9hZGRyICE9IGlwX2FkZHIpCisJCWdvdG8gb3V0OworCWlmICh1bmNvbmYgJiYgdW5jb25mLT5jbF9hZGRyICE9IGlwX2FkZHIpCisJCWdvdG8gb3V0OworCiAJaWYgKChjb25mICYmIHVuY29uZikgJiYgCiAJICAgIChjbXBfdmVyZigmdW5jb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpICYmCiAJICAgIChjbXBfdmVyZigmY29uZi0+Y2xfdmVyaWZpZXIsICZ1bmNvbmYtPmNsX3ZlcmlmaWVyKSkgJiYKLQkgICAgKGNtcF9uYW1lKCZjb25mLT5jbF9uYW1lLCZ1bmNvbmYtPmNsX25hbWUpKSAgJiYKKwkgICAgKHNhbWVfbmFtZShjb25mLT5jbF9yZWNkaXIsdW5jb25mLT5jbF9yZWNkaXIpKSAgJiYKIAkgICAgKCFjbXBfdmVyZigmY29uZi0+Y2xfY29uZmlybSwgJnVuY29uZi0+Y2xfY29uZmlybSkpKSB7CisJCS8qIENBU0UgMToKKwkJKiB1bmNvbmYgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBjbGllbnRpZCBhbmQgaW5wdXQgY29uZmlybS4KKwkJKiBjb25mIHJlY29yZCB0aGF0IG1hdGNoZXMgaW5wdXQgY2xpZW50aWQuCisJCSogY29uZiBhbmQgdW5jb25mIHJlY29yZHMgbWF0Y2ggbmFtZXMsIHZlcmlmaWVycworCQkqLwogCQlpZiAoIWNtcF9jcmVkcygmY29uZi0+Y2xfY3JlZCwgJnVuY29uZi0+Y2xfY3JlZCkpIAogCQkJc3RhdHVzID0gbmZzZXJyX2NsaWRfaW51c2U7CiAJCWVsc2UgewotCQkJZXhwaXJlX2NsaWVudChjb25mKTsKLQkJCWNscCA9IHVuY29uZjsKLQkJCW1vdmVfdG9fY29uZmlybWVkKHVuY29uZik7CisJCQkvKiBYWFg6IFdlIGp1c3QgdHVybiBvZmYgY2FsbGJhY2tzIHVudGlsIHdlIGNhbiBoYW5kbGUKKwkJCSAgKiBjaGFuZ2UgcmVxdWVzdCBjb3JyZWN0bHkuICovCisJCQlhdG9taWNfc2V0KCZjb25mLT5jbF9jYWxsYmFjay5jYl9zZXQsIDApOworCQkJZ2VuX2NvbmZpcm0oY29uZik7CisJCQluZnNkNF9yZW1vdmVfY2xpZF9kaXIodW5jb25mKTsKKwkJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKIAkJCXN0YXR1cyA9IG5mc19vazsKKwogCQl9Ci0JCWdvdG8gb3V0OwotCX0gCi0JLyogQ0FTRSAyOgotCSAqIGNvbmYgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBjbGllbnRpZC4KLQkgKiBpZiB1bmNvbmYgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBjbGllbnRpZCwgdGhlbiB1bmNvbmYtPmNsX25hbWUKLQkgKiBvciB1bmNvbmYtPmNsX3ZlcmlmaWVyIGRvbid0IG1hdGNoIHRoZSBjb25mIHJlY29yZC4KLQkgKi8KLQlpZiAoKGNvbmYgJiYgIXVuY29uZikgfHwgCisJfSBlbHNlIGlmICgoY29uZiAmJiAhdW5jb25mKSB8fAogCSAgICAoKGNvbmYgJiYgdW5jb25mKSAmJiAKIAkgICAgICghY21wX3ZlcmYoJmNvbmYtPmNsX3ZlcmlmaWVyLCAmdW5jb25mLT5jbF92ZXJpZmllcikgfHwKLQkgICAgICAhY21wX25hbWUoJmNvbmYtPmNsX25hbWUsICZ1bmNvbmYtPmNsX25hbWUpKSkpIHsKLQkJaWYgKCFjbXBfY3JlZHMoJmNvbmYtPmNsX2NyZWQsJnJxc3RwLT5ycV9jcmVkKSkgeworCSAgICAgICFzYW1lX25hbWUoY29uZi0+Y2xfcmVjZGlyLCB1bmNvbmYtPmNsX3JlY2RpcikpKSkgeworCQkvKiBDQVNFIDI6CisJCSAqIGNvbmYgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBjbGllbnRpZC4KKwkJICogaWYgdW5jb25mIHJlY29yZCBtYXRjaGVzIGlucHV0IGNsaWVudGlkLCB0aGVuCisJCSAqIHVuY29uZi0+Y2xfbmFtZSBvciB1bmNvbmYtPmNsX3ZlcmlmaWVyIGRvbid0IG1hdGNoIHRoZQorCQkgKiBjb25mIHJlY29yZC4KKwkJICovCisJCWlmICghY21wX2NyZWRzKCZjb25mLT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCkpCiAJCQlzdGF0dXMgPSBuZnNlcnJfY2xpZF9pbnVzZTsKLQkJfSBlbHNlIHsKLQkJCWNscCA9IGNvbmY7CisJCWVsc2UKIAkJCXN0YXR1cyA9IG5mc19vazsKLQkJfQotCQlnb3RvIG91dDsKLQl9Ci0JLyogQ0FTRSAzOgotCSAqIGNvbmYgcmVjb3JkIG5vdCBmb3VuZC4KLQkgKiB1bmNvbmYgcmVjb3JkIGZvdW5kLiAKLQkgKiB1bmNvbmYtPmNsX2NvbmZpcm0gbWF0Y2hlcyBpbnB1dCBjb25maXJtCi0JICovIAotCWlmICghY29uZiAmJiB1bmNvbmYgJiYgY21wX3ZlcmYoJnVuY29uZi0+Y2xfY29uZmlybSwgJmNvbmZpcm0pKSB7CisJfSBlbHNlIGlmICghY29uZiAmJiB1bmNvbmYKKwkJCSYmIGNtcF92ZXJmKCZ1bmNvbmYtPmNsX2NvbmZpcm0sICZjb25maXJtKSkgeworCQkvKiBDQVNFIDM6CisJCSAqIGNvbmYgcmVjb3JkIG5vdCBmb3VuZC4KKwkJICogdW5jb25mIHJlY29yZCBmb3VuZC4KKwkJICogdW5jb25mLT5jbF9jb25maXJtIG1hdGNoZXMgaW5wdXQgY29uZmlybQorCQkgKi8KIAkJaWYgKCFjbXBfY3JlZHMoJnVuY29uZi0+Y2xfY3JlZCwgJnJxc3RwLT5ycV9jcmVkKSkgewogCQkJc3RhdHVzID0gbmZzZXJyX2NsaWRfaW51c2U7CiAJCX0gZWxzZSB7Ci0JCQlzdGF0dXMgPSBuZnNfb2s7Ci0JCQljbHAgPSB1bmNvbmY7CisJCQl1bnNpZ25lZCBpbnQgaGFzaCA9CisJCQkJY2xpZW50c3RyX2hhc2h2YWwodW5jb25mLT5jbF9yZWNkaXIpOworCQkJY29uZiA9IGZpbmRfY29uZmlybWVkX2NsaWVudF9ieV9zdHIodW5jb25mLT5jbF9yZWNkaXIsCisJCQkJCQkJCQloYXNoKTsKKwkJCWlmIChjb25mKSB7CisJCQkJbmZzZDRfcmVtb3ZlX2NsaWRfZGlyKGNvbmYpOworCQkJCWV4cGlyZV9jbGllbnQoY29uZik7CisJCQl9CiAJCQltb3ZlX3RvX2NvbmZpcm1lZCh1bmNvbmYpOworCQkJY29uZiA9IHVuY29uZjsKKwkJCXN0YXR1cyA9IG5mc19vazsKIAkJfQotCQlnb3RvIG91dDsKLQl9Ci0JLyogQ0FTRSA0OgotCSAqIGNvbmYgcmVjb3JkIG5vdCBmb3VuZCwgb3IgaWYgY29uZiwgdGhlbiBjb25mLT5jbF9jb25maXJtIGRvZXMgbm90Ci0JICogbWF0Y2ggaW5wdXQgY29uZmlybS4KLQkgKiB1bmNvbmYgcmVjb3JkIG5vdCBmb3VuZCwgb3IgaWYgdW5jb25mLCB0aGVuIHVuY29uZi0+Y2xfY29uZmlybSAKLQkgKiBkb2VzIG5vdCBtYXRjaCBpbnB1dCBjb25maXJtLgotCSAqLwotCWlmICgoIWNvbmYgfHwgKGNvbmYgJiYgIWNtcF92ZXJmKCZjb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpKSAmJgotCSAgICAoIXVuY29uZiB8fCAodW5jb25mICYmICFjbXBfdmVyZigmdW5jb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpKSkgeworCX0gZWxzZSBpZiAoKCFjb25mIHx8IChjb25mICYmICFjbXBfdmVyZigmY29uZi0+Y2xfY29uZmlybSwgJmNvbmZpcm0pKSkKKwkgICAgJiYgKCF1bmNvbmYgfHwgKHVuY29uZiAmJiAhY21wX3ZlcmYoJnVuY29uZi0+Y2xfY29uZmlybSwKKwkJCQkgICAgCQkJCSZjb25maXJtKSkpKSB7CisJCS8qIENBU0UgNDoKKwkJICogY29uZiByZWNvcmQgbm90IGZvdW5kLCBvciBpZiBjb25mLCBjb25mLT5jbF9jb25maXJtIGRvZXMgbm90CisJCSAqIG1hdGNoIGlucHV0IGNvbmZpcm0uCisJCSAqIHVuY29uZiByZWNvcmQgbm90IGZvdW5kLCBvciBpZiB1bmNvbmYsIHVuY29uZi0+Y2xfY29uZmlybQorCQkgKiBkb2VzIG5vdCBtYXRjaCBpbnB1dCBjb25maXJtLgorCQkgKi8KIAkJc3RhdHVzID0gbmZzZXJyX3N0YWxlX2NsaWVudGlkOwotCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQkvKiBjaGVjayB0aGF0IHdlIGhhdmUgaGl0IG9uZSBvZiB0aGUgY2FzZXMuLi4qLworCQlzdGF0dXMgPSBuZnNlcnJfY2xpZF9pbnVzZTsKIAl9Ci0JLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGhpdCBvbmUgb2YgdGhlIGNhc2VzLi4uKi8KLQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7Ci0JZ290byBvdXQ7CiBvdXQ6CiAJaWYgKCFzdGF0dXMpCi0JCW5mc2Q0X3Byb2JlX2NhbGxiYWNrKGNscCk7CisJCW5mc2Q0X3Byb2JlX2NhbGxiYWNrKGNvbmYpOwogCW5mczRfdW5sb2NrX3N0YXRlKCk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTk2MSw2MCArOTc3LDY1IEBACiAJc3RydWN0IG5mczRfZmlsZSAqZnA7CiAJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBmaWxlX2hhc2h2YWwoaW5vKTsKIAotCWlmICgoZnAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9maWxlKSxHRlBfS0VSTkVMKSkpIHsKKwlmcCA9IGttZW1fY2FjaGVfYWxsb2MoZmlsZV9zbGFiLCBHRlBfS0VSTkVMKTsKKwlpZiAoZnApIHsKKwkJa3JlZl9pbml0KCZmcC0+ZmlfcmVmKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZwLT5maV9oYXNoKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmZwLT5maV9wZXJmaWxlKTsKLQkJSU5JVF9MSVNUX0hFQUQoJmZwLT5maV9kZWxfcGVyZmlsZSk7CisJCUlOSVRfTElTVF9IRUFEKCZmcC0+Zmlfc3RhdGVpZHMpOworCQlJTklUX0xJU1RfSEVBRCgmZnAtPmZpX2RlbGVnYXRpb25zKTsKIAkJbGlzdF9hZGQoJmZwLT5maV9oYXNoLCAmZmlsZV9oYXNodGJsW2hhc2h2YWxdKTsKIAkJZnAtPmZpX2lub2RlID0gaWdyYWIoaW5vKTsKIAkJZnAtPmZpX2lkID0gY3VycmVudF9maWxlaWQrKzsKLQkJYWxsb2NfZmlsZSsrOwogCQlyZXR1cm4gZnA7CiAJfQogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAotcmVsZWFzZV9hbGxfZmlsZXModm9pZCkKK25mc2Q0X2ZyZWVfc2xhYihrbWVtX2NhY2hlX3QgKipzbGFiKQogewotCWludCBpOwotCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOworCWludCBzdGF0dXM7CiAKLQlmb3IgKGk9MDtpPEZJTEVfSEFTSF9TSVpFO2krKykgewotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmZpbGVfaGFzaHRibFtpXSkpIHsKLQkJCWZwID0gbGlzdF9lbnRyeShmaWxlX2hhc2h0YmxbaV0ubmV4dCwgc3RydWN0IG5mczRfZmlsZSwgZmlfaGFzaCk7Ci0JCQkvKiB0aGlzIHNob3VsZCBuZXZlciBiZSBtb3JlIHRoYW4gb25jZS4uLiAqLwotCQkJaWYgKCFsaXN0X2VtcHR5KCZmcC0+ZmlfcGVyZmlsZSkgfHwgIWxpc3RfZW1wdHkoJmZwLT5maV9kZWxfcGVyZmlsZSkpIHsKLQkJCQlwcmludGsoIkVSUk9SOiByZWxlYXNlX2FsbF9maWxlczogZmlsZSAlcCBpcyBvcGVuLCBjcmVhdGluZyBkYW5nbGluZyBzdGF0ZSAhISFcbiIsZnApOwotCQkJfQotCQkJcmVsZWFzZV9maWxlKGZwKTsKLQkJfQotCX0KKwlpZiAoKnNsYWIgPT0gTlVMTCkKKwkJcmV0dXJuOworCXN0YXR1cyA9IGttZW1fY2FjaGVfZGVzdHJveSgqc2xhYik7CisJKnNsYWIgPSBOVUxMOworCVdBUk5fT04oc3RhdHVzKTsKIH0KIAota21lbV9jYWNoZV90ICpzdGF0ZW93bmVyX3NsYWIgPSBOVUxMOworc3RhdGljIHZvaWQKK25mc2Q0X2ZyZWVfc2xhYnModm9pZCkKK3sKKwluZnNkNF9mcmVlX3NsYWIoJnN0YXRlb3duZXJfc2xhYik7CisJbmZzZDRfZnJlZV9zbGFiKCZmaWxlX3NsYWIpOworCW5mc2Q0X2ZyZWVfc2xhYigmc3RhdGVpZF9zbGFiKTsKKwluZnNkNF9mcmVlX3NsYWIoJmRlbGVnX3NsYWIpOworfQogCiBzdGF0aWMgaW50CiBuZnNkNF9pbml0X3NsYWJzKHZvaWQpCiB7CiAJc3RhdGVvd25lcl9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc2Q0X3N0YXRlb3duZXJzIiwKIAkJCXNpemVvZihzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyKSwgMCwgMCwgTlVMTCwgTlVMTCk7Ci0JaWYgKHN0YXRlb3duZXJfc2xhYiA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIm5mc2Q0OiBvdXQgb2YgbWVtb3J5IHdoaWxlIGluaXRpYWxpemluZyBuZnN2NFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwlpZiAoc3RhdGVvd25lcl9zbGFiID09IE5VTEwpCisJCWdvdG8gb3V0X25vbWVtOworCWZpbGVfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZnNkNF9maWxlcyIsCisJCQlzaXplb2Yoc3RydWN0IG5mczRfZmlsZSksIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmIChmaWxlX3NsYWIgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9tZW07CisJc3RhdGVpZF9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc2Q0X3N0YXRlaWRzIiwKKwkJCXNpemVvZihzdHJ1Y3QgbmZzNF9zdGF0ZWlkKSwgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKHN0YXRlaWRfc2xhYiA9PSBOVUxMKQorCQlnb3RvIG91dF9ub21lbTsKKwlkZWxlZ19zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc2Q0X2RlbGVnYXRpb25zIiwKKwkJCXNpemVvZihzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uKSwgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKGRlbGVnX3NsYWIgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9tZW07CiAJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uZnNkNF9mcmVlX3NsYWJzKHZvaWQpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAoc3RhdGVvd25lcl9zbGFiKQotCQlzdGF0dXMgPSBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RhdGVvd25lcl9zbGFiKTsKLQlzdGF0ZW93bmVyX3NsYWIgPSBOVUxMOwotCUJVR19PTihzdGF0dXMpOworb3V0X25vbWVtOgorCW5mc2Q0X2ZyZWVfc2xhYnMoKTsKKwlkcHJpbnRrKCJuZnNkNDogb3V0IG9mIG1lbW9yeSB3aGlsZSBpbml0aWFsaXppbmcgbmZzdjRcbiIpOworCXJldHVybiAtRU5PTUVNOwogfQogCiB2b2lkCkBAIC0xMDU1LDE0ICsxMDc2LDEzIEBACiAJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29faWRoYXNoKTsKIAlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19zdHJoYXNoKTsKIAlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19wZXJjbGllbnQpOwotCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVybG9ja293bmVyKTsgIC8qIG5vdCB1c2VkICovCisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fc3RhdGVpZHMpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcnN0YXRlaWQpOyAgLyogbm90IHVzZWQgKi8KIAlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19jbG9zZV9scnUpOwogCXNvcC0+c29fdGltZSA9IDA7CiAJbGlzdF9hZGQoJnNvcC0+c29faWRoYXNoLCAmb3duZXJpZF9oYXNodGJsW2lkaGFzaHZhbF0pOwogCWxpc3RfYWRkKCZzb3AtPnNvX3N0cmhhc2gsICZvd25lcnN0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKLQlsaXN0X2FkZCgmc29wLT5zb19wZXJjbGllbnQsICZjbHAtPmNsX3BlcmNsaWVudCk7Ci0JYWRkX3BlcmNsaWVudCsrOworCWxpc3RfYWRkKCZzb3AtPnNvX3BlcmNsaWVudCwgJmNscC0+Y2xfb3Blbm93bmVycyk7CiAJc29wLT5zb19pc19vcGVuX293bmVyID0gMTsKIAlzb3AtPnNvX2lkID0gY3VycmVudF9vd25lcmlkKys7CiAJc29wLT5zb19jbGllbnQgPSBjbHA7CkBAIC0xMDgwLDEwICsxMTAwLDEwIEBACiB7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG9ja19zb3A7CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm9wZW5fc3RwLT5zdF9wZXJsb2Nrb3duZXIpKSB7Ci0JCWxvY2tfc29wID0gbGlzdF9lbnRyeShvcGVuX3N0cC0+c3RfcGVybG9ja293bmVyLm5leHQsCi0JCQkJc3RydWN0IG5mczRfc3RhdGVvd25lciwgc29fcGVybG9ja293bmVyKTsKLQkJLyogbGlzdF9kZWwoJm9wZW5fc3RwLT5zdF9wZXJsb2Nrb3duZXIpOyAgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm9wZW5fc3RwLT5zdF9sb2Nrb3duZXJzKSkgeworCQlsb2NrX3NvcCA9IGxpc3RfZW50cnkob3Blbl9zdHAtPnN0X2xvY2tvd25lcnMubmV4dCwKKwkJCQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyLCBzb19wZXJzdGF0ZWlkKTsKKwkJLyogbGlzdF9kZWwoJm9wZW5fc3RwLT5zdF9sb2Nrb3duZXJzKTsgICovCiAJCUJVR19PTihsb2NrX3NvcC0+c29faXNfb3Blbl9vd25lcik7CiAJCXJlbGVhc2Vfc3RhdGVvd25lcihsb2NrX3NvcCk7CiAJfQpAQCAtMTA5NiwxNCArMTExNiwxMiBAQAogCiAJbGlzdF9kZWwoJnNvcC0+c29faWRoYXNoKTsKIAlsaXN0X2RlbCgmc29wLT5zb19zdHJoYXNoKTsKLQlpZiAoc29wLT5zb19pc19vcGVuX293bmVyKSB7CisJaWYgKHNvcC0+c29faXNfb3Blbl9vd25lcikKIAkJbGlzdF9kZWwoJnNvcC0+c29fcGVyY2xpZW50KTsKLQkJZGVsX3BlcmNsaWVudCsrOwotCX0KLQlsaXN0X2RlbCgmc29wLT5zb19wZXJsb2Nrb3duZXIpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmc29wLT5zb19wZXJmaWxlc3RhdGUpKSB7Ci0JCXN0cCA9IGxpc3RfZW50cnkoc29wLT5zb19wZXJmaWxlc3RhdGUubmV4dCwgCi0JCQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkLCBzdF9wZXJmaWxlc3RhdGUpOworCWxpc3RfZGVsKCZzb3AtPnNvX3BlcnN0YXRlaWQpOworCXdoaWxlICghbGlzdF9lbXB0eSgmc29wLT5zb19zdGF0ZWlkcykpIHsKKwkJc3RwID0gbGlzdF9lbnRyeShzb3AtPnNvX3N0YXRlaWRzLm5leHQsCisJCQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkLCBzdF9wZXJzdGF0ZW93bmVyKTsKIAkJaWYgKHNvcC0+c29faXNfb3Blbl9vd25lcikKIAkJCXJlbGVhc2Vfc3RhdGVpZChzdHAsIE9QRU5fU1RBVEUpOwogCQllbHNlCkBAIC0xMTI1LDE0ICsxMTQzLDE0IEBACiAJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc29wLT5zb19pZCwgZnAtPmZpX2lkKTsKIAogCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X2hhc2gpOwotCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X3BlcmZpbGVzdGF0ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfcGVybG9ja293bmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJzdGF0ZW93bmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9sb2Nrb3duZXJzKTsKIAlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJmaWxlKTsKIAlsaXN0X2FkZCgmc3RwLT5zdF9oYXNoLCAmc3RhdGVpZF9oYXNodGJsW2hhc2h2YWxdKTsKLQlsaXN0X2FkZCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUsICZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7Ci0JbGlzdF9hZGRfcGVyZmlsZSsrOwotCWxpc3RfYWRkKCZzdHAtPnN0X3BlcmZpbGUsICZmcC0+ZmlfcGVyZmlsZSk7CisJbGlzdF9hZGQoJnN0cC0+c3RfcGVyc3RhdGVvd25lciwgJnNvcC0+c29fc3RhdGVpZHMpOworCWxpc3RfYWRkKCZzdHAtPnN0X3BlcmZpbGUsICZmcC0+Zmlfc3RhdGVpZHMpOwogCXN0cC0+c3Rfc3RhdGVvd25lciA9IHNvcDsKKwlnZXRfbmZzNF9maWxlKGZwKTsKIAlzdHAtPnN0X2ZpbGUgPSBmcDsKIAlzdHAtPnN0X3N0YXRlaWQuc2lfYm9vdCA9IGJvb3RfdGltZTsKIAlzdHAtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID0gc29wLT5zb19pZDsKQEAgLTExNDIsNiArMTE2MCw3IEBACiAJc3RwLT5zdF9kZW55X2JtYXAgPSAwOwogCV9fc2V0X2JpdChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MsICZzdHAtPnN0X2FjY2Vzc19ibWFwKTsKIAlfX3NldF9iaXQob3Blbi0+b3Bfc2hhcmVfZGVueSwgJnN0cC0+c3RfZGVueV9ibWFwKTsKKwlzdHAtPnN0X29wZW5zdHAgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTE1MCwzMCArMTE2OSwyMCBAQAogCXN0cnVjdCBmaWxlICpmaWxwID0gc3RwLT5zdF92ZnNfZmlsZTsKIAogCWxpc3RfZGVsKCZzdHAtPnN0X2hhc2gpOwotCWxpc3RfZGVsX3BlcmZpbGUrKzsKIAlsaXN0X2RlbCgmc3RwLT5zdF9wZXJmaWxlKTsKLQlsaXN0X2RlbCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUpOworCWxpc3RfZGVsKCZzdHAtPnN0X3BlcnN0YXRlb3duZXIpOwogCWlmIChmbGFncyAmIE9QRU5fU1RBVEUpIHsKIAkJcmVsZWFzZV9zdGF0ZWlkX2xvY2tvd25lcnMoc3RwKTsKIAkJc3RwLT5zdF92ZnNfZmlsZSA9IE5VTEw7CiAJCW5mc2RfY2xvc2UoZmlscCk7Ci0JCXZmc2Nsb3NlKys7CiAJfSBlbHNlIGlmIChmbGFncyAmIExPQ0tfU1RBVEUpCiAJCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCAoZmxfb3duZXJfdCkgc3RwLT5zdF9zdGF0ZW93bmVyKTsKLQlrZnJlZShzdHApOworCXB1dF9uZnM0X2ZpbGUoc3RwLT5zdF9maWxlKTsKKwlrbWVtX2NhY2hlX2ZyZWUoc3RhdGVpZF9zbGFiLCBzdHApOwogCXN0cCA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkCi1yZWxlYXNlX2ZpbGUoc3RydWN0IG5mczRfZmlsZSAqZnApCi17Ci0JZnJlZV9maWxlKys7Ci0JbGlzdF9kZWwoJmZwLT5maV9oYXNoKTsKLQlpcHV0KGZwLT5maV9pbm9kZSk7Ci0Ja2ZyZWUoZnApOwotfQkKLQotdm9pZAogbW92ZV90b19jbG9zZV9scnUoc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wKQogewogCWRwcmludGsoIk5GU0Q6IG1vdmVfdG9fY2xvc2VfbHJ1IG5mczRfc3RhdGVvd25lciAlcFxuIiwgc29wKTsKQEAgLTExODMsMTEgKzExOTIsMTAgQEAKIAlzb3AtPnNvX3RpbWUgPSBnZXRfc2Vjb25kcygpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogcmVsZWFzZV9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIGludCBmbGFnKQogewogCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IHN0cC0+c3Rfc3RhdGVvd25lcjsKLQlzdHJ1Y3QgbmZzNF9maWxlICpmcCA9IHN0cC0+c3RfZmlsZTsKIAogCWRwcmludGsoIk5GU0Q6IHJlbGVhc2Vfc3RhdGVfb3duZXJcbiIpOwogCXJlbGVhc2Vfc3RhdGVpZChzdHAsIGZsYWcpOwpAQCAtMTE5NiwxMiArMTIwNCw4IEBACiAJICogcmVsZWFzZWQgYnkgdGhlIGxhdW5kcm9tYXQgc2VydmljZSBhZnRlciB0aGUgbGVhc2UgcGVyaW9kCiAJICogdG8gZW5hYmxlIHVzIHRvIGhhbmRsZSBDTE9TRSByZXBsYXkKIAkgKi8KLQlpZiAoc29wLT5zb19jb25maXJtZWQgJiYgbGlzdF9lbXB0eSgmc29wLT5zb19wZXJmaWxlc3RhdGUpKQorCWlmIChzb3AtPnNvX2NvbmZpcm1lZCAmJiBsaXN0X2VtcHR5KCZzb3AtPnNvX3N0YXRlaWRzKSkKIAkJbW92ZV90b19jbG9zZV9scnUoc29wKTsKLQkvKiB1bnVzZWQgbmZzNF9maWxlJ3MgYXJlIHJlbGVzZWVkLiBYWFggc2xhYiBjYWNoZT8gKi8KLQlpZiAobGlzdF9lbXB0eSgmZnAtPmZpX3BlcmZpbGUpICYmIGxpc3RfZW1wdHkoJmZwLT5maV9kZWxfcGVyZmlsZSkpIHsKLQkJcmVsZWFzZV9maWxlKGZwKTsKLQl9CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEyMzEsOCArMTIzNSwxMCBAQAogCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmcCwgJmZpbGVfaGFzaHRibFtoYXNodmFsXSwgZmlfaGFzaCkgewotCQlpZiAoZnAtPmZpX2lub2RlID09IGlubykKKwkJaWYgKGZwLT5maV9pbm9kZSA9PSBpbm8pIHsKKwkJCWdldF9uZnM0X2ZpbGUoZnApOwogCQkJcmV0dXJuIGZwOworCQl9CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtMTI0MCw3ICsxMjQ2LDcgQEAKICNkZWZpbmUgVEVTVF9BQ0NFU1MoeCkgKCh4ID4gMCB8fCB4IDwgNCk/MTowKQogI2RlZmluZSBURVNUX0RFTlkoeCkgKCh4ID49IDAgfHwgeCA8IDUpPzE6MCkKIAotdm9pZAorc3RhdGljIHZvaWQKIHNldF9hY2Nlc3ModW5zaWduZWQgaW50ICphY2Nlc3MsIHVuc2lnbmVkIGxvbmcgYm1hcCkgewogCWludCBpOwogCkBAIC0xMjUxLDcgKzEyNTcsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHNldF9kZW55KHVuc2lnbmVkIGludCAqZGVueSwgdW5zaWduZWQgbG9uZyBibWFwKSB7CiAJaW50IGk7CiAKQEAgLTEyNzcsMjUgKzEyODMsMzAgQEAKICAqIENhbGxlZCB0byBjaGVjayBkZW55IHdoZW4gUkVBRCB3aXRoIGFsbCB6ZXJvIHN0YXRlaWQgb3IKICAqIFdSSVRFIHdpdGggYWxsIHplcm8gb3IgYWxsIG9uZSBzdGF0ZWlkCiAgKi8KLWludAorc3RhdGljIGludAogbmZzNF9zaGFyZV9jb25mbGljdChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1bnNpZ25lZCBpbnQgZGVueV90eXBlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOwogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKwlpbnQgcmV0OwogCiAJZHByaW50aygiTkZTRDogbmZzNF9zaGFyZV9jb25mbGljdFxuIik7CiAKIAlmcCA9IGZpbmRfZmlsZShpbm8pOwotCWlmIChmcCkgeworCWlmICghZnApCisJCXJldHVybiBuZnNfb2s7CisJcmV0ID0gbmZzZXJyX2xvY2tlZDsKIAkvKiBTZWFyY2ggZm9yIGNvbmZsaWN0aW5nIHNoYXJlIHJlc2VydmF0aW9ucyAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cCwgJmZwLT5maV9wZXJmaWxlLCBzdF9wZXJmaWxlKSB7Ci0JCQlpZiAodGVzdF9iaXQoZGVueV90eXBlLCAmc3RwLT5zdF9kZW55X2JtYXApIHx8Ci0JCQkgICAgdGVzdF9iaXQoTkZTNF9TSEFSRV9ERU5ZX0JPVEgsICZzdHAtPnN0X2RlbnlfYm1hcCkpCi0JCQkJcmV0dXJuIG5mc2Vycl9zaGFyZV9kZW5pZWQ7Ci0JCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cCwgJmZwLT5maV9zdGF0ZWlkcywgc3RfcGVyZmlsZSkgeworCQlpZiAodGVzdF9iaXQoZGVueV90eXBlLCAmc3RwLT5zdF9kZW55X2JtYXApIHx8CisJCSAgICB0ZXN0X2JpdChORlM0X1NIQVJFX0RFTllfQk9USCwgJnN0cC0+c3RfZGVueV9ibWFwKSkKKwkJCWdvdG8gb3V0OwogCX0KLQlyZXR1cm4gbmZzX29rOworCXJldCA9IG5mc19vazsKK291dDoKKwlwdXRfbmZzNF9maWxlKGZwKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTE0MjcsNyArMTQzOCw3IEBACiAJCXJldHVybiAtRUFHQUlOOwogfQogCi1zdHJ1Y3QgbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgbmZzZF9sZWFzZV9tbmdfb3BzID0geworc3RhdGljIHN0cnVjdCBsb2NrX21hbmFnZXJfb3BlcmF0aW9ucyBuZnNkX2xlYXNlX21uZ19vcHMgPSB7CiAJLmZsX2JyZWFrID0gbmZzZF9icmVha19kZWxlZ19jYiwKIAkuZmxfcmVsZWFzZV9wcml2YXRlID0gbmZzZF9yZWxlYXNlX2RlbGVnX2NiLAogCS5mbF9jb3B5X2xvY2sgPSBuZnNkX2NvcHlfbG9ja19kZWxlZ19jYiwKQEAgLTE0NzMsNyArMTQ4NCw3IEBACiAJaWYgKHNvcCkgewogCQlvcGVuLT5vcF9zdGF0ZW93bmVyID0gc29wOwogCQkvKiBjaGVjayBmb3IgcmVwbGF5ICovCi0JCWlmIChvcGVuLT5vcF9zZXFpZCA9PSBzb3AtPnNvX3NlcWlkKXsKKwkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQgLSAxKXsKIAkJCWlmIChzb3AtPnNvX3JlcGxheS5ycF9idWZsZW4pCiAJCQkJcmV0dXJuIE5GU0VSUl9SRVBMQVlfTUU7CiAJCQllbHNlIHsKQEAgLTE0ODgsNyArMTQ5OSw3IEBACiAJCQkJZ290byByZW5ldzsKIAkJCX0KIAkJfSBlbHNlIGlmIChzb3AtPnNvX2NvbmZpcm1lZCkgewotCQkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQgKyAxKQorCQkJaWYgKG9wZW4tPm9wX3NlcWlkID09IHNvcC0+c29fc2VxaWQpCiAJCQkJZ290byByZW5ldzsKIAkJCXN0YXR1cyA9IG5mc2Vycl9iYWRfc2VxaWQ7CiAJCQlnb3RvIG91dDsKQEAgLTE1MjEsMTEgKzE1MzIsNTQgQEAKIAlzdGF0dXMgPSBuZnNfb2s7CiAJcmVuZXdfY2xpZW50KHNvcC0+c29fY2xpZW50KTsKIG91dDoKLQlpZiAoc3RhdHVzICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQotCQlzdGF0dXMgPSBuZnNlcnJfcmVjbGFpbV9iYWQ7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK25mczRfY2hlY2tfZGVsZWdtb2RlKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwLCBpbnQgZmxhZ3MpCit7CisJaWYgKChmbGFncyAmIFdSX1NUQVRFKSAmJiAoZHAtPmRsX3R5cGUgPT0gTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQpKQorCQlyZXR1cm4gbmZzZXJyX29wZW5tb2RlOworCWVsc2UKKwkJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKgorZmluZF9kZWxlZ2F0aW9uX2ZpbGUoc3RydWN0IG5mczRfZmlsZSAqZnAsIHN0YXRlaWRfdCAqc3RpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHAsICZmcC0+ZmlfZGVsZWdhdGlvbnMsIGRsX3BlcmZpbGUpIHsKKwkJaWYgKGRwLT5kbF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCA9PSBzdGlkLT5zaV9zdGF0ZW93bmVyaWQpCisJCQlyZXR1cm4gZHA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CituZnM0X2NoZWNrX2RlbGVnKHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbiwKKwkJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqKmRwKQoreworCWludCBmbGFnczsKKwlpbnQgc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOworCisJKmRwID0gZmluZF9kZWxlZ2F0aW9uX2ZpbGUoZnAsICZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkKTsKKwlpZiAoKmRwID09IE5VTEwpCisJCWdvdG8gb3V0OworCWZsYWdzID0gb3Blbi0+b3Bfc2hhcmVfYWNjZXNzID09IE5GUzRfU0hBUkVfQUNDRVNTX1JFQUQgPworCQkJCQkJUkRfU1RBVEUgOiBXUl9TVEFURTsKKwlzdGF0dXMgPSBuZnM0X2NoZWNrX2RlbGVnbW9kZSgqZHAsIGZsYWdzKTsKKwlpZiAoc3RhdHVzKQorCQkqZHAgPSBOVUxMOworb3V0OgorCWlmIChvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIpCisJCXJldHVybiBuZnNfb2s7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQgPSAxOworCXJldHVybiBuZnNfb2s7Cit9CisKIHN0YXRpYyBpbnQKIG5mczRfY2hlY2tfb3BlbihzdHJ1Y3QgbmZzNF9maWxlICpmcCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4sIHN0cnVjdCBuZnM0X3N0YXRlaWQgKipzdHBwKQogewpAQCAtMTUzMyw3ICsxNTg3LDcgQEAKIAlpbnQgc3RhdHVzID0gbmZzZXJyX3NoYXJlX2RlbmllZDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPSBvcGVuLT5vcF9zdGF0ZW93bmVyOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmZwLT5maV9wZXJmaWxlLCBzdF9wZXJmaWxlKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmZwLT5maV9zdGF0ZWlkcywgc3RfcGVyZmlsZSkgewogCQkvKiBpZ25vcmUgbG9jayBvd25lcnMgKi8KIAkJaWYgKGxvY2FsLT5zdF9zdGF0ZW93bmVyLT5zb19pc19vcGVuX293bmVyID09IDApCiAJCQljb250aW51ZTsKQEAgLTE1NDksMjUgKzE2MDMsMzcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X3N0YXRlaWQgKgorbmZzNF9hbGxvY19zdGF0ZWlkKHZvaWQpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2Moc3RhdGVpZF9zbGFiLCBHRlBfS0VSTkVMKTsKK30KKwogc3RhdGljIGludAogbmZzNF9uZXdfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCwKKwkJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAsCiAJCXN0cnVjdCBzdmNfZmggKmN1cl9maCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKLQlpbnQgc3RhdHVzOwogCi0Jc3RwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfc3RhdGVpZCksIEdGUF9LRVJORUwpOworCXN0cCA9IG5mczRfYWxsb2Nfc3RhdGVpZCgpOwogCWlmIChzdHAgPT0gTlVMTCkKIAkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKIAotCXN0YXR1cyA9IG5mc2Rfb3BlbihycXN0cCwgY3VyX2ZoLCBTX0lGUkVHLCBmbGFncywgJnN0cC0+c3RfdmZzX2ZpbGUpOwotCWlmIChzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfZHJvcGl0KQotCQkJc3RhdHVzID0gbmZzZXJyX2p1a2Vib3g7Ci0JCWtmcmVlKHN0cCk7Ci0JCXJldHVybiBzdGF0dXM7CisJaWYgKGRwKSB7CisJCWdldF9maWxlKGRwLT5kbF92ZnNfZmlsZSk7CisJCXN0cC0+c3RfdmZzX2ZpbGUgPSBkcC0+ZGxfdmZzX2ZpbGU7CisJfSBlbHNlIHsKKwkJaW50IHN0YXR1czsKKwkJc3RhdHVzID0gbmZzZF9vcGVuKHJxc3RwLCBjdXJfZmgsIFNfSUZSRUcsIGZsYWdzLAorCQkJCSZzdHAtPnN0X3Zmc19maWxlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfZHJvcGl0KQorCQkJCXN0YXR1cyA9IG5mc2Vycl9qdWtlYm94OworCQkJa21lbV9jYWNoZV9mcmVlKHN0YXRlaWRfc2xhYiwgc3RwKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KIAl9Ci0JdmZzb3BlbisrOwogCSpzdHBwID0gc3RwOwogCXJldHVybiAwOwogfQpAQCAtMTYxOSwxOCArMTY4NSwxMSBAQAogfQogCiAKLS8qIGRlY3JlbWVudCBzZXFpZCBvbiBzdWNjZXNzZnVsIHJlY2xhaW0sIGl0IHdpbGwgYmUgYnVtcGVkIGluIGVuY29kZV9vcGVuICovCiBzdGF0aWMgdm9pZAotbmZzNF9zZXRfY2xhaW1fcHJldihzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbiwgaW50ICpzdGF0dXMpCituZnM0X3NldF9jbGFpbV9wcmV2KHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQogewotCWlmIChvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykgewotCQlpZiAoKnN0YXR1cykKLQkJCSpzdGF0dXMgPSBuZnNlcnJfcmVjbGFpbV9iYWQ7Ci0JCWVsc2UgewotCQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY29uZmlybWVkID0gMTsKLQkJCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3NlcWlkLS07Ci0JCX0KLQl9CisJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fY29uZmlybWVkID0gMTsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsX2ZpcnN0c3RhdGUgPSAxOwogfQogCiAvKgpAQCAtMTY0NiwxNCArMTcwNSwzMCBAQAogCWludCBzdGF0dXMsIGZsYWcgPSAwOwogCiAJZmxhZyA9IE5GUzRfT1BFTl9ERUxFR0FURV9OT05FOwotCWlmIChvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9OVUxMCi0JICAgICB8fCAhYXRvbWljX3JlYWQoJmNiLT5jYl9zZXQpIHx8ICFzb3AtPnNvX2NvbmZpcm1lZCkKLQkJZ290byBvdXQ7Ci0KLQlpZiAob3Blbi0+b3Bfc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUpCi0JCWZsYWcgPSBORlM0X09QRU5fREVMRUdBVEVfV1JJVEU7Ci0JZWxzZQotCQlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQ7CisJb3Blbi0+b3BfcmVjYWxsID0gMDsKKwlzd2l0Y2ggKG9wZW4tPm9wX2NsYWltX3R5cGUpIHsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVM6CisJCQlpZiAoIWF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSkKKwkJCQlvcGVuLT5vcF9yZWNhbGwgPSAxOworCQkJZmxhZyA9IG9wZW4tPm9wX2RlbGVnYXRlX3R5cGU7CisJCQlpZiAoZmxhZyA9PSBORlM0X09QRU5fREVMRUdBVEVfTk9ORSkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgorCQkJLyogTGV0J3Mgbm90IGdpdmUgb3V0IGFueSBkZWxlZ2F0aW9ucyB0aWxsIGV2ZXJ5b25lJ3MKKwkJCSAqIGhhZCB0aGUgY2hhbmNlIHRvIHJlY2xhaW0gdGhlaXJzLi4uLiAqLworCQkJaWYgKG5mczRfaW5fZ3JhY2UoKSkKKwkJCQlnb3RvIG91dDsKKwkJCWlmICghYXRvbWljX3JlYWQoJmNiLT5jYl9zZXQpIHx8ICFzb3AtPnNvX2NvbmZpcm1lZCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkKKwkJCQlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX1dSSVRFOworCQkJZWxzZQorCQkJCWZsYWcgPSBORlM0X09QRU5fREVMRUdBVEVfUkVBRDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJfQogCiAJZHAgPSBhbGxvY19pbml0X2RlbGVnKHNvcC0+c29fY2xpZW50LCBzdHAsIGZoLCBmbGFnKTsKIAlpZiAoZHAgPT0gTlVMTCkgewpAQCAtMTY4Nyw2ICsxNzYyLDEwIEBACiAJICAgICAgICAgICAgIGRwLT5kbF9zdGF0ZWlkLnNpX2ZpbGVpZCwKIAkgICAgICAgICAgICAgZHAtPmRsX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CiBvdXQ6CisJaWYgKG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTCisJCQkmJiBmbGFnID09IE5GUzRfT1BFTl9ERUxFR0FURV9OT05FCisJCQkmJiBvcGVuLT5vcF9kZWxlZ2F0ZV90eXBlICE9IE5GUzRfT1BFTl9ERUxFR0FURV9OT05FKQorCQlwcmludGsoIk5GU0Q6IFdBUk5JTkc6IHJlZnVzaW5nIGRlbGVnYXRpb24gcmVjbGFpbVxuIik7CiAJb3Blbi0+b3BfZGVsZWdhdGVfdHlwZSA9IGZsYWc7CiB9CiAKQEAgLTE2OTksOCArMTc3OCwxNSBAQAogCXN0cnVjdCBuZnM0X2ZpbGUgKmZwID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlubyA9IGN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAgPSBOVUxMOworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gTlVMTDsKIAlpbnQgc3RhdHVzOwogCisJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKKworCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQorCQlyZXR1cm4gbmZzZXJyX25vX2dyYWNlOworCiAJc3RhdHVzID0gbmZzZXJyX2ludmFsOwogCWlmICghVEVTVF9BQ0NFU1Mob3Blbi0+b3Bfc2hhcmVfYWNjZXNzKSB8fCAhVEVTVF9ERU5ZKG9wZW4tPm9wX3NoYXJlX2RlbnkpKQogCQlnb3RvIG91dDsKQEAgLTE3MTMsNyArMTc5OSwxMyBAQAogCWlmIChmcCkgewogCQlpZiAoKHN0YXR1cyA9IG5mczRfY2hlY2tfb3BlbihmcCwgb3BlbiwgJnN0cCkpKQogCQkJZ290byBvdXQ7CisJCXN0YXR1cyA9IG5mczRfY2hlY2tfZGVsZWcoZnAsIG9wZW4sICZkcCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKIAl9IGVsc2UgeworCQlzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJCWlmIChvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIpCisJCQlnb3RvIG91dDsKIAkJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOwogCQlmcCA9IGFsbG9jX2luaXRfZmlsZShpbm8pOwogCQlpZiAoZnAgPT0gTlVMTCkKQEAgLTE3MjksNiArMTgyMSw3IEBACiAJCXN0YXR1cyA9IG5mczRfdXBncmFkZV9vcGVuKHJxc3RwLCBjdXJyZW50X2ZoLCBzdHAsIG9wZW4pOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CisJCXVwZGF0ZV9zdGF0ZWlkKCZzdHAtPnN0X3N0YXRlaWQpOwogCX0gZWxzZSB7CiAJCS8qIFN0YXRlaWQgd2FzIG5vdCBmb3VuZCwgdGhpcyBpcyBhIG5ldyBPUEVOICovCiAJCWludCBmbGFncyA9IDA7CkBAIC0xNzM2LDcgKzE4MjksOCBAQAogCQkJZmxhZ3MgPSBNQVlfV1JJVEU7CiAJCWVsc2UKIAkJCWZsYWdzID0gTUFZX1JFQUQ7Ci0JCWlmICgoc3RhdHVzID0gbmZzNF9uZXdfb3BlbihycXN0cCwgJnN0cCwgY3VycmVudF9maCwgZmxhZ3MpKSkKKwkJc3RhdHVzID0gbmZzNF9uZXdfb3BlbihycXN0cCwgJnN0cCwgZHAsIGN1cnJlbnRfZmgsIGZsYWdzKTsKKwkJaWYgKHN0YXR1cykKIAkJCWdvdG8gb3V0OwogCQlpbml0X3N0YXRlaWQoc3RwLCBmcCwgb3Blbik7CiAJCXN0YXR1cyA9IG5mc2Q0X3RydW5jYXRlKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKQEAgLTE3NTksMTIgKzE4NTMsMTAgQEAKIAkgICAgICAgICAgICBzdHAtPnN0X3N0YXRlaWQuc2lfYm9vdCwgc3RwLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCwKIAkgICAgICAgICAgICBzdHAtPnN0X3N0YXRlaWQuc2lfZmlsZWlkLCBzdHAtPnN0X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CiBvdXQ6Ci0JLyogdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2xlYW4gdXAgdW51c2VkIHN0YXRlICovCi0JaWYgKGZwICYmIGxpc3RfZW1wdHkoJmZwLT5maV9wZXJmaWxlKSAmJiBsaXN0X2VtcHR5KCZmcC0+ZmlfZGVsX3BlcmZpbGUpKQotCQlyZWxlYXNlX2ZpbGUoZnApOwotCi0JLyogQ0xBSU1fUFJFVklPVVMgaGFzIGRpZmZlcmVudCBlcnJvciByZXR1cm5zICovCi0JbmZzNF9zZXRfY2xhaW1fcHJldihvcGVuLCAmc3RhdHVzKTsKKwlpZiAoZnApCisJCXB1dF9uZnM0X2ZpbGUoZnApOworCWlmIChzdGF0dXMgPT0gMCAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJbmZzNF9zZXRfY2xhaW1fcHJldihvcGVuKTsKIAkvKgogCSogVG8gZmluaXNoIHRoZSBvcGVuIHJlc3BvbnNlLCB3ZSBqdXN0IG5lZWQgdG8gc2V0IHRoZSByZmxhZ3MuCiAJKi8KQEAgLTE3NzUsNiArMTg2Nyw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpsYXVuZHJ5X3dxOwogc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBsYXVuZHJvbWF0X3dvcms7CiBzdGF0aWMgdm9pZCBsYXVuZHJvbWF0X21haW4odm9pZCAqKTsKIHN0YXRpYyBERUNMQVJFX1dPUksobGF1bmRyb21hdF93b3JrLCBsYXVuZHJvbWF0X21haW4sIE5VTEwpOwpAQCAtMTgwMCw3ICsxODkzLDcgQEAKIAl9CiAJcmVuZXdfY2xpZW50KGNscCk7CiAJc3RhdHVzID0gbmZzZXJyX2NiX3BhdGhfZG93bjsKLQlpZiAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfZGVsX3BlcmNsbnQpCisJaWYgKCFsaXN0X2VtcHR5KCZjbHAtPmNsX2RlbGVnYXRpb25zKQogCQkJJiYgIWF0b21pY19yZWFkKCZjbHAtPmNsX2NhbGxiYWNrLmNiX3NldCkpCiAJCWdvdG8gb3V0OwogCXN0YXR1cyA9IG5mc19vazsKQEAgLTE4MDksNyArMTkwMiwxNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXRpbWVfdAorc3RhdGljIHZvaWQKK2VuZF9ncmFjZSh2b2lkKQoreworCWRwcmludGsoIk5GU0Q6IGVuZCBvZiBncmFjZSBwZXJpb2RcbiIpOworCW5mc2Q0X3JlY2Rpcl9wdXJnZV9vbGQoKTsKKwlpbl9ncmFjZSA9IDA7Cit9CisKK3N0YXRpYyB0aW1lX3QKIG5mczRfbGF1bmRyb21hdCh2b2lkKQogewogCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOwpAQCAtMTgyMyw2ICsxOTI0LDggQEAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAogCWRwcmludGsoIk5GU0Q6IGxhdW5kcm9tYXQgc2VydmljZSAtIHN0YXJ0aW5nXG4iKTsKKwlpZiAoaW5fZ3JhY2UpCisJCWVuZF9ncmFjZSgpOwogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsICZjbGllbnRfbHJ1KSB7CiAJCWNscCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9jbGllbnQsIGNsX2xydSk7CiAJCWlmICh0aW1lX2FmdGVyKCh1bnNpZ25lZCBsb25nKWNscC0+Y2xfdGltZSwgKHVuc2lnbmVkIGxvbmcpY3V0b2ZmKSkgewpAQCAtMTgzMyw2ICsxOTM2LDcgQEAKIAkJfQogCQlkcHJpbnRrKCJORlNEOiBwdXJnaW5nIHVudXNlZCBjbGllbnQgKGNsaWVudGlkICUwOHgpXG4iLAogCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCW5mc2Q0X3JlbW92ZV9jbGlkX2RpcihjbHApOwogCQlleHBpcmVfY2xpZW50KGNscCk7CiAJfQogCUlOSVRfTElTVF9IRUFEKCZyZWFwbGlzdCk7CkBAIC0xODgyLDE3ICsxOTg2LDE0IEBACiAKIAl0ID0gbmZzNF9sYXVuZHJvbWF0KCk7CiAJZHByaW50aygiTkZTRDogbGF1bmRyb21hdF9tYWluIC0gc2xlZXBpbmcgZm9yICVsZCBzZWNvbmRzXG4iLCB0KTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxhdW5kcm9tYXRfd29yaywgdCpIWik7CisJcXVldWVfZGVsYXllZF93b3JrKGxhdW5kcnlfd3EsICZsYXVuZHJvbWF0X3dvcmssIHQqSFopOwogfQogCi0vKiBzZWFyY2ggb3duZXJpZF9oYXNodGJsW10gYW5kIGNsb3NlX2xydSBmb3Igc3RhdGVpZCBvd25lcgotICogKHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCkKLSAqLwotc3RydWN0IG5mczRfc3RhdGVvd25lciAqCi1maW5kX29wZW5zdGF0ZW93bmVyX2lkKHUzMiBzdF9pZCwgaW50IGZsYWdzKSB7CitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCitzZWFyY2hfY2xvc2VfbHJ1KHUzMiBzdF9pZCwgaW50IGZsYWdzKQorewogCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKIAotCWRwcmludGsoIk5GU0Q6IGZpbmRfb3BlbnN0YXRlb3duZXJfaWQgJWRcbiIsIHN0X2lkKTsKIAlpZiAoZmxhZ3MgJiBDTE9TRV9TVEFURSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmY2xvc2VfbHJ1LCBzb19jbG9zZV9scnUpIHsKIAkJCWlmIChsb2NhbC0+c29faWQgPT0gc3RfaWQpCkBAIC0xOTQ5LDE1ICsyMDUwLDYgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLW5mczRfY2hlY2tfZGVsZWdtb2RlKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwLCBpbnQgZmxhZ3MpCi17Ci0JaWYgKChmbGFncyAmIFdSX1NUQVRFKSAmJiAoZHAtPmRsX3R5cGUgPT0gTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQpKQotCQlyZXR1cm4gbmZzZXJyX29wZW5tb2RlOwotCWVsc2UKLQkJcmV0dXJuIG5mc19vazsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKIGNoZWNrX3NwZWNpYWxfc3RhdGVpZHMoc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdGF0ZWlkX3QgKnN0YXRlaWQsIGludCBmbGFncykKIHsKIAkvKiBUcnlpbmcgdG8gY2FsbCBkZWxlZ3JldHVybiB3aXRoIGEgc3BlY2lhbCBzdGF0ZWlkPyBZdWNoOiAqLwpAQCAtMjA2NywxNCArMjE1OSwxOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CitzZXRsa2ZsZyAoaW50IHR5cGUpCit7CisJcmV0dXJuICh0eXBlID09IE5GUzRfUkVBRFdfTFQgfHwgdHlwZSA9PSBORlM0X1JFQURfTFQpID8KKwkJUkRfU1RBVEUgOiBXUl9TVEFURTsKK30KIAogLyogCiAgKiBDaGVja3MgZm9yIHNlcXVlbmNlIGlkIG11dGF0aW5nIG9wZXJhdGlvbnMuIAogICovCi1pbnQKLW5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1MzIgc2VxaWQsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqc29wcCwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHAsIGNsaWVudGlkX3QgKmxvY2tjbGlkKQorc3RhdGljIGludAorbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHUzMiBzZXFpZCwgc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MsIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKipzb3BwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoqc3RwcCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCiB7Ci0JaW50IHN0YXR1czsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CiAJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wOwogCkBAIC0yMDgyLDUzICsyMTc5LDY1IEBACiAJCQkic3RhdGVpZCA9ICglMDh4LyUwOHgvJTA4eC8lMDh4KVxuIiwgc2VxaWQsCiAJCXN0YXRlaWQtPnNpX2Jvb3QsIHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCwgc3RhdGVpZC0+c2lfZmlsZWlkLAogCQlzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uKTsKLQkJCSAgICAgICAgCisKIAkqc3RwcCA9IE5VTEw7CiAJKnNvcHAgPSBOVUxMOwogCi0Jc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCWlmIChaRVJPX1NUQVRFSUQoc3RhdGVpZCkgfHwgT05FX1NUQVRFSUQoc3RhdGVpZCkpIHsKIAkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBtYWdpYyBzdGF0ZWlkIVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAotCXN0YXR1cyA9IG5mc2Vycl9zdGFsZV9zdGF0ZWlkOwogCWlmIChTVEFMRV9TVEFURUlEKHN0YXRlaWQpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIG5mc2Vycl9zdGFsZV9zdGF0ZWlkOwogCS8qCiAJKiBXZSByZXR1cm4gQkFEX1NUQVRFSUQgaWYgZmlsZWhhbmRsZSBkb2Vzbid0IG1hdGNoIHN0YXRlaWQsIAogCSogdGhlIGNvbmZpcm1lZCBmbGFnIGlzIGluY29ycmVjbHkgc2V0LCBvciB0aGUgZ2VuZXJhdGlvbiAKIAkqIG51bWJlciBpcyBpbmNvcnJlY3QuICAKLQkqIElmIHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZSBvcGVuZmlsZSB0YWJsZSBmb3IgdGhpcyBpZCwgCi0JKiB3ZSBjYW4ndCBhbHdheXMgcmV0dXJuIEJBRF9TVEFURUlEOwotCSogdGhpcyBtaWdodCBiZSBhIHJldHJhbnNtaXR0ZWQgQ0xPU0Ugd2hpY2ggaGFzIGFycml2ZWQgYWZ0ZXIgCi0JKiB0aGUgb3BlbmZpbGUgaGFzIGJlZW4gcmVsZWFzZWQuCiAJKi8KLQlpZiAoIShzdHAgPSBmaW5kX3N0YXRlaWQoc3RhdGVpZCwgZmxhZ3MpKSkKLQkJZ290byBub19uZnM0X3N0YXRlaWQ7CisJc3RwID0gZmluZF9zdGF0ZWlkKHN0YXRlaWQsIGZsYWdzKTsKKwlpZiAoc3RwID09IE5VTEwpIHsKKwkJLyoKKwkJICogQWxzbywgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGlzbid0IGp1c3QgdGhlIHJlc3VsdCBvZgorCQkgKiBhIHJlcGxheWVkIGNsb3NlOgorCQkgKi8KKwkJc29wID0gc2VhcmNoX2Nsb3NlX2xydShzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIGZsYWdzKTsKKwkJaWYgKHNvcCA9PSBOVUxMKQorCQkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKKwkJKnNvcHAgPSBzb3A7CisJCWdvdG8gY2hlY2tfcmVwbGF5OworCX0KIAotCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKLQotCS8qIGZvciBuZXcgbG9jayBzdGF0ZW93bmVyczoKLQkgKiBjaGVjayB0aGF0IHRoZSBsb2NrLT52Lm5ldy5vcGVuX3N0YXRlaWQKLQkgKiByZWZlcnMgdG8gYW4gb3BlbiBzdGF0ZW93bmVyCi0JICoKLQkgKiBjaGVjayB0aGF0IHRoZSBsb2NrY2xpZCAobmZzNF9sb2NrLT52Lm5ldy5jbGllbnRpZCkgaXMgdGhlIHNhbWUKLQkgKiBhcyB0aGUgb3Blbl9zdGF0ZWlkLT5zdF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsaWVudGlkCi0JICovCi0JaWYgKGxvY2tjbGlkKSB7CisJaWYgKGxvY2spIHsKIAkJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wID0gc3RwLT5zdF9zdGF0ZW93bmVyOworCQljbGllbnRpZF90ICpsb2NrY2xpZCA9ICZsb2NrLT52Lm5ldy5jbGllbnRpZDsKIAkJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzb3AtPnNvX2NsaWVudDsKKwkJaW50IGxrZmxnID0gMDsKKwkJaW50IHN0YXR1czsKIAotCQlpZiAoIXNvcC0+c29faXNfb3Blbl9vd25lcikKLQkJCWdvdG8gb3V0OwotCQlpZiAoIWNtcF9jbGlkKCZjbHAtPmNsX2NsaWVudGlkLCBsb2NrY2xpZCkpCi0JCQlnb3RvIG91dDsKKwkJbGtmbGcgPSBzZXRsa2ZsZyhsb2NrLT5sa190eXBlKTsKKworCQlpZiAobG9jay0+bGtfaXNfbmV3KSB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICghc29wLT5zb19pc19vcGVuX293bmVyKQorCQkJICAgICAgIHJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CisgICAgICAgICAgICAgICAgICAgICAgIGlmICghY21wX2NsaWQoJmNscC0+Y2xfY2xpZW50aWQsIGxvY2tjbGlkKSkKKwkJCSAgICAgICByZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOworICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHAgaXMgdGhlIG9wZW4gc3RhdGVpZCAqLworICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cCwgbGtmbGcpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKQorCQkJICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAvKiBzdHAgaXMgdGhlIGxvY2sgc3RhdGVpZCAqLworICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZnM0X2NoZWNrX29wZW5tb2RlKHN0cC0+c3Rfb3BlbnN0cCwgbGtmbGcpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzKQorCQkJICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICB9CisKIAl9CiAKIAlpZiAoKGZsYWdzICYgQ0hFQ0tfRkgpICYmIG5mczRfY2hlY2tfZmgoY3VycmVudF9maCwgc3RwKSkgewogCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGZoLXN0YXRlaWQgbWlzbWF0Y2ghXG4iKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CiAJfQogCiAJKnN0cHAgPSBzdHA7CkBAIC0yMTM5LDYzICsyMjQ4LDQxIEBACiAJKiAgRm9yIHRoZSBtb21lbnQsIHdlIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgb2YgCiAJKiAgZ2VuZXJhdGlvbiBudW1iZXIgd3JhcGFyb3VuZC4KIAkqLwotCWlmIChzZXFpZCAhPSBzb3AtPnNvX3NlcWlkICsgMSkKKwlpZiAoc2VxaWQgIT0gc29wLT5zb19zZXFpZCkKIAkJZ290byBjaGVja19yZXBsYXk7CiAKLQlpZiAoc29wLT5zb19jb25maXJtZWQpIHsKLQkJaWYgKGZsYWdzICYgQ09ORklSTSkgewotCQkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBleHBlY3RlZCB1bmNvbmZpcm1lZCBzdGF0ZW93bmVyIVxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQorCWlmIChzb3AtPnNvX2NvbmZpcm1lZCAmJiBmbGFncyAmIENPTkZJUk0pIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiBleHBlY3RlZCIKKwkJCQkiIHVuY29uZmlybWVkIHN0YXRlb3duZXIhXG4iKTsKKwkJcmV0dXJuIG5mc2Vycl9iYWRfc3RhdGVpZDsKIAl9Ci0JZWxzZSB7Ci0JCWlmICghKGZsYWdzICYgQ09ORklSTSkpIHsKLQkJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogc3RhdGVvd25lciBub3QgY29uZmlybWVkIHlldCFcbiIpOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoIXNvcC0+c29fY29uZmlybWVkICYmICEoZmxhZ3MgJiBDT05GSVJNKSkgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IHN0YXRlb3duZXIgbm90IgorCQkJCSIgY29uZmlybWVkIHlldCFcbiIpOworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA+IHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKSB7CiAJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogZnV0dXJlIHN0YXRlaWQ/IVxuIik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gbmZzZXJyX2JhZF9zdGF0ZWlkOwogCX0KIAotCXN0YXR1cyA9IG5mc2Vycl9vbGRfc3RhdGVpZDsKIAlpZiAoc3RhdGVpZC0+c2lfZ2VuZXJhdGlvbiA8IHN0cC0+c3Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKSB7CiAJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogb2xkIHN0YXRlaWQhXG4iKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiBuZnNlcnJfb2xkX3N0YXRlaWQ7CiAJfQotCS8qIFhYWCByZW5ldyB0aGUgY2xpZW50IGxlYXNlIGhlcmUgKi8KLQlzdGF0dXMgPSBuZnNfb2s7Ci0KLW91dDoKLQlyZXR1cm4gc3RhdHVzOwotCi1ub19uZnM0X3N0YXRlaWQ6Ci0KLQkvKgotCSogV2UgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIGJhZCBzdGF0ZWlkIG9yIGEgcmVwbGF5LCAKLQkqIHN0YXJ0aW5nIGJ5IHRyeWluZyB0byBsb29rIHVwIHRoZSBzdGF0ZW93bmVyLgotCSogSWYgc3RhdGVvd25lciBpcyBub3QgZm91bmQgLSBzdGF0ZWlkIGlzIGJhZC4KLQkqLwotCWlmICghKHNvcCA9IGZpbmRfb3BlbnN0YXRlb3duZXJfaWQoc3RhdGVpZC0+c2lfc3RhdGVvd25lcmlkLCBmbGFncykpKSB7Ci0JCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogbm8gc3RhdGVvd25lciBvciBuZnM0X3N0YXRlaWQhXG4iKTsKLQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOwotCQlnb3RvIG91dDsKLQl9Ci0JKnNvcHAgPSBzb3A7CisJcmVuZXdfY2xpZW50KHNvcC0+c29fY2xpZW50KTsKKwlyZXR1cm4gbmZzX29rOwogCiBjaGVja19yZXBsYXk6Ci0JaWYgKHNlcWlkID09IHNvcC0+c29fc2VxaWQpIHsKKwlpZiAoc2VxaWQgPT0gc29wLT5zb19zZXFpZCAtIDEpIHsKIAkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiByZXRyYW5zbWlzc2lvbj9cbiIpOwogCQkvKiBpbmRpY2F0ZSByZXBsYXkgdG8gY2FsbGluZyBmdW5jdGlvbiAqLwotCQlzdGF0dXMgPSBORlNFUlJfUkVQTEFZX01FOwotCX0gZWxzZSAgewotCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGJhZCBzZXFpZCAoZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwgc29wLT5zb19zZXFpZCArMSwgc2VxaWQpOwotCi0JCSpzb3BwID0gTlVMTDsKLQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKKwkJcmV0dXJuIE5GU0VSUl9SRVBMQVlfTUU7CiAJfQotCWdvdG8gb3V0OworCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogYmFkIHNlcWlkIChleHBlY3RlZCAlZCwgZ290ICVkKVxuIiwKKwkJCXNvcC0+c29fc2VxaWQsIHNlcWlkKTsKKwkqc29wcCA9IE5VTEw7CisJcmV0dXJuIG5mc2Vycl9iYWRfc2VxaWQ7CiB9CiAKIGludApAQCAtMjIzMCw2ICsyMzE3LDggQEAKIAkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCwKIAkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2ZpbGVpZCwKIAkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCisJbmZzZDRfY3JlYXRlX2NsaWRfZGlyKHNvcC0+c29fY2xpZW50KTsKIG91dDoKIAlpZiAob2MtPm9jX3N0YXRlb3duZXIpCiAJCW5mczRfZ2V0X3N0YXRlb3duZXIob2MtPm9jX3N0YXRlb3duZXIpOwpAQCAtMjM4Nyw3ICsyNDc2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCWxvY2tfb3duZXJzdHJfaGFzaHRibFtMT0NLX0hBU0hfU0laRV07CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBsb2Nrc3RhdGVpZF9oYXNodGJsW1NUQVRFSURfSEFTSF9TSVpFXTsKIAotc3RydWN0IG5mczRfc3RhdGVpZCAqCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVpZCAqCiBmaW5kX3N0YXRlaWQoc3RhdGVpZF90ICpzdGlkLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG5mczRfc3RhdGVpZCAqbG9jYWwgPSBOVUxMOwpAQCAtMjQxOSwyNSArMjUwOCwxOSBAQAogc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKgogZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQoc3RydWN0IGlub2RlICppbm8sIHN0YXRlaWRfdCAqc3RpZCkKIHsKLQlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IE5VTEw7Ci0Jc3RydWN0IG5mczRfZmlsZSAqZnAgPSBOVUxMOwotCXUzMiBzdF9pZDsKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkbDsKIAogCWRwcmludGsoIk5GU0Q6ZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQgc3RhdGVpZD0oJTA4eC8lMDh4LyUwOHgvJTA4eClcbiIsCiAgICAgICAgICAgICAgICAgICAgIHN0aWQtPnNpX2Jvb3QsIHN0aWQtPnNpX3N0YXRlb3duZXJpZCwKICAgICAgICAgICAgICAgICAgICAgc3RpZC0+c2lfZmlsZWlkLCBzdGlkLT5zaV9nZW5lcmF0aW9uKTsKIAotCXN0X2lkID0gc3RpZC0+c2lfc3RhdGVvd25lcmlkOwogCWZwID0gZmluZF9maWxlKGlubyk7Ci0JaWYgKGZwKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoZHAsICZmcC0+ZmlfZGVsX3BlcmZpbGUsIGRsX2RlbF9wZXJmaWxlKSB7Ci0JCQlpZihkcC0+ZGxfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPT0gc3RfaWQpIHsKLQkJCQlkcHJpbnRrKCJORlNEOiBmaW5kX2RlbGVnYXRpb24gZHAgJXBcbiIsZHApOwotCQkJCXJldHVybiBkcDsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKKwlpZiAoIWZwKQorCQlyZXR1cm4gTlVMTDsKKwlkbCA9IGZpbmRfZGVsZWdhdGlvbl9maWxlKGZwLCBzdGlkKTsKKwlwdXRfbmZzNF9maWxlKGZwKTsKKwlyZXR1cm4gZGw7CiB9CiAKIC8qCkBAIC0yNDU3LDcgKzI1NDAsNyBAQAogCQlsb2NrLT5mbF9lbmQgPSBPRkZTRVRfTUFYOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIG5mczRfdmVyaWZ5X2xvY2tfc3RhdGVvd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AsIHVuc2lnbmVkIGludCBoYXNodmFsKQogewogCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKQEAgLTI0OTgsMjIgKzI1ODEsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCi1maW5kX2xvY2tzdGF0ZW93bmVyKHN0cnVjdCB4ZHJfbmV0b2JqICpvd25lciwgY2xpZW50aWRfdCAqY2xpZCkKLXsKLQlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NhbCA9IE5VTEw7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTE9DS19IQVNIX1NJWkU7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmbG9ja19vd25lcmlkX2hhc2h0YmxbaV0sIHNvX2lkaGFzaCkgewotCQkJaWYgKCFjbXBfb3duZXJfc3RyKGxvY2FsLCBvd25lciwgY2xpZCkpCi0JCQkJY29udGludWU7Ci0JCQlyZXR1cm4gbG9jYWw7Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKIGZpbmRfbG9ja3N0YXRlb3duZXJfc3RyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNsaWVudGlkX3QgKmNsaWQsCiAJCXN0cnVjdCB4ZHJfbmV0b2JqICpvd25lcikKIHsKQEAgLTI1MzMsNyArMjYwMCw2IEBACiAgKiBvY2N1cmVkLiAKICAqCiAgKiBzdHJoYXNodmFsID0gbG9ja19vd25lcnN0cl9oYXNodmFsIAotICogc29fc2VxaWQgPSBsb2NrLT5sa19uZXdfbG9ja19zZXFpZCAtIDE6IGl0IGdldHMgYnVtcGVkIGluIGVuY29kZSAKICAqLwogCiBzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCkBAIC0yNTQ4LDE3ICsyNjE0LDE3IEBACiAJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29faWRoYXNoKTsKIAlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19zdHJoYXNoKTsKIAlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19wZXJjbGllbnQpOwotCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVybG9ja293bmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19zdGF0ZWlkcyk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVyc3RhdGVpZCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fY2xvc2VfbHJ1KTsgLyogbm90IHVzZWQgKi8KIAlzb3AtPnNvX3RpbWUgPSAwOwogCWxpc3RfYWRkKCZzb3AtPnNvX2lkaGFzaCwgJmxvY2tfb3duZXJpZF9oYXNodGJsW2lkaGFzaHZhbF0pOwogCWxpc3RfYWRkKCZzb3AtPnNvX3N0cmhhc2gsICZsb2NrX293bmVyc3RyX2hhc2h0Ymxbc3RyaGFzaHZhbF0pOwotCWxpc3RfYWRkKCZzb3AtPnNvX3BlcmxvY2tvd25lciwgJm9wZW5fc3RwLT5zdF9wZXJsb2Nrb3duZXIpOworCWxpc3RfYWRkKCZzb3AtPnNvX3BlcnN0YXRlaWQsICZvcGVuX3N0cC0+c3RfbG9ja293bmVycyk7CiAJc29wLT5zb19pc19vcGVuX293bmVyID0gMDsKIAlzb3AtPnNvX2lkID0gY3VycmVudF9vd25lcmlkKys7CiAJc29wLT5zb19jbGllbnQgPSBjbHA7Ci0Jc29wLT5zb19zZXFpZCA9IGxvY2stPmxrX25ld19sb2NrX3NlcWlkIC0gMTsKKwlzb3AtPnNvX3NlcWlkID0gbG9jay0+bGtfbmV3X2xvY2tfc2VxaWQ7CiAJc29wLT5zb19jb25maXJtZWQgPSAxOwogCXJwID0gJnNvcC0+c29fcmVwbGF5OwogCXJwLT5ycF9zdGF0dXMgPSBORlNFUlJfU0VSVkVSRkFVTFQ7CkBAIC0yNTY3LDI0ICsyNjMzLDI0IEBACiAJcmV0dXJuIHNvcDsKIH0KIAotc3RydWN0IG5mczRfc3RhdGVpZCAqCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVpZCAqCiBhbGxvY19pbml0X2xvY2tfc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AsIHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCkKIHsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CiAJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc29wLT5zb19pZCwgZnAtPmZpX2lkKTsKIAotCWlmICgoc3RwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfc3RhdGVpZCksIAotCQkJCQlHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwlzdHAgPSBuZnM0X2FsbG9jX3N0YXRlaWQoKTsKKwlpZiAoc3RwID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X2hhc2gpOwogCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X3BlcmZpbGUpOwotCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X3BlcmZpbGVzdGF0ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfcGVybG9ja293bmVyKTsgLyogbm90IHVzZWQgKi8KKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJzdGF0ZW93bmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9sb2Nrb3duZXJzKTsgLyogbm90IHVzZWQgKi8KIAlsaXN0X2FkZCgmc3RwLT5zdF9oYXNoLCAmbG9ja3N0YXRlaWRfaGFzaHRibFtoYXNodmFsXSk7Ci0JbGlzdF9hZGQoJnN0cC0+c3RfcGVyZmlsZSwgJmZwLT5maV9wZXJmaWxlKTsKLQlsaXN0X2FkZF9wZXJmaWxlKys7Ci0JbGlzdF9hZGQoJnN0cC0+c3RfcGVyZmlsZXN0YXRlLCAmc29wLT5zb19wZXJmaWxlc3RhdGUpOworCWxpc3RfYWRkKCZzdHAtPnN0X3BlcmZpbGUsICZmcC0+Zmlfc3RhdGVpZHMpOworCWxpc3RfYWRkKCZzdHAtPnN0X3BlcnN0YXRlb3duZXIsICZzb3AtPnNvX3N0YXRlaWRzKTsKIAlzdHAtPnN0X3N0YXRlb3duZXIgPSBzb3A7CisJZ2V0X25mczRfZmlsZShmcCk7CiAJc3RwLT5zdF9maWxlID0gZnA7CiAJc3RwLT5zdF9zdGF0ZWlkLnNpX2Jvb3QgPSBib290X3RpbWU7CiAJc3RwLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCA9IHNvcC0+c29faWQ7CkBAIC0yNTkzLDEyICsyNjU5LDEzIEBACiAJc3RwLT5zdF92ZnNfZmlsZSA9IG9wZW5fc3RwLT5zdF92ZnNfZmlsZTsgLyogRklYTUUgcmVmY291bnQ/PyAqLwogCXN0cC0+c3RfYWNjZXNzX2JtYXAgPSBvcGVuX3N0cC0+c3RfYWNjZXNzX2JtYXA7CiAJc3RwLT5zdF9kZW55X2JtYXAgPSBvcGVuX3N0cC0+c3RfZGVueV9ibWFwOworCXN0cC0+c3Rfb3BlbnN0cCA9IG9wZW5fc3RwOwogCiBvdXQ6CiAJcmV0dXJuIHN0cDsKIH0KIAotaW50CitzdGF0aWMgaW50CiBjaGVja19sb2NrX2xlbmd0aCh1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoKQogewogCXJldHVybiAoKGxlbmd0aCA9PSAwKSAgfHwgKChsZW5ndGggIT0gfih1NjQpMCkgJiYKQEAgLTI2MTEsNyArMjY3OCw3IEBACiBpbnQKIG5mc2Q0X2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCiB7Ci0Jc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG9ja19zb3AgPSBOVUxMLCAqb3Blbl9zb3AgPSBOVUxMOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKm9wZW5fc29wID0gTlVMTDsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpsb2NrX3N0cDsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgZmlsZV9sb2NrIGZpbGVfbG9jazsKQEAgLTI2MjMsMjIgKzI2OTAsMTcgQEAKIAkJKGxvbmcgbG9uZykgbG9jay0+bGtfb2Zmc2V0LAogCQkobG9uZyBsb25nKSBsb2NrLT5sa19sZW5ndGgpOwogCi0JaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiAhbG9jay0+bGtfcmVjbGFpbSkKLQkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKLQlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBsb2NrLT5sa19yZWNsYWltKQotCQlyZXR1cm4gbmZzZXJyX25vX2dyYWNlOwotCiAJaWYgKGNoZWNrX2xvY2tfbGVuZ3RoKGxvY2stPmxrX29mZnNldCwgbG9jay0+bGtfbGVuZ3RoKSkKIAkJIHJldHVybiBuZnNlcnJfaW52YWw7CiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAogCWlmIChsb2NrLT5sa19pc19uZXcpIHsKLQkvKgotCSAqIENsaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgbmV3IGxvY2tvd25lci4KLQkgKiBVc2Ugb3BlbiBvd25lciBhbmQgb3BlbiBzdGF0ZWlkIHRvIGNyZWF0ZSBsb2NrIG93bmVyIGFuZCBsb2NrIAotCSAqIHN0YXRlaWQuCi0JICovCisJCS8qCisJCSAqIENsaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgbmV3IGxvY2tvd25lci4KKwkJICogVXNlIG9wZW4gb3duZXIgYW5kIG9wZW4gc3RhdGVpZCB0byBjcmVhdGUgbG9jayBvd25lciBhbmQKKwkJICogbG9jayBzdGF0ZWlkLgorCQkgKi8KIAkJc3RydWN0IG5mczRfc3RhdGVpZCAqb3Blbl9zdHAgPSBOVUxMOwogCQlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKIAkJCkBAIC0yNjQ4LDM4ICsyNzEwLDIyIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCS8qIGlzIHRoZSBuZXcgbG9jayBzZXFpZCBwcmVzZW50ZWQgYnkgdGhlIGNsaWVudCB6ZXJvPyAqLwotCQlzdGF0dXMgPSBuZnNlcnJfYmFkX3NlcWlkOwotCQlpZiAobG9jay0+di5uZXcubG9ja19zZXFpZCAhPSAwKQotCQkJZ290byBvdXQ7Ci0KIAkJLyogdmFsaWRhdGUgYW5kIHVwZGF0ZSBvcGVuIHN0YXRlaWQgYW5kIG9wZW4gc2VxaWQgKi8KIAkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsIAogCQkJCSAgICAgICAgbG9jay0+bGtfbmV3X29wZW5fc2VxaWQsCiAJCSAgICAgICAgICAgICAgICAgICAgICAgICZsb2NrLT5sa19uZXdfb3Blbl9zdGF0ZWlkLAogCQkgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19GSCB8IE9QRU5fU1RBVEUsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICZvcGVuX3NvcCwgJm9wZW5fc3RwLAotCQkJCQkmbG9jay0+di5uZXcuY2xpZW50aWQpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlpZiAobG9jay0+bGtfcmVjbGFpbSkKLQkJCQlzdGF0dXMgPSBuZnNlcnJfcmVjbGFpbV9iYWQ7CisJCSAgICAgICAgICAgICAgICAgICAgICAgICZvcGVuX3NvcCwgJm9wZW5fc3RwLCBsb2NrKTsKKwkJaWYgKHN0YXR1cykKIAkJCWdvdG8gb3V0OwotCQl9CiAJCS8qIGNyZWF0ZSBsb2Nrb3duZXIgYW5kIGxvY2sgc3RhdGVpZCAqLwogCQlmcCA9IG9wZW5fc3RwLT5zdF9maWxlOwogCQlzdHJoYXNodmFsID0gbG9ja19vd25lcnN0cl9oYXNodmFsKGZwLT5maV9pbm9kZSwgCiAJCQkJb3Blbl9zb3AtPnNvX2NsaWVudC0+Y2xfY2xpZW50aWQuY2xfaWQsIAogCQkJCSZsb2NrLT52Lm5ldy5vd25lcik7Ci0JCS8qIAotCQkgKiBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBsb2NrIG93bmVyLCB0aGUgY2xpZW50IGlzIGluIAotCQkgKiBlcnJvciAob3Igb3VyIGJvb2tlZXBpbmcgaXMgd3JvbmchKSAKLQkJICogZm9yIGFza2luZyBmb3IgYSAnbmV3IGxvY2snLgotCQkgKi8KLQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOwotCQlsb2NrX3NvcCA9IGZpbmRfbG9ja3N0YXRlb3duZXIoJmxvY2stPnYubmV3Lm93bmVyLAotCQkJCQkJJmxvY2stPnYubmV3LmNsaWVudGlkKTsKLQkJaWYgKGxvY2tfc29wKQotCQkJZ290byBvdXQ7CisJCS8qIFhYWDogRG8gd2UgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlIHN0YXRlb3duZXJzIG9uCisJCSAqIHRoZSBzYW1lIGZpbGUsIG9yIHNob3VsZCB0aGV5IGp1c3QgYmUgYWxsb3dlZCAoYW5kCisJCSAqIGNyZWF0ZSBuZXcgc3RhdGVpZHMpPyAqLwogCQlzdGF0dXMgPSBuZnNlcnJfcmVzb3VyY2U7CiAJCWlmICghKGxvY2stPmxrX3N0YXRlb3duZXIgPSBhbGxvY19pbml0X2xvY2tfc3RhdGVvd25lcihzdHJoYXNodmFsLCBvcGVuX3NvcC0+c29fY2xpZW50LCBvcGVuX3N0cCwgbG9jaykpKQogCQkJZ290byBvdXQ7CkBAIC0yNjk3LDcgKzI3NDMsNyBAQAogCQkJCSAgICAgICBsb2NrLT5sa19vbGRfbG9ja19zZXFpZCwgCiAJCQkJICAgICAgICZsb2NrLT5sa19vbGRfbG9ja19zdGF0ZWlkLCAKIAkJCQkgICAgICAgQ0hFQ0tfRkggfCBMT0NLX1NUQVRFLCAKLQkJCQkgICAgICAgJmxvY2stPmxrX3N0YXRlb3duZXIsICZsb2NrX3N0cCwgTlVMTCk7CisJCQkJICAgICAgICZsb2NrLT5sa19zdGF0ZW93bmVyLCAmbG9ja19zdHAsIGxvY2spOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMjcwOSw2ICsyNzU1LDEzIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXN0YXR1cyA9IG5mc2Vycl9ncmFjZTsKKwlpZiAobmZzNF9pbl9ncmFjZSgpICYmICFsb2NrLT5sa19yZWNsYWltKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBuZnNlcnJfbm9fZ3JhY2U7CisJaWYgKCFuZnM0X2luX2dyYWNlKCkgJiYgbG9jay0+bGtfcmVjbGFpbSkKKwkJZ290byBvdXQ7CisKIAlsb2Nrc19pbml0X2xvY2soJmZpbGVfbG9jayk7CiAJc3dpdGNoIChsb2NrLT5sa190eXBlKSB7CiAJCWNhc2UgTkZTNF9SRUFEX0xUOgpAQCAtMjc3NSwxMCArMjgyOCwxMCBAQAogb3V0X2Rlc3Ryb3lfbmV3X3N0YXRlaWQ6CiAJaWYgKGxvY2stPmxrX2lzX25ldykgewogCQlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBkZXN0cm95IG5ldyBzdGF0ZWlkIVxuIik7Ci0JLyoKLQkqIEFuIGVycm9yIGVuY291bnRlcmVkIGFmdGVyIGluc3RhbnRpYXRpb24gb2YgdGhlIG5ldwotCSogc3RhdGVpZCBoYXMgZm9yY2VkIHVzIHRvIGRlc3Ryb3kgaXQuCi0JKi8KKwkJLyoKKwkJICogQW4gZXJyb3IgZW5jb3VudGVyZWQgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZiB0aGUgbmV3CisJCSAqIHN0YXRlaWQgaGFzIGZvcmNlZCB1cyB0byBkZXN0cm95IGl0LgorCQkgKi8KIAkJaWYgKCFzZXFpZF9tdXRhdGluZ19lcnIoc3RhdHVzKSkKIAkJCW9wZW5fc29wLT5zb19zZXFpZC0tOwogCkBAIC0yOTcwLDggKzMwMjMsMTEgQEAKIG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcikKIHsKIAljbGllbnRpZF90ICpjbGlkID0gJnJsb2Nrb3duZXItPnJsX2NsaWVudGlkOwotCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOwogCXN0cnVjdCB4ZHJfbmV0b2JqICpvd25lciA9ICZybG9ja293bmVyLT5ybF9vd25lcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hdGNoZXM7CisJaW50IGk7CiAJaW50IHN0YXR1czsKIAogCWRwcmludGsoIm5mc2Q0X3JlbGVhc2VfbG9ja293bmVyIGNsaWVudGlkOiAoJTA4eC8lMDh4KTpcbiIsCkBAIC0yOTg3LDIyICszMDQzLDM3IEBACiAKIAluZnM0X2xvY2tfc3RhdGUoKTsKIAotCXN0YXR1cyA9IG5mc19vazsKLQlsb2NhbCA9IGZpbmRfbG9ja3N0YXRlb3duZXIob3duZXIsIGNsaWQpOwotCWlmIChsb2NhbCkgewotCQlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7Ci0KLQkJLyogY2hlY2sgZm9yIGFueSBsb2NrcyBoZWxkIGJ5IGFueSBzdGF0ZWlkCi0JCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgKGxvY2spIHN0YXRlb3duZXIgKi8KLQkJc3RhdHVzID0gbmZzZXJyX2xvY2tzX2hlbGQ7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RwLCAmbG9jYWwtPnNvX3BlcmZpbGVzdGF0ZSwKLQkJCQlzdF9wZXJmaWxlc3RhdGUpIHsKLQkJCWlmIChjaGVja19mb3JfbG9ja3Moc3RwLT5zdF92ZnNfZmlsZSwgbG9jYWwpKQotCQkJCWdvdG8gb3V0OworCXN0YXR1cyA9IG5mc2Vycl9sb2Nrc19oZWxkOworCS8qIFhYWDogd2UncmUgZG9pbmcgYSBsaW5lYXIgc2VhcmNoIHRocm91Z2ggYWxsIHRoZSBsb2Nrb3duZXJzLgorCSAqIFlpcGVzISAgRm9yIG5vdyB3ZSdsbCBqdXN0IGhvcGUgY2xpZW50cyBhcmVuJ3QgcmVhbGx5IHVzaW5nCisJICogcmVsZWFzZV9sb2Nrb3duZXIgbXVjaCwgYnV0IGV2ZW50dWFsbHkgd2UgaGF2ZSB0byBmaXggdGhlc2UKKwkgKiBkYXRhIHN0cnVjdHVyZXMuICovCisJSU5JVF9MSVNUX0hFQUQoJm1hdGNoZXMpOworCWZvciAoaSA9IDA7IGkgPCBMT0NLX0hBU0hfU0laRTsgaSsrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc29wLCAmbG9ja19vd25lcmlkX2hhc2h0YmxbaV0sIHNvX2lkaGFzaCkgeworCQkJaWYgKCFjbXBfb3duZXJfc3RyKHNvcCwgb3duZXIsIGNsaWQpKQorCQkJCWNvbnRpbnVlOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHAsICZzb3AtPnNvX3N0YXRlaWRzLAorCQkJCQlzdF9wZXJzdGF0ZW93bmVyKSB7CisJCQkJaWYgKGNoZWNrX2Zvcl9sb2NrcyhzdHAtPnN0X3Zmc19maWxlLCBzb3ApKQorCQkJCQlnb3RvIG91dDsKKwkJCQkvKiBOb3RlOiBzb19wZXJjbGllbnQgdW51c2VkIGZvciBsb2Nrb3duZXJzLAorCQkJCSAqIHNvIGl0J3MgT0sgdG8gZm9vbCB3aXRoIGhlcmUuICovCisJCQkJbGlzdF9hZGQoJnNvcC0+c29fcGVyY2xpZW50LCAmbWF0Y2hlcyk7CisJCQl9CiAJCX0KLQkJLyogbm8gbG9ja3MgaGVsZCBieSAobG9jaykgc3RhdGVvd25lciAqLwotCQlzdGF0dXMgPSBuZnNfb2s7Ci0JCXJlbGVhc2Vfc3RhdGVvd25lcihsb2NhbCk7CisJfQorCS8qIENsaWVudHMgcHJvYmFibHkgd29uJ3QgZXhwZWN0IHVzIHRvIHJldHVybiB3aXRoIHNvbWUgKGJ1dCBub3QgYWxsKQorCSAqIG9mIHRoZSBsb2Nrb3duZXIgc3RhdGUgcmVsZWFzZWQ7IHNvIGRvbid0IHJlbGVhc2UgYW55IHVudGlsIGFsbAorCSAqIGhhdmUgYmVlbiBjaGVja2VkLiAqLworCXN0YXR1cyA9IG5mc19vazsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJm1hdGNoZXMpKSB7CisJCXNvcCA9IGxpc3RfZW50cnkobWF0Y2hlcy5uZXh0LCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyLAorCQkJCQkJCQlzb19wZXJjbGllbnQpOworCQkvKiB1bmhhc2hfc3RhdGVvd25lciBkZWxldGVzIHNvX3BlcmNsaWVudCBvbmx5CisJCSAqIGZvciBvcGVub3duZXJzLiAqLworCQlsaXN0X2RlbCgmc29wLT5zb19wZXJjbGllbnQpOworCQlyZWxlYXNlX3N0YXRlb3duZXIoc29wKTsKIAl9CiBvdXQ6CiAJbmZzNF91bmxvY2tfc3RhdGUoKTsKQEAgLTMwMTAsMzkgKzMwODEsMzggQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSAqCi1hbGxvY19yZWNsYWltKGludCBuYW1lbGVuKQorYWxsb2NfcmVjbGFpbSh2b2lkKQogewotCXN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICpjcnAgPSBOVUxMOworCXJldHVybiBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSksIEdGUF9LRVJORUwpOworfQogCi0JY3JwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNycCkKLQkJcmV0dXJuIE5VTEw7Ci0JY3JwLT5jcl9uYW1lLmRhdGEgPSBrbWFsbG9jKG5hbWVsZW4sIEdGUF9LRVJORUwpOwotCWlmICghY3JwLT5jcl9uYW1lLmRhdGEpIHsKLQkJa2ZyZWUoY3JwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBjcnA7CitpbnQKK25mczRfaGFzX3JlY2xhaW1lZF9zdGF0ZShjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGludCBzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwobmFtZSk7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisKKwljbHAgPSBmaW5kX2NvbmZpcm1lZF9jbGllbnRfYnlfc3RyKG5hbWUsIHN0cmhhc2h2YWwpOworCXJldHVybiBjbHAgPyAxIDogMDsKIH0KIAogLyoKICAqIGZhaWx1cmUgPT4gYWxsIHJlc2V0IGJldHMgYXJlIG9mZiwgbmZzZXJyX25vX2dyYWNlLi4uCiAgKi8KLXN0YXRpYyBpbnQKLW5mczRfY2xpZW50X3RvX3JlY2xhaW0oY2hhciAqbmFtZSwgaW50IG5hbWxlbikKK2ludAorbmZzNF9jbGllbnRfdG9fcmVjbGFpbShjb25zdCBjaGFyICpuYW1lKQogewogCXVuc2lnbmVkIGludCBzdHJoYXNodmFsOwogCXN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICpjcnAgPSBOVUxMOwogCi0JZHByaW50aygiTkZTRCBuZnM0X2NsaWVudF90b19yZWNsYWltIE5BTUU6ICUuKnNcbiIsIG5hbWxlbiwgbmFtZSk7Ci0JY3JwID0gYWxsb2NfcmVjbGFpbShuYW1sZW4pOworCWRwcmludGsoIk5GU0QgbmZzNF9jbGllbnRfdG9fcmVjbGFpbSBOQU1FOiAlLipzXG4iLCBIRVhESVJfTEVOLCBuYW1lKTsKKwljcnAgPSBhbGxvY19yZWNsYWltKCk7CiAJaWYgKCFjcnApCiAJCXJldHVybiAwOwotCXN0cmhhc2h2YWwgPSBjbGllbnRzdHJfaGFzaHZhbChuYW1lLCBuYW1sZW4pOworCXN0cmhhc2h2YWwgPSBjbGllbnRzdHJfaGFzaHZhbChuYW1lKTsKIAlJTklUX0xJU1RfSEVBRCgmY3JwLT5jcl9zdHJoYXNoKTsKIAlsaXN0X2FkZCgmY3JwLT5jcl9zdHJoYXNoLCAmcmVjbGFpbV9zdHJfaGFzaHRibFtzdHJoYXNodmFsXSk7Ci0JbWVtY3B5KGNycC0+Y3JfbmFtZS5kYXRhLCBuYW1lLCBuYW1sZW4pOwotCWNycC0+Y3JfbmFtZS5sZW4gPSBuYW1sZW47CisJbWVtY3B5KGNycC0+Y3JfcmVjZGlyLCBuYW1lLCBIRVhESVJfTEVOKTsKIAlyZWNsYWltX3N0cl9oYXNodGJsX3NpemUrKzsKIAlyZXR1cm4gMTsKIH0KQEAgLTMwNTMsMTMgKzMxMjMsMTEgQEAKIAlzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSAqY3JwID0gTlVMTDsKIAlpbnQgaTsKIAotCUJVR19PTighbmZzNF9yZWNsYWltX2luaXQpOwogCWZvciAoaSA9IDA7IGkgPCBDTElFTlRfSEFTSF9TSVpFOyBpKyspIHsKIAkJd2hpbGUgKCFsaXN0X2VtcHR5KCZyZWNsYWltX3N0cl9oYXNodGJsW2ldKSkgewogCQkJY3JwID0gbGlzdF9lbnRyeShyZWNsYWltX3N0cl9oYXNodGJsW2ldLm5leHQsCiAJCQkgICAgICAgICAgICAgICAgc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0sIGNyX3N0cmhhc2gpOwogCQkJbGlzdF9kZWwoJmNycC0+Y3Jfc3RyaGFzaCk7Ci0JCQlrZnJlZShjcnAtPmNyX25hbWUuZGF0YSk7CiAJCQlrZnJlZShjcnApOwogCQkJcmVjbGFpbV9zdHJfaGFzaHRibF9zaXplLS07CiAJCX0KQEAgLTMwNjksNyArMzEzNyw3IEBACiAKIC8qCiAgKiBjYWxsZWQgZnJvbSBPUEVOLCBDTEFJTV9QUkVWSU9VUyB3aXRoIGEgbmV3IGNsaWVudGlkLiAqLwotc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKgorc3RhdGljIHN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICoKIG5mczRfZmluZF9yZWNsYWltX2NsaWVudChjbGllbnRpZF90ICpjbGlkKQogewogCXVuc2lnbmVkIGludCBzdHJoYXNodmFsOwpAQCAtMzA4MiwxMyArMzE1MCwxNCBAQAogCWlmIChjbHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlkcHJpbnRrKCJORlNEOiBuZnM0X2ZpbmRfcmVjbGFpbV9jbGllbnQgZm9yICUuKnNcbiIsCi0JCSAgICAgICAgICAgIGNscC0+Y2xfbmFtZS5sZW4sIGNscC0+Y2xfbmFtZS5kYXRhKTsKKwlkcHJpbnRrKCJORlNEOiBuZnM0X2ZpbmRfcmVjbGFpbV9jbGllbnQgZm9yICUuKnMgd2l0aCByZWNkaXIgJXNcbiIsCisJCSAgICAgICAgICAgIGNscC0+Y2xfbmFtZS5sZW4sIGNscC0+Y2xfbmFtZS5kYXRhLAorCQkJICAgIGNscC0+Y2xfcmVjZGlyKTsKIAogCS8qIGZpbmQgY2xwLT5jbF9uYW1lIGluIHJlY2xhaW1fc3RyX2hhc2h0YmwgKi8KLQlzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwoY2xwLT5jbF9uYW1lLmRhdGEsIGNscC0+Y2xfbmFtZS5sZW4pOworCXN0cmhhc2h2YWwgPSBjbGllbnRzdHJfaGFzaHZhbChjbHAtPmNsX3JlY2Rpcik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjcnAsICZyZWNsYWltX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdLCBjcl9zdHJoYXNoKSB7Ci0JCWlmIChjbXBfbmFtZSgmY3JwLT5jcl9uYW1lLCAmY2xwLT5jbF9uYW1lKSkgeworCQlpZiAoc2FtZV9uYW1lKGNycC0+Y3JfcmVjZGlyLCBjbHAtPmNsX3JlY2RpcikpIHsKIAkJCXJldHVybiBjcnA7CiAJCX0KIAl9CkBAIC0zMTAxLDMwICszMTcwLDE2IEBACiBpbnQKIG5mczRfY2hlY2tfb3Blbl9yZWNsYWltKGNsaWVudGlkX3QgKmNsaWQpCiB7Ci0Jc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKmNycDsKLQotCWlmICgoY3JwID0gbmZzNF9maW5kX3JlY2xhaW1fY2xpZW50KGNsaWQpKSA9PSBOVUxMKQotCQlyZXR1cm4gbmZzZXJyX3JlY2xhaW1fYmFkOwotCXJldHVybiBuZnNfb2s7CisJcmV0dXJuIG5mczRfZmluZF9yZWNsYWltX2NsaWVudChjbGlkKSA/IG5mc19vayA6IG5mc2Vycl9yZWNsYWltX2JhZDsKIH0KIAorLyogaW5pdGlhbGl6YXRpb24gdG8gcGVyZm9ybSBhdCBtb2R1bGUgbG9hZCB0aW1lOiAqLwogCi0vKiAKLSAqIFN0YXJ0IGFuZCBzdG9wIHJvdXRpbmVzCi0gKi8KLQotc3RhdGljIHZvaWQKLV9fbmZzNF9zdGF0ZV9pbml0KHZvaWQpCit2b2lkCituZnM0X3N0YXRlX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKLQl0aW1lX3QgZ3JhY2VfdGltZTsKIAotCWlmICghbmZzNF9yZWNsYWltX2luaXQpIHsKLQkJZm9yIChpID0gMDsgaSA8IENMSUVOVF9IQVNIX1NJWkU7IGkrKykKLQkJCUlOSVRfTElTVF9IRUFEKCZyZWNsYWltX3N0cl9oYXNodGJsW2ldKTsKLQkJcmVjbGFpbV9zdHJfaGFzaHRibF9zaXplID0gMDsKLQkJbmZzNF9yZWNsYWltX2luaXQgPSAxOwotCX0KIAlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZjb25mX2lkX2hhc2h0YmxbaV0pOwogCQlJTklUX0xJU1RfSEVBRCgmY29uZl9zdHJfaGFzaHRibFtpXSk7CkBAIC0zMTQ2LDI2ICszMjAxLDQ2IEBACiAJCUlOSVRfTElTVF9IRUFEKCZsb2NrX293bmVyaWRfaGFzaHRibFtpXSk7CiAJCUlOSVRfTElTVF9IRUFEKCZsb2NrX293bmVyc3RyX2hhc2h0YmxbaV0pOwogCX0KLQltZW1zZXQoJnplcm9zdGF0ZWlkLCAwLCBzaXplb2Yoc3RhdGVpZF90KSk7CiAJbWVtc2V0KCZvbmVzdGF0ZWlkLCB+MCwgc2l6ZW9mKHN0YXRlaWRfdCkpOwotCiAJSU5JVF9MSVNUX0hFQUQoJmNsb3NlX2xydSk7CiAJSU5JVF9MSVNUX0hFQUQoJmNsaWVudF9scnUpOwogCUlOSVRfTElTVF9IRUFEKCZkZWxfcmVjYWxsX2xydSk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnJlY2FsbF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmcmVjbGFpbV9zdHJfaGFzaHRibFtpXSk7CisJcmVjbGFpbV9zdHJfaGFzaHRibF9zaXplID0gMDsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2xvYWRfcmVib290X3JlY292ZXJ5X2RhdGEodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJbmZzZDRfaW5pdF9yZWNkaXIodXNlcl9yZWNvdmVyeV9kaXJuYW1lKTsKKwlzdGF0dXMgPSBuZnNkNF9yZWNkaXJfbG9hZCgpOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJaWYgKHN0YXR1cykKKwkJcHJpbnRrKCJORlNEOiBGYWlsdXJlIHJlYWRpbmcgcmVib290IHJlY292ZXJ5IGRhdGFcbiIpOworfQorCisvKiBpbml0aWFsaXphdGlvbiB0byBwZXJmb3JtIHdoZW4gdGhlIG5mc2Qgc2VydmljZSBpcyBzdGFydGVkOiAqLworCitzdGF0aWMgdm9pZAorX19uZnM0X3N0YXRlX3N0YXJ0KHZvaWQpCit7CisJdGltZV90IGdyYWNlX3RpbWU7CisKIAlib290X3RpbWUgPSBnZXRfc2Vjb25kcygpOwotCWdyYWNlX3RpbWUgPSBtYXgob2xkX2xlYXNlX3RpbWUsIGxlYXNlX3RpbWUpOwotCWlmIChyZWNsYWltX3N0cl9oYXNodGJsX3NpemUgPT0gMCkKLQkJZ3JhY2VfdGltZSA9IDA7Ci0JaWYgKGdyYWNlX3RpbWUpCi0JCXByaW50aygiTkZTRDogc3RhcnRpbmcgJWxkLXNlY29uZCBncmFjZSBwZXJpb2RcbiIsIGdyYWNlX3RpbWUpOwotCWdyYWNlX2VuZCA9IGJvb3RfdGltZSArIGdyYWNlX3RpbWU7Ci0JSU5JVF9XT1JLKCZsYXVuZHJvbWF0X3dvcmssbGF1bmRyb21hdF9tYWluLCBOVUxMKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxhdW5kcm9tYXRfd29yaywgTkZTRF9MRUFTRV9USU1FKkhaKTsKKwlncmFjZV90aW1lID0gbWF4KHVzZXJfbGVhc2VfdGltZSwgbGVhc2VfdGltZSk7CisJbGVhc2VfdGltZSA9IHVzZXJfbGVhc2VfdGltZTsKKwlpbl9ncmFjZSA9IDE7CisJcHJpbnRrKCJORlNEOiBzdGFydGluZyAlbGQtc2Vjb25kIGdyYWNlIHBlcmlvZFxuIiwgZ3JhY2VfdGltZSk7CisJbGF1bmRyeV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJuZnNkNCIpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhsYXVuZHJ5X3dxLCAmbGF1bmRyb21hdF93b3JrLCBncmFjZV90aW1lKkhaKTsKIH0KIAogaW50Ci1uZnM0X3N0YXRlX2luaXQodm9pZCkKK25mczRfc3RhdGVfc3RhcnQodm9pZCkKIHsKIAlpbnQgc3RhdHVzOwogCkBAIC0zMTc0LDcgKzMyNDksOCBAQAogCXN0YXR1cyA9IG5mc2Q0X2luaXRfc2xhYnMoKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwotCV9fbmZzNF9zdGF0ZV9pbml0KCk7CisJbmZzZDRfbG9hZF9yZWJvb3RfcmVjb3ZlcnlfZGF0YSgpOworCV9fbmZzNF9zdGF0ZV9zdGFydCgpOwogCW5mczRfaW5pdCA9IDE7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMTgyLDE0ICszMjU4LDcgQEAKIGludAogbmZzNF9pbl9ncmFjZSh2b2lkKQogewotCXJldHVybiBnZXRfc2Vjb25kcygpIDwgZ3JhY2VfZW5kOwotfQotCi12b2lkCi1zZXRfbm9fZ3JhY2Uodm9pZCkKLXsKLQlwcmludGsoIk5GU0Q6IEVSUk9SIGluIHJlYm9vdCByZWNvdmVyeS4gIFN0YXRlIHJlY2xhaW1zIHdpbGwgZmFpbC5cbiIpOwotCWdyYWNlX2VuZCA9IGdldF9zZWNvbmRzKCk7CisJcmV0dXJuIGluX2dyYWNlOwogfQogCiB0aW1lX3QKQEAgLTMyMzYsMjEgKzMzMDUsMTEgQEAKIAkJdW5oYXNoX2RlbGVnYXRpb24oZHApOwogCX0KIAotCXJlbGVhc2VfYWxsX2ZpbGVzKCk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmbGF1bmRyb21hdF93b3JrKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWZsdXNoX3dvcmtxdWV1ZShsYXVuZHJ5X3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShsYXVuZHJ5X3dxKTsKKwluZnNkNF9zaHV0ZG93bl9yZWNkaXIoKTsKIAluZnM0X2luaXQgPSAwOwotCWRwcmludGsoIk5GU0Q6IGxpc3RfYWRkX3BlcmZpbGUgJWQgbGlzdF9kZWxfcGVyZmlsZSAlZFxuIiwKLQkJCWxpc3RfYWRkX3BlcmZpbGUsIGxpc3RfZGVsX3BlcmZpbGUpOwotCWRwcmludGsoIk5GU0Q6IGFkZF9wZXJjbGllbnQgJWQgZGVsX3BlcmNsaWVudCAlZFxuIiwKLQkJCWFkZF9wZXJjbGllbnQsIGRlbF9wZXJjbGllbnQpOwotCWRwcmludGsoIk5GU0Q6IGFsbG9jX2ZpbGUgJWQgZnJlZV9maWxlICVkXG4iLAotCQkJYWxsb2NfZmlsZSwgZnJlZV9maWxlKTsKLQlkcHJpbnRrKCJORlNEOiB2ZnNvcGVuICVkIHZmc2Nsb3NlICVkXG4iLAotCQkJdmZzb3BlbiwgdmZzY2xvc2UpOwotCWRwcmludGsoIk5GU0Q6IGFsbG9jX2RlbGVnYXRpb24gJWQgZnJlZV9kZWxlZ2F0aW9uICVkXG4iLAotCQkJYWxsb2NfZGVsZWdhdGlvbiwgZnJlZV9kZWxlZ2F0aW9uKTsKLQogfQogCiB2b2lkCkBAIC0zMjYzLDU2ICszMzIyLDQ4IEBACiAJbmZzNF91bmxvY2tfc3RhdGUoKTsKIH0KIAorc3RhdGljIHZvaWQKK25mczRfc2V0X3JlY2RpcihjaGFyICpyZWNkaXIpCit7CisJbmZzNF9sb2NrX3N0YXRlKCk7CisJc3RyY3B5KHVzZXJfcmVjb3ZlcnlfZGlybmFtZSwgcmVjZGlyKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworfQorCisvKgorICogQ2hhbmdlIHRoZSBORlN2NCByZWNvdmVyeSBkaXJlY3RvcnkgdG8gcmVjZGlyLgorICovCitpbnQKK25mczRfcmVzZXRfcmVjb3ZlcnlkaXIoY2hhciAqcmVjZGlyKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCXN0YXR1cyA9IHBhdGhfbG9va3VwKHJlY2RpciwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCXN0YXR1cyA9IC1FTk9URElSOworCWlmIChTX0lTRElSKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQluZnM0X3NldF9yZWNkaXIocmVjZGlyKTsKKwkJc3RhdHVzID0gMDsKKwl9CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogLyoKICAqIENhbGxlZCB3aGVuIGxlYXNldGltZSBpcyBjaGFuZ2VkLgogICoKLSAqIGlmIG5mc2QgaXMgbm90IHN0YXJ0ZWQsIHNpbXBseSBzZXQgdGhlIGdsb2JhbCBsZWFzZS4KLSAqCi0gKiBpZiBuZnNkKHMpIGFyZSBydW5uaW5nLCBsZWFzZSBjaGFuZ2UgcmVxdWlyZXMgbmZzdjQgc3RhdGUgdG8gYmUgcmVzZXQuCi0gKiBlLmc6IGJvb3RfdGltZSBpcyByZXNldCwgZXhpc3RpbmcgbmZzNF9jbGllbnQgc3RydWN0cyBhcmUKLSAqIHVzZWQgdG8gZmlsbCByZWNsYWltX3N0cl9oYXNodGJsLCB0aGVuIGFsbCBzdGF0ZSAoZXhjZXB0IGZvciB0aGUKLSAqIHJlY2xhaW1fc3RyX2hhc2h0YmwpIGlzIHJlLWluaXRpYWxpemVkLgotICoKLSAqIGlmIHRoZSBvbGQgbGVhc2UgdGltZSBpcyBncmVhdGVyIHRoYW4gdGhlIG5ldyBsZWFzZSB0aW1lLCB0aGUgZ3JhY2UKLSAqIHBlcmlvZCBuZWVkcyB0byBiZSBzZXQgdG8gdGhlIG9sZCBsZWFzZSB0aW1lIHRvIGFsbG93IGNsaWVudHMgdG8gcmVjbGFpbQotICogdGhlaXIgc3RhdGUuIFhYWCAtIHdlIG1heSB3YW50IHRvIHNldCB0aGUgZ3JhY2UgcGVyaW9kID09IGxlYXNlIHRpbWUKLSAqIGFmdGVyIGFuIGluaXRpYWwgZ3JhY2UgcGVyaW9kID09IG9sZCBsZWFzZSB0aW1lCi0gKgotICogaWYgYW4gZXJyb3Igb2NjdXJzIGluIHRoaXMgcHJvY2VzcywgdGhlIG5ldyBsZWFzZSBpcyBzZXQsIGJ1dCB0aGUgc2VydmVyCi0gKiB3aWxsIG5vdCBob25vciBPUEVOIG9yIExPQ0sgcmVjbGFpbXMsIGFuZCB3aWxsIHJldHVybiBuZnNlcnJfbm9fZ3JhY2UKLSAqIHdoaWNoIG1lYW5zIE9QRU4vTE9DSy9SRUFEL1dSSVRFIHdpbGwgZmFpbCBkdXJpbmcgZ3JhY2UgcGVyaW9kLgotICoKLSAqIGNsaWVudHMgd2lsbCBhdHRlbXB0IHRvIHJlc2V0IGFsbCBzdGF0ZSB3aXRoIFNFVENMSUVOVElEL0NPTkZJUk0sIGFuZAotICogT1BFTiBhbmQgTE9DSyByZWNsYWltcy4KKyAqIFRoZSBvbmx5IHdheSB0aGUgcHJvdG9jb2wgZ2l2ZXMgdXMgdG8gaGFuZGxlIG9uLXRoZS1mbHkgbGVhc2UgY2hhbmdlcyBpcyB0bworICogc2ltdWxhdGUgYSByZWJvb3QuICBJbnN0ZWFkIG9mIGRvaW5nIHRoYXQsIHdlIGp1c3Qgd2FpdCB0aWxsIHRoZSBuZXh0IHRpbWUKKyAqIHdlIHN0YXJ0IHRvIHJlZ2lzdGVyIGFueSBjaGFuZ2VzIGluIGxlYXNlIHRpbWUuICBJZiB0aGUgYWRtaW5pc3RyYXRvcgorICogcmVhbGx5IHdhbnRzIHRvIGNoYW5nZSB0aGUgbGVhc2UgdGltZSAqbm93KiwgdGhleSBjYW4gZ28gYWhlYWQgYW5kIGJyaW5nCisgKiBuZnNkIGRvd24gYW5kIHRoZW4gYmFjayB1cCBhZ2FpbiBhZnRlciBjaGFuZ2luZyB0aGUgbGVhc2UgdGltZS4KICAqLwogdm9pZAogbmZzNF9yZXNldF9sZWFzZSh0aW1lX3QgbGVhc2V0aW1lKQogewotCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOwotCWludCBpOwotCi0JcHJpbnRrKCJORlNEOiBOZXcgbGVhc2V0aW1lICVsZFxuIixsZWFzZXRpbWUpOwotCWlmICghbmZzNF9pbml0KQotCQlyZXR1cm47Ci0JbmZzNF9sb2NrX3N0YXRlKCk7Ci0Jb2xkX2xlYXNlX3RpbWUgPSBsZWFzZV90aW1lOwotCWxlYXNlX3RpbWUgPSBsZWFzZXRpbWU7Ci0KLQluZnM0X3JlbGVhc2VfcmVjbGFpbSgpOwotCi0JLyogcG9wdWxhdGUgcmVjbGFpbV9zdHJfaGFzaHRibCB3aXRoIGN1cnJlbnQgY29uZmlybWVkIG5mczRfY2xpZW50aWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmY29uZl9pZF9oYXNodGJsW2ldLCBjbF9pZGhhc2gpIHsKLQkJCWlmICghbmZzNF9jbGllbnRfdG9fcmVjbGFpbShjbHAtPmNsX25hbWUuZGF0YSwKLQkJCQkJCWNscC0+Y2xfbmFtZS5sZW4pKSB7Ci0JCQkJbmZzNF9yZWxlYXNlX3JlY2xhaW0oKTsKLQkJCQlnb3RvIGluaXRfc3RhdGU7Ci0JCQl9Ci0JCX0KLQl9Ci1pbml0X3N0YXRlOgotCV9fbmZzNF9zdGF0ZV9zaHV0ZG93bigpOwotCV9fbmZzNF9zdGF0ZV9pbml0KCk7Ci0JbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlsb2NrX2tlcm5lbCgpOworCXVzZXJfbGVhc2VfdGltZSA9IGxlYXNldGltZTsKKwl1bmxvY2tfa2VybmVsKCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggMzZhMDU4YS4uNGM0MTQ2MyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCX0JCQkJCVwKIH0gd2hpbGUgKDApCiAKLXUzMiAqcmVhZF9idWYoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgaW50IG5ieXRlcykKK3N0YXRpYyB1MzIgKnJlYWRfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIGludCBuYnl0ZXMpCiB7CiAJLyogV2Ugd2FudCBtb3JlIGJ5dGVzIHRoYW4gc2VlbSB0byBiZSBhdmFpbGFibGUuCiAJICogTWF5YmUgd2UgbmVlZCBhIG5ldyBwYWdlLCBtYXliZSB3ZSBoYXZlIGp1c3QgcnVuIG91dApAQCAtMTkwLDcgKzE5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWNoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgdTMyICpwLCBpbnQgbmJ5dGVzKQorc3RhdGljIGNoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgdTMyICpwLCBpbnQgbmJ5dGVzKQogewogCXZvaWQgKm5ldyA9IE5VTEw7CiAJaWYgKHAgPT0gYXJncC0+dG1wKSB7CkBAIC0xMjEwLDE2ICsxMjEwLDE1IEBACiAJc2F2ZSA9IHJlc3AtPnA7CiAKIC8qCi0gKiBSb3V0aW5lIGZvciBlbmNvZGluZyB0aGUgcmVzdWx0IG9mIGEKLSAqICJzZXFpZC1tdXRhdGluZyIgTkZTdjQgb3BlcmF0aW9uLiAgVGhpcyBpcwotICogd2hlcmUgc2VxaWRzIGFyZSBpbmNyZW1lbnRlZCwgYW5kIHRoZQotICogcmVwbGF5IGNhY2hlIGlzIGZpbGxlZC4KKyAqIFJvdXRpbmUgZm9yIGVuY29kaW5nIHRoZSByZXN1bHQgb2YgYSAic2VxaWQtbXV0YXRpbmciIE5GU3Y0IG9wZXJhdGlvbi4gIFRoaXMKKyAqIGlzIHdoZXJlIHNlcXVlbmNlIGlkJ3MgYXJlIGluY3JlbWVudGVkLCBhbmQgdGhlIHJlcGxheSBjYWNoZSBpcyBmaWxsZWQuCisgKiBOb3RlIHRoYXQgd2UgaW5jcmVtZW50IHNlcXVlbmNlIGlkJ3MgaGVyZSwgYXQgdGhlIGxhc3QgbW9tZW50LCBzbyB3ZSdyZSBzdXJlCisgKiB3ZSBrbm93IHdoZXRoZXIgdGhlIGVycm9yIHRvIGJlIHJldHVybmVkIGlzIGEgc2VxdWVuY2UgaWQgbXV0YXRpbmcgZXJyb3IuCiAgKi8KIAogI2RlZmluZSBFTkNPREVfU0VRSURfT1BfVEFJTChzdGF0ZW93bmVyKSBkbyB7CQkJXAogCWlmIChzZXFpZF9tdXRhdGluZ19lcnIobmZzZXJyKSAmJiBzdGF0ZW93bmVyKSB7IAlcCi0JCWlmIChzdGF0ZW93bmVyLT5zb19jb25maXJtZWQpCQkJXAotCQkJc3RhdGVvd25lci0+c29fc2VxaWQrKzsJCQlcCisJCXN0YXRlb3duZXItPnNvX3NlcWlkKys7CQkJCVwKIAkJc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX3N0YXR1cyA9IG5mc2VycjsgICAJXAogCQlzdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfYnVmbGVuID0gCQlcCiAJCQkgICgoKGNoYXIgKikocmVzcCktPnAgLSAoY2hhciAqKXNhdmUpKTsgXApAQCAtMTM2Niw3ICsxMzY1LDEwIEBACiAJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9GSF9FWFBJUkVfVFlQRSkgewogCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCiAJCQlnb3RvIG91dF9yZXNvdXJjZTsKLQkJV1JJVEUzMiggTkZTNF9GSF9OT0VYUElSRV9XSVRIX09QRU4gfCBORlM0X0ZIX1ZPTF9SRU5BTUUgKTsKKwkJaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9TVUJUUkVFQ0hFQ0spCisJCQlXUklURTMyKE5GUzRfRkhfUEVSU0lTVEVOVCk7CisJCWVsc2UKKwkJCVdSSVRFMzIoTkZTNF9GSF9QRVJTSVNURU5UfE5GUzRfRkhfVk9MX1JFTkFNRSk7CiAJfQogCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQ0hBTkdFKSB7CiAJCS8qCkBAIC0xOTY5LDcgKzE5NzEsNyBAQAogCWNhc2UgTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQ6CiAJCVJFU0VSVkVfU1BBQ0UoMjAgKyBzaXplb2Yoc3RhdGVpZF90KSk7CiAJCVdSSVRFTUVNKCZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7Ci0JCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIob3Blbi0+b3BfcmVjYWxsKTsKIAogCQkvKgogCQkgKiBUT0RPOiBBQ0UncyBpbiBkZWxlZ2F0aW9ucwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggMTYxYWZkYy4uODQxYzU2MiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC01MSw2ICs1MSw3IEBACiAJTkZTRF9GaCwKIAlORlNEX1RocmVhZHMsCiAJTkZTRF9MZWFzZXRpbWUsCisJTkZTRF9SZWNvdmVyeURpciwKIH07CiAKIC8qCkBAIC02Niw2ICs2Nyw3IEBACiBzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlaGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3RocmVhZHMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwogc3RhdGljIHNzaXplX3Qgd3JpdGVfbGVhc2V0aW1lKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3JlY292ZXJ5ZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIAogc3RhdGljIHNzaXplX3QgKCp3cml0ZV9vcFtdKShzdHJ1Y3QgZmlsZSAqLCBjaGFyICosIHNpemVfdCkgPSB7CiAJW05GU0RfU3ZjXSA9IHdyaXRlX3N2YywKQEAgLTc4LDYgKzgwLDcgQEAKIAlbTkZTRF9GaF0gPSB3cml0ZV9maWxlaGFuZGxlLAogCVtORlNEX1RocmVhZHNdID0gd3JpdGVfdGhyZWFkcywKIAlbTkZTRF9MZWFzZXRpbWVdID0gd3JpdGVfbGVhc2V0aW1lLAorCVtORlNEX1JlY292ZXJ5RGlyXSA9IHdyaXRlX3JlY292ZXJ5ZGlyLAogfTsKIAogc3RhdGljIHNzaXplX3QgbmZzY3RsX3RyYW5zYWN0aW9uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCkBAIC0zNDksNiArMzUyLDI1IEBACiAJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCitzdGF0aWMgc3NpemVfdCB3cml0ZV9yZWNvdmVyeWRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwljaGFyICptZXNnID0gYnVmOworCWNoYXIgKnJlY2RpcjsKKwlpbnQgbGVuLCBzdGF0dXM7CisKKwlpZiAoc2l6ZSA+IFBBVEhfTUFYIHx8IGJ1ZltzaXplLTFdICE9ICdcbicpCisJCXJldHVybiAtRUlOVkFMOworCWJ1ZltzaXplLTFdID0gMDsKKworCXJlY2RpciA9IG1lc2c7CisJbGVuID0gcXdvcmRfZ2V0KCZtZXNnLCByZWNkaXIsIHNpemUpOworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSBuZnM0X3Jlc2V0X3JlY292ZXJ5ZGlyKHJlY2Rpcik7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqCXBvcHVsYXRpbmcgdGhlIGZpbGVzeXN0ZW0uCkBAIC0zNjksNiArMzkxLDcgQEAKIAkJW05GU0RfVGhyZWFkc10gPSB7InRocmVhZHMiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAogI2lmZGVmIENPTkZJR19ORlNEX1Y0CiAJCVtORlNEX0xlYXNldGltZV0gPSB7Im5mc3Y0bGVhc2V0aW1lIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKKwkJW05GU0RfUmVjb3ZlcnlEaXJdID0geyJuZnN2NHJlY292ZXJ5ZGlyIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKICNlbmRpZgogCQkvKiBsYXN0IG9uZSAqLyB7IiJ9CiAJfTsKQEAgLTM5Nyw5ICs0MjAsOCBAQAogCW5mc2RfY2FjaGVfaW5pdCgpOwkvKiBSUEMgcmVwbHkgY2FjaGUgKi8KIAluZnNkX2V4cG9ydF9pbml0KCk7CS8qIEV4cG9ydHMgdGFibGUgKi8KIAluZnNkX2xvY2tkX2luaXQoKTsJLyogbG9ja2QtPm5mc2QgY2FsbGJhY2tzICovCi0jaWZkZWYgQ09ORklHX05GU0RfVjQKKwluZnM0X3N0YXRlX2luaXQoKTsJLyogTkZTdjQgbG9ja2luZyBzdGF0ZSAqLwogCW5mc2RfaWRtYXBfaW5pdCgpOyAgICAgIC8qIE5hbWUgdG8gSUQgbWFwcGluZyAqLwotI2VuZGlmIC8qIENPTkZJR19ORlNEX1Y0ICovCiAJaWYgKHByb2NfbWtkaXIoImZzL25mcyIsIE5VTEwpKSB7CiAJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7CiAJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImZzL25mcy9leHBvcnRzIiwgMCwgTlVMTCk7CkBAIC00MjYsOSArNDQ4LDcgQEAKIAlyZW1vdmVfcHJvY19lbnRyeSgiZnMvbmZzIiwgTlVMTCk7CiAJbmZzZF9zdGF0X3NodXRkb3duKCk7CiAJbmZzZF9sb2NrZF9zaHV0ZG93bigpOwotI2lmZGVmIENPTkZJR19ORlNEX1Y0CiAJbmZzZF9pZG1hcF9zaHV0ZG93bigpOwotI2VuZGlmIC8qIENPTkZJR19ORlNEX1Y0ICovCiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNkX2ZzX3R5cGUpOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc3N2Yy5jIGIvZnMvbmZzZC9uZnNzdmMuYwppbmRleCA5MDRkZjYwLi4wN2I5YTA2IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mc3N2Yy5jCisrKyBiL2ZzL25mc2QvbmZzc3ZjLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAllcnJvciA9CW5mc2RfcmFjYWNoZV9pbml0KDIqbnJzZXJ2cyk7CiAJaWYgKGVycm9yPDApCiAJCWdvdG8gb3V0OwotCWVycm9yID0gbmZzNF9zdGF0ZV9pbml0KCk7CisJZXJyb3IgPSBuZnM0X3N0YXRlX3N0YXJ0KCk7CiAJaWYgKGVycm9yPDApCiAJCWdvdG8gb3V0OwogCWlmICghbmZzZF9zZXJ2KSB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCBkZTM0MGZmLi40ZjJjZDNkIDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTQ1LDExICs0NSwxMCBAQAogI2VuZGlmIC8qIENPTkZJR19ORlNEX1YzICovCiAjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNmaC5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgotI2luY2x1ZGUgPGxpbnV4L3hhdHRyX2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+Ci0jaWZkZWYgQ09ORklHX05GU0RfVjQKICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKyNpZmRlZiBDT05GSUdfTkZTRF9WNAogI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNC5oPgogI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+CkBAIC03MzQsNyArNzMzLDcgQEAKIAl1cCgmaW5vZGUtPmlfc2VtKTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIG5mc2Rfc3luY19kaXIoc3RydWN0IGRlbnRyeSAqZHApCiB7CiAJbmZzZF9kb3N5bmMoTlVMTCwgZHAsIGRwLT5kX2lub2RlLT5pX2ZvcCk7CkBAIC04NjEsNyArODYwLDcgQEAKIAkJbmZzZHN0YXRzLmlvX3JlYWQgKz0gZXJyOwogCQkqY291bnQgPSBlcnI7CiAJCWVyciA9IDA7Ci0JCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9BQ0NFU1MpOworCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9kZW50cnkpOwogCX0gZWxzZSAKIAkJZXJyID0gbmZzZXJybm8oZXJyKTsKIG91dDoKQEAgLTkxNyw3ICs5MTYsNyBAQAogCXNldF9mcyhvbGRmcyk7CiAJaWYgKGVyciA+PSAwKSB7CiAJCW5mc2RzdGF0cy5pb193cml0ZSArPSBjbnQ7Ci0JCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9NT0RJRlkpOworCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9kZW50cnkpOwogCX0KIAogCS8qIGNsZWFyIHNldHVpZC9zZXRnaWQgZmxhZyBhZnRlciB3cml0ZSAqLwpAQCAtMTg3MiwxMCArMTg3MSwxMCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CiAJc3dpdGNoKHR5cGUpIHsKIAkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCQluYW1lID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTOworCQkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CiAJCQlicmVhazsKIAkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQkJbmFtZSA9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQ7CisJCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKQEAgLTE5MTksMTcgKzE5MTgsMTcgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCXN3aXRjaCh0eXBlKSB7CiAJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQkJbmFtZSA9IFhBVFRSX05BTUVfQUNMX0FDQ0VTUzsKKwkJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLQkJCW5hbWUgPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUOworCQkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCiAJaWYgKGFjbCAmJiBhY2wtPmFfY291bnQpIHsKLQkJc2l6ZSA9IHhhdHRyX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7CisJCXNpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShhY2wtPmFfY291bnQpOwogCQl2YWx1ZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdmFsdWUpCiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwppbmRleCA4ZWM2M2Y3Li4zMmJmMDVlIDEwMDY0NAotLS0gYS9mcy9vcGVuLmMKKysrIGIvZnMvb3Blbi5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CkBAIC04MDgsNyArODA4LDkgQEAKIAogCS8qIE5COiB3ZSdyZSBzdXJlIHRvIGhhdmUgY29ycmVjdCBhX29wcyBvbmx5IGFmdGVyIGZfb3AtPm9wZW4gKi8KIAlpZiAoZi0+Zl9mbGFncyAmIE9fRElSRUNUKSB7Ci0JCWlmICghZi0+Zl9tYXBwaW5nLT5hX29wcyB8fCAhZi0+Zl9tYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKSB7CisJCWlmICghZi0+Zl9tYXBwaW5nLT5hX29wcyB8fAorCQkgICAgKCghZi0+Zl9tYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKSAmJgorCQkgICAgKCFmLT5mX21hcHBpbmctPmFfb3BzLT5nZXRfeGlwX3BhZ2UpKSkgewogCQkJZnB1dChmKTsKIAkJCWYgPSBFUlJfUFRSKC1FSU5WQUwpOwogCQl9CkBAIC05NDksNiArOTUxLDcgQEAKIAkJCQlwdXRfdW51c2VkX2ZkKGZkKTsKIAkJCQlmZCA9IFBUUl9FUlIoZik7CiAJCQl9IGVsc2UgeworCQkJCWZzbm90aWZ5X29wZW4oZi0+Zl9kZW50cnkpOwogCQkJCWZkX2luc3RhbGwoZmQsIGYpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL01ha2VmaWxlIGIvZnMvcGFydGl0aW9ucy9NYWtlZmlsZQppbmRleCA0YzgzYzE3Li42NmQ1Y2MyIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL01ha2VmaWxlCisrKyBiL2ZzL3BhcnRpdGlvbnMvTWFrZWZpbGUKQEAgLTE3LDQgKzE3LDMgQEAKIG9iai0kKENPTkZJR19VTFRSSVhfUEFSVElUSU9OKSArPSB1bHRyaXgubwogb2JqLSQoQ09ORklHX0lCTV9QQVJUSVRJT04pICs9IGlibS5vCiBvYmotJChDT05GSUdfRUZJX1BBUlRJVElPTikgKz0gZWZpLm8KLW9iai0kKENPTkZJR19ORUM5OF9QQVJUSVRJT04pICs9IG5lYzk4Lm8gbXNkb3MubwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IDJjYWI5OGEuLjc3ZTE3OGYgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTc5LDkgKzc5LDYgQEAKICNpZmRlZiBDT05GSUdfTERNX1BBUlRJVElPTgogCWxkbV9wYXJ0aXRpb24sCQkvKiB0aGlzIG11c3QgY29tZSBiZWZvcmUgbXNkb3MgKi8KICNlbmRpZgotI2lmZGVmIENPTkZJR19ORUM5OF9QQVJUSVRJT04KLQluZWM5OF9wYXJ0aXRpb24sCS8qIG11c3QgYmUgY29tZSBiZWZvcmUgYG1zZG9zX3BhcnRpdGlvbicgKi8KLSNlbmRpZgogI2lmZGVmIENPTkZJR19NU0RPU19QQVJUSVRJT04KIAltc2Rvc19wYXJ0aXRpb24sCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suaCBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suaAppbmRleCA0M2FkY2M2Li4xN2FlOGVjIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmgKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5oCkBAIC0zMCw3ICszMCwzIEBACiAKIGV4dGVybiBpbnQgd2Fybl9ub19wYXJ0OwogCi1leHRlcm4gdm9pZCBwYXJzZV9ic2Qoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwKLQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHUzMiBvZmZzZXQsIHUzMiBzaXplLAotCQkJaW50IG9yaWdpbiwgY2hhciAqZmxhdm91ciwgaW50IG1heF9wYXJ0aXRpb25zKTsKLQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9tc2Rvcy5jIGIvZnMvcGFydGl0aW9ucy9tc2Rvcy5jCmluZGV4IDU4NGEyN2IuLjk5MzVkMjUgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvbXNkb3MuYworKysgYi9mcy9wYXJ0aXRpb25zL21zZG9zLmMKQEAgLTIwMiwxMiArMjAyLDEyIEBACiAjZW5kaWYKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0JTRF9ESVNLTEFCRUwpIHx8IGRlZmluZWQoQ09ORklHX05FQzk4X1BBUlRJVElPTikKKyNpZiBkZWZpbmVkKENPTkZJR19CU0RfRElTS0xBQkVMKQogLyogCiAgKiBDcmVhdGUgZGV2aWNlcyBmb3IgQlNEIHBhcnRpdGlvbnMgbGlzdGVkIGluIGEgZGlza2xhYmVsLCB1bmRlciBhCiAgKiBkb3MtbGlrZSBwYXJ0aXRpb24uIFNlZSBwYXJzZV9leHRlbmRlZCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogcGFyc2VfYnNkKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCXUzMiBvZmZzZXQsIHUzMiBzaXplLCBpbnQgb3JpZ2luLCBjaGFyICpmbGF2b3VyLAogCQlpbnQgbWF4X3BhcnRpdGlvbnMpCmRpZmYgLS1naXQgYS9mcy9wcm9jL01ha2VmaWxlIGIvZnMvcHJvYy9NYWtlZmlsZQppbmRleCA3MzhiOWI2Li43NDMxZDdiIDEwMDY0NAotLS0gYS9mcy9wcm9jL01ha2VmaWxlCisrKyBiL2ZzL3Byb2MvTWFrZWZpbGUKQEAgLTExLDQgKzExLDUgQEAKIAkJa21zZy5vIHByb2NfdHR5Lm8gcHJvY19taXNjLm8KIAogcHJvYy0kKENPTkZJR19QUk9DX0tDT1JFKQkrPSBrY29yZS5vCitwcm9jLSQoQ09ORklHX1BST0NfVk1DT1JFKQkrPSB2bWNvcmUubwogcHJvYy0kKENPTkZJR19QUk9DX0RFVklDRVRSRUUpCSs9IHByb2NfZGV2dHJlZS5vCmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbWlzYy5jIGIvZnMvcHJvYy9wcm9jX21pc2MuYwppbmRleCA5NGI1NzBhLi5hMzQ1MzU1IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2NfbWlzYy5jCisrKyBiL2ZzL3Byb2MvcHJvY19taXNjLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTYxOCw2ICs2MTksMTEgQEAKIAkJCQkoc2l6ZV90KWhpZ2hfbWVtb3J5IC0gUEFHRV9PRkZTRVQgKyBQQUdFX1NJWkU7CiAJfQogI2VuZGlmCisjaWZkZWYgQ09ORklHX1BST0NfVk1DT1JFCisJcHJvY192bWNvcmUgPSBjcmVhdGVfcHJvY19lbnRyeSgidm1jb3JlIiwgU19JUlVTUiwgTlVMTCk7CisJaWYgKHByb2Nfdm1jb3JlKQorCQlwcm9jX3ZtY29yZS0+cHJvY19mb3BzID0gJnByb2Nfdm1jb3JlX29wZXJhdGlvbnM7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfTUFHSUNfU1lTUlEKIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzeXNycS10cmlnZ2VyIiwgU19JV1VTUiwgTlVMTCk7CiAJaWYgKGVudHJ5KQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy92bWNvcmUuYyBiL2ZzL3Byb2Mvdm1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZTdiNjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL3ZtY29yZS5jCkBAIC0wLDAgKzEsNjY5IEBACisvKgorICoJZnMvcHJvYy92bWNvcmUuYyBJbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyB0aGUgY3Jhc2gKKyAqIAkJCQkgZHVtcCBmcm9tIHRoZSBzeXN0ZW0ncyBwcmV2aW91cyBsaWZlLgorICogCUhlYXZpbHkgYm9ycm93ZWQgZnJvbSBmcy9wcm9jL2tjb3JlLmMKKyAqCUNyZWF0ZWQgYnk6IEhhcmlwcmFzYWQgTmVsbGl0aGVlcnRoYSAoaGFyaUBpbi5pYm0uY29tKQorICoJQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQuIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiBMaXN0IHJlcHJlc2VudGluZyBjaHVua3Mgb2YgY29udGlndW91cyBtZW1vcnkgYXJlYXMgYW5kIHRoZWlyIG9mZnNldHMgaW4KKyAqIHZtY29yZSBmaWxlLgorICovCitzdGF0aWMgTElTVF9IRUFEKHZtY29yZV9saXN0KTsKKworLyogU3RvcmVzIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyBrZXJuZWwgZWxmIGNvcmUgaGVhZGVycy4gKi8KK3N0YXRpYyBjaGFyICplbGZjb3JlYnVmOworc3RhdGljIHNpemVfdCBlbGZjb3JlYnVmX3N6OworCisvKiBUb3RhbCBzaXplIG9mIHZtY29yZSBmaWxlLiAqLworc3RhdGljIHU2NCB2bWNvcmVfc2l6ZTsKKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3ZtY29yZSA9IE5VTEw7CisKKy8qIFJlYWRzIGEgcGFnZSBmcm9tIHRoZSBvbGRtZW0gZGV2aWNlIGZyb20gZ2l2ZW4gb2Zmc2V0LiAqLworc3RhdGljIHNzaXplX3QgcmVhZF9mcm9tX29sZG1lbShjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgbG9mZl90ICpwcG9zLCBpbnQgdXNlcmJ1ZikKK3sKKwl1bnNpZ25lZCBsb25nIHBmbiwgb2Zmc2V0OworCXNpemVfdCBucl9ieXRlczsKKwlzc2l6ZV90IHJlYWQgPSAwLCB0bXA7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSgqcHBvcyAlIFBBR0VfU0laRSk7CisJcGZuID0gKHVuc2lnbmVkIGxvbmcpKCpwcG9zIC8gUEFHRV9TSVpFKTsKKwlpZiAocGZuID4gc2F2ZWRfbWF4X3BmbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbyB7CisJCWlmIChjb3VudCA+IChQQUdFX1NJWkUgLSBvZmZzZXQpKQorCQkJbnJfYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisJCWVsc2UKKwkJCW5yX2J5dGVzID0gY291bnQ7CisKKwkJdG1wID0gY29weV9vbGRtZW1fcGFnZShwZm4sIGJ1ZiwgbnJfYnl0ZXMsIG9mZnNldCwgdXNlcmJ1Zik7CisJCWlmICh0bXAgPCAwKQorCQkJcmV0dXJuIHRtcDsKKwkJKnBwb3MgKz0gbnJfYnl0ZXM7CisJCWNvdW50IC09IG5yX2J5dGVzOworCQlidWYgKz0gbnJfYnl0ZXM7CisJCXJlYWQgKz0gbnJfYnl0ZXM7CisJCSsrcGZuOworCQlvZmZzZXQgPSAwOworCX0gd2hpbGUgKGNvdW50KTsKKworCXJldHVybiByZWFkOworfQorCisvKiBNYXBzIHZtY29yZSBmaWxlIG9mZnNldCB0byByZXNwZWN0aXZlIHBoeXNpY2FsIGFkZHJlc3MgaW4gbWVtcm95LiAqLworc3RhdGljIHU2NCBtYXBfb2Zmc2V0X3RvX3BhZGRyKGxvZmZfdCBvZmZzZXQsIHN0cnVjdCBsaXN0X2hlYWQgKnZjX2xpc3QsCisJCQkJCXN0cnVjdCB2bWNvcmUgKiptX3B0cikKK3sKKwlzdHJ1Y3Qgdm1jb3JlICptOworCXU2NCBwYWRkcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgdmNfbGlzdCwgbGlzdCkgeworCQl1NjQgc3RhcnQsIGVuZDsKKwkJc3RhcnQgPSBtLT5vZmZzZXQ7CisJCWVuZCA9IG0tPm9mZnNldCArIG0tPnNpemUgLSAxOworCQlpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8PSBlbmQpIHsKKwkJCXBhZGRyID0gbS0+cGFkZHIgKyBvZmZzZXQgLSBzdGFydDsKKwkJCSptX3B0ciA9IG07CisJCQlyZXR1cm4gcGFkZHI7CisJCX0KKwl9CisJKm1fcHRyID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBmcm9tIHRoZSBFTEYgaGVhZGVyIGFuZCB0aGVuIHRoZSBjcmFzaCBkdW1wLiBPbiBlcnJvciwgbmVnYXRpdmUgdmFsdWUgaXMKKyAqIHJldHVybmVkIG90aGVyd2lzZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBhcmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHJlYWRfdm1jb3JlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCXNpemVfdCBidWZsZW4sIGxvZmZfdCAqZnBvcykKK3sKKwlzc2l6ZV90IGFjYyA9IDAsIHRtcDsKKwlzaXplX3QgdHN6LCBucl9ieXRlczsKKwl1NjQgc3RhcnQ7CisJc3RydWN0IHZtY29yZSAqY3Vycl9tID0gTlVMTDsKKworCWlmIChidWZsZW4gPT0gMCB8fCAqZnBvcyA+PSB2bWNvcmVfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiB0cmltIGJ1ZmxlbiB0byBub3QgZ28gYmV5b25kIEVPRiAqLworCWlmIChidWZsZW4gPiB2bWNvcmVfc2l6ZSAtICpmcG9zKQorCQlidWZsZW4gPSB2bWNvcmVfc2l6ZSAtICpmcG9zOworCisJLyogUmVhZCBFTEYgY29yZSBoZWFkZXIgKi8KKwlpZiAoKmZwb3MgPCBlbGZjb3JlYnVmX3N6KSB7CisJCXRzeiA9IGVsZmNvcmVidWZfc3ogLSAqZnBvczsKKwkJaWYgKGJ1ZmxlbiA8IHRzeikKKwkJCXRzeiA9IGJ1ZmxlbjsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGVsZmNvcmVidWYgKyAqZnBvcywgdHN6KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlidWZsZW4gLT0gdHN6OworCQkqZnBvcyArPSB0c3o7CisJCWJ1ZmZlciArPSB0c3o7CisJCWFjYyArPSB0c3o7CisKKwkJLyogbGVhdmUgbm93IGlmIGZpbGxlZCBidWZmZXIgYWxyZWFkeSAqLworCQlpZiAoYnVmbGVuID09IDApCisJCQlyZXR1cm4gYWNjOworCX0KKworCXN0YXJ0ID0gbWFwX29mZnNldF90b19wYWRkcigqZnBvcywgJnZtY29yZV9saXN0LCAmY3Vycl9tKTsKKwlpZiAoIWN1cnJfbSkKKyAgICAgICAgCXJldHVybiAtRUlOVkFMOworCWlmICgodHN6ID0gKFBBR0VfU0laRSAtIChzdGFydCAmIH5QQUdFX01BU0spKSkgPiBidWZsZW4pCisJCXRzeiA9IGJ1ZmxlbjsKKworCS8qIENhbGN1bGF0ZSBsZWZ0IGJ5dGVzIGluIGN1cnJlbnQgbWVtb3J5IHNlZ21lbnQuICovCisJbnJfYnl0ZXMgPSAoY3Vycl9tLT5zaXplIC0gKHN0YXJ0IC0gY3Vycl9tLT5wYWRkcikpOworCWlmICh0c3ogPiBucl9ieXRlcykKKwkJdHN6ID0gbnJfYnl0ZXM7CisKKwl3aGlsZSAoYnVmbGVuKSB7CisJCXRtcCA9IHJlYWRfZnJvbV9vbGRtZW0oYnVmZmVyLCB0c3osICZzdGFydCwgMSk7CisJCWlmICh0bXAgPCAwKQorCQkJcmV0dXJuIHRtcDsKKwkJYnVmbGVuIC09IHRzejsKKwkJKmZwb3MgKz0gdHN6OworCQlidWZmZXIgKz0gdHN6OworCQlhY2MgKz0gdHN6OworCQlpZiAoc3RhcnQgPj0gKGN1cnJfbS0+cGFkZHIgKyBjdXJyX20tPnNpemUpKSB7CisJCQlpZiAoY3Vycl9tLT5saXN0Lm5leHQgPT0gJnZtY29yZV9saXN0KQorCQkJCXJldHVybiBhY2M7CS8qRU9GKi8KKwkJCWN1cnJfbSA9IGxpc3RfZW50cnkoY3Vycl9tLT5saXN0Lm5leHQsCisJCQkJCQlzdHJ1Y3Qgdm1jb3JlLCBsaXN0KTsKKwkJCXN0YXJ0ID0gY3Vycl9tLT5wYWRkcjsKKwkJfQorCQlpZiAoKHRzeiA9IChQQUdFX1NJWkUgLSAoc3RhcnQgJiB+UEFHRV9NQVNLKSkpID4gYnVmbGVuKQorCQkJdHN6ID0gYnVmbGVuOworCQkvKiBDYWxjdWxhdGUgbGVmdCBieXRlcyBpbiBjdXJyZW50IG1lbW9yeSBzZWdtZW50LiAqLworCQlucl9ieXRlcyA9IChjdXJyX20tPnNpemUgLSAoc3RhcnQgLSBjdXJyX20tPnBhZGRyKSk7CisJCWlmICh0c3ogPiBucl9ieXRlcykKKwkJCXRzeiA9IG5yX2J5dGVzOworCX0KKwlyZXR1cm4gYWNjOworfQorCitzdGF0aWMgaW50IG9wZW5fdm1jb3JlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfdm1jb3JlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gcmVhZF92bWNvcmUsCisJLm9wZW4JCT0gb3Blbl92bWNvcmUsCit9OworCitzdGF0aWMgc3RydWN0IHZtY29yZSogX19pbml0IGdldF9uZXdfZWxlbWVudCh2b2lkKQoreworCXN0cnVjdCB2bWNvcmUgKnA7CisKKwlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCXJldHVybiBwOworfQorCitzdGF0aWMgdTY0IF9faW5pdCBnZXRfdm1jb3JlX3NpemVfZWxmNjQoY2hhciAqZWxmcHRyKQoreworCWludCBpOworCXU2NCBzaXplOworCUVsZjY0X0VoZHIgKmVoZHJfcHRyOworCUVsZjY0X1BoZHIgKnBoZHJfcHRyOworCisJZWhkcl9wdHIgPSAoRWxmNjRfRWhkciAqKWVsZnB0cjsKKwlwaGRyX3B0ciA9IChFbGY2NF9QaGRyKikoZWxmcHRyICsgc2l6ZW9mKEVsZjY0X0VoZHIpKTsKKwlzaXplID0gc2l6ZW9mKEVsZjY0X0VoZHIpICsgKChlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmNjRfUGhkcikpOworCWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrKSB7CisJCXNpemUgKz0gcGhkcl9wdHItPnBfbWVtc3o7CisJCXBoZHJfcHRyKys7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdTY0IF9faW5pdCBnZXRfdm1jb3JlX3NpemVfZWxmMzIoY2hhciAqZWxmcHRyKQoreworCWludCBpOworCXU2NCBzaXplOworCUVsZjMyX0VoZHIgKmVoZHJfcHRyOworCUVsZjMyX1BoZHIgKnBoZHJfcHRyOworCisJZWhkcl9wdHIgPSAoRWxmMzJfRWhkciAqKWVsZnB0cjsKKwlwaGRyX3B0ciA9IChFbGYzMl9QaGRyKikoZWxmcHRyICsgc2l6ZW9mKEVsZjMyX0VoZHIpKTsKKwlzaXplID0gc2l6ZW9mKEVsZjMyX0VoZHIpICsgKChlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmMzJfUGhkcikpOworCWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrKSB7CisJCXNpemUgKz0gcGhkcl9wdHItPnBfbWVtc3o7CisJCXBoZHJfcHRyKys7CisJfQorCXJldHVybiBzaXplOworfQorCisvKiBNZXJnZXMgYWxsIHRoZSBQVF9OT1RFIGhlYWRlcnMgaW50byBvbmUuICovCitzdGF0aWMgaW50IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmNjQoY2hhciAqZWxmcHRyLCBzaXplX3QgKmVsZnN6LAorCQkJCQkJc3RydWN0IGxpc3RfaGVhZCAqdmNfbGlzdCkKK3sKKwlpbnQgaSwgbnJfcHRub3RlPTAsIHJjPTA7CisJY2hhciAqdG1wOworCUVsZjY0X0VoZHIgKmVoZHJfcHRyOworCUVsZjY0X1BoZHIgcGhkciwgKnBoZHJfcHRyOworCUVsZjY0X05oZHIgKm5oZHJfcHRyOworCXU2NCBwaGRyX3N6ID0gMCwgbm90ZV9vZmY7CisKKwllaGRyX3B0ciA9IChFbGY2NF9FaGRyICopZWxmcHRyOworCXBoZHJfcHRyID0gKEVsZjY0X1BoZHIqKShlbGZwdHIgKyBzaXplb2YoRWxmNjRfRWhkcikpOworCWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrLCBwaGRyX3B0cisrKSB7CisJCWludCBqOworCQl2b2lkICpub3Rlc19zZWN0aW9uOworCQlzdHJ1Y3Qgdm1jb3JlICpuZXc7CisJCXU2NCBvZmZzZXQsIG1heF9zeiwgc3osIHJlYWxfc3ogPSAwOworCQlpZiAocGhkcl9wdHItPnBfdHlwZSAhPSBQVF9OT1RFKQorCQkJY29udGludWU7CisJCW5yX3B0bm90ZSsrOworCQltYXhfc3ogPSBwaGRyX3B0ci0+cF9tZW1zejsKKwkJb2Zmc2V0ID0gcGhkcl9wdHItPnBfb2Zmc2V0OworCQlub3Rlc19zZWN0aW9uID0ga21hbGxvYyhtYXhfc3osIEdGUF9LRVJORUwpOworCQlpZiAoIW5vdGVzX3NlY3Rpb24pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSByZWFkX2Zyb21fb2xkbWVtKG5vdGVzX3NlY3Rpb24sIG1heF9zeiwgJm9mZnNldCwgMCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWtmcmVlKG5vdGVzX3NlY3Rpb24pOworCQkJcmV0dXJuIHJjOworCQl9CisJCW5oZHJfcHRyID0gbm90ZXNfc2VjdGlvbjsKKwkJZm9yIChqID0gMDsgaiA8IG1heF9zejsgaiArPSBzeikgeworCQkJaWYgKG5oZHJfcHRyLT5uX25hbWVzeiA9PSAwKQorCQkJCWJyZWFrOworCQkJc3ogPSBzaXplb2YoRWxmNjRfTmhkcikgKworCQkJCSgobmhkcl9wdHItPm5fbmFtZXN6ICsgMykgJiB+MykgKworCQkJCSgobmhkcl9wdHItPm5fZGVzY3N6ICsgMykgJiB+Myk7CisJCQlyZWFsX3N6ICs9IHN6OworCQkJbmhkcl9wdHIgPSAoRWxmNjRfTmhkciopKChjaGFyKiluaGRyX3B0ciArIHN6KTsKKwkJfQorCisJCS8qIEFkZCB0aGlzIGNvbnRpZ3VvdXMgY2h1bmsgb2Ygbm90ZXMgc2VjdGlvbiB0byB2bWNvcmUgbGlzdC4qLworCQluZXcgPSBnZXRfbmV3X2VsZW1lbnQoKTsKKwkJaWYgKCFuZXcpIHsKKwkJCWtmcmVlKG5vdGVzX3NlY3Rpb24pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbmV3LT5wYWRkciA9IHBoZHJfcHRyLT5wX29mZnNldDsKKwkJbmV3LT5zaXplID0gcmVhbF9zejsKKwkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCB2Y19saXN0KTsKKwkJcGhkcl9zeiArPSByZWFsX3N6OworCQlrZnJlZShub3Rlc19zZWN0aW9uKTsKKwl9CisKKwkvKiBQcmVwYXJlIG1lcmdlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVyLiAqLworCXBoZHIucF90eXBlICAgID0gUFRfTk9URTsKKwlwaGRyLnBfZmxhZ3MgICA9IDA7CisJbm90ZV9vZmYgPSBzaXplb2YoRWxmNjRfRWhkcikgKworCQkJKGVoZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsxKSAqIHNpemVvZihFbGY2NF9QaGRyKTsKKwlwaGRyLnBfb2Zmc2V0ICA9IG5vdGVfb2ZmOworCXBoZHIucF92YWRkciAgID0gcGhkci5wX3BhZGRyID0gMDsKKwlwaGRyLnBfZmlsZXN6ICA9IHBoZHIucF9tZW1zeiA9IHBoZHJfc3o7CisJcGhkci5wX2FsaWduICAgPSAwOworCisJLyogQWRkIG1lcmdlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVyKi8KKwl0bXAgPSBlbGZwdHIgKyBzaXplb2YoRWxmNjRfRWhkcik7CisJbWVtY3B5KHRtcCwgJnBoZHIsIHNpemVvZihwaGRyKSk7CisJdG1wICs9IHNpemVvZihwaGRyKTsKKworCS8qIFJlbW92ZSB1bndhbnRlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVycy4gKi8KKwlpID0gKG5yX3B0bm90ZSAtIDEpICogc2l6ZW9mKEVsZjY0X1BoZHIpOworCSplbGZzeiA9ICplbGZzeiAtIGk7CisJbWVtbW92ZSh0bXAsIHRtcCtpLCAoKCplbGZzeiktc2l6ZW9mKEVsZjY0X0VoZHIpLXNpemVvZihFbGY2NF9QaGRyKSkpOworCisJLyogTW9kaWZ5IGVfcGhudW0gdG8gcmVmbGVjdCBtZXJnZWQgaGVhZGVycy4gKi8KKwllaGRyX3B0ci0+ZV9waG51bSA9IGVoZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsgMTsKKworCXJldHVybiAwOworfQorCisvKiBNZXJnZXMgYWxsIHRoZSBQVF9OT1RFIGhlYWRlcnMgaW50byBvbmUuICovCitzdGF0aWMgaW50IF9faW5pdCBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmMzIoY2hhciAqZWxmcHRyLCBzaXplX3QgKmVsZnN6LAorCQkJCQkJc3RydWN0IGxpc3RfaGVhZCAqdmNfbGlzdCkKK3sKKwlpbnQgaSwgbnJfcHRub3RlPTAsIHJjPTA7CisJY2hhciAqdG1wOworCUVsZjMyX0VoZHIgKmVoZHJfcHRyOworCUVsZjMyX1BoZHIgcGhkciwgKnBoZHJfcHRyOworCUVsZjMyX05oZHIgKm5oZHJfcHRyOworCXU2NCBwaGRyX3N6ID0gMCwgbm90ZV9vZmY7CisKKwllaGRyX3B0ciA9IChFbGYzMl9FaGRyICopZWxmcHRyOworCXBoZHJfcHRyID0gKEVsZjMyX1BoZHIqKShlbGZwdHIgKyBzaXplb2YoRWxmMzJfRWhkcikpOworCWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrLCBwaGRyX3B0cisrKSB7CisJCWludCBqOworCQl2b2lkICpub3Rlc19zZWN0aW9uOworCQlzdHJ1Y3Qgdm1jb3JlICpuZXc7CisJCXU2NCBvZmZzZXQsIG1heF9zeiwgc3osIHJlYWxfc3ogPSAwOworCQlpZiAocGhkcl9wdHItPnBfdHlwZSAhPSBQVF9OT1RFKQorCQkJY29udGludWU7CisJCW5yX3B0bm90ZSsrOworCQltYXhfc3ogPSBwaGRyX3B0ci0+cF9tZW1zejsKKwkJb2Zmc2V0ID0gcGhkcl9wdHItPnBfb2Zmc2V0OworCQlub3Rlc19zZWN0aW9uID0ga21hbGxvYyhtYXhfc3osIEdGUF9LRVJORUwpOworCQlpZiAoIW5vdGVzX3NlY3Rpb24pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSByZWFkX2Zyb21fb2xkbWVtKG5vdGVzX3NlY3Rpb24sIG1heF9zeiwgJm9mZnNldCwgMCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWtmcmVlKG5vdGVzX3NlY3Rpb24pOworCQkJcmV0dXJuIHJjOworCQl9CisJCW5oZHJfcHRyID0gbm90ZXNfc2VjdGlvbjsKKwkJZm9yIChqID0gMDsgaiA8IG1heF9zejsgaiArPSBzeikgeworCQkJaWYgKG5oZHJfcHRyLT5uX25hbWVzeiA9PSAwKQorCQkJCWJyZWFrOworCQkJc3ogPSBzaXplb2YoRWxmMzJfTmhkcikgKworCQkJCSgobmhkcl9wdHItPm5fbmFtZXN6ICsgMykgJiB+MykgKworCQkJCSgobmhkcl9wdHItPm5fZGVzY3N6ICsgMykgJiB+Myk7CisJCQlyZWFsX3N6ICs9IHN6OworCQkJbmhkcl9wdHIgPSAoRWxmMzJfTmhkciopKChjaGFyKiluaGRyX3B0ciArIHN6KTsKKwkJfQorCisJCS8qIEFkZCB0aGlzIGNvbnRpZ3VvdXMgY2h1bmsgb2Ygbm90ZXMgc2VjdGlvbiB0byB2bWNvcmUgbGlzdC4qLworCQluZXcgPSBnZXRfbmV3X2VsZW1lbnQoKTsKKwkJaWYgKCFuZXcpIHsKKwkJCWtmcmVlKG5vdGVzX3NlY3Rpb24pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbmV3LT5wYWRkciA9IHBoZHJfcHRyLT5wX29mZnNldDsKKwkJbmV3LT5zaXplID0gcmVhbF9zejsKKwkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCB2Y19saXN0KTsKKwkJcGhkcl9zeiArPSByZWFsX3N6OworCQlrZnJlZShub3Rlc19zZWN0aW9uKTsKKwl9CisKKwkvKiBQcmVwYXJlIG1lcmdlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVyLiAqLworCXBoZHIucF90eXBlICAgID0gUFRfTk9URTsKKwlwaGRyLnBfZmxhZ3MgICA9IDA7CisJbm90ZV9vZmYgPSBzaXplb2YoRWxmMzJfRWhkcikgKworCQkJKGVoZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsxKSAqIHNpemVvZihFbGYzMl9QaGRyKTsKKwlwaGRyLnBfb2Zmc2V0ICA9IG5vdGVfb2ZmOworCXBoZHIucF92YWRkciAgID0gcGhkci5wX3BhZGRyID0gMDsKKwlwaGRyLnBfZmlsZXN6ICA9IHBoZHIucF9tZW1zeiA9IHBoZHJfc3o7CisJcGhkci5wX2FsaWduICAgPSAwOworCisJLyogQWRkIG1lcmdlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVyKi8KKwl0bXAgPSBlbGZwdHIgKyBzaXplb2YoRWxmMzJfRWhkcik7CisJbWVtY3B5KHRtcCwgJnBoZHIsIHNpemVvZihwaGRyKSk7CisJdG1wICs9IHNpemVvZihwaGRyKTsKKworCS8qIFJlbW92ZSB1bndhbnRlZCBQVF9OT1RFIHByb2dyYW0gaGVhZGVycy4gKi8KKwlpID0gKG5yX3B0bm90ZSAtIDEpICogc2l6ZW9mKEVsZjMyX1BoZHIpOworCSplbGZzeiA9ICplbGZzeiAtIGk7CisJbWVtbW92ZSh0bXAsIHRtcCtpLCAoKCplbGZzeiktc2l6ZW9mKEVsZjMyX0VoZHIpLXNpemVvZihFbGYzMl9QaGRyKSkpOworCisJLyogTW9kaWZ5IGVfcGhudW0gdG8gcmVmbGVjdCBtZXJnZWQgaGVhZGVycy4gKi8KKwllaGRyX3B0ci0+ZV9waG51bSA9IGVoZHJfcHRyLT5lX3BobnVtIC0gbnJfcHRub3RlICsgMTsKKworCXJldHVybiAwOworfQorCisvKiBBZGQgbWVtb3J5IGNodW5rcyByZXByZXNlbnRlZCBieSBwcm9ncmFtIGhlYWRlcnMgdG8gdm1jb3JlIGxpc3QuIEFsc28gdXBkYXRlCisgKiB0aGUgbmV3IG9mZnNldCBmaWVsZHMgb2YgZXhwb3J0ZWQgcHJvZ3JhbSBoZWFkZXJzLiAqLworc3RhdGljIGludCBfX2luaXQgcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9oZWFkZXJzX2VsZjY0KGNoYXIgKmVsZnB0ciwKKwkJCQkJCXNpemVfdCBlbGZzeiwKKwkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnZjX2xpc3QpCit7CisJaW50IGk7CisJRWxmNjRfRWhkciAqZWhkcl9wdHI7CisJRWxmNjRfUGhkciAqcGhkcl9wdHI7CisJbG9mZl90IHZtY29yZV9vZmY7CisJc3RydWN0IHZtY29yZSAqbmV3OworCisJZWhkcl9wdHIgPSAoRWxmNjRfRWhkciAqKWVsZnB0cjsKKwlwaGRyX3B0ciA9IChFbGY2NF9QaGRyKikoZWxmcHRyICsgc2l6ZW9mKEVsZjY0X0VoZHIpKTsgLyogUFRfTk9URSBoZHIgKi8KKworCS8qIEZpcnN0IHByb2dyYW0gaGVhZGVyIGlzIFBUX05PVEUgaGVhZGVyLiAqLworCXZtY29yZV9vZmYgPSBzaXplb2YoRWxmNjRfRWhkcikgKworCQkJKGVoZHJfcHRyLT5lX3BobnVtKSAqIHNpemVvZihFbGY2NF9QaGRyKSArCisJCQlwaGRyX3B0ci0+cF9tZW1zejsgLyogTm90ZSBzZWN0aW9ucyAqLworCisJZm9yIChpID0gMDsgaSA8IGVoZHJfcHRyLT5lX3BobnVtOyBpKyssIHBoZHJfcHRyKyspIHsKKwkJaWYgKHBoZHJfcHRyLT5wX3R5cGUgIT0gUFRfTE9BRCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFkZCB0aGlzIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IHRvIHZtY29yZSBsaXN0LiovCisJCW5ldyA9IGdldF9uZXdfZWxlbWVudCgpOworCQlpZiAoIW5ldykKKwkJCXJldHVybiAtRU5PTUVNOworCQluZXctPnBhZGRyID0gcGhkcl9wdHItPnBfb2Zmc2V0OworCQluZXctPnNpemUgPSBwaGRyX3B0ci0+cF9tZW1zejsKKwkJbGlzdF9hZGRfdGFpbCgmbmV3LT5saXN0LCB2Y19saXN0KTsKKworCQkvKiBVcGRhdGUgdGhlIHByb2dyYW0gaGVhZGVyIG9mZnNldC4gKi8KKwkJcGhkcl9wdHItPnBfb2Zmc2V0ID0gdm1jb3JlX29mZjsKKwkJdm1jb3JlX29mZiA9IHZtY29yZV9vZmYgKyBwaGRyX3B0ci0+cF9tZW1zejsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2Nlc3NfcHRsb2FkX3Byb2dyYW1faGVhZGVyc19lbGYzMihjaGFyICplbGZwdHIsCisJCQkJCQlzaXplX3QgZWxmc3osCisJCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICp2Y19saXN0KQoreworCWludCBpOworCUVsZjMyX0VoZHIgKmVoZHJfcHRyOworCUVsZjMyX1BoZHIgKnBoZHJfcHRyOworCWxvZmZfdCB2bWNvcmVfb2ZmOworCXN0cnVjdCB2bWNvcmUgKm5ldzsKKworCWVoZHJfcHRyID0gKEVsZjMyX0VoZHIgKillbGZwdHI7CisJcGhkcl9wdHIgPSAoRWxmMzJfUGhkciopKGVsZnB0ciArIHNpemVvZihFbGYzMl9FaGRyKSk7IC8qIFBUX05PVEUgaGRyICovCisKKwkvKiBGaXJzdCBwcm9ncmFtIGhlYWRlciBpcyBQVF9OT1RFIGhlYWRlci4gKi8KKwl2bWNvcmVfb2ZmID0gc2l6ZW9mKEVsZjMyX0VoZHIpICsKKwkJCShlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmMzJfUGhkcikgKworCQkJcGhkcl9wdHItPnBfbWVtc3o7IC8qIE5vdGUgc2VjdGlvbnMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBlaGRyX3B0ci0+ZV9waG51bTsgaSsrLCBwaGRyX3B0cisrKSB7CisJCWlmIChwaGRyX3B0ci0+cF90eXBlICE9IFBUX0xPQUQpCisJCQljb250aW51ZTsKKworCQkvKiBBZGQgdGhpcyBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSB0byB2bWNvcmUgbGlzdC4qLworCQluZXcgPSBnZXRfbmV3X2VsZW1lbnQoKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbmV3LT5wYWRkciA9IHBoZHJfcHRyLT5wX29mZnNldDsKKwkJbmV3LT5zaXplID0gcGhkcl9wdHItPnBfbWVtc3o7CisJCWxpc3RfYWRkX3RhaWwoJm5ldy0+bGlzdCwgdmNfbGlzdCk7CisKKwkJLyogVXBkYXRlIHRoZSBwcm9ncmFtIGhlYWRlciBvZmZzZXQgKi8KKwkJcGhkcl9wdHItPnBfb2Zmc2V0ID0gdm1jb3JlX29mZjsKKwkJdm1jb3JlX29mZiA9IHZtY29yZV9vZmYgKyBwaGRyX3B0ci0+cF9tZW1zejsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldHMgb2Zmc2V0IGZpZWxkcyBvZiB2bWNvcmUgZWxlbWVudHMuICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3ZtY29yZV9saXN0X29mZnNldHNfZWxmNjQoY2hhciAqZWxmcHRyLAorCQkJCQkJc3RydWN0IGxpc3RfaGVhZCAqdmNfbGlzdCkKK3sKKwlsb2ZmX3Qgdm1jb3JlX29mZjsKKwlFbGY2NF9FaGRyICplaGRyX3B0cjsKKwlzdHJ1Y3Qgdm1jb3JlICptOworCisJZWhkcl9wdHIgPSAoRWxmNjRfRWhkciAqKWVsZnB0cjsKKworCS8qIFNraXAgRWxmIGhlYWRlciBhbmQgcHJvZ3JhbSBoZWFkZXJzLiAqLworCXZtY29yZV9vZmYgPSBzaXplb2YoRWxmNjRfRWhkcikgKworCQkJKGVoZHJfcHRyLT5lX3BobnVtKSAqIHNpemVvZihFbGY2NF9QaGRyKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgdmNfbGlzdCwgbGlzdCkgeworCQltLT5vZmZzZXQgPSB2bWNvcmVfb2ZmOworCQl2bWNvcmVfb2ZmICs9IG0tPnNpemU7CisJfQorfQorCisvKiBTZXRzIG9mZnNldCBmaWVsZHMgb2Ygdm1jb3JlIGVsZW1lbnRzLiAqLworc3RhdGljIHZvaWQgX19pbml0IHNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjMyKGNoYXIgKmVsZnB0ciwKKwkJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKnZjX2xpc3QpCit7CisJbG9mZl90IHZtY29yZV9vZmY7CisJRWxmMzJfRWhkciAqZWhkcl9wdHI7CisJc3RydWN0IHZtY29yZSAqbTsKKworCWVoZHJfcHRyID0gKEVsZjMyX0VoZHIgKillbGZwdHI7CisKKwkvKiBTa2lwIEVsZiBoZWFkZXIgYW5kIHByb2dyYW0gaGVhZGVycy4gKi8KKwl2bWNvcmVfb2ZmID0gc2l6ZW9mKEVsZjMyX0VoZHIpICsKKwkJCShlaGRyX3B0ci0+ZV9waG51bSkgKiBzaXplb2YoRWxmMzJfUGhkcik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sIHZjX2xpc3QsIGxpc3QpIHsKKwkJbS0+b2Zmc2V0ID0gdm1jb3JlX29mZjsKKwkJdm1jb3JlX29mZiArPSBtLT5zaXplOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfY3Jhc2hfZWxmNjRfaGVhZGVycyh2b2lkKQoreworCWludCByYz0wOworCUVsZjY0X0VoZHIgZWhkcjsKKwl1NjQgYWRkcjsKKworCWFkZHIgPSBlbGZjb3JlaGRyX2FkZHI7CisKKwkvKiBSZWFkIEVsZiBoZWFkZXIgKi8KKwlyYyA9IHJlYWRfZnJvbV9vbGRtZW0oKGNoYXIqKSZlaGRyLCBzaXplb2YoRWxmNjRfRWhkciksICZhZGRyLCAwKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiBEbyBzb21lIGJhc2ljIFZlcmlmaWNhdGlvbi4gKi8KKwlpZiAobWVtY21wKGVoZHIuZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwIHx8CisJCShlaGRyLmVfdHlwZSAhPSBFVF9DT1JFKSB8fAorCQkhZWxmX2NoZWNrX2FyY2goJmVoZHIpIHx8CisJCWVoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1M2NCB8fAorCQllaGRyLmVfaWRlbnRbRUlfVkVSU0lPTl0gIT0gRVZfQ1VSUkVOVCB8fAorCQllaGRyLmVfdmVyc2lvbiAhPSBFVl9DVVJSRU5UIHx8CisJCWVoZHIuZV9laHNpemUgIT0gc2l6ZW9mKEVsZjY0X0VoZHIpIHx8CisJCWVoZHIuZV9waGVudHNpemUgIT0gc2l6ZW9mKEVsZjY0X1BoZHIpIHx8CisJCWVoZHIuZV9waG51bSA9PSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IENvcmUgaW1hZ2UgZWxmIGhlYWRlciBpcyBub3QiCisJCQkJCSJzYW5lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVhZCBpbiBhbGwgZWxmIGhlYWRlcnMuICovCisJZWxmY29yZWJ1Zl9zeiA9IHNpemVvZihFbGY2NF9FaGRyKSArIGVoZHIuZV9waG51bSAqIHNpemVvZihFbGY2NF9QaGRyKTsKKwllbGZjb3JlYnVmID0ga21hbGxvYyhlbGZjb3JlYnVmX3N6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZmNvcmVidWYpCisJCXJldHVybiAtRU5PTUVNOworCWFkZHIgPSBlbGZjb3JlaGRyX2FkZHI7CisJcmMgPSByZWFkX2Zyb21fb2xkbWVtKGVsZmNvcmVidWYsIGVsZmNvcmVidWZfc3osICZhZGRyLCAwKTsKKwlpZiAocmMgPCAwKSB7CisJCWtmcmVlKGVsZmNvcmVidWYpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogTWVyZ2UgYWxsIFBUX05PVEUgaGVhZGVycyBpbnRvIG9uZS4gKi8KKwlyYyA9IG1lcmdlX25vdGVfaGVhZGVyc19lbGY2NChlbGZjb3JlYnVmLCAmZWxmY29yZWJ1Zl9zeiwgJnZtY29yZV9saXN0KTsKKwlpZiAocmMpIHsKKwkJa2ZyZWUoZWxmY29yZWJ1Zik7CisJCXJldHVybiByYzsKKwl9CisJcmMgPSBwcm9jZXNzX3B0bG9hZF9wcm9ncmFtX2hlYWRlcnNfZWxmNjQoZWxmY29yZWJ1ZiwgZWxmY29yZWJ1Zl9zeiwKKwkJCQkJCQkmdm1jb3JlX2xpc3QpOworCWlmIChyYykgeworCQlrZnJlZShlbGZjb3JlYnVmKTsKKwkJcmV0dXJuIHJjOworCX0KKwlzZXRfdm1jb3JlX2xpc3Rfb2Zmc2V0c19lbGY2NChlbGZjb3JlYnVmLCAmdm1jb3JlX2xpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9jcmFzaF9lbGYzMl9oZWFkZXJzKHZvaWQpCit7CisJaW50IHJjPTA7CisJRWxmMzJfRWhkciBlaGRyOworCXU2NCBhZGRyOworCisJYWRkciA9IGVsZmNvcmVoZHJfYWRkcjsKKworCS8qIFJlYWQgRWxmIGhlYWRlciAqLworCXJjID0gcmVhZF9mcm9tX29sZG1lbSgoY2hhciopJmVoZHIsIHNpemVvZihFbGYzMl9FaGRyKSwgJmFkZHIsIDApOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIERvIHNvbWUgYmFzaWMgVmVyaWZpY2F0aW9uLiAqLworCWlmIChtZW1jbXAoZWhkci5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDAgfHwKKwkJKGVoZHIuZV90eXBlICE9IEVUX0NPUkUpIHx8CisJCSFlbGZfY2hlY2tfYXJjaCgmZWhkcikgfHwKKwkJZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyfHwKKwkJZWhkci5lX2lkZW50W0VJX1ZFUlNJT05dICE9IEVWX0NVUlJFTlQgfHwKKwkJZWhkci5lX3ZlcnNpb24gIT0gRVZfQ1VSUkVOVCB8fAorCQllaGRyLmVfZWhzaXplICE9IHNpemVvZihFbGYzMl9FaGRyKSB8fAorCQllaGRyLmVfcGhlbnRzaXplICE9IHNpemVvZihFbGYzMl9QaGRyKSB8fAorCQllaGRyLmVfcGhudW0gPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nOiBDb3JlIGltYWdlIGVsZiBoZWFkZXIgaXMgbm90IgorCQkJCQkic2FuZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFJlYWQgaW4gYWxsIGVsZiBoZWFkZXJzLiAqLworCWVsZmNvcmVidWZfc3ogPSBzaXplb2YoRWxmMzJfRWhkcikgKyBlaGRyLmVfcGhudW0gKiBzaXplb2YoRWxmMzJfUGhkcik7CisJZWxmY29yZWJ1ZiA9IGttYWxsb2MoZWxmY29yZWJ1Zl9zeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGZjb3JlYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlhZGRyID0gZWxmY29yZWhkcl9hZGRyOworCXJjID0gcmVhZF9mcm9tX29sZG1lbShlbGZjb3JlYnVmLCBlbGZjb3JlYnVmX3N6LCAmYWRkciwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlrZnJlZShlbGZjb3JlYnVmKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIE1lcmdlIGFsbCBQVF9OT1RFIGhlYWRlcnMgaW50byBvbmUuICovCisJcmMgPSBtZXJnZV9ub3RlX2hlYWRlcnNfZWxmMzIoZWxmY29yZWJ1ZiwgJmVsZmNvcmVidWZfc3osICZ2bWNvcmVfbGlzdCk7CisJaWYgKHJjKSB7CisJCWtmcmVlKGVsZmNvcmVidWYpOworCQlyZXR1cm4gcmM7CisJfQorCXJjID0gcHJvY2Vzc19wdGxvYWRfcHJvZ3JhbV9oZWFkZXJzX2VsZjMyKGVsZmNvcmVidWYsIGVsZmNvcmVidWZfc3osCisJCQkJCQkJCSZ2bWNvcmVfbGlzdCk7CisJaWYgKHJjKSB7CisJCWtmcmVlKGVsZmNvcmVidWYpOworCQlyZXR1cm4gcmM7CisJfQorCXNldF92bWNvcmVfbGlzdF9vZmZzZXRzX2VsZjMyKGVsZmNvcmVidWYsICZ2bWNvcmVfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2NyYXNoX2VsZl9oZWFkZXJzKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07CisJdTY0IGFkZHI7CisJaW50IHJjPTA7CisKKwlhZGRyID0gZWxmY29yZWhkcl9hZGRyOworCXJjID0gcmVhZF9mcm9tX29sZG1lbShlX2lkZW50LCBFSV9OSURFTlQsICZhZGRyLCAwKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJaWYgKG1lbWNtcChlX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogQ29yZSBpbWFnZSBlbGYgaGVhZGVyIgorCQkJCQkiIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChlX2lkZW50W0VJX0NMQVNTXSA9PSBFTEZDTEFTUzY0KSB7CisJCXJjID0gcGFyc2VfY3Jhc2hfZWxmNjRfaGVhZGVycygpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogRGV0ZXJtaW5lIHZtY29yZSBzaXplLiAqLworCQl2bWNvcmVfc2l6ZSA9IGdldF92bWNvcmVfc2l6ZV9lbGY2NChlbGZjb3JlYnVmKTsKKwl9IGVsc2UgaWYgKGVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTMzIpIHsKKwkJcmMgPSBwYXJzZV9jcmFzaF9lbGYzMl9oZWFkZXJzKCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBEZXRlcm1pbmUgdm1jb3JlIHNpemUuICovCisJCXZtY29yZV9zaXplID0gZ2V0X3ZtY29yZV9zaXplX2VsZjMyKGVsZmNvcmVidWYpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IENvcmUgaW1hZ2UgZWxmIGhlYWRlciBpcyBub3QiCisJCQkJCSIgc2FuZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSW5pdCBmdW5jdGlvbiBmb3Igdm1jb3JlIG1vZHVsZS4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHZtY29yZV9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCS8qIElmIGVsZmNvcmVoZHI9IGhhcyBiZWVuIHBhc3NlZCBpbiBjbWRsaW5lLCB0aGVuIGNhcHR1cmUgdGhlIGR1bXAuKi8KKwlpZiAoIShlbGZjb3JlaGRyX2FkZHIgPCBFTEZDT1JFX0FERFJfTUFYKSkKKwkJcmV0dXJuIHJjOworCXJjID0gcGFyc2VfY3Jhc2hfZWxmX2hlYWRlcnMoKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiS2R1bXA6IHZtY29yZSBub3QgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogSW5pdGlhbGl6ZSAvcHJvYy92bWNvcmUgc2l6ZSBpZiBwcm9jIGlzIGFscmVhZHkgdXAuICovCisJaWYgKHByb2Nfdm1jb3JlKQorCQlwcm9jX3ZtY29yZS0+c2l6ZSA9IHZtY29yZV9zaXplOworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQodm1jb3JlX2luaXQpCmRpZmYgLS1naXQgYS9mcy9xbng0L2Rpci5jIGIvZnMvcW54NC9kaXIuYwppbmRleCBjZDY2MTQ3Li43YThmNTU5IDEwMDY0NAotLS0gYS9mcy9xbng0L2Rpci5jCisrKyBiL2ZzL3FueDQvZGlyLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJCQkJCWlubyA9IGJsa251bSAqIFFOWDRfSU5PREVTX1BFUl9CTE9DSyArIGl4IC0gMTsKIAkJCQkJZWxzZSB7CiAJCQkJCQlsZSAgPSAoc3RydWN0IHFueDRfbGlua19pbmZvKilkZTsKLQkJCQkJCWlubyA9ICggbGUtPmRsX2lub2RlX2JsayAtIDEgKSAqCisJCQkJCQlpbm8gPSAoIGxlMzJfdG9fY3B1KGxlLT5kbF9pbm9kZV9ibGspIC0gMSApICoKIAkJCQkJCQlRTlg0X0lOT0RFU19QRVJfQkxPQ0sgKwogCQkJCQkJCWxlLT5kbF9pbm9kZV9uZHg7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL2ZzL3FueDQvaW5vZGUuYyBiL2ZzL3FueDQvaW5vZGUuYwppbmRleCBhYTkyZDZiLi5iNzkxNjJhIDEwMDY0NAotLS0gYS9mcy9xbng0L2lub2RlLmMKKysrIGIvZnMvcW54NC9pbm9kZS5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3QgcW54NF94YmxrICp4YmxrID0gTlVMTDsKIAlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcW54NF9pbm9kZSA9IHFueDRfcmF3X2lub2RlKGlub2RlKTsKLQlxbng0X254dG50X3Qgbnh0bnQgPSBsZTE2X3RvX2NwdShxbng0X2lub2RlLT5kaV9udW1feHRudHMpOworCXUxNiBueHRudCA9IGxlMTZfdG9fY3B1KHFueDRfaW5vZGUtPmRpX251bV94dG50cyk7CiAKIAlpZiAoIGlibG9jayA8IGxlMzJfdG9fY3B1KHFueDRfaW5vZGUtPmRpX2ZpcnN0X3h0bnQueHRudF9zaXplKSApIHsKIAkJLy8gaWJsb2NrIGlzIGluIHRoZSBmaXJzdCBleHRlbnQuIFRoaXMgaXMgZWFzeS4KQEAgLTM3Miw3ICszNzIsNyBAQAogCQlwcmludGsoInFueDQ6IHVuYWJsZSB0byByZWFkIHRoZSBzdXBlcmJsb2NrXG4iKTsKIAkJZ290byBvdXRub2JoOwogCX0KLQlpZiAoIGxlMzJfdG9fY3B1KCAqKF9fdTMyKiliaC0+Yl9kYXRhICkgIT0gUU5YNF9TVVBFUl9NQUdJQyApIHsKKwlpZiAoIGxlMzJfdG9fY3B1cCgoX19sZTMyKikgYmgtPmJfZGF0YSkgIT0gUU5YNF9TVVBFUl9NQUdJQyApIHsKIAkJaWYgKCFzaWxlbnQpCiAJCQlwcmludGsoInFueDQ6IHdyb25nIGZzaWQgaW4gc3VwZXJibG9jay5cbiIpOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA5MjkyZjVmLi41NjNhYmQwIDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpAQCAtMjUyLDcgKzI1Miw3IEBACiAJCQllbHNlCiAJCQkJcmV0ID0gZG9fc3luY19yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CiAJCQlpZiAocmV0ID4gMCkgewotCQkJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9BQ0NFU1MpOworCQkJCWZzbm90aWZ5X2FjY2VzcyhmaWxlLT5mX2RlbnRyeSk7CiAJCQkJY3VycmVudC0+cmNoYXIgKz0gcmV0OwogCQkJfQogCQkJY3VycmVudC0+c3lzY3IrKzsKQEAgLTMwMyw3ICszMDMsNyBAQAogCQkJZWxzZQogCQkJCXJldCA9IGRvX3N5bmNfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKIAkJCWlmIChyZXQgPiAwKSB7Ci0JCQkJZG5vdGlmeV9wYXJlbnQoZmlsZS0+Zl9kZW50cnksIEROX01PRElGWSk7CisJCQkJZnNub3RpZnlfbW9kaWZ5KGZpbGUtPmZfZGVudHJ5KTsKIAkJCQljdXJyZW50LT53Y2hhciArPSByZXQ7CiAJCQl9CiAJCQljdXJyZW50LT5zeXNjdysrOwpAQCAtNTM5LDkgKzUzOSwxMiBAQAogb3V0OgogCWlmIChpb3YgIT0gaW92c3RhY2spCiAJCWtmcmVlKGlvdik7Ci0JaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKQotCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwKLQkJCQkodHlwZSA9PSBSRUFEKSA/IEROX0FDQ0VTUyA6IEROX01PRElGWSk7CisJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKSB7CisJCWlmICh0eXBlID09IFJFQUQpCisJCQlmc25vdGlmeV9hY2Nlc3MoZmlsZS0+Zl9kZW50cnkpOworCQllbHNlCisJCQlmc25vdGlmeV9tb2RpZnkoZmlsZS0+Zl9kZW50cnkpOworCX0KIAlyZXR1cm4gcmV0OwogRWZhdWx0OgogCXJldCA9IC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9iaXRtYXAuYyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCmluZGV4IDQ5YzQ3OWMuLjkwOWY3MWUgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCisrKyBiL2ZzL3JlaXNlcmZzL2JpdG1hcC5jCkBAIC00NiwxMTI1ICs0NiwxMjIxIEBACiAjZGVmaW5lIFRFU1RfT1BUSU9OKG9wdG5hbWUsIHMpIFwKICAgICB0ZXN0X2JpdChfQUxMT0NfICMjIG9wdG5hbWUgLCAmU0JfQUxMT0NfT1BUUyhzKSkKIAotc3RhdGljIGlubGluZSB2b2lkIGdldF9iaXRfYWRkcmVzcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywKLQkJCQkgICAgYl9ibG9ja25yX3QgYmxvY2ssIGludCAqIGJtYXBfbnIsIGludCAqIG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYml0X2FkZHJlc3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJCSAgIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgKmJtYXBfbnIsIGludCAqb2Zmc2V0KQogewotICAgIC8qIEl0IGlzIGluIHRoZSBiaXRtYXAgYmxvY2sgbnVtYmVyIGVxdWFsIHRvIHRoZSBibG9jawotICAgICAqIG51bWJlciBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGJsb2NrLiAqLwotICAgICpibWFwX25yID0gYmxvY2sgLyAocy0+c19ibG9ja3NpemUgPDwgMyk7Ci0gICAgLyogV2l0aGluIHRoYXQgYml0bWFwIGJsb2NrIGl0IGlzIGxvY2F0ZWQgYXQgYml0IG9mZnNldCAqb2Zmc2V0LiAqLwotICAgICpvZmZzZXQgPSBibG9jayAmICgocy0+c19ibG9ja3NpemUgPDwgMykgLSAxICk7Ci0gICAgcmV0dXJuOworCS8qIEl0IGlzIGluIHRoZSBiaXRtYXAgYmxvY2sgbnVtYmVyIGVxdWFsIHRvIHRoZSBibG9jaworCSAqIG51bWJlciBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIGJsb2NrLiAqLworCSpibWFwX25yID0gYmxvY2sgLyAocy0+c19ibG9ja3NpemUgPDwgMyk7CisJLyogV2l0aGluIHRoYXQgYml0bWFwIGJsb2NrIGl0IGlzIGxvY2F0ZWQgYXQgYml0IG9mZnNldCAqb2Zmc2V0LiAqLworCSpvZmZzZXQgPSBibG9jayAmICgocy0+c19ibG9ja3NpemUgPDwgMykgLSAxKTsKKwlyZXR1cm47CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWludCBpc19yZXVzYWJsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpCitpbnQgaXNfcmV1c2FibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSkKIHsKLSAgICBpbnQgaSwgajsKKwlpbnQgaSwgajsKIAotICAgIGlmIChibG9jayA9PSAwIHx8IGJsb2NrID49IFNCX0JMT0NLX0NPVU5UIChzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDEwOiBpc19yZXVzYWJsZTogYmxvY2sgbnVtYmVyIGlzIG91dCBvZiByYW5nZSAlbHUgKCV1KSIsCi0JCQkgIGJsb2NrLCBTQl9CTE9DS19DT1VOVCAocykpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGl0IGNhbid0IGJlIG9uZSBvZiB0aGUgYml0bWFwIGJsb2NrcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SIChzKTsgaSArKykKLQlpZiAoYmxvY2sgPT0gU0JfQVBfQklUTUFQIChzKVtpXS5iaC0+Yl9ibG9ja25yKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2czogNDAyMDogaXNfcmV1c2FibGU6ICIKLQkJCSAgICAgICJiaXRtYXAgYmxvY2sgJWx1KCV1KSBjYW4ndCBiZSBmcmVlZCBvciByZXVzZWQiLAotCQkJICAgICAgYmxvY2ssIFNCX0JNQVBfTlIgKHMpKTsKLQkgICAgcmV0dXJuIDA7CisJaWYgKGJsb2NrID09IDAgfHwgYmxvY2sgPj0gU0JfQkxPQ0tfQ09VTlQocykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtNDAxMDogaXNfcmV1c2FibGU6IGJsb2NrIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UgJWx1ICgldSkiLAorCQkJCSBibG9jaywgU0JfQkxPQ0tfQ09VTlQocykpOworCQlyZXR1cm4gMDsKIAl9Ci0gIAotICAgIGdldF9iaXRfYWRkcmVzcyAocywgYmxvY2ssICZpLCAmaik7CiAKLSAgICBpZiAoaSA+PSBTQl9CTUFQX05SIChzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDMwOiBpc19yZXVzYWJsZTogdGhlcmUgaXMgbm8gc28gbWFueSBiaXRtYXAgYmxvY2tzOiAiCi0JCQkgICJibG9jaz0lbHUsIGJpdG1hcF9ucj0lZCIsIGJsb2NrLCBpKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJLyogaXQgY2FuJ3QgYmUgb25lIG9mIHRoZSBiaXRtYXAgYmxvY2tzICovCisJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJaWYgKGJsb2NrID09IFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJ2czogNDAyMDogaXNfcmV1c2FibGU6ICIKKwkJCQkJICJiaXRtYXAgYmxvY2sgJWx1KCV1KSBjYW4ndCBiZSBmcmVlZCBvciByZXVzZWQiLAorCQkJCQkgYmxvY2ssIFNCX0JNQVBfTlIocykpOworCQkJcmV0dXJuIDA7CisJCX0KIAotICAgIGlmICgoYml0X3ZhbHVlID09IDAgJiYgCi0gICAgICAgICByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfZGF0YSkpIHx8Ci0JKGJpdF92YWx1ZSA9PSAxICYmIAotCSByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoLT5iX2RhdGEpID09IDApKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNDA6IGlzX3JldXNhYmxlOiBjb3JyZXNwb25kaW5nIGJpdCBvZiBibG9jayAlbHUgZG9lcyBub3QgIgotCQkJICAibWF0Y2ggcmVxdWlyZWQgdmFsdWUgKGk9PSVkLCBqPT0lZCkgdGVzdF9iaXQ9PSVkIiwKLQkJYmxvY2ssIGksIGosIHJlaXNlcmZzX3Rlc3RfbGVfYml0IChqLCBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoLT5iX2RhdGEpKTsKKwlnZXRfYml0X2FkZHJlc3MocywgYmxvY2ssICZpLCAmaik7CiAKLQlyZXR1cm4gMDsKLSAgICB9CisJaWYgKGkgPj0gU0JfQk1BUF9OUihzKSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJ2cy00MDMwOiBpc19yZXVzYWJsZTogdGhlcmUgaXMgbm8gc28gbWFueSBiaXRtYXAgYmxvY2tzOiAiCisJCQkJICJibG9jaz0lbHUsIGJpdG1hcF9ucj0lZCIsIGJsb2NrLCBpKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgaWYgKGJpdF92YWx1ZSA9PSAwICYmIGJsb2NrID09IFNCX1JPT1RfQkxPQ0sgKHMpKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNTA6IGlzX3JldXNhYmxlOiB0aGlzIGlzIHJvb3QgYmxvY2sgKCV1KSwgIgotCQkJICAiaXQgbXVzdCBiZSBidXN5IiwgU0JfUk9PVF9CTE9DSyAocykpOwotCXJldHVybiAwOwotICAgIH0KKwlpZiAoKGJpdF92YWx1ZSA9PSAwICYmCisJICAgICByZWlzZXJmc190ZXN0X2xlX2JpdChqLCBTQl9BUF9CSVRNQVAocylbaV0uYmgtPmJfZGF0YSkpIHx8CisJICAgIChiaXRfdmFsdWUgPT0gMSAmJgorCSAgICAgcmVpc2VyZnNfdGVzdF9sZV9iaXQoaiwgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2RhdGEpID09IDApKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgInZzLTQwNDA6IGlzX3JldXNhYmxlOiBjb3JyZXNwb25kaW5nIGJpdCBvZiBibG9jayAlbHUgZG9lcyBub3QgIgorCQkJCSAibWF0Y2ggcmVxdWlyZWQgdmFsdWUgKGk9PSVkLCBqPT0lZCkgdGVzdF9iaXQ9PSVkIiwKKwkJCQkgYmxvY2ssIGksIGosIHJlaXNlcmZzX3Rlc3RfbGVfYml0KGosCisJCQkJCQkJCSAgIFNCX0FQX0JJVE1BUAorCQkJCQkJCQkgICAocylbaV0uYmgtPgorCQkJCQkJCQkgICBiX2RhdGEpKTsKIAotICAgIHJldHVybiAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoYml0X3ZhbHVlID09IDAgJiYgYmxvY2sgPT0gU0JfUk9PVF9CTE9DSyhzKSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJ2cy00MDUwOiBpc19yZXVzYWJsZTogdGhpcyBpcyByb290IGJsb2NrICgldSksICIKKwkJCQkgIml0IG11c3QgYmUgYnVzeSIsIFNCX1JPT1RfQkxPQ0socykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAogLyogc2VhcmNoZXMgaW4gam91cm5hbCBzdHJ1Y3R1cmVzIGZvciBhIGdpdmVuIGJsb2NrIG51bWJlciAoYm1hcCwgb2ZmKS4gSWYgYmxvY2sKICAgIGlzIGZvdW5kIGluIHJlaXNlcmZzIGpvdXJuYWwgaXQgc3VnZ2VzdHMgbmV4dCBmcmVlIGJsb2NrIGNhbmRpZGF0ZSB0byB0ZXN0LiAqLwotc3RhdGljIGlubGluZSAgaW50IGlzX2Jsb2NrX2luX2pvdXJuYWwgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCBibWFwLCBpbnQKLW9mZiwgaW50ICpuZXh0KQorc3RhdGljIGlubGluZSBpbnQgaXNfYmxvY2tfaW5fam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBibWFwLCBpbnQKKwkJCQkgICAgICBvZmYsIGludCAqbmV4dCkKIHsKLSAgICBiX2Jsb2NrbnJfdCB0bXA7CisJYl9ibG9ja25yX3QgdG1wOwogCi0gICAgaWYgKHJlaXNlcmZzX2luX2pvdXJuYWwgKHMsIGJtYXAsIG9mZiwgMSwgJnRtcCkpIHsKLQlpZiAodG1wKSB7ICAgICAgICAgICAgICAvKiBoaW50IHN1cHBsaWVkICovCi0JICAgICpuZXh0ID0gdG1wOwotCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX2hpbnQgKTsKLQl9IGVsc2UgewotCSAgICAoKm5leHQpID0gb2ZmICsgMTsgICAgICAgICAgLyogaW5jIG9mZnNldCB0byBhdm9pZCBsb29waW5nLiAqLwotCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX25vaGludCApOworCWlmIChyZWlzZXJmc19pbl9qb3VybmFsKHMsIGJtYXAsIG9mZiwgMSwgJnRtcCkpIHsKKwkJaWYgKHRtcCkgewkvKiBoaW50IHN1cHBsaWVkICovCisJCQkqbmV4dCA9IHRtcDsKKwkJCVBST0NfSU5GT19JTkMocywgc2Nhbl9iaXRtYXAuaW5fam91cm5hbF9oaW50KTsKKwkJfSBlbHNlIHsKKwkJCSgqbmV4dCkgPSBvZmYgKyAxOwkvKiBpbmMgb2Zmc2V0IHRvIGF2b2lkIGxvb3BpbmcuICovCisJCQlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLmluX2pvdXJuYWxfbm9oaW50KTsKKwkJfQorCQlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLnJldHJ5KTsKKwkJcmV0dXJuIDE7CiAJfQotCVBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLnJldHJ5ICk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAvKiBpdCBzZWFyY2hlcyBmb3IgYSB3aW5kb3cgb2YgemVybyBiaXRzIHdpdGggZ2l2ZW4gbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGhzIGluIG9uZSBiaXRtYXAKICAqIGJsb2NrOyAqLwotc3RhdGljIGludCBzY2FuX2JpdG1hcF9ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICAgICBpbnQgYm1hcF9uLCBpbnQgKmJlZywgaW50IGJvdW5kYXJ5LCBpbnQgbWluLCBpbnQgbWF4LCBpbnQgdW5mbSkKK3N0YXRpYyBpbnQgc2Nhbl9iaXRtYXBfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIGludCBibWFwX24sIGludCAqYmVnLCBpbnQgYm91bmRhcnksIGludCBtaW4sCisJCQkgICAgIGludCBtYXgsIGludCB1bmZtKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOwotICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYmk9JlNCX0FQX0JJVE1BUChzKVtibWFwX25dOwotICAgIGludCBlbmQsIG5leHQ7Ci0gICAgaW50IG9yZyA9ICpiZWc7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSA9ICZTQl9BUF9CSVRNQVAocylbYm1hcF9uXTsKKwlpbnQgZW5kLCBuZXh0OworCWludCBvcmcgPSAqYmVnOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgUkZBTFNFKGJtYXBfbiA+PSBTQl9CTUFQX05SIChzKSwgIkJpdG1hcCAlZCBpcyBvdXQgb2YgcmFuZ2UgKDAuLiVkKSIsYm1hcF9uLCBTQl9CTUFQX05SIChzKSAtIDEpOwotICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLmJtYXAgKTsKKwlSRkFMU0UoYm1hcF9uID49IFNCX0JNQVBfTlIocyksICJCaXRtYXAgJWQgaXMgb3V0IG9mIHJhbmdlICgwLi4lZCkiLAorCSAgICAgICBibWFwX24sIFNCX0JNQVBfTlIocykgLSAxKTsKKwlQUk9DX0lORk9fSU5DKHMsIHNjYW5fYml0bWFwLmJtYXApOwogLyogdGhpcyBpcyB1bmNsZWFyIGFuZCBsYWNrcyBjb21tZW50cywgZXhwbGFpbiBob3cgam91cm5hbCBiaXRtYXBzCiAgICB3b3JrIGhlcmUgZm9yIHRoZSByZWFkZXIuICBDb252ZXkgYSBzZW5zZSBvZiB0aGUgZGVzaWduIGhlcmUuIFdoYXQKICAgIGlzIGEgd2luZG93PyAqLwogLyogLSBJIG1lYW4gYGEgd2luZG93IG9mIHplcm8gYml0cycgYXMgaW4gZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbiAtIFphbS4gKi8KLSAgCi0gICAgaWYgKCAhYmkgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgIk5VTEwgYml0bWFwIGluZm8gcG9pbnRlciBmb3IgYml0bWFwICVkIiwgYm1hcF9uKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlcl9sb2NrZWQgKGJpLT5iaCkpIHsKLSAgICAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC53YWl0ICk7Ci0gICAgICAgX193YWl0X29uX2J1ZmZlciAoYmktPmJoKTsKLSAgICB9CiAKLSAgICB3aGlsZSAoMSkgewotCWNvbnQ6Ci0JaWYgKGJpLT5mcmVlX2NvdW50IDwgbWluKQotCQlyZXR1cm4gMDsgLy8gTm8gZnJlZSBibG9ja3MgaW4gdGhpcyBiaXRtYXAKLQotCS8qIHNlYXJjaCBmb3IgYSBmaXJzdCB6ZXJvIGJpdCAtLSBiZWdnaW5pbmcgb2YgYSB3aW5kb3cgKi8KLQkqYmVnID0gcmVpc2VyZnNfZmluZF9uZXh0X3plcm9fbGVfYml0Ci0JICAgICAgICAoKHVuc2lnbmVkIGxvbmcqKShiaS0+YmgtPmJfZGF0YSksIGJvdW5kYXJ5LCAqYmVnKTsKLSAgCi0JaWYgKCpiZWcgKyBtaW4gPiBib3VuZGFyeSkgeyAvKiBzZWFyY2ggZm9yIGEgemVybyBiaXQgZmFpbHMgb3IgdGhlIHJlc3Qgb2YgYml0bWFwIGJsb2NrCi0JCQkJICAgICAgKiBjYW5ub3QgY29udGFpbiBhIHplcm8gd2luZG93IG9mIG1pbmltdW0gc2l6ZSAqLwotCSAgICByZXR1cm4gMDsKKwlpZiAoIWJpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgIk5VTEwgYml0bWFwIGluZm8gcG9pbnRlciBmb3IgYml0bWFwICVkIiwKKwkJCQkgYm1hcF9uKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChidWZmZXJfbG9ja2VkKGJpLT5iaCkpIHsKKwkJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC53YWl0KTsKKwkJX193YWl0X29uX2J1ZmZlcihiaS0+YmgpOwogCX0KIAotCWlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocyxibWFwX24sICpiZWcsIGJlZykpCi0JICAgIGNvbnRpbnVlOwotCS8qIGZpcnN0IHplcm8gYml0IGZvdW5kOyB3ZSBjaGVjayBuZXh0IGJpdHMgKi8KLQlmb3IgKGVuZCA9ICpiZWcgKyAxOzsgZW5kICsrKSB7Ci0JICAgIGlmIChlbmQgPj0gKmJlZyArIG1heCB8fCBlbmQgPj0gYm91bmRhcnkgfHwgcmVpc2VyZnNfdGVzdF9sZV9iaXQgKGVuZCwgYmktPmJoLT5iX2RhdGEpKSB7Ci0JCW5leHQgPSBlbmQ7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIC8qIGZpbmRpbmcgdGhlIG90aGVyIGVuZCBvZiB6ZXJvIGJpdCB3aW5kb3cgcmVxdWlyZXMgbG9va2luZyBpbnRvIGpvdXJuYWwgc3RydWN0dXJlcyAoaW4KLQkgICAgICogY2FzZSBvZiBzZWFyY2hpbmcgZm9yIGZyZWUgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlcykgKi8KLQkgICAgaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sIGVuZCwgJm5leHQpKQotCQlicmVhazsKLQl9CisJd2hpbGUgKDEpIHsKKwkgICAgICBjb250OgorCQlpZiAoYmktPmZyZWVfY291bnQgPCBtaW4pCisJCQlyZXR1cm4gMDsJLy8gTm8gZnJlZSBibG9ja3MgaW4gdGhpcyBiaXRtYXAKIAotCS8qIG5vdyAoKmJlZykgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB6ZXJvIGJpdHMgd2luZG93LAotCSAqIChlbmQpIHBvaW50cyB0byBvbmUgYml0IGFmdGVyIHRoZSB3aW5kb3cgZW5kICovCi0JaWYgKGVuZCAtICpiZWcgPj0gbWluKSB7IC8qIGl0IHNlZW1zIHdlIGhhdmUgZm91bmQgd2luZG93IG9mIHByb3BlciBzaXplICovCi0JICAgIGludCBpOwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIChzLCBiaS0+YmgsIDEpOwotCSAgICAvKiB0cnkgdG8gc2V0IGFsbCBibG9ja3MgdXNlZCBjaGVja2luZyBhcmUgdGhleSBzdGlsbCBmcmVlICovCi0JICAgIGZvciAoaSA9ICpiZWc7IGkgPCBlbmQ7IGkrKykgewotCQkvKiBJdCBzZWVtcyB0aGF0IHdlIHNob3VsZCBub3QgY2hlY2sgaW4gam91cm5hbCBhZ2Fpbi4gKi8KLQkJaWYgKHJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQgKGksIGJpLT5iaC0+Yl9kYXRhKSkgewotCQkgICAgLyogYml0IHdhcyBzZXQgYnkgYW5vdGhlciBwcm9jZXNzCi0JCSAgICAgKiB3aGlsZSB3ZSBzbGVwdCBpbiBwcmVwYXJlX2Zvcl9qb3VybmFsKCkgKi8KLQkJICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLnN0b2xlbiApOwotCQkgICAgaWYgKGkgPj0gKmJlZyArIG1pbikJeyAvKiB3ZSBjYW4gY29udGludWUgd2l0aCBzbWFsbGVyIHNldCBvZiBhbGxvY2F0ZWQgYmxvY2tzLAotCQkJCQkgICAqIGlmIGxlbmd0aCBvZiB0aGlzIHNldCBpcyBtb3JlIG9yIGVxdWFsIHRvIGBtaW4nICovCi0JCQllbmQgPSBpOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAvKiBvdGhlcndpc2Ugd2UgY2xlYXIgYWxsIGJpdCB3ZXJlIHNldCAuLi4gKi8KLQkJICAgIHdoaWxlICgtLWkgPj0gKmJlZykKLQkJCXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdCAoaSwgYmktPmJoLT5iX2RhdGEpOwotCQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHMsIGJpLT5iaCk7Ci0JCSAgICAqYmVnID0gb3JnOwotCQkgICAgLyogLi4uIGFuZCBzZWFyY2ggYWdhaW4gaW4gY3VycmVudCBibG9jayBmcm9tIGJlZ2lubmluZyAqLwotCQkgICAgZ290byBjb250OwkKKwkJLyogc2VhcmNoIGZvciBhIGZpcnN0IHplcm8gYml0IC0tIGJlZ2dpbmluZyBvZiBhIHdpbmRvdyAqLworCQkqYmVnID0gcmVpc2VyZnNfZmluZF9uZXh0X3plcm9fbGVfYml0CisJCSAgICAoKHVuc2lnbmVkIGxvbmcgKikoYmktPmJoLT5iX2RhdGEpLCBib3VuZGFyeSwgKmJlZyk7CisKKwkJaWYgKCpiZWcgKyBtaW4gPiBib3VuZGFyeSkgewkvKiBzZWFyY2ggZm9yIGEgemVybyBiaXQgZmFpbHMgb3IgdGhlIHJlc3Qgb2YgYml0bWFwIGJsb2NrCisJCQkJCQkgKiBjYW5ub3QgY29udGFpbiBhIHplcm8gd2luZG93IG9mIG1pbmltdW0gc2l6ZSAqLworCQkJcmV0dXJuIDA7CiAJCX0KLQkgICAgfQotCSAgICBiaS0+ZnJlZV9jb3VudCAtPSAoZW5kIC0gKmJlZyk7Ci0JICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIGJpLT5iaCk7CiAKLQkgICAgLyogZnJlZSBibG9jayBjb3VudCBjYWxjdWxhdGlvbiAqLwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7Ci0JICAgIFBVVF9TQl9GUkVFX0JMT0NLUyhzLCBTQl9GUkVFX0JMT0NLUyhzKSAtIChlbmQgLSAqYmVnKSk7Ci0JICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwkJaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sICpiZWcsIGJlZykpCisJCQljb250aW51ZTsKKwkJLyogZmlyc3QgemVybyBiaXQgZm91bmQ7IHdlIGNoZWNrIG5leHQgYml0cyAqLworCQlmb3IgKGVuZCA9ICpiZWcgKyAxOzsgZW5kKyspIHsKKwkJCWlmIChlbmQgPj0gKmJlZyArIG1heCB8fCBlbmQgPj0gYm91bmRhcnkKKwkJCSAgICB8fCByZWlzZXJmc190ZXN0X2xlX2JpdChlbmQsIGJpLT5iaC0+Yl9kYXRhKSkgeworCQkJCW5leHQgPSBlbmQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmaW5kaW5nIHRoZSBvdGhlciBlbmQgb2YgemVybyBiaXQgd2luZG93IHJlcXVpcmVzIGxvb2tpbmcgaW50byBqb3VybmFsIHN0cnVjdHVyZXMgKGluCisJCQkgKiBjYXNlIG9mIHNlYXJjaGluZyBmb3IgZnJlZSBibG9ja3MgZm9yIHVuZm9ybWF0dGVkIG5vZGVzKSAqLworCQkJaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sIGVuZCwgJm5leHQpKQorCQkJCWJyZWFrOworCQl9CiAKLQkgICAgcmV0dXJuIGVuZCAtICgqYmVnKTsKLQl9IGVsc2UgewotCSAgICAqYmVnID0gbmV4dDsKKwkJLyogbm93ICgqYmVnKSBwb2ludHMgdG8gYmVnaW5uaW5nIG9mIHplcm8gYml0cyB3aW5kb3csCisJCSAqIChlbmQpIHBvaW50cyB0byBvbmUgYml0IGFmdGVyIHRoZSB3aW5kb3cgZW5kICovCisJCWlmIChlbmQgLSAqYmVnID49IG1pbikgewkvKiBpdCBzZWVtcyB3ZSBoYXZlIGZvdW5kIHdpbmRvdyBvZiBwcm9wZXIgc2l6ZSAqLworCQkJaW50IGk7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJpLT5iaCwgMSk7CisJCQkvKiB0cnkgdG8gc2V0IGFsbCBibG9ja3MgdXNlZCBjaGVja2luZyBhcmUgdGhleSBzdGlsbCBmcmVlICovCisJCQlmb3IgKGkgPSAqYmVnOyBpIDwgZW5kOyBpKyspIHsKKwkJCQkvKiBJdCBzZWVtcyB0aGF0IHdlIHNob3VsZCBub3QgY2hlY2sgaW4gam91cm5hbCBhZ2Fpbi4gKi8KKwkJCQlpZiAocmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdAorCQkJCSAgICAoaSwgYmktPmJoLT5iX2RhdGEpKSB7CisJCQkJCS8qIGJpdCB3YXMgc2V0IGJ5IGFub3RoZXIgcHJvY2VzcworCQkJCQkgKiB3aGlsZSB3ZSBzbGVwdCBpbiBwcmVwYXJlX2Zvcl9qb3VybmFsKCkgKi8KKwkJCQkJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5zdG9sZW4pOworCQkJCQlpZiAoaSA+PSAqYmVnICsgbWluKSB7CS8qIHdlIGNhbiBjb250aW51ZSB3aXRoIHNtYWxsZXIgc2V0IG9mIGFsbG9jYXRlZCBibG9ja3MsCisJCQkJCQkJCSAqIGlmIGxlbmd0aCBvZiB0aGlzIHNldCBpcyBtb3JlIG9yIGVxdWFsIHRvIGBtaW4nICovCisJCQkJCQllbmQgPSBpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogb3RoZXJ3aXNlIHdlIGNsZWFyIGFsbCBiaXQgd2VyZSBzZXQgLi4uICovCisJCQkJCXdoaWxlICgtLWkgPj0gKmJlZykKKwkJCQkJCXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdAorCQkJCQkJICAgIChpLCBiaS0+YmgtPmJfZGF0YSk7CisJCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHMsCisJCQkJCQkJCQkgYmktPgorCQkJCQkJCQkJIGJoKTsKKwkJCQkJKmJlZyA9IG9yZzsKKwkJCQkJLyogLi4uIGFuZCBzZWFyY2ggYWdhaW4gaW4gY3VycmVudCBibG9jayBmcm9tIGJlZ2lubmluZyAqLworCQkJCQlnb3RvIGNvbnQ7CisJCQkJfQorCQkJfQorCQkJYmktPmZyZWVfY291bnQgLT0gKGVuZCAtICpiZWcpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBzLCBiaS0+YmgpOworCisJCQkvKiBmcmVlIGJsb2NrIGNvdW50IGNhbGN1bGF0aW9uICovCisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLAorCQkJCQkJICAgICAxKTsKKwkJCVBVVF9TQl9GUkVFX0JMT0NLUyhzLCBTQl9GUkVFX0JMT0NLUyhzKSAtIChlbmQgLSAqYmVnKSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKworCQkJcmV0dXJuIGVuZCAtICgqYmVnKTsKKwkJfSBlbHNlIHsKKwkJCSpiZWcgPSBuZXh0OworCQl9CiAJfQotICAgIH0KIH0KIAotc3RhdGljIGludCBibWFwX2hhc2hfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1MzIgaWQpIHsKLSAgICBjaGFyICogaGFzaF9pbiA9IE5VTEw7Ci0gICAgdW5zaWduZWQgbG9uZyBoYXNoOwotICAgIHVuc2lnbmVkIGJtOworc3RhdGljIGludCBibWFwX2hhc2hfaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1MzIgaWQpCit7CisJY2hhciAqaGFzaF9pbiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCXVuc2lnbmVkIGJtOwogCi0gICAgaWYgKGlkIDw9IDIpIHsKLQlibSA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGFzaF9pbiA9IChjaGFyICopKCZpZCk7Ci0gICAgICAgIGhhc2ggPSBrZXllZF9oYXNoKGhhc2hfaW4sIDQpOwotCWJtID0gaGFzaCAlIFNCX0JNQVBfTlIocyk7Ci0JaWYgKCFibSkKLQkgICAgYm0gPSAxOwotICAgIH0KLSAgICAvKiB0aGlzIGNhbiBvbmx5IGJlIHRydWUgd2hlbiBTQl9CTUFQX05SID0gMSAqLwotICAgIGlmIChibSA+PSBTQl9CTUFQX05SKHMpKQotICAgIAlibSA9IDA7Ci0gICAgcmV0dXJuIGJtOworCWlmIChpZCA8PSAyKSB7CisJCWJtID0gMTsKKwl9IGVsc2UgeworCQloYXNoX2luID0gKGNoYXIgKikoJmlkKTsKKwkJaGFzaCA9IGtleWVkX2hhc2goaGFzaF9pbiwgNCk7CisJCWJtID0gaGFzaCAlIFNCX0JNQVBfTlIocyk7CisJCWlmICghYm0pCisJCQlibSA9IDE7CisJfQorCS8qIHRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSB3aGVuIFNCX0JNQVBfTlIgPSAxICovCisJaWYgKGJtID49IFNCX0JNQVBfTlIocykpCisJCWJtID0gMDsKKwlyZXR1cm4gYm07CiB9CiAKIC8qCiAgKiBoYXNoZXMgdGhlIGlkIGFuZCB0aGVuIHJldHVybnMgPiAwIGlmIHRoZSBibG9jayBncm91cCBmb3IgdGhlCiAgKiBjb3JyZXNwb25kaW5nIGhhc2ggaXMgZnVsbAogICovCi1zdGF0aWMgaW5saW5lIGludCBibG9ja19ncm91cF91c2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTMyIGlkKSB7Ci0gICAgaW50IGJtOwotICAgIGJtID0gYm1hcF9oYXNoX2lkKHMsIGlkKTsKLSAgICBpZiAoU0JfQVBfQklUTUFQKHMpW2JtXS5mcmVlX2NvdW50ID4gKChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAqIDYwIC8gMTAwKSApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOworc3RhdGljIGlubGluZSBpbnQgYmxvY2tfZ3JvdXBfdXNlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHUzMiBpZCkKK3sKKwlpbnQgYm07CisJYm0gPSBibWFwX2hhc2hfaWQocywgaWQpOworCWlmIChTQl9BUF9CSVRNQVAocylbYm1dLmZyZWVfY291bnQgPiAoKHMtPnNfYmxvY2tzaXplIDw8IDMpICogNjAgLyAxMDApKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKIH0KIAogLyoKICAqIHRoZSBwYWNraW5nIGlzIHJldHVybmVkIGluIGRpc2sgYnl0ZSBvcmRlcgogICovCi1fX2xlMzIgcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoc3RydWN0IGlub2RlICpkaXIpCitfX2xlMzIgcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoc3RydWN0IGlub2RlICogZGlyKQogewotICAgIF9fbGUzMiBwYWNraW5nOwotICAgIGlmIChURVNUX09QVElPTihwYWNraW5nX2dyb3VwcywgZGlyLT5pX3NiKSkgewotCXUzMiBwYXJlbnRfZGlyID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZCk7Ci0JLyoKLQkgKiBzb21lIHZlcnNpb25zIG9mIHJlaXNlcmZzY2sgZXhwZWN0IHBhY2tpbmcgbG9jYWxpdHkgMSB0byBiZQotCSAqIHNwZWNpYWwKLQkgKi8KLQlpZiAocGFyZW50X2RpciA9PSAxIHx8IGJsb2NrX2dyb3VwX3VzZWQoZGlyLT5pX3NiLHBhcmVudF9kaXIpKQotICAgICAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQ7Ci0gICAgfSBlbHNlCi0gICAgICAgIHBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7Ci0gICAgcmV0dXJuIHBhY2tpbmc7CisJX19sZTMyIHBhY2tpbmc7CisJaWYgKFRFU1RfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzLCBkaXItPmlfc2IpKSB7CisJCXUzMiBwYXJlbnRfZGlyID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZCk7CisJCS8qCisJCSAqIHNvbWUgdmVyc2lvbnMgb2YgcmVpc2VyZnNjayBleHBlY3QgcGFja2luZyBsb2NhbGl0eSAxIHRvIGJlCisJCSAqIHNwZWNpYWwKKwkJICovCisJCWlmIChwYXJlbnRfZGlyID09IDEgfHwgYmxvY2tfZ3JvdXBfdXNlZChkaXItPmlfc2IsIHBhcmVudF9kaXIpKQorCQkJcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZDsKKwkJZWxzZQorCQkJcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQ7CisJfSBlbHNlCisJCXBhY2tpbmcgPSBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQ7CisJcmV0dXJuIHBhY2tpbmc7CiB9Ci0gIAorCiAvKiBUcmllcyB0byBmaW5kIGNvbnRpZ3VvdXMgemVybyBiaXQgd2luZG93IChnaXZlbiBzaXplKSBpbiBnaXZlbiByZWdpb24gb2YKICAqIGJpdG1hcCBhbmQgcGxhY2UgbmV3IGJsb2NrcyB0aGVyZS4gUmV0dXJucyBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2Nrcy4gKi8KLXN0YXRpYyBpbnQgc2Nhbl9iaXRtYXAgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJYl9ibG9ja25yX3QgKnN0YXJ0LCBiX2Jsb2NrbnJfdCBmaW5pc2gsCi0JCQlpbnQgbWluLCBpbnQgbWF4LCBpbnQgdW5mbSwgdW5zaWduZWQgbG9uZyBmaWxlX2Jsb2NrKQorc3RhdGljIGludCBzY2FuX2JpdG1hcChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIGJfYmxvY2tucl90ICogc3RhcnQsIGJfYmxvY2tucl90IGZpbmlzaCwKKwkJICAgICAgIGludCBtaW4sIGludCBtYXgsIGludCB1bmZtLCB1bnNpZ25lZCBsb25nIGZpbGVfYmxvY2spCiB7Ci0gICAgaW50IG5yX2FsbG9jYXRlZD0wOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICAvKiBmaW5kIGV2ZXJ5IGJtIGFuZCBibWFwIGFuZCBibWFwX25yIGluIHRoaXMgZmlsZSwgYW5kIGNoYW5nZSB0aGVtIGFsbCB0byBiaXRtYXBfYmxvY2tucgotICAgICAqIC0gSGFucywgaXQgaXMgbm90IGEgYmxvY2sgbnVtYmVyIC0gWmFtLiAqLworCWludCBucl9hbGxvY2F0ZWQgPSAwOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHRoLT50X3N1cGVyOworCS8qIGZpbmQgZXZlcnkgYm0gYW5kIGJtYXAgYW5kIGJtYXBfbnIgaW4gdGhpcyBmaWxlLCBhbmQgY2hhbmdlIHRoZW0gYWxsIHRvIGJpdG1hcF9ibG9ja25yCisJICogLSBIYW5zLCBpdCBpcyBub3QgYSBibG9jayBudW1iZXIgLSBaYW0uICovCiAKLSAgICBpbnQgYm0sIG9mZjsKLSAgICBpbnQgZW5kX2JtLCBlbmRfb2ZmOwotICAgIGludCBvZmZfbWF4ID0gcy0+c19ibG9ja3NpemUgPDwgMzsKKwlpbnQgYm0sIG9mZjsKKwlpbnQgZW5kX2JtLCBlbmRfb2ZmOworCWludCBvZmZfbWF4ID0gcy0+c19ibG9ja3NpemUgPDwgMzsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLmNhbGwgKTsgCi0gICAgaWYgKCBTQl9GUkVFX0JMT0NLUyhzKSA8PSAwKQotCXJldHVybiAwOyAvLyBObyBwb2ludCBpbiBsb29raW5nIGZvciBtb3JlIGZyZWUgYmxvY2tzCisJUFJPQ19JTkZPX0lOQyhzLCBzY2FuX2JpdG1hcC5jYWxsKTsKKwlpZiAoU0JfRlJFRV9CTE9DS1MocykgPD0gMCkKKwkJcmV0dXJuIDA7CS8vIE5vIHBvaW50IGluIGxvb2tpbmcgZm9yIG1vcmUgZnJlZSBibG9ja3MKIAotICAgIGdldF9iaXRfYWRkcmVzcyAocywgKnN0YXJ0LCAmYm0sICZvZmYpOwotICAgIGdldF9iaXRfYWRkcmVzcyAocywgZmluaXNoLCAmZW5kX2JtLCAmZW5kX29mZik7Ci0gICAgaWYgKGJtID4gU0JfQk1BUF9OUihzKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGVuZF9ibSA+IFNCX0JNQVBfTlIocykpCi0gICAgICAgIGVuZF9ibSA9IFNCX0JNQVBfTlIocyk7CisJZ2V0X2JpdF9hZGRyZXNzKHMsICpzdGFydCwgJmJtLCAmb2ZmKTsKKwlnZXRfYml0X2FkZHJlc3MocywgZmluaXNoLCAmZW5kX2JtLCAmZW5kX29mZik7CisJaWYgKGJtID4gU0JfQk1BUF9OUihzKSkKKwkJcmV0dXJuIDA7CisJaWYgKGVuZF9ibSA+IFNCX0JNQVBfTlIocykpCisJCWVuZF9ibSA9IFNCX0JNQVBfTlIocyk7CiAKLSAgICAvKiBXaGVuIHRoZSBiaXRtYXAgaXMgbW9yZSB0aGFuIDEwJSBmcmVlLCBhbnlvbmUgY2FuIGFsbG9jYXRlLgotICAgICAqIFdoZW4gaXQncyBsZXNzIHRoYW4gMTAlIGZyZWUsIG9ubHkgZmlsZXMgdGhhdCBhbHJlYWR5IHVzZSB0aGUKLSAgICAgKiBiaXRtYXAgYXJlIGFsbG93ZWQuIE9uY2Ugd2UgcGFzcyA4MCUgZnVsbCwgdGhpcyByZXN0cmljdGlvbgotICAgICAqIGlzIGxpZnRlZC4KLSAgICAgKgotICAgICAqIFdlIGRvIHRoaXMgc28gdGhhdCBmaWxlcyB0aGF0IGdyb3cgbGF0ZXIgc3RpbGwgaGF2ZSBzcGFjZSBjbG9zZSB0bwotICAgICAqIHRoZWlyIG9yaWdpbmFsIGFsbG9jYXRpb24uIFRoaXMgaW1wcm92ZXMgbG9jYWxpdHksIGFuZCBwcmVzdW1hYmx5Ci0gICAgICogcGVyZm9ybWFuY2UgYXMgYSByZXN1bHQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIG9ubHkgYW4gYWxsb2NhdGlvbiBwb2xpY3kgYW5kIGRvZXMgbm90IG1ha2UgdXAgZm9yIGdldHRpbmcgYQotICAgICAqIGJhZCBoaW50LiBEZWNlbnQgaGludGluZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciB0aGlzIHRvIHdvcmsgd2VsbC4KLSAgICAgKi8KLSAgICBpZiAoIFRFU1RfT1BUSU9OKHNraXBfYnVzeSwgcykgJiYgU0JfRlJFRV9CTE9DS1MocykgPiBTQl9CTE9DS19DT1VOVChzKS8yMCApIHsKLQlmb3IgKDtibSA8IGVuZF9ibTsgYm0rKywgb2ZmID0gMCkgewotCSAgICBpZiAoICggb2ZmICYmICghdW5mbSB8fCAoZmlsZV9ibG9jayAhPSAwKSkpIHx8IFNCX0FQX0JJVE1BUChzKVtibV0uZnJlZV9jb3VudCA+IChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAvIDEwICkKLQkJbnJfYWxsb2NhdGVkID0gc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LCBtaW4sIG1heCwgdW5mbSk7Ci0JICAgIGlmIChucl9hbGxvY2F0ZWQpCi0JCWdvdG8gcmV0OwotICAgICAgICB9Ci0JLyogd2Uga25vdyBmcm9tIGFib3ZlIHRoYXQgc3RhcnQgaXMgYSByZWFzb25hYmxlIG51bWJlciAqLwotCWdldF9iaXRfYWRkcmVzcyAocywgKnN0YXJ0LCAmYm0sICZvZmYpOwotICAgIH0KKwkvKiBXaGVuIHRoZSBiaXRtYXAgaXMgbW9yZSB0aGFuIDEwJSBmcmVlLCBhbnlvbmUgY2FuIGFsbG9jYXRlLgorCSAqIFdoZW4gaXQncyBsZXNzIHRoYW4gMTAlIGZyZWUsIG9ubHkgZmlsZXMgdGhhdCBhbHJlYWR5IHVzZSB0aGUKKwkgKiBiaXRtYXAgYXJlIGFsbG93ZWQuIE9uY2Ugd2UgcGFzcyA4MCUgZnVsbCwgdGhpcyByZXN0cmljdGlvbgorCSAqIGlzIGxpZnRlZC4KKwkgKgorCSAqIFdlIGRvIHRoaXMgc28gdGhhdCBmaWxlcyB0aGF0IGdyb3cgbGF0ZXIgc3RpbGwgaGF2ZSBzcGFjZSBjbG9zZSB0bworCSAqIHRoZWlyIG9yaWdpbmFsIGFsbG9jYXRpb24uIFRoaXMgaW1wcm92ZXMgbG9jYWxpdHksIGFuZCBwcmVzdW1hYmx5CisJICogcGVyZm9ybWFuY2UgYXMgYSByZXN1bHQuCisJICoKKwkgKiBUaGlzIGlzIG9ubHkgYW4gYWxsb2NhdGlvbiBwb2xpY3kgYW5kIGRvZXMgbm90IG1ha2UgdXAgZm9yIGdldHRpbmcgYQorCSAqIGJhZCBoaW50LiBEZWNlbnQgaGludGluZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciB0aGlzIHRvIHdvcmsgd2VsbC4KKwkgKi8KKwlpZiAoVEVTVF9PUFRJT04oc2tpcF9idXN5LCBzKQorCSAgICAmJiBTQl9GUkVFX0JMT0NLUyhzKSA+IFNCX0JMT0NLX0NPVU5UKHMpIC8gMjApIHsKKwkJZm9yICg7IGJtIDwgZW5kX2JtOyBibSsrLCBvZmYgPSAwKSB7CisJCQlpZiAoKG9mZiAmJiAoIXVuZm0gfHwgKGZpbGVfYmxvY2sgIT0gMCkpKQorCQkJICAgIHx8IFNCX0FQX0JJVE1BUChzKVtibV0uZnJlZV9jb3VudCA+CisJCQkgICAgKHMtPnNfYmxvY2tzaXplIDw8IDMpIC8gMTApCisJCQkJbnJfYWxsb2NhdGVkID0KKwkJCQkgICAgc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LAorCQkJCQkJICAgICAgbWluLCBtYXgsIHVuZm0pOworCQkJaWYgKG5yX2FsbG9jYXRlZCkKKwkJCQlnb3RvIHJldDsKKwkJfQorCQkvKiB3ZSBrbm93IGZyb20gYWJvdmUgdGhhdCBzdGFydCBpcyBhIHJlYXNvbmFibGUgbnVtYmVyICovCisJCWdldF9iaXRfYWRkcmVzcyhzLCAqc3RhcnQsICZibSwgJm9mZik7CisJfQogCi0gICAgZm9yICg7Ym0gPCBlbmRfYm07IGJtKyssIG9mZiA9IDApIHsKLQlucl9hbGxvY2F0ZWQgPSBzY2FuX2JpdG1hcF9ibG9jayh0aCwgYm0sICZvZmYsIG9mZl9tYXgsIG1pbiwgbWF4LCB1bmZtKTsKLQlpZiAobnJfYWxsb2NhdGVkKQotCSAgICBnb3RvIHJldDsKLSAgICB9CisJZm9yICg7IGJtIDwgZW5kX2JtOyBibSsrLCBvZmYgPSAwKSB7CisJCW5yX2FsbG9jYXRlZCA9CisJCSAgICBzY2FuX2JpdG1hcF9ibG9jayh0aCwgYm0sICZvZmYsIG9mZl9tYXgsIG1pbiwgbWF4LCB1bmZtKTsKKwkJaWYgKG5yX2FsbG9jYXRlZCkKKwkJCWdvdG8gcmV0OworCX0KIAotICAgIG5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgZW5kX29mZiArIDEsIG1pbiwgbWF4LCB1bmZtKTsKLSAgCi0gcmV0OgotICAgICpzdGFydCA9IGJtICogb2ZmX21heCArIG9mZjsKLSAgICByZXR1cm4gbnJfYWxsb2NhdGVkOworCW5yX2FsbG9jYXRlZCA9CisJICAgIHNjYW5fYml0bWFwX2Jsb2NrKHRoLCBibSwgJm9mZiwgZW5kX29mZiArIDEsIG1pbiwgbWF4LCB1bmZtKTsKKworICAgICAgcmV0OgorCSpzdGFydCA9IGJtICogb2ZmX21heCArIG9mZjsKKwlyZXR1cm4gbnJfYWxsb2NhdGVkOwogCiB9CiAKLXN0YXRpYyB2b2lkIF9yZWlzZXJmc19mcmVlX2Jsb2NrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrLAotCQkJCSAgaW50IGZvcl91bmZvcm1hdHRlZCkKK3N0YXRpYyB2b2lkIF9yZWlzZXJmc19mcmVlX2Jsb2NrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKKwkJCQkgaW50IGZvcl91bmZvcm1hdHRlZCkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gdGgtPnRfc3VwZXI7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc2JoOwotICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYXBiaTsKLSAgICBpbnQgbnIsIG9mZnNldDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoOworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYXBiaTsKKwlpbnQgbnIsIG9mZnNldDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFBST0NfSU5GT19JTkMoIHMsIGZyZWVfYmxvY2sgKTsKKwlQUk9DX0lORk9fSU5DKHMsIGZyZWVfYmxvY2spOwogCi0gICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICBzYmggPSBTQl9CVUZGRVJfV0lUSF9TQiAocyk7Ci0gICAgYXBiaSA9IFNCX0FQX0JJVE1BUChzKTsKKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJc2JoID0gU0JfQlVGRkVSX1dJVEhfU0Iocyk7CisJYXBiaSA9IFNCX0FQX0JJVE1BUChzKTsKIAotICAgIGdldF9iaXRfYWRkcmVzcyAocywgYmxvY2ssICZuciwgJm9mZnNldCk7CisJZ2V0X2JpdF9hZGRyZXNzKHMsIGJsb2NrLCAmbnIsICZvZmZzZXQpOwogCi0gICAgaWYgKG5yID49IHNiX2JtYXBfbnIgKHJzKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDc1OiByZWlzZXJmc19mcmVlX2Jsb2NrOiAiCi0JCQkgICJibG9jayAlbHUgaXMgb3V0IG9mIHJhbmdlIG9uICVzIiwKLQkJCSAgYmxvY2ssIHJlaXNlcmZzX2JkZXZuYW1lIChzKSk7Ci0JcmV0dXJuOwotICAgIH0KKwlpZiAobnIgPj0gc2JfYm1hcF9ucihycykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAidnMtNDA3NTogcmVpc2VyZnNfZnJlZV9ibG9jazogIgorCQkJCSAiYmxvY2sgJWx1IGlzIG91dCBvZiByYW5nZSBvbiAlcyIsCisJCQkJIGJsb2NrLCByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCXJldHVybjsKKwl9CiAKLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGFwYmlbbnJdLmJoLCAxICkgOworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYXBiaVtucl0uYmgsIDEpOwogCi0gICAgLyogY2xlYXIgYml0IGZvciB0aGUgZ2l2ZW4gYmxvY2sgaW4gYml0IG1hcCAqLwotICAgIGlmICghcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0IChvZmZzZXQsIGFwYmlbbnJdLmJoLT5iX2RhdGEpKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwODA6IHJlaXNlcmZzX2ZyZWVfYmxvY2s6ICIKLQkJCSAgImZyZWVfYmxvY2sgKCVzOiVsdSlbZGV2OmJsb2NrbnJdOiBiaXQgYWxyZWFkeSBjbGVhcmVkIiwKLQkJCSAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBibG9jayk7Ci0gICAgfQotICAgIGFwYmlbbnJdLmZyZWVfY291bnQgKys7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgcywgYXBiaVtucl0uYmgpOworCS8qIGNsZWFyIGJpdCBmb3IgdGhlIGdpdmVuIGJsb2NrIGluIGJpdCBtYXAgKi8KKwlpZiAoIXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdChvZmZzZXQsIGFwYmlbbnJdLmJoLT5iX2RhdGEpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInZzLTQwODA6IHJlaXNlcmZzX2ZyZWVfYmxvY2s6ICIKKwkJCQkgImZyZWVfYmxvY2sgKCVzOiVsdSlbZGV2OmJsb2NrbnJdOiBiaXQgYWxyZWFkeSBjbGVhcmVkIiwKKwkJCQkgcmVpc2VyZnNfYmRldm5hbWUocyksIGJsb2NrKTsKKwl9CisJYXBiaVtucl0uZnJlZV9jb3VudCsrOworCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgYXBiaVtucl0uYmgpOwogCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBzYmgsIDEpIDsKLSAgICAvKiB1cGRhdGUgc3VwZXIgYmxvY2sgKi8KLSAgICBzZXRfc2JfZnJlZV9ibG9ja3MoIHJzLCBzYl9mcmVlX2Jsb2NrcyhycykgKyAxICk7CisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBzYmgsIDEpOworCS8qIHVwZGF0ZSBzdXBlciBibG9jayAqLworCXNldF9zYl9mcmVlX2Jsb2Nrcyhycywgc2JfZnJlZV9ibG9ja3MocnMpICsgMSk7CiAKLSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBzLCBzYmgpOwotICAgIGlmIChmb3JfdW5mb3JtYXR0ZWQpCi0gICAgICAgIERRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShpbm9kZSwgMSk7CisJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBzLCBzYmgpOworCWlmIChmb3JfdW5mb3JtYXR0ZWQpCisJCURRVU9UX0ZSRUVfQkxPQ0tfTk9ESVJUWShpbm9kZSwgMSk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfZnJlZV9ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKLQkJCSAgaW50IGZvcl91bmZvcm1hdHRlZCkKK3ZvaWQgcmVpc2VyZnNfZnJlZV9ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBiX2Jsb2NrbnJfdCBibG9jaywKKwkJCSBpbnQgZm9yX3VuZm9ybWF0dGVkKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIFJGQUxTRSghcywgInZzLTQwNjE6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOwotICAgIFJGQUxTRShpc19yZXVzYWJsZSAocywgYmxvY2ssIDEpID09IDAsICJ2cy00MDcxOiBjYW4gbm90IGZyZWUgc3VjaCBibG9jayIpOwotICAgIC8qIG1hcmsgaXQgYmVmb3JlIHdlIGNsZWFyIGl0LCBqdXN0IGluIGNhc2UgKi8KLSAgICBqb3VybmFsX21hcmtfZnJlZWQodGgsIHMsIGJsb2NrKSA7Ci0gICAgX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgZm9yX3VuZm9ybWF0dGVkKSA7CisJUkZBTFNFKCFzLCAidnMtNDA2MTogdHJ5aW5nIHRvIGZyZWUgYmxvY2sgb24gbm9uZXhpc3RlbnQgZGV2aWNlIik7CisJUkZBTFNFKGlzX3JldXNhYmxlKHMsIGJsb2NrLCAxKSA9PSAwLAorCSAgICAgICAidnMtNDA3MTogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKKwkvKiBtYXJrIGl0IGJlZm9yZSB3ZSBjbGVhciBpdCwganVzdCBpbiBjYXNlICovCisJam91cm5hbF9tYXJrX2ZyZWVkKHRoLCBzLCBibG9jayk7CisJX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgZm9yX3VuZm9ybWF0dGVkKTsKIH0KIAogLyogcHJlYWxsb2NhdGVkIGJsb2NrcyBkb24ndCBuZWVkIHRvIGJlIHJ1biB0aHJvdWdoIGpvdXJuYWxfbWFya19mcmVlZCAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrKSB7Ci0gICAgUkZBTFNFKCF0aC0+dF9zdXBlciwgInZzLTQwNjA6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOwotICAgIFJGQUxTRShpc19yZXVzYWJsZSAodGgtPnRfc3VwZXIsIGJsb2NrLCAxKSA9PSAwLCAidnMtNDA3MDogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgMSkgOworc3RhdGljIHZvaWQgcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrKQoreworCVJGQUxTRSghdGgtPnRfc3VwZXIsCisJICAgICAgICJ2cy00MDYwOiB0cnlpbmcgdG8gZnJlZSBibG9jayBvbiBub25leGlzdGVudCBkZXZpY2UiKTsKKwlSRkFMU0UoaXNfcmV1c2FibGUodGgtPnRfc3VwZXIsIGJsb2NrLCAxKSA9PSAwLAorCSAgICAgICAidnMtNDA3MDogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlfcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGJsb2NrLCAxKTsKIH0KIAotc3RhdGljIHZvaWQgX19kaXNjYXJkX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICogdGgsCi0JCQkJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpKQorc3RhdGljIHZvaWQgX19kaXNjYXJkX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSkKIHsKLSAgICB1bnNpZ25lZCBsb25nIHNhdmUgPSBlaS0+aV9wcmVhbGxvY19ibG9jayA7Ci0gICAgaW50IGRpcnR5ID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmVpLT52ZnNfaW5vZGU7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCXVuc2lnbmVkIGxvbmcgc2F2ZSA9IGVpLT5pX3ByZWFsbG9jX2Jsb2NrOworCWludCBkaXJ0eSA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICZlaS0+dmZzX2lub2RlOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmIChlaS0+aV9wcmVhbGxvY19jb3VudCA8IDApCi0JcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJ6YW0tNDAwMTolczogaW5vZGUgaGFzIG5lZ2F0aXZlIHByZWFsbG9jIGJsb2NrcyBjb3VudC4iLCBfX0ZVTkNUSU9OX18gKTsKKwlpZiAoZWktPmlfcHJlYWxsb2NfY291bnQgPCAwKQorCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCSAiemFtLTQwMDE6JXM6IGlub2RlIGhhcyBuZWdhdGl2ZSBwcmVhbGxvYyBibG9ja3MgY291bnQuIiwKKwkJCQkgX19GVU5DVElPTl9fKTsKICNlbmRpZgotICAgIHdoaWxlIChlaS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKLQlyZWlzZXJmc19mcmVlX3ByZWFsbG9jX2Jsb2NrKHRoLCBpbm9kZSwgZWktPmlfcHJlYWxsb2NfYmxvY2spOwotCWVpLT5pX3ByZWFsbG9jX2Jsb2NrKys7Ci0JZWktPmlfcHJlYWxsb2NfY291bnQgLS07Ci0JZGlydHkgPSAxOwotICAgIH0KLSAgICBpZiAoZGlydHkpCi0gICAgCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgIGVpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc2F2ZTsKLSAgICBsaXN0X2RlbF9pbml0KCYoZWktPmlfcHJlYWxsb2NfbGlzdCkpOworCXdoaWxlIChlaS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKKwkJcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayh0aCwgaW5vZGUsIGVpLT5pX3ByZWFsbG9jX2Jsb2NrKTsKKwkJZWktPmlfcHJlYWxsb2NfYmxvY2srKzsKKwkJZWktPmlfcHJlYWxsb2NfY291bnQtLTsKKwkJZGlydHkgPSAxOworCX0KKwlpZiAoZGlydHkpCisJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCWVpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc2F2ZTsKKwlsaXN0X2RlbF9pbml0KCYoZWktPmlfcHJlYWxsb2NfbGlzdCkpOwogfQogCiAvKiBGSVhNRTogSXQgc2hvdWxkIGJlIGlubGluZSBmdW5jdGlvbiAqLwotdm9pZCByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSA9IFJFSVNFUkZTX0koaW5vZGUpOwotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICBpZiAoZWktPmlfcHJlYWxsb2NfY291bnQpCi0JX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpID0gUkVJU0VSRlNfSShpbm9kZSk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJaWYgKGVpLT5pX3ByZWFsbG9jX2NvdW50KQorCQlfX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGVpKTsKIH0KIAotdm9pZCByZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCit2b2lkIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQogewotICAgIHN0cnVjdCBsaXN0X2hlYWQgKiBwbGlzdCA9ICZTQl9KT1VSTkFMKHRoLT50X3N1cGVyKS0+al9wcmVhbGxvY19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0ID0gJlNCX0pPVVJOQUwodGgtPnRfc3VwZXIpLT5qX3ByZWFsbG9jX2xpc3Q7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICB3aGlsZSAoIWxpc3RfZW1wdHkocGxpc3QpKSB7Ci0Jc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpOwotCWVpID0gbGlzdF9lbnRyeShwbGlzdC0+bmV4dCwgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8sIGlfcHJlYWxsb2NfbGlzdCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KHBsaXN0KSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWk7CisJCWVpID0gbGlzdF9lbnRyeShwbGlzdC0+bmV4dCwgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8sCisJCQkJaV9wcmVhbGxvY19saXN0KTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlpZiAoIWVpLT5pX3ByZWFsbG9jX2NvdW50KSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAiemFtLTQwMDE6JXM6IGlub2RlIGlzIGluIHByZWFsbG9jIGxpc3QgYnV0IGhhcyBubyBwcmVhbGxvY2F0ZWQgYmxvY2tzLiIsIF9fRlVOQ1RJT05fXyk7Ci0JfQorCQlpZiAoIWVpLT5pX3ByZWFsbG9jX2NvdW50KSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCQkgInphbS00MDAxOiVzOiBpbm9kZSBpcyBpbiBwcmVhbGxvYyBsaXN0IGJ1dCBoYXMgbm8gcHJlYWxsb2NhdGVkIGJsb2Nrcy4iLAorCQkJCQkgX19GVU5DVElPTl9fKTsKKwkJfQogI2VuZGlmCi0JX19kaXNjYXJkX3ByZWFsbG9jKHRoLCBlaSk7Ci0gICAgfQorCQlfX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGVpKTsKKwl9CiB9CiAKLXZvaWQgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit2b2lkIHJlaXNlcmZzX2luaXRfYWxsb2Nfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc2V0X2JpdCAoX0FMTE9DX3NraXBfYnVzeSwgJlNCX0FMTE9DX09QVFMocykpOwotICAgIHNldF9iaXQgKF9BTExPQ19kaXJpZF9ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKLSAgICBzZXRfYml0IChfQUxMT0NfcGFja2luZ19ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKKwlzZXRfYml0KF9BTExPQ19za2lwX2J1c3ksICZTQl9BTExPQ19PUFRTKHMpKTsKKwlzZXRfYml0KF9BTExPQ19kaXJpZF9ncm91cHMsICZTQl9BTExPQ19PUFRTKHMpKTsKKwlzZXRfYml0KF9BTExPQ19wYWNraW5nX2dyb3VwcywgJlNCX0FMTE9DX09QVFMocykpOwogfQogCiAvKiBibG9jayBhbGxvY2F0b3IgcmVsYXRlZCBvcHRpb25zIGFyZSBwYXJzZWQgaGVyZSAqLwotaW50IHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG9wdGlvbnMpCitpbnQgcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKm9wdGlvbnMpCiB7Ci0gICAgY2hhciAqIHRoaXNfY2hhciwgKiB2YWx1ZTsKKwljaGFyICp0aGlzX2NoYXIsICp2YWx1ZTsKIAotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYml0cyA9IDA7IC8qIGNsZWFyIGRlZmF1bHQgc2V0dGluZ3MgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJpdHMgPSAwOwkvKiBjbGVhciBkZWZhdWx0IHNldHRpbmdzICovCiAKLSAgICB3aGlsZSAoICh0aGlzX2NoYXIgPSBzdHJzZXAgKCZvcHRpb25zLCAiOiIpKSAhPSBOVUxMICkgewotCWlmICgodmFsdWUgPSBzdHJjaHIgKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKLQkgICAgKnZhbHVlKysgPSAwOworCXdoaWxlICgodGhpc19jaGFyID0gc3Ryc2VwKCZvcHRpb25zLCAiOiIpKSAhPSBOVUxMKSB7CisJCWlmICgodmFsdWUgPSBzdHJjaHIodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCQkJKnZhbHVlKysgPSAwOwogCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMiKSkgewotCSAgICBpbnQgdGVtcDsKLQkgICAgU0VUX09QVElPTihjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2Rlcyk7Ci0JICAgIHRlbXAgPSAodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IDEwOwotCSAgICBpZiAodGVtcCA8PSAwIHx8IHRlbXAgPiAxMDApIHsKLQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDsKLQkgICAgfSBlbHNlIHsKLQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXIgPSAxMDAgLyB0ZW1wOwotCSAgIH0KLQkgICAgY29udGludWU7Ci0JfQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMiKSkgewotCSAgICBTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMpOwotCSAgICBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmxhcmdlX2ZpbGVfc2l6ZSA9Ci0JCSh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogMTY7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMiKSkgewotCSAgICBTRVRfT1BUSU9OKGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyk7Ci0JICAgIGNvbnRpbnVlOwotCX07CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgImNvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzIikpIHsKKwkJCWludCB0ZW1wOworCQkJU0VUX09QVElPTihjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2Rlcyk7CisJCQl0ZW1wID0gKHZhbHVlCisJCQkJJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsCisJCQkJCQkJICAgIDApIDogMTA7CisJCQlpZiAodGVtcCA8PSAwIHx8IHRlbXAgPiAxMDApIHsKKwkJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlciA9IDEwOworCQkJfSBlbHNlIHsKKwkJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlciA9CisJCQkJICAgIDEwMCAvIHRlbXA7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJkaXNwbGFjaW5nX2xhcmdlX2ZpbGVzIikpIHsKKwkJCVNFVF9PUFRJT04oZGlzcGxhY2luZ19sYXJnZV9maWxlcyk7CisJCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmxhcmdlX2ZpbGVfc2l6ZSA9CisJCQkgICAgKHZhbHVlCisJCQkgICAgICYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKSA6IDE2OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzIikpIHsKKwkJCVNFVF9PUFRJT04oZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKTsKKwkJCWNvbnRpbnVlOworCQl9OwogCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKLQkgICAgU0VUX09QVElPTihvbGRfaGFzaGVkX3JlbG9jYXRpb24pOwotCSAgICBjb250aW51ZTsKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKKwkJCVNFVF9PUFRJT04ob2xkX2hhc2hlZF9yZWxvY2F0aW9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAibmV3X2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKKwkJCVNFVF9PUFRJT04obmV3X2hhc2hlZF9yZWxvY2F0aW9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlyaWRfZ3JvdXBzIikpIHsKKwkJCVNFVF9PUFRJT04oZGlyaWRfZ3JvdXBzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9pZF9ncm91cHMiKSkgeworCQkJU0VUX09QVElPTihvaWRfZ3JvdXBzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgInBhY2tpbmdfZ3JvdXBzIikpIHsKKwkJCVNFVF9PUFRJT04ocGFja2luZ19ncm91cHMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcyIpKSB7CisJCQlTRVRfT1BUSU9OKGhhc2hlZF9mb3JtYXR0ZWRfbm9kZXMpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJza2lwX2J1c3kiKSkgeworCQkJU0VUX09QVElPTihza2lwX2J1c3kpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJodW5kcmVkdGhfc2xpY2VzIikpIHsKKwkJCVNFVF9PUFRJT04oaHVuZHJlZHRoX3NsaWNlcyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF93YXkiKSkgeworCQkJU0VUX09QVElPTihvbGRfd2F5KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQiKSkgeworCQkJU0VUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jbWluIikpIHsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPQorCQkJICAgICh2YWx1ZQorCQkJICAgICAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCkgOiA0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJwcmVhbGxvY3NpemUiKSkgeworCQkJUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgPQorCQkJICAgICh2YWx1ZQorCQkJICAgICAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwKKwkJCQkJCQkgMCkgOgorCQkJICAgIFBSRUFMTE9DQVRJT05fU0laRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAiemFtLTQwMDE6ICVzIDogdW5rbm93biBvcHRpb24gLSAlcyIsCisJCQkJIF9fRlVOQ1RJT05fXywgdGhpc19jaGFyKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAibmV3X2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKLQkgICAgU0VUX09QVElPTihuZXdfaGFzaGVkX3JlbG9jYXRpb24pOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlyaWRfZ3JvdXBzIikpIHsKLQkgICAgU0VUX09QVElPTihkaXJpZF9ncm91cHMpOwotCSAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvaWRfZ3JvdXBzIikpIHsKLQkgICAgU0VUX09QVElPTihvaWRfZ3JvdXBzKTsKLQkgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicGFja2luZ19ncm91cHMiKSkgewotCSAgICBTRVRfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzKTsKLQkgICAgY29udGludWU7Ci0gICAgICAgIH0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJoYXNoZWRfZm9ybWF0dGVkX25vZGVzIikpIHsKLQkgICAgU0VUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAic2tpcF9idXN5IikpIHsKLQkgICAgU0VUX09QVElPTihza2lwX2J1c3kpOwotCSAgICBjb250aW51ZTsKLQl9Ci0KLQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJodW5kcmVkdGhfc2xpY2VzIikpIHsKLQkgICAgU0VUX09QVElPTihodW5kcmVkdGhfc2xpY2VzKTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX3dheSIpKSB7Ci0JICAgIFNFVF9PUFRJT04ob2xkX3dheSk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkIikpIHsKLQkgICAgU0VUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCk7Ci0JICAgIGNvbnRpbnVlOwotCX0KLQotCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jbWluIikpIHsKLQkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiA9Ci0JCSh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogNDsKLQkgICAgY29udGludWU7Ci0JfQotCi0JaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicHJlYWxsb2NzaXplIikpIHsKLQkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgPQotCQkodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IFBSRUFMTE9DQVRJT05fU0laRTsKLQkgICAgY29udGludWU7Ci0JfQotCi0JcmVpc2VyZnNfd2FybmluZyAocywgInphbS00MDAxOiAlcyA6IHVua25vd24gb3B0aW9uIC0gJXMiLAotCQkJICBfX0ZVTkNUSU9OX18gLCB0aGlzX2NoYXIpOwotCXJldHVybiAxOwotICAgICAgfQotICAKLSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiYWxsb2NhdG9yIG9wdGlvbnMgPSBbJTA4eF1cbiIsIFNCX0FMTE9DX09QVFMocykpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcocywgImFsbG9jYXRvciBvcHRpb25zID0gWyUwOHhdXG4iLCBTQl9BTExPQ19PUFRTKHMpKTsKKwlyZXR1cm4gMDsKIH0KLSAgCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV3X2hhc2hlZF9yZWxvY2F0aW9uIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCi17Ci0gICAgY2hhciAqIGhhc2hfaW47Ci0gICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7Ci0JICAgIGhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKLSAgICB9IGVsc2UgewotCWlmICghaGludC0+aW5vZGUpIHsKLQkgICAgLy9oaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWc7Ci0JICAgIGhhc2hfaW4gPSAoY2hhciopJmhpbnQtPmtleS5rX2Rpcl9pZDsKLQl9IGVsc2UgCi0JICAgIGlmICggVEVTVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQsIGhpbnQtPnRoLT50X3N1cGVyKSkKLQkJaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOwotCSAgICBlbHNlCi0JCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOwotICAgICAgfQogCi0gICAgaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworc3RhdGljIGlubGluZSB2b2lkIG5ld19oYXNoZWRfcmVsb2NhdGlvbihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisJY2hhciAqaGFzaF9pbjsKKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkJaGFzaF9pbiA9IChjaGFyICopJmhpbnQtPmtleS5rX2Rpcl9pZDsKKwl9IGVsc2UgeworCQlpZiAoIWhpbnQtPmlub2RlKSB7CisJCQkvL2hpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZzsKKwkJCWhhc2hfaW4gPSAoY2hhciAqKSZoaW50LT5rZXkua19kaXJfaWQ7CisJCX0gZWxzZQorCQkgICAgaWYgKFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCisJCQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJCWVsc2UKKwkJCWhhc2hfaW4gPQorCQkJICAgIChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7CisJfQorCisJaGludC0+c2VhcmNoX3N0YXJ0ID0KKwkgICAgaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOwogfQogCiAvKgogICogUmVsb2NhdGlvbiBiYXNlZCBvbiBkaXJpZCwgaGFzaGluZyB0aGVtIGludG8gYSBnaXZlbiBiaXRtYXAgYmxvY2sKICAqIGZpbGVzLiBGb3JtYXR0ZWQgbm9kZXMgYXJlIHVuYWZmZWN0ZWQsIGEgc2VwZXJhdGUgcG9saWN5IGNvdmVycyB0aGVtCiAgKi8KLXN0YXRpYyB2b2lkCi1kaXJpZF9ncm91cHMgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIHZvaWQgZGlyaWRfZ3JvdXBzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gICAgX191MzIgZGlyaWQgPSAwOwotICAgIGludCBibSA9IDA7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGhpbnQtPnRoLT50X3N1cGVyOwotICAgIGlmIChoaW50LT5pbm9kZSkKLQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7Ci0gICAgZWxzZSBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpCi0gICAgICAgIGRpcmlkID0gaGludC0+a2V5LmtfZGlyX2lkOwotCi0gICAgaWYgKGRpcmlkKSB7Ci0JYm0gPSBibWFwX2hhc2hfaWQoc2IsIGRpcmlkKTsKLQloYXNoID0gYm0gKiAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOwotCS8qIGdpdmUgYSBwb3J0aW9uIG9mIHRoZSBibG9jayBncm91cCB0byBtZXRhZGF0YSAqLworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlfX3UzMiBkaXJpZCA9IDA7CisJaW50IGJtID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaGludC0+dGgtPnRfc3VwZXI7CiAJaWYgKGhpbnQtPmlub2RlKQotCSAgICBoYXNoICs9IHNiLT5zX2Jsb2Nrc2l6ZS8yOwotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7Ci0gICAgfQorCQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJZWxzZSBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpCisJCWRpcmlkID0gaGludC0+a2V5LmtfZGlyX2lkOworCisJaWYgKGRpcmlkKSB7CisJCWJtID0gYm1hcF9oYXNoX2lkKHNiLCBkaXJpZCk7CisJCWhhc2ggPSBibSAqIChzYi0+c19ibG9ja3NpemUgPDwgMyk7CisJCS8qIGdpdmUgYSBwb3J0aW9uIG9mIHRoZSBibG9jayBncm91cCB0byBtZXRhZGF0YSAqLworCQlpZiAoaGludC0+aW5vZGUpCisJCQloYXNoICs9IHNiLT5zX2Jsb2Nrc2l6ZSAvIDI7CisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7CisJfQogfQogCiAvKgogICogUmVsb2NhdGlvbiBiYXNlZCBvbiBvaWQsIGhhc2hpbmcgdGhlbSBpbnRvIGEgZ2l2ZW4gYml0bWFwIGJsb2NrCiAgKiBmaWxlcy4gRm9ybWF0dGVkIG5vZGVzIGFyZSB1bmFmZmVjdGVkLCBhIHNlcGVyYXRlIHBvbGljeSBjb3ZlcnMgdGhlbQogICovCi1zdGF0aWMgdm9pZAotb2lkX2dyb3VwcyAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgdm9pZCBvaWRfZ3JvdXBzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBpZiAoaGludC0+aW5vZGUpIHsKLQl1bnNpZ25lZCBsb25nIGhhc2g7Ci0JX191MzIgb2lkOwotCV9fdTMyIGRpcmlkOwotCWludCBibTsKKwlpZiAoaGludC0+aW5vZGUpIHsKKwkJdW5zaWduZWQgbG9uZyBoYXNoOworCQlfX3UzMiBvaWQ7CisJCV9fdTMyIGRpcmlkOworCQlpbnQgYm07CiAKLQlkaXJpZCA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJCWRpcmlkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKIAotCS8qIGtlZXAgdGhlIHJvb3QgZGlyIGFuZCBpdCdzIGZpcnN0IHNldCBvZiBzdWJkaXJzIGNsb3NlIHRvCi0JICogdGhlIHN0YXJ0IG9mIHRoZSBkaXNrCi0JICovCi0JaWYgKGRpcmlkIDw9IDIpCi0JICAgIGhhc2ggPSAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOwotCWVsc2UgewotCSAgICBvaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7Ci0JICAgIGJtID0gYm1hcF9oYXNoX2lkKGhpbnQtPmlub2RlLT5pX3NiLCBvaWQpOwotCSAgICBoYXNoID0gYm0gKiAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCQkvKiBrZWVwIHRoZSByb290IGRpciBhbmQgaXQncyBmaXJzdCBzZXQgb2Ygc3ViZGlycyBjbG9zZSB0bworCQkgKiB0aGUgc3RhcnQgb2YgdGhlIGRpc2sKKwkJICovCisJCWlmIChkaXJpZCA8PSAyKQorCQkJaGFzaCA9IChoaW50LT5pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPDwgMyk7CisJCWVsc2UgeworCQkJb2lkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOworCQkJYm0gPSBibWFwX2hhc2hfaWQoaGludC0+aW5vZGUtPmlfc2IsIG9pZCk7CisJCQloYXNoID0gYm0gKiAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCQl9CisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7CiAJfQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGhhc2g7Ci0gICAgfQogfQogCiAvKiByZXR1cm5zIDEgaWYgaXQgZmluZHMgYW4gaW5kaXJlY3QgaXRlbSBhbmQgZ2V0cyB2YWxpZCBoaW50IGluZm8KICAqIGZyb20gaXQsIG90aGVyd2lzZSAwCiAgKi8KLXN0YXRpYyBpbnQgZ2V0X2xlZnRfbmVpZ2hib3IocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgaW50IGdldF9sZWZ0X25laWdoYm9yKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBzdHJ1Y3QgcGF0aCAqIHBhdGg7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBwb3NfaW5faXRlbTsKLSAgICBfX2xlMzIgKiBpdGVtOwotICAgIGludCByZXQgPSAwOworCXN0cnVjdCBwYXRoICpwYXRoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IHBvc19pbl9pdGVtOworCV9fbGUzMiAqaXRlbTsKKwlpbnQgcmV0ID0gMDsKIAotICAgIGlmICghaGludC0+cGF0aCkJCS8qIHJlaXNlcmZzIGNvZGUgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB3L28gcG9pbnRlciB0byBwYXRoCisJaWYgKCFoaW50LT5wYXRoKQkvKiByZWlzZXJmcyBjb2RlIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdy9vIHBvaW50ZXIgdG8gcGF0aAogCQkJCSAqIHN0cnVjdHVyZSBzdXBwbGllZDsgdGhlbiB3ZSByZWx5IG9uIHN1cHBsaWVkIHNlYXJjaF9zdGFydCAqLwotCXJldHVybiAwOworCQlyZXR1cm4gMDsKIAotICAgIHBhdGggPSBoaW50LT5wYXRoOwotICAgIGJoID0gZ2V0X2xhc3RfYmgocGF0aCk7Ci0gICAgUkZBTFNFKCAhYmgsICJncmVlbi00MDAyOiBJbGxlZ2FsIHBhdGggc3BlY2lmaWVkIHRvIGdldF9sZWZ0X25laWdoYm9yIik7Ci0gICAgaWggPSBnZXRfaWgocGF0aCk7Ci0gICAgcG9zX2luX2l0ZW0gPSBwYXRoLT5wb3NfaW5faXRlbTsKLSAgICBpdGVtID0gZ2V0X2l0ZW0gKHBhdGgpOworCXBhdGggPSBoaW50LT5wYXRoOworCWJoID0gZ2V0X2xhc3RfYmgocGF0aCk7CisJUkZBTFNFKCFiaCwgImdyZWVuLTQwMDI6IElsbGVnYWwgcGF0aCBzcGVjaWZpZWQgdG8gZ2V0X2xlZnRfbmVpZ2hib3IiKTsKKwlpaCA9IGdldF9paChwYXRoKTsKKwlwb3NfaW5faXRlbSA9IHBhdGgtPnBvc19pbl9pdGVtOworCWl0ZW0gPSBnZXRfaXRlbShwYXRoKTsKIAotICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IGJoLT5iX2Jsb2NrbnI7CisJaGludC0+c2VhcmNoX3N0YXJ0ID0gYmgtPmJfYmxvY2tucjsKIAotICAgIGlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgewotCS8qIGZvciBpbmRpcmVjdCBpdGVtOiBnbyB0byBsZWZ0IGFuZCBsb29rIGZvciB0aGUgZmlyc3Qgbm9uLWhvbGUgZW50cnkKLQkgICBpbiB0aGUgaW5kaXJlY3QgaXRlbSAqLwotCWlmIChwb3NfaW5faXRlbSA9PSBJX1VORk1fTlVNIChpaCkpCi0JICAgIHBvc19pbl9pdGVtLS07Ci0vLwkgICAgcG9zX2luX2l0ZW0gPSBJX1VORk1fTlVNIChpaCkgLSAxOwotCXdoaWxlIChwb3NfaW5faXRlbSA+PSAwKSB7Ci0JICAgIGludCB0PWdldF9ibG9ja19udW0oaXRlbSxwb3NfaW5faXRlbSk7Ci0JICAgIGlmICh0KSB7Ci0JCWhpbnQtPnNlYXJjaF9zdGFydCA9IHQ7Ci0JCXJldCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIHBvc19pbl9pdGVtIC0tOworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpKSB7CisJCS8qIGZvciBpbmRpcmVjdCBpdGVtOiBnbyB0byBsZWZ0IGFuZCBsb29rIGZvciB0aGUgZmlyc3Qgbm9uLWhvbGUgZW50cnkKKwkJICAgaW4gdGhlIGluZGlyZWN0IGl0ZW0gKi8KKwkJaWYgKHBvc19pbl9pdGVtID09IElfVU5GTV9OVU0oaWgpKQorCQkJcG9zX2luX2l0ZW0tLTsKKy8vICAgICAgICAgIHBvc19pbl9pdGVtID0gSV9VTkZNX05VTSAoaWgpIC0gMTsKKwkJd2hpbGUgKHBvc19pbl9pdGVtID49IDApIHsKKwkJCWludCB0ID0gZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSk7CisJCQlpZiAodCkgeworCQkJCWhpbnQtPnNlYXJjaF9zdGFydCA9IHQ7CisJCQkJcmV0ID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBvc19pbl9pdGVtLS07CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogZG9lcyByZXN1bHQgdmFsdWUgZml0IGludG8gc3BlY2lmaWVkIHJlZ2lvbj8gKi8KLSAgICByZXR1cm4gcmV0OworCS8qIGRvZXMgcmVzdWx0IHZhbHVlIGZpdCBpbnRvIHNwZWNpZmllZCByZWdpb24/ICovCisJcmV0dXJuIHJldDsKIH0KIAogLyogc2hvdWxkIGJlLCBpZiBmb3JtYXR0ZWQgbm9kZSwgdGhlbiB0cnkgdG8gcHV0IG9uIGZpcnN0IHBhcnQgb2YgdGhlIGRldmljZQogICAgc3BlY2lmaWVkIGFzIG51bWJlciBvZiBwZXJjZW50IHdpdGggbW91bnQgb3B0aW9uIGRldmljZSwgZWxzZSB0cnkgdG8gcHV0CiAgICBvbiBsYXN0IG9mIGRldmljZS4gIFRoaXMgaXMgbm90IHRvIHNheSBpdCBpcyBnb29kIGNvZGUgdG8gZG8gc28sCiAgICBidXQgdGhlIGVmZmVjdCBzaG91bGQgYmUgbWVhc3VyZWQuICAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldF9ib3JkZXJfaW5faGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9ib3JkZXJfaW5faGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkJICAgICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQogewotICAgIGJfYmxvY2tucl90IGJvcmRlciA9IFNCX0JMT0NLX0NPVU5UKHMpIC8gUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5ib3JkZXI7CisJYl9ibG9ja25yX3QgYm9yZGVyID0KKwkgICAgU0JfQkxPQ0tfQ09VTlQocykgLyBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlcjsKIAotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSkKLQloaW50LT5lbmQgPSBib3JkZXIgLSAxOwotICAgIGVsc2UKLQloaW50LT5iZWcgPSBib3JkZXI7CisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKQorCQloaW50LT5lbmQgPSBib3JkZXIgLSAxOworCWVsc2UKKwkJaGludC0+YmVnID0gYm9yZGVyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbGFyZ2VfZmlsZShyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNwbGFjZV9sYXJnZV9maWxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBpZiAoIFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKSwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKLSAgICBlbHNlCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworCWlmIChURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQorCQloaW50LT5zZWFyY2hfc3RhcnQgPQorCQkgICAgaGludC0+YmVnICsKKwkJICAgIGtleWVkX2hhc2goKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCksCisJCQkgICAgICAgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKwllbHNlCisJCWhpbnQtPnNlYXJjaF9zdGFydCA9CisJCSAgICBoaW50LT5iZWcgKworCQkgICAga2V5ZWRfaGFzaCgoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpLAorCQkJICAgICAgIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX2Zvcm1hdHRlZF9ub2RlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSB2b2lkIGhhc2hfZm9ybWF0dGVkX25vZGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQogewotICAgY2hhciAqIGhhc2hfaW47CisJY2hhciAqaGFzaF9pbjsKIAotICAgaWYgKCFoaW50LT5pbm9kZSkKLQloYXNoX2luID0gKGNoYXIqKSZoaW50LT5rZXkua19kaXJfaWQ7Ci0gICAgZWxzZSBpZiAoIFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCi0JaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOwotICAgIGVsc2UKLQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX29iamVjdGlkKTsKKwlpZiAoIWhpbnQtPmlub2RlKQorCQloYXNoX2luID0gKGNoYXIgKikmaGludC0+a2V5LmtfZGlyX2lkOworCWVsc2UgaWYgKFRFU1RfT1BUSU9OKGRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkLCBoaW50LT50aC0+dF9zdXBlcikpCisJCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKKwllbHNlCisJCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfb2JqZWN0aWQpOwogCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gaGludC0+YmVnICsga2V5ZWRfaGFzaChoYXNoX2luLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworCWhpbnQtPnNlYXJjaF9zdGFydCA9CisJICAgIGhpbnQtPmJlZyArIGtleWVkX2hhc2goaGFzaF9pbiwgNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgdGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCitzdGF0aWMgaW5saW5lIGludAordGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKgorCQkJCQkJICAgaGludCkKIHsKLSAgICByZXR1cm4gaGludC0+YmxvY2sgPT0gUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMubGFyZ2VfZmlsZV9zaXplOworCXJldHVybiBoaW50LT5ibG9jayA9PQorCSAgICBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5sYXJnZV9maWxlX3NpemU7CiB9CiAKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi1zdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbmV3X3BhY2tpbmdfbG9jYWxpdHkgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQorc3RhdGljIGlubGluZSB2b2lkIGRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5KHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICBzdHJ1Y3QgaW5fY29yZV9rZXkgKiBrZXkgPSAmaGludC0+a2V5OworCXN0cnVjdCBpbl9jb3JlX2tleSAqa2V5ID0gJmhpbnQtPmtleTsKIAotICAgIGhpbnQtPnRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzID0gMDsKLSAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKChjaGFyKikoJmtleS0+a19vYmplY3RpZCksNCkgJSAoaGludC0+ZW5kIC0gaGludC0+YmVnKTsKKwloaW50LT50aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDA7CisJaGludC0+c2VhcmNoX3N0YXJ0ID0KKwkgICAgaGludC0+YmVnICsga2V5ZWRfaGFzaCgoY2hhciAqKSgma2V5LT5rX29iamVjdGlkKSwKKwkJCQkgICA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOwogfQotICAjZW5kaWYKLQotc3RhdGljIGlubGluZSBpbnQgb2xkX2hhc2hlZF9yZWxvY2F0aW9uIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCi17Ci0gICAgYl9ibG9ja25yX3QgYm9yZGVyOwotICAgIHUzMiBoYXNoX2luOwotICAgIAotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSB8fCBoaW50LT5pbm9kZSA9PSBOVUxMKSB7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICBoYXNoX2luID0gbGUzMl90b19jcHUoKElOT0RFX1BLRVkoaGludC0+aW5vZGUpKS0+a19kaXJfaWQpOwotICAgIGJvcmRlciA9IGhpbnQtPmJlZyArICh1MzIpIGtleWVkX2hhc2goKChjaGFyICopICgmaGFzaF9pbikpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcgLSAxKTsKLSAgICBpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQotCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKLQotICAgIHJldHVybiAxOwotICB9Ci0gIAotc3RhdGljIGlubGluZSBpbnQgb2xkX3dheSAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQotewotICAgIGJfYmxvY2tucl90IGJvcmRlcjsKLSAgICAKLSAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgewotCXJldHVybiAwOwotICAgIH0KLSAgCi0gICAgICBib3JkZXIgPSBoaW50LT5iZWcgKyBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpICUgKGhpbnQtPmVuZCAgLSBoaW50LT5iZWcpOwotICAgIGlmIChib3JkZXIgPiBoaW50LT5zZWFyY2hfc3RhcnQpCi0JaGludC0+c2VhcmNoX3N0YXJ0ID0gYm9yZGVyOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBodW5kcmVkdGhfc2xpY2VzIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCi17Ci0gICAgc3RydWN0IGluX2NvcmVfa2V5ICoga2V5ID0gJmhpbnQtPmtleTsKLSAgICBiX2Jsb2NrbnJfdCBzbGljZV9zdGFydDsKLQotICAgIHNsaWNlX3N0YXJ0ID0gKGtleWVkX2hhc2goKGNoYXIqKSgma2V5LT5rX2Rpcl9pZCksNCkgJSAxMDApICogKGhpbnQtPmVuZCAvIDEwMCk7Ci0gICAgaWYgKCBzbGljZV9zdGFydCA+IGhpbnQtPnNlYXJjaF9zdGFydCB8fCBzbGljZV9zdGFydCArIChoaW50LT5lbmQgLyAxMDApIDw9IGhpbnQtPnNlYXJjaF9zdGFydCkgewotCWhpbnQtPnNlYXJjaF9zdGFydCA9IHNsaWNlX3N0YXJ0OwotICAgIH0KLX0KLSAgCi1zdGF0aWMgdm9pZCBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50LAotCQkJCQkgIGludCBhbW91bnRfbmVlZGVkKQotewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOwotICAgIGludCB1bmZtX2hpbnQ7Ci0KLSAgICBoaW50LT5iZWcgPSAwOwotICAgIGhpbnQtPmVuZCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKLQotICAgIC8qIFRoaXMgaXMgZm9ybWVyIGJvcmRlciBhbGdvcml0aG0uIE5vdyB3aXRoIHR1bmFibGUgYm9yZGVyIG9mZnNldCAqLwotICAgIGlmIChjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyhzKSkKLQlzZXRfYm9yZGVyX2luX2hpbnQocywgaGludCk7Ci0KLSNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgLyogd2hlbmV2ZXIgd2UgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeSwgd2UgZGlzcGxhY2UgaXQuICBBdCBmaXJzdCB3ZSB3aWxsCi0gICAgICAgaGFzaCBmb3IgbG9jYXRpb24sIGxhdGVyIHdlIG1pZ2h0IGxvb2sgZm9yIGEgbW9kZXJhdGVseSBlbXB0eSBwbGFjZSBmb3IKLSAgICAgICBpdCAqLwotICAgIGlmIChkaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMocykKLQkmJiBoaW50LT50aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcykgewotCWRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5KGhpbnQpOwotCi0JLyogd2UgZG8gbm90IGNvbnRpbnVlIGRldGVybWluZV9zZWFyY2hfc3RhcnQsCi0JICogaWYgbmV3IHBhY2tpbmcgbG9jYWxpdHkgaXMgYmVpbmcgZGlzcGxhY2VkICovCi0JcmV0dXJuOwotICAgIH0JCQkJICAgICAgCiAjZW5kaWYKLSAgCi0gICAgLyogYWxsIHBlcnNvbnMgc2hvdWxkIGZlZWwgZW5jb3VyYWdlZCB0byBhZGQgbW9yZSBzcGVjaWFsIGNhc2VzIGhlcmUgYW5kCi0gICAgICogdGVzdCB0aGVtICovCiAKLSAgICBpZiAoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUKLQkmJiB0aGlzX2Jsb2NrbnJfYWxsb2NhdGlvbl93b3VsZF9tYWtlX2l0X2FfbGFyZ2VfZmlsZShoaW50KSkgewotCWRpc3BsYWNlX2xhcmdlX2ZpbGUoaGludCk7Ci0JcmV0dXJuOwotICAgIH0KK3N0YXRpYyBpbmxpbmUgaW50IG9sZF9oYXNoZWRfcmVsb2NhdGlvbihyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisJYl9ibG9ja25yX3QgYm9yZGVyOworCXUzMiBoYXNoX2luOwogCi0gICAgLyogaWYgbm9uZSBvZiBvdXIgc3BlY2lhbCBjYXNlcyBpcyByZWxldmFudCwgdXNlIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZQotICAgICAgIHRyZWUgb3JkZXIgb2YgdGhlIG5ldyBub2RlIHdlIGFyZSBhbGxvY2F0aW5nIGZvciAqLwotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzLHMpKSB7Ci0gICAgICAgIGhhc2hfZm9ybWF0dGVkX25vZGUoaGludCk7Ci0JcmV0dXJuOwotICAgIH0KKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICB1bmZtX2hpbnQgPSBnZXRfbGVmdF9uZWlnaGJvcihoaW50KTsKKwloYXNoX2luID0gbGUzMl90b19jcHUoKElOT0RFX1BLRVkoaGludC0+aW5vZGUpKS0+a19kaXJfaWQpOworCWJvcmRlciA9CisJICAgIGhpbnQtPmJlZyArICh1MzIpIGtleWVkX2hhc2goKChjaGFyICopKCZoYXNoX2luKSksCisJCQkJCSA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcgLSAxKTsKKwlpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQorCQloaW50LT5zZWFyY2hfc3RhcnQgPSBib3JkZXI7CiAKLSAgICAvKiBNaW1pYyBvbGQgYmxvY2sgYWxsb2NhdG9yIGJlaGF2aW91ciwgdGhhdCBpcyBpZiBWRlMgYWxsb3dlZCBmb3IgcHJlYWxsb2NhdGlvbiwKLSAgICAgICBuZXcgYmxvY2tzIGFyZSBkaXNwbGFjZWQgYmFzZWQgb24gZGlyZWN0b3J5IElELiBBbHNvLCBpZiBzdWdnZXN0ZWQgc2VhcmNoX3N0YXJ0Ci0gICAgICAgaXMgbGVzcyB0aGFuIGxhc3QgcHJlYWxsb2NhdGVkIGJsb2NrLCB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSBpdCwgYXNzdW1pbmcgdGhhdAotICAgICAgIEhERCBkYXRhZmxvdyBpcyBmYXN0ZXIgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KLSAgICBpZiAoIFRFU1RfT1BUSU9OKG9sZF93YXksIHMpKSB7Ci0JaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgewotCSAgICBpZiAoICFyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbihzKSkKLQkJb2xkX3dheShoaW50KTsKLQkgICAgZWxzZSBpZiAoIXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24ocykpCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9sZF93YXkocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworCWJfYmxvY2tucl90IGJvcmRlcjsKKworCWlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSB8fCBoaW50LT5pbm9kZSA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCWJvcmRlciA9CisJICAgIGhpbnQtPmJlZyArCisJICAgIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCkgJSAoaGludC0+ZW5kIC0KKwkJCQkJCQkgICAgICBoaW50LT5iZWcpOworCWlmIChib3JkZXIgPiBoaW50LT5zZWFyY2hfc3RhcnQpCisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHVuZHJlZHRoX3NsaWNlcyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisJc3RydWN0IGluX2NvcmVfa2V5ICprZXkgPSAmaGludC0+a2V5OworCWJfYmxvY2tucl90IHNsaWNlX3N0YXJ0OworCisJc2xpY2Vfc3RhcnQgPQorCSAgICAoa2V5ZWRfaGFzaCgoY2hhciAqKSgma2V5LT5rX2Rpcl9pZCksIDQpICUgMTAwKSAqIChoaW50LT5lbmQgLyAxMDApOworCWlmIChzbGljZV9zdGFydCA+IGhpbnQtPnNlYXJjaF9zdGFydAorCSAgICB8fCBzbGljZV9zdGFydCArIChoaW50LT5lbmQgLyAxMDApIDw9IGhpbnQtPnNlYXJjaF9zdGFydCkgeworCQloaW50LT5zZWFyY2hfc3RhcnQgPSBzbGljZV9zdGFydDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRldGVybWluZV9zZWFyY2hfc3RhcnQocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50LAorCQkJCSAgIGludCBhbW91bnRfbmVlZGVkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOworCWludCB1bmZtX2hpbnQ7CisKKwloaW50LT5iZWcgPSAwOworCWhpbnQtPmVuZCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKworCS8qIFRoaXMgaXMgZm9ybWVyIGJvcmRlciBhbGdvcml0aG0uIE5vdyB3aXRoIHR1bmFibGUgYm9yZGVyIG9mZnNldCAqLworCWlmIChjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyhzKSkKKwkJc2V0X2JvcmRlcl9pbl9oaW50KHMsIGhpbnQpOworCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworCS8qIHdoZW5ldmVyIHdlIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnksIHdlIGRpc3BsYWNlIGl0LiAgQXQgZmlyc3Qgd2Ugd2lsbAorCSAgIGhhc2ggZm9yIGxvY2F0aW9uLCBsYXRlciB3ZSBtaWdodCBsb29rIGZvciBhIG1vZGVyYXRlbHkgZW1wdHkgcGxhY2UgZm9yCisJICAgaXQgKi8KKwlpZiAoZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKHMpCisJICAgICYmIGhpbnQtPnRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKSB7CisJCWRpc3BsYWNlX25ld19wYWNraW5nX2xvY2FsaXR5KGhpbnQpOworCisJCS8qIHdlIGRvIG5vdCBjb250aW51ZSBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0LAorCQkgKiBpZiBuZXcgcGFja2luZyBsb2NhbGl0eSBpcyBiZWluZyBkaXNwbGFjZWQgKi8KKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogYWxsIHBlcnNvbnMgc2hvdWxkIGZlZWwgZW5jb3VyYWdlZCB0byBhZGQgbW9yZSBzcGVjaWFsIGNhc2VzIGhlcmUgYW5kCisJICogdGVzdCB0aGVtICovCisKKwlpZiAoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUKKwkgICAgJiYgdGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUoaGludCkpIHsKKwkJZGlzcGxhY2VfbGFyZ2VfZmlsZShoaW50KTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIG5vbmUgb2Ygb3VyIHNwZWNpYWwgY2FzZXMgaXMgcmVsZXZhbnQsIHVzZSB0aGUgbGVmdCBuZWlnaGJvciBpbiB0aGUKKwkgICB0cmVlIG9yZGVyIG9mIHRoZSBuZXcgbm9kZSB3ZSBhcmUgYWxsb2NhdGluZyBmb3IgKi8KKwlpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgVEVTVF9PUFRJT04oaGFzaGVkX2Zvcm1hdHRlZF9ub2RlcywgcykpIHsKKwkJaGFzaF9mb3JtYXR0ZWRfbm9kZShoaW50KTsKKwkJcmV0dXJuOworCX0KKworCXVuZm1faGludCA9IGdldF9sZWZ0X25laWdoYm9yKGhpbnQpOworCisJLyogTWltaWMgb2xkIGJsb2NrIGFsbG9jYXRvciBiZWhhdmlvdXIsIHRoYXQgaXMgaWYgVkZTIGFsbG93ZWQgZm9yIHByZWFsbG9jYXRpb24sCisJICAgbmV3IGJsb2NrcyBhcmUgZGlzcGxhY2VkIGJhc2VkIG9uIGRpcmVjdG9yeSBJRC4gQWxzbywgaWYgc3VnZ2VzdGVkIHNlYXJjaF9zdGFydAorCSAgIGlzIGxlc3MgdGhhbiBsYXN0IHByZWFsbG9jYXRlZCBibG9jaywgd2Ugc3RhcnQgc2VhcmNoaW5nIGZyb20gaXQsIGFzc3VtaW5nIHRoYXQKKwkgICBIREQgZGF0YWZsb3cgaXMgZmFzdGVyIGluIGZvcndhcmQgZGlyZWN0aW9uICovCisJaWYgKFRFU1RfT1BUSU9OKG9sZF93YXksIHMpKSB7CisJCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkJCWlmICghcmVpc2VyZnNfaGFzaGVkX3JlbG9jYXRpb24ocykpCisJCQkJb2xkX3dheShoaW50KTsKKwkJCWVsc2UgaWYgKCFyZWlzZXJmc19ub191bmhhc2hlZF9yZWxvY2F0aW9uKHMpKQorCQkJCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKworCQkJaWYgKGhpbnQtPmlub2RlCisJCQkgICAgJiYgaGludC0+c2VhcmNoX3N0YXJ0IDwKKwkJCSAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jaykKKwkJCQloaW50LT5zZWFyY2hfc3RhcnQgPQorCQkJCSAgICBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jazsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogVGhpcyBpcyBhbiBhcHByb2FjaCBwcm9wb3NlZCBieSBIYW5zICovCisJaWYgKFRFU1RfT1BUSU9OKGh1bmRyZWR0aF9zbGljZXMsIHMpCisJICAgICYmICEoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUpKSB7CisJCWh1bmRyZWR0aF9zbGljZXMoaGludCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBvbGRfaGFzaGVkX3JlbG9jYXRpb24gb25seSB3b3JrcyBvbiB1bmZvcm1hdHRlZCAqLworCWlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJgorCSAgICBURVNUX09QVElPTihvbGRfaGFzaGVkX3JlbG9jYXRpb24sIHMpKSB7CiAJCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKwl9CisJLyogbmV3X2hhc2hlZF9yZWxvY2F0aW9uIHdvcmtzIHdpdGggYm90aCBmb3JtYXR0ZWQvdW5mb3JtYXR0ZWQgbm9kZXMgKi8KKwlpZiAoKCF1bmZtX2hpbnQgfHwgaGludC0+Zm9ybWF0dGVkX25vZGUpICYmCisJICAgIFRFU1RfT1BUSU9OKG5ld19oYXNoZWRfcmVsb2NhdGlvbiwgcykpIHsKKwkJbmV3X2hhc2hlZF9yZWxvY2F0aW9uKGhpbnQpOworCX0KKwkvKiBkaXJpZCBncm91cGluZyB3b3JrcyBvbmx5IG9uIHVuZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGRpcmlkX2dyb3VwcywgcykpIHsKKwkJZGlyaWRfZ3JvdXBzKGhpbnQpOworCX0KKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisJaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGRpcmlkX2dyb3VwcywgcykpIHsKKwkJZGlyaWRfZ3JvdXBzKGhpbnQpOworCX0KKyNlbmRpZgogCi0JICAgIGlmICggaGludC0+aW5vZGUgJiYgaGludC0+c2VhcmNoX3N0YXJ0IDwgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2spCi0JCWhpbnQtPnNlYXJjaF9zdGFydCA9IFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrOworCS8qIG9pZCBncm91cGluZyB3b3JrcyBvbmx5IG9uIHVuZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKG9pZF9ncm91cHMsIHMpKSB7CisJCW9pZF9ncm91cHMoaGludCk7CiAJfQogCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIGFuIGFwcHJvYWNoIHByb3Bvc2VkIGJ5IEhhbnMgKi8KLSAgICBpZiAoIFRFU1RfT1BUSU9OKGh1bmRyZWR0aF9zbGljZXMsIHMpICYmICEgKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSkgewotCWh1bmRyZWR0aF9zbGljZXMoaGludCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG9sZF9oYXNoZWRfcmVsb2NhdGlvbiBvbmx5IHdvcmtzIG9uIHVuZm9ybWF0dGVkICovCi0gICAgaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmCi0gICAgICAgIFRFU1RfT1BUSU9OKG9sZF9oYXNoZWRfcmVsb2NhdGlvbiwgcykpCi0gICAgewotCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKLSAgICB9Ci0gICAgLyogbmV3X2hhc2hlZF9yZWxvY2F0aW9uIHdvcmtzIHdpdGggYm90aCBmb3JtYXR0ZWQvdW5mb3JtYXR0ZWQgbm9kZXMgKi8KLSAgICBpZiAoKCF1bmZtX2hpbnQgfHwgaGludC0+Zm9ybWF0dGVkX25vZGUpICYmCi0gICAgICAgIFRFU1RfT1BUSU9OKG5ld19oYXNoZWRfcmVsb2NhdGlvbiwgcykpCi0gICAgewotCW5ld19oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKLSAgICB9Ci0gICAgLyogZGlyaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLwotICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMscykpCi0gICAgewotICAgICAgICBkaXJpZF9ncm91cHMoaGludCk7Ci0gICAgfQotCi0jaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihkaXJpZF9ncm91cHMscykpCi0gICAgewotICAgICAgICBkaXJpZF9ncm91cHMoaGludCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvKiBvaWQgZ3JvdXBpbmcgd29ya3Mgb25seSBvbiB1bmZvcm1hdHRlZCBub2RlcyAqLwotICAgIGlmICghdW5mbV9oaW50ICYmICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBURVNUX09QVElPTihvaWRfZ3JvdXBzLHMpKQotICAgIHsKLSAgICAgICAgb2lkX2dyb3VwcyhoaW50KTsKLSAgICB9Ci0gICAgcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IGRldGVybWluZV9wcmVhbGxvY19zaXplKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKIHsKLSAgICAvKiBtYWtlIG1pbmltdW0gc2l6ZSBhIG1vdW50IG9wdGlvbiBhbmQgYmVuY2htYXJrIGJvdGggd2F5cyAqLwotICAgIC8qIHdlIHByZWFsbG9jYXRlIGJsb2NrcyBvbmx5IGZvciByZWd1bGFyIGZpbGVzLCBzcGVjaWZpYyBzaXplICovCi0gICAgLyogYmVuY2htYXJrIHByZWFsbG9jYXRpbmcgYWx3YXlzIGFuZCBzZWUgd2hhdCBoYXBwZW5zICovCisJLyogbWFrZSBtaW5pbXVtIHNpemUgYSBtb3VudCBvcHRpb24gYW5kIGJlbmNobWFyayBib3RoIHdheXMgKi8KKwkvKiB3ZSBwcmVhbGxvY2F0ZSBibG9ja3Mgb25seSBmb3IgcmVndWxhciBmaWxlcywgc3BlY2lmaWMgc2l6ZSAqLworCS8qIGJlbmNobWFyayBwcmVhbGxvY2F0aW5nIGFsd2F5cyBhbmQgc2VlIHdoYXQgaGFwcGVucyAqLwogCi0gICAgaGludC0+cHJlYWxsb2Nfc2l6ZSA9IDA7CisJaGludC0+cHJlYWxsb2Nfc2l6ZSA9IDA7CiAKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7Ci0JaWYgKFNfSVNSRUcoaGludC0+aW5vZGUtPmlfbW9kZSkKLQkgICAgJiYgaGludC0+aW5vZGUtPmlfc2l6ZSA+PSBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiAqIGhpbnQtPmlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKLQkgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSA9IFJFSVNFUkZTX1NCKGhpbnQtPnRoLT50X3N1cGVyKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSAtIDE7Ci0gICAgfQotICAgIHJldHVybiBDQVJSWV9PTjsKKwlpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7CisJCWlmIChTX0lTUkVHKGhpbnQtPmlub2RlLT5pX21vZGUpCisJCSAgICAmJiBoaW50LT5pbm9kZS0+aV9zaXplID49CisJCSAgICBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy4KKwkJICAgIHByZWFsbG9jbWluICogaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCQkJaGludC0+cHJlYWxsb2Nfc2l6ZSA9CisJCQkgICAgUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMuCisJCQkgICAgcHJlYWxsb2NzaXplIC0gMTsKKwl9CisJcmV0dXJuIENBUlJZX09OOwogfQogCiAvKiBYWFggSSBrbm93IGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHVwcGVyLWxldmVsIGZ1bmN0aW9uOwogICAgYnV0IG1heSBiZSByZXN1bHQgZnVuY3Rpb24gd291bGQgYmUgdG9vIGNvbXBsZXguICovCi1zdGF0aWMgaW5saW5lIGludCBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2sgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKLQkJCQkJIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAotCQkJCQkgYl9ibG9ja25yX3Qgc3RhcnQsIGJfYmxvY2tucl90IGZpbmlzaCwKLQkJCQkJIGludCBtaW4sCi0JCQkJCSBpbnQgYW1vdW50X25lZWRlZCwgaW50IHByZWFsbG9jX3NpemUpCitzdGF0aWMgaW5saW5lIGludCBhbGxvY2F0ZV93aXRob3V0X3dyYXBwaW5nX2Rpc2socmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50LAorCQkJCQkJIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkJIGJfYmxvY2tucl90IHN0YXJ0LAorCQkJCQkJIGJfYmxvY2tucl90IGZpbmlzaCwgaW50IG1pbiwKKwkJCQkJCSBpbnQgYW1vdW50X25lZWRlZCwKKwkJCQkJCSBpbnQgcHJlYWxsb2Nfc2l6ZSkKIHsKLSAgICBpbnQgcmVzdCA9IGFtb3VudF9uZWVkZWQ7Ci0gICAgaW50IG5yX2FsbG9jYXRlZDsKLSAgCi0gICAgd2hpbGUgKHJlc3QgPiAwICYmIHN0YXJ0IDw9IGZpbmlzaCkgewotCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwIChoaW50LT50aCwgJnN0YXJ0LCBmaW5pc2gsIG1pbiwKLQkJCQkgICAgcmVzdCArIHByZWFsbG9jX3NpemUsICFoaW50LT5mb3JtYXR0ZWRfbm9kZSwKLQkJCQkgICAgaGludC0+YmxvY2spOworCWludCByZXN0ID0gYW1vdW50X25lZWRlZDsKKwlpbnQgbnJfYWxsb2NhdGVkOwogCi0JaWYgKG5yX2FsbG9jYXRlZCA9PSAwKQkvKiBubyBuZXcgYmxvY2tzIGFsbG9jYXRlZCwgcmV0dXJuICovCi0JICAgIGJyZWFrOwotCQotCS8qIGZpbGwgZnJlZV9ibG9ja25ycyBhcnJheSBmaXJzdCAqLwotCXdoaWxlIChyZXN0ID4gMCAmJiBucl9hbGxvY2F0ZWQgPiAwKSB7Ci0JICAgICogbmV3X2Jsb2NrbnJzICsrID0gc3RhcnQgKys7Ci0JICAgIHJlc3QgLS07IG5yX2FsbG9jYXRlZCAtLTsKKwl3aGlsZSAocmVzdCA+IDAgJiYgc3RhcnQgPD0gZmluaXNoKSB7CisJCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwKGhpbnQtPnRoLCAmc3RhcnQsIGZpbmlzaCwgbWluLAorCQkJCQkgICByZXN0ICsgcHJlYWxsb2Nfc2l6ZSwKKwkJCQkJICAgIWhpbnQtPmZvcm1hdHRlZF9ub2RlLCBoaW50LT5ibG9jayk7CisKKwkJaWYgKG5yX2FsbG9jYXRlZCA9PSAwKQkvKiBubyBuZXcgYmxvY2tzIGFsbG9jYXRlZCwgcmV0dXJuICovCisJCQlicmVhazsKKworCQkvKiBmaWxsIGZyZWVfYmxvY2tucnMgYXJyYXkgZmlyc3QgKi8KKwkJd2hpbGUgKHJlc3QgPiAwICYmIG5yX2FsbG9jYXRlZCA+IDApIHsKKwkJCSpuZXdfYmxvY2tucnMrKyA9IHN0YXJ0Kys7CisJCQlyZXN0LS07CisJCQlucl9hbGxvY2F0ZWQtLTsKKwkJfQorCisJCS8qIGRvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGZpbGwgcHJlYWxsb2MuIGFycmF5IGFsc28gPyAqLworCQlpZiAobnJfYWxsb2NhdGVkID4gMCkgeworCQkJLyogaXQgbWVhbnMgcHJlYWxsb2Nfc2l6ZSB3YXMgZ3JlYXRlciB0aGF0IDAgYW5kIHdlIGRvIHByZWFsbG9jYXRpb24gKi8KKwkJCWxpc3RfYWRkKCZSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19saXN0LAorCQkJCSAmU0JfSk9VUk5BTChoaW50LT50aC0+dF9zdXBlciktPgorCQkJCSBqX3ByZWFsbG9jX2xpc3QpOworCQkJUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSBzdGFydDsKKwkJCVJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0KKwkJCSAgICBucl9hbGxvY2F0ZWQ7CisJCQlicmVhazsKKwkJfQogCX0KIAotCS8qIGRvIHdlIGhhdmUgc29tZXRoaW5nIHRvIGZpbGwgcHJlYWxsb2MuIGFycmF5IGFsc28gPyAqLwotCWlmIChucl9hbGxvY2F0ZWQgPiAwKSB7Ci0JICAgIC8qIGl0IG1lYW5zIHByZWFsbG9jX3NpemUgd2FzIGdyZWF0ZXIgdGhhdCAwIGFuZCB3ZSBkbyBwcmVhbGxvY2F0aW9uICovCi0JICAgIGxpc3RfYWRkKCZSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19saXN0LAotCQkgICAgICZTQl9KT1VSTkFMKGhpbnQtPnRoLT50X3N1cGVyKS0+al9wcmVhbGxvY19saXN0KTsKLQkgICAgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSBzdGFydDsKLQkgICAgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSBucl9hbGxvY2F0ZWQ7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gKGFtb3VudF9uZWVkZWQgLSByZXN0KTsKKwlyZXR1cm4gKGFtb3VudF9uZWVkZWQgLSByZXN0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYmxvY2tucnNfYW5kX3ByZWFsbG9jX2FycmF5c19mcm9tX3NlYXJjaF9zdGFydAotICAgIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwgYl9ibG9ja25yX3QgKm5ld19ibG9ja25ycywgaW50IGFtb3VudF9uZWVkZWQpCi17Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7Ci0gICAgYl9ibG9ja25yX3Qgc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7Ci0gICAgYl9ibG9ja25yX3QgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOwotICAgIGludCBwYXNzbm8gPSAwOwotICAgIGludCBucl9hbGxvY2F0ZWQgPSAwOwotICAgIGludCBiaWdhbGxvYyA9IDA7CisgICAgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisgICAgIGludCBhbW91bnRfbmVlZGVkKSB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CisJYl9ibG9ja25yX3Qgc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7CisJYl9ibG9ja25yX3QgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOworCWludCBwYXNzbm8gPSAwOworCWludCBucl9hbGxvY2F0ZWQgPSAwOworCWludCBiaWdhbGxvYyA9IDA7CiAKLSAgICBkZXRlcm1pbmVfcHJlYWxsb2Nfc2l6ZShoaW50KTsKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7Ci0gICAgICAgIGludCBxdW90YV9yZXQ7CisJZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoaGludCk7CisJaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworCQlpbnQgcXVvdGFfcmV0OwogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0JcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkLCBoaW50LT5pbm9kZS0+aV91aWQpOworCQlyZWlzZXJmc19kZWJ1ZyhzLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAlZCBibG9ja3MgaWQ9JXUiLAorCQkJICAgICAgIGFtb3VudF9uZWVkZWQsIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQlxdW90YV9yZXQgPSBEUVVPVF9BTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkKTsKLQlpZiAocXVvdGFfcmV0KSAgICAvKiBRdW90YSBleGNlZWRlZD8gKi8KLQkgICAgcmV0dXJuIFFVT1RBX0VYQ0VFREVEOwotCWlmIChoaW50LT5wcmVhbGxvY2F0ZSAmJiBoaW50LT5wcmVhbGxvY19zaXplICkgeworCQlxdW90YV9yZXQgPQorCQkgICAgRFFVT1RfQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCk7CisJCWlmIChxdW90YV9yZXQpCS8qIFF1b3RhIGV4Y2VlZGVkPyAqLworCQkJcmV0dXJuIFFVT1RBX0VYQ0VFREVEOworCQlpZiAoaGludC0+cHJlYWxsb2NhdGUgJiYgaGludC0+cHJlYWxsb2Nfc2l6ZSkgewogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0JICAgIHJlaXNlcmZzX2RlYnVnIChzLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGE6IGFsbG9jYXRpbmcgKHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLCBoaW50LT5wcmVhbGxvY19zaXplLCBoaW50LT5pbm9kZS0+aV91aWQpOworCQkJcmVpc2VyZnNfZGVidWcocywgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCQkgICAgICAgInJlaXNlcnF1b3RhOiBhbGxvY2F0aW5nIChwcmVhbGxvYykgJWQgYmxvY2tzIGlkPSV1IiwKKwkJCQkgICAgICAgaGludC0+cHJlYWxsb2Nfc2l6ZSwgaGludC0+aW5vZGUtPmlfdWlkKTsKICNlbmRpZgotCSAgICBxdW90YV9yZXQgPSBEUVVPVF9QUkVBTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBoaW50LT5wcmVhbGxvY19zaXplKTsKLQkgICAgaWYgKHF1b3RhX3JldCkKLQkJaGludC0+cHJlYWxsb2NhdGU9aGludC0+cHJlYWxsb2Nfc2l6ZT0wOworCQkJcXVvdGFfcmV0ID0KKwkJCSAgICBEUVVPVF9QUkVBTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLAorCQkJCQkJCSBoaW50LT5wcmVhbGxvY19zaXplKTsKKwkJCWlmIChxdW90YV9yZXQpCisJCQkJaGludC0+cHJlYWxsb2NhdGUgPSBoaW50LT5wcmVhbGxvY19zaXplID0gMDsKKwkJfQorCQkvKiBmb3IgdW5mb3JtYXR0ZWQgbm9kZXMsIGZvcmNlIGxhcmdlIGFsbG9jYXRpb25zICovCisJCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZDsKIAl9Ci0JLyogZm9yIHVuZm9ybWF0dGVkIG5vZGVzLCBmb3JjZSBsYXJnZSBhbGxvY2F0aW9ucyAqLwotCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZDsKLSAgICB9CiAKLSAgICBkbyB7Ci0JLyogaW4gYmlnYWxsb2MgbW9kZSwgbnJfYWxsb2NhdGVkIHNob3VsZCBzdGF5IHplcm8gdW50aWwKLQkgKiB0aGUgZW50aXJlIGFsbG9jYXRpb24gaXMgZmlsbGVkCi0JICovCi0JaWYgKHVubGlrZWx5KGJpZ2FsbG9jICYmIG5yX2FsbG9jYXRlZCkpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiYmlnYWxsb2MgaXMgJWQsIG5yX2FsbG9jYXRlZCAlZFxuIiwKLQkgICAgYmlnYWxsb2MsIG5yX2FsbG9jYXRlZCk7Ci0JICAgIC8qIHJlc2V0IHRoaW5ncyB0byBhIHNhbmUgdmFsdWUgKi8KLQkgICAgYmlnYWxsb2MgPSBhbW91bnRfbmVlZGVkIC0gbnJfYWxsb2NhdGVkOwotCX0KLQkvKgotCSAqIHRyeSBwYXNzIDAgYW5kIHBhc3MgMSBsb29raW5nIGZvciBhIG5pY2UgYmlnCi0JICogY29udGlndW91cyBhbGxvY2F0aW9uLiAgVGhlbiByZXNldCBhbmQgbG9vawotCSAqIGZvciBhbnl0aGluZyB5b3UgY2FuIGZpbmQuCi0JICovCi0JaWYgKHBhc3NubyA9PSAyICYmIGJpZ2FsbG9jKSB7Ci0JICAgIHBhc3NubyA9IDA7Ci0JICAgIGJpZ2FsbG9jID0gMDsKLQl9Ci0Jc3dpdGNoIChwYXNzbm8rKykgewotICAgICAgICBjYXNlIDA6IC8qIFNlYXJjaCBmcm9tIGhpbnQtPnNlYXJjaF9zdGFydCB0byBlbmQgb2YgZGlzayAqLwotCSAgICBzdGFydCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKLQkgICAgZmluaXNoID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOwotCSAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOiAvKiBTZWFyY2ggZnJvbSBoaW50LT5iZWcgdG8gaGludC0+c2VhcmNoX3N0YXJ0ICovCi0JICAgIHN0YXJ0ID0gaGludC0+YmVnOwotCSAgICBmaW5pc2ggPSBoaW50LT5zZWFyY2hfc3RhcnQ7Ci0JICAgIGJyZWFrOwotCWNhc2UgMjogLyogTGFzdCBjaGFuY2U6IFNlYXJjaCBmcm9tIDAgdG8gaGludC0+YmVnICovCi0JICAgIHN0YXJ0ID0gMDsKLQkgICAgZmluaXNoID0gaGludC0+YmVnOwotCSAgICBicmVhazsKLQlkZWZhdWx0OiAvKiBXZSd2ZSB0cmllZCBzZWFyY2hpbmcgZXZlcnl3aGVyZSwgbm90IGVub3VnaCBzcGFjZSAqLwotCSAgICAvKiBGcmVlIHRoZSBibG9ja3MgKi8KLQkgICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworCWRvIHsKKwkJLyogaW4gYmlnYWxsb2MgbW9kZSwgbnJfYWxsb2NhdGVkIHNob3VsZCBzdGF5IHplcm8gdW50aWwKKwkJICogdGhlIGVudGlyZSBhbGxvY2F0aW9uIGlzIGZpbGxlZAorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGJpZ2FsbG9jICYmIG5yX2FsbG9jYXRlZCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgImJpZ2FsbG9jIGlzICVkLCBucl9hbGxvY2F0ZWQgJWRcbiIsCisJCQkJCSBiaWdhbGxvYywgbnJfYWxsb2NhdGVkKTsKKwkJCS8qIHJlc2V0IHRoaW5ncyB0byBhIHNhbmUgdmFsdWUgKi8KKwkJCWJpZ2FsbG9jID0gYW1vdW50X25lZWRlZCAtIG5yX2FsbG9jYXRlZDsKKwkJfQorCQkvKgorCQkgKiB0cnkgcGFzcyAwIGFuZCBwYXNzIDEgbG9va2luZyBmb3IgYSBuaWNlIGJpZworCQkgKiBjb250aWd1b3VzIGFsbG9jYXRpb24uICBUaGVuIHJlc2V0IGFuZCBsb29rCisJCSAqIGZvciBhbnl0aGluZyB5b3UgY2FuIGZpbmQuCisJCSAqLworCQlpZiAocGFzc25vID09IDIgJiYgYmlnYWxsb2MpIHsKKwkJCXBhc3NubyA9IDA7CisJCQliaWdhbGxvYyA9IDA7CisJCX0KKwkJc3dpdGNoIChwYXNzbm8rKykgeworCQljYXNlIDA6CS8qIFNlYXJjaCBmcm9tIGhpbnQtPnNlYXJjaF9zdGFydCB0byBlbmQgb2YgZGlzayAqLworCQkJc3RhcnQgPSBoaW50LT5zZWFyY2hfc3RhcnQ7CisJCQlmaW5pc2ggPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBTZWFyY2ggZnJvbSBoaW50LT5iZWcgdG8gaGludC0+c2VhcmNoX3N0YXJ0ICovCisJCQlzdGFydCA9IGhpbnQtPmJlZzsKKwkJCWZpbmlzaCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIExhc3QgY2hhbmNlOiBTZWFyY2ggZnJvbSAwIHRvIGhpbnQtPmJlZyAqLworCQkJc3RhcnQgPSAwOworCQkJZmluaXNoID0gaGludC0+YmVnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIFdlJ3ZlIHRyaWVkIHNlYXJjaGluZyBldmVyeXdoZXJlLCBub3QgZW5vdWdoIHNwYWNlICovCisJCQkvKiBGcmVlIHRoZSBibG9ja3MgKi8KKwkJCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCQlyZWlzZXJmc19kZWJ1ZyAocywgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhOiBmcmVlaW5nIChub3NwYWNlKSAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCwgaGludC0+aW5vZGUtPmlfdWlkKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhzLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgInJlaXNlcnF1b3RhOiBmcmVlaW5nIChub3NwYWNlKSAlZCBibG9ja3MgaWQ9JXUiLAorCQkJCQkgICAgICAgYW1vdW50X25lZWRlZCArCisJCQkJCSAgICAgICBoaW50LT5wcmVhbGxvY19zaXplIC0KKwkJCQkJICAgICAgIG5yX2FsbG9jYXRlZCwKKwkJCQkJICAgICAgIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCk7ICAgICAvKiBGcmVlIG5vdCBhbGxvY2F0ZWQgYmxvY2tzICovCi0JICAgIH0KLSAgCSAgICB3aGlsZSAobnJfYWxsb2NhdGVkIC0tKQotCQlyZWlzZXJmc19mcmVlX2Jsb2NrKGhpbnQtPnRoLCBoaW50LT5pbm9kZSwgbmV3X2Jsb2NrbnJzW25yX2FsbG9jYXRlZF0sICFoaW50LT5mb3JtYXR0ZWRfbm9kZSk7CisJCQkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCk7CS8qIEZyZWUgbm90IGFsbG9jYXRlZCBibG9ja3MgKi8KKwkJCX0KKwkJCXdoaWxlIChucl9hbGxvY2F0ZWQtLSkKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKGhpbnQtPnRoLCBoaW50LT5pbm9kZSwKKwkJCQkJCSAgICBuZXdfYmxvY2tucnNbbnJfYWxsb2NhdGVkXSwKKwkJCQkJCSAgICAhaGludC0+Zm9ybWF0dGVkX25vZGUpOwogCi0JICAgIHJldHVybiBOT19ESVNLX1NQQUNFOwotCX0KLSAgICB9IHdoaWxlICgobnJfYWxsb2NhdGVkICs9IGFsbG9jYXRlX3dpdGhvdXRfd3JhcHBpbmdfZGlzayAoaGludCwKLQkJCSAgICBuZXdfYmxvY2tucnMgKyBucl9hbGxvY2F0ZWQsIHN0YXJ0LCBmaW5pc2gsCi0JCQkgICAgYmlnYWxsb2MgPyBiaWdhbGxvYyA6IDEsCi0JCQkgICAgYW1vdW50X25lZWRlZCAtIG5yX2FsbG9jYXRlZCwKLQkJCSAgICBoaW50LT5wcmVhbGxvY19zaXplKSkKLQkJCTwgYW1vdW50X25lZWRlZCk7Ci0gICAgaWYgKCAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKLSAgICAgICAgIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplID4KLQkgbnJfYWxsb2NhdGVkICsgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpIHsKLSAgICAvKiBTb21lIG9mIHByZWFsbG9jYXRpb24gYmxvY2tzIHdlcmUgbm90IGFsbG9jYXRlZCAqLworCQkJcmV0dXJuIE5PX0RJU0tfU1BBQ0U7CisJCX0KKwl9IHdoaWxlICgobnJfYWxsb2NhdGVkICs9IGFsbG9jYXRlX3dpdGhvdXRfd3JhcHBpbmdfZGlzayhoaW50LAorCQkJCQkJCQkgbmV3X2Jsb2NrbnJzICsKKwkJCQkJCQkJIG5yX2FsbG9jYXRlZCwKKwkJCQkJCQkJIHN0YXJ0LCBmaW5pc2gsCisJCQkJCQkJCSBiaWdhbGxvYyA/CisJCQkJCQkJCSBiaWdhbGxvYyA6IDEsCisJCQkJCQkJCSBhbW91bnRfbmVlZGVkIC0KKwkJCQkJCQkJIG5yX2FsbG9jYXRlZCwKKwkJCQkJCQkJIGhpbnQtPgorCQkJCQkJCQkgcHJlYWxsb2Nfc2l6ZSkpCisJCSA8IGFtb3VudF9uZWVkZWQpOworCWlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKKwkgICAgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgPgorCSAgICBucl9hbGxvY2F0ZWQgKyBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCkgeworCQkvKiBTb21lIG9mIHByZWFsbG9jYXRpb24gYmxvY2tzIHdlcmUgbm90IGFsbG9jYXRlZCAqLwogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0JcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogZnJlZWluZyAoZmFpbGVkIHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCAtIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50LCBoaW50LT5pbm9kZS0+aV91aWQpOworCQlyZWlzZXJmc19kZWJ1ZyhzLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJyZWlzZXJxdW90YTogZnJlZWluZyAoZmFpbGVkIHByZWFsbG9jKSAlZCBibG9ja3MgaWQ9JXUiLAorCQkJICAgICAgIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplIC0KKwkJCSAgICAgICBucl9hbGxvY2F0ZWQgLQorCQkJICAgICAgIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50LAorCQkJICAgICAgIGhpbnQtPmlub2RlLT5pX3VpZCk7CiAjZW5kaWYKLQlEUVVPVF9GUkVFX0JMT0NLX05PRElSVFkoaGludC0+aW5vZGUsIGFtb3VudF9uZWVkZWQgKwotCSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5wcmVhbGxvY19zaXplIC0gbnJfYWxsb2NhdGVkIC0KLQkJCQkgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpOwotICAgIH0KKwkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsKKwkJCQkJIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQgLQorCQkJCQkgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPgorCQkJCQkgaV9wcmVhbGxvY19jb3VudCk7CisJfQogCi0gICAgcmV0dXJuIENBUlJZX09OOworCXJldHVybiBDQVJSWV9PTjsKIH0KIAogLyogZ3JhYiBuZXcgYmxvY2tucnMgZnJvbSBwcmVhbGxvY2F0ZWQgbGlzdCAqLwogLyogcmV0dXJuIGFtb3VudCBzdGlsbCBuZWVkZWQgYWZ0ZXIgdXNpbmcgdGhlbSAqLwotc3RhdGljIGludCB1c2VfcHJlYWxsb2NhdGVkX2xpc3RfaWZfYXZhaWxhYmxlIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKLQkJCQkJICAgICAgIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkKQorc3RhdGljIGludCB1c2VfcHJlYWxsb2NhdGVkX2xpc3RfaWZfYXZhaWxhYmxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwKKwkJCQkJICAgICAgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSAgICAgIGludCBhbW91bnRfbmVlZGVkKQogewotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gaGludC0+aW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGhpbnQtPmlub2RlOwogCi0gICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgewotCXdoaWxlIChhbW91bnRfbmVlZGVkKSB7CisJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID4gMCkgeworCQl3aGlsZSAoYW1vdW50X25lZWRlZCkgewogCi0JICAgICpuZXdfYmxvY2tucnMgKysgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayArKzsKLQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgLS07CisJCQkqbmV3X2Jsb2NrbnJzKysgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jaysrOworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQtLTsKIAotCSAgICBhbW91bnRfbmVlZGVkIC0tOworCQkJYW1vdW50X25lZWRlZC0tOwogCi0JICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7Ci0JCWxpc3RfZGVsKCZSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KTsgIAotCQlicmVhazsKLQkgICAgfQorCQkJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IDw9IDApIHsKKwkJCQlsaXN0X2RlbCgmUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KIAl9Ci0gICAgICB9Ci0gICAgLyogcmV0dXJuIGFtb3VudCBzdGlsbCBuZWVkZWQgYWZ0ZXIgdXNpbmcgcHJlYWxsb2NhdGVkIGJsb2NrcyAqLwotICAgIHJldHVybiBhbW91bnRfbmVlZGVkOworCS8qIHJldHVybiBhbW91bnQgc3RpbGwgbmVlZGVkIGFmdGVyIHVzaW5nIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KKwlyZXR1cm4gYW1vdW50X25lZWRlZDsKIH0KIAotaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50LAotCQkJICAgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCwKLQkJCSAgICAgICBpbnQgcmVzZXJ2ZWRfYnlfdXMgLyogQW1vdW50IG9mIGJsb2NrcyB3ZSBoYXZlCi0JCQkJCQkgICAgICBhbHJlYWR5IHJlc2VydmVkICovKQoraW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCwgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkLCBpbnQgcmVzZXJ2ZWRfYnlfdXMJLyogQW1vdW50IG9mIGJsb2NrcyB3ZSBoYXZlCisJCQkJCQkJCQkJCQkJCQkJCSAgIGFscmVhZHkgcmVzZXJ2ZWQgKi8gKQogewotICAgIGludCBpbml0aWFsX2Ftb3VudF9uZWVkZWQgPSBhbW91bnRfbmVlZGVkOwotICAgIGludCByZXQ7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CisJaW50IGluaXRpYWxfYW1vdW50X25lZWRlZCA9IGFtb3VudF9uZWVkZWQ7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBoaW50LT50aC0+dF9zdXBlcjsKIAotICAgIC8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSwgdGFraW5nIGludG8gYWNjb3VudCByZXNlcnZlZCBzcGFjZSAqLwotICAgIGlmICggU0JfRlJFRV9CTE9DS1MocykgLSBSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzIDwKLQkgYW1vdW50X25lZWRlZCAtIHJlc2VydmVkX2J5X3VzKQotICAgICAgICByZXR1cm4gTk9fRElTS19TUEFDRTsKLSAgICAvKiBzaG91bGQgdGhpcyBiZSBpZiAhaGludC0+aW5vZGUgJiYgIGhpbnQtPnByZWFsbG9jYXRlPyAqLwotICAgIC8qIGRvIHlvdSBtZWFuIGhpbnQtPmZvcm1hdHRlZF9ub2RlIGNhbiBiZSByZW1vdmVkID8gLSBaYW0gKi8KLSAgICAvKiBoaW50LT5mb3JtYXR0ZWRfbm9kZSBjYW5ub3QgYmUgcmVtb3ZlZCBiZWNhdXNlIHdlIHRyeSB0byBhY2Nlc3MKLSAgICAgICBpbm9kZSBpbmZvcm1hdGlvbiBoZXJlLCBhbmQgdGhlcmUgaXMgb2Z0ZW4gbm8gaW5vZGUgYXNzb3RpYXRlZCB3aXRoCi0gICAgICAgbWV0YWRhdGEgYWxsb2NhdGlvbnMgLSBncmVlbiAqLworCS8qIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSwgdGFraW5nIGludG8gYWNjb3VudCByZXNlcnZlZCBzcGFjZSAqLworCWlmIChTQl9GUkVFX0JMT0NLUyhzKSAtIFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgPAorCSAgICBhbW91bnRfbmVlZGVkIC0gcmVzZXJ2ZWRfYnlfdXMpCisJCXJldHVybiBOT19ESVNLX1NQQUNFOworCS8qIHNob3VsZCB0aGlzIGJlIGlmICFoaW50LT5pbm9kZSAmJiAgaGludC0+cHJlYWxsb2NhdGU/ICovCisJLyogZG8geW91IG1lYW4gaGludC0+Zm9ybWF0dGVkX25vZGUgY2FuIGJlIHJlbW92ZWQgPyAtIFphbSAqLworCS8qIGhpbnQtPmZvcm1hdHRlZF9ub2RlIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2Ugd2UgdHJ5IHRvIGFjY2VzcworCSAgIGlub2RlIGluZm9ybWF0aW9uIGhlcmUsIGFuZCB0aGVyZSBpcyBvZnRlbiBubyBpbm9kZSBhc3NvdGlhdGVkIHdpdGgKKwkgICBtZXRhZGF0YSBhbGxvY2F0aW9ucyAtIGdyZWVuICovCiAKLSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGhpbnQtPnByZWFsbG9jYXRlKSB7Ci0JYW1vdW50X25lZWRlZCA9IHVzZV9wcmVhbGxvY2F0ZWRfbGlzdF9pZl9hdmFpbGFibGUKLQkgICAgKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7Ci0JaWYgKGFtb3VudF9uZWVkZWQgPT0gMCkJLyogYWxsIGJsb2NrbnJzIHdlIG5lZWQgd2UgZ290IGZyb20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYWxsb2MuIGxpc3QgKi8KLQkgICAgcmV0dXJuIENBUlJZX09OOwotCW5ld19ibG9ja25ycyArPSAoaW5pdGlhbF9hbW91bnRfbmVlZGVkIC0gYW1vdW50X25lZWRlZCk7Ci0gICAgfQotCi0gICAgLyogZmluZCBzZWFyY2ggc3RhcnQgYW5kIHNhdmUgaXQgaW4gaGludCBzdHJ1Y3R1cmUgKi8KLSAgICBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KGhpbnQsIGFtb3VudF9uZWVkZWQpOwotICAgIGlmIChoaW50LT5zZWFyY2hfc3RhcnQgPj0gU0JfQkxPQ0tfQ09VTlQocykpCi0gICAgICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKLQotICAgIC8qIGFsbG9jYXRpb24gaXRzZWxmOyBmaWxsIG5ld19ibG9ja25ycyBhbmQgcHJlYWxsb2NhdGlvbiBhcnJheXMgKi8KLSAgICByZXQgPSBibG9ja25yc19hbmRfcHJlYWxsb2NfYXJyYXlzX2Zyb21fc2VhcmNoX3N0YXJ0Ci0JKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7Ci0KLSAgICAvKiB3ZSB1c2VkIHByZWFsbG9jLiBsaXN0IHRvIGZpbGwgKHBhcnRpYWxseSkgbmV3X2Jsb2NrbnJzIGFycmF5LiBJZiBmaW5hbCBhbGxvY2F0aW9uIGZhaWxzIHdlCi0gICAgICogbmVlZCB0byByZXR1cm4gYmxvY2tzIGJhY2sgdG8gcHJlYWxsb2MuIGxpc3Qgb3IganVzdCBmcmVlIHRoZW0uIC0tIFphbSAoSSBjaG9zZSBzZWNvbmQKLSAgICAgKiB2YXJpYW50KSAqLwotCi0gICAgaWYgKHJldCAhPSBDQVJSWV9PTikgewotCXdoaWxlIChhbW91bnRfbmVlZGVkICsrIDwgaW5pdGlhbF9hbW91bnRfbmVlZGVkKSB7Ci0JICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2soaGludC0+dGgsIGhpbnQtPmlub2RlLCAqKC0tbmV3X2Jsb2NrbnJzKSwgMSk7CisJaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBoaW50LT5wcmVhbGxvY2F0ZSkgeworCQlhbW91bnRfbmVlZGVkID0gdXNlX3ByZWFsbG9jYXRlZF9saXN0X2lmX2F2YWlsYWJsZQorCQkgICAgKGhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCk7CisJCWlmIChhbW91bnRfbmVlZGVkID09IDApCS8qIGFsbCBibG9ja25ycyB3ZSBuZWVkIHdlIGdvdCBmcm9tCisJCQkJCSAgIHByZWFsbG9jLiBsaXN0ICovCisJCQlyZXR1cm4gQ0FSUllfT047CisJCW5ld19ibG9ja25ycyArPSAoaW5pdGlhbF9hbW91bnRfbmVlZGVkIC0gYW1vdW50X25lZWRlZCk7CiAJfQotICAgIH0KLSAgICByZXR1cm4gcmV0OworCisJLyogZmluZCBzZWFyY2ggc3RhcnQgYW5kIHNhdmUgaXQgaW4gaGludCBzdHJ1Y3R1cmUgKi8KKwlkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KGhpbnQsIGFtb3VudF9uZWVkZWQpOworCWlmIChoaW50LT5zZWFyY2hfc3RhcnQgPj0gU0JfQkxPQ0tfQ09VTlQocykpCisJCWhpbnQtPnNlYXJjaF9zdGFydCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKworCS8qIGFsbG9jYXRpb24gaXRzZWxmOyBmaWxsIG5ld19ibG9ja25ycyBhbmQgcHJlYWxsb2NhdGlvbiBhcnJheXMgKi8KKwlyZXQgPSBibG9ja25yc19hbmRfcHJlYWxsb2NfYXJyYXlzX2Zyb21fc2VhcmNoX3N0YXJ0CisJICAgIChoaW50LCBuZXdfYmxvY2tucnMsIGFtb3VudF9uZWVkZWQpOworCisJLyogd2UgdXNlZCBwcmVhbGxvYy4gbGlzdCB0byBmaWxsIChwYXJ0aWFsbHkpIG5ld19ibG9ja25ycyBhcnJheS4gSWYgZmluYWwgYWxsb2NhdGlvbiBmYWlscyB3ZQorCSAqIG5lZWQgdG8gcmV0dXJuIGJsb2NrcyBiYWNrIHRvIHByZWFsbG9jLiBsaXN0IG9yIGp1c3QgZnJlZSB0aGVtLiAtLSBaYW0gKEkgY2hvc2Ugc2Vjb25kCisJICogdmFyaWFudCkgKi8KKworCWlmIChyZXQgIT0gQ0FSUllfT04pIHsKKwkJd2hpbGUgKGFtb3VudF9uZWVkZWQrKyA8IGluaXRpYWxfYW1vdW50X25lZWRlZCkgeworCQkJcmVpc2VyZnNfZnJlZV9ibG9jayhoaW50LT50aCwgaGludC0+aW5vZGUsCisJCQkJCSAgICAqKC0tbmV3X2Jsb2NrbnJzKSwgMSk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKIH0KIAogLyogVGhlc2UgMiBmdW5jdGlvbnMgYXJlIGhlcmUgdG8gcHJvdmlkZSBibG9ja3MgcmVzZXJ2YXRpb24gdG8gdGhlIHJlc3Qgb2Yga2VybmVsICovCiAvKiBSZXNlcnZlIEBibG9ja3MgYW1vdW50IG9mIGJsb2NrcyBpbiBmcyBwb2ludGVkIGJ5IEBzYi4gQ2FsbGVyIG11c3QgbWFrZSBzdXJlCiAgICB0aGVyZSBhcmUgYWN0dWFsbHkgdGhpcyBtdWNoIGJsb2NrcyBvbiB0aGUgRlMgYXZhaWxhYmxlICovCi12b2lkIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoIAotCQkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIC8qIHN1cGVyIGJsb2NrIG9mCi0JCQkJCQkJICAgICAgICBmaWxlc3lzdGVtIHdoZXJlCi0JCQkJCQkJCWJsb2NrcyBzaG91bGQgYmUKLQkJCQkJCQkJcmVzZXJ2ZWQgKi8KLQkJCQkgICAgICBpbnQgYmxvY2tzIC8qIEhvdyBtdWNoIHRvIHJlc2VydmUgKi8KLQkJCQkJICApCit2b2lkIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwJLyogc3VwZXIgYmxvY2sgb2YKKwkJCQkJCQkJCSAgIGZpbGVzeXN0ZW0gd2hlcmUKKwkJCQkJCQkJCSAgIGJsb2NrcyBzaG91bGQgYmUKKwkJCQkJCQkJCSAgIHJlc2VydmVkICovCisJCQkJCSAgIGludCBibG9ja3MJLyogSG93IG11Y2ggdG8gcmVzZXJ2ZSAqLworICAgICkKIHsKIAotICAgIC8qIEZhc3QgY2FzZSwgaWYgcmVzZXJ2YXRpb24gaXMgemVybyAtIGV4aXQgaW1tZWRpYXRlbHkuICovCi0gICAgaWYgKCAhYmxvY2tzICkKLQlyZXR1cm47CisJLyogRmFzdCBjYXNlLCBpZiByZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KKwlpZiAoIWJsb2NrcykKKwkJcmV0dXJuOwogCi0gICAgc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLSAgICBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyArPSBibG9ja3M7Ci0gICAgc3Bpbl91bmxvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCXNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisJUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgKz0gYmxvY2tzOworCXNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKIH0KIAogLyogVW5yZXNlcnZlIEBibG9ja3MgYW1vdW50IG9mIGJsb2NrcyBpbiBmcyBwb2ludGVkIGJ5IEBzYiAqLwotdm9pZCByZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKCAKLQkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCAvKiBzdXBlciBibG9jayBvZgotCQkJCQkJCSAgZmlsZXN5c3RlbSB3aGVyZQotCQkJCQkJCSAgYmxvY2tzIHNob3VsZCBiZQotCQkJCQkJCSAgcmVzZXJ2ZWQgKi8KLQkJCQlpbnQgYmxvY2tzIC8qIEhvdyBtdWNoIHRvIHVucmVzZXJ2ZSAqLwotCQkJCQkgICkKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAkvKiBzdXBlciBibG9jayBvZgorCQkJCQkJCQkgICBmaWxlc3lzdGVtIHdoZXJlCisJCQkJCQkJCSAgIGJsb2NrcyBzaG91bGQgYmUKKwkJCQkJCQkJICAgcmVzZXJ2ZWQgKi8KKwkJCQkgICAgIGludCBibG9ja3MJLyogSG93IG11Y2ggdG8gdW5yZXNlcnZlICovCisgICAgKQogewogCi0gICAgLyogRmFzdCBjYXNlLCBpZiB1bnJlc2VydmF0aW9uIGlzIHplcm8gLSBleGl0IGltbWVkaWF0ZWx5LiAqLwotICAgIGlmICggIWJsb2NrcyApCi0JcmV0dXJuOworCS8qIEZhc3QgY2FzZSwgaWYgdW5yZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KKwlpZiAoIWJsb2NrcykKKwkJcmV0dXJuOwogCi0gICAgc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLSAgICBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcyAtPSBibG9ja3M7Ci0gICAgc3Bpbl91bmxvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOwotICAgIFJGQUxTRSggUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgPCAwLCAiYW1vdW50IG9mIGJsb2NrcyByZXNlcnZlZCBiZWNhbWUgemVybz8iKTsKKwlzcGluX2xvY2soJlJFSVNFUkZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCVJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIC09IGJsb2NrczsKKwlzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisJUkZBTFNFKFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIDwgMCwKKwkgICAgICAgImFtb3VudCBvZiBibG9ja3MgcmVzZXJ2ZWQgYmVjYW1lIHplcm8/Iik7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIGhvdyBtdWNoIHBhZ2VzIHdlIHdpbGwgYmUgYWJsZSB0byB3cml0ZSB0byBGUwogICAgdXNlZCBmb3IgcmVpc2VyZnNfZmlsZV93cml0ZSgpIHB1cnBvc2VzIGZvciBub3cuICovCi1pbnQgcmVpc2VyZnNfY2FuX2ZpdF9wYWdlcyAoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgLyogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCi0JCQkJCQkgICAgICAgdG8gZXN0aW1hdGUgc3BhY2UgKi8gKQoraW50IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYgkvKiBzdXBlcmJsb2NrIG9mIGZpbGVzeXN0ZW0KKwkJCQkJCQkgICB0byBlc3RpbWF0ZSBzcGFjZSAqLyApCiB7CiAJaW50IHNwYWNlOwogCiAJc3Bpbl9sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKLQlzcGFjZSA9IChTQl9GUkVFX0JMT0NLUyhzYikgLSBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcykgPj4gKCBQQUdFX0NBQ0hFX1NISUZUIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCXNwYWNlID0KKwkgICAgKFNCX0ZSRUVfQkxPQ0tTKHNiKSAtCisJICAgICBSRUlTRVJGU19TQihzYiktPnJlc2VydmVkX2Jsb2NrcykgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJICAgc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCXNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKIAotCXJldHVybiBzcGFjZT4wP3NwYWNlOjA7CisJcmV0dXJuIHNwYWNlID4gMCA/IHNwYWNlIDogMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2Rpci5jIGIvZnMvcmVpc2VyZnMvZGlyLmMKaW5kZXggZmJkZTRiMDEuLjlkZDcxZTggMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2Rpci5jCisrKyBiL2ZzL3JlaXNlcmZzL2Rpci5jCkBAIC0xMiwyNjQgKzEyLDI4NiBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotZXh0ZXJuIHN0cnVjdCByZWlzZXJmc19rZXkgIE1JTl9LRVk7CitleHRlcm4gc3RydWN0IHJlaXNlcmZzX2tleSBNSU5fS0VZOwogCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRkaXIgKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKLXN0YXRpYyBpbnQgcmVpc2VyZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykgOworc3RhdGljIGludCByZWlzZXJmc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgICBpbnQgZGF0YXN5bmMpOwogCiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zID0gewotICAgIC5yZWFkCT0gZ2VuZXJpY19yZWFkX2RpciwKLSAgICAucmVhZGRpcgk9IHJlaXNlcmZzX3JlYWRkaXIsCi0gICAgLmZzeW5jCT0gcmVpc2VyZnNfZGlyX2ZzeW5jLAotICAgIC5pb2N0bAk9IHJlaXNlcmZzX2lvY3RsLAorCS5yZWFkID0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpciA9IHJlaXNlcmZzX3JlYWRkaXIsCisJLmZzeW5jID0gcmVpc2VyZnNfZGlyX2ZzeW5jLAorCS5pb2N0bCA9IHJlaXNlcmZzX2lvY3RsLAogfTsKIAotc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKSB7Ci0gIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0gIGludCBlcnI7Ci0gIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICBlcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKSA7Ci0gIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYikgOwotICBpZiAoZXJyIDwgMCkKLSAgICAgIHJldHVybiBlcnI7Ci0gIHJldHVybiAwOworc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSAgICAgIGludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnI7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJZXJyID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAotCiAjZGVmaW5lIHN0b3JlX2loKHdoZXJlLHdoYXQpIGNvcHlfaXRlbV9oZWFkICh3aGVyZSwgd2hhdCkKIAogLy8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZGRpciAoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fZW50cnkpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIGludCBpdGVtX251bSwgZW50cnlfbnVtOwotICAgIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBya2V5OwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOwotICAgIGludCBzZWFyY2hfcmVzOwotICAgIGNoYXIgKiBsb2NhbF9idWY7Ci0gICAgbG9mZl90IG5leHRfcG9zOwotICAgIGNoYXIgc21hbGxfYnVmWzMyXSA7IC8qIGF2b2lkIGttYWxsb2MgaWYgd2UgY2FuICovCi0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLSAgICBpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19lbnRyeSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgaXRlbV9udW0sIGVudHJ5X251bTsKKwljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpya2V5OworCXN0cnVjdCBpdGVtX2hlYWQgKmloLCB0bXBfaWg7CisJaW50IHNlYXJjaF9yZXM7CisJY2hhciAqbG9jYWxfYnVmOworCWxvZmZfdCBuZXh0X3BvczsKKwljaGFyIHNtYWxsX2J1ZlszMl07CS8qIGF2b2lkIGttYWxsb2MgaWYgd2UgY2FuICovCisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlpbnQgcmV0ID0gMDsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCi0gICAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChpbm9kZS0+aV9zYiwgInJlYWRkaXIiKSA7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChpbm9kZS0+aV9zYiwgInJlYWRkaXIiKTsKIAotICAgIC8qIGZvcm0ga2V5IGZvciBzZWFyY2ggdGhlIG5leHQgZGlyZWN0b3J5IGVudHJ5IHVzaW5nIGZfcG9zIGZpZWxkIG9mCi0gICAgICAgZmlsZSBzdHJ1Y3R1cmUgKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZwb3Nfa2V5LCBpbm9kZSwgKGZpbHAtPmZfcG9zKSA/IChmaWxwLT5mX3BvcykgOiBET1RfT0ZGU0VULAotCQkgIFRZUEVfRElSRU5UUlksIDMpOwotICAgIG5leHRfcG9zID0gY3B1X2tleV9rX29mZnNldCAoJnBvc19rZXkpOworCS8qIGZvcm0ga2V5IGZvciBzZWFyY2ggdGhlIG5leHQgZGlyZWN0b3J5IGVudHJ5IHVzaW5nIGZfcG9zIGZpZWxkIG9mCisJICAgZmlsZSBzdHJ1Y3R1cmUgKi8KKwltYWtlX2NwdV9rZXkoJnBvc19rZXksIGlub2RlLAorCQkgICAgIChmaWxwLT5mX3BvcykgPyAoZmlscC0+Zl9wb3MpIDogRE9UX09GRlNFVCwgVFlQRV9ESVJFTlRSWSwKKwkJICAgICAzKTsKKwluZXh0X3BvcyA9IGNwdV9rZXlfa19vZmZzZXQoJnBvc19rZXkpOwogCi0gICAgLyogIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAicmVpc2VyZnNfcmVhZGRpciAxOiBmX3BvcyA9ICVMZCIsIGZpbHAtPmZfcG9zKTsqLworCS8qICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInJlaXNlcmZzX3JlYWRkaXIgMTogZl9wb3MgPSAlTGQiLCBmaWxwLT5mX3Bvcyk7ICovCiAKLSAgICBwYXRoX3RvX2VudHJ5LnJlYWRhID0gUEFUSF9SRUFEQTsKLSAgICB3aGlsZSAoMSkgewotICAgIHJlc2VhcmNoOgotCS8qIHNlYXJjaCB0aGUgZGlyZWN0b3J5IGl0ZW0sIGNvbnRhaW5pbmcgZW50cnkgd2l0aCBzcGVjaWZpZWQga2V5ICovCi0Jc2VhcmNoX3JlcyA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKGlub2RlLT5pX3NiLCAmcG9zX2tleSwgJnBhdGhfdG9fZW50cnksICZkZSk7Ci0JaWYgKHNlYXJjaF9yZXMgPT0gSU9fRVJST1IpIHsKLQkgICAgLy8gRklYTUU6IHdlIGNvdWxkIGp1c3Qgc2tpcCBwYXJ0IG9mIGRpcmVjdG9yeSB3aGljaCBjb3VsZAotCSAgICAvLyBub3QgYmUgcmVhZAotCSAgICByZXQgPSAtRUlPOwotCSAgICBnb3RvIG91dDsKLQl9Ci0JZW50cnlfbnVtID0gZGUuZGVfZW50cnlfbnVtOwotCWJoID0gZGUuZGVfYmg7Ci0JaXRlbV9udW0gPSBkZS5kZV9pdGVtX251bTsKLQlpaCA9IGRlLmRlX2loOwotCXN0b3JlX2loICgmdG1wX2loLCBpaCk7Ci0JCQotCS8qIHdlIG11c3QgaGF2ZSBmb3VuZCBpdGVtLCB0aGF0IGlzIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnksICovCi0JUkZBTFNFKCBDT01QX1NIT1JUX0tFWVMgKCYoaWgtPmloX2tleSksICZwb3Nfa2V5KSwKLQkJInZzLTkwMDA6IGZvdW5kIGl0ZW0gJWggZG9lcyBub3QgbWF0Y2ggdG8gZGlyIHdlIHJlYWRkaXIgJUsiLAotCQlpaCwgJnBvc19rZXkpOwotCVJGQUxTRSggaXRlbV9udW0gPiBCX05SX0lURU1TIChiaCkgLSAxLAotCQkidnMtOTAwNSBpdGVtX251bSA9PSAlZCwgaXRlbSBhbW91bnQgPT0gJWQiLCAKLQkJaXRlbV9udW0sIEJfTlJfSVRFTVMgKGJoKSk7Ci0gICAgICAKLQkvKiBhbmQgZW50cnkgbXVzdCBiZSBub3QgbW9yZSB0aGFuIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBpdGVtICovCi0JUkZBTFNFKCBJX0VOVFJZX0NPVU5UIChpaCkgPCBlbnRyeV9udW0sCi0JCSJ2cy05MDEwOiBlbnRyeSBudW1iZXIgaXMgdG9vIGJpZyAlZCAoJWQpIiwgCi0JCWVudHJ5X251bSwgSV9FTlRSWV9DT1VOVCAoaWgpKTsKLQotCWlmIChzZWFyY2hfcmVzID09IFBPU0lUSU9OX0ZPVU5EIHx8IGVudHJ5X251bSA8IElfRU5UUllfQ09VTlQgKGloKSkgewotCSAgICAvKiBnbyB0aHJvdWdoIGFsbCBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgaXRlbSBiZWdpbm5pbmcgZnJvbSB0aGUgZW50cnksIHRoYXQgaGFzIGJlZW4gZm91bmQgKi8KLQkgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWggPSBCX0lfREVIIChiaCwgaWgpICsgZW50cnlfbnVtOwotCi0JICAgIGZvciAoOyBlbnRyeV9udW0gPCBJX0VOVFJZX0NPVU5UIChpaCk7IGVudHJ5X251bSArKywgZGVoICsrKSB7Ci0JCWludCBkX3JlY2xlbjsKLQkJY2hhciAqIGRfbmFtZTsKLQkJb2ZmX3QgZF9vZmY7Ci0JCWlub190IGRfaW5vOwotCi0JCWlmICghZGVfdmlzaWJsZSAoZGVoKSkKLQkJICAgIC8qIGl0IGlzIGhpZGRlbiBlbnRyeSAqLwotCQkgICAgY29udGludWU7Ci0JCWRfcmVjbGVuID0gZW50cnlfbGVuZ3RoIChiaCwgaWgsIGVudHJ5X251bSk7Ci0JCWRfbmFtZSA9IEJfSV9ERUhfRU5UUllfRklMRV9OQU1FIChiaCwgaWgsIGRlaCk7Ci0JCWlmICghZF9uYW1lW2RfcmVjbGVuIC0gMV0pCi0JCSAgICBkX3JlY2xlbiA9IHN0cmxlbiAoZF9uYW1lKTsKLQkKLQkJaWYgKGRfcmVjbGVuID4gUkVJU0VSRlNfTUFYX05BTUUoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSl7Ci0JCSAgICAvKiB0b28gYmlnIHRvIHNlbmQgYmFjayB0byBWRlMgKi8KLQkJICAgIGNvbnRpbnVlIDsKLQkJfQotCi0gICAgICAgICAgICAgICAgLyogSWdub3JlIHRoZSAucmVpc2VyZnNfcHJpdiBlbnRyeSAqLwotICAgICAgICAgICAgICAgIGlmIChyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAgICAgICAgICAgICAhb2xkX2Zvcm1hdF9vbmx5KGlub2RlLT5pX3NiKSAmJgotICAgICAgICAgICAgICAgICAgICBmaWxwLT5mX2RlbnRyeSA9PSBpbm9kZS0+aV9zYi0+c19yb290ICYmCi0gICAgICAgICAgICAgICAgICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290ICYmCi0gICAgICAgICAgICAgICAgICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlICYmCi0gICAgICAgICAgICAgICAgICAgIGRlaF9vYmplY3RpZChkZWgpID09IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZKFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+a19vYmplY3RpZCkpIHsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotCQlkX29mZiA9IGRlaF9vZmZzZXQgKGRlaCk7Ci0JCWZpbHAtPmZfcG9zID0gZF9vZmYgOwotCQlkX2lubyA9IGRlaF9vYmplY3RpZCAoZGVoKTsKLQkJaWYgKGRfcmVjbGVuIDw9IDMyKSB7Ci0JCSAgbG9jYWxfYnVmID0gc21hbGxfYnVmIDsKLQkJfSBlbHNlIHsKLQkJICAgIGxvY2FsX2J1ZiA9IHJlaXNlcmZzX2ttYWxsb2MoZF9yZWNsZW4sIEdGUF9OT0ZTLCBpbm9kZS0+aV9zYikgOwotCQkgICAgaWYgKCFsb2NhbF9idWYpIHsKLQkJCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotCQkJcmV0ID0gLUVOT01FTSA7CisJcGF0aF90b19lbnRyeS5yZWFkYSA9IFBBVEhfUkVBREE7CisJd2hpbGUgKDEpIHsKKwkgICAgICByZXNlYXJjaDoKKwkJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgaXRlbSwgY29udGFpbmluZyBlbnRyeSB3aXRoIHNwZWNpZmllZCBrZXkgKi8KKwkJc2VhcmNoX3JlcyA9CisJCSAgICBzZWFyY2hfYnlfZW50cnlfa2V5KGlub2RlLT5pX3NiLCAmcG9zX2tleSwgJnBhdGhfdG9fZW50cnksCisJCQkJCSZkZSk7CisJCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7CisJCQkvLyBGSVhNRTogd2UgY291bGQganVzdCBza2lwIHBhcnQgb2YgZGlyZWN0b3J5IHdoaWNoIGNvdWxkCisJCQkvLyBub3QgYmUgcmVhZAorCQkJcmV0ID0gLUVJTzsKIAkJCWdvdG8gb3V0OwotCQkgICAgfQotCQkgICAgaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgewotCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQkJCWdvdG8gcmVzZWFyY2g7Ci0JCSAgICB9CiAJCX0KLQkJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5Ci0JCS8vIGJ1ZmZlciAobG9jYWxfYnVmKSBiZWNhdXNlIGZpbGxkaXIgd2lsbCBibG9jayBpZgotCQkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCi0JCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCi0JCW1lbWNweSAobG9jYWxfYnVmLCBkX25hbWUsIGRfcmVjbGVuKTsKLQkJaWYgKGZpbGxkaXIgKGRpcmVudCwgbG9jYWxfYnVmLCBkX3JlY2xlbiwgZF9vZmYsIGRfaW5vLCAKLQkJICAgICAgICAgICAgIERUX1VOS05PV04pIDwgMCkgewotCQkgICAgaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGlub2RlLT5pX3NiKSA7Ci0JCSAgICB9Ci0JCSAgICBnb3RvIGVuZDsKLQkJfQotCQlpZiAobG9jYWxfYnVmICE9IHNtYWxsX2J1ZikgewotCQkgICAgcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKwkJZW50cnlfbnVtID0gZGUuZGVfZW50cnlfbnVtOworCQliaCA9IGRlLmRlX2JoOworCQlpdGVtX251bSA9IGRlLmRlX2l0ZW1fbnVtOworCQlpaCA9IGRlLmRlX2loOworCQlzdG9yZV9paCgmdG1wX2loLCBpaCk7CisKKwkJLyogd2UgbXVzdCBoYXZlIGZvdW5kIGl0ZW0sIHRoYXQgaXMgaXRlbSBvZiB0aGlzIGRpcmVjdG9yeSwgKi8KKwkJUkZBTFNFKENPTVBfU0hPUlRfS0VZUygmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCisJCSAgICAgICAidnMtOTAwMDogZm91bmQgaXRlbSAlaCBkb2VzIG5vdCBtYXRjaCB0byBkaXIgd2UgcmVhZGRpciAlSyIsCisJCSAgICAgICBpaCwgJnBvc19rZXkpOworCQlSRkFMU0UoaXRlbV9udW0gPiBCX05SX0lURU1TKGJoKSAtIDEsCisJCSAgICAgICAidnMtOTAwNSBpdGVtX251bSA9PSAlZCwgaXRlbSBhbW91bnQgPT0gJWQiLAorCQkgICAgICAgaXRlbV9udW0sIEJfTlJfSVRFTVMoYmgpKTsKKworCQkvKiBhbmQgZW50cnkgbXVzdCBiZSBub3QgbW9yZSB0aGFuIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBpdGVtICovCisJCVJGQUxTRShJX0VOVFJZX0NPVU5UKGloKSA8IGVudHJ5X251bSwKKwkJICAgICAgICJ2cy05MDEwOiBlbnRyeSBudW1iZXIgaXMgdG9vIGJpZyAlZCAoJWQpIiwKKwkJICAgICAgIGVudHJ5X251bSwgSV9FTlRSWV9DT1VOVChpaCkpOworCisJCWlmIChzZWFyY2hfcmVzID09IFBPU0lUSU9OX0ZPVU5ECisJCSAgICB8fCBlbnRyeV9udW0gPCBJX0VOVFJZX0NPVU5UKGloKSkgeworCQkJLyogZ28gdGhyb3VnaCBhbGwgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5IGl0ZW0gYmVnaW5uaW5nIGZyb20gdGhlIGVudHJ5LCB0aGF0IGhhcyBiZWVuIGZvdW5kICovCisJCQlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoID0KKwkJCSAgICBCX0lfREVIKGJoLCBpaCkgKyBlbnRyeV9udW07CisKKwkJCWZvciAoOyBlbnRyeV9udW0gPCBJX0VOVFJZX0NPVU5UKGloKTsKKwkJCSAgICAgZW50cnlfbnVtKyssIGRlaCsrKSB7CisJCQkJaW50IGRfcmVjbGVuOworCQkJCWNoYXIgKmRfbmFtZTsKKwkJCQlvZmZfdCBkX29mZjsKKwkJCQlpbm9fdCBkX2lubzsKKworCQkJCWlmICghZGVfdmlzaWJsZShkZWgpKQorCQkJCQkvKiBpdCBpcyBoaWRkZW4gZW50cnkgKi8KKwkJCQkJY29udGludWU7CisJCQkJZF9yZWNsZW4gPSBlbnRyeV9sZW5ndGgoYmgsIGloLCBlbnRyeV9udW0pOworCQkJCWRfbmFtZSA9IEJfSV9ERUhfRU5UUllfRklMRV9OQU1FKGJoLCBpaCwgZGVoKTsKKwkJCQlpZiAoIWRfbmFtZVtkX3JlY2xlbiAtIDFdKQorCQkJCQlkX3JlY2xlbiA9IHN0cmxlbihkX25hbWUpOworCisJCQkJaWYgKGRfcmVjbGVuID4KKwkJCQkgICAgUkVJU0VSRlNfTUFYX05BTUUoaW5vZGUtPmlfc2ItPgorCQkJCQkJICAgICAgc19ibG9ja3NpemUpKSB7CisJCQkJCS8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCisJCQkJaWYgKHJlaXNlcmZzX3hhdHRycyhpbm9kZS0+aV9zYikgJiYKKwkJCQkgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKKwkJCQkgICAgZmlscC0+Zl9kZW50cnkgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdCAmJgorCQkJCSAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdCAmJgorCQkJCSAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZQorCQkJCSAgICAmJiBkZWhfb2JqZWN0aWQoZGVoKSA9PQorCQkJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJCQkoUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT4KKwkJCQkJCSBwcml2X3Jvb3QtPmRfaW5vZGUpLT4KKwkJCQkJCWtfb2JqZWN0aWQpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWRfb2ZmID0gZGVoX29mZnNldChkZWgpOworCQkJCWZpbHAtPmZfcG9zID0gZF9vZmY7CisJCQkJZF9pbm8gPSBkZWhfb2JqZWN0aWQoZGVoKTsKKwkJCQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKKwkJCQkJbG9jYWxfYnVmID0gc21hbGxfYnVmOworCQkJCX0gZWxzZSB7CisJCQkJCWxvY2FsX2J1ZiA9CisJCQkJCSAgICByZWlzZXJmc19rbWFsbG9jKGRfcmVjbGVuLCBHRlBfTk9GUywKKwkJCQkJCQkgICAgIGlub2RlLT5pX3NiKTsKKwkJCQkJaWYgKCFsb2NhbF9idWYpIHsKKwkJCQkJCXBhdGhyZWxzZSgmcGF0aF90b19lbnRyeSk7CisJCQkJCQlyZXQgPSAtRU5PTUVNOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQkJaWYgKGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGhfdG9fZW50cnkpKSB7CisJCQkJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsCisJCQkJCQkJICAgICAgIGRfcmVjbGVuLAorCQkJCQkJCSAgICAgICBpbm9kZS0+aV9zYik7CisJCQkJCQlnb3RvIHJlc2VhcmNoOworCQkJCQl9CisJCQkJfQorCQkJCS8vIE5vdGUsIHRoYXQgd2UgY29weSBuYW1lIHRvIHVzZXIgc3BhY2UgdmlhIHRlbXBvcmFyeQorCQkJCS8vIGJ1ZmZlciAobG9jYWxfYnVmKSBiZWNhdXNlIGZpbGxkaXIgd2lsbCBibG9jayBpZgorCQkJCS8vIHVzZXIgc3BhY2UgYnVmZmVyIGlzIHN3YXBwZWQgb3V0LiBBdCB0aGF0IHRpbWUKKwkJCQkvLyBlbnRyeSBjYW4gbW92ZSB0byBzb21ld2hlcmUgZWxzZQorCQkJCW1lbWNweShsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCQkJCWlmIChmaWxsZGlyCisJCQkJICAgIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKKwkJCQkgICAgIERUX1VOS05PV04pIDwgMCkgeworCQkJCQlpZiAobG9jYWxfYnVmICE9IHNtYWxsX2J1ZikgeworCQkJCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLAorCQkJCQkJCSAgICAgICBkX3JlY2xlbiwKKwkJCQkJCQkgICAgICAgaW5vZGUtPmlfc2IpOworCQkJCQl9CisJCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCQlpZiAobG9jYWxfYnVmICE9IHNtYWxsX2J1ZikgeworCQkJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLAorCQkJCQkJICAgICAgIGlub2RlLT5pX3NiKTsKKwkJCQl9CisJCQkJLy8gbmV4dCBlbnRyeSBzaG91bGQgYmUgbG9va2VkIGZvciB3aXRoIHN1Y2ggb2Zmc2V0CisJCQkJbmV4dF9wb3MgPSBkZWhfb2Zmc2V0KGRlaCkgKyAxOworCisJCQkJaWYgKGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGhfdG9fZW50cnkpKSB7CisJCQkJCWdvdG8gcmVzZWFyY2g7CisJCQkJfQorCQkJfQkvKiBmb3IgKi8KIAkJfQogCi0JCS8vIG5leHQgZW50cnkgc2hvdWxkIGJlIGxvb2tlZCBmb3Igd2l0aCBzdWNoIG9mZnNldAotCQluZXh0X3BvcyA9IGRlaF9vZmZzZXQgKGRlaCkgKyAxOworCQlpZiAoaXRlbV9udW0gIT0gQl9OUl9JVEVNUyhiaCkgLSAxKQorCQkJLy8gZW5kIG9mIGRpcmVjdG9yeSBoYXMgYmVlbiByZWFjaGVkCisJCQlnb3RvIGVuZDsKIAotCQlpZiAoaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGhfdG9fZW50cnkpKSB7Ci0JCSAgICBnb3RvIHJlc2VhcmNoOworCQkvKiBpdGVtIHdlIHdlbnQgdGhyb3VnaCBpcyBsYXN0IGl0ZW0gb2Ygbm9kZS4gVXNpbmcgcmlnaHQKKwkJICAgZGVsaW1pdGluZyBrZXkgY2hlY2sgaXMgaXQgZGlyZWN0b3J5IGVuZCAqLworCQlya2V5ID0gZ2V0X3JrZXkoJnBhdGhfdG9fZW50cnksIGlub2RlLT5pX3NiKTsKKwkJaWYgKCFjb21wX2xlX2tleXMocmtleSwgJk1JTl9LRVkpKSB7CisJCQkvKiBzZXQgcG9zX2tleSB0byBrZXksIHRoYXQgaXMgdGhlIHNtYWxsZXN0IGFuZCBncmVhdGVyCisJCQkgICB0aGF0IGtleSBvZiB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgaXRlbSAqLworCQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJnBvc19rZXksIG5leHRfcG9zKTsKKwkJCWNvbnRpbnVlOwogCQl9Ci0JICAgIH0gLyogZm9yICovCi0JfQogCi0JaWYgKGl0ZW1fbnVtICE9IEJfTlJfSVRFTVMgKGJoKSAtIDEpCi0JICAgIC8vIGVuZCBvZiBkaXJlY3RvcnkgaGFzIGJlZW4gcmVhY2hlZAotCSAgICBnb3RvIGVuZDsKKwkJaWYgKENPTVBfU0hPUlRfS0VZUyhya2V5LCAmcG9zX2tleSkpIHsKKwkJCS8vIGVuZCBvZiBkaXJlY3RvcnkgaGFzIGJlZW4gcmVhY2hlZAorCQkJZ290byBlbmQ7CisJCX0KIAotCS8qIGl0ZW0gd2Ugd2VudCB0aHJvdWdoIGlzIGxhc3QgaXRlbSBvZiBub2RlLiBVc2luZyByaWdodAotCSAgIGRlbGltaXRpbmcga2V5IGNoZWNrIGlzIGl0IGRpcmVjdG9yeSBlbmQgKi8KLQlya2V5ID0gZ2V0X3JrZXkgKCZwYXRoX3RvX2VudHJ5LCBpbm9kZS0+aV9zYik7Ci0JaWYgKCEgY29tcF9sZV9rZXlzIChya2V5LCAmTUlOX0tFWSkpIHsKLQkgICAgLyogc2V0IHBvc19rZXkgdG8ga2V5LCB0aGF0IGlzIHRoZSBzbWFsbGVzdCBhbmQgZ3JlYXRlcgotCSAgICAgICB0aGF0IGtleSBvZiB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgaXRlbSAqLwotCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnBvc19rZXksIG5leHRfcG9zKTsKLQkgICAgY29udGludWU7Ci0JfQorCQkvKiBkaXJlY3RvcnkgY29udGludWVzIGluIHRoZSByaWdodCBuZWlnaGJvcmluZyBibG9jayAqLworCQlzZXRfY3B1X2tleV9rX29mZnNldCgmcG9zX2tleSwKKwkJCQkgICAgIGxlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgcmtleSkpOwogCi0JaWYgKCBDT01QX1NIT1JUX0tFWVMgKHJrZXksICZwb3Nfa2V5KSkgewotCSAgICAvLyBlbmQgb2YgZGlyZWN0b3J5IGhhcyBiZWVuIHJlYWNoZWQKLQkgICAgZ290byBlbmQ7Ci0JfQotCQotCS8qIGRpcmVjdG9yeSBjb250aW51ZXMgaW4gdGhlIHJpZ2h0IG5laWdoYm9yaW5nIGJsb2NrICovCi0Jc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZwb3Nfa2V5LCBsZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCBya2V5KSk7CisJfQkJCS8qIHdoaWxlICovCiAKLSAgICB9IC8qIHdoaWxlICovCi0KLQotIGVuZDoKLSAgICBmaWxwLT5mX3BvcyA9IG5leHRfcG9zOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fZW50cnkpIDsKLSBvdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0OworICAgICAgZW5kOgorCWZpbHAtPmZfcG9zID0gbmV4dF9wb3M7CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2VudHJ5KTsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIC8qIGNvbXBvc2UgZGlyZWN0b3J5IGl0ZW0gY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcyAoZW50cmllcyBhcmUKICAgIG5vdCBhbGlnbmVkIHRvIDQgYnl0ZSBib3VuZGFyeSkgKi8KIC8qIHRoZSBsYXN0IGZvdXIgcGFyYW1zIGFyZSBMRSAqLwotdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChjaGFyICogYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCi0JCQkgICAgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpCit2b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW1fdjEoY2hhciAqYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCisJCQkgICAgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwogCi0gICAgbWVtc2V0IChib2R5LCAwLCBFTVBUWV9ESVJfU0laRV9WMSk7Ci0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keTsKLSAgICAKLSAgICAvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4iICovCi0gICAgcHV0X2RlaF9vZmZzZXQoICYoZGVoWzBdKSwgRE9UX09GRlNFVCApOwotICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSBtYWtlX2xlX2l0ZW1faGVhZCwgYW5kIGFyZSBhcmUgTEUgKi8KLSAgICBkZWhbMF0uZGVoX2Rpcl9pZCA9IGRpcmlkOwotICAgIGRlaFswXS5kZWhfb2JqZWN0aWQgPSBvYmppZDsKLSAgICBkZWhbMF0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzBdKSwgRU1QVFlfRElSX1NJWkVfVjEgLSBzdHJsZW4oICIuIiApKTsKLSAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMF0pKTsKLSAgCi0gICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuLiIgKi8KLSAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMV0pLCBET1RfRE9UX09GRlNFVCk7Ci0gICAgLyoga2V5IG9mICIuLiIgZm9yIHRoZSByb290IGRpcmVjdG9yeSAqLwotICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSB0aGUgaW5vZGUsIGFuZCBhcmUgYXJlIExFICovCi0gICAgZGVoWzFdLmRlaF9kaXJfaWQgPSBwYXJfZGlyaWQ7Ci0gICAgZGVoWzFdLmRlaF9vYmplY3RpZCA9IHBhcl9vYmppZDsKLSAgICBkZWhbMV0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzFdKSwgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkgKSAtIHN0cmxlbiggIi4uIiApICk7Ci0gICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzFdKSk7CisJbWVtc2V0KGJvZHksIDAsIEVNUFRZX0RJUl9TSVpFX1YxKTsKKwlkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5OwogCi0gICAgLyogY29weSAiLi4iIGFuZCAiLiIgKi8KLSAgICBtZW1jcHkgKGJvZHkgKyBkZWhfbG9jYXRpb24oICYoZGVoWzBdKSApLCAiLiIsIDEpOwotICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMV0pICksICIuLiIsIDIpOworCS8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLiIgKi8KKwlwdXRfZGVoX29mZnNldCgmKGRlaFswXSksIERPVF9PRkZTRVQpOworCS8qIHRoZXNlIHR3byBhcmUgZnJvbSBtYWtlX2xlX2l0ZW1faGVhZCwgYW5kIGFyZSBhcmUgTEUgKi8KKwlkZWhbMF0uZGVoX2Rpcl9pZCA9IGRpcmlkOworCWRlaFswXS5kZWhfb2JqZWN0aWQgPSBvYmppZDsKKwlkZWhbMF0uZGVoX3N0YXRlID0gMDsJLyogRW5kaWFuIHNhZmUgaWYgMCAqLworCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbMF0pLCBFTVBUWV9ESVJfU0laRV9WMSAtIHN0cmxlbigiLiIpKTsKKwltYXJrX2RlX3Zpc2libGUoJihkZWhbMF0pKTsKKworCS8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLi4iICovCisJcHV0X2RlaF9vZmZzZXQoJihkZWhbMV0pLCBET1RfRE9UX09GRlNFVCk7CisJLyoga2V5IG9mICIuLiIgZm9yIHRoZSByb290IGRpcmVjdG9yeSAqLworCS8qIHRoZXNlIHR3byBhcmUgZnJvbSB0aGUgaW5vZGUsIGFuZCBhcmUgYXJlIExFICovCisJZGVoWzFdLmRlaF9kaXJfaWQgPSBwYXJfZGlyaWQ7CisJZGVoWzFdLmRlaF9vYmplY3RpZCA9IHBhcl9vYmppZDsKKwlkZWhbMV0uZGVoX3N0YXRlID0gMDsJLyogRW5kaWFuIHNhZmUgaWYgMCAqLworCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbMV0pLCBkZWhfbG9jYXRpb24oJihkZWhbMF0pKSAtIHN0cmxlbigiLi4iKSk7CisJbWFya19kZV92aXNpYmxlKCYoZGVoWzFdKSk7CisKKwkvKiBjb3B5ICIuLiIgYW5kICIuIiAqLworCW1lbWNweShib2R5ICsgZGVoX2xvY2F0aW9uKCYoZGVoWzBdKSksICIuIiwgMSk7CisJbWVtY3B5KGJvZHkgKyBkZWhfbG9jYXRpb24oJihkZWhbMV0pKSwgIi4uIiwgMik7CiB9CiAKIC8qIGNvbXBvc2UgZGlyZWN0b3J5IGl0ZW0gY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcyAqLwotdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtIChjaGFyICogYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCi0JCQkgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpCit2b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW0oY2hhciAqYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCisJCQkgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwogCi0gICAgbWVtc2V0IChib2R5LCAwLCBFTVBUWV9ESVJfU0laRSk7Ci0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keTsKLSAgICAKLSAgICAvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4iICovCi0gICAgcHV0X2RlaF9vZmZzZXQoICYoZGVoWzBdKSwgRE9UX09GRlNFVCApOwotICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSBtYWtlX2xlX2l0ZW1faGVhZCwgYW5kIGFyZSBhcmUgTEUgKi8KLSAgICBkZWhbMF0uZGVoX2Rpcl9pZCA9IGRpcmlkOwotICAgIGRlaFswXS5kZWhfb2JqZWN0aWQgPSBvYmppZDsKLSAgICBkZWhbMF0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzBdKSwgRU1QVFlfRElSX1NJWkUgLSBST1VORF9VUCggc3RybGVuKCAiLiIgKSApICk7Ci0gICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzBdKSk7Ci0gIAotICAgIC8qIGRpcmVudHJ5IGhlYWRlciBvZiAiLi4iICovCi0gICAgcHV0X2RlaF9vZmZzZXQoICYoZGVoWzFdKSwgRE9UX0RPVF9PRkZTRVQgKTsKLSAgICAvKiBrZXkgb2YgIi4uIiBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5ICovCi0gICAgLyogdGhlc2UgdHdvIGFyZSBmcm9tIHRoZSBpbm9kZSwgYW5kIGFyZSBhcmUgTEUgKi8KLSAgICBkZWhbMV0uZGVoX2Rpcl9pZCA9IHBhcl9kaXJpZDsKLSAgICBkZWhbMV0uZGVoX29iamVjdGlkID0gcGFyX29iamlkOwotICAgIGRlaFsxXS5kZWhfc3RhdGUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbMV0pLCBkZWhfbG9jYXRpb24oICYoZGVoWzBdKSkgLSBST1VORF9VUCggc3RybGVuKCAiLi4iICkgKSApOwotICAgIG1hcmtfZGVfdmlzaWJsZSgmKGRlaFsxXSkpOworCW1lbXNldChib2R5LCAwLCBFTVBUWV9ESVJfU0laRSk7CisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keTsKIAotICAgIC8qIGNvcHkgIi4uIiBhbmQgIi4iICovCi0gICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkgKSwgIi4iLCAxKTsKLSAgICBtZW1jcHkgKGJvZHkgKyBkZWhfbG9jYXRpb24oICYoZGVoWzFdKSApLCAiLi4iLCAyKTsKKwkvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4iICovCisJcHV0X2RlaF9vZmZzZXQoJihkZWhbMF0pLCBET1RfT0ZGU0VUKTsKKwkvKiB0aGVzZSB0d28gYXJlIGZyb20gbWFrZV9sZV9pdGVtX2hlYWQsIGFuZCBhcmUgYXJlIExFICovCisJZGVoWzBdLmRlaF9kaXJfaWQgPSBkaXJpZDsKKwlkZWhbMF0uZGVoX29iamVjdGlkID0gb2JqaWQ7CisJZGVoWzBdLmRlaF9zdGF0ZSA9IDA7CS8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKwlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoWzBdKSwgRU1QVFlfRElSX1NJWkUgLSBST1VORF9VUChzdHJsZW4oIi4iKSkpOworCW1hcmtfZGVfdmlzaWJsZSgmKGRlaFswXSkpOworCisJLyogZGlyZW50cnkgaGVhZGVyIG9mICIuLiIgKi8KKwlwdXRfZGVoX29mZnNldCgmKGRlaFsxXSksIERPVF9ET1RfT0ZGU0VUKTsKKwkvKiBrZXkgb2YgIi4uIiBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJLyogdGhlc2UgdHdvIGFyZSBmcm9tIHRoZSBpbm9kZSwgYW5kIGFyZSBhcmUgTEUgKi8KKwlkZWhbMV0uZGVoX2Rpcl9pZCA9IHBhcl9kaXJpZDsKKwlkZWhbMV0uZGVoX29iamVjdGlkID0gcGFyX29iamlkOworCWRlaFsxXS5kZWhfc3RhdGUgPSAwOwkvKiBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9sb2NhdGlvbigmKGRlaFsxXSksCisJCQkgZGVoX2xvY2F0aW9uKCYoZGVoWzBdKSkgLSBST1VORF9VUChzdHJsZW4oIi4uIikpKTsKKwltYXJrX2RlX3Zpc2libGUoJihkZWhbMV0pKTsKKworCS8qIGNvcHkgIi4uIiBhbmQgIi4iICovCisJbWVtY3B5KGJvZHkgKyBkZWhfbG9jYXRpb24oJihkZWhbMF0pKSwgIi4iLCAxKTsKKwltZW1jcHkoYm9keSArIGRlaF9sb2NhdGlvbigmKGRlaFsxXSkpLCAiLi4iLCAyKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2RvX2JhbGFuLmMgYi9mcy9yZWlzZXJmcy9kb19iYWxhbi5jCmluZGV4IDIxMThkYjIuLmIyMjY0YmEgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2RvX2JhbGFuLmMKKysrIGIvZnMvcmVpc2VyZnMvZG9fYmFsYW4uYwpAQCAtOCw3ICs4LDYgQEAKIC8qIGJhbGFuY2UgdGhlIHRyZWUgYWNjb3JkaW5nIHRvIHRoZSBhbmFseXNpcyBtYWRlIGJlZm9yZSwJCSovCiAvKiBhbmQgdXNpbmcgYnVmZmVycyBvYnRhaW5lZCBhZnRlciBhbGwgYWJvdmUuCQkJCSovCiAKLQogLyoqCiAgKiogYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlCiAgKiogYmFsYW5jZV9sZWFmCkBAIC0yNCwyMyArMjMsMjIgQEAKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwogCi1zdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiID0gTlVMTDsgLyogZGV0ZWN0cyB3aGV0aGVyIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IG9mIHRiIGV4aXN0cyBhcyBhIG1lYW5zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgY2hlY2tpbmcgd2hldGhlciBzY2hlZHVsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGludGVycnVwdGluZyBkb19iYWxhbmNlICovCitzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGIgPSBOVUxMOwkvKiBkZXRlY3RzIHdoZXRoZXIgbW9yZSB0aGFuIG9uZQorCQkJCQkgICBjb3B5IG9mIHRiIGV4aXN0cyBhcyBhIG1lYW5zCisJCQkJCSAgIG9mIGNoZWNraW5nIHdoZXRoZXIgc2NoZWR1bGUKKwkJCQkJICAgaXMgaW50ZXJydXB0aW5nIGRvX2JhbGFuY2UgKi8KICNlbmRpZgogCi1pbmxpbmUgdm9pZCBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKLQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBmbGFnKQoraW5saW5lIHZvaWQgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBmbGFnKQogewotICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICB0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLT50X3N1cGVyLCBiaCkgOworCWpvdXJuYWxfbWFya19kaXJ0eSh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLAorCQkJICAgdGItPnRyYW5zYWN0aW9uX2hhbmRsZS0+dF9zdXBlciwgYmgpOwogfQogCiAjZGVmaW5lIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eQogI2RlZmluZSBkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkKIAotCiAvKiBzdW1tYXJ5OiAKICBpZiBkZWxldGluZyBzb21ldGhpbmcgKCB0Yi0+aW5zZXJ0X3NpemVbMF0gPCAwICkKICAgIHJldHVybihiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUoKSk7IChmbGFnIGQgaGFuZGxlZCBoZXJlKQpAQCAtNjQsOCArNjIsNiBAQAogCiAtSGFucyAqLwogCi0KLQogLyogQmFsYW5jZSBsZWFmIG5vZGUgaW4gY2FzZSBvZiBkZWxldGUgb3IgY3V0OiBpbnNlcnRfc2l6ZVswXSA8IDAKICAqCiAgKiBsbnVtLCBybnVtIGNhbiBoYXZlIHZhbHVlcyA+PSAtMQpAQCAtNzMsMTM4NCArNjksMTkzMyBAQAogICoJIDAgbWVhbnMgdGhhdCBub3RoaW5nIHNob3VsZCBiZSBkb25lIHdpdGggdGhlIG5laWdoYm9yCiAgKgk+MCBtZWFucyB0byBzaGlmdCBlbnRpcmVseSBvciBwYXJ0bHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgaXRlbXMgdG8gdGhlIG5laWdoYm9yCiAgKi8KLXN0YXRpYyBpbnQgYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBmbGFnKQorc3RhdGljIGludCBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBmbGFnKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotICAgIGludCBpdGVtX3BvcyA9IFBBVEhfTEFTVF9QT1NJVElPTiAodGItPnRiX3BhdGgpOwotICAgIGludCBwb3NfaW5faXRlbSA9IHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7Ci0gICAgaW50IG47Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHRiLT50Yl9wYXRoKTsKKwlpbnQgaXRlbV9wb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04odGItPnRiX3BhdGgpOworCWludCBwb3NfaW5faXRlbSA9IHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisJaW50IG47CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgICBSRkFMU0UoIHRiLT5GUlswXSAmJiBCX0xFVkVMICh0Yi0+RlJbMF0pICE9IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSwKLQkgICAgInZzLSAxMjAwMDogbGV2ZWw6IHdyb25nIEZSICV6IiwgdGItPkZSWzBdKTsKLSAgICBSRkFMU0UoIHRiLT5ibGtudW1bMF0gPiAxLAotCSAgICAiUEFQLTEyMDA1OiB0Yi0+YmxrbnVtID09ICVkLCBjYW4gbm90IGJlID4gMSIsIHRiLT5ibGtudW1bMF0pOwotICAgIFJGQUxTRSggISB0Yi0+YmxrbnVtWzBdICYmICEgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLAotCSAgICAiUEFQLTEyMDEwOiB0cmVlIGNhbiBub3QgYmUgZW1wdHkiKTsKKwlSRkFMU0UodGItPkZSWzBdICYmIEJfTEVWRUwodGItPkZSWzBdKSAhPSBESVNLX0xFQUZfTk9ERV9MRVZFTCArIDEsCisJICAgICAgICJ2cy0gMTIwMDA6IGxldmVsOiB3cm9uZyBGUiAleiIsIHRiLT5GUlswXSk7CisJUkZBTFNFKHRiLT5ibGtudW1bMF0gPiAxLAorCSAgICAgICAiUEFQLTEyMDA1OiB0Yi0+YmxrbnVtID09ICVkLCBjYW4gbm90IGJlID4gMSIsIHRiLT5ibGtudW1bMF0pOworCVJGQUxTRSghdGItPmJsa251bVswXSAmJiAhUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLAorCSAgICAgICAiUEFQLTEyMDEwOiB0cmVlIGNhbiBub3QgYmUgZW1wdHkiKTsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKTsKKwlpaCA9IEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKTsKIAotICAgIC8qIERlbGV0ZSBvciB0cnVuY2F0ZSB0aGUgaXRlbSAqLworCS8qIERlbGV0ZSBvciB0cnVuY2F0ZSB0aGUgaXRlbSAqLwogCi0gICAgc3dpdGNoIChmbGFnKSB7Ci0gICAgY2FzZSBNX0RFTEVURTogICAvKiBkZWxldGUgaXRlbSBpbiBTWzBdICovCisJc3dpdGNoIChmbGFnKSB7CisJY2FzZSBNX0RFTEVURToJCS8qIGRlbGV0ZSBpdGVtIGluIFNbMF0gKi8KIAotCVJGQUxTRSggaWhfaXRlbV9sZW4oaWgpICsgSUhfU0laRSAhPSAtdGItPmluc2VydF9zaXplWzBdLAotCSAgICAgICAgInZzLTEyMDEzOiBtb2RlIERlbGV0ZSwgaW5zZXJ0IHNpemUgJWQsIGloIHRvIGJlIGRlbGV0ZWQgJWgiLAotIAkJIC10Yi0+aW5zZXJ0X3NpemUgWzBdLCBpaCk7CisJCVJGQUxTRShpaF9pdGVtX2xlbihpaCkgKyBJSF9TSVpFICE9IC10Yi0+aW5zZXJ0X3NpemVbMF0sCisJCSAgICAgICAidnMtMTIwMTM6IG1vZGUgRGVsZXRlLCBpbnNlcnQgc2l6ZSAlZCwgaWggdG8gYmUgZGVsZXRlZCAlaCIsCisJCSAgICAgICAtdGItPmluc2VydF9zaXplWzBdLCBpaCk7CiAKLQliaS50YiA9IHRiOwotCWJpLmJpX2JoID0gdGJTMDsKLQliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7Ci0JbGVhZl9kZWxldGVfaXRlbXMgKCZiaSwgMCwgaXRlbV9wb3MsIDEsIC0xKTsKKwkJYmkudGIgPSB0YjsKKwkJYmkuYmlfYmggPSB0YlMwOworCQliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCk7CisJCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKTsKKwkJbGVhZl9kZWxldGVfaXRlbXMoJmJpLCAwLCBpdGVtX3BvcywgMSwgLTEpOwogCi0JaWYgKCAhIGl0ZW1fcG9zICYmIHRiLT5DRkxbMF0gKSB7Ci0JICAgIGlmICggQl9OUl9JVEVNUyh0YlMwKSApIHsKLQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sdGItPmxrZXlbMF0sdGJTMCwwKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJaWYgKCAhIFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpICkKLQkJICAgIHJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwwKTsKLQkgICAgfQotCX0gCi0KLQlSRkFMU0UoICEgaXRlbV9wb3MgJiYgIXRiLT5DRkxbMF0sCi0JCSJQQVAtMTIwMjA6IHRiLT5DRkxbMF09PSVwLCB0Yi0+TFswXT09JXAiLCB0Yi0+Q0ZMWzBdLCB0Yi0+TFswXSk7Ci0gICAgCi0JYnJlYWs7Ci0KLSAgICBjYXNlIE1fQ1VUOiB7ICAvKiBjdXQgaXRlbSBpbiBTWzBdICovCi0JYmkudGIgPSB0YjsKLQliaS5iaV9iaCA9IHRiUzA7Ci0JYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOwotCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7Ci0KLQkgICAgLyogVUZTIHVubGluayBzZW1hbnRpY3MgYXJlIHN1Y2ggdGhhdCB5b3UgY2FuIG9ubHkgZGVsZXRlIG9uZSBkaXJlY3RvcnkgZW50cnkgYXQgYSB0aW1lLiAqLwotCSAgICAvKiB3aGVuIHdlIGN1dCBhIGRpcmVjdG9yeSB0Yi0+aW5zZXJ0X3NpemVbMF0gbWVhbnMgbnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgY3V0IChhbHdheXMgMSkgKi8KLQkgICAgdGItPmluc2VydF9zaXplWzBdID0gLTE7Ci0JICAgIGxlYWZfY3V0X2Zyb21fYnVmZmVyICgmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgLXRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0KLQkgICAgUkZBTFNFKCAhIGl0ZW1fcG9zICYmICEgcG9zX2luX2l0ZW0gJiYgISB0Yi0+Q0ZMWzBdLAotCQkgICAgIlBBUC0xMjAzMDogY2FuIG5vdCBjaGFuZ2UgZGVsaW1pdGluZyBrZXkuIENGTFswXT0lcCIsIAotCQkgICAgdGItPkNGTFswXSk7Ci0KLQkgICAgaWYgKCAhIGl0ZW1fcG9zICYmICEgcG9zX2luX2l0ZW0gJiYgdGItPkNGTFswXSApIHsKLQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sdGItPmxrZXlbMF0sdGJTMCwwKTsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIGxlYWZfY3V0X2Zyb21fYnVmZmVyICgmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgLXRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0KLQkgICAgUkZBTFNFKCAhIGloX2l0ZW1fbGVuKGloKSwKLQkJIlBBUC0xMjAzNTogY3V0IG11c3QgbGVhdmUgbm9uLXplcm8gZHluYW1pYyBsZW5ndGggb2YgaXRlbSIpOwotCX0KLQlicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotCXByaW50X2N1cl90YiAoIjEyMDQwIik7Ci0JcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjA0MDogYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlOiB1bmV4cGVjdGFibGUgbW9kZTogJXMoJWQpIiwKLQkJCShmbGFnID09IE1fUEFTVEUpID8gIlBBU1RFIiA6ICgoZmxhZyA9PSBNX0lOU0VSVCkgPyAiSU5TRVJUIiA6ICJVTktOT1dOIiksIGZsYWcpOwotICAgIH0KLQotICAgIC8qIHRoZSBydWxlIGlzIHRoYXQgbm8gc2hpZnRpbmcgb2NjdXJzIHVubGVzcyBieSBzaGlmdGluZyBhIG5vZGUgY2FuIGJlIGZyZWVkICovCi0gICAgbiA9IEJfTlJfSVRFTVModGJTMCk7Ci0gICAgaWYgKCB0Yi0+bG51bVswXSApICAgICAvKiBMWzBdIHRha2VzIHBhcnQgaW4gYmFsYW5jaW5nICovCi0gICAgewotCWlmICggdGItPmxudW1bMF0gPT0gLTEgKSAgICAvKiBMWzBdIG11c3QgYmUgam9pbmVkIHdpdGggU1swXSAqLwotCXsKLQkgICAgaWYgKCB0Yi0+cm51bVswXSA9PSAtMSApICAgIC8qIFJbMF0gbXVzdCBiZSBhbHNvIGpvaW5lZCB3aXRoIFNbMF0gKi8KLQkgICAgewkJCQotCQlpZiAoIHRiLT5GUlswXSA9PSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCkgKQotCQl7Ci0JCSAgICAvKiBhbGwgY29udGVudHMgb2YgYWxsIHRoZSAzIGJ1ZmZlcnMgd2lsbCBiZSBpbiBMWzBdICovCi0JCSAgICBpZiAoIFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpID09IDAgJiYgMSA8IEJfTlJfSVRFTVModGItPkZSWzBdKSApCi0JCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSx0Yi0+RlJbMF0sMSk7Ci0KLQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fTCwgdGIsIG4sIC0xLCBOVUxMKTsKLQkJICAgIGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1JfVE9fTCwgdGIsIEJfTlJfSVRFTVModGItPlJbMF0pLCAtMSwgTlVMTCk7Ci0KLQkJICAgIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7Ci0JCSAgICByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiLT5SWzBdKTsKLQotCQkgICAgcmV0dXJuIDA7CisJCWlmICghaXRlbV9wb3MgJiYgdGItPkNGTFswXSkgeworCQkJaWYgKEJfTlJfSVRFTVModGJTMCkpIHsKKwkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIHRiUzAsCisJCQkJCSAgICAwKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpKQorCQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sCisJCQkJCQkgICAgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsCisJCQkJCQkJCSAgIDApLCAwKTsKKwkJCX0KIAkJfQotCQkvKiBhbGwgY29udGVudHMgb2YgYWxsIHRoZSAzIGJ1ZmZlcnMgd2lsbCBiZSBpbiBSWzBdICovCi0JCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fUiwgdGIsIG4sIC0xLCBOVUxMKTsKLQkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fTF9UT19SLCB0YiwgQl9OUl9JVEVNUyh0Yi0+TFswXSksIC0xLCBOVUxMKTsKIAotCQkvKiByaWdodF9kZWxpbWl0aW5nX2tleSBpcyBjb3JyZWN0IGluIFJbMF0gKi8KLQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisJCVJGQUxTRSghaXRlbV9wb3MgJiYgIXRiLT5DRkxbMF0sCisJCSAgICAgICAiUEFQLTEyMDIwOiB0Yi0+Q0ZMWzBdPT0lcCwgdGItPkxbMF09PSVwIiwgdGItPkNGTFswXSwKKwkJICAgICAgIHRiLT5MWzBdKTsKIAotCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOwotCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiLT5MWzBdKTsKKwkJYnJlYWs7CiAKLQkJcmV0dXJuIC0xOwotCSAgICB9CisJY2FzZSBNX0NVVDp7CQkvKiBjdXQgaXRlbSBpbiBTWzBdICovCisJCQliaS50YiA9IHRiOworCQkJYmkuYmlfYmggPSB0YlMwOworCQkJYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOworCQkJYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpOworCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkgewogCi0JICAgIFJGQUxTRSggdGItPnJudW1bMF0gIT0gMCwgCi0JCSAgICAiUEFQLTEyMDQ1OiBybnVtIG11c3QgYmUgMCAoJWQpIiwgdGItPnJudW1bMF0pOwotCSAgICAvKiBhbGwgY29udGVudHMgb2YgTFswXSBhbmQgU1swXSB3aWxsIGJlIGluIExbMF0gKi8KLQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLCBuLCAtMSk7CisJCQkJLyogVUZTIHVubGluayBzZW1hbnRpY3MgYXJlIHN1Y2ggdGhhdCB5b3UgY2FuIG9ubHkgZGVsZXRlIG9uZSBkaXJlY3RvcnkgZW50cnkgYXQgYSB0aW1lLiAqLworCQkJCS8qIHdoZW4gd2UgY3V0IGEgZGlyZWN0b3J5IHRiLT5pbnNlcnRfc2l6ZVswXSBtZWFucyBudW1iZXIgb2YgZW50cmllcyB0byBiZSBjdXQgKGFsd2F5cyAxKSAqLworCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IC0xOworCQkJCWxlYWZfY3V0X2Zyb21fYnVmZmVyKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLAorCQkJCQkJICAgICAtdGItPmluc2VydF9zaXplWzBdKTsKIAotCSAgICByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOworCQkJCVJGQUxTRSghaXRlbV9wb3MgJiYgIXBvc19pbl9pdGVtICYmICF0Yi0+Q0ZMWzBdLAorCQkJCSAgICAgICAiUEFQLTEyMDMwOiBjYW4gbm90IGNoYW5nZSBkZWxpbWl0aW5nIGtleS4gQ0ZMWzBdPSVwIiwKKwkJCQkgICAgICAgdGItPkNGTFswXSk7CiAKLQkgICAgcmV0dXJuIDA7CisJCQkJaWYgKCFpdGVtX3BvcyAmJiAhcG9zX2luX2l0ZW0gJiYgdGItPkNGTFswXSkgeworCQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sCisJCQkJCQkgICAgdGJTMCwgMCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlsZWFmX2N1dF9mcm9tX2J1ZmZlcigmYmksIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwKKwkJCQkJCSAgICAgLXRiLT5pbnNlcnRfc2l6ZVswXSk7CisKKwkJCQlSRkFMU0UoIWloX2l0ZW1fbGVuKGloKSwKKwkJCQkgICAgICAgIlBBUC0xMjAzNTogY3V0IG11c3QgbGVhdmUgbm9uLXplcm8gZHluYW1pYyBsZW5ndGggb2YgaXRlbSIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCWRlZmF1bHQ6CisJCXByaW50X2N1cl90YigiMTIwNDAiKTsKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtMTIwNDA6IGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZTogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCisJCQkgICAgICAgKGZsYWcgPT0KKwkJCQlNX1BBU1RFKSA/ICJQQVNURSIgOiAoKGZsYWcgPT0KKwkJCQkJCSAgICAgICBNX0lOU0VSVCkgPyAiSU5TRVJUIiA6CisJCQkJCQkgICAgICAiVU5LTk9XTiIpLCBmbGFnKTsKIAl9Ci0JLyogYSBwYXJ0IG9mIGNvbnRlbnRzIG9mIFNbMF0gd2lsbCBiZSBpbiBMWzBdIGFuZCB0aGUgcmVzdCBwYXJ0IG9mIFNbMF0gd2lsbCBiZSBpbiBSWzBdICovCiAKLQlSRkFMU0UoICggdGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA8IG4gKSB8fCAKLQkJKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID4gbisxICksCi0JCSJQQVAtMTIwNTA6IHJudW0oJWQpIGFuZCBsbnVtKCVkKSBhbmQgaXRlbSBudW1iZXIoJWQpIGluIFNbMF0gYXJlIG5vdCBjb25zaXN0ZW50IiwKLQkJdGItPnJudW1bMF0sIHRiLT5sbnVtWzBdLCBuKTsKLQlSRkFMU0UoICggdGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA9PSBuICkgJiYgCi0JCSh0Yi0+bGJ5dGVzICE9IC0xIHx8IHRiLT5yYnl0ZXMgIT0gLTEpLAotCQkiUEFQLTEyMDU1OiBiYWQgcmJ5dGVzICglZCkvbGJ5dGVzICglZCkgcGFyYW1ldGVycyB3aGVuIGl0ZW1zIGFyZSBub3Qgc3BsaXQiLCAKLQkJdGItPnJieXRlcywgdGItPmxieXRlcyk7Ci0JUkZBTFNFKCAoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPT0gbiArIDEgKSAmJiAKLQkJKHRiLT5sYnl0ZXMgPCAxIHx8IHRiLT5yYnl0ZXMgIT0gLTEpLAotCQkiUEFQLTEyMDYwOiBiYWQgcmJ5dGVzICglZCkvbGJ5dGVzICglZCkgcGFyYW1ldGVycyB3aGVuIGl0ZW1zIGFyZSBzcGxpdCIsIAotCQl0Yi0+cmJ5dGVzLCB0Yi0+bGJ5dGVzKTsKKwkvKiB0aGUgcnVsZSBpcyB0aGF0IG5vIHNoaWZ0aW5nIG9jY3VycyB1bmxlc3MgYnkgc2hpZnRpbmcgYSBub2RlIGNhbiBiZSBmcmVlZCAqLworCW4gPSBCX05SX0lURU1TKHRiUzApOworCWlmICh0Yi0+bG51bVswXSkgewkvKiBMWzBdIHRha2VzIHBhcnQgaW4gYmFsYW5jaW5nICovCisJCWlmICh0Yi0+bG51bVswXSA9PSAtMSkgewkvKiBMWzBdIG11c3QgYmUgam9pbmVkIHdpdGggU1swXSAqLworCQkJaWYgKHRiLT5ybnVtWzBdID09IC0xKSB7CS8qIFJbMF0gbXVzdCBiZSBhbHNvIGpvaW5lZCB3aXRoIFNbMF0gKi8KKwkJCQlpZiAodGItPkZSWzBdID09IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSkgeworCQkJCQkvKiBhbGwgY29udGVudHMgb2YgYWxsIHRoZSAzIGJ1ZmZlcnMgd2lsbCBiZSBpbiBMWzBdICovCisJCQkJCWlmIChQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpID09IDAKKwkJCQkJICAgICYmIDEgPCBCX05SX0lURU1TKHRiLT5GUlswXSkpCisJCQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwKKwkJCQkJCQkgICAgdGItPmxrZXlbMF0sCisJCQkJCQkJICAgIHRiLT5GUlswXSwgMSk7CiAKLQlsZWFmX3NoaWZ0X2xlZnQgKHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyk7Ci0JbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0sIHRiLT5yYnl0ZXMpOworCQkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fTCwgdGIsIG4sCisJCQkJCQkJLTEsIE5VTEwpOworCQkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1JfVE9fTCwgdGIsCisJCQkJCQkJQl9OUl9JVEVNUyh0Yi0+UlswXSksCisJCQkJCQkJLTEsIE5VTEwpOwogCi0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKKwkJCQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiUzApOworCQkJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwKKwkJCQkJCQkJICAgdGItPlJbMF0pOwogCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQkvKiBhbGwgY29udGVudHMgb2YgYWxsIHRoZSAzIGJ1ZmZlcnMgd2lsbCBiZSBpbiBSWzBdICovCisJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX1IsIHRiLCBuLCAtMSwKKwkJCQkJCU5VTEwpOworCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fTF9UT19SLCB0YiwKKwkJCQkJCUJfTlJfSVRFTVModGItPkxbMF0pLCAtMSwgTlVMTCk7CisKKwkJCQkvKiByaWdodF9kZWxpbWl0aW5nX2tleSBpcyBjb3JyZWN0IGluIFJbMF0gKi8KKwkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSwgdGItPnJrZXlbMF0sCisJCQkJCSAgICB0Yi0+UlswXSwgMCk7CisKKwkJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTMCk7CisJCQkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiLT5MWzBdKTsKKworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJUkZBTFNFKHRiLT5ybnVtWzBdICE9IDAsCisJCQkgICAgICAgIlBBUC0xMjA0NTogcm51bSBtdXN0IGJlIDAgKCVkKSIsIHRiLT5ybnVtWzBdKTsKKwkJCS8qIGFsbCBjb250ZW50cyBvZiBMWzBdIGFuZCBTWzBdIHdpbGwgYmUgaW4gTFswXSAqLworCQkJbGVhZl9zaGlmdF9sZWZ0KHRiLCBuLCAtMSk7CisKKwkJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlMwKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogYSBwYXJ0IG9mIGNvbnRlbnRzIG9mIFNbMF0gd2lsbCBiZSBpbiBMWzBdIGFuZCB0aGUgcmVzdCBwYXJ0IG9mIFNbMF0gd2lsbCBiZSBpbiBSWzBdICovCisKKwkJUkZBTFNFKCh0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdIDwgbikgfHwKKwkJICAgICAgICh0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID4gbiArIDEpLAorCQkgICAgICAgIlBBUC0xMjA1MDogcm51bSglZCkgYW5kIGxudW0oJWQpIGFuZCBpdGVtIG51bWJlciglZCkgaW4gU1swXSBhcmUgbm90IGNvbnNpc3RlbnQiLAorCQkgICAgICAgdGItPnJudW1bMF0sIHRiLT5sbnVtWzBdLCBuKTsKKwkJUkZBTFNFKCh0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID09IG4pICYmCisJCSAgICAgICAodGItPmxieXRlcyAhPSAtMSB8fCB0Yi0+cmJ5dGVzICE9IC0xKSwKKwkJICAgICAgICJQQVAtMTIwNTU6IGJhZCByYnl0ZXMgKCVkKS9sYnl0ZXMgKCVkKSBwYXJhbWV0ZXJzIHdoZW4gaXRlbXMgYXJlIG5vdCBzcGxpdCIsCisJCSAgICAgICB0Yi0+cmJ5dGVzLCB0Yi0+bGJ5dGVzKTsKKwkJUkZBTFNFKCh0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID09IG4gKyAxKSAmJgorCQkgICAgICAgKHRiLT5sYnl0ZXMgPCAxIHx8IHRiLT5yYnl0ZXMgIT0gLTEpLAorCQkgICAgICAgIlBBUC0xMjA2MDogYmFkIHJieXRlcyAoJWQpL2xieXRlcyAoJWQpIHBhcmFtZXRlcnMgd2hlbiBpdGVtcyBhcmUgc3BsaXQiLAorCQkgICAgICAgdGItPnJieXRlcywgdGItPmxieXRlcyk7CisKKwkJbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyk7CisJCWxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdLCB0Yi0+cmJ5dGVzKTsKKworCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTMCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRiLT5ybnVtWzBdID09IC0xKSB7CisJCS8qIGFsbCBjb250ZW50cyBvZiBSWzBdIGFuZCBTWzBdIHdpbGwgYmUgaW4gUlswXSAqLworCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCBuLCAtMSk7CisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlMwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJUkZBTFNFKHRiLT5ybnVtWzBdLAorCSAgICAgICAiUEFQLTEyMDY1OiBiYWQgcm51bSBwYXJhbWV0ZXIgbXVzdCBiZSAwICglZCkiLCB0Yi0+cm51bVswXSk7CiAJcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCB0Yi0+cm51bVswXSA9PSAtMSApIHsKLQkvKiBhbGwgY29udGVudHMgb2YgUlswXSBhbmQgU1swXSB3aWxsIGJlIGluIFJbMF0gKi8KLQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCBuLCAtMSk7Ci0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBSRkFMU0UoIHRiLT5ybnVtWzBdLCAKLQkgICAgIlBBUC0xMjA2NTogYmFkIHJudW0gcGFyYW1ldGVyIG11c3QgYmUgMCAoJWQpIiwgdGItPnJudW1bMF0pOwotICAgIHJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbnQgYmFsYW5jZV9sZWFmIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCQkgc3RydWN0IGl0ZW1faGVhZCAqIGloLAkJLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSAodGhpcyBpcyBvbiBsaXR0bGUgZW5kaWFuKSAqLwotCQkJIGNvbnN0IGNoYXIgKiBib2R5LAkJLyogYm9keSAgb2YgaW5zZXJ0ZWQgaXRlbSBvciBieXRlcyB0byBwYXN0ZSAqLwotCQkJIGludCBmbGFnLAkJCS8qIGkgLSBpbnNlcnQsIGQgLSBkZWxldGUsIGMgLSBjdXQsIHAgLSBwYXN0ZQotCQkJCQkJCSAgIChzZWUgY29tbWVudCB0byBkb19iYWxhbmNlKSAqLwotCQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRfa2V5LCAgLyogaW4gb3VyIHByb2Nlc3Npbmcgb2Ygb25lIGxldmVsIHdlIHNvbWV0aW1lcyBkZXRlcm1pbmUgd2hhdAotCQkJCQkJCSAgICBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIG5leHQgaGlnaGVyIGxldmVsLiAgVGhpcyBpbnNlcnRpb24KLQkJCQkJCQkgICAgY29uc2lzdHMgb2YgYSBrZXkgb3IgdHdvIGtleXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcKLQkJCQkJCQkgICAgcG9pbnRlcnMgKi8KLQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogaW5zZXJ0X3B0ciAvKiBpbnNlcnRlZCBub2RlLXB0cnMgZm9yIHRoZSBuZXh0IGxldmVsICovCitzdGF0aWMgaW50IGJhbGFuY2VfbGVhZihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGl0ZW1faGVhZCAqaWgsCS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gKHRoaXMgaXMgb24gbGl0dGxlIGVuZGlhbikgKi8KKwkJCWNvbnN0IGNoYXIgKmJvZHksCS8qIGJvZHkgIG9mIGluc2VydGVkIGl0ZW0gb3IgYnl0ZXMgdG8gcGFzdGUgKi8KKwkJCWludCBmbGFnLAkvKiBpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlLCBjIC0gY3V0LCBwIC0gcGFzdGUKKwkJCQkJICAgKHNlZSBjb21tZW50IHRvIGRvX2JhbGFuY2UpICovCisJCQlzdHJ1Y3QgaXRlbV9oZWFkICppbnNlcnRfa2V5LAkvKiBpbiBvdXIgcHJvY2Vzc2luZyBvZiBvbmUgbGV2ZWwgd2Ugc29tZXRpbWVzIGRldGVybWluZSB3aGF0CisJCQkJCQkJICAgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuZXh0IGhpZ2hlciBsZXZlbC4gIFRoaXMgaW5zZXJ0aW9uCisJCQkJCQkJICAgY29uc2lzdHMgb2YgYSBrZXkgb3IgdHdvIGtleXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcKKwkJCQkJCQkgICBwb2ludGVycyAqLworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqaW5zZXJ0X3B0cgkvKiBpbnNlcnRlZCBub2RlLXB0cnMgZm9yIHRoZSBuZXh0IGxldmVsICovCiAgICAgKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotICAgIGludCBpdGVtX3BvcyA9IFBBVEhfTEFTVF9QT1NJVElPTiAodGItPnRiX3BhdGgpOwkvKiAgaW5kZXggaW50byB0aGUgYXJyYXkgb2YgaXRlbSBoZWFkZXJzIGluIFNbMF0gCi0JCQkJCQkJICAgIG9mIHRoZSBhZmZlY3RlZCBpdGVtICovCi0gICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqU19uZXdbMl07ICAvKiBuZXcgbm9kZXMgYWxsb2NhdGVkIHRvIGhvbGQgd2hhdCBjb3VsZCBub3QgZml0IGludG8gUyAqLwotICAgIGludCBzbnVtWzJdOwkgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbCBiZSBwbGFjZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIFNfbmV3IChpbmNsdWRlcyBwYXJ0aWFsbHkgc2hpZnRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKSAqLwotICAgIGludCBzYnl0ZXNbMl07ICAgICAgICAgIC8qIGlmIGFuIGl0ZW0gaXMgcGFydGlhbGx5IHNoaWZ0ZWQgaW50byBTX25ldyB0aGVuIAotCQkJICAgICAgIGlmIGl0IGlzIGEgZGlyZWN0b3J5IGl0ZW0gCi0JCQkgICAgICAgaXQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGZyb20gdGhlIGl0ZW0gdGhhdCBhcmUgc2hpZnRlZCBpbnRvIFNfbmV3Ci0JCQkgICAgICAgZWxzZQotCQkJICAgICAgIGl0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgaXRlbSB0aGF0IGFyZSBzaGlmdGVkIGludG8gU19uZXcKLQkJCSAgICAqLwotICAgIGludCBuLCBpOwotICAgIGludCByZXRfdmFsOwotICAgIGludCBwb3NfaW5faXRlbTsKLSAgICBpbnQgemVyb3NfbnVtOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHRiLT50Yl9wYXRoKTsKKwlpbnQgaXRlbV9wb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04odGItPnRiX3BhdGgpOwkvKiAgaW5kZXggaW50byB0aGUgYXJyYXkgb2YgaXRlbSBoZWFkZXJzIGluIFNbMF0gCisJCQkJCQkJICAgb2YgdGhlIGFmZmVjdGVkIGl0ZW0gKi8KKwlzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpTX25ld1syXTsJLyogbmV3IG5vZGVzIGFsbG9jYXRlZCB0byBob2xkIHdoYXQgY291bGQgbm90IGZpdCBpbnRvIFMgKi8KKwlpbnQgc251bVsyXTsJCS8qIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgYmUgcGxhY2VkCisJCQkJICAgaW50byBTX25ldyAoaW5jbHVkZXMgcGFydGlhbGx5IHNoaWZ0ZWQKKwkJCQkgICBpdGVtcykgKi8KKwlpbnQgc2J5dGVzWzJdOwkJLyogaWYgYW4gaXRlbSBpcyBwYXJ0aWFsbHkgc2hpZnRlZCBpbnRvIFNfbmV3IHRoZW4gCisJCQkJICAgaWYgaXQgaXMgYSBkaXJlY3RvcnkgaXRlbSAKKwkJCQkgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZnJvbSB0aGUgaXRlbSB0aGF0IGFyZSBzaGlmdGVkIGludG8gU19uZXcKKwkJCQkgICBlbHNlCisJCQkJICAgaXQgaXMgdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBpdGVtIHRoYXQgYXJlIHNoaWZ0ZWQgaW50byBTX25ldworCQkJCSAqLworCWludCBuLCBpOworCWludCByZXRfdmFsOworCWludCBwb3NfaW5faXRlbTsKKwlpbnQgemVyb3NfbnVtOwogCi0gICAgUFJPQ19JTkZPX0lOQyggdGIgLT4gdGJfc2IsIGJhbGFuY2VfYXRbIDAgXSApOworCVBST0NfSU5GT19JTkModGItPnRiX3NiLCBiYWxhbmNlX2F0WzBdKTsKIAotICAgIC8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9zaXplWzBdIDwgMCAqLwotICAgIGlmICggdGItPmluc2VydF9zaXplWzBdIDwgMCApCi0JcmV0dXJuIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAodGIsIGZsYWcpOwotICAKLSAgICB6ZXJvc19udW0gPSAwOwotICAgIGlmIChmbGFnID09IE1fSU5TRVJUICYmIGJvZHkgPT0gMCkKLQl6ZXJvc19udW0gPSBpaF9pdGVtX2xlbiggaWggKTsKKwkvKiBNYWtlIGJhbGFuY2UgaW4gY2FzZSBpbnNlcnRfc2l6ZVswXSA8IDAgKi8KKwlpZiAodGItPmluc2VydF9zaXplWzBdIDwgMCkKKwkJcmV0dXJuIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSh0YiwgZmxhZyk7CiAKLSAgICBwb3NfaW5faXRlbSA9IHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbTsKLSAgICAvKiBmb3IgaW5kaXJlY3QgaXRlbSBwb3NfaW5faXRlbSBpcyBtZWFzdXJlZCBpbiB1bmZvcm1hdHRlZCBub2RlCi0gICAgICAgcG9pbnRlcnMuIFJlY2FsY3VsYXRlIHRvIGJ5dGVzICovCi0gICAgaWYgKGZsYWcgIT0gTV9JTlNFUlQgJiYgaXNfaW5kaXJlY3RfbGVfaWggKEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3BvcykpKQotCXBvc19pbl9pdGVtICo9IFVORk1fUF9TSVpFOworCXplcm9zX251bSA9IDA7CisJaWYgKGZsYWcgPT0gTV9JTlNFUlQgJiYgYm9keSA9PSAwKQorCQl6ZXJvc19udW0gPSBpaF9pdGVtX2xlbihpaCk7CiAKLSAgICBpZiAoIHRiLT5sbnVtWzBdID4gMCApIHsKLQkvKiBTaGlmdCBsbnVtWzBdIGl0ZW1zIGZyb20gU1swXSB0byB0aGUgbGVmdCBuZWlnaGJvciBMWzBdICovCi0JaWYgKCBpdGVtX3BvcyA8IHRiLT5sbnVtWzBdICkgewotCSAgICAvKiBuZXcgaXRlbSBvciBpdCBwYXJ0IGZhbGxzIHRvIExbMF0sIHNoaWZ0IGl0IHRvbyAqLwotCSAgICBuID0gQl9OUl9JVEVNUyh0Yi0+TFswXSk7CisJcG9zX2luX2l0ZW0gPSB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07CisJLyogZm9yIGluZGlyZWN0IGl0ZW0gcG9zX2luX2l0ZW0gaXMgbWVhc3VyZWQgaW4gdW5mb3JtYXR0ZWQgbm9kZQorCSAgIHBvaW50ZXJzLiBSZWNhbGN1bGF0ZSB0byBieXRlcyAqLworCWlmIChmbGFnICE9IE1fSU5TRVJUCisJICAgICYmIGlzX2luZGlyZWN0X2xlX2loKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSkpCisJCXBvc19pbl9pdGVtICo9IFVORk1fUF9TSVpFOwogCi0JICAgIHN3aXRjaCAoZmxhZykgewotCSAgICBjYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtIGludG8gTFswXSAqLworCWlmICh0Yi0+bG51bVswXSA+IDApIHsKKwkJLyogU2hpZnQgbG51bVswXSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIGxlZnQgbmVpZ2hib3IgTFswXSAqLworCQlpZiAoaXRlbV9wb3MgPCB0Yi0+bG51bVswXSkgeworCQkJLyogbmV3IGl0ZW0gb3IgaXQgcGFydCBmYWxscyB0byBMWzBdLCBzaGlmdCBpdCB0b28gKi8KKwkJCW4gPSBCX05SX0lURU1TKHRiLT5MWzBdKTsKIAotCQlpZiAoIGl0ZW1fcG9zID09IHRiLT5sbnVtWzBdIC0gMSAmJiB0Yi0+bGJ5dGVzICE9IC0xICkgewotCQkgICAgLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIExbMF0gKi8KLQkJICAgIGludCBuZXdfaXRlbV9sZW47Ci0JCSAgICBpbnQgdmVyc2lvbjsKKwkJCXN3aXRjaCAoZmxhZykgeworCQkJY2FzZSBNX0lOU0VSVDoJLyogaW5zZXJ0IGl0ZW0gaW50byBMWzBdICovCiAKLQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQgKHRiLCB0Yi0+bG51bVswXS0xLCAtMSk7CisJCQkJaWYgKGl0ZW1fcG9zID09IHRiLT5sbnVtWzBdIC0gMQorCQkJCSAgICAmJiB0Yi0+bGJ5dGVzICE9IC0xKSB7CisJCQkJCS8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBMWzBdICovCisJCQkJCWludCBuZXdfaXRlbV9sZW47CisJCQkJCWludCB2ZXJzaW9uOwogCi0JCSAgICAvKiBDYWxjdWxhdGUgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IHRvIFNbMF0gKi8KLQkJICAgIG5ld19pdGVtX2xlbiA9IGloX2l0ZW1fbGVuKGloKSAtIHRiLT5sYnl0ZXM7Ci0JCSAgICAvKiBDYWxjdWxhdGUgYW5kIGNoZWNrIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCB0byBMWzBdICovCi0JCSAgICBwdXRfaWhfaXRlbV9sZW4oaWgsIGloX2l0ZW1fbGVuKGloKSAtIG5ld19pdGVtX2xlbiApOworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0gLSAxLAorCQkJCQkJCSAgICAtMSk7CiAKLQkJICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpIDw9IDAsCi0JCQkgICAgIlBBUC0xMjA4MDogdGhlcmUgaXMgbm90aGluZyB0byBpbnNlcnQgaW50byBMWzBdOiBpaF9pdGVtX2xlbj0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhfaXRlbV9sZW4oaWgpKTsKKwkJCQkJLyogQ2FsY3VsYXRlIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCB0byBTWzBdICovCisJCQkJCW5ld19pdGVtX2xlbiA9CisJCQkJCSAgICBpaF9pdGVtX2xlbihpaCkgLSB0Yi0+bGJ5dGVzOworCQkJCQkvKiBDYWxjdWxhdGUgYW5kIGNoZWNrIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCB0byBMWzBdICovCisJCQkJCXB1dF9paF9pdGVtX2xlbihpaCwKKwkJCQkJCQlpaF9pdGVtX2xlbihpaCkgLQorCQkJCQkJCW5ld19pdGVtX2xlbik7CiAKLQkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIExbMF0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOwotCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgaWgsIGJvZHksCi0JCQkJCSAgemVyb3NfbnVtID4gaWhfaXRlbV9sZW4oaWgpID8gaWhfaXRlbV9sZW4oaWgpIDogemVyb3NfbnVtKTsKKwkJCQkJUkZBTFNFKGloX2l0ZW1fbGVuKGloKSA8PSAwLAorCQkJCQkgICAgICAgIlBBUC0xMjA4MDogdGhlcmUgaXMgbm90aGluZyB0byBpbnNlcnQgaW50byBMWzBdOiBpaF9pdGVtX2xlbj0lZCIsCisJCQkJCSAgICAgICBpaF9pdGVtX2xlbihpaCkpOwogCi0JCSAgICB2ZXJzaW9uID0gaWhfdmVyc2lvbiAoaWgpOworCQkJCQkvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBMWzBdICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gdGItPkxbMF07CisJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkgICAgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksCisJCQkJCQkJICAgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgICAgcmV0X3ZhbCwgaWgsIGJvZHksCisJCQkJCQkJICAgICB6ZXJvc19udW0gPgorCQkJCQkJCSAgICAgaWhfaXRlbV9sZW4oaWgpID8KKwkJCQkJCQkgICAgIGloX2l0ZW1fbGVuKGloKSA6CisJCQkJCQkJICAgICB6ZXJvc19udW0pOwogCi0JCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCwgaXRlbSBsZW5ndGggYW5kIGJvZHkgdG8gaW5zZXJ0IGludG8gU1swXSAqLwotICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBsZV9paF9rX29mZnNldCggaWggKSArICh0Yi0+bGJ5dGVzIDw8IChpc19pbmRpcmVjdF9sZV9paChpaCk/dGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUOjApKSApOworCQkJCQl2ZXJzaW9uID0gaWhfdmVyc2lvbihpaCk7CiAKLQkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIG5ld19pdGVtX2xlbiApOwotCQkgICAgaWYgKCB0Yi0+bGJ5dGVzID4gIHplcm9zX251bSApIHsKLQkJCWJvZHkgKz0gKHRiLT5sYnl0ZXMgLSB6ZXJvc19udW0pOwotCQkJemVyb3NfbnVtID0gMDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJCXplcm9zX251bSAtPSB0Yi0+bGJ5dGVzOworCQkJCQkvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCwgaXRlbSBsZW5ndGggYW5kIGJvZHkgdG8gaW5zZXJ0IGludG8gU1swXSAqLworCQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsCisJCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCQkgICAodGItPgorCQkJCQkJCSAgICBsYnl0ZXMgPDwKKwkJCQkJCQkgICAgKGlzX2luZGlyZWN0X2xlX2loCisJCQkJCQkJICAgICAoaWgpID8gdGItPnRiX3NiLT4KKwkJCQkJCQkgICAgIHNfYmxvY2tzaXplX2JpdHMgLQorCQkJCQkJCSAgICAgVU5GTV9QX1NISUZUIDoKKwkJCQkJCQkgICAgIDApKSk7CiAKLQkJICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpIDw9IDAsCi0JCQkiUEFQLTEyMDg1OiB0aGVyZSBpcyBub3RoaW5nIHRvIGluc2VydCBpbnRvIFNbMF06IGloX2l0ZW1fbGVuPSVkIiwKLQkJCWloX2l0ZW1fbGVuKGloKSk7Ci0JCX0gZWxzZSB7Ci0JCSAgICAvKiBuZXcgaXRlbSBpbiB3aG9sZSBmYWxscyBpbnRvIExbMF0gKi8KLQkJICAgIC8qIFNoaWZ0IGxudW1bMF0tMSBpdGVtcyB0byBMWzBdICovCi0JCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXS0xLCB0Yi0+bGJ5dGVzKTsKLQkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIExbMF0gKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOwotCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMWzBdOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgaWgsIGJvZHksIHplcm9zX251bSk7Ci0JCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQkgICAgemVyb3NfbnVtID0gMDsKLQkJfQotCQlicmVhazsKKwkJCQkJcHV0X2loX2l0ZW1fbGVuKGloLCBuZXdfaXRlbV9sZW4pOworCQkJCQlpZiAodGItPmxieXRlcyA+IHplcm9zX251bSkgeworCQkJCQkJYm9keSArPQorCQkJCQkJICAgICh0Yi0+bGJ5dGVzIC0gemVyb3NfbnVtKTsKKwkJCQkJCXplcm9zX251bSA9IDA7CisJCQkJCX0gZWxzZQorCQkJCQkJemVyb3NfbnVtIC09IHRiLT5sYnl0ZXM7CiAKLQkgICAgY2FzZSBNX1BBU1RFOiAgIC8qIGFwcGVuZCBpdGVtIGluIExbMF0gKi8KLQotCQlpZiAoIGl0ZW1fcG9zID09IHRiLT5sbnVtWzBdIC0gMSAmJiB0Yi0+bGJ5dGVzICE9IC0xICkgewotCQkgICAgLyogd2UgbXVzdCBzaGlmdCB0aGUgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLwotCQkgICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKSkpIHsKLQotCQkJUkZBTFNFKCB6ZXJvc19udW0sCi0JCQkJIlBBUC0xMjA5MDogaW52YWxpZCBwYXJhbWV0ZXIgaW4gY2FzZSBvZiBhIGRpcmVjdG9yeSIpOwotCQkJLyogZGlyZWN0b3J5IGl0ZW0gKi8KLQkJCWlmICggdGItPmxieXRlcyA+IHBvc19pbl9pdGVtICkgewotCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBMWzBdICovCi0JCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKLQkJCSAgICBpbnQgbF9wb3NfaW5faXRlbSA9IHBvc19pbl9pdGVtOwotCQkJCQkJCSAgCi0JCQkgICAgLyogU2hpZnQgbG51bVswXSAtIDEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyAtIDEgZW50cmllcyBmcm9tIGdpdmVuIGRpcmVjdG9yeSBpdGVtICovCi0JCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMgLSAxKTsKLQkJCSAgICBpZiAoIHJldF92YWwgJiYgISBpdGVtX3BvcyApIHsKLQkJCQlwYXN0ZWQgPSAgQl9OX1BJVEVNX0hFQUQodGItPkxbMF0sQl9OUl9JVEVNUyh0Yi0+TFswXSktMSk7Ci0JCQkJbF9wb3NfaW5faXRlbSArPSBJX0VOVFJZX0NPVU5UKHBhc3RlZCkgLSAodGItPmxieXRlcy0xKTsKLQkJCSAgICB9Ci0KLQkJCSAgICAvKiBBcHBlbmQgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCi0JCQkgICAgYmkudGIgPSB0YjsKLQkJCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOwotCQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQkJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgbF9wb3NfaW5faXRlbSwKLQkJCQkJCSAgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOwotCi0JCQkgICAgLyogcHJldmlvdXMgc3RyaW5nIHByZXBhcmVkIHNwYWNlIGZvciBwYXN0aW5nIG5ldyBlbnRyeSwgZm9sbG93aW5nIHN0cmluZyBwYXN0ZXMgdGhpcyBlbnRyeSAqLwotCi0JCQkgICAgLyogd2hlbiB3ZSBoYXZlIG1lcmdlIGRpcmVjdG9yeSBpdGVtLCBwb3NfaW5faXRlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvbyAqLwotCi0JCQkgICAgLyogcGFzdGUgbmV3IGRpcmVjdG9yeSBlbnRyeS4gMSBpcyBlbnRyeSBudW1iZXIgKi8KLQkJCSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKGJpLmJpX2JoLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBsX3Bvc19pbl9pdGVtLCAxLAotCQkJCQkJKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgCi0JCQkJCQlib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQotCQkJCSk7Ci0JCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkgICAgLyogbmV3IGRpcmVjdG9yeSBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIExbMF0gKi8KLQkJCSAgICAvKiBTaGlmdCBsbnVtWzBdLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBsbnVtWzBdICovCi0JCQkgICAgbGVhZl9zaGlmdF9sZWZ0ICh0YiwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMpOwotCQkJfQotCQkJLyogQ2FsY3VsYXRlIG5ldyBwb3NpdGlvbiB0byBhcHBlbmQgaW4gaXRlbSBib2R5ICovCi0JCQlwb3NfaW5faXRlbSAtPSB0Yi0+bGJ5dGVzOwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQkvKiByZWd1bGFyIG9iamVjdCAqLwotCQkJUkZBTFNFKCB0Yi0+bGJ5dGVzIDw9IDAsCi0JCQkgICAgICAgICJQQVAtMTIwOTU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gc2hpZnQgdG8gTFswXS4gbGJ5dGVzPSVkIiwKLQkJCQl0Yi0+bGJ5dGVzKTsKLQkJCVJGQUxTRSggcG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUC0xMjEwMDogaW5jb3JyZWN0IHBvc2l0aW9uIHRvIHBhc3RlOiBpdGVtX2xlbj0lZCwgcG9zX2luX2l0ZW09JWQiLAotCQkJCWloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpKSwgcG9zX2luX2l0ZW0pOwotCi0JCQlpZiAoIHRiLT5sYnl0ZXMgPj0gcG9zX2luX2l0ZW0gKSB7Ci0JCQkgICAgLyogYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gaW4gd2hvbGUgKi8KLQkJCSAgICBpbnQgbF9uOwotCi0JCQkgICAgLyogdGhpcyBieXRlcyBudW1iZXIgbXVzdCBiZSBhcHBlbmRlZCB0byB0aGUgbGFzdCBpdGVtIG9mIExbaF0gKi8KLQkJCSAgICBsX24gPSB0Yi0+bGJ5dGVzIC0gcG9zX2luX2l0ZW07Ci0KLQkJCSAgICAvKiBDYWxjdWxhdGUgbmV3IGluc2VydF9zaXplWzBdICovCi0JCQkgICAgdGItPmluc2VydF9zaXplWzBdIC09IGxfbjsKLQotCQkJICAgIFJGQUxTRSggdGItPmluc2VydF9zaXplWzBdIDw9IDAsCi0JCQkJICAgICJQQVAtMTIxMDU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gcGFzdGUgaW50byBMWzBdLiBpbnNlcnRfc2l6ZT0lZCIsCi0JCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0JCQkgICAgcmV0X3ZhbCA9ICBsZWFmX3NoaWZ0X2xlZnQodGIsdGItPmxudW1bMF0sIAotCQkJCQkJICAgICAgIGloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpKSk7Ci0JCQkgICAgLyogQXBwZW5kIHRvIGJvZHkgb2YgaXRlbSBpbiBMWzBdICovCi0JCQkgICAgYmkudGIgPSB0YjsKLQkJCSAgICBiaS5iaV9iaCA9IHRiLT5MWzBdOwotCQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQkJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIoCi0JCQkJJmJpLG4gKyBpdGVtX3BvcyAtIHJldF92YWwsCi0JCQkJaWhfaXRlbV9sZW4oIEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLG4raXRlbV9wb3MtcmV0X3ZhbCkpLAotCQkJCWxfbixib2R5LCB6ZXJvc19udW0gPiBsX24gPyBsX24gOiB6ZXJvc19udW0KLQkJCQkpOwotCQkJICAgIC8qIDAtdGggaXRlbSBpbiBTMCBjYW4gYmUgb25seSBvZiBESVJFQ1QgdHlwZSB3aGVuIGxfbiAhPSAwKi8KLQkJCSAgICB7Ci0JCQkJaW50IHZlcnNpb247Ci0JCQkJaW50IHRlbXBfbCA9IGxfbjsKLQkJCQkKLQkJCQlSRkFMU0UgKGloX2l0ZW1fbGVuIChCX05fUElURU1fSEVBRCAodGJTMCwgMCkpLAotCQkJCQkiUEFQLTEyMTA2OiBpdGVtIGxlbmd0aCBtdXN0IGJlIDAiKTsKLQkJCQlSRkFMU0UgKGNvbXBfc2hvcnRfbGVfa2V5cyAoQl9OX1BLRVkgKHRiUzAsIDApLAotCQkJCQkJCSAgICBCX05fUEtFWSAodGItPkxbMF0sCi0JCQkJCQkJCQkgICAgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCkpLAotCQkJCQkiUEFQLTEyMTA3OiBpdGVtcyBtdXN0IGJlIG9mIHRoZSBzYW1lIGZpbGUiKTsKLQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoQl9OX1BJVEVNX0hFQUQgKHRiLT5MWzBdLAotCQkJCQkJCQkgICAgICBuICsgaXRlbV9wb3MgLSByZXRfdmFsKSkpCXsKLQkJCQkgICAgdGVtcF9sID0gbF9uIDw8ICh0Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQpOworCQkJCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpIDw9IDAsCisJCQkJCSAgICAgICAiUEFQLTEyMDg1OiB0aGVyZSBpcyBub3RoaW5nIHRvIGluc2VydCBpbnRvIFNbMF06IGloX2l0ZW1fbGVuPSVkIiwKKwkJCQkJICAgICAgIGloX2l0ZW1fbGVuKGloKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogbmV3IGl0ZW0gaW4gd2hvbGUgZmFsbHMgaW50byBMWzBdICovCisJCQkJCS8qIFNoaWZ0IGxudW1bMF0tMSBpdGVtcyB0byBMWzBdICovCisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSAtIDEsCisJCQkJCQkJICAgIHRiLT5sYnl0ZXMpOworCQkJCQkvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBMWzBdICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gdGItPkxbMF07CisJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkgICAgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksCisJCQkJCQkJICAgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgICAgcmV0X3ZhbCwgaWgsIGJvZHksCisJCQkJCQkJICAgICB6ZXJvc19udW0pOworCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQl6ZXJvc19udW0gPSAwOwogCQkJCX0KLQkJCQkvKiB1cGRhdGUga2V5IG9mIGZpcnN0IGl0ZW0gaW4gUzAgKi8KLQkJCQl2ZXJzaW9uID0gaWhfdmVyc2lvbiAoQl9OX1BJVEVNX0hFQUQgKHRiUzAsIDApKTsKLQkJCQlzZXRfbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSAodGJTMCwgMCksIAotCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QS0VZICh0YlMwLCAwKSkgKyB0ZW1wX2wpOwotCQkJCS8qIHVwZGF0ZSBsZWZ0IGRlbGltaXRpbmcga2V5ICovCi0JCQkJc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BERUxJTV9LRVkodGItPkNGTFswXSx0Yi0+bGtleVswXSksCi0JCQkJCQkgICAgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BERUxJTV9LRVkodGItPkNGTFswXSx0Yi0+bGtleVswXSkpICsgdGVtcF9sKTsKLQkJCSAgICB9CisJCQkJYnJlYWs7CiAKLQkJCSAgICAvKiBDYWxjdWxhdGUgbmV3IGJvZHksIHBvc2l0aW9uIGluIGl0ZW0gYW5kIGluc2VydF9zaXplWzBdICovCi0JCQkgICAgaWYgKCBsX24gPiB6ZXJvc19udW0gKSB7Ci0JCQkJYm9keSArPSAobF9uIC0gemVyb3NfbnVtKTsKLQkJCQl6ZXJvc19udW0gPSAwOwotCQkJICAgIH0KLQkJCSAgICBlbHNlCi0JCQkJemVyb3NfbnVtIC09IGxfbjsKLQkJCSAgICBwb3NfaW5faXRlbSA9IDA7CQorCQkJY2FzZSBNX1BBU1RFOgkvKiBhcHBlbmQgaXRlbSBpbiBMWzBdICovCiAKLQkJCSAgICBSRkFMU0UoIGNvbXBfc2hvcnRfbGVfa2V5cyAKLQkJCQkgICAgKEJfTl9QS0VZKHRiUzAsMCksCi0JCQkJICAgICBCX05fUEtFWSh0Yi0+TFswXSxCX05SX0lURU1TKHRiLT5MWzBdKS0xKSkgfHwKLQkJCQkKLQkJCQkgICAgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlIAotCQkJCSAgICAoQl9OX1BLRVkgKHRiUzAsIDApLCB0YlMwLT5iX3NpemUpIHx8Ci0JCQkJICAgICFvcF9pc19sZWZ0X21lcmdlYWJsZQotCQkJCSAgICAoQl9OX1BERUxJTV9LRVkodGItPkNGTFswXSx0Yi0+bGtleVswXSksIAotCQkJCSAgICAgdGJTMC0+Yl9zaXplKSwKLQkJCQkgICAgIlBBUC0xMjEyMDogaXRlbSBtdXN0IGJlIG1lcmdlLWFibGUgd2l0aCBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0iKTsKKwkJCQlpZiAoaXRlbV9wb3MgPT0gdGItPmxudW1bMF0gLSAxCisJCQkJICAgICYmIHRiLT5sYnl0ZXMgIT0gLTEpIHsKKwkJCQkJLyogd2UgbXVzdCBzaGlmdCB0aGUgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLworCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgKKwkJCQkJICAgIChCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpKSB7CisKKwkJCQkJCVJGQUxTRSh6ZXJvc19udW0sCisJCQkJCQkgICAgICAgIlBBUC0xMjA5MDogaW52YWxpZCBwYXJhbWV0ZXIgaW4gY2FzZSBvZiBhIGRpcmVjdG9yeSIpOworCQkJCQkJLyogZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJCWlmICh0Yi0+bGJ5dGVzID4gcG9zX2luX2l0ZW0pIHsKKwkJCQkJCQkvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gTFswXSAqLworCQkJCQkJCXN0cnVjdCBpdGVtX2hlYWQKKwkJCQkJCQkgICAgKnBhc3RlZDsKKwkJCQkJCQlpbnQgbF9wb3NfaW5faXRlbSA9CisJCQkJCQkJICAgIHBvc19pbl9pdGVtOworCisJCQkJCQkJLyogU2hpZnQgbG51bVswXSAtIDEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyAtIDEgZW50cmllcyBmcm9tIGdpdmVuIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCQkJcmV0X3ZhbCA9CisJCQkJCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgbG51bQorCQkJCQkJCQkJICAgIFswXSwKKwkJCQkJCQkJCSAgICB0Yi0+CisJCQkJCQkJCQkgICAgbGJ5dGVzCisJCQkJCQkJCQkgICAgLQorCQkJCQkJCQkJICAgIDEpOworCQkJCQkJCWlmIChyZXRfdmFsCisJCQkJCQkJICAgICYmICFpdGVtX3BvcykgeworCQkJCQkJCQlwYXN0ZWQgPQorCQkJCQkJCQkgICAgQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkJICAgICh0Yi0+TFswXSwKKwkJCQkJCQkJICAgICBCX05SX0lURU1TCisJCQkJCQkJCSAgICAgKHRiLT4KKwkJCQkJCQkJICAgICAgTFswXSkgLQorCQkJCQkJCQkgICAgIDEpOworCQkJCQkJCQlsX3Bvc19pbl9pdGVtICs9CisJCQkJCQkJCSAgICBJX0VOVFJZX0NPVU5UCisJCQkJCQkJCSAgICAocGFzdGVkKSAtCisJCQkJCQkJCSAgICAodGItPgorCQkJCQkJCQkgICAgIGxieXRlcyAtCisJCQkJCQkJCSAgICAgMSk7CisJCQkJCQkJfQorCisJCQkJCQkJLyogQXBwZW5kIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQkJYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCQkJCQliaS5iaV9wYXJlbnQgPQorCQkJCQkJCSAgICB0Yi0+RkxbMF07CisJCQkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkJCSAgICBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbgorCQkJCQkJCSAgICAodGIsIDApOworCQkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyCisJCQkJCQkJICAgICgmYmksCisJCQkJCQkJICAgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgICAgcmV0X3ZhbCwKKwkJCQkJCQkgICAgIGxfcG9zX2luX2l0ZW0sCisJCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICBib2R5LCB6ZXJvc19udW0pOworCisJCQkJCQkJLyogcHJldmlvdXMgc3RyaW5nIHByZXBhcmVkIHNwYWNlIGZvciBwYXN0aW5nIG5ldyBlbnRyeSwgZm9sbG93aW5nIHN0cmluZyBwYXN0ZXMgdGhpcyBlbnRyeSAqLworCisJCQkJCQkJLyogd2hlbiB3ZSBoYXZlIG1lcmdlIGRpcmVjdG9yeSBpdGVtLCBwb3NfaW5faXRlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvbyAqLworCisJCQkJCQkJLyogcGFzdGUgbmV3IGRpcmVjdG9yeSBlbnRyeS4gMSBpcyBlbnRyeSBudW1iZXIgKi8KKwkJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuCisJCQkJCQkJCQkgICBiaV9iaCwKKwkJCQkJCQkJCSAgIG4gKworCQkJCQkJCQkJICAgaXRlbV9wb3MKKwkJCQkJCQkJCSAgIC0KKwkJCQkJCQkJCSAgIHJldF92YWwsCisJCQkJCQkJCQkgICBsX3Bvc19pbl9pdGVtLAorCQkJCQkJCQkJICAgMSwKKwkJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCQkgICAgKikKKwkJCQkJCQkJCSAgIGJvZHksCisJCQkJCQkJCQkgICBib2R5CisJCQkJCQkJCQkgICArCisJCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCQkgICBbMF0KKwkJCQkJCQkgICAgKTsKKwkJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkvKiBuZXcgZGlyZWN0b3J5IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gTFswXSAqLworCQkJCQkJCS8qIFNoaWZ0IGxudW1bMF0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KKwkJCQkJCQlsZWFmX3NoaWZ0X2xlZnQodGIsCisJCQkJCQkJCQl0Yi0+CisJCQkJCQkJCQlsbnVtWzBdLAorCQkJCQkJCQkJdGItPgorCQkJCQkJCQkJbGJ5dGVzKTsKKwkJCQkJCX0KKwkJCQkJCS8qIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gdG8gYXBwZW5kIGluIGl0ZW0gYm9keSAqLworCQkJCQkJcG9zX2luX2l0ZW0gLT0gdGItPmxieXRlczsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIHJlZ3VsYXIgb2JqZWN0ICovCisJCQkJCQlSRkFMU0UodGItPmxieXRlcyA8PSAwLAorCQkJCQkJICAgICAgICJQQVAtMTIwOTU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gc2hpZnQgdG8gTFswXS4gbGJ5dGVzPSVkIiwKKwkJCQkJCSAgICAgICB0Yi0+bGJ5dGVzKTsKKwkJCQkJCVJGQUxTRShwb3NfaW5faXRlbSAhPQorCQkJCQkJICAgICAgIGloX2l0ZW1fbGVuCisJCQkJCQkgICAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJKHRiUzAsIGl0ZW1fcG9zKSksCisJCQkJCQkgICAgICAgIlBBUC0xMjEwMDogaW5jb3JyZWN0IHBvc2l0aW9uIHRvIHBhc3RlOiBpdGVtX2xlbj0lZCwgcG9zX2luX2l0ZW09JWQiLAorCQkJCQkJICAgICAgIGloX2l0ZW1fbGVuCisJCQkJCQkgICAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJKHRiUzAsIGl0ZW1fcG9zKSksCisJCQkJCQkgICAgICAgcG9zX2luX2l0ZW0pOworCisJCQkJCQlpZiAodGItPmxieXRlcyA+PSBwb3NfaW5faXRlbSkgeworCQkJCQkJCS8qIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdIGluIHdob2xlICovCisJCQkJCQkJaW50IGxfbjsKKworCQkJCQkJCS8qIHRoaXMgYnl0ZXMgbnVtYmVyIG11c3QgYmUgYXBwZW5kZWQgdG8gdGhlIGxhc3QgaXRlbSBvZiBMW2hdICovCisJCQkJCQkJbF9uID0KKwkJCQkJCQkgICAgdGItPmxieXRlcyAtCisJCQkJCQkJICAgIHBvc19pbl9pdGVtOworCisJCQkJCQkJLyogQ2FsY3VsYXRlIG5ldyBpbnNlcnRfc2l6ZVswXSAqLworCQkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSAtPQorCQkJCQkJCSAgICBsX247CisKKwkJCQkJCQlSRkFMU0UodGItPgorCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZVswXSA8PQorCQkJCQkJCSAgICAgICAwLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMTA1OiB0aGVyZSBpcyBub3RoaW5nIHRvIHBhc3RlIGludG8gTFswXS4gaW5zZXJ0X3NpemU9JWQiLAorCQkJCQkJCSAgICAgICB0Yi0+CisJCQkJCQkJICAgICAgIGluc2VydF9zaXplWzBdKTsKKwkJCQkJCQlyZXRfdmFsID0KKwkJCQkJCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBsbnVtCisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIGloX2l0ZW1fbGVuCisJCQkJCQkJCQkgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkJCQkgICAgICh0YlMwLAorCQkJCQkJCQkJICAgICAgaXRlbV9wb3MpKSk7CisJCQkJCQkJLyogQXBwZW5kIHRvIGJvZHkgb2YgaXRlbSBpbiBMWzBdICovCisJCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCQliaS5iaV9iaCA9IHRiLT5MWzBdOworCQkJCQkJCWJpLmJpX3BhcmVudCA9CisJCQkJCQkJICAgIHRiLT5GTFswXTsKKwkJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkJICAgIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uCisJCQkJCQkJICAgICh0YiwgMCk7CisJCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIKKwkJCQkJCQkgICAgKCZiaSwKKwkJCQkJCQkgICAgIG4gKyBpdGVtX3BvcyAtCisJCQkJCQkJICAgICByZXRfdmFsLAorCQkJCQkJCSAgICAgaWhfaXRlbV9sZW4KKwkJCQkJCQkgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSAgICAgICh0Yi0+TFswXSwKKwkJCQkJCQkgICAgICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICAgICAgcmV0X3ZhbCkpLCBsX24sCisJCQkJCQkJICAgICBib2R5LAorCQkJCQkJCSAgICAgemVyb3NfbnVtID4KKwkJCQkJCQkgICAgIGxfbiA/IGxfbiA6CisJCQkJCQkJICAgICB6ZXJvc19udW0pOworCQkJCQkJCS8qIDAtdGggaXRlbSBpbiBTMCBjYW4gYmUgb25seSBvZiBESVJFQ1QgdHlwZSB3aGVuIGxfbiAhPSAwICovCisJCQkJCQkJeworCQkJCQkJCQlpbnQgdmVyc2lvbjsKKwkJCQkJCQkJaW50IHRlbXBfbCA9CisJCQkJCQkJCSAgICBsX247CisKKwkJCQkJCQkJUkZBTFNFCisJCQkJCQkJCSAgICAoaWhfaXRlbV9sZW4KKwkJCQkJCQkJICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkJICAgICAgKHRiUzAsCisJCQkJCQkJCSAgICAgICAwKSksCisJCQkJCQkJCSAgICAgIlBBUC0xMjEwNjogaXRlbSBsZW5ndGggbXVzdCBiZSAwIik7CisJCQkJCQkJCVJGQUxTRQorCQkJCQkJCQkgICAgKGNvbXBfc2hvcnRfbGVfa2V5cworCQkJCQkJCQkgICAgIChCX05fUEtFWQorCQkJCQkJCQkgICAgICAodGJTMCwgMCksCisJCQkJCQkJCSAgICAgIEJfTl9QS0VZCisJCQkJCQkJCSAgICAgICh0Yi0+TFswXSwKKwkJCQkJCQkJICAgICAgIG4gKworCQkJCQkJCQkgICAgICAgaXRlbV9wb3MKKwkJCQkJCQkJICAgICAgIC0KKwkJCQkJCQkJICAgICAgIHJldF92YWwpKSwKKwkJCQkJCQkJICAgICAiUEFQLTEyMTA3OiBpdGVtcyBtdXN0IGJlIG9mIHRoZSBzYW1lIGZpbGUiKTsKKwkJCQkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsKSkpIHsKKwkJCQkJCQkJCXRlbXBfbCA9CisJCQkJCQkJCQkgICAgbF9uCisJCQkJCQkJCQkgICAgPDwKKwkJCQkJCQkJCSAgICAodGItPgorCQkJCQkJCQkJICAgICB0Yl9zYi0+CisJCQkJCQkJCQkgICAgIHNfYmxvY2tzaXplX2JpdHMKKwkJCQkJCQkJCSAgICAgLQorCQkJCQkJCQkJICAgICBVTkZNX1BfU0hJRlQpOworCQkJCQkJCQl9CisJCQkJCQkJCS8qIHVwZGF0ZSBrZXkgb2YgZmlyc3QgaXRlbSBpbiBTMCAqLworCQkJCQkJCQl2ZXJzaW9uID0KKwkJCQkJCQkJICAgIGloX3ZlcnNpb24KKwkJCQkJCQkJICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCQkgICAgICh0YlMwLCAwKSk7CisJCQkJCQkJCXNldF9sZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkJICAgICh2ZXJzaW9uLAorCQkJCQkJCQkgICAgIEJfTl9QS0VZCisJCQkJCQkJCSAgICAgKHRiUzAsIDApLAorCQkJCQkJCQkgICAgIGxlX2tleV9rX29mZnNldAorCQkJCQkJCQkgICAgICh2ZXJzaW9uLAorCQkJCQkJCQkgICAgICBCX05fUEtFWQorCQkJCQkJCQkgICAgICAodGJTMCwKKwkJCQkJCQkJICAgICAgIDApKSArCisJCQkJCQkJCSAgICAgdGVtcF9sKTsKKwkJCQkJCQkJLyogdXBkYXRlIGxlZnQgZGVsaW1pdGluZyBrZXkgKi8KKwkJCQkJCQkJc2V0X2xlX2tleV9rX29mZnNldAorCQkJCQkJCQkgICAgKHZlcnNpb24sCisJCQkJCQkJCSAgICAgQl9OX1BERUxJTV9LRVkKKwkJCQkJCQkJICAgICAodGItPgorCQkJCQkJCQkgICAgICBDRkxbMF0sCisJCQkJCQkJCSAgICAgIHRiLT4KKwkJCQkJCQkJICAgICAgbGtleVswXSksCisJCQkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkJCSAgICAgKHZlcnNpb24sCisJCQkJCQkJCSAgICAgIEJfTl9QREVMSU1fS0VZCisJCQkJCQkJCSAgICAgICh0Yi0+CisJCQkJCQkJCSAgICAgICBDRkxbMF0sCisJCQkJCQkJCSAgICAgICB0Yi0+CisJCQkJCQkJCSAgICAgICBsa2V5WzBdKSkKKwkJCQkJCQkJICAgICArIHRlbXBfbCk7CisJCQkJCQkJfQorCisJCQkJCQkJLyogQ2FsY3VsYXRlIG5ldyBib2R5LCBwb3NpdGlvbiBpbiBpdGVtIGFuZCBpbnNlcnRfc2l6ZVswXSAqLworCQkJCQkJCWlmIChsX24gPiB6ZXJvc19udW0pIHsKKwkJCQkJCQkJYm9keSArPQorCQkJCQkJCQkgICAgKGxfbiAtCisJCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKKwkJCQkJCQkJemVyb3NfbnVtID0gMDsKKwkJCQkJCQl9IGVsc2UKKwkJCQkJCQkJemVyb3NfbnVtIC09CisJCQkJCQkJCSAgICBsX247CisJCQkJCQkJcG9zX2luX2l0ZW0gPSAwOworCisJCQkJCQkJUkZBTFNFCisJCQkJCQkJICAgIChjb21wX3Nob3J0X2xlX2tleXMKKwkJCQkJCQkgICAgIChCX05fUEtFWSh0YlMwLCAwKSwKKwkJCQkJCQkgICAgICBCX05fUEtFWSh0Yi0+TFswXSwKKwkJCQkJCQkJICAgICAgIEJfTlJfSVRFTVMKKwkJCQkJCQkJICAgICAgICh0Yi0+CisJCQkJCQkJCQlMWzBdKSAtCisJCQkJCQkJCSAgICAgICAxKSkKKwkJCQkJCQkgICAgIHx8CisJCQkJCQkJICAgICAhb3BfaXNfbGVmdF9tZXJnZWFibGUKKwkJCQkJCQkgICAgIChCX05fUEtFWSh0YlMwLCAwKSwKKwkJCQkJCQkgICAgICB0YlMwLT5iX3NpemUpCisJCQkJCQkJICAgICB8fAorCQkJCQkJCSAgICAgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlCisJCQkJCQkJICAgICAoQl9OX1BERUxJTV9LRVkKKwkJCQkJCQkgICAgICAodGItPkNGTFswXSwKKwkJCQkJCQkgICAgICAgdGItPmxrZXlbMF0pLAorCQkJCQkJCSAgICAgIHRiUzAtPmJfc2l6ZSksCisJCQkJCQkJICAgICAiUEFQLTEyMTIwOiBpdGVtIG11c3QgYmUgbWVyZ2UtYWJsZSB3aXRoIGxlZnQgbmVpZ2hib3JpbmcgaXRlbSIpOworCQkJCQkJfSBlbHNlIHsJLyogb25seSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSAqLworCisJCQkJCQkJLyogQ2FsY3VsYXRlIHBvc2l0aW9uIGluIGl0ZW0gZm9yIGFwcGVuZCBpbiBTWzBdICovCisJCQkJCQkJcG9zX2luX2l0ZW0gLT0KKwkJCQkJCQkgICAgdGItPmxieXRlczsKKworCQkJCQkJCVJGQUxTRShwb3NfaW5faXRlbSA8PSAwLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMTI1OiBubyBwbGFjZSBmb3IgcGFzdGUuIHBvc19pbl9pdGVtPSVkIiwKKwkJCQkJCQkgICAgICAgcG9zX2luX2l0ZW0pOworCisJCQkJCQkJLyogU2hpZnQgbG51bVswXSAtIDEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IGxieXRlcyAtIDEgYnl0ZSBmcm9tIGl0ZW0gbnVtYmVyIGxudW1bMF0gKi8KKwkJCQkJCQlsZWFmX3NoaWZ0X2xlZnQodGIsCisJCQkJCQkJCQl0Yi0+CisJCQkJCQkJCQlsbnVtWzBdLAorCQkJCQkJCQkJdGItPgorCQkJCQkJCQkJbGJ5dGVzKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8qIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdIGluIHdob2xlICovCisKKwkJCQkJc3RydWN0IGl0ZW1faGVhZCAqcGFzdGVkOworCisJCQkJCWlmICghaXRlbV9wb3MgJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUoQl9OX1BLRVkodGJTMCwgMCksIHRiUzAtPmJfc2l6ZSkpIHsJLyogaWYgd2UgcGFzdGUgaW50byBmaXJzdCBpdGVtIG9mIFNbMF0gYW5kIGl0IGlzIGxlZnQgbWVyZ2FibGUgKi8KKwkJCQkJCS8qIHRoZW4gaW5jcmVtZW50IHBvc19pbl9pdGVtIGJ5IHRoZSBzaXplIG9mIHRoZSBsYXN0IGl0ZW0gaW4gTFswXSAqLworCQkJCQkJcGFzdGVkID0KKwkJCQkJCSAgICBCX05fUElURU1fSEVBRCh0Yi0+TFswXSwKKwkJCQkJCQkJICAgbiAtIDEpOworCQkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBhc3RlZCkpCisJCQkJCQkJcG9zX2luX2l0ZW0gKz0KKwkJCQkJCQkgICAgaWhfZW50cnlfY291bnQKKwkJCQkJCQkgICAgKHBhc3RlZCk7CisJCQkJCQllbHNlCisJCQkJCQkJcG9zX2luX2l0ZW0gKz0KKwkJCQkJCQkgICAgaWhfaXRlbV9sZW4ocGFzdGVkKTsKKwkJCQkJfQorCisJCQkJCS8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGJ5dGUgZnJvbSBpdGVtIG51bWJlciBsbnVtWzBdICovCisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLCB0Yi0+bG51bVswXSwKKwkJCQkJCQkgICAgdGItPmxieXRlcyk7CisJCQkJCS8qIEFwcGVuZCB0byBib2R5IG9mIGl0ZW0gaW4gTFswXSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IHRiLT5MWzBdOworCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJICAgIGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLAorCQkJCQkJCSAgICAgbiArIGl0ZW1fcG9zIC0KKwkJCQkJCQkgICAgIHJldF92YWwsCisJCQkJCQkJICAgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgIGJvZHksIHplcm9zX251bSk7CisKKwkJCQkJLyogaWYgYXBwZW5kZWQgaXRlbSBpcyBkaXJlY3RvcnksIHBhc3RlIGVudHJ5ICovCisJCQkJCXBhc3RlZCA9CisJCQkJCSAgICBCX05fUElURU1fSEVBRCh0Yi0+TFswXSwKKwkJCQkJCQkgICBuICsgaXRlbV9wb3MgLQorCQkJCQkJCSAgIHJldF92YWwpOworCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgocGFzdGVkKSkKKwkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS5iaV9iaCwKKwkJCQkJCQkJICAgbiArCisJCQkJCQkJCSAgIGl0ZW1fcG9zIC0KKwkJCQkJCQkJICAgcmV0X3ZhbCwKKwkJCQkJCQkJICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgIDEsCisJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJICAgICopYm9keSwKKwkJCQkJCQkJICAgYm9keSArCisJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgIFswXQorCQkJCQkJICAgICk7CisJCQkJCS8qIGlmIGFwcGVuZGVkIGl0ZW0gaXMgaW5kaXJlY3QgaXRlbSwgcHV0IHVuZm9ybWF0dGVkIG5vZGUgaW50byB1biBsaXN0ICovCisJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChwYXN0ZWQpKQorCQkJCQkJc2V0X2loX2ZyZWVfc3BhY2UocGFzdGVkLCAwKTsKKwkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJemVyb3NfbnVtID0gMDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgkvKiBjYXNlcyBkIGFuZCB0ICovCisJCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCQkgICAgICAgIlBBUC0xMjEzMDogYmFsYW5jZV9sZWFmOiBsbnVtID4gMDogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCisJCQkJCSAgICAgICAoZmxhZyA9PQorCQkJCQkJTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0KKwkJCQkJCQkJCSBNX0NVVCkKKwkJCQkJCQkJCT8gIkNVVCIKKwkJCQkJCQkJCToKKwkJCQkJCQkJCSJVTktOT1dOIiksCisJCQkJCSAgICAgICBmbGFnKTsKIAkJCX0KLQkJCWVsc2UgLyogb25seSBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtIHdpbGwgYmUgaW4gTFswXSAqLwotCQkJewotCQkJICAgIC8qIENhbGN1bGF0ZSBwb3NpdGlvbiBpbiBpdGVtIGZvciBhcHBlbmQgaW4gU1swXSAqLwotCQkJICAgIHBvc19pbl9pdGVtIC09IHRiLT5sYnl0ZXM7Ci0KLQkJCSAgICBSRkFMU0UoIHBvc19pbl9pdGVtIDw9IDAsCi0JCQkJICAgICJQQVAtMTIxMjU6IG5vIHBsYWNlIGZvciBwYXN0ZS4gcG9zX2luX2l0ZW09JWQiLCBwb3NfaW5faXRlbSk7Ci0KLQkJCSAgICAvKiBTaGlmdCBsbnVtWzBdIC0gMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgbGJ5dGVzIC0gMSBieXRlIGZyb20gaXRlbSBudW1iZXIgbG51bVswXSAqLwotCQkJICAgIGxlYWZfc2hpZnRfbGVmdCh0Yix0Yi0+bG51bVswXSx0Yi0+bGJ5dGVzKTsKLQkJCX0KLQkJICAgIH0KKwkJfSBlbHNlIHsKKwkJCS8qIG5ldyBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIExbMF0gKi8KKwkJCWxlYWZfc2hpZnRfbGVmdCh0YiwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMpOwogCQl9Ci0JCWVsc2UgLyogYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gaW4gd2hvbGUgKi8KLQkJewotCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKLQotCQkJaWYgKCAhIGl0ZW1fcG9zICAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZSAoQl9OX1BLRVkgKHRiUzAsIDApLCB0YlMwLT5iX3NpemUpICkKLQkJCXsgLyogaWYgd2UgcGFzdGUgaW50byBmaXJzdCBpdGVtIG9mIFNbMF0gYW5kIGl0IGlzIGxlZnQgbWVyZ2FibGUgKi8KLQkJCSAgICAvKiB0aGVuIGluY3JlbWVudCBwb3NfaW5faXRlbSBieSB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBpdGVtIGluIExbMF0gKi8KLQkJCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCh0Yi0+TFswXSxuLTEpOwotCQkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkgKQotCQkJCXBvc19pbl9pdGVtICs9IGloX2VudHJ5X2NvdW50KHBhc3RlZCk7Ci0JCQkgICAgZWxzZQotCQkJCXBvc19pbl9pdGVtICs9IGloX2l0ZW1fbGVuKHBhc3RlZCk7Ci0JCQl9Ci0KLQkJICAgIC8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGJ5dGUgZnJvbSBpdGVtIG51bWJlciBsbnVtWzBdICovCi0JCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLHRiLT5sYnl0ZXMpOwotCQkgICAgLyogQXBwZW5kIHRvIGJvZHkgb2YgaXRlbSBpbiBMWzBdICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sCi0JCQkJCSAgYm9keSwgemVyb3NfbnVtKTsKLQotCQkgICAgLyogaWYgYXBwZW5kZWQgaXRlbSBpcyBkaXJlY3RvcnksIHBhc3RlIGVudHJ5ICovCi0JCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCAodGItPkxbMF0sIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpOwotCQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpKQotCQkJbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCSAgICBiaS5iaV9iaCwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgcG9zX2luX2l0ZW0sIDEsIAotCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCi0JCQkgICAgKTsKLQkJICAgIC8qIGlmIGFwcGVuZGVkIGl0ZW0gaXMgaW5kaXJlY3QgaXRlbSwgcHV0IHVuZm9ybWF0dGVkIG5vZGUgaW50byB1biBsaXN0ICovCi0JCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpCi0JCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKLQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCSAgICB6ZXJvc19udW0gPSAwOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OiAgICAvKiBjYXNlcyBkIGFuZCB0ICovCi0JCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIxMzA6IGJhbGFuY2VfbGVhZjogbG51bSA+IDA6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAotCQkJCShmbGFnID09IE1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09IE1fQ1VUKSA/ICJDVVQiIDogIlVOS05PV04iKSwgZmxhZyk7Ci0JICAgIH0KLQl9IGVsc2UgeyAKLQkgICAgLyogbmV3IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gTFswXSAqLwotCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsdGItPmxudW1bMF0sdGItPmxieXRlcyk7CiAJfQotICAgIH0JLyogdGItPmxudW1bMF0gPiAwICovCiAKLSAgICAvKiBDYWxjdWxhdGUgbmV3IGl0ZW0gcG9zaXRpb24gKi8KLSAgICBpdGVtX3BvcyAtPSAoIHRiLT5sbnVtWzBdIC0gKCggdGItPmxieXRlcyAhPSAtMSApID8gMSA6IDApKTsKKwkvKiB0Yi0+bG51bVswXSA+IDAgKi8KKwkvKiBDYWxjdWxhdGUgbmV3IGl0ZW0gcG9zaXRpb24gKi8KKwlpdGVtX3BvcyAtPSAodGItPmxudW1bMF0gLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApKTsKIAotICAgIGlmICggdGItPnJudW1bMF0gPiAwICkgewotCS8qIHNoaWZ0IHJudW1bMF0gaXRlbXMgZnJvbSBTWzBdIHRvIHRoZSByaWdodCBuZWlnaGJvciBSWzBdICovCi0JbiA9IEJfTlJfSVRFTVModGJTMCk7Ci0Jc3dpdGNoICggZmxhZyApIHsKKwlpZiAodGItPnJudW1bMF0gPiAwKSB7CisJCS8qIHNoaWZ0IHJudW1bMF0gaXRlbXMgZnJvbSBTWzBdIHRvIHRoZSByaWdodCBuZWlnaGJvciBSWzBdICovCisJCW4gPSBCX05SX0lURU1TKHRiUzApOworCQlzd2l0Y2ggKGZsYWcpIHsKIAotCWNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gKi8KLQkgICAgaWYgKCBuIC0gdGItPnJudW1bMF0gPCBpdGVtX3BvcyApCi0JICAgIHsgLyogbmV3IGl0ZW0gb3IgaXRzIHBhcnQgZmFsbHMgdG8gUlswXSAqLwotCQlpZiAoIGl0ZW1fcG9zID09IG4gLSB0Yi0+cm51bVswXSArIDEgJiYgdGItPnJieXRlcyAhPSAtMSApCi0JCXsgLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIFJbMF0gKi8KLQkJICAgIGxvZmZfdCBvbGRfa2V5X2NvbXAsIG9sZF9sZW4sIHJfemVyb3NfbnVtYmVyOwotCQkgICAgY29uc3QgY2hhciAqIHJfYm9keTsKLQkJICAgIGludCB2ZXJzaW9uOwotCQkgICAgbG9mZl90IG9mZnNldDsKKwkJY2FzZSBNX0lOU0VSVDoJLyogaW5zZXJ0IGl0ZW0gKi8KKwkJCWlmIChuIC0gdGItPnJudW1bMF0gPCBpdGVtX3BvcykgewkvKiBuZXcgaXRlbSBvciBpdHMgcGFydCBmYWxscyB0byBSWzBdICovCisJCQkJaWYgKGl0ZW1fcG9zID09IG4gLSB0Yi0+cm51bVswXSArIDEgJiYgdGItPnJieXRlcyAhPSAtMSkgewkvKiBwYXJ0IG9mIG5ldyBpdGVtIGZhbGxzIGludG8gUlswXSAqLworCQkJCQlsb2ZmX3Qgb2xkX2tleV9jb21wLCBvbGRfbGVuLAorCQkJCQkgICAgcl96ZXJvc19udW1iZXI7CisJCQkJCWNvbnN0IGNoYXIgKnJfYm9keTsKKwkJCQkJaW50IHZlcnNpb247CisJCQkJCWxvZmZfdCBvZmZzZXQ7CiAKLQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0tMSwtMSk7CisJCQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsIHRiLT5ybnVtWzBdIC0gMSwKKwkJCQkJCQkgLTEpOwogCi0JCSAgICB2ZXJzaW9uID0gaWhfdmVyc2lvbihpaCk7Ci0JCSAgICAvKiBSZW1lbWJlciBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICBvbGRfa2V5X2NvbXAgPSBsZV9paF9rX29mZnNldCggaWggKTsKLQkJICAgIG9sZF9sZW4gPSBpaF9pdGVtX2xlbihpaCk7CisJCQkJCXZlcnNpb24gPSBpaF92ZXJzaW9uKGloKTsKKwkJCQkJLyogUmVtZW1iZXIga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggKi8KKwkJCQkJb2xkX2tleV9jb21wID0gbGVfaWhfa19vZmZzZXQoaWgpOworCQkJCQlvbGRfbGVuID0gaWhfaXRlbV9sZW4oaWgpOwogCi0JCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gUlswXSAqLwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZV9paF9rX29mZnNldCggaWggKSArICgob2xkX2xlbiAtIHRiLT5yYnl0ZXMgKTw8KGlzX2luZGlyZWN0X2xlX2loKGloKT90Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQ6MCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBvZmZzZXQgKTsKLQkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIHRiLT5yYnl0ZXMpOwotCQkgICAgLyogSW5zZXJ0IHBhcnQgb2YgdGhlIGl0ZW0gaW50byBSWzBdICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0Yi0+UlswXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCSAgICBpZiAoIChvbGRfbGVuIC0gdGItPnJieXRlcykgPiB6ZXJvc19udW0gKSB7Ci0JCQlyX3plcm9zX251bWJlciA9IDA7Ci0JCQlyX2JvZHkgPSBib2R5ICsgKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzKSAtIHplcm9zX251bTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJcl9ib2R5ID0gYm9keTsKLQkJCXJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzKTsKLQkJCXplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKLQkJICAgIH0KKwkJCQkJLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFJbMF0gKi8KKwkJCQkJb2Zmc2V0ID0KKwkJCQkJICAgIGxlX2loX2tfb2Zmc2V0KGloKSArCisJCQkJCSAgICAoKG9sZF9sZW4gLQorCQkJCQkgICAgICB0Yi0+CisJCQkJCSAgICAgIHJieXRlcykgPDwgKGlzX2luZGlyZWN0X2xlX2loKGloKQorCQkJCQkJCSAgPyB0Yi0+dGJfc2ItPgorCQkJCQkJCSAgc19ibG9ja3NpemVfYml0cyAtCisJCQkJCQkJICBVTkZNX1BfU0hJRlQgOiAwKSk7CisJCQkJCXNldF9sZV9paF9rX29mZnNldChpaCwgb2Zmc2V0KTsKKwkJCQkJcHV0X2loX2l0ZW1fbGVuKGloLCB0Yi0+cmJ5dGVzKTsKKwkJCQkJLyogSW5zZXJ0IHBhcnQgb2YgdGhlIGl0ZW0gaW50byBSWzBdICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkgICAgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJCQkJaWYgKChvbGRfbGVuIC0gdGItPnJieXRlcykgPiB6ZXJvc19udW0pIHsKKwkJCQkJCXJfemVyb3NfbnVtYmVyID0gMDsKKwkJCQkJCXJfYm9keSA9CisJCQkJCQkgICAgYm9keSArIChvbGRfbGVuIC0KKwkJCQkJCQkgICAgdGItPnJieXRlcykgLQorCQkJCQkJICAgIHplcm9zX251bTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJfYm9keSA9IGJvZHk7CisJCQkJCQlyX3plcm9zX251bWJlciA9CisJCQkJCQkgICAgemVyb3NfbnVtIC0gKG9sZF9sZW4gLQorCQkJCQkJCQkgdGItPnJieXRlcyk7CisJCQkJCQl6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7CisJCQkJCX0KIAotCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgMCwgaWgsIHJfYm9keSwgcl96ZXJvc19udW1iZXIpOworCQkJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksIDAsIGloLCByX2JvZHksCisJCQkJCQkJICAgICByX3plcm9zX251bWJlcik7CiAKLQkJICAgIC8qIFJlcGxhY2UgcmlnaHQgZGVsaW1pdGluZyBrZXkgYnkgZmlyc3Qga2V5IGluIFJbMF0gKi8KLQkJICAgIHJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdLHRiLT5SWzBdLDApOworCQkJCQkvKiBSZXBsYWNlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGJ5IGZpcnN0IGtleSBpbiBSWzBdICovCisJCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSwKKwkJCQkJCSAgICB0Yi0+UlswXSwgMCk7CiAKLQkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTWzBdICovCi0gICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsIG9sZF9rZXlfY29tcCApOwotCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgb2xkX2xlbiAtIHRiLT5yYnl0ZXMgKTsKKwkJCQkJLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNbMF0gKi8KKwkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLCBvbGRfa2V5X2NvbXApOworCQkJCQlwdXRfaWhfaXRlbV9sZW4oaWgsCisJCQkJCQkJb2xkX2xlbiAtIHRiLT5yYnl0ZXMpOwogCi0JCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gdGItPnJieXRlczsKKwkJCQkJdGItPmluc2VydF9zaXplWzBdIC09IHRiLT5yYnl0ZXM7CiAKLQkJfQotCQllbHNlIC8qIHdob2xlIG5ldyBpdGVtIGZhbGxzIGludG8gUlswXSAqLwotCQl7CQkJCQkgIAotCQkgICAgLyogU2hpZnQgcm51bVswXS0xIGl0ZW1zIHRvIFJbMF0gKi8KLQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLTEsdGItPnJieXRlcyk7Ci0JCSAgICAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBSWzBdICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSB0Yi0+UlswXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSAtIDEsIGloLCBib2R5LCB6ZXJvc19udW0pOworCQkJCX0gZWxzZSB7CS8qIHdob2xlIG5ldyBpdGVtIGZhbGxzIGludG8gUlswXSAqLwogCi0JCSAgICBpZiAoIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdIC0gMSA9PSAwICkgewotCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRlJbMF0sdGItPnJrZXlbMF0sdGItPlJbMF0sMCk7CisJCQkJCS8qIFNoaWZ0IHJudW1bMF0tMSBpdGVtcyB0byBSWzBdICovCisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0YiwKKwkJCQkJCQkgICAgIHRiLT5ybnVtWzBdIC0gMSwKKwkJCQkJCQkgICAgIHRiLT5yYnl0ZXMpOworCQkJCQkvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBSWzBdICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJCQkJYmkuYmlfcG9zaXRpb24gPQorCQkJCQkgICAgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLAorCQkJCQkJCSAgICAgaXRlbV9wb3MgLSBuICsKKwkJCQkJCQkgICAgIHRiLT5ybnVtWzBdIC0gMSwKKwkJCQkJCQkgICAgIGloLCBib2R5LAorCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKIAotCQkgICAgfQotCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgLyogbmV3IGl0ZW0gb3IgcGFydCBvZiBpdCBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCi0JICAgIHsKLQkJbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKLQkgICAgfQotCSAgICBicmVhazsKKwkJCQkJaWYgKGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdIC0gMSA9PSAwKSB7CisJCQkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSwKKwkJCQkJCQkgICAgdGItPnJrZXlbMF0sCisJCQkJCQkJICAgIHRiLT5SWzBdLCAwKTsKIAotCWNhc2UgTV9QQVNURTogICAvKiBhcHBlbmQgaXRlbSAqLworCQkJCQl9CisJCQkJCXplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsJLyogbmV3IGl0ZW0gb3IgcGFydCBvZiBpdCBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCiAKLQkgICAgaWYgKCBuIC0gdGItPnJudW1bMF0gPD0gaXRlbV9wb3MgKSAgLyogcGFzdGVkIGl0ZW0gb3IgcGFydCBvZiBpdCBmYWxscyB0byBSWzBdICovCi0JICAgIHsKLQkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gdGItPnJudW1bMF0gJiYgdGItPnJieXRlcyAhPSAtMSApCi0JCXsgLyogd2UgbXVzdCBzaGlmdCB0aGUgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLwotCQkgICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKSkKLQkJICAgIHsgLyogd2UgYXBwZW5kIHRvIGRpcmVjdG9yeSBpdGVtICovCi0JCQlpbnQgZW50cnlfY291bnQ7Ci0KLQkJCVJGQUxTRSggemVyb3NfbnVtLAotCQkJCSJQQVAtMTIxNDU6IGludmFsaWQgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBkaXJlY3RvcnkiKTsKLQkJCWVudHJ5X2NvdW50ID0gSV9FTlRSWV9DT1VOVChCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3BvcykpOwotCQkJaWYgKCBlbnRyeV9jb3VudCAtIHRiLT5yYnl0ZXMgPCBwb3NfaW5faXRlbSApCi0JCQkgICAgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIFJbMF0gKi8KLQkJCXsKLQkJCSAgICBpbnQgcGFzdGVfZW50cnlfcG9zaXRpb247Ci0KLQkJCSAgICBSRkFMU0UoIHRiLT5yYnl0ZXMgLSAxID49IGVudHJ5X2NvdW50IHx8IAotCQkJCSAgICAhIHRiLT5pbnNlcnRfc2l6ZVswXSwKLQkJCQkgICAgIlBBUC0xMjE1MDogbm8gZW5vdWdoIG9mIGVudHJpZXMgdG8gc2hpZnQgdG8gUlswXTogcmJ5dGVzPSVkLCBlbnRyeV9jb3VudD0lZCIsCi0JCQkJICAgIHRiLT5yYnl0ZXMsIGVudHJ5X2NvdW50KTsKLQkJCSAgICAvKiBTaGlmdCBybnVtWzBdLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IHJieXRlcy0xIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gZGlyZWN0b3J5IGl0ZW0gbnVtYmVyIHJudW1bMF0gKi8KLQkJCSAgICBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMgLSAxKTsKLQkJCSAgICAvKiBQYXN0ZSBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KLQkJCSAgICBwYXN0ZV9lbnRyeV9wb3NpdGlvbiA9IHBvc19pbl9pdGVtIC0gZW50cnlfY291bnQgKyB0Yi0+cmJ5dGVzIC0gMTsKLQkJCSAgICBiaS50YiA9IHRiOwotCQkJICAgIGJpLmJpX2JoID0gdGItPlJbMF07Ci0JCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOwotCQkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgMCwgcGFzdGVfZW50cnlfcG9zaXRpb24sCi0JCQkJCQkgIHRiLT5pbnNlcnRfc2l6ZVswXSxib2R5LHplcm9zX251bSk7Ci0JCQkgICAgLyogcGFzdGUgZW50cnkgKi8KLQkJCSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKAotCQkJCWJpLmJpX2JoLCAwLCBwYXN0ZV9lbnRyeV9wb3NpdGlvbiwgMSwgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgCi0JCQkJYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCQkpOwkJCQkJCQkJCi0JCQkJCQkKLQkJCSAgICBpZiAoIHBhc3RlX2VudHJ5X3Bvc2l0aW9uID09IDAgKSB7Ci0JCQkJLyogY2hhbmdlIGRlbGltaXRpbmcga2V5cyAqLwotCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdLHRiLT5SWzBdLDApOwotCQkJICAgIH0KLQotCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCQkgICAgcG9zX2luX2l0ZW0rKzsKKwkJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLCB0Yi0+cm51bVswXSwgdGItPnJieXRlcyk7CiAJCQl9Ci0JCQllbHNlIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZG9lc24ndCBmYWxsIGludG8gUlswXSAqLwotCQkJewotCQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICBlbHNlIC8qIHJlZ3VsYXIgb2JqZWN0ICovCi0JCSAgICB7Ci0JCQlpbnQgbl9zaGlmdCwgbl9yZW0sIHJfemVyb3NfbnVtYmVyOwotCQkJY29uc3QgY2hhciAqIHJfYm9keTsKKwkJCWJyZWFrOwogCi0JCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgYmUgc2hpZnRlZCBmcm9tIGFwcGVuZGVkIGl0ZW0gKi8KLQkJCWlmICggKG5fc2hpZnQgPSB0Yi0+cmJ5dGVzIC0gdGItPmluc2VydF9zaXplWzBdKSA8IDAgKQotCQkJICAgIG5fc2hpZnQgPSAwOworCQljYXNlIE1fUEFTVEU6CS8qIGFwcGVuZCBpdGVtICovCiAKLQkJCVJGQUxTRShwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpKSwKLQkJCSAgICAgICAiUEFQLTEyMTU1OiBpbnZhbGlkIHBvc2l0aW9uIHRvIHBhc3RlLiBpaF9pdGVtX2xlbj0lZCwgcG9zX2luX2l0ZW09JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19pbl9pdGVtLCBpaF9pdGVtX2xlbiggQl9OX1BJVEVNX0hFQUQodGJTMCxpdGVtX3BvcykpKTsKKwkJCWlmIChuIC0gdGItPnJudW1bMF0gPD0gaXRlbV9wb3MpIHsJLyogcGFzdGVkIGl0ZW0gb3IgcGFydCBvZiBpdCBmYWxscyB0byBSWzBdICovCisJCQkJaWYgKGl0ZW1fcG9zID09IG4gLSB0Yi0+cm51bVswXSAmJiB0Yi0+cmJ5dGVzICE9IC0xKSB7CS8qIHdlIG11c3Qgc2hpZnQgdGhlIHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KKwkJCQkJaWYgKGlzX2RpcmVudHJ5X2xlX2loKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSkpIHsJLyogd2UgYXBwZW5kIHRvIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCQlpbnQgZW50cnlfY291bnQ7CiAKLQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sbl9zaGlmdCk7Ci0JCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgcmVtYWluIGluIGJvZHkgYWZ0ZXIgYXBwZW5kaW5nIHRvIFJbMF0gKi8KLQkJCWlmICggKG5fcmVtID0gdGItPmluc2VydF9zaXplWzBdIC0gdGItPnJieXRlcykgPCAwICkKLQkJCSAgICBuX3JlbSA9IDA7Ci0JCQkKLQkJCXsKLQkJCSAgaW50IHZlcnNpb247Ci0JCQkgIHVuc2lnbmVkIGxvbmcgdGVtcF9yZW0gPSBuX3JlbTsKLQkJCSAgCi0JCQkgIHZlcnNpb24gPSBpaF92ZXJzaW9uIChCX05fUElURU1fSEVBRCAodGItPlJbMF0sMCkpOwotCQkJICBpZiAoaXNfaW5kaXJlY3RfbGVfa2V5KHZlcnNpb24sQl9OX1BLRVkodGItPlJbMF0sMCkpKXsKLQkJCSAgICAgIHRlbXBfcmVtID0gbl9yZW0gPDwgKHRiLT50Yl9zYi0+c19ibG9ja3NpemVfYml0cyAtCi0JCQkJCSBVTkZNX1BfU0hJRlQpOwotCQkJICB9Ci0JCQkgIHNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QS0VZKHRiLT5SWzBdLDApLCAKLQkJCQkJICAgICAgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkodGItPlJbMF0sMCkpICsgdGVtcF9yZW0pOwotCQkJICBzZXRfbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdKSwgCi0JCQkJCSAgICAgICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbMF0sdGItPnJrZXlbMF0pKSArIHRlbXBfcmVtKTsKLQkJCX0KKwkJCQkJCVJGQUxTRSh6ZXJvc19udW0sCisJCQkJCQkgICAgICAgIlBBUC0xMjE0NTogaW52YWxpZCBwYXJhbWV0ZXIgaW4gY2FzZSBvZiBhIGRpcmVjdG9yeSIpOworCQkJCQkJZW50cnlfY291bnQgPQorCQkJCQkJICAgIElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkJICAodGJTMCwKKwkJCQkJCQkJICAgaXRlbV9wb3MpKTsKKwkJCQkJCWlmIChlbnRyeV9jb3VudCAtIHRiLT5yYnl0ZXMgPAorCQkJCQkJICAgIHBvc19pbl9pdGVtKQorCQkJCQkJCS8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBSWzBdICovCisJCQkJCQl7CisJCQkJCQkJaW50IHBhc3RlX2VudHJ5X3Bvc2l0aW9uOworCisJCQkJCQkJUkZBTFNFKHRiLT5yYnl0ZXMgLSAxID49CisJCQkJCQkJICAgICAgIGVudHJ5X2NvdW50CisJCQkJCQkJICAgICAgIHx8ICF0Yi0+CisJCQkJCQkJICAgICAgIGluc2VydF9zaXplWzBdLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMTUwOiBubyBlbm91Z2ggb2YgZW50cmllcyB0byBzaGlmdCB0byBSWzBdOiByYnl0ZXM9JWQsIGVudHJ5X2NvdW50PSVkIiwKKwkJCQkJCQkgICAgICAgdGItPnJieXRlcywKKwkJCQkJCQkgICAgICAgZW50cnlfY291bnQpOworCQkJCQkJCS8qIFNoaWZ0IHJudW1bMF0tMSBpdGVtcyBpbiB3aG9sZS4gU2hpZnQgcmJ5dGVzLTEgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgcm51bVswXSAqLworCQkJCQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsCisJCQkJCQkJCQkgdGItPgorCQkJCQkJCQkJIHJudW0KKwkJCQkJCQkJCSBbMF0sCisJCQkJCQkJCQkgdGItPgorCQkJCQkJCQkJIHJieXRlcworCQkJCQkJCQkJIC0gMSk7CisJCQkJCQkJLyogUGFzdGUgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCisJCQkJCQkJcGFzdGVfZW50cnlfcG9zaXRpb24gPQorCQkJCQkJCSAgICBwb3NfaW5faXRlbSAtCisJCQkJCQkJICAgIGVudHJ5X2NvdW50ICsKKwkJCQkJCQkgICAgdGItPnJieXRlcyAtIDE7CisJCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCQliaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJCQkJCWJpLmJpX3BhcmVudCA9CisJCQkJCQkJICAgIHRiLT5GUlswXTsKKwkJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkJICAgIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbgorCQkJCQkJCSAgICAodGIsIDApOworCQkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyCisJCQkJCQkJICAgICgmYmksIDAsCisJCQkJCQkJICAgICBwYXN0ZV9lbnRyeV9wb3NpdGlvbiwKKwkJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgIGJvZHksIHplcm9zX251bSk7CisJCQkJCQkJLyogcGFzdGUgZW50cnkgKi8KKwkJCQkJCQlsZWFmX3Bhc3RlX2VudHJpZXMoYmkuCisJCQkJCQkJCQkgICBiaV9iaCwKKwkJCQkJCQkJCSAgIDAsCisJCQkJCQkJCQkgICBwYXN0ZV9lbnRyeV9wb3NpdGlvbiwKKwkJCQkJCQkJCSAgIDEsCisJCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkJICAgICopCisJCQkJCQkJCQkgICBib2R5LAorCQkJCQkJCQkJICAgYm9keQorCQkJCQkJCQkJICAgKworCQkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkJICAgWzBdCisJCQkJCQkJICAgICk7CisKKwkJCQkJCQlpZiAocGFzdGVfZW50cnlfcG9zaXRpb24KKwkJCQkJCQkgICAgPT0gMCkgeworCQkJCQkJCQkvKiBjaGFuZ2UgZGVsaW1pdGluZyBrZXlzICovCisJCQkJCQkJCXJlcGxhY2Vfa2V5KHRiLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBDRlIKKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIHJrZXkKKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIFIKKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgMCk7CisJCQkJCQkJfQorCisJCQkJCQkJdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQkJCQlwb3NfaW5faXRlbSsrOworCQkJCQkJfSBlbHNlIHsJLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCisKKwkJCQkJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLAorCQkJCQkJCQkJIHRiLT4KKwkJCQkJCQkJCSBybnVtCisJCQkJCQkJCQkgWzBdLAorCQkJCQkJCQkJIHRiLT4KKwkJCQkJCQkJCSByYnl0ZXMpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgewkvKiByZWd1bGFyIG9iamVjdCAqLworCisJCQkJCQlpbnQgbl9zaGlmdCwgbl9yZW0sCisJCQkJCQkgICAgcl96ZXJvc19udW1iZXI7CisJCQkJCQljb25zdCBjaGFyICpyX2JvZHk7CisKKwkJCQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCBiZSBzaGlmdGVkIGZyb20gYXBwZW5kZWQgaXRlbSAqLworCQkJCQkJaWYgKChuX3NoaWZ0ID0KKwkJCQkJCSAgICAgdGItPnJieXRlcyAtCisJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSkgPCAwKQorCQkJCQkJCW5fc2hpZnQgPSAwOworCisJCQkJCQlSRkFMU0UocG9zX2luX2l0ZW0gIT0KKwkJCQkJCSAgICAgICBpaF9pdGVtX2xlbgorCQkJCQkJICAgICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSh0YlMwLCBpdGVtX3BvcykpLAorCQkJCQkJICAgICAgICJQQVAtMTIxNTU6IGludmFsaWQgcG9zaXRpb24gdG8gcGFzdGUuIGloX2l0ZW1fbGVuPSVkLCBwb3NfaW5faXRlbT0lZCIsCisJCQkJCQkgICAgICAgcG9zX2luX2l0ZW0sCisJCQkJCQkgICAgICAgaWhfaXRlbV9sZW4KKwkJCQkJCSAgICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkodGJTMCwgaXRlbV9wb3MpKSk7CisKKwkJCQkJCWxlYWZfc2hpZnRfcmlnaHQodGIsCisJCQkJCQkJCSB0Yi0+cm51bVswXSwKKwkJCQkJCQkJIG5fc2hpZnQpOworCQkJCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IHJlbWFpbiBpbiBib2R5IGFmdGVyIGFwcGVuZGluZyB0byBSWzBdICovCisJCQkJCQlpZiAoKG5fcmVtID0KKwkJCQkJCSAgICAgdGItPmluc2VydF9zaXplWzBdIC0KKwkJCQkJCSAgICAgdGItPnJieXRlcykgPCAwKQorCQkJCQkJCW5fcmVtID0gMDsKKworCQkJCQkJeworCQkJCQkJCWludCB2ZXJzaW9uOworCQkJCQkJCXVuc2lnbmVkIGxvbmcgdGVtcF9yZW0gPQorCQkJCQkJCSAgICBuX3JlbTsKKworCQkJCQkJCXZlcnNpb24gPQorCQkJCQkJCSAgICBpaF92ZXJzaW9uCisJCQkJCQkJICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSAgICAgKHRiLT5SWzBdLCAwKSk7CisJCQkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2tleQorCQkJCQkJCSAgICAodmVyc2lvbiwKKwkJCQkJCQkgICAgIEJfTl9QS0VZKHRiLT5SWzBdLAorCQkJCQkJCQkgICAgICAwKSkpIHsKKwkJCQkJCQkJdGVtcF9yZW0gPQorCQkJCQkJCQkgICAgbl9yZW0gPDwKKwkJCQkJCQkJICAgICh0Yi0+dGJfc2ItPgorCQkJCQkJCQkgICAgIHNfYmxvY2tzaXplX2JpdHMKKwkJCQkJCQkJICAgICAtCisJCQkJCQkJCSAgICAgVU5GTV9QX1NISUZUKTsKKwkJCQkJCQl9CisJCQkJCQkJc2V0X2xlX2tleV9rX29mZnNldAorCQkJCQkJCSAgICAodmVyc2lvbiwKKwkJCQkJCQkgICAgIEJfTl9QS0VZKHRiLT5SWzBdLAorCQkJCQkJCQkgICAgICAwKSwKKwkJCQkJCQkgICAgIGxlX2tleV9rX29mZnNldAorCQkJCQkJCSAgICAgKHZlcnNpb24sCisJCQkJCQkJICAgICAgQl9OX1BLRVkodGItPlJbMF0sCisJCQkJCQkJCSAgICAgICAwKSkgKworCQkJCQkJCSAgICAgdGVtcF9yZW0pOworCQkJCQkJCXNldF9sZV9rZXlfa19vZmZzZXQKKwkJCQkJCQkgICAgKHZlcnNpb24sCisJCQkJCQkJICAgICBCX05fUERFTElNX0tFWSh0Yi0+CisJCQkJCQkJCQkgICAgQ0ZSCisJCQkJCQkJCQkgICAgWzBdLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBya2V5CisJCQkJCQkJCQkgICAgWzBdKSwKKwkJCQkJCQkgICAgIGxlX2tleV9rX29mZnNldAorCQkJCQkJCSAgICAgKHZlcnNpb24sCisJCQkJCQkJICAgICAgQl9OX1BERUxJTV9LRVkKKwkJCQkJCQkgICAgICAodGItPkNGUlswXSwKKwkJCQkJCQkgICAgICAgdGItPnJrZXlbMF0pKSArCisJCQkJCQkJICAgICB0ZW1wX3JlbSk7CisJCQkJCQl9CiAvKgkJICBrX29mZnNldCAoQl9OX1BLRVkodGItPlJbMF0sMCkpICs9IG5fcmVtOwogCQkgIGtfb2Zmc2V0IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdKSkgKz0gbl9yZW07Ki8KLQkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIHRiLT5DRlJbMF0sIDApOworCQkJCQkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5CisJCQkJCQkgICAgKHRiLCB0Yi0+Q0ZSWzBdLCAwKTsKIAotCQkJLyogQXBwZW5kIHBhcnQgb2YgYm9keSBpbnRvIFJbMF0gKi8KLQkJCWJpLnRiID0gdGI7Ci0JCQliaS5iaV9iaCA9IHRiLT5SWzBdOwotCQkJYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOwotCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkJCWlmICggbl9yZW0gPiB6ZXJvc19udW0gKSB7Ci0JCQkgICAgcl96ZXJvc19udW1iZXIgPSAwOwotCQkJICAgIHJfYm9keSA9IGJvZHkgKyBuX3JlbSAtIHplcm9zX251bTsKLQkJCX0KLQkJCWVsc2UgewotCQkJICAgIHJfYm9keSA9IGJvZHk7Ci0JCQkgICAgcl96ZXJvc19udW1iZXIgPSB6ZXJvc19udW0gLSBuX3JlbTsKLQkJCSAgICB6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7Ci0JCQl9CisJCQkJCQkvKiBBcHBlbmQgcGFydCBvZiBib2R5IGludG8gUlswXSAqLworCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkgICAgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uCisJCQkJCQkgICAgKHRiLCAwKTsKKwkJCQkJCWlmIChuX3JlbSA+IHplcm9zX251bSkgeworCQkJCQkJCXJfemVyb3NfbnVtYmVyID0gMDsKKwkJCQkJCQlyX2JvZHkgPQorCQkJCQkJCSAgICBib2R5ICsgbl9yZW0gLQorCQkJCQkJCSAgICB6ZXJvc19udW07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJfYm9keSA9IGJvZHk7CisJCQkJCQkJcl96ZXJvc19udW1iZXIgPQorCQkJCQkJCSAgICB6ZXJvc19udW0gLSBuX3JlbTsKKwkJCQkJCQl6ZXJvc19udW0gLT0KKwkJCQkJCQkgICAgcl96ZXJvc19udW1iZXI7CisJCQkJCQl9CiAKLQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgMCwgbl9zaGlmdCwgdGItPmluc2VydF9zaXplWzBdIC0gbl9yZW0sIHJfYm9keSwgcl96ZXJvc19udW1iZXIpOworCQkJCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCAwLAorCQkJCQkJCQkgICAgIG5fc2hpZnQsCisJCQkJCQkJCSAgICAgdGItPgorCQkJCQkJCQkgICAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgICAgWzBdIC0KKwkJCQkJCQkJICAgICBuX3JlbSwKKwkJCQkJCQkJICAgICByX2JvZHksCisJCQkJCQkJCSAgICAgcl96ZXJvc19udW1iZXIpOwogCi0JCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWggKEJfTl9QSVRFTV9IRUFEKHRiLT5SWzBdLDApKSkgeworCQkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loCisJCQkJCQkgICAgKEJfTl9QSVRFTV9IRUFECisJCQkJCQkgICAgICh0Yi0+UlswXSwgMCkpKSB7CiAjaWYgMAotCQkJICAgIFJGQUxTRSggbl9yZW0sCi0JCQkJICAgICJQQVAtMTIxNjA6IHBhc3RlIG1vcmUgdGhhbiBvbmUgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIik7CisJCQkJCQkJUkZBTFNFKG5fcmVtLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMTYwOiBwYXN0ZSBtb3JlIHRoYW4gb25lIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciIpOwogI2VuZGlmCi0JCQkgICAgc2V0X2loX2ZyZWVfc3BhY2UgKEJfTl9QSVRFTV9IRUFEKHRiLT5SWzBdLDApLCAwKTsKLQkJCX0KLQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IG5fcmVtOwotCQkJaWYgKCAhIG5fcmVtICkKLQkJCSAgICBwb3NfaW5faXRlbSArKzsKLQkJICAgIH0KLQkJfQotCQllbHNlIC8qIHBhc3RlZCBpdGVtIGluIHdob2xlIGZhbGxzIGludG8gUlswXSAqLwotCQl7Ci0JCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOworCQkJCQkJCXNldF9paF9mcmVlX3NwYWNlCisJCQkJCQkJICAgIChCX05fUElURU1fSEVBRAorCQkJCQkJCSAgICAgKHRiLT5SWzBdLCAwKSwgMCk7CisJCQkJCQl9CisJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3JlbTsKKwkJCQkJCWlmICghbl9yZW0pCisJCQkJCQkJcG9zX2luX2l0ZW0rKzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8qIHBhc3RlZCBpdGVtIGluIHdob2xlIGZhbGxzIGludG8gUlswXSAqLwogCi0JCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKLQkJICAgIC8qIGFwcGVuZCBpdGVtIGluIFJbMF0gKi8KLQkJICAgIGlmICggcG9zX2luX2l0ZW0gPj0gMCApIHsKKwkJCQkJc3RydWN0IGl0ZW1faGVhZCAqcGFzdGVkOworCisJCQkJCXJldF92YWwgPQorCQkJCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0sCisJCQkJCQkJICAgICB0Yi0+cmJ5dGVzKTsKKwkJCQkJLyogYXBwZW5kIGl0ZW0gaW4gUlswXSAqLworCQkJCQlpZiAocG9zX2luX2l0ZW0gPj0gMCkgeworCQkJCQkJYmkudGIgPSB0YjsKKwkJCQkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQkJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkgICAgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uCisJCQkJCQkgICAgKHRiLCAwKTsKKwkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwKKwkJCQkJCQkJICAgICBpdGVtX3BvcyAtCisJCQkJCQkJCSAgICAgbiArCisJCQkJCQkJCSAgICAgdGItPgorCQkJCQkJCQkgICAgIHJudW1bMF0sCisJCQkJCQkJCSAgICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgICAgdGItPgorCQkJCQkJCQkgICAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgICAgWzBdLCBib2R5LAorCQkJCQkJCQkgICAgIHplcm9zX251bSk7CisJCQkJCX0KKworCQkJCQkvKiBwYXN0ZSBuZXcgZW50cnksIGlmIGl0ZW0gaXMgZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCQkJcGFzdGVkID0KKwkJCQkJICAgIEJfTl9QSVRFTV9IRUFEKHRiLT5SWzBdLAorCQkJCQkJCSAgIGl0ZW1fcG9zIC0gbiArCisJCQkJCQkJICAgdGItPnJudW1bMF0pOworCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgocGFzdGVkKQorCQkJCQkgICAgJiYgcG9zX2luX2l0ZW0gPj0gMCkgeworCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLmJpX2JoLAorCQkJCQkJCQkgICBpdGVtX3BvcyAtCisJCQkJCQkJCSAgIG4gKworCQkJCQkJCQkgICB0Yi0+cm51bVswXSwKKwkJCQkJCQkJICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgIDEsCisJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJICAgIHJlaXNlcmZzX2RlX2hlYWQKKwkJCQkJCQkJICAgICopYm9keSwKKwkJCQkJCQkJICAgYm9keSArCisJCQkJCQkJCSAgIERFSF9TSVpFLAorCQkJCQkJCQkgICB0Yi0+CisJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgIFswXQorCQkJCQkJICAgICk7CisJCQkJCQlpZiAoIXBvc19pbl9pdGVtKSB7CisKKwkJCQkJCQlSRkFMU0UoaXRlbV9wb3MgLSBuICsKKwkJCQkJCQkgICAgICAgdGItPnJudW1bMF0sCisJCQkJCQkJICAgICAgICJQQVAtMTIxNjU6IGRpcmVjdG9yeSBpdGVtIG11c3QgYmUgZmlyc3QgaXRlbSBvZiBub2RlIHdoZW4gcGFzdGluZyBpcyBpbiAwdGggcG9zaXRpb24iKTsKKworCQkJCQkJCS8qIHVwZGF0ZSBkZWxpbWl0aW5nIGtleXMgKi8KKwkJCQkJCQlyZXBsYWNlX2tleSh0YiwKKwkJCQkJCQkJICAgIHRiLT5DRlJbMF0sCisJCQkJCQkJCSAgICB0Yi0+cmtleVswXSwKKwkJCQkJCQkJICAgIHRiLT5SWzBdLAorCQkJCQkJCQkgICAgMCk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgocGFzdGVkKSkKKwkJCQkJCXNldF9paF9mcmVlX3NwYWNlKHBhc3RlZCwgMCk7CisJCQkJCXplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJfQorCQkJfSBlbHNlIHsJLyogbmV3IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gUlswXSAqLworCisJCQkJbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0sIHRiLT5yYnl0ZXMpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CS8qIGNhc2VzIGQgYW5kIHQgKi8KKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC0xMjE3NTogYmFsYW5jZV9sZWFmOiBybnVtID4gMDogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCisJCQkJICAgICAgIChmbGFnID09CisJCQkJCU1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09CisJCQkJCQkJCSBNX0NVVCkgPyAiQ1VUIgorCQkJCQkJCQk6ICJVTktOT1dOIiksCisJCQkJICAgICAgIGZsYWcpOworCQl9CisKKwl9CisKKwkvKiB0Yi0+cm51bVswXSA+IDAgKi8KKwlSRkFMU0UodGItPmJsa251bVswXSA+IDMsCisJICAgICAgICJQQVAtMTIxODA6IGJsa251bSBjYW4gbm90IGJlICVkLiBJdCBtdXN0IGJlIDw9IDMiLAorCSAgICAgICB0Yi0+YmxrbnVtWzBdKTsKKwlSRkFMU0UodGItPmJsa251bVswXSA8IDAsCisJICAgICAgICJQQVAtMTIxODU6IGJsa251bSBjYW4gbm90IGJlICVkLiBJdCBtdXN0IGJlID49IDAiLAorCSAgICAgICB0Yi0+YmxrbnVtWzBdKTsKKworCS8qIGlmIHdoaWxlIGFkZGluZyB0byBhIG5vZGUgd2UgZGlzY292ZXIgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBzcGxpdAorCSAgIGl0IGluIHR3bywgYW5kIG1lcmdlIHRoZSBsZWZ0IHBhcnQgaW50byB0aGUgbGVmdCBuZWlnaGJvciBhbmQgdGhlCisJICAgcmlnaHQgcGFydCBpbnRvIHRoZSByaWdodCBuZWlnaGJvciwgZWxpbWluYXRpbmcgdGhlIG5vZGUgKi8KKwlpZiAodGItPmJsa251bVswXSA9PSAwKSB7CS8qIG5vZGUgU1swXSBpcyBlbXB0eSBub3cgKi8KKworCQlSRkFMU0UoIXRiLT5sbnVtWzBdIHx8ICF0Yi0+cm51bVswXSwKKwkJICAgICAgICJQQVAtMTIxOTA6IGxudW0gYW5kIHJudW0gbXVzdCBub3QgYmUgemVybyIpOworCQkvKiBpZiBpbnNlcnRpb24gd2FzIGRvbmUgYmVmb3JlIDAtdGggcG9zaXRpb24gaW4gUlswXSwgcmlnaHQKKwkJICAgZGVsaW1pdGluZyBrZXkgb2YgdGhlIHRiLT5MWzBdJ3MgYW5kIGxlZnQgZGVsaW1pdGluZyBrZXkgYXJlCisJCSAgIG5vdCBzZXQgY29ycmVjdGx5ICovCisJCWlmICh0Yi0+Q0ZMWzBdKSB7CisJCQlpZiAoIXRiLT5DRlJbMF0pCisJCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCQkgICAgICAgInZzLTEyMTk1OiBiYWxhbmNlX2xlYWY6IENGUiBub3QgaW5pdGlhbGl6ZWQiKTsKKwkJCWNvcHlfa2V5KEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdKSwKKwkJCQkgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSwgdGItPnJrZXlbMF0pKTsKKwkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSh0YiwgdGItPkNGTFswXSwgMCk7CisJCX0KKworCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTMCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEZpbGwgbmV3IG5vZGVzIHRoYXQgYXBwZWFyIGluIHBsYWNlIG9mIFNbMF0gKi8KKworCS8qIEkgYW0gdG9sZCB0aGF0IHRoaXMgY29weWluZyBpcyBiZWNhdXNlIHdlIG5lZWQgYW4gYXJyYXkgdG8gZW5hYmxlCisJICAgdGhlIGxvb3BpbmcgY29kZS4gLUhhbnMgKi8KKwlzbnVtWzBdID0gdGItPnMxbnVtLCBzbnVtWzFdID0gdGItPnMybnVtOworCXNieXRlc1swXSA9IHRiLT5zMWJ5dGVzOworCXNieXRlc1sxXSA9IHRiLT5zMmJ5dGVzOworCWZvciAoaSA9IHRiLT5ibGtudW1bMF0gLSAyOyBpID49IDA7IGktLSkgeworCisJCVJGQUxTRSghc251bVtpXSwgIlBBUC0xMjIwMDogc251bVslZF0gPT0gJWQuIE11c3QgYmUgPiAwIiwgaSwKKwkJICAgICAgIHNudW1baV0pOworCisJCS8qIGhlcmUgd2Ugc2hpZnQgZnJvbSBTIHRvIFNfbmV3IG5vZGVzICovCisKKwkJU19uZXdbaV0gPSBnZXRfRkVCKHRiKTsKKworCQkvKiBpbml0aWFsaXplZCBibG9jayB0eXBlIGFuZCB0cmVlIGxldmVsICovCisJCXNldF9ibGtoX2xldmVsKEJfQkxLX0hFQUQoU19uZXdbaV0pLCBESVNLX0xFQUZfTk9ERV9MRVZFTCk7CisKKwkJbiA9IEJfTlJfSVRFTVModGJTMCk7CisKKwkJc3dpdGNoIChmbGFnKSB7CisJCWNhc2UgTV9JTlNFUlQ6CS8qIGluc2VydCBpdGVtICovCisKKwkJCWlmIChuIC0gc251bVtpXSA8IGl0ZW1fcG9zKSB7CS8qIG5ldyBpdGVtIG9yIGl0J3MgcGFydCBmYWxscyB0byBmaXJzdCBuZXcgbm9kZSBTX25ld1tpXSAqLworCQkJCWlmIChpdGVtX3BvcyA9PSBuIC0gc251bVtpXSArIDEgJiYgc2J5dGVzW2ldICE9IC0xKSB7CS8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBTX25ld1tpXSAqLworCQkJCQlpbnQgb2xkX2tleV9jb21wLCBvbGRfbGVuLAorCQkJCQkgICAgcl96ZXJvc19udW1iZXI7CisJCQkJCWNvbnN0IGNoYXIgKnJfYm9keTsKKwkJCQkJaW50IHZlcnNpb247CisKKwkJCQkJLyogTW92ZSBzbnVtW2ldLTEgaXRlbXMgZnJvbSBTWzBdIHRvIFNfbmV3W2ldICovCisJCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19TTkVXLCB0YiwKKwkJCQkJCQlzbnVtW2ldIC0gMSwgLTEsCisJCQkJCQkJU19uZXdbaV0pOworCQkJCQkvKiBSZW1lbWJlciBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCAqLworCQkJCQl2ZXJzaW9uID0gaWhfdmVyc2lvbihpaCk7CisJCQkJCW9sZF9rZXlfY29tcCA9IGxlX2loX2tfb2Zmc2V0KGloKTsKKwkJCQkJb2xkX2xlbiA9IGloX2l0ZW1fbGVuKGloKTsKKworCQkJCQkvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU19uZXdbaV0gKi8KKwkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLAorCQkJCQkJCSAgIGxlX2loX2tfb2Zmc2V0KGloKSArCisJCQkJCQkJICAgKChvbGRfbGVuIC0KKwkJCQkJCQkgICAgIHNieXRlc1tpXSkgPDwKKwkJCQkJCQkgICAgKGlzX2luZGlyZWN0X2xlX2loCisJCQkJCQkJICAgICAoaWgpID8gdGItPnRiX3NiLT4KKwkJCQkJCQkgICAgIHNfYmxvY2tzaXplX2JpdHMgLQorCQkJCQkJCSAgICAgVU5GTV9QX1NISUZUIDoKKwkJCQkJCQkgICAgIDApKSk7CisKKwkJCQkJcHV0X2loX2l0ZW1fbGVuKGloLCBzYnl0ZXNbaV0pOworCisJCQkJCS8qIEluc2VydCBwYXJ0IG9mIHRoZSBpdGVtIGludG8gU19uZXdbaV0gYmVmb3JlIDAtdGggaXRlbSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJCQliaS5iaV9wYXJlbnQgPSBOVUxMOworCQkJCQliaS5iaV9wb3NpdGlvbiA9IDA7CisKKwkJCQkJaWYgKChvbGRfbGVuIC0gc2J5dGVzW2ldKSA+IHplcm9zX251bSkgeworCQkJCQkJcl96ZXJvc19udW1iZXIgPSAwOworCQkJCQkJcl9ib2R5ID0KKwkJCQkJCSAgICBib2R5ICsgKG9sZF9sZW4gLQorCQkJCQkJCSAgICBzYnl0ZXNbaV0pIC0KKwkJCQkJCSAgICB6ZXJvc19udW07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyX2JvZHkgPSBib2R5OworCQkJCQkJcl96ZXJvc19udW1iZXIgPQorCQkJCQkJICAgIHplcm9zX251bSAtIChvbGRfbGVuIC0KKwkJCQkJCQkJIHNieXRlc1tpXSk7CisJCQkJCQl6ZXJvc19udW0gLT0gcl96ZXJvc19udW1iZXI7CisJCQkJCX0KKworCQkJCQlsZWFmX2luc2VydF9pbnRvX2J1ZigmYmksIDAsIGloLCByX2JvZHksCisJCQkJCQkJICAgICByX3plcm9zX251bWJlcik7CisKKwkJCQkJLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNbaV0gKi8KKwkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLCBvbGRfa2V5X2NvbXApOworCQkJCQlwdXRfaWhfaXRlbV9sZW4oaWgsCisJCQkJCQkJb2xkX2xlbiAtIHNieXRlc1tpXSk7CisJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSAtPSBzYnl0ZXNbaV07CisJCQkJfSBlbHNlIHsJLyogd2hvbGUgbmV3IGl0ZW0gZmFsbHMgaW50byBTX25ld1tpXSAqLworCisJCQkJCS8qIFNoaWZ0IHNudW1bMF0gLSAxIGl0ZW1zIHRvIFNfbmV3W2ldIChzYnl0ZXNbaV0gb2Ygc3BsaXQgaXRlbSkgKi8KKwkJCQkJbGVhZl9tb3ZlX2l0ZW1zKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLAorCQkJCQkJCXNudW1baV0gLSAxLCBzYnl0ZXNbaV0sCisJCQkJCQkJU19uZXdbaV0pOworCisJCQkJCS8qIEluc2VydCBuZXcgaXRlbSBpbnRvIFNfbmV3W2ldICovCisJCQkJCWJpLnRiID0gdGI7CisJCQkJCWJpLmJpX2JoID0gU19uZXdbaV07CisJCQkJCWJpLmJpX3BhcmVudCA9IE5VTEw7CisJCQkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKKwkJCQkJbGVhZl9pbnNlcnRfaW50b19idWYoJmJpLAorCQkJCQkJCSAgICAgaXRlbV9wb3MgLSBuICsKKwkJCQkJCQkgICAgIHNudW1baV0gLSAxLCBpaCwKKwkJCQkJCQkgICAgIGJvZHksIHplcm9zX251bSk7CisKKwkJCQkJemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCWVsc2UgewkvKiBuZXcgaXRlbSBvciBpdCBwYXJ0IGRvbid0IGZhbGxzIGludG8gU19uZXdbaV0gKi8KKworCQkJCWxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19TTkVXLCB0YiwKKwkJCQkJCXNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNX1BBU1RFOgkvKiBhcHBlbmQgaXRlbSAqLworCisJCQlpZiAobiAtIHNudW1baV0gPD0gaXRlbV9wb3MpIHsJLyogcGFzdGVkIGl0ZW0gb3IgcGFydCBpZiBpdCBmYWxscyB0byBTX25ld1tpXSAqLworCQkJCWlmIChpdGVtX3BvcyA9PSBuIC0gc251bVtpXSAmJiBzYnl0ZXNbaV0gIT0gLTEpIHsJLyogd2UgbXVzdCBzaGlmdCBwYXJ0IG9mIHRoZSBhcHBlbmRlZCBpdGVtICovCisJCQkJCXN0cnVjdCBpdGVtX2hlYWQgKmF1eF9paDsKKworCQkJCQlSRkFMU0UoaWgsICJQQVAtMTIyMTA6IGloIG11c3QgYmUgMCIpOworCisJCQkJCWlmIChpc19kaXJlbnRyeV9sZV9paAorCQkJCQkgICAgKGF1eF9paCA9CisJCQkJCSAgICAgQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKSkgeworCQkJCQkJLyogd2UgYXBwZW5kIHRvIGRpcmVjdG9yeSBpdGVtICovCisKKwkJCQkJCWludCBlbnRyeV9jb3VudDsKKworCQkJCQkJZW50cnlfY291bnQgPQorCQkJCQkJICAgIGloX2VudHJ5X2NvdW50KGF1eF9paCk7CisKKwkJCQkJCWlmIChlbnRyeV9jb3VudCAtIHNieXRlc1tpXSA8CisJCQkJCQkgICAgcG9zX2luX2l0ZW0KKwkJCQkJCSAgICAmJiBwb3NfaW5faXRlbSA8PQorCQkJCQkJICAgIGVudHJ5X2NvdW50KSB7CisJCQkJCQkJLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIFNfbmV3W2ldICovCisKKwkJCQkJCQlSRkFMU0UoIXRiLT4KKwkJCQkJCQkgICAgICAgaW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICAgICJQQVAtMTIyMTU6IGluc2VydF9zaXplIGlzIGFscmVhZHkgMCIpOworCQkJCQkJCVJGQUxTRShzYnl0ZXNbaV0gLSAxID49CisJCQkJCQkJICAgICAgIGVudHJ5X2NvdW50LAorCQkJCQkJCSAgICAgICAiUEFQLTEyMjIwOiB0aGVyZSBhcmUgbm8gc28gbXVjaCBlbnRyaWVzICglZCksIG9ubHkgJWQiLAorCQkJCQkJCSAgICAgICBzYnl0ZXNbaV0gLSAxLAorCQkJCQkJCSAgICAgICBlbnRyeV9jb3VudCk7CisKKwkJCQkJCQkvKiBTaGlmdCBzbnVtW2ldLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IHNieXRlc1tpXSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBzbnVtW2ldICovCisJCQkJCQkJbGVhZl9tb3ZlX2l0ZW1zCisJCQkJCQkJICAgIChMRUFGX0ZST01fU19UT19TTkVXLAorCQkJCQkJCSAgICAgdGIsIHNudW1baV0sCisJCQkJCQkJICAgICBzYnl0ZXNbaV0gLSAxLAorCQkJCQkJCSAgICAgU19uZXdbaV0pOworCQkJCQkJCS8qIFBhc3RlIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQkJYmkuYmlfYmggPSBTX25ld1tpXTsKKwkJCQkJCQliaS5iaV9wYXJlbnQgPSBOVUxMOworCQkJCQkJCWJpLmJpX3Bvc2l0aW9uID0gMDsKKwkJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcgorCQkJCQkJCSAgICAoJmJpLCAwLAorCQkJCQkJCSAgICAgcG9zX2luX2l0ZW0gLQorCQkJCQkJCSAgICAgZW50cnlfY291bnQgKworCQkJCQkJCSAgICAgc2J5dGVzW2ldIC0gMSwKKwkJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkJCQkgICAgIGJvZHksIHplcm9zX251bSk7CisJCQkJCQkJLyogcGFzdGUgbmV3IGRpcmVjdG9yeSBlbnRyeSAqLworCQkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS4KKwkJCQkJCQkJCSAgIGJpX2JoLAorCQkJCQkJCQkJICAgMCwKKwkJCQkJCQkJCSAgIHBvc19pbl9pdGVtCisJCQkJCQkJCQkgICAtCisJCQkJCQkJCQkgICBlbnRyeV9jb3VudAorCQkJCQkJCQkJICAgKworCQkJCQkJCQkJICAgc2J5dGVzCisJCQkJCQkJCQkgICBbaV0gLQorCQkJCQkJCQkJICAgMSwgMSwKKwkJCQkJCQkJCSAgIChzdHJ1Y3QKKwkJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCQkgICAgKikKKwkJCQkJCQkJCSAgIGJvZHksCisJCQkJCQkJCQkgICBib2R5CisJCQkJCQkJCQkgICArCisJCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJCSAgIGluc2VydF9zaXplCisJCQkJCQkJCQkgICBbMF0KKwkJCQkJCQkgICAgKTsKKwkJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCQkJCXBvc19pbl9pdGVtKys7CisJCQkJCQl9IGVsc2UgewkvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgZmFsbCBpbnRvIFNfbmV3W2ldICovCisJCQkJCQkJbGVhZl9tb3ZlX2l0ZW1zCisJCQkJCQkJICAgIChMRUFGX0ZST01fU19UT19TTkVXLAorCQkJCQkJCSAgICAgdGIsIHNudW1baV0sCisJCQkJCQkJICAgICBzYnl0ZXNbaV0sCisJCQkJCQkJICAgICBTX25ld1tpXSk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CS8qIHJlZ3VsYXIgb2JqZWN0ICovCisKKwkJCQkJCWludCBuX3NoaWZ0LCBuX3JlbSwKKwkJCQkJCSAgICByX3plcm9zX251bWJlcjsKKwkJCQkJCWNvbnN0IGNoYXIgKnJfYm9keTsKKworCQkJCQkJUkZBTFNFKHBvc19pbl9pdGVtICE9CisJCQkJCQkgICAgICAgaWhfaXRlbV9sZW4KKwkJCQkJCSAgICAgICAoQl9OX1BJVEVNX0hFQUQKKwkJCQkJCQkodGJTMCwgaXRlbV9wb3MpKQorCQkJCQkJICAgICAgIHx8IHRiLT5pbnNlcnRfc2l6ZVswXSA8PQorCQkJCQkJICAgICAgIDAsCisJCQkJCQkgICAgICAgIlBBUC0xMjIyNTogaXRlbSB0b28gc2hvcnQgb3IgaW5zZXJ0X3NpemUgPD0gMCIpOworCisJCQkJCQkvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG11c3QgYmUgc2hpZnRlZCBmcm9tIGFwcGVuZGVkIGl0ZW0gKi8KKwkJCQkJCW5fc2hpZnQgPQorCQkJCQkJICAgIHNieXRlc1tpXSAtCisJCQkJCQkgICAgdGItPmluc2VydF9zaXplWzBdOworCQkJCQkJaWYgKG5fc2hpZnQgPCAwKQorCQkJCQkJCW5fc2hpZnQgPSAwOworCQkJCQkJbGVhZl9tb3ZlX2l0ZW1zCisJCQkJCQkgICAgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLAorCQkJCQkJICAgICBzbnVtW2ldLCBuX3NoaWZ0LAorCQkJCQkJICAgICBTX25ld1tpXSk7CisKKwkJCQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCByZW1haW4gaW4gYm9keSBhZnRlciBhcHBlbmQgdG8gU19uZXdbaV0gKi8KKwkJCQkJCW5fcmVtID0KKwkJCQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLQorCQkJCQkJICAgIHNieXRlc1tpXTsKKwkJCQkJCWlmIChuX3JlbSA8IDApCisJCQkJCQkJbl9yZW0gPSAwOworCQkJCQkJLyogQXBwZW5kIHBhcnQgb2YgYm9keSBpbnRvIFNfbmV3WzBdICovCisJCQkJCQliaS50YiA9IHRiOworCQkJCQkJYmkuYmlfYmggPSBTX25ld1tpXTsKKwkJCQkJCWJpLmJpX3BhcmVudCA9IE5VTEw7CisJCQkJCQliaS5iaV9wb3NpdGlvbiA9IDA7CisKKwkJCQkJCWlmIChuX3JlbSA+IHplcm9zX251bSkgeworCQkJCQkJCXJfemVyb3NfbnVtYmVyID0gMDsKKwkJCQkJCQlyX2JvZHkgPQorCQkJCQkJCSAgICBib2R5ICsgbl9yZW0gLQorCQkJCQkJCSAgICB6ZXJvc19udW07CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJfYm9keSA9IGJvZHk7CisJCQkJCQkJcl96ZXJvc19udW1iZXIgPQorCQkJCQkJCSAgICB6ZXJvc19udW0gLSBuX3JlbTsKKwkJCQkJCQl6ZXJvc19udW0gLT0KKwkJCQkJCQkgICAgcl96ZXJvc19udW1iZXI7CisJCQkJCQl9CisKKwkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgMCwKKwkJCQkJCQkJICAgICBuX3NoaWZ0LAorCQkJCQkJCQkgICAgIHRiLT4KKwkJCQkJCQkJICAgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICAgIFswXSAtCisJCQkJCQkJCSAgICAgbl9yZW0sCisJCQkJCQkJCSAgICAgcl9ib2R5LAorCQkJCQkJCQkgICAgIHJfemVyb3NfbnVtYmVyKTsKKwkJCQkJCXsKKwkJCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkICp0bXA7CisKKwkJCQkJCQl0bXAgPQorCQkJCQkJCSAgICBCX05fUElURU1fSEVBRChTX25ldworCQkJCQkJCQkJICAgW2ldLAorCQkJCQkJCQkJICAgMCk7CisJCQkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loCisJCQkJCQkJICAgICh0bXApKSB7CisJCQkJCQkJCXNldF9paF9mcmVlX3NwYWNlCisJCQkJCQkJCSAgICAodG1wLCAwKTsKKwkJCQkJCQkJc2V0X2xlX2loX2tfb2Zmc2V0CisJCQkJCQkJCSAgICAodG1wLAorCQkJCQkJCQkgICAgIGxlX2loX2tfb2Zmc2V0CisJCQkJCQkJCSAgICAgKHRtcCkgKworCQkJCQkJCQkgICAgIChuX3JlbSA8PAorCQkJCQkJCQkgICAgICAodGItPgorCQkJCQkJCQkgICAgICAgdGJfc2ItPgorCQkJCQkJCQkgICAgICAgc19ibG9ja3NpemVfYml0cworCQkJCQkJCQkgICAgICAgLQorCQkJCQkJCQkgICAgICAgVU5GTV9QX1NISUZUKSkpOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCXNldF9sZV9paF9rX29mZnNldAorCQkJCQkJCQkgICAgKHRtcCwKKwkJCQkJCQkJICAgICBsZV9paF9rX29mZnNldAorCQkJCQkJCQkgICAgICh0bXApICsKKwkJCQkJCQkJICAgICBuX3JlbSk7CisJCQkJCQkJfQorCQkJCQkJfQorCisJCQkJCQl0Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3JlbTsKKwkJCQkJCWlmICghbl9yZW0pCisJCQkJCQkJcG9zX2luX2l0ZW0rKzsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQkvKiBpdGVtIGZhbGxzIHdob2xseSBpbnRvIFNfbmV3W2ldICovCisJCQkJeworCQkJCQlpbnQgcmV0X3ZhbDsKKwkJCQkJc3RydWN0IGl0ZW1faGVhZCAqcGFzdGVkOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCQkJCXN0cnVjdCBpdGVtX2hlYWQgKmloID0KKwkJCQkJICAgIEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKTsKKworCQkJCQlpZiAoIWlzX2RpcmVudHJ5X2xlX2loKGloKQorCQkJCQkgICAgJiYgKHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKGloKQorCQkJCQkJfHwgdGItPmluc2VydF9zaXplWzBdIDw9IDApKQorCQkJCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMjM1OiBiYWxhbmNlX2xlYWY6IHBvc19pbl9pdGVtIG11c3QgYmUgZXF1YWwgdG8gaWhfaXRlbV9sZW4iKTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKworCQkJCQlyZXRfdmFsID0KKwkJCQkJICAgIGxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19TTkVXLAorCQkJCQkJCSAgICB0Yiwgc251bVtpXSwKKwkJCQkJCQkgICAgc2J5dGVzW2ldLAorCQkJCQkJCSAgICBTX25ld1tpXSk7CisKKwkJCQkJUkZBTFNFKHJldF92YWwsCisJCQkJCSAgICAgICAiUEFQLTEyMjQwOiB1bmV4cGVjdGVkIHZhbHVlIHJldHVybmVkIGJ5IGxlYWZfbW92ZV9pdGVtcyAoJWQpIiwKKwkJCQkJICAgICAgIHJldF92YWwpOworCisJCQkJCS8qIHBhc3RlIGludG8gaXRlbSAqLworCQkJCQliaS50YiA9IHRiOworCQkJCQliaS5iaV9iaCA9IFNfbmV3W2ldOworCQkJCQliaS5iaV9wYXJlbnQgPSBOVUxMOworCQkJCQliaS5iaV9wb3NpdGlvbiA9IDA7CisJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwKKwkJCQkJCQkgICAgIGl0ZW1fcG9zIC0gbiArCisJCQkJCQkJICAgICBzbnVtW2ldLAorCQkJCQkJCSAgICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCQkJICAgICBib2R5LCB6ZXJvc19udW0pOworCisJCQkJCXBhc3RlZCA9CisJCQkJCSAgICBCX05fUElURU1fSEVBRChTX25ld1tpXSwKKwkJCQkJCQkgICBpdGVtX3BvcyAtIG4gKworCQkJCQkJCSAgIHNudW1baV0pOworCQkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgocGFzdGVkKSkgeworCQkJCQkJbGVhZl9wYXN0ZV9lbnRyaWVzKGJpLmJpX2JoLAorCQkJCQkJCQkgICBpdGVtX3BvcyAtCisJCQkJCQkJCSAgIG4gKyBzbnVtW2ldLAorCQkJCQkJCQkgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgMSwKKwkJCQkJCQkJICAgKHN0cnVjdAorCQkJCQkJCQkgICAgcmVpc2VyZnNfZGVfaGVhZAorCQkJCQkJCQkgICAgKilib2R5LAorCQkJCQkJCQkgICBib2R5ICsKKwkJCQkJCQkJICAgREVIX1NJWkUsCisJCQkJCQkJCSAgIHRiLT4KKwkJCQkJCQkJICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgWzBdCisJCQkJCQkgICAgKTsKKwkJCQkJfQorCisJCQkJCS8qIGlmIHdlIHBhc3RlIHRvIGluZGlyZWN0IGl0ZW0gdXBkYXRlIGloX2ZyZWVfc3BhY2UgKi8KKwkJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBhc3RlZCkpCisJCQkJCQlzZXRfaWhfZnJlZV9zcGFjZShwYXN0ZWQsIDApOworCQkJCQl6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJCX0KKwkJCX0KKworCQkJZWxzZSB7CS8qIHBhc3RlZCBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIFNfbmV3W2ldICovCisKKwkJCQlsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsCisJCQkJCQlzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBjYXNlcyBkIGFuZCB0ICovCisJCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCQkJICAgICAgICJQQVAtMTIyNDU6IGJhbGFuY2VfbGVhZjogYmxrbnVtID4gMjogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCisJCQkJICAgICAgIChmbGFnID09CisJCQkJCU1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09CisJCQkJCQkJCSBNX0NVVCkgPyAiQ1VUIgorCQkJCQkJCQk6ICJVTktOT1dOIiksCisJCQkJICAgICAgIGZsYWcpOworCQl9CisKKwkJbWVtY3B5KGluc2VydF9rZXkgKyBpLCBCX05fUEtFWShTX25ld1tpXSwgMCksIEtFWV9TSVpFKTsKKwkJaW5zZXJ0X3B0cltpXSA9IFNfbmV3W2ldOworCisJCVJGQUxTRSghYnVmZmVyX2pvdXJuYWxlZChTX25ld1tpXSkKKwkJICAgICAgIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KFNfbmV3W2ldKQorCQkgICAgICAgfHwgYnVmZmVyX2RpcnR5KFNfbmV3W2ldKSwgIlBBUC0xMjI0NzogU19uZXdbJWRdIDogKCViKSIsCisJCSAgICAgICBpLCBTX25ld1tpXSk7CisJfQorCisJLyogaWYgdGhlIGFmZmVjdGVkIGl0ZW0gd2FzIG5vdCB3aG9sbHkgc2hpZnRlZCB0aGVuIHdlIHBlcmZvcm0gYWxsIG5lY2Vzc2FyeSBvcGVyYXRpb25zIG9uIHRoYXQgcGFydCBvciB3aG9sZSBvZiB0aGUKKwkgICBhZmZlY3RlZCBpdGVtIHdoaWNoIHJlbWFpbnMgaW4gUyAqLworCWlmICgwIDw9IGl0ZW1fcG9zICYmIGl0ZW1fcG9zIDwgdGItPnMwbnVtKSB7CS8qIGlmIHdlIG11c3QgaW5zZXJ0IG9yIGFwcGVuZCBpbnRvIGJ1ZmZlciBTWzBdICovCisKKwkJc3dpdGNoIChmbGFnKSB7CisJCWNhc2UgTV9JTlNFUlQ6CS8qIGluc2VydCBpdGVtIGludG8gU1swXSAqLwogCQkJYmkudGIgPSB0YjsKLQkJCWJpLmJpX2JoID0gdGItPlJbMF07Ci0JCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdLCBwb3NfaW5faXRlbSwKLQkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sYm9keSwgemVyb3NfbnVtKTsKLQkJICAgIH0KKwkJCWJpLmJpX2JoID0gdGJTMDsKKwkJCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKTsKKwkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKCZiaSwgaXRlbV9wb3MsIGloLCBib2R5LAorCQkJCQkgICAgIHplcm9zX251bSk7CiAKLQkJICAgIC8qIHBhc3RlIG5ldyBlbnRyeSwgaWYgaXRlbSBpcyBkaXJlY3RvcnkgaXRlbSAqLwotCQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdKTsKLQkJICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAocGFzdGVkKSAmJiBwb3NfaW5faXRlbSA+PSAwICkgewotCQkJbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCSAgICBiaS5iaV9iaCwgaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0sIHBvc19pbl9pdGVtLCAxLCAKLQkJCSAgICAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXQotCQkJICAgICk7Ci0JCQlpZiAoICEgcG9zX2luX2l0ZW0gKSB7CisJCQkvKiBJZiB3ZSBpbnNlcnQgdGhlIGZpcnN0IGtleSBjaGFuZ2UgdGhlIGRlbGltaXRpbmcga2V5ICovCisJCQlpZiAoaXRlbV9wb3MgPT0gMCkgeworCQkJCWlmICh0Yi0+Q0ZMWzBdKQkvKiBjYW4gYmUgMCBpbiByZWlzZXJmc2NrICovCisJCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwKKwkJCQkJCSAgICB0YlMwLCAwKTsKIAotCQkJICAgIFJGQUxTRSggaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0sCi0JCQkJICAgICJQQVAtMTIxNjU6IGRpcmVjdG9yeSBpdGVtIG11c3QgYmUgZmlyc3QgaXRlbSBvZiBub2RlIHdoZW4gcGFzdGluZyBpcyBpbiAwdGggcG9zaXRpb24iKTsKLQotCQkJICAgIC8qIHVwZGF0ZSBkZWxpbWl0aW5nIGtleXMgKi8KLQkJCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKIAkJCX0KLQkJICAgIH0KKwkJCWJyZWFrOwogCi0JCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpCi0JCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKLQkJICAgIHplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCWNhc2UgTV9QQVNURTp7CS8qIGFwcGVuZCBpdGVtIGluIFNbMF0gKi8KKwkJCQlzdHJ1Y3QgaXRlbV9oZWFkICpwYXN0ZWQ7CisKKwkJCQlwYXN0ZWQgPSBCX05fUElURU1fSEVBRCh0YlMwLCBpdGVtX3Bvcyk7CisJCQkJLyogd2hlbiBkaXJlY3RvcnksIG1heSBiZSBuZXcgZW50cnkgYWxyZWFkeSBwYXN0ZWQgKi8KKwkJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgocGFzdGVkKSkgeworCQkJCQlpZiAocG9zX2luX2l0ZW0gPj0gMCAmJgorCQkJCQkgICAgcG9zX2luX2l0ZW0gPD0KKwkJCQkJICAgIGloX2VudHJ5X2NvdW50KHBhc3RlZCkpIHsKKworCQkJCQkJUkZBTFNFKCF0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCQkgICAgICAgIlBBUC0xMjI2MDogaW5zZXJ0X3NpemUgaXMgMCBhbHJlYWR5Iik7CisKKwkJCQkJCS8qIHByZXBhcmUgc3BhY2UgKi8KKwkJCQkJCWJpLnRiID0gdGI7CisJCQkJCQliaS5iaV9iaCA9IHRiUzA7CisJCQkJCQliaS5iaV9wYXJlbnQgPQorCQkJCQkJICAgIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLAorCQkJCQkJCQkgICAwKTsKKwkJCQkJCWJpLmJpX3Bvc2l0aW9uID0KKwkJCQkJCSAgICBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsCisJCQkJCQkJCSAgICAxKTsKKwkJCQkJCWxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwKKwkJCQkJCQkJICAgICBpdGVtX3BvcywKKwkJCQkJCQkJICAgICBwb3NfaW5faXRlbSwKKwkJCQkJCQkJICAgICB0Yi0+CisJCQkJCQkJCSAgICAgaW5zZXJ0X3NpemUKKwkJCQkJCQkJICAgICBbMF0sIGJvZHksCisJCQkJCQkJCSAgICAgemVyb3NfbnVtKTsKKworCQkJCQkJLyogcGFzdGUgZW50cnkgKi8KKwkJCQkJCWxlYWZfcGFzdGVfZW50cmllcyhiaS5iaV9iaCwKKwkJCQkJCQkJICAgaXRlbV9wb3MsCisJCQkJCQkJCSAgIHBvc19pbl9pdGVtLAorCQkJCQkJCQkgICAxLAorCQkJCQkJCQkgICAoc3RydWN0CisJCQkJCQkJCSAgICByZWlzZXJmc19kZV9oZWFkCisJCQkJCQkJCSAgICAqKWJvZHksCisJCQkJCQkJCSAgIGJvZHkgKworCQkJCQkJCQkgICBERUhfU0laRSwKKwkJCQkJCQkJICAgdGItPgorCQkJCQkJCQkgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICBbMF0KKwkJCQkJCSAgICApOworCQkJCQkJaWYgKCFpdGVtX3BvcyAmJiAhcG9zX2luX2l0ZW0pIHsKKwkJCQkJCQlSRkFMU0UoIXRiLT5DRkxbMF0KKwkJCQkJCQkgICAgICAgfHwgIXRiLT5MWzBdLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMjcwOiBDRkxbMF0vTFswXSBtdXN0IGJlIHNwZWNpZmllZCIpOworCQkJCQkJCWlmICh0Yi0+Q0ZMWzBdKSB7CisJCQkJCQkJCXJlcGxhY2Vfa2V5KHRiLAorCQkJCQkJCQkJICAgIHRiLT4KKwkJCQkJCQkJCSAgICBDRkwKKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgdGItPgorCQkJCQkJCQkJICAgIGxrZXkKKwkJCQkJCQkJCSAgICBbMF0sCisJCQkJCQkJCQkgICAgdGJTMCwKKwkJCQkJCQkJCSAgICAwKTsKKworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiByZWd1bGFyIG9iamVjdCAqLworCQkJCQlpZiAocG9zX2luX2l0ZW0gPT0gaWhfaXRlbV9sZW4ocGFzdGVkKSkgeworCisJCQkJCQlSRkFMU0UodGItPmluc2VydF9zaXplWzBdIDw9IDAsCisJCQkJCQkgICAgICAgIlBBUC0xMjI3NTogaW5zZXJ0IHNpemUgbXVzdCBub3QgYmUgJWQiLAorCQkJCQkJICAgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJCQkJCQliaS50YiA9IHRiOworCQkJCQkJYmkuYmlfYmggPSB0YlMwOworCQkJCQkJYmkuYmlfcGFyZW50ID0KKwkJCQkJCSAgICBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwKKwkJCQkJCQkJICAgMCk7CisJCQkJCQliaS5iaV9wb3NpdGlvbiA9CisJCQkJCQkgICAgUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLAorCQkJCQkJCQkgICAgMSk7CisJCQkJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksCisJCQkJCQkJCSAgICAgaXRlbV9wb3MsCisJCQkJCQkJCSAgICAgcG9zX2luX2l0ZW0sCisJCQkJCQkJCSAgICAgdGItPgorCQkJCQkJCQkgICAgIGluc2VydF9zaXplCisJCQkJCQkJCSAgICAgWzBdLCBib2R5LAorCQkJCQkJCQkgICAgIHplcm9zX251bSk7CisKKwkJCQkJCWlmIChpc19pbmRpcmVjdF9sZV9paChwYXN0ZWQpKSB7CisjaWYgMAorCQkJCQkJCVJGQUxTRSh0Yi0+CisJCQkJCQkJICAgICAgIGluc2VydF9zaXplWzBdICE9CisJCQkJCQkJICAgICAgIFVORk1fUF9TSVpFLAorCQkJCQkJCSAgICAgICAiUEFQLTEyMjgwOiBpbnNlcnRfc2l6ZSBmb3IgaW5kaXJlY3QgaXRlbSBtdXN0IGJlICVkLCBub3QgJWQiLAorCQkJCQkJCSAgICAgICBVTkZNX1BfU0laRSwKKwkJCQkJCQkgICAgICAgdGItPgorCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZVswXSk7CisjZW5kaWYKKwkJCQkJCQlzZXRfaWhfZnJlZV9zcGFjZQorCQkJCQkJCSAgICAocGFzdGVkLCAwKTsKKwkJCQkJCX0KKwkJCQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQkJCX0KKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAodGItPmluc2VydF9zaXplWzBdKSB7CisJCQkJCQkJcHJpbnRfY3VyX3RiKCIxMjI4NSIpOworCQkJCQkJCXJlaXNlcmZzX3BhbmljKHRiLT4KKwkJCQkJCQkJICAgICAgIHRiX3NiLAorCQkJCQkJCQkgICAgICAgIlBBUC0xMjI4NTogYmFsYW5jZV9sZWFmOiBpbnNlcnRfc2l6ZSBtdXN0IGJlIDAgKCVkKSIsCisJCQkJCQkJCSAgICAgICB0Yi0+CisJCQkJCQkJCSAgICAgICBpbnNlcnRfc2l6ZQorCQkJCQkJCQkgICAgICAgWzBdKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmCQkJCS8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCisJCQkJfQorCQkJfQkvKiBjYXNlIE1fUEFTVEU6ICovCiAJCX0KLQkgICAgfQotCSAgICBlbHNlIC8qIG5ldyBpdGVtIGRvZXNuJ3QgZmFsbCBpbnRvIFJbMF0gKi8KLQkgICAgewotCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCWRlZmF1bHQ6ICAgIC8qIGNhc2VzIGQgYW5kIHQgKi8KLQkgICAgcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjE3NTogYmFsYW5jZV9sZWFmOiBybnVtID4gMDogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCi0JCQkgICAgKGZsYWcgPT0gTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0gTV9DVVQpID8gIkNVVCIgOiAiVU5LTk9XTiIpLCBmbGFnKTsKIAl9Ci0gICAgCi0gICAgfQkvKiB0Yi0+cm51bVswXSA+IDAgKi8KLQotCi0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtWzBdID4gMywKLQkgICAgIlBBUC0xMjE4MDogYmxrbnVtIGNhbiBub3QgYmUgJWQuIEl0IG11c3QgYmUgPD0gMyIsICB0Yi0+YmxrbnVtWzBdKTsKLSAgICBSRkFMU0UoIHRiLT5ibGtudW1bMF0gPCAwLAotCSAgICAiUEFQLTEyMTg1OiBibGtudW0gY2FuIG5vdCBiZSAlZC4gSXQgbXVzdCBiZSA+PSAwIiwgIHRiLT5ibGtudW1bMF0pOwotCi0gICAgLyogaWYgd2hpbGUgYWRkaW5nIHRvIGEgbm9kZSB3ZSBkaXNjb3ZlciB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHNwbGl0Ci0gICAgICAgaXQgaW4gdHdvLCBhbmQgbWVyZ2UgdGhlIGxlZnQgcGFydCBpbnRvIHRoZSBsZWZ0IG5laWdoYm9yIGFuZCB0aGUKLSAgICAgICByaWdodCBwYXJ0IGludG8gdGhlIHJpZ2h0IG5laWdoYm9yLCBlbGltaW5hdGluZyB0aGUgbm9kZSAqLwotICAgIGlmICggdGItPmJsa251bVswXSA9PSAwICkgeyAvKiBub2RlIFNbMF0gaXMgZW1wdHkgbm93ICovCi0KLQlSRkFMU0UoICEgdGItPmxudW1bMF0gfHwgISB0Yi0+cm51bVswXSwKLQkgICAgICAgICJQQVAtMTIxOTA6IGxudW0gYW5kIHJudW0gbXVzdCBub3QgYmUgemVybyIpOwotCS8qIGlmIGluc2VydGlvbiB3YXMgZG9uZSBiZWZvcmUgMC10aCBwb3NpdGlvbiBpbiBSWzBdLCByaWdodAotCSAgIGRlbGltaXRpbmcga2V5IG9mIHRoZSB0Yi0+TFswXSdzIGFuZCBsZWZ0IGRlbGltaXRpbmcga2V5IGFyZQotCSAgIG5vdCBzZXQgY29ycmVjdGx5ICovCi0JaWYgKHRiLT5DRkxbMF0pIHsKLQkgICAgaWYgKCF0Yi0+Q0ZSWzBdKQotCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtMTIxOTU6IGJhbGFuY2VfbGVhZjogQ0ZSIG5vdCBpbml0aWFsaXplZCIpOwotCSAgICBjb3B5X2tleSAoQl9OX1BERUxJTV9LRVkgKHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdKSwgQl9OX1BERUxJTV9LRVkgKHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdKSk7Ci0JICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIHRiLT5DRkxbMF0sIDApOworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCWlmIChmbGFnID09IE1fUEFTVEUgJiYgdGItPmluc2VydF9zaXplWzBdKSB7CisJCXByaW50X2N1cl90YigiMTIyOTAiKTsKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtMTIyOTA6IGJhbGFuY2VfbGVhZjogaW5zZXJ0X3NpemUgaXMgc3RpbGwgbm90IDAgKCVkKSIsCisJCQkgICAgICAgdGItPmluc2VydF9zaXplWzBdKTsKIAl9CisjZW5kaWYJCQkJLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCiAKLQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0Yix0YlMwKTsJCQkJCQkJCQkKIAlyZXR1cm4gMDsKLSAgICB9Ci0KLQotICAgIC8qIEZpbGwgbmV3IG5vZGVzIHRoYXQgYXBwZWFyIGluIHBsYWNlIG9mIFNbMF0gKi8KLQotICAgIC8qIEkgYW0gdG9sZCB0aGF0IHRoaXMgY29weWluZyBpcyBiZWNhdXNlIHdlIG5lZWQgYW4gYXJyYXkgdG8gZW5hYmxlCi0gICAgICAgdGhlIGxvb3BpbmcgY29kZS4gLUhhbnMgKi8KLSAgICBzbnVtWzBdID0gdGItPnMxbnVtLAotCXNudW1bMV0gPSB0Yi0+czJudW07Ci0gICAgc2J5dGVzWzBdID0gdGItPnMxYnl0ZXM7Ci0gICAgc2J5dGVzWzFdID0gdGItPnMyYnl0ZXM7Ci0gICAgZm9yKCBpID0gdGItPmJsa251bVswXSAtIDI7IGkgPj0gMDsgaS0tICkgewotCi0JUkZBTFNFKCAhc251bVtpXSwgIlBBUC0xMjIwMDogc251bVslZF0gPT0gJWQuIE11c3QgYmUgPiAwIiwgaSwgc251bVtpXSk7Ci0KLQkvKiBoZXJlIHdlIHNoaWZ0IGZyb20gUyB0byBTX25ldyBub2RlcyAqLwotCi0JU19uZXdbaV0gPSBnZXRfRkVCKHRiKTsKLQotCS8qIGluaXRpYWxpemVkIGJsb2NrIHR5cGUgYW5kIHRyZWUgbGV2ZWwgKi8KLSAgICAgICAgc2V0X2Jsa2hfbGV2ZWwoIEJfQkxLX0hFQUQoU19uZXdbaV0pLCBESVNLX0xFQUZfTk9ERV9MRVZFTCApOwotCi0KLQluID0gQl9OUl9JVEVNUyh0YlMwKTsKLQkKLQlzd2l0Y2ggKGZsYWcpIHsKLQljYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtICovCi0KLQkgICAgaWYgKCBuIC0gc251bVtpXSA8IGl0ZW1fcG9zICkKLQkgICAgeyAvKiBuZXcgaXRlbSBvciBpdCdzIHBhcnQgZmFsbHMgdG8gZmlyc3QgbmV3IG5vZGUgU19uZXdbaV0qLwotCQlpZiAoIGl0ZW1fcG9zID09IG4gLSBzbnVtW2ldICsgMSAmJiBzYnl0ZXNbaV0gIT0gLTEgKQotCQl7IC8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBTX25ld1tpXSAqLwotCQkgICAgaW50IG9sZF9rZXlfY29tcCwgb2xkX2xlbiwgcl96ZXJvc19udW1iZXI7Ci0JCSAgICBjb25zdCBjaGFyICogcl9ib2R5OwotCQkgICAgaW50IHZlcnNpb247Ci0KLQkJICAgIC8qIE1vdmUgc251bVtpXS0xIGl0ZW1zIGZyb20gU1swXSB0byBTX25ld1tpXSAqLwotCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSAtIDEsIC0xLCBTX25ld1tpXSk7Ci0JCSAgICAvKiBSZW1lbWJlciBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCAqLwotCQkgICAgdmVyc2lvbiA9IGloX3ZlcnNpb24gKGloKTsKLSAgICAgICAgICAgICAgICAgICAgb2xkX2tleV9jb21wID0gbGVfaWhfa19vZmZzZXQoIGloICk7Ci0JCSAgICBvbGRfbGVuID0gaWhfaXRlbV9sZW4oaWgpOwotCi0JCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU19uZXdbaV0gKi8KLSAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVfaWhfa19vZmZzZXQoaWgpICsgKChvbGRfbGVuIC0gc2J5dGVzW2ldICk8PChpc19pbmRpcmVjdF9sZV9paChpaCk/dGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUOjApKSApOwotCi0JCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBzYnl0ZXNbaV0gKTsKLQotCQkgICAgLyogSW5zZXJ0IHBhcnQgb2YgdGhlIGl0ZW0gaW50byBTX25ld1tpXSBiZWZvcmUgMC10aCBpdGVtICovCi0JCSAgICBiaS50YiA9IHRiOwotCQkgICAgYmkuYmlfYmggPSBTX25ld1tpXTsKLQkJICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7Ci0KLQkJICAgIGlmICggKG9sZF9sZW4gLSBzYnl0ZXNbaV0pID4gemVyb3NfbnVtICkgewotCQkJcl96ZXJvc19udW1iZXIgPSAwOwotCQkJcl9ib2R5ID0gYm9keSArIChvbGRfbGVuIC0gc2J5dGVzW2ldKSAtIHplcm9zX251bTsKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkJcl9ib2R5ID0gYm9keTsKLQkJCXJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gKG9sZF9sZW4gLSBzYnl0ZXNbaV0pOwotCQkJemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOwotCQkgICAgfQotCi0JCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCAwLCBpaCwgcl9ib2R5LCByX3plcm9zX251bWJlcik7Ci0KLQkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTW2ldICovCi0gICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsIG9sZF9rZXlfY29tcCApOwotCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgb2xkX2xlbiAtIHNieXRlc1tpXSApOwotCQkgICAgdGItPmluc2VydF9zaXplWzBdIC09IHNieXRlc1tpXTsKLQkJfQotCQllbHNlIC8qIHdob2xlIG5ldyBpdGVtIGZhbGxzIGludG8gU19uZXdbaV0gKi8KLQkJewotCQkgICAgLyogU2hpZnQgc251bVswXSAtIDEgaXRlbXMgdG8gU19uZXdbaV0gKHNieXRlc1tpXSBvZiBzcGxpdCBpdGVtKSAqLwotCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSAtIDEsIHNieXRlc1tpXSwgU19uZXdbaV0pOwotCi0JCSAgICAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBTX25ld1tpXSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOwotCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgaXRlbV9wb3MgLSBuICsgc251bVtpXSAtIDEsIGloLCBib2R5LCB6ZXJvc19udW0pOwotCi0JCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQl9Ci0JICAgIH0KLQotCSAgICBlbHNlIC8qIG5ldyBpdGVtIG9yIGl0IHBhcnQgZG9uJ3QgZmFsbHMgaW50byBTX25ld1tpXSAqLwotCSAgICB7Ci0JCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBNX1BBU1RFOiAgIC8qIGFwcGVuZCBpdGVtICovCi0KLQkgICAgaWYgKCBuIC0gc251bVtpXSA8PSBpdGVtX3BvcyApICAvKiBwYXN0ZWQgaXRlbSBvciBwYXJ0IGlmIGl0IGZhbGxzIHRvIFNfbmV3W2ldICovCi0JICAgIHsKLQkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gc251bVtpXSAmJiBzYnl0ZXNbaV0gIT0gLTEgKQotCQl7IC8qIHdlIG11c3Qgc2hpZnQgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLwotCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGF1eF9paDsKLQotCQkgICAgUkZBTFNFKCBpaCwgIlBBUC0xMjIxMDogaWggbXVzdCBiZSAwIik7Ci0KLQkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKGF1eF9paCA9IEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpKSkgewotCQkJLyogd2UgYXBwZW5kIHRvIGRpcmVjdG9yeSBpdGVtICovCi0KLQkJCWludCBlbnRyeV9jb3VudDsKLQkJCi0JCQllbnRyeV9jb3VudCA9IGloX2VudHJ5X2NvdW50KGF1eF9paCk7Ci0KLQkJCWlmICggZW50cnlfY291bnQgLSBzYnl0ZXNbaV0gPCBwb3NfaW5faXRlbSAgJiYgcG9zX2luX2l0ZW0gPD0gZW50cnlfY291bnQgKSB7Ci0JCQkgICAgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIFNfbmV3W2ldICovCi0JCSAgCi0JCQkgICAgUkZBTFNFKCAhIHRiLT5pbnNlcnRfc2l6ZVswXSwKLQkJCQkgICAgIlBBUC0xMjIxNTogaW5zZXJ0X3NpemUgaXMgYWxyZWFkeSAwIik7Ci0JCQkgICAgUkZBTFNFKCBzYnl0ZXNbaV0gLSAxID49IGVudHJ5X2NvdW50LAotCQkJCSAgICAiUEFQLTEyMjIwOiB0aGVyZSBhcmUgbm8gc28gbXVjaCBlbnRyaWVzICglZCksIG9ubHkgJWQiLAotCQkJCSAgICBzYnl0ZXNbaV0gLSAxLCBlbnRyeV9jb3VudCk7Ci0KLQkJCSAgICAvKiBTaGlmdCBzbnVtW2ldLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IHNieXRlc1tpXSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBzbnVtW2ldICovCi0JCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLTEsIFNfbmV3W2ldKTsKLQkJCSAgICAvKiBQYXN0ZSBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KLQkJCSAgICBiaS50YiA9IHRiOwotCQkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07Ci0JCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKLQkJCSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7Ci0JCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgMCwgcG9zX2luX2l0ZW0gLSBlbnRyeV9jb3VudCArIHNieXRlc1tpXSAtIDEsCi0JCQkJCQkgIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSx6ZXJvc19udW0pOwotCQkJICAgIC8qIHBhc3RlIG5ldyBkaXJlY3RvcnkgZW50cnkgKi8KLQkJCSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKAotCQkJCWJpLmJpX2JoLCAwLCBwb3NfaW5faXRlbSAtIGVudHJ5X2NvdW50ICsgc2J5dGVzW2ldIC0gMSwKLQkJCQkxLCAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsCi0JCQkJdGItPmluc2VydF9zaXplWzBdCi0JCQkJKTsKLQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOwotCQkJICAgIHBvc19pbl9pdGVtKys7Ci0JCQl9IGVsc2UgeyAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgZmFsbCBpbnRvIFNfbmV3W2ldICovCi0JCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgICBlbHNlIC8qIHJlZ3VsYXIgb2JqZWN0ICovCi0JCSAgICB7Ci0JCQlpbnQgbl9zaGlmdCwgbl9yZW0sIHJfemVyb3NfbnVtYmVyOwotCQkJY29uc3QgY2hhciAqIHJfYm9keTsKLQotCQkJUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkgfHwKLQkJCSAgICAgICAgdGItPmluc2VydF9zaXplWzBdIDw9IDAsCi0JCQkgICAgICAgICJQQVAtMTIyMjU6IGl0ZW0gdG9vIHNob3J0IG9yIGluc2VydF9zaXplIDw9IDAiKTsKLQotCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQgZnJvbSBhcHBlbmRlZCBpdGVtICovCi0JCQluX3NoaWZ0ID0gc2J5dGVzW2ldIC0gdGItPmluc2VydF9zaXplWzBdOwotCQkJaWYgKCBuX3NoaWZ0IDwgMCApCi0JCQkgICAgbl9zaGlmdCA9IDA7Ci0JCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBuX3NoaWZ0LCBTX25ld1tpXSk7Ci0KLQkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCByZW1haW4gaW4gYm9keSBhZnRlciBhcHBlbmQgdG8gU19uZXdbaV0gKi8KLQkJCW5fcmVtID0gdGItPmluc2VydF9zaXplWzBdIC0gc2J5dGVzW2ldOwotCQkJaWYgKCBuX3JlbSA8IDAgKQotCQkJICAgIG5fcmVtID0gMDsKLQkJCS8qIEFwcGVuZCBwYXJ0IG9mIGJvZHkgaW50byBTX25ld1swXSAqLwotCQkJYmkudGIgPSB0YjsKLQkJCWJpLmJpX2JoID0gU19uZXdbaV07Ci0JCQliaS5iaV9wYXJlbnQgPSBOVUxMOwotCQkJYmkuYmlfcG9zaXRpb24gPSAwOwotCi0JCQlpZiAoIG5fcmVtID4gemVyb3NfbnVtICkgewotCQkJICAgIHJfemVyb3NfbnVtYmVyID0gMDsKLQkJCSAgICByX2JvZHkgPSBib2R5ICsgbl9yZW0gLSB6ZXJvc19udW07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgICByX2JvZHkgPSBib2R5OwotCQkJICAgIHJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gbl9yZW07Ci0JCQkgICAgemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOwotCQkJfQotCi0JCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIDAsIG5fc2hpZnQsIHRiLT5pbnNlcnRfc2l6ZVswXS1uX3JlbSwgcl9ib2R5LHJfemVyb3NfbnVtYmVyKTsKLQkJCXsKLQkJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogdG1wOwotCi0JCQkgICAgdG1wID0gQl9OX1BJVEVNX0hFQUQoU19uZXdbaV0sMCk7Ci0JCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loICh0bXApKSB7Ci0JCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHRtcCwgMCk7Ci0JCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCB0bXAsIGxlX2loX2tfb2Zmc2V0KHRtcCkgKyAKLQkJCQkJICAgICAgICAgICAgKG5fcmVtIDw8ICh0Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQpKSk7Ci0JCQkgICAgfSBlbHNlIHsKLQkJCQlzZXRfbGVfaWhfa19vZmZzZXQoIHRtcCwgbGVfaWhfa19vZmZzZXQodG1wKSArIAotCQkJCSAgICAgICAgICAgICAgICAgICAgbl9yZW0gKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IG5fcmVtOwotCQkJaWYgKCAhIG5fcmVtICkKLQkJCSAgICBwb3NfaW5faXRlbSsrOwotCQkgICAgfQotCQl9Ci0JCWVsc2UKLQkJICAgIC8qIGl0ZW0gZmFsbHMgd2hvbGx5IGludG8gU19uZXdbaV0gKi8KLQkJewotCQkgICAgaW50IHJldF92YWw7Ci0JCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOwotCi0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWggPSBCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKTsKLQotCQkgICAgaWYgKCAhIGlzX2RpcmVudHJ5X2xlX2loKGloKSAmJiAocG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oaWgpIHx8Ci0JCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwKSApCi0JCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMjM1OiBiYWxhbmNlX2xlYWY6IHBvc19pbl9pdGVtIG11c3QgYmUgZXF1YWwgdG8gaWhfaXRlbV9sZW4iKTsKLSNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KLQotCQkgICAgcmV0X3ZhbCA9IGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOwotCi0JCSAgICBSRkFMU0UoIHJldF92YWwsCi0JCQkgICAgIlBBUC0xMjI0MDogdW5leHBlY3RlZCB2YWx1ZSByZXR1cm5lZCBieSBsZWFmX21vdmVfaXRlbXMgKCVkKSIsCi0JCQkgICAgcmV0X3ZhbCk7Ci0KLQkJICAgIC8qIHBhc3RlIGludG8gaXRlbSAqLwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOwotCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCBpdGVtX3BvcyAtIG4gKyBzbnVtW2ldLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOwotCi0JCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRChTX25ld1tpXSwgaXRlbV9wb3MgLSBuICsgc251bVtpXSk7Ci0JCSAgICBpZiAoaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkpCi0JCSAgICB7Ci0JCQlsZWFmX3Bhc3RlX2VudHJpZXMgKAotCQkJICAgIGJpLmJpX2JoLCBpdGVtX3BvcyAtIG4gKyBzbnVtW2ldLCBwb3NfaW5faXRlbSwgMSwgCi0JCQkgICAgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KLQkJCSAgICApOwotCQkgICAgfQotCi0JCSAgICAvKiBpZiB3ZSBwYXN0ZSB0byBpbmRpcmVjdCBpdGVtIHVwZGF0ZSBpaF9mcmVlX3NwYWNlICovCi0JCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpCi0JCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKLQkJICAgIHplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCX0KLQkgICAgfQotCi0JICAgIGVsc2UgLyogcGFzdGVkIGl0ZW0gZG9lc24ndCBmYWxsIGludG8gU19uZXdbaV0gKi8KLQkgICAgewotCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKLQkgICAgfQotCSAgICBicmVhazsKLQlkZWZhdWx0OiAgICAvKiBjYXNlcyBkIGFuZCB0ICovCi0JICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyNDU6IGJhbGFuY2VfbGVhZjogYmxrbnVtID4gMjogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCi0JCQkgICAgKGZsYWcgPT0gTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0gTV9DVVQpID8gIkNVVCIgOiAiVU5LTk9XTiIpLCBmbGFnKTsKLQl9Ci0KLQltZW1jcHkgKGluc2VydF9rZXkgKyBpLEJfTl9QS0VZKFNfbmV3W2ldLDApLEtFWV9TSVpFKTsKLQlpbnNlcnRfcHRyW2ldID0gU19uZXdbaV07Ci0KLQlSRkFMU0UgKCFidWZmZXJfam91cm5hbGVkIChTX25ldyBbaV0pIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5IChTX25ldyBbaV0pIHx8Ci0JCWJ1ZmZlcl9kaXJ0eSAoU19uZXcgW2ldKSwKLQkJIlBBUC0xMjI0NzogU19uZXdbJWRdIDogKCViKSIsIGksIFNfbmV3W2ldKTsKLSAgICB9Ci0KLSAgICAvKiBpZiB0aGUgYWZmZWN0ZWQgaXRlbSB3YXMgbm90IHdob2xseSBzaGlmdGVkIHRoZW4gd2UgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IG9wZXJhdGlvbnMgb24gdGhhdCBwYXJ0IG9yIHdob2xlIG9mIHRoZQotICAgICAgIGFmZmVjdGVkIGl0ZW0gd2hpY2ggcmVtYWlucyBpbiBTICovCi0gICAgaWYgKCAwIDw9IGl0ZW1fcG9zICYmIGl0ZW1fcG9zIDwgdGItPnMwbnVtICkKLSAgICB7IC8qIGlmIHdlIG11c3QgaW5zZXJ0IG9yIGFwcGVuZCBpbnRvIGJ1ZmZlciBTWzBdICovCi0KLQlzd2l0Y2ggKGZsYWcpCi0JewotCWNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gaW50byBTWzBdICovCi0JICAgIGJpLnRiID0gdGI7Ci0JICAgIGJpLmJpX2JoID0gdGJTMDsKLQkgICAgYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQkgICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKLQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgaXRlbV9wb3MsIGloLCBib2R5LCB6ZXJvc19udW0pOwotCi0JICAgIC8qIElmIHdlIGluc2VydCB0aGUgZmlyc3Qga2V5IGNoYW5nZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLQkgICAgaWYoIGl0ZW1fcG9zID09IDAgKSB7Ci0JCWlmICh0Yi0+Q0ZMWzBdKSAvKiBjYW4gYmUgMCBpbiByZWlzZXJmc2NrICovCi0JCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sdGJTMCwwKTsKLQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBNX1BBU1RFOiB7ICAvKiBhcHBlbmQgaXRlbSBpbiBTWzBdICovCi0JICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7Ci0KLQkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKTsKLQkgICAgLyogd2hlbiBkaXJlY3RvcnksIG1heSBiZSBuZXcgZW50cnkgYWxyZWFkeSBwYXN0ZWQgKi8KLQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpKSB7Ci0JCWlmICggcG9zX2luX2l0ZW0gPj0gMCAmJgotCQkgICAgcG9zX2luX2l0ZW0gPD0gaWhfZW50cnlfY291bnQocGFzdGVkKSApIHsKLQotCQkgICAgUkZBTFNFKCAhIHRiLT5pbnNlcnRfc2l6ZVswXSwgCi0JCQkgICAgIlBBUC0xMjI2MDogaW5zZXJ0X3NpemUgaXMgMCBhbHJlYWR5Iik7Ci0KLQkJICAgIC8qIHByZXBhcmUgc3BhY2UgKi8KLQkJICAgIGJpLnRiID0gdGI7Ci0JCSAgICBiaS5iaV9iaCA9IHRiUzA7Ci0JCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCQkgICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKLQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7Ci0KLQkJICAgIC8qIHBhc3RlIGVudHJ5ICovCi0JCSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKAotCQkJYmkuYmlfYmgsIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgMSwgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwKLQkJCWJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCi0JCQkpOwotCQkgICAgaWYgKCAhIGl0ZW1fcG9zICYmICEgcG9zX2luX2l0ZW0gKSB7Ci0JCQlSRkFMU0UoICF0Yi0+Q0ZMWzBdIHx8ICF0Yi0+TFswXSwgCi0JCQkJIlBBUC0xMjI3MDogQ0ZMWzBdL0xbMF0gbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJCWlmICh0Yi0+Q0ZMWzBdKSB7Ci0JCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLHRiUzAsMCk7Ci0KLQkJCX0KLQkJICAgIH0KLQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7Ci0JCX0KLQkgICAgfSBlbHNlIHsgLyogcmVndWxhciBvYmplY3QgKi8KLQkJaWYgKCBwb3NfaW5faXRlbSA9PSBpaF9pdGVtX2xlbihwYXN0ZWQpICkgewotCi0JCSAgICBSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAotCQkJICAgICJQQVAtMTIyNzU6IGluc2VydCBzaXplIG11c3Qgbm90IGJlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pOwotCQkgICAgYmkudGIgPSB0YjsKLQkJICAgIGJpLmJpX2JoID0gdGJTMDsKLQkJICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7Ci0JCSAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOwotCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7Ci0KLQkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAocGFzdGVkKSkgewotI2lmIDAKLQkJCVJGQUxTRSggdGItPmluc2VydF9zaXplWzBdICE9IFVORk1fUF9TSVpFLAotCQkJCSJQQVAtMTIyODA6IGluc2VydF9zaXplIGZvciBpbmRpcmVjdCBpdGVtIG11c3QgYmUgJWQsIG5vdCAlZCIsCi0JCQkJVU5GTV9QX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0jZW5kaWYKLQkJCXNldF9paF9mcmVlX3NwYWNlIChwYXN0ZWQsIDApOwotCQkgICAgfQotCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKLQkJfQotCi0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0JCWVsc2UgewotCQkgICAgaWYgKCB0Yi0+aW5zZXJ0X3NpemVbMF0gKSB7Ci0JCQlwcmludF9jdXJfdGIgKCIxMjI4NSIpOwotCQkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjI4NTogYmFsYW5jZV9sZWFmOiBpbnNlcnRfc2l6ZSBtdXN0IGJlIDAgKCVkKSIsIHRiLT5pbnNlcnRfc2l6ZVswXSk7Ci0JCSAgICB9Ci0JCX0KLSNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KLQkgICAgCi0JICAgIH0KLQl9IC8qIGNhc2UgTV9QQVNURTogKi8KLQl9Ci0gICAgfQotCi0jaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaWYgKCBmbGFnID09IE1fUEFTVEUgJiYgdGItPmluc2VydF9zaXplWzBdICkgewotCXByaW50X2N1cl90YiAoIjEyMjkwIik7Ci0JcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjI5MDogYmFsYW5jZV9sZWFmOiBpbnNlcnRfc2l6ZSBpcyBzdGlsbCBub3QgMCAoJWQpIiwgdGItPmluc2VydF9zaXplWzBdKTsKLSAgICB9Ci0jZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCi0KLSAgICByZXR1cm4gMDsKLX0gLyogTGVhZiBsZXZlbCBvZiB0aGUgdHJlZSBpcyBiYWxhbmNlZCAoZW5kIG9mIGJhbGFuY2VfbGVhZikgKi8KLQotCit9CQkJCS8qIExlYWYgbGV2ZWwgb2YgdGhlIHRyZWUgaXMgYmFsYW5jZWQgKGVuZCBvZiBiYWxhbmNlX2xlYWYpICovCiAKIC8qIE1ha2UgZW1wdHkgbm9kZSAqLwotdm9pZCBtYWtlX2VtcHR5X25vZGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpKQordm9pZCBtYWtlX2VtcHR5X25vZGUoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSkKIHsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CiAKLSAgICBSRkFMU0UoIGJpLT5iaV9iaCA9PSBOVUxMLCAiUEFQLTEyMjk1OiBwb2ludGVyIHRvIHRoZSBidWZmZXIgaXMgTlVMTCIpOworCVJGQUxTRShiaS0+YmlfYmggPT0gTlVMTCwgIlBBUC0xMjI5NTogcG9pbnRlciB0byB0aGUgYnVmZmVyIGlzIE5VTEwiKTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJpLT5iaV9iaCk7Ci0gICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgMCApOwotICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIE1BWF9DSElMRF9TSVpFKGJpLT5iaV9iaCkgKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaS0+YmlfYmgpOworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgMCk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBNQVhfQ0hJTERfU0laRShiaS0+YmlfYmgpKTsKIAotICAgIGlmIChiaS0+YmlfcGFyZW50KQotCUJfTl9DSElMRCAoYmktPmJpX3BhcmVudCwgYmktPmJpX3Bvc2l0aW9uKS0+ZGNfc2l6ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKwlpZiAoYmktPmJpX3BhcmVudCkKKwkJQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbiktPmRjX3NpemUgPSAwOwkvKiBFbmRpYW4gc2FmZSBpZiAwICovCiB9CiAKLQogLyogR2V0IGZpcnN0IGVtcHR5IGJ1ZmZlciAqLwotc3RydWN0IGJ1ZmZlcl9oZWFkICogZ2V0X0ZFQiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQorc3RydWN0IGJ1ZmZlcl9oZWFkICpnZXRfRkVCKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGZpcnN0X2I7Ci0gICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworCWludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZmlyc3RfYjsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpICsrKQotCWlmICh0Yi0+RkVCW2ldICE9IDApCi0JICAgIGJyZWFrOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKykKKwkJaWYgKHRiLT5GRUJbaV0gIT0gMCkKKwkJCWJyZWFrOwogCi0gICAgaWYgKGkgPT0gTUFYX0ZFQl9TSVpFKQotCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgInZzLTEyMzAwOiBnZXRfRkVCOiBGRUIgbGlzdCBpcyBlbXB0eSIpOworCWlmIChpID09IE1BWF9GRUJfU0laRSkKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJ2cy0xMjMwMDogZ2V0X0ZFQjogRkVCIGxpc3QgaXMgZW1wdHkiKTsKIAotICAgIGJpLnRiID0gdGI7Ci0gICAgYmkuYmlfYmggPSBmaXJzdF9iID0gdGItPkZFQltpXTsKLSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOwotICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKLSAgICBtYWtlX2VtcHR5X25vZGUgKCZiaSk7Ci0gICAgc2V0X2J1ZmZlcl91cHRvZGF0ZShmaXJzdF9iKTsKLSAgICB0Yi0+RkVCW2ldID0gTlVMTDsKLSAgICB0Yi0+dXNlZFtpXSA9IGZpcnN0X2I7CisJYmkudGIgPSB0YjsKKwliaS5iaV9iaCA9IGZpcnN0X2IgPSB0Yi0+RkVCW2ldOworCWJpLmJpX3BhcmVudCA9IE5VTEw7CisJYmkuYmlfcG9zaXRpb24gPSAwOworCW1ha2VfZW1wdHlfbm9kZSgmYmkpOworCXNldF9idWZmZXJfdXB0b2RhdGUoZmlyc3RfYik7CisJdGItPkZFQltpXSA9IE5VTEw7CisJdGItPnVzZWRbaV0gPSBmaXJzdF9iOwogCi0gICAgcmV0dXJuKGZpcnN0X2IpOworCXJldHVybiAoZmlyc3RfYik7CiB9CiAKLQogLyogVGhpcyBpcyBub3cgdXNlZCBiZWNhdXNlIHJlaXNlcmZzX2ZyZWVfYmxvY2sgaGFzIHRvIGJlIGFibGUgdG8KICoqIHNjaGVkdWxlLgogKi8KLXN0YXRpYyB2b2lkIHN0b3JlX3Rocm93biAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIHN0b3JlX3Rocm93bihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgIGlmIChidWZmZXJfZGlydHkgKGJoKSkKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwgInN0b3JlX3Rocm93biBkZWFscyB3aXRoIGRpcnR5IGJ1ZmZlciIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRiLT50aHJvd24pL3NpemVvZiAodGItPnRocm93blswXSk7IGkgKyspCi0JaWYgKCF0Yi0+dGhyb3duW2ldKSB7Ci0JICAgIHRiLT50aHJvd25baV0gPSBiaDsKLQkgICAgZ2V0X2JoKGJoKSA7IC8qIGZyZWVfdGhyb3duIHB1dHMgdGhpcyAqLwotCSAgICByZXR1cm47Ci0JfQotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwgInN0b3JlX3Rocm93bjogdG9vIG1hbnkgdGhyb3duIGJ1ZmZlcnMiKTsKKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkKKwkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsCisJCQkJICJzdG9yZV90aHJvd24gZGVhbHMgd2l0aCBkaXJ0eSBidWZmZXIiKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRiLT50aHJvd24pIC8gc2l6ZW9mKHRiLT50aHJvd25bMF0pOyBpKyspCisJCWlmICghdGItPnRocm93bltpXSkgeworCQkJdGItPnRocm93bltpXSA9IGJoOworCQkJZ2V0X2JoKGJoKTsJLyogZnJlZV90aHJvd24gcHV0cyB0aGlzICovCisJCQlyZXR1cm47CisJCX0KKwlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwgInN0b3JlX3Rocm93bjogdG9vIG1hbnkgdGhyb3duIGJ1ZmZlcnMiKTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90aHJvd24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpIHsKLSAgICBpbnQgaSA7Ci0gICAgYl9ibG9ja25yX3QgYmxvY2tuciA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPnRocm93bikvc2l6ZW9mICh0Yi0+dGhyb3duWzBdKTsgaSsrKSB7Ci0JaWYgKHRiLT50aHJvd25baV0pIHsKLQkgICAgYmxvY2tuciA9IHRiLT50aHJvd25baV0tPmJfYmxvY2tuciA7Ci0JICAgIGlmIChidWZmZXJfZGlydHkgKHRiLT50aHJvd25baV0pKQotCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwKLQkJCQkiZnJlZV90aHJvd24gZGVhbHMgd2l0aCBkaXJ0eSBidWZmZXIgJWQiLAotCQkJCWJsb2NrbnIpOwotCSAgICBicmVsc2UodGItPnRocm93bltpXSkgOyAvKiBpbmNyZW1lbnRlZCBpbiBzdG9yZV90aHJvd24gKi8KLQkgICAgcmVpc2VyZnNfZnJlZV9ibG9jayAodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwgTlVMTCwgYmxvY2tuciwgMCk7CitzdGF0aWMgdm9pZCBmcmVlX3Rocm93bihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKK3sKKwlpbnQgaTsKKwliX2Jsb2NrbnJfdCBibG9ja25yOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YodGItPnRocm93bikgLyBzaXplb2YodGItPnRocm93blswXSk7IGkrKykgeworCQlpZiAodGItPnRocm93bltpXSkgeworCQkJYmxvY2tuciA9IHRiLT50aHJvd25baV0tPmJfYmxvY2tucjsKKwkJCWlmIChidWZmZXJfZGlydHkodGItPnRocm93bltpXSkpCisJCQkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsCisJCQkJCQkgImZyZWVfdGhyb3duIGRlYWxzIHdpdGggZGlydHkgYnVmZmVyICVkIiwKKwkJCQkJCSBibG9ja25yKTsKKwkJCWJyZWxzZSh0Yi0+dGhyb3duW2ldKTsJLyogaW5jcmVtZW50ZWQgaW4gc3RvcmVfdGhyb3duICovCisJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsIE5VTEwsCisJCQkJCSAgICBibG9ja25yLCAwKTsKKwkJfQogCX0KLSAgICB9CiB9CiAKLXZvaWQgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit2b2lkIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCBibG9ja19oZWFkICpibGtoOwotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBzZXRfYmxraF9sZXZlbCggYmxraCwgRlJFRV9MRVZFTCApOwotICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIDAgKTsKLSAgICAKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOwotICAgIHN0b3JlX3Rocm93biAodGIsIGJoKTsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJc2V0X2Jsa2hfbGV2ZWwoYmxraCwgRlJFRV9MRVZFTCk7CisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCAwKTsKKworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJc3RvcmVfdGhyb3duKHRiLCBiaCk7CiB9CiAKIC8qIFJlcGxhY2Ugbl9kZXN0J3RoIGtleSBpbiBidWZmZXIgZGVzdCBieSBuX3NyYyd0aCBrZXkgb2YgYnVmZmVyIHNyYy4qLwotdm9pZCByZXBsYWNlX2tleSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0LCBpbnQgbl9kZXN0LAotCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgaW50IG5fc3JjKQordm9pZCByZXBsYWNlX2tleShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpkZXN0LCBpbnQgbl9kZXN0LAorCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBuX3NyYykKIHsKIAotICAgIFJGQUxTRSggZGVzdCA9PSBOVUxMIHx8IHNyYyA9PSBOVUxMLAotCSAgICAidnMtMTIzMDU6IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBidWZmZXIgaXMgMCAoc3JjPSVwLCBkZXN0PSVwKSIsCi0JICAgIHNyYywgZGVzdCk7Ci0gICAgUkZBTFNFKCAhIEJfSVNfS0VZU19MRVZFTCAoZGVzdCksCi0JICAgICJ2cy0xMjMxMDogaW52YWxpZCBsZXZlbCAoJXopIGZvciBkZXN0aW5hdGlvbiBidWZmZXIuIGRlc3QgbXVzdCBiZSBsZWFmIiwKLQkgICAgZGVzdCk7Ci0gICAgUkZBTFNFKCBuX2Rlc3QgPCAwIHx8IG5fc3JjIDwgMCwKLQkgICAgInZzLTEyMzE1OiBzcmMoJWQpIG9yIGRlc3QoJWQpIGtleSBudW1iZXIgPCAwIiwgbl9zcmMsIG5fZGVzdCk7Ci0gICAgUkZBTFNFKCBuX2Rlc3QgPj0gQl9OUl9JVEVNUyhkZXN0KSB8fCBuX3NyYyA+PSBCX05SX0lURU1TKHNyYyksCi0JICAgICJ2cy0xMjMyMDogc3JjKCVkKCVkKSkgb3IgZGVzdCglZCglZCkpIGtleSBudW1iZXIgaXMgdG9vIGJpZyIsCi0JICAgIG5fc3JjLCBCX05SX0lURU1TKHNyYyksIG5fZGVzdCwgQl9OUl9JVEVNUyhkZXN0KSk7Ci0gICAKLSAgICBpZiAoQl9JU19JVEVNU19MRVZFTCAoc3JjKSkKLQkvKiBzb3VyY2UgYnVmZmVyIGNvbnRhaW5zIGxlYWYgbm9kZSAqLwotCW1lbWNweSAoQl9OX1BERUxJTV9LRVkoZGVzdCxuX2Rlc3QpLCBCX05fUElURU1fSEVBRChzcmMsbl9zcmMpLCBLRVlfU0laRSk7Ci0gICAgZWxzZQotCW1lbWNweSAoQl9OX1BERUxJTV9LRVkoZGVzdCxuX2Rlc3QpLCBCX05fUERFTElNX0tFWShzcmMsbl9zcmMpLCBLRVlfU0laRSk7CisJUkZBTFNFKGRlc3QgPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCwKKwkgICAgICAgInZzLTEyMzA1OiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYnVmZmVyIGlzIDAgKHNyYz0lcCwgZGVzdD0lcCkiLAorCSAgICAgICBzcmMsIGRlc3QpOworCVJGQUxTRSghQl9JU19LRVlTX0xFVkVMKGRlc3QpLAorCSAgICAgICAidnMtMTIzMTA6IGludmFsaWQgbGV2ZWwgKCV6KSBmb3IgZGVzdGluYXRpb24gYnVmZmVyLiBkZXN0IG11c3QgYmUgbGVhZiIsCisJICAgICAgIGRlc3QpOworCVJGQUxTRShuX2Rlc3QgPCAwIHx8IG5fc3JjIDwgMCwKKwkgICAgICAgInZzLTEyMzE1OiBzcmMoJWQpIG9yIGRlc3QoJWQpIGtleSBudW1iZXIgPCAwIiwgbl9zcmMsIG5fZGVzdCk7CisJUkZBTFNFKG5fZGVzdCA+PSBCX05SX0lURU1TKGRlc3QpIHx8IG5fc3JjID49IEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgICAgInZzLTEyMzIwOiBzcmMoJWQoJWQpKSBvciBkZXN0KCVkKCVkKSkga2V5IG51bWJlciBpcyB0b28gYmlnIiwKKwkgICAgICAgbl9zcmMsIEJfTlJfSVRFTVMoc3JjKSwgbl9kZXN0LCBCX05SX0lURU1TKGRlc3QpKTsKIAotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIGRlc3QsIDApOworCWlmIChCX0lTX0lURU1TX0xFVkVMKHNyYykpCisJCS8qIHNvdXJjZSBidWZmZXIgY29udGFpbnMgbGVhZiBub2RlICovCisJCW1lbWNweShCX05fUERFTElNX0tFWShkZXN0LCBuX2Rlc3QpLCBCX05fUElURU1fSEVBRChzcmMsIG5fc3JjKSwKKwkJICAgICAgIEtFWV9TSVpFKTsKKwllbHNlCisJCW1lbWNweShCX05fUERFTElNX0tFWShkZXN0LCBuX2Rlc3QpLCBCX05fUERFTElNX0tFWShzcmMsIG5fc3JjKSwKKwkJICAgICAgIEtFWV9TSVpFKTsKKworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSh0YiwgZGVzdCwgMCk7CiB9CiAKLQotaW50IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICgKLQkJCQlzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQkJCWludCBoCi0JCQkJKQoraW50IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgaW50IFNoX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCWludCBTaF9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOwogCi0gIFJGQUxTRSggUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSA9PSAwIHx8IHRiLT5GTFtoXSA9PSAwLAotCSAgInZzLTEyMzI1OiBGTFslZF0oJXApIG9yIEZbJWRdKCVwKSBkb2VzIG5vdCBleGlzdCIsIAotCSAgaCwgdGItPkZMW2hdLCBoLCBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKTsKKwlSRkFMU0UoUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpID09IDAgfHwgdGItPkZMW2hdID09IDAsCisJICAgICAgICJ2cy0xMjMyNTogRkxbJWRdKCVwKSBvciBGWyVkXSglcCkgZG9lcyBub3QgZXhpc3QiLAorCSAgICAgICBoLCB0Yi0+RkxbaF0sIGgsIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSk7CiAKLSAgaWYgKFNoX3Bvc2l0aW9uID09IDApCi0gICAgcmV0dXJuIEJfTlJfSVRFTVMgKHRiLT5GTFtoXSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gU2hfcG9zaXRpb24gLSAxOworCWlmIChTaF9wb3NpdGlvbiA9PSAwKQorCQlyZXR1cm4gQl9OUl9JVEVNUyh0Yi0+RkxbaF0pOworCWVsc2UKKwkJcmV0dXJuIFNoX3Bvc2l0aW9uIC0gMTsKIH0KIAotCi1pbnQgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoraW50IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gIGludCBTaF9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKKwlpbnQgU2hfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKIAotICBSRkFMU0UoIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkgPT0gMCB8fCB0Yi0+RlJbaF0gPT0gMCwKLQkgICJ2cy0xMjMzMDogRlslZF0oJXApIG9yIEZSWyVkXSglcCkgZG9lcyBub3QgZXhpc3QiLCAKLQkgIGgsIFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCksIGgsIHRiLT5GUltoXSk7CisJUkZBTFNFKFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKSA9PSAwIHx8IHRiLT5GUltoXSA9PSAwLAorCSAgICAgICAidnMtMTIzMzA6IEZbJWRdKCVwKSBvciBGUlslZF0oJXApIGRvZXMgbm90IGV4aXN0IiwKKwkgICAgICAgaCwgUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpLCBoLCB0Yi0+RlJbaF0pOwogCi0gIGlmIChTaF9wb3NpdGlvbiA9PSBCX05SX0lURU1TIChQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKSkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHJldHVybiBTaF9wb3NpdGlvbiArIDE7CisJaWYgKFNoX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMoUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gU2hfcG9zaXRpb24gKyAxOwogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIAotaW50IGlzX3JldXNhYmxlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSk7Ci1zdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ub2RlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgY2hhciAqIG1lcykKK2ludCBpc19yZXVzYWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGJfYmxvY2tucl90IGJsb2NrLCBpbnQgYml0X3ZhbHVlKTsKK3N0YXRpYyB2b2lkIGNoZWNrX2ludGVybmFsX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCWNoYXIgKm1lcykKIHsKLSAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKLSAgaW50IGk7CisJc3RydWN0IGRpc2tfY2hpbGQgKmRjOworCWludCBpOwogCi0gIFJGQUxTRSggIWJoLCAiUEFQLTEyMzM2OiBiaCA9PSAwIik7CisJUkZBTFNFKCFiaCwgIlBBUC0xMjMzNjogYmggPT0gMCIpOwogCi0gIGlmICghYmggfHwgIUJfSVNfSU5fVFJFRSAoYmgpKQotICAgIHJldHVybjsKLSAKLSAgUkZBTFNFKCAhYnVmZmVyX2RpcnR5IChiaCkgJiYgCi0JICAhKGJ1ZmZlcl9qb3VybmFsZWQoYmgpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSksCi0JICAiUEFQLTEyMzM3OiBidWZmZXIgKCViKSBtdXN0IGJlIGRpcnR5IiwgYmgpOwotICBkYyA9IEJfTl9DSElMRCAoYmgsIDApOworCWlmICghYmggfHwgIUJfSVNfSU5fVFJFRShiaCkpCisJCXJldHVybjsKIAotICBmb3IgKGkgPSAwOyBpIDw9IEJfTlJfSVRFTVMgKGJoKTsgaSArKywgZGMgKyspIHsKLSAgICBpZiAoIWlzX3JldXNhYmxlIChzLCBkY19ibG9ja19udW1iZXIoZGMpLCAxKSApIHsKLSAgICAgIHByaW50X2N1cl90YiAobWVzKTsKLSAgICAgIHJlaXNlcmZzX3BhbmljIChzLCAiUEFQLTEyMzM4OiBjaGVja19pbnRlcm5hbF9ub2RlOiBpbnZhbGlkIGNoaWxkIHBvaW50ZXIgJXkgaW4gJWIiLCBkYywgYmgpOwotICAgIH0KLSAgfQotfQorCVJGQUxTRSghYnVmZmVyX2RpcnR5KGJoKSAmJgorCSAgICAgICAhKGJ1ZmZlcl9qb3VybmFsZWQoYmgpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSksCisJICAgICAgICJQQVAtMTIzMzc6IGJ1ZmZlciAoJWIpIG11c3QgYmUgZGlydHkiLCBiaCk7CisJZGMgPSBCX05fQ0hJTEQoYmgsIDApOwogCi0KLXN0YXRpYyBpbnQgbG9ja2VkX29yX25vdF9pbl90cmVlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgY2hhciAqIHdoaWNoKQotewotICBpZiAoICghYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQgKGJoKSAmJiBidWZmZXJfbG9ja2VkIChiaCkpIHx8Ci0gICAgICAgICFCX0lTX0lOX1RSRUUgKGJoKSApIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAidnMtMTIzMzk6IGxvY2tlZF9vcl9ub3RfaW5fdHJlZTogJXMgKCViKSIsCi0gICAgICAgICAgICAgICAgICAgICAgd2hpY2gsIGJoKTsKLSAgICByZXR1cm4gMTsKLSAgfSAKLSAgcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBjaGVja19iZWZvcmVfYmFsYW5jaW5nIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCi17Ci0gIGludCByZXR2YWwgPSAwOwkKLQotICBpZiAoIGN1cl90YiApIHsKLSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtMTIzMzU6IGNoZWNrX2JlZm9yZV9iYWxhbmNpbmc6ICIKLQkJICAgICJzdXNwZWN0IHRoYXQgc2NoZWR1bGUgb2NjdXJyZWQgYmFzZWQgb24gY3VyX3RiIG5vdCBiZWluZyBudWxsIGF0IHRoaXMgcG9pbnQgaW4gY29kZS4gIgotCQkgICAgImRvX2JhbGFuY2UgY2Fubm90IHByb3Blcmx5IGhhbmRsZSBzY2hlZHVsZSBvY2N1cnJpbmcgd2hpbGUgaXQgcnVucy4iKTsKLSAgfQotICAKLSAgLyogZG91YmxlIGNoZWNrIHRoYXQgYnVmZmVycyB0aGF0IHdlIHdpbGwgbW9kaWZ5IGFyZSB1bmxvY2tlZC4gKGZpeF9ub2RlcyBzaG91bGQgYWxyZWFkeSBoYXZlCi0gICAgIHByZXBwZWQgYWxsIG9mIHRoZXNlIGZvciB1cykuICovCi0gIGlmICggdGItPmxudW1bMF0gKSB7Ci0gICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkxbMF0sICJMWzBdIik7Ci0gICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkZMWzBdLCAiRkxbMF0iKTsKLSAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+Q0ZMWzBdLCAiQ0ZMWzBdIik7Ci0gICAgY2hlY2tfbGVhZiAodGItPkxbMF0pOwotICB9Ci0gIGlmICggdGItPnJudW1bMF0gKSB7Ci0gICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPlJbMF0sICJSWzBdIik7Ci0gICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkZSWzBdLCAiRlJbMF0iKTsKLSAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+Q0ZSWzBdLCAiQ0ZSWzBdIik7Ci0gICAgY2hlY2tfbGVhZiAodGItPlJbMF0pOwotICB9Ci0gIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCksICJTWzBdIik7Ci0gIGNoZWNrX2xlYWYgKFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCkpOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCi17Ci0gICAgaWYgKHRiLT5sbnVtWzBdKSB7Ci0JaWYgKEJfRlJFRV9TUEFDRSAodGItPkxbMF0pICE9IAotCSAgICBNQVhfQ0hJTERfU0laRSAodGItPkxbMF0pIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHRiLT5GTFswXSwgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKSkpKSB7Ci0JICAgIHByaW50X2N1cl90YiAoIjEyMjIxIik7Ci0JICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIzNTU6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogc2hpZnQgdG8gbGVmdCB3YXMgaW5jb3JyZWN0Iik7CisJZm9yIChpID0gMDsgaSA8PSBCX05SX0lURU1TKGJoKTsgaSsrLCBkYysrKSB7CisJCWlmICghaXNfcmV1c2FibGUocywgZGNfYmxvY2tfbnVtYmVyKGRjKSwgMSkpIHsKKwkJCXByaW50X2N1cl90YihtZXMpOworCQkJcmVpc2VyZnNfcGFuaWMocywKKwkJCQkgICAgICAgIlBBUC0xMjMzODogY2hlY2tfaW50ZXJuYWxfbm9kZTogaW52YWxpZCBjaGlsZCBwb2ludGVyICV5IGluICViIiwKKwkJCQkgICAgICAgZGMsIGJoKTsKKwkJfQogCX0KLSAgICB9Ci0gICAgaWYgKHRiLT5ybnVtWzBdKSB7Ci0JaWYgKEJfRlJFRV9TUEFDRSAodGItPlJbMF0pICE9IAotCSAgICBNQVhfQ0hJTERfU0laRSAodGItPlJbMF0pIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHRiLT5GUlswXSwgZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCkpKSkgewotCSAgICBwcmludF9jdXJfdGIgKCIxMjIyMiIpOwotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMzYwOiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IHNoaWZ0IHRvIHJpZ2h0IHdhcyBpbmNvcnJlY3QiKTsKK30KKworc3RhdGljIGludCBsb2NrZWRfb3Jfbm90X2luX3RyZWUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgY2hhciAqd2hpY2gpCit7CisJaWYgKCghYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoYmgpICYmIGJ1ZmZlcl9sb2NrZWQoYmgpKSB8fAorCSAgICAhQl9JU19JTl9UUkVFKGJoKSkgeworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJ2cy0xMjMzOTogbG9ja2VkX29yX25vdF9pbl90cmVlOiAlcyAoJWIpIiwKKwkJCQkgd2hpY2gsIGJoKTsKKwkJcmV0dXJuIDE7CiAJfQotICAgIH0KLSAgICBpZiAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMSkgJiYKLQkoQl9GUkVFX1NQQUNFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgIT0gCi0JCSAgICAoTUFYX0NISUxEX1NJWkUgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSAtCi0JCSAgICBkY19zaXplKEJfTl9DSElMRCAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMSksCi0JCSAgICBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSkpKSApKSB7Ci0JaW50IGxlZnQgPSBCX0ZSRUVfU1BBQ0UgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKTsKLQlpbnQgcmlnaHQgPSAoTUFYX0NISUxEX1NJWkUgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSAtCi0JCSAgICBkY19zaXplKEJfTl9DSElMRCAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMSksCi0JCQlQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSkpKTsKLQlwcmludF9jdXJfdGIgKCIxMjIyMyIpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwKLQkgICAgIkJfRlJFRV9TUEFDRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpID0gJWQ7ICIKLSAgICAJICAgICJNQVhfQ0hJTERfU0laRSAoJWQpIC0gZGNfc2l6ZSggJXksICVkICkgWyVkXSA9ICVkIiwKLQkgICAgbGVmdCwKLQkgICAgTUFYX0NISUxEX1NJWkUgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSwKLQkgICAgUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMSksCi0JICAgIFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpLAotCSAgICBkY19zaXplKEJfTl9DSElMRCAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMSksIFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEgKSkgKSwKLQkgICAgcmlnaHQgKTsKLQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMzY1OiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IFMgaXMgaW5jb3JyZWN0Iik7Ci0gICAgfQorCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIGNoZWNrX2xlYWZfbGV2ZWwgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3N0YXRpYyBpbnQgY2hlY2tfYmVmb3JlX2JhbGFuY2luZyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgY2hlY2tfbGVhZiAodGItPkxbMF0pOwotICBjaGVja19sZWFmICh0Yi0+UlswXSk7Ci0gIGNoZWNrX2xlYWYgKFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCkpOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGN1cl90YikgeworCQlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsICJ2cy0xMjMzNTogY2hlY2tfYmVmb3JlX2JhbGFuY2luZzogIgorCQkJICAgICAgICJzdXNwZWN0IHRoYXQgc2NoZWR1bGUgb2NjdXJyZWQgYmFzZWQgb24gY3VyX3RiIG5vdCBiZWluZyBudWxsIGF0IHRoaXMgcG9pbnQgaW4gY29kZS4gIgorCQkJICAgICAgICJkb19iYWxhbmNlIGNhbm5vdCBwcm9wZXJseSBoYW5kbGUgc2NoZWR1bGUgb2NjdXJyaW5nIHdoaWxlIGl0IHJ1bnMuIik7CisJfQorCisJLyogZG91YmxlIGNoZWNrIHRoYXQgYnVmZmVycyB0aGF0IHdlIHdpbGwgbW9kaWZ5IGFyZSB1bmxvY2tlZC4gKGZpeF9ub2RlcyBzaG91bGQgYWxyZWFkeSBoYXZlCisJICAgcHJlcHBlZCBhbGwgb2YgdGhlc2UgZm9yIHVzKS4gKi8KKwlpZiAodGItPmxudW1bMF0pIHsKKwkJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSh0Yi0+TFswXSwgIkxbMF0iKTsKKwkJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSh0Yi0+RkxbMF0sICJGTFswXSIpOworCQlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKHRiLT5DRkxbMF0sICJDRkxbMF0iKTsKKwkJY2hlY2tfbGVhZih0Yi0+TFswXSk7CisJfQorCWlmICh0Yi0+cm51bVswXSkgeworCQlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKHRiLT5SWzBdLCAiUlswXSIpOworCQlyZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlKHRiLT5GUlswXSwgIkZSWzBdIik7CisJCXJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUodGItPkNGUlswXSwgIkNGUlswXSIpOworCQljaGVja19sZWFmKHRiLT5SWzBdKTsKKwl9CisJcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZShQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCksICJTWzBdIik7CisJY2hlY2tfbGVhZihQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCkpOworCisJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfbGV2ZWxzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdGF0aWMgdm9pZCBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWYoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gIGludCBoOworCWlmICh0Yi0+bG51bVswXSkgeworCQlpZiAoQl9GUkVFX1NQQUNFKHRiLT5MWzBdKSAhPQorCQkgICAgTUFYX0NISUxEX1NJWkUodGItPkxbMF0pIC0KKwkJICAgIGRjX3NpemUoQl9OX0NISUxECisJCQkgICAgKHRiLT5GTFswXSwgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApKSkpIHsKKwkJCXByaW50X2N1cl90YigiMTIyMjEiKTsKKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC0xMjM1NTogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBzaGlmdCB0byBsZWZ0IHdhcyBpbmNvcnJlY3QiKTsKKwkJfQorCX0KKwlpZiAodGItPnJudW1bMF0pIHsKKwkJaWYgKEJfRlJFRV9TUEFDRSh0Yi0+UlswXSkgIT0KKwkJICAgIE1BWF9DSElMRF9TSVpFKHRiLT5SWzBdKSAtCisJCSAgICBkY19zaXplKEJfTl9DSElMRAorCQkJICAgICh0Yi0+RlJbMF0sIGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCkpKSkgeworCQkJcHJpbnRfY3VyX3RiKCIxMjIyMiIpOworCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAiUEFQLTEyMzYwOiBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWY6IHNoaWZ0IHRvIHJpZ2h0IHdhcyBpbmNvcnJlY3QiKTsKKwkJfQorCX0KKwlpZiAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDEpICYmCisJICAgIChCX0ZSRUVfU1BBQ0UoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApKSAhPQorCSAgICAgKE1BWF9DSElMRF9TSVpFKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAwKSkgLQorCSAgICAgIGRjX3NpemUoQl9OX0NISUxEKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAxKSwKKwkJCQlQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpKSkpKSkgeworCQlpbnQgbGVmdCA9IEJfRlJFRV9TUEFDRShQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgMCkpOworCQlpbnQgcmlnaHQgPSAoTUFYX0NISUxEX1NJWkUoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApKSAtCisJCQkgICAgIGRjX3NpemUoQl9OX0NISUxEKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAxKSwKKwkJCQkJICAgICAgIFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwKKwkJCQkJCQkgICAgICAgMSkpKSk7CisJCXByaW50X2N1cl90YigiMTIyMjMiKTsKKwkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsCisJCQkJICJCX0ZSRUVfU1BBQ0UgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSA9ICVkOyAiCisJCQkJICJNQVhfQ0hJTERfU0laRSAoJWQpIC0gZGNfc2l6ZSggJXksICVkICkgWyVkXSA9ICVkIiwKKwkJCQkgbGVmdCwKKwkJCQkgTUFYX0NISUxEX1NJWkUoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApKSwKKwkJCQkgUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDEpLAorCQkJCSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpLAorCQkJCSBkY19zaXplKEJfTl9DSElMRAorCQkJCQkgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCAxKSwKKwkJCQkJICBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIDEpKSksCisJCQkJIHJpZ2h0KTsKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtMTIzNjU6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogUyBpcyBpbmNvcnJlY3QiKTsKKwl9Cit9CiAKLSAgLyogY2hlY2sgYWxsIGludGVybmFsIG5vZGVzICovCi0gIGZvciAoaCA9IDE7IHRiLT5pbnNlcnRfc2l6ZVtoXTsgaCArKykgewotICAgIGNoZWNrX2ludGVybmFsX25vZGUgKHRiLT50Yl9zYiwgUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKSwgIkJBRCBCVUZGRVIgT04gUEFUSCIpOwotICAgIGlmICh0Yi0+bG51bVtoXSkKLSAgICAgIGNoZWNrX2ludGVybmFsX25vZGUgKHRiLT50Yl9zYiwgdGItPkxbaF0sICJCQUQgTCIpOwotICAgIGlmICh0Yi0+cm51bVtoXSkKLSAgICAgIGNoZWNrX2ludGVybmFsX25vZGUgKHRiLT50Yl9zYiwgdGItPlJbaF0sICJCQUQgUiIpOwotICB9CitzdGF0aWMgdm9pZCBjaGVja19sZWFmX2xldmVsKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQoreworCWNoZWNrX2xlYWYodGItPkxbMF0pOworCWNoZWNrX2xlYWYodGItPlJbMF0pOworCWNoZWNrX2xlYWYoUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfbGV2ZWxzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQoreworCWludCBoOworCisJLyogY2hlY2sgYWxsIGludGVybmFsIG5vZGVzICovCisJZm9yIChoID0gMTsgdGItPmluc2VydF9zaXplW2hdOyBoKyspIHsKKwkJY2hlY2tfaW50ZXJuYWxfbm9kZSh0Yi0+dGJfc2IsIFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSwKKwkJCQkgICAgIkJBRCBCVUZGRVIgT04gUEFUSCIpOworCQlpZiAodGItPmxudW1baF0pCisJCQljaGVja19pbnRlcm5hbF9ub2RlKHRiLT50Yl9zYiwgdGItPkxbaF0sICJCQUQgTCIpOworCQlpZiAodGItPnJudW1baF0pCisJCQljaGVja19pbnRlcm5hbF9ub2RlKHRiLT50Yl9zYiwgdGItPlJbaF0sICJCQUQgUiIpOworCX0KIAogfQogCiAjZW5kaWYKIAotCi0KLQotCi0KIC8qIE5vdyB3ZSBoYXZlIGFsbCBvZiB0aGUgYnVmZmVycyB0aGF0IG11c3QgYmUgdXNlZCBpbiBiYWxhbmNpbmcgb2YKICAgIHRoZSB0cmVlLiAgV2UgcmVseSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHNjaGVkdWxlKCkgd2lsbCBub3Qgb2NjdXIKICAgIHdoaWxlIGRvX2JhbGFuY2Ugd29ya3MuICggT25seSBpbnRlcnJ1cHQgaGFuZGxlcnMgYXJlIGFjY2VwdGFibGUuKQpAQCAtMTQ4NCwxMTQgKzIwMjksMTA5IEBACiAKICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19iYWxhbmNlX3N0YXJ0cyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fYmFsYW5jZV9zdGFydHMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gICAgLyogdXNlIHByaW50X2N1cl90YigpIHRvIHNlZSBpbml0aWFsIHN0YXRlIG9mIHN0cnVjdAotICAgICAgIHRyZWVfYmFsYW5jZSAqLworCS8qIHVzZSBwcmludF9jdXJfdGIoKSB0byBzZWUgaW5pdGlhbCBzdGF0ZSBvZiBzdHJ1Y3QKKwkgICB0cmVlX2JhbGFuY2UgKi8KIAotICAgIC8qIHN0b3JlX3ByaW50X3RiICh0Yik7ICovCisJLyogc3RvcmVfcHJpbnRfdGIgKHRiKTsgKi8KIAotICAgIC8qIGRvIG5vdCBkZWxldGUsIGp1c3QgY29tbWVudCBpdCBvdXQgKi8KKwkvKiBkbyBub3QgZGVsZXRlLCBqdXN0IGNvbW1lbnQgaXQgb3V0ICovCiAvKiAgICBwcmludF90YihmbGFnLCBQQVRIX0xBU1RfUE9TSVRJT04odGItPnRiX3BhdGgpLCB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW0sIHRiLCAKIAkgICAgICJjaGVjayIpOyovCi0gICAgUkZBTFNFKCBjaGVja19iZWZvcmVfYmFsYW5jaW5nICh0YiksICJQQVAtMTIzNDA6IGxvY2tlZCBidWZmZXJzIGluIFRCIik7CisJUkZBTFNFKGNoZWNrX2JlZm9yZV9iYWxhbmNpbmcodGIpLCAiUEFQLTEyMzQwOiBsb2NrZWQgYnVmZmVycyBpbiBUQiIpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGN1cl90YiA9IHRiOworCWN1cl90YiA9IHRiOwogI2VuZGlmCiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIGRvX2JhbGFuY2VfY29tcGxldGVkIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fYmFsYW5jZV9jb21wbGV0ZWQoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gICAgCisKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBjaGVja19sZWFmX2xldmVsICh0Yik7Ci0gICAgY2hlY2tfaW50ZXJuYWxfbGV2ZWxzICh0Yik7Ci0gICAgY3VyX3RiID0gTlVMTDsKKwljaGVja19sZWFmX2xldmVsKHRiKTsKKwljaGVja19pbnRlcm5hbF9sZXZlbHModGIpOworCWN1cl90YiA9IE5VTEw7CiAjZW5kaWYKIAotICAgIC8qIHJlaXNlcmZzX2ZyZWVfYmxvY2sgaXMgbm8gbG9uZ2VyIHNjaGVkdWxlIHNhZmUuICBTbywgd2UgbmVlZCB0bwotICAgICoqIHB1dCB0aGUgYnVmZmVycyB3ZSB3YW50IGZyZWVkIG9uIHRoZSB0aHJvd24gbGlzdCBkdXJpbmcgZG9fYmFsYW5jZSwKLSAgICAqKiBhbmQgdGhlbiBmcmVlIHRoZW0gbm93Ci0gICAgKi8KKwkvKiByZWlzZXJmc19mcmVlX2Jsb2NrIGlzIG5vIGxvbmdlciBzY2hlZHVsZSBzYWZlLiAgU28sIHdlIG5lZWQgdG8KKwkgKiogcHV0IHRoZSBidWZmZXJzIHdlIHdhbnQgZnJlZWQgb24gdGhlIHRocm93biBsaXN0IGR1cmluZyBkb19iYWxhbmNlLAorCSAqKiBhbmQgdGhlbiBmcmVlIHRoZW0gbm93CisJICovCiAKLSAgICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UgKys7CisJUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19kb19iYWxhbmNlKys7CiAKLQotICAgIC8qIHJlbGVhc2UgYWxsIG5vZGVzIGhvbGQgdG8gcGVyZm9ybSB0aGUgYmFsYW5jaW5nICovCi0gICAgdW5maXhfbm9kZXModGIpOwotCi0gICAgZnJlZV90aHJvd24odGIpIDsKLX0KLQotCi0KLQotCi12b2lkIGRvX2JhbGFuY2UgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAqLwotCQkgc3RydWN0IGl0ZW1faGVhZCAqIGloLAkgICAvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtICovCi0JCSBjb25zdCBjaGFyICogYm9keSwgIC8qIGJvZHkgIG9mIGluc2VydGVkIGl0ZW0gb3IgYnl0ZXMgdG8gcGFzdGUgKi8KLQkJIGludCBmbGFnKSAgLyogaSAtIGluc2VydCwgZCAtIGRlbGV0ZQotCQkJICAgICAgIGMgLSBjdXQsIHAgLSBwYXN0ZQotCQkJCQkJICAgICAgCi0JCQkgICAgICAgQ3V0IG1lYW5zIGRlbGV0ZSBwYXJ0IG9mIGFuIGl0ZW0KLQkJCSAgICAgICAoaW5jbHVkZXMgcmVtb3ZpbmcgYW4gZW50cnkgZnJvbSBhCi0JCQkgICAgICAgZGlyZWN0b3J5KS4KLQkJCQkJCSAgICAgIAotCQkJICAgICAgIERlbGV0ZSBtZWFucyBkZWxldGUgd2hvbGUgaXRlbS4KLQkJCQkJCSAgICAgIAotCQkJICAgICAgIEluc2VydCBtZWFucyBhZGQgYSBuZXcgaXRlbSBpbnRvIHRoZQotCQkJICAgICAgIHRyZWUuCi0JCQkJCQkgICAgICAJCQkJCQkgICAgICAKLQkJCSAgICAgICBQYXN0ZSBtZWFucyB0byBhcHBlbmQgdG8gdGhlIGVuZCBvZiBhbgotCQkJICAgICAgIGV4aXN0aW5nIGZpbGUgb3IgdG8gaW5zZXJ0IGEgZGlyZWN0b3J5Ci0JCQkgICAgICAgZW50cnkuICAqLwotewotICAgIGludCBjaGlsZF9wb3MsIC8qIHBvc2l0aW9uIG9mIGEgY2hpbGQgbm9kZSBpbiBpdHMgcGFyZW50ICovCi0JaDsJICAgLyogbGV2ZWwgb2YgdGhlIHRyZWUgYmVpbmcgcHJvY2Vzc2VkICovCi0gICAgc3RydWN0IGl0ZW1faGVhZCBpbnNlcnRfa2V5WzJdOyAvKiBpbiBvdXIgcHJvY2Vzc2luZyBvZiBvbmUgbGV2ZWwKLQkJCQkgICAgICAgd2Ugc29tZXRpbWVzIGRldGVybWluZSB3aGF0Ci0JCQkJICAgICAgIG11c3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbmV4dAotCQkJCSAgICAgICBoaWdoZXIgbGV2ZWwuICBUaGlzIGluc2VydGlvbgotCQkJCSAgICAgICBjb25zaXN0cyBvZiBhIGtleSBvciB0d28ga2V5cwotCQkJCSAgICAgICBhbmQgdGhlaXIgY29ycmVzcG9uZGluZwotCQkJCSAgICAgICBwb2ludGVycyAqLwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaW5zZXJ0X3B0clsyXTsgLyogaW5zZXJ0ZWQgbm9kZS1wdHJzIGZvciB0aGUgbmV4dAotCQkJCQkgIGxldmVsICovCi0KLSAgICB0Yi0+dGJfbW9kZSA9IGZsYWc7Ci0gICAgdGItPm5lZWRfYmFsYW5jZV9kaXJ0eSA9IDA7Ci0KLSAgICBpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkgewotICAgICAgICByZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsICJjbG0tNjAwMDogZG9fYmFsYW5jZSwgZnMgZ2VuZXJhdGlvbiBoYXMgY2hhbmdlZFxuIikgOwotICAgIH0KLSAgICAvKiBpZiB3ZSBoYXZlIG5vIHJlYWwgd29yayB0byBkbyAgKi8KLSAgICBpZiAoICEgdGItPmluc2VydF9zaXplWzBdICkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwKLQkJCSAgIlBBUC0xMjM1MDogZG9fYmFsYW5jZTogaW5zZXJ0X3NpemUgPT0gMCwgbW9kZSA9PSAlYyIsCi0JCQkgIGZsYWcpOworCS8qIHJlbGVhc2UgYWxsIG5vZGVzIGhvbGQgdG8gcGVyZm9ybSB0aGUgYmFsYW5jaW5nICovCiAJdW5maXhfbm9kZXModGIpOwotCXJldHVybjsKLSAgICB9CiAKLSAgICBhdG9taWNfaW5jICgmKGZzX2dlbmVyYXRpb24gKHRiLT50Yl9zYikpKTsKLSAgICBkb19iYWxhbmNlX3N0YXJ0cyAodGIpOwotICAgIAorCWZyZWVfdGhyb3duKHRiKTsKK30KKwordm9pZCBkb19iYWxhbmNlKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAkvKiB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlICovCisJCXN0cnVjdCBpdGVtX2hlYWQgKmloLAkvKiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtICovCisJCWNvbnN0IGNoYXIgKmJvZHksCS8qIGJvZHkgIG9mIGluc2VydGVkIGl0ZW0gb3IgYnl0ZXMgdG8gcGFzdGUgKi8KKwkJaW50IGZsYWcpCit7CQkJCS8qIGkgLSBpbnNlcnQsIGQgLSBkZWxldGUKKwkJCQkgICBjIC0gY3V0LCBwIC0gcGFzdGUKKworCQkJCSAgIEN1dCBtZWFucyBkZWxldGUgcGFydCBvZiBhbiBpdGVtCisJCQkJICAgKGluY2x1ZGVzIHJlbW92aW5nIGFuIGVudHJ5IGZyb20gYQorCQkJCSAgIGRpcmVjdG9yeSkuCisKKwkJCQkgICBEZWxldGUgbWVhbnMgZGVsZXRlIHdob2xlIGl0ZW0uCisKKwkJCQkgICBJbnNlcnQgbWVhbnMgYWRkIGEgbmV3IGl0ZW0gaW50byB0aGUKKwkJCQkgICB0cmVlLgorCisJCQkJICAgUGFzdGUgbWVhbnMgdG8gYXBwZW5kIHRvIHRoZSBlbmQgb2YgYW4KKwkJCQkgICBleGlzdGluZyBmaWxlIG9yIHRvIGluc2VydCBhIGRpcmVjdG9yeQorCQkJCSAgIGVudHJ5LiAgKi8KKwlpbnQgY2hpbGRfcG9zLAkJLyogcG9zaXRpb24gb2YgYSBjaGlsZCBub2RlIGluIGl0cyBwYXJlbnQgKi8KKwkgaDsJCQkvKiBsZXZlbCBvZiB0aGUgdHJlZSBiZWluZyBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkIGluc2VydF9rZXlbMl07CS8qIGluIG91ciBwcm9jZXNzaW5nIG9mIG9uZSBsZXZlbAorCQkJCQkgICB3ZSBzb21ldGltZXMgZGV0ZXJtaW5lIHdoYXQKKwkJCQkJICAgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuZXh0CisJCQkJCSAgIGhpZ2hlciBsZXZlbC4gIFRoaXMgaW5zZXJ0aW9uCisJCQkJCSAgIGNvbnNpc3RzIG9mIGEga2V5IG9yIHR3byBrZXlzCisJCQkJCSAgIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCisJCQkJCSAgIHBvaW50ZXJzICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICppbnNlcnRfcHRyWzJdOwkvKiBpbnNlcnRlZCBub2RlLXB0cnMgZm9yIHRoZSBuZXh0CisJCQkJCQkgICBsZXZlbCAqLworCisJdGItPnRiX21vZGUgPSBmbGFnOworCXRiLT5uZWVkX2JhbGFuY2VfZGlydHkgPSAwOworCisJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQih0YikpIHsKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJjbG0tNjAwMDogZG9fYmFsYW5jZSwgZnMgZ2VuZXJhdGlvbiBoYXMgY2hhbmdlZFxuIik7CisJfQorCS8qIGlmIHdlIGhhdmUgbm8gcmVhbCB3b3JrIHRvIGRvICAqLworCWlmICghdGItPmluc2VydF9zaXplWzBdKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLAorCQkJCSAiUEFQLTEyMzUwOiBkb19iYWxhbmNlOiBpbnNlcnRfc2l6ZSA9PSAwLCBtb2RlID09ICVjIiwKKwkJCQkgZmxhZyk7CisJCXVuZml4X25vZGVzKHRiKTsKKwkJcmV0dXJuOworCX0KKworCWF0b21pY19pbmMoJihmc19nZW5lcmF0aW9uKHRiLT50Yl9zYikpKTsKKwlkb19iYWxhbmNlX3N0YXJ0cyh0Yik7CisKIAkvKiBiYWxhbmNlIGxlYWYgcmV0dXJucyAwIGV4Y2VwdCBpZiBjb21iaW5pbmcgTCBSIGFuZCBTIGludG8KIAkgICBvbmUgbm9kZS4gIHNlZSBiYWxhbmNlX2ludGVybmFsKCkgZm9yIGV4cGxhbmF0aW9uIG9mIHRoaXMKLQkgICBsaW5lIG9mIGNvZGUuKi8KLQljaGlsZF9wb3MgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCkgKwotCSAgYmFsYW5jZV9sZWFmICh0YiwgaWgsIGJvZHksIGZsYWcsIGluc2VydF9rZXksIGluc2VydF9wdHIpOworCSAgIGxpbmUgb2YgY29kZS4gKi8KKwljaGlsZF9wb3MgPSBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCAwKSArCisJICAgIGJhbGFuY2VfbGVhZih0YiwgaWgsIGJvZHksIGZsYWcsIGluc2VydF9rZXksIGluc2VydF9wdHIpOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmICh0Yik7CisJY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmKHRiKTsKICNlbmRpZgogCi0gICAgLyogQmFsYW5jZSBpbnRlcm5hbCBsZXZlbCBvZiB0aGUgdHJlZS4gKi8KLSAgICBmb3IgKCBoID0gMTsgaCA8IE1BWF9IRUlHSFQgJiYgdGItPmluc2VydF9zaXplW2hdOyBoKysgKQotCWNoaWxkX3BvcyA9IGJhbGFuY2VfaW50ZXJuYWwgKHRiLCBoLCBjaGlsZF9wb3MsIGluc2VydF9rZXksIGluc2VydF9wdHIpOworCS8qIEJhbGFuY2UgaW50ZXJuYWwgbGV2ZWwgb2YgdGhlIHRyZWUuICovCisJZm9yIChoID0gMTsgaCA8IE1BWF9IRUlHSFQgJiYgdGItPmluc2VydF9zaXplW2hdOyBoKyspCisJCWNoaWxkX3BvcyA9CisJCSAgICBiYWxhbmNlX2ludGVybmFsKHRiLCBoLCBjaGlsZF9wb3MsIGluc2VydF9rZXksIGluc2VydF9wdHIpOwogCi0KLSAgICBkb19iYWxhbmNlX2NvbXBsZXRlZCAodGIpOworCWRvX2JhbGFuY2VfY29tcGxldGVkKHRiKTsKIAogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZmlsZS5jIGIvZnMvcmVpc2VyZnMvZmlsZS5jCmluZGV4IDIyMzBhZmYuLmM5ZjE3OGYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2ZpbGUuYworKysgYi9mcy9yZWlzZXJmcy9maWxlLmMKQEAgLTIsNyArMiw2IEBACiAgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQogICovCiAKLQogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2FjbC5oPgpAQCAtMzEsODIgKzMwLDg0IEBACiAqKiBXZSB1c2UgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZSB0byBwYWNrIHRoZSB0YWlsLCBzaW5jZSBpdCBhbHJlYWR5IGhhcwogKiogYWxsIHRoZSBjb25kaXRpb25zIGNvZGVkLiAgCiAqLwotc3RhdGljIGludCByZWlzZXJmc19maWxlX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCitzdGF0aWMgaW50IHJlaXNlcmZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBlcnI7Ci0gICAgaW50IGpiZWdpbl9mYWlsdXJlID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBlcnI7CisJaW50IGpiZWdpbl9mYWlsdXJlID0gMDsKIAotICAgIGlmICghU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkpCi0JQlVHICgpOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJQlVHKCk7CiAKLSAgICAvKiBmYXN0IG91dCBmb3Igd2hlbiBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUgKi8KLSAgICBpZiAoKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxIHx8Ci0JIShSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSB8fCAKLSAgICAgICAgICF0YWlsX2hhc190b19iZV9wYWNrZWQoaW5vZGUpKSAgICAgICAmJiAKLQlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7Ci0JcmV0dXJuIDA7Ci0gICAgfSAgICAKLSAgICAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBkb3duICgmaW5vZGUtPmlfc2VtKTsgCi0gICAgLyogZnJlZWluZyBwcmVhbGxvY2F0aW9uIG9ubHkgaW52b2x2ZXMgcmVsb2dnaW5nIGJsb2NrcyB0aGF0Ci0gICAgICogYXJlIGFscmVhZHkgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBwcmVhbGxvY2F0aW9uIGdldHMKLSAgICAgKiBmcmVlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdHJhbnNhY3Rpb24sIHNvIGl0IGlzIGltcG9zc2libGUgZm9yCi0gICAgICogdXMgdG8gbG9nIGFueSBhZGRpdGlvbmFsIGJsb2NrcyAoaW5jbHVkaW5nIHF1b3RhIGJsb2NrcykKLSAgICAgKi8KLSAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOwotICAgIGlmIChlcnIpIHsKLQkvKiB1aCBvaCwgd2UgY2FuJ3QgYWxsb3cgdGhlIGlub2RlIHRvIGdvIGF3YXkgd2hpbGUgdGhlcmUKLQkgKiBpcyBzdGlsbCBwcmVhbGxvY2F0aW9uIGJsb2NrcyBwZW5kaW5nLiAgVHJ5IHRvIGpvaW4gdGhlCi0JICogYWJvcnRlZCB0cmFuc2FjdGlvbgotCSAqLwotCWpiZWdpbl9mYWlsdXJlID0gZXJyOwotCWVyciA9IGpvdXJuYWxfam9pbl9hYm9ydCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKLQotCWlmIChlcnIpIHsKLQkgICAgLyogaG1wZiwgb3VyIGNob2ljZXMgaGVyZSBhcmVuJ3QgZ29vZC4gIFdlIGNhbiBwaW4gdGhlIGlub2RlCi0JICAgICAqIHdoaWNoIHdpbGwgZGlzYWxsb3cgdW5tb3VudCBmcm9tIGV2ZXJ5IGhhcHBlbmluZywgd2UgY2FuCi0JICAgICAqIGRvIG5vdGhpbmcsIHdoaWNoIHdpbGwgY29ycnVwdCByYW5kb20gbWVtb3J5IG9uIHVubW91bnQsCi0JICAgICAqIG9yIHdlIGNhbiBmb3JjaWJseSByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgcHJlYWxsb2NhdGlvbgotCSAgICAgKiBsaXN0LCB3aGljaCB3aWxsIGxlYWsgYmxvY2tzIG9uIGRpc2suICBMZXRzIHBpbiB0aGUgaW5vZGUKLQkgICAgICogYW5kIGxldCB0aGUgYWRtaW4ga25vdyB3aGF0IGlzIGdvaW5nIG9uLgotCSAgICAgKi8KLQkgICAgaWdyYWIoaW5vZGUpOwotCSAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAicGlubmluZyBpbm9kZSAlbHUgYmVjYXVzZSB0aGUgIgotCSAgICAgICAgICAgICAgICAgICAgICJwcmVhbGxvY2F0aW9uIGNhbid0IGJlIGZyZWVkIik7Ci0JICAgIGdvdG8gb3V0OworCS8qIGZhc3Qgb3V0IGZvciB3aGVuIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSAqLworCWlmICgoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEgfHwKKwkgICAgICEoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgfHwKKwkgICAgICF0YWlsX2hhc190b19iZV9wYWNrZWQoaW5vZGUpKSAmJgorCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA8PSAwKSB7CisJCXJldHVybiAwOwogCX0KLSAgICB9Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCS8qIGZyZWVpbmcgcHJlYWxsb2NhdGlvbiBvbmx5IGludm9sdmVzIHJlbG9nZ2luZyBibG9ja3MgdGhhdAorCSAqIGFyZSBhbHJlYWR5IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgcHJlYWxsb2NhdGlvbiBnZXRzCisJICogZnJlZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRyYW5zYWN0aW9uLCBzbyBpdCBpcyBpbXBvc3NpYmxlIGZvcgorCSAqIHVzIHRvIGxvZyBhbnkgYWRkaXRpb25hbCBibG9ja3MgKGluY2x1ZGluZyBxdW90YSBibG9ja3MpCisJICovCisJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKKwlpZiAoZXJyKSB7CisJCS8qIHVoIG9oLCB3ZSBjYW4ndCBhbGxvdyB0aGUgaW5vZGUgdG8gZ28gYXdheSB3aGlsZSB0aGVyZQorCQkgKiBpcyBzdGlsbCBwcmVhbGxvY2F0aW9uIGJsb2NrcyBwZW5kaW5nLiAgVHJ5IHRvIGpvaW4gdGhlCisJCSAqIGFib3J0ZWQgdHJhbnNhY3Rpb24KKwkJICovCisJCWpiZWdpbl9mYWlsdXJlID0gZXJyOworCQllcnIgPSBqb3VybmFsX2pvaW5fYWJvcnQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisKKwkJaWYgKGVycikgeworCQkJLyogaG1wZiwgb3VyIGNob2ljZXMgaGVyZSBhcmVuJ3QgZ29vZC4gIFdlIGNhbiBwaW4gdGhlIGlub2RlCisJCQkgKiB3aGljaCB3aWxsIGRpc2FsbG93IHVubW91bnQgZnJvbSBldmVyeSBoYXBwZW5pbmcsIHdlIGNhbgorCQkJICogZG8gbm90aGluZywgd2hpY2ggd2lsbCBjb3JydXB0IHJhbmRvbSBtZW1vcnkgb24gdW5tb3VudCwKKwkJCSAqIG9yIHdlIGNhbiBmb3JjaWJseSByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgcHJlYWxsb2NhdGlvbgorCQkJICogbGlzdCwgd2hpY2ggd2lsbCBsZWFrIGJsb2NrcyBvbiBkaXNrLiAgTGV0cyBwaW4gdGhlIGlub2RlCisJCQkgKiBhbmQgbGV0IHRoZSBhZG1pbiBrbm93IHdoYXQgaXMgZ29pbmcgb24uCisJCQkgKi8KKwkJCWlncmFiKGlub2RlKTsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAicGlubmluZyBpbm9kZSAlbHUgYmVjYXVzZSB0aGUgIgorCQkJCQkgInByZWFsbG9jYXRpb24gY2FuJ3QgYmUgZnJlZWQiKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CiAKICNpZmRlZiBSRUlTRVJGU19QUkVBTExPQ0FURQotICAgIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MgKCZ0aCwgaW5vZGUpOworCXJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MoJnRoLCBpbm9kZSk7CiAjZW5kaWYKLSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKIAotICAgIC8qIGNvcHkgYmFjayB0aGUgZXJyb3IgY29kZSBmcm9tIGpvdXJuYWxfYmVnaW4gKi8KLSAgICBpZiAoIWVycikKLSAgICAgICAgZXJyID0gamJlZ2luX2ZhaWx1cmU7CisJLyogY29weSBiYWNrIHRoZSBlcnJvciBjb2RlIGZyb20gam91cm5hbF9iZWdpbiAqLworCWlmICghZXJyKQorCQllcnIgPSBqYmVnaW5fZmFpbHVyZTsKIAotICAgIGlmICghZXJyICYmIGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPD0gMSAmJgotCShSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSAmJgotICAgICAgICB0YWlsX2hhc190b19iZV9wYWNrZWQgKGlub2RlKSkgewotCS8qIGlmIHJlZ3VsYXIgZmlsZSBpcyByZWxlYXNlZCBieSBsYXN0IGhvbGRlciBhbmQgaXQgaGFzIGJlZW4KLQkgICBhcHBlbmRlZCAod2UgYXBwZW5kIGJ5IHVuZm9ybWF0dGVkIG5vZGUgb25seSkgb3IgaXRzIGRpcmVjdAotCSAgIGl0ZW0ocykgaGFkIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiBpdCBtYXkgaGF2ZSB0byBiZQotCSAgIGluZGlyZWN0MmRpcmVjdCBjb252ZXJ0ZWQgKi8KLQllcnIgPSByZWlzZXJmc190cnVuY2F0ZV9maWxlKGlub2RlLCAwKSA7Ci0gICAgfQotb3V0OgotICAgIHVwICgmaW5vZGUtPmlfc2VtKTsgCi0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gZXJyOworCWlmICghZXJyICYmIGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPD0gMSAmJgorCSAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgJiYKKwkgICAgdGFpbF9oYXNfdG9fYmVfcGFja2VkKGlub2RlKSkgeworCQkvKiBpZiByZWd1bGFyIGZpbGUgaXMgcmVsZWFzZWQgYnkgbGFzdCBob2xkZXIgYW5kIGl0IGhhcyBiZWVuCisJCSAgIGFwcGVuZGVkICh3ZSBhcHBlbmQgYnkgdW5mb3JtYXR0ZWQgbm9kZSBvbmx5KSBvciBpdHMgZGlyZWN0CisJCSAgIGl0ZW0ocykgaGFkIHRvIGJlIGNvbnZlcnRlZCwgdGhlbiBpdCBtYXkgaGF2ZSB0byBiZQorCQkgICBpbmRpcmVjdDJkaXJlY3QgY29udmVydGVkICovCisJCWVyciA9IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoaW5vZGUsIDApOworCX0KKyAgICAgIG91dDoKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICByZWlzZXJmc190cnVuY2F0ZV9maWxlKGlub2RlLCAxKSA7CitzdGF0aWMgdm9pZCByZWlzZXJmc192ZnNfdHJ1bmNhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoaW5vZGUsIDEpOwogfQogCiAvKiBTeW5jIGEgcmVpc2VyZnMgZmlsZS4gKi8KQEAgLTExNiwyNiArMTE3LDI0IEBACiAgKiBiZSByZW1vdmVkLi4uCiAgKi8KIAotc3RhdGljIGludCByZWlzZXJmc19zeW5jX2ZpbGUoCi0JCQkgICAgICBzdHJ1Y3QgZmlsZSAgICogcF9zX2ZpbHAsCi0JCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICogcF9zX2RlbnRyeSwKLQkJCSAgICAgIGludCBkYXRhc3luYwotCQkJICAgICAgKSB7Ci0gIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSA9IHBfc19kZW50cnktPmRfaW5vZGU7Ci0gIGludCBuX2VycjsKLSAgaW50IGJhcnJpZXJfZG9uZTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19maWxlKHN0cnVjdCBmaWxlICpwX3NfZmlscCwKKwkJCSAgICAgIHN0cnVjdCBkZW50cnkgKnBfc19kZW50cnksIGludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSA9IHBfc19kZW50cnktPmRfaW5vZGU7CisJaW50IG5fZXJyOworCWludCBiYXJyaWVyX2RvbmU7CiAKLSAgaWYgKCFTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSkKLSAgICAgIEJVRyAoKTsKLSAgbl9lcnIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhwX3NfaW5vZGUtPmlfbWFwcGluZykgOwotICByZWlzZXJmc193cml0ZV9sb2NrKHBfc19pbm9kZS0+aV9zYik7Ci0gIGJhcnJpZXJfZG9uZSA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUocF9zX2lub2RlKTsKLSAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7Ci0gIGlmIChiYXJyaWVyX2RvbmUgIT0gMSkKLSAgICAgIGJsa2Rldl9pc3N1ZV9mbHVzaChwX3NfaW5vZGUtPmlfc2ItPnNfYmRldiwgTlVMTCk7Ci0gIGlmIChiYXJyaWVyX2RvbmUgPCAwKQotICAgIHJldHVybiBiYXJyaWVyX2RvbmU7Ci0gIHJldHVybiAoIG5fZXJyIDwgMCApID8gLUVJTyA6IDA7CisJaWYgKCFTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSkKKwkJQlVHKCk7CisJbl9lcnIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhwX3NfaW5vZGUtPmlfbWFwcGluZyk7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhwX3NfaW5vZGUtPmlfc2IpOworCWJhcnJpZXJfZG9uZSA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUocF9zX2lub2RlKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKKwlpZiAoYmFycmllcl9kb25lICE9IDEpCisJCWJsa2Rldl9pc3N1ZV9mbHVzaChwX3NfaW5vZGUtPmlfc2ItPnNfYmRldiwgTlVMTCk7CisJaWYgKGJhcnJpZXJfZG9uZSA8IDApCisJCXJldHVybiBiYXJyaWVyX2RvbmU7CisJcmV0dXJuIChuX2VyciA8IDApID8gLUVJTyA6IDA7CiB9CiAKIC8qIEkgcmVhbGx5IGRvIG5vdCB3YW50IHRvIHBsYXkgd2l0aCBtZW1vcnkgc2hvcnRhZ2UgcmlnaHQgbm93LCBzbwpAQCAtMTQ3LDcwMCArMTQ2LDc5NyBAQAogLyogQWxsb2NhdGVzIGJsb2NrcyBmb3IgYSBmaWxlIHRvIGZ1bGZpbCB3cml0ZSByZXF1ZXN0LgogICAgTWFwcyBhbGwgdW5tYXBwZWQgYnV0IHByZXBhcmVkIHBhZ2VzIGZyb20gdGhlIGxpc3QuCiAgICBVcGRhdGVzIG1ldGFkYXRhIHdpdGggbmV3bHkgYWxsb2NhdGVkIGJsb2NrbnVtYmVycyBhcyBuZWVkZWQgKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tzX2Zvcl9yZWdpb24oCi0JCQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSwgLyogSW5vZGUgd2Ugd29yayB3aXRoICovCi0JCQkJbG9mZl90IHBvcywgLyogV3JpdGluZyBwb3NpdGlvbiAqLwotCQkJCWludCBudW1fcGFnZXMsIC8qIG51bWJlciBvZiBwYWdlcyB3cml0ZSBnb2luZwotCQkJCQkJICB0byB0b3VjaCAqLwotCQkJCWludCB3cml0ZV9ieXRlcywgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCi0JCQkJc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywgLyogYXJyYXkgb2YKLQkJCQkJCQkgICAgICAgICBwcmVwYXJlZCBwYWdlcwotCQkJCQkJCSAgICAgICAqLwotCQkJCWludCBibG9ja3NfdG9fYWxsb2NhdGUgLyogQW1vdW50IG9mIGJsb2NrcyB3ZQotCQkJCQkJCSAgbmVlZCB0byBhbGxvY2F0ZSB0bwotCQkJCQkJCSAgZml0IHRoZSBkYXRhIGludG8gZmlsZQotCQkJCQkJCSAqLwotCQkJCSkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tzX2Zvcl9yZWdpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIElub2RlIHdlIHdvcmsgd2l0aCAqLworCQkJCQkgICAgICAgbG9mZl90IHBvcywJLyogV3JpdGluZyBwb3NpdGlvbiAqLworCQkJCQkgICAgICAgaW50IG51bV9wYWdlcywJLyogbnVtYmVyIG9mIHBhZ2VzIHdyaXRlIGdvaW5nCisJCQkJCQkJCSAgIHRvIHRvdWNoICovCisJCQkJCSAgICAgICBpbnQgd3JpdGVfYnl0ZXMsCS8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworCQkJCQkgICAgICAgc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcywJLyogYXJyYXkgb2YKKwkJCQkJCQkJCQkgICBwcmVwYXJlZCBwYWdlcworCQkJCQkJCQkJCSAqLworCQkJCQkgICAgICAgaW50IGJsb2Nrc190b19hbGxvY2F0ZQkvKiBBbW91bnQgb2YgYmxvY2tzIHdlCisJCQkJCQkJCQkgICBuZWVkIHRvIGFsbG9jYXRlIHRvCisJCQkJCQkJCQkgICBmaXQgdGhlIGRhdGEgaW50byBmaWxlCisJCQkJCQkJCQkgKi8KKyAgICApCiB7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OyAvLyBjcHUga2V5IG9mIGl0ZW0gdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgc3RydWN0IGl0ZW1faGVhZCAqaWg7IC8vIHBvaW50ZXIgdG8gaXRlbSBoZWFkIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7IC8vIEJ1ZmZlciBoZWFkIHRoYXQgY29udGFpbnMgaXRlbXMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgX19sZTMyICogaXRlbTsgLy8gcG9pbnRlciB0byBpdGVtIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKLSAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7IC8vIHBhdGggdG8gaXRlbSwgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoLgotICAgIGJfYmxvY2tucl90ICphbGxvY2F0ZWRfYmxvY2tzOyAvLyBQb2ludGVyIHRvIGEgcGxhY2Ugd2hlcmUgYWxsb2NhdGVkIGJsb2NrbnVtYmVycyB3b3VsZCBiZSBzdG9yZWQuCi0gICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludDsgLy8gaGludCBzdHJ1Y3R1cmUgZm9yIGJsb2NrIGFsbG9jYXRvci4KLSAgICBzaXplX3QgcmVzOyAvLyByZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCB3ZSBjYWxsLgotICAgIGludCBjdXJyX2Jsb2NrOyAvLyBjdXJyZW50IGJsb2NrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB1bm1hcHBlZCBibG9ja3MuCi0gICAgaW50IGk7IC8vIGxvb3AgY291bnRlcgotICAgIGludCBpdGVtcG9zOyAvLyBwb3NpdGlvbiBpbiBpdGVtCi0gICAgdW5zaWduZWQgaW50IGZyb20gPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgLy8gd3JpdGluZyBwb3NpdGlvbiBpbgotCQkJCQkJICAgICAgIC8vIGZpcnN0IHBhZ2UKLSAgICB1bnNpZ25lZCBpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsgLyogbGFzdCBtb2RpZmllZCBieXRlIG9mZnNldCBpbiBsYXN0IHBhZ2UgKi8KLSAgICBfX3U2NCBob2xlX3NpemUgOyAvLyBhbW91bnQgb2YgYmxvY2tzIGZvciBhIGZpbGUgaG9sZSwgaWYgaXQgbmVlZGVkIHRvIGJlIGNyZWF0ZWQuCi0gICAgaW50IG1vZGlmeWluZ190aGlzX2l0ZW0gPSAwOyAvLyBGbGFnIGZvciBpdGVtcyB0cmF2ZXJzYWwgY29kZSB0byBrZWVwIHRyYWNrCi0JCQkJIC8vIG9mIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBwcmVwYXJlZAotCQkJCSAvLyBjdXJyZW50IGJsb2NrIGZvciBqb3VybmFsCi0gICAgaW50IHdpbGxfcHJlYWxsb2MgPSAwOwotICAgIFJGQUxTRSghYmxvY2tzX3RvX2FsbG9jYXRlLCAiZ3JlZW4tOTAwNDogdHJpZWQgdG8gYWxsb2NhdGUgemVybyBibG9ja3M/Iik7CisJc3RydWN0IGNwdV9rZXkga2V5OwkvLyBjcHUga2V5IG9mIGl0ZW0gdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CS8vIHBvaW50ZXIgdG8gaXRlbSBoZWFkIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CS8vIEJ1ZmZlciBoZWFkIHRoYXQgY29udGFpbnMgaXRlbXMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJX19sZTMyICppdGVtOwkJLy8gcG9pbnRlciB0byBpdGVtIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CS8vIHBhdGggdG8gaXRlbSwgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoLgorCWJfYmxvY2tucl90ICphbGxvY2F0ZWRfYmxvY2tzOwkvLyBQb2ludGVyIHRvIGEgcGxhY2Ugd2hlcmUgYWxsb2NhdGVkIGJsb2NrbnVtYmVycyB3b3VsZCBiZSBzdG9yZWQuCisJcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludDsJLy8gaGludCBzdHJ1Y3R1cmUgZm9yIGJsb2NrIGFsbG9jYXRvci4KKwlzaXplX3QgcmVzOwkJLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KKwlpbnQgY3Vycl9ibG9jazsJCS8vIGN1cnJlbnQgYmxvY2sgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHVubWFwcGVkIGJsb2Nrcy4KKwlpbnQgaTsJCQkvLyBsb29wIGNvdW50ZXIKKwlpbnQgaXRlbXBvczsJCS8vIHBvc2l0aW9uIGluIGl0ZW0KKwl1bnNpZ25lZCBpbnQgZnJvbSA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwkvLyB3cml0aW5nIHBvc2l0aW9uIGluCisJLy8gZmlyc3QgcGFnZQorCXVuc2lnbmVkIGludCB0byA9ICgocG9zICsgd3JpdGVfYnl0ZXMgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOwkvKiBsYXN0IG1vZGlmaWVkIGJ5dGUgb2Zmc2V0IGluIGxhc3QgcGFnZSAqLworCV9fdTY0IGhvbGVfc2l6ZTsJLy8gYW1vdW50IG9mIGJsb2NrcyBmb3IgYSBmaWxlIGhvbGUsIGlmIGl0IG5lZWRlZCB0byBiZSBjcmVhdGVkLgorCWludCBtb2RpZnlpbmdfdGhpc19pdGVtID0gMDsJLy8gRmxhZyBmb3IgaXRlbXMgdHJhdmVyc2FsIGNvZGUgdG8ga2VlcCB0cmFjaworCS8vIG9mIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBwcmVwYXJlZAorCS8vIGN1cnJlbnQgYmxvY2sgZm9yIGpvdXJuYWwKKwlpbnQgd2lsbF9wcmVhbGxvYyA9IDA7CisJUkZBTFNFKCFibG9ja3NfdG9fYWxsb2NhdGUsCisJICAgICAgICJncmVlbi05MDA0OiB0cmllZCB0byBhbGxvY2F0ZSB6ZXJvIGJsb2Nrcz8iKTsKIAotICAgIC8qIG9ubHkgcHJlYWxsb2NhdGUgaWYgdGhpcyBpcyBhIHNtYWxsIHdyaXRlICovCi0gICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IHx8Ci0gICAgICAgKCEod3JpdGVfYnl0ZXMgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0xKSkgJiYKLSAgICAgICAgYmxvY2tzX3RvX2FsbG9jYXRlIDwKLSAgICAgICAgUkVJU0VSRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplKSkKLSAgICAgICAgd2lsbF9wcmVhbGxvYyA9IFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZTsKKwkvKiBvbmx5IHByZWFsbG9jYXRlIGlmIHRoaXMgaXMgYSBzbWFsbCB3cml0ZSAqLworCWlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCB8fAorCSAgICAoISh3cml0ZV9ieXRlcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgJiYKKwkgICAgIGJsb2Nrc190b19hbGxvY2F0ZSA8CisJICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUpKQorCQl3aWxsX3ByZWFsbG9jID0KKwkJICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZTsKIAotICAgIGFsbG9jYXRlZF9ibG9ja3MgPSBrbWFsbG9jKChibG9ja3NfdG9fYWxsb2NhdGUgKyB3aWxsX3ByZWFsbG9jKSAqCi0gICAgCQkJCQlzaXplb2YoYl9ibG9ja25yX3QpLCBHRlBfTk9GUyk7CisJYWxsb2NhdGVkX2Jsb2NrcyA9IGttYWxsb2MoKGJsb2Nrc190b19hbGxvY2F0ZSArIHdpbGxfcHJlYWxsb2MpICoKKwkJCQkgICBzaXplb2YoYl9ibG9ja25yX3QpLCBHRlBfTk9GUyk7CiAKLSAgICAvKiBGaXJzdCB3ZSBjb21wb3NlIGEga2V5IHRvIHBvaW50IGF0IHRoZSB3cml0aW5nIHBvc2l0aW9uLCB3ZSB3YW50IHRvIGRvCi0gICAgICAgdGhhdCBvdXRzaWRlIG9mIGFueSBsb2NraW5nIHJlZ2lvbi4gKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLCBwb3MrMSwgVFlQRV9BTlksIDMvKmtleSBsZW5ndGgqLyk7CisJLyogRmlyc3Qgd2UgY29tcG9zZSBhIGtleSB0byBwb2ludCBhdCB0aGUgd3JpdGluZyBwb3NpdGlvbiwgd2Ugd2FudCB0byBkbworCSAgIHRoYXQgb3V0c2lkZSBvZiBhbnkgbG9ja2luZyByZWdpb24uICovCisJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLCBwb3MgKyAxLCBUWVBFX0FOWSwgMyAvKmtleSBsZW5ndGggKi8gKTsKIAotICAgIC8qIElmIHdlIGNhbWUgaGVyZSwgaXQgbWVhbnMgd2UgYWJzb2x1dGVseSBuZWVkIHRvIG9wZW4gYSB0cmFuc2FjdGlvbiwKLSAgICAgICBzaW5jZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNvbWUgYmxvY2tzICovCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7IC8vIEpvdXJuYWxpbmcgc3R1ZmYgYW5kIHdlIG5lZWQgdGhhdC4KLSAgICByZXMgPSBqb3VybmFsX2JlZ2luKHRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMSArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOyAvLyBXaXNoIEkga25vdyBpZiB0aGlzIG51bWJlciBlbm91Z2gKLSAgICBpZiAocmVzKQotICAgICAgICBnb3RvIGVycm9yX2V4aXQ7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisJLyogSWYgd2UgY2FtZSBoZXJlLCBpdCBtZWFucyB3ZSBhYnNvbHV0ZWx5IG5lZWQgdG8gb3BlbiBhIHRyYW5zYWN0aW9uLAorCSAgIHNpbmNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc29tZSBibG9ja3MgKi8KKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsJLy8gSm91cm5hbGluZyBzdHVmZiBhbmQgd2UgbmVlZCB0aGF0LgorCXJlcyA9IGpvdXJuYWxfYmVnaW4odGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikpOwkvLyBXaXNoIEkga25vdyBpZiB0aGlzIG51bWJlciBlbm91Z2gKKwlpZiAocmVzKQorCQlnb3RvIGVycm9yX2V4aXQ7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKIAotICAgIC8qIExvb2sgZm9yIHRoZSBpbi10cmVlIHBvc2l0aW9uIG9mIG91ciB3cml0ZSwgbmVlZCBwYXRoIGZvciBibG9jayBhbGxvY2F0b3IgKi8KLSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotICAgIGlmICggcmVzID09IElPX0VSUk9SICkgewotCXJlcyA9IC1FSU87Ci0JZ290byBlcnJvcl9leGl0OwotICAgIH0KLSAgIAotICAgIC8qIEFsbG9jYXRlIGJsb2NrcyAqLwotICAgIC8qIEZpcnN0IGZpbGwgaW4gImhpbnQiIHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yICovCi0gICAgaGludC50aCA9IHRoOyAvLyB0cmFuc2FjdGlvbiBoYW5kbGUuCi0gICAgaGludC5wYXRoID0gJnBhdGg7IC8vIFBhdGgsIHNvIHRoYXQgYmxvY2sgYWxsb2NhdG9yIGNhbiBkZXRlcm1pbmUgcGFja2luZyBsb2NhbGl0eSBvciB3aGF0ZXZlciBpdCBuZWVkcyB0byBkZXRlcm1pbmUuCi0gICAgaGludC5pbm9kZSA9IGlub2RlOyAvLyBJbm9kZSBpcyBuZWVkZWQgYnkgYmxvY2sgYWxsb2NhdG9yIHRvby4KLSAgICBoaW50LnNlYXJjaF9zdGFydCA9IDA7IC8vIFdlIGhhdmUgbm8gaGludCBvbiB3aGVyZSB0byBzZWFyY2ggZnJlZSBibG9ja3MgZm9yIGJsb2NrIGFsbG9jYXRvci4KLSAgICBoaW50LmtleSA9IGtleS5vbl9kaXNrX2tleTsgLy8gb24gZGlzayBrZXkgb2YgZmlsZS4KLSAgICBoaW50LmJsb2NrID0gaW5vZGUtPmlfYmxvY2tzPj4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMtOSk7IC8vIE51bWJlciBvZiBkaXNrIGJsb2NrcyB0aGlzIGZpbGUgb2NjdXBpZXMgYWxyZWFkeS4KLSAgICBoaW50LmZvcm1hdHRlZF9ub2RlID0gMDsgLy8gV2UgYXJlIGFsbG9jYXRpbmcgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlLgotICAgIGhpbnQucHJlYWxsb2NhdGUgPSB3aWxsX3ByZWFsbG9jOwotCi0gICAgLyogQ2FsbCBibG9jayBhbGxvY2F0b3IgdG8gYWxsb2NhdGUgYmxvY2tzICovCi0gICAgcmVzID0gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsIGJsb2Nrc190b19hbGxvY2F0ZSwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKLSAgICBpZiAoIHJlcyAhPSBDQVJSWV9PTiApIHsKLQlpZiAoIHJlcyA9PSBOT19ESVNLX1NQQUNFICkgewotCSAgICAvKiBXZSBmbHVzaCB0aGUgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiBubyBzcGFjZS4gVGhpcyB3YXkgc29tZQotCSAgICAgICBibG9ja3MgbWlnaHQgYmVjb21lIGZyZWUgKi8KLQkgICAgU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfbXVzdF93YWl0ID0gMTsKLQkgICAgcmVzID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKLSAgICAgICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwotCi0JICAgIC8qIFdlIG1pZ2h0IGhhdmUgc2NoZWR1bGVkLCBzbyBzZWFyY2ggYWdhaW4gKi8KLQkgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQkgICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7CisJLyogTG9vayBmb3IgdGhlIGluLXRyZWUgcG9zaXRpb24gb2Ygb3VyIHdyaXRlLCBuZWVkIHBhdGggZm9yIGJsb2NrIGFsbG9jYXRvciAqLworCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJlcyA9PSBJT19FUlJPUikgewogCQlyZXMgPSAtRUlPOwogCQlnb3RvIGVycm9yX2V4aXQ7Ci0JICAgIH0KLQotCSAgICAvKiB1cGRhdGUgY2hhbmdlZCBpbmZvIGZvciBoaW50IHN0cnVjdHVyZS4gKi8KLQkgICAgcmVzID0gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsIGJsb2Nrc190b19hbGxvY2F0ZSwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKLQkgICAgaWYgKCByZXMgIT0gQ0FSUllfT04gKSB7Ci0JCXJlcyA9IC1FTk9TUEM7IAotCQlwYXRocmVsc2UoJnBhdGgpOwotCQlnb3RvIGVycm9yX2V4aXQ7Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICByZXMgPSAtRU5PU1BDOwotCSAgICBwYXRocmVsc2UoJnBhdGgpOwotCSAgICBnb3RvIGVycm9yX2V4aXQ7CiAJfQotICAgIH0KIAorCS8qIEFsbG9jYXRlIGJsb2NrcyAqLworCS8qIEZpcnN0IGZpbGwgaW4gImhpbnQiIHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yICovCisJaGludC50aCA9IHRoOwkJLy8gdHJhbnNhY3Rpb24gaGFuZGxlLgorCWhpbnQucGF0aCA9ICZwYXRoOwkvLyBQYXRoLCBzbyB0aGF0IGJsb2NrIGFsbG9jYXRvciBjYW4gZGV0ZXJtaW5lIHBhY2tpbmcgbG9jYWxpdHkgb3Igd2hhdGV2ZXIgaXQgbmVlZHMgdG8gZGV0ZXJtaW5lLgorCWhpbnQuaW5vZGUgPSBpbm9kZTsJLy8gSW5vZGUgaXMgbmVlZGVkIGJ5IGJsb2NrIGFsbG9jYXRvciB0b28uCisJaGludC5zZWFyY2hfc3RhcnQgPSAwOwkvLyBXZSBoYXZlIG5vIGhpbnQgb24gd2hlcmUgdG8gc2VhcmNoIGZyZWUgYmxvY2tzIGZvciBibG9jayBhbGxvY2F0b3IuCisJaGludC5rZXkgPSBrZXkub25fZGlza19rZXk7CS8vIG9uIGRpc2sga2V5IG9mIGZpbGUuCisJaGludC5ibG9jayA9IGlub2RlLT5pX2Jsb2NrcyA+PiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsJLy8gTnVtYmVyIG9mIGRpc2sgYmxvY2tzIHRoaXMgZmlsZSBvY2N1cGllcyBhbHJlYWR5LgorCWhpbnQuZm9ybWF0dGVkX25vZGUgPSAwOwkvLyBXZSBhcmUgYWxsb2NhdGluZyBibG9ja3MgZm9yIHVuZm9ybWF0dGVkIG5vZGUuCisJaGludC5wcmVhbGxvY2F0ZSA9IHdpbGxfcHJlYWxsb2M7CisKKwkvKiBDYWxsIGJsb2NrIGFsbG9jYXRvciB0byBhbGxvY2F0ZSBibG9ja3MgKi8KKwlyZXMgPQorCSAgICByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgYWxsb2NhdGVkX2Jsb2NrcywKKwkJCQkgICAgICAgYmxvY2tzX3RvX2FsbG9jYXRlLCBibG9ja3NfdG9fYWxsb2NhdGUpOworCWlmIChyZXMgIT0gQ0FSUllfT04pIHsKKwkJaWYgKHJlcyA9PSBOT19ESVNLX1NQQUNFKSB7CisJCQkvKiBXZSBmbHVzaCB0aGUgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiBubyBzcGFjZS4gVGhpcyB3YXkgc29tZQorCQkJICAgYmxvY2tzIG1pZ2h0IGJlY29tZSBmcmVlICovCisJCQlTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9tdXN0X3dhaXQgPSAxOworCQkJcmVzID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBlcnJvcl9leGl0OworCisJCQkvKiBXZSBtaWdodCBoYXZlIHNjaGVkdWxlZCwgc28gc2VhcmNoIGFnYWluICovCisJCQlyZXMgPQorCQkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LAorCQkJCQkJICAgICAgICZwYXRoKTsKKwkJCWlmIChyZXMgPT0gSU9fRVJST1IpIHsKKwkJCQlyZXMgPSAtRUlPOworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0KKworCQkJLyogdXBkYXRlIGNoYW5nZWQgaW5mbyBmb3IgaGludCBzdHJ1Y3R1cmUuICovCisJCQlyZXMgPQorCQkJICAgIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBhbGxvY2F0ZWRfYmxvY2tzLAorCQkJCQkJICAgICAgIGJsb2Nrc190b19hbGxvY2F0ZSwKKwkJCQkJCSAgICAgICBibG9ja3NfdG9fYWxsb2NhdGUpOworCQkJaWYgKHJlcyAhPSBDQVJSWV9PTikgeworCQkJCXJlcyA9IC1FTk9TUEM7CisJCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXMgPSAtRU5PU1BDOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJfQorCX0KICNpZmRlZiBfX0JJR19FTkRJQU4KLSAgICAgICAgLy8gVG9vIGJhZCwgSSBoYXZlIG5vdCBmb3VuZCBhbnkgd2F5IHRvIGNvbnZlcnQgYSBnaXZlbiByZWdpb24gZnJvbQotICAgICAgICAvLyBjcHUgZm9ybWF0IHRvIGxpdHRsZSBlbmRpYW4gZm9ybWF0Ci0gICAgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGUgOyBpKyspCi0gICAgICAgICAgICBhbGxvY2F0ZWRfYmxvY2tzW2ldPWNwdV90b19sZTMyKGFsbG9jYXRlZF9ibG9ja3NbaV0pOwotICAgIH0KKwkvLyBUb28gYmFkLCBJIGhhdmUgbm90IGZvdW5kIGFueSB3YXkgdG8gY29udmVydCBhIGdpdmVuIHJlZ2lvbiBmcm9tCisJLy8gY3B1IGZvcm1hdCB0byBsaXR0bGUgZW5kaWFuIGZvcm1hdAorCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGU7IGkrKykKKwkJCWFsbG9jYXRlZF9ibG9ja3NbaV0gPSBjcHVfdG9fbGUzMihhbGxvY2F0ZWRfYmxvY2tzW2ldKTsKKwl9CiAjZW5kaWYKIAotICAgIC8qIEJsb2NrcyBhbGxvY2F0aW5nIHdlbGwgbWlnaHQgaGF2ZSBzY2hlZHVsZWQgYW5kIHRyZWUgbWlnaHQgaGF2ZSBjaGFuZ2VkLAotICAgICAgIGxldCdzIHNlYXJjaCB0aGUgdHJlZSBhZ2FpbiAqLwotICAgIC8qIGZpbmQgd2hlcmUgaW4gdGhlIHRyZWUgb3VyIHdyaXRlIHNob3VsZCBnbyAqLwotICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0JcmVzID0gLUVJTzsKLQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0gICAgfQotCi0gICAgYmggPSBnZXRfbGFzdF9iaCggJnBhdGggKTsgLy8gR2V0IGEgYnVmZmVyaGVhZCBmb3IgbGFzdCBlbGVtZW50IGluIHBhdGguCi0gICAgaWggPSBnZXRfaWgoICZwYXRoICk7ICAgICAgLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaGVhZCBpbiBwYXRoLgotICAgIGl0ZW0gPSBnZXRfaXRlbSggJnBhdGggKTsgIC8vIEdldCBhIHBvaW50ZXIgdG8gbGFzdCBpdGVtIGluIHBhdGgKLQotICAgIC8qIExldCdzIHNlZSB3aGF0IHdlIGhhdmUgZm91bmQgKi8KLSAgICBpZiAoIHJlcyAhPSBQT1NJVElPTl9GT1VORCApIHsgLyogcG9zaXRpb24gbm90IGZvdW5kLCB0aGlzIG1lYW5zIHRoYXQgd2UKLQkJCQkgICAgICBtaWdodCBuZWVkIHRvIGFwcGVuZCBmaWxlIHdpdGggaG9sZXMKLQkJCQkgICAgICBmaXJzdCAqLwotCS8vIFNpbmNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGZpbGUncyBlbmQsIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYKLQkvLyB0aGVyZSBpcyBhIGhvbGUgdGhhdCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgb3VyIHdyaXRpbmcKLQkvLyBwb3NpdGlvbiwgYW5kIGhvdyBtYW55IGJsb2NrcyBpdCBpcyBnb2luZyB0byBjb3ZlciAod2UgbmVlZCB0bwotCS8vICBwb3B1bGF0ZSBwb2ludGVycyB0byBmaWxlIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGhvbGUgd2l0aCB6ZXJvcykKLQotCXsKLQkgICAgaW50IGl0ZW1fb2Zmc2V0ID0gMTsKLQkgICAgLyoKLQkgICAgICogaWYgaWggaXMgc3RhdCBkYXRhLCBpdHMgb2Zmc2V0IGlzIDAgYW5kIHdlIGRvbid0IHdhbnQgdG8KLQkgICAgICogYWRkIDEgdG8gcG9zIGluIHRoZSBob2xlX3NpemUgY2FsY3VsYXRpb24KLQkgICAgICovCi0JICAgIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCi0JICAgICAgICBpdGVtX29mZnNldCA9IDA7Ci0JICAgIGhvbGVfc2l6ZSA9IChwb3MgKyBpdGVtX29mZnNldCAtCi0JICAgICAgICAgICAgKGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAotCQkgICAgJihpaC0+aWhfa2V5KSkgKwotCQkgICAgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpKSkgPj4KLQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCS8qIEJsb2NrcyBhbGxvY2F0aW5nIHdlbGwgbWlnaHQgaGF2ZSBzY2hlZHVsZWQgYW5kIHRyZWUgbWlnaHQgaGF2ZSBjaGFuZ2VkLAorCSAgIGxldCdzIHNlYXJjaCB0aGUgdHJlZSBhZ2FpbiAqLworCS8qIGZpbmQgd2hlcmUgaW4gdGhlIHRyZWUgb3VyIHdyaXRlIHNob3VsZCBnbyAqLworCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQlyZXMgPSAtRUlPOworCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CiAJfQogCi0JaWYgKCBob2xlX3NpemUgPiAwICkgewotCSAgICBpbnQgdG9fcGFzdGUgPSBtaW5fdChfX3U2NCwgaG9sZV9zaXplLCBNQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKS9VTkZNX1BfU0laRSApOyAvLyBIb3cgbXVjaCBkYXRhIHRvIGluc2VydCBmaXJzdCB0aW1lLgotCSAgICAvKiBhcmVhIGZpbGxlZCB3aXRoIHplcm9lcywgdG8gc3VwcGx5IGFzIGxpc3Qgb2YgemVybyBibG9ja251bWJlcnMKLQkgICAgICAgV2UgYWxsb2NhdGUgaXQgb3V0c2lkZSBvZiBsb29wIGp1c3QgaW4gY2FzZSBsb29wIHdvdWxkIHNwaW4gZm9yCi0JICAgICAgIHNldmVyYWwgaXRlcmF0aW9ucy4gKi8KLQkgICAgY2hhciAqemVyb3MgPSBrbWFsbG9jKHRvX3Bhc3RlKlVORk1fUF9TSVpFLCBHRlBfQVRPTUlDKTsgLy8gV2UgY2Fubm90IGluc2VydCBtb3JlIHRoYW4gTUFYX0lURU1fTEVOIGJ5dGVzIGFueXdheS4KLQkgICAgaWYgKCAhemVyb3MgKSB7Ci0JCXJlcyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCSAgICBtZW1zZXQgKCB6ZXJvcywgMCwgdG9fcGFzdGUqVU5GTV9QX1NJWkUpOwotCSAgICBkbyB7Ci0JCXRvX3Bhc3RlID0gbWluX3QoX191NjQsIGhvbGVfc2l6ZSwgTUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkvVU5GTV9QX1NJWkUgKTsKLQkJaWYgKCBpc19pbmRpcmVjdF9sZV9paChpaCkgKSB7Ci0JCSAgICAvKiBPaywgdGhlcmUgaXMgZXhpc3RpbmcgaW5kaXJlY3QgaXRlbSBhbHJlYWR5LiBOZWVkIHRvIGFwcGVuZCBpdCAqLwotCQkgICAgLyogQ2FsY3VsYXRlIHBvc2l0aW9uIHBhc3QgaW5zZXJ0ZWQgaXRlbSAqLwotCQkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgbGVfa2V5X2tfb2Zmc2V0KCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLCBUWVBFX0lORElSRUNULCAzKTsKLQkJICAgIHJlcyA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSggdGgsICZwYXRoLCAma2V5LCBpbm9kZSwgKGNoYXIgKil6ZXJvcywgVU5GTV9QX1NJWkUqdG9fcGFzdGUpOwotCQkgICAgaWYgKCByZXMgKSB7Ci0JCQlrZnJlZSh6ZXJvcyk7Ci0JCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0JCSAgICB9Ci0JCX0gZWxzZSBpZiAoIGlzX3N0YXRkYXRhX2xlX2loKGloKSApIHsKLQkJICAgIC8qIE5vIGV4aXN0aW5nIGl0ZW0sIGNyZWF0ZSBpdCAqLwotCQkgICAgLyogaXRlbSBoZWFkIGZvciBuZXcgaXRlbSAqLwotCQkgICAgc3RydWN0IGl0ZW1faGVhZCBpbnNfaWg7CisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CS8vIEdldCBhIGJ1ZmZlcmhlYWQgZm9yIGxhc3QgZWxlbWVudCBpbiBwYXRoLgorCWloID0gZ2V0X2loKCZwYXRoKTsJLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaGVhZCBpbiBwYXRoLgorCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CS8vIEdldCBhIHBvaW50ZXIgdG8gbGFzdCBpdGVtIGluIHBhdGgKIAotCQkgICAgLyogY3JlYXRlIGEga2V5IGZvciBvdXIgbmV3IGl0ZW0gKi8KLQkJICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIDEsIFRZUEVfSU5ESVJFQ1QsIDMpOworCS8qIExldCdzIHNlZSB3aGF0IHdlIGhhdmUgZm91bmQgKi8KKwlpZiAocmVzICE9IFBPU0lUSU9OX0ZPVU5EKSB7CS8qIHBvc2l0aW9uIG5vdCBmb3VuZCwgdGhpcyBtZWFucyB0aGF0IHdlCisJCQkJCSAgIG1pZ2h0IG5lZWQgdG8gYXBwZW5kIGZpbGUgd2l0aCBob2xlcworCQkJCQkgICBmaXJzdCAqLworCQkvLyBTaW5jZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBmaWxlJ3MgZW5kLCB3ZSBuZWVkIHRvIGZpbmQgb3V0IGlmCisJCS8vIHRoZXJlIGlzIGEgaG9sZSB0aGF0IG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSBvdXIgd3JpdGluZworCQkvLyBwb3NpdGlvbiwgYW5kIGhvdyBtYW55IGJsb2NrcyBpdCBpcyBnb2luZyB0byBjb3ZlciAod2UgbmVlZCB0bworCQkvLyAgcG9wdWxhdGUgcG9pbnRlcnMgdG8gZmlsZSBibG9ja3MgcmVwcmVzZW50aW5nIHRoZSBob2xlIHdpdGggemVyb3MpCiAKLQkJICAgIC8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KLQkJICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmaW5zX2loLCAma2V5LCBrZXkudmVyc2lvbiwgMSwKLQkJCQkgICAgICAgVFlQRV9JTkRJUkVDVCwgdG9fcGFzdGUqVU5GTV9QX1NJWkUsCi0JCQkJICAgICAgIDAgLyogZnJlZSBzcGFjZSAqLyk7CisJCXsKKwkJCWludCBpdGVtX29mZnNldCA9IDE7CisJCQkvKgorCQkJICogaWYgaWggaXMgc3RhdCBkYXRhLCBpdHMgb2Zmc2V0IGlzIDAgYW5kIHdlIGRvbid0IHdhbnQgdG8KKwkJCSAqIGFkZCAxIHRvIHBvcyBpbiB0aGUgaG9sZV9zaXplIGNhbGN1bGF0aW9uCisJCQkgKi8KKwkJCWlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJCQkJaXRlbV9vZmZzZXQgPSAwOworCQkJaG9sZV9zaXplID0gKHBvcyArIGl0ZW1fb2Zmc2V0IC0KKwkJCQkgICAgIChsZV9rZXlfa19vZmZzZXQKKwkJCQkgICAgICAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAorCQkJCSAgICAgICAmKGloLT5paF9rZXkpKSArIG9wX2J5dGVzX251bWJlcihpaCwKKwkJCQkJCQkJCWlub2RlLT4KKwkJCQkJCQkJCWlfc2ItPgorCQkJCQkJCQkJc19ibG9ja3NpemUpKSkKKwkJCSAgICA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJfQogCi0JCSAgICAvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLwotCQkgICAgcmVzID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JCSAgICBpZiAoIHJlcyAhPSBJVEVNX05PVF9GT1VORCApIHsKLQkJCS8qIGl0ZW0gc2hvdWxkIG5vdCBleGlzdCwgb3RoZXJ3aXNlIHdlIGhhdmUgZXJyb3IgKi8KLQkJCWlmICggcmVzICE9IC1FTk9TUEMgKSB7Ci0JCQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0JCQkJImdyZWVuLTkwMDg6IHNlYXJjaF9ieV9rZXkgKCVLKSByZXR1cm5lZCAlZCIsCi0JCQkJCSAgICAgICZrZXksIHJlcyk7CisJCWlmIChob2xlX3NpemUgPiAwKSB7CisJCQlpbnQgdG9fcGFzdGUgPSBtaW5fdChfX3U2NCwgaG9sZV9zaXplLCBNQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSAvIFVORk1fUF9TSVpFKTsJLy8gSG93IG11Y2ggZGF0YSB0byBpbnNlcnQgZmlyc3QgdGltZS4KKwkJCS8qIGFyZWEgZmlsbGVkIHdpdGggemVyb2VzLCB0byBzdXBwbHkgYXMgbGlzdCBvZiB6ZXJvIGJsb2NrbnVtYmVycworCQkJICAgV2UgYWxsb2NhdGUgaXQgb3V0c2lkZSBvZiBsb29wIGp1c3QgaW4gY2FzZSBsb29wIHdvdWxkIHNwaW4gZm9yCisJCQkgICBzZXZlcmFsIGl0ZXJhdGlvbnMuICovCisJCQljaGFyICp6ZXJvcyA9IGttYWxsb2ModG9fcGFzdGUgKiBVTkZNX1BfU0laRSwgR0ZQX0FUT01JQyk7CS8vIFdlIGNhbm5vdCBpbnNlcnQgbW9yZSB0aGFuIE1BWF9JVEVNX0xFTiBieXRlcyBhbnl3YXkuCisJCQlpZiAoIXplcm9zKSB7CisJCQkJcmVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CiAJCQl9Ci0JCQlyZXMgPSAtRUlPOwotCQkgICAgICAgIGtmcmVlKHplcm9zKTsKLQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkJICAgIH0KLQkJICAgIHJlcyA9IHJlaXNlcmZzX2luc2VydF9pdGVtKCB0aCwgJnBhdGgsICZrZXksICZpbnNfaWgsIGlub2RlLCAoY2hhciAqKXplcm9zKTsKKwkJCW1lbXNldCh6ZXJvcywgMCwgdG9fcGFzdGUgKiBVTkZNX1BfU0laRSk7CisJCQlkbyB7CisJCQkJdG9fcGFzdGUgPQorCQkJCSAgICBtaW5fdChfX3U2NCwgaG9sZV9zaXplLAorCQkJCQkgIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+CisJCQkJCQkgICAgICAgc19ibG9ja3NpemUpIC8KKwkJCQkJICBVTkZNX1BfU0laRSk7CisJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkgeworCQkJCQkvKiBPaywgdGhlcmUgaXMgZXhpc3RpbmcgaW5kaXJlY3QgaXRlbSBhbHJlYWR5LiBOZWVkIHRvIGFwcGVuZCBpdCAqLworCQkJCQkvKiBDYWxjdWxhdGUgcG9zaXRpb24gcGFzdCBpbnNlcnRlZCBpdGVtICovCisJCQkJCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwKKwkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0CisJCQkJCQkgICAgIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbgorCQkJCQkJICAgICAgKGlub2RlKSwKKwkJCQkJCSAgICAgICYoaWgtPmloX2tleSkpICsKKwkJCQkJCSAgICAgb3BfYnl0ZXNfbnVtYmVyKGloLAorCQkJCQkJCQkgICAgIGlub2RlLT4KKwkJCQkJCQkJICAgICBpX3NiLT4KKwkJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZSksCisJCQkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOworCQkJCQlyZXMgPQorCQkJCQkgICAgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCAmcGF0aCwKKwkJCQkJCQkJICAgICAma2V5LAorCQkJCQkJCQkgICAgIGlub2RlLAorCQkJCQkJCQkgICAgIChjaGFyICopCisJCQkJCQkJCSAgICAgemVyb3MsCisJCQkJCQkJCSAgICAgVU5GTV9QX1NJWkUKKwkJCQkJCQkJICAgICAqCisJCQkJCQkJCSAgICAgdG9fcGFzdGUpOworCQkJCQlpZiAocmVzKSB7CisJCQkJCQlrZnJlZSh6ZXJvcyk7CisJCQkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkgeworCQkJCQkvKiBObyBleGlzdGluZyBpdGVtLCBjcmVhdGUgaXQgKi8KKwkJCQkJLyogaXRlbSBoZWFkIGZvciBuZXcgaXRlbSAqLworCQkJCQlzdHJ1Y3QgaXRlbV9oZWFkIGluc19paDsKKworCQkJCQkvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLworCQkJCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIDEsCisJCQkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOworCisJCQkJCS8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkJCQkJbWFrZV9sZV9pdGVtX2hlYWQoJmluc19paCwgJmtleSwKKwkJCQkJCQkgIGtleS52ZXJzaW9uLCAxLAorCQkJCQkJCSAgVFlQRV9JTkRJUkVDVCwKKwkJCQkJCQkgIHRvX3Bhc3RlICoKKwkJCQkJCQkgIFVORk1fUF9TSVpFLAorCQkJCQkJCSAgMCAvKiBmcmVlIHNwYWNlICovICk7CisKKwkJCQkJLyogRmluZCB3aGVyZSBzdWNoIGl0ZW0gc2hvdWxkIGxpdmUgaW4gdGhlIHRyZWUgKi8KKwkJCQkJcmVzID0KKwkJCQkJICAgIHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LAorCQkJCQkJCSZwYXRoKTsKKwkJCQkJaWYgKHJlcyAhPSBJVEVNX05PVF9GT1VORCkgeworCQkJCQkJLyogaXRlbSBzaG91bGQgbm90IGV4aXN0LCBvdGhlcndpc2Ugd2UgaGF2ZSBlcnJvciAqLworCQkJCQkJaWYgKHJlcyAhPSAtRU5PU1BDKSB7CisJCQkJCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+CisJCQkJCQkJCQkgaV9zYiwKKwkJCQkJCQkJCSAiZ3JlZW4tOTAwODogc2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwKKwkJCQkJCQkJCSAma2V5LAorCQkJCQkJCQkJIHJlcyk7CisJCQkJCQl9CisJCQkJCQlyZXMgPSAtRUlPOworCQkJCQkJa2ZyZWUoemVyb3MpOworCQkJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJCQl9CisJCQkJCXJlcyA9CisJCQkJCSAgICByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgJnBhdGgsCisJCQkJCQkJCSAma2V5LCAmaW5zX2loLAorCQkJCQkJCQkgaW5vZGUsCisJCQkJCQkJCSAoY2hhciAqKXplcm9zKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAgICAgICAiZ3JlZW4tOTAxMTogVW5leHBlY3RlZCBrZXkgdHlwZSAlS1xuIiwKKwkJCQkJCSAgICAgICAma2V5KTsKKwkJCQl9CisJCQkJaWYgKHJlcykgeworCQkJCQlrZnJlZSh6ZXJvcyk7CisJCQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJCQl9CisJCQkJLyogTm93IHdlIHdhbnQgdG8gY2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgdG9vIGZ1bGwsIGFuZCBpZiBpdCBpcworCQkJCSAgIHdlIHJlc3RhcnQgaXQuIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIHBhdGguICovCisJCQkJaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZAorCQkJCSAgICAodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7CisJCQkJCXJlcyA9CisJCQkJCSAgICByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwKKwkJCQkJCQkJJnBhdGgpOworCQkJCQlpZiAocmVzKSB7CisJCQkJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJCQkJa2ZyZWUoemVyb3MpOworCQkJCQkJZ290byBlcnJvcl9leGl0OworCQkJCQl9CisJCQkJfQorCisJCQkJLyogV2VsbCwgbmVlZCB0byByZWNhbGN1bGF0ZSBwYXRoIGFuZCBzdHVmZiAqLworCQkJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksCisJCQkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkJICAgICAodG9fcGFzdGUgPDwgaW5vZGUtPgorCQkJCQkJICAgICAgaV9ibGtiaXRzKSk7CisJCQkJcmVzID0KKwkJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsCisJCQkJCQkJICAgICAgICZrZXksICZwYXRoKTsKKwkJCQlpZiAocmVzID09IElPX0VSUk9SKSB7CisJCQkJCXJlcyA9IC1FSU87CisJCQkJCWtmcmVlKHplcm9zKTsKKwkJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJCX0KKwkJCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJCQlob2xlX3NpemUgLT0gdG9fcGFzdGU7CisJCQl9IHdoaWxlIChob2xlX3NpemUpOworCQkJa2ZyZWUoemVyb3MpOworCQl9CisJfQorCS8vIEdvIHRocm91Z2ggZXhpc3RpbmcgaW5kaXJlY3QgaXRlbXMgZmlyc3QKKwkvLyByZXBsYWNlIGFsbCB6ZXJvZXMgd2l0aCBibG9ja251bWJlcnMgZnJvbSBsaXN0CisJLy8gTm90ZSB0aGF0IGlmIG5vIGNvcnJlc3BvbmRpbmcgaXRlbSB3YXMgZm91bmQsIGJ5IHByZXZpb3VzIHNlYXJjaCwKKwkvLyBpdCBtZWFucyB0aGVyZSBhcmUgbm8gZXhpc3RpbmcgaW4tdHJlZSByZXByZXNlbnRhdGlvbiBmb3IgZmlsZSBhcmVhCisJLy8gd2UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSwgc28gdGhlcmUgaXMgbm90aGluZyB0byBzY2FuIHRocm91Z2ggZm9yIGhvbGVzLgorCWZvciAoY3Vycl9ibG9jayA9IDAsIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtOworCSAgICAgY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSAmJiByZXMgPT0gUE9TSVRJT05fRk9VTkQ7KSB7CisJICAgICAgcmV0cnk6CisKKwkJaWYgKGl0ZW1wb3MgPj0gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUpIHsKKwkJCS8qIFdlIHJ1biBvdXQgb2YgZGF0YSBpbiB0aGlzIGluZGlyZWN0IGl0ZW0sIGxldCdzIGxvb2sgZm9yIGFub3RoZXIKKwkJCSAgIG9uZS4gKi8KKwkJCS8qIEZpcnN0IGlmIHdlIGFyZSBhbHJlYWR5IG1vZGlmeWluZyBjdXJyZW50IGl0ZW0sIGxvZyBpdCAqLworCQkJaWYgKG1vZGlmeWluZ190aGlzX2l0ZW0pIHsKKwkJCQlqb3VybmFsX21hcmtfZGlydHkodGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCQkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDA7CisJCQl9CisJCQkvKiBUaGVuIHNldCB0aGUga2V5IHRvIGxvb2sgZm9yIGEgbmV3IGluZGlyZWN0IGl0ZW0gKG9mZnNldCBvZiBvbGQKKwkJCSAgIGl0ZW0gaXMgYWRkZWQgdG8gb2xkIGl0ZW0gbGVuZ3RoICovCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkgICAgIGxlX2tleV9rX29mZnNldAorCQkJCQkgICAgIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksCisJCQkJCSAgICAgICYoaWgtPmloX2tleSkpICsKKwkJCQkJICAgICBvcF9ieXRlc19udW1iZXIoaWgsCisJCQkJCQkJICAgICBpbm9kZS0+aV9zYi0+CisJCQkJCQkJICAgICBzX2Jsb2Nrc2l6ZSkpOworCQkJLyogU2VhcmNoIG9mb3IgcG9zaXRpb24gb2YgbmV3IGtleSBpbiB0aGUgdHJlZS4gKi8KKwkJCXJlcyA9CisJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksCisJCQkJCQkgICAgICAgJnBhdGgpOworCQkJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQkJCXJlcyA9IC1FSU87CisJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJfQorCQkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCQkJaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJCQljb250aW51ZTsJLy8gbG9vcCB0byBjaGVjayBhbGwga2luZHMgb2YgY29uZGl0aW9ucyBhbmQgc28gb24uCisJCX0KKwkJLyogT2ssIHdlIGhhdmUgY29ycmVjdCBwb3NpdGlvbiBpbiBpdGVtIG5vdywgc28gbGV0J3Mgc2VlIGlmIGl0IGlzCisJCSAgIHJlcHJlc2VudGluZyBmaWxlIGhvbGUgKGJsb2NrbnVtYmVyIGlzIHplcm8pIGFuZCBmaWxsIGl0IGlmIG5lZWRlZCAqLworCQlpZiAoIWl0ZW1baXRlbXBvc10pIHsKKwkJCS8qIE9rLCBhIGhvbGUuIE5vdyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFscmVhZHkgcHJlcGFyZWQgdGhpcworCQkJICAgYmxvY2sgdG8gYmUgam91cm5hbGVkICovCisJCQl3aGlsZSAoIW1vZGlmeWluZ190aGlzX2l0ZW0pIHsJLy8gbG9vcCB1bnRpbCBzdWNjZWVkCisJCQkJLyogV2VsbCwgdGhpcyBpdGVtIGlzIG5vdCBqb3VybmFsZWQgeWV0LCBzbyB3ZSBtdXN0IHByZXBhcmUKKwkJCQkgICBpdCBmb3Igam91cm5hbCBmaXJzdCwgYmVmb3JlIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKwkJCQlzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paDsJLy8gV2UgY29weSBpdGVtIGhlYWQgb2YgZm91bmQgaXRlbSwKKwkJCQkvLyBoZXJlIHRvIGRldGVjdCBpZiBmcyBjaGFuZ2VkIHVuZGVyCisJCQkJLy8gdXMgd2hpbGUgd2Ugd2VyZSBwcmVwYXJpbmcgZm9yCisJCQkJLy8gam91cm5hbC4KKwkJCQlpbnQgZnNfZ2VuOwkvLyBXZSBzdG9yZSBmcyBnZW5lcmF0aW9uIGhlcmUgdG8gZmluZCBpZiBzb21lb25lCisJCQkJLy8gY2hhbmdlcyBmcyB1bmRlciBvdXIgZmVldAorCisJCQkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwkvLyBSZW1lbWJlciBpdGVtaGVhZAorCQkJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsJLy8gcmVtZW1iZXIgZnMgZ2VuZXJhdGlvbgorCQkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsJLy8gUHJlcGFyZSBhIGJ1ZmZlciB3aXRoaW4gd2hpY2ggaW5kaXJlY3QgaXRlbSBpcyBzdG9yZWQgZm9yIGNoYW5naW5nLgorCQkJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCQkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQkJCS8vIFNpZ2gsIGZzIHdhcyBjaGFuZ2VkIHVuZGVyIHVzLCB3ZSBuZWVkIHRvIGxvb2sgZm9yIG5ldworCQkJCQkvLyBsb2NhdGlvbiBvZiBpdGVtIHdlIGFyZSB3b3JraW5nIHdpdGgKKworCQkJCQkvKiB1bm1hcmsgcHJlcGFlcmQgYXJlYSBhcyBqb3VybmFsZWQgYW5kIHNlYXJjaCBmb3IgaXQncworCQkJCQkgICBuZXcgcG9zaXRpb24gKi8KKwkJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPgorCQkJCQkJCQkJIGlfc2IsCisJCQkJCQkJCQkgYmgpOworCQkJCQlyZXMgPQorCQkJCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPgorCQkJCQkJCQkgICAgICAgaV9zYiwKKwkJCQkJCQkJICAgICAgICZrZXksCisJCQkJCQkJCSAgICAgICAmcGF0aCk7CisJCQkJCWlmIChyZXMgPT0gSU9fRVJST1IpIHsKKwkJCQkJCXJlcyA9IC1FSU87CisJCQkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQkJCX0KKwkJCQkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCQkJCWloID0gZ2V0X2loKCZwYXRoKTsKKwkJCQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJCQkJaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfQorCQkJCW1vZGlmeWluZ190aGlzX2l0ZW0gPSAxOworCQkJfQorCQkJaXRlbVtpdGVtcG9zXSA9IGFsbG9jYXRlZF9ibG9ja3NbY3Vycl9ibG9ja107CS8vIEFzc2lnbiBuZXcgYmxvY2sKKwkJCWN1cnJfYmxvY2srKzsKKwkJfQorCQlpdGVtcG9zKys7CisJfQorCisJaWYgKG1vZGlmeWluZ190aGlzX2l0ZW0pIHsJLy8gV2UgbmVlZCB0byBsb2cgbGFzdC1hY2Nlc3NlZCBibG9jaywgaWYgaXQKKwkJLy8gd2FzIG1vZGlmaWVkLCBidXQgbm90IGxvZ2dlZCB5ZXQuCisJCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKKwl9CisKKwlpZiAoY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSkgeworCQkvLyBPaCwgd2VsbCBuZWVkIHRvIGFwcGVuZCB0byBpbmRpcmVjdCBpdGVtLCBvciB0byBjcmVhdGUgaW5kaXJlY3QgaXRlbQorCQkvLyBpZiB0aGVyZSB3ZXJlbid0IGFueQorCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKSB7CisJCQkvLyBFeGlzdGluZyBpbmRpcmVjdCBpdGVtIC0gYXBwZW5kLiBGaXJzdCBjYWxjdWxhdGUga2V5IGZvciBhcHBlbmQKKwkJCS8vIHBvc2l0aW9uLiBXZSBkbyBub3QgbmVlZCB0byByZWNhbGN1bGF0ZSBwYXRoIGFzIGl0IHNob3VsZAorCQkJLy8gYWxyZWFkeSBwb2ludCB0byBjb3JyZWN0IHBsYWNlLgorCQkJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLAorCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0KGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uCisJCQkJCQkgICAgIChpbm9kZSksCisJCQkJCQkgICAgICYoaWgtPmloX2tleSkpICsKKwkJCQkgICAgIG9wX2J5dGVzX251bWJlcihpaCwKKwkJCQkJCSAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwKKwkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOworCQkJcmVzID0KKwkJCSAgICByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0odGgsICZwYXRoLCAma2V5LCBpbm9kZSwKKwkJCQkJCSAgICAgKGNoYXIgKikoYWxsb2NhdGVkX2Jsb2NrcyArCisJCQkJCQkJICAgICAgY3Vycl9ibG9jayksCisJCQkJCQkgICAgIFVORk1fUF9TSVpFICoKKwkJCQkJCSAgICAgKGJsb2Nrc190b19hbGxvY2F0ZSAtCisJCQkJCQkgICAgICBjdXJyX2Jsb2NrKSk7CisJCQlpZiAocmVzKSB7CisJCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkJfQorCQl9IGVsc2UgaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkgeworCQkJLy8gTGFzdCBmb3VuZCBpdGVtIHdhcyBzdGF0ZGF0YS4gVGhhdCBtZWFucyB3ZSBuZWVkIHRvIGNyZWF0ZSBpbmRpcmVjdCBpdGVtLgorCQkJc3RydWN0IGl0ZW1faGVhZCBpbnNfaWg7CS8qIGl0ZW1oZWFkIGZvciBuZXcgaXRlbSAqLworCisJCQkvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLworCQkJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLCAxLCBUWVBFX0lORElSRUNULCAzKTsJLy8gUG9zaXRpb24gb25lLAorCQkJLy8gYmVjYXVzZSB0aGF0J3MKKwkJCS8vIHdoZXJlIGZpcnN0CisJCQkvLyBpbmRpcmVjdCBpdGVtCisJCQkvLyBiZWdpbnMKKwkJCS8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkJCW1ha2VfbGVfaXRlbV9oZWFkKCZpbnNfaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLAorCQkJCQkgIFRZUEVfSU5ESVJFQ1QsCisJCQkJCSAgKGJsb2Nrc190b19hbGxvY2F0ZSAtCisJCQkJCSAgIGN1cnJfYmxvY2spICogVU5GTV9QX1NJWkUsCisJCQkJCSAgMCAvKiBmcmVlIHNwYWNlICovICk7CisJCQkvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLworCQkJcmVzID0gc2VhcmNoX2l0ZW0oaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkJCWlmIChyZXMgIT0gSVRFTV9OT1RfRk9VTkQpIHsKKwkJCQkvKiBXZWxsLCBpZiB3ZSBoYXZlIGZvdW5kIHN1Y2ggaXRlbSBhbHJlYWR5LCBvciBzb21lIGVycm9yCisJCQkJICAgb2NjdXJlZCwgd2UgbmVlZCB0byB3YXJuIHVzZXIgYW5kIHJldHVybiBlcnJvciAqLworCQkJCWlmIChyZXMgIT0gLUVOT1NQQykgeworCQkJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCQkJCSAiZ3JlZW4tOTAwOTogc2VhcmNoX2J5X2tleSAoJUspICIKKwkJCQkJCQkgInJldHVybmVkICVkIiwgJmtleSwKKwkJCQkJCQkgcmVzKTsKKwkJCQl9CisJCQkJcmVzID0gLUVJTzsKKwkJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCQl9CisJCQkvKiBJbnNlcnQgaXRlbSBpbnRvIHRoZSB0cmVlIHdpdGggdGhlIGRhdGEgYXMgaXRzIGJvZHkgKi8KKwkJCXJlcyA9CisJCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoLCAma2V5LCAmaW5zX2loLAorCQkJCQkJIGlub2RlLAorCQkJCQkJIChjaGFyICopKGFsbG9jYXRlZF9ibG9ja3MgKworCQkJCQkJCSAgY3Vycl9ibG9jaykpOwogCQl9IGVsc2UgewotCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDExOiBVbmV4cGVjdGVkIGtleSB0eXBlICVLXG4iLCAma2V5KTsKKwkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCSAgICAgICAiZ3JlZW4tOTAxMDogdW5leHBlY3RlZCBpdGVtIHR5cGUgZm9yIGtleSAlS1xuIiwKKwkJCQkgICAgICAgJmtleSk7CiAJCX0KLQkJaWYgKCByZXMgKSB7Ci0JCSAgICBrZnJlZSh6ZXJvcyk7Ci0JCSAgICBnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJfQorCS8vIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHRyYW5zYWN0aW9uCisJLy8gdW5sZXNzIHdlIHJldHVybiBhbiBlcnJvciwgdGhleSBhcmUgYWxzbyByZXNwb25zaWJsZSBmb3IgbG9nZ2luZworCS8vIHRoZSBpbm9kZS4KKwkvLworCXBhdGhyZWxzZSgmcGF0aCk7CisJLyoKKwkgKiBjbGVhbnVwIHByZWxsb2NhdGlvbiBmcm9tIHByZXZpb3VzIHdyaXRlcworCSAqIGlmIHRoaXMgaXMgYSBwYXJ0aWFsIGJsb2NrIHdyaXRlCisJICovCisJaWYgKHdyaXRlX2J5dGVzICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQlyZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKHRoLCBpbm9kZSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKworCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwYWdlcy9idWZmZXJzIGFuZCBtYXAgdGhlIGJ1ZmZlcnMgdG8gbmV3bHkgYWxsb2NhdGVkCisJLy8gYmxvY2tzIChzbyB0aGF0IHN5c3RlbSBrbm93cyB3aGVyZSB0byB3cml0ZSB0aGVzZSBwYWdlcyBsYXRlcikuCisJY3Vycl9ibG9jayA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcHJlcGFyZWRfcGFnZXNbaV07CS8vY3VycmVudCBwYWdlCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsJLy8gZmlyc3QgYnVmZmVyIGZvciBhIHBhZ2UKKwkJaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CS8vIGluLXBhZ2Ugb2Zmc2V0cyBmb3IgYnVmZmVycy4KKworCQlpZiAoIXBhZ2VfYnVmZmVycyhwYWdlKSkKKwkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCSAgICAgICAiZ3JlZW4tOTAwNTogTm8gYnVmZmVycyBmb3IgcHJlcGFyZWQgcGFnZT8/PyIpOworCisJCS8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDA2OiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQkJaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSkKKwkJCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0ICovCisJCQkJY29udGludWU7CisJCQlpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKQorCQkJCS8qIElmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgYWJvcnQKKwkJCQkgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLworCQkJCWJyZWFrOworCisJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CS8vIE9rLCB1bm1hcHBlZCBidWZmZXIsIG5lZWQgdG8gbWFwIGl0CisJCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwKKwkJCQkgICAgICAgbGUzMl90b19jcHUoYWxsb2NhdGVkX2Jsb2NrcworCQkJCQkJICAgW2N1cnJfYmxvY2tdKSk7CisJCQkJY3Vycl9ibG9jaysrOworCQkJCXNldF9idWZmZXJfbmV3KGJoKTsKKwkJCX0KIAkJfQotCQkvKiBOb3cgd2Ugd2FudCB0byBjaGVjayBpZiB0cmFuc2FjdGlvbiBpcyB0b28gZnVsbCwgYW5kIGlmIGl0IGlzCi0JCSAgIHdlIHJlc3RhcnQgaXQuIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIHBhdGguICovCi0JCWlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7Ci0JCSAgICByZXMgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXRocmVsc2UgKCZwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHplcm9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCQkvKiBXZWxsLCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYW5kIHN0dWZmICovCi0JCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgKHRvX3Bhc3RlIDw8IGlub2RlLT5pX2Jsa2JpdHMpKTsKLQkJcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQkJaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0JCSAgICByZXMgPSAtRUlPOwotCQkgICAga2ZyZWUoemVyb3MpOwotCQkgICAgZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOwotCQl9Ci0JCWJoPWdldF9sYXN0X2JoKCZwYXRoKTsKLQkJaWg9Z2V0X2loKCZwYXRoKTsKLQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKLQkJaG9sZV9zaXplIC09IHRvX3Bhc3RlOwotCSAgICB9IHdoaWxlICggaG9sZV9zaXplICk7Ci0JICAgIGtmcmVlKHplcm9zKTsKIAl9Ci0gICAgfQogCi0gICAgLy8gR28gdGhyb3VnaCBleGlzdGluZyBpbmRpcmVjdCBpdGVtcyBmaXJzdAotICAgIC8vIHJlcGxhY2UgYWxsIHplcm9lcyB3aXRoIGJsb2NrbnVtYmVycyBmcm9tIGxpc3QKLSAgICAvLyBOb3RlIHRoYXQgaWYgbm8gY29ycmVzcG9uZGluZyBpdGVtIHdhcyBmb3VuZCwgYnkgcHJldmlvdXMgc2VhcmNoLAotICAgIC8vIGl0IG1lYW5zIHRoZXJlIGFyZSBubyBleGlzdGluZyBpbi10cmVlIHJlcHJlc2VudGF0aW9uIGZvciBmaWxlIGFyZWEKLSAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gb3ZlcndyaXRlLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHNjYW4gdGhyb3VnaCBmb3IgaG9sZXMuCi0gICAgZm9yICggY3Vycl9ibG9jayA9IDAsIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtIDsgY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSAmJiByZXMgPT0gUE9TSVRJT05fRk9VTkQgOyApIHsKLXJldHJ5OgorCVJGQUxTRShjdXJyX2Jsb2NrID4gYmxvY2tzX3RvX2FsbG9jYXRlLAorCSAgICAgICAiZ3JlZW4tOTAwNzogVXNlZCB0b28gbWFueSBibG9ja3M/IHdlaXJkIik7CiAKLQlpZiAoIGl0ZW1wb3MgPj0gaWhfaXRlbV9sZW4oaWgpL1VORk1fUF9TSVpFICkgewotCSAgICAvKiBXZSBydW4gb3V0IG9mIGRhdGEgaW4gdGhpcyBpbmRpcmVjdCBpdGVtLCBsZXQncyBsb29rIGZvciBhbm90aGVyCi0JICAgICAgIG9uZS4gKi8KLQkgICAgLyogRmlyc3QgaWYgd2UgYXJlIGFscmVhZHkgbW9kaWZ5aW5nIGN1cnJlbnQgaXRlbSwgbG9nIGl0ICovCi0JICAgIGlmICggbW9kaWZ5aW5nX3RoaXNfaXRlbSApIHsKLQkJam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKLQkJbW9kaWZ5aW5nX3RoaXNfaXRlbSA9IDA7Ci0JICAgIH0KLQkgICAgLyogVGhlbiBzZXQgdGhlIGtleSB0byBsb29rIGZvciBhIG5ldyBpbmRpcmVjdCBpdGVtIChvZmZzZXQgb2Ygb2xkCi0JICAgICAgIGl0ZW0gaXMgYWRkZWQgdG8gb2xkIGl0ZW0gbGVuZ3RoICovCi0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBsZV9rZXlfa19vZmZzZXQoIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIoaWgsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpOwotCSAgICAvKiBTZWFyY2ggb2ZvciBwb3NpdGlvbiBvZiBuZXcga2V5IGluIHRoZSB0cmVlLiAqLwotCSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCSAgICBpZiAoIHJlcyA9PSBJT19FUlJPUikgewotCQlyZXMgPSAtRUlPOwotCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7Ci0JICAgIH0KLQkgICAgYmg9Z2V0X2xhc3RfYmgoJnBhdGgpOwotCSAgICBpaD1nZXRfaWgoJnBhdGgpOwotCSAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOwotCSAgICBpdGVtcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKLQkgICAgY29udGludWU7IC8vIGxvb3AgdG8gY2hlY2sgYWxsIGtpbmRzIG9mIGNvbmRpdGlvbnMgYW5kIHNvIG9uLgotCX0KLQkvKiBPaywgd2UgaGF2ZSBjb3JyZWN0IHBvc2l0aW9uIGluIGl0ZW0gbm93LCBzbyBsZXQncyBzZWUgaWYgaXQgaXMKLQkgICByZXByZXNlbnRpbmcgZmlsZSBob2xlIChibG9ja251bWJlciBpcyB6ZXJvKSBhbmQgZmlsbCBpdCBpZiBuZWVkZWQgKi8KLQlpZiAoICFpdGVtW2l0ZW1wb3NdICkgewotCSAgICAvKiBPaywgYSBob2xlLiBOb3cgd2UgbmVlZCB0byBjaGVjayBpZiB3ZSBhbHJlYWR5IHByZXBhcmVkIHRoaXMKLQkgICAgICAgYmxvY2sgdG8gYmUgam91cm5hbGVkICovCi0JICAgIHdoaWxlICggIW1vZGlmeWluZ190aGlzX2l0ZW0gKSB7IC8vIGxvb3AgdW50aWwgc3VjY2VlZAotCQkvKiBXZWxsLCB0aGlzIGl0ZW0gaXMgbm90IGpvdXJuYWxlZCB5ZXQsIHNvIHdlIG11c3QgcHJlcGFyZQotCQkgICBpdCBmb3Igam91cm5hbCBmaXJzdCwgYmVmb3JlIHdlIGNhbiBjaGFuZ2UgaXQgKi8KLQkJc3RydWN0IGl0ZW1faGVhZCB0bXBfaWg7IC8vIFdlIGNvcHkgaXRlbSBoZWFkIG9mIGZvdW5kIGl0ZW0sCi0JCQkJCSAvLyBoZXJlIHRvIGRldGVjdCBpZiBmcyBjaGFuZ2VkIHVuZGVyCi0JCQkJCSAvLyB1cyB3aGlsZSB3ZSB3ZXJlIHByZXBhcmluZyBmb3IKLQkJCQkJIC8vIGpvdXJuYWwuCi0JCWludCBmc19nZW47IC8vIFdlIHN0b3JlIGZzIGdlbmVyYXRpb24gaGVyZSB0byBmaW5kIGlmIHNvbWVvbmUKLQkJCSAgICAvLyBjaGFuZ2VzIGZzIHVuZGVyIG91ciBmZWV0Ci0KLQkJY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsgLy8gUmVtZW1iZXIgaXRlbWhlYWQKLQkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKGlub2RlLT5pX3NiKTsgLy8gcmVtZW1iZXIgZnMgZ2VuZXJhdGlvbgotCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSk7IC8vIFByZXBhcmUgYSBidWZmZXIgd2l0aGluIHdoaWNoIGluZGlyZWN0IGl0ZW0gaXMgc3RvcmVkIGZvciBjaGFuZ2luZy4KLQkJaWYgKGZzX2NoYW5nZWQgKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoKSkgewotCQkgICAgLy8gU2lnaCwgZnMgd2FzIGNoYW5nZWQgdW5kZXIgdXMsIHdlIG5lZWQgdG8gbG9vayBmb3IgbmV3Ci0JCSAgICAvLyBsb2NhdGlvbiBvZiBpdGVtIHdlIGFyZSB3b3JraW5nIHdpdGgKLQotCQkgICAgLyogdW5tYXJrIHByZXBhZXJkIGFyZWEgYXMgam91cm5hbGVkIGFuZCBzZWFyY2ggZm9yIGl0J3MKLQkJICAgICAgIG5ldyBwb3NpdGlvbiAqLwotCQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKTsKLQkJICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JCSAgICBpZiAoIHJlcyA9PSBJT19FUlJPUikgewotCQkJcmVzID0gLUVJTzsKLQkJCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkJICAgIH0KLQkJICAgIGJoPWdldF9sYXN0X2JoKCZwYXRoKTsKLQkJICAgIGloPWdldF9paCgmcGF0aCk7Ci0JCSAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOwotCQkgICAgaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07Ci0JCSAgICBnb3RvIHJldHJ5OwotCQl9Ci0JCW1vZGlmeWluZ190aGlzX2l0ZW0gPSAxOwotCSAgICB9Ci0JICAgIGl0ZW1baXRlbXBvc10gPSBhbGxvY2F0ZWRfYmxvY2tzW2N1cnJfYmxvY2tdOyAvLyBBc3NpZ24gbmV3IGJsb2NrCi0JICAgIGN1cnJfYmxvY2srKzsKLQl9Ci0JaXRlbXBvcysrOwotICAgIH0KLQotICAgIGlmICggbW9kaWZ5aW5nX3RoaXNfaXRlbSApIHsgLy8gV2UgbmVlZCB0byBsb2cgbGFzdC1hY2Nlc3NlZCBibG9jaywgaWYgaXQKLQkJCQkgLy8gd2FzIG1vZGlmaWVkLCBidXQgbm90IGxvZ2dlZCB5ZXQuCi0Jam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKLSAgICB9Ci0KLSAgICBpZiAoIGN1cnJfYmxvY2sgPCBibG9ja3NfdG9fYWxsb2NhdGUgKSB7Ci0JLy8gT2gsIHdlbGwgbmVlZCB0byBhcHBlbmQgdG8gaW5kaXJlY3QgaXRlbSwgb3IgdG8gY3JlYXRlIGluZGlyZWN0IGl0ZW0KLQkvLyBpZiB0aGVyZSB3ZXJlbid0IGFueQotCWlmICggaXNfaW5kaXJlY3RfbGVfaWgoaWgpICkgewotCSAgICAvLyBFeGlzdGluZyBpbmRpcmVjdCBpdGVtIC0gYXBwZW5kLiBGaXJzdCBjYWxjdWxhdGUga2V5IGZvciBhcHBlbmQKLQkgICAgLy8gcG9zaXRpb24uIFdlIGRvIG5vdCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYXMgaXQgc2hvdWxkCi0JICAgIC8vIGFscmVhZHkgcG9pbnQgdG8gY29ycmVjdCBwbGFjZS4KLQkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgbGVfa2V5X2tfb2Zmc2V0KCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLCBUWVBFX0lORElSRUNULCAzKTsKLQkgICAgcmVzID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKCB0aCwgJnBhdGgsICZrZXksIGlub2RlLCAoY2hhciAqKShhbGxvY2F0ZWRfYmxvY2tzK2N1cnJfYmxvY2spLCBVTkZNX1BfU0laRSooYmxvY2tzX3RvX2FsbG9jYXRlLWN1cnJfYmxvY2spKTsKLQkgICAgaWYgKCByZXMgKSB7Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCX0gZWxzZSBpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpICkgewotCSAgICAvLyBMYXN0IGZvdW5kIGl0ZW0gd2FzIHN0YXRkYXRhLiBUaGF0IG1lYW5zIHdlIG5lZWQgdG8gY3JlYXRlIGluZGlyZWN0IGl0ZW0uCi0JICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5zX2loOyAvKiBpdGVtaGVhZCBmb3IgbmV3IGl0ZW0gKi8KLQotCSAgICAvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLwotCSAgICBtYWtlX2NwdV9rZXkoICZrZXksIGlub2RlLCAxLCBUWVBFX0lORElSRUNULCAzKTsgLy8gUG9zaXRpb24gb25lLAotCQkJCQkJCSAgICAvLyBiZWNhdXNlIHRoYXQncwotCQkJCQkJCSAgICAvLyB3aGVyZSBmaXJzdAotCQkJCQkJCSAgICAvLyBpbmRpcmVjdCBpdGVtCi0JCQkJCQkJICAgIC8vIGJlZ2lucwotCSAgICAvKiBDcmVhdGUgbmV3IGl0ZW0gaGVhZCBmb3Igb3VyIG5ldyBpdGVtICovCi0JICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmaW5zX2loLCAma2V5LCBrZXkudmVyc2lvbiwgMSwgVFlQRV9JTkRJUkVDVCwKLQkJCSAgICAgICAoYmxvY2tzX3RvX2FsbG9jYXRlLWN1cnJfYmxvY2spKlVORk1fUF9TSVpFLAotCQkJICAgICAgIDAgLyogZnJlZSBzcGFjZSAqLyk7Ci0JICAgIC8qIEZpbmQgd2hlcmUgc3VjaCBpdGVtIHNob3VsZCBsaXZlIGluIHRoZSB0cmVlICovCi0JICAgIHJlcyA9IHNlYXJjaF9pdGVtIChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotCSAgICBpZiAoIHJlcyAhPSBJVEVNX05PVF9GT1VORCApIHsKLQkJLyogV2VsbCwgaWYgd2UgaGF2ZSBmb3VuZCBzdWNoIGl0ZW0gYWxyZWFkeSwgb3Igc29tZSBlcnJvcgotCQkgICBvY2N1cmVkLCB3ZSBuZWVkIHRvIHdhcm4gdXNlciBhbmQgcmV0dXJuIGVycm9yICovCi0JCWlmICggcmVzICE9IC1FTk9TUEMgKSB7Ci0JCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKLQkJCQkgICAgICAiZ3JlZW4tOTAwOTogc2VhcmNoX2J5X2tleSAoJUspICIKLQkJCQkgICAgICAicmV0dXJuZWQgJWQiLCAma2V5LCByZXMpOwotCQl9Ci0JCXJlcyA9IC1FSU87Ci0JCWdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKLQkgICAgfQotCSAgICAvKiBJbnNlcnQgaXRlbSBpbnRvIHRoZSB0cmVlIHdpdGggdGhlIGRhdGEgYXMgaXRzIGJvZHkgKi8KLQkgICAgcmVzID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgJmluc19paCwgaW5vZGUsIChjaGFyICopKGFsbG9jYXRlZF9ibG9ja3MrY3Vycl9ibG9jaykpOwotCX0gZWxzZSB7Ci0JICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAxMDogdW5leHBlY3RlZCBpdGVtIHR5cGUgZm9yIGtleSAlS1xuIiwma2V5KTsKLQl9Ci0gICAgfQotCi0gICAgLy8gdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgdHJhbnNhY3Rpb24KLSAgICAvLyB1bmxlc3Mgd2UgcmV0dXJuIGFuIGVycm9yLCB0aGV5IGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBsb2dnaW5nCi0gICAgLy8gdGhlIGlub2RlLgotICAgIC8vCi0gICAgcGF0aHJlbHNlKCZwYXRoKTsKLSAgICAvKgotICAgICAqIGNsZWFudXAgcHJlbGxvY2F0aW9uIGZyb20gcHJldmlvdXMgd3JpdGVzCi0gICAgICogaWYgdGhpcyBpcyBhIHBhcnRpYWwgYmxvY2sgd3JpdGUKLSAgICAgKi8KLSAgICBpZiAod3JpdGVfYnl0ZXMgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0xKSkKLSAgICAgICAgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyh0aCwgaW5vZGUpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0KLSAgICAvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGFnZXMvYnVmZmVycyBhbmQgbWFwIHRoZSBidWZmZXJzIHRvIG5ld2x5IGFsbG9jYXRlZAotICAgIC8vIGJsb2NrcyAoc28gdGhhdCBzeXN0ZW0ga25vd3Mgd2hlcmUgdG8gd3JpdGUgdGhlc2UgcGFnZXMgbGF0ZXIpLgotICAgIGN1cnJfYmxvY2sgPSAwOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhZ2VzIDsgaSsrICkgewotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvL2N1cnJlbnQgcGFnZQotCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsvLyBmaXJzdCBidWZmZXIgZm9yIGEgcGFnZQotCWludCBibG9ja19zdGFydCwgYmxvY2tfZW5kOyAvLyBpbi1wYWdlIG9mZnNldHMgZm9yIGJ1ZmZlcnMuCi0KLQlpZiAoIXBhZ2VfYnVmZmVycyhwYWdlKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDA1OiBObyBidWZmZXJzIGZvciBwcmVwYXJlZCBwYWdlPz8/Iik7Ci0KLQkvKiBGb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLwotCWZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7Ci0JICAgIGJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKLQkgICAgaWYgKCFiaCkKLQkJcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDA2OiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKLQkgICAgYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCSAgICBpZiAoaSA9PSAwICYmIGJsb2NrX2VuZCA8PSBmcm9tICkKLQkJLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCAqLwotCQljb250aW51ZTsKLQkgICAgaWYgKGkgPT0gbnVtX3BhZ2VzIC0gMSAmJiBibG9ja19zdGFydCA+PSB0bykKLQkJLyogSWYgdGhpcyBidWZmZXIgaXMgYWZ0ZXIgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBhYm9ydAotCQkgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLwotCQlicmVhazsKLQotCSAgICBpZiAoICFidWZmZXJfbWFwcGVkKGJoKSApIHsgLy8gT2ssIHVubWFwcGVkIGJ1ZmZlciwgbmVlZCB0byBtYXAgaXQKLQkJbWFwX2JoKCBiaCwgaW5vZGUtPmlfc2IsIGxlMzJfdG9fY3B1KGFsbG9jYXRlZF9ibG9ja3NbY3Vycl9ibG9ja10pKTsKLQkJY3Vycl9ibG9jaysrOwotCQlzZXRfYnVmZmVyX25ldyhiaCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgUkZBTFNFKCBjdXJyX2Jsb2NrID4gYmxvY2tzX3RvX2FsbG9jYXRlLCAiZ3JlZW4tOTAwNzogVXNlZCB0b28gbWFueSBibG9ja3M/IHdlaXJkIik7Ci0KLSAgICBrZnJlZShhbGxvY2F0ZWRfYmxvY2tzKTsKLSAgICByZXR1cm4gMDsKKwlrZnJlZShhbGxvY2F0ZWRfYmxvY2tzKTsKKwlyZXR1cm4gMDsKIAogLy8gTmVlZCB0byBkZWFsIHdpdGggdHJhbnNhY3Rpb24gaGVyZS4KLWVycm9yX2V4aXRfZnJlZV9ibG9ja3M6Ci0gICAgcGF0aHJlbHNlKCZwYXRoKTsKLSAgICAvLyBmcmVlIGJsb2NrcwotICAgIGZvciggaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGU7IGkrKyApCi0JcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGxlMzJfdG9fY3B1KGFsbG9jYXRlZF9ibG9ja3NbaV0pLCAxKTsKKyAgICAgIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwkvLyBmcmVlIGJsb2NrcworCWZvciAoaSA9IDA7IGkgPCBibG9ja3NfdG9fYWxsb2NhdGU7IGkrKykKKwkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGxlMzJfdG9fY3B1KGFsbG9jYXRlZF9ibG9ja3NbaV0pLAorCQkJCSAgICAxKTsKIAotZXJyb3JfZXhpdDoKLSAgICBpZiAodGgtPnRfdHJhbnNfaWQpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgLy8gdXBkYXRlIGFueSBjaGFuZ2VzIHdlIG1hZGUgdG8gYmxrIGNvdW50Ci0gICAgICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgICAgICBlcnIgPSBqb3VybmFsX2VuZCh0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKLSAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgIHJlcyA9IGVycjsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBrZnJlZShhbGxvY2F0ZWRfYmxvY2tzKTsKKyAgICAgIGVycm9yX2V4aXQ6CisJaWYgKHRoLT50X3RyYW5zX2lkKSB7CisJCWludCBlcnI7CisJCS8vIHVwZGF0ZSBhbnkgY2hhbmdlcyB3ZSBtYWRlIHRvIGJsayBjb3VudAorCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJZXJyID0KKwkJICAgIGpvdXJuYWxfZW5kKHRoLCBpbm9kZS0+aV9zYiwKKwkJCQlKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsKKwkJCQkyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJCWlmIChlcnIpCisJCQlyZXMgPSBlcnI7CisJfQorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJa2ZyZWUoYWxsb2NhdGVkX2Jsb2Nrcyk7CiAKLSAgICByZXR1cm4gcmVzOworCXJldHVybiByZXM7CiB9CiAKIC8qIFVubG9jayBwYWdlcyBwcmVwYXJlZCBieSByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAqLwotc3RhdGljIHZvaWQgcmVpc2VyZnNfdW5wcmVwYXJlX3BhZ2VzKHN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsIC8qIGxpc3Qgb2YgbG9ja2VkIHBhZ2VzICovCi0JCQkgICAgICBzaXplX3QgbnVtX3BhZ2VzIC8qIGFtb3VudCBvZiBwYWdlcyAqLykgewotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLAkvKiBsaXN0IG9mIGxvY2tlZCBwYWdlcyAqLworCQkJCSAgICAgc2l6ZV90IG51bV9wYWdlcyAvKiBhbW91bnQgb2YgcGFnZXMgKi8gKQoreworCWludCBpOwkJCS8vIGxvb3AgY291bnRlcgogCi0gICAgZm9yIChpPTA7IGkgPCBudW1fcGFnZXMgOyBpKyspIHsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOwogCi0JdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKLQl1bmxvY2tfcGFnZShwYWdlKTsKLQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0gICAgfQorCQl0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGNvcHkgZGF0YSBmcm9tIHVzZXJzcGFjZSB0byBzcGVjaWZpZWQgcGFnZXMgd2l0aGluCiAgICBzdXBwbGllZCBieXRlIHJhbmdlICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX2NvcHlfZnJvbV91c2VyX3RvX2ZpbGVfcmVnaW9uKAotCQkJCWxvZmZfdCBwb3MsIC8qIEluLWZpbGUgcG9zaXRpb24gKi8KLQkJCQlpbnQgbnVtX3BhZ2VzLCAvKiBOdW1iZXIgb2YgcGFnZXMgYWZmZWN0ZWQgKi8KLQkJCQlpbnQgd3JpdGVfYnl0ZXMsIC8qIEFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLwotCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMsIC8qIHBvaW50ZXIgdG8gCi0JCQkJCQkJCSBhcnJheSB0bwotCQkJCQkJCQkgcHJlcGFyZWQgcGFnZXMKLQkJCQkJCQkJKi8KLQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmIC8qIFBvaW50ZXIgdG8gdXNlci1zdXBwbGllZAotCQkJCQkJICAgZGF0YSovCi0JCQkJKQorc3RhdGljIGludCByZWlzZXJmc19jb3B5X2Zyb21fdXNlcl90b19maWxlX3JlZ2lvbihsb2ZmX3QgcG9zLAkvKiBJbi1maWxlIHBvc2l0aW9uICovCisJCQkJCQkgIGludCBudW1fcGFnZXMsCS8qIE51bWJlciBvZiBwYWdlcyBhZmZlY3RlZCAqLworCQkJCQkJICBpbnQgd3JpdGVfYnl0ZXMsCS8qIEFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworCQkJCQkJICBzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLAkvKiBwb2ludGVyIHRvIAorCQkJCQkJCQkJCSAgIGFycmF5IHRvCisJCQkJCQkJCQkJICAgcHJlcGFyZWQgcGFnZXMKKwkJCQkJCQkJCQkgKi8KKwkJCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKiBidWYJLyogUG9pbnRlciB0byB1c2VyLXN1cHBsaWVkCisJCQkJCQkJCQkJICAgZGF0YSAqLworICAgICkKIHsKLSAgICBsb25nIHBhZ2VfZmF1bHQ9MDsgLy8gc3RhdHVzIG9mIGNvcHlfZnJvbV91c2VyLgotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIuCi0gICAgaW50IG9mZnNldDsgLy8gb2Zmc2V0IGluIHBhZ2UKKwlsb25nIHBhZ2VfZmF1bHQgPSAwOwkvLyBzdGF0dXMgb2YgY29weV9mcm9tX3VzZXIuCisJaW50IGk7CQkJLy8gbG9vcCBjb3VudGVyLgorCWludCBvZmZzZXQ7CQkvLyBvZmZzZXQgaW4gcGFnZQogCi0gICAgZm9yICggaSA9IDAsIG9mZnNldCA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKTsgaSA8IG51bV9wYWdlcyA7IGkrKyxvZmZzZXQ9MCkgewotCXNpemVfdCBjb3VudCA9IG1pbl90KHNpemVfdCxQQUdFX0NBQ0hFX1NJWkUtb2Zmc2V0LHdyaXRlX2J5dGVzKTsgLy8gSG93IG11Y2ggb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhpcyBwYWdlCi0Jc3RydWN0IHBhZ2UgKnBhZ2U9cHJlcGFyZWRfcGFnZXNbaV07IC8vIEN1cnJlbnQgcGFnZSB3ZSBwcm9jZXNzLgorCWZvciAoaSA9IDAsIG9mZnNldCA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOyBpIDwgbnVtX3BhZ2VzOworCSAgICAgaSsrLCBvZmZzZXQgPSAwKSB7CisJCXNpemVfdCBjb3VudCA9IG1pbl90KHNpemVfdCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0LCB3cml0ZV9ieXRlcyk7CS8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQorCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHByZXBhcmVkX3BhZ2VzW2ldOwkvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KIAotCWZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKCBidWYsIGNvdW50KTsKKwkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBjb3VudCk7CiAKLQkvKiBDb3B5IGRhdGEgZnJvbSB1c2Vyc3BhY2UgdG8gdGhlIGN1cnJlbnQgcGFnZSAqLwotCWttYXAocGFnZSk7Ci0JcGFnZV9mYXVsdCA9IF9fY29weV9mcm9tX3VzZXIocGFnZV9hZGRyZXNzKHBhZ2UpK29mZnNldCwgYnVmLCBjb3VudCk7IC8vIENvcHkgdGhlIGRhdGEuCi0JLyogRmx1c2ggcHJvY2Vzc29yJ3MgZGNhY2hlIGZvciB0aGlzIHBhZ2UgKi8KLQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKLQlrdW5tYXAocGFnZSk7Ci0JYnVmKz1jb3VudDsKLQl3cml0ZV9ieXRlcy09Y291bnQ7CisJCS8qIENvcHkgZGF0YSBmcm9tIHVzZXJzcGFjZSB0byB0aGUgY3VycmVudCBwYWdlICovCisJCWttYXAocGFnZSk7CisJCXBhZ2VfZmF1bHQgPSBfX2NvcHlfZnJvbV91c2VyKHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldCwgYnVmLCBjb3VudCk7CS8vIENvcHkgdGhlIGRhdGEuCisJCS8qIEZsdXNoIHByb2Nlc3NvcidzIGRjYWNoZSBmb3IgdGhpcyBwYWdlICovCisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXAocGFnZSk7CisJCWJ1ZiArPSBjb3VudDsKKwkJd3JpdGVfYnl0ZXMgLT0gY291bnQ7CiAKLQlpZiAocGFnZV9mYXVsdCkKLQkgICAgYnJlYWs7IC8vIFdhcyB0aGVyZSBhIGZhdWx0PyBhYm9ydC4KLSAgICB9CisJCWlmIChwYWdlX2ZhdWx0KQorCQkJYnJlYWs7CS8vIFdhcyB0aGVyZSBhIGZhdWx0PyBhYm9ydC4KKwl9CiAKLSAgICByZXR1cm4gcGFnZV9mYXVsdD8tRUZBVUxUOjA7CisJcmV0dXJuIHBhZ2VfZmF1bHQgPyAtRUZBVUxUIDogMDsKIH0KIAogLyogdGFrZW4gZnMvYnVmZmVyLmM6X19ibG9ja19jb21taXRfd3JpdGUgKi8KIGludCByZWlzZXJmc19jb21taXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCisJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7Ci0gICAgdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKLSAgICBpbnQgcGFydGlhbCA9IDA7Ci0gICAgdW5zaWduZWQgYmxvY2tzaXplOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOwotICAgIHVuc2lnbmVkIGxvbmcgaV9zaXplX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotICAgIGludCBuZXc7Ci0gICAgaW50IGxvZ2l0ID0gcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSk7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7Ci0gICAgaW50IGJoX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gcy0+c19ibG9ja3NpemU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCWludCBwYXJ0aWFsID0gMDsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisJdW5zaWduZWQgbG9uZyBpX3NpemVfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IG5ldzsKKwlpbnQgbG9naXQgPSByZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKKwlpbnQgYmhfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQgPSAwOwogCi0gICAgdGgudF90cmFuc19pZCA9IDA7Ci0gICAgYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCXRoLnRfdHJhbnNfaWQgPSAwOworCWJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKIAotICAgIGlmIChsb2dpdCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7Ci0JcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7Ci0JaWYgKHJldCkKLQkgICAgZ290byBkcm9wX3dyaXRlX2xvY2s7Ci0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKLSAgICB9Ci0gICAgZm9yKGJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSwgYmxvY2tfc3RhcnQgPSAwOwotICAgICAgICBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKLQlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKQotICAgIHsKLQotCW5ldyA9IGJ1ZmZlcl9uZXcoYmgpOwotCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOwotCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOwotCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgewotCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0JCSAgICBwYXJ0aWFsID0gMTsKLQl9IGVsc2UgewotCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkgICAgaWYgKGxvZ2l0KSB7Ci0JCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOwotCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7Ci0JICAgIH0gZWxzZSBpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKLQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCQkvKiBkbyBkYXRhPW9yZGVyZWQgb24gYW55IHBhZ2UgcGFzdCB0aGUgZW5kCi0JCSAqIG9mIGZpbGUgYW5kIGFueSBidWZmZXIgbWFya2VkIEJIX05ldy4KLQkJICovCi0JCWlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpICYmCi0JCSAgICAobmV3IHx8IHBhZ2UtPmluZGV4ID49IGlfc2l6ZV9pbmRleCkpIHsKLQkJICAgIHJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoKTsKLQkgICAgICAgIH0KLQkgICAgfQorCWlmIChsb2dpdCkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOworCQlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZHJvcF93cml0ZV9sb2NrOworCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwogCX0KLSAgICB9Ci0gICAgaWYgKGxvZ2l0KSB7Ci0JcmV0ID0gam91cm5hbF9lbmQoJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOwotZHJvcF93cml0ZV9sb2NrOgotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCi0gICAgICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIHJlYWRwYWdlKCkgZm9yCi0gICAgICogdGhlIG5leHQgcmVhZCgpLiBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50Ci0gICAgICogdXB0b2RhdGUgYXMgYSByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCi0gICAgICovCi0gICAgaWYgKCFwYXJ0aWFsKQotCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLSAgICByZXR1cm4gcmV0OwotfQorCWZvciAoYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpLCBibG9ja19zdGFydCA9IDA7CisJICAgICBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewogCisJCW5ldyA9IGJ1ZmZlcl9uZXcoYmgpOworCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXBhcnRpYWwgPSAxOworCQl9IGVsc2UgeworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQlpZiAobG9naXQpIHsKKwkJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKKwkJCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7CisJCQl9IGVsc2UgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCS8qIGRvIGRhdGE9b3JkZXJlZCBvbiBhbnkgcGFnZSBwYXN0IHRoZSBlbmQKKwkJCQkgKiBvZiBmaWxlIGFuZCBhbnkgYnVmZmVyIG1hcmtlZCBCSF9OZXcuCisJCQkJICovCisJCQkJaWYgKHJlaXNlcmZzX2RhdGFfb3JkZXJlZChpbm9kZS0+aV9zYikgJiYKKwkJCQkgICAgKG5ldyB8fCBwYWdlLT5pbmRleCA+PSBpX3NpemVfaW5kZXgpKSB7CisJCQkJCXJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKGxvZ2l0KSB7CisJCXJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkgICAgICBkcm9wX3dyaXRlX2xvY2s6CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwl9CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCisJICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIHJlYWRwYWdlKCkgZm9yCisJICogdGhlIG5leHQgcmVhZCgpLiBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50CisJICogdXB0b2RhdGUgYXMgYSByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCisJICovCisJaWYgKCFwYXJ0aWFsKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJcmV0dXJuIHJldDsKK30KIAogLyogU3VibWl0IHBhZ2VzIGZvciB3cml0ZS4gVGhpcyB3YXMgc2VwYXJhdGVkIGZyb20gYWN0dWFsIGZpbGUgY29weWluZwogICAgYmVjYXVzZSB3ZSBtaWdodCB3YW50IHRvIGFsbG9jYXRlIGJsb2NrIG51bWJlcnMgaW4tYmV0d2Vlbi4KICAgIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGNhbGxlciB3aWxsIGFkanVzdCBmaWxlIHNpemUgdG8gY29ycmVjdCB2YWx1ZS4gKi8KLXN0YXRpYyBpbnQgcmVpc2VyZnNfc3VibWl0X2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgKLQkJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCWxvZmZfdCBwb3MsIC8qIFdyaXRpbmcgcG9zaXRpb24gb2Zmc2V0ICovCi0JCQkJc2l6ZV90IG51bV9wYWdlcywgLyogTnVtYmVyIG9mIHBhZ2VzIHRvIHdyaXRlICovCi0JCQkJc2l6ZV90IHdyaXRlX2J5dGVzLCAvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KLQkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzIC8qIGxpc3Qgb2YgcGFnZXMgKi8KLQkJCQkpCitzdGF0aWMgaW50IHJlaXNlcmZzX3N1Ym1pdF9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsCS8qIFdyaXRpbmcgcG9zaXRpb24gb2Zmc2V0ICovCisJCQkJCQkgc2l6ZV90IG51bV9wYWdlcywJLyogTnVtYmVyIG9mIHBhZ2VzIHRvIHdyaXRlICovCisJCQkJCQkgc2l6ZV90IHdyaXRlX2J5dGVzLAkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQkJCSBzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzCS8qIGxpc3Qgb2YgcGFnZXMgKi8KKyAgICApCiB7Ci0gICAgaW50IHN0YXR1czsgLy8gcmV0dXJuIHN0YXR1cyBvZiBibG9ja19jb21taXRfd3JpdGUuCi0gICAgaW50IHJldHZhbCA9IDA7IC8vIFJldHVybiB2YWx1ZSB3ZSBhcmUgZ29pbmcgdG8gcmV0dXJuLgotICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIKLSAgICBpbnQgb2Zmc2V0OyAvLyBXcml0aW5nIG9mZnNldCBpbiBwYWdlLgotICAgIGludCBvcmlnX3dyaXRlX2J5dGVzID0gd3JpdGVfYnl0ZXM7Ci0gICAgaW50IHNkX3VwZGF0ZSA9IDA7CisJaW50IHN0YXR1czsJCS8vIHJldHVybiBzdGF0dXMgb2YgYmxvY2tfY29tbWl0X3dyaXRlLgorCWludCByZXR2YWwgPSAwOwkJLy8gUmV0dXJuIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZXR1cm4uCisJaW50IGk7CQkJLy8gbG9vcCBjb3VudGVyCisJaW50IG9mZnNldDsJCS8vIFdyaXRpbmcgb2Zmc2V0IGluIHBhZ2UuCisJaW50IG9yaWdfd3JpdGVfYnl0ZXMgPSB3cml0ZV9ieXRlczsKKwlpbnQgc2RfdXBkYXRlID0gMDsKIAotICAgIGZvciAoIGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IGkgPCBudW1fcGFnZXMgOyBpKyssb2Zmc2V0PTApIHsKLQlpbnQgY291bnQgPSBtaW5fdChpbnQsUEFHRV9DQUNIRV9TSVpFLW9mZnNldCx3cml0ZV9ieXRlcyk7IC8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KKwlmb3IgKGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgaSA8IG51bV9wYWdlczsKKwkgICAgIGkrKywgb2Zmc2V0ID0gMCkgeworCQlpbnQgY291bnQgPSBtaW5fdChpbnQsIFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldCwgd3JpdGVfYnl0ZXMpOwkvLyBIb3cgbXVjaCBvZiBieXRlcyB0byB3cml0ZSB0byB0aGlzIHBhZ2UKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsJLy8gQ3VycmVudCBwYWdlIHdlIHByb2Nlc3MuCiAKLQlzdGF0dXMgPSByZWlzZXJmc19jb21taXRfcGFnZShpbm9kZSwgcGFnZSwgb2Zmc2V0LCBvZmZzZXQrY291bnQpOwotCWlmICggc3RhdHVzICkKLQkgICAgcmV0dmFsID0gc3RhdHVzOyAvLyBUbyBub3Qgb3ZlcmNvbXBsaWNhdGUgbWF0dGVycyBXZSBhcmUgZ29pbmcgdG8KLQkJCSAgICAgLy8gc3VibWl0IGFsbCB0aGUgcGFnZXMgZXZlbiBpZiB0aGVyZSB3YXMgZXJyb3IuCi0JCQkgICAgIC8vIHdlIG9ubHkgcmVtZW1iZXIgZXJyb3Igc3RhdHVzIHRvIHJlcG9ydCBpdCBvbgotCQkJICAgICAvLyBleGl0LgotCXdyaXRlX2J5dGVzLT1jb3VudDsKLSAgICB9Ci0gICAgLyogbm93IHRoYXQgd2UndmUgZ290dGVuIGFsbCB0aGUgb3JkZXJlZCBidWZmZXJzIG1hcmtlZCBkaXJ0eSwKLSAgICAgKiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSBpX3NpemUgYW5kIGNsb3NlIGFueSBydW5uaW5nIHRyYW5zYWN0aW9uCi0gICAgICovCi0gICAgaWYgKCBwb3MgKyBvcmlnX3dyaXRlX2J5dGVzID4gaW5vZGUtPmlfc2l6ZSkgewotCWlub2RlLT5pX3NpemUgPSBwb3MgKyBvcmlnX3dyaXRlX2J5dGVzOyAvLyBTZXQgbmV3IHNpemUKLQkvKiBJZiB0aGUgZmlsZSBoYXZlIGdyb3duIHNvIG11Y2ggdGhhdCB0YWlsIHBhY2tpbmcgaXMgbm8KLQkgKiBsb25nZXIgcG9zc2libGUsIHJlc2V0ICJuZWVkIHRvIHBhY2siIGZsYWcgKi8KLQlpZiAoIChoYXZlX2xhcmdlX3RhaWxzIChpbm9kZS0+aV9zYikgJiYKLQkgICAgICBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKLQkgICAgIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYKLQkgICAgIGlub2RlLT5pX3NpemUgPiBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCi0JICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzayA7Ci0gICAgICAgIGVsc2UgaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmCi0JICAgICAgICAgIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAotCSAgICAgICAgICAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmCi0JCSAgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKLQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9wYWNrX29uX2Nsb3NlX21hc2sgOworCQlzdGF0dXMgPQorCQkgICAgcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0ICsgY291bnQpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dmFsID0gc3RhdHVzOwkvLyBUbyBub3Qgb3ZlcmNvbXBsaWNhdGUgbWF0dGVycyBXZSBhcmUgZ29pbmcgdG8KKwkJLy8gc3VibWl0IGFsbCB0aGUgcGFnZXMgZXZlbiBpZiB0aGVyZSB3YXMgZXJyb3IuCisJCS8vIHdlIG9ubHkgcmVtZW1iZXIgZXJyb3Igc3RhdHVzIHRvIHJlcG9ydCBpdCBvbgorCQkvLyBleGl0LgorCQl3cml0ZV9ieXRlcyAtPSBjb3VudDsKKwl9CisJLyogbm93IHRoYXQgd2UndmUgZ290dGVuIGFsbCB0aGUgb3JkZXJlZCBidWZmZXJzIG1hcmtlZCBkaXJ0eSwKKwkgKiB3ZSBjYW4gc2FmZWx5IHVwZGF0ZSBpX3NpemUgYW5kIGNsb3NlIGFueSBydW5uaW5nIHRyYW5zYWN0aW9uCisJICovCisJaWYgKHBvcyArIG9yaWdfd3JpdGVfYnl0ZXMgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlub2RlLT5pX3NpemUgPSBwb3MgKyBvcmlnX3dyaXRlX2J5dGVzOwkvLyBTZXQgbmV3IHNpemUKKwkJLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBzbyBtdWNoIHRoYXQgdGFpbCBwYWNraW5nIGlzIG5vCisJCSAqIGxvbmdlciBwb3NzaWJsZSwgcmVzZXQgIm5lZWQgdG8gcGFjayIgZmxhZyAqLworCQlpZiAoKGhhdmVfbGFyZ2VfdGFpbHMoaW5vZGUtPmlfc2IpICYmCisJCSAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KSB8fAorCQkgICAgKGhhdmVfc21hbGxfdGFpbHMoaW5vZGUtPmlfc2IpICYmCisJCSAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkpKQorCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOworCQllbHNlIGlmICgoaGF2ZV9sYXJnZV90YWlscyhpbm9kZS0+aV9zYikgJiYKKwkJCSAgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KSB8fAorCQkJIChoYXZlX3NtYWxsX3RhaWxzKGlub2RlLT5pX3NiKSAmJgorCQkJICBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplKGlub2RlKSkpCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3BhY2tfb25fY2xvc2VfbWFzazsKIAorCQlpZiAodGgtPnRfdHJhbnNfaWQpIHsKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CS8vIEFuZCB1cGRhdGUgb24tZGlzayBtZXRhZGF0YQorCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJfSBlbHNlCisJCQlpbm9kZS0+aV9zYi0+c19vcC0+ZGlydHlfaW5vZGUoaW5vZGUpOworCisJCXNkX3VwZGF0ZSA9IDE7CisJfQogCWlmICh0aC0+dF90cmFuc19pZCkgewotCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7IC8vIEFuZCB1cGRhdGUgb24tZGlzayBtZXRhZGF0YQotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCX0gZWxzZQotCSAgICBpbm9kZS0+aV9zYi0+c19vcC0+ZGlydHlfaW5vZGUoaW5vZGUpOworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKCFzZF91cGRhdGUpCisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJc3RhdHVzID0gam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHZhbCA9IHN0YXR1czsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisJdGgtPnRfdHJhbnNfaWQgPSAwOwogCi0gICAgICAgIHNkX3VwZGF0ZSA9IDE7Ci0gICAgfQotICAgIGlmICh0aC0+dF90cmFuc19pZCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICghc2RfdXBkYXRlKQotCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKLQlzdGF0dXMgPSBqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOwotICAgICAgICBpZiAoc3RhdHVzKQotICAgICAgICAgICAgcmV0dmFsID0gc3RhdHVzOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotICAgIHRoLT50X3RyYW5zX2lkID0gMDsKLQotICAgIC8qIAotICAgICAqIHdlIGhhdmUgdG8gdW5sb2NrIHRoZSBwYWdlcyBhZnRlciB1cGRhdGluZyBpX3NpemUsIG90aGVyd2lzZQotICAgICAqIHdlIHJhY2Ugd2l0aCB3cml0ZXBhZ2UKLSAgICAgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlcyA7IGkrKykgewotCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOwotCXVubG9ja19wYWdlKHBhZ2UpOyAKLQltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7Ci0JcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOworCS8qIAorCSAqIHdlIGhhdmUgdG8gdW5sb2NrIHRoZSBwYWdlcyBhZnRlciB1cGRhdGluZyBpX3NpemUsIG90aGVyd2lzZQorCSAqIHdlIHJhY2Ugd2l0aCB3cml0ZXBhZ2UKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwcmVwYXJlZF9wYWdlc1tpXTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKiBMb29rIGlmIHBhc3NlZCB3cml0aW5nIHJlZ2lvbiBpcyBnb2luZyB0byB0b3VjaCBmaWxlJ3MgdGFpbAogICAgKGlmIGl0IGlzIHByZXNlbnQpLiBBbmQgaWYgaXQgaXMsIGNvbnZlcnQgdGhlIHRhaWwgdG8gdW5mb3JtYXR0ZWQgbm9kZSAqLwotc3RhdGljIGludCByZWlzZXJmc19jaGVja19mb3JfdGFpbF9hbmRfY29udmVydCggc3RydWN0IGlub2RlICppbm9kZSwgLyogaW5vZGUgdG8gZGVhbCB3aXRoICovCi0JCQkJCSBsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uICovCi0JCQkJCSBpbnQgd3JpdGVfYnl0ZXMgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCi0JCQkJICAgICAgICApCitzdGF0aWMgaW50IHJlaXNlcmZzX2NoZWNrX2Zvcl90YWlsX2FuZF9jb252ZXJ0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIGlub2RlIHRvIGRlYWwgd2l0aCAqLworCQkJCQkgICAgICAgbG9mZl90IHBvcywJLyogV3JpdGluZyBwb3NpdGlvbiAqLworCQkJCQkgICAgICAgaW50IHdyaXRlX2J5dGVzCS8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSAqLworICAgICkKIHsKLSAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7IC8vIG5lZWRlZCBmb3Igc2VhcmNoX2Zvcl9wb3NpdGlvbgotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsgLy8gS2V5IHRoYXQgd291bGQgcmVwcmVzZW50IGxhc3QgdG91Y2hlZCB3cml0aW5nIGJ5dGUuCi0gICAgc3RydWN0IGl0ZW1faGVhZCAqaWg7IC8vIGl0ZW0gaGVhZGVyIG9mIGZvdW5kIGJsb2NrOwotICAgIGludCByZXM7IC8vIFJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB3ZSBjYWxsLgotICAgIGludCBjb250X2V4cGFuZF9vZmZzZXQ7IC8vIFdlIHdpbGwgcHV0IG9mZnNldCBmb3IgZ2VuZXJpY19jb250X2V4cGFuZCBoZXJlCi0JCQkgICAgLy8gVGhpcyBjYW4gYmUgaW50IGp1c3QgYmVjYXVzZSB0YWlscyBhcmUgY3JlYXRlZAotCQkJICAgIC8vIG9ubHkgZm9yIHNtYWxsIGZpbGVzLgotIAorCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsJLy8gbmVlZGVkIGZvciBzZWFyY2hfZm9yX3Bvc2l0aW9uCisJc3RydWN0IGNwdV9rZXkga2V5OwkvLyBLZXkgdGhhdCB3b3VsZCByZXByZXNlbnQgbGFzdCB0b3VjaGVkIHdyaXRpbmcgYnl0ZS4KKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsJLy8gaXRlbSBoZWFkZXIgb2YgZm91bmQgYmxvY2s7CisJaW50IHJlczsJCS8vIFJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB3ZSBjYWxsLgorCWludCBjb250X2V4cGFuZF9vZmZzZXQ7CS8vIFdlIHdpbGwgcHV0IG9mZnNldCBmb3IgZ2VuZXJpY19jb250X2V4cGFuZCBoZXJlCisJLy8gVGhpcyBjYW4gYmUgaW50IGp1c3QgYmVjYXVzZSB0YWlscyBhcmUgY3JlYXRlZAorCS8vIG9ubHkgZm9yIHNtYWxsIGZpbGVzLgorCiAvKiB0aGlzIGVtYm9kaWVzIGEgZGVwZW5kZW5jeSBvbiBhIHBhcnRpY3VsYXIgdGFpbCBwb2xpY3kgKi8KLSAgICBpZiAoIGlub2RlLT5pX3NpemUgPj0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKjQgKSB7Ci0JLyogc3VjaCBhIGJpZyBmaWxlcyBkbyBub3QgaGF2ZSB0YWlscywgc28gd2Ugd29uJ3QgYm90aGVyIG91cnNlbHZlcwotCSAgIHRvIGxvb2sgZm9yIHRhaWxzLCBzaW1wbHkgcmV0dXJuICovCi0JcmV0dXJuIDA7Ci0gICAgfQorCWlmIChpbm9kZS0+aV9zaXplID49IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAqIDQpIHsKKwkJLyogc3VjaCBhIGJpZyBmaWxlcyBkbyBub3QgaGF2ZSB0YWlscywgc28gd2Ugd29uJ3QgYm90aGVyIG91cnNlbHZlcworCQkgICB0byBsb29rIGZvciB0YWlscywgc2ltcGx5IHJldHVybiAqLworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICAvKiBmaW5kIHRoZSBpdGVtIGNvbnRhaW5pbmcgdGhlIGxhc3QgYnl0ZSB0byBiZSB3cml0dGVuLCBvciBpZgotICAgICAqIHdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoZW4gdGhlIGxhc3QgaXRlbSBvZiB0aGUKLSAgICAgKiBmaWxlIChhbmQgdGhlbiB3ZSBjaGVjayBpdHMgdHlwZSkuICovCi0gICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgcG9zK3dyaXRlX2J5dGVzKzEsIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOwotICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0gICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIGloID0gZ2V0X2loKCZwYXRoKTsKLSAgICByZXMgPSAwOwotICAgIGlmICggaXNfZGlyZWN0X2xlX2loKGloKSApIHsKLQkvKiBPaywgY2xvc2VzdCBpdGVtIGlzIGZpbGUgdGFpbCAodGFpbHMgYXJlIHN0b3JlZCBpbiAiZGlyZWN0IgotCSAqIGl0ZW1zKSwgc28gd2UgbmVlZCB0byB1bnBhY2sgaXQuICovCi0JLyogVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMsIHdlIGp1c3QgY2FsbCBnZW5lcmljX2NvbnRfZXhwYW5kCi0JICAgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgb3RoZXIgc3R1ZmYgYW5kIGZpbmFsbHkgd2lsbCBib2lsIGRvd24gdG8KLQkgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrKCkgdGhhdCB3b3VsZCBkbyBuZWNlc3NhcnkgY29udmVyc2lvbi4gKi8KLQljb250X2V4cGFuZF9vZmZzZXQgPSBsZV9rZXlfa19vZmZzZXQoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKTsKLQlwYXRocmVsc2UoJnBhdGgpOwotCXJlcyA9IGdlbmVyaWNfY29udF9leHBhbmQoIGlub2RlLCBjb250X2V4cGFuZF9vZmZzZXQpOwotICAgIH0gZWxzZQotCXBhdGhyZWxzZSgmcGF0aCk7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJLyogZmluZCB0aGUgaXRlbSBjb250YWluaW5nIHRoZSBsYXN0IGJ5dGUgdG8gYmUgd3JpdHRlbiwgb3IgaWYKKwkgKiB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSB0aGVuIHRoZSBsYXN0IGl0ZW0gb2YgdGhlCisJICogZmlsZSAoYW5kIHRoZW4gd2UgY2hlY2sgaXRzIHR5cGUpLiAqLworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgcG9zICsgd3JpdGVfYnl0ZXMgKyAxLCBUWVBFX0FOWSwKKwkJICAgICAzIC8qa2V5IGxlbmd0aCAqLyApOworCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJlcyA9PSBJT19FUlJPUikgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWggPSBnZXRfaWgoJnBhdGgpOworCXJlcyA9IDA7CisJaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKKwkJLyogT2ssIGNsb3Nlc3QgaXRlbSBpcyBmaWxlIHRhaWwgKHRhaWxzIGFyZSBzdG9yZWQgaW4gImRpcmVjdCIKKwkJICogaXRlbXMpLCBzbyB3ZSBuZWVkIHRvIHVucGFjayBpdC4gKi8KKwkJLyogVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMsIHdlIGp1c3QgY2FsbCBnZW5lcmljX2NvbnRfZXhwYW5kCisJCSAgIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIG90aGVyIHN0dWZmIGFuZCBmaW5hbGx5IHdpbGwgYm9pbCBkb3duIHRvCisJCSAgIHJlaXNlcmZzX2dldF9ibG9jaygpIHRoYXQgd291bGQgZG8gbmVjZXNzYXJ5IGNvbnZlcnNpb24uICovCisJCWNvbnRfZXhwYW5kX29mZnNldCA9CisJCSAgICBsZV9rZXlfa19vZmZzZXQoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAorCQkJCSAgICAmKGloLT5paF9rZXkpKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmVzID0gZ2VuZXJpY19jb250X2V4cGFuZChpbm9kZSwgY29udF9leHBhbmRfb2Zmc2V0KTsKKwl9IGVsc2UKKwkJcGF0aHJlbHNlKCZwYXRoKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJlczsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXM7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gbG9ja3MgcGFnZXMgc3RhcnRpbmcgZnJvbSBAcG9zIGZvciBAaW5vZGUuCkBAIC04NTEsMjc1ICs5NDcsMjk2IEBACiAgICBhcHBlbmQpLCBpdCBpcyB6ZXJvZWQsIHRoZW4uIAogICAgUmV0dXJucyBudW1iZXIgb2YgdW5hbGxvY2F0ZWQgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCB0byBjb3ZlcgogICAgbmV3IGZpbGUgZGF0YS4qLwotc3RhdGljIGludCByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSgKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlIC8qIElub2RlIG9mIHRoZSBmaWxlICovLAotCQkJCWxvZmZfdCBwb3MsIC8qIHBvc2l0aW9uIGluIHRoZSBmaWxlICovCi0JCQkJc2l6ZV90IG51bV9wYWdlcywgLyogbnVtYmVyIG9mIHBhZ2VzIHRvCi0JCQkJCSAgICAgICAgICBwcmVwYXJlICovCi0JCQkJc2l6ZV90IHdyaXRlX2J5dGVzLCAvKiBBbW91bnQgb2YgYnl0ZXMgdG8gYmUKLQkJCQkJCSAgICBvdmVyd3JpdHRlbiBmcm9tCi0JCQkJCQkgICAgQHBvcyAqLwotCQkJCXN0cnVjdCBwYWdlICoqcHJlcGFyZWRfcGFnZXMgLyogcG9pbnRlciB0byBhcnJheQotCQkJCQkJCSAgICAgICB3aGVyZSB0byBzdG9yZQotCQkJCQkJCSAgICAgICBwcmVwYXJlZCBwYWdlcyAqLwotCQkJCQkgICApCitzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUKKwkJCQkJCSAgLyogSW5vZGUgb2YgdGhlIGZpbGUgKi8gLAorCQkJCQkJICBsb2ZmX3QgcG9zLAkvKiBwb3NpdGlvbiBpbiB0aGUgZmlsZSAqLworCQkJCQkJICBzaXplX3QgbnVtX3BhZ2VzLAkvKiBudW1iZXIgb2YgcGFnZXMgdG8KKwkJCQkJCQkJCSAgIHByZXBhcmUgKi8KKwkJCQkJCSAgc2l6ZV90IHdyaXRlX2J5dGVzLAkvKiBBbW91bnQgb2YgYnl0ZXMgdG8gYmUKKwkJCQkJCQkJCSAgIG92ZXJ3cml0dGVuIGZyb20KKwkJCQkJCQkJCSAgIEBwb3MgKi8KKwkJCQkJCSAgc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcwkvKiBwb2ludGVyIHRvIGFycmF5CisJCQkJCQkJCQkJICAgd2hlcmUgdG8gc3RvcmUKKwkJCQkJCQkJCQkgICBwcmVwYXJlZCBwYWdlcyAqLworICAgICkKIHsKLSAgICBpbnQgcmVzPTA7IC8vIFJldHVybiB2YWx1ZXMgb2YgZGlmZmVyZW50IGZ1bmN0aW9ucyB3ZSBjYWxsLgotICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsgLy8gT2Zmc2V0IGluIGZpbGUgaW4gcGFnZXMuCi0gICAgaW50IGZyb20gPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgLy8gV3JpdGluZyBvZmZzZXQgaW4gZmlyc3QgcGFnZQotICAgIGludCB0byA9ICgocG9zICsgd3JpdGVfYnl0ZXMgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOwotCQkJCQkgLyogb2Zmc2V0IG9mIGxhc3QgbW9kaWZpZWQgYnl0ZSBpbiBsYXN0Ci0JCQkJICAgICAgICAgICAgcGFnZSAqLwotICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsgLy8gUGFnZXMgYXJlIG1hcHBlZCBoZXJlLgotICAgIGludCBpOyAvLyBTaW1wbGUgY291bnRlcgotICAgIGludCBibG9ja3MgPSAwOyAvKiBSZXR1cm4gdmFsdWUgKGJsb2NrcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQpICovCi0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7IC8vIEN1cnJlbnQgYnVmZmVyaGVhZCBhbmQgZmlyc3QgYnVmZmVyaGVhZAotCQkJCSAgIC8vIG9mIGEgcGFnZS4KLSAgICB1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOyAvLyBTdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldHMgb2YgY3VycmVudAotCQkJCSAgICAgLy8gYnVmZmVyIGluIHRoZSBwYWdlLgotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqd2FpdFsyXSwgKip3YWl0X2JoPXdhaXQ7IC8vIEJ1ZmZlcnMgZm9yIHBhZ2UsIGlmCi0JCQkJCQkgLy8gUGFnZSBhcHBlYXJlZCB0byBiZSBub3QgdXAKLQkJCQkJCSAvLyB0byBkYXRlLiBOb3RlIGhvdyB3ZSBoYXZlCi0JCQkJCQkgLy8gYXQgbW9zdCAyIGJ1ZmZlcnMsIHRoaXMgaXMKLQkJCQkJCSAvLyBiZWNhdXNlIHdlIGF0IG1vc3QgbWF5Ci0JCQkJCQkgLy8gcGFydGlhbGx5IG92ZXJ3cml0ZSB0d28KLQkJCQkJCSAvLyBidWZmZXJzIGZvciBvbmUgcGFnZS4gT25lIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiZWdpbm5pbmcgb2Ygd3JpdGUgYXJlYQotCQkJCQkJIC8vIGFuZCBvbmUgYXQgdGhlIGVuZC4KLQkJCQkJCSAvLyBFdmVyeXRoaW5nIGludGhlIG1pZGRsZSBnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0dGVuIHRvdGFsbHkuCisJaW50IHJlcyA9IDA7CQkvLyBSZXR1cm4gdmFsdWVzIG9mIGRpZmZlcmVudCBmdW5jdGlvbnMgd2UgY2FsbC4KKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CS8vIE9mZnNldCBpbiBmaWxlIGluIHBhZ2VzLgorCWludCBmcm9tID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CS8vIFdyaXRpbmcgb2Zmc2V0IGluIGZpcnN0IHBhZ2UKKwlpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsKKwkvKiBvZmZzZXQgb2YgbGFzdCBtb2RpZmllZCBieXRlIGluIGxhc3QKKwkgICBwYWdlICovCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwkvLyBQYWdlcyBhcmUgbWFwcGVkIGhlcmUuCisJaW50IGk7CQkJLy8gU2ltcGxlIGNvdW50ZXIKKwlpbnQgYmxvY2tzID0gMDsJCS8qIFJldHVybiB2YWx1ZSAoYmxvY2tzIHRoYXQgc2hvdWxkIGJlIGFsbG9jYXRlZCkgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsJLy8gQ3VycmVudCBidWZmZXJoZWFkIGFuZCBmaXJzdCBidWZmZXJoZWFkCisJLy8gb2YgYSBwYWdlLgorCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CS8vIFN0YXJ0aW5nIGFuZCBlbmRpbmcgb2Zmc2V0cyBvZiBjdXJyZW50CisJLy8gYnVmZmVyIGluIHRoZSBwYWdlLgorCXN0cnVjdCBidWZmZXJfaGVhZCAqd2FpdFsyXSwgKip3YWl0X2JoID0gd2FpdDsJLy8gQnVmZmVycyBmb3IgcGFnZSwgaWYKKwkvLyBQYWdlIGFwcGVhcmVkIHRvIGJlIG5vdCB1cAorCS8vIHRvIGRhdGUuIE5vdGUgaG93IHdlIGhhdmUKKwkvLyBhdCBtb3N0IDIgYnVmZmVycywgdGhpcyBpcworCS8vIGJlY2F1c2Ugd2UgYXQgbW9zdCBtYXkKKwkvLyBwYXJ0aWFsbHkgb3ZlcndyaXRlIHR3bworCS8vIGJ1ZmZlcnMgZm9yIG9uZSBwYWdlLiBPbmUgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGJlZ2lubmluZyBvZiB3cml0ZSBhcmVhCisJLy8gYW5kIG9uZSBhdCB0aGUgZW5kLgorCS8vIEV2ZXJ5dGhpbmcgaW50aGUgbWlkZGxlIGdldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXR0ZW4gdG90YWxseS4KIAotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsgLy8gY3B1IGtleSBvZiBpdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloID0gTlVMTDsgLy8gcG9pbnRlciB0byBpdGVtIGhlYWQgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppdGVtYnVmPU5VTEw7IC8vIEJ1ZmZlciBoZWFkIHRoYXQgY29udGFpbnMgaXRlbXMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOyAvLyBwYXRoIHRvIGl0ZW0sIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aC4KLSAgICBfX2xlMzIgKiBpdGVtPU5VTEw7IC8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCi0gICAgaW50IGl0ZW1fcG9zPS0xOyAvKiBQb3NpdGlvbiBpbiBpbmRpcmVjdCBpdGVtICovCisJc3RydWN0IGNwdV9rZXkga2V5OwkvLyBjcHUga2V5IG9mIGl0ZW0gdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisJc3RydWN0IGl0ZW1faGVhZCAqaWggPSBOVUxMOwkvLyBwb2ludGVyIHRvIGl0ZW0gaGVhZCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKml0ZW1idWYgPSBOVUxMOwkvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsJLy8gcGF0aCB0byBpdGVtLCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGguCisJX19sZTMyICppdGVtID0gTlVMTDsJLy8gcG9pbnRlciB0byBpdGVtIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKwlpbnQgaXRlbV9wb3MgPSAtMTsJLyogUG9zaXRpb24gaW4gaW5kaXJlY3QgaXRlbSAqLwogCi0KLSAgICBpZiAoIG51bV9wYWdlcyA8IDEgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0JCQkgICJncmVlbi05MDAxOiByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAiCi0JCQkgICJjYWxsZWQgd2l0aCB6ZXJvIG51bWJlciBvZiBwYWdlcyB0byBwcm9jZXNzIik7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci0gICAgfQotCi0gICAgLyogV2UgaGF2ZSAyIGxvb3BzIGZvciBwYWdlcy4gSW4gZmlyc3QgbG9vcCB3ZSBncmFiIGFuZCBsb2NrIHRoZSBwYWdlcywgc28KLSAgICAgICB0aGF0IG5vYm9keSB3b3VsZCB0b3VjaCB0aGVzZSB1bnRpbCB3ZSByZWxlYXNlIHRoZSBwYWdlcy4gVGhlbgotICAgICAgIHdlJ2Qgc3RhcnQgdG8gZGVhbCB3aXRoIG1hcHBpbmcgYnVmZmVycyB0byBibG9ja3MuICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXM7IGkrKykgewotCXByZXBhcmVkX3BhZ2VzW2ldID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4ICsgaSk7IC8vIGxvY2tzIHRoZSBwYWdlCi0JaWYgKCAhcHJlcGFyZWRfcGFnZXNbaV0pIHsKLQkgICAgcmVzID0gLUVOT01FTTsKLQkgICAgZ290byBmYWlsZWRfcGFnZV9ncmFiYmluZzsKLQl9Ci0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKSkKLQkgICAgY3JlYXRlX2VtcHR5X2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbaV0sIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgMCk7Ci0gICAgfQotCi0gICAgLyogTGV0J3MgY291bnQgYW1vdW50IG9mIGJsb2NrcyBmb3IgYSBjYXNlIHdoZXJlIGFsbCB0aGUgYmxvY2tzCi0gICAgICAgb3ZlcndyaXR0ZW4gYXJlIG5ldyAod2Ugd2lsbCBzdWJzdHJhY3QgYWxyZWFkeSBhbGxvY2F0ZWQgYmxvY2tzIGxhdGVyKSovCi0gICAgaWYgKCBudW1fcGFnZXMgPiAyICkKLQkvKiBUaGVzZSBhcmUgZnVsbC1vdmVyd3JpdHRlbiBwYWdlcyBzbyB3ZSBjb3VudCBhbGwgdGhlIGJsb2NrcyBpbgotCSAgIHRoZXNlIHBhZ2VzIGFyZSBjb3VudGVkIGFzIG5lZWRlZCB0byBiZSBhbGxvY2F0ZWQgKi8KLQlibG9ja3MgPSAobnVtX3BhZ2VzIC0gMikgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKTsKLQotICAgIC8qIGNvdW50IGJsb2NrcyBuZWVkZWQgZm9yIGZpcnN0IHBhZ2UgKHBvc3NpYmx5IHBhcnRpYWxseSB3cml0dGVuKSAqLwotICAgIGJsb2NrcyArPSAoKFBBR0VfQ0FDSEVfU0laRSAtIGZyb20pID4+IGlub2RlLT5pX2Jsa2JpdHMpICsKLQkgICAhIShmcm9tICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKSk7IC8qIHJvdW5kdXAgKi8KLQotICAgIC8qIE5vdyB3ZSBhY2NvdW50IGZvciBsYXN0IHBhZ2UuIElmIGxhc3QgcGFnZSA9PSBmaXJzdCBwYWdlICh3ZQotICAgICAgIG92ZXJ3cml0ZSBvbmx5IG9uZSBwYWdlKSwgd2Ugc3Vic3RyYWN0IGFsbCB0aGUgYmxvY2tzIHBhc3QgdGhlCi0gICAgICAgbGFzdCB3cml0aW5nIHBvc2l0aW9uIGluIGEgcGFnZSBvdXQgb2YgYWxyZWFkeSBjYWxjdWxhdGVkIG51bWJlcgotICAgICAgIG9mIGJsb2NrcyAqLwotICAgIGJsb2NrcyArPSAoKG51bV9wYWdlcyA+IDEpIDw8IChQQUdFX0NBQ0hFX1NISUZULWlub2RlLT5pX2Jsa2JpdHMpKSAtCi0JICAgKChQQUdFX0NBQ0hFX1NJWkUgLSB0bykgPj4gaW5vZGUtPmlfYmxrYml0cyk7Ci0JICAgLyogTm90ZSBob3cgd2UgZG8gbm90IHJvdW5kdXAgaGVyZSBzaW5jZSBwYXJ0aWFsIGJsb2NrcyBzdGlsbAotCQkgICBzaG91bGQgYmUgYWxsb2NhdGVkICovCi0KLSAgICAvKiBOb3cgaWYgYWxsIHRoZSB3cml0ZSBhcmVhIGxpZXMgcGFzdCB0aGUgZmlsZSBlbmQsIG5vIHBvaW50IGluCi0gICAgICAgbWFwaW5nIGJsb2Nrcywgc2luY2UgdGhlcmUgaXMgbm9uZSwgc28gd2UganVzdCB6ZXJvIG91dCByZW1haW5pbmcKLSAgICAgICBwYXJ0cyBvZiBmaXJzdCBhbmQgbGFzdCBwYWdlcyBpbiB3cml0ZSBhcmVhIChpZiBuZWVkZWQpICovCi0gICAgaWYgKCAocG9zICYgfigobG9mZl90KVBBR0VfQ0FDSEVfU0laRSAtIDEpKSA+IGlub2RlLT5pX3NpemUgKSB7Ci0JaWYgKCBmcm9tICE9IDAgKSB7LyogRmlyc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCi0JICAgIGNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbMF0sIEtNX1VTRVIwKTsKLQkgICAgbWVtc2V0KGthZGRyLCAwLCBmcm9tKTsKLQkgICAga3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKLQl9Ci0JaWYgKCB0byAhPSBQQUdFX0NBQ0hFX1NJWkUgKSB7IC8qIExhc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCi0JICAgIGNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdLCBLTV9VU0VSMCk7Ci0JICAgIG1lbXNldChrYWRkcit0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOwotCSAgICBrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOworCWlmIChudW1fcGFnZXMgPCAxKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJncmVlbi05MDAxOiByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZSAiCisJCQkJICJjYWxsZWQgd2l0aCB6ZXJvIG51bWJlciBvZiBwYWdlcyB0byBwcm9jZXNzIik7CisJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCS8qIFNpbmNlIGFsbCBibG9ja3MgYXJlIG5ldyAtIHVzZSBhbHJlYWR5IGNhbGN1bGF0ZWQgdmFsdWUgKi8KLQlyZXR1cm4gYmxvY2tzOwotICAgIH0KKwkvKiBXZSBoYXZlIDIgbG9vcHMgZm9yIHBhZ2VzLiBJbiBmaXJzdCBsb29wIHdlIGdyYWIgYW5kIGxvY2sgdGhlIHBhZ2VzLCBzbworCSAgIHRoYXQgbm9ib2R5IHdvdWxkIHRvdWNoIHRoZXNlIHVudGlsIHdlIHJlbGVhc2UgdGhlIHBhZ2VzLiBUaGVuCisJICAgd2UnZCBzdGFydCB0byBkZWFsIHdpdGggbWFwcGluZyBidWZmZXJzIHRvIGJsb2Nrcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJcHJlcGFyZWRfcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXggKyBpKTsJLy8gbG9ja3MgdGhlIHBhZ2UKKwkJaWYgKCFwcmVwYXJlZF9wYWdlc1tpXSkgeworCQkJcmVzID0gLUVOT01FTTsKKwkJCWdvdG8gZmFpbGVkX3BhZ2VfZ3JhYmJpbmc7CisJCX0KKwkJaWYgKCFwYWdlX2hhc19idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKSkKKwkJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldLAorCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgMCk7CisJfQogCi0gICAgLyogV2VsbCwgc2luY2Ugd2Ugd3JpdGUgc29tZXdoZXJlIGludG8gdGhlIG1pZGRsZSBvZiBhIGZpbGUsIHRoZXJlIGlzCi0gICAgICAgcG9zc2liaWxpdHkgd2UgYXJlIHdyaXRpbmcgb3ZlciBzb21lIGFscmVhZHkgYWxsb2NhdGVkIGJsb2Nrcywgc28KLSAgICAgICBsZXQncyBtYXAgdGhlc2UgYmxvY2tzIGFuZCBzdWJzdHJhY3QgbnVtYmVyIG9mIHN1Y2ggYmxvY2tzIG91dCBvZiBibG9ja3MKLSAgICAgICB3ZSBuZWVkIHRvIGFsbG9jYXRlIChjYWxjdWxhdGVkIGFib3ZlKSAqLwotICAgIC8qIE1hc2sgd3JpdGUgcG9zaXRpb24gdG8gc3RhcnQgb24gYmxvY2tzaXplLCB3ZSBkbyBpdCBvdXQgb2YgdGhlCi0gICAgICAgbG9vcCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAqLwotICAgIHBvcyAmPSB+KChsb2ZmX3QpIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwotICAgIC8qIFNldCBjcHUga2V5IHRvIHRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiBhIGZpbGUgKG9uIGxlZnQgYmxvY2sgYm91bmRhcnkpKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLCAxICsgKChwb3MpICYgfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSksIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworCS8qIExldCdzIGNvdW50IGFtb3VudCBvZiBibG9ja3MgZm9yIGEgY2FzZSB3aGVyZSBhbGwgdGhlIGJsb2NrcworCSAgIG92ZXJ3cml0dGVuIGFyZSBuZXcgKHdlIHdpbGwgc3Vic3RyYWN0IGFscmVhZHkgYWxsb2NhdGVkIGJsb2NrcyBsYXRlcikgKi8KKwlpZiAobnVtX3BhZ2VzID4gMikKKwkJLyogVGhlc2UgYXJlIGZ1bGwtb3ZlcndyaXR0ZW4gcGFnZXMgc28gd2UgY291bnQgYWxsIHRoZSBibG9ja3MgaW4KKwkJICAgdGhlc2UgcGFnZXMgYXJlIGNvdW50ZWQgYXMgbmVlZGVkIHRvIGJlIGFsbG9jYXRlZCAqLworCQlibG9ja3MgPQorCQkgICAgKG51bV9wYWdlcyAtIDIpIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsgLy8gV2UgbmVlZCB0aGF0IGZvciBhdCBsZWFzdCBzZWFyY2hfYnlfa2V5KCkKLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlcyA7IGkrKyApIHsgCisJLyogY291bnQgYmxvY2tzIG5lZWRlZCBmb3IgZmlyc3QgcGFnZSAocG9zc2libHkgcGFydGlhbGx5IHdyaXR0ZW4pICovCisJYmxvY2tzICs9ICgoUEFHRV9DQUNIRV9TSVpFIC0gZnJvbSkgPj4gaW5vZGUtPmlfYmxrYml0cykgKyAhIShmcm9tICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsJLyogcm91bmR1cCAqLwogCi0JaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSk7Ci0JLyogRm9yIGVhY2ggYnVmZmVyIGluIHRoZSBwYWdlICovCi0JZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKLQkgICAgYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewotCQlpZiAoIWJoKQotCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKLQkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCi0JCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKLQkJaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSApCi0JCSAgICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0Ki8KLQkJICAgIGNvbnRpbnVlOworCS8qIE5vdyB3ZSBhY2NvdW50IGZvciBsYXN0IHBhZ2UuIElmIGxhc3QgcGFnZSA9PSBmaXJzdCBwYWdlICh3ZQorCSAgIG92ZXJ3cml0ZSBvbmx5IG9uZSBwYWdlKSwgd2Ugc3Vic3RyYWN0IGFsbCB0aGUgYmxvY2tzIHBhc3QgdGhlCisJICAgbGFzdCB3cml0aW5nIHBvc2l0aW9uIGluIGEgcGFnZSBvdXQgb2YgYWxyZWFkeSBjYWxjdWxhdGVkIG51bWJlcgorCSAgIG9mIGJsb2NrcyAqLworCWJsb2NrcyArPSAoKG51bV9wYWdlcyA+IDEpIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpIC0KKwkgICAgKChQQUdFX0NBQ0hFX1NJWkUgLSB0bykgPj4gaW5vZGUtPmlfYmxrYml0cyk7CisJLyogTm90ZSBob3cgd2UgZG8gbm90IHJvdW5kdXAgaGVyZSBzaW5jZSBwYXJ0aWFsIGJsb2NrcyBzdGlsbAorCSAgIHNob3VsZCBiZSBhbGxvY2F0ZWQgKi8KIAotCQlpZiAoaSA9PSBudW1fcGFnZXMgLSAxICYmIGJsb2NrX3N0YXJ0ID49IHRvKSB7Ci0JCSAgICAvKiBJZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIGFib3J0Ci0JCSAgICAgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLwotCQkgICAgYnJlYWs7CisJLyogTm93IGlmIGFsbCB0aGUgd3JpdGUgYXJlYSBsaWVzIHBhc3QgdGhlIGZpbGUgZW5kLCBubyBwb2ludCBpbgorCSAgIG1hcGluZyBibG9ja3MsIHNpbmNlIHRoZXJlIGlzIG5vbmUsIHNvIHdlIGp1c3QgemVybyBvdXQgcmVtYWluaW5nCisJICAgcGFydHMgb2YgZmlyc3QgYW5kIGxhc3QgcGFnZXMgaW4gd3JpdGUgYXJlYSAoaWYgbmVlZGVkKSAqLworCWlmICgocG9zICYgfigobG9mZl90KSBQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlmIChmcm9tICE9IDApIHsJLyogRmlyc3QgcGFnZSBuZWVkcyB0byBiZSBwYXJ0aWFsbHkgemVyb2VkICovCisJCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzWzBdLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIsIDAsIGZyb20pOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl9CisJCWlmICh0byAhPSBQQUdFX0NBQ0hFX1NJWkUpIHsJLyogTGFzdCBwYWdlIG5lZWRzIHRvIGJlIHBhcnRpYWxseSB6ZXJvZWQgKi8KKwkJCWNoYXIgKmthZGRyID0KKwkJCSAgICBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSwKKwkJCQkJS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAkJfQogCi0JCWlmICggYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPTAgKSB7Ci0JCSAgICAvKiBUaGlzIGlzIG9wdGltaXNhdGlvbiBmb3IgYSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBtYXBwZWQKLQkJICAgICAgIGFuZCBoYXZlIGJsb2NrbnVtYmVyIGFzc2lnbmVkLiBJbiBjYXNlIHNpZ25pZmljYW50IGFtb3VudAotCQkgICAgICAgb2Ygc3VjaCBidWZmZXJzIGFyZSBwcmVzZW50LCB3ZSBtYXkgYXZvaWQgc29tZSBhbW91bnQKLQkJICAgICAgIG9mIHNlYXJjaF9ieV9rZXkgY2FsbHMuCi0JCSAgICAgICBQcm9iYWJseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBtb3ZlIHBhcnRzIG9mIHRoaXMgY29kZQotCQkgICAgICAgb3V0IG9mIEJLTCwgYnV0IEkgYWZyYWlkIHRoYXQgd291bGQgb3ZlcmNvbXBsaWNhdGUgY29kZQotCQkgICAgICAgd2l0aG91dCBhbnkgbm90aWNlYWJsZSBiZW5lZml0LgotCQkgICAgKi8KLQkJICAgIGl0ZW1fcG9zKys7Ci0JCSAgICAvKiBVcGRhdGUgdGhlIGtleSAqLwotCQkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCQkgICAgYmxvY2tzLS07IC8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQotCQkJICAgICAgLy8gYWxsb2NhdGVkCi0JCSAgICBjb250aW51ZTsgLy8gR28gdG8gdGhlIG5leHQgYnVmZmVyCi0JCX0KKwkJLyogU2luY2UgYWxsIGJsb2NrcyBhcmUgbmV3IC0gdXNlIGFscmVhZHkgY2FsY3VsYXRlZCB2YWx1ZSAqLworCQlyZXR1cm4gYmxvY2tzOworCX0KIAotCQlpZiAoICFpdGVtYnVmIHx8IC8qIGlmIGZpcnN0IGl0ZXJhdGlvbiAqLwotCQkgICAgIGl0ZW1fcG9zID49IGloX2l0ZW1fbGVuKGloKS9VTkZNX1BfU0laRSkKLQkJCQkJICAgICB7IC8qIG9yIGlmIHdlIHByb2dyZXNzZWQgcGFzdCB0aGUKLQkJCQkJCSAgY3VycmVudCB1bmZvcm1hdHRlZF9pdGVtICovCi0JCQkvKiBUcnkgdG8gZmluZCBuZXh0IGl0ZW0gKi8KLQkJCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7Ci0JCQkvKiBBYm9ydCBpZiBubyBtb3JlIGl0ZW1zICovCi0JCQlpZiAoIHJlcyAhPSBQT1NJVElPTl9GT1VORCApIHsKLQkJCSAgICAvKiBtYWtlIHN1cmUgbGF0ZXIgbG9vcHMgZG9uJ3QgdXNlIHRoaXMgaXRlbSAqLwotCQkJICAgIGl0ZW1idWYgPSBOVUxMOwotCQkJICAgIGl0ZW0gPSBOVUxMOwotCQkJICAgIGJyZWFrOworCS8qIFdlbGwsIHNpbmNlIHdlIHdyaXRlIHNvbWV3aGVyZSBpbnRvIHRoZSBtaWRkbGUgb2YgYSBmaWxlLCB0aGVyZSBpcworCSAgIHBvc3NpYmlsaXR5IHdlIGFyZSB3cml0aW5nIG92ZXIgc29tZSBhbHJlYWR5IGFsbG9jYXRlZCBibG9ja3MsIHNvCisJICAgbGV0J3MgbWFwIHRoZXNlIGJsb2NrcyBhbmQgc3Vic3RyYWN0IG51bWJlciBvZiBzdWNoIGJsb2NrcyBvdXQgb2YgYmxvY2tzCisJICAgd2UgbmVlZCB0byBhbGxvY2F0ZSAoY2FsY3VsYXRlZCBhYm92ZSkgKi8KKwkvKiBNYXNrIHdyaXRlIHBvc2l0aW9uIHRvIHN0YXJ0IG9uIGJsb2Nrc2l6ZSwgd2UgZG8gaXQgb3V0IG9mIHRoZQorCSAgIGxvb3AgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKi8KKwlwb3MgJj0gfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKKwkvKiBTZXQgY3B1IGtleSB0byB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gYSBmaWxlIChvbiBsZWZ0IGJsb2NrIGJvdW5kYXJ5KSAqLworCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwKKwkJICAgICAxICsgKChwb3MpICYgfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSksCisJCSAgICAgVFlQRV9BTlksIDMgLyprZXkgbGVuZ3RoICovICk7CisKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsJLy8gV2UgbmVlZCB0aGF0IGZvciBhdCBsZWFzdCBzZWFyY2hfYnlfa2V5KCkKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKworCQloZWFkID0gcGFnZV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW2ldKTsKKwkJLyogRm9yIGVhY2ggYnVmZmVyIGluIHRoZSBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQlpZiAoaSA9PSAwICYmIGJsb2NrX2VuZCA8PSBmcm9tKQorCQkJCS8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJCQljb250aW51ZTsKKworCQkJaWYgKGkgPT0gbnVtX3BhZ2VzIC0gMSAmJiBibG9ja19zdGFydCA+PSB0bykgeworCQkJCS8qIElmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgYWJvcnQKKwkJCQkgICBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgcGFnZSAqLworCQkJCWJyZWFrOwogCQkJfQogCi0JCQkvKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBpbmRpcmVjdCBpdGVtICovCi0JCQlpdGVtYnVmID0gZ2V0X2xhc3RfYmgoICZwYXRoICk7Ci0JCQlpaCA9IGdldF9paCggJnBhdGggKTsKLQkJCWl0ZW0gPSBnZXRfaXRlbSggJnBhdGggKTsKLQkJCWl0ZW1fcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKKwkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yICE9IDApIHsKKwkJCQkvKiBUaGlzIGlzIG9wdGltaXNhdGlvbiBmb3IgYSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBtYXBwZWQKKwkJCQkgICBhbmQgaGF2ZSBibG9ja251bWJlciBhc3NpZ25lZC4gSW4gY2FzZSBzaWduaWZpY2FudCBhbW91bnQKKwkJCQkgICBvZiBzdWNoIGJ1ZmZlcnMgYXJlIHByZXNlbnQsIHdlIG1heSBhdm9pZCBzb21lIGFtb3VudAorCQkJCSAgIG9mIHNlYXJjaF9ieV9rZXkgY2FsbHMuCisJCQkJICAgUHJvYmFibHkgaXQgd291bGQgYmUgcG9zc2libGUgdG8gbW92ZSBwYXJ0cyBvZiB0aGlzIGNvZGUKKwkJCQkgICBvdXQgb2YgQktMLCBidXQgSSBhZnJhaWQgdGhhdCB3b3VsZCBvdmVyY29tcGxpY2F0ZSBjb2RlCisJCQkJICAgd2l0aG91dCBhbnkgbm90aWNlYWJsZSBiZW5lZml0LgorCQkJCSAqLworCQkJCWl0ZW1fcG9zKys7CisJCQkJLyogVXBkYXRlIHRoZSBrZXkgKi8KKwkJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkJICAgICBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsKKwkJCQkJCSAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJCQlibG9ja3MtLTsJLy8gRGVjcmVhc2UgdGhlIGFtb3VudCBvZiBibG9ja3MgdGhhdCBuZWVkIHRvIGJlCisJCQkJLy8gYWxsb2NhdGVkCisJCQkJY29udGludWU7CS8vIEdvIHRvIHRoZSBuZXh0IGJ1ZmZlcgorCQkJfQogCi0JCQlSRkFMU0UoICFpc19pbmRpcmVjdF9sZV9paCAoaWgpLCAiZ3JlZW4tOTAwMzogaW5kaXJlY3QgaXRlbSBleHBlY3RlZCIpOwotCQl9CisJCQlpZiAoIWl0ZW1idWYgfHwJLyogaWYgZmlyc3QgaXRlcmF0aW9uICovCisJCQkgICAgaXRlbV9wb3MgPj0gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUpIHsJLyogb3IgaWYgd2UgcHJvZ3Jlc3NlZCBwYXN0IHRoZQorCQkJCQkJCQkJCSAgIGN1cnJlbnQgdW5mb3JtYXR0ZWRfaXRlbSAqLworCQkJCS8qIFRyeSB0byBmaW5kIG5leHQgaXRlbSAqLworCQkJCXJlcyA9CisJCQkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLAorCQkJCQkJCSAgICAgICAma2V5LCAmcGF0aCk7CisJCQkJLyogQWJvcnQgaWYgbm8gbW9yZSBpdGVtcyAqLworCQkJCWlmIChyZXMgIT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJCQkJLyogbWFrZSBzdXJlIGxhdGVyIGxvb3BzIGRvbid0IHVzZSB0aGlzIGl0ZW0gKi8KKwkJCQkJaXRlbWJ1ZiA9IE5VTEw7CisJCQkJCWl0ZW0gPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CiAKLQkJLyogU2VlIGlmIHRoZXJlIGlzIHNvbWUgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCi0JCSAgIGF0IHRoYXQgcG9zaXRpb24sIG1hcCB0aGUgYnVmZmVyIHRvIHRoaXMgYmxvY2sgKi8KLQkJaWYgKCBnZXRfYmxvY2tfbnVtKGl0ZW0saXRlbV9wb3MpICkgewotCQkgICAgbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgZ2V0X2Jsb2NrX251bShpdGVtLGl0ZW1fcG9zKSk7Ci0JCSAgICBibG9ja3MtLTsgLy8gRGVjcmVhc2UgdGhlIGFtb3VudCBvZiBibG9ja3MgdGhhdCBuZWVkIHRvIGJlCi0JCQkgICAgICAvLyBhbGxvY2F0ZWQKKwkJCQkvKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBpbmRpcmVjdCBpdGVtICovCisJCQkJaXRlbWJ1ZiA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCQkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJCQlpdGVtX3BvcyA9IHBhdGgucG9zX2luX2l0ZW07CisKKwkJCQlSRkFMU0UoIWlzX2luZGlyZWN0X2xlX2loKGloKSwKKwkJCQkgICAgICAgImdyZWVuLTkwMDM6IGluZGlyZWN0IGl0ZW0gZXhwZWN0ZWQiKTsKKwkJCX0KKworCQkJLyogU2VlIGlmIHRoZXJlIGlzIHNvbWUgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCisJCQkgICBhdCB0aGF0IHBvc2l0aW9uLCBtYXAgdGhlIGJ1ZmZlciB0byB0aGlzIGJsb2NrICovCisJCQlpZiAoZ2V0X2Jsb2NrX251bShpdGVtLCBpdGVtX3BvcykpIHsKKwkJCQltYXBfYmgoYmgsIGlub2RlLT5pX3NiLAorCQkJCSAgICAgICBnZXRfYmxvY2tfbnVtKGl0ZW0sIGl0ZW1fcG9zKSk7CisJCQkJYmxvY2tzLS07CS8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQorCQkJCS8vIGFsbG9jYXRlZAorCQkJfQorCQkJaXRlbV9wb3MrKzsKKwkJCS8qIFVwZGF0ZSB0aGUga2V5ICovCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAJCX0KLQkJaXRlbV9wb3MrKzsKLQkJLyogVXBkYXRlIHRoZSBrZXkgKi8KLQkJc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwogCX0KLSAgICB9Ci0gICAgcGF0aHJlbHNlKCZwYXRoKTsgLy8gRnJlZSB0aGUgcGF0aAotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcGF0aHJlbHNlKCZwYXRoKTsJLy8gRnJlZSB0aGUgcGF0aAorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiAKIAkvKiBOb3cgemVybyBvdXQgdW5tYXBwZW5kIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBwYWdlcyBvZgogCSAgIHdyaXRlIGFyZWEgb3IgaXNzdWUgcmVhZCByZXF1ZXN0cyBpZiBwYWdlIGlzIG1hcHBlZC4gKi8KIAkvKiBGaXJzdCBwYWdlLCBzZWUgaWYgaXQgaXMgbm90IHVwdG9kYXRlICovCi0JaWYgKCAhUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzWzBdKSApIHsKLQkgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1swXSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocHJlcGFyZWRfcGFnZXNbMF0pKSB7CisJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbMF0pOwogCi0JICAgIC8qIEZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCi0JICAgIGZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7Ci0JCWJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKwkJLyogRm9yIGVhY2ggYnVmZmVyIGluIHBhZ2UgKi8KKwkJZm9yIChiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJCSAgICAgYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CiAKLQkJaWYgKCFiaCkKLQkJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwMjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7Ci0JCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLwotCQlibG9ja19lbmQgPSBibG9ja19zdGFydCtpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7Ci0JCWlmICggYmxvY2tfZW5kIDw9IGZyb20gKQotCQkgICAgLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCovCi0JCSAgICBjb250aW51ZTsKLQkJaWYgKCBibG9ja19zdGFydCA8IGZyb20gKSB7IC8qIEFoYSwgb3VyIHBhcnRpYWwgYnVmZmVyICovCi0JCSAgICBpZiAoIGJ1ZmZlcl9tYXBwZWQoYmgpICkgeyAvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KLQkJCQkJCSAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bwotCQkJCQkJICBub3QgbG9vc2UgZGF0YSAqLwotCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKLQkJCSp3YWl0X2JoKys9Ymg7Ci0JCSAgICB9IGVsc2UgeyAvKiBOb3QgbWFwcGVkLCB6ZXJvIGl0ICovCi0JCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzWzBdLCBLTV9VU0VSMCk7Ci0JCQltZW1zZXQoa2FkZHIrYmxvY2tfc3RhcnQsIDAsIGZyb20tYmxvY2tfc3RhcnQpOwotCQkJa3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKLQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQkgICAgfQorCQkJaWYgKCFiaCkKKwkJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkJICAgICAgICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJCS8qIEZpbmQgd2hlcmUgdGhpcyBidWZmZXIgZW5kcyAqLworCQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20pCisJCQkJLyogaWYgdGhpcyBidWZmZXIgaXMgYmVmb3JlIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCAqLworCQkJCWNvbnRpbnVlOworCQkJaWYgKGJsb2NrX3N0YXJ0IDwgZnJvbSkgewkvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLworCQkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSkgewkvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KKwkJCQkJCQkJICAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bworCQkJCQkJCQkgICBub3QgbG9vc2UgZGF0YSAqLworCQkJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJCQkqd2FpdF9iaCsrID0gYmg7CisJCQkJfSBlbHNlIHsJLyogTm90IG1hcHBlZCwgemVybyBpdCAqLworCQkJCQljaGFyICprYWRkciA9CisJCQkJCSAgICBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1swXSwKKwkJCQkJCQlLTV9VU0VSMCk7CisJCQkJCW1lbXNldChrYWRkciArIGJsb2NrX3N0YXJ0LCAwLAorCQkJCQkgICAgICAgZnJvbSAtIGJsb2NrX3N0YXJ0KTsKKwkJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl9CisJCQl9CiAJCX0KLQkgICAgfQogCX0KIAogCS8qIExhc3QgcGFnZSwgc2VlIGlmIGl0IGlzIG5vdCB1cHRvZGF0ZSwgb3IgaWYgdGhlIGxhc3QgcGFnZSBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUuICovCi0JaWYgKCAhUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSkgfHwgCi0JICAgICgocG9zK3dyaXRlX2J5dGVzKT4+UEFHRV9DQUNIRV9TSElGVCkgPiAoaW5vZGUtPmlfc2l6ZT4+UEFHRV9DQUNIRV9TSElGVCkgKSB7Ci0JICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMgLSAxXSkgfHwKKwkgICAgKChwb3MgKyB3cml0ZV9ieXRlcykgPj4gUEFHRV9DQUNIRV9TSElGVCkgPgorCSAgICAoaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgeworCQloZWFkID0gcGFnZV9idWZmZXJzKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcyAtIDFdKTsKIAotCSAgICAvKiBmb3IgZWFjaCBidWZmZXIgaW4gcGFnZSAqLwotCSAgICBmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OwotCQlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJCS8qIGZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJCWZvciAoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCQkgICAgIGJsb2NrX3N0YXJ0ID0gYmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgewogCi0JCWlmICghYmgpCi0JCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDI6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOwotCQkvKiBGaW5kIHdoZXJlIHRoaXMgYnVmZmVyIGVuZHMgKi8KLQkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCQlpZiAoIGJsb2NrX3N0YXJ0ID49IHRvICkKLQkJICAgIC8qIGlmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgc2tpcCBpdCovCi0JCSAgICBicmVhazsKLQkJaWYgKCBibG9ja19lbmQgPiB0byApIHsgLyogQWhhLCBvdXIgcGFydGlhbCBidWZmZXIgKi8KLQkJICAgIGlmICggYnVmZmVyX21hcHBlZChiaCkgKSB7IC8qIElmIGl0IGlzIG1hcHBlZCwgd2UgbmVlZCB0bwotCQkJCQkJICBpc3N1ZSBSRUFEIHJlcXVlc3QgZm9yIGl0IHRvCi0JCQkJCQkgIG5vdCBsb29zZSBkYXRhICovCi0JCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOwotCQkJKndhaXRfYmgrKz1iaDsKLQkJICAgIH0gZWxzZSB7IC8qIE5vdCBtYXBwZWQsIHplcm8gaXQgKi8KLQkJCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdLCBLTV9VU0VSMCk7Ci0JCQltZW1zZXQoa2FkZHIrdG8sIDAsIGJsb2NrX2VuZC10byk7Ci0JCQlrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOwotCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCSAgICB9CisJCQlpZiAoIWJoKQorCQkJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJCQkgICAgICAgImdyZWVuLTkwMDI6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOworCQkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCisJCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJCWlmIChibG9ja19zdGFydCA+PSB0bykKKwkJCQkvKiBpZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJCQlicmVhazsKKwkJCWlmIChibG9ja19lbmQgPiB0bykgewkvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLworCQkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSkgewkvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KKwkJCQkJCQkJICAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bworCQkJCQkJCQkgICBub3QgbG9vc2UgZGF0YSAqLworCQkJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJCQkqd2FpdF9iaCsrID0gYmg7CisJCQkJfSBlbHNlIHsJLyogTm90IG1hcHBlZCwgemVybyBpdCAqLworCQkJCQljaGFyICprYWRkciA9CisJCQkJCSAgICBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlcworCQkJCQkJCVtudW1fcGFnZXMgLSAxXSwKKwkJCQkJCQlLTV9VU0VSMCk7CisJCQkJCW1lbXNldChrYWRkciArIHRvLCAwLCBibG9ja19lbmQgLSB0byk7CisJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KIAl9CiAKLSAgICAvKiBXYWl0IGZvciByZWFkIHJlcXVlc3RzIHdlIG1hZGUgdG8gaGFwcGVuLCBpZiBuZWNlc3NhcnkgKi8KLSAgICB3aGlsZSh3YWl0X2JoID4gd2FpdCkgewotCXdhaXRfb25fYnVmZmVyKCotLXdhaXRfYmgpOwotCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkgewotCSAgICByZXMgPSAtRUlPOwotCSAgICBnb3RvIGZhaWxlZF9yZWFkOworCS8qIFdhaXQgZm9yIHJlYWQgcmVxdWVzdHMgd2UgbWFkZSB0byBoYXBwZW4sIGlmIG5lY2Vzc2FyeSAqLworCXdoaWxlICh3YWl0X2JoID4gd2FpdCkgeworCQl3YWl0X29uX2J1ZmZlcigqLS13YWl0X2JoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoKndhaXRfYmgpKSB7CisJCQlyZXMgPSAtRUlPOworCQkJZ290byBmYWlsZWRfcmVhZDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICByZXR1cm4gYmxvY2tzOwotZmFpbGVkX3BhZ2VfZ3JhYmJpbmc6Ci0gICAgbnVtX3BhZ2VzID0gaTsKLWZhaWxlZF9yZWFkOgotICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKLSAgICByZXR1cm4gcmVzOworCXJldHVybiBibG9ja3M7CisgICAgICBmYWlsZWRfcGFnZV9ncmFiYmluZzoKKwludW1fcGFnZXMgPSBpOworICAgICAgZmFpbGVkX3JlYWQ6CisJcmVpc2VyZnNfdW5wcmVwYXJlX3BhZ2VzKHByZXBhcmVkX3BhZ2VzLCBudW1fcGFnZXMpOworCXJldHVybiByZXM7CiB9CiAKIC8qIFdyaXRlIEBjb3VudCBieXRlcyBhdCBwb3NpdGlvbiBAcHBvcyBpbiBhIGZpbGUgaW5kaWNhdGVkIGJ5IEBmaWxlCkBAIC0xMTQ4LDI2MiArMTI2NSwzMDUgQEAKICAgIEZ1dHVyZSBGZWF0dXJlczogcHJvdmlkaW5nIHNlYXJjaF9ieV9rZXkgd2l0aCBoaW50cy4KIAogKi8KLXN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2ZpbGVfd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLCAvKiB0aGUgZmlsZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgaW50byAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCAvKiAgcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIGRhdGEKLShpbiB1c2Vyc3BhY2UpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcyAvKiBwb2ludGVyIHRvIHBvc2l0aW9uIGluIGZpbGUgdGhhdCB3ZSBzdGFydCB3cml0aW5nIGF0LiBTaG91bGQgYmUgdXBkYXRlZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV3IGN1cnJlbnQgcG9zaXRpb24gYmVmb3JlIHJldHVybmluZy4gKi8gKQorc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwJLyogdGhlIGZpbGUgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIGludG8gKi8KKwkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwJLyogIHBvaW50ZXIgdG8gdXNlciBzdXBwbGllZCBkYXRhCisJCQkJCQkJCSAgIChpbiB1c2Vyc3BhY2UpICovCisJCQkJICAgc2l6ZV90IGNvdW50LAkvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQkgICBsb2ZmX3QgKiBwcG9zCS8qIHBvaW50ZXIgdG8gcG9zaXRpb24gaW4gZmlsZSB0aGF0IHdlIHN0YXJ0IHdyaXRpbmcgYXQuIFNob3VsZCBiZSB1cGRhdGVkIHRvCisJCQkJCQkJICogbmV3IGN1cnJlbnQgcG9zaXRpb24gYmVmb3JlIHJldHVybmluZy4gKi8KKwkJCQkgICApCiB7Ci0gICAgc2l6ZV90IGFscmVhZHlfd3JpdHRlbiA9IDA7IC8vIE51bWJlciBvZiBieXRlcyBhbHJlYWR5IHdyaXR0ZW4gdG8gdGhlIGZpbGUuCi0gICAgbG9mZl90IHBvczsgLy8gQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KLSAgICBzc2l6ZV90IHJlczsgLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KLSAgICBpbnQgZXJyID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7IC8vIElub2RlIG9mIHRoZSBmaWxlIHRoYXQgd2UgYXJlIHdyaXRpbmcgdG8uCi0JCQkJLyogVG8gc2ltcGxpZnkgY29kaW5nIGF0IHRoaXMgdGltZSwgd2Ugc3RvcmUKLQkJCQkgICBsb2NrZWQgcGFnZXMgaW4gYXJyYXkgZm9yIG5vdyAqLwotICAgIHN0cnVjdCBwYWdlICogcHJlcGFyZWRfcGFnZXNbUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FXTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIHRoLnRfdHJhbnNfaWQgPSAwOworCXNpemVfdCBhbHJlYWR5X3dyaXR0ZW4gPSAwOwkvLyBOdW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSB3cml0dGVuIHRvIHRoZSBmaWxlLgorCWxvZmZfdCBwb3M7CQkvLyBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBmaWxlLgorCXNzaXplX3QgcmVzOwkJLy8gcmV0dXJuIHZhbHVlIG9mIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgd2UgY2FsbC4KKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CS8vIElub2RlIG9mIHRoZSBmaWxlIHRoYXQgd2UgYXJlIHdyaXRpbmcgdG8uCisJLyogVG8gc2ltcGxpZnkgY29kaW5nIGF0IHRoaXMgdGltZSwgd2Ugc3RvcmUKKwkgICBsb2NrZWQgcGFnZXMgaW4gYXJyYXkgZm9yIG5vdyAqLworCXN0cnVjdCBwYWdlICpwcmVwYXJlZF9wYWdlc1tSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUVdOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJdGgudF90cmFuc19pZCA9IDA7CiAKLSAgICBpZiAoIGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeyAvLyBEaXJlY3QgSU8gbmVlZHMgdHJlYXRtZW50Ci0Jc3NpemVfdCByZXN1bHQsIGFmdGVyX2ZpbGVfZW5kID0gMDsKLQlpZiAoICgqcHBvcyArIGNvdW50ID49IGlub2RlLT5pX3NpemUpIHx8IChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpICkgewotCSAgICAvKiBJZiB3ZSBhcmUgYXBwZW5kaW5nIGEgZmlsZSwgd2UgbmVlZCB0byBwdXQgdGhpcyBzYXZlbGluayBpbiBoZXJlLgotCSAgICAgICBJZiB3ZSB3aWxsIGNyYXNoIHdoaWxlIGRvaW5nIGRpcmVjdCBpbywgZmluaXNoX3VuZmluaXNoZWQgd2lsbAotCSAgICAgICBjdXQgdGhlIGdhcmJhZ2UgZnJvbSB0aGUgZmlsZSBlbmQuICovCi0JICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCSAgICBlcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCApOwotICAgICAgICAgICAgaWYgKGVycikgewotCQlyZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKLQkJcmV0dXJuIGVycjsKLQkgICAgfQotCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwotCSAgICBhZGRfc2F2ZV9saW5rICgmdGgsIGlub2RlLCAxIC8qIFRydW5jYXRlICovKTsKLQkgICAgYWZ0ZXJfZmlsZV9lbmQgPSAxOwotCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCApOwotICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQl9Ci0JcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpIHsJLy8gRGlyZWN0IElPIG5lZWRzIHRyZWF0bWVudAorCQlzc2l6ZV90IHJlc3VsdCwgYWZ0ZXJfZmlsZV9lbmQgPSAwOworCQlpZiAoKCpwcG9zICsgY291bnQgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJICAgIHx8IChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpKSB7CisJCQkvKiBJZiB3ZSBhcmUgYXBwZW5kaW5nIGEgZmlsZSwgd2UgbmVlZCB0byBwdXQgdGhpcyBzYXZlbGluayBpbiBoZXJlLgorCQkJICAgSWYgd2Ugd2lsbCBjcmFzaCB3aGlsZSBkb2luZyBkaXJlY3QgaW8sIGZpbmlzaF91bmZpbmlzaGVkIHdpbGwKKwkJCSAgIGN1dCB0aGUgZ2FyYmFnZSBmcm9tIHRoZSBmaWxlIGVuZC4gKi8KKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQkJZXJyID0KKwkJCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsCisJCQkJCSAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCQkJaWYgKGVycikgeworCQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJCQlhZGRfc2F2ZV9saW5rKCZ0aCwgaW5vZGUsIDEgLyogVHJ1bmNhdGUgKi8gKTsKKwkJCWFmdGVyX2ZpbGVfZW5kID0gMTsKKwkJCWVyciA9CisJCQkgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwKKwkJCQkJSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CiAKLQlpZiAoIGFmdGVyX2ZpbGVfZW5kICkgeyAvKiBOb3cgdXBkYXRlIGlfc2l6ZSBhbmQgcmVtb3ZlIHRoZSBzYXZlbGluayAqLwotCSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkgICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKLSAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOwotCSAgICByZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7Ci0JICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOwotICAgICAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0JICAgIGVyciA9IHJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCAxLyogdHJ1bmNhdGUgKi8pOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCQlpZiAoYWZ0ZXJfZmlsZV9lbmQpIHsJLyogTm93IHVwZGF0ZSBpX3NpemUgYW5kIHJlbW92ZSB0aGUgc2F2ZWxpbmsgKi8KKwkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisJCQlpZiAoZXJyKSB7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCQkJaWYgKGVycikgeworCQkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWVyciA9IHJlbW92ZV9zYXZlX2xpbmsoaW5vZGUsIDEgLyogdHJ1bmNhdGUgKi8gKTsKKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXJldHVybiByZXN1bHQ7Ci0gICAgfQorCWlmICh1bmxpa2VseSgoc3NpemVfdCkgY291bnQgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIHVubGlrZWx5KChzc2l6ZV90KSBjb3VudCA8IDAgKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAKLSAgICBpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpKQotICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOwkvLyBsb2NrcyB0aGUgZW50aXJlIGZpbGUgZm9yIGp1c3QgdXMKIAotICAgIGRvd24oJmlub2RlLT5pX3NlbSk7IC8vIGxvY2tzIHRoZSBlbnRpcmUgZmlsZSBmb3IganVzdCB1cworCXBvcyA9ICpwcG9zOwogCi0gICAgcG9zID0gKnBwb3M7CisJLyogQ2hlY2sgaWYgd2UgY2FuIHdyaXRlIHRvIHNwZWNpZmllZCByZWdpb24gb2YgZmlsZSwgZmlsZQorCSAgIGlzIG5vdCBvdmVybHkgYmlnIGFuZCB0aGlzIGtpbmQgb2Ygc3R1ZmYuIEFkanVzdCBwb3MgYW5kCisJICAgY291bnQsIGlmIG5lZWRlZCAqLworCXJlcyA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgMCk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CiAKLSAgICAvKiBDaGVjayBpZiB3ZSBjYW4gd3JpdGUgdG8gc3BlY2lmaWVkIHJlZ2lvbiBvZiBmaWxlLCBmaWxlCi0gICAgICAgaXMgbm90IG92ZXJseSBiaWcgYW5kIHRoaXMga2luZCBvZiBzdHVmZi4gQWRqdXN0IHBvcyBhbmQKLSAgICAgICBjb3VudCwgaWYgbmVlZGVkICovCi0gICAgcmVzID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LCAwKTsKLSAgICBpZiAocmVzKQotCWdvdG8gb3V0OworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKIAotICAgIGlmICggY291bnQgPT0gMCApCi0JZ290byBvdXQ7CisJcmVzID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OwogCi0gICAgcmVzID0gcmVtb3ZlX3N1aWQoZmlsZS0+Zl9kZW50cnkpOwotICAgIGlmIChyZXMpCi0JZ290byBvdXQ7CisJaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOwkvKiBCb3RoIG10aW1lIGFuZCBjdGltZSAqLwogCi0gICAgaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOyAvKiBCb3RoIG10aW1lIGFuZCBjdGltZSAqLworCS8vIE9rLCB3ZSBhcmUgZG9uZSB3aXRoIGFsbCB0aGUgY2hlY2tzLgogCi0gICAgLy8gT2ssIHdlIGFyZSBkb25lIHdpdGggYWxsIHRoZSBjaGVja3MuCisJLy8gTm93IHdlIHNob3VsZCBzdGFydCByZWFsIHdvcmsKIAotICAgIC8vIE5vdyB3ZSBzaG91bGQgc3RhcnQgcmVhbCB3b3JrCisJLyogSWYgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHBhc3QgdGhlIGZpbGUncyBwYWNrZWQgdGFpbCBvciBpZiB3ZSBhcmUgZ29pbmcKKwkgICB0byBvdmVyd3JpdGUgcGFydCBvZiB0aGUgdGFpbCwgd2UgbmVlZCB0aGF0IHRhaWwgdG8gYmUgY29udmVydGVkIGludG8KKwkgICB1bmZvcm1hdHRlZCBub2RlICovCisJcmVzID0gcmVpc2VyZnNfY2hlY2tfZm9yX3RhaWxfYW5kX2NvbnZlcnQoaW5vZGUsIHBvcywgY291bnQpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OwogCi0gICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIHdyaXRlIHBhc3QgdGhlIGZpbGUncyBwYWNrZWQgdGFpbCBvciBpZiB3ZSBhcmUgZ29pbmcKLSAgICAgICB0byBvdmVyd3JpdGUgcGFydCBvZiB0aGUgdGFpbCwgd2UgbmVlZCB0aGF0IHRhaWwgdG8gYmUgY29udmVydGVkIGludG8KLSAgICAgICB1bmZvcm1hdHRlZCBub2RlICovCi0gICAgcmVzID0gcmVpc2VyZnNfY2hlY2tfZm9yX3RhaWxfYW5kX2NvbnZlcnQoIGlub2RlLCBwb3MsIGNvdW50KTsKLSAgICBpZiAocmVzKQotCWdvdG8gb3V0OworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLyogVGhpcyBpcyB0aGUgbWFpbiBsb29wIGluIHdoaWNoIHdlIHJ1bm5pbmcgdW50aWwgc29tZSBlcnJvciBvY2N1cmVzCisJCSAgIG9yIHVudGlsIHdlIHdyaXRlIGFsbCBvZiB0aGUgZGF0YS4gKi8KKwkJc2l6ZV90IG51bV9wYWdlczsJLyogYW1vdW50IG9mIHBhZ2VzIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGlzIGl0ZXJhdGlvbiAqLworCQlzaXplX3Qgd3JpdGVfYnl0ZXM7CS8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSBkdXJpbmcgdGhpcyBpdGVyYXRpb24gKi8KKwkJc2l6ZV90IGJsb2Nrc190b19hbGxvY2F0ZTsJLyogaG93IG11Y2ggYmxvY2tzIHdlIG5lZWQgdG8gYWxsb2NhdGUgZm9yIHRoaXMgaXRlcmF0aW9uICovCiAKLSAgICB3aGlsZSAoIGNvdW50ID4gMCkgewotCS8qIFRoaXMgaXMgdGhlIG1haW4gbG9vcCBpbiB3aGljaCB3ZSBydW5uaW5nIHVudGlsIHNvbWUgZXJyb3Igb2NjdXJlcwotCSAgIG9yIHVudGlsIHdlIHdyaXRlIGFsbCBvZiB0aGUgZGF0YS4gKi8KLQlzaXplX3QgbnVtX3BhZ2VzOy8qIGFtb3VudCBvZiBwYWdlcyB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdGhpcyBpdGVyYXRpb24gKi8KLQlzaXplX3Qgd3JpdGVfYnl0ZXM7IC8qIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZSBkdXJpbmcgdGhpcyBpdGVyYXRpb24gKi8KLQlzaXplX3QgYmxvY2tzX3RvX2FsbG9jYXRlOyAvKiBob3cgbXVjaCBibG9ja3Mgd2UgbmVlZCB0byBhbGxvY2F0ZSBmb3IgdGhpcyBpdGVyYXRpb24gKi8KLSAgICAgICAgCi0gICAgICAgIC8qICAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkgaXMgYW4gaWRpb20gZm9yIG9mZnNldCBpbnRvIGEgcGFnZSBvZiBwb3MqLwotCW51bV9wYWdlcyA9ICEhKChwb3MrY291bnQpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIC8qIHJvdW5kIHVwIHBhcnRpYWwKLQkJCQkJCQkgIHBhZ2VzICovCi0JCSAgICAoKGNvdW50ICsgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpKSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsgCi0JCQkJCQkvKiBjb252ZXJ0IHNpemUgdG8gYW1vdW50IG9mCi0JCQkJCQkgICBwYWdlcyAqLwotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICggbnVtX3BhZ2VzID4gUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FIAotCQl8fCBudW1fcGFnZXMgPiByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSApIHsKLQkgICAgLyogSWYgd2Ugd2VyZSBhc2tlZCB0byB3cml0ZSBtb3JlIGRhdGEgdGhhbiB3ZSB3YW50IHRvIG9yIGlmIHRoZXJlCi0JICAgICAgIGlzIG5vdCB0aGF0IG11Y2ggc3BhY2UsIHRoZW4gd2Ugc2hvcnRlbiBhbW91bnQgb2YgZGF0YSB0byB3cml0ZQotCSAgICAgICBmb3IgdGhpcyBpdGVyYXRpb24uICovCi0JICAgIG51bV9wYWdlcyA9IG1pbl90KHNpemVfdCwgUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FLCByZWlzZXJmc19jYW5fZml0X3BhZ2VzKGlub2RlLT5pX3NiKSk7Ci0JICAgIC8qIEFsc28gd2Ugc2hvdWxkIG5vdCBmb3JnZXQgdG8gc2V0IHNpemUgaW4gYnl0ZXMgYWNjb3JkaW5nbHkgKi8KLQkgICAgd3JpdGVfYnl0ZXMgPSAobnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIC0gCi0JCQkgICAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpOwotCQkJCQkgLyogSWYgcG9zaXRpb24gaXMgbm90IG9uIHRoZQotCQkJCQkgICAgc3RhcnQgb2YgdGhlIHBhZ2UsIHdlIG5lZWQKLQkJCQkJICAgIHRvIHN1YnN0cmFjdCB0aGUgb2Zmc2V0Ci0JCQkJCSAgICB3aXRoaW4gcGFnZSAqLwotCX0gZWxzZQotCSAgICB3cml0ZV9ieXRlcyA9IGNvdW50OworCQkvKiAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpIGlzIGFuIGlkaW9tIGZvciBvZmZzZXQgaW50byBhIHBhZ2Ugb2YgcG9zICovCisJCW51bV9wYWdlcyA9ICEhKChwb3MgKyBjb3VudCkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsJLyogcm91bmQgdXAgcGFydGlhbAorCQkJCQkJCQkJICAgcGFnZXMgKi8KKwkJICAgICgoY291bnQgKworCQkgICAgICAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCS8qIGNvbnZlcnQgc2l6ZSB0byBhbW91bnQgb2YKKwkJICAgcGFnZXMgKi8KKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmIChudW1fcGFnZXMgPiBSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUUKKwkJICAgIHx8IG51bV9wYWdlcyA+IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoaW5vZGUtPmlfc2IpKSB7CisJCQkvKiBJZiB3ZSB3ZXJlIGFza2VkIHRvIHdyaXRlIG1vcmUgZGF0YSB0aGFuIHdlIHdhbnQgdG8gb3IgaWYgdGhlcmUKKwkJCSAgIGlzIG5vdCB0aGF0IG11Y2ggc3BhY2UsIHRoZW4gd2Ugc2hvcnRlbiBhbW91bnQgb2YgZGF0YSB0byB3cml0ZQorCQkJICAgZm9yIHRoaXMgaXRlcmF0aW9uLiAqLworCQkJbnVtX3BhZ2VzID0KKwkJCSAgICBtaW5fdChzaXplX3QsIFJFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRSwKKwkJCQkgIHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoaW5vZGUtPmlfc2IpKTsKKwkJCS8qIEFsc28gd2Ugc2hvdWxkIG5vdCBmb3JnZXQgdG8gc2V0IHNpemUgaW4gYnl0ZXMgYWNjb3JkaW5nbHkgKi8KKwkJCXdyaXRlX2J5dGVzID0gKG51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUKSAtCisJCQkgICAgKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisJCQkvKiBJZiBwb3NpdGlvbiBpcyBub3Qgb24gdGhlCisJCQkgICBzdGFydCBvZiB0aGUgcGFnZSwgd2UgbmVlZAorCQkJICAgdG8gc3Vic3RyYWN0IHRoZSBvZmZzZXQKKwkJCSAgIHdpdGhpbiBwYWdlICovCisJCX0gZWxzZQorCQkJd3JpdGVfYnl0ZXMgPSBjb3VudDsKIAotCS8qIHJlc2VydmUgdGhlIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgbGF0ZXIsIHNvIHRoYXQgbGF0ZXIgb24KLQkgICB3ZSBzdGlsbCBoYXZlIHRoZSBzcGFjZSB0byB3cml0ZSB0aGUgYmxvY2tzIHRvICovCi0JcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZChpbm9kZS0+aV9zYiwgbnVtX3BhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCS8qIHJlc2VydmUgdGhlIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgbGF0ZXIsIHNvIHRoYXQgbGF0ZXIgb24KKwkJICAgd2Ugc3RpbGwgaGF2ZSB0aGUgc3BhY2UgdG8gd3JpdGUgdGhlIGJsb2NrcyB0byAqLworCQlyZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKGlub2RlLT5pX3NiLAorCQkJCQkJICAgICAgbnVtX3BhZ2VzIDw8CisJCQkJCQkgICAgICAoUEFHRV9DQUNIRV9TSElGVCAtCisJCQkJCQkgICAgICAgaW5vZGUtPmlfYmxrYml0cykpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCi0JaWYgKCAhbnVtX3BhZ2VzICkgeyAvKiBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggc3BhY2UgZXZlbiBmb3IgYSBzaW5nbGUgcGFnZS4uLiAqLwotCSAgICBpZiAoIHBvcyA+IGlub2RlLT5pX3NpemUraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLShwb3MgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLTEpKSkgewotCQlyZXMgPSAtRU5PU1BDOwotCQlicmVhazsgLy8gSW4gY2FzZSB3ZSBhcmUgd3JpdGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGxhc3QgZmlsZSBibG9jaywgYnJlYWsuCi0JICAgIH0KLQkgICAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBwb3NzaWJseSBvdmVyd3JpdGluZyB0aGUgZmlsZSwgc28KLQkgICAgLy8gbGV0J3Mgc2V0IHdyaXRlIHNpemUgdG8gYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGJsb2Nrc2l6ZS4KLQkgICAgLy8gVGhpcyB3YXkgd2UgZ2V0IGl0IGNvcnJlY3RseSBmb3IgZmlsZSBob2xlcy4KLQkgICAgLy8gQnV0IG92ZXJ3cml0aW5nIGZpbGVzIG9uIGFic29sdXRlbGx5IGZ1bGwgdm9sdW1lcyB3b3VsZCBub3QKLQkgICAgLy8gYmUgdmVyeSBlZmZpY2llbnQuIFdlbGwsIHBlb3BsZSBhcmUgbm90IHN1cHBvc2VkIHRvIGZpbGwKLQkgICAgLy8gMTAwJSBvZiBkaXNrIHNwYWNlIGFueXdheS4KLQkgICAgd3JpdGVfYnl0ZXMgPSBtaW5fdChzaXplX3QsIGNvdW50LCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAocG9zICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSk7Ci0JICAgIG51bV9wYWdlcyA9IDE7Ci0JICAgIC8vIE5vIGJsb2NrcyB3ZXJlIGNsYWltZWQgYmVmb3JlLCBzbyBkbyBpdCBub3cuCi0JICAgIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoaW5vZGUtPmlfc2IsIDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSk7Ci0JfQorCQlpZiAoIW51bV9wYWdlcykgewkvKiBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggc3BhY2UgZXZlbiBmb3IgYSBzaW5nbGUgcGFnZS4uLiAqLworCQkJaWYgKHBvcyA+CisJCQkgICAgaW5vZGUtPmlfc2l6ZSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtCisJCQkgICAgKHBvcyAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkpIHsKKwkJCQlyZXMgPSAtRU5PU1BDOworCQkJCWJyZWFrOwkvLyBJbiBjYXNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGFzdCBmaWxlIGJsb2NrLCBicmVhay4KKwkJCX0KKwkJCS8vIE90aGVyd2lzZSB3ZSBhcmUgcG9zc2libHkgb3ZlcndyaXRpbmcgdGhlIGZpbGUsIHNvCisJCQkvLyBsZXQncyBzZXQgd3JpdGUgc2l6ZSB0byBiZSBlcXVhbCBvciBsZXNzIHRoYW4gYmxvY2tzaXplLgorCQkJLy8gVGhpcyB3YXkgd2UgZ2V0IGl0IGNvcnJlY3RseSBmb3IgZmlsZSBob2xlcy4KKwkJCS8vIEJ1dCBvdmVyd3JpdGluZyBmaWxlcyBvbiBhYnNvbHV0ZWxseSBmdWxsIHZvbHVtZXMgd291bGQgbm90CisJCQkvLyBiZSB2ZXJ5IGVmZmljaWVudC4gV2VsbCwgcGVvcGxlIGFyZSBub3Qgc3VwcG9zZWQgdG8gZmlsbAorCQkJLy8gMTAwJSBvZiBkaXNrIHNwYWNlIGFueXdheS4KKwkJCXdyaXRlX2J5dGVzID0KKwkJCSAgICBtaW5fdChzaXplX3QsIGNvdW50LAorCQkJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0KKwkJCQkgIChwb3MgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpKTsKKwkJCW51bV9wYWdlcyA9IDE7CisJCQkvLyBObyBibG9ja3Mgd2VyZSBjbGFpbWVkIGJlZm9yZSwgc28gZG8gaXQgbm93LgorCQkJcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZChpbm9kZS0+aV9zYiwKKwkJCQkJCQkgICAgICAxIDw8CisJCQkJCQkJICAgICAgKFBBR0VfQ0FDSEVfU0hJRlQKKwkJCQkJCQkgICAgICAgLQorCQkJCQkJCSAgICAgICBpbm9kZS0+CisJCQkJCQkJICAgICAgIGlfYmxrYml0cykpOworCQl9CiAKLQkvKiBQcmVwYXJlIGZvciB3cml0aW5nIGludG8gdGhlIHJlZ2lvbiwgcmVhZCBpbiBhbGwgdGhlCi0JICAgcGFydGlhbGx5IG92ZXJ3cml0dGVuIHBhZ2VzLCBpZiBuZWVkZWQuIEFuZCBsb2NrIHRoZSBwYWdlcywKLQkgICBzbyB0aGF0IG5vYm9keSBlbHNlIGNhbiBhY2Nlc3MgdGhlc2UgdW50aWwgd2UgYXJlIGRvbmUuCi0JICAgV2UgZ2V0IG51bWJlciBvZiBhY3R1YWwgYmxvY2tzIG5lZWRlZCBhcyBhIHJlc3VsdC4qLwotCWJsb2Nrc190b19hbGxvY2F0ZSA9IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlKGlub2RlLCBwb3MsIG51bV9wYWdlcywgd3JpdGVfYnl0ZXMsIHByZXBhcmVkX3BhZ2VzKTsKLQlpZiAoIGJsb2Nrc190b19hbGxvY2F0ZSA8IDAgKSB7Ci0JICAgIHJlcyA9IGJsb2Nrc190b19hbGxvY2F0ZTsKLQkgICAgcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgbnVtX3BhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cykpOwotCSAgICBicmVhazsKLQl9CisJCS8qIFByZXBhcmUgZm9yIHdyaXRpbmcgaW50byB0aGUgcmVnaW9uLCByZWFkIGluIGFsbCB0aGUKKwkJICAgcGFydGlhbGx5IG92ZXJ3cml0dGVuIHBhZ2VzLCBpZiBuZWVkZWQuIEFuZCBsb2NrIHRoZSBwYWdlcywKKwkJICAgc28gdGhhdCBub2JvZHkgZWxzZSBjYW4gYWNjZXNzIHRoZXNlIHVudGlsIHdlIGFyZSBkb25lLgorCQkgICBXZSBnZXQgbnVtYmVyIG9mIGFjdHVhbCBibG9ja3MgbmVlZGVkIGFzIGEgcmVzdWx0LiAqLworCQlibG9ja3NfdG9fYWxsb2NhdGUgPQorCQkgICAgcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoaW5vZGUsIHBvcywKKwkJCQkJCQkgICBudW1fcGFnZXMsCisJCQkJCQkJICAgd3JpdGVfYnl0ZXMsCisJCQkJCQkJICAgcHJlcGFyZWRfcGFnZXMpOworCQlpZiAoYmxvY2tzX3RvX2FsbG9jYXRlIDwgMCkgeworCQkJcmVzID0gYmxvY2tzX3RvX2FsbG9jYXRlOworCQkJcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJCQludW1fcGFnZXMgPDwKKwkJCQkJCQkoUEFHRV9DQUNIRV9TSElGVCAtCisJCQkJCQkJIGlub2RlLT5pX2Jsa2JpdHMpKTsKKwkJCWJyZWFrOworCQl9CiAKLQkvKiBGaXJzdCB3ZSBjb3JyZWN0IG91ciBlc3RpbWF0ZSBvZiBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCAqLwotCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsIChudW1fcGFnZXMgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpIC0gYmxvY2tzX3RvX2FsbG9jYXRlICk7CisJCS8qIEZpcnN0IHdlIGNvcnJlY3Qgb3VyIGVzdGltYXRlIG9mIGhvdyBtYW55IGJsb2NrcyB3ZSBuZWVkICovCisJCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsCisJCQkJCQkobnVtX3BhZ2VzIDw8CisJCQkJCQkgKFBBR0VfQ0FDSEVfU0hJRlQgLQorCQkJCQkJICBpbm9kZS0+aV9zYi0+CisJCQkJCQkgIHNfYmxvY2tzaXplX2JpdHMpKSAtCisJCQkJCQlibG9ja3NfdG9fYWxsb2NhdGUpOwogCi0JaWYgKCBibG9ja3NfdG9fYWxsb2NhdGUgPiAwKSB7LypXZSBvbmx5IGFsbG9jYXRlIGJsb2NrcyBpZiB3ZSBuZWVkIHRvKi8KLQkgICAgLyogRmlsbCBpbiBhbGwgdGhlIHBvc3NpYmxlIGhvbGVzIGFuZCBhcHBlbmQgdGhlIGZpbGUgaWYgbmVlZGVkICovCi0JICAgIHJlcyA9IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2Nrc19mb3JfcmVnaW9uKCZ0aCwgaW5vZGUsIHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMsIGJsb2Nrc190b19hbGxvY2F0ZSk7Ci0JfQorCQlpZiAoYmxvY2tzX3RvX2FsbG9jYXRlID4gMCkgewkvKldlIG9ubHkgYWxsb2NhdGUgYmxvY2tzIGlmIHdlIG5lZWQgdG8gKi8KKwkJCS8qIEZpbGwgaW4gYWxsIHRoZSBwb3NzaWJsZSBob2xlcyBhbmQgYXBwZW5kIHRoZSBmaWxlIGlmIG5lZWRlZCAqLworCQkJcmVzID0KKwkJCSAgICByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbigmdGgsIGlub2RlLCBwb3MsCisJCQkJCQkJCW51bV9wYWdlcywKKwkJCQkJCQkJd3JpdGVfYnl0ZXMsCisJCQkJCQkJCXByZXBhcmVkX3BhZ2VzLAorCQkJCQkJCQlibG9ja3NfdG9fYWxsb2NhdGUpOworCQl9CiAKLQkvKiB3ZWxsLCB3ZSBoYXZlIGFsbG9jYXRlZCB0aGUgYmxvY2tzLCBzbyBpdCBpcyB0aW1lIHRvIGZyZWUKLQkgICB0aGUgcmVzZXJ2YXRpb24gd2UgbWFkZSBlYXJsaWVyLiAqLwotCXJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsIGJsb2Nrc190b19hbGxvY2F0ZSk7Ci0JaWYgKCByZXMgKSB7Ci0JICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKLQkgICAgYnJlYWs7Ci0JfQorCQkvKiB3ZWxsLCB3ZSBoYXZlIGFsbG9jYXRlZCB0aGUgYmxvY2tzLCBzbyBpdCBpcyB0aW1lIHRvIGZyZWUKKwkJICAgdGhlIHJlc2VydmF0aW9uIHdlIG1hZGUgZWFybGllci4gKi8KKwkJcmVpc2VyZnNfcmVsZWFzZV9jbGFpbWVkX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJCWJsb2Nrc190b19hbGxvY2F0ZSk7CisJCWlmIChyZXMpIHsKKwkJCXJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKwkJCWJyZWFrOworCQl9CiAKIC8qIE5PVEUgdGhhdCBhbGxvY2F0aW5nIGJsb2NrcyBhbmQgZmlsbGluZyBibG9ja3MgY2FuIGJlIGRvbmUgaW4gcmV2ZXJzZSBvcmRlcgogICAgYW5kIHByb2JhYmx5IHdlIHdvdWxkIGRvIHRoYXQganVzdCB0byBnZXQgcmlkIG9mIGdhcmJhZ2UgaW4gZmlsZXMgYWZ0ZXIgYQogICAgY3Jhc2ggKi8KIAotCS8qIENvcHkgZGF0YSBmcm9tIHVzZXItc3VwcGxpZWQgYnVmZmVyIHRvIGZpbGUncyBwYWdlcyAqLwotCXJlcyA9IHJlaXNlcmZzX2NvcHlfZnJvbV91c2VyX3RvX2ZpbGVfcmVnaW9uKHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMsIGJ1Zik7Ci0JaWYgKCByZXMgKSB7Ci0JICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKLQkgICAgYnJlYWs7CisJCS8qIENvcHkgZGF0YSBmcm9tIHVzZXItc3VwcGxpZWQgYnVmZmVyIHRvIGZpbGUncyBwYWdlcyAqLworCQlyZXMgPQorCQkgICAgcmVpc2VyZnNfY29weV9mcm9tX3VzZXJfdG9fZmlsZV9yZWdpb24ocG9zLCBudW1fcGFnZXMsCisJCQkJCQkJICAgd3JpdGVfYnl0ZXMsCisJCQkJCQkJICAgcHJlcGFyZWRfcGFnZXMsIGJ1Zik7CisJCWlmIChyZXMpIHsKKwkJCXJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2VuZCB0aGUgcGFnZXMgdG8gZGlzayBhbmQgdW5sb2NrIHRoZW0uICovCisJCXJlcyA9CisJCSAgICByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKCZ0aCwgaW5vZGUsIHBvcywKKwkJCQkJCQkgIG51bV9wYWdlcywKKwkJCQkJCQkgIHdyaXRlX2J5dGVzLAorCQkJCQkJCSAgcHJlcGFyZWRfcGFnZXMpOworCQlpZiAocmVzKQorCQkJYnJlYWs7CisKKwkJYWxyZWFkeV93cml0dGVuICs9IHdyaXRlX2J5dGVzOworCQlidWYgKz0gd3JpdGVfYnl0ZXM7CisJCSpwcG9zID0gcG9zICs9IHdyaXRlX2J5dGVzOworCQljb3VudCAtPSB3cml0ZV9ieXRlczsKKwkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChpbm9kZS0+aV9tYXBwaW5nKTsKIAl9CiAKLQkvKiBTZW5kIHRoZSBwYWdlcyB0byBkaXNrIGFuZCB1bmxvY2sgdGhlbS4gKi8KLQlyZXMgPSByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKCZ0aCwgaW5vZGUsIHBvcywgbnVtX3BhZ2VzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnl0ZXMscHJlcGFyZWRfcGFnZXMpOwotCWlmICggcmVzICkKLQkgICAgYnJlYWs7CisJLyogdGhpcyBpcyBvbmx5IHRydWUgb24gZXJyb3IgKi8KKwlpZiAodGgudF90cmFuc19pZCkgeworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCB0aC50X3N1cGVyLCB0aC50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlpZiAoZXJyKSB7CisJCQlyZXMgPSBlcnI7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KIAotCWFscmVhZHlfd3JpdHRlbiArPSB3cml0ZV9ieXRlczsKLQlidWYgKz0gd3JpdGVfYnl0ZXM7Ci0JKnBwb3MgPSBwb3MgKz0gd3JpdGVfYnl0ZXM7Ci0JY291bnQgLT0gd3JpdGVfYnl0ZXM7Ci0JYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChpbm9kZS0+aV9tYXBwaW5nKTsKLSAgICB9CisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkKKwkJcmVzID0KKwkJICAgIGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIGZpbGUtPmZfbWFwcGluZywKKwkJCQkJT1NZTkNfTUVUQURBVEEgfCBPU1lOQ19EQVRBKTsKIAotICAgIC8qIHRoaXMgaXMgb25seSB0cnVlIG9uIGVycm9yICovCi0gICAgaWYgKHRoLnRfdHJhbnNfaWQpIHsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgdGgudF9zdXBlciwgdGgudF9ibG9ja3NfYWxsb2NhdGVkKTsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICAgICAgaWYgKGVycikgewotICAgICAgICAgICAgcmVzID0gZXJyOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChpbm9kZS0+aV9zYik7CisJcmV0dXJuIChhbHJlYWR5X3dyaXR0ZW4gIT0gMCkgPyBhbHJlYWR5X3dyaXR0ZW4gOiByZXM7CiAKLSAgICBpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX1NZTkMpIHx8IElTX1NZTkMoaW5vZGUpKQotCXJlcyA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIGZpbGUtPmZfbWFwcGluZywgT1NZTkNfTUVUQURBVEF8T1NZTkNfREFUQSk7Ci0KLSAgICB1cCgmaW5vZGUtPmlfc2VtKTsKLSAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gKGFscmVhZHlfd3JpdHRlbiAhPSAwKT9hbHJlYWR5X3dyaXR0ZW46cmVzOwotCi1vdXQ6Ci0gICAgdXAoJmlub2RlLT5pX3NlbSk7IC8vIHVubG9jayB0aGUgZmlsZSBvbiBleGl0LgotICAgIHJldHVybiByZXM7CisgICAgICBvdXQ6CisJdXAoJmlub2RlLT5pX3NlbSk7CS8vIHVubG9jayB0aGUgZmlsZSBvbiBleGl0LgorCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCiB7Ci0gICAgcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKwlyZXR1cm4gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBidWYsIGNvdW50LCBwb3MpOwogfQogCi0KLQogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19maWxlX29wZXJhdGlvbnMgPSB7Ci0gICAgLnJlYWQJPSBnZW5lcmljX2ZpbGVfcmVhZCwKLSAgICAud3JpdGUJPSByZWlzZXJmc19maWxlX3dyaXRlLAotICAgIC5pb2N0bAk9IHJlaXNlcmZzX2lvY3RsLAotICAgIC5tbWFwCT0gZ2VuZXJpY19maWxlX21tYXAsCi0gICAgLnJlbGVhc2UJPSByZWlzZXJmc19maWxlX3JlbGVhc2UsCi0gICAgLmZzeW5jCT0gcmVpc2VyZnNfc3luY19maWxlLAotICAgIC5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKLSAgICAuYWlvX3JlYWQgICA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKLSAgICAuYWlvX3dyaXRlICA9IHJlaXNlcmZzX2Fpb193cml0ZSwKKwkucmVhZCA9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZSA9IHJlaXNlcmZzX2ZpbGVfd3JpdGUsCisJLmlvY3RsID0gcmVpc2VyZnNfaW9jdGwsCisJLm1tYXAgPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkucmVsZWFzZSA9IHJlaXNlcmZzX2ZpbGVfcmVsZWFzZSwKKwkuZnN5bmMgPSByZWlzZXJmc19zeW5jX2ZpbGUsCisJLnNlbmRmaWxlID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorCS5haW9fcmVhZCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkuYWlvX3dyaXRlID0gcmVpc2VyZnNfYWlvX3dyaXRlLAogfTsKIAotCi1zdHJ1Y3QgIGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewotICAgIC50cnVuY2F0ZQk9IHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlLAotICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAotICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAorc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZSA9IHJlaXNlcmZzX3Zmc190cnVuY2F0ZV9maWxlLAorCS5zZXRhdHRyID0gcmVpc2VyZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIgPSByZWlzZXJmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSByZWlzZXJmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gcmVpc2VyZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAorCS5wZXJtaXNzaW9uID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKIH07Ci0KLQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZml4X25vZGUuYyBiL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMKaW5kZXggZTRmNjRiZS4uMjcwNmUyYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZml4X25vZGUuYworKysgYi9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCkBAIC0zNCwxNCArMzQsMTIgQEAKICAqKiAKICAqKi8KIAotCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAotCiAvKiBUbyBtYWtlIGFueSBjaGFuZ2VzIGluIHRoZSB0cmVlIHdlIGZpbmQgYSBub2RlLCB0aGF0IGNvbnRhaW5zIGl0ZW0KICAgIHRvIGJlIGNoYW5nZWQvZGVsZXRlZCBvciBwb3NpdGlvbiBpbiB0aGUgbm9kZSB3ZSBpbnNlcnQgYSBuZXcgaXRlbQogICAgdG8uIFdlIGNhbGwgdGhpcyBub2RlIFMuIFRvIGRvIGJhbGFuY2luZyB3ZSBuZWVkIHRvIGRlY2lkZSB3aGF0IHdlCkBAIC01Niw0OTAgKzU0LDUyMiBAQAogICAgaGF2ZSB0byBoYXZlIGlmIHdlIGRvIG5vdCBhbnkgc2hpZnRpbmdzLCBpZiB3ZSBzaGlmdCB0byBsZWZ0L3JpZ2h0CiAgICBuZWlnaGJvciBvciB0byBib3RoLiAqLwogCi0KIC8qIHRha2luZyBpdGVtIG51bWJlciBpbiB2aXJ0dWFsIG5vZGUsIHJldHVybnMgbnVtYmVyIG9mIGl0ZW0sIHRoYXQgaXQgaGFzIGluIHNvdXJjZSBidWZmZXIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG9sZF9pdGVtX251bSAoaW50IG5ld19udW0sIGludCBhZmZlY3RlZF9pdGVtX251bSwgaW50IG1vZGUpCitzdGF0aWMgaW5saW5lIGludCBvbGRfaXRlbV9udW0oaW50IG5ld19udW0sIGludCBhZmZlY3RlZF9pdGVtX251bSwgaW50IG1vZGUpCiB7Ci0gIGlmIChtb2RlID09IE1fUEFTVEUgfHwgbW9kZSA9PSBNX0NVVCB8fCBuZXdfbnVtIDwgYWZmZWN0ZWRfaXRlbV9udW0pCi0gICAgcmV0dXJuIG5ld19udW07CisJaWYgKG1vZGUgPT0gTV9QQVNURSB8fCBtb2RlID09IE1fQ1VUIHx8IG5ld19udW0gPCBhZmZlY3RlZF9pdGVtX251bSkKKwkJcmV0dXJuIG5ld19udW07CiAKLSAgaWYgKG1vZGUgPT0gTV9JTlNFUlQpIHsKKwlpZiAobW9kZSA9PSBNX0lOU0VSVCkgewogCi0gICAgUkZBTFNFKCBuZXdfbnVtID09IDAsIAotCSAgICAidnMtODAwNTogZm9yIElOU0VSVCBtb2RlIGFuZCBpdGVtIG51bWJlciBvZiBpbnNlcnRlZCBpdGVtIik7CisJCVJGQUxTRShuZXdfbnVtID09IDAsCisJCSAgICAgICAidnMtODAwNTogZm9yIElOU0VSVCBtb2RlIGFuZCBpdGVtIG51bWJlciBvZiBpbnNlcnRlZCBpdGVtIik7CiAKLSAgICByZXR1cm4gbmV3X251bSAtIDE7Ci0gIH0KKwkJcmV0dXJuIG5ld19udW0gLSAxOworCX0KIAotICBSRkFMU0UoIG1vZGUgIT0gTV9ERUxFVEUsCi0JICAidnMtODAxMDogb2xkX2l0ZW1fbnVtOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUgKG1vZGUgPSBcJyVjXCciLCBtb2RlKTsKLSAgLyogZGVsZXRlIG1vZGUgKi8KLSAgcmV0dXJuIG5ld19udW0gKyAxOworCVJGQUxTRShtb2RlICE9IE1fREVMRVRFLAorCSAgICAgICAidnMtODAxMDogb2xkX2l0ZW1fbnVtOiBtb2RlIG11c3QgYmUgTV9ERUxFVEUgKG1vZGUgPSBcJyVjXCciLAorCSAgICAgICBtb2RlKTsKKwkvKiBkZWxldGUgbW9kZSAqLworCXJldHVybiBuZXdfbnVtICsgMTsKIH0KIAotc3RhdGljIHZvaWQgY3JlYXRlX3ZpcnR1YWxfbm9kZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyB2b2lkIGNyZWF0ZV92aXJ0dWFsX25vZGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gICAgaW50IG5ld19udW07Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU2g7CS8qIHRoaXMgY29tZXMgZnJvbSB0Yi0+U1toXSAqLworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCWludCBuZXdfbnVtOworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2g7CS8qIHRoaXMgY29tZXMgZnJvbSB0Yi0+U1toXSAqLwogCi0gICAgU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCVNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOwogCi0gICAgLyogc2l6ZSBvZiBjaGFuZ2VkIG5vZGUgKi8KLSAgICB2bi0+dm5fc2l6ZSA9IE1BWF9DSElMRF9TSVpFIChTaCkgLSBCX0ZSRUVfU1BBQ0UgKFNoKSArIHRiLT5pbnNlcnRfc2l6ZVtoXTsKKwkvKiBzaXplIG9mIGNoYW5nZWQgbm9kZSAqLworCXZuLT52bl9zaXplID0KKwkgICAgTUFYX0NISUxEX1NJWkUoU2gpIC0gQl9GUkVFX1NQQUNFKFNoKSArIHRiLT5pbnNlcnRfc2l6ZVtoXTsKIAotICAgIC8qIGZvciBpbnRlcm5hbCBub2RlcyBhcnJheSBpZiB2aXJ0dWFsIGl0ZW1zIGlzIG5vdCBjcmVhdGVkICovCi0gICAgaWYgKGgpIHsKLQl2bi0+dm5fbnJfaXRlbSA9ICh2bi0+dm5fc2l6ZSAtIERDX1NJWkUpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgICovCi0gICAgdm4tPnZuX25yX2l0ZW0gPSBCX05SX0lURU1TIChTaCkgKyAoKHZuLT52bl9tb2RlID09IE1fSU5TRVJUKT8gMSA6IDApIC0gKCh2bi0+dm5fbW9kZSA9PSBNX0RFTEVURSk/IDEgOiAwKTsKLQotICAgIC8qIGZpcnN0IHZpcnR1YWwgaXRlbSAqLwotICAgIHZuLT52bl92aSA9IChzdHJ1Y3QgdmlydHVhbF9pdGVtICopKHRiLT50Yl92biArIDEpOwotICAgIG1lbXNldCAodm4tPnZuX3ZpLCAwLCB2bi0+dm5fbnJfaXRlbSAqIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSkpOwotICAgIHZuLT52bl9mcmVlX3B0ciArPSB2bi0+dm5fbnJfaXRlbSAqIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSk7Ci0KLQotICAgIC8qIGZpcnN0IGl0ZW0gaW4gdGhlIG5vZGUgKi8KLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChTaCwgMCk7Ci0KLSAgICAvKiBkZWZpbmUgdGhlIG1lcmdlYWJpbGl0eSBmb3IgMC10aCBpdGVtIChpZiBpdCBpcyBub3QgYmVpbmcgZGVsZXRlZCkgKi8KLSAgICBpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIFNoLT5iX3NpemUpICYmICh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0pKQotCSAgICB2bi0+dm5fdmlbMF0udmlfdHlwZSB8PSBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFOwotCi0gICAgLyogZ28gdGhyb3VnaCBhbGwgaXRlbXMgdGhvc2UgcmVtYWluIGluIHRoZSB2aXJ0dWFsIG5vZGUgKGV4Y2VwdCBmb3IgdGhlIG5ldyAoaW5zZXJ0ZWQpIG9uZSkgKi8KLSAgICBmb3IgKG5ld19udW0gPSAwOyBuZXdfbnVtIDwgdm4tPnZuX25yX2l0ZW07IG5ld19udW0gKyspIHsKLQlpbnQgajsKLQlzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkgPSB2bi0+dm5fdmkgKyBuZXdfbnVtOwotCWludCBpc19hZmZlY3RlZCA9ICgobmV3X251bSAhPSB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0pID8gMCA6IDEpOwotICAgIAotCi0JaWYgKGlzX2FmZmVjdGVkICYmIHZuLT52bl9tb2RlID09IE1fSU5TRVJUKQotCSAgICBjb250aW51ZTsKLSAgICAKLQkvKiBnZXQgaXRlbSBudW1iZXIgaW4gc291cmNlIG5vZGUgKi8KLQlqID0gb2xkX2l0ZW1fbnVtIChuZXdfbnVtLCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0sIHZuLT52bl9tb2RlKTsKLSAgICAKLQl2aS0+dmlfaXRlbV9sZW4gKz0gaWhfaXRlbV9sZW4oaWggKyBqKSArIElIX1NJWkU7Ci0JdmktPnZpX2loID0gaWggKyBqOwotCXZpLT52aV9pdGVtID0gQl9JX1BJVEVNIChTaCwgaWggKyBqKTsKLQl2aS0+dmlfdWFyZWEgPSB2bi0+dm5fZnJlZV9wdHI7Ci0KLQkvLyBGSVhNRTogdGhlcmUgaXMgbm8gY2hlY2ssIHRoYXQgaXRlbSBvcGVyYXRpb24gZGlkIG5vdAotCS8vIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5Ci0Jdm4tPnZuX2ZyZWVfcHRyICs9IG9wX2NyZWF0ZV92aSAodm4sIHZpLCBpc19hZmZlY3RlZCwgdGItPmluc2VydF9zaXplIFswXSk7Ci0JaWYgKHRiLT52bl9idWYgKyB0Yi0+dm5fYnVmX3NpemUgPCB2bi0+dm5fZnJlZV9wdHIpCi0JICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MDMwOiBjcmVhdGVfdmlydHVhbF9ub2RlOiAiCi0JCQkgICAgInZpcnR1YWwgbm9kZSBzcGFjZSBjb25zdW1lZCIpOwotCi0JaWYgKCFpc19hZmZlY3RlZCkKLQkgICAgLyogdGhpcyBpcyBub3QgYmVpbmcgY2hhbmdlZCAqLwotCSAgICBjb250aW51ZTsKLSAgICAKLQlpZiAodm4tPnZuX21vZGUgPT0gTV9QQVNURSB8fCB2bi0+dm5fbW9kZSA9PSBNX0NVVCkgewotCSAgICB2bi0+dm5fdmlbbmV3X251bV0udmlfaXRlbV9sZW4gKz0gdGItPmluc2VydF9zaXplWzBdOwotCSAgICB2aS0+dmlfbmV3X2RhdGEgPSB2bi0+dm5fZGF0YTsgLy8gcG9pbnRlciB0byBkYXRhIHdoaWNoIGlzIGdvaW5nIHRvIGJlIHBhc3RlZAorCS8qIGZvciBpbnRlcm5hbCBub2RlcyBhcnJheSBpZiB2aXJ0dWFsIGl0ZW1zIGlzIG5vdCBjcmVhdGVkICovCisJaWYgKGgpIHsKKwkJdm4tPnZuX25yX2l0ZW0gPSAodm4tPnZuX3NpemUgLSBEQ19TSVpFKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCQlyZXR1cm47CiAJfQotICAgIH0KIAotICAKLSAgICAvKiB2aXJ0dWFsIGluc2VydGVkIGl0ZW0gaXMgbm90IGRlZmluZWQgeWV0ICovCi0gICAgaWYgKHZuLT52bl9tb2RlID09IE1fSU5TRVJUKSB7Ci0Jc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtOwotICAgICAgCi0JUkZBTFNFKCB2bi0+dm5faW5zX2loID09IDAsCi0JCSJ2cy04MDQwOiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtIGlzIG5vdCBzcGVjaWZpZWQiKTsKLQl2aS0+dmlfaXRlbV9sZW4gPSB0Yi0+aW5zZXJ0X3NpemVbMF07Ci0JdmktPnZpX2loID0gdm4tPnZuX2luc19paDsKLQl2aS0+dmlfaXRlbSA9IHZuLT52bl9kYXRhOwotCXZpLT52aV91YXJlYSA9IHZuLT52bl9mcmVlX3B0cjsKLQkKLQlvcF9jcmVhdGVfdmkgKHZuLCB2aSwgMC8qbm90IHBhc3RlZCBvciBjdXQqLywgdGItPmluc2VydF9zaXplIFswXSk7Ci0gICAgfQotICAKLSAgICAvKiBzZXQgcmlnaHQgbWVyZ2UgZmxhZyB3ZSB0YWtlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGFuZCBjaGVjayB3aGV0aGVyIGl0IGlzIGEgbWVyZ2VhYmxlIGl0ZW0gKi8KLSAgICBpZiAodGItPkNGUlswXSkgewotCXN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisJLyogbnVtYmVyIG9mIGl0ZW1zIGluIHZpcnR1YWwgbm9kZSAgKi8KKwl2bi0+dm5fbnJfaXRlbSA9CisJICAgIEJfTlJfSVRFTVMoU2gpICsgKCh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkgPyAxIDogMCkgLQorCSAgICAoKHZuLT52bl9tb2RlID09IE1fREVMRVRFKSA/IDEgOiAwKTsKIAotCWtleSA9IEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSk7Ci0JaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlIChrZXksIFNoLT5iX3NpemUpICYmICh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fAotCQkJCQkJICAgICAgIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSAhPSBCX05SX0lURU1TIChTaCkgLSAxKSkKLQkJdm4tPnZuX3ZpW3ZuLT52bl9ucl9pdGVtLTFdLnZpX3R5cGUgfD0gVklfVFlQRV9SSUdIVF9NRVJHRUFCTEU7CisJLyogZmlyc3QgdmlydHVhbCBpdGVtICovCisJdm4tPnZuX3ZpID0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKikodGItPnRiX3ZuICsgMSk7CisJbWVtc2V0KHZuLT52bl92aSwgMCwgdm4tPnZuX25yX2l0ZW0gKiBzaXplb2Yoc3RydWN0IHZpcnR1YWxfaXRlbSkpOworCXZuLT52bl9mcmVlX3B0ciArPSB2bi0+dm5fbnJfaXRlbSAqIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9pdGVtKTsKKworCS8qIGZpcnN0IGl0ZW0gaW4gdGhlIG5vZGUgKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKFNoLCAwKTsKKworCS8qIGRlZmluZSB0aGUgbWVyZ2VhYmlsaXR5IGZvciAwLXRoIGl0ZW0gKGlmIGl0IGlzIG5vdCBiZWluZyBkZWxldGVkKSAqLworCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSgmKGloLT5paF9rZXkpLCBTaC0+Yl9zaXplKQorCSAgICAmJiAodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSkKKwkJdm4tPnZuX3ZpWzBdLnZpX3R5cGUgfD0gVklfVFlQRV9MRUZUX01FUkdFQUJMRTsKKworCS8qIGdvIHRocm91Z2ggYWxsIGl0ZW1zIHRob3NlIHJlbWFpbiBpbiB0aGUgdmlydHVhbCBub2RlIChleGNlcHQgZm9yIHRoZSBuZXcgKGluc2VydGVkKSBvbmUpICovCisJZm9yIChuZXdfbnVtID0gMDsgbmV3X251bSA8IHZuLT52bl9ucl9pdGVtOyBuZXdfbnVtKyspIHsKKwkJaW50IGo7CisJCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpID0gdm4tPnZuX3ZpICsgbmV3X251bTsKKwkJaW50IGlzX2FmZmVjdGVkID0KKwkJICAgICgobmV3X251bSAhPSB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0pID8gMCA6IDEpOworCisJCWlmIChpc19hZmZlY3RlZCAmJiB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGdldCBpdGVtIG51bWJlciBpbiBzb3VyY2Ugbm9kZSAqLworCQlqID0gb2xkX2l0ZW1fbnVtKG5ld19udW0sIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSwKKwkJCQkgdm4tPnZuX21vZGUpOworCisJCXZpLT52aV9pdGVtX2xlbiArPSBpaF9pdGVtX2xlbihpaCArIGopICsgSUhfU0laRTsKKwkJdmktPnZpX2loID0gaWggKyBqOworCQl2aS0+dmlfaXRlbSA9IEJfSV9QSVRFTShTaCwgaWggKyBqKTsKKwkJdmktPnZpX3VhcmVhID0gdm4tPnZuX2ZyZWVfcHRyOworCisJCS8vIEZJWE1FOiB0aGVyZSBpcyBubyBjaGVjaywgdGhhdCBpdGVtIG9wZXJhdGlvbiBkaWQgbm90CisJCS8vIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5CisJCXZuLT52bl9mcmVlX3B0ciArPQorCQkgICAgb3BfY3JlYXRlX3ZpKHZuLCB2aSwgaXNfYWZmZWN0ZWQsIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJCWlmICh0Yi0+dm5fYnVmICsgdGItPnZuX2J1Zl9zaXplIDwgdm4tPnZuX2ZyZWVfcHRyKQorCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAidnMtODAzMDogY3JlYXRlX3ZpcnR1YWxfbm9kZTogIgorCQkJCSAgICAgICAidmlydHVhbCBub2RlIHNwYWNlIGNvbnN1bWVkIik7CisKKwkJaWYgKCFpc19hZmZlY3RlZCkKKwkJCS8qIHRoaXMgaXMgbm90IGJlaW5nIGNoYW5nZWQgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSB7CisJCQl2bi0+dm5fdmlbbmV3X251bV0udmlfaXRlbV9sZW4gKz0gdGItPmluc2VydF9zaXplWzBdOworCQkJdmktPnZpX25ld19kYXRhID0gdm4tPnZuX2RhdGE7CS8vIHBvaW50ZXIgdG8gZGF0YSB3aGljaCBpcyBnb2luZyB0byBiZSBwYXN0ZWQKKwkJfQorCX0KKworCS8qIHZpcnR1YWwgaW5zZXJ0ZWQgaXRlbSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KKwlpZiAodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpIHsKKwkJc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkgPSB2bi0+dm5fdmkgKyB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW07CisKKwkJUkZBTFNFKHZuLT52bl9pbnNfaWggPT0gMCwKKwkJICAgICAgICJ2cy04MDQwOiBpdGVtIGhlYWRlciBvZiBpbnNlcnRlZCBpdGVtIGlzIG5vdCBzcGVjaWZpZWQiKTsKKwkJdmktPnZpX2l0ZW1fbGVuID0gdGItPmluc2VydF9zaXplWzBdOworCQl2aS0+dmlfaWggPSB2bi0+dm5faW5zX2loOworCQl2aS0+dmlfaXRlbSA9IHZuLT52bl9kYXRhOworCQl2aS0+dmlfdWFyZWEgPSB2bi0+dm5fZnJlZV9wdHI7CisKKwkJb3BfY3JlYXRlX3ZpKHZuLCB2aSwgMCAvKm5vdCBwYXN0ZWQgb3IgY3V0ICovICwKKwkJCSAgICAgdGItPmluc2VydF9zaXplWzBdKTsKKwl9CisKKwkvKiBzZXQgcmlnaHQgbWVyZ2UgZmxhZyB3ZSB0YWtlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGFuZCBjaGVjayB3aGV0aGVyIGl0IGlzIGEgbWVyZ2VhYmxlIGl0ZW0gKi8KKwlpZiAodGItPkNGUlswXSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXk7CisKKwkJa2V5ID0gQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSwgdGItPnJrZXlbMF0pOworCQlpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUoa2V5LCBTaC0+Yl9zaXplKQorCQkgICAgJiYgKHZuLT52bl9tb2RlICE9IE1fREVMRVRFCisJCQl8fCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gIT0gQl9OUl9JVEVNUyhTaCkgLSAxKSkKKwkJCXZuLT52bl92aVt2bi0+dm5fbnJfaXRlbSAtIDFdLnZpX3R5cGUgfD0KKwkJCSAgICBWSV9UWVBFX1JJR0hUX01FUkdFQUJMRTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCWlmIChvcF9pc19sZWZ0X21lcmdlYWJsZSAoa2V5LCBTaC0+Yl9zaXplKSAmJgotCSAgICAhKHZuLT52bl9tb2RlICE9IE1fREVMRVRFIHx8IHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSAhPSBCX05SX0lURU1TIChTaCkgLSAxKSApIHsKLQkgICAgLyogd2UgZGVsZXRlIGxhc3QgaXRlbSBhbmQgaXQgY291bGQgYmUgbWVyZ2VkIHdpdGggcmlnaHQgbmVpZ2hib3IncyBmaXJzdCBpdGVtICovCi0JICAgIGlmICghKEJfTlJfSVRFTVMgKFNoKSA9PSAxICYmIGlzX2RpcmVudHJ5X2xlX2loIChCX05fUElURU1fSEVBRCAoU2gsIDApKSAmJgotCQkgIElfRU5UUllfQ09VTlQgKEJfTl9QSVRFTV9IRUFEIChTaCwgMCkpID09IDEpKSB7Ci0JCS8qIG5vZGUgY29udGFpbnMgbW9yZSB0aGFuIDEgaXRlbSwgb3IgaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0sIG9yIHRoaXMgaXRlbSBjb250YWlucyBtb3JlIHRoYW4gMSBlbnRyeSAqLwotCQlwcmludF9ibG9jayAoU2gsIDAsIC0xLCAtMSk7Ci0JCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MDQ1OiBjcmVhdGVfdmlydHVhbF9ub2RlOiByZGtleSAlaywgYWZmZWN0ZWQgaXRlbT09JWQgKG1vZGU9PSVjKSBNdXN0IGJlICVjIiwgCi0JCQkJa2V5LCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0sIHZuLT52bl9tb2RlLCBNX0RFTEVURSk7Ci0JICAgIH0gZWxzZQotCQkvKiB3ZSBjYW4gZGVsZXRlIGRpcmVjdG9yeSBpdGVtLCB0aGF0IGhhcyBvbmx5IG9uZSBkaXJlY3RvcnkgZW50cnkgaW4gaXQgKi8KLQkJOwotCX0KKwkJaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlKGtleSwgU2gtPmJfc2l6ZSkgJiYKKwkJICAgICEodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUKKwkJICAgICAgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtICE9IEJfTlJfSVRFTVMoU2gpIC0gMSkpIHsKKwkJCS8qIHdlIGRlbGV0ZSBsYXN0IGl0ZW0gYW5kIGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHJpZ2h0IG5laWdoYm9yJ3MgZmlyc3QgaXRlbSAqLworCQkJaWYgKCEKKwkJCSAgICAoQl9OUl9JVEVNUyhTaCkgPT0gMQorCQkJICAgICAmJiBpc19kaXJlbnRyeV9sZV9paChCX05fUElURU1fSEVBRChTaCwgMCkpCisJCQkgICAgICYmIElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoU2gsIDApKSA9PSAxKSkgeworCQkJCS8qIG5vZGUgY29udGFpbnMgbW9yZSB0aGFuIDEgaXRlbSwgb3IgaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0sIG9yIHRoaXMgaXRlbSBjb250YWlucyBtb3JlIHRoYW4gMSBlbnRyeSAqLworCQkJCXByaW50X2Jsb2NrKFNoLCAwLCAtMSwgLTEpOworCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJ2cy04MDQ1OiBjcmVhdGVfdmlydHVhbF9ub2RlOiByZGtleSAlaywgYWZmZWN0ZWQgaXRlbT09JWQgKG1vZGU9PSVjKSBNdXN0IGJlICVjIiwKKwkJCQkJICAgICAgIGtleSwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtLAorCQkJCQkgICAgICAgdm4tPnZuX21vZGUsIE1fREVMRVRFKTsKKwkJCX0gZWxzZQorCQkJCS8qIHdlIGNhbiBkZWxldGUgZGlyZWN0b3J5IGl0ZW0sIHRoYXQgaGFzIG9ubHkgb25lIGRpcmVjdG9yeSBlbnRyeSBpbiBpdCAqLworCQkJCTsKKwkJfQogI2VuZGlmCi0gICAgCi0gICAgfQotfQogCisJfQorfQogCiAvKiB1c2luZyB2aXJ0dWFsIG5vZGUgY2hlY2ssIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzaGlmdGVkIHRvIGxlZnQKICAgIG5laWdoYm9yICovCi1zdGF0aWMgdm9pZCBjaGVja19sZWZ0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoLCBpbnQgY3VyX2ZyZWUpCitzdGF0aWMgdm9pZCBjaGVja19sZWZ0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgaW50IGN1cl9mcmVlKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7Ci0gICAgaW50IGRfc2l6ZSwgaWhfc2l6ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aTsKKwlpbnQgZF9zaXplLCBpaF9zaXplOwogCi0gICAgUkZBTFNFKCBjdXJfZnJlZSA8IDAsICJ2cy04MDUwOiBjdXJfZnJlZSAoJWQpIDwgMCIsIGN1cl9mcmVlKTsKKwlSRkFMU0UoY3VyX2ZyZWUgPCAwLCAidnMtODA1MDogY3VyX2ZyZWUgKCVkKSA8IDAiLCBjdXJfZnJlZSk7CiAKLSAgICAvKiBpbnRlcm5hbCBsZXZlbCAqLwotICAgIGlmIChoID4gMCkgewkKLQl0Yi0+bG51bVtoXSA9IGN1cl9mcmVlIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGxlYWYgbGV2ZWwgKi8KLQotICAgIGlmICghY3VyX2ZyZWUgfHwgIXZuLT52bl9ucl9pdGVtKSB7Ci0JLyogbm8gZnJlZSBzcGFjZSBvciBub3RoaW5nIHRvIG1vdmUgKi8KLQl0Yi0+bG51bVtoXSA9IDA7Ci0JdGItPmxieXRlcyA9IC0xOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBSRkFMU0UoICFQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApLAotCSAgICAidnMtODA1NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKLQotICAgIHZpID0gdm4tPnZuX3ZpOwotICAgIGlmICgodW5zaWduZWQgaW50KWN1cl9mcmVlID49ICh2bi0+dm5fc2l6ZSAtICgodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKLQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gTFswXSAqLwotCi0JUkZBTFNFKCB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAotCQkidnMtODA1NTogaW52YWxpZCBtb2RlIG9yIGJhbGFuY2UgY29uZGl0aW9uIGZhaWxlZCIpOwotCi0JdGItPmxudW1bMF0gPSB2bi0+dm5fbnJfaXRlbTsKLQl0Yi0+bGJ5dGVzID0gLTE7Ci0JcmV0dXJuOwotICAgIH0KLSAgCi0KLSAgICBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKLQotICAgIC8qIGZpcnN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggbGFzdCBpdGVtIGluIGxlZnQgbmVpZ2hib3IgKi8KLSAgICBpZiAodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQotCWRfc2l6ZSA9IC0oKGludClJSF9TSVpFKSwgaWhfc2l6ZSA9IDA7Ci0KLSAgICB0Yi0+bG51bVswXSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHZuLT52bl9ucl9pdGVtOyBpICsrLCBpaF9zaXplID0gSUhfU0laRSwgZF9zaXplID0gMCwgdmkgKyspIHsKLQlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOwotCWlmIChjdXJfZnJlZSA+PSBkX3NpemUpIHsJCi0JICAgIC8qIHRoZSBpdGVtIGNhbiBiZSBzaGlmdGVkIGVudGlyZWx5ICovCi0JICAgIGN1cl9mcmVlIC09IGRfc2l6ZTsKLQkgICAgdGItPmxudW1bMF0gKys7Ci0JICAgIGNvbnRpbnVlOworCS8qIGludGVybmFsIGxldmVsICovCisJaWYgKGggPiAwKSB7CisJCXRiLT5sbnVtW2hdID0gY3VyX2ZyZWUgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKKwkJcmV0dXJuOwogCX0KLSAgICAgIAotCS8qIHRoZSBpdGVtIGNhbm5vdCBiZSBzaGlmdGVkIGVudGlyZWx5LCB0cnkgdG8gc3BsaXQgaXQgKi8KLQkvKiBjaGVjayB3aGV0aGVyIExbMF0gY2FuIGhvbGQgaWggYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIHRoZSBpdGVtIGJvZHkgKi8KLQlpZiAoY3VyX2ZyZWUgPD0gaWhfc2l6ZSkgewotCSAgICAvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLwotCSAgICB0Yi0+bGJ5dGVzID0gLTE7Ci0JICAgIHJldHVybjsKKworCS8qIGxlYWYgbGV2ZWwgKi8KKworCWlmICghY3VyX2ZyZWUgfHwgIXZuLT52bl9ucl9pdGVtKSB7CisJCS8qIG5vIGZyZWUgc3BhY2Ugb3Igbm90aGluZyB0byBtb3ZlICovCisJCXRiLT5sbnVtW2hdID0gMDsKKwkJdGItPmxieXRlcyA9IC0xOworCQlyZXR1cm47CiAJfQotCWN1cl9mcmVlIC09IGloX3NpemU7Ci0gICAgCi0JdGItPmxieXRlcyA9IG9wX2NoZWNrX2xlZnQgKHZpLCBjdXJfZnJlZSwgMCwgMCk7Ci0JaWYgKHRiLT5sYnl0ZXMgIT0gLTEpCi0JICAgIC8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KLQkgICAgdGItPmxudW1bMF0gKys7Ci0gICAgCi0JYnJlYWs7Ci0gICAgfQotICAKLSAgICByZXR1cm47CisKKwlSRkFMU0UoIVBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwKKwkgICAgICAgInZzLTgwNTU6IHBhcmVudCBkb2VzIG5vdCBleGlzdCBvciBpbnZhbGlkIik7CisKKwl2aSA9IHZuLT52bl92aTsKKwlpZiAoKHVuc2lnbmVkIGludCljdXJfZnJlZSA+PQorCSAgICAodm4tPnZuX3NpemUgLQorCSAgICAgKCh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfTEVGVF9NRVJHRUFCTEUpID8gSUhfU0laRSA6IDApKSkgeworCQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gTFswXSAqLworCisJCVJGQUxTRSh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAorCQkgICAgICAgInZzLTgwNTU6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKworCQl0Yi0+bG51bVswXSA9IHZuLT52bl9ucl9pdGVtOworCQl0Yi0+bGJ5dGVzID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKKworCS8qIGZpcnN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggbGFzdCBpdGVtIGluIGxlZnQgbmVpZ2hib3IgKi8KKwlpZiAodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQorCQlkX3NpemUgPSAtKChpbnQpSUhfU0laRSksIGloX3NpemUgPSAwOworCisJdGItPmxudW1bMF0gPSAwOworCWZvciAoaSA9IDA7IGkgPCB2bi0+dm5fbnJfaXRlbTsKKwkgICAgIGkrKywgaWhfc2l6ZSA9IElIX1NJWkUsIGRfc2l6ZSA9IDAsIHZpKyspIHsKKwkJZF9zaXplICs9IHZpLT52aV9pdGVtX2xlbjsKKwkJaWYgKGN1cl9mcmVlID49IGRfc2l6ZSkgeworCQkJLyogdGhlIGl0ZW0gY2FuIGJlIHNoaWZ0ZWQgZW50aXJlbHkgKi8KKwkJCWN1cl9mcmVlIC09IGRfc2l6ZTsKKwkJCXRiLT5sbnVtWzBdKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHRoZSBpdGVtIGNhbm5vdCBiZSBzaGlmdGVkIGVudGlyZWx5LCB0cnkgdG8gc3BsaXQgaXQgKi8KKwkJLyogY2hlY2sgd2hldGhlciBMWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJCWlmIChjdXJfZnJlZSA8PSBpaF9zaXplKSB7CisJCQkvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLworCQkJdGItPmxieXRlcyA9IC0xOworCQkJcmV0dXJuOworCQl9CisJCWN1cl9mcmVlIC09IGloX3NpemU7CisKKwkJdGItPmxieXRlcyA9IG9wX2NoZWNrX2xlZnQodmksIGN1cl9mcmVlLCAwLCAwKTsKKwkJaWYgKHRiLT5sYnl0ZXMgIT0gLTEpCisJCQkvKiBjb3VudCBwYXJ0aWFsbHkgc2hpZnRlZCBpdGVtICovCisJCQl0Yi0+bG51bVswXSsrOworCisJCWJyZWFrOworCX0KKworCXJldHVybjsKIH0KIAotCiAvKiB1c2luZyB2aXJ0dWFsIG5vZGUgY2hlY2ssIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzaGlmdGVkIHRvIHJpZ2h0CiAgICBuZWlnaGJvciAqLwotc3RhdGljIHZvaWQgY2hlY2tfcmlnaHQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsIGludCBjdXJfZnJlZSkKK3N0YXRpYyB2b2lkIGNoZWNrX3JpZ2h0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgaW50IGN1cl9mcmVlKQogewotICAgIGludCBpOwotICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7Ci0gICAgaW50IGRfc2l6ZSwgaWhfc2l6ZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aTsKKwlpbnQgZF9zaXplLCBpaF9zaXplOwogCi0gICAgUkZBTFNFKCBjdXJfZnJlZSA8IDAsICJ2cy04MDcwOiBjdXJfZnJlZSA8IDAiKTsKLSAgICAKLSAgICAvKiBpbnRlcm5hbCBsZXZlbCAqLwotICAgIGlmIChoID4gMCkgewotCXRiLT5ybnVtW2hdID0gY3VyX2ZyZWUgLyAoRENfU0laRSArIEtFWV9TSVpFKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8qIGxlYWYgbGV2ZWwgKi8KLSAgICAKLSAgICBpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgewotCS8qIG5vIGZyZWUgc3BhY2UgICovCi0JdGItPnJudW1baF0gPSAwOwotCXRiLT5yYnl0ZXMgPSAtMTsKLQlyZXR1cm47Ci0gICAgfQotICAKLSAgICBSRkFMU0UoICFQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApLAotCSAgICAidnMtODA3NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKLSAgCi0gICAgdmkgPSB2bi0+dm5fdmkgKyB2bi0+dm5fbnJfaXRlbSAtIDE7Ci0gICAgaWYgKCh1bnNpZ25lZCBpbnQpY3VyX2ZyZWUgPj0gKHZuLT52bl9zaXplIC0gKCh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKLQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gUlswXSAqLwotCQotCVJGQUxTRSggdm4tPnZuX21vZGUgPT0gTV9JTlNFUlQgfHwgdm4tPnZuX21vZGUgPT0gTV9QQVNURSwKLQkJInZzLTgwODA6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKwlSRkFMU0UoY3VyX2ZyZWUgPCAwLCAidnMtODA3MDogY3VyX2ZyZWUgPCAwIik7CiAKLQl0Yi0+cm51bVtoXSA9IHZuLT52bl9ucl9pdGVtOwotCXRiLT5yYnl0ZXMgPSAtMTsKLQlyZXR1cm47Ci0gICAgfQotICAgIAotICAgIGRfc2l6ZSA9IDAsIGloX3NpemUgPSBJSF9TSVpFOwotICAgIAotICAgIC8qIGxhc3QgaXRlbSBtYXkgYmUgbWVyZ2Ugd2l0aCBmaXJzdCBpdGVtIGluIHJpZ2h0IG5laWdoYm9yICovCi0gICAgaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpCi0JZF9zaXplID0gLShpbnQpSUhfU0laRSwgaWhfc2l6ZSA9IDA7Ci0KLSAgICB0Yi0+cm51bVswXSA9IDA7Ci0gICAgZm9yIChpID0gdm4tPnZuX25yX2l0ZW0gLSAxOyBpID49IDA7IGkgLS0sIGRfc2l6ZSA9IDAsIGloX3NpemUgPSBJSF9TSVpFLCB2aSAtLSkgewotCWRfc2l6ZSArPSB2aS0+dmlfaXRlbV9sZW47Ci0JaWYgKGN1cl9mcmVlID49IGRfc2l6ZSkgewkKLQkgICAgLyogdGhlIGl0ZW0gY2FuIGJlIHNoaWZ0ZWQgZW50aXJlbHkgKi8KLQkgICAgY3VyX2ZyZWUgLT0gZF9zaXplOwotCSAgICB0Yi0+cm51bVswXSArKzsKLQkgICAgY29udGludWU7CisJLyogaW50ZXJuYWwgbGV2ZWwgKi8KKwlpZiAoaCA+IDApIHsKKwkJdGItPnJudW1baF0gPSBjdXJfZnJlZSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCQlyZXR1cm47CiAJfQotCQotCS8qIGNoZWNrIHdoZXRoZXIgUlswXSBjYW4gaG9sZCBpaCBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgdGhlIGl0ZW0gYm9keSAqLwotCWlmICggY3VyX2ZyZWUgPD0gaWhfc2l6ZSApIHsgICAgLyogY2Fubm90IHNoaWZ0IGV2ZW4gYSBwYXJ0IG9mIHRoZSBjdXJyZW50IGl0ZW0gKi8KLQkgICAgdGItPnJieXRlcyA9IC0xOwotCSAgICByZXR1cm47Ci0JfQotCQotCS8qIFJbMF0gY2FuIGhvbGQgdGhlIGhlYWRlciBvZiB0aGUgaXRlbSBhbmQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgaXRzIGJvZHkgKi8KLQljdXJfZnJlZSAtPSBpaF9zaXplOwkvKiBjdXJfZnJlZSBpcyBzdGlsbCA+IDAgKi8KIAotCXRiLT5yYnl0ZXMgPSBvcF9jaGVja19yaWdodCAodmksIGN1cl9mcmVlKTsKLQlpZiAodGItPnJieXRlcyAhPSAtMSkKLQkgICAgLyogY291bnQgcGFydGlhbGx5IHNoaWZ0ZWQgaXRlbSAqLwotCSAgICB0Yi0+cm51bVswXSArKzsKLSAgICAKLQlicmVhazsKLSAgICB9Ci0JCi0gIHJldHVybjsKKwkvKiBsZWFmIGxldmVsICovCisKKwlpZiAoIWN1cl9mcmVlIHx8ICF2bi0+dm5fbnJfaXRlbSkgeworCQkvKiBubyBmcmVlIHNwYWNlICAqLworCQl0Yi0+cm51bVtoXSA9IDA7CisJCXRiLT5yYnl0ZXMgPSAtMTsKKwkJcmV0dXJuOworCX0KKworCVJGQUxTRSghUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApLAorCSAgICAgICAidnMtODA3NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKKworCXZpID0gdm4tPnZuX3ZpICsgdm4tPnZuX25yX2l0ZW0gLSAxOworCWlmICgodW5zaWduZWQgaW50KWN1cl9mcmVlID49CisJICAgICh2bi0+dm5fc2l6ZSAtCisJICAgICAoKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpID8gSUhfU0laRSA6IDApKSkgeworCQkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gUlswXSAqLworCisJCVJGQUxTRSh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAorCQkgICAgICAgInZzLTgwODA6IGludmFsaWQgbW9kZSBvciBiYWxhbmNlIGNvbmRpdGlvbiBmYWlsZWQiKTsKKworCQl0Yi0+cm51bVtoXSA9IHZuLT52bl9ucl9pdGVtOworCQl0Yi0+cmJ5dGVzID0gLTE7CisJCXJldHVybjsKKwl9CisKKwlkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKKworCS8qIGxhc3QgaXRlbSBtYXkgYmUgbWVyZ2Ugd2l0aCBmaXJzdCBpdGVtIGluIHJpZ2h0IG5laWdoYm9yICovCisJaWYgKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpCisJCWRfc2l6ZSA9IC0oaW50KUlIX1NJWkUsIGloX3NpemUgPSAwOworCisJdGItPnJudW1bMF0gPSAwOworCWZvciAoaSA9IHZuLT52bl9ucl9pdGVtIC0gMTsgaSA+PSAwOworCSAgICAgaS0tLCBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRSwgdmktLSkgeworCQlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOworCQlpZiAoY3VyX2ZyZWUgPj0gZF9zaXplKSB7CisJCQkvKiB0aGUgaXRlbSBjYW4gYmUgc2hpZnRlZCBlbnRpcmVseSAqLworCQkJY3VyX2ZyZWUgLT0gZF9zaXplOworCQkJdGItPnJudW1bMF0rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogY2hlY2sgd2hldGhlciBSWzBdIGNhbiBob2xkIGloIGFuZCBhdCBsZWFzdCBvbmUgYnl0ZSBvZiB0aGUgaXRlbSBib2R5ICovCisJCWlmIChjdXJfZnJlZSA8PSBpaF9zaXplKSB7CS8qIGNhbm5vdCBzaGlmdCBldmVuIGEgcGFydCBvZiB0aGUgY3VycmVudCBpdGVtICovCisJCQl0Yi0+cmJ5dGVzID0gLTE7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBSWzBdIGNhbiBob2xkIHRoZSBoZWFkZXIgb2YgdGhlIGl0ZW0gYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIGl0cyBib2R5ICovCisJCWN1cl9mcmVlIC09IGloX3NpemU7CS8qIGN1cl9mcmVlIGlzIHN0aWxsID4gMCAqLworCisJCXRiLT5yYnl0ZXMgPSBvcF9jaGVja19yaWdodCh2aSwgY3VyX2ZyZWUpOworCQlpZiAodGItPnJieXRlcyAhPSAtMSkKKwkJCS8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KKwkJCXRiLT5ybnVtWzBdKys7CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOwogfQogCi0KIC8qCiAgKiBmcm9tIC0gbnVtYmVyIG9mIGl0ZW1zLCB3aGljaCBhcmUgc2hpZnRlZCB0byBsZWZ0IG5laWdoYm9yIGVudGlyZWx5CiAgKiB0byAtIG51bWJlciBvZiBpdGVtLCB3aGljaCBhcmUgc2hpZnRlZCB0byByaWdodCBuZWlnaGJvciBlbnRpcmVseQogICogZnJvbV9ieXRlcyAtIG51bWJlciBvZiBieXRlcyBvZiBib3VuZGFyeSBpdGVtIChvciBkaXJlY3RvcnkgZW50cmllcykgd2hpY2ggYXJlIHNoaWZ0ZWQgdG8gbGVmdCBuZWlnaGJvcgogICogdG9fYnl0ZXMgLSBudW1iZXIgb2YgYnl0ZXMgb2YgYm91bmRhcnkgaXRlbSAob3IgZGlyZWN0b3J5IGVudHJpZXMpIHdoaWNoIGFyZSBzaGlmdGVkIHRvIHJpZ2h0IG5laWdoYm9yICovCi1zdGF0aWMgaW50IGdldF9udW1fdmVyIChpbnQgbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwKLQkJCWludCBmcm9tLCBpbnQgZnJvbV9ieXRlcywKLQkJCWludCB0bywgICBpbnQgdG9fYnl0ZXMsCi0JCQlzaG9ydCAqIHNudW0wMTIsIGludCBmbG93Ci0gICAgKQorc3RhdGljIGludCBnZXRfbnVtX3ZlcihpbnQgbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoLAorCQkgICAgICAgaW50IGZyb20sIGludCBmcm9tX2J5dGVzLAorCQkgICAgICAgaW50IHRvLCBpbnQgdG9fYnl0ZXMsIHNob3J0ICpzbnVtMDEyLCBpbnQgZmxvdykKIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgY3VyX2ZyZWU7Ci0gICAgLy8gICAgaW50IGJ5dGVzOwotICAgIGludCB1bml0czsKLSAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gICAgLy8gICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpOworCWludCBpOworCWludCBjdXJfZnJlZTsKKwkvLyAgICBpbnQgYnl0ZXM7CisJaW50IHVuaXRzOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCS8vICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aTsKIAotICAgIGludCB0b3RhbF9ub2RlX3NpemUsIG1heF9ub2RlX3NpemUsIGN1cnJlbnRfaXRlbV9zaXplOwotICAgIGludCBuZWVkZWRfbm9kZXM7Ci0gICAgaW50IHN0YXJ0X2l0ZW0sIAkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIHN0YXJ0IGZpbGxpbmcgbm9kZSBmcm9tICovCi0JZW5kX2l0ZW0sCS8qIHBvc2l0aW9uIG9mIGl0ZW0gd2UgZmluaXNoIGZpbGxpbmcgbm9kZSBieSAqLwotCXN0YXJ0X2J5dGVzLC8qIG51bWJlciBvZiBmaXJzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBzdGFydF9pdGVtLXRoIGl0ZW0gCi0JCSAgICAgICB3ZSBkbyBub3QgaW5jbHVkZSBpbnRvIG5vZGUgdGhhdCBpcyBiZWluZyBmaWxsZWQgKi8KLQllbmRfYnl0ZXM7CS8qIG51bWJlciBvZiBsYXN0IGJ5dGVzIChlbnRyaWVzIGZvciBkaXJlY3RvcnkpIG9mIGVuZF9pdGVtLXRoIGl0ZW0gCi0JCQkgICB3ZSBkbyBub2RlIGluY2x1ZGUgaW50byBub2RlIHRoYXQgaXMgYmVpbmcgZmlsbGVkICovCi0gICAgaW50IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzJdOyAvKiB0aGVzZSBhcmUgcG9zaXRpb25zIGluIHZpcnR1YWwgaXRlbSBvZgotCQkJCSAgICBpdGVtcywgdGhhdCBhcmUgc3BsaXQgYmV0d2VlbiBTWzBdIGFuZAotCQkJCSAgICBTMW5ldyBhbmQgUzFuZXcgYW5kIFMybmV3ICovCisJaW50IHRvdGFsX25vZGVfc2l6ZSwgbWF4X25vZGVfc2l6ZSwgY3VycmVudF9pdGVtX3NpemU7CisJaW50IG5lZWRlZF9ub2RlczsKKwlpbnQgc3RhcnRfaXRlbSwJCS8qIHBvc2l0aW9uIG9mIGl0ZW0gd2Ugc3RhcnQgZmlsbGluZyBub2RlIGZyb20gKi8KKwkgZW5kX2l0ZW0sCQkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIGZpbmlzaCBmaWxsaW5nIG5vZGUgYnkgKi8KKwkgc3RhcnRfYnl0ZXMsCQkvKiBudW1iZXIgb2YgZmlyc3QgYnl0ZXMgKGVudHJpZXMgZm9yIGRpcmVjdG9yeSkgb2Ygc3RhcnRfaXRlbS10aCBpdGVtIAorCQkJCSAgIHdlIGRvIG5vdCBpbmNsdWRlIGludG8gbm9kZSB0aGF0IGlzIGJlaW5nIGZpbGxlZCAqLworCSBlbmRfYnl0ZXM7CQkvKiBudW1iZXIgb2YgbGFzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBlbmRfaXRlbS10aCBpdGVtIAorCQkJCSAgIHdlIGRvIG5vZGUgaW5jbHVkZSBpbnRvIG5vZGUgdGhhdCBpcyBiZWluZyBmaWxsZWQgKi8KKwlpbnQgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMl07CS8qIHRoZXNlIGFyZSBwb3NpdGlvbnMgaW4gdmlydHVhbCBpdGVtIG9mCisJCQkJCSAgIGl0ZW1zLCB0aGF0IGFyZSBzcGxpdCBiZXR3ZWVuIFNbMF0gYW5kCisJCQkJCSAgIFMxbmV3IGFuZCBTMW5ldyBhbmQgUzJuZXcgKi8KIAotICAgIHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID0gLTE7Ci0gICAgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0gPSAtMTsKKwlzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9IC0xOworCXNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdID0gLTE7CiAKLSAgICAvKiBXZSBvbmx5IGNyZWF0ZSBhZGRpdGlvbmFsIG5vZGVzIGlmIHdlIGFyZSBpbiBpbnNlcnQgb3IgcGFzdGUgbW9kZQotICAgICAgIG9yIHdlIGFyZSBpbiByZXBsYWNlIG1vZGUgYXQgdGhlIGludGVybmFsIGxldmVsLiBJZiBoIGlzIDAgYW5kCi0gICAgICAgdGhlIG1vZGUgaXMgTV9SRVBMQUNFIHRoZW4gaW4gZml4X25vZGVzIHdlIGNoYW5nZSB0aGUgbW9kZSB0bwotICAgICAgIHBhc3RlIG9yIGluc2VydCBiZWZvcmUgd2UgZ2V0IGhlcmUgaW4gdGhlIGNvZGUuICAqLwotICAgIFJGQUxTRSggdGItPmluc2VydF9zaXplW2hdIDwgMCAgfHwgKG1vZGUgIT0gTV9JTlNFUlQgJiYgbW9kZSAhPSBNX1BBU1RFKSwKLQkgICAgInZzLTgxMDA6IGluc2VydF9zaXplIDwgMCBpbiBvdmVyZmxvdyIpOworCS8qIFdlIG9ubHkgY3JlYXRlIGFkZGl0aW9uYWwgbm9kZXMgaWYgd2UgYXJlIGluIGluc2VydCBvciBwYXN0ZSBtb2RlCisJICAgb3Igd2UgYXJlIGluIHJlcGxhY2UgbW9kZSBhdCB0aGUgaW50ZXJuYWwgbGV2ZWwuIElmIGggaXMgMCBhbmQKKwkgICB0aGUgbW9kZSBpcyBNX1JFUExBQ0UgdGhlbiBpbiBmaXhfbm9kZXMgd2UgY2hhbmdlIHRoZSBtb2RlIHRvCisJICAgcGFzdGUgb3IgaW5zZXJ0IGJlZm9yZSB3ZSBnZXQgaGVyZSBpbiB0aGUgY29kZS4gICovCisJUkZBTFNFKHRiLT5pbnNlcnRfc2l6ZVtoXSA8IDAgfHwgKG1vZGUgIT0gTV9JTlNFUlQgJiYgbW9kZSAhPSBNX1BBU1RFKSwKKwkgICAgICAgInZzLTgxMDA6IGluc2VydF9zaXplIDwgMCBpbiBvdmVyZmxvdyIpOwogCi0gICAgbWF4X25vZGVfc2l6ZSA9IE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKTsKKwltYXhfbm9kZV9zaXplID0gTUFYX0NISUxEX1NJWkUoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKTsKIAotICAgIC8qIHNudW0wMTIgWzAtMl0gLSBudW1iZXIgb2YgaXRlbXMsIHRoYXQgbGF5Ci0gICAgICAgdG8gU1swXSwgZmlyc3QgbmV3IG5vZGUgYW5kIHNlY29uZCBuZXcgbm9kZSAqLwotICAgIHNudW0wMTJbM10gPSAtMTsJLyogczFieXRlcyAqLwotICAgIHNudW0wMTJbNF0gPSAtMTsJLyogczJieXRlcyAqLworCS8qIHNudW0wMTIgWzAtMl0gLSBudW1iZXIgb2YgaXRlbXMsIHRoYXQgbGF5CisJICAgdG8gU1swXSwgZmlyc3QgbmV3IG5vZGUgYW5kIHNlY29uZCBuZXcgbm9kZSAqLworCXNudW0wMTJbM10gPSAtMTsJLyogczFieXRlcyAqLworCXNudW0wMTJbNF0gPSAtMTsJLyogczJieXRlcyAqLwogCi0gICAgLyogaW50ZXJuYWwgbGV2ZWwgKi8KLSAgICBpZiAoaCA+IDApIHsKLQlpID0gKCh0byAtIGZyb20pICogKEtFWV9TSVpFICsgRENfU0laRSkgKyBEQ19TSVpFKTsKLQlpZiAoaSA9PSBtYXhfbm9kZV9zaXplKQotCSAgICByZXR1cm4gMTsKLQlyZXR1cm4gKGkgLyBtYXhfbm9kZV9zaXplICsgMSk7Ci0gICAgfQotCi0gICAgLyogbGVhZiBsZXZlbCAqLwotICAgIG5lZWRlZF9ub2RlcyA9IDE7Ci0gICAgdG90YWxfbm9kZV9zaXplID0gMDsKLSAgICBjdXJfZnJlZSA9IG1heF9ub2RlX3NpemU7Ci0KLSAgICAvLyBzdGFydCBmcm9tICdmcm9tJy10aCBpdGVtCi0gICAgc3RhcnRfaXRlbSA9IGZyb207Ci0gICAgLy8gc2tpcCBpdHMgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cwotICAgIHN0YXJ0X2J5dGVzID0gKChmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKLQotICAgIC8vIGxhc3QgaW5jbHVkZWQgaXRlbSBpcyB0aGUgJ2VuZF9pdGVtJy10aCBvbmUKLSAgICBlbmRfaXRlbSA9IHZuLT52bl9ucl9pdGVtIC0gdG8gLSAxOwotICAgIC8vIGRvIG5vdCBjb3VudCBsYXN0ICdlbmRfYnl0ZXMnIHVuaXRzIG9mICdlbmRfaXRlbSctdGggaXRlbQotICAgIGVuZF9ieXRlcyA9ICh0b19ieXRlcyAhPSAtMSkgPyB0b19ieXRlcyA6IDA7Ci0KLSAgICAvKiBnbyB0aHJvdWdoIGFsbCBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBzdGFydF9pdGVtLXRoIGl0ZW0gYW5kIGVuZGluZyBieQotICAgICAgIHRoZSBlbmRfaXRlbS10aCBpdGVtLiBEbyBub3QgY291bnQgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cyBvZgotICAgICAgICdzdGFydF9pdGVtJy10aCBpdGVtIGFuZCBsYXN0ICdlbmRfYnl0ZXMnIG9mICdlbmRfaXRlbSctdGggaXRlbSAqLwotICAgIAotICAgIGZvciAoaSA9IHN0YXJ0X2l0ZW07IGkgPD0gZW5kX2l0ZW07IGkgKyspIHsKLQlzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkgPSB2bi0+dm5fdmkgKyBpOwotCWludCBza2lwX2Zyb21fZW5kID0gKChpID09IGVuZF9pdGVtKSA/IGVuZF9ieXRlcyA6IDApOwotCi0JUkZBTFNFKCBuZWVkZWRfbm9kZXMgPiAzLCAidnMtODEwNTogdG9vIG1hbnkgbm9kZXMgYXJlIG5lZWRlZCIpOwotCi0JLyogZ2V0IHNpemUgb2YgY3VycmVudCBpdGVtICovCi0JY3VycmVudF9pdGVtX3NpemUgPSB2aS0+dmlfaXRlbV9sZW47Ci0KLQkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiBoZWFkIHBhcnQgKGZyb21fYnl0ZXMpIG9mIGZyb20tdGggaXRlbSAqLwotCWN1cnJlbnRfaXRlbV9zaXplIC09IG9wX3BhcnRfc2l6ZSAodmksIDAvKmZyb20gc3RhcnQqLywgc3RhcnRfYnl0ZXMpOwotCi0JLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gdGFpbCBwYXJ0IG9mIGxhc3QgaXRlbSAqLwotCWN1cnJlbnRfaXRlbV9zaXplIC09IG9wX3BhcnRfc2l6ZSAodmksIDEvKmZyb20gZW5kKi8sIHNraXBfZnJvbV9lbmQpOwotCi0JLyogaWYgaXRlbSBmaXRzIGludG8gY3VycmVudCBub2RlIGVudGllcmx5ICovCi0JaWYgKHRvdGFsX25vZGVfc2l6ZSArIGN1cnJlbnRfaXRlbV9zaXplIDw9IG1heF9ub2RlX3NpemUpIHsKLQkgICAgc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSArKzsKLQkgICAgdG90YWxfbm9kZV9zaXplICs9IGN1cnJlbnRfaXRlbV9zaXplOwotCSAgICBzdGFydF9ieXRlcyA9IDA7Ci0JICAgIGNvbnRpbnVlOworCS8qIGludGVybmFsIGxldmVsICovCisJaWYgKGggPiAwKSB7CisJCWkgPSAoKHRvIC0gZnJvbSkgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSArIERDX1NJWkUpOworCQlpZiAoaSA9PSBtYXhfbm9kZV9zaXplKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAoaSAvIG1heF9ub2RlX3NpemUgKyAxKTsKIAl9CiAKLQlpZiAoY3VycmVudF9pdGVtX3NpemUgPiBtYXhfbm9kZV9zaXplKSB7Ci0JICAgIC8qIHZpcnR1YWwgaXRlbSBsZW5ndGggaXMgbG9uZ2VyLCB0aGFuIG1heCBzaXplIG9mIGl0ZW0gaW4KLSAgICAgICAgICAgICAgIGEgbm9kZS4gSXQgaXMgaW1wb3NzaWJsZSBmb3IgZGlyZWN0IGl0ZW0gKi8KLQkgICAgUkZBTFNFKCBpc19kaXJlY3RfbGVfaWggKHZpLT52aV9paCksCi0JCSAgICAidnMtODExMDogIgotCQkgICAgImRpcmVjdCBpdGVtIGxlbmd0aCBpcyAlZC4gSXQgY2FuIG5vdCBiZSBsb25nZXIgdGhhbiAlZCIsCi0JCSAgICBjdXJyZW50X2l0ZW1fc2l6ZSwgbWF4X25vZGVfc2l6ZSk7Ci0JICAgIC8qIHdlIHdpbGwgdHJ5IHRvIHNwbGl0IGl0ICovCi0JICAgIGZsb3cgPSAxOwotCX0KLQotCWlmICghZmxvdykgewotCSAgICAvKiBhcyB3ZSBkbyBub3Qgc3BsaXQgaXRlbXMsIHRha2UgbmV3IG5vZGUgYW5kIGNvbnRpbnVlICovCi0JICAgIG5lZWRlZF9ub2RlcyArKzsgaSAtLTsgdG90YWxfbm9kZV9zaXplID0gMDsKLQkgICAgY29udGludWU7Ci0JfQotCi0JLy8gY2FsY3VsYXRlIG51bWJlciBvZiBpdGVtIHVuaXRzIHdoaWNoIGZpdCBpbnRvIG5vZGUgYmVpbmcKLQkvLyBmaWxsZWQKLQl7Ci0JICAgIGludCBmcmVlX3NwYWNlOwotCi0JICAgIGZyZWVfc3BhY2UgPSBtYXhfbm9kZV9zaXplIC0gdG90YWxfbm9kZV9zaXplIC0gSUhfU0laRTsKLQkgICAgdW5pdHMgPSBvcF9jaGVja19sZWZ0ICh2aSwgZnJlZV9zcGFjZSwgc3RhcnRfYnl0ZXMsIHNraXBfZnJvbV9lbmQpOwotCSAgICBpZiAodW5pdHMgPT0gLTEpIHsKLQkJLyogbm90aGluZyBmaXRzIGludG8gY3VycmVudCBub2RlLCB0YWtlIG5ldyBub2RlIGFuZCBjb250aW51ZSAqLwotCQluZWVkZWRfbm9kZXMgKyssIGktLSwgdG90YWxfbm9kZV9zaXplID0gMDsKLQkJY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLQkvKiBzb21ldGhpbmcgZml0cyBpbnRvIHRoZSBjdXJyZW50IG5vZGUgKi8KLQkvL2lmIChzbnVtMDEyWzNdICE9IC0xIHx8IG5lZWRlZF9ub2RlcyAhPSAxKQotCS8vICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODExNTogZ2V0X251bV92ZXI6IHRvbyBtYW55IG5vZGVzIHJlcXVpcmVkIik7Ci0JLy9zbnVtMDEyW25lZWRlZF9ub2RlcyAtIDEgKyAzXSA9IG9wX3VuaXRfbnVtICh2aSkgLSBzdGFydF9ieXRlcyAtIHVuaXRzOwotCXN0YXJ0X2J5dGVzICs9IHVuaXRzOwotCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMSArIDNdID0gdW5pdHM7Ci0KLQlpZiAobmVlZGVkX25vZGVzID4gMikKLQkgICAgcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLCAidnMtODExMTogZ2V0X251bV92ZXI6ICIKLQkJCSAgICAgICJzcGxpdF9pdGVtX3Bvc2l0aW9uIGlzIG91dCBvZiBib3VuZGFyeSIpOwotCXNudW0wMTJbbmVlZGVkX25vZGVzIC0gMV0gKys7Ci0Jc3BsaXRfaXRlbV9wb3NpdGlvbnNbbmVlZGVkX25vZGVzIC0gMV0gPSBpOwotCW5lZWRlZF9ub2RlcyArKzsKLQkvKiBjb250aW51ZSBmcm9tIHRoZSBzYW1lIGl0ZW0gd2l0aCBzdGFydF9ieXRlcyAhPSAtMSAqLwotCXN0YXJ0X2l0ZW0gPSBpOwotCWkgLS07CisJLyogbGVhZiBsZXZlbCAqLworCW5lZWRlZF9ub2RlcyA9IDE7CiAJdG90YWxfbm9kZV9zaXplID0gMDsKLSAgICB9CisJY3VyX2ZyZWUgPSBtYXhfbm9kZV9zaXplOwogCi0gICAgLy8gc3VtMDEyWzRdIChpZiBpdCBpcyBub3QgLTEpIGNvbnRhaW5zIG51bWJlciBvZiB1bml0cyBvZiB3aGljaAotICAgIC8vIGFyZSB0byBiZSBpbiBTMW5ldywgc251bTAxMlszXSAtIHRvIGJlIGluIFMwLiBUaGV5IGFyZSBzdXBwb3NlZAotICAgIC8vIHRvIGJlIFMxYnl0ZXMgYW5kIFMyYnl0ZXMgY29ycmVzcG9uZGluZ2x5LCBzbyByZWNhbGN1bGF0ZQotICAgIGlmIChzbnVtMDEyWzRdID4gMCkgewotCWludCBzcGxpdF9pdGVtX251bTsKLQlpbnQgYnl0ZXNfdG9fciwgYnl0ZXNfdG9fbDsKLQlpbnQgYnl0ZXNfdG9fUzFuZXc7Ci0gICAgCi0Jc3BsaXRfaXRlbV9udW0gPSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXTsKLQlieXRlc190b19sID0gKChmcm9tID09IHNwbGl0X2l0ZW1fbnVtICYmIGZyb21fYnl0ZXMgIT0gLTEpID8gZnJvbV9ieXRlcyA6IDApOwotCWJ5dGVzX3RvX3IgPSAoKGVuZF9pdGVtID09IHNwbGl0X2l0ZW1fbnVtICYmIGVuZF9ieXRlcyAhPSAtMSkgPyBlbmRfYnl0ZXMgOiAwKTsKLQlieXRlc190b19TMW5ldyA9ICgoc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPT0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0pID8gc251bTAxMlszXSA6IDApOworCS8vIHN0YXJ0IGZyb20gJ2Zyb20nLXRoIGl0ZW0KKwlzdGFydF9pdGVtID0gZnJvbTsKKwkvLyBza2lwIGl0cyBmaXJzdCAnc3RhcnRfYnl0ZXMnIHVuaXRzCisJc3RhcnRfYnl0ZXMgPSAoKGZyb21fYnl0ZXMgIT0gLTEpID8gZnJvbV9ieXRlcyA6IDApOwogCi0JLy8gczJieXRlcwotCXNudW0wMTJbNF0gPSBvcF91bml0X251bSAoJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMls0XSAtIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzFuZXc7CisJLy8gbGFzdCBpbmNsdWRlZCBpdGVtIGlzIHRoZSAnZW5kX2l0ZW0nLXRoIG9uZQorCWVuZF9pdGVtID0gdm4tPnZuX25yX2l0ZW0gLSB0byAtIDE7CisJLy8gZG8gbm90IGNvdW50IGxhc3QgJ2VuZF9ieXRlcycgdW5pdHMgb2YgJ2VuZF9pdGVtJy10aCBpdGVtCisJZW5kX2J5dGVzID0gKHRvX2J5dGVzICE9IC0xKSA/IHRvX2J5dGVzIDogMDsKIAotCWlmICh2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dLnZpX2luZGV4ICE9IFRZUEVfRElSRU5UUlkgJiYKLQkgICAgdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXS52aV9pbmRleCAhPSBUWVBFX0lORElSRUNUKQotCSAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3Zlcjogbm90ICIKLQkJCSAgICAgICJkaXJlY3Rvcnkgb3IgaW5kaXJlY3QgaXRlbSIpOwotICAgIH0KKwkvKiBnbyB0aHJvdWdoIGFsbCBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBzdGFydF9pdGVtLXRoIGl0ZW0gYW5kIGVuZGluZyBieQorCSAgIHRoZSBlbmRfaXRlbS10aCBpdGVtLiBEbyBub3QgY291bnQgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cyBvZgorCSAgICdzdGFydF9pdGVtJy10aCBpdGVtIGFuZCBsYXN0ICdlbmRfYnl0ZXMnIG9mICdlbmRfaXRlbSctdGggaXRlbSAqLwogCi0gICAgLyogbm93IHdlIGtub3cgUzJieXRlcywgY2FsY3VsYXRlIFMxYnl0ZXMgKi8KLSAgICBpZiAoc251bTAxMlszXSA+IDApIHsKLQlpbnQgc3BsaXRfaXRlbV9udW07Ci0JaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7Ci0JaW50IGJ5dGVzX3RvX1MybmV3OwotICAgIAotCXNwbGl0X2l0ZW1fbnVtID0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF07Ci0JYnl0ZXNfdG9fbCA9ICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bSAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKLQlieXRlc190b19yID0gKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bSAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7Ci0JYnl0ZXNfdG9fUzJuZXcgPSAoKHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID09IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdICYmIHNudW0wMTJbNF0gIT0gLTEpID8gc251bTAxMls0XSA6IDApOworCWZvciAoaSA9IHN0YXJ0X2l0ZW07IGkgPD0gZW5kX2l0ZW07IGkrKykgeworCQlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSA9IHZuLT52bl92aSArIGk7CisJCWludCBza2lwX2Zyb21fZW5kID0gKChpID09IGVuZF9pdGVtKSA/IGVuZF9ieXRlcyA6IDApOwogCi0JLy8gczFieXRlcwotCXNudW0wMTJbM10gPSBvcF91bml0X251bSAoJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMlszXSAtIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzJuZXc7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuZWVkZWRfbm9kZXM7CisJCVJGQUxTRShuZWVkZWRfbm9kZXMgPiAzLCAidnMtODEwNTogdG9vIG1hbnkgbm9kZXMgYXJlIG5lZWRlZCIpOworCisJCS8qIGdldCBzaXplIG9mIGN1cnJlbnQgaXRlbSAqLworCQljdXJyZW50X2l0ZW1fc2l6ZSA9IHZpLT52aV9pdGVtX2xlbjsKKworCQkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiBoZWFkIHBhcnQgKGZyb21fYnl0ZXMpIG9mIGZyb20tdGggaXRlbSAqLworCQljdXJyZW50X2l0ZW1fc2l6ZSAtPQorCQkgICAgb3BfcGFydF9zaXplKHZpLCAwIC8qZnJvbSBzdGFydCAqLyAsIHN0YXJ0X2J5dGVzKTsKKworCQkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiB0YWlsIHBhcnQgb2YgbGFzdCBpdGVtICovCisJCWN1cnJlbnRfaXRlbV9zaXplIC09CisJCSAgICBvcF9wYXJ0X3NpemUodmksIDEgLypmcm9tIGVuZCAqLyAsIHNraXBfZnJvbV9lbmQpOworCisJCS8qIGlmIGl0ZW0gZml0cyBpbnRvIGN1cnJlbnQgbm9kZSBlbnRpZXJseSAqLworCQlpZiAodG90YWxfbm9kZV9zaXplICsgY3VycmVudF9pdGVtX3NpemUgPD0gbWF4X25vZGVfc2l6ZSkgeworCQkJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSsrOworCQkJdG90YWxfbm9kZV9zaXplICs9IGN1cnJlbnRfaXRlbV9zaXplOworCQkJc3RhcnRfYnl0ZXMgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY3VycmVudF9pdGVtX3NpemUgPiBtYXhfbm9kZV9zaXplKSB7CisJCQkvKiB2aXJ0dWFsIGl0ZW0gbGVuZ3RoIGlzIGxvbmdlciwgdGhhbiBtYXggc2l6ZSBvZiBpdGVtIGluCisJCQkgICBhIG5vZGUuIEl0IGlzIGltcG9zc2libGUgZm9yIGRpcmVjdCBpdGVtICovCisJCQlSRkFMU0UoaXNfZGlyZWN0X2xlX2loKHZpLT52aV9paCksCisJCQkgICAgICAgInZzLTgxMTA6ICIKKwkJCSAgICAgICAiZGlyZWN0IGl0ZW0gbGVuZ3RoIGlzICVkLiBJdCBjYW4gbm90IGJlIGxvbmdlciB0aGFuICVkIiwKKwkJCSAgICAgICBjdXJyZW50X2l0ZW1fc2l6ZSwgbWF4X25vZGVfc2l6ZSk7CisJCQkvKiB3ZSB3aWxsIHRyeSB0byBzcGxpdCBpdCAqLworCQkJZmxvdyA9IDE7CisJCX0KKworCQlpZiAoIWZsb3cpIHsKKwkJCS8qIGFzIHdlIGRvIG5vdCBzcGxpdCBpdGVtcywgdGFrZSBuZXcgbm9kZSBhbmQgY29udGludWUgKi8KKwkJCW5lZWRlZF9ub2RlcysrOworCQkJaS0tOworCQkJdG90YWxfbm9kZV9zaXplID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8vIGNhbGN1bGF0ZSBudW1iZXIgb2YgaXRlbSB1bml0cyB3aGljaCBmaXQgaW50byBub2RlIGJlaW5nCisJCS8vIGZpbGxlZAorCQl7CisJCQlpbnQgZnJlZV9zcGFjZTsKKworCQkJZnJlZV9zcGFjZSA9IG1heF9ub2RlX3NpemUgLSB0b3RhbF9ub2RlX3NpemUgLSBJSF9TSVpFOworCQkJdW5pdHMgPQorCQkJICAgIG9wX2NoZWNrX2xlZnQodmksIGZyZWVfc3BhY2UsIHN0YXJ0X2J5dGVzLAorCQkJCQkgIHNraXBfZnJvbV9lbmQpOworCQkJaWYgKHVuaXRzID09IC0xKSB7CisJCQkJLyogbm90aGluZyBmaXRzIGludG8gY3VycmVudCBub2RlLCB0YWtlIG5ldyBub2RlIGFuZCBjb250aW51ZSAqLworCQkJCW5lZWRlZF9ub2RlcysrLCBpLS0sIHRvdGFsX25vZGVfc2l6ZSA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBzb21ldGhpbmcgZml0cyBpbnRvIHRoZSBjdXJyZW50IG5vZGUgKi8KKwkJLy9pZiAoc251bTAxMlszXSAhPSAtMSB8fCBuZWVkZWRfbm9kZXMgIT0gMSkKKwkJLy8gIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3ZlcjogdG9vIG1hbnkgbm9kZXMgcmVxdWlyZWQiKTsKKwkJLy9zbnVtMDEyW25lZWRlZF9ub2RlcyAtIDEgKyAzXSA9IG9wX3VuaXRfbnVtICh2aSkgLSBzdGFydF9ieXRlcyAtIHVuaXRzOworCQlzdGFydF9ieXRlcyArPSB1bml0czsKKwkJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxICsgM10gPSB1bml0czsKKworCQlpZiAobmVlZGVkX25vZGVzID4gMikKKwkJCXJlaXNlcmZzX3dhcm5pbmcodGItPnRiX3NiLCAidnMtODExMTogZ2V0X251bV92ZXI6ICIKKwkJCQkJICJzcGxpdF9pdGVtX3Bvc2l0aW9uIGlzIG91dCBvZiBib3VuZGFyeSIpOworCQlzbnVtMDEyW25lZWRlZF9ub2RlcyAtIDFdKys7CisJCXNwbGl0X2l0ZW1fcG9zaXRpb25zW25lZWRlZF9ub2RlcyAtIDFdID0gaTsKKwkJbmVlZGVkX25vZGVzKys7CisJCS8qIGNvbnRpbnVlIGZyb20gdGhlIHNhbWUgaXRlbSB3aXRoIHN0YXJ0X2J5dGVzICE9IC0xICovCisJCXN0YXJ0X2l0ZW0gPSBpOworCQlpLS07CisJCXRvdGFsX25vZGVfc2l6ZSA9IDA7CisJfQorCisJLy8gc3VtMDEyWzRdIChpZiBpdCBpcyBub3QgLTEpIGNvbnRhaW5zIG51bWJlciBvZiB1bml0cyBvZiB3aGljaAorCS8vIGFyZSB0byBiZSBpbiBTMW5ldywgc251bTAxMlszXSAtIHRvIGJlIGluIFMwLiBUaGV5IGFyZSBzdXBwb3NlZAorCS8vIHRvIGJlIFMxYnl0ZXMgYW5kIFMyYnl0ZXMgY29ycmVzcG9uZGluZ2x5LCBzbyByZWNhbGN1bGF0ZQorCWlmIChzbnVtMDEyWzRdID4gMCkgeworCQlpbnQgc3BsaXRfaXRlbV9udW07CisJCWludCBieXRlc190b19yLCBieXRlc190b19sOworCQlpbnQgYnl0ZXNfdG9fUzFuZXc7CisKKwkJc3BsaXRfaXRlbV9udW0gPSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXTsKKwkJYnl0ZXNfdG9fbCA9CisJCSAgICAoKGZyb20gPT0gc3BsaXRfaXRlbV9udW0KKwkJICAgICAgJiYgZnJvbV9ieXRlcyAhPSAtMSkgPyBmcm9tX2J5dGVzIDogMCk7CisJCWJ5dGVzX3RvX3IgPQorCQkgICAgKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bQorCQkgICAgICAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7CisJCWJ5dGVzX3RvX1MxbmV3ID0KKwkJICAgICgoc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF0gPT0KKwkJICAgICAgc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV0pID8gc251bTAxMlszXSA6IDApOworCisJCS8vIHMyYnl0ZXMKKwkJc251bTAxMls0XSA9CisJCSAgICBvcF91bml0X251bSgmdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXSkgLSBzbnVtMDEyWzRdIC0KKwkJICAgIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzFuZXc7CisKKwkJaWYgKHZuLT52bl92aVtzcGxpdF9pdGVtX251bV0udmlfaW5kZXggIT0gVFlQRV9ESVJFTlRSWSAmJgorCQkgICAgdm4tPnZuX3ZpW3NwbGl0X2l0ZW1fbnVtXS52aV9pbmRleCAhPSBUWVBFX0lORElSRUNUKQorCQkJcmVpc2VyZnNfd2FybmluZyh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3Zlcjogbm90ICIKKwkJCQkJICJkaXJlY3Rvcnkgb3IgaW5kaXJlY3QgaXRlbSIpOworCX0KKworCS8qIG5vdyB3ZSBrbm93IFMyYnl0ZXMsIGNhbGN1bGF0ZSBTMWJ5dGVzICovCisJaWYgKHNudW0wMTJbM10gPiAwKSB7CisJCWludCBzcGxpdF9pdGVtX251bTsKKwkJaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7CisJCWludCBieXRlc190b19TMm5ldzsKKworCQlzcGxpdF9pdGVtX251bSA9IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdOworCQlieXRlc190b19sID0KKwkJICAgICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bQorCQkgICAgICAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKKwkJYnl0ZXNfdG9fciA9CisJCSAgICAoKGVuZF9pdGVtID09IHNwbGl0X2l0ZW1fbnVtCisJCSAgICAgICYmIGVuZF9ieXRlcyAhPSAtMSkgPyBlbmRfYnl0ZXMgOiAwKTsKKwkJYnl0ZXNfdG9fUzJuZXcgPQorCQkgICAgKChzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9PSBzcGxpdF9pdGVtX3Bvc2l0aW9uc1sxXQorCQkgICAgICAmJiBzbnVtMDEyWzRdICE9IC0xKSA/IHNudW0wMTJbNF0gOiAwKTsKKworCQkvLyBzMWJ5dGVzCisJCXNudW0wMTJbM10gPQorCQkgICAgb3BfdW5pdF9udW0oJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMlszXSAtCisJCSAgICBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MybmV3OworCX0KKworCXJldHVybiBuZWVkZWRfbm9kZXM7CiB9CiAKLQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBjdXJfdGI7CitleHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiOwogI2VuZGlmCiAKLQogLyogU2V0IHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZy4KICAqIFBlcmZvcm1zIHdyaXRlIG9mIHJlc3VsdHMgb2YgYW5hbHlzaXMgb2YgYmFsYW5jaW5nIGludG8gc3RydWN0dXJlIHRiLAogICogd2hlcmUgaXQgd2lsbCBsYXRlciBiZSB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBkbyB0aGUgYmFsYW5jaW5nLiAKQEAgLTU1NywxMzIgKzU4NywxMzEgQEAKICAqCXMxYnl0ZXMJbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICh0aGlzIG51bWJlciBpcyBjb250YWluZWQgaW4gczAxMiBhcnJheSkKICAqLwogCi1zdGF0aWMgdm9pZCBzZXRfcGFyYW1ldGVycyAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwgaW50IGxudW0sCi0JCQkgICAgaW50IHJudW0sIGludCBibGtfbnVtLCBzaG9ydCAqIHMwMTIsIGludCBsYiwgaW50IHJiKQorc3RhdGljIHZvaWQgc2V0X3BhcmFtZXRlcnMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoLCBpbnQgbG51bSwKKwkJCSAgIGludCBybnVtLCBpbnQgYmxrX251bSwgc2hvcnQgKnMwMTIsIGludCBsYiwgaW50IHJiKQogewogCi0gIHRiLT5sbnVtW2hdID0gbG51bTsKLSAgdGItPnJudW1baF0gPSBybnVtOwotICB0Yi0+YmxrbnVtW2hdID0gYmxrX251bTsKKwl0Yi0+bG51bVtoXSA9IGxudW07CisJdGItPnJudW1baF0gPSBybnVtOworCXRiLT5ibGtudW1baF0gPSBibGtfbnVtOwogCi0gIGlmIChoID09IDApCi0gICAgeyAgLyogb25seSBmb3IgbGVhZiBsZXZlbCAqLwotICAgICAgaWYgKHMwMTIgIT0gTlVMTCkKLQl7Ci0JICB0Yi0+czBudW0gPSAqIHMwMTIgKyssCi0JICB0Yi0+czFudW0gPSAqIHMwMTIgKyssCi0JICB0Yi0+czJudW0gPSAqIHMwMTIgKys7Ci0JICB0Yi0+czFieXRlcyA9ICogczAxMiArKzsKLQkgIHRiLT5zMmJ5dGVzID0gKiBzMDEyOworCWlmIChoID09IDApIHsJCS8qIG9ubHkgZm9yIGxlYWYgbGV2ZWwgKi8KKwkJaWYgKHMwMTIgIT0gTlVMTCkgeworCQkJdGItPnMwbnVtID0gKnMwMTIrKywKKwkJCSAgICB0Yi0+czFudW0gPSAqczAxMisrLCB0Yi0+czJudW0gPSAqczAxMisrOworCQkJdGItPnMxYnl0ZXMgPSAqczAxMisrOworCQkJdGItPnMyYnl0ZXMgPSAqczAxMjsKKwkJfQorCQl0Yi0+bGJ5dGVzID0gbGI7CisJCXRiLT5yYnl0ZXMgPSByYjsKIAl9Ci0gICAgICB0Yi0+bGJ5dGVzID0gbGI7Ci0gICAgICB0Yi0+cmJ5dGVzID0gcmI7Ci0gICAgfQotICBQUk9DX0lORk9fQUREKCB0YiAtPiB0Yl9zYiwgbG51bVsgaCBdLCBsbnVtICk7Ci0gIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCBybnVtWyBoIF0sIHJudW0gKTsKKwlQUk9DX0lORk9fQUREKHRiLT50Yl9zYiwgbG51bVtoXSwgbG51bSk7CisJUFJPQ19JTkZPX0FERCh0Yi0+dGJfc2IsIHJudW1baF0sIHJudW0pOwogCi0gIFBST0NfSU5GT19BREQoIHRiIC0+IHRiX3NiLCBsYnl0ZXNbIGggXSwgbGIgKTsKLSAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIHJieXRlc1sgaCBdLCByYiApOworCVBST0NfSU5GT19BREQodGItPnRiX3NiLCBsYnl0ZXNbaF0sIGxiKTsKKwlQUk9DX0lORk9fQUREKHRiLT50Yl9zYiwgcmJ5dGVzW2hdLCByYik7CiB9CiAKLQotCiAvKiBjaGVjaywgZG9lcyBub2RlIGRpc2FwcGVhciBpZiB3ZSBzaGlmdCB0Yi0+bG51bVswXSBpdGVtcyB0byBsZWZ0CiAgICBuZWlnaGJvciBhbmQgdGItPnJudW1bMF0gdG8gdGhlIHJpZ2h0IG9uZS4gKi8KLXN0YXRpYyBpbnQgaXNfbGVhZl9yZW1vdmFibGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3N0YXRpYyBpbnQgaXNfbGVhZl9yZW1vdmFibGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKLSAgaW50IHRvX2xlZnQsIHRvX3JpZ2h0OwotICBpbnQgc2l6ZTsKLSAgaW50IHJlbWFpbl9pdGVtczsKKwlzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biA9IHRiLT50Yl92bjsKKwlpbnQgdG9fbGVmdCwgdG9fcmlnaHQ7CisJaW50IHNpemU7CisJaW50IHJlbWFpbl9pdGVtczsKIAotICAvKiBudW1iZXIgb2YgaXRlbXMsIHRoYXQgd2lsbCBiZSBzaGlmdGVkIHRvIGxlZnQgKHJpZ2h0KSBuZWlnaGJvcgotICAgICBlbnRpcmVseSAqLwotICB0b19sZWZ0ID0gdGItPmxudW1bMF0gLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApOwotICB0b19yaWdodCA9IHRiLT5ybnVtWzBdIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKTsKLSAgcmVtYWluX2l0ZW1zID0gdm4tPnZuX25yX2l0ZW07CisJLyogbnVtYmVyIG9mIGl0ZW1zLCB0aGF0IHdpbGwgYmUgc2hpZnRlZCB0byBsZWZ0IChyaWdodCkgbmVpZ2hib3IKKwkgICBlbnRpcmVseSAqLworCXRvX2xlZnQgPSB0Yi0+bG51bVswXSAtICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCk7CisJdG9fcmlnaHQgPSB0Yi0+cm51bVswXSAtICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCk7CisJcmVtYWluX2l0ZW1zID0gdm4tPnZuX25yX2l0ZW07CiAKLSAgLyogaG93IG1hbnkgaXRlbXMgcmVtYWluIGluIFNbMF0gYWZ0ZXIgc2hpZnRpbmdzIHRvIG5laWdoYm9ycyAqLwotICByZW1haW5faXRlbXMgLT0gKHRvX2xlZnQgKyB0b19yaWdodCk7CisJLyogaG93IG1hbnkgaXRlbXMgcmVtYWluIGluIFNbMF0gYWZ0ZXIgc2hpZnRpbmdzIHRvIG5laWdoYm9ycyAqLworCXJlbWFpbl9pdGVtcyAtPSAodG9fbGVmdCArIHRvX3JpZ2h0KTsKIAotICBpZiAocmVtYWluX2l0ZW1zIDwgMSkgewotICAgIC8qIGFsbCBjb250ZW50IG9mIG5vZGUgY2FuIGJlIHNoaWZ0ZWQgdG8gbmVpZ2hib3JzICovCi0gICAgc2V0X3BhcmFtZXRlcnMgKHRiLCAwLCB0b19sZWZ0LCB2bi0+dm5fbnJfaXRlbSAtIHRvX2xlZnQsIDAsIE5VTEwsIC0xLCAtMSk7ICAgIAotICAgIHJldHVybiAxOwotICB9Ci0gIAotICBpZiAocmVtYWluX2l0ZW1zID4gMSB8fCB0Yi0+bGJ5dGVzID09IC0xIHx8IHRiLT5yYnl0ZXMgPT0gLTEpCi0gICAgLyogU1swXSBpcyBub3QgcmVtb3ZhYmxlICovCi0gICAgcmV0dXJuIDA7CisJaWYgKHJlbWFpbl9pdGVtcyA8IDEpIHsKKwkJLyogYWxsIGNvbnRlbnQgb2Ygbm9kZSBjYW4gYmUgc2hpZnRlZCB0byBuZWlnaGJvcnMgKi8KKwkJc2V0X3BhcmFtZXRlcnModGIsIDAsIHRvX2xlZnQsIHZuLT52bl9ucl9pdGVtIC0gdG9fbGVmdCwgMCwKKwkJCSAgICAgICBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgLyogY2hlY2ssIHdoZXRoZXIgd2UgY2FuIGRpdmlkZSAxIHJlbWFpbmluZyBpdGVtIGJldHdlZW4gbmVpZ2hib3JzICovCisJaWYgKHJlbWFpbl9pdGVtcyA+IDEgfHwgdGItPmxieXRlcyA9PSAtMSB8fCB0Yi0+cmJ5dGVzID09IC0xKQorCQkvKiBTWzBdIGlzIG5vdCByZW1vdmFibGUgKi8KKwkJcmV0dXJuIDA7CiAKLSAgLyogZ2V0IHNpemUgb2YgcmVtYWluaW5nIGl0ZW0gKGluIGl0ZW0gdW5pdHMpICovCi0gIHNpemUgPSBvcF91bml0X251bSAoJih2bi0+dm5fdmlbdG9fbGVmdF0pKTsKKwkvKiBjaGVjaywgd2hldGhlciB3ZSBjYW4gZGl2aWRlIDEgcmVtYWluaW5nIGl0ZW0gYmV0d2VlbiBuZWlnaGJvcnMgKi8KIAotICBpZiAodGItPmxieXRlcyArIHRiLT5yYnl0ZXMgPj0gc2l6ZSkgewotICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgdG9fbGVmdCArIDEsIHRvX3JpZ2h0ICsgMSwgMCwgTlVMTCwgdGItPmxieXRlcywgLTEpOwotICAgIHJldHVybiAxOwotICB9CisJLyogZ2V0IHNpemUgb2YgcmVtYWluaW5nIGl0ZW0gKGluIGl0ZW0gdW5pdHMpICovCisJc2l6ZSA9IG9wX3VuaXRfbnVtKCYodm4tPnZuX3ZpW3RvX2xlZnRdKSk7CiAKLSAgcmV0dXJuIDA7CisJaWYgKHRiLT5sYnl0ZXMgKyB0Yi0+cmJ5dGVzID49IHNpemUpIHsKKwkJc2V0X3BhcmFtZXRlcnModGIsIDAsIHRvX2xlZnQgKyAxLCB0b19yaWdodCArIDEsIDAsIE5VTEwsCisJCQkgICAgICAgdGItPmxieXRlcywgLTEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAotCiAvKiBjaGVjayB3aGV0aGVyIEwsIFMsIFIgY2FuIGJlIGpvaW5lZCBpbiBvbmUgbm9kZSAqLwotc3RhdGljIGludCBhcmVfbGVhdmVzX3JlbW92YWJsZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbGZyZWUsIGludCByZnJlZSkKK3N0YXRpYyBpbnQgYXJlX2xlYXZlc19yZW1vdmFibGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBsZnJlZSwgaW50IHJmcmVlKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47Ci0gIGludCBpaF9zaXplOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlMwOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCWludCBpaF9zaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqUzA7CiAKLSAgUzAgPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIDApOworCVMwID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApOwogCi0gIGloX3NpemUgPSAwOwotICBpZiAodm4tPnZuX25yX2l0ZW0pIHsKLSAgICBpZiAodm4tPnZuX3ZpWzBdLnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQotICAgICAgaWhfc2l6ZSArPSBJSF9TSVpFOwotICAgIAotCWlmICh2bi0+dm5fdmlbdm4tPnZuX25yX2l0ZW0tMV0udmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQotCSAgICBpaF9zaXplICs9IElIX1NJWkU7Ci0gICAgfSBlbHNlIHsKLQkvKiB0aGVyZSB3YXMgb25seSBvbmUgaXRlbSBhbmQgaXQgd2lsbCBiZSBkZWxldGVkICovCi0Jc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIAotICAgIFJGQUxTRSggQl9OUl9JVEVNUyAoUzApICE9IDEsCi0JICAgICJ2cy04MTI1OiBpdGVtIG51bWJlciBtdXN0IGJlIDE6IGl0IGlzICVkIiwgQl9OUl9JVEVNUyhTMCkpOworCWloX3NpemUgPSAwOworCWlmICh2bi0+dm5fbnJfaXRlbSkgeworCQlpZiAodm4tPnZuX3ZpWzBdLnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQorCQkJaWhfc2l6ZSArPSBJSF9TSVpFOwogCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAoUzAsIDApOwotICAgIGlmICh0Yi0+Q0ZSWzBdICYmICFjb21wX3Nob3J0X2xlX2tleXMgKCYoaWgtPmloX2tleSksIEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSkpKQotCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7Ci0JICAgIC8qIERpcmVjdG9yeSBtdXN0IGJlIGluIGNvcnJlY3Qgc3RhdGUgaGVyZTogdGhhdCBpcwotCSAgICAgICBzb21ld2hlcmUgYXQgdGhlIGxlZnQgc2lkZSBzaG91bGQgZXhpc3QgZmlyc3QgZGlyZWN0b3J5Ci0JICAgICAgIGl0ZW0uIEJ1dCB0aGUgaXRlbSBiZWluZyBkZWxldGVkIGNhbiBub3QgYmUgdGhhdCBmaXJzdAotCSAgICAgICBvbmUgYmVjYXVzZSBpdHMgcmlnaHQgbmVpZ2hib3IgaXMgaXRlbSBvZiB0aGUgc2FtZQotCSAgICAgICBkaXJlY3RvcnkuIChCdXQgZmlyc3QgaXRlbSBhbHdheXMgZ2V0cyBkZWxldGVkIGluIGxhc3QKLQkgICAgICAgdHVybikuIFNvLCBuZWlnaGJvcnMgb2YgZGVsZXRlZCBpdGVtIGNhbiBiZSBtZXJnZWQsIHNvCi0JICAgICAgIHdlIGNhbiBzYXZlIGloX3NpemUgKi8KLQkgICAgaWhfc2l6ZSA9IElIX1NJWkU7Ci0JICAgIAotCSAgICAvKiB3ZSBtaWdodCBjaGVjayB0aGF0IGxlZnQgbmVpZ2hib3IgZXhpc3RzIGFuZCBpcyBvZiB0aGUKLQkgICAgICAgc2FtZSBkaXJlY3RvcnkgKi8KLQkgICAgUkZBTFNFKGxlX2loX2tfb2Zmc2V0IChpaCkgPT0gRE9UX09GRlNFVCwKLQkJInZzLTgxMzA6IGZpcnN0IGRpcmVjdG9yeSBpdGVtIGNhbiBub3QgYmUgcmVtb3ZlZCB1bnRpbCBkaXJlY3RvcnkgaXMgbm90IGVtcHR5Iik7Ci0gICAgICB9Ci0gICAgCi0gIH0KKwkJaWYgKHZuLT52bl92aVt2bi0+dm5fbnJfaXRlbSAtIDFdLgorCQkgICAgdmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQorCQkJaWhfc2l6ZSArPSBJSF9TSVpFOworCX0gZWxzZSB7CisJCS8qIHRoZXJlIHdhcyBvbmx5IG9uZSBpdGVtIGFuZCBpdCB3aWxsIGJlIGRlbGV0ZWQgKi8KKwkJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgaWYgKE1BWF9DSElMRF9TSVpFIChTMCkgKyB2bi0+dm5fc2l6ZSA8PSByZnJlZSArIGxmcmVlICsgaWhfc2l6ZSkgewotICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgLTEsIC0xLCAtMSwgTlVMTCwgLTEsIC0xKTsKLSAgICBQUk9DX0lORk9fSU5DKCB0YiAtPiB0Yl9zYiwgbGVhdmVzX3JlbW92YWJsZSApOwotICAgIHJldHVybiAxOyAgCi0gIH0KLSAgcmV0dXJuIDA7Ci0gIAorCQlSRkFMU0UoQl9OUl9JVEVNUyhTMCkgIT0gMSwKKwkJICAgICAgICJ2cy04MTI1OiBpdGVtIG51bWJlciBtdXN0IGJlIDE6IGl0IGlzICVkIiwKKwkJICAgICAgIEJfTlJfSVRFTVMoUzApKTsKKworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKFMwLCAwKTsKKwkJaWYgKHRiLT5DRlJbMF0KKwkJICAgICYmICFjb21wX3Nob3J0X2xlX2tleXMoJihpaC0+aWhfa2V5KSwKKwkJCQkJICAgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSwKKwkJCQkJCQkgIHRiLT5ya2V5WzBdKSkpCisJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CisJCQkJLyogRGlyZWN0b3J5IG11c3QgYmUgaW4gY29ycmVjdCBzdGF0ZSBoZXJlOiB0aGF0IGlzCisJCQkJICAgc29tZXdoZXJlIGF0IHRoZSBsZWZ0IHNpZGUgc2hvdWxkIGV4aXN0IGZpcnN0IGRpcmVjdG9yeQorCQkJCSAgIGl0ZW0uIEJ1dCB0aGUgaXRlbSBiZWluZyBkZWxldGVkIGNhbiBub3QgYmUgdGhhdCBmaXJzdAorCQkJCSAgIG9uZSBiZWNhdXNlIGl0cyByaWdodCBuZWlnaGJvciBpcyBpdGVtIG9mIHRoZSBzYW1lCisJCQkJICAgZGlyZWN0b3J5LiAoQnV0IGZpcnN0IGl0ZW0gYWx3YXlzIGdldHMgZGVsZXRlZCBpbiBsYXN0CisJCQkJICAgdHVybikuIFNvLCBuZWlnaGJvcnMgb2YgZGVsZXRlZCBpdGVtIGNhbiBiZSBtZXJnZWQsIHNvCisJCQkJICAgd2UgY2FuIHNhdmUgaWhfc2l6ZSAqLworCQkJCWloX3NpemUgPSBJSF9TSVpFOworCisJCQkJLyogd2UgbWlnaHQgY2hlY2sgdGhhdCBsZWZ0IG5laWdoYm9yIGV4aXN0cyBhbmQgaXMgb2YgdGhlCisJCQkJICAgc2FtZSBkaXJlY3RvcnkgKi8KKwkJCQlSRkFMU0UobGVfaWhfa19vZmZzZXQoaWgpID09IERPVF9PRkZTRVQsCisJCQkJICAgICAgICJ2cy04MTMwOiBmaXJzdCBkaXJlY3RvcnkgaXRlbSBjYW4gbm90IGJlIHJlbW92ZWQgdW50aWwgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eSIpOworCQkJfQorCisJfQorCisJaWYgKE1BWF9DSElMRF9TSVpFKFMwKSArIHZuLT52bl9zaXplIDw9IHJmcmVlICsgbGZyZWUgKyBpaF9zaXplKSB7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCAwLCAtMSwgLTEsIC0xLCBOVUxMLCAtMSwgLTEpOworCQlQUk9DX0lORk9fSU5DKHRiLT50Yl9zYiwgbGVhdmVzX3JlbW92YWJsZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKwogfQogCi0KLQogLyogd2hlbiB3ZSBkbyBub3Qgc3BsaXQgaXRlbSwgbG51bSBhbmQgcm51bSBhcmUgbnVtYmVycyBvZiBlbnRpcmUgaXRlbXMgKi8KICNkZWZpbmUgU0VUX1BBUl9TSElGVF9MRUZUIFwKIGlmIChoKVwKQEAgLTcwNCw3ICs3MzMsNiBAQAogCQkgICAgIC0xLCAtMSk7XAogfQogCi0KICNkZWZpbmUgU0VUX1BBUl9TSElGVF9SSUdIVCBcCiBpZiAoaClcCiB7XApAQCAtNzI0LDIxNCArNzUyLDE5OSBAQAogCQkgIC0xLCAtMSk7XAogfQogCitzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnNfaW5fdGIoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiKQoreworCWludCBuX2NvdW50ZXI7CiAKLXN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyc19pbl90YiAoCi0JCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiCi0JCSAgICAgICApIHsKLSAgaW50IG5fY291bnRlcjsKKwlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3NfdGItPnRiX3BhdGgpOwogCi0gIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHBfc190Yi0+dGJfcGF0aCk7Ci0gIAotICBmb3IgKCBuX2NvdW50ZXIgPSAwOyBuX2NvdW50ZXIgPCBNQVhfSEVJR0hUOyBuX2NvdW50ZXIrKyApIHsKLSAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+TFtuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkxbbl9jb3VudGVyXSA9IE5VTEw7Ci0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPlJbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5SW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GTFtuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkZMW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GUltuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkZSW25fY291bnRlcl0gPSBOVUxMOwotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9jb3VudGVyXSk7Ci0gICAgcF9zX3RiLT5DRkxbbl9jb3VudGVyXSA9IE5VTEw7Ci0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2NvdW50ZXJdKTsKLSAgICBwX3NfdGItPkNGUltuX2NvdW50ZXJdID0gTlVMTDsKLSAgfQorCWZvciAobl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgTUFYX0hFSUdIVDsgbl9jb3VudGVyKyspIHsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+TFtuX2NvdW50ZXJdID0gTlVMTDsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPlJbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+UltuX2NvdW50ZXJdID0gTlVMTDsKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25fY291bnRlcl0pOworCQlwX3NfdGItPkZMW25fY291bnRlcl0gPSBOVUxMOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+RlJbbl9jb3VudGVyXSA9IE5VTEw7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9jb3VudGVyXSk7CisJCXBfc190Yi0+Q0ZMW25fY291bnRlcl0gPSBOVUxMOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25fY291bnRlcl0pOworCQlwX3NfdGItPkNGUltuX2NvdW50ZXJdID0gTlVMTDsKKwl9CiB9CiAKLQogLyogR2V0IG5ldyBidWZmZXJzIGZvciBzdG9yaW5nIG5ldyBub2RlcyB0aGF0IGFyZSBjcmVhdGVkIHdoaWxlIGJhbGFuY2luZy4KICAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgTk9fRElTS19TUEFDRSAtIG5vIGRpc2sgc3BhY2UuCiAgKi8KIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KLXN0YXRpYyBpbnQgIGdldF9lbXB0eV9ub2RlcygKLSAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKLSAgICAgICAgICAgICAgaW50IG5faAotICAgICAgICAgICAgKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfbmV3X2JoLAotICAgIAkJICAgICAgKglwX3NfU2ggPSBQQVRIX0hfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBuX2gpOwotICBiX2Jsb2NrbnJfdAkgICAgICAqCXBfbl9ibG9ja25yLAotICAgIAkJCWFfbl9ibG9ja25yc1tNQVhfQU1PVU5UX05FRURFRF0gPSB7MCwgfTsKLSAgaW50ICAgICAgIAkJbl9jb3VudGVyLAotICAgCQkJbl9udW1iZXJfb2ZfZnJlZWJsaywKLSAgICAgICAgICAgICAgICAJbl9hbW91bnRfbmVlZGVkLC8qIG51bWJlciBvZiBuZWVkZWQgZW1wdHkgYmxvY2tzICovCi0JCQluX3JldHZhbCA9IENBUlJZX09OOwotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKglwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworc3RhdGljIGludCBnZXRfZW1wdHlfbm9kZXMoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBpbnQgbl9oKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX25ld19iaCwKKwkgICAgKnBfc19TaCA9IFBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKKwliX2Jsb2NrbnJfdCAqcF9uX2Jsb2NrbnIsIGFfbl9ibG9ja25yc1tNQVhfQU1PVU5UX05FRURFRF0gPSB7IDAsIH07CisJaW50IG5fY291bnRlciwgbl9udW1iZXJfb2ZfZnJlZWJsaywgbl9hbW91bnRfbmVlZGVkLAkvKiBudW1iZXIgb2YgbmVlZGVkIGVtcHR5IGJsb2NrcyAqLworCSBuX3JldHZhbCA9IENBUlJZX09OOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKIAorCS8qIG51bWJlcl9vZl9mcmVlYmxrIGlzIHRoZSBudW1iZXIgb2YgZW1wdHkgYmxvY2tzIHdoaWNoIGhhdmUgYmVlbgorCSAgIGFjcXVpcmVkIGZvciB1c2UgYnkgdGhlIGJhbGFuY2luZyBhbGdvcml0aG0gbWludXMgdGhlIG51bWJlciBvZgorCSAgIGVtcHR5IGJsb2NrcyB1c2VkIGluIHRoZSBwcmV2aW91cyBsZXZlbHMgb2YgdGhlIGFuYWx5c2lzLAorCSAgIG51bWJlcl9vZl9mcmVlYmxrID0gdGItPmN1cl9ibGtudW0gY2FuIGJlIG5vbi16ZXJvIGlmIGEgc2NoZWR1bGUgb2NjdXJzCisJICAgYWZ0ZXIgZW1wdHkgYmxvY2tzIGFyZSBhY3F1aXJlZCwgYW5kIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMgaXMKKwkgICB0aGVuIHJlc3RhcnRlZCwgYW1vdW50X25lZWRlZCBpcyB0aGUgbnVtYmVyIG5lZWRlZCBieSB0aGlzIGxldmVsCisJICAgKG5faCkgb2YgdGhlIGJhbGFuY2luZyBhbmFseXNpcy4KIAotICAvKiBudW1iZXJfb2ZfZnJlZWJsayBpcyB0aGUgbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyB3aGljaCBoYXZlIGJlZW4KLSAgICAgYWNxdWlyZWQgZm9yIHVzZSBieSB0aGUgYmFsYW5jaW5nIGFsZ29yaXRobSBtaW51cyB0aGUgbnVtYmVyIG9mCi0gICAgIGVtcHR5IGJsb2NrcyB1c2VkIGluIHRoZSBwcmV2aW91cyBsZXZlbHMgb2YgdGhlIGFuYWx5c2lzLAotICAgICBudW1iZXJfb2ZfZnJlZWJsayA9IHRiLT5jdXJfYmxrbnVtIGNhbiBiZSBub24temVybyBpZiBhIHNjaGVkdWxlIG9jY3VycwotICAgICBhZnRlciBlbXB0eSBibG9ja3MgYXJlIGFjcXVpcmVkLCBhbmQgdGhlIGJhbGFuY2luZyBhbmFseXNpcyBpcwotICAgICB0aGVuIHJlc3RhcnRlZCwgYW1vdW50X25lZWRlZCBpcyB0aGUgbnVtYmVyIG5lZWRlZCBieSB0aGlzIGxldmVsCi0gICAgIChuX2gpIG9mIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMuCi0JCQkgICAgCi0gICAgIE5vdGUgdGhhdCBmb3Igc3lzdGVtcyB3aXRoIG1hbnkgcHJvY2Vzc2VzIHdyaXRpbmcsIGl0IHdvdWxkIGJlCi0gICAgIG1vcmUgbGF5b3V0IG9wdGltYWwgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgbmVlZGVkIGJ5IGFsbAotICAgICBsZXZlbHMgYW5kIHRoZW4gdG8gcnVuIHJlaXNlcmZzX25ld19ibG9ja3MgdG8gZ2V0IGFsbCBvZiB0aGVtIGF0IG9uY2UuICAqLworCSAgIE5vdGUgdGhhdCBmb3Igc3lzdGVtcyB3aXRoIG1hbnkgcHJvY2Vzc2VzIHdyaXRpbmcsIGl0IHdvdWxkIGJlCisJICAgbW9yZSBsYXlvdXQgb3B0aW1hbCB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBuZWVkZWQgYnkgYWxsCisJICAgbGV2ZWxzIGFuZCB0aGVuIHRvIHJ1biByZWlzZXJmc19uZXdfYmxvY2tzIHRvIGdldCBhbGwgb2YgdGhlbSBhdCBvbmNlLiAgKi8KIAotICAvKiBJbml0aWF0ZSBudW1iZXJfb2ZfZnJlZWJsayB0byB0aGUgYW1vdW50IGFjcXVpcmVkIHByaW9yIHRvIHRoZSByZXN0YXJ0IG9mCi0gICAgIHRoZSBhbmFseXNpcyBvciAwIGlmIG5vdCByZXN0YXJ0ZWQsIHRoZW4gc3VidHJhY3QgdGhlIGFtb3VudCBuZWVkZWQKLSAgICAgYnkgYWxsIG9mIHRoZSBsZXZlbHMgb2YgdGhlIHRyZWUgYmVsb3cgbl9oLiAqLwotICAvKiBibGtudW0gaW5jbHVkZXMgU1tuX2hdLCBzbyB3ZSBzdWJ0cmFjdCAxIGluIHRoaXMgY2FsY3VsYXRpb24gKi8KLSAgZm9yICggbl9jb3VudGVyID0gMCwgbl9udW1iZXJfb2ZfZnJlZWJsayA9IHBfc190Yi0+Y3VyX2Jsa251bTsgbl9jb3VudGVyIDwgbl9oOyBuX2NvdW50ZXIrKyApCi0gICAgbl9udW1iZXJfb2ZfZnJlZWJsayAtPSAoIHBfc190Yi0+YmxrbnVtW25fY291bnRlcl0gKSA/IChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdIC0gMSkgOiAwOworCS8qIEluaXRpYXRlIG51bWJlcl9vZl9mcmVlYmxrIHRvIHRoZSBhbW91bnQgYWNxdWlyZWQgcHJpb3IgdG8gdGhlIHJlc3RhcnQgb2YKKwkgICB0aGUgYW5hbHlzaXMgb3IgMCBpZiBub3QgcmVzdGFydGVkLCB0aGVuIHN1YnRyYWN0IHRoZSBhbW91bnQgbmVlZGVkCisJICAgYnkgYWxsIG9mIHRoZSBsZXZlbHMgb2YgdGhlIHRyZWUgYmVsb3cgbl9oLiAqLworCS8qIGJsa251bSBpbmNsdWRlcyBTW25faF0sIHNvIHdlIHN1YnRyYWN0IDEgaW4gdGhpcyBjYWxjdWxhdGlvbiAqLworCWZvciAobl9jb3VudGVyID0gMCwgbl9udW1iZXJfb2ZfZnJlZWJsayA9IHBfc190Yi0+Y3VyX2Jsa251bTsKKwkgICAgIG5fY291bnRlciA8IG5faDsgbl9jb3VudGVyKyspCisJCW5fbnVtYmVyX29mX2ZyZWVibGsgLT0KKwkJICAgIChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdKSA/IChwX3NfdGItPmJsa251bVtuX2NvdW50ZXJdIC0KKwkJCQkJCSAgIDEpIDogMDsKIAotICAvKiBBbGxvY2F0ZSBtaXNzaW5nIGVtcHR5IGJsb2Nrcy4gKi8KLSAgLyogaWYgcF9zX1NoID09IDAgIHRoZW4gd2UgYXJlIGdldHRpbmcgYSBuZXcgcm9vdCAqLwotICBuX2Ftb3VudF9uZWVkZWQgPSAoIHBfc19TaCApID8gKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKSA6IDE7Ci0gIC8qICBBbW91bnRfbmVlZGVkID0gdGhlIGFtb3VudCB0aGF0IHdlIG5lZWQgbW9yZSB0aGFuIHRoZSBhbW91bnQgdGhhdCB3ZSBoYXZlLiAqLwotICBpZiAoIG5fYW1vdW50X25lZWRlZCA+IG5fbnVtYmVyX29mX2ZyZWVibGsgKQotICAgIG5fYW1vdW50X25lZWRlZCAtPSBuX251bWJlcl9vZl9mcmVlYmxrOwotICBlbHNlIC8qIElmIHdlIGhhdmUgZW5vdWdoIGFscmVhZHkgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLwotICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBBbGxvY2F0ZSBtaXNzaW5nIGVtcHR5IGJsb2Nrcy4gKi8KKwkvKiBpZiBwX3NfU2ggPT0gMCAgdGhlbiB3ZSBhcmUgZ2V0dGluZyBhIG5ldyByb290ICovCisJbl9hbW91bnRfbmVlZGVkID0gKHBfc19TaCkgPyAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpIDogMTsKKwkvKiAgQW1vdW50X25lZWRlZCA9IHRoZSBhbW91bnQgdGhhdCB3ZSBuZWVkIG1vcmUgdGhhbiB0aGUgYW1vdW50IHRoYXQgd2UgaGF2ZS4gKi8KKwlpZiAobl9hbW91bnRfbmVlZGVkID4gbl9udW1iZXJfb2ZfZnJlZWJsaykKKwkJbl9hbW91bnRfbmVlZGVkIC09IG5fbnVtYmVyX29mX2ZyZWVibGs7CisJZWxzZQkJCS8qIElmIHdlIGhhdmUgZW5vdWdoIGFscmVhZHkgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAqLworCQlyZXR1cm4gQ0FSUllfT047CiAKLSAgLyogTm8gbmVlZCB0byBjaGVjayBxdW90YSAtIGlzIG5vdCBhbGxvY2F0ZWQgZm9yIGJsb2NrcyB1c2VkIGZvciBmb3JtYXR0ZWQgbm9kZXMgKi8KLSAgaWYgKHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzIChwX3NfdGIsIGFfbl9ibG9ja25ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9hbW91bnRfbmVlZGVkKSA9PSBOT19ESVNLX1NQQUNFKQotICAgIHJldHVybiBOT19ESVNLX1NQQUNFOworCS8qIE5vIG5lZWQgdG8gY2hlY2sgcXVvdGEgLSBpcyBub3QgYWxsb2NhdGVkIGZvciBibG9ja3MgdXNlZCBmb3IgZm9ybWF0dGVkIG5vZGVzICovCisJaWYgKHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzKHBfc190YiwgYV9uX2Jsb2NrbnJzLAorCQkJCSAgICAgICBuX2Ftb3VudF9uZWVkZWQpID09IE5PX0RJU0tfU1BBQ0UpCisJCXJldHVybiBOT19ESVNLX1NQQUNFOwogCi0gIC8qIGZvciBlYWNoIGJsb2NrbnVtYmVyIHdlIGp1c3QgZ290LCBnZXQgYSBidWZmZXIgYW5kIHN0aWNrIGl0IG9uIEZFQiAqLwotICBmb3IgKCBwX25fYmxvY2tuciA9IGFfbl9ibG9ja25ycywgbl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgbl9hbW91bnRfbmVlZGVkOwotCXBfbl9ibG9ja25yKyssIG5fY291bnRlcisrICkgeyAKKwkvKiBmb3IgZWFjaCBibG9ja251bWJlciB3ZSBqdXN0IGdvdCwgZ2V0IGEgYnVmZmVyIGFuZCBzdGljayBpdCBvbiBGRUIgKi8KKwlmb3IgKHBfbl9ibG9ja25yID0gYV9uX2Jsb2NrbnJzLCBuX2NvdW50ZXIgPSAwOworCSAgICAgbl9jb3VudGVyIDwgbl9hbW91bnRfbmVlZGVkOyBwX25fYmxvY2tucisrLCBuX2NvdW50ZXIrKykgewogCi0gICAgUkZBTFNFKCAhICpwX25fYmxvY2tuciwKLQkgICAgIlBBUC04MTM1OiByZWlzZXJmc19uZXdfYmxvY2tucnMgZmFpbGVkIHdoZW4gZ290IG5ldyBibG9ja3MiKTsKKwkJUkZBTFNFKCEqcF9uX2Jsb2NrbnIsCisJCSAgICAgICAiUEFQLTgxMzU6IHJlaXNlcmZzX25ld19ibG9ja25ycyBmYWlsZWQgd2hlbiBnb3QgbmV3IGJsb2NrcyIpOwogCi0gICAgcF9zX25ld19iaCA9IHNiX2dldGJsayhwX3Nfc2IsICpwX25fYmxvY2tucik7Ci0gICAgUkZBTFNFIChidWZmZXJfZGlydHkgKHBfc19uZXdfYmgpIHx8Ci0JICAgIGJ1ZmZlcl9qb3VybmFsZWQgKHBfc19uZXdfYmgpIHx8Ci0JICAgIGJ1ZmZlcl9qb3VybmFsX2RpcnR5IChwX3NfbmV3X2JoKSwKLQkgICAgIlBBUC04MTQwOiBqb3VybmxhbGVkIG9yIGRpcnR5IGJ1ZmZlciAlYiBmb3IgdGhlIG5ldyBibG9jayIsIAotCSAgICBwX3NfbmV3X2JoKTsKLSAgICAKLSAgICAvKiBQdXQgZW1wdHkgYnVmZmVycyBpbnRvIHRoZSBhcnJheS4gKi8KLSAgICBSRkFMU0UgKHBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bV0sCi0JICAgICJQQVAtODE0MTogYnVzeSBzbG90IGZvciBuZXcgYnVmZmVyIik7CisJCXBfc19uZXdfYmggPSBzYl9nZXRibGsocF9zX3NiLCAqcF9uX2Jsb2NrbnIpOworCQlSRkFMU0UoYnVmZmVyX2RpcnR5KHBfc19uZXdfYmgpIHx8CisJCSAgICAgICBidWZmZXJfam91cm5hbGVkKHBfc19uZXdfYmgpIHx8CisJCSAgICAgICBidWZmZXJfam91cm5hbF9kaXJ0eShwX3NfbmV3X2JoKSwKKwkJICAgICAgICJQQVAtODE0MDogam91cm5sYWxlZCBvciBkaXJ0eSBidWZmZXIgJWIgZm9yIHRoZSBuZXcgYmxvY2siLAorCQkgICAgICAgcF9zX25ld19iaCk7CiAKLSAgICBzZXRfYnVmZmVyX2pvdXJuYWxfbmV3IChwX3NfbmV3X2JoKTsKLSAgICBwX3NfdGItPkZFQltwX3NfdGItPmN1cl9ibGtudW0rK10gPSBwX3NfbmV3X2JoOwotICB9CisJCS8qIFB1dCBlbXB0eSBidWZmZXJzIGludG8gdGhlIGFycmF5LiAqLworCQlSRkFMU0UocF9zX3RiLT5GRUJbcF9zX3RiLT5jdXJfYmxrbnVtXSwKKwkJICAgICAgICJQQVAtODE0MTogYnVzeSBzbG90IGZvciBuZXcgYnVmZmVyIik7CiAKLSAgaWYgKCBuX3JldHZhbCA9PSBDQVJSWV9PTiAmJiBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKQotICAgIG5fcmV0dmFsID0gUkVQRUFUX1NFQVJDSCA7CisJCXNldF9idWZmZXJfam91cm5hbF9uZXcocF9zX25ld19iaCk7CisJCXBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bSsrXSA9IHBfc19uZXdfYmg7CisJfQogCi0gIHJldHVybiBuX3JldHZhbDsKKwlpZiAobl9yZXR2YWwgPT0gQ0FSUllfT04gJiYgRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpCisJCW5fcmV0dmFsID0gUkVQRUFUX1NFQVJDSDsKKworCXJldHVybiBuX3JldHZhbDsKIH0KIAotCiAvKiBHZXQgZnJlZSBzcGFjZSBvZiB0aGUgbGVmdCBuZWlnaGJvciwgd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBwYXJlbnQKICAqIG5vZGUgb2YgdGhlIGxlZnQgbmVpZ2hib3IuICAqLwotc3RhdGljIGludCBnZXRfbGZyZWUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGdldF9sZnJlZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbCwgKiBmOwotICAgIGludCBvcmRlcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmwsICpmOworCWludCBvcmRlcjsKIAotICAgIGlmICgoZiA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpID09IDAgfHwgKGwgPSB0Yi0+RkxbaF0pID09IDApCi0JcmV0dXJuIDA7CisJaWYgKChmID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChsID0gdGItPkZMW2hdKSA9PSAwKQorCQlyZXR1cm4gMDsKIAotICAgIGlmIChmID09IGwpCi0Jb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgaCkgLSAxOwotICAgIGVsc2UgewotCW9yZGVyID0gQl9OUl9JVEVNUyAobCk7Ci0JZiA9IGw7Ci0gICAgfQorCWlmIChmID09IGwpCisJCW9yZGVyID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkgLSAxOworCWVsc2UgeworCQlvcmRlciA9IEJfTlJfSVRFTVMobCk7CisJCWYgPSBsOworCX0KIAotICAgIHJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKEJfTl9DSElMRChmLG9yZGVyKSkpOworCXJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKEJfTl9DSElMRChmLCBvcmRlcikpKTsKIH0KIAotCiAvKiBHZXQgZnJlZSBzcGFjZSBvZiB0aGUgcmlnaHQgbmVpZ2hib3IsCiAgKiB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHBhcmVudCBub2RlIG9mIHRoZSByaWdodCBuZWlnaGJvci4KICAqLwotc3RhdGljIGludCBnZXRfcmZyZWUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGdldF9yZnJlZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIHIsICogZjsKLSAgaW50IG9yZGVyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqciwgKmY7CisJaW50IG9yZGVyOwogCi0gIGlmICgoZiA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpID09IDAgfHwgKHIgPSB0Yi0+RlJbaF0pID09IDApCi0gICAgcmV0dXJuIDA7CisJaWYgKChmID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChyID0gdGItPkZSW2hdKSA9PSAwKQorCQlyZXR1cm4gMDsKIAotICBpZiAoZiA9PSByKQotICAgICAgb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgaCkgKyAxOwotICBlbHNlIHsKLSAgICAgIG9yZGVyID0gMDsKLSAgICAgIGYgPSByOwotICB9CisJaWYgKGYgPT0gcikKKwkJb3JkZXIgPSBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSArIDE7CisJZWxzZSB7CisJCW9yZGVyID0gMDsKKwkJZiA9IHI7CisJfQogCi0gIHJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKCBCX05fQ0hJTEQoZixvcmRlcikpKTsKKwlyZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZShCX05fQ0hJTEQoZiwgb3JkZXIpKSk7CiAKIH0KIAotCiAvKiBDaGVjayB3aGV0aGVyIGxlZnQgbmVpZ2hib3IgaXMgaW4gbWVtb3J5LiAqLwotc3RhdGljIGludCAgaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSgKLSAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5faAotICAgICAgICAgICAgKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfZmF0aGVyLCAqIGxlZnQ7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOwotICBiX2Jsb2NrbnJfdAkJbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnI7Ci0gIGludCAgICAgICAgICAgICAgICAgICBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb247CitzdGF0aWMgaW50IGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBpbnQgbl9oKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2ZhdGhlciwgKmxlZnQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwX3NfdGItPnRiX3NiOworCWJfYmxvY2tucl90IG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yOworCWludCBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb247CiAKLSAgaWYgKCAhIHBfc190Yi0+Rkxbbl9oXSApIC8qIEZhdGhlciBvZiB0aGUgbGVmdCBuZWlnaGJvciBkb2VzIG5vdCBleGlzdC4gKi8KLSAgICByZXR1cm4gMDsKKwlpZiAoIXBfc190Yi0+Rkxbbl9oXSkJLyogRmF0aGVyIG9mIHRoZSBsZWZ0IG5laWdoYm9yIGRvZXMgbm90IGV4aXN0LiAqLworCQlyZXR1cm4gMDsKIAotICAvKiBDYWxjdWxhdGUgZmF0aGVyIG9mIHRoZSBub2RlIHRvIGJlIGJhbGFuY2VkLiAqLwotICBwX3NfZmF0aGVyID0gUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKKwkvKiBDYWxjdWxhdGUgZmF0aGVyIG9mIHRoZSBub2RlIHRvIGJlIGJhbGFuY2VkLiAqLworCXBfc19mYXRoZXIgPSBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOwogCi0gIFJGQUxTRSggISBwX3NfZmF0aGVyIHx8IAotCSAgISBCX0lTX0lOX1RSRUUgKHBfc19mYXRoZXIpIHx8IAotCSAgISBCX0lTX0lOX1RSRUUgKHBfc190Yi0+Rkxbbl9oXSkgfHwKLQkgICEgYnVmZmVyX3VwdG9kYXRlIChwX3NfZmF0aGVyKSB8fCAKLQkgICEgYnVmZmVyX3VwdG9kYXRlIChwX3NfdGItPkZMW25faF0pLAotCSAgInZzLTgxNjU6IEZbaF0gKCViKSBvciBGTFtoXSAoJWIpIGlzIGludmFsaWQiLCAKLQkgIHBfc19mYXRoZXIsIHBfc190Yi0+Rkxbbl9oXSk7CisJUkZBTFNFKCFwX3NfZmF0aGVyIHx8CisJICAgICAgICFCX0lTX0lOX1RSRUUocF9zX2ZhdGhlcikgfHwKKwkgICAgICAgIUJfSVNfSU5fVFJFRShwX3NfdGItPkZMW25faF0pIHx8CisJICAgICAgICFidWZmZXJfdXB0b2RhdGUocF9zX2ZhdGhlcikgfHwKKwkgICAgICAgIWJ1ZmZlcl91cHRvZGF0ZShwX3NfdGItPkZMW25faF0pLAorCSAgICAgICAidnMtODE2NTogRltoXSAoJWIpIG9yIEZMW2hdICglYikgaXMgaW52YWxpZCIsCisJICAgICAgIHBfc19mYXRoZXIsIHBfc190Yi0+Rkxbbl9oXSk7CiAKKwkvKiBHZXQgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgdG8gdGhlIGxlZnQgbmVpZ2hib3IgaW50byB0aGUgbGVmdCBmYXRoZXIuICovCisJbl9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uID0gKHBfc19mYXRoZXIgPT0gcF9zX3RiLT5GTFtuX2hdKSA/CisJICAgIHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyhwX3NfdGItPkZMW25faF0pOworCS8qIEdldCBsZWZ0IG5laWdoYm9yIGJsb2NrIG51bWJlci4gKi8KKwluX2xlZnRfbmVpZ2hib3JfYmxvY2tuciA9CisJICAgIEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2xlZnRfbmVpZ2hib3JfcG9zaXRpb24pOworCS8qIExvb2sgZm9yIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZSBjYWNoZS4gKi8KKwlpZiAoKGxlZnQgPSBzYl9maW5kX2dldF9ibG9jayhwX3Nfc2IsIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yKSkpIHsKIAotICAvKiBHZXQgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgdG8gdGhlIGxlZnQgbmVpZ2hib3IgaW50byB0aGUgbGVmdCBmYXRoZXIuICovCi0gIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiA9ICggcF9zX2ZhdGhlciA9PSBwX3NfdGItPkZMW25faF0gKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgcF9zX3RiLT5sa2V5W25faF0gOiBCX05SX0lURU1TIChwX3NfdGItPkZMW25faF0pOwotICAvKiBHZXQgbGVmdCBuZWlnaGJvciBibG9jayBudW1iZXIuICovCi0gIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbik7Ci0gIC8qIExvb2sgZm9yIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZSBjYWNoZS4gKi8KLSAgaWYgKCAobGVmdCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHBfc19zYiwgbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnIpKSApIHsKKwkJUkZBTFNFKGJ1ZmZlcl91cHRvZGF0ZShsZWZ0KSAmJiAhQl9JU19JTl9UUkVFKGxlZnQpLAorCQkgICAgICAgInZzLTgxNzA6IGxlZnQgbmVpZ2hib3IgKCViICV6KSBpcyBub3QgaW4gdGhlIHRyZWUiLAorCQkgICAgICAgbGVmdCwgbGVmdCk7CisJCXB1dF9iaChsZWZ0KTsKKwkJcmV0dXJuIDE7CisJfQogCi0gICAgUkZBTFNFKCBidWZmZXJfdXB0b2RhdGUgKGxlZnQpICYmICEgQl9JU19JTl9UUkVFKGxlZnQpLAotCSAgICAidnMtODE3MDogbGVmdCBuZWlnaGJvciAoJWIgJXopIGlzIG5vdCBpbiB0aGUgdHJlZSIsIGxlZnQsIGxlZnQpOwotICAgIHB1dF9iaChsZWZ0KSA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAotCiAjZGVmaW5lIExFRlRfUEFSRU5UUyAgJ2wnCiAjZGVmaW5lIFJJR0hUX1BBUkVOVFMgJ3InCiAKLQotc3RhdGljIHZvaWQgZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBwX3Nfa2V5KQorc3RhdGljIHZvaWQgZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqcF9zX2tleSkKIHsKLSAgICAvLyBjYWxsIGl0ZW0gc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHRoaXMga2V5Ci0gICAgaXRlbV9vcHNbY3B1X2tleV9rX3R5cGUgKHBfc19rZXkpXS0+ZGVjcmVtZW50X2tleSAocF9zX2tleSk7CisJLy8gY2FsbCBpdGVtIHNwZWNpZmljIGZ1bmN0aW9uIGZvciB0aGlzIGtleQorCWl0ZW1fb3BzW2NwdV9rZXlfa190eXBlKHBfc19rZXkpXS0+ZGVjcmVtZW50X2tleShwX3Nfa2V5KTsKIH0KIAotCi0KLQogLyogQ2FsY3VsYXRlIGZhciBsZWZ0L3JpZ2h0IHBhcmVudCBvZiB0aGUgbGVmdC9yaWdodCBuZWlnaGJvciBvZiB0aGUgY3VycmVudCBub2RlLCB0aGF0CiAgKiBpcyBjYWxjdWxhdGUgdGhlIGxlZnQvcmlnaHQgKEZMW2hdL0ZSW2hdKSBuZWlnaGJvciBvZiB0aGUgcGFyZW50IEZbaF0uCiAgKiBDYWxjdWxhdGUgbGVmdC9yaWdodCBjb21tb24gcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIExbaF0vUltoXS4KQEAgLTk0MCwxMTEgKzk1MywxMjEgQEAKICAJCVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gICAgICAgICAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOwogICovCi1zdGF0aWMgaW50ICBnZXRfZmFyX3BhcmVudCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqICAgcF9zX3RiLAotCQkJICAgIGludCAgICAgICAgICAgICAgICAgICAgIG5faCwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICoqICBwcF9zX2ZhdGhlciwKLQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICoqICBwcF9zX2NvbV9mYXRoZXIsCi0JCQkgICAgY2hhciAgICAgICAgICAgICAgICAgICAgY19scl9wYXIpIAorc3RhdGljIGludCBnZXRfZmFyX3BhcmVudChzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsCisJCQkgIGludCBuX2gsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBwX3NfZmF0aGVyLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwcF9zX2NvbV9mYXRoZXIsIGNoYXIgY19scl9wYXIpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19wYXJlbnQ7Ci0gICAgSU5JVElBTElaRV9QQVRIIChzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKLSAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOwotICAgIHN0cnVjdCBjcHVfa2V5CXNfbHJfZmF0aGVyX2tleTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9jb3VudGVyLAotCW5fcG9zaXRpb24gPSBJTlRfTUFYLAotCW5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IDAsCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfcGF0aCwgbl9oKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19wYXJlbnQ7CisJSU5JVElBTElaRV9QQVRIKHNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOworCXN0cnVjdCBwYXRoICpwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKKwlzdHJ1Y3QgY3B1X2tleSBzX2xyX2ZhdGhlcl9rZXk7CisJaW50IG5fY291bnRlciwKKwkgICAgbl9wb3NpdGlvbiA9IElOVF9NQVgsCisJICAgIG5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IDAsCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCk7CiAKLSAgICAvKiBTdGFydGluZyBmcm9tIEZbbl9oXSBnbyB1cHdhcmRzIGluIHRoZSB0cmVlLCBhbmQgbG9vayBmb3IgdGhlIGNvbW1vbgotICAgICAgYW5jZXN0b3Igb2YgRltuX2hdLCBhbmQgaXRzIG5laWdoYm9yIGwvciwgdGhhdCBzaG91bGQgYmUgb2J0YWluZWQuICovCisJLyogU3RhcnRpbmcgZnJvbSBGW25faF0gZ28gdXB3YXJkcyBpbiB0aGUgdHJlZSwgYW5kIGxvb2sgZm9yIHRoZSBjb21tb24KKwkgICBhbmNlc3RvciBvZiBGW25faF0sIGFuZCBpdHMgbmVpZ2hib3IgbC9yLCB0aGF0IHNob3VsZCBiZSBvYnRhaW5lZC4gKi8KIAotICAgIG5fY291bnRlciA9IG5fcGF0aF9vZmZzZXQ7CisJbl9jb3VudGVyID0gbl9wYXRoX29mZnNldDsKIAotICAgIFJGQUxTRSggbl9jb3VudGVyIDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICAgIlBBUC04MTgwOiBpbnZhbGlkIHBhdGggbGVuZ3RoIik7CisJUkZBTFNFKG5fY291bnRlciA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICAgICJQQVAtODE4MDogaW52YWxpZCBwYXRoIGxlbmd0aCIpOwogCi0gIAotICAgIGZvciAoIDsgbl9jb3VudGVyID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVDsgbl9jb3VudGVyLS0gICkgIHsKLQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBvZiB0aGUgY3VycmVudCBidWZmZXIgaW4gdGhlIHBhdGggaXMgcmVhbGx5IHBhcmVudCBpbiB0aGUgdHJlZS4gKi8KLQlpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkgKQotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQkvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KLQlpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fY291bnRlciAtIDEpKSA+IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KLQlpZiAoIEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KLQkgICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fY291bnRlciktPmJfYmxvY2tuciApCi0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOwotCS8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCBlcXVhbCB0byBmaXJzdC9sYXN0IG9uZS4gKi8KLQlpZiAoIGNfbHJfcGFyID09IFJJR0hUX1BBUkVOVFMgKQotCSAgICBuX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSBCX05SX0lURU1TIChwX3NfcGFyZW50KTsKLQlpZiAoIG5fcG9zaXRpb24gIT0gbl9maXJzdF9sYXN0X3Bvc2l0aW9uICkgewotCSAgICAqcHBfc19jb21fZmF0aGVyID0gcF9zX3BhcmVudDsKLQkgICAgZ2V0X2JoKCpwcF9zX2NvbV9mYXRoZXIpIDsKLQkgICAgLyooKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQpLT5iX2NvdW50Kys7Ki8KLQkgICAgYnJlYWs7CisJZm9yICg7IG5fY291bnRlciA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQ7IG5fY291bnRlci0tKSB7CisJCS8qIENoZWNrIHdoZXRoZXIgcGFyZW50IG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyByZWFsbHkgcGFyZW50IGluIHRoZSB0cmVlLiAqLworCQlpZiAoIUJfSVNfSU5fVFJFRQorCQkgICAgKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJLyogQ2hlY2sgd2hldGhlciBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIGNvcnJlY3QuICovCisJCWlmICgobl9wb3NpdGlvbiA9CisJCSAgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsCisJCQkJCSAgbl9jb3VudGVyIC0gMSkpID4KKwkJICAgIEJfTlJfSVRFTVMocF9zX3BhcmVudCkpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCisJCWlmIChCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9CisJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIpLT5iX2Jsb2NrbnIpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIGZpcnN0L2xhc3Qgb25lLiAqLworCQlpZiAoY19scl9wYXIgPT0gUklHSFRfUEFSRU5UUykKKwkJCW5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IEJfTlJfSVRFTVMocF9zX3BhcmVudCk7CisJCWlmIChuX3Bvc2l0aW9uICE9IG5fZmlyc3RfbGFzdF9wb3NpdGlvbikgeworCQkJKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQ7CisJCQlnZXRfYmgoKnBwX3NfY29tX2ZhdGhlcik7CisJCQkvKigqcHBfc19jb21fZmF0aGVyID0gcF9zX3BhcmVudCktPmJfY291bnQrKzsgKi8KKwkJCWJyZWFrOworCQl9CiAJfQotICAgIH0KIAotICAgIC8qIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgdGhlbiB0aGVyZSBpcyBubyBjb21tb24gZmF0aGVyICovCi0gICAgaWYgKCBuX2NvdW50ZXIgPT0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKLQkvKiBDaGVjayB3aGV0aGVyIGZpcnN0IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gKi8KLQlpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0JICAgICBTQl9ST09UX0JMT0NLIChwX3NfdGItPnRiX3NiKSApIHsKLQkgICAgKnBwX3NfZmF0aGVyID0gKnBwX3NfY29tX2ZhdGhlciA9IE5VTEw7Ci0JICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyZWUsIHRoZW4gdGhlcmUgaXMgbm8gY29tbW9uIGZhdGhlciAqLworCWlmIChuX2NvdW50ZXIgPT0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCQkvKiBDaGVjayB3aGV0aGVyIGZpcnN0IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gKi8KKwkJaWYgKFBBVEhfT0ZGU0VUX1BCVUZGRVIKKwkJICAgIChwX3NfdGItPnRiX3BhdGgsCisJCSAgICAgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQorCQkgICAgU0JfUk9PVF9CTE9DSyhwX3NfdGItPnRiX3NiKSkgeworCQkJKnBwX3NfZmF0aGVyID0gKnBwX3NfY29tX2ZhdGhlciA9IE5VTEw7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAJfQotCXJldHVybiBSRVBFQVRfU0VBUkNIOwotICAgIH0KIAotICAgIFJGQUxTRSggQl9MRVZFTCAoKnBwX3NfY29tX2ZhdGhlcikgPD0gRElTS19MRUFGX05PREVfTEVWRUwsCi0JICAgICJQQVAtODE4NTogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLCAKLQkgICAgKnBwX3NfY29tX2ZhdGhlciwgKnBwX3NfY29tX2ZhdGhlcik7CisJUkZBTFNFKEJfTEVWRUwoKnBwX3NfY29tX2ZhdGhlcikgPD0gRElTS19MRUFGX05PREVfTEVWRUwsCisJICAgICAgICJQQVAtODE4NTogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLAorCSAgICAgICAqcHBfc19jb21fZmF0aGVyLCAqcHBfc19jb21fZmF0aGVyKTsKIAotICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1vbiBwYXJlbnQgaXMgbG9ja2VkLiAqLworCS8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1vbiBwYXJlbnQgaXMgbG9ja2VkLiAqLwogCi0gICAgaWYgKCBidWZmZXJfbG9ja2VkICgqcHBfc19jb21fZmF0aGVyKSApIHsKLQlfX3dhaXRfb25fYnVmZmVyKCpwcF9zX2NvbV9mYXRoZXIpOwotCWlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgewotCSAgICBkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOwotCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwlpZiAoYnVmZmVyX2xvY2tlZCgqcHBfc19jb21fZmF0aGVyKSkgeworCQlfX3dhaXRfb25fYnVmZmVyKCpwcF9zX2NvbV9mYXRoZXIpOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJCWRlY3JlbWVudF9iY291bnQoKnBwX3NfY29tX2ZhdGhlcik7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICAvKiBTbywgd2UgZ290IGNvbW1vbiBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgaXRzIGxlZnQvcmlnaHQgbmVpZ2hib3IuCi0gICAgIE5vdyB3ZSBhcmUgZ2V0aW5nIHRoZSBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCisJLyogU28sIHdlIGdvdCBjb21tb24gcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIGl0cyBsZWZ0L3JpZ2h0IG5laWdoYm9yLgorCSAgIE5vdyB3ZSBhcmUgZ2V0aW5nIHRoZSBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCiAKLSAgICAvKiBGb3JtIGtleSB0byBnZXQgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yLiAqLwotICAgIGxlX2tleTJjcHVfa2V5ICgmc19scl9mYXRoZXJfa2V5LCBCX05fUERFTElNX0tFWSgqcHBfc19jb21fZmF0aGVyLCAoIGNfbHJfcGFyID09IExFRlRfUEFSRU5UUyApID8KLQkJCQkJCSAgICAgKHBfc190Yi0+bGtleVtuX2ggLSAxXSA9IG5fcG9zaXRpb24gLSAxKSA6IChwX3NfdGItPnJrZXlbbl9oIC0gMV0gPSBuX3Bvc2l0aW9uKSkpOworCS8qIEZvcm0ga2V5IHRvIGdldCBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IuICovCisJbGVfa2V5MmNwdV9rZXkoJnNfbHJfZmF0aGVyX2tleSwKKwkJICAgICAgIEJfTl9QREVMSU1fS0VZKCpwcF9zX2NvbV9mYXRoZXIsCisJCQkJICAgICAgKGNfbHJfcGFyID09CisJCQkJICAgICAgIExFRlRfUEFSRU5UUykgPyAocF9zX3RiLT5sa2V5W25faCAtIDFdID0KKwkJCQkJCQluX3Bvc2l0aW9uIC0KKwkJCQkJCQkxKSA6IChwX3NfdGItPnJrZXlbbl9oIC0KKwkJCQkJCQkJCSAgIDFdID0KKwkJCQkJCQkgICAgICBuX3Bvc2l0aW9uKSkpOwogCisJaWYgKGNfbHJfcGFyID09IExFRlRfUEFSRU5UUykKKwkJZGVjcmVtZW50X2tleSgmc19scl9mYXRoZXJfa2V5KTsKIAotICAgIGlmICggY19scl9wYXIgPT0gTEVGVF9QQVJFTlRTICkKLQlkZWNyZW1lbnRfa2V5KCZzX2xyX2ZhdGhlcl9rZXkpOworCWlmIChzZWFyY2hfYnlfa2V5CisJICAgIChwX3NfdGItPnRiX3NiLCAmc19scl9mYXRoZXJfa2V5LCAmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlciwKKwkgICAgIG5faCArIDEpID09IElPX0VSUk9SKQorCQkvLyBwYXRoIGlzIHJlbGVhc2VkCisJCXJldHVybiBJT19FUlJPUjsKIAotICAgIGlmIChzZWFyY2hfYnlfa2V5KHBfc190Yi0+dGJfc2IsICZzX2xyX2ZhdGhlcl9rZXksICZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLCBuX2ggKyAxKSA9PSBJT19FUlJPUikKLQkvLyBwYXRoIGlzIHJlbGVhc2VkCi0JcmV0dXJuIElPX0VSUk9SOworCWlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIocF9zX3RiKSkgeworCQlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7CisJCWRlY3JlbWVudF9iY291bnQoKnBwX3NfY29tX2ZhdGhlcik7CisJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCX0KIAotICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgeworCSpwcF9zX2ZhdGhlciA9IFBBVEhfUExBU1RfQlVGRkVSKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKworCVJGQUxTRShCX0xFVkVMKCpwcF9zX2ZhdGhlcikgIT0gbl9oICsgMSwKKwkgICAgICAgIlBBUC04MTkwOiAoJWIgJXopIGxldmVsIHRvbyBzbWFsbCIsICpwcF9zX2ZhdGhlciwgKnBwX3NfZmF0aGVyKTsKKwlSRkFMU0Uoc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlci5wYXRoX2xlbmd0aCA8CisJICAgICAgIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsICJQQVAtODE5MjogcGF0aCBsZW5ndGggaXMgdG9vIHNtYWxsIik7CisKKwlzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLnBhdGhfbGVuZ3RoLS07CiAJZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOwotCWRlY3JlbWVudF9iY291bnQoKnBwX3NfY29tX2ZhdGhlcik7Ci0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0gICAgfQotCi0gICAgKnBwX3NfZmF0aGVyID0gUEFUSF9QTEFTVF9CVUZGRVIoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOwotCi0gICAgUkZBTFNFKCBCX0xFVkVMICgqcHBfc19mYXRoZXIpICE9IG5faCArIDEsCi0JICAgICJQQVAtODE5MDogKCViICV6KSBsZXZlbCB0b28gc21hbGwiLCAqcHBfc19mYXRoZXIsICpwcF9zX2ZhdGhlcik7Ci0gICAgUkZBTFNFKCBzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLnBhdGhfbGVuZ3RoIDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICAgIlBBUC04MTkyOiBwYXRoIGxlbmd0aCBpcyB0b28gc21hbGwiKTsKLQotICAgIHNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIucGF0aF9sZW5ndGgtLTsKLSAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlcik7Ci0gICAgcmV0dXJuIENBUlJZX09OOworCXJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAvKiBHZXQgcGFyZW50cyBvZiBuZWlnaGJvcnMgb2Ygbm9kZSBpbiB0aGUgcGF0aChTW25fcGF0aF9vZmZzZXRdKSBhbmQgY29tbW9uIHBhcmVudHMgb2YKICAqIFNbbl9wYXRoX29mZnNldF0gYW5kIExbbl9wYXRoX29mZnNldF0vUltuX3BhdGhfb2Zmc2V0XTogRltuX3BhdGhfb2Zmc2V0XSwgRkxbbl9wYXRoX29mZnNldF0sCiAgKiBGUltuX3BhdGhfb2Zmc2V0XSwgQ0ZMW25fcGF0aF9vZmZzZXRdLCBDRlJbbl9wYXRoX29mZnNldF0uCkBAIC0xMDUyLDEyMiArMTA3NSwxMjcgQEAKICAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKICAqLwotc3RhdGljIGludCAgZ2V0X3BhcmVudHMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsIGludCBuX2gpCitzdGF0aWMgaW50IGdldF9wYXJlbnRzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKIHsKLSAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCi0Jbl9yZXRfdmFsdWUsCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19jdXJmLAotCSogcF9zX2N1cmNmOworCXN0cnVjdCBwYXRoICpwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKKwlpbnQgbl9wb3NpdGlvbiwKKwkgICAgbl9yZXRfdmFsdWUsCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2gpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2N1cmYsICpwX3NfY3VyY2Y7CiAKLSAgICAvKiBDdXJyZW50IG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb3Igd2lsbCBiZSByb290IG9mIHRoZSB0cmVlICovCi0gICAgaWYgKCBuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7Ci0JLyogVGhlIHJvb3QgY2FuIG5vdCBoYXZlIHBhcmVudHMuCi0JICAgUmVsZWFzZSBub2RlcyB3aGljaCBwcmV2aW91c2x5IHdlcmUgb2J0YWluZWQgYXMgcGFyZW50cyBvZiB0aGUgY3VycmVudCBub2RlIG5laWdoYm9ycy4gKi8KKwkvKiBDdXJyZW50IG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb3Igd2lsbCBiZSByb290IG9mIHRoZSB0cmVlICovCisJaWYgKG5fcGF0aF9vZmZzZXQgPD0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCQkvKiBUaGUgcm9vdCBjYW4gbm90IGhhdmUgcGFyZW50cy4KKwkJICAgUmVsZWFzZSBub2RlcyB3aGljaCBwcmV2aW91c2x5IHdlcmUgb2J0YWluZWQgYXMgcGFyZW50cyBvZiB0aGUgY3VycmVudCBub2RlIG5laWdoYm9ycy4gKi8KKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZMW25faF0pOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25faF0pOworCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7CisJCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7CisJCXBfc190Yi0+Rkxbbl9oXSA9IHBfc190Yi0+Q0ZMW25faF0gPSBwX3NfdGItPkZSW25faF0gPQorCQkgICAgcF9zX3RiLT5DRlJbbl9oXSA9IE5VTEw7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBHZXQgcGFyZW50IEZMW25fcGF0aF9vZmZzZXRdIG9mIExbbl9wYXRoX29mZnNldF0uICovCisJaWYgKChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkpIHsKKwkJLyogQ3VycmVudCBub2RlIGlzIG5vdCB0aGUgZmlyc3QgY2hpbGQgb2YgaXRzIHBhcmVudC4gKi8KKwkJLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7ICovCisJCXBfc19jdXJmID0gcF9zX2N1cmNmID0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJcF9zX3RiLT5sa2V5W25faF0gPSBuX3Bvc2l0aW9uIC0gMTsKKwl9IGVsc2UgeworCQkvKiBDYWxjdWxhdGUgY3VycmVudCBwYXJlbnQgb2YgTFtuX3BhdGhfb2Zmc2V0XSwgd2hpY2ggaXMgdGhlIGxlZnQgbmVpZ2hib3Igb2YgdGhlIGN1cnJlbnQgbm9kZS4KKwkJICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBMW25fcGF0aF9vZmZzZXRdIGFuZCB0aGUgY3VycmVudCBub2RlLiBOb3RlIHRoYXQKKwkJICAgQ0ZMW25fcGF0aF9vZmZzZXRdIG5vdCBlcXVhbCBGTFtuX3BhdGhfb2Zmc2V0XSBhbmQgQ0ZMW25fcGF0aF9vZmZzZXRdIG5vdCBlcXVhbCBGW25fcGF0aF9vZmZzZXRdLgorCQkgICBDYWxjdWxhdGUgbGtleVtuX3BhdGhfb2Zmc2V0XS4gKi8KKwkJaWYgKChuX3JldF92YWx1ZSA9IGdldF9mYXJfcGFyZW50KHBfc190Yiwgbl9oICsgMSwgJnBfc19jdXJmLAorCQkJCQkJICAmcF9zX2N1cmNmLAorCQkJCQkJICBMRUZUX1BBUkVOVFMpKSAhPSBDQVJSWV9PTikKKwkJCXJldHVybiBuX3JldF92YWx1ZTsKKwl9CisKIAlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9oXSk7CisJcF9zX3RiLT5GTFtuX2hdID0gcF9zX2N1cmY7CS8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGTFtuX2hdLiAqLwogCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9oXSk7Ci0JZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkZSW25faF0pOwotCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7Ci0JcF9zX3RiLT5GTFtuX2hdID0gcF9zX3RiLT5DRkxbbl9oXSA9IHBfc190Yi0+RlJbbl9oXSA9IHBfc190Yi0+Q0ZSW25faF0gPSBOVUxMOwotCXJldHVybiBDQVJSWV9PTjsKLSAgICB9Ci0gIAotICAgIC8qIEdldCBwYXJlbnQgRkxbbl9wYXRoX29mZnNldF0gb2YgTFtuX3BhdGhfb2Zmc2V0XS4gKi8KLSAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkgKSAgewotCS8qIEN1cnJlbnQgbm9kZSBpcyBub3QgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQuICovCi0JLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7Ki8KLQlwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlwX3NfdGItPmxrZXlbbl9oXSA9IG5fcG9zaXRpb24gLSAxOwotICAgIH0KLSAgICBlbHNlICB7Ci0JLyogQ2FsY3VsYXRlIGN1cnJlbnQgcGFyZW50IG9mIExbbl9wYXRoX29mZnNldF0sIHdoaWNoIGlzIHRoZSBsZWZ0IG5laWdoYm9yIG9mIHRoZSBjdXJyZW50IG5vZGUuCi0JICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBMW25fcGF0aF9vZmZzZXRdIGFuZCB0aGUgY3VycmVudCBub2RlLiBOb3RlIHRoYXQKLQkgICBDRkxbbl9wYXRoX29mZnNldF0gbm90IGVxdWFsIEZMW25fcGF0aF9vZmZzZXRdIGFuZCBDRkxbbl9wYXRoX29mZnNldF0gbm90IGVxdWFsIEZbbl9wYXRoX29mZnNldF0uCi0JICAgQ2FsY3VsYXRlIGxrZXlbbl9wYXRoX29mZnNldF0uICovCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwKLQkJCQkJICAgJnBfc19jdXJjZiwgTEVGVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04gKQotCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0gICAgfQorCXBfc190Yi0+Q0ZMW25faF0gPSBwX3NfY3VyY2Y7CS8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBDRkxbbl9oXS4gKi8KIAotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GTFtuX2hdKTsKLSAgICBwX3NfdGItPkZMW25faF0gPSBwX3NfY3VyZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIEZMW25faF0uICovCi0gICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGTFtuX2hdKTsKLSAgICBwX3NfdGItPkNGTFtuX2hdID0gcF9zX2N1cmNmOyAvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgQ0ZMW25faF0uICovCi0KLSAgICBSRkFMU0UoIChwX3NfY3VyZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyZikpIHx8IAotCSAgICAocF9zX2N1cmNmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJjZikpLAotCSAgICAiUEFQLTgxOTU6IEZMICglYikgb3IgQ0ZMICglYikgaXMgaW52YWxpZCIsIHBfc19jdXJmLCBwX3NfY3VyY2YpOworCVJGQUxTRSgocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyZikpIHx8CisJICAgICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyY2YpKSwKKwkgICAgICAgIlBBUC04MTk1OiBGTCAoJWIpIG9yIENGTCAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKIAogLyogR2V0IHBhcmVudCBGUltuX2hdIG9mIFJbbl9oXS4gKi8KIAogLyogQ3VycmVudCBub2RlIGlzIHRoZSBsYXN0IGNoaWxkIG9mIEZbbl9oXS4gRlJbbl9oXSAhPSBGW25faF0uICovCi0gICAgaWYgKCBuX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMgKFBBVEhfSF9QQlVGRkVSKHBfc19wYXRoLCBuX2ggKyAxKSkgKSB7CisJaWYgKG5fcG9zaXRpb24gPT0gQl9OUl9JVEVNUyhQQVRIX0hfUEJVRkZFUihwX3NfcGF0aCwgbl9oICsgMSkpKSB7CiAvKiBDYWxjdWxhdGUgY3VycmVudCBwYXJlbnQgb2YgUltuX2hdLCB3aGljaCBpcyB0aGUgcmlnaHQgbmVpZ2hib3Igb2YgRltuX2hdLgogICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBSW25faF0gYW5kIGN1cnJlbnQgbm9kZS4gTm90ZSB0aGF0IENGUltuX2hdCiAgICBub3QgZXF1YWwgRlJbbl9wYXRoX29mZnNldF0gYW5kIENGUltuX2hdIG5vdCBlcXVhbCBGW25faF0uICovCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwgICZwX3NfY3VyY2YsIFJJR0hUX1BBUkVOVFMpKSAhPSBDQVJSWV9PTiApCi0JICAgIHJldHVybiBuX3JldF92YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSB7CisJCWlmICgobl9yZXRfdmFsdWUgPQorCQkgICAgIGdldF9mYXJfcGFyZW50KHBfc190Yiwgbl9oICsgMSwgJnBfc19jdXJmLCAmcF9zX2N1cmNmLAorCQkJCSAgICBSSUdIVF9QQVJFTlRTKSkgIT0gQ0FSUllfT04pCisJCQlyZXR1cm4gbl9yZXRfdmFsdWU7CisJfSBlbHNlIHsKIC8qIEN1cnJlbnQgbm9kZSBpcyBub3QgdGhlIGxhc3QgY2hpbGQgb2YgaXRzIHBhcmVudCBGW25faF0uICovCi0JLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7Ki8KLQlwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlnZXRfYmgocF9zX2N1cmYpIDsKLQlwX3NfdGItPnJrZXlbbl9oXSA9IG5fcG9zaXRpb247Ci0gICAgfQkKKwkJLyoocF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpLT5iX2NvdW50ICs9IDI7ICovCisJCXBfc19jdXJmID0gcF9zX2N1cmNmID0KKwkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJZ2V0X2JoKHBfc19jdXJmKTsKKwkJcF9zX3RiLT5ya2V5W25faF0gPSBuX3Bvc2l0aW9uOworCX0KIAotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5GUltuX2hdKTsKLSAgICBwX3NfdGItPkZSW25faF0gPSBwX3NfY3VyZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIEZSW25fcGF0aF9vZmZzZXRdLiAqLwotICAgIAotICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9oXSk7Ci0gICAgcF9zX3RiLT5DRlJbbl9oXSA9IHBfc19jdXJjZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIENGUltuX3BhdGhfb2Zmc2V0XS4gKi8KKwlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7CisJcF9zX3RiLT5GUltuX2hdID0gcF9zX2N1cmY7CS8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGUltuX3BhdGhfb2Zmc2V0XS4gKi8KIAotICAgIFJGQUxTRSggKHBfc19jdXJmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJmKSkgfHwKLSAgICAgICAgICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRSAocF9zX2N1cmNmKSksCi0JICAgICJQQVAtODIwNTogRlIgKCViKSBvciBDRlIgKCViKSBpcyBpbnZhbGlkIiwgcF9zX2N1cmYsIHBfc19jdXJjZik7CisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2hdKTsKKwlwX3NfdGItPkNGUltuX2hdID0gcF9zX2N1cmNmOwkvKiBOZXcgaW5pdGlhbGl6YXRpb24gb2YgQ0ZSW25fcGF0aF9vZmZzZXRdLiAqLwogCi0gICAgcmV0dXJuIENBUlJZX09OOworCVJGQUxTRSgocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyZikpIHx8CisJICAgICAgIChwX3NfY3VyY2YgJiYgIUJfSVNfSU5fVFJFRShwX3NfY3VyY2YpKSwKKwkgICAgICAgIlBBUC04MjA1OiBGUiAoJWIpIG9yIENGUiAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKKworCXJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAvKiBpdCBpcyBwb3NzaWJsZSB0byByZW1vdmUgbm9kZSBhcyByZXN1bHQgb2Ygc2hpZnRpbmdzIHRvCiAgICBuZWlnaGJvcnMgZXZlbiB3aGVuIHdlIGluc2VydCBvciBwYXN0ZSBpdGVtLiAqLwotc3RhdGljIGlubGluZSBpbnQgY2FuX25vZGVfYmVfcmVtb3ZlZCAoaW50IG1vZGUsIGludCBsZnJlZSwgaW50IHNmcmVlLCBpbnQgcmZyZWUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW5saW5lIGludCBjYW5fbm9kZV9iZV9yZW1vdmVkKGludCBtb2RlLCBpbnQgbGZyZWUsIGludCBzZnJlZSwgaW50IHJmcmVlLAorCQkJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgaW50IGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogcl9rZXkgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJaW50IGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCXN0cnVjdCByZWlzZXJmc19rZXkgKnJfa2V5ID0gTlVMTDsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKFNoLCAwKTsKLSAgICBpZiAoIHRiLT5DRlJbaF0gKQotCXJfa2V5ID0gQl9OX1BERUxJTV9LRVkodGItPkNGUltoXSx0Yi0+cmtleVtoXSk7Ci0gIAotICAgIGlmICgKLQlsZnJlZSArIHJmcmVlICsgc2ZyZWUgPCBNQVhfQ0hJTERfU0laRShTaCkgKyBsZXZieXRlcwotCS8qIHNoaWZ0aW5nIG1heSBtZXJnZSBpdGVtcyB3aGljaCBtaWdodCBzYXZlIHNwYWNlICovCi0JLSAoKCAhIGggJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIFNoLT5iX3NpemUpICkgPyBJSF9TSVpFIDogMCkKLQktICgoICEgaCAmJiByX2tleSAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZSAocl9rZXksIFNoLT5iX3NpemUpICkgPyBJSF9TSVpFIDogMCkKLQkrICgoIGggKSA/IEtFWV9TSVpFIDogMCkpCi0gICAgewotCS8qIG5vZGUgY2FuIG5vdCBiZSByZW1vdmVkICovCi0JaWYgKHNmcmVlID49IGxldmJ5dGVzICkgeyAvKiBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCi0JICAgIGlmICggISBoICkKLQkJdGItPnMwbnVtID0gQl9OUl9JVEVNUyhTaCkgKyAoKG1vZGUgPT0gTV9JTlNFUlQgKSA/IDEgOiAwKTsKLQkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCSAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwlpaCA9IEJfTl9QSVRFTV9IRUFEKFNoLCAwKTsKKwlpZiAodGItPkNGUltoXSkKKwkJcl9rZXkgPSBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSk7CisKKwlpZiAobGZyZWUgKyByZnJlZSArIHNmcmVlIDwgTUFYX0NISUxEX1NJWkUoU2gpICsgbGV2Ynl0ZXMKKwkgICAgLyogc2hpZnRpbmcgbWF5IG1lcmdlIGl0ZW1zIHdoaWNoIG1pZ2h0IHNhdmUgc3BhY2UgKi8KKwkgICAgLQorCSAgICAoKCFoCisJICAgICAgJiYgb3BfaXNfbGVmdF9tZXJnZWFibGUoJihpaC0+aWhfa2V5KSwgU2gtPmJfc2l6ZSkpID8gSUhfU0laRSA6IDApCisJICAgIC0KKwkgICAgKCghaCAmJiByX2tleQorCSAgICAgICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlKHJfa2V5LCBTaC0+Yl9zaXplKSkgPyBJSF9TSVpFIDogMCkKKwkgICAgKyAoKGgpID8gS0VZX1NJWkUgOiAwKSkgeworCQkvKiBub2RlIGNhbiBub3QgYmUgcmVtb3ZlZCAqLworCQlpZiAoc2ZyZWUgPj0gbGV2Ynl0ZXMpIHsJLyogbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLworCQkJaWYgKCFoKQorCQkJCXRiLT5zMG51bSA9CisJCQkJICAgIEJfTlJfSVRFTVMoU2gpICsKKwkJCQkgICAgKChtb2RlID09IE1fSU5TRVJUKSA/IDEgOiAwKTsKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQkJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisJCX0KIAl9Ci0gICAgfQotICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBjYW5fbm9kZV9iZV9yZW1vdmVkWyBoIF0gKTsKLSAgICByZXR1cm4gIU5PX0JBTEFOQ0lOR19ORUVERUQ7CisJUFJPQ19JTkZPX0lOQyh0Yi0+dGJfc2IsIGNhbl9ub2RlX2JlX3JlbW92ZWRbaF0pOworCXJldHVybiAhTk9fQkFMQU5DSU5HX05FRURFRDsKIH0KIAotCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBpbmNyZWFzaW5nIGl0cyBzaXplIGJ5CiAgKiBJbnNlcnRpbmcgb3IgUGFzdGluZy4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTExODIsMTU0ICsxMjEwLDE1NyBAQAogICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KICAqLwogLyogaXAgbWVhbnMgSW5zZXJ0aW5nIG9yIFBhc3RpbmcgKi8KLXN0YXRpYyBpbnQgaXBfY2hlY2tfYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyBpbnQgaXBfY2hlY2tfYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOwotICAgIGludCBsZXZieXRlcywgIC8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgaW50byAodmFsdWUKLQkJICAgICAgaXMgbmVnYXRpdmUgaWYgYnl0ZXMgYXJlIGRlbGV0ZWQpIGJ1ZmZlciB3aGljaAotCQkgICAgICBjb250YWlucyBub2RlIGJlaW5nIGJhbGFuY2VkLiAgVGhlIG1uZW1vbmljIGlzCi0JCSAgICAgIHRoYXQgdGhlIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsCi0JCSAgICAgIGlzIGxldmJ5dGVzIGJ5dGVzLiAqLwotCW5fcmV0X3ZhbHVlOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOworCWludCBsZXZieXRlcywJCS8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgaW50byAodmFsdWUKKwkJCQkgICBpcyBuZWdhdGl2ZSBpZiBieXRlcyBhcmUgZGVsZXRlZCkgYnVmZmVyIHdoaWNoCisJCQkJICAgY29udGFpbnMgbm9kZSBiZWluZyBiYWxhbmNlZC4gIFRoZSBtbmVtb25pYyBpcworCQkJCSAgIHRoYXQgdGhlIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsCisJCQkJICAgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCisJIG5fcmV0X3ZhbHVlOwogCi0gICAgaW50IGxmcmVlLCBzZnJlZSwgcmZyZWUgLyogZnJlZSBzcGFjZSBpbiBMLCBTIGFuZCBSICovOworCWludCBsZnJlZSwgc2ZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCwgUyBhbmQgUiAqLyA7CiAKLSAgICAvKiBudmVyIGlzIHNob3J0IGZvciBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBsbnZlciBpcyB0aGUgbnVtYmVyIGlmCi0gICAgICAgd2Ugc2hpZnQgdG8gdGhlIGxlZnQsIHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgdG8gdGhlCi0gICAgICAgcmlnaHQsIGFuZCBscm52ZXIgaXMgdGhlIG51bWJlciBpZiB3ZSBzaGlmdCBpbiBib3RoIGRpcmVjdGlvbnMuCi0gICAgICAgVGhlIGdvYWwgaXMgdG8gbWluaW1pemUgZmlyc3QgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcywgYW5kIHNlY29uZCwKLSAgICAgICB0aGUgbnVtYmVyIG9mIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZSBjaGFuZ2VkIGJ5IHNoaWZ0aW5nLAotICAgICAgIGFuZCB0aGlyZCB0aGUgbnVtYmVyIG9mIHVuY2FjaGVkIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZQotICAgICAgIGNoYW5nZWQgYnkgc2hpZnRpbmcgYW5kIG11c3QgYmUgcmVhZCBmcm9tIGRpc2suICAqLwotICAgIGludCBudmVyLCBsbnZlciwgcm52ZXIsIGxybnZlcjsKKwkvKiBudmVyIGlzIHNob3J0IGZvciBudW1iZXIgb2YgdmVydGl4ZXMsIGFuZCBsbnZlciBpcyB0aGUgbnVtYmVyIGlmCisJICAgd2Ugc2hpZnQgdG8gdGhlIGxlZnQsIHJudmVyIGlzIHRoZSBudW1iZXIgaWYgd2Ugc2hpZnQgdG8gdGhlCisJICAgcmlnaHQsIGFuZCBscm52ZXIgaXMgdGhlIG51bWJlciBpZiB3ZSBzaGlmdCBpbiBib3RoIGRpcmVjdGlvbnMuCisJICAgVGhlIGdvYWwgaXMgdG8gbWluaW1pemUgZmlyc3QgdGhlIG51bWJlciBvZiB2ZXJ0aXhlcywgYW5kIHNlY29uZCwKKwkgICB0aGUgbnVtYmVyIG9mIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZSBjaGFuZ2VkIGJ5IHNoaWZ0aW5nLAorCSAgIGFuZCB0aGlyZCB0aGUgbnVtYmVyIG9mIHVuY2FjaGVkIHZlcnRpeGVzIHdob3NlIGNvbnRlbnRzIGFyZQorCSAgIGNoYW5nZWQgYnkgc2hpZnRpbmcgYW5kIG11c3QgYmUgcmVhZCBmcm9tIGRpc2suICAqLworCWludCBudmVyLCBsbnZlciwgcm52ZXIsIGxybnZlcjsKIAotICAgIC8qIHVzZWQgYXQgbGVhZiBsZXZlbCBvbmx5LCBTMCA9IFNbMF0gaXMgdGhlIG5vZGUgYmVpbmcgYmFsYW5jZWQsCi0gICAgICAgc0ludW0gWyBJID0gMCwxLDIgXSBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbAotICAgICAgIHJlbWFpbiBpbiBub2RlIFNJIGFmdGVyIGJhbGFuY2luZy4gIFMxIGFuZCBTMiBhcmUgbmV3Ci0gICAgICAgbm9kZXMgdGhhdCBtaWdodCBiZSBjcmVhdGVkLiAqLwotICAKLSAgICAvKiB3ZSBwZXJmb3JtIDggY2FsbHMgdG8gZ2V0X251bV92ZXIoKS4gIEZvciBlYWNoIGNhbGwgd2UgY2FsY3VsYXRlIGZpdmUgcGFyYW1ldGVycy4KLSAgICAgICB3aGVyZSA0dGggcGFyYW1ldGVyIGlzIHMxYnl0ZXMgYW5kIDV0aCAtIHMyYnl0ZXMKLSAgICAqLwotICAgIHNob3J0IHNudW0wMTJbNDBdID0gezAsfTsJLyogczBudW0sIHMxbnVtLCBzMm51bSBmb3IgOCBjYXNlcyAKLQkJCQkgICAwLDEgLSBkbyBub3Qgc2hpZnQgYW5kIGRvIG5vdCBzaGlmdCBidXQgYm90dGxlCi0JCQkJICAgMiAtIHNoaWZ0IG9ubHkgd2hvbGUgaXRlbSB0byBsZWZ0Ci0JCQkJICAgMyAtIHNoaWZ0IHRvIGxlZnQgYW5kIGJvdHRsZSBhcyBtdWNoIGFzIHBvc3NpYmxlCi0JCQkJICAgNCw1IC0gc2hpZnQgdG8gcmlnaHQJKHdob2xlIGl0ZW1zIGFuZCBhcyBtdWNoIGFzIHBvc3NpYmxlCi0JCQkJICAgNiw3IC0gc2hpZnQgdG8gYm90aCBkaXJlY3Rpb25zICh3aG9sZSBpdGVtcyBhbmQgYXMgbXVjaCBhcyBwb3NzaWJsZSkKLQkJCQkqLworCS8qIHVzZWQgYXQgbGVhZiBsZXZlbCBvbmx5LCBTMCA9IFNbMF0gaXMgdGhlIG5vZGUgYmVpbmcgYmFsYW5jZWQsCisJICAgc0ludW0gWyBJID0gMCwxLDIgXSBpcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgd2lsbAorCSAgIHJlbWFpbiBpbiBub2RlIFNJIGFmdGVyIGJhbGFuY2luZy4gIFMxIGFuZCBTMiBhcmUgbmV3CisJICAgbm9kZXMgdGhhdCBtaWdodCBiZSBjcmVhdGVkLiAqLwogCi0gICAgLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCAqLwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNoOwotICAKLSAgICBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgbGV2Ynl0ZXMgPSB0Yi0+aW5zZXJ0X3NpemVbaF07Ci0gIAotICAgIC8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIG5ldyByb290LiAqLwotICAgIGlmICggISBTaCApICB7Ci0JaWYgKCAhIGggKQotCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODIxMDogaXBfY2hlY2tfYmFsYW5jZTogU1swXSBjYW4gbm90IGJlIDAiKTsKLQlzd2l0Y2ggKCBuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2RlcyAodGIsIGgpICkgIHsKLQljYXNlIENBUlJZX09OOgotCSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0JICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOyAvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCi0KLQljYXNlIE5PX0RJU0tfU1BBQ0U6Ci0JY2FzZSBSRVBFQVRfU0VBUkNIOgotCSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0JZGVmYXVsdDogICAKLQkgICAgcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLCAidnMtODIxNTogaXBfY2hlY2tfYmFsYW5jZTogaW5jb3JyZWN0IHJldHVybiB2YWx1ZSBvZiBnZXRfZW1wdHlfbm9kZXMiKTsKLQl9Ci0gICAgfQotICAKLSAgICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzICh0YiwgaCkpICE9IENBUlJZX09OICkgLyogZ2V0IHBhcmVudHMgb2YgU1toXSBuZWlnaGJvcnMuICovCi0JcmV0dXJuIG5fcmV0X3ZhbHVlOwotICAKLSAgICBzZnJlZSA9IEJfRlJFRV9TUEFDRSAoU2gpOwotCi0gICAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCi0gICAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKLSAgICBsZnJlZSA9IGdldF9sZnJlZSAodGIsIGgpOwotCi0gICAgaWYgKGNhbl9ub2RlX2JlX3JlbW92ZWQgKHZuLT52bl9tb2RlLCBsZnJlZSwgc2ZyZWUsIHJmcmVlLCB0YiwgaCkgPT0gTk9fQkFMQU5DSU5HX05FRURFRCkKLQkvKiBhbmQgbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLwotCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwotICAgICAKLSAgICBjcmVhdGVfdmlydHVhbF9ub2RlICh0YiwgaCk7Ci0KLSAgICAvKgkKLQlkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSBsZWZ0IG5laWdoYm9yIChpbiB0YiBzdHJ1Y3R1cmUpCi0JYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yCi0JZnJvbSB0aGUgbGVmdCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5IChyZXR1cm5lZCB2YWx1ZSkKLSAgICAqLwotICAgIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7Ci0KLSAgICAvKgotICAgICAgZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgcmlnaHQgbmVpZ2hib3IgKGluIHRiIHN0cnVjdHVyZSkKLSAgICAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IKLSAgICAgIGZyb20gdGhlIHJpZ2h0IG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgKHJldHVybmVkIHZhbHVlKQotICAgICovCi0gICAgY2hlY2tfcmlnaHQgKHRiLCBoLCByZnJlZSk7Ci0KLQotICAgIC8qIGFsbCBjb250ZW50cyBvZiBpbnRlcm5hbCBub2RlIFNbaF0gY2FuIGJlIG1vdmVkIGludG8gaXRzCi0gICAgICAgbmVpZ2hib3JzLCBTW2hdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcgKi8KLSAgICBpZiAoaCAmJiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpKSB7Ci0JaW50IHRvX3I7IAotICAgICAgIAotCS8qIFNpbmNlIHdlIGFyZSB3b3JraW5nIG9uIGludGVybmFsIG5vZGVzLCBhbmQgb3VyIGludGVybmFsCi0JICAgbm9kZXMgaGF2ZSBmaXhlZCBzaXplIGVudHJpZXMsIHRoZW4gd2UgY2FuIGJhbGFuY2UgYnkgdGhlCi0JICAgbnVtYmVyIG9mIGl0ZW1zIHJhdGhlciB0aGFuIHRoZSBzcGFjZSB0aGV5IGNvbnN1bWUuICBJbiB0aGlzCi0JICAgcm91dGluZSB3ZSBzZXQgdGhlIGxlZnQgbm9kZSBlcXVhbCB0byB0aGUgcmlnaHQgbm9kZSwKLQkgICBhbGxvd2luZyBhIGRpZmZlcmVuY2Ugb2YgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEgY2hpbGQKLQkgICBwb2ludGVyLiAqLwotCXRvX3IgPSAoKE1BWF9OUl9LRVkoU2gpPDwxKSsyLXRiLT5sbnVtW2hdLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzIgLSAKLQkgICAgKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKLQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsIC0xLCAtMSk7Ci0JcmV0dXJuIENBUlJZX09OOwotICAgIH0KLQotICAgIC8qIHRoaXMgY2hlY2tzIGJhbGFuY2UgY29uZGl0aW9uLCB0aGF0IGFueSB0d28gbmVpZ2hib3Jpbmcgbm9kZXMgY2FuIG5vdCBmaXQgaW4gb25lIG5vZGUgKi8KLSAgICBSRkFMU0UoIGggJiYgCi0JICAgICggdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxIHx8IAotCSAgICAgIHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSksCi0JICAgICJ2cy04MjIwOiB0cmVlIGlzIG5vdCBiYWxhbmNlZCBvbiBpbnRlcm5hbCBsZXZlbCIpOwotICAgIFJGQUxTRSggISBoICYmICgodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgKHRiLT5sYnl0ZXMgPT0gLTEpKSB8fAotCQkgICAgKHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICYmICh0Yi0+cmJ5dGVzID09IC0xKSkgKSwKLQkgICAgInZzLTgyMjU6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGxlYWYgbGV2ZWwiKTsKLQotICAgIC8qIGFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCBpbnRvIGl0cyBuZWlnaGJvcnMKLSAgICAgICBTWzBdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcuICovCi0gICAgaWYgKCFoICYmIGlzX2xlYWZfcmVtb3ZhYmxlICh0YikpCi0JcmV0dXJuIENBUlJZX09OOwotCi0KLSAgICAvKiB3aHkgZG8gd2UgcGVyZm9ybSB0aGlzIGNoZWNrIGhlcmUgcmF0aGVyIHRoYW4gZWFybGllcj8/Ci0gICAgICAgQW5zd2VyOiB3ZSBjYW4gd2luIDEgbm9kZSBpbiBzb21lIGNhc2VzIGFib3ZlLiBNb3Jlb3ZlciB3ZQotICAgICAgIGNoZWNrZWQgaXQgYWJvdmUsIHdoZW4gd2UgY2hlY2tlZCwgdGhhdCBTWzBdIGlzIG5vdCByZW1vdmFibGUKLSAgICAgICBpbiBwcmluY2lwbGUgKi8KLSAgICBpZiAoc2ZyZWUgPj0gbGV2Ynl0ZXMpIHsgLyogbmV3IGl0ZW0gZml0cyBpbnRvIG5vZGUgU1toXSB3aXRob3V0IGFueSBzaGlmdGluZyAqLwotCWlmICggISBoICkKLQkgICAgdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07Ci0Jc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwotICAgIH0KLQotCi0gICAgewotCWludCBscGFyLCBycGFyLCBuc2V0LCBsc2V0LCByc2V0LCBscnNldDsKLQkvKiAKLQkgKiByZWd1bGFyIG92ZXJmbG93aW5nIG9mIHRoZSBub2RlCisJLyogd2UgcGVyZm9ybSA4IGNhbGxzIHRvIGdldF9udW1fdmVyKCkuICBGb3IgZWFjaCBjYWxsIHdlIGNhbGN1bGF0ZSBmaXZlIHBhcmFtZXRlcnMuCisJICAgd2hlcmUgNHRoIHBhcmFtZXRlciBpcyBzMWJ5dGVzIGFuZCA1dGggLSBzMmJ5dGVzCiAJICovCisJc2hvcnQgc251bTAxMls0MF0gPSB7IDAsIH07CS8qIHMwbnVtLCBzMW51bSwgczJudW0gZm9yIDggY2FzZXMgCisJCQkJCSAgIDAsMSAtIGRvIG5vdCBzaGlmdCBhbmQgZG8gbm90IHNoaWZ0IGJ1dCBib3R0bGUKKwkJCQkJICAgMiAtIHNoaWZ0IG9ubHkgd2hvbGUgaXRlbSB0byBsZWZ0CisJCQkJCSAgIDMgLSBzaGlmdCB0byBsZWZ0IGFuZCBib3R0bGUgYXMgbXVjaCBhcyBwb3NzaWJsZQorCQkJCQkgICA0LDUgLSBzaGlmdCB0byByaWdodCAod2hvbGUgaXRlbXMgYW5kIGFzIG11Y2ggYXMgcG9zc2libGUKKwkJCQkJICAgNiw3IC0gc2hpZnQgdG8gYm90aCBkaXJlY3Rpb25zICh3aG9sZSBpdGVtcyBhbmQgYXMgbXVjaCBhcyBwb3NzaWJsZSkKKwkJCQkJICovCiAKLQkvKiBnZXRfbnVtX3ZlciB3b3JrcyBpbiAyIG1vZGVzIChGTE9XICYgTk9fRkxPVykgCi0JICAgbHBhciwgcnBhciAtIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gbGVmdC9yaWdodCBuZWlnaGJvciAoaW5jbHVkaW5nIHNwbGl0dGluZyBpdGVtKQotCSAgIG5zZXQsIGxzZXQsIHJzZXQsIGxyc2V0IC0gc2hvd3MsIHdoZXRoZXIgZmxvd2luZyBpdGVtcyBnaXZlIGJldHRlciBwYWNraW5nIAotCSovCisJLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqU2g7CisKKwlTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwlsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKworCS8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIG5ldyByb290LiAqLworCWlmICghU2gpIHsKKwkJaWYgKCFoKQorCQkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJCSAgICAgICAidnMtODIxMDogaXBfY2hlY2tfYmFsYW5jZTogU1swXSBjYW4gbm90IGJlIDAiKTsKKwkJc3dpdGNoIChuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2Rlcyh0YiwgaCkpIHsKKwkJY2FzZSBDQVJSWV9PTjoKKwkJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQkJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CS8qIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQgKi8KKworCQljYXNlIE5PX0RJU0tfU1BBQ0U6CisJCWNhc2UgUkVQRUFUX1NFQVJDSDoKKwkJCXJldHVybiBuX3JldF92YWx1ZTsKKwkJZGVmYXVsdDoKKwkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkgICAgICAgInZzLTgyMTU6IGlwX2NoZWNrX2JhbGFuY2U6IGluY29ycmVjdCByZXR1cm4gdmFsdWUgb2YgZ2V0X2VtcHR5X25vZGVzIik7CisJCX0KKwl9CisKKwlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHModGIsIGgpKSAhPSBDQVJSWV9PTikJLyogZ2V0IHBhcmVudHMgb2YgU1toXSBuZWlnaGJvcnMuICovCisJCXJldHVybiBuX3JldF92YWx1ZTsKKworCXNmcmVlID0gQl9GUkVFX1NQQUNFKFNoKTsKKworCS8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLworCXJmcmVlID0gZ2V0X3JmcmVlKHRiLCBoKTsKKwlsZnJlZSA9IGdldF9sZnJlZSh0YiwgaCk7CisKKwlpZiAoY2FuX25vZGVfYmVfcmVtb3ZlZCh2bi0+dm5fbW9kZSwgbGZyZWUsIHNmcmVlLCByZnJlZSwgdGIsIGgpID09CisJICAgIE5PX0JBTEFOQ0lOR19ORUVERUQpCisJCS8qIGFuZCBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCisJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworCisJY3JlYXRlX3ZpcnR1YWxfbm9kZSh0YiwgaCk7CisKKwkvKiAgCisJICAgZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgbGVmdCBuZWlnaGJvciAoaW4gdGIgc3RydWN0dXJlKQorCSAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgbGVmdCBuZWlnaGJvcgorCSAgIGZyb20gdGhlIGxlZnQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAocmV0dXJuZWQgdmFsdWUpCisJICovCisJY2hlY2tfbGVmdCh0YiwgaCwgbGZyZWUpOworCisJLyoKKwkgICBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSByaWdodCBuZWlnaGJvciAoaW4gdGIgc3RydWN0dXJlKQorCSAgIGFuZCB0aGUgbWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IKKwkgICBmcm9tIHRoZSByaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5IChyZXR1cm5lZCB2YWx1ZSkKKwkgKi8KKwljaGVja19yaWdodCh0YiwgaCwgcmZyZWUpOworCisJLyogYWxsIGNvbnRlbnRzIG9mIGludGVybmFsIG5vZGUgU1toXSBjYW4gYmUgbW92ZWQgaW50byBpdHMKKwkgICBuZWlnaGJvcnMsIFNbaF0gd2lsbCBiZSByZW1vdmVkIGFmdGVyIGJhbGFuY2luZyAqLworCWlmIChoICYmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkpIHsKKwkJaW50IHRvX3I7CisKKwkJLyogU2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gaW50ZXJuYWwgbm9kZXMsIGFuZCBvdXIgaW50ZXJuYWwKKwkJICAgbm9kZXMgaGF2ZSBmaXhlZCBzaXplIGVudHJpZXMsIHRoZW4gd2UgY2FuIGJhbGFuY2UgYnkgdGhlCisJCSAgIG51bWJlciBvZiBpdGVtcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGhleSBjb25zdW1lLiAgSW4gdGhpcworCQkgICByb3V0aW5lIHdlIHNldCB0aGUgbGVmdCBub2RlIGVxdWFsIHRvIHRoZSByaWdodCBub2RlLAorCQkgICBhbGxvd2luZyBhIGRpZmZlcmVuY2Ugb2YgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEgY2hpbGQKKwkJICAgcG9pbnRlci4gKi8KKwkJdG9fciA9CisJCSAgICAoKE1BWF9OUl9LRVkoU2gpIDw8IDEpICsgMiAtIHRiLT5sbnVtW2hdIC0gdGItPnJudW1baF0gKworCQkgICAgIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0gKE1BWF9OUl9LRVkoU2gpICsgMSAtCisJCQkJCQl0Yi0+cm51bVtoXSk7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLAorCQkJICAgICAgIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiB0aGlzIGNoZWNrcyBiYWxhbmNlIGNvbmRpdGlvbiwgdGhhdCBhbnkgdHdvIG5laWdoYm9yaW5nIG5vZGVzIGNhbiBub3QgZml0IGluIG9uZSBub2RlICovCisJUkZBTFNFKGggJiYKKwkgICAgICAgKHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSB8fAorCQl0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpLAorCSAgICAgICAidnMtODIyMDogdHJlZSBpcyBub3QgYmFsYW5jZWQgb24gaW50ZXJuYWwgbGV2ZWwiKTsKKwlSRkFMU0UoIWggJiYgKCh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiAodGItPmxieXRlcyA9PSAtMSkpIHx8CisJCSAgICAgICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiAodGItPnJieXRlcyA9PSAtMSkpKSwKKwkgICAgICAgInZzLTgyMjU6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGxlYWYgbGV2ZWwiKTsKKworCS8qIGFsbCBjb250ZW50cyBvZiBTWzBdIGNhbiBiZSBtb3ZlZCBpbnRvIGl0cyBuZWlnaGJvcnMKKwkgICBTWzBdIHdpbGwgYmUgcmVtb3ZlZCBhZnRlciBiYWxhbmNpbmcuICovCisJaWYgKCFoICYmIGlzX2xlYWZfcmVtb3ZhYmxlKHRiKSkKKwkJcmV0dXJuIENBUlJZX09OOworCisJLyogd2h5IGRvIHdlIHBlcmZvcm0gdGhpcyBjaGVjayBoZXJlIHJhdGhlciB0aGFuIGVhcmxpZXI/PworCSAgIEFuc3dlcjogd2UgY2FuIHdpbiAxIG5vZGUgaW4gc29tZSBjYXNlcyBhYm92ZS4gTW9yZW92ZXIgd2UKKwkgICBjaGVja2VkIGl0IGFib3ZlLCB3aGVuIHdlIGNoZWNrZWQsIHRoYXQgU1swXSBpcyBub3QgcmVtb3ZhYmxlCisJICAgaW4gcHJpbmNpcGxlICovCisJaWYgKHNmcmVlID49IGxldmJ5dGVzKSB7CS8qIG5ldyBpdGVtIGZpdHMgaW50byBub2RlIFNbaF0gd2l0aG91dCBhbnkgc2hpZnRpbmcgKi8KKwkJaWYgKCFoKQorCQkJdGItPnMwbnVtID0gdm4tPnZuX25yX2l0ZW07CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCQlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwl9CisKKwl7CisJCWludCBscGFyLCBycGFyLCBuc2V0LCBsc2V0LCByc2V0LCBscnNldDsKKwkJLyogCisJCSAqIHJlZ3VsYXIgb3ZlcmZsb3dpbmcgb2YgdGhlIG5vZGUKKwkJICovCisKKwkJLyogZ2V0X251bV92ZXIgd29ya3MgaW4gMiBtb2RlcyAoRkxPVyAmIE5PX0ZMT1cpIAorCQkgICBscGFyLCBycGFyIC0gbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byBsZWZ0L3JpZ2h0IG5laWdoYm9yIChpbmNsdWRpbmcgc3BsaXR0aW5nIGl0ZW0pCisJCSAgIG5zZXQsIGxzZXQsIHJzZXQsIGxyc2V0IC0gc2hvd3MsIHdoZXRoZXIgZmxvd2luZyBpdGVtcyBnaXZlIGJldHRlciBwYWNraW5nIAorCQkgKi8KICNkZWZpbmUgRkxPVyAxCi0jZGVmaW5lIE5PX0ZMT1cgMAkvKiBkbyBub3QgYW55IHNwbGl0dGluZyAqLworI2RlZmluZSBOT19GTE9XIDAJCS8qIGRvIG5vdCBhbnkgc3BsaXR0aW5nICovCiAKLQkvKiB3ZSBjaG9vc2Ugb25lIHRoZSBmb2xsb3dpbmcgKi8KKwkJLyogd2UgY2hvb3NlIG9uZSB0aGUgZm9sbG93aW5nICovCiAjZGVmaW5lIE5PVEhJTkdfU0hJRlRfTk9fRkxPVwkwCiAjZGVmaW5lIE5PVEhJTkdfU0hJRlRfRkxPVwk1CiAjZGVmaW5lIExFRlRfU0hJRlRfTk9fRkxPVwkxMApAQCAtMTMzOSwxNjQgKzEzNzAsMTczIEBACiAjZGVmaW5lIExSX1NISUZUX05PX0ZMT1cJMzAKICNkZWZpbmUgTFJfU0hJRlRfRkxPVwkJMzUKIAorCQlscGFyID0gdGItPmxudW1baF07CisJCXJwYXIgPSB0Yi0+cm51bVtoXTsKIAotCWxwYXIgPSB0Yi0+bG51bVtoXTsKLQlycGFyID0gdGItPnJudW1baF07CisJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkJICAgbm90aGluZyBpcyBzaGlmdGVkIHRvIHRoZSBuZWlnaGJvcnMsCisJCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55ICovCisJCW5zZXQgPSBOT1RISU5HX1NISUZUX05PX0ZMT1c7CisJCW52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgMCwgLTEsIGggPyB2bi0+dm5fbnJfaXRlbSA6IDAsIC0xLAorCQkJCSAgIHNudW0wMTIsIE5PX0ZMT1cpOwogCisJCWlmICghaCkgeworCQkJaW50IG52ZXIxOwogCi0JLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgotCSAgIG5vdGhpbmcgaXMgc2hpZnRlZCB0byB0aGUgbmVpZ2hib3JzLAotCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXQgbm9kZSAoczAxMiBudW1iZXJzKSwKLQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkgKi8KLQluc2V0ID0gTk9USElOR19TSElGVF9OT19GTE9XOwotCW52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLAotCQkJICAgIDAsIC0xLCBoP3ZuLT52bl9ucl9pdGVtOjAsIC0xLCAKLQkJCSAgICBzbnVtMDEyLCBOT19GTE9XKTsKKwkJCS8qIG5vdGUsIHRoYXQgaW4gdGhpcyBjYXNlIHdlIHRyeSB0byBib3R0bGUgYmV0d2VlbiBTWzBdIGFuZCBTMSAoUzEgLSB0aGUgZmlyc3QgbmV3IG5vZGUpICovCisJCQludmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgIDAsIC0xLCAwLCAtMSwKKwkJCQkJICAgIHNudW0wMTIgKyBOT1RISU5HX1NISUZUX0ZMT1csIEZMT1cpOworCQkJaWYgKG52ZXIgPiBudmVyMSkKKwkJCQluc2V0ID0gTk9USElOR19TSElGVF9GTE9XLCBudmVyID0gbnZlcjE7CisJCX0KIAotCWlmICghaCkKLQl7Ci0JICAgIGludCBudmVyMTsKKwkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCQkgICBsX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgbF9zaGlmdF9ieXRlcyBvZiB0aGUgcmlnaHQgbW9zdAorCQkgICBsaXF1aWQgaXRlbSB0byBiZSBzaGlmdGVkIGFyZSBzaGlmdGVkIHRvIHRoZSBsZWZ0IG5laWdoYm9yLAorCQkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCisJCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCQkgKi8KKwkJbHNldCA9IExFRlRfU0hJRlRfTk9fRkxPVzsKKwkJbG52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksCisJCQkJICAgIC0xLCBoID8gdm4tPnZuX25yX2l0ZW0gOiAwLCAtMSwKKwkJCQkgICAgc251bTAxMiArIExFRlRfU0hJRlRfTk9fRkxPVywgTk9fRkxPVyk7CisJCWlmICghaCkgeworCQkJaW50IGxudmVyMTsKIAotCSAgICAvKiBub3RlLCB0aGF0IGluIHRoaXMgY2FzZSB3ZSB0cnkgdG8gYm90dGxlIGJldHdlZW4gU1swXSBhbmQgUzEgKFMxIC0gdGhlIGZpcnN0IG5ldyBub2RlKSAqLwotCSAgICBudmVyMSA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAotCQkJCSAwLCAtMSwgMCwgLTEsIAotCQkJCSBzbnVtMDEyICsgTk9USElOR19TSElGVF9GTE9XLCBGTE9XKTsKLQkgICAgaWYgKG52ZXIgPiBudmVyMSkKLQkJbnNldCA9IE5PVEhJTkdfU0hJRlRfRkxPVywgbnZlciA9IG52ZXIxOworCQkJbG52ZXIxID0gZ2V0X251bV92ZXIodm4tPnZuX21vZGUsIHRiLCBoLAorCQkJCQkgICAgIGxwYXIgLQorCQkJCQkgICAgICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCksCisJCQkJCSAgICAgdGItPmxieXRlcywgMCwgLTEsCisJCQkJCSAgICAgc251bTAxMiArIExFRlRfU0hJRlRfRkxPVywgRkxPVyk7CisJCQlpZiAobG52ZXIgPiBsbnZlcjEpCisJCQkJbHNldCA9IExFRlRfU0hJRlRfRkxPVywgbG52ZXIgPSBsbnZlcjE7CisJCX0KKworCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCisJCSAgIHJfc2hpZnRfbnVtIGZpcnN0IGl0ZW1zIGFuZCByX3NoaWZ0X2J5dGVzIG9mIHRoZSBsZWZ0IG1vc3QKKwkJICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgcmlnaHQgbmVpZ2hib3IsCisJCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55CisJCSAqLworCQlyc2V0ID0gUklHSFRfU0hJRlRfTk9fRkxPVzsKKwkJcm52ZXIgPSBnZXRfbnVtX3Zlcih2bi0+dm5fbW9kZSwgdGIsIGgsCisJCQkJICAgIDAsIC0xLAorCQkJCSAgICBoID8gKHZuLT52bl9ucl9pdGVtIC0gcnBhcikgOiAocnBhciAtCisJCQkJCQkJCSAgICgodGItPgorCQkJCQkJCQkgICAgIHJieXRlcyAhPQorCQkJCQkJCQkgICAgIC0xKSA/IDEgOgorCQkJCQkJCQkgICAgMCkpLCAtMSwKKwkJCQkgICAgc251bTAxMiArIFJJR0hUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOworCQlpZiAoIWgpIHsKKwkJCWludCBybnZlcjE7CisKKwkJCXJudmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgICAwLCAtMSwKKwkJCQkJICAgICAocnBhciAtCisJCQkJCSAgICAgICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLAorCQkJCQkgICAgIHRiLT5yYnl0ZXMsCisJCQkJCSAgICAgc251bTAxMiArIFJJR0hUX1NISUZUX0ZMT1csIEZMT1cpOworCisJCQlpZiAocm52ZXIgPiBybnZlcjEpCisJCQkJcnNldCA9IFJJR0hUX1NISUZUX0ZMT1csIHJudmVyID0gcm52ZXIxOworCQl9CisKKwkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCQkgICBpdGVtcyBhcmUgc2hpZnRlZCBpbiBib3RoIGRpcmVjdGlvbnMsCisJCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKKwkJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55CisJCSAqLworCQlscnNldCA9IExSX1NISUZUX05PX0ZMT1c7CisJCWxybnZlciA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkgICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksCisJCQkJICAgICAtMSwKKwkJCQkgICAgIGggPyAodm4tPnZuX25yX2l0ZW0gLSBycGFyKSA6IChycGFyIC0KKwkJCQkJCQkJICAgICgodGItPgorCQkJCQkJCQkgICAgICByYnl0ZXMgIT0KKwkJCQkJCQkJICAgICAgLTEpID8gMSA6CisJCQkJCQkJCSAgICAgMCkpLCAtMSwKKwkJCQkgICAgIHNudW0wMTIgKyBMUl9TSElGVF9OT19GTE9XLCBOT19GTE9XKTsKKwkJaWYgKCFoKSB7CisJCQlpbnQgbHJudmVyMTsKKworCQkJbHJudmVyMSA9IGdldF9udW1fdmVyKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCQkJICAgICAgbHBhciAtCisJCQkJCSAgICAgICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCksCisJCQkJCSAgICAgIHRiLT5sYnl0ZXMsCisJCQkJCSAgICAgIChycGFyIC0KKwkJCQkJICAgICAgICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLAorCQkJCQkgICAgICB0Yi0+cmJ5dGVzLAorCQkJCQkgICAgICBzbnVtMDEyICsgTFJfU0hJRlRfRkxPVywgRkxPVyk7CisJCQlpZiAobHJudmVyID4gbHJudmVyMSkKKwkJCQlscnNldCA9IExSX1NISUZUX0ZMT1csIGxybnZlciA9IGxybnZlcjE7CisJCX0KKworCQkvKiBPdXIgZ2VuZXJhbCBzaGlmdGluZyBzdHJhdGVneSBpczoKKwkJICAgMSkgdG8gbWluaW1pemVkIG51bWJlciBvZiBuZXcgbm9kZXM7CisJCSAgIDIpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmVpZ2hib3JzIGludm9sdmVkIGluIHNoaWZ0aW5nOworCQkgICAzKSB0byBtaW5pbWl6ZWQgbnVtYmVyIG9mIGRpc2sgcmVhZHM7ICovCisKKwkJLyogd2UgY2FuIHdpbiBUV08gb3IgT05FIG5vZGVzIGJ5IHNoaWZ0aW5nIGluIGJvdGggZGlyZWN0aW9ucyAqLworCQlpZiAobHJudmVyIDwgbG52ZXIgJiYgbHJudmVyIDwgcm52ZXIpIHsKKwkJCVJGQUxTRShoICYmCisJCQkgICAgICAgKHRiLT5sbnVtW2hdICE9IDEgfHwKKwkJCQl0Yi0+cm51bVtoXSAhPSAxIHx8CisJCQkJbHJudmVyICE9IDEgfHwgcm52ZXIgIT0gMiB8fCBsbnZlciAhPSAyCisJCQkJfHwgaCAhPSAxKSwgInZzLTgyMzA6IGJhZCBoIik7CisJCQlpZiAobHJzZXQgPT0gTFJfU0hJRlRfRkxPVykKKwkJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLAorCQkJCQkgICAgICAgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsCisJCQkJCSAgICAgICB0Yi0+bGJ5dGVzLCB0Yi0+cmJ5dGVzKTsKKwkJCWVsc2UKKwkJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwKKwkJCQkJICAgICAgIHRiLT5sbnVtW2hdIC0KKwkJCQkJICAgICAgICgodGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksCisJCQkJCSAgICAgICB0Yi0+cm51bVtoXSAtCisJCQkJCSAgICAgICAoKHRiLT5yYnl0ZXMgPT0gLTEpID8gMCA6IDEpLAorCQkJCQkgICAgICAgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsIC0xLCAtMSk7CisKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJCS8qIGlmIHNoaWZ0aW5nIGRvZXNuJ3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZyB0aGVuIGRvbid0IHNoaWZ0ICovCisJCWlmIChudmVyID09IGxybnZlcikgeworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIG52ZXIsIHNudW0wMTIgKyBuc2V0LCAtMSwKKwkJCQkgICAgICAgLTEpOworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CisKKwkJLyogbm93IHdlIGtub3cgdGhhdCBmb3IgYmV0dGVyIHBhY2tpbmcgc2hpZnRpbmcgaW4gb25seSBvbmUKKwkJICAgZGlyZWN0aW9uIGVpdGhlciB0byB0aGUgbGVmdCBvciB0byB0aGUgcmlnaHQgaXMgcmVxdWlyZWQgKi8KKworCQkvKiAgaWYgc2hpZnRpbmcgdG8gdGhlIGxlZnQgaXMgYmV0dGVyIHRoYW4gc2hpZnRpbmcgdG8gdGhlIHJpZ2h0ICovCisJCWlmIChsbnZlciA8IHJudmVyKSB7CisJCQlTRVRfUEFSX1NISUZUX0xFRlQ7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBpZiBzaGlmdGluZyB0byB0aGUgcmlnaHQgaXMgYmV0dGVyIHRoYW4gc2hpZnRpbmcgdG8gdGhlIGxlZnQgKi8KKwkJaWYgKGxudmVyID4gcm52ZXIpIHsKKwkJCVNFVF9QQVJfU0hJRlRfUklHSFQ7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBub3cgc2hpZnRpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbiBnaXZlcyB0aGUgc2FtZSBudW1iZXIKKwkJICAgb2Ygbm9kZXMgYW5kIHdlIGNhbiBtYWtlIHVzZSBvZiB0aGUgY2FjaGVkIG5laWdoYm9ycyAqLworCQlpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSh0YiwgaCkpIHsKKwkJCVNFVF9QQVJfU0hJRlRfTEVGVDsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJCS8qIHNoaWZ0IHRvIHRoZSByaWdodCBpbmRlcGVuZGVudGx5IG9uIHdoZXRoZXIgdGhlIHJpZ2h0IG5laWdoYm9yIGluIGNhY2hlIG9yIG5vdCAqLworCQlTRVRfUEFSX1NISUZUX1JJR0hUOworCQlyZXR1cm4gQ0FSUllfT047CiAJfQotICAgICAgIAotIAotCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KLQkgICBsX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgbF9zaGlmdF9ieXRlcyBvZiB0aGUgcmlnaHQgbW9zdAotCSAgIGxpcXVpZCBpdGVtIHRvIGJlIHNoaWZ0ZWQgYXJlIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgbmVpZ2hib3IsCi0JICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAotCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQotCSovCi0JbHNldCA9IExFRlRfU0hJRlRfTk9fRkxPVzsKLQlsbnZlciA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAotCQkJICAgICBscGFyIC0gKCggaCB8fCB0Yi0+bGJ5dGVzID09IC0xICkgPyAwIDogMSksIC0xLCBoID8gdm4tPnZuX25yX2l0ZW06MCwgLTEsCi0JCQkgICAgIHNudW0wMTIgKyBMRUZUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOwotCWlmICghaCkKLQl7Ci0JICAgIGludCBsbnZlcjE7Ci0KLQkgICAgbG52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkJICBscGFyIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSwgdGItPmxieXRlcywgMCwgLTEsCi0JCQkJICBzbnVtMDEyICsgTEVGVF9TSElGVF9GTE9XLCBGTE9XKTsKLQkgICAgaWYgKGxudmVyID4gbG52ZXIxKQotCQlsc2V0ID0gTEVGVF9TSElGVF9GTE9XLCBsbnZlciA9IGxudmVyMTsKLQl9Ci0KLQotCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KLQkgICByX3NoaWZ0X251bSBmaXJzdCBpdGVtcyBhbmQgcl9zaGlmdF9ieXRlcyBvZiB0aGUgbGVmdCBtb3N0Ci0JICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgcmlnaHQgbmVpZ2hib3IsCi0JICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAotCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQotCSovCi0JcnNldCA9IFJJR0hUX1NISUZUX05PX0ZMT1c7Ci0Jcm52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCSAgICAgMCwgLTEsIGggPyAodm4tPnZuX25yX2l0ZW0tcnBhcikgOiAocnBhciAtICgoIHRiLT5yYnl0ZXMgIT0gLTEgKSA/IDEgOiAwKSksIC0xLCAKLQkJCSAgICAgc251bTAxMiArIFJJR0hUX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOwotCWlmICghaCkKLQl7Ci0JICAgIGludCBybnZlcjE7Ci0KLQkgICAgcm52ZXIxID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCi0JCQkJICAwLCAtMSwgKHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgdGItPnJieXRlcywgCi0JCQkJICBzbnVtMDEyICsgUklHSFRfU0hJRlRfRkxPVywgRkxPVyk7Ci0KLQkgICAgaWYgKHJudmVyID4gcm52ZXIxKQotCQlyc2V0ID0gUklHSFRfU0hJRlRfRkxPVywgcm52ZXIgPSBybnZlcjE7Ci0JfQotCi0KLQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJsb2NrcyBTW2hdIG11c3QgYmUgc3BsaXQgaW50byB3aGVuCi0JICAgaXRlbXMgYXJlIHNoaWZ0ZWQgaW4gYm90aCBkaXJlY3Rpb25zLAotCSAgIGFzIHdlbGwgYXMgbnVtYmVyIG9mIGl0ZW1zIGluIGVhY2ggcGFydCBvZiB0aGUgc3BsaXR0ZWQgbm9kZSAoczAxMiBudW1iZXJzKSwKLQkgICBhbmQgbnVtYmVyIG9mIGJ5dGVzIChzMWJ5dGVzKSBvZiB0aGUgc2hhcmVkIGRyb3Agd2hpY2ggZmxvdyB0byBTMSBpZiBhbnkKLQkqLwotCWxyc2V0ID0gTFJfU0hJRlRfTk9fRkxPVzsKLQlscm52ZXIgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCSAgICAgIGxwYXIgLSAoKGggfHwgdGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksIC0xLCBoID8gKHZuLT52bl9ucl9pdGVtLXJwYXIpOihycGFyIC0gKCh0Yi0+cmJ5dGVzICE9IC0xKSA/IDEgOiAwKSksIC0xLAotCQkJICAgICAgc251bTAxMiArIExSX1NISUZUX05PX0ZMT1csIE5PX0ZMT1cpOwotCWlmICghaCkKLQl7Ci0JICAgIGludCBscm52ZXIxOwotCi0JICAgIGxybnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKLQkJCQkgICBscGFyIC0gKCh0Yi0+bGJ5dGVzICE9IC0xKSA/IDEgOiAwKSwgdGItPmxieXRlcywgKHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgdGItPnJieXRlcywKLQkJCQkgICBzbnVtMDEyICsgTFJfU0hJRlRfRkxPVywgRkxPVyk7Ci0JICAgIGlmIChscm52ZXIgPiBscm52ZXIxKQotCQlscnNldCA9IExSX1NISUZUX0ZMT1csIGxybnZlciA9IGxybnZlcjE7Ci0JfQotCi0KLQotCS8qIE91ciBnZW5lcmFsIHNoaWZ0aW5nIHN0cmF0ZWd5IGlzOgotCSAgIDEpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmV3IG5vZGVzOwotCSAgIDIpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgbmVpZ2hib3JzIGludm9sdmVkIGluIHNoaWZ0aW5nOwotCSAgIDMpIHRvIG1pbmltaXplZCBudW1iZXIgb2YgZGlzayByZWFkczsgKi8KLQotCS8qIHdlIGNhbiB3aW4gVFdPIG9yIE9ORSBub2RlcyBieSBzaGlmdGluZyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KLQlpZiAobHJudmVyIDwgbG52ZXIgJiYgbHJudmVyIDwgcm52ZXIpCi0JewotCSAgICBSRkFMU0UoIGggJiYgCi0JCSAgICAodGItPmxudW1baF0gIT0gMSB8fCAKLQkJICAgICB0Yi0+cm51bVtoXSAhPSAxIHx8IAotCQkgICAgIGxybnZlciAhPSAxIHx8IHJudmVyICE9IDIgfHwgbG52ZXIgIT0gMiB8fCBoICE9IDEpLAotCQkgICAgInZzLTgyMzA6IGJhZCBoIik7Ci0JICAgIGlmIChscnNldCA9PSBMUl9TSElGVF9GTE9XKQotCQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHRiLT5sbnVtW2hdLCB0Yi0+cm51bVtoXSwgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsCi0JCQkJdGItPmxieXRlcywgdGItPnJieXRlcyk7Ci0JICAgIGVsc2UKLQkJc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB0Yi0+bG51bVtoXSAtICgodGItPmxieXRlcyA9PSAtMSkgPyAwIDogMSksIAotCQkJCXRiLT5ybnVtW2hdIC0gKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSwgbHJudmVyLCBzbnVtMDEyICsgbHJzZXQsIC0xLCAtMSk7Ci0KLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCS8qIGlmIHNoaWZ0aW5nIGRvZXNuJ3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZyB0aGVuIGRvbid0IHNoaWZ0ICovCi0JaWYgKG52ZXIgPT0gbHJudmVyKQotCXsKLQkgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCBudmVyLCBzbnVtMDEyICsgbnNldCwgLTEsIC0xKTsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLQotCi0JLyogbm93IHdlIGtub3cgdGhhdCBmb3IgYmV0dGVyIHBhY2tpbmcgc2hpZnRpbmcgaW4gb25seSBvbmUKLQkgICBkaXJlY3Rpb24gZWl0aGVyIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSByaWdodCBpcyByZXF1aXJlZCAqLwotCi0JLyogIGlmIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSByaWdodCAqLwotCWlmIChsbnZlciA8IHJudmVyKQotCXsKLQkgICAgU0VUX1BBUl9TSElGVF9MRUZUOwotCSAgICByZXR1cm4gQ0FSUllfT047Ci0JfQotCi0JLyogaWYgc2hpZnRpbmcgdG8gdGhlIHJpZ2h0IGlzIGJldHRlciB0aGFuIHNoaWZ0aW5nIHRvIHRoZSBsZWZ0ICovCi0JaWYgKGxudmVyID4gcm52ZXIpCi0JewotCSAgICBTRVRfUEFSX1NISUZUX1JJR0hUOwotCSAgICByZXR1cm4gQ0FSUllfT047Ci0JfQotCi0KLQkvKiBub3cgc2hpZnRpbmcgaW4gZWl0aGVyIGRpcmVjdGlvbiBnaXZlcyB0aGUgc2FtZSBudW1iZXIKLQkgICBvZiBub2RlcyBhbmQgd2UgY2FuIG1ha2UgdXNlIG9mIHRoZSBjYWNoZWQgbmVpZ2hib3JzICovCi0JaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUgKHRiLGgpKQotCXsKLQkgICAgU0VUX1BBUl9TSElGVF9MRUZUOwotCSAgICByZXR1cm4gQ0FSUllfT047Ci0JfQotCi0JLyogc2hpZnQgdG8gdGhlIHJpZ2h0IGluZGVwZW5kZW50bHkgb24gd2hldGhlciB0aGUgcmlnaHQgbmVpZ2hib3IgaW4gY2FjaGUgb3Igbm90ICovCi0JU0VUX1BBUl9TSElGVF9SSUdIVDsKLQlyZXR1cm4gQ0FSUllfT047Ci0gICAgfQogfQogCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CiAgKiBEZWxldGluZyBvciBDdXR0aW5nIGZvciBJTlRFUk5BTCBub2RlIG9mIFMrdHJlZS4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTE1MTMsMTU3ICsxNTUzLDE3MyBAQAogICogTm90ZTogSXRlbXMgb2YgaW50ZXJuYWwgbm9kZXMgaGF2ZSBmaXhlZCBzaXplLCBzbyB0aGUgYmFsYW5jZSBjb25kaXRpb24gZm9yCiAgKiB0aGUgaW50ZXJuYWwgcGFydCBvZiBTK3RyZWUgaXMgYXMgZm9yIHRoZSBCLXRyZWVzLgogICovCi1zdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCitzdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm4gPSB0Yi0+dGJfdm47CiAKLSAgLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKLSAgICAgYW5kIEZoIGlzIGl0cyBmYXRoZXIuICAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaCwgKiBGaDsKLSAgaW50IG1heHNpemUsCi0gICAgICBuX3JldF92YWx1ZTsKLSAgaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi87CisJLyogU2ggaXMgdGhlIG5vZGUgd2hvc2UgYmFsYW5jZSBpcyBjdXJyZW50bHkgYmVpbmcgY2hlY2tlZCwKKwkgICBhbmQgRmggaXMgaXRzIGZhdGhlci4gICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpTaCwgKkZoOworCWludCBtYXhzaXplLCBuX3JldF92YWx1ZTsKKwlpbnQgbGZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCBhbmQgUiAqLyA7CiAKLSAgU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOyAKLSAgRmggPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOyAKKwlTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwlGaCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKIAotICBtYXhzaXplID0gTUFYX0NISUxEX1NJWkUoU2gpOyAKKwltYXhzaXplID0gTUFYX0NISUxEX1NJWkUoU2gpOwogCiAvKiAgIHVzaW5nIHRiLT5pbnNlcnRfc2l6ZVtoXSwgd2hpY2ggaXMgbmVnYXRpdmUgaW4gdGhpcyBjYXNlLCBjcmVhdGVfdmlydHVhbF9ub2RlIGNhbGN1bGF0ZXM6ICovCiAvKiAgIG5ld19ucl9pdGVtID0gbnVtYmVyIG9mIGl0ZW1zIG5vZGUgd291bGQgaGF2ZSBpZiBvcGVyYXRpb24gaXMgKi8KIC8qIAlwZXJmb3JtZWQgd2l0aG91dCBiYWxhbmNpbmcgKG5ld19ucl9pdGVtKTsgKi8KLSAgY3JlYXRlX3ZpcnR1YWxfbm9kZSAodGIsIGgpOworCWNyZWF0ZV92aXJ0dWFsX25vZGUodGIsIGgpOwogCi0gIGlmICggISBGaCApCi0gICAgeyAgIC8qIFNbaF0gaXMgdGhlIHJvb3QuICovCi0gICAgICBpZiAoIHZuLT52bl9ucl9pdGVtID4gMCApCi0JewotCSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotCSAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7IC8qIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQgKi8KLQl9Ci0gICAgICAvKiBuZXdfbnJfaXRlbSA9PSAwLgotICAgICAgICogQ3VycmVudCByb290IHdpbGwgYmUgZGVsZXRlZCByZXN1bHRpbmcgaW4KLSAgICAgICAqIGRlY3JlbWVudGluZyB0aGUgdHJlZSBoZWlnaHQuICovCi0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQotCi0gIGlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHModGIsaCkpICE9IENBUlJZX09OICkKLSAgICByZXR1cm4gbl9yZXRfdmFsdWU7Ci0KLQotICAvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KLSAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKLSAgbGZyZWUgPSBnZXRfbGZyZWUgKHRiLCBoKTsKLQkJCi0gIC8qIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gZml0IGludG8gbmVpZ2hib3JzICovCi0gIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7Ci0gIGNoZWNrX3JpZ2h0ICh0YiwgaCwgcmZyZWUpOwotCi0KLSAgaWYgKCB2bi0+dm5fbnJfaXRlbSA+PSBNSU5fTlJfS0VZKFNoKSApCi0gICAgeyAvKiBCYWxhbmNlIGNvbmRpdGlvbiBmb3IgdGhlIGludGVybmFsIG5vZGUgaXMgdmFsaWQuCi0gICAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgYmFsYW5jZSBvbmx5IGlmIGl0IGxlYWRzIHRvIGJldHRlciBwYWNraW5nLiAqLyAKLSAgICAgIGlmICggdm4tPnZuX25yX2l0ZW0gPT0gTUlOX05SX0tFWShTaCkgKQotCXsgLyogSGVyZSB3ZSBqb2luIFNbaF0gd2l0aCBvbmUgb2YgaXRzIG5laWdoYm9ycywKLQkgICAqIHdoaWNoIGlzIGltcG9zc2libGUgd2l0aCBncmVhdGVyIHZhbHVlcyBvZiBuZXdfbnJfaXRlbS4gKi8KLQkgIGlmICggdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxICkKLQkgICAgewotCSAgICAgIC8qIEFsbCBjb250ZW50cyBvZiBTW2hdIGNhbiBiZSBtb3ZlZCB0byBMW2hdLiAqLwotCSAgICAgIGludCBuOwotCSAgICAgIGludCBvcmRlcl9MOwotCSAgICAgIAotCSAgICAgIG9yZGVyX0wgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT0wKSA/IEJfTlJfSVRFTVModGItPkZMW2hdKSA6IG4gLSAxOwotCSAgICAgIG4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sb3JkZXJfTCkpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0JICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAtbi0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOwotCSAgICAgIHJldHVybiBDQVJSWV9PTjsKLQkgICAgfQotCi0JICBpZiAoIHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSApCi0JICAgIHsKLQkgICAgICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gUltoXS4gKi8KLQkgICAgICBpbnQgbjsKLQkgICAgICBpbnQgb3JkZXJfUjsKLQkgICAgCi0JICAgICAgb3JkZXJfUiA9ICgobj1QQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSk9PUJfTlJfSVRFTVMoRmgpKSA/IDAgOiBuICsgMTsKLQkgICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZSW2hdLG9yZGVyX1IpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgLW4tMSwgMCwgTlVMTCwgLTEsIC0xKTsKLQkgICAgICByZXR1cm4gQ0FSUllfT047ICAgCi0JICAgIH0KKwlpZiAoIUZoKSB7CQkvKiBTW2hdIGlzIHRoZSByb290LiAqLworCQlpZiAodm4tPnZuX25yX2l0ZW0gPiAwKSB7CisJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwkvKiBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkICovCisJCX0KKwkJLyogbmV3X25yX2l0ZW0gPT0gMC4KKwkJICogQ3VycmVudCByb290IHdpbGwgYmUgZGVsZXRlZCByZXN1bHRpbmcgaW4KKwkJICogZGVjcmVtZW50aW5nIHRoZSB0cmVlIGhlaWdodC4gKi8KKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKIAl9CiAKLSAgICAgIGlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLQl7Ci0JICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLwotCSAgaW50IHRvX3I7CisJaWYgKChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLCBoKSkgIT0gQ0FSUllfT04pCisJCXJldHVybiBuX3JldF92YWx1ZTsKIAotCSAgdG9fciA9ICgoTUFYX05SX0tFWShTaCk8PDEpKzItdGItPmxudW1baF0tdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMiAtIAotCSAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPnJudW1baF0pOwotCSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCB2bi0+dm5fbnJfaXRlbSArIDEgLSB0b19yLCB0b19yLCAwLCBOVUxMLCAtMSwgLTEpOwotCSAgcmV0dXJuIENBUlJZX09OOworCS8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLworCXJmcmVlID0gZ2V0X3JmcmVlKHRiLCBoKTsKKwlsZnJlZSA9IGdldF9sZnJlZSh0YiwgaCk7CisKKwkvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIGZpdCBpbnRvIG5laWdoYm9ycyAqLworCWNoZWNrX2xlZnQodGIsIGgsIGxmcmVlKTsKKwljaGVja19yaWdodCh0YiwgaCwgcmZyZWUpOworCisJaWYgKHZuLT52bl9ucl9pdGVtID49IE1JTl9OUl9LRVkoU2gpKSB7CS8qIEJhbGFuY2UgY29uZGl0aW9uIGZvciB0aGUgaW50ZXJuYWwgbm9kZSBpcyB2YWxpZC4KKwkJCQkJCSAqIEluIHRoaXMgY2FzZSB3ZSBiYWxhbmNlIG9ubHkgaWYgaXQgbGVhZHMgdG8gYmV0dGVyIHBhY2tpbmcuICovCisJCWlmICh2bi0+dm5fbnJfaXRlbSA9PSBNSU5fTlJfS0VZKFNoKSkgewkvKiBIZXJlIHdlIGpvaW4gU1toXSB3aXRoIG9uZSBvZiBpdHMgbmVpZ2hib3JzLAorCQkJCQkJCSAqIHdoaWNoIGlzIGltcG9zc2libGUgd2l0aCBncmVhdGVyIHZhbHVlcyBvZiBuZXdfbnJfaXRlbS4gKi8KKwkJCWlmICh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpIHsKKwkJCQkvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gTFtoXS4gKi8KKwkJCQlpbnQgbjsKKwkJCQlpbnQgb3JkZXJfTDsKKworCQkJCW9yZGVyX0wgPQorCQkJCSAgICAoKG4gPQorCQkJCSAgICAgIFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsCisJCQkJCQkJICBoKSkgPT0KKwkJCQkgICAgIDApID8gQl9OUl9JVEVNUyh0Yi0+RkxbaF0pIDogbiAtIDE7CisJCQkJbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GTFtoXSwgb3JkZXJfTCkpIC8KKwkJCQkgICAgKERDX1NJWkUgKyBLRVlfU0laRSk7CisJCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC1uIC0gMSwgMCwgMCwgTlVMTCwgLTEsCisJCQkJCSAgICAgICAtMSk7CisJCQkJcmV0dXJuIENBUlJZX09OOworCQkJfQorCisJCQlpZiAodGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSB7CisJCQkJLyogQWxsIGNvbnRlbnRzIG9mIFNbaF0gY2FuIGJlIG1vdmVkIHRvIFJbaF0uICovCisJCQkJaW50IG47CisJCQkJaW50IG9yZGVyX1I7CisKKwkJCQlvcmRlcl9SID0KKwkJCQkgICAgKChuID0KKwkJCQkgICAgICBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLAorCQkJCQkJCSAgaCkpID09CisJCQkJICAgICBCX05SX0lURU1TKEZoKSkgPyAwIDogbiArIDE7CisJCQkJbiA9IGRjX3NpemUoQl9OX0NISUxEKHRiLT5GUltoXSwgb3JkZXJfUikpIC8KKwkJCQkgICAgKERDX1NJWkUgKyBLRVlfU0laRSk7CisJCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIC1uIC0gMSwgMCwgTlVMTCwgLTEsCisJCQkJCSAgICAgICAtMSk7CisJCQkJcmV0dXJuIENBUlJZX09OOworCQkJfQorCQl9CisKKwkJaWYgKHRiLT5ybnVtW2hdICsgdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSB7CisJCQkvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLworCQkJaW50IHRvX3I7CisKKwkJCXRvX3IgPQorCQkJICAgICgoTUFYX05SX0tFWShTaCkgPDwgMSkgKyAyIC0gdGItPmxudW1baF0gLQorCQkJICAgICB0Yi0+cm51bVtoXSArIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0KKwkJCSAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPnJudW1baF0pOworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsCisJCQkJICAgICAgIDAsIE5VTEwsIC0xLCAtMSk7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCQkvKiBCYWxhbmNpbmcgZG9lcyBub3QgbGVhZCB0byBiZXR0ZXIgcGFja2luZy4gKi8KKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwogCX0KIAotICAgICAgLyogQmFsYW5jaW5nIGRvZXMgbm90IGxlYWQgdG8gYmV0dGVyIHBhY2tpbmcuICovCi0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKLSAgICB9CisJLyogQ3VycmVudCBub2RlIGNvbnRhaW4gaW5zdWZmaWNpZW50IG51bWJlciBvZiBpdGVtcy4gQmFsYW5jaW5nIGlzIHJlcXVpcmVkLiAqLworCS8qIENoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbaF0gd2l0aCBsZWZ0IG5laWdoYm9yLiAqLworCWlmICh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCisJCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHRiLCBoKQorCQkgICAgfHwgdGItPnJudW1baF0gPCB2bi0+dm5fbnJfaXRlbSArIDEgfHwgIXRiLT5GUltoXSkgeworCQkJaW50IG47CisJCQlpbnQgb3JkZXJfTDsKIAotICAvKiBDdXJyZW50IG5vZGUgY29udGFpbiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGl0ZW1zLiBCYWxhbmNpbmcgaXMgcmVxdWlyZWQuICovCQotICAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTW2hdIHdpdGggbGVmdCBuZWlnaGJvci4gKi8KLSAgaWYgKHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLSAgICBpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkgfHwgdGItPnJudW1baF0gPCB2bi0+dm5fbnJfaXRlbSArIDEgfHwgIXRiLT5GUltoXSkKLSAgICAgIHsKLQlpbnQgbjsKLQlpbnQgb3JkZXJfTDsKLQkgICAgICAKLQlvcmRlcl9MID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09MCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKLQluID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZMW2hdLG9yZGVyX0wpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOwotCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLW4tMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKKwkJCW9yZGVyX0wgPQorCQkJICAgICgobiA9CisJCQkgICAgICBQQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLAorCQkJCQkJICBoKSkgPT0KKwkJCSAgICAgMCkgPyBCX05SX0lURU1TKHRiLT5GTFtoXSkgOiBuIC0gMTsKKwkJCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sIG9yZGVyX0wpKSAvIChEQ19TSVpFICsKKwkJCQkJCQkJICAgICAgS0VZX1NJWkUpOworCQkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC1uIC0gMSwgMCwgMCwgTlVMTCwgLTEsIC0xKTsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCisJLyogQ2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgU1toXSB3aXRoIHJpZ2h0IG5laWdoYm9yLiAqLworCWlmICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpIHsKKwkJaW50IG47CisJCWludCBvcmRlcl9SOworCisJCW9yZGVyX1IgPQorCQkgICAgKChuID0KKwkJICAgICAgUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwKKwkJCQkJICBoKSkgPT0gQl9OUl9JVEVNUyhGaCkpID8gMCA6IChuICsgMSk7CisJCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RlJbaF0sIG9yZGVyX1IpKSAvIChEQ19TSVpFICsKKwkJCQkJCQkgICAgICBLRVlfU0laRSk7CisJCXNldF9wYXJhbWV0ZXJzKHRiLCBoLCAwLCAtbiAtIDEsIDAsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLworCWlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkgeworCQlpbnQgdG9fcjsKKworCQl0b19yID0KKwkJICAgICgoTUFYX05SX0tFWShTaCkgPDwgMSkgKyAyIC0gdGItPmxudW1baF0gLSB0Yi0+cm51bVtoXSArCisJCSAgICAgdm4tPnZuX25yX2l0ZW0gKyAxKSAvIDIgLSAoTUFYX05SX0tFWShTaCkgKyAxIC0KKwkJCQkJCXRiLT5ybnVtW2hdKTsKKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsCisJCQkgICAgICAgLTEsIC0xKTsKKwkJcmV0dXJuIENBUlJZX09OOworCX0KKworCS8qIEZvciBpbnRlcm5hbCBub2RlcyB0cnkgdG8gYm9ycm93IGl0ZW0gZnJvbSBhIG5laWdoYm9yICovCisJUkZBTFNFKCF0Yi0+RkxbaF0gJiYgIXRiLT5GUltoXSwgInZzLTgyMzU6IHRyeWluZyB0byBib3Jyb3cgZm9yIHJvb3QiKTsKKworCS8qIEJvcnJvdyBvbmUgb3IgdHdvIGl0ZW1zIGZyb20gY2FjaGluZyBuZWlnaGJvciAqLworCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHRiLCBoKSB8fCAhdGItPkZSW2hdKSB7CisJCWludCBmcm9tX2w7CisKKwkJZnJvbV9sID0KKwkJICAgIChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+bG51bVtoXSArIHZuLT52bl9ucl9pdGVtICsKKwkJICAgICAxKSAvIDIgLSAodm4tPnZuX25yX2l0ZW0gKyAxKTsKKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIC1mcm9tX2wsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwKKwkJICAgICAgIC0oKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdICsgdm4tPnZuX25yX2l0ZW0gKworCQkJICAxKSAvIDIgLSAodm4tPnZuX25yX2l0ZW0gKyAxKSksIDEsIE5VTEwsIC0xLCAtMSk7CiAJcmV0dXJuIENBUlJZX09OOwotICAgICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbaF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KLSAgaWYgKHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLSAgICB7Ci0gICAgICBpbnQgbjsKLSAgICAgIGludCBvcmRlcl9SOwotCSAgICAKLSAgICAgIG9yZGVyX1IgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT1CX05SX0lURU1TKEZoKSkgPyAwIDogKG4gKyAxKTsKLSAgICAgIG4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RlJbaF0sb3JkZXJfUikpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7Ci0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC1uLTEsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047ICAgCi0gICAgfQotCi0gIC8qIEFsbCBjb250ZW50cyBvZiBTW2hdIGNhbiBiZSBtb3ZlZCB0byB0aGUgbmVpZ2hib3JzIChMW2hdICYgUltoXSkuICovCi0gIGlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKLSAgICB7Ci0gICAgICBpbnQgdG9fcjsKLQkgICAgCi0gICAgICB0b19yID0gKChNQVhfTlJfS0VZKFNoKTw8MSkrMi10Yi0+bG51bVtoXS10Yi0+cm51bVtoXSt2bi0+dm5fbnJfaXRlbSsxKS8yIC0gCi0JKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKLSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdm4tPnZuX25yX2l0ZW0gKyAxIC0gdG9fciwgdG9fciwgMCwgTlVMTCwgLTEsIC0xKTsKLSAgICAgIHJldHVybiBDQVJSWV9PTjsKLSAgICB9Ci0KLSAgLyogRm9yIGludGVybmFsIG5vZGVzIHRyeSB0byBib3Jyb3cgaXRlbSBmcm9tIGEgbmVpZ2hib3IgKi8KLSAgUkZBTFNFKCAhdGItPkZMW2hdICYmICF0Yi0+RlJbaF0sICJ2cy04MjM1OiB0cnlpbmcgdG8gYm9ycm93IGZvciByb290Iik7Ci0KLSAgLyogQm9ycm93IG9uZSBvciB0d28gaXRlbXMgZnJvbSBjYWNoaW5nIG5laWdoYm9yICovCi0gIGlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSB8fCAhdGItPkZSW2hdKQotICAgIHsKLSAgICAgIGludCBmcm9tX2w7Ci0JCQotICAgICAgZnJvbV9sID0gKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5sbnVtW2hdICsgdm4tPnZuX25yX2l0ZW0gKyAxKSAvIDIgLSAgKHZuLT52bl9ucl9pdGVtICsgMSk7Ci0gICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIC1mcm9tX2wsIDAsIDEsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQotCi0gIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgLSgoTUFYX05SX0tFWShTaCkrMS10Yi0+cm51bVtoXSt2bi0+dm5fbnJfaXRlbSsxKS8yLSh2bi0+dm5fbnJfaXRlbSsxKSksIDEsIAotCQkgIE5VTEwsIC0xLCAtMSk7Ci0gIHJldHVybiBDQVJSWV9PTjsKIH0KIAotCiAvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkIHdoZW4gRGVjcmVhc2luZyBpdHMgc2l6ZSBieQogICogRGVsZXRpbmcgb3IgVHJ1bmNhdGluZyBmb3IgTEVBRiBub2RlIG9mIFMrdHJlZS4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KQEAgLTE2NzcsOTEgKzE3MzMsODcgQEAKICAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CiAgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgogICovCi1zdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfbGVhZiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZV9sZWFmKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCkKIHsKLSAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworCXN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuID0gdGItPnRiX3ZuOwogCi0gIC8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgZGVsZXRlZCBmcm9tCi0gICAgICh2YWx1ZSBpcyBuZWdhdGl2ZSBpZiBieXRlcyBhcmUgZGVsZXRlZCkgYnVmZmVyIHdoaWNoCi0gICAgIGNvbnRhaW5zIG5vZGUgYmVpbmcgYmFsYW5jZWQuICBUaGUgbW5lbW9uaWMgaXMgdGhhdCB0aGUKLSAgICAgYXR0ZW1wdGVkIGNoYW5nZSBpbiBub2RlIHNwYWNlIHVzZWQgbGV2ZWwgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCi0gIGludCBsZXZieXRlczsKLSAgLyogdGhlIG1heGltYWwgaXRlbSBzaXplICovCi0gIGludCBtYXhzaXplLAotICAgICAgbl9yZXRfdmFsdWU7Ci0gIC8qIFMwIGlzIHRoZSBub2RlIHdob3NlIGJhbGFuY2UgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQsCi0gICAgIGFuZCBGMCBpcyBpdHMgZmF0aGVyLiAgKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAsICogRjA7Ci0gIGludCBsZnJlZSwgcmZyZWUgLyogZnJlZSBzcGFjZSBpbiBMIGFuZCBSICovOworCS8qIE51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgZGVsZXRlZCBmcm9tCisJICAgKHZhbHVlIGlzIG5lZ2F0aXZlIGlmIGJ5dGVzIGFyZSBkZWxldGVkKSBidWZmZXIgd2hpY2gKKwkgICBjb250YWlucyBub2RlIGJlaW5nIGJhbGFuY2VkLiAgVGhlIG1uZW1vbmljIGlzIHRoYXQgdGhlCisJICAgYXR0ZW1wdGVkIGNoYW5nZSBpbiBub2RlIHNwYWNlIHVzZWQgbGV2ZWwgaXMgbGV2Ynl0ZXMgYnl0ZXMuICovCisJaW50IGxldmJ5dGVzOworCS8qIHRoZSBtYXhpbWFsIGl0ZW0gc2l6ZSAqLworCWludCBtYXhzaXplLCBuX3JldF92YWx1ZTsKKwkvKiBTMCBpcyB0aGUgbm9kZSB3aG9zZSBiYWxhbmNlIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkLAorCSAgIGFuZCBGMCBpcyBpdHMgZmF0aGVyLiAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlMwLCAqRjA7CisJaW50IGxmcmVlLCByZnJlZSAvKiBmcmVlIHNwYWNlIGluIEwgYW5kIFIgKi8gOwogCi0gIFMwID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCAwKTsKLSAgRjAgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCVMwID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIDApOworCUYwID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOwogCi0gIGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOworCWxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOwogCi0gIG1heHNpemUgPSBNQVhfQ0hJTERfU0laRShTMCk7IAkvKiBtYXhpbWFsIHBvc3NpYmxlIHNpemUgb2YgYW4gaXRlbSAqLworCW1heHNpemUgPSBNQVhfQ0hJTERfU0laRShTMCk7CS8qIG1heGltYWwgcG9zc2libGUgc2l6ZSBvZiBhbiBpdGVtICovCiAKLSAgaWYgKCAhIEYwICkKLSAgICB7ICAvKiBTWzBdIGlzIHRoZSByb290IG5vdy4gKi8KKwlpZiAoIUYwKSB7CQkvKiBTWzBdIGlzIHRoZSByb290IG5vdy4gKi8KIAotICAgICAgUkZBTFNFKCAtbGV2Ynl0ZXMgPj0gbWF4c2l6ZSAtIEJfRlJFRV9TUEFDRSAoUzApLAotCSAgICAgICJ2cy04MjQwOiBhdHRlbXB0IHRvIGNyZWF0ZSBlbXB0eSBidWZmZXIgdHJlZSIpOworCQlSRkFMU0UoLWxldmJ5dGVzID49IG1heHNpemUgLSBCX0ZSRUVfU1BBQ0UoUzApLAorCQkgICAgICAgInZzLTgyNDA6IGF0dGVtcHQgdG8gY3JlYXRlIGVtcHR5IGJ1ZmZlciB0cmVlIik7CiAKLSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKLSAgICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOwotICAgIH0KKwkJc2V0X3BhcmFtZXRlcnModGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworCX0KIAotICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLGgpKSAhPSBDQVJSWV9PTiApCi0gICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworCWlmICgobl9yZXRfdmFsdWUgPSBnZXRfcGFyZW50cyh0YiwgaCkpICE9IENBUlJZX09OKQorCQlyZXR1cm4gbl9yZXRfdmFsdWU7CiAKLSAgLyogZ2V0IGZyZWUgc3BhY2Ugb2YgbmVpZ2hib3JzICovCi0gIHJmcmVlID0gZ2V0X3JmcmVlICh0YiwgaCk7Ci0gIGxmcmVlID0gZ2V0X2xmcmVlICh0YiwgaCk7CQkKKwkvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKwlyZnJlZSA9IGdldF9yZnJlZSh0YiwgaCk7CisJbGZyZWUgPSBnZXRfbGZyZWUodGIsIGgpOwogCi0gIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHRiLCBoKTsKKwljcmVhdGVfdmlydHVhbF9ub2RlKHRiLCBoKTsKIAotICAvKiBpZiAzIGxlYXZlcyBjYW4gYmUgbWVyZ2UgdG8gb25lLCBzZXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuICovCi0gIGlmIChhcmVfbGVhdmVzX3JlbW92YWJsZSAodGIsIGxmcmVlLCByZnJlZSkpCi0gICAgcmV0dXJuIENBUlJZX09OOworCS8qIGlmIDMgbGVhdmVzIGNhbiBiZSBtZXJnZSB0byBvbmUsIHNldCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gKi8KKwlpZiAoYXJlX2xlYXZlc19yZW1vdmFibGUodGIsIGxmcmVlLCByZnJlZSkpCisJCXJldHVybiBDQVJSWV9PTjsKIAotICAvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSBsZWZ0L3JpZ2h0ICBuZWlnaGJvcgotICAgICBhbmQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGZsb3cgdG8gdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3IKLSAgICAgZnJvbSB0aGUgbGVmdC9yaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5Ci0gICAgICovCi0gIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7Ci0gIGNoZWNrX3JpZ2h0ICh0YiwgaCwgcmZyZWUpOyAgIAorCS8qIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gdGhlIGxlZnQvcmlnaHQgIG5laWdoYm9yCisJICAgYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yCisJICAgZnJvbSB0aGUgbGVmdC9yaWdodCBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5CisJICovCisJY2hlY2tfbGVmdCh0YiwgaCwgbGZyZWUpOworCWNoZWNrX3JpZ2h0KHRiLCBoLCByZnJlZSk7CiAKLSAgLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgUyB3aXRoIGxlZnQgbmVpZ2hib3IuICovCi0gIGlmICh0Yi0+bG51bVswXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiB0Yi0+bGJ5dGVzID09IC0xKQotICAgIGlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSB8fAotCSgodGItPnJudW1bMF0gLSAoKHRiLT5yYnl0ZXMgPT0gLTEpID8gMCA6IDEpKSA8IHZuLT52bl9ucl9pdGVtKSB8fCAvKiBTIGNhbiBub3QgYmUgbWVyZ2VkIHdpdGggUiAqLwotCSF0Yi0+RlJbaF0pIHsKLSAgICAgIAotICAgICAgUkZBTFNFKCAhdGItPkZMW2hdLCAidnMtODI0NTogZGNfY2hlY2tfYmFsYW5jZV9sZWFmOiBGTFtoXSBtdXN0IGV4aXN0Iik7CisJLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gbWVyZ2UgUyB3aXRoIGxlZnQgbmVpZ2hib3IuICovCisJaWYgKHRiLT5sbnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5sYnl0ZXMgPT0gLTEpCisJCWlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKHRiLCBoKSB8fCAoKHRiLT5ybnVtWzBdIC0gKCh0Yi0+cmJ5dGVzID09IC0xKSA/IDAgOiAxKSkgPCB2bi0+dm5fbnJfaXRlbSkgfHwJLyogUyBjYW4gbm90IGJlIG1lcmdlZCB3aXRoIFIgKi8KKwkJICAgICF0Yi0+RlJbaF0pIHsKIAotICAgICAgLyogc2V0IHBhcmFtZXRlciB0byBtZXJnZSBTWzBdIHdpdGggaXRzIGxlZnQgbmVpZ2hib3IgKi8KLSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLTEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7Ci0gICAgICByZXR1cm4gQ0FSUllfT047Ci0gICAgfQorCQkJUkZBTFNFKCF0Yi0+RkxbaF0sCisJCQkgICAgICAgInZzLTgyNDU6IGRjX2NoZWNrX2JhbGFuY2VfbGVhZjogRkxbaF0gbXVzdCBleGlzdCIpOwogCi0gIC8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbMF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KLSAgaWYgKHRiLT5ybnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5yYnl0ZXMgPT0gLTEpIHsKLSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC0xLCAwLCBOVUxMLCAtMSwgLTEpOwotICAgIHJldHVybiBDQVJSWV9PTjsKLSAgfQotICAKLSAgLyogQWxsIGNvbnRlbnRzIG9mIFNbMF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbMF0gJiBSWzBdKS4gU2V0IHBhcmFtZXRlcnMgYW5kIHJldHVybiAqLwotICBpZiAoaXNfbGVhZl9yZW1vdmFibGUgKHRiKSkKLSAgICByZXR1cm4gQ0FSUllfT047Ci0gIAotICAvKiBCYWxhbmNpbmcgaXMgbm90IHJlcXVpcmVkLiAqLwotICB0Yi0+czBudW0gPSB2bi0+dm5fbnJfaXRlbTsKLSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOwotICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKKwkJCS8qIHNldCBwYXJhbWV0ZXIgdG8gbWVyZ2UgU1swXSB3aXRoIGl0cyBsZWZ0IG5laWdoYm9yICovCisJCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgLTEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisJCQlyZXR1cm4gQ0FSUllfT047CisJCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbMF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KKwlpZiAodGItPnJudW1bMF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgdGItPnJieXRlcyA9PSAtMSkgeworCQlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgLTEsIDAsIE5VTEwsIC0xLCAtMSk7CisJCXJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBBbGwgY29udGVudHMgb2YgU1swXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFswXSAmIFJbMF0pLiBTZXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuICovCisJaWYgKGlzX2xlYWZfcmVtb3ZhYmxlKHRiKSkKKwkJcmV0dXJuIENBUlJZX09OOworCisJLyogQmFsYW5jaW5nIGlzIG5vdCByZXF1aXJlZC4gKi8KKwl0Yi0+czBudW0gPSB2bi0+dm5fbnJfaXRlbTsKKwlzZXRfcGFyYW1ldGVycyh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwlyZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKIH0KIAotCi0KIC8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CiAgKiBEZWxldGluZyBvciBDdXR0aW5nLgogICogQ2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZyBmb3IgY3VycmVudCBsZXZlbCBoLgpAQCAtMTc3NSwxOCArMTgyNywxNyBAQAogICoJICAgICAgIC0xIC0gbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKICAqCSAgICAgICAtMiAtIG5vIGRpc2sgc3BhY2UuCiAgKi8KLXN0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3N0YXRpYyBpbnQgZGNfY2hlY2tfYmFsYW5jZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgpCiB7Ci0gUkZBTFNFKCAhIChQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKSwgInZzLTgyNTA6IFMgaXMgbm90IGluaXRpYWxpemVkIik7CisJUkZBTFNFKCEoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKSwKKwkgICAgICAgInZzLTgyNTA6IFMgaXMgbm90IGluaXRpYWxpemVkIik7CiAKLSBpZiAoIGggKQotICAgcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwgKHRiLCBoKTsKLSBlbHNlCi0gICByZXR1cm4gZGNfY2hlY2tfYmFsYW5jZV9sZWFmICh0YiwgaCk7CisJaWYgKGgpCisJCXJldHVybiBkY19jaGVja19iYWxhbmNlX2ludGVybmFsKHRiLCBoKTsKKwllbHNlCisJCXJldHVybiBkY19jaGVja19iYWxhbmNlX2xlYWYodGIsIGgpOwogfQogCi0KLQogLyogQ2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgU1toXSBpcyBiYWxhbmNlZC4KICAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KICAqIFBhcmFtZXRlcnM6CkBAIC0xODA1LDQzOSArMTg1Niw0ODEgQEAKICAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CiAgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgogICovCi1zdGF0aWMgaW50IGNoZWNrX2JhbGFuY2UgKGludCBtb2RlLCAKLQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJICBpbnQgaCwgCi0JCQkgIGludCBpbnVtLAotCQkJICBpbnQgcG9zX2luX2l0ZW0sCi0JCQkgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNfaWgsCi0JCQkgIGNvbnN0IHZvaWQgKiBkYXRhCi0JCQkgICkKK3N0YXRpYyBpbnQgY2hlY2tfYmFsYW5jZShpbnQgbW9kZSwKKwkJCSBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCSBpbnQgaCwKKwkJCSBpbnQgaW51bSwKKwkJCSBpbnQgcG9zX2luX2l0ZW0sCisJCQkgc3RydWN0IGl0ZW1faGVhZCAqaW5zX2loLCBjb25zdCB2b2lkICpkYXRhKQogewotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm47CisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdm47CiAKLSAgdm4gPSB0Yi0+dGJfdm4gPSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqKSh0Yi0+dm5fYnVmKTsKLSAgdm4tPnZuX2ZyZWVfcHRyID0gKGNoYXIgKikodGItPnRiX3ZuICsgMSk7Ci0gIHZuLT52bl9tb2RlID0gbW9kZTsKLSAgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtID0gaW51bTsKLSAgdm4tPnZuX3Bvc19pbl9pdGVtID0gcG9zX2luX2l0ZW07Ci0gIHZuLT52bl9pbnNfaWggPSBpbnNfaWg7Ci0gIHZuLT52bl9kYXRhID0gZGF0YTsKKwl2biA9IHRiLT50Yl92biA9IChzdHJ1Y3QgdmlydHVhbF9ub2RlICopKHRiLT52bl9idWYpOworCXZuLT52bl9mcmVlX3B0ciA9IChjaGFyICopKHRiLT50Yl92biArIDEpOworCXZuLT52bl9tb2RlID0gbW9kZTsKKwl2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gPSBpbnVtOworCXZuLT52bl9wb3NfaW5faXRlbSA9IHBvc19pbl9pdGVtOworCXZuLT52bl9pbnNfaWggPSBpbnNfaWg7CisJdm4tPnZuX2RhdGEgPSBkYXRhOwogCi0gIFJGQUxTRSggbW9kZSA9PSBNX0lOU0VSVCAmJiAhdm4tPnZuX2luc19paCwKLQkgICJ2cy04MjU1OiBpbnNfaWggY2FuIG5vdCBiZSAwIGluIGluc2VydCBtb2RlIik7CisJUkZBTFNFKG1vZGUgPT0gTV9JTlNFUlQgJiYgIXZuLT52bl9pbnNfaWgsCisJICAgICAgICJ2cy04MjU1OiBpbnNfaWggY2FuIG5vdCBiZSAwIGluIGluc2VydCBtb2RlIik7CiAKLSBpZiAoIHRiLT5pbnNlcnRfc2l6ZVtoXSA+IDAgKQotICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuIHNpemUgb2Ygbm9kZSBpcyBpbmNyZWFzaW5nLiAqLwotICAgcmV0dXJuIGlwX2NoZWNrX2JhbGFuY2UgKHRiLCBoKTsKKwlpZiAodGItPmluc2VydF9zaXplW2hdID4gMCkKKwkJLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuIHNpemUgb2Ygbm9kZSBpcyBpbmNyZWFzaW5nLiAqLworCQlyZXR1cm4gaXBfY2hlY2tfYmFsYW5jZSh0YiwgaCk7CiAKLSAvKiBDYWxjdWxhdGUgYmFsYW5jZSBwYXJhbWV0ZXJzIHdoZW4gIHNpemUgb2Ygbm9kZSBpcyBkZWNyZWFzaW5nLiAqLwotIHJldHVybiBkY19jaGVja19iYWxhbmNlICh0YiwgaCk7CisJLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuICBzaXplIG9mIG5vZGUgaXMgZGVjcmVhc2luZy4gKi8KKwlyZXR1cm4gZGNfY2hlY2tfYmFsYW5jZSh0YiwgaCk7CiB9CiAKLQotCiAvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCBpcyB0aGUgcmVhbGx5IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLiovCi1zdGF0aWMgaW50ICBnZXRfZGlyZWN0X3BhcmVudCgKLSAgICAgICAgICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKLSAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5faAotICAgICAgICAgICAgKSB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKLSAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGggICAgICA9IHBfc190Yi0+dGJfcGF0aDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwKLQluX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKLSAgICAKLSAgICAvKiBXZSBhcmUgaW4gdGhlIHJvb3Qgb3IgaW4gdGhlIG5ldyByb290LiAqLwotICAgIGlmICggbl9wYXRoX29mZnNldCA8PSBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgewotCQotCVJGQUxTRSggbl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxLAotCQkiUEFQLTgyNjA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CitzdGF0aWMgaW50IGdldF9kaXJlY3RfcGFyZW50KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKKwlzdHJ1Y3QgcGF0aCAqcF9zX3BhdGggPSBwX3NfdGItPnRiX3BhdGg7CisJaW50IG5fcG9zaXRpb24sCisJICAgIG5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2gpOwogCi0JaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0JICAgICBTQl9ST09UX0JMT0NLIChwX3NfdGItPnRiX3NiKSApIHsKLQkgICAgLyogUm9vdCBpcyBub3QgY2hhbmdlZC4gKi8KLQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpID0gTlVMTDsKLQkgICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IDA7Ci0JICAgIHJldHVybiBDQVJSWV9PTjsKKwkvKiBXZSBhcmUgaW4gdGhlIHJvb3Qgb3IgaW4gdGhlIG5ldyByb290LiAqLworCWlmIChuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKKworCQlSRkFMU0Uobl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgLSAxLAorCQkgICAgICAgIlBBUC04MjYwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOworCisJCWlmIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+CisJCSAgICBiX2Jsb2NrbnIgPT0gU0JfUk9PVF9CTE9DSyhwX3NfdGItPnRiX3NiKSkgeworCQkJLyogUm9vdCBpcyBub3QgY2hhbmdlZC4gKi8KKwkJCVBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IE5VTEw7CisJCQlQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpID0gMDsKKwkJCXJldHVybiBDQVJSWV9PTjsKKwkJfQorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsJLyogUm9vdCBpcyBjaGFuZ2VkIGFuZCB3ZSBtdXN0IHJlY2FsY3VsYXRlIHRoZSBwYXRoLiAqLwogCX0KLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsgLyogUm9vdCBpcyBjaGFuZ2VkIGFuZCB3ZSBtdXN0IHJlY2FsY3VsYXRlIHRoZSBwYXRoLiAqLwotICAgIH0KIAotICAgIGlmICggISBCX0lTX0lOX1RSRUUocF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKSApCi0JcmV0dXJuIFJFUEVBVF9TRUFSQ0g7IC8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUuICovCisJaWYgKCFCX0lTX0lOX1RSRUUKKwkgICAgKHBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSkpCisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwkvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlLiAqLwogCi0gICAgaWYgKCAobl9wb3NpdGlvbiA9IFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpID4gQl9OUl9JVEVNUyhwX3NfYmgpICkKLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKLSAgICAKLSAgICBpZiAoIEJfTl9DSElMRF9OVU0ocF9zX2JoLCBuX3Bvc2l0aW9uKSAhPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0KS0+Yl9ibG9ja25yICkKLQkvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgbm90IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIGluIHRoZSB0cmVlLiAqLwotCXJldHVybiBSRVBFQVRfU0VBUkNIOworCWlmICgobl9wb3NpdGlvbiA9CisJICAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwKKwkJCQkgIG5fcGF0aF9vZmZzZXQgLSAxKSkgPiBCX05SX0lURU1TKHBfc19iaCkpCisJCXJldHVybiBSRVBFQVRfU0VBUkNIOwogCi0gICAgaWYgKCBidWZmZXJfbG9ja2VkKHBfc19iaCkgKSB7Ci0JX193YWl0X29uX2J1ZmZlcihwX3NfYmgpOwotCWlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0gICAgfQorCWlmIChCX05fQ0hJTERfTlVNKHBfc19iaCwgbl9wb3NpdGlvbikgIT0KKwkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCktPmJfYmxvY2tucikKKwkJLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIG5vdCBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJlZS4gKi8KKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAKLSAgICByZXR1cm4gQ0FSUllfT047IC8qIFBhcmVudCBpbiB0aGUgcGF0aCBpcyB1bmxvY2tlZCBhbmQgcmVhbGx5IHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlLiAgKi8KKwlpZiAoYnVmZmVyX2xvY2tlZChwX3NfYmgpKSB7CisJCV9fd2FpdF9vbl9idWZmZXIocF9zX2JoKTsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKQorCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJfQorCisJcmV0dXJuIENBUlJZX09OOwkvKiBQYXJlbnQgaW4gdGhlIHBhdGggaXMgdW5sb2NrZWQgYW5kIHJlYWxseSBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS4gICovCiB9CiAKLQogLyogVXNpbmcgbG51bVtuX2hdIGFuZCBybnVtW25faF0gd2Ugc2hvdWxkIGRldGVybWluZSB3aGF0IG5laWdoYm9ycwogICogb2YgU1tuX2hdIHdlCiAgKiBuZWVkIGluIG9yZGVyIHRvIGJhbGFuY2UgU1tuX2hdLCBhbmQgZ2V0IHRoZW0gaWYgbmVjZXNzYXJ5LgogICogUmV0dXJuczoJU0NIRURVTEVfT0NDVVJSRUQgLSBzY2hlZHVsZSBvY2N1cnJlZCB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOwogICoJICAgICAgICBDQVJSWV9PTiAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOwogICovCi1zdGF0aWMgaW50ICBnZXRfbmVpZ2hib3JzKAotCSAgICAgICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCi0JICAgICAgICAgICAgaW50IAkJICBuX2gKLQkgICAgICAgICAgKSB7Ci0gICAgaW50CQkgCW5fY2hpbGRfcG9zaXRpb24sCi0Jbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOwotICAgIHVuc2lnbmVkIGxvbmcJCW5fc29uX251bWJlcjsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICoJcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoOworc3RhdGljIGludCBnZXRfbmVpZ2hib3JzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwgaW50IG5faCkKK3sKKwlpbnQgbl9jaGlsZF9wb3NpdGlvbiwKKwkgICAgbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOworCXVuc2lnbmVkIGxvbmcgbl9zb25fbnVtYmVyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX3RiLT50Yl9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKIAorCVBST0NfSU5GT19JTkMocF9zX3NiLCBnZXRfbmVpZ2hib3JzW25faF0pOwogCi0gICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzWyBuX2ggXSApOworCWlmIChwX3NfdGItPmxudW1bbl9oXSkgeworCQkvKiBXZSBuZWVkIGxlZnQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25faF0uICovCisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBuZWVkX2xfbmVpZ2hib3Jbbl9oXSk7CisJCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKIAotICAgIGlmICggcF9zX3RiLT5sbnVtW25faF0gKSB7Ci0JLyogV2UgbmVlZCBsZWZ0IG5laWdoYm9yIHRvIGJhbGFuY2UgU1tuX2hdLiAqLwotCVBST0NfSU5GT19JTkMoIHBfc19zYiwgbmVlZF9sX25laWdoYm9yWyBuX2ggXSApOwotCXBfc19iaCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KTsKLQkKLQlSRkFMU0UoIHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gJiYgCi0JCSEgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSwKLQkJIlBBUC04MjcwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQiKTsKKwkJUkZBTFNFKHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gJiYKKwkJICAgICAgICFQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpLAorCQkgICAgICAgIlBBUC04MjcwOiBpbnZhbGlkIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQiKTsKIAotCW5fY2hpbGRfcG9zaXRpb24gPSAoIHBfc19iaCA9PSBwX3NfdGItPkZMW25faF0gKSA/IHBfc190Yi0+bGtleVtuX2hdIDogQl9OUl9JVEVNUyAocF9zX3RiLT5GTFtuX2hdKTsKLQluX3Nvbl9udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbik7Ci0JcF9zX2JoID0gc2JfYnJlYWQocF9zX3NiLCBuX3Nvbl9udW1iZXIpOwotCWlmICghcF9zX2JoKQotCSAgICByZXR1cm4gSU9fRVJST1I7Ci0JaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7Ci0JICAgIGRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbIG5faCBdICk7Ci0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCQluX2NoaWxkX3Bvc2l0aW9uID0KKwkJICAgIChwX3NfYmggPT0KKwkJICAgICBwX3NfdGItPkZMW25faF0pID8gcF9zX3RiLT5sa2V5W25faF0gOiBCX05SX0lURU1TKHBfc190Yi0+CisJCQkJCQkJCSAgICAgICBGTFtuX2hdKTsKKwkJbl9zb25fbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fY2hpbGRfcG9zaXRpb24pOworCQlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7CisJCWlmICghcF9zX2JoKQorCQkJcmV0dXJuIElPX0VSUk9SOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJCWRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbbl9oXSk7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQorCisJCVJGQUxTRSghQl9JU19JTl9UUkVFKHBfc190Yi0+Rkxbbl9oXSkgfHwKKwkJICAgICAgIG5fY2hpbGRfcG9zaXRpb24gPiBCX05SX0lURU1TKHBfc190Yi0+Rkxbbl9oXSkgfHwKKwkJICAgICAgIEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKSAhPQorCQkgICAgICAgcF9zX2JoLT5iX2Jsb2NrbnIsICJQQVAtODI3NTogaW52YWxpZCBwYXJlbnQiKTsKKwkJUkZBTFNFKCFCX0lTX0lOX1RSRUUocF9zX2JoKSwgIlBBUC04MjgwOiBpbnZhbGlkIGNoaWxkIik7CisJCVJGQUxTRSghbl9oICYmCisJCSAgICAgICBCX0ZSRUVfU1BBQ0UocF9zX2JoKSAhPQorCQkgICAgICAgTUFYX0NISUxEX1NJWkUocF9zX2JoKSAtCisJCSAgICAgICBkY19zaXplKEJfTl9DSElMRChwX3NfdGItPkZMWzBdLCBuX2NoaWxkX3Bvc2l0aW9uKSksCisJCSAgICAgICAiUEFQLTgyOTA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiBsZWZ0IG5laWdoYm9yIik7CisKKwkJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9oXSk7CisJCXBfc190Yi0+TFtuX2hdID0gcF9zX2JoOwogCX0KLQkKLQlSRkFMU0UoICEgQl9JU19JTl9UUkVFKHBfc190Yi0+Rkxbbl9oXSkgfHwKLSAgICAgICAgICAgICAgICBuX2NoaWxkX3Bvc2l0aW9uID4gQl9OUl9JVEVNUyhwX3NfdGItPkZMW25faF0pIHx8Ci0JICAgICAgICBCX05fQ0hJTERfTlVNKHBfc190Yi0+Rkxbbl9oXSwgbl9jaGlsZF9wb3NpdGlvbikgIT0KLSAgICAgICAgICAgICAgICBwX3NfYmgtPmJfYmxvY2tuciwgIlBBUC04Mjc1OiBpbnZhbGlkIHBhcmVudCIpOwotCVJGQUxTRSggISBCX0lTX0lOX1RSRUUocF9zX2JoKSwgIlBBUC04MjgwOiBpbnZhbGlkIGNoaWxkIik7Ci0JUkZBTFNFKCAhIG5faCAmJgotICAgICAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAocF9zX2JoKSAhPSBNQVhfQ0hJTERfU0laRSAocF9zX2JoKSAtIGRjX3NpemUoQl9OX0NISUxEIChwX3NfdGItPkZMWzBdLG5fY2hpbGRfcG9zaXRpb24pKSwKLSAgICAgICAgICAgICAgICAiUEFQLTgyOTA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiBsZWZ0IG5laWdoYm9yIik7CiAKLQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+TFtuX2hdKTsKLQlwX3NfdGItPkxbbl9oXSA9IHBfc19iaDsKLSAgICB9CisJaWYgKHBfc190Yi0+cm51bVtuX2hdKSB7CS8qIFdlIG5lZWQgcmlnaHQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25fcGF0aF9vZmZzZXRdLiAqLworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgbmVlZF9yX25laWdoYm9yW25faF0pOworCQlwX3NfYmggPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9wYXRoX29mZnNldCk7CiAKKwkJUkZBTFNFKHBfc19iaCA9PSBwX3NfdGItPkZSW25faF0gJiYKKwkJICAgICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc190Yi0+dGJfcGF0aCwKKwkJCQkJICAgIG5fcGF0aF9vZmZzZXQpID49CisJCSAgICAgICBCX05SX0lURU1TKHBfc19iaCksCisJCSAgICAgICAiUEFQLTgyOTU6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHBhcmVudCIpOwogCi0gICAgaWYgKCBwX3NfdGItPnJudW1bbl9oXSApIHsgLyogV2UgbmVlZCByaWdodCBuZWlnaGJvciB0byBiYWxhbmNlIFNbbl9wYXRoX29mZnNldF0uICovCi0JUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBuZWVkX3JfbmVpZ2hib3JbIG5faCBdICk7Ci0JcF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpOwotCQotCVJGQUxTRSggcF9zX2JoID09IHBfc190Yi0+RlJbbl9oXSAmJiAKLQkJUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSA+PSBCX05SX0lURU1TKHBfc19iaCksCi0JCSJQQVAtODI5NTogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgcGFyZW50Iik7CisJCW5fY2hpbGRfcG9zaXRpb24gPQorCQkgICAgKHBfc19iaCA9PSBwX3NfdGItPkZSW25faF0pID8gcF9zX3RiLT5ya2V5W25faF0gKyAxIDogMDsKKwkJbl9zb25fbnVtYmVyID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZSW25faF0sIG5fY2hpbGRfcG9zaXRpb24pOworCQlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7CisJCWlmICghcF9zX2JoKQorCQkJcmV0dXJuIElPX0VSUk9SOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpIHsKKwkJCWRlY3JlbWVudF9iY291bnQocF9zX2JoKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnRbbl9oXSk7CisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkJfQorCQlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+UltuX2hdKTsKKwkJcF9zX3RiLT5SW25faF0gPSBwX3NfYmg7CiAKLQluX2NoaWxkX3Bvc2l0aW9uID0gKCBwX3NfYmggPT0gcF9zX3RiLT5GUltuX2hdICkgPyBwX3NfdGItPnJrZXlbbl9oXSArIDEgOiAwOwotCW5fc29uX251bWJlciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GUltuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKTsKLQlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7Ci0JaWYgKCFwX3NfYmgpCi0JICAgIHJldHVybiBJT19FUlJPUjsKLQlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKLQkgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfYmgpOwotCSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGdldF9uZWlnaGJvcnNfcmVzdGFydFsgbl9oIF0gKTsKLQkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCVJGQUxTRSghbl9oCisJCSAgICAgICAmJiBCX0ZSRUVfU1BBQ0UocF9zX2JoKSAhPQorCQkgICAgICAgTUFYX0NISUxEX1NJWkUocF9zX2JoKSAtCisJCSAgICAgICBkY19zaXplKEJfTl9DSElMRChwX3NfdGItPkZSWzBdLCBuX2NoaWxkX3Bvc2l0aW9uKSksCisJCSAgICAgICAiUEFQLTgzMDA6IGludmFsaWQgY2hpbGQgc2l6ZSBvZiByaWdodCBuZWlnaGJvciAoJWQgIT0gJWQgLSAlZCkiLAorCQkgICAgICAgQl9GUkVFX1NQQUNFKHBfc19iaCksIE1BWF9DSElMRF9TSVpFKHBfc19iaCksCisJCSAgICAgICBkY19zaXplKEJfTl9DSElMRChwX3NfdGItPkZSWzBdLCBuX2NoaWxkX3Bvc2l0aW9uKSkpOworCiAJfQotCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5SW25faF0pOwotCXBfc190Yi0+UltuX2hdID0gcF9zX2JoOwotCi0JUkZBTFNFKCAhIG5faCAmJiBCX0ZSRUVfU1BBQ0UgKHBfc19iaCkgIT0gTUFYX0NISUxEX1NJWkUgKHBfc19iaCkgLSBkY19zaXplKEJfTl9DSElMRCAocF9zX3RiLT5GUlswXSxuX2NoaWxkX3Bvc2l0aW9uKSksCi0gICAgICAgICAgICAgICAgIlBBUC04MzAwOiBpbnZhbGlkIGNoaWxkIHNpemUgb2YgcmlnaHQgbmVpZ2hib3IgKCVkICE9ICVkIC0gJWQpIiwKLSAgICAgICAgICAgICAgICBCX0ZSRUVfU1BBQ0UgKHBfc19iaCksIE1BWF9DSElMRF9TSVpFIChwX3NfYmgpLAotICAgICAgICAgICAgICAgIGRjX3NpemUoQl9OX0NISUxEIChwX3NfdGItPkZSWzBdLG5fY2hpbGRfcG9zaXRpb24pKSk7Ci0JCi0gICAgfQotICAgIHJldHVybiBDQVJSWV9PTjsKKwlyZXR1cm4gQ0FSUllfT047CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLXZvaWQgKiByZWlzZXJmc19rbWFsbG9jIChzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQordm9pZCAqcmVpc2VyZnNfa21hbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgdm9pZCAqIHZwOwotICAgIHN0YXRpYyBzaXplX3QgbWFsbG9jZWQ7CisJdm9pZCAqdnA7CisJc3RhdGljIHNpemVfdCBtYWxsb2NlZDsKIAotCi0gICAgdnAgPSBrbWFsbG9jIChzaXplLCBmbGFncyk7Ci0gICAgaWYgKHZwKSB7Ci0JUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgKz0gc2l6ZTsKLQlpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgPiBtYWxsb2NlZCArIDIwMDAwMCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLAotCQkJICAgICAgInZzLTgzMDE6IHJlaXNlcmZzX2ttYWxsb2M6IGFsbG9jYXRlZCBtZW1vcnkgJWQiLAotCQkJICAgICAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOwotCSAgICBtYWxsb2NlZCA9IFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzOworCXZwID0ga21hbGxvYyhzaXplLCBmbGFncyk7CisJaWYgKHZwKSB7CisJCVJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICs9IHNpemU7CisJCWlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA+IG1hbGxvY2VkICsgMjAwMDAwKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtODMwMTogcmVpc2VyZnNfa21hbGxvYzogYWxsb2NhdGVkIG1lbW9yeSAlZCIsCisJCQkJCSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CisJCQltYWxsb2NlZCA9IFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzOworCQl9CiAJfQotICAgIH0KLSAgICByZXR1cm4gdnA7CisJcmV0dXJuIHZwOwogfQogCi12b2lkIHJlaXNlcmZzX2tmcmVlIChjb25zdCB2b2lkICogdnAsIHNpemVfdCBzaXplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQordm9pZCByZWlzZXJmc19rZnJlZShjb25zdCB2b2lkICp2cCwgc2l6ZV90IHNpemUsIHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBrZnJlZSAodnApOwotICAKLSAgICBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyAtPSBzaXplOwotICAgIGlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA8IDApCi0JcmVpc2VyZnNfd2FybmluZyAocywgInZzLTgzMDI6IHJlaXNlcmZzX2tmcmVlOiBhbGxvY2F0ZWQgbWVtb3J5ICVkIiwKLQkJCSAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOworCWtmcmVlKHZwKTsKKworCVJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzIC09IHNpemU7CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzIDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAidnMtODMwMjogcmVpc2VyZnNfa2ZyZWU6IGFsbG9jYXRlZCBtZW1vcnkgJWQiLAorCQkJCSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyk7CiAKIH0KICNlbmRpZgogCi0KLXN0YXRpYyBpbnQgZ2V0X3ZpcnR1YWxfbm9kZV9zaXplIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgaW50IGdldF92aXJ0dWFsX25vZGVfc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIGludCBtYXhfbnVtX29mX2l0ZW1zOwotICAgIGludCBtYXhfbnVtX29mX2VudHJpZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJaW50IG1heF9udW1fb2ZfaXRlbXM7CisJaW50IG1heF9udW1fb2ZfZW50cmllczsKKwl1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAogI2RlZmluZSBNSU5fTkFNRV9MRU4gMQogCi0gICAgbWF4X251bV9vZl9pdGVtcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pOwotICAgIG1heF9udW1fb2ZfZW50cmllcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFKSAvIAotICAgICAgICAgICAgICAgICAgICAgICAgIChERUhfU0laRSArIE1JTl9OQU1FX0xFTik7CisJbWF4X251bV9vZl9pdGVtcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pOworCW1heF9udW1fb2ZfZW50cmllcyA9IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFKSAvCisJICAgIChERUhfU0laRSArIE1JTl9OQU1FX0xFTik7CiAKLSAgICByZXR1cm4gc2l6ZW9mKHN0cnVjdCB2aXJ0dWFsX25vZGUpICsgCi0gICAgICAgICAgIG1heChtYXhfbnVtX29mX2l0ZW1zICogc2l6ZW9mIChzdHJ1Y3QgdmlydHVhbF9pdGVtKSwKLQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgdmlydHVhbF9pdGVtKSArIHNpemVvZihzdHJ1Y3QgZGlyZW50cnlfdWFyZWEpICsgCi0gICAgICAgICAgICAgICAobWF4X251bV9vZl9lbnRyaWVzIC0gMSkgKiBzaXplb2YgKF9fdTE2KSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9ub2RlKSArCisJICAgIG1heChtYXhfbnVtX29mX2l0ZW1zICogc2l6ZW9mKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pLAorCQlzaXplb2Yoc3RydWN0IHZpcnR1YWxfaXRlbSkgKyBzaXplb2Yoc3RydWN0IGRpcmVudHJ5X3VhcmVhKSArCisJCShtYXhfbnVtX29mX2VudHJpZXMgLSAxKSAqIHNpemVvZihfX3UxNikpOwogfQogCi0KLQogLyogbWF5YmUgd2Ugc2hvdWxkIGZhaWwgYmFsYW5jaW5nIHdlIGFyZSBnb2luZyB0byBwZXJmb3JtIHdoZW4ga21hbGxvYwogICAgZmFpbHMgc2V2ZXJhbCB0aW1lcy4gQnV0IG5vdyBpdCB3aWxsIGxvb3AgdW50aWwga21hbGxvYyBnZXRzCiAgICByZXF1aXJlZCBtZW1vcnkgKi8KLXN0YXRpYyBpbnQgZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCitzdGF0aWMgaW50IGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKIHsKLSAgICBpbnQgY2hlY2tfZnMgPSAwOwotICAgIGludCBzaXplOwotICAgIGNoYXIgKiBidWY7CisJaW50IGNoZWNrX2ZzID0gMDsKKwlpbnQgc2l6ZTsKKwljaGFyICpidWY7CiAKLSAgICBzaXplID0gZ2V0X3ZpcnR1YWxfbm9kZV9zaXplICh0Yi0+dGJfc2IsIFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCkpOworCXNpemUgPSBnZXRfdmlydHVhbF9ub2RlX3NpemUodGItPnRiX3NiLCBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCkpOwogCi0gICAgaWYgKHNpemUgPiB0Yi0+dm5fYnVmX3NpemUpIHsKLQkvKiB3ZSBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IGZvciB2aXJ0dWFsIG5vZGUgKi8KLQlpZiAodGItPnZuX2J1ZikgewotCSAgICAvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYmVmb3JlICovCi0JICAgIHJlaXNlcmZzX2tmcmVlICh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7Ci0JICAgIC8qIHRoaXMgaXMgbm90IG5lZWRlZCBpZiBrZnJlZSBpcyBhdG9taWMgKi8KLSAgICAgICAgICAgIGNoZWNrX2ZzID0gMTsKLQl9CisJaWYgKHNpemUgPiB0Yi0+dm5fYnVmX3NpemUpIHsKKwkJLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBmb3IgdmlydHVhbCBub2RlICovCisJCWlmICh0Yi0+dm5fYnVmKSB7CisJCQkvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYmVmb3JlICovCisJCQlyZWlzZXJmc19rZnJlZSh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7CisJCQkvKiB0aGlzIGlzIG5vdCBuZWVkZWQgaWYga2ZyZWUgaXMgYXRvbWljICovCisJCQljaGVja19mcyA9IDE7CisJCX0KIAotCS8qIHZpcnR1YWwgbm9kZSByZXF1aXJlcyBub3cgbW9yZSBtZW1vcnkgKi8KLQl0Yi0+dm5fYnVmX3NpemUgPSBzaXplOworCQkvKiB2aXJ0dWFsIG5vZGUgcmVxdWlyZXMgbm93IG1vcmUgbWVtb3J5ICovCisJCXRiLT52bl9idWZfc2l6ZSA9IHNpemU7CiAKLQkvKiBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIGl0ZW0gKi8KLQlidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4sIHRiLT50Yl9zYik7Ci0JaWYgKCAhIGJ1ZiApIHsKLQkgICAgLyogZ2V0dGluZyBtZW1vcnkgd2l0aCBHRlBfS0VSTkVMIHByaW9yaXR5IG1heSBpbnZvbHZlCi0gICAgICAgICAgICAgICBiYWxhbmNpbmcgbm93IChkdWUgdG8gaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24gb24KLSAgICAgICAgICAgICAgIGRjYWNoZSBzaHJpbmtpbmcpLiBTbywgcmVsZWFzZSBwYXRoIGFuZCBjb2xsZWN0ZWQKLSAgICAgICAgICAgICAgIHJlc291cmNlcyBoZXJlICovCi0JICAgIGZyZWVfYnVmZmVyc19pbl90YiAodGIpOwotCSAgICBidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9OT0ZTLCB0Yi0+dGJfc2IpOwotCSAgICBpZiAoICFidWYgKSB7CisJCS8qIGdldCBtZW1vcnkgZm9yIHZpcnR1YWwgaXRlbSAqLworCQlidWYgPQorCQkgICAgcmVpc2VyZnNfa21hbGxvYyhzaXplLCBHRlBfQVRPTUlDIHwgX19HRlBfTk9XQVJOLAorCQkJCSAgICAgdGItPnRiX3NiKTsKKwkJaWYgKCFidWYpIHsKKwkJCS8qIGdldHRpbmcgbWVtb3J5IHdpdGggR0ZQX0tFUk5FTCBwcmlvcml0eSBtYXkgaW52b2x2ZQorCQkJICAgYmFsYW5jaW5nIG5vdyAoZHVlIHRvIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uIG9uCisJCQkgICBkY2FjaGUgc2hyaW5raW5nKS4gU28sIHJlbGVhc2UgcGF0aCBhbmQgY29sbGVjdGVkCisJCQkgICByZXNvdXJjZXMgaGVyZSAqLworCQkJZnJlZV9idWZmZXJzX2luX3RiKHRiKTsKKwkJCWJ1ZiA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZSwgR0ZQX05PRlMsIHRiLT50Yl9zYik7CisJCQlpZiAoIWJ1ZikgewogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCQlyZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCi0JCQkJICAidnMtODM0NTogZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlOiAiCi0JCQkJICAia21hbGxvYyBmYWlsZWQuIHJlaXNlcmZzIGttYWxsb2NlZCAlZCBieXRlcyIsCi0JCQkJICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2ttYWxsb2NzKTsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHRiLT50Yl9zYiwKKwkJCQkJCSAidnMtODM0NTogZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlOiAiCisJCQkJCQkgImttYWxsb2MgZmFpbGVkLiByZWlzZXJmcyBrbWFsbG9jZWQgJWQgYnl0ZXMiLAorCQkJCQkJIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPgorCQkJCQkJIHNfa21hbGxvY3MpOwogI2VuZGlmCi0JCXRiLT52bl9idWZfc2l6ZSA9IDA7Ci0JICAgIH0KLQkgICAgdGItPnZuX2J1ZiA9IGJ1ZjsKLQkgICAgc2NoZWR1bGUoKSA7Ci0JICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCQkJCXRiLT52bl9idWZfc2l6ZSA9IDA7CisJCQl9CisJCQl0Yi0+dm5fYnVmID0gYnVmOworCQkJc2NoZWR1bGUoKTsKKwkJCXJldHVybiBSRVBFQVRfU0VBUkNIOworCQl9CisKKwkJdGItPnZuX2J1ZiA9IGJ1ZjsKIAl9CiAKLQl0Yi0+dm5fYnVmID0gYnVmOwotICAgIH0KKwlpZiAoY2hlY2tfZnMgJiYgRklMRVNZU1RFTV9DSEFOR0VEX1RCKHRiKSkKKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CiAKLSAgICBpZiAoIGNoZWNrX2ZzICYmIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAodGIpICkKLSAgICAgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7Ci0KLSAgICByZXR1cm4gQ0FSUllfT047CisJcmV0dXJuIENBUlJZX09OOwogfQogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLXN0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKLQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogcF9zX2JoLCAKLQkJCQkgICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkgewotICBpZiAocF9zX2JoKSB7Ci0gICAgaWYgKGF0b21pY19yZWFkICgmKHBfc19iaC0+Yl9jb3VudCkpIDw9IDApIHsKK3N0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmgsCisJCQkJICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkKK3sKKwlpZiAocF9zX2JoKSB7CisJCWlmIChhdG9taWNfcmVhZCgmKHBfc19iaC0+Yl9jb3VudCkpIDw9IDApIHsKIAotICAgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTE6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogbmVnYXRpdmUgb3IgemVybyByZWZlcmVuY2UgY291bnRlciBmb3IgYnVmZmVyICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7Ci0gICAgfQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtMTogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBuZWdhdGl2ZSBvciB6ZXJvIHJlZmVyZW5jZSBjb3VudGVyIGZvciBidWZmZXIgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKCAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX2JoKSApIHsKLSAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0yOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtMjogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IHVwIHRvIGRhdGUgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKCAhIEJfSVNfSU5fVFJFRSAocF9zX2JoKSApIHsKLSAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0zOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBpcyBub3QgaW4gdHJlZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KKwkJaWYgKCFCX0lTX0lOX1RSRUUocF9zX2JoKSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtMzogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IGluIHRyZWUgJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQogCi0gICAgaWYgKHBfc19iaC0+Yl9iZGV2ICE9IHBfc19zYi0+c19iZGV2KSB7Ci0JcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTQ6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGhhcyB3cm9uZyBkZXZpY2UgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKLSAgICB9CisJCWlmIChwX3NfYmgtPmJfYmRldiAhPSBwX3Nfc2ItPnNfYmRldikgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtNDogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaGFzIHdyb25nIGRldmljZSAlc1slZF0gKCViKVxuIiwKKwkJCQkgICAgICAgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworCQl9CiAKLSAgICBpZiAocF9zX2JoLT5iX3NpemUgIT0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgewotCXJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC01OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBoYXMgd3JvbmcgYmxvY2tzaXplICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7Ci0gICAgfQorCQlpZiAocF9zX2JoLT5iX3NpemUgIT0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam1hY2QtNTogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaGFzIHdyb25nIGJsb2Nrc2l6ZSAlc1slZF0gKCViKVxuIiwKKwkJCQkgICAgICAgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworCQl9CiAKLSAgICBpZiAocF9zX2JoLT5iX2Jsb2NrbnIgPiBTQl9CTE9DS19DT1VOVChwX3Nfc2IpKSB7Ci0JcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTY6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGJsb2NrIG51bWJlciB0b28gaGlnaCAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOwotICAgIH0KLSAgfQorCQlpZiAocF9zX2JoLT5iX2Jsb2NrbnIgPiBTQl9CTE9DS19DT1VOVChwX3Nfc2IpKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJqbWFjZC02OiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBibG9jayBudW1iZXIgdG9vIGhpZ2ggJXNbJWRdICglYilcbiIsCisJCQkJICAgICAgIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKwkJfQorCX0KIH0KICNlbHNlCi1zdGF0aWMgdm9pZCB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCi0JCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCwgCi0JCQkJICAgIGNvbnN0IGNoYXIgKmRlc2NyLCBpbnQgbGV2ZWwpCi17O30KK3N0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmgsCisJCQkJICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkKK3s7Cit9CiAjZW5kaWYKIAotc3RhdGljIGludCBjbGVhcl9hbGxfZGlydHlfYml0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gIHJldHVybiByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAwKSA7Ci19Ci0KLXN0YXRpYyBpbnQgd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiKQorc3RhdGljIGludCBjbGVhcl9hbGxfZGlydHlfYml0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbG9ja2VkOwotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGludCByZXBlYXRfY291bnRlciA9IDA7Ci0jZW5kaWYKLSAgICBpbnQgaTsKLQotICAgIGRvIHsKLQotCWxvY2tlZCA9IE5VTEw7Ci0KLQlmb3IgKCBpID0gcF9zX3RiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aDsgIWxvY2tlZCAmJiBpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOyBpLS0gKSB7Ci0JICAgIGlmICggUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKSApIHsKLQkJLyogaWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSwgd2UgY2FuIG9ubHkgYmUgc3VyZSB0aGUgbGFzdCBidWZmZXIKLQkJKiogaW4gdGhlIHBhdGggaXMgaW4gdGhlIHRyZWUgLS1jbG0KLQkJKi8KLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkJaWYgKFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCkgPT0KLQkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBpKSkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgCi0JCQkJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpLCAKLQkJCQkJICAgICJTIiwgCi0JCQkJCSAgICBwX3NfdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoIC0gaSk7Ci0JCX0KLSNlbmRpZgotCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsCi0JCQkJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpKSkKLQkJewotCQkgICAgbG9ja2VkID0gUEFUSF9PRkZTRVRfUEJVRkZFUiAocF9zX3RiLT50Yl9wYXRoLCBpKTsKLQkJfQotCSAgICB9Ci0JfQotCi0JZm9yICggaSA9IDA7ICFsb2NrZWQgJiYgaSA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtpXTsgaSsrICkgeyAKLQotCSAgICBpZiAocF9zX3RiLT5sbnVtW2ldICkgewotCi0JCWlmICggcF9zX3RiLT5MW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5MW2ldLCAiTCIsIGkpOwotCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5MW2ldOwotCQl9Ci0KLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+RkxbaV0gKSB7Ci0JCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldLCAiRkwiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GTFtpXSkpCi0JCQlsb2NrZWQgPSBwX3NfdGItPkZMW2ldOwotCQl9Ci0KLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+Q0ZMW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0sICJDRkwiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5DRkxbaV07Ci0JCX0KLQotCSAgICB9Ci0KLQkgICAgaWYgKCAhbG9ja2VkICYmIChwX3NfdGItPnJudW1baV0pICkgewotCi0JCWlmICggcF9zX3RiLT5SW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5SW2ldLCAiUiIsIGkpOwotCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5SW2ldOwotCQl9Ci0KLSAgICAgICAKLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+RlJbaV0gKSB7Ci0JCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldLCAiRlIiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GUltpXSkpCi0JCQlsb2NrZWQgPSBwX3NfdGItPkZSW2ldOwotCQl9Ci0KLQkJaWYgKCAhbG9ja2VkICYmIHBfc190Yi0+Q0ZSW2ldICkgewotCQkgICAgdGJfYnVmZmVyX3Nhbml0eV9jaGVjayAocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0sICJDRlIiLCBpKTsKLQkJICAgIGlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0pKQotCQkJbG9ja2VkID0gcF9zX3RiLT5DRlJbaV07Ci0JCX0KLQkgICAgfQotCX0KLQkvKiBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyBpcyBub3QgcmVxdWlyZWQuICBUaGUgRkVCIGxpc3Qgc2VlbXMKLQkqKiB0byBiZSBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZCBub2Rlcywgd2hpY2ggd2lsbCBuZXZlciBiZSBsb2NrZWQsCi0JKiogZGlydHksIG9yIGFueXRoaW5nIGVsc2UuCi0JKiogVG8gYmUgc2FmZSwgSSdtIHB1dHRpbmcgaW4gdGhlIGNoZWNrcyBhbmQgd2FpdHMgaW4uICBGb3IgdGhlIG1vbWVudCwKLQkqKiB0aGV5IGFyZSBuZWVkZWQgdG8ga2VlcCB0aGUgY29kZSBpbiBqb3VybmFsLmMgZnJvbSBjb21wbGFpbmluZwotCSoqIGFib3V0IHRoZSBidWZmZXIuICBUaGF0IGNvZGUgaXMgaW5zaWRlIENPTkZJR19SRUlTRVJGU19DSEVDSyBhcyB3ZWxsLgotCSoqIC0tY2xtCi0JKi8KLQlmb3IgKCBpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0ZFQl9TSVpFOyBpKysgKSB7IAotCSAgICBpZiAoIHBfc190Yi0+RkVCW2ldICkgewotCQlpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKSkKLQkJICAgIGxvY2tlZCA9IHBfc190Yi0+RkVCW2ldIDsKLQkgICAgfQotCX0KLQotCWlmIChsb2NrZWQpIHsKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkgICAgcmVwZWF0X2NvdW50ZXIrKzsKLQkgICAgaWYgKCAocmVwZWF0X2NvdW50ZXIgJSAxMDAwMCkgPT0gMCkgewotCQlyZWlzZXJmc193YXJuaW5nIChwX3NfdGItPnRiX3NiLAotCQkJCSAgIndhaXRfdGJfYnVmZmVyc191bnRpbF9yZWxlYXNlZCgpOiB0b28gbWFueSAiCi0JCQkJICAiaXRlcmF0aW9ucyB3YWl0aW5nIGZvciBidWZmZXIgdG8gdW5sb2NrICIKLQkJCQkgICIoJWIpIiwgbG9ja2VkKTsKLQotCQkvKiBEb24ndCBsb29wIGZvcmV2ZXIuICBUcnkgdG8gcmVjb3ZlciBmcm9tIHBvc3NpYmxlIGVycm9yLiAqLwotCi0JCXJldHVybiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApID8gUkVQRUFUX1NFQVJDSCA6IENBUlJZX09OOwotCSAgICB9Ci0jZW5kaWYKLQkgICAgX193YWl0X29uX2J1ZmZlciAobG9ja2VkKTsKLQkgICAgaWYgKCBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHBfc190YikgKSB7Ci0JCXJldHVybiBSRVBFQVRfU0VBUkNIOwotCSAgICB9Ci0JfQotCi0gICAgfSB3aGlsZSAobG9ja2VkKTsKLQotICAgIHJldHVybiBDQVJSWV9PTjsKKwlyZXR1cm4gcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgd2FpdF90Yl9idWZmZXJzX3VudGlsX3VubG9ja2VkKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmxvY2tlZDsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlpbnQgcmVwZWF0X2NvdW50ZXIgPSAwOworI2VuZGlmCisJaW50IGk7CisKKwlkbyB7CisKKwkJbG9ja2VkID0gTlVMTDsKKworCQlmb3IgKGkgPSBwX3NfdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoOworCQkgICAgICFsb2NrZWQgJiYgaSA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsgaS0tKSB7CisJCQlpZiAoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIGkpKSB7CisJCQkJLyogaWYgSSB1bmRlcnN0YW5kIGNvcnJlY3RseSwgd2UgY2FuIG9ubHkgYmUgc3VyZSB0aGUgbGFzdCBidWZmZXIKKwkJCQkgKiogaW4gdGhlIHBhdGggaXMgaW4gdGhlIHRyZWUgLS1jbG0KKwkJCQkgKi8KKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkJCQlpZiAoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3RiLT50Yl9wYXRoKSA9PQorCQkJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgaSkpIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBQQVRIX09GRlNFVF9QQlVGRkVSCisJCQkJCQkJICAgICAgIChwX3NfdGItPnRiX3BhdGgsCisJCQkJCQkJCWkpLCAiUyIsCisJCQkJCQkJICAgICAgIHBfc190Yi0+dGJfcGF0aC0+CisJCQkJCQkJICAgICAgIHBhdGhfbGVuZ3RoIC0gaSk7CisJCQkJfQorI2VuZGlmCisJCQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgUEFUSF9PRkZTRVRfUEJVRkZFUgorCQkJCQkJCSAgKHBfc190Yi0+dGJfcGF0aCwKKwkJCQkJCQkgICBpKSkpIHsKKwkJCQkJbG9ja2VkID0KKwkJCQkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLAorCQkJCQkJCQlpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlmb3IgKGkgPSAwOyAhbG9ja2VkICYmIGkgPCBNQVhfSEVJR0hUICYmIHBfc190Yi0+aW5zZXJ0X3NpemVbaV07CisJCSAgICAgaSsrKSB7CisKKwkJCWlmIChwX3NfdGItPmxudW1baV0pIHsKKworCQkJCWlmIChwX3NfdGItPkxbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkxbaV0sCisJCQkJCQkJICAgICAgICJMIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5MW2ldOworCQkJCX0KKworCQkJCWlmICghbG9ja2VkICYmIHBfc190Yi0+RkxbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkZMW2ldLAorCQkJCQkJCSAgICAgICAiRkwiLCBpKTsKKwkJCQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cworCQkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkxbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5GTFtpXTsKKwkJCQl9CisKKwkJCQlpZiAoIWxvY2tlZCAmJiBwX3NfdGItPkNGTFtpXSkgeworCQkJCQl0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJICAgICAgIHBfc190Yi0+Q0ZMW2ldLAorCQkJCQkJCSAgICAgICAiQ0ZMIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGTFtpXSkpCisJCQkJCQlsb2NrZWQgPSBwX3NfdGItPkNGTFtpXTsKKwkJCQl9CisKKwkJCX0KKworCQkJaWYgKCFsb2NrZWQgJiYgKHBfc190Yi0+cm51bVtpXSkpIHsKKworCQkJCWlmIChwX3NfdGItPlJbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPlJbaV0sCisJCQkJCQkJICAgICAgICJSIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5SW2ldOworCQkJCX0KKworCQkJCWlmICghbG9ja2VkICYmIHBfc190Yi0+RlJbaV0pIHsKKwkJCQkJdGJfYnVmZmVyX3Nhbml0eV9jaGVjayhwX3NfdGItPnRiX3NiLAorCQkJCQkJCSAgICAgICBwX3NfdGItPkZSW2ldLAorCQkJCQkJCSAgICAgICAiRlIiLCBpKTsKKwkJCQkJaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cworCQkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RlJbaV0pKQorCQkJCQkJbG9ja2VkID0gcF9zX3RiLT5GUltpXTsKKwkJCQl9CisKKwkJCQlpZiAoIWxvY2tlZCAmJiBwX3NfdGItPkNGUltpXSkgeworCQkJCQl0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJICAgICAgIHBfc190Yi0+Q0ZSW2ldLAorCQkJCQkJCSAgICAgICAiQ0ZSIiwgaSk7CisJCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkJICAgIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGUltpXSkpCisJCQkJCQlsb2NrZWQgPSBwX3NfdGItPkNGUltpXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogYXMgZmFyIGFzIEkgY2FuIHRlbGwsIHRoaXMgaXMgbm90IHJlcXVpcmVkLiAgVGhlIEZFQiBsaXN0IHNlZW1zCisJCSAqKiB0byBiZSBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZCBub2Rlcywgd2hpY2ggd2lsbCBuZXZlciBiZSBsb2NrZWQsCisJCSAqKiBkaXJ0eSwgb3IgYW55dGhpbmcgZWxzZS4KKwkJICoqIFRvIGJlIHNhZmUsIEknbSBwdXR0aW5nIGluIHRoZSBjaGVja3MgYW5kIHdhaXRzIGluLiAgRm9yIHRoZSBtb21lbnQsCisJCSAqKiB0aGV5IGFyZSBuZWVkZWQgdG8ga2VlcCB0aGUgY29kZSBpbiBqb3VybmFsLmMgZnJvbSBjb21wbGFpbmluZworCQkgKiogYWJvdXQgdGhlIGJ1ZmZlci4gIFRoYXQgY29kZSBpcyBpbnNpZGUgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGFzIHdlbGwuCisJCSAqKiAtLWNsbQorCQkgKi8KKwkJZm9yIChpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0ZFQl9TSVpFOyBpKyspIHsKKwkJCWlmIChwX3NfdGItPkZFQltpXSkgeworCQkJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMKKwkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKSkKKwkJCQkJbG9ja2VkID0gcF9zX3RiLT5GRUJbaV07CisJCQl9CisJCX0KKworCQlpZiAobG9ja2VkKSB7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCQlyZXBlYXRfY291bnRlcisrOworCQkJaWYgKChyZXBlYXRfY291bnRlciAlIDEwMDAwKSA9PSAwKSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhwX3NfdGItPnRiX3NiLAorCQkJCQkJICJ3YWl0X3RiX2J1ZmZlcnNfdW50aWxfcmVsZWFzZWQoKTogdG9vIG1hbnkgIgorCQkJCQkJICJpdGVyYXRpb25zIHdhaXRpbmcgZm9yIGJ1ZmZlciB0byB1bmxvY2sgIgorCQkJCQkJICIoJWIpIiwgbG9ja2VkKTsKKworCQkJCS8qIERvbid0IGxvb3AgZm9yZXZlci4gIFRyeSB0byByZWNvdmVyIGZyb20gcG9zc2libGUgZXJyb3IuICovCisKKwkJCQlyZXR1cm4gKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSA/CisJCQkJICAgIFJFUEVBVF9TRUFSQ0ggOiBDQVJSWV9PTjsKKwkJCX0KKyNlbmRpZgorCQkJX193YWl0X29uX2J1ZmZlcihsb2NrZWQpOworCQkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJCQl9CisJCX0KKworCX0gd2hpbGUgKGxvY2tlZCk7CisKKwlyZXR1cm4gQ0FSUllfT047Cit9CiAKIC8qIFByZXBhcmUgZm9yIGJhbGFuY2luZywgdGhhdCBpcwogICoJZ2V0IGFsbCBuZWNlc3NhcnkgcGFyZW50cywgYW5kIG5laWdoYm9yczsKQEAgLTIyNjcsMjUyICsyMzYwLDI2NiBAQAogICogICAgICAgICAgICAgLTEgLSBpZiBub19kaXNrX3NwYWNlIAogICovCiAKK2ludCBmaXhfbm9kZXMoaW50IG5fb3BfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3NfaW5zX2loLAkvLyBpdGVtIGhlYWQgb2YgaXRlbSBiZWluZyBpbnNlcnRlZAorCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEJLy8gaW5zZXJ0ZWQgaXRlbSBvciBkYXRhIHRvIGJlIHBhc3RlZAorICAgICkKK3sKKwlpbnQgbl9yZXRfdmFsdWUsIG5faCwgbl9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgpOworCWludCBuX3Bvc19pbl9pdGVtOwogCi1pbnQgZml4X25vZGVzIChpbnQgbl9vcF9tb2RlLAotCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogCXBfc190YiwKLQkgICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfc19pbnNfaWgsIC8vIGl0ZW0gaGVhZCBvZiBpdGVtIGJlaW5nIGluc2VydGVkCi0JICAgICAgIGNvbnN0IHZvaWQgKiBkYXRhIC8vIGluc2VydGVkIGl0ZW0gb3IgZGF0YSB0byBiZSBwYXN0ZWQKLSAgICApIHsKLSAgICBpbnQJbl9yZXRfdmFsdWUsCi0gICAgCW5faCwKLSAgICAJbl9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgpOwotICAgIGludCBuX3Bvc19pbl9pdGVtOworCS8qIHdlIHNldCB3YWl0X3RiX2J1ZmZlcnNfcnVuIHdoZW4gd2UgaGF2ZSB0byByZXN0b3JlIGFueSBkaXJ0eSBiaXRzIGNsZWFyZWQKKwkgKiogZHVyaW5nIHdhaXRfdGJfYnVmZmVyc19ydW4KKwkgKi8KKwlpbnQgd2FpdF90Yl9idWZmZXJzX3J1biA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCk7CiAKLSAgICAvKiB3ZSBzZXQgd2FpdF90Yl9idWZmZXJzX3J1biB3aGVuIHdlIGhhdmUgdG8gcmVzdG9yZSBhbnkgZGlydHkgYml0cyBjbGVhcmVkCi0gICAgKiogZHVyaW5nIHdhaXRfdGJfYnVmZmVyc19ydW4KLSAgICAqLwotICAgIGludCB3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMCA7IAotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCk7CisJKytSRUlTRVJGU19TQihwX3NfdGItPnRiX3NiKS0+c19maXhfbm9kZXM7CiAKLSAgICArKyBSRUlTRVJGU19TQihwX3NfdGIgLT4gdGJfc2IpIC0+IHNfZml4X25vZGVzOworCW5fcG9zX2luX2l0ZW0gPSBwX3NfdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOwogCi0gICAgbl9wb3NfaW5faXRlbSA9IHBfc190Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07CisJcF9zX3RiLT5mc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihwX3NfdGItPnRiX3NiKTsKIAorCS8qIHdlIHByZXBhcmUgYW5kIGxvZyB0aGUgc3VwZXIgaGVyZSBzbyBpdCB3aWxsIGFscmVhZHkgYmUgaW4gdGhlCisJICoqIHRyYW5zYWN0aW9uIHdoZW4gZG9fYmFsYW5jZSBuZWVkcyB0byBjaGFuZ2UgaXQuCisJICoqIFRoaXMgd2F5IGRvX2JhbGFuY2Ugd29uJ3QgaGF2ZSB0byBzY2hlZHVsZSB3aGVuIHRyeWluZyB0byBwcmVwYXJlCisJICoqIHRoZSBzdXBlciBmb3IgbG9nZ2luZworCSAqLworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3RiLT50Yl9zYiwKKwkJCQkgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc190Yi0+dGJfc2IpLCAxKTsKKwlqb3VybmFsX21hcmtfZGlydHkocF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUsIHBfc190Yi0+dGJfc2IsCisJCQkgICBTQl9CVUZGRVJfV0lUSF9TQihwX3NfdGItPnRiX3NiKSk7CisJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKQorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAotICAgIHBfc190Yi0+ZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKHBfc190Yi0+dGJfc2IpOwotCi0gICAgLyogd2UgcHJlcGFyZSBhbmQgbG9nIHRoZSBzdXBlciBoZXJlIHNvIGl0IHdpbGwgYWxyZWFkeSBiZSBpbiB0aGUKLSAgICAqKiB0cmFuc2FjdGlvbiB3aGVuIGRvX2JhbGFuY2UgbmVlZHMgdG8gY2hhbmdlIGl0LgotICAgICoqIFRoaXMgd2F5IGRvX2JhbGFuY2Ugd29uJ3QgaGF2ZSB0byBzY2hlZHVsZSB3aGVuIHRyeWluZyB0byBwcmVwYXJlCi0gICAgKiogdGhlIHN1cGVyIGZvciBsb2dnaW5nCi0gICAgKi8KLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc190Yi0+dGJfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3RiLT50Yl9zYiksIDEpIDsKLSAgICBqb3VybmFsX21hcmtfZGlydHkocF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUsIHBfc190Yi0+dGJfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3NfdGItPnRiX3NiKSkgOwotICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKLQotICAgIC8qIGlmIGl0IHBvc3NpYmxlIGluIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uICovCi0gICAgaWYgKGJ1ZmZlcl9sb2NrZWQgKHBfc190YlMwKSkgewotICAgICAgICBfX3dhaXRfb25fYnVmZmVyIChwX3NfdGJTMCk7Ci0gICAgICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKLSAgICAgICAgICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOwotICAgIH0KLQotI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmICggY3VyX3RiICkgewotCXByaW50X2N1cl90YiAoImZpeF9ub2RlcyIpOwotCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzA1OiBmaXhfbm9kZXM6ICB0aGVyZSBpcyBwZW5kaW5nIGRvX2JhbGFuY2UiKTsKLSAgICB9Ci0KLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZSAocF9zX3RiUzApIHx8ICFCX0lTX0lOX1RSRUUgKHBfc190YlMwKSkgewotCXJlaXNlcmZzX3BhbmljIChwX3NfdGItPnRiX3NiLCAiUEFQLTgzMjA6IGZpeF9ub2RlczogU1swXSAoJWIgJXopIGlzIG5vdCB1cHRvZGF0ZSAiCi0JCQkiYXQgdGhlIGJlZ2lubmluZyBvZiBmaXhfbm9kZXMgb3Igbm90IGluIHRyZWUgKG1vZGUgJWMpIiwgcF9zX3RiUzAsIHBfc190YlMwLCBuX29wX21vZGUpOwotICAgIH0KLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMuICovCi0gICAgc3dpdGNoIChuX29wX21vZGUpIHsKLSAgICBjYXNlIE1fSU5TRVJUOgotCWlmICggbl9pdGVtX251bSA8PSAwIHx8IG5faXRlbV9udW0gPiBCX05SX0lURU1TKHBfc190YlMwKSApCi0JICAgIHJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzMwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciAlZCAoaW4gUzAgLSAlZCkgaW4gY2FzZSBvZiBpbnNlcnQiLAotCQkJICAgbl9pdGVtX251bSwgQl9OUl9JVEVNUyhwX3NfdGJTMCkpOwotCWJyZWFrOwotICAgIGNhc2UgTV9QQVNURToKLSAgICBjYXNlIE1fREVMRVRFOgotICAgIGNhc2UgTV9DVVQ6Ci0JaWYgKCBuX2l0ZW1fbnVtIDwgMCB8fCBuX2l0ZW1fbnVtID49IEJfTlJfSVRFTVMocF9zX3RiUzApICkgewotCSAgICBwcmludF9ibG9jayAocF9zX3RiUzAsIDAsIC0xLCAtMSk7Ci0JICAgIHJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzM1OiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciglZCk7IG1vZGUgPSAlYyBpbnNlcnRfc2l6ZSA9ICVkXG4iLCBuX2l0ZW1fbnVtLCBuX29wX21vZGUsIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0pOworCS8qIGlmIGl0IHBvc3NpYmxlIGluIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uICovCisJaWYgKGJ1ZmZlcl9sb2NrZWQocF9zX3RiUzApKSB7CisJCV9fd2FpdF9vbl9idWZmZXIocF9zX3RiUzApOworCQlpZiAoRklMRVNZU1RFTV9DSEFOR0VEX1RCKHBfc190YikpCisJCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAl9Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLCJQQVAtODM0MDogZml4X25vZGVzOiBJbmNvcnJlY3QgbW9kZSBvZiBvcGVyYXRpb24iKTsKLSAgICB9CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKGN1cl90YikgeworCQlwcmludF9jdXJfdGIoImZpeF9ub2RlcyIpOworCQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLAorCQkJICAgICAgICJQQVAtODMwNTogZml4X25vZGVzOiAgdGhlcmUgaXMgcGVuZGluZyBkb19iYWxhbmNlIik7CisJfQorCisJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX3RiUzApIHx8ICFCX0lTX0lOX1RSRUUocF9zX3RiUzApKSB7CisJCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC04MzIwOiBmaXhfbm9kZXM6IFNbMF0gKCViICV6KSBpcyBub3QgdXB0b2RhdGUgIgorCQkJICAgICAgICJhdCB0aGUgYmVnaW5uaW5nIG9mIGZpeF9ub2RlcyBvciBub3QgaW4gdHJlZSAobW9kZSAlYykiLAorCQkJICAgICAgIHBfc190YlMwLCBwX3NfdGJTMCwgbl9vcF9tb2RlKTsKKwl9CisKKwkvKiBDaGVjayBwYXJhbWV0ZXJzLiAqLworCXN3aXRjaCAobl9vcF9tb2RlKSB7CisJY2FzZSBNX0lOU0VSVDoKKwkJaWYgKG5faXRlbV9udW0gPD0gMCB8fCBuX2l0ZW1fbnVtID4gQl9OUl9JVEVNUyhwX3NfdGJTMCkpCisJCQlyZWlzZXJmc19wYW5pYyhwX3NfdGItPnRiX3NiLAorCQkJCSAgICAgICAiUEFQLTgzMzA6IGZpeF9ub2RlczogSW5jb3JyZWN0IGl0ZW0gbnVtYmVyICVkIChpbiBTMCAtICVkKSBpbiBjYXNlIG9mIGluc2VydCIsCisJCQkJICAgICAgIG5faXRlbV9udW0sIEJfTlJfSVRFTVMocF9zX3RiUzApKTsKKwkJYnJlYWs7CisJY2FzZSBNX1BBU1RFOgorCWNhc2UgTV9ERUxFVEU6CisJY2FzZSBNX0NVVDoKKwkJaWYgKG5faXRlbV9udW0gPCAwIHx8IG5faXRlbV9udW0gPj0gQl9OUl9JVEVNUyhwX3NfdGJTMCkpIHsKKwkJCXByaW50X2Jsb2NrKHBfc190YlMwLCAwLCAtMSwgLTEpOworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3RiLT50Yl9zYiwKKwkJCQkgICAgICAgIlBBUC04MzM1OiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciglZCk7IG1vZGUgPSAlYyBpbnNlcnRfc2l6ZSA9ICVkXG4iLAorCQkJCSAgICAgICBuX2l0ZW1fbnVtLCBuX29wX21vZGUsCisJCQkJICAgICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0pOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsCisJCQkgICAgICAgIlBBUC04MzQwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBtb2RlIG9mIG9wZXJhdGlvbiIpOworCX0KICNlbmRpZgogCi0gICAgaWYgKGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZSAocF9zX3RiKSA9PSBSRVBFQVRfU0VBUkNIKQotCS8vIEZJWE1FOiBtYXliZSAtRU5PTUVNIHdoZW4gdGItPnZuX2J1ZiA9PSAwPyBOb3cganVzdCByZXBlYXQKLQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwlpZiAoZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlKHBfc190YikgPT0gUkVQRUFUX1NFQVJDSCkKKwkJLy8gRklYTUU6IG1heWJlIC1FTk9NRU0gd2hlbiB0Yi0+dm5fYnVmID09IDA/IE5vdyBqdXN0IHJlcGVhdAorCQlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKIAotCi0gICAgLyogU3RhcnRpbmcgZnJvbSB0aGUgbGVhZiBsZXZlbDsgZm9yIGFsbCBsZXZlbHMgbl9oIG9mIHRoZSB0cmVlLiAqLwotICAgIGZvciAoIG5faCA9IDA7IG5faCA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2hdOyBuX2grKyApIHsgCi0JaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZGlyZWN0X3BhcmVudChwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgewotCSAgICBnb3RvIHJlcGVhdDsKLQl9Ci0KLQlpZiAoIChuX3JldF92YWx1ZSA9IGNoZWNrX2JhbGFuY2UgKG5fb3BfbW9kZSwgcF9zX3RiLCBuX2gsIG5faXRlbV9udW0sCi0JCQkJCSAgIG5fcG9zX2luX2l0ZW0sIHBfc19pbnNfaWgsIGRhdGEpKSAhPSBDQVJSWV9PTiApIHsKLQkgICAgaWYgKCBuX3JldF92YWx1ZSA9PSBOT19CQUxBTkNJTkdfTkVFREVEICkgewotCQkvKiBObyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkLiAqLwotCQlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKLQkJICAgIGdvdG8gcmVwZWF0OworCS8qIFN0YXJ0aW5nIGZyb20gdGhlIGxlYWYgbGV2ZWw7IGZvciBhbGwgbGV2ZWxzIG5faCBvZiB0aGUgdHJlZS4gKi8KKwlmb3IgKG5faCA9IDA7IG5faCA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2hdOyBuX2grKykgeworCQlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X2RpcmVjdF9wYXJlbnQocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTikgeworCQkJZ290byByZXBlYXQ7CiAJCX0KLQkJaWYgKCBuX2ggIT0gTUFYX0hFSUdIVCAtIDEgKSAgCi0JCSAgICBwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKLQkJLyogb2ssIGFuYWx5c2lzIGFuZCByZXNvdXJjZSBnYXRoZXJpbmcgYXJlIGNvbXBsZXRlICovCi0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGdvdG8gcmVwZWF0OwotCX0KIAotCWlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X25laWdoYm9ycyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgewotCSAgICBnb3RvIHJlcGVhdDsKLQl9Ci0KLQlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9lbXB0eV9ub2RlcyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgewotCSAgICBnb3RvIHJlcGVhdDsgICAgICAgIC8qIE5vIGRpc2sgc3BhY2UsIG9yIHNjaGVkdWxlIG9jY3VycmVkIGFuZAotCQkJCSAgIGFuYWx5c2lzIG1heSBiZSBpbnZhbGlkIGFuZCBuZWVkcyB0byBiZSByZWRvbmUuICovCi0JfQotICAgIAotCWlmICggISBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCkgKSB7Ci0JICAgIC8qIFdlIGhhdmUgYSBwb3NpdGl2ZSBpbnNlcnQgc2l6ZSBidXQgbm8gbm9kZXMgZXhpc3Qgb24gdGhpcwotCSAgICAgICBsZXZlbCwgdGhpcyBtZWFucyB0aGF0IHdlIGFyZSBjcmVhdGluZyBhIG5ldyByb290LiAqLwotCi0JICAgIFJGQUxTRSggcF9zX3RiLT5ibGtudW1bbl9oXSAhPSAxLAotCQkgICAgIlBBUC04MzUwOiBjcmVhdGluZyBuZXcgZW1wdHkgcm9vdCIpOwotCi0JICAgIGlmICggbl9oIDwgTUFYX0hFSUdIVCAtIDEgKQotCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKLQl9Ci0JZWxzZQotCSAgICBpZiAoICEgUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKSApIHsKLQkJaWYgKCBwX3NfdGItPmJsa251bVtuX2hdID4gMSApIHsKLQkJICAgIC8qIFRoZSB0cmVlIG5lZWRzIHRvIGJlIGdyb3duLCBzbyB0aGlzIG5vZGUgU1tuX2hdCi0JCSAgICAgICB3aGljaCBpcyB0aGUgcm9vdCBub2RlIGlzIHNwbGl0IGludG8gdHdvIG5vZGVzLAotCQkgICAgICAgYW5kIGEgbmV3IG5vZGUgKFNbbl9oKzFdKSB3aWxsIGJlIGNyZWF0ZWQgdG8KLQkJICAgICAgIGJlY29tZSB0aGUgcm9vdCBub2RlLiAgKi8KLQkgIAotCQkgICAgUkZBTFNFKCBuX2ggPT0gTUFYX0hFSUdIVCAtIDEsCi0JCQkgICAgIlBBUC04MzU1OiBhdHRlbXB0IHRvIGNyZWF0ZSB0b28gaGlnaCBvZiBhIHRyZWUiKTsKLQotCQkgICAgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IChEQ19TSVpFICsgS0VZX1NJWkUpICogKHBfc190Yi0+YmxrbnVtW25faF0gLSAxKSArIERDX1NJWkU7CisJCWlmICgobl9yZXRfdmFsdWUgPQorCQkgICAgIGNoZWNrX2JhbGFuY2Uobl9vcF9tb2RlLCBwX3NfdGIsIG5faCwgbl9pdGVtX251bSwKKwkJCQkgICBuX3Bvc19pbl9pdGVtLCBwX3NfaW5zX2loLAorCQkJCSAgIGRhdGEpKSAhPSBDQVJSWV9PTikgeworCQkJaWYgKG5fcmV0X3ZhbHVlID09IE5PX0JBTEFOQ0lOR19ORUVERUQpIHsKKwkJCQkvKiBObyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkLiAqLworCQkJCWlmICgobl9yZXRfdmFsdWUgPQorCQkJCSAgICAgZ2V0X25laWdoYm9ycyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OKSB7CisJCQkJCWdvdG8gcmVwZWF0OworCQkJCX0KKwkJCQlpZiAobl9oICE9IE1BWF9IRUlHSFQgLSAxKQorCQkJCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKKwkJCQkvKiBvaywgYW5hbHlzaXMgYW5kIHJlc291cmNlIGdhdGhlcmluZyBhcmUgY29tcGxldGUgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCWVsc2UKLQkJICAgIGlmICggbl9oIDwgTUFYX0hFSUdIVCAtIDEgKQotCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7Ci0JICAgIH0KLQkgICAgZWxzZQotCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gKERDX1NJWkUgKyBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpOwotICAgIH0KIAotICAgIGlmICgobl9yZXRfdmFsdWUgPSB3YWl0X3RiX2J1ZmZlcnNfdW50aWxfdW5sb2NrZWQgKHBfc190YikpID09IENBUlJZX09OKSB7Ci0JaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7Ci0JICAgIHdhaXRfdGJfYnVmZmVyc19ydW4gPSAxIDsKLQkgICAgbl9yZXRfdmFsdWUgPSBSRVBFQVRfU0VBUkNIIDsKLQkgICAgZ290byByZXBlYXQ7IAorCQlpZiAoKG5fcmV0X3ZhbHVlID0gZ2V0X25laWdoYm9ycyhwX3NfdGIsIG5faCkpICE9IENBUlJZX09OKSB7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCisJCWlmICgobl9yZXRfdmFsdWUgPSBnZXRfZW1wdHlfbm9kZXMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTikgeworCQkJZ290byByZXBlYXQ7CS8qIE5vIGRpc2sgc3BhY2UsIG9yIHNjaGVkdWxlIG9jY3VycmVkIGFuZAorCQkJCQkgICBhbmFseXNpcyBtYXkgYmUgaW52YWxpZCBhbmQgbmVlZHMgdG8gYmUgcmVkb25lLiAqLworCQl9CisKKwkJaWYgKCFQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCkpIHsKKwkJCS8qIFdlIGhhdmUgYSBwb3NpdGl2ZSBpbnNlcnQgc2l6ZSBidXQgbm8gbm9kZXMgZXhpc3Qgb24gdGhpcworCQkJICAgbGV2ZWwsIHRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm9vdC4gKi8KKworCQkJUkZBTFNFKHBfc190Yi0+YmxrbnVtW25faF0gIT0gMSwKKwkJCSAgICAgICAiUEFQLTgzNTA6IGNyZWF0aW5nIG5ldyBlbXB0eSByb290Iik7CisKKwkJCWlmIChuX2ggPCBNQVhfSEVJR0hUIC0gMSkKKwkJCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gMDsKKwkJfSBlbHNlIGlmICghUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKSkgeworCQkJaWYgKHBfc190Yi0+YmxrbnVtW25faF0gPiAxKSB7CisJCQkJLyogVGhlIHRyZWUgbmVlZHMgdG8gYmUgZ3Jvd24sIHNvIHRoaXMgbm9kZSBTW25faF0KKwkJCQkgICB3aGljaCBpcyB0aGUgcm9vdCBub2RlIGlzIHNwbGl0IGludG8gdHdvIG5vZGVzLAorCQkJCSAgIGFuZCBhIG5ldyBub2RlIChTW25faCsxXSkgd2lsbCBiZSBjcmVhdGVkIHRvCisJCQkJICAgYmVjb21lIHRoZSByb290IG5vZGUuICAqLworCisJCQkJUkZBTFNFKG5faCA9PSBNQVhfSEVJR0hUIC0gMSwKKwkJCQkgICAgICAgIlBBUC04MzU1OiBhdHRlbXB0IHRvIGNyZWF0ZSB0b28gaGlnaCBvZiBhIHRyZWUiKTsKKworCQkJCXBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPQorCQkJCSAgICAoRENfU0laRSArCisJCQkJICAgICBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpICsKKwkJCQkgICAgRENfU0laRTsKKwkJCX0gZWxzZSBpZiAobl9oIDwgTUFYX0hFSUdIVCAtIDEpCisJCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJCX0gZWxzZQorCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9CisJCQkgICAgKERDX1NJWkUgKyBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpOworCX0KKworCWlmICgobl9yZXRfdmFsdWUgPSB3YWl0X3RiX2J1ZmZlcnNfdW50aWxfdW5sb2NrZWQocF9zX3RiKSkgPT0gQ0FSUllfT04pIHsKKwkJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJCQl3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMTsKKwkJCW5fcmV0X3ZhbHVlID0gUkVQRUFUX1NFQVJDSDsKKwkJCWdvdG8gcmVwZWF0OworCQl9IGVsc2UgeworCQkJcmV0dXJuIENBUlJZX09OOworCQl9CiAJfSBlbHNlIHsKLQkgICAgcmV0dXJuIENBUlJZX09OOwotCX0KLSAgICB9IGVsc2UgewotCXdhaXRfdGJfYnVmZmVyc19ydW4gPSAxIDsKLQlnb3RvIHJlcGVhdDsgCi0gICAgfQotCi0gcmVwZWF0OgotICAgIC8vIGZpeF9ub2RlcyB3YXMgdW5hYmxlIHRvIHBlcmZvcm0gaXRzIGNhbGN1bGF0aW9uIGR1ZSB0bwotICAgIC8vIGZpbGVzeXN0ZW0gZ290IGNoYW5nZWQgdW5kZXIgdXMsIGxhY2sgb2YgZnJlZSBkaXNrIHNwYWNlIG9yIGkvbwotICAgIC8vIGZhaWx1cmUuIElmIHRoZSBmaXJzdCBpcyB0aGUgY2FzZSAtIHRoZSBzZWFyY2ggd2lsbCBiZQotICAgIC8vIHJlcGVhdGVkLiBGb3Igbm93IC0gZnJlZSBhbGwgcmVzb3VyY2VzIGFjcXVpcmVkIHNvIGZhciBleGNlcHQKLSAgICAvLyBmb3IgdGhlIG5ldyBhbGxvY2F0ZWQgbm9kZXMKLSAgICB7Ci0JaW50IGk7Ci0KLQkvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KLQlpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgewotCSAgICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT50Yl9wYXRoKSA7Ci0JfSBlbHNlIHsKLQkgICAgcGF0aHJlbHNlIChwX3NfdGItPnRiX3BhdGgpOwotICAgICAgICB9CQotCS8qIGJyZWxzZSBhbGwgcmVzb3VyY2VzIGNvbGxlY3RlZCBmb3IgYmFsYW5jaW5nICovCi0JZm9yICggaSA9IDA7IGkgPCBNQVhfSEVJR0hUOyBpKysgKSB7Ci0JICAgIGlmICh3YWl0X3RiX2J1ZmZlcnNfcnVuKSB7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+TFtpXSk7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+UltpXSk7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkxbaV0pOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldKTsKLQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRkxbaV0pOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGUltpXSk7Ci0JICAgIH0KLQotCSAgICBicmVsc2UgKHBfc190Yi0+TFtpXSk7cF9zX3RiLT5MW2ldID0gTlVMTDsKLQkgICAgYnJlbHNlIChwX3NfdGItPlJbaV0pO3Bfc190Yi0+UltpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5GTFtpXSk7cF9zX3RiLT5GTFtpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5GUltpXSk7cF9zX3RiLT5GUltpXSA9IE5VTEw7Ci0JICAgIGJyZWxzZSAocF9zX3RiLT5DRkxbaV0pO3Bfc190Yi0+Q0ZMW2ldID0gTlVMTDsKLQkgICAgYnJlbHNlIChwX3NfdGItPkNGUltpXSk7cF9zX3RiLT5DRlJbaV0gPSBOVUxMOworCQl3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMTsKKwkJZ290byByZXBlYXQ7CiAJfQogCi0JaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKLQkgICAgZm9yICggaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKyApIHsgCi0JCWlmICggcF9zX3RiLT5GRUJbaV0gKSB7Ci0JCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCAKLQkJCQkJCSAgICAgcF9zX3RiLT5GRUJbaV0pIDsKKyAgICAgIHJlcGVhdDoKKwkvLyBmaXhfbm9kZXMgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGl0cyBjYWxjdWxhdGlvbiBkdWUgdG8KKwkvLyBmaWxlc3lzdGVtIGdvdCBjaGFuZ2VkIHVuZGVyIHVzLCBsYWNrIG9mIGZyZWUgZGlzayBzcGFjZSBvciBpL28KKwkvLyBmYWlsdXJlLiBJZiB0aGUgZmlyc3QgaXMgdGhlIGNhc2UgLSB0aGUgc2VhcmNoIHdpbGwgYmUKKwkvLyByZXBlYXRlZC4gRm9yIG5vdyAtIGZyZWUgYWxsIHJlc291cmNlcyBhY3F1aXJlZCBzbyBmYXIgZXhjZXB0CisJLy8gZm9yIHRoZSBuZXcgYWxsb2NhdGVkIG5vZGVzCisJeworCQlpbnQgaTsKKworCQkvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KKwkJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkJCXBhdGhyZWxzZV9hbmRfcmVzdG9yZShwX3NfdGItPnRiX3NiLCBwX3NfdGItPnRiX3BhdGgpOworCQl9IGVsc2UgeworCQkJcGF0aHJlbHNlKHBfc190Yi0+dGJfcGF0aCk7CiAJCX0KLQkgICAgfQorCQkvKiBicmVsc2UgYWxsIHJlc291cmNlcyBjb2xsZWN0ZWQgZm9yIGJhbGFuY2luZyAqLworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrKSB7CisJCQlpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgeworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPkxbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPlJbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPkZMW2ldKTsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLAorCQkJCQkJCQkgcF9zX3RiLT5GUltpXSk7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwKKwkJCQkJCQkJIHBfc190Yi0+CisJCQkJCQkJCSBDRkxbaV0pOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsCisJCQkJCQkJCSBwX3NfdGItPgorCQkJCQkJCQkgQ0ZSW2ldKTsKKwkJCX0KKworCQkJYnJlbHNlKHBfc190Yi0+TFtpXSk7CisJCQlwX3NfdGItPkxbaV0gPSBOVUxMOworCQkJYnJlbHNlKHBfc190Yi0+UltpXSk7CisJCQlwX3NfdGItPlJbaV0gPSBOVUxMOworCQkJYnJlbHNlKHBfc190Yi0+RkxbaV0pOworCQkJcF9zX3RiLT5GTFtpXSA9IE5VTEw7CisJCQlicmVsc2UocF9zX3RiLT5GUltpXSk7CisJCQlwX3NfdGItPkZSW2ldID0gTlVMTDsKKwkJCWJyZWxzZShwX3NfdGItPkNGTFtpXSk7CisJCQlwX3NfdGItPkNGTFtpXSA9IE5VTEw7CisJCQlicmVsc2UocF9zX3RiLT5DRlJbaV0pOworCQkJcF9zX3RiLT5DRlJbaV0gPSBOVUxMOworCQl9CisKKwkJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfRkVCX1NJWkU7IGkrKykgeworCQkJCWlmIChwX3NfdGItPkZFQltpXSkgeworCQkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcgorCQkJCQkgICAgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkVCW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG5fcmV0X3ZhbHVlOwogCX0KLQlyZXR1cm4gbl9yZXRfdmFsdWU7Ci0gICAgfQogCiB9CiAKLQogLyogQW5hdG9seSB3aWxsIHByb2JhYmx5IGZvcmdpdmUgbWUgcmVuYW1pbmcgcF9zX3RiIHRvIHRiLiBJIGp1c3QKICAgIHdhbnRlZCB0byBtYWtlIGxpbmVzIHNob3J0ZXIgKi8KLXZvaWQgdW5maXhfbm9kZXMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3ZvaWQgdW5maXhfbm9kZXMoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpCiB7Ci0gICAgaW50CWk7CisJaW50IGk7CiAKLSAgICAvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KLSAgICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUgKHRiLT50Yl9zYiwgdGItPnRiX3BhdGgpOworCS8qIFJlbGVhc2UgcGF0aCBidWZmZXJzLiAqLworCXBhdGhyZWxzZV9hbmRfcmVzdG9yZSh0Yi0+dGJfc2IsIHRiLT50Yl9wYXRoKTsKIAotICAgIC8qIGJyZWxzZSBhbGwgcmVzb3VyY2VzIGNvbGxlY3RlZCBmb3IgYmFsYW5jaW5nICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBNQVhfSEVJR0hUOyBpKysgKSB7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkxbaV0pOwotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5SW2ldKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+RkxbaV0pOwotCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5GUltpXSk7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkNGTFtpXSk7Ci0JcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkNGUltpXSk7CisJLyogYnJlbHNlIGFsbCByZXNvdXJjZXMgY29sbGVjdGVkIGZvciBiYWxhbmNpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrKSB7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkxbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5SW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIodGItPnRiX3NiLCB0Yi0+RkxbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcih0Yi0+dGJfc2IsIHRiLT5GUltpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkNGTFtpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHRiLT50Yl9zYiwgdGItPkNGUltpXSk7CiAKLQlicmVsc2UgKHRiLT5MW2ldKTsKLQlicmVsc2UgKHRiLT5SW2ldKTsKLQlicmVsc2UgKHRiLT5GTFtpXSk7Ci0JYnJlbHNlICh0Yi0+RlJbaV0pOwotCWJyZWxzZSAodGItPkNGTFtpXSk7Ci0JYnJlbHNlICh0Yi0+Q0ZSW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBkZWFsIHdpdGggbGlzdCBvZiBhbGxvY2F0ZWQgKHVzZWQgYW5kIHVudXNlZCkgbm9kZXMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSsrICkgewotCWlmICggdGItPkZFQltpXSApIHsKLQkgICAgYl9ibG9ja25yX3QgYmxvY2tuciAgPSB0Yi0+RkVCW2ldLT5iX2Jsb2NrbnIgOwotCSAgICAvKiBkZS1hbGxvY2F0ZWQgYmxvY2sgd2hpY2ggd2FzIG5vdCB1c2VkIGJ5IGJhbGFuY2luZyBhbmQKLSAgICAgICAgICAgICAgIGJmb3JnZXQgYWJvdXQgYnVmZmVyIGZvciBpdCAqLwotCSAgICBicmVsc2UgKHRiLT5GRUJbaV0pOwotCSAgICByZWlzZXJmc19mcmVlX2Jsb2NrICh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLCBibG9ja25yLCAwKTsKKwkJYnJlbHNlKHRiLT5MW2ldKTsKKwkJYnJlbHNlKHRiLT5SW2ldKTsKKwkJYnJlbHNlKHRiLT5GTFtpXSk7CisJCWJyZWxzZSh0Yi0+RlJbaV0pOworCQlicmVsc2UodGItPkNGTFtpXSk7CisJCWJyZWxzZSh0Yi0+Q0ZSW2ldKTsKIAl9Ci0JaWYgKHRiLT51c2VkW2ldKSB7Ci0JICAgIC8qIHJlbGVhc2UgdXNlZCBhcyBuZXcgbm9kZXMgaW5jbHVkaW5nIGEgbmV3IHJvb3QgKi8KLQkgICAgYnJlbHNlICh0Yi0+dXNlZFtpXSk7CisKKwkvKiBkZWFsIHdpdGggbGlzdCBvZiBhbGxvY2F0ZWQgKHVzZWQgYW5kIHVudXNlZCkgbm9kZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpKyspIHsKKwkJaWYgKHRiLT5GRUJbaV0pIHsKKwkJCWJfYmxvY2tucl90IGJsb2NrbnIgPSB0Yi0+RkVCW2ldLT5iX2Jsb2NrbnI7CisJCQkvKiBkZS1hbGxvY2F0ZWQgYmxvY2sgd2hpY2ggd2FzIG5vdCB1c2VkIGJ5IGJhbGFuY2luZyBhbmQKKwkJCSAgIGJmb3JnZXQgYWJvdXQgYnVmZmVyIGZvciBpdCAqLworCQkJYnJlbHNlKHRiLT5GRUJbaV0pOworCQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0Yi0+dHJhbnNhY3Rpb25faGFuZGxlLCBOVUxMLAorCQkJCQkgICAgYmxvY2tuciwgMCk7CisJCX0KKwkJaWYgKHRiLT51c2VkW2ldKSB7CisJCQkvKiByZWxlYXNlIHVzZWQgYXMgbmV3IG5vZGVzIGluY2x1ZGluZyBhIG5ldyByb290ICovCisJCQlicmVsc2UodGItPnVzZWRbaV0pOworCQl9CiAJfQotICAgIH0KIAotICAgIGlmICh0Yi0+dm5fYnVmKSAKLSAgICByZWlzZXJmc19rZnJlZSAodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOworCWlmICh0Yi0+dm5fYnVmKQorCQlyZWlzZXJmc19rZnJlZSh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7CiAKLX0gCi0KLQotCit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9oYXNoZXMuYyBiL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCmluZGV4IDA4ZDA1MDguLjM3YzEzMDYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCisrKyBiL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogCi0KICNkZWZpbmUgREVMVEEgMHg5RTM3NzlCOQogI2RlZmluZSBGVUxMUk9VTkRTIDEwCQkvKiAzMiBpcyBvdmVya2lsbCwgMTYgaXMgc3Ryb25nIGNyeXB0byAqLwogI2RlZmluZSBQQVJUUk9VTkRTIDYJCS8qIDYgZ2V0cyBjb21wbGV0ZSBtaXhpbmcgKi8KQEAgLTQ4LDEwNSArNDcsNzUgQEAKIAkJaDEgKz0gYjE7CQkJCQkJXAogCX0gd2hpbGUoMCkKIAotCiB1MzIga2V5ZWRfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQogewotCXUzMiBrW10gPSB7IDB4OTQ2NGE0ODUsIDB4NTQyZTFhOTQsIDB4M2U4NDZiZmYsIDB4Yjc1YmNmYzN9OyAKKwl1MzIga1tdID0geyAweDk0NjRhNDg1LCAweDU0MmUxYTk0LCAweDNlODQ2YmZmLCAweGI3NWJjZmMzIH07CiAKIAl1MzIgaDAgPSBrWzBdLCBoMSA9IGtbMV07CiAJdTMyIGEsIGIsIGMsIGQ7CiAJdTMyIHBhZDsKIAlpbnQgaTsKLSAKLQkvLwlhc3NlcnQobGVuID49IDAgJiYgbGVuIDwgMjU2KTsKIAotCXBhZCA9ICh1MzIpbGVuIHwgKCh1MzIpbGVuIDw8IDgpOworCS8vICAgICAgYXNzZXJ0KGxlbiA+PSAwICYmIGxlbiA8IDI1Nik7CisKKwlwYWQgPSAodTMyKSBsZW4gfCAoKHUzMikgbGVuIDw8IDgpOwogCXBhZCB8PSBwYWQgPDwgMTY7CiAKLQl3aGlsZShsZW4gPj0gMTYpCi0JewotCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OwotCQliID0gKHUzMiltc2dbIDRdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDVdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDZdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDddIDw8IDI0OwotCQljID0gKHUzMiltc2dbIDhdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDldIDw8IDggfAotCQkgICAgKHUzMiltc2dbMTBdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbMTFdIDw8IDI0OwotCQlkID0gKHUzMiltc2dbMTJdICAgICAgfAotCQkgICAgKHUzMiltc2dbMTNdIDw8IDggfAotCQkgICAgKHUzMiltc2dbMTRdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbMTVdIDw8IDI0OwotCQkKKwl3aGlsZSAobGVuID49IDE2KSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CisJCWIgPSAodTMyKSBtc2dbNF0gfAorCQkgICAgKHUzMikgbXNnWzVdIDw8IDggfCAodTMyKSBtc2dbNl0gPDwgMTYgfCAodTMyKSBtc2dbN10gPDwgMjQ7CisJCWMgPSAodTMyKSBtc2dbOF0gfAorCQkgICAgKHUzMikgbXNnWzldIDw8IDggfAorCQkgICAgKHUzMikgbXNnWzEwXSA8PCAxNiB8ICh1MzIpIG1zZ1sxMV0gPDwgMjQ7CisJCWQgPSAodTMyKSBtc2dbMTJdIHwKKwkJICAgICh1MzIpIG1zZ1sxM10gPDwgOCB8CisJCSAgICAodTMyKSBtc2dbMTRdIDw8IDE2IHwgKHUzMikgbXNnWzE1XSA8PCAyNDsKKwogCQlURUFDT1JFKFBBUlRST1VORFMpOwogCiAJCWxlbiAtPSAxNjsKIAkJbXNnICs9IDE2OwogCX0KIAotCWlmIChsZW4gPj0gMTIpCi0JewotCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OwotCQliID0gKHUzMiltc2dbIDRdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDVdIDw8IDggfAotCQkgICAgKHUzMiltc2dbIDZdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbIDddIDw8IDI0OwotCQljID0gKHUzMiltc2dbIDhdICAgICAgfAotCQkgICAgKHUzMiltc2dbIDldIDw8IDggfAotCQkgICAgKHUzMiltc2dbMTBdIDw8IDE2fAotCQkgICAgKHUzMiltc2dbMTFdIDw8IDI0OworCWlmIChsZW4gPj0gMTIpIHsKKwkJYSA9ICh1MzIpIG1zZ1swXSB8CisJCSAgICAodTMyKSBtc2dbMV0gPDwgOCB8ICh1MzIpIG1zZ1syXSA8PCAxNiB8ICh1MzIpIG1zZ1szXSA8PCAyNDsKKwkJYiA9ICh1MzIpIG1zZ1s0XSB8CisJCSAgICAodTMyKSBtc2dbNV0gPDwgOCB8ICh1MzIpIG1zZ1s2XSA8PCAxNiB8ICh1MzIpIG1zZ1s3XSA8PCAyNDsKKwkJYyA9ICh1MzIpIG1zZ1s4XSB8CisJCSAgICAodTMyKSBtc2dbOV0gPDwgOCB8CisJCSAgICAodTMyKSBtc2dbMTBdIDw8IDE2IHwgKHUzMikgbXNnWzExXSA8PCAyNDsKIAogCQlkID0gcGFkOwotCQlmb3IoaSA9IDEyOyBpIDwgbGVuOyBpKyspCi0JCXsKKwkJZm9yIChpID0gMTI7IGkgPCBsZW47IGkrKykgewogCQkJZCA8PD0gODsKIAkJCWQgfD0gbXNnW2ldOwogCQl9Ci0JfQotCWVsc2UgaWYgKGxlbiA+PSA4KQotCXsKLQkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKLQkJYiA9ICh1MzIpbXNnWyA0XSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyA1XSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyA2XSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyA3XSA8PCAyNDsKKwl9IGVsc2UgaWYgKGxlbiA+PSA4KSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CisJCWIgPSAodTMyKSBtc2dbNF0gfAorCQkgICAgKHUzMikgbXNnWzVdIDw8IDggfCAodTMyKSBtc2dbNl0gPDwgMTYgfCAodTMyKSBtc2dbN10gPDwgMjQ7CiAKIAkJYyA9IGQgPSBwYWQ7Ci0JCWZvcihpID0gODsgaSA8IGxlbjsgaSsrKQotCQl7CisJCWZvciAoaSA9IDg7IGkgPCBsZW47IGkrKykgewogCQkJYyA8PD0gODsKIAkJCWMgfD0gbXNnW2ldOwogCQl9Ci0JfQotCWVsc2UgaWYgKGxlbiA+PSA0KQotCXsKLQkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKLQkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKLQkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKLQkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKKwl9IGVsc2UgaWYgKGxlbiA+PSA0KSB7CisJCWEgPSAodTMyKSBtc2dbMF0gfAorCQkgICAgKHUzMikgbXNnWzFdIDw8IDggfCAodTMyKSBtc2dbMl0gPDwgMTYgfCAodTMyKSBtc2dbM10gPDwgMjQ7CiAKIAkJYiA9IGMgPSBkID0gcGFkOwotCQlmb3IoaSA9IDQ7IGkgPCBsZW47IGkrKykKLQkJeworCQlmb3IgKGkgPSA0OyBpIDwgbGVuOyBpKyspIHsKIAkJCWIgPDw9IDg7CiAJCQliIHw9IG1zZ1tpXTsKIAkJfQotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCWEgPSBiID0gYyA9IGQgPSBwYWQ7Ci0JCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQotCQl7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQkJYSA8PD0gODsKIAkJCWEgfD0gbXNnW2ldOwogCQl9CkBAIC0xNTUsNTUgKzEyNCw1OSBAQAogCVRFQUNPUkUoRlVMTFJPVU5EUyk7CiAKIC8qCXJldHVybiAwOyovCi0JcmV0dXJuIGgwXmgxOworCXJldHVybiBoMCBeIGgxOwogfQogCiAvKiBXaGF0IGZvbGxvd3MgaW4gdGhpcyBmaWxlIGlzIGNvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBhbmQgdGhlCiAgKiBsaWNlbnNpbmcgb2Ygd2hhdCBmb2xsb3dzIGlzIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRSAqLwogCi11MzIgeXVyYV9oYXNoIChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQordTMyIHl1cmFfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQogewotICAgIGludCBqLCBwb3c7Ci0gICAgdTMyIGEsIGM7Ci0gICAgaW50IGk7Ci0gICAgCi0gICAgZm9yIChwb3c9MSxpPTE7IGkgPCBsZW47IGkrKykgcG93ID0gcG93ICogMTA7IAotICAgIAotICAgIGlmIChsZW4gPT0gMSkgCi0JYSA9IG1zZ1swXS00ODsKLSAgICBlbHNlCi0JYSA9IChtc2dbMF0gLSA0OCkgKiBwb3c7Ci0gICAgCi0gICAgZm9yIChpPTE7IGkgPCBsZW47IGkrKykgewotCWMgPSBtc2dbaV0gLSA0ODsgCi0JZm9yIChwb3c9MSxqPWk7IGogPCBsZW4tMTsgaisrKSBwb3cgPSBwb3cgKiAxMDsgCi0JYSA9IGEgKyBjICogcG93OwotICAgIH0KLSAgICAKLSAgICBmb3IgKDsgaSA8IDQwOyBpKyspIHsKLQljID0gJzAnIC0gNDg7IAotCWZvciAocG93PTEsaj1pOyBqIDwgbGVuLTE7IGorKykgcG93ID0gcG93ICogMTA7IAotCWEgPSBhICsgYyAqIHBvdzsKLSAgICB9Ci0gICAgCi0gICAgZm9yICg7IGkgPCAyNTY7IGkrKykgewotCWMgPSBpOyAKLQlmb3IgKHBvdz0xLGo9aTsgaiA8IGxlbi0xOyBqKyspIHBvdyA9IHBvdyAqIDEwOyAKLQlhID0gYSArIGMgKiBwb3c7Ci0gICAgfQotICAgIAotICAgIGEgPSBhIDw8IDc7Ci0gICAgcmV0dXJuIGE7CisJaW50IGosIHBvdzsKKwl1MzIgYSwgYzsKKwlpbnQgaTsKKworCWZvciAocG93ID0gMSwgaSA9IDE7IGkgPCBsZW47IGkrKykKKwkJcG93ID0gcG93ICogMTA7CisKKwlpZiAobGVuID09IDEpCisJCWEgPSBtc2dbMF0gLSA0ODsKKwllbHNlCisJCWEgPSAobXNnWzBdIC0gNDgpICogcG93OworCisJZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisJCWMgPSBtc2dbaV0gLSA0ODsKKwkJZm9yIChwb3cgPSAxLCBqID0gaTsgaiA8IGxlbiAtIDE7IGorKykKKwkJCXBvdyA9IHBvdyAqIDEwOworCQlhID0gYSArIGMgKiBwb3c7CisJfQorCisJZm9yICg7IGkgPCA0MDsgaSsrKSB7CisJCWMgPSAnMCcgLSA0ODsKKwkJZm9yIChwb3cgPSAxLCBqID0gaTsgaiA8IGxlbiAtIDE7IGorKykKKwkJCXBvdyA9IHBvdyAqIDEwOworCQlhID0gYSArIGMgKiBwb3c7CisJfQorCisJZm9yICg7IGkgPCAyNTY7IGkrKykgeworCQljID0gaTsKKwkJZm9yIChwb3cgPSAxLCBqID0gaTsgaiA8IGxlbiAtIDE7IGorKykKKwkJCXBvdyA9IHBvdyAqIDEwOworCQlhID0gYSArIGMgKiBwb3c7CisJfQorCisJYSA9IGEgPDwgNzsKKwlyZXR1cm4gYTsKIH0KIAotdTMyIHI1X2hhc2ggKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pCit1MzIgcjVfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQogewotICB1MzIgYT0wOwotICB3aGlsZSgqbXNnKSB7IAotICAgIGEgKz0gKm1zZyA8PCA0OwotICAgIGEgKz0gKm1zZyA+PiA0OwotICAgIGEgKj0gMTE7Ci0gICAgbXNnKys7Ci0gICB9IAotICByZXR1cm4gYTsKKwl1MzIgYSA9IDA7CisJd2hpbGUgKCptc2cpIHsKKwkJYSArPSAqbXNnIDw8IDQ7CisJCWEgKz0gKm1zZyA+PiA0OworCQlhICo9IDExOworCQltc2crKzsKKwl9CisJcmV0dXJuIGE7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pYmFsYW5jZS5jIGIvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYwppbmRleCBhMzYyMTI1Li42YzVhNzI2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pYmFsYW5jZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2liYWxhbmNlLmMKQEAgLTEwLDEzICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIAogLyogdGhpcyBpcyBvbmUgYW5kIG9ubHkgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIG91dHNpZGUgKGRvX2JhbGFuY2UuYykgKi8KLWludAliYWxhbmNlX2ludGVybmFsICgKLQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqICwKLQkJCSAgaW50LAotCQkJICBpbnQsCi0JCQkgIHN0cnVjdCBpdGVtX2hlYWQgKiAsCi0JCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiAKLQkJCSAgKTsKK2ludCBiYWxhbmNlX2ludGVybmFsKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiwKKwkJICAgICBpbnQsIGludCwgc3RydWN0IGl0ZW1faGVhZCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwogCiAvKiBtb2RlcyBvZiBpbnRlcm5hbF9zaGlmdF9sZWZ0LCBpbnRlcm5hbF9zaGlmdF9yaWdodCBhbmQgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAqLwogI2RlZmluZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCAwCkBAIC0yNyw0NjQgKzIyLDQ3NCBAQAogI2RlZmluZSBJTlRFUk5BTF9JTlNFUlRfVE9fTCA1CiAjZGVmaW5lIElOVEVSTkFMX0lOU0VSVF9UT19SIDYKIAotc3RhdGljIHZvaWQJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zICgKLQkJCQkJCWludCBzaGlmdF9tb2RlLAotCQkJCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJCQkJaW50IGgsCi0JCQkJCQlzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLAotCQkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogc3JjX2JpLAotCQkJCQkJaW50ICogZF9rZXksCi0JCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogY2YKLQkJCQkJCSkKK3N0YXRpYyB2b2lkIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyhpbnQgc2hpZnRfbW9kZSwKKwkJCQkJICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJCSAgIGludCBoLAorCQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJCSAgIHN0cnVjdCBidWZmZXJfaW5mbyAqc3JjX2JpLAorCQkJCQkgICBpbnQgKmRfa2V5LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipjZikKIHsKLSAgICBtZW1zZXQgKGRlc3RfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7Ci0gICAgbWVtc2V0IChzcmNfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7Ci0gICAgLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MW2hdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JKmRfa2V5ID0gdGItPmxrZXlbaF07Ci0JKmNmID0gdGItPkNGTFtoXTsKLQlicmVhazsKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fTF9UT19TOgotCXNyY19iaS0+dGIgPSB0YjsKLQlzcmNfYmktPmJpX2JoID0gdGItPkxbaF07Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07Ci0Jc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsgLyogZGVzdCBwb3NpdGlvbiBpcyBhbmFsb2cgb2YgZGVzdC0+Yl9pdGVtX29yZGVyICovCi0JKmRfa2V5ID0gdGItPmxrZXlbaF07Ci0JKmNmID0gdGItPkNGTFtoXTsKLQlicmVhazsKLSAgICAgIAotICAgIGNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1M6CS8qIHVzZWQgaW4gaW50ZXJuYWxfc2hpZnRfbGVmdCAqLwotCXNyY19iaS0+dGIgPSB0YjsKLQlzcmNfYmktPmJpX2JoID0gdGItPlJbaF07Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07Ci0Jc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JKmRfa2V5ID0gdGItPnJrZXlbaF07Ci0JKmNmID0gdGItPkNGUltoXTsKLQlicmVhazsKKwltZW1zZXQoZGVzdF9iaSwgMCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaW5mbykpOworCW1lbXNldChzcmNfYmksIDAsIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2luZm8pKTsKKwkvKiBkZWZpbmUgZGVzdCwgc3JjLCBkZXN0IHBhcmVudCwgZGVzdCBwb3NpdGlvbiAqLworCXN3aXRjaCAoc2hpZnRfbW9kZSkgeworCWNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0w6CS8qIHVzZWQgaW4gaW50ZXJuYWxfc2hpZnRfbGVmdCAqLworCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPkxbaF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCSpkX2tleSA9IHRiLT5sa2V5W2hdOworCQkqY2YgPSB0Yi0+Q0ZMW2hdOworCQlicmVhazsKKwljYXNlIElOVEVSTkFMX1NISUZUX0ZST01fTF9UT19TOgorCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSB0Yi0+TFtoXTsKKwkJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07CisJCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CS8qIGRlc3QgcG9zaXRpb24gaXMgYW5hbG9nIG9mIGRlc3QtPmJfaXRlbV9vcmRlciAqLworCQkqZF9rZXkgPSB0Yi0+bGtleVtoXTsKKwkJKmNmID0gdGItPkNGTFtoXTsKKwkJYnJlYWs7CiAKLSAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SOgotCXNyY19iaS0+dGIgPSB0YjsKLQlzcmNfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0Jc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JKmRfa2V5ID0gdGItPnJrZXlbaF07Ci0JKmNmID0gdGItPkNGUltoXTsKLQlicmVhazsKKwljYXNlIElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gdGItPlJbaF07CisJCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKKwkJKmRfa2V5ID0gdGItPnJrZXlbaF07CisJCSpjZiA9IHRiLT5DRlJbaF07CisJCWJyZWFrOwogCi0gICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fTDoKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPkxbaF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQlicmVhazsKLQkKLSAgICBjYXNlIElOVEVSTkFMX0lOU0VSVF9UT19TOgotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JYnJlYWs7CisJY2FzZSBJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUjoKKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SW2hdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJKmRfa2V5ID0gdGItPnJrZXlbaF07CisJCSpjZiA9IHRiLT5DRlJbaF07CisJCWJyZWFrOwogCi0gICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUjoKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbaF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JYnJlYWs7CisJY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fTDoKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFtoXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJYnJlYWs7CiAKLSAgICBkZWZhdWx0OgotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7Ci0gICAgfQorCWNhc2UgSU5URVJOQUxfSU5TRVJUX1RPX1M6CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgaCk7CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJCWJyZWFrOworCisJY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fUjoKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+UltoXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSW2hdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfcGFuaWModGItPnRiX3NiLAorCQkJICAgICAgICJpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwKKwkJCSAgICAgICBzaGlmdF9tb2RlKTsKKwl9CiB9CiAKLQotCiAvKiBJbnNlcnQgY291bnQgbm9kZSBwb2ludGVycyBpbnRvIGJ1ZmZlciBjdXIgYmVmb3JlIHBvc2l0aW9uIHRvICsgMS4KICAqIEluc2VydCBjb3VudCBpdGVtcyBpbnRvIGJ1ZmZlciBjdXIgYmVmb3JlIHBvc2l0aW9uIHRvLgogICogSXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgYXJlIHNwZWNpZmllZCBieSBpbnNlcnRlZCBhbmQgYmggcmVzcGVjdGl2ZWx5LgotICovIAotc3RhdGljIHZvaWQgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLAotCQkJCSAgICBpbnQgdG8sIGludCBjb3VudCwKLQkJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkLAotCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgKLSAgICApCisgKi8KK3N0YXRpYyB2b2lkIGludGVybmFsX2luc2VydF9jaGlsZHMoc3RydWN0IGJ1ZmZlcl9pbmZvICpjdXJfYmksCisJCQkJICAgaW50IHRvLCBpbnQgY291bnQsCisJCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWQsCisJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY3VyID0gY3VyX2JpLT5iaV9iaDsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgaW50IG5yOwotICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBpaDsKLSAgICBzdHJ1Y3QgZGlza19jaGlsZCBuZXdfZGNbMl07Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKLSAgICBpbnQgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmN1ciA9IGN1cl9iaS0+YmlfYmg7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJaW50IG5yOworCXN0cnVjdCByZWlzZXJmc19rZXkgKmloOworCXN0cnVjdCBkaXNrX2NoaWxkIG5ld19kY1syXTsKKwlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CisJaW50IGk7CiAKLSAgICBpZiAoY291bnQgPD0gMCkKLQlyZXR1cm47CisJaWYgKGNvdW50IDw9IDApCisJCXJldHVybjsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGN1cik7Ci0gICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoY3VyKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKIAotICAgIFJGQUxTRSggY291bnQgPiAyLAotCSAgICAidG9vIG1hbnkgY2hpbGRyZW4gKCVkKSBhcmUgdG8gYmUgaW5zZXJ0ZWQiLCBjb3VudCk7Ci0gICAgUkZBTFNFKCBCX0ZSRUVfU1BBQ0UgKGN1cikgPCBjb3VudCAqIChLRVlfU0laRSArIERDX1NJWkUpLAotCSAgICAibm8gZW5vdWdoIGZyZWUgc3BhY2UgKCVkKSwgbmVlZGVkICVkIGJ5dGVzIiwgCi0JICAgIEJfRlJFRV9TUEFDRSAoY3VyKSwgY291bnQgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CisJUkZBTFNFKGNvdW50ID4gMiwgInRvbyBtYW55IGNoaWxkcmVuICglZCkgYXJlIHRvIGJlIGluc2VydGVkIiwgY291bnQpOworCVJGQUxTRShCX0ZSRUVfU1BBQ0UoY3VyKSA8IGNvdW50ICogKEtFWV9TSVpFICsgRENfU0laRSksCisJICAgICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpLCBuZWVkZWQgJWQgYnl0ZXMiLAorCSAgICAgICBCX0ZSRUVfU1BBQ0UoY3VyKSwgY291bnQgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBjb3VudCBkaXNrX2NoaWxkICovCi0gICAgZGMgPSBCX05fQ0hJTEQoY3VyLHRvKzEpOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIGNvdW50IGRpc2tfY2hpbGQgKi8KKwlkYyA9IEJfTl9DSElMRChjdXIsIHRvICsgMSk7CiAKLSAgICBtZW1tb3ZlIChkYyArIGNvdW50LCBkYywgKG5yKzEtKHRvKzEpKSAqIERDX1NJWkUpOworCW1lbW1vdmUoZGMgKyBjb3VudCwgZGMsIChuciArIDEgLSAodG8gKyAxKSkgKiBEQ19TSVpFKTsKIAotICAgIC8qIGNvcHkgdG9fYmVfaW5zZXJ0IGRpc2sgY2hpbGRyZW4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLQlwdXRfZGNfc2l6ZSggJihuZXdfZGNbaV0pLCBNQVhfQ0hJTERfU0laRShiaFtpXSkgLSBCX0ZSRUVfU1BBQ0UoYmhbaV0pKTsKLQlwdXRfZGNfYmxvY2tfbnVtYmVyKCAmKG5ld19kY1tpXSksIGJoW2ldLT5iX2Jsb2NrbnIgKTsKLSAgICB9Ci0gICAgbWVtY3B5IChkYywgbmV3X2RjLCBEQ19TSVpFICogY291bnQpOworCS8qIGNvcHkgdG9fYmVfaW5zZXJ0IGRpc2sgY2hpbGRyZW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwdXRfZGNfc2l6ZSgmKG5ld19kY1tpXSksCisJCQkgICAgTUFYX0NISUxEX1NJWkUoYmhbaV0pIC0gQl9GUkVFX1NQQUNFKGJoW2ldKSk7CisJCXB1dF9kY19ibG9ja19udW1iZXIoJihuZXdfZGNbaV0pLCBiaFtpXS0+Yl9ibG9ja25yKTsKKwl9CisJbWVtY3B5KGRjLCBuZXdfZGMsIERDX1NJWkUgKiBjb3VudCk7CiAKLSAgCi0gICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY291bnQgaXRlbXMgICovCi0gICAgaWggPSBCX05fUERFTElNX0tFWSAoY3VyLCAoKHRvID09IC0xKSA/IDAgOiB0bykpOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIGNvdW50IGl0ZW1zICAqLworCWloID0gQl9OX1BERUxJTV9LRVkoY3VyLCAoKHRvID09IC0xKSA/IDAgOiB0bykpOwogCi0gICAgbWVtbW92ZSAoaWggKyBjb3VudCwgaWgsIChuciAtIHRvKSAqIEtFWV9TSVpFICsgKG5yICsgMSArIGNvdW50KSAqIERDX1NJWkUpOworCW1lbW1vdmUoaWggKyBjb3VudCwgaWgsCisJCShuciAtIHRvKSAqIEtFWV9TSVpFICsgKG5yICsgMSArIGNvdW50KSAqIERDX1NJWkUpOwogCi0gICAgLyogY29weSBpdGVtIGhlYWRlcnMgKGtleXMpICovCi0gICAgbWVtY3B5IChpaCwgaW5zZXJ0ZWQsIEtFWV9TSVpFKTsKLSAgICBpZiAoIGNvdW50ID4gMSApCi0JbWVtY3B5IChpaCArIDEsIGluc2VydGVkICsgMSwgS0VZX1NJWkUpOworCS8qIGNvcHkgaXRlbSBoZWFkZXJzIChrZXlzKSAqLworCW1lbWNweShpaCwgaW5zZXJ0ZWQsIEtFWV9TSVpFKTsKKwlpZiAoY291bnQgPiAxKQorCQltZW1jcHkoaWggKyAxLCBpbnNlcnRlZCArIDEsIEtFWV9TSVpFKTsKIAotICAgIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLwotICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIGNvdW50ICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIGNvdW50ICogKERDX1NJWkUgKyBLRVlfU0laRSApICk7CisJLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyBjb3VudCk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIGNvdW50ICogKERDX1NJWkUgKworCQkJCQkJCSAgICAgS0VZX1NJWkUpKTsKIAotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyLDApOworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXIsIDApOwogCi0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIGNoZWNrX2ludGVybmFsIChjdXIpOwotICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCWNoZWNrX2ludGVybmFsKGN1cik7CisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KIAotICAgIGlmIChjdXJfYmktPmJpX3BhcmVudCkgewotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChjdXJfYmktPmJpX3BhcmVudCxjdXJfYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChjb3VudCAqIChEQ19TSVpFICsgS0VZX1NJWkUpKSk7Ci0JZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LCAwKTsKKwlpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPQorCQkgICAgQl9OX0NISUxEKGN1cl9iaS0+YmlfcGFyZW50LCBjdXJfYmktPmJpX3Bvc2l0aW9uKTsKKwkJcHV0X2RjX3NpemUodF9kYywKKwkJCSAgICBkY19zaXplKHRfZGMpICsgKGNvdW50ICogKERDX1NJWkUgKyBLRVlfU0laRSkpKTsKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGN1cl9iaS0+dGIsIGN1cl9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CiAKLQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0JY2hlY2tfaW50ZXJuYWwgKGN1cl9iaS0+YmlfcGFyZW50KTsKLQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovICAgCi0gICAgfQorCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQljaGVja19pbnRlcm5hbChjdXJfYmktPmJpX3BhcmVudCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJfQogCiB9CiAKLQogLyogRGVsZXRlIGRlbF9udW0gaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgY3VyIHN0YXJ0aW5nIGZyb20gKgogICogdGhlIGZpcnN0X2kndGggaXRlbSBhbmQgZmlyc3RfcCd0aCBwb2ludGVycyByZXNwZWN0aXZlbHkuCQkqLwotc3RhdGljIHZvaWQJaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zICgKLQkJCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIGN1cl9iaSwKLQkJCQkJCWludCBmaXJzdF9wLCAKLQkJCQkJCWludCBmaXJzdF9pLCAKLQkJCQkJCWludCBkZWxfbnVtCi0JCQkJCQkpCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpjdXJfYmksCisJCQkJCSAgIGludCBmaXJzdF9wLAorCQkJCQkgICBpbnQgZmlyc3RfaSwgaW50IGRlbF9udW0pCiB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGN1ciA9IGN1cl9iaS0+YmlfYmg7Ci0gIGludCBucjsKLSAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY3VyID0gY3VyX2JpLT5iaV9iaDsKKwlpbnQgbnI7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OworCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKIAotICBSRkFMU0UoIGN1ciA9PSBOVUxMLCAiYnVmZmVyIGlzIDAiKTsKLSAgUkZBTFNFKCBkZWxfbnVtIDwgMCwKLSAgICAgICAgICAibmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zICglZCkgY2FuIG5vdCBiZSBkZWxldGVkIiwgZGVsX251bSk7Ci0gIFJGQUxTRSggZmlyc3RfcCA8IDAgfHwgZmlyc3RfcCArIGRlbF9udW0gPiBCX05SX0lURU1TIChjdXIpICsgMSB8fCBmaXJzdF9pIDwgMCwKLSAgICAgICAgICAiZmlyc3QgcG9pbnRlciBvcmRlciAoJWQpIDwgMCBvciAiCi0gICAgICAgICAgIm5vIHNvIG1hbnkgcG9pbnRlcnMgKCVkKSwgb25seSAoJWQpIG9yICIKLSAgICAgICAgICAiZmlyc3Qga2V5IG9yZGVyICVkIDwgMCIsIGZpcnN0X3AsIAotICAgICAgICAgIGZpcnN0X3AgKyBkZWxfbnVtLCBCX05SX0lURU1TIChjdXIpICsgMSwgZmlyc3RfaSk7Ci0gIGlmICggZGVsX251bSA9PSAwICkKLSAgICByZXR1cm47CisJUkZBTFNFKGN1ciA9PSBOVUxMLCAiYnVmZmVyIGlzIDAiKTsKKwlSRkFMU0UoZGVsX251bSA8IDAsCisJICAgICAgICJuZWdhdGl2ZSBudW1iZXIgb2YgaXRlbXMgKCVkKSBjYW4gbm90IGJlIGRlbGV0ZWQiLCBkZWxfbnVtKTsKKwlSRkFMU0UoZmlyc3RfcCA8IDAgfHwgZmlyc3RfcCArIGRlbF9udW0gPiBCX05SX0lURU1TKGN1cikgKyAxCisJICAgICAgIHx8IGZpcnN0X2kgPCAwLAorCSAgICAgICAiZmlyc3QgcG9pbnRlciBvcmRlciAoJWQpIDwgMCBvciAiCisJICAgICAgICJubyBzbyBtYW55IHBvaW50ZXJzICglZCksIG9ubHkgKCVkKSBvciAiCisJICAgICAgICJmaXJzdCBrZXkgb3JkZXIgJWQgPCAwIiwgZmlyc3RfcCwgZmlyc3RfcCArIGRlbF9udW0sCisJICAgICAgIEJfTlJfSVRFTVMoY3VyKSArIDEsIGZpcnN0X2kpOworCWlmIChkZWxfbnVtID09IDApCisJCXJldHVybjsKIAotICBibGtoID0gQl9CTEtfSEVBRChjdXIpOwotICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlibGtoID0gQl9CTEtfSEVBRChjdXIpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gIGlmICggZmlyc3RfcCA9PSAwICYmIGRlbF9udW0gPT0gbnIgKyAxICkgewotICAgIFJGQUxTRSggZmlyc3RfaSAhPSAwLCAiMXN0IGRlbGV0ZWQga2V5IG11c3QgaGF2ZSBvcmRlciAwLCBub3QgJWQiLCBmaXJzdF9pKTsKLSAgICBtYWtlX2VtcHR5X25vZGUgKGN1cl9iaSk7Ci0gICAgcmV0dXJuOwotICB9CisJaWYgKGZpcnN0X3AgPT0gMCAmJiBkZWxfbnVtID09IG5yICsgMSkgeworCQlSRkFMU0UoZmlyc3RfaSAhPSAwLAorCQkgICAgICAgIjFzdCBkZWxldGVkIGtleSBtdXN0IGhhdmUgb3JkZXIgMCwgbm90ICVkIiwgZmlyc3RfaSk7CisJCW1ha2VfZW1wdHlfbm9kZShjdXJfYmkpOworCQlyZXR1cm47CisJfQogCi0gIFJGQUxTRSggZmlyc3RfaSArIGRlbF9udW0gPiBCX05SX0lURU1TIChjdXIpLAotICAgICAgICAgICJmaXJzdF9pID0gJWQgZGVsX251bSA9ICVkICIKLSAgICAgICAgICAibm8gc28gbWFueSBrZXlzICglZCkgaW4gdGhlIG5vZGUgKCViKSgleikiLAotICAgICAgICAgIGZpcnN0X2ksIGRlbF9udW0sIGZpcnN0X2kgKyBkZWxfbnVtLCBjdXIsIGN1cik7CisJUkZBTFNFKGZpcnN0X2kgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyhjdXIpLAorCSAgICAgICAiZmlyc3RfaSA9ICVkIGRlbF9udW0gPSAlZCAiCisJICAgICAgICJubyBzbyBtYW55IGtleXMgKCVkKSBpbiB0aGUgbm9kZSAoJWIpKCV6KSIsCisJICAgICAgIGZpcnN0X2ksIGRlbF9udW0sIGZpcnN0X2kgKyBkZWxfbnVtLCBjdXIsIGN1cik7CiAKKwkvKiBkZWxldGluZyAqLworCWRjID0gQl9OX0NISUxEKGN1ciwgZmlyc3RfcCk7CiAKLSAgLyogZGVsZXRpbmcgKi8KLSAgZGMgPSBCX05fQ0hJTEQgKGN1ciwgZmlyc3RfcCk7CisJbWVtbW92ZShkYywgZGMgKyBkZWxfbnVtLCAobnIgKyAxIC0gZmlyc3RfcCAtIGRlbF9udW0pICogRENfU0laRSk7CisJa2V5ID0gQl9OX1BERUxJTV9LRVkoY3VyLCBmaXJzdF9pKTsKKwltZW1tb3ZlKGtleSwga2V5ICsgZGVsX251bSwKKwkJKG5yIC0gZmlyc3RfaSAtIGRlbF9udW0pICogS0VZX1NJWkUgKyAobnIgKyAxIC0KKwkJCQkJCSAgICAgICBkZWxfbnVtKSAqIERDX1NJWkUpOwogCi0gIG1lbW1vdmUgKGRjLCBkYyArIGRlbF9udW0sIChuciArIDEgLSBmaXJzdF9wIC0gZGVsX251bSkgKiBEQ19TSVpFKTsKLSAga2V5ID0gQl9OX1BERUxJTV9LRVkgKGN1ciwgZmlyc3RfaSk7Ci0gIG1lbW1vdmUgKGtleSwga2V5ICsgZGVsX251bSwgKG5yIC0gZmlyc3RfaSAtIGRlbF9udW0pICogS0VZX1NJWkUgKyAobnIgKyAxIC0gZGVsX251bSkgKiBEQ19TSVpFKTsKKwkvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKwlzZXRfYmxraF9ucl9pdGVtKGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSAtIGRlbF9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwKKwkJCSAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKworCQkJICAgIChkZWxfbnVtICogKEtFWV9TSVpFICsgRENfU0laRSkpKTsKIAorCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXIsIDApOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKwljaGVja19pbnRlcm5hbChjdXIpOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KIAotICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KLSAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpIC0gZGVsX251bSApOwotICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLAotICAgICAgICAgICAgICAgICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpICkgKTsKKwlpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisJCXRfZGMgPSBCX05fQ0hJTEQoY3VyX2JpLT5iaV9wYXJlbnQsIGN1cl9iaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgLSAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpKSk7CiAKLSAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChjdXJfYmktPnRiLCBjdXIsIDApOwotICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgY2hlY2tfaW50ZXJuYWwgKGN1cik7Ci0gIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotIAotICBpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKLSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLSAgICB0X2RjID0gQl9OX0NISUxEIChjdXJfYmktPmJpX3BhcmVudCwgY3VyX2JpLT5iaV9wb3NpdGlvbik7Ci0gICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpICkgKTsKLQotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyX2JpLT5iaV9wYXJlbnQsMCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIGNoZWNrX2ludGVybmFsIChjdXJfYmktPmJpX3BhcmVudCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAotICB9CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShjdXJfYmktPnRiLCBjdXJfYmktPmJpX3BhcmVudCwKKwkJCQkJICAgICAgIDApOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCQljaGVja19pbnRlcm5hbChjdXJfYmktPmJpX3BhcmVudCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJfQogfQogCi0KIC8qIGRlbGV0ZSBuIG5vZGUgcG9pbnRlcnMgYW5kIGl0ZW1zIHN0YXJ0aW5nIGZyb20gZ2l2ZW4gcG9zaXRpb24gKi8KLXN0YXRpYyB2b2lkICBpbnRlcm5hbF9kZWxldGVfY2hpbGRzIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIAotCQkJCSAgICAgaW50IGZyb20sIGludCBuKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfZGVsZXRlX2NoaWxkcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmN1cl9iaSwgaW50IGZyb20sIGludCBuKQogewotICBpbnQgaV9mcm9tOworCWludCBpX2Zyb207CiAKLSAgaV9mcm9tID0gKGZyb20gPT0gMCkgPyBmcm9tIDogZnJvbSAtIDE7CisJaV9mcm9tID0gKGZyb20gPT0gMCkgPyBmcm9tIDogZnJvbSAtIDE7CiAKLSAgLyogZGVsZXRlIG4gcG9pbnRlcnMgc3RhcnRpbmcgZnJvbSBgZnJvbScgcG9zaXRpb24gaW4gQ1VSOwotICAgICBkZWxldGUgbiBrZXlzIHN0YXJ0aW5nIGZyb20gJ2lfZnJvbScgcG9zaXRpb24gaW4gQ1VSOwotICAgICAqLwotICBpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMgKGN1cl9iaSwgZnJvbSwgaV9mcm9tLCBuKTsKKwkvKiBkZWxldGUgbiBwb2ludGVycyBzdGFydGluZyBmcm9tIGBmcm9tJyBwb3NpdGlvbiBpbiBDVVI7CisJICAgZGVsZXRlIG4ga2V5cyBzdGFydGluZyBmcm9tICdpX2Zyb20nIHBvc2l0aW9uIGluIENVUjsKKwkgKi8KKwlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMoY3VyX2JpLCBmcm9tLCBpX2Zyb20sIG4pOwogfQogCi0KIC8qIGNvcHkgY3B5X251bSBub2RlIHBvaW50ZXJzIGFuZCBjcHlfbnVtIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QKICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgZmlyc3QgaXRlbXMgZnJvbSBzcmMgdG8gdGFpbCBvZiBkZXN0CiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weSBsYXN0IGl0ZW1zIGZyb20gc3JjIHRvIGhlYWQgb2YgZGVzdCAKICAqLwotc3RhdGljIHZvaWQgaW50ZXJuYWxfY29weV9wb2ludGVyc19pdGVtcyAoCi0JCQkJCSAgc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwKLQkJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsCi0JCQkJCSAgaW50IGxhc3RfZmlyc3QsIGludCBjcHlfbnVtCi0JCQkJCSAgKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfY29weV9wb2ludGVyc19pdGVtcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNyYywKKwkJCQkJIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSkKIHsKLSAgLyogQVRURU5USU9OISBOdW1iZXIgb2Ygbm9kZSBwb2ludGVycyBpbiBERVNUIGlzIGVxdWFsIHRvIG51bWJlciBvZiBpdGVtcyBpbiBERVNUICoKLSAgICogYXMgZGVsaW1pdGluZyBrZXkgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRvIGJ1ZmZlciBkZXN0LiovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKLSAgaW50IG5yX2Rlc3QsIG5yX3NyYzsKLSAgaW50IGRlc3Rfb3JkZXIsIHNyY19vcmRlcjsKLSAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCS8qIEFUVEVOVElPTiEgTnVtYmVyIG9mIG5vZGUgcG9pbnRlcnMgaW4gREVTVCBpcyBlcXVhbCB0byBudW1iZXIgb2YgaXRlbXMgaW4gREVTVCAqCisJICogYXMgZGVsaW1pdGluZyBrZXkgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRvIGJ1ZmZlciBkZXN0LiovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisJaW50IG5yX2Rlc3QsIG5yX3NyYzsKKwlpbnQgZGVzdF9vcmRlciwgc3JjX29yZGVyOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCByZWlzZXJmc19rZXkgKmtleTsKKwlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CiAKLSAgbnJfc3JjID0gQl9OUl9JVEVNUyAoc3JjKTsKKwlucl9zcmMgPSBCX05SX0lURU1TKHNyYyk7CiAKLSAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsIAotCSAgInNyYyAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgMCIsIHNyYywgZGVzdCk7Ci0gIFJGQUxTRSggbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCwKLQkgICJpbnZhbGlkIGxhc3RfZmlyc3QgcGFyYW1ldGVyICglZCkiLCBsYXN0X2ZpcnN0KTsKLSAgUkZBTFNFKCBucl9zcmMgPCBjcHlfbnVtIC0gMSwgCi0JICAibm8gc28gbWFueSBpdGVtcyAoJWQpIGluIHNyYyAoJWQpIiwgY3B5X251bSwgbnJfc3JjKTsKLSAgUkZBTFNFKCBjcHlfbnVtIDwgMCwgImNweV9udW0gbGVzcyB0aGFuIDAgKCVkKSIsIGNweV9udW0pOwotICBSRkFMU0UoIGNweV9udW0gLSAxICsgQl9OUl9JVEVNUyhkZXN0KSA+IChpbnQpTUFYX05SX0tFWShkZXN0KSwKLQkgICJjcHlfbnVtICglZCkgKyBpdGVtIG51bWJlciBpbiBkZXN0ICglZCkgY2FuIG5vdCBiZSA+IE1BWF9OUl9LRVkoJWQpIiwKLQkgIGNweV9udW0sIEJfTlJfSVRFTVMoZGVzdCksIE1BWF9OUl9LRVkoZGVzdCkpOworCVJGQUxTRShkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCisJICAgICAgICJzcmMgKCVwKSBvciBkZXN0ICglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOworCVJGQUxTRShsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QgJiYgbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNULAorCSAgICAgICAiaW52YWxpZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAoJWQpIiwgbGFzdF9maXJzdCk7CisJUkZBTFNFKG5yX3NyYyA8IGNweV9udW0gLSAxLAorCSAgICAgICAibm8gc28gbWFueSBpdGVtcyAoJWQpIGluIHNyYyAoJWQpIiwgY3B5X251bSwgbnJfc3JjKTsKKwlSRkFMU0UoY3B5X251bSA8IDAsICJjcHlfbnVtIGxlc3MgdGhhbiAwICglZCkiLCBjcHlfbnVtKTsKKwlSRkFMU0UoY3B5X251bSAtIDEgKyBCX05SX0lURU1TKGRlc3QpID4gKGludClNQVhfTlJfS0VZKGRlc3QpLAorCSAgICAgICAiY3B5X251bSAoJWQpICsgaXRlbSBudW1iZXIgaW4gZGVzdCAoJWQpIGNhbiBub3QgYmUgPiBNQVhfTlJfS0VZKCVkKSIsCisJICAgICAgIGNweV9udW0sIEJfTlJfSVRFTVMoZGVzdCksIE1BWF9OUl9LRVkoZGVzdCkpOwogCi0gIGlmICggY3B5X251bSA9PSAwICkKLSAgICByZXR1cm47CisJaWYgKGNweV9udW0gPT0gMCkKKwkJcmV0dXJuOwogCiAJLyogY29waW5nICovCi0gIGJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOwotICBucl9kZXN0ID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworCW5yX2Rlc3QgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgLypkZXN0X29yZGVyID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAwIDogbnJfZGVzdDsqLwotICAvKnNyY19vcmRlciA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKG5yX3NyYyAtIGNweV9udW0gKyAxKSA6IDA7Ki8KLSAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPwkoZGVzdF9vcmRlciA9IDAsIHNyY19vcmRlciA9IG5yX3NyYyAtIGNweV9udW0gKyAxKSA6Ci0gICAgKGRlc3Rfb3JkZXIgPSBucl9kZXN0LCBzcmNfb3JkZXIgPSAwKTsKKwkvKmRlc3Rfb3JkZXIgPSAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IDAgOiBucl9kZXN0OyAqLworCS8qc3JjX29yZGVyID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAobnJfc3JjIC0gY3B5X251bSArIDEpIDogMDsgKi8KKwkobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IChkZXN0X29yZGVyID0gMCwgc3JjX29yZGVyID0KKwkJCQkJIG5yX3NyYyAtIGNweV9udW0gKyAxKSA6IChkZXN0X29yZGVyID0KKwkJCQkJCQkJICBucl9kZXN0LAorCQkJCQkJCQkgIHNyY19vcmRlciA9CisJCQkJCQkJCSAgMCk7CiAKLSAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSBwb2ludGVycyAqLwotICBkYyA9IEJfTl9DSElMRCAoZGVzdCwgZGVzdF9vcmRlcik7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSBwb2ludGVycyAqLworCWRjID0gQl9OX0NISUxEKGRlc3QsIGRlc3Rfb3JkZXIpOwogCi0gIG1lbW1vdmUgKGRjICsgY3B5X251bSwgZGMsIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKiBEQ19TSVpFKTsKKwltZW1tb3ZlKGRjICsgY3B5X251bSwgZGMsIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKiBEQ19TSVpFKTsKIAogCS8qIGluc2VydCBwb2ludGVycyAqLwotICBtZW1jcHkgKGRjLCBCX05fQ0hJTEQgKHNyYywgc3JjX29yZGVyKSwgRENfU0laRSAqIGNweV9udW0pOworCW1lbWNweShkYywgQl9OX0NISUxEKHNyYywgc3JjX29yZGVyKSwgRENfU0laRSAqIGNweV9udW0pOwogCisJLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSAtIDEgaXRlbSBoZWFkZXJzICovCisJa2V5ID0gQl9OX1BERUxJTV9LRVkoZGVzdCwgZGVzdF9vcmRlcik7CisJbWVtbW92ZShrZXkgKyBjcHlfbnVtIC0gMSwga2V5LAorCQlLRVlfU0laRSAqIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKyBEQ19TSVpFICogKG5yX2Rlc3QgKworCQkJCQkJCSAgICAgICBjcHlfbnVtKSk7CiAKLSAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY3B5X251bSAtIDEgaXRlbSBoZWFkZXJzICovCi0gIGtleSA9IEJfTl9QREVMSU1fS0VZKGRlc3QsIGRlc3Rfb3JkZXIpOwotICBtZW1tb3ZlIChrZXkgKyBjcHlfbnVtIC0gMSwga2V5LAotCSAgIEtFWV9TSVpFICogKG5yX2Rlc3QgLSBkZXN0X29yZGVyKSArIERDX1NJWkUgKiAobnJfZGVzdCArIGNweV9udW0pKTsKKwkvKiBpbnNlcnQgaGVhZGVycyAqLworCW1lbWNweShrZXksIEJfTl9QREVMSU1fS0VZKHNyYywgc3JjX29yZGVyKSwgS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpKTsKIAorCS8qIHNpemVzLCBpdGVtIG51bWJlciAqLworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgKGNweV9udW0gLSAxKSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIChLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkgKworCQkJCQkJICAgICBEQ19TSVpFICogY3B5X251bSkpOwogCi0gIC8qIGluc2VydCBoZWFkZXJzICovCi0gIG1lbWNweSAoa2V5LCBCX05fUERFTElNX0tFWSAoc3JjLCBzcmNfb3JkZXIpLCBLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkpOworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdCwgMCk7CiAKLSAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCi0gIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIChjcHlfbnVtIC0gMSApICk7Ci0gIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsCi0gICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsgRENfU0laRSAqIGNweV9udW0gKSApOworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJY2hlY2tfaW50ZXJuYWwoZGVzdCk7CisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KIAotICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0LCAwKTsKKwlpZiAoZGVzdF9iaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGRlc3RfYmktPmJpX3BhcmVudCwgZGVzdF9iaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgKyAoS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpICsKKwkJCQkJICAgICBEQ19TSVpFICogY3B5X251bSkpOwogCi0gIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLSAgY2hlY2tfaW50ZXJuYWwgKGRlc3QpOwotICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0KLSAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgewotICAgIHN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOwotICAgIHRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLSAgICBwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkgKyBEQ19TSVpFICogY3B5X251bSkgKTsKLQotICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwwKTsKLSAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0gICAgY2hlY2tfaW50ZXJuYWwgKGRlc3RfYmktPmJpX3BhcmVudCk7Ci0gICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAotICB9CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJCWNoZWNrX2ludGVybmFsKGRlc3RfYmktPmJpX3BhcmVudCk7CisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJfQogCiB9CiAKLQogLyogQ29weSBjcHlfbnVtIG5vZGUgcG9pbnRlcnMgYW5kIGNweV9udW0gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdC4KICAqIERlbGV0ZSBjcHlfbnVtIC0gZGVsX3BhciBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBzcmMuCiAgKiBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgbWVhbnMsIHRoYXQgd2UgY29weS9kZWxldGUgZmlyc3QgaXRlbXMgZnJvbSBzcmMuCiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weS9kZWxldGUgbGFzdCBpdGVtcyBmcm9tIHNyYy4KICAqLwotc3RhdGljIHZvaWQgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgCi0JCQkJCSAgc3RydWN0IGJ1ZmZlcl9pbmZvICogc3JjX2JpLCAKLQkJCQkJICBpbnQgbGFzdF9maXJzdCwgaW50IGNweV9udW0sIGludCBkZWxfcGFyKQorc3RhdGljIHZvaWQgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2luZm8gKnNyY19iaSwKKwkJCQkJIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwKKwkJCQkJIGludCBkZWxfcGFyKQogewotICAgIGludCBmaXJzdF9wb2ludGVyOwotICAgIGludCBmaXJzdF9pdGVtOwotICAgIAotICAgIGludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMgKGRlc3RfYmksIHNyY19iaS0+YmlfYmgsIGxhc3RfZmlyc3QsIGNweV9udW0pOworCWludCBmaXJzdF9wb2ludGVyOworCWludCBmaXJzdF9pdGVtOwogCi0gICAgaWYgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgewkvKiBzaGlmdF9sZWZ0IG9jY3VycyAqLwotCWZpcnN0X3BvaW50ZXIgPSAwOwotCWZpcnN0X2l0ZW0gPSAwOwotCS8qIGRlbGV0ZSBjcHlfbnVtIC0gZGVsX3BhciBwb2ludGVycyBhbmQga2V5cyBzdGFydGluZyBmb3IgcG9pbnRlcnMgd2l0aCBmaXJzdF9wb2ludGVyLCAKLQkgICBmb3Iga2V5IC0gd2l0aCBmaXJzdF9pdGVtICovCi0JaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zIChzcmNfYmksIGZpcnN0X3BvaW50ZXIsIGZpcnN0X2l0ZW0sIGNweV9udW0gLSBkZWxfcGFyKTsKLSAgICB9IGVsc2UgewkJCS8qIHNoaWZ0X3JpZ2h0IG9jY3VycyAqLwotCWludCBpLCBqOworCWludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMoZGVzdF9iaSwgc3JjX2JpLT5iaV9iaCwgbGFzdF9maXJzdCwKKwkJCQkgICAgIGNweV9udW0pOwogCi0JaSA9ICggY3B5X251bSAtIGRlbF9wYXIgPT0gKCBqID0gQl9OUl9JVEVNUyhzcmNfYmktPmJpX2JoKSkgKyAxICkgPyAwIDogaiAtIGNweV9udW0gKyBkZWxfcGFyOworCWlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsJLyogc2hpZnRfbGVmdCBvY2N1cnMgKi8KKwkJZmlyc3RfcG9pbnRlciA9IDA7CisJCWZpcnN0X2l0ZW0gPSAwOworCQkvKiBkZWxldGUgY3B5X251bSAtIGRlbF9wYXIgcG9pbnRlcnMgYW5kIGtleXMgc3RhcnRpbmcgZm9yIHBvaW50ZXJzIHdpdGggZmlyc3RfcG9pbnRlciwgCisJCSAgIGZvciBrZXkgLSB3aXRoIGZpcnN0X2l0ZW0gKi8KKwkJaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zKHNyY19iaSwgZmlyc3RfcG9pbnRlciwKKwkJCQkJICAgICAgIGZpcnN0X2l0ZW0sIGNweV9udW0gLSBkZWxfcGFyKTsKKwl9IGVsc2UgewkJLyogc2hpZnRfcmlnaHQgb2NjdXJzICovCisJCWludCBpLCBqOwogCi0JaW50ZXJuYWxfZGVsZXRlX3BvaW50ZXJzX2l0ZW1zIChzcmNfYmksIGogKyAxIC0gY3B5X251bSArIGRlbF9wYXIsIGksIGNweV9udW0gLSBkZWxfcGFyKTsKLSAgICB9CisJCWkgPSAoY3B5X251bSAtIGRlbF9wYXIgPT0KKwkJICAgICAoaiA9CisJCSAgICAgIEJfTlJfSVRFTVMoc3JjX2JpLT5iaV9iaCkpICsgMSkgPyAwIDogaiAtIGNweV9udW0gKworCQkgICAgZGVsX3BhcjsKKworCQlpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMoc3JjX2JpLAorCQkJCQkgICAgICAgaiArIDEgLSBjcHlfbnVtICsgZGVsX3BhciwgaSwKKwkJCQkJICAgICAgIGNweV9udW0gLSBkZWxfcGFyKTsKKwl9CiB9CiAKIC8qIEluc2VydCBuX3NyYyd0aCBrZXkgb2YgYnVmZmVyIHNyYyBiZWZvcmUgbl9kZXN0J3RoIGtleSBvZiBidWZmZXIgZGVzdC4gKi8KLXN0YXRpYyB2b2lkIGludGVybmFsX2luc2VydF9rZXkgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIAotCQkJCSBpbnQgZGVzdF9wb3NpdGlvbl9iZWZvcmUsICAgICAgICAgICAgICAgICAvKiBpbnNlcnQga2V5IGJlZm9yZSBrZXkgd2l0aCBuX2Rlc3QgbnVtYmVyICovCi0JCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgCi0JCQkJIGludCBzcmNfcG9zaXRpb24pCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9pbnNlcnRfa2V5KHN0cnVjdCBidWZmZXJfaW5mbyAqZGVzdF9iaSwgaW50IGRlc3RfcG9zaXRpb25fYmVmb3JlLAkvKiBpbnNlcnQga2V5IGJlZm9yZSBrZXkgd2l0aCBuX2Rlc3QgbnVtYmVyICovCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBzcmNfcG9zaXRpb24pCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICAgIGludCBucjsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlpbnQgbnI7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OwogCi0gICAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCi0JICAgICJzb3VyY2UoJXApIG9yIGRlc3QoJXApIGJ1ZmZlciBpcyAwIiwgc3JjLCBkZXN0KTsKLSAgICBSRkFMU0UoIGRlc3RfcG9zaXRpb25fYmVmb3JlIDwgMCB8fCBzcmNfcG9zaXRpb24gPCAwLAotCSAgICAic291cmNlKCVkKSBvciBkZXN0KCVkKSBrZXkgbnVtYmVyIGxlc3MgdGhhbiAwIiwgCi0JICAgIHNyY19wb3NpdGlvbiwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOwotICAgIFJGQUxTRSggZGVzdF9wb3NpdGlvbl9iZWZvcmUgPiBCX05SX0lURU1TIChkZXN0KSB8fCAKLQkgICAgc3JjX3Bvc2l0aW9uID49IEJfTlJfSVRFTVMoc3JjKSwKLQkgICAgImludmFsaWQgcG9zaXRpb24gaW4gZGVzdCAoJWQgKGtleSBudW1iZXIgJWQpKSBvciBpbiBzcmMgKCVkIChrZXkgbnVtYmVyICVkKSkiLAotCSAgICBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwgQl9OUl9JVEVNUyAoZGVzdCksIAotCSAgICBzcmNfcG9zaXRpb24sIEJfTlJfSVRFTVMoc3JjKSk7Ci0gICAgUkZBTFNFKCBCX0ZSRUVfU1BBQ0UgKGRlc3QpIDwgS0VZX1NJWkUsCi0JICAgICJubyBlbm91Z2ggZnJlZSBzcGFjZSAoJWQpIGluIGRlc3QgYnVmZmVyIiwgQl9GUkVFX1NQQUNFIChkZXN0KSk7CisJUkZBTFNFKGRlc3QgPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCwKKwkgICAgICAgInNvdXJjZSglcCkgb3IgZGVzdCglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOworCVJGQUxTRShkZXN0X3Bvc2l0aW9uX2JlZm9yZSA8IDAgfHwgc3JjX3Bvc2l0aW9uIDwgMCwKKwkgICAgICAgInNvdXJjZSglZCkgb3IgZGVzdCglZCkga2V5IG51bWJlciBsZXNzIHRoYW4gMCIsCisJICAgICAgIHNyY19wb3NpdGlvbiwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOworCVJGQUxTRShkZXN0X3Bvc2l0aW9uX2JlZm9yZSA+IEJfTlJfSVRFTVMoZGVzdCkgfHwKKwkgICAgICAgc3JjX3Bvc2l0aW9uID49IEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgICAgImludmFsaWQgcG9zaXRpb24gaW4gZGVzdCAoJWQgKGtleSBudW1iZXIgJWQpKSBvciBpbiBzcmMgKCVkIChrZXkgbnVtYmVyICVkKSkiLAorCSAgICAgICBkZXN0X3Bvc2l0aW9uX2JlZm9yZSwgQl9OUl9JVEVNUyhkZXN0KSwKKwkgICAgICAgc3JjX3Bvc2l0aW9uLCBCX05SX0lURU1TKHNyYykpOworCVJGQUxTRShCX0ZSRUVfU1BBQ0UoZGVzdCkgPCBLRVlfU0laRSwKKwkgICAgICAgIm5vIGVub3VnaCBmcmVlIHNwYWNlICglZCkgaW4gZGVzdCBidWZmZXIiLCBCX0ZSRUVfU1BBQ0UoZGVzdCkpOwogCi0gICAgYmxraCA9IEJfQkxLX0hFQUQoZGVzdCk7Ci0gICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoZGVzdCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBpbnNlcnRpbmcga2V5ICovCi0gICAga2V5ID0gQl9OX1BERUxJTV9LRVkgKGRlc3QsIGRlc3RfcG9zaXRpb25fYmVmb3JlKTsKLSAgICBtZW1tb3ZlIChrZXkgKyAxLCBrZXksIChuciAtIGRlc3RfcG9zaXRpb25fYmVmb3JlKSAqIEtFWV9TSVpFICsgKG5yICsgMSkgKiBEQ19TSVpFKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBpbnNlcnRpbmcga2V5ICovCisJa2V5ID0gQl9OX1BERUxJTV9LRVkoZGVzdCwgZGVzdF9wb3NpdGlvbl9iZWZvcmUpOworCW1lbW1vdmUoa2V5ICsgMSwga2V5LAorCQkobnIgLSBkZXN0X3Bvc2l0aW9uX2JlZm9yZSkgKiBLRVlfU0laRSArIChuciArIDEpICogRENfU0laRSk7CiAKLSAgICAvKiBpbnNlcnQga2V5ICovCi0gICAgbWVtY3B5IChrZXksIEJfTl9QREVMSU1fS0VZKHNyYywgc3JjX3Bvc2l0aW9uKSwgS0VZX1NJWkUpOworCS8qIGluc2VydCBrZXkgKi8KKwltZW1jcHkoa2V5LCBCX05fUERFTElNX0tFWShzcmMsIHNyY19wb3NpdGlvbiksIEtFWV9TSVpFKTsKIAotICAgIC8qIENoYW5nZSBkaXJ0LCBmcmVlIHNwYWNlLCBpdGVtIG51bWJlciBmaWVsZHMuICovCisJLyogQ2hhbmdlIGRpcnQsIGZyZWUgc3BhY2UsIGl0ZW0gbnVtYmVyIGZpZWxkcy4gKi8KIAotICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIDEgKTsKLSAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBLRVlfU0laRSApOworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgMSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBLRVlfU0laRSk7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGRlc3RfYmktPnRiLCBkZXN0LCAwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3QsIDApOwogCi0gICAgaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgewotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOwotCXRfZGMgPSBCX05fQ0hJTEQoZGVzdF9iaS0+YmlfcGFyZW50LGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIEtFWV9TSVpFICk7CisJaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwkJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwkJcHV0X2RjX3NpemUodF9kYywgZGNfc2l6ZSh0X2RjKSArIEtFWV9TSVpFKTsKIAotCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwwKTsKLSAgICB9CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJfQogfQogCi0KLQogLyogSW5zZXJ0IGRfa2V5J3RoIChkZWxpbWl0aW5nKSBrZXkgZnJvbSBidWZmZXIgY2ZsIHRvIHRhaWwgb2YgZGVzdC4gCiAgKiBDb3B5IHBvaW50ZXJfYW1vdW50IG5vZGUgcG9pbnRlcnMgYW5kIHBvaW50ZXJfYW1vdW50IC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QuCiAgKiBSZXBsYWNlICBkX2tleSd0aCBrZXkgaW4gYnVmZmVyIGNmbC4KICAqIERlbGV0ZSBwb2ludGVyX2Ftb3VudCBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBzcmMuCiAgKi8KIC8qIHRoaXMgY2FuIGJlIGludm9rZWQgYm90aCB0byBzaGlmdCBmcm9tIFMgdG8gTCBhbmQgZnJvbSBSIHRvIFMgKi8KLXN0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0X2xlZnQgKAotCQkJCSAgICAgaW50IG1vZGUsCS8qIElOVEVSTkFMX0ZST01fU19UT19MIHwgSU5URVJOQUxfRlJPTV9SX1RPX1MgKi8KLQkJCQkgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCQkgICAgIGludCBoLAotCQkJCSAgICAgaW50IHBvaW50ZXJfYW1vdW50Ci0JCQkJICAgICApCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdF9sZWZ0KGludCBtb2RlLAkvKiBJTlRFUk5BTF9GUk9NX1NfVE9fTCB8IElOVEVSTkFMX0ZST01fUl9UT19TICovCisJCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJaW50IGgsIGludCBwb2ludGVyX2Ftb3VudCkKIHsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7Ci0gIGludCBkX2tleV9wb3NpdGlvbjsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY2Y7CisJaW50IGRfa2V5X3Bvc2l0aW9uOwogCi0gIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAobW9kZSwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKG1vZGUsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwKKwkJCQkgICAgICAgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOwogCi0gIC8qcHJpbnRrKCJwb2ludGVyX2Ftb3VudCA9ICVkXG4iLHBvaW50ZXJfYW1vdW50KTsqLworCS8qcHJpbnRrKCJwb2ludGVyX2Ftb3VudCA9ICVkXG4iLHBvaW50ZXJfYW1vdW50KTsgKi8KIAotICBpZiAocG9pbnRlcl9hbW91bnQpIHsKLSAgICAvKiBpbnNlcnQgZGVsaW1pdGluZyBrZXkgZnJvbSBjb21tb24gZmF0aGVyIG9mIGRlc3QgYW5kIHNyYyB0byBub2RlIGRlc3QgaW50byBwb3NpdGlvbiBCX05SX0lURU0oZGVzdCkgKi8KLSAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0X2JpLmJpX2JoKSwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKwlpZiAocG9pbnRlcl9hbW91bnQpIHsKKwkJLyogaW5zZXJ0IGRlbGltaXRpbmcga2V5IGZyb20gY29tbW9uIGZhdGhlciBvZiBkZXN0IGFuZCBzcmMgdG8gbm9kZSBkZXN0IGludG8gcG9zaXRpb24gQl9OUl9JVEVNKGRlc3QpICovCisJCWludGVybmFsX2luc2VydF9rZXkoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLAorCQkJCSAgICBkX2tleV9wb3NpdGlvbik7CiAKLSAgICBpZiAoQl9OUl9JVEVNUyhzcmNfYmkuYmlfYmgpID09IHBvaW50ZXJfYW1vdW50IC0gMSkgewotICAgICAgaWYgKHNyY19iaS5iaV9wb3NpdGlvbi8qc3JjLT5iX2l0ZW1fb3JkZXIqLyA9PSAwKQotCXJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfcGFyZW50LypzcmMtPmJfcGFyZW50Ki8sIDApOwotICAgIH0gZWxzZQotICAgICAgcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHNyY19iaS5iaV9iaCwgcG9pbnRlcl9hbW91bnQgLSAxKTsKLSAgfQotICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCi0gIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULCBwb2ludGVyX2Ftb3VudCwgMCk7CisJCWlmIChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7CisJCQlpZiAoc3JjX2JpLmJpX3Bvc2l0aW9uIC8qc3JjLT5iX2l0ZW1fb3JkZXIgKi8gID09IDApCisJCQkJcmVwbGFjZV9rZXkodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwKKwkJCQkJICAgIHNyY19iaS4KKwkJCQkJICAgIGJpX3BhcmVudCAvKnNyYy0+Yl9wYXJlbnQgKi8gLCAwKTsKKwkJfSBlbHNlCisJCQlyZXBsYWNlX2tleSh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsCisJCQkJICAgIHBvaW50ZXJfYW1vdW50IC0gMSk7CisJfQorCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKwlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULAorCQkJCSAgICAgcG9pbnRlcl9hbW91bnQsIDApOwogCiB9CiAKQEAgLTQ5Myw2NyArNDk4LDY2IEBACiAgKiBEZWxldGUgbiAtIDEgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgU1toXS4KICAqLwogLyogaXQgYWx3YXlzIHNoaWZ0cyBmcm9tIFNbaF0gdG8gTFtoXSAqLwotc3RhdGljIHZvaWQJaW50ZXJuYWxfc2hpZnQxX2xlZnQgKAotCQkJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCi0JCQkJICAgICAgaW50IGgsIAotCQkJCSAgICAgIGludCBwb2ludGVyX2Ftb3VudAotCQkJCSAgICAgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0MV9sZWZ0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCSBpbnQgaCwgaW50IHBvaW50ZXJfYW1vdW50KQogewotICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKLSAgaW50IGRfa2V5X3Bvc2l0aW9uOworCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjZjsKKwlpbnQgZF9rZXlfcG9zaXRpb247CiAKLSAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLCAmZF9rZXlfcG9zaXRpb24sICZjZik7CisJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwKKwkJCQkgICAgICAgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKIAotICBpZiAoIHBvaW50ZXJfYW1vdW50ID4gMCApIC8qIGluc2VydCBsa2V5W2hdLXRoIGtleSAgZnJvbSBDRkxbaF0gdG8gbGVmdCBuZWlnaGJvciBMW2hdICovCi0gICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdF9iaS5iaV9iaCksIGNmLCBkX2tleV9wb3NpdGlvbik7Ci0gIC8qCQlpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+TFtoXSwgQl9OUl9JVEVNKHRiLT5MW2hdKSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0pOyovCisJaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkJLyogaW5zZXJ0IGxrZXlbaF0tdGgga2V5ICBmcm9tIENGTFtoXSB0byBsZWZ0IG5laWdoYm9yIExbaF0gKi8KKwkJaW50ZXJuYWxfaW5zZXJ0X2tleSgmZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0X2JpLmJpX2JoKSwgY2YsCisJCQkJICAgIGRfa2V5X3Bvc2l0aW9uKTsKKwkvKiAgICAgICAgICAgIGludGVybmFsX2luc2VydF9rZXkgKHRiLT5MW2hdLCBCX05SX0lURU0odGItPkxbaF0pLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSk7ICovCiAKLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDEpOwotICAvKglpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+TFtoXSwgdGItPlNbaF0sIEZJUlNUX1RPX0xBU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsqLworCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKwlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULAorCQkJCSAgICAgcG9pbnRlcl9hbW91bnQsIDEpOworCS8qICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKHRiLT5MW2hdLCB0Yi0+U1toXSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDEpOyAqLwogfQogCi0KIC8qIEluc2VydCBkX2tleSd0aCAoZGVsaW1pdGluZykga2V5IGZyb20gYnVmZmVyIGNmciB0byBoZWFkIG9mIGRlc3QuIAogICogQ29weSBuIG5vZGUgcG9pbnRlcnMgYW5kIG4gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdC4KICAqIFJlcGxhY2UgIGRfa2V5J3RoIGtleSBpbiBidWZmZXIgY2ZyLgogICogRGVsZXRlIG4gaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgc3JjLgogICovCi1zdGF0aWMgdm9pZCBpbnRlcm5hbF9zaGlmdF9yaWdodCAoCi0JCQkJICBpbnQgbW9kZSwJLyogSU5URVJOQUxfRlJPTV9TX1RPX1IgfCBJTlRFUk5BTF9GUk9NX0xfVE9fUyAqLwotCQkJCSAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAotCQkJCSAgaW50IGgsCi0JCQkJICBpbnQgcG9pbnRlcl9hbW91bnQKLQkJCQkgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0X3JpZ2h0KGludCBtb2RlLAkvKiBJTlRFUk5BTF9GUk9NX1NfVE9fUiB8IElOVEVSTkFMX0ZST01fTF9UT19TICovCisJCQkJIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCSBpbnQgaCwgaW50IHBvaW50ZXJfYW1vdW50KQogewotICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKLSAgaW50IGRfa2V5X3Bvc2l0aW9uOwotICBpbnQgbnI7CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNmOworCWludCBkX2tleV9wb3NpdGlvbjsKKwlpbnQgbnI7CiAKKwlpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MobW9kZSwgdGIsIGgsICZkZXN0X2JpLCAmc3JjX2JpLAorCQkJCSAgICAgICAmZF9rZXlfcG9zaXRpb24sICZjZik7CiAKLSAgaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChtb2RlLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKwluciA9IEJfTlJfSVRFTVMoc3JjX2JpLmJpX2JoKTsKIAotICBuciA9IEJfTlJfSVRFTVMgKHNyY19iaS5iaV9iaCk7CisJaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkgeworCQkvKiBpbnNlcnQgZGVsaW1pdGluZyBrZXkgZnJvbSBjb21tb24gZmF0aGVyIG9mIGRlc3QgYW5kIHNyYyB0byBkZXN0IG5vZGUgaW50byBwb3NpdGlvbiAwICovCisJCWludGVybmFsX2luc2VydF9rZXkoJmRlc3RfYmksIDAsIGNmLCBkX2tleV9wb3NpdGlvbik7CisJCWlmIChuciA9PSBwb2ludGVyX2Ftb3VudCAtIDEpIHsKKwkJCVJGQUxTRShzcmNfYmkuYmlfYmggIT0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpIC8qdGItPlNbaF0gKi8gfHwKKwkJCSAgICAgICBkZXN0X2JpLmJpX2JoICE9IHRiLT5SW2hdLAorCQkJICAgICAgICJzcmMgKCVwKSBtdXN0IGJlID09IHRiLT5TW2hdKCVwKSB3aGVuIGl0IGRpc2FwcGVhcnMiLAorCQkJICAgICAgIHNyY19iaS5iaV9iaCwgUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKTsKKwkJCS8qIHdoZW4gU1toXSBkaXNhcHBlcnMgcmVwbGFjZSBsZWZ0IGRlbGVtaXRpbmcga2V5IGFzIHdlbGwgKi8KKwkJCWlmICh0Yi0+Q0ZMW2hdKQorCQkJCXJlcGxhY2Vfa2V5KHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHRiLT5DRkxbaF0sCisJCQkJCSAgICB0Yi0+bGtleVtoXSk7CisJCX0gZWxzZQorCQkJcmVwbGFjZV9rZXkodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX2JoLAorCQkJCSAgICBuciAtIHBvaW50ZXJfYW1vdW50KTsKKwl9CiAKLSAgaWYgKHBvaW50ZXJfYW1vdW50ID4gMCkgewotICAgIC8qIGluc2VydCBkZWxpbWl0aW5nIGtleSBmcm9tIGNvbW1vbiBmYXRoZXIgb2YgZGVzdCBhbmQgc3JjIHRvIGRlc3Qgbm9kZSBpbnRvIHBvc2l0aW9uIDAgKi8KLSAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKLSAgICBpZiAobnIgPT0gcG9pbnRlcl9hbW91bnQgLSAxKSB7Ci0JIFJGQUxTRSggc3JjX2JpLmJpX2JoICE9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCkvKnRiLT5TW2hdKi8gfHwgCi0JCSBkZXN0X2JpLmJpX2JoICE9IHRiLT5SW2hdLAotCQkgInNyYyAoJXApIG11c3QgYmUgPT0gdGItPlNbaF0oJXApIHdoZW4gaXQgZGlzYXBwZWFycyIsCi0JCSBzcmNfYmkuYmlfYmgsIFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCkpOwotICAgICAgLyogd2hlbiBTW2hdIGRpc2FwcGVycyByZXBsYWNlIGxlZnQgZGVsZW1pdGluZyBrZXkgYXMgd2VsbCAqLwotICAgICAgaWYgKHRiLT5DRkxbaF0pCi0JcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdKTsKLSAgICB9IGVsc2UKLSAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsIG5yIC0gcG9pbnRlcl9hbW91bnQpOwotICB9ICAgICAgCi0KLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgcG9pbnRlcl9hbW91bnQsIDApOworCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKwlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLCBMQVNUX1RPX0ZJUlNULAorCQkJCSAgICAgcG9pbnRlcl9hbW91bnQsIDApOwogfQogCiAvKiBJbnNlcnQgZGVsaW1pdGluZyBrZXkgdG8gUltoXS4KQEAgLTU2MSw0OTggKzU2NSw1MjYgQEAKICAqIERlbGV0ZSBuIC0gMSBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBTW2hdLgogICovCiAvKiBpdCBhbHdheXMgc2hpZnQgZnJvbSBTW2hdIHRvIFJbaF0gKi8KLXN0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0MV9yaWdodCAoCi0JCQkJICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCi0JCQkJICAgICAgIGludCBoLCAKLQkJCQkgICAgICAgaW50IHBvaW50ZXJfYW1vdW50Ci0JCQkJICAgICAgICkKK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0MV9yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgIGludCBoLCBpbnQgcG9pbnRlcl9hbW91bnQpCiB7Ci0gIHN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIGNmOwotICBpbnQgZF9rZXlfcG9zaXRpb247CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNmOworCWludCBkX2tleV9wb3NpdGlvbjsKIAotICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKwlpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLAorCQkJCSAgICAgICAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOwogCi0gIGlmIChwb2ludGVyX2Ftb3VudCA+IDApIC8qIGluc2VydCBya2V5IGZyb20gQ0ZSW2hdIHRvIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KLSAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKLSAgLyoJCWludGVybmFsX2luc2VydF9rZXkgKHRiLT5SW2hdLCAwLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSk7Ki8KLQkKLSAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLwotICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgcG9pbnRlcl9hbW91bnQsIDEpOwotICAvKglpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+UltoXSwgdGItPlNbaF0sIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsqLworCWlmIChwb2ludGVyX2Ftb3VudCA+IDApCS8qIGluc2VydCBya2V5IGZyb20gQ0ZSW2hdIHRvIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KKwkJaW50ZXJuYWxfaW5zZXJ0X2tleSgmZGVzdF9iaSwgMCwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKwkvKiAgICAgICAgICAgIGludGVybmFsX2luc2VydF9rZXkgKHRiLT5SW2hdLCAwLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSk7ICovCisKKwkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcygmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwKKwkJCQkgICAgIHBvaW50ZXJfYW1vdW50LCAxKTsKKwkvKiAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICh0Yi0+UltoXSwgdGItPlNbaF0sIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsgKi8KIH0KIAotCiAvKiBEZWxldGUgaW5zZXJ0X251bSBub2RlIHBvaW50ZXJzIHRvZ2V0aGVyIHdpdGggdGhlaXIgbGVmdCBpdGVtcwogICogYW5kIGJhbGFuY2UgY3VycmVudCBub2RlLiovCi1zdGF0aWMgdm9pZCBiYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQkJCQkgIGludCBoLCBpbnQgY2hpbGRfcG9zKQorc3RhdGljIHZvaWQgYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkJIGludCBoLCBpbnQgY2hpbGRfcG9zKQogewotICAgIGludCBpbnNlcnRfbnVtOwotICAgIGludCBuOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKwlpbnQgaW5zZXJ0X251bTsKKwlpbnQgbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiU2ggPSBQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwgaCk7CisJc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOwogCi0gICAgaW5zZXJ0X251bSA9IHRiLT5pbnNlcnRfc2l6ZVtoXSAvICgoaW50KShEQ19TSVpFICsgS0VZX1NJWkUpKTsKLSAgCi0gICAgLyogZGVsZXRlIGNoaWxkLW5vZGUtcG9pbnRlcihzKSB0b2dldGhlciB3aXRoIHRoZWlyIGxlZnQgaXRlbShzKSAqLwotICAgIGJpLnRiID0gdGI7Ci0gICAgYmkuYmlfYmggPSB0YlNoOwotICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0gICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJaW5zZXJ0X251bSA9IHRiLT5pbnNlcnRfc2l6ZVtoXSAvICgoaW50KShEQ19TSVpFICsgS0VZX1NJWkUpKTsKIAotICAgIGludGVybmFsX2RlbGV0ZV9jaGlsZHMgKCZiaSwgY2hpbGRfcG9zLCAtaW5zZXJ0X251bSk7CisJLyogZGVsZXRlIGNoaWxkLW5vZGUtcG9pbnRlcihzKSB0b2dldGhlciB3aXRoIHRoZWlyIGxlZnQgaXRlbShzKSAqLworCWJpLnRiID0gdGI7CisJYmkuYmlfYmggPSB0YlNoOworCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOwogCi0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtW2hdID4gMSwKLQkgICAgInRiLT5ibGtudW1bJWRdPSVkIHdoZW4gaW5zZXJ0X3NpemUgPCAwIiwgaCwgdGItPmJsa251bVtoXSk7CisJaW50ZXJuYWxfZGVsZXRlX2NoaWxkcygmYmksIGNoaWxkX3BvcywgLWluc2VydF9udW0pOwogCi0gICAgbiA9IEJfTlJfSVRFTVModGJTaCk7CisJUkZBTFNFKHRiLT5ibGtudW1baF0gPiAxLAorCSAgICAgICAidGItPmJsa251bVslZF09JWQgd2hlbiBpbnNlcnRfc2l6ZSA8IDAiLCBoLCB0Yi0+YmxrbnVtW2hdKTsKIAotICAgIGlmICggdGItPmxudW1baF0gPT0gMCAmJiB0Yi0+cm51bVtoXSA9PSAwICkgewotCWlmICggdGItPmJsa251bVtoXSA9PSAwICkgewotCSAgICAvKiBub2RlIFNbaF0gKHJvb3Qgb2YgdGhlIHRyZWUpIGlzIGVtcHR5IG5vdyAqLwotCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19yb290OworCW4gPSBCX05SX0lURU1TKHRiU2gpOwogCi0JICAgIFJGQUxTRSggbiB8fCBCX0ZSRUVfU1BBQ0UgKHRiU2gpICE9IE1BWF9DSElMRF9TSVpFKHRiU2gpIC0gRENfU0laRSwKLQkJICAgICJidWZmZXIgbXVzdCBoYXZlIG9ubHkgMCBrZXlzICglZCkiLCBuKTsKLQkgICAgUkZBTFNFKCBiaS5iaV9wYXJlbnQsICJyb290IGhhcyBwYXJlbnQgKCVwKSIsIGJpLmJpX3BhcmVudCk7Ci0JCQotCSAgICAvKiBjaG9vc2UgYSBuZXcgcm9vdCAqLwotCSAgICBpZiAoICEgdGItPkxbaC0xXSB8fCAhIEJfTlJfSVRFTVModGItPkxbaC0xXSkgKQotCQluZXdfcm9vdCA9IHRiLT5SW2gtMV07Ci0JICAgIGVsc2UKLQkJbmV3X3Jvb3QgPSB0Yi0+TFtoLTFdOwotCSAgICAvKiBzd2l0Y2ggc3VwZXIgYmxvY2sncyB0cmVlIHJvb3QgYmxvY2sgbnVtYmVyIHRvIHRoZSBuZXcgdmFsdWUgKi8KLSAgICAgICAgICAgIFBVVF9TQl9ST09UX0JMT0NLKCB0Yi0+dGJfc2IsIG5ld19yb290LT5iX2Jsb2NrbnIgKTsKLQkgICAgLy9SRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3JzLT5zX3RyZWVfaGVpZ2h0IC0tOwotICAgICAgICAgICAgUFVUX1NCX1RSRUVfSEVJR0hUKCB0Yi0+dGJfc2IsIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgLSAxICk7CisJaWYgKHRiLT5sbnVtW2hdID09IDAgJiYgdGItPnJudW1baF0gPT0gMCkgeworCQlpZiAodGItPmJsa251bVtoXSA9PSAwKSB7CisJCQkvKiBub2RlIFNbaF0gKHJvb3Qgb2YgdGhlIHRyZWUpIGlzIGVtcHR5IG5vdyAqLworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfcm9vdDsKIAotCSAgICBkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgKHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7Ci0JICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCi0JICAgIGlmIChoID4gMSkKLQkJLyogdXNlIGNoZWNrX2ludGVybmFsIGlmIG5ldyByb290IGlzIGFuIGludGVybmFsIG5vZGUgKi8KLQkJY2hlY2tfaW50ZXJuYWwgKG5ld19yb290KTsKLQkgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwkJCVJGQUxTRShuCisJCQkgICAgICAgfHwgQl9GUkVFX1NQQUNFKHRiU2gpICE9CisJCQkgICAgICAgTUFYX0NISUxEX1NJWkUodGJTaCkgLSBEQ19TSVpFLAorCQkJICAgICAgICJidWZmZXIgbXVzdCBoYXZlIG9ubHkgMCBrZXlzICglZCkiLCBuKTsKKwkJCVJGQUxTRShiaS5iaV9wYXJlbnQsICJyb290IGhhcyBwYXJlbnQgKCVwKSIsCisJCQkgICAgICAgYmkuYmlfcGFyZW50KTsKIAotCSAgICAvKiBkbyB3aGF0IGlzIG5lZWRlZCBmb3IgYnVmZmVyIHRocm93biBmcm9tIHRyZWUgKi8KLQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOwotCSAgICByZXR1cm47CisJCQkvKiBjaG9vc2UgYSBuZXcgcm9vdCAqLworCQkJaWYgKCF0Yi0+TFtoIC0gMV0gfHwgIUJfTlJfSVRFTVModGItPkxbaCAtIDFdKSkKKwkJCQluZXdfcm9vdCA9IHRiLT5SW2ggLSAxXTsKKwkJCWVsc2UKKwkJCQluZXdfcm9vdCA9IHRiLT5MW2ggLSAxXTsKKwkJCS8qIHN3aXRjaCBzdXBlciBibG9jaydzIHRyZWUgcm9vdCBibG9jayBudW1iZXIgdG8gdGhlIG5ldyB2YWx1ZSAqLworCQkJUFVUX1NCX1JPT1RfQkxPQ0sodGItPnRiX3NiLCBuZXdfcm9vdC0+Yl9ibG9ja25yKTsKKwkJCS8vUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19ycy0+c190cmVlX2hlaWdodCAtLTsKKwkJCVBVVF9TQl9UUkVFX0hFSUdIVCh0Yi0+dGJfc2IsCisJCQkJCSAgIFNCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYikgLSAxKTsKKworCQkJZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5KHRiLAorCQkJCQkJIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfc2JoLAorCQkJCQkJIDEpOworCQkJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJCQlpZiAoaCA+IDEpCisJCQkJLyogdXNlIGNoZWNrX2ludGVybmFsIGlmIG5ldyByb290IGlzIGFuIGludGVybmFsIG5vZGUgKi8KKwkJCQljaGVja19pbnRlcm5hbChuZXdfcm9vdCk7CisJCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgKi8KKworCQkJLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCisJCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisJCQlyZXR1cm47CisJCX0KKwkJcmV0dXJuOwogCX0KLQlyZXR1cm47Ci0gICAgfQogCi0gICAgaWYgKCB0Yi0+TFtoXSAmJiB0Yi0+bG51bVtoXSA9PSAtQl9OUl9JVEVNUyh0Yi0+TFtoXSkgLSAxICkgeyAvKiBqb2luIFNbaF0gd2l0aCBMW2hdICovCisJaWYgKHRiLT5MW2hdICYmIHRiLT5sbnVtW2hdID09IC1CX05SX0lURU1TKHRiLT5MW2hdKSAtIDEpIHsJLyogam9pbiBTW2hdIHdpdGggTFtoXSAqLwogCi0JUkZBTFNFKCB0Yi0+cm51bVtoXSAhPSAwLAotCQkiaW52YWxpZCB0Yi0+cm51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggTFtoXSIsCi0JCWgsIHRiLT5ybnVtW2hdKTsKKwkJUkZBTFNFKHRiLT5ybnVtW2hdICE9IDAsCisJCSAgICAgICAiaW52YWxpZCB0Yi0+cm51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggTFtoXSIsCisJCSAgICAgICBoLCB0Yi0+cm51bVtoXSk7CiAKLQlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIG4gKyAxKTsKLQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisJCWludGVybmFsX3NoaWZ0X2xlZnQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCBuICsgMSk7CisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKIAotCXJldHVybjsKLSAgICB9CisJCXJldHVybjsKKwl9CiAKLSAgICBpZiAoIHRiLT5SW2hdICYmICB0Yi0+cm51bVtoXSA9PSAtQl9OUl9JVEVNUyh0Yi0+UltoXSkgLSAxICkgeyAvKiBqb2luIFNbaF0gd2l0aCBSW2hdICovCi0JUkZBTFNFKCB0Yi0+bG51bVtoXSAhPSAwLAotCQkiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggUltoXSIsCi0JCWgsIHRiLT5sbnVtW2hdKTsKKwlpZiAodGItPlJbaF0gJiYgdGItPnJudW1baF0gPT0gLUJfTlJfSVRFTVModGItPlJbaF0pIC0gMSkgewkvKiBqb2luIFNbaF0gd2l0aCBSW2hdICovCisJCVJGQUxTRSh0Yi0+bG51bVtoXSAhPSAwLAorCQkgICAgICAgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGpvaW5pbmcgU1toXSB3aXRoIFJbaF0iLAorCQkgICAgICAgaCwgdGItPmxudW1baF0pOwogCi0JaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgbiArIDEpOworCQlpbnRlcm5hbF9zaGlmdF9yaWdodChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIG4gKyAxKTsKIAotCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLHRiU2gpOwotCXJldHVybjsKLSAgICB9CisJCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKKwkJcmV0dXJuOworCX0KIAotICAgIGlmICggdGItPmxudW1baF0gPCAwICkgeyAvKiBib3Jyb3cgZnJvbSBsZWZ0IG5laWdoYm9yIExbaF0gKi8KLQlSRkFMU0UoIHRiLT5ybnVtW2hdICE9IDAsCi0JCSJ3cm9uZyB0Yi0+cm51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gTFtoXSIsIGgsIHRiLT5ybnVtW2hdKTsKLQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0ICh0YiwgaCwgdGItPkxbaF0sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdLCB0Yi0+U1toXSwgLXRiLT5sbnVtW2hdKTsqLwotCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUywgdGIsIGgsIC10Yi0+bG51bVtoXSk7Ci0JcmV0dXJuOwotICAgIH0KKwlpZiAodGItPmxudW1baF0gPCAwKSB7CS8qIGJvcnJvdyBmcm9tIGxlZnQgbmVpZ2hib3IgTFtoXSAqLworCQlSRkFMU0UodGItPnJudW1baF0gIT0gMCwKKwkJICAgICAgICJ3cm9uZyB0Yi0+cm51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gTFtoXSIsIGgsCisJCSAgICAgICB0Yi0+cm51bVtoXSk7CisJCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQgKHRiLCBoLCB0Yi0+TFtoXSwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0sIHRiLT5TW2hdLCAtdGItPmxudW1baF0pOyAqLworCQlpbnRlcm5hbF9zaGlmdF9yaWdodChJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUywgdGIsIGgsCisJCQkJICAgICAtdGItPmxudW1baF0pOworCQlyZXR1cm47CisJfQogCi0gICAgaWYgKCB0Yi0+cm51bVtoXSA8IDAgKSB7IC8qIGJvcnJvdyBmcm9tIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KLQkgUkZBTFNFKCB0Yi0+bG51bVtoXSAhPSAwLAotCQkgImludmFsaWQgdGItPmxudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIFJbaF0iLCAKLQkJIGgsIHRiLT5sbnVtW2hdKTsKLQlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1JfVE9fUywgdGIsIGgsIC10Yi0+cm51bVtoXSk7Lyp0Yi0+U1toXSwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0sIHRiLT5SW2hdLCAtdGItPnJudW1baF0pOyovCi0JcmV0dXJuOwotICAgIH0KKwlpZiAodGItPnJudW1baF0gPCAwKSB7CS8qIGJvcnJvdyBmcm9tIHJpZ2h0IG5laWdoYm9yIFJbaF0gKi8KKwkJUkZBTFNFKHRiLT5sbnVtW2hdICE9IDAsCisJCSAgICAgICAiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gUltoXSIsCisJCSAgICAgICBoLCB0Yi0+bG51bVtoXSk7CisJCWludGVybmFsX3NoaWZ0X2xlZnQoSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1MsIHRiLCBoLCAtdGItPnJudW1baF0pOwkvKnRiLT5TW2hdLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSwgdGItPlJbaF0sIC10Yi0+cm51bVtoXSk7ICovCisJCXJldHVybjsKKwl9CiAKLSAgICBpZiAoIHRiLT5sbnVtW2hdID4gMCApIHsgLyogc3BsaXQgU1toXSBpbnRvIHR3byBwYXJ0cyBhbmQgcHV0IHRoZW0gaW50byBuZWlnaGJvcnMgKi8KLQlSRkFMU0UoIHRiLT5ybnVtW2hdID09IDAgfHwgdGItPmxudW1baF0gKyB0Yi0+cm51bVtoXSAhPSBuICsgMSwKLQkJImludmFsaWQgdGItPmxudW1bJWRdPT0lZCBvciB0Yi0+cm51bVslZF09PSVkIHdoZW4gU1toXShpdGVtIG51bWJlciA9PSAlZCkgaXMgc3BsaXQgYmV0d2VlbiB0aGVtIiwKLQkJaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdLCBuKTsKKwlpZiAodGItPmxudW1baF0gPiAwKSB7CS8qIHNwbGl0IFNbaF0gaW50byB0d28gcGFydHMgYW5kIHB1dCB0aGVtIGludG8gbmVpZ2hib3JzICovCisJCVJGQUxTRSh0Yi0+cm51bVtoXSA9PSAwIHx8IHRiLT5sbnVtW2hdICsgdGItPnJudW1baF0gIT0gbiArIDEsCisJCSAgICAgICAiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQgd2hlbiBTW2hdKGl0ZW0gbnVtYmVyID09ICVkKSBpcyBzcGxpdCBiZXR3ZWVuIHRoZW0iLAorCQkgICAgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdLCBuKTsKIAotCWludGVybmFsX3NoaWZ0X2xlZnQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgdGItPmxudW1baF0pOy8qdGItPkxbaF0sIHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdLCB0Yi0+U1toXSwgdGItPmxudW1baF0pOyovCi0JaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0pOworCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgdGItPmxudW1baF0pOwkvKnRiLT5MW2hdLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSwgdGItPlNbaF0sIHRiLT5sbnVtW2hdKTsgKi8KKwkJaW50ZXJuYWxfc2hpZnRfcmlnaHQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLAorCQkJCSAgICAgdGItPnJudW1baF0pOwogCi0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlNoKTsKKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOwogCi0JcmV0dXJuOwotICAgIH0KLSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZTogdW5leHBlY3RlZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQiLAotCQkgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdKTsKKwkJcmV0dXJuOworCX0KKwlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsCisJCSAgICAgICAiYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZTogdW5leHBlY3RlZCB0Yi0+bG51bVslZF09PSVkIG9yIHRiLT5ybnVtWyVkXT09JWQiLAorCQkgICAgICAgaCwgdGItPmxudW1baF0sIGgsIHRiLT5ybnVtW2hdKTsKIH0KIAotCiAvKiBSZXBsYWNlIGRlbGltaXRpbmcga2V5IG9mIGJ1ZmZlcnMgTFtoXSBhbmQgU1toXSBieSB0aGUgZ2l2ZW4ga2V5LiovCi1zdGF0aWMgdm9pZCByZXBsYWNlX2xrZXkgKAotCQkgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCi0JCSAgICAgIGludCBoLAotCQkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICoga2V5Ci0JCSAgICAgICkKK3N0YXRpYyB2b2lkIHJlcGxhY2VfbGtleShzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IGgsIHN0cnVjdCBpdGVtX2hlYWQgKmtleSkKIHsKLSAgIFJGQUxTRSggdGItPkxbaF0gPT0gTlVMTCB8fCB0Yi0+Q0ZMW2hdID09IE5VTEwsCi0JICAgIkxbaF0oJXApIGFuZCBDRkxbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9sa2V5IiwgCi0JICAgdGItPkxbaF0sIHRiLT5DRkxbaF0pOworCVJGQUxTRSh0Yi0+TFtoXSA9PSBOVUxMIHx8IHRiLT5DRkxbaF0gPT0gTlVMTCwKKwkgICAgICAgIkxbaF0oJXApIGFuZCBDRkxbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9sa2V5IiwKKwkgICAgICAgdGItPkxbaF0sIHRiLT5DRkxbaF0pOwogCi0gIGlmIChCX05SX0lURU1TKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKSkgPT0gMCkKLSAgICByZXR1cm47CisJaWYgKEJfTlJfSVRFTVMoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKSA9PSAwKQorCQlyZXR1cm47CiAKLSAgbWVtY3B5IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CisJbWVtY3B5KEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbaF0sIHRiLT5sa2V5W2hdKSwga2V5LCBLRVlfU0laRSk7CiAKLSAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPkNGTFtoXSwwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiLT5DRkxbaF0sIDApOwogfQogCi0KIC8qIFJlcGxhY2UgZGVsaW1pdGluZyBrZXkgb2YgYnVmZmVycyBTW2hdIGFuZCBSW2hdIGJ5IHRoZSBnaXZlbiBrZXkuKi8KLXN0YXRpYyB2b2lkIHJlcGxhY2VfcmtleSAoCi0JCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJICAgICAgaW50IGgsCi0JCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBrZXkKLQkJICAgICAgKQorc3RhdGljIHZvaWQgcmVwbGFjZV9ya2V5KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgaCwgc3RydWN0IGl0ZW1faGVhZCAqa2V5KQogewotICBSRkFMU0UoIHRiLT5SW2hdID09IE5VTEwgfHwgdGItPkNGUltoXSA9PSBOVUxMLAotCSAgIlJbaF0oJXApIGFuZCBDRlJbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9ya2V5IiwgCi0JICB0Yi0+UltoXSwgdGItPkNGUltoXSk7Ci0gIFJGQUxTRSggQl9OUl9JVEVNUyh0Yi0+UltoXSkgPT0gMCwKLQkgICJSW2hdIGNhbiBub3QgYmUgZW1wdHkgaWYgaXQgZXhpc3RzIChpdGVtIG51bWJlcj0lZCkiLCAKLQkgIEJfTlJfSVRFTVModGItPlJbaF0pKTsKKwlSRkFMU0UodGItPlJbaF0gPT0gTlVMTCB8fCB0Yi0+Q0ZSW2hdID09IE5VTEwsCisJICAgICAgICJSW2hdKCVwKSBhbmQgQ0ZSW2hdKCVwKSBtdXN0IGV4aXN0IGluIHJlcGxhY2VfcmtleSIsCisJICAgICAgIHRiLT5SW2hdLCB0Yi0+Q0ZSW2hdKTsKKwlSRkFMU0UoQl9OUl9JVEVNUyh0Yi0+UltoXSkgPT0gMCwKKwkgICAgICAgIlJbaF0gY2FuIG5vdCBiZSBlbXB0eSBpZiBpdCBleGlzdHMgKGl0ZW0gbnVtYmVyPSVkKSIsCisJICAgICAgIEJfTlJfSVRFTVModGItPlJbaF0pKTsKIAotICBtZW1jcHkgKEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbaF0sdGItPnJrZXlbaF0pLCBrZXksIEtFWV9TSVpFKTsKKwltZW1jcHkoQl9OX1BERUxJTV9LRVkodGItPkNGUltoXSwgdGItPnJrZXlbaF0pLCBrZXksIEtFWV9TSVpFKTsKIAotICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZSW2hdLCAwKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiLT5DRlJbaF0sIDApOwogfQogCi0KLWludCBiYWxhbmNlX2ludGVybmFsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCQkJLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAJCSovCi0JCSAgICAgIGludCBoLAkJCQkJLyogbGV2ZWwgb2YgdGhlIHRyZWUgCQkJKi8KLQkJICAgICAgaW50IGNoaWxkX3BvcywKLQkJICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydF9rZXksCQkvKiBrZXkgZm9yIGluc2VydGlvbiBvbiBoaWdoZXIgbGV2ZWwgICAJKi8KLQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGluc2VydF9wdHIJLyogbm9kZSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCovCitpbnQgYmFsYW5jZV9pbnRlcm5hbChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwJLyogdHJlZV9iYWxhbmNlIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisJCSAgICAgaW50IGgsCS8qIGxldmVsIG9mIHRoZSB0cmVlICAgICAgICAgICAgICAgICAgICAqLworCQkgICAgIGludCBjaGlsZF9wb3MsIHN0cnVjdCBpdGVtX2hlYWQgKmluc2VydF9rZXksCS8qIGtleSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCAgICAqLworCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmluc2VydF9wdHIJLyogbm9kZSBmb3IgaW5zZXJ0aW9uIG9uIGhpZ2hlciBsZXZlbCAqLwogICAgICkKICAgICAvKiBpZiBpbnNlcnRpbmcvcGFzdGluZwogICAgICAgIHsKLSAgICAgICBjaGlsZF9wb3MgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlLXBvaW50ZXIgaW4gU1toXSB0aGF0CSAqCi0gICAgICAgcG9pbnRlZCB0byBTW2gtMV0gYmVmb3JlIGJhbGFuY2luZyBvZiB0aGUgaC0xIGxldmVsOwkJICoKKyAgICAgICBjaGlsZF9wb3MgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlLXBvaW50ZXIgaW4gU1toXSB0aGF0ICAgICAgICAqCisgICAgICAgcG9pbnRlZCB0byBTW2gtMV0gYmVmb3JlIGJhbGFuY2luZyBvZiB0aGUgaC0xIGxldmVsOyAgICAgICAgICAgICAgKgogICAgICAgIHRoaXMgbWVhbnMgdGhhdCBuZXcgcG9pbnRlcnMgYW5kIGl0ZW1zIG11c3QgYmUgaW5zZXJ0ZWQgQUZURVIgKgogICAgICAgIGNoaWxkX3BvcwogICAgICAgIH0KICAgICAgICBlbHNlIAogICAgICAgIHsKLSAgIGl0IGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGVmdG1vc3QgcG9pbnRlciB0aGF0IG11c3QgYmUgZGVsZXRlZCAodG9nZXRoZXIgd2l0aAotICAgaXRzIGNvcnJlc3BvbmRpbmcga2V5IHRvIHRoZSBsZWZ0IG9mIHRoZSBwb2ludGVyKQotICAgYXMgYSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGxldmVsJ3MgYmFsYW5jaW5nLgotICAgfQotKi8KKyAgICAgICBpdCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnRtb3N0IHBvaW50ZXIgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgKHRvZ2V0aGVyIHdpdGgKKyAgICAgICBpdHMgY29ycmVzcG9uZGluZyBrZXkgdG8gdGhlIGxlZnQgb2YgdGhlIHBvaW50ZXIpCisgICAgICAgYXMgYSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIGxldmVsJ3MgYmFsYW5jaW5nLgorICAgICAgIH0KKyAgICAgKi8KIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7Ci0gICAgaW50IG9yZGVyOwkJLyogd2UgcmV0dXJuIHRoaXM6IGl0IGlzIDAgaWYgdGhlcmUgaXMgbm8gU1toXSwgZWxzZSBpdCBpcyB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCi0gICAgaW50IGluc2VydF9udW0sIG4sIGs7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU19uZXc7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCBuZXdfaW5zZXJ0X2tleTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBuZXdfaW5zZXJ0X3B0ciA9IE5VTEw7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIG5ld19pbnNlcnRfa2V5X2FkZHIgPSBpbnNlcnRfa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaCA9IFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLCBoKTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gYmk7CisJaW50IG9yZGVyOwkJLyogd2UgcmV0dXJuIHRoaXM6IGl0IGlzIDAgaWYgdGhlcmUgaXMgbm8gU1toXSwgZWxzZSBpdCBpcyB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCisJaW50IGluc2VydF9udW0sIG4sIGs7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpTX25ldzsKKwlzdHJ1Y3QgaXRlbV9oZWFkIG5ld19pbnNlcnRfa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2luc2VydF9wdHIgPSBOVUxMOworCXN0cnVjdCBpdGVtX2hlYWQgKm5ld19pbnNlcnRfa2V5X2FkZHIgPSBpbnNlcnRfa2V5OwogCi0gICAgUkZBTFNFKCBoIDwgMSwgImggKCVkKSBjYW4gbm90IGJlIDwgMSBvbiBpbnRlcm5hbCBsZXZlbCIsIGgpOworCVJGQUxTRShoIDwgMSwgImggKCVkKSBjYW4gbm90IGJlIDwgMSBvbiBpbnRlcm5hbCBsZXZlbCIsIGgpOwogCi0gICAgUFJPQ19JTkZPX0lOQyggdGIgLT4gdGJfc2IsIGJhbGFuY2VfYXRbIGggXSApOworCVBST0NfSU5GT19JTkModGItPnRiX3NiLCBiYWxhbmNlX2F0W2hdKTsKIAotICAgIG9yZGVyID0gKCB0YlNoICkgPyBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSkvKnRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIqLyA6IDA7CisJb3JkZXIgPQorCSAgICAodGJTaCkgPyBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsCisJCQkJICAgICBoICsgMSkgLyp0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovIDogMDsKIAotICAvKiBVc2luZyBpbnNlcnRfc2l6ZVtoXSBjYWxjdWxhdGUgdGhlIG51bWJlciBpbnNlcnRfbnVtIG9mIGl0ZW1zCi0gICAgIHRoYXQgbXVzdCBiZSBpbnNlcnRlZCB0byBvciBkZWxldGVkIGZyb20gU1toXS4gKi8KLSAgICBpbnNlcnRfbnVtID0gdGItPmluc2VydF9zaXplW2hdLygoaW50KShLRVlfU0laRSArIERDX1NJWkUpKTsKKwkvKiBVc2luZyBpbnNlcnRfc2l6ZVtoXSBjYWxjdWxhdGUgdGhlIG51bWJlciBpbnNlcnRfbnVtIG9mIGl0ZW1zCisJICAgdGhhdCBtdXN0IGJlIGluc2VydGVkIHRvIG9yIGRlbGV0ZWQgZnJvbSBTW2hdLiAqLworCWluc2VydF9udW0gPSB0Yi0+aW5zZXJ0X3NpemVbaF0gLyAoKGludCkoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CiAKLSAgICAvKiBDaGVjayB3aGV0aGVyIGluc2VydF9udW0gaXMgcHJvcGVyICoqLwotICAgIFJGQUxTRSggaW5zZXJ0X251bSA8IC0yICB8fCAgaW5zZXJ0X251bSA+IDIsCi0JICAgICJpbmNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlICglZCkiLCAKLQkgICAgaW5zZXJ0X251bSk7Ci0gICAgUkZBTFNFKCBoID4gMSAgJiYgKGluc2VydF9udW0gPiAxIHx8IGluc2VydF9udW0gPCAtMSksCi0JICAgICJpbmNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zICglZCkgaW5zZXJ0ZWQgdG8gdGhlIGludGVybmFsIG5vZGUgb24gYSBsZXZlbCAoaD0lZCkgaGlnaGVyIHRoYW4gbGFzdCBpbnRlcm5hbCBsZXZlbCIsIAotCSAgICBpbnNlcnRfbnVtLCBoKTsKKwkvKiBDaGVjayB3aGV0aGVyIGluc2VydF9udW0gaXMgcHJvcGVyICogKi8KKwlSRkFMU0UoaW5zZXJ0X251bSA8IC0yIHx8IGluc2VydF9udW0gPiAyLAorCSAgICAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyBpbnNlcnRlZCB0byB0aGUgaW50ZXJuYWwgbm9kZSAoJWQpIiwKKwkgICAgICAgaW5zZXJ0X251bSk7CisJUkZBTFNFKGggPiAxICYmIChpbnNlcnRfbnVtID4gMSB8fCBpbnNlcnRfbnVtIDwgLTEpLAorCSAgICAgICAiaW5jb3JyZWN0IG51bWJlciBvZiBpdGVtcyAoJWQpIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlIG9uIGEgbGV2ZWwgKGg9JWQpIGhpZ2hlciB0aGFuIGxhc3QgaW50ZXJuYWwgbGV2ZWwiLAorCSAgICAgICBpbnNlcnRfbnVtLCBoKTsKIAotICAgIC8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9udW0gPCAwICovCi0gICAgaWYgKCBpbnNlcnRfbnVtIDwgMCApIHsKLQliYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlICh0YiwgaCwgY2hpbGRfcG9zKTsKLQlyZXR1cm4gb3JkZXI7Ci0gICAgfQotIAotICAgIGsgPSAwOwotICAgIGlmICggdGItPmxudW1baF0gPiAwICkgewotCS8qIHNoaWZ0IGxudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbaF0uCi0JICAgY2hlY2sgaG93IG1hbnkgb2YgbmV3IGl0ZW1zIGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSBhZnRlcgotCSAgIHNoaWZ0aW5nICovCi0JbiA9IEJfTlJfSVRFTVMgKHRiLT5MW2hdKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIExbaF0gKi8KLQlpZiAoIHRiLT5sbnVtW2hdIDw9IGNoaWxkX3BvcyApIHsKLQkgICAgLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSAqLwotCSAgICBpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIHRiLT5sbnVtW2hdKTsKLQkgICAgLyppbnRlcm5hbF9zaGlmdF9sZWZ0ICh0Yi0+TFtoXSx0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdLHRiU2gsdGItPmxudW1baF0pOyovCi0JICAgIGNoaWxkX3BvcyAtPSB0Yi0+bG51bVtoXTsKLQl9IGVsc2UgaWYgKCB0Yi0+bG51bVtoXSA+IGNoaWxkX3BvcyArIGluc2VydF9udW0gKSB7Ci0JICAgIC8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIExbaF0gKi8KLQkgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCB0Yi0+bG51bVtoXSAtIGluc2VydF9udW0pOwotCSAgICAvKgkJCWludGVybmFsX3NoaWZ0X2xlZnQodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLAotCQkJCXRiLT5sbnVtW2hdLWluc2VydF9udW0pOwotCSAgICAqLwotCSAgICAvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gTFtoXSAqLwotCSAgICBiaS50YiA9IHRiOwotCSAgICBiaS5iaV9iaCA9IHRiLT5MW2hdOwotCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07Ci0JICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKLQkgICAgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoJmJpLC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCovIG4gKyBjaGlsZF9wb3MgKyAxLAotCQkJCSAgICBpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7Ci0KLQkgICAgaW5zZXJ0X251bSA9IDA7IAotCX0gZWxzZSB7Ci0JICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0KLQkgICAgLyogc29tZSBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0sIGJ1dCBzb21lIGRvbid0IGZhbGwgKi8KLQkgICAgaW50ZXJuYWxfc2hpZnQxX2xlZnQodGIsaCxjaGlsZF9wb3MrMSk7Ci0JICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIExbaF0gKi8KLQkgICAgayA9IHRiLT5sbnVtW2hdIC0gY2hpbGRfcG9zIC0gMTsKLQkgICAgYmkudGIgPSB0YjsKLQkgICAgYmkuYmlfYmggPSB0Yi0+TFtoXTsKLQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOwotCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7Ci0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQsKi8gbiArIGNoaWxkX3BvcyArIDEsaywKLQkJCQkgICAgaW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKLQotCSAgICByZXBsYWNlX2xrZXkodGIsaCxpbnNlcnRfa2V5ICsgayk7Ci0KLQkgICAgLyogcmVwbGFjZSB0aGUgZmlyc3Qgbm9kZS1wdHIgaW4gU1toXSBieSBub2RlLXB0ciB0byBpbnNlcnRfcHRyW2tdICovCi0JICAgIGRjID0gQl9OX0NISUxEKHRiU2gsIDApOwotCSAgICBwdXRfZGNfc2l6ZSggZGMsIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJba10pIC0gQl9GUkVFX1NQQUNFIChpbnNlcnRfcHRyW2tdKSk7Ci0JICAgIHB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2tdLT5iX2Jsb2NrbnIgKTsKLQotCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0YlNoLCAwKTsKLQotCSAgICBrKys7Ci0JICAgIGluc2VydF9rZXkgKz0gazsKLQkgICAgaW5zZXJ0X3B0ciArPSBrOwotCSAgICBpbnNlcnRfbnVtIC09IGs7Ci0JICAgIGNoaWxkX3BvcyA9IDA7CisJLyogTWFrZSBiYWxhbmNlIGluIGNhc2UgaW5zZXJ0X251bSA8IDAgKi8KKwlpZiAoaW5zZXJ0X251bSA8IDApIHsKKwkJYmFsYW5jZV9pbnRlcm5hbF93aGVuX2RlbGV0ZSh0YiwgaCwgY2hpbGRfcG9zKTsKKwkJcmV0dXJuIG9yZGVyOwogCX0KLSAgICB9CS8qIHRiLT5sbnVtW2hdID4gMCAqLwogCi0gICAgaWYgKCB0Yi0+cm51bVtoXSA+IDAgKSB7Ci0JLypzaGlmdCBybnVtW2hdIGl0ZW1zIGZyb20gU1toXSB0byB0aGUgcmlnaHQgbmVpZ2hib3IgUltoXSovCi0JLyogY2hlY2sgaG93IG1hbnkgb2YgbmV3IGl0ZW1zIGZhbGwgaW50byBSIG9yIENGUiBhZnRlciBzaGlmdGluZyAqLwotCW4gPSBCX05SX0lURU1TICh0YlNoKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KLQlpZiAoIG4gLSB0Yi0+cm51bVtoXSA+PSBjaGlsZF9wb3MgKQotCSAgICAvKiBuZXcgaXRlbXMgZmFsbCBpbnRvIFNbaF0gKi8KLQkgICAgLyppbnRlcm5hbF9zaGlmdF9yaWdodCh0YixoLHRiU2gsdGItPkNGUltoXSx0Yi0+cmtleVtoXSx0Yi0+UltoXSx0Yi0+cm51bVtoXSk7Ki8KLQkgICAgaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0pOwotCWVsc2UKLQkgICAgaWYgKCBuICsgaW5zZXJ0X251bSAtIHRiLT5ybnVtW2hdIDwgY2hpbGRfcG9zICkKLQkgICAgewotCQkvKiBhbGwgbmV3IGl0ZW1zIGZhbGwgaW50byBSW2hdICovCi0JCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQodGIsaCx0YlNoLHRiLT5DRlJbaF0sdGItPnJrZXlbaF0sdGItPlJbaF0sCi0JICAgIHRiLT5ybnVtW2hdIC0gaW5zZXJ0X251bSk7Ki8KLQkJaW50ZXJuYWxfc2hpZnRfcmlnaHQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgdGItPnJudW1baF0gLSBpbnNlcnRfbnVtKTsKKwlrID0gMDsKKwlpZiAodGItPmxudW1baF0gPiAwKSB7CisJCS8qIHNoaWZ0IGxudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbaF0uCisJCSAgIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0gYWZ0ZXIKKwkJICAgc2hpZnRpbmcgKi8KKwkJbiA9IEJfTlJfSVRFTVModGItPkxbaF0pOwkvKiBudW1iZXIgb2YgaXRlbXMgaW4gTFtoXSAqLworCQlpZiAodGItPmxudW1baF0gPD0gY2hpbGRfcG9zKSB7CisJCQkvKiBuZXcgaXRlbXMgZG9uJ3QgZmFsbCBpbnRvIExbaF0gb3IgQ0ZMW2hdICovCisJCQlpbnRlcm5hbF9zaGlmdF9sZWZ0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwKKwkJCQkJICAgIHRiLT5sbnVtW2hdKTsKKwkJCS8qaW50ZXJuYWxfc2hpZnRfbGVmdCAodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLHRiLT5sbnVtW2hdKTsgKi8KKwkJCWNoaWxkX3BvcyAtPSB0Yi0+bG51bVtoXTsKKwkJfSBlbHNlIGlmICh0Yi0+bG51bVtoXSA+IGNoaWxkX3BvcyArIGluc2VydF9udW0pIHsKKwkJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIExbaF0gKi8KKwkJCWludGVybmFsX3NoaWZ0X2xlZnQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLAorCQkJCQkgICAgdGItPmxudW1baF0gLSBpbnNlcnRfbnVtKTsKKwkJCS8qICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCh0Yi0+TFtoXSx0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdLHRiU2gsCisJCQkgICB0Yi0+bG51bVtoXS1pbnNlcnRfbnVtKTsKKwkJCSAqLworCQkJLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIExbaF0gKi8KKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5MW2hdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCAqLworCQkJCQkgICAgICAgbiArIGNoaWxkX3BvcyArIDEsCisJCQkJCSAgICAgICBpbnNlcnRfbnVtLCBpbnNlcnRfa2V5LAorCQkJCQkgICAgICAgaW5zZXJ0X3B0cik7CiAKLQkJLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIFJbaF0gKi8KLQkJYmkudGIgPSB0YjsKLQkJYmkuYmlfYmggPSB0Yi0+UltoXTsKLQkJYmkuYmlfcGFyZW50ID0gdGItPkZSW2hdOwotCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksIC8qdGItPlJbaF0sdGItPlNbaC0xXS0+Yl9uZXh0Ki8gY2hpbGRfcG9zIC0gbiAtIGluc2VydF9udW0gKyB0Yi0+cm51bVtoXSAtIDEsCi0JCQkJCWluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKLQkJaW5zZXJ0X251bSA9IDA7Ci0JICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JCXN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisJCQlpbnNlcnRfbnVtID0gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKIAotCQkvKiBvbmUgb2YgdGhlIGl0ZW1zIGZhbGxzIGludG8gQ0ZSW2hdICovCi0JCWludGVybmFsX3NoaWZ0MV9yaWdodCh0YixoLG4gLSBjaGlsZF9wb3MgKyAxKTsKLQkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gUltoXSAqLwotCQlrID0gdGItPnJudW1baF0gLSBuICsgY2hpbGRfcG9zIC0gMTsKLQkJYmkudGIgPSB0YjsKLQkJYmkuYmlfYmggPSB0Yi0+UltoXTsKLQkJYmkuYmlfcGFyZW50ID0gdGItPkZSW2hdOwotCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOwotCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgmYmksIC8qdGItPlJbaF0sIHRiLT5SW2hdLT5iX2NoaWxkLCovIDAsIGssIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyICsgMSk7CisJCQkvKiBzb21lIGl0ZW1zIGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSwgYnV0IHNvbWUgZG9uJ3QgZmFsbCAqLworCQkJaW50ZXJuYWxfc2hpZnQxX2xlZnQodGIsIGgsIGNoaWxkX3BvcyArIDEpOworCQkJLyogY2FsY3VsYXRlIG51bWJlciBvZiBuZXcgaXRlbXMgdGhhdCBmYWxsIGludG8gTFtoXSAqLworCQkJayA9IHRiLT5sbnVtW2hdIC0gY2hpbGRfcG9zIC0gMTsKKwkJCWJpLnRiID0gdGI7CisJCQliaS5iaV9iaCA9IHRiLT5MW2hdOworCQkJYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOworCQkJYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCwgKi8KKwkJCQkJICAgICAgIG4gKyBjaGlsZF9wb3MgKyAxLCBrLAorCQkJCQkgICAgICAgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CiAKLQkJcmVwbGFjZV9ya2V5KHRiLGgsaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSk7CisJCQlyZXBsYWNlX2xrZXkodGIsIGgsIGluc2VydF9rZXkgKyBrKTsKIAotCQkvKiByZXBsYWNlIHRoZSBmaXJzdCBub2RlLXB0ciBpbiBSW2hdIGJ5IG5vZGUtcHRyIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKi8KLQkJZGMgPSBCX05fQ0hJTEQodGItPlJbaF0sIDApOwotCQlwdXRfZGNfc2l6ZSggZGMsIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSAtCi0gICAgCQkJCSAgICBCX0ZSRUVfU1BBQ0UgKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSk7Ci0JCXB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXS0+Yl9ibG9ja25yICk7CisJCQkvKiByZXBsYWNlIHRoZSBmaXJzdCBub2RlLXB0ciBpbiBTW2hdIGJ5IG5vZGUtcHRyIHRvIGluc2VydF9wdHJba10gKi8KKwkJCWRjID0gQl9OX0NISUxEKHRiU2gsIDApOworCQkJcHV0X2RjX3NpemUoZGMsCisJCQkJICAgIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJba10pIC0KKwkJCQkgICAgQl9GUkVFX1NQQUNFKGluc2VydF9wdHJba10pKTsKKwkJCXB1dF9kY19ibG9ja19udW1iZXIoZGMsIGluc2VydF9wdHJba10tPmJfYmxvY2tucik7CiAKLQkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPlJbaF0sMCk7CisJCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiU2gsIDApOwogCi0JCWluc2VydF9udW0gLT0gKGsgKyAxKTsKLQkgICAgfQotICAgIH0KKwkJCWsrKzsKKwkJCWluc2VydF9rZXkgKz0gazsKKwkJCWluc2VydF9wdHIgKz0gazsKKwkJCWluc2VydF9udW0gLT0gazsKKwkJCWNoaWxkX3BvcyA9IDA7CisJCX0KKwl9CisJLyogdGItPmxudW1baF0gPiAwICovCisJaWYgKHRiLT5ybnVtW2hdID4gMCkgeworCQkvKnNoaWZ0IHJudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSByaWdodCBuZWlnaGJvciBSW2hdICovCisJCS8qIGNoZWNrIGhvdyBtYW55IG9mIG5ldyBpdGVtcyBmYWxsIGludG8gUiBvciBDRlIgYWZ0ZXIgc2hpZnRpbmcgKi8KKwkJbiA9IEJfTlJfSVRFTVModGJTaCk7CS8qIG51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCisJCWlmIChuIC0gdGItPnJudW1baF0gPj0gY2hpbGRfcG9zKQorCQkJLyogbmV3IGl0ZW1zIGZhbGwgaW50byBTW2hdICovCisJCQkvKmludGVybmFsX3NoaWZ0X3JpZ2h0KHRiLGgsdGJTaCx0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdLHRiLT5SW2hdLHRiLT5ybnVtW2hdKTsgKi8KKwkJCWludGVybmFsX3NoaWZ0X3JpZ2h0KElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwKKwkJCQkJICAgICB0Yi0+cm51bVtoXSk7CisJCWVsc2UgaWYgKG4gKyBpbnNlcnRfbnVtIC0gdGItPnJudW1baF0gPCBjaGlsZF9wb3MpIHsKKwkJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFJbaF0gKi8KKwkJCS8qaW50ZXJuYWxfc2hpZnRfcmlnaHQodGIsaCx0YlNoLHRiLT5DRlJbaF0sdGItPnJrZXlbaF0sdGItPlJbaF0sCisJCQkgICB0Yi0+cm51bVtoXSAtIGluc2VydF9udW0pOyAqLworCQkJaW50ZXJuYWxfc2hpZnRfcmlnaHQoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLAorCQkJCQkgICAgIHRiLT5ybnVtW2hdIC0gaW5zZXJ0X251bSk7CisKKwkJCS8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBSW2hdICovCisJCQliaS50YiA9IHRiOworCQkJYmkuYmlfYmggPSB0Yi0+UltoXTsKKwkJCWJpLmJpX3BhcmVudCA9IHRiLT5GUltoXTsKKwkJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCBoKTsKKwkJCWludGVybmFsX2luc2VydF9jaGlsZHMoJmJpLAorCQkJCQkgICAgICAgLyp0Yi0+UltoXSx0Yi0+U1toLTFdLT5iX25leHQgKi8KKwkJCQkJICAgICAgIGNoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsKKwkJCQkJICAgICAgIHRiLT5ybnVtW2hdIC0gMSwKKwkJCQkJICAgICAgIGluc2VydF9udW0sIGluc2VydF9rZXksCisJCQkJCSAgICAgICBpbnNlcnRfcHRyKTsKKwkJCWluc2VydF9udW0gPSAwOworCQl9IGVsc2UgeworCQkJc3RydWN0IGRpc2tfY2hpbGQgKmRjOworCisJCQkvKiBvbmUgb2YgdGhlIGl0ZW1zIGZhbGxzIGludG8gQ0ZSW2hdICovCisJCQlpbnRlcm5hbF9zaGlmdDFfcmlnaHQodGIsIGgsIG4gLSBjaGlsZF9wb3MgKyAxKTsKKwkJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIFJbaF0gKi8KKwkJCWsgPSB0Yi0+cm51bVtoXSAtIG4gKyBjaGlsZF9wb3MgLSAxOworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gdGItPlJbaF07CisJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgaCk7CisJCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwKKwkJCQkJICAgICAgIC8qdGItPlJbaF0sIHRiLT5SW2hdLT5iX2NoaWxkLCAqLworCQkJCQkgICAgICAgMCwgaywgaW5zZXJ0X2tleSArIDEsCisJCQkJCSAgICAgICBpbnNlcnRfcHRyICsgMSk7CisKKwkJCXJlcGxhY2VfcmtleSh0YiwgaCwgaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSk7CisKKwkJCS8qIHJlcGxhY2UgdGhlIGZpcnN0IG5vZGUtcHRyIGluIFJbaF0gYnkgbm9kZS1wdHIgaW5zZXJ0X3B0cltpbnNlcnRfbnVtLWstMV0gKi8KKwkJCWRjID0gQl9OX0NISUxEKHRiLT5SW2hdLCAwKTsKKwkJCXB1dF9kY19zaXplKGRjLAorCQkJCSAgICBNQVhfQ0hJTERfU0laRShpbnNlcnRfcHRyCisJCQkJCQkgICBbaW5zZXJ0X251bSAtIGsgLSAxXSkgLQorCQkJCSAgICBCX0ZSRUVfU1BBQ0UoaW5zZXJ0X3B0cgorCQkJCQkJIFtpbnNlcnRfbnVtIC0gayAtIDFdKSk7CisJCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLAorCQkJCQkgICAgaW5zZXJ0X3B0cltpbnNlcnRfbnVtIC0gayAtCisJCQkJCQkgICAgICAgMV0tPmJfYmxvY2tucik7CisKKwkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSh0YiwgdGItPlJbaF0sIDApOworCisJCQlpbnNlcnRfbnVtIC09IChrICsgMSk7CisJCX0KKwl9CiAKICAgICAvKiogRmlsbCBuZXcgbm9kZSB0aGF0IGFwcGVhcnMgaW5zdGVhZCBvZiBTW2hdICoqLwotICAgIFJGQUxTRSggdGItPmJsa251bVtoXSA+IDIsICJibGtudW0gY2FuIG5vdCBiZSA+IDIgZm9yIGludGVybmFsIGxldmVsIik7Ci0gICAgUkZBTFNFKCB0Yi0+YmxrbnVtW2hdIDwgMCwgImJsa251bSBjYW4gbm90IGJlIDwgMCIpOworCVJGQUxTRSh0Yi0+YmxrbnVtW2hdID4gMiwgImJsa251bSBjYW4gbm90IGJlID4gMiBmb3IgaW50ZXJuYWwgbGV2ZWwiKTsKKwlSRkFMU0UodGItPmJsa251bVtoXSA8IDAsICJibGtudW0gY2FuIG5vdCBiZSA8IDAiKTsKIAotICAgIGlmICggISB0Yi0+YmxrbnVtW2hdICkKLSAgICB7IC8qIG5vZGUgU1toXSBpcyBlbXB0eSBub3cgKi8KLQlSRkFMU0UoICEgdGJTaCwgIlNbaF0gaXMgZXF1YWwgTlVMTCIpOworCWlmICghdGItPmJsa251bVtoXSkgewkvKiBub2RlIFNbaF0gaXMgZW1wdHkgbm93ICovCisJCVJGQUxTRSghdGJTaCwgIlNbaF0gaXMgZXF1YWwgTlVMTCIpOwogCi0JLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCi0JcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsdGJTaCk7Ci0JcmV0dXJuIG9yZGVyOwotICAgIH0KLQotICAgIGlmICggISB0YlNoICkgewotCS8qIGNyZWF0ZSBuZXcgcm9vdCAqLwotCXN0cnVjdCBkaXNrX2NoaWxkICAqIGRjOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2hfMSA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCAtIDEpOwotICAgICAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqICBibGtoOwotCi0KLQlpZiAoIHRiLT5ibGtudW1baF0gIT0gMSApCi0JICAgIHJlaXNlcmZzX3BhbmljKE5VTEwsICJiYWxhbmNlX2ludGVybmFsOiBPbmUgbmV3IG5vZGUgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIHRoZSBuZXcgcm9vdCIpOwotCS8qIFNbaF0gPSBlbXB0eSBidWZmZXIgZnJvbSB0aGUgbGlzdCBGRUIuICovCi0JdGJTaCA9IGdldF9GRUIgKHRiKTsKLSAgICAgICAgYmxraCA9IEJfQkxLX0hFQUQodGJTaCk7Ci0gICAgICAgIHNldF9ibGtoX2xldmVsKCBibGtoLCBoICsgMSApOwotCi0JLyogUHV0IHRoZSB1bmlxdWUgbm9kZS1wb2ludGVyIHRvIFNbaF0gdGhhdCBwb2ludHMgdG8gU1toLTFdLiAqLwotCi0JZGMgPSBCX05fQ0hJTEQodGJTaCwgMCk7Ci0JcHV0X2RjX2Jsb2NrX251bWJlciggZGMsIHRiU2hfMS0+Yl9ibG9ja25yICk7Ci0JcHV0X2RjX3NpemUoIGRjLCAoTUFYX0NISUxEX1NJWkUgKHRiU2hfMSkgLSBCX0ZSRUVfU1BBQ0UgKHRiU2hfMSkpKTsKLQotCXRiLT5pbnNlcnRfc2l6ZVtoXSAtPSBEQ19TSVpFOwotICAgICAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBEQ19TSVpFICk7Ci0KLQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0YlNoLCAwKTsKLQotCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KLQljaGVja19pbnRlcm5hbCAodGJTaCk7Ci0JLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLwotICAgIAotICAgIC8qIHB1dCBuZXcgcm9vdCBpbnRvIHBhdGggc3RydWN0dXJlICovCi0JUEFUSF9PRkZTRVRfUEJVRkZFUih0Yi0+dGJfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IHRiU2g7Ci0KLQkvKiBDaGFuZ2Ugcm9vdCBpbiBzdHJ1Y3R1cmUgc3VwZXIgYmxvY2suICovCi0gICAgICAgIFBVVF9TQl9ST09UX0JMT0NLKCB0Yi0+dGJfc2IsIHRiU2gtPmJfYmxvY2tuciApOwotICAgICAgICBQVVRfU0JfVFJFRV9IRUlHSFQoIHRiLT50Yl9zYiwgU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiKSArIDEgKTsKLQlkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgKHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7Ci0gICAgfQotCQotICAgIGlmICggdGItPmJsa251bVtoXSA9PSAyICkgewotCWludCBzbnVtOwotCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7Ci0KLQotCS8qIFNfbmV3ID0gZnJlZSBidWZmZXIgZnJvbSBsaXN0IEZFQiAqLwotCVNfbmV3ID0gZ2V0X0ZFQih0Yik7Ci0KLSAgICAgICAgc2V0X2Jsa2hfbGV2ZWwoIEJfQkxLX0hFQUQoU19uZXcpLCBoICsgMSApOwotCi0JZGVzdF9iaS50YiA9IHRiOwotCWRlc3RfYmkuYmlfYmggPSBTX25ldzsKLQlkZXN0X2JpLmJpX3BhcmVudCA9IE5VTEw7Ci0JZGVzdF9iaS5iaV9wb3NpdGlvbiA9IDA7Ci0Jc3JjX2JpLnRiID0gdGI7Ci0Jc3JjX2JpLmJpX2JoID0gdGJTaDsKLQlzcmNfYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQlzcmNfYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7Ci0JCQotCW4gPSBCX05SX0lURU1TICh0YlNoKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KLQlzbnVtID0gKGluc2VydF9udW0gKyBuICsgMSkvMjsKLQlpZiAoIG4gLSBzbnVtID49IGNoaWxkX3BvcyApIHsKLQkgICAgLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBTX25ldyAqLwotCSAgICAvKglzdG9yZSB0aGUgZGVsaW1pdGluZyBrZXkgZm9yIHRoZSBuZXh0IGxldmVsICovCi0JICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gKG4gLSBzbnVtKSd0aCBrZXkgaW4gU1toXSAqLwotCSAgICBtZW1jcHkgKCZuZXdfaW5zZXJ0X2tleSxCX05fUERFTElNX0tFWSh0YlNoLG4gLSBzbnVtKSwKLQkJICAgIEtFWV9TSVpFKTsKLQkgICAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLwotCSAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7Ci0JICAgIC8qICAgICAgICAgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldywgdGJTaCwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7Ki8KLQl9IGVsc2UgaWYgKCBuICsgaW5zZXJ0X251bSAtIHNudW0gPCBjaGlsZF9wb3MgKSB7Ci0JICAgIC8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFNfbmV3ICovCi0JICAgIC8qCXN0b3JlIHRoZSBkZWxpbWl0aW5nIGtleSBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KLQkgICAgLyogbmV3X2luc2VydF9rZXkgPSAobiArIGluc2VydF9pdGVtIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KLQkgICAgbWVtY3B5KCZuZXdfaW5zZXJ0X2tleSxCX05fUERFTElNX0tFWSh0YlNoLG4gKyBpbnNlcnRfbnVtIC0gc251bSksCi0JCSAgIEtFWV9TSVpFKTsKLQkgICAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLwotCSAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgc251bSAtIGluc2VydF9udW0sIDApOwotCSAgICAvKgkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsdGJTaCwxLHNudW0gLSBpbnNlcnRfbnVtLDApOyovCi0KLQkgICAgLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIFNfbmV3ICovCi0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZkZXN0X2JpLCAvKlNfbmV3LHRiLT5TW2gtMV0tPmJfbmV4dCwqL2NoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsgc251bSAtIDEsCi0JCQkJICAgIGluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKLQotCSAgICBpbnNlcnRfbnVtID0gMDsKLQl9IGVsc2UgewotCSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOwotCi0JICAgIC8qIHNvbWUgaXRlbXMgZmFsbCBpbnRvIFNfbmV3LCBidXQgc29tZSBkb24ndCBmYWxsICovCi0JICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KLQkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIG4gLSBjaGlsZF9wb3MgKyAxLCAxKTsKLQkgICAgLyoJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LHRiU2gsMSxuIC0gY2hpbGRfcG9zICsgMSwxKTsqLwotCSAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBTX25ldyAqLwotCSAgICBrID0gc251bSAtIG4gKyBjaGlsZF9wb3MgLSAxOwotCi0JICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZkZXN0X2JpLCAvKlNfbmV3LCovIDAsIGssIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyKzEpOwotCi0JICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gaW5zZXJ0X2tleVtpbnNlcnRfbnVtIC0gayAtIDFdICovCi0JICAgIG1lbWNweSgmbmV3X2luc2VydF9rZXksaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSwKLQkJICAgS0VZX1NJWkUpOwotCSAgICAvKiByZXBsYWNlIGZpcnN0IG5vZGUtcHRyIGluIFNfbmV3IGJ5IG5vZGUtcHRyIHRvIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdICovCi0KLQkgICAgZGMgPSBCX05fQ0hJTEQoU19uZXcsMCk7Ci0JICAgIHB1dF9kY19zaXplKCBkYywgKE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSAtCi0JCQkJQl9GUkVFX1NQQUNFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSkgKTsKLQkgICAgcHV0X2RjX2Jsb2NrX251bWJlciggZGMsIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdLT5iX2Jsb2NrbnIgKTsKLQotCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCBTX25ldywwKTsKLQkJCQotCSAgICBpbnNlcnRfbnVtIC09IChrICsgMSk7Ci0JfQotCS8qIG5ld19pbnNlcnRfcHRyID0gbm9kZV9wb2ludGVyIHRvIFNfbmV3ICovCi0JbmV3X2luc2VydF9wdHIgPSBTX25ldzsKLQotCVJGQUxTRSAoIWJ1ZmZlcl9qb3VybmFsZWQoU19uZXcpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KFNfbmV3KSB8fAotCQlidWZmZXJfZGlydHkgKFNfbmV3KSwKLQkJImNtLTAwMDAxOiBiYWQgU19uZXcgKCViKSIsIFNfbmV3KTsKLQotCS8vIFNfbmV3IGlzIHJlbGVhc2VkIGluIHVuZml4X25vZGVzCi0gICAgfQotCi0gICAgbiA9IEJfTlJfSVRFTVMgKHRiU2gpOyAvKm51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCi0KLQlpZiAoIDAgPD0gY2hpbGRfcG9zICYmIGNoaWxkX3BvcyA8PSBuICYmIGluc2VydF9udW0gPiAwICkgewotCSAgICBiaS50YiA9IHRiOwotCSAgICBiaS5iaV9iaCA9IHRiU2g7Ci0JICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7Ci0JICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOwotCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgKLQkJICAgICZiaSwvKnRiU2gsKi8KLQkJICAgIC8qCQkoIHRiLT5TW2gtMV0tPmJfcGFyZW50ID09IHRiLT5TW2hdICkgPyB0Yi0+U1toLTFdLT5iX25leHQgOiAgdGItPlNbaF0tPmJfY2hpbGQtPmJfbmV4dCwqLwotCQkgICAgY2hpbGRfcG9zLGluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyCi0JCSAgICApOworCQkvKiBkbyB3aGF0IGlzIG5lZWRlZCBmb3IgYnVmZmVyIHRocm93biBmcm9tIHRyZWUgKi8KKwkJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsIHRiU2gpOworCQlyZXR1cm4gb3JkZXI7CiAJfQogCisJaWYgKCF0YlNoKSB7CisJCS8qIGNyZWF0ZSBuZXcgcm9vdCAqLworCQlzdHJ1Y3QgZGlza19jaGlsZCAqZGM7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaF8xID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGggLSAxKTsKKwkJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CiAKLQltZW1jcHkgKG5ld19pbnNlcnRfa2V5X2FkZHIsJm5ld19pbnNlcnRfa2V5LEtFWV9TSVpFKTsKKwkJaWYgKHRiLT5ibGtudW1baF0gIT0gMSkKKwkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJICAgICAgICJiYWxhbmNlX2ludGVybmFsOiBPbmUgbmV3IG5vZGUgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIHRoZSBuZXcgcm9vdCIpOworCQkvKiBTW2hdID0gZW1wdHkgYnVmZmVyIGZyb20gdGhlIGxpc3QgRkVCLiAqLworCQl0YlNoID0gZ2V0X0ZFQih0Yik7CisJCWJsa2ggPSBCX0JMS19IRUFEKHRiU2gpOworCQlzZXRfYmxraF9sZXZlbChibGtoLCBoICsgMSk7CisKKwkJLyogUHV0IHRoZSB1bmlxdWUgbm9kZS1wb2ludGVyIHRvIFNbaF0gdGhhdCBwb2ludHMgdG8gU1toLTFdLiAqLworCisJCWRjID0gQl9OX0NISUxEKHRiU2gsIDApOworCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLCB0YlNoXzEtPmJfYmxvY2tucik7CisJCXB1dF9kY19zaXplKGRjLAorCQkJICAgIChNQVhfQ0hJTERfU0laRSh0YlNoXzEpIC0gQl9GUkVFX1NQQUNFKHRiU2hfMSkpKTsKKworCQl0Yi0+aW5zZXJ0X3NpemVbaF0gLT0gRENfU0laRTsKKwkJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBEQ19TSVpFKTsKKworCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkodGIsIHRiU2gsIDApOworCisJCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmICovCisJCWNoZWNrX2ludGVybmFsKHRiU2gpOworCQkvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiAqLworCisJCS8qIHB1dCBuZXcgcm9vdCBpbnRvIHBhdGggc3RydWN0dXJlICovCisJCVBBVEhfT0ZGU0VUX1BCVUZGRVIodGItPnRiX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPQorCQkgICAgdGJTaDsKKworCQkvKiBDaGFuZ2Ugcm9vdCBpbiBzdHJ1Y3R1cmUgc3VwZXIgYmxvY2suICovCisJCVBVVF9TQl9ST09UX0JMT0NLKHRiLT50Yl9zYiwgdGJTaC0+Yl9ibG9ja25yKTsKKwkJUFVUX1NCX1RSRUVfSEVJR0hUKHRiLT50Yl9zYiwgU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiKSArIDEpOworCQlkb19iYWxhbmNlX21hcmtfc2JfZGlydHkodGIsIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfc2JoLCAxKTsKKwl9CisKKwlpZiAodGItPmJsa251bVtoXSA9PSAyKSB7CisJCWludCBzbnVtOworCQlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCisJCS8qIFNfbmV3ID0gZnJlZSBidWZmZXIgZnJvbSBsaXN0IEZFQiAqLworCQlTX25ldyA9IGdldF9GRUIodGIpOworCisJCXNldF9ibGtoX2xldmVsKEJfQkxLX0hFQUQoU19uZXcpLCBoICsgMSk7CisKKwkJZGVzdF9iaS50YiA9IHRiOworCQlkZXN0X2JpLmJpX2JoID0gU19uZXc7CisJCWRlc3RfYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJZGVzdF9iaS5iaV9wb3NpdGlvbiA9IDA7CisJCXNyY19iaS50YiA9IHRiOworCQlzcmNfYmkuYmlfYmggPSB0YlNoOworCQlzcmNfYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQlzcmNfYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04odGItPnRiX3BhdGgsIGggKyAxKTsKKworCQluID0gQl9OUl9JVEVNUyh0YlNoKTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KKwkJc251bSA9IChpbnNlcnRfbnVtICsgbiArIDEpIC8gMjsKKwkJaWYgKG4gLSBzbnVtID49IGNoaWxkX3BvcykgeworCQkJLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBTX25ldyAqLworCQkJLyogIHN0b3JlIHRoZSBkZWxpbWl0aW5nIGtleSBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KKwkJCS8qIG5ld19pbnNlcnRfa2V5ID0gKG4gLSBzbnVtKSd0aCBrZXkgaW4gU1toXSAqLworCQkJbWVtY3B5KCZuZXdfaW5zZXJ0X2tleSwgQl9OX1BERUxJTV9LRVkodGJTaCwgbiAtIHNudW0pLAorCQkJICAgICAgIEtFWV9TSVpFKTsKKwkJCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoJmRlc3RfYmksICZzcmNfYmksCisJCQkJCQkgICAgIExBU1RfVE9fRklSU1QsIHNudW0sIDApOworCQkJLyogICAgICAgICAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LCB0YlNoLCBMQVNUX1RPX0ZJUlNULCBzbnVtLCAwKTsgKi8KKwkJfSBlbHNlIGlmIChuICsgaW5zZXJ0X251bSAtIHNudW0gPCBjaGlsZF9wb3MpIHsKKwkJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFNfbmV3ICovCisJCQkvKiAgc3RvcmUgdGhlIGRlbGltaXRpbmcga2V5IGZvciB0aGUgbmV4dCBsZXZlbCAqLworCQkJLyogbmV3X2luc2VydF9rZXkgPSAobiArIGluc2VydF9pdGVtIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KKwkJCW1lbWNweSgmbmV3X2luc2VydF9rZXksCisJCQkgICAgICAgQl9OX1BERUxJTV9LRVkodGJTaCwgbiArIGluc2VydF9udW0gLSBzbnVtKSwKKwkJCSAgICAgICBLRVlfU0laRSk7CisJCQkvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyICovCisJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKCZkZXN0X2JpLCAmc3JjX2JpLAorCQkJCQkJICAgICBMQVNUX1RPX0ZJUlNULAorCQkJCQkJICAgICBzbnVtIC0gaW5zZXJ0X251bSwgMCk7CisJCQkvKiAgICAgICAgICAgICAgICAgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsdGJTaCwxLHNudW0gLSBpbnNlcnRfbnVtLDApOyAqLworCisJCQkvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gU19uZXcgKi8KKwkJCWludGVybmFsX2luc2VydF9jaGlsZHMoJmRlc3RfYmksCisJCQkJCSAgICAgICAvKlNfbmV3LHRiLT5TW2gtMV0tPmJfbmV4dCwgKi8KKwkJCQkJICAgICAgIGNoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsKKwkJCQkJICAgICAgIHNudW0gLSAxLAorCQkJCQkgICAgICAgaW5zZXJ0X251bSwgaW5zZXJ0X2tleSwKKwkJCQkJICAgICAgIGluc2VydF9wdHIpOworCisJCQlpbnNlcnRfbnVtID0gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKworCQkJLyogc29tZSBpdGVtcyBmYWxsIGludG8gU19uZXcsIGJ1dCBzb21lIGRvbid0IGZhbGwgKi8KKwkJCS8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoJmRlc3RfYmksICZzcmNfYmksCisJCQkJCQkgICAgIExBU1RfVE9fRklSU1QsCisJCQkJCQkgICAgIG4gLSBjaGlsZF9wb3MgKyAxLCAxKTsKKwkJCS8qICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldyx0YlNoLDEsbiAtIGNoaWxkX3BvcyArIDEsMSk7ICovCisJCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBTX25ldyAqLworCQkJayA9IHNudW0gLSBuICsgY2hpbGRfcG9zIC0gMTsKKworCQkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcygmZGVzdF9iaSwgLypTX25ldywgKi8gMCwgaywKKwkJCQkJICAgICAgIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyICsgMSk7CisKKwkJCS8qIG5ld19pbnNlcnRfa2V5ID0gaW5zZXJ0X2tleVtpbnNlcnRfbnVtIC0gayAtIDFdICovCisJCQltZW1jcHkoJm5ld19pbnNlcnRfa2V5LCBpbnNlcnRfa2V5ICsgaW5zZXJ0X251bSAtIGsgLSAxLAorCQkJICAgICAgIEtFWV9TSVpFKTsKKwkJCS8qIHJlcGxhY2UgZmlyc3Qgbm9kZS1wdHIgaW4gU19uZXcgYnkgbm9kZS1wdHIgdG8gaW5zZXJ0X3B0cltpbnNlcnRfbnVtLWstMV0gKi8KKworCQkJZGMgPSBCX05fQ0hJTEQoU19uZXcsIDApOworCQkJcHV0X2RjX3NpemUoZGMsCisJCQkJICAgIChNQVhfQ0hJTERfU0laRQorCQkJCSAgICAgKGluc2VydF9wdHJbaW5zZXJ0X251bSAtIGsgLSAxXSkgLQorCQkJCSAgICAgQl9GUkVFX1NQQUNFKGluc2VydF9wdHIKKwkJCQkJCSAgW2luc2VydF9udW0gLSBrIC0gMV0pKSk7CisJCQlwdXRfZGNfYmxvY2tfbnVtYmVyKGRjLAorCQkJCQkgICAgaW5zZXJ0X3B0cltpbnNlcnRfbnVtIC0gayAtCisJCQkJCQkgICAgICAgMV0tPmJfYmxvY2tucik7CisKKwkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSh0YiwgU19uZXcsIDApOworCisJCQlpbnNlcnRfbnVtIC09IChrICsgMSk7CisJCX0KKwkJLyogbmV3X2luc2VydF9wdHIgPSBub2RlX3BvaW50ZXIgdG8gU19uZXcgKi8KKwkJbmV3X2luc2VydF9wdHIgPSBTX25ldzsKKworCQlSRkFMU0UoIWJ1ZmZlcl9qb3VybmFsZWQoU19uZXcpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KFNfbmV3KQorCQkgICAgICAgfHwgYnVmZmVyX2RpcnR5KFNfbmV3KSwgImNtLTAwMDAxOiBiYWQgU19uZXcgKCViKSIsCisJCSAgICAgICBTX25ldyk7CisKKwkJLy8gU19uZXcgaXMgcmVsZWFzZWQgaW4gdW5maXhfbm9kZXMKKwl9CisKKwluID0gQl9OUl9JVEVNUyh0YlNoKTsJLypudW1iZXIgb2YgaXRlbXMgaW4gU1toXSAqLworCisJaWYgKDAgPD0gY2hpbGRfcG9zICYmIGNoaWxkX3BvcyA8PSBuICYmIGluc2VydF9udW0gPiAwKSB7CisJCWJpLnRiID0gdGI7CisJCWJpLmJpX2JoID0gdGJTaDsKKwkJYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIGgpOworCQliaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTih0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzKCZiaSwJLyp0YlNoLCAqLworCQkJCSAgICAgICAvKiAgICAgICAgICAoIHRiLT5TW2gtMV0tPmJfcGFyZW50ID09IHRiLT5TW2hdICkgPyB0Yi0+U1toLTFdLT5iX25leHQgOiAgdGItPlNbaF0tPmJfY2hpbGQtPmJfbmV4dCwgKi8KKwkJCQkgICAgICAgY2hpbGRfcG9zLCBpbnNlcnRfbnVtLCBpbnNlcnRfa2V5LAorCQkJCSAgICAgICBpbnNlcnRfcHRyKTsKKwl9CisKKwltZW1jcHkobmV3X2luc2VydF9rZXlfYWRkciwgJm5ld19pbnNlcnRfa2V5LCBLRVlfU0laRSk7CiAJaW5zZXJ0X3B0clswXSA9IG5ld19pbnNlcnRfcHRyOwogCiAJcmV0dXJuIG9yZGVyOwotICAgIH0KLQotICAKLSAgICAKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCmluZGV4IDI3MTFkZmYuLjFhYWYyYzcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lub2RlLmMKKysrIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpAQCAtMTgsMTA3ICsxOCwxMDkgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCi1leHRlcm4gaW50IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsgLyogZGVmYXVsdCBpbyBzaXplIGRldnVuZWQgaW4gc3VwZXIuYyAqLworZXh0ZXJuIGludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CS8qIGRlZmF1bHQgaW8gc2l6ZSBkZXZ1bmVkIGluIHN1cGVyLmMgKi8KIAogc3RhdGljIGludCByZWlzZXJmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOworCQkJCSB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CiBzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOwogCi12b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit2b2lkIHJlaXNlcmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSBxdW90YSB1cGRhdGUgKHBvc3NpYmx5IGRlbGV0ZSkgKi8KLSAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiAqIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkgcXVvdGEgdXBkYXRlIChwb3NzaWJseSBkZWxldGUpICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArCisJICAgIDIgKiBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYik7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKIAotICAgIC8qIFRoZSA9IDAgaGFwcGVucyB3aGVuIHdlIGFib3J0IGNyZWF0aW5nIGEgbmV3IGlub2RlIGZvciBzb21lIHJlYXNvbiBsaWtlIGxhY2sgb2Ygc3BhY2UuLiAqLwotICAgIGlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpICYmIElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkICE9IDApIHsgLyogYWxzbyBoYW5kbGVzIGJhZF9pbm9kZSBjYXNlICovCi0JZG93biAoJmlub2RlLT5pX3NlbSk7IAorCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCi0JcmVpc2VyZnNfZGVsZXRlX3hhdHRycyAoaW5vZGUpOworCS8qIFRoZSA9IDAgaGFwcGVucyB3aGVuIHdlIGFib3J0IGNyZWF0aW5nIGEgbmV3IGlub2RlIGZvciBzb21lIHJlYXNvbiBsaWtlIGxhY2sgb2Ygc3BhY2UuLiAqLworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpICYmIElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkICE9IDApIHsJLyogYWxzbyBoYW5kbGVzIGJhZF9pbm9kZSBjYXNlICovCisJCWRvd24oJmlub2RlLT5pX3NlbSk7CiAKLQlpZiAoam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7Ci0JICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKLQkgICAgZ290byBvdXQ7CisJCXJlaXNlcmZzX2RlbGV0ZV94YXR0cnMoaW5vZGUpOworCisJCWlmIChqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKKwkJCXVwKCZpbm9kZS0+aV9zZW0pOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKworCQlpZiAocmVpc2VyZnNfZGVsZXRlX29iamVjdCgmdGgsIGlub2RlKSkgeworCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIERvIHF1b3RhIHVwZGF0ZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiBmb3Igam91cm5hbGVkIHF1b3Rhcy4gV2UgbXVzdCBkbyB0aGF0CisJCSAqIGFmdGVyIGRlbGV0ZV9vYmplY3Qgc28gdGhhdCBxdW90YSB1cGRhdGVzIGdvIGludG8gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKwkJICogc3RhdCBkYXRhIGRlbGV0aW9uICovCisJCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCisJCWlmIChqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisKKwkJLyogYWxsIGl0ZW1zIG9mIGZpbGUgYXJlIGRlbGV0ZWQsIHNvIHdlIGNhbiByZW1vdmUgInNhdmUiIGxpbmsgKi8KKwkJcmVtb3ZlX3NhdmVfbGluayhpbm9kZSwgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsJLyogd2UgY2FuJ3QgZG8gYW55dGhpbmcKKwkJCQkJCQkJICogYWJvdXQgYW4gZXJyb3IgaGVyZSAqLworCX0gZWxzZSB7CisJCS8qIG5vIG9iamVjdCBpdGVtcyBhcmUgaW4gdGhlIHRyZWUgKi8KKwkJOwogCX0KLQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLQotCWlmIChyZWlzZXJmc19kZWxldGVfb2JqZWN0ICgmdGgsIGlub2RlKSkgewotCSAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0JICAgIGdvdG8gb3V0OwotCX0KLQotCS8qIERvIHF1b3RhIHVwZGF0ZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiBmb3Igam91cm5hbGVkIHF1b3Rhcy4gV2UgbXVzdCBkbyB0aGF0Ci0JICogYWZ0ZXIgZGVsZXRlX29iamVjdCBzbyB0aGF0IHF1b3RhIHVwZGF0ZXMgZ28gaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcwotCSAqIHN0YXQgZGF0YSBkZWxldGlvbiAqLwotCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOwotCi0JaWYgKGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKLQkgICAgdXAgKCZpbm9kZS0+aV9zZW0pOwotCSAgICBnb3RvIG91dDsKLQl9Ci0KLSAgICAgICAgdXAgKCZpbm9kZS0+aV9zZW0pOwotCi0gICAgICAgIC8qIGFsbCBpdGVtcyBvZiBmaWxlIGFyZSBkZWxldGVkLCBzbyB3ZSBjYW4gcmVtb3ZlICJzYXZlIiBsaW5rICovCi0JcmVtb3ZlX3NhdmVfbGluayAoaW5vZGUsIDAvKiBub3QgdHJ1bmNhdGUgKi8pOyAvKiB3ZSBjYW4ndCBkbyBhbnl0aGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFib3V0IGFuIGVycm9yIGhlcmUgKi8KLSAgICB9IGVsc2UgewotCS8qIG5vIG9iamVjdCBpdGVtcyBhcmUgaW4gdGhlIHRyZWUgKi8KLQk7Ci0gICAgfQotb3V0OgotICAgIGNsZWFyX2lub2RlIChpbm9kZSk7IC8qIG5vdGUgdGhpcyBtdXN0IGdvIGFmdGVyIHRoZSBqb3VybmFsX2VuZCB0byBwcmV2ZW50IGRlYWRsb2NrICovCi0gICAgaW5vZGUtPmlfYmxvY2tzID0gMDsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgICAgb3V0OgorCWNsZWFyX2lub2RlKGlub2RlKTsJLyogbm90ZSB0aGlzIG11c3QgZ28gYWZ0ZXIgdGhlIGpvdXJuYWxfZW5kIHRvIHByZXZlbnQgZGVhZGxvY2sgKi8KKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CiB9CiAKLXN0YXRpYyB2b2lkIF9tYWtlX2NwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBpbnQgdmVyc2lvbiwgX191MzIgZGlyaWQsIF9fdTMyIG9iamVjdGlkLCAKLQkgICAgICAgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGggKQorc3RhdGljIHZvaWQgX21ha2VfY3B1X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5LCBpbnQgdmVyc2lvbiwgX191MzIgZGlyaWQsCisJCQkgIF9fdTMyIG9iamVjdGlkLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCkKIHsKLSAgICBrZXktPnZlcnNpb24gPSB2ZXJzaW9uOworCWtleS0+dmVyc2lvbiA9IHZlcnNpb247CiAKLSAgICBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaWQ7Ci0gICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gb2JqZWN0aWQ7Ci0gICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKGtleSwgb2Zmc2V0KTsKLSAgICBzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgdHlwZSk7ICAKLSAgICBrZXktPmtleV9sZW5ndGggPSBsZW5ndGg7CisJa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRpcmlkOworCWtleS0+b25fZGlza19rZXkua19vYmplY3RpZCA9IG9iamVjdGlkOworCXNldF9jcHVfa2V5X2tfb2Zmc2V0KGtleSwgb2Zmc2V0KTsKKwlzZXRfY3B1X2tleV9rX3R5cGUoa2V5LCB0eXBlKTsKKwlrZXktPmtleV9sZW5ndGggPSBsZW5ndGg7CiB9CiAKLQogLyogdGFrZSBiYXNlIG9mIGlub2RlX2tleSAoaXQgY29tZXMgZnJvbSBpbm9kZSBhbHdheXMpIChkaXJpZCwgb2JqZWN0aWQpIGFuZCB2ZXJzaW9uIGZyb20gYW4gaW5vZGUsIHNldAogICAgb2Zmc2V0IGFuZCB0eXBlIG9mIGtleSAqLwotdm9pZCBtYWtlX2NwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IG9mZnNldCwKLQkgICAgICBpbnQgdHlwZSwgaW50IGxlbmd0aCApCit2b2lkIG1ha2VfY3B1X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LAorCQkgIGludCB0eXBlLCBpbnQgbGVuZ3RoKQogewotICBfbWFrZV9jcHVfa2V5IChrZXksIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSksIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKSwKLQkJIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQpLCAKLQkJIG9mZnNldCwgdHlwZSwgbGVuZ3RoKTsKKwlfbWFrZV9jcHVfa2V5KGtleSwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAorCQkgICAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpLAorCQkgICAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCksIG9mZnNldCwgdHlwZSwKKwkJICAgICAgbGVuZ3RoKTsKIH0KIAotCiAvLwogLy8gd2hlbiBrZXkgaXMgMCwgZG8gbm90IHNldCB2ZXJzaW9uIGFuZCBzaG9ydCBrZXkKIC8vCi1pbmxpbmUgdm9pZCBtYWtlX2xlX2l0ZW1faGVhZCAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwKLQkJCSAgICAgICBpbnQgdmVyc2lvbiwKLQkJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCwgCi0JCQkgICAgICAgaW50IGVudHJ5X2NvdW50LypvciBpaF9mcmVlX3NwYWNlKi8pCitpbmxpbmUgdm9pZCBtYWtlX2xlX2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCSAgICAgIGludCB2ZXJzaW9uLAorCQkJICAgICAgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGgsCisJCQkgICAgICBpbnQgZW50cnlfY291bnQgLypvciBpaF9mcmVlX3NwYWNlICovICkKIHsKLSAgICBpZiAoa2V5KSB7Ci0JaWgtPmloX2tleS5rX2Rpcl9pZCA9IGNwdV90b19sZTMyIChrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkKTsKLQlpaC0+aWhfa2V5Lmtfb2JqZWN0aWQgPSBjcHVfdG9fbGUzMiAoa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKLSAgICB9Ci0gICAgcHV0X2loX3ZlcnNpb24oIGloLCB2ZXJzaW9uICk7Ci0gICAgc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgb2Zmc2V0KTsKLSAgICBzZXRfbGVfaWhfa190eXBlIChpaCwgdHlwZSk7Ci0gICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgbGVuZ3RoICk7Ci0gICAgLyogICAgc2V0X2loX2ZyZWVfc3BhY2UgKGloLCAwKTsqLwotICAgIC8vIGZvciBkaXJlY3RvcnkgaXRlbXMgaXQgaXMgZW50cnkgY291bnQsIGZvciBkaXJlY3RzIGFuZCBzdGF0Ci0gICAgLy8gZGF0YXMgLSAweGZmZmYsIGZvciBpbmRpcmVjdHMgLSAwCi0gICAgcHV0X2loX2VudHJ5X2NvdW50KCBpaCwgZW50cnlfY291bnQgKTsKKwlpZiAoa2V5KSB7CisJCWloLT5paF9rZXkua19kaXJfaWQgPSBjcHVfdG9fbGUzMihrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkKTsKKwkJaWgtPmloX2tleS5rX29iamVjdGlkID0KKwkJICAgIGNwdV90b19sZTMyKGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCk7CisJfQorCXB1dF9paF92ZXJzaW9uKGloLCB2ZXJzaW9uKTsKKwlzZXRfbGVfaWhfa19vZmZzZXQoaWgsIG9mZnNldCk7CisJc2V0X2xlX2loX2tfdHlwZShpaCwgdHlwZSk7CisJcHV0X2loX2l0ZW1fbGVuKGloLCBsZW5ndGgpOworCS8qICAgIHNldF9paF9mcmVlX3NwYWNlIChpaCwgMCk7ICovCisJLy8gZm9yIGRpcmVjdG9yeSBpdGVtcyBpdCBpcyBlbnRyeSBjb3VudCwgZm9yIGRpcmVjdHMgYW5kIHN0YXQKKwkvLyBkYXRhcyAtIDB4ZmZmZiwgZm9yIGluZGlyZWN0cyAtIDAKKwlwdXRfaWhfZW50cnlfY291bnQoaWgsIGVudHJ5X2NvdW50KTsKIH0KIAogLy8KQEAgLTE1Myw4NCArMTU1LDg0IEBACiAqKiB0byBiZSB1bm1hcHBlZCwgc28gdGhhdCBibG9ja19wcmVwYXJlX3dyaXRlIHdpbGwgY29ycmVjdGx5IGNhbGwKICoqIHJlaXNlcmZzX2dldF9ibG9jayB0byBjb252ZXJ0IHRoZSB0YWlsIGludG8gYW4gdW5mb3JtYXR0ZWQgbm9kZQogKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHN0cnVjdCBwYWdlICpwYWdlKSB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqbmV4dCwgKmJoIDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKm5leHQsICpiaDsKIAotICAgIGlmIChwYWdlICYmIHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKLQloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsKLQliaCA9IGhlYWQgOwotCWRvIHsKLQkgICAgbmV4dCA9IGJoLT5iX3RoaXNfcGFnZSA7Ci0JICAgIGlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yID09IDApIHsKLQkgICAgICAgIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCkgOwotCSAgICB9Ci0JICAgIGJoID0gbmV4dCA7Ci0JfSB3aGlsZSAoYmggIT0gaGVhZCkgOwotICAgIH0KKwlpZiAocGFnZSAmJiBwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWJoID0gaGVhZDsKKwkJZG8geworCQkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yID09IDApIHsKKwkJCQlyZWlzZXJmc191bm1hcF9idWZmZXIoYmgpOworCQkJfQorCQkJYmggPSBuZXh0OworCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwl9CiB9CiAKIC8qIHJlaXNlcmZzX2dldF9ibG9jayBkb2VzIG5vdCBuZWVkIHRvIGFsbG9jYXRlIGEgYmxvY2sgb25seSBpZiBpdCBoYXMgYmVlbgogICAgZG9uZSBhbHJlYWR5IG9yIG5vbi1ob2xlIHBvc2l0aW9uIGhhcyBiZWVuIGZvdW5kIGluIHRoZSBpbmRpcmVjdCBpdGVtICovCi1zdGF0aWMgaW5saW5lIGludCBhbGxvY2F0aW9uX25lZWRlZCAoaW50IHJldHZhbCwgYl9ibG9ja25yX3QgYWxsb2NhdGVkLCAKLQkJCQkgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwKLQkJCQkgICAgIF9fbGUzMiAqIGl0ZW0sIGludCBwb3NfaW5faXRlbSkKK3N0YXRpYyBpbmxpbmUgaW50IGFsbG9jYXRpb25fbmVlZGVkKGludCByZXR2YWwsIGJfYmxvY2tucl90IGFsbG9jYXRlZCwKKwkJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqaWgsCisJCQkJICAgIF9fbGUzMiAqIGl0ZW0sIGludCBwb3NfaW5faXRlbSkKIHsKLSAgaWYgKGFsbG9jYXRlZCkKLQkgcmV0dXJuIDA7Ci0gIGlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQgJiYgaXNfaW5kaXJlY3RfbGVfaWggKGloKSAmJiAKLSAgICAgIGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pKQotCSByZXR1cm4gMDsKLSAgcmV0dXJuIDE7CisJaWYgKGFsbG9jYXRlZCkKKwkJcmV0dXJuIDA7CisJaWYgKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCAmJiBpc19pbmRpcmVjdF9sZV9paChpaCkgJiYKKwkgICAgZ2V0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSkpCisJCXJldHVybiAwOworCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpbmRpcmVjdF9pdGVtX2ZvdW5kIChpbnQgcmV0dmFsLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgpCitzdGF0aWMgaW5saW5lIGludCBpbmRpcmVjdF9pdGVtX2ZvdW5kKGludCByZXR2YWwsIHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICByZXR1cm4gKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgJiYgaXNfaW5kaXJlY3RfbGVfaWggKGloKTsKKwlyZXR1cm4gKHJldHZhbCA9PSBQT1NJVElPTl9GT1VORCkgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxvY2tfZGV2X21hcHBlZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIAotCQkJCQkgYl9ibG9ja25yX3QgYmxvY2ssIHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9ibG9ja19kZXZfbWFwcGVkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCWJfYmxvY2tucl90IGJsb2NrLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCW1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIGJsb2NrKTsKIH0KIAotCiAvLwogLy8gZmlsZXMgd2hpY2ggd2VyZSBjcmVhdGVkIGluIHRoZSBlYXJsaWVyIHZlcnNpb24gY2FuIG5vdCBiZSBsb25nZXIsCiAvLyB0aGFuIDIgZ2IKIC8vCi1zdGF0aWMgaW50IGZpbGVfY2FwYWJsZSAoc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2spCitzdGF0aWMgaW50IGZpbGVfY2FwYWJsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrKQogewotICAgIGlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUpICE9IEtFWV9GT1JNQVRfM181IHx8IC8vIGl0IGlzIG5ldyBmaWxlLgotCWJsb2NrIDwgKDEgPDwgKDMxIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpKSkgLy8gb2xkIGZpbGUsIGJ1dCAnYmxvY2snIGlzIGluc2lkZSBvZiAyZ2IKLQlyZXR1cm4gMTsKKwlpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpICE9IEtFWV9GT1JNQVRfM181IHx8CS8vIGl0IGlzIG5ldyBmaWxlLgorCSAgICBibG9jayA8ICgxIDw8ICgzMSAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkpCS8vIG9sZCBmaWxlLCBidXQgJ2Jsb2NrJyBpcyBpbnNpZGUgb2YgMmdiCisJCXJldHVybiAxOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIC8qc3RhdGljKi8gaW50IHJlc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpIHsKLSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXIgOwotICBpbnQgbGVuID0gdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCA7Ci0gIGludCBlcnI7CisJCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CisJaW50IGxlbiA9IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQ7CisJaW50IGVycjsKIAotICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gIEJVR19PTiAoIXRoLT50X3JlZmNvdW50KTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKIAotICAvKiB3ZSBjYW5ub3QgcmVzdGFydCB3aGlsZSBuZXN0ZWQgKi8KLSAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgcmV0dXJuIDAgIDsKLSAgfQotICBwYXRocmVsc2UocGF0aCkgOwotICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7Ci0gIGVyciA9IGpvdXJuYWxfZW5kKHRoLCBzLCBsZW4pIDsKLSAgaWYgKCFlcnIpIHsKLSAgICAgIGVyciA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogNikgOwotICAgICAgaWYgKCFlcnIpCi0gICAgICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICB9Ci0gIHJldHVybiBlcnI7CisJLyogd2UgY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCisJaWYgKHRoLT50X3JlZmNvdW50ID4gMSkgeworCQlyZXR1cm4gMDsKKwl9CisJcGF0aHJlbHNlKHBhdGgpOworCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCWVyciA9IGpvdXJuYWxfZW5kKHRoLCBzLCBsZW4pOworCWlmICghZXJyKSB7CisJCWVyciA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogNik7CisJCWlmICghZXJyKQorCQkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKIH0KIAogLy8gaXQgaXMgY2FsbGVkIGJ5IGdldF9ibG9jayB3aGVuIGNyZWF0ZSA9PSAwLiBSZXR1cm5zIGJsb2NrIG51bWJlcgpAQCAtMjQxLDE4MSArMjQzLDE5MiBAQAogLy8gUGxlYXNlIGltcHJvdmUgdGhlIGVuZ2xpc2gvY2xhcml0eSBpbiB0aGUgY29tbWVudCBhYm92ZSwgYXMgaXQgaXMKIC8vIGhhcmQgdG8gdW5kZXJzdGFuZC4KIAotc3RhdGljIGludCBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9uZyBibG9jaywKLQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LAotCQkJCSBpbnQgYXJncykKK3N0YXRpYyBpbnQgX2dldF9ibG9ja19jcmVhdGVfMChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgYXJncykKIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHRtcF9paDsKLSAgICBpbnQgZnNfZ2VuIDsKLSAgICBpbnQgYmxvY2tucjsKLSAgICBjaGFyICogcCA9IE5VTEw7Ci0gICAgaW50IGNoYXJzOwotICAgIGludCByZXQgOwotICAgIGludCBkb25lID0gMCA7Ci0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgOworCUlOSVRJQUxJWkVfUEFUSChwYXRoKTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loOworCWludCBmc19nZW47CisJaW50IGJsb2NrbnI7CisJY2hhciAqcCA9IE5VTEw7CisJaW50IGNoYXJzOworCWludCByZXQ7CisJaW50IHJlc3VsdDsKKwlpbnQgZG9uZSA9IDA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAKLSAgICAvLyBwcmVwYXJlIHRoZSBrZXkgdG8gbG9vayBmb3IgdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZQotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsCi0JCSAgKGxvZmZfdClibG9jayAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIDEsIFRZUEVfQU5ZLCAzKTsKKwkvLyBwcmVwYXJlIHRoZSBrZXkgdG8gbG9vayBmb3IgdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZQorCW1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwKKwkJICAgICAobG9mZl90KSBibG9jayAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIDEsIFRZUEVfQU5ZLAorCQkgICAgIDMpOwogCi1yZXNlYXJjaDoKLSAgICBpZiAoc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCkgIT0gUE9TSVRJT05fRk9VTkQpIHsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLSAgICAgICAgaWYgKHApCi0gICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLQkvLyBXZSBkbyBub3QgcmV0dXJuIC1FTk9FTlQgaWYgdGhlcmUgaXMgYSBob2xlIGJ1dCBwYWdlIGlzIHVwdG9kYXRlLCBiZWNhdXNlIGl0IG1lYW5zCi0JLy8gVGhhdCB0aGVyZSBpcyBzb21lIE1NQVBFRCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGlzIHlldCB0byBiZSB3cml0dGVuIHRvIGRpc2suCi0JaWYgKChhcmdzICYgR0VUX0JMT0NLX05PX0hPTEUpICYmICFQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpICkgewotCSAgICByZXR1cm4gLUVOT0VOVCA7CisgICAgICByZXNlYXJjaDoKKwlyZXN1bHQgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXN1bHQgIT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJaWYgKHApCisJCQlrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlpZiAocmVzdWx0ID09IElPX0VSUk9SKQorCQkJcmV0dXJuIC1FSU87CisJCS8vIFdlIGRvIG5vdCByZXR1cm4gLUVOT0VOVCBpZiB0aGVyZSBpcyBhIGhvbGUgYnV0IHBhZ2UgaXMgdXB0b2RhdGUsIGJlY2F1c2UgaXQgbWVhbnMKKwkJLy8gVGhhdCB0aGVyZSBpcyBzb21lIE1NQVBFRCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGlzIHlldCB0byBiZSB3cml0dGVuIHRvIGRpc2suCisJCWlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKQorCQkgICAgJiYgIVBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCXJldHVybiAwOwogCX0KLSAgICAgICAgcmV0dXJuIDAgOwotICAgIH0KLSAgICAKLSAgICAvLwotICAgIGJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKLSAgICBpaCA9IGdldF9paCAoJnBhdGgpOwotICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAoaWgpKSB7Ci0JX19sZTMyICogaW5kX2l0ZW0gPSAoX19sZTMyICopQl9JX1BJVEVNIChiaCwgaWgpOwotCQotCS8qIEZJWE1FOiBoZXJlIHdlIGNvdWxkIGNhY2hlIGluZGlyZWN0IGl0ZW0gb3IgcGFydCBvZiBpdCBpbgotCSAgIHRoZSBpbm9kZSB0byBhdm9pZCBzZWFyY2hfYnlfa2V5IGluIGNhc2Ugb2Ygc3Vic2VxdWVudAotCSAgIGFjY2VzcyB0byBmaWxlICovCi0JYmxvY2tuciA9IGdldF9ibG9ja19udW0oaW5kX2l0ZW0sIHBhdGgucG9zX2luX2l0ZW0pIDsKLQlyZXQgPSAwIDsKLQlpZiAoYmxvY2tucikgewotCSAgICBtYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgYmxvY2tucik7Ci0JICAgIGlmIChwYXRoLnBvc19pbl9pdGVtID09ICgoaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUpIC0gMSkpIHsKLQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOwotCSAgICB9Ci0JfSBlbHNlIAotCSAgICAvLyBXZSBkbyBub3QgcmV0dXJuIC1FTk9FTlQgaWYgdGhlcmUgaXMgYSBob2xlIGJ1dCBwYWdlIGlzIHVwdG9kYXRlLCBiZWNhdXNlIGl0IG1lYW5zCi0JICAgIC8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gIGJlIHdyaXR0ZW4gdG8gZGlzay4KLQkgICAgaWYgKChhcmdzICYgR0VUX0JMT0NLX05PX0hPTEUpICYmICFQYWdlVXB0b2RhdGUoYmhfcmVzdWx0LT5iX3BhZ2UpICkgewotCSAgICByZXQgPSAtRU5PRU5UIDsKLQkgICAgfQorCS8vCisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJaWggPSBnZXRfaWgoJnBhdGgpOworCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpIHsKKwkJX19sZTMyICppbmRfaXRlbSA9IChfX2xlMzIgKikgQl9JX1BJVEVNKGJoLCBpaCk7CiAKLQlwYXRocmVsc2UgKCZwYXRoKTsKLSAgICAgICAgaWYgKHApCi0gICAgICAgICAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKLQlyZXR1cm4gcmV0IDsKLSAgICB9CisJCS8qIEZJWE1FOiBoZXJlIHdlIGNvdWxkIGNhY2hlIGluZGlyZWN0IGl0ZW0gb3IgcGFydCBvZiBpdCBpbgorCQkgICB0aGUgaW5vZGUgdG8gYXZvaWQgc2VhcmNoX2J5X2tleSBpbiBjYXNlIG9mIHN1YnNlcXVlbnQKKwkJICAgYWNjZXNzIHRvIGZpbGUgKi8KKwkJYmxvY2tuciA9IGdldF9ibG9ja19udW0oaW5kX2l0ZW0sIHBhdGgucG9zX2luX2l0ZW0pOworCQlyZXQgPSAwOworCQlpZiAoYmxvY2tucikgeworCQkJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGJsb2NrbnIpOworCQkJaWYgKHBhdGgucG9zX2luX2l0ZW0gPT0KKwkJCSAgICAoKGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFKSAtIDEpKSB7CisJCQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOworCQkJfQorCQl9IGVsc2UKKwkJCS8vIFdlIGRvIG5vdCByZXR1cm4gLUVOT0VOVCBpZiB0aGVyZSBpcyBhIGhvbGUgYnV0IHBhZ2UgaXMgdXB0b2RhdGUsIGJlY2F1c2UgaXQgbWVhbnMKKwkJCS8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gIGJlIHdyaXR0ZW4gdG8gZGlzay4KKwkJaWYgKChhcmdzICYgR0VUX0JMT0NLX05PX0hPTEUpCisJCQkgICAgJiYgIVBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKKwkJCXJldCA9IC1FTk9FTlQ7CisJCX0KIAotICAgIC8vIHJlcXVlc3RlZCBkYXRhIGFyZSBpbiBkaXJlY3QgaXRlbShzKQotICAgIGlmICghKGFyZ3MgJiBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpKSB7Ci0JLy8gd2UgYXJlIGNhbGxlZCBieSBibWFwLiBGSVhNRTogd2UgY2FuIG5vdCBtYXAgYmxvY2sgb2YgZmlsZQotCS8vIHdoZW4gaXQgaXMgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCi0JcGF0aHJlbHNlICgmcGF0aCk7CQotICAgICAgICBpZiAocCkKLSAgICAgICAgICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOwotCXJldHVybiAtRU5PRU5UOwotICAgIH0KKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJaWYgKHApCisJCQlrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlyZXR1cm4gcmV0OworCX0KKwkvLyByZXF1ZXN0ZWQgZGF0YSBhcmUgaW4gZGlyZWN0IGl0ZW0ocykKKwlpZiAoIShhcmdzICYgR0VUX0JMT0NLX1JFQURfRElSRUNUKSkgeworCQkvLyB3ZSBhcmUgY2FsbGVkIGJ5IGJtYXAuIEZJWE1FOiB3ZSBjYW4gbm90IG1hcCBibG9jayBvZiBmaWxlCisJCS8vIHdoZW4gaXQgaXMgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCWlmIChwKQorCQkJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQogCi0gICAgLyogaWYgd2UndmUgZ290IGEgZGlyZWN0IGl0ZW0sIGFuZCB0aGUgYnVmZmVyIG9yIHBhZ2Ugd2FzIHVwdG9kYXRlLAotICAgICoqIHdlIGRvbid0IHdhbnQgdG8gcHVsbCBkYXRhIG9mZiBkaXNrIGFnYWluLiAgc2tpcCB0byB0aGUKLSAgICAqKiBlbmQsIHdoZXJlIHdlIG1hcCB0aGUgYnVmZmVyIGFuZCByZXR1cm4KLSAgICAqLwotICAgIGlmIChidWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KSkgewotICAgICAgICBnb3RvIGZpbmlzaGVkIDsKLSAgICB9IGVsc2UgCi0JLyoKLQkqKiBncmFiX3RhaWxfcGFnZSBjYW4gdHJpZ2dlciBjYWxscyB0byByZWlzZXJmc19nZXRfYmxvY2sgb24gdXAgdG8gZGF0ZQotCSoqIHBhZ2VzIHdpdGhvdXQgYW55IGJ1ZmZlcnMuICBJZiB0aGUgcGFnZSBpcyB1cCB0byBkYXRlLCB3ZSBkb24ndCB3YW50Ci0JKiogcmVhZCBvbGQgZGF0YSBvZmYgZGlzay4gIFNldCB0aGUgdXAgdG8gZGF0ZSBiaXQgb24gdGhlIGJ1ZmZlciBpbnN0ZWFkCi0JKiogYW5kIGp1bXAgdG8gdGhlIGVuZAotCSovCi0JICAgIGlmICghYmhfcmVzdWx0LT5iX3BhZ2UgfHwgUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSkgeworCS8qIGlmIHdlJ3ZlIGdvdCBhIGRpcmVjdCBpdGVtLCBhbmQgdGhlIGJ1ZmZlciBvciBwYWdlIHdhcyB1cHRvZGF0ZSwKKwkgKiogd2UgZG9uJ3Qgd2FudCB0byBwdWxsIGRhdGEgb2ZmIGRpc2sgYWdhaW4uICBza2lwIHRvIHRoZQorCSAqKiBlbmQsIHdoZXJlIHdlIG1hcCB0aGUgYnVmZmVyIGFuZCByZXR1cm4KKwkgKi8KKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKKwkJZ290byBmaW5pc2hlZDsKKwl9IGVsc2UKKwkJLyoKKwkJICoqIGdyYWJfdGFpbF9wYWdlIGNhbiB0cmlnZ2VyIGNhbGxzIHRvIHJlaXNlcmZzX2dldF9ibG9jayBvbiB1cCB0byBkYXRlCisJCSAqKiBwYWdlcyB3aXRob3V0IGFueSBidWZmZXJzLiAgSWYgdGhlIHBhZ2UgaXMgdXAgdG8gZGF0ZSwgd2UgZG9uJ3Qgd2FudAorCQkgKiogcmVhZCBvbGQgZGF0YSBvZmYgZGlzay4gIFNldCB0aGUgdXAgdG8gZGF0ZSBiaXQgb24gdGhlIGJ1ZmZlciBpbnN0ZWFkCisJCSAqKiBhbmQganVtcCB0byB0aGUgZW5kCisJCSAqLworCWlmICghYmhfcmVzdWx0LT5iX3BhZ2UgfHwgUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSkgewogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCk7Ci0JCWdvdG8gZmluaXNoZWQgOwotICAgIH0KLQotICAgIC8vIHJlYWQgZmlsZSB0YWlsIGludG8gcGFydCBvZiBwYWdlCi0gICAgb2Zmc2V0ID0gKGNwdV9rZXlfa19vZmZzZXQoJmtleSkgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7Ci0gICAgZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpIDsKLSAgICBjb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOwotCi0gICAgLyogd2Ugb25seSB3YW50IHRvIGttYXAgaWYgd2UgYXJlIHJlYWRpbmcgdGhlIHRhaWwgaW50byB0aGUgcGFnZS4KLSAgICAqKiB0aGlzIGlzIG5vdCB0aGUgY29tbW9uIGNhc2UsIHNvIHdlIGRvbid0IGttYXAgdW50aWwgd2UgYXJlCi0gICAgKiogc3VyZSB3ZSBuZWVkIHRvLiAgQnV0LCB0aGlzIG1lYW5zIHRoZSBpdGVtIG1pZ2h0IG1vdmUgaWYKLSAgICAqKiBrbWFwIHNjaGVkdWxlcwotICAgICovCi0gICAgaWYgKCFwKSB7Ci0JcCA9IChjaGFyICopa21hcChiaF9yZXN1bHQtPmJfcGFnZSkgOwotCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKLQkgICAgZ290byByZXNlYXJjaDsKKwkJZ290byBmaW5pc2hlZDsKIAl9Ci0gICAgfQotICAgIHAgKz0gb2Zmc2V0IDsKLSAgICBtZW1zZXQgKHAsIDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7Ci0gICAgZG8gewotCWlmICghaXNfZGlyZWN0X2xlX2loIChpaCkpIHsKLQkgICAgQlVHICgpOwotICAgICAgICB9Ci0JLyogbWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgbW9yZSBieXRlcyB0aGFuIGFjdHVhbGx5IGV4aXN0IGluCi0JKiogdGhlIGZpbGUuICBUaGlzIGNhbiBoYXBwZW4gaW4gb2RkIGNhc2VzIHdoZXJlIGlfc2l6ZSBpc24ndAotCSoqIGNvcnJlY3QsIGFuZCB3aGVuIGRpcmVjdCBpdGVtIHBhZGRpbmcgcmVzdWx0cyBpbiBhIGZldyAKLQkqKiBleHRyYSBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3QgaXRlbQotCSovCi0gICAgICAgIGlmICgobGVfaWhfa19vZmZzZXQoaWgpICsgcGF0aC5wb3NfaW5faXRlbSkgPiBpbm9kZS0+aV9zaXplKQotCSAgICBicmVhayA7Ci0JaWYgKChsZV9paF9rX29mZnNldChpaCkgLSAxICsgaWhfaXRlbV9sZW4oaWgpKSA+IGlub2RlLT5pX3NpemUpIHsKLQkgICAgY2hhcnMgPSBpbm9kZS0+aV9zaXplIC0gKGxlX2loX2tfb2Zmc2V0KGloKSAtIDEpIC0gcGF0aC5wb3NfaW5faXRlbTsKLQkgICAgZG9uZSA9IDEgOwotCX0gZWxzZSB7Ci0JICAgIGNoYXJzID0gaWhfaXRlbV9sZW4oaWgpIC0gcGF0aC5wb3NfaW5faXRlbTsKKwkvLyByZWFkIGZpbGUgdGFpbCBpbnRvIHBhcnQgb2YgcGFnZQorCW9mZnNldCA9IChjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOworCWNvcHlfaXRlbV9oZWFkKCZ0bXBfaWgsIGloKTsKKworCS8qIHdlIG9ubHkgd2FudCB0byBrbWFwIGlmIHdlIGFyZSByZWFkaW5nIHRoZSB0YWlsIGludG8gdGhlIHBhZ2UuCisJICoqIHRoaXMgaXMgbm90IHRoZSBjb21tb24gY2FzZSwgc28gd2UgZG9uJ3Qga21hcCB1bnRpbCB3ZSBhcmUKKwkgKiogc3VyZSB3ZSBuZWVkIHRvLiAgQnV0LCB0aGlzIG1lYW5zIHRoZSBpdGVtIG1pZ2h0IG1vdmUgaWYKKwkgKioga21hcCBzY2hlZHVsZXMKKwkgKi8KKwlpZiAoIXApIHsKKwkJcCA9IChjaGFyICopa21hcChiaF9yZXN1bHQtPmJfcGFnZSk7CisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJZ290byByZXNlYXJjaDsKKwkJfQogCX0KLQltZW1jcHkgKHAsIEJfSV9QSVRFTSAoYmgsIGloKSArIHBhdGgucG9zX2luX2l0ZW0sIGNoYXJzKTsKKwlwICs9IG9mZnNldDsKKwltZW1zZXQocCwgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwlkbyB7CisJCWlmICghaXNfZGlyZWN0X2xlX2loKGloKSkgeworCQkJQlVHKCk7CisJCX0KKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgbW9yZSBieXRlcyB0aGFuIGFjdHVhbGx5IGV4aXN0IGluCisJCSAqKiB0aGUgZmlsZS4gIFRoaXMgY2FuIGhhcHBlbiBpbiBvZGQgY2FzZXMgd2hlcmUgaV9zaXplIGlzbid0CisJCSAqKiBjb3JyZWN0LCBhbmQgd2hlbiBkaXJlY3QgaXRlbSBwYWRkaW5nIHJlc3VsdHMgaW4gYSBmZXcgCisJCSAqKiBleHRyYSBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3QgaXRlbQorCQkgKi8KKwkJaWYgKChsZV9paF9rX29mZnNldChpaCkgKyBwYXRoLnBvc19pbl9pdGVtKSA+IGlub2RlLT5pX3NpemUpCisJCQlicmVhazsKKwkJaWYgKChsZV9paF9rX29mZnNldChpaCkgLSAxICsgaWhfaXRlbV9sZW4oaWgpKSA+IGlub2RlLT5pX3NpemUpIHsKKwkJCWNoYXJzID0KKwkJCSAgICBpbm9kZS0+aV9zaXplIC0gKGxlX2loX2tfb2Zmc2V0KGloKSAtIDEpIC0KKwkJCSAgICBwYXRoLnBvc19pbl9pdGVtOworCQkJZG9uZSA9IDE7CisJCX0gZWxzZSB7CisJCQljaGFycyA9IGloX2l0ZW1fbGVuKGloKSAtIHBhdGgucG9zX2luX2l0ZW07CisJCX0KKwkJbWVtY3B5KHAsIEJfSV9QSVRFTShiaCwgaWgpICsgcGF0aC5wb3NfaW5faXRlbSwgY2hhcnMpOwogCi0JaWYgKGRvbmUpIAotCSAgICBicmVhayA7CisJCWlmIChkb25lKQorCQkJYnJlYWs7CiAKLQlwICs9IGNoYXJzOworCQlwICs9IGNoYXJzOwogCi0JaWYgKFBBVEhfTEFTVF9QT1NJVElPTiAoJnBhdGgpICE9IChCX05SX0lURU1TIChiaCkgLSAxKSkKLQkgICAgLy8gd2UgZG9uZSwgaWYgcmVhZCBkaXJlY3QgaXRlbSBpcyBub3QgdGhlIGxhc3QgaXRlbSBvZgotCSAgICAvLyBub2RlIEZJWE1FOiB3ZSBjb3VsZCB0cnkgdG8gY2hlY2sgcmlnaHQgZGVsaW1pdGluZyBrZXkKLQkgICAgLy8gdG8gc2VlIHdoZXRoZXIgZGlyZWN0IGl0ZW0gY29udGludWVzIGluIHRoZSByaWdodAotCSAgICAvLyBuZWlnaGJvciBvciByZWx5IG9uIGlfc2l6ZQotCSAgICBicmVhazsKKwkJaWYgKFBBVEhfTEFTVF9QT1NJVElPTigmcGF0aCkgIT0gKEJfTlJfSVRFTVMoYmgpIC0gMSkpCisJCQkvLyB3ZSBkb25lLCBpZiByZWFkIGRpcmVjdCBpdGVtIGlzIG5vdCB0aGUgbGFzdCBpdGVtIG9mCisJCQkvLyBub2RlIEZJWE1FOiB3ZSBjb3VsZCB0cnkgdG8gY2hlY2sgcmlnaHQgZGVsaW1pdGluZyBrZXkKKwkJCS8vIHRvIHNlZSB3aGV0aGVyIGRpcmVjdCBpdGVtIGNvbnRpbnVlcyBpbiB0aGUgcmlnaHQKKwkJCS8vIG5laWdoYm9yIG9yIHJlbHkgb24gaV9zaXplCisJCQlicmVhazsKIAotCS8vIHVwZGF0ZSBrZXkgdG8gbG9vayBmb3IgdGhlIG5leHQgcGllY2UKLQlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgY3B1X2tleV9rX29mZnNldCAoJmtleSkgKyBjaGFycyk7Ci0JaWYgKHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpICE9IFBPU0lUSU9OX0ZPVU5EKQotCSAgICAvLyB3ZSByZWFkIHNvbWV0aGluZyBmcm9tIHRhaWwsIGV2ZW4gaWYgbm93IHdlIGdvdCBJT19FUlJPUgotCSAgICBicmVhazsKLQliaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7Ci0JaWggPSBnZXRfaWggKCZwYXRoKTsKLSAgICB9IHdoaWxlICgxKTsKKwkJLy8gdXBkYXRlIGtleSB0byBsb29rIGZvciB0aGUgbmV4dCBwaWVjZQorCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgY2hhcnMpOworCQlyZXN1bHQgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQlpZiAocmVzdWx0ICE9IFBPU0lUSU9OX0ZPVU5EKQorCQkJLy8gaS9vIGVycm9yIG1vc3QgbGlrZWx5CisJCQlicmVhazsKKwkJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJCWloID0gZ2V0X2loKCZwYXRoKTsKKwl9IHdoaWxlICgxKTsKIAotICAgIGZsdXNoX2RjYWNoZV9wYWdlKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci0gICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisJZmx1c2hfZGNhY2hlX3BhZ2UoYmhfcmVzdWx0LT5iX3BhZ2UpOworCWt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSk7CiAKLWZpbmlzaGVkOgotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIC8qIHRoaXMgYnVmZmVyIGhhcyB2YWxpZCBkYXRhLCBidXQgaXNuJ3QgdmFsaWQgZm9yIGlvLiAgbWFwcGluZyBpdCB0bwotICAgICAqIGJsb2NrICMwIHRlbGxzIHRoZSByZXN0IG9mIHJlaXNlcmZzIGl0IGp1c3QgaGFzIGEgdGFpbCBpbiBpdAotICAgICAqLwotICAgIG1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCAwKTsKLSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlIChiaF9yZXN1bHQpOwotICAgIHJldHVybiAwOworICAgICAgZmluaXNoZWQ6CisJcGF0aHJlbHNlKCZwYXRoKTsKKworCWlmIChyZXN1bHQgPT0gSU9fRVJST1IpCisJCXJldHVybiAtRUlPOworCisJLyogdGhpcyBidWZmZXIgaGFzIHZhbGlkIGRhdGEsIGJ1dCBpc24ndCB2YWxpZCBmb3IgaW8uICBtYXBwaW5nIGl0IHRvCisJICogYmxvY2sgIzAgdGVsbHMgdGhlIHJlc3Qgb2YgcmVpc2VyZnMgaXQganVzdCBoYXMgYSB0YWlsIGluIGl0CisJICovCisJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIDApOworCXNldF9idWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KTsKKwlyZXR1cm4gMDsKIH0KIAotCiAvLyB0aGlzIGlzIGNhbGxlZCB0byBjcmVhdGUgZmlsZSBtYXAuIFNvLCBfZ2V0X2Jsb2NrX2NyZWF0ZV8wIHdpbGwgbm90CiAvLyByZWFkIGRpcmVjdCBpdGVtCi1zdGF0aWMgaW50IHJlaXNlcmZzX2JtYXAgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKLQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQorc3RhdGljIGludCByZWlzZXJmc19ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQogewotICAgIGlmICghZmlsZV9jYXBhYmxlIChpbm9kZSwgYmxvY2spKQotCXJldHVybiAtRUZCSUc7CisJaWYgKCFmaWxlX2NhcGFibGUoaW5vZGUsIGJsb2NrKSkKKwkJcmV0dXJuIC1FRkJJRzsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIC8qIGRvIG5vdCByZWFkIHRoZSBkaXJlY3QgaXRlbSAqLwotICAgIF9nZXRfYmxvY2tfY3JlYXRlXzAgKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAwKSA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gMDsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkvKiBkbyBub3QgcmVhZCB0aGUgZGlyZWN0IGl0ZW0gKi8KKwlfZ2V0X2Jsb2NrX2NyZWF0ZV8wKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAwKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiAwOwogfQogCiAvKiBzcGVjaWFsIHZlcnNpb24gb2YgZ2V0X2Jsb2NrIHRoYXQgaXMgb25seSB1c2VkIGJ5IGdyYWJfdGFpbF9wYWdlIHJpZ2h0CkBAIC00MzUsOSArNDQ4LDExIEBACiAqKiBkb24ndCB3YW50IHRvIHNlbmQgY3JlYXRlID09IEdFVF9CTE9DS19OT19IT0xFIHRvIHJlaXNlcmZzX2dldF9ibG9jaywgCiAqKiBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbi4KICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX2dldF9ibG9ja19jcmVhdGVfMCAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKSB7Ci0gICAgcmV0dXJuIHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgR0VUX0JMT0NLX05PX0hPTEUpIDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrX2NyZWF0ZV8wKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkgICAgICAgaW50IGNyZWF0ZSkKK3sKKwlyZXR1cm4gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCBHRVRfQkxPQ0tfTk9fSE9MRSk7CiB9CiAKIC8qIFRoaXMgaXMgc3BlY2lhbCBoZWxwZXIgZm9yIHJlaXNlcmZzX2dldF9ibG9jayBpbiBjYXNlIHdlIGFyZSBleGVjdXRpbmcKQEAgLTQ0OCw0NCArNDYzLDQzIEBACiAJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKIAkJCQkJIGludCBjcmVhdGUpCiB7Ci0gICAgaW50IHJldCA7CisJaW50IHJldDsKIAotICAgIGJoX3Jlc3VsdC0+Yl9wYWdlID0gTlVMTDsKKwliaF9yZXN1bHQtPmJfcGFnZSA9IE5VTEw7CiAKLSAgICAvKiBXZSBzZXQgdGhlIGJfc2l6ZSBiZWZvcmUgcmVpc2VyZnNfZ2V0X2Jsb2NrIGNhbGwgc2luY2UgaXQgaXMKLSAgICAgICByZWZlcmVuY2VkIGluIGNvbnZlcnRfdGFpbF9mb3JfaG9sZSgpIHRoYXQgbWF5IGJlIGNhbGxlZCBmcm9tCi0gICAgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrKCkgKi8KLSAgICBiaF9yZXN1bHQtPmJfc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCS8qIFdlIHNldCB0aGUgYl9zaXplIGJlZm9yZSByZWlzZXJmc19nZXRfYmxvY2sgY2FsbCBzaW5jZSBpdCBpcworCSAgIHJlZmVyZW5jZWQgaW4gY29udmVydF90YWlsX2Zvcl9ob2xlKCkgdGhhdCBtYXkgYmUgY2FsbGVkIGZyb20KKwkgICByZWlzZXJmc19nZXRfYmxvY2soKSAqLworCWJoX3Jlc3VsdC0+Yl9zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CiAKLSAgICByZXQgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmhfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgfCBHRVRfQkxPQ0tfTk9fREFOR0xFKSA7Ci0gICAgaWYgKHJldCkKLSAgICAgICAgZ290byBvdXQ7CisJcmV0ID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwKKwkJCQkgY3JlYXRlIHwgR0VUX0JMT0NLX05PX0RBTkdMRSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKLSAgICAvKiBkb24ndCBhbGxvdyBkaXJlY3QgaW8gb250byB0YWlsIHBhZ2VzICovCi0gICAgaWYgKGJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSAmJiBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7Ci0gICAgICAgIC8qIG1ha2Ugc3VyZSBmdXR1cmUgY2FsbHMgdG8gdGhlIGRpcmVjdCBpbyBmdW5jcyBmb3IgdGhpcyBvZmZzZXQKLSAgICAgICAgKiogaW4gdGhlIGZpbGUgZmFpbCBieSB1bm1hcHBpbmcgdGhlIGJ1ZmZlcgotICAgICAgICAqLwotICAgICAgICBjbGVhcl9idWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCk7Ci0gICAgICAgIHJldCA9IC1FSU5WQUwgOwotICAgIH0KLSAgICAvKiBQb3NzaWJsZSB1bnBhY2tlZCB0YWlsLiBGbHVzaCB0aGUgZGF0YSBiZWZvcmUgcGFnZXMgaGF2ZQotICAgICAgIGRpc2FwcGVhcmVkICovCi0gICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgbG9ja19rZXJuZWwoKTsKLSAgICAgICAgZXJyID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSk7Ci0gICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzazsKLSAgICAgICAgdW5sb2NrX2tlcm5lbCgpOwotICAgICAgICBpZiAoZXJyIDwgMCkKLSAgICAgICAgICAgIHJldCA9IGVycjsKLSAgICB9Ci1vdXQ6Ci0gICAgcmV0dXJuIHJldCA7CisJLyogZG9uJ3QgYWxsb3cgZGlyZWN0IGlvIG9udG8gdGFpbCBwYWdlcyAqLworCWlmIChidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgeworCQkvKiBtYWtlIHN1cmUgZnV0dXJlIGNhbGxzIHRvIHRoZSBkaXJlY3QgaW8gZnVuY3MgZm9yIHRoaXMgb2Zmc2V0CisJCSAqKiBpbiB0aGUgZmlsZSBmYWlsIGJ5IHVubWFwcGluZyB0aGUgYnVmZmVyCisJCSAqLworCQljbGVhcl9idWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCS8qIFBvc3NpYmxlIHVucGFja2VkIHRhaWwuIEZsdXNoIHRoZSBkYXRhIGJlZm9yZSBwYWdlcyBoYXZlCisJICAgZGlzYXBwZWFyZWQgKi8KKwlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgeworCQlpbnQgZXJyOworCQlsb2NrX2tlcm5lbCgpOworCQllcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrOworCQl1bmxvY2tfa2VybmVsKCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0ID0gZXJyOworCX0KKyAgICAgIG91dDoKKwlyZXR1cm4gcmV0OwogfQogCi0KIC8qCiAqKiBoZWxwZXIgZnVuY3Rpb24gZm9yIHdoZW4gcmVpc2VyZnNfZ2V0X2Jsb2NrIGlzIGNhbGxlZCBmb3IgYSBob2xlCiAqKiBidXQgdGhlIGZpbGUgdGFpbCBpcyBzdGlsbCBpbiBhIGRpcmVjdCBpdGVtCkBAIC00OTYsNDkwICs1MTAsNTQ3IEBACiAqKiB5b3Ugc2hvdWxkIG5vdCBiZSBpbiBhIHRyYW5zYWN0aW9uLCBvciBoYXZlIGFueSBwYXRocyBoZWxkIHdoZW4geW91CiAqKiBjYWxsIHRoaXMuCiAqLwotc3RhdGljIGludCBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoc3RydWN0IGlub2RlICppbm9kZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKLQkJCQkgbG9mZl90IHRhaWxfb2Zmc2V0KSB7Ci0gICAgdW5zaWduZWQgbG9uZyBpbmRleCA7Ci0gICAgdW5zaWduZWQgbG9uZyB0YWlsX2VuZCA7IAotICAgIHVuc2lnbmVkIGxvbmcgdGFpbF9zdGFydCA7Ci0gICAgc3RydWN0IHBhZ2UgKiB0YWlsX3BhZ2UgOwotICAgIHN0cnVjdCBwYWdlICogaG9sZV9wYWdlID0gYmhfcmVzdWx0LT5iX3BhZ2UgOwotICAgIGludCByZXR2YWwgPSAwIDsKK3N0YXRpYyBpbnQgY29udmVydF90YWlsX2Zvcl9ob2xlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJCSBsb2ZmX3QgdGFpbF9vZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKKwl1bnNpZ25lZCBsb25nIHRhaWxfZW5kOworCXVuc2lnbmVkIGxvbmcgdGFpbF9zdGFydDsKKwlzdHJ1Y3QgcGFnZSAqdGFpbF9wYWdlOworCXN0cnVjdCBwYWdlICpob2xlX3BhZ2UgPSBiaF9yZXN1bHQtPmJfcGFnZTsKKwlpbnQgcmV0dmFsID0gMDsKIAotICAgIGlmICgodGFpbF9vZmZzZXQgJiAoYmhfcmVzdWx0LT5iX3NpemUgLSAxKSkgIT0gMSkgCi0gICAgICAgIHJldHVybiAtRUlPIDsKKwlpZiAoKHRhaWxfb2Zmc2V0ICYgKGJoX3Jlc3VsdC0+Yl9zaXplIC0gMSkpICE9IDEpCisJCXJldHVybiAtRUlPOwogCi0gICAgLyogYWx3YXlzIHRyeSB0byByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCi0gICAgdGFpbF9zdGFydCA9IHRhaWxfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLSAgICB0YWlsX2VuZCA9ICh0YWlsX3N0YXJ0IHwgKGJoX3Jlc3VsdC0+Yl9zaXplIC0gMSkpICsgMSA7CisJLyogYWx3YXlzIHRyeSB0byByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCisJdGFpbF9zdGFydCA9IHRhaWxfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXRhaWxfZW5kID0gKHRhaWxfc3RhcnQgfCAoYmhfcmVzdWx0LT5iX3NpemUgLSAxKSkgKyAxOwogCi0gICAgaW5kZXggPSB0YWlsX29mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUIDsKLSAgICAvKiBob2xlX3BhZ2UgY2FuIGJlIHplcm8gaW4gY2FzZSBvZiBkaXJlY3RfaW8sIHdlIGFyZSBzdXJlCi0gICAgICAgdGhhdCB3ZSBjYW5ub3QgZ2V0IGhlcmUgaWYgd2Ugd3JpdGUgd2l0aCBPX0RJUkVDVCBpbnRvCi0gICAgICAgdGFpbCBwYWdlICovCi0gICAgaWYgKCFob2xlX3BhZ2UgfHwgaW5kZXggIT0gaG9sZV9wYWdlLT5pbmRleCkgewotCXRhaWxfcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCkgOwotCXJldHZhbCA9IC1FTk9NRU07Ci0JaWYgKCF0YWlsX3BhZ2UpIHsKLQkgICAgZ290byBvdXQgOworCWluZGV4ID0gdGFpbF9vZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBob2xlX3BhZ2UgY2FuIGJlIHplcm8gaW4gY2FzZSBvZiBkaXJlY3RfaW8sIHdlIGFyZSBzdXJlCisJICAgdGhhdCB3ZSBjYW5ub3QgZ2V0IGhlcmUgaWYgd2Ugd3JpdGUgd2l0aCBPX0RJUkVDVCBpbnRvCisJICAgdGFpbCBwYWdlICovCisJaWYgKCFob2xlX3BhZ2UgfHwgaW5kZXggIT0gaG9sZV9wYWdlLT5pbmRleCkgeworCQl0YWlsX3BhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlpZiAoIXRhaWxfcGFnZSkgeworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQl0YWlsX3BhZ2UgPSBob2xlX3BhZ2U7CiAJfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRhaWxfcGFnZSA9IGhvbGVfcGFnZSA7Ci0gICAgfQogCi0gICAgLyogd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGNvbnZlcnNpb24gZGlkIG5vdCBoYXBwZW4gd2hpbGUKLSAgICAqKiB3ZSB3ZXJlIGxvY2tpbmcgdGhlIHBhZ2UgYmVjYXVzZSBhbnlvbmUgdGhhdCBjb3VsZCBjb252ZXJ0Ci0gICAgKiogbXVzdCBmaXJzdCB0YWtlIGlfc2VtLgotICAgICoqCi0gICAgKiogV2UgbXVzdCBmaXggdGhlIHRhaWwgcGFnZSBmb3Igd3JpdGluZyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgYnVmZmVycwotICAgICoqIHRoYXQgYXJlIG1hcHBlZCwgYnV0IGhhdmUgYSBibG9jayBudW1iZXIgb2YgMC4gIFRoaXMgaW5kaWNhdGVzIHRhaWwKLSAgICAqKiBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZCBkaXJlY3RseSBpbnRvIHRoZSBwYWdlLCBhbmQgYmxvY2tfcHJlcGFyZV93cml0ZQotICAgICoqIHdvbid0IHRyaWdnZXIgYSBnZXRfYmxvY2sgaW4gdGhpcyBjYXNlLgotICAgICovCi0gICAgZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyh0YWlsX3BhZ2UpIDsKLSAgICByZXR2YWwgPSByZWlzZXJmc19wcmVwYXJlX3dyaXRlKE5VTEwsIHRhaWxfcGFnZSwgdGFpbF9zdGFydCwgdGFpbF9lbmQpOwotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gdW5sb2NrIDsKKwkvKiB3ZSBkb24ndCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgY29udmVyc2lvbiBkaWQgbm90IGhhcHBlbiB3aGlsZQorCSAqKiB3ZSB3ZXJlIGxvY2tpbmcgdGhlIHBhZ2UgYmVjYXVzZSBhbnlvbmUgdGhhdCBjb3VsZCBjb252ZXJ0CisJICoqIG11c3QgZmlyc3QgdGFrZSBpX3NlbS4KKwkgKioKKwkgKiogV2UgbXVzdCBmaXggdGhlIHRhaWwgcGFnZSBmb3Igd3JpdGluZyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgYnVmZmVycworCSAqKiB0aGF0IGFyZSBtYXBwZWQsIGJ1dCBoYXZlIGEgYmxvY2sgbnVtYmVyIG9mIDAuICBUaGlzIGluZGljYXRlcyB0YWlsCisJICoqIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UsIGFuZCBibG9ja19wcmVwYXJlX3dyaXRlCisJICoqIHdvbid0IHRyaWdnZXIgYSBnZXRfYmxvY2sgaW4gdGhpcyBjYXNlLgorCSAqLworCWZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcodGFpbF9wYWdlKTsKKwlyZXR2YWwgPSByZWlzZXJmc19wcmVwYXJlX3dyaXRlKE5VTEwsIHRhaWxfcGFnZSwgdGFpbF9zdGFydCwgdGFpbF9lbmQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gdW5sb2NrOwogCi0gICAgLyogdGFpbCBjb252ZXJzaW9uIG1pZ2h0IGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgcGFnZSAqLwotICAgIGZsdXNoX2RjYWNoZV9wYWdlKHRhaWxfcGFnZSkgOworCS8qIHRhaWwgY29udmVyc2lvbiBtaWdodCBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgKi8KKwlmbHVzaF9kY2FjaGVfcGFnZSh0YWlsX3BhZ2UpOwogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlKE5VTEwsIHRhaWxfcGFnZSwgdGFpbF9zdGFydCwgdGFpbF9lbmQpIDsKKwlyZXR2YWwgPSByZWlzZXJmc19jb21taXRfd3JpdGUoTlVMTCwgdGFpbF9wYWdlLCB0YWlsX3N0YXJ0LCB0YWlsX2VuZCk7CiAKLXVubG9jazoKLSAgICBpZiAodGFpbF9wYWdlICE9IGhvbGVfcGFnZSkgewotICAgICAgICB1bmxvY2tfcGFnZSh0YWlsX3BhZ2UpIDsKLQlwYWdlX2NhY2hlX3JlbGVhc2UodGFpbF9wYWdlKSA7Ci0gICAgfQotb3V0OgotICAgIHJldHVybiByZXR2YWwgOworICAgICAgdW5sb2NrOgorCWlmICh0YWlsX3BhZ2UgIT0gaG9sZV9wYWdlKSB7CisJCXVubG9ja19wYWdlKHRhaWxfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZSh0YWlsX3BhZ2UpOworCX0KKyAgICAgIG91dDoKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBfYWxsb2NhdGVfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICBsb25nIGJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgCi0JCQkgICBiX2Jsb2NrbnJfdCAqYWxsb2NhdGVkX2Jsb2NrX25yLCAKLQkJCSAgIHN0cnVjdCBwYXRoICogcGF0aCwKLQkJCSAgIGludCBmbGFncykgewotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgCisJCQkJICBsb25nIGJsb2NrLAorCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIGJfYmxvY2tucl90ICogYWxsb2NhdGVkX2Jsb2NrX25yLAorCQkJCSAgc3RydWN0IHBhdGggKnBhdGgsIGludCBmbGFncykKK3sKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwogI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCi0gICAgaWYgKCEoZmxhZ3MgJiBHRVRfQkxPQ0tfTk9fSVNFTSkpIHsKLQlyZXR1cm4gcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIHBhdGgsIGJsb2NrKTsKLSAgICB9CisJaWYgKCEoZmxhZ3MgJiBHRVRfQkxPQ0tfTk9fSVNFTSkpIHsKKwkJcmV0dXJuIHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLAorCQkJCQkJICBwYXRoLCBibG9jayk7CisJfQogI2VuZGlmCi0gICAgcmV0dXJuIHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCBwYXRoLCBibG9jayk7CisJcmV0dXJuIHJlaXNlcmZzX25ld191bmZfYmxvY2tucnModGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIHBhdGgsCisJCQkJCSBibG9jayk7CiB9CiAKLWludCByZWlzZXJmc19nZXRfYmxvY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK2ludCByZWlzZXJmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKLSAgICBpbnQgcmVwZWF0LCByZXR2YWwgPSAwOwotICAgIGJfYmxvY2tucl90IGFsbG9jYXRlZF9ibG9ja19uciA9IDA7Ly8gYl9ibG9ja25yX3QgaXMgKHVuc2lnbmVkKSAzMiBiaXQgaW50Ci0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOwotICAgIGludCBwb3NfaW5faXRlbTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsICogdW5iaCA9IE5VTEw7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7Ci0gICAgX19sZTMyICogaXRlbTsKLSAgICBpbnQgZG9uZTsKLSAgICBpbnQgZnNfZ2VuOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gTlVMTDsKLSAgICAvKiBzcGFjZSByZXNlcnZlZCBpbiB0cmFuc2FjdGlvbiBiYXRjaDogCi0gICAgICAgIC4gMyBiYWxhbmNpbmdzIGluIGRpcmVjdC0+aW5kaXJlY3QgY29udmVyc2lvbgotICAgICAgICAuIDEgYmxvY2sgaW52b2x2ZWQgaW50byByZWlzZXJmc191cGRhdGVfc2QoKQotICAgICAgIFhYWCBpbiBwcmFjdGljYWxseSBpbXBvc3NpYmxlIHdvcnN0IGNhc2UgZGlyZWN0MmluZGlyZWN0KCkKLSAgICAgICBjYW4gaW5jdXIgKG11Y2gpIG1vcmUgdGhhbiAzIGJhbGFuY2luZ3MuCi0gICAgICAgcXVvdGEgdXBkYXRlIGZvciB1c2VyLCBncm91cCAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUzsKLSAgICBpbnQgdmVyc2lvbjsKLSAgICBpbnQgZGFuZ2xlID0gMTsKLSAgICBsb2ZmX3QgbmV3X29mZnNldCA9ICgoKGxvZmZfdClibG9jaykgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMSA7CisJaW50IHJlcGVhdCwgcmV0dmFsID0gMDsKKwliX2Jsb2NrbnJfdCBhbGxvY2F0ZWRfYmxvY2tfbnIgPSAwOwkvLyBiX2Jsb2NrbnJfdCBpcyAodW5zaWduZWQpIDMyIGJpdCBpbnQKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJaW50IHBvc19pbl9pdGVtOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqdW5iaCA9IE5VTEw7CisJc3RydWN0IGl0ZW1faGVhZCAqaWgsIHRtcF9paDsKKwlfX2xlMzIgKml0ZW07CisJaW50IGRvbmU7CisJaW50IGZzX2dlbjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7CisJLyogc3BhY2UgcmVzZXJ2ZWQgaW4gdHJhbnNhY3Rpb24gYmF0Y2g6IAorCSAgIC4gMyBiYWxhbmNpbmdzIGluIGRpcmVjdC0+aW5kaXJlY3QgY29udmVyc2lvbgorCSAgIC4gMSBibG9jayBpbnZvbHZlZCBpbnRvIHJlaXNlcmZzX3VwZGF0ZV9zZCgpCisJICAgWFhYIGluIHByYWN0aWNhbGx5IGltcG9zc2libGUgd29yc3QgY2FzZSBkaXJlY3QyaW5kaXJlY3QoKQorCSAgIGNhbiBpbmN1ciAobXVjaCkgbW9yZSB0aGFuIDMgYmFsYW5jaW5ncy4KKwkgICBxdW90YSB1cGRhdGUgZm9yIHVzZXIsIGdyb3VwICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDEgKworCSAgICAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKTsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgZGFuZ2xlID0gMTsKKwlsb2ZmX3QgbmV3X29mZnNldCA9CisJICAgICgoKGxvZmZfdCkgYmxvY2spIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDE7CiAKLQkJCQkvKiBiYWQuLi4uICovCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0gICAgdmVyc2lvbiA9IGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSk7CisJLyogYmFkLi4uLiAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXZlcnNpb24gPSBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSk7CiAKLSAgICBpZiAoYmxvY2sgPCAwKSB7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICBpZiAoIWZpbGVfY2FwYWJsZSAoaW5vZGUsIGJsb2NrKSkgewotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JcmV0dXJuIC1FRkJJRzsKLSAgICB9Ci0KLSAgICAvKiBpZiAhY3JlYXRlLCB3ZSBhcmVuJ3QgY2hhbmdpbmcgdGhlIEZTLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgKiogbG9nIGFueXRoaW5nLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgdHJhbnNhY3Rpb24KLSAgICAqLwotICAgIGlmICghKGNyZWF0ZSAmIEdFVF9CTE9DS19DUkVBVEUpKSB7Ci0JaW50IHJldCA7Ci0JLyogZmluZCBudW1iZXIgb2YgYmxvY2stdGggbG9naWNhbCBibG9jayBvZiB0aGUgZmlsZSAqLwotCXJldCA9IF9nZXRfYmxvY2tfY3JlYXRlXzAgKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgfCBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpIDsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCXJldHVybiByZXQ7Ci0gICAgfQotICAgIC8qCi0gICAgICogaWYgd2UncmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uLCBtYWtlIHN1cmUgdG8gY2xvc2UKLSAgICAgKiBhbnkgbmV3IHRyYW5zYWN0aW9ucyB3ZSBzdGFydCBpbiB0aGlzIGZ1bmMKLSAgICAgKi8KLSAgICBpZiAoKGNyZWF0ZSAmIEdFVF9CTE9DS19OT19EQU5HTEUpIHx8Ci0gICAgICAgIHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKQotICAgICAgICBkYW5nbGUgPSAwOwotCi0gICAgLyogSWYgZmlsZSBpcyBvZiBzdWNoIGEgc2l6ZSwgdGhhdCBpdCBtaWdodCBoYXZlIGEgdGFpbCBhbmQgdGFpbHMgYXJlIGVuYWJsZWQKLSAgICAqKiB3ZSBzaG91bGQgbWFyayBpdCBhcyBwb3NzaWJseSBuZWVkaW5nIHRhaWwgcGFja2luZyBvbiBjbG9zZQotICAgICovCi0gICAgaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAotCSAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCi0JUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9wYWNrX29uX2Nsb3NlX21hc2sgOwotCi0gICAgLyogc2V0IHRoZSBrZXkgb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIG5ld19vZmZzZXQsCi0JCSAgVFlQRV9BTlksIDMvKmtleSBsZW5ndGgqLyk7Ci0gICAgaWYgKChuZXdfb2Zmc2V0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPiBpbm9kZS0+aV9zaXplKSB7Ci1zdGFydF90cmFuczoKLQl0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7Ci0JaWYgKCF0aCkgewotCSAgICByZXR2YWwgPSAtRU5PTUVNOwotCSAgICBnb3RvIGZhaWx1cmU7Ci0JfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIH0KLSByZXNlYXJjaDoKLQotICAgIHJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOwotICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZXR2YWwgPSAtRUlPOwotCWdvdG8gZmFpbHVyZTsKLSAgICB9Ci0JCi0gICAgYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOwotICAgIGloID0gZ2V0X2loICgmcGF0aCk7Ci0gICAgaXRlbSA9IGdldF9pdGVtICgmcGF0aCk7Ci0gICAgcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwotCi0gICAgZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKGlub2RlLT5pX3NiKTsKLSAgICBjb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOwotCi0gICAgaWYgKGFsbG9jYXRpb25fbmVlZGVkIChyZXR2YWwsIGFsbG9jYXRlZF9ibG9ja19uciwgaWgsIGl0ZW0sIHBvc19pbl9pdGVtKSkgewotCS8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgYmxvY2sgZm9yIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCi0JaWYgKCF0aCkgewotCSAgICBwYXRocmVsc2UoJnBhdGgpIDsKLQkgICAgZ290byBzdGFydF90cmFuczsKKwlpZiAoYmxvY2sgPCAwKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJCXJldHVybiAtRUlPOwogCX0KIAotCXJlcGVhdCA9IF9hbGxvY2F0ZV9ibG9jayh0aCwgYmxvY2ssIGlub2RlLCAmYWxsb2NhdGVkX2Jsb2NrX25yLCAmcGF0aCwgY3JlYXRlKTsKLQotCWlmIChyZXBlYXQgPT0gTk9fRElTS19TUEFDRSB8fCByZXBlYXQgPT0gUVVPVEFfRVhDRUVERUQpIHsKLQkgICAgLyogcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gdG8gZ2l2ZSB0aGUgam91cm5hbCBhIGNoYW5jZSB0byBmcmVlCi0JICAgICoqIHNvbWUgYmxvY2tzLiAgcmVsZWFzZXMgdGhlIHBhdGgsIHNvIHdlIGhhdmUgdG8gZ28gYmFjayB0bwotCSAgICAqKiByZXNlYXJjaCBpZiB3ZSBzdWNjZWVkIG9uIHRoZSBzZWNvbmQgdHJ5Ci0JICAgICovCi0JICAgIFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxOwotCSAgICByZXR2YWwgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpIDsKLSAgICAgICAgICAgIGlmIChyZXR2YWwpCi0gICAgICAgICAgICAgICAgZ290byBmYWlsdXJlOwotCSAgICByZXBlYXQgPSBfYWxsb2NhdGVfYmxvY2sodGgsIGJsb2NrLCBpbm9kZSwgJmFsbG9jYXRlZF9ibG9ja19uciwgTlVMTCwgY3JlYXRlKTsKLQotCSAgICBpZiAocmVwZWF0ICE9IE5PX0RJU0tfU1BBQ0UgJiYgcmVwZWF0ICE9IFFVT1RBX0VYQ0VFREVEKSB7Ci0JCWdvdG8gcmVzZWFyY2ggOwotCSAgICB9Ci0JICAgIGlmIChyZXBlYXQgPT0gUVVPVEFfRVhDRUVERUQpCi0JCXJldHZhbCA9IC1FRFFVT1Q7Ci0JICAgIGVsc2UKLQkJcmV0dmFsID0gLUVOT1NQQzsKLQkgICAgZ290byBmYWlsdXJlOworCWlmICghZmlsZV9jYXBhYmxlKGlub2RlLCBibG9jaykpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIC1FRkJJRzsKIAl9CiAKLQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIGdvdG8gcmVzZWFyY2g7CisJLyogaWYgIWNyZWF0ZSwgd2UgYXJlbid0IGNoYW5naW5nIHRoZSBGUywgc28gd2UgZG9uJ3QgbmVlZCB0bworCSAqKiBsb2cgYW55dGhpbmcsIHNvIHdlIGRvbid0IG5lZWQgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbgorCSAqLworCWlmICghKGNyZWF0ZSAmIEdFVF9CTE9DS19DUkVBVEUpKSB7CisJCWludCByZXQ7CisJCS8qIGZpbmQgbnVtYmVyIG9mIGJsb2NrLXRoIGxvZ2ljYWwgYmxvY2sgb2YgdGhlIGZpbGUgKi8KKwkJcmV0ID0gX2dldF9ibG9ja19jcmVhdGVfMChpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwKKwkJCQkJICBjcmVhdGUgfCBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gcmV0OwogCX0KLSAgICB9CisJLyoKKwkgKiBpZiB3ZSdyZSBhbHJlYWR5IGluIGEgdHJhbnNhY3Rpb24sIG1ha2Ugc3VyZSB0byBjbG9zZQorCSAqIGFueSBuZXcgdHJhbnNhY3Rpb25zIHdlIHN0YXJ0IGluIHRoaXMgZnVuYworCSAqLworCWlmICgoY3JlYXRlICYgR0VUX0JMT0NLX05PX0RBTkdMRSkgfHwKKwkgICAgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpCisJCWRhbmdsZSA9IDA7CiAKLSAgICBpZiAoaW5kaXJlY3RfaXRlbV9mb3VuZCAocmV0dmFsLCBpaCkpIHsKLSAgICAgICAgYl9ibG9ja25yX3QgdW5mbV9wdHI7Ci0JLyogJ2Jsb2NrJy10aCBibG9jayBpcyBpbiB0aGUgZmlsZSBhbHJlYWR5ICh0aGVyZSBpcwotCSAgIGNvcnJlc3BvbmRpbmcgY2VsbCBpbiBzb21lIGluZGlyZWN0IGl0ZW0pLiBCdXQgaXQgbWF5IGJlCi0JICAgemVybyB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgKGhvbGUpICovCi0gICAgICAgIHVuZm1fcHRyID0gZ2V0X2Jsb2NrX251bSAoaXRlbSwgcG9zX2luX2l0ZW0pOwotCWlmICh1bmZtX3B0ciA9PSAwKSB7Ci0JICAgIC8qIHVzZSBhbGxvY2F0ZWQgYmxvY2sgdG8gcGx1ZyB0aGUgaG9sZSAqLwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSkgOwotCSAgICBpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCQlnb3RvIHJlc2VhcmNoOwotCSAgICB9Ci0JICAgIHNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7Ci0JICAgIGlmIChidWZmZXJfZGlydHkoYmhfcmVzdWx0KSAmJiByZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpKQotCSAgICAJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmhfcmVzdWx0KTsKLQkgICAgcHV0X2Jsb2NrX251bShpdGVtLCBwb3NfaW5faXRlbSwgYWxsb2NhdGVkX2Jsb2NrX25yKSA7Ci0gICAgICAgICAgICB1bmZtX3B0ciA9IGFsbG9jYXRlZF9ibG9ja19ucjsKLQkgICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgaW5vZGUtPmlfc2IsIGJoKTsKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOworCS8qIElmIGZpbGUgaXMgb2Ygc3VjaCBhIHNpemUsIHRoYXQgaXQgbWlnaHQgaGF2ZSBhIHRhaWwgYW5kIHRhaWxzIGFyZSBlbmFibGVkCisJICoqIHdlIHNob3VsZCBtYXJrIGl0IGFzIHBvc3NpYmx5IG5lZWRpbmcgdGFpbCBwYWNraW5nIG9uIGNsb3NlCisJICovCisJaWYgKChoYXZlX2xhcmdlX3RhaWxzKGlub2RlLT5pX3NiKQorCSAgICAgJiYgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KQorCSAgICB8fCAoaGF2ZV9zbWFsbF90YWlscyhpbm9kZS0+aV9zYikKKwkJJiYgaW5vZGUtPmlfc2l6ZSA8IGlfYmxvY2tfc2l6ZShpbm9kZSkpKQorCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX3BhY2tfb25fY2xvc2VfbWFzazsKKworCS8qIHNldCB0aGUga2V5IG9mIHRoZSBmaXJzdCBieXRlIGluIHRoZSAnYmxvY2snLXRoIGJsb2NrIG9mIGZpbGUgKi8KKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIG5ld19vZmZzZXQsIFRZUEVfQU5ZLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCWlmICgobmV3X29mZnNldCArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4gaW5vZGUtPmlfc2l6ZSkgeworCSAgICAgIHN0YXJ0X3RyYW5zOgorCQl0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmICghdGgpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKIAl9Ci0Jc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCB1bmZtX3B0ciwgaW5vZGUpOwotCXBhdGhyZWxzZSAoJnBhdGgpOwotICAgICAgICByZXR2YWwgPSAwOwotCWlmICghZGFuZ2xlICYmIHRoKQotCSAgICByZXR2YWwgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisgICAgICByZXNlYXJjaDoKIAotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JIAotCS8qIHRoZSBpdGVtIHdhcyBmb3VuZCwgc28gbmV3IGJsb2NrcyB3ZXJlIG5vdCBhZGRlZCB0byB0aGUgZmlsZQotCSoqIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyB1cGRhdGVkIHdpdGggdGhpcyAKLQkqKiB0cmFuc2FjdGlvbgotCSovCi0JcmV0dXJuIHJldHZhbDsKLSAgICB9CisJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZmFpbHVyZTsKKwl9CiAKLSAgICBpZiAoIXRoKSB7Ci0JcGF0aHJlbHNlKCZwYXRoKSA7Ci0JZ290byBzdGFydF90cmFuczsKLSAgICB9CisJYmggPSBnZXRfbGFzdF9iaCgmcGF0aCk7CisJaWggPSBnZXRfaWgoJnBhdGgpOworCWl0ZW0gPSBnZXRfaXRlbSgmcGF0aCk7CisJcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwogCi0gICAgLyogZGVzaXJlZCBwb3NpdGlvbiBpcyBub3QgZm91bmQgb3IgaXMgaW4gdGhlIGRpcmVjdCBpdGVtLiBXZSBoYXZlCi0gICAgICAgdG8gYXBwZW5kIGZpbGUgd2l0aCBob2xlcyB1cCB0byAnYmxvY2snLXRoIGJsb2NrIGNvbnZlcnRpbmcKLSAgICAgICBkaXJlY3QgaXRlbXMgdG8gaW5kaXJlY3Qgb25lIGlmIG5lY2Vzc2FyeSAqLwotICAgIGRvbmUgPSAwOwotICAgIGRvIHsKLQlpZiAoaXNfc3RhdGRhdGFfbGVfaWggKGloKSkgewotCSAgICBfX2xlMzIgdW5wID0gMDsKLQkgICAgc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKwlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbihpbm9kZS0+aV9zYik7CisJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwogCi0JICAgIC8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGluc2VydGVkICovCi0JICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmdG1wX2loLCAma2V5LCB2ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULCAKLQkJCSAgICAgICBVTkZNX1BfU0laRSwgMC8qIGZyZWVfc3BhY2UgKi8pOworCWlmIChhbGxvY2F0aW9uX25lZWRlZAorCSAgICAocmV0dmFsLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGloLCBpdGVtLCBwb3NfaW5faXRlbSkpIHsKKwkJLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBibG9jayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJaWYgKCF0aCkgeworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCWdvdG8gc3RhcnRfdHJhbnM7CisJCX0KIAotCSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoJmtleSkgPT0gMSkgewotCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkICdibG9jayctdGggYmxvY2sgdG8gdGhlIGZpbGUuIFVzZQotCQkgICBhbGxvY2F0ZWQgYmxvY2sgZm9yIHRoYXQgKi8KLQkJdW5wID0gY3B1X3RvX2xlMzIgKGFsbG9jYXRlZF9ibG9ja19ucik7Ci0JCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOwotCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOwotCQlkb25lID0gMTsKLQkgICAgfQotCSAgICB0bXBfa2V5ID0ga2V5OyAvLyA7KQotCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnRtcF9rZXksIDEpOwotCSAgICBQQVRIX0xBU1RfUE9TSVRJT04oJnBhdGgpICsrOworCQlyZXBlYXQgPQorCQkgICAgX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsICZhbGxvY2F0ZWRfYmxvY2tfbnIsCisJCQkJICAgICZwYXRoLCBjcmVhdGUpOwogCi0JICAgIHJldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgJnBhdGgsICZ0bXBfa2V5LCAmdG1wX2loLCBpbm9kZSwgKGNoYXIgKikmdW5wKTsKLQkgICAgaWYgKHJldHZhbCkgewotCQlyZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7Ci0JCWdvdG8gZmFpbHVyZTsgLy8gcmV0dmFsID09IC1FTk9TUEMsIC1FRFFVT1Qgb3IgLUVJTyBvciAtRUVYSVNUCi0JICAgIH0KLQkgICAgLy9tYXJrX3RhaWxfY29udmVydGVkIChpbm9kZSk7Ci0JfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgewotCSAgICAvKiBkaXJlY3QgaXRlbSBoYXMgdG8gYmUgY29udmVydGVkICovCi0JICAgIGxvZmZfdCB0YWlsX29mZnNldDsKKwkJaWYgKHJlcGVhdCA9PSBOT19ESVNLX1NQQUNFIHx8IHJlcGVhdCA9PSBRVU9UQV9FWENFRURFRCkgeworCQkJLyogcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gdG8gZ2l2ZSB0aGUgam91cm5hbCBhIGNoYW5jZSB0byBmcmVlCisJCQkgKiogc29tZSBibG9ja3MuICByZWxlYXNlcyB0aGUgcGF0aCwgc28gd2UgaGF2ZSB0byBnbyBiYWNrIHRvCisJCQkgKiogcmVzZWFyY2ggaWYgd2Ugc3VjY2VlZCBvbiB0aGUgc2Vjb25kIHRyeQorCQkJICovCisJCQlTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMTsKKwkJCXJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZmFpbHVyZTsKKwkJCXJlcGVhdCA9CisJCQkgICAgX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsCisJCQkJCSAgICAmYWxsb2NhdGVkX2Jsb2NrX25yLCBOVUxMLCBjcmVhdGUpOwogCi0JICAgIHRhaWxfb2Zmc2V0ID0gKChsZV9paF9rX29mZnNldCAoaWgpIC0gMSkgJiB+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSArIDE7Ci0JICAgIGlmICh0YWlsX29mZnNldCA9PSBjcHVfa2V5X2tfb2Zmc2V0ICgma2V5KSkgewotCQkvKiBkaXJlY3QgaXRlbSB3ZSBqdXN0IGZvdW5kIGZpdHMgaW50byBibG9jayB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgdG8gbWFwLiBDb252ZXJ0IGl0IGludG8gdW5mb3JtYXR0ZWQgbm9kZTogdXNlCi0gICAgICAgICAgICAgICAgICAgYmhfcmVzdWx0IGZvciB0aGUgY29udmVyc2lvbiAqLwotCQlzZXRfYmxvY2tfZGV2X21hcHBlZCAoYmhfcmVzdWx0LCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKLQkJdW5iaCA9IGJoX3Jlc3VsdDsKLQkJZG9uZSA9IDE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIHdlIGhhdmUgdG8gcGFkZCBmaWxlIHRhaWwgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCi0JCSAgIHVwIHRvIGJsb2NrIHNpemUgYW5kIGNvbnZlcnQgaXQgdG8gdW5mb3JtYXR0ZWQKLQkJICAgbm9kZS4gRklYTUU6IHRoaXMgc2hvdWxkIGFsc28gZ2V0IGludG8gcGFnZSBjYWNoZSAqLwotCi0JCXBhdGhyZWxzZSgmcGF0aCkgOwotCQkvKgotCQkgKiB1Z2x5LCBidXQgd2UgY2FuIG9ubHkgZW5kIHRoZSB0cmFuc2FjdGlvbiBpZgotCQkgKiB3ZSBhcmVuJ3QgbmVzdGVkCi0JCSAqLwotCQlCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7Ci0JCWlmICh0aC0+dF9yZWZjb3VudCA9PSAxKSB7Ci0JCSAgICByZXR2YWwgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7Ci0JCSAgICB0aCA9IE5VTEw7Ci0JCSAgICBpZiAocmV0dmFsKQorCQkJaWYgKHJlcGVhdCAhPSBOT19ESVNLX1NQQUNFICYmIHJlcGVhdCAhPSBRVU9UQV9FWENFRURFRCkgeworCQkJCWdvdG8gcmVzZWFyY2g7CisJCQl9CisJCQlpZiAocmVwZWF0ID09IFFVT1RBX0VYQ0VFREVEKQorCQkJCXJldHZhbCA9IC1FRFFVT1Q7CisJCQllbHNlCisJCQkJcmV0dmFsID0gLUVOT1NQQzsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQogCi0JCXJldHZhbCA9IGNvbnZlcnRfdGFpbF9mb3JfaG9sZShpbm9kZSwgYmhfcmVzdWx0LCB0YWlsX29mZnNldCkgOwotCQlpZiAocmV0dmFsKSB7Ci0JCSAgICBpZiAoIHJldHZhbCAhPSAtRU5PU1BDICkKLQkJCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiY2xtLTYwMDQ6IGNvbnZlcnQgdGFpbCBmYWlsZWQgaW5vZGUgJWx1LCBlcnJvciAlZCIsIGlub2RlLT5pX2lubywgcmV0dmFsKSA7Ci0JCSAgICBpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKSB7Ci0JCQkvKiB0aGUgYml0bWFwLCB0aGUgc3VwZXIsIGFuZCB0aGUgc3RhdCBkYXRhID09IDMgKi8KLQkJCWlmICghdGgpCi0JCQkgICAgdGggPSByZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKGlub2RlLT5pX3NiLDMpOwotCQkJaWYgKHRoKQotCQkJICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLGlub2RlLGFsbG9jYXRlZF9ibG9ja19uciwxKTsKLQkJICAgIH0KLQkJICAgIGdvdG8gZmFpbHVyZSA7CisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJZ290byByZXNlYXJjaDsKIAkJfQotCQlnb3RvIHJlc2VhcmNoIDsKLQkgICAgfQotCSAgICByZXR2YWwgPSBkaXJlY3QyaW5kaXJlY3QgKHRoLCBpbm9kZSwgJnBhdGgsIHVuYmgsIHRhaWxfb2Zmc2V0KTsKLQkgICAgaWYgKHJldHZhbCkgewotCQlyZWlzZXJmc191bm1hcF9idWZmZXIodW5iaCk7Ci0JCXJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKLQkJZ290byBmYWlsdXJlOwotCSAgICB9Ci0JICAgIC8qIGl0IGlzIGltcG9ydGFudCB0aGUgc2V0X2J1ZmZlcl91cHRvZGF0ZSBpcyBkb25lIGFmdGVyCi0JICAgICoqIHRoZSBkaXJlY3QyaW5kaXJlY3QuICBUaGUgYnVmZmVyIG1pZ2h0IGNvbnRhaW4gdmFsaWQKLQkgICAgKiogZGF0YSBuZXdlciB0aGFuIHRoZSBkYXRhIG9uIGRpc2sgKHJlYWQgYnkgcmVhZHBhZ2UsIGNoYW5nZWQsCi0JICAgICoqIGFuZCB0aGVuIHNlbnQgaGVyZSBieSB3cml0ZXBhZ2UpLiAgZGlyZWN0MmluZGlyZWN0IG5lZWRzCi0JICAgICoqIHRvIGtub3cgaWYgdW5iaCB3YXMgYWxyZWFkeSB1cCB0byBkYXRlLCBzbyBpdCBjYW4gZGVjaWRlCi0JICAgICoqIGlmIHRoZSBkYXRhIGluIHVuYmggbmVlZHMgdG8gYmUgcmVwbGFjZWQgd2l0aCBkYXRhIGZyb20KLQkgICAgKiogdGhlIGRpc2sKLQkgICAgKi8KLQkgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSAodW5iaCk7CisJfQogCi0JICAgIC8qIHVuYmgtPmJfcGFnZSA9PSBOVUxMIGluIGNhc2Ugb2YgRElSRUNUX0lPIHJlcXVlc3QsIHRoaXMgbWVhbnMKLQkgICAgICAgYnVmZmVyIHdpbGwgZGlzYXBwZWFyIHNob3J0bHksIHNvIGl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8KLQkgICAgICovCi0JICAgIGlmICggdW5iaC0+Yl9wYWdlICkgewotCQkvKiB3ZSd2ZSBjb252ZXJ0ZWQgdGhlIHRhaWwsIHNvIHdlIG11c3QKLQkJKiogZmx1c2ggdW5iaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMKLQkJKi8KLQkJcmVpc2VyZnNfYWRkX3RhaWxfbGlzdChpbm9kZSwgdW5iaCkgOworCWlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kKHJldHZhbCwgaWgpKSB7CisJCWJfYmxvY2tucl90IHVuZm1fcHRyOworCQkvKiAnYmxvY2snLXRoIGJsb2NrIGlzIGluIHRoZSBmaWxlIGFscmVhZHkgKHRoZXJlIGlzCisJCSAgIGNvcnJlc3BvbmRpbmcgY2VsbCBpbiBzb21lIGluZGlyZWN0IGl0ZW0pLiBCdXQgaXQgbWF5IGJlCisJCSAgIHplcm8gdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIChob2xlKSAqLworCQl1bmZtX3B0ciA9IGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pOworCQlpZiAodW5mbV9wdHIgPT0gMCkgeworCQkJLyogdXNlIGFsbG9jYXRlZCBibG9jayB0byBwbHVnIHRoZSBob2xlICovCisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSk7CisJCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSBiaCk7CisJCQkJZ290byByZXNlYXJjaDsKKwkJCX0KKwkJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCQlpZiAoYnVmZmVyX2RpcnR5KGJoX3Jlc3VsdCkKKwkJCSAgICAmJiByZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpKQorCQkJCXJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoX3Jlc3VsdCk7CisJCQlwdXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtLCBhbGxvY2F0ZWRfYmxvY2tfbnIpOworCQkJdW5mbV9wdHIgPSBhbGxvY2F0ZWRfYmxvY2tfbnI7CisJCQlqb3VybmFsX21hcmtfZGlydHkodGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCQlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwkJfQorCQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsIHVuZm1fcHRyLCBpbm9kZSk7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCXJldHZhbCA9IDA7CisJCWlmICghZGFuZ2xlICYmIHRoKQorCQkJcmV0dmFsID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwogCi0JCS8qIG1hcmsgaXQgZGlydHkgbm93IHRvIHByZXZlbnQgY29tbWl0X3dyaXRlIGZyb20gYWRkaW5nCi0JCSoqIHRoaXMgYnVmZmVyIHRvIHRoZSBpbm9kZSdzIGRpcnR5IGJ1ZmZlciBsaXN0Ci0JCSovCi0JCS8qCi0JCSAqIEFLUE06IGNoYW5nZWQgX19tYXJrX2J1ZmZlcl9kaXJ0eSB0byBtYXJrX2J1ZmZlcl9kaXJ0eSgpLgotCQkgKiBJdCdzIHN0aWxsIGF0b21pYywgYnV0IGl0IHNldHMgdGhlIHBhZ2UgZGlydHkgdG9vLAotCQkgKiB3aGljaCBtYWtlcyBpdCBlbGlnaWJsZSBmb3Igd3JpdGViYWNrIGF0IGFueSB0aW1lIGJ5IHRoZQotCQkgKiBWTSAod2hpY2ggd2FzIGFsc28gdGhlIGNhc2Ugd2l0aCBfX21hcmtfYnVmZmVyX2RpcnR5KCkpCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisKKwkJLyogdGhlIGl0ZW0gd2FzIGZvdW5kLCBzbyBuZXcgYmxvY2tzIHdlcmUgbm90IGFkZGVkIHRvIHRoZSBmaWxlCisJCSAqKiB0aGVyZSBpcyBubyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgaW5vZGUgaXMgdXBkYXRlZCB3aXRoIHRoaXMgCisJCSAqKiB0cmFuc2FjdGlvbgogCQkgKi8KLQkJbWFya19idWZmZXJfZGlydHkodW5iaCkgOwotCSAgICB9Ci0JfSBlbHNlIHsKLQkgICAgLyogYXBwZW5kIGluZGlyZWN0IGl0ZW0gd2l0aCBob2xlcyBpZiBuZWVkZWQsIHdoZW4gYXBwZW5kaW5nCi0JICAgICAgIHBvaW50ZXIgdG8gJ2Jsb2NrJy10aCBibG9jayB1c2UgYmxvY2ssIHdoaWNoIGlzIGFscmVhZHkKLQkgICAgICAgYWxsb2NhdGVkICovCi0JICAgIHN0cnVjdCBjcHVfa2V5IHRtcF9rZXk7Ci0JICAgIHVucF90IHVuZl9zaW5nbGU9MDsgLy8gV2UgdXNlIHRoaXMgaW4gY2FzZSB3ZSBuZWVkIHRvIGFsbG9jYXRlIG9ubHkKLQkJCQkvLyBvbmUgYmxvY2sgd2hpY2ggaXMgYSBmYXN0cGF0aAotCSAgICB1bnBfdCAqdW47Ci0JICAgIF9fdTY0IG1heF90b19pbnNlcnQ9TUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkvVU5GTV9QX1NJWkU7Ci0JICAgIF9fdTY0IGJsb2Nrc19uZWVkZWQ7Ci0KLQkgICAgUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSwKLQkJICAgICJ2cy04MDQ6IGludmFsaWQgcG9zaXRpb24gZm9yIGFwcGVuZCIpOwotCSAgICAvKiBpbmRpcmVjdCBpdGVtIGhhcyB0byBiZSBhcHBlbmRlZCwgc2V0IHVwIGtleSBvZiB0aGF0IHBvc2l0aW9uICovCi0JICAgIG1ha2VfY3B1X2tleSAoJnRtcF9rZXksIGlub2RlLAotCQkJICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwKLQkJCSAgLy9wb3NfaW5faXRlbSAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKLQkJCSAgVFlQRV9JTkRJUkVDVCwgMyk7Ly8ga2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQKLQotCSAgICBibG9ja3NfbmVlZGVkID0gMSArICgoY3B1X2tleV9rX29mZnNldCAoJmtleSkgLSBjcHVfa2V5X2tfb2Zmc2V0ICgmdG1wX2tleSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKLQkgICAgUkZBTFNFKCBibG9ja3NfbmVlZGVkIDwgMCwgImdyZWVuLTgwNTogaW52YWxpZCBvZmZzZXQiKTsKLQotCSAgICBpZiAoIGJsb2Nrc19uZWVkZWQgPT0gMSApIHsKLQkJdW4gPSAmdW5mX3NpbmdsZTsKLQkgICAgfSBlbHNlIHsKLQkJdW49a21hbGxvYyggbWluKGJsb2Nrc19uZWVkZWQsbWF4X3RvX2luc2VydCkqVU5GTV9QX1NJWkUsCi0JCQkgICAgR0ZQX0FUT01JQyk7IC8vIFdlIG5lZWQgdG8gYXZvaWQgc2NoZWR1bGluZy4KLQkJaWYgKCAhdW4pIHsKLQkJICAgIHVuID0gJnVuZl9zaW5nbGU7Ci0JCSAgICBibG9ja3NfbmVlZGVkID0gMTsKLQkJICAgIG1heF90b19pbnNlcnQgPSAwOwotCQl9IGVsc2UKLQkJICAgIG1lbXNldCh1biwgMCwgVU5GTV9QX1NJWkUgKiBtaW4oYmxvY2tzX25lZWRlZCxtYXhfdG9faW5zZXJ0KSk7Ci0JICAgIH0KLQkgICAgaWYgKCBibG9ja3NfbmVlZGVkIDw9IG1heF90b19pbnNlcnQpIHsKLQkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCB0YXJnZXQgYmxvY2sgdG8gdGhlIGZpbGUuIFVzZSBhbGxvY2F0ZWQKLQkJICAgYmxvY2sgZm9yIHRoYXQgKi8KLQkJdW5bYmxvY2tzX25lZWRlZC0xXSA9IGNwdV90b19sZTMyIChhbGxvY2F0ZWRfYmxvY2tfbnIpOwotCQlzZXRfYmxvY2tfZGV2X21hcHBlZCAoYmhfcmVzdWx0LCBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKLQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKLQkJZG9uZSA9IDE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIHBhc3RlIGhvbGUgdG8gdGhlIGluZGlyZWN0IGl0ZW0gKi8KLQkJLyogSWYga21hbGxvYyBmYWlsZWQsIG1heF90b19pbnNlcnQgYmVjb21lcyB6ZXJvIGFuZCBpdCBtZWFucyB3ZQotCQkgICBvbmx5IGhhdmUgc3BhY2UgZm9yIG9uZSBibG9jayAqLwotCQlibG9ja3NfbmVlZGVkPW1heF90b19pbnNlcnQ/bWF4X3RvX2luc2VydDoxOwotCSAgICB9Ci0JICAgIHJldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAodGgsICZwYXRoLCAmdG1wX2tleSwgaW5vZGUsIChjaGFyICopdW4sIFVORk1fUF9TSVpFICogYmxvY2tzX25lZWRlZCk7Ci0KLQkgICAgaWYgKGJsb2Nrc19uZWVkZWQgIT0gMSkKLQkJa2ZyZWUodW4pOwotCi0JICAgIGlmIChyZXR2YWwpIHsKLQkJcmVpc2VyZnNfZnJlZV9ibG9jayAodGgsIGlub2RlLCBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOwotCQlnb3RvIGZhaWx1cmU7Ci0JICAgIH0KLQkgICAgaWYgKCFkb25lKSB7Ci0JCS8qIFdlIG5lZWQgdG8gbWFyayBuZXcgZmlsZSBzaXplIGluIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIGJlCi0JCSAgIGludGVycnVwdGVkL2Fib3J0ZWQgbGF0ZXIgb24uIEFuZCB3ZSBtYXkgZG8gdGhpcyBvbmx5IGZvcgotCQkgICBob2xlcy4gKi8KLQkJaW5vZGUtPmlfc2l6ZSArPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKiBibG9ja3NfbmVlZGVkOwotCSAgICB9CisJCXJldHVybiByZXR2YWw7CiAJfQogCi0JaWYgKGRvbmUgPT0gMSkKLQkgICAgYnJlYWs7Ci0KLQkvKiB0aGlzIGxvb3AgY291bGQgbG9nIG1vcmUgYmxvY2tzIHRoYW4gd2UgaGFkIG9yaWdpbmFsbHkgYXNrZWQKLQkqKiBmb3IuICBTbywgd2UgaGF2ZSB0byBhbGxvdyB0aGUgdHJhbnNhY3Rpb24gdG8gZW5kIGlmIGl0IGlzCi0JKiogdG9vIGJpZyBvciB0b28gZnVsbC4gIFVwZGF0ZSB0aGUgaW5vZGUgc28gdGhpbmdzIGFyZSAKLQkqKiBjb25zaXN0ZW50IGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgZnVuY3Rpb24gcmV0dXJucwotCSoqCi0JKiogcmVsZWFzZSB0aGUgcGF0aCBzbyB0aGF0IGFueWJvZHkgd2FpdGluZyBvbiB0aGUgcGF0aCBiZWZvcmUKLQkqKiBlbmRpbmcgdGhlaXIgdHJhbnNhY3Rpb24gd2lsbCBiZSBhYmxlIHRvIGNvbnRpbnVlLgotCSovCi0JaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKLQkgIHJldHZhbCA9IHJlc3RhcnRfdHJhbnNhY3Rpb24odGgsIGlub2RlLCAmcGF0aCkgOwotCSAgaWYgKHJldHZhbCkKLQkgICAgZ290byBmYWlsdXJlOworCWlmICghdGgpIHsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJZ290byBzdGFydF90cmFuczsKIAl9Ci0JLyogaW5zZXJ0aW5nIGluZGlyZWN0IHBvaW50ZXJzIGZvciBhIGhvbGUgY2FuIHRha2UgYSAKLQkqKiBsb25nIHRpbWUuICByZXNjaGVkdWxlIGlmIG5lZWRlZAotCSovCi0JY29uZF9yZXNjaGVkKCk7CiAKLQlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJldHZhbCA9IC1FSU87Ci0JICAgIGdvdG8gZmFpbHVyZTsKKwkvKiBkZXNpcmVkIHBvc2l0aW9uIGlzIG5vdCBmb3VuZCBvciBpcyBpbiB0aGUgZGlyZWN0IGl0ZW0uIFdlIGhhdmUKKwkgICB0byBhcHBlbmQgZmlsZSB3aXRoIGhvbGVzIHVwIHRvICdibG9jayctdGggYmxvY2sgY29udmVydGluZworCSAgIGRpcmVjdCBpdGVtcyB0byBpbmRpcmVjdCBvbmUgaWYgbmVjZXNzYXJ5ICovCisJZG9uZSA9IDA7CisJZG8geworCQlpZiAoaXNfc3RhdGRhdGFfbGVfaWgoaWgpKSB7CisJCQlfX2xlMzIgdW5wID0gMDsKKwkJCXN0cnVjdCBjcHVfa2V5IHRtcF9rZXk7CisKKwkJCS8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGluc2VydGVkICovCisJCQltYWtlX2xlX2l0ZW1faGVhZCgmdG1wX2loLCAma2V5LCB2ZXJzaW9uLCAxLAorCQkJCQkgIFRZUEVfSU5ESVJFQ1QsIFVORk1fUF9TSVpFLAorCQkJCQkgIDAgLyogZnJlZV9zcGFjZSAqLyApOworCisJCQlpZiAoY3B1X2tleV9rX29mZnNldCgma2V5KSA9PSAxKSB7CisJCQkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCAnYmxvY2snLXRoIGJsb2NrIHRvIHRoZSBmaWxlLiBVc2UKKwkJCQkgICBhbGxvY2F0ZWQgYmxvY2sgZm9yIHRoYXQgKi8KKwkJCQl1bnAgPSBjcHVfdG9fbGUzMihhbGxvY2F0ZWRfYmxvY2tfbnIpOworCQkJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwKKwkJCQkJCSAgICAgYWxsb2NhdGVkX2Jsb2NrX25yLCBpbm9kZSk7CisJCQkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJCXRtcF9rZXkgPSBrZXk7CS8vIDspCisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgmdG1wX2tleSwgMSk7CisJCQlQQVRIX0xBU1RfUE9TSVRJT04oJnBhdGgpKys7CisKKwkJCXJldHZhbCA9CisJCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoLCAmdG1wX2tleSwgJnRtcF9paCwKKwkJCQkJCSBpbm9kZSwgKGNoYXIgKikmdW5wKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwKKwkJCQkJCSAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQkJCWdvdG8gZmFpbHVyZTsJLy8gcmV0dmFsID09IC1FTk9TUEMsIC1FRFFVT1Qgb3IgLUVJTyBvciAtRUVYSVNUCisJCQl9CisJCQkvL21hcmtfdGFpbF9jb252ZXJ0ZWQgKGlub2RlKTsKKwkJfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWgoaWgpKSB7CisJCQkvKiBkaXJlY3QgaXRlbSBoYXMgdG8gYmUgY29udmVydGVkICovCisJCQlsb2ZmX3QgdGFpbF9vZmZzZXQ7CisKKwkJCXRhaWxfb2Zmc2V0ID0KKwkJCSAgICAoKGxlX2loX2tfb2Zmc2V0KGloKSAtCisJCQkgICAgICAxKSAmIH4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKKwkJCWlmICh0YWlsX29mZnNldCA9PSBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpKSB7CisJCQkJLyogZGlyZWN0IGl0ZW0gd2UganVzdCBmb3VuZCBmaXRzIGludG8gYmxvY2sgd2UgaGF2ZQorCQkJCSAgIHRvIG1hcC4gQ29udmVydCBpdCBpbnRvIHVuZm9ybWF0dGVkIG5vZGU6IHVzZQorCQkJCSAgIGJoX3Jlc3VsdCBmb3IgdGhlIGNvbnZlcnNpb24gKi8KKwkJCQlzZXRfYmxvY2tfZGV2X21hcHBlZChiaF9yZXN1bHQsCisJCQkJCQkgICAgIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOworCQkJCXVuYmggPSBiaF9yZXN1bHQ7CisJCQkJZG9uZSA9IDE7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGhhdmUgdG8gcGFkZCBmaWxlIHRhaWwgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCisJCQkJICAgdXAgdG8gYmxvY2sgc2l6ZSBhbmQgY29udmVydCBpdCB0byB1bmZvcm1hdHRlZAorCQkJCSAgIG5vZGUuIEZJWE1FOiB0aGlzIHNob3VsZCBhbHNvIGdldCBpbnRvIHBhZ2UgY2FjaGUgKi8KKworCQkJCXBhdGhyZWxzZSgmcGF0aCk7CisJCQkJLyoKKwkJCQkgKiB1Z2x5LCBidXQgd2UgY2FuIG9ubHkgZW5kIHRoZSB0cmFuc2FjdGlvbiBpZgorCQkJCSAqIHdlIGFyZW4ndCBuZXN0ZWQKKwkJCQkgKi8KKwkJCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKKwkJCQlpZiAodGgtPnRfcmVmY291bnQgPT0gMSkgeworCQkJCQlyZXR2YWwgPQorCQkJCQkgICAgcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24KKwkJCQkJICAgICh0aCk7CisJCQkJCXRoID0gTlVMTDsKKwkJCQkJaWYgKHJldHZhbCkKKwkJCQkJCWdvdG8gZmFpbHVyZTsKKwkJCQl9CisKKwkJCQlyZXR2YWwgPQorCQkJCSAgICBjb252ZXJ0X3RhaWxfZm9yX2hvbGUoaW5vZGUsIGJoX3Jlc3VsdCwKKwkJCQkJCQkgIHRhaWxfb2Zmc2V0KTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCWlmIChyZXR2YWwgIT0gLUVOT1NQQykKKwkJCQkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSAiY2xtLTYwMDQ6IGNvbnZlcnQgdGFpbCBmYWlsZWQgaW5vZGUgJWx1LCBlcnJvciAlZCIsCisJCQkJCQkJCSBpbm9kZS0+aV9pbm8sCisJCQkJCQkJCSByZXR2YWwpOworCQkJCQlpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKSB7CisJCQkJCQkvKiB0aGUgYml0bWFwLCB0aGUgc3VwZXIsIGFuZCB0aGUgc3RhdCBkYXRhID09IDMgKi8KKwkJCQkJCWlmICghdGgpCisJCQkJCQkJdGggPSByZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKGlub2RlLT5pX3NiLCAzKTsKKwkJCQkJCWlmICh0aCkKKwkJCQkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLAorCQkJCQkJCQkJICAgIGlub2RlLAorCQkJCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwKKwkJCQkJCQkJCSAgICAxKTsKKwkJCQkJfQorCQkJCQlnb3RvIGZhaWx1cmU7CisJCQkJfQorCQkJCWdvdG8gcmVzZWFyY2g7CisJCQl9CisJCQlyZXR2YWwgPQorCQkJICAgIGRpcmVjdDJpbmRpcmVjdCh0aCwgaW5vZGUsICZwYXRoLCB1bmJoLAorCQkJCQkgICAgdGFpbF9vZmZzZXQpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcih1bmJoKTsKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwKKwkJCQkJCSAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQkJCWdvdG8gZmFpbHVyZTsKKwkJCX0KKwkJCS8qIGl0IGlzIGltcG9ydGFudCB0aGUgc2V0X2J1ZmZlcl91cHRvZGF0ZSBpcyBkb25lIGFmdGVyCisJCQkgKiogdGhlIGRpcmVjdDJpbmRpcmVjdC4gIFRoZSBidWZmZXIgbWlnaHQgY29udGFpbiB2YWxpZAorCQkJICoqIGRhdGEgbmV3ZXIgdGhhbiB0aGUgZGF0YSBvbiBkaXNrIChyZWFkIGJ5IHJlYWRwYWdlLCBjaGFuZ2VkLAorCQkJICoqIGFuZCB0aGVuIHNlbnQgaGVyZSBieSB3cml0ZXBhZ2UpLiAgZGlyZWN0MmluZGlyZWN0IG5lZWRzCisJCQkgKiogdG8ga25vdyBpZiB1bmJoIHdhcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHNvIGl0IGNhbiBkZWNpZGUKKwkJCSAqKiBpZiB0aGUgZGF0YSBpbiB1bmJoIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggZGF0YSBmcm9tCisJCQkgKiogdGhlIGRpc2sKKwkJCSAqLworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSh1bmJoKTsKKworCQkJLyogdW5iaC0+Yl9wYWdlID09IE5VTEwgaW4gY2FzZSBvZiBESVJFQ1RfSU8gcmVxdWVzdCwgdGhpcyBtZWFucworCQkJICAgYnVmZmVyIHdpbGwgZGlzYXBwZWFyIHNob3J0bHksIHNvIGl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8KKwkJCSAqLworCQkJaWYgKHVuYmgtPmJfcGFnZSkgeworCQkJCS8qIHdlJ3ZlIGNvbnZlcnRlZCB0aGUgdGFpbCwgc28gd2UgbXVzdAorCQkJCSAqKiBmbHVzaCB1bmJoIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cworCQkJCSAqLworCQkJCXJlaXNlcmZzX2FkZF90YWlsX2xpc3QoaW5vZGUsIHVuYmgpOworCisJCQkJLyogbWFyayBpdCBkaXJ0eSBub3cgdG8gcHJldmVudCBjb21taXRfd3JpdGUgZnJvbSBhZGRpbmcKKwkJCQkgKiogdGhpcyBidWZmZXIgdG8gdGhlIGlub2RlJ3MgZGlydHkgYnVmZmVyIGxpc3QKKwkJCQkgKi8KKwkJCQkvKgorCQkJCSAqIEFLUE06IGNoYW5nZWQgX19tYXJrX2J1ZmZlcl9kaXJ0eSB0byBtYXJrX2J1ZmZlcl9kaXJ0eSgpLgorCQkJCSAqIEl0J3Mgc3RpbGwgYXRvbWljLCBidXQgaXQgc2V0cyB0aGUgcGFnZSBkaXJ0eSB0b28sCisJCQkJICogd2hpY2ggbWFrZXMgaXQgZWxpZ2libGUgZm9yIHdyaXRlYmFjayBhdCBhbnkgdGltZSBieSB0aGUKKwkJCQkgKiBWTSAod2hpY2ggd2FzIGFsc28gdGhlIGNhc2Ugd2l0aCBfX21hcmtfYnVmZmVyX2RpcnR5KCkpCisJCQkJICovCisJCQkJbWFya19idWZmZXJfZGlydHkodW5iaCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBhcHBlbmQgaW5kaXJlY3QgaXRlbSB3aXRoIGhvbGVzIGlmIG5lZWRlZCwgd2hlbiBhcHBlbmRpbmcKKwkJCSAgIHBvaW50ZXIgdG8gJ2Jsb2NrJy10aCBibG9jayB1c2UgYmxvY2ssIHdoaWNoIGlzIGFscmVhZHkKKwkJCSAgIGFsbG9jYXRlZCAqLworCQkJc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKwkJCXVucF90IHVuZl9zaW5nbGUgPSAwOwkvLyBXZSB1c2UgdGhpcyBpbiBjYXNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25seQorCQkJLy8gb25lIGJsb2NrIHdoaWNoIGlzIGEgZmFzdHBhdGgKKwkJCXVucF90ICp1bjsKKwkJCV9fdTY0IG1heF90b19pbnNlcnQgPQorCQkJICAgIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpIC8KKwkJCSAgICBVTkZNX1BfU0laRTsKKwkJCV9fdTY0IGJsb2Nrc19uZWVkZWQ7CisKKwkJCVJGQUxTRShwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSwKKwkJCSAgICAgICAidnMtODA0OiBpbnZhbGlkIHBvc2l0aW9uIGZvciBhcHBlbmQiKTsKKwkJCS8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGFwcGVuZGVkLCBzZXQgdXAga2V5IG9mIHRoYXQgcG9zaXRpb24gKi8KKwkJCW1ha2VfY3B1X2tleSgmdG1wX2tleSwgaW5vZGUsCisJCQkJICAgICBsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwKKwkJCQkJCSAgICAgJihpaC0+aWhfa2V5KSkgKworCQkJCSAgICAgb3BfYnl0ZXNfbnVtYmVyKGloLAorCQkJCQkJICAgICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLAorCQkJCSAgICAgLy9wb3NfaW5faXRlbSAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgIFRZUEVfSU5ESVJFQ1QsIDMpOwkvLyBrZXkgdHlwZSBpcyB1bmltcG9ydGFudAorCisJCQlibG9ja3NfbmVlZGVkID0KKwkJCSAgICAxICsKKwkJCSAgICAoKGNwdV9rZXlfa19vZmZzZXQoJmtleSkgLQorCQkJICAgICAgY3B1X2tleV9rX29mZnNldCgmdG1wX2tleSkpID4+IGlub2RlLT5pX3NiLT4KKwkJCSAgICAgc19ibG9ja3NpemVfYml0cyk7CisJCQlSRkFMU0UoYmxvY2tzX25lZWRlZCA8IDAsICJncmVlbi04MDU6IGludmFsaWQgb2Zmc2V0Iik7CisKKwkJCWlmIChibG9ja3NfbmVlZGVkID09IDEpIHsKKwkJCQl1biA9ICZ1bmZfc2luZ2xlOworCQkJfSBlbHNlIHsKKwkJCQl1biA9IGttYWxsb2MobWluKGJsb2Nrc19uZWVkZWQsIG1heF90b19pbnNlcnQpICogVU5GTV9QX1NJWkUsIEdGUF9BVE9NSUMpOwkvLyBXZSBuZWVkIHRvIGF2b2lkIHNjaGVkdWxpbmcuCisJCQkJaWYgKCF1bikgeworCQkJCQl1biA9ICZ1bmZfc2luZ2xlOworCQkJCQlibG9ja3NfbmVlZGVkID0gMTsKKwkJCQkJbWF4X3RvX2luc2VydCA9IDA7CisJCQkJfSBlbHNlCisJCQkJCW1lbXNldCh1biwgMCwKKwkJCQkJICAgICAgIFVORk1fUF9TSVpFICogbWluKGJsb2Nrc19uZWVkZWQsCisJCQkJCQkJCSBtYXhfdG9faW5zZXJ0KSk7CisJCQl9CisJCQlpZiAoYmxvY2tzX25lZWRlZCA8PSBtYXhfdG9faW5zZXJ0KSB7CisJCQkJLyogd2UgYXJlIGdvaW5nIHRvIGFkZCB0YXJnZXQgYmxvY2sgdG8gdGhlIGZpbGUuIFVzZSBhbGxvY2F0ZWQKKwkJCQkgICBibG9jayBmb3IgdGhhdCAqLworCQkJCXVuW2Jsb2Nrc19uZWVkZWQgLSAxXSA9CisJCQkJICAgIGNwdV90b19sZTMyKGFsbG9jYXRlZF9ibG9ja19ucik7CisJCQkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LAorCQkJCQkJICAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIGlub2RlKTsKKwkJCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQkJCWRvbmUgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBwYXN0ZSBob2xlIHRvIHRoZSBpbmRpcmVjdCBpdGVtICovCisJCQkJLyogSWYga21hbGxvYyBmYWlsZWQsIG1heF90b19pbnNlcnQgYmVjb21lcyB6ZXJvIGFuZCBpdCBtZWFucyB3ZQorCQkJCSAgIG9ubHkgaGF2ZSBzcGFjZSBmb3Igb25lIGJsb2NrICovCisJCQkJYmxvY2tzX25lZWRlZCA9CisJCQkJICAgIG1heF90b19pbnNlcnQgPyBtYXhfdG9faW5zZXJ0IDogMTsKKwkJCX0KKwkJCXJldHZhbCA9CisJCQkgICAgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCAmcGF0aCwgJnRtcF9rZXksIGlub2RlLAorCQkJCQkJICAgICAoY2hhciAqKXVuLAorCQkJCQkJICAgICBVTkZNX1BfU0laRSAqCisJCQkJCQkgICAgIGJsb2Nrc19uZWVkZWQpOworCisJCQlpZiAoYmxvY2tzX25lZWRlZCAhPSAxKQorCQkJCWtmcmVlKHVuKTsKKworCQkJaWYgKHJldHZhbCkgeworCQkJCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLAorCQkJCQkJICAgIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCQkJZ290byBmYWlsdXJlOworCQkJfQorCQkJaWYgKCFkb25lKSB7CisJCQkJLyogV2UgbmVlZCB0byBtYXJrIG5ldyBmaWxlIHNpemUgaW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKKwkJCQkgICBpbnRlcnJ1cHRlZC9hYm9ydGVkIGxhdGVyIG9uLiBBbmQgd2UgbWF5IGRvIHRoaXMgb25seSBmb3IKKwkJCQkgICBob2xlcy4gKi8KKwkJCQlpbm9kZS0+aV9zaXplICs9CisJCQkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAqIGJsb2Nrc19uZWVkZWQ7CisJCQl9CisJCX0KKworCQlpZiAoZG9uZSA9PSAxKQorCQkJYnJlYWs7CisKKwkJLyogdGhpcyBsb29wIGNvdWxkIGxvZyBtb3JlIGJsb2NrcyB0aGFuIHdlIGhhZCBvcmlnaW5hbGx5IGFza2VkCisJCSAqKiBmb3IuICBTbywgd2UgaGF2ZSB0byBhbGxvdyB0aGUgdHJhbnNhY3Rpb24gdG8gZW5kIGlmIGl0IGlzCisJCSAqKiB0b28gYmlnIG9yIHRvbyBmdWxsLiAgVXBkYXRlIHRoZSBpbm9kZSBzbyB0aGluZ3MgYXJlIAorCQkgKiogY29uc2lzdGVudCBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIGZ1bmN0aW9uIHJldHVybnMKKwkJICoqCisJCSAqKiByZWxlYXNlIHRoZSBwYXRoIHNvIHRoYXQgYW55Ym9keSB3YWl0aW5nIG9uIHRoZSBwYXRoIGJlZm9yZQorCQkgKiogZW5kaW5nIHRoZWlyIHRyYW5zYWN0aW9uIHdpbGwgYmUgYWJsZSB0byBjb250aW51ZS4KKwkJICovCisJCWlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7CisJCQlyZXR2YWwgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGZhaWx1cmU7CisJCX0KKwkJLyogaW5zZXJ0aW5nIGluZGlyZWN0IHBvaW50ZXJzIGZvciBhIGhvbGUgY2FuIHRha2UgYSAKKwkJICoqIGxvbmcgdGltZS4gIHJlc2NoZWR1bGUgaWYgbmVlZGVkCisJCSAqLworCQljb25kX3Jlc2NoZWQoKTsKKworCQlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBmYWlsdXJlOworCQl9CisJCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtODI1OiByZWlzZXJmc19nZXRfYmxvY2s6ICIKKwkJCQkJICIlSyBzaG91bGQgbm90IGJlIGZvdW5kIiwgJmtleSk7CisJCQlyZXR2YWwgPSAtRUVYSVNUOworCQkJaWYgKGFsbG9jYXRlZF9ibG9ja19ucikKKwkJCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwKKwkJCQkJCSAgICBhbGxvY2F0ZWRfYmxvY2tfbnIsIDEpOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJaWggPSBnZXRfaWgoJnBhdGgpOworCQlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCQlwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW07CisJfSB3aGlsZSAoMSk7CisKKwlyZXR2YWwgPSAwOworCisgICAgICBmYWlsdXJlOgorCWlmICh0aCAmJiAoIWRhbmdsZSB8fCAocmV0dmFsICYmICF0aC0+dF90cmFuc19pZCkpKSB7CisJCWludCBlcnI7CisJCWlmICh0aC0+dF90cmFuc19pZCkKKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCQllcnIgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CiAJfQotCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy04MjU6IHJlaXNlcmZzX2dldF9ibG9jazogIgotCQkJICAgICAgIiVLIHNob3VsZCBub3QgYmUgZm91bmQiLCAma2V5KTsKLQkgICAgcmV0dmFsID0gLUVFWElTVDsKLQkgICAgaWYgKGFsbG9jYXRlZF9ibG9ja19ucikKLQkgICAgICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKLQkgICAgcGF0aHJlbHNlKCZwYXRoKSA7Ci0JICAgIGdvdG8gZmFpbHVyZTsKLQl9Ci0JYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOwotCWloID0gZ2V0X2loICgmcGF0aCk7Ci0JaXRlbSA9IGdldF9pdGVtICgmcGF0aCk7Ci0JcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOwotICAgIH0gd2hpbGUgKDEpOwogCi0KLSAgICByZXR2YWwgPSAwOwotCi0gZmFpbHVyZToKLSAgICBpZiAodGggJiYgKCFkYW5nbGUgfHwgKHJldHZhbCAmJiAhdGgtPnRfdHJhbnNfaWQpKSkgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICBpZiAodGgtPnRfdHJhbnNfaWQpCi0gICAgICAgICAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKLSAgICAgICAgZXJyID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgcmV0dmFsID0gZXJyOwotICAgIH0KLQotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotICAgIHJldHVybiByZXR2YWw7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50CiByZWlzZXJmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCisJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKIHsKLSAgICByZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgcmVpc2VyZnNfZ2V0X2Jsb2NrKTsKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgcmVpc2VyZnNfZ2V0X2Jsb2NrKTsKIH0KIAogLyogQ29tcHV0ZSByZWFsIG51bWJlciBvZiB1c2VkIGJ5dGVzIGJ5IGZpbGUKQEAgLTk4Nyw1MSArMTA1OCw1NiBAQAogICovCiBzdGF0aWMgaW50IHJlYWxfc3BhY2VfZGlmZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc2Rfc2l6ZSkKIHsKLSAgICBpbnQgYnl0ZXM7Ci0gICAgbG9mZl90IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA7CisJaW50IGJ5dGVzOworCWxvZmZfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAKLSAgICBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKQotICAgICAgICByZXR1cm4gc2Rfc2l6ZSA7CisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIHNkX3NpemU7CiAKLSAgICAvKiBFbmQgb2YgZmlsZSBpcyBhbHNvIGluIGZ1bGwgYmxvY2sgd2l0aCBpbmRpcmVjdCByZWZlcmVuY2UsIHNvIHJvdW5kCi0gICAgKiogdXAgdG8gdGhlIG5leHQgYmxvY2suCi0gICAgKioKLSAgICAqKiB0aGVyZSBpcyBqdXN0IG5vIHdheSB0byBrbm93IGlmIHRoZSB0YWlsIGlzIGFjdHVhbGx5IHBhY2tlZAotICAgICoqIG9uIHRoZSBmaWxlLCBzbyB3ZSBoYXZlIHRvIGFzc3VtZSBpdCBpc24ndC4gIFdoZW4gd2UgcGFjayB0aGUKLSAgICAqKiB0YWlsLCB3ZSBhZGQgNCBieXRlcyB0byBwcmV0ZW5kIHRoZXJlIHJlYWxseSBpcyBhbiB1bmZvcm1hdHRlZAotICAgICoqIG5vZGUgcG9pbnRlcgotICAgICovCi0gICAgYnl0ZXMgPSAoKGlub2RlLT5pX3NpemUgKyAoYmxvY2tzaXplLTEpKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgKiBVTkZNX1BfU0laRSArIHNkX3NpemU7Ci0gICAgcmV0dXJuIGJ5dGVzIDsKKwkvKiBFbmQgb2YgZmlsZSBpcyBhbHNvIGluIGZ1bGwgYmxvY2sgd2l0aCBpbmRpcmVjdCByZWZlcmVuY2UsIHNvIHJvdW5kCisJICoqIHVwIHRvIHRoZSBuZXh0IGJsb2NrLgorCSAqKgorCSAqKiB0aGVyZSBpcyBqdXN0IG5vIHdheSB0byBrbm93IGlmIHRoZSB0YWlsIGlzIGFjdHVhbGx5IHBhY2tlZAorCSAqKiBvbiB0aGUgZmlsZSwgc28gd2UgaGF2ZSB0byBhc3N1bWUgaXQgaXNuJ3QuICBXaGVuIHdlIHBhY2sgdGhlCisJICoqIHRhaWwsIHdlIGFkZCA0IGJ5dGVzIHRvIHByZXRlbmQgdGhlcmUgcmVhbGx5IGlzIGFuIHVuZm9ybWF0dGVkCisJICoqIG5vZGUgcG9pbnRlcgorCSAqLworCWJ5dGVzID0KKwkgICAgKChpbm9kZS0+aV9zaXplICsKKwkgICAgICAoYmxvY2tzaXplIC0gMSkpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSAqIFVORk1fUF9TSVpFICsKKwkgICAgc2Rfc2l6ZTsKKwlyZXR1cm4gYnl0ZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgbG9mZl90IHRvX3JlYWxfdXNlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bG9uZyBibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNkX3NpemUpCisJCQkJCWludCBzZF9zaXplKQogewotICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLSAgICAgICAgcmV0dXJuIGlub2RlLT5pX3NpemUgKyAobG9mZl90KShyZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpKSA7Ci0gICAgfQotICAgIHJldHVybiAoKGxvZmZfdClyZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpKSArICgoKGxvZmZfdClibG9ja3MpIDw8IDkpOworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJcmV0dXJuIGlub2RlLT5pX3NpemUgKworCQkgICAgKGxvZmZfdCkgKHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpOworCX0KKwlyZXR1cm4gKChsb2ZmX3QpIHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpICsKKwkgICAgKCgobG9mZl90KSBibG9ja3MpIDw8IDkpOwogfQogCiAvKiBDb21wdXRlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSBmaWxlIGluIFJlaXNlckZTIGNvdW50aW5nICovCiBzdGF0aWMgaW5saW5lIHVsb25nIHRvX2Zha2VfdXNlZF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IHNkX3NpemUpCiB7Ci0gICAgbG9mZl90IGJ5dGVzID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKSA7Ci0gICAgbG9mZl90IHJlYWxfc3BhY2UgPSByZWFsX3NwYWNlX2RpZmYoaW5vZGUsIHNkX3NpemUpIDsKKwlsb2ZmX3QgYnl0ZXMgPSBpbm9kZV9nZXRfYnl0ZXMoaW5vZGUpOworCWxvZmZfdCByZWFsX3NwYWNlID0gcmVhbF9zcGFjZV9kaWZmKGlub2RlLCBzZF9zaXplKTsKIAotICAgIC8qIGtlZXBzIGZzY2sgYW5kIG5vbi1xdW90YSB2ZXJzaW9ucyBvZiByZWlzZXJmcyBoYXBweSAqLwotICAgIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLSAgICAgICAgYnl0ZXMgKz0gKGxvZmZfdCk1MTEgOwotICAgIH0KKwkvKiBrZWVwcyBmc2NrIGFuZCBub24tcXVvdGEgdmVyc2lvbnMgb2YgcmVpc2VyZnMgaGFwcHkgKi8KKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWJ5dGVzICs9IChsb2ZmX3QpIDUxMTsKKwl9CiAKLSAgICAvKiBmaWxlcyBmcm9tIGJlZm9yZSB0aGUgcXVvdGEgcGF0Y2ggbWlnaHQgaV9ibG9ja3Mgc3VjaCB0aGF0Ci0gICAgKiogYnl0ZXMgPCByZWFsX3NwYWNlLiAgRGVhbCB3aXRoIHRoYXQgaGVyZSB0byBwcmV2ZW50IGl0IGZyb20KLSAgICAqKiBnb2luZyBuZWdhdGl2ZS4KLSAgICAqLwotICAgIGlmIChieXRlcyA8IHJlYWxfc3BhY2UpCi0gICAgICAgIHJldHVybiAwIDsKLSAgICByZXR1cm4gKGJ5dGVzIC0gcmVhbF9zcGFjZSkgPj4gOTsKKwkvKiBmaWxlcyBmcm9tIGJlZm9yZSB0aGUgcXVvdGEgcGF0Y2ggbWlnaHQgaV9ibG9ja3Mgc3VjaCB0aGF0CisJICoqIGJ5dGVzIDwgcmVhbF9zcGFjZS4gIERlYWwgd2l0aCB0aGF0IGhlcmUgdG8gcHJldmVudCBpdCBmcm9tCisJICoqIGdvaW5nIG5lZ2F0aXZlLgorCSAqLworCWlmIChieXRlcyA8IHJlYWxfc3BhY2UpCisJCXJldHVybiAwOworCXJldHVybiAoYnl0ZXMgLSByZWFsX3NwYWNlKSA+PiA5OwogfQogCiAvLwpAQCAtMTA0MiwyNjMgKzExMTgsMjY5IEBACiAvLwogCiAvLyBjYWxsZWQgYnkgcmVhZF9sb2NrZWRfaW5vZGUKLXN0YXRpYyB2b2lkIGluaXRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcGF0aCAqIHBhdGgpCitzdGF0aWMgdm9pZCBpbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgICBfX3UzMiByZGV2OwotICAgIC8vaW50IHZlcnNpb24gPSBJVEVNX1ZFUlNJT05fMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCV9fdTMyIHJkZXY7CisJLy9pbnQgdmVyc2lvbiA9IElURU1fVkVSU0lPTl8xOwogCi0gICAgYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAocGF0aCk7Ci0gICAgaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworCWJoID0gUEFUSF9QTEFTVF9CVUZGRVIocGF0aCk7CisJaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CiAKKwljb3B5X2tleShJTk9ERV9QS0VZKGlub2RlKSwgJihpaC0+aWhfa2V5KSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsKIAotICAgIGNvcHlfa2V5IChJTk9ERV9QS0VZIChpbm9kZSksICYoaWgtPmloX2tleSkpOwotICAgIGlub2RlLT5pX2Jsa3NpemUgPSByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CisJSU5JVF9MSVNUX0hFQUQoJihSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0KSk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CisJaW5pdF9yd3NlbSgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CiAKLSAgICBJTklUX0xJU1RfSEVBRCgmKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QgKSk7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gTlVMTDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7Ci0gICAgaW5pdF9yd3NlbSAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWlmIChzdGF0X2RhdGFfdjEoaWgpKSB7CisJCXN0cnVjdCBzdGF0X2RhdGFfdjEgKnNkID0KKwkJICAgIChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopQl9JX1BJVEVNKGJoLCBpaCk7CisJCXVuc2lnbmVkIGxvbmcgYmxvY2tzOwogCi0gICAgaWYgKHN0YXRfZGF0YV92MSAoaWgpKSB7Ci0Jc3RydWN0IHN0YXRfZGF0YV92MSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilCX0lfUElURU0gKGJoLCBpaCk7Ci0JdW5zaWduZWQgbG9uZyBibG9ja3M7CisJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjEpOworCQlpbm9kZS0+aV9tb2RlID0gc2RfdjFfbW9kZShzZCk7CisJCWlub2RlLT5pX25saW5rID0gc2RfdjFfbmxpbmsoc2QpOworCQlpbm9kZS0+aV91aWQgPSBzZF92MV91aWQoc2QpOworCQlpbm9kZS0+aV9naWQgPSBzZF92MV9naWQoc2QpOworCQlpbm9kZS0+aV9zaXplID0gc2RfdjFfc2l6ZShzZCk7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YxX2F0aW1lKHNkKTsKKwkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc2RfdjFfbXRpbWUoc2QpOworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBzZF92MV9jdGltZShzZCk7CisJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CiAKLQlzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKLSAgICAgICAgc2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlLCBTVEFUX0RBVEFfVjEpOwotCWlub2RlLT5pX21vZGUgID0gc2RfdjFfbW9kZShzZCk7Ci0JaW5vZGUtPmlfbmxpbmsgPSBzZF92MV9ubGluayhzZCk7Ci0JaW5vZGUtPmlfdWlkICAgPSBzZF92MV91aWQoc2QpOwotCWlub2RlLT5pX2dpZCAgID0gc2RfdjFfZ2lkKHNkKTsKLQlpbm9kZS0+aV9zaXplICA9IHNkX3YxX3NpemUoc2QpOwotCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YxX2F0aW1lKHNkKTsKLQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzZF92MV9tdGltZShzZCk7Ci0JaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc2RfdjFfY3RpbWUoc2QpOwotCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9ibG9ja3MgPSBzZF92MV9ibG9ja3Moc2QpOworCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKTsKKwkJYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisJCWJsb2NrcyA9IF9ST1VORF9VUChibG9ja3MsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA+PiA5KTsKKwkJaWYgKGlub2RlLT5pX2Jsb2NrcyA+IGJsb2NrcykgeworCQkJLy8gdGhlcmUgd2FzIGEgYnVnIGluIDw9My41LjIzIHdoZW4gaV9ibG9ja3MgY291bGQgdGFrZSBuZWdhdGl2ZQorCQkJLy8gdmFsdWVzLiBTdGFydGluZyBmcm9tIDMuNS4xNyB0aGlzIHZhbHVlIGNvdWxkIGV2ZW4gYmUgc3RvcmVkIGluCisJCQkvLyBzdGF0IGRhdGEuIEZvciBzdWNoIGZpbGVzIHdlIHNldCBpX2Jsb2NrcyBiYXNlZCBvbiBmaWxlCisJCQkvLyBzaXplLiBKdXN0IDIgbm90ZXM6IHRoaXMgY2FuIGJlIHdyb25nIGZvciBzcGFyY2UgZmlsZXMuIE9uLWRpc2sgdmFsdWUgd2lsbCBiZQorCQkJLy8gb25seSB1cGRhdGVkIGlmIGZpbGUncyBpbm9kZSB3aWxsIGV2ZXIgY2hhbmdlCisJCQlpbm9kZS0+aV9ibG9ja3MgPSBibG9ja3M7CisJCX0KIAotCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YxX2Jsb2NrcyhzZCk7Ci0JaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKTsKLQlibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKLQlibG9ja3MgPSBfUk9VTkRfVVAgKGJsb2NrcywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpOwotCWlmIChpbm9kZS0+aV9ibG9ja3MgPiBibG9ja3MpIHsKLQkgICAgLy8gdGhlcmUgd2FzIGEgYnVnIGluIDw9My41LjIzIHdoZW4gaV9ibG9ja3MgY291bGQgdGFrZSBuZWdhdGl2ZQotCSAgICAvLyB2YWx1ZXMuIFN0YXJ0aW5nIGZyb20gMy41LjE3IHRoaXMgdmFsdWUgY291bGQgZXZlbiBiZSBzdG9yZWQgaW4KLQkgICAgLy8gc3RhdCBkYXRhLiBGb3Igc3VjaCBmaWxlcyB3ZSBzZXQgaV9ibG9ja3MgYmFzZWQgb24gZmlsZQotCSAgICAvLyBzaXplLiBKdXN0IDIgbm90ZXM6IHRoaXMgY2FuIGJlIHdyb25nIGZvciBzcGFyY2UgZmlsZXMuIE9uLWRpc2sgdmFsdWUgd2lsbCBiZQotCSAgICAvLyBvbmx5IHVwZGF0ZWQgaWYgZmlsZSdzIGlub2RlIHdpbGwgZXZlciBjaGFuZ2UKLQkgICAgaW5vZGUtPmlfYmxvY2tzID0gYmxvY2tzOworCQlyZGV2ID0gc2RfdjFfcmRldihzZCk7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0KKwkJICAgIHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKTsKKwkJLyogYW4gZWFybHkgYnVnIGluIHRoZSBxdW90YSBjb2RlIGNhbiBnaXZlIHVzIGFuIG9kZCBudW1iZXIgZm9yIHRoZQorCQkgKiogYmxvY2sgY291bnQuICBUaGlzIGlzIGluY29ycmVjdCwgZml4IGl0IGhlcmUuCisJCSAqLworCQlpZiAoaW5vZGUtPmlfYmxvY2tzICYgMSkgeworCQkJaW5vZGUtPmlfYmxvY2tzKys7CisJCX0KKwkJaW5vZGVfc2V0X2J5dGVzKGlub2RlLAorCQkJCXRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAorCQkJCQkJICAgU0RfVjFfU0laRSkpOworCQkvKiBub3BhY2sgaXMgaW5pdGlhbGx5IHplcm8gZm9yIHYxIG9iamVjdHMuIEZvciB2MiBvYmplY3RzLAorCQkgICBub3BhY2sgaXMgaW5pdGlhbGlzZWQgZnJvbSBzZF9hdHRycyAqLworCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9ub3BhY2tfbWFzazsKKwl9IGVsc2UgeworCQkvLyBuZXcgc3RhdCBkYXRhIGZvdW5kLCBidXQgb2JqZWN0IG1heSBoYXZlIG9sZCBpdGVtcworCQkvLyAoZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzKQorCQlzdHJ1Y3Qgc3RhdF9kYXRhICpzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopQl9JX1BJVEVNKGJoLCBpaCk7CisKKwkJaW5vZGUtPmlfbW9kZSA9IHNkX3YyX21vZGUoc2QpOworCQlpbm9kZS0+aV9ubGluayA9IHNkX3YyX25saW5rKHNkKTsKKwkJaW5vZGUtPmlfdWlkID0gc2RfdjJfdWlkKHNkKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IHNkX3YyX3NpemUoc2QpOworCQlpbm9kZS0+aV9naWQgPSBzZF92Ml9naWQoc2QpOworCQlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBzZF92Ml9tdGltZShzZCk7CisJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YyX2F0aW1lKHNkKTsKKwkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc2RfdjJfY3RpbWUoc2QpOworCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9ibG9ja3MgPSBzZF92Ml9ibG9ja3Moc2QpOworCQlyZGV2ID0gc2RfdjJfcmRldihzZCk7CisJCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0KKwkJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpOworCQllbHNlCisJCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gc2RfdjJfZ2VuZXJhdGlvbihzZCk7CisKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisJCWVsc2UKKwkJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNik7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gMDsKKwkJc2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUsIFNUQVRfREFUQV9WMik7CisJCWlub2RlX3NldF9ieXRlcyhpbm9kZSwKKwkJCQl0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKKwkJCQkJCSAgIFNEX1YyX1NJWkUpKTsKKwkJLyogcmVhZCBwZXJzaXN0ZW50IGlub2RlIGF0dHJpYnV0ZXMgZnJvbSBzZCBhbmQgaW5pdGFsaXNlCisJCSAgIGdlbmVyaWMgaW5vZGUgZmxhZ3MgZnJvbSB0aGVtICovCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzID0gc2RfdjJfYXR0cnMoc2QpOworCQlzZF9hdHRyc190b19pX2F0dHJzKHNkX3YyX2F0dHJzKHNkKSwgaW5vZGUpOwogCX0KIAotICAgICAgICByZGV2ID0gc2RfdjFfcmRldihzZCk7Ci0JUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBzZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZCk7Ci0JLyogYW4gZWFybHkgYnVnIGluIHRoZSBxdW90YSBjb2RlIGNhbiBnaXZlIHVzIGFuIG9kZCBudW1iZXIgZm9yIHRoZQotCSoqIGJsb2NrIGNvdW50LiAgVGhpcyBpcyBpbmNvcnJlY3QsIGZpeCBpdCBoZXJlLgotCSovCi0JaWYgKGlub2RlLT5pX2Jsb2NrcyAmIDEpIHsKLQkgICAgaW5vZGUtPmlfYmxvY2tzKysgOworCXBhdGhyZWxzZShwYXRoKTsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIG5ld19kZWNvZGVfZGV2KHJkZXYpKTsKIAl9Ci0JaW5vZGVfc2V0X2J5dGVzKGlub2RlLCB0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRF9WMV9TSVpFKSk7Ci0JLyogbm9wYWNrIGlzIGluaXRpYWxseSB6ZXJvIGZvciB2MSBvYmplY3RzLiBGb3IgdjIgb2JqZWN0cywKLQkgICBub3BhY2sgaXMgaW5pdGlhbGlzZWQgZnJvbSBzZF9hdHRycyAqLwotCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5pX25vcGFja19tYXNrOwotICAgIH0gZWxzZSB7Ci0JLy8gbmV3IHN0YXQgZGF0YSBmb3VuZCwgYnV0IG9iamVjdCBtYXkgaGF2ZSBvbGQgaXRlbXMKLQkvLyAoZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzKQotCXN0cnVjdCBzdGF0X2RhdGEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopQl9JX1BJVEVNIChiaCwgaWgpOwotCi0JaW5vZGUtPmlfbW9kZSAgID0gc2RfdjJfbW9kZShzZCk7Ci0JaW5vZGUtPmlfbmxpbmsgID0gc2RfdjJfbmxpbmsoc2QpOwotCWlub2RlLT5pX3VpZCAgICA9IHNkX3YyX3VpZChzZCk7Ci0JaW5vZGUtPmlfc2l6ZSAgID0gc2RfdjJfc2l6ZShzZCk7Ci0JaW5vZGUtPmlfZ2lkICAgID0gc2RfdjJfZ2lkKHNkKTsKLQlpbm9kZS0+aV9tdGltZS50dl9zZWMgID0gc2RfdjJfbXRpbWUoc2QpOwotCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHNkX3YyX2F0aW1lKHNkKTsKLQlpbm9kZS0+aV9jdGltZS50dl9zZWMgID0gc2RfdjJfY3RpbWUoc2QpOwotCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOwotCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YyX2Jsb2NrcyhzZCk7Ci0gICAgICAgIHJkZXYgICAgICAgICAgICA9IHNkX3YyX3JkZXYoc2QpOwotCWlmKCBTX0lTQ0hSKCBpbm9kZSAtPiBpX21vZGUgKSB8fCBTX0lTQkxLKCBpbm9kZSAtPiBpX21vZGUgKSApCi0JICAgIGlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCk7Ci0JZWxzZQotICAgICAgICAgICAgaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IHNkX3YyX2dlbmVyYXRpb24oc2QpOwotCi0JaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQotCSAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM181KTsKLQllbHNlCi0JICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOwotCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gMDsKLQlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMik7Ci0JaW5vZGVfc2V0X2J5dGVzKGlub2RlLCB0b19yZWFsX3VzZWRfc3BhY2UoaW5vZGUsIGlub2RlLT5pX2Jsb2NrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRF9WMl9TSVpFKSk7Ci0JLyogcmVhZCBwZXJzaXN0ZW50IGlub2RlIGF0dHJpYnV0ZXMgZnJvbSBzZCBhbmQgaW5pdGFsaXNlCi0JICAgZ2VuZXJpYyBpbm9kZSBmbGFncyBmcm9tIHRoZW0gKi8KLQlSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycyA9IHNkX3YyX2F0dHJzKCBzZCApOwotCXNkX2F0dHJzX3RvX2lfYXR0cnMoIHNkX3YyX2F0dHJzKCBzZCApLCBpbm9kZSApOwotICAgIH0KLQotICAgIHBhdGhyZWxzZSAocGF0aCk7Ci0gICAgaWYgKFNfSVNSRUcgKGlub2RlLT5pX21vZGUpKSB7Ci0JaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotCWlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIDsKLSAgICB9IGVsc2UgaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKSB7Ci0JaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOwotICAgIH0gZWxzZSBpZiAoU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkpIHsKLQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwotICAgIH0gZWxzZSB7Ci0JaW5vZGUtPmlfYmxvY2tzID0gMDsKLQlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7Ci0JaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBuZXdfZGVjb2RlX2RldihyZGV2KSk7Ci0gICAgfQogfQogCi0KIC8vIHVwZGF0ZSBuZXcgc3RhdCBkYXRhIHdpdGggaW5vZGUgZmllbGRzCi1zdGF0aWMgdm9pZCBpbm9kZTJzZCAodm9pZCAqIHNkLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpCitzdGF0aWMgdm9pZCBpbm9kZTJzZCh2b2lkICpzZCwgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCiB7Ci0gICAgc3RydWN0IHN0YXRfZGF0YSAqIHNkX3YyID0gKHN0cnVjdCBzdGF0X2RhdGEgKilzZDsKLSAgICBfX3UxNiBmbGFnczsKKwlzdHJ1Y3Qgc3RhdF9kYXRhICpzZF92MiA9IChzdHJ1Y3Qgc3RhdF9kYXRhICopc2Q7CisJX191MTYgZmxhZ3M7CiAKLSAgICBzZXRfc2RfdjJfbW9kZShzZF92MiwgaW5vZGUtPmlfbW9kZSApOwotICAgIHNldF9zZF92Ml9ubGluayhzZF92MiwgaW5vZGUtPmlfbmxpbmsgKTsKLSAgICBzZXRfc2RfdjJfdWlkKHNkX3YyLCBpbm9kZS0+aV91aWQgKTsKLSAgICBzZXRfc2RfdjJfc2l6ZShzZF92Miwgc2l6ZSApOwotICAgIHNldF9zZF92Ml9naWQoc2RfdjIsIGlub2RlLT5pX2dpZCApOwotICAgIHNldF9zZF92Ml9tdGltZShzZF92MiwgaW5vZGUtPmlfbXRpbWUudHZfc2VjICk7Ci0gICAgc2V0X3NkX3YyX2F0aW1lKHNkX3YyLCBpbm9kZS0+aV9hdGltZS50dl9zZWMgKTsKLSAgICBzZXRfc2RfdjJfY3RpbWUoc2RfdjIsIGlub2RlLT5pX2N0aW1lLnR2X3NlYyApOwotICAgIHNldF9zZF92Ml9ibG9ja3Moc2RfdjIsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YyX1NJWkUpKTsKLSAgICBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQotCXNldF9zZF92Ml9yZGV2KHNkX3YyLCBuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7Ci0gICAgZWxzZQotCXNldF9zZF92Ml9nZW5lcmF0aW9uKHNkX3YyLCBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKLSAgICBmbGFncyA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzOwotICAgIGlfYXR0cnNfdG9fc2RfYXR0cnMoIGlub2RlLCAmZmxhZ3MgKTsKLSAgICBzZXRfc2RfdjJfYXR0cnMoIHNkX3YyLCBmbGFncyApOworCXNldF9zZF92Ml9tb2RlKHNkX3YyLCBpbm9kZS0+aV9tb2RlKTsKKwlzZXRfc2RfdjJfbmxpbmsoc2RfdjIsIGlub2RlLT5pX25saW5rKTsKKwlzZXRfc2RfdjJfdWlkKHNkX3YyLCBpbm9kZS0+aV91aWQpOworCXNldF9zZF92Ml9zaXplKHNkX3YyLCBzaXplKTsKKwlzZXRfc2RfdjJfZ2lkKHNkX3YyLCBpbm9kZS0+aV9naWQpOworCXNldF9zZF92Ml9tdGltZShzZF92MiwgaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKKwlzZXRfc2RfdjJfYXRpbWUoc2RfdjIsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJc2V0X3NkX3YyX2N0aW1lKHNkX3YyLCBpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCXNldF9zZF92Ml9ibG9ja3Moc2RfdjIsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YyX1NJWkUpKTsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlzZXRfc2RfdjJfcmRldihzZF92MiwgbmV3X2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCWVsc2UKKwkJc2V0X3NkX3YyX2dlbmVyYXRpb24oc2RfdjIsIGlub2RlLT5pX2dlbmVyYXRpb24pOworCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7CisJaV9hdHRyc190b19zZF9hdHRycyhpbm9kZSwgJmZsYWdzKTsKKwlzZXRfc2RfdjJfYXR0cnMoc2RfdjIsIGZsYWdzKTsKIH0KIAotCiAvLyB1c2VkIHRvIGNvcHkgaW5vZGUncyBmaWVsZHMgdG8gb2xkIHN0YXQgZGF0YQotc3RhdGljIHZvaWQgaW5vZGUyc2RfdjEgKHZvaWQgKiBzZCwgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKQorc3RhdGljIHZvaWQgaW5vZGUyc2RfdjEodm9pZCAqc2QsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzaXplKQogewotICAgIHN0cnVjdCBzdGF0X2RhdGFfdjEgKiBzZF92MSA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopc2Q7CisJc3RydWN0IHN0YXRfZGF0YV92MSAqc2RfdjEgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKXNkOwogCi0gICAgc2V0X3NkX3YxX21vZGUoc2RfdjEsIGlub2RlLT5pX21vZGUgKTsKLSAgICBzZXRfc2RfdjFfdWlkKHNkX3YxLCBpbm9kZS0+aV91aWQgKTsKLSAgICBzZXRfc2RfdjFfZ2lkKHNkX3YxLCBpbm9kZS0+aV9naWQgKTsKLSAgICBzZXRfc2RfdjFfbmxpbmsoc2RfdjEsIGlub2RlLT5pX25saW5rICk7Ci0gICAgc2V0X3NkX3YxX3NpemUoc2RfdjEsIHNpemUgKTsKLSAgICBzZXRfc2RfdjFfYXRpbWUoc2RfdjEsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyApOwotICAgIHNldF9zZF92MV9jdGltZShzZF92MSwgaW5vZGUtPmlfY3RpbWUudHZfc2VjICk7Ci0gICAgc2V0X3NkX3YxX210aW1lKHNkX3YxLCBpbm9kZS0+aV9tdGltZS50dl9zZWMgKTsKKwlzZXRfc2RfdjFfbW9kZShzZF92MSwgaW5vZGUtPmlfbW9kZSk7CisJc2V0X3NkX3YxX3VpZChzZF92MSwgaW5vZGUtPmlfdWlkKTsKKwlzZXRfc2RfdjFfZ2lkKHNkX3YxLCBpbm9kZS0+aV9naWQpOworCXNldF9zZF92MV9ubGluayhzZF92MSwgaW5vZGUtPmlfbmxpbmspOworCXNldF9zZF92MV9zaXplKHNkX3YxLCBzaXplKTsKKwlzZXRfc2RfdjFfYXRpbWUoc2RfdjEsIGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJc2V0X3NkX3YxX2N0aW1lKHNkX3YxLCBpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCXNldF9zZF92MV9tdGltZShzZF92MSwgaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKIAotICAgIGlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgIHNldF9zZF92MV9yZGV2KHNkX3YxLCBuZXdfZW5jb2RlX2Rldihpbm9kZS0+aV9yZGV2KSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRfc2RfdjFfYmxvY2tzKHNkX3YxLCB0b19mYWtlX3VzZWRfYmxvY2tzKGlub2RlLCBTRF9WMV9TSVpFKSk7CisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwkJc2V0X3NkX3YxX3JkZXYoc2RfdjEsIG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwllbHNlCisJCXNldF9zZF92MV9ibG9ja3Moc2RfdjEsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YxX1NJWkUpKTsKIAotICAgIC8vIFNpZ2guIGlfZmlyc3RfZGlyZWN0X2J5dGUgaXMgYmFjawotICAgIHNldF9zZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZF92MSwgUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUpOworCS8vIFNpZ2guIGlfZmlyc3RfZGlyZWN0X2J5dGUgaXMgYmFjaworCXNldF9zZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZF92MSwKKwkJCQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUpOwogfQogCi0KIC8qIE5PVEUsIHlvdSBtdXN0IHByZXBhcmUgdGhlIGJ1ZmZlciBoZWFkIGJlZm9yZSBzZW5kaW5nIGl0IGhlcmUsCiAqKiBhbmQgdGhlbiBsb2cgaXQgYWZ0ZXIgdGhlIGNhbGwKICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfc3RhdF9kYXRhIChzdHJ1Y3QgcGF0aCAqIHBhdGgsIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IHNpemUpCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdF9kYXRhKHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBsb2ZmX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gIAotICAgIGJoID0gUEFUSF9QTEFTVF9CVUZGRVIgKHBhdGgpOwotICAgIGloID0gUEFUSF9QSVRFTV9IRUFEIChwYXRoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gICAgaWYgKCFpc19zdGF0ZGF0YV9sZV9paCAoaWgpKQotCXJlaXNlcmZzX3BhbmljIChpbm9kZS0+aV9zYiwgInZzLTEzMDY1OiB1cGRhdGVfc3RhdF9kYXRhOiBrZXkgJWssIGZvdW5kIGl0ZW0gJWgiLAotCQkJSU5PREVfUEtFWSAoaW5vZGUpLCBpaCk7Ci0gIAotICAgIGlmIChzdGF0X2RhdGFfdjEgKGloKSkgewotCS8vIHBhdGggcG9pbnRzIHRvIG9sZCBzdGF0IGRhdGEKLQlpbm9kZTJzZF92MSAoQl9JX1BJVEVNIChiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLQlpbm9kZTJzZCAoQl9JX1BJVEVNIChiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7Ci0gICAgfQorCWJoID0gUEFUSF9QTEFTVF9CVUZGRVIocGF0aCk7CisJaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CiAKLSAgICByZXR1cm47CisJaWYgKCFpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLAorCQkJICAgICAgICJ2cy0xMzA2NTogdXBkYXRlX3N0YXRfZGF0YToga2V5ICVrLCBmb3VuZCBpdGVtICVoIiwKKwkJCSAgICAgICBJTk9ERV9QS0VZKGlub2RlKSwgaWgpOworCisJaWYgKHN0YXRfZGF0YV92MShpaCkpIHsKKwkJLy8gcGF0aCBwb2ludHMgdG8gb2xkIHN0YXQgZGF0YQorCQlpbm9kZTJzZF92MShCX0lfUElURU0oYmgsIGloKSwgaW5vZGUsIHNpemUpOworCX0gZWxzZSB7CisJCWlub2RlMnNkKEJfSV9QSVRFTShiaCwgaWgpLCBpbm9kZSwgc2l6ZSk7CisJfQorCisJcmV0dXJuOwogfQogCi0KLXZvaWQgcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJICAgICAgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKQordm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHNpemUpCiB7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKLSAgICBpbnQgZnNfZ2VuIDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loIDsKLSAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZnNfZ2VuOworCXN0cnVjdCBpdGVtX2hlYWQgKmloLCB0bXBfaWg7CisJaW50IHJldHZhbDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIDMpOy8va2V5IHR5cGUgaXMgdW5pbXBvcnRhbnQKLSAgICAKLSAgICBmb3IoOzspIHsKLQlpbnQgcG9zOwotCS8qIGxvb2sgZm9yIHRoZSBvYmplY3QncyBzdGF0IGRhdGEgKi8KLQlyZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgotCQkJICAgICAgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byB1cGRhdGUgJUsgc3RhdCBkYXRhIiwKLQkJCSAgICAgICZrZXkpOwotCSAgICByZXR1cm47CisJbWFrZV9jcHVfa2V5KCZrZXksIGlub2RlLCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCAzKTsJLy9rZXkgdHlwZSBpcyB1bmltcG9ydGFudAorCisJZm9yICg7OykgeworCQlpbnQgcG9zOworCQkvKiBsb29rIGZvciB0aGUgb2JqZWN0J3Mgc3RhdCBkYXRhICovCisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogIgorCQkJCQkgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byB1cGRhdGUgJUsgc3RhdCBkYXRhIiwKKwkJCQkJICZrZXkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChyZXR2YWwgPT0gSVRFTV9OT1RfRk9VTkQpIHsKKwkJCXBvcyA9IFBBVEhfTEFTVF9QT1NJVElPTigmcGF0aCk7CisJCQlwYXRocmVsc2UoJnBhdGgpOworCQkJaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKKwkJCQkvKnJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNTA6IHJlaXNlcmZzX3VwZGF0ZV9zZDogaV9ubGluayA9PSAwLCBzdGF0IGRhdGEgbm90IGZvdW5kIik7ICovCisJCQkJcmV0dXJuOworCQkJfQorCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJ2cy0xMzA2MDogcmVpc2VyZnNfdXBkYXRlX3NkOiAiCisJCQkJCSAic3RhdCBkYXRhIG9mIG9iamVjdCAlayAobmxpbmsgPT0gJWQpIG5vdCBmb3VuZCAocG9zICVkKSIsCisJCQkJCSBJTk9ERV9QS0VZKGlub2RlKSwgaW5vZGUtPmlfbmxpbmssCisJCQkJCSBwb3MpOworCQkJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisJCQlyZXR1cm47CisJCX0KKworCQkvKiBzaWdoLCBwcmVwYXJlX2Zvcl9qb3VybmFsIG1pZ2h0IHNjaGVkdWxlLiAgV2hlbiBpdCBzY2hlZHVsZXMgdGhlCisJCSAqKiBGUyBtaWdodCBjaGFuZ2UuICBXZSBoYXZlIHRvIGRldGVjdCB0aGF0LCBhbmQgbG9vcCBiYWNrIHRvIHRoZQorCQkgKiogc2VhcmNoIGlmIHRoZSBzdGF0IGRhdGEgaXRlbSBoYXMgbW92ZWQKKwkJICovCisJCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCQlpaCA9IGdldF9paCgmcGF0aCk7CisJCWNvcHlfaXRlbV9oZWFkKCZ0bXBfaWgsIGloKTsKKwkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSk7CisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpCisJCSAgICAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKTsKKwkJCWNvbnRpbnVlOwkvKiBTdGF0X2RhdGEgaXRlbSBoYXMgYmVlbiBtb3ZlZCBhZnRlciBzY2hlZHVsaW5nLiAqLworCQl9CisJCWJyZWFrOwogCX0KLQlpZiAocmV0dmFsID09IElURU1fTk9UX0ZPVU5EKSB7Ci0JICAgIHBvcyA9IFBBVEhfTEFTVF9QT1NJVElPTiAoJnBhdGgpOwotCSAgICBwYXRocmVsc2UoJnBhdGgpIDsKLQkgICAgaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKLQkJLypyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTEzMDUwOiByZWlzZXJmc191cGRhdGVfc2Q6IGlfbmxpbmsgPT0gMCwgc3RhdCBkYXRhIG5vdCBmb3VuZCIpOyovCi0JCXJldHVybjsKLQkgICAgfQotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgInZzLTEzMDYwOiByZWlzZXJmc191cGRhdGVfc2Q6ICIKLQkJCSAgICAgICJzdGF0IGRhdGEgb2Ygb2JqZWN0ICVrIChubGluayA9PSAlZCkgbm90IGZvdW5kIChwb3MgJWQpIiwKLQkJCSAgICAgIElOT0RFX1BLRVkgKGlub2RlKSwgaW5vZGUtPmlfbmxpbmssIHBvcyk7Ci0JICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKLQkgICAgcmV0dXJuOwotCX0KLQkKLQkvKiBzaWdoLCBwcmVwYXJlX2Zvcl9qb3VybmFsIG1pZ2h0IHNjaGVkdWxlLiAgV2hlbiBpdCBzY2hlZHVsZXMgdGhlCi0JKiogRlMgbWlnaHQgY2hhbmdlLiAgV2UgaGF2ZSB0byBkZXRlY3QgdGhhdCwgYW5kIGxvb3AgYmFjayB0byB0aGUKLQkqKiBzZWFyY2ggaWYgdGhlIHN0YXQgZGF0YSBpdGVtIGhhcyBtb3ZlZAotCSovCi0JYmggPSBnZXRfbGFzdF9iaCgmcGF0aCkgOwotCWloID0gZ2V0X2loKCZwYXRoKSA7Ci0JY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsKLQlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAoaW5vZGUtPmlfc2IpOwotCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKSA7Ci0JaWYgKGZzX2NoYW5nZWQgKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCSAgICBjb250aW51ZSA7CS8qIFN0YXRfZGF0YSBpdGVtIGhhcyBiZWVuIG1vdmVkIGFmdGVyIHNjaGVkdWxpbmcuICovCi0JfQotCWJyZWFrOwotICAgIH0KLSAgICB1cGRhdGVfc3RhdF9kYXRhICgmcGF0aCwgaW5vZGUsIHNpemUpOwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgdGgtPnRfc3VwZXIsIGJoKSA7IAotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIHJldHVybjsKKwl1cGRhdGVfc3RhdF9kYXRhKCZwYXRoLCBpbm9kZSwgc2l6ZSk7CisJam91cm5hbF9tYXJrX2RpcnR5KHRoLCB0aC0+dF9zdXBlciwgYmgpOworCXBhdGhyZWxzZSgmcGF0aCk7CisJcmV0dXJuOwogfQogCiAvKiByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZSBpcyBjYWxsZWQgdG8gcmVhZCB0aGUgaW5vZGUgb2ZmIGRpc2ssIGFuZCBpdApAQCAtMTMwNyw5ICsxMzg5LDEwIEBACiAqKiBjb3JyZXNwb25kaW5nIGlwdXQgbWlnaHQgdHJ5IHRvIGRlbGV0ZSB3aGF0ZXZlciBvYmplY3QgdGhlIGlub2RlIGxhc3QKICoqIHJlcHJlc2VudGVkLgogKi8KLXN0YXRpYyB2b2lkIHJlaXNlcmZzX21ha2VfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICBtZW1zZXQoSU5PREVfUEtFWShpbm9kZSksIDAsIEtFWV9TSVpFKTsKLSAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSk7CitzdGF0aWMgdm9pZCByZWlzZXJmc19tYWtlX2JhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCW1lbXNldChJTk9ERV9QS0VZKGlub2RlKSwgMCwgS0VZX1NJWkUpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKIH0KIAogLy8KQEAgLTEzMTcsNzcgKzE0MDAsNzkgQEAKIC8vIGV2b2x2ZWQgYXMgdGhlIHByb3RvdHlwZSBkaWQKIC8vCiAKLWludCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHZvaWQgKnApCitpbnQgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqcCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzID0gKHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKilwIDsKLSAgICBpbm9kZS0+aV9pbm8gPSBhcmdzLT5vYmplY3RpZDsKLSAgICBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQgPSBjcHVfdG9fbGUzMihhcmdzLT5kaXJpZCk7Ci0gICAgcmV0dXJuIDA7CisJc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncyA9IChzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICopcDsKKwlpbm9kZS0+aV9pbm8gPSBhcmdzLT5vYmplY3RpZDsKKwlJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQgPSBjcHVfdG9fbGUzMihhcmdzLT5kaXJpZCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIGxvb2tzIGZvciBzdGF0IGRhdGEgaW4gdGhlIHRyZWUsIGFuZCBmaWxscyB1cCB0aGUgZmllbGRzIG9mIGluLWNvcmUKICAgIGlub2RlIHN0YXQgZGF0YSBmaWVsZHMgKi8KLXZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzKQordm9pZCByZWlzZXJmc19yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MpCiB7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX3NkKTsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgdW5zaWduZWQgbG9uZyBkaXJpbm87Ci0gICAgaW50IHJldHZhbDsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19zZCk7CisJc3RydWN0IGNwdV9rZXkga2V5OworCXVuc2lnbmVkIGxvbmcgZGlyaW5vOworCWludCByZXR2YWw7CiAKLSAgICBkaXJpbm8gPSBhcmdzLT5kaXJpZCA7CisJZGlyaW5vID0gYXJncy0+ZGlyaWQ7CiAKLSAgICAvKiBzZXQgdmVyc2lvbiAxLCB2ZXJzaW9uIDIgY291bGQgYmUgdXNlZCB0b28sIGJlY2F1c2Ugc3RhdCBkYXRhCi0gICAgICAga2V5IGlzIHRoZSBzYW1lIGluIGJvdGggdmVyc2lvbnMgKi8KLSAgICBrZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIGtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRpcmlubzsKLSAgICBrZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGlub2RlLT5pX2lubzsKLSAgICBrZXkub25fZGlza19rZXkua19vZmZzZXQgPSAwOwotICAgIGtleS5vbl9kaXNrX2tleS5rX3R5cGUgPSAwOworCS8qIHNldCB2ZXJzaW9uIDEsIHZlcnNpb24gMiBjb3VsZCBiZSB1c2VkIHRvbywgYmVjYXVzZSBzdGF0IGRhdGEKKwkgICBrZXkgaXMgdGhlIHNhbWUgaW4gYm90aCB2ZXJzaW9ucyAqLworCWtleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7CisJa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gZGlyaW5vOworCWtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gaW5vZGUtPmlfaW5vOworCWtleS5vbl9kaXNrX2tleS5rX29mZnNldCA9IDA7CisJa2V5Lm9uX2Rpc2tfa2V5LmtfdHlwZSA9IDA7CiAKLSAgICAvKiBsb29rIGZvciB0aGUgb2JqZWN0J3Mgc3RhdCBkYXRhICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aF90b19zZCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMTMwNzA6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCi0JCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZmluZCBzdGF0IGRhdGEgb2YgJUsiLAotCQkJICAma2V5KTsKLQlyZWlzZXJmc19tYWtlX2JhZF9pbm9kZShpbm9kZSkgOwotCXJldHVybjsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCAhPSBJVEVNX0ZPVU5EKSB7Ci0JLyogYSBzdGFsZSBORlMgaGFuZGxlIGNhbiB0cmlnZ2VyIHRoaXMgd2l0aG91dCBpdCBiZWluZyBhbiBlcnJvciAqLwotCXBhdGhyZWxzZSAoJnBhdGhfdG9fc2QpOwotCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKSA7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOwotCXJldHVybjsKLSAgICB9CisJLyogbG9vayBmb3IgdGhlIG9iamVjdCdzIHN0YXQgZGF0YSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aF90b19zZCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAidnMtMTMwNzA6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCisJCQkJICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZmluZCBzdGF0IGRhdGEgb2YgJUsiLAorCQkJCSAma2V5KTsKKwkJcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCWlmIChyZXR2YWwgIT0gSVRFTV9GT1VORCkgeworCQkvKiBhIHN0YWxlIE5GUyBoYW5kbGUgY2FuIHRyaWdnZXIgdGhpcyB3aXRob3V0IGl0IGJlaW5nIGFuIGVycm9yICovCisJCXBhdGhyZWxzZSgmcGF0aF90b19zZCk7CisJCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlyZXR1cm47CisJfQogCi0gICAgaW5pdF9pbm9kZSAoaW5vZGUsICZwYXRoX3RvX3NkKTsKLSAgIAotICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRoYXQga25mc2QgaXMgdHJ5aW5nIHRvIGFjY2VzcyBpbm9kZSBvZiBhIGZpbGUKLSAgICAgICB0aGF0IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZGlzayBieSBzb21lIG90aGVyIHRocmVhZC4gQXMgd2UKLSAgICAgICB1cGRhdGUgc2Qgb24gdW5saW5rIGFsbCB0aGF0IGlzIHJlcXVpcmVkIGlzIHRvIGNoZWNrIGZvciBubGluawotICAgICAgIGhlcmUuIFRoaXMgYnVnIHdhcyBmaXJzdCBmb3VuZCBieSBTaXppZiB3aGVuIGRlYnVnZ2luZwotICAgICAgIFNxdWlkTkcvQnV0dGVyZmx5LCBmb3Jnb3R0ZW4sIGFuZCBmb3VuZCBhZ2FpbiBhZnRlciBQaGlsaXBwZQotICAgICAgIEdyYW1vdWxsZSA8cGhpbGlwcGUuZ3JhbW91bGxlQG1tYW5pYS5jb20+IHJlcHJvZHVjZWQgaXQuIAorCWluaXRfaW5vZGUoaW5vZGUsICZwYXRoX3RvX3NkKTsKIAotICAgICAgIE1vcmUgbG9naWNhbCBmaXggd291bGQgcmVxdWlyZSBjaGFuZ2VzIGluIGZzL2lub2RlLmM6aXB1dCgpIHRvCi0gICAgICAgcmVtb3ZlIGlub2RlIGZyb20gaGFzaC10YWJsZSBfYWZ0ZXJfIGZzIGNsZWFuZWQgZGlzayBzdHVmZiB1cCBhbmQKLSAgICAgICBpbiBpZ2V0KCkgdG8gcmV0dXJuIE5VTEwgaWYgSV9GUkVFSU5HIGlub2RlIGlzIGZvdW5kIGluCi0gICAgICAgaGFzaC10YWJsZS4gKi8KLSAgICAvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIHBsYWNlIHdoZXJlIGl0J3Mgb2sgdG8gbWVldCBpbm9kZSB3aXRoCi0gICAgICAgbmxpbms9PTA6IHByb2Nlc3Npbmcgb2Ygb3Blbi11bmxpbmtlZCBhbmQgaGFsZi10cnVuY2F0ZWQgZmlsZXMKLSAgICAgICBkdXJpbmcgbW91bnQgKGZzL3JlaXNlcmZzL3N1cGVyLmM6ZmluaXNoX3VuZmluaXNoZWQoKSkuICovCi0gICAgaWYoICggaW5vZGUgLT4gaV9ubGluayA9PSAwICkgJiYgCi0JISBSRUlTRVJGU19TQihpbm9kZSAtPiBpX3NiKSAtPiBzX2lzX3VubGlua2VkX29rICkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKLQkJCSAgICAgICJ2cy0xMzA3NTogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKLQkJCSAgICAgICJkZWFkIGlub2RlIHJlYWQgZnJvbSBkaXNrICVLLiAiCi0JCQkgICAgICAiVGhpcyBpcyBsaWtlbHkgdG8gYmUgcmFjZSB3aXRoIGtuZnNkLiBJZ25vcmUiLAotCQkJICAgICAgJmtleSApOwotCSAgICByZWlzZXJmc19tYWtlX2JhZF9pbm9kZSggaW5vZGUgKTsKLSAgICB9CisJLyogSXQgaXMgcG9zc2libGUgdGhhdCBrbmZzZCBpcyB0cnlpbmcgdG8gYWNjZXNzIGlub2RlIG9mIGEgZmlsZQorCSAgIHRoYXQgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBkaXNrIGJ5IHNvbWUgb3RoZXIgdGhyZWFkLiBBcyB3ZQorCSAgIHVwZGF0ZSBzZCBvbiB1bmxpbmsgYWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdG8gY2hlY2sgZm9yIG5saW5rCisJICAgaGVyZS4gVGhpcyBidWcgd2FzIGZpcnN0IGZvdW5kIGJ5IFNpemlmIHdoZW4gZGVidWdnaW5nCisJICAgU3F1aWRORy9CdXR0ZXJmbHksIGZvcmdvdHRlbiwgYW5kIGZvdW5kIGFnYWluIGFmdGVyIFBoaWxpcHBlCisJICAgR3JhbW91bGxlIDxwaGlsaXBwZS5ncmFtb3VsbGVAbW1hbmlhLmNvbT4gcmVwcm9kdWNlZCBpdC4gCiAKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX3NkKSA7IC8qIGluaXQgaW5vZGUgc2hvdWxkIGJlIHJlbHNpbmcgKi8KKwkgICBNb3JlIGxvZ2ljYWwgZml4IHdvdWxkIHJlcXVpcmUgY2hhbmdlcyBpbiBmcy9pbm9kZS5jOmlwdXQoKSB0bworCSAgIHJlbW92ZSBpbm9kZSBmcm9tIGhhc2gtdGFibGUgX2FmdGVyXyBmcyBjbGVhbmVkIGRpc2sgc3R1ZmYgdXAgYW5kCisJICAgaW4gaWdldCgpIHRvIHJldHVybiBOVUxMIGlmIElfRlJFRUlORyBpbm9kZSBpcyBmb3VuZCBpbgorCSAgIGhhc2gtdGFibGUuICovCisJLyogQ3VycmVudGx5IHRoZXJlIGlzIG9uZSBwbGFjZSB3aGVyZSBpdCdzIG9rIHRvIG1lZXQgaW5vZGUgd2l0aAorCSAgIG5saW5rPT0wOiBwcm9jZXNzaW5nIG9mIG9wZW4tdW5saW5rZWQgYW5kIGhhbGYtdHJ1bmNhdGVkIGZpbGVzCisJICAgZHVyaW5nIG1vdW50IChmcy9yZWlzZXJmcy9zdXBlci5jOmZpbmlzaF91bmZpbmlzaGVkKCkpLiAqLworCWlmICgoaW5vZGUtPmlfbmxpbmsgPT0gMCkgJiYKKwkgICAgIVJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19pc191bmxpbmtlZF9vaykgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAidnMtMTMwNzU6IHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlOiAiCisJCQkJICJkZWFkIGlub2RlIHJlYWQgZnJvbSBkaXNrICVLLiAiCisJCQkJICJUaGlzIGlzIGxpa2VseSB0byBiZSByYWNlIHdpdGgga25mc2QuIElnbm9yZSIsCisJCQkJICZrZXkpOworCQlyZWlzZXJmc19tYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJfQorCisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19zZCk7CS8qIGluaXQgaW5vZGUgc2hvdWxkIGJlIHJlbHNpbmcgKi8KIAogfQogCkBAIC0xNDAzLDE0MSArMTQ4OCwxNDkgQEAKICAqIGlub2RlIG51bWJlcnMgKG9iamVjdGlkcykgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgcGFyZW50IGRpcmVjdG9yeSBpZHMuCiAgKgogICovCi1pbnQgcmVpc2VyZnNfZmluZF9hY3Rvciggc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlICkKK2ludCByZWlzZXJmc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzOworCXN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3M7CiAKLSAgICBhcmdzID0gb3BhcXVlOwotICAgIC8qIGFyZ3MgaXMgYWxyZWFkeSBpbiBDUFUgb3JkZXIgKi8KLSAgICByZXR1cm4gKGlub2RlLT5pX2lubyA9PSBhcmdzLT5vYmplY3RpZCkgJiYKLQkobGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKSA9PSBhcmdzLT5kaXJpZCk7CisJYXJncyA9IG9wYXF1ZTsKKwkvKiBhcmdzIGlzIGFscmVhZHkgaW4gQ1BVIG9yZGVyICovCisJcmV0dXJuIChpbm9kZS0+aV9pbm8gPT0gYXJncy0+b2JqZWN0aWQpICYmCisJICAgIChsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpID09IGFyZ3MtPmRpcmlkKTsKIH0KIAotc3RydWN0IGlub2RlICogcmVpc2VyZnNfaWdldCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdHJ1Y3QgaW5vZGUgKnJlaXNlcmZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgYXJncyA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3M7CiAKLSAgICBhcmdzLm9iamVjdGlkID0ga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkIDsKLSAgICBhcmdzLmRpcmlkID0ga2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA7Ci0gICAgaW5vZGUgPSBpZ2V0NV9sb2NrZWQgKHMsIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCwgCi0JCSAgIHJlaXNlcmZzX2ZpbmRfYWN0b3IsIHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlLCAodm9pZCAqKSgmYXJncykpOwotICAgIGlmICghaW5vZGUpIAotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pIDsKKwlhcmdzLm9iamVjdGlkID0ga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkOworCWFyZ3MuZGlyaWQgPSBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkOworCWlub2RlID0gaWdldDVfbG9ja2VkKHMsIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCwKKwkJCSAgICAgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsCisJCQkgICAgICh2b2lkICopKCZhcmdzKSk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLSAgICBpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlLCAmYXJncyk7Ci0JdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0gICAgfQorCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlLCAmYXJncyk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KIAotICAgIGlmIChjb21wX3Nob3J0X2tleXMgKElOT0RFX1BLRVkgKGlub2RlKSwga2V5KSB8fCBpc19iYWRfaW5vZGUgKGlub2RlKSkgewotCS8qIGVpdGhlciBkdWUgdG8gaS9vIGVycm9yIG9yIGEgc3RhbGUgTkZTIGhhbmRsZSAqLwotCWlwdXQgKGlub2RlKTsKLQlpbm9kZSA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBpbm9kZTsKKwlpZiAoY29tcF9zaG9ydF9rZXlzKElOT0RFX1BLRVkoaW5vZGUpLCBrZXkpIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJLyogZWl0aGVyIGR1ZSB0byBpL28gZXJyb3Igb3IgYSBzdGFsZSBORlMgaGFuZGxlICovCisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IE5VTEw7CisJfQorCXJldHVybiBpbm9kZTsKIH0KIAogc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp2b2JqcCkKIHsKLSAgICBfX3UzMiAqZGF0YSA9IHZvYmpwOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleSA7Ci0gICAgc3RydWN0IGRlbnRyeSAqcmVzdWx0OwotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0gICAgCi0gICAga2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBkYXRhWzBdIDsKLSAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkYXRhWzFdIDsKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKLSAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQoc2IsICZrZXkpIDsKLSAgICBpZiAoaW5vZGUgJiYgIUlTX0VSUihpbm9kZSkgJiYgZGF0YVsyXSAhPSAwICYmCi0JZGF0YVsyXSAhPSBpbm9kZS0+aV9nZW5lcmF0aW9uKSB7Ci0JICAgIGlwdXQoaW5vZGUpIDsKLQkgICAgaW5vZGUgPSBOVUxMIDsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKLSAgICBpZiAoIWlub2RlKQotCSAgICBpbm9kZSA9IEVSUl9QVFIoLUVTVEFMRSk7Ci0gICAgaWYgKElTX0VSUihpbm9kZSkpCi0JICAgIHJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKLSAgICByZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotICAgIGlmICghcmVzdWx0KSB7Ci0JICAgIGlwdXQoaW5vZGUpOwotCSAgICByZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKwlfX3UzMiAqZGF0YSA9IHZvYmpwOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWtleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gZGF0YVswXTsKKwlrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkYXRhWzFdOworCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworCWlub2RlID0gcmVpc2VyZnNfaWdldChzYiwgJmtleSk7CisJaWYgKGlub2RlICYmICFJU19FUlIoaW5vZGUpICYmIGRhdGFbMl0gIT0gMCAmJgorCSAgICBkYXRhWzJdICE9IGlub2RlLT5pX2dlbmVyYXRpb24pIHsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gTlVMTDsKKwl9CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKKwlpZiAoIWlub2RlKQorCQlpbm9kZSA9IEVSUl9QVFIoLUVTVEFMRSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBmaHR5cGUsCi0JCQkJICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZWN0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCQkJICB2b2lkICpjb250ZXh0KSB7Ci0gICAgX191MzIgb2JqWzNdLCBwYXJlbnRbM107CitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKiBkYXRhLAorCQkJCSAgaW50IGxlbiwgaW50IGZodHlwZSwKKwkJCQkgIGludCAoKmFjY2VwdGFibGUpICh2b2lkICpjb250ZWN0LAorCQkJCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICogZGUpLAorCQkJCSAgdm9pZCAqY29udGV4dCkKK3sKKwlfX3UzMiBvYmpbM10sIHBhcmVudFszXTsKIAotICAgIC8qIGZodHlwZSBoYXBwZW5zIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiB1MzJzIGVuY29kZWQuCi0gICAgICogZHVlIHRvIGEgYnVnIGluIGVhcmxpZXIgY29kZSwgZmh0eXBlIG1pZ2h0IGluZGljYXRlIHRoZXJlCi0gICAgICogYXJlIG1vcmUgdTMycyB0aGVuIGFjdHVhbGx5IGZpdHRlZC4KLSAgICAgKiBzbyBpZiBmaHR5cGUgc2VlbXMgdG8gYmUgbW9yZSB0aGFuIGxlbiwgcmVkdWNlIGZodHlwZS4KLSAgICAgKiBWYWxpZCB0eXBlcyBhcmU6Ci0gICAgICogICAyIC0gb2JqZWN0aWQgKyBkaXJfaWQgLSBsZWdhY3kgc3VwcG9ydAotICAgICAqICAgMyAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbgotICAgICAqICAgNCAtIG9iamVjdGlkICsgZGlyX2lkICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudCAtIGxlZ2FjeQotICAgICAqICAgNSAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbiArIG9iamVjdGlkIGFuZCBkaXJpZCBvZiBwYXJlbnQKLSAgICAgKiAgIDYgLSBhcyBhYm92ZSBwbHVzIGdlbmVyYXRpb24gb2YgZGlyZWN0b3J5Ci0gICAgICogNiBkb2VzIG5vdCBmaXQgaW4gTkZTdjIgaGFuZGxlcwotICAgICAqLwotICAgIGlmIChmaHR5cGUgPiBsZW4pIHsKLQkgICAgaWYgKGZodHlwZSAhPSA2IHx8IGxlbiAhPSA1KQotCQkgICAgcmVpc2VyZnNfd2FybmluZyAoc2IsICJuZnNkL3JlaXNlcmZzLCBmaHR5cGU9JWQsIGxlbj0lZCAtIG9kZCIsCi0JCQkgICBmaHR5cGUsIGxlbik7Ci0JICAgIGZodHlwZSA9IDU7Ci0gICAgfQorCS8qIGZodHlwZSBoYXBwZW5zIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiB1MzJzIGVuY29kZWQuCisJICogZHVlIHRvIGEgYnVnIGluIGVhcmxpZXIgY29kZSwgZmh0eXBlIG1pZ2h0IGluZGljYXRlIHRoZXJlCisJICogYXJlIG1vcmUgdTMycyB0aGVuIGFjdHVhbGx5IGZpdHRlZC4KKwkgKiBzbyBpZiBmaHR5cGUgc2VlbXMgdG8gYmUgbW9yZSB0aGFuIGxlbiwgcmVkdWNlIGZodHlwZS4KKwkgKiBWYWxpZCB0eXBlcyBhcmU6CisJICogICAyIC0gb2JqZWN0aWQgKyBkaXJfaWQgLSBsZWdhY3kgc3VwcG9ydAorCSAqICAgMyAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbgorCSAqICAgNCAtIG9iamVjdGlkICsgZGlyX2lkICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudCAtIGxlZ2FjeQorCSAqICAgNSAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbiArIG9iamVjdGlkIGFuZCBkaXJpZCBvZiBwYXJlbnQKKwkgKiAgIDYgLSBhcyBhYm92ZSBwbHVzIGdlbmVyYXRpb24gb2YgZGlyZWN0b3J5CisJICogNiBkb2VzIG5vdCBmaXQgaW4gTkZTdjIgaGFuZGxlcworCSAqLworCWlmIChmaHR5cGUgPiBsZW4pIHsKKwkJaWYgKGZodHlwZSAhPSA2IHx8IGxlbiAhPSA1KQorCQkJcmVpc2VyZnNfd2FybmluZyhzYiwKKwkJCQkJICJuZnNkL3JlaXNlcmZzLCBmaHR5cGU9JWQsIGxlbj0lZCAtIG9kZCIsCisJCQkJCSBmaHR5cGUsIGxlbik7CisJCWZodHlwZSA9IDU7CisJfQogCi0gICAgb2JqWzBdID0gZGF0YVswXTsKLSAgICBvYmpbMV0gPSBkYXRhWzFdOwotICAgIGlmIChmaHR5cGUgPT0gMyB8fCBmaHR5cGUgPj0gNSkKLQkgICAgb2JqWzJdID0gZGF0YVsyXTsKLSAgICBlbHNlICAgIG9ialsyXSA9IDA7IC8qIGdlbmVyYXRpb24gbnVtYmVyICovCisJb2JqWzBdID0gZGF0YVswXTsKKwlvYmpbMV0gPSBkYXRhWzFdOworCWlmIChmaHR5cGUgPT0gMyB8fCBmaHR5cGUgPj0gNSkKKwkJb2JqWzJdID0gZGF0YVsyXTsKKwllbHNlCisJCW9ialsyXSA9IDA7CS8qIGdlbmVyYXRpb24gbnVtYmVyICovCiAKLSAgICBpZiAoZmh0eXBlID49IDQpIHsKLQkgICAgcGFyZW50WzBdID0gZGF0YVtmaHR5cGU+PTU/MzoyXSA7Ci0JICAgIHBhcmVudFsxXSA9IGRhdGFbZmh0eXBlPj01PzQ6M10gOwotCSAgICBpZiAoZmh0eXBlID09IDYpCi0JCSAgICBwYXJlbnRbMl0gPSBkYXRhWzVdOwotCSAgICBlbHNlICAgIHBhcmVudFsyXSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHNiLCBvYmosIGZodHlwZSA8IDQgPyBOVUxMIDogcGFyZW50LAotCQkJICAgICAgIGFjY2VwdGFibGUsIGNvbnRleHQpOworCWlmIChmaHR5cGUgPj0gNCkgeworCQlwYXJlbnRbMF0gPSBkYXRhW2ZodHlwZSA+PSA1ID8gMyA6IDJdOworCQlwYXJlbnRbMV0gPSBkYXRhW2ZodHlwZSA+PSA1ID8gNCA6IDNdOworCQlpZiAoZmh0eXBlID09IDYpCisJCQlwYXJlbnRbMl0gPSBkYXRhWzVdOworCQllbHNlCisJCQlwYXJlbnRbMl0gPSAwOworCX0KKwlyZXR1cm4gc2ItPnNfZXhwb3J0X29wLT5maW5kX2V4cG9ydGVkX2RlbnRyeShzYiwgb2JqLAorCQkJCQkJICAgICBmaHR5cGUgPCA0ID8gTlVMTCA6IHBhcmVudCwKKwkJCQkJCSAgICAgYWNjZXB0YWJsZSwgY29udGV4dCk7CiB9CiAKLWludCByZWlzZXJmc19lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZGF0YSwgaW50ICpsZW5wLCBpbnQgbmVlZF9wYXJlbnQpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlIDsKLSAgICBpbnQgbWF4bGVuID0gKmxlbnA7Ci0gICAgCi0gICAgaWYgKG1heGxlbiA8IDMpCi0gICAgICAgIHJldHVybiAyNTUgOworaW50IHJlaXNlcmZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICogZGF0YSwgaW50ICpsZW5wLAorCQkgICAgICAgaW50IG5lZWRfcGFyZW50KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IG1heGxlbiA9ICpsZW5wOwogCi0gICAgZGF0YVswXSA9IGlub2RlLT5pX2lubyA7Ci0gICAgZGF0YVsxXSA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpIDsKLSAgICBkYXRhWzJdID0gaW5vZGUtPmlfZ2VuZXJhdGlvbiA7Ci0gICAgKmxlbnAgPSAzIDsKLSAgICAvKiBubyByb29tIGZvciBkaXJlY3RvcnkgaW5mbz8gcmV0dXJuIHdoYXQgd2UndmUgc3RvcmVkIHNvIGZhciAqLwotICAgIGlmIChtYXhsZW4gPCA1IHx8ICEgbmVlZF9wYXJlbnQpCi0gICAgICAgIHJldHVybiAzIDsKKwlpZiAobWF4bGVuIDwgMykKKwkJcmV0dXJuIDI1NTsKIAotICAgIHNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwotICAgIGlub2RlID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSA7Ci0gICAgZGF0YVszXSA9IGlub2RlLT5pX2lubyA7Ci0gICAgZGF0YVs0XSA9IGxlMzJfdG9fY3B1KElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQpIDsKLSAgICAqbGVucCA9IDUgOwotICAgIGlmIChtYXhsZW4gPj0gNikgewotCSAgICBkYXRhWzVdID0gaW5vZGUtPmlfZ2VuZXJhdGlvbiA7Ci0JICAgICpsZW5wID0gNiA7Ci0gICAgfQotICAgIHNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0gICAgcmV0dXJuICpsZW5wIDsKKwlkYXRhWzBdID0gaW5vZGUtPmlfaW5vOworCWRhdGFbMV0gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQpOworCWRhdGFbMl0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOworCSpsZW5wID0gMzsKKwkvKiBubyByb29tIGZvciBkaXJlY3RvcnkgaW5mbz8gcmV0dXJuIHdoYXQgd2UndmUgc3RvcmVkIHNvIGZhciAqLworCWlmIChtYXhsZW4gPCA1IHx8ICFuZWVkX3BhcmVudCkKKwkJcmV0dXJuIDM7CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJZGF0YVszXSA9IGlub2RlLT5pX2lubzsKKwlkYXRhWzRdID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkKTsKKwkqbGVucCA9IDU7CisJaWYgKG1heGxlbiA+PSA2KSB7CisJCWRhdGFbNV0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOworCQkqbGVucCA9IDY7CisJfQorCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJcmV0dXJuICpsZW5wOwogfQogCi0KIC8qIGxvb2tzIGZvciBzdGF0IGRhdGEsIHRoZW4gY29waWVzIGZpZWxkcyB0byBpdCwgbWFya3MgdGhlIGJ1ZmZlcgogICAgY29udGFpbmluZyBzdGF0IGRhdGEgYXMgZGlydHkgKi8KIC8qIHJlaXNlcmZzIGlub2RlcyBhcmUgbmV2ZXIgcmVhbGx5IGRpcnR5LCBzaW5jZSB0aGUgZGlydHkgaW5vZGUgY2FsbApAQCAtMTU0NSwxMjEgKzE2MzgsMTI4IEBACiAqKiB0byBwcm9wZXJseSBtYXJrIGlub2RlcyBmb3IgZGF0YXN5bmMgYW5kIHN1Y2gsIGJ1dCBvbmx5IGFjdHVhbGx5CiAqKiBkb2VzIHNvbWV0aGluZyB3aGVuIGNhbGxlZCBmb3IgYSBzeW5jaHJvbm91cyB1cGRhdGUuCiAqLwotaW50IHJlaXNlcmZzX3dyaXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGRvX3N5bmMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICBpbnQgamJlZ2luX2NvdW50ID0gMSA7CitpbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRvX3N5bmMpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50ID0gMTsKIAotICAgIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKLSAgICAgICAgcmV0dXJuIC1FUk9GUzsKLSAgICAvKiBtZW1vcnkgcHJlc3N1cmUgY2FuIHNvbWV0aW1lcyBpbml0aWF0ZSB3cml0ZV9pbm9kZSBjYWxscyB3aXRoIHN5bmMgPT0gMSwKLSAgICAqKiB0aGVzZSBjYXNlcyBhcmUganVzdCB3aGVuIHRoZSBzeXN0ZW0gbmVlZHMgcmFtLCBub3Qgd2hlbiB0aGUgCi0gICAgKiogaW5vZGUgbmVlZHMgdG8gcmVhY2ggZGlzayBmb3Igc2FmZXR5LCBhbmQgdGhleSBjYW4gc2FmZWx5IGJlCi0gICAgKiogaWdub3JlZCBiZWNhdXNlIHRoZSBhbHRlcmVkIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgotICAgICovCi0gICAgaWYgKGRvX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICgham91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7Ci0gICAgICAgICAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotICAgICAgICAgICAgam91cm5hbF9lbmRfc3luYygmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICAgICAgfQotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotICAgIHJldHVybiAwOworCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuIC1FUk9GUzsKKwkvKiBtZW1vcnkgcHJlc3N1cmUgY2FuIHNvbWV0aW1lcyBpbml0aWF0ZSB3cml0ZV9pbm9kZSBjYWxscyB3aXRoIHN5bmMgPT0gMSwKKwkgKiogdGhlc2UgY2FzZXMgYXJlIGp1c3Qgd2hlbiB0aGUgc3lzdGVtIG5lZWRzIHJhbSwgbm90IHdoZW4gdGhlIAorCSAqKiBpbm9kZSBuZWVkcyB0byByZWFjaCBkaXNrIGZvciBzYWZldHksIGFuZCB0aGV5IGNhbiBzYWZlbHkgYmUKKwkgKiogaWdub3JlZCBiZWNhdXNlIHRoZSBhbHRlcmVkIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgorCSAqLworCWlmIChkb19zeW5jICYmICEoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICgham91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisJCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJCQlqb3VybmFsX2VuZF9zeW5jKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCX0KKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIHN0YXQgZGF0YSBvZiBuZXcgb2JqZWN0IGlzIGluc2VydGVkIGFscmVhZHksIHRoaXMgaW5zZXJ0cyB0aGUgaXRlbQogICAgY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcyAqLwotc3RhdGljIGludCByZWlzZXJmc19uZXdfZGlyZWN0b3J5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIHN0cnVjdCBwYXRoICogcGF0aCwKLQkJCQkgICBzdHJ1Y3QgaW5vZGUgKiBkaXIpCitzdGF0aWMgaW50IHJlaXNlcmZzX25ld19kaXJlY3Rvcnkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaWgsIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJCSAgc3RydWN0IGlub2RlICpkaXIpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSB0aC0+dF9zdXBlcjsKLSAgICBjaGFyIGVtcHR5X2RpciBbRU1QVFlfRElSX1NJWkVdOwotICAgIGNoYXIgKiBib2R5ID0gZW1wdHlfZGlyOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB0aC0+dF9zdXBlcjsKKwljaGFyIGVtcHR5X2RpcltFTVBUWV9ESVJfU0laRV07CisJY2hhciAqYm9keSA9IGVtcHR5X2RpcjsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJaW50IHJldHZhbDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICAKLSAgICBfbWFrZV9jcHVfa2V5ICgma2V5LCBLRVlfRk9STUFUXzNfNSwgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpLAotCQkgICBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX29iamVjdGlkKSwgRE9UX09GRlNFVCwgVFlQRV9ESVJFTlRSWSwgMy8qa2V5IGxlbmd0aCovKTsKLSAgICAKLSAgICAvKiBjb21wb3NlIGl0ZW0gaGVhZCBmb3IgbmV3IGl0ZW0uIERpcmVjdG9yaWVzIGNvbnNpc3Qgb2YgaXRlbXMgb2YKLSAgICAgICBvbGQgdHlwZSAoSVRFTV9WRVJTSU9OXzEpLiBEbyBub3Qgc2V0IGtleSAoc2Vjb25kIGFyZyBpcyAwKSwgaXQKLSAgICAgICBpcyBkb25lIGJ5IHJlaXNlcmZzX25ld19pbm9kZSAqLwotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkgewotCW1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFX1YxLCAyKTsKLQkKLQltYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLCBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCi0JCQkJSU5PREVfUEtFWSAoZGlyKS0+a19kaXJfaWQsIAotCQkJCUlOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQgKTsKLSAgICB9IGVsc2UgewotCW1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFLCAyKTsKLQkKLQltYWtlX2VtcHR5X2Rpcl9pdGVtIChib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLCBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCi0JCSAgIAkJSU5PREVfUEtFWSAoZGlyKS0+a19kaXJfaWQsIAotCQkgICAJCUlOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQgKTsKLSAgICB9Ci0gICAgCi0gICAgLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCi0gICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCAma2V5LCBwYXRoKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X2RpcmVjdG9yeTogIgotCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IGRpcmVjdG9yeSIpOwotCXJldHVybiAtRUlPOwotICAgIH0KLSAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKLQlwYXRocmVsc2UgKHBhdGgpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwNzA6IHJlaXNlcmZzX25ld19kaXJlY3Rvcnk6ICIKLQkJCSAgIm9iamVjdCB3aXRoIHRoaXMga2V5IGV4aXN0cyAoJWspIiwgJihpaC0+aWhfa2V5KSk7Ci0JcmV0dXJuIC1FRVhJU1Q7Ci0gICAgfQorCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgLyogaW5zZXJ0IGl0ZW0sIHRoYXQgaXMgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKi8KLSAgICByZXR1cm4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIGJvZHkpOworCV9tYWtlX2NwdV9rZXkoJmtleSwgS0VZX0ZPUk1BVF8zXzUsIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19kaXJfaWQpLAorCQkgICAgICBsZTMyX3RvX2NwdShpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpLCBET1RfT0ZGU0VULAorCQkgICAgICBUWVBFX0RJUkVOVFJZLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCisJLyogY29tcG9zZSBpdGVtIGhlYWQgZm9yIG5ldyBpdGVtLiBEaXJlY3RvcmllcyBjb25zaXN0IG9mIGl0ZW1zIG9mCisJICAgb2xkIHR5cGUgKElURU1fVkVSU0lPTl8xKS4gRG8gbm90IHNldCBrZXkgKHNlY29uZCBhcmcgaXMgMCksIGl0CisJICAgaXMgZG9uZSBieSByZWlzZXJmc19uZXdfaW5vZGUgKi8KKwlpZiAob2xkX2Zvcm1hdF9vbmx5KHNiKSkgeworCQltYWtlX2xlX2l0ZW1faGVhZChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsCisJCQkJICBUWVBFX0RJUkVOVFJZLCBFTVBUWV9ESVJfU0laRV9WMSwgMik7CisKKwkJbWFrZV9lbXB0eV9kaXJfaXRlbV92MShib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLAorCQkJCSAgICAgICBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCisJCQkJICAgICAgIElOT0RFX1BLRVkoZGlyKS0+a19kaXJfaWQsCisJCQkJICAgICAgIElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZCk7CisJfSBlbHNlIHsKKwkJbWFrZV9sZV9pdGVtX2hlYWQoaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBET1RfT0ZGU0VULAorCQkJCSAgVFlQRV9ESVJFTlRSWSwgRU1QVFlfRElSX1NJWkUsIDIpOworCisJCW1ha2VfZW1wdHlfZGlyX2l0ZW0oYm9keSwgaWgtPmloX2tleS5rX2Rpcl9pZCwKKwkJCQkgICAgaWgtPmloX2tleS5rX29iamVjdGlkLAorCQkJCSAgICBJTk9ERV9QS0VZKGRpciktPmtfZGlyX2lkLAorCQkJCSAgICBJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQpOworCX0KKworCS8qIGxvb2sgZm9yIHBsYWNlIGluIHRoZSB0cmVlIGZvciBuZXcgaXRlbSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtKHNiLCAma2V5LCBwYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X2RpcmVjdG9yeTogIgorCQkJCSAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IGRpcmVjdG9yeSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJCXBhdGhyZWxzZShwYXRoKTsKKwkJcmVpc2VyZnNfd2FybmluZyhzYiwgInZzLTEzMDcwOiByZWlzZXJmc19uZXdfZGlyZWN0b3J5OiAiCisJCQkJICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsCisJCQkJICYoaWgtPmloX2tleSkpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwkvKiBpbnNlcnQgaXRlbSwgdGhhdCBpcyBlbXB0eSBkaXJlY3RvcnkgaXRlbSAqLworCXJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgcGF0aCwgJmtleSwgaWgsIGlub2RlLCBib2R5KTsKIH0KIAotCiAvKiBzdGF0IGRhdGEgb2Ygb2JqZWN0IGhhcyBiZWVuIGluc2VydGVkLCB0aGlzIGluc2VydHMgdGhlIGl0ZW0KICAgIGNvbnRhaW5pbmcgdGhlIGJvZHkgb2Ygc3ltbGluayAqLwotc3RhdGljIGludCByZWlzZXJmc19uZXdfc3ltbGluayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCSBzdHJ1Y3QgaW5vZGUgKmlub2RlLAkvKiBJbm9kZSBvZiBzeW1saW5rICovCi0JCQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwKLQkJCQkgc3RydWN0IHBhdGggKiBwYXRoLCBjb25zdCBjaGFyICogc3ltbmFtZSwgaW50IGl0ZW1fbGVuKQorc3RhdGljIGludCByZWlzZXJmc19uZXdfc3ltbGluayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwJLyogSW5vZGUgb2Ygc3ltbGluayAqLworCQkJCXN0cnVjdCBpdGVtX2hlYWQgKmloLAorCQkJCXN0cnVjdCBwYXRoICpwYXRoLCBjb25zdCBjaGFyICpzeW1uYW1lLAorCQkJCWludCBpdGVtX2xlbikKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IHRoLT50X3N1cGVyOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKLSAgICBpbnQgcmV0dmFsOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJaW50IHJldHZhbDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIF9tYWtlX2NwdV9rZXkgKCZrZXksIEtFWV9GT1JNQVRfM181LCAKLQkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpLCAKLQkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19vYmplY3RpZCksCi0JCSAgIDEsIFRZUEVfRElSRUNULCAzLyprZXkgbGVuZ3RoKi8pOworCV9tYWtlX2NwdV9rZXkoJmtleSwgS0VZX0ZPUk1BVF8zXzUsCisJCSAgICAgIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19kaXJfaWQpLAorCQkgICAgICBsZTMyX3RvX2NwdShpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpLAorCQkgICAgICAxLCBUWVBFX0RJUkVDVCwgMyAvKmtleSBsZW5ndGggKi8gKTsKIAotICAgIG1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIDEsIFRZUEVfRElSRUNULCBpdGVtX2xlbiwgMC8qZnJlZV9zcGFjZSovKTsKKwltYWtlX2xlX2l0ZW1faGVhZChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIDEsIFRZUEVfRElSRUNULCBpdGVtX2xlbiwKKwkJCSAgMCAvKmZyZWVfc3BhY2UgKi8gKTsKIAotICAgIC8qIGxvb2sgZm9yIHBsYWNlIGluIHRoZSB0cmVlIGZvciBuZXcgaXRlbSAqLwotICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzYiwgJmtleSwgcGF0aCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5pazogIgotCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IHN5bWxpbmsiKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0gICAgaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7Ci0JcGF0aHJlbHNlIChwYXRoKTsKLQlyZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfc3ltbGluazogIgotCQkJICAib2JqZWN0IHdpdGggdGhpcyBrZXkgZXhpc3RzICglaykiLCAmKGloLT5paF9rZXkpKTsKLQlyZXR1cm4gLUVFWElTVDsKLSAgICB9CisJLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oc2IsICZrZXksIHBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzYiwgInZzLTEzMDgwOiByZWlzZXJmc19uZXdfc3ltbGluaWs6ICIKKwkJCQkgImkvbyBmYWlsdXJlIG9jY3VycmVkIGNyZWF0aW5nIG5ldyBzeW1saW5rIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwkJcGF0aHJlbHNlKHBhdGgpOworCQlyZWlzZXJmc193YXJuaW5nKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5rOiAiCisJCQkJICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsCisJCQkJICYoaWgtPmloX2tleSkpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CiAKLSAgICAvKiBpbnNlcnQgaXRlbSwgdGhhdCBpcyBib2R5IG9mIHN5bWxpbmsgKi8KLSAgICByZXR1cm4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIHN5bW5hbWUpOworCS8qIGluc2VydCBpdGVtLCB0aGF0IGlzIGJvZHkgb2Ygc3ltbGluayAqLworCXJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSh0aCwgcGF0aCwgJmtleSwgaWgsIGlub2RlLCBzeW1uYW1lKTsKIH0KIAotCiAvKiBpbnNlcnRzIHRoZSBzdGF0IGRhdGEgaW50byB0aGUgdHJlZSwgYW5kIHRoZW4gY2FsbHMKICAgIHJlaXNlcmZzX25ld19kaXJlY3RvcnkgKHRvIGluc2VydCAiLiIsICIuLiIgaXRlbSBpZiBuZXcgb2JqZWN0IGlzCiAgICBkaXJlY3RvcnkpIG9yIHJlaXNlcmZzX25ld19zeW1saW5rICh0byBpbnNlcnQgc3ltbGluayBib2R5IGlmIG5ldwpAQCAtMTY2OSwyMTMgKzE3NjksMjE5IEBACiAgICBub24temVybyBkdWUgdG8gYW4gZXJyb3IsIHdlIGhhdmUgdG8gZHJvcCB0aGUgcXVvdGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKICAgIGZvciB0aGUgZnJlc2ggaW5vZGUuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb3V0c2lkZSBhIHRyYW5zYWN0aW9uLCBzbwogICAgaWYgd2UgcmV0dXJuIG5vbi16ZXJvLCB3ZSBhbHNvIGVuZCB0aGUgdHJhbnNhY3Rpb24uICAqLwotaW50IHJlaXNlcmZzX25ld19pbm9kZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQlzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlLCAKLQkJCWNvbnN0IGNoYXIgKiBzeW1uYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgZm9yIHJlZ3VsYXIsIEVNVFJZX0RJUl9TSVpFIGZvciBkaXJzLCAKLQkJCSAgIHN0cmxlbiAoc3ltbmFtZSkgZm9yIHN5bWxpbmtzKSovCi0JCSAgICAgICAgIGxvZmZfdCBpX3NpemUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgCi0JCQkgc3RydWN0IGlub2RlICppbm9kZSkKK2ludCByZWlzZXJmc19uZXdfaW5vZGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUsIGNvbnN0IGNoYXIgKnN5bW5hbWUsCisJCSAgICAgICAvKiAwIGZvciByZWd1bGFyLCBFTVRSWV9ESVJfU0laRSBmb3IgZGlycywgCisJCSAgICAgICAgICBzdHJsZW4gKHN5bW5hbWUpIGZvciBzeW1saW5rcykgKi8KKwkJICAgICAgIGxvZmZfdCBpX3NpemUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2tleSk7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaWg7Ci0gICAgc3RydWN0IHN0YXRfZGF0YSBzZDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBlcnI7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19rZXkpOworCXN0cnVjdCBjcHVfa2V5IGtleTsKKwlzdHJ1Y3QgaXRlbV9oZWFkIGloOworCXN0cnVjdCBzdGF0X2RhdGEgc2Q7CisJaW50IHJldHZhbDsKKwlpbnQgZXJyOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAKLSAgICBpZiAoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7Ci0JZXJyID0gLUVEUVVPVDsKLQlnb3RvIG91dF9lbmRfdHJhbnM7Ci0gICAgfQotICAgIGlmICghZGlyIHx8ICFkaXItPmlfbmxpbmspIHsKLQllcnIgPSAtRVBFUk07Ci0JZ290byBvdXRfYmFkX2lub2RlOwotICAgIH0KKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIHNiID0gZGlyLT5pX3NiOwotCi0gICAgLyogaXRlbSBoZWFkIG9mIG5ldyBpdGVtICovCi0gICAgaWguaWhfa2V5LmtfZGlyX2lkID0gcmVpc2VyZnNfY2hvb3NlX3BhY2tpbmcoZGlyKTsKLSAgICBpaC5paF9rZXkua19vYmplY3RpZCA9IGNwdV90b19sZTMyIChyZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkICh0aCkpOwotICAgIGlmICghaWguaWhfa2V5Lmtfb2JqZWN0aWQpIHsKLQllcnIgPSAtRU5PTUVNOwotCWdvdG8gb3V0X2JhZF9pbm9kZSA7Ci0gICAgfQotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkKLQkvKiBub3QgYSBwZXJmZWN0IGdlbmVyYXRpb24gY291bnQsIGFzIG9iamVjdCBpZHMgY2FuIGJlIHJldXNlZCwgYnV0IAotCSoqIHRoaXMgaXMgYXMgZ29vZCBhcyByZWlzZXJmcyBjYW4gZG8gcmlnaHQgbm93LgotCSoqIG5vdGUgdGhhdCB0aGUgcHJpdmF0ZSBwYXJ0IG9mIGlub2RlIGlzbid0IGZpbGxlZCBpbiB5ZXQsIHdlIGhhdmUKLQkqKiB0byB1c2UgdGhlIGRpcmVjdG9yeS4KLQkqLwotCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoZGlyKS0+a19vYmplY3RpZCk7Ci0gICAgZWxzZQotI2lmIGRlZmluZWQoIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKQotCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShSRUlTRVJGU19TQihzYiktPnNfcnMtPnNfaW5vZGVfZ2VuZXJhdGlvbik7Ci0jZWxzZQotCWlub2RlLT5pX2dlbmVyYXRpb24gPSArK2V2ZW50OwotI2VuZGlmCi0KLSAgICAvKiBmaWxsIHN0YXQgZGF0YSAqLwotICAgIGlub2RlLT5pX25saW5rID0gKFNfSVNESVIgKG1vZGUpID8gMiA6IDEpOwotCi0gICAgLyogdWlkIGFuZCBnaWQgbXVzdCBhbHJlYWR5IGJlIHNldCBieSB0aGUgY2FsbGVyIGZvciBxdW90YSBpbml0ICovCi0KLSAgICAvKiBzeW1saW5rIGNhbm5vdCBiZSBpbW11dGFibGUgb3IgYXBwZW5kIG9ubHksIHJpZ2h0PyAqLwotICAgIGlmKCBTX0lTTE5LKCBpbm9kZSAtPiBpX21vZGUgKSApCi0JICAgIGlub2RlIC0+IGlfZmxhZ3MgJj0gfiAoIFNfSU1NVVRBQkxFIHwgU19BUFBFTkQgKTsKLQotICAgIGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9Ci0JICAgIENVUlJFTlRfVElNRV9TRUM7Ci0gICAgaW5vZGUtPmlfc2l6ZSA9IGlfc2l6ZTsKLSAgICBpbm9kZS0+aV9ibG9ja3MgPSAwOwotICAgIGlub2RlLT5pX2J5dGVzID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFNfSVNMTksobW9kZSkgPyAxIDogCi0gICAgICBVMzJfTUFYLypOT19CWVRFU19JTl9ESVJFQ1RfSVRFTSovOwotCi0gICAgSU5JVF9MSVNUX0hFQUQoJihSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0ICkpOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayA9IDA7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSAwOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gMDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9qbCA9IE5VTEw7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPQotCVJFSVNFUkZTX0koZGlyKS0+aV9hdHRycyAmIFJFSVNFUkZTX0lOSEVSSVRfTUFTSzsKLSAgICBzZF9hdHRyc190b19pX2F0dHJzKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2F0dHJzLCBpbm9kZSApOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKLSAgICBpbml0X3J3c2VtICgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7Ci0KLSAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpCi0JbWFrZV9sZV9pdGVtX2hlYWQgKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIFNEX1YxX1NJWkUsIE1BWF9VU19JTlQpOwotICAgIGVsc2UKLQltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCBOVUxMLCBLRVlfRk9STUFUXzNfNiwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgU0RfU0laRSwgTUFYX1VTX0lOVCk7Ci0KLSAgICAvKiBrZXkgdG8gc2VhcmNoIGZvciBjb3JyZWN0IHBsYWNlIGZvciBuZXcgc3RhdCBkYXRhICovCi0gICAgX21ha2VfY3B1X2tleSAoJmtleSwgS0VZX0ZPUk1BVF8zXzYsIGxlMzJfdG9fY3B1IChpaC5paF9rZXkua19kaXJfaWQpLAotCQkgICBsZTMyX3RvX2NwdSAoaWguaWhfa2V5Lmtfb2JqZWN0aWQpLCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCAzLyprZXkgbGVuZ3RoKi8pOwotCi0gICAgLyogZmluZCBwcm9wZXIgcGxhY2UgZm9yIGluc2VydGluZyBvZiBzdGF0IGRhdGEgKi8KLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoc2IsICZrZXksICZwYXRoX3RvX2tleSk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCWVyciA9IC1FSU87Ci0JZ290byBvdXRfYmFkX2lub2RlOwotICAgIH0KLSAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKLQlwYXRocmVsc2UgKCZwYXRoX3RvX2tleSk7Ci0JZXJyID0gLUVFWElTVDsKLQlnb3RvIG91dF9iYWRfaW5vZGU7Ci0gICAgfQotICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkgewotCWlmIChpbm9kZS0+aV91aWQgJiB+MHhmZmZmIHx8IGlub2RlLT5pX2dpZCAmIH4weGZmZmYpIHsKLQkgICAgcGF0aHJlbHNlICgmcGF0aF90b19rZXkpOwotCSAgICAvKiBpX3VpZCBvciBpX2dpZCBpcyB0b28gYmlnIHRvIGJlIHN0b3JlZCBpbiBzdGF0IGRhdGEgdjMuNSAqLwotCSAgICBlcnIgPSAtRUlOVkFMOwotCSAgICBnb3RvIG91dF9iYWRfaW5vZGU7CisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQllcnIgPSAtRURRVU9UOworCQlnb3RvIG91dF9lbmRfdHJhbnM7CiAJfQotCWlub2RlMnNkX3YxICgmc2QsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKLSAgICB9IGVsc2UgewotCWlub2RlMnNkICgmc2QsIGlub2RlLCBpbm9kZS0+aV9zaXplKTsKLSAgICB9Ci0gICAgLy8gdGhlc2UgZG8gbm90IGdvIHRvIG9uLWRpc2sgc3RhdCBkYXRhCi0gICAgaW5vZGUtPmlfaW5vID0gbGUzMl90b19jcHUgKGloLmloX2tleS5rX29iamVjdGlkKTsKLSAgICBpbm9kZS0+aV9ibGtzaXplID0gcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOwotICAKLSAgICAvLyBzdG9yZSBpbiBpbi1jb3JlIGlub2RlIHRoZSBrZXkgb2Ygc3RhdCBkYXRhIGFuZCB2ZXJzaW9uIGFsbAotICAgIC8vIG9iamVjdCBpdGVtcyB3aWxsIGhhdmUgKGRpcmVjdG9yeSBpdGVtcyB3aWxsIGhhdmUgb2xkIG9mZnNldAotICAgIC8vIGZvcm1hdCwgb3RoZXIgbmV3IG9iamVjdHMgd2lsbCBjb25zaXN0IG9mIG5ldyBpdGVtcykKLSAgICBtZW1jcHkgKElOT0RFX1BLRVkgKGlub2RlKSwgJihpaC5paF9rZXkpLCBLRVlfU0laRSk7Ci0gICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpIHx8IFNfSVNESVIobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkKLSAgICAgICAgc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUsIEtFWV9GT1JNQVRfM182KTsKLSAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpCi0Jc2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlLCBTVEFUX0RBVEFfVjEpOwotICAgIGVsc2UKLQlzZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUsIFNUQVRfREFUQV9WMik7Ci0gICAgCi0gICAgLyogaW5zZXJ0IHRoZSBzdGF0IGRhdGEgaW50byB0aGUgdHJlZSAqLwotI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBpZiAoUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSkKLQl0aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDE7CisJaWYgKCFkaXIgfHwgIWRpci0+aV9ubGluaykgeworCQllcnIgPSAtRVBFUk07CisJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisKKwlzYiA9IGRpci0+aV9zYjsKKworCS8qIGl0ZW0gaGVhZCBvZiBuZXcgaXRlbSAqLworCWloLmloX2tleS5rX2Rpcl9pZCA9IHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKGRpcik7CisJaWguaWhfa2V5Lmtfb2JqZWN0aWQgPSBjcHVfdG9fbGUzMihyZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHRoKSk7CisJaWYgKCFpaC5paF9rZXkua19vYmplY3RpZCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJfQorCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQkvKiBub3QgYSBwZXJmZWN0IGdlbmVyYXRpb24gY291bnQsIGFzIG9iamVjdCBpZHMgY2FuIGJlIHJldXNlZCwgYnV0IAorCQkgKiogdGhpcyBpcyBhcyBnb29kIGFzIHJlaXNlcmZzIGNhbiBkbyByaWdodCBub3cuCisJCSAqKiBub3RlIHRoYXQgdGhlIHByaXZhdGUgcGFydCBvZiBpbm9kZSBpc24ndCBmaWxsZWQgaW4geWV0LCB3ZSBoYXZlCisJCSAqKiB0byB1c2UgdGhlIGRpcmVjdG9yeS4KKwkJICovCisJCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGRpciktPmtfb2JqZWN0aWQpOworCWVsc2UKKyNpZiBkZWZpbmVkKCBVU0VfSU5PREVfR0VORVJBVElPTl9DT1VOVEVSICkKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9CisJCSAgICBsZTMyX3RvX2NwdShSRUlTRVJGU19TQihzYiktPnNfcnMtPnNfaW5vZGVfZ2VuZXJhdGlvbik7CisjZWxzZQorCQlpbm9kZS0+aV9nZW5lcmF0aW9uID0gKytldmVudDsKICNlbmRpZgotICAgIHJldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgJnBhdGhfdG9fa2V5LCAma2V5LCAmaWgsIGlub2RlLCAoY2hhciAqKSgmc2QpKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JZXJyID0gcmV0dmFsOwotCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7Ci0JZ290byBvdXRfYmFkX2lub2RlOwotICAgIH0KIAorCS8qIGZpbGwgc3RhdCBkYXRhICovCisJaW5vZGUtPmlfbmxpbmsgPSAoU19JU0RJUihtb2RlKSA/IDIgOiAxKTsKKworCS8qIHVpZCBhbmQgZ2lkIG11c3QgYWxyZWFkeSBiZSBzZXQgYnkgdGhlIGNhbGxlciBmb3IgcXVvdGEgaW5pdCAqLworCisJLyogc3ltbGluayBjYW5ub3QgYmUgaW1tdXRhYmxlIG9yIGFwcGVuZCBvbmx5LCByaWdodD8gKi8KKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gfihTX0lNTVVUQUJMRSB8IFNfQVBQRU5EKTsKKworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5vZGUtPmlfc2l6ZSA9IGlfc2l6ZTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX2J5dGVzID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFNfSVNMTksobW9kZSkgPyAxIDoKKwkgICAgVTMyX01BWCAvKk5PX0JZVEVTX0lOX0RJUkVDVF9JVEVNICovIDsKKworCUlOSVRfTElTVF9IRUFEKCYoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCkpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayA9IDA7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSAwOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gMDsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9qbCA9IE5VTEw7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPQorCSAgICBSRUlTRVJGU19JKGRpciktPmlfYXR0cnMgJiBSRUlTRVJGU19JTkhFUklUX01BU0s7CisJc2RfYXR0cnNfdG9faV9hdHRycyhSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRycywgaW5vZGUpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKKwlpbml0X3J3c2VtKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBTRF9PRkZTRVQsCisJCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfVjFfU0laRSwgTUFYX1VTX0lOVCk7CisJZWxzZQorCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM182LCBTRF9PRkZTRVQsCisJCQkJICBUWVBFX1NUQVRfREFUQSwgU0RfU0laRSwgTUFYX1VTX0lOVCk7CisKKwkvKiBrZXkgdG8gc2VhcmNoIGZvciBjb3JyZWN0IHBsYWNlIGZvciBuZXcgc3RhdCBkYXRhICovCisJX21ha2VfY3B1X2tleSgma2V5LCBLRVlfRk9STUFUXzNfNiwgbGUzMl90b19jcHUoaWguaWhfa2V5LmtfZGlyX2lkKSwKKwkJICAgICAgbGUzMl90b19jcHUoaWguaWhfa2V5Lmtfb2JqZWN0aWQpLCBTRF9PRkZTRVQsCisJCSAgICAgIFRZUEVfU1RBVF9EQVRBLCAzIC8qa2V5IGxlbmd0aCAqLyApOworCisJLyogZmluZCBwcm9wZXIgcGxhY2UgZm9yIGluc2VydGluZyBvZiBzdGF0IGRhdGEgKi8KKwlyZXR2YWwgPSBzZWFyY2hfaXRlbShzYiwgJmtleSwgJnBhdGhfdG9fa2V5KTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2JhZF9pbm9kZTsKKwl9CisJaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJCXBhdGhyZWxzZSgmcGF0aF90b19rZXkpOworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJfQorCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKSB7CisJCWlmIChpbm9kZS0+aV91aWQgJiB+MHhmZmZmIHx8IGlub2RlLT5pX2dpZCAmIH4weGZmZmYpIHsKKwkJCXBhdGhyZWxzZSgmcGF0aF90b19rZXkpOworCQkJLyogaV91aWQgb3IgaV9naWQgaXMgdG9vIGJpZyB0byBiZSBzdG9yZWQgaW4gc3RhdCBkYXRhIHYzLjUgKi8KKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9iYWRfaW5vZGU7CisJCX0KKwkJaW5vZGUyc2RfdjEoJnNkLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisJfSBlbHNlIHsKKwkJaW5vZGUyc2QoJnNkLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisJfQorCS8vIHRoZXNlIGRvIG5vdCBnbyB0byBvbi1kaXNrIHN0YXQgZGF0YQorCWlub2RlLT5pX2lubyA9IGxlMzJfdG9fY3B1KGloLmloX2tleS5rX29iamVjdGlkKTsKKwlpbm9kZS0+aV9ibGtzaXplID0gcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOworCisJLy8gc3RvcmUgaW4gaW4tY29yZSBpbm9kZSB0aGUga2V5IG9mIHN0YXQgZGF0YSBhbmQgdmVyc2lvbiBhbGwKKwkvLyBvYmplY3QgaXRlbXMgd2lsbCBoYXZlIChkaXJlY3RvcnkgaXRlbXMgd2lsbCBoYXZlIG9sZCBvZmZzZXQKKwkvLyBmb3JtYXQsIG90aGVyIG5ldyBvYmplY3RzIHdpbGwgY29uc2lzdCBvZiBuZXcgaXRlbXMpCisJbWVtY3B5KElOT0RFX1BLRVkoaW5vZGUpLCAmKGloLmloX2tleSksIEtFWV9TSVpFKTsKKwlpZiAob2xkX2Zvcm1hdF9vbmx5KHNiKSB8fCBTX0lTRElSKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpCisJCXNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisJZWxzZQorCQlzZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSwgS0VZX0ZPUk1BVF8zXzYpOworCWlmIChvbGRfZm9ybWF0X29ubHkoc2IpKQorCQlzZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSwgU1RBVF9EQVRBX1YxKTsKKwllbHNlCisJCXNldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlLCBTVEFUX0RBVEFfVjIpOworCisJLyogaW5zZXJ0IHRoZSBzdGF0IGRhdGEgaW50byB0aGUgdHJlZSAqLwogI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBpZiAoIXRoLT5kaXNwbGFjZV9uZXdfYmxvY2tzKQotCVJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAwOworCWlmIChSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5KQorCQl0aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcyA9IDE7CiAjZW5kaWYKLSAgICBpZiAoU19JU0RJUihtb2RlKSkgewotCS8qIGluc2VydCBpdGVtIHdpdGggIi4iIGFuZCAiLi4iICovCi0JcmV0dmFsID0gcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSAodGgsIGlub2RlLCAmaWgsICZwYXRoX3RvX2tleSwgZGlyKTsKLSAgICB9CisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoX3RvX2tleSwgJmtleSwgJmloLCBpbm9kZSwKKwkJCQkgKGNoYXIgKikoJnNkKSk7CisJaWYgKHJldHZhbCkgeworCQllcnIgPSByZXR2YWw7CisJCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKKwkJZ290byBvdXRfYmFkX2lub2RlOworCX0KKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisJaWYgKCF0aC0+ZGlzcGxhY2VfbmV3X2Jsb2NrcykKKwkJUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSA9IDA7CisjZW5kaWYKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQkvKiBpbnNlcnQgaXRlbSB3aXRoICIuIiBhbmQgIi4uIiAqLworCQlyZXR2YWwgPQorCQkgICAgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSh0aCwgaW5vZGUsICZpaCwgJnBhdGhfdG9fa2V5LCBkaXIpOworCX0KIAotICAgIGlmIChTX0lTTE5LKG1vZGUpKSB7Ci0JLyogaW5zZXJ0IGJvZHkgb2Ygc3ltbGluayAqLwotCWlmICghb2xkX2Zvcm1hdF9vbmx5IChzYikpCi0JICAgIGlfc2l6ZSA9IFJPVU5EX1VQKGlfc2l6ZSk7Ci0JcmV0dmFsID0gcmVpc2VyZnNfbmV3X3N5bWxpbmsgKHRoLCBpbm9kZSwgJmloLCAmcGF0aF90b19rZXksIHN5bW5hbWUsIGlfc2l6ZSk7Ci0gICAgfQotICAgIGlmIChyZXR2YWwpIHsKLQllcnIgPSByZXR2YWw7Ci0JcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpIDsKLQlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOwotCWdvdG8gb3V0X2luc2VydGVkX3NkOwotICAgIH0KKwlpZiAoU19JU0xOSyhtb2RlKSkgeworCQkvKiBpbnNlcnQgYm9keSBvZiBzeW1saW5rICovCisJCWlmICghb2xkX2Zvcm1hdF9vbmx5KHNiKSkKKwkJCWlfc2l6ZSA9IFJPVU5EX1VQKGlfc2l6ZSk7CisJCXJldHZhbCA9CisJCSAgICByZWlzZXJmc19uZXdfc3ltbGluayh0aCwgaW5vZGUsICZpaCwgJnBhdGhfdG9fa2V5LCBzeW1uYW1lLAorCQkJCQkgaV9zaXplKTsKKwl9CisJaWYgKHJldHZhbCkgeworCQllcnIgPSByZXR2YWw7CisJCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKKwkJam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKwkJZ290byBvdXRfaW5zZXJ0ZWRfc2Q7CisJfQogCi0gICAgLyogWFhYIENIRUNLIFRISVMgKi8KLSAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSkgewotICAgICAgICByZXR2YWwgPSByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChkaXIsIGRlbnRyeSwgaW5vZGUpOwotICAgICAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgICAgICBlcnIgPSByZXR2YWw7Ci0gICAgICAgICAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSkgOwotICAgICAgICAgICAgam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKLSAgICAgICAgICAgIGdvdG8gb3V0X2luc2VydGVkX3NkOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1BPU0lYQUNMKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJBQ0xzIGFyZW4ndCBlbmFibGVkIGluIHRoZSBmcywgIgotCQkJICAiYnV0IHZmcyB0aGlua3MgdGhleSBhcmUhIik7Ci0gICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgewotCXJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoaW5vZGUpOwotICAgIH0KKwkvKiBYWFggQ0hFQ0sgVEhJUyAqLworCWlmIChyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpIHsKKwkJcmV0dmFsID0gcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChkaXIsIGRlbnRyeSwgaW5vZGUpOworCQlpZiAocmV0dmFsKSB7CisJCQllcnIgPSByZXR2YWw7CisJCQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSk7CisJCQlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCQkJZ290byBvdXRfaW5zZXJ0ZWRfc2Q7CisJCX0KKwl9IGVsc2UgaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUE9TSVhBQ0wpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgIkFDTHMgYXJlbid0IGVuYWJsZWQgaW4gdGhlIGZzLCAiCisJCQkJICJidXQgdmZzIHRoaW5rcyB0aGV5IGFyZSEiKTsKKwl9IGVsc2UgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGRpcikpIHsKKwkJcmVpc2VyZnNfbWFya19pbm9kZV9wcml2YXRlKGlub2RlKTsKKwl9CiAKLSAgICBpbnNlcnRfaW5vZGVfaGFzaCAoaW5vZGUpOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOwotICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KTsKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogCiAvKiBpdCBsb29rcyBsaWtlIHlvdSBjYW4gZWFzaWx5IGNvbXByZXNzIHRoZXNlIHR3byBnb3RvIHRhcmdldHMgaW50bwogICogb25lLiAgS2VlcGluZyBpdCBsaWtlIHRoaXMgZG9lc24ndCBhY3R1YWxseSBodXJ0IGFueXRoaW5nLCBhbmQgdGhleQogICogYXJlIHBsYWNlIGhvbGRlcnMgZm9yIHdoYXQgdGhlIHF1b3RhIGNvZGUgYWN0dWFsbHkgbmVlZHMuCiAgKi8KLW91dF9iYWRfaW5vZGU6Ci0gICAgLyogSW52YWxpZGF0ZSB0aGUgb2JqZWN0LCBub3RoaW5nIHdhcyBpbnNlcnRlZCB5ZXQgKi8KLSAgICBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCA9IDA7CisgICAgICBvdXRfYmFkX2lub2RlOgorCS8qIEludmFsaWRhdGUgdGhlIG9iamVjdCwgbm90aGluZyB3YXMgaW5zZXJ0ZWQgeWV0ICovCisJSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQgPSAwOwogCi0gICAgLyogUXVvdGEgY2hhbmdlIG11c3QgYmUgaW5zaWRlIGEgdHJhbnNhY3Rpb24gZm9yIGpvdXJuYWxpbmcgKi8KLSAgICBEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwkvKiBRdW90YSBjaGFuZ2UgbXVzdCBiZSBpbnNpZGUgYSB0cmFuc2FjdGlvbiBmb3Igam91cm5hbGluZyAqLworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOwogCi1vdXRfZW5kX3RyYW5zOgotICAgIGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkgOwotICAgIC8qIERyb3AgY2FuIGJlIG91dHNpZGUgYW5kIGl0IG5lZWRzIG1vcmUgY3JlZGl0cyBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0IG91dHNpZGUgKi8KLSAgICBEUVVPVF9EUk9QKGlub2RlKTsKLSAgICBpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7Ci0gICAgbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworICAgICAgb3V0X2VuZF90cmFuczoKKwlqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworCS8qIERyb3AgY2FuIGJlIG91dHNpZGUgYW5kIGl0IG5lZWRzIG1vcmUgY3JlZGl0cyBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0IG91dHNpZGUgKi8KKwlEUVVPVF9EUk9QKGlub2RlKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCi1vdXRfaW5zZXJ0ZWRfc2Q6Ci0gICAgaW5vZGUtPmlfbmxpbmsgPSAwOwotICAgIHRoLT50X3RyYW5zX2lkID0gMDsgLyogc28gdGhlIGNhbGxlciBjYW4ndCB1c2UgdGhpcyBoYW5kbGUgbGF0ZXIgKi8KLSAgICBpcHV0KGlub2RlKTsKLSAgICByZXR1cm4gZXJyOworICAgICAgb3V0X2luc2VydGVkX3NkOgorCWlub2RlLT5pX25saW5rID0gMDsKKwl0aC0+dF90cmFuc19pZCA9IDA7CS8qIHNvIHRoZSBjYWxsZXIgY2FuJ3QgdXNlIHRoaXMgaGFuZGxlIGxhdGVyICovCisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTE4OTEsNzcgKzE5OTcsNzggQEAKICoqCiAqKiBvbiBmYWlsdXJlLCBub256ZXJvIGlzIHJldHVybmVkLCBwYWdlX3Jlc3VsdCBhbmQgYmhfcmVzdWx0IGFyZSB1bnRvdWNoZWQuCiAqLwotc3RhdGljIGludCBncmFiX3RhaWxfcGFnZShzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgCi0JCQkgIHN0cnVjdCBwYWdlICoqcGFnZV9yZXN1bHQsIAotCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaF9yZXN1bHQpIHsKK3N0YXRpYyBpbnQgZ3JhYl90YWlsX3BhZ2Uoc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCisJCQkgIHN0cnVjdCBwYWdlICoqcGFnZV9yZXN1bHQsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoX3Jlc3VsdCkKK3sKIAotICAgIC8qIHdlIHdhbnQgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFzdCBieXRlIGluIHRoZSBmaWxlLAotICAgICoqIG5vdCB0aGUgcGFnZSB0aGF0IHdpbGwgaG9sZCB0aGUgbmV4dCBieXRlIGZvciBhcHBlbmRpbmcKLSAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSAocF9zX2lub2RlLT5pX3NpemUtMSkgPj4gUEFHRV9DQUNIRV9TSElGVCA7Ci0gICAgdW5zaWduZWQgbG9uZyBwb3MgPSAwIDsKLSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gMCA7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IChwX3NfaW5vZGUtPmlfc2l6ZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA7Ci0gICAgc3RydWN0IHBhZ2UgKiBwYWdlIDsKLSAgICBpbnQgZXJyb3IgOwotICAgIAotICAgIC8qIHdlIGtub3cgdGhhdCB3ZSBhcmUgb25seSBjYWxsZWQgd2l0aCBpbm9kZS0+aV9zaXplID4gMC4KLSAgICAqKiB3ZSBhbHNvIGtub3cgdGhhdCBhIGZpbGUgdGFpbCBjYW4gbmV2ZXIgYmUgYXMgYmlnIGFzIGEgYmxvY2sKLSAgICAqKiBJZiBpX3NpemUgJSBibG9ja3NpemUgPT0gMCwgb3VyIGZpbGUgaXMgY3VycmVudGx5IGJsb2NrIGFsaWduZWQKLSAgICAqKiBhbmQgaXQgd29uJ3QgbmVlZCBjb252ZXJ0aW5nIG9yIHplcm9pbmcgYWZ0ZXIgYSB0cnVuY2F0ZS4KLSAgICAqLwotICAgIGlmICgob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UIDsKLSAgICB9Ci0gICAgcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShwX3NfaW5vZGUtPmlfbWFwcGluZywgaW5kZXgpIDsKLSAgICBlcnJvciA9IC1FTk9NRU0gOwotICAgIGlmICghcGFnZSkgewotICAgICAgICBnb3RvIG91dCA7Ci0gICAgfQotICAgIC8qIHN0YXJ0IHdpdGhpbiB0aGUgcGFnZSBvZiB0aGUgbGFzdCBibG9jayBpbiB0aGUgZmlsZSAqLwotICAgIHN0YXJ0ID0gKG9mZnNldCAvIGJsb2Nrc2l6ZSkgKiBibG9ja3NpemUgOworCS8qIHdlIHdhbnQgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFzdCBieXRlIGluIHRoZSBmaWxlLAorCSAqKiBub3QgdGhlIHBhZ2UgdGhhdCB3aWxsIGhvbGQgdGhlIG5leHQgYnl0ZSBmb3IgYXBwZW5kaW5nCisJICovCisJdW5zaWduZWQgbG9uZyBpbmRleCA9IChwX3NfaW5vZGUtPmlfc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBwb3MgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gcF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IChwX3NfaW5vZGUtPmlfc2l6ZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGVycm9yOwogCi0gICAgZXJyb3IgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIHN0YXJ0LCBvZmZzZXQsIAotCQkJCXJlaXNlcmZzX2dldF9ibG9ja19jcmVhdGVfMCkgOwotICAgIGlmIChlcnJvcikKLQlnb3RvIHVubG9jayA7Ci0KLSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsgICAgICAKLSAgICBiaCA9IGhlYWQ7Ci0gICAgZG8gewotCWlmIChwb3MgPj0gc3RhcnQpIHsKLQkgICAgYnJlYWsgOworCS8qIHdlIGtub3cgdGhhdCB3ZSBhcmUgb25seSBjYWxsZWQgd2l0aCBpbm9kZS0+aV9zaXplID4gMC4KKwkgKiogd2UgYWxzbyBrbm93IHRoYXQgYSBmaWxlIHRhaWwgY2FuIG5ldmVyIGJlIGFzIGJpZyBhcyBhIGJsb2NrCisJICoqIElmIGlfc2l6ZSAlIGJsb2Nrc2l6ZSA9PSAwLCBvdXIgZmlsZSBpcyBjdXJyZW50bHkgYmxvY2sgYWxpZ25lZAorCSAqKiBhbmQgaXQgd29uJ3QgbmVlZCBjb252ZXJ0aW5nIG9yIHplcm9pbmcgYWZ0ZXIgYSB0cnVuY2F0ZS4KKwkgKi8KKwlpZiAoKG9mZnNldCAmIChibG9ja3NpemUgLSAxKSkgPT0gMCkgeworCQlyZXR1cm4gLUVOT0VOVDsKIAl9Ci0JYmggPSBiaC0+Yl90aGlzX3BhZ2UgOwotCXBvcyArPSBibG9ja3NpemUgOwotICAgIH0gd2hpbGUoYmggIT0gaGVhZCkgOworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UocF9zX2lub2RlLT5pX21hcHBpbmcsIGluZGV4KTsKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKCFwYWdlKSB7CisJCWdvdG8gb3V0OworCX0KKwkvKiBzdGFydCB3aXRoaW4gdGhlIHBhZ2Ugb2YgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUgKi8KKwlzdGFydCA9IChvZmZzZXQgLyBibG9ja3NpemUpICogYmxvY2tzaXplOwogCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JLyogbm90ZSwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBwcmVwYXJlX3dyaXRlIHNob3VsZAotCSoqIGJlIHRha2luZyBjYXJlIG9mIHRoaXMgZm9yIHVzLiAgSWYgdGhlIGJ1ZmZlciBpc24ndCB1cCB0byBkYXRlLAotCSoqIEkndmUgc2NyZXdlZCB1cCB0aGUgY29kZSB0byBmaW5kIHRoZSBidWZmZXIsIG9yIHRoZSBjb2RlIHRvCi0JKiogY2FsbCBwcmVwYXJlX3dyaXRlCi0JKi8KLQlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsCi0JCQkgICJjbG0tNjAwMDogZXJyb3IgcmVhZGluZyBibG9jayAlbHUgb24gZGV2ICVzIiwKLQkJCSAgYmgtPmJfYmxvY2tuciwKLQkJCSAgcmVpc2VyZnNfYmRldm5hbWUgKHBfc19pbm9kZS0+aV9zYikpIDsKLQllcnJvciA9IC1FSU8gOwotCWdvdG8gdW5sb2NrIDsKLSAgICB9Ci0gICAgKmJoX3Jlc3VsdCA9IGJoIDsKLSAgICAqcGFnZV9yZXN1bHQgPSBwYWdlIDsKKwllcnJvciA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgc3RhcnQsIG9mZnNldCwKKwkJCQkgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrX2NyZWF0ZV8wKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gdW5sb2NrOwogCi1vdXQ6Ci0gICAgcmV0dXJuIGVycm9yIDsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCWlmIChwb3MgPj0gc3RhcnQpIHsKKwkJCWJyZWFrOworCQl9CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQlwb3MgKz0gYmxvY2tzaXplOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOwogCi11bmxvY2s6Ci0gICAgdW5sb2NrX3BhZ2UocGFnZSkgOwotICAgIHBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7Ci0gICAgcmV0dXJuIGVycm9yIDsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJLyogbm90ZSwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBwcmVwYXJlX3dyaXRlIHNob3VsZAorCQkgKiogYmUgdGFraW5nIGNhcmUgb2YgdGhpcyBmb3IgdXMuICBJZiB0aGUgYnVmZmVyIGlzbid0IHVwIHRvIGRhdGUsCisJCSAqKiBJJ3ZlIHNjcmV3ZWQgdXAgdGhlIGNvZGUgdG8gZmluZCB0aGUgYnVmZmVyLCBvciB0aGUgY29kZSB0bworCQkgKiogY2FsbCBwcmVwYXJlX3dyaXRlCisJCSAqLworCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkgImNsbS02MDAwOiBlcnJvciByZWFkaW5nIGJsb2NrICVsdSBvbiBkZXYgJXMiLAorCQkJCSBiaC0+Yl9ibG9ja25yLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShwX3NfaW5vZGUtPmlfc2IpKTsKKwkJZXJyb3IgPSAtRUlPOworCQlnb3RvIHVubG9jazsKKwl9CisJKmJoX3Jlc3VsdCA9IGJoOworCSpwYWdlX3Jlc3VsdCA9IHBhZ2U7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gZXJyb3I7CisKKyAgICAgIHVubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtMTk3MCwyMzUgKzIwNzcsMjQ3IEBACiAqKgogKiogc29tZSBjb2RlIHRha2VuIGZyb20gYmxvY2tfdHJ1bmNhdGVfcGFnZQogKi8KLWludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICAvKiB3ZSB3YW50IHRoZSBvZmZzZXQgZm9yIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGZpbGUgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IHBfc19pbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLSAgICB1bnNpZ25lZCBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKLSAgICB1bnNpZ25lZCBsZW5ndGggOwotICAgIHN0cnVjdCBwYWdlICpwYWdlID0gTlVMTCA7Ci0gICAgaW50IGVycm9yIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTCA7CitpbnQgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgaW50IHVwZGF0ZV90aW1lc3RhbXBzKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJLyogd2Ugd2FudCB0aGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QgYnl0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBmaWxlICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBwX3NfaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCBibG9ja3NpemUgPSBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGxlbmd0aDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJaW50IGVycm9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhwX3NfaW5vZGUtPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2socF9zX2lub2RlLT5pX3NiKTsKIAotICAgIGlmIChwX3NfaW5vZGUtPmlfc2l6ZSA+IDApIHsKLSAgICAgICAgaWYgKChlcnJvciA9IGdyYWJfdGFpbF9wYWdlKHBfc19pbm9kZSwgJnBhZ2UsICZiaCkpKSB7Ci0JICAgIC8vIC1FTk9FTlQgbWVhbnMgd2UgdHJ1bmNhdGVkIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSwgCi0JICAgIC8vIGFuZCBnZXRfYmxvY2tfY3JlYXRlXzAgY291bGQgbm90IGZpbmQgYSBibG9jayB0byByZWFkIGluLAotCSAgICAvLyB3aGljaCBpcyBvay4KLQkgICAgaWYgKGVycm9yICE9IC1FTk9FTlQpCi0JICAgICAgICByZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsCi0JCQkJICAiY2xtLTYwMDE6IGdyYWJfdGFpbF9wYWdlIGZhaWxlZCAlZCIsCi0JCQkJICBlcnJvcik7Ci0JICAgIHBhZ2UgPSBOVUxMIDsKLQkgICAgYmggPSBOVUxMIDsKKwlpZiAocF9zX2lub2RlLT5pX3NpemUgPiAwKSB7CisJCWlmICgoZXJyb3IgPSBncmFiX3RhaWxfcGFnZShwX3NfaW5vZGUsICZwYWdlLCAmYmgpKSkgeworCQkJLy8gLUVOT0VOVCBtZWFucyB3ZSB0cnVuY2F0ZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCAKKwkJCS8vIGFuZCBnZXRfYmxvY2tfY3JlYXRlXzAgY291bGQgbm90IGZpbmQgYSBibG9jayB0byByZWFkIGluLAorCQkJLy8gd2hpY2ggaXMgb2suCisJCQlpZiAoZXJyb3IgIT0gLUVOT0VOVCkKKwkJCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkJCSAiY2xtLTYwMDE6IGdyYWJfdGFpbF9wYWdlIGZhaWxlZCAlZCIsCisJCQkJCQkgZXJyb3IpOworCQkJcGFnZSA9IE5VTEw7CisJCQliaCA9IE5VTEw7CisJCX0KIAl9Ci0gICAgfQogCi0gICAgLyogc28sIGlmIHBhZ2UgIT0gTlVMTCwgd2UgaGF2ZSBhIGJ1ZmZlciBoZWFkIGZvciB0aGUgb2Zmc2V0IGF0IAotICAgICoqIHRoZSBlbmQgb2YgdGhlIGZpbGUuIGlmIHRoZSBiaCBpcyBtYXBwZWQsIGFuZCBiaC0+Yl9ibG9ja25yICE9IDAsIAotICAgICoqIHRoZW4gd2UgaGF2ZSBhbiB1bmZvcm1hdHRlZCBub2RlLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgZGlyZWN0IGl0ZW0sIAotICAgICoqIGFuZCBubyB6ZXJvaW5nIGlzIHJlcXVpcmVkIG9uIGRpc2suICBXZSB6ZXJvIGFmdGVyIHRoZSB0cnVuY2F0ZSwgCi0gICAgKiogYmVjYXVzZSB0aGUgdHJ1bmNhdGUgbWlnaHQgcGFjayB0aGUgaXRlbSBhbnl3YXkgCi0gICAgKiogKGl0IHdpbGwgdW5tYXAgYmggaWYgaXQgcGFja3MpLgotICAgICovCi0gICAgLyogaXQgaXMgZW5vdWdoIHRvIHJlc2VydmUgc3BhY2UgaW4gdHJhbnNhY3Rpb24gZm9yIDIgYmFsYW5jaW5nczoKLSAgICAgICBvbmUgZm9yICJzYXZlIiBsaW5rIGFkZGluZyBhbmQgYW5vdGhlciBmb3IgdGhlIGZpcnN0Ci0gICAgICAgY3V0X2Zyb21faXRlbS4gMSBpcyBmb3IgdXBkYXRlX3NkICovCi0gICAgZXJyb3IgPSBqb3VybmFsX2JlZ2luICgmdGgsIHBfc19pbm9kZS0+aV9zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDEpOwotICAgIGlmIChlcnJvcikKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBfc19pbm9kZSkgOwotICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykKLQkgICAgLyogd2UgYXJlIGRvaW5nIHJlYWwgdHJ1bmNhdGU6IGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBiZWZvcmUgdGhlIGxhc3QKLQkgICAgICAgdHJhbnNhY3Rpb24gb2YgdHJ1bmNhdGluZyBnZXRzIGNvbW1pdHRlZCAtIG9uIHJlYm9vdCB0aGUgZmlsZQotCSAgICAgICBlaXRoZXIgYXBwZWFycyB0cnVuY2F0ZWQgcHJvcGVybHkgb3Igbm90IHRydW5jYXRlZCBhdCBhbGwgKi8KLQlhZGRfc2F2ZV9saW5rICgmdGgsIHBfc19pbm9kZSwgMSk7Ci0gICAgZXJyb3IgPSByZWlzZXJmc19kb190cnVuY2F0ZSAoJnRoLCBwX3NfaW5vZGUsIHBhZ2UsIHVwZGF0ZV90aW1lc3RhbXBzKSA7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICBnb3RvIG91dDsKLSAgICBlcnJvciA9IGpvdXJuYWxfZW5kICgmdGgsIHBfc19pbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMSk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICBnb3RvIG91dDsKKwkvKiBzbywgaWYgcGFnZSAhPSBOVUxMLCB3ZSBoYXZlIGEgYnVmZmVyIGhlYWQgZm9yIHRoZSBvZmZzZXQgYXQgCisJICoqIHRoZSBlbmQgb2YgdGhlIGZpbGUuIGlmIHRoZSBiaCBpcyBtYXBwZWQsIGFuZCBiaC0+Yl9ibG9ja25yICE9IDAsIAorCSAqKiB0aGVuIHdlIGhhdmUgYW4gdW5mb3JtYXR0ZWQgbm9kZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSBhIGRpcmVjdCBpdGVtLCAKKwkgKiogYW5kIG5vIHplcm9pbmcgaXMgcmVxdWlyZWQgb24gZGlzay4gIFdlIHplcm8gYWZ0ZXIgdGhlIHRydW5jYXRlLCAKKwkgKiogYmVjYXVzZSB0aGUgdHJ1bmNhdGUgbWlnaHQgcGFjayB0aGUgaXRlbSBhbnl3YXkgCisJICoqIChpdCB3aWxsIHVubWFwIGJoIGlmIGl0IHBhY2tzKS4KKwkgKi8KKwkvKiBpdCBpcyBlbm91Z2ggdG8gcmVzZXJ2ZSBzcGFjZSBpbiB0cmFuc2FjdGlvbiBmb3IgMiBiYWxhbmNpbmdzOgorCSAgIG9uZSBmb3IgInNhdmUiIGxpbmsgYWRkaW5nIGFuZCBhbm90aGVyIGZvciB0aGUgZmlyc3QKKwkgICBjdXRfZnJvbV9pdGVtLiAxIGlzIGZvciB1cGRhdGVfc2QgKi8KKwllcnJvciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBwX3NfaW5vZGUtPmlfc2IsCisJCQkgICAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAxKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpOworCWlmICh1cGRhdGVfdGltZXN0YW1wcykKKwkJLyogd2UgYXJlIGRvaW5nIHJlYWwgdHJ1bmNhdGU6IGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBiZWZvcmUgdGhlIGxhc3QKKwkJICAgdHJhbnNhY3Rpb24gb2YgdHJ1bmNhdGluZyBnZXRzIGNvbW1pdHRlZCAtIG9uIHJlYm9vdCB0aGUgZmlsZQorCQkgICBlaXRoZXIgYXBwZWFycyB0cnVuY2F0ZWQgcHJvcGVybHkgb3Igbm90IHRydW5jYXRlZCBhdCBhbGwgKi8KKwkJYWRkX3NhdmVfbGluaygmdGgsIHBfc19pbm9kZSwgMSk7CisJZXJyb3IgPSByZWlzZXJmc19kb190cnVuY2F0ZSgmdGgsIHBfc19pbm9kZSwgcGFnZSwgdXBkYXRlX3RpbWVzdGFtcHMpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJZXJyb3IgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIHBfc19pbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKIAotICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgewotCWVycm9yID0gcmVtb3ZlX3NhdmVfbGluayAocF9zX2lub2RlLCAxLyogdHJ1bmNhdGUgKi8pOwotICAgICAgICBpZiAoZXJyb3IpCi0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBpZiAocGFnZSkgewotICAgICAgICBsZW5ndGggPSBvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSkgOwotCS8qIGlmIHdlIGFyZSBub3Qgb24gYSBibG9jayBib3VuZGFyeSAqLwotCWlmIChsZW5ndGgpIHsKLQkgICAgY2hhciAqa2FkZHI7Ci0KLQkgICAgbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoIDsKLQkgICAga2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgOwotCSAgICBtZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCkgOyAgIAotCSAgICBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKSA7Ci0JICAgIGt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKSA7Ci0JICAgIGlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yICE9IDApIHsKLQkgICAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKSA7Ci0JICAgIH0KKwlpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKKwkJZXJyb3IgPSByZW1vdmVfc2F2ZV9saW5rKHBfc19pbm9kZSwgMSAvKiB0cnVuY2F0ZSAqLyApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKIAl9Ci0JdW5sb2NrX3BhZ2UocGFnZSkgOwotCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7Ci0gICAgfQogCi0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIDA7Ci1vdXQ6Ci0gICAgaWYgKHBhZ2UpIHsKLSAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UgKHBhZ2UpOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gZXJyb3I7CisJaWYgKHBhZ2UpIHsKKwkJbGVuZ3RoID0gb2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpOworCQkvKiBpZiB3ZSBhcmUgbm90IG9uIGEgYmxvY2sgYm91bmRhcnkgKi8KKwkJaWYgKGxlbmd0aCkgeworCQkJY2hhciAqa2FkZHI7CisKKwkJCWxlbmd0aCA9IGJsb2Nrc2l6ZSAtIGxlbmd0aDsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBsZW5ndGgpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPSAwKSB7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJfQorCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJcmV0dXJuIDA7CisgICAgICBvdXQ6CisJaWYgKHBhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGZzX2dlbiA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCB0bXBfaWggOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKLSAgICBfX2xlMzIgKml0ZW0gOwotICAgIHN0cnVjdCBjcHVfa2V5IGtleSA7Ci0gICAgSU5JVElBTElaRV9QQVRIKHBhdGgpIDsKLSAgICBpbnQgcG9zX2luX2l0ZW0gOwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7Ci0gICAgbG9mZl90IGJ5dGVfb2Zmc2V0ID0gKGJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDEgOwotICAgIGludCByZXR2YWwgOwotICAgIGludCB1c2VfZ2V0X2Jsb2NrID0gMCA7Ci0gICAgaW50IGJ5dGVzX2NvcGllZCA9IDAgOwotICAgIGludCBjb3B5X3NpemUgOwotICAgIGludCB0cmFuc19ydW5uaW5nID0gMDsKK3N0YXRpYyBpbnQgbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGJsb2NrKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IGZzX2dlbjsKKwlzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCV9fbGUzMiAqaXRlbTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCWludCBwb3NfaW5faXRlbTsKKwlpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJbG9mZl90IGJ5dGVfb2Zmc2V0ID0gKGJsb2NrIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSArIDE7CisJaW50IHJldHZhbDsKKwlpbnQgdXNlX2dldF9ibG9jayA9IDA7CisJaW50IGJ5dGVzX2NvcGllZCA9IDA7CisJaW50IGNvcHlfc2l6ZTsKKwlpbnQgdHJhbnNfcnVubmluZyA9IDA7CiAKLSAgICAvKiBjYXRjaCBwbGFjZXMgYmVsb3cgdGhhdCB0cnkgdG8gbG9nIHNvbWV0aGluZyB3aXRob3V0IHN0YXJ0aW5nIGEgdHJhbnMgKi8KLSAgICB0aC50X3RyYW5zX2lkID0gMDsKKwkvKiBjYXRjaCBwbGFjZXMgYmVsb3cgdGhhdCB0cnkgdG8gbG9nIHNvbWV0aGluZyB3aXRob3V0IHN0YXJ0aW5nIGEgdHJhbnMgKi8KKwl0aC50X3RyYW5zX2lkID0gMDsKIAotICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICBrbWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci1zdGFydF9vdmVyOgotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotICAgIG1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgYnl0ZV9vZmZzZXQsIFRZUEVfQU5ZLCAzKSA7Ci0KLXJlc2VhcmNoOgotICAgIHJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCkgOwotICAgIGlmIChyZXR2YWwgIT0gUE9TSVRJT05fRk9VTkQpIHsKLSAgICAgICAgdXNlX2dldF9ibG9jayA9IDE7Ci0JZ290byBvdXQgOwotICAgIH0gCi0KLSAgICBiaCA9IGdldF9sYXN0X2JoKCZwYXRoKSA7Ci0gICAgaWggPSBnZXRfaWgoJnBhdGgpIDsKLSAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpIDsKLSAgICBwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW0gOwotCi0gICAgLyogd2UndmUgZm91bmQgYW4gdW5mb3JtYXR0ZWQgbm9kZSAqLwotICAgIGlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kKHJldHZhbCwgaWgpKSB7Ci0JaWYgKGJ5dGVzX2NvcGllZCA+IDApIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJjbG0tNjAwMjogYnl0ZXNfY29waWVkICVkIiwKLQkJCSAgICAgIGJ5dGVzX2NvcGllZCkgOwotCX0KLSAgICAgICAgaWYgKCFnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkgewotCSAgICAvKiBjcmFwLCB3ZSBhcmUgd3JpdGluZyB0byBhIGhvbGUgKi8KLQkgICAgdXNlX2dldF9ibG9jayA9IDE7Ci0JICAgIGdvdG8gb3V0IDsKLQl9Ci0Jc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCBnZXRfYmxvY2tfbnVtKGl0ZW0scG9zX2luX2l0ZW0pLGlub2RlKTsKLSAgICB9IGVsc2UgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKLSAgICAgICAgY2hhciAqcCA7IAotICAgICAgICBwID0gcGFnZV9hZGRyZXNzKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7Ci0gICAgICAgIHAgKz0gKGJ5dGVfb2Zmc2V0IC0xKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7Ci0gICAgICAgIGNvcHlfc2l6ZSA9IGloX2l0ZW1fbGVuKGloKSAtIHBvc19pbl9pdGVtOwotCi0JZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpIDsKLQljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCkgOwotCi0JaWYgKCF0cmFuc19ydW5uaW5nKSB7Ci0JICAgIC8qIHZzLTMwNTAgaXMgZ29uZSwgbm8gbmVlZCB0byBkcm9wIHRoZSBwYXRoICovCi0JICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgICAgICAgICBpZiAocmV0dmFsKQotICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLQkgICAgdHJhbnNfcnVubmluZyA9IDE7Ci0JICAgIGlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7Ci0JCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCQlnb3RvIHJlc2VhcmNoOwotCSAgICB9CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmhfcmVzdWx0KSkgeworCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSkgOworCWttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpOworICAgICAgc3RhcnRfb3ZlcjoKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIGJ5dGVfb2Zmc2V0LCBUWVBFX0FOWSwgMyk7CiAKLQlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7Ci0JICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOwotCSAgICBnb3RvIHJlc2VhcmNoOworICAgICAgcmVzZWFyY2g6CisJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmV0dmFsICE9IFBPU0lUSU9OX0ZPVU5EKSB7CisJCXVzZV9nZXRfYmxvY2sgPSAxOworCQlnb3RvIG91dDsKIAl9CiAKLQltZW1jcHkoIEJfSV9QSVRFTShiaCwgaWgpICsgcG9zX2luX2l0ZW0sIHAgKyBieXRlc19jb3BpZWQsIGNvcHlfc2l6ZSkgOworCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpOworCWloID0gZ2V0X2loKCZwYXRoKTsKKwlpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpOworCXBvc19pbl9pdGVtID0gcGF0aC5wb3NfaW5faXRlbTsKIAotCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIGlub2RlLT5pX3NiLCBiaCkgOwotCWJ5dGVzX2NvcGllZCArPSBjb3B5X3NpemUgOwotCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgMCwgaW5vZGUpOworCS8qIHdlJ3ZlIGZvdW5kIGFuIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwlpZiAoaW5kaXJlY3RfaXRlbV9mb3VuZChyZXR2YWwsIGloKSkgeworCQlpZiAoYnl0ZXNfY29waWVkID4gMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJjbG0tNjAwMjogYnl0ZXNfY29waWVkICVkIiwKKwkJCQkJIGJ5dGVzX2NvcGllZCk7CisJCX0KKwkJaWYgKCFnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkgeworCQkJLyogY3JhcCwgd2UgYXJlIHdyaXRpbmcgdG8gYSBob2xlICovCisJCQl1c2VfZ2V0X2Jsb2NrID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwKKwkJCQkgICAgIGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pLCBpbm9kZSk7CisJfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWgoaWgpKSB7CisJCWNoYXIgKnA7CisJCXAgPSBwYWdlX2FkZHJlc3MoYmhfcmVzdWx0LT5iX3BhZ2UpOworCQlwICs9IChieXRlX29mZnNldCAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQljb3B5X3NpemUgPSBpaF9pdGVtX2xlbihpaCkgLSBwb3NfaW5faXRlbTsKIAotCS8qIGFyZSB0aGVyZSBzdGlsbCBieXRlcyBsZWZ0PyAqLwotICAgICAgICBpZiAoYnl0ZXNfY29waWVkIDwgYmhfcmVzdWx0LT5iX3NpemUgJiYgCi0JICAgIChieXRlX29mZnNldCArIGJ5dGVzX2NvcGllZCkgPCBpbm9kZS0+aV9zaXplKSB7Ci0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KCZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBjb3B5X3NpemUpIDsKLQkgICAgZ290byByZXNlYXJjaCA7CisJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKKwkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOworCisJCWlmICghdHJhbnNfcnVubmluZykgeworCQkJLyogdnMtMzA1MCBpcyBnb25lLCBubyBuZWVkIHRvIGRyb3AgdGhlIHBhdGggKi8KKwkJCXJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXQ7CisJCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCQkJdHJhbnNfcnVubmluZyA9IDE7CisJCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkJICAgICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsCisJCQkJCQkJCSBiaCk7CisJCQkJZ290byByZXNlYXJjaDsKKwkJCX0KKwkJfQorCisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKTsKKworCQlpZiAoZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKQorCQkgICAgJiYgaXRlbV9tb3ZlZCgmdG1wX2loLCAmcGF0aCkpIHsKKwkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCk7CisJCQlnb3RvIHJlc2VhcmNoOworCQl9CisKKwkJbWVtY3B5KEJfSV9QSVRFTShiaCwgaWgpICsgcG9zX2luX2l0ZW0sIHAgKyBieXRlc19jb3BpZWQsCisJCSAgICAgICBjb3B5X3NpemUpOworCisJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCWJ5dGVzX2NvcGllZCArPSBjb3B5X3NpemU7CisJCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgMCwgaW5vZGUpOworCisJCS8qIGFyZSB0aGVyZSBzdGlsbCBieXRlcyBsZWZ0PyAqLworCQlpZiAoYnl0ZXNfY29waWVkIDwgYmhfcmVzdWx0LT5iX3NpemUgJiYKKwkJICAgIChieXRlX29mZnNldCArIGJ5dGVzX2NvcGllZCkgPCBpbm9kZS0+aV9zaXplKSB7CisJCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LAorCQkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKworCQkJCQkgICAgIGNvcHlfc2l6ZSk7CisJCQlnb3RvIHJlc2VhcmNoOworCQl9CisJfSBlbHNlIHsKKwkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkgImNsbS02MDAzOiBiYWQgaXRlbSBpbm9kZSAlbHUsIGRldmljZSAlcyIsCisJCQkJIGlub2RlLT5pX2lubywgcmVpc2VyZnNfYmRldm5hbWUoaW5vZGUtPmlfc2IpKTsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBvdXQ7CiAJfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAotCQkJICAiY2xtLTYwMDM6IGJhZCBpdGVtIGlub2RlICVsdSwgZGV2aWNlICVzIiwKLQkJCSAgaW5vZGUtPmlfaW5vLCByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpKSA7Ci0gICAgICAgIHJldHZhbCA9IC1FSU8gOwotCWdvdG8gb3V0IDsKLSAgICB9Ci0gICAgcmV0dmFsID0gMCA7Ci0gICAgCi1vdXQ6Ci0gICAgcGF0aHJlbHNlKCZwYXRoKSA7Ci0gICAgaWYgKHRyYW5zX3J1bm5pbmcpIHsKLSAgICAgICAgaW50IGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgcmV0dmFsID0gZXJyOwotCXRyYW5zX3J1bm5pbmcgPSAwOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHZhbCA9IDA7CiAKLSAgICAvKiB0aGlzIGlzIHdoZXJlIHdlIGZpbGwgaW4gaG9sZXMgaW4gdGhlIGZpbGUuICovCi0gICAgaWYgKHVzZV9nZXRfYmxvY2spIHsKLQlyZXR2YWwgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfQkxPQ0tfQ1JFQVRFIHwgR0VUX0JMT0NLX05PX0lTRU0gfAotCQkJCSAgICBHRVRfQkxPQ0tfTk9fREFOR0xFKTsKLQlpZiAoIXJldHZhbCkgewotCSAgICBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSB8fCBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7Ci0JICAgICAgICAvKiBnZXRfYmxvY2sgZmFpbGVkIHRvIGZpbmQgYSBtYXBwZWQgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KLQkJdXNlX2dldF9ibG9jayA9IDAgOwotCQlnb3RvIHN0YXJ0X292ZXIgOwotCSAgICB9CisgICAgICBvdXQ6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwlpZiAodHJhbnNfcnVubmluZykgeworCQlpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJaWYgKGVycikKKwkJCXJldHZhbCA9IGVycjsKKwkJdHJhbnNfcnVubmluZyA9IDA7CiAJfQotICAgIH0KLSAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwogCi0gICAgaWYgKCFyZXR2YWwgJiYgYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpICYmIGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKLQkvKiB3ZSd2ZSBjb3BpZWQgZGF0YSBmcm9tIHRoZSBwYWdlIGludG8gdGhlIGRpcmVjdCBpdGVtLCBzbyB0aGUKLQkgKiBidWZmZXIgaW4gdGhlIHBhZ2UgaXMgbm93IGNsZWFuLCBtYXJrIGl0IHRvIHJlZmxlY3QgdGhhdC4KLQkgKi8KLSAgICAgICAgbG9ja19idWZmZXIoYmhfcmVzdWx0KTsKLQljbGVhcl9idWZmZXJfZGlydHkoYmhfcmVzdWx0KTsKLQl1bmxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXR2YWwgOworCS8qIHRoaXMgaXMgd2hlcmUgd2UgZmlsbCBpbiBob2xlcyBpbiB0aGUgZmlsZS4gKi8KKwlpZiAodXNlX2dldF9ibG9jaykgeworCQlyZXR2YWwgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsCisJCQkJCSAgICBHRVRfQkxPQ0tfQ1JFQVRFIHwgR0VUX0JMT0NLX05PX0lTRU0KKwkJCQkJICAgIHwgR0VUX0JMT0NLX05PX0RBTkdMRSk7CisJCWlmICghcmV0dmFsKSB7CisJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KQorCQkJICAgIHx8IGJoX3Jlc3VsdC0+Yl9ibG9ja25yID09IDApIHsKKwkJCQkvKiBnZXRfYmxvY2sgZmFpbGVkIHRvIGZpbmQgYSBtYXBwZWQgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KKwkJCQl1c2VfZ2V0X2Jsb2NrID0gMDsKKwkJCQlnb3RvIHN0YXJ0X292ZXI7CisJCQl9CisJCX0KKwl9CisJa3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKTsKKworCWlmICghcmV0dmFsICYmIGJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSAmJiBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7CisJCS8qIHdlJ3ZlIGNvcGllZCBkYXRhIGZyb20gdGhlIHBhZ2UgaW50byB0aGUgZGlyZWN0IGl0ZW0sIHNvIHRoZQorCQkgKiBidWZmZXIgaW4gdGhlIHBhZ2UgaXMgbm93IGNsZWFuLCBtYXJrIGl0IHRvIHJlZmxlY3QgdGhhdC4KKwkJICovCisJCWxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7CisJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaF9yZXN1bHQpOworCQl1bmxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7CisJfQorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qIApAQCAtMjIwNiwzODMgKzIzMjUsMzkwIEBACiAgKiBzdGFydC9yZWNvdmVyeSBwYXRoIGFzIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlLCBhbG9uZyB3aXRoIHNwZWNpYWwKICAqIGNvZGUgdG8gaGFuZGxlIHJlaXNlcmZzIHRhaWxzLgogICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2Z1bGxfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdCA7Ci0gICAgdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQgOwotICAgIGludCBlcnJvciA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBibG9jayA7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7Ci0gICAgaW50IHBhcnRpYWwgPSAwIDsKLSAgICBpbnQgbnIgPSAwOwotICAgIGludCBjaGVja2VkID0gUGFnZUNoZWNrZWQocGFnZSk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKLSAgICBpbnQgYmhfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzLT5zX2Jsb2Nrc2l6ZTsKLSAgICB0aC50X3RyYW5zX2lkID0gMDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpbnQgZXJyb3IgPSAwOworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7CisJaW50IHBhcnRpYWwgPSAwOworCWludCBuciA9IDA7CisJaW50IGNoZWNrZWQgPSBQYWdlQ2hlY2tlZChwYWdlKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGlub2RlLT5pX3NiOworCWludCBiaF9wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIHMtPnNfYmxvY2tzaXplOworCXRoLnRfdHJhbnNfaWQgPSAwOwogCi0gICAgLyogVGhlIHBhZ2UgZGlydHkgYml0IGlzIGNsZWFyZWQgYmVmb3JlIHdyaXRlcGFnZSBpcyBjYWxsZWQsIHdoaWNoCi0gICAgICogbWVhbnMgd2UgaGF2ZSB0byB0ZWxsIGNyZWF0ZV9lbXB0eV9idWZmZXJzIHRvIG1ha2UgZGlydHkgYnVmZmVycwotICAgICAqIFRoZSBwYWdlIHJlYWxseSBzaG91bGQgYmUgdXAgdG8gZGF0ZSBhdCB0aGlzIHBvaW50LCBzbyB0b3NzaW5nCi0gICAgICogaW4gdGhlIEJIX1VwdG9kYXRlIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2suCi0gICAgICovCi0gICAgaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgcy0+c19ibG9ja3NpemUsCi0JICAgICAgICAgICAgICAgICAgICAoMSA8PCBCSF9EaXJ0eSkgfCAoMSA8PCBCSF9VcHRvZGF0ZSkpOwotICAgIH0KLSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsKLQotICAgIC8qIGxhc3QgcGFnZSBpbiB0aGUgZmlsZSwgemVybyBvdXQgYW55IGNvbnRlbnRzIHBhc3QgdGhlCi0gICAgKiogbGFzdCBieXRlIGluIHRoZSBmaWxlCi0gICAgKi8KLSAgICBpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KSB7Ci0JY2hhciAqa2FkZHI7Ci0JdW5zaWduZWQgbGFzdF9vZmZzZXQ7Ci0KLSAgICAgICAgbGFzdF9vZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKLQkvKiBubyBmaWxlIGNvbnRlbnRzIGluIHRoaXMgcGFnZSAqLwotCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXggKyAxIHx8ICFsYXN0X29mZnNldCkgewotICAgIAkgICAgdW5sb2NrX3BhZ2UocGFnZSk7Ci0JICAgIHJldHVybiAwOworCS8qIFRoZSBwYWdlIGRpcnR5IGJpdCBpcyBjbGVhcmVkIGJlZm9yZSB3cml0ZXBhZ2UgaXMgY2FsbGVkLCB3aGljaAorCSAqIG1lYW5zIHdlIGhhdmUgdG8gdGVsbCBjcmVhdGVfZW1wdHlfYnVmZmVycyB0byBtYWtlIGRpcnR5IGJ1ZmZlcnMKKwkgKiBUaGUgcGFnZSByZWFsbHkgc2hvdWxkIGJlIHVwIHRvIGRhdGUgYXQgdGhpcyBwb2ludCwgc28gdG9zc2luZworCSAqIGluIHRoZSBCSF9VcHRvZGF0ZSBpcyBqdXN0IGEgc2FuaXR5IGNoZWNrLgorCSAqLworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBzLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgICgxIDw8IEJIX0RpcnR5KSB8ICgxIDw8IEJIX1VwdG9kYXRlKSk7CiAJfQotCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCW1lbXNldChrYWRkciArIGxhc3Rfb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUtbGFzdF9vZmZzZXQpIDsKLQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKSA7Ci0Ja3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApIDsKLSAgICB9Ci0gICAgYmggPSBoZWFkIDsKLSAgICBibG9jayA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gcy0+c19ibG9ja3NpemVfYml0cykgOwotICAgIC8qIGZpcnN0IG1hcCBhbGwgdGhlIGJ1ZmZlcnMsIGxvZ2dpbmcgYW55IGRpcmVjdCBpdGVtcyB3ZSBmaW5kICovCi0gICAgZG8gewotCWlmICgoY2hlY2tlZCB8fCBidWZmZXJfZGlydHkoYmgpKSAmJiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8Ci0JICAgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkpKSB7Ci0JICAgIC8qIG5vdCBtYXBwZWQgeWV0LCBvciBpdCBwb2ludHMgdG8gYSBkaXJlY3QgaXRlbSwgc2VhcmNoCi0JICAgICAqIHRoZSBidHJlZSBmb3IgdGhlIG1hcHBpbmcgaW5mbywgYW5kIGxvZyBhbnkgZGlyZWN0Ci0JICAgICAqIGl0ZW1zIGZvdW5kCi0JICAgICAqLwotCSAgICBpZiAoKGVycm9yID0gbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2UoaW5vZGUsIGJoLCBibG9jaykpKSB7Ci0JCWdvdG8gZmFpbCA7Ci0JICAgIH0KLQl9Ci0gICAgICAgIGJoID0gYmgtPmJfdGhpc19wYWdlOwotCWJsb2NrKys7Ci0gICAgfSB3aGlsZShiaCAhPSBoZWFkKSA7CisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAotICAgIC8qCi0gICAgICogd2Ugc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlLAotICAgICAqIGJlY2F1c2UgaXQgY2FuIGNyZWF0ZSBob2xlcyBpbiB0aGUgZmlsZSAoYW4gdW5ib3VuZGVkIG9wZXJhdGlvbikuCi0gICAgICogc3RhcnRpbmcgaXQgaGVyZSwgd2UgY2FuIG1ha2UgYSByZWxpYWJsZSBlc3RpbWF0ZSBmb3IgaG93IG1hbnkKLSAgICAgKiBibG9ja3Mgd2UncmUgZ29pbmcgdG8gbG9nCi0gICAgICovCi0gICAgaWYgKGNoZWNrZWQpIHsKLQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOwotCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7Ci0JZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKLQlpZiAoZXJyb3IpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwotCSAgICBnb3RvIGZhaWw7CisJLyogbGFzdCBwYWdlIGluIHRoZSBmaWxlLCB6ZXJvIG91dCBhbnkgY29udGVudHMgcGFzdCB0aGUKKwkgKiogbGFzdCBieXRlIGluIHRoZSBmaWxlCisJICovCisJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgeworCQljaGFyICprYWRkcjsKKwkJdW5zaWduZWQgbGFzdF9vZmZzZXQ7CisKKwkJbGFzdF9vZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCQkvKiBubyBmaWxlIGNvbnRlbnRzIGluIHRoaXMgcGFnZSAqLworCQlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4ICsgMSB8fCAhbGFzdF9vZmZzZXQpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciArIGxhc3Rfb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBsYXN0X29mZnNldCk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7Ci0gICAgfQotICAgIC8qIG5vdyBnbyB0aHJvdWdoIGFuZCBsb2NrIGFueSBkaXJ0eSBidWZmZXJzIG9uIHRoZSBwYWdlICovCi0gICAgZG8gewotCWdldF9iaChiaCk7Ci0JaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKLQkgICAgY29udGludWU7Ci0JaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkKLQkgICAgY29udGludWU7CisJYmggPSBoZWFkOworCWJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBzLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkvKiBmaXJzdCBtYXAgYWxsIHRoZSBidWZmZXJzLCBsb2dnaW5nIGFueSBkaXJlY3QgaXRlbXMgd2UgZmluZCAqLworCWRvIHsKKwkJaWYgKChjaGVja2VkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpICYmICghYnVmZmVyX21hcHBlZChiaCkgfHwKKwkJCQkJCSAgICAgIChidWZmZXJfbWFwcGVkKGJoKQorCQkJCQkJICAgICAgICYmIGJoLT5iX2Jsb2NrbnIgPT0KKwkJCQkJCSAgICAgICAwKSkpIHsKKwkJCS8qIG5vdCBtYXBwZWQgeWV0LCBvciBpdCBwb2ludHMgdG8gYSBkaXJlY3QgaXRlbSwgc2VhcmNoCisJCQkgKiB0aGUgYnRyZWUgZm9yIHRoZSBtYXBwaW5nIGluZm8sIGFuZCBsb2cgYW55IGRpcmVjdAorCQkJICogaXRlbXMgZm91bmQKKwkJCSAqLworCQkJaWYgKChlcnJvciA9IG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlKGlub2RlLCBiaCwgYmxvY2spKSkgeworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJYmxvY2srKzsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCS8qCisJICogd2Ugc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlLAorCSAqIGJlY2F1c2UgaXQgY2FuIGNyZWF0ZSBob2xlcyBpbiB0aGUgZmlsZSAoYW4gdW5ib3VuZGVkIG9wZXJhdGlvbikuCisJICogc3RhcnRpbmcgaXQgaGVyZSwgd2UgY2FuIG1ha2UgYSByZWxpYWJsZSBlc3RpbWF0ZSBmb3IgaG93IG1hbnkKKwkgKiBibG9ja3Mgd2UncmUgZ29pbmcgdG8gbG9nCisJICovCisJaWYgKGNoZWNrZWQpIHsKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwkJZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwl9CisJLyogbm93IGdvIHRocm91Z2ggYW5kIGxvY2sgYW55IGRpcnR5IGJ1ZmZlcnMgb24gdGhlIHBhZ2UgKi8KKwlkbyB7CisJCWdldF9iaChiaCk7CisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpCisJCQljb250aW51ZTsKKwkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjaGVja2VkKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGZyb20gdGhpcyBwb2ludCBvbiwgd2Uga25vdyB0aGUgYnVmZmVyIGlzIG1hcHBlZCB0byBhCisJCSAqIHJlYWwgYmxvY2sgYW5kIG5vdCBhIGRpcmVjdCBpdGVtCisJCSAqLworCQlpZiAod2JjLT5zeW5jX21vZGUgIT0gV0JfU1lOQ19OT05FIHx8ICF3YmMtPm5vbmJsb2NraW5nKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCX0gZWxzZSB7CisJCQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCW1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKKwkJfSBlbHNlIHsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQl9CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKIAogCWlmIChjaGVja2VkKSB7Ci0JICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7Ci0JICAgIGNvbnRpbnVlOworCQllcnJvciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGZhaWw7CiAJfQotCS8qIGZyb20gdGhpcyBwb2ludCBvbiwgd2Uga25vdyB0aGUgYnVmZmVyIGlzIG1hcHBlZCB0byBhCi0JICogcmVhbCBibG9jayBhbmQgbm90IGEgZGlyZWN0IGl0ZW0KKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJLyoKKwkgKiBzaW5jZSBhbnkgYnVmZmVyIG1pZ2h0IGJlIHRoZSBvbmx5IGRpcnR5IGJ1ZmZlciBvbiB0aGUgcGFnZSwgCisJICogdGhlIGZpcnN0IHN1Ym1pdF9iaCBjYW4gYnJpbmcgdGhlIHBhZ2Ugb3V0IG9mIHdyaXRlYmFjay4KKwkgKiBiZSBjYXJlZnVsIHdpdGggdGhlIGJ1ZmZlcnMuCiAJICovCi0JaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSB8fCAhd2JjLT5ub25ibG9ja2luZykgewotCSAgICBsb2NrX2J1ZmZlcihiaCk7Ci0JfSBlbHNlIHsKLQkgICAgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7Ci0JCWNvbnRpbnVlOwotCSAgICB9Ci0JfQotCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKLQkgICAgbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOwotCX0gZWxzZSB7Ci0JICAgIHVubG9ja19idWZmZXIoYmgpOwotCX0KLSAgICB9IHdoaWxlKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7Ci0KLSAgICBpZiAoY2hlY2tlZCkgewotCWVycm9yID0gam91cm5hbF9lbmQoJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKLQlpZiAoZXJyb3IpCi0JICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gICAgQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwotICAgIHNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLSAgICB1bmxvY2tfcGFnZShwYWdlKTsKLQotICAgIC8qCi0gICAgICogc2luY2UgYW55IGJ1ZmZlciBtaWdodCBiZSB0aGUgb25seSBkaXJ0eSBidWZmZXIgb24gdGhlIHBhZ2UsIAotICAgICAqIHRoZSBmaXJzdCBzdWJtaXRfYmggY2FuIGJyaW5nIHRoZSBwYWdlIG91dCBvZiB3cml0ZWJhY2suCi0gICAgICogYmUgY2FyZWZ1bCB3aXRoIHRoZSBidWZmZXJzLgotICAgICAqLwotICAgIGRvIHsKLSAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOwotCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7Ci0JICAgIHN1Ym1pdF9iaChXUklURSwgYmgpOwotCSAgICBucisrOwotCX0KLQlwdXRfYmgoYmgpOwotCWJoID0gbmV4dDsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpOwotCi0gICAgZXJyb3IgPSAwOwotZG9uZToKLSAgICBpZiAobnIgPT0gMCkgewotICAgICAgICAvKgotICAgICAgICAgKiBpZiB0aGlzIHBhZ2Ugb25seSBoYWQgYSBkaXJlY3QgaXRlbSwgaXQgaXMgdmVyeSBwb3NzaWJsZSBmb3IKLSAgICAgICAgICogbm8gaW8gdG8gYmUgcmVxdWlyZWQgd2l0aG91dCB0aGVyZSBiZWluZyBhbiBlcnJvci4gIE9yLCAKLQkgKiBzb21lb25lIGVsc2UgY291bGQgaGF2ZSBsb2NrZWQgdGhlbSBhbmQgc2VudCB0aGVtIGRvd24gdGhlIAotCSAqIHBpcGUgd2l0aG91dCBsb2NraW5nIHRoZSBwYWdlCi0JICovCi0JYmggPSBoZWFkIDsKIAlkbyB7Ci0JICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewotCSAgICAgICAgcGFydGlhbCA9IDE7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJoID0gYmgtPmJfdGhpc19wYWdlOwotCX0gd2hpbGUoYmggIT0gaGVhZCk7Ci0JaWYgKCFwYXJ0aWFsKQotCSAgICBTZXRQYWdlVXB0b2RhdGUocGFnZSk7Ci0JZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkJCXN1Ym1pdF9iaChXUklURSwgYmgpOworCQkJbnIrKzsKKwkJfQorCQlwdXRfYmgoYmgpOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CiAKLWZhaWw6Ci0gICAgLyogY2F0Y2hlcyB2YXJpb3VzIGVycm9ycywgd2UgbmVlZCB0byBtYWtlIHN1cmUgYW55IHZhbGlkIGRpcnR5IGJsb2NrcwotICAgICAqIGdldCB0byB0aGUgbWVkaWEuICBUaGUgcGFnZSBpcyBjdXJyZW50bHkgbG9ja2VkIGFuZCBub3QgbWFya2VkIGZvciAKLSAgICAgKiB3cml0ZWJhY2sKLSAgICAgKi8KLSAgICBDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLSAgICBiaCA9IGhlYWQ7Ci0gICAgZG8gewotCWdldF9iaChiaCk7Ci0JaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJ1ZmZlcl9kaXJ0eShiaCkgJiYgYmgtPmJfYmxvY2tucikgewotCSAgICBsb2NrX2J1ZmZlcihiaCk7Ci0JICAgIG1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKLQl9IGVsc2UgewotCSAgICAvKgotCSAgICAgKiBjbGVhciBhbnkgZGlydHkgYml0cyB0aGF0IG1pZ2h0IGhhdmUgY29tZSBmcm9tIGdldHRpbmcKLQkgICAgICogYXR0YWNoZWQgdG8gYSBkaXJ0eSBwYWdlCi0JICAgICAqLwotCSAgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwllcnJvciA9IDA7CisgICAgICBkb25lOgorCWlmIChuciA9PSAwKSB7CisJCS8qCisJCSAqIGlmIHRoaXMgcGFnZSBvbmx5IGhhZCBhIGRpcmVjdCBpdGVtLCBpdCBpcyB2ZXJ5IHBvc3NpYmxlIGZvcgorCQkgKiBubyBpbyB0byBiZSByZXF1aXJlZCB3aXRob3V0IHRoZXJlIGJlaW5nIGFuIGVycm9yLiAgT3IsIAorCQkgKiBzb21lb25lIGVsc2UgY291bGQgaGF2ZSBsb2NrZWQgdGhlbSBhbmQgc2VudCB0aGVtIGRvd24gdGhlIAorCQkgKiBwaXBlIHdpdGhvdXQgbG9ja2luZyB0aGUgcGFnZQorCQkgKi8KKwkJYmggPSBoZWFkOworCQlkbyB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCQlwYXJ0aWFsID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwkJaWYgKCFwYXJ0aWFsKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CiAJfQotICAgICAgICBiaCA9IGJoLT5iX3RoaXNfcGFnZTsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpOwotICAgIFNldFBhZ2VFcnJvcihwYWdlKTsKLSAgICBCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7Ci0gICAgc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotICAgIHVubG9ja19wYWdlKHBhZ2UpOwotICAgIGRvIHsKLSAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOwotCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7Ci0JICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JICAgIHN1Ym1pdF9iaChXUklURSwgYmgpOwotCSAgICBucisrOwotCX0KLQlwdXRfYmgoYmgpOwotCWJoID0gbmV4dDsKLSAgICB9IHdoaWxlKGJoICE9IGhlYWQpOwotICAgIGdvdG8gZG9uZTsKKwlyZXR1cm4gZXJyb3I7CisKKyAgICAgIGZhaWw6CisJLyogY2F0Y2hlcyB2YXJpb3VzIGVycm9ycywgd2UgbmVlZCB0byBtYWtlIHN1cmUgYW55IHZhbGlkIGRpcnR5IGJsb2NrcworCSAqIGdldCB0byB0aGUgbWVkaWEuICBUaGUgcGFnZSBpcyBjdXJyZW50bHkgbG9ja2VkIGFuZCBub3QgbWFya2VkIGZvciAKKwkgKiB3cml0ZWJhY2sKKwkgKi8KKwlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwliaCA9IGhlYWQ7CisJZG8geworCQlnZXRfYmgoYmgpOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSAmJiBiaC0+Yl9ibG9ja25yKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogY2xlYXIgYW55IGRpcnR5IGJpdHMgdGhhdCBtaWdodCBoYXZlIGNvbWUgZnJvbSBnZXR0aW5nCisJCQkgKiBhdHRhY2hlZCB0byBhIGRpcnR5IHBhZ2UKKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlkbyB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCW5yKys7CisJCX0KKwkJcHV0X2JoKGJoKTsKKwkJYmggPSBuZXh0OworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCWdvdG8gZG9uZTsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRwYWdlIChzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKiBwYWdlKQorc3RhdGljIGludCByZWlzZXJmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0gICAgcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlIChwYWdlLCByZWlzZXJmc19nZXRfYmxvY2spOworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCByZWlzZXJmc19nZXRfYmxvY2spOwogfQogCi0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVwYWdlIChzdHJ1Y3QgcGFnZSAqIHBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQorc3RhdGljIGludCByZWlzZXJmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKSA7Ci0gICAgcmV0dXJuIHJlaXNlcmZzX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCB3YmMpIDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlyZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gcmVpc2VyZnNfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIHdiYyk7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICBpbnQgcmV0OwotICAgIGludCBvbGRfcmVmID0gMDsKLQotICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpIDsKLSAgICBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHBhZ2UpIDsKLSAgICBpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKLQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsKLQl0aCA9IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICopY3VycmVudC0+am91cm5hbF9pbmZvOwotICAgICAgICBCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7Ci0gICAgICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLQlvbGRfcmVmID0gdGgtPnRfcmVmY291bnQ7Ci0JdGgtPnRfcmVmY291bnQrKzsKLSAgICB9Ci0KLSAgICByZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCByZWlzZXJmc19nZXRfYmxvY2spIDsKLSAgICBpZiAocmV0ICYmIHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7Ci0gICAgCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwotCS8qIHRoaXMgZ2V0cyBhIGxpdHRsZSB1Z2x5LiAgSWYgcmVpc2VyZnNfZ2V0X2Jsb2NrIHJldHVybmVkIGFuCi0JICogZXJyb3IgYW5kIGxlZnQgYSB0cmFuc2Fjc3Rpb24gcnVubmluZywgd2UndmUgZ290IHRvIGNsb3NlIGl0LAotCSAqIGFuZCB3ZSd2ZSBnb3QgdG8gZnJlZSBoYW5kbGUgaWYgaXQgd2FzIGEgcGVyc2lzdGVudCB0cmFuc2FjdGlvbi4KLQkgKgotCSAqIEJ1dCwgaWYgd2UgaGFkIG5lc3RlZCBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLCB3ZSBuZWVkCi0JICogdG8ganVzdCBkcm9wIHRoZSByZWYgY291bnQgb24gdGhlIGhhbmRsZS4KLQkgKgotCSAqIElmIG9sZF9yZWYgPT0gMCwgdGhlIHRyYW5zYWN0aW9uIGlzIGZyb20gcmVpc2VyZnNfZ2V0X2Jsb2NrLAotCSAqIGFuZCBpdCB3YXMgYSBwZXJzaXN0ZW50IHRyYW5zLiAgT3RoZXJ3aXNlLCBpdCB3YXMgbmVzdGVkIGFib3ZlLgotCSAqLwotCWlmICh0aC0+dF9yZWZjb3VudCA+IG9sZF9yZWYpIHsKLQkgICAgaWYgKG9sZF9yZWYpCi0JICAgIAl0aC0+dF9yZWZjb3VudC0tOwotCSAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyOwotCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQkJZXJyID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOwotCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IGVycjsKLQkgICAgfQotCX0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLQotfQotCi0KLXN0YXRpYyBzZWN0b3JfdCByZWlzZXJmc19hb3BfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYXMsIHNlY3Rvcl90IGJsb2NrKSB7Ci0gIHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAoYXMsIGJsb2NrLCByZWlzZXJmc19ibWFwKSA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICBsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpbnQgdXBkYXRlX3NkID0gMDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7Ci0gICAgCi0gICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhpbm9kZS0+aV9zYikgOwotICAgIGlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgewotICAgICAgICB0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKLSAgICB9Ci0gICAgcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKLSAKLSAgICAvKiBnZW5lcmljX2NvbW1pdF93cml0ZSBkb2VzIHRoaXMgZm9yIHVzLCBidXQgZG9lcyBub3QgdXBkYXRlIHRoZQotICAgICoqIHRyYW5zYWN0aW9uIHRyYWNraW5nIHN0dWZmIHdoZW4gdGhlIHNpemUgY2hhbmdlcy4gIFNvLCB3ZSBoYXZlCi0gICAgKiogdG8gZG8gdGhlIGlfc2l6ZSB1cGRhdGVzIGhlcmUuCi0gICAgKi8KLSAgICBpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgewotCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7Ci0JcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7Ci0JLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBiZXlvbmQgdGhlIGJvcmRlciB3aGVyZSBpdAotCSAgIGNhbiBoYXZlIGEgdGFpbCwgdW5tYXJrIGl0IGFzIG5lZWRpbmcgYSB0YWlsCi0JICAgcGFja2luZyAqLwotCWlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKLQkgICAgIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKLQkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKLQotCXJldCA9IGpvdXJuYWxfYmVnaW4oJm15dGgsIGlub2RlLT5pX3NiLCAxKSA7Ci0JaWYgKHJldCkgewotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCSAgICBnb3RvIGpvdXJuYWxfZXJyb3I7Ci0JfQotCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotCWlub2RlLT5pX3NpemUgPSBwb3MgOwotCXJlaXNlcmZzX3VwZGF0ZV9zZCgmbXl0aCwgaW5vZGUpIDsKLQl1cGRhdGVfc2QgPSAxOwotCXJldCA9IGpvdXJuYWxfZW5kKCZteXRoLCBpbm9kZS0+aV9zYiwgMSkgOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0JaWYgKHJldCkKLQkgICAgZ290byBqb3VybmFsX2Vycm9yOwotICAgIH0KLSAgICBpZiAodGgpIHsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLQlpZiAoIXVwZGF0ZV9zZCkKLQkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOwotCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotCWlmIChyZXQpCi0JICAgIGdvdG8gb3V0OwotICAgIH0KLSAKLSAgICAvKiB3ZSB0ZXN0IGZvciBPX1NZTkMgaGVyZSBzbyB3ZSBjYW4gY29tbWl0IHRoZSB0cmFuc2FjdGlvbgotICAgICoqIGZvciBhbnkgcGFja2VkIHRhaWxzIHRoZSBmaWxlIG1pZ2h0IGhhdmUgaGFkCi0gICAgKi8KLSAgICBpZiAoZiAmJiAoZi0+Zl9mbGFncyAmIE9fU1lOQykpIHsKLQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAJcmV0ID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSkgOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgfQotb3V0OgotICAgIHJldHVybiByZXQgOwotCi1qb3VybmFsX2Vycm9yOgotICAgIGlmICh0aCkgewotCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwotCWlmICghdXBkYXRlX3NkKQotCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7Ci0gICAgICAgIHJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKLQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyggX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUgKQorCQkJCSAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCiB7Ci0JaWYoIHJlaXNlcmZzX2F0dHJzKCBpbm9kZSAtPiBpX3NiICkgKSB7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX1NZTkNfRkwgKQotCQkJaW5vZGUgLT4gaV9mbGFncyB8PSBTX1NZTkM7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50IHJldDsKKwlpbnQgb2xkX3JlZiA9IDA7CisKKwlyZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKGlub2RlLT5pX3NiKTsKKwlmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHBhZ2UpOworCWlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsKKwkJdGggPSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqKWN1cnJlbnQtPgorCQkgICAgam91cm5hbF9pbmZvOworCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKKwkJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJCW9sZF9yZWYgPSB0aC0+dF9yZWZjb3VudDsKKwkJdGgtPnRfcmVmY291bnQrKzsKKwl9CisKKwlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCByZWlzZXJmc19nZXRfYmxvY2spOworCWlmIChyZXQgJiYgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKKwkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJCS8qIHRoaXMgZ2V0cyBhIGxpdHRsZSB1Z2x5LiAgSWYgcmVpc2VyZnNfZ2V0X2Jsb2NrIHJldHVybmVkIGFuCisJCSAqIGVycm9yIGFuZCBsZWZ0IGEgdHJhbnNhY3N0aW9uIHJ1bm5pbmcsIHdlJ3ZlIGdvdCB0byBjbG9zZSBpdCwKKwkJICogYW5kIHdlJ3ZlIGdvdCB0byBmcmVlIGhhbmRsZSBpZiBpdCB3YXMgYSBwZXJzaXN0ZW50IHRyYW5zYWN0aW9uLgorCQkgKgorCQkgKiBCdXQsIGlmIHdlIGhhZCBuZXN0ZWQgaW50byBhbiBleGlzdGluZyB0cmFuc2FjdGlvbiwgd2UgbmVlZAorCQkgKiB0byBqdXN0IGRyb3AgdGhlIHJlZiBjb3VudCBvbiB0aGUgaGFuZGxlLgorCQkgKgorCQkgKiBJZiBvbGRfcmVmID09IDAsIHRoZSB0cmFuc2FjdGlvbiBpcyBmcm9tIHJlaXNlcmZzX2dldF9ibG9jaywKKwkJICogYW5kIGl0IHdhcyBhIHBlcnNpc3RlbnQgdHJhbnMuICBPdGhlcndpc2UsIGl0IHdhcyBuZXN0ZWQgYWJvdmUuCisJCSAqLworCQlpZiAodGgtPnRfcmVmY291bnQgPiBvbGRfcmVmKSB7CisJCQlpZiAob2xkX3JlZikKKwkJCQl0aC0+dF9yZWZjb3VudC0tOworCQkJZWxzZSB7CisJCQkJaW50IGVycjsKKwkJCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJCQllcnIgPSByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbih0aCk7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXQgPSBlcnI7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgc2VjdG9yX3QgcmVpc2VyZnNfYW9wX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmFzLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKGFzLCBibG9jaywgcmVpc2VyZnNfYm1hcCk7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IHBvcyA9ICgobG9mZl90KSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHRvOworCWludCByZXQgPSAwOworCWludCB1cGRhdGVfc2QgPSAwOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gTlVMTDsKKworCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpOworCWlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworCQl0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwl9CisJcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKKworCS8qIGdlbmVyaWNfY29tbWl0X3dyaXRlIGRvZXMgdGhpcyBmb3IgdXMsIGJ1dCBkb2VzIG5vdCB1cGRhdGUgdGhlCisJICoqIHRyYW5zYWN0aW9uIHRyYWNraW5nIHN0dWZmIHdoZW4gdGhlIHNpemUgY2hhbmdlcy4gIFNvLCB3ZSBoYXZlCisJICoqIHRvIGRvIHRoZSBpX3NpemUgdXBkYXRlcyBoZXJlLgorCSAqLworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CisJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aDsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCS8qIElmIHRoZSBmaWxlIGhhdmUgZ3Jvd24gYmV5b25kIHRoZSBib3JkZXIgd2hlcmUgaXQKKwkJICAgY2FuIGhhdmUgYSB0YWlsLCB1bm1hcmsgaXQgYXMgbmVlZGluZyBhIHRhaWwKKwkJICAgcGFja2luZyAqLworCQlpZiAoKGhhdmVfbGFyZ2VfdGFpbHMoaW5vZGUtPmlfc2IpCisJCSAgICAgJiYgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkgKiA0KQorCQkgICAgfHwgKGhhdmVfc21hbGxfdGFpbHMoaW5vZGUtPmlfc2IpCisJCQkmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplKGlub2RlKSkpCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7CisKKwkJcmV0ID0gam91cm5hbF9iZWdpbigmbXl0aCwgaW5vZGUtPmlfc2IsIDEpOworCQlpZiAocmV0KSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQkJZ290byBqb3VybmFsX2Vycm9yOworCQl9CisJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJCWlub2RlLT5pX3NpemUgPSBwb3M7CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmbXl0aCwgaW5vZGUpOworCQl1cGRhdGVfc2QgPSAxOworCQlyZXQgPSBqb3VybmFsX2VuZCgmbXl0aCwgaW5vZGUtPmlfc2IsIDEpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCQlpZiAocmV0KQorCQkJZ290byBqb3VybmFsX2Vycm9yOworCX0KKwlpZiAodGgpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghdXBkYXRlX3NkKQorCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIHdlIHRlc3QgZm9yIE9fU1lOQyBoZXJlIHNvIHdlIGNhbiBjb21taXQgdGhlIHRyYW5zYWN0aW9uCisJICoqIGZvciBhbnkgcGFja2VkIHRhaWxzIHRoZSBmaWxlIG1pZ2h0IGhhdmUgaGFkCisJICovCisJaWYgKGYgJiYgKGYtPmZfZmxhZ3MgJiBPX1NZTkMpKSB7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCQlyZXQgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisgICAgICBvdXQ6CisJcmV0dXJuIHJldDsKKworICAgICAgam91cm5hbF9lcnJvcjoKKwlpZiAodGgpIHsKKwkJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJCWlmICghdXBkYXRlX3NkKQorCQkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7CisJCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHNkX2F0dHJzX3RvX2lfYXR0cnMoX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKHJlaXNlcmZzX2F0dHJzKGlub2RlLT5pX3NiKSkgeworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19TWU5DX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TWU5DOwogCQllbHNlCi0JCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX1NZTkM7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCApCi0JCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfU1lOQzsKKwkJaWYgKHNkX2F0dHJzICYgUkVJU0VSRlNfSU1NVVRBQkxFX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJCWVsc2UKLQkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOwotCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19BUFBFTkRfRkwgKQotCQkJaW5vZGUgLT4gaV9mbGFncyB8PSBTX0FQUEVORDsKKwkJCWlub2RlLT5pX2ZsYWdzICY9IH5TX0lNTVVUQUJMRTsKKwkJaWYgKHNkX2F0dHJzICYgUkVJU0VSRlNfQVBQRU5EX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CiAJCWVsc2UKLQkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfQVBQRU5EOwotCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19OT0FUSU1FX0ZMICkKLQkJCWlub2RlIC0+IGlfZmxhZ3MgfD0gU19OT0FUSU1FOworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfQVBQRU5EOworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19OT0FUSU1FX0ZMKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOwogCQllbHNlCi0JCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX05PQVRJTUU7Ci0JCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX05PVEFJTF9GTCApCisJCQlpbm9kZS0+aV9mbGFncyAmPSB+U19OT0FUSU1FOworCQlpZiAoc2RfYXR0cnMgJiBSRUlTRVJGU19OT1RBSUxfRkwpCiAJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwogCQllbHNlCiAJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9ub3BhY2tfbWFzazsKIAl9CiB9CiAKLXZvaWQgaV9hdHRyc190b19zZF9hdHRycyggc3RydWN0IGlub2RlICppbm9kZSwgX191MTYgKnNkX2F0dHJzICkKK3ZvaWQgaV9hdHRyc190b19zZF9hdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UxNiAqIHNkX2F0dHJzKQogewotCWlmKCByZWlzZXJmc19hdHRycyggaW5vZGUgLT4gaV9zYiApICkgewotCQlpZiggaW5vZGUgLT4gaV9mbGFncyAmIFNfSU1NVVRBQkxFICkKKwlpZiAocmVpc2VyZnNfYXR0cnMoaW5vZGUtPmlfc2IpKSB7CisJCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfSU1NVVRBQkxFKQogCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX0lNTVVUQUJMRV9GTDsKIAkJZWxzZQogCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19JTU1VVEFCTEVfRkw7Ci0JCWlmKCBpbm9kZSAtPiBpX2ZsYWdzICYgU19TWU5DICkKKwkJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19TWU5DKQogCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX1NZTkNfRkw7CiAJCWVsc2UKIAkJCSpzZF9hdHRycyAmPSB+UkVJU0VSRlNfU1lOQ19GTDsKLQkJaWYoIGlub2RlIC0+IGlfZmxhZ3MgJiBTX05PQVRJTUUgKQorCQlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX05PQVRJTUUpCiAJCQkqc2RfYXR0cnMgfD0gUkVJU0VSRlNfTk9BVElNRV9GTDsKIAkJZWxzZQogCQkJKnNkX2F0dHJzICY9IH5SRUlTRVJGU19OT0FUSU1FX0ZMOwotCQlpZiggUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrICkKKwkJaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykKIAkJCSpzZF9hdHRycyB8PSBSRUlTRVJGU19OT1RBSUxfRkw7CiAJCWVsc2UKIAkJCSpzZF9hdHRycyAmPSB+UkVJU0VSRlNfTk9UQUlMX0ZMOwpAQCAtMjU5NCwxMDYgKzI3MjAsMTA3IEBACiAqLwogc3RhdGljIGludCBpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIGludCByZXQgPSAxIDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpIDsKKwlpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOwogCi0gICAgc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOwotICAgIGlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKLSAgICAgICAgZ290byBmcmVlX2poOwotICAgIH0KLSAgICAvKiB0aGUgcGFnZSBpcyBsb2NrZWQsIGFuZCB0aGUgb25seSBwbGFjZXMgdGhhdCBsb2cgYSBkYXRhIGJ1ZmZlcgotICAgICAqIGFsc28gbG9jayB0aGUgcGFnZS4KLSAgICAgKi8KLSAgICBpZiAocmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSkpIHsKLQkvKgotCSAqIHZlcnkgY29uc2VydmF0aXZlLCBsZWF2ZSB0aGUgYnVmZmVyIHBpbm5lZCBpZgotCSAqIGFueW9uZSBtaWdodCBuZWVkIGl0LgotCSAqLwotICAgICAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7Ci0JICAgIHJldCA9IDAgOworCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJZ290byBmcmVlX2poOwogCX0KLSAgICB9IGVsc2UKLSAgICBpZiAoYnVmZmVyX2RpcnR5KGJoKSB8fCBidWZmZXJfbG9ja2VkKGJoKSkgewotCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotCXN0cnVjdCByZWlzZXJmc19qaCAqamggPSBiaC0+Yl9wcml2YXRlOwotCi0JLyogd2h5IGlzIHRoaXMgc2FmZT8KLQkgKiByZWlzZXJmc19zZXRhdHRyIHVwZGF0ZXMgaV9zaXplIGluIHRoZSBvbiBkaXNrCi0JICogc3RhdCBkYXRhIGJlZm9yZSBhbGxvd2luZyB2bXRydW5jYXRlIHRvIGJlIGNhbGxlZC4KLQkgKgotCSAqIElmIGJ1ZmZlciB3YXMgcHV0IG9udG8gdGhlIG9yZGVyZWQgbGlzdCBmb3IgdGhpcwotCSAqIHRyYW5zYWN0aW9uLCB3ZSBrbm93IGZvciBzdXJlIGVpdGhlciB0aGlzIHRyYW5zYWN0aW9uCi0JICogb3IgYW4gb2xkZXIgb25lIGFscmVhZHkgaGFzIHVwZGF0ZWQgaV9zaXplIG9uIGRpc2ssCi0JICogYW5kIHRoaXMgb3JkZXJlZCBkYXRhIHdvbid0IGJlIHJlZmVyZW5jZWQgaW4gdGhlIGZpbGUKLQkgKiBpZiB3ZSBjcmFzaC4KLQkgKgotCSAqIGlmIHRoZSBidWZmZXIgd2FzIHB1dCBvbnRvIHRoZSBvcmRlcmVkIGxpc3QgZm9yIGFuIG9sZGVyCi0JICogdHJhbnNhY3Rpb24sIHdlIG5lZWQgdG8gbGVhdmUgaXQgYXJvdW5kCisJLyogdGhlIHBhZ2UgaXMgbG9ja2VkLCBhbmQgdGhlIG9ubHkgcGxhY2VzIHRoYXQgbG9nIGEgZGF0YSBidWZmZXIKKwkgKiBhbHNvIGxvY2sgdGhlIHBhZ2UuCiAJICovCi0JaWYgKGpoICYmIChqbCA9IGpoLT5qbCkgJiYgamwgIT0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfY3VycmVudF9qbCkKLQkgICAgcmV0ID0gMDsKLSAgICB9Ci1mcmVlX2poOgotICAgIGlmIChyZXQgJiYgYmgtPmJfcHJpdmF0ZSkgewotICAgICAgICByZWlzZXJmc19mcmVlX2poKGJoKTsKLSAgICB9Ci0gICAgc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7Ci0gICAgcmV0dXJuIHJldCA7CisJaWYgKHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coaW5vZGUpKSB7CisJCS8qCisJCSAqIHZlcnkgY29uc2VydmF0aXZlLCBsZWF2ZSB0aGUgYnVmZmVyIHBpbm5lZCBpZgorCQkgKiBhbnlvbmUgbWlnaHQgbmVlZCBpdC4KKwkJICovCisJCWlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJCXJldCA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgfHwgYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJCXN0cnVjdCByZWlzZXJmc19qaCAqamggPSBiaC0+Yl9wcml2YXRlOworCisJCS8qIHdoeSBpcyB0aGlzIHNhZmU/CisJCSAqIHJlaXNlcmZzX3NldGF0dHIgdXBkYXRlcyBpX3NpemUgaW4gdGhlIG9uIGRpc2sKKwkJICogc3RhdCBkYXRhIGJlZm9yZSBhbGxvd2luZyB2bXRydW5jYXRlIHRvIGJlIGNhbGxlZC4KKwkJICoKKwkJICogSWYgYnVmZmVyIHdhcyBwdXQgb250byB0aGUgb3JkZXJlZCBsaXN0IGZvciB0aGlzCisJCSAqIHRyYW5zYWN0aW9uLCB3ZSBrbm93IGZvciBzdXJlIGVpdGhlciB0aGlzIHRyYW5zYWN0aW9uCisJCSAqIG9yIGFuIG9sZGVyIG9uZSBhbHJlYWR5IGhhcyB1cGRhdGVkIGlfc2l6ZSBvbiBkaXNrLAorCQkgKiBhbmQgdGhpcyBvcmRlcmVkIGRhdGEgd29uJ3QgYmUgcmVmZXJlbmNlZCBpbiB0aGUgZmlsZQorCQkgKiBpZiB3ZSBjcmFzaC4KKwkJICoKKwkJICogaWYgdGhlIGJ1ZmZlciB3YXMgcHV0IG9udG8gdGhlIG9yZGVyZWQgbGlzdCBmb3IgYW4gb2xkZXIKKwkJICogdHJhbnNhY3Rpb24sIHdlIG5lZWQgdG8gbGVhdmUgaXQgYXJvdW5kCisJCSAqLworCQlpZiAoamggJiYgKGpsID0gamgtPmpsKQorCQkgICAgJiYgamwgIT0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfY3VycmVudF9qbCkKKwkJCXJldCA9IDA7CisJfQorICAgICAgZnJlZV9qaDoKKwlpZiAocmV0ICYmIGJoLT5iX3ByaXZhdGUpIHsKKwkJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJfQorCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogY2xtIC0tIHRha2VuIGZyb20gZnMvYnVmZmVyLmM6YmxvY2tfaW52YWxpZGF0ZV9wYWdlICovCiBzdGF0aWMgaW50IHJlaXNlcmZzX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0gICAgdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKLSAgICBpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgcmV0ID0gMTsKIAotICAgIEJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAotICAgIGlmIChvZmZzZXQgPT0gMCkKLQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCWlmIChvZmZzZXQgPT0gMCkKKwkJQ2xlYXJQYWdlQ2hlY2tlZChwYWdlKTsKIAotICAgIGlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKLQlnb3RvIG91dDsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWdvdG8gb3V0OwogCi0gICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKLSAgICBiaCA9IGhlYWQ7Ci0gICAgZG8gewotCXVuc2lnbmVkIGludCBuZXh0X29mZiA9IGN1cnJfb2ZmICsgYmgtPmJfc2l6ZTsKLQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCS8qCisJCSAqIGlzIHRoaXMgYmxvY2sgZnVsbHkgaW52YWxpZGF0ZWQ/CisJCSAqLworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7CisJCQlpZiAoaW52YWxpZGF0ZXBhZ2VfY2FuX2Ryb3AoaW5vZGUsIGJoKSkKKwkJCQlyZWlzZXJmc191bm1hcF9idWZmZXIoYmgpOworCQkJZWxzZQorCQkJCXJldCA9IDA7CisJCX0KKwkJY3Vycl9vZmYgPSBuZXh0X29mZjsKKwkJYmggPSBuZXh0OworCX0gd2hpbGUgKGJoICE9IGhlYWQpOwogCiAJLyoKLQkgKiBpcyB0aGlzIGJsb2NrIGZ1bGx5IGludmFsaWRhdGVkPworCSAqIFdlIHJlbGVhc2UgYnVmZmVycyBvbmx5IGlmIHRoZSBlbnRpcmUgcGFnZSBpcyBiZWluZyBpbnZhbGlkYXRlZC4KKwkgKiBUaGUgZ2V0X2Jsb2NrIGNhY2hlZCB2YWx1ZSBoYXMgYmVlbiB1bmNvbmRpdGlvbmFsbHkgaW52YWxpZGF0ZWQsCisJICogc28gcmVhbCBJTyBpcyBub3QgcG9zc2libGUgYW55bW9yZS4KIAkgKi8KLQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7Ci0JICAgIGlmIChpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChpbm9kZSwgYmgpKQotCQlyZWlzZXJmc191bm1hcF9idWZmZXIoYmgpOwotCSAgICBlbHNlCi0JICAgICAgICByZXQgPSAwOwotCX0KLQljdXJyX29mZiA9IG5leHRfb2ZmOwotCWJoID0gbmV4dDsKLSAgICB9IHdoaWxlIChiaCAhPSBoZWFkKTsKLQotICAgIC8qCi0gICAgICogV2UgcmVsZWFzZSBidWZmZXJzIG9ubHkgaWYgdGhlIGVudGlyZSBwYWdlIGlzIGJlaW5nIGludmFsaWRhdGVkLgotICAgICAqIFRoZSBnZXRfYmxvY2sgY2FjaGVkIHZhbHVlIGhhcyBiZWVuIHVuY29uZGl0aW9uYWxseSBpbnZhbGlkYXRlZCwKLSAgICAgKiBzbyByZWFsIElPIGlzIG5vdCBwb3NzaWJsZSBhbnltb3JlLgotICAgICAqLwotICAgIGlmICghb2Zmc2V0ICYmIHJldCkKLQlyZXQgPSB0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotb3V0OgotICAgIHJldHVybiByZXQ7CisJaWYgKCFvZmZzZXQgJiYgcmV0KQorCQlyZXQgPSB0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIDApOworICAgICAgb3V0OgorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKLSAgICBpZiAocmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSkpIHsKLQlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKLQlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMocGFnZSk7Ci0gICAgfQotICAgIHJldHVybiBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMocGFnZSk7CitzdGF0aWMgaW50IHJlaXNlcmZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWlmIChyZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKSkgeworCQlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKKwkJcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOworCX0KKwlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKHBhZ2UpOwogfQogCiAvKgpAQCAtMjcwNywxNDAgKzI4MzQsMTUyIEBACiAgKi8KIHN0YXRpYyBpbnQgcmVpc2VyZnNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB1bnVzZWRfZ2ZwX2ZsYWdzKQogewotICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICAgIGludCByZXQgPSAxIDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQgPSAxOwogCi0gICAgV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7Ci0gICAgc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOwotICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOwotICAgIGJoID0gaGVhZCA7Ci0gICAgZG8gewotCWlmIChiaC0+Yl9wcml2YXRlKSB7Ci0JICAgIGlmICghYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkJcmVpc2VyZnNfZnJlZV9qaChiaCk7Ci0JICAgIH0gZWxzZSB7Ci0JCXJldCA9IDAgOwotCQlicmVhayA7Ci0JICAgIH0KLQl9Ci0JYmggPSBiaC0+Yl90aGlzX3BhZ2UgOwotICAgIH0gd2hpbGUgKGJoICE9IGhlYWQpIDsKLSAgICBpZiAocmV0KQotCXJldCA9IHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkgOwotICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOwotICAgIHJldHVybiByZXQgOworCVdBUk5fT04oUGFnZUNoZWNrZWQocGFnZSkpOworCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJoLT5iX3ByaXZhdGUpIHsKKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlpZiAocmV0KQorCQlyZXQgPSB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogV2UgdGhhbmsgTWluZ21pbmcgQ2FvIGZvciBoZWxwaW5nIHVzIHVuZGVyc3RhbmQgaW4gZ3JlYXQgZGV0YWlsIHdoYXQKICAgIHRvIGRvIGluIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZS4gKi8KIHN0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKKwkJCQkgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQogewotICAgIHN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwogCi0gICAgcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKLQkJCW9mZnNldCwgbnJfc2VncywgcmVpc2VyZnNfZ2V0X2Jsb2Nrc19kaXJlY3RfaW8sIE5VTEwpOworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsCisJCQkJICByZWlzZXJmc19nZXRfYmxvY2tzX2RpcmVjdF9pbywgTlVMTCk7CiB9CiAKLWludCByZWlzZXJmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKSB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZSA7Ci0gICAgaW50IGVycm9yIDsKLSAgICB1bnNpZ25lZCBpbnQgaWFfdmFsaWQgPSBhdHRyLT5pYV92YWxpZDsKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKLQkvKiB2ZXJzaW9uIDIgaXRlbXMgd2lsbCBiZSBjYXVnaHQgYnkgdGhlIHNfbWF4Ynl0ZXMgY2hlY2sKLQkqKiBkb25lIGZvciB1cyBpbiB2bXRydW5jYXRlCi0JKi8KLQlpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpID09IEtFWV9GT1JNQVRfM181ICYmCi0JICAgIGF0dHItPmlhX3NpemUgPiBNQVhfTk9OX0xGUykgewotCSAgICBlcnJvciA9IC1FRkJJRyA7Ci0JICAgIGdvdG8gb3V0OwotCX0KLQkvKiBmaWxsIGluIGhvbGUgcG9pbnRlcnMgaW4gdGhlIGV4cGFuZGluZyB0cnVuY2F0ZSBjYXNlLiAqLwotICAgICAgICBpZiAoYXR0ci0+aWFfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKLQkgICAgZXJyb3IgPSBnZW5lcmljX2NvbnRfZXhwYW5kKGlub2RlLCBhdHRyLT5pYV9zaXplKSA7Ci0JICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCA+IDApIHsKLQkJaW50IGVycjsKLQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0JCS8qIHdlJ3JlIGNoYW5naW5nIGF0IG1vc3QgMiBiaXRtYXBzLCBpbm9kZSArIHN1cGVyICovCi0JCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgNCkgOwotCQlpZiAoIWVycikgewotCQkgICAgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoJnRoLCBpbm9kZSk7Ci0JCSAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCA0KSA7Ci0JCX0KLQkJaWYgKGVycikKLQkJICAgIGVycm9yID0gZXJyOwotCSAgICB9Ci0JICAgIGlmIChlcnJvcikKLQkgICAgICAgIGdvdG8gb3V0OwotCX0KLSAgICB9Ci0KLSAgICBpZiAoKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYgKGF0dHItPmlhX3VpZCAmIH4weGZmZmYpKSB8fAotCSAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmIChhdHRyLT5pYV9naWQgJiB+MHhmZmZmKSkpICYmCi0JKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKSkgewotCQkvKiBzdGF0IGRhdGEgb2YgZm9ybWF0IHYzLjUgaGFzIDE2IGJpdCB1aWQgYW5kIGdpZCAqLwotCSAgICBlcnJvciA9IC1FSU5WQUw7Ci0JICAgIGdvdG8gb3V0OwotCX0KLQotICAgIGVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKSA7Ci0gICAgaWYgKCFlcnJvcikgewotCWlmICgoaWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBhdHRyLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkKSB8fAotCSAgICAoaWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgewotICAgICAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfY2hvd25feGF0dHJzIChpbm9kZSwgYXR0cik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7Ci0JCSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotCi0JCSAgICAvKiAodXNlcitncm91cCkqKG9sZCtuZXcpIHN0cnVjdHVyZSAtIHdlIGNvdW50IHF1b3RhIGluZm8gYW5kICwgaW5vZGUgd3JpdGUgKHNiLCBpbm9kZSkgKi8KLQkJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgNCpSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUysyKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBEUVVPVF9UUkFOU0ZFUihpbm9kZSwgYXR0cikgPyAtRURRVU9UIDogMDsKLQkJICAgIGlmIChlcnJvcikgewotCQkJam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgNCpSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUysyKTsKK2ludCByZWlzZXJmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQkvKiB2ZXJzaW9uIDIgaXRlbXMgd2lsbCBiZSBjYXVnaHQgYnkgdGhlIHNfbWF4Ynl0ZXMgY2hlY2sKKwkJICoqIGRvbmUgZm9yIHVzIGluIHZtdHJ1bmNhdGUKKwkJICovCisJCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUgJiYKKwkJICAgIGF0dHItPmlhX3NpemUgPiBNQVhfTk9OX0xGUykgeworCQkJZXJyb3IgPSAtRUZCSUc7CiAJCQlnb3RvIG91dDsKLQkJICAgIH0KLQkJICAgIC8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCi0JCSAgICAgKiBvbmUgdHJhbnNhY3Rpb24gKi8KLQkJICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKQotCQkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOwotCQkgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCi0JCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7Ci0JCSAgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDQqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrMik7CiAJCX0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWVycm9yKQotICAgICAgICAgICAgZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKSA7Ci0gICAgfQorCQkvKiBmaWxsIGluIGhvbGUgcG9pbnRlcnMgaW4gdGhlIGV4cGFuZGluZyB0cnVuY2F0ZSBjYXNlLiAqLworCQlpZiAoYXR0ci0+aWFfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKKwkJCWVycm9yID0gZ2VuZXJpY19jb250X2V4cGFuZChpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisJCQlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7CisJCQkJaW50IGVycjsKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCQkJCS8qIHdlJ3JlIGNoYW5naW5nIGF0IG1vc3QgMiBiaXRtYXBzLCBpbm9kZSArIHN1cGVyICovCisJCQkJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCA0KTsKKwkJCQlpZiAoIWVycikgeworCQkJCQlyZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKCZ0aCwgaW5vZGUpOworCQkJCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCA0KTsKKwkJCQl9CisJCQkJaWYgKGVycikKKwkJCQkJZXJyb3IgPSBlcnI7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CiAKKwlpZiAoKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYgKGF0dHItPmlhX3VpZCAmIH4weGZmZmYpKSB8fAorCSAgICAgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSAmJiAoYXR0ci0+aWFfZ2lkICYgfjB4ZmZmZikpKSAmJgorCSAgICAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSkpIHsKKwkJLyogc3RhdCBkYXRhIG9mIGZvcm1hdCB2My41IGhhcyAxNiBiaXQgdWlkIGFuZCBnaWQgKi8KKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBpZiAoIWVycm9yICYmIHJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpIHsKLSAgICAgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKQotICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19hY2xfY2htb2QgKGlub2RlKTsKLSAgICB9CisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmICghZXJyb3IpIHsKKwkJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJCSAgICAoaWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgeworCQkJZXJyb3IgPSByZWlzZXJmc19jaG93bl94YXR0cnMoaW5vZGUsIGF0dHIpOwogCi1vdXQ6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKLSAgICByZXR1cm4gZXJyb3IgOworCQkJaWYgKCFlcnJvcikgeworCQkJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJCQkJaW50IGpiZWdpbl9jb3VudCA9CisJCQkJICAgIDIgKgorCQkJCSAgICAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MoaW5vZGUtPmlfc2IpICsKKwkJCQkgICAgIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKSArCisJCQkJICAgIDI7CisKKwkJCQkvKiAodXNlcitncm91cCkqKG9sZCtuZXcpIHN0cnVjdHVyZSAtIHdlIGNvdW50IHF1b3RhIGluZm8gYW5kICwgaW5vZGUgd3JpdGUgKHNiLCBpbm9kZSkgKi8KKwkJCQllcnJvciA9CisJCQkJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwKKwkJCQkJCSAgamJlZ2luX2NvdW50KTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gb3V0OworCQkJCWVycm9yID0KKwkJCQkgICAgRFFVT1RfVFJBTlNGRVIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7CisJCQkJaWYgKGVycm9yKSB7CisJCQkJCWpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsCisJCQkJCQkgICAgamJlZ2luX2NvdW50KTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCS8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCQkJICogb25lIHRyYW5zYWN0aW9uICovCisJCQkJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCQkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKKwkJCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkKKwkJCQkJaW5vZGUtPmlfZ2lkID0gYXR0ci0+aWFfZ2lkOworCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCWVycm9yID0KKwkJCQkgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJCX0KKwkJfQorCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKTsKKwl9CisKKwlpZiAoIWVycm9yICYmIHJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSkgeworCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCisJCQllcnJvciA9IHJlaXNlcmZzX2FjbF9jaG1vZChpbm9kZSk7CisJfQorCisgICAgICBvdXQ6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLQotCiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyA9IHsKLSAgICAud3JpdGVwYWdlID0gcmVpc2VyZnNfd3JpdGVwYWdlLAotICAgIC5yZWFkcGFnZSA9IHJlaXNlcmZzX3JlYWRwYWdlLCAKLSAgICAucmVhZHBhZ2VzID0gcmVpc2VyZnNfcmVhZHBhZ2VzLCAKLSAgICAucmVsZWFzZXBhZ2UgPSByZWlzZXJmc19yZWxlYXNlcGFnZSwKLSAgICAuaW52YWxpZGF0ZXBhZ2UgPSByZWlzZXJmc19pbnZhbGlkYXRlcGFnZSwKLSAgICAuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAotICAgIC5wcmVwYXJlX3dyaXRlID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZSwKLSAgICAuY29tbWl0X3dyaXRlID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlLAotICAgIC5ibWFwID0gcmVpc2VyZnNfYW9wX2JtYXAsCi0gICAgLmRpcmVjdF9JTyA9IHJlaXNlcmZzX2RpcmVjdF9JTywKLSAgICAuc2V0X3BhZ2VfZGlydHkgPSByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eSwKLX0gOworCS53cml0ZXBhZ2UgPSByZWlzZXJmc193cml0ZXBhZ2UsCisJLnJlYWRwYWdlID0gcmVpc2VyZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IHJlaXNlcmZzX3JlYWRwYWdlcywKKwkucmVsZWFzZXBhZ2UgPSByZWlzZXJmc19yZWxlYXNlcGFnZSwKKwkuaW52YWxpZGF0ZXBhZ2UgPSByZWlzZXJmc19pbnZhbGlkYXRlcGFnZSwKKwkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gcmVpc2VyZnNfYW9wX2JtYXAsCisJLmRpcmVjdF9JTyA9IHJlaXNlcmZzX2RpcmVjdF9JTywKKwkuc2V0X3BhZ2VfZGlydHkgPSByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eSwKK307CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pb2N0bC5jIGIvZnMvcmVpc2VyZnMvaW9jdGwuYwppbmRleCA5NGRjNDI0Li44MWZjMDAyIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pb2N0bC5jCisrKyBiL2ZzL3JlaXNlcmZzL2lvY3RsLmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKIAogLyoKICoqIHJlaXNlcmZzX2lvY3RsIC0gaGFuZGxlciBmb3IgaW9jdGwgZm9yIGlub2RlCkBAIC0xOSw2MyArMTksNzIgQEAKICoqICAyKSBSRUlTRVJGU19JT0NfW0dTXUVURkxBR1MsIFJFSVNFUkZTX0lPQ19bR1NdRVRWRVJTSU9OCiAqKiAgMykgVGhhdCdzIGFsbCBmb3IgYSB3aGlsZSAuLi4KICovCi1pbnQgcmVpc2VyZnNfaW9jdGwgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIHVuc2lnbmVkIGludCBjbWQsCi0JCXVuc2lnbmVkIGxvbmcgYXJnKQoraW50IHJlaXNlcmZzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAlzd2l0Y2ggKGNtZCkgewotCSAgICBjYXNlIFJFSVNFUkZTX0lPQ19VTlBBQ0s6Ci0JCWlmKCBTX0lTUkVHKCBpbm9kZSAtPiBpX21vZGUgKSApIHsKLQkJaWYgKGFyZykKLQkJICAgIHJldHVybiByZWlzZXJmc191bnBhY2sgKGlub2RlLCBmaWxwKTsKKwljYXNlIFJFSVNFUkZTX0lPQ19VTlBBQ0s6CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQlpZiAoYXJnKQorCQkJCXJldHVybiByZWlzZXJmc191bnBhY2soaW5vZGUsIGZpbHApOwogCQkJZWxzZQogCQkJCXJldHVybiAwOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRU5PVFRZOwotCS8qIGZvbGxvd2luZyB0d28gY2FzZXMgYXJlIHRha2VuIGZyb20gZnMvZXh0Mi9pb2N0bC5jIGJ5IFJlbXkKLQkgICBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKSAqLworCQkvKiBmb2xsb3dpbmcgdHdvIGNhc2VzIGFyZSB0YWtlbiBmcm9tIGZzL2V4dDIvaW9jdGwuYyBieSBSZW15CisJCSAgIENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpICovCiAJY2FzZSBSRUlTRVJGU19JT0NfR0VURkxBR1M6Ci0JCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRyczsKLQkJaV9hdHRyc190b19zZF9hdHRycyggaW5vZGUsICggX191MTYgKiApICZmbGFncyApOwotCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7Ci0JY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6IHsKLQkJaWYgKElTX1JET05MWShpbm9kZSkpCi0JCQlyZXR1cm4gLUVST0ZTOworCQlpZiAoIXJlaXNlcmZzX2F0dHJzKGlub2RlLT5pX3NiKSkKKwkJCXJldHVybiAtRU5PVFRZOwogCi0JCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKLQkJCXJldHVybiAtRVBFUk07CisJCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnM7CisJCWlfYXR0cnNfdG9fc2RfYXR0cnMoaW5vZGUsIChfX3UxNiAqKSAmIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6eworCQkJaWYgKCFyZWlzZXJmc19hdHRycyhpbm9kZS0+aV9zYikpCisJCQkJcmV0dXJuIC1FTk9UVFk7CiAKLQkJaWYgKGdldF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKSBhcmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJCQlyZXR1cm4gLUVST0ZTOwogCi0JCWlmICggKCAoIGZsYWdzIF4gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycykgJiAoIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCB8IFJFSVNFUkZTX0FQUEVORF9GTCkpICYmCi0JCSAgICAgIWNhcGFibGUoIENBUF9MSU5VWF9JTU1VVEFCTEUgKSApCi0JCQlyZXR1cm4gLUVQRVJNOwotCQkJCi0JCWlmKCAoIGZsYWdzICYgUkVJU0VSRlNfTk9UQUlMX0ZMICkgJiYKLQkJICAgIFNfSVNSRUcoIGlub2RlIC0+IGlfbW9kZSApICkgeworCQkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpCisJCQkgICAgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJaWYgKGdldF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmICgoKGZsYWdzIF4gUkVJU0VSRlNfSShpbm9kZSktPgorCQkJICAgICAgaV9hdHRycykgJiAoUkVJU0VSRlNfSU1NVVRBQkxFX0ZMIHwKKwkJCQkJICBSRUlTRVJGU19BUFBFTkRfRkwpKQorCQkJICAgICYmICFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCWlmICgoZmxhZ3MgJiBSRUlTRVJGU19OT1RBSUxfRkwpICYmCisJCQkgICAgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJCWludCByZXN1bHQ7CiAKLQkJCQlyZXN1bHQgPSByZWlzZXJmc191bnBhY2soIGlub2RlLCBmaWxwICk7Ci0JCQkJaWYoIHJlc3VsdCApCisJCQkJcmVzdWx0ID0gcmVpc2VyZnNfdW5wYWNrKGlub2RlLCBmaWxwKTsKKwkJCQlpZiAocmVzdWx0KQogCQkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJc2RfYXR0cnNfdG9faV9hdHRycyhmbGFncywgaW5vZGUpOworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfYXR0cnMgPSBmbGFnczsKKwkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJcmV0dXJuIDA7CiAJCX0KLQkJc2RfYXR0cnNfdG9faV9hdHRycyggZmxhZ3MsIGlub2RlICk7Ci0JCVJFSVNFUkZTX0koaW5vZGUpIC0+IGlfYXR0cnMgPSBmbGFnczsKLQkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJcmV0dXJuIDA7Ci0JfQogCWNhc2UgUkVJU0VSRlNfSU9DX0dFVFZFUlNJT046Ci0JCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKSBhcmcpOworCQlyZXR1cm4gcHV0X3VzZXIoaW5vZGUtPmlfZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKilhcmcpOwogCWNhc2UgUkVJU0VSRlNfSU9DX1NFVFZFUlNJT046CiAJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKIAkJCXJldHVybiAtRVBFUk07CiAJCWlmIChJU19SRE9OTFkoaW5vZGUpKQogCQkJcmV0dXJuIC1FUk9GUzsKLQkJaWYgKGdldF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZykpCi0JCQlyZXR1cm4gLUVGQVVMVDsJCisJCWlmIChnZXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAkJcmV0dXJuIDA7CkBAIC04OSw2MyArOTgsNjUgQEAKICoqIEZ1bmN0aW9uIHRyeSB0byBjb252ZXJ0IHRhaWwgZnJvbSBkaXJlY3QgaXRlbSBpbnRvIGluZGlyZWN0LgogKiogSXQgc2V0IHVwIG5vcGFjayBhdHRyaWJ1dGUgaW4gdGhlIFJFSVNFUkZTX0koaW5vZGUpLT5ub3BhY2sKICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3VucGFjayAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewotICAgIGludCByZXR2YWwgPSAwOwotICAgIGludCBpbmRleCA7Ci0gICAgc3RydWN0IHBhZ2UgKnBhZ2UgOwotICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nIDsKLSAgICB1bnNpZ25lZCBsb25nIHdyaXRlX2Zyb20gOwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDsKLSAgICAJCi0gICAgaWYgKGlub2RlLT5pX3NpemUgPT0gMCkgewotICAgICAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwotICAgICAgICByZXR1cm4gMCA7Ci0gICAgfQotICAgIC8qIGlvY3RsIGFscmVhZHkgZG9uZSAqLwotICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spIHsKLSAgICAgICAgcmV0dXJuIDAgOwotICAgIH0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJdW5zaWduZWQgbG9uZyB3cml0ZV9mcm9tOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwogCi0gICAgLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm9ib2R5IGlzIGNoYW5naW5nIHRoZSBmaWxlIHNpemUgYmVuZWF0aAotICAgICoqIHVzCi0gICAgKi8KLSAgICBkb3duKCZpbm9kZS0+aV9zZW0pIDsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwKSB7CisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7CisJCXJldHVybiAwOworCX0KKwkvKiBpb2N0bCBhbHJlYWR5IGRvbmUgKi8KKwlpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSB7CisJCXJldHVybiAwOworCX0KKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKIAotICAgIHdyaXRlX2Zyb20gPSBpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpIDsKLSAgICAvKiBpZiB3ZSBhcmUgb24gYSBibG9jayBib3VuZGFyeSwgd2UgYXJlIGFscmVhZHkgdW5wYWNrZWQuICAqLwotICAgIGlmICggd3JpdGVfZnJvbSA9PSAwKSB7CisJLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm9ib2R5IGlzIGNoYW5naW5nIHRoZSBmaWxlIHNpemUgYmVuZWF0aAorCSAqKiB1cworCSAqLworCWRvd24oJmlub2RlLT5pX3NlbSk7CisKKwl3cml0ZV9mcm9tID0gaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKTsKKwkvKiBpZiB3ZSBhcmUgb24gYSBibG9jayBib3VuZGFyeSwgd2UgYXJlIGFscmVhZHkgdW5wYWNrZWQuICAqLworCWlmICh3cml0ZV9mcm9tID09IDApIHsKKwkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9ub3BhY2tfbWFzazsKKwkJZ290byBvdXQ7CisJfQorCisJLyogd2UgdW5wYWNrIGJ5IGZpbmRpbmcgdGhlIHBhZ2Ugd2l0aCB0aGUgdGFpbCwgYW5kIGNhbGxpbmcKKwkgKiogcmVpc2VyZnNfcHJlcGFyZV93cml0ZSBvbiB0aGF0IHBhZ2UuICBUaGlzIHdpbGwgZm9yY2UgYSAKKwkgKiogcmVpc2VyZnNfZ2V0X2Jsb2NrIHRvIHVucGFjayB0aGUgdGFpbCBmb3IgdXMuCisJICovCisJaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJcmV0dmFsID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpIHsKKwkJZ290byBvdXQ7CisJfQorCXJldHZhbCA9CisJICAgIG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIGNvbnZlcnNpb24gY2FuIGNoYW5nZSBwYWdlIGNvbnRlbnRzLCBtdXN0IGZsdXNoICovCisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJcmV0dmFsID0KKwkgICAgbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCB3cml0ZV9mcm9tLCB3cml0ZV9mcm9tKTsKIAlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwotCWdvdG8gb3V0IDsKLSAgICB9CiAKLSAgICAvKiB3ZSB1bnBhY2sgYnkgZmluZGluZyB0aGUgcGFnZSB3aXRoIHRoZSB0YWlsLCBhbmQgY2FsbGluZwotICAgICoqIHJlaXNlcmZzX3ByZXBhcmVfd3JpdGUgb24gdGhhdCBwYWdlLiAgVGhpcyB3aWxsIGZvcmNlIGEgCi0gICAgKiogcmVpc2VyZnNfZ2V0X2Jsb2NrIHRvIHVucGFjayB0aGUgdGFpbCBmb3IgdXMuCi0gICAgKi8KLSAgICBpbmRleCA9IGlub2RlLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCA7Ci0gICAgbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmcgOwotICAgIHBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgpIDsKLSAgICByZXR2YWwgPSAtRU5PTUVNOwotICAgIGlmICghcGFnZSkgewotICAgICAgICBnb3RvIG91dCA7Ci0gICAgfQotICAgIHJldHZhbCA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF91bmxvY2sgOworICAgICAgb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKLSAgICAvKiBjb252ZXJzaW9uIGNhbiBjaGFuZ2UgcGFnZSBjb250ZW50cywgbXVzdCBmbHVzaCAqLwotICAgIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpIDsKLSAgICByZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIHdyaXRlX2Zyb20sIHdyaXRlX2Zyb20pIDsKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOwotCi1vdXRfdW5sb2NrOgotICAgIHVubG9ja19wYWdlKHBhZ2UpIDsKLSAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSkgOwotCi1vdXQ6Ci0gICAgdXAoJmlub2RlLT5pX3NlbSkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIG91dDoKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pdGVtX29wcy5jIGIvZnMvcmVpc2VyZnMvaXRlbV9vcHMuYwppbmRleCAwY2UzM2RiLi5lMjM3Y2Q2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pdGVtX29wcy5jCisrKyBiL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMKQEAgLTE0LDc3NiArMTQsNzQxIEBACiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIHN0YXQgZGF0YSBmdW5jdGlvbnMKIC8vCi1zdGF0aWMgaW50IHNkX2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgc2RfYnl0ZXNfbnVtYmVyKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgYmxvY2tfc2l6ZSkKIHsKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNkX2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIHZvaWQgc2RfZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCAtLTsKLSAgICBzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgVFlQRV9BTlkpOwotICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0KGtleSwgKGxvZmZfdCkoLTEpKTsKKwlrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQtLTsKKwlzZXRfY3B1X2tleV9rX3R5cGUoa2V5LCBUWVBFX0FOWSk7CisJc2V0X2NwdV9rZXlfa19vZmZzZXQoa2V5LCAobG9mZl90KSAoLTEpKTsKIH0KIAotc3RhdGljIGludCBzZF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgc2RfaXNfbGVmdF9tZXJnZWFibGUoc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQogewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi0KLQotc3RhdGljIGNoYXIgKiBwcmludF90aW1lICh0aW1lX3QgdCkKK3N0YXRpYyBjaGFyICpwcmludF90aW1lKHRpbWVfdCB0KQogewotICAgIHN0YXRpYyBjaGFyIHRpbWVidWZbMjU2XTsKKwlzdGF0aWMgY2hhciB0aW1lYnVmWzI1Nl07CiAKLSAgICBzcHJpbnRmICh0aW1lYnVmLCAiJWxkIiwgdCk7Ci0gICAgcmV0dXJuIHRpbWVidWY7CisJc3ByaW50Zih0aW1lYnVmLCAiJWxkIiwgdCk7CisJcmV0dXJuIHRpbWVidWY7CiB9CiAKLQotc3RhdGljIHZvaWQgc2RfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIHNkX3ByaW50X2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgcHJpbnRrICgiXHRtb2RlIHwgc2l6ZSB8IG5saW5rcyB8IGZpcnN0IGRpcmVjdCB8IG10aW1lXG4iKTsKLSAgICBpZiAoc3RhdF9kYXRhX3YxIChpaCkpIHsKLSAgICAgIAlzdHJ1Y3Qgc3RhdF9kYXRhX3YxICogc2QgPSAoc3RydWN0IHN0YXRfZGF0YV92MSAqKWl0ZW07CisJcHJpbnRrKCJcdG1vZGUgfCBzaXplIHwgbmxpbmtzIHwgZmlyc3QgZGlyZWN0IHwgbXRpbWVcbiIpOworCWlmIChzdGF0X2RhdGFfdjEoaWgpKSB7CisJCXN0cnVjdCBzdGF0X2RhdGFfdjEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilpdGVtOwogCi0JcHJpbnRrICgiXHQwJS02byB8ICU2dSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YxX21vZGUoc2QpLAotICAgICAgICAgICAgICAgIHNkX3YxX3NpemUoc2QpLCBzZF92MV9ubGluayhzZCksIHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKSwKLSAgICAgICAgICAgICAgICBwcmludF90aW1lKCBzZF92MV9tdGltZShzZCkgKSApOwotICAgIH0gZWxzZSB7Ci0Jc3RydWN0IHN0YXRfZGF0YSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilpdGVtOworCQlwcmludGsoIlx0MCUtNm8gfCAlNnUgfCAlMnUgfCAlZCB8ICVzXG4iLCBzZF92MV9tb2RlKHNkKSwKKwkJICAgICAgIHNkX3YxX3NpemUoc2QpLCBzZF92MV9ubGluayhzZCksCisJCSAgICAgICBzZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZCksCisJCSAgICAgICBwcmludF90aW1lKHNkX3YxX210aW1lKHNkKSkpOworCX0gZWxzZSB7CisJCXN0cnVjdCBzdGF0X2RhdGEgKnNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilpdGVtOwogCi0JcHJpbnRrICgiXHQwJS02byB8ICU2THUgfCAlMnUgfCAlZCB8ICVzXG4iLCBzZF92Ml9tb2RlKHNkKSwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2RfdjJfc2l6ZShzZCksIHNkX3YyX25saW5rKHNkKSwKLSAgICAgICAgICAgIHNkX3YyX3JkZXYoc2QpLCBwcmludF90aW1lKHNkX3YyX210aW1lKHNkKSkpOwotICAgIH0KKwkJcHJpbnRrKCJcdDAlLTZvIHwgJTZMdSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YyX21vZGUoc2QpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZF92Ml9zaXplKHNkKSwgc2RfdjJfbmxpbmsoc2QpLAorCQkgICAgICAgc2RfdjJfcmRldihzZCksIHByaW50X3RpbWUoc2RfdjJfbXRpbWUoc2QpKSk7CisJfQogfQogCi1zdGF0aWMgdm9pZCBzZF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgc2RfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKKwkvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKIH0KIAotCi1zdGF0aWMgaW50IHNkX2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAotCQkJIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCi0JCQkgaW50IGlzX2FmZmVjdGVkLCAKLQkJCSBpbnQgaW5zZXJ0X3NpemUpCitzdGF0aWMgaW50IHNkX2NyZWF0ZV92aShzdHJ1Y3QgdmlydHVhbF9ub2RlICp2biwKKwkJCXN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLAorCQkJaW50IGlzX2FmZmVjdGVkLCBpbnQgaW5zZXJ0X3NpemUpCiB7Ci0gICAgdmktPnZpX2luZGV4ID0gVFlQRV9TVEFUX0RBVEE7Ci0gICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX1NUQVRfREFUQTsvLyBub3QgbmVlZGVkPwotICAgIHJldHVybiAwOworCXZpLT52aV9pbmRleCA9IFRZUEVfU1RBVF9EQVRBOworCS8vdmktPnZpX3R5cGUgfD0gVklfVFlQRV9TVEFUX0RBVEE7Ly8gbm90IG5lZWRlZD8KKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgaW50IHNkX2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsIAotCQkJICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQorc3RhdGljIGludCBzZF9jaGVja19sZWZ0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSwKKwkJCSBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQogewotICAgIGlmIChzdGFydF9za2lwIHx8IGVuZF9za2lwKQotCUJVRyAoKTsKLSAgICByZXR1cm4gLTE7CisJaWYgKHN0YXJ0X3NraXAgfHwgZW5kX3NraXApCisJCUJVRygpOworCXJldHVybiAtMTsKIH0KIAotCi1zdGF0aWMgaW50IHNkX2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBzZF9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCiB7Ci0gICAgcmV0dXJuIC0xOworCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBzZF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCitzdGF0aWMgaW50IHNkX3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgaWYgKGNvdW50KQotCUJVRyAoKTsKLSAgICByZXR1cm4gMDsKKwlpZiAoY291bnQpCisJCUJVRygpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNkX3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgaW50IHNkX3VuaXRfbnVtKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIHJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOworCXJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOwogfQogCi0KLXN0YXRpYyB2b2lkIHNkX3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBzZF9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiU1RBVERBVEEsIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoIiwKLQkJICAgICAgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJTVEFUREFUQSwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkJIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIHN0YXRfZGF0YV9vcHMgPSB7Ci0JLmJ5dGVzX251bWJlcgkJPSBzZF9ieXRlc19udW1iZXIsCi0JLmRlY3JlbWVudF9rZXkJCT0gc2RfZGVjcmVtZW50X2tleSwKLQkuaXNfbGVmdF9tZXJnZWFibGUJPSBzZF9pc19sZWZ0X21lcmdlYWJsZSwKLQkucHJpbnRfaXRlbQkJPSBzZF9wcmludF9pdGVtLAotCS5jaGVja19pdGVtCQk9IHNkX2NoZWNrX2l0ZW0sCisJLmJ5dGVzX251bWJlciA9IHNkX2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleSA9IHNkX2RlY3JlbWVudF9rZXksCisJLmlzX2xlZnRfbWVyZ2VhYmxlID0gc2RfaXNfbGVmdF9tZXJnZWFibGUsCisJLnByaW50X2l0ZW0gPSBzZF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtID0gc2RfY2hlY2tfaXRlbSwKIAotCS5jcmVhdGVfdmkJCT0gc2RfY3JlYXRlX3ZpLAotCS5jaGVja19sZWZ0CQk9IHNkX2NoZWNrX2xlZnQsCi0JLmNoZWNrX3JpZ2h0CQk9IHNkX2NoZWNrX3JpZ2h0LAotCS5wYXJ0X3NpemUJCT0gc2RfcGFydF9zaXplLAotCS51bml0X251bQkJPSBzZF91bml0X251bSwKLQkucHJpbnRfdmkJCT0gc2RfcHJpbnRfdmkKKwkuY3JlYXRlX3ZpID0gc2RfY3JlYXRlX3ZpLAorCS5jaGVja19sZWZ0ID0gc2RfY2hlY2tfbGVmdCwKKwkuY2hlY2tfcmlnaHQgPSBzZF9jaGVja19yaWdodCwKKwkucGFydF9zaXplID0gc2RfcGFydF9zaXplLAorCS51bml0X251bSA9IHNkX3VuaXRfbnVtLAorCS5wcmludF92aSA9IHNkX3ByaW50X3ZpCiB9OwogCi0KLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBkaXJlY3QgaXRlbSBmdW5jdGlvbnMKIC8vCi1zdGF0aWMgaW50IGRpcmVjdF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCitzdGF0aWMgaW50IGRpcmVjdF9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpOworCXJldHVybiBpaF9pdGVtX2xlbihpaCk7CiB9CiAKLQogLy8gRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHN3aXRjaCB0byBpbmRpcmVjdCBhcyB3ZWxsCi1zdGF0aWMgdm9pZCBkaXJlY3RfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBkaXJlY3RfZGVjcmVtZW50X2tleShzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOwotICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCi0Jc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsJCisJY3B1X2tleV9rX29mZnNldF9kZWMoa2V5KTsKKwlpZiAoY3B1X2tleV9rX29mZnNldChrZXkpID09IDApCisJCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfU1RBVF9EQVRBKTsKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlKHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBic2l6ZSkKIHsKLSAgICBpbnQgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOwotICAgIHJldHVybiAoKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSAmIChic2l6ZSAtIDEpKSAhPSAxKTsKKwlpbnQgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGtleSk7CisJcmV0dXJuICgobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkgJiAoYnNpemUgLSAxKSkgIT0gMSk7CiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZWN0X3ByaW50X2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICBpbnQgaiA9IDA7CisJaW50IGogPSAwOwogCiAvLyAgICByZXR1cm47Ci0gICAgcHJpbnRrICgiXCIiKTsKLSAgICB3aGlsZSAoaiA8IGloX2l0ZW1fbGVuKGloKSkKLQlwcmludGsgKCIlYyIsIGl0ZW1baisrXSk7Ci0gICAgcHJpbnRrICgiXCJcbiIpOworCXByaW50aygiXCIiKTsKKwl3aGlsZSAoaiA8IGloX2l0ZW1fbGVuKGloKSkKKwkJcHJpbnRrKCIlYyIsIGl0ZW1baisrXSk7CisJcHJpbnRrKCJcIlxuIik7CiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZWN0X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCitzdGF0aWMgdm9pZCBkaXJlY3RfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKKwkvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVjdF9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKLQkJCSAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgaW50IGlzX2FmZmVjdGVkLCAKLQkJCSAgICAgaW50IGluc2VydF9zaXplKQorc3RhdGljIGludCBkaXJlY3RfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLAorCQkJICAgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKQogewotICAgIHZpLT52aV9pbmRleCA9IFRZUEVfRElSRUNUOwotICAgIC8vdmktPnZpX3R5cGUgfD0gVklfVFlQRV9ESVJFQ1Q7Ci0gICAgcmV0dXJuIDA7CisJdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFQ1Q7CisJLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0RJUkVDVDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkaXJlY3RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKLQkJCSAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCitzdGF0aWMgaW50IGRpcmVjdF9jaGVja19sZWZ0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSwKKwkJCSAgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKIHsKLSAgICBpbnQgYnl0ZXM7CisJaW50IGJ5dGVzOwogCi0gICAgYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIDg7Ci0gICAgcmV0dXJuIGJ5dGVzID86IC0xOyAgICAKKwlieXRlcyA9IGZyZWUgLSBmcmVlICUgODsKKwlyZXR1cm4gYnl0ZXMgPyA6IC0xOwogfQogCi0KLXN0YXRpYyBpbnQgZGlyZWN0X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBkaXJlY3RfY2hlY2tfcmlnaHQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlKQogewotICAgIHJldHVybiBkaXJlY3RfY2hlY2tfbGVmdCAodmksIGZyZWUsIDAsIDApOworCXJldHVybiBkaXJlY3RfY2hlY2tfbGVmdCh2aSwgZnJlZSwgMCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgZGlyZWN0X3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgZGlyZWN0X3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgcmV0dXJuIGNvdW50OworCXJldHVybiBjb3VudDsKIH0KIAotCi1zdGF0aWMgaW50IGRpcmVjdF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQorc3RhdGljIGludCBkaXJlY3RfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CisJcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZWN0X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfdmkoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAotCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkJIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGRpcmVjdF9vcHMgPSB7Ci0JLmJ5dGVzX251bWJlcgkJPSBkaXJlY3RfYnl0ZXNfbnVtYmVyLAotCS5kZWNyZW1lbnRfa2V5CQk9IGRpcmVjdF9kZWNyZW1lbnRfa2V5LAotCS5pc19sZWZ0X21lcmdlYWJsZQk9IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSwKLQkucHJpbnRfaXRlbQkJPSBkaXJlY3RfcHJpbnRfaXRlbSwKLQkuY2hlY2tfaXRlbQkJPSBkaXJlY3RfY2hlY2tfaXRlbSwKKwkuYnl0ZXNfbnVtYmVyID0gZGlyZWN0X2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleSA9IGRpcmVjdF9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZSA9IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbSA9IGRpcmVjdF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtID0gZGlyZWN0X2NoZWNrX2l0ZW0sCiAKLQkuY3JlYXRlX3ZpCQk9IGRpcmVjdF9jcmVhdGVfdmksCi0JLmNoZWNrX2xlZnQJCT0gZGlyZWN0X2NoZWNrX2xlZnQsCi0JLmNoZWNrX3JpZ2h0CQk9IGRpcmVjdF9jaGVja19yaWdodCwKLQkucGFydF9zaXplCQk9IGRpcmVjdF9wYXJ0X3NpemUsCi0JLnVuaXRfbnVtCQk9IGRpcmVjdF91bml0X251bSwKLQkucHJpbnRfdmkJCT0gZGlyZWN0X3ByaW50X3ZpCisJLmNyZWF0ZV92aSA9IGRpcmVjdF9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQgPSBkaXJlY3RfY2hlY2tfbGVmdCwKKwkuY2hlY2tfcmlnaHQgPSBkaXJlY3RfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZSA9IGRpcmVjdF9wYXJ0X3NpemUsCisJLnVuaXRfbnVtID0gZGlyZWN0X3VuaXRfbnVtLAorCS5wcmludF92aSA9IGRpcmVjdF9wcmludF92aQogfTsKIAotCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8gaW5kaXJlY3QgaXRlbSBmdW5jdGlvbnMKIC8vCiAKLXN0YXRpYyBpbnQgaW5kaXJlY3RfYnl0ZXNfbnVtYmVyIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKQorc3RhdGljIGludCBpbmRpcmVjdF9ieXRlc19udW1iZXIoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBibG9ja19zaXplKQogewotICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUgKiBibG9ja19zaXplOyAvLy0gZ2V0X2loX2ZyZWVfc3BhY2UgKGloKTsKKwlyZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC8gVU5GTV9QX1NJWkUgKiBibG9ja19zaXplOwkvLy0gZ2V0X2loX2ZyZWVfc3BhY2UgKGloKTsKIH0KIAotCiAvLyBkZWNyZWFzZSBvZmZzZXQsIGlmIGl0IGJlY29tZXMgMCwgY2hhbmdlIHR5cGUgdG8gc3RhdCBkYXRhCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X2RlY3JlbWVudF9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICBjcHVfa2V5X2tfb2Zmc2V0X2RlYyAoa2V5KTsKLSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSA9PSAwKQotCXNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX1NUQVRfREFUQSk7CisJY3B1X2tleV9rX29mZnNldF9kZWMoa2V5KTsKKwlpZiAoY3B1X2tleV9rX29mZnNldChrZXkpID09IDApCisJCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfU1RBVF9EQVRBKTsKIH0KIAotCiAvLyBpZiBpdCBpcyBub3QgZmlyc3QgaXRlbSBvZiB0aGUgYm9keSwgdGhlbiBpdCBpcyBtZXJnZWFibGUKLXN0YXRpYyBpbnQgaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCitzdGF0aWMgaW50IGluZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlKHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGJzaXplKQogewotICAgIGludCB2ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24gKGtleSk7Ci0gICAgcmV0dXJuIChsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIGtleSkgIT0gMSk7CisJaW50IHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbihrZXkpOworCXJldHVybiAobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkgIT0gMSk7CiB9CiAKLQogLy8gcHJpbnRpbmcgb2YgaW5kaXJlY3QgaXRlbQotc3RhdGljIHZvaWQgc3RhcnRfbmV3X3NlcXVlbmNlIChfX3UzMiAqIHN0YXJ0LCBpbnQgKiBsZW4sIF9fdTMyIG5ldykKK3N0YXRpYyB2b2lkIHN0YXJ0X25ld19zZXF1ZW5jZShfX3UzMiAqIHN0YXJ0LCBpbnQgKmxlbiwgX191MzIgbmV3KQogewotICAgICpzdGFydCA9IG5ldzsKLSAgICAqbGVuID0gMTsKKwkqc3RhcnQgPSBuZXc7CisJKmxlbiA9IDE7CiB9CiAKLQotc3RhdGljIGludCBzZXF1ZW5jZV9maW5pc2hlZCAoX191MzIgc3RhcnQsIGludCAqIGxlbiwgX191MzIgbmV3KQorc3RhdGljIGludCBzZXF1ZW5jZV9maW5pc2hlZChfX3UzMiBzdGFydCwgaW50ICpsZW4sIF9fdTMyIG5ldykKIHsKLSAgICBpZiAoc3RhcnQgPT0gSU5UX01BWCkKLQlyZXR1cm4gMTsKKwlpZiAoc3RhcnQgPT0gSU5UX01BWCkKKwkJcmV0dXJuIDE7CiAKLSAgICBpZiAoc3RhcnQgPT0gMCAmJiBuZXcgPT0gMCkgewotCSgqbGVuKSArKzsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0ICE9IDAgJiYgKHN0YXJ0ICsgKmxlbikgPT0gbmV3KSB7Ci0JKCpsZW4pICsrOwotCXJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfc2VxdWVuY2UgKF9fdTMyIHN0YXJ0LCBpbnQgbGVuKQotewotICAgIGlmIChzdGFydCA9PSBJTlRfTUFYKQotCXJldHVybjsKLQotICAgIGlmIChsZW4gPT0gMSkKLQlwcmludGsgKCIgJWQiLCBzdGFydCk7Ci0gICAgZWxzZQotCXByaW50ayAoIiAlZCglZCkiLCBzdGFydCwgbGVuKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQotewotICAgIGludCBqOwotICAgIF9fbGUzMiAqIHVucDsKLSAgICBfX3UzMiBwcmV2ID0gSU5UX01BWDsKLSAgICBpbnQgbnVtOwotCi0gICAgdW5wID0gKF9fbGUzMiAqKWl0ZW07Ci0KLSAgICBpZiAoaWhfaXRlbV9sZW4oaWgpICUgVU5GTV9QX1NJWkUpCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImluZGlyZWN0X3ByaW50X2l0ZW06IGludmFsaWQgaXRlbSBsZW4iKTsKLQotICAgIHByaW50ayAoIiVkIHBvaW50ZXJzXG5bICIsIChpbnQpSV9VTkZNX05VTSAoaWgpKTsKLSAgICBmb3IgKGogPSAwOyBqIDwgSV9VTkZNX05VTSAoaWgpOyBqICsrKSB7Ci0JaWYgKHNlcXVlbmNlX2ZpbmlzaGVkIChwcmV2LCAmbnVtLCBnZXRfYmxvY2tfbnVtKHVucCwgaikpKSB7Ci0JICAgIHByaW50X3NlcXVlbmNlIChwcmV2LCBudW0pOwotCSAgICBzdGFydF9uZXdfc2VxdWVuY2UgKCZwcmV2LCAmbnVtLCBnZXRfYmxvY2tfbnVtKHVucCwgaikpOworCWlmIChzdGFydCA9PSAwICYmIG5ldyA9PSAwKSB7CisJCSgqbGVuKSsrOworCQlyZXR1cm4gMDsKIAl9Ci0gICAgfQotICAgIHByaW50X3NlcXVlbmNlIChwcmV2LCBudW0pOwotICAgIHByaW50ayAoIl1cbiIpOworCWlmIChzdGFydCAhPSAwICYmIChzdGFydCArICpsZW4pID09IG5ldykgeworCQkoKmxlbikrKzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBpbmRpcmVjdF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgcHJpbnRfc2VxdWVuY2UoX191MzIgc3RhcnQsIGludCBsZW4pCiB7Ci0gICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCisJaWYgKHN0YXJ0ID09IElOVF9NQVgpCisJCXJldHVybjsKKworCWlmIChsZW4gPT0gMSkKKwkJcHJpbnRrKCIgJWQiLCBzdGFydCk7CisJZWxzZQorCQlwcmludGsoIiAlZCglZCkiLCBzdGFydCwgbGVuKTsKIH0KIAotCi1zdGF0aWMgaW50IGluZGlyZWN0X2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAotCQkJICAgICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCi0JCQkgICAgICAgaW50IGlzX2FmZmVjdGVkLCAKLQkJCSAgICAgICBpbnQgaW5zZXJ0X3NpemUpCitzdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF9pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQogewotICAgIHZpLT52aV9pbmRleCA9IFRZUEVfSU5ESVJFQ1Q7Ci0gICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0lORElSRUNUOwotICAgIHJldHVybiAwOworCWludCBqOworCV9fbGUzMiAqdW5wOworCV9fdTMyIHByZXYgPSBJTlRfTUFYOworCWludCBudW07CisKKwl1bnAgPSAoX19sZTMyICopIGl0ZW07CisKKwlpZiAoaWhfaXRlbV9sZW4oaWgpICUgVU5GTV9QX1NJWkUpCisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgImluZGlyZWN0X3ByaW50X2l0ZW06IGludmFsaWQgaXRlbSBsZW4iKTsKKworCXByaW50aygiJWQgcG9pbnRlcnNcblsgIiwgKGludClJX1VORk1fTlVNKGloKSk7CisJZm9yIChqID0gMDsgaiA8IElfVU5GTV9OVU0oaWgpOyBqKyspIHsKKwkJaWYgKHNlcXVlbmNlX2ZpbmlzaGVkKHByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSkpIHsKKwkJCXByaW50X3NlcXVlbmNlKHByZXYsIG51bSk7CisJCQlzdGFydF9uZXdfc2VxdWVuY2UoJnByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSk7CisJCX0KKwl9CisJcHJpbnRfc2VxdWVuY2UocHJldiwgbnVtKTsKKwlwcmludGsoIl1cbiIpOwogfQogCi1zdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsCi0JCQkJaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X2NoZWNrX2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgaW50IGJ5dGVzOwotCi0gICAgYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIFVORk1fUF9TSVpFOwotICAgIHJldHVybiBieXRlcyA/OiAtMTsgICAgCisJLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCiB9CiAKLQotc3RhdGljIGludCBpbmRpcmVjdF9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICByZXR1cm4gaW5kaXJlY3RfY2hlY2tfbGVmdCAodmksIGZyZWUsIDAsIDApOworCXZpLT52aV9pbmRleCA9IFRZUEVfSU5ESVJFQ1Q7CisJLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX0lORElSRUNUOworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGluZGlyZWN0X2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJICAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCit7CisJaW50IGJ5dGVzOwogCisJYnl0ZXMgPSBmcmVlIC0gZnJlZSAlIFVORk1fUF9TSVpFOworCXJldHVybiBieXRlcyA/IDogLTE7Cit9CisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY2hlY2tfcmlnaHQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlKQoreworCXJldHVybiBpbmRpcmVjdF9jaGVja19sZWZ0KHZpLCBmcmVlLCAwLCAwKTsKK30KIAogLy8gcmV0dXJuIHNpemUgaW4gYnl0ZXMgb2YgJ3VuaXRzJyB1bml0cy4gSWYgZmlyc3QgPT0gMCAtIGNhbGN1bGF0ZSBmcm9tIHRoZSBoZWFkIChsZWZ0KSwgb3RoZXJ3aXNlIC0gZnJvbSB0YWlsIChyaWdodCkKLXN0YXRpYyBpbnQgaW5kaXJlY3RfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IHVuaXRzKQorc3RhdGljIGludCBpbmRpcmVjdF9wYXJ0X3NpemUoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmaXJzdCwgaW50IHVuaXRzKQogewotICAgIC8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCi0gICAgcmV0dXJuIHVuaXRzOworCS8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCisJcmV0dXJuIHVuaXRzOwogfQogCi1zdGF0aWMgaW50IGluZGlyZWN0X3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgaW50IGluZGlyZWN0X3VuaXRfbnVtKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIC8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCi0gICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7CisJLy8gdW5pdCBvZiBpbmRpcmVjdCBpdGVtIGlzIGJ5dGUgKHlldCkKKwlyZXR1cm4gdmktPnZpX2l0ZW1fbGVuIC0gSUhfU0laRTsKIH0KIAotc3RhdGljIHZvaWQgaW5kaXJlY3RfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyB2b2lkIGluZGlyZWN0X3ByaW50X3ZpKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpKQogewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJJTkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAotCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIklORElSRUNULCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCisJCQkgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgaW5kaXJlY3Rfb3BzID0gewotCS5ieXRlc19udW1iZXIJCT0gaW5kaXJlY3RfYnl0ZXNfbnVtYmVyLAotCS5kZWNyZW1lbnRfa2V5CQk9IGluZGlyZWN0X2RlY3JlbWVudF9rZXksCi0JLmlzX2xlZnRfbWVyZ2VhYmxlCT0gaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUsCi0JLnByaW50X2l0ZW0JCT0gaW5kaXJlY3RfcHJpbnRfaXRlbSwKLQkuY2hlY2tfaXRlbQkJPSBpbmRpcmVjdF9jaGVja19pdGVtLAorCS5ieXRlc19udW1iZXIgPSBpbmRpcmVjdF9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkgPSBpbmRpcmVjdF9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZSA9IGluZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtID0gaW5kaXJlY3RfcHJpbnRfaXRlbSwKKwkuY2hlY2tfaXRlbSA9IGluZGlyZWN0X2NoZWNrX2l0ZW0sCiAKLQkuY3JlYXRlX3ZpCQk9IGluZGlyZWN0X2NyZWF0ZV92aSwKLQkuY2hlY2tfbGVmdAkJPSBpbmRpcmVjdF9jaGVja19sZWZ0LAotCS5jaGVja19yaWdodAkJPSBpbmRpcmVjdF9jaGVja19yaWdodCwKLQkucGFydF9zaXplCQk9IGluZGlyZWN0X3BhcnRfc2l6ZSwKLQkudW5pdF9udW0JCT0gaW5kaXJlY3RfdW5pdF9udW0sCi0JLnByaW50X3ZpCQk9IGluZGlyZWN0X3ByaW50X3ZpCisJLmNyZWF0ZV92aSA9IGluZGlyZWN0X2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdCA9IGluZGlyZWN0X2NoZWNrX2xlZnQsCisJLmNoZWNrX3JpZ2h0ID0gaW5kaXJlY3RfY2hlY2tfcmlnaHQsCisJLnBhcnRfc2l6ZSA9IGluZGlyZWN0X3BhcnRfc2l6ZSwKKwkudW5pdF9udW0gPSBpbmRpcmVjdF91bml0X251bSwKKwkucHJpbnRfdmkgPSBpbmRpcmVjdF9wcmludF92aQogfTsKIAotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIGRpcmVudHJ5IGZ1bmN0aW9ucwogLy8KIAotCi1zdGF0aWMgaW50IGRpcmVudHJ5X2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfYnl0ZXNfbnVtYmVyKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgYmxvY2tfc2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAidnMtMTYwOTA6IGRpcmVudHJ5X2J5dGVzX251bWJlcjogIgotCQkgICAgICAiYnl0ZXMgbnVtYmVyIGlzIGFza2VkIGZvciBkaXJlbnRyeSIpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkaXJlbnRyeV9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKLXsKLSAgICBjcHVfa2V5X2tfb2Zmc2V0X2RlYyAoa2V5KTsKLSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSA9PSAwKQotCXNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCBUWVBFX1NUQVRfREFUQSk7CQotfQotCi0KLXN0YXRpYyBpbnQgZGlyZW50cnlfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCi17Ci0gICAgaWYgKGxlMzJfdG9fY3B1IChrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQpID09IERPVF9PRkZTRVQpCisJcmVpc2VyZnNfd2FybmluZyhOVUxMLCAidnMtMTYwOTA6IGRpcmVudHJ5X2J5dGVzX251bWJlcjogIgorCQkJICJieXRlcyBudW1iZXIgaXMgYXNrZWQgZm9yIGRpcmVudHJ5Iik7CiAJcmV0dXJuIDA7Ci0gICAgcmV0dXJuIDE7Ci0JCiB9CiAKLQotc3RhdGljIHZvaWQgZGlyZW50cnlfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X2RlY3JlbWVudF9rZXkoc3RydWN0IGNwdV9rZXkgKmtleSkKIHsKLSAgICBpbnQgaTsKLSAgICBpbnQgbmFtZWxlbjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgICBjaGFyICogbmFtZTsKLSAgICBzdGF0aWMgY2hhciBuYW1lYnVmIFs4MF07CisJY3B1X2tleV9rX29mZnNldF9kZWMoa2V5KTsKKwlpZiAoY3B1X2tleV9rX29mZnNldChrZXkpID09IDApCisJCXNldF9jcHVfa2V5X2tfdHlwZShrZXksIFRZUEVfU1RBVF9EQVRBKTsKK30KIAorc3RhdGljIGludCBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXksCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3sKKwlpZiAobGUzMl90b19jcHUoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0KSA9PSBET1RfT0ZGU0VUKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIAotICAgIHByaW50ayAoIlxuICMgJS0xNXMlLTMwcyUtMTVzJS0xNXMlLTE1c1xuIiwgIk5hbWUiLCAiS2V5IG9mIHBvaW50ZWQgb2JqZWN0IiwgIkhhc2giLCAiR2VuIG51bWJlciIsICJTdGF0dXMiKTsKK30KIAotICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWl0ZW07CitzdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF9pdGVtKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBjaGFyICppdGVtKQoreworCWludCBpOworCWludCBuYW1lbGVuOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJY2hhciAqbmFtZTsKKwlzdGF0aWMgY2hhciBuYW1lYnVmWzgwXTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UIChpaCk7IGkgKyssIGRlaCArKykgewotCW5hbWVsZW4gPSAoaSA/IChkZWhfbG9jYXRpb24oZGVoIC0gMSkpIDogaWhfaXRlbV9sZW4oaWgpKSAtIGRlaF9sb2NhdGlvbihkZWgpOwotCW5hbWUgPSBpdGVtICsgZGVoX2xvY2F0aW9uKGRlaCk7Ci0JaWYgKG5hbWVbbmFtZWxlbi0xXSA9PSAwKQotCSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0JbmFtZWJ1ZlswXSA9ICciJzsKLQlpZiAobmFtZWxlbiA+IHNpemVvZiAobmFtZWJ1ZikgLSAzKSB7Ci0JICAgIHN0cm5jcHkgKG5hbWVidWYgKyAxLCBuYW1lLCBzaXplb2YgKG5hbWVidWYpIC0gMyk7Ci0JICAgIG5hbWVidWZbc2l6ZW9mIChuYW1lYnVmKSAtIDJdID0gJyInOwotCSAgICBuYW1lYnVmW3NpemVvZiAobmFtZWJ1ZikgLSAxXSA9IDA7Ci0JfSBlbHNlIHsKLQkgICAgbWVtY3B5IChuYW1lYnVmICsgMSwgbmFtZSwgbmFtZWxlbik7Ci0JICAgIG5hbWVidWZbbmFtZWxlbiArIDFdID0gJyInOwotCSAgICBuYW1lYnVmW25hbWVsZW4gKyAyXSA9IDA7CisJcHJpbnRrKCJcbiAjICUtMTVzJS0zMHMlLTE1cyUtMTVzJS0xNXNcbiIsICJOYW1lIiwKKwkgICAgICAgIktleSBvZiBwb2ludGVkIG9iamVjdCIsICJIYXNoIiwgIkdlbiBudW1iZXIiLCAiU3RhdHVzIik7CisKKwlkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilpdGVtOworCisJZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpKyssIGRlaCsrKSB7CisJCW5hbWVsZW4gPQorCQkgICAgKGkgPyAoZGVoX2xvY2F0aW9uKGRlaCAtIDEpKSA6IGloX2l0ZW1fbGVuKGloKSkgLQorCQkgICAgZGVoX2xvY2F0aW9uKGRlaCk7CisJCW5hbWUgPSBpdGVtICsgZGVoX2xvY2F0aW9uKGRlaCk7CisJCWlmIChuYW1lW25hbWVsZW4gLSAxXSA9PSAwKQorCQkJbmFtZWxlbiA9IHN0cmxlbihuYW1lKTsKKwkJbmFtZWJ1ZlswXSA9ICciJzsKKwkJaWYgKG5hbWVsZW4gPiBzaXplb2YobmFtZWJ1ZikgLSAzKSB7CisJCQlzdHJuY3B5KG5hbWVidWYgKyAxLCBuYW1lLCBzaXplb2YobmFtZWJ1ZikgLSAzKTsKKwkJCW5hbWVidWZbc2l6ZW9mKG5hbWVidWYpIC0gMl0gPSAnIic7CisJCQluYW1lYnVmW3NpemVvZihuYW1lYnVmKSAtIDFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShuYW1lYnVmICsgMSwgbmFtZSwgbmFtZWxlbik7CisJCQluYW1lYnVmW25hbWVsZW4gKyAxXSA9ICciJzsKKwkJCW5hbWVidWZbbmFtZWxlbiArIDJdID0gMDsKKwkJfQorCisJCXByaW50aygiJWQ6ICAlLTE1cyUtMTVkJS0xNWQlLTE1TGQlLTE1TGQoJXMpXG4iLAorCQkgICAgICAgaSwgbmFtZWJ1ZiwKKwkJICAgICAgIGRlaF9kaXJfaWQoZGVoKSwgZGVoX29iamVjdGlkKGRlaCksCisJCSAgICAgICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0KGRlaCkpLAorCQkgICAgICAgR0VUX0dFTkVSQVRJT05fTlVNQkVSKChkZWhfb2Zmc2V0KGRlaCkpKSwKKwkJICAgICAgIChkZV9oaWRkZW4oZGVoKSkgPyAiSElEREVOIiA6ICJWSVNJQkxFIik7CiAJfQotCi0JcHJpbnRrICgiJWQ6ICAlLTE1cyUtMTVkJS0xNWQlLTE1TGQlLTE1TGQoJXMpXG4iLCAKLQkJaSwgbmFtZWJ1ZiwKLQkJZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKLQkJR0VUX0hBU0hfVkFMVUUgKGRlaF9vZmZzZXQgKGRlaCkpLCBHRVRfR0VORVJBVElPTl9OVU1CRVIgKChkZWhfb2Zmc2V0IChkZWgpKSksCi0JCShkZV9oaWRkZW4gKGRlaCkpID8gIkhJRERFTiIgOiAiVklTSUJMRSIpOwotICAgIH0KIH0KIAotCi1zdGF0aWMgdm9pZCBkaXJlbnRyeV9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQorc3RhdGljIHZvaWQgZGlyZW50cnlfY2hlY2tfaXRlbShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgY2hhciAqaXRlbSkKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwogCi0gICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCi0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopaXRlbTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgSV9FTlRSWV9DT1VOVCAoaWgpOyBpICsrLCBkZWggKyspIHsKLQk7Ci0gICAgfQorCS8vIEZJWE1FOiB0eXBlIHNvbWV0aGluZyBoZXJlIQorCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWl0ZW07CisJZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpKyssIGRlaCsrKSB7CisJCTsKKwl9CiB9CiAKLQotCiAjZGVmaW5lIERJUkVOVFJZX1ZJX0ZJUlNUX0RJUkVOVFJZX0lURU0gMQogCiAvKgogICogZnVuY3Rpb24gcmV0dXJucyBvbGQgZW50cnkgbnVtYmVyIGluIGRpcmVjdG9yeSBpdGVtIGluIHJlYWwgbm9kZQogICogdXNpbmcgbmV3IGVudHJ5IG51bWJlciBpbiB2aXJ0dWFsIGl0ZW0gaW4gdmlydHVhbCBub2RlICovCi1zdGF0aWMgaW5saW5lIGludCBvbGRfZW50cnlfbnVtIChpbnQgaXNfYWZmZWN0ZWQsIGludCB2aXJ0dWFsX2VudHJ5X251bSwgaW50IHBvc19pbl9pdGVtLCBpbnQgbW9kZSkKK3N0YXRpYyBpbmxpbmUgaW50IG9sZF9lbnRyeV9udW0oaW50IGlzX2FmZmVjdGVkLCBpbnQgdmlydHVhbF9lbnRyeV9udW0sCisJCQkJaW50IHBvc19pbl9pdGVtLCBpbnQgbW9kZSkKIHsKLSAgICBpZiAoIG1vZGUgPT0gTV9JTlNFUlQgfHwgbW9kZSA9PSBNX0RFTEVURSkKLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07Ci0gICAgCi0gICAgaWYgKCFpc19hZmZlY3RlZCkKLQkvKiBjdXQgb3IgcGFzdGUgaXMgYXBwbGllZCB0byBhbm90aGVyIGl0ZW0gKi8KLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CisJaWYgKG1vZGUgPT0gTV9JTlNFUlQgfHwgbW9kZSA9PSBNX0RFTEVURSkKKwkJcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOwogCi0gICAgaWYgKHZpcnR1YWxfZW50cnlfbnVtIDwgcG9zX2luX2l0ZW0pCi0JcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtOworCWlmICghaXNfYWZmZWN0ZWQpCisJCS8qIGN1dCBvciBwYXN0ZSBpcyBhcHBsaWVkIHRvIGFub3RoZXIgaXRlbSAqLworCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CiAKLSAgICBpZiAobW9kZSA9PSBNX0NVVCkKLQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gKyAxOworCWlmICh2aXJ0dWFsX2VudHJ5X251bSA8IHBvc19pbl9pdGVtKQorCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CiAKLSAgICBSRkFMU0UoIG1vZGUgIT0gTV9QQVNURSB8fCB2aXJ0dWFsX2VudHJ5X251bSA9PSAwLAotCSAgICAidnMtODAxNTogb2xkX2VudHJ5X251bTogbW9kZSBtdXN0IGJlIE1fUEFTVEUgKG1vZGUgPSBcJyVjXCciLCBtb2RlKTsKLSAgICAKLSAgICByZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gLSAxOworCWlmIChtb2RlID09IE1fQ1VUKQorCQlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gKyAxOworCisJUkZBTFNFKG1vZGUgIT0gTV9QQVNURSB8fCB2aXJ0dWFsX2VudHJ5X251bSA9PSAwLAorCSAgICAgICAidnMtODAxNTogb2xkX2VudHJ5X251bTogbW9kZSBtdXN0IGJlIE1fUEFTVEUgKG1vZGUgPSBcJyVjXCciLAorCSAgICAgICBtb2RlKTsKKworCXJldHVybiB2aXJ0dWFsX2VudHJ5X251bSAtIDE7CiB9CiAKLQotCi0KIC8qIENyZWF0ZSBhbiBhcnJheSBvZiBzaXplcyBvZiBkaXJlY3RvcnkgZW50cmllcyBmb3IgdmlydHVhbAogICAgaXRlbS4gUmV0dXJuIHNwYWNlIHVzZWQgYnkgYW4gaXRlbS4gRklYTUU6IG5vIGNvbnRyb2wgb3ZlcgogICAgY29uc3VtaW5nIG9mIHNwYWNlIHVzZWQgYnkgdGhpcyBpdGVtIGhhbmRsZXIgKi8KLXN0YXRpYyBpbnQgZGlyZW50cnlfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCi0JCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgc2l6ZSA9IHNpemVvZiAoc3RydWN0IGRpcmVudHJ5X3VhcmVhKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgCi0gICAgdmktPnZpX2luZGV4ID0gVFlQRV9ESVJFTlRSWTsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOworCWludCBpLCBqOworCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBkaXJlbnRyeV91YXJlYSk7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKIAotICAgIGlmICghKHZpLT52aV9paCkgfHwgIXZpLT52aV9pdGVtKQotCUJVRyAoKTsKKwl2aS0+dmlfaW5kZXggPSBUWVBFX0RJUkVOVFJZOwogCisJaWYgKCEodmktPnZpX2loKSB8fCAhdmktPnZpX2l0ZW0pCisJCUJVRygpOwogCi0gICAgZGlyX3UtPmZsYWdzID0gMDsKLSAgICBpZiAobGVfaWhfa19vZmZzZXQgKHZpLT52aV9paCkgPT0gRE9UX09GRlNFVCkKLQlkaXJfdS0+ZmxhZ3MgfD0gRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTTsKKwlkaXJfdS0+ZmxhZ3MgPSAwOworCWlmIChsZV9paF9rX29mZnNldCh2aS0+dmlfaWgpID09IERPVF9PRkZTRVQpCisJCWRpcl91LT5mbGFncyB8PSBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNOwogCi0gICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKHZpLT52aV9pdGVtKTsKLSAgICAKLSAgICAKLSAgICAvKiB2aXJ0dWFsIGRpcmVjdG9yeSBpdGVtIGhhdmUgdGhpcyBhbW91bnQgb2YgZW50cnkgYWZ0ZXIgKi8KLSAgICBkaXJfdS0+ZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudCAodmktPnZpX2loKSArIAotCSgoaXNfYWZmZWN0ZWQpID8gKCh2bi0+dm5fbW9kZSA9PSBNX0NVVCkgPyAtMSA6Ci0JCQkgICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFID8gMSA6IDApKSA6IDApOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkgKyspIHsKLQlqID0gb2xkX2VudHJ5X251bSAoaXNfYWZmZWN0ZWQsIGksIHZuLT52bl9wb3NfaW5faXRlbSwgdm4tPnZuX21vZGUpOwotICAgICAgICBkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPSAoaiA/IGRlaF9sb2NhdGlvbiggJihkZWhbaiAtIDFdKSApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhfaXRlbV9sZW4gKHZpLT52aV9paCkpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtqXSkpICsgREVIX1NJWkU7Ci0gICAgfQorCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSh2aS0+dmlfaXRlbSk7CiAKLSAgICBzaXplICs9IChkaXJfdS0+ZW50cnlfY291bnQgKiBzaXplb2YgKHNob3J0KSk7Ci0gICAgCi0gICAgLyogc2V0IHNpemUgb2YgcGFzdGVkIGVudHJ5ICovCi0gICAgaWYgKGlzX2FmZmVjdGVkICYmIHZuLT52bl9tb2RlID09IE1fUEFTVEUpCi0JZGlyX3UtPmVudHJ5X3NpemVzW3ZuLT52bl9wb3NfaW5faXRlbV0gPSBpbnNlcnRfc2l6ZTsKKwkvKiB2aXJ0dWFsIGRpcmVjdG9yeSBpdGVtIGhhdmUgdGhpcyBhbW91bnQgb2YgZW50cnkgYWZ0ZXIgKi8KKwlkaXJfdS0+ZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudCh2aS0+dmlfaWgpICsKKwkgICAgKChpc19hZmZlY3RlZCkgPyAoKHZuLT52bl9tb2RlID09IE1fQ1VUKSA/IC0xIDoKKwkJCSAgICAgICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFID8gMSA6IDApKSA6IDApOwogCisJZm9yIChpID0gMDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudDsgaSsrKSB7CisJCWogPSBvbGRfZW50cnlfbnVtKGlzX2FmZmVjdGVkLCBpLCB2bi0+dm5fcG9zX2luX2l0ZW0sCisJCQkJICB2bi0+dm5fbW9kZSk7CisJCWRpcl91LT5lbnRyeV9zaXplc1tpXSA9CisJCSAgICAoaiA/IGRlaF9sb2NhdGlvbigmKGRlaFtqIC0gMV0pKSA6IGloX2l0ZW1fbGVuKHZpLT52aV9paCkpIC0KKwkJICAgIGRlaF9sb2NhdGlvbigmKGRlaFtqXSkpICsgREVIX1NJWkU7CisJfQorCisJc2l6ZSArPSAoZGlyX3UtPmVudHJ5X2NvdW50ICogc2l6ZW9mKHNob3J0KSk7CisKKwkvKiBzZXQgc2l6ZSBvZiBwYXN0ZWQgZW50cnkgKi8KKwlpZiAoaXNfYWZmZWN0ZWQgJiYgdm4tPnZuX21vZGUgPT0gTV9QQVNURSkKKwkJZGlyX3UtPmVudHJ5X3NpemVzW3ZuLT52bl9wb3NfaW5faXRlbV0gPSBpbnNlcnRfc2l6ZTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIC8qIGNvbXBhcmUgdG90YWwgc2l6ZSBvZiBlbnRyaWVzIHdpdGggaXRlbSBsZW5ndGggKi8KLSAgICB7Ci0JaW50IGssIGw7Ci0gICAgCi0JbCA9IDA7Ci0JZm9yIChrID0gMDsgayA8IGRpcl91LT5lbnRyeV9jb3VudDsgayArKykKLQkgICAgbCArPSBkaXJfdS0+ZW50cnlfc2l6ZXNba107Ci0gICAgCi0JaWYgKGwgKyBJSF9TSVpFICE9IHZpLT52aV9pdGVtX2xlbiArIAotCSAgICAoKGlzX2FmZmVjdGVkICYmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSkgPyBpbnNlcnRfc2l6ZSA6IDApICkgewotCSAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTgwMjU6IHNldF9lbnRyeV9zaXplczogKG1vZGU9PSVjLCBpbnNlcnRfc2l6ZT09JWQpLCBpbnZhbGlkIGxlbmd0aCBvZiBkaXJlY3RvcnkgaXRlbSIsCi0JCQkgICAgdm4tPnZuX21vZGUsIGluc2VydF9zaXplKTsKKwkvKiBjb21wYXJlIHRvdGFsIHNpemUgb2YgZW50cmllcyB3aXRoIGl0ZW0gbGVuZ3RoICovCisJeworCQlpbnQgaywgbDsKKworCQlsID0gMDsKKwkJZm9yIChrID0gMDsgayA8IGRpcl91LT5lbnRyeV9jb3VudDsgaysrKQorCQkJbCArPSBkaXJfdS0+ZW50cnlfc2l6ZXNba107CisKKwkJaWYgKGwgKyBJSF9TSVpFICE9IHZpLT52aV9pdGVtX2xlbiArCisJCSAgICAoKGlzX2FmZmVjdGVkCisJCSAgICAgICYmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFCisJCQkgIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSkgPyBpbnNlcnRfc2l6ZSA6IDApKSB7CisJCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJCSAgICAgICAidnMtODAyNTogc2V0X2VudHJ5X3NpemVzOiAobW9kZT09JWMsIGluc2VydF9zaXplPT0lZCksIGludmFsaWQgbGVuZ3RoIG9mIGRpcmVjdG9yeSBpdGVtIiwKKwkJCQkgICAgICAgdm4tPnZuX21vZGUsIGluc2VydF9zaXplKTsKKwkJfQogCX0KLSAgICB9CiAjZW5kaWYKIAotICAgIHJldHVybiBzaXplOwotCisJcmV0dXJuIHNpemU7CiAKIH0KIAotCiAvLwogLy8gcmV0dXJuIG51bWJlciBvZiBlbnRyaWVzIHdoaWNoIG1heSBmaXQgaW50byBzcGVjaWZpZWQgYW1vdW50IG9mCiAvLyBmcmVlIHNwYWNlLCBvciAtMSBpZiBmcmVlIHNwYWNlIGlzIG5vdCBlbm91Z2ggZXZlbiBmb3IgMSBlbnRyeQogLy8KLXN0YXRpYyBpbnQgZGlyZW50cnlfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKLQkJCQlpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQorc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19sZWZ0KHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKnZpLCBpbnQgZnJlZSwKKwkJCSAgICAgICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQogewotICAgIGludCBpOwotICAgIGludCBlbnRyaWVzID0gMDsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKwlpbnQgaTsKKwlpbnQgZW50cmllcyA9IDA7CisJc3RydWN0IGRpcmVudHJ5X3VhcmVhICpkaXJfdSA9IHZpLT52aV91YXJlYTsKIAotICAgIGZvciAoaSA9IHN0YXJ0X3NraXA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQgLSBlbmRfc2tpcDsgaSArKykgewotCWlmIChkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPiBmcmVlKQotCSAgICAvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCi0JICAgIGJyZWFrOwotCQkgIAotCWZyZWUgLT0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOwotCWVudHJpZXMgKys7Ci0gICAgfQorCWZvciAoaSA9IHN0YXJ0X3NraXA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQgLSBlbmRfc2tpcDsgaSsrKSB7CisJCWlmIChkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPiBmcmVlKQorCQkJLyogaS10aCBlbnRyeSBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSAqLworCQkJYnJlYWs7CiAKLSAgICBpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpIHsKLQlyZWlzZXJmc19wYW5pYyAoTlVMTCwgImZyZWUgc3BhY2UgJWQsIGVudHJ5X2NvdW50ICVkXG4iLCBmcmVlLCBkaXJfdS0+ZW50cnlfY291bnQpOwotICAgIH0KKwkJZnJlZSAtPSBkaXJfdS0+ZW50cnlfc2l6ZXNbaV07CisJCWVudHJpZXMrKzsKKwl9CiAKLSAgICAvKiAiLiIgYW5kICIuLiIgY2FuIG5vdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyICovCi0gICAgaWYgKHN0YXJ0X3NraXAgPT0gMCAmJiAoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkgJiYgZW50cmllcyA8IDIpCi0JZW50cmllcyA9IDA7Ci0gICAgCi0gICAgcmV0dXJuIGVudHJpZXMgPzogLTE7CisJaWYgKGVudHJpZXMgPT0gZGlyX3UtPmVudHJ5X2NvdW50KSB7CisJCXJlaXNlcmZzX3BhbmljKE5VTEwsICJmcmVlIHNwYWNlICVkLCBlbnRyeV9jb3VudCAlZFxuIiwgZnJlZSwKKwkJCSAgICAgICBkaXJfdS0+ZW50cnlfY291bnQpOworCX0KKworCS8qICIuIiBhbmQgIi4uIiBjYW4gbm90IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgKi8KKwlpZiAoc3RhcnRfc2tpcCA9PSAwICYmIChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKQorCSAgICAmJiBlbnRyaWVzIDwgMikKKwkJZW50cmllcyA9IDA7CisKKwlyZXR1cm4gZW50cmllcyA/IDogLTE7CiB9CiAKLQotc3RhdGljIGludCBkaXJlbnRyeV9jaGVja19yaWdodCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfY2hlY2tfcmlnaHQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlKQogewotICAgIGludCBpOwotICAgIGludCBlbnRyaWVzID0gMDsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKLSAgICAKLSAgICBmb3IgKGkgPSBkaXJfdS0+ZW50cnlfY291bnQgLSAxOyBpID49IDA7IGkgLS0pIHsKLQlpZiAoZGlyX3UtPmVudHJ5X3NpemVzW2ldID4gZnJlZSkKLQkgICAgLyogaS10aCBlbnRyeSBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSAqLwotCSAgICBicmVhazsKLQkKLQlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKLQllbnRyaWVzICsrOwotICAgIH0KLSAgICBpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpCi0JQlVHICgpOworCWludCBpOworCWludCBlbnRyaWVzID0gMDsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOwogCi0gICAgLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLwotICAgIGlmICgoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkgJiYgZW50cmllcyA+IGRpcl91LT5lbnRyeV9jb3VudCAtIDIpCi0JZW50cmllcyA9IGRpcl91LT5lbnRyeV9jb3VudCAtIDI7CisJZm9yIChpID0gZGlyX3UtPmVudHJ5X2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGRpcl91LT5lbnRyeV9zaXplc1tpXSA+IGZyZWUpCisJCQkvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCisJCQlicmVhazsKIAotICAgIHJldHVybiBlbnRyaWVzID86IC0xOworCQlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwkJZW50cmllcysrOworCX0KKwlpZiAoZW50cmllcyA9PSBkaXJfdS0+ZW50cnlfY291bnQpCisJCUJVRygpOworCisJLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLworCWlmICgoZGlyX3UtPmZsYWdzICYgRElSRU5UUllfVklfRklSU1RfRElSRU5UUllfSVRFTSkKKwkgICAgJiYgZW50cmllcyA+IGRpcl91LT5lbnRyeV9jb3VudCAtIDIpCisJCWVudHJpZXMgPSBkaXJfdS0+ZW50cnlfY291bnQgLSAyOworCisJcmV0dXJuIGVudHJpZXMgPyA6IC0xOwogfQogCi0KIC8qIHN1bSBvZiBlbnRyeSBzaXplcyBiZXR3ZWVuIGZyb20tdGggYW5kIHRvLXRoIGVudHJpZXMgaW5jbHVkaW5nIGJvdGggZWRnZXMgKi8KLXN0YXRpYyBpbnQgZGlyZW50cnlfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQorc3RhdGljIGludCBkaXJlbnRyeV9wYXJ0X3NpemUoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmaXJzdCwgaW50IGNvdW50KQogewotICAgIGludCBpLCByZXR2YWw7Ci0gICAgaW50IGZyb20sIHRvOwotICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOwotICAgIAotICAgIHJldHZhbCA9IDA7Ci0gICAgaWYgKGZpcnN0ID09IDApCi0JZnJvbSA9IDA7Ci0gICAgZWxzZQotCWZyb20gPSBkaXJfdS0+ZW50cnlfY291bnQgLSBjb3VudDsKLSAgICB0byA9IGZyb20gKyBjb3VudCAtIDE7CisJaW50IGksIHJldHZhbDsKKwlpbnQgZnJvbSwgdG87CisJc3RydWN0IGRpcmVudHJ5X3VhcmVhICpkaXJfdSA9IHZpLT52aV91YXJlYTsKIAotICAgIGZvciAoaSA9IGZyb207IGkgPD0gdG87IGkgKyspCi0JcmV0dmFsICs9IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwlyZXR2YWwgPSAwOworCWlmIChmaXJzdCA9PSAwKQorCQlmcm9tID0gMDsKKwllbHNlCisJCWZyb20gPSBkaXJfdS0+ZW50cnlfY291bnQgLSBjb3VudDsKKwl0byA9IGZyb20gKyBjb3VudCAtIDE7CiAKLSAgICByZXR1cm4gcmV0dmFsOworCWZvciAoaSA9IGZyb207IGkgPD0gdG87IGkrKykKKwkJcmV0dmFsICs9IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKworCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgZGlyZW50cnlfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyBpbnQgZGlyZW50cnlfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgc3RydWN0IGRpcmVudHJ5X3VhcmVhICogZGlyX3UgPSB2aS0+dmlfdWFyZWE7Ci0gICAgCi0gICAgcmV0dXJuIGRpcl91LT5lbnRyeV9jb3VudDsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOworCisJcmV0dXJuIGRpcl91LT5lbnRyeV9jb3VudDsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGRpcmVudHJ5X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBkaXJlbnRyeV9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKiBkaXJfdSA9IHZpLT52aV91YXJlYTsKKwlpbnQgaTsKKwlzdHJ1Y3QgZGlyZW50cnlfdWFyZWEgKmRpcl91ID0gdmktPnZpX3VhcmVhOwogCi0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIkRJUkVOVFJZLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCwgZmxhZ3MgMHgleCIsCi0JCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCwgZGlyX3UtPmZsYWdzKTsKLSAgICBwcmludGsgKCIlZCBlbnRyaWVzOiAiLCBkaXJfdS0+ZW50cnlfY291bnQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkgKyspCi0JcHJpbnRrICgiJWQgIiwgZGlyX3UtPmVudHJ5X3NpemVzW2ldKTsKLSAgICBwcmludGsgKCJcbiIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgIkRJUkVOVFJZLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCwgZmxhZ3MgMHgleCIsCisJCQkgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loLCBkaXJfdS0+ZmxhZ3MpOworCXByaW50aygiJWQgZW50cmllczogIiwgZGlyX3UtPmVudHJ5X2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgZGlyX3UtPmVudHJ5X2NvdW50OyBpKyspCisJCXByaW50aygiJWQgIiwgZGlyX3UtPmVudHJ5X3NpemVzW2ldKTsKKwlwcmludGsoIlxuIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGRpcmVudHJ5X29wcyA9IHsKLQkuYnl0ZXNfbnVtYmVyCQk9IGRpcmVudHJ5X2J5dGVzX251bWJlciwKLQkuZGVjcmVtZW50X2tleQkJPSBkaXJlbnRyeV9kZWNyZW1lbnRfa2V5LAotCS5pc19sZWZ0X21lcmdlYWJsZQk9IGRpcmVudHJ5X2lzX2xlZnRfbWVyZ2VhYmxlLAotCS5wcmludF9pdGVtCQk9IGRpcmVudHJ5X3ByaW50X2l0ZW0sCi0JLmNoZWNrX2l0ZW0JCT0gZGlyZW50cnlfY2hlY2tfaXRlbSwKKwkuYnl0ZXNfbnVtYmVyID0gZGlyZW50cnlfYnl0ZXNfbnVtYmVyLAorCS5kZWNyZW1lbnRfa2V5ID0gZGlyZW50cnlfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUgPSBkaXJlbnRyeV9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbSA9IGRpcmVudHJ5X3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0gPSBkaXJlbnRyeV9jaGVja19pdGVtLAogCi0JLmNyZWF0ZV92aQkJPSBkaXJlbnRyeV9jcmVhdGVfdmksCi0JLmNoZWNrX2xlZnQJCT0gZGlyZW50cnlfY2hlY2tfbGVmdCwKLQkuY2hlY2tfcmlnaHQJCT0gZGlyZW50cnlfY2hlY2tfcmlnaHQsCi0JLnBhcnRfc2l6ZQkJPSBkaXJlbnRyeV9wYXJ0X3NpemUsCi0JLnVuaXRfbnVtCQk9IGRpcmVudHJ5X3VuaXRfbnVtLAotCS5wcmludF92aQkJPSBkaXJlbnRyeV9wcmludF92aQorCS5jcmVhdGVfdmkgPSBkaXJlbnRyeV9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQgPSBkaXJlbnRyeV9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodCA9IGRpcmVudHJ5X2NoZWNrX3JpZ2h0LAorCS5wYXJ0X3NpemUgPSBkaXJlbnRyeV9wYXJ0X3NpemUsCisJLnVuaXRfbnVtID0gZGlyZW50cnlfdW5pdF9udW0sCisJLnByaW50X3ZpID0gZGlyZW50cnlfcHJpbnRfdmkKIH07CiAKLQogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBFcnJvciBjYXRjaGluZyBmdW5jdGlvbnMgdG8gY2F0Y2ggZXJyb3JzIGNhdXNlZCBieSBpbmNvcnJlY3QgaXRlbSB0eXBlcy4KIC8vCi1zdGF0aWMgaW50IGVycmNhdGNoX2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfYnl0ZXNfbnVtYmVyKHN0cnVjdCBpdGVtX2hlYWQgKmloLCBpbnQgYmxvY2tfc2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDE6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwMTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZXJyY2F0Y2hfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9kZWNyZW1lbnRfa2V5KHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDAyOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDI6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CiB9CiAKLQotc3RhdGljIGludCBlcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfaXNfbGVmdF9tZXJnZWFibGUoc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYnNpemUpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDAzOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDM6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgZXJyY2F0Y2hfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGVycmNhdGNoX3ByaW50X2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA0OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDQ6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CiB9CiAKLQotc3RhdGljIHZvaWQgZXJyY2F0Y2hfY2hlY2tfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3N0YXRpYyB2b2lkIGVycmNhdGNoX2NoZWNrX2l0ZW0oc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNoYXIgKml0ZW0pCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA1OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDU6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CiB9CiAKLXN0YXRpYyBpbnQgZXJyY2F0Y2hfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCi0JCQkgICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJCSAgICAgICBpbnQgaXNfYWZmZWN0ZWQsIAotCQkJICAgICAgIGludCBpbnNlcnRfc2l6ZSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfY3JlYXRlX3ZpKHN0cnVjdCB2aXJ0dWFsX25vZGUgKnZuLAorCQkJICAgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksCisJCQkgICAgICBpbnQgaXNfYWZmZWN0ZWQsIGludCBpbnNlcnRfc2l6ZSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDY6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Ci0gICAgcmV0dXJuIDA7CS8vIFdlIG1pZ2h0IHJldHVybiAtMSBoZXJlIGFzIHdlbGwsIGJ1dCBpdCB3b24ndCBoZWxwIGFzIGNyZWF0ZV92aXJ0dWFsX25vZGUoKSBmcm9tIHdoZXJlCi0JCS8vIHRoaXMgb3BlcmF0aW9uIGlzIGNhbGxlZCBmcm9tIGlzIG9mIHJldHVybiB0eXBlIHZvaWQuCisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAwNjogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKwlyZXR1cm4gMDsJCS8vIFdlIG1pZ2h0IHJldHVybiAtMSBoZXJlIGFzIHdlbGwsIGJ1dCBpdCB3b24ndCBoZWxwIGFzIGNyZWF0ZV92aXJ0dWFsX25vZGUoKSBmcm9tIHdoZXJlCisJLy8gdGhpcyBvcGVyYXRpb24gaXMgY2FsbGVkIGZyb20gaXMgb2YgcmV0dXJuIHR5cGUgdm9pZC4KIH0KIAotc3RhdGljIGludCBlcnJjYXRjaF9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAotCQkJCWludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCitzdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX2xlZnQoc3RydWN0IHZpcnR1YWxfaXRlbSAqdmksIGludCBmcmVlLAorCQkJICAgICAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA3OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAtMTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDA3OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJldHVybiAtMTsKIH0KIAotCi1zdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQorc3RhdGljIGludCBlcnJjYXRjaF9jaGVja19yaWdodChzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZyZWUpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA4OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAtMTsKKwlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkgImdyZWVuLTE2MDA4OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBlcnJjYXRjaF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCitzdGF0aWMgaW50IGVycmNhdGNoX3BhcnRfc2l6ZShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA5OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMDk6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXJyY2F0Y2hfdW5pdF9udW0gKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfdW5pdF9udW0oc3RydWN0IHZpcnR1YWxfaXRlbSAqdmkpCiB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDEwOiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOwotICAgIHJldHVybiAwOworCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCSAiZ3JlZW4tMTYwMTA6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGVycmNhdGNoX3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9wcmludF92aShzdHJ1Y3QgdmlydHVhbF9pdGVtICp2aSkKIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMTE6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJICJncmVlbi0xNjAxMTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgZXJyY2F0Y2hfb3BzID0gewotICAgIGVycmNhdGNoX2J5dGVzX251bWJlciwKLSAgICBlcnJjYXRjaF9kZWNyZW1lbnRfa2V5LAotICAgIGVycmNhdGNoX2lzX2xlZnRfbWVyZ2VhYmxlLAotICAgIGVycmNhdGNoX3ByaW50X2l0ZW0sCi0gICAgZXJyY2F0Y2hfY2hlY2tfaXRlbSwKKwllcnJjYXRjaF9ieXRlc19udW1iZXIsCisJZXJyY2F0Y2hfZGVjcmVtZW50X2tleSwKKwllcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZSwKKwllcnJjYXRjaF9wcmludF9pdGVtLAorCWVycmNhdGNoX2NoZWNrX2l0ZW0sCiAKLSAgICBlcnJjYXRjaF9jcmVhdGVfdmksCi0gICAgZXJyY2F0Y2hfY2hlY2tfbGVmdCwKLSAgICBlcnJjYXRjaF9jaGVja19yaWdodCwKLSAgICBlcnJjYXRjaF9wYXJ0X3NpemUsCi0gICAgZXJyY2F0Y2hfdW5pdF9udW0sCi0gICAgZXJyY2F0Y2hfcHJpbnRfdmkKKwllcnJjYXRjaF9jcmVhdGVfdmksCisJZXJyY2F0Y2hfY2hlY2tfbGVmdCwKKwllcnJjYXRjaF9jaGVja19yaWdodCwKKwllcnJjYXRjaF9wYXJ0X3NpemUsCisJZXJyY2F0Y2hfdW5pdF9udW0sCisJZXJyY2F0Y2hfcHJpbnRfdmkKIH07CiAKLQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCiAvLwogI2lmICEgKFRZUEVfU1RBVF9EQVRBID09IDAgJiYgVFlQRV9JTkRJUkVDVCA9PSAxICYmIFRZUEVfRElSRUNUID09IDIgJiYgVFlQRV9ESVJFTlRSWSA9PSAzKQotICBkbyBub3QgY29tcGlsZQorI2Vycm9yIEl0ZW0gdHlwZXMgbXVzdCB1c2UgZGlzay1mb3JtYXQgYXNzaWduZWQgdmFsdWVzLgogI2VuZGlmCiAKLXN0cnVjdCBpdGVtX29wZXJhdGlvbnMgKiBpdGVtX29wcyBbVFlQRV9BTlkgKyAxXSA9IHsKLSAgJnN0YXRfZGF0YV9vcHMsCi0gICZpbmRpcmVjdF9vcHMsCi0gICZkaXJlY3Rfb3BzLAotICAmZGlyZW50cnlfb3BzLAotICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAmZXJyY2F0Y2hfb3BzCQkvKiBUaGlzIGlzIHRvIGNhdGNoIGVycm9ycyB3aXRoIGludmFsaWQgdHlwZSAoMTV0aCBlbnRyeSBmb3IgVFlQRV9BTlkpICovCitzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zICppdGVtX29wc1tUWVBFX0FOWSArIDFdID0geworCSZzdGF0X2RhdGFfb3BzLAorCSZpbmRpcmVjdF9vcHMsCisJJmRpcmVjdF9vcHMsCisJJmRpcmVudHJ5X29wcywKKwlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCSZlcnJjYXRjaF9vcHMJCS8qIFRoaXMgaXMgdG8gY2F0Y2ggZXJyb3JzIHdpdGggaW52YWxpZCB0eXBlICgxNXRoIGVudHJ5IGZvciBUWVBFX0FOWSkgKi8KIH07Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwppbmRleCAzMDcyY2ZkLi5jNjZjMjdlIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMKKysrIGIvZnMvcmVpc2VyZnMvam91cm5hbC5jCkBAIC01NSw3ICs1NSw2IEBACiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAKLQogLyogZ2V0cyBhIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKiBmcm9tIGEgbGlzdCBoZWFkICovCiAjZGVmaW5lIEpPVVJOQUxfTElTVF9FTlRSWShoKSAobGlzdF9lbnRyeSgoaCksIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqX2xpc3QpKQpAQCAtNjksNTUgKzY4LDYxIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29tbWl0X3dxOwogCi0jZGVmaW5lIEpPVVJOQUxfVFJBTlNfSEFMRiAxMDE4ICAgLyogbXVzdCBiZSBjb3JyZWN0IHRvIGtlZXAgdGhlIGRlc2MgYW5kIGNvbW1pdAotCQkJCSAgICAgc3RydWN0cyBhdCA0ayAqLwotI2RlZmluZSBCVUZOUiA2NCAvKnJlYWQgYWhlYWQgKi8KKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19IQUxGIDEwMTgJLyogbXVzdCBiZSBjb3JyZWN0IHRvIGtlZXAgdGhlIGRlc2MgYW5kIGNvbW1pdAorCQkJCSAgIHN0cnVjdHMgYXQgNGsgKi8KKyNkZWZpbmUgQlVGTlIgNjQJCS8qcmVhZCBhaGVhZCAqLwogCiAvKiBjbm9kZSBzdGF0IGJpdHMuICBNb3ZlIHRoZXNlIGludG8gcmVpc2VyZnNfZnMuaCAqLwogCiAjZGVmaW5lIEJMT0NLX0ZSRUVEIDIJCS8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbi4gICovCi0jZGVmaW5lIEJMT0NLX0ZSRUVEX0hPTERFUiAzICAgIC8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbiAqLworI2RlZmluZSBCTE9DS19GUkVFRF9IT0xERVIgMwkvKiB0aGlzIGJsb2NrIHdhcyBmcmVlZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiwgYW5kIGNhbid0IGJlIHdyaXR0ZW4gKi8KIAogI2RlZmluZSBCTE9DS19ORUVEU19GTFVTSCA0CS8qIHVzZWQgaW4gZmx1c2hfam91cm5hbF9saXN0ICovCiAjZGVmaW5lIEJMT0NLX0RJUlRJRUQgNQogCi0KIC8qIGpvdXJuYWwgbGlzdCBzdGF0ZSBiaXRzICovCiAjZGVmaW5lIExJU1RfVE9VQ0hFRCAxCiAjZGVmaW5lIExJU1RfRElSVFkgICAyCi0jZGVmaW5lIExJU1RfQ09NTUlUX1BFTkRJTkcgIDQJCS8qIHNvbWVvbmUgd2lsbCBjb21taXQgdGhpcyBsaXN0ICovCisjZGVmaW5lIExJU1RfQ09NTUlUX1BFTkRJTkcgIDQJLyogc29tZW9uZSB3aWxsIGNvbW1pdCB0aGlzIGxpc3QgKi8KIAogLyogZmxhZ3MgZm9yIGRvX2pvdXJuYWxfZW5kICovCiAjZGVmaW5lIEZMVVNIX0FMTCAgIDEJCS8qIGZsdXNoIGNvbW1pdCBhbmQgcmVhbCBibG9ja3MgKi8KICNkZWZpbmUgQ09NTUlUX05PVyAgMgkJLyogZW5kIGFuZCBjb21taXQgdGhpcyB0cmFuc2FjdGlvbiAqLwotI2RlZmluZSBXQUlUICAgICAgICA0CQkvKiB3YWl0IGZvciB0aGUgbG9nIGJsb2NrcyB0byBoaXQgdGhlIGRpc2sqLworI2RlZmluZSBXQUlUICAgICAgICA0CQkvKiB3YWl0IGZvciB0aGUgbG9nIGJsb2NrcyB0byBoaXQgdGhlIGRpc2sgKi8KIAotc3RhdGljIGludCBkb19qb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosc3RydWN0IHN1cGVyX2Jsb2NrICosdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBmbGFncykgOwotc3RhdGljIGludCBmbHVzaF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSA7Ci1zdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgIDsKLXN0YXRpYyBpbnQgY2FuX2RpcnR5KHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgOwotc3RhdGljIGludCBqb3VybmFsX2pvaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpOwotc3RhdGljIGludCByZWxlYXNlX2pvdXJuYWxfZGV2KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAotCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsICk7CitzdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywKKwkJCSAgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgZmx1c2hfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCSAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpOworc3RhdGljIGludCBmbHVzaF9jb21taXRfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpOworc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKTsKK3N0YXRpYyBpbnQgam91cm5hbF9qb2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2Nrcyk7CitzdGF0aWMgaW50IHJlbGVhc2Vfam91cm5hbF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCk7CiBzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCk7CisJCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKTsKIHN0YXRpYyB2b2lkIGZsdXNoX2FzeW5jX2NvbW1pdHModm9pZCAqcCk7CiBzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CiAKIC8qIHZhbHVlcyBmb3Igam9pbiBpbiBkb19qb3VybmFsX2JlZ2luX3IgKi8KIGVudW0gewotICAgIEpCRUdJTl9SRUcgPSAwLCAvKiByZWd1bGFyIGpvdXJuYWwgYmVnaW4gKi8KLSAgICBKQkVHSU5fSk9JTiA9IDEsIC8qIGpvaW4gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gaWYgYXQgYWxsIHBvc3NpYmxlICovCi0gICAgSkJFR0lOX0FCT1JUID0gMiwgLyogY2FsbGVkIGZyb20gY2xlYW51cCBjb2RlLCBpZ25vcmVzIGFib3J0ZWQgZmxhZyAqLworCUpCRUdJTl9SRUcgPSAwLAkJLyogcmVndWxhciBqb3VybmFsIGJlZ2luICovCisJSkJFR0lOX0pPSU4gPSAxLAkvKiBqb2luIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIGF0IGFsbCBwb3NzaWJsZSAqLworCUpCRUdJTl9BQk9SVCA9IDIsCS8qIGNhbGxlZCBmcm9tIGNsZWFudXAgY29kZSwgaWdub3JlcyBhYm9ydGVkIGZsYWcgKi8KIH07CiAKIHN0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcyxpbnQgam9pbik7CisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbmJsb2NrcywgaW50IGpvaW4pOwogCi1zdGF0aWMgdm9pZCBpbml0X2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIG1lbXNldChqb3VybmFsLT5qX2hhc2hfdGFibGUsIDAsIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKSA7CitzdGF0aWMgdm9pZCBpbml0X2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwltZW1zZXQoam91cm5hbC0+al9oYXNoX3RhYmxlLCAwLAorCSAgICAgICBKT1VSTkFMX0hBU0hfU0laRSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKSk7CiB9CiAKIC8qCkBAIC0xMjUsMTQ5ICsxMzAsMTU5IEBACiAqKiBtYWtlIHNjaGVkdWxlIGhhcHBlbiBhZnRlciBJJ3ZlIGZyZWVkIGEgYmxvY2suICBMb29rIGF0IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uIGFuZCBqb3VybmFsX21hcmtfZnJlZWQgZm9yCiAqKiBtb3JlIGRldGFpbHMuCiAqLwotc3RhdGljIGludCByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBpZiAoYmgpIHsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOwotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOwotICB9Ci0gIHJldHVybiAwIDsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY2xlYW5fYW5kX2ZpbGVfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKGJoKSB7CisJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGlzYWJsZV9iYXJyaWVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfigxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gpOwotICAgIHByaW50aygicmVpc2VyZnM6IGRpc2FibGluZyBmbHVzaCBiYXJyaWVycyBvbiAlc1xuIiwgcmVpc2VyZnNfYmRldm5hbWUocykpOworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSCk7CisJcHJpbnRrKCJyZWlzZXJmczogZGlzYWJsaW5nIGZsdXNoIGJhcnJpZXJzIG9uICVzXG4iLAorCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKgotYWxsb2NhdGVfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA7Ci0gIHN0YXRpYyBpbnQgaWQ7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICphbGxvY2F0ZV9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sKKwkJCQkJCQkgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuOworCXN0YXRpYyBpbnQgaWQ7CiAKLSAgYm4gPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBHRlBfTk9GUywgcF9zX3NiKSA7Ci0gIGlmICghYm4pIHsKLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgYm4tPmRhdGEgPSByZWlzZXJmc19rbWFsbG9jKHBfc19zYi0+c19ibG9ja3NpemUsIEdGUF9OT0ZTLCBwX3Nfc2IpIDsKLSAgaWYgKCFibi0+ZGF0YSkgewotICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIGJuLT5pZCA9IGlkKysgOwotICBtZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpIDsKLSAgSU5JVF9MSVNUX0hFQUQoJmJuLT5saXN0KSA7Ci0gIHJldHVybiBibiA7CisJYm4gPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBHRlBfTk9GUywKKwkJCSAgICAgIHBfc19zYik7CisJaWYgKCFibikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm4tPmRhdGEgPSByZWlzZXJmc19rbWFsbG9jKHBfc19zYi0+c19ibG9ja3NpemUsIEdGUF9OT0ZTLCBwX3Nfc2IpOworCWlmICghYm4tPmRhdGEpIHsKKwkJcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYm4tPmlkID0gaWQrKzsKKwltZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpOworCUlOSVRfTElTVF9IRUFEKCZibi0+bGlzdCk7CisJcmV0dXJuIGJuOwogfQogCi1zdGF0aWMgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICoKLWdldF9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gPSBOVUxMOwotICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9IGpvdXJuYWwtPmpfYml0bWFwX25vZGVzLm5leHQgOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqZ2V0X2JpdG1hcF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dDsKIAotICBqb3VybmFsLT5qX3VzZWRfYml0bWFwX25vZGVzKysgOwotcmVwZWF0OgorCWpvdXJuYWwtPmpfdXNlZF9iaXRtYXBfbm9kZXMrKzsKKyAgICAgIHJlcGVhdDoKIAotICBpZihlbnRyeSAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKLSAgICBibiA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSwgbGlzdCkgOwotICAgIGxpc3RfZGVsKGVudHJ5KSA7Ci0gICAgbWVtc2V0KGJuLT5kYXRhLCAwLCBwX3Nfc2ItPnNfYmxvY2tzaXplKSA7Ci0gICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2Rlcy0tIDsKLSAgICByZXR1cm4gYm4gOwotICB9Ci0gIGJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKSA7Ci0gIGlmICghYm4pIHsKLSAgICB5aWVsZCgpOwotICAgIGdvdG8gcmVwZWF0IDsKLSAgfQotICByZXR1cm4gYm4gOworCWlmIChlbnRyeSAhPSAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIHsKKwkJYm4gPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUsIGxpc3QpOworCQlsaXN0X2RlbChlbnRyeSk7CisJCW1lbXNldChibi0+ZGF0YSwgMCwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCWpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMtLTsKKwkJcmV0dXJuIGJuOworCX0KKwlibiA9IGFsbG9jYXRlX2JpdG1hcF9ub2RlKHBfc19zYik7CisJaWYgKCFibikgeworCQl5aWVsZCgpOworCQlnb3RvIHJlcGVhdDsKKwl9CisJcmV0dXJuIGJuOwogfQogc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2Rlcy0tIDsKLSAgaWYgKGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMgPiBSRUlTRVJGU19NQVhfQklUTUFQX05PREVTKSB7Ci0gICAgcmVpc2VyZnNfa2ZyZWUoYm4tPmRhdGEsIHBfc19zYi0+c19ibG9ja3NpemUsIHBfc19zYikgOwotICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7Ci0gIH0gZWxzZSB7Ci0gICAgbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKLSAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzKysgOwotICB9CisJCQkJICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4pCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJam91cm5hbC0+al91c2VkX2JpdG1hcF9ub2Rlcy0tOworCWlmIChqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzID4gUkVJU0VSRlNfTUFYX0JJVE1BUF9OT0RFUykgeworCQlyZWlzZXJmc19rZnJlZShibi0+ZGF0YSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgcF9zX3NiKTsKKwkJcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpOworCX0gZWxzZSB7CisJCWxpc3RfYWRkKCZibi0+bGlzdCwgJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKTsKKwkJam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrOworCX0KIH0KIAotc3RhdGljIHZvaWQgYWxsb2NhdGVfYml0bWFwX25vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIGludCBpIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuID0gTlVMTCA7Ci0gIGZvciAoaSA9IDAgOyBpIDwgUkVJU0VSRlNfTUlOX0JJVE1BUF9OT0RFUyA7IGkrKykgewotICAgIGJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKSA7Ci0gICAgaWYgKGJuKSB7Ci0gICAgICBsaXN0X2FkZCgmYm4tPmxpc3QsICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgOwotICAgICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrIDsKLSAgICB9IGVsc2UgewotICAgICAgYnJlYWsgOyAvLyB0aGlzIGlzIG9rLCB3ZSdsbCB0cnkgYWdhaW4gd2hlbiBtb3JlIGFyZSBuZWVkZWQgCi0gICAgfQotICB9CitzdGF0aWMgdm9pZCBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJaW50IGk7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICpibiA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IFJFSVNFUkZTX01JTl9CSVRNQVBfTk9ERVM7IGkrKykgeworCQlibiA9IGFsbG9jYXRlX2JpdG1hcF9ub2RlKHBfc19zYik7CisJCWlmIChibikgeworCQkJbGlzdF9hZGQoJmJuLT5saXN0LCAmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpOworCQkJam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CS8vIHRoaXMgaXMgb2ssIHdlJ2xsIHRyeSBhZ2FpbiB3aGVuIG1vcmUgYXJlIG5lZWRlZCAKKwkJfQorCX0KIH0KIAogc3RhdGljIGludCBzZXRfYml0X2luX2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYikgewotICBpbnQgYm1hcF9uciA9IGJsb2NrIC8gKHBfc19zYi0+c19ibG9ja3NpemUgPDwgMykgOwotICBpbnQgYml0X25yID0gYmxvY2sgJSAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSA7CisJCQkJICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKQoreworCWludCBibWFwX25yID0gYmxvY2sgLyAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwlpbnQgYml0X25yID0gYmxvY2sgJSAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKIAotICBpZiAoIWpiLT5iaXRtYXBzW2JtYXBfbnJdKSB7Ci0gICAgamItPmJpdG1hcHNbYm1hcF9ucl0gPSBnZXRfYml0bWFwX25vZGUocF9zX3NiKSA7Ci0gIH0KLSAgc2V0X2JpdChiaXRfbnIsICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpIDsKLSAgcmV0dXJuIDAgOworCWlmICghamItPmJpdG1hcHNbYm1hcF9ucl0pIHsKKwkJamItPmJpdG1hcHNbYm1hcF9ucl0gPSBnZXRfYml0bWFwX25vZGUocF9zX3NiKTsKKwl9CisJc2V0X2JpdChiaXRfbnIsICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhbnVwX2JpdG1hcF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiKSB7Ci0gIGludCBpOwotICBpZiAoamItPmJpdG1hcHMgPT0gTlVMTCkKLSAgICByZXR1cm47CisJCQkJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYikKK3sKKwlpbnQgaTsKKwlpZiAoamItPmJpdG1hcHMgPT0gTlVMTCkKKwkJcmV0dXJuOwogCi0gIGZvciAoaSA9IDAgOyBpIDwgU0JfQk1BUF9OUihwX3Nfc2IpIDsgaSsrKSB7Ci0gICAgaWYgKGpiLT5iaXRtYXBzW2ldKSB7Ci0gICAgICBmcmVlX2JpdG1hcF9ub2RlKHBfc19zYiwgamItPmJpdG1hcHNbaV0pIDsKLSAgICAgIGpiLT5iaXRtYXBzW2ldID0gTlVMTCA7Ci0gICAgfQotICB9CisJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocF9zX3NiKTsgaSsrKSB7CisJCWlmIChqYi0+Yml0bWFwc1tpXSkgeworCQkJZnJlZV9iaXRtYXBfbm9kZShwX3Nfc2IsIGpiLT5iaXRtYXBzW2ldKTsKKwkJCWpiLT5iaXRtYXBzW2ldID0gTlVMTDsKKwkJfQorCX0KIH0KIAogLyoKICoqIG9ubHkgY2FsbCB0aGlzIG9uIEZTIHVubW91bnQuCiAqLwogc3RhdGljIGludCBmcmVlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSkgewotICBpbnQgaSA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOwotICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKLSAgICBqYiA9IGpiX2FycmF5ICsgaSA7Ci0gICAgamItPmpvdXJuYWxfbGlzdCA9IE5VTEwgOwotICAgIGNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYikgOwotICAgIHZmcmVlKGpiLT5iaXRtYXBzKSA7Ci0gICAgamItPmJpdG1hcHMgPSBOVUxMIDsKLSAgfQotICByZXR1cm4gMDsKKwkJCSAgICAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYl9hcnJheSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiOworCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJamIgPSBqYl9hcnJheSArIGk7CisJCWpiLT5qb3VybmFsX2xpc3QgPSBOVUxMOworCQljbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpOworCQl2ZnJlZShqYi0+Yml0bWFwcyk7CisJCWpiLT5iaXRtYXBzID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZnJlZV9iaXRtYXBfbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dCA7Ci0gIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4gOworc3RhdGljIGludCBmcmVlX2JpdG1hcF9ub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dDsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuOwogCi0gIHdoaWxlKG5leHQgIT0gJmpvdXJuYWwtPmpfYml0bWFwX25vZGVzKSB7Ci0gICAgYm4gPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSwgbGlzdCkgOwotICAgIGxpc3RfZGVsKG5leHQpIDsKLSAgICByZWlzZXJmc19rZnJlZShibi0+ZGF0YSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgcF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpIDsKLSAgICBuZXh0ID0gam91cm5hbC0+al9iaXRtYXBfbm9kZXMubmV4dCA7Ci0gICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2Rlcy0tIDsKLSAgfQorCXdoaWxlIChuZXh0ICE9ICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgeworCQlibiA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwobmV4dCk7CisJCXJlaXNlcmZzX2tmcmVlKGJuLT5kYXRhLCBwX3Nfc2ItPnNfYmxvY2tzaXplLCBwX3Nfc2IpOworCQlyZWlzZXJmc19rZnJlZShibiwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIHBfc19zYik7CisJCW5leHQgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0OworCQlqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzLS07CisJfQogCi0gIHJldHVybiAwIDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTI3NSw1OSArMjkwLDY1IEBACiAqKiBqYl9hcnJheSBpcyB0aGUgYXJyYXkgdG8gYmUgZmlsbGVkIGluLgogKi8KIGludCByZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamJfYXJyYXksCi0JCQkJICAgaW50IGJtYXBfbnIpIHsKLSAgaW50IGkgOwotICBpbnQgZmFpbGVkID0gMCA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOwotICBpbnQgbWVtID0gYm1hcF9uciAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKikgOworCQkJCSAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamJfYXJyYXksCisJCQkJICAgaW50IGJtYXBfbnIpCit7CisJaW50IGk7CisJaW50IGZhaWxlZCA9IDA7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYjsKKwlpbnQgbWVtID0gYm1hcF9uciAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKik7CiAKLSAgZm9yIChpID0gMCA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTIDsgaSsrKSB7Ci0gICAgamIgPSBqYl9hcnJheSArIGkgOwotICAgIGpiLT5qb3VybmFsX2xpc3QgPSBOVUxMIDsKLSAgICBqYi0+Yml0bWFwcyA9IHZtYWxsb2MoIG1lbSApIDsKLSAgICBpZiAoIWpiLT5iaXRtYXBzKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImNsbS0yMDAwLCB1bmFibGUgdG8gYWxsb2NhdGUgYml0bWFwcyBmb3Igam91cm5hbCBsaXN0cyIpIDsKLSAgICAgIGZhaWxlZCA9IDE7ICAgCi0gICAgICBicmVhayA7Ci0gICAgfQotICAgIG1lbXNldChqYi0+Yml0bWFwcywgMCwgbWVtKSA7Ci0gIH0KLSAgaWYgKGZhaWxlZCkgewotICAgIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgamJfYXJyYXkpIDsKLSAgICByZXR1cm4gLTEgOwotICB9Ci0gIHJldHVybiAwIDsKKwlmb3IgKGkgPSAwOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUzsgaSsrKSB7CisJCWpiID0gamJfYXJyYXkgKyBpOworCQlqYi0+am91cm5hbF9saXN0ID0gTlVMTDsKKwkJamItPmJpdG1hcHMgPSB2bWFsbG9jKG1lbSk7CisJCWlmICghamItPmJpdG1hcHMpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImNsbS0yMDAwLCB1bmFibGUgdG8gYWxsb2NhdGUgYml0bWFwcyBmb3Igam91cm5hbCBsaXN0cyIpOworCQkJZmFpbGVkID0gMTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChqYi0+Yml0bWFwcywgMCwgbWVtKTsKKwl9CisJaWYgKGZhaWxlZCkgeworCQlmcmVlX2xpc3RfYml0bWFwcyhwX3Nfc2IsIGpiX2FycmF5KTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoKICoqIGZpbmQgYW4gYXZhaWxhYmxlIGxpc3QgYml0bWFwLiAgSWYgeW91IGNhbid0IGZpbmQgb25lLCBmbHVzaCBhIGNvbW1pdCBsaXN0IAogKiogYW5kIHRyeSBhZ2FpbgogKi8KLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKgotZ2V0X2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICBpbnQgaSxqIDsgCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IE5VTEwgOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqZ2V0X2xpc3RfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQkJICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QKKwkJCQkJCSAgICAqamwpCit7CisJaW50IGksIGo7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IE5VTEw7CiAKLSAgZm9yIChqID0gMCA7IGogPCAoSk9VUk5BTF9OVU1fQklUTUFQUyAqIDMpIDsgaisrKSB7Ci0gICAgaSA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggOwotICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAoaSArIDEpICUgSk9VUk5BTF9OVU1fQklUTUFQUyA7Ci0gICAgamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaSA7Ci0gICAgaWYgKGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7Ci0gICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0LCAxKSA7Ci0gICAgICBpZiAoIWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7Ci0JYnJlYWsgOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhayA7Ci0gICAgfQotICB9Ci0gIGlmIChqYi0+am91cm5hbF9saXN0KSB7IC8qIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgaWYgZmx1c2hlZCBjb3JyZWN0bHkgKi8KLSAgICByZXR1cm4gTlVMTCA7Ci0gIH0KLSAgamItPmpvdXJuYWxfbGlzdCA9IGpsIDsKLSAgcmV0dXJuIGpiIDsKKwlmb3IgKGogPSAwOyBqIDwgKEpPVVJOQUxfTlVNX0JJVE1BUFMgKiAzKTsgaisrKSB7CisJCWkgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4OworCQlqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4ID0gKGkgKyAxKSAlIEpPVVJOQUxfTlVNX0JJVE1BUFM7CisJCWpiID0gam91cm5hbC0+al9saXN0X2JpdG1hcCArIGk7CisJCWlmIChqb3VybmFsLT5qX2xpc3RfYml0bWFwW2ldLmpvdXJuYWxfbGlzdCkgeworCQkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLAorCQkJCQkgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uCisJCQkJCSAgam91cm5hbF9saXN0LCAxKTsKKwkJCWlmICgham91cm5hbC0+al9saXN0X2JpdG1hcFtpXS5qb3VybmFsX2xpc3QpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChqYi0+am91cm5hbF9saXN0KSB7CS8qIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgaWYgZmx1c2hlZCBjb3JyZWN0bHkgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCWpiLT5qb3VybmFsX2xpc3QgPSBqbDsKKwlyZXR1cm4gamI7CiB9CiAKIC8qIApAQCAtMzM1LDEwNCArMzU2LDExNCBAQAogKiogVXNlcyB0aGUgY25vZGUtPm5leHQgYW5kIGNub2RlLT5wcmV2IHBvaW50ZXJzCiAqKiByZXR1cm5zIE5VTEwgb24gZmFpbHVyZQogKi8KLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqYWxsb2NhdGVfY25vZGVzKGludCBudW1fY25vZGVzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpoZWFkIDsKLSAgaW50IGkgOwotICBpZiAobnVtX2Nub2RlcyA8PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIGhlYWQgPSB2bWFsbG9jKG51bV9jbm9kZXMgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKSA7Ci0gIGlmICghaGVhZCkgewotICAgIHJldHVybiBOVUxMIDsKLSAgfQotICBtZW1zZXQoaGVhZCwgMCwgbnVtX2Nub2RlcyAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsKLSAgaGVhZFswXS5wcmV2ID0gTlVMTCA7Ci0gIGhlYWRbMF0ubmV4dCA9IGhlYWQgKyAxIDsKLSAgZm9yIChpID0gMSA7IGkgPCBudW1fY25vZGVzOyBpKyspIHsKLSAgICBoZWFkW2ldLnByZXYgPSBoZWFkICsgKGkgLSAxKSA7Ci0gICAgaGVhZFtpXS5uZXh0ID0gaGVhZCArIChpICsgMSkgOyAvKiBpZiBsYXN0IG9uZSwgb3ZlcndyaXRlIGl0IGFmdGVyIHRoZSBpZiAqLwotICB9Ci0gIGhlYWRbbnVtX2Nub2RlcyAtMV0ubmV4dCA9IE5VTEwgOwotICByZXR1cm4gaGVhZCA7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmFsbG9jYXRlX2Nub2RlcyhpbnQgbnVtX2Nub2RlcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaGVhZDsKKwlpbnQgaTsKKwlpZiAobnVtX2Nub2RlcyA8PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwloZWFkID0gdm1hbGxvYyhudW1fY25vZGVzICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSk7CisJaWYgKCFoZWFkKSB7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoaGVhZCwgMCwgbnVtX2Nub2RlcyAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpOworCWhlYWRbMF0ucHJldiA9IE5VTEw7CisJaGVhZFswXS5uZXh0ID0gaGVhZCArIDE7CisJZm9yIChpID0gMTsgaSA8IG51bV9jbm9kZXM7IGkrKykgeworCQloZWFkW2ldLnByZXYgPSBoZWFkICsgKGkgLSAxKTsKKwkJaGVhZFtpXS5uZXh0ID0gaGVhZCArIChpICsgMSk7CS8qIGlmIGxhc3Qgb25lLCBvdmVyd3JpdGUgaXQgYWZ0ZXIgdGhlIGlmICovCisJfQorCWhlYWRbbnVtX2Nub2RlcyAtIDFdLm5leHQgPSBOVUxMOworCXJldHVybiBoZWFkOwogfQogCiAvKgogKiogcHVsbHMgYSBjbm9kZSBvZmYgdGhlIGZyZWUgbGlzdCwgb3IgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgCiAqLwotc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOwogCi0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZ2V0X2Nub2RlIikgOworCXJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZ2V0X2Nub2RlIik7CiAKLSAgaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEwgOwotICB9Ci0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZCsrIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlLS0gOwotICBjbiA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKLSAgaWYgKCFjbikgewotICAgIHJldHVybiBjbiA7Ci0gIH0KLSAgaWYgKGNuLT5uZXh0KSB7Ci0gICAgY24tPm5leHQtPnByZXYgPSBOVUxMIDsKLSAgfQotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuLT5uZXh0IDsKLSAgbWVtc2V0KGNuLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKSA7Ci0gIHJldHVybiBjbiA7CisJaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8PSAwKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlqb3VybmFsLT5qX2Nub2RlX3VzZWQrKzsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUtLTsKKwljbiA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0OworCWlmICghY24pIHsKKwkJcmV0dXJuIGNuOworCX0KKwlpZiAoY24tPm5leHQpIHsKKwkJY24tPm5leHQtPnByZXYgPSBOVUxMOworCX0KKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuLT5uZXh0OworCW1lbXNldChjbiwgMCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSk7CisJcmV0dXJuIGNuOwogfQogCiAvKgogKiogcmV0dXJucyBhIGNub2RlIHRvIHRoZSBmcmVlIGxpc3QgCiAqLwotc3RhdGljIHZvaWQgZnJlZV9jbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKK3N0YXRpYyB2b2lkIGZyZWVfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CiAKLSAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJmcmVlX2Nub2RlIikgOworCXJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZnJlZV9jbm9kZSIpOwogCi0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZC0tIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlKysgOwotICAvKiBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsgKi8KLSAgY24tPm5leHQgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA7Ci0gIGlmIChqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCkgewotICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0LT5wcmV2ID0gY24gOwotICB9Ci0gIGNuLT5wcmV2ID0gTlVMTCA7IC8qIG5vdCBuZWVkZWQgd2l0aCB0aGUgbWVtc2V0LCBidXQgSSBtaWdodCBraWxsIHRoZSBtZW1zZXQsIGFuZCBmb3JnZXQgdG8gZG8gdGhpcyAqLwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA9IGNuIDsKKwlqb3VybmFsLT5qX2Nub2RlX3VzZWQtLTsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUrKzsKKwkvKiBtZW1zZXQoY24sIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSkpIDsgKi8KKwljbi0+bmV4dCA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0OworCWlmIChqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCkgeworCQlqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdC0+cHJldiA9IGNuOworCX0KKwljbi0+cHJldiA9IE5VTEw7CS8qIG5vdCBuZWVkZWQgd2l0aCB0aGUgbWVtc2V0LCBidXQgSSBtaWdodCBraWxsIHRoZSBtZW1zZXQsIGFuZCBmb3JnZXQgdG8gZG8gdGhpcyAqLworCWpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY247CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX3ByZXBhcmVkX2JpdHMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBjbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotICBjbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7CitzdGF0aWMgdm9pZCBjbGVhcl9wcmVwYXJlZF9iaXRzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoYmgpOworCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkoYmgpOwogfQogCiAvKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGZvcmNlIGEgQlVHIGlmIGl0IGlzIGNhbGxlZCB3aXRob3V0IHRoZSBiaWcKICoqIGtlcm5lbCBsb2NrIGhlbGQuICBjYWxsZXIgaXMgdGhlIHN0cmluZyBwcmludGVkIGp1c3QgYmVmb3JlIGNhbGxpbmcgQlVHKCkKICovCi12b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqY2FsbGVyKSB7Cit2b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqY2FsbGVyKQorewogI2lmZGVmIENPTkZJR19TTVAKLSAgaWYgKGN1cnJlbnQtPmxvY2tfZGVwdGggPCAwKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiJXMgY2FsbGVkIHdpdGhvdXQga2VybmVsIGxvY2sgaGVsZCIsIGNhbGxlcikgOwotICB9CisJaWYgKGN1cnJlbnQtPmxvY2tfZGVwdGggPCAwKSB7CisJCXJlaXNlcmZzX3BhbmljKHNiLCAiJXMgY2FsbGVkIHdpdGhvdXQga2VybmVsIGxvY2sgaGVsZCIsCisJCQkgICAgICAgY2FsbGVyKTsKKwl9CiAjZWxzZQotICA7CisJOwogI2VuZGlmCiB9CiAKIC8qIHJldHVybiBhIGNub2RlIHdpdGggc2FtZSBkZXYsIGJsb2NrIG51bWJlciBhbmQgc2l6ZSBpbiB0YWJsZSwgb3IgbnVsbCBpZiBub3QgZm91bmQgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKgotZ2V0X2pvdXJuYWxfaGFzaF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLAotCQkgICAgIGxvbmcgYmwpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfam91cm5hbF9oYXNoX2RldihzdHJ1Y3QKKwkJCQkJCQkJICBzdXBlcl9ibG9jaworCQkJCQkJCQkgICpzYiwKKwkJCQkJCQkJICBzdHJ1Y3QKKwkJCQkJCQkJICByZWlzZXJmc19qb3VybmFsX2Nub2RlCisJCQkJCQkJCSAgKip0YWJsZSwKKwkJCQkJCQkJICBsb25nIGJsKQogewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOwotICBjbiA9IGpvdXJuYWxfaGFzaCh0YWJsZSwgc2IsIGJsKSA7Ci0gIHdoaWxlKGNuKSB7Ci0gICAgaWYgKGNuLT5ibG9ja25yID09IGJsICYmIGNuLT5zYiA9PSBzYikKLSAgICAgIHJldHVybiBjbiA7Ci0gICAgY24gPSBjbi0+aG5leHQgOwotICB9Ci0gIHJldHVybiAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikwIDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY247CisJY24gPSBqb3VybmFsX2hhc2godGFibGUsIHNiLCBibCk7CisJd2hpbGUgKGNuKSB7CisJCWlmIChjbi0+YmxvY2tuciA9PSBibCAmJiBjbi0+c2IgPT0gc2IpCisJCQlyZXR1cm4gY247CisJCWNuID0gY24tPmhuZXh0OworCX0KKwlyZXR1cm4gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopMDsKIH0KIAogLyoKQEAgLTQ1NCw5MSArNDg1LDEwMyBAQAogKioKICovCiBpbnQgcmVpc2VyZnNfaW5fam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibWFwX25yLCBpbnQgYml0X25yLCBpbnQgc2VhcmNoX2FsbCwgCi0JCQliX2Jsb2NrbnJfdCAqbmV4dF96ZXJvX2JpdCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA7Ci0gIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgOwotICBpbnQgaSA7Ci0gIHVuc2lnbmVkIGxvbmcgYmw7CisJCQlpbnQgYm1hcF9uciwgaW50IGJpdF9uciwgaW50IHNlYXJjaF9hbGwsCisJCQliX2Jsb2NrbnJfdCAqIG5leHRfemVyb19iaXQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamI7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBibDsKIAotICAqbmV4dF96ZXJvX2JpdCA9IDAgOyAvKiBhbHdheXMgc3RhcnQgdGhpcyBhdCB6ZXJvLiAqLworCSpuZXh0X3plcm9fYml0ID0gMDsJLyogYWx3YXlzIHN0YXJ0IHRoaXMgYXQgemVyby4gKi8KIAotICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbCApOwotICAvKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgYSBzZWFyY2hfYWxsLCB0aGlzIGlzIGEgbWV0YWJsb2NrLCBhbmQgaXQgd2lsbCBiZSBsb2dnZWQgYmVmb3JlIHVzZS4KLSAgKiogaWYgd2UgY3Jhc2ggYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGZyZWVkIGl0IGNvbW1pdHMsICB0aGlzIHRyYW5zYWN0aW9uIHdvbid0Ci0gICoqIGhhdmUgY29tbWl0dGVkIGVpdGhlciwgYW5kIHRoZSBibG9jayB3aWxsIG5ldmVyIGJlIHdyaXR0ZW4KLSAgKi8KLSAgaWYgKHNlYXJjaF9hbGwpIHsKLSAgICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKLSAgICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5pbl9qb3VybmFsX2JpdG1hcCApOwotICAgICAgamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaSA7Ci0gICAgICBpZiAoamItPmpvdXJuYWxfbGlzdCAmJiBqYi0+Yml0bWFwc1tibWFwX25yXSAmJgotICAgICAgICAgIHRlc3RfYml0KGJpdF9uciwgKHVuc2lnbmVkIGxvbmcgKilqYi0+Yml0bWFwc1tibWFwX25yXS0+ZGF0YSkpIHsKLQkqbmV4dF96ZXJvX2JpdCA9IGZpbmRfbmV4dF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpiLT5iaXRtYXBzW2JtYXBfbnJdLT5kYXRhKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc19zYi0+c19ibG9ja3NpemUgPDwgMywgYml0X25yKzEpIDsgCi0JcmV0dXJuIDEgOwotICAgICAgfQotICAgIH0KLSAgfQorCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWwpOworCS8qIElmIHdlIGFyZW4ndCBkb2luZyBhIHNlYXJjaF9hbGwsIHRoaXMgaXMgYSBtZXRhYmxvY2ssIGFuZCBpdCB3aWxsIGJlIGxvZ2dlZCBiZWZvcmUgdXNlLgorCSAqKiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIHRoYXQgZnJlZWQgaXQgY29tbWl0cywgIHRoaXMgdHJhbnNhY3Rpb24gd29uJ3QKKwkgKiogaGF2ZSBjb21taXR0ZWQgZWl0aGVyLCBhbmQgdGhlIGJsb2NrIHdpbGwgbmV2ZXIgYmUgd3JpdHRlbgorCSAqLworCWlmIChzZWFyY2hfYWxsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfYml0bWFwKTsKKwkJCWpiID0gam91cm5hbC0+al9saXN0X2JpdG1hcCArIGk7CisJCQlpZiAoamItPmpvdXJuYWxfbGlzdCAmJiBqYi0+Yml0bWFwc1tibWFwX25yXSAmJgorCQkJICAgIHRlc3RfYml0KGJpdF9uciwKKwkJCQkgICAgICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPgorCQkJCSAgICAgZGF0YSkpIHsKKwkJCQkqbmV4dF96ZXJvX2JpdCA9CisJCQkJICAgIGZpbmRfbmV4dF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKQorCQkJCQkJICAgICAgIChqYi0+Yml0bWFwc1tibWFwX25yXS0+CisJCQkJCQkJZGF0YSksCisJCQkJCQkgICAgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzLAorCQkJCQkJICAgICAgIGJpdF9uciArIDEpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQogCi0gIGJsID0gYm1hcF9uciAqIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpICsgYml0X25yOwotICAvKiBpcyBpdCBpbiBhbnkgb2xkIHRyYW5zYWN0aW9ucz8gKi8KLSAgaWYgKHNlYXJjaF9hbGwgJiYgKGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgYmwpKSkgewotICAgIHJldHVybiAxOyAKLSAgfQorCWJsID0gYm1hcF9uciAqIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpICsgYml0X25yOworCS8qIGlzIGl0IGluIGFueSBvbGQgdHJhbnNhY3Rpb25zPyAqLworCWlmIChzZWFyY2hfYWxsCisJICAgICYmIChjbiA9CisJCWdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIGJsKSkpIHsKKwkJcmV0dXJuIDE7CisJfQogCi0gIC8qIGlzIGl0IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCi0gIGlmICgoY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgYmwpKSkgewotICAgIEJVRygpOwotICAgIHJldHVybiAxOyAKLSAgfQorCS8qIGlzIGl0IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJaWYgKChjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibCkpKSB7CisJCUJVRygpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfcmV1c2FibGUgKTsKLSAgLyogc2FmZSBmb3IgcmV1c2UgKi8KLSAgcmV0dXJuIDAgOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWxfcmV1c2FibGUpOworCS8qIHNhZmUgZm9yIHJldXNlICovCisJcmV0dXJuIDA7CiB9CiAKIC8qIGluc2VydCBjbiBpbnRvIHRhYmxlCiAqLwotc3RhdGljIGlubGluZSB2b2lkIGluc2VydF9qb3VybmFsX2hhc2goc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKip0YWJsZSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbl9vcmlnIDsKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfam91cm5hbF9oYXNoKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY25fb3JpZzsKIAotICBjbl9vcmlnID0gam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKSA7Ci0gIGNuLT5obmV4dCA9IGNuX29yaWcgOwotICBjbi0+aHByZXYgPSBOVUxMIDsKLSAgaWYgKGNuX29yaWcpIHsKLSAgICBjbl9vcmlnLT5ocHJldiA9IGNuIDsKLSAgfQotICBqb3VybmFsX2hhc2godGFibGUsIGNuLT5zYiwgY24tPmJsb2NrbnIpID0gIGNuIDsKKwljbl9vcmlnID0gam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKTsKKwljbi0+aG5leHQgPSBjbl9vcmlnOworCWNuLT5ocHJldiA9IE5VTEw7CisJaWYgKGNuX29yaWcpIHsKKwkJY25fb3JpZy0+aHByZXYgPSBjbjsKKwl9CisJam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKSA9IGNuOwogfQogCiAvKiBsb2NrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCi1pbmxpbmUgc3RhdGljIHZvaWQgbG9ja19qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmxvY2tfam91cm5hbCApOwotICAgIGRvd24oJlNCX0pPVVJOQUwocF9zX3NiKS0+al9sb2NrKTsKK2lubGluZSBzdGF0aWMgdm9pZCBsb2NrX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubG9ja19qb3VybmFsKTsKKwlkb3duKCZTQl9KT1VSTkFMKHBfc19zYiktPmpfbG9jayk7CiB9CiAKIC8qIHVubG9jayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwotaW5saW5lIHN0YXRpYyB2b2lkIHVubG9ja19qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgdXAoJlNCX0pPVVJOQUwocF9zX3NiKS0+al9sb2NrKTsKK2lubGluZSBzdGF0aWMgdm9pZCB1bmxvY2tfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKK3sKKwl1cCgmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX2xvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2pvdXJuYWxfbGlzdChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKIHsKLSAgICBqbC0+al9yZWZjb3VudCsrOworCWpsLT5qX3JlZmNvdW50Kys7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkJICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQogewotICAgIGlmIChqbC0+al9yZWZjb3VudCA8IDEpIHsKLSAgICAgICAgcmVpc2VyZnNfcGFuaWMgKHMsICJ0cmFucyBpZCAlbHUsIHJlZmNvdW50IGF0ICVkIiwgamwtPmpfdHJhbnNfaWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbC0+al9yZWZjb3VudCk7Ci0gICAgfQotICAgIGlmICgtLWpsLT5qX3JlZmNvdW50ID09IDApCi0gICAgICAgIHJlaXNlcmZzX2tmcmVlKGpsLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHMpOworCWlmIChqbC0+al9yZWZjb3VudCA8IDEpIHsKKwkJcmVpc2VyZnNfcGFuaWMocywgInRyYW5zIGlkICVsdSwgcmVmY291bnQgYXQgJWQiLAorCQkJICAgICAgIGpsLT5qX3RyYW5zX2lkLCBqbC0+al9yZWZjb3VudCk7CisJfQorCWlmICgtLWpsLT5qX3JlZmNvdW50ID09IDApCisJCXJlaXNlcmZzX2tmcmVlKGpsLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHMpOwogfQogCiAvKgpAQCAtNTQ2LDM1NCArNTg5LDM3NSBAQAogKiogaXQgZ2V0cyBjYWxsZWQgYnkgZmx1c2hfY29tbWl0X2xpc3QsIGFuZCBjbGVhbnMgdXAgYW55IGRhdGEgc3RvcmVkIGFib3V0IGJsb2NrcyBmcmVlZCBkdXJpbmcgYQogKiogdHJhbnNhY3Rpb24uCiAqLwotc3RhdGljIHZvaWQgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworc3RhdGljIHZvaWQgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQkgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKK3sKIAotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gamwtPmpfbGlzdF9iaXRtYXAgOwotICBpZiAoamIpIHsKLSAgICBjbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpIDsKLSAgfQotICBqbC0+al9saXN0X2JpdG1hcC0+am91cm5hbF9saXN0ID0gTlVMTCA7Ci0gIGpsLT5qX2xpc3RfYml0bWFwID0gTlVMTCA7CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA9IGpsLT5qX2xpc3RfYml0bWFwOworCWlmIChqYikgeworCQljbGVhbnVwX2JpdG1hcF9saXN0KHBfc19zYiwgamIpOworCX0KKwlqbC0+al9saXN0X2JpdG1hcC0+am91cm5hbF9saXN0ID0gTlVMTDsKKwlqbC0+al9saXN0X2JpdG1hcCA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSAmam91cm5hbC0+al9qb3VybmFsX2xpc3Q7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CiAKLSAgICBpZiAoIWxpc3RfZW1wdHkoZW50cnkpKSB7Ci0gICAgICAgIGpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5LT5uZXh0KTsKLQlpZiAoamwtPmpfdHJhbnNfaWQgPD0gdHJhbnNfaWQpIHsKLQkgICAgcmV0dXJuIDE7CisJaWYgKCFsaXN0X2VtcHR5KGVudHJ5KSkgeworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeS0+bmV4dCk7CisJCWlmIChqbC0+al90cmFuc19pZCA8PSB0cmFuc19pZCkgeworCQkJcmV0dXJuIDE7CisJCX0KIAl9Ci0gICAgfQotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfYnVmZmVyX2lvX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKSB7Ci0gICAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworc3RhdGljIHZvaWQgcmVpc2VyZnNfZW5kX2J1ZmZlcl9pb19zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLSAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiY2xtLTIwODQ6IHBpbm5lZCBidWZmZXIgJWx1OiVzIHNlbnQgdG8gZGlzayIsCi0JICAgICAgICAgICAgICAgICBiaC0+Yl9ibG9ja25yLCBiZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSkgOwotICAgIH0KLSAgICBpZiAodXB0b2RhdGUpCi0gICAgCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpIDsKLSAgICBlbHNlCi0gICAgCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCkgOwotICAgIHVubG9ja19idWZmZXIoYmgpIDsKLSAgICBwdXRfYmgoYmgpIDsKKwlpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiY2xtLTIwODQ6IHBpbm5lZCBidWZmZXIgJWx1OiVzIHNlbnQgdG8gZGlzayIsCisJCQkJIGJoLT5iX2Jsb2NrbnIsIGJkZXZuYW1lKGJoLT5iX2JkZXYsIGIpKTsKKwl9CisJaWYgKHVwdG9kYXRlKQorCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwllbHNlCisJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKIH0KIAotc3RhdGljIHZvaWQgcmVpc2VyZnNfZW5kX29yZGVyZWRfaW8oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKSB7Ci0gICAgaWYgKHVwdG9kYXRlKQotICAgIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKSA7Ci0gICAgZWxzZQotICAgIAljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpIDsKLSAgICB1bmxvY2tfYnVmZmVyKGJoKSA7Ci0gICAgcHV0X2JoKGJoKSA7CitzdGF0aWMgdm9pZCByZWlzZXJmc19lbmRfb3JkZXJlZF9pbyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJaWYgKHVwdG9kYXRlKQorCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwllbHNlCisJCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKIH0KIAotc3RhdGljIHZvaWQgc3VibWl0X2xvZ2dlZF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICAgIGdldF9iaChiaCkgOwotICAgIGJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9idWZmZXJfaW9fc3luYyA7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChiaCk7Ci0gICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSA7Ci0gICAgaWYgKCF0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKSkKLSAgICAgICAgQlVHKCk7Ci0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotICAgICAgICBCVUcoKTsKLSAgICBzdWJtaXRfYmgoV1JJVEUsIGJoKSA7CitzdGF0aWMgdm9pZCBzdWJtaXRfbG9nZ2VkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX2J1ZmZlcl9pb19zeW5jOworCWNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyhiaCk7CisJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdChiaCkpCisJCUJVRygpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJQlVHKCk7CisJc3VibWl0X2JoKFdSSVRFLCBiaCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN1Ym1pdF9vcmRlcmVkX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgZ2V0X2JoKGJoKSA7Ci0gICAgYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX29yZGVyZWRfaW87Ci0gICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSA7Ci0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQotICAgICAgICBCVUcoKTsKLSAgICBzdWJtaXRfYmgoV1JJVEUsIGJoKSA7CitzdGF0aWMgdm9pZCBzdWJtaXRfb3JkZXJlZF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlnZXRfYmgoYmgpOworCWJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlCVUcoKTsKKwlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKIH0KIAotc3RhdGljIGludCBzdWJtaXRfYmFycmllcl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICAgIGdldF9iaChiaCkgOwotICAgIGJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOwotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOwotICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKLSAgICAgICAgQlVHKCk7Ci0gICAgcmV0dXJuIHN1Ym1pdF9iaChXUklURV9CQVJSSUVSLCBiaCkgOworc3RhdGljIGludCBzdWJtaXRfYmFycmllcl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlnZXRfYmgoYmgpOworCWJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlCVUcoKTsKKwlyZXR1cm4gc3VibWl0X2JoKFdSSVRFX0JBUlJJRVIsIGJoKTsKIH0KIAogc3RhdGljIHZvaWQgY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgaWYgKGJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSkgewotCWNsZWFyX2J1ZmZlcl9lb3Bub3RzdXBwKGJoKTsKLQlkaXNhYmxlX2JhcnJpZXIocyk7Ci0Jc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0Jc2V0X2J1ZmZlcl9kaXJ0eShiaCk7Ci0Jc3luY19kaXJ0eV9idWZmZXIoYmgpOwotICAgIH0KKwkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKGJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSkgeworCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaCk7CisJCWRpc2FibGVfYmFycmllcihzKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJfQogfQogCiAjZGVmaW5lIENIVU5LX1NJWkUgMzIKIHN0cnVjdCBidWZmZXJfY2h1bmsgewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhbQ0hVTktfU0laRV07Ci0gICAgaW50IG5yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhbQ0hVTktfU0laRV07CisJaW50IG5yOwogfTsKIAotc3RhdGljIHZvaWQgd3JpdGVfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yIDsgaSsrKSB7Ci0Jc3VibWl0X2xvZ2dlZF9idWZmZXIoY2h1bmstPmJoW2ldKSA7Ci0gICAgfQotICAgIGNodW5rLT5uciA9IDA7CitzdGF0aWMgdm9pZCB3cml0ZV9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKK3sKKwlpbnQgaTsKKwlnZXRfZnNfZXhjbCgpOworCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnI7IGkrKykgeworCQlzdWJtaXRfbG9nZ2VkX2J1ZmZlcihjaHVuay0+YmhbaV0pOworCX0KKwljaHVuay0+bnIgPSAwOworCXB1dF9mc19leGNsKCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX29yZGVyZWRfY2h1bmsoc3RydWN0IGJ1ZmZlcl9jaHVuayAqY2h1bmspIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY2h1bmstPm5yIDsgaSsrKSB7Ci0Jc3VibWl0X29yZGVyZWRfYnVmZmVyKGNodW5rLT5iaFtpXSkgOwotICAgIH0KLSAgICBjaHVuay0+bnIgPSAwOworc3RhdGljIHZvaWQgd3JpdGVfb3JkZXJlZF9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKK3sKKwlpbnQgaTsKKwlnZXRfZnNfZXhjbCgpOworCWZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnI7IGkrKykgeworCQlzdWJtaXRfb3JkZXJlZF9idWZmZXIoY2h1bmstPmJoW2ldKTsKKwl9CisJY2h1bmstPm5yID0gMDsKKwlwdXRfZnNfZXhjbCgpOwogfQogCiBzdGF0aWMgaW50IGFkZF90b19jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCSBzcGlubG9ja190ICpsb2NrLAotCQkJIHZvaWQgKGZuKShzdHJ1Y3QgYnVmZmVyX2NodW5rICopKQorCQkJc3BpbmxvY2tfdCAqIGxvY2ssIHZvaWQgKGZuKSAoc3RydWN0IGJ1ZmZlcl9jaHVuayAqKSkKIHsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpCi0gICAgICAgIEJVRygpOwotICAgIGNodW5rLT5iaFtjaHVuay0+bnIrK10gPSBiaDsKLSAgICBpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpIHsKLQlyZXQgPSAxOwotICAgICAgICBpZiAobG9jaykKLQkgICAgc3Bpbl91bmxvY2sobG9jayk7Ci0gICAgICAgIGZuKGNodW5rKTsKLSAgICAgICAgaWYgKGxvY2spCi0JICAgIHNwaW5fbG9jayhsb2NrKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKKwlpbnQgcmV0ID0gMDsKKwlpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpCisJCUJVRygpOworCWNodW5rLT5iaFtjaHVuay0+bnIrK10gPSBiaDsKKwlpZiAoY2h1bmstPm5yID49IENIVU5LX1NJWkUpIHsKKwkJcmV0ID0gMTsKKwkJaWYgKGxvY2spCisJCQlzcGluX3VubG9jayhsb2NrKTsKKwkJZm4oY2h1bmspOworCQlpZiAobG9jaykKKwkJCXNwaW5fbG9jayhsb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotCiBzdGF0aWMgYXRvbWljX3QgbnJfcmVpc2VyZnNfamggPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfamggKmFsbG9jX2poKHZvaWQpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwotICAgIHdoaWxlKDEpIHsKLQlqaCA9IGttYWxsb2Moc2l6ZW9mKCpqaCksIEdGUF9OT0ZTKTsKLQlpZiAoamgpIHsKLQkgICAgYXRvbWljX2luYygmbnJfcmVpc2VyZnNfamgpOwotCSAgICByZXR1cm4gamg7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2poICphbGxvY19qaCh2b2lkKQoreworCXN0cnVjdCByZWlzZXJmc19qaCAqamg7CisJd2hpbGUgKDEpIHsKKwkJamggPSBrbWFsbG9jKHNpemVvZigqamgpLCBHRlBfTk9GUyk7CisJCWlmIChqaCkgeworCQkJYXRvbWljX2luYygmbnJfcmVpc2VyZnNfamgpOworCQkJcmV0dXJuIGpoOworCQl9CisJCXlpZWxkKCk7CiAJfQotICAgICAgICB5aWVsZCgpOwotICAgIH0KIH0KIAogLyoKICAqIHdlIHdhbnQgdG8gZnJlZSB0aGUgamggd2hlbiB0aGUgYnVmZmVyIGhhcyBiZWVuIHdyaXR0ZW4KICAqIGFuZCB3YWl0ZWQgb24KICAqLwotdm9pZCByZWlzZXJmc19mcmVlX2poKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwordm9pZCByZWlzZXJmc19mcmVlX2poKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IHJlaXNlcmZzX2poICpqaDsKIAotICAgIGpoID0gYmgtPmJfcHJpdmF0ZTsKLSAgICBpZiAoamgpIHsKLQliaC0+Yl9wcml2YXRlID0gTlVMTDsKLQlqaC0+YmggPSBOVUxMOwotCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKLQlrZnJlZShqaCk7Ci0JaWYgKGF0b21pY19yZWFkKCZucl9yZWlzZXJmc19qaCkgPD0gMCkKLQkgICAgQlVHKCk7Ci0JYXRvbWljX2RlYygmbnJfcmVpc2VyZnNfamgpOwotCXB1dF9iaChiaCk7Ci0gICAgfQorCWpoID0gYmgtPmJfcHJpdmF0ZTsKKwlpZiAoamgpIHsKKwkJYmgtPmJfcHJpdmF0ZSA9IE5VTEw7CisJCWpoLT5iaCA9IE5VTEw7CisJCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKwkJa2ZyZWUoamgpOworCQlpZiAoYXRvbWljX3JlYWQoJm5yX3JlaXNlcmZzX2poKSA8PSAwKQorCQkJQlVHKCk7CisJCWF0b21pY19kZWMoJm5yX3JlaXNlcmZzX2poKTsKKwkJcHV0X2JoKGJoKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fYWRkX2poKHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhaWwpCisJCQkgICBpbnQgdGFpbCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOworCXN0cnVjdCByZWlzZXJmc19qaCAqamg7CiAKLSAgICBpZiAoYmgtPmJfcHJpdmF0ZSkgewotCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotCWlmICghYmgtPmJfcHJpdmF0ZSkgewotCSAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotCSAgICBnb3RvIG5vX2poOworCWlmIChiaC0+Yl9wcml2YXRlKSB7CisJCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCQlpZiAoIWJoLT5iX3ByaXZhdGUpIHsKKwkJCXNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJCQlnb3RvIG5vX2poOworCQl9CisJCWpoID0gYmgtPmJfcHJpdmF0ZTsKKwkJbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOworCX0gZWxzZSB7CisJICAgICAgbm9famg6CisJCWdldF9iaChiaCk7CisJCWpoID0gYWxsb2NfamgoKTsKKwkJc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJCS8qIGJ1ZmZlciBtdXN0IGJlIGxvY2tlZCBmb3IgX19hZGRfamgsIHNob3VsZCBiZSBhYmxlIHRvIGhhdmUKKwkJICogdHdvIGFkZHMgYXQgdGhlIHNhbWUgdGltZQorCQkgKi8KKwkJaWYgKGJoLT5iX3ByaXZhdGUpCisJCQlCVUcoKTsKKwkJamgtPmJoID0gYmg7CisJCWJoLT5iX3ByaXZhdGUgPSBqaDsKIAl9Ci0gICAgICAgIGpoID0gYmgtPmJfcHJpdmF0ZTsKLQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7Ci0gICAgfSBlbHNlIHsKLW5vX2poOgotCWdldF9iaChiaCk7Ci0JamggPSBhbGxvY19qaCgpOwotCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotCS8qIGJ1ZmZlciBtdXN0IGJlIGxvY2tlZCBmb3IgX19hZGRfamgsIHNob3VsZCBiZSBhYmxlIHRvIGhhdmUKLQkgKiB0d28gYWRkcyBhdCB0aGUgc2FtZSB0aW1lCi0JICovCi0JaWYgKGJoLT5iX3ByaXZhdGUpCi0JICAgIEJVRygpOwotCWpoLT5iaCA9IGJoOwotCWJoLT5iX3ByaXZhdGUgPSBqaDsKLSAgICB9Ci0gICAgamgtPmpsID0gai0+al9jdXJyZW50X2psOwotICAgIGlmICh0YWlsKQotCWxpc3RfYWRkX3RhaWwoJmpoLT5saXN0LCAmamgtPmpsLT5qX3RhaWxfYmhfbGlzdCk7Ci0gICAgZWxzZSB7Ci0JbGlzdF9hZGRfdGFpbCgmamgtPmxpc3QsICZqaC0+amwtPmpfYmhfbGlzdCk7Ci0gICAgfQotICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7Ci0gICAgcmV0dXJuIDA7CisJamgtPmpsID0gai0+al9jdXJyZW50X2psOworCWlmICh0YWlsKQorCQlsaXN0X2FkZF90YWlsKCZqaC0+bGlzdCwgJmpoLT5qbC0+al90YWlsX2JoX2xpc3QpOworCWVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZqaC0+bGlzdCwgJmpoLT5qbC0+al9iaF9saXN0KTsKKwl9CisJc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICAgIHJldHVybiBfX2FkZF9qaChTQl9KT1VSTkFMKGlub2RlLT5pX3NiKSwgYmgsIDEpOworaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlyZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAxKTsKIH0KLWludCByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKLSAgICByZXR1cm4gX19hZGRfamgoU0JfSk9VUk5BTChpbm9kZS0+aV9zYiksIGJoLCAwKTsKK2ludCByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIF9fYWRkX2poKFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLCBiaCwgMCk7CiB9CiAKICNkZWZpbmUgSkhfRU5UUlkobCkgbGlzdF9lbnRyeSgobCksIHN0cnVjdCByZWlzZXJmc19qaCwgbGlzdCkKLXN0YXRpYyBpbnQgd3JpdGVfb3JkZXJlZF9idWZmZXJzKHNwaW5sb2NrX3QgKmxvY2ssCitzdGF0aWMgaW50IHdyaXRlX29yZGVyZWRfYnVmZmVycyhzcGlubG9ja190ICogbG9jaywKIAkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCiAJCQkJIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOwotICAgIGludCByZXQgPSBqLT5qX2Vycm5vOwotICAgIHN0cnVjdCBidWZmZXJfY2h1bmsgY2h1bms7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCB0bXA7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfamggKmpoOworCWludCByZXQgPSBqLT5qX2Vycm5vOworCXN0cnVjdCBidWZmZXJfY2h1bmsgY2h1bms7CisJc3RydWN0IGxpc3RfaGVhZCB0bXA7CisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CiAKLSAgICBjaHVuay5uciA9IDA7Ci0gICAgc3Bpbl9sb2NrKGxvY2spOwotICAgIHdoaWxlKCFsaXN0X2VtcHR5KGxpc3QpKSB7Ci0gICAgICAgIGpoID0gSkhfRU5UUlkobGlzdC0+bmV4dCk7Ci0JYmggPSBqaC0+Ymg7Ci0JZ2V0X2JoKGJoKTsKLQlpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKLQkgICAgaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKLQkJbGlzdF9hZGQoJmpoLT5saXN0LCAmdG1wKTsKLQkJZ290byBsb29wX25leHQ7Ci0JICAgIH0KLQkgICAgc3Bpbl91bmxvY2sobG9jayk7Ci0JICAgIGlmIChjaHVuay5ucikKLQkJd3JpdGVfb3JkZXJlZF9jaHVuaygmY2h1bmspOwotCSAgICB3YWl0X29uX2J1ZmZlcihiaCk7Ci0JICAgIGNvbmRfcmVzY2hlZCgpOwotCSAgICBzcGluX2xvY2sobG9jayk7Ci0JICAgIGdvdG8gbG9vcF9uZXh0OwotICAgICAgICB9Ci0JaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKLQkgICAgbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOwotCSAgICBsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOwotICAgICAgICAgICAgYWRkX3RvX2NodW5rKCZjaHVuaywgYmgsIGxvY2ssIHdyaXRlX29yZGVyZWRfY2h1bmspOwotCX0gZWxzZSB7Ci0JICAgIHJlaXNlcmZzX2ZyZWVfamgoYmgpOwotCSAgICB1bmxvY2tfYnVmZmVyKGJoKTsKLQl9Ci1sb29wX25leHQ6Ci0JcHV0X2JoKGJoKTsKLQljb25kX3Jlc2NoZWRfbG9jayhsb2NrKTsKLSAgICB9Ci0gICAgaWYgKGNodW5rLm5yKSB7Ci0Jc3Bpbl91bmxvY2sobG9jayk7Ci0gICAgICAgIHdyaXRlX29yZGVyZWRfY2h1bmsoJmNodW5rKTsKKwljaHVuay5uciA9IDA7CiAJc3Bpbl9sb2NrKGxvY2spOwotICAgIH0KLSAgICB3aGlsZSghbGlzdF9lbXB0eSgmdG1wKSkgewotICAgICAgICBqaCA9IEpIX0VOVFJZKHRtcC5wcmV2KTsKLQliaCA9IGpoLT5iaDsKLQlnZXRfYmgoYmgpOwotCXJlaXNlcmZzX2ZyZWVfamgoYmgpOwotCi0JaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JICAgIHNwaW5fdW5sb2NrKGxvY2spOwotCSAgICB3YWl0X29uX2J1ZmZlcihiaCk7Ci0JICAgIHNwaW5fbG9jayhsb2NrKTsKLQl9Ci0JaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JICAgIHJldCA9IC1FSU87Ci0gICAgICAgIH0KLQlwdXRfYmgoYmgpOwotCWNvbmRfcmVzY2hlZF9sb2NrKGxvY2spOwotICAgIH0KLSAgICBzcGluX3VubG9jayhsb2NrKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZsdXNoX29sZGVyX2NvbW1pdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqb3RoZXJfamw7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmlyc3Rfamw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7Ci0gICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICAgIHVuc2lnbmVkIGxvbmcgb3RoZXJfdHJhbnNfaWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmaXJzdF90cmFuc19pZDsKLQotZmluZF9maXJzdDoKLSAgICAvKgotICAgICAqIGZpcnN0IHdlIHdhbGsgYmFja3dhcmRzIHRvIGZpbmQgdGhlIG9sZGVzdCB1bmNvbW1pdHRlZCB0cmFuc2F0aW9uCi0gICAgICovCi0gICAgZmlyc3RfamwgPSBqbDsKLSAgICBlbnRyeSA9IGpsLT5qX2xpc3QucHJldjsKLSAgICB3aGlsZSgxKSB7Ci0Jb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOwotCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QgfHwKLQkgICAgYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpCi0JICAgIGJyZWFrOwotCi0gICAgICAgIGZpcnN0X2psID0gb3RoZXJfamw7Ci0JZW50cnkgPSBvdGhlcl9qbC0+al9saXN0LnByZXY7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgZGlkbid0IGZpbmQgYW55IG9sZGVyIHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIG5vdyAqLwotICAgIGlmIChmaXJzdF9qbCA9PSBqbCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmaXJzdF90cmFuc19pZCA9IGZpcnN0X2psLT5qX3RyYW5zX2lkOwotCi0gICAgZW50cnkgPSAmZmlyc3RfamwtPmpfbGlzdDsKLSAgICB3aGlsZSgxKSB7Ci0Jb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOwotCW90aGVyX3RyYW5zX2lkID0gb3RoZXJfamwtPmpfdHJhbnNfaWQ7Ci0KLQlpZiAob3RoZXJfdHJhbnNfaWQgPCB0cmFuc19pZCkgewotCSAgICBpZiAoYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX2NvbW1pdF9sZWZ0KSAhPSAwKSB7Ci0JCWZsdXNoX2NvbW1pdF9saXN0KHMsIG90aGVyX2psLCAwKTsKLQotCQkvKiBsaXN0IHdlIHdlcmUgY2FsbGVkIHdpdGggaXMgZ29uZSwgcmV0dXJuICovCi0JCWlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkKLQkJICAgIHJldHVybiAxOwotCi0JCS8qIHRoZSBvbmUgd2UganVzdCBmbHVzaGVkIGlzIGdvbmUsIHRoaXMgbWVhbnMgYWxsCi0JCSAqIG9sZGVyIGxpc3RzIGFyZSBhbHNvIGdvbmUsIHNvIGZpcnN0X2psIGlzIG5vIGxvbmdlcgotCQkgKiB2YWxpZCBlaXRoZXIuICBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuCi0JCSAqLwotCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCBvdGhlcl90cmFuc19pZCkpIHsKLQkJICAgIGdvdG8gZmluZF9maXJzdDsKKwl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJamggPSBKSF9FTlRSWShsaXN0LT5uZXh0KTsKKwkJYmggPSBqaC0+Ymg7CisJCWdldF9iaChiaCk7CisJCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQkJaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJbGlzdF9kZWxfaW5pdCgmamgtPmxpc3QpOworCQkJCWxpc3RfYWRkKCZqaC0+bGlzdCwgJnRtcCk7CisJCQkJZ290byBsb29wX25leHQ7CisJCQl9CisJCQlzcGluX3VubG9jayhsb2NrKTsKKwkJCWlmIChjaHVuay5ucikKKwkJCQl3cml0ZV9vcmRlcmVkX2NodW5rKCZjaHVuayk7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCXNwaW5fbG9jayhsb2NrKTsKKwkJCWdvdG8gbG9vcF9uZXh0OwogCQl9Ci0JICAgIH0KLQkgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKLQkgICAgaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkgICAgcmV0dXJuIDA7CisJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisJCQlsaXN0X2FkZCgmamgtPmxpc3QsICZ0bXApOworCQkJYWRkX3RvX2NodW5rKCZjaHVuaywgYmgsIGxvY2ssIHdyaXRlX29yZGVyZWRfY2h1bmspOworCQl9IGVsc2UgeworCQkJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfQorCSAgICAgIGxvb3BfbmV4dDoKKwkJcHV0X2JoKGJoKTsKKwkJY29uZF9yZXNjaGVkX2xvY2sobG9jayk7CiAJfQotICAgIH0KLSAgICByZXR1cm4gMDsKKwlpZiAoY2h1bmsubnIpIHsKKwkJc3Bpbl91bmxvY2sobG9jayk7CisJCXdyaXRlX29yZGVyZWRfY2h1bmsoJmNodW5rKTsKKwkJc3Bpbl9sb2NrKGxvY2spOworCX0KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnRtcCkpIHsKKwkJamggPSBKSF9FTlRSWSh0bXAucHJldik7CisJCWJoID0gamgtPmJoOworCQlnZXRfYmgoYmgpOworCQlyZWlzZXJmc19mcmVlX2poKGJoKTsKKworCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJCXNwaW5fdW5sb2NrKGxvY2spOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJc3Bpbl9sb2NrKGxvY2spOworCQl9CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJcmV0ID0gLUVJTzsKKwkJfQorCQlwdXRfYmgoYmgpOworCQljb25kX3Jlc2NoZWRfbG9jayhsb2NrKTsKKwl9CisJc3Bpbl91bmxvY2sobG9jayk7CisJcmV0dXJuIHJldDsKIH0KLWludCByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICAgIERFRklORV9XQUlUKHdhaXQpOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChzKTsKLSAgICBpZiAoYXRvbWljX3JlYWQoJmotPmpfYXN5bmNfdGhyb3R0bGUpKQotICAgIAlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWi8xMCk7Ci0gICAgcmV0dXJuIDA7CisKK3N0YXRpYyBpbnQgZmx1c2hfb2xkZXJfY29tbWl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKm90aGVyX2psOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpcnN0X2psOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwl1bnNpZ25lZCBsb25nIG90aGVyX3RyYW5zX2lkOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfdHJhbnNfaWQ7CisKKyAgICAgIGZpbmRfZmlyc3Q6CisJLyoKKwkgKiBmaXJzdCB3ZSB3YWxrIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBvbGRlc3QgdW5jb21taXR0ZWQgdHJhbnNhdGlvbgorCSAqLworCWZpcnN0X2psID0gamw7CisJZW50cnkgPSBqbC0+al9saXN0LnByZXY7CisJd2hpbGUgKDEpIHsKKwkJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0IHx8CisJCSAgICBhdG9taWNfcmVhZCgmb3RoZXJfamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkKKwkJCWJyZWFrOworCisJCWZpcnN0X2psID0gb3RoZXJfamw7CisJCWVudHJ5ID0gb3RoZXJfamwtPmpfbGlzdC5wcmV2OworCX0KKworCS8qIGlmIHdlIGRpZG4ndCBmaW5kIGFueSBvbGRlciB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnMsIHJldHVybiBub3cgKi8KKwlpZiAoZmlyc3RfamwgPT0gamwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZmlyc3RfdHJhbnNfaWQgPSBmaXJzdF9qbC0+al90cmFuc19pZDsKKworCWVudHJ5ID0gJmZpcnN0X2psLT5qX2xpc3Q7CisJd2hpbGUgKDEpIHsKKwkJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlvdGhlcl90cmFuc19pZCA9IG90aGVyX2psLT5qX3RyYW5zX2lkOworCisJCWlmIChvdGhlcl90cmFuc19pZCA8IHRyYW5zX2lkKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX2NvbW1pdF9sZWZ0KSAhPSAwKSB7CisJCQkJZmx1c2hfY29tbWl0X2xpc3Qocywgb3RoZXJfamwsIDApOworCisJCQkJLyogbGlzdCB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGlzIGdvbmUsIHJldHVybiAqLworCQkJCWlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQkvKiB0aGUgb25lIHdlIGp1c3QgZmx1c2hlZCBpcyBnb25lLCB0aGlzIG1lYW5zIGFsbAorCQkJCSAqIG9sZGVyIGxpc3RzIGFyZSBhbHNvIGdvbmUsIHNvIGZpcnN0X2psIGlzIG5vIGxvbmdlcgorCQkJCSAqIHZhbGlkIGVpdGhlci4gIEdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4KKwkJCQkgKi8KKwkJCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZQorCQkJCSAgICAocywgb3RoZXJfdHJhbnNfaWQpKSB7CisJCQkJCWdvdG8gZmluZF9maXJzdDsKKwkJCQl9CisJCQl9CisJCQllbnRyeSA9IGVudHJ5LT5uZXh0OworCQkJaWYgKGVudHJ5ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAwOworfQoraW50IHJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCURFRklORV9XQUlUKHdhaXQpOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChzKTsKKwlpZiAoYXRvbWljX3JlYWQoJmotPmpfYXN5bmNfdGhyb3R0bGUpKQorCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWiAvIDEwKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTkwMywyMDkgKzk2NywyMjUgQEAKICoqIEJlZm9yZSB0aGUgY29tbWl0IGJsb2NrIGNhbiBieSB3cml0dGVuLCBldmVyeSBvdGhlciBsb2cgYmxvY2sgbXVzdCBiZSBzYWZlbHkgb24gZGlzawogKioKICovCi1zdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgewotICBpbnQgaTsKLSAgaW50IGJuIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBOVUxMIDsKLSAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICBpbnQgYmFycmllciA9IDA7Ci0gIGludCByZXR2YWwgPSAwOworc3RhdGljIGludCBmbHVzaF9jb21taXRfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpCit7CisJaW50IGk7CisJaW50IGJuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWludCBiYXJyaWVyID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKIAotICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHMsICJmbHVzaF9jb21taXRfbGlzdCIpIDsKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHMsICJmbHVzaF9jb21taXRfbGlzdCIpOwogCi0gIGlmIChhdG9taWNfcmVhZCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkgewotICAgIHJldHVybiAwIDsKLSAgfQorCWlmIChhdG9taWNfcmVhZCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkgeworCQlyZXR1cm4gMDsKKwl9CiAKLSAgLyogYmVmb3JlIHdlIGNhbiBwdXQgb3VyIGNvbW1pdCBibG9ja3Mgb24gZGlzaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgZXZlcnlvbmUgb2xkZXIgdGhhbgotICAqKiB1cyBpcyBvbiBkaXNrIHRvbwotICAqLwotICBCVUdfT04gKGpsLT5qX2xlbiA8PSAwKTsKLSAgQlVHX09OICh0cmFuc19pZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKTsKKwlnZXRfZnNfZXhjbCgpOwogCi0gIGdldF9qb3VybmFsX2xpc3QoamwpOwotICBpZiAoZmx1c2hhbGwpIHsKLSAgICBpZiAoZmx1c2hfb2xkZXJfY29tbWl0cyhzLCBqbCkgPT0gMSkgewotICAgICAgLyogbGlzdCBkaXNhcHBlYXJlZCBkdXJpbmcgZmx1c2hfb2xkZXJfY29tbWl0cy4gIHJldHVybiAqLwotICAgICAgZ290byBwdXRfamw7Ci0gICAgfQotICB9CisJLyogYmVmb3JlIHdlIGNhbiBwdXQgb3VyIGNvbW1pdCBibG9ja3Mgb24gZGlzaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgZXZlcnlvbmUgb2xkZXIgdGhhbgorCSAqKiB1cyBpcyBvbiBkaXNrIHRvbworCSAqLworCUJVR19PTihqbC0+al9sZW4gPD0gMCk7CisJQlVHX09OKHRyYW5zX2lkID09IGpvdXJuYWwtPmpfdHJhbnNfaWQpOwogCi0gIC8qIG1ha2Ugc3VyZSBub2JvZHkgaXMgdHJ5aW5nIHRvIGZsdXNoIHRoaXMgb25lIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgZG93bigmamwtPmpfY29tbWl0X2xvY2spOwotICBpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCB0cmFuc19pZCkpIHsKLSAgICB1cCgmamwtPmpfY29tbWl0X2xvY2spOwotICAgIGdvdG8gcHV0X2psOwotICB9Ci0gIEJVR19PTiAoamwtPmpfdHJhbnNfaWQgPT0gMCk7CisJZ2V0X2pvdXJuYWxfbGlzdChqbCk7CisJaWYgKGZsdXNoYWxsKSB7CisJCWlmIChmbHVzaF9vbGRlcl9jb21taXRzKHMsIGpsKSA9PSAxKSB7CisJCQkvKiBsaXN0IGRpc2FwcGVhcmVkIGR1cmluZyBmbHVzaF9vbGRlcl9jb21taXRzLiAgcmV0dXJuICovCisJCQlnb3RvIHB1dF9qbDsKKwkJfQorCX0KIAotICAvKiB0aGlzIGNvbW1pdCBpcyBkb25lLCBleGl0ICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgewotICAgIGlmIChmbHVzaGFsbCkgewotICAgICAgYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpIDsKLSAgICB9Ci0gICAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKLSAgICBnb3RvIHB1dF9qbDsKLSAgfQorCS8qIG1ha2Ugc3VyZSBub2JvZHkgaXMgdHJ5aW5nIHRvIGZsdXNoIHRoaXMgb25lIGF0IHRoZSBzYW1lIHRpbWUgKi8KKwlkb3duKCZqbC0+al9jb21taXRfbG9jayk7CisJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgdHJhbnNfaWQpKSB7CisJCXVwKCZqbC0+al9jb21taXRfbG9jayk7CisJCWdvdG8gcHV0X2psOworCX0KKwlCVUdfT04oamwtPmpfdHJhbnNfaWQgPT0gMCk7CiAKLSAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSkgewotICAgICAgdW5sb2NrX2tlcm5lbCgpOwotICAgICAgd3JpdGVfb3JkZXJlZF9idWZmZXJzKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLCBqbCwgJmpsLT5qX2JoX2xpc3QpOwotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgfQotICBCVUdfT04gKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSk7Ci0gIC8qCi0gICAqIGZvciB0aGUgZGVzY3JpcHRpb24gYmxvY2sgYW5kIGFsbCB0aGUgbG9nIGJsb2Nrcywgc3VibWl0IGFueSBidWZmZXJzCi0gICAqIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRpc2sKLSAgICovCi0gIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICBmb3IgKGkgPSAwIDsgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgewotICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsgKGpsLT5qX3N0YXJ0K2kpICUKLSAgICAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7Ci0gICAgdGJoID0gam91cm5hbF9maW5kX2dldF9ibG9jayhzLCBibikgOwotICAgIGlmIChidWZmZXJfZGlydHkodGJoKSkgLyogcmVkdW5kYW50LCBsbF9yd19ibG9jaygpIGNoZWNrcyAqLwotCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKSA7Ci0gICAgcHV0X2JoKHRiaCkgOwotICB9Ci0gIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCS8qIHRoaXMgY29tbWl0IGlzIGRvbmUsIGV4aXQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKKwkJaWYgKGZsdXNoYWxsKSB7CisJCQlhdG9taWNfc2V0KCYoamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSwgMSk7CisJCX0KKwkJdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkJZ290byBwdXRfamw7CisJfQogCi0gIC8qIHdhaXQgb24gZXZlcnl0aGluZyB3cml0dGVuIHNvIGZhciBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWl0Ci0gICAqIGlmIHdlIGFyZSBpbiBiYXJyaWVyIG1vZGUsIHNlbmQgdGhlIGNvbW1pdCBkb3duIG5vdwotICAgKi8KLSAgYmFycmllciA9IHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocyk7Ci0gIGlmIChiYXJyaWVyKSB7Ci0gICAgICBpbnQgcmV0OwotICAgICAgbG9ja19idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKLSAgICAgIHJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqbC0+al9jb21taXRfYmgpOwotICAgICAgaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgewotCSAgc2V0X2J1ZmZlcl91cHRvZGF0ZShqbC0+al9jb21taXRfYmgpOwotICAgICAgICAgIGRpc2FibGVfYmFycmllcihzKTsKLQkgIGJhcnJpZXIgPSAwOwotICAgICAgfQotICB9Ci0gIGZvciAoaSA9IDAgOyAgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgewotICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsKLQkgKGpsLT5qX3N0YXJ0ICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpIDsKLSAgICB0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKSA7Ci0gICAgd2FpdF9vbl9idWZmZXIodGJoKSA7Ci0gICAgLy8gc2luY2Ugd2UncmUgdXNpbmcgbGxfcndfYmxrIGFib3ZlLCBpdCBtaWdodCBoYXZlIHNraXBwZWQgb3ZlcgotICAgIC8vIGEgbG9ja2VkIGJ1ZmZlci4gIERvdWJsZSBjaGVjayBoZXJlCi0gICAgLy8KLSAgICBpZiAoYnVmZmVyX2RpcnR5KHRiaCkpIC8qIHJlZHVuZGFudCwgc3luY19kaXJ0eV9idWZmZXIoKSBjaGVja3MgKi8KLSAgICAgIHN5bmNfZGlydHlfYnVmZmVyKHRiaCk7Ci0gICAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCisJCQkJICAgICAgam91cm5hbCwgamwsICZqbC0+al9iaF9saXN0KTsKKwkJbG9ja19rZXJuZWwoKTsKKwl9CisJQlVHX09OKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSk7CisJLyoKKwkgKiBmb3IgdGhlIGRlc2NyaXB0aW9uIGJsb2NrIGFuZCBhbGwgdGhlIGxvZyBibG9ja3MsIHN1Ym1pdCBhbnkgYnVmZmVycworCSAqIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRpc2sKKwkgKi8KKwlhdG9taWNfaW5jKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgKGpsLT5qX2xlbiArIDEpOyBpKyspIHsKKwkJYm4gPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socykgKyAoamwtPmpfc3RhcnQgKyBpKSAlCisJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpOworCQl0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKTsKKwkJaWYgKGJ1ZmZlcl9kaXJ0eSh0YmgpKQkvKiByZWR1bmRhbnQsIGxsX3J3X2Jsb2NrKCkgY2hlY2tzICovCisJCQlsbF9yd19ibG9jayhXUklURSwgMSwgJnRiaCk7CisJCXB1dF9iaCh0YmgpOworCX0KKwlhdG9taWNfZGVjKCZqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKTsKKworCS8qIHdhaXQgb24gZXZlcnl0aGluZyB3cml0dGVuIHNvIGZhciBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWl0CisJICogaWYgd2UgYXJlIGluIGJhcnJpZXIgbW9kZSwgc2VuZCB0aGUgY29tbWl0IGRvd24gbm93CisJICovCisJYmFycmllciA9IHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocyk7CisJaWYgKGJhcnJpZXIpIHsKKwkJaW50IHJldDsKKwkJbG9ja19idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKwkJcmV0ID0gc3VibWl0X2JhcnJpZXJfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoamwtPmpfY29tbWl0X2JoKTsKKwkJCWRpc2FibGVfYmFycmllcihzKTsKKwkJCWJhcnJpZXIgPSAwOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCAoamwtPmpfbGVuICsgMSk7IGkrKykgeworCQlibiA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhzKSArCisJCSAgICAoamwtPmpfc3RhcnQgKyBpKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7CisJCXRiaCA9IGpvdXJuYWxfZmluZF9nZXRfYmxvY2socywgYm4pOworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQkvLyBzaW5jZSB3ZSdyZSB1c2luZyBsbF9yd19ibGsgYWJvdmUsIGl0IG1pZ2h0IGhhdmUgc2tpcHBlZCBvdmVyCisJCS8vIGEgbG9ja2VkIGJ1ZmZlci4gIERvdWJsZSBjaGVjayBoZXJlCisJCS8vCisJCWlmIChidWZmZXJfZGlydHkodGJoKSkJLyogcmVkdW5kYW50LCBzeW5jX2RpcnR5X2J1ZmZlcigpIGNoZWNrcyAqLworCQkJc3luY19kaXJ0eV9idWZmZXIodGJoKTsKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUodGJoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtNjAxLCBidWZmZXIgd3JpdGUgZmFpbGVkIikgOworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MDEsIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKICNlbmRpZgotICAgICAgcmV0dmFsID0gLUVJTzsKLSAgICB9Ci0gICAgcHV0X2JoKHRiaCkgOyAvKiBvbmNlIGZvciBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrICovCi0gICAgcHV0X2JoKHRiaCkgOyAgICAvKiBvbmNlIGR1ZSB0byBvcmlnaW5hbCBnZXRibGsgaW4gZG9fam91cm5hbF9lbmQgKi8KLSAgICBhdG9taWNfZGVjKCYoamwtPmpfY29tbWl0X2xlZnQpKSA7Ci0gIH0KKwkJCXJldHZhbCA9IC1FSU87CisJCX0KKwkJcHV0X2JoKHRiaCk7CS8qIG9uY2UgZm9yIGpvdXJuYWxfZmluZF9nZXRfYmxvY2sgKi8KKwkJcHV0X2JoKHRiaCk7CS8qIG9uY2UgZHVlIHRvIG9yaWdpbmFsIGdldGJsayBpbiBkb19qb3VybmFsX2VuZCAqLworCQlhdG9taWNfZGVjKCYoamwtPmpfY29tbWl0X2xlZnQpKTsKKwl9CiAKLSAgQlVHX09OIChhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgIT0gMSk7CisJQlVHX09OKGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSAhPSAxKTsKIAotICBpZiAoIWJhcnJpZXIpIHsKLSAgICAgIGlmIChidWZmZXJfZGlydHkoamwtPmpfY29tbWl0X2JoKSkKLQlCVUcoKTsKLSAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCkgOwotICAgICAgc3luY19kaXJ0eV9idWZmZXIoamwtPmpfY29tbWl0X2JoKSA7Ci0gIH0gZWxzZQotICAgICAgd2FpdF9vbl9idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKwlpZiAoIWJhcnJpZXIpIHsKKwkJaWYgKGJ1ZmZlcl9kaXJ0eShqbC0+al9jb21taXRfYmgpKQorCQkJQlVHKCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CisJfSBlbHNlCisJCXdhaXRfb25fYnVmZmVyKGpsLT5qX2NvbW1pdF9iaCk7CiAKLSAgY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHMsIGpsLT5qX2NvbW1pdF9iaCk7CisJY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHMsIGpsLT5qX2NvbW1pdF9iaCk7CiAKLSAgLyogSWYgdGhlcmUgd2FzIGEgd3JpdGUgZXJyb3IgaW4gdGhlIGpvdXJuYWwgLSB3ZSBjYW4ndCBjb21taXQgdGhpcwotICAgKiB0cmFuc2FjdGlvbiAtIGl0IHdpbGwgYmUgaW52YWxpZCBhbmQsIGlmIHN1Y2Nlc3NmdWwsIHdpbGwganVzdCBlbmQKLSAgICogdXAgcHJvcG9nYXRpbmcgdGhlIHdyaXRlIGVycm9yIG91dCB0byB0aGUgZmlsZXN5c3RlbS4gKi8KLSAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGpsLT5qX2NvbW1pdF9iaCkpKSB7CisJLyogSWYgdGhlcmUgd2FzIGEgd3JpdGUgZXJyb3IgaW4gdGhlIGpvdXJuYWwgLSB3ZSBjYW4ndCBjb21taXQgdGhpcworCSAqIHRyYW5zYWN0aW9uIC0gaXQgd2lsbCBiZSBpbnZhbGlkIGFuZCwgaWYgc3VjY2Vzc2Z1bCwgd2lsbCBqdXN0IGVuZAorCSAqIHVwIHByb3BvZ2F0aW5nIHRoZSB3cml0ZSBlcnJvciBvdXQgdG8gdGhlIGZpbGVzeXN0ZW0uICovCisJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoamwtPmpfY29tbWl0X2JoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICByZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTYxNTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAiam91cm5hbC02MTU6IGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKICNlbmRpZgotICAgIHJldHZhbCA9IC1FSU87Ci0gIH0KLSAgYmZvcmdldChqbC0+al9jb21taXRfYmgpIDsKLSAgaWYgKGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgIT0gMCAmJgotICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkKSAhPSAxKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMDogbGFzdCBjb21taXQgJWx1LCBjdXJyZW50ICVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQsCi0JCSAgICAgICBqbC0+al90cmFuc19pZCk7Ci0gIH0KLSAgam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCA9IGpsLT5qX3RyYW5zX2lkOworCQlyZXR2YWwgPSAtRUlPOworCX0KKwliZm9yZ2V0KGpsLT5qX2NvbW1pdF9iaCk7CisJaWYgKGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgIT0gMCAmJgorCSAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkKSAhPSAxKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgImNsbS0yMjAwOiBsYXN0IGNvbW1pdCAlbHUsIGN1cnJlbnQgJWx1IiwKKwkJCQkgam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCwgamwtPmpfdHJhbnNfaWQpOworCX0KKwlqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgLyogbm93LCBldmVyeSBjb21taXQgYmxvY2sgaXMgb24gdGhlIGRpc2suICBJdCBpcyBzYWZlIHRvIGFsbG93IGJsb2NrcyBmcmVlZCBkdXJpbmcgdGhpcyB0cmFuc2FjdGlvbiB0byBiZSByZWFsbG9jYXRlZCAqLwotICBjbGVhbnVwX2ZyZWVkX2Zvcl9qb3VybmFsX2xpc3QocywgamwpIDsKKwkvKiBub3csIGV2ZXJ5IGNvbW1pdCBibG9jayBpcyBvbiB0aGUgZGlzay4gIEl0IGlzIHNhZmUgdG8gYWxsb3cgYmxvY2tzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uIHRvIGJlIHJlYWxsb2NhdGVkICovCisJY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHMsIGpsKTsKIAotICByZXR2YWwgPSByZXR2YWwgPyByZXR2YWwgOiBqb3VybmFsLT5qX2Vycm5vOworCXJldHZhbCA9IHJldHZhbCA/IHJldHZhbCA6IGpvdXJuYWwtPmpfZXJybm87CiAKLSAgLyogbWFyayB0aGUgbWV0YWRhdGEgZGlydHkgKi8KLSAgaWYgKCFyZXR2YWwpCi0gICAgZGlydHlfb25lX3RyYW5zYWN0aW9uKHMsIGpsKTsKLSAgYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgOworCS8qIG1hcmsgdGhlIG1ldGFkYXRhIGRpcnR5ICovCisJaWYgKCFyZXR2YWwpCisJCWRpcnR5X29uZV90cmFuc2FjdGlvbihzLCBqbCk7CisJYXRvbWljX2RlYygmKGpsLT5qX2NvbW1pdF9sZWZ0KSk7CiAKLSAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpIDsKLSAgfQotICB1cCgmamwtPmpfY29tbWl0X2xvY2spOwotcHV0X2psOgotICBwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKKwlpZiAoZmx1c2hhbGwpIHsKKwkJYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpOworCX0KKwl1cCgmamwtPmpfY29tbWl0X2xvY2spOworICAgICAgcHV0X2psOgorCXB1dF9qb3VybmFsX2xpc3QocywgamwpOwogCi0gIGlmIChyZXR2YWwpCi0gICAgcmVpc2VyZnNfYWJvcnQgKHMsIHJldHZhbCwgIkpvdXJuYWwgd3JpdGUgZXJyb3IgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotICByZXR1cm4gcmV0dmFsOworCWlmIChyZXR2YWwpCisJCXJlaXNlcmZzX2Fib3J0KHMsIHJldHZhbCwgIkpvdXJuYWwgd3JpdGUgZXJyb3IgaW4gJXMiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJcHV0X2ZzX2V4Y2woKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgogKiogZmx1c2hfam91cm5hbF9saXN0IGZyZXF1ZW50bHkgbmVlZHMgdG8gZmluZCBhIG5ld2VyIHRyYW5zYWN0aW9uIGZvciBhIGdpdmVuIGJsb2NrLiAgVGhpcyBkb2VzIHRoYXQsIG9yIAogKiogcmV0dXJucyBOVUxMIGlmIGl0IGNhbid0IGZpbmQgYW55dGhpbmcgCiAqLwotc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpbmRfbmV3ZXJfamxfZm9yX2NuKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbikgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gY24tPnNiOwotICBiX2Jsb2NrbnJfdCBibG9ja25yID0gY24tPmJsb2NrbnIgOworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZpbmRfbmV3ZXJfamxfZm9yX2NuKHN0cnVjdAorCQkJCQkJCSAgcmVpc2VyZnNfam91cm5hbF9jbm9kZQorCQkJCQkJCSAgKmNuKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7CisJYl9ibG9ja25yX3QgYmxvY2tuciA9IGNuLT5ibG9ja25yOwogCi0gIGNuID0gY24tPmhwcmV2IDsKLSAgd2hpbGUoY24pIHsKLSAgICBpZiAoY24tPnNiID09IHNiICYmIGNuLT5ibG9ja25yID09IGJsb2NrbnIgJiYgY24tPmpsaXN0KSB7Ci0gICAgICByZXR1cm4gY24tPmpsaXN0IDsKLSAgICB9Ci0gICAgY24gPSBjbi0+aHByZXYgOwotICB9Ci0gIHJldHVybiBOVUxMIDsKKwljbiA9IGNuLT5ocHJldjsKKwl3aGlsZSAoY24pIHsKKwkJaWYgKGNuLT5zYiA9PSBzYiAmJiBjbi0+YmxvY2tuciA9PSBibG9ja25yICYmIGNuLT5qbGlzdCkgeworCQkJcmV0dXJuIGNuLT5qbGlzdDsKKwkJfQorCQljbiA9IGNuLT5ocHJldjsKKwl9CisJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV9qb3VybmFsX2hhc2goc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqLAotc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqLCB1bnNpZ25lZCBsb25nLCBpbnQpOworc3RhdGljIHZvaWQgcmVtb3ZlX2pvdXJuYWxfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKiwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICosIHVuc2lnbmVkIGxvbmcsCisJCQkJaW50KTsKIAogLyoKICoqIG9uY2UgYWxsIHRoZSByZWFsIGJsb2NrcyBoYXZlIGJlZW4gZmx1c2hlZCwgaXQgaXMgc2FmZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZQogKiogam91cm5hbCBsaXN0IGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgQXNpZGUgZnJvbSBmcmVlaW5nIHRoZSBjbm9kZSwgdGhpcyBhbHNvIGFsbG93cyB0aGUKICoqIGJsb2NrIHRvIGJlIHJlYWxsb2NhdGVkIGZvciBkYXRhIGJsb2NrcyBpZiBpdCBoYWQgYmVlbiBkZWxldGVkLgogKi8KLXN0YXRpYyB2b2lkIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZGVidWcpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0IDsKLSAgY24gPSBqbC0+al9yZWFsYmxvY2sgOworc3RhdGljIHZvaWQgcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCQkgaW50IGRlYnVnKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKmxhc3Q7CisJY24gPSBqbC0+al9yZWFsYmxvY2s7CiAKLSAgLyogd2hpY2ggaXMgYmV0dGVyLCB0byBsb2NrIG9uY2UgYXJvdW5kIHRoZSB3aG9sZSBsb29wLCBvcgotICAqKiB0byBsb2NrIGZvciBlYWNoIGNhbGwgdG8gcmVtb3ZlX2pvdXJuYWxfaGFzaD8KLSAgKi8KLSAgd2hpbGUoY24pIHsKLSAgICBpZiAoY24tPmJsb2NrbnIgIT0gMCkgewotICAgICAgaWYgKGRlYnVnKSB7Ci0gICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiYmxvY2sgJXUsIGJoIGlzICVkLCBzdGF0ZSAlbGQiLCBjbi0+YmxvY2tuciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbi0+YmggPyAxOiAwLCBjbi0+c3RhdGUpIDsKLSAgICAgIH0KLSAgICAgIGNuLT5zdGF0ZSA9IDAgOwotICAgICAgcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBqbCwgY24tPmJsb2NrbnIsIDEpIDsKLSAgICB9Ci0gICAgbGFzdCA9IGNuIDsKLSAgICBjbiA9IGNuLT5uZXh0IDsKLSAgICBmcmVlX2Nub2RlKHBfc19zYiwgbGFzdCkgOwotICB9Ci0gIGpsLT5qX3JlYWxibG9jayA9IE5VTEwgOworCS8qIHdoaWNoIGlzIGJldHRlciwgdG8gbG9jayBvbmNlIGFyb3VuZCB0aGUgd2hvbGUgbG9vcCwgb3IKKwkgKiogdG8gbG9jayBmb3IgZWFjaCBjYWxsIHRvIHJlbW92ZV9qb3VybmFsX2hhc2g/CisJICovCisJd2hpbGUgKGNuKSB7CisJCWlmIChjbi0+YmxvY2tuciAhPSAwKSB7CisJCQlpZiAoZGVidWcpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJCSAiYmxvY2sgJXUsIGJoIGlzICVkLCBzdGF0ZSAlbGQiLAorCQkJCQkJIGNuLT5ibG9ja25yLCBjbi0+YmggPyAxIDogMCwKKwkJCQkJCSBjbi0+c3RhdGUpOworCQkJfQorCQkJY24tPnN0YXRlID0gMDsKKwkJCXJlbW92ZV9qb3VybmFsX2hhc2gocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwKKwkJCQkJICAgIGpsLCBjbi0+YmxvY2tuciwgMSk7CisJCX0KKwkJbGFzdCA9IGNuOworCQljbiA9IGNuLT5uZXh0OworCQlmcmVlX2Nub2RlKHBfc19zYiwgbGFzdCk7CisJfQorCWpsLT5qX3JlYWxibG9jayA9IE5VTEw7CiB9CiAKIC8qCkBAIC0xMTE1LDk4ICsxMTk1LDEwNyBAQAogKiogY2FsbGVkIGJ5IGZsdXNoX2pvdXJuYWxfbGlzdCwgYmVmb3JlIGl0IGNhbGxzIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3QKICoqCiAqLwotc3RhdGljIGludCBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworc3RhdGljIGludCBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOwogCi0gIGlmIChyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQgKGpvdXJuYWwpKQotICAgIHJldHVybiAtRUlPOworCWlmIChyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCisJCXJldHVybiAtRUlPOwogCi0gIGlmICh0cmFuc19pZCA+PSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpIHsKLSAgICBpZiAoYnVmZmVyX2xvY2tlZCgoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgIHsKLSAgICAgIHdhaXRfb25fYnVmZmVyKChqb3VybmFsLT5qX2hlYWRlcl9iaCkpIDsKLSAgICAgIGlmICh1bmxpa2VseSAoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpKSB7CisJaWYgKHRyYW5zX2lkID49IGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgeworCQlpZiAoYnVmZmVyX2xvY2tlZCgoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgeworCQkJd2FpdF9vbl9idWZmZXIoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpKSB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtNjk5OiBidWZmZXIgd3JpdGUgZmFpbGVkIikgOworCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkJICJqb3VybmFsLTY5OTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpOwogI2VuZGlmCi0gICAgICAgIHJldHVybiAtRUlPOwotICAgICAgfQotICAgIH0KLSAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZCA7Ci0gICAgam91cm5hbC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gb2Zmc2V0IDsKLSAgICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPmJfZGF0YSkgOwotICAgIGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBjcHVfdG9fbGUzMih0cmFuc19pZCkgOwotICAgIGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpIDsKLSAgICBqaC0+al9tb3VudF9pZCA9IGNwdV90b19sZTMyKGpvdXJuYWwtPmpfbW91bnRfaWQpIDsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCQlqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZDsKKwkJam91cm5hbC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gb2Zmc2V0OworCQlqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPgorCQkJCQkJCWJfZGF0YSk7CisJCWpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBjcHVfdG9fbGUzMih0cmFuc19pZCk7CisJCWpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpOworCQlqaC0+al9tb3VudF9pZCA9IGNwdV90b19sZTMyKGpvdXJuYWwtPmpfbW91bnRfaWQpOwogCi0gICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocF9zX3NiKSkgewotCWludCByZXQ7Ci0JbG9ja19idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOwotCXJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7Ci0JaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgewotCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKLQkgICAgZGlzYWJsZV9iYXJyaWVyKHBfc19zYik7Ci0JICAgIGdvdG8gc3luYzsKKwkJaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocF9zX3NiKSkgeworCQkJaW50IHJldDsKKwkJCWxvY2tfYnVmZmVyKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwkJCXJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQlpZiAocmV0ID09IC1FT1BOT1RTVVBQKSB7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQkJZGlzYWJsZV9iYXJyaWVyKHBfc19zYik7CisJCQkJZ290byBzeW5jOworCQkJfQorCQkJd2FpdF9vbl9idWZmZXIoam91cm5hbC0+al9oZWFkZXJfYmgpOworCQkJY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHBfc19zYiwgam91cm5hbC0+al9oZWFkZXJfYmgpOworCQl9IGVsc2UgeworCQkgICAgICBzeW5jOgorCQkJc2V0X2J1ZmZlcl9kaXJ0eShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCQlzeW5jX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJCX0KKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTgzNzogSU8gZXJyb3IgZHVyaW5nIGpvdXJuYWwgcmVwbGF5Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KLQl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7Ci0JY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHBfc19zYiwgam91cm5hbC0+al9oZWFkZXJfYmgpOwotICAgIH0gZWxzZSB7Ci1zeW5jOgotCXNldF9idWZmZXJfZGlydHkoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKLQlzeW5jX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCkgOwotICAgIH0KLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtODM3OiBJTyBlcnJvciBkdXJpbmcgam91cm5hbCByZXBsYXkiKTsKLSAgICAgIHJldHVybiAtRUlPIDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDAgOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpIHsKLSAgICByZXR1cm4gX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIG9mZnNldCwgdHJhbnNfaWQpOworc3RhdGljIGludCB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKQoreworCXJldHVybiBfdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHBfc19zYiwgb2Zmc2V0LCB0cmFuc19pZCk7CiB9CisKIC8qIAogKiogZmx1c2ggYW55IGFuZCBhbGwgam91cm5hbCBsaXN0cyBvbGRlciB0aGFuIHlvdSBhcmUgCiAqKiBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBmbHVzaF9qb3VybmFsX2xpc3QKICovCiBzdGF0aWMgaW50IGZsdXNoX29sZGVyX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKIHsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpvdGhlcl9qbCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpvdGhlcl9qbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgICAvKiB3ZSBrbm93IHdlIGFyZSB0aGUgb25seSBvbmVzIGZsdXNoaW5nIHRoaW5ncywgbm8gZXh0cmEgcmFjZQotICAgICAqIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCi0gICAgICovCi1yZXN0YXJ0OgotICAgIGVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QubmV4dDsKLSAgICAvKiBEaWQgd2Ugd3JhcD8gKi8KLSAgICBpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBvdGhlcl9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgaWYgKG90aGVyX2psLT5qX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKLSAgICAgICAgQlVHX09OIChvdGhlcl9qbC0+al9yZWZjb3VudCA8PSAwKTsKLQkvKiBkbyBub3QgZmx1c2ggYWxsICovCi0JZmx1c2hfam91cm5hbF9saXN0KHBfc19zYiwgb3RoZXJfamwsIDApIDsKKwkvKiB3ZSBrbm93IHdlIGFyZSB0aGUgb25seSBvbmVzIGZsdXNoaW5nIHRoaW5ncywgbm8gZXh0cmEgcmFjZQorCSAqIHByb3RlY3Rpb24gaXMgcmVxdWlyZWQuCisJICovCisgICAgICByZXN0YXJ0OgorCWVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QubmV4dDsKKwkvKiBEaWQgd2Ugd3JhcD8gKi8KKwlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQorCQlyZXR1cm4gMDsKKwlvdGhlcl9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJaWYgKG90aGVyX2psLT5qX3RyYW5zX2lkIDwgdHJhbnNfaWQpIHsKKwkJQlVHX09OKG90aGVyX2psLT5qX3JlZmNvdW50IDw9IDApOworCQkvKiBkbyBub3QgZmx1c2ggYWxsICovCisJCWZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIG90aGVyX2psLCAwKTsKIAotCS8qIG90aGVyX2psIGlzIG5vdyBkZWxldGVkIGZyb20gdGhlIGxpc3QgKi8KLQlnb3RvIHJlc3RhcnQ7Ci0gICAgfQotICAgIHJldHVybiAwIDsKKwkJLyogb3RoZXJfamwgaXMgbm93IGRlbGV0ZWQgZnJvbSB0aGUgbGlzdCAqLworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBkZWxfZnJvbV93b3JrX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3dvcmtpbmdfbGlzdCkpIHsKLQlsaXN0X2RlbF9pbml0KCZqbC0+al93b3JraW5nX2xpc3QpOwotCWpvdXJuYWwtPmpfbnVtX3dvcmtfbGlzdHMtLTsKLSAgICB9CisJCQkgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWlmICghbGlzdF9lbXB0eSgmamwtPmpfd29ya2luZ19saXN0KSkgeworCQlsaXN0X2RlbF9pbml0KCZqbC0+al93b3JraW5nX2xpc3QpOworCQlqb3VybmFsLT5qX251bV93b3JrX2xpc3RzLS07CisJfQogfQogCiAvKiBmbHVzaCBhIGpvdXJuYWwgbGlzdCwgYm90aCBjb21taXQgYW5kIHJlYWwgYmxvY2tzCkBAIC0xMjE4LDM4MyArMTMwNyw0MDcgQEAKICoqIGFuZCB0aGUgam91cm5hbCBpcyBsb2NrZWQuICBUaGF0IG1lYW5zIGl0IGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIAogKiogZG9fam91cm5hbF9lbmQsIG9yIGJ5IGpvdXJuYWxfcmVsZWFzZQogKi8KLXN0YXRpYyBpbnQgZmx1c2hfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKmxhc3QgOwotICBpbnQgY291bnQgOwotICBpbnQgd2FzX2p3YWl0ID0gMCA7Ci0gIGludCB3YXNfZGlydHkgPSAwIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzYXZlZF9iaCA7IAotICB1bnNpZ25lZCBsb25nIGpfbGVuX3NhdmVkID0gamwtPmpfbGVuIDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgaW50IGVyciA9IDA7CitzdGF0aWMgaW50IGZsdXNoX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisJCQkgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpsYXN0OworCWludCBjb3VudDsKKwlpbnQgd2FzX2p3YWl0ID0gMDsKKwlpbnQgd2FzX2RpcnR5ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNhdmVkX2JoOworCXVuc2lnbmVkIGxvbmcgal9sZW5fc2F2ZWQgPSBqbC0+al9sZW47CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWludCBlcnIgPSAwOwogCi0gIEJVR19PTiAoal9sZW5fc2F2ZWQgPD0gMCk7CisJQlVHX09OKGpfbGVuX3NhdmVkIDw9IDApOwogCi0gIGlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpICE9IDApIHsKLSAgICByZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjA0ODogZmx1c2hfam91cm5hbF9saXN0IGNhbGxlZCB3aXRoIHdjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSkgOwotICB9Ci0gIEJVR19PTiAoamwtPmpfdHJhbnNfaWQgPT0gMCk7Ci0KLSAgLyogaWYgZmx1c2hhbGwgPT0gMCwgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkICovCi0gIGlmIChmbHVzaGFsbCkgewotICAgICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICB9IGVsc2UgaWYgKCFkb3duX3RyeWxvY2soJmpvdXJuYWwtPmpfZmx1c2hfc2VtKSkgewotICAgICAgQlVHKCk7Ci0gIH0KLQotICBjb3VudCA9IDAgOwotICBpZiAoal9sZW5fc2F2ZWQgPiBqb3VybmFsLT5qX3RyYW5zX21heCkgewotICAgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTcxNTogZmx1c2hfam91cm5hbF9saXN0LCBsZW5ndGggaXMgJWx1LCB0cmFucyBpZCAlbHVcbiIsIGpfbGVuX3NhdmVkLCBqbC0+al90cmFuc19pZCk7Ci0gICAgcmV0dXJuIDAgOwotICB9Ci0KLSAgLyogaWYgYWxsIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZSwgZ2V0IG91dCBvZiBoZXJlICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAotICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKLSAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOwotICB9IAotCi0gIC8qIHN0YXJ0IGJ5IHB1dHRpbmcgdGhlIGNvbW1pdCBsaXN0IG9uIGRpc2suICBUaGlzIHdpbGwgYWxzbyBmbHVzaCAKLSAgKiogdGhlIGNvbW1pdCBsaXN0cyBvZiBhbnkgb2xkZXJzIHRyYW5zYWN0aW9ucwotICAqLwotICBmbHVzaF9jb21taXRfbGlzdChzLCBqbCwgMSkgOwotCi0gIGlmICghKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCi0gICAgICBCVUcoKTsKLQotICAvKiBhcmUgd2UgZG9uZSBub3c/ICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAotICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKLSAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOwotICB9Ci0KLSAgLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKLSAgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKLSAgKi8KLSAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSAhPSAwKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtODQ0OiBwYW5pYyBqb3VybmFsIGxpc3QgaXMgZmx1c2hpbmcsIHdjb3VudCBpcyBub3QgMFxuIikgOwotICB9Ci0gIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKLSAgd2hpbGUoY24pIHsKLSAgICB3YXNfandhaXQgPSAwIDsKLSAgICB3YXNfZGlydHkgPSAwIDsKLSAgICBzYXZlZF9iaCA9IE5VTEwgOwotICAgIC8qIGJsb2NrbnIgb2YgMCBpcyBubyBsb25nZXIgaW4gdGhlIGhhc2gsIGlnbm9yZSBpdCAqLwotICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7Ci0gICAgICBnb3RvIGZyZWVfY25vZGUgOwotICAgIH0KLQotICAgIC8qIFRoaXMgdHJhbnNhY3Rpb24gZmFpbGVkIGNvbW1pdC4gRG9uJ3Qgd3JpdGUgb3V0IHRvIHRoZSBkaXNrICovCi0gICAgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKSkKLSAgICAgICAgZ290byBmcmVlX2Nub2RlOwotCi0gICAgcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKLSAgICAvKiB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUuICBXZSBjaGVjayBwamwgdG8gbWFrZSBzdXJlIHdlCi0gICAgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCi0gICAgKiogYmxvY2sgdG8gZGlzawotICAgICovCi0gICAgaWYgKCFwamwgJiYgY24tPmJoKSB7Ci0gICAgICBzYXZlZF9iaCA9IGNuLT5iaCA7Ci0KLSAgICAgIC8qIHdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIG5vYm9keSByZWxlYXNlcyB0aGUgYnVmZmVyIHdoaWxlIAotICAgICAgKiogd2UgYXJlIHdvcmtpbmcgd2l0aCBpdCAKLSAgICAgICovCi0gICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKLQotICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX2RpcnR5KHNhdmVkX2JoKSkgewotICAgICAgICBCVUdfT04gKCFjYW5fZGlydHkgKGNuKSk7Ci0gICAgICAgIHdhc19qd2FpdCA9IDEgOwotICAgICAgICB3YXNfZGlydHkgPSAxIDsKLSAgICAgIH0gZWxzZSBpZiAoY2FuX2RpcnR5KGNuKSkgewotICAgICAgICAvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KLQlCVUcoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpZiBzb21lb25lIGhhcyB0aGlzIGJsb2NrIGluIGEgbmV3ZXIgdHJhbnNhY3Rpb24sIGp1c3QgbWFrZQotICAgICoqIHN1cmUgdGhleSBhcmUgY29tbWl0ZWQsIGFuZCBkb24ndCB0cnkgd3JpdGluZyBpdCB0byBkaXNrCi0gICAgKi8KLSAgICBpZiAocGpsKSB7Ci0gICAgICBpZiAoYXRvbWljX3JlYWQoJnBqbC0+al9jb21taXRfbGVmdCkpCi0gICAgICAgIGZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSkgOwotICAgICAgZ290byBmcmVlX2Nub2RlIDsKLSAgICB9Ci0KLSAgICAvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKLSAgICAqKiB0aGUgYmxvY2sgZ290IGZyZWVkIGluIGEgZnV0dXJlIHRyYW5zYWN0aW9uIAotICAgICovCi0gICAgaWYgKHNhdmVkX2JoID09IE5VTEwpIHsKLSAgICAgIGdvdG8gZnJlZV9jbm9kZSA7Ci0gICAgfQotCi0gICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAotICAgICoqIGxvY2tlZCB3aGlsZSBpdCB3b3Jrcywgc28gd2Ugc2hvdWxkIG5ldmVyIHNlZSBhIGJ1ZmZlciBoZXJlIHRoYXQKLSAgICAqKiBpcyBub3QgbWFya2VkIEpEaXJ0eV93YWl0Ci0gICAgKi8KLSAgICBpZiAoKCF3YXNfandhaXQpICYmICFidWZmZXJfbG9ja2VkKHNhdmVkX2JoKSkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKLQkJCSAgIm5vdCBpbiBhIG5ld2VyIHRyYW5hc2N0aW9uIiwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLAotCQkJICB3YXNfZGlydHkgPyAnICcgOiAnIScsIHdhc19qd2FpdCA/ICcgJyA6ICchJykgOwotICAgIH0KLSAgICBpZiAod2FzX2RpcnR5KSB7IAotICAgICAgLyogd2UgaW5jIGFnYWluIGJlY2F1c2Ugc2F2ZWRfYmggZ2V0cyBkZWNyZW1lbnRlZCBhdCBmcmVlX2Nub2RlICovCi0gICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKLSAgICAgIHNldF9iaXQoQkxPQ0tfTkVFRFNfRkxVU0gsICZjbi0+c3RhdGUpIDsKLSAgICAgIGxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKLSAgICAgIEJVR19PTiAoY24tPmJsb2NrbnIgIT0gc2F2ZWRfYmgtPmJfYmxvY2tucik7Ci0gICAgICBpZiAoYnVmZmVyX2RpcnR5KHNhdmVkX2JoKSkKLSAgICAgICAgc3VibWl0X2xvZ2dlZF9idWZmZXIoc2F2ZWRfYmgpIDsKLSAgICAgIGVsc2UKLSAgICAgICAgdW5sb2NrX2J1ZmZlcihzYXZlZF9iaCk7Ci0gICAgICBjb3VudCsrIDsKLSAgICB9IGVsc2UgewotICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImNsbS0yMDgyOiBVbmFibGUgdG8gZmx1c2ggYnVmZmVyICVsbHUgaW4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KLWZyZWVfY25vZGU6Ci0gICAgbGFzdCA9IGNuIDsKLSAgICBjbiA9IGNuLT5uZXh0IDsKLSAgICBpZiAoc2F2ZWRfYmgpIHsKLSAgICAgIC8qIHdlIGluY3JlbWVudGVkIHRoaXMgdG8ga2VlcCBvdGhlcnMgZnJvbSB0YWtpbmcgdGhlIGJ1ZmZlciBoZWFkIGF3YXkgKi8KLSAgICAgIHB1dF9iaChzYXZlZF9iaCkgOwotICAgICAgaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGNvdW50ID4gMCkgewotICAgIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKLSAgICB3aGlsZShjbikgewotICAgICAgaWYgKHRlc3RfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKSkgewotCWlmICghY24tPmJoKSB7Ci0JICByZWlzZXJmc19wYW5pYyhzLCAiam91cm5hbC0xMDExOiBjbi0+YmggaXMgTlVMTFxuIikgOworCWlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpICE9IDApIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAiY2xtLTIwNDg6IGZsdXNoX2pvdXJuYWxfbGlzdCBjYWxsZWQgd2l0aCB3Y291bnQgJWQiLAorCQkJCSBhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpKTsKIAl9Ci0Jd2FpdF9vbl9idWZmZXIoY24tPmJoKSA7Ci0JaWYgKCFjbi0+YmgpIHsKLQkgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKSA7CisJQlVHX09OKGpsLT5qX3RyYW5zX2lkID09IDApOworCisJLyogaWYgZmx1c2hhbGwgPT0gMCwgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkICovCisJaWYgKGZsdXNoYWxsKSB7CisJCWRvd24oJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKKwl9IGVsc2UgaWYgKCFkb3duX3RyeWxvY2soJmpvdXJuYWwtPmpfZmx1c2hfc2VtKSkgeworCQlCVUcoKTsKIAl9Ci0JaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGNuLT5iaCkpKSB7CisKKwljb3VudCA9IDA7CisJaWYgKGpfbGVuX3NhdmVkID4gam91cm5hbC0+al90cmFuc19tYXgpIHsKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAiam91cm5hbC03MTU6IGZsdXNoX2pvdXJuYWxfbGlzdCwgbGVuZ3RoIGlzICVsdSwgdHJhbnMgaWQgJWx1XG4iLAorCQkJICAgICAgIGpfbGVuX3NhdmVkLCBqbC0+al90cmFuc19pZCk7CisJCXJldHVybiAwOworCX0KKworCWdldF9mc19leGNsKCk7CisKKwkvKiBpZiBhbGwgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lLCBnZXQgb3V0IG9mIGhlcmUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJgorCSAgICBhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm47CisJfQorCisJLyogc3RhcnQgYnkgcHV0dGluZyB0aGUgY29tbWl0IGxpc3Qgb24gZGlzay4gIFRoaXMgd2lsbCBhbHNvIGZsdXNoIAorCSAqKiB0aGUgY29tbWl0IGxpc3RzIG9mIGFueSBvbGRlcnMgdHJhbnNhY3Rpb25zCisJICovCisJZmx1c2hfY29tbWl0X2xpc3QocywgamwsIDEpOworCisJaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKQorCSAgICAmJiAhcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKQorCQlCVUcoKTsKKworCS8qIGFyZSB3ZSBkb25lIG5vdz8gKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqbC0+al9ub256ZXJvbGVuKSkgPD0gMCAmJgorCSAgICBhdG9taWNfcmVhZCgmKGpsLT5qX2NvbW1pdF9sZWZ0KSkgPD0gMCkgeworCQlnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm47CisJfQorCisJLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKKwkgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpICE9IDApIHsKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAiam91cm5hbC04NDQ6IHBhbmljIGpvdXJuYWwgbGlzdCBpcyBmbHVzaGluZywgd2NvdW50IGlzIG5vdCAwXG4iKTsKKwl9CisJY24gPSBqbC0+al9yZWFsYmxvY2s7CisJd2hpbGUgKGNuKSB7CisJCXdhc19qd2FpdCA9IDA7CisJCXdhc19kaXJ0eSA9IDA7CisJCXNhdmVkX2JoID0gTlVMTDsKKwkJLyogYmxvY2tuciBvZiAwIGlzIG5vIGxvbmdlciBpbiB0aGUgaGFzaCwgaWdub3JlIGl0ICovCisJCWlmIChjbi0+YmxvY2tuciA9PSAwKSB7CisJCQlnb3RvIGZyZWVfY25vZGU7CisJCX0KKworCQkvKiBUaGlzIHRyYW5zYWN0aW9uIGZhaWxlZCBjb21taXQuIERvbid0IHdyaXRlIG91dCB0byB0aGUgZGlzayAqLworCQlpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfRElSVFkpKQorCQkJZ290byBmcmVlX2Nub2RlOworCisJCXBqbCA9IGZpbmRfbmV3ZXJfamxfZm9yX2NuKGNuKTsKKwkJLyogdGhlIG9yZGVyIGlzIGltcG9ydGFudCBoZXJlLiAgV2UgY2hlY2sgcGpsIHRvIG1ha2Ugc3VyZSB3ZQorCQkgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCisJCSAqKiBibG9jayB0byBkaXNrCisJCSAqLworCQlpZiAoIXBqbCAmJiBjbi0+YmgpIHsKKwkJCXNhdmVkX2JoID0gY24tPmJoOworCisJCQkvKiB3ZSBkbyB0aGlzIHRvIG1ha2Ugc3VyZSBub2JvZHkgcmVsZWFzZXMgdGhlIGJ1ZmZlciB3aGlsZSAKKwkJCSAqKiB3ZSBhcmUgd29ya2luZyB3aXRoIGl0IAorCQkJICovCisJCQlnZXRfYmgoc2F2ZWRfYmgpOworCisJCQlpZiAoYnVmZmVyX2pvdXJuYWxfZGlydHkoc2F2ZWRfYmgpKSB7CisJCQkJQlVHX09OKCFjYW5fZGlydHkoY24pKTsKKwkJCQl3YXNfandhaXQgPSAxOworCQkJCXdhc19kaXJ0eSA9IDE7CisJCQl9IGVsc2UgaWYgKGNhbl9kaXJ0eShjbikpIHsKKwkJCQkvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCisJCS8qIGlmIHNvbWVvbmUgaGFzIHRoaXMgYmxvY2sgaW4gYSBuZXdlciB0cmFuc2FjdGlvbiwganVzdCBtYWtlCisJCSAqKiBzdXJlIHRoZXkgYXJlIGNvbW1pdGVkLCBhbmQgZG9uJ3QgdHJ5IHdyaXRpbmcgaXQgdG8gZGlzaworCQkgKi8KKwkJaWYgKHBqbCkgeworCQkJaWYgKGF0b21pY19yZWFkKCZwamwtPmpfY29tbWl0X2xlZnQpKQorCQkJCWZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSk7CisJCQlnb3RvIGZyZWVfY25vZGU7CisJCX0KKworCQkvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKKwkJICoqIHRoZSBibG9jayBnb3QgZnJlZWQgaW4gYSBmdXR1cmUgdHJhbnNhY3Rpb24gCisJCSAqLworCQlpZiAoc2F2ZWRfYmggPT0gTlVMTCkgeworCQkJZ290byBmcmVlX2Nub2RlOworCQl9CisKKwkJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAorCQkgKiogbG9ja2VkIHdoaWxlIGl0IHdvcmtzLCBzbyB3ZSBzaG91bGQgbmV2ZXIgc2VlIGEgYnVmZmVyIGhlcmUgdGhhdAorCQkgKiogaXMgbm90IG1hcmtlZCBKRGlydHlfd2FpdAorCQkgKi8KKwkJaWYgKCghd2FzX2p3YWl0KSAmJiAhYnVmZmVyX2xvY2tlZChzYXZlZF9iaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKKwkJCQkJICJub3QgaW4gYSBuZXdlciB0cmFuYXNjdGlvbiIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNhdmVkX2JoLT4KKwkJCQkJIGJfYmxvY2tuciwgd2FzX2RpcnR5ID8gJyAnIDogJyEnLAorCQkJCQkgd2FzX2p3YWl0ID8gJyAnIDogJyEnKTsKKwkJfQorCQlpZiAod2FzX2RpcnR5KSB7CisJCQkvKiB3ZSBpbmMgYWdhaW4gYmVjYXVzZSBzYXZlZF9iaCBnZXRzIGRlY3JlbWVudGVkIGF0IGZyZWVfY25vZGUgKi8KKwkJCWdldF9iaChzYXZlZF9iaCk7CisJCQlzZXRfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKTsKKwkJCWxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCUJVR19PTihjbi0+YmxvY2tuciAhPSBzYXZlZF9iaC0+Yl9ibG9ja25yKTsKKwkJCWlmIChidWZmZXJfZGlydHkoc2F2ZWRfYmgpKQorCQkJCXN1Ym1pdF9sb2dnZWRfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCWVsc2UKKwkJCQl1bmxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKwkJCWNvdW50Kys7CisJCX0gZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAiY2xtLTIwODI6IFVuYWJsZSB0byBmbHVzaCBidWZmZXIgJWxsdSBpbiAlcyIsCisJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNhdmVkX2JoLT4KKwkJCQkJIGJfYmxvY2tuciwgX19GVU5DVElPTl9fKTsKKwkJfQorCSAgICAgIGZyZWVfY25vZGU6CisJCWxhc3QgPSBjbjsKKwkJY24gPSBjbi0+bmV4dDsKKwkJaWYgKHNhdmVkX2JoKSB7CisJCQkvKiB3ZSBpbmNyZW1lbnRlZCB0aGlzIHRvIGtlZXAgb3RoZXJzIGZyb20gdGFraW5nIHRoZSBidWZmZXIgaGVhZCBhd2F5ICovCisJCQlwdXRfYmgoc2F2ZWRfYmgpOworCQkJaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoY291bnQgPiAwKSB7CisJCWNuID0gamwtPmpfcmVhbGJsb2NrOworCQl3aGlsZSAoY24pIHsKKwkJCWlmICh0ZXN0X2JpdChCTE9DS19ORUVEU19GTFVTSCwgJmNuLT5zdGF0ZSkpIHsKKwkJCQlpZiAoIWNuLT5iaCkgeworCQkJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCQkJICAgICAgICJqb3VybmFsLTEwMTE6IGNuLT5iaCBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJd2FpdF9vbl9idWZmZXIoY24tPmJoKTsKKwkJCQlpZiAoIWNuLT5iaCkgeworCQkJCQlyZWlzZXJmc19wYW5pYyhzLAorCQkJCQkJICAgICAgICJqb3VybmFsLTEwMTI6IGNuLT5iaCBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoY24tPmJoKSkpIHsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQkgIHJlaXNlcmZzX3dhcm5pbmcocywgImpvdXJuYWwtOTQ5OiBidWZmZXIgd3JpdGUgZmFpbGVkXG4iKSA7CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgImpvdXJuYWwtOTQ5OiBidWZmZXIgd3JpdGUgZmFpbGVkXG4iKTsKICNlbmRpZgotICAgICAgICAgIGVyciA9IC1FSU87Ci0gIAl9Ci0JLyogbm90ZSwgd2UgbXVzdCBjbGVhciB0aGUgSkRpcnR5X3dhaXQgYml0IGFmdGVyIHRoZSB1cCB0byBkYXRlCi0JKiogY2hlY2ssIG90aGVyd2lzZSB3ZSByYWNlIGFnYWluc3Qgb3VyIGZsdXNocGFnZSByb3V0aW5lCi0JKi8KLSAgICAgICAgQlVHX09OICghdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKSk7CisJCQkJCWVyciA9IC1FSU87CisJCQkJfQorCQkJCS8qIG5vdGUsIHdlIG11c3QgY2xlYXIgdGhlIEpEaXJ0eV93YWl0IGJpdCBhZnRlciB0aGUgdXAgdG8gZGF0ZQorCQkJCSAqKiBjaGVjaywgb3RoZXJ3aXNlIHdlIHJhY2UgYWdhaW5zdCBvdXIgZmx1c2hwYWdlIHJvdXRpbmUKKwkJCQkgKi8KKwkJCQlCVUdfT04oIXRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkKKwkJCQkgICAgICAgKGNuLT5iaCkpOwogCi0gICAgICAgIC8qIHVuZG8gdGhlIGluYyBmcm9tIGpvdXJuYWxfbWFya19kaXJ0eSAqLwotCXB1dF9iaChjbi0+YmgpIDsKLSAgICAgICAgYnJlbHNlKGNuLT5iaCkgOwotICAgICAgfQotICAgICAgY24gPSBjbi0+bmV4dCA7Ci0gICAgfQotICB9CisJCQkJLyogdW5kbyB0aGUgaW5jIGZyb20gam91cm5hbF9tYXJrX2RpcnR5ICovCisJCQkJcHV0X2JoKGNuLT5iaCk7CisJCQkJYnJlbHNlKGNuLT5iaCk7CisJCQl9CisJCQljbiA9IGNuLT5uZXh0OworCQl9CisJfQogCi0gIGlmIChlcnIpCi0gICAgcmVpc2VyZnNfYWJvcnQgKHMsIC1FSU8sICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOwotZmx1c2hfb2xkZXJfYW5kX3JldHVybjoKKwlpZiAoZXJyKQorCQlyZWlzZXJmc19hYm9ydChzLCAtRUlPLAorCQkJICAgICAgICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICBmbHVzaF9vbGRlcl9hbmRfcmV0dXJuOgogCisJLyogYmVmb3JlIHdlIGNhbiB1cGRhdGUgdGhlIGpvdXJuYWwgaGVhZGVyIGJsb2NrLCB3ZSBfbXVzdF8gZmx1c2ggYWxsIAorCSAqKiByZWFsIGJsb2NrcyBmcm9tIGFsbCBvbGRlciB0cmFuc2FjdGlvbnMgdG8gZGlzay4gIFRoaXMgaXMgYmVjYXVzZQorCSAqKiBvbmNlIHRoZSBoZWFkZXIgYmxvY2sgaXMgdXBkYXRlZCwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsIG5vdCBiZQorCSAqKiByZXBsYXllZCBhZnRlciBhIGNyYXNoCisJICovCisJaWYgKGZsdXNoYWxsKSB7CisJCWZsdXNoX29sZGVyX2pvdXJuYWxfbGlzdHMocywgamwpOworCX0KIAotICAvKiBiZWZvcmUgd2UgY2FuIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2ssIHdlIF9tdXN0XyBmbHVzaCBhbGwgCi0gICoqIHJlYWwgYmxvY2tzIGZyb20gYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB0byBkaXNrLiAgVGhpcyBpcyBiZWNhdXNlCi0gICoqIG9uY2UgdGhlIGhlYWRlciBibG9jayBpcyB1cGRhdGVkLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGwgbm90IGJlCi0gICoqIHJlcGxheWVkIGFmdGVyIGEgY3Jhc2gKLSAgKi8KLSAgaWYgKGZsdXNoYWxsKSB7Ci0gICAgZmx1c2hfb2xkZXJfam91cm5hbF9saXN0cyhzLCBqbCk7Ci0gIH0gCi0gIAotICBlcnIgPSBqb3VybmFsLT5qX2Vycm5vOwotICAvKiBiZWZvcmUgd2UgY2FuIHJlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIGhhc2ggdGFibGVzIGZvciB0aGlzIAotICAqKiB0cmFuc2FjdGlvbiwgd2UgbXVzdCBtYWtlIHN1cmUgaXQgY2FuIG5ldmVyIGJlIHJlcGxheWVkCi0gICoqCi0gICoqIHNpbmNlIHdlIGFyZSBvbmx5IGNhbGxlZCBmcm9tIGRvX2pvdXJuYWxfZW5kLCB3ZSBrbm93IGZvciBzdXJlIHRoZXJlCi0gICoqIGFyZSBubyBhbGxvY2F0aW9ucyBnb2luZyBvbiB3aGlsZSB3ZSBhcmUgZmx1c2hpbmcgam91cm5hbCBsaXN0cy4gIFNvLAotICAqKiB3ZSBvbmx5IG5lZWQgdG8gdXBkYXRlIHRoZSBqb3VybmFsIGhlYWRlciBibG9jayBmb3IgdGhlIGxhc3QgbGlzdAotICAqKiBiZWluZyBmbHVzaGVkCi0gICovCi0gIGlmICghZXJyICYmIGZsdXNoYWxsKSB7Ci0gICAgZXJyID0gdXBkYXRlX2pvdXJuYWxfaGVhZGVyX2Jsb2NrKHMsIChqbC0+al9zdGFydCArIGpsLT5qX2xlbiArIDIpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSwgamwtPmpfdHJhbnNfaWQpIDsKLSAgICBpZiAoZXJyKQotICAgICAgICByZWlzZXJmc19hYm9ydCAocywgLUVJTywgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwgX19GVU5DVElPTl9fKTsKLSAgfQotICByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0KHMsIGpsLCAwKSA7Ci0gIGxpc3RfZGVsX2luaXQoJmpsLT5qX2xpc3QpOwotICBqb3VybmFsLT5qX251bV9saXN0cy0tOwotICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOworCWVyciA9IGpvdXJuYWwtPmpfZXJybm87CisJLyogYmVmb3JlIHdlIGNhbiByZW1vdmUgZXZlcnl0aGluZyBmcm9tIHRoZSBoYXNoIHRhYmxlcyBmb3IgdGhpcyAKKwkgKiogdHJhbnNhY3Rpb24sIHdlIG11c3QgbWFrZSBzdXJlIGl0IGNhbiBuZXZlciBiZSByZXBsYXllZAorCSAqKgorCSAqKiBzaW5jZSB3ZSBhcmUgb25seSBjYWxsZWQgZnJvbSBkb19qb3VybmFsX2VuZCwgd2Uga25vdyBmb3Igc3VyZSB0aGVyZQorCSAqKiBhcmUgbm8gYWxsb2NhdGlvbnMgZ29pbmcgb24gd2hpbGUgd2UgYXJlIGZsdXNoaW5nIGpvdXJuYWwgbGlzdHMuICBTbywKKwkgKiogd2Ugb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2sgZm9yIHRoZSBsYXN0IGxpc3QKKwkgKiogYmVpbmcgZmx1c2hlZAorCSAqLworCWlmICghZXJyICYmIGZsdXNoYWxsKSB7CisJCWVyciA9CisJCSAgICB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socywKKwkJCQkJCShqbC0+al9zdGFydCArIGpsLT5qX2xlbiArCisJCQkJCQkgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpLAorCQkJCQkJamwtPmpfdHJhbnNfaWQpOworCQlpZiAoZXJyKQorCQkJcmVpc2VyZnNfYWJvcnQocywgLUVJTywKKwkJCQkgICAgICAgIldyaXRlIGVycm9yIHdoaWxlIHVwZGF0aW5nIGpvdXJuYWwgaGVhZGVyIGluICVzIiwKKwkJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwl9CisJcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdChzLCBqbCwgMCk7CisJbGlzdF9kZWxfaW5pdCgmamwtPmpfbGlzdCk7CisJam91cm5hbC0+al9udW1fbGlzdHMtLTsKKwlkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOwogCi0gIGlmIChqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQgIT0gMCAmJgotICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQpICE9IDEpIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocywgImNsbS0yMjAxOiBsYXN0IGZsdXNoICVsdSwgY3VycmVudCAlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQsCi0JCSAgICAgICBqbC0+al90cmFuc19pZCk7Ci0gIH0KLSAgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJaWYgKGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCAhPSAwICYmCisJICAgIChqbC0+al90cmFuc19pZCAtIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCkgIT0gMSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMTogbGFzdCBmbHVzaCAlbHUsIGN1cnJlbnQgJWx1IiwKKwkJCQkgam91cm5hbC0+al9sYXN0X2ZsdXNoX2lkLCBqbC0+al90cmFuc19pZCk7CisJfQorCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCA9IGpsLT5qX3RyYW5zX2lkOwogCi0gIC8qIG5vdCBzdHJpY3RseSByZXF1aXJlZCBzaW5jZSB3ZSBhcmUgZnJlZWluZyB0aGUgbGlzdCwgYnV0IGl0IHNob3VsZAotICAgKiBoZWxwIGZpbmQgY29kZSB1c2luZyBkZWFkIGxpc3RzIGxhdGVyIG9uCi0gICAqLwotICBqbC0+al9sZW4gPSAwIDsKLSAgYXRvbWljX3NldCgmKGpsLT5qX25vbnplcm9sZW4pLCAwKSA7Ci0gIGpsLT5qX3N0YXJ0ID0gMCA7Ci0gIGpsLT5qX3JlYWxibG9jayA9IE5VTEwgOwotICBqbC0+al9jb21taXRfYmggPSBOVUxMIDsKLSAgamwtPmpfdHJhbnNfaWQgPSAwIDsKLSAgamwtPmpfc3RhdGUgPSAwOwotICBwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKLSAgaWYgKGZsdXNoYWxsKQotICAgIHVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7Ci0gIHJldHVybiBlcnIgOwotfSAKKwkvKiBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGZyZWVpbmcgdGhlIGxpc3QsIGJ1dCBpdCBzaG91bGQKKwkgKiBoZWxwIGZpbmQgY29kZSB1c2luZyBkZWFkIGxpc3RzIGxhdGVyIG9uCisJICovCisJamwtPmpfbGVuID0gMDsKKwlhdG9taWNfc2V0KCYoamwtPmpfbm9uemVyb2xlbiksIDApOworCWpsLT5qX3N0YXJ0ID0gMDsKKwlqbC0+al9yZWFsYmxvY2sgPSBOVUxMOworCWpsLT5qX2NvbW1pdF9iaCA9IE5VTEw7CisJamwtPmpfdHJhbnNfaWQgPSAwOworCWpsLT5qX3N0YXRlID0gMDsKKwlwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKKwlpZiAoZmx1c2hhbGwpCisJCXVwKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisJcHV0X2ZzX2V4Y2woKTsKKwlyZXR1cm4gZXJyOworfQogCiBzdGF0aWMgaW50IHdyaXRlX29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCiAJCQkJIHN0cnVjdCBidWZmZXJfY2h1bmsgKmNodW5rKQogewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKLSAgICBpbnQgcmV0ID0gMCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCWludCByZXQgPSAwOwogCi0gICAgamwtPmpfc3RhdGUgfD0gTElTVF9UT1VDSEVEOwotICAgIGRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7Ci0gICAgaWYgKGpsLT5qX2xlbiA9PSAwIHx8IGF0b21pY19yZWFkKCZqbC0+al9ub256ZXJvbGVuKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKwlqbC0+al9zdGF0ZSB8PSBMSVNUX1RPVUNIRUQ7CisJZGVsX2Zyb21fd29ya19saXN0KHMsIGpsKTsKKwlpZiAoamwtPmpfbGVuID09IDAgfHwgYXRvbWljX3JlYWQoJmpsLT5qX25vbnplcm9sZW4pID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOwotICAgIHdoaWxlKGNuKSB7Ci0gICAgICAgIC8qIGlmIHRoZSBibG9ja25yID09IDAsIHRoaXMgaGFzIGJlZW4gY2xlYXJlZCBmcm9tIHRoZSBoYXNoLAotICAgICAgICAqKiBza2lwIGl0Ci0gICAgICAgICovCi0gICAgICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIG5leHQgOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkoY24tPmJoKSkgewotCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaDsKLQkgICAgLyogd2UgY2FuIHJhY2UgYWdhaW5zdCBqb3VybmFsX21hcmtfZnJlZWQgd2hlbiB3ZSB0cnkKLQkgICAgICogdG8gbG9ja19idWZmZXIoY24tPmJoKSwgc28gd2UgaGF2ZSB0byBpbmMgdGhlIGJ1ZmZlcgotCSAgICAgKiBjb3VudCwgYW5kIHJlY2hlY2sgdGhpbmdzIGFmdGVyIGxvY2tpbmcKLQkgICAgICovCi0JICAgIHRtcF9iaCA9IGNuLT5iaDsKLQkgICAgZ2V0X2JoKHRtcF9iaCk7Ci0JICAgIGxvY2tfYnVmZmVyKHRtcF9iaCk7Ci0JICAgIGlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkodG1wX2JoKSkgewotCQlpZiAoIWJ1ZmZlcl9qb3VybmFsX2RpcnR5KHRtcF9iaCkgfHwKLQkJICAgIGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKHRtcF9iaCkpCi0JCSAgICBCVUcoKTsKLQkJYWRkX3RvX2NodW5rKGNodW5rLCB0bXBfYmgsIE5VTEwsIHdyaXRlX2NodW5rKTsKLQkJcmV0Kys7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdGUsIGNuLT5iaCBtaWdodCBiZSBudWxsIG5vdyAqLwotCQl1bmxvY2tfYnVmZmVyKHRtcF9iaCk7Ci0JICAgIH0KLQkgICAgcHV0X2JoKHRtcF9iaCk7Ci0gICAgICAgIH0KLW5leHQ6Ci0gICAgICAgIGNuID0gY24tPm5leHQgOwotCWNvbmRfcmVzY2hlZCgpOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKKwljbiA9IGpsLT5qX3JlYWxibG9jazsKKwl3aGlsZSAoY24pIHsKKwkJLyogaWYgdGhlIGJsb2NrbnIgPT0gMCwgdGhpcyBoYXMgYmVlbiBjbGVhcmVkIGZyb20gdGhlIGhhc2gsCisJCSAqKiBza2lwIGl0CisJCSAqLworCQlpZiAoY24tPmJsb2NrbnIgPT0gMCkgeworCQkJZ290byBuZXh0OworCQl9CisJCWlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkoY24tPmJoKSkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXBfYmg7CisJCQkvKiB3ZSBjYW4gcmFjZSBhZ2FpbnN0IGpvdXJuYWxfbWFya19mcmVlZCB3aGVuIHdlIHRyeQorCQkJICogdG8gbG9ja19idWZmZXIoY24tPmJoKSwgc28gd2UgaGF2ZSB0byBpbmMgdGhlIGJ1ZmZlcgorCQkJICogY291bnQsIGFuZCByZWNoZWNrIHRoaW5ncyBhZnRlciBsb2NraW5nCisJCQkgKi8KKwkJCXRtcF9iaCA9IGNuLT5iaDsKKwkJCWdldF9iaCh0bXBfYmgpOworCQkJbG9ja19idWZmZXIodG1wX2JoKTsKKwkJCWlmIChjbi0+YmggJiYgY2FuX2RpcnR5KGNuKSAmJiBidWZmZXJfZGlydHkodG1wX2JoKSkgeworCQkJCWlmICghYnVmZmVyX2pvdXJuYWxfZGlydHkodG1wX2JoKSB8fAorCQkJCSAgICBidWZmZXJfam91cm5hbF9wcmVwYXJlZCh0bXBfYmgpKQorCQkJCQlCVUcoKTsKKwkJCQlhZGRfdG9fY2h1bmsoY2h1bmssIHRtcF9iaCwgTlVMTCwgd3JpdGVfY2h1bmspOworCQkJCXJldCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBub3RlLCBjbi0+YmggbWlnaHQgYmUgbnVsbCBub3cgKi8KKwkJCQl1bmxvY2tfYnVmZmVyKHRtcF9iaCk7CisJCQl9CisJCQlwdXRfYmgodG1wX2JoKTsKKwkJfQorCSAgICAgIG5leHQ6CisJCWNuID0gY24tPm5leHQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKiB1c2VkIGJ5IGZsdXNoX2NvbW1pdF9saXN0ICovCiBzdGF0aWMgaW50IGRpcnR5X29uZV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKLSAgICBpbnQgcmV0ID0gMCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKnBqbDsKKwlpbnQgcmV0ID0gMDsKIAotICAgIGpsLT5qX3N0YXRlIHw9IExJU1RfRElSVFk7Ci0gICAgY24gPSBqbC0+al9yZWFsYmxvY2sgOwotICAgIHdoaWxlKGNuKSB7Ci0gICAgICAgIC8qIGxvb2sgZm9yIGEgbW9yZSByZWNlbnQgdHJhbnNhY3Rpb24gdGhhdCBsb2dnZWQgdGhpcwotICAgICAgICAqKiBidWZmZXIuICBPbmx5IHRoZSBtb3N0IHJlY2VudCB0cmFuc2FjdGlvbiB3aXRoIGEgYnVmZmVyIGluCi0gICAgICAgICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCi0gICAgICAgICovCi0JcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKLSAgICAgICAgaWYgKCFwamwgJiYgY24tPmJsb2NrbnIgJiYgY24tPmJoICYmIGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGNuLT5iaCkpCi0JewotCSAgICBCVUdfT04gKCFjYW5fZGlydHkoY24pKTsKLQkgICAgLyogaWYgdGhlIGJ1ZmZlciBpcyBwcmVwYXJlZCwgaXQgd2lsbCBlaXRoZXIgYmUgbG9nZ2VkCi0JICAgICAqIG9yIHJlc3RvcmVkLiAgSWYgcmVzdG9yZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0JICAgICAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5Ci0JICAgICAqLwotICAgICAgICAgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChjbi0+YmgpKSB7Ci0gICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGNuLT5iaCk7Ci0JICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGNuLT5iaCk7Ci0JICAgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eShjbi0+YmgpOwotCSAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNuID0gY24tPm5leHQgOwotICAgIH0KLSAgICByZXR1cm4gcmV0IDsKKwlqbC0+al9zdGF0ZSB8PSBMSVNUX0RJUlRZOworCWNuID0gamwtPmpfcmVhbGJsb2NrOworCXdoaWxlIChjbikgeworCQkvKiBsb29rIGZvciBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uIHRoYXQgbG9nZ2VkIHRoaXMKKwkJICoqIGJ1ZmZlci4gIE9ubHkgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIHdpdGggYSBidWZmZXIgaW4KKwkJICoqIGl0IGlzIGFsbG93ZWQgdG8gc2VuZCB0aGF0IGJ1ZmZlciB0byBkaXNrCisJCSAqLworCQlwamwgPSBmaW5kX25ld2VyX2psX2Zvcl9jbihjbik7CisJCWlmICghcGpsICYmIGNuLT5ibG9ja25yICYmIGNuLT5iaAorCQkgICAgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPmJoKSkgeworCQkJQlVHX09OKCFjYW5fZGlydHkoY24pKTsKKwkJCS8qIGlmIHRoZSBidWZmZXIgaXMgcHJlcGFyZWQsIGl0IHdpbGwgZWl0aGVyIGJlIGxvZ2dlZAorCQkJICogb3IgcmVzdG9yZWQuICBJZiByZXN0b3JlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkJCSAqIGl0IGFjdHVhbGx5IGdldHMgbWFya2VkIGRpcnR5CisJCQkgKi8KKwkJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyhjbi0+YmgpOworCQkJaWYgKGJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGNuLT5iaCkpIHsKKwkJCQlzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShjbi0+YmgpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfYnVmZmVyX2pvdXJuYWxfdGVzdChjbi0+YmgpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJCQl9CisJCX0KKwkJY24gPSBjbi0+bmV4dDsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAotCQkJCSAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCi0JCQkJICAgaW50IG51bV9ibG9ja3MsCi0JCQkJICAgaW50IG51bV90cmFucykgewotICAgIGludCByZXQgPSAwOwotICAgIGludCB3cml0dGVuID0gMCA7Ci0gICAgaW50IHRyYW5zYWN0aW9uc19mbHVzaGVkID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIG9yaWdfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgY2h1bmsubnIgPSAwOworCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKipuZXh0X2psLAorCQkJCXVuc2lnbmVkIGxvbmcgKm5leHRfdHJhbnNfaWQsCisJCQkJaW50IG51bV9ibG9ja3MsIGludCBudW1fdHJhbnMpCit7CisJaW50IHJldCA9IDA7CisJaW50IHdyaXR0ZW4gPSAwOworCWludCB0cmFuc2FjdGlvbnNfZmx1c2hlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvcmlnX3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisJc3RydWN0IGJ1ZmZlcl9jaHVuayBjaHVuazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJY2h1bmsubnIgPSAwOwogCi0gICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICAgIGlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIG9yaWdfdHJhbnNfaWQpKSB7Ci0JZ290byBkb25lOwotICAgIH0KLQotICAgIC8qIHdlJ3ZlIGdvdCBqX2ZsdXNoX3NlbSBoZWxkLCBub2JvZHkgaXMgZ29pbmcgdG8gZGVsZXRlIGFueQotICAgICAqIG9mIHRoZXNlIGxpc3RzIG91dCBmcm9tIHVuZGVybmVhdGggdXMKLSAgICAgKi8KLSAgICB3aGlsZSgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAotICAgICAgICAgICghbnVtX3RyYW5zICYmIHdyaXR0ZW4gPCBudW1fYmxvY2tzKSkgewotCi0JaWYgKGpsLT5qX2xlbiA9PSAwIHx8IChqbC0+al9zdGF0ZSAmIExJU1RfVE9VQ0hFRCkgfHwKLQkgICAgYXRvbWljX3JlYWQoJmpsLT5qX2NvbW1pdF9sZWZ0KSB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpCi0JewotCSAgICBkZWxfZnJvbV93b3JrX2xpc3QocywgamwpOwotCSAgICBicmVhazsKKwlkb3duKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisJaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgb3JpZ190cmFuc19pZCkpIHsKKwkJZ290byBkb25lOwogCX0KLQlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CiAKLQlpZiAocmV0IDwgMCkKLQkgICAgZ290byBkb25lOwotCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7Ci0Jd3JpdHRlbiArPSByZXQ7Ci0JZW50cnkgPSBqbC0+al9saXN0Lm5leHQ7CisJLyogd2UndmUgZ290IGpfZmx1c2hfc2VtIGhlbGQsIG5vYm9keSBpcyBnb2luZyB0byBkZWxldGUgYW55CisJICogb2YgdGhlc2UgbGlzdHMgb3V0IGZyb20gdW5kZXJuZWF0aCB1cworCSAqLworCXdoaWxlICgobnVtX3RyYW5zICYmIHRyYW5zYWN0aW9uc19mbHVzaGVkIDwgbnVtX3RyYW5zKSB8fAorCSAgICAgICAoIW51bV90cmFucyAmJiB3cml0dGVuIDwgbnVtX2Jsb2NrcykpIHsKIAotCS8qIGRpZCB3ZSB3cmFwPyAqLwotCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpIHsKLQkgICAgYnJlYWs7Ci0gICAgICAgIH0KLQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCWlmIChqbC0+al9sZW4gPT0gMCB8fCAoamwtPmpfc3RhdGUgJiBMSVNUX1RPVUNIRUQpIHx8CisJCSAgICBhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpCisJCSAgICB8fCAhKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkpIHsKKwkJCWRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CiAKLQkvKiBkb24ndCBib3RoZXIgd2l0aCBvbGRlciB0cmFuc2FjdGlvbnMgKi8KLQlpZiAoamwtPmpfdHJhbnNfaWQgPD0gb3JpZ190cmFuc19pZCkKLQkgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChjaHVuay5ucikgewotICAgICAgICB3cml0ZV9jaHVuaygmY2h1bmspOwotICAgIH0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7CisJCXdyaXR0ZW4gKz0gcmV0OworCQllbnRyeSA9IGpsLT5qX2xpc3QubmV4dDsKIAotZG9uZToKLSAgICB1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOwotICAgIHJldHVybiByZXQ7CisJCS8qIGRpZCB3ZSB3cmFwPyAqLworCQlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJCQlicmVhazsKKwkJfQorCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisKKwkJLyogZG9uJ3QgYm90aGVyIHdpdGggb2xkZXIgdHJhbnNhY3Rpb25zICovCisJCWlmIChqbC0+al90cmFuc19pZCA8PSBvcmlnX3RyYW5zX2lkKQorCQkJYnJlYWs7CisJfQorCWlmIChjaHVuay5ucikgeworCQl3cml0ZV9jaHVuaygmY2h1bmspOworCX0KKworICAgICAgZG9uZToKKwl1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOworCXJldHVybiByZXQ7CiB9CiAKIC8qIGZvciBvX3N5bmMgYW5kIGZzeW5jIGhlYXZ5IGFwcGxpY2F0aW9ucywgdGhleSB0ZW5kIHRvIHVzZQpAQCAtMTYwNyw0NyArMTcyMCw0OCBAQAogKiogbGlzdCB1cGRhdGVzIHRoZSBoZWFkZXIgYmxvY2sKICovCiBzdGF0aWMgaW50IGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgewotICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGN1cl9sZW47Ci0gICAgaW50IHJldDsKLSAgICBpbnQgaTsKLSAgICBpbnQgbGltaXQgPSAyNTY7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqdGpsOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZsdXNoX2psOwotICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQ7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKwkJCQkgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisJdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCXVuc2lnbmVkIGxvbmcgY3VyX2xlbjsKKwlpbnQgcmV0OworCWludCBpOworCWludCBsaW1pdCA9IDI1NjsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICp0amw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmx1c2hfamw7CisJdW5zaWduZWQgbG9uZyB0cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CiAKLSAgICBmbHVzaF9qbCA9IHRqbCA9IGpsOworCWZsdXNoX2psID0gdGpsID0gamw7CiAKLSAgICAvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KLSAgICBpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCi0JbGltaXQgPSAxMDI0OwotICAgIC8qIGZsdXNoIGZvciAyNTYgdHJhbnNhY3Rpb25zIG9yIGxpbWl0IGJsb2Nrcywgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCi0gICAgZm9yKGkgPSAwIDsgaSA8IDI1NiAmJiBsZW4gPCBsaW1pdCA7IGkrKykgewotCWlmIChhdG9taWNfcmVhZCgmdGpsLT5qX2NvbW1pdF9sZWZ0KSB8fAotCSAgICB0amwtPmpfdHJhbnNfaWQgPCBqbC0+al90cmFuc19pZCkgewotCSAgICBicmVhazsKKwkvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KKwlpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCisJCWxpbWl0ID0gMTAyNDsKKwkvKiBmbHVzaCBmb3IgMjU2IHRyYW5zYWN0aW9ucyBvciBsaW1pdCBibG9ja3MsIHdoaWNoZXZlciBjb21lcyBmaXJzdCAqLworCWZvciAoaSA9IDA7IGkgPCAyNTYgJiYgbGVuIDwgbGltaXQ7IGkrKykgeworCQlpZiAoYXRvbWljX3JlYWQoJnRqbC0+al9jb21taXRfbGVmdCkgfHwKKwkJICAgIHRqbC0+al90cmFuc19pZCA8IGpsLT5qX3RyYW5zX2lkKSB7CisJCQlicmVhazsKKwkJfQorCQljdXJfbGVuID0gYXRvbWljX3JlYWQoJnRqbC0+al9ub256ZXJvbGVuKTsKKwkJaWYgKGN1cl9sZW4gPiAwKSB7CisJCQl0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwkJfQorCQlsZW4gKz0gY3VyX2xlbjsKKwkJZmx1c2hfamwgPSB0amw7CisJCWlmICh0amwtPmpfbGlzdC5uZXh0ID09ICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkKKwkJCWJyZWFrOworCQl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7CiAJfQotCWN1cl9sZW4gPSBhdG9taWNfcmVhZCgmdGpsLT5qX25vbnplcm9sZW4pOwotCWlmIChjdXJfbGVuID4gMCkgewotCSAgICB0amwtPmpfc3RhdGUgJj0gfkxJU1RfVE9VQ0hFRDsKKwkvKiB0cnkgdG8gZmluZCBhIGdyb3VwIG9mIGJsb2NrcyB3ZSBjYW4gZmx1c2ggYWNyb3NzIGFsbCB0aGUKKwkgKiogdHJhbnNhY3Rpb25zLCBidXQgb25seSBib3RoZXIgaWYgd2UndmUgYWN0dWFsbHkgc3Bhbm5lZAorCSAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKKwkgKi8KKwlpZiAoZmx1c2hfamwgIT0gamwpIHsKKwkJcmV0ID0ga3VwZGF0ZV90cmFuc2FjdGlvbnMocywgamwsICZ0amwsICZ0cmFuc19pZCwgbGVuLCBpKTsKIAl9Ci0JbGVuICs9IGN1cl9sZW47Ci0JZmx1c2hfamwgPSB0amw7Ci0JaWYgKHRqbC0+al9saXN0Lm5leHQgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KQotCSAgICBicmVhazsKLQl0amwgPSBKT1VSTkFMX0xJU1RfRU5UUlkodGpsLT5qX2xpc3QubmV4dCk7Ci0gICAgfQotICAgIC8qIHRyeSB0byBmaW5kIGEgZ3JvdXAgb2YgYmxvY2tzIHdlIGNhbiBmbHVzaCBhY3Jvc3MgYWxsIHRoZQotICAgICoqIHRyYW5zYWN0aW9ucywgYnV0IG9ubHkgYm90aGVyIGlmIHdlJ3ZlIGFjdHVhbGx5IHNwYW5uZWQKLSAgICAqKiBhY3Jvc3MgbXVsdGlwbGUgbGlzdHMKLSAgICAqLwotICAgIGlmIChmbHVzaF9qbCAhPSBqbCkgewotICAgICAgICByZXQgPSBrdXBkYXRlX3RyYW5zYWN0aW9ucyhzLCBqbCwgJnRqbCwgJnRyYW5zX2lkLCBsZW4sIGkpOwotICAgIH0KLSAgICBmbHVzaF9qb3VybmFsX2xpc3QocywgZmx1c2hfamwsIDEpOwotICAgIHJldHVybiAwOworCWZsdXNoX2pvdXJuYWxfbGlzdChzLCBmbHVzaF9qbCwgMSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xNjU1LDIwNyArMTc2OSwyNDggQEAKICoqIG9ubHkgdG91Y2hzIHRoZSBobmV4dCBhbmQgaHByZXYgcG9pbnRlcnMuCiAqLwogdm9pZCByZW1vdmVfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLAotCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCi0JCQl1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgcmVtb3ZlX2ZyZWVkKQorCQkJIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqdGFibGUsCisJCQkgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCisJCQkgdW5zaWduZWQgbG9uZyBibG9jaywgaW50IHJlbW92ZV9mcmVlZCkKIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqaGVhZCA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1cjsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKmhlYWQ7CiAKLSAgaGVhZD0gJihqb3VybmFsX2hhc2godGFibGUsIHNiLCBibG9jaykpIDsKLSAgaWYgKCFoZWFkKSB7Ci0gICAgcmV0dXJuIDsKLSAgfQotICBjdXIgPSAqaGVhZCA7Ci0gIHdoaWxlKGN1cikgewotICAgIGlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYiAmJiAoamwgPT0gTlVMTCB8fCBqbCA9PSBjdXItPmpsaXN0KSAmJiAKLSAgICAgICAgKCF0ZXN0X2JpdChCTE9DS19GUkVFRCwgJmN1ci0+c3RhdGUpIHx8IHJlbW92ZV9mcmVlZCkpIHsKLSAgICAgIGlmIChjdXItPmhuZXh0KSB7Ci0gICAgICAgIGN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldiA7Ci0gICAgICB9Ci0gICAgICBpZiAoY3VyLT5ocHJldikgewotCWN1ci0+aHByZXYtPmhuZXh0ID0gY3VyLT5obmV4dCA7Ci0gICAgICB9IGVsc2UgewotCSpoZWFkID0gY3VyLT5obmV4dCA7Ci0gICAgICB9Ci0gICAgICBjdXItPmJsb2NrbnIgPSAwIDsKLSAgICAgIGN1ci0+c2IgPSBOVUxMIDsKLSAgICAgIGN1ci0+c3RhdGUgPSAwIDsKLSAgICAgIGlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpIC8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCi0JYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpIDsKLSAgICAgIGN1ci0+YmggPSBOVUxMIDsKLSAgICAgIGN1ci0+amxpc3QgPSBOVUxMIDsKLSAgICB9IAotICAgIGN1ciA9IGN1ci0+aG5leHQgOwotICB9CisJaGVhZCA9ICYoam91cm5hbF9oYXNoKHRhYmxlLCBzYiwgYmxvY2spKTsKKwlpZiAoIWhlYWQpIHsKKwkJcmV0dXJuOworCX0KKwljdXIgPSAqaGVhZDsKKwl3aGlsZSAoY3VyKSB7CisJCWlmIChjdXItPmJsb2NrbnIgPT0gYmxvY2sgJiYgY3VyLT5zYiA9PSBzYgorCQkgICAgJiYgKGpsID09IE5VTEwgfHwgamwgPT0gY3VyLT5qbGlzdCkKKwkJICAgICYmICghdGVzdF9iaXQoQkxPQ0tfRlJFRUQsICZjdXItPnN0YXRlKSB8fCByZW1vdmVfZnJlZWQpKSB7CisJCQlpZiAoY3VyLT5obmV4dCkgeworCQkJCWN1ci0+aG5leHQtPmhwcmV2ID0gY3VyLT5ocHJldjsKKwkJCX0KKwkJCWlmIChjdXItPmhwcmV2KSB7CisJCQkJY3VyLT5ocHJldi0+aG5leHQgPSBjdXItPmhuZXh0OworCQkJfSBlbHNlIHsKKwkJCQkqaGVhZCA9IGN1ci0+aG5leHQ7CisJCQl9CisJCQljdXItPmJsb2NrbnIgPSAwOworCQkJY3VyLT5zYiA9IE5VTEw7CisJCQljdXItPnN0YXRlID0gMDsKKwkJCWlmIChjdXItPmJoICYmIGN1ci0+amxpc3QpCS8qIGFueWJvZHkgd2hvIGNsZWFycyB0aGUgY3VyLT5iaCB3aWxsIGFsc28gZGVjIHRoZSBub256ZXJvbGVuICovCisJCQkJYXRvbWljX2RlYygmKGN1ci0+amxpc3QtPmpfbm9uemVyb2xlbikpOworCQkJY3VyLT5iaCA9IE5VTEw7CisJCQljdXItPmpsaXN0ID0gTlVMTDsKKwkJfQorCQljdXIgPSBjdXItPmhuZXh0OworCX0KIH0KIAotc3RhdGljIHZvaWQgZnJlZV9qb3VybmFsX3JhbShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKLSAgcmVpc2VyZnNfa2ZyZWUoam91cm5hbC0+al9jdXJyZW50X2psLAotICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHBfc19zYik7Ci0gIGpvdXJuYWwtPmpfbnVtX2xpc3RzLS07CitzdGF0aWMgdm9pZCBmcmVlX2pvdXJuYWxfcmFtKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCXJlaXNlcmZzX2tmcmVlKGpvdXJuYWwtPmpfY3VycmVudF9qbCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0KSwgcF9zX3NiKTsKKwlqb3VybmFsLT5qX251bV9saXN0cy0tOwogCi0gIHZmcmVlKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9vcmlnKSA7Ci0gIGZyZWVfbGlzdF9iaXRtYXBzKHBfc19zYiwgam91cm5hbC0+al9saXN0X2JpdG1hcCkgOwotICBmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpIDsgLyogbXVzdCBiZSBhZnRlciBmcmVlX2xpc3RfYml0bWFwcyAqLwotICBpZiAoam91cm5hbC0+al9oZWFkZXJfYmgpIHsKLSAgICBicmVsc2Uoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKLSAgfQotICAvKiBqX2hlYWRlcl9iaCBpcyBvbiB0aGUgam91cm5hbCBkZXYsIG1ha2Ugc3VyZSBub3QgdG8gcmVsZWFzZSB0aGUgam91cm5hbAotICAgKiBkZXYgdW50aWwgd2UgYnJlbHNlIGpfaGVhZGVyX2JoCi0gICAqLwotICByZWxlYXNlX2pvdXJuYWxfZGV2KHBfc19zYiwgam91cm5hbCk7Ci0gIHZmcmVlKGpvdXJuYWwpIDsKKwl2ZnJlZShqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyk7CisJZnJlZV9saXN0X2JpdG1hcHMocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfYml0bWFwKTsKKwlmcmVlX2JpdG1hcF9ub2RlcyhwX3Nfc2IpOwkvKiBtdXN0IGJlIGFmdGVyIGZyZWVfbGlzdF9iaXRtYXBzICovCisJaWYgKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSB7CisJCWJyZWxzZShqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJfQorCS8qIGpfaGVhZGVyX2JoIGlzIG9uIHRoZSBqb3VybmFsIGRldiwgbWFrZSBzdXJlIG5vdCB0byByZWxlYXNlIHRoZSBqb3VybmFsCisJICogZGV2IHVudGlsIHdlIGJyZWxzZSBqX2hlYWRlcl9iaAorCSAqLworCXJlbGVhc2Vfam91cm5hbF9kZXYocF9zX3NiLCBqb3VybmFsKTsKKwl2ZnJlZShqb3VybmFsKTsKIH0KIAogLyoKICoqIGNhbGwgb24gdW5tb3VudC4gIE9ubHkgc2V0IGVycm9yIHRvIDEgaWYgeW91IGhhdmVuJ3QgbWFkZSB5b3VyIHdheSBvdXQKICoqIG9mIHJlYWRfc3VwZXIoKSB5ZXQuICBBbnkgb3RoZXIgY2FsbGVyIG11c3Qga2VlcCBlcnJvciBhdCAwLgogKi8KLXN0YXRpYyBpbnQgZG9fam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGVycm9yKSB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7Ci0gIGludCBmbHVzaGVkID0gMDsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CitzdGF0aWMgaW50IGRvX2pvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOworCWludCBmbHVzaGVkID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICAvKiB3ZSBvbmx5IHdhbnQgdG8gZmx1c2ggb3V0IHRyYW5zYWN0aW9ucyBpZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGVycm9yID09IDAKLSAgKi8KLSAgaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLSAgICAvKiBlbmQgdGhlIGN1cnJlbnQgdHJhbnMgKi8KLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwxMCwgRkxVU0hfQUxMKSA7CisJLyogd2Ugb25seSB3YW50IHRvIGZsdXNoIG91dCB0cmFuc2FjdGlvbnMgaWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBlcnJvciA9PSAwCisJICovCisJaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJLyogZW5kIHRoZSBjdXJyZW50IHRyYW5zICovCisJCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCQlkb19qb3VybmFsX2VuZCh0aCwgcF9zX3NiLCAxMCwgRkxVU0hfQUxMKTsKIAotICAgIC8qIG1ha2Ugc3VyZSBzb21ldGhpbmcgZ2V0cyBsb2dnZWQgdG8gZm9yY2Ugb3VyIHdheSBpbnRvIHRoZSBmbHVzaCBjb2RlICovCi0gICAgaWYgKCFqb3VybmFsX2pvaW4oJm15dGgsIHBfc19zYiwgMSkpIHsKLSAgICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksIDEpIDsKLSAgICAgICAgam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgICAgICAgZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwxLCBGTFVTSF9BTEwpIDsKLSAgICAgICAgZmx1c2hlZCA9IDE7Ci0gICAgfQotICB9CisJCS8qIG1ha2Ugc3VyZSBzb21ldGhpbmcgZ2V0cyBsb2dnZWQgdG8gZm9yY2Ugb3VyIHdheSBpbnRvIHRoZSBmbHVzaCBjb2RlICovCisJCWlmICgham91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwKKwkJCQkJCSAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwKKwkJCQkJCSAgICAgMSk7CisJCQlqb3VybmFsX21hcmtfZGlydHkoJm15dGgsIHBfc19zYiwKKwkJCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CisJCQlkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBGTFVTSF9BTEwpOworCQkJZmx1c2hlZCA9IDE7CisJCX0KKwl9CiAKLSAgLyogdGhpcyBhbHNvIGNhdGNoZXMgZXJyb3JzIGR1cmluZyB0aGUgZG9fam91cm5hbF9lbmQgYWJvdmUgKi8KLSAgaWYgKCFlcnJvciAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKLSAgICAgIG1lbXNldCgmbXl0aCwgMCwgc2l6ZW9mKG15dGgpKTsKLSAgICAgIGlmICgham91cm5hbF9qb2luX2Fib3J0KCZteXRoLCBwX3Nfc2IsIDEpKSB7Ci0JICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotCSAgam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgICAgICAgICBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCBGTFVTSF9BTEwpIDsKLSAgICAgIH0KLSAgfQorCS8qIHRoaXMgYWxzbyBjYXRjaGVzIGVycm9ycyBkdXJpbmcgdGhlIGRvX2pvdXJuYWxfZW5kIGFib3ZlICovCisJaWYgKCFlcnJvciAmJiByZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJbWVtc2V0KCZteXRoLCAwLCBzaXplb2YobXl0aCkpOworCQlpZiAoIWpvdXJuYWxfam9pbl9hYm9ydCgmbXl0aCwgcF9zX3NiLCAxKSkgeworCQkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsCisJCQkJCQkgICAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZteXRoLCBwX3Nfc2IsCisJCQkJCSAgIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpOworCQkJZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgRkxVU0hfQUxMKTsKKwkJfQorCX0KIAotICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50LS0gOwotICAvKiB3YWl0IGZvciBhbGwgY29tbWl0cyB0byBmaW5pc2ggKi8KLSAgY2FuY2VsX2RlbGF5ZWRfd29yaygmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3dvcmspOwotICBmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKLSAgaWYgKCFyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KSB7Ci0gICAgZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKLSAgICBjb21taXRfd3EgPSBOVUxMOwotICB9CisJcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudC0tOworCS8qIHdhaXQgZm9yIGFsbCBjb21taXRzIHRvIGZpbmlzaCAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJlNCX0pPVVJOQUwocF9zX3NiKS0+al93b3JrKTsKKwlmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKKwlpZiAoIXJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQpIHsKKwkJZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKKwkJY29tbWl0X3dxID0gTlVMTDsKKwl9CiAKLSAgZnJlZV9qb3VybmFsX3JhbShwX3Nfc2IpIDsKKwlmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CiAKLSAgcmV0dXJuIDAgOworCXJldHVybiAwOwogfQogCiAvKgogKiogY2FsbCBvbiB1bm1vdW50LiAgZmx1c2ggYWxsIGpvdXJuYWwgdHJhbnMsIHJlbGVhc2UgYWxsIGFsbG9jJ2QgcmFtCiAqLwotaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKLSAgcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKSA7CitpbnQgam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAwKTsKIH0KKwogLyoKICoqIG9ubHkgY2FsbCBmcm9tIGFuIGVycm9yIGNvbmRpdGlvbiBpbnNpZGUgcmVpc2VyZnNfcmVhZF9zdXBlciEKICovCi1pbnQgam91cm5hbF9yZWxlYXNlX2Vycm9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICByZXR1cm4gZG9fam91cm5hbF9yZWxlYXNlKHRoLCBwX3Nfc2IsIDEpIDsKK2ludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXJldHVybiBkb19qb3VybmFsX3JlbGVhc2UodGgsIHBfc19zYiwgMSk7CiB9CiAKIC8qIGNvbXBhcmVzIGRlc2NyaXB0aW9uIGJsb2NrIHdpdGggY29tbWl0IGJsb2NrLiAgcmV0dXJucyAxIGlmIHRoZXkgZGlmZmVyLCAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lICovCi1zdGF0aWMgaW50IGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYywgCi0JCQkgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCkgewotICBpZiAoZ2V0X2NvbW1pdF90cmFuc19pZCAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19pZCAoZGVzYykgfHwgCi0gICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpIHx8IAotICAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4gKGNvbW1pdCkgPiBTQl9KT1VSTkFMKHBfc19zYiktPmpfdHJhbnNfbWF4IHx8Ci0gICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSA8PSAwIAotICApIHsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworc3RhdGljIGludCBqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MsCisJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0KQoreworCWlmIChnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCkgIT0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSA+IFNCX0pPVVJOQUwocF9zX3NiKS0+al90cmFuc19tYXggfHwKKwkgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSA8PSAwKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KKwogLyogcmV0dXJucyAwIGlmIGl0IGRpZCBub3QgZmluZCBhIGRlc2NyaXB0aW9uIGJsb2NrICAKICoqIHJldHVybnMgLTEgaWYgaXQgZm91bmQgYSBjb3JydXB0IGNvbW1pdCBibG9jawogKiogcmV0dXJucyAxIGlmIGJvdGggZGVzYyBhbmQgY29tbWl0IHdlcmUgdmFsaWQgCiAqLwotc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsIHVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQgOworc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsCisJCQkJCXVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLAorCQkJCQl1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAKLSAgaWYgKCFkX2JoKQotICAgICAgcmV0dXJuIDAgOworCWlmICghZF9iaCkKKwkJcmV0dXJuIDA7CiAKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKLSAgaWYgKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA+IDAgJiYgIW1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgewotICAgIGlmIChvbGRlc3RfaW52YWxpZF90cmFuc19pZCAmJiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgPiAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKLSAgICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtOTg2OiB0cmFuc2FjdGlvbiAiCi0JICAgICAgICAgICAgICAiaXMgdmFsaWQgcmV0dXJuaW5nIGJlY2F1c2UgdHJhbnNfaWQgJWQgaXMgZ3JlYXRlciB0aGFuICIKLQkJICAgICAgIm9sZGVzdF9pbnZhbGlkICVsdSIsIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpLAotCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKLSAgICAgIHJldHVybiAwIDsKLSAgICB9Ci0gICAgaWYgKG5ld2VzdF9tb3VudF9pZCAmJiAqbmV3ZXN0X21vdW50X2lkID4gZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpKSB7Ci0gICAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwODc6IHRyYW5zYWN0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgotCQkgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAotCQkgICAgICpuZXdlc3RfbW91bnRfaWQpIDsKLSAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotICAgIGlmICggZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSk7Ci0gICAgICByZXR1cm4gLTEgOwotICAgIH0KLSAgICBvZmZzZXQgPSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7CisJZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhOworCWlmIChnZXRfZGVzY190cmFuc19sZW4oZGVzYykgPiAwCisJICAgICYmICFtZW1jbXAoZ2V0X2pvdXJuYWxfZGVzY19tYWdpYyhkX2JoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkgeworCQlpZiAob2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgJiYgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkCisJCSAgICAmJiBnZXRfZGVzY190cmFuc19pZChkZXNjKSA+ICpvbGRlc3RfaW52YWxpZF90cmFuc19pZCkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbC05ODY6IHRyYW5zYWN0aW9uICIKKwkJCQkgICAgICAgImlzIHZhbGlkIHJldHVybmluZyBiZWNhdXNlIHRyYW5zX2lkICVkIGlzIGdyZWF0ZXIgdGhhbiAiCisJCQkJICAgICAgICJvbGRlc3RfaW52YWxpZCAlbHUiLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19pZChkZXNjKSwKKwkJCQkgICAgICAgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChuZXdlc3RfbW91bnRfaWQKKwkJICAgICYmICpuZXdlc3RfbW91bnRfaWQgPiBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbC0xMDg3OiB0cmFuc2FjdGlvbiAiCisJCQkJICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSBtb3VudF9pZCAlZCBpcyBsZXNzIHRoYW4gIgorCQkJCSAgICAgICAibmV3ZXN0X21vdW50X2lkICVsdSIsCisJCQkJICAgICAgIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAorCQkJCSAgICAgICAqbmV3ZXN0X21vdW50X2lkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3RyYW5zX21heCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0yMDE4OiBCYWQgdHJhbnNhY3Rpb24gbGVuZ3RoICVkIGVuY291bnRlcmVkLCBpZ25vcmluZyB0cmFuc2FjdGlvbiIsCisJCQkJCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW9mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOwogCi0gICAgLyogb2ssIHdlIGhhdmUgYSBqb3VybmFsIGRlc2NyaXB0aW9uIGJsb2NrLCBsZXRzIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIHZhbGlkICovCi0gICAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCi0JCSAoKG9mZnNldCArIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArIDEpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOwotICAgIGlmICghY19iaCkKLSAgICAgIHJldHVybiAwIDsKLSAgICBjb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhIDsKLSAgICBpZiAoam91cm5hbF9jb21wYXJlX2Rlc2NfY29tbWl0KHBfc19zYiwgZGVzYywgY29tbWl0KSkgewotICAgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAKLSAgICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkLCBjb21taXQgb2Zmc2V0ICVsZCBoYWQgYmFkICIKLQkJICAgICAidGltZSAlZCBvciBsZW5ndGggJWQiLAotCQkgICAgIGNfYmgtPmJfYmxvY2tuciAtICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKLQkJICAgICBnZXRfY29tbWl0X3RyYW5zX2lkIChjb21taXQpLCAKLQkJICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKLSAgICAgIGJyZWxzZShjX2JoKSA7Ci0gICAgICBpZiAob2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpIHsKLQkqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgPSBnZXRfZGVzY190cmFuc19pZChkZXNjKSA7Ci0JcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDA0OiAiCi0JCSAgICAgICAidHJhbnNhY3Rpb25faXNfdmFsaWQgc2V0dGluZyBvbGRlc3QgaW52YWxpZCB0cmFuc19pZCAiCi0JCSAgICAgICAidG8gJWQiLCBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOyAKLSAgICB9Ci0gICAgYnJlbHNlKGNfYmgpIDsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMDY6IGZvdW5kIHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb24gc3RhcnQgb2Zmc2V0ICVsbHUsIGxlbiAlZCBpZCAlZCIsCi0JCSAgIGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKLQkJICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgOwotICAgIHJldHVybiAxIDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwkJLyogb2ssIHdlIGhhdmUgYSBqb3VybmFsIGRlc2NyaXB0aW9uIGJsb2NrLCBsZXRzIHNlZSBpZiB0aGUgdHJhbnNhY3Rpb24gd2FzIHZhbGlkICovCisJCWNfYmggPQorCQkgICAgam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkJICAoKG9mZnNldCArIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSArCisJCQkJICAgIDEpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJCWlmICghY19iaCkKKwkJCXJldHVybiAwOworCQljb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhOworCQlpZiAoam91cm5hbF9jb21wYXJlX2Rlc2NfY29tbWl0KHBfc19zYiwgZGVzYywgY29tbWl0KSkgeworCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCSAgICAgICAiam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZCwgY29tbWl0IG9mZnNldCAlbGQgaGFkIGJhZCAiCisJCQkJICAgICAgICJ0aW1lICVkIG9yIGxlbmd0aCAlZCIsCisJCQkJICAgICAgIGNfYmgtPmJfYmxvY2tuciAtCisJCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAorCQkJCSAgICAgICBnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCksCisJCQkJICAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJaWYgKG9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKSB7CisJCQkJKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkID0KKwkJCQkgICAgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyk7CisJCQkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJCQkgICAgICAgImpvdXJuYWwtMTAwNDogIgorCQkJCQkgICAgICAgInRyYW5zYWN0aW9uX2lzX3ZhbGlkIHNldHRpbmcgb2xkZXN0IGludmFsaWQgdHJhbnNfaWQgIgorCQkJCQkgICAgICAgInRvICVkIiwKKwkJCQkJICAgICAgIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVsc2UoY19iaCk7CisJCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAiam91cm5hbC0xMDA2OiBmb3VuZCB2YWxpZCAiCisJCQkgICAgICAgInRyYW5zYWN0aW9uIHN0YXJ0IG9mZnNldCAlbGx1LCBsZW4gJWQgaWQgJWQiLAorCQkJICAgICAgIGRfYmgtPmJfYmxvY2tuciAtCisJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLAorCQkJICAgICAgIGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQogfQogCi1zdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pIHsKLSAgaW50IGkgOwotICBmb3IgKGkgPSAwIDsgaSA8IG51bSA7IGkrKykgewotICAgIGJyZWxzZShoZWFkc1tpXSkgOwotICB9CitzdGF0aWMgdm9pZCBicmVsc2VfYXJyYXkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqaGVhZHMsIGludCBudW0pCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWJyZWxzZShoZWFkc1tpXSk7CisJfQogfQogCiAvKgpAQCAtMTg2MywxNDkgKzIwMTgsMjAyIEBACiAqKiB0aGlzIGVpdGhlciByZWFkcyBpbiBhIHJlcGxheXMgYSB0cmFuc2FjdGlvbiwgb3IgcmV0dXJucyBiZWNhdXNlIHRoZSB0cmFuc2FjdGlvbgogKiogaXMgaW52YWxpZCwgb3IgdG9vIG9sZC4KICovCi1zdGF0aWMgaW50IGpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBjdXJfZGJsb2NrLCB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCwgCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCA7Ci0gIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSAwIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqbG9nX2Jsb2NrcyA9IE5VTEwgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipyZWFsX2Jsb2NrcyA9IE5VTEwgOwotICB1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldCA7Ci0gIGludCBpOwotICBpbnQgdHJhbnNfaGFsZjsKK3N0YXRpYyBpbnQgam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2ssCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBuZXdlc3RfbW91bnRfaWQpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX2lkID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmxvZ19ibG9ja3MgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKnJlYWxfYmxvY2tzID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHRyYW5zX29mZnNldDsKKwlpbnQgaTsKKwlpbnQgdHJhbnNfaGFsZjsKIAotICBkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spIDsKLSAgaWYgKCFkX2JoKQotICAgIHJldHVybiAxIDsKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhIDsKLSAgdHJhbnNfb2Zmc2V0ID0gZF9iaC0+Yl9ibG9ja25yIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOwotICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzc6ICIKLSAgICAgICAgICAgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCi0JCSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSBnZXRfZGVzY190cmFuc19sZW4oZGVzYyksIGdldF9kZXNjX21vdW50X2lkKGRlc2MpKSA7Ci0gIGlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgewotICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzOTogIgotICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnMgc2tpcHBpbmcgYmVjYXVzZSAlbHUgaXMgdG9vIG9sZCIsCi0JCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSkgOwotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIGlmIChnZXRfZGVzY19tb3VudF9pZChkZXNjKSAhPSBuZXdlc3RfbW91bnRfaWQpIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKLSAgICAgICAgICAgICAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgotCQkgICAibmV3ZXN0X21vdW50X2lkICVsdSIsIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLAotCQkgICAgbmV3ZXN0X21vdW50X2lkKSA7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCi0JCSgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJSAKLQkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKLSAgaWYgKCFjX2JoKSB7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZXR1cm4gMSA7Ci0gIH0KLSAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7Ci0gIGlmIChqb3VybmFsX2NvbXBhcmVfZGVzY19jb21taXQocF9zX3NiLCBkZXNjLCBjb21taXQpKSB7Ci0gICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uLCAiCi0gICAgICAgICAgICAgICAgICAgImNvbW1pdCBvZmZzZXQgJWxsdSBoYWQgYmFkIHRpbWUgJWQgb3IgbGVuZ3RoICVkIiwKLQkJICAgY19iaC0+Yl9ibG9ja25yIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKLQkJICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLCBnZXRfY29tbWl0X3RyYW5zX2xlbihjb21taXQpKTsKLSAgICBicmVsc2UoY19iaCkgOwotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgcmV0dXJuIDE7IAotICB9Ci0gIHRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOwotICAvKiBub3cgd2Uga25vdyB3ZSd2ZSBnb3QgYSBnb29kIHRyYW5zYWN0aW9uLCBhbmQgaXQgd2FzIGluc2lkZSB0aGUgdmFsaWQgdGltZSByYW5nZXMgKi8KLSAgbG9nX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOwotICByZWFsX2Jsb2NrcyA9IHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYikgOwotICBpZiAoIWxvZ19ibG9ja3MgIHx8ICFyZWFsX2Jsb2NrcykgewotICAgIGJyZWxzZShjX2JoKSA7Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTExNjk6IGttYWxsb2MgZmFpbGVkLCB1bmFibGUgdG8gbW91bnQgRlMiKSA7Ci0gICAgcmV0dXJuIC0xIDsKLSAgfQotICAvKiBnZXQgYWxsIHRoZSBidWZmZXIgaGVhZHMgKi8KLSAgdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOwotICBmb3IoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7Ci0gICAgbG9nX2Jsb2Nrc1tpXSA9ICBqb3VybmFsX2dldGJsayhwX3Nfc2IsICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICh0cmFuc19vZmZzZXQgKyAxICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOwotICAgIGlmIChpIDwgdHJhbnNfaGFsZikgewotICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShkZXNjLT5qX3JlYWxibG9ja1tpXSkpIDsKLSAgICB9IGVsc2UgewotICAgICAgcmVhbF9ibG9ja3NbaV0gPSBzYl9nZXRibGsocF9zX3NiLCBsZTMyX3RvX2NwdShjb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSkpIDsKLSAgICB9Ci0gICAgaWYgKCByZWFsX2Jsb2Nrc1tpXS0+Yl9ibG9ja25yID4gU0JfQkxPQ0tfQ09VTlQocF9zX3NiKSApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xMjA3OiBSRVBMQVkgRkFJTFVSRSBmc2NrIHJlcXVpcmVkISBCbG9jayB0byByZXBsYXkgaXMgb3V0c2lkZSBvZiBmaWxlc3lzdGVtIik7Ci0gICAgICBnb3RvIGFib3J0X3JlcGxheTsKLSAgICB9Ci0gICAgLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLwotICAgIGlmIChpc19ibG9ja19pbl9sb2dfb3JfcmVzZXJ2ZWRfYXJlYShwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIwNDogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgVHJ5aW5nIHRvIHJlcGxheSBvbnRvIGEgbG9nIGJsb2NrIikgOwotYWJvcnRfcmVwbGF5OgotICAgICAgYnJlbHNlX2FycmF5KGxvZ19ibG9ja3MsIGkpIDsKLSAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgaSkgOwotICAgICAgYnJlbHNlKGNfYmgpIDsKLSAgICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgICByZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKLSAgICAgIHJldHVybiAtMSA7Ci0gICAgfQotICB9Ci0gIC8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCi0gIGxsX3J3X2Jsb2NrKFJFQUQsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgbG9nX2Jsb2NrcykgOwotICBmb3IgKGkgPSAwIDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA7IGkrKykgewotICAgIHdhaXRfb25fYnVmZmVyKGxvZ19ibG9ja3NbaV0pIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShsb2dfYmxvY2tzW2ldKSkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7Ci0gICAgICBicmVsc2VfYXJyYXkobG9nX2Jsb2NrcyArIGksIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpIDsKLSAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpKSA7Ci0gICAgICBicmVsc2UoY19iaCkgOwotICAgICAgYnJlbHNlKGRfYmgpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0gICAgbWVtY3B5KHJlYWxfYmxvY2tzW2ldLT5iX2RhdGEsIGxvZ19ibG9ja3NbaV0tPmJfZGF0YSwgcmVhbF9ibG9ja3NbaV0tPmJfc2l6ZSkgOwotICAgIHNldF9idWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pIDsKLSAgICBicmVsc2UobG9nX2Jsb2Nrc1tpXSkgOwotICB9Ci0gIC8qIGZsdXNoIG91dCB0aGUgcmVhbCBibG9ja3MgKi8KLSAgZm9yIChpID0gMCA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgOyBpKyspIHsKLSAgICBzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKSA7Ci0gICAgbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSkgOwotICB9Ci0gIGZvciAoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7Ci0gICAgd2FpdF9vbl9idWZmZXIocmVhbF9ibG9ja3NbaV0pIDsgCi0gICAgaWYgKCFidWZmZXJfdXB0b2RhdGUocmVhbF9ibG9ja3NbaV0pKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIyNjogUkVQTEFZIEZBSUxVUkUsIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKSA7Ci0gICAgICBicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MgKyBpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgLSBpKSA7Ci0gICAgICBicmVsc2UoY19iaCkgOwotICAgICAgYnJlbHNlKGRfYmgpIDsKLSAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICAgICAgcmV0dXJuIC0xIDsKLSAgICB9Ci0gICAgYnJlbHNlKHJlYWxfYmxvY2tzW2ldKSA7Ci0gIH0KLSAgY3VyX2RibG9jayA9ICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKLSAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDk1OiBzZXR0aW5nIGpvdXJuYWwgIgotICAgICAgICAgICAgICAgICAic3RhcnQgdG8gb2Zmc2V0ICVsZCIsCi0JCSBjdXJfZGJsb2NrIC0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKSA7Ci0gIAotICAvKiBpbml0IHN0YXJ0aW5nIHZhbHVlcyBmb3IgdGhlIGZpcnN0IHRyYW5zYWN0aW9uLCBpbiBjYXNlIHRoaXMgaXMgdGhlIGxhc3QgdHJhbnNhY3Rpb24gdG8gYmUgcmVwbGF5ZWQuICovCi0gIGpvdXJuYWwtPmpfc3RhcnQgPSBjdXJfZGJsb2NrIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOwotICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSB0cmFuc19pZCA7Ci0gIGpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7Ci0gIGJyZWxzZShjX2JoKSA7Ci0gIGJyZWxzZShkX2JoKSA7Ci0gIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGxlMzJfdG9fY3B1KGRlc2MtPmpfbGVuKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOwotICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7Ci0gIHJldHVybiAwIDsKKwlkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIGN1cl9kYmxvY2spOworCWlmICghZF9iaCkKKwkJcmV0dXJuIDE7CisJZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopZF9iaC0+Yl9kYXRhOworCXRyYW5zX29mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzNzogIgorCQkgICAgICAgImpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbiwgb2Zmc2V0ICVsbHUsIGxlbiAlZCBtb3VudF9pZCAlZCIsCisJCSAgICAgICBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJICAgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOworCWlmIChnZXRfZGVzY190cmFuc19pZChkZXNjKSA8IG9sZGVzdF90cmFuc19pZCkgeworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwMzk6ICIKKwkJCSAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWx1IGlzIHRvbyBvbGQiLAorCQkJICAgICAgIGN1cl9kYmxvY2sgLQorCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKTsKKwkJYnJlbHNlKGRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGdldF9kZXNjX21vdW50X2lkKGRlc2MpICE9IG5ld2VzdF9tb3VudF9pZCkgeworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNDY6ICIKKwkJCSAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zIHNraXBwaW5nIGJlY2F1c2UgJWQgaXMgIT0gIgorCQkJICAgICAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYyksCisJCQkgICAgICAgbmV3ZXN0X21vdW50X2lkKTsKKwkJYnJlbHNlKGRfYmgpOworCQlyZXR1cm4gMTsKKwl9CisJY19iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkgICAgICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMSkgJQorCQkJICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJaWYgKCFjX2JoKSB7CisJCWJyZWxzZShkX2JoKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGE7CisJaWYgKGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChwX3Nfc2IsIGRlc2MsIGNvbW1pdCkpIHsKKwkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24sICIKKwkJCSAgICAgICAiY29tbWl0IG9mZnNldCAlbGx1IGhhZCBiYWQgdGltZSAlZCBvciBsZW5ndGggJWQiLAorCQkJICAgICAgIGNfYmgtPmJfYmxvY2tuciAtCisJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCQkgICAgICAgZ2V0X2NvbW1pdF90cmFuc19pZChjb21taXQpLAorCQkJICAgICAgIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworCQlicmVsc2UoY19iaCk7CisJCWJyZWxzZShkX2JoKTsKKwkJcmV0dXJuIDE7CisJfQorCXRyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyk7CisJLyogbm93IHdlIGtub3cgd2UndmUgZ290IGEgZ29vZCB0cmFuc2FjdGlvbiwgYW5kIGl0IHdhcyBpbnNpZGUgdGhlIHZhbGlkIHRpbWUgcmFuZ2VzICovCisJbG9nX2Jsb2NrcyA9CisJICAgIHJlaXNlcmZzX2ttYWxsb2MoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX05PRlMsIHBfc19zYik7CisJcmVhbF9ibG9ja3MgPQorCSAgICByZWlzZXJmc19rbWFsbG9jKGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIEdGUF9OT0ZTLCBwX3Nfc2IpOworCWlmICghbG9nX2Jsb2NrcyB8fCAhcmVhbF9ibG9ja3MpIHsKKwkJYnJlbHNlKGNfYmgpOworCQlicmVsc2UoZF9iaCk7CisJCXJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsCisJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQlyZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywKKwkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYik7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMTY5OiBrbWFsbG9jIGZhaWxlZCwgdW5hYmxlIHRvIG1vdW50IEZTIik7CisJCXJldHVybiAtMTsKKwl9CisJLyogZ2V0IGFsbCB0aGUgYnVmZmVyIGhlYWRzICovCisJdHJhbnNfaGFsZiA9IGpvdXJuYWxfdHJhbnNfaGFsZihwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpOyBpKyspIHsKKwkJbG9nX2Jsb2Nrc1tpXSA9CisJCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgICh0cmFuc19vZmZzZXQgKyAxICsKKwkJCQkgICAgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworCQlpZiAoaSA8IHRyYW5zX2hhbGYpIHsKKwkJCXJlYWxfYmxvY2tzW2ldID0KKwkJCSAgICBzYl9nZXRibGsocF9zX3NiLAorCQkJCSAgICAgIGxlMzJfdG9fY3B1KGRlc2MtPmpfcmVhbGJsb2NrW2ldKSk7CisJCX0gZWxzZSB7CisJCQlyZWFsX2Jsb2Nrc1tpXSA9CisJCQkgICAgc2JfZ2V0YmxrKHBfc19zYiwKKwkJCQkgICAgICBsZTMyX3RvX2NwdShjb21taXQtPgorCQkJCQkJICBqX3JlYWxibG9ja1tpIC0gdHJhbnNfaGFsZl0pKTsKKwkJfQorCQlpZiAocmVhbF9ibG9ja3NbaV0tPmJfYmxvY2tuciA+IFNCX0JMT0NLX0NPVU5UKHBfc19zYikpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImpvdXJuYWwtMTIwNzogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgQmxvY2sgdG8gcmVwbGF5IGlzIG91dHNpZGUgb2YgZmlsZXN5c3RlbSIpOworCQkJZ290byBhYm9ydF9yZXBsYXk7CisJCX0KKwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZXBsYXkgb250byBsb2cgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCQlpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEKKwkJICAgIChwX3Nfc2IsIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTEyMDQ6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIFRyeWluZyB0byByZXBsYXkgb250byBhIGxvZyBibG9jayIpOworCQkgICAgICBhYm9ydF9yZXBsYXk6CisJCQlicmVsc2VfYXJyYXkobG9nX2Jsb2NrcywgaSk7CisJCQlicmVsc2VfYXJyYXkocmVhbF9ibG9ja3MsIGkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCS8qIHJlYWQgaW4gdGhlIGxvZyBibG9ja3MsIG1lbWNweSB0byB0aGUgY29ycmVzcG9uZGluZyByZWFsIGJsb2NrICovCisJbGxfcndfYmxvY2soUkVBRCwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBsb2dfYmxvY2tzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpOyBpKyspIHsKKwkJd2FpdF9vbl9idWZmZXIobG9nX2Jsb2Nrc1tpXSk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGxvZ19ibG9ja3NbaV0pKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTEyMTI6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIGJ1ZmZlciB3cml0ZSBmYWlsZWQiKTsKKwkJCWJyZWxzZV9hcnJheShsb2dfYmxvY2tzICsgaSwKKwkJCQkgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpOworCQkJYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweShyZWFsX2Jsb2Nrc1tpXS0+Yl9kYXRhLCBsb2dfYmxvY2tzW2ldLT5iX2RhdGEsCisJCSAgICAgICByZWFsX2Jsb2Nrc1tpXS0+Yl9zaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShyZWFsX2Jsb2Nrc1tpXSk7CisJCWJyZWxzZShsb2dfYmxvY2tzW2ldKTsKKwl9CisJLyogZmx1c2ggb3V0IHRoZSByZWFsIGJsb2NrcyAqLworCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCQlzZXRfYnVmZmVyX2RpcnR5KHJlYWxfYmxvY2tzW2ldKTsKKwkJbGxfcndfYmxvY2soV1JJVEUsIDEsIHJlYWxfYmxvY2tzICsgaSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYyk7IGkrKykgeworCQl3YWl0X29uX2J1ZmZlcihyZWFsX2Jsb2Nrc1tpXSk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKHJlYWxfYmxvY2tzW2ldKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0xMjI2OiBSRVBMQVkgRkFJTFVSRSwgZnNjayByZXF1aXJlZCEgYnVmZmVyIHdyaXRlIGZhaWxlZCIpOworCQkJYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzICsgaSwKKwkJCQkgICAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpOworCQkJYnJlbHNlKGNfYmgpOworCQkJYnJlbHNlKGRfYmgpOworCQkJcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywKKwkJCQkgICAgICAgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICoKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKTsKKwkJCXJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLAorCQkJCSAgICAgICBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKgorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWxzZShyZWFsX2Jsb2Nrc1tpXSk7CisJfQorCWN1cl9kYmxvY2sgPQorCSAgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJICAgICgodHJhbnNfb2Zmc2V0ICsgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsKKwkgICAgICAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgImpvdXJuYWwtMTA5NTogc2V0dGluZyBqb3VybmFsICIgInN0YXJ0IHRvIG9mZnNldCAlbGQiLAorCQkgICAgICAgY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKTsKKworCS8qIGluaXQgc3RhcnRpbmcgdmFsdWVzIGZvciB0aGUgZmlyc3QgdHJhbnNhY3Rpb24sIGluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0byBiZSByZXBsYXllZC4gKi8KKwlqb3VybmFsLT5qX3N0YXJ0ID0gY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IHRyYW5zX2lkOworCWpvdXJuYWwtPmpfdHJhbnNfaWQgPSB0cmFuc19pZCArIDE7CisJYnJlbHNlKGNfYmgpOworCWJyZWxzZShkX2JoKTsKKwlyZWlzZXJmc19rZnJlZShsb2dfYmxvY2tzLAorCQkgICAgICAgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJICAgICAgIHBfc19zYik7CisJcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsCisJCSAgICAgICBsZTMyX3RvX2NwdShkZXNjLT5qX2xlbikgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAorCQkgICAgICAgcF9zX3NiKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiByZWFkcyBibG9ja3Mgc3RhcnRpbmcgZnJvbSBibG9jayBhbmQgdG8gbWF4X2Jsb2NrIG9mIGJ1ZnNpemUKQEAgLTIwMTQsMzkgKzIyMjIsMzkgQEAKICAgIFJpZ2h0IG5vdyBpdCBpcyBvbmx5IHVzZWQgZnJvbSBqb3VybmFsIGNvZGUuIEJ1dCBsYXRlciB3ZSBtaWdodCB1c2UgaXQKICAgIGZyb20gb3RoZXIgcGxhY2VzLgogICAgTm90ZTogRG8gbm90IHVzZSBqb3VybmFsX2dldGJsay9zYl9nZXRibGsgZnVuY3Rpb25zIGhlcmUhICovCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogcmVpc2VyZnNfYnJlYWRhIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywgaW50IGJ1ZnNpemUsCi0JCQkgICAgdW5zaWduZWQgaW50IG1heF9ibG9jaykKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlaXNlcmZzX2JyZWFkYShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywKKwkJCQkJICAgaW50IGJ1ZnNpemUsIHVuc2lnbmVkIGludCBtYXhfYmxvY2spCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhsaXN0W0JVRk5SXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJobGlzdFtCVUZOUl07CiAJdW5zaWduZWQgaW50IGJsb2NrcyA9IEJVRk5SOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGksIGo7Ci0JCi0JYmggPSBfX2dldGJsayAoZGV2LCBibG9jaywgYnVmc2l6ZSApOwotCWlmIChidWZmZXJfdXB0b2RhdGUgKGJoKSkKLQkJcmV0dXJuIChiaCk7ICAgCi0JCQorCisJYmggPSBfX2dldGJsayhkZXYsIGJsb2NrLCBidWZzaXplKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJcmV0dXJuIChiaCk7CisKIAlpZiAoYmxvY2sgKyBCVUZOUiA+IG1heF9ibG9jaykgewogCQlibG9ja3MgPSBtYXhfYmxvY2sgLSBibG9jazsKIAl9CiAJYmhsaXN0WzBdID0gYmg7CiAJaiA9IDE7CiAJZm9yIChpID0gMTsgaSA8IGJsb2NrczsgaSsrKSB7Ci0JCWJoID0gX19nZXRibGsgKGRldiwgYmxvY2sgKyBpLCBidWZzaXplKTsKLQkJaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKSB7Ci0JCQlicmVsc2UgKGJoKTsKKwkJYmggPSBfX2dldGJsayhkZXYsIGJsb2NrICsgaSwgYnVmc2l6ZSk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQlicmVsc2UoYmgpOwogCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBiaGxpc3RbaisrXSA9IGJoOworCQl9IGVsc2UKKwkJCWJobGlzdFtqKytdID0gYmg7CiAJfQotCWxsX3J3X2Jsb2NrIChSRUFELCBqLCBiaGxpc3QpOwotCWZvcihpID0gMTsgaSA8IGo7IGkrKykgCi0JCWJyZWxzZSAoYmhsaXN0W2ldKTsKKwlsbF9yd19ibG9jayhSRUFELCBqLCBiaGxpc3QpOworCWZvciAoaSA9IDE7IGkgPCBqOyBpKyspCisJCWJyZWxzZShiaGxpc3RbaV0pOwogCWJoID0gYmhsaXN0WzBdOwotCXdhaXRfb25fYnVmZmVyIChiaCk7Ci0JaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKQorCXdhaXRfb25fYnVmZmVyKGJoKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJcmV0dXJuIGJoOwotCWJyZWxzZSAoYmgpOworCWJyZWxzZShiaCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTIwNTksMjE4ICsyMjY3LDI1MCBAQAogKioKICoqIE9uIGV4aXQsIGl0IHNldHMgdGhpbmdzIHVwIHNvIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiB3aWxsIHdvcmsgY29ycmVjdGx5LgogKi8KLXN0YXRpYyBpbnQgam91cm5hbF9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7Ci0gIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3RyYW5zX2lkID0gMDsKLSAgdW5zaWduZWQgbG9uZyBvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IDAgOwotICB0aW1lX3Qgc3RhcnQgOwotICB1bnNpZ25lZCBsb25nIG9sZGVzdF9zdGFydCA9IDA7Ci0gIHVuc2lnbmVkIGxvbmcgY3VyX2RibG9jayA9IDAgOwotICB1bnNpZ25lZCBsb25nIG5ld2VzdF9tb3VudF9pZCA9IDkgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKmpoIDsKLSAgaW50IHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMCA7Ci0gIGludCByZXBsYXlfY291bnQgPSAwIDsKLSAgaW50IGNvbnRpbnVlX3JlcGxheSA9IDEgOwotICBpbnQgcmV0IDsKLSAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworc3RhdGljIGludCBqb3VybmFsX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCA9IDA7CisJdW5zaWduZWQgbG9uZyBvbGRlc3RfaW52YWxpZF90cmFuc19pZCA9IDA7CisJdGltZV90IHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2sgPSAwOworCXVuc2lnbmVkIGxvbmcgbmV3ZXN0X21vdW50X2lkID0gOTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmg7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlpbnQgdmFsaWRfam91cm5hbF9oZWFkZXIgPSAwOworCWludCByZXBsYXlfY291bnQgPSAwOworCWludCBjb250aW51ZV9yZXBsYXkgPSAxOworCWludCByZXQ7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0gIGN1cl9kYmxvY2sgPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7Ci0gIHJlaXNlcmZzX2luZm8gKHBfc19zYiwgImNoZWNraW5nIHRyYW5zYWN0aW9uIGxvZyAoJXMpXG4iLAotCSBiZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYikpOwotICBzdGFydCA9IGdldF9zZWNvbmRzKCk7CisJY3VyX2RibG9jayA9IFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpOworCXJlaXNlcmZzX2luZm8ocF9zX3NiLCAiY2hlY2tpbmcgdHJhbnNhY3Rpb24gbG9nICglcylcbiIsCisJCSAgICAgIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CisJc3RhcnQgPSBnZXRfc2Vjb25kcygpOwogCi0gIC8qIHN0ZXAgMSwgcmVhZCBpbiB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2suICBDaGVjayB0aGUgdHJhbnNhY3Rpb24gaXQgc2F5cyAKLSAgKiogaXMgdGhlIGZpcnN0IHVuZmx1c2hlZCwgYW5kIGlmIHRoYXQgdHJhbnNhY3Rpb24gaXMgbm90IHZhbGlkLCAKLSAgKiogcmVwbGF5IGlzIGRvbmUKLSAgKi8KLSAgam91cm5hbC0+al9oZWFkZXJfYmggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKLQkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKLQkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKLSAgaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgewotICAgIHJldHVybiAxIDsKLSAgfQotICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPmJfZGF0YSkgOwotICBpZiAobGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgPj0gMCAmJiAKLSAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpICYmIAotICAgICAgbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgPiAwKSB7Ci0gICAgb2xkZXN0X3N0YXJ0ID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgOwotICAgIG9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKLSAgICBuZXdlc3RfbW91bnRfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9tb3VudF9pZCk7Ci0gICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMTUzOiBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgImhlYWRlcjogZmlyc3RfdW5mbHVzaGVkX29mZnNldCAlZCwgbGFzdF9mbHVzaGVkX3RyYW5zX2lkICIKLQkJICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAotCQkgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSkgOwotICAgIHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMSA7CisJLyogc3RlcCAxLCByZWFkIGluIHRoZSBqb3VybmFsIGhlYWRlciBibG9jay4gIENoZWNrIHRoZSB0cmFuc2FjdGlvbiBpdCBzYXlzIAorCSAqKiBpcyB0aGUgZmlyc3QgdW5mbHVzaGVkLCBhbmQgaWYgdGhhdCB0cmFuc2FjdGlvbiBpcyBub3QgdmFsaWQsIAorCSAqKiByZXBsYXkgaXMgZG9uZQorCSAqLworCWpvdXJuYWwtPmpfaGVhZGVyX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkJCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikKKwkJCQkJICAgICArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisJaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgeworCQlyZXR1cm4gMTsKKwl9CisJamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT5iX2RhdGEpOworCWlmIChsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA+PSAwICYmCisJICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwKKwkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpCisJICAgICYmIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpID4gMCkgeworCQlvbGRlc3Rfc3RhcnQgPQorCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCk7CisJCW9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKKwkJbmV3ZXN0X21vdW50X2lkID0gbGUzMl90b19jcHUoamgtPmpfbW91bnRfaWQpOworCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkgICAgICAgImpvdXJuYWwtMTE1MzogZm91bmQgaW4gIgorCQkJICAgICAgICJoZWFkZXI6IGZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgJWQsIGxhc3RfZmx1c2hlZF90cmFuc19pZCAiCisJCQkgICAgICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKTsKKwkJdmFsaWRfam91cm5hbF9oZWFkZXIgPSAxOwogCi0gICAgLyogbm93LCB3ZSB0cnkgdG8gcmVhZCB0aGUgZmlyc3QgdW5mbHVzaGVkIG9mZnNldC4gIElmIGl0IGlzIG5vdCB2YWxpZCwgCi0gICAgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCi0gICAgKiogdGhyb3VnaCB0aGUgd2hvbGUgbG9nLgotICAgICovCi0gICAgZF9iaCA9IGpvdXJuYWxfYnJlYWQocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpKSA7Ci0gICAgcmV0ID0gam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsIE5VTEwsIE5VTEwpIDsKLSAgICBpZiAoIXJldCkgewotICAgICAgY29udGludWVfcmVwbGF5ID0gMCA7Ci0gICAgfQotICAgIGJyZWxzZShkX2JoKSA7Ci0gICAgZ290byBzdGFydF9sb2dfcmVwbGF5OwotICB9CisJCS8qIG5vdywgd2UgdHJ5IHRvIHJlYWQgdGhlIGZpcnN0IHVuZmx1c2hlZCBvZmZzZXQuICBJZiBpdCBpcyBub3QgdmFsaWQsIAorCQkgKiogdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbywgYW5kIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlYWQgCisJCSAqKiB0aHJvdWdoIHRoZSB3aG9sZSBsb2cuCisJCSAqLworCQlkX2JoID0KKwkJICAgIGpvdXJuYWxfYnJlYWQocF9zX3NiLAorCQkJCSAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkpOworCQlyZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgTlVMTCwgTlVMTCk7CisJCWlmICghcmV0KSB7CisJCQljb250aW51ZV9yZXBsYXkgPSAwOworCQl9CisJCWJyZWxzZShkX2JoKTsKKwkJZ290byBzdGFydF9sb2dfcmVwbGF5OworCX0KIAotICBpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwKLQkJICAgICAgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIikgOwotICAgIHJldHVybiAtMSA7Ci0gIH0KKwlpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIik7CisJCXJldHVybiAtMTsKKwl9CiAKLSAgLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCi0gICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KLSAgKi8KLSAgd2hpbGUoY29udGludWVfcmVwbGF5ICYmIGN1cl9kYmxvY2sgPCAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7Ci0gICAgLyogTm90ZSB0aGF0IGl0IGlzIHJlcXVpcmVkIGZvciBibG9ja3NpemUgb2YgcHJpbWFyeSBmcyBkZXZpY2UgYW5kIGpvdXJuYWwKLSAgICAgICBkZXZpY2UgdG8gYmUgdGhlIHNhbWUgKi8KLSAgICBkX2JoID0gcmVpc2VyZnNfYnJlYWRhKGpvdXJuYWwtPmpfZGV2X2JkLCBjdXJfZGJsb2NrLCBwX3Nfc2ItPnNfYmxvY2tzaXplLAotCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpIDsKLSAgICByZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCAmbmV3ZXN0X21vdW50X2lkKSA7Ci0gICAgaWYgKHJldCA9PSAxKSB7Ci0gICAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKilkX2JoLT5iX2RhdGEgOwotICAgICAgaWYgKG9sZGVzdF9zdGFydCA9PSAwKSB7IC8qIGluaXQgYWxsIG9sZGVzdF8gdmFsdWVzICovCi0gICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKLQlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOwotCW5ld2VzdF9tb3VudF9pZCA9IGdldF9kZXNjX21vdW50X2lkKGRlc2MpIDsKLQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTExNzk6IFNldHRpbmcgIgotCSAgICAgICAgICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCi0JCSAgICAgICBvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpIDsKLSAgICAgIH0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsgCi0gICAgICAgIC8qIG9uZSB3ZSBqdXN0IHJlYWQgd2FzIG9sZGVyICovCi0gICAgICAgIG9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDsKLQlvbGRlc3Rfc3RhcnQgPSBkX2JoLT5iX2Jsb2NrbnIgOwotCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE4MDogUmVzZXR0aW5nICIKLQkgICAgICAgICAgICAgICAib2xkZXN0X3N0YXJ0IHRvIG9mZnNldCAlbHUsIHRyYW5zX2lkICVsdSIsCi0JCQlvbGRlc3Rfc3RhcnQgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCQlvbGRlc3RfdHJhbnNfaWQpIDsKLSAgICAgIH0KLSAgICAgIGlmIChuZXdlc3RfbW91bnRfaWQgPCBnZXRfZGVzY19tb3VudF9pZChkZXNjKSkgewotICAgICAgICBuZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKSA7CisJLyogb2ssIHRoZXJlIGFyZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJlcGxheWVkLiAgc3RhcnQgd2l0aCB0aGUgZmlyc3QgbG9nIGJsb2NrLCBmaW5kCisJICoqIGFsbCB0aGUgdmFsaWQgdHJhbnNhY3Rpb25zLCBhbmQgcGljayBvdXQgdGhlIG9sZGVzdC4KKwkgKi8KKwl3aGlsZSAoY29udGludWVfcmVwbGF5CisJICAgICAgICYmIGN1cl9kYmxvY2sgPAorCSAgICAgICAoU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSB7CisJCS8qIE5vdGUgdGhhdCBpdCBpcyByZXF1aXJlZCBmb3IgYmxvY2tzaXplIG9mIHByaW1hcnkgZnMgZGV2aWNlIGFuZCBqb3VybmFsCisJCSAgIGRldmljZSB0byBiZSB0aGUgc2FtZSAqLworCQlkX2JoID0KKwkJICAgIHJlaXNlcmZzX2JyZWFkYShqb3VybmFsLT5qX2Rldl9iZCwgY3VyX2RibG9jaywKKwkJCQkgICAgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOworCQlyZXQgPQorCQkgICAgam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZChwX3Nfc2IsIGRfYmgsCisJCQkJCQkgJm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLAorCQkJCQkJICZuZXdlc3RfbW91bnRfaWQpOworCQlpZiAocmV0ID09IDEpIHsKKwkJCWRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKWRfYmgtPmJfZGF0YTsKKwkJCWlmIChvbGRlc3Rfc3RhcnQgPT0gMCkgewkvKiBpbml0IGFsbCBvbGRlc3RfIHZhbHVlcyAqLworCQkJCW9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpOworCQkJCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tucjsKKwkJCQluZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMTc5OiBTZXR0aW5nICIKKwkJCQkJICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCisJCQkJCSAgICAgICBvbGRlc3Rfc3RhcnQgLQorCQkJCQkgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLCisJCQkJCSAgICAgICAocF9zX3NiKSwgb2xkZXN0X3RyYW5zX2lkKTsKKwkJCX0gZWxzZSBpZiAob2xkZXN0X3RyYW5zX2lkID4gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIHsKKwkJCQkvKiBvbmUgd2UganVzdCByZWFkIHdhcyBvbGRlciAqLworCQkJCW9sZGVzdF90cmFuc19pZCA9IGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpOworCQkJCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tucjsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMTgwOiBSZXNldHRpbmcgIgorCQkJCQkgICAgICAgIm9sZGVzdF9zdGFydCB0byBvZmZzZXQgJWx1LCB0cmFuc19pZCAlbHUiLAorCQkJCQkgICAgICAgb2xkZXN0X3N0YXJ0IC0KKwkJCQkJICAgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSworCQkJCQkgICAgICAgKHBfc19zYiksIG9sZGVzdF90cmFuc19pZCk7CisJCQl9CisJCQlpZiAobmV3ZXN0X21vdW50X2lkIDwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpIHsKKwkJCQluZXdlc3RfbW91bnRfaWQgPSBnZXRfZGVzY19tb3VudF9pZChkZXNjKTsKKwkJCQlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAiam91cm5hbC0xMjk5OiBTZXR0aW5nICIKKwkJCQkJICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWQiLAorCQkJCQkgICAgICAgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOworCQkJfQorCQkJY3VyX2RibG9jayArPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyOworCQl9IGVsc2UgeworCQkJY3VyX2RibG9jaysrOworCQl9CisJCWJyZWxzZShkX2JoKTsKKwl9CisKKyAgICAgIHN0YXJ0X2xvZ19yZXBsYXk6CisJY3VyX2RibG9jayA9IG9sZGVzdF9zdGFydDsKKwlpZiAob2xkZXN0X3RyYW5zX2lkKSB7CisJCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJCSAgICAgICAiam91cm5hbC0xMjA2OiBTdGFydGluZyByZXBsYXkgIgorCQkJICAgICAgICJmcm9tIG9mZnNldCAlbGx1LCB0cmFuc19pZCAlbHUiLAorCQkJICAgICAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJCSAgICAgICBvbGRlc3RfdHJhbnNfaWQpOworCisJfQorCXJlcGxheV9jb3VudCA9IDA7CisJd2hpbGUgKGNvbnRpbnVlX3JlcGxheSAmJiBvbGRlc3RfdHJhbnNfaWQgPiAwKSB7CisJCXJldCA9CisJCSAgICBqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24ocF9zX3NiLCBjdXJfZGJsb2NrLCBvbGRlc3Rfc3RhcnQsCisJCQkJCSAgICAgb2xkZXN0X3RyYW5zX2lkLCBuZXdlc3RfbW91bnRfaWQpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChyZXQgIT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJY3VyX2RibG9jayA9CisJCSAgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQ7CisJCXJlcGxheV9jb3VudCsrOworCQlpZiAoY3VyX2RibG9jayA9PSBvbGRlc3Rfc3RhcnQpCisJCQlicmVhazsKKwl9CisKKwlpZiAob2xkZXN0X3RyYW5zX2lkID09IDApIHsKKwkJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkJICAgICAgICJqb3VybmFsLTEyMjU6IE5vIHZhbGlkICIgInRyYW5zYWN0aW9ucyBmb3VuZCIpOworCX0KKwkvKiBqX3N0YXJ0IGRvZXMgbm90IGdldCBzZXQgY29ycmVjdGx5IGlmIHdlIGRvbid0IHJlcGxheSBhbnkgdHJhbnNhY3Rpb25zLgorCSAqKiBpZiB3ZSBoYWQgYSB2YWxpZCBqb3VybmFsX2hlYWRlciwgc2V0IGpfc3RhcnQgdG8gdGhlIGZpcnN0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbiB2YWx1ZSwKKwkgKiogY29weSB0aGUgdHJhbnNfaWQgZnJvbSB0aGUgaGVhZGVyCisJICovCisJaWYgKHZhbGlkX2pvdXJuYWxfaGVhZGVyICYmIHJlcGxheV9jb3VudCA9PSAwKSB7CisJCWpvdXJuYWwtPmpfc3RhcnQgPSBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KTsKKwkJam91cm5hbC0+al90cmFuc19pZCA9CisJCSAgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSArIDE7CisJCWpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9CisJCSAgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKTsKKwkJam91cm5hbC0+al9tb3VudF9pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX21vdW50X2lkKSArIDE7CisJfSBlbHNlIHsKKwkJam91cm5hbC0+al9tb3VudF9pZCA9IG5ld2VzdF9tb3VudF9pZCArIDE7CisJfQogCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTI5OTogU2V0dGluZyAiCi0JICAgICAgICAgICAgICAibmV3ZXN0X21vdW50X2lkIHRvICVkIiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpOwotICAgICAgfQotICAgICAgY3VyX2RibG9jayArPSBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyIDsKLSAgICB9IGVsc2UgewotICAgICAgY3VyX2RibG9jaysrIDsKLSAgICB9Ci0gICAgYnJlbHNlKGRfYmgpIDsKLSAgfQotCi1zdGFydF9sb2dfcmVwbGF5OgotICBjdXJfZGJsb2NrID0gb2xkZXN0X3N0YXJ0IDsKLSAgaWYgKG9sZGVzdF90cmFuc19pZCkgIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyMDY6IFN0YXJ0aW5nIHJlcGxheSAiCi0gICAgICAgICAgICAgICAgICAgImZyb20gb2Zmc2V0ICVsbHUsIHRyYW5zX2lkICVsdSIsCi0JCSAgIGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCi0JCSAgIG9sZGVzdF90cmFuc19pZCkgOwotCi0gIH0KLSAgcmVwbGF5X2NvdW50ID0gMCA7Ci0gIHdoaWxlKGNvbnRpbnVlX3JlcGxheSAmJiBvbGRlc3RfdHJhbnNfaWQgPiAwKSB7Ci0gICAgcmV0ID0gam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHBfc19zYiwgY3VyX2RibG9jaywgb2xkZXN0X3N0YXJ0LCBvbGRlc3RfdHJhbnNfaWQsIG5ld2VzdF9tb3VudF9pZCkgOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICByZXR1cm4gcmV0IDsKLSAgICB9IGVsc2UgaWYgKHJldCAhPSAwKSB7Ci0gICAgICBicmVhayA7Ci0gICAgfQotICAgIGN1cl9kYmxvY2sgPSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQgOwotICAgIHJlcGxheV9jb3VudCsrIDsKLSAgIGlmIChjdXJfZGJsb2NrID09IG9sZGVzdF9zdGFydCkKLSAgICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAob2xkZXN0X3RyYW5zX2lkID09IDApIHsKLSAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyMjU6IE5vIHZhbGlkICIKLSAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb25zIGZvdW5kIikgOwotICB9Ci0gIC8qIGpfc3RhcnQgZG9lcyBub3QgZ2V0IHNldCBjb3JyZWN0bHkgaWYgd2UgZG9uJ3QgcmVwbGF5IGFueSB0cmFuc2FjdGlvbnMuCi0gICoqIGlmIHdlIGhhZCBhIHZhbGlkIGpvdXJuYWxfaGVhZGVyLCBzZXQgal9zdGFydCB0byB0aGUgZmlyc3QgdW5mbHVzaGVkIHRyYW5zYWN0aW9uIHZhbHVlLAotICAqKiBjb3B5IHRoZSB0cmFuc19pZCBmcm9tIHRoZSBoZWFkZXIKLSAgKi8KLSAgaWYgKHZhbGlkX2pvdXJuYWxfaGVhZGVyICYmIHJlcGxheV9jb3VudCA9PSAwKSB7IAotICAgIGpvdXJuYWwtPmpfc3RhcnQgPSBsZTMyX3RvX2NwdShqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0KSA7Ci0gICAgam91cm5hbC0+al90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKLSAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSA7Ci0gICAgam91cm5hbC0+al9tb3VudF9pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX21vdW50X2lkKSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgam91cm5hbC0+al9tb3VudF9pZCA9IG5ld2VzdF9tb3VudF9pZCArIDEgOwotICB9Ci0gIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTI5OTogU2V0dGluZyAiCi0gICAgICAgICAgICAgICAgICJuZXdlc3RfbW91bnRfaWQgdG8gJWx1Iiwgam91cm5hbC0+al9tb3VudF9pZCkgOwotICBqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKLSAgaWYgKHJlcGxheV9jb3VudCA+IDApIHsKLSAgICByZWlzZXJmc19pbmZvIChwX3Nfc2IsICJyZXBsYXllZCAlZCB0cmFuc2FjdGlvbnMgaW4gJWx1IHNlY29uZHNcbiIsCi0JCSAgIHJlcGxheV9jb3VudCwgZ2V0X3NlY29uZHMoKSAtIHN0YXJ0KSA7Ci0gIH0KLSAgaWYgKCFiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikgJiYgCi0gICAgICAgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIGpvdXJuYWwtPmpfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkpCi0gIHsKLSAgICAgIC8qIHJlcGxheSBmYWlsZWQsIGNhbGxlciBtdXN0IGNhbGwgZnJlZV9qb3VybmFsX3JhbSBhbmQgYWJvcnQKLSAgICAgICoqIHRoZSBtb3VudAotICAgICAgKi8KLSAgICAgIHJldHVybiAtMSA7Ci0gIH0KLSAgcmV0dXJuIDAgOworCQkgICAgICAgIm5ld2VzdF9tb3VudF9pZCB0byAlbHUiLCBqb3VybmFsLT5qX21vdW50X2lkKTsKKwlqb3VybmFsLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgPSBqb3VybmFsLT5qX3N0YXJ0OworCWlmIChyZXBsYXlfY291bnQgPiAwKSB7CisJCXJlaXNlcmZzX2luZm8ocF9zX3NiLAorCQkJICAgICAgInJlcGxheWVkICVkIHRyYW5zYWN0aW9ucyBpbiAlbHUgc2Vjb25kc1xuIiwKKwkJCSAgICAgIHJlcGxheV9jb3VudCwgZ2V0X3NlY29uZHMoKSAtIHN0YXJ0KTsKKwl9CisJaWYgKCFiZGV2X3JlYWRfb25seShwX3Nfc2ItPnNfYmRldikgJiYKKwkgICAgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIGpvdXJuYWwtPmpfc3RhcnQsCisJCQkJCSBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKSB7CisJCS8qIHJlcGxheSBmYWlsZWQsIGNhbGxlciBtdXN0IGNhbGwgZnJlZV9qb3VybmFsX3JhbSBhbmQgYWJvcnQKKwkJICoqIHRoZSBtb3VudAorCQkgKi8KKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmFsbG9jX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci1yZXRyeToKLSAgICBqbCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QpLCBHRlBfTk9GUywgcyk7Ci0gICAgaWYgKCFqbCkgewotCXlpZWxkKCk7Ci0JZ290byByZXRyeTsKLSAgICB9Ci0gICAgbWVtc2V0KGpsLCAwLCBzaXplb2YoKmpsKSk7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al93b3JraW5nX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al90YWlsX2JoX2xpc3QpOwotICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al9iaF9saXN0KTsKLSAgICBzZW1hX2luaXQoJmpsLT5qX2NvbW1pdF9sb2NrLCAxKTsKLSAgICBTQl9KT1VSTkFMKHMpLT5qX251bV9saXN0cysrOwotICAgIGdldF9qb3VybmFsX2xpc3QoamwpOwotICAgIHJldHVybiBqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKyAgICAgIHJldHJ5OgorCWpsID0gcmVpc2VyZnNfa21hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIEdGUF9OT0ZTLAorCQkJICAgICAgcyk7CisJaWYgKCFqbCkgeworCQl5aWVsZCgpOworCQlnb3RvIHJldHJ5OworCX0KKwltZW1zZXQoamwsIDAsIHNpemVvZigqamwpKTsKKwlJTklUX0xJU1RfSEVBRCgmamwtPmpfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX3dvcmtpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX3RhaWxfYmhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2JoX2xpc3QpOworCXNlbWFfaW5pdCgmamwtPmpfY29tbWl0X2xvY2ssIDEpOworCVNCX0pPVVJOQUwocyktPmpfbnVtX2xpc3RzKys7CisJZ2V0X2pvdXJuYWxfbGlzdChqbCk7CisJcmV0dXJuIGpsOwogfQogCi1zdGF0aWMgdm9pZCBqb3VybmFsX2xpc3RfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgewotICAgIFNCX0pPVVJOQUwocF9zX3NiKS0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKLQkJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCApCitzdGF0aWMgdm9pZCBqb3VybmFsX2xpc3RfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikKIHsKLSAgICBpbnQgcmVzdWx0OwotICAgIAotICAgIHJlc3VsdCA9IDA7Ci0KLSAgICBpZiggam91cm5hbCAtPiBqX2Rldl9maWxlICE9IE5VTEwgKSB7Ci0JcmVzdWx0ID0gZmlscF9jbG9zZSggam91cm5hbCAtPiBqX2Rldl9maWxlLCBOVUxMICk7Ci0Jam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKLQlqb3VybmFsIC0+IGpfZGV2X2JkID0gTlVMTDsKLSAgICB9IGVsc2UgaWYoIGpvdXJuYWwgLT4gal9kZXZfYmQgIT0gTlVMTCApIHsKLQlyZXN1bHQgPSBibGtkZXZfcHV0KCBqb3VybmFsIC0+IGpfZGV2X2JkICk7Ci0Jam91cm5hbCAtPiBqX2Rldl9iZCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYoIHJlc3VsdCAhPSAwICkgewotCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsICJzaC00NTc6IHJlbGVhc2Vfam91cm5hbF9kZXY6IENhbm5vdCByZWxlYXNlIGpvdXJuYWwgZGV2aWNlOiAlaSIsIHJlc3VsdCApOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworCVNCX0pPVVJOQUwocF9zX3NiKS0+al9jdXJyZW50X2psID0gYWxsb2Nfam91cm5hbF9saXN0KHBfc19zYik7CiB9CiAKLXN0YXRpYyBpbnQgam91cm5hbF9pbml0X2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwgCi0JCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsLCAKLQkJCSAgICAgY29uc3QgY2hhciAqamRldl9uYW1lICkKK3N0YXRpYyBpbnQgcmVsZWFzZV9qb3VybmFsX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN1cGVyLAorCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSAwOworCisJaWYgKGpvdXJuYWwtPmpfZGV2X2ZpbGUgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBmaWxwX2Nsb3NlKGpvdXJuYWwtPmpfZGV2X2ZpbGUsIE5VTEwpOworCQlqb3VybmFsLT5qX2Rldl9maWxlID0gTlVMTDsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBOVUxMOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9kZXZfYmQgIT0gTlVMTCkgeworCQlyZXN1bHQgPSBibGtkZXZfcHV0KGpvdXJuYWwtPmpfZGV2X2JkKTsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBOVUxMOworCX0KKworCWlmIChyZXN1bHQgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLAorCQkJCSAic2gtNDU3OiByZWxlYXNlX2pvdXJuYWxfZGV2OiBDYW5ub3QgcmVsZWFzZSBqb3VybmFsIGRldmljZTogJWkiLAorCQkJCSByZXN1bHQpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfaW5pdF9kZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwKKwkJCSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCwKKwkJCSAgICBjb25zdCBjaGFyICpqZGV2X25hbWUpCiB7CiAJaW50IHJlc3VsdDsKIAlkZXZfdCBqZGV2OwpAQCAtMjI3OSw1MCArMjUxOSw1MSBAQAogCiAJcmVzdWx0ID0gMDsKIAotCWpvdXJuYWwgLT4gal9kZXZfYmQgPSBOVUxMOwotCWpvdXJuYWwgLT4gal9kZXZfZmlsZSA9IE5VTEw7Ci0JamRldiA9IFNCX09ORElTS19KT1VSTkFMX0RFVklDRSggc3VwZXIgKSA/Ci0JCW5ld19kZWNvZGVfZGV2KFNCX09ORElTS19KT1VSTkFMX0RFVklDRShzdXBlcikpIDogc3VwZXItPnNfZGV2OwkKKwlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7CisJam91cm5hbC0+al9kZXZfZmlsZSA9IE5VTEw7CisJamRldiA9IFNCX09ORElTS19KT1VSTkFMX0RFVklDRShzdXBlcikgPworCSAgICBuZXdfZGVjb2RlX2RldihTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0Uoc3VwZXIpKSA6IHN1cGVyLT5zX2RldjsKIAogCWlmIChiZGV2X3JlYWRfb25seShzdXBlci0+c19iZGV2KSkKLQkgICAgYmxrZGV2X21vZGUgPSBGTU9ERV9SRUFEOworCQlibGtkZXZfbW9kZSA9IEZNT0RFX1JFQUQ7CiAKIAkvKiB0aGVyZSBpcyBubyAiamRldiIgb3B0aW9uIGFuZCBqb3VybmFsIGlzIG9uIHNlcGFyYXRlIGRldmljZSAqLwotCWlmKCAoICFqZGV2X25hbWUgfHwgIWpkZXZfbmFtZVsgMCBdICkgKSB7CisJaWYgKCghamRldl9uYW1lIHx8ICFqZGV2X25hbWVbMF0pKSB7CiAJCWpvdXJuYWwtPmpfZGV2X2JkID0gb3Blbl9ieV9kZXZudW0oamRldiwgYmxrZGV2X21vZGUpOwogCQlpZiAoSVNfRVJSKGpvdXJuYWwtPmpfZGV2X2JkKSkgewogCQkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9iZCk7CiAJCQlqb3VybmFsLT5qX2Rldl9iZCA9IE5VTEw7Ci0JCQlyZWlzZXJmc193YXJuaW5nIChzdXBlciwgInNoLTQ1ODogam91cm5hbF9pbml0X2RldjogIgotCQkJCQkgICJjYW5ub3QgaW5pdCBqb3VybmFsIGRldmljZSAnJXMnOiAlaSIsCi0JCQkJCSAgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0ICk7CisJCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLCAic2gtNDU4OiBqb3VybmFsX2luaXRfZGV2OiAiCisJCQkJCSAiY2Fubm90IGluaXQgam91cm5hbCBkZXZpY2UgJyVzJzogJWkiLAorCQkJCQkgX19iZGV2bmFtZShqZGV2LCBiKSwgcmVzdWx0KTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0gZWxzZSBpZiAoamRldiAhPSBzdXBlci0+c19kZXYpCiAJCQlzZXRfYmxvY2tzaXplKGpvdXJuYWwtPmpfZGV2X2JkLCBzdXBlci0+c19ibG9ja3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBmaWxwX29wZW4oIGpkZXZfbmFtZSwgMCwgMCApOwotCWlmKCAhSVNfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKSApIHsKKwlqb3VybmFsLT5qX2Rldl9maWxlID0gZmlscF9vcGVuKGpkZXZfbmFtZSwgMCwgMCk7CisJaWYgKCFJU19FUlIoam91cm5hbC0+al9kZXZfZmlsZSkpIHsKIAkJc3RydWN0IGlub2RlICpqZGV2X2lub2RlID0gam91cm5hbC0+al9kZXZfZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCQlpZiggIVNfSVNCTEsoIGpkZXZfaW5vZGUgLT4gaV9tb2RlICkgKSB7CisJCWlmICghU19JU0JMSyhqZGV2X2lub2RlLT5pX21vZGUpKSB7CiAJCQlyZWlzZXJmc193YXJuaW5nKHN1cGVyLCAiam91cm5hbF9pbml0X2RldjogJyVzJyBpcyAiCi0JCQkJCSAibm90IGEgYmxvY2sgZGV2aWNlIiwgamRldl9uYW1lICk7CisJCQkJCSAibm90IGEgYmxvY2sgZGV2aWNlIiwgamRldl9uYW1lKTsKIAkJCXJlc3VsdCA9IC1FTk9UQkxLOwotCQkJcmVsZWFzZV9qb3VybmFsX2Rldiggc3VwZXIsIGpvdXJuYWwgKTsKLQkJfSBlbHNlICB7CisJCQlyZWxlYXNlX2pvdXJuYWxfZGV2KHN1cGVyLCBqb3VybmFsKTsKKwkJfSBlbHNlIHsKIAkJCS8qIG9rICovCiAJCQlqb3VybmFsLT5qX2Rldl9iZCA9IElfQkRFVihqZGV2X2lub2RlKTsKIAkJCXNldF9ibG9ja3NpemUoam91cm5hbC0+al9kZXZfYmQsIHN1cGVyLT5zX2Jsb2Nrc2l6ZSk7Ci0JCQlyZWlzZXJmc19pbmZvKHN1cGVyLCAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAorCQkJcmVpc2VyZnNfaW5mbyhzdXBlciwKKwkJCQkgICAgICAiam91cm5hbF9pbml0X2Rldjogam91cm5hbCBkZXZpY2U6ICVzXG4iLAogCQkJCSAgICAgIGJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CiAJCX0KIAl9IGVsc2UgewotCQlyZXN1bHQgPSBQVFJfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKTsKLQkJam91cm5hbCAtPiBqX2Rldl9maWxlID0gTlVMTDsKLQkJcmVpc2VyZnNfd2FybmluZyAoc3VwZXIsCi0JCQkJICAiam91cm5hbF9pbml0X2RldjogQ2Fubm90IG9wZW4gJyVzJzogJWkiLAotCQkJCSAgamRldl9uYW1lLCByZXN1bHQgKTsKKwkJcmVzdWx0ID0gUFRSX0VSUihqb3VybmFsLT5qX2Rldl9maWxlKTsKKwkJam91cm5hbC0+al9kZXZfZmlsZSA9IE5VTEw7CisJCXJlaXNlcmZzX3dhcm5pbmcoc3VwZXIsCisJCQkJICJqb3VybmFsX2luaXRfZGV2OiBDYW5ub3Qgb3BlbiAnJXMnOiAlaSIsCisJCQkJIGpkZXZfbmFtZSwgcmVzdWx0KTsKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIzMzAsMTkzICsyNTcxLDIxNCBAQAogLyoKICoqIG11c3QgYmUgY2FsbGVkIG9uY2Ugb24gZnMgbW91bnQuICBjYWxscyBqb3VybmFsX3JlYWQgZm9yIHlvdQogKi8KLWludCBqb3VybmFsX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGNvbnN0IGNoYXIgKiBqX2Rldl9uYW1lLCBpbnQgb2xkX2Zvcm1hdCwgdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlKSB7Ci0gICAgaW50IG51bV9jbm9kZXMgPSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgKiAyIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoamg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CitpbnQgam91cm5hbF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBjb25zdCBjaGFyICpqX2Rldl9uYW1lLAorCQkgaW50IG9sZF9mb3JtYXQsIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSkKK3sKKwlpbnQgbnVtX2Nub2RlcyA9IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAqIDI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaGpoOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CiAKLSAgICBqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpID0gdm1hbGxvYyhzaXplb2YgKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSkgOwotICAgIGlmICgham91cm5hbCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTI1NjogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGpvdXJuYWwgc3RydWN0dXJlIikgOwotCXJldHVybiAxIDsKLSAgICB9Ci0gICAgbWVtc2V0KGpvdXJuYWwsIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCkpIDsKLSAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKLSAgICBJTklUX0xJU1RfSEVBRCAoJmpvdXJuYWwtPmpfcHJlYWxsb2NfbGlzdCk7Ci0gICAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKLSAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpOwotICAgIGpvdXJuYWwtPmpfcGVyc2lzdGVudF90cmFucyA9IDA7Ci0gICAgaWYgKHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhwX3Nfc2IsCi0JCQkJICAgICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAsCi0gCQkJCSAgICAgICBTQl9CTUFQX05SKHBfc19zYikpKQotCWdvdG8gZnJlZV9hbmRfcmV0dXJuIDsKLSAgICBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKSA7CisJam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKSA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSk7CisJaWYgKCFqb3VybmFsKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMjU2OiB1bmFibGUgdG8gZ2V0IG1lbW9yeSBmb3Igam91cm5hbCBzdHJ1Y3R1cmUiKTsKKwkJcmV0dXJuIDE7CisJfQorCW1lbXNldChqb3VybmFsLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwpKTsKKwlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpOworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3ByZWFsbG9jX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKwlqb3VybmFsLT5qX3BlcnNpc3RlbnRfdHJhbnMgPSAwOworCWlmIChyZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMocF9zX3NiLAorCQkJCQkgICBqb3VybmFsLT5qX2xpc3RfYml0bWFwLAorCQkJCQkgICBTQl9CTUFQX05SKHBfc19zYikpKQorCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwlhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKTsKIAotICAgIC8qIHJlc2VydmVkIGZvciBqb3VybmFsIGFyZWEgc3VwcG9ydCAqLwotICAgIFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgPSAob2xkX2Zvcm1hdCA/Ci0JCQkJCSAgICAgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArCi0JCQkJCSAgICAgU0JfQk1BUF9OUihwX3Nfc2IpICsgMSA6Ci0JCQkJCSAgICAgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgLyBwX3Nfc2ItPnNfYmxvY2tzaXplICsgMik7IAotICAgIAotICAgIC8qIFNhbml0eSBjaGVjayB0byBzZWUgaXMgdGhlIHN0YW5kYXJkIGpvdXJuYWwgZml0dGluZyB3aXRoaW5nIGZpcnN0IGJpdG1hcAotICAgICAgIChhY3R1YWwgZm9yIHNtYWxsIGJsb2Nrc2l6ZXMpICovCi0gICAgaWYgKCAhU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKCBwX3Nfc2IgKSAmJgotICAgICAgICAgKFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgPiBwX3Nfc2ItPnNfYmxvY2tzaXplICogOCkgKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xMzkzOiBqb3VybmFsIGRvZXMgbm90IGZpdCBmb3IgYXJlYSAiCi0JCQkgICJhZGRyZXNzZWQgYnkgZmlyc3Qgb2YgYml0bWFwIGJsb2Nrcy4gSXQgc3RhcnRzIGF0ICIKLQkJCSAgIiV1IGFuZCBpdHMgc2l6ZSBpcyAldS4gQmxvY2sgc2l6ZSAlbGQiLAotCQkJICBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpLAotCQkJICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksIHBfc19zYi0+c19ibG9ja3NpemUpOwotCWdvdG8gZnJlZV9hbmRfcmV0dXJuOwotICAgIH0KKwkvKiByZXNlcnZlZCBmb3Igam91cm5hbCBhcmVhIHN1cHBvcnQgKi8KKwlTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpID0gKG9sZF9mb3JtYXQgPworCQkJCQkJIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUworCQkJCQkJIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArCisJCQkJCQkgU0JfQk1BUF9OUihwX3Nfc2IpICsKKwkJCQkJCSAxIDoKKwkJCQkJCSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvCisJCQkJCQkgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIDIpOwogCi0gICAgaWYoIGpvdXJuYWxfaW5pdF9kZXYoIHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSApICE9IDAgKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJzaC00NjI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvcm5hbCBkZXZpY2UiKTsKLSAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOwotICAgIH0KKwkvKiBTYW5pdHkgY2hlY2sgdG8gc2VlIGlzIHRoZSBzdGFuZGFyZCBqb3VybmFsIGZpdHRpbmcgd2l0aGluZyBmaXJzdCBiaXRtYXAKKwkgICAoYWN0dWFsIGZvciBzbWFsbCBibG9ja3NpemVzKSAqLworCWlmICghU0JfT05ESVNLX0pPVVJOQUxfREVWSUNFKHBfc19zYikgJiYKKwkgICAgKFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHBfc19zYikgKworCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpID4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAqIDgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xMzkzOiBqb3VybmFsIGRvZXMgbm90IGZpdCBmb3IgYXJlYSAiCisJCQkJICJhZGRyZXNzZWQgYnkgZmlyc3Qgb2YgYml0bWFwIGJsb2Nrcy4gSXQgc3RhcnRzIGF0ICIKKwkJCQkgIiV1IGFuZCBpdHMgc2l6ZSBpcyAldS4gQmxvY2sgc2l6ZSAlbGQiLAorCQkJCSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpLAorCQkJCSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksCisJCQkJIHBfc19zYi0+c19ibG9ja3NpemUpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CiAKLSAgICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLKHBfc19zYik7Ci0gICAgIAotICAgICAvKiByZWFkIGpvdXJuYWwgaGVhZGVyICovCi0gICAgIGJoamggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKLQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpOwotICAgICBpZiAoIWJoamgpIHsKLQkgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAic2gtNDU5OiB1bmFibGUgdG8gcmVhZCBqb3VybmFsIGhlYWRlciIpOwotCSBnb3RvIGZyZWVfYW5kX3JldHVybjsKLSAgICAgfQotICAgICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoYmhqaC0+Yl9kYXRhKTsKLSAgICAgCi0gICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGpvdXJuYWwgbWF0Y2hlcyB0byB0aGUgc3VwZXIgYmxvY2sgKi8KLSAgICAgaWYgKGlzX3JlaXNlcmZzX2pyKHJzKSAmJiAobGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYykgIT0gc2JfanBfam91cm5hbF9tYWdpYyhycykpKSB7Ci0JIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ2MDogam91cm5hbCBoZWFkZXIgbWFnaWMgJXggIgotCQkJICAgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKLQkJCSAgICJibG9jayAleCIsCi0JCQkgICBqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljLAotCQkJICAgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKLQkJCSAgIHNiX2pwX2pvdXJuYWxfbWFnaWMocnMpKTsKLQkgYnJlbHNlIChiaGpoKTsKLQkgZ290byBmcmVlX2FuZF9yZXR1cm47Ci0gIH0KLSAgICAgCi0gIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBsZTMyX3RvX2NwdSAoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOwotICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gbGUzMl90b19jcHUgKGpoLT5qaF9qb3VybmFsLmpwX2pvdXJuYWxfbWF4X2JhdGNoKTsKLSAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGxlMzJfdG9fY3B1IChqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKLSAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gSk9VUk5BTF9NQVhfVFJBTlNfQUdFOworCWlmIChqb3VybmFsX2luaXRfZGV2KHBfc19zYiwgam91cm5hbCwgal9kZXZfbmFtZSkgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkgInNoLTQ2MjogdW5hYmxlIHRvIGluaXRpYWxpemUgam9ybmFsIGRldmljZSIpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CiAKLSAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7Ci0gICAgLyogbWFrZSBzdXJlIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZSwgYXNzaWduIGl0IGlmIHRoZXkgYXJlIG5vdCAqLwotICAgIF9fdTMyIGluaXRpYWwgPSBqb3VybmFsLT5qX3RyYW5zX21heDsKLSAgICBfX3UzMiByYXRpbyA9IDE7Ci0gICAgCi0gICAgaWYgKHBfc19zYi0+c19ibG9ja3NpemUgPCA0MDk2KQotICAgICAgcmF0aW8gPSA0MDk2IC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKLSAgICAKLSAgICBpZiAoU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpL2pvdXJuYWwtPmpfdHJhbnNfbWF4IDwgSk9VUk5BTF9NSU5fUkFUSU8pCi0gICAgICBqb3VybmFsLT5qX3RyYW5zX21heCA9IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIEpPVVJOQUxfTUlOX1JBVElPOwotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCA+IEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgLyByYXRpbykKLSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvOwotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCA8IEpPVVJOQUxfVFJBTlNfTUlOX0RFRkFVTFQgLyByYXRpbykKLSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvOwotICAgIAotICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCAhPSBpbml0aWFsKQotICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAic2gtNDYxOiBqb3VybmFsX2luaXQ6IHdyb25nIHRyYW5zYWN0aW9uIG1heCBzaXplICgldSkuIENoYW5nZWQgdG8gJXUiLAotCSAgICAgIGluaXRpYWwsIGpvdXJuYWwtPmpfdHJhbnNfbWF4KTsKKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socF9zX3NiKTsKIAotICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoID0gam91cm5hbC0+al90cmFuc19tYXgqCi0gICAgICBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUL0pPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQ7Ci0gIH0gIAotICAKLSAgaWYgKCFqb3VybmFsLT5qX3RyYW5zX21heCkgewotICAgIC8qd2UgaGF2ZSB0aGUgZmlsZSBzeXN0ZW0gd2FzIGNyZWF0ZWQgYnkgb2xkIHZlcnNpb24gb2YgbWtyZWlzZXJmcyAKLSAgICAgIHNvIHRoaXMgZmllbGQgY29udGFpbnMgemVybyB2YWx1ZSAqLwotICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIDsKLSAgICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gSk9VUk5BTF9NQVhfQkFUQ0hfREVGQVVMVCA7Ci0gICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UgOwotICAgIAotICAgIC8qIGZvciBibG9ja3NpemUgPj0gNDA5NiAtIG1heCB0cmFuc2FjdGlvbiBzaXplIGlzIDEwMjQuIEZvciBibG9jayBzaXplIDwgNDA5NgotICAgICAgIHRyYW5zIG1heCBzaXplIGlzIGRlY3JlYXNlZCBwcm9wb3J0aW9uYWxseSAqLwotICAgIGlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikgewotICAgICAgam91cm5hbC0+al90cmFuc19tYXggLz0gKDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplKSA7Ci0gICAgICBqb3VybmFsLT5qX21heF9iYXRjaCA9IChqb3VybmFsLT5qX3RyYW5zX21heCkgKiA5IC8gMTAgOwotICAgIH0KLSAgfQorCS8qIHJlYWQgam91cm5hbCBoZWFkZXIgKi8KKwliaGpoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCQkgICAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCSAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKKwlpZiAoIWJoamgpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJzaC00NTk6IHVuYWJsZSB0byByZWFkIGpvdXJuYWwgaGVhZGVyIik7CisJCWdvdG8gZnJlZV9hbmRfcmV0dXJuOworCX0KKwlqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoYmhqaC0+Yl9kYXRhKTsKIAotICBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX21heF9jb21taXRfYWdlOworCS8qIG1ha2Ugc3VyZSB0aGF0IGpvdXJuYWwgbWF0Y2hlcyB0byB0aGUgc3VwZXIgYmxvY2sgKi8KKwlpZiAoaXNfcmVpc2VyZnNfanIocnMpCisJICAgICYmIChsZTMyX3RvX2NwdShqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljKSAhPQorCQlzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJzaC00NjA6IGpvdXJuYWwgaGVhZGVyIG1hZ2ljICV4ICIKKwkJCQkgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKKwkJCQkgImJsb2NrICV4IiwgamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYWdpYywKKwkJCQkgYmRldm5hbWUoam91cm5hbC0+al9kZXZfYmQsIGIpLAorCQkJCSBzYl9qcF9qb3VybmFsX21hZ2ljKHJzKSk7CisJCWJyZWxzZShiaGpoKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQogCi0gIGlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7Ci0gICAgICBqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7Ci0gICAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgfQorCWpvdXJuYWwtPmpfdHJhbnNfbWF4ID0gbGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOworCWpvdXJuYWwtPmpfbWF4X2JhdGNoID0gbGUzMl90b19jcHUoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF9tYXhfYmF0Y2gpOworCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPQorCSAgICBsZTMyX3RvX2NwdShqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKKwlqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7CiAKLSAgcmVpc2VyZnNfaW5mbyAocF9zX3NiLCAiam91cm5hbCBwYXJhbXM6IGRldmljZSAlcywgc2l6ZSAldSwgIgotCQkgImpvdXJuYWwgZmlyc3QgYmxvY2sgJXUsIG1heCB0cmFucyBsZW4gJXUsIG1heCBiYXRjaCAldSwgIgotCQkgIm1heCBjb21taXQgYWdlICV1LCBtYXggdHJhbnMgYWdlICV1XG4iLAotCQkgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKLQkJIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwKLQkJIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLAotCQkgam91cm5hbC0+al90cmFuc19tYXgsCi0JCSBqb3VybmFsLT5qX21heF9iYXRjaCwKLQkJIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UsCi0JCSBqb3VybmFsLT5qX21heF90cmFuc19hZ2UpOworCWlmIChqb3VybmFsLT5qX3RyYW5zX21heCkgeworCQkvKiBtYWtlIHN1cmUgdGhlc2UgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlLCBhc3NpZ24gaXQgaWYgdGhleSBhcmUgbm90ICovCisJCV9fdTMyIGluaXRpYWwgPSBqb3VybmFsLT5qX3RyYW5zX21heDsKKwkJX191MzIgcmF0aW8gPSAxOwogCi0gIGJyZWxzZSAoYmhqaCk7Ci0gICAgIAotICBqb3VybmFsLT5qX2xpc3RfYml0bWFwX2luZGV4ID0gMCA7Ci0gIGpvdXJuYWxfbGlzdF9pbml0KHBfc19zYikgOworCQlpZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8IDQwOTYpCisJCQlyYXRpbyA9IDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplOwogCi0gIG1lbXNldChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgMCwgSk9VUk5BTF9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikpIDsKKwkJaWYgKFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIGpvdXJuYWwtPmpfdHJhbnNfbWF4IDwKKwkJICAgIEpPVVJOQUxfTUlOX1JBVElPKQorCQkJam91cm5hbC0+al90cmFuc19tYXggPQorCQkJICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSAvIEpPVVJOQUxfTUlOX1JBVElPOworCQlpZiAoam91cm5hbC0+al90cmFuc19tYXggPiBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIC8gcmF0aW8pCisJCQlqb3VybmFsLT5qX3RyYW5zX21heCA9CisJCQkgICAgSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAvIHJhdGlvOworCQlpZiAoam91cm5hbC0+al90cmFuc19tYXggPCBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIC8gcmF0aW8pCisJCQlqb3VybmFsLT5qX3RyYW5zX21heCA9CisJCQkgICAgSk9VUk5BTF9UUkFOU19NSU5fREVGQVVMVCAvIHJhdGlvOwogCi0gIElOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpIDsKLSAgc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrKSA7CisJCWlmIChqb3VybmFsLT5qX3RyYW5zX21heCAhPSBpbml0aWFsKQorCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAic2gtNDYxOiBqb3VybmFsX2luaXQ6IHdyb25nIHRyYW5zYWN0aW9uIG1heCBzaXplICgldSkuIENoYW5nZWQgdG8gJXUiLAorCQkJCQkgaW5pdGlhbCwgam91cm5hbC0+al90cmFuc19tYXgpOwogCi0gIGpvdXJuYWwtPmpfc3RhcnQgPSAwIDsKLSAgam91cm5hbC0+al9sZW4gPSAwIDsKLSAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKLSAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOwotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9hc3luY190aHJvdHRsZSksIDApIDsKLSAgam91cm5hbC0+al9iY291bnQgPSAwIDsKLSAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMCA7Ci0gIGpvdXJuYWwtPmpfbGFzdCA9IE5VTEwgOwotICBqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTCA7Ci0gIGluaXRfd2FpdHF1ZXVlX2hlYWQoJihqb3VybmFsLT5qX2pvaW5fd2FpdCkpIDsKLSAgc2VtYV9pbml0KCZqb3VybmFsLT5qX2xvY2ssIDEpOwotICBzZW1hX2luaXQoJmpvdXJuYWwtPmpfZmx1c2hfc2VtLCAxKTsKKwkJam91cm5hbC0+al9tYXhfYmF0Y2ggPSBqb3VybmFsLT5qX3RyYW5zX21heCAqCisJCSAgICBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUIC8gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVDsKKwl9CiAKLSAgam91cm5hbC0+al90cmFuc19pZCA9IDEwIDsKLSAgam91cm5hbC0+al9tb3VudF9pZCA9IDEwIDsKLSAgam91cm5hbC0+al9zdGF0ZSA9IDAgOwotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2RlcykgOwotICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKLSAgam91cm5hbC0+al9jbm9kZV9mcmVlID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPyBudW1fY25vZGVzIDogMCA7Ci0gIGpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDAgOwotICBqb3VybmFsLT5qX211c3Rfd2FpdCA9IDAgOworCWlmICgham91cm5hbC0+al90cmFuc19tYXgpIHsKKwkJLyp3ZSBoYXZlIHRoZSBmaWxlIHN5c3RlbSB3YXMgY3JlYXRlZCBieSBvbGQgdmVyc2lvbiBvZiBta3JlaXNlcmZzIAorCQkgICBzbyB0aGlzIGZpZWxkIGNvbnRhaW5zIHplcm8gdmFsdWUgKi8KKwkJam91cm5hbC0+al90cmFuc19tYXggPSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUOworCQlqb3VybmFsLT5qX21heF9iYXRjaCA9IEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQ7CisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBKT1VSTkFMX01BWF9DT01NSVRfQUdFOwogCi0gIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOwotICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKLSAgamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqbCk7Ci0gIGlmICghamwtPmpfbGlzdF9iaXRtYXApIHsKLSAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMjAwNSwgZ2V0X2xpc3RfYml0bWFwIGZhaWxlZCBmb3Igam91cm5hbCBsaXN0IDAiKSA7Ci0gICAgZ290byBmcmVlX2FuZF9yZXR1cm47Ci0gIH0KLSAgaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiUmVwbGF5IEZhaWx1cmUsIHVuYWJsZSB0byBtb3VudCIpIDsKLSAgICBnb3RvIGZyZWVfYW5kX3JldHVybjsKLSAgfQorCQkvKiBmb3IgYmxvY2tzaXplID49IDQwOTYgLSBtYXggdHJhbnNhY3Rpb24gc2l6ZSBpcyAxMDI0LiBGb3IgYmxvY2sgc2l6ZSA8IDQwOTYKKwkJICAgdHJhbnMgbWF4IHNpemUgaXMgZGVjcmVhc2VkIHByb3BvcnRpb25hbGx5ICovCisJCWlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikgeworCQkJam91cm5hbC0+al90cmFuc19tYXggLz0gKDQwOTYgLyBwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwkJCWpvdXJuYWwtPmpfbWF4X2JhdGNoID0gKGpvdXJuYWwtPmpfdHJhbnNfbWF4KSAqIDkgLyAxMDsKKwkJfQorCX0KIAotICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KysgOwotICBpZiAocmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCA8PSAxKQotICAgIGNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisJam91cm5hbC0+al9kZWZhdWx0X21heF9jb21taXRfYWdlID0gam91cm5hbC0+al9tYXhfY29tbWl0X2FnZTsKIAotICBJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKLSAgcmV0dXJuIDAgOwotZnJlZV9hbmRfcmV0dXJuOgotICBmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7Ci0gIHJldHVybiAxOworCWlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7CisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKKwkJam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gY29tbWl0X21heF9hZ2U7CisJfQorCisJcmVpc2VyZnNfaW5mbyhwX3Nfc2IsICJqb3VybmFsIHBhcmFtczogZGV2aWNlICVzLCBzaXplICV1LCAiCisJCSAgICAgICJqb3VybmFsIGZpcnN0IGJsb2NrICV1LCBtYXggdHJhbnMgbGVuICV1LCBtYXggYmF0Y2ggJXUsICIKKwkJICAgICAgIm1heCBjb21taXQgYWdlICV1LCBtYXggdHJhbnMgYWdlICV1XG4iLAorCQkgICAgICBiZGV2bmFtZShqb3VybmFsLT5qX2Rldl9iZCwgYiksCisJCSAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSwKKwkJICAgICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCSAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4LAorCQkgICAgICBqb3VybmFsLT5qX21heF9iYXRjaCwKKwkJICAgICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSwgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKTsKKworCWJyZWxzZShiaGpoKTsKKworCWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAwOworCWpvdXJuYWxfbGlzdF9pbml0KHBfc19zYik7CisKKwltZW1zZXQoam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIDAsCisJICAgICAgIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKTsKKworCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnMpOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisKKwlqb3VybmFsLT5qX3N0YXJ0ID0gMDsKKwlqb3VybmFsLT5qX2xlbiA9IDA7CisJam91cm5hbC0+al9sZW5fYWxsb2MgPSAwOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX3djb3VudCksIDApOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2FzeW5jX3Rocm90dGxlKSwgMCk7CisJam91cm5hbC0+al9iY291bnQgPSAwOworCWpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9IDA7CisJam91cm5hbC0+al9sYXN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCYoam91cm5hbC0+al9qb2luX3dhaXQpKTsKKwlzZW1hX2luaXQoJmpvdXJuYWwtPmpfbG9jaywgMSk7CisJc2VtYV9pbml0KCZqb3VybmFsLT5qX2ZsdXNoX3NlbSwgMSk7CisKKwlqb3VybmFsLT5qX3RyYW5zX2lkID0gMTA7CisJam91cm5hbC0+al9tb3VudF9pZCA9IDEwOworCWpvdXJuYWwtPmpfc3RhdGUgPSAwOworCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwgMCk7CisJam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2Rlcyk7CisJam91cm5hbC0+al9jbm9kZV9mcmVlX29yaWcgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdDsKKwlqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA/IG51bV9jbm9kZXMgOiAwOworCWpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDA7CisJam91cm5hbC0+al9tdXN0X3dhaXQgPSAwOworCisJaW5pdF9qb3VybmFsX2hhc2gocF9zX3NiKTsKKwlqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKwlqbC0+al9saXN0X2JpdG1hcCA9IGdldF9saXN0X2JpdG1hcChwX3Nfc2IsIGpsKTsKKwlpZiAoIWpsLT5qX2xpc3RfYml0bWFwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0yMDA1LCBnZXRfbGlzdF9iaXRtYXAgZmFpbGVkIGZvciBqb3VybmFsIGxpc3QgMCIpOworCQlnb3RvIGZyZWVfYW5kX3JldHVybjsKKwl9CisJaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJlcGxheSBGYWlsdXJlLCB1bmFibGUgdG8gbW91bnQiKTsKKwkJZ290byBmcmVlX2FuZF9yZXR1cm47CisJfQorCisJcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudCsrOworCWlmIChyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50IDw9IDEpCisJCWNvbW1pdF93cSA9IGNyZWF0ZV93b3JrcXVldWUoInJlaXNlcmZzIik7CisKKwlJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKKwlyZXR1cm4gMDsKKyAgICAgIGZyZWVfYW5kX3JldHVybjoKKwlmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CisJcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0yNTI0LDk2ICsyNzg2LDEwMiBAQAogKiogYmUgdXNlZCBieSBkZWxldGUgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3Qgd3JpdGUgbW9yZSB0aGFuIGNhbiBmaXQgaW5zaWRlIGEgc2luZ2xlCiAqKiB0cmFuc2FjdGlvbgogKi8KLWludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIGludCBuZXdfYWxsb2MpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMICh0aC0+dF9zdXBlcik7Ci0gIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKLSAgLyogY2Fubm90IHJlc3RhcnQgd2hpbGUgbmVzdGVkICovCi0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkKLSAgICByZXR1cm4gMCA7Ci0gIGlmICggam91cm5hbC0+al9tdXN0X3dhaXQgPiAwIHx8Ci0gICAgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAotICAgICAgIGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpIHx8Ci0gICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAotICAgICAgIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIHJldHVybiAwIDsKK2ludCBqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJICAgaW50IG5ld19hbGxvYykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwodGgtPnRfc3VwZXIpOworCXRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworCS8qIGNhbm5vdCByZXN0YXJ0IHdoaWxlIG5lc3RlZCAqLworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmICh0aC0+dF9yZWZjb3VudCA+IDEpCisJCXJldHVybiAwOworCWlmIChqb3VybmFsLT5qX211c3Rfd2FpdCA+IDAgfHwKKwkgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmV3X2FsbG9jKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCB8fAorCSAgICBhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSB8fAorCSAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSB8fAorCSAgICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkgeworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIC8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgaW5zaWRlIGEgdHJhbnNhY3Rpb24sIGFuZCByZXF1aXJlcyB0aGUgCiAqKiBrZXJuZWxfbG9jayB0byBiZSBoZWxkCiAqLwotdm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHRoLT50X3N1cGVyKTsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gICAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAxIDsKLSAgICBzZXRfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkgOwotICAgIHJldHVybiA7Ci19Ci0KLS8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhIHRyYW5zYWN0aW9uIHN0YXJ0ZWQsIGFuZCBkb2VzIG5vdAotKiogcmVxdWlyZSBCS0wKLSovCi12b2lkIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIGNsZWFyX2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpIDsKLSAgICB3YWtlX3VwKCZqb3VybmFsLT5qX2pvaW5fd2FpdCkgOwotfQotCi0vKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKLSoqIHJlcXVpcmUgQktMCi0qLwotdm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7Ci0gICAgd2FpdF9ldmVudChqb3VybmFsLT5qX2pvaW5fd2FpdCwKLSAgICAgICAgICAgICAgICF0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSA7Ci19Ci0KLXN0YXRpYyB2b2lkIHF1ZXVlX2xvZ193cml0ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gICAgd2FpdF9xdWV1ZV90IHdhaXQ7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKLSAgICBzZXRfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKTsKLQotICAgIC8qCi0gICAgICogd2UgZG9uJ3Qgd2FudCB0byB1c2Ugd2FpdF9ldmVudCBoZXJlIGJlY2F1c2UKLSAgICAgKiB3ZSBvbmx5IHdhbnQgdG8gd2FpdCBvbmNlLgotICAgICAqLwotICAgIGluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKLSAgICBhZGRfd2FpdF9xdWV1ZSgmam91cm5hbC0+al9qb2luX3dhaXQsICZ3YWl0KTsKLSAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0gICAgaWYgKHRlc3RfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKSkKLSAgICAgICAgc2NoZWR1bGUoKTsKLSAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKLSAgICByZW1vdmVfd2FpdF9xdWV1ZSgmam91cm5hbC0+al9qb2luX3dhaXQsICZ3YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgd2FrZV9xdWV1ZWRfd3JpdGVycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQotICAgICAgICB3YWtlX3VwKCZqb3VybmFsLT5qX2pvaW5fd2FpdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxldF90cmFuc2FjdGlvbl9ncm93KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRyYW5zX2lkKQordm9pZCByZWlzZXJmc19ibG9ja193cml0ZXMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgdW5zaWduZWQgbG9uZyBiY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKLSAgICB3aGlsZSgxKSB7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHRoLT50X3N1cGVyKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwlqb3VybmFsLT5qX211c3Rfd2FpdCA9IDE7CisJc2V0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOworCXJldHVybjsKK30KKworLyogdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IGEgdHJhbnNhY3Rpb24gc3RhcnRlZCwgYW5kIGRvZXMgbm90CisqKiByZXF1aXJlIEJLTAorKi8KK3ZvaWQgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJY2xlYXJfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSk7CisJd2FrZV91cCgmam91cm5hbC0+al9qb2luX3dhaXQpOworfQorCisvKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKKyoqIHJlcXVpcmUgQktMCisqLwordm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJd2FpdF9ldmVudChqb3VybmFsLT5qX2pvaW5fd2FpdCwKKwkJICAgIXRlc3RfYml0KEpfV1JJVEVSU19CTE9DS0VELCAmam91cm5hbC0+al9zdGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJc2V0X2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisKKwkvKgorCSAqIHdlIGRvbid0IHdhbnQgdG8gdXNlIHdhaXRfZXZlbnQgaGVyZSBiZWNhdXNlCisJICogd2Ugb25seSB3YW50IHRvIHdhaXQgb25jZS4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisJYWRkX3dhaXRfcXVldWUoJmpvdXJuYWwtPmpfam9pbl93YWl0LCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0Jam91cm5hbC0+al9jdXJyZW50X2psLT5qX3N0YXRlIHw9IExJU1RfQ09NTUlUX1BFTkRJTkc7Ci0gICAgICAgIHdoaWxlICgoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDAgfHwKLQkgICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgJiYKLQkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgewotCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHNiKTsKKwlpZiAodGVzdF9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCQlzY2hlZHVsZSgpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZqb3VybmFsLT5qX2pvaW5fd2FpdCwgJndhaXQpOworfQorCitzdGF0aWMgdm9pZCB3YWtlX3F1ZXVlZF93cml0ZXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocyk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSkpCisJCXdha2VfdXAoJmpvdXJuYWwtPmpfam9pbl93YWl0KTsKK30KKworc3RhdGljIHZvaWQgbGV0X3RyYW5zYWN0aW9uX2dyb3coc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwoc2IpOworCXVuc2lnbmVkIGxvbmcgYmNvdW50ID0gam91cm5hbC0+al9iY291bnQ7CisJd2hpbGUgKDEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfc3RhdGUgfD0gTElTVF9DT01NSVRfUEVORElORzsKKwkJd2hpbGUgKChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCB8fAorCQkJYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSAmJgorCQkgICAgICAgam91cm5hbC0+al90cmFuc19pZCA9PSB0cmFuc19pZCkgeworCQkJcXVldWVfbG9nX3dyaXRlcihzYik7CisJCX0KKwkJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCisJCQlicmVhazsKKwkJaWYgKGJjb3VudCA9PSBqb3VybmFsLT5qX2Jjb3VudCkKKwkJCWJyZWFrOworCQliY291bnQgPSBqb3VybmFsLT5qX2Jjb3VudDsKIAl9Ci0JaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gdHJhbnNfaWQpCi0JICAgIGJyZWFrOwotCWlmIChiY291bnQgPT0gam91cm5hbC0+al9iY291bnQpCi0JICAgIGJyZWFrOwotCWJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OwotICAgIH0KIH0KIAogLyogam9pbiA9PSB0cnVlIGlmIHlvdSBtdXN0IGpvaW4gYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uCkBAIC0yNjIyLDIyMSArMjg5MCwyNDQgQEAKICoqIHRoaXMgd2lsbCBibG9jayB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgam9pbmFibGUuICBzZW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIHlvdQogKiogZXhwZWN0IHRvIHVzZSBpbiBuYmxvY2tzLgogKi8KLXN0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBqb2luKSB7Ci0gIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKLSAgaW50IG9sZF90cmFuc19pZCAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOwotICBpbnQgc2NoZWRfY291bnQgPSAwOwotICBpbnQgcmV0dmFsOworc3RhdGljIGludCBkb19qb3VybmFsX2JlZ2luX3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzLAorCQkJICAgICAgaW50IGpvaW4pCit7CisJdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCk7CisJaW50IG9sZF90cmFuc19pZDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIG15dGg7CisJaW50IHNjaGVkX2NvdW50ID0gMDsKKwlpbnQgcmV0dmFsOwogCi0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbF9iZWdpbiIpIDsKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWxfYmVnaW4iKTsKKwlpZiAobmJsb2NrcyA+IGpvdXJuYWwtPmpfdHJhbnNfbWF4KQorCQlCVUcoKTsKIAotICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9iZWluZyApOwotICAvKiBzZXQgaGVyZSBmb3Igam91cm5hbF9qb2luICovCi0gIHRoLT50X3JlZmNvdW50ID0gMTsKLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2IgOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLmpvdXJuYWxfYmVpbmcpOworCS8qIHNldCBoZXJlIGZvciBqb3VybmFsX2pvaW4gKi8KKwl0aC0+dF9yZWZjb3VudCA9IDE7CisJdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CiAKLXJlbG9jazoKLSAgbG9ja19qb3VybmFsKHBfc19zYikgOwotICBpZiAoam9pbiAhPSBKQkVHSU5fQUJPUlQgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkgewotICAgIHVubG9ja19qb3VybmFsIChwX3Nfc2IpOwotICAgIHJldHZhbCA9IGpvdXJuYWwtPmpfZXJybm87Ci0gICAgZ290byBvdXRfZmFpbDsKLSAgfQotICBqb3VybmFsLT5qX2Jjb3VudCsrOwotCi0gIGlmICh0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSB7Ci0gICAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhwX3Nfc2IpIDsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyApOwotICAgIGdvdG8gcmVsb2NrIDsKLSAgfQotICBub3cgPSBnZXRfc2Vjb25kcygpOwotCi0gIC8qIGlmIHRoZXJlIGlzIG5vIHJvb20gaW4gdGhlIGpvdXJuYWwgT1IKLSAgKiogaWYgdGhpcyB0cmFuc2FjdGlvbiBpcyB0b28gb2xkLCBhbmQgd2Ugd2VyZW4ndCBjYWxsZWQgam9pbmFibGUsIHdhaXQgZm9yIGl0IHRvIGZpbmlzaCBiZWZvcmUgYmVnaW5uaW5nIAotICAqKiB3ZSBkb24ndCBzbGVlcCBpZiB0aGVyZSBhcmVuJ3Qgb3RoZXIgd3JpdGVycwotICAqLwotCi0gIGlmICggKCFqb2luICYmIGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgfHwKLSAgICAgKCAham9pbiAmJiAoam91cm5hbC0+al9sZW5fYWxsb2MgKyBuYmxvY2tzICsgMikgPj0gam91cm5hbC0+al9tYXhfYmF0Y2gpIHx8Ci0gICAgICgham9pbiAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCAmJiBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCi0gICAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgfHwKLSAgICAgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgfHwKLSAgICAgKCFqb2luICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA8IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSkgewotCi0gICAgb2xkX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKLSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsgLyogYWxsb3cgb3RoZXJzIHRvIGZpbmlzaCB0aGlzIHRyYW5zYWN0aW9uICovCi0KLSAgICBpZiAoIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49Ci0gICAgICAgIGpvdXJuYWwtPmpfbWF4X2JhdGNoICYmCi0JKChqb3VybmFsLT5qX2xlbiArIG5ibG9ja3MgKyAyKSAqIDEwMCkgPCAoam91cm5hbC0+al9sZW5fYWxsb2MgKiA3NSkpCi0gICAgewotCWlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMTApIHsKLQkgICAgc2NoZWRfY291bnQrKzsKLQkgICAgcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOwotCSAgICBnb3RvIHJlbG9jazsKKyAgICAgIHJlbG9jazoKKwlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwlpZiAoam9pbiAhPSBKQkVHSU5fQUJPUlQgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJldHZhbCA9IGpvdXJuYWwtPmpfZXJybm87CisJCWdvdG8gb3V0X2ZhaWw7CiAJfQotICAgIH0KLSAgICAvKiBkb24ndCBtZXNzIHdpdGggam9pbmluZyB0aGUgdHJhbnNhY3Rpb24gaWYgYWxsIHdlIGhhdmUgdG8gZG8gaXMKLSAgICAgKiB3YWl0IGZvciBzb21lb25lIGVsc2UgdG8gZG8gYSBjb21taXQKLSAgICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7Ci0Jd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCi0JICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgewotCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7Ci0gICAgICAgIH0KLQlnb3RvIHJlbG9jazsKLSAgICB9Ci0gICAgcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF9mYWlsOworCWpvdXJuYWwtPmpfYmNvdW50Kys7CiAKLSAgICAvKiBzb21lb25lIG1pZ2h0IGhhdmUgZW5kZWQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLwotICAgIGlmIChvbGRfdHJhbnNfaWQgIT0gam91cm5hbC0+al90cmFuc19pZCkgewotICAgICAgICByZXR2YWwgPSBkb19qb3VybmFsX2VuZCgmbXl0aCwgcF9zX3NiLCAxLCAwKSA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgQ09NTUlUX05PVykgOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gb3V0X2ZhaWw7Ci0KLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd2NvdW50ICk7Ci0gICAgZ290byByZWxvY2sgOwotICB9Ci0gIC8qIHdlIGFyZSB0aGUgZmlyc3Qgd3JpdGVyLCBzZXQgdHJhbnNfaWQgKi8KLSAgaWYgKGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9PSAwKSB7Ci0gICAgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gZ2V0X3NlY29uZHMoKTsKLSAgfQotICBhdG9taWNfaW5jKCYoam91cm5hbC0+al93Y291bnQpKSA7Ci0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jICs9IG5ibG9ja3MgOwotICB0aC0+dF9ibG9ja3NfbG9nZ2VkID0gMCA7Ci0gIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgPSBuYmxvY2tzIDsKLSAgdGgtPnRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkIDsKLSAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gIElOSVRfTElTVF9IRUFEICgmdGgtPnRfbGlzdCk7Ci0gIHJldHVybiAwIDsKLQotb3V0X2ZhaWw6Ci0gIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLSAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcwotICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKgotcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBuYmxvY2tzKSB7Ci0gICAgaW50IHJldCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggOwotCi0gICAgLyogaWYgd2UncmUgbmVzdGluZyBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZQotICAgICoqIHBlcnNpc3RlbnQgb24gaXRzIG93bgotICAgICovCi0gICAgaWYgKHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcocykpIHsKLSAgICAgICAgdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotCXRoLT50X3JlZmNvdW50KysgOwotCWlmICh0aC0+dF9yZWZjb3VudCA8IDIpIHsKLQkgICAgQlVHKCkgOworCWlmICh0ZXN0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKSB7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2socF9zX3NiKTsKKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9yZWxvY2tfd3JpdGVycyk7CisJCWdvdG8gcmVsb2NrOwogCX0KLQlyZXR1cm4gdGggOwotICAgIH0KLSAgICB0aCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBHRlBfTk9GUywgcykgOwotICAgIGlmICghdGgpCi0gICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0ID0gam91cm5hbF9iZWdpbih0aCwgcywgbmJsb2NrcykgOwotICAgIGlmIChyZXQpIHsKLQlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBzKSA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKwlub3cgPSBnZXRfc2Vjb25kcygpOwogCi0gICAgU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7Ci0gICAgcmV0dXJuIHRoIDsKKwkvKiBpZiB0aGVyZSBpcyBubyByb29tIGluIHRoZSBqb3VybmFsIE9SCisJICoqIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCwgYW5kIHdlIHdlcmVuJ3QgY2FsbGVkIGpvaW5hYmxlLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggYmVmb3JlIGJlZ2lubmluZyAKKwkgKiogd2UgZG9uJ3Qgc2xlZXAgaWYgdGhlcmUgYXJlbid0IG90aGVyIHdyaXRlcnMKKwkgKi8KKworCWlmICgoIWpvaW4gJiYgam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSB8fAorCSAgICAoIWpvaW4KKwkgICAgICYmIChqb3VybmFsLT5qX2xlbl9hbGxvYyArIG5ibG9ja3MgKyAyKSA+PSBqb3VybmFsLT5qX21heF9iYXRjaCkKKwkgICAgfHwgKCFqb2luICYmIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPiAwCisJCSYmIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAKKwkJJiYgKG5vdyAtIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSkgPgorCQlqb3VybmFsLT5qX21heF90cmFuc19hZ2UpIHx8ICgham9pbgorCQkJCQkgICAgICAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpCisJICAgIHx8ICgham9pbiAmJiBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkpIHsKKworCQlvbGRfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOwkvKiBhbGxvdyBvdGhlcnMgdG8gZmluaXNoIHRoaXMgdHJhbnNhY3Rpb24gKi8KKworCQlpZiAoIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49CisJCSAgICBqb3VybmFsLT5qX21heF9iYXRjaCAmJgorCQkgICAgKChqb3VybmFsLT5qX2xlbiArIG5ibG9ja3MgKyAyKSAqIDEwMCkgPAorCQkgICAgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICogNzUpKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDEwKSB7CisJCQkJc2NoZWRfY291bnQrKzsKKwkJCQlxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7CisJCQkJZ290byByZWxvY2s7CisJCQl9CisJCX0KKwkJLyogZG9uJ3QgbWVzcyB3aXRoIGpvaW5pbmcgdGhlIHRyYW5zYWN0aW9uIGlmIGFsbCB3ZSBoYXZlIHRvIGRvIGlzCisJCSAqIHdhaXQgZm9yIHNvbWVvbmUgZWxzZSB0byBkbyBhIGNvbW1pdAorCQkgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgeworCQkJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCisJCQkgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJCQkJcXVldWVfbG9nX3dyaXRlcihwX3Nfc2IpOworCQkJfQorCQkJZ290byByZWxvY2s7CisJCX0KKwkJcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZmFpbDsKKworCQkvKiBzb21lb25lIG1pZ2h0IGhhdmUgZW5kZWQgdGhlIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLworCQlpZiAob2xkX3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKwkJCXJldHZhbCA9IGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsIDEsIDApOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgQ09NTUlUX05PVyk7CisJCX0KKworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXRfZmFpbDsKKworCQlQUk9DX0lORk9fSU5DKHBfc19zYiwgam91cm5hbC5qb3VybmFsX3JlbG9ja193Y291bnQpOworCQlnb3RvIHJlbG9jazsKKwl9CisJLyogd2UgYXJlIHRoZSBmaXJzdCB3cml0ZXIsIHNldCB0cmFuc19pZCAqLworCWlmIChqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPT0gMCkgeworCQlqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSBnZXRfc2Vjb25kcygpOworCX0KKwlhdG9taWNfaW5jKCYoam91cm5hbC0+al93Y291bnQpKTsKKwlqb3VybmFsLT5qX2xlbl9hbGxvYyArPSBuYmxvY2tzOworCXRoLT50X2Jsb2Nrc19sb2dnZWQgPSAwOworCXRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgPSBuYmxvY2tzOworCXRoLT50X3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKwl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCUlOSVRfTElTVF9IRUFEKCZ0aC0+dF9saXN0KTsKKwlnZXRfZnNfZXhjbCgpOworCXJldHVybiAwOworCisgICAgICBvdXRfZmFpbDoKKwltZW1zZXQodGgsIDAsIHNpemVvZigqdGgpKTsKKwkvKiBSZS1zZXQgdGgtPnRfc3VwZXIsIHNvIHdlIGNhbiBwcm9wZXJseSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55CisJICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcworCSAqIGNhbGwgaXMgcGFydCBvZiBhIGZhaWxlZCByZXN0YXJ0X3RyYW5zYWN0aW9uLCB3ZSBjYW4gZnJlZSBpdCBsYXRlciAqLworCXRoLT50X3N1cGVyID0gcF9zX3NiOworCXJldHVybiByZXR2YWw7CiB9CiAKLWludAotcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAodGgtPnRfdHJhbnNfaWQpCi0gICAgICAgIHJldCA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSAtRUlPOwotICAgIGlmICh0aC0+dF9yZWZjb3VudCA9PSAwKSB7Ci0gICAgICAgIFNCX0pPVVJOQUwocyktPmpfcGVyc2lzdGVudF90cmFucy0tOwotCXJlaXNlcmZzX2tmcmVlKHRoLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSksIHMpIDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKK3N0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0CisJCQkJCQkJCSAgICBzdXBlcl9ibG9jaworCQkJCQkJCQkgICAgKnMsCisJCQkJCQkJCSAgICBpbnQgbmJsb2NrcykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOworCisJLyogaWYgd2UncmUgbmVzdGluZyBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgSXQgd2lsbCBiZQorCSAqKiBwZXJzaXN0ZW50IG9uIGl0cyBvd24KKwkgKi8KKwlpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzKSkgeworCQl0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJdGgtPnRfcmVmY291bnQrKzsKKwkJaWYgKHRoLT50X3JlZmNvdW50IDwgMikgeworCQkJQlVHKCk7CisJCX0KKwkJcmV0dXJuIHRoOworCX0KKwl0aCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLAorCQkJICAgICAgR0ZQX05PRlMsIHMpOworCWlmICghdGgpCisJCXJldHVybiBOVUxMOworCXJldCA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIG5ibG9ja3MpOworCWlmIChyZXQpIHsKKwkJcmVpc2VyZnNfa2ZyZWUodGgsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKSwKKwkJCSAgICAgICBzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJU0JfSk9VUk5BTChzKS0+al9wZXJzaXN0ZW50X3RyYW5zKys7CisJcmV0dXJuIHRoOwogfQogCi1zdGF0aWMgaW50IGpvdXJuYWxfam9pbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgewotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87Ci0KLSAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KLSAgKiogcG9pbnRlcgotICAqLwotICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7Ci0gIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgQlVHKCkgOwotICB9Ci0gIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0pPSU4pIDsKK2ludCByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlpbnQgcmV0ID0gMDsKKwlpZiAodGgtPnRfdHJhbnNfaWQpCisJCXJldCA9IGpvdXJuYWxfZW5kKHRoLCB0aC0+dF9zdXBlciwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCk7CisJZWxzZQorCQlyZXQgPSAtRUlPOworCWlmICh0aC0+dF9yZWZjb3VudCA9PSAwKSB7CisJCVNCX0pPVVJOQUwocyktPmpfcGVyc2lzdGVudF90cmFucy0tOworCQlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLAorCQkJICAgICAgIHMpOworCX0KKwlyZXR1cm4gcmV0OwogfQogCi1pbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKK3N0YXRpYyBpbnQgam91cm5hbF9qb2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CiAKLSAgLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KLSAgKiogcG9pbnRlcgotICAqLwotICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cl90aCA7Ci0gIGlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgewotICAgICAgQlVHKCkgOwotICB9Ci0gIHJldHVybiBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX0FCT1JUKSA7CisJLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKwkgKiogcG9pbnRlcgorCSAqLworCXRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoOworCWlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworCQlCVUcoKTsKKwl9CisJcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fSk9JTik7CiB9CiAKLWludCBqb3VybmFsX2JlZ2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOwotICAgIGludCByZXQgOworaW50IGpvdXJuYWxfam9pbl9hYm9ydChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvOwogCi0gICAgdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMIDsKLSAgICBpZiAoY3VyX3RoKSB7Ci0JLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLwotCWlmIChjdXJfdGgtPnRfc3VwZXIgPT0gcF9zX3NiKSB7Ci0gICAgICAgICAgICAgIEJVR19PTiAoIWN1cl90aC0+dF9yZWZjb3VudCk7Ci0JICAgICAgY3VyX3RoLT50X3JlZmNvdW50KysgOwotCSAgICAgIG1lbWNweSh0aCwgY3VyX3RoLCBzaXplb2YoKnRoKSk7Ci0JICAgICAgaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCi0JCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7Ci0JICAgICAgcmV0dXJuIDA7CisJLyogdGhpcyBrZWVwcyBkb19qb3VybmFsX2VuZCBmcm9tIE5VTExpbmcgb3V0IHRoZSBjdXJyZW50LT5qb3VybmFsX2luZm8KKwkgKiogcG9pbnRlcgorCSAqLworCXRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoOworCWlmIChjdXJfdGggJiYgY3VyX3RoLT50X3JlZmNvdW50ID4gMSkgeworCQlCVUcoKTsKKwl9CisJcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fQUJPUlQpOworfQorCitpbnQgam91cm5hbF9iZWdpbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKQoreworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwlpbnQgcmV0OworCisJdGgtPnRfaGFuZGxlX3NhdmUgPSBOVUxMOworCWlmIChjdXJfdGgpIHsKKwkJLyogd2UgYXJlIG5lc3RpbmcgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLworCQlpZiAoY3VyX3RoLT50X3N1cGVyID09IHBfc19zYikgeworCQkJQlVHX09OKCFjdXJfdGgtPnRfcmVmY291bnQpOworCQkJY3VyX3RoLT50X3JlZmNvdW50Kys7CisJCQltZW1jcHkodGgsIGN1cl90aCwgc2l6ZW9mKCp0aCkpOworCQkJaWYgKHRoLT50X3JlZmNvdW50IDw9IDEpCisJCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCQkgIkJBRDogcmVmY291bnQgPD0gMSwgYnV0IGpvdXJuYWxfaW5mbyAhPSAwIik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIHdlJ3ZlIGVuZGVkIHVwIHdpdGggYSBoYW5kbGUgZnJvbSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtLgorCQkJICoqIHNhdmUgaXQgYW5kIHJlc3RvcmUgb24gam91cm5hbF9lbmQuICBUaGlzIHNob3VsZCBuZXZlcgorCQkJICoqIHJlYWxseSBoYXBwZW4uLi4KKwkJCSAqLworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiY2xtLTIxMDA6IG5lc3RpbmcgaW5mbyBhIGRpZmZlcmVudCBGUyIpOworCQkJdGgtPnRfaGFuZGxlX3NhdmUgPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwkJfQogCX0gZWxzZSB7Ci0JICAgIC8qIHdlJ3ZlIGVuZGVkIHVwIHdpdGggYSBoYW5kbGUgZnJvbSBhIGRpZmZlcmVudCBmaWxlc3lzdGVtLgotCSAgICAqKiBzYXZlIGl0IGFuZCByZXN0b3JlIG9uIGpvdXJuYWxfZW5kLiAgVGhpcyBzaG91bGQgbmV2ZXIKLQkgICAgKiogcmVhbGx5IGhhcHBlbi4uLgotCSAgICAqLwotCSAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImNsbS0yMTAwOiBuZXN0aW5nIGluZm8gYSBkaWZmZXJlbnQgRlMiKSA7Ci0JICAgIHRoLT50X2hhbmRsZV9zYXZlID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKLQkgICAgY3VycmVudC0+am91cm5hbF9pbmZvID0gdGg7CisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOwogCX0KLSAgICB9IGVsc2UgewotCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOwotICAgIH0KLSAgICByZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRykgOwotICAgIGlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gIT0gdGgpCi0gICAgICAgIEJVRygpIDsKKwlyZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRyk7CisJaWYgKGN1cnJlbnQtPmpvdXJuYWxfaW5mbyAhPSB0aCkKKwkJQlVHKCk7CiAKLSAgICAvKiBJIGd1ZXNzIHRoaXMgYm9pbHMgZG93biB0byBiZWluZyB0aGUgcmVjaXByb2NhbCBvZiBjbG0tMjEwMCBhYm92ZS4KLSAgICAgKiBJZiBkb19qb3VybmFsX2JlZ2luX3IgZmFpbHMsIHdlIG5lZWQgdG8gcHV0IGl0IGJhY2ssIHNpbmNlIGpvdXJuYWxfZW5kCi0gICAgICogd29uJ3QgYmUgY2FsbGVkIHRvIGRvIGl0LiAqLwotICAgIGlmIChyZXQpCi0gICAgICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwotICAgIGVsc2UKLSAgICAgICAgQlVHX09OICghdGgtPnRfcmVmY291bnQpOworCS8qIEkgZ3Vlc3MgdGhpcyBib2lscyBkb3duIHRvIGJlaW5nIHRoZSByZWNpcHJvY2FsIG9mIGNsbS0yMTAwIGFib3ZlLgorCSAqIElmIGRvX2pvdXJuYWxfYmVnaW5fciBmYWlscywgd2UgbmVlZCB0byBwdXQgaXQgYmFjaywgc2luY2Ugam91cm5hbF9lbmQKKwkgKiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICovCisJaWYgKHJldCkKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisJZWxzZQorCQlCVUdfT04oIXRoLT50X3JlZmNvdW50KTsKIAotICAgIHJldHVybiByZXQgOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0yODQ4LDEyOSArMzEzOSwxNDAgQEAKICoqIAogKiogaWYgal9sZW4sIGlzIGJpZ2dlciB0aGFuIGpfbGVuX2FsbG9jLCBpdCBwdXNoZXMgal9sZW5fYWxsb2MgdG8gMTAgKyBqX2xlbi4KICovCi1pbnQgam91cm5hbF9tYXJrX2RpcnR5KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA9IE5VTEw7Ci0gIGludCBjb3VudF9hbHJlYWR5X2luY2QgPSAwIDsKLSAgaW50IHByZXBhcmVkID0gMCA7Ci0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKK2ludCBqb3VybmFsX21hcmtfZGlydHkoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworCWludCBjb3VudF9hbHJlYWR5X2luY2QgPSAwOworCWludCBwcmVwYXJlZCA9IDA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHkgKTsKLSAgaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKLSAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOwotICB9CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eSk7CisJaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKwkJcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsCisJCQkgICAgICAgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwKKwkJCSAgICAgICB0aC0+dF90cmFuc19pZCwgam91cm5hbC0+al90cmFuc19pZCk7CisJfQogCi0gIHBfc19zYi0+c19kaXJ0ID0gMTsKKwlwX3Nfc2ItPnNfZGlydCA9IDE7CiAKLSAgcHJlcGFyZWQgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7Ci0gIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKTsKLSAgLyogYWxyZWFkeSBpbiB0aGlzIHRyYW5zYWN0aW9uLCB3ZSBhcmUgZG9uZSAqLwotICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9hbHJlYWR5ICk7Ci0gICAgcmV0dXJuIDAgOwotICB9CisJcHJlcGFyZWQgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGJoKTsKKwljbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKTsKKwkvKiBhbHJlYWR5IGluIHRoaXMgdHJhbnNhY3Rpb24sIHdlIGFyZSBkb25lICovCisJaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpKSB7CisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHlfYWxyZWFkeSk7CisJCXJldHVybiAwOworCX0KIAotICAvKiB0aGlzIG11c3QgYmUgdHVybmVkIGludG8gYSBwYW5pYyBpbnN0ZWFkIG9mIGEgd2FybmluZy4gIFdlIGNhbid0IGFsbG93Ci0gICoqIGEgZGlydHkgb3Igam91cm5hbF9kaXJ0eSBvciBsb2NrZWQgYnVmZmVyIHRvIGJlIGxvZ2dlZCwgYXMgc29tZSBjaGFuZ2VzCi0gICoqIGNvdWxkIGdldCB0byBkaXNrIHRvbyBlYXJseS4gIE5PVCBHT09ELgotICAqLwotICBpZiAoIXByZXBhcmVkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpIHsKLSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTE3Nzc6IGJ1ZmZlciAlbGx1IGJhZCBzdGF0ZSAiCi0JCSAgICAgICIlY1BSRVBBUkVEICVjTE9DS0VEICVjRElSVFkgJWNKRElSVFlfV0FJVCIsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgcHJlcGFyZWQgPyAnICcgOiAnIScsCi0JCQkgICAgYnVmZmVyX2xvY2tlZChiaCkgPyAnICcgOiAnIScsCi0JCQkgICAgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKLQkJCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkgPyAnICcgOiAnIScpIDsKLSAgfQorCS8qIHRoaXMgbXVzdCBiZSB0dXJuZWQgaW50byBhIHBhbmljIGluc3RlYWQgb2YgYSB3YXJuaW5nLiAgV2UgY2FuJ3QgYWxsb3cKKwkgKiogYSBkaXJ0eSBvciBqb3VybmFsX2RpcnR5IG9yIGxvY2tlZCBidWZmZXIgdG8gYmUgbG9nZ2VkLCBhcyBzb21lIGNoYW5nZXMKKwkgKiogY291bGQgZ2V0IHRvIGRpc2sgdG9vIGVhcmx5LiAgTk9UIEdPT0QuCisJICovCisJaWYgKCFwcmVwYXJlZCB8fCBidWZmZXJfZGlydHkoYmgpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xNzc3OiBidWZmZXIgJWxsdSBiYWQgc3RhdGUgIgorCQkJCSAiJWNQUkVQQVJFRCAlY0xPQ0tFRCAlY0RJUlRZICVjSkRJUlRZX1dBSVQiLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJCQkJIHByZXBhcmVkID8gJyAnIDogJyEnLAorCQkJCSBidWZmZXJfbG9ja2VkKGJoKSA/ICcgJyA6ICchJywKKwkJCQkgYnVmZmVyX2RpcnR5KGJoKSA/ICcgJyA6ICchJywKKwkJCQkgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpID8gJyAnIDogJyEnKTsKKwl9CiAKLSAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9Ci0gIC8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKLSAgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCi0gICovIAotICBpZiAoam91cm5hbC0+al9sZW4gPj0gam91cm5hbC0+al90cmFuc19tYXgpIHsKLSAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTQxMzogam91cm5hbF9tYXJrX2RpcnR5OiBqX2xlbiAoJWx1KSBpcyB0b28gYmlnXG4iLCBqb3VybmFsLT5qX2xlbikgOwotICB9CisJaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCSAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwKKwkJCQkgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKTsKKwkJcmV0dXJuIDE7CisJfQorCS8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKKwkgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCisJICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID49IGpvdXJuYWwtPmpfdHJhbnNfbWF4KSB7CisJCXJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLAorCQkJICAgICAgICJqb3VybmFsLTE0MTM6IGpvdXJuYWxfbWFya19kaXJ0eTogal9sZW4gKCVsdSkgaXMgdG9vIGJpZ1xuIiwKKwkJCSAgICAgICBqb3VybmFsLT5qX2xlbik7CisJfQogCi0gIGlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKLSAgICBjb3VudF9hbHJlYWR5X2luY2QgPSAxIDsKLSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsICk7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKLSAgfQorCWlmIChidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJY291bnRfYWxyZWFkeV9pbmNkID0gMTsKKwkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIGpvdXJuYWwubWFya19kaXJ0eV9ub3Rqb3VybmFsKTsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpOworCX0KIAotICBpZiAoam91cm5hbC0+al9sZW4gPiBqb3VybmFsLT5qX2xlbl9hbGxvYykgewotICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jID0gam91cm5hbC0+al9sZW4gKyBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7Ci0gIH0KKwlpZiAoam91cm5hbC0+al9sZW4gPiBqb3VybmFsLT5qX2xlbl9hbGxvYykgeworCQlqb3VybmFsLT5qX2xlbl9hbGxvYyA9IGpvdXJuYWwtPmpfbGVuICsgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJfQogCi0gIHNldF9idWZmZXJfam91cm5hbGVkIChiaCk7CisJc2V0X2J1ZmZlcl9qb3VybmFsZWQoYmgpOwogCi0gIC8qIG5vdyBwdXQgdGhpcyBndXkgb24gdGhlIGVuZCAqLwotICBpZiAoIWNuKSB7Ci0gICAgY24gPSBnZXRfY25vZGUocF9zX3NiKSA7Ci0gICAgaWYgKCFjbikgewotICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiZ2V0X2Nub2RlIGZhaWxlZCFcbiIpOyAKLSAgICB9CisJLyogbm93IHB1dCB0aGlzIGd1eSBvbiB0aGUgZW5kICovCisJaWYgKCFjbikgeworCQljbiA9IGdldF9jbm9kZShwX3Nfc2IpOworCQlpZiAoIWNuKSB7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJnZXRfY25vZGUgZmFpbGVkIVxuIik7CisJCX0KIAotICAgIGlmICh0aC0+dF9ibG9ja3NfbG9nZ2VkID09IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpIHsKLSAgICAgIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOwotICAgICAgam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOwotICAgIH0KLSAgICB0aC0+dF9ibG9ja3NfbG9nZ2VkKysgOwotICAgIGpvdXJuYWwtPmpfbGVuKysgOworCQlpZiAodGgtPnRfYmxvY2tzX2xvZ2dlZCA9PSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSB7CisJCQl0aC0+dF9ibG9ja3NfYWxsb2NhdGVkICs9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UOworCQkJam91cm5hbC0+al9sZW5fYWxsb2MgKz0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQ7CisJCX0KKwkJdGgtPnRfYmxvY2tzX2xvZ2dlZCsrOworCQlqb3VybmFsLT5qX2xlbisrOwogCi0gICAgY24tPmJoID0gYmggOwotICAgIGNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tuciA7Ci0gICAgY24tPnNiID0gcF9zX3NiOwotICAgIGNuLT5qbGlzdCA9IE5VTEwgOwotICAgIGluc2VydF9qb3VybmFsX2hhc2goam91cm5hbC0+al9oYXNoX3RhYmxlLCBjbikgOwotICAgIGlmICghY291bnRfYWxyZWFkeV9pbmNkKSB7Ci0gICAgICBnZXRfYmgoYmgpIDsKLSAgICB9Ci0gIH0KLSAgY24tPm5leHQgPSBOVUxMIDsKLSAgY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3QgOwotICBjbi0+YmggPSBiaCA7Ci0gIGlmIChqb3VybmFsLT5qX2xhc3QpIHsKLSAgICBqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbiA7Ci0gICAgam91cm5hbC0+al9sYXN0ID0gY24gOwotICB9IGVsc2UgewotICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbiA7Ci0gICAgam91cm5hbC0+al9sYXN0ID0gY24gOwotICB9Ci0gIHJldHVybiAwIDsKKwkJY24tPmJoID0gYmg7CisJCWNuLT5ibG9ja25yID0gYmgtPmJfYmxvY2tucjsKKwkJY24tPnNiID0gcF9zX3NiOworCQljbi0+amxpc3QgPSBOVUxMOworCQlpbnNlcnRfam91cm5hbF9oYXNoKGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgY24pOworCQlpZiAoIWNvdW50X2FscmVhZHlfaW5jZCkgeworCQkJZ2V0X2JoKGJoKTsKKwkJfQorCX0KKwljbi0+bmV4dCA9IE5VTEw7CisJY24tPnByZXYgPSBqb3VybmFsLT5qX2xhc3Q7CisJY24tPmJoID0gYmg7CisJaWYgKGpvdXJuYWwtPmpfbGFzdCkgeworCQlqb3VybmFsLT5qX2xhc3QtPm5leHQgPSBjbjsKKwkJam91cm5hbC0+al9sYXN0ID0gY247CisJfSBlbHNlIHsKKwkJam91cm5hbC0+al9maXJzdCA9IGNuOworCQlqb3VybmFsLT5qX2xhc3QgPSBjbjsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLWludCBqb3VybmFsX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgewotICBpZiAoIWN1cnJlbnQtPmpvdXJuYWxfaW5mbyAmJiB0aC0+dF9yZWZjb3VudCA+IDEpCi0gICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiUkVJU0VSLU5FU1RJTkc6IHRoIE5VTEwsIHJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICB0aC0+dF9yZWZjb3VudCk7CitpbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJaWYgKCFjdXJyZW50LT5qb3VybmFsX2luZm8gJiYgdGgtPnRfcmVmY291bnQgPiAxKQorCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlJFSVNFUi1ORVNUSU5HOiB0aCBOVUxMLCByZWZjb3VudCAlZCIsCisJCQkJIHRoLT50X3JlZmNvdW50KTsKIAotICBpZiAoIXRoLT50X3RyYW5zX2lkKSB7Ci0gICAgV0FSTl9PTiAoMSk7Ci0gICAgcmV0dXJuIC1FSU87Ci0gIH0KKwlpZiAoIXRoLT50X3RyYW5zX2lkKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtRUlPOworCX0KIAotICB0aC0+dF9yZWZjb3VudC0tOwotICBpZiAodGgtPnRfcmVmY291bnQgPiAwKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKKwl0aC0+dF9yZWZjb3VudC0tOworCWlmICh0aC0+dF9yZWZjb3VudCA+IDApIHsKKwkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqY3VyX3RoID0KKwkJICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKIAotICAgIC8qIHdlIGFyZW4ndCBhbGxvd2VkIHRvIGNsb3NlIGEgbmVzdGVkIHRyYW5zYWN0aW9uIG9uIGEgZGlmZmVyZW50Ci0gICAgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0Ci0gICAgKi8KLSAgICBpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQotICAgICAgQlVHKCkgOworCQkvKiB3ZSBhcmVuJ3QgYWxsb3dlZCB0byBjbG9zZSBhIG5lc3RlZCB0cmFuc2FjdGlvbiBvbiBhIGRpZmZlcmVudAorCQkgKiogZmlsZXN5c3RlbSBmcm9tIHRoZSBvbmUgaW4gdGhlIHRhc2sgc3RydWN0CisJCSAqLworCQlpZiAoY3VyX3RoLT50X3N1cGVyICE9IHRoLT50X3N1cGVyKQorCQkJQlVHKCk7CiAKLSAgICBpZiAodGggIT0gY3VyX3RoKSB7Ci0gICAgICBtZW1jcHkoY3VycmVudC0+am91cm5hbF9pbmZvLCB0aCwgc2l6ZW9mKCp0aCkpOwotICAgICAgdGgtPnRfdHJhbnNfaWQgPSAwOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgMCkgOwotICB9CisJCWlmICh0aCAhPSBjdXJfdGgpIHsKKwkJCW1lbWNweShjdXJyZW50LT5qb3VybmFsX2luZm8sIHRoLCBzaXplb2YoKnRoKSk7CisJCQl0aC0+dF90cmFuc19pZCA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIDApOworCX0KIH0KIAogLyogcmVtb3ZlcyBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCByZWxzaW5nIGFuZCBkZXNjcmVtZW50aW5nIGFueSBjb3VudGVycy4gIApAQCAtMjk4MCw0NyArMzI4Miw1MSBAQAogKioKICoqIHJldHVybnMgMSBpZiBpdCBjbGVhbmVkIGFuZCByZWxzZWQgdGhlIGJ1ZmZlci4gMCBvdGhlcndpc2UKICovCi1zdGF0aWMgaW50IHJlbW92ZV9mcm9tX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKSB7Ci0gIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7Ci0gIGludCByZXQgPSAwOworc3RhdGljIGludCByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkgICBiX2Jsb2NrbnJfdCBibG9ja25yLCBpbnQgYWxyZWFkeV9jbGVhbmVkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCWludCByZXQgPSAwOwogCi0gIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2hhc2hfdGFibGUsIGJsb2NrbnIpIDsKLSAgaWYgKCFjbiB8fCAhY24tPmJoKSB7Ci0gICAgcmV0dXJuIHJldCA7Ci0gIH0KLSAgYmggPSBjbi0+YmggOwotICBpZiAoY24tPnByZXYpIHsKLSAgICBjbi0+cHJldi0+bmV4dCA9IGNuLT5uZXh0IDsKLSAgfQotICBpZiAoY24tPm5leHQpIHsKLSAgICBjbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2IDsKLSAgfQotICBpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgewotICAgIGpvdXJuYWwtPmpfZmlyc3QgPSBjbi0+bmV4dCA7Ci0gIH0KLSAgaWYgKGNuID09IGpvdXJuYWwtPmpfbGFzdCkgewotICAgIGpvdXJuYWwtPmpfbGFzdCA9IGNuLT5wcmV2IDsKLSAgfQotICBpZiAoYmgpCi0JcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwgYmgtPmJfYmxvY2tuciwgMCkgOwotICBjbGVhcl9idWZmZXJfam91cm5hbGVkICAoYmgpOyAvKiBkb24ndCBsb2cgdGhpcyBvbmUgKi8KKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKwlpZiAoIWNuIHx8ICFjbi0+YmgpIHsKKwkJcmV0dXJuIHJldDsKKwl9CisJYmggPSBjbi0+Ymg7CisJaWYgKGNuLT5wcmV2KSB7CisJCWNuLT5wcmV2LT5uZXh0ID0gY24tPm5leHQ7CisJfQorCWlmIChjbi0+bmV4dCkgeworCQljbi0+bmV4dC0+cHJldiA9IGNuLT5wcmV2OworCX0KKwlpZiAoY24gPT0gam91cm5hbC0+al9maXJzdCkgeworCQlqb3VybmFsLT5qX2ZpcnN0ID0gY24tPm5leHQ7CisJfQorCWlmIChjbiA9PSBqb3VybmFsLT5qX2xhc3QpIHsKKwkJam91cm5hbC0+al9sYXN0ID0gY24tPnByZXY7CisJfQorCWlmIChiaCkKKwkJcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgTlVMTCwKKwkJCQkgICAgYmgtPmJfYmxvY2tuciwgMCk7CisJY2xlYXJfYnVmZmVyX2pvdXJuYWxlZChiaCk7CS8qIGRvbid0IGxvZyB0aGlzIG9uZSAqLwogCi0gIGlmICghYWxyZWFkeV9jbGVhbmVkKSB7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKLSAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOwotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKTsKLSAgICBwdXRfYmgoYmgpIDsKLSAgICBpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgewotICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNzUyOiByZW1vdmUgZnJvbSB0cmFucywgYl9jb3VudCA8IDAiKTsKLSAgICB9Ci0gICAgcmV0ID0gMSA7Ci0gIH0KLSAgam91cm5hbC0+al9sZW4tLSA7Ci0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jLS0gOwotICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKLSAgcmV0dXJuIHJldCA7CisJaWYgKCFhbHJlYWR5X2NsZWFuZWQpIHsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKwkJcHV0X2JoKGJoKTsKKwkJaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkgImpvdXJuYWwtMTc1MjogcmVtb3ZlIGZyb20gdHJhbnMsIGJfY291bnQgPCAwIik7CisJCX0KKwkJcmV0ID0gMTsKKwl9CisJam91cm5hbC0+al9sZW4tLTsKKwlqb3VybmFsLT5qX2xlbl9hbGxvYy0tOworCWZyZWVfY25vZGUocF9zX3NiLCBjbik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTMwMzMsMTIwICszMzM5LDEyOSBAQAogKiogYmxvY2tzIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uIG9uIGRpc2sKICoqCiAqLwotc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7Ci0gIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBjbi0+c2I7Ci0gIGJfYmxvY2tucl90IGJsb2NrbnIgPSBjbi0+YmxvY2tuciAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY3VyID0gY24tPmhwcmV2IDsKLSAgaW50IGNhbl9kaXJ0eSA9IDEgOwotICAKLSAgLyogZmlyc3QgdGVzdCBocHJldi4gIFRoZXNlIGFyZSBhbGwgbmV3ZXIgdGhhbiBjbiwgc28gYW55IG5vZGUgaGVyZQotICAqKiB3aXRoIHRoZSBzYW1lIGJsb2NrIG51bWJlciBhbmQgZGV2IG1lYW5zIHRoaXMgbm9kZSBjYW4ndCBiZSBzZW50Ci0gICoqIHRvIGRpc2sgcmlnaHQgbm93LgotICAqLwotICB3aGlsZShjdXIgJiYgY2FuX2RpcnR5KSB7Ci0gICAgaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5iaCAmJiBjdXItPmJsb2NrbnIgJiYgY3VyLT5zYiA9PSBzYiAmJiAKLSAgICAgICAgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKLSAgICAgIGNhbl9kaXJ0eSA9IDAgOwotICAgIH0KLSAgICBjdXIgPSBjdXItPmhwcmV2IDsKLSAgfQotICAvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKLSAgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKLSAgKi8KLSAgY3VyID0gY24tPmhuZXh0IDsKLSAgd2hpbGUoY3VyICYmIGNhbl9kaXJ0eSkgewotICAgIGlmIChjdXItPmpsaXN0ICYmIGN1ci0+amxpc3QtPmpfbGVuID4gMCAmJiAKLSAgICAgICAgYXRvbWljX3JlYWQoJihjdXItPmpsaXN0LT5qX2NvbW1pdF9sZWZ0KSkgPiAwICYmIGN1ci0+YmggJiYgCi0gICAgICAgIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmIGN1ci0+YmxvY2tuciA9PSBibG9ja25yKSB7Ci0gICAgICBjYW5fZGlydHkgPSAwIDsKLSAgICB9Ci0gICAgY3VyID0gY3VyLT5obmV4dCA7Ci0gIH0KLSAgcmV0dXJuIGNhbl9kaXJ0eSA7CitzdGF0aWMgaW50IGNhbl9kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNuLT5zYjsKKwliX2Jsb2NrbnJfdCBibG9ja25yID0gY24tPmJsb2NrbnI7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmN1ciA9IGNuLT5ocHJldjsKKwlpbnQgY2FuX2RpcnR5ID0gMTsKKworCS8qIGZpcnN0IHRlc3QgaHByZXYuICBUaGVzZSBhcmUgYWxsIG5ld2VyIHRoYW4gY24sIHNvIGFueSBub2RlIGhlcmUKKwkgKiogd2l0aCB0aGUgc2FtZSBibG9jayBudW1iZXIgYW5kIGRldiBtZWFucyB0aGlzIG5vZGUgY2FuJ3QgYmUgc2VudAorCSAqKiB0byBkaXNrIHJpZ2h0IG5vdy4KKwkgKi8KKwl3aGlsZSAoY3VyICYmIGNhbl9kaXJ0eSkgeworCQlpZiAoY3VyLT5qbGlzdCAmJiBjdXItPmJoICYmIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmCisJCSAgICBjdXItPmJsb2NrbnIgPT0gYmxvY2tucikgeworCQkJY2FuX2RpcnR5ID0gMDsKKwkJfQorCQljdXIgPSBjdXItPmhwcmV2OworCX0KKwkvKiB0aGVuIHRlc3QgaG5leHQuICBUaGVzZSBhcmUgYWxsIG9sZGVyIHRoYW4gY24uICBBcyBsb25nIGFzIHRoZXkKKwkgKiogYXJlIGNvbW1pdHRlZCB0byB0aGUgbG9nLCBpdCBpcyBzYWZlIHRvIHdyaXRlIGNuIHRvIGRpc2sKKwkgKi8KKwljdXIgPSBjbi0+aG5leHQ7CisJd2hpbGUgKGN1ciAmJiBjYW5fZGlydHkpIHsKKwkJaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5qbGlzdC0+al9sZW4gPiAwICYmCisJCSAgICBhdG9taWNfcmVhZCgmKGN1ci0+amxpc3QtPmpfY29tbWl0X2xlZnQpKSA+IDAgJiYgY3VyLT5iaCAmJgorCQkgICAgY3VyLT5ibG9ja25yICYmIGN1ci0+c2IgPT0gc2IgJiYgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKwkJCWNhbl9kaXJ0eSA9IDA7CisJCX0KKwkJY3VyID0gY3VyLT5obmV4dDsKKwl9CisJcmV0dXJuIGNhbl9kaXJ0eTsKIH0KIAogLyogc3luY3MgdGhlIGNvbW1pdCBibG9ja3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSB0aGUgcmVhbCBidWZmZXJzIHRvIGRpc2sKICoqIHdpbGwgd2FpdCB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBkb25lL2NvbW1pdGVkIGJlZm9yZSByZXR1cm5pbmcgCiAqLwotaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7Ci0gIC8qIHlvdSBjYW4gc3luYyB3aGlsZSBuZXN0ZWQsIHZlcnksIHZlcnkgYmFkICovCi0gIGlmICh0aC0+dF9yZWZjb3VudCA+IDEpIHsKLSAgICBCVUcoKSA7Ci0gIH0KLSAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7Ci0gIH0KLSAgcmV0dXJuIGRvX2pvdXJuYWxfZW5kKHRoLCBwX3Nfc2IsIG5ibG9ja3MsIENPTU1JVF9OT1cgfCBXQUlUKSA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJLyogeW91IGNhbiBzeW5jIHdoaWxlIG5lc3RlZCwgdmVyeSwgdmVyeSBiYWQgKi8KKwlpZiAodGgtPnRfcmVmY291bnQgPiAxKSB7CisJCUJVRygpOworCX0KKwlpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgeworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwKKwkJCQkJICAgICAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpOworCX0KKwlyZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgQ09NTUlUX05PVyB8IFdBSVQpOwogfQogCiAvKgogKiogd3JpdGViYWNrIHRoZSBwZW5kaW5nIGFzeW5jIGNvbW1pdHMgdG8gZGlzawogKi8KLXN0YXRpYyB2b2lkIGZsdXNoX2FzeW5jX2NvbW1pdHModm9pZCAqcCkgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5Oworc3RhdGljIHZvaWQgZmx1c2hfYXN5bmNfY29tbWl0cyh2b2lkICpwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIAotICBsb2NrX2tlcm5lbCgpOwotICBpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgewotICAgICAgLyogbGFzdCBlbnRyeSBpcyB0aGUgeW91bmdlc3QsIGNvbW1pdCBpdCBhbmQgeW91IGdldCBldmVyeXRoaW5nICovCi0gICAgICBlbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0LnByZXY7Ci0gICAgICBqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKTsKLSAgfQotICB1bmxvY2tfa2VybmVsKCk7Ci0gIC8qCi0gICAqIHRoaXMgaXMgYSBsaXR0bGUgcmFjZXksIGJ1dCB0aGVyZSdzIG5vIGhhcm0gaW4gbWlzc2luZwotICAgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQotICAgKi8KLSAgaWYgKCFhdG9taWNfcmVhZCgmam91cm5hbC0+al9hc3luY190aHJvdHRsZSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpIHsKLSAgICAgIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICAgICAgZmlsZW1hcF9mZGF0YXdyaXRlKHBfc19zYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKLSAgICAgIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOwotICB9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgeworCQkvKiBsYXN0IGVudHJ5IGlzIHRoZSB5b3VuZ2VzdCwgY29tbWl0IGl0IGFuZCB5b3UgZ2V0IGV2ZXJ5dGhpbmcgKi8KKwkJZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5wcmV2OworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCWZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJLyoKKwkgKiB0aGlzIGlzIGEgbGl0dGxlIHJhY2V5LCBidXQgdGhlcmUncyBubyBoYXJtIGluIG1pc3NpbmcKKwkgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQorCSAqLworCWlmICghYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpCisJICAgICYmICFyZWlzZXJmc19pc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJYXRvbWljX2luYygmam91cm5hbC0+al9hc3luY190aHJvdHRsZSk7CisJCWZpbGVtYXBfZmRhdGF3cml0ZShwX3Nfc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCWF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCX0KIH0KIAogLyoKICoqIGZsdXNoZXMgYW55IG9sZCB0cmFuc2FjdGlvbnMgdG8gZGlzawogKiogZW5kcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpZiBpdCBpcyB0b28gb2xkCiAqLwotaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7Ci0gICAgdGltZV90IG5vdyA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKQoreworCXRpbWVfdCBub3c7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKIAotICAgIG5vdyA9IGdldF9zZWNvbmRzKCk7Ci0gICAgLyogc2FmZXR5IGNoZWNrIHNvIHdlIGRvbid0IGZsdXNoIHdoaWxlIHdlIGFyZSByZXBsYXlpbmcgdGhlIGxvZyBkdXJpbmcKLSAgICAgKiBtb3VudAotICAgICAqLwotICAgIGlmIChsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKLQlyZXR1cm4gMCAgOwotICAgIH0KKwlub3cgPSBnZXRfc2Vjb25kcygpOworCS8qIHNhZmV0eSBjaGVjayBzbyB3ZSBkb24ndCBmbHVzaCB3aGlsZSB3ZSBhcmUgcmVwbGF5aW5nIHRoZSBsb2cgZHVyaW5nCisJICogbW91bnQKKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpKSB7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qIGNoZWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgSWYgdGhlcmUgYXJlIG5vIHdyaXRlcnMsIGFuZCBpdCBpcwotICAgICAqIHRvbyBvbGQsIGZpbmlzaCBpdCwgYW5kIGZvcmNlIHRoZSBjb21taXQgYmxvY2tzIHRvIGRpc2sKLSAgICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA8PSAwICYmCi0gICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAgJiYKLSAgICAgICAgam91cm5hbC0+al9sZW4gPiAwICYmCi0gICAgICAgIChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKQotICAgIHsKLQlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7Ci0gICAgICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKKwkvKiBjaGVjayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIHRoZXJlIGFyZSBubyB3cml0ZXJzLCBhbmQgaXQgaXMKKwkgKiB0b28gb2xkLCBmaW5pc2ggaXQsIGFuZCBmb3JjZSB0aGUgY29tbWl0IGJsb2NrcyB0byBkaXNrCisJICovCisJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3djb3VudCkgPD0gMCAmJgorCSAgICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPiAwICYmCisJICAgIGpvdXJuYWwtPmpfbGVuID4gMCAmJgorCSAgICAobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgeworCQlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLAorCQkJCQkJICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLAorCQkJCQkJICAgICAxKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHBfc19zYiwKKwkJCQkJICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CiAKLSAgICAgICAgICAgIC8qIHdlJ3JlIG9ubHkgYmVpbmcgY2FsbGVkIGZyb20ga3JlaXNlcmZzZCwgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gZG8KLSAgICAgICAgICAgICoqIGFuIGFzeW5jIGNvbW1pdCBzbyB0aGF0IGtyZWlzZXJmc2QgY2FuIGRvIGl0IGxhdGVyCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsMSwgQ09NTUlUX05PVyB8IFdBSVQpIDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcF9zX3NiLT5zX2RpcnQ7CisJCQkvKiB3ZSdyZSBvbmx5IGJlaW5nIGNhbGxlZCBmcm9tIGtyZWlzZXJmc2QsIGl0IG1ha2VzIG5vIHNlbnNlIHRvIGRvCisJCQkgKiogYW4gYXN5bmMgY29tbWl0IHNvIHRoYXQga3JlaXNlcmZzZCBjYW4gZG8gaXQgbGF0ZXIKKwkJCSAqLworCQkJZG9fam91cm5hbF9lbmQoJnRoLCBwX3Nfc2IsIDEsIENPTU1JVF9OT1cgfCBXQUlUKTsKKwkJfQorCX0KKwlyZXR1cm4gcF9zX3NiLT5zX2RpcnQ7CiB9CiAKIC8qCkBAIC0zMTYwLDEwMSArMzQ3NSwxMDggQEAKICoqIAogKiogTm90ZSwgd2UgY2FuJ3QgYWxsb3cgdGhlIGpvdXJuYWxfZW5kIHRvIHByb2NlZWQgd2hpbGUgdGhlcmUgYXJlIHN0aWxsIHdyaXRlcnMgaW4gdGhlIGxvZy4KICovCi1zdGF0aWMgaW50IGNoZWNrX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCBpbnQgZmxhZ3MpIHsKK3N0YXRpYyBpbnQgY2hlY2tfam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsCisJCQkgICAgIGludCBmbGFncykKK3sKIAotICB0aW1lX3Qgbm93IDsKLSAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOwotICBpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVyA7Ci0gIGludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisJdGltZV90IG5vdzsKKwlpbnQgZmx1c2ggPSBmbGFncyAmIEZMVVNIX0FMTDsKKwlpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVzsKKwlpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHBfc19zYik7CiAKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gIGlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsIAotICAgICAgICAgICAgICAgICAgIHRoLT50X3RyYW5zX2lkLCBqb3VybmFsLT5qX3RyYW5zX2lkKTsKLSAgfQotCi0gIGpvdXJuYWwtPmpfbGVuX2FsbG9jIC09ICh0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIC0gdGgtPnRfYmxvY2tzX2xvZ2dlZCkgOwotICBpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeyAvKiA8PSAwIGlzIGFsbG93ZWQuICB1bm1vdW50aW5nIG1pZ2h0IG5vdCBjYWxsIGJlZ2luICovCi0gICAgYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSkgOwotICB9Ci0KLSAgLyogQlVHLCBkZWFsIHdpdGggY2FzZSB3aGVyZSBqX2xlbiBpcyAwLCBidXQgcGVvcGxlIHByZXZpb3VzbHkgZnJlZWQgYmxvY2tzIG5lZWQgdG8gYmUgcmVsZWFzZWQgCi0gICoqIHdpbGwgYmUgZGVhbHQgd2l0aCBieSBuZXh0IHRyYW5zYWN0aW9uIHRoYXQgYWN0dWFsbHkgd3JpdGVzIHNvbWV0aGluZywgYnV0IHNob3VsZCBiZSB0YWtlbgotICAqKiBjYXJlIG9mIGluIHRoaXMgdHJhbnMKLSAgKi8KLSAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKLSAgICBCVUcoKTsKLSAgfQotICAvKiBpZiB3Y291bnQgPiAwLCBhbmQgd2UgYXJlIGNhbGxlZCB0byB3aXRoIGZsdXNoIG9yIGNvbW1pdF9ub3csCi0gICoqIHdlIHdhaXQgb24gal9qb2luX3dhaXQuICBXZSB3aWxsIHdha2UgdXAgd2hlbiB0aGUgbGFzdCB3cml0ZXIgaGFzCi0gICoqIGZpbmlzaGVkIHRoZSB0cmFuc2FjdGlvbiwgYW5kIHN0YXJ0ZWQgaXQgb24gaXRzIHdheSB0byB0aGUgZGlzay4KLSAgKiogVGhlbiwgd2UgZmx1c2ggdGhlIGNvbW1pdCBvciBqb3VybmFsIGxpc3QsIGFuZCBqdXN0IHJldHVybiAwIAotICAqKiBiZWNhdXNlIHRoZSByZXN0IG9mIGpvdXJuYWwgZW5kIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24uCi0gICovCi0gIGlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7Ci0gICAgaWYgKGZsdXNoIHx8IGNvbW1pdF9ub3cpIHsKLSAgICAgIHVuc2lnbmVkIHRyYW5zX2lkIDsKLQotICAgICAgamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7Ci0gICAgICB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOwotICAgICAgaWYgKHdhaXRfb25fY29tbWl0KQotICAgICAgICBqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOwotICAgICAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKSA7Ci0gICAgICBpZiAoZmx1c2gpIHsKLSAgICAgICAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAxIDsKLSAgICAgIH0KLSAgICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOwotCi0gICAgICAvKiBzbGVlcCB3aGlsZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzdGlsbCBqX2psb2NrZWQgKi8KLSAgICAgIHdoaWxlKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKLQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7Ci0JICAgIHF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgbG9ja19qb3VybmFsKHBfc19zYik7Ci0JICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7Ci0JICAgICAgICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDEpIDsKLQkgICAgfQotCSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCWlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJCXJlaXNlcmZzX3BhbmljKHRoLT50X3N1cGVyLAorCQkJICAgICAgICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsCisJCQkgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOwogCX0KLSAgICAgIH0KLSAgICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7Ci0gICAgICAgICAgQlVHKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoY29tbWl0X25vdyAmJiBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCB0cmFuc19pZCkgJiYKLSAgICAgICAgICB3YWl0X29uX2NvbW1pdCkKLSAgICAgIHsKLQkgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpIDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwIDsKLSAgICB9IAotICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOwotICAgIHJldHVybiAwIDsKLSAgfQogCi0gIC8qIGRlYWwgd2l0aCBvbGQgdHJhbnNhY3Rpb25zIHdoZXJlIHdlIGFyZSB0aGUgbGFzdCB3cml0ZXJzICovCi0gIG5vdyA9IGdldF9zZWNvbmRzKCk7Ci0gIGlmICgobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgewotICAgIGNvbW1pdF9ub3cgPSAxIDsKLSAgICBqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxIDsKLSAgfQotICAvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLwotICAvKiBkb24ndCBiYXRjaCB3aGVuIHN5bmNpbmcgdGhlIGNvbW1pdCBvciBmbHVzaGluZyB0aGUgd2hvbGUgdHJhbnMgKi8KLSAgaWYgKCEoam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSAmJiAhKGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpKSAmJiAhZmx1c2ggJiYgIWNvbW1pdF9ub3cgJiYKLSAgICAgIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKSAgJiYKLSAgICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jIDwgam91cm5hbC0+al9tYXhfYmF0Y2ggJiYgam91cm5hbC0+al9jbm9kZV9mcmVlID4gKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICogMykpIHsKLSAgICBqb3VybmFsLT5qX2Jjb3VudCsrIDsKLSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKLSAgICByZXR1cm4gMCA7Ci0gIH0KKwlqb3VybmFsLT5qX2xlbl9hbGxvYyAtPSAodGgtPnRfYmxvY2tzX2FsbG9jYXRlZCAtIHRoLT50X2Jsb2Nrc19sb2dnZWQpOworCWlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7CS8qIDw9IDAgaXMgYWxsb3dlZC4gIHVubW91bnRpbmcgbWlnaHQgbm90IGNhbGwgYmVnaW4gKi8KKwkJYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSk7CisJfQogCi0gIGlmIChqb3VybmFsLT5qX3N0YXJ0ID4gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7Ci0gICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0wMDM6IGpvdXJuYWxfZW5kOiBqX3N0YXJ0ICglbGQpIGlzIHRvbyBoaWdoXG4iLCBqb3VybmFsLT5qX3N0YXJ0KSA7Ci0gIH0KLSAgcmV0dXJuIDEgOworCS8qIEJVRywgZGVhbCB3aXRoIGNhc2Ugd2hlcmUgal9sZW4gaXMgMCwgYnV0IHBlb3BsZSBwcmV2aW91c2x5IGZyZWVkIGJsb2NrcyBuZWVkIHRvIGJlIHJlbGVhc2VkIAorCSAqKiB3aWxsIGJlIGRlYWx0IHdpdGggYnkgbmV4dCB0cmFuc2FjdGlvbiB0aGF0IGFjdHVhbGx5IHdyaXRlcyBzb21ldGhpbmcsIGJ1dCBzaG91bGQgYmUgdGFrZW4KKwkgKiogY2FyZSBvZiBpbiB0aGlzIHRyYW5zCisJICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKwkJQlVHKCk7CisJfQorCS8qIGlmIHdjb3VudCA+IDAsIGFuZCB3ZSBhcmUgY2FsbGVkIHRvIHdpdGggZmx1c2ggb3IgY29tbWl0X25vdywKKwkgKiogd2Ugd2FpdCBvbiBqX2pvaW5fd2FpdC4gIFdlIHdpbGwgd2FrZSB1cCB3aGVuIHRoZSBsYXN0IHdyaXRlciBoYXMKKwkgKiogZmluaXNoZWQgdGhlIHRyYW5zYWN0aW9uLCBhbmQgc3RhcnRlZCBpdCBvbiBpdHMgd2F5IHRvIHRoZSBkaXNrLgorCSAqKiBUaGVuLCB3ZSBmbHVzaCB0aGUgY29tbWl0IG9yIGpvdXJuYWwgbGlzdCwgYW5kIGp1c3QgcmV0dXJuIDAgCisJICoqIGJlY2F1c2UgdGhlIHJlc3Qgb2Ygam91cm5hbCBlbmQgd2FzIGFscmVhZHkgZG9uZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeworCQlpZiAoZmx1c2ggfHwgY29tbWl0X25vdykgeworCQkJdW5zaWduZWQgdHJhbnNfaWQ7CisKKwkJCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCQkJdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwkJCWlmICh3YWl0X29uX2NvbW1pdCkKKwkJCQlqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOworCQkJYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKTsKKwkJCWlmIChmbHVzaCkgeworCQkJCWpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMTsKKwkJCX0KKwkJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisKKwkJCS8qIHNsZWVwIHdoaWxlIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIHN0aWxsIGpfamxvY2tlZCAqLworCQkJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwkJCQlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJCQkJCXF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwkJCQkJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwkJCQkJCWF0b21pY19zZXQoJihqb3VybmFsLT5qX2psb2NrKSwKKwkJCQkJCQkgICAxKTsKKwkJCQkJfQorCQkJCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCQkJCX0KKwkJCX0KKwkJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisJCQkJQlVHKCk7CisJCQl9CisJCQlpZiAoY29tbWl0X25vdworCQkJICAgICYmIGpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShwX3Nfc2IsIHRyYW5zX2lkKQorCQkJICAgICYmIHdhaXRfb25fY29tbWl0KSB7CisJCQkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorCQl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkZWFsIHdpdGggb2xkIHRyYW5zYWN0aW9ucyB3aGVyZSB3ZSBhcmUgdGhlIGxhc3Qgd3JpdGVycyAqLworCW5vdyA9IGdldF9zZWNvbmRzKCk7CisJaWYgKChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKSB7CisJCWNvbW1pdF9ub3cgPSAxOworCQlqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxOworCX0KKwkvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLworCS8qIGRvbid0IGJhdGNoIHdoZW4gc3luY2luZyB0aGUgY29tbWl0IG9yIGZsdXNoaW5nIHRoZSB3aG9sZSB0cmFucyAqLworCWlmICghKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgJiYgIShhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfamxvY2spKSkKKwkgICAgJiYgIWZsdXNoICYmICFjb21taXRfbm93ICYmIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKQorCSAgICAmJiBqb3VybmFsLT5qX2xlbl9hbGxvYyA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoCisJICAgICYmIGpvdXJuYWwtPmpfY25vZGVfZnJlZSA+IChqb3VybmFsLT5qX3RyYW5zX21heCAqIDMpKSB7CisJCWpvdXJuYWwtPmpfYmNvdW50Kys7CisJCXVubG9ja19qb3VybmFsKHBfc19zYik7CisJCXJldHVybiAwOworCX0KKworCWlmIChqb3VybmFsLT5qX3N0YXJ0ID4gU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7CisJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCSAgICAgICAiam91cm5hbC0wMDM6IGpvdXJuYWxfZW5kOiBqX3N0YXJ0ICglbGQpIGlzIHRvbyBoaWdoXG4iLAorCQkJICAgICAgIGpvdXJuYWwtPmpfc3RhcnQpOworCX0KKwlyZXR1cm4gMTsKIH0KIAogLyoKQEAgLTMyNzEsODMgKzM1OTMsOTUgQEAKICoqCiAqKiBUaGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBkZWNyZW1lbnRpbmcgYW55IGNvdW50ZXJzIGFuZCBmaWxpbmcgaXQgb24gdGhlIGNsZWFuIGxpc3QuCiAqLwotaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGJfYmxvY2tucl90IGJsb2NrbnIpIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMIDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwgOwotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTCA7Ci0gIGludCBjbGVhbmVkID0gMCA7Ci0gIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKK2ludCBqb3VybmFsX21hcmtfZnJlZWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgYl9ibG9ja25yX3QgYmxvY2tucikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgPSBOVUxMOworCWludCBjbGVhbmVkID0gMDsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICBjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKLSAgaWYgKGNuICYmIGNuLT5iaCkgewotICAgICAgYmggPSBjbi0+YmggOwotICAgICAgZ2V0X2JoKGJoKSA7Ci0gIH0KLSAgLyogaWYgaXQgaXMgam91cm5hbCBuZXcsIHdlIGp1c3QgcmVtb3ZlIGl0IGZyb20gdGhpcyB0cmFuc2FjdGlvbiAqLwotICBpZiAoYmggJiYgYnVmZmVyX2pvdXJuYWxfbmV3KGJoKSkgewotICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyAoYmgpOwotICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKLSAgICByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpIDsKLSAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogc2V0IHRoZSBiaXQgZm9yIHRoaXMgYmxvY2sgaW4gdGhlIGpvdXJuYWwgYml0bWFwIGZvciB0aGlzIHRyYW5zYWN0aW9uICovCi0gICAgamIgPSBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXA7Ci0gICAgaWYgKCFqYikgewotICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIikgOwotICAgIH0KLSAgICBzZXRfYml0X2luX2xpc3RfYml0bWFwKHBfc19zYiwgYmxvY2tuciwgamIpIDsKKwljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKwlpZiAoY24gJiYgY24tPmJoKSB7CisJCWJoID0gY24tPmJoOworCQlnZXRfYmgoYmgpOworCX0KKwkvKiBpZiBpdCBpcyBqb3VybmFsIG5ldywgd2UganVzdCByZW1vdmUgaXQgZnJvbSB0aGlzIHRyYW5zYWN0aW9uICovCisJaWYgKGJoICYmIGJ1ZmZlcl9qb3VybmFsX25ldyhiaCkpIHsKKwkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3KGJoKTsKKwkJY2xlYXJfcHJlcGFyZWRfYml0cyhiaCk7CisJCXJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCk7CisJCWNsZWFuZWQgPSByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihwX3Nfc2IsIGJsb2NrbnIsIGNsZWFuZWQpOworCX0gZWxzZSB7CisJCS8qIHNldCB0aGUgYml0IGZvciB0aGlzIGJsb2NrIGluIHRoZSBqb3VybmFsIGJpdG1hcCBmb3IgdGhpcyB0cmFuc2FjdGlvbiAqLworCQlqYiA9IGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcDsKKwkJaWYgKCFqYikgeworCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIik7CisJCX0KKwkJc2V0X2JpdF9pbl9saXN0X2JpdG1hcChwX3Nfc2IsIGJsb2NrbnIsIGpiKTsKIAotICAgIC8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCisJCS8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCiAKLSAgICBpZiAoYmgpIHsKLSAgICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKLSAgICAgIHJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCkgOwotICAgIH0KLSAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7CisJCWlmIChiaCkgeworCQkJY2xlYXJfcHJlcGFyZWRfYml0cyhiaCk7CisJCQlyZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpOworCQl9CisJCWNsZWFuZWQgPSByZW1vdmVfZnJvbV90cmFuc2FjdGlvbihwX3Nfc2IsIGJsb2NrbnIsIGNsZWFuZWQpOwogCi0gICAgLyogZmluZCBhbGwgb2xkZXIgdHJhbnNhY3Rpb25zIHdpdGggdGhpcyBibG9jaywgbWFrZSBzdXJlIHRoZXkgZG9uJ3QgdHJ5IHRvIHdyaXRlIGl0IG91dCAqLwotICAgIGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCAgYmxvY2tucikgOwotICAgIHdoaWxlIChjbikgewotICAgICAgaWYgKHBfc19zYiA9PSBjbi0+c2IgJiYgYmxvY2tuciA9PSBjbi0+YmxvY2tucikgewotCXNldF9iaXQoQkxPQ0tfRlJFRUQsICZjbi0+c3RhdGUpIDsKLQlpZiAoY24tPmJoKSB7Ci0JICBpZiAoIWNsZWFuZWQpIHsKLQkgICAgLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCi0JICAgICoqIGluIHRoZSBjdXJyZW50IHRyYW5zCi0JICAgICovCi0gICAgICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKLQkgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7Ci0JICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoY24tPmJoKTsKLQkgICAgY2xlYW5lZCA9IDEgOwotCSAgICBwdXRfYmgoY24tPmJoKSA7Ci0JICAgIGlmIChhdG9taWNfcmVhZCgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgewotCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjEzODogY24tPmJoLT5iX2NvdW50IDwgMCIpOwotCSAgICB9Ci0JICB9Ci0JICBpZiAoY24tPmpsaXN0KSB7IC8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KLQkgICAgYXRvbWljX2RlYygmKGNuLT5qbGlzdC0+al9ub256ZXJvbGVuKSkgOwotCSAgfQotCSAgY24tPmJoID0gTlVMTCA7IAotCX0gCi0gICAgICB9Ci0gICAgICBjbiA9IGNuLT5obmV4dCA7Ci0gICAgfQotICB9CisJCS8qIGZpbmQgYWxsIG9sZGVyIHRyYW5zYWN0aW9ucyB3aXRoIHRoaXMgYmxvY2ssIG1ha2Ugc3VyZSB0aGV5IGRvbid0IHRyeSB0byB3cml0ZSBpdCBvdXQgKi8KKwkJY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAorCQkJCQkgIGJsb2NrbnIpOworCQl3aGlsZSAoY24pIHsKKwkJCWlmIChwX3Nfc2IgPT0gY24tPnNiICYmIGJsb2NrbnIgPT0gY24tPmJsb2NrbnIpIHsKKwkJCQlzZXRfYml0KEJMT0NLX0ZSRUVELCAmY24tPnN0YXRlKTsKKwkJCQlpZiAoY24tPmJoKSB7CisJCQkJCWlmICghY2xlYW5lZCkgeworCQkJCQkJLyogcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24gd2lsbCBicmVsc2UgdGhlIGJ1ZmZlciBpZiBpdCB3YXMgCisJCQkJCQkgKiogaW4gdGhlIGN1cnJlbnQgdHJhbnMKKwkJCQkJCSAqLworCQkJCQkJY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPgorCQkJCQkJCQkJICAgYmgpOworCQkJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJCQkJCQljbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGNuLT4KKwkJCQkJCQkJCSAgYmgpOworCQkJCQkJY2xlYW5lZCA9IDE7CisJCQkJCQlwdXRfYmgoY24tPmJoKTsKKwkJCQkJCWlmIChhdG9taWNfcmVhZAorCQkJCQkJICAgICgmKGNuLT5iaC0+Yl9jb3VudCkpIDwgMCkgeworCQkJCQkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLAorCQkJCQkJCQkJICJqb3VybmFsLTIxMzg6IGNuLT5iaC0+Yl9jb3VudCA8IDAiKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoY24tPmpsaXN0KSB7CS8qIHNpbmNlIHdlIGFyZSBjbGVhcmluZyB0aGUgYmgsIHdlIE1VU1QgZGVjIG5vbnplcm9sZW4gKi8KKwkJCQkJCWF0b21pY19kZWMoJgorCQkJCQkJCSAgIChjbi0+amxpc3QtPgorCQkJCQkJCSAgICBqX25vbnplcm9sZW4pKTsKKwkJCQkJfQorCQkJCQljbi0+YmggPSBOVUxMOworCQkJCX0KKwkJCX0KKwkJCWNuID0gY24tPmhuZXh0OworCQl9CisJfQogCi0gIGlmIChiaCkgewotICAgIHB1dF9iaChiaCkgOyAvKiBnZXRfaGFzaCBncmFicyB0aGUgYnVmZmVyICovCi0gICAgaWYgKGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSA8IDApIHsKLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMjE2NTogYmgtPmJfY291bnQgPCAwIik7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwIDsKKwlpZiAoYmgpIHsKKwkJcHV0X2JoKGJoKTsJLyogZ2V0X2hhc2ggZ3JhYnMgdGhlIGJ1ZmZlciAqLworCQlpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAiam91cm5hbC0yMTY1OiBiaC0+Yl9jb3VudCA8IDAiKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIH0KIAotdm9pZCByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkgewotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKGlub2RlLT5pX3NiKTsKLSAgUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7Ci0gIFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7Cit2b2lkIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYik7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOwogfQogCiAvKgpAQCAtMzM1NSw5OSArMzY4OSwxMDIgQEAKICAqIGlmIGEgdHJhbnNhY3Rpb24gd2FzIGFjdHVhbGx5IGNvbW1pdHRlZCBhbmQgdGhlIGJhcnJpZXIgd2FzIGRvbmUKICAqLwogc3RhdGljIGludCBfX2NvbW1pdF90cmFuc19qbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYiA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgaW50IHJldCA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKKwlpbnQgcmV0ID0gMDsKIAotICAgIC8qIGlzIGl0IGZyb20gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIG9yIGZyb20gYW4gdW5rbm93biB0cmFuc2FjdGlvbj8gKi8KLSAgICBpZiAoaWQgPT0gam91cm5hbC0+al90cmFuc19pZCkgewotCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOwotCS8qIHRyeSB0byBsZXQgb3RoZXIgd3JpdGVycyBjb21lIGluIGFuZCBncm93IHRoaXMgdHJhbnNhY3Rpb24gKi8KLQlsZXRfdHJhbnNhY3Rpb25fZ3JvdyhzYiwgaWQpOwotCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7Ci0JICAgIGdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJLyogaXMgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgb3IgZnJvbSBhbiB1bmtub3duIHRyYW5zYWN0aW9uPyAqLworCWlmIChpZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJCWpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCQkvKiB0cnkgdG8gbGV0IG90aGVyIHdyaXRlcnMgY29tZSBpbiBhbmQgZ3JvdyB0aGlzIHRyYW5zYWN0aW9uICovCisJCWxldF90cmFuc2FjdGlvbl9ncm93KHNiLCBpZCk7CisJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJCQlnb3RvIGZsdXNoX2NvbW1pdF9vbmx5OworCQl9CisKKwkJcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHNiLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogc29tZW9uZSBtaWdodCBoYXZlIGVuZGVkIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugam9pbmVkICovCisJCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHNiLCBTQl9CVUZGRVJfV0lUSF9TQihzYiksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSk7CisJCQlyZXQgPSBqb3VybmFsX2VuZCgmdGgsIHNiLCAxKTsKKwkJCWdvdG8gZmx1c2hfY29tbWl0X29ubHk7CisJCX0KKworCQlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IDE7CisKKwl9IGVsc2UgeworCQkvKiB0aGlzIGdldHMgdHJpY2t5LCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgam91cm5hbCBsaXN0IGluCisJCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAorCQkgKiBpZiB3ZSd2ZSBnb3QgYSBsYXJnZXIgdHJhbnNhY3Rpb24gaWQgdGhhbiB0aGUgb2xkZXN0IGxpc3QKKwkJICovCisJICAgICAgZmx1c2hfY29tbWl0X29ubHk6CisJCWlmIChqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoaW5vZGUtPmlfc2IsIGlkKSkgeworCQkJLyoKKwkJCSAqIHdlIG9ubHkgc2V0IHJldCB0byAxIHdoZW4gd2Uga25vdyBmb3Igc3VyZQorCQkJICogdGhlIGJhcnJpZXIgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgb24gdGhlIGNvbW1pdAorCQkJICogYmxvY2suCisJCQkgKi8KKwkJCWlmIChhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpID4gMSkKKwkJCQlyZXQgPSAxOworCQkJZmx1c2hfY29tbWl0X2xpc3Qoc2IsIGpsLCAxKTsKKwkJCWlmIChqb3VybmFsLT5qX2Vycm5vKQorCQkJCXJldCA9IGpvdXJuYWwtPmpfZXJybm87CisJCX0KIAl9CisJLyogb3RoZXJ3aXNlIHRoZSBsaXN0IGlzIGdvbmUsIGFuZCBsb25nIHNpbmNlIGNvbW1pdHRlZCAqLworCXJldHVybiByZXQ7Cit9CiAKLQlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDEpIDsKLQlpZiAocmV0KQotCSAgICByZXR1cm4gcmV0OworaW50IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGlkID0gUkVJU0VSRlNfSShpbm9kZSktPmlfdHJhbnNfaWQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9qbDsKIAotCS8qIHNvbWVvbmUgbWlnaHQgaGF2ZSBlbmRlZCB0aGlzIHRyYW5zYWN0aW9uIHdoaWxlIHdlIGpvaW5lZCAqLwotCWlmIChqb3VybmFsLT5qX3RyYW5zX2lkICE9IGlkKSB7Ci0JICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHNiKSwgMSkgOwotCSAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzYiwgU0JfQlVGRkVSX1dJVEhfU0Ioc2IpKSA7Ci0JICAgIHJldCA9IGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDEpIDsKLQkgICAgZ290byBmbHVzaF9jb21taXRfb25seTsKLQl9Ci0KLQlyZXQgPSBqb3VybmFsX2VuZF9zeW5jKCZ0aCwgc2IsIDEpIDsKLQlpZiAoIXJldCkKLQkgICAgcmV0ID0gMTsKLQotICAgIH0gZWxzZSB7Ci0JLyogdGhpcyBnZXRzIHRyaWNreSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGpvdXJuYWwgbGlzdCBpbgotCSAqIHRoZSBpbm9kZSBzdGlsbCBleGlzdHMuICBXZSBrbm93IHRoZSBsaXN0IGlzIHN0aWxsIGFyb3VuZAotCSAqIGlmIHdlJ3ZlIGdvdCBhIGxhcmdlciB0cmFuc2FjdGlvbiBpZCB0aGFuIHRoZSBvbGRlc3QgbGlzdAorCS8qIGZvciB0aGUgd2hvbGUgaW5vZGUsIGFzc3VtZSB1bnNldCBpZCBtZWFucyBpdCB3YXMKKwkgKiBjaGFuZ2VkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgTW9yZSBjb25zZXJ2YXRpdmUKIAkgKi8KLWZsdXNoX2NvbW1pdF9vbmx5OgotCWlmIChqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoaW5vZGUtPmlfc2IsIGlkKSkgewotCSAgICAvKgotCSAgICAgKiB3ZSBvbmx5IHNldCByZXQgdG8gMSB3aGVuIHdlIGtub3cgZm9yIHN1cmUKLQkgICAgICogdGhlIGJhcnJpZXIgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQgb24gdGhlIGNvbW1pdAotCSAgICAgKiBibG9jay4KLQkgICAgICovCi0JICAgIGlmIChhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpID4gMSkKLQkgICAgICAgIHJldCA9IDE7Ci0JICAgIGZsdXNoX2NvbW1pdF9saXN0KHNiLCBqbCwgMSkgOwotCSAgICBpZiAoam91cm5hbC0+al9lcnJubykKLQkJcmV0ID0gam91cm5hbC0+al9lcnJubzsKKwlpZiAoIWlkIHx8ICFqbCkgeworCQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCQlpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOworCQkvKiBqbCB3aWxsIGJlIHVwZGF0ZWQgaW4gX19jb21taXRfdHJhbnNfamwgKi8KIAl9Ci0gICAgfQotICAgIC8qIG90aGVyd2lzZSB0aGUgbGlzdCBpcyBnb25lLCBhbmQgbG9uZyBzaW5jZSBjb21taXR0ZWQgKi8KLSAgICByZXR1cm4gcmV0OworCisJcmV0dXJuIF9fY29tbWl0X3RyYW5zX2psKGlub2RlLCBpZCwgamwpOwogfQogCi1pbnQgcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7Ci0gICAgdW5zaWduZWQgbG9uZyBpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfamw7Ci0KLSAgICAvKiBmb3IgdGhlIHdob2xlIGlub2RlLCBhc3N1bWUgdW5zZXQgaWQgbWVhbnMgaXQgd2FzCi0gICAgICogY2hhbmdlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIE1vcmUgY29uc2VydmF0aXZlCi0gICAgICovCi0gICAgaWYgKCFpZCB8fCAhamwpIHsKLQlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLQlpZCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkOwotCS8qIGpsIHdpbGwgYmUgdXBkYXRlZCBpbiBfX2NvbW1pdF90cmFuc19qbCAqLwotICAgIH0KLQotICAgcmV0dXJuIF9fY29tbWl0X3RyYW5zX2psKGlub2RlLCBpZCwgamwpOwordm9pZCByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpOworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLnJlc3RvcmVfcHJlcGFyZWQpOworCWlmICghYmgpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAodGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5KGJoKSAmJgorCSAgICBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCQljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKKwkJCQkJICBqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwKKwkJCQkJICBiaC0+Yl9ibG9ja25yKTsKKwkJaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKKwkJCXNldF9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0KKwljbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZChiaCk7CiB9CiAKLXZvaWQgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOwotICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5yZXN0b3JlX3ByZXBhcmVkICk7Ci0gICAgaWYgKCFiaCkgewotCXJldHVybiA7Ci0gICAgfQotICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKSAmJgotCWJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgewotCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKLQljbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLAotCQkJCSAgYmgtPmJfYmxvY2tucik7Ci0JaWYgKGNuICYmIGNhbl9kaXJ0eShjbikpIHsKLSAgICAgICAgICAgIHNldF9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7Ci0JICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotfQotCi1leHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqY3VyX3RiIDsKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7CiAvKgogKiogYmVmb3JlIHdlIGNhbiBjaGFuZ2UgYSBtZXRhZGF0YSBibG9jaywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgd29uJ3QKICoqIGJlIHdyaXR0ZW4gdG8gZGlzayB3aGlsZSB3ZSBhcmUgYWx0ZXJpbmcgaXQuICBTbywgd2UgbXVzdDoKQEAgLTM0NTYsMzkgKzM3OTMsNDEgQEAKICoqIAogKi8KIGludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KSB7Ci0gIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5wcmVwYXJlICk7CisJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KQoreworCVBST0NfSU5GT19JTkMocF9zX3NiLCBqb3VybmFsLnByZXBhcmUpOwogCi0gICAgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7Ci0JaWYgKCF3YWl0KQotCSAgICByZXR1cm4gMDsKLQlsb2NrX2J1ZmZlcihiaCk7Ci0gICAgfQotICAgIHNldF9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOwotICAgIGlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSAgewotICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF90ZXN0IChiaCk7Ci0gICAgICAgIHNldF9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7Ci0gICAgfQotICAgIHVubG9ja19idWZmZXIoYmgpOwotICAgIHJldHVybiAxOworCWlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQlpZiAoIXdhaXQpCisJCQlyZXR1cm4gMDsKKwkJbG9ja19idWZmZXIoYmgpOworCX0KKwlzZXRfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoYmgpOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7CisJCWNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QoYmgpOworCQlzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eShiaCk7CisJfQorCXVubG9ja19idWZmZXIoYmgpOworCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOwotICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwotICAgIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpOworc3RhdGljIHZvaWQgZmx1c2hfb2xkX2pvdXJuYWxfbGlzdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl0aW1lX3Qgbm93ID0gZ2V0X3NlY29uZHMoKTsKIAotICAgIHdoaWxlKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKLSAgICAgICAgZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OwotCWpsID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKLQkvKiB0aGlzIGNoZWNrIHNob3VsZCBhbHdheXMgYmUgcnVuLCB0byBzZW5kIG9sZCBsaXN0cyB0byBkaXNrICovCi0JaWYgKGpsLT5qX3RpbWVzdGFtcCA8IChub3cgLSAoSk9VUk5BTF9NQVhfVFJBTlNfQUdFICogNCkpKSB7Ci0JICAgIGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzLCBqbCk7Ci0JfSBlbHNlIHsKLQkgICAgYnJlYWs7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKKwkJZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OworCQlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJCS8qIHRoaXMgY2hlY2sgc2hvdWxkIGFsd2F5cyBiZSBydW4sIHRvIHNlbmQgb2xkIGxpc3RzIHRvIGRpc2sgKi8KKwkJaWYgKGpsLT5qX3RpbWVzdGFtcCA8IChub3cgLSAoSk9VUk5BTF9NQVhfVFJBTlNfQUdFICogNCkpKSB7CisJCQlmbHVzaF91c2VkX2pvdXJuYWxfbGlzdHMocywgamwpOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KIAl9Ci0gICAgfQogfQogCiAvKiAKQEAgLTM1MDEsMzc0ICszODQwLDM5MCBAQAogKiogSWYgdGhlIGpvdXJuYWwgaXMgYWJvcnRlZCwgd2UganVzdCBjbGVhbiB1cC4gVGhpbmdzIGxpa2UgZmx1c2hpbmcKICoqIGpvdXJuYWwgbGlzdHMsIGV0YyBqdXN0IHdvbid0IGhhcHBlbi4KICovCi1zdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsIAotCQkgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbmV4dCwgKmpsX2NuOyAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjIDsgCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsgCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqY19iaCA7IC8qIGNvbW1pdCBiaCAqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOyAvKiBkZXNjIGJoICovCi0gIGludCBjdXJfd3JpdGVfc3RhcnQgPSAwIDsgLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KLSAgaW50IG9sZF9zdGFydCA7Ci0gIGludCBpIDsKLSAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOwotICBpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7Ci0gIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqc2FmZTsKLSAgdW5zaWduZWQgbG9uZyBqaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOwotICBpbnQgdHJhbnNfaGFsZjsKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsCisJCQkgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24sICpuZXh0LCAqamxfY247CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICpjb21taXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoOwkvKiBjb21taXQgYmggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmg7CS8qIGRlc2MgYmggKi8KKwlpbnQgY3VyX3dyaXRlX3N0YXJ0ID0gMDsJLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KKwlpbnQgb2xkX3N0YXJ0OworCWludCBpOworCWludCBmbHVzaCA9IGZsYWdzICYgRkxVU0hfQUxMOworCWludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnksICpzYWZlOworCXVuc2lnbmVkIGxvbmcgamluZGV4OworCXVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOworCWludCB0cmFuc19oYWxmOwogCi0gIEJVR19PTiAodGgtPnRfcmVmY291bnQgPiAxKTsKLSAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTih0aC0+dF9yZWZjb3VudCA+IDEpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwotICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kIik7Ci0gIGlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7Ci0gICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSwgMSkgOwotICAgICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKLSAgfQorCXB1dF9mc19leGNsKCk7CisJY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisJcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJqb3VybmFsIGVuZCIpOworCWlmIChqb3VybmFsLT5qX2xlbiA9PSAwKSB7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLAorCQkJCQkgICAgIDEpOworCQlqb3VybmFsX21hcmtfZGlydHkodGgsIHBfc19zYiwgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3NiKSk7CisJfQogCi0gIGxvY2tfam91cm5hbChwX3Nfc2IpIDsKLSAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7Ci0gICAgZmxhZ3MgfD0gRkxVU0hfQUxMIDsKLSAgICBmbHVzaCA9IDEgOwotICB9Ci0gIGlmIChqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2gpIHsKLSAgICBmbGFncyB8PSBDT01NSVRfTk9XIHwgV0FJVDsKLSAgICB3YWl0X29uX2NvbW1pdCA9IDE7Ci0gIH0KKwlsb2NrX2pvdXJuYWwocF9zX3NiKTsKKwlpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKwkJZmxhZ3MgfD0gRkxVU0hfQUxMOworCQlmbHVzaCA9IDE7CisJfQorCWlmIChqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2gpIHsKKwkJZmxhZ3MgfD0gQ09NTUlUX05PVyB8IFdBSVQ7CisJCXdhaXRfb25fY29tbWl0ID0gMTsKKwl9CiAKLSAgLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAotICAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCi0gICovCi0gIGlmICghY2hlY2tfam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgZmxhZ3MpKSB7Ci0gICAgcF9zX3NiLT5zX2RpcnQgPSAxOwotICAgIHdha2VfcXVldWVkX3dyaXRlcnMocF9zX3NiKTsKLSAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHBfc19zYik7Ci0gICAgZ290byBvdXQgOwotICB9CisJLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAorCSAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCisJICovCisJaWYgKCFjaGVja19qb3VybmFsX2VuZCh0aCwgcF9zX3NiLCBuYmxvY2tzLCBmbGFncykpIHsKKwkJcF9zX3NiLT5zX2RpcnQgPSAxOworCQl3YWtlX3F1ZXVlZF93cml0ZXJzKHBfc19zYik7CisJCXJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQocF9zX3NiKTsKKwkJZ290byBvdXQ7CisJfQogCi0gIC8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KLSAgaWYgKGpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoKSB7Ci0gICAgZmx1c2ggPSAxIDsKLSAgfQorCS8qIGNoZWNrX2pvdXJuYWxfZW5kIG1pZ2h0IHNldCB0aGVzZSwgY2hlY2sgYWdhaW4gKi8KKwlpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKwkJZmx1c2ggPSAxOworCX0KIAotICAvKgotICAqKiBqIG11c3Qgd2FpdCBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBsb2cgYmxvY2tzLCBhbmQgdGhlIHJlYWwgYmxvY2tzIGZvcgotICAqKiB0aGlzIHRyYW5zYWN0aW9uCi0gICovCi0gIGlmIChqb3VybmFsLT5qX211c3Rfd2FpdCA+IDApIHsKLSAgICBmbHVzaCA9IDEgOwotICB9Ci0KKwkvKgorCSAqKiBqIG11c3Qgd2FpdCBtZWFucyB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBsb2cgYmxvY2tzLCBhbmQgdGhlIHJlYWwgYmxvY2tzIGZvcgorCSAqKiB0aGlzIHRyYW5zYWN0aW9uCisJICovCisJaWYgKGpvdXJuYWwtPmpfbXVzdF93YWl0ID4gMCkgeworCQlmbHVzaCA9IDE7CisJfQogI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCi0gIC8qIHF1b3RhIG9wcyBtaWdodCBuZWVkIHRvIG5lc3QsIHNldHVwIHRoZSBqb3VybmFsX2luZm8gcG9pbnRlciBmb3IgdGhlbSAqLwotICBjdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aCA7Ci0gIHJlaXNlcmZzX2Rpc2NhcmRfYWxsX3ByZWFsbG9jKHRoKTsgLyogaXQgc2hvdWxkIG5vdCBpbnZvbHZlIG5ldyBibG9ja3MgaW50bwotCQkJCSAgICAgICogdGhlIHRyYW5zYWN0aW9uICovCi0gIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlIDsKKwkvKiBxdW90YSBvcHMgbWlnaHQgbmVlZCB0byBuZXN0LCBzZXR1cCB0aGUgam91cm5hbF9pbmZvIHBvaW50ZXIgZm9yIHRoZW0gKi8KKwljdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aDsKKwlyZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyh0aCk7CS8qIGl0IHNob3VsZCBub3QgaW52b2x2ZSBuZXcgYmxvY2tzIGludG8KKwkJCQkJCSAqIHRoZSB0cmFuc2FjdGlvbiAqLworCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoLT50X2hhbmRsZV9zYXZlOwogI2VuZGlmCi0gIAotICAvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLwotICBkX2JoID0gam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQpIDsKLSAgc2V0X2J1ZmZlcl91cHRvZGF0ZShkX2JoKTsKLSAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopKGRfYmgpLT5iX2RhdGEgOwotICBtZW1zZXQoZF9iaC0+Yl9kYXRhLCAwLCBkX2JoLT5iX3NpemUpIDsKLSAgbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMgKGRfYmgpLCBKT1VSTkFMX0RFU0NfTUFHSUMsIDgpIDsKLSAgc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCkgOwogCi0gIC8qIHNldHVwIGNvbW1pdCBibG9jay4gIERvbid0IHdyaXRlIChrZWVwIGl0IGNsZWFuIHRvbykgdGhpcyBvbmUgdW50aWwgYWZ0ZXIgZXZlcnlvbmUgZWxzZSBpcyB3cml0dGVuICovCi0gIGNfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAotCQkgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKLSAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7Ci0gIG1lbXNldChjX2JoLT5iX2RhdGEsIDAsIGNfYmgtPmJfc2l6ZSkgOwotICBzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCkgOwotICBzZXRfYnVmZmVyX3VwdG9kYXRlKGNfYmgpIDsKKwkvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLworCWRfYmggPQorCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArCisJCQkgICBqb3VybmFsLT5qX3N0YXJ0KTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGRfYmgpOworCWRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKShkX2JoKS0+Yl9kYXRhOworCW1lbXNldChkX2JoLT5iX2RhdGEsIDAsIGRfYmgtPmJfc2l6ZSk7CisJbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMoZF9iaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCk7CisJc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCk7CiAKLSAgLyogaW5pdCB0aGlzIGpvdXJuYWwgbGlzdCAqLwotICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKwkvKiBzZXR1cCBjb21taXQgYmxvY2suICBEb24ndCB3cml0ZSAoa2VlcCBpdCBjbGVhbiB0b28pIHRoaXMgb25lIHVudGlsIGFmdGVyIGV2ZXJ5b25lIGVsc2UgaXMgd3JpdHRlbiAqLworCWNfYmggPSBqb3VybmFsX2dldGJsayhwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCSAgICAgICgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfbGVuICsKKwkJCQkxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpOworCWNvbW1pdCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKiljX2JoLT5iX2RhdGE7CisJbWVtc2V0KGNfYmgtPmJfZGF0YSwgMCwgY19iaC0+Yl9zaXplKTsKKwlzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShjX2JoKTsKIAotICAvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKLSAgICogd2Ugd2FudCB0byBtYWtlIHN1cmUgbm9ib2R5IHRyaWVzIHRvIHJ1biBmbHVzaF9jb21taXRfbGlzdCB1bnRpbAotICAgKiB0aGUgbmV3IHRyYW5zYWN0aW9uIGlzIGZ1bGx5IHNldHVwLCBhbmQgd2UndmUgYWxyZWFkeSBmbHVzaGVkIHRoZQotICAgKiBvcmRlcmVkIGJoIGxpc3QKLSAgICovCi0gIGRvd24oJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkvKiBpbml0IHRoaXMgam91cm5hbCBsaXN0ICovCisJamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CiAKLSAgLyogc2F2ZSB0aGUgdHJhbnNhY3Rpb24gaWQgaW4gY2FzZSB3ZSBuZWVkIHRvIGNvbW1pdCBpdCBsYXRlciAqLwotICBjb21taXRfdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKwkvKiB3ZSBsb2NrIHRoZSBjb21taXQgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGJlY2F1c2UKKwkgKiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgdG8gcnVuIGZsdXNoX2NvbW1pdF9saXN0IHVudGlsCisJICogdGhlIG5ldyB0cmFuc2FjdGlvbiBpcyBmdWxseSBzZXR1cCwgYW5kIHdlJ3ZlIGFscmVhZHkgZmx1c2hlZCB0aGUKKwkgKiBvcmRlcmVkIGJoIGxpc3QKKwkgKi8KKwlkb3duKCZqbC0+al9jb21taXRfbG9jayk7CiAKLSAgYXRvbWljX3NldCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lLCAwKSA7Ci0gIGpsLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7Ci0gIGpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA7Ci0gIGpsLT5qX2NvbW1pdF9iaCA9IGNfYmggOwotICBqbC0+al9zdGFydCA9IGpvdXJuYWwtPmpfc3RhcnQgOwotICBqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbiA7Ci0gIGF0b21pY19zZXQoJmpsLT5qX25vbnplcm9sZW4sIGpvdXJuYWwtPmpfbGVuKSA7Ci0gIGF0b21pY19zZXQoJmpsLT5qX2NvbW1pdF9sZWZ0LCBqb3VybmFsLT5qX2xlbiArIDIpOwotICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKKwkvKiBzYXZlIHRoZSB0cmFuc2FjdGlvbiBpZCBpbiBjYXNlIHdlIG5lZWQgdG8gY29tbWl0IGl0IGxhdGVyICovCisJY29tbWl0X3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CiAKLSAgLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KLSAgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCi0gICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jawotICAqLwotICB0cmFuc19oYWxmID0gam91cm5hbF90cmFuc19oYWxmKHBfc19zYi0+c19ibG9ja3NpemUpOwotICBmb3IgKGkgPSAwLCBjbiA9IGpvdXJuYWwtPmpfZmlyc3QgOyBjbiA7IGNuID0gY24tPm5leHQsIGkrKykgewotICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7Ci0gICAgICBqbF9jbiA9IGdldF9jbm9kZShwX3Nfc2IpIDsKLSAgICAgIGlmICghamxfY24pIHsKLSAgICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNjc2LCBnZXRfY25vZGUgcmV0dXJuZWQgTlVMTFxuIikgOwotICAgICAgfQotICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICBqbC0+al9yZWFsYmxvY2sgPSBqbF9jbiA7Ci0gICAgICB9Ci0gICAgICBqbF9jbi0+cHJldiA9IGxhc3RfY24gOwotICAgICAgamxfY24tPm5leHQgPSBOVUxMIDsKLSAgICAgIGlmIChsYXN0X2NuKSB7Ci0gICAgICAgIGxhc3RfY24tPm5leHQgPSBqbF9jbiA7Ci0gICAgICB9Ci0gICAgICBsYXN0X2NuID0gamxfY24gOwotICAgICAgLyogbWFrZSBzdXJlIHRoZSBibG9jayB3ZSBhcmUgdHJ5aW5nIHRvIGxvZyBpcyBub3QgYSBibG9jayAKLSAgICAgICAgIG9mIGpvdXJuYWwgb3IgcmVzZXJ2ZWQgYXJlYSAqLworCWF0b21pY19zZXQoJmpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSwgMCk7CisJamwtPmpfdHJhbnNfaWQgPSBqb3VybmFsLT5qX3RyYW5zX2lkOworCWpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZTsKKwlqbC0+al9jb21taXRfYmggPSBjX2JoOworCWpsLT5qX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydDsKKwlqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbjsKKwlhdG9taWNfc2V0KCZqbC0+al9ub256ZXJvbGVuLCBqb3VybmFsLT5qX2xlbik7CisJYXRvbWljX3NldCgmamwtPmpfY29tbWl0X2xlZnQsIGpvdXJuYWwtPmpfbGVuICsgMik7CisJamwtPmpfcmVhbGJsb2NrID0gTlVMTDsKIAotICAgICAgaWYgKGlzX2Jsb2NrX2luX2xvZ19vcl9yZXNlcnZlZF9hcmVhKHBfc19zYiwgY24tPmJoLT5iX2Jsb2NrbnIpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImpvdXJuYWwtMjMzMjogVHJ5aW5nIHRvIGxvZyBibG9jayAlbHUsIHdoaWNoIGlzIGEgbG9nIGJsb2NrXG4iLCBjbi0+YmgtPmJfYmxvY2tucikgOwotICAgICAgfQotICAgICAgamxfY24tPmJsb2NrbnIgPSBjbi0+YmgtPmJfYmxvY2tuciA7IAotICAgICAgamxfY24tPnN0YXRlID0gMCA7Ci0gICAgICBqbF9jbi0+c2IgPSBwX3Nfc2I7Ci0gICAgICBqbF9jbi0+YmggPSBjbi0+YmggOwotICAgICAgamxfY24tPmpsaXN0ID0gamw7Ci0gICAgICBpbnNlcnRfam91cm5hbF9oYXNoKGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBqbF9jbikgOwotICAgICAgaWYgKGkgPCB0cmFuc19oYWxmKSB7Ci0JZGVzYy0+al9yZWFsYmxvY2tbaV0gPSBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucikgOwotICAgICAgfSBlbHNlIHsKLQljb21taXQtPmpfcmVhbGJsb2NrW2kgLSB0cmFuc19oYWxmXSA9IGNwdV90b19sZTMyKGNuLT5iaC0+Yl9ibG9ja25yKSA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGktLSA7Ci0gICAgfQotICB9Ci0gIHNldF9kZXNjX3RyYW5zX2xlbihkZXNjLCBqb3VybmFsLT5qX2xlbikgOwotICBzZXRfZGVzY19tb3VudF9pZChkZXNjLCBqb3VybmFsLT5qX21vdW50X2lkKSA7Ci0gIHNldF9kZXNjX3RyYW5zX2lkKGRlc2MsIGpvdXJuYWwtPmpfdHJhbnNfaWQpIDsKLSAgc2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0LCBqb3VybmFsLT5qX2xlbik7CisJLyogVGhlIEVOVElSRSBGT1IgTE9PUCBNVVNUIG5vdCBjYXVzZSBzY2hlZHVsZSB0byBvY2N1ci4KKwkgKiogIGZvciBlYWNoIHJlYWwgYmxvY2ssIGFkZCBpdCB0byB0aGUgam91cm5hbCBsaXN0IGhhc2gsCisJICoqIGNvcHkgaW50byByZWFsIGJsb2NrIGluZGV4IGFycmF5IGluIHRoZSBjb21taXQgb3IgZGVzYyBibG9jaworCSAqLworCXRyYW5zX2hhbGYgPSBqb3VybmFsX3RyYW5zX2hhbGYocF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJZm9yIChpID0gMCwgY24gPSBqb3VybmFsLT5qX2ZpcnN0OyBjbjsgY24gPSBjbi0+bmV4dCwgaSsrKSB7CisJCWlmIChidWZmZXJfam91cm5hbGVkKGNuLT5iaCkpIHsKKwkJCWpsX2NuID0gZ2V0X2Nub2RlKHBfc19zYik7CisJCQlpZiAoIWpsX2NuKSB7CisJCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCQkgICAgICAgImpvdXJuYWwtMTY3NiwgZ2V0X2Nub2RlIHJldHVybmVkIE5VTExcbiIpOworCQkJfQorCQkJaWYgKGkgPT0gMCkgeworCQkJCWpsLT5qX3JlYWxibG9jayA9IGpsX2NuOworCQkJfQorCQkJamxfY24tPnByZXYgPSBsYXN0X2NuOworCQkJamxfY24tPm5leHQgPSBOVUxMOworCQkJaWYgKGxhc3RfY24pIHsKKwkJCQlsYXN0X2NuLT5uZXh0ID0gamxfY247CisJCQl9CisJCQlsYXN0X2NuID0gamxfY247CisJCQkvKiBtYWtlIHN1cmUgdGhlIGJsb2NrIHdlIGFyZSB0cnlpbmcgdG8gbG9nIGlzIG5vdCBhIGJsb2NrIAorCQkJICAgb2Ygam91cm5hbCBvciByZXNlcnZlZCBhcmVhICovCiAKLSAgLyogc3BlY2lhbCBjaGVjayBpbiBjYXNlIGFsbCBidWZmZXJzIGluIHRoZSBqb3VybmFsIHdlcmUgbWFya2VkIGZvciBub3QgbG9nZ2luZyAqLwotICBpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgewotICAgIEJVRygpOwotICB9CisJCQlpZiAoaXNfYmxvY2tfaW5fbG9nX29yX3Jlc2VydmVkX2FyZWEKKwkJCSAgICAocF9zX3NiLCBjbi0+YmgtPmJfYmxvY2tucikpIHsKKwkJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJCSAgICAgICAiam91cm5hbC0yMzMyOiBUcnlpbmcgdG8gbG9nIGJsb2NrICVsdSwgd2hpY2ggaXMgYSBsb2cgYmxvY2tcbiIsCisJCQkJCSAgICAgICBjbi0+YmgtPmJfYmxvY2tucik7CisJCQl9CisJCQlqbF9jbi0+YmxvY2tuciA9IGNuLT5iaC0+Yl9ibG9ja25yOworCQkJamxfY24tPnN0YXRlID0gMDsKKwkJCWpsX2NuLT5zYiA9IHBfc19zYjsKKwkJCWpsX2NuLT5iaCA9IGNuLT5iaDsKKwkJCWpsX2NuLT5qbGlzdCA9IGpsOworCQkJaW5zZXJ0X2pvdXJuYWxfaGFzaChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgamxfY24pOworCQkJaWYgKGkgPCB0cmFuc19oYWxmKSB7CisJCQkJZGVzYy0+al9yZWFsYmxvY2tbaV0gPQorCQkJCSAgICBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucik7CisJCQl9IGVsc2UgeworCQkJCWNvbW1pdC0+al9yZWFsYmxvY2tbaSAtIHRyYW5zX2hhbGZdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIoY24tPmJoLT5iX2Jsb2NrbnIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaS0tOworCQl9CisJfQorCXNldF9kZXNjX3RyYW5zX2xlbihkZXNjLCBqb3VybmFsLT5qX2xlbik7CisJc2V0X2Rlc2NfbW91bnRfaWQoZGVzYywgam91cm5hbC0+al9tb3VudF9pZCk7CisJc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCk7CisJc2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0LCBqb3VybmFsLT5qX2xlbik7CiAKLSAgLyogd2UncmUgYWJvdXQgdG8gZGlydHkgYWxsIHRoZSBsb2cgYmxvY2tzLCBtYXJrIHRoZSBkZXNjcmlwdGlvbiBibG9jawotICAgKiBkaXJ0eSBub3cgdG9vLiAgRG9uJ3QgbWFyayB0aGUgY29tbWl0IGJsb2NrIGRpcnR5IHVudGlsIGFsbCB0aGUKLSAgICogb3RoZXJzIGFyZSBvbiBkaXNrCi0gICAqLwotICBtYXJrX2J1ZmZlcl9kaXJ0eShkX2JoKTsKKwkvKiBzcGVjaWFsIGNoZWNrIGluIGNhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgd2VyZSBtYXJrZWQgZm9yIG5vdCBsb2dnaW5nICovCisJaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKwkJQlVHKCk7CisJfQogCi0gIC8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KLSAgY3VyX3dyaXRlX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydCA7Ci0gIGNuID0gam91cm5hbC0+al9maXJzdCA7Ci0gIGppbmRleCA9IDEgOyAvKiBzdGFydCBhdCBvbmUgc28gd2UgZG9uJ3QgZ2V0IHRoZSBkZXNjIGFnYWluICovCi0gIHdoaWxlKGNuKSB7Ci0gICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfbmV3IChjbi0+YmgpOwotICAgIC8qIGNvcHkgYWxsIHRoZSByZWFsIGJsb2NrcyBpbnRvIGxvZyBhcmVhLiAgZGlydHkgbG9nIGJsb2NrcyAqLwotICAgIGlmIChidWZmZXJfam91cm5hbGVkIChjbi0+YmgpKSB7Ci0gICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcF9iaCA7Ci0gICAgICBjaGFyICphZGRyOwotICAgICAgc3RydWN0IHBhZ2UgKnBhZ2U7Ci0gICAgICB0bXBfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAotCQkgICAgICAgKChjdXJfd3JpdGVfc3RhcnQgKyBqaW5kZXgpICUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOwotICAgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZSh0bXBfYmgpOwotICAgICAgcGFnZSA9IGNuLT5iaC0+Yl9wYWdlOwotICAgICAgYWRkciA9IGttYXAocGFnZSk7Ci0gICAgICBtZW1jcHkodG1wX2JoLT5iX2RhdGEsIGFkZHIgKyBvZmZzZXRfaW5fcGFnZShjbi0+YmgtPmJfZGF0YSksCi0gICAgICAgICAgICAgY24tPmJoLT5iX3NpemUpOwotICAgICAga3VubWFwKHBhZ2UpOwotICAgICAgbWFya19idWZmZXJfZGlydHkodG1wX2JoKTsKLSAgICAgIGppbmRleCsrIDsKLSAgICAgIHNldF9idWZmZXJfam91cm5hbF9kaXJ0eSAoY24tPmJoKTsKLSAgICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsZWQgKGNuLT5iaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEpEaXJ0eSBjbGVhcmVkIHNvbWV0aW1lIGR1cmluZyB0cmFuc2FjdGlvbi4gIGRvbid0IGxvZyB0aGlzIG9uZSAqLwotICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpIDsKLSAgICAgIGJyZWxzZShjbi0+YmgpIDsKLSAgICB9Ci0gICAgbmV4dCA9IGNuLT5uZXh0IDsKLSAgICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKLSAgICBjbiA9IG5leHQgOwotICAgIGNvbmRfcmVzY2hlZCgpOwotICB9CisJLyogd2UncmUgYWJvdXQgdG8gZGlydHkgYWxsIHRoZSBsb2cgYmxvY2tzLCBtYXJrIHRoZSBkZXNjcmlwdGlvbiBibG9jaworCSAqIGRpcnR5IG5vdyB0b28uICBEb24ndCBtYXJrIHRoZSBjb21taXQgYmxvY2sgZGlydHkgdW50aWwgYWxsIHRoZQorCSAqIG90aGVycyBhcmUgb24gZGlzaworCSAqLworCW1hcmtfYnVmZmVyX2RpcnR5KGRfYmgpOwogCi0gIC8qIHdlIGFyZSBkb25lICB3aXRoIGJvdGggdGhlIGNfYmggYW5kIGRfYmgsIGJ1dAotICAqKiBjX2JoIG11c3QgYmUgd3JpdHRlbiBhZnRlciBhbGwgb3RoZXIgY29tbWl0IGJsb2NrcywKLSAgKiogc28gd2UgZGlydHkvcmVsc2UgY19iaCBpbiBmbHVzaF9jb21taXRfbGlzdCwgd2l0aCBjb21taXRfbGVmdCA8PSAxLgotICAqLworCS8qIGZpcnN0IGRhdGEgYmxvY2sgaXMgal9zdGFydCArIDEsIHNvIGFkZCBvbmUgdG8gY3VyX3dyaXRlX3N0YXJ0IHdoZXJldmVyIHlvdSB1c2UgaXQgKi8KKwljdXJfd3JpdGVfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0OworCWNuID0gam91cm5hbC0+al9maXJzdDsKKwlqaW5kZXggPSAxOwkJLyogc3RhcnQgYXQgb25lIHNvIHdlIGRvbid0IGdldCB0aGUgZGVzYyBhZ2FpbiAqLworCXdoaWxlIChjbikgeworCQljbGVhcl9idWZmZXJfam91cm5hbF9uZXcoY24tPmJoKTsKKwkJLyogY29weSBhbGwgdGhlIHJlYWwgYmxvY2tzIGludG8gbG9nIGFyZWEuICBkaXJ0eSBsb2cgYmxvY2tzICovCisJCWlmIChidWZmZXJfam91cm5hbGVkKGNuLT5iaCkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdG1wX2JoOworCQkJY2hhciAqYWRkcjsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCQkJdG1wX2JoID0KKwkJCSAgICBqb3VybmFsX2dldGJsayhwX3Nfc2IsCisJCQkJCSAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJCQkJICAgKChjdXJfd3JpdGVfc3RhcnQgKworCQkJCQkgICAgIGppbmRleCkgJQorCQkJCQkgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKHRtcF9iaCk7CisJCQlwYWdlID0gY24tPmJoLT5iX3BhZ2U7CisJCQlhZGRyID0ga21hcChwYWdlKTsKKwkJCW1lbWNweSh0bXBfYmgtPmJfZGF0YSwKKwkJCSAgICAgICBhZGRyICsgb2Zmc2V0X2luX3BhZ2UoY24tPmJoLT5iX2RhdGEpLAorCQkJICAgICAgIGNuLT5iaC0+Yl9zaXplKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KHRtcF9iaCk7CisJCQlqaW5kZXgrKzsKKwkJCXNldF9idWZmZXJfam91cm5hbF9kaXJ0eShjbi0+YmgpOworCQkJY2xlYXJfYnVmZmVyX2pvdXJuYWxlZChjbi0+YmgpOworCQl9IGVsc2UgeworCQkJLyogSkRpcnR5IGNsZWFyZWQgc29tZXRpbWUgZHVyaW5nIHRyYW5zYWN0aW9uLiAgZG9uJ3QgbG9nIHRoaXMgb25lICovCisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwKKwkJCQkJICJqb3VybmFsLTIwNDg6IGRvX2pvdXJuYWxfZW5kOiBCQUQsIGJ1ZmZlciBpbiBqb3VybmFsIGhhc2gsIGJ1dCBub3QgSkRpcnR5ISIpOworCQkJYnJlbHNlKGNuLT5iaCk7CisJCX0KKwkJbmV4dCA9IGNuLT5uZXh0OworCQlmcmVlX2Nub2RlKHBfc19zYiwgY24pOworCQljbiA9IG5leHQ7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KIAotICBqb3VybmFsLT5qX2N1cnJlbnRfamwgPSBhbGxvY19qb3VybmFsX2xpc3QocF9zX3NiKTsKKwkvKiB3ZSBhcmUgZG9uZSAgd2l0aCBib3RoIHRoZSBjX2JoIGFuZCBkX2JoLCBidXQKKwkgKiogY19iaCBtdXN0IGJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIG90aGVyIGNvbW1pdCBibG9ja3MsCisJICoqIHNvIHdlIGRpcnR5L3JlbHNlIGNfYmggaW4gZmx1c2hfY29tbWl0X2xpc3QsIHdpdGggY29tbWl0X2xlZnQgPD0gMS4KKwkgKi8KIAotICAvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCi0gIGxpc3RfYWRkX3RhaWwoJmpsLT5qX2xpc3QsICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCk7Ci0gIGxpc3RfYWRkX3RhaWwoJmpsLT5qX3dvcmtpbmdfbGlzdCwgJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKLSAgam91cm5hbC0+al9udW1fd29ya19saXN0cysrOworCWpvdXJuYWwtPmpfY3VycmVudF9qbCA9IGFsbG9jX2pvdXJuYWxfbGlzdChwX3Nfc2IpOwogCi0gIC8qIHJlc2V0IGpvdXJuYWwgdmFsdWVzIGZvciB0aGUgbmV4dCB0cmFuc2FjdGlvbiAqLwotICBvbGRfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKLSAgam91cm5hbC0+al9zdGFydCA9IChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKLSAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOwotICBqb3VybmFsLT5qX2Jjb3VudCA9IDAgOwotICBqb3VybmFsLT5qX2xhc3QgPSBOVUxMIDsKLSAgam91cm5hbC0+al9maXJzdCA9IE5VTEwgOwotICBqb3VybmFsLT5qX2xlbiA9IDAgOwotICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSAwIDsKLSAgam91cm5hbC0+al90cmFuc19pZCsrIDsKLSAgam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKLSAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAwIDsKLSAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKLSAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAwIDsKLSAgam91cm5hbC0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMCA7Ci0gIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOyAKKwkvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmamwtPmpfbGlzdCwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZqbC0+al93b3JraW5nX2xpc3QsICZqb3VybmFsLT5qX3dvcmtpbmdfbGlzdCk7CisJam91cm5hbC0+al9udW1fd29ya19saXN0cysrOwogCi0gIC8vIG1ha2Ugc3VyZSByZWlzZXJmc19hZGRfamggc2VlcyB0aGUgbmV3IGN1cnJlbnRfamwgYmVmb3JlIHdlCi0gIC8vIHdyaXRlIG91dCB0aGUgdGFpbHMKLSAgc21wX21iKCk7CisJLyogcmVzZXQgam91cm5hbCB2YWx1ZXMgZm9yIHRoZSBuZXh0IHRyYW5zYWN0aW9uICovCisJb2xkX3N0YXJ0ID0gam91cm5hbC0+al9zdGFydDsKKwlqb3VybmFsLT5qX3N0YXJ0ID0KKwkgICAgKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX2xlbiArCisJICAgICAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKKwlhdG9taWNfc2V0KCYoam91cm5hbC0+al93Y291bnQpLCAwKTsKKwlqb3VybmFsLT5qX2Jjb3VudCA9IDA7CisJam91cm5hbC0+al9sYXN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gTlVMTDsKKwlqb3VybmFsLT5qX2xlbiA9IDA7CisJam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID0gMDsKKwlqb3VybmFsLT5qX3RyYW5zX2lkKys7CisJam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKwlqb3VybmFsLT5qX211c3Rfd2FpdCA9IDA7CisJam91cm5hbC0+al9sZW5fYWxsb2MgPSAwOworCWpvdXJuYWwtPmpfbmV4dF9mdWxsX2ZsdXNoID0gMDsKKwlqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAwOworCWluaXRfam91cm5hbF9oYXNoKHBfc19zYik7CiAKLSAgLyogdGFpbCBjb252ZXJzaW9uIHRhcmdldHMgaGF2ZSB0byBoaXQgdGhlIGRpc2sgYmVmb3JlIHdlIGVuZCB0aGUKLSAgICogdHJhbnNhY3Rpb24uICBPdGhlcndpc2UgYSBsYXRlciB0cmFuc2FjdGlvbiBtaWdodCByZXBhY2sgdGhlIHRhaWwKLSAgICogYmVmb3JlIHRoaXMgdHJhbnNhY3Rpb24gY29tbWl0cywgbGVhdmluZyB0aGUgZGF0YSBibG9jayB1bmZsdXNoZWQgYW5kCi0gICAqIGNsZWFuLCBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIGxhdGVyIHRyYW5zYWN0aW9uIGNvbW1pdHMsIHRoZSBkYXRhIGJsb2NrCi0gICAqIGlzIGxvc3QuCi0gICAqLwotICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpIHsKLSAgICAgIHVubG9ja19rZXJuZWwoKTsKLSAgICAgIHdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCi0JCQkgICAgam91cm5hbCwgamwsICZqbC0+al90YWlsX2JoX2xpc3QpOwotICAgICAgbG9ja19rZXJuZWwoKTsKLSAgfQotICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpCi0gICAgICBCVUcoKTsKLSAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKwkvLyBtYWtlIHN1cmUgcmVpc2VyZnNfYWRkX2poIHNlZXMgdGhlIG5ldyBjdXJyZW50X2psIGJlZm9yZSB3ZQorCS8vIHdyaXRlIG91dCB0aGUgdGFpbHMKKwlzbXBfbWIoKTsKIAotICAvKiBob25vciB0aGUgZmx1c2ggd2lzaGVzIGZyb20gdGhlIGNhbGxlciwgc2ltcGxlIGNvbW1pdHMgY2FuCi0gICoqIGJlIGRvbmUgb3V0c2lkZSB0aGUgam91cm5hbCBsb2NrLCB0aGV5IGFyZSBkb25lIGJlbG93Ci0gICoqCi0gICoqIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBjb21taXQgbGlzdCByaWdodCBub3csIHdlIHB1dCBpdCBpbnRvCi0gICoqIHRoZSB3b3JrIHF1ZXVlIHNvIHRoZSBwZW9wbGUgd2FpdGluZyBvbiB0aGUgYXN5bmMgcHJvZ3Jlc3Mgd29yawotICAqKiBxdWV1ZSBkb24ndCB3YWl0IGZvciB0aGlzIHByb2MgdG8gZmx1c2ggam91cm5hbCBsaXN0cyBhbmQgc3VjaC4KLSAgKi8KLSAgaWYgKGZsdXNoKSB7Ci0gICAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSkgOwotICAgIGZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIGpsLCAxKSA7Ci0gIH0gZWxzZSBpZiAoIShqbC0+al9zdGF0ZSAmIExJU1RfQ09NTUlUX1BFTkRJTkcpKQotICAgIHF1ZXVlX2RlbGF5ZWRfd29yayhjb21taXRfd3EsICZqb3VybmFsLT5qX3dvcmssIEhaLzEwKTsKKwkvKiB0YWlsIGNvbnZlcnNpb24gdGFyZ2V0cyBoYXZlIHRvIGhpdCB0aGUgZGlzayBiZWZvcmUgd2UgZW5kIHRoZQorCSAqIHRyYW5zYWN0aW9uLiAgT3RoZXJ3aXNlIGEgbGF0ZXIgdHJhbnNhY3Rpb24gbWlnaHQgcmVwYWNrIHRoZSB0YWlsCisJICogYmVmb3JlIHRoaXMgdHJhbnNhY3Rpb24gY29tbWl0cywgbGVhdmluZyB0aGUgZGF0YSBibG9jayB1bmZsdXNoZWQgYW5kCisJICogY2xlYW4sIGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgbGF0ZXIgdHJhbnNhY3Rpb24gY29tbWl0cywgdGhlIGRhdGEgYmxvY2sKKwkgKiBpcyBsb3N0LgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmamwtPmpfdGFpbF9iaF9saXN0KSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdyaXRlX29yZGVyZWRfYnVmZmVycygmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2ssCisJCQkJICAgICAgam91cm5hbCwgamwsICZqbC0+al90YWlsX2JoX2xpc3QpOworCQlsb2NrX2tlcm5lbCgpOworCX0KKwlpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3RhaWxfYmhfbGlzdCkpCisJCUJVRygpOworCXVwKCZqbC0+al9jb21taXRfbG9jayk7CiAKKwkvKiBob25vciB0aGUgZmx1c2ggd2lzaGVzIGZyb20gdGhlIGNhbGxlciwgc2ltcGxlIGNvbW1pdHMgY2FuCisJICoqIGJlIGRvbmUgb3V0c2lkZSB0aGUgam91cm5hbCBsb2NrLCB0aGV5IGFyZSBkb25lIGJlbG93CisJICoqCisJICoqIGlmIHdlIGRvbid0IGZsdXNoIHRoZSBjb21taXQgbGlzdCByaWdodCBub3csIHdlIHB1dCBpdCBpbnRvCisJICoqIHRoZSB3b3JrIHF1ZXVlIHNvIHRoZSBwZW9wbGUgd2FpdGluZyBvbiB0aGUgYXN5bmMgcHJvZ3Jlc3Mgd29yaworCSAqKiBxdWV1ZSBkb24ndCB3YWl0IGZvciB0aGlzIHByb2MgdG8gZmx1c2ggam91cm5hbCBsaXN0cyBhbmQgc3VjaC4KKwkgKi8KKwlpZiAoZmx1c2gpIHsKKwkJZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSk7CisJCWZsdXNoX2pvdXJuYWxfbGlzdChwX3Nfc2IsIGpsLCAxKTsKKwl9IGVsc2UgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0NPTU1JVF9QRU5ESU5HKSkKKwkJcXVldWVfZGVsYXllZF93b3JrKGNvbW1pdF93cSwgJmpvdXJuYWwtPmpfd29yaywgSFogLyAxMCk7CiAKLSAgLyogaWYgdGhlIG5leHQgdHJhbnNhY3Rpb24gaGFzIGFueSBjaGFuY2Ugb2Ygd3JhcHBpbmcsIGZsdXNoIAotICAqKiB0cmFuc2FjdGlvbnMgdGhhdCBtaWdodCBnZXQgb3ZlcndyaXR0ZW4uICBJZiBhbnkgam91cm5hbCBsaXN0cyBhcmUgdmVyeSAKLSAgKiogb2xkIGZsdXNoIHRoZW0gYXMgd2VsbC4gIAotICAqLwotZmlyc3Rfamw6Ci0gIGxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7Ci0gICAgdGVtcF9qbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7Ci0gICAgaWYgKGpvdXJuYWwtPmpfc3RhcnQgPD0gdGVtcF9qbC0+al9zdGFydCkgewotICAgICAgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA+PQotICAgICAgICAgIHRlbXBfamwtPmpfc3RhcnQpCi0gICAgICB7Ci0JZmx1c2hfdXNlZF9qb3VybmFsX2xpc3RzKHBfc19zYiwgdGVtcF9qbCk7Ci0JZ290byBmaXJzdF9qbDsKLSAgICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKwotICAgICAgICAgICAgICAgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8Ci0JCSAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKQotICAgICAgewotICAgICAgICAgIC8qIGlmIHdlIGRvbid0IGNyb3NzIGludG8gdGhlIG5leHQgdHJhbnNhY3Rpb24gYW5kIHdlIGRvbid0Ci0JICAgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucwotCSAgICogYnJlYWsgbm93Ci0JICAgKi8KLQkgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKwotICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgPgotCQlTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpCi0gICAgewotICAgICAgaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQotICAgICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSA+PSB0ZW1wX2psLT5qX3N0YXJ0KQotICAgICAgewotCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOwotCWdvdG8gZmlyc3Rfamw7Ci0gICAgICB9IGVsc2UgewotCSAgLyogd2UgZG9uJ3Qgb3ZlcmxhcCBhbnl0aGluZyBmcm9tIG91dCBzdGFydCB0byB0aGUgZW5kIG9mIHRoZQotCSAgICogbG9nLCBhbmQgb3VyIHdyYXBwZWQgcG9ydGlvbiBkb2Vzbid0IG92ZXJsYXAgYW55dGhpbmcgYXQKLQkgICAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCi0JICAgKi8KLQkgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBmbHVzaF9vbGRfam91cm5hbF9saXN0cyhwX3Nfc2IpOworCS8qIGlmIHRoZSBuZXh0IHRyYW5zYWN0aW9uIGhhcyBhbnkgY2hhbmNlIG9mIHdyYXBwaW5nLCBmbHVzaCAKKwkgKiogdHJhbnNhY3Rpb25zIHRoYXQgbWlnaHQgZ2V0IG92ZXJ3cml0dGVuLiAgSWYgYW55IGpvdXJuYWwgbGlzdHMgYXJlIHZlcnkgCisJICoqIG9sZCBmbHVzaCB0aGVtIGFzIHdlbGwuICAKKwkgKi8KKyAgICAgIGZpcnN0X2psOgorCWxpc3RfZm9yX2VhY2hfc2FmZShlbnRyeSwgc2FmZSwgJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJCXRlbXBfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCQlpZiAoam91cm5hbC0+al9zdGFydCA8PSB0ZW1wX2psLT5qX3N0YXJ0KSB7CisJCQlpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID49CisJCQkgICAgdGVtcF9qbC0+al9zdGFydCkgeworCQkJCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCQkJCWdvdG8gZmlyc3Rfamw7CisJCQl9IGVsc2UgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsKKwkJCQkgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA8CisJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSB7CisJCQkJLyogaWYgd2UgZG9uJ3QgY3Jvc3MgaW50byB0aGUgbmV4dCB0cmFuc2FjdGlvbiBhbmQgd2UgZG9uJ3QKKwkJCQkgKiB3cmFwLCB0aGVyZSBpcyBubyB3YXkgd2UgY2FuIG92ZXJsYXAgYW55IGxhdGVyIHRyYW5zYWN0aW9ucworCQkJCSAqIGJyZWFrIG5vdworCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKChqb3VybmFsLT5qX3N0YXJ0ICsKKwkJCSAgICBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID4KKwkJCSAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkgeworCQkJaWYgKCgoam91cm5hbC0+al9zdGFydCArIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICsgMSkgJQorCQkJICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpID49CisJCQkgICAgdGVtcF9qbC0+al9zdGFydCkgeworCQkJCWZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhwX3Nfc2IsIHRlbXBfamwpOworCQkJCWdvdG8gZmlyc3Rfamw7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGRvbid0IG92ZXJsYXAgYW55dGhpbmcgZnJvbSBvdXQgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUKKwkJCQkgKiBsb2csIGFuZCBvdXIgd3JhcHBlZCBwb3J0aW9uIGRvZXNuJ3Qgb3ZlcmxhcCBhbnl0aGluZyBhdAorCQkJCSAqIHRoZSBzdGFydCBvZiB0aGUgbG9nLiAgV2UgY2FuIGJyZWFrCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmx1c2hfb2xkX2pvdXJuYWxfbGlzdHMocF9zX3NiKTsKIAotICBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqb3VybmFsLT5qX2N1cnJlbnRfamwpIDsKKwlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXAgPQorCSAgICBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqb3VybmFsLT5qX2N1cnJlbnRfamwpOwogCi0gIGlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKLSAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpIDsKLSAgfQorCWlmICghKGpvdXJuYWwtPmpfY3VycmVudF9qbC0+al9saXN0X2JpdG1hcCkpIHsKKwkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJICAgICAgICJqb3VybmFsLTE5OTY6IGRvX2pvdXJuYWxfZW5kLCBjb3VsZCBub3QgZ2V0IGEgbGlzdCBiaXRtYXBcbiIpOworCX0KIAotICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKLSAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7Ci0gIC8qIHdha2UgdXAgYW55IGJvZHkgd2FpdGluZyB0byBqb2luLiAqLwotICBjbGVhcl9iaXQoSl9XUklURVJTX1FVRVVFRCwgJmpvdXJuYWwtPmpfc3RhdGUpOwotICB3YWtlX3VwKCYoam91cm5hbC0+al9qb2luX3dhaXQpKSA7CisJYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAwKTsKKwl1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCS8qIHdha2UgdXAgYW55IGJvZHkgd2FpdGluZyB0byBqb2luLiAqLworCWNsZWFyX2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisJd2FrZV91cCgmKGpvdXJuYWwtPmpfam9pbl93YWl0KSk7CiAKLSAgaWYgKCFmbHVzaCAmJiB3YWl0X29uX2NvbW1pdCAmJgotICAgICAgam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHBfc19zYiwgY29tbWl0X3RyYW5zX2lkKSkgewotCSAgZmx1c2hfY29tbWl0X2xpc3QocF9zX3NiLCBqbCwgMSkgOwotICB9Ci1vdXQ6Ci0gIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbCBlbmQyIik7CisJaWYgKCFmbHVzaCAmJiB3YWl0X29uX2NvbW1pdCAmJgorCSAgICBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCBjb21taXRfdHJhbnNfaWQpKSB7CisJCWZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpOworCX0KKyAgICAgIG91dDoKKwlyZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kMiIpOwogCi0gIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7Ci0gIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLSAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcwotICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KLSAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CisJbWVtc2V0KHRoLCAwLCBzaXplb2YoKnRoKSk7CisJLyogUmUtc2V0IHRoLT50X3N1cGVyLCBzbyB3ZSBjYW4gcHJvcGVybHkga2VlcCB0cmFjayBvZiBob3cgbWFueQorCSAqIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb25zIHRoZXJlIGFyZS4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIGlmIHRoaXMKKwkgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KKwl0aC0+dF9zdXBlciA9IHBfc19zYjsKIAotICByZXR1cm4gam91cm5hbC0+al9lcnJubzsKKwlyZXR1cm4gam91cm5hbC0+al9lcnJubzsKIH0KIAotc3RhdGljIHZvaWQKLV9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9oYXJkIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIHZvaWQgX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHNiKTsKLSAgICBpZiAodGVzdF9iaXQgKEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQotICAgICAgICByZXR1cm47CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHNiKTsKKwlpZiAodGVzdF9iaXQoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSkpCisJCXJldHVybjsKIAotICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogQWJvcnRpbmcgam91cm5hbCBmb3IgZmlsZXN5c3RlbSBvbiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpKTsKKwlwcmludGsoS0VSTl9DUklUICJSRUlTRVJGUzogQWJvcnRpbmcgam91cm5hbCBmb3IgZmlsZXN5c3RlbSBvbiAlc1xuIiwKKwkgICAgICAgcmVpc2VyZnNfYmRldm5hbWUoc2IpKTsKIAotICAgIHNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKLSAgICBzZXRfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJc2V0X2JpdChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGR1bXBfc3RhY2soKTsKKwlkdW1wX3N0YWNrKCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQKLV9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9zb2Z0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCitzdGF0aWMgdm9pZCBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7Ci0gICAgaWYgKHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKSkKLSAgICAgICAgcmV0dXJuOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTChzYik7CisJaWYgKHRlc3RfYml0KEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorCQlyZXR1cm47CiAKLSAgICBpZiAoIWpvdXJuYWwtPmpfZXJybm8pCi0gICAgICAgIGpvdXJuYWwtPmpfZXJybm8gPSBlcnJubzsKKwlpZiAoIWpvdXJuYWwtPmpfZXJybm8pCisJCWpvdXJuYWwtPmpfZXJybm8gPSBlcnJubzsKIAotICAgIF9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9oYXJkIChzYik7CisJX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X2hhcmQoc2IpOwogfQogCi12b2lkCi1yZWlzZXJmc19qb3VybmFsX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCit2b2lkIHJlaXNlcmZzX2pvdXJuYWxfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKQogewotICAgIHJldHVybiBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfc29mdCAoc2IsIGVycm5vKTsKKwlyZXR1cm4gX19yZWlzZXJmc19qb3VybmFsX2Fib3J0X3NvZnQoc2IsIGVycm5vKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMgYi9mcy9yZWlzZXJmcy9sYmFsYW5jZS5jCmluZGV4IDI0MDY2MDguLjI1MzNjMWYgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMKKysrIGIvZnMvcmVpc2VyZnMvbGJhbGFuY2UuYwpAQCAtMjEsNjQ4ICsyMSw3MDkgQEAKICAgIGxlYWZfcGFzdGVfZW50cmllcwogICAgKi8KIAotCiAvKiBjb3B5IGNvcHlfY291bnQgZW50cmllcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgaXRlbSB0byBkZXN0IGJ1ZmZlciAoY3JlYXRpbmcgbmV3IGl0ZW0gaWYgbmVlZGVkKSAqLwotc3RhdGljIHZvaWQgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzb3VyY2UsIAotCQkJCSAgIGludCBsYXN0X2ZpcnN0LCBpbnQgaXRlbV9udW0sIGludCBmcm9tLCBpbnQgY29weV9jb3VudCkKK3N0YXRpYyB2b2lkIGxlYWZfY29weV9kaXJfZW50cmllcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmRlc3RfYmksCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNvdXJjZSwgaW50IGxhc3RfZmlyc3QsCisJCQkJICBpbnQgaXRlbV9udW0sIGludCBmcm9tLCBpbnQgY29weV9jb3VudCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7Ci0gICAgaW50IGl0ZW1fbnVtX2luX2Rlc3Q7CQkvKiBlaXRoZXIgdGhlIG51bWJlciBvZiB0YXJnZXQgaXRlbSwKLQkJCQkJICAgb3IgaWYgd2UgbXVzdCBjcmVhdGUgYSBuZXcgaXRlbSwKLQkJCQkJICAgdGhlIG51bWJlciBvZiB0aGUgaXRlbSB3ZSB3aWxsCi0JCQkJCSAgIGNyZWF0ZSBpdCBuZXh0IHRvICovCi0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGludCBjb3B5X3JlY29yZHNfbGVuOwkJCS8qIGxlbmd0aCBvZiBhbGwgcmVjb3JkcyBpbiBpdGVtIHRvIGJlIGNvcGllZCAqLwotICAgIGNoYXIgKiByZWNvcmRzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCWludCBpdGVtX251bV9pbl9kZXN0OwkvKiBlaXRoZXIgdGhlIG51bWJlciBvZiB0YXJnZXQgaXRlbSwKKwkJCQkgICBvciBpZiB3ZSBtdXN0IGNyZWF0ZSBhIG5ldyBpdGVtLAorCQkJCSAgIHRoZSBudW1iZXIgb2YgdGhlIGl0ZW0gd2Ugd2lsbAorCQkJCSAgIGNyZWF0ZSBpdCBuZXh0IHRvICovCisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaDsKKwlpbnQgY29weV9yZWNvcmRzX2xlbjsJLyogbGVuZ3RoIG9mIGFsbCByZWNvcmRzIGluIGl0ZW0gdG8gYmUgY29waWVkICovCisJY2hhciAqcmVjb3JkczsKIAotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNvdXJjZSwgaXRlbV9udW0pOworCWloID0gQl9OX1BJVEVNX0hFQUQoc291cmNlLCBpdGVtX251bSk7CiAKLSAgICBSRkFMU0UoICFpc19kaXJlbnRyeV9sZV9paCAoaWgpLCAidnMtMTAwMDA6IGl0ZW0gbXVzdCBiZSBkaXJlY3RvcnkgaXRlbSIpOworCVJGQUxTRSghaXNfZGlyZW50cnlfbGVfaWgoaWgpLCAidnMtMTAwMDA6IGl0ZW0gbXVzdCBiZSBkaXJlY3RvcnkgaXRlbSIpOwogCi0gICAgLyogbGVuZ3RoIG9mIGFsbCByZWNvcmQgdG8gYmUgY29waWVkIGFuZCBmaXJzdCBieXRlIG9mIHRoZSBsYXN0IG9mIHRoZW0gKi8KLSAgICBkZWggPSBCX0lfREVIIChzb3VyY2UsIGloKTsKLSAgICBpZiAoY29weV9jb3VudCkgewotCWNvcHlfcmVjb3Jkc19sZW4gPSAoZnJvbSA/IGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSAtIDFdKSApIDoKLSAgICAgICAgICAgIGloX2l0ZW1fbGVuKGloKSkgLSBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBjb3B5X2NvdW50IC0gMV0pKTsKLQlyZWNvcmRzID0gc291cmNlLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gKyBjb3B5X2NvdW50IC0gMV0pKTsKLSAgICB9IGVsc2UgewotCWNvcHlfcmVjb3Jkc19sZW4gPSAwOwotCXJlY29yZHMgPSBOVUxMOwotICAgIH0KLQotICAgIC8qIHdoZW4gY29weSBsYXN0IHRvIGZpcnN0LCBkZXN0IGJ1ZmZlciBjYW4gY29udGFpbiAwIGl0ZW1zICovCi0gICAgaXRlbV9udW1faW5fZGVzdCA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKCggQl9OUl9JVEVNUyhkZXN0KSApID8gMCA6IC0xKSA6IChCX05SX0lURU1TKGRlc3QpIC0gMSk7Ci0KLSAgICAvKiBpZiB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gZGVzdCBvciB0aGUgZmlyc3QvbGFzdCBpdGVtIGluIGRlc3QgaXMgbm90IGl0ZW0gb2YgdGhlIHNhbWUgZGlyZWN0b3J5ICovCi0gICAgaWYgKCAoaXRlbV9udW1faW5fZGVzdCA9PSAtIDEpIHx8Ci0JKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCAmJiBsZV9paF9rX29mZnNldCAoaWgpID09IERPVF9PRkZTRVQpIHx8Ci0JICAgIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgJiYgY29tcF9zaG9ydF9sZV9rZXlzLypDT01QX1NIT1JUX0tFWVMqLyAoJmloLT5paF9rZXksIEJfTl9QS0VZIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkpKSB7Ci0JLyogY3JlYXRlIG5ldyBpdGVtIGluIGRlc3QgKi8KLQlzdHJ1Y3QgaXRlbV9oZWFkIG5ld19paDsKLQotCS8qIGZvcm0gaXRlbSBoZWFkZXIgKi8KLQltZW1jcHkgKCZuZXdfaWguaWhfa2V5LCAmaWgtPmloX2tleSwgS0VZX1NJWkUpOwotCXB1dF9paF92ZXJzaW9uKCAmbmV3X2loLCBLRVlfRk9STUFUXzNfNSApOwotCS8qIGNhbGN1bGF0ZSBpdGVtIGxlbiAqLwotCXB1dF9paF9pdGVtX2xlbiggJm5ld19paCwgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiApOwotCXB1dF9paF9lbnRyeV9jb3VudCggJm5ld19paCwgMCApOwotICAgIAotCWlmIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpIHsKLQkgICAgLyogZm9ybSBrZXkgYnkgdGhlIGZvbGxvd2luZyB3YXkgKi8KLQkgICAgaWYgKGZyb20gPCBJX0VOVFJZX0NPVU5UKGloKSkgewotCQlzZXRfbGVfaWhfa19vZmZzZXQoICZuZXdfaWgsIGRlaF9vZmZzZXQoICYoZGVoW2Zyb21dKSApICk7Ci0JCS8qbWVtY3B5ICgmbmV3X2loLmloX2tleS5rX29mZnNldCwgJmRlaFtmcm9tXS5kZWhfb2Zmc2V0LCBTSE9SVF9LRVlfU0laRSk7Ki8KLQkgICAgfSBlbHNlIHsKLQkJLyogbm8gZW50cmllcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGl0ZW0gaW4gdGhpcyBmdW5jdGlvbiAqLwotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuZXdfaWgsIFUzMl9NQVgpOwotCQkvKiB0aGlzIGl0ZW0gaXMgbm90IHlldCB2YWxpZCwgYnV0IHdlIHdhbnQgSV9JU19ESVJFQ1RPUllfSVRFTSB0byByZXR1cm4gMSBmb3IgaXQsIHNvIHdlIC0xICovCi0JICAgIH0KLQkgICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCAmKG5ld19paC5paF9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKKwkvKiBsZW5ndGggb2YgYWxsIHJlY29yZCB0byBiZSBjb3BpZWQgYW5kIGZpcnN0IGJ5dGUgb2YgdGhlIGxhc3Qgb2YgdGhlbSAqLworCWRlaCA9IEJfSV9ERUgoc291cmNlLCBpaCk7CisJaWYgKGNvcHlfY291bnQpIHsKKwkJY29weV9yZWNvcmRzX2xlbiA9IChmcm9tID8gZGVoX2xvY2F0aW9uKCYoZGVoW2Zyb20gLSAxXSkpIDoKKwkJCQkgICAgaWhfaXRlbV9sZW4oaWgpKSAtCisJCSAgICBkZWhfbG9jYXRpb24oJihkZWhbZnJvbSArIGNvcHlfY291bnQgLSAxXSkpOworCQlyZWNvcmRzID0KKwkJICAgIHNvdXJjZS0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKwkJICAgIGRlaF9sb2NhdGlvbigmKGRlaFtmcm9tICsgY29weV9jb3VudCAtIDFdKSk7CisJfSBlbHNlIHsKKwkJY29weV9yZWNvcmRzX2xlbiA9IDA7CisJCXJlY29yZHMgPSBOVUxMOwogCX0KLSAgICAKLQkvKiBpbnNlcnQgaXRlbSBpbnRvIGRlc3QgYnVmZmVyICovCi0JbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IEJfTlJfSVRFTVMoZGVzdCksICZuZXdfaWgsIE5VTEwsIDApOwotICAgIH0gZWxzZSB7Ci0JLyogcHJlcGFyZSBzcGFjZSBmb3IgZW50cmllcyAqLwotCWxlYWZfcGFzdGVfaW5fYnVmZmVyIChkZXN0X2JpLCAobGFzdF9maXJzdD09RklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtIDEpIDogMCwgTUFYX1VTX0lOVCwKLQkJCSAgICAgIERFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4sIHJlY29yZHMsIDAKLQkgICAgKTsKLSAgICB9Ci0gIAotICAgIGl0ZW1fbnVtX2luX2Rlc3QgPSAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpLTEpIDogMDsKLSAgICAKLSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAotCQkJKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgPyBJX0VOVFJZX0NPVU5UKEJfTl9QSVRFTV9IRUFEIChkZXN0LCBpdGVtX251bV9pbl9kZXN0KSkgOiAwLAotCQkJY29weV9jb3VudCwgZGVoICsgZnJvbSwgcmVjb3JkcywKLQkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4KLQkpOwotfQogCisJLyogd2hlbiBjb3B5IGxhc3QgdG8gZmlyc3QsIGRlc3QgYnVmZmVyIGNhbiBjb250YWluIDAgaXRlbXMgKi8KKwlpdGVtX251bV9pbl9kZXN0ID0KKwkgICAgKGxhc3RfZmlyc3QgPT0KKwkgICAgIExBU1RfVE9fRklSU1QpID8gKChCX05SX0lURU1TKGRlc3QpKSA/IDAgOiAtMSkgOiAoQl9OUl9JVEVNUyhkZXN0KQorCQkJCQkJCSAgICAgICAtIDEpOworCisJLyogaWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIGRlc3Qgb3IgdGhlIGZpcnN0L2xhc3QgaXRlbSBpbiBkZXN0IGlzIG5vdCBpdGVtIG9mIHRoZSBzYW1lIGRpcmVjdG9yeSAqLworCWlmICgoaXRlbV9udW1faW5fZGVzdCA9PSAtMSkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCAmJiBsZV9paF9rX29mZnNldChpaCkgPT0gRE9UX09GRlNFVCkgfHwKKwkgICAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVAorCSAgICAgJiYgY29tcF9zaG9ydF9sZV9rZXlzIC8qQ09NUF9TSE9SVF9LRVlTICovICgmaWgtPmloX2tleSwKKwkJCQkJCQkgQl9OX1BLRVkoZGVzdCwKKwkJCQkJCQkJICBpdGVtX251bV9pbl9kZXN0KSkpKQorCXsKKwkJLyogY3JlYXRlIG5ldyBpdGVtIGluIGRlc3QgKi8KKwkJc3RydWN0IGl0ZW1faGVhZCBuZXdfaWg7CisKKwkJLyogZm9ybSBpdGVtIGhlYWRlciAqLworCQltZW1jcHkoJm5ld19paC5paF9rZXksICZpaC0+aWhfa2V5LCBLRVlfU0laRSk7CisJCXB1dF9paF92ZXJzaW9uKCZuZXdfaWgsIEtFWV9GT1JNQVRfM181KTsKKwkJLyogY2FsY3VsYXRlIGl0ZW0gbGVuICovCisJCXB1dF9paF9pdGVtX2xlbigmbmV3X2loLAorCQkJCURFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4pOworCQlwdXRfaWhfZW50cnlfY291bnQoJm5ld19paCwgMCk7CisKKwkJaWYgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgeworCQkJLyogZm9ybSBrZXkgYnkgdGhlIGZvbGxvd2luZyB3YXkgKi8KKwkJCWlmIChmcm9tIDwgSV9FTlRSWV9DT1VOVChpaCkpIHsKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoJm5ld19paCwKKwkJCQkJCSAgIGRlaF9vZmZzZXQoJihkZWhbZnJvbV0pKSk7CisJCQkJLyptZW1jcHkgKCZuZXdfaWguaWhfa2V5Lmtfb2Zmc2V0LCAmZGVoW2Zyb21dLmRlaF9vZmZzZXQsIFNIT1JUX0tFWV9TSVpFKTsgKi8KKwkJCX0gZWxzZSB7CisJCQkJLyogbm8gZW50cmllcyB3aWxsIGJlIGNvcGllZCB0byB0aGlzIGl0ZW0gaW4gdGhpcyBmdW5jdGlvbiAqLworCQkJCXNldF9sZV9paF9rX29mZnNldCgmbmV3X2loLCBVMzJfTUFYKTsKKwkJCQkvKiB0aGlzIGl0ZW0gaXMgbm90IHlldCB2YWxpZCwgYnV0IHdlIHdhbnQgSV9JU19ESVJFQ1RPUllfSVRFTSB0byByZXR1cm4gMSBmb3IgaXQsIHNvIHdlIC0xICovCisJCQl9CisJCQlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgJihuZXdfaWguaWhfa2V5KSwKKwkJCQkJICBUWVBFX0RJUkVOVFJZKTsKKwkJfQorCisJCS8qIGluc2VydCBpdGVtIGludG8gZGVzdCBidWZmZXIgKi8KKwkJbGVhZl9pbnNlcnRfaW50b19idWYoZGVzdF9iaSwKKwkJCQkgICAgIChsYXN0X2ZpcnN0ID09CisJCQkJICAgICAgTEFTVF9UT19GSVJTVCkgPyAwIDogQl9OUl9JVEVNUyhkZXN0KSwKKwkJCQkgICAgICZuZXdfaWgsIE5VTEwsIDApOworCX0gZWxzZSB7CisJCS8qIHByZXBhcmUgc3BhY2UgZm9yIGVudHJpZXMgKi8KKwkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwKKwkJCQkgICAgIChsYXN0X2ZpcnN0ID09CisJCQkJICAgICAgRklSU1RfVE9fTEFTVCkgPyAoQl9OUl9JVEVNUyhkZXN0KSAtCisJCQkJCQkJMSkgOiAwLCBNQVhfVVNfSU5ULAorCQkJCSAgICAgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiwKKwkJCQkgICAgIHJlY29yZHMsIDApOworCX0KKworCWl0ZW1fbnVtX2luX2Rlc3QgPQorCSAgICAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpIC0gMSkgOiAwOworCisJbGVhZl9wYXN0ZV9lbnRyaWVzKGRlc3RfYmktPmJpX2JoLCBpdGVtX251bV9pbl9kZXN0LAorCQkJICAgKGxhc3RfZmlyc3QgPT0KKwkJCSAgICBGSVJTVF9UT19MQVNUKSA/IElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoZGVzdCwKKwkJCQkJCQkJCSAgaXRlbV9udW1faW5fZGVzdCkpCisJCQkgICA6IDAsIGNvcHlfY291bnQsIGRlaCArIGZyb20sIHJlY29yZHMsCisJCQkgICBERUhfU0laRSAqIGNvcHlfY291bnQgKyBjb3B5X3JlY29yZHNfbGVuKTsKK30KIAogLyogQ29weSB0aGUgZmlyc3QgKGlmIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgb3IgbGFzdCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSBpdGVtIG9yIAogICAgcGFydCBvZiBpdCBvciBub3RoaW5nIChzZWUgdGhlIHJldHVybiAwIGJlbG93KSBmcm9tIFNPVVJDRSB0byB0aGUgZW5kIAogICAgKGlmIGxhc3RfZmlyc3QpIG9yIGJlZ2lubmluZyAoIWxhc3RfZmlyc3QpIG9mIHRoZSBERVNUICovCiAvKiByZXR1cm5zIDEgaWYgYW55dGhpbmcgd2FzIGNvcGllZCwgZWxzZSAwICovCi1zdGF0aWMgaW50IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAotCQkJCSAgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKK3N0YXRpYyBpbnQgbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqc3JjLCBpbnQgbGFzdF9maXJzdCwKKwkJCQkgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICBpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KLSAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICBzdHJ1Y3QgaXRlbV9oZWFkICogZGloOwotICAKLSAgZGVzdF9ucl9pdGVtID0gQl9OUl9JVEVNUyhkZXN0KTsKLSAgCi0gIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgewotICAgIC8qIGlmICggREVTVCBpcyBlbXB0eSBvciBmaXJzdCBpdGVtIG9mIFNPVVJDRSBhbmQgbGFzdCBpdGVtIG9mIERFU1QgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0cwotICAgICAgIG9yIG9mIGRpZmZlcmVudCB0eXBlcyApIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byB0cmVhdCB0aGlzIGl0ZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgaXRlbXMKLSAgICAgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLwotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgMCk7Ci0gICAgZGloID0gQl9OX1BJVEVNX0hFQUQgKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOwotICAgIGlmICghZGVzdF9ucl9pdGVtIHx8ICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSkpCi0gICAgICAvKiB0aGVyZSBpcyBub3RoaW5nIHRvIG1lcmdlICovCi0gICAgICByZXR1cm4gMDsKLSAgICAgIAotICAgIFJGQUxTRSggISBpaF9pdGVtX2xlbihpaCksICJ2cy0xMDAxMDogaXRlbSBjYW4gbm90IGhhdmUgZW1wdHkgbGVuZ3RoIik7Ci0gICAgICAKLSAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChpaCkgKSB7Ci0gICAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQotCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLwotCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0gICAgICBsZWFmX2NvcHlfZGlyX2VudHJpZXMgKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgICAKLSAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiB0aGUgREVTVAotICAgICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgY29weSB3aG9sZSBib2R5OyBkb24ndCBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyCi0gICAgICAgKi8KLSAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQotICAgICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsJLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpkaWg7CisKKwlkZXN0X25yX2l0ZW0gPSBCX05SX0lURU1TKGRlc3QpOworCisJaWYgKGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgeworCQkvKiBpZiAoIERFU1QgaXMgZW1wdHkgb3IgZmlyc3QgaXRlbSBvZiBTT1VSQ0UgYW5kIGxhc3QgaXRlbSBvZiBERVNUIGFyZSB0aGUgaXRlbXMgb2YgZGlmZmVyZW50IG9iamVjdHMKKwkJICAgb3Igb2YgZGlmZmVyZW50IHR5cGVzICkgdGhlbiB0aGVyZSBpcyBubyBuZWVkIHRvIHRyZWF0IHRoaXMgaXRlbSBkaWZmZXJlbnRseSBmcm9tIHRoZSBvdGhlciBpdGVtcworCQkgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLworCQlpaCA9IEJfTl9QSVRFTV9IRUFEKHNyYywgMCk7CisJCWRpaCA9IEJfTl9QSVRFTV9IRUFEKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOworCQlpZiAoIWRlc3RfbnJfaXRlbQorCQkgICAgfHwgKCFvcF9pc19sZWZ0X21lcmdlYWJsZSgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpKQorCQkJLyogdGhlcmUgaXMgbm90aGluZyB0byBtZXJnZSAqLworCQkJcmV0dXJuIDA7CisKKwkJUkZBTFNFKCFpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAidnMtMTAwMTA6IGl0ZW0gY2FuIG5vdCBoYXZlIGVtcHR5IGxlbmd0aCIpOworCisJCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJCWlmIChieXRlc19vcl9lbnRyaWVzID09IC0xKQorCQkJCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLworCQkJCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7CisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCAwLCAwLAorCQkJCQkgICAgICBieXRlc19vcl9lbnRyaWVzKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBib2R5IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIERFU1QKKwkJICAgcGFydCBkZWZpbmVkIGJ5ICdieXRlc19vcl9lbnRyaWVzJzsgaWYgYnl0ZXNfb3JfZW50cmllcyA9PSAtMSBjb3B5IHdob2xlIGJvZHk7IGRvbid0IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXIKKwkJICovCisJCWlmIChieXRlc19vcl9lbnRyaWVzID09IC0xKQorCQkJYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGVsc2UgewotICAgICAgaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpICYmIGlzX2luZGlyZWN0X2xlX2loKGloKSkKLQlpZiAoZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSkKLQkgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtMTAwMjA6IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtOiAiCi0JCQkgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCi0JCQkgIGloKTsKLSAgICB9CisJCWVsc2UgeworCQkJaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpCisJCQkgICAgJiYgaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorCQkJCWlmIChnZXRfaWhfZnJlZV9zcGFjZShpaCkpCisJCQkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJCQkgICAgICAgInZzLTEwMDIwOiBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbTogIgorCQkJCQkJICAgICAgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCisJCQkJCQkgICAgICAgaWgpOworCQl9CiAjZW5kaWYKLSAgICAgIAotICAgIC8qIG1lcmdlIGZpcnN0IGl0ZW0gKG9yIGl0cyBwYXJ0KSBvZiBzcmMgYnVmZmVyIHdpdGggdGhlIGxhc3QKLSAgICAgICBpdGVtIG9mIGRlc3QgYnVmZmVyLiBCb3RoIGFyZSBvZiB0aGUgc2FtZSBmaWxlICovCi0gICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksCi0JCQkgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpLCAwCi0JCQkgICk7Ci0gICAgICAKLSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGRpaCkpIHsKLSAgICAgIFJGQUxTRSggZ2V0X2loX2ZyZWVfc3BhY2UgKGRpaCksCi0gICAgICAgICAgICAgICJ2cy0xMDAzMDogbWVyZ2UgdG8gbGVmdDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gJWggbXVzdCBoYXZlIHplcnRvIGZyZWUgc3BhY2UiLAotICAgICAgICAgICAgICBpaCk7Ci0gICAgICBpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCi0Jc2V0X2loX2ZyZWVfc3BhY2UgKGRpaCwgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAxOwotICB9Ci0gIAogCi0gIC8qIGNvcHkgYm91bmRhcnkgaXRlbSB0byByaWdodCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSAqLworCQkvKiBtZXJnZSBmaXJzdCBpdGVtIChvciBpdHMgcGFydCkgb2Ygc3JjIGJ1ZmZlciB3aXRoIHRoZSBsYXN0CisJCSAgIGl0ZW0gb2YgZGVzdCBidWZmZXIuIEJvdGggYXJlIG9mIHRoZSBzYW1lIGZpbGUgKi8KKwkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwKKwkJCQkgICAgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksCisJCQkJICAgICBieXRlc19vcl9lbnRyaWVzLCBCX0lfUElURU0oc3JjLCBpaCksIDApOwogCi0gIC8qICggREVTVCBpcyBlbXB0eSBvciBsYXN0IGl0ZW0gb2YgU09VUkNFIGFuZCBmaXJzdCBpdGVtIG9mIERFU1QKLSAgICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCi0gICAgICovCi0gIHNyY19ucl9pdGVtID0gQl9OUl9JVEVNUyAoc3JjKTsKLSAgaWggPSBCX05fUElURU1fSEVBRCAoc3JjLCBzcmNfbnJfaXRlbSAtIDEpOwotICBkaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgMCk7CisJCWlmIChpc19pbmRpcmVjdF9sZV9paChkaWgpKSB7CisJCQlSRkFMU0UoZ2V0X2loX2ZyZWVfc3BhY2UoZGloKSwKKwkJCSAgICAgICAidnMtMTAwMzA6IG1lcmdlIHRvIGxlZnQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtICVoIG11c3QgaGF2ZSB6ZXJ0byBmcmVlIHNwYWNlIiwKKwkJCSAgICAgICBpaCk7CisJCQlpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCisJCQkJc2V0X2loX2ZyZWVfc3BhY2UoZGloLCBnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQl9CiAKLSAgaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGRpaC0+aWhfa2V5KSwgc3JjLT5iX3NpemUpKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7Ci0gICAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkKLSAgICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBlbnRyaWVzIG51bWJlciBpbiBsYXN0IGl0ZW0gYm9keSBvZiBTT1VSQ0UgKi8KLSAgICAgIGJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0gICAgCi0gICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIHNyY19ucl9pdGVtIC0gMSwgaWhfZW50cnlfY291bnQoaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KKwkJcmV0dXJuIDE7CisJfQogCi0gIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgbGFzdCBpdGVtIG9mIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIERFU1Q7Ci0gICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVfb3JfZW50cmllc3MgPT0gLTEgY29weSB3aG9sZSBib2R5OyBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1Q7Ci0gICAgIGRvbid0IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXIKLSAgICAgKi8KLSAgCi0gIFJGQUxTRSggaXNfaW5kaXJlY3RfbGVfaWgoaWgpICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCi0gICAgICAgICAgInZzLTEwMDQwOiBtZXJnZSB0byByaWdodDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCi0JCSAgICBpaCk7CisJLyogY29weSBib3VuZGFyeSBpdGVtIHRvIHJpZ2h0IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpICovCiAKLSAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkgewotICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBsZW5ndGggb2YgbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCi0gICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKwkvKiAoIERFU1QgaXMgZW1wdHkgb3IgbGFzdCBpdGVtIG9mIFNPVVJDRSBhbmQgZmlyc3QgaXRlbSBvZiBERVNUCisJICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCisJICovCisJc3JjX25yX2l0ZW0gPSBCX05SX0lURU1TKHNyYyk7CisJaWggPSBCX05fUElURU1fSEVBRChzcmMsIHNyY19ucl9pdGVtIC0gMSk7CisJZGloID0gQl9OX1BJVEVNX0hFQUQoZGVzdCwgMCk7CiAKLSAgICBSRkFMU0UoIGxlX2loX2tfb2Zmc2V0IChkaWgpICE9Ci0gICAgICAgICAgICBsZV9paF9rX29mZnNldCAoaWgpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgc3JjLT5iX3NpemUpLAotICAgICAgICAgICAgInZzLTEwMDUwOiBpdGVtcyAlaCBhbmQgJWggZG8gbm90IG1hdGNoIiwgaWgsIGRpaCk7CisJaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoZGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSkpCisJCXJldHVybiAwOwogCi0gICAgLyogY2hhbmdlIGZpcnN0IGl0ZW0ga2V5IG9mIHRoZSBERVNUICovCi0gICAgc2V0X2xlX2loX2tfb2Zmc2V0IChkaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkpOworCWlmIChpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gLTEpCisJCQkvKiBieXRlc19vcl9lbnRyaWVzID0gZW50cmllcyBudW1iZXIgaW4gbGFzdCBpdGVtIGJvZHkgb2YgU09VUkNFICovCisJCQlieXRlc19vcl9lbnRyaWVzID0gaWhfZW50cnlfY291bnQoaWgpOwogCi0gICAgLyogaXRlbSBiZWNvbWVzIG5vbi1tZXJnZWFibGUgKi8KLSAgICAvKiBvciBtZXJnZWFibGUgaWYgbGVmdCBpdGVtIHdhcyAqLwotICAgIHNldF9sZV9paF9rX3R5cGUgKGRpaCwgbGVfaWhfa190eXBlIChpaCkpOwotICB9IGVsc2UgewotICAgIC8qIG1lcmdlIHRvIHJpZ2h0IG9ubHkgcGFydCBvZiBpdGVtICovCi0gICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gYnl0ZXNfb3JfZW50cmllcywKLSAgICAgICAgICAgICJ2cy0xMDA2MDogbm8gc28gbXVjaCBieXRlcyAlbHUgKG5lZWRlZCAlbHUpIiwKLSAgICAgICAgICAgICggdW5zaWduZWQgbG9uZyApaWhfaXRlbV9sZW4oaWgpLCAoIHVuc2lnbmVkIGxvbmcgKWJ5dGVzX29yX2VudHJpZXMpOwotICAgIAotICAgIC8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLwotICAgIGlmICggaXNfZGlyZWN0X2xlX2loIChkaWgpICkgewotICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PSAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzLAotCSAgICAgICJ2cy0xMDA3MDogZGloICVoLCBieXRlc19vcl9lbnRyaWVzKCVkKSIsIGRpaCwgYnl0ZXNfb3JfZW50cmllcyk7Ci0gICAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGRpaCwgbGVfaWhfa19vZmZzZXQgKGRpaCkgLSBieXRlc19vcl9lbnRyaWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgUkZBTFNFKCBsZV9paF9rX29mZnNldCAoZGloKSA8PQotICAgICAgICAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKLSAgICAgICAgICAgICAgInZzLTEwMDgwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwKLSAgICAgICAgICAgICAgZGloLCAoYnl0ZXNfb3JfZW50cmllcy9VTkZNX1BfU0laRSkqZGVzdC0+Yl9zaXplKTsKLSAgICAgIHNldF9sZV9paF9rX29mZnNldCAoZGloLCBsZV9paF9rX29mZnNldCAoZGloKSAtICgoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSkpOwotICAgIH0KLSAgfQotICAKLSAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksIDAsIDAsIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgMCk7Ci0gIHJldHVybiAxOworCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCSAgICAgIHNyY19ucl9pdGVtIC0gMSwKKwkJCQkgICAgICBpaF9lbnRyeV9jb3VudChpaCkgLSBieXRlc19vcl9lbnRyaWVzLAorCQkJCSAgICAgIGJ5dGVzX29yX2VudHJpZXMpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBERVNUOworCSAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVfb3JfZW50cmllc3MgPT0gLTEgY29weSB3aG9sZSBib2R5OyBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1Q7CisJICAgZG9uJ3QgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcgorCSAqLworCisJUkZBTFNFKGlzX2luZGlyZWN0X2xlX2loKGloKSAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJICAgICAgICJ2cy0xMDA0MDogbWVyZ2UgdG8gcmlnaHQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtIG11c3QgYmUgZmlsbGVkIGVudGlyZWx5ICglaCkiLAorCSAgICAgICBpaCk7CisKKwlpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSAtMSkgeworCQkvKiBieXRlc19vcl9lbnRyaWVzID0gbGVuZ3RoIG9mIGxhc3QgaXRlbSBib2R5IG9mIFNPVVJDRSAqLworCQlieXRlc19vcl9lbnRyaWVzID0gaWhfaXRlbV9sZW4oaWgpOworCisJCVJGQUxTRShsZV9paF9rX29mZnNldChkaWgpICE9CisJCSAgICAgICBsZV9paF9rX29mZnNldChpaCkgKyBvcF9ieXRlc19udW1iZXIoaWgsIHNyYy0+Yl9zaXplKSwKKwkJICAgICAgICJ2cy0xMDA1MDogaXRlbXMgJWggYW5kICVoIGRvIG5vdCBtYXRjaCIsIGloLCBkaWgpOworCisJCS8qIGNoYW5nZSBmaXJzdCBpdGVtIGtleSBvZiB0aGUgREVTVCAqLworCQlzZXRfbGVfaWhfa19vZmZzZXQoZGloLCBsZV9paF9rX29mZnNldChpaCkpOworCisJCS8qIGl0ZW0gYmVjb21lcyBub24tbWVyZ2VhYmxlICovCisJCS8qIG9yIG1lcmdlYWJsZSBpZiBsZWZ0IGl0ZW0gd2FzICovCisJCXNldF9sZV9paF9rX3R5cGUoZGloLCBsZV9paF9rX3R5cGUoaWgpKTsKKwl9IGVsc2UgeworCQkvKiBtZXJnZSB0byByaWdodCBvbmx5IHBhcnQgb2YgaXRlbSAqLworCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpIDw9IGJ5dGVzX29yX2VudHJpZXMsCisJCSAgICAgICAidnMtMTAwNjA6IG5vIHNvIG11Y2ggYnl0ZXMgJWx1IChuZWVkZWQgJWx1KSIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAodW5zaWduZWQgbG9uZylieXRlc19vcl9lbnRyaWVzKTsKKworCQkvKiBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1QgKi8KKwkJaWYgKGlzX2RpcmVjdF9sZV9paChkaWgpKSB7CisJCQlSRkFMU0UobGVfaWhfa19vZmZzZXQoZGloKSA8PQorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKWJ5dGVzX29yX2VudHJpZXMsCisJCQkgICAgICAgInZzLTEwMDcwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwgZGloLAorCQkJICAgICAgIGJ5dGVzX29yX2VudHJpZXMpOworCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGRpaCwKKwkJCQkJICAgbGVfaWhfa19vZmZzZXQoZGloKSAtCisJCQkJCSAgIGJ5dGVzX29yX2VudHJpZXMpOworCQl9IGVsc2UgeworCQkJUkZBTFNFKGxlX2loX2tfb2Zmc2V0KGRpaCkgPD0KKwkJCSAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSwKKwkJCSAgICAgICAidnMtMTAwODA6IGRpaCAlaCwgYnl0ZXNfb3JfZW50cmllcyglZCkiLAorCQkJICAgICAgIGRpaCwKKwkJCSAgICAgICAoYnl0ZXNfb3JfZW50cmllcyAvIFVORk1fUF9TSVpFKSAqIGRlc3QtPmJfc2l6ZSk7CisJCQlzZXRfbGVfaWhfa19vZmZzZXQoZGloLAorCQkJCQkgICBsZV9paF9rX29mZnNldChkaWgpIC0KKwkJCQkJICAgKChieXRlc19vcl9lbnRyaWVzIC8gVU5GTV9QX1NJWkUpICoKKwkJCQkJICAgIGRlc3QtPmJfc2l6ZSkpOworCQl9CisJfQorCisJbGVhZl9wYXN0ZV9pbl9idWZmZXIoZGVzdF9iaSwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcywKKwkJCSAgICAgQl9JX1BJVEVNKHNyYywKKwkJCQkgICAgICAgaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gYnl0ZXNfb3JfZW50cmllcywKKwkJCSAgICAgMCk7CisJcmV0dXJuIDE7CiB9CiAKLQogLyogY29weSBjcHlfbXVuIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdAogICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgY3B5X251bSAgaXRlbXMgYmVnaW5uaW5nIGZyb20gZmlyc3QtdGggaXRlbSBpbiBzcmMgdG8gdGFpbCBvZiBkZXN0CiAgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weSBjcHlfbnVtICBpdGVtcyBiZWdpbm5pbmcgZnJvbSBmaXJzdC10aCBpdGVtIGluIHNyYyB0byBoZWFkIG9mIGRlc3QKICAqLwotc3RhdGljIHZvaWQgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAotCQkJCSAgICAgIGludCBmaXJzdCwgaW50IGNweV9udW0pCitzdGF0aWMgdm9pZCBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJCSAgICAgaW50IGZpcnN0LCBpbnQgY3B5X251bSkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0OwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBpbnQgZGVzdF9iZWZvcmU7Ci0gICAgaW50IGxhc3RfbG9jLCBsYXN0X2luc2VydGVkX2xvYywgbG9jYXRpb247Ci0gICAgaW50IGksIGo7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlc3Q7CisJaW50IG5yLCBmcmVlX3NwYWNlOworCWludCBkZXN0X2JlZm9yZTsKKwlpbnQgbGFzdF9sb2MsIGxhc3RfaW5zZXJ0ZWRfbG9jLCBsb2NhdGlvbjsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKIAotICAgIFJGQUxTRSggbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNUICAmJiBsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QsCi0JICAgICJ2cy0xMDA5MDogYmFkIGxhc3RfZmlyc3QgcGFyYW1ldGVyICVkIiwgbGFzdF9maXJzdCk7Ci0gICAgUkZBTFNFKCBCX05SX0lURU1TIChzcmMpIC0gZmlyc3QgPCBjcHlfbnVtLAotCSAgICAidnMtMTAxMDA6IHRvbyBmZXcgaXRlbXMgaW4gc291cmNlICVkLCByZXF1aXJlZCAlZCBmcm9tICVkIiwKLQkgICAgQl9OUl9JVEVNUyhzcmMpLCBjcHlfbnVtLCBmaXJzdCk7Ci0gICAgUkZBTFNFKCBjcHlfbnVtIDwgMCwgInZzLTEwMTEwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7Ci0gICAgUkZBTFNFKCAhIGRlc3RfYmksICJ2cy0xMDEyMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRShsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QgJiYgbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNULAorCSAgICAgICAidnMtMTAwOTA6IGJhZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAlZCIsIGxhc3RfZmlyc3QpOworCVJGQUxTRShCX05SX0lURU1TKHNyYykgLSBmaXJzdCA8IGNweV9udW0sCisJICAgICAgICJ2cy0xMDEwMDogdG9vIGZldyBpdGVtcyBpbiBzb3VyY2UgJWQsIHJlcXVpcmVkICVkIGZyb20gJWQiLAorCSAgICAgICBCX05SX0lURU1TKHNyYyksIGNweV9udW0sIGZpcnN0KTsKKwlSRkFMU0UoY3B5X251bSA8IDAsICJ2cy0xMDExMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRSghZGVzdF9iaSwgInZzLTEwMTIwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CiAKLSAgICBkZXN0ID0gZGVzdF9iaS0+YmlfYmg7CisJZGVzdCA9IGRlc3RfYmktPmJpX2JoOwogCi0gICAgUkZBTFNFKCAhIGRlc3QsICJ2cy0xMDEzMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworCVJGQUxTRSghZGVzdCwgInZzLTEwMTMwOiBjYW4gbm90IGNvcHkgbmVnYXRpdmUgYW1vdW50IG9mIGl0ZW1zIik7CiAKLSAgICBpZiAoY3B5X251bSA9PSAwKQotCXJldHVybjsKKwlpZiAoY3B5X251bSA9PSAwKQorCQlyZXR1cm47CiAKLSAgICBibGtoID0gQl9CTEtfSEVBRChkZXN0KTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbSggYmxraCApOwotICAgIGZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7Ci0gIAotICAgIC8qIHdlIHdpbGwgaW5zZXJ0IGl0ZW1zIGJlZm9yZSAwLXRoIG9yIG5yLXRoIGl0ZW0gaW4gZGVzdCBidWZmZXIuIEl0IGRlcGVuZHMgb2YgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKi8KLSAgICBkZXN0X2JlZm9yZSA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yOworCWJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCWZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoYmxraCk7CiAKLSAgICAvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgZGVzdF9iZWZvcmUpOworCS8qIHdlIHdpbGwgaW5zZXJ0IGl0ZW1zIGJlZm9yZSAwLXRoIG9yIG5yLXRoIGl0ZW0gaW4gZGVzdCBidWZmZXIuIEl0IGRlcGVuZHMgb2YgbGFzdF9maXJzdCBwYXJhbWV0ZXIgKi8KKwlkZXN0X2JlZm9yZSA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gMCA6IG5yOwogCi0gICAgUkZBTFNFKCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKLSAgICAgICAgICAgICJ2cy0xMDE0MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGZvciBoZWFkZXJzICVkIChuZWVkZWQgJWQpIiwKLSAgICAgICAgICAgIEJfRlJFRV9TUEFDRSAoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKKwkvKiBsb2NhdGlvbiBvZiBoZWFkIG9mIGZpcnN0IG5ldyBpdGVtICovCisJaWggPSBCX05fUElURU1fSEVBRChkZXN0LCBkZXN0X2JlZm9yZSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBoZWFkZXJzICovCi0gICAgbWVtbW92ZSAoaWggKyBjcHlfbnVtLCBpaCwgKG5yLWRlc3RfYmVmb3JlKSAqIElIX1NJWkUpOworCVJGQUxTRShibGtoX2ZyZWVfc3BhY2UoYmxraCkgPCBjcHlfbnVtICogSUhfU0laRSwKKwkgICAgICAgInZzLTEwMTQwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGhlYWRlcnMgJWQgKG5lZWRlZCAlZCkiLAorCSAgICAgICBCX0ZSRUVfU1BBQ0UoZGVzdCksIGNweV9udW0gKiBJSF9TSVpFKTsKIAotICAgIC8qIGNvcHkgaXRlbSBoZWFkZXJzICovCi0gICAgbWVtY3B5IChpaCwgQl9OX1BJVEVNX0hFQUQgKHNyYywgZmlyc3QpLCBjcHlfbnVtICogSUhfU0laRSk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgaGVhZGVycyAqLworCW1lbW1vdmUoaWggKyBjcHlfbnVtLCBpaCwgKG5yIC0gZGVzdF9iZWZvcmUpICogSUhfU0laRSk7CiAKLSAgICBmcmVlX3NwYWNlIC09IChJSF9TSVpFICogY3B5X251bSk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSApOworCS8qIGNvcHkgaXRlbSBoZWFkZXJzICovCisJbWVtY3B5KGloLCBCX05fUElURU1fSEVBRChzcmMsIGZpcnN0KSwgY3B5X251bSAqIElIX1NJWkUpOwogCi0gICAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KLSAgICBqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKLSAgICBmb3IgKGkgPSBkZXN0X2JlZm9yZTsgaSA8IG5yICsgY3B5X251bTsgaSArKykgewotICAgICAgICBsb2NhdGlvbiAtPSBpaF9pdGVtX2xlbiggaWggKyBpIC0gZGVzdF9iZWZvcmUgKTsKLSAgICAgICAgcHV0X2loX2xvY2F0aW9uKCBpaCArIGkgLSBkZXN0X2JlZm9yZSwgbG9jYXRpb24gKTsKLSAgICB9CisJZnJlZV9zcGFjZSAtPSAoSUhfU0laRSAqIGNweV9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgZnJlZV9zcGFjZSk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLwotICAgIGxhc3RfbG9jID0gaWhfbG9jYXRpb24oICYoaWhbbnIrY3B5X251bS0xLWRlc3RfYmVmb3JlXSkgKTsKLSAgICBsYXN0X2luc2VydGVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2NweV9udW0tMV0pICk7CisJLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KKwlqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaCAtIDEpOworCWZvciAoaSA9IGRlc3RfYmVmb3JlOyBpIDwgbnIgKyBjcHlfbnVtOyBpKyspIHsKKwkJbG9jYXRpb24gLT0gaWhfaXRlbV9sZW4oaWggKyBpIC0gZGVzdF9iZWZvcmUpOworCQlwdXRfaWhfbG9jYXRpb24oaWggKyBpIC0gZGVzdF9iZWZvcmUsIGxvY2F0aW9uKTsKKwl9CiAKLSAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCi0gICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jLAotCSAgICAidnMtMTAxNTA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgaXRlbXMgJWQgKG5lZWRlZCAlZCkiLAotICAgICAgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLworCWxhc3RfbG9jID0gaWhfbG9jYXRpb24oJihpaFtuciArIGNweV9udW0gLSAxIC0gZGVzdF9iZWZvcmVdKSk7CisJbGFzdF9pbnNlcnRlZF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW2NweV9udW0gLSAxXSkpOwogCi0gICAgbWVtbW92ZSAoZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MsCi0JICAgICBkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYyArIGogLSBsYXN0X2luc2VydGVkX2xvYywKLQkgICAgIGxhc3RfaW5zZXJ0ZWRfbG9jIC0gbGFzdF9sb2MpOworCS8qIGNoZWNrIGZyZWUgc3BhY2UgKi8KKwlSRkFMU0UoZnJlZV9zcGFjZSA8IGogLSBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgICAgInZzLTEwMTUwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGl0ZW1zICVkIChuZWVkZWQgJWQpIiwKKwkgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKIAotICAgIC8qIGNvcHkgaXRlbXMgKi8KLSAgICBtZW1jcHkgKGRlc3QtPmJfZGF0YSArIGxhc3RfaW5zZXJ0ZWRfbG9jLCBCX05fUElURU0oc3JjLChmaXJzdCArIGNweV9udW0gLSAxKSksCi0JICAgIGogLSBsYXN0X2luc2VydGVkX2xvYyk7CisJbWVtbW92ZShkZXN0LT5iX2RhdGEgKyBsYXN0X2xvYywKKwkJZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9pbnNlcnRlZF9sb2MsCisJCWxhc3RfaW5zZXJ0ZWRfbG9jIC0gbGFzdF9sb2MpOwogCi0gICAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCi0gICAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgbnIgKyBjcHlfbnVtICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpICk7CisJLyogY29weSBpdGVtcyAqLworCW1lbWNweShkZXN0LT5iX2RhdGEgKyBsYXN0X2luc2VydGVkX2xvYywKKwkgICAgICAgQl9OX1BJVEVNKHNyYywgKGZpcnN0ICsgY3B5X251bSAtIDEpKSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKIAotICAgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisJLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBuciArIGNweV9udW0pOworCXNldF9ibGtoX2ZyZWVfc3BhY2UoYmxraCwgZnJlZV9zcGFjZSAtIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MpKTsKIAotICAgIGlmIChkZXN0X2JpLT5iaV9wYXJlbnQpIHsKLQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKLQl0X2RjID0gQl9OX0NISUxEIChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKLQlSRkFMU0UoIGRjX2Jsb2NrX251bWJlcih0X2RjKSAhPSBkZXN0LT5iX2Jsb2NrbnIsCi0JICAgICAgICAidnMtMTAxNjA6IGJsb2NrIG51bWJlciBpbiBiaCBkb2VzIG5vdCBtYXRjaCB0byBmaWVsZCBpbiBkaXNrX2NoaWxkIHN0cnVjdHVyZSAlbHUgYW5kICVsdSIsCi0gICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZGVzdC0+Yl9ibG9ja25yLCAKLQkJKCBsb25nIHVuc2lnbmVkICkgZGNfYmxvY2tfbnVtYmVyKHRfZGMpKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChqIC0gbGFzdF9pbnNlcnRlZF9sb2MgKyBJSF9TSVpFICogY3B5X251bSApICk7Ci0gICAgCi0JZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LCAwKTsKLSAgICB9CisJZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkoZGVzdF9iaS0+dGIsIGRlc3QsIDApOworCisJaWYgKGRlc3RfYmktPmJpX3BhcmVudCkgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKwkJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsIGRlc3RfYmktPmJpX3Bvc2l0aW9uKTsKKwkJUkZBTFNFKGRjX2Jsb2NrX251bWJlcih0X2RjKSAhPSBkZXN0LT5iX2Jsb2NrbnIsCisJCSAgICAgICAidnMtMTAxNjA6IGJsb2NrIG51bWJlciBpbiBiaCBkb2VzIG5vdCBtYXRjaCB0byBmaWVsZCBpbiBkaXNrX2NoaWxkIHN0cnVjdHVyZSAlbHUgYW5kICVsdSIsCisJCSAgICAgICAobG9uZyB1bnNpZ25lZClkZXN0LT5iX2Jsb2NrbnIsCisJCSAgICAgICAobG9uZyB1bnNpZ25lZClkY19ibG9ja19udW1iZXIodF9kYykpOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgKyAoaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jICsKKwkJCQkJICAgICBJSF9TSVpFICogY3B5X251bSkpOworCisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LAorCQkJCQkgICAgICAgMCk7CisJfQogfQogCi0KIC8qIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSAobGlxdWlkKSBpdGVtIGludG8gdHdvIGl0ZW1zICh1c2VmdWwgd2hlbgogICAgc2hpZnRpbmcgcGFydCBvZiBhbiBpdGVtIGludG8gYW5vdGhlciBub2RlLikgKi8KLXN0YXRpYyB2b2lkIGxlYWZfaXRlbV9ib3R0bGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgaW50IGxhc3RfZmlyc3QsCi0JCQkgICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCitzdGF0aWMgdm9pZCBsZWFmX2l0ZW1fYm90dGxlKHN0cnVjdCBidWZmZXJfaW5mbyAqZGVzdF9iaSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKLSAgCi0gICAgUkZBTFNFKCBjcHlfYnl0ZXMgPT0gLTEsICJ2cy0xMDE3MDogYnl0ZXMgPT0gLSAxIG1lYW5zOiBkbyBub3Qgc3BsaXQgaXRlbSIpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdCA9IGRlc3RfYmktPmJpX2JoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOwogCi0gICAgaWYgKCBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgKSB7Ci0JLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLwotCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChzcmMsaXRlbV9udW0pKSkKLQkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGl0ZW1fbnVtLCAwLCBjcHlfYnl0ZXMpOwotCWVsc2UgewotCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7Ci0gICAgICAKLQkgICAgLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBpdGVtIG51bWJlciAnaXRlbV9udW0nIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBERVNUIAotCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7IGNoYW5nZSBvbGQgaXRlbV9oZWFkZXIgKD8/Pz8pOwotCSAgICAgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOwotCSAgICAqLwotCSAgICBtZW1jcHkgKCZuX2loLCBpaCwgSUhfU0laRSk7Ci0JICAgIHB1dF9paF9pdGVtX2xlbiggJm5faWgsIGNweV9ieXRlcyApOwotCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgewotCQlSRkFMU0UoIGNweV9ieXRlcyA9PSBpaF9pdGVtX2xlbihpaCkgJiYgZ2V0X2loX2ZyZWVfc3BhY2UoaWgpLAotCQkgICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7Ci0JCXNldF9paF9mcmVlX3NwYWNlICgmbl9paCwgMCk7Ci0JICAgIH0KKwlSRkFMU0UoY3B5X2J5dGVzID09IC0xLAorCSAgICAgICAidnMtMTAxNzA6IGJ5dGVzID09IC0gMSBtZWFuczogZG8gbm90IHNwbGl0IGl0ZW0iKTsKIAotCSAgICBSRkFMU0UoIG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSksCi0JCSAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKLQkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLwotCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0KSwgJm5faWgsIEJfTl9QSVRFTSAoc3JjLCBpdGVtX251bSksIDApOworCWlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsKKwkJLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWggPSBCX05fUElURU1fSEVBRChzcmMsIGl0ZW1fbnVtKSkpCisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULAorCQkJCQkgICAgICBpdGVtX251bSwgMCwgY3B5X2J5dGVzKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7CisKKwkJCS8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAKKwkJCSAgIHBhcnQgZGVmaW5lZCBieSAnY3B5X2J5dGVzJzsgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcjsgY2hhbmdlIG9sZCBpdGVtX2hlYWRlciAoPz8/Pyk7CisJCQkgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOworCQkJICovCisJCQltZW1jcHkoJm5faWgsIGloLCBJSF9TSVpFKTsKKwkJCXB1dF9paF9pdGVtX2xlbigmbl9paCwgY3B5X2J5dGVzKTsKKwkJCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpIHsKKwkJCQlSRkFMU0UoY3B5X2J5dGVzID09IGloX2l0ZW1fbGVuKGloKQorCQkJCSAgICAgICAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJCQkJICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAorCQkJCSAgICAgICAobG9uZyB1bnNpZ25lZClnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQkJCXNldF9paF9mcmVlX3NwYWNlKCZuX2loLCAwKTsKKwkJCX0KKworCQkJUkZBTFNFKG9wX2lzX2xlZnRfbWVyZ2VhYmxlKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSwKKwkJCSAgICAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKKwkJCW5faWguaWhfdmVyc2lvbiA9IGloLT5paF92ZXJzaW9uOwkvKiBKRE0gRW5kaWFuIHNhZmUsIGJvdGggbGUgKi8KKwkJCWxlYWZfaW5zZXJ0X2ludG9fYnVmKGRlc3RfYmksIEJfTlJfSVRFTVMoZGVzdCksICZuX2loLAorCQkJCQkgICAgIEJfTl9QSVRFTShzcmMsIGl0ZW1fbnVtKSwgMCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiAgaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWggPSBCX05fUElURU1fSEVBRChzcmMsIGl0ZW1fbnVtKSkpCisJCQlsZWFmX2NvcHlfZGlyX2VudHJpZXMoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCQkgICAgICBpdGVtX251bSwKKwkJCQkJICAgICAgSV9FTlRSWV9DT1VOVChpaCkgLSBjcHlfYnl0ZXMsCisJCQkJCSAgICAgIGNweV9ieXRlcyk7CisJCWVsc2UgeworCQkJc3RydWN0IGl0ZW1faGVhZCBuX2loOworCisJCQkvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGl0ZW0gbnVtYmVyICdpdGVtX251bScgb2YgU09VUkNFIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAKKwkJCSAgIHBhcnQgZGVmaW5lZCBieSAnY3B5X2J5dGVzJzsgY3JlYXRlIG5ldyBpdGVtIGhlYWRlcjsKKwkJCSAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7CisJCQkgKi8KKwkJCW1lbWNweSgmbl9paCwgaWgsIFNIT1JUX0tFWV9TSVpFKTsKKworCQkJbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CS8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJCQlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkgeworCQkJCXNldF9sZV9paF9rX29mZnNldCgmbl9paCwKKwkJCQkJCSAgIGxlX2loX2tfb2Zmc2V0KGloKSArCisJCQkJCQkgICBpaF9pdGVtX2xlbihpaCkgLSBjcHlfYnl0ZXMpOworCQkJCXNldF9sZV9paF9rX3R5cGUoJm5faWgsIFRZUEVfRElSRUNUKTsKKwkJCQlzZXRfaWhfZnJlZV9zcGFjZSgmbl9paCwgTUFYX1VTX0lOVCk7CisJCQl9IGVsc2UgeworCQkJCS8qIGluZGlyZWN0IGl0ZW0gKi8KKwkJCQlSRkFMU0UoIWNweV9ieXRlcyAmJiBnZXRfaWhfZnJlZV9zcGFjZShpaCksCisJCQkJICAgICAgICJ2cy0xMDIwMDogaWgtPmloX2ZyZWVfc3BhY2UgbXVzdCBiZSAwIHdoZW4gaW5kaXJlY3QgaXRlbSB3aWxsIGJlIGFwcGVuZGVkIik7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCZuX2loLAorCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCSAgIChpaF9pdGVtX2xlbihpaCkgLQorCQkJCQkJICAgIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqCisJCQkJCQkgICBkZXN0LT5iX3NpemUpOworCQkJCXNldF9sZV9paF9rX3R5cGUoJm5faWgsIFRZUEVfSU5ESVJFQ1QpOworCQkJCXNldF9paF9mcmVlX3NwYWNlKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZShpaCkpOworCQkJfQorCisJCQkvKiBzZXQgaXRlbSBsZW5ndGggKi8KKwkJCXB1dF9paF9pdGVtX2xlbigmbl9paCwgY3B5X2J5dGVzKTsKKworCQkJbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CS8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJCQlsZWFmX2luc2VydF9pbnRvX2J1ZihkZXN0X2JpLCAwLCAmbl9paCwKKwkJCQkJICAgICBCX05fUElURU0oc3JjLAorCQkJCQkJICAgICAgIGl0ZW1fbnVtKSArCisJCQkJCSAgICAgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzLCAwKTsKKwkJfQogCX0KLSAgICB9IGVsc2UgewotCS8qICBpZiAoIGlmIGl0ZW0gaW4gcG9zaXRpb24gaXRlbV9udW0gaW4gYnVmZmVyIFNPVVJDRSBpcyBkaXJlY3RvcnkgaXRlbSApICovCi0JaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgaXRlbV9udW0pKSkKLQkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIGl0ZW1fbnVtLCBJX0VOVFJZX0NPVU5UKGloKSAtIGNweV9ieXRlcywgY3B5X2J5dGVzKTsKLQllbHNlIHsKLQkgICAgc3RydWN0IGl0ZW1faGVhZCBuX2loOwotICAgICAgCi0JICAgIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIAotCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7Ci0JICAgICAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7Ci0JICAgICovCi0JICAgIG1lbWNweSAoJm5faWgsIGloLCBTSE9SVF9LRVlfU0laRSk7Ci0KLQkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLwotCi0JICAgIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgewotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzKTsKLQkJc2V0X2xlX2loX2tfdHlwZSAoJm5faWgsIFRZUEVfRElSRUNUKTsKLQkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBNQVhfVVNfSU5UKTsKLQkgICAgfSBlbHNlIHsKLQkJLyogaW5kaXJlY3QgaXRlbSAqLwotCQlSRkFMU0UoICFjcHlfYnl0ZXMgJiYgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSwKLQkJICAgICAgICAidnMtMTAyMDA6IGloLT5paF9mcmVlX3NwYWNlIG11c3QgYmUgMCB3aGVuIGluZGlyZWN0IGl0ZW0gd2lsbCBiZSBhcHBlbmRlZCIpOwotCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgKGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqIGRlc3QtPmJfc2l6ZSk7Ci0JCXNldF9sZV9paF9rX3R5cGUgKCZuX2loLCBUWVBFX0lORElSRUNUKTsKLQkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpKTsKLQkgICAgfQotICAgICAgCi0JICAgIC8qIHNldCBpdGVtIGxlbmd0aCAqLwotCSAgICBwdXRfaWhfaXRlbV9sZW4oICZuX2loLCBjcHlfYnl0ZXMgKTsKLQotCSAgICBuX2loLmloX3ZlcnNpb24gPSBpaC0+aWhfdmVyc2lvbjsgLyogSkRNIEVuZGlhbiBzYWZlLCBib3RoIGxlICovCi0KLQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIDAsICZuX2loLCBCX05fUElURU0oc3JjLGl0ZW1fbnVtKSArIGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcywgMCk7Ci0JfQotICAgIH0KIH0KIAotCiAvKiBJZiBjcHlfYnl0ZXMgZXF1YWxzIG1pbnVzIG9uZSB0aGFuIGNvcHkgY3B5X251bSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgogICAgSWYgY3B5X2J5dGVzIG5vdCBlcXVhbCB0byBtaW51cyBvbmUgdGhhbiBjb3B5IGNweV9udW0tMSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgogICAgRnJvbSBsYXN0IGl0ZW0gY29weSBjcHlfbnVtIGJ5dGVzIGZvciByZWd1bGFyIGl0ZW0gYW5kIGNweV9udW0gZGlyZWN0b3J5IGVudHJpZXMgZm9yCiAgICBkaXJlY3RvcnkgaXRlbS4gKi8KLXN0YXRpYyBpbnQgbGVhZl9jb3B5X2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwKLQkJCSAgICBpbnQgY3B5X2J5dGVzKQorc3RhdGljIGludCBsZWFmX2NvcHlfaXRlbXMoc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNyYywKKwkJCSAgIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwgaW50IGNweV9ieXRlcykKIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdDsKLSAgaW50IHBvcywgaSwgc3JjX25yX2l0ZW0sIGJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVzdDsKKwlpbnQgcG9zLCBpLCBzcmNfbnJfaXRlbSwgYnl0ZXM7CiAKLSAgZGVzdCA9IGRlc3RfYmktPmJpX2JoOwotICBSRkFMU0UoICFkZXN0IHx8ICFzcmMsICJ2cy0xMDIxMDogIWRlc3QgfHwgIXNyYyIpOwotICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCi0JICAidnMtMTAyMjA6bGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCIpOwotICBSRkFMU0UoIEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCi0JICAidnMtMTAyMzA6IE5vIGVub3VnaCBpdGVtczogJWQsIHJlcS4gJWQiLCBCX05SX0lURU1TKHNyYyksIGNweV9udW0pOwotICBSRkFMU0UoIGNweV9udW0gPCAwLCJ2cy0xMDI0MDogY3B5X251bSA8IDAgKCVkKSIsIGNweV9udW0pOworCWRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKwlSRkFMU0UoIWRlc3QgfHwgIXNyYywgInZzLTEwMjEwOiAhZGVzdCB8fCAhc3JjIik7CisJUkZBTFNFKGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCisJICAgICAgICJ2cy0xMDIyMDpsYXN0X2ZpcnN0ICE9IEZJUlNUX1RPX0xBU1QgJiYgbGFzdF9maXJzdCAhPSBMQVNUX1RPX0ZJUlNUIik7CisJUkZBTFNFKEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCisJICAgICAgICJ2cy0xMDIzMDogTm8gZW5vdWdoIGl0ZW1zOiAlZCwgcmVxLiAlZCIsIEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgICAgY3B5X251bSk7CisJUkZBTFNFKGNweV9udW0gPCAwLCAidnMtMTAyNDA6IGNweV9udW0gPCAwICglZCkiLCBjcHlfbnVtKTsKIAotIGlmICggY3B5X251bSA9PSAwICkKLSAgIHJldHVybiAwOwotIAotIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgewotICAgLyogY29weSBpdGVtcyB0byBsZWZ0ICovCi0gICBwb3MgPSAwOwotICAgaWYgKCBjcHlfbnVtID09IDEgKQotICAgICBieXRlcyA9IGNweV9ieXRlczsKLSAgIGVsc2UKLSAgICAgYnl0ZXMgPSAtMTsKLSAgIAotICAgLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLwotICAgaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGJ5dGVzKTsKLSAgIGNweV9udW0gLT0gaTsKLSAgIGlmICggY3B5X251bSA9PSAwICkKLSAgICAgcmV0dXJuIGk7Ci0gICBwb3MgKz0gaTsKLSAgIGlmICggY3B5X2J5dGVzID09IC0xICkKLSAgICAgLyogY29weSBmaXJzdCBjcHlfbnVtIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcycgb2YgU09VUkNFIHRvIGVuZCBvZiBERVNUICovCi0gICAgIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBwb3MsIGNweV9udW0pOwotICAgZWxzZSB7Ci0gICAgIC8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KLSAgICAgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIHBvcywgY3B5X251bS0xKTsKLQkgICAgIAotICAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGl0ZW0gd2hpY2ggbnVtYmVyIGlzIGNweV9udW0rcG9zLTEgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAqLwotICAgICBsZWFmX2l0ZW1fYm90dGxlIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGNweV9udW0rcG9zLTEsIGNweV9ieXRlcyk7Ci0gICB9IAotIH0gZWxzZSB7Ci0gICAvKiBjb3B5IGl0ZW1zIHRvIHJpZ2h0ICovCi0gICBzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMgKHNyYyk7Ci0gICBpZiAoIGNweV9udW0gPT0gMSApCi0gICAgIGJ5dGVzID0gY3B5X2J5dGVzOwotICAgZWxzZQotICAgICBieXRlcyA9IC0xOwotICAgCi0gICAvKiBjb3B5IHRoZSBsYXN0IGl0ZW0gb3IgaXQgcGFydCBvciBub3RoaW5nIHRvIHRoZSBiZWdpbiBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDEsYnl0ZXMpKTsgKi8KLSAgIGkgPSBsZWFmX2NvcHlfYm91bmRhcnlfaXRlbSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7Ci0gICAKLSAgIGNweV9udW0gLT0gaTsKLSAgIGlmICggY3B5X251bSA9PSAwICkKLSAgICAgcmV0dXJuIGk7Ci0gICAKLSAgIHBvcyA9IHNyY19ucl9pdGVtIC0gY3B5X251bSAtIGk7Ci0gICBpZiAoIGNweV9ieXRlcyA9PSAtMSApIHsKLSAgICAgLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLwotICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfbnVtKTsKLSAgIH0gZWxzZSB7Ci0gICAgIC8qIGNvcHkgbGFzdCBjcHlfbnVtLTEgaXRlbXMgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zKzEnIG9mIHRoZSBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUOyAqLwotICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zKzEsIGNweV9udW0tMSk7CisJaWYgKGNweV9udW0gPT0gMCkKKwkJcmV0dXJuIDA7CiAKLSAgICAgLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCi0gICAgIGxlYWZfaXRlbV9ib3R0bGUgKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLCBjcHlfYnl0ZXMpOwotICAgfQotIH0KLSByZXR1cm4gaTsKKwlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CisJCS8qIGNvcHkgaXRlbXMgdG8gbGVmdCAqLworCQlwb3MgPSAwOworCQlpZiAoY3B5X251bSA9PSAxKQorCQkJYnl0ZXMgPSBjcHlfYnl0ZXM7CisJCWVsc2UKKwkJCWJ5dGVzID0gLTE7CisKKwkJLyogY29weSB0aGUgZmlyc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAoaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtKERFU1QsU09VUkNFLDAsYnl0ZXMpKSAqLworCQlpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oZGVzdF9iaSwgc3JjLCBGSVJTVF9UT19MQVNULCBieXRlcyk7CisJCWNweV9udW0gLT0gaTsKKwkJaWYgKGNweV9udW0gPT0gMCkKKwkJCXJldHVybiBpOworCQlwb3MgKz0gaTsKKwkJaWYgKGNweV9ieXRlcyA9PSAtMSkKKwkJCS8qIGNvcHkgZmlyc3QgY3B5X251bSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MnIG9mIFNPVVJDRSB0byBlbmQgb2YgREVTVCAqLworCQkJbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5KGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwKKwkJCQkJCSBwb3MsIGNweV9udW0pOworCQllbHNlIHsKKwkJCS8qIGNvcHkgZmlyc3QgY3B5X251bS0xIGl0ZW1zIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ3Bvcy0xJyBvZiB0aGUgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIERFU1QgKi8KKwkJCWxlYWZfY29weV9pdGVtc19lbnRpcmVseShkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsCisJCQkJCQkgcG9zLCBjcHlfbnVtIC0gMSk7CisKKwkJCS8qIGNvcHkgcGFydCBvZiB0aGUgaXRlbSB3aGljaCBudW1iZXIgaXMgY3B5X251bStwb3MtMSB0byB0aGUgZW5kIG9mIHRoZSBERVNUICovCisJCQlsZWFmX2l0ZW1fYm90dGxlKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwKKwkJCQkJIGNweV9udW0gKyBwb3MgLSAxLCBjcHlfYnl0ZXMpOworCQl9CisJfSBlbHNlIHsKKwkJLyogY29weSBpdGVtcyB0byByaWdodCAqLworCQlzcmNfbnJfaXRlbSA9IEJfTlJfSVRFTVMoc3JjKTsKKwkJaWYgKGNweV9udW0gPT0gMSkKKwkJCWJ5dGVzID0gY3B5X2J5dGVzOworCQllbHNlCisJCQlieXRlcyA9IC0xOworCisJCS8qIGNvcHkgdGhlIGxhc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIChpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oREVTVCxTT1VSQ0UsMSxieXRlcykpOyAqLworCQlpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBieXRlcyk7CisKKwkJY3B5X251bSAtPSBpOworCQlpZiAoY3B5X251bSA9PSAwKQorCQkJcmV0dXJuIGk7CisKKwkJcG9zID0gc3JjX25yX2l0ZW0gLSBjcHlfbnVtIC0gaTsKKwkJaWYgKGNweV9ieXRlcyA9PSAtMSkgeworCQkJLyogc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBjb3B5IGxhc3QgY3B5X251bSBpdGVtcyBvZiBTT1VSQ0UgdG8gYmVnaW4gb2YgREVTVCAqLworCQkJbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5KGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwKKwkJCQkJCSBwb3MsIGNweV9udW0pOworCQl9IGVsc2UgeworCQkJLyogY29weSBsYXN0IGNweV9udW0tMSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MrMScgb2YgdGhlIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIERFU1Q7ICovCisJCQlsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULAorCQkJCQkJIHBvcyArIDEsIGNweV9udW0gLSAxKTsKKworCQkJLyogY29weSBwYXJ0IG9mIHRoZSBpdGVtIHdoaWNoIG51bWJlciBpcyBwb3MgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUICovCisJCQlsZWFmX2l0ZW1fYm90dGxlKGRlc3RfYmksIHNyYywgTEFTVF9UT19GSVJTVCwgcG9zLAorCQkJCQkgY3B5X2J5dGVzKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKIH0KIAotCiAvKiB0aGVyZSBhcmUgdHlwZXMgb2YgY29waW5nOiBmcm9tIFNbMF0gdG8gTFswXSwgZnJvbSBTWzBdIHRvIFJbMF0sCiAgICBmcm9tIFJbMF0gdG8gTFswXS4gZm9yIGVhY2ggb2YgdGhlc2Ugd2UgaGF2ZSB0byBkZWZpbmUgcGFyZW50IGFuZAogICAgcG9zaXRpb25zIG9mIGRlc3RpbmF0aW9uIGFuZCBzb3VyY2UgYnVmZmVycyAqLwotc3RhdGljIHZvaWQgbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksCi0JCQkJCXN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwgaW50ICogZmlyc3RfbGFzdCwKLQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK3N0YXRpYyB2b2lkIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwKKwkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9pbmZvICpkZXN0X2JpLAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2luZm8gKnNyY19iaSwKKwkJCQkgICAgICAgaW50ICpmaXJzdF9sYXN0LAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNuZXcpCiB7Ci0gICAgbWVtc2V0IChkZXN0X2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOwotICAgIG1lbXNldCAoc3JjX2JpLCAwLCBzaXplb2YgKHN0cnVjdCBidWZmZXJfaW5mbykpOworCW1lbXNldChkZXN0X2JpLCAwLCBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisJbWVtc2V0KHNyY19iaSwgMCwgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaW5mbykpOwogCi0gICAgLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KLSAgICBzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKLSAgICBjYXNlIExFQUZfRlJPTV9TX1RPX0w6ICAgIC8qIGl0IGlzIHVzZWQgaW4gbGVhZl9zaGlmdF9sZWZ0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOwkvKiBzcmMtPmJfaXRlbV9vcmRlciAqLwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOwotCSpmaXJzdF9sYXN0ID0gRklSU1RfVE9fTEFTVDsKLQlicmVhazsKKwkvKiBkZWZpbmUgZGVzdCwgc3JjLCBkZXN0IHBhcmVudCwgZGVzdCBwb3NpdGlvbiAqLworCXN3aXRjaCAoc2hpZnRfbW9kZSkgeworCWNhc2UgTEVBRl9GUk9NX1NfVE9fTDoJLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X2xlZnQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApOwkvKiBzcmMtPmJfaXRlbV9vcmRlciAqLworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkqZmlyc3RfbGFzdCA9IEZJUlNUX1RPX0xBU1Q7CisJCWJyZWFrOwogCi0gICAgY2FzZSBMRUFGX0ZST01fU19UT19SOiAgLyogaXQgaXMgdXNlZCBpbiBsZWFmX3NoaWZ0X3JpZ2h0ICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIDApOwotCWRlc3RfYmktPnRiID0gdGI7Ci0JZGVzdF9iaS0+YmlfYmggPSB0Yi0+UlswXTsKLQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07Ci0JZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7Ci0JYnJlYWs7CisJY2FzZSBMRUFGX0ZST01fU19UT19SOgkvKiBpdCBpcyB1c2VkIGluIGxlYWZfc2hpZnRfcmlnaHQgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIodGItPnRiX3BhdGgpOworCQlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKTsKKwkJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIDApOworCQlkZXN0X2JpLT50YiA9IHRiOworCQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SWzBdOworCQlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOworCQlicmVhazsKIAotICAgIGNhc2UgTEVBRl9GUk9NX1JfVE9fTDogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSB0Yi0+UlswXTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOwotCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOwotCWJyZWFrOwotICAgIAotICAgIGNhc2UgTEVBRl9GUk9NX0xfVE9fUjogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCi0Jc3JjX2JpLT50YiA9IHRiOwotCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKLQlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKLQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKLQlkZXN0X2JpLT50YiA9IHRiOwotCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOwotCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7Ci0JKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOwotCWJyZWFrOworCWNhc2UgTEVBRl9GUk9NX1JfVE9fTDoJLyogaXQgaXMgdXNlZCBpbiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUgKi8KKwkJc3JjX2JpLT50YiA9IHRiOworCQlzcmNfYmktPmJpX2JoID0gdGItPlJbMF07CisJCXNyY19iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJZGVzdF9iaS0+dGIgPSB0YjsKKwkJZGVzdF9iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMWzBdOworCQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uKHRiLCAwKTsKKwkJKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOworCQlicmVhazsKIAotICAgIGNhc2UgTEVBRl9GUk9NX1NfVE9fU05FVzoKLQlzcmNfYmktPnRiID0gdGI7Ci0Jc3JjX2JpLT5iaV9iaCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0Jc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOwotCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCk7Ci0JZGVzdF9iaS0+dGIgPSB0YjsKLQlkZXN0X2JpLT5iaV9iaCA9IFNuZXc7Ci0JZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKLQlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IDA7Ci0JKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOwotCWJyZWFrOwotICAgIAotICAgIGRlZmF1bHQ6Ci0JcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy0xMDI1MDogbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3M6IHNoaWZ0IHR5cGUgaXMgdW5rbm93biAoJWQpIiwgc2hpZnRfbW9kZSk7Ci0gICAgfQotICAgIFJGQUxTRSggc3JjX2JpLT5iaV9iaCA9PSAwIHx8IGRlc3RfYmktPmJpX2JoID09IDAsCi0JICAgICJ2cy0xMDI2MDogbW9kZT09JWQsIHNvdXJjZSAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgaW5jb3JyZWN0bHkiLAotCSAgICBzaGlmdF9tb2RlLCBzcmNfYmktPmJpX2JoLCBkZXN0X2JpLT5iaV9iaCk7CisJY2FzZSBMRUFGX0ZST01fTF9UT19SOgkvKiBpdCBpcyB1c2VkIGluIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAqLworCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwkJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCXNyY19iaS0+YmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbih0YiwgMCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07CisJCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24odGIsIDApOworCQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJCWJyZWFrOworCisJY2FzZSBMRUFGX0ZST01fU19UT19TTkVXOgorCQlzcmNfYmktPnRiID0gdGI7CisJCXNyY19iaS0+YmlfYmggPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApOworCQlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgMCk7CisJCWRlc3RfYmktPnRiID0gdGI7CisJCWRlc3RfYmktPmJpX2JoID0gU25ldzsKKwkJZGVzdF9iaS0+YmlfcGFyZW50ID0gTlVMTDsKKwkJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSAwOworCQkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtMTAyNTA6IGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zOiBzaGlmdCB0eXBlIGlzIHVua25vd24gKCVkKSIsCisJCQkgICAgICAgc2hpZnRfbW9kZSk7CisJfQorCVJGQUxTRShzcmNfYmktPmJpX2JoID09IDAgfHwgZGVzdF9iaS0+YmlfYmggPT0gMCwKKwkgICAgICAgInZzLTEwMjYwOiBtb2RlPT0lZCwgc291cmNlICglcCkgb3IgZGVzdCAoJXApIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBpbmNvcnJlY3RseSIsCisJICAgICAgIHNoaWZ0X21vZGUsIHNyY19iaS0+YmlfYmgsIGRlc3RfYmktPmJpX2JoKTsKIH0KIAotCi0KLQogLyogY29weSBtb3ZfbnVtIGl0ZW1zIGFuZCBtb3ZfYnl0ZXMgb2YgdGhlIChtb3ZfbnVtLTEpdGggaXRlbSB0bwogICAgbmVpZ2hib3IuIERlbGV0ZSB0aGVtIGZyb20gc291cmNlICovCi1pbnQgbGVhZl9tb3ZlX2l0ZW1zIChpbnQgc2hpZnRfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbW92X251bSwgaW50IG1vdl9ieXRlcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK2ludCBsZWFmX21vdmVfaXRlbXMoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgbW92X251bSwKKwkJICAgIGludCBtb3ZfYnl0ZXMsIHN0cnVjdCBidWZmZXJfaGVhZCAqU25ldykKIHsKLSAgaW50IHJldF92YWx1ZTsKLSAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKLSAgaW50IGZpcnN0X2xhc3Q7CisJaW50IHJldF92YWx1ZTsKKwlzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworCWludCBmaXJzdF9sYXN0OwogCi0gIGxlYWZfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zIChzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksICZmaXJzdF9sYXN0LCBTbmV3KTsKKwlsZWFmX2RlZmluZV9kZXN0X3NyY19pbmZvcyhzaGlmdF9tb2RlLCB0YiwgJmRlc3RfYmksICZzcmNfYmksCisJCQkJICAgJmZpcnN0X2xhc3QsIFNuZXcpOwogCi0gIHJldF92YWx1ZSA9IGxlYWZfY29weV9pdGVtcyAoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwgbW92X2J5dGVzKTsKKwlyZXRfdmFsdWUgPQorCSAgICBsZWFmX2NvcHlfaXRlbXMoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwKKwkJCSAgICBtb3ZfYnl0ZXMpOwogCi0gIGxlYWZfZGVsZXRlX2l0ZW1zICgmc3JjX2JpLCBmaXJzdF9sYXN0LCAoZmlyc3RfbGFzdCA9PSBGSVJTVF9UT19MQVNUKSA/IDAgOiAoQl9OUl9JVEVNUyhzcmNfYmkuYmlfYmgpIC0gbW92X251bSksIG1vdl9udW0sIG1vdl9ieXRlcyk7CisJbGVhZl9kZWxldGVfaXRlbXMoJnNyY19iaSwgZmlyc3RfbGFzdCwKKwkJCSAgKGZpcnN0X2xhc3QgPT0KKwkJCSAgIEZJUlNUX1RPX0xBU1QpID8gMCA6IChCX05SX0lURU1TKHNyY19iaS5iaV9iaCkgLQorCQkJCQkJIG1vdl9udW0pLCBtb3ZfbnVtLCBtb3ZfYnl0ZXMpOwogCi0gIAotICByZXR1cm4gcmV0X3ZhbHVlOworCXJldHVybiByZXRfdmFsdWU7CiB9CiAKLQogLyogU2hpZnQgc2hpZnRfbnVtIGl0ZW1zIChhbmQgc2hpZnRfYnl0ZXMgb2YgbGFzdCBzaGlmdGVkIGl0ZW0gaWYgc2hpZnRfYnl0ZXMgIT0gLTEpCiAgICBmcm9tIFNbMF0gdG8gTFswXSBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLWludCBsZWFmX3NoaWZ0X2xlZnQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQoraW50IGxlYWZfc2hpZnRfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQogewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7Ci0gIGludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqUzAgPSBQQVRIX1BMQVNUX0JVRkZFUih0Yi0+dGJfcGF0aCk7CisJaW50IGk7CiAKLSAgLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLwotICBpID0gbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19MLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CisJLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcyBieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIGxlZnQgbmVpZ2hib3IgTFswXSAqLworCWkgPSBsZWFmX21vdmVfaXRlbXMoTEVBRl9GUk9NX1NfVE9fTCwgdGIsIHNoaWZ0X251bSwgc2hpZnRfYnl0ZXMsIE5VTEwpOwogCi0gIGlmICggc2hpZnRfbnVtICkgewotICAgIGlmIChCX05SX0lURU1TIChTMCkgPT0gMCkgeyAvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1swXSA9PSAwICovCisJaWYgKHNoaWZ0X251bSkgeworCQlpZiAoQl9OUl9JVEVNUyhTMCkgPT0gMCkgewkvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1swXSA9PSAwICovCiAKLSAgICAgIFJGQUxTRSggc2hpZnRfYnl0ZXMgIT0gLTEsCi0JICAgICAgInZzLTEwMjcwOiBTMCBpcyBlbXB0eSBub3csIGJ1dCBzaGlmdF9ieXRlcyAhPSAtMSAoJWQpIiwgCi0JICAgICAgc2hpZnRfYnl0ZXMpOworCQkJUkZBTFNFKHNoaWZ0X2J5dGVzICE9IC0xLAorCQkJICAgICAgICJ2cy0xMDI3MDogUzAgaXMgZW1wdHkgbm93LCBidXQgc2hpZnRfYnl0ZXMgIT0gLTEgKCVkKSIsCisJCQkgICAgICAgc2hpZnRfYnl0ZXMpOwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgICAgaWYgKHRiLT50Yl9tb2RlID09IE1fUEFTVEUgfHwgdGItPnRiX21vZGUgPT0gTV9JTlNFUlQpIHsKLQlwcmludF9jdXJfdGIgKCJ2cy0xMDI3NSIpOwotCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy0xMDI3NTogbGVhZl9zaGlmdF9sZWZ0OiBiYWxhbmNlIGNvbmRpdGlvbiBjb3JydXB0ZWQgKCVjKSIsIHRiLT50Yl9tb2RlKTsKLSAgICAgIH0KKwkJCWlmICh0Yi0+dGJfbW9kZSA9PSBNX1BBU1RFIHx8IHRiLT50Yl9tb2RlID09IE1fSU5TRVJUKSB7CisJCQkJcHJpbnRfY3VyX3RiKCJ2cy0xMDI3NSIpOworCQkJCXJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwKKwkJCQkJICAgICAgICJ2cy0xMDI3NTogbGVhZl9zaGlmdF9sZWZ0OiBiYWxhbmNlIGNvbmRpdGlvbiBjb3JydXB0ZWQgKCVjKSIsCisJCQkJCSAgICAgICB0Yi0+dGJfbW9kZSk7CisJCQl9CiAjZW5kaWYKIAotICAgICAgaWYgKFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpID09IDApCi0JcmVwbGFjZV9rZXkgKHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwgMCk7CisJCQlpZiAoUEFUSF9IX1BPU0lUSU9OKHRiLT50Yl9wYXRoLCAxKSA9PSAwKQorCQkJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwKKwkJCQkJICAgIFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCAwKSwgMCk7CiAKLSAgICB9IGVsc2UgeyAgICAgCi0gICAgICAvKiByZXBsYWNlIGxrZXkgaW4gQ0ZMWzBdIGJ5IDAtdGgga2V5IGZyb20gU1swXTsgKi8KLSAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKLSAgICAgIAotICAgICAgUkZBTFNFKCAoc2hpZnRfYnl0ZXMgIT0gLTEgJiYKLSAgICAgICAgICAgICAgIShpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkKLSAgICAgICAgICAgICAgICAmJiAhSV9FTlRSWV9DT1VOVCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkpKSAmJgotCSAgICAgICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKEJfTl9QS0VZIChTMCwgMCksIFMwLT5iX3NpemUpKSwKLQkgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHJldHVybiBpOworCQl9IGVsc2UgeworCQkJLyogcmVwbGFjZSBsa2V5IGluIENGTFswXSBieSAwLXRoIGtleSBmcm9tIFNbMF07ICovCisJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKKworCQkJUkZBTFNFKChzaGlmdF9ieXRlcyAhPSAtMSAmJgorCQkJCSEoaXNfZGlyZW50cnlfbGVfaWgoQl9OX1BJVEVNX0hFQUQoUzAsIDApKQorCQkJCSAgJiYgIUlfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQoUzAsIDApKSkpICYmCisJCQkgICAgICAgKCFvcF9pc19sZWZ0X21lcmdlYWJsZQorCQkJCShCX05fUEtFWShTMCwgMCksIFMwLT5iX3NpemUpKSwKKwkJCSAgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKKwkJfQorCX0KKworCXJldHVybiBpOwogfQogCi0KLQotCi0KIC8qIENMRUFOSU5HIFNUT1BQRUQgSEVSRSAqLwogCi0KLQotCiAvKiBTaGlmdCBzaGlmdF9udW0gKHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yLCBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KLWludAlsZWFmX3NoaWZ0X3JpZ2h0KAotCQlzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAotCQlpbnQgc2hpZnRfbnVtLAotCQlpbnQgc2hpZnRfYnl0ZXMKLQkpCitpbnQgbGVhZl9zaGlmdF9yaWdodChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKQogewotICAvLyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOwotICBpbnQgcmV0X3ZhbHVlOworCS8vICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisJaW50IHJldF92YWx1ZTsKIAotICAvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gcmlnaHQgbmVpZ2hib3IgUlswXSAqLwotICByZXRfdmFsdWUgPSBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1IsIHRiLCBzaGlmdF9udW0sIHNoaWZ0X2J5dGVzLCBOVUxMKTsKKwkvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gcmlnaHQgbmVpZ2hib3IgUlswXSAqLworCXJldF92YWx1ZSA9CisJICAgIGxlYWZfbW92ZV9pdGVtcyhMRUFGX0ZST01fU19UT19SLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CiAKLSAgLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCi0gIGlmIChzaGlmdF9udW0pIHsKLSAgICByZXBsYWNlX2tleSAodGIsIHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdLCB0Yi0+UlswXSwgMCk7CisJLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCisJaWYgKHNoaWZ0X251bSkgeworCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSwgdGItPnJrZXlbMF0sIHRiLT5SWzBdLCAwKTsKIAotICB9CisJfQogCi0gIHJldHVybiByZXRfdmFsdWU7CisJcmV0dXJuIHJldF92YWx1ZTsKIH0KIAotCi0KLXN0YXRpYyB2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwKLQkJCQkJaW50IGZpcnN0LCBpbnQgZGVsX251bSk7CitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLAorCQkJCSAgICAgICBpbnQgZmlyc3QsIGludCBkZWxfbnVtKTsKIC8qICBJZiBkZWxfYnl0ZXMgPT0gLTEsIHN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ2ZpcnN0JyBkZWxldGUgZGVsX251bSBpdGVtcyBpbiB3aG9sZSBpbiBidWZmZXIgQ1VSLgogICAgIElmIG5vdC4gCiAgICAgSWYgbGFzdF9maXJzdCA9PSAwLiBTdGFydGluZyBmcm9tIHBvc2l0aW9uICdmaXJzdCcgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgpAQCAtNjcwLDI4NyArNzMxLDI5MiBAQAogICAgIElmIGxhc3RfZmlyc3QgPT0gMS4gU3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAnZmlyc3QrMScgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgogICAgIHRoZSBsYXN0IGl0ZW0gLiBQYXJ0IGRlZmluZWQgYnkgZGVsX2J5dGVzLiBEb24ndCBkZWxldGUgbGFzdCBpdGVtIGhlYWRlci4KICovCi12b2lkIGxlYWZfZGVsZXRlX2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIGludCBsYXN0X2ZpcnN0LCAKLQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCit2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zKHN0cnVjdCBidWZmZXJfaW5mbyAqY3VyX2JpLCBpbnQgbGFzdF9maXJzdCwKKwkJICAgICAgIGludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgaW50IGl0ZW1fYW1vdW50ID0gQl9OUl9JVEVNUyAoYmggPSBjdXJfYmktPmJpX2JoKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBpdGVtX2Ftb3VudCA9IEJfTlJfSVRFTVMoYmggPSBjdXJfYmktPmJpX2JoKTsKIAotICAgIFJGQUxTRSggIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7Ci0gICAgUkZBTFNFKCBkZWxfbnVtIDwgMCwgIjEwMTYwOiBkZWxfbnVtIGNhbiBub3QgYmUgPCAwLiBkZWxfbnVtPT0lZCIsIGRlbF9udW0pOwotICAgIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IGl0ZW1fYW1vdW50LAotCSAgICAiMTAxNjU6IGludmFsaWQgbnVtYmVyIG9mIGZpcnN0IGl0ZW0gdG8gYmUgZGVsZXRlZCAoJWQpIG9yICIKLQkgICAgIm5vIHNvIG11Y2ggaXRlbXMgKCVkKSB0byBkZWxldGUgKG9ubHkgJWQpIiwgCi0JICAgIGZpcnN0LCBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKKwlSRkFMU0UoIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7CisJUkZBTFNFKGRlbF9udW0gPCAwLCAiMTAxNjA6IGRlbF9udW0gY2FuIG5vdCBiZSA8IDAuIGRlbF9udW09PSVkIiwKKwkgICAgICAgZGVsX251bSk7CisJUkZBTFNFKGZpcnN0IDwgMAorCSAgICAgICB8fCBmaXJzdCArIGRlbF9udW0gPiBpdGVtX2Ftb3VudCwKKwkgICAgICAgIjEwMTY1OiBpbnZhbGlkIG51bWJlciBvZiBmaXJzdCBpdGVtIHRvIGJlIGRlbGV0ZWQgKCVkKSBvciAiCisJICAgICAgICJubyBzbyBtdWNoIGl0ZW1zICglZCkgdG8gZGVsZXRlIChvbmx5ICVkKSIsIGZpcnN0LAorCSAgICAgICBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKIAotICAgIGlmICggZGVsX251bSA9PSAwICkKLQlyZXR1cm47CisJaWYgKGRlbF9udW0gPT0gMCkKKwkJcmV0dXJuOwogCi0gICAgaWYgKCBmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gaXRlbV9hbW91bnQgJiYgZGVsX2J5dGVzID09IC0xICkgewotCW1ha2VfZW1wdHlfbm9kZSAoY3VyX2JpKTsKLQlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoY3VyX2JpLT50YiwgYmgsIDApOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIGRlbF9ieXRlcyA9PSAtMSApCi0JLyogZGVsZXRlIGRlbF9udW0gaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCAqLwotCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChjdXJfYmksIGZpcnN0LCBkZWxfbnVtKTsKLSAgICBlbHNlIHsKLQlpZiAoIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCApIHsKLQkgICAgLyogZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICAqLwotCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCwgZGVsX251bS0xKTsKLQotCSAgICAvKiBkZWxldGUgdGhlIHBhcnQgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIGJoCi0JICAgICAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKLQkgICAgKi8KLQkgICAgbGVhZl9jdXRfZnJvbV9idWZmZXIgKGN1cl9iaSwgMCwgMCwgZGVsX2J5dGVzKTsKLQl9IGVsc2UgIHsKLQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotCSAgICBpbnQgbGVuOwotCi0JICAgIC8qIGRlbGV0ZSBkZWxfbnVtLTEgaXRlbXMgYmVnaW5uaW5nIGZyb20gaXRlbSBpbiBwb3NpdGlvbiBmaXJzdCsxICAqLwotCSAgICBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoY3VyX2JpLCBmaXJzdCsxLCBkZWxfbnVtLTEpOwotCi0JICAgIGlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCktMSkpKSAJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCi0JICAgICAgICAvKiBsZW4gPSBudW1iZXJzIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGluIHRoaXMgaXRlbSAqLwotCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7Ci0JICAgIGVsc2UKLQkgICAgICAgIC8qIGxlbiA9IGJvZHkgbGVuIG9mIGl0ZW0gKi8KLQkJbGVuID0gaWhfaXRlbV9sZW4oaWgpOwotCi0JICAgIC8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgbGFzdCBpdGVtIG9mIHRoZSBiaCAKLQkgICAgICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgotCSAgICAqLwotCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoY3VyX2JpLCBCX05SX0lURU1TKGJoKS0xLCBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBpdGVtX2Ftb3VudCAmJiBkZWxfYnl0ZXMgPT0gLTEpIHsKKwkJbWFrZV9lbXB0eV9ub2RlKGN1cl9iaSk7CisJCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGN1cl9iaS0+dGIsIGJoLCAwKTsKKwkJcmV0dXJuOwogCX0KLSAgICB9Ci19CiAKKwlpZiAoZGVsX2J5dGVzID09IC0xKQorCQkvKiBkZWxldGUgZGVsX251bSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICovCisJCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5KGN1cl9iaSwgZmlyc3QsIGRlbF9udW0pOworCWVsc2UgeworCQlpZiAobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSB7CisJCQkvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QgICovCisJCQlsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShjdXJfYmksIGZpcnN0LCBkZWxfbnVtIC0gMSk7CisKKwkJCS8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgZmlyc3QgaXRlbSBvZiB0aGUgYmgKKwkJCSAgIGRvIG5vdCBkZWxldGUgaXRlbSBoZWFkZXIKKwkJCSAqLworCQkJbGVhZl9jdXRfZnJvbV9idWZmZXIoY3VyX2JpLCAwLCAwLCBkZWxfYnl0ZXMpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJCQlpbnQgbGVuOworCisJCQkvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QrMSAgKi8KKwkJCWxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5KGN1cl9iaSwgZmlyc3QgKyAxLAorCQkJCQkJICAgZGVsX251bSAtIDEpOworCisJCQlpZiAoaXNfZGlyZW50cnlfbGVfaWgKKwkJCSAgICAoaWggPSBCX05fUElURU1fSEVBRChiaCwgQl9OUl9JVEVNUyhiaCkgLSAxKSkpCisJCQkJLyogdGhlIGxhc3QgaXRlbSBpcyBkaXJlY3RvcnkgICovCisJCQkJLyogbGVuID0gbnVtYmVycyBvZiBkaXJlY3RvcnkgZW50cmllcyBpbiB0aGlzIGl0ZW0gKi8KKwkJCQlsZW4gPSBpaF9lbnRyeV9jb3VudChpaCk7CisJCQllbHNlCisJCQkJLyogbGVuID0gYm9keSBsZW4gb2YgaXRlbSAqLworCQkJCWxlbiA9IGloX2l0ZW1fbGVuKGloKTsKKworCQkJLyogZGVsZXRlIHRoZSBwYXJ0IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJoIAorCQkJICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgorCQkJICovCisJCQlsZWFmX2N1dF9mcm9tX2J1ZmZlcihjdXJfYmksIEJfTlJfSVRFTVMoYmgpIC0gMSwKKwkJCQkJICAgICBsZW4gLSBkZWxfYnl0ZXMsIGRlbF9ieXRlcyk7CisJCX0KKwl9Cit9CiAKIC8qIGluc2VydCBpdGVtIGludG8gdGhlIGxlYWYgbm9kZSBpbiBwb3NpdGlvbiBiZWZvcmUgKi8KLXZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgYmVmb3JlLAotCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkX2l0ZW1faWgsCi0JCQkgICBjb25zdCBjaGFyICogaW5zZXJ0ZWRfaXRlbV9ib2R5LAotCQkJICAgaW50IHplcm9zX251bWJlcikKK3ZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGJlZm9yZSwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWRfaXRlbV9paCwKKwkJCSAgY29uc3QgY2hhciAqaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpbnQgemVyb3NfbnVtYmVyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBpOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7Ci0gICAgY2hhciAqIHRvOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaS0+YmlfYmg7CisJaW50IG5yLCBmcmVlX3NwYWNlOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBpOworCWludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisJY2hhciAqdG87CiAKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJZnJlZV9zcGFjZSA9IGJsa2hfZnJlZV9zcGFjZShibGtoKTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKCBibGtoICk7CisJLyogY2hlY2sgZnJlZSBzcGFjZSAqLworCVJGQUxTRShmcmVlX3NwYWNlIDwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgKyBJSF9TSVpFLAorCSAgICAgICAidnMtMTAxNzA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBpbiBibG9jayAleiwgbmV3IGl0ZW0gJWgiLAorCSAgICAgICBiaCwgaW5zZXJ0ZWRfaXRlbV9paCk7CisJUkZBTFNFKHplcm9zX251bWJlciA+IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpLAorCSAgICAgICAidnMtMTAxNzI6IHplcm8gbnVtYmVyID09ICVkLCBpdGVtIGxlbmd0aCA9PSAlZCIsCisJICAgICAgIHplcm9zX251bWJlciwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpOwogCi0gICAgLyogY2hlY2sgZnJlZSBzcGFjZSAqLwotICAgIFJGQUxTRSggZnJlZV9zcGFjZSA8IGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpICsgSUhfU0laRSwKLSAgICAgICAgICAgICJ2cy0xMDE3MDogbm90IGVub3VnaCBmcmVlIHNwYWNlIGluIGJsb2NrICV6LCBuZXcgaXRlbSAlaCIsCi0gICAgICAgICAgICBiaCwgaW5zZXJ0ZWRfaXRlbV9paCk7Ci0gICAgUkZBTFNFKCB6ZXJvc19udW1iZXIgPiBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSwKLQkgICAgInZzLTEwMTcyOiB6ZXJvIG51bWJlciA9PSAlZCwgaXRlbSBsZW5ndGggPT0gJWQiLAotICAgICAgICAgICAgemVyb3NfbnVtYmVyLCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSk7CisJLyogZ2V0IGl0ZW0gbmV3IGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBiZWZvcmUgKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBiZWZvcmUpOwogCisJLyogcHJlcGFyZSBzcGFjZSBmb3IgdGhlIGJvZHkgb2YgbmV3IGl0ZW0gKi8KKwlsYXN0X2xvYyA9IG5yID8gaWhfbG9jYXRpb24oJihpaFtuciAtIGJlZm9yZSAtIDFdKSkgOiBiaC0+Yl9zaXplOworCXVubW92ZWRfbG9jID0gYmVmb3JlID8gaWhfbG9jYXRpb24oaWggLSAxKSA6IGJoLT5iX3NpemU7CiAKLSAgICAvKiBnZXQgaXRlbSBuZXcgaXRlbSBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSAqLwotICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBiZWZvcmUpOworCW1lbW1vdmUoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksCisJCWJoLT5iX2RhdGEgKyBsYXN0X2xvYywgdW5tb3ZlZF9sb2MgLSBsYXN0X2xvYyk7CiAKLSAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciB0aGUgYm9keSBvZiBuZXcgaXRlbSAqLwotICAgIGxhc3RfbG9jID0gbnIgPyBpaF9sb2NhdGlvbiggJihpaFtuciAtIGJlZm9yZSAtIDFdKSApIDogYmgtPmJfc2l6ZTsKLSAgICB1bm1vdmVkX2xvYyA9IGJlZm9yZSA/IGloX2xvY2F0aW9uKCBpaC0xICkgOiBiaC0+Yl9zaXplOworCXRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7CisJbWVtc2V0KHRvLCAwLCB6ZXJvc19udW1iZXIpOworCXRvICs9IHplcm9zX251bWJlcjsKIAorCS8qIGNvcHkgYm9keSB0byBwcmVwYXJlZCBzcGFjZSAqLworCWlmIChpbnNlcnRlZF9pdGVtX2JvZHkpCisJCW1lbW1vdmUodG8sIGluc2VydGVkX2l0ZW1fYm9keSwKKwkJCWloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpIC0gemVyb3NfbnVtYmVyKTsKKwllbHNlCisJCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOwogCi0gICAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksIAotCSAgICAgYmgtPmJfZGF0YSArIGxhc3RfbG9jLCB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKKwkvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KKwltZW1tb3ZlKGloICsgMSwgaWgsIElIX1NJWkUgKiAobnIgLSBiZWZvcmUpKTsKKwltZW1tb3ZlKGloLCBpbnNlcnRlZF9pdGVtX2loLCBJSF9TSVpFKTsKIAotICAgIHRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7Ci0gICAgbWVtc2V0ICh0bywgMCwgemVyb3NfbnVtYmVyKTsKLSAgICB0byArPSB6ZXJvc19udW1iZXI7CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGJlZm9yZTsgaSA8IG5yICsgMTsgaSsrKSB7CisJCXVubW92ZWRfbG9jIC09IGloX2l0ZW1fbGVuKCYoaWhbaSAtIGJlZm9yZV0pKTsKKwkJcHV0X2loX2xvY2F0aW9uKCYoaWhbaSAtIGJlZm9yZV0pLCB1bm1vdmVkX2xvYyk7CisJfQogCi0gICAgLyogY29weSBib2R5IHRvIHByZXBhcmVkIHNwYWNlICovCi0gICAgaWYgKGluc2VydGVkX2l0ZW1fYm9keSkKLQltZW1tb3ZlICh0bywgaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSAtIHplcm9zX251bWJlcik7Ci0gICAgZWxzZQotCW1lbXNldCh0bywgJ1wwJywgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkgLSB6ZXJvc19udW1iZXIpOwotICAKLSAgICAvKiBpbnNlcnQgaXRlbSBoZWFkZXIgKi8KLSAgICBtZW1tb3ZlIChpaCArIDEsIGloLCBJSF9TSVpFICogKG5yIC0gYmVmb3JlKSk7Ci0gICAgbWVtbW92ZSAoaWgsIGluc2VydGVkX2l0ZW1faWgsIElIX1NJWkUpOwotICAKLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gYmVmb3JlOyBpIDwgbnIgKyAxOyBpICsrKQotICAgIHsKLSAgICAgICAgdW5tb3ZlZF9sb2MgLT0gaWhfaXRlbV9sZW4oICYoaWhbaS1iZWZvcmVdKSk7Ci0JcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktYmVmb3JlXSksIHVubW92ZWRfbG9jICk7Ci0gICAgfQotICAKLSAgICAvKiBzaXplcywgZnJlZSBzcGFjZSwgaXRlbSBudW1iZXIgKi8KLSAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxICk7Ci0gICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCApICkgKTsKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMSk7CisJLyogc2l6ZXMsIGZyZWUgc3BhY2UsIGl0ZW0gbnVtYmVyICovCisJc2V0X2Jsa2hfbnJfaXRlbShibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyAxKTsKKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsCisJCQkgICAgZnJlZV9zcGFjZSAtIChJSF9TSVpFICsKKwkJCQkJICBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDEpOwogCi0gICAgaWYgKGJpLT5iaV9wYXJlbnQpIHsgCi0Jc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0JdF9kYyA9IEJfTl9DSElMRCAoYmktPmJpX3BhcmVudCwgYmktPmJpX3Bvc2l0aW9uKTsKLQlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIChJSF9TSVpFICsgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpKTsKLQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7Ci0gICAgfQorCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsCisJCQkgICAgZGNfc2l6ZSh0X2RjKSArIChJSF9TSVpFICsKKwkJCQkJICAgICBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSkpOworCQlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKKwl9CiB9CiAKLQogLyogcGFzdGUgcGFzdGVfc2l6ZSBieXRlcyB0byBhZmZlY3RlZF9pdGVtX251bS10aCBpdGVtLiAKICAgIFdoZW4gaXRlbSBpcyBhIGRpcmVjdG9yeSwgdGhpcyBvbmx5IHByZXBhcmUgc3BhY2UgZm9yIG5ldyBlbnRyaWVzICovCi12b2lkIGxlYWZfcGFzdGVfaW5fYnVmZmVyIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAotCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwKLQkJCSAgIGNvbnN0IGNoYXIgKiBib2R5LAotCQkJICAgaW50IHplcm9zX251bWJlcikKK3ZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGFmZmVjdGVkX2l0ZW1fbnVtLAorCQkJICBpbnQgcG9zX2luX2l0ZW0sIGludCBwYXN0ZV9zaXplLAorCQkJICBjb25zdCBjaGFyICpib2R5LCBpbnQgemVyb3NfbnVtYmVyKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBuciwgZnJlZV9zcGFjZTsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBpOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJpLT5iaV9iaDsKKwlpbnQgbnIsIGZyZWVfc3BhY2U7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IGk7CisJaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOwogCi0KLSAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCi0gICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgcGFzdGVfc2l6ZSwKLSAgICAgICAgICAgICJ2cy0xMDE3NTogbm90IGVub3VnaCBmcmVlIHNwYWNlOiBuZWVkZWQgJWQsIGF2YWlsYWJsZSAlZCIsCi0gICAgICAgICAgICBwYXN0ZV9zaXplLCBmcmVlX3NwYWNlKTsKKwkvKiBjaGVjayBmcmVlIHNwYWNlICovCisJUkZBTFNFKGZyZWVfc3BhY2UgPCBwYXN0ZV9zaXplLAorCSAgICAgICAidnMtMTAxNzU6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZTogbmVlZGVkICVkLCBhdmFpbGFibGUgJWQiLAorCSAgICAgICBwYXN0ZV9zaXplLCBmcmVlX3NwYWNlKTsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGlmICh6ZXJvc19udW1iZXIgPiBwYXN0ZV9zaXplKSB7Ci0JcHJpbnRfY3VyX3RiICgiMTAxNzciKTsKLQlyZWlzZXJmc19wYW5pYyAoIE5VTEwsICJ2cy0xMDE3NzogbGVhZl9wYXN0ZV9pbl9idWZmZXI6IGVybyBudW1iZXIgPT0gJWQsIHBhc3RlX3NpemUgPT0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHplcm9zX251bWJlciwgcGFzdGVfc2l6ZSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLwotCi0KLSAgICAvKiBpdGVtIHRvIGJlIGFwcGVuZGVkICovCi0gICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgYWZmZWN0ZWRfaXRlbV9udW0pOwotCi0gICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGFmZmVjdGVkX2l0ZW1fbnVtIC0gMV0pICk7Ci0gICAgdW5tb3ZlZF9sb2MgPSBhZmZlY3RlZF9pdGVtX251bSA/IGloX2xvY2F0aW9uKCBpaC0xICkgOiBiaC0+Yl9zaXplOwotCi0gICAgLyogcHJlcGFyZSBzcGFjZSAqLwotICAgIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyAtIHBhc3RlX3NpemUsIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywKLQkgICAgIHVubW92ZWRfbG9jIC0gbGFzdF9sb2MpOwotCi0KLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gYWZmZWN0ZWRfaXRlbV9udW07IGkgPCBucjsgaSArKykKLQlwdXRfaWhfbG9jYXRpb24oICYoaWhbaS1hZmZlY3RlZF9pdGVtX251bV0pLAotICAgICAgICAgICAgICAgICAgICBpaF9sb2NhdGlvbiggJihpaFtpLWFmZmVjdGVkX2l0ZW1fbnVtXSkpIC0gcGFzdGVfc2l6ZSApOwotCi0gICAgaWYgKCBib2R5ICkgewotCWlmICghaXNfZGlyZW50cnlfbGVfaWggKGloKSkgewotCSAgICBpZiAoIXBvc19pbl9pdGVtKSB7Ci0JCS8qIHNoaWZ0IGRhdGEgdG8gcmlnaHQgKi8KLQkJbWVtbW92ZSAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIHBhc3RlX3NpemUsIAotCQkJIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCksIGloX2l0ZW1fbGVuKGloKSk7Ci0JCS8qIHBhc3RlIGRhdGEgaW4gdGhlIGhlYWQgb2YgaXRlbSAqLwotCQltZW1zZXQgKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCksIDAsIHplcm9zX251bWJlcik7Ci0JCW1lbWNweSAoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArIHplcm9zX251bWJlciwgYm9keSwgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7Ci0JICAgIH0gZWxzZSB7Ci0JCW1lbXNldCAoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgMCwgemVyb3NfbnVtYmVyKTsKLQkJbWVtY3B5IChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplICsgemVyb3NfbnVtYmVyLCBib2R5LCBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKLQkgICAgfQorCWlmICh6ZXJvc19udW1iZXIgPiBwYXN0ZV9zaXplKSB7CisJCXByaW50X2N1cl90YigiMTAxNzciKTsKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtMTAxNzc6IGxlYWZfcGFzdGVfaW5fYnVmZmVyOiBlcm8gbnVtYmVyID09ICVkLCBwYXN0ZV9zaXplID09ICVkIiwKKwkJCSAgICAgICB6ZXJvc19udW1iZXIsIHBhc3RlX3NpemUpOwogCX0KLSAgICB9Ci0gICAgZWxzZQotCW1lbXNldChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAnXDAnLCBwYXN0ZV9zaXplKTsKKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIGloX2l0ZW1fbGVuKGloKSArIHBhc3RlX3NpemUgKTsKKwkvKiBpdGVtIHRvIGJlIGFwcGVuZGVkICovCisJaWggPSBCX05fUElURU1fSEVBRChiaCwgYWZmZWN0ZWRfaXRlbV9udW0pOwogCi0gICAgLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KLSAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBmcmVlX3NwYWNlIC0gcGFzdGVfc2l6ZSApOworCWxhc3RfbG9jID0gaWhfbG9jYXRpb24oJihpaFtuciAtIGFmZmVjdGVkX2l0ZW1fbnVtIC0gMV0pKTsKKwl1bm1vdmVkX2xvYyA9IGFmZmVjdGVkX2l0ZW1fbnVtID8gaWhfbG9jYXRpb24oaWggLSAxKSA6IGJoLT5iX3NpemU7CiAKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7CisJLyogcHJlcGFyZSBzcGFjZSAqLworCW1lbW1vdmUoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gcGFzdGVfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCQl1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKIAotICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAotCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOwotCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgcGFzdGVfc2l6ZSApOwotCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoYmktPnRiLCBiaS0+YmlfcGFyZW50LCAwKTsKLSAgICB9CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGFmZmVjdGVkX2l0ZW1fbnVtOyBpIDwgbnI7IGkrKykKKwkJcHV0X2loX2xvY2F0aW9uKCYoaWhbaSAtIGFmZmVjdGVkX2l0ZW1fbnVtXSksCisJCQkJaWhfbG9jYXRpb24oJihpaFtpIC0gYWZmZWN0ZWRfaXRlbV9udW1dKSkgLQorCQkJCXBhc3RlX3NpemUpOworCisJaWYgKGJvZHkpIHsKKwkJaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKKwkJCWlmICghcG9zX2luX2l0ZW0pIHsKKwkJCQkvKiBzaGlmdCBkYXRhIHRvIHJpZ2h0ICovCisJCQkJbWVtbW92ZShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKwkJCQkJcGFzdGVfc2l6ZSwKKwkJCQkJYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwKKwkJCQkJaWhfaXRlbV9sZW4oaWgpKTsKKwkJCQkvKiBwYXN0ZSBkYXRhIGluIHRoZSBoZWFkIG9mIGl0ZW0gKi8KKwkJCQltZW1zZXQoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSwgMCwKKwkJCQkgICAgICAgemVyb3NfbnVtYmVyKTsKKwkJCQltZW1jcHkoYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKSArCisJCQkJICAgICAgIHplcm9zX251bWJlciwgYm9keSwKKwkJCQkgICAgICAgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7CisJCQl9IGVsc2UgeworCQkJCW1lbXNldChiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplLCAwLAorCQkJCSAgICAgICB6ZXJvc19udW1iZXIpOworCQkJCW1lbWNweShiaC0+Yl9kYXRhICsgdW5tb3ZlZF9sb2MgLSBwYXN0ZV9zaXplICsKKwkJCQkgICAgICAgemVyb3NfbnVtYmVyLCBib2R5LAorCQkJCSAgICAgICBwYXN0ZV9zaXplIC0gemVyb3NfbnVtYmVyKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQltZW1zZXQoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgJ1wwJywgcGFzdGVfc2l6ZSk7CisKKwlwdXRfaWhfaXRlbV9sZW4oaWgsIGloX2l0ZW1fbGVuKGloKSArIHBhc3RlX3NpemUpOworCisJLyogY2hhbmdlIGZyZWUgc3BhY2UgKi8KKwlzZXRfYmxraF9mcmVlX3NwYWNlKGJsa2gsIGZyZWVfc3BhY2UgLSBwYXN0ZV9zaXplKTsKKworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDApOworCisJaWYgKGJpLT5iaV9wYXJlbnQpIHsKKwkJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPQorCQkgICAgQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgKyBwYXN0ZV9zaXplKTsKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5KGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7CisJfQogfQogCi0KIC8qIGN1dHMgREVMX0NPVU5UIGVudHJpZXMgYmVnaW5uaW5nIGZyb20gRlJPTS10aCBlbnRyeS4gRGlyZWN0b3J5IGl0ZW0KICAgIGRvZXMgbm90IGhhdmUgZnJlZSBzcGFjZSwgc28gaXQgbW92ZXMgREVIcyBhbmQgcmVtYWluaW5nIHJlY29yZHMgYXMKICAgIG5lY2Vzc2FyeS4gUmV0dXJuIHZhbHVlIGlzIHNpemUgb2YgcmVtb3ZlZCBwYXJ0IG9mIGRpcmVjdG9yeSBpdGVtCiAgICBpbiBieXRlcy4gKi8KLXN0YXRpYyBpbnQJbGVhZl9jdXRfZW50cmllcyAoCi0JCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCi0JCQkJc3RydWN0IGl0ZW1faGVhZCAqIGloLCAKLQkJCQlpbnQgZnJvbSwgCi0JCQkJaW50IGRlbF9jb3VudAotCQkJKQorc3RhdGljIGludCBsZWFmX2N1dF9lbnRyaWVzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqaWgsIGludCBmcm9tLCBpbnQgZGVsX2NvdW50KQogewotICBjaGFyICogaXRlbTsKLSAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7Ci0gIGludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLwotICBjaGFyICogcHJldl9yZWNvcmQ7CQkvKiAqLwotICBpbnQgY3V0X3JlY29yZHNfbGVuOwkJLyogbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKi8KLSAgaW50IGk7CisJY2hhciAqaXRlbTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCWludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLworCWNoYXIgKnByZXZfcmVjb3JkOwkvKiAqLworCWludCBjdXRfcmVjb3Jkc19sZW47CS8qIGxlbmd0aCBvZiBhbGwgcmVtb3ZlZCByZWNvcmRzICovCisJaW50IGk7CiAKKwkvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnkgYW5kIHRoZXJlIGFyZSBlbm91Z2ggZW50cmllcyB0bworCSAgIHJlbW92ZSAqLworCVJGQUxTRSghaXNfZGlyZW50cnlfbGVfaWgoaWgpLCAiMTAxODA6IGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtIik7CisJUkZBTFNFKElfRU5UUllfQ09VTlQoaWgpIDwgZnJvbSArIGRlbF9jb3VudCwKKwkgICAgICAgIjEwMTg1OiBpdGVtIGNvbnRhaW5zIG5vdCBlbm91Z2ggZW50cmllczogZW50cnlfY291dCA9ICVkLCBmcm9tID0gJWQsIHRvIGRlbGV0ZSA9ICVkIiwKKwkgICAgICAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CiAKLSAgLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5IGFuZCB0aGVyZSBhcmUgZW5vdWdoIGVudHJpZXMgdG8KLSAgICAgcmVtb3ZlICovCi0gIFJGQUxTRSggIWlzX2RpcmVudHJ5X2xlX2loIChpaCksICIxMDE4MDogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKLSAgUkZBTFNFKCBJX0VOVFJZX0NPVU5UKGloKSA8IGZyb20gKyBkZWxfY291bnQsCi0JICAiMTAxODU6IGl0ZW0gY29udGFpbnMgbm90IGVub3VnaCBlbnRyaWVzOiBlbnRyeV9jb3V0ID0gJWQsIGZyb20gPSAlZCwgdG8gZGVsZXRlID0gJWQiLAotCSAgSV9FTlRSWV9DT1VOVChpaCksIGZyb20sIGRlbF9jb3VudCk7CisJaWYgKGRlbF9jb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKIAotICBpZiAoZGVsX2NvdW50ID09IDApCi0gICAgcmV0dXJuIDA7CisJLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCisJaXRlbSA9IGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCk7CiAKLSAgLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCi0gIGl0ZW0gPSBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpOworCS8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KKwlkZWggPSBCX0lfREVIKGJoLCBpaCk7CiAKLSAgLyogZW50cnkgaGVhZCBhcnJheSAqLwotICBkZWggPSBCX0lfREVIIChiaCwgaWgpOworCS8qIGZpcnN0IGJ5dGUgb2YgcmVtYWluaW5nIGVudHJpZXMsIHRob3NlIGFyZSBCRUZPUkUgY3V0IGVudHJpZXMKKwkgICAocHJldl9yZWNvcmQpIGFuZCBsZW5ndGggb2YgYWxsIHJlbW92ZWQgcmVjb3JkcyAoY3V0X3JlY29yZHNfbGVuKSAqLworCXByZXZfcmVjb3JkX29mZnNldCA9CisJICAgIChmcm9tID8gZGVoX2xvY2F0aW9uKCYoZGVoW2Zyb20gLSAxXSkpIDogaWhfaXRlbV9sZW4oaWgpKTsKKwljdXRfcmVjb3Jkc19sZW4gPSBwcmV2X3JlY29yZF9vZmZzZXQgLypmcm9tX3JlY29yZCAqLyAgLQorCSAgICBkZWhfbG9jYXRpb24oJihkZWhbZnJvbSArIGRlbF9jb3VudCAtIDFdKSk7CisJcHJldl9yZWNvcmQgPSBpdGVtICsgcHJldl9yZWNvcmRfb2Zmc2V0OwogCi0gIC8qIGZpcnN0IGJ5dGUgb2YgcmVtYWluaW5nIGVudHJpZXMsIHRob3NlIGFyZSBCRUZPUkUgY3V0IGVudHJpZXMKLSAgICAgKHByZXZfcmVjb3JkKSBhbmQgbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKGN1dF9yZWNvcmRzX2xlbikgKi8KLSAgcHJldl9yZWNvcmRfb2Zmc2V0ID0gKGZyb20gPyBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gLSAxXSkpIDogaWhfaXRlbV9sZW4oaWgpKTsKLSAgY3V0X3JlY29yZHNfbGVuID0gcHJldl9yZWNvcmRfb2Zmc2V0Lypmcm9tX3JlY29yZCovIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tICsgZGVsX2NvdW50IC0gMV0pKTsKLSAgcHJldl9yZWNvcmQgPSBpdGVtICsgcHJldl9yZWNvcmRfb2Zmc2V0OworCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KKwlmb3IgKGkgPSBJX0VOVFJZX0NPVU5UKGloKSAtIDE7IGkgPiBmcm9tICsgZGVsX2NvdW50IC0gMTsgaS0tKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCZkZWhbaV0pIC0KKwkJCQkgKERFSF9TSVpFICogZGVsX2NvdW50KSk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSsrKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCZkZWhbaV0pIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsKKwkJCQkJCQkgIGN1dF9yZWNvcmRzX2xlbikpOwogCi0gIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KLSAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID4gZnJvbSArIGRlbF9jb3VudCAtIDE7IGkgLS0pCi0gICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmZGVoW2ldICkgLSAoREVIX1NJWkUgKiBkZWxfY291bnQgKSApOworCXB1dF9paF9lbnRyeV9jb3VudChpaCwgaWhfZW50cnlfY291bnQoaWgpIC0gZGVsX2NvdW50KTsKIAotICBmb3IgKGkgPSAwOyBpIDwgZnJvbTsgaSArKykKLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCi0gICAgICAgIGRlaF9sb2NhdGlvbiggJmRlaFtpXSApIC0gKERFSF9TSVpFICogZGVsX2NvdW50ICsgY3V0X3JlY29yZHNfbGVuKSApOworCS8qIHNoaWZ0IGVudHJ5IGhlYWQgYXJyYXkgYW5kIGVudHJpZXMgdGhvc2UgYXJlIEFGVEVSIHJlbW92ZWQgZW50cmllcyAqLworCW1lbW1vdmUoKGNoYXIgKikoZGVoICsgZnJvbSksCisJCWRlaCArIGZyb20gKyBkZWxfY291bnQsCisJCXByZXZfcmVjb3JkIC0gY3V0X3JlY29yZHNfbGVuIC0gKGNoYXIgKikoZGVoICsgZnJvbSArCisJCQkJCQkJIGRlbF9jb3VudCkpOwogCi0gIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSAtIGRlbF9jb3VudCApOworCS8qIHNoaWZ0IHJlY29yZHMsIHRob3NlIGFyZSBCRUZPUkUgcmVtb3ZlZCBlbnRyaWVzICovCisJbWVtbW92ZShwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIERFSF9TSVpFICogZGVsX2NvdW50LAorCQlwcmV2X3JlY29yZCwgaXRlbSArIGloX2l0ZW1fbGVuKGloKSAtIHByZXZfcmVjb3JkKTsKIAotICAvKiBzaGlmdCBlbnRyeSBoZWFkIGFycmF5IGFuZCBlbnRyaWVzIHRob3NlIGFyZSBBRlRFUiByZW1vdmVkIGVudHJpZXMgKi8KLSAgbWVtbW92ZSAoKGNoYXIgKikoZGVoICsgZnJvbSksCi0JICAgZGVoICsgZnJvbSArIGRlbF9jb3VudCwgCi0JICAgcHJldl9yZWNvcmQgLSBjdXRfcmVjb3Jkc19sZW4gLSAoY2hhciAqKShkZWggKyBmcm9tICsgZGVsX2NvdW50KSk7Ci0gIAotICAvKiBzaGlmdCByZWNvcmRzLCB0aG9zZSBhcmUgQkVGT1JFIHJlbW92ZWQgZW50cmllcyAqLwotICBtZW1tb3ZlIChwcmV2X3JlY29yZCAtIGN1dF9yZWNvcmRzX2xlbiAtIERFSF9TSVpFICogZGVsX2NvdW50LAotCSAgIHByZXZfcmVjb3JkLCBpdGVtICsgaWhfaXRlbV9sZW4oaWgpIC0gcHJldl9yZWNvcmQpOwotCi0gIHJldHVybiBERUhfU0laRSAqIGRlbF9jb3VudCArIGN1dF9yZWNvcmRzX2xlbjsKKwlyZXR1cm4gREVIX1NJWkUgKiBkZWxfY291bnQgKyBjdXRfcmVjb3Jkc19sZW47CiB9CiAKLQogLyogIHdoZW4gY3V0IGl0ZW0gaXMgcGFydCBvZiByZWd1bGFyIGZpbGUKICAgICAgICAgcG9zX2luX2l0ZW0gLSBmaXJzdCBieXRlIHRoYXQgbXVzdCBiZSBjdXQKICAgICAgICAgY3V0X3NpemUgLSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY3V0IGJlZ2lubmluZyBmcm9tIHBvc19pbl9pdGVtCkBAIC05NTksMjY0ICsxMDI1LDI3OCBAQAogICAgICAgICBwb3NfaW5faXRlbSAtIG51bWJlciBvZiBmaXJzdCBkZWxldGVkIGVudHJ5CiAgICAgICAgIGN1dF9zaXplIC0gY291bnQgb2YgZGVsZXRlZCBlbnRyaWVzCiAgICAgKi8KLXZvaWQgbGVhZl9jdXRfZnJvbV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgY3V0X2l0ZW1fbnVtLAotCQkJICAgaW50IHBvc19pbl9pdGVtLCBpbnQgY3V0X3NpemUpCit2b2lkIGxlYWZfY3V0X2Zyb21fYnVmZmVyKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBjdXRfaXRlbV9udW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwgaW50IGN1dF9zaXplKQogewotICAgIGludCBucjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IGJpLT5iaV9iaDsKLSAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7Ci0gICAgaW50IGk7CisJaW50IG5yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaS0+YmlfYmg7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IGxhc3RfbG9jLCB1bm1vdmVkX2xvYzsKKwlpbnQgaTsKIAotICAgIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CiAKLSAgICAvKiBpdGVtIGhlYWQgb2YgdHJ1bmNhdGVkIGl0ZW0gKi8KLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgY3V0X2l0ZW1fbnVtKTsKKwkvKiBpdGVtIGhlYWQgb2YgdHJ1bmNhdGVkIGl0ZW0gKi8KKwlpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBjdXRfaXRlbV9udW0pOwogCi0gICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKLSAgICAgICAgLyogZmlyc3QgY3V0IGVudHJ5ICgpKi8KLSAgICAgICAgY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzIChiaCwgaWgsIHBvc19pbl9pdGVtLCBjdXRfc2l6ZSk7Ci0gICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7Ci0JICAgICAgICAvKiBjaGFuZ2Uga2V5ICovCi0gICAgICAgICAgICBSRkFMU0UoIGN1dF9pdGVtX251bSwKLSAgICAgICAgICAgICAgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsIGN1dF9pdGVtX251bSk7Ci0gICAgICAgICAgICAvKiBjaGFuZ2UgaXRlbSBrZXkgYnkga2V5IG9mIGZpcnN0IGVudHJ5IGluIHRoZSBpdGVtICovCi0JICAgIHNldF9sZV9paF9rX29mZnNldCAoaWgsIGRlaF9vZmZzZXQoQl9JX0RFSCAoYmgsIGloKSkpOwotICAgICAgICAgICAgLyptZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAmKEJfSV9ERUggKGJoLCBpaCktPmRlaF9vZmZzZXQpLCBTSE9SVF9LRVlfU0laRSk7Ki8KLQkgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGl0ZW0gaXMgZGlyZWN0IG9yIGluZGlyZWN0ICovCi0gICAgICAgIFJGQUxTRSggaXNfc3RhdGRhdGFfbGVfaWggKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOwotICAgICAgICBSRkFMU0UoIHBvc19pbl9pdGVtICYmIHBvc19pbl9pdGVtICsgY3V0X3NpemUgIT0gaWhfaXRlbV9sZW4oaWgpLAotICAgICAgICAgICAgICAgICIxMDIwMDogaW52YWxpZCBvZmZzZXQgKCVsdSkgb3IgdHJ1bmNfc2l6ZSAoJWx1KSBvciBpaF9pdGVtX2xlbiAoJWx1KSIsCi0gICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgcG9zX2luX2l0ZW0sICggbG9uZyB1bnNpZ25lZCApIGN1dF9zaXplLCAKLQkJKCBsb25nIHVuc2lnbmVkICkgaWhfaXRlbV9sZW4gKGloKSk7CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkgeworCQkvKiBmaXJzdCBjdXQgZW50cnkgKCkgKi8KKwkJY3V0X3NpemUgPSBsZWFmX2N1dF9lbnRyaWVzKGJoLCBpaCwgcG9zX2luX2l0ZW0sIGN1dF9zaXplKTsKKwkJaWYgKHBvc19pbl9pdGVtID09IDApIHsKKwkJCS8qIGNoYW5nZSBrZXkgKi8KKwkJCVJGQUxTRShjdXRfaXRlbV9udW0sCisJCQkgICAgICAgIndoZW4gMC10aCBlbnJ0eSBvZiBpdGVtIGlzIGN1dCwgdGhhdCBpdGVtIG11c3QgYmUgZmlyc3QgaW4gdGhlIG5vZGUsIG5vdCAlZC10aCIsCisJCQkgICAgICAgY3V0X2l0ZW1fbnVtKTsKKwkJCS8qIGNoYW5nZSBpdGVtIGtleSBieSBrZXkgb2YgZmlyc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KKwkJCXNldF9sZV9paF9rX29mZnNldChpaCwgZGVoX29mZnNldChCX0lfREVIKGJoLCBpaCkpKTsKKwkJCS8qbWVtY3B5ICgmaWgtPmloX2tleS5rX29mZnNldCwgJihCX0lfREVIIChiaCwgaWgpLT5kZWhfb2Zmc2V0KSwgU0hPUlRfS0VZX1NJWkUpOyAqLworCQl9CisJfSBlbHNlIHsKKwkJLyogaXRlbSBpcyBkaXJlY3Qgb3IgaW5kaXJlY3QgKi8KKwkJUkZBTFNFKGlzX3N0YXRkYXRhX2xlX2loKGloKSwgIjEwMTk1OiBpdGVtIGlzIHN0YXQgZGF0YSIpOworCQlSRkFMU0UocG9zX2luX2l0ZW0gJiYgcG9zX2luX2l0ZW0gKyBjdXRfc2l6ZSAhPSBpaF9pdGVtX2xlbihpaCksCisJCSAgICAgICAiMTAyMDA6IGludmFsaWQgb2Zmc2V0ICglbHUpIG9yIHRydW5jX3NpemUgKCVsdSkgb3IgaWhfaXRlbV9sZW4gKCVsdSkiLAorCQkgICAgICAgKGxvbmcgdW5zaWduZWQpcG9zX2luX2l0ZW0sIChsb25nIHVuc2lnbmVkKWN1dF9zaXplLAorCQkgICAgICAgKGxvbmcgdW5zaWduZWQpaWhfaXRlbV9sZW4oaWgpKTsKIAotICAgICAgICAvKiBzaGlmdCBpdGVtIGJvZHkgdG8gbGVmdCBpZiBjdXQgaXMgZnJvbSB0aGUgaGVhZCBvZiBpdGVtICovCi0gICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7Ci0gICAgICAgICAgICBtZW1tb3ZlKCBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAotCQkgICAgIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKLQkJICAgICBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7Ci0JICAgIAotICAgICAgICAgICAgLyogY2hhbmdlIGtleSBvZiBpdGVtICovCi0gICAgICAgICAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChpaCkpCi0JCXNldF9sZV9paF9rX29mZnNldCAoaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkgKyBjdXRfc2l6ZSk7Ci0gICAgICAgICAgICBlbHNlIHsKLQkJc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgbGVfaWhfa19vZmZzZXQgKGloKSArIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqIGJoLT5iX3NpemUpOwotICAgICAgICAgICAgICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAyMDU6IGludmFsaWQgaWhfZnJlZV9zcGFjZSAoJWgpIiwgaWgpOwotCSAgICAgICAgfQotCSAgICB9Ci0gICAgfQotICAKKwkJLyogc2hpZnQgaXRlbSBib2R5IHRvIGxlZnQgaWYgY3V0IGlzIGZyb20gdGhlIGhlYWQgb2YgaXRlbSAqLworCQlpZiAocG9zX2luX2l0ZW0gPT0gMCkgeworCQkJbWVtbW92ZShiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAorCQkJCWJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKKwkJCQlpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CiAKLSAgICAvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCi0gICAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuciAtIGN1dF9pdGVtX251bSAtIDFdKSApOworCQkJLyogY2hhbmdlIGtleSBvZiBpdGVtICovCisJCQlpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoaWgsCisJCQkJCQkgICBsZV9paF9rX29mZnNldChpaCkgKworCQkJCQkJICAgY3V0X3NpemUpOworCQkJZWxzZSB7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KGloLAorCQkJCQkJICAgbGVfaWhfa19vZmZzZXQoaWgpICsKKwkJCQkJCSAgIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqCisJCQkJCQkgICBiaC0+Yl9zaXplKTsKKwkJCQlSRkFMU0UoaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplCisJCQkJICAgICAgICYmIGdldF9paF9mcmVlX3NwYWNlKGloKSwKKwkJCQkgICAgICAgIjEwMjA1OiBpbnZhbGlkIGloX2ZyZWVfc3BhY2UgKCVoKSIsIGloKTsKKwkJCX0KKwkJfQorCX0KIAotICAgIC8qIGxvY2F0aW9uIG9mIHRoZSBpdGVtLCB3aGljaCBpcyByZW1haW5pbmcgYXQgdGhlIHNhbWUgcGxhY2UgKi8KLSAgICB1bm1vdmVkX2xvYyA9IGN1dF9pdGVtX251bSA/IGloX2xvY2F0aW9uKGloLTEpIDogYmgtPmJfc2l6ZTsKKwkvKiBsb2NhdGlvbiBvZiB0aGUgbGFzdCBpdGVtICovCisJbGFzdF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW25yIC0gY3V0X2l0ZW1fbnVtIC0gMV0pKTsKIAorCS8qIGxvY2F0aW9uIG9mIHRoZSBpdGVtLCB3aGljaCBpcyByZW1haW5pbmcgYXQgdGhlIHNhbWUgcGxhY2UgKi8KKwl1bm1vdmVkX2xvYyA9IGN1dF9pdGVtX251bSA/IGloX2xvY2F0aW9uKGloIC0gMSkgOiBiaC0+Yl9zaXplOwogCi0gICAgLyogc2hpZnQgKi8KLSAgICBtZW1tb3ZlIChiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBjdXRfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAotCSAgICAgICB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jIC0gY3V0X3NpemUpOworCS8qIHNoaWZ0ICovCisJbWVtbW92ZShiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBjdXRfc2l6ZSwgYmgtPmJfZGF0YSArIGxhc3RfbG9jLAorCQl1bm1vdmVkX2xvYyAtIGxhc3RfbG9jIC0gY3V0X3NpemUpOwogCi0gICAgLyogY2hhbmdlIGl0ZW0gbGVuZ3RoICovCi0gICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgaWhfaXRlbV9sZW4oaWgpIC0gY3V0X3NpemUgKTsKLSAgCi0gICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChpaCkpIHsKLSAgICAgICAgaWYgKHBvc19pbl9pdGVtKQotICAgICAgICAgICAgc2V0X2loX2ZyZWVfc3BhY2UgKGloLCAwKTsKLSAgICB9CisJLyogY2hhbmdlIGl0ZW0gbGVuZ3RoICovCisJcHV0X2loX2l0ZW1fbGVuKGloLCBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CiAKLSAgICAvKiBjaGFuZ2UgbG9jYXRpb25zICovCi0gICAgZm9yIChpID0gY3V0X2l0ZW1fbnVtOyBpIDwgbnI7IGkgKyspCi0gICAgcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktY3V0X2l0ZW1fbnVtXSksIGloX2xvY2F0aW9uKCAmaWhbaS1jdXRfaXRlbV9udW1dKSArIGN1dF9zaXplICk7CisJaWYgKGlzX2luZGlyZWN0X2xlX2loKGloKSkgeworCQlpZiAocG9zX2luX2l0ZW0pCisJCQlzZXRfaWhfZnJlZV9zcGFjZShpaCwgMCk7CisJfQogCi0gICAgLyogc2l6ZSwgZnJlZSBzcGFjZSAqLwotICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIGN1dF9zaXplICk7CisJLyogY2hhbmdlIGxvY2F0aW9ucyAqLworCWZvciAoaSA9IGN1dF9pdGVtX251bTsgaSA8IG5yOyBpKyspCisJCXB1dF9paF9sb2NhdGlvbigmKGloW2kgLSBjdXRfaXRlbV9udW1dKSwKKwkJCQlpaF9sb2NhdGlvbigmaWhbaSAtIGN1dF9pdGVtX251bV0pICsgY3V0X3NpemUpOwogCi0gICAgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKGJpLT50YiwgYmgsIDApOwotICAgIAotICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAotICAgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7Ci0gICAgICB0X2RjID0gQl9OX0NISUxEIChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOwotICAgICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSApOwotICAgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOwotICAgIH0KKwkvKiBzaXplLCBmcmVlIHNwYWNlICovCisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgKyBjdXRfc2l6ZSk7CisKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShiaS0+dGIsIGJoLCAwKTsKKworCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCQl0X2RjID0gQl9OX0NISUxEKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJCXB1dF9kY19zaXplKHRfZGMsIGRjX3NpemUodF9kYykgLSBjdXRfc2l6ZSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworCX0KIH0KIAotCiAvKiBkZWxldGUgZGVsX251bSBpdGVtcyBmcm9tIGJ1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCd0aCBpdGVtICovCi1zdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksCi0JCQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0pCitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseShzdHJ1Y3QgYnVmZmVyX2luZm8gKmJpLAorCQkJCSAgICAgICBpbnQgZmlyc3QsIGludCBkZWxfbnVtKQogewotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOwotICAgIGludCBucjsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2M7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmktPmJpX2JoOworCWludCBucjsKKwlpbnQgaSwgajsKKwlpbnQgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2M7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CiAKLSAgUkZBTFNFKCBiaCA9PSBOVUxMLCAiMTAyMTA6IGJ1ZmZlciBpcyAwIik7Ci0gIFJGQUxTRSggZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CisJUkZBTFNFKGJoID09IE5VTEwsICIxMDIxMDogYnVmZmVyIGlzIDAiKTsKKwlSRkFMU0UoZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CiAKLSAgaWYgKGRlbF9udW0gPT0gMCkKLSAgICByZXR1cm47CisJaWYgKGRlbF9udW0gPT0gMCkKKwkJcmV0dXJuOwogCi0gIGJsa2ggPSBCX0JMS19IRUFEKGJoKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJYmxraCA9IEJfQkxLX0hFQUQoYmgpOworCW5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwogCi0gIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IG5yLAotICAgICAgICAgICIxMDIyMDogZmlyc3Q9JWQsIG51bWJlcj0lZCwgdGhlcmUgaXMgJWQgaXRlbXMiLCBmaXJzdCwgZGVsX251bSwgbnIpOworCVJGQUxTRShmaXJzdCA8IDAgfHwgZmlyc3QgKyBkZWxfbnVtID4gbnIsCisJICAgICAgICIxMDIyMDogZmlyc3Q9JWQsIG51bWJlcj0lZCwgdGhlcmUgaXMgJWQgaXRlbXMiLCBmaXJzdCwgZGVsX251bSwKKwkgICAgICAgbnIpOwogCi0gIGlmIChmaXJzdCA9PSAwICYmIGRlbF9udW0gPT0gbnIpIHsKLSAgICAvKiB0aGlzIGRvZXMgbm90IHdvcmsgKi8KLSAgICBtYWtlX2VtcHR5X25vZGUgKGJpKTsKLSAgICAKLSAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7Ci0gICAgcmV0dXJuOwotICB9CisJaWYgKGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBucikgeworCQkvKiB0aGlzIGRvZXMgbm90IHdvcmsgKi8KKwkJbWFrZV9lbXB0eV9ub2RlKGJpKTsKIAotICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgZmlyc3QpOwotICAKLSAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KLSAgaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKLSAgICAgIAotICAvKiBkZWxldGUgaXRlbXMgKi8KLSAgbGFzdF9sb2MgPSBpaF9sb2NhdGlvbiggJihpaFtuci0xLWZpcnN0XSkgKTsKLSAgbGFzdF9yZW1vdmVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2RlbF9udW0tMV0pICk7CisJCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5KGJpLT50YiwgYmgsIDApOworCQlyZXR1cm47CisJfQogCi0gIG1lbW1vdmUgKGJoLT5iX2RhdGEgKyBsYXN0X2xvYyArIGogLSBsYXN0X3JlbW92ZWRfbG9jLAotCSAgIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywgbGFzdF9yZW1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKLSAgCi0gIC8qIGRlbGV0ZSBpdGVtIGhlYWRlcnMgKi8KLSAgbWVtbW92ZSAoaWgsIGloICsgZGVsX251bSwgKG5yIC0gZmlyc3QgLSBkZWxfbnVtKSAqIElIX1NJWkUpOwotICAKLSAgLyogY2hhbmdlIGl0ZW0gbG9jYXRpb24gKi8KLSAgZm9yIChpID0gZmlyc3Q7IGkgPCBuciAtIGRlbF9udW07IGkgKyspCi0gICAgcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktZmlyc3RdKSwgaWhfbG9jYXRpb24oICYoaWhbaS1maXJzdF0pICkgKyAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MpICk7CisJaWggPSBCX05fUElURU1fSEVBRChiaCwgZmlyc3QpOwogCi0gIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLwotICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgLSBkZWxfbnVtICk7Ci0gIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSApOworCS8qIGxvY2F0aW9uIG9mIHVubW92YWJsZSBpdGVtICovCisJaiA9IChmaXJzdCA9PSAwKSA/IGJoLT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaCAtIDEpOwogCi0gIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChiaS0+dGIsIGJoLCAwKTsKLSAgCi0gIGlmIChiaS0+YmlfcGFyZW50KSB7Ci0gICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7Ci0gICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLQotCQkJCShqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSk7Ci0gICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOwotICB9CisJLyogZGVsZXRlIGl0ZW1zICovCisJbGFzdF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW25yIC0gMSAtIGZpcnN0XSkpOworCWxhc3RfcmVtb3ZlZF9sb2MgPSBpaF9sb2NhdGlvbigmKGloW2RlbF9udW0gLSAxXSkpOworCisJbWVtbW92ZShiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9yZW1vdmVkX2xvYywKKwkJYmgtPmJfZGF0YSArIGxhc3RfbG9jLCBsYXN0X3JlbW92ZWRfbG9jIC0gbGFzdF9sb2MpOworCisJLyogZGVsZXRlIGl0ZW0gaGVhZGVycyAqLworCW1lbW1vdmUoaWgsIGloICsgZGVsX251bSwgKG5yIC0gZmlyc3QgLSBkZWxfbnVtKSAqIElIX1NJWkUpOworCisJLyogY2hhbmdlIGl0ZW0gbG9jYXRpb24gKi8KKwlmb3IgKGkgPSBmaXJzdDsgaSA8IG5yIC0gZGVsX251bTsgaSsrKQorCQlwdXRfaWhfbG9jYXRpb24oJihpaFtpIC0gZmlyc3RdKSwKKwkJCQlpaF9sb2NhdGlvbigmKGloW2kgLSBmaXJzdF0pKSArIChqIC0KKwkJCQkJCQkJIGxhc3RfcmVtb3ZlZF9sb2MpKTsKKworCS8qIHNpemVzLCBpdGVtIG51bWJlciAqLworCXNldF9ibGtoX25yX2l0ZW0oYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpIC0gZGVsX251bSk7CisJc2V0X2Jsa2hfZnJlZV9zcGFjZShibGtoLAorCQkJICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArCisJCQkJCQkgICAgIElIX1NJWkUgKiBkZWxfbnVtKSk7CisKKwlkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eShiaS0+dGIsIGJoLCAwKTsKKworCWlmIChiaS0+YmlfcGFyZW50KSB7CisJCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjID0KKwkJICAgIEJfTl9DSElMRChiaS0+YmlfcGFyZW50LCBiaS0+YmlfcG9zaXRpb24pOworCQlwdXRfZGNfc2l6ZSh0X2RjLAorCQkJICAgIGRjX3NpemUodF9kYykgLSAoaiAtIGxhc3RfcmVtb3ZlZF9sb2MgKworCQkJCQkgICAgIElIX1NJWkUgKiBkZWxfbnVtKSk7CisJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eShiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworCX0KIH0KIAotCi0KLQotCiAvKiBwYXN0ZSBuZXdfZW50cnlfY291bnQgZW50cmllcyAobmV3X2RlaHMsIHJlY29yZHMpIGludG8gcG9zaXRpb24gYmVmb3JlIHRvIGl0ZW1fbnVtLXRoIGl0ZW0gKi8KLXZvaWQgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLAordm9pZCBsZWFmX3Bhc3RlX2VudHJpZXMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCWludCBpdGVtX251bSwKIAkJCWludCBiZWZvcmUsCiAJCQlpbnQgbmV3X2VudHJ5X2NvdW50LAotCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBuZXdfZGVocywKLQkJCWNvbnN0IGNoYXIgKiByZWNvcmRzLAotCQkJaW50IHBhc3RlX3NpemUKLQkJKQorCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKm5ld19kZWhzLAorCQkJY29uc3QgY2hhciAqcmVjb3JkcywgaW50IHBhc3RlX3NpemUpCiB7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOwotICAgIGNoYXIgKiBpdGVtOwotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOwotICAgIGNoYXIgKiBpbnNlcnRfcG9pbnQ7Ci0gICAgaW50IGksIG9sZF9lbnRyeV9udW07CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJY2hhciAqaXRlbTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworCWNoYXIgKmluc2VydF9wb2ludDsKKwlpbnQgaSwgb2xkX2VudHJ5X251bTsKIAotICAgIGlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKLSAgICAgICAgcmV0dXJuOworCWlmIChuZXdfZW50cnlfY291bnQgPT0gMCkKKwkJcmV0dXJuOwogCi0gICAgaWggPSBCX05fUElURU1fSEVBRChiaCwgaXRlbV9udW0pOworCWloID0gQl9OX1BJVEVNX0hFQUQoYmgsIGl0ZW1fbnVtKTsKIAotICAvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnksIGFuZCB0aGVyZSBhcmUgZW5vdWdoIHJlY29yZHMgaW4gaXQgKi8KLSAgUkZBTFNFKCAhaXNfZGlyZW50cnlfbGVfaWggKGloKSwgIjEwMjI1OiBpdGVtIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSIpOwotICBSRkFMU0UoIElfRU5UUllfQ09VTlQgKGloKSA8IGJlZm9yZSwKLQkgICIxMDIzMDogdGhlcmUgYXJlIG5vIGVudHJ5IHdlIHBhc3RlIGVudHJpZXMgYmVmb3JlLiBlbnRyeV9jb3VudCA9ICVkLCBiZWZvcmUgPSAlZCIsCi0JICBJX0VOVFJZX0NPVU5UIChpaCksIGJlZm9yZSk7CisJLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5LCBhbmQgdGhlcmUgYXJlIGVub3VnaCByZWNvcmRzIGluIGl0ICovCisJUkZBTFNFKCFpc19kaXJlbnRyeV9sZV9paChpaCksICIxMDIyNTogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKKwlSRkFMU0UoSV9FTlRSWV9DT1VOVChpaCkgPCBiZWZvcmUsCisJICAgICAgICIxMDIzMDogdGhlcmUgYXJlIG5vIGVudHJ5IHdlIHBhc3RlIGVudHJpZXMgYmVmb3JlLiBlbnRyeV9jb3VudCA9ICVkLCBiZWZvcmUgPSAlZCIsCisJICAgICAgIElfRU5UUllfQ09VTlQoaWgpLCBiZWZvcmUpOwogCisJLyogZmlyc3QgYnl0ZSBvZiBkZXN0IGl0ZW0gKi8KKwlpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKIAotICAvKiBmaXJzdCBieXRlIG9mIGRlc3QgaXRlbSAqLwotICBpdGVtID0gYmgtPmJfZGF0YSArIGloX2xvY2F0aW9uKGloKTsKKwkvKiBlbnRyeSBoZWFkIGFycmF5ICovCisJZGVoID0gQl9JX0RFSChiaCwgaWgpOwogCi0gIC8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KLSAgZGVoID0gQl9JX0RFSCAoYmgsIGloKTsKKwkvKiBuZXcgcmVjb3JkcyB3aWxsIGJlIHBhc3RlZCBhdCB0aGlzIHBvaW50ICovCisJaW5zZXJ0X3BvaW50ID0KKwkgICAgaXRlbSArCisJICAgIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oJihkZWhbYmVmb3JlIC0gMV0pKQorCSAgICAgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOwogCi0gIC8qIG5ldyByZWNvcmRzIHdpbGwgYmUgcGFzdGVkIGF0IHRoaXMgcG9pbnQgKi8KLSAgaW5zZXJ0X3BvaW50ID0gaXRlbSArIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oICYoZGVoW2JlZm9yZSAtIDFdKSkgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOworCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KKwlmb3IgKGkgPSBJX0VOVFJZX0NPVU5UKGloKSAtIDE7IGkgPj0gYmVmb3JlOyBpLS0pCisJCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbaV0pLAorCQkJCSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArCisJCQkJIChERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCkpOwogCi0gIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KLSAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID49IGJlZm9yZTsgaSAtLSkKLSAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCi0gICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyAoREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgKSk7IAorCS8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQkVGT1JFIG5ldyByZWNvcmRzICovCisJZm9yIChpID0gMDsgaSA8IGJlZm9yZTsgaSsrKQorCQlwdXRfZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSwKKwkJCQkgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplKTsKIAotICAvKiBhZGp1c3QgbG9jYXRpb25zIG9mIHJlY29yZHMgdGhhdCB3aWxsIGJlIEJFRk9SRSBuZXcgcmVjb3JkcyAqLwotICBmb3IgKGkgPSAwOyBpIDwgYmVmb3JlOyBpICsrKQotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyBwYXN0ZV9zaXplICk7CisJb2xkX2VudHJ5X251bSA9IElfRU5UUllfQ09VTlQoaWgpOworCXB1dF9paF9lbnRyeV9jb3VudChpaCwgaWhfZW50cnlfY291bnQoaWgpICsgbmV3X2VudHJ5X2NvdW50KTsKIAotICBvbGRfZW50cnlfbnVtID0gSV9FTlRSWV9DT1VOVChpaCk7Ci0gIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSArIG5ld19lbnRyeV9jb3VudCApOworCS8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCisJbWVtbW92ZShpbnNlcnRfcG9pbnQgKyBwYXN0ZV9zaXplLCBpbnNlcnRfcG9pbnQsCisJCWl0ZW0gKyAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkgLSBpbnNlcnRfcG9pbnQpOwogCi0gIC8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCi0gIG1lbW1vdmUgKGluc2VydF9wb2ludCArIHBhc3RlX3NpemUsIGluc2VydF9wb2ludCwgaXRlbSArIChpaF9pdGVtX2xlbihpaCkgLSBwYXN0ZV9zaXplKSAtIGluc2VydF9wb2ludCk7CisJLyogY29weSBuZXcgcmVjb3JkcyAqLworCW1lbWNweShpbnNlcnRfcG9pbnQgKyBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCwgcmVjb3JkcywKKwkgICAgICAgcGFzdGVfc2l6ZSAtIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50KTsKIAotICAvKiBjb3B5IG5ldyByZWNvcmRzICovCi0gIG1lbWNweSAoaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQsIHJlY29yZHMsCi0JCSAgIHBhc3RlX3NpemUgLSBERUhfU0laRSAqIG5ld19lbnRyeV9jb3VudCk7Ci0gIAotICAvKiBwcmVwYXJlIHNwYWNlIGZvciBuZXcgZW50cnkgaGVhZHMgKi8KLSAgZGVoICs9IGJlZm9yZTsKLSAgbWVtbW92ZSAoKGNoYXIgKikoZGVoICsgbmV3X2VudHJ5X2NvdW50KSwgZGVoLCBpbnNlcnRfcG9pbnQgLSAoY2hhciAqKWRlaCk7CisJLyogcHJlcGFyZSBzcGFjZSBmb3IgbmV3IGVudHJ5IGhlYWRzICovCisJZGVoICs9IGJlZm9yZTsKKwltZW1tb3ZlKChjaGFyICopKGRlaCArIG5ld19lbnRyeV9jb3VudCksIGRlaCwKKwkJaW5zZXJ0X3BvaW50IC0gKGNoYXIgKilkZWgpOwogCi0gIC8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCi0gIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSgoY2hhciAqKWRlaCk7Ci0gIG1lbWNweSAoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOworCS8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCisJZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKChjaGFyICopZGVoKTsKKwltZW1jcHkoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOwogCi0gIC8qIHNldCBsb2NhdGlvbnMgb2YgbmV3IHJlY29yZHMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSArKykKLSAgewotICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwKLSAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSApKSArCi0gICAgICAgICgtIGRlaF9sb2NhdGlvbiggJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKLSAgICAgICAgaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgLSBpdGVtKSk7Ci0gIH0KKwkvKiBzZXQgbG9jYXRpb25zIG9mIG5ldyByZWNvcmRzICovCisJZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSsrKSB7CisJCXB1dF9kZWhfbG9jYXRpb24oJihkZWhbaV0pLAorCQkJCSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArCisJCQkJICgtZGVoX2xvY2F0aW9uCisJCQkJICAoJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKKwkJCQkgIGluc2VydF9wb2ludCArIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50IC0KKwkJCQkgIGl0ZW0pKTsKKwl9CiAKLQotICAvKiBjaGFuZ2UgaXRlbSBrZXkgaWYgbmVjZXNzYXJ5ICh3aGVuIHdlIHBhc3RlIGJlZm9yZSAwLXRoIGVudHJ5ICovCi0gIGlmICghYmVmb3JlKQotICAgIHsKLQlzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBkZWhfb2Zmc2V0KG5ld19kZWhzKSk7CisJLyogY2hhbmdlIGl0ZW0ga2V5IGlmIG5lY2Vzc2FyeSAod2hlbiB3ZSBwYXN0ZSBiZWZvcmUgMC10aCBlbnRyeSAqLworCWlmICghYmVmb3JlKSB7CisJCXNldF9sZV9paF9rX29mZnNldChpaCwgZGVoX29mZnNldChuZXdfZGVocykpOwogLyogICAgICBtZW1jcHkgKCZpaC0+aWhfa2V5Lmtfb2Zmc2V0LCAKIAkJICAgICAgICZuZXdfZGVocy0+ZGVoX29mZnNldCwgU0hPUlRfS0VZX1NJWkUpOyovCi0gICAgfQotCisJfQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICB7Ci0gICAgaW50IHByZXYsIG5leHQ7Ci0gICAgLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLwotICAgIGRlaCA9IEJfSV9ERUggKGJoLCBpaCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpICsrKSB7Ci0gICAgICBuZXh0ID0gKGkgPCBJX0VOVFJZX0NPVU5UKGloKSAtIDEpID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtpICsgMV0pKSA6IDA7Ci0gICAgICBwcmV2ID0gKGkgIT0gMCkgPyBkZWhfbG9jYXRpb24oICYoZGVoW2kgLSAxXSkgKSA6IDA7Ci0gICAgICAKLSAgICAgIGlmIChwcmV2ICYmIHByZXYgPD0gZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSkpKQotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xMDI0MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAocHJldiAlYSwgY3VyKCVkKSAlYSkiLAotCQkJICBpaCwgZGVoICsgaSAtIDEsIGksIGRlaCArIGkpOwotICAgICAgaWYgKG5leHQgJiYgbmV4dCA+PSBkZWhfbG9jYXRpb24oICYoZGVoW2ldKSkpCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTEwMjUwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChjdXIoJWQpICVhLCBuZXh0ICVhKSIsCi0JCQkgIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7Ci0gICAgfQotICB9CisJeworCQlpbnQgcHJldiwgbmV4dDsKKwkJLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLworCQlkZWggPSBCX0lfREVIKGJoLCBpaCk7CisJCWZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UKGloKTsgaSsrKSB7CisJCQluZXh0ID0KKwkJCSAgICAoaSA8CisJCQkgICAgIElfRU5UUllfQ09VTlQoaWgpIC0KKwkJCSAgICAgMSkgPyBkZWhfbG9jYXRpb24oJihkZWhbaSArIDFdKSkgOiAwOworCQkJcHJldiA9IChpICE9IDApID8gZGVoX2xvY2F0aW9uKCYoZGVoW2kgLSAxXSkpIDogMDsKKworCQkJaWYgKHByZXYgJiYgcHJldiA8PSBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSkKKwkJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCQkgInZzLTEwMjQwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChwcmV2ICVhLCBjdXIoJWQpICVhKSIsCisJCQkJCQkgaWgsIGRlaCArIGkgLSAxLCBpLCBkZWggKyBpKTsKKwkJCWlmIChuZXh0ICYmIG5leHQgPj0gZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkpCisJCQkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCQkJICJ2cy0xMDI1MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAoY3VyKCVkKSAlYSwgbmV4dCAlYSkiLAorCQkJCQkJIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7CisJCX0KKwl9CiAjZW5kaWYKIAogfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKaW5kZXggN2Q0ZGM1Zi4uYTIwYmJjMSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvbmFtZWkuYworKysgYi9mcy9yZWlzZXJmcy9uYW1laS5jCkBAIC0yNSw4NiArMjUsODUgQEAKIAogLy8gZGlyZWN0b3J5IGl0ZW0gY29udGFpbnMgYXJyYXkgb2YgZW50cnkgaGVhZGVycy4gVGhpcyBwZXJmb3JtcwogLy8gYmluYXJ5IHNlYXJjaCB0aHJvdWdoIHRoYXQgYXJyYXkKLXN0YXRpYyBpbnQgYmluX3NlYXJjaF9pbl9kaXJfaXRlbSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBsb2ZmX3Qgb2ZmKQorc3RhdGljIGludCBiaW5fc2VhcmNoX2luX2Rpcl9pdGVtKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlLCBsb2ZmX3Qgb2ZmKQogewotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCA9IGRlLT5kZV9paDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IGRlLT5kZV9kZWg7Ci0gICAgaW50IHJib3VuZCwgbGJvdW5kLCBqOworCXN0cnVjdCBpdGVtX2hlYWQgKmloID0gZGUtPmRlX2loOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPSBkZS0+ZGVfZGVoOworCWludCByYm91bmQsIGxib3VuZCwgajsKIAotICAgIGxib3VuZCA9IDA7Ci0gICAgcmJvdW5kID0gSV9FTlRSWV9DT1VOVCAoaWgpIC0gMTsKKwlsYm91bmQgPSAwOworCXJib3VuZCA9IElfRU5UUllfQ09VTlQoaWgpIC0gMTsKIAotICAgIGZvciAoaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMjsgbGJvdW5kIDw9IHJib3VuZDsgaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMikgewotCWlmIChvZmYgPCBkZWhfb2Zmc2V0IChkZWggKyBqKSkgewotCSAgICByYm91bmQgPSBqIC0gMTsKLQkgICAgY29udGludWU7CisJZm9yIChqID0gKHJib3VuZCArIGxib3VuZCkgLyAyOyBsYm91bmQgPD0gcmJvdW5kOworCSAgICAgaiA9IChyYm91bmQgKyBsYm91bmQpIC8gMikgeworCQlpZiAob2ZmIDwgZGVoX29mZnNldChkZWggKyBqKSkgeworCQkJcmJvdW5kID0gaiAtIDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob2ZmID4gZGVoX29mZnNldChkZWggKyBqKSkgeworCQkJbGJvdW5kID0gaiArIDE7CisJCQljb250aW51ZTsKKwkJfQorCQkvLyB0aGlzIGlzIG5vdCBuYW1lIGZvdW5kLCBidXQgbWF0Y2hlZCB0aGlyZCBrZXkgY29tcG9uZW50CisJCWRlLT5kZV9lbnRyeV9udW0gPSBqOworCQlyZXR1cm4gTkFNRV9GT1VORDsKIAl9Ci0JaWYgKG9mZiA+IGRlaF9vZmZzZXQgKGRlaCArIGopKSB7Ci0JICAgIGxib3VuZCA9IGogKyAxOwotCSAgICBjb250aW51ZTsKLQl9Ci0JLy8gdGhpcyBpcyBub3QgbmFtZSBmb3VuZCwgYnV0IG1hdGNoZWQgdGhpcmQga2V5IGNvbXBvbmVudAotCWRlLT5kZV9lbnRyeV9udW0gPSBqOwotCXJldHVybiBOQU1FX0ZPVU5EOwotICAgIH0KIAotICAgIGRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCWRlLT5kZV9lbnRyeV9udW0gPSBsYm91bmQ7CisJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCi0KIC8vIGNvbW1lbnQ/ICBtYXliZSBzb21ldGhpbmcgbGlrZSBzZXQgZGUgdG8gcG9pbnQgdG8gd2hhdCB0aGUgcGF0aCBwb2ludHMgdG8/Ci1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX2l0ZW1fbG9jYXRpb24gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSwgc3RydWN0IHBhdGggKiBwYXRoKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9pdGVtX2xvY2F0aW9uKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlLAorCQkJCQlzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKLSAgICBkZS0+ZGVfYmggPSBnZXRfbGFzdF9iaCAocGF0aCk7Ci0gICAgZGUtPmRlX2loID0gZ2V0X2loIChwYXRoKTsKLSAgICBkZS0+ZGVfZGVoID0gQl9JX0RFSCAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpOwotICAgIGRlLT5kZV9pdGVtX251bSA9IFBBVEhfTEFTVF9QT1NJVElPTiAocGF0aCk7Ci19IAotCisJZGUtPmRlX2JoID0gZ2V0X2xhc3RfYmgocGF0aCk7CisJZGUtPmRlX2loID0gZ2V0X2loKHBhdGgpOworCWRlLT5kZV9kZWggPSBCX0lfREVIKGRlLT5kZV9iaCwgZGUtPmRlX2loKTsKKwlkZS0+ZGVfaXRlbV9udW0gPSBQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCk7Cit9CiAKIC8vIGRlX2JoLCBkZV9paCwgZGVfZGVoIChwb2ludHMgdG8gZmlyc3QgZWxlbWVudCBvZiBhcnJheSksIGRlX2l0ZW1fbnVtIGlzIHNldAotaW5saW5lIHZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK2lubGluZSB2b2lkIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOwogCi0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOwogCi0gICAgZGUtPmRlX2VudHJ5bGVuID0gZW50cnlfbGVuZ3RoIChkZS0+ZGVfYmgsIGRlLT5kZV9paCwgZGUtPmRlX2VudHJ5X251bSk7Ci0gICAgZGUtPmRlX25hbWVsZW4gPSBkZS0+ZGVfZW50cnlsZW4gLSAoZGVfd2l0aF9zZCAoZGVoKSA/IFNEX1NJWkUgOiAwKTsKLSAgICBkZS0+ZGVfbmFtZSA9IEJfSV9QSVRFTSAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpICsgZGVoX2xvY2F0aW9uKGRlaCk7Ci0gICAgaWYgKGRlLT5kZV9uYW1lW2RlLT5kZV9uYW1lbGVuIC0gMV0gPT0gMCkKLQlkZS0+ZGVfbmFtZWxlbiA9IHN0cmxlbiAoZGUtPmRlX25hbWUpOworCWRlLT5kZV9lbnRyeWxlbiA9IGVudHJ5X2xlbmd0aChkZS0+ZGVfYmgsIGRlLT5kZV9paCwgZGUtPmRlX2VudHJ5X251bSk7CisJZGUtPmRlX25hbWVsZW4gPSBkZS0+ZGVfZW50cnlsZW4gLSAoZGVfd2l0aF9zZChkZWgpID8gU0RfU0laRSA6IDApOworCWRlLT5kZV9uYW1lID0gQl9JX1BJVEVNKGRlLT5kZV9iaCwgZGUtPmRlX2loKSArIGRlaF9sb2NhdGlvbihkZWgpOworCWlmIChkZS0+ZGVfbmFtZVtkZS0+ZGVfbmFtZWxlbiAtIDFdID09IDApCisJCWRlLT5kZV9uYW1lbGVuID0gc3RybGVuKGRlLT5kZV9uYW1lKTsKIH0KIAotCiAvLyB3aGF0IGVudHJ5IHBvaW50cyB0bwotc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9vYmplY3Rfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RlX29iamVjdF9rZXkoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCiB7Ci0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOwotICAgIGRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCAmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKLSAgICBkZS0+ZGVfb2JqZWN0aWQgPSBkZWhfb2JqZWN0aWQoICYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOworCWRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworCWRlLT5kZV9vYmplY3RpZCA9IGRlaF9vYmplY3RpZCgmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVfZGVfZW50cnlfa2V5KHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKmRlKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOwogCi0gICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCi0JQlVHICgpOworCWlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50KGRlLT5kZV9paCkpCisJCUJVRygpOwogCi0gICAgLyogc3RvcmUga2V5IG9mIHRoZSBmb3VuZCBlbnRyeSAqLwotICAgIGRlLT5kZV9lbnRyeV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoZGUtPmRlX2loLT5paF9rZXkua19kaXJfaWQpOwotICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJihkZS0+ZGVfZW50cnlfa2V5KSwgZGVoX29mZnNldCAoZGVoKSk7Ci0gICAgc2V0X2NwdV9rZXlfa190eXBlICgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKKwkvKiBzdG9yZSBrZXkgb2YgdGhlIGZvdW5kIGVudHJ5ICovCisJZGUtPmRlX2VudHJ5X2tleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7CisJZGUtPmRlX2VudHJ5X2tleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9CisJICAgIGxlMzJfdG9fY3B1KGRlLT5kZV9paC0+aWhfa2V5LmtfZGlyX2lkKTsKKwlkZS0+ZGVfZW50cnlfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPQorCSAgICBsZTMyX3RvX2NwdShkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCgmKGRlLT5kZV9lbnRyeV9rZXkpLCBkZWhfb2Zmc2V0KGRlaCkpOworCXNldF9jcHVfa2V5X2tfdHlwZSgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKIH0KIAotCiAvKiBXZSBhc3NpZ24gYSBrZXkgdG8gZWFjaCBkaXJlY3RvcnkgaXRlbSwgYW5kIHBsYWNlIG11bHRpcGxlIGVudHJpZXMKIGluIGEgc2luZ2xlIGRpcmVjdG9yeSBpdGVtLiAgQSBkaXJlY3RvcnkgaXRlbSBoYXMgYSBrZXkgZXF1YWwgdG8gdGhlCiBrZXkgb2YgdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeSBpbiBpdC4KQEAgLTExNyw1OCArMTE2LDYwIEBACiAqLwogCiAvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCi1pbnQgc2VhcmNoX2J5X2VudHJ5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoraW50IHNlYXJjaF9ieV9lbnRyeV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCXN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgICBpbnQgcmV0dmFsOworCWludCByZXR2YWw7CiAKLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoc2IsIGtleSwgcGF0aCk7Ci0gICAgc3dpdGNoIChyZXR2YWwpIHsKLSAgICBjYXNlIElURU1fTk9UX0ZPVU5EOgotCWlmICghUEFUSF9MQVNUX1BPU0lUSU9OIChwYXRoKSkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzYiwgInZzLTcwMDA6IHNlYXJjaF9ieV9lbnRyeV9rZXk6IHNlYXJjaF9ieV9rZXkgcmV0dXJuZWQgaXRlbSBwb3NpdGlvbiA9PSAwIik7Ci0JICAgIHBhdGhyZWxzZShwYXRoKSA7Ci0JICAgIHJldHVybiBJT19FUlJPUiA7CisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oc2IsIGtleSwgcGF0aCk7CisJc3dpdGNoIChyZXR2YWwpIHsKKwljYXNlIElURU1fTk9UX0ZPVU5EOgorCQlpZiAoIVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzYiwKKwkJCQkJICJ2cy03MDAwOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBzZWFyY2hfYnlfa2V5IHJldHVybmVkIGl0ZW0gcG9zaXRpb24gPT0gMCIpOworCQkJcGF0aHJlbHNlKHBhdGgpOworCQkJcmV0dXJuIElPX0VSUk9SOworCQl9CisJCVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKS0tOworCisJY2FzZSBJVEVNX0ZPVU5EOgorCQlicmVhazsKKworCWNhc2UgSU9fRVJST1I6CisJCXJldHVybiByZXR2YWw7CisKKwlkZWZhdWx0OgorCQlwYXRocmVsc2UocGF0aCk7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsCisJCQkJICJ2cy03MDAyOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBubyBwYXRoIHRvIGhlcmUiKTsKKwkJcmV0dXJuIElPX0VSUk9SOwogCX0KLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOwogCi0gICAgY2FzZSBJVEVNX0ZPVU5EOgotCWJyZWFrOwotCi0gICAgY2FzZSBJT19FUlJPUjoKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgZGVmYXVsdDoKLQlwYXRocmVsc2UgKHBhdGgpOwotCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtNzAwMjogc2VhcmNoX2J5X2VudHJ5X2tleTogbm8gcGF0aCB0byBoZXJlIik7Ci0JcmV0dXJuIElPX0VSUk9SOwotICAgIH0KLQotICAgIHNldF9kZV9pdGVtX2xvY2F0aW9uIChkZSwgcGF0aCk7CisJc2V0X2RlX2l0ZW1fbG9jYXRpb24oZGUsIHBhdGgpOwogCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gICAgaWYgKCFpc19kaXJlbnRyeV9sZV9paCAoZGUtPmRlX2loKSB8fCAKLQlDT01QX1NIT1JUX0tFWVMgKCYoZGUtPmRlX2loLT5paF9rZXkpLCBrZXkpKSB7Ci0JcHJpbnRfYmxvY2sgKGRlLT5kZV9iaCwgMCwgLTEsIC0xKTsKLQlyZWlzZXJmc19wYW5pYyAoc2IsICJ2cy03MDA1OiBzZWFyY2hfYnlfZW50cnlfa2V5OiBmb3VuZCBpdGVtICVoIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBrZXkgJUsiLCBkZS0+ZGVfaWgsIGtleSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCWlmICghaXNfZGlyZW50cnlfbGVfaWgoZGUtPmRlX2loKSB8fAorCSAgICBDT01QX1NIT1JUX0tFWVMoJihkZS0+ZGVfaWgtPmloX2tleSksIGtleSkpIHsKKwkJcHJpbnRfYmxvY2soZGUtPmRlX2JoLCAwLCAtMSwgLTEpOworCQlyZWlzZXJmc19wYW5pYyhzYiwKKwkJCSAgICAgICAidnMtNzAwNTogc2VhcmNoX2J5X2VudHJ5X2tleTogZm91bmQgaXRlbSAlaCBpcyBub3QgZGlyZWN0b3J5IGl0ZW0gb3IgIgorCQkJICAgICAgICJkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGtleSAlSyIsCisJCQkgICAgICAgZGUtPmRlX2loLCBrZXkpOworCX0KKyNlbmRpZgkJCQkvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KIAotICAgIC8qIGJpbmFyeSBzZWFyY2ggaW4gZGlyZWN0b3J5IGl0ZW0gYnkgdGhpcmQgY29tcG9uZW4gdCBvZiB0aGUKLSAgICAgICBrZXkuIHNldHMgZGUtPmRlX2VudHJ5X251bSBvZiBkZSAqLwotICAgIHJldHZhbCA9IGJpbl9zZWFyY2hfaW5fZGlyX2l0ZW0gKGRlLCBjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKLSAgICBwYXRoLT5wb3NfaW5faXRlbSA9IGRlLT5kZV9lbnRyeV9udW07Ci0gICAgaWYgKHJldHZhbCAhPSBOQU1FX05PVF9GT1VORCkgewotCS8vIHVnbHksIGJ1dCByZW5hbWUgbmVlZHMgZGVfYmgsIGRlX2RlaCwgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfb2JqZWN0aWQgc2V0Ci0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKGRlKTsKLQlzZXRfZGVfb2JqZWN0X2tleSAoZGUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0dmFsOworCS8qIGJpbmFyeSBzZWFyY2ggaW4gZGlyZWN0b3J5IGl0ZW0gYnkgdGhpcmQgY29tcG9uZW4gdCBvZiB0aGUKKwkgICBrZXkuIHNldHMgZGUtPmRlX2VudHJ5X251bSBvZiBkZSAqLworCXJldHZhbCA9IGJpbl9zZWFyY2hfaW5fZGlyX2l0ZW0oZGUsIGNwdV9rZXlfa19vZmZzZXQoa2V5KSk7CisJcGF0aC0+cG9zX2luX2l0ZW0gPSBkZS0+ZGVfZW50cnlfbnVtOworCWlmIChyZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkJLy8gdWdseSwgYnV0IHJlbmFtZSBuZWVkcyBkZV9iaCwgZGVfZGVoLCBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9vYmplY3RpZCBzZXQKKwkJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oZGUpOworCQlzZXRfZGVfb2JqZWN0X2tleShkZSk7CisJfQorCXJldHVybiByZXR2YWw7CiB9CiAKLQotCiAvKiBLZXllZCAzMi1iaXQgaGFzaCBmdW5jdGlvbiB1c2luZyBURUEgaW4gYSBEYXZpcy1NZXllciBmdW5jdGlvbiAqLwogCiAvKiBUaGUgdGhpcmQgY29tcG9uZW50IGlzIGhhc2hlZCwgYW5kIHlvdSBjYW4gY2hvb3NlIGZyb20gbW9yZSB0aGFuCkBAIC0xNzYsMzcxICsxNzcsMzkzIEBACiAgICBidXQgYXJlIHRob3VnaHQgYWJvdXQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG1vdmVkIHRvIGhhc2hlcy5jCiAgICBKZWRpLCBwbGVhc2UgZG8gc28uICAtSGFucyAqLwogCi1zdGF0aWMgX191MzIgZ2V0X3RoaXJkX2NvbXBvbmVudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgCi0JCQkJICBjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3N0YXRpYyBfX3UzMiBnZXRfdGhpcmRfY29tcG9uZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKIHsKLSAgICBfX3UzMiByZXM7CisJX191MzIgcmVzOwogCi0gICAgaWYgKCFsZW4gfHwgKGxlbiA9PSAxICYmIG5hbWVbMF0gPT0gJy4nKSkKLQlyZXR1cm4gRE9UX09GRlNFVDsKLSAgICBpZiAobGVuID09IDIgJiYgbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0JcmV0dXJuIERPVF9ET1RfT0ZGU0VUOworCWlmICghbGVuIHx8IChsZW4gPT0gMSAmJiBuYW1lWzBdID09ICcuJykpCisJCXJldHVybiBET1RfT0ZGU0VUOworCWlmIChsZW4gPT0gMiAmJiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICcuJykKKwkJcmV0dXJuIERPVF9ET1RfT0ZGU0VUOwogCi0gICAgcmVzID0gUkVJU0VSRlNfU0IocyktPnNfaGFzaF9mdW5jdGlvbiAobmFtZSwgbGVuKTsKKwlyZXMgPSBSRUlTRVJGU19TQihzKS0+c19oYXNoX2Z1bmN0aW9uKG5hbWUsIGxlbik7CiAKLSAgICAvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcwotICAgIHJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7Ci0gICAgaWYgKHJlcyA9PSAwKQotCS8vIG5lZWRlZCB0byBoYXZlIG5vIG5hbWVzIGJlZm9yZSAiLiIgYW5kICIuLiIgdGhvc2UgaGF2ZSBoYXNoCi0JLy8gdmFsdWUgPT0gMCBhbmQgZ2VuZXJhdGlvbiBjb250ZXJzIDEgYW5kIDIgYWNjb3JkaW5nbHkKLQlyZXMgPSAxMjg7Ci0gICAgcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKKwkvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcworCXJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7CisJaWYgKHJlcyA9PSAwKQorCQkvLyBuZWVkZWQgdG8gaGF2ZSBubyBuYW1lcyBiZWZvcmUgIi4iIGFuZCAiLi4iIHRob3NlIGhhdmUgaGFzaAorCQkvLyB2YWx1ZSA9PSAwIGFuZCBnZW5lcmF0aW9uIGNvbnRlcnMgMSBhbmQgMiBhY2NvcmRpbmdseQorCQlyZXMgPSAxMjg7CisJcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKIH0KIAotCi1zdGF0aWMgaW50IHJlaXNlcmZzX21hdGNoIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIAotCQkJICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQorc3RhdGljIGludCByZWlzZXJmc19tYXRjaChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCSAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCiB7Ci0gICAgaW50IHJldHZhbCA9IE5BTUVfTk9UX0ZPVU5EOworCWludCByZXR2YWwgPSBOQU1FX05PVF9GT1VORDsKIAotICAgIGlmICgobmFtZWxlbiA9PSBkZS0+ZGVfbmFtZWxlbikgJiYKLQkhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCi0JcmV0dmFsID0gKGRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSA/IE5BTUVfRk9VTkQgOiBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CisJaWYgKChuYW1lbGVuID09IGRlLT5kZV9uYW1lbGVuKSAmJgorCSAgICAhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCisJCXJldHZhbCA9CisJCSAgICAoZGVfdmlzaWJsZShkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkgPyBOQU1FX0ZPVU5EIDoKKwkJICAgICBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CiAKLSAgICByZXR1cm4gcmV0dmFsOworCXJldHVybiByZXR2YWw7CiB9CiAKLQogLyogZGUncyBkZV9iaCwgZGVfaWgsIGRlX2RlaCwgZGVfaXRlbV9udW0sIGRlX2VudHJ5X251bSBhcmUgc2V0IGFscmVhZHkgKi8KIAogCQkJCS8qIHVzZWQgd2hlbiBoYXNoIGNvbGxpc2lvbnMgZXhpc3QgKi8KIAotCi1zdGF0aWMgaW50IGxpbmVhcl9zZWFyY2hfaW5fZGlyX2l0ZW0gKHN0cnVjdCBjcHVfa2V5ICoga2V5LCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsCi0JCQkJICAgICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQorc3RhdGljIGludCBsaW5lYXJfc2VhcmNoX2luX2Rpcl9pdGVtKHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkJICAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaDsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBpOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggPSBkZS0+ZGVfZGVoOworCWludCByZXR2YWw7CisJaW50IGk7CiAKLSAgICBpID0gZGUtPmRlX2VudHJ5X251bTsKKwlpID0gZGUtPmRlX2VudHJ5X251bTsKIAotICAgIGlmIChpID09IElfRU5UUllfQ09VTlQgKGRlLT5kZV9paCkgfHwKLQlHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoICsgaSkpICE9IEdFVF9IQVNIX1ZBTFVFIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKSkgewotCWkgLS07Ci0gICAgfQotCi0gICAgUkZBTFNFKCBkZS0+ZGVfZGVoICE9IEJfSV9ERUggKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKLQkgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7Ci0KLSAgICBkZWggKz0gaTsKLQotICAgIGZvciAoOyBpID49IDA7IGkgLS0sIGRlaCAtLSkgewotCWlmIChHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoKSkgIT0KLQkgICAgR0VUX0hBU0hfVkFMVUUgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkpKSB7Ci0JICAgIC8vIGhhc2ggdmFsdWUgZG9lcyBub3QgbWF0Y2gsIG5vIG5lZWQgdG8gY2hlY2sgd2hvbGUgbmFtZQotCSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJaWYgKGkgPT0gSV9FTlRSWV9DT1VOVChkZS0+ZGVfaWgpIHx8CisJICAgIEdFVF9IQVNIX1ZBTFVFKGRlaF9vZmZzZXQoZGVoICsgaSkpICE9CisJICAgIEdFVF9IQVNIX1ZBTFVFKGNwdV9rZXlfa19vZmZzZXQoa2V5KSkpIHsKKwkJaS0tOwogCX0KLSAgIAotCS8qIG1hcmssIHRoYXQgdGhpcyBnZW5lcmF0aW9uIG51bWJlciBpcyB1c2VkICovCi0JaWYgKGRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpCi0JICAgIHNldF9iaXQgKEdFVF9HRU5FUkFUSU9OX05VTUJFUiAoZGVoX29mZnNldCAoZGVoKSksICh1bnNpZ25lZCBsb25nICopZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyk7CiAKLQkvLyBjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lbGVuCi0JZGUtPmRlX2VudHJ5X251bSA9IGk7Ci0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4gKGRlKTsKKwlSRkFMU0UoZGUtPmRlX2RlaCAhPSBCX0lfREVIKGRlLT5kZV9iaCwgZGUtPmRlX2loKSwKKwkgICAgICAgInZzLTcwMTA6IGFycmF5IG9mIGVudHJ5IGhlYWRlcnMgbm90IGZvdW5kIik7CiAKLQlpZiAoKHJldHZhbCA9IHJlaXNlcmZzX21hdGNoIChkZSwgbmFtZSwgbmFtZWxlbikpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0JICAgIC8vIGRlJ3MgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfcmVjb3JkbGVuIGFyZSBzZXQuIEZpbGwgdGhlIHJlc3Q6CisJZGVoICs9IGk7CiAKLQkgICAgLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0Ci0JICAgIHNldF9kZV9vYmplY3Rfa2V5IChkZSk7CisJZm9yICg7IGkgPj0gMDsgaS0tLCBkZWgtLSkgeworCQlpZiAoR0VUX0hBU0hfVkFMVUUoZGVoX29mZnNldChkZWgpKSAhPQorCQkgICAgR0VUX0hBU0hfVkFMVUUoY3B1X2tleV9rX29mZnNldChrZXkpKSkgeworCQkJLy8gaGFzaCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgbm8gbmVlZCB0byBjaGVjayB3aG9sZSBuYW1lCisJCQlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisJCX0KIAotCSAgICBzdG9yZV9kZV9lbnRyeV9rZXkgKGRlKTsKKwkJLyogbWFyaywgdGhhdCB0aGlzIGdlbmVyYXRpb24gbnVtYmVyIGlzIHVzZWQgKi8KKwkJaWYgKGRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpCisJCQlzZXRfYml0KEdFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCkpLAorCQkJCSh1bnNpZ25lZCBsb25nICopZGUtPmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyk7CiAKLQkgICAgLy8gcmV0dmFsIGNhbiBiZSBOQU1FX0ZPVU5EIG9yIE5BTUVfRk9VTkRfSU5WSVNJQkxFCi0JICAgIHJldHVybiByZXR2YWw7CisJCS8vIGNhbGN1bGF0ZSBwb2ludGVyIHRvIG5hbWUgYW5kIG5hbWVsZW4KKwkJZGUtPmRlX2VudHJ5X251bSA9IGk7CisJCXNldF9kZV9uYW1lX2FuZF9uYW1lbGVuKGRlKTsKKworCQlpZiAoKHJldHZhbCA9CisJCSAgICAgcmVpc2VyZnNfbWF0Y2goZGUsIG5hbWUsIG5hbWVsZW4pKSAhPSBOQU1FX05PVF9GT1VORCkgeworCQkJLy8gZGUncyBkZV9uYW1lLCBkZV9uYW1lbGVuLCBkZV9yZWNvcmRsZW4gYXJlIHNldC4gRmlsbCB0aGUgcmVzdDoKKworCQkJLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0CisJCQlzZXRfZGVfb2JqZWN0X2tleShkZSk7CisKKwkJCXN0b3JlX2RlX2VudHJ5X2tleShkZSk7CisKKwkJCS8vIHJldHZhbCBjYW4gYmUgTkFNRV9GT1VORCBvciBOQU1FX0ZPVU5EX0lOVklTSUJMRQorCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KLSAgICB9CiAKLSAgICBpZiAoR0VUX0dFTkVSQVRJT05fTlVNQkVSIChsZV9paF9rX29mZnNldCAoZGUtPmRlX2loKSkgPT0gMCkKLQkvKiB3ZSBoYXZlIHJlYWNoZWQgbGVmdCBtb3N0IGVudHJ5IGluIHRoZSBub2RlLiBJbiBjb21tb24gd2UKLSAgICAgICAgICAgaGF2ZSB0byBnbyB0byB0aGUgbGVmdCBuZWlnaGJvciwgYnV0IGlmIGdlbmVyYXRpb24gY291bnRlcgotICAgICAgICAgICBpcyAwIGFscmVhZHksIHdlIGtub3cgZm9yIHN1cmUsIHRoYXQgdGhlcmUgaXMgbm8gbmFtZSB3aXRoCi0gICAgICAgICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUgKi8KLQkvLyBGSVhNRTogdGhpcyB3b3JrIGNvcnJlY3RseSBvbmx5IGJlY2F1c2UgaGFzaCB2YWx1ZSBjYW4gbm90Ci0JLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAotCS8vIHNvLCB0aGlzIGlzIGEgYnVnCi0JcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCWlmIChHRVRfR0VORVJBVElPTl9OVU1CRVIobGVfaWhfa19vZmZzZXQoZGUtPmRlX2loKSkgPT0gMCkKKwkJLyogd2UgaGF2ZSByZWFjaGVkIGxlZnQgbW9zdCBlbnRyeSBpbiB0aGUgbm9kZS4gSW4gY29tbW9uIHdlCisJCSAgIGhhdmUgdG8gZ28gdG8gdGhlIGxlZnQgbmVpZ2hib3IsIGJ1dCBpZiBnZW5lcmF0aW9uIGNvdW50ZXIKKwkJICAgaXMgMCBhbHJlYWR5LCB3ZSBrbm93IGZvciBzdXJlLCB0aGF0IHRoZXJlIGlzIG5vIG5hbWUgd2l0aAorCQkgICB0aGUgc2FtZSBoYXNoIHZhbHVlICovCisJCS8vIEZJWE1FOiB0aGlzIHdvcmsgY29ycmVjdGx5IG9ubHkgYmVjYXVzZSBoYXNoIHZhbHVlIGNhbiBub3QKKwkJLy8gYmUgMC4gQnR3LCBpbiBjYXNlIG9mIFl1cmEncyBoYXNoIGl0IGlzIHByb2JhYmx5IHBvc3NpYmxlLAorCQkvLyBzbywgdGhpcyBpcyBhIGJ1ZworCQlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiAKLSAgICBSRkFMU0UoIGRlLT5kZV9pdGVtX251bSwKLQkgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CisJUkZBTFNFKGRlLT5kZV9pdGVtX251bSwKKwkgICAgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CiAKLSAgICByZXR1cm4gR09UT19QUkVWSU9VU19JVEVNOworCXJldHVybiBHT1RPX1BSRVZJT1VTX0lURU07CiB9CiAKLQogLy8gbWF5IHJldHVybiBOQU1FX0ZPVU5ELCBOQU1FX0ZPVU5EX0lOVklTSUJMRSwgTkFNRV9OT1RfRk9VTkQKIC8vIEZJWE1FOiBzaG91bGQgYWRkIHNvbWV0aGluZyBsaWtlIElPRVJST1IKLXN0YXRpYyBpbnQgcmVpc2VyZnNfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIAotCQkJCXN0cnVjdCBwYXRoICogcGF0aF90b19lbnRyeSwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQorc3RhdGljIGludCByZWlzZXJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgcGF0aCAqcGF0aF90b19lbnRyeSwKKwkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXlfdG9fc2VhcmNoOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkga2V5X3RvX3NlYXJjaDsKKwlpbnQgcmV0dmFsOwogCisJaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRShkaXItPmlfc2ItPnNfYmxvY2tzaXplKSkKKwkJcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCi0gICAgaWYgKG5hbWVsZW4gPiBSRUlTRVJGU19NQVhfTkFNRSAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCi0JcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCS8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLworCW1ha2VfY3B1X2tleSgma2V5X3RvX3NlYXJjaCwgZGlyLAorCQkgICAgIGdldF90aGlyZF9jb21wb25lbnQoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwKKwkJICAgICBUWVBFX0RJUkVOVFJZLCAzKTsKIAotICAgIC8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmtleV90b19zZWFyY2gsIGRpciwgCi0JCSAgZ2V0X3RoaXJkX2NvbXBvbmVudCAoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwgVFlQRV9ESVJFTlRSWSwgMyk7CisJd2hpbGUgKDEpIHsKKwkJcmV0dmFsID0KKwkJICAgIHNlYXJjaF9ieV9lbnRyeV9rZXkoZGlyLT5pX3NiLCAma2V5X3RvX3NlYXJjaCwKKwkJCQkJcGF0aF90b19lbnRyeSwgZGUpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCisJCQkJCSBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIElPX0VSUk9SOworCQl9CiAKLSAgICB3aGlsZSAoMSkgewotCXJldHZhbCA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKGRpci0+aV9zYiwgJmtleV90b19zZWFyY2gsIHBhdGhfdG9fZW50cnksIGRlKTsKKwkJLyogY29tcGFyZSBuYW1lcyBmb3IgYWxsIGVudHJpZXMgaGF2aW5nIGdpdmVuIGhhc2ggdmFsdWUgKi8KKwkJcmV0dmFsID0KKwkJICAgIGxpbmVhcl9zZWFyY2hfaW5fZGlyX2l0ZW0oJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLAorCQkJCQkgICAgICBuYW1lbGVuKTsKKwkJaWYgKHJldHZhbCAhPSBHT1RPX1BSRVZJT1VTX0lURU0pIHsKKwkJCS8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2NhbiBkaXJlY3RvcnkgYW55bW9yZS4gR2l2ZW4gZW50cnkgZm91bmQgb3IgZG9lcyBub3QgZXhpc3QgKi8KKwkJCXBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLworCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5X3RvX3NlYXJjaCwKKwkJCQkgICAgIGxlX2loX2tfb2Zmc2V0KGRlLT5kZV9paCkgLSAxKTsKKwkJcGF0aHJlbHNlKHBhdGhfdG9fZW50cnkpOworCisJfQkJCS8qIHdoaWxlICgxKSAqLworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworCUlOSVRJQUxJWkVfUEFUSChwYXRoX3RvX2VudHJ5KTsKKworCWlmIChSRUlTRVJGU19NQVhfTkFNRShkaXItPmlfc2ItPnNfYmxvY2tzaXplKSA8IGRlbnRyeS0+ZF9uYW1lLmxlbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSZwYXRoX3RvX2VudHJ5LCAmZGUpOworCXBhdGhyZWxzZSgmcGF0aF90b19lbnRyeSk7CisJaWYgKHJldHZhbCA9PSBOQU1FX0ZPVU5EKSB7CisJCS8qIEhpZGUgdGhlIC5yZWlzZXJmc19wcml2IGRpcmVjdG9yeSAqLworCQlpZiAocmVpc2VyZnNfeGF0dHJzKGRpci0+aV9zYikgJiYKKwkJICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgorCQkgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCisJCSAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKKwkJICAgIGRlLmRlX29iamVjdGlkID09CisJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJKFJFSVNFUkZTX1NCKGRpci0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPgorCQkJCWtfb2JqZWN0aWQpKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisKKwkJaW5vZGUgPQorCQkgICAgcmVpc2VyZnNfaWdldChkaXItPmlfc2IsIChzdHJ1Y3QgY3B1X2tleSAqKSYoZGUuZGVfZGlyX2lkKSk7CisJCWlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgeworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfQorCisJCS8qIFByb3BvZ2F0ZSB0aGUgcHJpdl9vYmplY3QgZmxhZyBzbyB3ZSBrbm93IHdlJ3JlIGluIHRoZSBwcml2IHRyZWUgKi8KKwkJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGRpcikpCisJCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCX0KKwlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCi0JCQkgICAgICBfX0ZVTkNUSU9OX18pOwotCSAgICByZXR1cm4gSU9fRVJST1I7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOwogCX0KIAotCS8qIGNvbXBhcmUgbmFtZXMgZm9yIGFsbCBlbnRyaWVzIGhhdmluZyBnaXZlbiBoYXNoIHZhbHVlICovCi0JcmV0dmFsID0gbGluZWFyX3NlYXJjaF9pbl9kaXJfaXRlbSAoJmtleV90b19zZWFyY2gsIGRlLCBuYW1lLCBuYW1lbGVuKTsKLQlpZiAocmV0dmFsICE9IEdPVE9fUFJFVklPVVNfSVRFTSkgewotCSAgICAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHNjYW4gZGlyZWN0b3J5IGFueW1vcmUuIEdpdmVuIGVudHJ5IGZvdW5kIG9yIGRvZXMgbm90IGV4aXN0ICovCi0JICAgIHBhdGhfdG9fZW50cnktPnBvc19pbl9pdGVtID0gZGUtPmRlX2VudHJ5X251bTsKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9CisJaWYgKGlub2RlKQorCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CiAKLQkvKiB0aGVyZSBpcyBsZWZ0IG5laWdoYm9yaW5nIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnkgYW5kIGdpdmVuIGVudHJ5IGNhbiBiZSB0aGVyZSAqLwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5X3RvX3NlYXJjaCwgbGVfaWhfa19vZmZzZXQgKGRlLT5kZV9paCkgLSAxKTsKLQlwYXRocmVsc2UgKHBhdGhfdG9fZW50cnkpOwotCi0gICAgfSAvKiB3aGlsZSAoMSkgKi8KKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqIHJlaXNlcmZzX2xvb2t1cCAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0KLSAgICBpZiAoUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpIDwgZGVudHJ5LT5kX25hbWUubGVuKQotCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOwotCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOwotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIGlmIChyZXR2YWwgPT0gTkFNRV9GT1VORCkgewotICAgICAgICAvKiBIaWRlIHRoZSAucmVpc2VyZnNfcHJpdiBkaXJlY3RvcnkgKi8KLQlpZiAocmVpc2VyZnNfeGF0dHJzIChkaXItPmlfc2IpICYmCi0JICAgICFvbGRfZm9ybWF0X29ubHkoZGlyLT5pX3NiKSAmJgotICAgICAgICAgICAgUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290ICYmCi0gICAgICAgICAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUgJiYKLQkgICAgZGUuZGVfb2JqZWN0aWQgPT0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkoUkVJU0VSRlNfU0IoZGlyLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+a19vYmplY3RpZCkpIHsKLQkgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoZGlyLT5pX3NiKTsKLQkgIHJldHVybiBFUlJfUFRSICgtRUFDQ0VTKTsKLQl9Ci0KLQlpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKLQlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0JICAgIHJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotICAgICAgICB9Ci0KLQkvKiBQcm9wb2dhdGUgdGhlIHByaXZfb2JqZWN0IGZsYWcgc28gd2Uga25vdyB3ZSdyZSBpbiB0aGUgcHJpdiB0cmVlICovCi0JaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkaXIpKQotCSAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgaWYgKCByZXR2YWwgPT0gSU9fRVJST1IgKSB7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTyk7Ci0gICAgfQotCi0gICAgaWYgKGlub2RlKQotCSAgICByZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7Ci0gICAgCi0gICAgZF9hZGQoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQogLyogCiAqKiBsb29rcyB1cCB0aGUgZGVudHJ5IG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBjaGlsZC4KICoqIHRha2VuIGZyb20gZXh0Ml9nZXRfcGFyZW50CiAqLwogc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKIHsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7Ci0gICAgc3RydWN0IGRlbnRyeSAqcGFyZW50OwotICAgIHN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGUgOworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aF90b19lbnRyeSk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqZGlyID0gY2hpbGQtPmRfaW5vZGU7CiAKKwlpZiAoZGlyLT5pX25saW5rID09IDApIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisJfQorCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CiAKLSAgICBpZiAoZGlyLT5pX25saW5rID09IDApIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLSAgICB9Ci0gICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKLQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsICIuLiIsIDIsICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgIi4uIiwgMiwgJnBhdGhfdG9fZW50cnksICZkZSk7CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKwlpbm9kZSA9IHJlaXNlcmZzX2lnZXQoZGlyLT5pX3NiLCAoc3RydWN0IGNwdV9rZXkgKikmKGRlLmRlX2Rpcl9pZCkpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotICAgIH0KLSAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKGRpci0+aV9zYiwgKHN0cnVjdCBjcHVfa2V5ICopJihkZS5kZV9kaXJfaWQpKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKIAotICAgIGlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgewotCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwotICAgIH0KLSAgICBwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOwotICAgIGlmICghcGFyZW50KSB7Ci0JaXB1dChpbm9kZSk7Ci0JcGFyZW50ID0gRVJSX1BUUigtRU5PTUVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudDsKKwlpZiAoIWlub2RlIHx8IElTX0VSUihpbm9kZSkpIHsKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBwYXJlbnQ7CiB9CiAKLQogLyogYWRkIGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgKGVudHJ5IGNhbiBiZSBoaWRkZW4pLiAKIAogaW5zZXJ0IGRlZmluaXRpb24gb2Ygd2hlbiBoaWRkZW4gZGlyZWN0b3JpZXMgYXJlIHVzZWQgaGVyZSAtSGFucwogCiAgRG9lcyBub3QgbWFyayBkaXIgICBpbm9kZSBkaXJ0eSwgZG8gaXQgYWZ0ZXIgc3VjY2Vzc2VzZnVsbCBjYWxsIHRvIGl0ICovCiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfYWRkX2VudHJ5IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgc3RydWN0IGlub2RlICogaW5vZGUsCi0JCQkgICAgICAgaW50IHZpc2libGUpCitzdGF0aWMgaW50IHJlaXNlcmZzX2FkZF9lbnRyeShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB2aXNpYmxlKQogewotICAgIHN0cnVjdCBjcHVfa2V5IGVudHJ5X2tleTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7Ci0gICAgaW50IGJpdF9zdHJpbmcgW01BWF9HRU5FUkFUSU9OX05VTUJFUiAvIChzaXplb2YoaW50KSAqIDgpICsgMV07Ci0gICAgaW50IGdlbl9udW1iZXI7Ci0gICAgY2hhciBzbWFsbF9idWZbMzIrREVIX1NJWkVdIDsgLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2UgY3JlYXRlIGZpbGUgd2l0aCBzaG9ydCBuYW1lICovCi0gICAgY2hhciAqIGJ1ZmZlcjsKLSAgICBpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOwotICAgIGludCByZXR2YWw7CisJc3RydWN0IGNwdV9rZXkgZW50cnlfa2V5OworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJaW50IGJpdF9zdHJpbmdbTUFYX0dFTkVSQVRJT05fTlVNQkVSIC8gKHNpemVvZihpbnQpICogOCkgKyAxXTsKKwlpbnQgZ2VuX251bWJlcjsKKwljaGFyIHNtYWxsX2J1ZlszMiArIERFSF9TSVpFXTsJLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCisJCQkJCSAgIGlmIHdlIGNyZWF0ZSBmaWxlIHdpdGggc2hvcnQgbmFtZSAqLworCWNoYXIgKmJ1ZmZlcjsKKwlpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOworCWludCByZXR2YWw7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBjYW5ub3QgYWxsb3cgaXRlbXMgdG8gYmUgYWRkZWQgaW50byBhIGJ1c3kgZGVsZXRlZCBkaXJlY3RvcnkgKi8KLSAgICBpZiAoIW5hbWVsZW4pCi0JcmV0dXJuIC1FSU5WQUw7CisJLyogY2Fubm90IGFsbG93IGl0ZW1zIHRvIGJlIGFkZGVkIGludG8gYSBidXN5IGRlbGV0ZWQgZGlyZWN0b3J5ICovCisJaWYgKCFuYW1lbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpKQotCXJldHVybiAtRU5BTUVUT09MT05HOworCWlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpCisJCXJldHVybiAtRU5BTUVUT09MT05HOwogCi0gICAgLyogZWFjaCBlbnRyeSBoYXMgdW5pcXVlIGtleS4gY29tcG9zZSBpdCAqLwotICAgIG1ha2VfY3B1X2tleSAoJmVudHJ5X2tleSwgZGlyLCAKLQkJICBnZXRfdGhpcmRfY29tcG9uZW50IChkaXItPmlfc2IsIG5hbWUsIG5hbWVsZW4pLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkvKiBlYWNoIGVudHJ5IGhhcyB1bmlxdWUga2V5LiBjb21wb3NlIGl0ICovCisJbWFrZV9jcHVfa2V5KCZlbnRyeV9rZXksIGRpciwKKwkJICAgICBnZXRfdGhpcmRfY29tcG9uZW50KGRpci0+aV9zYiwgbmFtZSwgbmFtZWxlbiksCisJCSAgICAgVFlQRV9ESVJFTlRSWSwgMyk7CiAKLSAgICAvKiBnZXQgbWVtb3J5IGZvciBjb21wb3NpbmcgdGhlIGVudHJ5ICovCi0gICAgYnVmbGVuID0gREVIX1NJWkUgKyBST1VORF9VUCAobmFtZWxlbik7Ci0gICAgaWYgKGJ1ZmxlbiA+IHNpemVvZiAoc21hbGxfYnVmKSkgewotCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MgKGJ1ZmxlbiwgR0ZQX05PRlMsIGRpci0+aV9zYik7Ci0JaWYgKGJ1ZmZlciA9PSAwKQotCSAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9IGVsc2UKLQlidWZmZXIgPSBzbWFsbF9idWY7CisJLyogZ2V0IG1lbW9yeSBmb3IgY29tcG9zaW5nIHRoZSBlbnRyeSAqLworCWJ1ZmxlbiA9IERFSF9TSVpFICsgUk9VTkRfVVAobmFtZWxlbik7CisJaWYgKGJ1ZmxlbiA+IHNpemVvZihzbWFsbF9idWYpKSB7CisJCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MoYnVmbGVuLCBHRlBfTk9GUywgZGlyLT5pX3NiKTsKKwkJaWYgKGJ1ZmZlciA9PSAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSBlbHNlCisJCWJ1ZmZlciA9IHNtYWxsX2J1ZjsKIAotICAgIHBhc3RlX3NpemUgPSAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRpcikgPT0gU1RBVF9EQVRBX1YxKSA/IChERUhfU0laRSArIG5hbWVsZW4pIDogYnVmbGVuOworCXBhc3RlX3NpemUgPQorCSAgICAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGlyKSA9PQorCSAgICAgU1RBVF9EQVRBX1YxKSA/IChERUhfU0laRSArIG5hbWVsZW4pIDogYnVmbGVuOwogCi0gICAgLyogZmlsbCBidWZmZXIgOiBkaXJlY3RvcnkgZW50cnkgaGVhZCwgbmFtZVssIGRpciBvYmplY3RpZCB8ICwgc3RhdCBkYXRhIHwgLHN0YXQgZGF0YSwgZGlyIG9iamVjdGlkIF0gKi8KLSAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilidWZmZXI7Ci0gICAgZGVoLT5kZWhfbG9jYXRpb24gPSAwOyAvKiBKRE0gRW5kaWFuIHNhZmUgaWYgMCAqLwotICAgIHB1dF9kZWhfb2Zmc2V0KCBkZWgsIGNwdV9rZXlfa19vZmZzZXQoICZlbnRyeV9rZXkgKSApOwotICAgIGRlaC0+ZGVoX3N0YXRlID0gMDsgLyogSkRNIEVuZGlhbiBzYWZlIGlmIDAgKi8KLSAgICAvKiBwdXQga2V5IChpbm8gYW5hbG9nKSB0byBkZSAqLwotICAgIGRlaC0+ZGVoX2Rpcl9pZCA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19kaXJfaWQ7IC8qIHNhZmU6IGtfZGlyX2lkIGlzIGxlICovCi0gICAgZGVoLT5kZWhfb2JqZWN0aWQgPSBJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQ7IC8qIHNhZmU6IGtfb2JqZWN0aWQgaXMgbGUgKi8KKwkvKiBmaWxsIGJ1ZmZlciA6IGRpcmVjdG9yeSBlbnRyeSBoZWFkLCBuYW1lWywgZGlyIG9iamVjdGlkIHwgLCBzdGF0IGRhdGEgfCAsc3RhdCBkYXRhLCBkaXIgb2JqZWN0aWQgXSAqLworCWRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJ1ZmZlcjsKKwlkZWgtPmRlaF9sb2NhdGlvbiA9IDA7CS8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisJcHV0X2RlaF9vZmZzZXQoZGVoLCBjcHVfa2V5X2tfb2Zmc2V0KCZlbnRyeV9rZXkpKTsKKwlkZWgtPmRlaF9zdGF0ZSA9IDA7CS8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisJLyogcHV0IGtleSAoaW5vIGFuYWxvZykgdG8gZGUgKi8KKwlkZWgtPmRlaF9kaXJfaWQgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19kaXJfaWQ7CS8qIHNhZmU6IGtfZGlyX2lkIGlzIGxlICovCisJZGVoLT5kZWhfb2JqZWN0aWQgPSBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZDsJLyogc2FmZToga19vYmplY3RpZCBpcyBsZSAqLwogCi0gICAgLyogY29weSBuYW1lICovCi0gICAgbWVtY3B5ICgoY2hhciAqKShkZWggKyAxKSwgbmFtZSwgbmFtZWxlbik7Ci0gICAgLyogcGFkZCBieSAwcyB0byB0aGUgNCBieXRlIGJvdW5kYXJ5ICovCi0gICAgcGFkZF9pdGVtICgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAgKG5hbWVsZW4pLCBuYW1lbGVuKTsKKwkvKiBjb3B5IG5hbWUgKi8KKwltZW1jcHkoKGNoYXIgKikoZGVoICsgMSksIG5hbWUsIG5hbWVsZW4pOworCS8qIHBhZGQgYnkgMHMgdG8gdGhlIDQgYnl0ZSBib3VuZGFyeSAqLworCXBhZGRfaXRlbSgoY2hhciAqKShkZWggKyAxKSwgUk9VTkRfVVAobmFtZWxlbiksIG5hbWVsZW4pOwogCi0gICAgLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLwotICAgIG1hcmtfZGVfd2l0aG91dF9zZCAoZGVoKTsKLSAgICB2aXNpYmxlID8gbWFya19kZV92aXNpYmxlIChkZWgpIDogbWFya19kZV9oaWRkZW4gKGRlaCk7CisJLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLworCW1hcmtfZGVfd2l0aG91dF9zZChkZWgpOworCXZpc2libGUgPyBtYXJrX2RlX3Zpc2libGUoZGVoKSA6IG1hcmtfZGVfaGlkZGVuKGRlaCk7CiAKLSAgICAvKiBmaW5kIHRoZSBwcm9wZXIgcGxhY2UgZm9yIHRoZSBuZXcgZW50cnkgKi8KLSAgICBtZW1zZXQgKGJpdF9zdHJpbmcsIDAsIHNpemVvZiAoYml0X3N0cmluZykpOwotICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IChjaGFyICopYml0X3N0cmluZzsKLSAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIG5hbWUsIG5hbWVsZW4sICZwYXRoLCAmZGUpOwotICAgIGlmKCByZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQgKSB7CisJLyogZmluZCB0aGUgcHJvcGVyIHBsYWNlIGZvciB0aGUgbmV3IGVudHJ5ICovCisJbWVtc2V0KGJpdF9zdHJpbmcsIDAsIHNpemVvZihiaXRfc3RyaW5nKSk7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gKGNoYXIgKiliaXRfc3RyaW5nOworCXJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkoZGlyLCBuYW1lLCBuYW1lbGVuLCAmcGF0aCwgJmRlKTsKKwlpZiAocmV0dmFsICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisJCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQkJcmVpc2VyZnNfa2ZyZWUoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJCXBhdGhyZWxzZSgmcGF0aCk7CisKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoZGlyLT5pX3NiLAorCQkJCQkgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCisJCQkJCSAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCisJCQkJCSBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCX0KKworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlnZW5fbnVtYmVyID0KKwkgICAgZmluZF9maXJzdF96ZXJvX2JpdCgodW5zaWduZWQgbG9uZyAqKWJpdF9zdHJpbmcsCisJCQkJTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7CisJaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKKwkJLyogdGhlcmUgaXMgbm8gZnJlZSBnZW5lcmF0aW9uIG51bWJlciAqLworCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwKKwkJCQkgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKKwkJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCisJCQlyZWlzZXJmc19rZnJlZShidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KKwlwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCgmZW50cnlfa2V5LCBkZWhfb2Zmc2V0KGRlaCkpOworCisJLyogdXBkYXRlIG1heC1oYXNoLWNvbGxpc2lvbnMgY291bnRlciBpbiByZWlzZXJmc19zYl9pbmZvICovCisJUFJPQ19JTkZPX01BWCh0aC0+dF9zdXBlciwgbWF4X2hhc2hfY29sbGlzaW9ucywgZ2VuX251bWJlcik7CisKKwlpZiAoZ2VuX251bWJlciAhPSAwKSB7CS8qIHdlIG5lZWQgdG8gcmUtc2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50ICovCisJCWlmIChzZWFyY2hfYnlfZW50cnlfa2V5KGRpci0+aV9zYiwgJmVudHJ5X2tleSwgJnBhdGgsICZkZSkgIT0KKwkJICAgIE5BTUVfTk9UX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGRpci0+aV9zYiwKKwkJCQkJICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKKwkJCQkJICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAorCQkJCQkgJmVudHJ5X2tleSk7CisKKwkJCWlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCQkJCXJlaXNlcmZzX2tmcmVlKGJ1ZmZlciwgYnVmbGVuLCBkaXItPmlfc2IpOworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBwZXJmb3JtIHRoZSBpbnNlcnRpb24gb2YgdGhlIGVudHJ5IHRoYXQgd2UgaGF2ZSBwcmVwYXJlZCAqLworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgJnBhdGgsICZlbnRyeV9rZXksIGRpciwgYnVmZmVyLAorCQkJCSAgICAgcGFzdGVfc2l6ZSk7CiAJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCi0JICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLQlwYXRocmVsc2UgKCZwYXRoKTsKLQotCWlmICggcmV0dmFsID09IElPX0VSUk9SICkgewotCSAgICByZXR1cm4gLUVJTzsKKwkJcmVpc2VyZnNfa2ZyZWUoYnVmZmVyLCBidWZsZW4sIGRpci0+aV9zYik7CisJaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLSAgICAgICAgaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCi0JCQkgICAgICAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCi0JCQkgICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7Ci0gICAgICAgfQorCWRpci0+aV9zaXplICs9IHBhc3RlX3NpemU7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKKwkJLy8gcmVpc2VyZnNfbWtkaXIgb3IgcmVpc2VyZnNfcmVuYW1lIHdpbGwgZG8gdGhhdCBieSBpdHNlbGYKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBkaXIpOwogCi0JcmV0dXJuIC1FRVhJU1Q7Ci0gICAgfQotCi0gICAgZ2VuX251bWJlciA9IGZpbmRfZmlyc3RfemVyb19iaXQgKCh1bnNpZ25lZCBsb25nICopYml0X3N0cmluZywgTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7Ci0gICAgaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKLSAgICAgIC8qIHRoZXJlIGlzIG5vIGZyZWUgZ2VuZXJhdGlvbiBudW1iZXIgKi8KLSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKLSAgICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQotICAgICAgICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLSAgICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0gICAgLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KLSAgICBwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJmVudHJ5X2tleSwgZGVoX29mZnNldChkZWgpKTsKLSAKLSAgICAvKiB1cGRhdGUgbWF4LWhhc2gtY29sbGlzaW9ucyBjb3VudGVyIGluIHJlaXNlcmZzX3NiX2luZm8gKi8KLSAgICBQUk9DX0lORk9fTUFYKCB0aCAtPiB0X3N1cGVyLCBtYXhfaGFzaF9jb2xsaXNpb25zLCBnZW5fbnVtYmVyICk7Ci0gCQkgIAotICAgIGlmIChnZW5fbnVtYmVyICE9IDApIHsJLyogd2UgbmVlZCB0byByZS1zZWFyY2ggZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgKi8KLSAgICAgIGlmIChzZWFyY2hfYnlfZW50cnlfa2V5IChkaXItPmlfc2IsICZlbnRyeV9rZXksICZwYXRoLCAmZGUpICE9IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X2tleSk7Ci0KLQkgICAgaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCi0JCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLQkgICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0JICAgIHJldHVybiAtRUJVU1k7Ci0JfQotICAgIH0KLSAgCi0gICAgLyogcGVyZm9ybSB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBlbnRyeSB0aGF0IHdlIGhhdmUgcHJlcGFyZWQgKi8KLSAgICByZXR2YWwgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0gKHRoLCAmcGF0aCwgJmVudHJ5X2tleSwgZGlyLCBidWZmZXIsIHBhc3RlX3NpemUpOwotICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQotCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0JcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOwotCXJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgZGlyLT5pX3NpemUgKz0gcGFzdGVfc2l6ZTsKLSAgICBkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKLQkvLyByZWlzZXJmc19ta2RpciBvciByZWlzZXJmc19yZW5hbWUgd2lsbCBkbyB0aGF0IGJ5IGl0c2VsZgotCXJlaXNlcmZzX3VwZGF0ZV9zZCAodGgsIGRpcik7Ci0KLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgcmV0dXJuIDA7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHF1b3RhIHV0aWxpdHkgZnVuY3Rpb24sIGNhbGwgaWYgeW91J3ZlIGhhZCB0byBhYm9ydCBhZnRlciBjYWxsaW5nCkBAIC01NDgsMTIgKzU3MSwxMyBAQAogKiogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gaW5vZGVzIHRoYXQgZG8gbm90IGhhdmUgc3RhdCBkYXRhCiAqKiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIHlldC4KICovCi1zdGF0aWMgaW50IGRyb3BfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICBEUVVPVF9EUk9QKGlub2RlKTsKLSAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSkgOwotICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKLSAgICBpcHV0KGlub2RlKSA7Ci0gICAgcmV0dXJuIDAgOworc3RhdGljIGludCBkcm9wX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCURRVU9UX0RST1AoaW5vZGUpOworCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBkb2VzIHNldHVwIGZvciByZWlzZXJmc19uZXdfaW5vZGUuICAKQEAgLTU2MSw5MDIgKzU4NSw5NjggQEAKICoqIG91dHNpZGUgb2YgYSB0cmFuc2FjdGlvbiwgc28gd2UgaGFkIHRvIHB1bGwgc29tZSBiaXRzIG9mCiAqKiByZWlzZXJmc19uZXdfaW5vZGUgb3V0IGludG8gdGhpcyBmdW5jLgogKi8KLXN0YXRpYyBpbnQgbmV3X2lub2RlX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlKSB7CitzdGF0aWMgaW50IG5ld19pbm9kZV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkKK3sKIAotICAgIC8qIHRoZSBxdW90YSBpbml0IGNhbGxzIGhhdmUgdG8ga25vdyB3aG8gdG8gY2hhcmdlIHRoZSBxdW90YSB0bywgc28KLSAgICAqKiB3ZSBoYXZlIHRvIHNldCB1aWQgYW5kIGdpZCBoZXJlCi0gICAgKi8KLSAgICBpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKLSAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkvKiB0aGUgcXVvdGEgaW5pdCBjYWxscyBoYXZlIHRvIGtub3cgd2hvIHRvIGNoYXJnZSB0aGUgcXVvdGEgdG8sIHNvCisJICoqIHdlIGhhdmUgdG8gc2V0IHVpZCBhbmQgZ2lkIGhlcmUKKwkgKi8KKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAotICAgIGlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKLSAgICAgICAgaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKLSAgICAgICAgaWYgKFNfSVNESVIobW9kZSkpCi0gICAgICAgICAgICBpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0gICAgfQotICAgIERRVU9UX0lOSVQoaW5vZGUpOwotICAgIHJldHVybiAwIDsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZSB7CisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCX0KKwlEUVVPVF9JTklUKGlub2RlKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWlzZXJmc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKLQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgaW50IHJlaXNlcmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLwotICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTK1JFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGxvY2tlZDsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworCWludCBqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKworCSAgICAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IGxvY2tlZDsKIAotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7Ci0JcmV0dXJuIC1FTk9NRU0gOwotICAgIH0KLSAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKwlpZiAoIShpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmV3X2lub2RlX2luaXQoaW5vZGUsIGRpciwgbW9kZSk7CiAKLSAgICBsb2NrZWQgPSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbCAoZGlyKTsKKwlsb2NrZWQgPSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbChkaXIpOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKIAotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChkaXItPmlfc2IpOworCWlmIChsb2NrZWQpCisJCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKGRpci0+aV9zYik7CiAKLSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTCwgMC8qaV9zaXplKi8sIGRlbnRyeSwgaW5vZGUpOwotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKLQkKLSAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgICAgIGxvY2tlZCA9IDA7Ci0gICAgfQorCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX25ld19pbm9kZSgmdGgsIGRpciwgbW9kZSwgTlVMTCwgMCAvKmlfc2l6ZSAqLyAsIGRlbnRyeSwKKwkJCSAgICAgICBpbm9kZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfZmFpbGVkOwogCi0gICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotICAgIGlub2RlLT5pX2ZvcCA9ICZyZWlzZXJmc19maWxlX29wZXJhdGlvbnM7Ci0gICAgaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIDsKKwlpZiAobG9ja2VkKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoZGlyLT5pX3NiKTsKKwkJbG9ja2VkID0gMDsKKwl9CiAKLSAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sIAotCQkJCWlub2RlLCAxLyp2aXNpYmxlKi8pOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgaW50IGVycjsKLQlpbm9kZS0+aV9ubGluay0tOwotCXJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0JZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgICAgICBpZiAoZXJyKQotICAgICAgICAgICAgcmV0dmFsID0gZXJyOwotCWlwdXQgKGlub2RlKTsKLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7CiAKLSAgICBkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwotICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuLCBpbm9kZSwgMSAvKnZpc2libGUgKi8gKTsKKwlpZiAocmV0dmFsKSB7CisJCWludCBlcnI7CisJCWlub2RlLT5pX25saW5rLS07CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcik7CiAKLW91dF9mYWlsZWQ6Ci0gICAgaWYgKGxvY2tlZCkKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKLSAgICByZXR1cm4gcmV0dmFsOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisKKyAgICAgIG91dF9mYWlsZWQ6CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhkaXItPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7CiB9CiAKLQotc3RhdGljIGludCByZWlzZXJmc19ta25vZCAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCByZGV2KQorc3RhdGljIGludCByZWlzZXJmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgZGV2X3QgcmRldikKIHsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KLSAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOwotICAgIGludCBsb2NrZWQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworCWludCBqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKworCSAgICAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOworCWludCBsb2NrZWQ7CiAKLSAgICBpZiAoIW5ld192YWxpZF9kZXYocmRldikpCi0JcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7Ci0JcmV0dXJuIC1FTk9NRU0gOwotICAgIH0KLSAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKwlpZiAoIShpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmV3X2lub2RlX2luaXQoaW5vZGUsIGRpciwgbW9kZSk7CiAKLSAgICBsb2NrZWQgPSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbCAoZGlyKTsKKwlsb2NrZWQgPSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbChkaXIpOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKIAotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChkaXItPmlfc2IpOworCWlmIChsb2NrZWQpCisJCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKGRpci0+aV9zYik7CiAKLSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7Ci0gICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9CisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwlpZiAocmV0dmFsKSB7CisJCWRyb3BfbmV3X2lub2RlKGlub2RlKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KIAotICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBkaXIsIG1vZGUsIE5VTEwsIDAvKmlfc2l6ZSovLCBkZW50cnksIGlub2RlKTsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9CisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfbmV3X2lub2RlKCZ0aCwgZGlyLCBtb2RlLCBOVUxMLCAwIC8qaV9zaXplICovICwgZGVudHJ5LAorCQkJICAgICAgIGlub2RlKTsKKwlpZiAocmV0dmFsKSB7CisJCWdvdG8gb3V0X2ZhaWxlZDsKKwl9CiAKLSAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgICAgIGxvY2tlZCA9IDA7Ci0gICAgfQorCWlmIChsb2NrZWQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhkaXItPmlfc2IpOworCQlsb2NrZWQgPSAwOworCX0KIAorCWlub2RlLT5pX29wID0gJnJlaXNlcmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKKwlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIHJkZXYpOwogCi0gICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOwotICAgIGluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldikgOworCS8vRklYTUU6IG5lZWRlZCBmb3IgYmxvY2sgYW5kIGNoYXIgZGV2aWNlcyBvbmx5CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOwogCi0gICAgLy9GSVhNRTogbmVlZGVkIGZvciBibG9jayBhbmQgY2hhciBkZXZpY2VzIG9ubHkKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcik7CiAKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfYWRkX2VudHJ5KCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CisJaWYgKHJldHZhbCkgeworCQlpbnQgZXJyOworCQlpbm9kZS0+aV9ubGluay0tOworCQlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQlpZiAoZXJyKQorCQkJcmV0dmFsID0gZXJyOworCQlpcHV0KGlub2RlKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KIAotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJIGlub2RlLCAxLyp2aXNpYmxlKi8pOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgaW50IGVycjsKLQlpbm9kZS0+aV9ubGluay0tOwotCXJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0JZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgICAgICBpZiAoZXJyKQotCSAgICByZXR2YWwgPSBlcnI7Ci0JaXB1dCAoaW5vZGUpOwotCWdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlyZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKIAotICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotCi1vdXRfZmFpbGVkOgotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIG91dF9mYWlsZWQ6CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhkaXItPmlfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7CiB9CiAKLQotc3RhdGljIGludCByZWlzZXJmc19ta2RpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQorc3RhdGljIGludCByZWlzZXJmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKIHsKLSAgICBpbnQgcmV0dmFsOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KLSAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOwotICAgIGludCBsb2NrZWQ7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworCWludCBqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKworCSAgICAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRpci0+aV9zYikpOworCWludCBsb2NrZWQ7CiAKICNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCi0gICAgLyogc2V0IGZsYWcgdGhhdCBuZXcgcGFja2luZyBsb2NhbGl0eSBjcmVhdGVkIGFuZCBuZXcgYmxvY2tzIGZvciB0aGUgY29udGVudCAgICAgKiBvZiB0aGF0IGRpcmVjdG9yeSBhcmUgbm90IGRpc3BsYWNlZCB5ZXQgKi8KLSAgICBSRUlTRVJGU19JKGRpciktPm5ld19wYWNraW5nX2xvY2FsaXR5ID0gMTsKKwkvKiBzZXQgZmxhZyB0aGF0IG5ldyBwYWNraW5nIGxvY2FsaXR5IGNyZWF0ZWQgYW5kIG5ldyBibG9ja3MgZm9yIHRoZSBjb250ZW50ICAgICAqIG9mIHRoYXQgZGlyZWN0b3J5IGFyZSBub3QgZGlzcGxhY2VkIHlldCAqLworCVJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkgPSAxOwogI2VuZGlmCi0gICAgbW9kZSA9IFNfSUZESVIgfCBtb2RlOwotICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7Ci0JcmV0dXJuIC1FTk9NRU0gOwotICAgIH0KLSAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKwltb2RlID0gU19JRkRJUiB8IG1vZGU7CisJaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOwogCi0gICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisJbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woZGlyKTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICBpZiAobG9ja2VkKQotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisJaWYgKGxvY2tlZCkKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGlyLT5pX3NiKTsKIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKLSAgICAgICAgZ290byBvdXRfZmFpbGVkOwotICAgIH0KKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCisJLyogaW5jIHRoZSBsaW5rIGNvdW50IG5vdywgc28gYW5vdGhlciB3cml0ZXIgZG9lc24ndCBvdmVyZmxvdyBpdCB3aGlsZQorCSAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KKwkgKi8KKwlJTkNfRElSX0lOT0RFX05MSU5LKGRpcikKIAotICAgIC8qIGluYyB0aGUgbGluayBjb3VudCBub3csIHNvIGFub3RoZXIgd3JpdGVyIGRvZXNuJ3Qgb3ZlcmZsb3cgaXQgd2hpbGUKLSAgICAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KLSAgICAqLwotICAgIElOQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCSAgICByZXR2YWwgPSByZWlzZXJmc19uZXdfaW5vZGUoJnRoLCBkaXIsIG1vZGUsIE5VTEwgLypzeW1saW5rICovICwKKwkJCQkJb2xkX2Zvcm1hdF9vbmx5KGRpci0+aV9zYikgPworCQkJCQlFTVBUWV9ESVJfU0laRV9WMSA6IEVNUFRZX0RJUl9TSVpFLAorCQkJCQlkZW50cnksIGlub2RlKTsKKwlpZiAocmV0dmFsKSB7CisJCWRpci0+aV9ubGluay0tOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQogCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTC8qc3ltbGluayovLAotCQkJCW9sZF9mb3JtYXRfb25seSAoZGlyLT5pX3NiKSA/IAotCQkJCUVNUFRZX0RJUl9TSVpFX1YxIDogRU1QVFlfRElSX1NJWkUsCi0JCQkJZGVudHJ5LCBpbm9kZSk7Ci0gICAgaWYgKHJldHZhbCkgewotCWRpci0+aV9ubGluay0tIDsKLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQorCWlmIChsb2NrZWQpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhkaXItPmlfc2IpOworCQlsb2NrZWQgPSAwOworCX0KIAotICAgIGlmIChsb2NrZWQpIHsKLQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOwotCWxvY2tlZCA9IDA7Ci0gICAgfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcik7CiAKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisJaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOwogCi0gICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0gICAgaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zOworCS8vIG5vdGUsIF90aGlzXyBhZGRfZW50cnkgd2lsbCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQorCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX2FkZF9lbnRyeSgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxIC8qdmlzaWJsZSAqLyApOworCWlmIChyZXR2YWwpIHsKKwkJaW50IGVycjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQlERUNfRElSX0lOT0RFX05MSU5LKGRpcik7CisJCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKwkJZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCS8vIHRoZSBhYm92ZSBhZGRfZW50cnkgZGlkIG5vdCB1cGRhdGUgZGlyJ3Mgc3RhdCBkYXRhCisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgZGlyKTsKIAotICAgIC8vIG5vdGUsIF90aGlzXyBhZGRfZW50cnkgd2lsbCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJaW5vZGUsIDEvKnZpc2libGUqLyk7Ci0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmsgPSAwOwotCURFQ19ESVJfSU5PREVfTkxJTksoZGlyKTsKLQlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLQlpZiAoZXJyKQotCSAgICByZXR2YWwgPSBlcnI7Ci0JaXB1dCAoaW5vZGUpOwotCWdvdG8gb3V0X2ZhaWxlZDsKLSAgICB9Ci0KLSAgICAvLyB0aGUgYWJvdmUgYWRkX2VudHJ5IGRpZCBub3QgdXBkYXRlIGRpcidzIHN0YXQgZGF0YQotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBkaXIpOwotCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci1vdXRfZmFpbGVkOgotICAgIGlmIChsb2NrZWQpCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKLSAgICAvKiB3ZSBjYW4gY2hlYXQgYmVjYXVzZSBhbiBvbGQgZm9ybWF0IGRpciBjYW5ub3QgaGF2ZQotICAgICoqIEVNUFRZX0RJUl9TSVpFLCBhbmQgYSBuZXcgZm9ybWF0IGRpciBjYW5ub3QgaGF2ZQotICAgICoqIEVNUFRZX0RJUl9TSVpFX1YxLiAgU28sIGlmIHRoZSBpbm9kZSBpcyBlaXRoZXIgc2l6ZSwgCi0gICAgKiogcmVnYXJkbGVzcyBvZiBkaXNrIGZvcm1hdCB2ZXJzaW9uLCB0aGUgZGlyZWN0b3J5IGlzIGVtcHR5LgotICAgICovCi0gICAgaWYgKGlub2RlLT5pX3NpemUgIT0gRU1QVFlfRElSX1NJWkUgJiYKLSAgICAgICAgaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRV9WMSkgewotICAgICAgICByZXR1cm4gMCA7Ci0gICAgfQotICAgIHJldHVybiAxIDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc19ybWRpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0gICAgaW50IHJldHZhbCwgZXJyOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOwotICAgIGludCBqYmVnaW5fY291bnQ7IAotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLQotCi0gICAgLyogd2Ugd2lsbCBiZSBkb2luZyAyIGJhbGFuY2luZ3MgYW5kIHVwZGF0ZSAyIHN0YXQgZGF0YSwgd2UgY2hhbmdlIHF1b3RhcwotICAgICAqIG9mIHRoZSBvd25lciBvZiB0aGUgZGlyZWN0b3J5IGFuZCBvZiB0aGUgb3duZXIgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgKi8KLSAgICBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOwotCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOwotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpCi0gICAgICAgIGdvdG8gb3V0X3JtZGlyOwotCi0gICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKLSAgICBpZiAoIChyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJnBhdGgsICZkZSkpID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0JcmV0dmFsID0gLUVOT0VOVDsKLQlnb3RvIGVuZF9ybWRpcjsKLSAgICB9IGVsc2UgaWYgKCByZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZXR2YWwgPSAtRUlPOwotCWdvdG8gZW5kX3JtZGlyOwotICAgIH0KLQotICAgIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOwotCi0gICAgaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgewotCS8vIEZJWE1FOiBjb21wYXJlIGtleSBvZiBhbiBvYmplY3QgYW5kIGEga2V5IGZvdW5kIGluIHRoZQotCS8vIGVudHJ5Ci0JcmV0dmFsID0gLUVJTzsKLQlnb3RvIGVuZF9ybWRpcjsKLSAgICB9Ci0gICAgaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIoaW5vZGUpKSB7Ci0JcmV0dmFsID0gLUVOT1RFTVBUWTsKLQlnb3RvIGVuZF9ybWRpcjsKLSAgICB9Ci0KLSAgICAvKiBjdXQgZW50cnkgZnJvbSBkaXIgZGlyZWN0b3J5ICovCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoJnRoLCAmcGF0aCwgJihkZS5kZV9lbnRyeV9rZXkpLCBkaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qIHBhZ2UgKi8gCi0JCQkJICAgICAwLypuZXcgZmlsZSBzaXplIC0gbm90IHVzZWQgaGVyZSovKTsKLSAgICBpZiAocmV0dmFsIDwgMCkKLQlnb3RvIGVuZF9ybWRpcjsKLQotICAgIGlmICggaW5vZGUtPmlfbmxpbmsgIT0gMiAmJiBpbm9kZS0+aV9ubGluayAhPSAxICkKLQlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIiVzOiBlbXB0eSBkaXJlY3RvcnkgaGFzIG5saW5rICIKLQkJCSAgIiE9IDIgKCVkKSIsIF9fRlVOQ1RJT05fXywgaW5vZGUtPmlfbmxpbmspOwotCi0gICAgaW5vZGUtPmlfbmxpbmsgPSAwOwotICAgIGlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCi0gICAgREVDX0RJUl9JTk9ERV9OTElOSyhkaXIpCi0gICAgZGlyLT5pX3NpemUgLT0gKERFSF9TSVpFICsgZGUuZGVfZW50cnlsZW4pOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBkaXIpOwotCi0gICAgLyogcHJldmVudCBlbXB0eSBkaXJlY3RvcnkgZnJvbSBnZXR0aW5nIGxvc3QgKi8KLSAgICBhZGRfc2F2ZV9saW5rICgmdGgsIGlub2RlLCAwLyogbm90IHRydW5jYXRlICovKTsKLQotICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci1vdXRfcm1kaXI6Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKLQkKLSBlbmRfcm1kaXI6Ci0gICAgLyogd2UgbXVzdCByZWxlYXNlIHBhdGgsIGJlY2F1c2Ugd2UgZGlkIG5vdCBjYWxsCi0gICAgICAgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSwgb3IgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSBkb2VzIG5vdAotICAgICAgIHJlbGVhc2UgcGF0aCBpZiBvcGVyYXRpb24gd2FzIG5vdCBjb21wbGV0ZSAqLwotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKLSAgICByZXR1cm4gZXJyID8gZXJyIDogcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJlaXNlcmZzX3VubGluayAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0gICAgaW50IHJldHZhbCwgZXJyOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgICBpbnQgamJlZ2luX2NvdW50OwotICAgIHVuc2lnbmVkIGxvbmcgc2F2ZWxpbms7Ci0KLSAgICBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQotICAgIC8qIGluIHRoaXMgdHJhbnNhY3Rpb24gd2UgY2FuIGJlIGRvaW5nIGF0IG1heCB0d28gYmFsYW5jaW5ncyBhbmQgdXBkYXRlCi0gICAgICAgdHdvIHN0YXQgZGF0YXMsIHdlIGNoYW5nZSBxdW90YXMgb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mCi0gICAgICAgdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCi0gICAgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKLQotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKQotICAgICAgICBnb3RvIG91dF91bmxpbms7Ci0JCi0gICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKLSAgICBpZiAoIChyZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJnBhdGgsICZkZSkpID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0JcmV0dmFsID0gLUVOT0VOVDsKLQlnb3RvIGVuZF91bmxpbms7Ci0gICAgfSBlbHNlIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQlyZXR2YWwgPSAtRUlPOwotCWdvdG8gZW5kX3VubGluazsKLSAgICB9Ci0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7Ci0KLSAgICBpZiAoZGUuZGVfb2JqZWN0aWQgIT0gaW5vZGUtPmlfaW5vKSB7Ci0JLy8gRklYTUU6IGNvbXBhcmUga2V5IG9mIGFuIG9iamVjdCBhbmQgYSBrZXkgZm91bmQgaW4gdGhlCi0JLy8gZW50cnkKLQlyZXR2YWwgPSAtRUlPOwotCWdvdG8gZW5kX3VubGluazsKLSAgICB9Ci0gIAotICAgIGlmICghaW5vZGUtPmlfbmxpbmspIHsKLQlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIiVzOiBkZWxldGluZyBub25leGlzdGVudCBmaWxlICIKLQkJCSAgIiglczolbHUpLCAlZCIsIF9fRlVOQ1RJT05fXywKLQkJCSAgcmVpc2VyZnNfYmRldm5hbWUgKGlub2RlLT5pX3NiKSwgaW5vZGUtPmlfaW5vLAotCQkJICBpbm9kZS0+aV9ubGluayk7Ci0JaW5vZGUtPmlfbmxpbmsgPSAxOwotICAgIH0KLQotICAgIGlub2RlLT5pX25saW5rLS07Ci0KLSAgICAvKgotICAgICAqIHdlIHNjaGVkdWxlIGJlZm9yZSBkb2luZyB0aGUgYWRkX3NhdmVfbGluayBjYWxsLCBzYXZlIHRoZSBsaW5rCi0gICAgICogY291bnQgc28gd2UgZG9uJ3QgcmFjZQotICAgICAqLwotICAgIHNhdmVsaW5rID0gaW5vZGUtPmlfbmxpbms7Ci0KLQotICAgIHJldHZhbCA9IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKCZ0aCwgJnBhdGgsICYoZGUuZGVfZW50cnlfa2V5KSwgZGlyLCBOVUxMLCAwKTsKLSAgICBpZiAocmV0dmFsIDwgMCkgewotCWlub2RlLT5pX25saW5rKys7Ci0JZ290byBlbmRfdW5saW5rOwotICAgIH0KLSAgICBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLQotICAgIGRpci0+aV9zaXplIC09IChkZS5kZV9lbnRyeWxlbiArIERFSF9TSVpFKTsKLSAgICBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBkaXIpOwotCi0gICAgaWYgKCFzYXZlbGluaykKLSAgICAgICAvKiBwcmV2ZW50IGZpbGUgZnJvbSBnZXR0aW5nIGxvc3QgKi8KLSAgICAgICBhZGRfc2F2ZV9saW5rICgmdGgsIGlub2RlLCAwLyogbm90IHRydW5jYXRlICovKTsKLQotICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKLQotIGVuZF91bmxpbms6Ci0gICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0gICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKLSAgICBpZiAoZXJyKQotICAgICAgICByZXR2YWwgPSBlcnI7Ci1vdXRfdW5saW5rOgotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgcmVpc2VyZnNfc3ltbGluayAoc3RydWN0IGlub2RlICogcGFyZW50X2RpciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY29uc3QgY2hhciAqIHN5bW5hbWUpCi17Ci0gICAgaW50IHJldHZhbDsKLSAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKLSAgICBjaGFyICogbmFtZTsKLSAgICBpbnQgaXRlbV9sZW47Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IG1vZGUgPSBTX0lGTE5LIHwgU19JUldYVUdPOwotICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KLSAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOwotCi0gICAgaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUocGFyZW50X2Rpci0+aV9zYikpKSB7Ci0JcmV0dXJuIC1FTk9NRU0gOwotICAgIH0KLSAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgcGFyZW50X2RpciwgbW9kZSk7Ci0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKHBhcmVudF9kaXItPmlfc2IpOwotICAgIGl0ZW1fbGVuID0gUk9VTkRfVVAgKHN0cmxlbiAoc3ltbmFtZSkpOwotICAgIGlmIChpdGVtX2xlbiA+IE1BWF9ESVJFQ1RfSVRFTV9MRU4gKHBhcmVudF9kaXItPmlfc2ItPnNfYmxvY2tzaXplKSkgewotCXJldHZhbCA9ICAtRU5BTUVUT09MT05HOwotCWRyb3BfbmV3X2lub2RlKGlub2RlKTsKLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQotICAKLSAgICBuYW1lID0gcmVpc2VyZnNfa21hbGxvYyAoaXRlbV9sZW4sIEdGUF9OT0ZTLCBwYXJlbnRfZGlyLT5pX3NiKTsKLSAgICBpZiAoIW5hbWUpIHsKLQlkcm9wX25ld19pbm9kZShpbm9kZSk7Ci0JcmV0dmFsID0gIC1FTk9NRU07Ci0JZ290byBvdXRfZmFpbGVkOwotICAgIH0KLSAgICBtZW1jcHkgKG5hbWUsIHN5bW5hbWUsIHN0cmxlbiAoc3ltbmFtZSkpOwotICAgIHBhZGRfaXRlbSAobmFtZSwgaXRlbV9sZW4sIHN0cmxlbiAoc3ltbmFtZSkpOwotCi0gICAgLyogV2Ugd291bGQgaW5oZXJpdCB0aGUgZGVmYXVsdCBBQ0wgaGVyZSwgYnV0IHN5bWxpbmtzIGRvbid0IGdldCBBQ0xzICovCi0KLSAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcGFyZW50X2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0gICAgaWYgKHJldHZhbCkgewotICAgICAgICBkcm9wX25ld19pbm9kZSAoaW5vZGUpOwotICAgICAgICByZWlzZXJmc19rZnJlZSAobmFtZSwgaXRlbV9sZW4sIHBhcmVudF9kaXItPmlfc2IpOwotICAgICAgICBnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQotCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIHBhcmVudF9kaXIsIG1vZGUsIG5hbWUsIHN0cmxlbiAoc3ltbmFtZSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmVpc2VyZnNfa2ZyZWUgKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKLSAgICBpZiAocmV0dmFsKSB7IC8qIHJlaXNlcmZzX25ld19pbm9kZSBpcHV0cyBmb3IgdXMgKi8KLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBhcmVudF9kaXIpIDsKLQotICAgIGlub2RlLT5pX29wID0gJnJlaXNlcmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLSAgICBpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7Ci0KLSAgICAvLyBtdXN0IGJlIHN1cmUgdGhpcyBpbm9kZSBpcyB3cml0dGVuIHdpdGggdGhpcyB0cmFuc2FjdGlvbgotICAgIC8vCi0gICAgLy9yZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUsIFJFQURfQkxPQ0tTKTsKLQotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBwYXJlbnRfZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEvKnZpc2libGUqLyk7Ci0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmstLTsKLQlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOwotCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgcGFyZW50X2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7Ci0JaWYgKGVycikKLQkgICAgcmV0dmFsID0gZXJyOwotCWlwdXQgKGlub2RlKTsKLQlnb3RvIG91dF9mYWlsZWQ7Ci0gICAgfQotCi0gICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLSAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotb3V0X2ZhaWxlZDoKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2socGFyZW50X2Rpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIGludCByZWlzZXJmc19saW5rIChzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQotewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgdXBkYXRlIG9mIHF1b3RhcyBmb3IgdGhlIG93bmVycyBvZiB0aGUgZGlyZWN0b3J5ICovCi0gICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1M7Ci0KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7Ci0gICAgaWYgKGlub2RlLT5pX25saW5rID49IFJFSVNFUkZTX0xJTktfTUFYKSB7Ci0JLy9GSVhNRTogc2RfbmxpbmsgaXMgMzIgYml0IGZvciBuZXcgZmlsZXMKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworICAgICAgb3V0X2ZhaWxlZDoKKwlpZiAobG9ja2VkKQorCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGRpci0+aV9zYik7CiAJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7Ci0JcmV0dXJuIC1FTUxJTks7Ci0gICAgfQotICAgIGlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9CisJcmV0dXJuIHJldHZhbDsKK30KIAotICAgIC8qIGluYyBiZWZvcmUgc2NoZWR1bGluZyBzbyByZWlzZXJmc191bmxpbmsga25vd3Mgd2UgYXJlIGhlcmUgKi8KLSAgICBpbm9kZS0+aV9ubGluaysrOworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogd2UgY2FuIGNoZWF0IGJlY2F1c2UgYW4gb2xkIGZvcm1hdCBkaXIgY2Fubm90IGhhdmUKKwkgKiogRU1QVFlfRElSX1NJWkUsIGFuZCBhIG5ldyBmb3JtYXQgZGlyIGNhbm5vdCBoYXZlCisJICoqIEVNUFRZX0RJUl9TSVpFX1YxLiAgU28sIGlmIHRoZSBpbm9kZSBpcyBlaXRoZXIgc2l6ZSwgCisJICoqIHJlZ2FyZGxlc3Mgb2YgZGlzayBmb3JtYXQgdmVyc2lvbiwgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfc2l6ZSAhPSBFTVBUWV9ESVJfU0laRSAmJgorCSAgICBpbm9kZS0+aV9zaXplICE9IEVNUFRZX0RJUl9TSVpFX1YxKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KIAotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIGlmIChyZXR2YWwpIHsKLSAgICAgICAgaW5vZGUtPmlfbmxpbmstLTsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChkaXItPmlfc2IpOwotICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgIH0KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsLCBlcnI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBqYmVnaW5fY291bnQ7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CiAKLSAgICAvKiBjcmVhdGUgbmV3IGVudHJ5ICovCi0gICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAotCQkJCSBpbm9kZSwgMS8qdmlzaWJsZSovKTsKKwkvKiB3ZSB3aWxsIGJlIGRvaW5nIDIgYmFsYW5jaW5ncyBhbmQgdXBkYXRlIDIgc3RhdCBkYXRhLCB3ZSBjaGFuZ2UgcXVvdGFzCisJICogb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKwkgKiBUaGUgcXVvdGEgc3RydWN0dXJlIGlzIHBvc3NpYmx5IGRlbGV0ZWQgb25seSBvbiBsYXN0IGlwdXQgPT4gb3V0c2lkZQorCSAqIG9mIHRoaXMgdHJhbnNhY3Rpb24gKi8KKwlqYmVnaW5fY291bnQgPQorCSAgICBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDIgKyAyICsKKwkgICAgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpOwogCi0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3JtZGlyOwogCi0gICAgaWYgKHJldHZhbCkgewotCWludCBlcnI7Ci0JaW5vZGUtPmlfbmxpbmstLTsKLQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwlpZiAoKHJldHZhbCA9CisJICAgICByZWlzZXJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSAmcGF0aCwgJmRlKSkgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkJcmV0dmFsID0gLUVOT0VOVDsKKwkJZ290byBlbmRfcm1kaXI7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOworCisJaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgeworCQkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKKwkJLy8gZW50cnkKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorCWlmICghcmVpc2VyZnNfZW1wdHlfZGlyKGlub2RlKSkgeworCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQlnb3RvIGVuZF9ybWRpcjsKKwl9CisKKwkvKiBjdXQgZW50cnkgZnJvbSBkaXIgZGlyZWN0b3J5ICovCisJcmV0dmFsID0gcmVpc2VyZnNfY3V0X2Zyb21faXRlbSgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwJLyogcGFnZSAqLworCQkJCQkwIC8qbmV3IGZpbGUgc2l6ZSAtIG5vdCB1c2VkIGhlcmUgKi8gKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlbmRfcm1kaXI7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gMiAmJiBpbm9kZS0+aV9ubGluayAhPSAxKQorCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiJXM6IGVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIgorCQkJCSAiIT0gMiAoJWQpIiwgX19GVU5DVElPTl9fLCBpbm9kZS0+aV9ubGluayk7CisKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKworCURFQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCSAgICBkaXItPmlfc2l6ZSAtPSAoREVIX1NJWkUgKyBkZS5kZV9lbnRyeWxlbik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgZGlyKTsKKworCS8qIHByZXZlbnQgZW1wdHkgZGlyZWN0b3J5IGZyb20gZ2V0dGluZyBsb3N0ICovCisJYWRkX3NhdmVfbGluaygmdGgsIGlub2RlLCAwIC8qIG5vdCB0cnVuY2F0ZSAqLyApOworCisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCk7CisgICAgICBvdXRfcm1kaXI6CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZW5kX3JtZGlyOgorCS8qIHdlIG11c3QgcmVsZWFzZSBwYXRoLCBiZWNhdXNlIHdlIGRpZCBub3QgY2FsbAorCSAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0sIG9yIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZG9lcyBub3QKKwkgICByZWxlYXNlIHBhdGggaWYgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGUgKi8KKwlwYXRocmVsc2UoJnBhdGgpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwogCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwogCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7Ci0gICAgfQotCi0gICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7Ci0KLSAgICBhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCkgOwotICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOwotICAgIHJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbCwgZXJyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2F2ZWxpbms7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIGluIHRoaXMgdHJhbnNhY3Rpb24gd2UgY2FuIGJlIGRvaW5nIGF0IG1heCB0d28gYmFsYW5jaW5ncyBhbmQgdXBkYXRlCisJICogdHdvIHN0YXQgZGF0YXMsIHdlIGNoYW5nZSBxdW90YXMgb2YgdGhlIG93bmVyIG9mIHRoZSBkaXJlY3RvcnkgYW5kIG9mCisJICogdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiBUaGUgcXVvdGEgc3RydWN0dXJlIGlzIHBvc3NpYmx5CisJICogZGVsZXRlZCBvbmx5IG9uIGlwdXQgPT4gb3V0c2lkZSBvZiB0aGlzIHRyYW5zYWN0aW9uICovCisJamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArCisJICAgIDQgKiBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MoZGlyLT5pX3NiKTsKKworCXJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKwlyZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VubGluazsKKworCWRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisJaWYgKChyZXR2YWwgPQorCSAgICAgcmVpc2VyZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgJnBhdGgsICZkZSkpID09IE5BTUVfTk9UX0ZPVU5EKSB7CisJCXJldHZhbCA9IC1FTk9FTlQ7CisJCWdvdG8gZW5kX3VubGluazsKKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIGVuZF91bmxpbms7CisJfQorCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKTsKKworCWlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJLy8gRklYTUU6IGNvbXBhcmUga2V5IG9mIGFuIG9iamVjdCBhbmQgYSBrZXkgZm91bmQgaW4gdGhlCisJCS8vIGVudHJ5CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gZW5kX3VubGluazsKKwl9CisKKwlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICIlczogZGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAiCisJCQkJICIoJXM6JWx1KSwgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKGlub2RlLT5pX3NiKSwgaW5vZGUtPmlfaW5vLAorCQkJCSBpbm9kZS0+aV9ubGluayk7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwl9CisKKwlpbm9kZS0+aV9ubGluay0tOworCisJLyoKKwkgKiB3ZSBzY2hlZHVsZSBiZWZvcmUgZG9pbmcgdGhlIGFkZF9zYXZlX2xpbmsgY2FsbCwgc2F2ZSB0aGUgbGluaworCSAqIGNvdW50IHNvIHdlIGRvbid0IHJhY2UKKwkgKi8KKwlzYXZlbGluayA9IGlub2RlLT5pX25saW5rOworCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwKKwkJCQkgICAwKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlpbm9kZS0+aV9ubGluaysrOworCQlnb3RvIGVuZF91bmxpbms7CisJfQorCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisKKwlkaXItPmlfc2l6ZSAtPSAoZGUuZGVfZW50cnlsZW4gKyBERUhfU0laRSk7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBkaXIpOworCisJaWYgKCFzYXZlbGluaykKKwkJLyogcHJldmVudCBmaWxlIGZyb20gZ2V0dGluZyBsb3N0ICovCisJCWFkZF9zYXZlX2xpbmsoJnRoLCBpbm9kZSwgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsKKworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7CisKKyAgICAgIGVuZF91bmxpbms6CisJcGF0aHJlbHNlKCZwYXRoKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKKwlpZiAoZXJyKQorCQlyZXR2YWwgPSBlcnI7CisgICAgICBvdXRfdW5saW5rOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKnBhcmVudF9kaXIsCisJCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyICpuYW1lOworCWludCBpdGVtX2xlbjsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBtb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisJaW50IGpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArCisJICAgIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocGFyZW50X2Rpci0+aV9zYikgKworCQkgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKHBhcmVudF9kaXItPmlfc2IpKTsKKworCWlmICghKGlub2RlID0gbmV3X2lub2RlKHBhcmVudF9kaXItPmlfc2IpKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmV3X2lub2RlX2luaXQoaW5vZGUsIHBhcmVudF9kaXIsIG1vZGUpOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKwlpdGVtX2xlbiA9IFJPVU5EX1VQKHN0cmxlbihzeW1uYW1lKSk7CisJaWYgKGl0ZW1fbGVuID4gTUFYX0RJUkVDVF9JVEVNX0xFTihwYXJlbnRfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwkJcmV0dmFsID0gLUVOQU1FVE9PTE9ORzsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJbmFtZSA9IHJlaXNlcmZzX2ttYWxsb2MoaXRlbV9sZW4sIEdGUF9OT0ZTLCBwYXJlbnRfZGlyLT5pX3NiKTsKKwlpZiAoIW5hbWUpIHsKKwkJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCW1lbWNweShuYW1lLCBzeW1uYW1lLCBzdHJsZW4oc3ltbmFtZSkpOworCXBhZGRfaXRlbShuYW1lLCBpdGVtX2xlbiwgc3RybGVuKHN5bW5hbWUpKTsKKworCS8qIFdlIHdvdWxkIGluaGVyaXQgdGhlIGRlZmF1bHQgQUNMIGhlcmUsIGJ1dCBzeW1saW5rcyBkb24ndCBnZXQgQUNMcyAqLworCisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlkcm9wX25ld19pbm9kZShpbm9kZSk7CisJCXJlaXNlcmZzX2tmcmVlKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKKwkJZ290byBvdXRfZmFpbGVkOworCX0KKworCXJldHZhbCA9CisJICAgIHJlaXNlcmZzX25ld19pbm9kZSgmdGgsIHBhcmVudF9kaXIsIG1vZGUsIG5hbWUsIHN0cmxlbihzeW1uYW1lKSwKKwkJCSAgICAgICBkZW50cnksIGlub2RlKTsKKwlyZWlzZXJmc19rZnJlZShuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7CisJaWYgKHJldHZhbCkgewkJLyogcmVpc2VyZnNfbmV3X2lub2RlIGlwdXRzIGZvciB1cyAqLworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ocGFyZW50X2Rpcik7CisKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworCisJLy8gbXVzdCBiZSBzdXJlIHRoaXMgaW5vZGUgaXMgd3JpdHRlbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKwkvLworCS8vcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlLCBSRUFEX0JMT0NLUyk7CisKKwlyZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBwYXJlbnRfZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxIC8qdmlzaWJsZSAqLyApOworCWlmIChyZXR2YWwpIHsKKwkJaW50IGVycjsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgaW5vZGUpOworCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIG91dF9mYWlsZWQ7CisJfQorCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlyZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisgICAgICBvdXRfZmFpbGVkOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsCisJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwkvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyB1cGRhdGUgb2YgcXVvdGFzIGZvciB0aGUgb3duZXJzIG9mIHRoZSBkaXJlY3RvcnkgKi8KKwlpbnQgamJlZ2luX2NvdW50ID0KKwkgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAzICsKKwkgICAgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpOworCisJcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCWlmIChpbm9kZS0+aV9ubGluayA+PSBSRUlTRVJGU19MSU5LX01BWCkgeworCQkvL0ZJWE1FOiBzZF9ubGluayBpcyAzMiBiaXQgZm9yIG5ldyBmaWxlcworCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJcmV0dXJuIC1FTUxJTks7CisJfQorCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBpbmMgYmVmb3JlIHNjaGVkdWxpbmcgc28gcmVpc2VyZnNfdW5saW5rIGtub3dzIHdlIGFyZSBoZXJlICovCisJaW5vZGUtPmlfbmxpbmsrKzsKKworCXJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlpbm9kZS0+aV9ubGluay0tOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwkvKiBjcmVhdGUgbmV3IGVudHJ5ICovCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfYWRkX2VudHJ5KCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaW5vZGUsIDEgLyp2aXNpYmxlICovICk7CisKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpOworCisJaWYgKHJldHZhbCkgeworCQlpbnQgZXJyOworCQlpbm9kZS0+aV9ubGluay0tOworCQllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7CisJfQorCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmdGgsIGlub2RlKTsKKworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCXJldHVybiByZXR2YWw7Cit9CiAKIC8vIGRlIGNvbnRhaW5zIGluZm9ybWF0aW9uIHBvaW50aW5nIHRvIGFuIGVudHJ5IHdoaWNoIAotc3RhdGljIGludCBkZV9zdGlsbF92YWxpZCAoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4sIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3N0YXRpYyBpbnQgZGVfc3RpbGxfdmFsaWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwKKwkJCSAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSB0bXAgPSAqZGU7Ci0gICAgCi0gICAgLy8gcmVjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lIGxlbmd0aAotICAgIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuICgmdG1wKTsKLSAgICAvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQotICAgIGlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wIChuYW1lLCBkZS0+ZGVfbmFtZSwgbGVuKSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gMTsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IHRtcCA9ICpkZTsKKworCS8vIHJlY2FsY3VsYXRlIHBvaW50ZXIgdG8gbmFtZSBhbmQgbmFtZSBsZW5ndGgKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmdG1wKTsKKwkvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQorCWlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wKG5hbWUsIGRlLT5kZV9uYW1lLCBsZW4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKIH0KIAotCi1zdGF0aWMgaW50IGVudHJ5X3BvaW50c190b19vYmplY3QgKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQorc3RhdGljIGludCBlbnRyeV9wb2ludHNfdG9fb2JqZWN0KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCQkJICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgaWYgKCFkZV9zdGlsbF92YWxpZCAobmFtZSwgbGVuLCBkZSkpCi0JcmV0dXJuIDA7CisJaWYgKCFkZV9zdGlsbF92YWxpZChuYW1lLCBsZW4sIGRlKSkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoaW5vZGUpIHsKLQlpZiAoIWRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy03MDQyOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKLQlyZXR1cm4gKGRlLT5kZV9vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8pID8gMSA6IDA7Ci0gICAgfQorCWlmIChpbm9kZSkgeworCQlpZiAoIWRlX3Zpc2libGUoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCQkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCQkgICAgICAgInZzLTcwNDI6IGVudHJ5X3BvaW50c190b19vYmplY3Q6IGVudHJ5IG11c3QgYmUgdmlzaWJsZSIpOworCQlyZXR1cm4gKGRlLT5kZV9vYmplY3RpZCA9PSBpbm9kZS0+aV9pbm8pID8gMSA6IDA7CisJfQogCi0gICAgLyogdGhpcyBtdXN0IGJlIGFkZGVkIGhpZGRlbiBlbnRyeSAqLwotICAgIGlmIChkZV92aXNpYmxlIChkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkpCi0JcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy03MDQzOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKKwkvKiB0aGlzIG11c3QgYmUgYWRkZWQgaGlkZGVuIGVudHJ5ICovCisJaWYgKGRlX3Zpc2libGUoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJICAgICAgICJ2cy03MDQzOiBlbnRyeV9wb2ludHNfdG9fb2JqZWN0OiBlbnRyeSBtdXN0IGJlIHZpc2libGUiKTsKIAotICAgIHJldHVybiAxOworCXJldHVybiAxOwogfQogCi0KIC8qIHNldHMga2V5IG9mIG9iamVjdGlkIHRoZSBlbnRyeSBoYXMgdG8gcG9pbnQgdG8gKi8KLXN0YXRpYyB2b2lkIHNldF9pbm9faW5fZGlyX2VudHJ5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzZXRfaW5vX2luX2Rpcl9lbnRyeShzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSwKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIC8qIEpETSBUaGVzZSBvcGVyYXRpb25zIGFyZSBlbmRpYW4gc2FmZSAtIGJvdGggYXJlIGxlICovCi0gICAgZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfZGlyX2lkID0ga2V5LT5rX2Rpcl9pZDsKLSAgICBkZS0+ZGVfZGVoW2RlLT5kZV9lbnRyeV9udW1dLmRlaF9vYmplY3RpZCA9IGtleS0+a19vYmplY3RpZDsKKwkvKiBKRE0gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZW5kaWFuIHNhZmUgLSBib3RoIGFyZSBsZSAqLworCWRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0uZGVoX2Rpcl9pZCA9IGtleS0+a19kaXJfaWQ7CisJZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfb2JqZWN0aWQgPSBrZXktPmtfb2JqZWN0aWQ7CiB9CiAKLQogLyogCiAgKiBwcm9jZXNzLCB0aGF0IGlzIGdvaW5nIHRvIGNhbGwgZml4X25vZGVzL2RvX2JhbGFuY2UgbXVzdCBob2xkIG9ubHkKICAqIG9uZSBwYXRoLiBJZiBpdCBob2xkcyAyIG9yIG1vcmUsIGl0IGNhbiBnZXQgaW50byBlbmRsZXNzIHdhaXRpbmcgaW4KICAqIGdldF9lbXB0eV9ub2RlcyBvciBpdHMgY2xvbmVzIAogICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKLQkJCSAgICBzdHJ1Y3QgaW5vZGUgKiBuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQorc3RhdGljIGludCByZWlzZXJmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkJICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewotICAgIGludCByZXR2YWw7Ci0gICAgSU5JVElBTElaRV9QQVRIIChvbGRfZW50cnlfcGF0aCk7Ci0gICAgSU5JVElBTElaRV9QQVRIIChuZXdfZW50cnlfcGF0aCk7Ci0gICAgSU5JVElBTElaRV9QQVRIIChkb3RfZG90X2VudHJ5X3BhdGgpOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWggOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgb2xkX2RlLCBuZXdfZGUsIGRvdF9kb3RfZGU7Ci0gICAgc3RydWN0IGlub2RlICogb2xkX2lub2RlLCAqIG5ld19kZW50cnlfaW5vZGU7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IGpiZWdpbl9jb3VudCA7IAotICAgIHVtb2RlX3Qgb2xkX2lub2RlX21vZGU7Ci0gICAgdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7Ci0gICAgc3RydWN0IHRpbWVzcGVjIGN0aW1lOworCWludCByZXR2YWw7CisJSU5JVElBTElaRV9QQVRIKG9sZF9lbnRyeV9wYXRoKTsKKwlJTklUSUFMSVpFX1BBVEgobmV3X2VudHJ5X3BhdGgpOworCUlOSVRJQUxJWkVfUEFUSChkb3RfZG90X2VudHJ5X3BhdGgpOworCXN0cnVjdCBpdGVtX2hlYWQgbmV3X2VudHJ5X2loLCBvbGRfZW50cnlfaWgsIGRvdF9kb3RfaWg7CisJc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBvbGRfZGUsIG5ld19kZSwgZG90X2RvdF9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgKm5ld19kZW50cnlfaW5vZGU7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgamJlZ2luX2NvdW50OworCXVtb2RlX3Qgb2xkX2lub2RlX21vZGU7CisJdW5zaWduZWQgbG9uZyBzYXZlbGluayA9IDE7CisJc3RydWN0IHRpbWVzcGVjIGN0aW1lOwogCi0gICAgLyogdGhyZWUgYmFsYW5jaW5nczogKDEpIG9sZCBuYW1lIHJlbW92YWwsICgyKSBuZXcgbmFtZSBpbnNlcnRpb24KLSAgICAgICBhbmQgKDMpIG1heWJlICJzYXZlIiBsaW5rIGluc2VydGlvbgotICAgICAgIHN0YXQgZGF0YSB1cGRhdGVzOiAoMSkgb2xkIGRpcmVjdG9yeSwKLSAgICAgICAoMikgbmV3IGRpcmVjdG9yeSBhbmQgKDMpIG1heWJlIG9sZCBvYmplY3Qgc3RhdCBkYXRhICh3aGVuIGl0IGlzCi0gICAgICAgZGlyZWN0b3J5KSBhbmQgKDQpIG1heWJlIHN0YXQgZGF0YSBvZiBvYmplY3QgdG8gd2hpY2ggbmV3IGVudHJ5Ci0gICAgICAgcG9pbnRlZCBpbml0aWFsbHkgYW5kICg1KSBtYXliZSBibG9jayBjb250YWluaW5nICIuLiIgb2YKLSAgICAgICByZW5hbWVkIGRpcmVjdG9yeQotICAgICAgIHF1b3RhIHVwZGF0ZXM6IHR3byBwYXJlbnQgZGlyZWN0b3JpZXMgKi8KLSAgICBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyA1ICsgNCAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUzsKKwkvKiB0aHJlZSBiYWxhbmNpbmdzOiAoMSkgb2xkIG5hbWUgcmVtb3ZhbCwgKDIpIG5ldyBuYW1lIGluc2VydGlvbgorCSAgIGFuZCAoMykgbWF5YmUgInNhdmUiIGxpbmsgaW5zZXJ0aW9uCisJICAgc3RhdCBkYXRhIHVwZGF0ZXM6ICgxKSBvbGQgZGlyZWN0b3J5LAorCSAgICgyKSBuZXcgZGlyZWN0b3J5IGFuZCAoMykgbWF5YmUgb2xkIG9iamVjdCBzdGF0IGRhdGEgKHdoZW4gaXQgaXMKKwkgICBkaXJlY3RvcnkpIGFuZCAoNCkgbWF5YmUgc3RhdCBkYXRhIG9mIG9iamVjdCB0byB3aGljaCBuZXcgZW50cnkKKwkgICBwb2ludGVkIGluaXRpYWxseSBhbmQgKDUpIG1heWJlIGJsb2NrIGNvbnRhaW5pbmcgIi4uIiBvZgorCSAgIHJlbmFtZWQgZGlyZWN0b3J5CisJICAgcXVvdGEgdXBkYXRlczogdHdvIHBhcmVudCBkaXJlY3RvcmllcyAqLworCWpiZWdpbl9jb3VudCA9CisJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDUgKworCSAgICA0ICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKG9sZF9kaXItPmlfc2IpOwogCi0gICAgb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBuZXdfZGVudHJ5X2lub2RlID0gbmV3X2RlbnRyeS0+ZF9pbm9kZTsKKwlvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCW5ld19kZW50cnlfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOwogCi0gICAgLy8gbWFrZSBzdXJlLCB0aGF0IG9sZG5hbWUgc3RpbGwgZXhpc3RzIGFuZCBwb2ludHMgdG8gYW4gb2JqZWN0IHdlCi0gICAgLy8gYXJlIGdvaW5nIHRvIHJlbmFtZQotICAgIG9sZF9kZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2sob2xkX2Rpci0+aV9zYik7Ci0gICAgcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAob2xkX2Rpciwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5sZW4sCi0JCQkJICAmb2xkX2VudHJ5X3BhdGgsICZvbGRfZGUpOwotICAgIHBhdGhyZWxzZSAoJm9sZF9lbnRyeV9wYXRoKTsKLSAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCXJldHVybiAtRUlPOwotICAgIH0KLQotICAgIGlmIChyZXR2YWwgIT0gTkFNRV9GT1VORCB8fCBvbGRfZGUuZGVfb2JqZWN0aWQgIT0gb2xkX2lub2RlLT5pX2lubykgewotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKLQlyZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBvbGRfaW5vZGVfbW9kZSA9IG9sZF9pbm9kZS0+aV9tb2RlOwotICAgIGlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgewotCS8vIG1ha2Ugc3VyZSwgdGhhdCBkaXJlY3RvcnkgYmVpbmcgcmVuYW1lZCBoYXMgY29ycmVjdCAiLi4iIAotCS8vIGFuZCB0aGF0IGl0cyBuZXcgcGFyZW50IGRpcmVjdG9yeSBoYXMgbm90IHRvbyBtYW55IGxpbmtzCi0JLy8gYWxyZWFkeQotCi0JaWYgKG5ld19kZW50cnlfaW5vZGUpIHsKLQkgICAgaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIobmV3X2RlbnRyeV9pbm9kZSkpIHsKLQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCQlyZXR1cm4gLUVOT1RFTVBUWTsKLQkgICAgfQotCX0KLQkKLQkvKiBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkLCAKLQkqKiBzbyBmaW5kICIuLiIgZW50cnkgCi0JKi8KLQlkb3RfZG90X2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0JcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAob2xkX2lub2RlLCAiLi4iLCAyLCAmZG90X2RvdF9lbnRyeV9wYXRoLCAmZG90X2RvdF9kZSk7Ci0JcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKLQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOwotCSAgICByZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBpbm9kZSBudW1iZXIgb2YgLi4gbXVzdCBlcXVhbCBvbGRfZGlyLT5pX2lubyAqLwotCWlmIChkb3RfZG90X2RlLmRlX29iamVjdGlkICE9IG9sZF9kaXItPmlfaW5vKSB7Ci0JICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKLQkgICAgcmV0dXJuIC1FSU87Ci0JfQotICAgIH0KLQotICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICBpZiAocmV0dmFsKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAob2xkX2Rpci0+aV9zYik7Ci0gICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gICAgLyogYWRkIG5ldyBlbnRyeSAob3IgZmluZCB0aGUgZXhpc3Rpbmcgb25lKSAqLwotICAgIHJldHZhbCA9IHJlaXNlcmZzX2FkZF9lbnRyeSAoJnRoLCBuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgCi0JCQkJIG9sZF9pbm9kZSwgMCk7Ci0gICAgaWYgKHJldHZhbCA9PSAtRUVYSVNUKSB7Ci0JaWYgKCFuZXdfZGVudHJ5X2lub2RlKSB7Ci0JICAgIHJlaXNlcmZzX3BhbmljIChvbGRfZGlyLT5pX3NiLAotCQkJICAgICJ2cy03MDUwOiBuZXcgZW50cnkgaXMgZm91bmQsIG5ldyBpbm9kZSA9PSAwXG4iKTsKLQl9Ci0gICAgfSBlbHNlIGlmIChyZXR2YWwpIHsKLQlpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKLSAgICB9Ci0KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2RpcikgOwotICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGlyKSA7Ci0KLSAgICAvKiB0aGlzIG1ha2VzIGl0IHNvIGFuIGZzeW5jIG9uIGFuIG9wZW4gZmQgZm9yIHRoZSBvbGQgbmFtZSB3aWxsCi0gICAgKiogY29tbWl0IHRoZSByZW5hbWUgb3BlcmF0aW9uCi0gICAgKi8KLSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2lub2RlKSA7Ci0KLSAgICBpZiAobmV3X2RlbnRyeV9pbm9kZSkgCi0JcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kZW50cnlfaW5vZGUpIDsKLQotICAgIHdoaWxlICgxKSB7Ci0JLy8gbG9vayBmb3Igb2xkIG5hbWUgdXNpbmcgY29ycmVzcG9uZGluZyBlbnRyeSBrZXkgKGZvdW5kIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkpCi0JaWYgKChyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChuZXdfZGlyLT5pX3NiLCAmb2xkX2RlLmRlX2VudHJ5X2tleSwKLQkJCQkJICAgJm9sZF9lbnRyeV9wYXRoLCAmb2xkX2RlKSkgIT0gTkFNRV9GT1VORCkgewotCSAgICBwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKLQkgICAgam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JICAgIHJldHVybiAtRUlPOwotCX0KLQotCWNvcHlfaXRlbV9oZWFkKCZvbGRfZW50cnlfaWgsIGdldF9paCgmb2xkX2VudHJ5X3BhdGgpKSA7Ci0KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoLCAxKSA7Ci0KLQkvLyBsb29rIGZvciBuZXcgbmFtZSBieSByZWlzZXJmc19maW5kX2VudHJ5Ci0JbmV3X2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7Ci0JcmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAobmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5sZW4sIAotCQkJCSAgICAgICZuZXdfZW50cnlfcGF0aCwgJm5ld19kZSk7Ci0JLy8gcmVpc2VyZnNfYWRkX2VudHJ5IHNob3VsZCBub3QgcmV0dXJuIElPX0VSUk9SLCBiZWNhdXNlIGl0IGlzIGNhbGxlZCB3aXRoIGVzc2VudGlhbGx5IHNhbWUgcGFyYW1ldGVycyBmcm9tCi0gICAgICAgIC8vIHJlaXNlcmZzX2FkZF9lbnRyeSBhYm92ZSwgYW5kIHdlJ2xsIGNhdGNoIGFueSBpL28gZXJyb3JzIGJlZm9yZSB3ZSBnZXQgaGVyZS4KLQlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkRfSU5WSVNJQkxFICYmIHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7Ci0JICAgIHBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOwotCSAgICBwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKLQkgICAgam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOwotCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0JICAgIHJldHVybiAtRUlPOwotCX0KLQotCWNvcHlfaXRlbV9oZWFkKCZuZXdfZW50cnlfaWgsIGdldF9paCgmbmV3X2VudHJ5X3BhdGgpKSA7Ci0KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoLCAxKSA7Ci0KLQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKLQkgICAgaWYgKChyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChuZXdfZGlyLT5pX3NiLCAmZG90X2RvdF9kZS5kZV9lbnRyeV9rZXksCi0JCQkJCSAgICAgICAmZG90X2RvdF9lbnRyeV9wYXRoLCAmZG90X2RvdF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKLQkJcGF0aHJlbHNlKCZkb3RfZG90X2VudHJ5X3BhdGgpOwotCQlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKLQkJcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7Ci0JCWpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkvLyBtYWtlIHN1cmUsIHRoYXQgb2xkbmFtZSBzdGlsbCBleGlzdHMgYW5kIHBvaW50cyB0byBhbiBvYmplY3Qgd2UKKwkvLyBhcmUgZ29pbmcgdG8gcmVuYW1lCisJb2xkX2RlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19maW5kX2VudHJ5KG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCW9sZF9kZW50cnktPmRfbmFtZS5sZW4sICZvbGRfZW50cnlfcGF0aCwKKwkJCQkmb2xkX2RlKTsKKwlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CiAJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKIAkJcmV0dXJuIC1FSU87Ci0JICAgIH0KLQkgICAgY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSkgOwotCSAgICAvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KLQkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgsIDEpIDsKIAl9Ci0JCQkJLyogd2Ugc2hvdWxkIGNoZWNrIHNlYWxzIGhlcmUsIG5vdCBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0dWZmLCB5ZXM/IFRoZW4sIGhhdmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZCBldmVyeXRoaW5nIGludG8gUkFNIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBsb2NrIHRoZSBidWZmZXJzLCB5ZXM/ICAtSGFucyAqLwotCQkJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCi0JCQkJKiogdGhhbiBvbmUgcGF0aCBhdCBvbmNlLiAgVGhlIHNlYWxzIHdvdWxkIAotCQkJCSoqIGhhdmUgdG8gYmUgd3JpdHRlbiB0byBkZWFsIHdpdGggbXVsdGktcGF0aCAKLQkJCQkqKiBpc3N1ZXMgLWNocmlzCi0JCQkJKi8KLQkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55Ci0JKiogb2YgdGhlIGFib3ZlIGNoZWNrcyBjb3VsZCBoYXZlIHNjaGVkdWxlZC4gIFdlIGhhdmUgdG8gYmUKLQkqKiBzdXJlIG91ciBpdGVtcyBoYXZlbid0IGJlZW4gc2hpZnRlZCBieSBhbm90aGVyIHByb2Nlc3MuCi0JKi8KLQlpZiAoaXRlbV9tb3ZlZCgmbmV3X2VudHJ5X2loLCAmbmV3X2VudHJ5X3BhdGgpIHx8Ci0JICAgICFlbnRyeV9wb2ludHNfdG9fb2JqZWN0KG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKLQkgICAgaXRlbV9tb3ZlZCgmb2xkX2VudHJ5X2loLCAmb2xkX2VudHJ5X3BhdGgpIHx8IAotCSAgICAhZW50cnlfcG9pbnRzX3RvX29iamVjdCAob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCQkgICAgICZvbGRfZGUsIG9sZF9pbm9kZSkpIHsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoKTsKLQkgICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKLQkgICAgY29udGludWU7CisKKwlpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQgfHwgb2xkX2RlLmRlX29iamVjdGlkICE9IG9sZF9pbm9kZS0+aV9pbm8pIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CisKKwlvbGRfaW5vZGVfbW9kZSA9IG9sZF9pbm9kZS0+aV9tb2RlOwogCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgewotCSAgICBpZiAoIGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8Ci0JCSFlbnRyeV9wb2ludHNfdG9fb2JqZWN0ICggIi4uIiwgMiwgJmRvdF9kb3RfZGUsIG9sZF9kaXIpICkgewotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBvbGRfZGUuZGVfYmgpOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBuZXdfZGUuZGVfYmgpOwotCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKLQkJY29udGludWU7Ci0JICAgIH0KKwkJLy8gbWFrZSBzdXJlLCB0aGF0IGRpcmVjdG9yeSBiZWluZyByZW5hbWVkIGhhcyBjb3JyZWN0ICIuLiIgCisJCS8vIGFuZCB0aGF0IGl0cyBuZXcgcGFyZW50IGRpcmVjdG9yeSBoYXMgbm90IHRvbyBtYW55IGxpbmtzCisJCS8vIGFscmVhZHkKKworCQlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCQkJaWYgKCFyZWlzZXJmc19lbXB0eV9kaXIobmV3X2RlbnRyeV9pbm9kZSkpIHsKKwkJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJCQl9CisJCX0KKworCQkvKiBkaXJlY3RvcnkgaXMgcmVuYW1lZCwgaXRzIHBhcmVudCBkaXJlY3Rvcnkgd2lsbCBiZSBjaGFuZ2VkLCAKKwkJICoqIHNvIGZpbmQgIi4uIiBlbnRyeSAKKwkJICovCisJCWRvdF9kb3RfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX2ZpbmRfZW50cnkob2xkX2lub2RlLCAiLi4iLCAyLCAmZG90X2RvdF9lbnRyeV9wYXRoLAorCQkJCQkmZG90X2RvdF9kZSk7CisJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIGlub2RlIG51bWJlciBvZiAuLiBtdXN0IGVxdWFsIG9sZF9kaXItPmlfaW5vICovCisJCWlmIChkb3RfZG90X2RlLmRlX29iamVjdGlkICE9IG9sZF9kaXItPmlfaW5vKSB7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQogCX0KIAotCVJGQUxTRSggU19JU0RJUihvbGRfaW5vZGVfbW9kZSkgJiYgCi0JCSAhYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQoZG90X2RvdF9kZS5kZV9iaCksICIiICk7Ci0KLQlicmVhazsKLSAgICB9Ci0KLSAgICAvKiBvaywgYWxsIHRoZSBjaGFuZ2VzIGNhbiBiZSBkb25lIGluIG9uZSBmZWxsIHN3b29wIHdoZW4gd2UKLSAgICAgICBoYXZlIGNsYWltZWQgYWxsIHRoZSBidWZmZXJzIG5lZWRlZC4qLwotICAgIAotICAgIG1hcmtfZGVfdmlzaWJsZSAobmV3X2RlLmRlX2RlaCArIG5ld19kZS5kZV9lbnRyeV9udW0pOwotICAgIHNldF9pbm9faW5fZGlyX2VudHJ5ICgmbmV3X2RlLCBJTk9ERV9QS0VZIChvbGRfaW5vZGUpKTsKLSAgICBqb3VybmFsX21hcmtfZGlydHkgKCZ0aCwgb2xkX2Rpci0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKLQotICAgIG1hcmtfZGVfaGlkZGVuIChvbGRfZGUuZGVfZGVoICsgb2xkX2RlLmRlX2VudHJ5X251bSk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG9sZF9kaXItPmlfc2IsIG9sZF9kZS5kZV9iaCk7Ci0gICAgY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgIG9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gY3RpbWU7Ci0gICAgbmV3X2Rpci0+aV9jdGltZSA9IG5ld19kaXItPmlfbXRpbWUgPSBjdGltZTsKLSAgICAvKiB0aGFua3MgdG8gQWxleCBBZHJpYWFuc2UgPGFsZXhfYUBjYWx0ZWNoLmVkdT4gZm9yIHBhdGNoIHdoaWNoIGFkZHMgY3RpbWUgdXBkYXRlIG9mCi0gICAgICAgcmVuYW1lZCBvYmplY3QgKi8KLSAgICBvbGRfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKLQotICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7Ci0JLy8gYWRqdXN0IGxpbmsgbnVtYmVyIG9mIHRoZSB2aWN0aW0KLQlpZiAoU19JU0RJUihuZXdfZGVudHJ5X2lub2RlLT5pX21vZGUpKSB7Ci0JICAgIG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmsgID0gMDsKLQl9IGVsc2UgewotCSAgICBuZXdfZGVudHJ5X2lub2RlLT5pX25saW5rLS07CisJcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCXJldHVybiByZXR2YWw7CiAJfQotCW5ld19kZW50cnlfaW5vZGUtPmlfY3RpbWUgPSBjdGltZTsKLQlzYXZlbGluayA9IG5ld19kZW50cnlfaW5vZGUtPmlfbmxpbms7Ci0gICAgfQogCi0gICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKSB7Ci0JLy8gYWRqdXN0ICIuLiIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgCi0Jc2V0X2lub19pbl9kaXJfZW50cnkgKCZkb3RfZG90X2RlLCBJTk9ERV9QS0VZIChuZXdfZGlyKSk7Ci0Jam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG5ld19kaXItPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgpOwotCQotICAgICAgICBpZiAoIW5ld19kZW50cnlfaW5vZGUpCi0JICAgIC8qIHRoZXJlIChpbiBuZXdfZGlyKSB3YXMgbm8gZGlyZWN0b3J5LCBzbyBpdCBnb3QgbmV3IGxpbmsKLQkgICAgICAgKCIuLiIgIG9mIHJlbmFtZWQgZGlyZWN0b3J5KSAqLwotCSAgICBJTkNfRElSX0lOT0RFX05MSU5LKG5ld19kaXIpOwotCQkKLQkvKiBvbGQgZGlyZWN0b3J5IGxvc3Qgb25lIGxpbmsgLSAiLi4gIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAqLwotCURFQ19ESVJfSU5PREVfTkxJTksob2xkX2Rpcik7Ci0gICAgfQorCS8qIGFkZCBuZXcgZW50cnkgKG9yIGZpbmQgdGhlIGV4aXN0aW5nIG9uZSkgKi8KKwlyZXR2YWwgPQorCSAgICByZWlzZXJmc19hZGRfZW50cnkoJnRoLCBuZXdfZGlyLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuLCBvbGRfaW5vZGUsIDApOworCWlmIChyZXR2YWwgPT0gLUVFWElTVCkgeworCQlpZiAoIW5ld19kZW50cnlfaW5vZGUpIHsKKwkJCXJlaXNlcmZzX3BhbmljKG9sZF9kaXItPmlfc2IsCisJCQkJICAgICAgICJ2cy03MDUwOiBuZXcgZW50cnkgaXMgZm91bmQsIG5ldyBpbm9kZSA9PSAwXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAocmV0dmFsKSB7CisJCWludCBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkJcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKKwl9CiAKLSAgICAvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKLSAgICBwYXRocmVsc2UgKCZuZXdfZW50cnlfcGF0aCk7Ci0gICAgcGF0aHJlbHNlICgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwlyZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24ob2xkX2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG5ld19kaXIpOwogCi0gICAgLy8gRklYTUU6IHRoaXMgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSdzIHJldHVybiB2YWx1ZSBtYXkgc2NyZXcgdXAKLSAgICAvLyBhbnlib2R5LCBidXQgaXQgd2lsbCBwYW5pYyBpZiB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlCi0gICAgLy8gZW50cnkuIFRoaXMgbmVlZHMgb25lIG1vcmUgY2xlYW4gdXAKLSAgICBpZiAocmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoJnRoLCAmb2xkX2VudHJ5X3BhdGgsICYob2xkX2RlLmRlX2VudHJ5X2tleSksIG9sZF9kaXIsIE5VTEwsIDApIDwgMCkKLQlyZWlzZXJmc193YXJuaW5nIChvbGRfZGlyLT5pX3NiLCAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCS8qIHRoaXMgbWFrZXMgaXQgc28gYW4gZnN5bmMgb24gYW4gb3BlbiBmZCBmb3IgdGhlIG9sZCBuYW1lIHdpbGwKKwkgKiogY29tbWl0IHRoZSByZW5hbWUgb3BlcmF0aW9uCisJICovCisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG9sZF9pbm9kZSk7CiAKLSAgICBvbGRfZGlyLT5pX3NpemUgLT0gREVIX1NJWkUgKyBvbGRfZGUuZGVfZW50cnlsZW47CisJaWYgKG5ld19kZW50cnlfaW5vZGUpCisJCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGVudHJ5X2lub2RlKTsKIAotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBvbGRfZGlyKTsKLSAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgbmV3X2Rpcik7Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG9sZF9pbm9kZSk7CisJd2hpbGUgKDEpIHsKKwkJLy8gbG9vayBmb3Igb2xkIG5hbWUgdXNpbmcgY29ycmVzcG9uZGluZyBlbnRyeSBrZXkgKGZvdW5kIGJ5IHJlaXNlcmZzX2ZpbmRfZW50cnkpCisJCWlmICgocmV0dmFsID0KKwkJICAgICBzZWFyY2hfYnlfZW50cnlfa2V5KG5ld19kaXItPmlfc2IsICZvbGRfZGUuZGVfZW50cnlfa2V5LAorCQkJCQkgJm9sZF9lbnRyeV9wYXRoLAorCQkJCQkgJm9sZF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmb2xkX2VudHJ5X3BhdGgpOworCQkJam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAotICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7Ci0JaWYgKHNhdmVsaW5rID09IDApCi0JICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7Ci0JcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG5ld19kZW50cnlfaW5vZGUpOwotICAgIH0KKwkJY29weV9pdGVtX2hlYWQoJm9sZF9lbnRyeV9paCwgZ2V0X2loKCZvbGRfZW50cnlfcGF0aCkpOwogCi0gICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7Ci0gICAgcmV0dXJuIHJldHZhbDsKKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIG9sZF9kZS5kZV9iaCwgMSk7CisKKwkJLy8gbG9vayBmb3IgbmV3IG5hbWUgYnkgcmVpc2VyZnNfZmluZF9lbnRyeQorCQluZXdfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKwkJcmV0dmFsID0KKwkJICAgIHJlaXNlcmZzX2ZpbmRfZW50cnkobmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCW5ld19kZW50cnktPmRfbmFtZS5sZW4sICZuZXdfZW50cnlfcGF0aCwKKwkJCQkJJm5ld19kZSk7CisJCS8vIHJlaXNlcmZzX2FkZF9lbnRyeSBzaG91bGQgbm90IHJldHVybiBJT19FUlJPUiwgYmVjYXVzZSBpdCBpcyBjYWxsZWQgd2l0aCBlc3NlbnRpYWxseSBzYW1lIHBhcmFtZXRlcnMgZnJvbQorCQkvLyByZWlzZXJmc19hZGRfZW50cnkgYWJvdmUsIGFuZCB3ZSdsbCBjYXRjaCBhbnkgaS9vIGVycm9ycyBiZWZvcmUgd2UgZ2V0IGhlcmUuCisJCWlmIChyZXR2YWwgIT0gTkFNRV9GT1VORF9JTlZJU0lCTEUgJiYgcmV0dmFsICE9IE5BTUVfRk9VTkQpIHsKKwkJCXBhdGhyZWxzZSgmbmV3X2VudHJ5X3BhdGgpOworCQkJcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7CisJCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCQlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWNvcHlfaXRlbV9oZWFkKCZuZXdfZW50cnlfaWgsIGdldF9paCgmbmV3X2VudHJ5X3BhdGgpKTsKKworCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoLCAxKTsKKworCQlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlmICgocmV0dmFsID0KKwkJCSAgICAgc2VhcmNoX2J5X2VudHJ5X2tleShuZXdfZGlyLT5pX3NiLAorCQkJCQkJICZkb3RfZG90X2RlLmRlX2VudHJ5X2tleSwKKwkJCQkJCSAmZG90X2RvdF9lbnRyeV9wYXRoLAorCQkJCQkJICZkb3RfZG90X2RlKSkgIT0gTkFNRV9GT1VORCkgeworCQkJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJCQlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwkJCQlwYXRocmVsc2UoJm9sZF9lbnRyeV9wYXRoKTsKKwkJCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsCisJCQkJICAgICAgIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSk7CisJCQkvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJICAgICBkb3RfZG90X2RlLmRlX2JoLCAxKTsKKwkJfQorCQkvKiB3ZSBzaG91bGQgY2hlY2sgc2VhbHMgaGVyZSwgbm90IGRvCisJCSAgIHRoaXMgc3R1ZmYsIHllcz8gVGhlbiwgaGF2aW5nCisJCSAgIGdhdGhlcmVkIGV2ZXJ5dGhpbmcgaW50byBSQU0gd2UKKwkJICAgc2hvdWxkIGxvY2sgdGhlIGJ1ZmZlcnMsIHllcz8gIC1IYW5zICovCisJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCisJCSAqKiB0aGFuIG9uZSBwYXRoIGF0IG9uY2UuICBUaGUgc2VhbHMgd291bGQgCisJCSAqKiBoYXZlIHRvIGJlIHdyaXR0ZW4gdG8gZGVhbCB3aXRoIG11bHRpLXBhdGggCisJCSAqKiBpc3N1ZXMgLWNocmlzCisJCSAqLworCQkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55CisJCSAqKiBvZiB0aGUgYWJvdmUgY2hlY2tzIGNvdWxkIGhhdmUgc2NoZWR1bGVkLiAgV2UgaGF2ZSB0byBiZQorCQkgKiogc3VyZSBvdXIgaXRlbXMgaGF2ZW4ndCBiZWVuIHNoaWZ0ZWQgYnkgYW5vdGhlciBwcm9jZXNzLgorCQkgKi8KKwkJaWYgKGl0ZW1fbW92ZWQoJm5ld19lbnRyeV9paCwgJm5ld19lbnRyeV9wYXRoKSB8fAorCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QobmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKKwkJICAgIGl0ZW1fbW92ZWQoJm9sZF9lbnRyeV9paCwgJm9sZF9lbnRyeV9wYXRoKSB8fAorCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3Qob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCSAgICBvbGRfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCQkgICAgJm9sZF9kZSwgb2xkX2lub2RlKSkgeworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJCSBuZXdfZGUuZGVfYmgpOworCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT5pX3NiLAorCQkJCQkJCSBvbGRfZGUuZGVfYmgpOworCQkJaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQorCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKG9sZF9pbm9kZS0+CisJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkgZG90X2RvdF9kZS4KKwkJCQkJCQkJIGRlX2JoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgeworCQkJaWYgKGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8CisJCQkgICAgIWVudHJ5X3BvaW50c190b19vYmplY3QoIi4uIiwgMiwgJmRvdF9kb3RfZGUsCisJCQkJCQkgICAgb2xkX2RpcikpIHsKKwkJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihvbGRfaW5vZGUtPgorCQkJCQkJCQkgaV9zYiwKKwkJCQkJCQkJIG9sZF9kZS5kZV9iaCk7CisJCQkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIob2xkX2lub2RlLT4KKwkJCQkJCQkJIGlfc2IsCisJCQkJCQkJCSBuZXdfZGUuZGVfYmgpOworCQkJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKG9sZF9pbm9kZS0+CisJCQkJCQkJCSBpX3NiLAorCQkJCQkJCQkgZG90X2RvdF9kZS4KKwkJCQkJCQkJIGRlX2JoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCVJGQUxTRShTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSAmJgorCQkgICAgICAgIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGRvdF9kb3RfZGUuZGVfYmgpLCAiIik7CisKKwkJYnJlYWs7CisJfQorCisJLyogb2ssIGFsbCB0aGUgY2hhbmdlcyBjYW4gYmUgZG9uZSBpbiBvbmUgZmVsbCBzd29vcCB3aGVuIHdlCisJICAgaGF2ZSBjbGFpbWVkIGFsbCB0aGUgYnVmZmVycyBuZWVkZWQuICovCisKKwltYXJrX2RlX3Zpc2libGUobmV3X2RlLmRlX2RlaCArIG5ld19kZS5kZV9lbnRyeV9udW0pOworCXNldF9pbm9faW5fZGlyX2VudHJ5KCZuZXdfZGUsIElOT0RFX1BLRVkob2xkX2lub2RlKSk7CisJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgb2xkX2Rpci0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKKworCW1hcmtfZGVfaGlkZGVuKG9sZF9kZS5kZV9kZWggKyBvbGRfZGUuZGVfZW50cnlfbnVtKTsKKwlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBvbGRfZGlyLT5pX3NiLCBvbGRfZGUuZGVfYmgpOworCWN0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IGN0aW1lOworCW5ld19kaXItPmlfY3RpbWUgPSBuZXdfZGlyLT5pX210aW1lID0gY3RpbWU7CisJLyogdGhhbmtzIHRvIEFsZXggQWRyaWFhbnNlIDxhbGV4X2FAY2FsdGVjaC5lZHU+IGZvciBwYXRjaCB3aGljaCBhZGRzIGN0aW1lIHVwZGF0ZSBvZgorCSAgIHJlbmFtZWQgb2JqZWN0ICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisKKwlpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCQkvLyBhZGp1c3QgbGluayBudW1iZXIgb2YgdGhlIHZpY3RpbQorCQlpZiAoU19JU0RJUihuZXdfZGVudHJ5X2lub2RlLT5pX21vZGUpKSB7CisJCQluZXdfZGVudHJ5X2lub2RlLT5pX25saW5rID0gMDsKKwkJfSBlbHNlIHsKKwkJCW5ld19kZW50cnlfaW5vZGUtPmlfbmxpbmstLTsKKwkJfQorCQluZXdfZGVudHJ5X2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisJCXNhdmVsaW5rID0gbmV3X2RlbnRyeV9pbm9kZS0+aV9ubGluazsKKwl9CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGVfbW9kZSkpIHsKKwkJLy8gYWRqdXN0ICIuLiIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgCisJCXNldF9pbm9faW5fZGlyX2VudHJ5KCZkb3RfZG90X2RlLCBJTk9ERV9QS0VZKG5ld19kaXIpKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgbmV3X2Rpci0+aV9zYiwgZG90X2RvdF9kZS5kZV9iaCk7CisKKwkJaWYgKCFuZXdfZGVudHJ5X2lub2RlKQorCQkJLyogdGhlcmUgKGluIG5ld19kaXIpIHdhcyBubyBkaXJlY3RvcnksIHNvIGl0IGdvdCBuZXcgbGluaworCQkJICAgKCIuLiIgIG9mIHJlbmFtZWQgZGlyZWN0b3J5KSAqLworCQkJSU5DX0RJUl9JTk9ERV9OTElOSyhuZXdfZGlyKTsKKworCQkvKiBvbGQgZGlyZWN0b3J5IGxvc3Qgb25lIGxpbmsgLSAiLi4gIiBvZiByZW5hbWVkIGRpcmVjdG9yeSAqLworCQlERUNfRElSX0lOT0RFX05MSU5LKG9sZF9kaXIpOworCX0KKwkvLyBsb29rcyBsaWtlIGluIDIuMy45OXByZTMgYnJlbHNlIGlzIGF0b21pYy4gc28gd2UgY2FuIHVzZSBwYXRocmVsc2UKKwlwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwlwYXRocmVsc2UoJmRvdF9kb3RfZW50cnlfcGF0aCk7CisKKwkvLyBGSVhNRTogdGhpcyByZWlzZXJmc19jdXRfZnJvbV9pdGVtJ3MgcmV0dXJuIHZhbHVlIG1heSBzY3JldyB1cAorCS8vIGFueWJvZHksIGJ1dCBpdCB3aWxsIHBhbmljIGlmIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCB0aGUKKwkvLyBlbnRyeS4gVGhpcyBuZWVkcyBvbmUgbW9yZSBjbGVhbiB1cAorCWlmIChyZWlzZXJmc19jdXRfZnJvbV9pdGVtCisJICAgICgmdGgsICZvbGRfZW50cnlfcGF0aCwgJihvbGRfZGUuZGVfZW50cnlfa2V5KSwgb2xkX2RpciwgTlVMTCwKKwkgICAgIDApIDwgMCkKKwkJcmVpc2VyZnNfd2FybmluZyhvbGRfZGlyLT5pX3NiLAorCQkJCSAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCisJb2xkX2Rpci0+aV9zaXplIC09IERFSF9TSVpFICsgb2xkX2RlLmRlX2VudHJ5bGVuOworCisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgb2xkX2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgbmV3X2Rpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgb2xkX2lub2RlKTsKKworCWlmIChuZXdfZGVudHJ5X2lub2RlKSB7CisJCWlmIChzYXZlbGluayA9PSAwKQorCQkJYWRkX3NhdmVfbGluaygmdGgsIG5ld19kZW50cnlfaW5vZGUsCisJCQkJICAgICAgMCAvKiBub3QgdHJ1bmNhdGUgKi8gKTsKKwkJcmVpc2VyZnNfdXBkYXRlX3NkKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSk7CisJfQorCisJcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBvbGRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgogICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KICAqLwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0gIC8vJnJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zLAkvKiBkZWZhdWx0X2ZpbGVfb3BzICovCi0gICAgLmNyZWF0ZQk9IHJlaXNlcmZzX2NyZWF0ZSwKLSAgICAubG9va3VwCT0gcmVpc2VyZnNfbG9va3VwLAotICAgIC5saW5rCT0gcmVpc2VyZnNfbGluaywKLSAgICAudW5saW5rCT0gcmVpc2VyZnNfdW5saW5rLAotICAgIC5zeW1saW5rCT0gcmVpc2VyZnNfc3ltbGluaywKLSAgICAubWtkaXIJPSByZWlzZXJmc19ta2RpciwKLSAgICAucm1kaXIJPSByZWlzZXJmc19ybWRpciwKLSAgICAubWtub2QJPSByZWlzZXJmc19ta25vZCwKLSAgICAucmVuYW1lCT0gcmVpc2VyZnNfcmVuYW1lLAotICAgIC5zZXRhdHRyICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICA9IHJlaXNlcmZzX3NldHhhdHRyLAotICAgIC5nZXR4YXR0ciAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKwkvLyZyZWlzZXJmc19kaXJfb3BlcmF0aW9ucywgICAvKiBkZWZhdWx0X2ZpbGVfb3BzICovCisJLmNyZWF0ZSA9IHJlaXNlcmZzX2NyZWF0ZSwKKwkubG9va3VwID0gcmVpc2VyZnNfbG9va3VwLAorCS5saW5rID0gcmVpc2VyZnNfbGluaywKKwkudW5saW5rID0gcmVpc2VyZnNfdW5saW5rLAorCS5zeW1saW5rID0gcmVpc2VyZnNfc3ltbGluaywKKwkubWtkaXIgPSByZWlzZXJmc19ta2RpciwKKwkucm1kaXIgPSByZWlzZXJmc19ybWRpciwKKwkubWtub2QgPSByZWlzZXJmc19ta25vZCwKKwkucmVuYW1lID0gcmVpc2VyZnNfcmVuYW1lLAorCS5zZXRhdHRyID0gcmVpc2VyZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIgPSByZWlzZXJmc19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIgPSByZWlzZXJmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gcmVpc2VyZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAorCS5wZXJtaXNzaW9uID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKIH07CiAKIC8qCkBAIC0xNDY0LDI4ICsxNTU0LDI3IEBACiAgKiBzdHVmZiBhZGRlZAogICovCiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7Ci0gICAgLnJlYWRsaW5rICAgICAgID0gZ2VuZXJpY19yZWFkbGluaywKLSAgICAuZm9sbG93X2xpbmsgICAgPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAotICAgIC5wdXRfbGluayAgICAgICA9IHBhZ2VfcHV0X2xpbmssCi0gICAgLnNldGF0dHIgICAgICAgID0gcmVpc2VyZnNfc2V0YXR0ciwKLSAgICAuc2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19zZXR4YXR0ciwKLSAgICAuZ2V0eGF0dHIgICAgICAgPSByZWlzZXJmc19nZXR4YXR0ciwKLSAgICAubGlzdHhhdHRyICAgICAgPSByZWlzZXJmc19saXN0eGF0dHIsCi0gICAgLnJlbW92ZXhhdHRyICAgID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCi0gICAgLnBlcm1pc3Npb24gICAgID0gcmVpc2VyZnNfcGVybWlzc2lvbiwKKwkucmVhZGxpbmsgPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluayA9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rID0gcGFnZV9wdXRfbGluaywKKwkuc2V0YXR0ciA9IHJlaXNlcmZzX3NldGF0dHIsCisJLnNldHhhdHRyID0gcmVpc2VyZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gcmVpc2VyZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKwkucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCiAKIH07CiAKLQogLyoKICAqIHNwZWNpYWwgZmlsZSBvcGVyYXRpb25zLi4ganVzdCB4YXR0ci9hY2wgc3R1ZmYKICAqLwogc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewotICAgIC5zZXRhdHRyICAgICAgICA9IHJlaXNlcmZzX3NldGF0dHIsCi0gICAgLnNldHhhdHRyICAgICAgID0gcmVpc2VyZnNfc2V0eGF0dHIsCi0gICAgLmdldHhhdHRyICAgICAgID0gcmVpc2VyZnNfZ2V0eGF0dHIsCi0gICAgLmxpc3R4YXR0ciAgICAgID0gcmVpc2VyZnNfbGlzdHhhdHRyLAotICAgIC5yZW1vdmV4YXR0ciAgICA9IHJlaXNlcmZzX3JlbW92ZXhhdHRyLAotICAgIC5wZXJtaXNzaW9uICAgICA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCisJLnNldGF0dHIgPSByZWlzZXJmc19zZXRhdHRyLAorCS5zZXR4YXR0ciA9IHJlaXNlcmZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IHJlaXNlcmZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIgPSByZWlzZXJmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gcmVpc2VyZnNfcmVtb3ZleGF0dHIsCisJLnBlcm1pc3Npb24gPSByZWlzZXJmc19wZXJtaXNzaW9uLAogCiB9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYyBiL2ZzL3JlaXNlcmZzL29iamVjdGlkLmMKaW5kZXggYmZlOGUyNS4uZjYyNTkwYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYworKysgYi9mcy9yZWlzZXJmcy9vYmplY3RpZC5jCkBAIC0xNCwyNCArMTQsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoX19sZTMyICopKChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKikocnMpICsgMSkgOlwKIAkJCSAoX19sZTMyICopKChycykgKyAxKSkKIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCiAKLXN0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX19sZTMyICogbWFwKQorc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0aWRfbWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgX19sZTMyICogbWFwKQogewotICAgIGlmIChsZTMyX3RvX2NwdSAobWFwWzBdKSAhPSAxKQotCXJlaXNlcmZzX3BhbmljIChzLCAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKLQkJCSggbG9uZyB1bnNpZ25lZCBpbnQgKSBsZTMyX3RvX2NwdSAobWFwWzBdKSk7CisJaWYgKGxlMzJfdG9fY3B1KG1hcFswXSkgIT0gMSkKKwkJcmVpc2VyZnNfcGFuaWMocywKKwkJCSAgICAgICAidnMtMTUwMTA6IGNoZWNrX29iamVjdGlkX21hcDogbWFwIGNvcnJ1cHRlZDogJWx4IiwKKwkJCSAgICAgICAobG9uZyB1bnNpZ25lZCBpbnQpbGUzMl90b19jcHUobWFwWzBdKSk7CiAKLSAgICAvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKKwkvLyBGSVhNRTogYWRkIHNvbWV0aGluZyBlbHNlIGhlcmUKIH0KIAogI2Vsc2UKLXN0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX19sZTMyICogbWFwKQotezt9CitzdGF0aWMgdm9pZCBjaGVja19vYmplY3RpZF9tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBfX2xlMzIgKiBtYXApCit7OworfQogI2VuZGlmCiAKLQogLyogV2hlbiB3ZSBhbGxvY2F0ZSBvYmplY3RpZHMgd2UgYWxsb2NhdGUgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4KICAgIEVhY2ggc2VxdWVuY2Ugb2Ygb2JqZWN0aWRzIGluIHVzZSAodGhlIG9kZCBzZXF1ZW5jZXMpIGlzIGZvbGxvd2VkCiAgICBieSBhIHNlcXVlbmNlIG9mIG9iamVjdGlkcyBub3QgaW4gdXNlICh0aGUgZXZlbiBzZXF1ZW5jZXMpLiAgV2UKQEAgLTQ2LDE2MSArNDYsMTYyIEBACiAgICBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb25zIG9mIGxheW91dCBjb3VsZCByZXN1bHQgZnJvbSBjb21wbGljYXRpbmcKICAgIG9iamVjdGlkIGFzc2lnbm1lbnQsIGJ1dCB3ZSBoYXZlIGRlZmVycmVkIG1ha2luZyB0aGVtIGZvciBub3cuICovCiAKLQogLyogZ2V0IHVuaXF1ZSBvYmplY3QgaWRlbnRpZmllciAqLwotX191MzIgcmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCitfX3UzMiByZWlzZXJmc19nZXRfdW51c2VkX29iamVjdGlkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAgIF9fbGUzMiAqIG1hcCA9IG9iamVjdGlkX21hcCAocywgcnMpOwotICAgIF9fdTMyIHVudXNlZF9vYmplY3RpZDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlfX2xlMzIgKm1hcCA9IG9iamVjdGlkX21hcChzLCBycyk7CisJX191MzIgdW51c2VkX29iamVjdGlkOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgY2hlY2tfb2JqZWN0aWRfbWFwIChzLCBtYXApOworCWNoZWNrX29iamVjdGlkX21hcChzLCBtYXApOwogCi0gICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLwotICAgIHVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChtYXBbMV0pOwotICAgIGlmICh1bnVzZWRfb2JqZWN0aWQgPT0gVTMyX01BWCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICIlczogbm8gbW9yZSBvYmplY3QgaWRzIiwgX19GVU5DVElPTl9fKTsKLQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSkgOwotCXJldHVybiAwOwotICAgIH0KKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKKwkvKiBjb21tZW50IG5lZWRlZCAtSGFucyAqLworCXVudXNlZF9vYmplY3RpZCA9IGxlMzJfdG9fY3B1KG1hcFsxXSk7CisJaWYgKHVudXNlZF9vYmplY3RpZCA9PSBVMzJfTUFYKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgIiVzOiBubyBtb3JlIG9iamVjdCBpZHMiLCBfX0ZVTkNUSU9OX18pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCXJldHVybiAwOworCX0KIAotICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gYWxsb2NhdGVzIHRoZSBmaXJzdCB1bnVzZWQgb2JqZWN0aWQuIFRoYXQKLSAgICAgICBpcyB0byBzYXksIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgb2JqZWN0aWQgbWFwIGlzIHRoZSBmaXJzdAotICAgICAgIHVudXNlZCBvYmplY3RpZCwgYW5kIGJ5IGluY3JlbWVudGluZyBpdCB3ZSB1c2UgaXQuICBTZWUgYmVsb3cKLSAgICAgICB3aGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgd2UgZWxpbWluYXRlZCBhIHNlcXVlbmNlIG9mIHVudXNlZAotICAgICAgIG9iamVjdGlkcy4uLi4gKi8KLSAgICBtYXBbMV0gPSBjcHVfdG9fbGUzMiAodW51c2VkX29iamVjdGlkICsgMSk7CisJLyogVGhpcyBpbmNyZW1lbnRhdGlvbiBhbGxvY2F0ZXMgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4gVGhhdAorCSAgIGlzIHRvIHNheSwgdGhlIGZpcnN0IGVudHJ5IG9uIHRoZSBvYmplY3RpZCBtYXAgaXMgdGhlIGZpcnN0CisJICAgdW51c2VkIG9iamVjdGlkLCBhbmQgYnkgaW5jcmVtZW50aW5nIGl0IHdlIHVzZSBpdC4gIFNlZSBiZWxvdworCSAgIHdoZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIGEgc2VxdWVuY2Ugb2YgdW51c2VkCisJICAgb2JqZWN0aWRzLi4uLiAqLworCW1hcFsxXSA9IGNwdV90b19sZTMyKHVudXNlZF9vYmplY3RpZCArIDEpOwogCi0gICAgLyogTm93IHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIHRoZSBsYXN0IHJlbWFpbmluZyBtZW1iZXIgb2YKLSAgICAgICB0aGUgZmlyc3QgZXZlbiBzZXF1ZW5jZSAoYW5kIGNhbiBlbGltaW5hdGUgdGhlIHNlcXVlbmNlIGJ5Ci0gICAgICAgZWxpbWluYXRpbmcgaXRzIGxhc3Qgb2JqZWN0aWQgZnJvbSBvaWRzKSwgYW5kIGNhbiBjb2xsYXBzZSB0aGUKLSAgICAgICBmaXJzdCB0d28gb2RkIHNlcXVlbmNlcyBpbnRvIG9uZSBzZXF1ZW5jZS4gIElmIHNvLCB0aGVuIHRoZSBuZXQKLSAgICAgICByZXN1bHQgaXMgdG8gZWxpbWluYXRlIGEgcGFpciBvZiBvYmplY3RpZHMgZnJvbSBvaWRzLiAgV2UgZG8gdGhpcwotICAgICAgIGJ5IHNoaWZ0aW5nIHRoZSBlbnRpcmUgbWFwIHRvIHRoZSBsZWZ0LiAqLwotICAgIGlmIChzYl9vaWRfY3Vyc2l6ZShycykgPiAyICYmIG1hcFsxXSA9PSBtYXBbMl0pIHsKLQltZW1tb3ZlIChtYXAgKyAxLCBtYXAgKyAzLCAoc2Jfb2lkX2N1cnNpemUocnMpIC0gMykgKiBzaXplb2YoX191MzIpKTsKLSAgICAgICAgc2V0X3NiX29pZF9jdXJzaXplKCBycywgc2Jfb2lkX2N1cnNpemUocnMpIC0gMiApOwotICAgIH0KKwkvKiBOb3cgd2UgY2hlY2sgdG8gc2VlIGlmIHdlIGVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtYWluaW5nIG1lbWJlciBvZgorCSAgIHRoZSBmaXJzdCBldmVuIHNlcXVlbmNlIChhbmQgY2FuIGVsaW1pbmF0ZSB0aGUgc2VxdWVuY2UgYnkKKwkgICBlbGltaW5hdGluZyBpdHMgbGFzdCBvYmplY3RpZCBmcm9tIG9pZHMpLCBhbmQgY2FuIGNvbGxhcHNlIHRoZQorCSAgIGZpcnN0IHR3byBvZGQgc2VxdWVuY2VzIGludG8gb25lIHNlcXVlbmNlLiAgSWYgc28sIHRoZW4gdGhlIG5ldAorCSAgIHJlc3VsdCBpcyB0byBlbGltaW5hdGUgYSBwYWlyIG9mIG9iamVjdGlkcyBmcm9tIG9pZHMuICBXZSBkbyB0aGlzCisJICAgYnkgc2hpZnRpbmcgdGhlIGVudGlyZSBtYXAgdG8gdGhlIGxlZnQuICovCisJaWYgKHNiX29pZF9jdXJzaXplKHJzKSA+IDIgJiYgbWFwWzFdID09IG1hcFsyXSkgeworCQltZW1tb3ZlKG1hcCArIDEsIG1hcCArIDMsCisJCQkoc2Jfb2lkX2N1cnNpemUocnMpIC0gMykgKiBzaXplb2YoX191MzIpKTsKKwkJc2V0X3NiX29pZF9jdXJzaXplKHJzLCBzYl9vaWRfY3Vyc2l6ZShycykgLSAyKTsKKwl9CiAKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgcmV0dXJuIHVudXNlZF9vYmplY3RpZDsKKwlqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlyZXR1cm4gdW51c2VkX29iamVjdGlkOwogfQogCi0KIC8qIG1ha2VzIG9iamVjdCBpZGVudGlmaWVyIHVudXNlZCAqLwotdm9pZCByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJX191MzIgb2JqZWN0aWRfdG9fcmVsZWFzZSkKK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBfX3UzMiBvYmplY3RpZF90b19yZWxlYXNlKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAgIF9fbGUzMiAqIG1hcCA9IG9iamVjdGlkX21hcCAocywgcnMpOwotICAgIGludCBpID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlcjsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlfX2xlMzIgKm1hcCA9IG9iamVjdGlkX21hcChzLCBycyk7CisJaW50IGkgPSAwOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAgIC8vcmV0dXJuOwotICAgIGNoZWNrX29iamVjdGlkX21hcCAocywgbWFwKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKKwkvL3JldHVybjsKKwljaGVja19vYmplY3RpZF9tYXAocywgbWFwKTsKIAotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7IAorCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCWpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOwogCi0gICAgLyogc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0aWQgbWFwIChpID0gMCkgYW5kIGdvIHRvCi0gICAgICAgdGhlIGVuZCBvZiBpdCAoaSA9IGRpc2tfc2ItPnNfb2lkX2N1cnNpemUpLiAgTGluZWFyIHNlYXJjaCBpcwotICAgICAgIHdoYXQgd2UgdXNlLCB0aG91Z2ggaXQgaXMgcG9zc2libGUgdGhhdCBiaW5hcnkgc2VhcmNoIHdvdWxkIGJlCi0gICAgICAgbW9yZSBlZmZpY2llbnQgYWZ0ZXIgcGVyZm9ybWluZyBsb3RzIG9mIGRlbGV0aW9ucyAod2hpY2ggaXMKLSAgICAgICB3aGVuIG9pZHMgaXMgbGFyZ2UuKSAgV2Ugb25seSBjaGVjayBldmVuIGkncy4gKi8KLSAgICB3aGlsZSAoaSA8IHNiX29pZF9jdXJzaXplKHJzKSkgewotCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1IChtYXBbaV0pKSB7Ci0JICAgIC8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLwotCSAgICAvL21hcFtpXSsrOwotCSAgICBtYXBbaV0gPSBjcHVfdG9fbGUzMiAobGUzMl90b19jcHUgKG1hcFtpXSkgKyAxKTsKKwkvKiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3RpZCBtYXAgKGkgPSAwKSBhbmQgZ28gdG8KKwkgICB0aGUgZW5kIG9mIGl0IChpID0gZGlza19zYi0+c19vaWRfY3Vyc2l6ZSkuICBMaW5lYXIgc2VhcmNoIGlzCisJICAgd2hhdCB3ZSB1c2UsIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0aGF0IGJpbmFyeSBzZWFyY2ggd291bGQgYmUKKwkgICBtb3JlIGVmZmljaWVudCBhZnRlciBwZXJmb3JtaW5nIGxvdHMgb2YgZGVsZXRpb25zICh3aGljaCBpcworCSAgIHdoZW4gb2lkcyBpcyBsYXJnZS4pICBXZSBvbmx5IGNoZWNrIGV2ZW4gaSdzLiAqLworCXdoaWxlIChpIDwgc2Jfb2lkX2N1cnNpemUocnMpKSB7CisJCWlmIChvYmplY3RpZF90b19yZWxlYXNlID09IGxlMzJfdG9fY3B1KG1hcFtpXSkpIHsKKwkJCS8qIFRoaXMgaW5jcmVtZW50YXRpb24gdW5hbGxvY2F0ZXMgdGhlIG9iamVjdGlkLiAqLworCQkJLy9tYXBbaV0rKzsKKwkJCW1hcFtpXSA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KG1hcFtpXSkgKyAxKTsKIAotCSAgICAvKiBEaWQgd2UgdW5hbGxvY2F0ZSB0aGUgbGFzdCBtZW1iZXIgb2YgYW4gb2RkIHNlcXVlbmNlLCBhbmQgY2FuIHNocmluayBvaWRzPyAqLwotCSAgICBpZiAobWFwW2ldID09IG1hcFtpKzFdKSB7Ci0JCS8qIHNocmluayBvYmplY3RpZCBtYXAgKi8KLQkJbWVtbW92ZSAobWFwICsgaSwgbWFwICsgaSArIDIsIAotCQkJIChzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMikgKiBzaXplb2YgKF9fdTMyKSk7Ci0JCS8vZGlza19zYi0+c19vaWRfY3Vyc2l6ZSAtPSAyOwotICAgICAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIgKTsKKwkJCS8qIERpZCB3ZSB1bmFsbG9jYXRlIHRoZSBsYXN0IG1lbWJlciBvZiBhbiBvZGQgc2VxdWVuY2UsIGFuZCBjYW4gc2hyaW5rIG9pZHM/ICovCisJCQlpZiAobWFwW2ldID09IG1hcFtpICsgMV0pIHsKKwkJCQkvKiBzaHJpbmsgb2JqZWN0aWQgbWFwICovCisJCQkJbWVtbW92ZShtYXAgKyBpLCBtYXAgKyBpICsgMiwKKwkJCQkJKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLQorCQkJCQkgMikgKiBzaXplb2YoX191MzIpKTsKKwkJCQkvL2Rpc2tfc2ItPnNfb2lkX2N1cnNpemUgLT0gMjsKKwkJCQlzZXRfc2Jfb2lkX2N1cnNpemUocnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIpOwogCi0JCVJGQUxTRSggc2Jfb2lkX2N1cnNpemUocnMpIDwgMiB8fCAKLQkJICAgICAgICBzYl9vaWRfY3Vyc2l6ZShycykgPiBzYl9vaWRfbWF4c2l6ZShycyksCi0JCSAgICAgICAgInZzLTE1MDA1OiBvYmplY3RpZCBtYXAgY29ycnVwdGVkIGN1cl9zaXplID09ICVkIChtYXggPT0gJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiX29pZF9jdXJzaXplKHJzKSwgc2Jfb2lkX21heHNpemUocnMpKTsKLQkgICAgfQotCSAgICByZXR1cm47CisJCQkJUkZBTFNFKHNiX29pZF9jdXJzaXplKHJzKSA8IDIgfHwKKwkJCQkgICAgICAgc2Jfb2lkX2N1cnNpemUocnMpID4gc2Jfb2lkX21heHNpemUocnMpLAorCQkJCSAgICAgICAidnMtMTUwMDU6IG9iamVjdGlkIG1hcCBjb3JydXB0ZWQgY3VyX3NpemUgPT0gJWQgKG1heCA9PSAlZCkiLAorCQkJCSAgICAgICBzYl9vaWRfY3Vyc2l6ZShycyksIHNiX29pZF9tYXhzaXplKHJzKSk7CisJCQl9CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSA+IGxlMzJfdG9fY3B1KG1hcFtpXSkgJiYKKwkJICAgIG9iamVjdGlkX3RvX3JlbGVhc2UgPCBsZTMyX3RvX2NwdShtYXBbaSArIDFdKSkgeworCQkJLyogc2l6ZSBvZiBvYmplY3RpZCBtYXAgaXMgbm90IGNoYW5nZWQgKi8KKwkJCWlmIChvYmplY3RpZF90b19yZWxlYXNlICsgMSA9PSBsZTMyX3RvX2NwdShtYXBbaSArIDFdKSkgeworCQkJCS8vb2JqZWN0aWRfbWFwW2krMV0tLTsKKwkJCQltYXBbaSArIDFdID0KKwkJCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUobWFwW2kgKyAxXSkgLSAxKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCS8qIEpETSBjb21wYXJpbmcgdHdvIGxpdHRsZS1lbmRpYW4gdmFsdWVzIGZvciBlcXVhbGl0eSAtLSBzYWZlICovCisJCQlpZiAoc2Jfb2lkX2N1cnNpemUocnMpID09IHNiX29pZF9tYXhzaXplKHJzKSkgeworCQkJCS8qIG9iamVjdGlkIG1hcCBtdXN0IGJlIGV4cGFuZGVkLCBidXQgdGhlcmUgaXMgbm8gc3BhY2UgKi8KKwkJCQlQUk9DX0lORk9fSU5DKHMsIGxlYWtlZF9vaWQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJLyogZXhwYW5kIHRoZSBvYmplY3RpZCBtYXAgKi8KKwkJCW1lbW1vdmUobWFwICsgaSArIDMsIG1hcCArIGkgKyAxLAorCQkJCShzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMSkgKiBzaXplb2YoX191MzIpKTsKKwkJCW1hcFtpICsgMV0gPSBjcHVfdG9fbGUzMihvYmplY3RpZF90b19yZWxlYXNlKTsKKwkJCW1hcFtpICsgMl0gPSBjcHVfdG9fbGUzMihvYmplY3RpZF90b19yZWxlYXNlICsgMSk7CisJCQlzZXRfc2Jfb2lkX2N1cnNpemUocnMsIHNiX29pZF9jdXJzaXplKHJzKSArIDIpOworCQkJcmV0dXJuOworCQl9CisJCWkgKz0gMjsKIAl9CiAKLQlpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSA+IGxlMzJfdG9fY3B1IChtYXBbaV0pICYmIAotCSAgICBvYmplY3RpZF90b19yZWxlYXNlIDwgbGUzMl90b19jcHUgKG1hcFtpICsgMV0pKSB7Ci0JICAgIC8qIHNpemUgb2Ygb2JqZWN0aWQgbWFwIGlzIG5vdCBjaGFuZ2VkICovCi0JICAgIGlmIChvYmplY3RpZF90b19yZWxlYXNlICsgMSA9PSBsZTMyX3RvX2NwdSAobWFwW2kgKyAxXSkpIHsKLQkJLy9vYmplY3RpZF9tYXBbaSsxXS0tOwotCQltYXBbaSArIDFdID0gY3B1X3RvX2xlMzIgKGxlMzJfdG9fY3B1IChtYXBbaSArIDFdKSAtIDEpOwotCQlyZXR1cm47Ci0JICAgIH0KLQotICAgICAgICAgICAgLyogSkRNIGNvbXBhcmluZyB0d28gbGl0dGxlLWVuZGlhbiB2YWx1ZXMgZm9yIGVxdWFsaXR5IC0tIHNhZmUgKi8KLQlpZiAoc2Jfb2lkX2N1cnNpemUocnMpID09IHNiX29pZF9tYXhzaXplKHJzKSkgewotCQkvKiBvYmplY3RpZCBtYXAgbXVzdCBiZSBleHBhbmRlZCwgYnV0IHRoZXJlIGlzIG5vIHNwYWNlICovCi0JCVBST0NfSU5GT19JTkMoIHMsIGxlYWtlZF9vaWQgKTsKLQkJcmV0dXJuOwotCX0KLQotCSAgICAvKiBleHBhbmQgdGhlIG9iamVjdGlkIG1hcCovCi0JICAgIG1lbW1vdmUgKG1hcCArIGkgKyAzLCBtYXAgKyBpICsgMSwgCi0JCSAgICAgKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLSAxKSAqIHNpemVvZihfX3UzMikpOwotCSAgICBtYXBbaSArIDFdID0gY3B1X3RvX2xlMzIgKG9iamVjdGlkX3RvX3JlbGVhc2UpOwotCSAgICBtYXBbaSArIDJdID0gY3B1X3RvX2xlMzIgKG9iamVjdGlkX3RvX3JlbGVhc2UgKyAxKTsKLSAgICAgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSArIDIgKTsKLQkgICAgcmV0dXJuOwotCX0KLQlpICs9IDI7Ci0gICAgfQotCi0gICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTE1MDExOiByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkOiB0cmllZCB0byBmcmVlIGZyZWUgb2JqZWN0IGlkICglbHUpIiwKLQkJICAgICAgKCBsb25nIHVuc2lnbmVkICkgb2JqZWN0aWRfdG9fcmVsZWFzZSk7CisJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJICJ2cy0xNTAxMTogcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZDogdHJpZWQgdG8gZnJlZSBmcmVlIG9iamVjdCBpZCAoJWx1KSIsCisJCQkgKGxvbmcgdW5zaWduZWQpb2JqZWN0aWRfdG9fcmVsZWFzZSk7CiB9CiAKK2ludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpkaXNrX3NiID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKKwlpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMjsKKwlpbnQgb2xkX21heCA9IHNiX29pZF9tYXhzaXplKGRpc2tfc2IpOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSAqZGlza19zYl92MTsKKwlfX2xlMzIgKm9iamVjdGlkX21hcCwgKm5ld19vYmplY3RpZF9tYXA7CisJaW50IGk7CiAKLWludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc2IgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICBpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKLSAgICBpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMiA7Ci0gICAgaW50IG9sZF9tYXggPSBzYl9vaWRfbWF4c2l6ZShkaXNrX3NiKTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKmRpc2tfc2JfdjEgOwotICAgIF9fbGUzMiAqb2JqZWN0aWRfbWFwLCAqbmV3X29iamVjdGlkX21hcCA7Ci0gICAgaW50IGkgOworCWRpc2tfc2JfdjEgPQorCSAgICAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOworCW9iamVjdGlkX21hcCA9IChfX2xlMzIgKikgKGRpc2tfc2JfdjEgKyAxKTsKKwluZXdfb2JqZWN0aWRfbWFwID0gKF9fbGUzMiAqKSAoZGlza19zYiArIDEpOwogCi0gICAgZGlza19zYl92MT0oc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2RhdGEpOwotICAgIG9iamVjdGlkX21hcCA9IChfX2xlMzIgKikoZGlza19zYl92MSArIDEpIDsKLSAgICBuZXdfb2JqZWN0aWRfbWFwID0gKF9fbGUzMiAqKShkaXNrX3NiICsgMSkgOworCWlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7CisJCS8qIG1hcmsgZXZlcnlvbmUgdXNlZCB0aGF0IHdhcyBsaXN0ZWQgYXMgZnJlZSBhdCB0aGUgZW5kIG9mIHRoZSBvYmplY3RpZAorCQkgKiogbWFwIAorCQkgKi8KKwkJb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXTsKKwkJc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsIG5ld19zaXplKTsKKwl9CisJLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KKwlmb3IgKGkgPSBuZXdfc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCW9iamVjdGlkX21hcFtpICsgKG9sZF9tYXggLSBuZXdfc2l6ZSldID0gb2JqZWN0aWRfbWFwW2ldOworCX0KIAotICAgIGlmIChjdXJfc2l6ZSA+IG5ld19zaXplKSB7Ci0JLyogbWFyayBldmVyeW9uZSB1c2VkIHRoYXQgd2FzIGxpc3RlZCBhcyBmcmVlIGF0IHRoZSBlbmQgb2YgdGhlIG9iamVjdGlkCi0JKiogbWFwIAotCSovCi0Jb2JqZWN0aWRfbWFwW25ld19zaXplIC0gMV0gPSBvYmplY3RpZF9tYXBbY3VyX3NpemUgLSAxXSA7Ci0Jc2V0X3NiX29pZF9jdXJzaXplKGRpc2tfc2IsbmV3X3NpemUpIDsKLSAgICB9Ci0gICAgLyogbW92ZSB0aGUgc21hbGxlciBvYmplY3RpZCBtYXAgcGFzdCB0aGUgZW5kIG9mIHRoZSBuZXcgc3VwZXIgKi8KLSAgICBmb3IgKGkgPSBuZXdfc2l6ZSAtIDEgOyBpID49IDAgOyBpLS0pIHsKLSAgICAgICAgb2JqZWN0aWRfbWFwW2kgKyAob2xkX21heCAtIG5ld19zaXplKV0gPSBvYmplY3RpZF9tYXBbaV0gOyAKLSAgICB9CisJLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLworCXNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLCBuZXdfc2l6ZSk7CiAKKwkvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KKwltZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKTsKKwlnZW5lcmF0ZV9yYW5kb21fdXVpZChkaXNrX3NiLT5zX3V1aWQpOwogCi0gICAgLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLwotICAgIHNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLG5ld19zaXplKSA7Ci0KLSAgICAvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KLSAgICBtZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKSA7Ci0gICAgZ2VuZXJhdGVfcmFuZG9tX3V1aWQoZGlza19zYi0+c191dWlkKTsKLQotICAgIC8qIGZpbmFsbHksIHplcm8gb3V0IHRoZSB1bnVzZWQgY2h1bmsgb2YgdGhlIG5ldyBzdXBlciAqLwotICAgIG1lbXNldChkaXNrX3NiLT5zX3VudXNlZCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfdW51c2VkKSkgOwotICAgIHJldHVybiAwIDsKKwkvKiBmaW5hbGx5LCB6ZXJvIG91dCB0aGUgdW51c2VkIGNodW5rIG9mIHRoZSBuZXcgc3VwZXIgKi8KKwltZW1zZXQoZGlza19zYi0+c191bnVzZWQsIDAsIHNpemVvZihkaXNrX3NiLT5zX3VudXNlZCkpOworCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcmludHMuYyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCmluZGV4IDE2ZmRjYTEuLmQ1NWUxNjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3ByaW50cy5jCisrKyBiL2ZzL3JlaXNlcmZzL3ByaW50cy5jCkBAIC0xNSwxNjkgKzE1LDE2NyBAQAogc3RhdGljIGNoYXIgZm10X2J1ZlsxMDI0XTsKIHN0YXRpYyBjaGFyIG9mZl9idWZbODBdOwogCi0KLXN0YXRpYyBjaGFyICogcmVpc2VyZnNfY3B1X29mZnNldCAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgY2hhciAqcmVpc2VyZnNfY3B1X29mZnNldChzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICBpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQotICAgIHNwcmludGYgKG9mZl9idWYsICIlTHUoJUx1KSIsIAotCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylHRVRfSEFTSF9WQUxVRSAoY3B1X2tleV9rX29mZnNldCAoa2V5KSksCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAoY3B1X2tleV9rX29mZnNldCAoa2V5KSkpOwotICBlbHNlCi0gICAgc3ByaW50ZiAob2ZmX2J1ZiwgIjB4JUx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0IChrZXkpKTsKLSAgcmV0dXJuIG9mZl9idWY7CisJaWYgKGNwdV9rZXlfa190eXBlKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwkJc3ByaW50ZihvZmZfYnVmLCAiJUx1KCVMdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUdFVF9IQVNIX1ZBTFVFKGNwdV9rZXlfa19vZmZzZXQoa2V5KSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJR0VUX0dFTkVSQVRJT05fTlVNQkVSKGNwdV9rZXlfa19vZmZzZXQoa2V5KSkpOworCWVsc2UKKwkJc3ByaW50ZihvZmZfYnVmLCAiMHglTHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfa2V5X2tfb2Zmc2V0KGtleSkpOworCXJldHVybiBvZmZfYnVmOwogfQogCi0KLXN0YXRpYyBjaGFyICogbGVfb2Zmc2V0IChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQorc3RhdGljIGNoYXIgKmxlX29mZnNldChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gIGludCB2ZXJzaW9uOworCWludCB2ZXJzaW9uOwogCi0gIHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKLSAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKLSAgICBzcHJpbnRmIChvZmZfYnVmLCAiJUx1KCVMdSkiLCAKLQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpR0VUX0hBU0hfVkFMVUUgKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSksCi0JICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpKSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChvZmZfYnVmLCAiMHglTHgiLCAodW5zaWduZWQgbG9uZyBsb25nKWxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSk7Ci0gIHJldHVybiBvZmZfYnVmOworCXZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbihrZXkpOworCWlmIChsZV9rZXlfa190eXBlKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKKwkJc3ByaW50ZihvZmZfYnVmLCAiJUx1KCVMdSkiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUdFVF9IQVNIX1ZBTFVFKGxlX2tleV9rX29mZnNldCh2ZXJzaW9uLCBrZXkpKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQlHRVRfR0VORVJBVElPTl9OVU1CRVIobGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkpKTsKKwllbHNlCisJCXNwcmludGYob2ZmX2J1ZiwgIjB4JUx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGtleSkpOworCXJldHVybiBvZmZfYnVmOwogfQogCi0KLXN0YXRpYyBjaGFyICogY3B1X3R5cGUgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIGNoYXIgKmNwdV90eXBlKHN0cnVjdCBjcHVfa2V5ICprZXkpCiB7Ci0gICAgaWYgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfU1RBVF9EQVRBKQotCXJldHVybiAiU0QiOwotICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQotCXJldHVybiAiRElSIjsKLSAgICBpZiAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFQ1QpCi0JcmV0dXJuICJESVJFQ1QiOwotICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0lORElSRUNUKQotCXJldHVybiAiSU5EIjsKLSAgICByZXR1cm4gIlVOS05PV04iOworCWlmIChjcHVfa2V5X2tfdHlwZShrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCQlyZXR1cm4gIlNEIjsKKwlpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorCQlyZXR1cm4gIkRJUiI7CisJaWYgKGNwdV9rZXlfa190eXBlKGtleSkgPT0gVFlQRV9ESVJFQ1QpCisJCXJldHVybiAiRElSRUNUIjsKKwlpZiAoY3B1X2tleV9rX3R5cGUoa2V5KSA9PSBUWVBFX0lORElSRUNUKQorCQlyZXR1cm4gIklORCI7CisJcmV0dXJuICJVTktOT1dOIjsKIH0KIAotCi1zdGF0aWMgY2hhciAqIGxlX3R5cGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgY2hhciAqbGVfdHlwZShzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgaW50IHZlcnNpb247Ci0gICAgCi0gICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOworCWludCB2ZXJzaW9uOwogCi0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9TVEFUX0RBVEEpCi0JcmV0dXJuICJTRCI7Ci0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKLQlyZXR1cm4gIkRJUiI7Ci0gICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9ESVJFQ1QpCi0JcmV0dXJuICJESVJFQ1QiOwotICAgIGlmIChsZV9rZXlfa190eXBlICh2ZXJzaW9uLCBrZXkpID09IFRZUEVfSU5ESVJFQ1QpCi0JcmV0dXJuICJJTkQiOwotICAgIHJldHVybiAiVU5LTk9XTiI7CisJdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGtleSk7CisKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCQlyZXR1cm4gIlNEIjsKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfRElSRU5UUlkpCisJCXJldHVybiAiRElSIjsKKwlpZiAobGVfa2V5X2tfdHlwZSh2ZXJzaW9uLCBrZXkpID09IFRZUEVfRElSRUNUKQorCQlyZXR1cm4gIkRJUkVDVCI7CisJaWYgKGxlX2tleV9rX3R5cGUodmVyc2lvbiwga2V5KSA9PSBUWVBFX0lORElSRUNUKQorCQlyZXR1cm4gIklORCI7CisJcmV0dXJuICJVTktOT1dOIjsKIH0KIAotCiAvKiAlayAqLwotc3RhdGljIHZvaWQgc3ByaW50Zl9sZV9rZXkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2xlX2tleShjaGFyICpidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKIHsKLSAgaWYgKGtleSkKLSAgICBzcHJpbnRmIChidWYsICJbJWQgJWQgJXMgJXNdIiwgbGUzMl90b19jcHUgKGtleS0+a19kaXJfaWQpLAotCSAgICAgbGUzMl90b19jcHUgKGtleS0+a19vYmplY3RpZCksIGxlX29mZnNldCAoa2V5KSwgbGVfdHlwZSAoa2V5KSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJbTlVMTF0iKTsKKwlpZiAoa2V5KQorCQlzcHJpbnRmKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBsZTMyX3RvX2NwdShrZXktPmtfZGlyX2lkKSwKKwkJCWxlMzJfdG9fY3B1KGtleS0+a19vYmplY3RpZCksIGxlX29mZnNldChrZXkpLAorCQkJbGVfdHlwZShrZXkpKTsKKwllbHNlCisJCXNwcmludGYoYnVmLCAiW05VTExdIik7CiB9CiAKLQogLyogJUsgKi8KLXN0YXRpYyB2b2lkIHNwcmludGZfY3B1X2tleSAoY2hhciAqIGJ1Ziwgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2NwdV9rZXkoY2hhciAqYnVmLCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICBpZiAoa2V5KQotICAgIHNwcmludGYgKGJ1ZiwgIlslZCAlZCAlcyAlc10iLCBrZXktPm9uX2Rpc2tfa2V5LmtfZGlyX2lkLAotCSAgICAga2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkLCByZWlzZXJmc19jcHVfb2Zmc2V0IChrZXkpLAotICAgICAgICAgICAgIGNwdV90eXBlIChrZXkpKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworCWlmIChrZXkpCisJCXNwcmludGYoYnVmLCAiWyVkICVkICVzICVzXSIsIGtleS0+b25fZGlza19rZXkua19kaXJfaWQsCisJCQlrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQsIHJlaXNlcmZzX2NwdV9vZmZzZXQoa2V5KSwKKwkJCWNwdV90eXBlKGtleSkpOworCWVsc2UKKwkJc3ByaW50ZihidWYsICJbTlVMTF0iKTsKIH0KIAotc3RhdGljIHZvaWQgc3ByaW50Zl9kZV9oZWFkKCBjaGFyICpidWYsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWggKQorc3RhdGljIHZvaWQgc3ByaW50Zl9kZV9oZWFkKGNoYXIgKmJ1Ziwgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlaCkKIHsKLSAgICBpZiggZGVoICkKLSAgICAgICAgc3ByaW50ZiggYnVmLCAiW29mZnNldD0lZCBkaXJfaWQ9JWQgb2JqZWN0aWQ9JWQgbG9jYXRpb249JWQgc3RhdGU9JTA0eF0iLCBkZWhfb2Zmc2V0KGRlaCksIGRlaF9kaXJfaWQoZGVoKSwKLSAgICAgICAgICAgICAgICAgZGVoX29iamVjdGlkKGRlaCksIGRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSApOwotICAgIGVsc2UKLSAgICAgICAgc3ByaW50ZiggYnVmLCAiW05VTExdIiApOworCWlmIChkZWgpCisJCXNwcmludGYoYnVmLAorCQkJIltvZmZzZXQ9JWQgZGlyX2lkPSVkIG9iamVjdGlkPSVkIGxvY2F0aW9uPSVkIHN0YXRlPSUwNHhdIiwKKwkJCWRlaF9vZmZzZXQoZGVoKSwgZGVoX2Rpcl9pZChkZWgpLCBkZWhfb2JqZWN0aWQoZGVoKSwKKwkJCWRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIltOVUxMXSIpOwogCiB9CiAKLXN0YXRpYyB2b2lkIHNwcmludGZfaXRlbV9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2l0ZW1faGVhZChjaGFyICpidWYsIHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICAgIGlmIChpaCkgewotCXN0cmNweSAoYnVmLCAoaWhfdmVyc2lvbiAoaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7Ci0Jc3ByaW50Zl9sZV9rZXkgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgJihpaC0+aWhfa2V5KSk7Ci0Jc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiLCBpdGVtX2xlbiAlZCwgaXRlbV9sb2NhdGlvbiAlZCwgIgotCQkgImZyZWVfc3BhY2UoZW50cnlfY291bnQpICVkIiwKLQkJIGloX2l0ZW1fbGVuKGloKSwgaWhfbG9jYXRpb24oaWgpLCBpaF9mcmVlX3NwYWNlIChpaCkpOwotICAgIH0gZWxzZQotCXNwcmludGYgKGJ1ZiwgIltOVUxMXSIpOworCWlmIChpaCkgeworCQlzdHJjcHkoYnVmLAorCQkgICAgICAgKGloX3ZlcnNpb24oaWgpID09IEtFWV9GT1JNQVRfM182KSA/ICIqMy42KiAiIDogIiozLjUqIik7CisJCXNwcmludGZfbGVfa2V5KGJ1ZiArIHN0cmxlbihidWYpLCAmKGloLT5paF9rZXkpKTsKKwkJc3ByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgIiwgaXRlbV9sZW4gJWQsIGl0ZW1fbG9jYXRpb24gJWQsICIKKwkJCSJmcmVlX3NwYWNlKGVudHJ5X2NvdW50KSAlZCIsCisJCQlpaF9pdGVtX2xlbihpaCksIGloX2xvY2F0aW9uKGloKSwgaWhfZnJlZV9zcGFjZShpaCkpOworCX0gZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIltOVUxMXSIpOwogfQogCi0KLXN0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3N0YXRpYyB2b2lkIHNwcmludGZfZGlyZW50cnkoY2hhciAqYnVmLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSkKIHsKLSAgY2hhciBuYW1lWzIwXTsKKwljaGFyIG5hbWVbMjBdOwogCi0gIG1lbWNweSAobmFtZSwgZGUtPmRlX25hbWUsIGRlLT5kZV9uYW1lbGVuID4gMTkgPyAxOSA6IGRlLT5kZV9uYW1lbGVuKTsKLSAgbmFtZSBbZGUtPmRlX25hbWVsZW4gPiAxOSA/IDE5IDogZGUtPmRlX25hbWVsZW5dID0gMDsKLSAgc3ByaW50ZiAoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7CisJbWVtY3B5KG5hbWUsIGRlLT5kZV9uYW1lLCBkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbik7CisJbmFtZVtkZS0+ZGVfbmFtZWxlbiA+IDE5ID8gMTkgOiBkZS0+ZGVfbmFtZWxlbl0gPSAwOworCXNwcmludGYoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7CiB9CiAKLQotc3RhdGljIHZvaWQgc3ByaW50Zl9ibG9ja19oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIHNwcmludGZfYmxvY2tfaGVhZChjaGFyICpidWYsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gIHNwcmludGYgKGJ1ZiwgImxldmVsPSVkLCBucl9pdGVtcz0lZCwgZnJlZV9zcGFjZT0lZCByZGtleSAiLAotCSAgIEJfTEVWRUwgKGJoKSwgQl9OUl9JVEVNUyAoYmgpLCBCX0ZSRUVfU1BBQ0UgKGJoKSk7CisJc3ByaW50ZihidWYsICJsZXZlbD0lZCwgbnJfaXRlbXM9JWQsIGZyZWVfc3BhY2U9JWQgcmRrZXkgIiwKKwkJQl9MRVZFTChiaCksIEJfTlJfSVRFTVMoYmgpLCBCX0ZSRUVfU1BBQ0UoYmgpKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkgCitzdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkKGNoYXIgKmJ1Ziwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgY2hhciBiW0JERVZOQU1FX1NJWkVdOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIAotICBzcHJpbnRmIChidWYsICJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAotCSAgIGJkZXZuYW1lIChiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKLQkgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCi0JICAgYXRvbWljX3JlYWQgKCYoYmgtPmJfY291bnQpKSwKLQkgICBiaC0+Yl9zdGF0ZSwgYmgtPmJfcGFnZSwKLQkgICBidWZmZXJfdXB0b2RhdGUgKGJoKSA/ICJVUFRPREFURSIgOiAiIVVQVE9EQVRFIiwKLQkgICBidWZmZXJfZGlydHkgKGJoKSA/ICJESVJUWSIgOiAiQ0xFQU4iLAotCSAgIGJ1ZmZlcl9sb2NrZWQgKGJoKSA/ICJMT0NLRUQiIDogIlVOTE9DS0VEIik7CisJc3ByaW50ZihidWYsCisJCSJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAorCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSksCisJCWJoLT5iX3N0YXRlLCBiaC0+Yl9wYWdlLAorCQlidWZmZXJfdXB0b2RhdGUoYmgpID8gIlVQVE9EQVRFIiA6ICIhVVBUT0RBVEUiLAorCQlidWZmZXJfZGlydHkoYmgpID8gIkRJUlRZIiA6ICJDTEVBTiIsCisJCWJ1ZmZlcl9sb2NrZWQoYmgpID8gIkxPQ0tFRCIgOiAiVU5MT0NLRUQiKTsKIH0KIAotCi1zdGF0aWMgdm9pZCBzcHJpbnRmX2Rpc2tfY2hpbGQgKGNoYXIgKiBidWYsIHN0cnVjdCBkaXNrX2NoaWxkICogZGMpCitzdGF0aWMgdm9pZCBzcHJpbnRmX2Rpc2tfY2hpbGQoY2hhciAqYnVmLCBzdHJ1Y3QgZGlza19jaGlsZCAqZGMpCiB7Ci0gIHNwcmludGYgKGJ1ZiwgIltkY19udW1iZXI9JWQsIGRjX3NpemU9JXVdIiwgZGNfYmxvY2tfbnVtYmVyKGRjKSwgZGNfc2l6ZShkYykpOworCXNwcmludGYoYnVmLCAiW2RjX251bWJlcj0lZCwgZGNfc2l6ZT0ldV0iLCBkY19ibG9ja19udW1iZXIoZGMpLAorCQlkY19zaXplKGRjKSk7CiB9CiAKLQotc3RhdGljIGNoYXIgKiBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QgKGNoYXIgKiBmbXQsIGludCAqIHdoYXQsIGludCAqIHNraXApCitzdGF0aWMgY2hhciAqaXNfdGhlcmVfcmVpc2VyZnNfc3RydWN0KGNoYXIgKmZtdCwgaW50ICp3aGF0LCBpbnQgKnNraXApCiB7Ci0gIGNoYXIgKiBrID0gZm10OworCWNoYXIgKmsgPSBmbXQ7CiAKLSAgKnNraXAgPSAwOwotICAKLSAgd2hpbGUgKChrID0gc3RyY2hyIChrLCAnJScpKSAhPSBOVUxMKQotICB7Ci0gICAgaWYgKGtbMV0gPT0gJ2snIHx8IGtbMV0gPT0gJ0snIHx8IGtbMV0gPT0gJ2gnIHx8IGtbMV0gPT0gJ3QnIHx8Ci0JICAgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScgKSB7Ci0gICAgICAqd2hhdCA9IGtbMV07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgKCpza2lwKSArKzsKLSAgICBrICsrOwotICB9Ci0gIHJldHVybiBrOworCSpza2lwID0gMDsKKworCXdoaWxlICgoayA9IHN0cmNocihrLCAnJScpKSAhPSBOVUxMKSB7CisJCWlmIChrWzFdID09ICdrJyB8fCBrWzFdID09ICdLJyB8fCBrWzFdID09ICdoJyB8fCBrWzFdID09ICd0JyB8fAorCQkgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScpIHsKKwkJCSp3aGF0ID0ga1sxXTsKKwkJCWJyZWFrOworCQl9CisJCSgqc2tpcCkrKzsKKwkJaysrOworCX0KKwlyZXR1cm4gazsKIH0KIAotCiAvKiBkZWJ1Z2dpbmcgcmVpc2VyZnMgd2UgdXNlZCB0byBwcmludCBvdXQgYSBsb3Qgb2YgZGlmZmVyZW50CiAgICB2YXJpYWJsZXMsIGxpa2Uga2V5cywgaXRlbSBoZWFkZXJzLCBidWZmZXIgaGVhZHMgZXRjLiBWYWx1ZXMgb2YKICAgIG1vc3QgZmllbGRzIG1hdHRlci4gU28gaXQgdG9vayBhIGxvbmcgdGltZSBqdXN0IHRvIHdyaXRlCkBAIC0xOTEsNjEgKzE4OSw2NCBAQAogICAgICAgICAgICBrZXktPmtfb2Zmc2V0LCBrZXktPmtfdW5pcXVlbmVzcyk7IAogKi8KIAotCi1zdGF0aWMgdm9pZAotcHJlcGFyZV9lcnJvcl9idWYoIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzICkKK3N0YXRpYyB2b2lkIHByZXBhcmVfZXJyb3JfYnVmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewotICAgIGNoYXIgKiBmbXQxID0gZm10X2J1ZjsKLSAgICBjaGFyICogazsKLSAgICBjaGFyICogcCA9IGVycm9yX2J1ZjsKLSAgICBpbnQgaSwgaiwgd2hhdCwgc2tpcDsKKwljaGFyICpmbXQxID0gZm10X2J1ZjsKKwljaGFyICprOworCWNoYXIgKnAgPSBlcnJvcl9idWY7CisJaW50IGksIGosIHdoYXQsIHNraXA7CiAKLSAgICBzdHJjcHkgKGZtdDEsIGZtdCk7CisJc3RyY3B5KGZtdDEsIGZtdCk7CiAKLSAgICB3aGlsZSggKGsgPSBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QoIGZtdDEsICZ3aGF0LCAmc2tpcCApKSAhPSBOVUxMICkKLSAgICB7Ci0gICAgICAgICprID0gMDsKKwl3aGlsZSAoKGsgPSBpc190aGVyZV9yZWlzZXJmc19zdHJ1Y3QoZm10MSwgJndoYXQsICZza2lwKSkgIT0gTlVMTCkgeworCQkqayA9IDA7CiAKLSAgICAgICAgcCArPSB2c3ByaW50ZiAocCwgZm10MSwgYXJncyk7CisJCXAgKz0gdnNwcmludGYocCwgZm10MSwgYXJncyk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHNraXA7IGkgKyspCi0gICAgICAgICAgICBqID0gdmFfYXJnIChhcmdzLCBpbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgc2tpcDsgaSsrKQorCQkJaiA9IHZhX2FyZyhhcmdzLCBpbnQpOwogCi0gICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlICdrJzoKLSAgICAgICAgICAgIHNwcmludGZfbGVfa2V5IChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2tleSAqKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnSyc6Ci0gICAgICAgICAgICBzcHJpbnRmX2NwdV9rZXkgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICBzcHJpbnRmX2l0ZW1faGVhZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCBpdGVtX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgc3ByaW50Zl9kaXJlbnRyeSAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgc3ByaW50Zl9kaXNrX2NoaWxkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGRpc2tfY2hpbGQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3onOgotICAgICAgICAgICAgc3ByaW50Zl9ibG9ja19oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgICAgIHNwcmludGZfYnVmZmVyX2hlYWQgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOgotICAgICAgICAgICAgc3ByaW50Zl9kZV9oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkJc3dpdGNoICh3aGF0KSB7CisJCWNhc2UgJ2snOgorCQkJc3ByaW50Zl9sZV9rZXkocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19rZXkgKikpOworCQkJYnJlYWs7CisJCWNhc2UgJ0snOgorCQkJc3ByaW50Zl9jcHVfa2V5KHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlzcHJpbnRmX2l0ZW1faGVhZChwLCB2YV9hcmcoYXJncywgc3RydWN0IGl0ZW1faGVhZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlzcHJpbnRmX2RpcmVudHJ5KHAsCisJCQkJCSB2YV9hcmcoYXJncywKKwkJCQkJCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJc3ByaW50Zl9kaXNrX2NoaWxkKHAsCisJCQkJCSAgIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgZGlza19jaGlsZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlzcHJpbnRmX2Jsb2NrX2hlYWQocCwKKwkJCQkJICAgdmFfYXJnKGFyZ3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlzcHJpbnRmX2J1ZmZlcl9oZWFkKHAsCisJCQkJCSAgICB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCXNwcmludGZfZGVfaGVhZChwLAorCQkJCQl2YV9hcmcoYXJncywKKwkJCQkJICAgICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKTsKKwkJCWJyZWFrOworCQl9CiAKLSAgICAgICAgcCArPSBzdHJsZW4gKHApOwotICAgICAgICBmbXQxID0gayArIDI7Ci0gICAgfQotICAgIHZzcHJpbnRmIChwLCBmbXQxLCBhcmdzKTsKKwkJcCArPSBzdHJsZW4ocCk7CisJCWZtdDEgPSBrICsgMjsKKwl9CisJdnNwcmludGYocCwgZm10MSwgYXJncyk7CiAKIH0KIAotCiAvKiBpbiBhZGRpdGlvbiB0byB1c3VhbCBjb252ZXJzaW9uIHNwZWNpZmllcnMgdGhpcyBhY2NlcHRzIHJlaXNlcmZzCiAgICBzcGVjaWZpYyBjb252ZXJzaW9uIHNwZWNpZmllcnM6IAogICAgJWsgdG8gcHJpbnQgbGl0dGxlIGVuZGlhbiBrZXksIApAQCAtMjY0LDQzICsyNjUsNDMgQEAKICAgICB2YV9lbmQoIGFyZ3MgKTtcCiB9CiAKLXZvaWQgcmVpc2VyZnNfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCByZWlzZXJmc193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotICBkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7Ci0gIGlmIChzYikKLSAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJSZWlzZXJGUzogJXM6IHdhcm5pbmc6ICVzXG4iLAotICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Ci0gIGVsc2UKLSAgICAgIHByaW50ayAoS0VSTl9XQVJOSU5HICJSZWlzZXJGUzogd2FybmluZzogJXNcbiIsIGVycm9yX2J1Zik7CisJZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworCWlmIChzYikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVpc2VyRlM6ICVzOiB3YXJuaW5nOiAlc1xuIiwKKwkJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJlaXNlckZTOiB3YXJuaW5nOiAlc1xuIiwgZXJyb3JfYnVmKTsKIH0KIAogLyogTm8gbmV3bGluZS4uIHJlaXNlcmZzX2luZm8gY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCi12b2lkIHJlaXNlcmZzX2luZm8gKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3ZvaWQgcmVpc2VyZnNfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOwotICBpZiAoc2IpCi0gICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXM6ICVzIiwKLSAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOwotICBlbHNlCi0gICAgICBwcmludGsgKEtFUk5fTk9USUNFICJSZWlzZXJGUzogJXMiLCBlcnJvcl9idWYpOworCWRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKKwlpZiAoc2IpCisJCXByaW50ayhLRVJOX05PVElDRSAiUmVpc2VyRlM6ICVzOiAlcyIsCisJCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzYiksIGVycm9yX2J1Zik7CisJZWxzZQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlaXNlckZTOiAlcyIsIGVycm9yX2J1Zik7CiB9CiAKIC8qIE5vIG5ld2xpbmUuLiByZWlzZXJmc19wcmludGsgY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCi1zdGF0aWMgdm9pZCByZWlzZXJmc19wcmludGsgKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKLSAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOwotICBwcmludGsgKGVycm9yX2J1Zik7CisJZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworCXByaW50ayhlcnJvcl9idWYpOwogfQogCi12b2lkIHJlaXNlcmZzX2RlYnVnIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQordm9pZCByZWlzZXJmc19kZWJ1ZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi0gIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKLSAgaWYgKHMpCi0gICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlczogJXNcbiIsCi0gICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBlcnJvcl9idWYpOwotICBlbHNlCi0gICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlc1xuIiwgZXJyb3JfYnVmKTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisJaWYgKHMpCisJCXByaW50ayhLRVJOX0RFQlVHICJSZWlzZXJGUzogJXM6ICVzXG4iLAorCQkgICAgICAgcmVpc2VyZnNfYmRldm5hbWUocyksIGVycm9yX2J1Zik7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiUmVpc2VyRlM6ICVzXG4iLCBlcnJvcl9idWYpOwogI2VuZGlmCiB9CiAKQEAgLTM0OSwzNzkgKzM1MCw0MDMgQEAKIAogICAgLiAgKi8KIAotCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCi1leHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YjsKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGI7CiAjZW5kaWYKIAotdm9pZCByZWlzZXJmc19wYW5pYyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3ZvaWQgcmVpc2VyZnNfcGFuaWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKLSAgcHJpbnRrIChLRVJOX0VNRVJHICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7Ci0gIEJVRyAoKTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwlCVUcoKTsKIAotICAvKiB0aGlzIGlzIG5vdCBhY3R1YWxseSBjYWxsZWQsIGJ1dCBtYWtlcyByZWlzZXJmc19wYW5pYygpICJub3JldHVybiIgKi8KLSAgcGFuaWMgKCJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotCSByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworCS8qIHRoaXMgaXMgbm90IGFjdHVhbGx5IGNhbGxlZCwgYnV0IG1ha2VzIHJlaXNlcmZzX3BhbmljKCkgIm5vcmV0dXJuIiAqLworCXBhbmljKCJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAorCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKIH0KIAotdm9pZAotcmVpc2VyZnNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCit2b2lkIHJlaXNlcmZzX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0gICAgZG9fcmVpc2VyZnNfd2FybmluZyAoZm10KTsKKwlkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CiAKLSAgICBpZiAocmVpc2VyZnNfZXJyb3JfcGFuaWMgKHNiKSkgewotICAgICAgICBwYW5pYyAoS0VSTl9DUklUICJSRUlTRVJGUzogcGFuaWMgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKLSAgICB9CisJaWYgKHJlaXNlcmZzX2Vycm9yX3BhbmljKHNiKSkgeworCQlwYW5pYyhLRVJOX0NSSVQgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisJCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgZXJyb3JfYnVmKTsKKwl9CiAKLSAgICBpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCi0gICAgICAgIHJldHVybjsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybjsKIAotICAgIHByaW50ayAoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAotICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKKwlwcmludGsoS0VSTl9DUklUICJSRUlTRVJGUzogYWJvcnQgKGRldmljZSAlcyk6ICVzXG4iLAorCSAgICAgICByZWlzZXJmc19iZGV2bmFtZShzYiksIGVycm9yX2J1Zik7CiAKLSAgICBzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0gICAgcmVpc2VyZnNfam91cm5hbF9hYm9ydCAoc2IsIGVycm5vKTsKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJcmVpc2VyZnNfam91cm5hbF9hYm9ydChzYiwgZXJybm8pOwogfQogCiAvKiB0aGlzIHByaW50cyBpbnRlcm5hbCBub2RlcyAoNCBrZXlzL2l0ZW1zIGluIGxpbmUpIChkY19udW1iZXIsCiAgICBkY19zaXplKVtrX2RpcmlkLCBrX29iamVjdGlkLCBrX29mZnNldCwga191bmlxdWVuZXNzXShkY19udW1iZXIsCiAgICBkY19zaXplKS4uLiovCi1zdGF0aWMgaW50IHByaW50X2ludGVybmFsIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKK3N0YXRpYyBpbnQgcHJpbnRfaW50ZXJuYWwoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGZpcnN0LCBpbnQgbGFzdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OwotICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7Ci0gICAgaW50IGk7Ci0gICAgaW50IGZyb20sIHRvOwotICAgIAotICAgIGlmICghQl9JU19LRVlTX0xFVkVMIChiaCkpCi0JcmV0dXJuIDE7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5OworCXN0cnVjdCBkaXNrX2NoaWxkICpkYzsKKwlpbnQgaTsKKwlpbnQgZnJvbSwgdG87CiAKLSAgICBjaGVja19pbnRlcm5hbCAoYmgpOwotICAgIAotICAgIGlmIChmaXJzdCA9PSAtMSkgewotCWZyb20gPSAwOwotCXRvID0gQl9OUl9JVEVNUyAoYmgpOwotICAgIH0gZWxzZSB7Ci0JZnJvbSA9IGZpcnN0OwotCXRvID0gbGFzdCA8IEJfTlJfSVRFTVMgKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TIChiaCk7Ci0gICAgfQorCWlmICghQl9JU19LRVlTX0xFVkVMKGJoKSkKKwkJcmV0dXJuIDE7CiAKLSAgICByZWlzZXJmc19wcmludGsgKCJJTlRFUk5BTCBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCAgYmgtPmJfYmxvY2tuciwgYmgpOwotICAgIAotICAgIGRjID0gQl9OX0NISUxEIChiaCwgZnJvbSk7Ci0gICAgcmVpc2VyZnNfcHJpbnRrICgiUFRSICVkOiAleSAiLCBmcm9tLCBkYyk7Ci0gICAgCi0gICAgZm9yIChpID0gZnJvbSwga2V5ID0gQl9OX1BERUxJTV9LRVkgKGJoLCBmcm9tKSwgZGMgKys7IGkgPCB0bzsgaSArKywga2V5ICsrLCBkYyArKykgewotCXJlaXNlcmZzX3ByaW50ayAoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7Ci0JaWYgKGkgJiYgaSAlIDQgPT0gMCkKLQkgICAgcHJpbnRrICgiXG4iKTsKLSAgICB9Ci0gICAgcHJpbnRrICgiXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KKwljaGVja19pbnRlcm5hbChiaCk7CiAKKwlpZiAoZmlyc3QgPT0gLTEpIHsKKwkJZnJvbSA9IDA7CisJCXRvID0gQl9OUl9JVEVNUyhiaCk7CisJfSBlbHNlIHsKKwkJZnJvbSA9IGZpcnN0OworCQl0byA9IGxhc3QgPCBCX05SX0lURU1TKGJoKSA/IGxhc3QgOiBCX05SX0lURU1TKGJoKTsKKwl9CiAKKwlyZWlzZXJmc19wcmludGsoIklOVEVSTkFMIE5PREUgKCVsZCkgY29udGFpbnMgJXpcbiIsIGJoLT5iX2Jsb2NrbnIsIGJoKTsKIAorCWRjID0gQl9OX0NISUxEKGJoLCBmcm9tKTsKKwlyZWlzZXJmc19wcmludGsoIlBUUiAlZDogJXkgIiwgZnJvbSwgZGMpOwogCi0KLXN0YXRpYyBpbnQgcHJpbnRfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsIGludCBsYXN0KQotewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgaW50IGksIG5yOwotICAgIGludCBmcm9tLCB0bzsKLQotICAgIGlmICghQl9JU19JVEVNU19MRVZFTCAoYmgpKQotCXJldHVybiAxOwotCi0gICAgY2hlY2tfbGVhZiAoYmgpOwotCi0gICAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKLSAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwwKTsKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLQotICAgIHByaW50ayAoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0gICAgcmVpc2VyZnNfcHJpbnRrICgiTEVBRiBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCBiaC0+Yl9ibG9ja25yLCBiaCk7Ci0KLSAgICBpZiAoIShwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykpIHsKLQlyZWlzZXJmc19wcmludGsgKCJGSVJTVCBJVEVNX0tFWTogJWssIExBU1QgSVRFTSBLRVk6ICVrXG4iLAotCQkJICAmKGloLT5paF9rZXkpLCAmKChpaCArIG5yIC0gMSktPmloX2tleSkpOworCWZvciAoaSA9IGZyb20sIGtleSA9IEJfTl9QREVMSU1fS0VZKGJoLCBmcm9tKSwgZGMrKzsgaSA8IHRvOworCSAgICAgaSsrLCBrZXkrKywgZGMrKykgeworCQlyZWlzZXJmc19wcmludGsoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7CisJCWlmIChpICYmIGkgJSA0ID09IDApCisJCQlwcmludGsoIlxuIik7CisJfQorCXByaW50aygiXG4iKTsKIAlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoZmlyc3QgPCAwIHx8IGZpcnN0ID4gbnIgLSAxKSAKLQlmcm9tID0gMDsKLSAgICBlbHNlIAotCWZyb20gPSBmaXJzdDsKLQotICAgIGlmIChsYXN0IDwgMCB8fCBsYXN0ID4gbnIgKQotCXRvID0gbnI7Ci0gICAgZWxzZQotCXRvID0gbGFzdDsKLQotICAgIGloICs9IGZyb207Ci0gICAgcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgcHJpbnRrICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7Ci0gICAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloICsrKSB7Ci0JcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JcmVpc2VyZnNfcHJpbnRrICgifCUyZHwgJWggfFxuIiwgaSwgaWgpOwotCWlmIChwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykKLQkgICAgb3BfcHJpbnRfaXRlbSAoaWgsIEJfSV9QSVRFTSAoYmgsIGloKSk7Ci0gICAgfQotCi0gICAgcHJpbnRrICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7Ci0KLSAgICByZXR1cm4gMDsKIH0KIAotY2hhciAqIHJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQorc3RhdGljIGludCBwcmludF9sZWFmKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsCisJCSAgICAgIGludCBsYXN0KQogewotICAgIGlmICggY29kZSA9PSBZVVJBX0hBU0gpCi0JcmV0dXJuICJydXBhc292IjsKLSAgICBpZiAoIGNvZGUgPT0gVEVBX0hBU0gpCi0JcmV0dXJuICJ0ZWEiOwotICAgIGlmICggY29kZSA9PSBSNV9IQVNIKQotCXJldHVybiAicjUiOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCWludCBpLCBucjsKKwlpbnQgZnJvbSwgdG87CiAKLSAgICByZXR1cm4gInVua25vd24iOworCWlmICghQl9JU19JVEVNU19MRVZFTChiaCkpCisJCXJldHVybiAxOworCisJY2hlY2tfbGVhZihiaCk7CisKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJaWggPSBCX05fUElURU1fSEVBRChiaCwgMCk7CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKwlwcmludGsKKwkgICAgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXJlaXNlcmZzX3ByaW50aygiTEVBRiBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCBiaC0+Yl9ibG9ja25yLCBiaCk7CisKKwlpZiAoIShwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykpIHsKKwkJcmVpc2VyZnNfcHJpbnRrKCJGSVJTVCBJVEVNX0tFWTogJWssIExBU1QgSVRFTSBLRVk6ICVrXG4iLAorCQkJCSYoaWgtPmloX2tleSksICYoKGloICsgbnIgLSAxKS0+aWhfa2V5KSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChmaXJzdCA8IDAgfHwgZmlyc3QgPiBuciAtIDEpCisJCWZyb20gPSAwOworCWVsc2UKKwkJZnJvbSA9IGZpcnN0OworCisJaWYgKGxhc3QgPCAwIHx8IGxhc3QgPiBucikKKwkJdG8gPSBucjsKKwllbHNlCisJCXRvID0gbGFzdDsKKworCWloICs9IGZyb207CisJcHJpbnRrCisJICAgICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrCisJICAgICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7CisJZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloKyspIHsKKwkJcHJpbnRrCisJCSAgICAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlyZWlzZXJmc19wcmludGsoInwlMmR8ICVoIHxcbiIsIGksIGloKTsKKwkJaWYgKHByaW50X21vZGUgJiBQUklOVF9MRUFGX0lURU1TKQorCQkJb3BfcHJpbnRfaXRlbShpaCwgQl9JX1BJVEVNKGJoLCBpaCkpOworCX0KKworCXByaW50aworCSAgICAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQoreworCWlmIChjb2RlID09IFlVUkFfSEFTSCkKKwkJcmV0dXJuICJydXBhc292IjsKKwlpZiAoY29kZSA9PSBURUFfSEFTSCkKKwkJcmV0dXJuICJ0ZWEiOworCWlmIChjb2RlID09IFI1X0hBU0gpCisJCXJldHVybiAicjUiOworCisJcmV0dXJuICJ1bmtub3duIjsKIH0KIAogLyogcmV0dXJuIDEgaWYgdGhpcyBpcyBub3Qgc3VwZXIgYmxvY2sgKi8KLXN0YXRpYyBpbnQgcHJpbnRfc3VwZXJfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQorc3RhdGljIGludCBwcmludF9zdXBlcl9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKShiaC0+Yl9kYXRhKTsKLSAgICBpbnQgc2tpcHBlZCwgZGF0YV9ibG9ja3M7Ci0gICAgY2hhciAqdmVyc2lvbjsKLSAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9CisJICAgIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKikoYmgtPmJfZGF0YSk7CisJaW50IHNraXBwZWQsIGRhdGFfYmxvY2tzOworCWNoYXIgKnZlcnNpb247CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKLSAgICAgICAgdmVyc2lvbiA9ICIzLjUiOwotICAgIH0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgewotICAgICAgICB2ZXJzaW9uID0gIjMuNiI7Ci0gICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKLSAgICAgIHZlcnNpb24gPSAoKHNiX3ZlcnNpb24ocnMpID09IFJFSVNFUkZTX1ZFUlNJT05fMikgPwotIAkJICIzLjYiIDogIjMuNSIpOyAgCi0gICAgfSBlbHNlIHsKLQlyZXR1cm4gMTsKLSAgICB9CisJaWYgKGlzX3JlaXNlcmZzXzNfNShycykpIHsKKwkJdmVyc2lvbiA9ICIzLjUiOworCX0gZWxzZSBpZiAoaXNfcmVpc2VyZnNfM182KHJzKSkgeworCQl2ZXJzaW9uID0gIjMuNiI7CisJfSBlbHNlIGlmIChpc19yZWlzZXJmc19qcihycykpIHsKKwkJdmVyc2lvbiA9ICgoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8yKSA/CisJCQkgICAiMy42IiA6ICIzLjUiKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9CiAKLSAgICBwcmludGsgKCIlc1wncyBzdXBlciBibG9jayBpcyBpbiBibG9jayAlbGx1XG4iLCBiZGV2bmFtZSAoYmgtPmJfYmRldiwgYiksCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwotICAgIHByaW50ayAoIlJlaXNlcmZzIHZlcnNpb24gJXNcbiIsIHZlcnNpb24gKTsKLSAgICBwcmludGsgKCJCbG9jayBjb3VudCAldVxuIiwgc2JfYmxvY2tfY291bnQocnMpKTsKLSAgICBwcmludGsgKCJCbG9ja3NpemUgJWRcbiIsIHNiX2Jsb2Nrc2l6ZShycykpOwotICAgIHByaW50ayAoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOwotICAgIC8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgotICAgIC8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQorCXByaW50aygiJXNcJ3Mgc3VwZXIgYmxvY2sgaXMgaW4gYmxvY2sgJWxsdVxuIiwgYmRldm5hbWUoYmgtPmJfYmRldiwgYiksCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJcHJpbnRrKCJSZWlzZXJmcyB2ZXJzaW9uICVzXG4iLCB2ZXJzaW9uKTsKKwlwcmludGsoIkJsb2NrIGNvdW50ICV1XG4iLCBzYl9ibG9ja19jb3VudChycykpOworCXByaW50aygiQmxvY2tzaXplICVkXG4iLCBzYl9ibG9ja3NpemUocnMpKTsKKwlwcmludGsoIkZyZWUgYmxvY2tzICV1XG4iLCBzYl9mcmVlX2Jsb2NrcyhycykpOworCS8vIEZJWE1FOiB0aGlzIHdvdWxkIGJlIGNvbmZ1c2luZyBpZgorCS8vIHNvbWVvbmUgc3RvcmVzIHJlaXNlcmZzIHN1cGVyIGJsb2NrIGluIHNvbWUgZGF0YSBibG9jayA7KQogLy8gICAgc2tpcHBlZCA9IChiaC0+Yl9ibG9ja25yICogYmgtPmJfc2l6ZSkgLyBzYl9ibG9ja3NpemUocnMpOwotICAgIHNraXBwZWQgPSBiaC0+Yl9ibG9ja25yOwotICAgIGRhdGFfYmxvY2tzID0gc2JfYmxvY2tfY291bnQocnMpIC0gc2tpcHBlZCAtIDEgLSBzYl9ibWFwX25yKHJzKSAtCi0JICAgICghaXNfcmVpc2VyZnNfanIocnMpID8gc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEgOiBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpIC0JICAgIAotCSAgICBzYl9mcmVlX2Jsb2Nrcyhycyk7Ci0gICAgcHJpbnRrICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCi0JICAgICIxIHN1cGVyIGJsb2NrLCAlZCBkYXRhIGJsb2Nrc1xuIiwgCi0JICAgIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLCAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IChzYl9qcF9qb3VybmFsX3NpemUocnMpICsgMSkgOgotCQkJCSAgICAgIHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLCBkYXRhX2Jsb2Nrcyk7Ci0gICAgcHJpbnRrICgiUm9vdCBibG9jayAldVxuIiwgc2Jfcm9vdF9ibG9jayhycykpOwotICAgIHByaW50ayAoIkpvdXJuYWwgYmxvY2sgKGZpcnN0KSAlZFxuIiwgc2JfanBfam91cm5hbF8xc3RfYmxvY2socnMpKTsKLSAgICBwcmludGsgKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKLSAgICBwcmludGsgKCJKb3VybmFsIG9yaWcgc2l6ZSAlZFxuIiwgc2JfanBfam91cm5hbF9zaXplKHJzKSk7Ci0gICAgcHJpbnRrICgiRlMgc3RhdGUgJWRcbiIsIHNiX2ZzX3N0YXRlKHJzKSk7Ci0gICAgcHJpbnRrICgiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCi0JICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKLSAgICAKLSAgICBwcmludGsgKCJUcmVlIGhlaWdodCAlZFxuIiwgc2JfdHJlZV9oZWlnaHQocnMpKTsKLSAgICByZXR1cm4gMDsKKwlza2lwcGVkID0gYmgtPmJfYmxvY2tucjsKKwlkYXRhX2Jsb2NrcyA9IHNiX2Jsb2NrX2NvdW50KHJzKSAtIHNraXBwZWQgLSAxIC0gc2JfYm1hcF9ucihycykgLQorCSAgICAoIWlzX3JlaXNlcmZzX2pyKHJzKSA/IHNiX2pwX2pvdXJuYWxfc2l6ZShycykgKworCSAgICAgMSA6IHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLSBzYl9mcmVlX2Jsb2Nrcyhycyk7CisJcHJpbnRrCisJICAgICgiQnVzeSBibG9ja3MgKHNraXBwZWQgJWQsIGJpdG1hcHMgLSAlZCwgam91cm5hbCAob3IgcmVzZXJ2ZWQpIGJsb2NrcyAtICVkXG4iCisJICAgICAiMSBzdXBlciBibG9jaywgJWQgZGF0YSBibG9ja3NcbiIsIHNraXBwZWQsIHNiX2JtYXBfbnIocnMpLAorCSAgICAgKCFpc19yZWlzZXJmc19qcihycykgPyAoc2JfanBfam91cm5hbF9zaXplKHJzKSArIDEpIDoKKwkgICAgICBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbChycykpLCBkYXRhX2Jsb2Nrcyk7CisJcHJpbnRrKCJSb290IGJsb2NrICV1XG4iLCBzYl9yb290X2Jsb2NrKHJzKSk7CisJcHJpbnRrKCJKb3VybmFsIGJsb2NrIChmaXJzdCkgJWRcbiIsIHNiX2pwX2pvdXJuYWxfMXN0X2Jsb2NrKHJzKSk7CisJcHJpbnRrKCJKb3VybmFsIGRldiAlZFxuIiwgc2JfanBfam91cm5hbF9kZXYocnMpKTsKKwlwcmludGsoIkpvdXJuYWwgb3JpZyBzaXplICVkXG4iLCBzYl9qcF9qb3VybmFsX3NpemUocnMpKTsKKwlwcmludGsoIkZTIHN0YXRlICVkXG4iLCBzYl9mc19zdGF0ZShycykpOworCXByaW50aygiSGFzaCBmdW5jdGlvbiBcIiVzXCJcbiIsCisJICAgICAgIHJlaXNlcmZzX2hhc2huYW1lKHNiX2hhc2hfZnVuY3Rpb25fY29kZShycykpKTsKKworCXByaW50aygiVHJlZSBoZWlnaHQgJWRcbiIsIHNiX3RyZWVfaGVpZ2h0KHJzKSk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRfZGVzY19ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgaW50IHByaW50X2Rlc2NfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjOwogCi0gICAgaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChiaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCkpCi0JcmV0dXJuIDE7CisJaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljKGJoKSwgSk9VUk5BTF9ERVNDX01BR0lDLCA4KSkKKwkJcmV0dXJuIDE7CiAKLSAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7Ci0gICAgcHJpbnRrICgiRGVzYyBibG9jayAlbGx1IChqX3RyYW5zX2lkICVkLCBqX21vdW50X2lkICVkLCBqX2xlbiAlZCkiLAotCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGdldF9kZXNjX3RyYW5zX2lkIChkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAotCSAgICBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpKTsKKwlkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7CisJcHJpbnRrKCJEZXNjIGJsb2NrICVsbHUgKGpfdHJhbnNfaWQgJWQsIGpfbW91bnRfaWQgJWQsIGpfbGVuICVkKSIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyksCisJICAgICAgIGdldF9kZXNjX21vdW50X2lkKGRlc2MpLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpOwogCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotdm9pZCBwcmludF9ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIC4uLikvL2ludCBwcmludF9tb2RlLCBpbnQgZmlyc3QsIGludCBsYXN0KQordm9pZCBwcmludF9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAuLi4pCS8vaW50IHByaW50X21vZGUsIGludCBmaXJzdCwgaW50IGxhc3QpCiB7Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGludCBtb2RlLCBmaXJzdCwgbGFzdDsKKwl2YV9saXN0IGFyZ3M7CisJaW50IG1vZGUsIGZpcnN0LCBsYXN0OwogCi0gICAgdmFfc3RhcnQgKGFyZ3MsIGJoKTsKKwl2YV9zdGFydChhcmdzLCBiaCk7CiAKLSAgICBpZiAoICEgYmggKSB7Ci0JcHJpbnRrKCJwcmludF9ibG9jazogYnVmZmVyIGlzIE5VTExcbiIpOwotCXJldHVybjsKLSAgICB9CisJaWYgKCFiaCkgeworCQlwcmludGsoInByaW50X2Jsb2NrOiBidWZmZXIgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CiAKLSAgICBtb2RlID0gdmFfYXJnIChhcmdzLCBpbnQpOwotICAgIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBpbnQpOwotICAgIGxhc3QgPSB2YV9hcmcgKGFyZ3MsIGludCk7Ci0gICAgaWYgKHByaW50X2xlYWYgKGJoLCBtb2RlLCBmaXJzdCwgbGFzdCkpCi0JaWYgKHByaW50X2ludGVybmFsIChiaCwgZmlyc3QsIGxhc3QpKQotCSAgICBpZiAocHJpbnRfc3VwZXJfYmxvY2sgKGJoKSkKLQkJaWYgKHByaW50X2Rlc2NfYmxvY2sgKGJoKSkKLQkJICAgIHByaW50ayAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwltb2RlID0gdmFfYXJnKGFyZ3MsIGludCk7CisJZmlyc3QgPSB2YV9hcmcoYXJncywgaW50KTsKKwlsYXN0ID0gdmFfYXJnKGFyZ3MsIGludCk7CisJaWYgKHByaW50X2xlYWYoYmgsIG1vZGUsIGZpcnN0LCBsYXN0KSkKKwkJaWYgKHByaW50X2ludGVybmFsKGJoLCBmaXJzdCwgbGFzdCkpCisJCQlpZiAocHJpbnRfc3VwZXJfYmxvY2soYmgpKQorCQkJCWlmIChwcmludF9kZXNjX2Jsb2NrKGJoKSkKKwkJCQkJcHJpbnRrCisJCQkJCSAgICAoIkJsb2NrICVsbHUgY29udGFpbnMgdW5mb3JtYXR0ZWQgZGF0YVxuIiwKKwkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOwogfQogCi0KLQogc3RhdGljIGNoYXIgcHJpbnRfdGJfYnVmWzIwNDhdOwogCiAvKiB0aGlzIHN0b3JlcyBpbml0aWFsIHN0YXRlIG9mIHRyZWUgYmFsYW5jZSBpbiB0aGUgcHJpbnRfdGJfYnVmICovCi12b2lkIHN0b3JlX3ByaW50X3RiIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit2b2lkIHN0b3JlX3ByaW50X3RiKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiKQogewotICAgIGludCBoID0gMDsKLSAgICBpbnQgaTsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlNoLCAqIHRiRmg7CisJaW50IGggPSAwOworCWludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJTaCwgKnRiRmg7CiAKLSAgICBpZiAoIXRiKQotCXJldHVybjsKKwlpZiAoIXRiKQorCQlyZXR1cm47CiAKLSAgICBzcHJpbnRmIChwcmludF90Yl9idWYsICJcbiIKLQkgICAgICJCQUxBTkNJTkcgJWRcbiIKLQkgICAgICJNT0RFPSVjLCBJVEVNX1BPUz0lZCBQT1NfSU5fSVRFTT0lZFxuIiAKLQkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkgICAgICIqIGggKiAgICBTICAgICogICAgTCAgICAqICAgIFIgICAgKiAgIEYgICAqICAgRkwgICogICBGUiAgKiAgQ0ZMICAqICBDRlIgICpcbiIsCi0JICAgICBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UsCi0JICAgICB0Yi0+dGJfbW9kZSwgUEFUSF9MQVNUX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCksIHRiLT50Yl9wYXRoLT5wb3NfaW5faXRlbSk7Ci0gIAotICAgIGZvciAoaCA9IDA7IGggPCBzaXplb2YodGItPmluc2VydF9zaXplKSAvIHNpemVvZiAodGItPmluc2VydF9zaXplWzBdKTsgaCArKykgewotCWlmIChQQVRIX0hfUEFUSF9PRkZTRVQgKHRiLT50Yl9wYXRoLCBoKSA8PSB0Yi0+dGJfcGF0aC0+cGF0aF9sZW5ndGggJiYgCi0JICAgIFBBVEhfSF9QQVRIX09GRlNFVCAodGItPnRiX3BhdGgsIGgpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7Ci0JICAgIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOwotCSAgICB0YkZoID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKLQl9IGVsc2UgewotCSAgICB0YlNoID0gTlVMTDsKLQkgICAgdGJGaCA9IE5VTEw7CisJc3ByaW50ZihwcmludF90Yl9idWYsICJcbiIKKwkJIkJBTEFOQ0lORyAlZFxuIgorCQkiTU9ERT0lYywgSVRFTV9QT1M9JWQgUE9TX0lOX0lURU09JWRcbiIKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkiKiBoICogICAgUyAgICAqICAgIEwgICAgKiAgICBSICAgICogICBGICAgKiAgIEZMICAqICAgRlIgICogIENGTCAgKiAgQ0ZSICAqXG4iLAorCQlSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX2RvX2JhbGFuY2UsCisJCXRiLT50Yl9tb2RlLCBQQVRIX0xBU1RfUE9TSVRJT04odGItPnRiX3BhdGgpLAorCQl0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW0pOworCisJZm9yIChoID0gMDsgaCA8IHNpemVvZih0Yi0+aW5zZXJ0X3NpemUpIC8gc2l6ZW9mKHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJICAgICBoKyspIHsKKwkJaWYgKFBBVEhfSF9QQVRIX09GRlNFVCh0Yi0+dGJfcGF0aCwgaCkgPD0KKwkJICAgIHRiLT50Yl9wYXRoLT5wYXRoX2xlbmd0aAorCQkgICAgJiYgUEFUSF9IX1BBVEhfT0ZGU0VUKHRiLT50Yl9wYXRoLAorCQkJCQkgIGgpID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisJCQl0YlNoID0gUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpOworCQkJdGJGaCA9IFBBVEhfSF9QUEFSRU5UKHRiLT50Yl9wYXRoLCBoKTsKKwkJfSBlbHNlIHsKKwkJCXRiU2ggPSBOVUxMOworCQkJdGJGaCA9IE5VTEw7CisJCX0KKwkJc3ByaW50ZihwcmludF90Yl9idWYgKyBzdHJsZW4ocHJpbnRfdGJfYnVmKSwKKwkJCSIqICVkICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqXG4iLAorCQkJaCwKKwkJCSh0YlNoKSA/IChsb25nIGxvbmcpKHRiU2gtPmJfYmxvY2tucikgOiAoLTFMTCksCisJCQkodGJTaCkgPyBhdG9taWNfcmVhZCgmKHRiU2gtPmJfY291bnQpKSA6IC0xLAorCQkJKHRiLT5MW2hdKSA/IChsb25nIGxvbmcpKHRiLT5MW2hdLT5iX2Jsb2NrbnIpIDogKC0xTEwpLAorCQkJKHRiLT5MW2hdKSA/IGF0b21pY19yZWFkKCYodGItPkxbaF0tPmJfY291bnQpKSA6IC0xLAorCQkJKHRiLT5SW2hdKSA/IChsb25nIGxvbmcpKHRiLT5SW2hdLT5iX2Jsb2NrbnIpIDogKC0xTEwpLAorCQkJKHRiLT5SW2hdKSA/IGF0b21pY19yZWFkKCYodGItPlJbaF0tPmJfY291bnQpKSA6IC0xLAorCQkJKHRiRmgpID8gKGxvbmcgbG9uZykodGJGaC0+Yl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+RkxbaF0pID8gKGxvbmcgbG9uZykodGItPkZMW2hdLT4KKwkJCQkJCSAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+RlJbaF0pID8gKGxvbmcgbG9uZykodGItPkZSW2hdLT4KKwkJCQkJCSAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+Q0ZMW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRkxbaF0tPgorCQkJCQkJICAgYl9ibG9ja25yKSA6ICgtMUxMKSwKKwkJCSh0Yi0+Q0ZSW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRlJbaF0tPgorCQkJCQkJICAgYl9ibG9ja25yKSA6ICgtMUxMKSk7CiAJfQotCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKLQkJICIqICVkICogJTNsbGQoJTJkKSAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqXG4iLAotCQkgaCwgCi0JCSAodGJTaCkgPyAobG9uZyBsb25nKSh0YlNoLT5iX2Jsb2NrbnIpOigtMUxMKSwKLQkJICh0YlNoKSA/IGF0b21pY19yZWFkICgmKHRiU2gtPmJfY291bnQpKSA6IC0xLAotCQkgKHRiLT5MW2hdKSA/IChsb25nIGxvbmcpKHRiLT5MW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKLQkJICh0Yi0+TFtoXSkgPyBhdG9taWNfcmVhZCAoJih0Yi0+TFtoXS0+Yl9jb3VudCkpIDogLTEsCi0JCSAodGItPlJbaF0pID8gKGxvbmcgbG9uZykodGItPlJbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5SW2hdKSA/IGF0b21pY19yZWFkICgmKHRiLT5SW2hdLT5iX2NvdW50KSkgOiAtMSwKLQkJICh0YkZoKSA/IChsb25nIGxvbmcpKHRiRmgtPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5GTFtoXSkgPyAobG9uZyBsb25nKSh0Yi0+RkxbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5GUltoXSkgPyAobG9uZyBsb25nKSh0Yi0+RlJbaF0tPmJfYmxvY2tucik6KC0xTEwpLAotCQkgKHRiLT5DRkxbaF0pID8gKGxvbmcgbG9uZykodGItPkNGTFtoXS0+Yl9ibG9ja25yKTooLTFMTCksCi0JCSAodGItPkNGUltoXSkgPyAobG9uZyBsb25nKSh0Yi0+Q0ZSW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSk7Ci0gICAgfQogCi0gICAgc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLCAKLQkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKLQkgICAgICIqIGggKiBzaXplICogbG4gKiBsYiAqIHJuICogcmIgKiBibGtuICogczAgKiBzMSAqIHMxYiAqIHMyICogczJiICogY3VyYiAqIGxrICogcmsgKlxuIgotCSAgICAgIiogMCAqICU0ZCAqICUyZCAqICUyZCAqICUyZCAqICUyZCAqICU0ZCAqICUyZCAqICUyZCAqICUzZCAqICUyZCAqICUzZCAqICU0ZCAqICUyZCAqICUyZCAqXG4iLAotCSAgICAgdGItPmluc2VydF9zaXplWzBdLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcywgdGItPnJudW1bMF0sdGItPnJieXRlcywgdGItPmJsa251bVswXSwgCi0JICAgICB0Yi0+czBudW0sIHRiLT5zMW51bSx0Yi0+czFieXRlcywgIHRiLT5zMm51bSwgdGItPnMyYnl0ZXMsIHRiLT5jdXJfYmxrbnVtLCB0Yi0+bGtleVswXSwgdGItPnJrZXlbMF0pOworCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJIiogaCAqIHNpemUgKiBsbiAqIGxiICogcm4gKiByYiAqIGJsa24gKiBzMCAqIHMxICogczFiICogczIgKiBzMmIgKiBjdXJiICogbGsgKiByayAqXG4iCisJCSIqIDAgKiAlNGQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlNGQgKiAlMmQgKiAlMmQgKiAlM2QgKiAlMmQgKiAlM2QgKiAlNGQgKiAlMmQgKiAlMmQgKlxuIiwKKwkJdGItPmluc2VydF9zaXplWzBdLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcywgdGItPnJudW1bMF0sCisJCXRiLT5yYnl0ZXMsIHRiLT5ibGtudW1bMF0sIHRiLT5zMG51bSwgdGItPnMxbnVtLCB0Yi0+czFieXRlcywKKwkJdGItPnMybnVtLCB0Yi0+czJieXRlcywgdGItPmN1cl9ibGtudW0sIHRiLT5sa2V5WzBdLAorCQl0Yi0+cmtleVswXSk7CiAKLSAgICAvKiB0aGlzIHByaW50cyBiYWxhbmNlIHBhcmFtZXRlcnMgZm9yIG5vbi1sZWFmIGxldmVscyAqLwotICAgIGggPSAwOwotICAgIGRvIHsKLQloKys7Ci0Jc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLAotCQkgIiogJWQgKiAlNGQgKiAlMmQgKiAgICAqICUyZCAqICAgICogJTJkICpcbiIsCi0JCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLCB0Yi0+YmxrbnVtW2hdKTsKLSAgICB9IHdoaWxlICh0Yi0+aW5zZXJ0X3NpemVbaF0pOworCS8qIHRoaXMgcHJpbnRzIGJhbGFuY2UgcGFyYW1ldGVycyBmb3Igbm9uLWxlYWYgbGV2ZWxzICovCisJaCA9IDA7CisJZG8geworCQloKys7CisJCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCQkiKiAlZCAqICU0ZCAqICUyZCAqICAgICogJTJkICogICAgKiAlMmQgKlxuIiwKKwkJCWgsIHRiLT5pbnNlcnRfc2l6ZVtoXSwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLAorCQkJdGItPmJsa251bVtoXSk7CisJfSB3aGlsZSAodGItPmluc2VydF9zaXplW2hdKTsKIAotICAgIHNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwgCi0JICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCi0JICAgICAiRkVCIGxpc3Q6ICIpOworCXNwcmludGYocHJpbnRfdGJfYnVmICsgc3RybGVuKHByaW50X3RiX2J1ZiksCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKKwkJIkZFQiBsaXN0OiAiKTsKIAotICAgIC8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCi0gICAgaCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPkZFQikgLyBzaXplb2YgKHRiLT5GRUJbMF0pOyBpICsrKQotCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKLQkJICIlcCAoJWxsdSAlZCklcyIsIHRiLT5GRUJbaV0sIHRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPmJfYmxvY2tuciA6IDBVTEwsCi0JCSB0Yi0+RkVCW2ldID8gYXRvbWljX3JlYWQgKCYodGItPkZFQltpXS0+Yl9jb3VudCkpIDogMCwgCi0JCSAoaSA9PSBzaXplb2YgKHRiLT5GRUIpIC8gc2l6ZW9mICh0Yi0+RkVCWzBdKSAtIDEpID8gIlxuIiA6ICIsICIpOworCS8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCisJaCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZih0Yi0+RkVCKSAvIHNpemVvZih0Yi0+RkVCWzBdKTsgaSsrKQorCQlzcHJpbnRmKHByaW50X3RiX2J1ZiArIHN0cmxlbihwcmludF90Yl9idWYpLAorCQkJIiVwICglbGx1ICVkKSVzIiwgdGItPkZFQltpXSwKKwkJCXRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPgorCQkJYl9ibG9ja25yIDogMFVMTCwKKwkJCXRiLT5GRUJbaV0gPyBhdG9taWNfcmVhZCgmKHRiLT5GRUJbaV0tPmJfY291bnQpKSA6IDAsCisJCQkoaSA9PQorCQkJIHNpemVvZih0Yi0+RkVCKSAvIHNpemVvZih0Yi0+RkVCWzBdKSAtCisJCQkgMSkgPyAiXG4iIDogIiwgIik7CiAKLSAgICBzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksIAotCSAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PSB0aGUgZW5kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJc3ByaW50ZihwcmludF90Yl9idWYgKyBzdHJsZW4ocHJpbnRfdGJfYnVmKSwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PSB0aGUgZW5kID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiB9CiAKLXZvaWQgcHJpbnRfY3VyX3RiIChjaGFyICogbWVzKQordm9pZCBwcmludF9jdXJfdGIoY2hhciAqbWVzKQogewotICAgIHByaW50ayAoIiVzXG4lcyIsIG1lcywgcHJpbnRfdGJfYnVmKTsKKwlwcmludGsoIiVzXG4lcyIsIG1lcywgcHJpbnRfdGJfYnVmKTsKIH0KIAotc3RhdGljIHZvaWQgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3N0YXRpYyB2b2lkIGNoZWNrX2xlYWZfYmxvY2tfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQogewotICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7Ci0gIGludCBucjsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlpbnQgbnI7CiAKLSAgYmxraCA9IEJfQkxLX0hFQUQgKGJoKTsKLSAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7Ci0gIGlmICggbnIgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQotICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAxMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGl0ZW0gbnVtYmVyICV6IiwgYmgpOwotICBpZiAoIGJsa2hfZnJlZV9zcGFjZShibGtoKSA+IAotICAgICAgYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUgKiBuciApCi0gICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJ2cy02MDIwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsIGJoKTsKLSAgICAKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCi17Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIAotICAgIGJsa2ggPSBCX0JMS19IRUFEIChiaCk7Ci0gICAgaWYgKCEoQl9MRVZFTCAoYmgpID4gRElTS19MRUFGX05PREVfTEVWRUwgJiYgQl9MRVZFTCAoYmgpIDw9IE1BWF9IRUlHSFQpKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAyNTogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBsZXZlbCAleiIsIGJoKTsKLQotICAgIGlmIChCX05SX0lURU1TIChiaCkgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAzMDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsIGJoKTsKLQotICAgIGlmIChCX0ZSRUVfU1BBQ0UgKGJoKSAhPSAKLQliaC0+Yl9zaXplIC0gQkxLSF9TSVpFIC0gS0VZX1NJWkUgKiBCX05SX0lURU1TIChiaCkgLSBEQ19TSVpFICogKEJfTlJfSVRFTVMgKGJoKSArIDEpKQotCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjA0MDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBmcmVlIHNwYWNlICV6IiwgYmgpOworCWJsa2ggPSBCX0JMS19IRUFEKGJoKTsKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlpZiAobnIgPiAoYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSkgLyBJSF9TSVpFKQorCQlyZWlzZXJmc19wYW5pYyhOVUxMLAorCQkJICAgICAgICJ2cy02MDEwOiBjaGVja19sZWFmX2Jsb2NrX2hlYWQ6IGludmFsaWQgaXRlbSBudW1iZXIgJXoiLAorCQkJICAgICAgIGJoKTsKKwlpZiAoYmxraF9mcmVlX3NwYWNlKGJsa2gpID4gYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUgKiBucikKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAyMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGZyZWUgc3BhY2UgJXoiLAorCQkJICAgICAgIGJoKTsKIAogfQogCi0KLXZvaWQgY2hlY2tfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ibG9ja19oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCXN0cnVjdCBibG9ja19oZWFkICpibGtoOwogCi0gICAgaWYgKCFiaCkKLQlyZXR1cm47Ci0gICAgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChiaCk7Ci0gICAgZm9yIChpID0gMCwgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyAoYmgpOyBpICsrLCBpaCArKykKLQlvcF9jaGVja19pdGVtIChpaCwgQl9JX1BJVEVNIChiaCwgaWgpKTsKKwlibGtoID0gQl9CTEtfSEVBRChiaCk7CisJaWYgKCEoQl9MRVZFTChiaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCAmJiBCX0xFVkVMKGJoKSA8PSBNQVhfSEVJR0hUKSkKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAyNTogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBsZXZlbCAleiIsCisJCQkgICAgICAgYmgpOworCisJaWYgKEJfTlJfSVRFTVMoYmgpID4gKGJoLT5iX3NpemUgLSBCTEtIX1NJWkUpIC8gSUhfU0laRSkKKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAidnMtNjAzMDogY2hlY2tfaW50ZXJuYWxfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsCisJCQkgICAgICAgYmgpOworCisJaWYgKEJfRlJFRV9TUEFDRShiaCkgIT0KKwkgICAgYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIEtFWV9TSVpFICogQl9OUl9JVEVNUyhiaCkgLQorCSAgICBEQ19TSVpFICogKEJfTlJfSVRFTVMoYmgpICsgMSkpCisJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkgICAgICAgInZzLTYwNDA6IGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsCisJCQkgICAgICAgYmgpOworCiB9CiAKLQotdm9pZCBjaGVja19pbnRlcm5hbCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit2b2lkIGNoZWNrX2xlYWYoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLSAgaWYgKCFiaCkKLSAgICByZXR1cm47Ci0gIGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQgKGJoKTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKKworCWlmICghYmgpCisJCXJldHVybjsKKwljaGVja19sZWFmX2Jsb2NrX2hlYWQoYmgpOworCWZvciAoaSA9IDAsIGloID0gQl9OX1BJVEVNX0hFQUQoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyhiaCk7IGkrKywgaWgrKykKKwkJb3BfY2hlY2tfaXRlbShpaCwgQl9JX1BJVEVNKGJoLCBpaCkpOwogfQogCit2b2lkIGNoZWNrX2ludGVybmFsKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFiaCkKKwkJcmV0dXJuOworCWNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQoYmgpOworfQogCi12b2lkIHByaW50X3N0YXRpc3RpY3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit2b2lkIHByaW50X3N0YXRpc3RpY3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCi0gIC8qCi0gIHByaW50ayAoInJlaXNlcmZzX3B1dF9zdXBlcjogc2Vzc2lvbiBzdGF0aXN0aWNzOiBiYWxhbmNlcyAlZCwgZml4X25vZGVzICVkLCBcCi1ibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAotCSAgUkVJU0VSRlNfU0IocyktPnNfZG9fYmFsYW5jZSwgUkVJU0VSRlNfU0IocyktPnNfZml4X25vZGVzLAotCSAgUkVJU0VSRlNfU0IocyktPnNfYm1hcHMsIFJFSVNFUkZTX1NCKHMpLT5zX2JtYXBzX3dpdGhvdXRfc2VhcmNoLAotCSAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOwotICAqLworCS8qCisJICAgcHJpbnRrICgicmVpc2VyZnNfcHV0X3N1cGVyOiBzZXNzaW9uIHN0YXRpc3RpY3M6IGJhbGFuY2VzICVkLCBmaXhfbm9kZXMgJWQsIFwKKwkgICBibWFwIHdpdGggc2VhcmNoICVkLCB3aXRob3V0ICVkLCBkaXIyaW5kICVkLCBpbmQyZGlyICVkXG4iLAorCSAgIFJFSVNFUkZTX1NCKHMpLT5zX2RvX2JhbGFuY2UsIFJFSVNFUkZTX1NCKHMpLT5zX2ZpeF9ub2RlcywKKwkgICBSRUlTRVJGU19TQihzKS0+c19ibWFwcywgUkVJU0VSRlNfU0IocyktPnNfYm1hcHNfd2l0aG91dF9zZWFyY2gsCisJICAgUkVJU0VSRlNfU0IocyktPnNfZGlyZWN0MmluZGlyZWN0LCBSRUlTRVJGU19TQihzKS0+c19pbmRpcmVjdDJkaXJlY3QpOworCSAqLwogCiB9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9wcm9jZnMuYyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCmluZGV4IGUyNDJlYmMuLmZjMmY0M2MgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCisrKyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCkBAIC0zMywyOCArMzMsMjcgQEAKIHN0YXRpYyBpbnQgc2hvd192ZXJzaW9uKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAljaGFyICpmb3JtYXQ7Ci0gICAgCi0JaWYgKCBSRUlTRVJGU19TQihzYiktPnNfcHJvcGVydGllcyAmICgxIDw8IFJFSVNFUkZTXzNfNikgKSB7CisKKwlpZiAoUkVJU0VSRlNfU0Ioc2IpLT5zX3Byb3BlcnRpZXMgJiAoMSA8PCBSRUlTRVJGU18zXzYpKSB7CiAJCWZvcm1hdCA9ICIzLjYiOwotCX0gZWxzZSBpZiAoIFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSApIHsKKwl9IGVsc2UgaWYgKFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSkgewogCQlmb3JtYXQgPSAiMy41IjsKIAl9IGVsc2UgewogCQlmb3JtYXQgPSAidW5rbm93biI7CiAJfQogCi0Jc2VxX3ByaW50ZihtLCAiJXMgZm9ybWF0XHR3aXRoIGNoZWNrcyAlc1xuIiwKLQkJCWZvcm1hdCwKKwlzZXFfcHJpbnRmKG0sICIlcyBmb3JtYXRcdHdpdGggY2hlY2tzICVzXG4iLCBmb3JtYXQsCiAjaWYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX0NIRUNLICkKLQkJCSJvbiIKKwkJICAgIm9uIgogI2Vsc2UKLQkJCSJvZmYiCisJCSAgICJvZmYiCiAjZW5kaWYKLQkJKTsKKwkgICAgKTsKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MoIGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCi0JCQkJICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhICkKK2ludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCiB7CiAJKnN0YXJ0ID0gYnVmZmVyOwogCSplb2YgPSAxOwpAQCAtNzksODcgKzc4LDY4IEBACiAKICNkZWZpbmUgREpGKCB4ICkgbGUzMl90b19jcHUoIHJzIC0+IHggKQogI2RlZmluZSBESlYoIHggKSBsZTMyX3RvX2NwdSggc192MSAtPiB4ICkKLSNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKSAKKyNkZWZpbmUgREpQKCB4ICkgbGUzMl90b19jcHUoIGpwIC0+IHggKQogI2RlZmluZSBKRiggeCApICggciAtPiBzX2pvdXJuYWwgLT4geCApCiAKIHN0YXRpYyBpbnQgc2hvd19zdXBlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7Ci0gICAgCi0Jc2VxX3ByaW50ZihtLAkic3RhdGU6IFx0JXNcbiIKLQkJCSJtb3VudCBvcHRpb25zOiBcdCVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIKLQkJCSJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKLQkJCSJzX2ttYWxsb2NzOiBcdCVpXG4iCi0JCQkic19kaXNrX3JlYWRzOiBcdCVpXG4iCi0JCQkic19kaXNrX3dyaXRlczogXHQlaVxuIgotCQkJInNfZml4X25vZGVzOiBcdCVpXG4iCi0JCQkic19kb19iYWxhbmNlOiBcdCVpXG4iCi0JCQkic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCi0JCQkic19nb29kX3NlYXJjaF9ieV9rZXlfcmVhZGE6IFx0JWlcbiIKLQkJCSJzX2JtYXBzOiBcdCVpXG4iCi0JCQkic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgotCQkJInNfZGlyZWN0MmluZGlyZWN0OiBcdCVpXG4iCi0JCQkic19pbmRpcmVjdDJkaXJlY3Q6IFx0JWlcbiIKLQkJCSJcbiIKLQkJCSJtYXhfaGFzaF9jb2xsaXNpb25zOiBcdCVpXG4iCiAKLQkJCSJicmVhZHM6IFx0JWx1XG4iCi0JCQkiYnJlYWRfbWlzc2VzOiBcdCVsdVxuIgotCi0JCQkic2VhcmNoX2J5X2tleTogXHQlbHVcbiIKLQkJCSJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCi0JCQkic2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkKLQkJCSJpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkicGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKLQkJCSJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKLQkJCSJkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCi0JCQkiZGVsZXRlX2l0ZW1fcmVzdGFydGVkOiBcdCVsdVxuIgotCi0JCQkibGVha2VkX29pZDogXHQlbHVcbiIKLQkJCSJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKLQotCQkJU0YoIHNfbW91bnRfc3RhdGUgKSA9PSBSRUlTRVJGU19WQUxJRF9GUyA/Ci0JCQkiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKLQkJCXJlaXNlcmZzX3I1X2hhc2goIHNiICkgPyAiRk9SQ0VfUjUgIiA6ICIiLAotCQkJcmVpc2VyZnNfcnVwYXNvdl9oYXNoKCBzYiApID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAotCQkJcmVpc2VyZnNfdGVhX2hhc2goIHNiICkgPyAiRk9SQ0VfVEVBICIgOiAiIiwKLQkJCXJlaXNlcmZzX2hhc2hfZGV0ZWN0KCBzYiApID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKLQkJCXJlaXNlcmZzX25vX2JvcmRlciggc2IgKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKLQkJCXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24oIHNiICkgPyAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCi0JCQlyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbiggc2IgKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKLQkJCXJlaXNlcmZzX3Rlc3Q0KCBzYiApID8gIlRFU1Q0ICIgOiAiIiwKLQkJCWhhdmVfbGFyZ2VfdGFpbHMoIHNiICkgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpPyJTTUFMTF9UQUlMUyAiOiJOT19UQUlMUyAiLAotCQkJcmVwbGF5X29ubHkoIHNiICkgPyAiUkVQTEFZX09OTFkgIiA6ICIiLAotCQkJY29udmVydF9yZWlzZXJmcyggc2IgKSA/ICJDT05WICIgOiAiIiwKLQotCQkJYXRvbWljX3JlYWQoICZyIC0+IHNfZ2VuZXJhdGlvbl9jb3VudGVyICksCi0JCQlTRiggc19rbWFsbG9jcyApLAotCQkJU0YoIHNfZGlza19yZWFkcyApLAotCQkJU0YoIHNfZGlza193cml0ZXMgKSwKLQkJCVNGKCBzX2ZpeF9ub2RlcyApLAotCQkJU0YoIHNfZG9fYmFsYW5jZSApLAotCQkJU0YoIHNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvciApLAotCQkJU0YoIHNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhICksCi0JCQlTRiggc19ibWFwcyApLAotCQkJU0YoIHNfYm1hcHNfd2l0aG91dF9zZWFyY2ggKSwKLQkJCVNGKCBzX2RpcmVjdDJpbmRpcmVjdCApLAotCQkJU0YoIHNfaW5kaXJlY3QyZGlyZWN0ICksCi0JCQlTRlAoIG1heF9oYXNoX2NvbGxpc2lvbnMgKSwKLQkJCVNGUCggYnJlYWRzICksCi0JCQlTRlAoIGJyZWFkX21pc3MgKSwKLQkJCVNGUCggc2VhcmNoX2J5X2tleSApLAotCQkJU0ZQKCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQgKSwKLQkJCVNGUCggc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKSwKLQotCQkJU0ZQKCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQgKSwKLQkJCVNGUCggcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZCApLAotCQkJU0ZQKCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZCApLAotCQkJU0ZQKCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQgKSwKLQkJCVNGUCggZGVsZXRlX2l0ZW1fcmVzdGFydGVkICksCi0KLQkJCVNGUCggbGVha2VkX29pZCApLAotCQkJU0ZQKCBsZWF2ZXNfcmVtb3ZhYmxlICkgKTsKKwlzZXFfcHJpbnRmKG0sICJzdGF0ZTogXHQlc1xuIgorCQkgICAibW91bnQgb3B0aW9uczogXHQlcyVzJXMlcyVzJXMlcyVzJXMlcyVzXG4iCisJCSAgICJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKKwkJICAgInNfa21hbGxvY3M6IFx0JWlcbiIKKwkJICAgInNfZGlza19yZWFkczogXHQlaVxuIgorCQkgICAic19kaXNrX3dyaXRlczogXHQlaVxuIgorCQkgICAic19maXhfbm9kZXM6IFx0JWlcbiIKKwkJICAgInNfZG9fYmFsYW5jZTogXHQlaVxuIgorCQkgICAic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCisJCSAgICJzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYTogXHQlaVxuIgorCQkgICAic19ibWFwczogXHQlaVxuIgorCQkgICAic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgorCQkgICAic19kaXJlY3QyaW5kaXJlY3Q6IFx0JWlcbiIKKwkJICAgInNfaW5kaXJlY3QyZGlyZWN0OiBcdCVpXG4iCisJCSAgICJcbiIKKwkJICAgIm1heF9oYXNoX2NvbGxpc2lvbnM6IFx0JWlcbiIKKwkJICAgImJyZWFkczogXHQlbHVcbiIKKwkJICAgImJyZWFkX21pc3NlczogXHQlbHVcbiIKKwkJICAgInNlYXJjaF9ieV9rZXk6IFx0JWx1XG4iCisJCSAgICJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCisJCSAgICJzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImluc2VydF9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgInBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCSAgICJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImRlbGV0ZV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJICAgImxlYWtlZF9vaWQ6IFx0JWx1XG4iCisJCSAgICJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKKwkJICAgU0Yoc19tb3VudF9zdGF0ZSkgPT0gUkVJU0VSRlNfVkFMSURfRlMgPworCQkgICAiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKKwkJICAgcmVpc2VyZnNfcjVfaGFzaChzYikgPyAiRk9SQ0VfUjUgIiA6ICIiLAorCQkgICByZWlzZXJmc19ydXBhc292X2hhc2goc2IpID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAorCQkgICByZWlzZXJmc190ZWFfaGFzaChzYikgPyAiRk9SQ0VfVEVBICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfaGFzaF9kZXRlY3Qoc2IpID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfbm9fYm9yZGVyKHNiKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKKwkJICAgcmVpc2VyZnNfbm9fdW5oYXNoZWRfcmVsb2NhdGlvbihzYikgPworCQkgICAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCisJCSAgIHJlaXNlcmZzX2hhc2hlZF9yZWxvY2F0aW9uKHNiKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKKwkJICAgcmVpc2VyZnNfdGVzdDQoc2IpID8gIlRFU1Q0ICIgOiAiIiwKKwkJICAgaGF2ZV9sYXJnZV90YWlscyhzYikgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpID8KKwkJICAgIlNNQUxMX1RBSUxTICIgOiAiTk9fVEFJTFMgIiwKKwkJICAgcmVwbGF5X29ubHkoc2IpID8gIlJFUExBWV9PTkxZICIgOiAiIiwKKwkJICAgY29udmVydF9yZWlzZXJmcyhzYikgPyAiQ09OViAiIDogIiIsCisJCSAgIGF0b21pY19yZWFkKCZyLT5zX2dlbmVyYXRpb25fY291bnRlciksIFNGKHNfa21hbGxvY3MpLAorCQkgICBTRihzX2Rpc2tfcmVhZHMpLCBTRihzX2Rpc2tfd3JpdGVzKSwgU0Yoc19maXhfbm9kZXMpLAorCQkgICBTRihzX2RvX2JhbGFuY2UpLCBTRihzX3VubmVlZGVkX2xlZnRfbmVpZ2hib3IpLAorCQkgICBTRihzX2dvb2Rfc2VhcmNoX2J5X2tleV9yZWFkYSksIFNGKHNfYm1hcHMpLAorCQkgICBTRihzX2JtYXBzX3dpdGhvdXRfc2VhcmNoKSwgU0Yoc19kaXJlY3QyaW5kaXJlY3QpLAorCQkgICBTRihzX2luZGlyZWN0MmRpcmVjdCksIFNGUChtYXhfaGFzaF9jb2xsaXNpb25zKSwgU0ZQKGJyZWFkcyksCisJCSAgIFNGUChicmVhZF9taXNzKSwgU0ZQKHNlYXJjaF9ieV9rZXkpLAorCQkgICBTRlAoc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkKSwgU0ZQKHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkKSwKKwkJICAgU0ZQKGluc2VydF9pdGVtX3Jlc3RhcnRlZCksIFNGUChwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkKSwKKwkJICAgU0ZQKGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkKSwKKwkJICAgU0ZQKGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZCksIFNGUChkZWxldGVfaXRlbV9yZXN0YXJ0ZWQpLAorCQkgICBTRlAobGVha2VkX29pZCksIFNGUChsZWF2ZXNfcmVtb3ZhYmxlKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE2OSw2MSArMTQ5LDU1IEBACiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CiAJaW50IGxldmVsOwogCi0Jc2VxX3ByaW50ZihtLAkibGV2ZWxcdCIKLQkJCSIgICAgIGJhbGFuY2VzIgotCQkJIiBbc2JrOiAgcmVhZHMiCi0JCQkiICAgZnNfY2hhbmdlZCIKLQkJCSIgICByZXN0YXJ0ZWRdIgotCQkJIiAgIGZyZWUgc3BhY2UiCi0JCQkiICAgICAgICBpdGVtcyIKLQkJCSIgICBjYW5fcmVtb3ZlIgotCQkJIiAgICAgICAgIGxudW0iCi0JCQkiICAgICAgICAgcm51bSIKLQkJCSIgICAgICAgbGJ5dGVzIgotCQkJIiAgICAgICByYnl0ZXMiCi0JCQkiICAgICBnZXRfbmVpZyIKLQkJCSIgZ2V0X25laWdfcmVzIgotCQkJIiAgbmVlZF9sX25laWciCi0JCQkiICBuZWVkX3JfbmVpZyIKLQkJCSJcbiIKLQkJCQotCQkpOworCXNlcV9wcmludGYobSwgImxldmVsXHQiCisJCSAgICIgICAgIGJhbGFuY2VzIgorCQkgICAiIFtzYms6ICByZWFkcyIKKwkJICAgIiAgIGZzX2NoYW5nZWQiCisJCSAgICIgICByZXN0YXJ0ZWRdIgorCQkgICAiICAgZnJlZSBzcGFjZSIKKwkJICAgIiAgICAgICAgaXRlbXMiCisJCSAgICIgICBjYW5fcmVtb3ZlIgorCQkgICAiICAgICAgICAgbG51bSIKKwkJICAgIiAgICAgICAgIHJudW0iCisJCSAgICIgICAgICAgbGJ5dGVzIgorCQkgICAiICAgICAgIHJieXRlcyIKKwkJICAgIiAgICAgZ2V0X25laWciCisJCSAgICIgZ2V0X25laWdfcmVzIiAiICBuZWVkX2xfbmVpZyIgIiAgbmVlZF9yX25laWciICJcbiIpOwogCi0JZm9yKCBsZXZlbCA9IDAgOyBsZXZlbCA8IE1BWF9IRUlHSFQgOyArKyBsZXZlbCApIHsKLQkJc2VxX3ByaW50ZihtLAkiJWlcdCIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybGkiCi0JCQkJIiAlMTJsaSIKLQkJCQkiICUxMmxpIgotCQkJCSIgJTEybGkiCi0JCQkJIiAlMTJsdSIKLQkJCQkiICUxMmx1IgotCQkJCSIgJTEybHUiCi0JCQkJIiAlMTJsdSIKLQkJCQkiXG4iLAotCQkJCWxldmVsLCAKLQkJCQlTRlBMKCBiYWxhbmNlX2F0ICksCi0JCQkJU0ZQTCggc2JrX3JlYWRfYXQgKSwKLQkJCQlTRlBMKCBzYmtfZnNfY2hhbmdlZCApLAotCQkJCVNGUEwoIHNia19yZXN0YXJ0ZWQgKSwKLQkJCQlTRlBMKCBmcmVlX2F0ICksCi0JCQkJU0ZQTCggaXRlbXNfYXQgKSwKLQkJCQlTRlBMKCBjYW5fbm9kZV9iZV9yZW1vdmVkICksCi0JCQkJU0ZQTCggbG51bSApLAotCQkJCVNGUEwoIHJudW0gKSwKLQkJCQlTRlBMKCBsYnl0ZXMgKSwKLQkJCQlTRlBMKCByYnl0ZXMgKSwKLQkJCQlTRlBMKCBnZXRfbmVpZ2hib3JzICksCi0JCQkJU0ZQTCggZ2V0X25laWdoYm9yc19yZXN0YXJ0ICksCi0JCQkJU0ZQTCggbmVlZF9sX25laWdoYm9yICksCi0JCQkJU0ZQTCggbmVlZF9yX25laWdoYm9yICkKLQkJCSk7CisJZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgTUFYX0hFSUdIVDsgKytsZXZlbCkgeworCQlzZXFfcHJpbnRmKG0sICIlaVx0IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybGkiCisJCQkgICAiICUxMmxpIgorCQkJICAgIiAlMTJsaSIKKwkJCSAgICIgJTEybGkiCisJCQkgICAiICUxMmx1IgorCQkJICAgIiAlMTJsdSIKKwkJCSAgICIgJTEybHUiCisJCQkgICAiICUxMmx1IgorCQkJICAgIlxuIiwKKwkJCSAgIGxldmVsLAorCQkJICAgU0ZQTChiYWxhbmNlX2F0KSwKKwkJCSAgIFNGUEwoc2JrX3JlYWRfYXQpLAorCQkJICAgU0ZQTChzYmtfZnNfY2hhbmdlZCksCisJCQkgICBTRlBMKHNia19yZXN0YXJ0ZWQpLAorCQkJICAgU0ZQTChmcmVlX2F0KSwKKwkJCSAgIFNGUEwoaXRlbXNfYXQpLAorCQkJICAgU0ZQTChjYW5fbm9kZV9iZV9yZW1vdmVkKSwKKwkJCSAgIFNGUEwobG51bSksCisJCQkgICBTRlBMKHJudW0pLAorCQkJICAgU0ZQTChsYnl0ZXMpLAorCQkJICAgU0ZQTChyYnl0ZXMpLAorCQkJICAgU0ZQTChnZXRfbmVpZ2hib3JzKSwKKwkJCSAgIFNGUEwoZ2V0X25laWdoYm9yc19yZXN0YXJ0KSwKKwkJCSAgIFNGUEwobmVlZF9sX25laWdoYm9yKSwgU0ZQTChuZWVkX3JfbmVpZ2hib3IpCisJCSAgICApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTIzMiwzMSArMjA2LDMwIEBACiB7CiAJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CiAKLQlzZXFfcHJpbnRmKG0sCSJmcmVlX2Jsb2NrOiAlbHVcbiIKLQkJCSIgIHNjYW5fYml0bWFwOiIKLQkJCSIgICAgICAgICAgd2FpdCIKLQkJCSIgICAgICAgICAgYm1hcCIKLQkJCSIgICAgICAgICByZXRyeSIKLQkJCSIgICAgICAgIHN0b2xlbiIKLQkJCSIgIGpvdXJuYWxfaGludCIKLQkJCSJqb3VybmFsX25vaGludCIKLQkJCSJcbiIKLQkJCSIgJTE0bHUiCi0JCQkiICUxNGx1IgotCQkJIiAlMTRsdSIKLQkJCSIgJTE0bHUiCi0JCQkiICUxNGx1IgotCQkJIiAlMTRsdSIKLQkJCSIgJTE0bHUiCi0JCQkiXG4iLAotCQkJU0ZQKCBmcmVlX2Jsb2NrICksCi0JCQlTRlBGKCBjYWxsICksIAotCQkJU0ZQRiggd2FpdCApLCAKLQkJCVNGUEYoIGJtYXAgKSwKLQkJCVNGUEYoIHJldHJ5ICksCi0JCQlTRlBGKCBzdG9sZW4gKSwKLQkJCVNGUEYoIGluX2pvdXJuYWxfaGludCApLAotCQkJU0ZQRiggaW5fam91cm5hbF9ub2hpbnQgKSApOworCXNlcV9wcmludGYobSwgImZyZWVfYmxvY2s6ICVsdVxuIgorCQkgICAiICBzY2FuX2JpdG1hcDoiCisJCSAgICIgICAgICAgICAgd2FpdCIKKwkJICAgIiAgICAgICAgICBibWFwIgorCQkgICAiICAgICAgICAgcmV0cnkiCisJCSAgICIgICAgICAgIHN0b2xlbiIKKwkJICAgIiAgam91cm5hbF9oaW50IgorCQkgICAiam91cm5hbF9ub2hpbnQiCisJCSAgICJcbiIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIiAlMTRsdSIKKwkJICAgIlxuIiwKKwkJICAgU0ZQKGZyZWVfYmxvY2spLAorCQkgICBTRlBGKGNhbGwpLAorCQkgICBTRlBGKHdhaXQpLAorCQkgICBTRlBGKGJtYXApLAorCQkgICBTRlBGKHJldHJ5KSwKKwkJICAgU0ZQRihzdG9sZW4pLAorCQkgICBTRlBGKGluX2pvdXJuYWxfaGludCksIFNGUEYoaW5fam91cm5hbF9ub2hpbnQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjY0LDQ2ICsyMzcsNDIgQEAKIHN0YXRpYyBpbnQgc2hvd19vbl9kaXNrX3N1cGVyKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOwotCWludCBoYXNoX2NvZGUgPSBERkwoIHNfaGFzaF9mdW5jdGlvbl9jb2RlICk7Ci0JX191MzIgZmxhZ3MgPSBESkYoIHNfZmxhZ3MgKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mby0+c19yczsKKwlpbnQgaGFzaF9jb2RlID0gREZMKHNfaGFzaF9mdW5jdGlvbl9jb2RlKTsKKwlfX3UzMiBmbGFncyA9IERKRihzX2ZsYWdzKTsKIAotCXNlcV9wcmludGYobSwJImJsb2NrX2NvdW50OiBcdCVpXG4iCi0JCQkiZnJlZV9ibG9ja3M6IFx0JWlcbiIKLQkJCSJyb290X2Jsb2NrOiBcdCVpXG4iCi0JCQkiYmxvY2tzaXplOiBcdCVpXG4iCi0JCQkib2lkX21heHNpemU6IFx0JWlcbiIKLQkJCSJvaWRfY3Vyc2l6ZTogXHQlaVxuIgotCQkJInVtb3VudF9zdGF0ZTogXHQlaVxuIgotCQkJIm1hZ2ljOiBcdCUxMC4xMHNcbiIKLQkJCSJmc19zdGF0ZTogXHQlaVxuIgotCQkJImhhc2g6IFx0JXNcbiIKLQkJCSJ0cmVlX2hlaWdodDogXHQlaVxuIgotCQkJImJtYXBfbnI6IFx0JWlcbiIKLQkJCSJ2ZXJzaW9uOiBcdCVpXG4iCi0JCQkiZmxhZ3M6IFx0JXhbJXNdXG4iCi0JCQkicmVzZXJ2ZWRfZm9yX2pvdXJuYWw6IFx0JWlcbiIsCi0KLQkJCURGTCggc19ibG9ja19jb3VudCApLAotCQkJREZMKCBzX2ZyZWVfYmxvY2tzICksCi0JCQlERkwoIHNfcm9vdF9ibG9jayApLAotCQkJREYoIHNfYmxvY2tzaXplICksCi0JCQlERiggc19vaWRfbWF4c2l6ZSApLAotCQkJREYoIHNfb2lkX2N1cnNpemUgKSwKLQkJCURGKCBzX3Vtb3VudF9zdGF0ZSApLAotCQkJcnMgLT4gc192MS5zX21hZ2ljLAotCQkJREYoIHNfZnNfc3RhdGUgKSwKLQkJCWhhc2hfY29kZSA9PSBURUFfSEFTSCA/ICJ0ZWEiIDoKLQkJCSggaGFzaF9jb2RlID09IFlVUkFfSEFTSCApID8gInJ1cGFzb3YiIDoKLQkJCSggaGFzaF9jb2RlID09IFI1X0hBU0ggKSA/ICJyNSIgOgotCQkJKCBoYXNoX2NvZGUgPT0gVU5TRVRfSEFTSCApID8gInVuc2V0IiA6ICJ1bmtub3duIiwKLQkJCURGKCBzX3RyZWVfaGVpZ2h0ICksCi0JCQlERiggc19ibWFwX25yICksCi0JCQlERiggc192ZXJzaW9uICksCi0JCQlmbGFncywKLQkJCSggZmxhZ3MgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkICkKLQkJCT8gImF0dHJzX2NsZWFyZWQiIDogIiIsCi0JCQlERiAoc19yZXNlcnZlZF9mb3Jfam91cm5hbCkpOworCXNlcV9wcmludGYobSwgImJsb2NrX2NvdW50OiBcdCVpXG4iCisJCSAgICJmcmVlX2Jsb2NrczogXHQlaVxuIgorCQkgICAicm9vdF9ibG9jazogXHQlaVxuIgorCQkgICAiYmxvY2tzaXplOiBcdCVpXG4iCisJCSAgICJvaWRfbWF4c2l6ZTogXHQlaVxuIgorCQkgICAib2lkX2N1cnNpemU6IFx0JWlcbiIKKwkJICAgInVtb3VudF9zdGF0ZTogXHQlaVxuIgorCQkgICAibWFnaWM6IFx0JTEwLjEwc1xuIgorCQkgICAiZnNfc3RhdGU6IFx0JWlcbiIKKwkJICAgImhhc2g6IFx0JXNcbiIKKwkJICAgInRyZWVfaGVpZ2h0OiBcdCVpXG4iCisJCSAgICJibWFwX25yOiBcdCVpXG4iCisJCSAgICJ2ZXJzaW9uOiBcdCVpXG4iCisJCSAgICJmbGFnczogXHQleFslc11cbiIKKwkJICAgInJlc2VydmVkX2Zvcl9qb3VybmFsOiBcdCVpXG4iLAorCQkgICBERkwoc19ibG9ja19jb3VudCksCisJCSAgIERGTChzX2ZyZWVfYmxvY2tzKSwKKwkJICAgREZMKHNfcm9vdF9ibG9jayksCisJCSAgIERGKHNfYmxvY2tzaXplKSwKKwkJICAgREYoc19vaWRfbWF4c2l6ZSksCisJCSAgIERGKHNfb2lkX2N1cnNpemUpLAorCQkgICBERihzX3Vtb3VudF9zdGF0ZSksCisJCSAgIHJzLT5zX3YxLnNfbWFnaWMsCisJCSAgIERGKHNfZnNfc3RhdGUpLAorCQkgICBoYXNoX2NvZGUgPT0gVEVBX0hBU0ggPyAidGVhIiA6CisJCSAgIChoYXNoX2NvZGUgPT0gWVVSQV9IQVNIKSA/ICJydXBhc292IiA6CisJCSAgIChoYXNoX2NvZGUgPT0gUjVfSEFTSCkgPyAicjUiIDoKKwkJICAgKGhhc2hfY29kZSA9PSBVTlNFVF9IQVNIKSA/ICJ1bnNldCIgOiAidW5rbm93biIsCisJCSAgIERGKHNfdHJlZV9oZWlnaHQpLAorCQkgICBERihzX2JtYXBfbnIpLAorCQkgICBERihzX3ZlcnNpb24pLCBmbGFncywgKGZsYWdzICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCkKKwkJICAgPyAiYXR0cnNfY2xlYXJlZCIgOiAiIiwgREYoc19yZXNlcnZlZF9mb3Jfam91cm5hbCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTEsMTMxICsyODAsMTIyIEBACiBzdGF0aWMgaW50IHNob3dfb2lkbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOwotCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUoIHJzIC0+IHNfdjEuc19vaWRfY3Vyc2l6ZSApOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSBzYl9pbmZvLT5zX3JzOworCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUocnMtPnNfdjEuc19vaWRfY3Vyc2l6ZSk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF91c2VkID0gMDsKIAlpbnQgaTsKIAotCWZvciggaSA9IDAgOyBpIDwgbWFwc2l6ZSA7ICsraSApIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWFwc2l6ZTsgKytpKSB7CiAJCV9fdTMyIHJpZ2h0OwogCi0JCXJpZ2h0ID0gKCBpID09IG1hcHNpemUgLSAxICkgPyBNQVhfS0VZX09CSkVDVElEIDogTUFQKCBpICsgMSApOworCQlyaWdodCA9IChpID09IG1hcHNpemUgLSAxKSA/IE1BWF9LRVlfT0JKRUNUSUQgOiBNQVAoaSArIDEpOwogCQlzZXFfcHJpbnRmKG0sICIlczogWyAleCAuLiAleCApXG4iLAotCQkJCSggaSAmIDEgKSA/ICJmcmVlIiA6ICJ1c2VkIiwgTUFQKCBpICksIHJpZ2h0ICk7Ci0JCWlmKCAhICggaSAmIDEgKSApIHsKLQkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoIGkgKTsKKwkJCSAgIChpICYgMSkgPyAiZnJlZSIgOiAidXNlZCIsIE1BUChpKSwgcmlnaHQpOworCQlpZiAoIShpICYgMSkpIHsKKwkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoaSk7CiAJCX0KIAl9CiAjaWYgZGVmaW5lZCggUkVJU0VSRlNfVVNFX09JRE1BUEYgKQotCWlmKCBzYl9pbmZvIC0+IG9pZG1hcC51c2VfZmlsZSAmJiAoIHNiX2luZm8gLT4gb2lkbWFwLm1hcGYgIT0gTlVMTCApICkgeworCWlmIChzYl9pbmZvLT5vaWRtYXAudXNlX2ZpbGUgJiYgKHNiX2luZm8tPm9pZG1hcC5tYXBmICE9IE5VTEwpKSB7CiAJCWxvZmZfdCBzaXplID0gc2JfaW5mby0+b2lkbWFwLm1hcGYtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7Ci0JCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZiggcmVpc2VyZnNfb2lkaW50ZXJ2YWxfZF90ICk7CisJCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZihyZWlzZXJmc19vaWRpbnRlcnZhbF9kX3QpOwogCX0KICNlbmRpZgotCXNlcV9wcmludGYobSwgInRvdGFsOiBcdCVpIFslaS8laV0gdXNlZDogJWx1IFtleGFjdF1cbiIsIAotCQkJbWFwc2l6ZSwgCi0JCQltYXBzaXplLCBsZTE2X3RvX2NwdSggcnMgLT4gc192MS5zX29pZF9tYXhzaXplICksCi0JCQl0b3RhbF91c2VkKTsKKwlzZXFfcHJpbnRmKG0sICJ0b3RhbDogXHQlaSBbJWkvJWldIHVzZWQ6ICVsdSBbZXhhY3RdXG4iLAorCQkgICBtYXBzaXplLAorCQkgICBtYXBzaXplLCBsZTE2X3RvX2NwdShycy0+c192MS5zX29pZF9tYXhzaXplKSwgdG90YWxfdXNlZCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2hvd19qb3VybmFsKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqciA9IFJFSVNFUkZTX1NCKHNiKTsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gciAtPiBzX3JzOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMgPSByLT5zX3JzOwogCXN0cnVjdCBqb3VybmFsX3BhcmFtcyAqanAgPSAmcnMtPnNfdjEuc19qb3VybmFsOwogCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLSAgICAKIAotCXNlcV9wcmludGYobSwJIC8qIG9uLWRpc2sgZmllbGRzICovCi0gCQkJImpwX2pvdXJuYWxfMXN0X2Jsb2NrOiBcdCVpXG4iCi0gCQkJImpwX2pvdXJuYWxfZGV2OiBcdCVzWyV4XVxuIgotIAkJCSJqcF9qb3VybmFsX3NpemU6IFx0JWlcbiIKLSAJCQkianBfam91cm5hbF90cmFuc19tYXg6IFx0JWlcbiIKLSAJCQkianBfam91cm5hbF9tYWdpYzogXHQlaVxuIgotIAkJCSJqcF9qb3VybmFsX21heF9iYXRjaDogXHQlaVxuIgotIAkJCSJqcF9qb3VybmFsX21heF9jb21taXRfYWdlOiBcdCVpXG4iCi0gCQkJImpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTogXHQlaVxuIgotCQkJLyogaW5jb3JlIGZpZWxkcyAqLwotCQkJImpfMXN0X3Jlc2VydmVkX2Jsb2NrOiBcdCVpXG4iCSAgCi0JCQkial9zdGF0ZTogXHQlbGlcbiIJCQkKLQkJCSJqX3RyYW5zX2lkOiBcdCVsdVxuIgotCQkJImpfbW91bnRfaWQ6IFx0JWx1XG4iCi0JCQkial9zdGFydDogXHQlbHVcbiIKLQkJCSJqX2xlbjogXHQlbHVcbiIKLQkJCSJqX2xlbl9hbGxvYzogXHQlbHVcbiIKLQkJCSJqX3djb3VudDogXHQlaVxuIgotCQkJImpfYmNvdW50OiBcdCVsdVxuIgotCQkJImpfZmlyc3RfdW5mbHVzaGVkX29mZnNldDogXHQlbHVcbiIKLQkJCSJqX2xhc3RfZmx1c2hfdHJhbnNfaWQ6IFx0JWx1XG4iCi0JCQkial90cmFuc19zdGFydF90aW1lOiBcdCVsaVxuIgotCQkJImpfbGlzdF9iaXRtYXBfaW5kZXg6IFx0JWlcbiIKLQkJCSJqX211c3Rfd2FpdDogXHQlaVxuIgotCQkJImpfbmV4dF9mdWxsX2ZsdXNoOiBcdCVpXG4iCi0JCQkial9uZXh0X2FzeW5jX2ZsdXNoOiBcdCVpXG4iCi0JCQkial9jbm9kZV91c2VkOiBcdCVpXG4iCi0JCQkial9jbm9kZV9mcmVlOiBcdCVpXG4iCi0JCQkiXG4iCi0JCQkvKiByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90LmpvdXJuYWwgZmllbGRzICovCi0JCQkiaW5fam91cm5hbDogXHQlMTJsdVxuIgotCQkJImluX2pvdXJuYWxfYml0bWFwOiBcdCUxMmx1XG4iCi0JCQkiaW5fam91cm5hbF9yZXVzYWJsZTogXHQlMTJsdVxuIgotCQkJImxvY2tfam91cm5hbDogXHQlMTJsdVxuIgotCQkJImxvY2tfam91cm5hbF93YWl0OiBcdCUxMmx1XG4iCi0JCQkiam91cm5hbF9iZWdpbjogXHQlMTJsdVxuIgotCQkJImpvdXJuYWxfcmVsb2NrX3dyaXRlcnM6IFx0JTEybHVcbiIKLQkJCSJqb3VybmFsX3JlbG9ja193Y291bnQ6IFx0JTEybHVcbiIKLQkJCSJtYXJrX2RpcnR5OiBcdCUxMmx1XG4iCi0JCQkibWFya19kaXJ0eV9hbHJlYWR5OiBcdCUxMmx1XG4iCi0JCQkibWFya19kaXJ0eV9ub3Rqb3VybmFsOiBcdCUxMmx1XG4iCi0JCQkicmVzdG9yZV9wcmVwYXJlZDogXHQlMTJsdVxuIgotCQkJInByZXBhcmU6IFx0JTEybHVcbiIKLQkJCSJwcmVwYXJlX3JldHJ5OiBcdCUxMmx1XG4iLAotCi0gICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfMXN0X2Jsb2NrICksCi0gICAgICAgICAgICAgICAgICAgICAgICBiZGV2bmFtZShTQl9KT1VSTkFMKHNiKS0+al9kZXZfYmQsIGIpLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX2RldiApLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX3NpemUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF90cmFuc19tYXggKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9tYWdpYyApLAotICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX21heF9iYXRjaCApLAotCQkJU0JfSk9VUk5BTChzYiktPmpfbWF4X2NvbW1pdF9hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZSApLAotCi0JCQlKRiggal8xc3RfcmVzZXJ2ZWRfYmxvY2sgKSwJCQkKLQkJCUpGKCBqX3N0YXRlICksCQkJCi0JCQlKRiggal90cmFuc19pZCApLAotCQkJSkYoIGpfbW91bnRfaWQgKSwKLQkJCUpGKCBqX3N0YXJ0ICksCi0JCQlKRiggal9sZW4gKSwKLQkJCUpGKCBqX2xlbl9hbGxvYyApLAotCQkJYXRvbWljX3JlYWQoICYgciAtPiBzX2pvdXJuYWwgLT4gal93Y291bnQgKSwKLQkJCUpGKCBqX2Jjb3VudCApLAotCQkJSkYoIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCApLAotCQkJSkYoIGpfbGFzdF9mbHVzaF90cmFuc19pZCApLAotCQkJSkYoIGpfdHJhbnNfc3RhcnRfdGltZSApLAotCQkJSkYoIGpfbGlzdF9iaXRtYXBfaW5kZXggKSwKLQkJCUpGKCBqX211c3Rfd2FpdCApLAotCQkJSkYoIGpfbmV4dF9mdWxsX2ZsdXNoICksCi0JCQlKRiggal9uZXh0X2FzeW5jX2ZsdXNoICksCi0JCQlKRiggal9jbm9kZV91c2VkICksCi0JCQlKRiggal9jbm9kZV9mcmVlICksCi0KLQkJCVNGUEooIGluX2pvdXJuYWwgKSwKLQkJCVNGUEooIGluX2pvdXJuYWxfYml0bWFwICksCi0JCQlTRlBKKCBpbl9qb3VybmFsX3JldXNhYmxlICksCi0JCQlTRlBKKCBsb2NrX2pvdXJuYWwgKSwKLQkJCVNGUEooIGxvY2tfam91cm5hbF93YWl0ICksCi0JCQlTRlBKKCBqb3VybmFsX2JlaW5nICksCi0JCQlTRlBKKCBqb3VybmFsX3JlbG9ja193cml0ZXJzICksCi0JCQlTRlBKKCBqb3VybmFsX3JlbG9ja193Y291bnQgKSwKLQkJCVNGUEooIG1hcmtfZGlydHkgKSwKLQkJCVNGUEooIG1hcmtfZGlydHlfYWxyZWFkeSApLAotCQkJU0ZQSiggbWFya19kaXJ0eV9ub3Rqb3VybmFsICksCi0JCQlTRlBKKCByZXN0b3JlX3ByZXBhcmVkICksCi0JCQlTRlBKKCBwcmVwYXJlICksCi0JCQlTRlBKKCBwcmVwYXJlX3JldHJ5ICkKLQkJKTsKKwlzZXFfcHJpbnRmKG0sCQkvKiBvbi1kaXNrIGZpZWxkcyAqLworCQkgICAianBfam91cm5hbF8xc3RfYmxvY2s6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfZGV2OiBcdCVzWyV4XVxuIgorCQkgICAianBfam91cm5hbF9zaXplOiBcdCVpXG4iCisJCSAgICJqcF9qb3VybmFsX3RyYW5zX21heDogXHQlaVxuIgorCQkgICAianBfam91cm5hbF9tYWdpYzogXHQlaVxuIgorCQkgICAianBfam91cm5hbF9tYXhfYmF0Y2g6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U6IFx0JWlcbiIKKwkJICAgImpwX2pvdXJuYWxfbWF4X3RyYW5zX2FnZTogXHQlaVxuIgorCQkgICAvKiBpbmNvcmUgZmllbGRzICovCisJCSAgICJqXzFzdF9yZXNlcnZlZF9ibG9jazogXHQlaVxuIgorCQkgICAial9zdGF0ZTogXHQlbGlcbiIKKwkJICAgImpfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCSAgICJqX21vdW50X2lkOiBcdCVsdVxuIgorCQkgICAial9zdGFydDogXHQlbHVcbiIKKwkJICAgImpfbGVuOiBcdCVsdVxuIgorCQkgICAial9sZW5fYWxsb2M6IFx0JWx1XG4iCisJCSAgICJqX3djb3VudDogXHQlaVxuIgorCQkgICAial9iY291bnQ6IFx0JWx1XG4iCisJCSAgICJqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ6IFx0JWx1XG4iCisJCSAgICJqX2xhc3RfZmx1c2hfdHJhbnNfaWQ6IFx0JWx1XG4iCisJCSAgICJqX3RyYW5zX3N0YXJ0X3RpbWU6IFx0JWxpXG4iCisJCSAgICJqX2xpc3RfYml0bWFwX2luZGV4OiBcdCVpXG4iCisJCSAgICJqX211c3Rfd2FpdDogXHQlaVxuIgorCQkgICAial9uZXh0X2Z1bGxfZmx1c2g6IFx0JWlcbiIKKwkJICAgImpfbmV4dF9hc3luY19mbHVzaDogXHQlaVxuIgorCQkgICAial9jbm9kZV91c2VkOiBcdCVpXG4iICJqX2Nub2RlX2ZyZWU6IFx0JWlcbiIgIlxuIgorCQkgICAvKiByZWlzZXJmc19wcm9jX2luZm9fZGF0YV90LmpvdXJuYWwgZmllbGRzICovCisJCSAgICJpbl9qb3VybmFsOiBcdCUxMmx1XG4iCisJCSAgICJpbl9qb3VybmFsX2JpdG1hcDogXHQlMTJsdVxuIgorCQkgICAiaW5fam91cm5hbF9yZXVzYWJsZTogXHQlMTJsdVxuIgorCQkgICAibG9ja19qb3VybmFsOiBcdCUxMmx1XG4iCisJCSAgICJsb2NrX2pvdXJuYWxfd2FpdDogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9iZWdpbjogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9yZWxvY2tfd3JpdGVyczogXHQlMTJsdVxuIgorCQkgICAiam91cm5hbF9yZWxvY2tfd2NvdW50OiBcdCUxMmx1XG4iCisJCSAgICJtYXJrX2RpcnR5OiBcdCUxMmx1XG4iCisJCSAgICJtYXJrX2RpcnR5X2FscmVhZHk6IFx0JTEybHVcbiIKKwkJICAgIm1hcmtfZGlydHlfbm90am91cm5hbDogXHQlMTJsdVxuIgorCQkgICAicmVzdG9yZV9wcmVwYXJlZDogXHQlMTJsdVxuIgorCQkgICAicHJlcGFyZTogXHQlMTJsdVxuIgorCQkgICAicHJlcGFyZV9yZXRyeTogXHQlMTJsdVxuIiwKKwkJICAgREpQKGpwX2pvdXJuYWxfMXN0X2Jsb2NrKSwKKwkJICAgYmRldm5hbWUoU0JfSk9VUk5BTChzYiktPmpfZGV2X2JkLCBiKSwKKwkJICAgREpQKGpwX2pvdXJuYWxfZGV2KSwKKwkJICAgREpQKGpwX2pvdXJuYWxfc2l6ZSksCisJCSAgIERKUChqcF9qb3VybmFsX3RyYW5zX21heCksCisJCSAgIERKUChqcF9qb3VybmFsX21hZ2ljKSwKKwkJICAgREpQKGpwX2pvdXJuYWxfbWF4X2JhdGNoKSwKKwkJICAgU0JfSk9VUk5BTChzYiktPmpfbWF4X2NvbW1pdF9hZ2UsCisJCSAgIERKUChqcF9qb3VybmFsX21heF90cmFuc19hZ2UpLAorCQkgICBKRihqXzFzdF9yZXNlcnZlZF9ibG9jayksCisJCSAgIEpGKGpfc3RhdGUpLAorCQkgICBKRihqX3RyYW5zX2lkKSwKKwkJICAgSkYoal9tb3VudF9pZCksCisJCSAgIEpGKGpfc3RhcnQpLAorCQkgICBKRihqX2xlbiksCisJCSAgIEpGKGpfbGVuX2FsbG9jKSwKKwkJICAgYXRvbWljX3JlYWQoJnItPnNfam91cm5hbC0+al93Y291bnQpLAorCQkgICBKRihqX2Jjb3VudCksCisJCSAgIEpGKGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCksCisJCSAgIEpGKGpfbGFzdF9mbHVzaF90cmFuc19pZCksCisJCSAgIEpGKGpfdHJhbnNfc3RhcnRfdGltZSksCisJCSAgIEpGKGpfbGlzdF9iaXRtYXBfaW5kZXgpLAorCQkgICBKRihqX211c3Rfd2FpdCksCisJCSAgIEpGKGpfbmV4dF9mdWxsX2ZsdXNoKSwKKwkJICAgSkYoal9uZXh0X2FzeW5jX2ZsdXNoKSwKKwkJICAgSkYoal9jbm9kZV91c2VkKSwKKwkJICAgSkYoal9jbm9kZV9mcmVlKSwKKwkJICAgU0ZQSihpbl9qb3VybmFsKSwKKwkJICAgU0ZQSihpbl9qb3VybmFsX2JpdG1hcCksCisJCSAgIFNGUEooaW5fam91cm5hbF9yZXVzYWJsZSksCisJCSAgIFNGUEoobG9ja19qb3VybmFsKSwKKwkJICAgU0ZQSihsb2NrX2pvdXJuYWxfd2FpdCksCisJCSAgIFNGUEooam91cm5hbF9iZWluZyksCisJCSAgIFNGUEooam91cm5hbF9yZWxvY2tfd3JpdGVycyksCisJCSAgIFNGUEooam91cm5hbF9yZWxvY2tfd2NvdW50KSwKKwkJICAgU0ZQSihtYXJrX2RpcnR5KSwKKwkJICAgU0ZQSihtYXJrX2RpcnR5X2FscmVhZHkpLAorCQkgICBTRlBKKG1hcmtfZGlydHlfbm90am91cm5hbCksCisJCSAgIFNGUEoocmVzdG9yZV9wcmVwYXJlZCksIFNGUEoocHJlcGFyZSksIFNGUEoocHJlcGFyZV9yZXRyeSkKKwkgICAgKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDUwLDcgKzQxMCw3IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKLXN0YXRpYyB2b2lkICpyX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqcl9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqIHBvcykKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBkZS0+cGFyZW50LT5kYXRhOwpAQCAtNDcyLDcgKzQzMiw3IEBACiAJcmV0dXJuIHM7CiB9CiAKLXN0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3N0YXRpYyB2b2lkICpyX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKiBwb3MpCiB7CiAJKysqcG9zOwogCWlmICh2KQpAQCAtNDg5LDcgKzQ0OSw3IEBACiBzdGF0aWMgaW50IHJfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IG0tPnByaXZhdGU7Ci0JaW50ICgqc2hvdykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKSA9IGRlLT5kYXRhOworCWludCAoKnNob3cpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopID0gZGUtPmRhdGE7CiAJcmV0dXJuIHNob3cobSwgdik7CiB9CiAKQEAgLTUxMiwxNyArNDcyLDE3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJfZmlsZV9vcGVyYXRpb25zID0gewotCS5vcGVuCQk9IHJfb3BlbiwKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorCS5vcGVuID0gcl9vcGVuLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAogfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pbmZvX3Jvb3QgPSBOVUxMOwogc3RhdGljIGNvbnN0IGNoYXIgcHJvY19pbmZvX3Jvb3RfbmFtZVtdID0gImZzL3JlaXNlcmZzIjsKIAogc3RhdGljIHZvaWQgYWRkX2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqbmFtZSwKLQlpbnQgKCpmdW5jKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopKQorCQkgICAgIGludCAoKmZ1bmMpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopKQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGU7CiAJZGUgPSBjcmVhdGVfcHJvY19lbnRyeShuYW1lLCAwLCBSRUlTRVJGU19TQihzYiktPnByb2NkaXIpOwpAQCAtNTMyLDExICs0OTIsMTIgQEAKIAl9CiB9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9faW5pdCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzcGluX2xvY2tfaW5pdCggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKLQlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPSBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIHByb2NfaW5mb19yb290KTsKLQlpZiggUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyICkgeworCXNwaW5fbG9ja19pbml0KCZfX1BJTkZPKHNiKS5sb2NrKTsKKwlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPQorCSAgICBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lKHNiKSwgcHJvY19pbmZvX3Jvb3QpOworCWlmIChSRUlTRVJGU19TQihzYiktPnByb2NkaXIpIHsKIAkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwogCQlSRUlTRVJGU19TQihzYiktPnByb2NkaXItPmRhdGEgPSBzYjsKIAkJYWRkX2ZpbGUoc2IsICJ2ZXJzaW9uIiwgc2hvd192ZXJzaW9uKTsKQEAgLTU0OSwxMSArNTEwLDExIEBACiAJCXJldHVybiAwOwogCX0KIAlyZWlzZXJmc193YXJuaW5nKHNiLCAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMvJXMiLAotCQkJIHByb2NfaW5mb19yb290X25hbWUsIHJlaXNlcmZzX2JkZXZuYW1lIChzYikgKTsKKwkJCSBwcm9jX2luZm9fcm9vdF9uYW1lLCByZWlzZXJmc19iZGV2bmFtZShzYikpOwogCXJldHVybiAxOwogfQogCi1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgKQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSA9IFJFSVNFUkZTX1NCKHNiKS0+cHJvY2RpcjsKIAlpZiAoZGUpIHsKQEAgLTU2NSw0OCArNTI2LDQ4IEBACiAJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdXBlciIsIGRlKTsKIAkJcmVtb3ZlX3Byb2NfZW50cnkoInZlcnNpb24iLCBkZSk7CiAJfQotCXNwaW5fbG9jayggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKLQlfX1BJTkZPKCBzYiApLmV4aXRpbmcgPSAxOwotCXNwaW5fdW5sb2NrKCAmIF9fUElORk8oIHNiICkubG9jayApOwotCWlmICggcHJvY19pbmZvX3Jvb3QgKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBwcm9jX2luZm9fcm9vdCApOworCXNwaW5fbG9jaygmX19QSU5GTyhzYikubG9jayk7CisJX19QSU5GTyhzYikuZXhpdGluZyA9IDE7CisJc3Bpbl91bmxvY2soJl9fUElORk8oc2IpLmxvY2spOworCWlmIChwcm9jX2luZm9fcm9vdCkgeworCQlyZW1vdmVfcHJvY19lbnRyeShyZWlzZXJmc19iZGV2bmFtZShzYiksIHByb2NfaW5mb19yb290KTsKIAkJUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyID0gTlVMTDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoIGNoYXIgKm5hbWUsIAotCQkJCQkJICAgICAgcmVhZF9wcm9jX3QgKmZ1bmMgKQorc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbChjaGFyICpuYW1lLAorCQkJCQkJICAgICByZWFkX3Byb2NfdCAqIGZ1bmMpCiB7Ci0JcmV0dXJuICggcHJvY19pbmZvX3Jvb3QgKSA/IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIG5hbWUsIDAsIAotCQkJCQkJCSAgICBwcm9jX2luZm9fcm9vdCwgCi0JCQkJCQkJICAgIGZ1bmMsIE5VTEwgKSA6IE5VTEw7CisJcmV0dXJuIChwcm9jX2luZm9fcm9vdCkgPyBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KG5hbWUsIDAsCisJCQkJCQkJIHByb2NfaW5mb19yb290LAorCQkJCQkJCSBmdW5jLCBOVUxMKSA6IE5VTEw7CiB9CiAKLXZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCggY29uc3QgY2hhciAqbmFtZSApCit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZW1vdmVfcHJvY19lbnRyeSggbmFtZSwgcHJvY19pbmZvX3Jvb3QgKTsKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBwcm9jX2luZm9fcm9vdCk7CiB9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKQogewotCWlmKCBwcm9jX2luZm9fcm9vdCA9PSBOVUxMICkgeworCWlmIChwcm9jX2luZm9fcm9vdCA9PSBOVUxMKSB7CiAJCXByb2NfaW5mb19yb290ID0gcHJvY19ta2Rpcihwcm9jX2luZm9fcm9vdF9uYW1lLCBOVUxMKTsKLQkJaWYoIHByb2NfaW5mb19yb290ICkgewotCQkJcHJvY19pbmZvX3Jvb3QgLT4gb3duZXIgPSBUSElTX01PRFVMRTsKKwkJaWYgKHByb2NfaW5mb19yb290KSB7CisJCQlwcm9jX2luZm9fcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKIAkJfSBlbHNlIHsKLQkJCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsCi0JCQkJCSAgInJlaXNlcmZzOiBjYW5ub3QgY3JlYXRlIC9wcm9jLyVzIiwKLQkJCQkJICBwcm9jX2luZm9fcm9vdF9uYW1lICk7CisJCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJCSAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMiLAorCQkJCQkgcHJvY19pbmZvX3Jvb3RfbmFtZSk7CiAJCQlyZXR1cm4gMTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSggdm9pZCApCitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKHZvaWQpCiB7Ci0JaWYgKCBwcm9jX2luZm9fcm9vdCAhPSBOVUxMICkgeworCWlmIChwcm9jX2luZm9fcm9vdCAhPSBOVUxMKSB7CiAJCXByb2NfaW5mb19yb290ID0gTlVMTDsKIAkJcmVtb3ZlX3Byb2NfZW50cnkocHJvY19pbmZvX3Jvb3RfbmFtZSwgTlVMTCk7CiAJfQpAQCAtNjE2LDIyICs1NzcsNDAgQEAKIC8qIFJFSVNFUkZTX1BST0NfSU5GTyAqLwogI2Vsc2UKIAotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQotaW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIDA7Cit9CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMDsKK30KIAotc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbCggY2hhciAqbmFtZSwgCi0JCQkJCQkgICAgICByZWFkX3Byb2NfdCAqZnVuYyApCi17IHJldHVybiBOVUxMOyB9CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKGNoYXIgKm5hbWUsCisJCQkJCQkgICAgIHJlYWRfcHJvY190ICogZnVuYykKK3sKKwlyZXR1cm4gTlVMTDsKK30KIAotdm9pZCByZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsKCBjb25zdCBjaGFyICpuYW1lICkgezt9Cit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSkKK3s7Cit9CiAKLWludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKSB7IHJldHVybiAwOyB9Ci1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKCB2b2lkICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSh2b2lkKQoreworCXJldHVybiAwOworfQogCi1pbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyggY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIAotCQkJCSAgICAgb2ZmX3Qgb2Zmc2V0LAotCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApCi17IHJldHVybiAwOyB9CitpbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwKKwkJCQkgICAgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQogCiAvKiBSRUlTRVJGU19QUk9DX0lORk8gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvcmVzaXplLmMgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwppbmRleCAxNzAwMTIwLi4zOWNjN2Y0IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9yZXNpemUuYworKysgYi9mcy9yZWlzZXJmcy9yZXNpemUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIAogICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKICAqLwotIAorCiAvKiAKICAqIFdyaXR0ZW4gYnkgQWxleGFuZGVyIFphcm9jaGVudGNldi4KICAqCkBAIC0xNywyMyArMTcsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19zYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAKLWludCByZWlzZXJmc19yZXNpemUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQoraW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQogewotICAgICAgICBpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBzYjsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaXRtYXA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKmJpdG1hcDsKIAlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8gKm9sZF9iaXRtYXAgPSBTQl9BUF9CSVRNQVAocyk7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwogCXVuc2lnbmVkIGludCBibWFwX25yX25ldywgYm1hcF9ucjsKIAl1bnNpZ25lZCBpbnQgYmxvY2tfcl9uZXcsIGJsb2NrX3I7Ci0JCi0Jc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICogamI7CisKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiOwogCXN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCBqYml0bWFwW0pPVVJOQUxfTlVNX0JJVE1BUFNdOwotCQorCiAJdW5zaWduZWQgbG9uZyBpbnQgYmxvY2tfY291bnQsIGZyZWVfYmxvY2tzOwogCWludCBpOwotCWludCBjb3B5X3NpemUgOworCWludCBjb3B5X3NpemU7CiAKIAlzYiA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CiAKQEAgLTQ3LDEzNiArNDcsMTQ1IEBACiAJaWYgKCFiaCkgewogCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogY2FuXCd0IHJlYWQgbGFzdCBibG9ja1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwotCX0JCisJfQogCWJmb3JnZXQoYmgpOwogCiAJLyogb2xkIGRpc2sgbGF5b3V0IGRldGVjdGlvbjsgdGhvc2UgcGFydGl0aW9ucyBjYW4gYmUgbW91bnRlZCwgYnV0CiAJICogY2Fubm90IGJlIHJlc2l6ZWQgKi8KLQlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocyktPmJfYmxvY2tuciAqCVNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX3NpemUgCi0JCSE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICkgewotCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogdW5hYmxlIHRvIHJlc2l6ZSBhIHJlaXNlcmZzIHdpdGhvdXQgZGlzdHJpYnV0ZWQgYml0bWFwIChmcyB2ZXJzaW9uIDwgMy41LjEyKVxuIik7CisJaWYgKFNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX2Jsb2NrbnIgKiBTQl9CVUZGRVJfV0lUSF9TQihzKS0+Yl9zaXplCisJICAgICE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSB7CisJCXByaW50aworCQkgICAgKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byByZXNpemUgYSByZWlzZXJmcyB3aXRob3V0IGRpc3RyaWJ1dGVkIGJpdG1hcCAoZnMgdmVyc2lvbiA8IDMuNS4xMilcbiIpOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KLSAgICAgICAKKwogCS8qIGNvdW50IHVzZWQgYml0cyBpbiBsYXN0IGJpdG1hcCBibG9jayAqLwotCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtCi0JICAgICAgICAoU0JfQk1BUF9OUihzKSAtIDEpICogcy0+c19ibG9ja3NpemUgKiA4OwotCQorCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtIChTQl9CTUFQX05SKHMpIC0gMSkgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7CisKIAkvKiBjb3VudCBiaXRtYXAgYmxvY2tzIGluIG5ldyBmcyAqLwotCWJtYXBfbnJfbmV3ID0gYmxvY2tfY291bnRfbmV3IC8gKCBzLT5zX2Jsb2Nrc2l6ZSAqIDggKTsKKwlibWFwX25yX25ldyA9IGJsb2NrX2NvdW50X25ldyAvIChzLT5zX2Jsb2Nrc2l6ZSAqIDgpOwogCWJsb2NrX3JfbmV3ID0gYmxvY2tfY291bnRfbmV3IC0gYm1hcF9ucl9uZXcgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7Ci0JaWYgKGJsb2NrX3JfbmV3KSAKKwlpZiAoYmxvY2tfcl9uZXcpCiAJCWJtYXBfbnJfbmV3Kys7CiAJZWxzZQogCQlibG9ja19yX25ldyA9IHMtPnNfYmxvY2tzaXplICogODsKIAogCS8qIHNhdmUgb2xkIHZhbHVlcyAqLwogCWJsb2NrX2NvdW50ID0gU0JfQkxPQ0tfQ09VTlQocyk7Ci0JYm1hcF9uciAgICAgPSBTQl9CTUFQX05SKHMpOworCWJtYXBfbnIgPSBTQl9CTUFQX05SKHMpOwogCiAJLyogcmVzaXppbmcgb2YgcmVpc2VyZnMgYml0bWFwcyAoam91cm5hbCBhbmQgcmVhbCksIGlmIG5lZWRlZCAqLwotCWlmIChibWFwX25yX25ldyA+IGJtYXBfbnIpIHsJICAgIAotCSAgICAvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLwotCSAgICBpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKLQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGpvdXJuYWwgYml0bWFwc1xuIik7Ci0JCXVubG9ja19zdXBlcihzKSA7Ci0JCXJldHVybiAtRU5PTUVNIDsKLQkgICAgfQotCSAgICAvKiB0aGUgbmV3IGpvdXJuYWwgYml0bWFwcyBhcmUgemVybyBmaWxsZWQsIG5vdyB3ZSBjb3B5IGluIHRoZSBiaXRtYXAKLQkgICAgKiogbm9kZSBwb2ludGVycyBmcm9tIHRoZSBvbGQgam91cm5hbCBiaXRtYXAgc3RydWN0cywgYW5kIHRoZW4KLQkgICAgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCi0JICAgICoqCi0JICAgICoqIHVzaW5nIHRoZSBjb3B5X3NpemUgdmFyIGJlbG93IGFsbG93cyB0aGlzIGNvZGUgdG8gd29yayBmb3IKLQkgICAgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCi0JICAgICovCi0JICAgIGNvcHlfc2l6ZSA9IGJtYXBfbnJfbmV3IDwgYm1hcF9uciA/IGJtYXBfbnJfbmV3IDogYm1hcF9uciA7Ci0JICAgIGNvcHlfc2l6ZSA9IGNvcHlfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXBfbm9kZSAqKSA7Ci0JICAgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgewotCQlzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKipub2RlX3RtcCA7Ci0JCWpiID0gU0JfSk9VUk5BTChzKS0+al9saXN0X2JpdG1hcCArIGkgOwotCQltZW1jcHkoamJpdG1hcFtpXS5iaXRtYXBzLCBqYi0+Yml0bWFwcywgY29weV9zaXplKSA7CisJaWYgKGJtYXBfbnJfbmV3ID4gYm1hcF9ucikgeworCQkvKiByZWFsbG9jYXRlIGpvdXJuYWwgYml0bWFwcyAqLworCQlpZiAocmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHMsIGpiaXRtYXAsIGJtYXBfbnJfbmV3KSA8IDApIHsKKwkJCXByaW50aworCQkJICAgICgicmVpc2VyZnNfcmVzaXplOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBqb3VybmFsIGJpdG1hcHNcbiIpOworCQkJdW5sb2NrX3N1cGVyKHMpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJLyogdGhlIG5ldyBqb3VybmFsIGJpdG1hcHMgYXJlIHplcm8gZmlsbGVkLCBub3cgd2UgY29weSBpbiB0aGUgYml0bWFwCisJCSAqKiBub2RlIHBvaW50ZXJzIGZyb20gdGhlIG9sZCBqb3VybmFsIGJpdG1hcCBzdHJ1Y3RzLCBhbmQgdGhlbgorCQkgKiogdHJhbnNmZXIgdGhlIG5ldyBkYXRhIHN0cnVjdHVyZXMgaW50byB0aGUgam91cm5hbCBzdHJ1Y3QuCisJCSAqKgorCQkgKiogdXNpbmcgdGhlIGNvcHlfc2l6ZSB2YXIgYmVsb3cgYWxsb3dzIHRoaXMgY29kZSB0byB3b3JrIGZvcgorCQkgKiogYm90aCBzaHJpbmtpbmcgYW5kIGV4cGFuZGluZyB0aGUgRlMuCisJCSAqLworCQljb3B5X3NpemUgPSBibWFwX25yX25ldyA8IGJtYXBfbnIgPyBibWFwX25yX25ldyA6IGJtYXBfbnI7CisJCWNvcHlfc2l6ZSA9CisJCSAgICBjb3B5X3NpemUgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwX25vZGUgKik7CisJCWZvciAoaSA9IDA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTOyBpKyspIHsKKwkJCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKm5vZGVfdG1wOworCQkJamIgPSBTQl9KT1VSTkFMKHMpLT5qX2xpc3RfYml0bWFwICsgaTsKKwkJCW1lbWNweShqYml0bWFwW2ldLmJpdG1hcHMsIGpiLT5iaXRtYXBzLCBjb3B5X3NpemUpOwogCi0JCS8qIGp1c3QgaW4gY2FzZSB2ZnJlZSBzY2hlZHVsZXMgb24gdXMsIGNvcHkgdGhlIG5ldwotCQkqKiBwb2ludGVyIGludG8gdGhlIGpvdXJuYWwgc3RydWN0IGJlZm9yZSBmcmVlaW5nIHRoZSAKLQkJKiogb2xkIG9uZQotCQkqLwotCQlub2RlX3RtcCA9IGpiLT5iaXRtYXBzIDsKLQkJamItPmJpdG1hcHMgPSBqYml0bWFwW2ldLmJpdG1hcHMgOwotCQl2ZnJlZShub2RlX3RtcCkgOwotCSAgICB9CQotCQotCSAgICAvKiBhbGxvY2F0ZSBhZGRpdGlvbmFsIGJpdG1hcCBibG9ja3MsIHJlYWxsb2NhdGUgYXJyYXkgb2YgYml0bWFwCi0JICAgICAqIGJsb2NrIHBvaW50ZXJzICovCi0JICAgIGJpdG1hcCA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBibWFwX25yX25ldyk7Ci0JICAgIGlmICghYml0bWFwKSB7Ci0JCS8qIEpvdXJuYWwgYml0bWFwcyBhcmUgc3RpbGwgc3VwZXJzaXplZCwgYnV0IHRoZSBtZW1vcnkgaXNuJ3QKLQkJICogbGVha2VkLCBzbyBJIGd1ZXNzIGl0J3Mgb2sgKi8KLQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JICAgIH0KLQkgICAgbWVtc2V0IChiaXRtYXAsIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgYm1hcF9ucjsgaSsrKQotCQliaXRtYXBbaV0gPSBvbGRfYml0bWFwW2ldOworCQkJLyoganVzdCBpbiBjYXNlIHZmcmVlIHNjaGVkdWxlcyBvbiB1cywgY29weSB0aGUgbmV3CisJCQkgKiogcG9pbnRlciBpbnRvIHRoZSBqb3VybmFsIHN0cnVjdCBiZWZvcmUgZnJlZWluZyB0aGUgCisJCQkgKiogb2xkIG9uZQorCQkJICovCisJCQlub2RlX3RtcCA9IGpiLT5iaXRtYXBzOworCQkJamItPmJpdG1hcHMgPSBqYml0bWFwW2ldLmJpdG1hcHM7CisJCQl2ZnJlZShub2RlX3RtcCk7CisJCX0KIAotCSAgICAvKiBUaGlzIGRvZXNuJ3QgZ28gdGhyb3VnaCB0aGUgam91cm5hbCwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0by4KLQkgICAgICogVGhlIGNoYW5nZXMgYXJlIHN0aWxsIGF0b21pYzogV2UncmUgc3luY2VkIHVwIHdoZW4gdGhlIGpvdXJuYWwKLQkgICAgICogdHJhbnNhY3Rpb24gYmVnaW5zLCBhbmQgdGhlIG5ldyBiaXRtYXBzIGRvbid0IG1hdHRlciBpZiB0aGUKLQkgICAgICogdHJhbnNhY3Rpb24gZmFpbHMuICovCi0JICAgIGZvciAoaSA9IGJtYXBfbnI7IGkgPCBibWFwX25yX25ldzsgaSsrKSB7Ci0JCWJpdG1hcFtpXS5iaCA9IHNiX2dldGJsayhzLCBpICogcy0+c19ibG9ja3NpemUgKiA4KTsKLQkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKLQkJcmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdCgwLCBiaXRtYXBbaV0uYmgtPmJfZGF0YSk7CisJCS8qIGFsbG9jYXRlIGFkZGl0aW9uYWwgYml0bWFwIGJsb2NrcywgcmVhbGxvY2F0ZSBhcnJheSBvZiBiaXRtYXAKKwkJICogYmxvY2sgcG9pbnRlcnMgKi8KKwkJYml0bWFwID0KKwkJICAgIHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBibWFwX25yX25ldyk7CisJCWlmICghYml0bWFwKSB7CisJCQkvKiBKb3VybmFsIGJpdG1hcHMgYXJlIHN0aWxsIHN1cGVyc2l6ZWQsIGJ1dCB0aGUgbWVtb3J5IGlzbid0CisJCQkgKiBsZWFrZWQsIHNvIEkgZ3Vlc3MgaXQncyBvayAqLworCQkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldChiaXRtYXAsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworCQlmb3IgKGkgPSAwOyBpIDwgYm1hcF9ucjsgaSsrKQorCQkJYml0bWFwW2ldID0gb2xkX2JpdG1hcFtpXTsKIAotCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJpdG1hcFtpXS5iaCk7Ci0JCW1hcmtfYnVmZmVyX2RpcnR5KGJpdG1hcFtpXS5iaCkgOwotCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBbaV0uYmgpOwotCQkvLyB1cGRhdGUgYml0bWFwX2luZm8gc3R1ZmYKLQkJYml0bWFwW2ldLmZpcnN0X3plcm9faGludD0xOwotCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKLQkgICAgfQkKLQkgICAgLyogZnJlZSBvbGQgYml0bWFwIGJsb2NrcyBhcnJheSAqLwotCSAgICBTQl9BUF9CSVRNQVAocykgPSBiaXRtYXA7Ci0JICAgIHZmcmVlIChvbGRfYml0bWFwKTsKKwkJLyogVGhpcyBkb2Vzbid0IGdvIHRocm91Z2ggdGhlIGpvdXJuYWwsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdG8uCisJCSAqIFRoZSBjaGFuZ2VzIGFyZSBzdGlsbCBhdG9taWM6IFdlJ3JlIHN5bmNlZCB1cCB3aGVuIHRoZSBqb3VybmFsCisJCSAqIHRyYW5zYWN0aW9uIGJlZ2lucywgYW5kIHRoZSBuZXcgYml0bWFwcyBkb24ndCBtYXR0ZXIgaWYgdGhlCisJCSAqIHRyYW5zYWN0aW9uIGZhaWxzLiAqLworCQlmb3IgKGkgPSBibWFwX25yOyBpIDwgYm1hcF9ucl9uZXc7IGkrKykgeworCQkJYml0bWFwW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGkgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDgpOworCQkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKKwkJCXJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoMCwgYml0bWFwW2ldLmJoLT5iX2RhdGEpOworCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJpdG1hcFtpXS5iaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBbaV0uYmgpOworCQkJc3luY19kaXJ0eV9idWZmZXIoYml0bWFwW2ldLmJoKTsKKwkJCS8vIHVwZGF0ZSBiaXRtYXBfaW5mbyBzdHVmZgorCQkJYml0bWFwW2ldLmZpcnN0X3plcm9faGludCA9IDE7CisJCQliaXRtYXBbaV0uZnJlZV9jb3VudCA9IHNiX2Jsb2Nrc2l6ZShzYikgKiA4IC0gMTsKKwkJfQorCQkvKiBmcmVlIG9sZCBiaXRtYXAgYmxvY2tzIGFycmF5ICovCisJCVNCX0FQX0JJVE1BUChzKSA9IGJpdG1hcDsKKwkJdmZyZWUob2xkX2JpdG1hcCk7CiAJfQotCQorCiAJLyogYmVnaW4gdHJhbnNhY3Rpb24sIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgaXQncyBmaW5lLiBZZXMsIHdlIGhhdmUKIAkgKiBpbmNvcnJlY3QgYml0bWFwcyBub3csIGJ1dCBub25lIG9mIGl0IGlzIGV2ZXIgZ29pbmcgdG8gdG91Y2ggdGhlCiAJICogZGlzayBhbnl3YXkuICovCiAJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKTsKIAlpZiAoZXJyKQotCSAgICByZXR1cm4gZXJyOworCQlyZXR1cm4gZXJyOwogCiAJLyogY29ycmVjdCBsYXN0IGJpdG1hcCBibG9ja3MgaW4gb2xkIGFuZCBuZXcgZGlzayBsYXlvdXQgKi8KIAlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3I7IGkgPCBzLT5zX2Jsb2Nrc2l6ZSAqIDg7IGkrKykKLQkgICAgcmVpc2VyZnNfdGVzdF9hbmRfY2xlYXJfbGVfYml0KGksIAotCQkJCQkgICBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoLT5iX2RhdGEpOworCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQoaSwKKwkJCQkJICAgICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0KKwkJCQkJCQkgICAgICAgMV0uYmgtPmJfZGF0YSk7CiAJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5mcmVlX2NvdW50ICs9IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3I7Ci0JaWYgKCAhU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5maXJzdF96ZXJvX2hpbnQpCi0JICAgIFNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50ID0gYmxvY2tfcjsKKwlpZiAoIVNCX0FQX0JJVE1BUChzKVtibWFwX25yIC0gMV0uZmlyc3RfemVyb19oaW50KQorCQlTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmZpcnN0X3plcm9faGludCA9IGJsb2NrX3I7CiAKIAlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoKTsKIAogCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uYmgsIDEpOwogCWZvciAoaSA9IGJsb2NrX3JfbmV3OyBpIDwgcy0+c19ibG9ja3NpemUgKiA4OyBpKyspCi0JICAgIHJlaXNlcmZzX3Rlc3RfYW5kX3NldF9sZV9iaXQoaSwKLQkJCQkJIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoLT5iX2RhdGEpOworCQlyZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0KGksCisJCQkJCSAgICAgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0KKwkJCQkJCQkgICAgIDFdLmJoLT5iX2RhdGEpOwogCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoKTsKLSAKLQlTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50IC09IHMtPnNfYmxvY2tzaXplICogOCAtIGJsb2NrX3JfbmV3OworCisJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uZnJlZV9jb3VudCAtPQorCSAgICBzLT5zX2Jsb2Nrc2l6ZSAqIDggLSBibG9ja19yX25ldzsKIAkvKiBFeHRyZW1lIGNhc2Ugd2hlcmUgbGFzdCBiaXRtYXAgaXMgdGhlIG9ubHkgdmFsaWQgYmxvY2sgaW4gaXRzZWxmLiAqLwotCWlmICggIVNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmZyZWVfY291bnQgKQotCSAgICBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOwotIAkvKiB1cGRhdGUgc3VwZXIgKi8KLQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisJaWYgKCFTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5mcmVlX2NvdW50KQorCQlTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOworCS8qIHVwZGF0ZSBzdXBlciAqLworCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOwogCWZyZWVfYmxvY2tzID0gU0JfRlJFRV9CTE9DS1Mocyk7Ci0JUFVUX1NCX0ZSRUVfQkxPQ0tTKHMsIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0gKGJtYXBfbnJfbmV3IC0gYm1hcF9ucikpKTsKKwlQVVRfU0JfRlJFRV9CTE9DS1MocywKKwkJCSAgIGZyZWVfYmxvY2tzICsgKGJsb2NrX2NvdW50X25ldyAtIGJsb2NrX2NvdW50IC0KKwkJCQkJICAoYm1hcF9ucl9uZXcgLSBibWFwX25yKSkpOwogCVBVVF9TQl9CTE9DS19DT1VOVChzLCBibG9ja19jb3VudF9uZXcpOwogCVBVVF9TQl9CTUFQX05SKHMsIGJtYXBfbnJfbmV3KTsKIAlzLT5zX2RpcnQgPSAxOwogCiAJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOwotCQorCiAJU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxOwogCXJldHVybiBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMgYi9mcy9yZWlzZXJmcy9zdHJlZS5jCmluZGV4IGM0N2Y4ZmQuLmUyZDA4ZDcgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N0cmVlLmMKKysrIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwpAQCAtNTksNDYgKzU5LDQ1IEBACiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KIAogLyogRG9lcyB0aGUgYnVmZmVyIGNvbnRhaW4gYSBkaXNrIGJsb2NrIHdoaWNoIGlzIGluIHRoZSB0cmVlLiAqLwotaW5saW5lIGludCBCX0lTX0lOX1RSRUUgKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCkKK2lubGluZSBpbnQgQl9JU19JTl9UUkVFKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX2JoKQogewogCi0gIFJGQUxTRSggQl9MRVZFTCAocF9zX2JoKSA+IE1BWF9IRUlHSFQsCi0JICAiUEFQLTEwMTA6IGJsb2NrICglYikgaGFzIHRvbyBiaWcgbGV2ZWwgKCV6KSIsIHBfc19iaCwgcF9zX2JoKTsKKwlSRkFMU0UoQl9MRVZFTChwX3NfYmgpID4gTUFYX0hFSUdIVCwKKwkgICAgICAgIlBBUC0xMDEwOiBibG9jayAoJWIpIGhhcyB0b28gYmlnIGxldmVsICgleikiLCBwX3NfYmgsIHBfc19iaCk7CiAKLSAgcmV0dXJuICggQl9MRVZFTCAocF9zX2JoKSAhPSBGUkVFX0xFVkVMICk7CisJcmV0dXJuIChCX0xFVkVMKHBfc19iaCkgIT0gRlJFRV9MRVZFTCk7CiB9CiAKIC8vCiAvLyB0byBnZXRzIGl0ZW0gaGVhZCBpbiBsZSBmb3JtCiAvLwotaW5saW5lIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqIHBfdl90bywgCi0JCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogcF92X2Zyb20pCitpbmxpbmUgdm9pZCBjb3B5X2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfdG8sCisJCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfZnJvbSkKIHsKLSAgbWVtY3B5IChwX3ZfdG8sIHBfdl9mcm9tLCBJSF9TSVpFKTsKKwltZW1jcHkocF92X3RvLCBwX3ZfZnJvbSwgSUhfU0laRSk7CiB9CiAKLQogLyogazEgaXMgcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSB3aGljaCBpcyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbgogICAgZm9ybS4gazIgaXMgcG9pbnRlciB0byBjcHUgdmFyaWFibGUuIEZvciBrZXkgb2YgaXRlbXMgb2YgdGhlIHNhbWUKICAgIG9iamVjdCB0aGlzIHJldHVybnMgMC4KICAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIAogICAgMCBpZiBrZXkxID09IGtleTIKICAgIDEgaWYga2V5MSA+IGtleTIgKi8KLWlubGluZSBpbnQgIGNvbXBfc2hvcnRfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGxlX2tleSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5KQoraW5saW5lIGludCBjb21wX3Nob3J0X2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqbGVfa2V5LAorCQkJICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpCiB7Ci0gIF9fdTMyIG47Ci0gIG4gPSBsZTMyX3RvX2NwdShsZV9rZXktPmtfZGlyX2lkKTsKLSAgaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKLSAgICAgIHJldHVybiAtMTsKLSAgaWYgKG4gPiBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKLSAgICAgIHJldHVybiAxOwotICBuID0gbGUzMl90b19jcHUobGVfa2V5LT5rX29iamVjdGlkKTsKLSAgaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX29iamVjdGlkKQotICAgICAgcmV0dXJuIC0xOwotICBpZiAobiA+IGNwdV9rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7CisJX191MzIgbjsKKwluID0gbGUzMl90b19jcHUobGVfa2V5LT5rX2Rpcl9pZCk7CisJaWYgKG4gPCBjcHVfa2V5LT5vbl9kaXNrX2tleS5rX2Rpcl9pZCkKKwkJcmV0dXJuIC0xOworCWlmIChuID4gY3B1X2tleS0+b25fZGlza19rZXkua19kaXJfaWQpCisJCXJldHVybiAxOworCW4gPSBsZTMyX3RvX2NwdShsZV9rZXktPmtfb2JqZWN0aWQpOworCWlmIChuIDwgY3B1X2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkKKwkJcmV0dXJuIC0xOworCWlmIChuID4gY3B1X2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9CiAKIC8qIGsxIGlzIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KQEAgLTEwNiw2OCArMTA1LDcyIEBACiAgICBDb21wYXJlIGtleXMgdXNpbmcgYWxsIDQga2V5IGZpZWxkcy4KICAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIDAKICAgIGlmIGtleTEgPSBrZXkyIDEgaWYga2V5MSA+IGtleTIgKi8KLXN0YXRpYyBpbmxpbmUgaW50ICBjb21wX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBsZV9rZXksIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogY3B1X2tleSkKK3N0YXRpYyBpbmxpbmUgaW50IGNvbXBfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXksCisJCQkgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmNwdV9rZXkpCiB7Ci0gIGludCByZXR2YWw7CisJaW50IHJldHZhbDsKIAotICByZXR2YWwgPSBjb21wX3Nob3J0X2tleXMgKGxlX2tleSwgY3B1X2tleSk7Ci0gIGlmIChyZXR2YWwpCi0gICAgICByZXR1cm4gcmV0dmFsOwotICBpZiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwgY3B1X2tleV9rX29mZnNldCAoY3B1X2tleSkpCi0gICAgICByZXR1cm4gLTE7Ci0gIGlmIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPiBjcHVfa2V5X2tfb2Zmc2V0IChjcHVfa2V5KSkKLSAgICAgIHJldHVybiAxOworCXJldHZhbCA9IGNvbXBfc2hvcnRfa2V5cyhsZV9rZXksIGNwdV9rZXkpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJaWYgKGxlX2tleV9rX29mZnNldChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwKKwkgICAgY3B1X2tleV9rX29mZnNldChjcHVfa2V5KSkKKwkJcmV0dXJuIC0xOworCWlmIChsZV9rZXlfa19vZmZzZXQobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA+CisJICAgIGNwdV9rZXlfa19vZmZzZXQoY3B1X2tleSkpCisJCXJldHVybiAxOwogCi0gIGlmIChjcHVfa2V5LT5rZXlfbGVuZ3RoID09IDMpCi0gICAgICByZXR1cm4gMDsKKwlpZiAoY3B1X2tleS0+a2V5X2xlbmd0aCA9PSAzKQorCQlyZXR1cm4gMDsKIAotICAvKiB0aGlzIHBhcnQgaXMgbmVlZGVkIG9ubHkgd2hlbiB0YWlsIGNvbnZlcnNpb24gaXMgaW4gcHJvZ3Jlc3MgKi8KLSAgaWYgKGxlX2tleV9rX3R5cGUgKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPCBjcHVfa2V5X2tfdHlwZSAoY3B1X2tleSkpCi0gICAgcmV0dXJuIC0xOworCS8qIHRoaXMgcGFydCBpcyBuZWVkZWQgb25seSB3aGVuIHRhaWwgY29udmVyc2lvbiBpcyBpbiBwcm9ncmVzcyAqLworCWlmIChsZV9rZXlfa190eXBlKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPAorCSAgICBjcHVfa2V5X2tfdHlwZShjcHVfa2V5KSkKKwkJcmV0dXJuIC0xOwogCi0gIGlmIChsZV9rZXlfa190eXBlIChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpID4gY3B1X2tleV9rX3R5cGUgKGNwdV9rZXkpKQotICAgIHJldHVybiAxOworCWlmIChsZV9rZXlfa190eXBlKGxlX2tleV92ZXJzaW9uKGxlX2tleSksIGxlX2tleSkgPgorCSAgICBjcHVfa2V5X2tfdHlwZShjcHVfa2V5KSkKKwkJcmV0dXJuIDE7CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLQotaW5saW5lIGludCBjb21wX3Nob3J0X2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkxLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5MikKK2lubGluZSBpbnQgY29tcF9zaG9ydF9sZV9rZXlzKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmtleTEsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkyKQogewotICBfX3UzMiAqIHBfc18xX3UzMiwgKiBwX3NfMl91MzI7Ci0gIGludCBuX2tleV9sZW5ndGggPSBSRUlTRVJGU19TSE9SVF9LRVlfTEVOOworCV9fdTMyICpwX3NfMV91MzIsICpwX3NfMl91MzI7CisJaW50IG5fa2V5X2xlbmd0aCA9IFJFSVNFUkZTX1NIT1JUX0tFWV9MRU47CiAKLSAgcF9zXzFfdTMyID0gKF9fdTMyICopa2V5MTsKLSAgcF9zXzJfdTMyID0gKF9fdTMyICopa2V5MjsKLSAgZm9yKCA7IG5fa2V5X2xlbmd0aC0tOyArK3Bfc18xX3UzMiwgKytwX3NfMl91MzIgKSB7Ci0gICAgaWYgKCBsZTMyX3RvX2NwdSAoKnBfc18xX3UzMikgPCBsZTMyX3RvX2NwdSAoKnBfc18yX3UzMikgKQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmICggbGUzMl90b19jcHUgKCpwX3NfMV91MzIpID4gbGUzMl90b19jcHUgKCpwX3NfMl91MzIpICkKLSAgICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOworCXBfc18xX3UzMiA9IChfX3UzMiAqKSBrZXkxOworCXBfc18yX3UzMiA9IChfX3UzMiAqKSBrZXkyOworCWZvciAoOyBuX2tleV9sZW5ndGgtLTsgKytwX3NfMV91MzIsICsrcF9zXzJfdTMyKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqcF9zXzFfdTMyKSA8IGxlMzJfdG9fY3B1KCpwX3NfMl91MzIpKQorCQkJcmV0dXJuIC0xOworCQlpZiAobGUzMl90b19jcHUoKnBfc18xX3UzMikgPiBsZTMyX3RvX2NwdSgqcF9zXzJfdTMyKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKIH0KIAotaW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICogdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBmcm9tKQoraW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkoc3RydWN0IGNwdV9rZXkgKnRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpmcm9tKQogewotICAgIGludCB2ZXJzaW9uOwotICAgIHRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1IChmcm9tLT5rX2Rpcl9pZCk7Ci0gICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBsZTMyX3RvX2NwdSAoZnJvbS0+a19vYmplY3RpZCk7Ci0gICAgCi0gICAgLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5Ci0gICAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChmcm9tKTsKLSAgICB0by0+dmVyc2lvbiA9IHZlcnNpb247Ci0gICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gbGVfa2V5X2tfb2Zmc2V0KHZlcnNpb24sIGZyb20pOwotICAgIHRvLT5vbl9kaXNrX2tleS5rX3R5cGUgPSBsZV9rZXlfa190eXBlKHZlcnNpb24sIGZyb20pOworCWludCB2ZXJzaW9uOworCXRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1KGZyb20tPmtfZGlyX2lkKTsKKwl0by0+b25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1KGZyb20tPmtfb2JqZWN0aWQpOworCisJLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5CisJdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uKGZyb20pOworCXRvLT52ZXJzaW9uID0gdmVyc2lvbjsKKwl0by0+b25fZGlza19rZXkua19vZmZzZXQgPSBsZV9rZXlfa19vZmZzZXQodmVyc2lvbiwgZnJvbSk7CisJdG8tPm9uX2Rpc2tfa2V5LmtfdHlwZSA9IGxlX2tleV9rX3R5cGUodmVyc2lvbiwgZnJvbSk7CiB9CiAKLQotCiAvLyB0aGlzIGRvZXMgbm90IHNheSB3aGljaCBvbmUgaXMgYmlnZ2VyLCBpdCBvbmx5IHJldHVybnMgMSBpZiBrZXlzCiAvLyBhcmUgbm90IGVxdWFsLCAwIG90aGVyd2lzZQotaW5saW5lIGludCBjb21wX2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrMSwgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGsyKQoraW5saW5lIGludCBjb21wX2xlX2tleXMoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqazEsCisJCQljb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprMikKIHsKLSAgICByZXR1cm4gbWVtY21wIChrMSwgazIsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2tleSkpOworCXJldHVybiBtZW1jbXAoazEsIGsyLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2tleSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NCwzNzMgKzE4NywzOTYgQEAKICB0aGVyZSBhcmUgbm8gcG9zc2libGUgaXRlbXMsIGFuZCB3ZSBoYXZlIG5vdCBmb3VuZCBpdC4gV2l0aCBlYWNoIGV4YW1pbmF0aW9uIHdlCiAgY3V0IHRoZSBudW1iZXIgb2YgcG9zc2libGUgaXRlbXMgaXQgY291bGQgYmUgYnkgb25lIG1vcmUgdGhhbiBoYWxmIHJvdW5kZWQgZG93biwKICBvciB3ZSBmaW5kIGl0LiAqLwotc3RhdGljIGlubGluZQlpbnQgYmluX3NlYXJjaCAoCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBwX3Zfa2V5LCAvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICBjb25zdCB2b2lkICogcF92X2Jhc2UsLyogRmlyc3QgaXRlbSBpbiB0aGUgYXJyYXkuICAgICAgICAgICAgICovCi0JICAgICAgaW50ICAgICAgIHBfbl9udW0sICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJyYXkuICAgICAgICAqLwotCSAgICAgIGludCAgICAgICBwX25fd2lkdGgsICAvKiBJdGVtIHNpemUgaW4gdGhlIGFycmF5LgotCQkJCSAgICAgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCi0JCQkJICAgICAgIGNvbmZ1c2VkLCBub3RlIHRoYXQgdGhpcyBpcyBjcmFmdGVkCi0JCQkJICAgICAgIGFzIGEgZ2VuZXJhbCBmdW5jdGlvbiwgYW5kIHdoZW4gaXQKLQkJCQkgICAgICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5Ci0JCQkJICAgICAgIG9mIGl0ZW0gaGVhZGVycyBpbiBhIG5vZGUsIHBfbl93aWR0aAotCQkJCSAgICAgICBpcyBhY3R1YWxseSB0aGUgaXRlbSBoZWFkZXIgc2l6ZSBub3QKLQkJCQkgICAgICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICBpbnQgICAgICogcF9uX3BvcyAgICAgLyogTnVtYmVyIG9mIHRoZSBzZWFyY2hlZCBmb3IgZWxlbWVudC4gKi8KLSAgICAgICAgICAgICkgewotICAgIGludCAgIG5fcmJvdW5kLCBuX2xib3VuZCwgbl9qOworc3RhdGljIGlubGluZSBpbnQgYmluX3NlYXJjaChjb25zdCB2b2lkICpwX3Zfa2V5LAkvKiBLZXkgdG8gc2VhcmNoIGZvci4gICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgICAgY29uc3Qgdm9pZCAqcF92X2Jhc2UsCS8qIEZpcnN0IGl0ZW0gaW4gdGhlIGFycmF5LiAgICAgICAgICAgICAqLworCQkJICAgICBpbnQgcF9uX251bSwJLyogTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJheS4gICAgICAgICovCisJCQkgICAgIGludCBwX25fd2lkdGgsCS8qIEl0ZW0gc2l6ZSBpbiB0aGUgYXJyYXkuCisJCQkJCQkgICBzZWFyY2hlZC4gTGVzdCB0aGUgcmVhZGVyIGJlCisJCQkJCQkgICBjb25mdXNlZCwgbm90ZSB0aGF0IHRoaXMgaXMgY3JhZnRlZAorCQkJCQkJICAgYXMgYSBnZW5lcmFsIGZ1bmN0aW9uLCBhbmQgd2hlbiBpdAorCQkJCQkJICAgaXMgYXBwbGllZCBzcGVjaWZpY2FsbHkgdG8gdGhlIGFycmF5CisJCQkJCQkgICBvZiBpdGVtIGhlYWRlcnMgaW4gYSBub2RlLCBwX25fd2lkdGgKKwkJCQkJCSAgIGlzIGFjdHVhbGx5IHRoZSBpdGVtIGhlYWRlciBzaXplIG5vdAorCQkJCQkJICAgdGhlIGl0ZW0gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgKi8KKwkJCSAgICAgaW50ICpwX25fcG9zCS8qIE51bWJlciBvZiB0aGUgc2VhcmNoZWQgZm9yIGVsZW1lbnQuICovCisgICAgKQoreworCWludCBuX3Jib3VuZCwgbl9sYm91bmQsIG5fajsKIAotICAgZm9yICggbl9qID0gKChuX3Jib3VuZCA9IHBfbl9udW0gLSAxKSArIChuX2xib3VuZCA9IDApKS8yOyBuX2xib3VuZCA8PSBuX3Jib3VuZDsgbl9qID0gKG5fcmJvdW5kICsgbl9sYm91bmQpLzIgKQotICAgICBzd2l0Y2goIGNvbXBfa2V5cygoc3RydWN0IHJlaXNlcmZzX2tleSAqKSgoY2hhciAqIClwX3ZfYmFzZSArIG5faiAqIHBfbl93aWR0aCksIChzdHJ1Y3QgY3B1X2tleSAqKXBfdl9rZXkpICkgIHsKLSAgICAgY2FzZSAtMTogbl9sYm91bmQgPSBuX2ogKyAxOyBjb250aW51ZTsKLSAgICAgY2FzZSAgMTogbl9yYm91bmQgPSBuX2ogLSAxOyBjb250aW51ZTsKLSAgICAgY2FzZSAgMDogKnBfbl9wb3MgPSBuX2o7ICAgICByZXR1cm4gSVRFTV9GT1VORDsgLyogS2V5IGZvdW5kIGluIHRoZSBhcnJheS4gICovCi0gICAgICAgIH0KKwlmb3IgKG5faiA9ICgobl9yYm91bmQgPSBwX25fbnVtIC0gMSkgKyAobl9sYm91bmQgPSAwKSkgLyAyOworCSAgICAgbl9sYm91bmQgPD0gbl9yYm91bmQ7IG5faiA9IChuX3Jib3VuZCArIG5fbGJvdW5kKSAvIDIpCisJCXN3aXRjaCAoY29tcF9rZXlzCisJCQkoKHN0cnVjdCByZWlzZXJmc19rZXkgKikoKGNoYXIgKilwX3ZfYmFzZSArCisJCQkJCQkgbl9qICogcF9uX3dpZHRoKSwKKwkJCSAoc3RydWN0IGNwdV9rZXkgKilwX3Zfa2V5KSkgeworCQljYXNlIC0xOgorCQkJbl9sYm91bmQgPSBuX2ogKyAxOworCQkJY29udGludWU7CisJCWNhc2UgMToKKwkJCW5fcmJvdW5kID0gbl9qIC0gMTsKKwkJCWNvbnRpbnVlOworCQljYXNlIDA6CisJCQkqcF9uX3BvcyA9IG5fajsKKwkJCXJldHVybiBJVEVNX0ZPVU5EOwkvKiBLZXkgZm91bmQgaW4gdGhlIGFycmF5LiAgKi8KKwkJfQogCi0gICAgLyogYmluX3NlYXJjaCBkaWQgbm90IGZpbmQgZ2l2ZW4ga2V5LCBpdCByZXR1cm5zIHBvc2l0aW9uIG9mIGtleSwKLSAgICAgICAgdGhhdCBpcyBtaW5pbWFsIGFuZCBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG9uZS4gKi8KLSAgICAqcF9uX3BvcyA9IG5fbGJvdW5kOwotICAgIHJldHVybiBJVEVNX05PVF9GT1VORDsKKwkvKiBiaW5fc2VhcmNoIGRpZCBub3QgZmluZCBnaXZlbiBrZXksIGl0IHJldHVybnMgcG9zaXRpb24gb2Yga2V5LAorCSAgIHRoYXQgaXMgbWluaW1hbCBhbmQgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBvbmUuICovCisJKnBfbl9wb3MgPSBuX2xib3VuZDsKKwlyZXR1cm4gSVRFTV9OT1RfRk9VTkQ7CiB9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLWV4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiOworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKmN1cl90YjsKICNlbmRpZgogCi0KLQogLyogTWluaW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLwotY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAgTUlOX0tFWSA9IHswLCAwLCB7ezAsIDB9LH19OworY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSBNSU5fS0VZID0geyAwLCAwLCB7ezAsIDB9LH0gfTsKIAogLyogTWF4aW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLwotY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAgTUFYX0tFWSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5IE1BWF9LRVkgPSB7CiAJX19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSwKIAlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpLAogCXt7X19jb25zdGFudF9jcHVfdG9fbGUzMigweGZmZmZmZmZmKSwKLQlfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpfSx9CisJICBfX2NvbnN0YW50X2NwdV90b19sZTMyKDB4ZmZmZmZmZmYpfSx9CiB9OwogCi0KIC8qIEdldCBkZWxpbWl0aW5nIGtleSBvZiB0aGUgYnVmZmVyIGJ5IGxvb2tpbmcgZm9yIGl0IGluIHRoZSBidWZmZXJzIGluIHRoZSBwYXRoLCBzdGFydGluZyBmcm9tIHRoZSBib3R0b20KICAgIG9mIHRoZSBwYXRoLCBhbmQgZ29pbmcgdXB3YXJkcy4gIFdlIG11c3QgY2hlY2sgdGhlIHBhdGgncyB2YWxpZGl0eSBhdCBlYWNoIHN0ZXAuICBJZiB0aGUga2V5IGlzIG5vdCBpbgogICAgdGhlIHBhdGgsIHRoZXJlIGlzIG5vIGRlbGltaXRpbmcga2V5IGluIHRoZSB0cmVlIChidWZmZXIgaXMgZmlyc3Qgb3IgbGFzdCBidWZmZXIgaW4gdHJlZSksIGFuZCBpbiB0aGlzCiAgICBjYXNlIHdlIHJldHVybiBhIHNwZWNpYWwga2V5LCBlaXRoZXIgTUlOX0tFWSBvciBNQVhfS0VZLiAqLwotc3RhdGljIGlubGluZQljb25zdCBzdHJ1Y3QgIHJlaXNlcmZzX2tleSAqIGdldF9sa2V5ICAoCi0JICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfY2hrX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiCi0gICAgICAgICAgICAgICAgICAgICAgKSB7Ci0gIGludCAgICAgICAgICAgICAgICAgICBuX3Bvc2l0aW9uLCBuX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19wYXJlbnQ7Ci0gIAotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAKLQkgICJQQVAtNTAxMDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZ2V0X2xrZXkoY29uc3Qgc3RydWN0IHBhdGgKKwkJCQkJCSAgKnBfc19jaGtfcGF0aCwKKwkJCQkJCSAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrCisJCQkJCQkgICpwX3Nfc2IpCit7CisJaW50IG5fcG9zaXRpb24sIG5fcGF0aF9vZmZzZXQgPSBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3BhcmVudDsKIAotICAvKiBXaGlsZSBub3QgaGlnaGVyIGluIHBhdGggdGhhbiBmaXJzdCBlbGVtZW50LiAqLwotICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisJUkZBTFNFKG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgICAgICAiUEFQLTUwMTA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CiAKLSAgICBSRkFMU0UoICEgYnVmZmVyX3VwdG9kYXRlKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSksCi0JICAgICJQQVAtNTAyMDogcGFyZW50IGlzIG5vdCB1cHRvZGF0ZSIpOworCS8qIFdoaWxlIG5vdCBoaWdoZXIgaW4gcGF0aCB0aGFuIGZpcnN0IGVsZW1lbnQuICovCisJd2hpbGUgKG5fcGF0aF9vZmZzZXQtLSA+IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKIAotICAgIC8qIFBhcmVudCBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUgbm93LiAqLwotICAgIGlmICggISBCX0lTX0lOX1RSRUUocF9zX3BhcmVudCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgKQotICAgICAgcmV0dXJuICZNQVhfS0VZOwotICAgIC8qIENoZWNrIHdoZXRoZXIgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBjb3JyZWN0LiAqLwotICAgIGlmICggKG5fcG9zaXRpb24gPSBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSA+IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQotICAgICAgIHJldHVybiAmTUFYX0tFWTsKLSAgICAvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KLSAgICBpZiAoIEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KLQkgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQgKyAxKS0+Yl9ibG9ja25yICkKLSAgICAgIHJldHVybiAmTUFYX0tFWTsKLSAgICAvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgZXF1YWwgdG8gemVyby4gKi8KLSAgICBpZiAoIG5fcG9zaXRpb24gKQotICAgICAgcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24gLSAxKTsKLSAgfQotICAvKiBSZXR1cm4gTUlOX0tFWSBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1ZmZlciB0cmVlLiAqLwotICBpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09Ci0gICAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3NiKSApCi0gICAgcmV0dXJuICZNSU5fS0VZOwotICByZXR1cm4gICZNQVhfS0VZOworCQlSRkFMU0UoIWJ1ZmZlcl91cHRvZGF0ZQorCQkgICAgICAgKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSksCisJCSAgICAgICAiUEFQLTUwMjA6IHBhcmVudCBpcyBub3QgdXB0b2RhdGUiKTsKKworCQkvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KKwkJaWYgKCFCX0lTX0lOX1RSRUUKKwkJICAgIChwX3NfcGFyZW50ID0KKwkJICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpKQorCQkJcmV0dXJuICZNQVhfS0VZOworCQkvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KKwkJaWYgKChuX3Bvc2l0aW9uID0KKwkJICAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfY2hrX3BhdGgsCisJCQkJCSAgbl9wYXRoX29mZnNldCkpID4KKwkJICAgIEJfTlJfSVRFTVMocF9zX3BhcmVudCkpCisJCQlyZXR1cm4gJk1BWF9LRVk7CisJCS8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIHJlYWxseSBwb2ludHMgdG8gdGhlIGNoaWxkLiAqLworCQlpZiAoQl9OX0NISUxEX05VTShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKSAhPQorCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsCisJCQkJCW5fcGF0aF9vZmZzZXQgKyAxKS0+Yl9ibG9ja25yKQorCQkJcmV0dXJuICZNQVhfS0VZOworCQkvKiBSZXR1cm4gZGVsaW1pdGluZyBrZXkgaWYgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBub3QgZXF1YWwgdG8gemVyby4gKi8KKwkJaWYgKG5fcG9zaXRpb24pCisJCQlyZXR1cm4gQl9OX1BERUxJTV9LRVkocF9zX3BhcmVudCwgbl9wb3NpdGlvbiAtIDEpOworCX0KKwkvKiBSZXR1cm4gTUlOX0tFWSBpZiB3ZSBhcmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGJ1ZmZlciB0cmVlLiAqLworCWlmIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPgorCSAgICBiX2Jsb2NrbnIgPT0gU0JfUk9PVF9CTE9DSyhwX3Nfc2IpKQorCQlyZXR1cm4gJk1JTl9LRVk7CisJcmV0dXJuICZNQVhfS0VZOwogfQogCi0KIC8qIEdldCBkZWxpbWl0aW5nIGtleSBvZiB0aGUgYnVmZmVyIGF0IHRoZSBwYXRoIGFuZCBpdHMgcmlnaHQgbmVpZ2hib3IuICovCi1pbmxpbmUJY29uc3Qgc3RydWN0ICByZWlzZXJmc19rZXkgKiBnZXRfcmtleSAgKAotCSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX2Noa19wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYgotICAgICAgICAgICAgICAgICAgICAgICkgewotICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwKLSAgICAJCQluX3BhdGhfb2Zmc2V0ID0gcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19wYXJlbnQ7CitpbmxpbmUgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZ2V0X3JrZXkoY29uc3Qgc3RydWN0IHBhdGggKnBfc19jaGtfcGF0aCwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpCit7CisJaW50IG5fcG9zaXRpb24sIG5fcGF0aF9vZmZzZXQgPSBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3BhcmVudDsKIAotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VULAotCSAgIlBBUC01MDMwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOworCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgIlBBUC01MDMwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOwogCi0gIHdoaWxlICggbl9wYXRoX29mZnNldC0tID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKKwl3aGlsZSAobl9wYXRoX29mZnNldC0tID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCkgewogCi0gICAgUkZBTFNFKCAhIGJ1ZmZlcl91cHRvZGF0ZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAotCSAgICAiUEFQLTUwNDA6IHBhcmVudCBpcyBub3QgdXB0b2RhdGUiKTsKKwkJUkZBTFNFKCFidWZmZXJfdXB0b2RhdGUKKwkJICAgICAgIChQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAorCQkgICAgICAgIlBBUC01MDQwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CiAKLSAgICAvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KLSAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpICkKLSAgICAgIHJldHVybiAmTUlOX0tFWTsKLSAgICAvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KLSAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKLSAgICAgIHJldHVybiAmTUlOX0tFWTsKLSAgICAvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KLSAgICBpZiAoIEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCArIDEpLT5iX2Jsb2NrbnIgKQotICAgICAgcmV0dXJuICZNSU5fS0VZOwotICAgIC8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCB0aGUgbGFzdCBvbmUuICovCi0gICAgaWYgKCBuX3Bvc2l0aW9uICE9IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQotICAgICAgcmV0dXJuIEJfTl9QREVMSU1fS0VZKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pOwotICB9Ci0gIC8qIFJldHVybiBNQVhfS0VZIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgYnVmZmVyIHRyZWUuICovCi0gIGlmICggUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQpLT5iX2Jsb2NrbnIgPT0KLSAgICAgICBTQl9ST09UX0JMT0NLIChwX3Nfc2IpICkKLSAgICByZXR1cm4gJk1BWF9LRVk7Ci0gIHJldHVybiAgJk1JTl9LRVk7CisJCS8qIFBhcmVudCBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUgbm93LiAqLworCQlpZiAoIUJfSVNfSU5fVFJFRQorCQkgICAgKHBfc19wYXJlbnQgPQorCQkgICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkpCisJCQlyZXR1cm4gJk1JTl9LRVk7CisJCS8qIENoZWNrIHdoZXRoZXIgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBjb3JyZWN0LiAqLworCQlpZiAoKG5fcG9zaXRpb24gPQorCQkgICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19jaGtfcGF0aCwKKwkJCQkJICBuX3BhdGhfb2Zmc2V0KSkgPgorCQkgICAgQl9OUl9JVEVNUyhwX3NfcGFyZW50KSkKKwkJCXJldHVybiAmTUlOX0tFWTsKKwkJLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCisJCWlmIChCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9CisJCSAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwKKwkJCQkJbl9wYXRoX29mZnNldCArIDEpLT5iX2Jsb2NrbnIpCisJCQlyZXR1cm4gJk1JTl9LRVk7CisJCS8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCB0aGUgbGFzdCBvbmUuICovCisJCWlmIChuX3Bvc2l0aW9uICE9IEJfTlJfSVRFTVMocF9zX3BhcmVudCkpCisJCQlyZXR1cm4gQl9OX1BERUxJTV9LRVkocF9zX3BhcmVudCwgbl9wb3NpdGlvbik7CisJfQorCS8qIFJldHVybiBNQVhfS0VZIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgYnVmZmVyIHRyZWUuICovCisJaWYgKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+CisJICAgIGJfYmxvY2tuciA9PSBTQl9ST09UX0JMT0NLKHBfc19zYikpCisJCXJldHVybiAmTUFYX0tFWTsKKwlyZXR1cm4gJk1JTl9LRVk7CiB9CiAKLQogLyogQ2hlY2sgd2hldGhlciBhIGtleSBpcyBjb250YWluZWQgaW4gdGhlIHRyZWUgcm9vdGVkIGZyb20gYSBidWZmZXIgYXQgYSBwYXRoLiAqLwogLyogVGhpcyB3b3JrcyBieSBsb29raW5nIGF0IHRoZSBsZWZ0IGFuZCByaWdodCBkZWxpbWl0aW5nIGtleXMgZm9yIHRoZSBidWZmZXIgaW4gdGhlIGxhc3QgcGF0aF9lbGVtZW50IGluCiAgICB0aGUgcGF0aC4gIFRoZXNlIGRlbGltaXRpbmcga2V5cyBhcmUgc3RvcmVkIGF0IGxlYXN0IG9uZSBsZXZlbCBhYm92ZSB0aGF0IGJ1ZmZlciBpbiB0aGUgdHJlZS4gSWYgdGhlCiAgICBidWZmZXIgaXMgdGhlIGZpcnN0IG9yIGxhc3Qgbm9kZSBpbiB0aGUgdHJlZSBvcmRlciB0aGVuIG9uZSBvZiB0aGUgZGVsaW1pdGluZyBrZXlzIG1heSBiZSBhYnNlbnQsIGFuZCBpbgogICAgdGhpcyBjYXNlIGdldF9sa2V5IGFuZCBnZXRfcmtleSByZXR1cm4gYSBzcGVjaWFsIGtleSB3aGljaCBpcyBNSU5fS0VZIG9yIE1BWF9LRVkuICovCi1zdGF0aWMgIGlubGluZSAgaW50IGtleV9pbl9idWZmZXIgKAotICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfY2hrX3BhdGgsIC8qIFBhdGggd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQuICAqLwotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBwX3Nfa2V5LCAgICAgIC8qIEtleSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZC4gICAqLwotICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgICAgICAgIC8qIFN1cGVyIGJsb2NrIHBvaW50ZXIuICAgICAgICAgICAqLwotCQkgICAgICApIHsKK3N0YXRpYyBpbmxpbmUgaW50IGtleV9pbl9idWZmZXIoc3RydWN0IHBhdGggKnBfc19jaGtfcGF0aCwJLyogUGF0aCB3aGljaCBzaG91bGQgYmUgY2hlY2tlZC4gICovCisJCQkJY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19rZXksCS8qIEtleSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZC4gICAqLworCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiCS8qIFN1cGVyIGJsb2NrIHBvaW50ZXIuICAgICAgICAgICAqLworICAgICkKK3sKIAotICBSRkFMU0UoICEgcF9zX2tleSB8fCBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoIDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCB8fAotCSAgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCA+IE1BWF9IRUlHSFQsCi0JICAiUEFQLTUwNTA6IHBvaW50ZXIgdG8gdGhlIGtleSglcCkgaXMgTlVMTCBvciBpbnZhbGlkIHBhdGggbGVuZ3RoKCVkKSIsCi0JICBwX3Nfa2V5LCBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoKTsKLSAgUkZBTFNFKCAhUEFUSF9QTEFTVF9CVUZGRVIocF9zX2Noa19wYXRoKS0+Yl9iZGV2LAotCSAgIlBBUC01MDYwOiBkZXZpY2UgbXVzdCBub3QgYmUgTk9ERVYiKTsKKwlSRkFMU0UoIXBfc19rZXkgfHwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQKKwkgICAgICAgfHwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCA+IE1BWF9IRUlHSFQsCisJICAgICAgICJQQVAtNTA1MDogcG9pbnRlciB0byB0aGUga2V5KCVwKSBpcyBOVUxMIG9yIGludmFsaWQgcGF0aCBsZW5ndGgoJWQpIiwKKwkgICAgICAgcF9zX2tleSwgcF9zX2Noa19wYXRoLT5wYXRoX2xlbmd0aCk7CisJUkZBTFNFKCFQQVRIX1BMQVNUX0JVRkZFUihwX3NfY2hrX3BhdGgpLT5iX2JkZXYsCisJICAgICAgICJQQVAtNTA2MDogZGV2aWNlIG11c3Qgbm90IGJlIE5PREVWIik7CiAKLSAgaWYgKCBjb21wX2tleXMoZ2V0X2xrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpLCBwX3Nfa2V5KSA9PSAxICkKLSAgICAvKiBsZWZ0IGRlbGltaXRpbmcga2V5IGlzIGJpZ2dlciwgdGhhdCB0aGUga2V5IHdlIGxvb2sgZm9yICovCi0gICAgcmV0dXJuIDA7Ci0gIC8vICBpZiAoIGNvbXBfa2V5cyhwX3Nfa2V5LCBnZXRfcmtleShwX3NfY2hrX3BhdGgsIHBfc19zYikpICE9IC0xICkKLSAgaWYgKCBjb21wX2tleXMoZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpLCBwX3Nfa2V5KSAhPSAxICkKLSAgICAvKiBwX3Nfa2V5IG11c3QgYmUgbGVzcyB0aGFuIHJpZ2h0IGRlbGltaXRpaW5nIGtleSAqLwotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKKwlpZiAoY29tcF9rZXlzKGdldF9sa2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgPT0gMSkKKwkJLyogbGVmdCBkZWxpbWl0aW5nIGtleSBpcyBiaWdnZXIsIHRoYXQgdGhlIGtleSB3ZSBsb29rIGZvciAqLworCQlyZXR1cm4gMDsKKwkvLyAgaWYgKCBjb21wX2tleXMocF9zX2tleSwgZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpKSAhPSAtMSApCisJaWYgKGNvbXBfa2V5cyhnZXRfcmtleShwX3NfY2hrX3BhdGgsIHBfc19zYiksIHBfc19rZXkpICE9IDEpCisJCS8qIHBfc19rZXkgbXVzdCBiZSBsZXNzIHRoYW4gcmlnaHQgZGVsaW1pdGlpbmcga2V5ICovCisJCXJldHVybiAwOworCXJldHVybiAxOwogfQogCi0KLWlubGluZSB2b2lkIGRlY3JlbWVudF9iY291bnQoCi0gICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmgKLSAgICAgICAgICAgICkgeyAKLSAgaWYgKCBwX3NfYmggKSB7Ci0gICAgaWYgKCBhdG9taWNfcmVhZCAoJihwX3NfYmgtPmJfY291bnQpKSApIHsKLSAgICAgIHB1dF9iaChwX3NfYmgpIDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVpc2VyZnNfcGFuaWMoTlVMTCwgIlBBUC01MDcwOiBkZWNyZW1lbnRfYmNvdW50OiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJ1ZmZlciAlYiIsIHBfc19iaCk7Ci0gIH0KK2lubGluZSB2b2lkIGRlY3JlbWVudF9iY291bnQoc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmgpCit7CisJaWYgKHBfc19iaCkgeworCQlpZiAoYXRvbWljX3JlYWQoJihwX3NfYmgtPmJfY291bnQpKSkgeworCQkJcHV0X2JoKHBfc19iaCk7CisJCQlyZXR1cm47CisJCX0KKwkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCSAgICAgICAiUEFQLTUwNzA6IGRlY3JlbWVudF9iY291bnQ6IHRyeWluZyB0byBmcmVlIGZyZWUgYnVmZmVyICViIiwKKwkJCSAgICAgICBwX3NfYmgpOworCX0KIH0KIAotCiAvKiBEZWNyZW1lbnQgYl9jb3VudCBmaWVsZCBvZiB0aGUgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguICovCi12b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoICgKLSAgICAgICAgICAgICAgc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgKLSAgICAgICAgICAgICkgewotICBpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7Cit2b2lkIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpCit7CisJaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOwogCi0gIFJGQUxTRSggbl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCB8fAotCSAgbl9wYXRoX29mZnNldCA+IEVYVEVOREVEX01BWF9IRUlHSFQgLSAxLAotCSAgIlBBUC01MDgwOiBpbnZhbGlkIHBhdGggb2Zmc2V0IG9mICVkIiwgbl9wYXRoX29mZnNldCk7CisJUkZBTFNFKG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgfHwKKwkgICAgICAgbl9wYXRoX29mZnNldCA+IEVYVEVOREVEX01BWF9IRUlHSFQgLSAxLAorCSAgICAgICAiUEFQLTUwODA6IGludmFsaWQgcGF0aCBvZmZzZXQgb2YgJWQiLCBuX3BhdGhfb2Zmc2V0KTsKIAotICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJd2hpbGUgKG5fcGF0aF9vZmZzZXQgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAotICAgIGJoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSk7Ci0gICAgZGVjcmVtZW50X2Jjb3VudCAoYmgpOwotICB9Ci0gIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7CisJCWJoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSk7CisJCWRlY3JlbWVudF9iY291bnQoYmgpOworCX0KKwlwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOwogfQogCi0KLWludCByZWlzZXJmc19jaGVja19wYXRoKHN0cnVjdCBwYXRoICpwKSB7Ci0gIFJGQUxTRSggcC0+cGF0aF9sZW5ndGggIT0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULAotCSAgInBhdGggbm90IHByb3Blcmx5IHJlbHNlZCIpIDsKLSAgcmV0dXJuIDAgOworaW50IHJlaXNlcmZzX2NoZWNrX3BhdGgoc3RydWN0IHBhdGggKnApCit7CisJUkZBTFNFKHAtPnBhdGhfbGVuZ3RoICE9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICAgICAgInBhdGggbm90IHByb3Blcmx5IHJlbHNlZCIpOworCXJldHVybiAwOwogfQogCi0KIC8qIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgaW4gdGhlIHBhdGguIFJlc3RvcmUgZGlydHkgYml0cyBjbGVhbgogKiogd2hlbiBwcmVwYXJpbmcgdGhlIGJ1ZmZlciBmb3IgdGhlIGxvZwogKioKICoqIG9ubHkgY2FsbGVkIGZyb20gZml4X25vZGVzKCkKICovCi12b2lkICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUgKAotCXN0cnVjdCBzdXBlcl9ibG9jayAqcywgCi0gICAgICAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoCi0gICAgICApIHsKLSAgaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOwordm9pZCBwYXRocmVsc2VfYW5kX3Jlc3RvcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQoreworCWludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKIAotICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsIAotCSAgImNsbS00MDAwOiBpbnZhbGlkIHBhdGggb2Zmc2V0Iik7Ci0gIAotICB3aGlsZSAoIG5fcGF0aF9vZmZzZXQgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSAgewotICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHMsIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3BhdGhfb2Zmc2V0KSk7Ci0gICAgYnJlbHNlKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pKTsKLSAgfQotICBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoID0gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUOworCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgICAgICAiY2xtLTQwMDA6IGludmFsaWQgcGF0aCBvZmZzZXQiKTsKKworCXdoaWxlIChuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSB7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHMsCisJCQkJCQkgUEFUSF9PRkZTRVRfUEJVRkZFUgorCQkJCQkJIChwX3Nfc2VhcmNoX3BhdGgsCisJCQkJCQkgIG5fcGF0aF9vZmZzZXQpKTsKKwkJYnJlbHNlKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pKTsKKwl9CisJcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKIH0KIAogLyogUmVsZWFzZSBhbGwgYnVmZmVycyBpbiB0aGUgcGF0aC4gKi8KLXZvaWQgIHBhdGhyZWxzZSAoCi0gICAgICAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoCi0gICAgICApIHsKLSAgaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOwotCi0gIFJGQUxTRSggbl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKLQkgICJQQVAtNTA5MDogaW52YWxpZCBwYXRoIG9mZnNldCIpOwotICAKLSAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgIAotICAgIGJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7Ci0KLSAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgaXNfbGVhZiAoY2hhciAqIGJ1ZiwgaW50IGJsb2Nrc2l6ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit2b2lkIHBhdGhyZWxzZShzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKQogewotICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgaW50IHVzZWRfc3BhY2U7Ci0gICAgaW50IHByZXZfbG9jYXRpb247Ci0gICAgaW50IGk7Ci0gICAgaW50IG5yOworCWludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKIAotICAgIGJsa2ggPSAoc3RydWN0IGJsb2NrX2hlYWQgKilidWY7Ci0gICAgaWYgKCBibGtoX2xldmVsKGJsa2gpICE9IERJU0tfTEVBRl9OT0RFX0xFVkVMKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IHRoaXMgc2hvdWxkIGJlIGNhdWdodCBlYXJsaWVyIik7Ci0JcmV0dXJuIDA7Ci0gICAgfQorCVJGQUxTRShuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULAorCSAgICAgICAiUEFQLTUwOTA6IGludmFsaWQgcGF0aCBvZmZzZXQiKTsKIAotICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOwotICAgIGlmIChuciA8IDEgfHwgbnIgPiAoKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSkgLyAoSUhfU0laRSArIE1JTl9JVEVNX0xFTikpKSB7Ci0JLyogaXRlbSBudW1iZXIgaXMgdG9vIGJpZyBvciB0b28gc21hbGwgKi8KLQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfbGVhZjogbnJfaXRlbSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKSArIG5yIC0gMTsKLSAgICB1c2VkX3NwYWNlID0gQkxLSF9TSVpFICsgSUhfU0laRSAqIG5yICsgKGJsb2Nrc2l6ZSAtIGloX2xvY2F0aW9uIChpaCkpOwotICAgIGlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgewotCS8qIGZyZWUgc3BhY2UgZG9lcyBub3QgbWF0Y2ggdG8gY2FsY3VsYXRlZCBhbW91bnQgb2YgdXNlIHNwYWNlICovCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IGZyZWUgc3BhY2Ugc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOwotCXJldHVybiAwOwotICAgIH0KKwl3aGlsZSAobl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkKKwkJYnJlbHNlKFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3NlYXJjaF9wYXRoLCBuX3BhdGhfb2Zmc2V0LS0pKTsKIAotICAgIC8vIEZJWE1FOiBpdCBpc19sZWFmIHdpbGwgaGl0IHBlcmZvcm1hbmNlIHRvbyBtdWNoIC0gd2UgbWF5IGhhdmUKLSAgICAvLyByZXR1cm4gMSBoZXJlCi0KLSAgICAvKiBjaGVjayB0YWJsZXMgb2YgaXRlbSBoZWFkcyAqLwotICAgIGloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKTsKLSAgICBwcmV2X2xvY2F0aW9uID0gYmxvY2tzaXplOwotICAgIGZvciAoaSA9IDA7IGkgPCBucjsgaSArKywgaWggKyspIHsKLQlpZiAoIGxlX2loX2tfdHlwZShpaCkgPT0gVFlQRV9BTlkpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IHdyb25nIGl0ZW0gdHlwZSBmb3IgaXRlbSAlaCIsaWgpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JaWYgKGloX2xvY2F0aW9uIChpaCkgPj0gYmxvY2tzaXplIHx8IGloX2xvY2F0aW9uIChpaCkgPCBJSF9TSVpFICogbnIpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IGl0ZW0gbG9jYXRpb24gc2VlbXMgd3Jvbmc6ICVoIiwgaWgpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JaWYgKGloX2l0ZW1fbGVuIChpaCkgPCAxIHx8IGloX2l0ZW1fbGVuIChpaCkgPiBNQVhfSVRFTV9MRU4gKGJsb2Nrc2l6ZSkpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IGl0ZW0gbGVuZ3RoIHNlZW1zIHdyb25nOiAlaCIsIGloKTsKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWlmIChwcmV2X2xvY2F0aW9uIC0gaWhfbG9jYXRpb24gKGloKSAhPSBpaF9pdGVtX2xlbiAoaWgpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nIChzZWNvbmQgb25lKTogJWgiLCBpaCk7Ci0JICAgIHJldHVybiAwOwotCX0KLQlwcmV2X2xvY2F0aW9uID0gaWhfbG9jYXRpb24gKGloKTsKLSAgICB9Ci0KLSAgICAvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcwotICAgIHJldHVybiAxOworCXBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7CiB9CiAKK3N0YXRpYyBpbnQgaXNfbGVhZihjaGFyICpidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGJsb2NrX2hlYWQgKmJsa2g7CisJc3RydWN0IGl0ZW1faGVhZCAqaWg7CisJaW50IHVzZWRfc3BhY2U7CisJaW50IHByZXZfbG9jYXRpb247CisJaW50IGk7CisJaW50IG5yOworCisJYmxraCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKKwlpZiAoYmxraF9sZXZlbChibGtoKSAhPSBESVNLX0xFQUZfTk9ERV9MRVZFTCkgeworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJpc19sZWFmOiB0aGlzIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciIpOworCQlyZXR1cm4gMDsKKwl9CisKKwluciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKwlpZiAobnIgPCAxIHx8IG5yID4gKChibG9ja3NpemUgLSBCTEtIX1NJWkUpIC8gKElIX1NJWkUgKyBNSU5fSVRFTV9MRU4pKSkgeworCQkvKiBpdGVtIG51bWJlciBpcyB0b28gYmlnIG9yIHRvbyBzbWFsbCAqLworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJpc19sZWFmOiBucl9pdGVtIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCWloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKSArIG5yIC0gMTsKKwl1c2VkX3NwYWNlID0gQkxLSF9TSVpFICsgSUhfU0laRSAqIG5yICsgKGJsb2Nrc2l6ZSAtIGloX2xvY2F0aW9uKGloKSk7CisJaWYgKHVzZWRfc3BhY2UgIT0gYmxvY2tzaXplIC0gYmxraF9mcmVlX3NwYWNlKGJsa2gpKSB7CisJCS8qIGZyZWUgc3BhY2UgZG9lcyBub3QgbWF0Y2ggdG8gY2FsY3VsYXRlZCBhbW91bnQgb2YgdXNlIHNwYWNlICovCisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwgImlzX2xlYWY6IGZyZWUgc3BhY2Ugc2VlbXMgd3Jvbmc6ICV6IiwKKwkJCQkgYmgpOworCQlyZXR1cm4gMDsKKwl9CisJLy8gRklYTUU6IGl0IGlzX2xlYWYgd2lsbCBoaXQgcGVyZm9ybWFuY2UgdG9vIG11Y2ggLSB3ZSBtYXkgaGF2ZQorCS8vIHJldHVybiAxIGhlcmUKKworCS8qIGNoZWNrIHRhYmxlcyBvZiBpdGVtIGhlYWRzICovCisJaWggPSAoc3RydWN0IGl0ZW1faGVhZCAqKShidWYgKyBCTEtIX1NJWkUpOworCXByZXZfbG9jYXRpb24gPSBibG9ja3NpemU7CisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyssIGloKyspIHsKKwkJaWYgKGxlX2loX2tfdHlwZShpaCkgPT0gVFlQRV9BTlkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkJICJpc19sZWFmOiB3cm9uZyBpdGVtIHR5cGUgZm9yIGl0ZW0gJWgiLAorCQkJCQkgaWgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGloX2xvY2F0aW9uKGloKSA+PSBibG9ja3NpemUKKwkJICAgIHx8IGloX2xvY2F0aW9uKGloKSA8IElIX1NJWkUgKiBucikgeworCQkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCQkgImlzX2xlYWY6IGl0ZW0gbG9jYXRpb24gc2VlbXMgd3Jvbmc6ICVoIiwKKwkJCQkJIGloKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChpaF9pdGVtX2xlbihpaCkgPCAxCisJCSAgICB8fCBpaF9pdGVtX2xlbihpaCkgPiBNQVhfSVRFTV9MRU4oYmxvY2tzaXplKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCQkgImlzX2xlYWY6IGl0ZW0gbGVuZ3RoIHNlZW1zIHdyb25nOiAlaCIsCisJCQkJCSBpaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAocHJldl9sb2NhdGlvbiAtIGloX2xvY2F0aW9uKGloKSAhPSBpaF9pdGVtX2xlbihpaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkJICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nIChzZWNvbmQgb25lKTogJWgiLAorCQkJCQkgaWgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJldl9sb2NhdGlvbiA9IGloX2xvY2F0aW9uKGloKTsKKwl9CisKKwkvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcworCXJldHVybiAxOworfQogCiAvKiByZXR1cm5zIDEgaWYgYnVmIGxvb2tzIGxpa2UgYW4gaW50ZXJuYWwgbm9kZSwgMCBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbnQgaXNfaW50ZXJuYWwgKGNoYXIgKiBidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQorc3RhdGljIGludCBpc19pbnRlcm5hbChjaGFyICpidWYsIGludCBibG9ja3NpemUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7Ci0gICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOwotICAgIGludCBucjsKLSAgICBpbnQgdXNlZF9zcGFjZTsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKwlpbnQgbnI7CisJaW50IHVzZWRfc3BhY2U7CiAKLSAgICBibGtoID0gKHN0cnVjdCBibG9ja19oZWFkICopYnVmOwotICAgIG5yID0gYmxraF9sZXZlbChibGtoKTsKLSAgICBpZiAobnIgPD0gRElTS19MRUFGX05PREVfTEVWRUwgfHwgbnIgPiBNQVhfSEVJR0hUKSB7Ci0JLyogdGhpcyBsZXZlbCBpcyBub3QgcG9zc2libGUgZm9yIGludGVybmFsIG5vZGVzICovCi0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2ludGVybmFsOiB0aGlzIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciIpOwotCXJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKLSAgICBpZiAobnIgPiAoYmxvY2tzaXplIC0gQkxLSF9TSVpFIC0gRENfU0laRSkgLyAoS0VZX1NJWkUgKyBEQ19TSVpFKSkgewotCS8qIGZvciBpbnRlcm5hbCB3aGljaCBpcyBub3Qgcm9vdCB3ZSBtaWdodCBjaGVjayBtaW4gbnVtYmVyIG9mIGtleXMgKi8KLQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfaW50ZXJuYWw6IG51bWJlciBvZiBrZXkgc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOwotCXJldHVybiAwOwotICAgIH0KKwlibGtoID0gKHN0cnVjdCBibG9ja19oZWFkICopYnVmOworCW5yID0gYmxraF9sZXZlbChibGtoKTsKKwlpZiAobnIgPD0gRElTS19MRUFGX05PREVfTEVWRUwgfHwgbnIgPiBNQVhfSEVJR0hUKSB7CisJCS8qIHRoaXMgbGV2ZWwgaXMgbm90IHBvc3NpYmxlIGZvciBpbnRlcm5hbCBub2RlcyAqLworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJpc19pbnRlcm5hbDogdGhpcyBzaG91bGQgYmUgY2F1Z2h0IGVhcmxpZXIiKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIEtFWV9TSVpFICogbnIgKyBEQ19TSVpFICogKG5yICsgMSk7Ci0gICAgaWYgKHVzZWRfc3BhY2UgIT0gYmxvY2tzaXplIC0gYmxraF9mcmVlX3NwYWNlKGJsa2gpKSB7Ci0JcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2ludGVybmFsOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKLQlyZXR1cm4gMDsKLSAgICB9CisJbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisJaWYgKG5yID4gKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSAtIERDX1NJWkUpIC8gKEtFWV9TSVpFICsgRENfU0laRSkpIHsKKwkJLyogZm9yIGludGVybmFsIHdoaWNoIGlzIG5vdCByb290IHdlIG1pZ2h0IGNoZWNrIG1pbiBudW1iZXIgb2Yga2V5cyAqLworCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsCisJCQkJICJpc19pbnRlcm5hbDogbnVtYmVyIG9mIGtleSBzZWVtcyB3cm9uZzogJXoiLAorCQkJCSBiaCk7CisJCXJldHVybiAwOworCX0KIAotICAgIC8vIG9uZSBtYXkgaW1hZ2luZSBtdWNoIG1vcmUgY2hlY2tzCi0gICAgcmV0dXJuIDE7CisJdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIEtFWV9TSVpFICogbnIgKyBEQ19TSVpFICogKG5yICsgMSk7CisJaWYgKHVzZWRfc3BhY2UgIT0gYmxvY2tzaXplIC0gYmxraF9mcmVlX3NwYWNlKGJsa2gpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKKwkJCQkgImlzX2ludGVybmFsOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCS8vIG9uZSBtYXkgaW1hZ2luZSBtdWNoIG1vcmUgY2hlY2tzCisJcmV0dXJuIDE7CiB9CiAKLQogLy8gbWFrZSBzdXJlIHRoYXQgYmggY29udGFpbnMgZm9ybWF0dGVkIG5vZGUgb2YgcmVpc2VyZnMgdHJlZSBvZgogLy8gJ2xldmVsJy10aCBsZXZlbAotc3RhdGljIGludCBpc190cmVlX25vZGUgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgbGV2ZWwpCitzdGF0aWMgaW50IGlzX3RyZWVfbm9kZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgbGV2ZWwpCiB7Ci0gICAgaWYgKEJfTEVWRUwgKGJoKSAhPSBsZXZlbCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc190cmVlX25vZGU6IG5vZGUgbGV2ZWwgJWQgZG9lcyBub3QgbWF0Y2ggdG8gdGhlIGV4cGVjdGVkIG9uZSAlZCIsCi0JCUJfTEVWRUwgKGJoKSwgbGV2ZWwpOwotCXJldHVybiAwOwotICAgIH0KLSAgICBpZiAobGV2ZWwgPT0gRElTS19MRUFGX05PREVfTEVWRUwpCi0JcmV0dXJuIGlzX2xlYWYgKGJoLT5iX2RhdGEsIGJoLT5iX3NpemUsIGJoKTsKKwlpZiAoQl9MRVZFTChiaCkgIT0gbGV2ZWwpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAiaXNfdHJlZV9ub2RlOiBub2RlIGxldmVsICVkIGRvZXMgbm90IG1hdGNoIHRvIHRoZSBleHBlY3RlZCBvbmUgJWQiLAorCQkJCSBCX0xFVkVMKGJoKSwgbGV2ZWwpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQorCQlyZXR1cm4gaXNfbGVhZihiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7CiAKLSAgICByZXR1cm4gaXNfaW50ZXJuYWwgKGJoLT5iX2RhdGEsIGJoLT5iX3NpemUsIGJoKTsKKwlyZXR1cm4gaXNfaW50ZXJuYWwoYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSwgYmgpOwogfQogCi0KLQogI2RlZmluZSBTRUFSQ0hfQllfS0VZX1JFQURBIDE2CiAKIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KLXN0YXRpYyB2b2lkIHNlYXJjaF9ieV9rZXlfcmVhZGEgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKLQkJCQkgdW5zaWduZWQgbG9uZyAqYiwgaW50IG51bSkKK3N0YXRpYyB2b2lkIHNlYXJjaF9ieV9rZXlfcmVhZGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCXVuc2lnbmVkIGxvbmcgKmIsIGludCBudW0pCiB7Ci0gICAgaW50IGksajsKLSAgCi0gICAgZm9yIChpID0gMCA7IGkgPCBudW0gOyBpKyspIHsKLQliaFtpXSA9IHNiX2dldGJsayAocywgYltpXSk7Ci0gICAgfQotICAgIGZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykgewotCS8qCi0JICogbm90ZSwgdGhpcyBuZWVkcyBhdHRlbnRpb24gaWYgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZSBCS0wKLQkgKiB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIHByZXBhcmVkIGJpdCBpc24ndCBzZXQgb24gdGhpcyBidWZmZXIKLQkgKi8KLQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtqXSkpCi0JICAgIGxsX3J3X2Jsb2NrKFJFQURBLCAxLCBiaCArIGopOwotICAgIAlicmVsc2UoYmhbal0pOwotICAgIH0KKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQliaFtpXSA9IHNiX2dldGJsayhzLCBiW2ldKTsKKwl9CisJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkvKgorCQkgKiBub3RlLCB0aGlzIG5lZWRzIGF0dGVudGlvbiBpZiB3ZSBhcmUgZ2V0dGluZyByaWQgb2YgdGhlIEJLTAorCQkgKiB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIHByZXBhcmVkIGJpdCBpc24ndCBzZXQgb24gdGhpcyBidWZmZXIKKwkJICovCisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoW2pdKSkKKwkJCWxsX3J3X2Jsb2NrKFJFQURBLCAxLCBiaCArIGopOworCQlicmVsc2UoYmhbal0pOworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01NzYsMTkzICs2MDIsMTk5IEBACiAgICBjb3JyZWN0bmVzcyBvZiB0aGUgdG9wIG9mIHRoZSBwYXRoIGJ1dCBuZWVkIG5vdCBiZSBjaGVja2VkIGZvciB0aGUKICAgIGNvcnJlY3RuZXNzIG9mIHRoZSBib3R0b20gb2YgdGhlIHBhdGggKi8KIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KLWludCBzZWFyY2hfYnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsCi0JCSAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2tleSwgLyogS2V5IHRvIHNlYXJjaC4gKi8KLQkJICAgc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgsIC8qIFRoaXMgc3RydWN0dXJlIHdhcwotCQkJCQkJICAgICBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkCi0JCQkJCQkgICAgIGJ5IHRoZSBjYWxsaW5nCi0JCQkJCQkgICAgIGZ1bmN0aW9uLiBJdCBpcyBmaWxsZWQgdXAKLQkJCQkJCSAgICAgYnkgdGhpcyBmdW5jdGlvbi4gICovCi0JCSAgIGludCBuX3N0b3BfbGV2ZWwgLyogSG93IGZhciBkb3duIHRoZSB0cmVlIHRvIHNlYXJjaC4gVG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgYXQgbGVhZiBsZXZlbCAtIHNldCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTS19MRUFGX05PREVfTEVWRUwgKi8KLSAgICApIHsKLSAgICBpbnQgIG5fYmxvY2tfbnVtYmVyOwotICAgIGludCAgZXhwZWN0ZWRfbGV2ZWw7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqICAgICAgIHBfc19iaDsKLSAgICBzdHJ1Y3QgcGF0aF9lbGVtZW50ICogICAgICAgcF9zX2xhc3RfZWxlbWVudDsKLSAgICBpbnQJCQkJbl9ub2RlX2xldmVsLCBuX3JldHZhbDsKLSAgICBpbnQgCQkJcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlOwotICAgIGludAkJCQlmc19nZW47Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpyZWFkYV9iaFtTRUFSQ0hfQllfS0VZX1JFQURBXTsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgcmVhZGFfYmxvY2tzW1NFQVJDSF9CWV9LRVlfUkVBREFdOwotICAgIGludCByZWFkYV9jb3VudCA9IDA7CitpbnQgc2VhcmNoX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19rZXksCS8qIEtleSB0byBzZWFyY2guICovCisJCSAgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aCwJLyogVGhpcyBzdHJ1Y3R1cmUgd2FzCisJCQkJCQkgICBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkCisJCQkJCQkgICBieSB0aGUgY2FsbGluZworCQkJCQkJICAgZnVuY3Rpb24uIEl0IGlzIGZpbGxlZCB1cAorCQkJCQkJICAgYnkgdGhpcyBmdW5jdGlvbi4gICovCisJCSAgaW50IG5fc3RvcF9sZXZlbAkvKiBIb3cgZmFyIGRvd24gdGhlIHRyZWUgdG8gc2VhcmNoLiBUbworCQkJCQkgICBzdG9wIGF0IGxlYWYgbGV2ZWwgLSBzZXQgdG8KKwkJCQkJICAgRElTS19MRUFGX05PREVfTEVWRUwgKi8KKyAgICApCit7CisJaW50IG5fYmxvY2tfbnVtYmVyOworCWludCBleHBlY3RlZF9sZXZlbDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKKwlzdHJ1Y3QgcGF0aF9lbGVtZW50ICpwX3NfbGFzdF9lbGVtZW50OworCWludCBuX25vZGVfbGV2ZWwsIG5fcmV0dmFsOworCWludCByaWdodF9uZWlnaGJvcl9vZl9sZWFmX25vZGU7CisJaW50IGZzX2dlbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlYWRhX2JoW1NFQVJDSF9CWV9LRVlfUkVBREFdOworCXVuc2lnbmVkIGxvbmcgcmVhZGFfYmxvY2tzW1NFQVJDSF9CWV9LRVlfUkVBREFdOworCWludCByZWFkYV9jb3VudCA9IDA7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBpbnQgbl9yZXBlYXRfY291bnRlciA9IDA7CisJaW50IG5fcmVwZWF0X2NvdW50ZXIgPSAwOwogI2VuZGlmCi0gICAgCi0gICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzZWFyY2hfYnlfa2V5ICk7Ci0gICAgCi0gICAgLyogQXMgd2UgYWRkIGVhY2ggbm9kZSB0byBhIHBhdGggd2UgaW5jcmVhc2UgaXRzIGNvdW50LiAgVGhpcyBtZWFucyB0aGF0Ci0gICAgICAgd2UgbXVzdCBiZSBjYXJlZnVsIHRvIHJlbGVhc2UgYWxsIG5vZGVzIGluIGEgcGF0aCBiZWZvcmUgd2UgZWl0aGVyCi0gICAgICAgZGlzY2FyZCB0aGUgcGF0aCBzdHJ1Y3Qgb3IgcmUtdXNlIHRoZSBwYXRoIHN0cnVjdCwgYXMgd2UgZG8gaGVyZS4gKi8KIAotICAgIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHBfc19zZWFyY2hfcGF0aCk7CisJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIHNlYXJjaF9ieV9rZXkpOwogCi0gICAgcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlID0gMDsKKwkvKiBBcyB3ZSBhZGQgZWFjaCBub2RlIHRvIGEgcGF0aCB3ZSBpbmNyZWFzZSBpdHMgY291bnQuICBUaGlzIG1lYW5zIHRoYXQKKwkgICB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gcmVsZWFzZSBhbGwgbm9kZXMgaW4gYSBwYXRoIGJlZm9yZSB3ZSBlaXRoZXIKKwkgICBkaXNjYXJkIHRoZSBwYXRoIHN0cnVjdCBvciByZS11c2UgdGhlIHBhdGggc3RydWN0LCBhcyB3ZSBkbyBoZXJlLiAqLwogCi0gICAgLyogV2l0aCBlYWNoIGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3Agd2Ugc2VhcmNoIHRocm91Z2ggdGhlIGl0ZW1zIGluIHRoZQotICAgICAgIGN1cnJlbnQgbm9kZSwgYW5kIGNhbGN1bGF0ZSB0aGUgbmV4dCBjdXJyZW50IG5vZGUobmV4dCBwYXRoIGVsZW1lbnQpCi0gICAgICAgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiBvZiB0aGlzIGxvb3AuLiAqLwotICAgIG5fYmxvY2tfbnVtYmVyID0gU0JfUk9PVF9CTE9DSyAocF9zX3NiKTsKLSAgICBleHBlY3RlZF9sZXZlbCA9IC0xOwotICAgIHdoaWxlICggMSApIHsKKwlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOworCisJcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlID0gMDsKKworCS8qIFdpdGggZWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIHdlIHNlYXJjaCB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUKKwkgICBjdXJyZW50IG5vZGUsIGFuZCBjYWxjdWxhdGUgdGhlIG5leHQgY3VycmVudCBub2RlKG5leHQgcGF0aCBlbGVtZW50KQorCSAgIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhpcyBsb29wLi4gKi8KKwluX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0socF9zX3NiKTsKKwlleHBlY3RlZF9sZXZlbCA9IC0xOworCXdoaWxlICgxKSB7CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlpZiAoICEoKytuX3JlcGVhdF9jb3VudGVyICUgNTAwMDApICkKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiUEFQLTUxMDA6IHNlYXJjaF9ieV9rZXk6ICVzOiIKLQkJCSAgICAgICJ0aGVyZSB3ZXJlICVkIGl0ZXJhdGlvbnMgb2Ygd2hpbGUgbG9vcCAiCi0JCQkgICAgICAibG9va2luZyBmb3Iga2V5ICVLIiwKLQkJCSAgICAgIGN1cnJlbnQtPmNvbW0sIG5fcmVwZWF0X2NvdW50ZXIsIHBfc19rZXkpOworCQlpZiAoISgrK25fcmVwZWF0X2NvdW50ZXIgJSA1MDAwMCkpCisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19zYiwgIlBBUC01MTAwOiBzZWFyY2hfYnlfa2V5OiAlczoiCisJCQkJCSAidGhlcmUgd2VyZSAlZCBpdGVyYXRpb25zIG9mIHdoaWxlIGxvb3AgIgorCQkJCQkgImxvb2tpbmcgZm9yIGtleSAlSyIsCisJCQkJCSBjdXJyZW50LT5jb21tLCBuX3JlcGVhdF9jb3VudGVyLAorCQkJCQkgcF9zX2tleSk7CiAjZW5kaWYKIAotCS8qIHByZXAgcGF0aCB0byBoYXZlIGFub3RoZXIgZWxlbWVudCBhZGRlZCB0byBpdC4gKi8KLQlwX3NfbGFzdF9lbGVtZW50ID0gUEFUSF9PRkZTRVRfUEVMRU1FTlQocF9zX3NlYXJjaF9wYXRoLCArK3Bfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGgpOwotCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChwX3Nfc2IpOworCQkvKiBwcmVwIHBhdGggdG8gaGF2ZSBhbm90aGVyIGVsZW1lbnQgYWRkZWQgdG8gaXQuICovCisJCXBfc19sYXN0X2VsZW1lbnQgPQorCQkgICAgUEFUSF9PRkZTRVRfUEVMRU1FTlQocF9zX3NlYXJjaF9wYXRoLAorCQkJCQkgKytwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoKTsKKwkJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24ocF9zX3NiKTsKIAotCS8qIFJlYWQgdGhlIG5leHQgdHJlZSBub2RlLCBhbmQgc2V0IHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHBhdGggdG8KLSAgICAgICAgICAgaGF2ZSBhIHBvaW50ZXIgdG8gaXQuICovCi0JaWYgKChwX3NfYmggPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9idWZmZXIgPQotCSAgICAgc2JfZ2V0YmxrKHBfc19zYiwgbl9ibG9ja19udW1iZXIpKSApIHsKLQkgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSAmJiByZWFkYV9jb3VudCA+IDEpIHsKLQkJc2VhcmNoX2J5X2tleV9yZWFkYSAocF9zX3NiLCByZWFkYV9iaCwKLQkJICAgICAgICAgICAgICAgICAgICAgcmVhZGFfYmxvY2tzLCByZWFkYV9jb3VudCk7Ci0JICAgIH0KLQkgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJnBfc19iaCk7Ci0JICAgIHdhaXRfb25fYnVmZmVyKHBfc19iaCk7Ci0JICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkpCi0JICAgICAgICBnb3RvIGlvX2Vycm9yOwotCX0gZWxzZSB7Ci1pb19lcnJvcjoKLQkgICAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCAtLTsKLQkgICAgcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7Ci0JICAgIHJldHVybiBJT19FUlJPUjsKLQl9Ci0JcmVhZGFfY291bnQgPSAwOwotCWlmIChleHBlY3RlZF9sZXZlbCA9PSAtMSkKLQkJZXhwZWN0ZWRfbGV2ZWwgPSBTQl9UUkVFX0hFSUdIVCAocF9zX3NiKTsKLQlleHBlY3RlZF9sZXZlbCAtLTsKLQotCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgc2NoZWR1bGUgb2NjdXJyZWQuIFdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUga2V5Ci0JICAgdG8gc2VhcmNoIGlzIHN0aWxsIGluIHRoZSB0cmVlIHJvb3RlZCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlci4gSWYKLQkgICBub3QgdGhlbiByZXBlYXQgc2VhcmNoIGZyb20gdGhlIHJvb3QuICovCi0JaWYgKCBmc19jaGFuZ2VkIChmc19nZW4sIHBfc19zYikgJiYgCi0JICAgICghQl9JU19JTl9UUkVFIChwX3NfYmgpIHx8Ci0JICAgICBCX0xFVkVMKHBfc19iaCkgIT0gZXhwZWN0ZWRfbGV2ZWwgfHwKLQkgICAgICFrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSkpIHsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQgKTsKLQkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZCApOwotCSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIHNia19yZXN0YXJ0ZWRbIGV4cGVjdGVkX2xldmVsIC0gMSBdICk7Ci0JICAgIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHBfc19zZWFyY2hfcGF0aCk7Ci0JICAgIAotCSAgICAvKiBHZXQgdGhlIHJvb3QgYmxvY2sgbnVtYmVyIHNvIHRoYXQgd2UgY2FuIHJlcGVhdCB0aGUgc2VhcmNoCi0JICAgICAgIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QuICovCi0JICAgIG5fYmxvY2tfbnVtYmVyID0gU0JfUk9PVF9CTE9DSyAocF9zX3NiKTsKLQkgICAgZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKLQkgICAgcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlID0gMDsKLQkgICAgCi0JICAgIC8qIHJlcGVhdCBzZWFyY2ggZnJvbSB0aGUgcm9vdCAqLwotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgICAgLyogb25seSBjaGVjayB0aGF0IHRoZSBrZXkgaXMgaW4gdGhlIGJ1ZmZlciBpZiBwX3Nfa2V5IGlzIG5vdAotICAgICAgICAgICBlcXVhbCB0byB0aGUgTUFYX0tFWS4gTGF0dGVyIGNhc2UgaXMgb25seSBwb3NzaWJsZSBpbgotICAgICAgICAgICAiZmluaXNoX3VuZmluaXNoZWQoKSIgcHJvY2Vzc2luZyBkdXJpbmcgbW91bnQuICovCi0gICAgICAgIFJGQUxTRSggY29tcF9rZXlzKCAmTUFYX0tFWSwgcF9zX2tleSApICYmCi0gICAgICAgICAgICAgICAgISBrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSwKLQkJIlBBUC01MTMwOiBrZXkgaXMgbm90IGluIHRoZSBidWZmZXIiKTsKLSNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlpZiAoIGN1cl90YiApIHsKLQkgICAgcHJpbnRfY3VyX3RiICgiNTE0MCIpOwotCSAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJQQVAtNTE0MDogc2VhcmNoX2J5X2tleTogc2NoZWR1bGUgb2NjdXJyZWQgaW4gZG9fYmFsYW5jZSEiKTsKLQl9Ci0jZW5kaWYKLQotCS8vIG1ha2Ugc3VyZSwgdGhhdCB0aGUgbm9kZSBjb250ZW50cyBsb29rIGxpa2UgYSBub2RlIG9mCi0JLy8gY2VydGFpbiBsZXZlbAotCWlmICghaXNfdHJlZV9ub2RlIChwX3NfYmgsIGV4cGVjdGVkX2xldmVsKSkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJ2cy01MTUwOiBzZWFyY2hfYnlfa2V5OiAiCi0JCQkgICAgICAiaW52YWxpZCBmb3JtYXQgZm91bmQgaW4gYmxvY2sgJWxkLiBGc2NrPyIsCi0JCQkgICAgICBwX3NfYmgtPmJfYmxvY2tucik7Ci0JICAgIHBhdGhyZWxzZSAocF9zX3NlYXJjaF9wYXRoKTsKLQkgICAgcmV0dXJuIElPX0VSUk9SOwotCX0KLQkKLQkvKiBvaywgd2UgaGF2ZSBhY3F1aXJlZCBuZXh0IGZvcm1hdHRlZCBub2RlIGluIHRoZSB0cmVlICovCi0Jbl9ub2RlX2xldmVsID0gQl9MRVZFTCAocF9zX2JoKTsKLQotCVBST0NfSU5GT19CSF9TVEFUKCBwX3Nfc2IsIHBfc19iaCwgbl9ub2RlX2xldmVsIC0gMSApOwotCi0JUkZBTFNFKCBuX25vZGVfbGV2ZWwgPCBuX3N0b3BfbGV2ZWwsCi0JCSJ2cy01MTUyOiB0cmVlIGxldmVsICglZCkgaXMgbGVzcyB0aGFuIHN0b3AgbGV2ZWwgKCVkKSIsCi0JCW5fbm9kZV9sZXZlbCwgbl9zdG9wX2xldmVsKTsKLQotCW5fcmV0dmFsID0gYmluX3NlYXJjaCggcF9zX2tleSwgQl9OX1BJVEVNX0hFQUQocF9zX2JoLCAwKSwKLSAgICAgICAgICAgICAgICBCX05SX0lURU1TKHBfc19iaCksCi0gICAgICAgICAgICAgICAgKCBuX25vZGVfbGV2ZWwgPT0gRElTS19MRUFGX05PREVfTEVWRUwgKSA/IElIX1NJWkUgOiBLRVlfU0laRSwKLSAgICAgICAgICAgICAgICAmKHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKSk7Ci0JaWYgKG5fbm9kZV9sZXZlbCA9PSBuX3N0b3BfbGV2ZWwpIHsKLQkgICAgcmV0dXJuIG5fcmV0dmFsOwotCX0KLQotCS8qIHdlIGFyZSBub3QgaW4gdGhlIHN0b3AgbGV2ZWwgKi8KLQlpZiAobl9yZXR2YWwgPT0gSVRFTV9GT1VORCkKLQkgICAgLyogaXRlbSBoYXMgYmVlbiBmb3VuZCwgc28gd2UgY2hvb3NlIHRoZSBwb2ludGVyIHdoaWNoIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgZm91bmQgb25lICovCi0JICAgIHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKys7Ci0KLQkvKiBpZiBpdGVtIHdhcyBub3QgZm91bmQgd2UgY2hvb3NlIHRoZSBwb3NpdGlvbiB3aGljaCBpcyB0bwotCSAgIHRoZSBsZWZ0IG9mIHRoZSBmb3VuZCBpdGVtLiBUaGlzIHJlcXVpcmVzIG5vIGNvZGUsCi0JICAgYmluX3NlYXJjaCBkaWQgaXQgYWxyZWFkeS4qLwotCi0JLyogU28gd2UgaGF2ZSBjaG9zZW4gYSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBub2RlIHdoaWNoIGlzCi0JICAgYW4gaW50ZXJuYWwgbm9kZS4gIE5vdyB3ZSBjYWxjdWxhdGUgY2hpbGQgYmxvY2sgbnVtYmVyIGJ5Ci0JICAgcG9zaXRpb24gaW4gdGhlIG5vZGUuICovCi0Jbl9ibG9ja19udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc19iaCwgcF9zX2xhc3RfZWxlbWVudC0+cGVfcG9zaXRpb24pOwotCi0JLyogaWYgd2UgYXJlIGdvaW5nIHRvIHJlYWQgbGVhZiBub2RlcywgdHJ5IGZvciByZWFkIGFoZWFkIGFzIHdlbGwgKi8KLQlpZiAoKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBKSAmJgotCSAgICBuX25vZGVfbGV2ZWwgPT0gRElTS19MRUFGX05PREVfTEVWRUwgKyAxKQotCXsKLQkgICAgaW50IHBvcyA9IHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uOwotCSAgICBpbnQgbGltaXQgPSBCX05SX0lURU1TKHBfc19iaCk7Ci0JICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKmxlX2tleTsKLQotCSAgICBpZiAocF9zX3NlYXJjaF9wYXRoLT5yZWFkYSAmIFBBVEhfUkVBREFfQkFDSykKLQkJbGltaXQgPSAwOwotCSAgICB3aGlsZShyZWFkYV9jb3VudCA8IFNFQVJDSF9CWV9LRVlfUkVBREEpIHsKLQkJaWYgKHBvcyA9PSBsaW1pdCkKLQkJICAgIGJyZWFrOwotCSAgICAgICAgcmVhZGFfYmxvY2tzW3JlYWRhX2NvdW50KytdID0gQl9OX0NISUxEX05VTShwX3NfYmgsIHBvcyk7Ci0JCWlmIChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQV9CQUNLKQotCQkgICAgcG9zLS07Ci0JCWVsc2UKLQkJICAgIHBvcysrOwotCi0JCS8qCi0JCSAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBpbiB0aGUgc2FtZSBvYmplY3QKLQkJICovCi0JCWxlX2tleSA9IEJfTl9QREVMSU1fS0VZKHBfc19iaCwgcG9zKTsKLQkJaWYgKGxlMzJfdG9fY3B1KGxlX2tleS0+a19vYmplY3RpZCkgIT0KLQkJICAgIHBfc19rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpCi0JCXsKLQkJICAgIGJyZWFrOworCQkvKiBSZWFkIHRoZSBuZXh0IHRyZWUgbm9kZSwgYW5kIHNldCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBwYXRoIHRvCisJCSAgIGhhdmUgYSBwb2ludGVyIHRvIGl0LiAqLworCQlpZiAoKHBfc19iaCA9IHBfc19sYXN0X2VsZW1lbnQtPnBlX2J1ZmZlciA9CisJCSAgICAgc2JfZ2V0YmxrKHBfc19zYiwgbl9ibG9ja19udW1iZXIpKSkgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSAmJiByZWFkYV9jb3VudCA+IDEpIHsKKwkJCQlzZWFyY2hfYnlfa2V5X3JlYWRhKHBfc19zYiwgcmVhZGFfYmgsCisJCQkJCQkgICAgcmVhZGFfYmxvY2tzLCByZWFkYV9jb3VudCk7CisJCQl9CisJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmcF9zX2JoKTsKKwkJCXdhaXRfb25fYnVmZmVyKHBfc19iaCk7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShwX3NfYmgpKQorCQkJCWdvdG8gaW9fZXJyb3I7CisJCX0gZWxzZSB7CisJCSAgICAgIGlvX2Vycm9yOgorCQkJcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aC0tOworCQkJcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7CisJCQlyZXR1cm4gSU9fRVJST1I7CiAJCX0KLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotfQorCQlyZWFkYV9jb3VudCA9IDA7CisJCWlmIChleHBlY3RlZF9sZXZlbCA9PSAtMSkKKwkJCWV4cGVjdGVkX2xldmVsID0gU0JfVFJFRV9IRUlHSFQocF9zX3NiKTsKKwkJZXhwZWN0ZWRfbGV2ZWwtLTsKIAorCQkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNjaGVkdWxlIG9jY3VycmVkLiBXZSBtdXN0IGNoZWNrIHdoZXRoZXIgdGhlIGtleQorCQkgICB0byBzZWFyY2ggaXMgc3RpbGwgaW4gdGhlIHRyZWUgcm9vdGVkIGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyLiBJZgorCQkgICBub3QgdGhlbiByZXBlYXQgc2VhcmNoIGZyb20gdGhlIHJvb3QuICovCisJCWlmIChmc19jaGFuZ2VkKGZzX2dlbiwgcF9zX3NiKSAmJgorCQkgICAgKCFCX0lTX0lOX1RSRUUocF9zX2JoKSB8fAorCQkgICAgIEJfTEVWRUwocF9zX2JoKSAhPSBleHBlY3RlZF9sZXZlbCB8fAorCQkgICAgICFrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSkpIHsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQpOworCQkJUFJPQ19JTkZPX0lOQyhwX3Nfc2IsIHNlYXJjaF9ieV9rZXlfcmVzdGFydGVkKTsKKwkJCVBST0NfSU5GT19JTkMocF9zX3NiLAorCQkJCSAgICAgIHNia19yZXN0YXJ0ZWRbZXhwZWN0ZWRfbGV2ZWwgLSAxXSk7CisJCQlkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOworCisJCQkvKiBHZXQgdGhlIHJvb3QgYmxvY2sgbnVtYmVyIHNvIHRoYXQgd2UgY2FuIHJlcGVhdCB0aGUgc2VhcmNoCisJCQkgICBzdGFydGluZyBmcm9tIHRoZSByb290LiAqLworCQkJbl9ibG9ja19udW1iZXIgPSBTQl9ST09UX0JMT0NLKHBfc19zYik7CisJCQlleHBlY3RlZF9sZXZlbCA9IC0xOworCQkJcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlID0gMDsKKworCQkJLyogcmVwZWF0IHNlYXJjaCBmcm9tIHRoZSByb290ICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIG9ubHkgY2hlY2sgdGhhdCB0aGUga2V5IGlzIGluIHRoZSBidWZmZXIgaWYgcF9zX2tleSBpcyBub3QKKwkJICAgZXF1YWwgdG8gdGhlIE1BWF9LRVkuIExhdHRlciBjYXNlIGlzIG9ubHkgcG9zc2libGUgaW4KKwkJICAgImZpbmlzaF91bmZpbmlzaGVkKCkiIHByb2Nlc3NpbmcgZHVyaW5nIG1vdW50LiAqLworCQlSRkFMU0UoY29tcF9rZXlzKCZNQVhfS0VZLCBwX3Nfa2V5KSAmJgorCQkgICAgICAgIWtleV9pbl9idWZmZXIocF9zX3NlYXJjaF9wYXRoLCBwX3Nfa2V5LCBwX3Nfc2IpLAorCQkgICAgICAgIlBBUC01MTMwOiBrZXkgaXMgbm90IGluIHRoZSBidWZmZXIiKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwkJaWYgKGN1cl90YikgeworCQkJcHJpbnRfY3VyX3RiKCI1MTQwIik7CisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJQQVAtNTE0MDogc2VhcmNoX2J5X2tleTogc2NoZWR1bGUgb2NjdXJyZWQgaW4gZG9fYmFsYW5jZSEiKTsKKwkJfQorI2VuZGlmCisKKwkJLy8gbWFrZSBzdXJlLCB0aGF0IHRoZSBub2RlIGNvbnRlbnRzIGxvb2sgbGlrZSBhIG5vZGUgb2YKKwkJLy8gY2VydGFpbiBsZXZlbAorCQlpZiAoIWlzX3RyZWVfbm9kZShwX3NfYmgsIGV4cGVjdGVkX2xldmVsKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJ2cy01MTUwOiBzZWFyY2hfYnlfa2V5OiAiCisJCQkJCSAiaW52YWxpZCBmb3JtYXQgZm91bmQgaW4gYmxvY2sgJWxkLiBGc2NrPyIsCisJCQkJCSBwX3NfYmgtPmJfYmxvY2tucik7CisJCQlwYXRocmVsc2UocF9zX3NlYXJjaF9wYXRoKTsKKwkJCXJldHVybiBJT19FUlJPUjsKKwkJfQorCisJCS8qIG9rLCB3ZSBoYXZlIGFjcXVpcmVkIG5leHQgZm9ybWF0dGVkIG5vZGUgaW4gdGhlIHRyZWUgKi8KKwkJbl9ub2RlX2xldmVsID0gQl9MRVZFTChwX3NfYmgpOworCisJCVBST0NfSU5GT19CSF9TVEFUKHBfc19zYiwgcF9zX2JoLCBuX25vZGVfbGV2ZWwgLSAxKTsKKworCQlSRkFMU0Uobl9ub2RlX2xldmVsIDwgbl9zdG9wX2xldmVsLAorCQkgICAgICAgInZzLTUxNTI6IHRyZWUgbGV2ZWwgKCVkKSBpcyBsZXNzIHRoYW4gc3RvcCBsZXZlbCAoJWQpIiwKKwkJICAgICAgIG5fbm9kZV9sZXZlbCwgbl9zdG9wX2xldmVsKTsKKworCQluX3JldHZhbCA9IGJpbl9zZWFyY2gocF9zX2tleSwgQl9OX1BJVEVNX0hFQUQocF9zX2JoLCAwKSwKKwkJCQkgICAgICBCX05SX0lURU1TKHBfc19iaCksCisJCQkJICAgICAgKG5fbm9kZV9sZXZlbCA9PQorCQkJCSAgICAgICBESVNLX0xFQUZfTk9ERV9MRVZFTCkgPyBJSF9TSVpFIDoKKwkJCQkgICAgICBLRVlfU0laRSwKKwkJCQkgICAgICAmKHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKSk7CisJCWlmIChuX25vZGVfbGV2ZWwgPT0gbl9zdG9wX2xldmVsKSB7CisJCQlyZXR1cm4gbl9yZXR2YWw7CisJCX0KKworCQkvKiB3ZSBhcmUgbm90IGluIHRoZSBzdG9wIGxldmVsICovCisJCWlmIChuX3JldHZhbCA9PSBJVEVNX0ZPVU5EKQorCQkJLyogaXRlbSBoYXMgYmVlbiBmb3VuZCwgc28gd2UgY2hvb3NlIHRoZSBwb2ludGVyIHdoaWNoIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgZm91bmQgb25lICovCisJCQlwX3NfbGFzdF9lbGVtZW50LT5wZV9wb3NpdGlvbisrOworCisJCS8qIGlmIGl0ZW0gd2FzIG5vdCBmb3VuZCB3ZSBjaG9vc2UgdGhlIHBvc2l0aW9uIHdoaWNoIGlzIHRvCisJCSAgIHRoZSBsZWZ0IG9mIHRoZSBmb3VuZCBpdGVtLiBUaGlzIHJlcXVpcmVzIG5vIGNvZGUsCisJCSAgIGJpbl9zZWFyY2ggZGlkIGl0IGFscmVhZHkuICovCisKKwkJLyogU28gd2UgaGF2ZSBjaG9zZW4gYSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBub2RlIHdoaWNoIGlzCisJCSAgIGFuIGludGVybmFsIG5vZGUuICBOb3cgd2UgY2FsY3VsYXRlIGNoaWxkIGJsb2NrIG51bWJlciBieQorCQkgICBwb3NpdGlvbiBpbiB0aGUgbm9kZS4gKi8KKwkJbl9ibG9ja19udW1iZXIgPQorCQkgICAgQl9OX0NISUxEX05VTShwX3NfYmgsIHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKTsKKworCQkvKiBpZiB3ZSBhcmUgZ29pbmcgdG8gcmVhZCBsZWFmIG5vZGVzLCB0cnkgZm9yIHJlYWQgYWhlYWQgYXMgd2VsbCAqLworCQlpZiAoKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBKSAmJgorCQkgICAgbl9ub2RlX2xldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMICsgMSkgeworCQkJaW50IHBvcyA9IHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uOworCQkJaW50IGxpbWl0ID0gQl9OUl9JVEVNUyhwX3NfYmgpOworCQkJc3RydWN0IHJlaXNlcmZzX2tleSAqbGVfa2V5OworCisJCQlpZiAocF9zX3NlYXJjaF9wYXRoLT5yZWFkYSAmIFBBVEhfUkVBREFfQkFDSykKKwkJCQlsaW1pdCA9IDA7CisJCQl3aGlsZSAocmVhZGFfY291bnQgPCBTRUFSQ0hfQllfS0VZX1JFQURBKSB7CisJCQkJaWYgKHBvcyA9PSBsaW1pdCkKKwkJCQkJYnJlYWs7CisJCQkJcmVhZGFfYmxvY2tzW3JlYWRhX2NvdW50KytdID0KKwkJCQkgICAgQl9OX0NISUxEX05VTShwX3NfYmgsIHBvcyk7CisJCQkJaWYgKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBX0JBQ0spCisJCQkJCXBvcy0tOworCQkJCWVsc2UKKwkJCQkJcG9zKys7CisKKwkJCQkvKgorCQkJCSAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBpbiB0aGUgc2FtZSBvYmplY3QKKwkJCQkgKi8KKwkJCQlsZV9rZXkgPSBCX05fUERFTElNX0tFWShwX3NfYmgsIHBvcyk7CisJCQkJaWYgKGxlMzJfdG9fY3B1KGxlX2tleS0+a19vYmplY3RpZCkgIT0KKwkJCQkgICAgcF9zX2tleS0+b25fZGlza19rZXkua19vYmplY3RpZCkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CiAKIC8qIEZvcm0gdGhlIHBhdGggdG8gYW4gaXRlbSBhbmQgcG9zaXRpb24gaW4gdGhpcyBpdGVtIHdoaWNoIGNvbnRhaW5zCiAgICBmaWxlIGJ5dGUgZGVmaW5lZCBieSBwX3Nfa2V5LiBJZiB0aGVyZSBpcyBubyBzdWNoIGl0ZW0KQEAgLTc4MCw5NCArODEyLDk3IEBACiAgICB1bml0cyBvZiBkaXJlY3RvcnkgZW50cmllcy4gICovCiAKIC8qIFRoZSBmdW5jdGlvbiBpcyBOT1QgU0NIRURVTEUtU0FGRSEgKi8KLWludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiwgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jay4gICAgICAgICAgKi8KLQkJCQljb25zdCBzdHJ1Y3QgY3B1X2tleSAgKiBwX2NwdV9rZXksICAgICAgLyogS2V5IHRvIHNlYXJjaCAoY3B1IHZhcmlhYmxlKSAgICAgICAgICovCi0JCQkJc3RydWN0IHBhdGggICAgICAgICAqIHBfc19zZWFyY2hfcGF0aCAvKiBGaWxsZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgKi8KLSAgICApIHsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogcF9sZV9paDsgLyogcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSAqLwotICAgIGludCAgICAgICAgICAgICAgICAgICBuX2Jsa19zaXplOwotICAgIGxvZmZfdCBpdGVtX29mZnNldCwgb2Zmc2V0OwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7Ci0gICAgaW50IHJldHZhbDsKK2ludCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2suICAgICAgICAgICovCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfY3B1X2tleSwJLyogS2V5IHRvIHNlYXJjaCAoY3B1IHZhcmlhYmxlKSAgICAgICAgICovCisJCQkgICAgICAgc3RydWN0IHBhdGggKnBfc19zZWFyY2hfcGF0aAkvKiBGaWxsZWQgdXAgYnkgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgKi8KKyAgICApCit7CisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsJLyogcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSAqLworCWludCBuX2Jsa19zaXplOworCWxvZmZfdCBpdGVtX29mZnNldCwgb2Zmc2V0OworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJaW50IHJldHZhbDsKIAotICAgIC8qIElmIHNlYXJjaGluZyBmb3IgZGlyZWN0b3J5IGVudHJ5LiAqLwotICAgIGlmICggaXNfZGlyZW50cnlfY3B1X2tleSAocF9jcHVfa2V5KSApCi0JcmV0dXJuICBzZWFyY2hfYnlfZW50cnlfa2V5IChwX3Nfc2IsIHBfY3B1X2tleSwgcF9zX3NlYXJjaF9wYXRoLCAmZGUpOworCS8qIElmIHNlYXJjaGluZyBmb3IgZGlyZWN0b3J5IGVudHJ5LiAqLworCWlmIChpc19kaXJlbnRyeV9jcHVfa2V5KHBfY3B1X2tleSkpCisJCXJldHVybiBzZWFyY2hfYnlfZW50cnlfa2V5KHBfc19zYiwgcF9jcHVfa2V5LCBwX3Nfc2VhcmNoX3BhdGgsCisJCQkJCSAgICZkZSk7CiAKLSAgICAvKiBJZiBub3Qgc2VhcmNoaW5nIGZvciBkaXJlY3RvcnkgZW50cnkuICovCi0gICAgCi0gICAgLyogSWYgaXRlbSBpcyBmb3VuZC4gKi8KLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAocF9zX3NiLCBwX2NwdV9rZXksIHBfc19zZWFyY2hfcGF0aCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikKLQlyZXR1cm4gcmV0dmFsOwotICAgIGlmICggcmV0dmFsID09IElURU1fRk9VTkQgKSAgeworCS8qIElmIG5vdCBzZWFyY2hpbmcgZm9yIGRpcmVjdG9yeSBlbnRyeS4gKi8KIAotCVJGQUxTRSggISBpaF9pdGVtX2xlbigKLSAgICAgICAgICAgICAgICBCX05fUElURU1fSEVBRChQQVRIX1BMQVNUX0JVRkZFUihwX3Nfc2VhcmNoX3BhdGgpLAotCQkJICAgICAgIFBBVEhfTEFTVF9QT1NJVElPTihwX3Nfc2VhcmNoX3BhdGgpKSksCi0JICAgICAgICAiUEFQLTUxNjU6IGl0ZW0gbGVuZ3RoIGVxdWFscyB6ZXJvIik7CisJLyogSWYgaXRlbSBpcyBmb3VuZC4gKi8KKwlyZXR2YWwgPSBzZWFyY2hfaXRlbShwX3Nfc2IsIHBfY3B1X2tleSwgcF9zX3NlYXJjaF9wYXRoKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKQorCQlyZXR1cm4gcmV0dmFsOworCWlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgewogCi0JcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9IDA7Ci0JcmV0dXJuIFBPU0lUSU9OX0ZPVU5EOwotICAgIH0KKwkJUkZBTFNFKCFpaF9pdGVtX2xlbgorCQkgICAgICAgKEJfTl9QSVRFTV9IRUFECisJCQkoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3NlYXJjaF9wYXRoKSwKKwkJCSBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSkpLAorCQkgICAgICAgIlBBUC01MTY1OiBpdGVtIGxlbmd0aCBlcXVhbHMgemVybyIpOwogCi0gICAgUkZBTFNFKCAhIFBBVEhfTEFTVF9QT1NJVElPTihwX3Nfc2VhcmNoX3BhdGgpLAotCSAgICAiUEFQLTUxNzA6IHBvc2l0aW9uIGVxdWFscyB6ZXJvIik7Ci0KLSAgICAvKiBJdGVtIGlzIG5vdCBmb3VuZC4gU2V0IHBhdGggdG8gdGhlIHByZXZpb3VzIGl0ZW0uICovCi0gICAgcF9sZV9paCA9IEJfTl9QSVRFTV9IRUFEKFBBVEhfUExBU1RfQlVGRkVSKHBfc19zZWFyY2hfcGF0aCksIC0tUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpOwotICAgIG5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOwotCi0gICAgaWYgKGNvbXBfc2hvcnRfa2V5cyAoJihwX2xlX2loLT5paF9rZXkpLCBwX2NwdV9rZXkpKSB7Ci0JcmV0dXJuIEZJTEVfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBxdWl0ZSB1Z2x5IHRoaXMgZmFyCi0KLSAgICBpdGVtX29mZnNldCA9IGxlX2loX2tfb2Zmc2V0IChwX2xlX2loKTsKLSAgICBvZmZzZXQgPSBjcHVfa2V5X2tfb2Zmc2V0IChwX2NwdV9rZXkpOwotCi0gICAgLyogTmVlZGVkIGJ5dGUgaXMgY29udGFpbmVkIGluIHRoZSBpdGVtIHBvaW50ZWQgdG8gYnkgdGhlIHBhdGguKi8KLSAgICBpZiAoaXRlbV9vZmZzZXQgPD0gb2Zmc2V0ICYmCi0JaXRlbV9vZmZzZXQgKyBvcF9ieXRlc19udW1iZXIgKHBfbGVfaWgsIG5fYmxrX3NpemUpID4gb2Zmc2V0KSB7Ci0JcG9zX2luX2l0ZW0gKHBfc19zZWFyY2hfcGF0aCkgPSBvZmZzZXQgLSBpdGVtX29mZnNldDsKLQlpZiAoIGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpICkgewotCSAgICBwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSAvPSBuX2Jsa19zaXplOworCQlwb3NfaW5faXRlbShwX3Nfc2VhcmNoX3BhdGgpID0gMDsKKwkJcmV0dXJuIFBPU0lUSU9OX0ZPVU5EOwogCX0KLQlyZXR1cm4gUE9TSVRJT05fRk9VTkQ7Ci0gICAgfQogCi0gICAgLyogTmVlZGVkIGJ5dGUgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZQotICAgICBwYXRoLiBTZXQgcG9zX2luX2l0ZW0gb3V0IG9mIHRoZSBpdGVtLiAqLwotICAgIGlmICggaXNfaW5kaXJlY3RfbGVfaWggKHBfbGVfaWgpICkKLQlwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSA9IGloX2l0ZW1fbGVuKHBfbGVfaWgpIC8gVU5GTV9QX1NJWkU7Ci0gICAgZWxzZQotICAgICAgICBwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSA9IGloX2l0ZW1fbGVuKCBwX2xlX2loICk7Ci0gIAotICAgIHJldHVybiBQT1NJVElPTl9OT1RfRk9VTkQ7CisJUkZBTFNFKCFQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSwKKwkgICAgICAgIlBBUC01MTcwOiBwb3NpdGlvbiBlcXVhbHMgemVybyIpOworCisJLyogSXRlbSBpcyBub3QgZm91bmQuIFNldCBwYXRoIHRvIHRoZSBwcmV2aW91cyBpdGVtLiAqLworCXBfbGVfaWggPQorCSAgICBCX05fUElURU1fSEVBRChQQVRIX1BMQVNUX0JVRkZFUihwX3Nfc2VhcmNoX3BhdGgpLAorCQkJICAgLS1QQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSk7CisJbl9ibGtfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CisKKwlpZiAoY29tcF9zaG9ydF9rZXlzKCYocF9sZV9paC0+aWhfa2V5KSwgcF9jcHVfa2V5KSkgeworCQlyZXR1cm4gRklMRV9OT1RfRk9VTkQ7CisJfQorCS8vIEZJWE1FOiBxdWl0ZSB1Z2x5IHRoaXMgZmFyCisKKwlpdGVtX29mZnNldCA9IGxlX2loX2tfb2Zmc2V0KHBfbGVfaWgpOworCW9mZnNldCA9IGNwdV9rZXlfa19vZmZzZXQocF9jcHVfa2V5KTsKKworCS8qIE5lZWRlZCBieXRlIGlzIGNvbnRhaW5lZCBpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZSBwYXRoLiAqLworCWlmIChpdGVtX29mZnNldCA8PSBvZmZzZXQgJiYKKwkgICAgaXRlbV9vZmZzZXQgKyBvcF9ieXRlc19udW1iZXIocF9sZV9paCwgbl9ibGtfc2l6ZSkgPiBvZmZzZXQpIHsKKwkJcG9zX2luX2l0ZW0ocF9zX3NlYXJjaF9wYXRoKSA9IG9mZnNldCAtIGl0ZW1fb2Zmc2V0OworCQlpZiAoaXNfaW5kaXJlY3RfbGVfaWgocF9sZV9paCkpIHsKKwkJCXBvc19pbl9pdGVtKHBfc19zZWFyY2hfcGF0aCkgLz0gbl9ibGtfc2l6ZTsKKwkJfQorCQlyZXR1cm4gUE9TSVRJT05fRk9VTkQ7CisJfQorCisJLyogTmVlZGVkIGJ5dGUgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGUgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZQorCSAgIHBhdGguIFNldCBwb3NfaW5faXRlbSBvdXQgb2YgdGhlIGl0ZW0uICovCisJaWYgKGlzX2luZGlyZWN0X2xlX2loKHBfbGVfaWgpKQorCQlwb3NfaW5faXRlbShwX3Nfc2VhcmNoX3BhdGgpID0KKwkJICAgIGloX2l0ZW1fbGVuKHBfbGVfaWgpIC8gVU5GTV9QX1NJWkU7CisJZWxzZQorCQlwb3NfaW5faXRlbShwX3Nfc2VhcmNoX3BhdGgpID0gaWhfaXRlbV9sZW4ocF9sZV9paCk7CisKKwlyZXR1cm4gUE9TSVRJT05fTk9UX0ZPVU5EOwogfQogCi0KIC8qIENvbXBhcmUgZ2l2ZW4gaXRlbSBhbmQgaXRlbSBwb2ludGVkIHRvIGJ5IHRoZSBwYXRoLiAqLwotaW50IGNvbXBfaXRlbXMgKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKiBzdG9yZWRfaWgsIGNvbnN0IHN0cnVjdCBwYXRoICogcF9zX3BhdGgpCitpbnQgY29tcF9pdGVtcyhjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpzdG9yZWRfaWgsIGNvbnN0IHN0cnVjdCBwYXRoICpwX3NfcGF0aCkKIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoOwotICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgKiBpaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBfc19iaDsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaDsKIAotICAgIC8qIExhc3QgYnVmZmVyIGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZS4gKi8KLSAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19iaCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSkgKQotCXJldHVybiAxOworCS8qIExhc3QgYnVmZmVyIGF0IHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZS4gKi8KKwlpZiAoIUJfSVNfSU5fVFJFRShwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCkpKQorCQlyZXR1cm4gMTsKIAotICAgIC8qIExhc3QgcGF0aCBwb3NpdGlvbiBpcyBpbnZhbGlkLiAqLwotICAgIGlmICggUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19wYXRoKSA+PSBCX05SX0lURU1TKHBfc19iaCkgKQotCXJldHVybiAxOworCS8qIExhc3QgcGF0aCBwb3NpdGlvbiBpcyBpbnZhbGlkLiAqLworCWlmIChQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpID49IEJfTlJfSVRFTVMocF9zX2JoKSkKKwkJcmV0dXJuIDE7CiAKLSAgICAvKiB3ZSBuZWVkIG9ubHkgdG8ga25vdywgd2hldGhlciBpdCBpcyB0aGUgc2FtZSBpdGVtICovCi0gICAgaWggPSBnZXRfaWggKHBfc19wYXRoKTsKLSAgICByZXR1cm4gbWVtY21wIChzdG9yZWRfaWgsIGloLCBJSF9TSVpFKTsKKwkvKiB3ZSBuZWVkIG9ubHkgdG8ga25vdywgd2hldGhlciBpdCBpcyB0aGUgc2FtZSBpdGVtICovCisJaWggPSBnZXRfaWgocF9zX3BhdGgpOworCXJldHVybiBtZW1jbXAoc3RvcmVkX2loLCBpaCwgSUhfU0laRSk7CiB9CiAKLQogLyogdW5mb3JtYXR0ZWQgbm9kZXMgYXJlIG5vdCBsb2dnZWQgYW55bW9yZSwgZXZlci4gIFRoaXMgaXMgc2FmZQogKiogbm93CiAqLwpAQCAtODc2LDQ2MSArOTExLDQ2NiBAQAogLy8gYmxvY2sgY2FuIG5vdCBiZSBmb3Jnb3R0ZW4gYXMgaXQgaXMgaW4gSS9PIG9yIGhlbGQgYnkgc29tZW9uZQogI2RlZmluZSBibG9ja19pbl91c2UoYmgpIChidWZmZXJfbG9ja2VkKGJoKSB8fCAoaGVsZF9ieV9vdGhlcnMoYmgpKSkKIAotCi0KIC8vIHByZXBhcmUgZm9yIGRlbGV0ZSBvciBjdXQgb2YgZGlyZWN0IGl0ZW0KLXN0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtIChzdHJ1Y3QgcGF0aCAqIHBhdGgsCi0JCQkJCSAgIHN0cnVjdCBpdGVtX2hlYWQgKiBsZV9paCwKLQkJCQkJICAgc3RydWN0IGlub2RlICogaW5vZGUsCi0JCQkJCSAgIGxvZmZfdCBuZXdfZmlsZV9sZW5ndGgsCi0JCQkJCSAgIGludCAqIGN1dF9zaXplKQorc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0oc3RydWN0IHBhdGggKnBhdGgsCisJCQkJCSAgc3RydWN0IGl0ZW1faGVhZCAqbGVfaWgsCisJCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICBsb2ZmX3QgbmV3X2ZpbGVfbGVuZ3RoLCBpbnQgKmN1dF9zaXplKQogewotICAgIGxvZmZfdCByb3VuZF9sZW47CisJbG9mZl90IHJvdW5kX2xlbjsKIAorCWlmIChuZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSkpIHsKKwkJLyogaXRlbSBoYXMgdG8gYmUgZGVsZXRlZCAqLworCQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCQlyZXR1cm4gTV9ERUxFVEU7CisJfQorCS8vIG5ldyBmaWxlIGdldHMgdHJ1bmNhdGVkCisJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNikgeworCQkvLyAKKwkJcm91bmRfbGVuID0gUk9VTkRfVVAobmV3X2ZpbGVfbGVuZ3RoKTsKKwkJLyogdGhpcyB3YXMgbl9uZXdfZmlsZV9sZW5ndGggPCBsZV9paCAuLi4gKi8KKwkJaWYgKHJvdW5kX2xlbiA8IGxlX2loX2tfb2Zmc2V0KGxlX2loKSkgeworCQkJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwkJCXJldHVybiBNX0RFTEVURTsJLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KKwkJfQorCQkvKiBDYWxjdWxhdGUgZmlyc3QgcG9zaXRpb24gYW5kIHNpemUgZm9yIGN1dHRpbmcgZnJvbSBpdGVtLiAqLworCQlwb3NfaW5faXRlbShwYXRoKSA9IHJvdW5kX2xlbiAtIChsZV9paF9rX29mZnNldChsZV9paCkgLSAxKTsKKwkJKmN1dF9zaXplID0gLShpaF9pdGVtX2xlbihsZV9paCkgLSBwb3NfaW5faXRlbShwYXRoKSk7CiAKLSAgICBpZiAoIG5ld19maWxlX2xlbmd0aCA9PSBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSkgKSB7Ci0JLyogaXRlbSBoYXMgdG8gYmUgZGVsZXRlZCAqLwotCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOwotICAgIH0KLQkKLSAgICAvLyBuZXcgZmlsZSBnZXRzIHRydW5jYXRlZAotICAgIGlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUpID09IEtFWV9GT1JNQVRfM182KSB7Ci0JLy8gCi0Jcm91bmRfbGVuID0gUk9VTkRfVVAgKG5ld19maWxlX2xlbmd0aCk7IAotCS8qIHRoaXMgd2FzIG5fbmV3X2ZpbGVfbGVuZ3RoIDwgbGVfaWggLi4uICovCi0JaWYgKCByb3VuZF9sZW4gPCBsZV9paF9rX29mZnNldCAobGVfaWgpICkgIHsKLQkgICAgKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKLQkgICAgcmV0dXJuIE1fREVMRVRFOyAvKiBEZWxldGUgdGhpcyBpdGVtLiAqLworCQlyZXR1cm4gTV9DVVQ7CS8qIEN1dCBmcm9tIHRoaXMgaXRlbS4gKi8KKwl9CisKKwkvLyBvbGQgZmlsZTogaXRlbXMgbWF5IGhhdmUgYW55IGxlbmd0aAorCisJaWYgKG5ld19maWxlX2xlbmd0aCA8IGxlX2loX2tfb2Zmc2V0KGxlX2loKSkgeworCQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCQlyZXR1cm4gTV9ERUxFVEU7CS8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCiAJfQogCS8qIENhbGN1bGF0ZSBmaXJzdCBwb3NpdGlvbiBhbmQgc2l6ZSBmb3IgY3V0dGluZyBmcm9tIGl0ZW0uICovCi0JcG9zX2luX2l0ZW0gKHBhdGgpID0gcm91bmRfbGVuIC0gKGxlX2loX2tfb2Zmc2V0IChsZV9paCkgLSAxKTsKLQkqY3V0X3NpemUgPSAtKGloX2l0ZW1fbGVuKGxlX2loKSAtIHBvc19pbl9pdGVtKHBhdGgpKTsKLQkKLQlyZXR1cm4gTV9DVVQ7IC8qIEN1dCBmcm9tIHRoaXMgaXRlbS4gKi8KLSAgICB9Ci0KLQotICAgIC8vIG9sZCBmaWxlOiBpdGVtcyBtYXkgaGF2ZSBhbnkgbGVuZ3RoCi0KLSAgICBpZiAoIG5ld19maWxlX2xlbmd0aCA8IGxlX2loX2tfb2Zmc2V0IChsZV9paCkgKSAgewotCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOyAvKiBEZWxldGUgdGhpcyBpdGVtLiAqLwotICAgIH0KLSAgICAvKiBDYWxjdWxhdGUgZmlyc3QgcG9zaXRpb24gYW5kIHNpemUgZm9yIGN1dHRpbmcgZnJvbSBpdGVtLiAqLwotICAgICpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0KLQkJICAgICAgKHBvc19pbl9pdGVtIChwYXRoKSA9IG5ld19maWxlX2xlbmd0aCArIDEgLSBsZV9paF9rX29mZnNldCAobGVfaWgpKSk7Ci0gICAgcmV0dXJuIE1fQ1VUOyAvKiBDdXQgZnJvbSB0aGlzIGl0ZW0uICovCisJKmN1dF9zaXplID0gLShpaF9pdGVtX2xlbihsZV9paCkgLQorCQkgICAgICAocG9zX2luX2l0ZW0ocGF0aCkgPQorCQkgICAgICAgbmV3X2ZpbGVfbGVuZ3RoICsgMSAtIGxlX2loX2tfb2Zmc2V0KGxlX2loKSkpOworCXJldHVybiBNX0NVVDsJCS8qIEN1dCBmcm9tIHRoaXMgaXRlbS4gKi8KIH0KIAotCi1zdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2Zvcl9kaXJlbnRyeV9pdGVtIChzdHJ1Y3QgcGF0aCAqIHBhdGgsCi0JCQkJCSAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGxlX2loLAotCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJCQkgICAgIGxvZmZfdCBuZXdfZmlsZV9sZW5ndGgsCi0JCQkJCSAgICAgaW50ICogY3V0X3NpemUpCitzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2Zvcl9kaXJlbnRyeV9pdGVtKHN0cnVjdCBwYXRoICpwYXRoLAorCQkJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqbGVfaWgsCisJCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgbG9mZl90IG5ld19maWxlX2xlbmd0aCwKKwkJCQkJICAgIGludCAqY3V0X3NpemUpCiB7Ci0gICAgaWYgKGxlX2loX2tfb2Zmc2V0IChsZV9paCkgPT0gRE9UX09GRlNFVCAmJiAKLQluZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpKSB7Ci0JUkZBTFNFKCBpaF9lbnRyeV9jb3VudCAobGVfaWgpICE9IDIsCi0JICAgICAgICAiUEFQLTUyMjA6IGluY29ycmVjdCBlbXB0eSBkaXJlY3RvcnkgaXRlbSAoJWgpIiwgbGVfaWgpOwotCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7Ci0JcmV0dXJuIE1fREVMRVRFOyAvKiBEZWxldGUgdGhlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJ5LiAqLwotICAgIH0KLSAgICAKLSAgICBpZiAoIGloX2VudHJ5X2NvdW50IChsZV9paCkgPT0gMSApICB7Ci0JLyogRGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRlbSBzdWNoIGFzIHRoZXJlIGlzIG9uZSByZWNvcmQgb25seQotCSAgIGluIHRoaXMgaXRlbSovCi0JKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKLQlyZXR1cm4gTV9ERUxFVEU7Ci0gICAgfQotICAgIAotICAgIC8qIEN1dCBvbmUgcmVjb3JkIGZyb20gdGhlIGRpcmVjdG9yeSBpdGVtLiAqLwotICAgICpjdXRfc2l6ZSA9IC0oREVIX1NJWkUgKyBlbnRyeV9sZW5ndGggKGdldF9sYXN0X2JoIChwYXRoKSwgbGVfaWgsIHBvc19pbl9pdGVtIChwYXRoKSkpOwotICAgIHJldHVybiBNX0NVVDsgCi19CisJaWYgKGxlX2loX2tfb2Zmc2V0KGxlX2loKSA9PSBET1RfT0ZGU0VUICYmCisJICAgIG5ld19maWxlX2xlbmd0aCA9PSBtYXhfcmVpc2VyZnNfb2Zmc2V0KGlub2RlKSkgeworCQlSRkFMU0UoaWhfZW50cnlfY291bnQobGVfaWgpICE9IDIsCisJCSAgICAgICAiUEFQLTUyMjA6IGluY29ycmVjdCBlbXB0eSBkaXJlY3RvcnkgaXRlbSAoJWgpIiwgbGVfaWgpOworCQkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCQlyZXR1cm4gTV9ERUxFVEU7CS8qIERlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0ZW0gY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cnkuICovCisJfQogCisJaWYgKGloX2VudHJ5X2NvdW50KGxlX2loKSA9PSAxKSB7CisJCS8qIERlbGV0ZSB0aGUgZGlyZWN0b3J5IGl0ZW0gc3VjaCBhcyB0aGVyZSBpcyBvbmUgcmVjb3JkIG9ubHkKKwkJICAgaW4gdGhpcyBpdGVtICovCisJCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJCXJldHVybiBNX0RFTEVURTsKKwl9CisKKwkvKiBDdXQgb25lIHJlY29yZCBmcm9tIHRoZSBkaXJlY3RvcnkgaXRlbS4gKi8KKwkqY3V0X3NpemUgPQorCSAgICAtKERFSF9TSVpFICsKKwkgICAgICBlbnRyeV9sZW5ndGgoZ2V0X2xhc3RfYmgocGF0aCksIGxlX2loLCBwb3NfaW5faXRlbShwYXRoKSkpOworCXJldHVybiBNX0NVVDsKK30KIAogLyogIElmIHRoZSBwYXRoIHBvaW50cyB0byBhIGRpcmVjdG9yeSBvciBkaXJlY3QgaXRlbSwgY2FsY3VsYXRlIG1vZGUgYW5kIHRoZSBzaXplIGN1dCwgZm9yIGJhbGFuY2UuCiAgICAgSWYgdGhlIHBhdGggcG9pbnRzIHRvIGFuIGluZGlyZWN0IGl0ZW0sIHJlbW92ZSBzb21lIG51bWJlciBvZiBpdHMgdW5mb3JtYXR0ZWQgbm9kZXMuCiAgICAgSW4gY2FzZSBvZiBmaWxlIHRydW5jYXRlIGNhbGN1bGF0ZSB3aGV0aGVyIHRoaXMgaXRlbSBtdXN0IGJlIGRlbGV0ZWQvdHJ1bmNhdGVkIG9yIGxhc3QKICAgICB1bmZvcm1hdHRlZCBub2RlIG9mIHRoaXMgaXRlbSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGRpcmVjdCBpdGVtLgogICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRldGVybWluYXRpb24gb2Ygd2hhdCBiYWxhbmNlIG1vZGUgdGhlIGNhbGxpbmcgZnVuY3Rpb24gc2hvdWxkIGVtcGxveS4gKi8KLXN0YXRpYyBjaGFyICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KAotCQkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJCSAgICAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGgsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBwX3NfaXRlbV9rZXksCi0JCQkJICAgICAgIGludCAgICAgICAgICAgICAgICAgKiBwX25fcmVtb3ZlZCwgICAgICAvKiBOdW1iZXIgb2YgdW5mb3JtYXR0ZWQgbm9kZXMgd2hpY2ggd2VyZSByZW1vdmVkCi0JCQkJCQkJCQkJICBmcm9tIGVuZCBvZiB0aGUgZmlsZS4gKi8KLQkJCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICAqIHBfbl9jdXRfc2l6ZSwKLQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICAgIG5fbmV3X2ZpbGVfbGVuZ3RoIC8qIE1BWF9LRVlfT0ZGU0VUIGluIGNhc2Ugb2YgZGVsZXRlLiAqLwotICAgICkgewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgPSBpbm9kZS0+aV9zYjsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCk7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKTsKK3N0YXRpYyBjaGFyIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19pdGVtX2tleSwgaW50ICpwX25fcmVtb3ZlZCwJLyogTnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIHdoaWNoIHdlcmUgcmVtb3ZlZAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGZyb20gZW5kIG9mIHRoZSBmaWxlLiAqLworCQkJCSAgICAgIGludCAqcF9uX2N1dF9zaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgbl9uZXdfZmlsZV9sZW5ndGgJLyogTUFYX0tFWV9PRkZTRVQgaW4gY2FzZSBvZiBkZWxldGUuICovCisgICAgKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCk7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBTdGF0X2RhdGEgaXRlbS4gKi8KLSAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApIHsKKwkvKiBTdGF0X2RhdGEgaXRlbS4gKi8KKwlpZiAoaXNfc3RhdGRhdGFfbGVfaWgocF9sZV9paCkpIHsKIAotCVJGQUxTRSggbl9uZXdfZmlsZV9sZW5ndGggIT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpLAotCQkiUEFQLTUyMTA6IG1vZGUgbXVzdCBiZSBNX0RFTEVURSIpOworCQlSRkFMU0Uobl9uZXdfZmlsZV9sZW5ndGggIT0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSksCisJCSAgICAgICAiUEFQLTUyMTA6IG1vZGUgbXVzdCBiZSBNX0RFTEVURSIpOwogCi0JKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKHBfbGVfaWgpKTsKLQlyZXR1cm4gTV9ERUxFVEU7Ci0gICAgfQorCQkqcF9uX2N1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4ocF9sZV9paCkpOworCQlyZXR1cm4gTV9ERUxFVEU7CisJfQogCisJLyogRGlyZWN0b3J5IGl0ZW0uICovCisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBfbGVfaWgpKQorCQlyZXR1cm4gcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbShwX3NfcGF0aCwgcF9sZV9paCwgaW5vZGUsCisJCQkJCQkgbl9uZXdfZmlsZV9sZW5ndGgsCisJCQkJCQkgcF9uX2N1dF9zaXplKTsKIAotICAgIC8qIERpcmVjdG9yeSBpdGVtLiAqLwotICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKHBfbGVfaWgpICkKLQlyZXR1cm4gcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbSAocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLCBuX25ld19maWxlX2xlbmd0aCwgcF9uX2N1dF9zaXplKTsKKwkvKiBEaXJlY3QgaXRlbS4gKi8KKwlpZiAoaXNfZGlyZWN0X2xlX2loKHBfbGVfaWgpKQorCQlyZXR1cm4gcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0ocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLAorCQkJCQkgICAgICAgbl9uZXdfZmlsZV9sZW5ndGgsIHBfbl9jdXRfc2l6ZSk7CiAKLSAgICAvKiBEaXJlY3QgaXRlbS4gKi8KLSAgICBpZiAoIGlzX2RpcmVjdF9sZV9paCAocF9sZV9paCkgKQotCXJldHVybiBwcmVwYXJlX2Zvcl9kaXJlY3RfaXRlbSAocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLCBuX25ld19maWxlX2xlbmd0aCwgcF9uX2N1dF9zaXplKTsKKwkvKiBDYXNlIG9mIGFuIGluZGlyZWN0IGl0ZW0uICovCisJeworCQlpbnQgbl91bmZtX251bWJlciwJLyogTnVtYmVyIG9mIHRoZSBpdGVtIHVuZm9ybWF0dGVkIG5vZGVzLiAqLworCQkgbl9jb3VudGVyLCBuX2Jsa19zaXplOworCQlfX2xlMzIgKnBfbl91bmZtX3BvaW50ZXI7CS8qIFBvaW50ZXIgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgbnVtYmVyLiAqLworCQlfX3UzMiB0bXA7CisJCXN0cnVjdCBpdGVtX2hlYWQgc19paDsJLyogSXRlbSBoZWFkZXIuICovCisJCWNoYXIgY19tb2RlOwkvKiBSZXR1cm5lZCBtb2RlIG9mIHRoZSBiYWxhbmNlLiAqLworCQlpbnQgbmVlZF9yZXNlYXJjaDsKIAorCQluX2Jsa19zaXplID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKIAotICAgIC8qIENhc2Ugb2YgYW4gaW5kaXJlY3QgaXRlbS4gKi8KLSAgICB7Ci0JaW50ICAgICAgICAgICAgICAgICAgIG5fdW5mbV9udW1iZXIsICAgIC8qIE51bWJlciBvZiB0aGUgaXRlbSB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KLQkgICAgbl9jb3VudGVyLAotCSAgICBuX2Jsa19zaXplOwotCV9fbGUzMiAgICAgICAgICAgICAgICogcF9uX3VuZm1fcG9pbnRlcjsgLyogUG9pbnRlciB0byB0aGUgdW5mb3JtYXR0ZWQgbm9kZSBudW1iZXIuICovCi0JX191MzIgdG1wOwotCXN0cnVjdCBpdGVtX2hlYWQgICAgICBzX2loOyAgICAgICAgICAgLyogSXRlbSBoZWFkZXIuICovCi0JY2hhciAgICAgICAgICAgICAgICAgIGNfbW9kZTsgICAgICAgICAgIC8qIFJldHVybmVkIG1vZGUgb2YgdGhlIGJhbGFuY2UuICovCi0JaW50IG5lZWRfcmVzZWFyY2g7CisJCS8qIFNlYXJjaCBmb3IgdGhlIG5lZWRlZCBvYmplY3QgaW5kaXJlY3QgaXRlbSB1bnRpbCB0aGVyZSBhcmUgbm8gdW5mb3JtYXR0ZWQgbm9kZXMgdG8gYmUgcmVtb3ZlZC4gKi8KKwkJZG8geworCQkJbmVlZF9yZXNlYXJjaCA9IDA7CisJCQlwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCk7CisJCQkvKiBDb3B5IGluZGlyZWN0IGl0ZW0gaGVhZGVyIHRvIGEgdGVtcCB2YXJpYWJsZS4gKi8KKwkJCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKwkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgdW5mb3JtYXR0ZWQgbm9kZXMgaW4gdGhpcyBpdGVtLiAqLworCQkJbl91bmZtX251bWJlciA9IElfVU5GTV9OVU0oJnNfaWgpOwogCisJCQlSRkFMU0UoIWlzX2luZGlyZWN0X2xlX2loKCZzX2loKSB8fCAhbl91bmZtX251bWJlciB8fAorCQkJICAgICAgIHBvc19pbl9pdGVtKHBfc19wYXRoKSArIDEgIT0gbl91bmZtX251bWJlciwKKwkJCSAgICAgICAiUEFQLTUyNDA6IGludmFsaWQgaXRlbSAlaCAiCisJCQkgICAgICAgIm5fdW5mbV9udW1iZXIgPSAlZCAqcF9uX3Bvc19pbl9pdGVtID0gJWQiLAorCQkJICAgICAgICZzX2loLCBuX3VuZm1fbnVtYmVyLCBwb3NfaW5faXRlbShwX3NfcGF0aCkpOwogCi0Jbl9ibGtfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CisJCQkvKiBDYWxjdWxhdGUgYmFsYW5jZSBtb2RlIGFuZCBwb3NpdGlvbiBpbiB0aGUgaXRlbSB0byByZW1vdmUgdW5mb3JtYXR0ZWQgbm9kZXMuICovCisJCQlpZiAobl9uZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSkpIHsJLyogQ2FzZSBvZiBkZWxldGUuICovCisJCQkJcG9zX2luX2l0ZW0ocF9zX3BhdGgpID0gMDsKKwkJCQkqcF9uX2N1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4oJnNfaWgpKTsKKwkJCQljX21vZGUgPSBNX0RFTEVURTsKKwkJCX0gZWxzZSB7CS8qIENhc2Ugb2YgdHJ1bmNhdGUuICovCisJCQkJaWYgKG5fbmV3X2ZpbGVfbGVuZ3RoIDwgbGVfaWhfa19vZmZzZXQoJnNfaWgpKSB7CisJCQkJCXBvc19pbl9pdGVtKHBfc19wYXRoKSA9IDA7CisJCQkJCSpwX25fY3V0X3NpemUgPQorCQkJCQkgICAgLShJSF9TSVpFICsgaWhfaXRlbV9sZW4oJnNfaWgpKTsKKwkJCQkJY19tb2RlID0gTV9ERUxFVEU7CS8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCisJCQkJfSBlbHNlIHsKKwkJCQkJLyogaW5kaXJlY3QgaXRlbSBtdXN0IGJlIHRydW5jYXRlZCBzdGFydGluZyBmcm9tICpwX25fcG9zX2luX2l0ZW0tdGggcG9zaXRpb24gKi8KKwkJCQkJcG9zX2luX2l0ZW0ocF9zX3BhdGgpID0KKwkJCQkJICAgIChuX25ld19maWxlX2xlbmd0aCArIG5fYmxrX3NpemUgLQorCQkJCQkgICAgIGxlX2loX2tfb2Zmc2V0KCZzX2loKSkgPj4gcF9zX3NiLT4KKwkJCQkJICAgIHNfYmxvY2tzaXplX2JpdHM7CiAKLQkvKiBTZWFyY2ggZm9yIHRoZSBuZWVkZWQgb2JqZWN0IGluZGlyZWN0IGl0ZW0gdW50aWwgdGhlcmUgYXJlIG5vIHVuZm9ybWF0dGVkIG5vZGVzIHRvIGJlIHJlbW92ZWQuICovCi0JZG8gIHsKLQkgICAgbmVlZF9yZXNlYXJjaCA9IDA7Ci0gICAgICAgICAgICBwX3NfYmggPSBQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCk7Ci0JICAgIC8qIENvcHkgaW5kaXJlY3QgaXRlbSBoZWFkZXIgdG8gYSB0ZW1wIHZhcmlhYmxlLiAqLwotCSAgICBjb3B5X2l0ZW1faGVhZCgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7Ci0JICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2YgdW5mb3JtYXR0ZWQgbm9kZXMgaW4gdGhpcyBpdGVtLiAqLwotCSAgICBuX3VuZm1fbnVtYmVyID0gSV9VTkZNX05VTSgmc19paCk7CisJCQkJCVJGQUxTRShwb3NfaW5faXRlbShwX3NfcGF0aCkgPgorCQkJCQkgICAgICAgbl91bmZtX251bWJlciwKKwkJCQkJICAgICAgICJQQVAtNTI1MDogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgaXRlbSIpOwogCi0JICAgIFJGQUxTRSggISBpc19pbmRpcmVjdF9sZV9paCgmc19paCkgfHwgISBuX3VuZm1fbnVtYmVyIHx8Ci0JCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpICsgMSAhPSAgbl91bmZtX251bWJlciwKLQkJICAgICJQQVAtNTI0MDogaW52YWxpZCBpdGVtICVoICIKLQkJICAgICJuX3VuZm1fbnVtYmVyID0gJWQgKnBfbl9wb3NfaW5faXRlbSA9ICVkIiwgCi0JCSAgICAmc19paCwgbl91bmZtX251bWJlciwgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSk7CisJCQkJCS8qIEVpdGhlciBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBpbmRpcmVjdCBpdGVtIHRvIGRpcmVjdCBpdGVtIG9yIGluY3JlYXNlCisJCQkJCSAgIGl0cyBmcmVlIHNwYWNlLiAgKi8KKwkJCQkJaWYgKHBvc19pbl9pdGVtKHBfc19wYXRoKSA9PQorCQkJCQkgICAgbl91bmZtX251bWJlcikgeworCQkJCQkJKnBfbl9jdXRfc2l6ZSA9IDA7CS8qIE5vdGhpbmcgdG8gY3V0LiAqLworCQkJCQkJcmV0dXJuIE1fQ09OVkVSVDsJLyogTWF5YmUgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gdGhlIGRpcmVjdCBpdGVtLiAqLworCQkJCQl9CisJCQkJCS8qIENhbGN1bGF0ZSBzaXplIHRvIGN1dC4gKi8KKwkJCQkJKnBfbl9jdXRfc2l6ZSA9CisJCQkJCSAgICAtKGloX2l0ZW1fbGVuKCZzX2loKSAtCisJCQkJCSAgICAgIHBvc19pbl9pdGVtKHBfc19wYXRoKSAqCisJCQkJCSAgICAgIFVORk1fUF9TSVpFKTsKIAotCSAgICAvKiBDYWxjdWxhdGUgYmFsYW5jZSBtb2RlIGFuZCBwb3NpdGlvbiBpbiB0aGUgaXRlbSB0byByZW1vdmUgdW5mb3JtYXR0ZWQgbm9kZXMuICovCi0JICAgIGlmICggbl9uZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpICkgey8qIENhc2Ugb2YgZGVsZXRlLiAqLwotCQlwb3NfaW5faXRlbSAocF9zX3BhdGgpID0gMDsKLQkJKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7Ci0JCWNfbW9kZSA9IE1fREVMRVRFOwotCSAgICB9Ci0JICAgIGVsc2UgIHsgLyogQ2FzZSBvZiB0cnVuY2F0ZS4gKi8KLQkJaWYgKCBuX25ld19maWxlX2xlbmd0aCA8IGxlX2loX2tfb2Zmc2V0ICgmc19paCkgKSAgewotCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IDA7Ci0JCSAgICAqcF9uX2N1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4oJnNfaWgpKTsKLQkJICAgIGNfbW9kZSA9IE1fREVMRVRFOyAvKiBEZWxldGUgdGhpcyBpdGVtLiAqLwotCQl9Ci0JCWVsc2UgIHsKLQkJICAgIC8qIGluZGlyZWN0IGl0ZW0gbXVzdCBiZSB0cnVuY2F0ZWQgc3RhcnRpbmcgZnJvbSAqcF9uX3Bvc19pbl9pdGVtLXRoIHBvc2l0aW9uICovCi0JCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpID0gKG5fbmV3X2ZpbGVfbGVuZ3RoICsgbl9ibGtfc2l6ZSAtIGxlX2loX2tfb2Zmc2V0ICgmc19paCkgKSA+PiBwX3Nfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQkJCWNfbW9kZSA9IE1fQ1VUOwkvKiBDdXQgZnJvbSB0aGlzIGluZGlyZWN0IGl0ZW0uICovCisJCQkJfQorCQkJfQogCi0JCSAgICBSRkFMU0UoIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgPiBuX3VuZm1fbnVtYmVyLAotCQkJICAgICJQQVAtNTI1MDogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgaXRlbSIpOworCQkJUkZBTFNFKG5fdW5mbV9udW1iZXIgPD0gcG9zX2luX2l0ZW0ocF9zX3BhdGgpLAorCQkJICAgICAgICJQQVAtNTI2MDogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgaW5kaXJlY3QgaXRlbSIpOwogCi0JCSAgICAvKiBFaXRoZXIgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgb2YgaW5kaXJlY3QgaXRlbSB0byBkaXJlY3QgaXRlbSBvciBpbmNyZWFzZQotCQkgICAgICAgaXRzIGZyZWUgc3BhY2UuICAqLwotCQkgICAgaWYgKCBwb3NfaW5faXRlbSAocF9zX3BhdGgpID09IG5fdW5mbV9udW1iZXIgKSAgewotCQkJKnBfbl9jdXRfc2l6ZSA9IDA7IC8qIE5vdGhpbmcgdG8gY3V0LiAqLwotCQkJcmV0dXJuIE1fQ09OVkVSVDsgLyogTWF5YmUgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gdGhlIGRpcmVjdCBpdGVtLiAqLwotCQkgICAgfQotCQkgICAgLyogQ2FsY3VsYXRlIHNpemUgdG8gY3V0LiAqLwotCQkgICAgKnBfbl9jdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4oJnNfaWgpIC0gcG9zX2luX2l0ZW0ocF9zX3BhdGgpICogVU5GTV9QX1NJWkUpOworCQkJLyogcG9pbnRlcnMgdG8gYmUgY3V0ICovCisJCQluX3VuZm1fbnVtYmVyIC09IHBvc19pbl9pdGVtKHBfc19wYXRoKTsKKwkJCS8qIFNldCBwb2ludGVyIHRvIHRoZSBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0aGF0IGlzIHRvIGJlIGN1dC4gKi8KKwkJCXBfbl91bmZtX3BvaW50ZXIgPQorCQkJICAgIChfX2xlMzIgKikgQl9JX1BJVEVNKHBfc19iaCwKKwkJCQkJCSAmc19paCkgKyBJX1VORk1fTlVNKCZzX2loKSAtCisJCQkgICAgMSAtICpwX25fcmVtb3ZlZDsKIAotCQkgICAgY19tb2RlID0gTV9DVVQ7ICAgICAvKiBDdXQgZnJvbSB0aGlzIGluZGlyZWN0IGl0ZW0uICovCi0JCX0KLQkgICAgfQorCQkJLyogV2UgZ28gdGhyb3VnaCB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgcG9pbnRlcnMgb2YgdGhlIGluZGlyZWN0CisJCQkgICBpdGVtIGFuZCBsb29rIGZvciB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgaW4gdGhlIGNhY2hlLiBJZiB3ZQorCQkJICAgZm91bmQgc29tZSBvZiB0aGVtIHdlIGZyZWUgaXQsIHplcm8gY29ycmVzcG9uZGluZyBpbmRpcmVjdCBpdGVtCisJCQkgICBlbnRyeSBhbmQgbG9nIGJ1ZmZlciBjb250YWluaW5nIHRoYXQgaW5kaXJlY3QgaXRlbS4gRm9yIHRoaXMgd2UKKwkJCSAgIG5lZWQgdG8gcHJlcGFyZSBsYXN0IHBhdGggZWxlbWVudCBmb3IgbG9nZ2luZy4gSWYgc29tZQorCQkJICAgdW5mb3JtYXR0ZWQgbm9kZSBoYXMgYl9jb3VudCA+IDEgd2UgbXVzdCBub3QgZnJlZSB0aGlzCisJCQkgICB1bmZvcm1hdHRlZCBub2RlIHNpbmNlIGl0IGlzIGluIHVzZS4gKi8KKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBwX3NfYmgsIDEpOworCQkJLy8gbm90ZTogcGF0aCBjb3VsZCBiZSBjaGFuZ2VkLCBmaXJzdCBsaW5lIGluIGZvciBsb29wIHRha2VzIGNhcmUKKwkJCS8vIG9mIGl0CiAKLQkgICAgUkZBTFNFKCBuX3VuZm1fbnVtYmVyIDw9IHBvc19pbl9pdGVtIChwX3NfcGF0aCksCi0JCSAgICAiUEFQLTUyNjA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGluZGlyZWN0IGl0ZW0iKTsKKwkJCWZvciAobl9jb3VudGVyID0gKnBfbl9yZW1vdmVkOworCQkJICAgICBuX2NvdW50ZXIgPCBuX3VuZm1fbnVtYmVyOworCQkJICAgICBuX2NvdW50ZXIrKywgcF9uX3VuZm1fcG9pbnRlci0tKSB7CiAKLQkgICAgLyogcG9pbnRlcnMgdG8gYmUgY3V0ICovCi0JICAgIG5fdW5mbV9udW1iZXIgLT0gcG9zX2luX2l0ZW0gKHBfc19wYXRoKTsKLQkgICAgLyogU2V0IHBvaW50ZXIgdG8gdGhlIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIHRoYXQgaXMgdG8gYmUgY3V0LiAqLwotCSAgICBwX25fdW5mbV9wb2ludGVyID0gKF9fbGUzMiAqKUJfSV9QSVRFTShwX3NfYmgsICZzX2loKSArIElfVU5GTV9OVU0oJnNfaWgpIC0gMSAtICpwX25fcmVtb3ZlZDsKKwkJCQljb25kX3Jlc2NoZWQoKTsKKwkJCQlpZiAoaXRlbV9tb3ZlZCgmc19paCwgcF9zX3BhdGgpKSB7CisJCQkJCW5lZWRfcmVzZWFyY2ggPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJUkZBTFNFKHBfbl91bmZtX3BvaW50ZXIgPAorCQkJCSAgICAgICAoX19sZTMyICopIEJfSV9QSVRFTShwX3NfYmgsICZzX2loKQorCQkJCSAgICAgICB8fCBwX25fdW5mbV9wb2ludGVyID4KKwkJCQkgICAgICAgKF9fbGUzMiAqKSBCX0lfUElURU0ocF9zX2JoLAorCQkJCQkJCSAgICAmc19paCkgKworCQkJCSAgICAgICBJX1VORk1fTlVNKCZzX2loKSAtIDEsCisJCQkJICAgICAgICJ2cy01MjY1OiBwb2ludGVyIG91dCBvZiByYW5nZSIpOwogCisJCQkJLyogSG9sZSwgbm90aGluZyB0byByZW1vdmUuICovCisJCQkJaWYgKCFnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsIDApKSB7CisJCQkJCSgqcF9uX3JlbW92ZWQpKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAotCSAgICAvKiBXZSBnbyB0aHJvdWdoIHRoZSB1bmZvcm1hdHRlZCBub2RlcyBwb2ludGVycyBvZiB0aGUgaW5kaXJlY3QKLQkgICAgICAgaXRlbSBhbmQgbG9vayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoZSBjYWNoZS4gSWYgd2UKLQkgICAgICAgZm91bmQgc29tZSBvZiB0aGVtIHdlIGZyZWUgaXQsIHplcm8gY29ycmVzcG9uZGluZyBpbmRpcmVjdCBpdGVtCi0JICAgICAgIGVudHJ5IGFuZCBsb2cgYnVmZmVyIGNvbnRhaW5pbmcgdGhhdCBpbmRpcmVjdCBpdGVtLiBGb3IgdGhpcyB3ZQotCSAgICAgICBuZWVkIHRvIHByZXBhcmUgbGFzdCBwYXRoIGVsZW1lbnQgZm9yIGxvZ2dpbmcuIElmIHNvbWUKLQkgICAgICAgdW5mb3JtYXR0ZWQgbm9kZSBoYXMgYl9jb3VudCA+IDEgd2UgbXVzdCBub3QgZnJlZSB0aGlzCi0JICAgICAgIHVuZm9ybWF0dGVkIG5vZGUgc2luY2UgaXQgaXMgaW4gdXNlLiAqLwotCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgcF9zX2JoLCAxKTsKLQkgICAgLy8gbm90ZTogcGF0aCBjb3VsZCBiZSBjaGFuZ2VkLCBmaXJzdCBsaW5lIGluIGZvciBsb29wIHRha2VzIGNhcmUKLQkgICAgLy8gb2YgaXQKKwkJCQkoKnBfbl9yZW1vdmVkKSsrOwogCi0JICAgIGZvciAobl9jb3VudGVyID0gKnBfbl9yZW1vdmVkOwotCQkgbl9jb3VudGVyIDwgbl91bmZtX251bWJlcjsgbl9jb3VudGVyKyssIHBfbl91bmZtX3BvaW50ZXItLSApIHsKKwkJCQl0bXAgPSBnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsIDApOworCQkJCXB1dF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwgMCwgMCk7CisJCQkJam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIHBfc19iaCk7CisJCQkJcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIHRtcCwgMSk7CisJCQkJaWYgKGl0ZW1fbW92ZWQoJnNfaWgsIHBfc19wYXRoKSkgeworCQkJCQluZWVkX3Jlc2VhcmNoID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQogCi0JCWNvbmRfcmVzY2hlZCgpOwotCQlpZiAoaXRlbV9tb3ZlZCAoJnNfaWgsIHBfc19wYXRoKSkgewotCQkgICAgbmVlZF9yZXNlYXJjaCA9IDEgOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkJUkZBTFNFKCBwX25fdW5mbV9wb2ludGVyIDwgKF9fbGUzMiAqKUJfSV9QSVRFTShwX3NfYmgsICZzX2loKSB8fAotCQkJcF9uX3VuZm1fcG9pbnRlciA+IChfX2xlMzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgKyBJX1VORk1fTlVNKCZzX2loKSAtIDEsCi0JCQkidnMtNTI2NTogcG9pbnRlciBvdXQgb2YgcmFuZ2UiKTsKKwkJCS8qIGEgdHJpY2suICBJZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGxvZ2dlZCwgdGhpcworCQkJICoqIHdpbGwgZG8gbm90aGluZy4gIElmIHdlJ3ZlIGJyb2tlbiB0aGUgbG9vcCB3aXRob3V0CisJCQkgKiogbG9nZ2luZyBpdCwgaXQgd2lsbCByZXN0b3JlIHRoZSBidWZmZXIKKwkJCSAqKgorCQkJICovCisJCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3Nfc2IsIHBfc19iaCk7CiAKLQkJLyogSG9sZSwgbm90aGluZyB0byByZW1vdmUuICovCi0JCWlmICggISBnZXRfYmxvY2tfbnVtKHBfbl91bmZtX3BvaW50ZXIsMCkgKSAgewotCQkJKCpwX25fcmVtb3ZlZCkrKzsKLQkJCWNvbnRpbnVlOwotCQl9CisJCQkvKiBUaGlzIGxvb3AgY2FuIGJlIG9wdGltaXplZC4gKi8KKwkJfSB3aGlsZSAoKCpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIgfHwgbmVlZF9yZXNlYXJjaCkgJiYKKwkJCSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwKKwkJCQkJCSAgICBwX3NfcGF0aCkgPT0KKwkJCSBQT1NJVElPTl9GT1VORCk7CiAKLQkJKCpwX25fcmVtb3ZlZCkrKzsKKwkJUkZBTFNFKCpwX25fcmVtb3ZlZCA8IG5fdW5mbV9udW1iZXIsCisJCSAgICAgICAiUEFQLTUzMTA6IGluZGlyZWN0IGl0ZW0gaXMgbm90IGZvdW5kIik7CisJCVJGQUxTRShpdGVtX21vdmVkKCZzX2loLCBwX3NfcGF0aCksCisJCSAgICAgICAiYWZ0ZXIgd2hpbGUsIGNvbXAgZmFpbGVkLCByZXRyeSIpOwogCi0JCXRtcCA9IGdldF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwwKTsKLQkJcHV0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLCAwLCAwKTsKLQkJam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgcF9zX3NiLCBwX3NfYmgpOwotCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgdG1wLCAxKTsKLQkJaWYgKCBpdGVtX21vdmVkICgmc19paCwgcF9zX3BhdGgpICkgIHsKLQkJCW5lZWRfcmVzZWFyY2ggPSAxOwotCQkJYnJlYWsgOwotCQl9Ci0JICAgIH0KLQotCSAgICAvKiBhIHRyaWNrLiAgSWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBsb2dnZWQsIHRoaXMKLQkgICAgKiogd2lsbCBkbyBub3RoaW5nLiAgSWYgd2UndmUgYnJva2VuIHRoZSBsb29wIHdpdGhvdXQKLQkgICAgKiogbG9nZ2luZyBpdCwgaXQgd2lsbCByZXN0b3JlIHRoZSBidWZmZXIKLQkgICAgKioKLQkgICAgKi8KLQkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3NiLCBwX3NfYmgpOwotCi0JICAgIC8qIFRoaXMgbG9vcCBjYW4gYmUgb3B0aW1pemVkLiAqLwotCX0gd2hpbGUgKCAoKnBfbl9yZW1vdmVkIDwgbl91bmZtX251bWJlciB8fCBuZWVkX3Jlc2VhcmNoKSAmJgotCQkgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQgKTsKLQotCVJGQUxTRSggKnBfbl9yZW1vdmVkIDwgbl91bmZtX251bWJlciwgCi0JCSJQQVAtNTMxMDogaW5kaXJlY3QgaXRlbSBpcyBub3QgZm91bmQiKTsKLQlSRkFMU0UoIGl0ZW1fbW92ZWQgKCZzX2loLCBwX3NfcGF0aCksIAotCQkiYWZ0ZXIgd2hpbGUsIGNvbXAgZmFpbGVkLCByZXRyeSIpIDsKLQotCWlmIChjX21vZGUgPT0gTV9DVVQpCi0JICAgIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgKj0gVU5GTV9QX1NJWkU7Ci0JcmV0dXJuIGNfbW9kZTsKLSAgICB9CisJCWlmIChjX21vZGUgPT0gTV9DVVQpCisJCQlwb3NfaW5faXRlbShwX3NfcGF0aCkgKj0gVU5GTV9QX1NJWkU7CisJCXJldHVybiBjX21vZGU7CisJfQogfQogCiAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgYmUgZGVsZXRlZCBvciBjdXQgZHVyaW5nIGJhbGFuY2UgKi8KLXN0YXRpYyBpbnQgY2FsY19kZWxldGVkX2J5dGVzX251bWJlcigKLSAgICBzdHJ1Y3QgIHRyZWVfYmFsYW5jZSAgKiBwX3NfdGIsCi0gICAgY2hhciAgICAgICAgICAgICAgICAgICAgY19tb2RlCi0gICAgKSB7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbl9kZWxfc2l6ZTsKLSAgICBzdHJ1Y3QgIGl0ZW1faGVhZCAgICAgKiBwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHBfc190Yi0+dGJfcGF0aCk7Ci0KLSAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApCi0JcmV0dXJuIDA7Ci0KLSAgICBuX2RlbF9zaXplID0gKCBjX21vZGUgPT0gTV9ERUxFVEUgKSA/IGloX2l0ZW1fbGVuKHBfbGVfaWgpIDogLXBfc190Yi0+aW5zZXJ0X3NpemVbMF07Ci0gICAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAocF9sZV9paCkgKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX0RJUl9TSVpFOyAvKiBXZSBkZWxldGUgZW10eSBkaXJlY3RvcmlzIG9ubHkuICovCi0JLy8gd2UgY2FuJ3QgdXNlIEVNUFRZX0RJUl9TSVpFLCBhcyBvbGQgZm9ybWF0IGRpcnMgaGF2ZSBhIGRpZmZlcmVudAotCS8vIGVtcHR5IHNpemUuICBpY2suIEZJWE1FLCBpcyB0aGlzIHJpZ2h0PwotCS8vCi0JcmV0dXJuIG5fZGVsX3NpemUgOwotICAgIH0KLQotICAgIGlmICggaXNfaW5kaXJlY3RfbGVfaWggKHBfbGVfaWgpICkKLQluX2RlbF9zaXplID0gKG5fZGVsX3NpemUvVU5GTV9QX1NJWkUpKgotCSAgKFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCktPmJfc2l6ZSk7Ly8gLSBnZXRfaWhfZnJlZV9zcGFjZSAocF9sZV9paCk7Ci0gICAgcmV0dXJuIG5fZGVsX3NpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfdGJfc3RydWN0KAotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBwX3NfdGIsCi0gICAgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiwKLSAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGgsCi0gICAgaW50ICAgICAgICAgICAgICAgICAgIG5fc2l6ZQotICAgICkgewotCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotCi0gICAgbWVtc2V0IChwX3NfdGIsJ1wwJyxzaXplb2Yoc3RydWN0IHRyZWVfYmFsYW5jZSkpOwotICAgIHBfc190Yi0+dHJhbnNhY3Rpb25faGFuZGxlID0gdGggOwotICAgIHBfc190Yi0+dGJfc2IgPSBwX3Nfc2I7Ci0gICAgcF9zX3RiLT50Yl9wYXRoID0gcF9zX3BhdGg7Ci0gICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IE5VTEw7Ci0gICAgUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSAwOwotICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3NpemU7Ci19Ci0KLQotCi12b2lkIHBhZGRfaXRlbSAoY2hhciAqIGl0ZW0sIGludCB0b3RhbF9sZW5ndGgsIGludCBsZW5ndGgpCitzdGF0aWMgaW50IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoc3RydWN0IHRyZWVfYmFsYW5jZSAqcF9zX3RiLCBjaGFyIGNfbW9kZSkKIHsKLSAgICBpbnQgaTsKKwlpbnQgbl9kZWxfc2l6ZTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHBfc190Yi0+dGJfcGF0aCk7CiAKLSAgICBmb3IgKGkgPSB0b3RhbF9sZW5ndGg7IGkgPiBsZW5ndGg7ICkKLQlpdGVtIFstLWldID0gMDsKKwlpZiAoaXNfc3RhdGRhdGFfbGVfaWgocF9sZV9paCkpCisJCXJldHVybiAwOworCisJbl9kZWxfc2l6ZSA9CisJICAgIChjX21vZGUgPT0KKwkgICAgIE1fREVMRVRFKSA/IGloX2l0ZW1fbGVuKHBfbGVfaWgpIDogLXBfc190Yi0+aW5zZXJ0X3NpemVbMF07CisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKHBfbGVfaWgpKSB7CisJCS8vIHJldHVybiBFTVBUWV9ESVJfU0laRTsgLyogV2UgZGVsZXRlIGVtdHkgZGlyZWN0b3JpcyBvbmx5LiAqLworCQkvLyB3ZSBjYW4ndCB1c2UgRU1QVFlfRElSX1NJWkUsIGFzIG9sZCBmb3JtYXQgZGlycyBoYXZlIGEgZGlmZmVyZW50CisJCS8vIGVtcHR5IHNpemUuICBpY2suIEZJWE1FLCBpcyB0aGlzIHJpZ2h0PworCQkvLworCQlyZXR1cm4gbl9kZWxfc2l6ZTsKKwl9CisKKwlpZiAoaXNfaW5kaXJlY3RfbGVfaWgocF9sZV9paCkpCisJCW5fZGVsX3NpemUgPSAobl9kZWxfc2l6ZSAvIFVORk1fUF9TSVpFKSAqIChQQVRIX1BMQVNUX0JVRkZFUihwX3NfdGItPnRiX3BhdGgpLT5iX3NpemUpOwkvLyAtIGdldF9paF9mcmVlX3NwYWNlIChwX2xlX2loKTsKKwlyZXR1cm4gbl9kZWxfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF90Yl9zdHJ1Y3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpwX3NfdGIsCisJCQkgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKwkJCSAgIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwgaW50IG5fc2l6ZSkKK3sKKworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCisJbWVtc2V0KHBfc190YiwgJ1wwJywgc2l6ZW9mKHN0cnVjdCB0cmVlX2JhbGFuY2UpKTsKKwlwX3NfdGItPnRyYW5zYWN0aW9uX2hhbmRsZSA9IHRoOworCXBfc190Yi0+dGJfc2IgPSBwX3Nfc2I7CisJcF9zX3RiLT50Yl9wYXRoID0gcF9zX3BhdGg7CisJUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IE5VTEw7CisJUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgPSAwOworCXBfc190Yi0+aW5zZXJ0X3NpemVbMF0gPSBuX3NpemU7Cit9CisKK3ZvaWQgcGFkZF9pdGVtKGNoYXIgKml0ZW0sIGludCB0b3RhbF9sZW5ndGgsIGludCBsZW5ndGgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSB0b3RhbF9sZW5ndGg7IGkgPiBsZW5ndGg7KQorCQlpdGVtWy0taV0gPSAwOwogfQogCiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKIGNoYXIga2V5MnR5cGUoc3RydWN0IHJlaXNlcmZzX2tleSAqaWgpCiB7Ci0gIGlmIChpc19kaXJlbnRyeV9sZV9rZXkoMiwgaWgpKQotICAgIHJldHVybiAnZCc7Ci0gIGlmIChpc19kaXJlY3RfbGVfa2V5KDIsIGloKSkKLSAgICByZXR1cm4gJ0QnOwotICBpZiAoaXNfaW5kaXJlY3RfbGVfa2V5KDIsIGloKSkKLSAgICByZXR1cm4gJ2knOwotICBpZiAoaXNfc3RhdGRhdGFfbGVfa2V5KDIsIGloKSkKLSAgICByZXR1cm4gJ3MnOwotICByZXR1cm4gJ3UnOworCWlmIChpc19kaXJlbnRyeV9sZV9rZXkoMiwgaWgpKQorCQlyZXR1cm4gJ2QnOworCWlmIChpc19kaXJlY3RfbGVfa2V5KDIsIGloKSkKKwkJcmV0dXJuICdEJzsKKwlpZiAoaXNfaW5kaXJlY3RfbGVfa2V5KDIsIGloKSkKKwkJcmV0dXJuICdpJzsKKwlpZiAoaXNfc3RhdGRhdGFfbGVfa2V5KDIsIGloKSkKKwkJcmV0dXJuICdzJzsKKwlyZXR1cm4gJ3UnOwogfQogCiBjaGFyIGhlYWQydHlwZShzdHJ1Y3QgaXRlbV9oZWFkICppaCkKIHsKLSAgaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkKLSAgICByZXR1cm4gJ2QnOwotICBpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKLSAgICByZXR1cm4gJ0QnOwotICBpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQotICAgIHJldHVybiAnaSc7Ci0gIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCi0gICAgcmV0dXJuICdzJzsKLSAgcmV0dXJuICd1JzsKKwlpZiAoaXNfZGlyZW50cnlfbGVfaWgoaWgpKQorCQlyZXR1cm4gJ2QnOworCWlmIChpc19kaXJlY3RfbGVfaWgoaWgpKQorCQlyZXR1cm4gJ0QnOworCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpCisJCXJldHVybiAnaSc7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSkKKwkJcmV0dXJuICdzJzsKKwlyZXR1cm4gJ3UnOwogfQogI2VuZGlmCiAKIC8qIERlbGV0ZSBvYmplY3QgaXRlbS4gKi8KLWludCByZWlzZXJmc19kZWxldGVfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoLCAvKiBQYXRoIHRvIHRoZSBkZWxldGVkIGl0ZW0uICovCi0JCQkgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2l0ZW1fa2V5LCAvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgZGVsZXRlZCBpdGVtLiAgKi8KLQkJCSAgc3RydWN0IGlub2RlICogcF9zX2lub2RlLC8qIGlub2RlIGlzIGhlcmUganVzdCB0byB1cGRhdGUgaV9ibG9ja3MgYW5kIHF1b3RhcyAqLwotCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX3VuX2JoKSAgICAvKiBOVUxMIG9yIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlci4gICAgKi8KLXsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7Ci0gICAgc3RydWN0IHRyZWVfYmFsYW5jZSAgIHNfZGVsX2JhbGFuY2U7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAgIHNfaWg7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAgICpxX2loOwotICAgIGludAkJCSAgcXVvdGFfY3V0X2J5dGVzOwotICAgIGludCAgICAgICAgICAgICAgICAgICBuX3JldF92YWx1ZSwKLQluX2RlbF9zaXplLAotCW5fcmVtb3ZlZDsKK2ludCByZWlzZXJmc19kZWxldGVfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHBhdGggKnBfc19wYXRoLAkvKiBQYXRoIHRvIHRoZSBkZWxldGVkIGl0ZW0uICovCisJCQkgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19pdGVtX2tleSwJLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRlbGV0ZWQgaXRlbS4gICovCisJCQkgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCS8qIGlub2RlIGlzIGhlcmUganVzdCB0byB1cGRhdGUgaV9ibG9ja3MgYW5kIHF1b3RhcyAqLworCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqcF9zX3VuX2JoKQorewkJCQkvKiBOVUxMIG9yIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlci4gICAgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfZGVsX2JhbGFuY2U7CisJc3RydWN0IGl0ZW1faGVhZCBzX2loOworCXN0cnVjdCBpdGVtX2hlYWQgKnFfaWg7CisJaW50IHF1b3RhX2N1dF9ieXRlczsKKwlpbnQgbl9yZXRfdmFsdWUsIG5fZGVsX3NpemUsIG5fcmVtb3ZlZDsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotICAgIGNoYXIgICAgICAgICAgICAgICAgICBjX21vZGU7Ci0gICAgaW50CQkJbl9pdGVyID0gMDsKKwljaGFyIGNfbW9kZTsKKwlpbnQgbl9pdGVyID0gMDsKICNlbmRpZgogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgaW5pdF90Yl9zdHJ1Y3QodGgsICZzX2RlbF9iYWxhbmNlLCBwX3Nfc2IsIHBfc19wYXRoLCAwLypzaXplIGlzIHVua25vd24qLyk7CisJaW5pdF90Yl9zdHJ1Y3QodGgsICZzX2RlbF9iYWxhbmNlLCBwX3Nfc2IsIHBfc19wYXRoLAorCQkgICAgICAgMCAvKnNpemUgaXMgdW5rbm93biAqLyApOwogCi0gICAgd2hpbGUgKCAxICkgewotCW5fcmVtb3ZlZCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJbl9yZW1vdmVkID0gMDsKIAogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotCW5faXRlcisrOwotCWNfbW9kZSA9CisJCW5faXRlcisrOworCQljX21vZGUgPQogI2VuZGlmCi0JICAgIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgJm5fcmVtb3ZlZCwgJm5fZGVsX3NpemUsIG1heF9yZWlzZXJmc19vZmZzZXQgKHBfc19pbm9kZSkpOworCQkgICAgcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCwKKwkJCQkJICAgICAgcF9zX2l0ZW1fa2V5LCAmbl9yZW1vdmVkLAorCQkJCQkgICAgICAmbl9kZWxfc2l6ZSwKKwkJCQkJICAgICAgbWF4X3JlaXNlcmZzX29mZnNldChwX3NfaW5vZGUpKTsKIAotCVJGQUxTRSggY19tb2RlICE9IE1fREVMRVRFLCAiUEFQLTUzMjA6IG1vZGUgbXVzdCBiZSBNX0RFTEVURSIpOworCQlSRkFMU0UoY19tb2RlICE9IE1fREVMRVRFLCAiUEFQLTUzMjA6IG1vZGUgbXVzdCBiZSBNX0RFTEVURSIpOwogCi0JY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOwotCXNfZGVsX2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gPSBuX2RlbF9zaXplOworCQljb3B5X2l0ZW1faGVhZCgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7CisJCXNfZGVsX2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gPSBuX2RlbF9zaXplOwogCi0Jbl9yZXRfdmFsdWUgPSBmaXhfbm9kZXMoTV9ERUxFVEUsICZzX2RlbF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKLQlpZiAoIG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0ggKQotCSAgICBicmVhazsKKwkJbl9yZXRfdmFsdWUgPSBmaXhfbm9kZXMoTV9ERUxFVEUsICZzX2RlbF9iYWxhbmNlLCBOVUxMLCBOVUxMKTsKKwkJaWYgKG5fcmV0X3ZhbHVlICE9IFJFUEVBVF9TRUFSQ0gpCisJCQlicmVhazsKIAotCVBST0NfSU5GT19JTkMoIHBfc19zYiwgZGVsZXRlX2l0ZW1fcmVzdGFydGVkICk7CisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBkZWxldGVfaXRlbV9yZXN0YXJ0ZWQpOwogCi0JLy8gZmlsZSBzeXN0ZW0gY2hhbmdlZCwgcmVwZWF0IHNlYXJjaAotCW5fcmV0X3ZhbHVlID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKTsKLQlpZiAobl9yZXRfdmFsdWUgPT0gSU9fRVJST1IpCi0JICAgIGJyZWFrOwotCWlmIChuX3JldF92YWx1ZSA9PSBGSUxFX05PVF9GT1VORCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJ2cy01MzQwOiByZWlzZXJmc19kZWxldGVfaXRlbTogIgotCQkJICAgICAgIm5vIGl0ZW1zIG9mIHRoZSBmaWxlICVLIGZvdW5kIiwgcF9zX2l0ZW1fa2V5KTsKLQkgICAgYnJlYWs7CisJCS8vIGZpbGUgc3lzdGVtIGNoYW5nZWQsIHJlcGVhdCBzZWFyY2gKKwkJbl9yZXRfdmFsdWUgPQorCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKTsKKwkJaWYgKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKQorCQkJYnJlYWs7CisJCWlmIChuX3JldF92YWx1ZSA9PSBGSUxFX05PVF9GT1VORCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJCSAidnMtNTM0MDogcmVpc2VyZnNfZGVsZXRlX2l0ZW06ICIKKwkJCQkJICJubyBpdGVtcyBvZiB0aGUgZmlsZSAlSyBmb3VuZCIsCisJCQkJCSBwX3NfaXRlbV9rZXkpOworCQkJYnJlYWs7CisJCX0KKwl9CQkJLyogd2hpbGUgKDEpICovCisKKwlpZiAobl9yZXRfdmFsdWUgIT0gQ0FSUllfT04pIHsKKwkJdW5maXhfbm9kZXMoJnNfZGVsX2JhbGFuY2UpOworCQlyZXR1cm4gMDsKIAl9Ci0gICAgfSAvKiB3aGlsZSAoMSkgKi8KKwkvLyByZWlzZXJmc19kZWxldGVfaXRlbSByZXR1cm5zIGl0ZW0gbGVuZ3RoIHdoZW4gc3VjY2VzcworCW5fcmV0X3ZhbHVlID0gY2FsY19kZWxldGVkX2J5dGVzX251bWJlcigmc19kZWxfYmFsYW5jZSwgTV9ERUxFVEUpOworCXFfaWggPSBnZXRfaWgocF9zX3BhdGgpOworCXF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKHFfaWgpOwogCi0gICAgaWYgKCBuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiApIHsKLQl1bmZpeF9ub2Rlcygmc19kZWxfYmFsYW5jZSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gcmVpc2VyZnNfZGVsZXRlX2l0ZW0gcmV0dXJucyBpdGVtIGxlbmd0aCB3aGVuIHN1Y2Nlc3MKLSAgICBuX3JldF92YWx1ZSA9IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoJnNfZGVsX2JhbGFuY2UsIE1fREVMRVRFKTsKLSAgICBxX2loID0gZ2V0X2loKHBfc19wYXRoKSA7Ci0gICAgcXVvdGFfY3V0X2J5dGVzID0gaWhfaXRlbV9sZW4ocV9paCkgOwotCi0gICAgLyogaGFjayBzbyB0aGUgcXVvdGEgY29kZSBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MgaWYgdGhlIGZpbGUKLSAgICAqKiBoYXMgYSB0YWlsLiAgT24gdGFpbCBpbnNlcnQsIHdlIGFsbG9jYXRlIHF1b3RhIGZvciAxIHVuZm9ybWF0dGVkIG5vZGUuCi0gICAgKiogV2UgdGVzdCB0aGUgb2Zmc2V0IGJlY2F1c2UgdGhlIHRhaWwgbWlnaHQgaGF2ZSBiZWVuCi0gICAgKiogc3BsaXQgaW50byBtdWx0aXBsZSBpdGVtcywgYW5kIHdlIG9ubHkgd2FudCB0byBkZWNyZW1lbnQgZm9yCi0gICAgKiogdGhlIHVuZm0gbm9kZSBvbmNlCi0gICAgKi8KLSAgICBpZiAoIVNfSVNMTksgKHBfc19pbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocV9paCkpIHsKLSAgICAgICAgaWYgKChsZV9paF9rX29mZnNldChxX2loKSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpID09IDEpIHsKLSAgICAgICAgICAgIHF1b3RhX2N1dF9ieXRlcyA9IHBfc19zYi0+c19ibG9ja3NpemUgKyBVTkZNX1BfU0laRTsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgcXVvdGFfY3V0X2J5dGVzID0gMCA7CisJLyogaGFjayBzbyB0aGUgcXVvdGEgY29kZSBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MgaWYgdGhlIGZpbGUKKwkgKiogaGFzIGEgdGFpbC4gIE9uIHRhaWwgaW5zZXJ0LCB3ZSBhbGxvY2F0ZSBxdW90YSBmb3IgMSB1bmZvcm1hdHRlZCBub2RlLgorCSAqKiBXZSB0ZXN0IHRoZSBvZmZzZXQgYmVjYXVzZSB0aGUgdGFpbCBtaWdodCBoYXZlIGJlZW4KKwkgKiogc3BsaXQgaW50byBtdWx0aXBsZSBpdGVtcywgYW5kIHdlIG9ubHkgd2FudCB0byBkZWNyZW1lbnQgZm9yCisJICoqIHRoZSB1bmZtIG5vZGUgb25jZQorCSAqLworCWlmICghU19JU0xOSyhwX3NfaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHFfaWgpKSB7CisJCWlmICgobGVfaWhfa19vZmZzZXQocV9paCkgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PSAxKSB7CisJCQlxdW90YV9jdXRfYnl0ZXMgPSBwX3Nfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkU7CisJCX0gZWxzZSB7CisJCQlxdW90YV9jdXRfYnl0ZXMgPSAwOworCQl9CiAJfQotICAgIH0KIAotICAgIGlmICggcF9zX3VuX2JoICkgIHsKLQlpbnQgb2ZmOwotICAgICAgICBjaGFyICpkYXRhIDsKKwlpZiAocF9zX3VuX2JoKSB7CisJCWludCBvZmY7CisJCWNoYXIgKmRhdGE7CiAKLQkvKiBXZSBhcmUgaW4gZGlyZWN0MmluZGlyZWN0IGNvbnZlcnNpb24sIHNvIG1vdmUgdGFpbCBjb250ZW50cwotICAgICAgICAgICB0byB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLwotCS8qIG5vdGUsIHdlIGRvIHRoZSBjb3B5IGJlZm9yZSBwcmVwYXJpbmcgdGhlIGJ1ZmZlciBiZWNhdXNlIHdlCi0JKiogZG9uJ3QgY2FyZSBhYm91dCB0aGUgY29udGVudHMgb2YgdGhlIHVuZm9ybWF0dGVkIG5vZGUgeWV0LgotCSoqIHRoZSBvbmx5IHRoaW5nIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBkaXJlY3QgaXRlbSdzIGRhdGEKLQkqKiBpcyBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZS4KLQkqKgotCSoqIE90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSB0byBjYWxsIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwgb24KLQkqKiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSwgd2hpY2ggbWlnaHQgc2NoZWR1bGUsIG1lYW5pbmcgd2UnZCBoYXZlIHRvCi0JKiogbG9vcCBhbGwgdGhlIHdheSBiYWNrIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgd2hpbGUgbG9vcC4KLQkqKgotCSoqIFRoZSB1bmZvcm1hdHRlZCBub2RlIG11c3QgYmUgZGlydGllZCBsYXRlciBvbi4gIFdlIGNhbid0IGJlCi0JKiogc3VyZSBoZXJlIGlmIHRoZSBlbnRpcmUgdGFpbCBoYXMgYmVlbiBkZWxldGVkIHlldC4KLSAgICAgICAgKioKLSAgICAgICAgKiogcF9zX3VuX2JoIGlzIGZyb20gdGhlIHBhZ2UgY2FjaGUgKGFsbCB1bmZvcm1hdHRlZCBub2RlcyBhcmUKLSAgICAgICAgKiogZnJvbSB0aGUgcGFnZSBjYWNoZSkgYW5kIG1pZ2h0IGJlIGEgaGlnaG1lbSBwYWdlLiAgU28sIHdlCi0gICAgICAgICoqIGNhbid0IHVzZSBwX3NfdW5fYmgtPmJfZGF0YS4KLQkqKiAtY2xtCi0JKi8KKwkJLyogV2UgYXJlIGluIGRpcmVjdDJpbmRpcmVjdCBjb252ZXJzaW9uLCBzbyBtb3ZlIHRhaWwgY29udGVudHMKKwkJICAgdG8gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkJLyogbm90ZSwgd2UgZG8gdGhlIGNvcHkgYmVmb3JlIHByZXBhcmluZyB0aGUgYnVmZmVyIGJlY2F1c2Ugd2UKKwkJICoqIGRvbid0IGNhcmUgYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmZvcm1hdHRlZCBub2RlIHlldC4KKwkJICoqIHRoZSBvbmx5IHRoaW5nIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBkaXJlY3QgaXRlbSdzIGRhdGEKKwkJICoqIGlzIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLgorCQkgKioKKwkJICoqIE90aGVyd2lzZSwgd2Ugd291bGQgaGF2ZSB0byBjYWxsIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwgb24KKwkJICoqIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3aGljaCBtaWdodCBzY2hlZHVsZSwgbWVhbmluZyB3ZSdkIGhhdmUgdG8KKwkJICoqIGxvb3AgYWxsIHRoZSB3YXkgYmFjayB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIHdoaWxlIGxvb3AuCisJCSAqKgorCQkgKiogVGhlIHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBkaXJ0aWVkIGxhdGVyIG9uLiAgV2UgY2FuJ3QgYmUKKwkJICoqIHN1cmUgaGVyZSBpZiB0aGUgZW50aXJlIHRhaWwgaGFzIGJlZW4gZGVsZXRlZCB5ZXQuCisJCSAqKgorCQkgKiogcF9zX3VuX2JoIGlzIGZyb20gdGhlIHBhZ2UgY2FjaGUgKGFsbCB1bmZvcm1hdHRlZCBub2RlcyBhcmUKKwkJICoqIGZyb20gdGhlIHBhZ2UgY2FjaGUpIGFuZCBtaWdodCBiZSBhIGhpZ2htZW0gcGFnZS4gIFNvLCB3ZQorCQkgKiogY2FuJ3QgdXNlIHBfc191bl9iaC0+Yl9kYXRhLgorCQkgKiogLWNsbQorCQkgKi8KIAotICAgICAgICBkYXRhID0ga21hcF9hdG9taWMocF9zX3VuX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKLQlvZmYgPSAoKGxlX2loX2tfb2Zmc2V0ICgmc19paCkgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7Ci0JbWVtY3B5KGRhdGEgKyBvZmYsCi0JICAgICAgIEJfSV9QSVRFTShQQVRIX1BMQVNUX0JVRkZFUihwX3NfcGF0aCksICZzX2loKSwgbl9yZXRfdmFsdWUpOwotCWt1bm1hcF9hdG9taWMoZGF0YSwgS01fVVNFUjApOwotICAgIH0KLSAgICAvKiBQZXJmb3JtIGJhbGFuY2luZyBhZnRlciBhbGwgcmVzb3VyY2VzIGhhdmUgYmVlbiBjb2xsZWN0ZWQgYXQgb25jZS4gKi8gCi0gICAgZG9fYmFsYW5jZSgmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOworCQlkYXRhID0ga21hcF9hdG9taWMocF9zX3VuX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKKwkJb2ZmID0gKChsZV9paF9rX29mZnNldCgmc19paCkgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisJCW1lbWNweShkYXRhICsgb2ZmLAorCQkgICAgICAgQl9JX1BJVEVNKFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSwgJnNfaWgpLAorCQkgICAgICAgbl9yZXRfdmFsdWUpOworCQlrdW5tYXBfYXRvbWljKGRhdGEsIEtNX1VTRVIwKTsKKwl9CisJLyogUGVyZm9ybSBiYWxhbmNpbmcgYWZ0ZXIgYWxsIHJlc291cmNlcyBoYXZlIGJlZW4gY29sbGVjdGVkIGF0IG9uY2UuICovCisJZG9fYmFsYW5jZSgmc19kZWxfYmFsYW5jZSwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOwogCiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLSAgICByZWlzZXJmc19kZWJ1ZyAocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgZGVsZXRlX2l0ZW0oKTogZnJlZWluZyAldSwgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2N1dF9ieXRlcywgcF9zX2lub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKCZzX2loKSk7CisJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgInJlaXNlcnF1b3RhIGRlbGV0ZV9pdGVtKCk6IGZyZWVpbmcgJXUsIGlkPSV1IHR5cGU9JWMiLAorCQkgICAgICAgcXVvdGFfY3V0X2J5dGVzLCBwX3NfaW5vZGUtPmlfdWlkLCBoZWFkMnR5cGUoJnNfaWgpKTsKICNlbmRpZgotICAgIERRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CisJRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKHBfc19pbm9kZSwgcXVvdGFfY3V0X2J5dGVzKTsKIAotICAgIC8qIFJldHVybiBkZWxldGVkIGJvZHkgbGVuZ3RoICovCi0gICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworCS8qIFJldHVybiBkZWxldGVkIGJvZHkgbGVuZ3RoICovCisJcmV0dXJuIG5fcmV0X3ZhbHVlOwogfQogCi0KIC8qIFN1bW1hcnkgT2YgTWVjaGFuaXNtcyBGb3IgSGFuZGxpbmcgQ29sbGlzaW9ucyBCZXR3ZWVuIFByb2Nlc3NlczoKIAogIGRlbGV0aW9uIG9mIHRoZSBib2R5IG9mIHRoZSBvYmplY3QgaXMgcGVyZm9ybWVkIGJ5IGlwdXQoKSwgd2l0aCB0aGUKQEAgLTEzNDcsNzI3ICsxMzg3LDgwNCBAQAogIC0gSGFucwogKi8KIAotCiAvKiB0aGlzIGRlbGV0ZXMgaXRlbSB3aGljaCBuZXZlciBnZXRzIHNwbGl0ICovCi12b2lkIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQkgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSkKK3ZvaWQgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KQogewotICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgdGI7Ci0gICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKLSAgICBpbnQgaXRlbV9sZW4gPSAwOwotICAgIGludCB0Yl9pbml0ID0gMCA7Ci0gICAgc3RydWN0IGNwdV9rZXkgY3B1X2tleTsKLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBxdW90YV9jdXRfYnl0ZXMgPSAwOworCXN0cnVjdCB0cmVlX2JhbGFuY2UgdGI7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCWludCBpdGVtX2xlbiA9IDA7CisJaW50IHRiX2luaXQgPSAwOworCXN0cnVjdCBjcHVfa2V5IGNwdV9rZXk7CisJaW50IHJldHZhbDsKKwlpbnQgcXVvdGFfY3V0X2J5dGVzID0gMDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICAKLSAgICBsZV9rZXkyY3B1X2tleSAoJmNwdV9rZXksIGtleSk7Ci0gICAgCi0gICAgd2hpbGUgKDEpIHsKLQlyZXR2YWwgPSBzZWFyY2hfaXRlbSAodGgtPnRfc3VwZXIsICZjcHVfa2V5LCAmcGF0aCk7Ci0JaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCSAgICByZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwKLQkJCSAgICAgICJ2cy01MzUwOiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbTogIgotCQkJICAgICAgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byBkZWxldGUgJUsiLAotCQkJICAgICAgJmNwdV9rZXkpOwotCSAgICBicmVhazsKLQl9Ci0JaWYgKHJldHZhbCAhPSBJVEVNX0ZPVU5EKSB7Ci0JICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotCSAgICAvLyBObyBuZWVkIGZvciBhIHdhcm5pbmcsIGlmIHRoZXJlIGlzIGp1c3Qgbm8gZnJlZSBzcGFjZSB0byBpbnNlcnQgJy4uJyBpdGVtIGludG8gdGhlIG5ld2x5LWNyZWF0ZWQgc3ViZGlyCi0JICAgIGlmICggISggKHVuc2lnbmVkIGxvbmcgbG9uZykgR0VUX0hBU0hfVkFMVUUgKGxlX2tleV9rX29mZnNldCAobGVfa2V5X3ZlcnNpb24gKGtleSksIGtleSkpID09IDAgJiYgXAotCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgR0VUX0dFTkVSQVRJT05fTlVNQkVSIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uIChrZXkpLCBrZXkpKSA9PSAxICkgKQotCQlyZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInZzLTUzNTU6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAlayBub3QgZm91bmQiLCBrZXkpOwotCSAgICBicmVhazsKLQl9Ci0JaWYgKCF0Yl9pbml0KSB7Ci0JICAgIHRiX2luaXQgPSAxIDsKLQkgICAgaXRlbV9sZW4gPSBpaF9pdGVtX2xlbiggUEFUSF9QSVRFTV9IRUFEKCZwYXRoKSApOwotCSAgICBpbml0X3RiX3N0cnVjdCAodGgsICZ0YiwgdGgtPnRfc3VwZXIsICZwYXRoLCAtIChJSF9TSVpFICsgaXRlbV9sZW4pKTsKLQl9Ci0JcXVvdGFfY3V0X2J5dGVzID0gaWhfaXRlbV9sZW4oUEFUSF9QSVRFTV9IRUFEKCZwYXRoKSkgOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0JcmV0dmFsID0gZml4X25vZGVzIChNX0RFTEVURSwgJnRiLCBOVUxMLCBOVUxMKTsKLQlpZiAocmV0dmFsID09IFJFUEVBVF9TRUFSQ0gpIHsKLQkgICAgUFJPQ19JTkZPX0lOQyggdGggLT4gdF9zdXBlciwgZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkICk7Ci0JICAgIGNvbnRpbnVlOwotCX0KKwlsZV9rZXkyY3B1X2tleSgmY3B1X2tleSwga2V5KTsKIAotCWlmIChyZXR2YWwgPT0gQ0FSUllfT04pIHsKLQkgICAgZG9fYmFsYW5jZSAoJnRiLCBOVUxMLCBOVUxMLCBNX0RFTEVURSk7Ci0JICAgIGlmIChpbm9kZSkgewkvKiBTaG91bGQgd2UgY291bnQgcXVvdGEgZm9yIGl0ZW0/ICh3ZSBkb24ndCBjb3VudCBxdW90YXMgZm9yIHNhdmUtbGlua3MpICovCisJd2hpbGUgKDEpIHsKKwkJcmV0dmFsID0gc2VhcmNoX2l0ZW0odGgtPnRfc3VwZXIsICZjcHVfa2V5LCAmcGF0aCk7CisJCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcodGgtPnRfc3VwZXIsCisJCQkJCSAidnMtNTM1MDogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICIKKwkJCQkJICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZGVsZXRlICVLIiwKKwkJCQkJICZjcHVfa2V5KTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXR2YWwgIT0gSVRFTV9GT1VORCkgeworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCS8vIE5vIG5lZWQgZm9yIGEgd2FybmluZywgaWYgdGhlcmUgaXMganVzdCBubyBmcmVlIHNwYWNlIHRvIGluc2VydCAnLi4nIGl0ZW0gaW50byB0aGUgbmV3bHktY3JlYXRlZCBzdWJkaXIKKwkJCWlmICghCisJCQkgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkgICAgIEdFVF9IQVNIX1ZBTFVFKGxlX2tleV9rX29mZnNldAorCQkJCQkgICAgKGxlX2tleV92ZXJzaW9uKGtleSksIGtleSkpID09IDAKKwkJCSAgICAgJiYgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCSAgICAgR0VUX0dFTkVSQVRJT05fTlVNQkVSKGxlX2tleV9rX29mZnNldAorCQkJCQkJICAgKGxlX2tleV92ZXJzaW9uKGtleSksCisJCQkJCQkgICAga2V5KSkgPT0gMSkpCisJCQkJcmVpc2VyZnNfd2FybmluZyh0aC0+dF9zdXBlciwKKwkJCQkJCSAidnMtNTM1NTogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICVrIG5vdCBmb3VuZCIsCisJCQkJCQkga2V5KTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghdGJfaW5pdCkgeworCQkJdGJfaW5pdCA9IDE7CisJCQlpdGVtX2xlbiA9IGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRCgmcGF0aCkpOworCQkJaW5pdF90Yl9zdHJ1Y3QodGgsICZ0YiwgdGgtPnRfc3VwZXIsICZwYXRoLAorCQkJCSAgICAgICAtKElIX1NJWkUgKyBpdGVtX2xlbikpOworCQl9CisJCXF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRCgmcGF0aCkpOworCisJCXJldHZhbCA9IGZpeF9ub2RlcyhNX0RFTEVURSwgJnRiLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJldHZhbCA9PSBSRVBFQVRfU0VBUkNIKSB7CisJCQlQUk9DX0lORk9fSU5DKHRoLT50X3N1cGVyLCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAocmV0dmFsID09IENBUlJZX09OKSB7CisJCQlkb19iYWxhbmNlKCZ0YiwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOworCQkJaWYgKGlub2RlKSB7CS8qIFNob3VsZCB3ZSBjb3VudCBxdW90YSBmb3IgaXRlbT8gKHdlIGRvbid0IGNvdW50IHF1b3RhcyBmb3Igc2F2ZS1saW5rcykgKi8KICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCQlyZWlzZXJmc19kZWJ1ZyAodGgtPnRfc3VwZXIsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBkZWxldGVfc29saWRfaXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9jdXRfYnl0ZXMsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoa2V5KSk7CisJCQkJcmVpc2VyZnNfZGVidWcodGgtPnRfc3VwZXIsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkJCSAgICAgICAicmVpc2VycXVvdGEgZGVsZXRlX3NvbGlkX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwKKwkJCQkJICAgICAgIHF1b3RhX2N1dF9ieXRlcywgaW5vZGUtPmlfdWlkLAorCQkJCQkgICAgICAga2V5MnR5cGUoa2V5KSk7CiAjZW5kaWYKLQkJRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9jdXRfYnl0ZXMpOwotCSAgICB9Ci0JICAgIGJyZWFrOworCQkJCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwKKwkJCQkJCQkgcXVvdGFfY3V0X2J5dGVzKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8vIElPX0VSUk9SLCBOT19ESVNLX1NQQUNFLCBldGMKKwkJcmVpc2VyZnNfd2FybmluZyh0aC0+dF9zdXBlciwKKwkJCQkgInZzLTUzNjA6IHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtOiAiCisJCQkJICJjb3VsZCBub3QgZGVsZXRlICVLIGR1ZSB0byBmaXhfbm9kZXMgZmFpbHVyZSIsCisJCQkJICZjcHVfa2V5KTsKKwkJdW5maXhfbm9kZXMoJnRiKTsKKwkJYnJlYWs7CiAJfQogCi0JLy8gSU9fRVJST1IsIE5PX0RJU0tfU1BBQ0UsIGV0YwotCXJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAidnMtNTM2MDogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICIKLQkJCSAgImNvdWxkIG5vdCBkZWxldGUgJUsgZHVlIHRvIGZpeF9ub2RlcyBmYWlsdXJlIiwgJmNwdV9rZXkpOwotCXVuZml4X25vZGVzICgmdGIpOwotCWJyZWFrOwotICAgIH0KLQotICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKKwlyZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKTsKIH0KIAotCi1pbnQgcmVpc2VyZnNfZGVsZXRlX29iamVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoraW50IHJlaXNlcmZzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIGludCBlcnI7Ci0gICAgaW5vZGUtPmlfc2l6ZSA9IDA7Ci0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCWludCBlcnI7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICAvKiBmb3IgZGlyZWN0b3J5IHRoaXMgZGVsZXRlcyBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iICovCi0gICAgZXJyID0gcmVpc2VyZnNfZG9fdHJ1bmNhdGUgKHRoLCBpbm9kZSwgTlVMTCwgMC8qbm8gdGltZXN0YW1wIHVwZGF0ZXMqLyk7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICAKKwkvKiBmb3IgZGlyZWN0b3J5IHRoaXMgZGVsZXRlcyBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iICovCisJZXJyID0KKwkgICAgcmVpc2VyZnNfZG9fdHJ1bmNhdGUodGgsIGlub2RlLCBOVUxMLCAwIC8qbm8gdGltZXN0YW1wIHVwZGF0ZXMgKi8gKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAjaWYgZGVmaW5lZCggVVNFX0lOT0RFX0dFTkVSQVRJT05fQ09VTlRFUiApCi0gICAgaWYoICFvbGRfZm9ybWF0X29ubHkgKCB0aCAtPiB0X3N1cGVyICkgKQotICAgICAgewotICAgICAgIF9fbGUzMiAqaW5vZGVfZ2VuZXJhdGlvbjsKLSAgICAgICAKLSAgICAgICBpbm9kZV9nZW5lcmF0aW9uID0gCi0gICAgICAgICAmUkVJU0VSRlNfU0IodGggLT4gdF9zdXBlcikgLT4gc19ycyAtPiBzX2lub2RlX2dlbmVyYXRpb247Ci0gICAgICAgKmlub2RlX2dlbmVyYXRpb24gPSBjcHVfdG9fbGUzMiggbGUzMl90b19jcHUoICppbm9kZV9nZW5lcmF0aW9uICkgKyAxICk7Ci0gICAgICB9CisJaWYgKCFvbGRfZm9ybWF0X29ubHkodGgtPnRfc3VwZXIpKSB7CisJCV9fbGUzMiAqaW5vZGVfZ2VuZXJhdGlvbjsKKworCQlpbm9kZV9nZW5lcmF0aW9uID0KKwkJICAgICZSRUlTRVJGU19TQih0aC0+dF9zdXBlciktPnNfcnMtPnNfaW5vZGVfZ2VuZXJhdGlvbjsKKwkJKmlub2RlX2dlbmVyYXRpb24gPQorCQkgICAgY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKmlub2RlX2dlbmVyYXRpb24pICsgMSk7CisJfQogLyogVVNFX0lOT0RFX0dFTkVSQVRJT05fQ09VTlRFUiAqLwogI2VuZGlmCi0gICAgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKHRoLCBpbm9kZSwgSU5PREVfUEtFWSAoaW5vZGUpKTsKKwlyZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSh0aCwgaW5vZGUsIElOT0RFX1BLRVkoaW5vZGUpKTsKIAotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQKLXVubWFwX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIGxvZmZfdCBwb3MpIHsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA7Ci0gICAgdW5zaWduZWQgbG9uZyB0YWlsX2luZGV4IDsKLSAgICB1bnNpZ25lZCBsb25nIGN1cl9pbmRleCA7CitzdGF0aWMgdm9pZCB1bm1hcF9idWZmZXJzKHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIHRhaWxfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBjdXJfaW5kZXg7CiAKLSAgICBpZiAocGFnZSkgewotCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JICAgIHRhaWxfaW5kZXggPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOwotCSAgICBjdXJfaW5kZXggPSAwIDsKLQkgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSA7Ci0JICAgIGJoID0gaGVhZCA7Ci0JICAgIGRvIHsKLQkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZSA7CisJaWYgKHBhZ2UpIHsKKwkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJCXRhaWxfaW5kZXggPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJCQljdXJfaW5kZXggPSAwOworCQkJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJCWJoID0gaGVhZDsKKwkJCWRvIHsKKwkJCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOwogCi0JCS8qIHdlIHdhbnQgdG8gdW5tYXAgdGhlIGJ1ZmZlcnMgdGhhdCBjb250YWluIHRoZSB0YWlsLCBhbmQKLQkJKiogYWxsIHRoZSBidWZmZXJzIGFmdGVyIGl0IChzaW5jZSB0aGUgdGFpbCBtdXN0IGJlIGF0IHRoZQotCQkqKiBlbmQgb2YgdGhlIGZpbGUpLiAgV2UgZG9uJ3Qgd2FudCB0byB1bm1hcCBmaWxlIGRhdGEKLQkJKiogYmVmb3JlIHRoZSB0YWlsLCBzaW5jZSBpdCBtaWdodCBiZSBkaXJ0eSBhbmQgd2FpdGluZyB0bwotCQkqKiByZWFjaCBkaXNrCi0JCSovCi0JCWN1cl9pbmRleCArPSBiaC0+Yl9zaXplIDsKLQkJaWYgKGN1cl9pbmRleCA+IHRhaWxfaW5kZXgpIHsKLQkJICAgIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCkgOworCQkJCS8qIHdlIHdhbnQgdG8gdW5tYXAgdGhlIGJ1ZmZlcnMgdGhhdCBjb250YWluIHRoZSB0YWlsLCBhbmQKKwkJCQkgKiogYWxsIHRoZSBidWZmZXJzIGFmdGVyIGl0IChzaW5jZSB0aGUgdGFpbCBtdXN0IGJlIGF0IHRoZQorCQkJCSAqKiBlbmQgb2YgdGhlIGZpbGUpLiAgV2UgZG9uJ3Qgd2FudCB0byB1bm1hcCBmaWxlIGRhdGEKKwkJCQkgKiogYmVmb3JlIHRoZSB0YWlsLCBzaW5jZSBpdCBtaWdodCBiZSBkaXJ0eSBhbmQgd2FpdGluZyB0bworCQkJCSAqKiByZWFjaCBkaXNrCisJCQkJICovCisJCQkJY3VyX2luZGV4ICs9IGJoLT5iX3NpemU7CisJCQkJaWYgKGN1cl9pbmRleCA+IHRhaWxfaW5kZXgpIHsKKwkJCQkJcmVpc2VyZnNfdW5tYXBfYnVmZmVyKGJoKTsKKwkJCQl9CisJCQkJYmggPSBuZXh0OworCQkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJCQlpZiAoUEFHRV9TSVpFID09IGJoLT5iX3NpemUpIHsKKwkJCQljbGVhcl9wYWdlX2RpcnR5KHBhZ2UpOworCQkJfQogCQl9Ci0JCWJoID0gbmV4dCA7Ci0JICAgIH0gd2hpbGUgKGJoICE9IGhlYWQpIDsKLQkgICAgaWYgKCBQQUdFX1NJWkUgPT0gYmgtPmJfc2l6ZSApIHsKLQkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKLQkgICAgfQogCX0KLSAgICB9CiB9CiAKLXN0YXRpYyBpbnQgbWF5YmVfaW5kaXJlY3RfdG9fZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiBwX3NfaW5vZGUsCi0JCQkgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0JCQkgICAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGgsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2l0ZW1fa2V5LAotCQkJICAgICAgbG9mZl90ICAgICAgICAgbl9uZXdfZmlsZV9zaXplLAotCQkJICAgICAgY2hhciAgICAgICAgICAgICAgICAqIHBfY19tb2RlCi0JCQkgICAgICApIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7Ci0gICAgaW50IG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgaW50IGN1dF9ieXRlczsKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CitzdGF0aWMgaW50IG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQkgICAgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCisJCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCisJCQkJICAgIGxvZmZfdCBuX25ld19maWxlX3NpemUsIGNoYXIgKnBfY19tb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworCWludCBuX2Jsb2NrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCWludCBjdXRfYnl0ZXM7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBpZiAobl9uZXdfZmlsZV9zaXplICE9IHBfc19pbm9kZS0+aV9zaXplKQotCUJVRyAoKTsKKwlpZiAobl9uZXdfZmlsZV9zaXplICE9IHBfc19pbm9kZS0+aV9zaXplKQorCQlCVUcoKTsKIAotICAgIC8qIHRoZSBwYWdlIGJlaW5nIHNlbnQgaW4gY291bGQgYmUgTlVMTCBpZiB0aGVyZSB3YXMgYW4gaS9vIGVycm9yCi0gICAgKiogcmVhZGluZyBpbiB0aGUgbGFzdCBibG9jay4gIFRoZSB1c2VyIHdpbGwgaGl0IHByb2JsZW1zIHRyeWluZyB0bwotICAgICoqIHJlYWQgdGhlIGZpbGUsIGJ1dCBmb3Igbm93IHdlIGp1c3Qgc2tpcCB0aGUgaW5kaXJlY3QyZGlyZWN0Ci0gICAgKi8KLSAgICBpZiAoYXRvbWljX3JlYWQoJnBfc19pbm9kZS0+aV9jb3VudCkgPiAxIHx8IAotICAgICAgICAhdGFpbF9oYXNfdG9fYmVfcGFja2VkIChwX3NfaW5vZGUpIHx8IAotCSFwYWdlIHx8IChSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSkgewotCS8vIGxlYXZlIHRhaWwgaW4gYW4gdW5mb3JtYXR0ZWQgbm9kZQkKLQkqcF9jX21vZGUgPSBNX1NLSVBfQkFMQU5DSU5HOwotCWN1dF9ieXRlcyA9IG5fYmxvY2tfc2l6ZSAtIChuX25ld19maWxlX3NpemUgJiAobl9ibG9ja19zaXplIC0gMSkpOwotCXBhdGhyZWxzZShwX3NfcGF0aCk7Ci0JcmV0dXJuIGN1dF9ieXRlczsKLSAgICB9Ci0gICAgLyogUGVybW9ybSB0aGUgY29udmVyc2lvbiB0byBhIGRpcmVjdF9pdGVtLiAqLwotICAgIC8qcmV0dXJuIGluZGlyZWN0X3RvX2RpcmVjdCAocF9zX2lub2RlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUsIHBfY19tb2RlKTsqLwotICAgIHJldHVybiBpbmRpcmVjdDJkaXJlY3QgKHRoLCBwX3NfaW5vZGUsIHBhZ2UsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksIG5fbmV3X2ZpbGVfc2l6ZSwgcF9jX21vZGUpOworCS8qIHRoZSBwYWdlIGJlaW5nIHNlbnQgaW4gY291bGQgYmUgTlVMTCBpZiB0aGVyZSB3YXMgYW4gaS9vIGVycm9yCisJICoqIHJlYWRpbmcgaW4gdGhlIGxhc3QgYmxvY2suICBUaGUgdXNlciB3aWxsIGhpdCBwcm9ibGVtcyB0cnlpbmcgdG8KKwkgKiogcmVhZCB0aGUgZmlsZSwgYnV0IGZvciBub3cgd2UganVzdCBza2lwIHRoZSBpbmRpcmVjdDJkaXJlY3QKKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnBfc19pbm9kZS0+aV9jb3VudCkgPiAxIHx8CisJICAgICF0YWlsX2hhc190b19iZV9wYWNrZWQocF9zX2lub2RlKSB8fAorCSAgICAhcGFnZSB8fCAoUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykpIHsKKwkJLy8gbGVhdmUgdGFpbCBpbiBhbiB1bmZvcm1hdHRlZCBub2RlICAgIAorCQkqcF9jX21vZGUgPSBNX1NLSVBfQkFMQU5DSU5HOworCQljdXRfYnl0ZXMgPQorCQkgICAgbl9ibG9ja19zaXplIC0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChuX2Jsb2NrX3NpemUgLSAxKSk7CisJCXBhdGhyZWxzZShwX3NfcGF0aCk7CisJCXJldHVybiBjdXRfYnl0ZXM7CisJfQorCS8qIFBlcm1vcm0gdGhlIGNvbnZlcnNpb24gdG8gYSBkaXJlY3RfaXRlbS4gKi8KKwkvKnJldHVybiBpbmRpcmVjdF90b19kaXJlY3QgKHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplLCBwX2NfbW9kZSk7ICovCisJcmV0dXJuIGluZGlyZWN0MmRpcmVjdCh0aCwgcF9zX2lub2RlLCBwYWdlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LAorCQkJICAgICAgIG5fbmV3X2ZpbGVfc2l6ZSwgcF9jX21vZGUpOwogfQogCi0KIC8qIHdlIGRpZCBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbi4gQW5kIHdlIGhhdmUgaW5zZXJ0ZWQgZGlyZWN0CiAgICBpdGVtIHN1Y2Nlc3Nlc2Z1bGx5LCBidXQgdGhlcmUgd2VyZSBubyBkaXNrIHNwYWNlIHRvIGN1dCB1bmZtCiAgICBwb2ludGVyIGJlaW5nIGNvbnZlcnRlZC4gVGhlcmVmb3JlIHdlIGhhdmUgdG8gZGVsZXRlIGluc2VydGVkCiAgICBkaXJlY3QgaXRlbShzKSAqLwotc3RhdGljIHZvaWQgaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcGF0aCAqIHBhdGgpCitzdGF0aWMgdm9pZCBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhdGggKnBhdGgpCiB7Ci0gICAgc3RydWN0IGNwdV9rZXkgdGFpbF9rZXk7Ci0gICAgaW50IHRhaWxfbGVuOwotICAgIGludCByZW1vdmVkOwotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlzdHJ1Y3QgY3B1X2tleSB0YWlsX2tleTsKKwlpbnQgdGFpbF9sZW47CisJaW50IHJlbW92ZWQ7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBtYWtlX2NwdV9rZXkgKCZ0YWlsX2tleSwgaW5vZGUsIGlub2RlLT5pX3NpemUgKyAxLCBUWVBFX0RJUkVDVCwgNCk7Ly8gISEhIQotICAgIHRhaWxfa2V5LmtleV9sZW5ndGggPSA0OworCW1ha2VfY3B1X2tleSgmdGFpbF9rZXksIGlub2RlLCBpbm9kZS0+aV9zaXplICsgMSwgVFlQRV9ESVJFQ1QsIDQpOwkvLyAhISEhCisJdGFpbF9rZXkua2V5X2xlbmd0aCA9IDQ7CiAKLSAgICB0YWlsX2xlbiA9IChjcHVfa2V5X2tfb2Zmc2V0ICgmdGFpbF9rZXkpICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSAtIDE7Ci0gICAgd2hpbGUgKHRhaWxfbGVuKSB7Ci0JLyogbG9vayBmb3IgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgdGFpbCAqLwotCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoaW5vZGUtPmlfc2IsICZ0YWlsX2tleSwgcGF0aCkgPT0gUE9TSVRJT05fTk9UX0ZPVU5EKQotCSAgICByZWlzZXJmc19wYW5pYyAoaW5vZGUtPmlfc2IsICJ2cy01NjE1OiBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBmb3VuZCBpbnZhbGlkIGl0ZW0iKTsKLQlSRkFMU0UoIHBhdGgtPnBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRCAocGF0aCkpIC0gMSwKLQkgICAgICAgICJ2cy01NjE2OiBhcHBlbmRlZCBieXRlcyBmb3VuZCIpOwotCVBBVEhfTEFTVF9QT1NJVElPTiAocGF0aCkgLS07Ci0JCi0JcmVtb3ZlZCA9IHJlaXNlcmZzX2RlbGV0ZV9pdGVtICh0aCwgcGF0aCwgJnRhaWxfa2V5LCBpbm9kZSwgTlVMTC8qdW5iaCBub3QgbmVlZGVkKi8pOwotCVJGQUxTRSggcmVtb3ZlZCA8PSAwIHx8IHJlbW92ZWQgPiB0YWlsX2xlbiwKLQkgICAgICAgICJ2cy01NjE3OiB0aGVyZSB3YXMgdGFpbCAlZCBieXRlcywgcmVtb3ZlZCBpdGVtIGxlbmd0aCAlZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgdGFpbF9sZW4sIHJlbW92ZWQpOwotCXRhaWxfbGVuIC09IHJlbW92ZWQ7Ci0Jc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZ0YWlsX2tleSwgY3B1X2tleV9rX29mZnNldCAoJnRhaWxfa2V5KSAtIHJlbW92ZWQpOwotICAgIH0KLSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgImluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2s6IGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uIGhhcyBiZWVuIHJvbGxlZCBiYWNrIGR1ZSB0byBsYWNrIG9mIGRpc2sgc3BhY2UiKTsKLSAgICAvL21hcmtfZmlsZV93aXRob3V0X3RhaWwgKGlub2RlKTsKLSAgICBtYXJrX2lub2RlX2RpcnR5IChpbm9kZSk7CisJdGFpbF9sZW4gPQorCSAgICAoY3B1X2tleV9rX29mZnNldCgmdGFpbF9rZXkpICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSAtIDE7CisJd2hpbGUgKHRhaWxfbGVuKSB7CisJCS8qIGxvb2sgZm9yIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KKwkJaWYgKHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAmdGFpbF9rZXksIHBhdGgpID09CisJCSAgICBQT1NJVElPTl9OT1RfRk9VTkQpCisJCQlyZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwKKwkJCQkgICAgICAgInZzLTU2MTU6IGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2s6IGZvdW5kIGludmFsaWQgaXRlbSIpOworCQlSRkFMU0UocGF0aC0+cG9zX2luX2l0ZW0gIT0KKwkJICAgICAgIGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRChwYXRoKSkgLSAxLAorCQkgICAgICAgInZzLTU2MTY6IGFwcGVuZGVkIGJ5dGVzIGZvdW5kIik7CisJCVBBVEhfTEFTVF9QT1NJVElPTihwYXRoKS0tOworCisJCXJlbW92ZWQgPQorCQkgICAgcmVpc2VyZnNfZGVsZXRlX2l0ZW0odGgsIHBhdGgsICZ0YWlsX2tleSwgaW5vZGUsCisJCQkJCSBOVUxMIC8qdW5iaCBub3QgbmVlZGVkICovICk7CisJCVJGQUxTRShyZW1vdmVkIDw9IDAKKwkJICAgICAgIHx8IHJlbW92ZWQgPiB0YWlsX2xlbiwKKwkJICAgICAgICJ2cy01NjE3OiB0aGVyZSB3YXMgdGFpbCAlZCBieXRlcywgcmVtb3ZlZCBpdGVtIGxlbmd0aCAlZCBieXRlcyIsCisJCSAgICAgICB0YWlsX2xlbiwgcmVtb3ZlZCk7CisJCXRhaWxfbGVuIC09IHJlbW92ZWQ7CisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZ0YWlsX2tleSwKKwkJCQkgICAgIGNwdV9rZXlfa19vZmZzZXQoJnRhaWxfa2V5KSAtIHJlbW92ZWQpOworCX0KKwlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJICJpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiBoYXMgYmVlbiByb2xsZWQgYmFjayBkdWUgdG8gbGFjayBvZiBkaXNrIHNwYWNlIik7CisJLy9tYXJrX2ZpbGVfd2l0aG91dF90YWlsIChpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiB9CiAKLQogLyogKFRydW5jYXRlIG9yIGN1dCBlbnRyeSkgb3IgZGVsZXRlIG9iamVjdCBpdGVtLiBSZXR1cm5zIDwgMCBvbiBmYWlsdXJlICovCi1pbnQgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJICAgIHN0cnVjdCBwYXRoICogcF9zX3BhdGgsCi0JCQkgICAgc3RydWN0IGNwdV9rZXkgKiBwX3NfaXRlbV9rZXksCi0JCQkgICAgc3RydWN0IGlub2RlICogcF9zX2lub2RlLAotCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlLCAKLQkJCSAgICBsb2ZmX3Qgbl9uZXdfZmlsZV9zaXplKQoraW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsCisJCQkgICBzdHJ1Y3QgY3B1X2tleSAqcF9zX2l0ZW1fa2V5LAorCQkJICAgc3RydWN0IGlub2RlICpwX3NfaW5vZGUsCisJCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7Ci0gICAgLyogRXZlcnkgZnVuY3Rpb24gd2hpY2ggaXMgZ29pbmcgdG8gY2FsbCBkb19iYWxhbmNlIG11c3QgZmlyc3QKLSAgICAgICBjcmVhdGUgYSB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlLiAgVGhlbiBpdCBtdXN0IGZpbGwgdXAgdGhpcwotICAgICAgIHN0cnVjdHVyZSBieSB1c2luZyB0aGUgaW5pdF90Yl9zdHJ1Y3QgYW5kIGZpeF9ub2RlcyBmdW5jdGlvbnMuCi0gICAgICAgQWZ0ZXIgdGhhdCB3ZSBjYW4gbWFrZSB0cmVlIGJhbGFuY2luZy4gKi8KLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfY3V0X2JhbGFuY2U7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsKLSAgICBpbnQgbl9jdXRfc2l6ZSA9IDAsICAgICAgICAvKiBBbW91bnQgdG8gYmUgY3V0LiAqLwotCW5fcmV0X3ZhbHVlID0gQ0FSUllfT04sCi0Jbl9yZW1vdmVkID0gMCwgICAgIC8qIE51bWJlciBvZiB0aGUgcmVtb3ZlZCB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KLQluX2lzX2lub2RlX2xvY2tlZCA9IDA7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBjX21vZGU7ICAgICAgICAgICAgLyogTW9kZSBvZiB0aGUgYmFsYW5jZS4gKi8KLSAgICBpbnQgcmV0dmFsMiA9IC0xOwotICAgIGludCBxdW90YV9jdXRfYnl0ZXM7Ci0gICAgbG9mZl90IHRhaWxfcG9zID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKKwkvKiBFdmVyeSBmdW5jdGlvbiB3aGljaCBpcyBnb2luZyB0byBjYWxsIGRvX2JhbGFuY2UgbXVzdCBmaXJzdAorCSAgIGNyZWF0ZSBhIHRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmUuICBUaGVuIGl0IG11c3QgZmlsbCB1cCB0aGlzCisJICAgc3RydWN0dXJlIGJ5IHVzaW5nIHRoZSBpbml0X3RiX3N0cnVjdCBhbmQgZml4X25vZGVzIGZ1bmN0aW9ucy4KKwkgICBBZnRlciB0aGF0IHdlIGNhbiBtYWtlIHRyZWUgYmFsYW5jaW5nLiAqLworCXN0cnVjdCB0cmVlX2JhbGFuY2Ugc19jdXRfYmFsYW5jZTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICpwX2xlX2loOworCWludCBuX2N1dF9zaXplID0gMCwJLyogQW1vdW50IHRvIGJlIGN1dC4gKi8KKwkgICAgbl9yZXRfdmFsdWUgPSBDQVJSWV9PTiwgbl9yZW1vdmVkID0gMCwJLyogTnVtYmVyIG9mIHRoZSByZW1vdmVkIHVuZm9ybWF0dGVkIG5vZGVzLiAqLworCSAgICBuX2lzX2lub2RlX2xvY2tlZCA9IDA7CisJY2hhciBjX21vZGU7CQkvKiBNb2RlIG9mIHRoZSBiYWxhbmNlLiAqLworCWludCByZXR2YWwyID0gLTE7CisJaW50IHF1b3RhX2N1dF9ieXRlczsKKwlsb2ZmX3QgdGFpbF9wb3MgPSAwOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOwotICAgIAotICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19jdXRfYmFsYW5jZSwgcF9zX2lub2RlLT5pX3NiLCBwX3NfcGF0aCwgbl9jdXRfc2l6ZSk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKKwlpbml0X3RiX3N0cnVjdCh0aCwgJnNfY3V0X2JhbGFuY2UsIHBfc19pbm9kZS0+aV9zYiwgcF9zX3BhdGgsCisJCSAgICAgICBuX2N1dF9zaXplKTsKIAotICAgIC8qIFJlcGVhdCB0aGlzIGxvb3AgdW50aWwgd2UgZWl0aGVyIGN1dCB0aGUgaXRlbSB3aXRob3V0IG5lZWRpbmcKLSAgICAgICB0byBiYWxhbmNlLCBvciB3ZSBmaXhfbm9kZXMgd2l0aG91dCBzY2hlZHVsZSBvY2N1cnJpbmcgKi8KLSAgICB3aGlsZSAoIDEgKSB7Ci0JLyogRGV0ZXJtaW5lIHRoZSBiYWxhbmNlIG1vZGUsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIHRvCi0JICAgYmUgY3V0LCBhbmQgc2l6ZSB0byBiZSBjdXQuICBJbiBjYXNlIG9mIHRoZSBpbmRpcmVjdCBpdGVtCi0JICAgZnJlZSB1bmZvcm1hdHRlZCBub2RlcyB3aGljaCBhcmUgcG9pbnRlZCB0byBieSB0aGUgY3V0Ci0JICAgcG9pbnRlcnMuICovCi0gICAgICAKLQljX21vZGUgPSBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoLCBwX3NfaXRlbV9rZXksICZuX3JlbW92ZWQsIAotCQkJCQkgICAmbl9jdXRfc2l6ZSwgbl9uZXdfZmlsZV9zaXplKTsKLQlpZiAoIGNfbW9kZSA9PSBNX0NPTlZFUlQgKSAgewotCSAgICAvKiBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSB0byBkaXJlY3QgaXRlbSBvciBsZWF2ZQotICAgICAgICAgICAgICAgdGFpbCBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLwotCSAgICBSRkFMU0UoIG5fcmV0X3ZhbHVlICE9IENBUlJZX09OLCAiUEFQLTU1NzA6IGNhbiBub3QgY29udmVydCB0d2ljZSIpOworCS8qIFJlcGVhdCB0aGlzIGxvb3AgdW50aWwgd2UgZWl0aGVyIGN1dCB0aGUgaXRlbSB3aXRob3V0IG5lZWRpbmcKKwkgICB0byBiYWxhbmNlLCBvciB3ZSBmaXhfbm9kZXMgd2l0aG91dCBzY2hlZHVsZSBvY2N1cnJpbmcgKi8KKwl3aGlsZSAoMSkgeworCQkvKiBEZXRlcm1pbmUgdGhlIGJhbGFuY2UgbW9kZSwgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgdG8KKwkJICAgYmUgY3V0LCBhbmQgc2l6ZSB0byBiZSBjdXQuICBJbiBjYXNlIG9mIHRoZSBpbmRpcmVjdCBpdGVtCisJCSAgIGZyZWUgdW5mb3JtYXR0ZWQgbm9kZXMgd2hpY2ggYXJlIHBvaW50ZWQgdG8gYnkgdGhlIGN1dAorCQkgICBwb2ludGVycy4gKi8KIAotCSAgICBuX3JldF92YWx1ZSA9IG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdCAodGgsIHBfc19pbm9kZSwgcGFnZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwKLQkJCQkJCSAgICBuX25ld19maWxlX3NpemUsICZjX21vZGUpOwotCSAgICBpZiAoIGNfbW9kZSA9PSBNX1NLSVBfQkFMQU5DSU5HICkKLQkJLyogdGFpbCBoYXMgYmVlbiBsZWZ0IGluIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCi0JCXJldHVybiBuX3JldF92YWx1ZTsKKwkJY19tb2RlID0KKwkJICAgIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgsCisJCQkJCSAgICAgIHBfc19pdGVtX2tleSwgJm5fcmVtb3ZlZCwKKwkJCQkJICAgICAgJm5fY3V0X3NpemUsIG5fbmV3X2ZpbGVfc2l6ZSk7CisJCWlmIChjX21vZGUgPT0gTV9DT05WRVJUKSB7CisJCQkvKiBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSB0byBkaXJlY3QgaXRlbSBvciBsZWF2ZQorCQkJICAgdGFpbCBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLworCQkJUkZBTFNFKG5fcmV0X3ZhbHVlICE9IENBUlJZX09OLAorCQkJICAgICAgICJQQVAtNTU3MDogY2FuIG5vdCBjb252ZXJ0IHR3aWNlIik7CiAKLQkgICAgbl9pc19pbm9kZV9sb2NrZWQgPSAxOwotCSAgCi0JICAgIC8qIHJlbW92aW5nIG9mIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSB3aWxsIGNoYW5nZSB2YWx1ZSB3ZQotICAgICAgICAgICAgICAgaGF2ZSB0byByZXR1cm4gdG8gdHJ1bmNhdGUuIFNhdmUgaXQgKi8KLQkgICAgcmV0dmFsMiA9IG5fcmV0X3ZhbHVlOwotCSAgICAvKnJldHZhbDIgPSBwX3Nfc2ItPnNfYmxvY2tzaXplIC0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpOyovCi0JICAKLQkgICAgLyogU28sIHdlIGhhdmUgcGVyZm9ybWVkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb252ZXJzaW9uOgotCSAgICAgICBpbnNlcnRpbmcgdGhlIG5ldyBkaXJlY3QgaXRlbS4gIE5vdyB3ZSBhcmUgcmVtb3ZpbmcgdGhlCi0JICAgICAgIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyLiBTZXQga2V5IHRvIHNlYXJjaCBmb3IKLQkgICAgICAgaXQuICovCi0gICAgICAJICAgIHNldF9jcHVfa2V5X2tfdHlwZSAocF9zX2l0ZW1fa2V5LCBUWVBFX0lORElSRUNUKTsKLQkgICAgcF9zX2l0ZW1fa2V5LT5rZXlfbGVuZ3RoID0gNDsKLQkgICAgbl9uZXdfZmlsZV9zaXplIC09IChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKLQkgICAgdGFpbF9wb3MgPSBuX25ld19maWxlX3NpemU7Ci0JICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0IChwX3NfaXRlbV9rZXksIG5fbmV3X2ZpbGVfc2l6ZSArIDEpOwotCSAgICBpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCkgPT0gUE9TSVRJT05fTk9UX0ZPVU5EICl7Ci0JCXByaW50X2Jsb2NrIChQQVRIX1BMQVNUX0JVRkZFUiAocF9zX3BhdGgpLCAzLCBQQVRIX0xBU1RfUE9TSVRJT04gKHBfc19wYXRoKSAtIDEsIFBBVEhfTEFTVF9QT1NJVElPTiAocF9zX3BhdGgpICsgMSk7Ci0JCXJlaXNlcmZzX3BhbmljKHBfc19zYiwgIlBBUC01NTgwOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiBpdGVtIHRvIGNvbnZlcnQgZG9lcyBub3QgZXhpc3QgKCVLKSIsIHBfc19pdGVtX2tleSk7Ci0JICAgIH0KLQkgICAgY29udGludWU7Ci0JfQotCWlmIChuX2N1dF9zaXplID09IDApIHsKLQkgICAgcGF0aHJlbHNlIChwX3NfcGF0aCk7Ci0JICAgIHJldHVybiAwOworCQkJbl9yZXRfdmFsdWUgPQorCQkJICAgIG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdCh0aCwgcF9zX2lub2RlLCBwYWdlLAorCQkJCQkJICAgICBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LAorCQkJCQkJICAgICBuX25ld19maWxlX3NpemUsICZjX21vZGUpOworCQkJaWYgKGNfbW9kZSA9PSBNX1NLSVBfQkFMQU5DSU5HKQorCQkJCS8qIHRhaWwgaGFzIGJlZW4gbGVmdCBpbiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSAqLworCQkJCXJldHVybiBuX3JldF92YWx1ZTsKKworCQkJbl9pc19pbm9kZV9sb2NrZWQgPSAxOworCisJCQkvKiByZW1vdmluZyBvZiBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgd2lsbCBjaGFuZ2UgdmFsdWUgd2UKKwkJCSAgIGhhdmUgdG8gcmV0dXJuIHRvIHRydW5jYXRlLiBTYXZlIGl0ICovCisJCQlyZXR2YWwyID0gbl9yZXRfdmFsdWU7CisJCQkvKnJldHZhbDIgPSBwX3Nfc2ItPnNfYmxvY2tzaXplIC0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpOyAqLworCisJCQkvKiBTbywgd2UgaGF2ZSBwZXJmb3JtZWQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNvbnZlcnNpb246CisJCQkgICBpbnNlcnRpbmcgdGhlIG5ldyBkaXJlY3QgaXRlbS4gIE5vdyB3ZSBhcmUgcmVtb3ZpbmcgdGhlCisJCQkgICBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlci4gU2V0IGtleSB0byBzZWFyY2ggZm9yCisJCQkgICBpdC4gKi8KKwkJCXNldF9jcHVfa2V5X2tfdHlwZShwX3NfaXRlbV9rZXksIFRZUEVfSU5ESVJFQ1QpOworCQkJcF9zX2l0ZW1fa2V5LT5rZXlfbGVuZ3RoID0gNDsKKwkJCW5fbmV3X2ZpbGVfc2l6ZSAtPQorCQkJICAgIChuX25ld19maWxlX3NpemUgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKTsKKwkJCXRhaWxfcG9zID0gbl9uZXdfZmlsZV9zaXplOworCQkJc2V0X2NwdV9rZXlfa19vZmZzZXQocF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUgKyAxKTsKKwkJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleQorCQkJICAgIChwX3Nfc2IsIHBfc19pdGVtX2tleSwKKwkJCSAgICAgcF9zX3BhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCkgeworCQkJCXByaW50X2Jsb2NrKFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSwgMywKKwkJCQkJICAgIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgLSAxLAorCQkJCQkgICAgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19wYXRoKSArIDEpOworCQkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkJICAgICAgICJQQVAtNTU4MDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSB0byBjb252ZXJ0IGRvZXMgbm90IGV4aXN0ICglSykiLAorCQkJCQkgICAgICAgcF9zX2l0ZW1fa2V5KTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChuX2N1dF9zaXplID09IDApIHsKKwkJCXBhdGhyZWxzZShwX3NfcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gPSBuX2N1dF9zaXplOworCisJCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKGNfbW9kZSwgJnNfY3V0X2JhbGFuY2UsIE5VTEwsIE5VTEwpOworCQlpZiAobl9yZXRfdmFsdWUgIT0gUkVQRUFUX1NFQVJDSCkKKwkJCWJyZWFrOworCisJCVBST0NfSU5GT19JTkMocF9zX3NiLCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZCk7CisKKwkJbl9yZXRfdmFsdWUgPQorCQkgICAgc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKTsKKwkJaWYgKG5fcmV0X3ZhbHVlID09IFBPU0lUSU9OX0ZPVU5EKQorCQkJY29udGludWU7CisKKwkJcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsCisJCQkJICJQQVAtNTYxMDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSAlSyBub3QgZm91bmQiLAorCQkJCSBwX3NfaXRlbV9rZXkpOworCQl1bmZpeF9ub2Rlcygmc19jdXRfYmFsYW5jZSk7CisJCXJldHVybiAobl9yZXRfdmFsdWUgPT0gSU9fRVJST1IpID8gLUVJTyA6IC1FTk9FTlQ7CisJfQkJCS8qIHdoaWxlICovCisKKwkvLyBjaGVjayBmaXhfbm9kZXMgcmVzdWx0cyAoSU9fRVJST1Igb3IgTk9fRElTS19TUEFDRSkKKwlpZiAobl9yZXRfdmFsdWUgIT0gQ0FSUllfT04pIHsKKwkJaWYgKG5faXNfaW5vZGVfbG9ja2VkKSB7CisJCQkvLyBGSVhNRTogdGhpcyBzZWVtcyB0byBiZSBub3QgbmVlZGVkOiB3ZSBhcmUgYWx3YXlzIGFibGUKKwkJCS8vIHRvIGN1dCBpdGVtCisJCQlpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrKHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoKTsKKwkJfQorCQlpZiAobl9yZXRfdmFsdWUgPT0gTk9fRElTS19TUEFDRSkKKwkJCXJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiTk9fRElTS19TUEFDRSIpOworCQl1bmZpeF9ub2Rlcygmc19jdXRfYmFsYW5jZSk7CisJCXJldHVybiAtRUlPOwogCX0KIAotCXNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF0gPSBuX2N1dF9zaXplOwotCQotCW5fcmV0X3ZhbHVlID0gZml4X25vZGVzKGNfbW9kZSwgJnNfY3V0X2JhbGFuY2UsIE5VTEwsIE5VTEwpOwotICAgICAgCWlmICggbl9yZXRfdmFsdWUgIT0gUkVQRUFUX1NFQVJDSCApCi0JICAgIGJyZWFrOwotCQotCVBST0NfSU5GT19JTkMoIHBfc19zYiwgY3V0X2Zyb21faXRlbV9yZXN0YXJ0ZWQgKTsKKwkvKiBnbyBhaGVhZCBhbmQgcGVyZm9ybSBiYWxhbmNpbmcgKi8KIAotCW5fcmV0X3ZhbHVlID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKTsKLQlpZiAobl9yZXRfdmFsdWUgPT0gUE9TSVRJT05fRk9VTkQpCi0JICAgIGNvbnRpbnVlOworCVJGQUxTRShjX21vZGUgPT0gTV9QQVNURSB8fCBjX21vZGUgPT0gTV9JTlNFUlQsICJpbnZhbGlkIG1vZGUiKTsKIAotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIlBBUC01NjEwOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiBpdGVtICVLIG5vdCBmb3VuZCIsIHBfc19pdGVtX2tleSk7Ci0JdW5maXhfbm9kZXMgKCZzX2N1dF9iYWxhbmNlKTsKLQlyZXR1cm4gKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKSA/IC1FSU8gOiAtRU5PRU5UOwotICAgIH0gLyogd2hpbGUgKi8KLSAgCi0gICAgLy8gY2hlY2sgZml4X25vZGVzIHJlc3VsdHMgKElPX0VSUk9SIG9yIE5PX0RJU0tfU1BBQ0UpCi0gICAgaWYgKCBuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiApIHsKLQlpZiAoIG5faXNfaW5vZGVfbG9ja2VkICkgewotCSAgICAvLyBGSVhNRTogdGhpcyBzZWVtcyB0byBiZSBub3QgbmVlZGVkOiB3ZSBhcmUgYWx3YXlzIGFibGUKLQkgICAgLy8gdG8gY3V0IGl0ZW0KLQkgICAgaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjayAodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgpOworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvIGJlIGN1dCBmcm9tIHRoZSBpdGVtLiAqLworCXF1b3RhX2N1dF9ieXRlcyA9CisJICAgIChjX21vZGUgPT0KKwkgICAgIE1fREVMRVRFKSA/IGloX2l0ZW1fbGVuKGdldF9paChwX3NfcGF0aCkpIDogLXNfY3V0X2JhbGFuY2UuCisJICAgIGluc2VydF9zaXplWzBdOworCWlmIChyZXR2YWwyID09IC0xKQorCQluX3JldF92YWx1ZSA9IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoJnNfY3V0X2JhbGFuY2UsIGNfbW9kZSk7CisJZWxzZQorCQluX3JldF92YWx1ZSA9IHJldHZhbDI7CisKKwkvKiBGb3IgZGlyZWN0IGl0ZW1zLCB3ZSBvbmx5IGNoYW5nZSB0aGUgcXVvdGEgd2hlbiBkZWxldGluZyB0aGUgbGFzdAorCSAqKiBpdGVtLgorCSAqLworCXBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQoc19jdXRfYmFsYW5jZS50Yl9wYXRoKTsKKwlpZiAoIVNfSVNMTksocF9zX2lub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX2xlX2loKSkgeworCQlpZiAoY19tb2RlID09IE1fREVMRVRFICYmCisJCSAgICAobGVfaWhfa19vZmZzZXQocF9sZV9paCkgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PQorCQkgICAgMSkgeworCQkJLy8gRklYTUU6IHRoaXMgaXMgdG8ga2VlcCAzLjUgaGFwcHkKKwkJCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7CisJCQlxdW90YV9jdXRfYnl0ZXMgPSBwX3Nfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkU7CisJCX0gZWxzZSB7CisJCQlxdW90YV9jdXRfYnl0ZXMgPSAwOworCQl9CiAJfQotCWlmIChuX3JldF92YWx1ZSA9PSBOT19ESVNLX1NQQUNFKQotCSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJOT19ESVNLX1NQQUNFIik7Ci0JdW5maXhfbm9kZXMgKCZzX2N1dF9iYWxhbmNlKTsKLQlyZXR1cm4gLUVJTzsKLSAgICB9Ci0KLSAgICAvKiBnbyBhaGVhZCBhbmQgcGVyZm9ybSBiYWxhbmNpbmcgKi8KLSAgICAKLSAgICBSRkFMU0UoIGNfbW9kZSA9PSBNX1BBU1RFIHx8IGNfbW9kZSA9PSBNX0lOU0VSVCwgImludmFsaWQgbW9kZSIpOwotCi0gICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgY3V0IGZyb20gdGhlIGl0ZW0uICovCi0gICAgcXVvdGFfY3V0X2J5dGVzID0gKCBjX21vZGUgPT0gTV9ERUxFVEUgKSA/IGloX2l0ZW1fbGVuKGdldF9paChwX3NfcGF0aCkpIDogLXNfY3V0X2JhbGFuY2UuaW5zZXJ0X3NpemVbMF07Ci0gICAgaWYgKHJldHZhbDIgPT0gLTEpCi0Jbl9yZXRfdmFsdWUgPSBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKCZzX2N1dF9iYWxhbmNlLCBjX21vZGUpOwotICAgIGVsc2UKLQluX3JldF92YWx1ZSA9IHJldHZhbDI7Ci0KLQotICAgIC8qIEZvciBkaXJlY3QgaXRlbXMsIHdlIG9ubHkgY2hhbmdlIHRoZSBxdW90YSB3aGVuIGRlbGV0aW5nIHRoZSBsYXN0Ci0gICAgKiogaXRlbS4KLSAgICAqLwotICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7Ci0gICAgaWYgKCFTX0lTTE5LIChwX3NfaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHBfbGVfaWgpKSB7Ci0gICAgICAgIGlmIChjX21vZGUgPT0gTV9ERUxFVEUgJiYKLQkgICAobGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0gMSApIHsKLQkgICAgLy8gRklYTUU6IHRoaXMgaXMgdG8ga2VlcCAzLjUgaGFwcHkKLQkgICAgUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gVTMyX01BWDsKLQkgICAgcXVvdGFfY3V0X2J5dGVzID0gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIFVORk1fUF9TSVpFIDsKLSAgICAgICAgfSBlbHNlIHsKLQkgICAgcXVvdGFfY3V0X2J5dGVzID0gMCA7Ci0JfQotICAgIH0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBpZiAobl9pc19pbm9kZV9sb2NrZWQpIHsKLQlzdHJ1Y3QgaXRlbV9oZWFkICogbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7Ci0JLyogd2UgYXJlIGdvaW5nIHRvIGNvbXBsZXRlIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uLiBNYWtlCi0gICAgICAgICAgIHN1cmUsIHRoYXQgd2UgZXhhY3RseSByZW1vdmUgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIKLSAgICAgICAgICAgb2YgdGhlIGl0ZW0gKi8KLQlpZiAoIWlzX2luZGlyZWN0X2xlX2loIChsZV9paCkpCi0JICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJ2cy01NjUyOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCi0JCQkgICAgIml0ZW0gbXVzdCBiZSBpbmRpcmVjdCAlaCIsIGxlX2loKTsKKwlpZiAobl9pc19pbm9kZV9sb2NrZWQpIHsKKwkJc3RydWN0IGl0ZW1faGVhZCAqbGVfaWggPQorCQkgICAgUEFUSF9QSVRFTV9IRUFEKHNfY3V0X2JhbGFuY2UudGJfcGF0aCk7CisJCS8qIHdlIGFyZSBnb2luZyB0byBjb21wbGV0ZSBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbi4gTWFrZQorCQkgICBzdXJlLCB0aGF0IHdlIGV4YWN0bHkgcmVtb3ZlIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyCisJCSAgIG9mIHRoZSBpdGVtICovCisJCWlmICghaXNfaW5kaXJlY3RfbGVfaWgobGVfaWgpKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLAorCQkJCSAgICAgICAidnMtNTY1MjogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgorCQkJCSAgICAgICAiaXRlbSBtdXN0IGJlIGluZGlyZWN0ICVoIiwgbGVfaWgpOwogCi0JaWYgKGNfbW9kZSA9PSBNX0RFTEVURSAmJiBpaF9pdGVtX2xlbihsZV9paCkgIT0gVU5GTV9QX1NJWkUpCi0JICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJ2cy01NjUzOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCi0JCQkgICAgImNvbXBsZXRpbmcgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24gaW5kaXJlY3QgaXRlbSAlaCAiCi0JCQkgICAgImJlaW5nIGRlbGV0ZWQgbXVzdCBiZSBvZiA0IGJ5dGUgbG9uZyIsIGxlX2loKTsKKwkJaWYgKGNfbW9kZSA9PSBNX0RFTEVURSAmJiBpaF9pdGVtX2xlbihsZV9paCkgIT0gVU5GTV9QX1NJWkUpCisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJ2cy01NjUzOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCisJCQkJICAgICAgICJjb21wbGV0aW5nIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIGluZGlyZWN0IGl0ZW0gJWggIgorCQkJCSAgICAgICAiYmVpbmcgZGVsZXRlZCBtdXN0IGJlIG9mIDQgYnl0ZSBsb25nIiwKKwkJCQkgICAgICAgbGVfaWgpOwogCi0JaWYgKGNfbW9kZSA9PSBNX0NVVCAmJiBzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdICE9IC1VTkZNX1BfU0laRSkgewotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTY1NDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogIgotCQkJICAgICJjYW4gbm90IGNvbXBsZXRlIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uIG9mICVoIChDVVQsIGluc2VydF9zaXplPT0lZCkiLAotCQkJICAgIGxlX2loLCBzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdKTsKKwkJaWYgKGNfbW9kZSA9PSBNX0NVVAorCQkgICAgJiYgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSAhPSAtVU5GTV9QX1NJWkUpIHsKKwkJCXJlaXNlcmZzX3BhbmljKHBfc19zYiwKKwkJCQkgICAgICAgInZzLTU2NTQ6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKKwkJCQkgICAgICAgImNhbiBub3QgY29tcGxldGUgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24gb2YgJWggKENVVCwgaW5zZXJ0X3NpemU9PSVkKSIsCisJCQkJICAgICAgIGxlX2loLCBzX2N1dF9iYWxhbmNlLmluc2VydF9zaXplWzBdKTsKKwkJfQorCQkvKiBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gbWFrZSBzdXJlLCB0aGF0IHJpZ2h0IG5laWdoYm9yaW5nCisJCSAgIGl0ZW0gaXMgZGlyZWN0IGl0ZW0gb2YgdGhpcyBmaWxlICovCiAJfQotCS8qIGl0IHdvdWxkIGJlIHVzZWZ1bCB0byBtYWtlIHN1cmUsIHRoYXQgcmlnaHQgbmVpZ2hib3JpbmcKLSAgICAgICAgICAgaXRlbSBpcyBkaXJlY3QgaXRlbSBvZiB0aGlzIGZpbGUgKi8KLSAgICB9CiAjZW5kaWYKLSAgICAKLSAgICBkb19iYWxhbmNlKCZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMLCBjX21vZGUpOwotICAgIGlmICggbl9pc19pbm9kZV9sb2NrZWQgKSB7Ci0JLyogd2UndmUgZG9uZSBhbiBpbmRpcmVjdC0+ZGlyZWN0IGNvbnZlcnNpb24uICB3aGVuIHRoZSBkYXRhIGJsb2NrCi0JKiogd2FzIGZyZWVkLCBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGJsb2NrcyB0aGF0IG11c3QKLQkqKiBiZSBmbHVzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywgbWFrZSBzdXJlIHRvCi0JKiogdW5tYXAgYW5kIGludmFsaWRhdGUgaXQKLQkqLwotCXVubWFwX2J1ZmZlcnMocGFnZSwgdGFpbF9wb3MpOwotCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2sgOwotICAgIH0KKworCWRvX2JhbGFuY2UoJnNfY3V0X2JhbGFuY2UsIE5VTEwsIE5VTEwsIGNfbW9kZSk7CisJaWYgKG5faXNfaW5vZGVfbG9ja2VkKSB7CisJCS8qIHdlJ3ZlIGRvbmUgYW4gaW5kaXJlY3QtPmRpcmVjdCBjb252ZXJzaW9uLiAgd2hlbiB0aGUgZGF0YSBibG9jaworCQkgKiogd2FzIGZyZWVkLCBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGJsb2NrcyB0aGF0IG11c3QKKwkJICoqIGJlIGZsdXNoZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLCBtYWtlIHN1cmUgdG8KKwkJICoqIHVubWFwIGFuZCBpbnZhbGlkYXRlIGl0CisJCSAqLworCQl1bm1hcF9idWZmZXJzKHBhZ2UsIHRhaWxfcG9zKTsKKwkJUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZsYWdzICY9IH5pX3BhY2tfb25fY2xvc2VfbWFzazsKKwl9CiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLSAgICByZWlzZXJmc19kZWJ1ZyAocF9zX2lub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgY3V0X2Zyb21faXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9jdXRfYnl0ZXMsIHBfc19pbm9kZS0+aV91aWQsICc/Jyk7CisJcmVpc2VyZnNfZGVidWcocF9zX2lub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgInJlaXNlcnF1b3RhIGN1dF9mcm9tX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwKKwkJICAgICAgIHF1b3RhX2N1dF9ieXRlcywgcF9zX2lub2RlLT5pX3VpZCwgJz8nKTsKICNlbmRpZgotICAgIERRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7Ci0gICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CisJcmV0dXJuIG5fcmV0X3ZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCB0cnVuY2F0ZV9kaXJlY3RvcnkgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3N0YXRpYyB2b2lkIHRydW5jYXRlX2RpcmVjdG9yeShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICBpZiAoaW5vZGUtPmlfbmxpbmspCi0JcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0JCQkgICJ2cy01NjU1OiB0cnVuY2F0ZV9kaXJlY3Rvcnk6IGxpbmsgY291bnQgIT0gMCIpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOworCWlmIChpbm9kZS0+aV9ubGluaykKKwkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkgInZzLTU2NTU6IHRydW5jYXRlX2RpcmVjdG9yeTogbGluayBjb3VudCAhPSAwIik7CiAKLSAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWSAoaW5vZGUpLCBET1RfT0ZGU0VUKTsKLSAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgVFlQRV9ESVJFTlRSWSk7Ci0gICAgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKHRoLCBpbm9kZSwgSU5PREVfUEtFWSAoaW5vZGUpKTsKLSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7Ci0gICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgU0RfT0ZGU0VUKTsKLSAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkgKGlub2RlKSwgVFlQRV9TVEFUX0RBVEEpOyAgICAKKwlzZXRfbGVfa2V5X2tfb2Zmc2V0KEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZKGlub2RlKSwgRE9UX09GRlNFVCk7CisJc2V0X2xlX2tleV9rX3R5cGUoS0VZX0ZPUk1BVF8zXzUsIElOT0RFX1BLRVkoaW5vZGUpLCBUWVBFX0RJUkVOVFJZKTsKKwlyZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSh0aCwgaW5vZGUsIElOT0RFX1BLRVkoaW5vZGUpKTsKKwlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwlzZXRfbGVfa2V5X2tfb2Zmc2V0KEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZKGlub2RlKSwgU0RfT0ZGU0VUKTsKKwlzZXRfbGVfa2V5X2tfdHlwZShLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWShpbm9kZSksIFRZUEVfU1RBVF9EQVRBKTsKIH0KIAotCi0KLQogLyogVHJ1bmNhdGUgZmlsZSB0byB0aGUgbmV3IHNpemUuIE5vdGUsIHRoaXMgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHRyYW5zYWN0aW9uCiAgICBhbHJlYWR5IHN0YXJ0ZWQgKi8KLWludCByZWlzZXJmc19kb190cnVuY2F0ZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICBzdHJ1Y3QgIGlub2RlICogcF9zX2lub2RlLCAvKiAtPmlfc2l6ZSBjb250YWlucyBuZXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKi8KLQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCAvKiB1cCB0byBkYXRlIGZvciBsYXN0IGJsb2NrICovCi0JCQkgICBpbnQgdXBkYXRlX3RpbWVzdGFtcHMgIC8qIHdoZW4gaXQgaXMgY2FsbGVkIGJ5Ci0JCQkJCQkgICAgIGZpbGVfcmVsZWFzZSB0byBjb252ZXJ0Ci0JCQkJCQkgICAgIHRoZSB0YWlsIC0gbm8gdGltZXN0YW1wcwotCQkJCQkJICAgICBzaG91bGQgYmUgdXBkYXRlZCAqLwotICAgICkgewotICAgIElOSVRJQUxJWkVfUEFUSCAoc19zZWFyY2hfcGF0aCk7ICAgICAgIC8qIFBhdGggdG8gdGhlIGN1cnJlbnQgb2JqZWN0IGl0ZW0uICovCi0gICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIHBfbGVfaWg7ICAgICAgICAgLyogUG9pbnRlciB0byBhbiBpdGVtIGhlYWRlci4gKi8KLSAgICBzdHJ1Y3QgY3B1X2tleSAgICAgIHNfaXRlbV9rZXk7ICAgICAvKiBLZXkgdG8gc2VhcmNoIGZvciBhIHByZXZpb3VzIGZpbGUgaXRlbS4gKi8KLSAgICBsb2ZmX3QgICAgICAgICBuX2ZpbGVfc2l6ZSwgICAgLyogT2xkIGZpbGUgc2l6ZS4gKi8KLQluX25ld19maWxlX3NpemU7LyogTmV3IGZpbGUgc2l6ZS4gKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9kZWxldGVkOyAgICAgIC8qIE51bWJlciBvZiBkZWxldGVkIG9yIHRydW5jYXRlZCBieXRlcy4gKi8KLSAgICBpbnQgcmV0dmFsOwotICAgIGludCBlcnIgPSAwOworaW50IHJlaXNlcmZzX2RvX3RydW5jYXRlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwJLyogLT5pX3NpemUgY29udGFpbnMgbmV3CisJCQkJCQkJCQkJCQkgICBzaXplICovCisJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsCS8qIHVwIHRvIGRhdGUgZm9yIGxhc3QgYmxvY2sgKi8KKwkJCSBpbnQgdXBkYXRlX3RpbWVzdGFtcHMJLyogd2hlbiBpdCBpcyBjYWxsZWQgYnkKKwkJCQkJCSAgIGZpbGVfcmVsZWFzZSB0byBjb252ZXJ0CisJCQkJCQkgICB0aGUgdGFpbCAtIG5vIHRpbWVzdGFtcHMKKwkJCQkJCSAgIHNob3VsZCBiZSB1cGRhdGVkICovCisgICAgKQoreworCUlOSVRJQUxJWkVfUEFUSChzX3NlYXJjaF9wYXRoKTsJLyogUGF0aCB0byB0aGUgY3VycmVudCBvYmplY3QgaXRlbS4gKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICpwX2xlX2loOwkvKiBQb2ludGVyIHRvIGFuIGl0ZW0gaGVhZGVyLiAqLworCXN0cnVjdCBjcHVfa2V5IHNfaXRlbV9rZXk7CS8qIEtleSB0byBzZWFyY2ggZm9yIGEgcHJldmlvdXMgZmlsZSBpdGVtLiAqLworCWxvZmZfdCBuX2ZpbGVfc2l6ZSwJLyogT2xkIGZpbGUgc2l6ZS4gKi8KKwkgbl9uZXdfZmlsZV9zaXplOwkvKiBOZXcgZmlsZSBzaXplLiAqLworCWludCBuX2RlbGV0ZWQ7CQkvKiBOdW1iZXIgb2YgZGVsZXRlZCBvciB0cnVuY2F0ZWQgYnl0ZXMuICovCisJaW50IHJldHZhbDsKKwlpbnQgZXJyID0gMDsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKLSAgICBpZiAoICEgKFNfSVNSRUcocF9zX2lub2RlLT5pX21vZGUpIHx8IFNfSVNESVIocF9zX2lub2RlLT5pX21vZGUpIHx8IFNfSVNMTksocF9zX2lub2RlLT5pX21vZGUpKSApCi0JcmV0dXJuIDA7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CisJaWYgKCEKKwkgICAgKFNfSVNSRUcocF9zX2lub2RlLT5pX21vZGUpIHx8IFNfSVNESVIocF9zX2lub2RlLT5pX21vZGUpCisJICAgICB8fCBTX0lTTE5LKHBfc19pbm9kZS0+aV9tb2RlKSkpCisJCXJldHVybiAwOwogCi0gICAgaWYgKFNfSVNESVIocF9zX2lub2RlLT5pX21vZGUpKSB7Ci0JLy8gZGVsZXRpb24gb2YgZGlyZWN0b3J5IC0gbm8gbmVlZCB0byB1cGRhdGUgdGltZXN0YW1wcwotCXRydW5jYXRlX2RpcmVjdG9yeSAodGgsIHBfc19pbm9kZSk7Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogR2V0IG5ldyBmaWxlIHNpemUuICovCi0gICAgbl9uZXdfZmlsZV9zaXplID0gcF9zX2lub2RlLT5pX3NpemU7Ci0KLSAgICAvLyBGSVhNRTogbm90ZSwgdGhhdCBrZXkgdHlwZSBpcyB1bmltcG9ydGFudCBoZXJlCi0gICAgbWFrZV9jcHVfa2V5ICgmc19pdGVtX2tleSwgcF9zX2lub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChwX3NfaW5vZGUpLCBUWVBFX0RJUkVDVCwgMyk7Ci0KLSAgICByZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LCAmc19zZWFyY2hfcGF0aCk7Ci0gICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgInZzLTU2NTc6IHJlaXNlcmZzX2RvX3RydW5jYXRlOiAiCi0JCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gdHJ1bmNhdGUgJUsiLCAmc19pdGVtX2tleSk7Ci0gICAgICAgIGVyciA9IC1FSU87Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICBpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EIHx8IHJldHZhbCA9PSBGSUxFX05PVF9GT1VORCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgIlBBUC01NjYwOiByZWlzZXJmc19kb190cnVuY2F0ZTogIgotCQkJICAid3JvbmcgcmVzdWx0ICVkIG9mIHNlYXJjaCBmb3IgJUsiLCByZXR2YWwsICZzX2l0ZW1fa2V5KTsKLQotICAgICAgICBlcnIgPSAtRUlPOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBzX3NlYXJjaF9wYXRoLnBvc19pbl9pdGVtIC0tOwotCi0gICAgLyogR2V0IHJlYWwgZmlsZSBzaXplICh0b3RhbCBsZW5ndGggb2YgYWxsIGZpbGUgaXRlbXMpICovCi0gICAgcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCgmc19zZWFyY2hfcGF0aCk7Ci0gICAgaWYgKCBpc19zdGF0ZGF0YV9sZV9paCAocF9sZV9paCkgKQotCW5fZmlsZV9zaXplID0gMDsKLSAgICBlbHNlIHsKLQlsb2ZmX3Qgb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpOwotCWludCBieXRlcyA9IG9wX2J5dGVzX251bWJlciAocF9sZV9paCxwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQotCS8qIHRoaXMgbWF5IG1pc21hdGNoIHdpdGggcmVhbCBmaWxlIHNpemU6IGlmIGxhc3QgZGlyZWN0IGl0ZW0KLSAgICAgICAgICAgaGFkIG5vIHBhZGRpbmcgemVyb3MgYW5kIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBoYWQgbm8gZnJlZQotICAgICAgICAgICBzcGFjZSwgdGhpcyBmaWxlIHdvdWxkIGhhdmUgdGhpcyBmaWxlIHNpemUgKi8KLQluX2ZpbGVfc2l6ZSA9IG9mZnNldCArIGJ5dGVzIC0gMTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBhcmUgd2UgZG9pbmcgYSBmdWxsIHRydW5jYXRlIG9yIGRlbGV0ZSwgaWYgc28KLSAgICAgKiBraWNrIGluIHRoZSByZWFkYSBjb2RlCi0gICAgICovCi0gICAgaWYgKG5fbmV3X2ZpbGVfc2l6ZSA9PSAwKQotICAgICAgICBzX3NlYXJjaF9wYXRoLnJlYWRhID0gUEFUSF9SRUFEQSB8IFBBVEhfUkVBREFfQkFDSzsKLQotICAgIGlmICggbl9maWxlX3NpemUgPT0gMCB8fCBuX2ZpbGVfc2l6ZSA8IG5fbmV3X2ZpbGVfc2l6ZSApIHsKLQlnb3RvIHVwZGF0ZV9hbmRfb3V0IDsKLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGxhc3QgZmlsZSBpdGVtLiAqLwotICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmc19pdGVtX2tleSwgbl9maWxlX3NpemUpOwotCi0gICAgZG8gIHsKLQkvKiBDdXQgb3IgZGVsZXRlIGZpbGUgaXRlbS4gKi8KLQluX2RlbGV0ZWQgPSByZWlzZXJmc19jdXRfZnJvbV9pdGVtKHRoLCAmc19zZWFyY2hfcGF0aCwgJnNfaXRlbV9rZXksIHBfc19pbm9kZSwgIHBhZ2UsIG5fbmV3X2ZpbGVfc2l6ZSk7Ci0JaWYgKG5fZGVsZXRlZCA8IDApIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX2lub2RlLT5pX3NiLCAidnMtNTY2NTogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZmFpbGVkIik7Ci0JICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnNfc2VhcmNoX3BhdGgpIDsKLQkgICAgcmV0dXJuIDA7CisJaWYgKFNfSVNESVIocF9zX2lub2RlLT5pX21vZGUpKSB7CisJCS8vIGRlbGV0aW9uIG9mIGRpcmVjdG9yeSAtIG5vIG5lZWQgdG8gdXBkYXRlIHRpbWVzdGFtcHMKKwkJdHJ1bmNhdGVfZGlyZWN0b3J5KHRoLCBwX3NfaW5vZGUpOworCQlyZXR1cm4gMDsKIAl9CiAKLQlSRkFMU0UoIG5fZGVsZXRlZCA+IG5fZmlsZV9zaXplLAotCQkiUEFQLTU2NzA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IHRvbyBtYW55IGJ5dGVzIGRlbGV0ZWQ6IGRlbGV0ZWQgJWQsIGZpbGVfc2l6ZSAlbHUsIGl0ZW1fa2V5ICVLIiwKLQkJbl9kZWxldGVkLCBuX2ZpbGVfc2l6ZSwgJnNfaXRlbV9rZXkpOworCS8qIEdldCBuZXcgZmlsZSBzaXplLiAqLworCW5fbmV3X2ZpbGVfc2l6ZSA9IHBfc19pbm9kZS0+aV9zaXplOwogCi0JLyogQ2hhbmdlIGtleSB0byBzZWFyY2ggdGhlIGxhc3QgZmlsZSBpdGVtLiAqLwotCW5fZmlsZV9zaXplIC09IG5fZGVsZXRlZDsKKwkvLyBGSVhNRTogbm90ZSwgdGhhdCBrZXkgdHlwZSBpcyB1bmltcG9ydGFudCBoZXJlCisJbWFrZV9jcHVfa2V5KCZzX2l0ZW1fa2V5LCBwX3NfaW5vZGUsIG1heF9yZWlzZXJmc19vZmZzZXQocF9zX2lub2RlKSwKKwkJICAgICBUWVBFX0RJUkVDVCwgMyk7CiAKLQlzZXRfY3B1X2tleV9rX29mZnNldCAoJnNfaXRlbV9rZXksIG5fZmlsZV9zaXplKTsKKwlyZXR2YWwgPQorCSAgICBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LAorCQkJCSAgICAgICAmc19zZWFyY2hfcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkgInZzLTU2NTc6IHJlaXNlcmZzX2RvX3RydW5jYXRlOiAiCisJCQkJICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gdHJ1bmNhdGUgJUsiLAorCQkJCSAmc19pdGVtX2tleSk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EIHx8IHJldHZhbCA9PSBGSUxFX05PVF9GT1VORCkgeworCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkgIlBBUC01NjYwOiByZWlzZXJmc19kb190cnVuY2F0ZTogIgorCQkJCSAid3JvbmcgcmVzdWx0ICVkIG9mIHNlYXJjaCBmb3IgJUsiLCByZXR2YWwsCisJCQkJICZzX2l0ZW1fa2V5KTsKIAotCS8qIFdoaWxlIHRoZXJlIGFyZSBieXRlcyB0byB0cnVuY2F0ZSBhbmQgcHJldmlvdXMgZmlsZSBpdGVtIGlzIHByZXNlbnRlZCBpbiB0aGUgdHJlZS4gKi8KKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQogCisJc19zZWFyY2hfcGF0aC5wb3NfaW5faXRlbS0tOworCisJLyogR2V0IHJlYWwgZmlsZSBzaXplICh0b3RhbCBsZW5ndGggb2YgYWxsIGZpbGUgaXRlbXMpICovCisJcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCgmc19zZWFyY2hfcGF0aCk7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKQorCQluX2ZpbGVfc2l6ZSA9IDA7CisJZWxzZSB7CisJCWxvZmZfdCBvZmZzZXQgPSBsZV9paF9rX29mZnNldChwX2xlX2loKTsKKwkJaW50IGJ5dGVzID0KKwkJICAgIG9wX2J5dGVzX251bWJlcihwX2xlX2loLCBwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKworCQkvKiB0aGlzIG1heSBtaXNtYXRjaCB3aXRoIHJlYWwgZmlsZSBzaXplOiBpZiBsYXN0IGRpcmVjdCBpdGVtCisJCSAgIGhhZCBubyBwYWRkaW5nIHplcm9zIGFuZCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgaGFkIG5vIGZyZWUKKwkJICAgc3BhY2UsIHRoaXMgZmlsZSB3b3VsZCBoYXZlIHRoaXMgZmlsZSBzaXplICovCisJCW5fZmlsZV9zaXplID0gb2Zmc2V0ICsgYnl0ZXMgLSAxOworCX0KIAkvKgotCSoqIFRoaXMgbG9vcCBjb3VsZCB0YWtlIGEgcmVhbGx5IGxvbmcgdGltZSwgYW5kIGNvdWxkIGxvZyAKLQkqKiBtYW55IG1vcmUgYmxvY2tzIHRoYW4gYSB0cmFuc2FjdGlvbiBjYW4gaG9sZC4gIFNvLCB3ZSBkbyBhIHBvbGl0ZQotCSoqIGpvdXJuYWwgZW5kIGhlcmUsIGFuZCBpZiB0aGUgdHJhbnNhY3Rpb24gbmVlZHMgZW5kaW5nLCB3ZSBtYWtlCi0JKiogc3VyZSB0aGUgZmlsZSBpcyBjb25zaXN0ZW50IGJlZm9yZSBlbmRpbmcgdGhlIGN1cnJlbnQgdHJhbnMKLQkqKiBhbmQgc3RhcnRpbmcgYSBuZXcgb25lCi0JKi8KLSAgICAgICAgaWYgKGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZCh0aCwgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkpIHsKLQkgIGludCBvcmlnX2xlbl9hbGxvYyA9IHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQgOwotCSAgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfc2VhcmNoX3BhdGgpIDsKKwkgKiBhcmUgd2UgZG9pbmcgYSBmdWxsIHRydW5jYXRlIG9yIGRlbGV0ZSwgaWYgc28KKwkgKiBraWNrIGluIHRoZSByZWFkYSBjb2RlCisJICovCisJaWYgKG5fbmV3X2ZpbGVfc2l6ZSA9PSAwKQorCQlzX3NlYXJjaF9wYXRoLnJlYWRhID0gUEFUSF9SRUFEQSB8IFBBVEhfUkVBREFfQkFDSzsKIAotCSAgaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7Ci0JICAgICAgcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLQkgIH0gCi0JICByZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSkgOwotCi0JICBlcnIgPSBqb3VybmFsX2VuZCh0aCwgcF9zX2lub2RlLT5pX3NiLCBvcmlnX2xlbl9hbGxvYykgOwotCSAgaWYgKGVycikKLQkgICAgZ290byBvdXQ7Ci0JICBlcnIgPSBqb3VybmFsX2JlZ2luICh0aCwgcF9zX2lub2RlLT5pX3NiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogNik7Ci0JICBpZiAoZXJyKQotCSAgICBnb3RvIG91dDsKLQkgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwX3NfaW5vZGUpIDsKKwlpZiAobl9maWxlX3NpemUgPT0gMCB8fCBuX2ZpbGVfc2l6ZSA8IG5fbmV3X2ZpbGVfc2l6ZSkgeworCQlnb3RvIHVwZGF0ZV9hbmRfb3V0OwogCX0KLSAgICB9IHdoaWxlICggbl9maWxlX3NpemUgPiBST1VORF9VUCAobl9uZXdfZmlsZV9zaXplKSAmJgotCSAgICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19pbm9kZS0+aV9zYiwgJnNfaXRlbV9rZXksICZzX3NlYXJjaF9wYXRoKSA9PSBQT1NJVElPTl9GT1VORCApICA7CiAKLSAgICBSRkFMU0UoIG5fZmlsZV9zaXplID4gUk9VTkRfVVAgKG5fbmV3X2ZpbGVfc2l6ZSksCi0JICAgICJQQVAtNTY4MDogdHJ1bmNhdGUgZGlkIG5vdCBmaW5pc2g6IG5ld19maWxlX3NpemUgJUxkLCBjdXJyZW50ICVMZCwgb2lkICVkIiwKLQkgICAgbl9uZXdfZmlsZV9zaXplLCBuX2ZpbGVfc2l6ZSwgc19pdGVtX2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKKwkvKiBVcGRhdGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGxhc3QgZmlsZSBpdGVtLiAqLworCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZzX2l0ZW1fa2V5LCBuX2ZpbGVfc2l6ZSk7CiAKLXVwZGF0ZV9hbmRfb3V0OgotICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgewotCS8vIHRoaXMgaXMgdHJ1bmNhdGUsIG5vdCBmaWxlIGNsb3NpbmcKLQkgICAgcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICB9Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICh0aCwgcF9zX2lub2RlKTsKKwlkbyB7CisJCS8qIEN1dCBvciBkZWxldGUgZmlsZSBpdGVtLiAqLworCQluX2RlbGV0ZWQgPQorCQkgICAgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSh0aCwgJnNfc2VhcmNoX3BhdGgsICZzX2l0ZW1fa2V5LAorCQkJCQkgICBwX3NfaW5vZGUsIHBhZ2UsIG5fbmV3X2ZpbGVfc2l6ZSk7CisJCWlmIChuX2RlbGV0ZWQgPCAwKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHBfc19pbm9kZS0+aV9zYiwKKwkJCQkJICJ2cy01NjY1OiByZWlzZXJmc19kb190cnVuY2F0ZTogcmVpc2VyZnNfY3V0X2Zyb21faXRlbSBmYWlsZWQiKTsKKwkJCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnNfc2VhcmNoX3BhdGgpOworCQkJcmV0dXJuIDA7CisJCX0KIAotb3V0OgotICAgIHBhdGhyZWxzZSgmc19zZWFyY2hfcGF0aCkgOwotICAgIHJldHVybiBlcnI7CisJCVJGQUxTRShuX2RlbGV0ZWQgPiBuX2ZpbGVfc2l6ZSwKKwkJICAgICAgICJQQVAtNTY3MDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogdG9vIG1hbnkgYnl0ZXMgZGVsZXRlZDogZGVsZXRlZCAlZCwgZmlsZV9zaXplICVsdSwgaXRlbV9rZXkgJUsiLAorCQkgICAgICAgbl9kZWxldGVkLCBuX2ZpbGVfc2l6ZSwgJnNfaXRlbV9rZXkpOworCisJCS8qIENoYW5nZSBrZXkgdG8gc2VhcmNoIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KKwkJbl9maWxlX3NpemUgLT0gbl9kZWxldGVkOworCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCZzX2l0ZW1fa2V5LCBuX2ZpbGVfc2l6ZSk7CisKKwkJLyogV2hpbGUgdGhlcmUgYXJlIGJ5dGVzIHRvIHRydW5jYXRlIGFuZCBwcmV2aW91cyBmaWxlIGl0ZW0gaXMgcHJlc2VudGVkIGluIHRoZSB0cmVlLiAqLworCisJCS8qCisJCSAqKiBUaGlzIGxvb3AgY291bGQgdGFrZSBhIHJlYWxseSBsb25nIHRpbWUsIGFuZCBjb3VsZCBsb2cgCisJCSAqKiBtYW55IG1vcmUgYmxvY2tzIHRoYW4gYSB0cmFuc2FjdGlvbiBjYW4gaG9sZC4gIFNvLCB3ZSBkbyBhIHBvbGl0ZQorCQkgKiogam91cm5hbCBlbmQgaGVyZSwgYW5kIGlmIHRoZSB0cmFuc2FjdGlvbiBuZWVkcyBlbmRpbmcsIHdlIG1ha2UKKwkJICoqIHN1cmUgdGhlIGZpbGUgaXMgY29uc2lzdGVudCBiZWZvcmUgZW5kaW5nIHRoZSBjdXJyZW50IHRyYW5zCisJCSAqKiBhbmQgc3RhcnRpbmcgYSBuZXcgb25lCisJCSAqLworCQlpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHRoLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSkgeworCQkJaW50IG9yaWdfbGVuX2FsbG9jID0gdGgtPnRfYmxvY2tzX2FsbG9jYXRlZDsKKwkJCWRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKCZzX3NlYXJjaF9wYXRoKTsKKworCQkJaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7CisJCQkJcF9zX2lub2RlLT5pX210aW1lID0gcF9zX2lub2RlLT5pX2N0aW1lID0KKwkJCQkgICAgQ1VSUkVOVF9USU1FX1NFQzsKKwkJCX0KKwkJCXJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgcF9zX2lub2RlKTsKKworCQkJZXJyID0gam91cm5hbF9lbmQodGgsIHBfc19pbm9kZS0+aV9zYiwgb3JpZ19sZW5fYWxsb2MpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJCWVyciA9IGpvdXJuYWxfYmVnaW4odGgsIHBfc19pbm9kZS0+aV9zYiwKKwkJCQkJICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogNik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBfc19pbm9kZSk7CisJCX0KKwl9IHdoaWxlIChuX2ZpbGVfc2l6ZSA+IFJPVU5EX1VQKG5fbmV3X2ZpbGVfc2l6ZSkgJiYKKwkJIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19pbm9kZS0+aV9zYiwgJnNfaXRlbV9rZXksCisJCQkJCSAgICAmc19zZWFyY2hfcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQpOworCisJUkZBTFNFKG5fZmlsZV9zaXplID4gUk9VTkRfVVAobl9uZXdfZmlsZV9zaXplKSwKKwkgICAgICAgIlBBUC01NjgwOiB0cnVuY2F0ZSBkaWQgbm90IGZpbmlzaDogbmV3X2ZpbGVfc2l6ZSAlTGQsIGN1cnJlbnQgJUxkLCBvaWQgJWQiLAorCSAgICAgICBuX25ld19maWxlX3NpemUsIG5fZmlsZV9zaXplLCBzX2l0ZW1fa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpOworCisgICAgICB1cGRhdGVfYW5kX291dDoKKwlpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKKwkJLy8gdGhpcyBpcyB0cnVuY2F0ZSwgbm90IGZpbGUgY2xvc2luZworCQlwX3NfaW5vZGUtPmlfbXRpbWUgPSBwX3NfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCX0KKwlyZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKyAgICAgIG91dDoKKwlwYXRocmVsc2UoJnNfc2VhcmNoX3BhdGgpOworCXJldHVybiBlcnI7CiB9CiAKLQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwogLy8gdGhpcyBtYWtlcyBzdXJlLCB0aGF0IHdlIF9fYXBwZW5kX18sIG5vdCBvdmVyd3JpdGUgb3IgYWRkIGhvbGVzCi1zdGF0aWMgdm9pZCBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGUgKHN0cnVjdCBwYXRoICogcGF0aCwgCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBwX3Nfa2V5KQorc3RhdGljIHZvaWQgY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlKHN0cnVjdCBwYXRoICpwYXRoLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19rZXkpCiB7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGZvdW5kX2loID0gZ2V0X2loIChwYXRoKTsKLSAgICAKLSAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChmb3VuZF9paCkpIHsKLQlpZiAobGVfaWhfa19vZmZzZXQgKGZvdW5kX2loKSArIG9wX2J5dGVzX251bWJlciAoZm91bmRfaWgsIGdldF9sYXN0X2JoIChwYXRoKS0+Yl9zaXplKSAhPQotCSAgICBjcHVfa2V5X2tfb2Zmc2V0IChwX3Nfa2V5KSB8fAotCSAgICBvcF9ieXRlc19udW1iZXIgKGZvdW5kX2loLCBnZXRfbGFzdF9iaCAocGF0aCktPmJfc2l6ZSkgIT0gcG9zX2luX2l0ZW0gKHBhdGgpKQotCSAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgIlBBUC01NzIwOiBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGU6ICIKLQkJCSAgICAiZm91bmQgZGlyZWN0IGl0ZW0gJWggb3IgcG9zaXRpb24gKCVkKSBkb2VzIG5vdCBtYXRjaCB0byBrZXkgJUsiLAotCQkJICAgIGZvdW5kX2loLCBwb3NfaW5faXRlbSAocGF0aCksIHBfc19rZXkpOwotICAgIH0KLSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGZvdW5kX2loKSkgewotCWlmIChsZV9paF9rX29mZnNldCAoZm91bmRfaWgpICsgb3BfYnl0ZXNfbnVtYmVyIChmb3VuZF9paCwgZ2V0X2xhc3RfYmggKHBhdGgpLT5iX3NpemUpICE9IGNwdV9rZXlfa19vZmZzZXQgKHBfc19rZXkpIHx8IAotCSAgICBJX1VORk1fTlVNIChmb3VuZF9paCkgIT0gcG9zX2luX2l0ZW0gKHBhdGgpIHx8Ci0JICAgIGdldF9paF9mcmVlX3NwYWNlIChmb3VuZF9paCkgIT0gMCkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJQQVAtNTczMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCi0JCQkgICAgImZvdW5kIGluZGlyZWN0IGl0ZW0gKCVoKSBvciBwb3NpdGlvbiAoJWQpIGRvZXMgbm90IG1hdGNoIHRvIGtleSAoJUspIiwKLQkJCSAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0gKHBhdGgpLCBwX3Nfa2V5KTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogY29uZmlnIHJlaXNlcmZzIGNoZWNrICovCisJc3RydWN0IGl0ZW1faGVhZCAqZm91bmRfaWggPSBnZXRfaWgocGF0aCk7CiAKKwlpZiAoaXNfZGlyZWN0X2xlX2loKGZvdW5kX2loKSkgeworCQlpZiAobGVfaWhfa19vZmZzZXQoZm91bmRfaWgpICsKKwkJICAgIG9wX2J5dGVzX251bWJlcihmb3VuZF9paCwKKwkJCQkgICAgZ2V0X2xhc3RfYmgocGF0aCktPmJfc2l6ZSkgIT0KKwkJICAgIGNwdV9rZXlfa19vZmZzZXQocF9zX2tleSkKKwkJICAgIHx8IG9wX2J5dGVzX251bWJlcihmb3VuZF9paCwKKwkJCQkgICAgICAgZ2V0X2xhc3RfYmgocGF0aCktPmJfc2l6ZSkgIT0KKwkJICAgIHBvc19pbl9pdGVtKHBhdGgpKQorCQkJcmVpc2VyZnNfcGFuaWMoTlVMTCwKKwkJCQkgICAgICAgIlBBUC01NzIwOiBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGU6ICIKKwkJCQkgICAgICAgImZvdW5kIGRpcmVjdCBpdGVtICVoIG9yIHBvc2l0aW9uICglZCkgZG9lcyBub3QgbWF0Y2ggdG8ga2V5ICVLIiwKKwkJCQkgICAgICAgZm91bmRfaWgsIHBvc19pbl9pdGVtKHBhdGgpLCBwX3Nfa2V5KTsKKwl9CisJaWYgKGlzX2luZGlyZWN0X2xlX2loKGZvdW5kX2loKSkgeworCQlpZiAobGVfaWhfa19vZmZzZXQoZm91bmRfaWgpICsKKwkJICAgIG9wX2J5dGVzX251bWJlcihmb3VuZF9paCwKKwkJCQkgICAgZ2V0X2xhc3RfYmgocGF0aCktPmJfc2l6ZSkgIT0KKwkJICAgIGNwdV9rZXlfa19vZmZzZXQocF9zX2tleSkKKwkJICAgIHx8IElfVU5GTV9OVU0oZm91bmRfaWgpICE9IHBvc19pbl9pdGVtKHBhdGgpCisJCSAgICB8fCBnZXRfaWhfZnJlZV9zcGFjZShmb3VuZF9paCkgIT0gMCkKKwkJCXJlaXNlcmZzX3BhbmljKE5VTEwsCisJCQkJICAgICAgICJQQVAtNTczMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCisJCQkJICAgICAgICJmb3VuZCBpbmRpcmVjdCBpdGVtICglaCkgb3IgcG9zaXRpb24gKCVkKSBkb2VzIG5vdCBtYXRjaCB0byBrZXkgKCVLKSIsCisJCQkJICAgICAgIGZvdW5kX2loLCBwb3NfaW5faXRlbShwYXRoKSwgcF9zX2tleSk7CisJfQorfQorI2VuZGlmCQkJCS8qIGNvbmZpZyByZWlzZXJmcyBjaGVjayAqLwogCiAvKiBQYXN0ZSBieXRlcyB0byB0aGUgZXhpc3RpbmcgaXRlbS4gUmV0dXJucyBieXRlcyBudW1iZXIgcGFzdGVkIGludG8gdGhlIGl0ZW0uICovCi1pbnQgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkgICAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3NlYXJjaF9wYXRoLAkvKiBQYXRoIHRvIHRoZSBwYXN0ZWQgaXRlbS4gICAgICAgICAgKi8KLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBwX3Nfa2V5LCAgICAgICAgCS8qIEtleSB0byBzZWFyY2ggZm9yIHRoZSBuZWVkZWQgaXRlbS4qLwotCQkJICAgICAgc3RydWN0IGlub2RlCSAgKiBpbm9kZSwJCS8qIElub2RlIGl0ZW0gYmVsb25ncyB0byAqLwotCQkJICAgICAgY29uc3QgY2hhciAgICAgICAgICAqIHBfY19ib2R5LCAgICAgICAJLyogUG9pbnRlciB0byB0aGUgYnl0ZXMgdG8gcGFzdGUuICAgICovCi0JCQkgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9wYXN0ZWRfc2l6ZSkgIAkvKiBTaXplIG9mIHBhc3RlZCBieXRlcy4gICAgICAgICAgICAgKi8KLXsKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfcGFzdGVfYmFsYW5jZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIHJldHZhbDsKLSAgICBpbnQJCQlmc19nZW47CitpbnQgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoLAkvKiBQYXRoIHRvIHRoZSBwYXN0ZWQgaXRlbS4gICAgICAgICAgKi8KKwkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKnBfc19rZXksCS8qIEtleSB0byBzZWFyY2ggZm9yIHRoZSBuZWVkZWQgaXRlbS4gKi8KKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwJLyogSW5vZGUgaXRlbSBiZWxvbmdzIHRvICovCisJCQkgICAgIGNvbnN0IGNoYXIgKnBfY19ib2R5LAkvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBwYXN0ZS4gICAgKi8KKwkJCSAgICAgaW50IG5fcGFzdGVkX3NpemUpCit7CQkJCS8qIFNpemUgb2YgcGFzdGVkIGJ5dGVzLiAgICAgICAgICAgICAqLworCXN0cnVjdCB0cmVlX2JhbGFuY2Ugc19wYXN0ZV9iYWxhbmNlOworCWludCByZXR2YWw7CisJaW50IGZzX2dlbjsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIGZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKSA7CisJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpOwogCiAjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKLSAgICByZWlzZXJmc19kZWJ1ZyAoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBwYXN0ZV9pbnRvX2l0ZW0oKTogYWxsb2NhdGluZyAldSBpZD0ldSB0eXBlPSVjIiwgbl9wYXN0ZWRfc2l6ZSwgaW5vZGUtPmlfdWlkLCBrZXkydHlwZSgmKHBfc19rZXktPm9uX2Rpc2tfa2V5KSkpOworCXJlaXNlcmZzX2RlYnVnKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgInJlaXNlcnF1b3RhIHBhc3RlX2ludG9faXRlbSgpOiBhbGxvY2F0aW5nICV1IGlkPSV1IHR5cGU9JWMiLAorCQkgICAgICAgbl9wYXN0ZWRfc2l6ZSwgaW5vZGUtPmlfdWlkLAorCQkgICAgICAga2V5MnR5cGUoJihwX3Nfa2V5LT5vbl9kaXNrX2tleSkpKTsKICNlbmRpZgogCi0gICAgaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpKSB7Ci0JcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7Ci0JcmV0dXJuIC1FRFFVT1Q7Ci0gICAgfQotICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19wYXN0ZV9iYWxhbmNlLCB0aC0+dF9zdXBlciwgcF9zX3NlYXJjaF9wYXRoLCBuX3Bhc3RlZF9zaXplKTsKKwlpZiAoRFFVT1RfQUxMT0NfU1BBQ0VfTk9ESVJUWShpbm9kZSwgbl9wYXN0ZWRfc2l6ZSkpIHsKKwkJcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7CisJCXJldHVybiAtRURRVU9UOworCX0KKwlpbml0X3RiX3N0cnVjdCh0aCwgJnNfcGFzdGVfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19zZWFyY2hfcGF0aCwKKwkJICAgICAgIG5fcGFzdGVkX3NpemUpOwogI2lmZGVmIERJU1BMQUNFX05FV19QQUNLSU5HX0xPQ0FMSVRJRVMKLSAgICBzX3Bhc3RlX2JhbGFuY2Uua2V5ID0gcF9zX2tleS0+b25fZGlza19rZXk7CisJc19wYXN0ZV9iYWxhbmNlLmtleSA9IHBfc19rZXktPm9uX2Rpc2tfa2V5OwogI2VuZGlmCiAKLSAgICAvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayBiZWZvcmUgdGhlIGZpeF9ub2RlcyAqLwotICAgIGlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpKSB7Ci0JZ290byBzZWFyY2hfYWdhaW47Ci0gICAgfQorCS8qIERRVU9UXyogY2FuIHNjaGVkdWxlLCBtdXN0IGNoZWNrIGJlZm9yZSB0aGUgZml4X25vZGVzICovCisJaWYgKGZzX2NoYW5nZWQoZnNfZ2VuLCBpbm9kZS0+aV9zYikpIHsKKwkJZ290byBzZWFyY2hfYWdhaW47CisJfQogCi0gICAgd2hpbGUgKChyZXR2YWwgPSBmaXhfbm9kZXMoTV9QQVNURSwgJnNfcGFzdGVfYmFsYW5jZSwgTlVMTCwgcF9jX2JvZHkpKSA9PQotUkVQRUFUX1NFQVJDSCApIHsKLXNlYXJjaF9hZ2FpbjoKLQkvKiBmaWxlIHN5c3RlbSBjaGFuZ2VkIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGZpeF9ub2RlcyAqLwotCVBST0NfSU5GT19JTkMoIHRoIC0+IHRfc3VwZXIsIHBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQgKTsKLQlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAodGgtPnRfc3VwZXIsIHBfc19rZXksIHBfc19zZWFyY2hfcGF0aCk7Ci0JaWYgKHJldHZhbCA9PSBJT19FUlJPUikgewotCSAgICByZXR2YWwgPSAtRUlPIDsKLQkgICAgZ290byBlcnJvcl9vdXQgOwotCX0KLQlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiUEFQLTU3MTA6IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbTogZW50cnkgb3IgcGFzdGVkIGJ5dGUgKCVLKSBleGlzdHMiLCBwX3Nfa2V5KTsKLQkgICAgcmV0dmFsID0gLUVFWElTVCA7Ci0JICAgIGdvdG8gZXJyb3Jfb3V0IDsKLQl9Ci0JCisJd2hpbGUgKChyZXR2YWwgPQorCQlmaXhfbm9kZXMoTV9QQVNURSwgJnNfcGFzdGVfYmFsYW5jZSwgTlVMTCwKKwkJCSAgcF9jX2JvZHkpKSA9PSBSRVBFQVRfU0VBUkNIKSB7CisJICAgICAgc2VhcmNoX2FnYWluOgorCQkvKiBmaWxlIHN5c3RlbSBjaGFuZ2VkIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGZpeF9ub2RlcyAqLworCQlQUk9DX0lORk9fSU5DKHRoLT50X3N1cGVyLCBwYXN0ZV9pbnRvX2l0ZW1fcmVzdGFydGVkKTsKKwkJcmV0dmFsID0KKwkJICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHRoLT50X3N1cGVyLCBwX3Nfa2V5LAorCQkJCQkgICAgICAgcF9zX3NlYXJjaF9wYXRoKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcmV0dmFsID0gLUVJTzsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJCSAiUEFQLTU3MTA6IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbTogZW50cnkgb3IgcGFzdGVkIGJ5dGUgKCVLKSBleGlzdHMiLAorCQkJCQkgcF9zX2tleSk7CisJCQlyZXR2YWwgPSAtRUVYSVNUOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQljaGVja19yZXNlYXJjaF9mb3JfcGFzdGUgKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSk7CisJCWNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZShwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXkpOwogI2VuZGlmCi0gICAgfQorCX0KIAotICAgIC8qIFBlcmZvcm0gYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgYXJlIGNvbGxlY3RlZCBieSBmaXhfbm9kZXMsIGFuZAotICAgICAgIGFjY2Vzc2luZyB0aGVtIHdpbGwgbm90IHJpc2sgdHJpZ2dlcmluZyBzY2hlZHVsZS4gKi8KLSAgICBpZiAoIHJldHZhbCA9PSBDQVJSWV9PTiApIHsKLQlkb19iYWxhbmNlKCZzX3Bhc3RlX2JhbGFuY2UsIE5VTEwvKmloKi8sIHBfY19ib2R5LCBNX1BBU1RFKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dmFsID0gKHJldHZhbCA9PSBOT19ESVNLX1NQQUNFKSA/IC1FTk9TUEMgOiAtRUlPOwotZXJyb3Jfb3V0OgotICAgIC8qIHRoaXMgYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLwotICAgIHVuZml4X25vZGVzKCZzX3Bhc3RlX2JhbGFuY2UpOworCS8qIFBlcmZvcm0gYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgYXJlIGNvbGxlY3RlZCBieSBmaXhfbm9kZXMsIGFuZAorCSAgIGFjY2Vzc2luZyB0aGVtIHdpbGwgbm90IHJpc2sgdHJpZ2dlcmluZyBzY2hlZHVsZS4gKi8KKwlpZiAocmV0dmFsID09IENBUlJZX09OKSB7CisJCWRvX2JhbGFuY2UoJnNfcGFzdGVfYmFsYW5jZSwgTlVMTCAvKmloICovICwgcF9jX2JvZHksIE1fUEFTVEUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dmFsID0gKHJldHZhbCA9PSBOT19ESVNLX1NQQUNFKSA/IC1FTk9TUEMgOiAtRUlPOworICAgICAgZXJyb3Jfb3V0OgorCS8qIHRoaXMgYWxzbyByZWxlYXNlcyB0aGUgcGF0aCAqLworCXVuZml4X25vZGVzKCZzX3Bhc3RlX2JhbGFuY2UpOwogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoJihwX3Nfa2V5LT5vbl9kaXNrX2tleSkpKTsKKwlyZWlzZXJmc19kZWJ1Zyhpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwKKwkJICAgICAgICJyZWlzZXJxdW90YSBwYXN0ZV9pbnRvX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwKKwkJICAgICAgIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwKKwkJICAgICAgIGtleTJ0eXBlKCYocF9zX2tleS0+b25fZGlza19rZXkpKSk7CiAjZW5kaWYKLSAgICBEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpOwotICAgIHJldHVybiByZXR2YWwgOworCURRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShpbm9kZSwgbl9wYXN0ZWRfc2l6ZSk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAotCiAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byB0aGUgYnVmZmVyIGF0IHRoZSBwYXRoLiAqLwotaW50IHJlaXNlcmZzX2luc2VydF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKLQkJCSBzdHJ1Y3QgcGF0aCAgICAgICAgICogCXBfc19wYXRoLCAgICAgICAgIC8qIFBhdGggdG8gdGhlIGluc2VydGVkZWQgaXRlbS4gICAgICAgICAqLwotCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBrZXksCi0JCQkgc3RydWN0IGl0ZW1faGVhZCAgICAqIAlwX3NfaWgsICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpdGVtIGhlYWRlciB0byBpbnNlcnQuKi8KLQkJCSBzdHJ1Y3QgaW5vZGUgICAgICAgICogaW5vZGUsCi0JCQkgY29uc3QgY2hhciAgICAgICAgICAqIAlwX2NfYm9keSkgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBpbnNlcnQuICAgICAgKi8KLXsKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfaW5zX2JhbGFuY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZXR2YWw7Ci0gICAgaW50IGZzX2dlbiA9IDAgOwotICAgIGludCBxdW90YV9ieXRlcyA9IDAgOworaW50IHJlaXNlcmZzX2luc2VydF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgcGF0aCAqcF9zX3BhdGgsCS8qIFBhdGggdG8gdGhlIGluc2VydGVkZWQgaXRlbS4gICAgICAgICAqLworCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksIHN0cnVjdCBpdGVtX2hlYWQgKnBfc19paCwJLyogUG9pbnRlciB0byB0aGUgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiAqLworCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBfY19ib2R5KQorewkJCQkvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBpbnNlcnQuICAgICAgKi8KKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfaW5zX2JhbGFuY2U7CisJaW50IHJldHZhbDsKKwlpbnQgZnNfZ2VuID0gMDsKKwlpbnQgcXVvdGFfYnl0ZXMgPSAwOwogCi0gICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCUJVR19PTighdGgtPnRfdHJhbnNfaWQpOwogCi0gICAgaWYgKGlub2RlKSB7ICAgICAgLyogRG8gd2UgY291bnQgcXVvdGFzIGZvciBpdGVtPyAqLwotCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKLQlxdW90YV9ieXRlcyA9IGloX2l0ZW1fbGVuKHBfc19paCk7CisJaWYgKGlub2RlKSB7CQkvKiBEbyB3ZSBjb3VudCBxdW90YXMgZm9yIGl0ZW0/ICovCisJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKKwkJcXVvdGFfYnl0ZXMgPSBpaF9pdGVtX2xlbihwX3NfaWgpOwogCi0JLyogaGFjayBzbyB0aGUgcXVvdGEgY29kZSBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MgaWYgdGhlIGZpbGUgaGFzCi0JICoqIGEgdGFpbCwgbGlua3MgYXJlIGFsd2F5cyB0YWlscywgc28gdGhlcmUncyBubyBndWVzc2luZyBuZWVkZWQKLQkgKi8KLQlpZiAoIVNfSVNMTksgKGlub2RlLT5pX21vZGUpICYmIGlzX2RpcmVjdF9sZV9paChwX3NfaWgpKSB7Ci0JICAgIHF1b3RhX2J5dGVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkUgOwotCX0KKwkJLyogaGFjayBzbyB0aGUgcXVvdGEgY29kZSBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MgaWYgdGhlIGZpbGUgaGFzCisJCSAqKiBhIHRhaWwsIGxpbmtzIGFyZSBhbHdheXMgdGFpbHMsIHNvIHRoZXJlJ3Mgbm8gZ3Vlc3NpbmcgbmVlZGVkCisJCSAqLworCQlpZiAoIVNfSVNMTksoaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHBfc19paCkpIHsKKwkJCXF1b3RhX2J5dGVzID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkU7CisJCX0KICNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRwotCXJlaXNlcmZzX2RlYnVnIChpbm9kZS0+aV9zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGluc2VydF9pdGVtKCk6IGFsbG9jYXRpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2J5dGVzLCBpbm9kZS0+aV91aWQsIGhlYWQydHlwZShwX3NfaWgpKTsKKwkJcmVpc2VyZnNfZGVidWcoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsCisJCQkgICAgICAgInJlaXNlcnF1b3RhIGluc2VydF9pdGVtKCk6IGFsbG9jYXRpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCQkgICAgICAgcXVvdGFfYnl0ZXMsIGlub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKHBfc19paCkpOwogI2VuZGlmCi0JLyogV2UgY2FuJ3QgZGlydHkgaW5vZGUgaGVyZS4gSXQgd291bGQgYmUgaW1tZWRpYXRlbHkgd3JpdHRlbiBidXQKLQkgKiBhcHByb3ByaWF0ZSBzdGF0IGl0ZW0gaXNuJ3QgaW5zZXJ0ZWQgeWV0Li4uICovCi0JaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIHF1b3RhX2J5dGVzKSkgewotCSAgICBwYXRocmVsc2UocF9zX3BhdGgpOwotCSAgICByZXR1cm4gLUVEUVVPVDsKKwkJLyogV2UgY2FuJ3QgZGlydHkgaW5vZGUgaGVyZS4gSXQgd291bGQgYmUgaW1tZWRpYXRlbHkgd3JpdHRlbiBidXQKKwkJICogYXBwcm9wcmlhdGUgc3RhdCBpdGVtIGlzbid0IGluc2VydGVkIHlldC4uLiAqLworCQlpZiAoRFFVT1RfQUxMT0NfU1BBQ0VfTk9ESVJUWShpbm9kZSwgcXVvdGFfYnl0ZXMpKSB7CisJCQlwYXRocmVsc2UocF9zX3BhdGgpOworCQkJcmV0dXJuIC1FRFFVT1Q7CisJCX0KIAl9Ci0gICAgfQotICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19pbnNfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19wYXRoLCBJSF9TSVpFICsgaWhfaXRlbV9sZW4ocF9zX2loKSk7CisJaW5pdF90Yl9zdHJ1Y3QodGgsICZzX2luc19iYWxhbmNlLCB0aC0+dF9zdXBlciwgcF9zX3BhdGgsCisJCSAgICAgICBJSF9TSVpFICsgaWhfaXRlbV9sZW4ocF9zX2loKSk7CiAjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICAgIHNfaW5zX2JhbGFuY2Uua2V5ID0ga2V5LT5vbl9kaXNrX2tleTsKKwlzX2luc19iYWxhbmNlLmtleSA9IGtleS0+b25fZGlza19rZXk7CiAjZW5kaWYKLSAgICAvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayB0byBiZSBzdXJlIGNhbGxpbmcgZml4X25vZGVzIGlzIHNhZmUgKi8KLSAgICBpZiAoaW5vZGUgJiYgZnNfY2hhbmdlZChmc19nZW4sIGlub2RlLT5pX3NiKSkgewotCWdvdG8gc2VhcmNoX2FnYWluOwotICAgIH0KLQotICAgIHdoaWxlICggKHJldHZhbCA9IGZpeF9ub2RlcyhNX0lOU0VSVCwgJnNfaW5zX2JhbGFuY2UsIHBfc19paCwgcF9jX2JvZHkpKSA9PSBSRVBFQVRfU0VBUkNIKSB7Ci1zZWFyY2hfYWdhaW46Ci0JLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KLQlQUk9DX0lORk9fSU5DKCB0aCAtPiB0X3N1cGVyLCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQgKTsKLQlyZXR2YWwgPSBzZWFyY2hfaXRlbSAodGgtPnRfc3VwZXIsIGtleSwgcF9zX3BhdGgpOwotCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKLQkgICAgcmV0dmFsID0gLUVJTzsKLQkgICAgZ290byBlcnJvcl9vdXQgOworCS8qIERRVU9UXyogY2FuIHNjaGVkdWxlLCBtdXN0IGNoZWNrIHRvIGJlIHN1cmUgY2FsbGluZyBmaXhfbm9kZXMgaXMgc2FmZSAqLworCWlmIChpbm9kZSAmJiBmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpKSB7CisJCWdvdG8gc2VhcmNoX2FnYWluOwogCX0KLQlpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJQQVAtNTc2MDogcmVpc2VyZnNfaW5zZXJ0X2l0ZW06ICIKLQkJCSAgICAgICJrZXkgJUsgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRyZWUiLCBrZXkpOwotCSAgICByZXR2YWwgPSAtRUVYSVNUIDsKLQkgICAgZ290byBlcnJvcl9vdXQ7IAorCisJd2hpbGUgKChyZXR2YWwgPQorCQlmaXhfbm9kZXMoTV9JTlNFUlQsICZzX2luc19iYWxhbmNlLCBwX3NfaWgsCisJCQkgIHBfY19ib2R5KSkgPT0gUkVQRUFUX1NFQVJDSCkgeworCSAgICAgIHNlYXJjaF9hZ2FpbjoKKwkJLyogZmlsZSBzeXN0ZW0gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIGluIHRoZSBmaXhfbm9kZXMgKi8KKwkJUFJPQ19JTkZPX0lOQyh0aC0+dF9zdXBlciwgaW5zZXJ0X2l0ZW1fcmVzdGFydGVkKTsKKwkJcmV0dmFsID0gc2VhcmNoX2l0ZW0odGgtPnRfc3VwZXIsIGtleSwgcF9zX3BhdGgpOworCQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHRoLT50X3N1cGVyLAorCQkJCQkgIlBBUC01NzYwOiByZWlzZXJmc19pbnNlcnRfaXRlbTogIgorCQkJCQkgImtleSAlSyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdHJlZSIsCisJCQkJCSBrZXkpOworCQkJcmV0dmFsID0gLUVFWElTVDsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CiAJfQotICAgIH0KIAotICAgIC8qIG1ha2UgYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgd2lsbCBiZSBjb2xsZWN0ZWQgYXQgYSB0aW1lICovIAotICAgIGlmICggcmV0dmFsID09IENBUlJZX09OICkgewotCWRvX2JhbGFuY2UgKCZzX2luc19iYWxhbmNlLCBwX3NfaWgsIHBfY19ib2R5LCBNX0lOU0VSVCk7Ci0JcmV0dXJuIDA7Ci0gICAgfQorCS8qIG1ha2UgYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgd2lsbCBiZSBjb2xsZWN0ZWQgYXQgYSB0aW1lICovCisJaWYgKHJldHZhbCA9PSBDQVJSWV9PTikgeworCQlkb19iYWxhbmNlKCZzX2luc19iYWxhbmNlLCBwX3NfaWgsIHBfY19ib2R5LCBNX0lOU0VSVCk7CisJCXJldHVybiAwOworCX0KIAotICAgIHJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKLWVycm9yX291dDoKLSAgICAvKiBhbHNvIHJlbGVhc2VzIHRoZSBwYXRoICovCi0gICAgdW5maXhfbm9kZXMoJnNfaW5zX2JhbGFuY2UpOworCXJldHZhbCA9IChyZXR2YWwgPT0gTk9fRElTS19TUEFDRSkgPyAtRU5PU1BDIDogLUVJTzsKKyAgICAgIGVycm9yX291dDoKKwkvKiBhbHNvIHJlbGVhc2VzIHRoZSBwYXRoICovCisJdW5maXhfbm9kZXMoJnNfaW5zX2JhbGFuY2UpOwogI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCi0gICAgcmVpc2VyZnNfZGVidWcgKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgaW5zZXJ0X2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfYnl0ZXMsIGlub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKHBfc19paCkpOworCXJlaXNlcmZzX2RlYnVnKHRoLT50X3N1cGVyLCBSRUlTRVJGU19ERUJVR19DT0RFLAorCQkgICAgICAgInJlaXNlcnF1b3RhIGluc2VydF9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsCisJCSAgICAgICBxdW90YV9ieXRlcywgaW5vZGUtPmlfdWlkLCBoZWFkMnR5cGUocF9zX2loKSk7CiAjZW5kaWYKLSAgICBpZiAoaW5vZGUpCi0JRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9ieXRlcykgOwotICAgIHJldHVybiByZXR2YWw7IAorCWlmIChpbm9kZSkKKwkJRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9ieXRlcyk7CisJcmV0dXJuIHJldHZhbDsKIH0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggYWFlMDc3OS4uNjk1MWMzNSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC0zNSw4MyArMzUsODEgQEAKIHN0YXRpYyBjb25zdCBjaGFyIHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmdbXSA9IFJFSVNFUjJGU19TVVBFUl9NQUdJQ19TVFJJTkc7CiBzdGF0aWMgY29uc3QgY2hhciByZWlzZXJmc19qcl9tYWdpY19zdHJpbmdbXSA9IFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkc7CiAKLWludCBpc19yZWlzZXJmc18zXzUgKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzKQoraW50IGlzX3JlaXNlcmZzXzNfNShzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKQogewotICByZXR1cm4gIXN0cm5jbXAgKHJzLT5zX3YxLnNfbWFnaWMsIHJlaXNlcmZzXzNfNV9tYWdpY19zdHJpbmcsCi0JCSAgIHN0cmxlbiAocmVpc2VyZnNfM181X21hZ2ljX3N0cmluZykpOworCXJldHVybiAhc3RybmNtcChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nLAorCQkJc3RybGVuKHJlaXNlcmZzXzNfNV9tYWdpY19zdHJpbmcpKTsKIH0KIAotCi1pbnQgaXNfcmVpc2VyZnNfM182IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK2ludCBpc19yZWlzZXJmc18zXzYoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycykKIHsKLSAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAotIAkJICAgc3RybGVuIChyZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nKSk7CisJcmV0dXJuICFzdHJuY21wKHJzLT5zX3YxLnNfbWFnaWMsIHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcsCisJCQlzdHJsZW4ocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOwogfQogCi0KLWludCBpc19yZWlzZXJmc19qciAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCitpbnQgaXNfcmVpc2VyZnNfanIoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycykKIHsKLSAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc19qcl9tYWdpY19zdHJpbmcsCi0gCQkgICBzdHJsZW4gKHJlaXNlcmZzX2pyX21hZ2ljX3N0cmluZykpOworCXJldHVybiAhc3RybmNtcChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc19qcl9tYWdpY19zdHJpbmcsCisJCQlzdHJsZW4ocmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nKSk7CiB9CiAKLQotc3RhdGljIGludCBpc19hbnlfcmVpc2VyZnNfbWFnaWNfc3RyaW5nIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK3N0YXRpYyBpbnQgaXNfYW55X3JlaXNlcmZzX21hZ2ljX3N0cmluZyhzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKQogewotICByZXR1cm4gKGlzX3JlaXNlcmZzXzNfNSAocnMpIHx8IGlzX3JlaXNlcmZzXzNfNiAocnMpIHx8Ci0JICBpc19yZWlzZXJmc19qciAocnMpKTsKKwlyZXR1cm4gKGlzX3JlaXNlcmZzXzNfNShycykgfHwgaXNfcmVpc2VyZnNfM182KHJzKSB8fAorCQlpc19yZWlzZXJmc19qcihycykpOwogfQogCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSk7Ci1zdGF0aWMgaW50IHJlaXNlcmZzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgc3RydWN0IGtzdGF0ZnMgKiBidWYpOworc3RhdGljIGludCByZWlzZXJmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CitzdGF0aWMgaW50IHJlaXNlcmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBrc3RhdGZzICpidWYpOwogCi1zdGF0aWMgaW50IHJlaXNlcmZzX3N5bmNfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCB3YWl0KQorc3RhdGljIGludCByZWlzZXJmc19zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IHdhaXQpCiB7Ci0gICAgaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLQlyZWlzZXJmc193cml0ZV9sb2NrKHMpOwotCWlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEpKQotICAgICAgICAgICAgaWYgKCFqb3VybmFsX2VuZF9zeW5jKCZ0aCwgcywgMSkpCi0gICAgICAgICAgICAgICAgcmVpc2VyZnNfZmx1c2hfb2xkX2NvbW1pdHMocyk7Ci0Jcy0+c19kaXJ0ID0gMDsgLyogRXZlbiBpZiBpdCdzIG5vdCB0cnVlLgotICAgICAgICAgICAgICAgICAgICAgICAgKiBXZSdsbCBsb29wIGZvcmV2ZXIgaW4gc3luY19zdXBlcnMgb3RoZXJ3aXNlICovCi0JcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPnNfZGlydCA9IDA7Ci0gICAgfQotICAgIHJldHVybiAwOworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisJCWlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEpKQorCQkJaWYgKCFqb3VybmFsX2VuZF9zeW5jKCZ0aCwgcywgMSkpCisJCQkJcmVpc2VyZnNfZmx1c2hfb2xkX2NvbW1pdHMocyk7CisJCXMtPnNfZGlydCA9IDA7CS8qIEV2ZW4gaWYgaXQncyBub3QgdHJ1ZS4KKwkJCQkgKiBXZSdsbCBsb29wIGZvcmV2ZXIgaW4gc3luY19zdXBlcnMgb3RoZXJ3aXNlICovCisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKwl9IGVsc2UgeworCQlzLT5zX2RpcnQgPSAwOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcmVpc2VyZnNfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIHJlaXNlcmZzX3N5bmNfZnMocywgMSk7CisJcmVpc2VyZnNfc3luY19mcyhzLCAxKTsKIH0KIAotc3RhdGljIHZvaWQgcmVpc2VyZnNfd3JpdGVfc3VwZXJfbG9ja2ZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIHZvaWQgcmVpc2VyZnNfd3JpdGVfc3VwZXJfbG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gIHJlaXNlcmZzX3dyaXRlX2xvY2socyk7Ci0gIGlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0gICAgaW50IGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSA7Ci0gICAgaWYgKGVycikgewotICAgICAgICByZWlzZXJmc19ibG9ja193cml0ZXMoJnRoKSA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7Ci0gICAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgICAgIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcygmdGgpIDsKLSAgICAgICAgam91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpIDsKLSAgICB9Ci0gIH0KLSAgcy0+c19kaXJ0ID0gMDsKLSAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlpbnQgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpOworCQlpZiAoZXJyKSB7CisJCQlyZWlzZXJmc19ibG9ja193cml0ZXMoJnRoKTsKKwkJfSBlbHNlIHsKKwkJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksCisJCQkJCQkgICAgIDEpOworCQkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCQkJcmVpc2VyZnNfYmxvY2tfd3JpdGVzKCZ0aCk7CisJCQlqb3VybmFsX2VuZF9zeW5jKCZ0aCwgcywgMSk7CisJCX0KKwl9CisJcy0+c19kaXJ0ID0gMDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CiB9CiAKLXN0YXRpYyB2b2lkIHJlaXNlcmZzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgewotICByZWlzZXJmc19hbGxvd193cml0ZXMocykgOworc3RhdGljIHZvaWQgcmVpc2VyZnNfdW5sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXJlaXNlcmZzX2FsbG93X3dyaXRlcyhzKTsKIH0KIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbl9jb3JlX2tleSAgTUFYX0lOX0NPUkVfS0VZOwotCitleHRlcm4gY29uc3Qgc3RydWN0IGluX2NvcmVfa2V5IE1BWF9JTl9DT1JFX0tFWTsKIAogLyogdGhpcyBpcyB1c2VkIHRvIGRlbGV0ZSAic2F2ZSBsaW5rIiB3aGVuIHRoZXJlIGFyZSBubyBpdGVtcyBvZiBhCiAgICBmaWxlIGl0IHBvaW50cyB0by4gSXQgY2FuIGVpdGhlciBoYXBwZW4gaWYgdW5saW5rIGlzIGNvbXBsZXRlZCBidXQKQEAgLTEyMCwzNjQgKzExOCwzODcgQEAKICAgIHByb3RlY3RpbmcgdW5saW5rIGlzIGJpZ2dlciB0aGF0IGEga2V5IGxmICJzYXZlIGxpbmsiIHdoaWNoCiAgICBwcm90ZWN0cyB0cnVuY2F0ZSksIHNvIHRoZXJlIGxlZnQgbm8gaXRlbXMgdG8gbWFrZSB0cnVuY2F0ZQogICAgY29tcGxldGlvbiBvbiAqLwotc3RhdGljIGludCByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIGludCBvaWRfZnJlZSkKK3N0YXRpYyBpbnQgcmVtb3ZlX3NhdmVfbGlua19vbmx5KHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQkgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LCBpbnQgb2lkX2ZyZWUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgZXJyOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IGVycjsKIAotICAgICAvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gb25lIGJhbGFuY2luZyAqLwotICAgICBlcnIgPSBqb3VybmFsX2JlZ2luICgmdGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKLSAgICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKLSAKLSAgICAgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKCZ0aCwgTlVMTCwga2V5KTsKLSAgICAgaWYgKG9pZF9mcmVlKQotICAgICAgICAvKiByZW1vdmFscyBhcmUgcHJvdGVjdGVkIGJ5IGRpcmVjdCBpdGVtcyAqLwotICAgICAgICByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkICgmdGgsIGxlMzJfdG9fY3B1IChrZXktPmtfb2JqZWN0aWQpKTsKKwkvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gb25lIGJhbGFuY2luZyAqLworCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotICAgICByZXR1cm4gam91cm5hbF9lbmQgKCZ0aCwgcywgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworCXJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtKCZ0aCwgTlVMTCwga2V5KTsKKwlpZiAob2lkX2ZyZWUpCisJCS8qIHJlbW92YWxzIGFyZSBwcm90ZWN0ZWQgYnkgZGlyZWN0IGl0ZW1zICovCisJCXJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQoJnRoLCBsZTMyX3RvX2NwdShrZXktPmtfb2JqZWN0aWQpKTsKKworCXJldHVybiBqb3VybmFsX2VuZCgmdGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKIH0KLSAKKwogI2lmZGVmIENPTkZJR19RVU9UQQogc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbl9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKICNlbmRpZgotIAorCiAvKiBsb29rIGZvciB1bmNvbXBsZXRlZCB1bmxpbmtzIGFuZCB0cnVuY2F0ZXMgYW5kIGNvbXBsZXRlIHRoZW0gKi8KLXN0YXRpYyBpbnQgZmluaXNoX3VuZmluaXNoZWQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCitzdGF0aWMgaW50IGZpbmlzaF91bmZpbmlzaGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOwotICAgIHN0cnVjdCBjcHVfa2V5IG1heF9jcHVfa2V5LCBvYmpfa2V5OwotICAgIHN0cnVjdCByZWlzZXJmc19rZXkgc2F2ZV9saW5rX2tleTsKLSAgICBpbnQgcmV0dmFsID0gMDsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgaW50IGl0ZW1fcG9zOwotICAgIGNoYXIgKiBpdGVtOwotICAgIGludCBkb25lOwotICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOwotICAgIGludCB0cnVuY2F0ZTsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJc3RydWN0IGNwdV9rZXkgbWF4X2NwdV9rZXksIG9ial9rZXk7CisJc3RydWN0IHJlaXNlcmZzX2tleSBzYXZlX2xpbmtfa2V5OworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBpdGVtX2hlYWQgKmloOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGl0ZW1fcG9zOworCWNoYXIgKml0ZW07CisJaW50IGRvbmU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgdHJ1bmNhdGU7CiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgaW50IGk7Ci0gICAgaW50IG1zX2FjdGl2ZV9zZXQ7CisJaW50IGk7CisJaW50IG1zX2FjdGl2ZV9zZXQ7CiAjZW5kaWYKLSAKLSAKLSAgICAvKiBjb21wb3NlIGtleSB0byBsb29rIGZvciAic2F2ZSIgbGlua3MgKi8KLSAgICBtYXhfY3B1X2tleS52ZXJzaW9uID0gS0VZX0ZPUk1BVF8zXzU7Ci0gICAgbWF4X2NwdV9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSB+MFU7Ci0gICAgbWF4X2NwdV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IH4wVTsKLSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJm1heF9jcHVfa2V5LCB+MFUpOwotICAgIG1heF9jcHVfa2V5LmtleV9sZW5ndGggPSAzOworCisJLyogY29tcG9zZSBrZXkgdG8gbG9vayBmb3IgInNhdmUiIGxpbmtzICovCisJbWF4X2NwdV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OworCW1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5LmtfZGlyX2lkID0gfjBVOworCW1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSB+MFU7CisJc2V0X2NwdV9rZXlfa19vZmZzZXQoJm1heF9jcHVfa2V5LCB+MFUpOworCW1heF9jcHVfa2V5LmtleV9sZW5ndGggPSAzOwogCiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgLyogTmVlZGVkIGZvciBpcHV0KCkgdG8gd29yayBjb3JyZWN0bHkgYW5kIG5vdCB0cmFzaCBkYXRhICovCi0gICAgaWYgKHMtPnNfZmxhZ3MgJiBNU19BQ1RJVkUpIHsKLQkgICAgbXNfYWN0aXZlX3NldCA9IDA7Ci0gICAgfSBlbHNlIHsKLQkgICAgbXNfYWN0aXZlX3NldCA9IDE7Ci0JICAgIHMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotICAgIH0KLSAgICAvKiBUdXJuIG9uIHF1b3RhcyBzbyB0aGF0IHRoZXkgYXJlIHVwZGF0ZWQgY29ycmVjdGx5ICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7Ci0JaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKSB7Ci0JICAgIGludCByZXQgPSByZWlzZXJmc19xdW90YV9vbl9tb3VudChzLCBpKTsKLQkgICAgaWYgKHJldCA8IDApCi0JCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzOiBjYW5ub3QgdHVybiBvbiBqb3VybmFsbGVkIHF1b3RhOiBlcnJvciAlZCIsIHJldCk7CisJLyogTmVlZGVkIGZvciBpcHV0KCkgdG8gd29yayBjb3JyZWN0bHkgYW5kIG5vdCB0cmFzaCBkYXRhICovCisJaWYgKHMtPnNfZmxhZ3MgJiBNU19BQ1RJVkUpIHsKKwkJbXNfYWN0aXZlX3NldCA9IDA7CisJfSBlbHNlIHsKKwkJbXNfYWN0aXZlX3NldCA9IDE7CisJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwogCX0KLSAgICB9CisJLyogVHVybiBvbiBxdW90YXMgc28gdGhhdCB0aGV5IGFyZSB1cGRhdGVkIGNvcnJlY3RseSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgeworCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pIHsKKwkJCWludCByZXQgPSByZWlzZXJmc19xdW90YV9vbl9tb3VudChzLCBpKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCSAicmVpc2VyZnM6IGNhbm5vdCB0dXJuIG9uIGpvdXJuYWxsZWQgcXVvdGE6IGVycm9yICVkIiwKKwkJCQkJCSByZXQpOworCQl9CisJfQogI2VuZGlmCi0gCi0gICAgZG9uZSA9IDA7Ci0gICAgUkVJU0VSRlNfU0IocyktPnNfaXNfdW5saW5rZWRfb2sgPSAxOwotICAgIHdoaWxlICghcmV0dmFsKSB7Ci0gICAgICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChzLCAmbWF4X2NwdV9rZXksICZwYXRoKTsKLSAgICAgICAgaWYgKHJldHZhbCAhPSBJVEVNX05PVF9GT1VORCkgewotICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIxNDA6IGZpbmlzaF91bmZpbmlzaGVkOiBzZWFyY2hfYnlfa2V5IHJldHVybmVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOwotICAgICAgICBpdGVtX3BvcyA9IGdldF9pdGVtX3BvcyAoJnBhdGgpOwotICAgICAgICBpZiAoaXRlbV9wb3MgIT0gQl9OUl9JVEVNUyAoYmgpKSB7Ci0gICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjA2MDogZmluaXNoX3VuZmluaXNoZWQ6IHdyb25nIHBvc2l0aW9uIGZvdW5kIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpdGVtX3BvcyAtLTsKLSAgICAgICAgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIGl0ZW1fcG9zKTsKLSAKLSAgICAgICAgaWYgKGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5LmtfZGlyX2lkKSAhPSBNQVhfS0VZX09CSkVDVElEKQotICAgICAgICAgICAgLyogdGhlcmUgYXJlIG5vICJzYXZlIiBsaW5rcyBhbnltb3JlICovCi0gICAgICAgICAgICBicmVhazsKLSAKLSAgICAgICAgc2F2ZV9saW5rX2tleSA9IGloLT5paF9rZXk7Ci0gICAgICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAoaWgpKQotICAgICAgICAgICAgdHJ1bmNhdGUgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0cnVuY2F0ZSA9IDA7Ci0gCi0gICAgICAgIC8qIHJlaXNlcmZzX2lnZXQgbmVlZHMga19kaXJpZCBhbmQga19vYmplY3RpZCBvbmx5ICovCi0gICAgICAgIGl0ZW0gPSBCX0lfUElURU0gKGJoLCBpaCk7Ci0gICAgICAgIG9ial9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoKihfX2xlMzIgKilpdGVtKTsKLSAgICAgICAgb2JqX2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0gbGUzMl90b19jcHUgKGloLT5paF9rZXkua19vYmplY3RpZCk7Ci0Jb2JqX2tleS5vbl9kaXNrX2tleS5rX29mZnNldCA9IDA7Ci0Jb2JqX2tleS5vbl9kaXNrX2tleS5rX3R5cGUgPSAwOwotCQotICAgICAgICBwYXRocmVsc2UgKCZwYXRoKTsKLSAKLSAgICAgICAgaW5vZGUgPSByZWlzZXJmc19pZ2V0IChzLCAmb2JqX2tleSk7Ci0gICAgICAgIGlmICghaW5vZGUpIHsKLSAgICAgICAgICAgIC8qIHRoZSB1bmxpbmsgYWxtb3N0IGNvbXBsZXRlZCwgaXQganVzdCBkaWQgbm90IG1hbmFnZSB0byByZW1vdmUKLQkgICAgICAgInNhdmUiIGxpbmsgYW5kIHJlbGVhc2Ugb2JqZWN0aWQgKi8KLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMTgwOiBmaW5pc2hfdW5maW5pc2hlZDogaWdldCBmYWlsZWQgZm9yICVLIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpfa2V5KTsKLSAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seSAocywgJnNhdmVfbGlua19rZXksIDEpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KIAotCWlmICghdHJ1bmNhdGUgJiYgaW5vZGUtPmlfbmxpbmspIHsKLQkgICAgLyogZmlsZSBpcyBub3QgdW5saW5rZWQgKi8KLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMTg1OiBmaW5pc2hfdW5maW5pc2hlZDogZmlsZSAlSyBpcyBub3QgdW5saW5rZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9ial9rZXkpOwotICAgICAgICAgICAgcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5IChzLCAmc2F2ZV9saW5rX2tleSwgMCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLQl9Ci0JRFFVT1RfSU5JVChpbm9kZSk7CisJZG9uZSA9IDA7CisJUkVJU0VSRlNfU0IocyktPnNfaXNfdW5saW5rZWRfb2sgPSAxOworCXdoaWxlICghcmV0dmFsKSB7CisJCXJldHZhbCA9IHNlYXJjaF9pdGVtKHMsICZtYXhfY3B1X2tleSwgJnBhdGgpOworCQlpZiAocmV0dmFsICE9IElURU1fTk9UX0ZPVU5EKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAidnMtMjE0MDogZmluaXNoX3VuZmluaXNoZWQ6IHNlYXJjaF9ieV9rZXkgcmV0dXJuZWQgJWQiLAorCQkJCQkgcmV0dmFsKTsKKwkJCWJyZWFrOworCQl9CiAKLQlpZiAodHJ1bmNhdGUgJiYgU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgKSB7Ci0JICAgIC8qIFdlIGdvdCBhIHRydW5jYXRlIHJlcXVlc3QgZm9yIGEgZGlyIHdoaWNoIGlzIGltcG9zc2libGUuCi0JICAgICAgIFRoZSBvbmx5IGltYWdpbmFibGUgd2F5IGlzIHRvIGV4ZWN1dGUgdW5maW5pc2hlZCB0cnVuY2F0ZSByZXF1ZXN0Ci0JICAgICAgIHRoZW4gYm9vdCBpbnRvIG9sZCBrZXJuZWwsIHJlbW92ZSB0aGUgZmlsZSBhbmQgY3JlYXRlIGRpciB3aXRoCi0JICAgICAgIHRoZSBzYW1lIGtleS4gKi8KLQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiZ3JlZW4tMjEwMTogaW1wb3NzaWJsZSB0cnVuY2F0ZSBvbiBhIGRpcmVjdG9yeSAlay4gUGxlYXNlIHJlcG9ydCIsIElOT0RFX1BLRVkgKGlub2RlKSk7Ci0JICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmtfb25seSAocywgJnNhdmVfbGlua19rZXksIDApOwotCSAgICB0cnVuY2F0ZSA9IDA7Ci0JICAgIGlwdXQgKGlub2RlKTsgCi0JICAgIGNvbnRpbnVlOworCQliaCA9IGdldF9sYXN0X2JoKCZwYXRoKTsKKwkJaXRlbV9wb3MgPSBnZXRfaXRlbV9wb3MoJnBhdGgpOworCQlpZiAoaXRlbV9wb3MgIT0gQl9OUl9JVEVNUyhiaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ2cy0yMDYwOiBmaW5pc2hfdW5maW5pc2hlZDogd3JvbmcgcG9zaXRpb24gZm91bmQiKTsKKwkJCWJyZWFrOworCQl9CisJCWl0ZW1fcG9zLS07CisJCWloID0gQl9OX1BJVEVNX0hFQUQoYmgsIGl0ZW1fcG9zKTsKKworCQlpZiAobGUzMl90b19jcHUoaWgtPmloX2tleS5rX2Rpcl9pZCkgIT0gTUFYX0tFWV9PQkpFQ1RJRCkKKwkJCS8qIHRoZXJlIGFyZSBubyAic2F2ZSIgbGlua3MgYW55bW9yZSAqLworCQkJYnJlYWs7CisKKwkJc2F2ZV9saW5rX2tleSA9IGloLT5paF9rZXk7CisJCWlmIChpc19pbmRpcmVjdF9sZV9paChpaCkpCisJCQl0cnVuY2F0ZSA9IDE7CisJCWVsc2UKKwkJCXRydW5jYXRlID0gMDsKKworCQkvKiByZWlzZXJmc19pZ2V0IG5lZWRzIGtfZGlyaWQgYW5kIGtfb2JqZWN0aWQgb25seSAqLworCQlpdGVtID0gQl9JX1BJVEVNKGJoLCBpaCk7CisJCW9ial9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSgqKF9fbGUzMiAqKSBpdGVtKTsKKwkJb2JqX2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkID0KKwkJICAgIGxlMzJfdG9fY3B1KGloLT5paF9rZXkua19vYmplY3RpZCk7CisJCW9ial9rZXkub25fZGlza19rZXkua19vZmZzZXQgPSAwOworCQlvYmpfa2V5Lm9uX2Rpc2tfa2V5LmtfdHlwZSA9IDA7CisKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKworCQlpbm9kZSA9IHJlaXNlcmZzX2lnZXQocywgJm9ial9rZXkpOworCQlpZiAoIWlub2RlKSB7CisJCQkvKiB0aGUgdW5saW5rIGFsbW9zdCBjb21wbGV0ZWQsIGl0IGp1c3QgZGlkIG5vdCBtYW5hZ2UgdG8gcmVtb3ZlCisJCQkgICAic2F2ZSIgbGluayBhbmQgcmVsZWFzZSBvYmplY3RpZCAqLworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInZzLTIxODA6IGZpbmlzaF91bmZpbmlzaGVkOiBpZ2V0IGZhaWxlZCBmb3IgJUsiLAorCQkJCQkgJm9ial9rZXkpOworCQkJcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5KHMsICZzYXZlX2xpbmtfa2V5LCAxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCF0cnVuY2F0ZSAmJiBpbm9kZS0+aV9ubGluaykgeworCQkJLyogZmlsZSBpcyBub3QgdW5saW5rZWQgKi8KKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJ2cy0yMTg1OiBmaW5pc2hfdW5maW5pc2hlZDogZmlsZSAlSyBpcyBub3QgdW5saW5rZWQiLAorCQkJCQkgJm9ial9rZXkpOworCQkJcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5KHMsICZzYXZlX2xpbmtfa2V5LCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCURRVU9UX0lOSVQoaW5vZGUpOworCisJCWlmICh0cnVuY2F0ZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQkvKiBXZSBnb3QgYSB0cnVuY2F0ZSByZXF1ZXN0IGZvciBhIGRpciB3aGljaCBpcyBpbXBvc3NpYmxlLgorCQkJICAgVGhlIG9ubHkgaW1hZ2luYWJsZSB3YXkgaXMgdG8gZXhlY3V0ZSB1bmZpbmlzaGVkIHRydW5jYXRlIHJlcXVlc3QKKwkJCSAgIHRoZW4gYm9vdCBpbnRvIG9sZCBrZXJuZWwsIHJlbW92ZSB0aGUgZmlsZSBhbmQgY3JlYXRlIGRpciB3aXRoCisJCQkgICB0aGUgc2FtZSBrZXkuICovCisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAiZ3JlZW4tMjEwMTogaW1wb3NzaWJsZSB0cnVuY2F0ZSBvbiBhIGRpcmVjdG9yeSAlay4gUGxlYXNlIHJlcG9ydCIsCisJCQkJCSBJTk9ERV9QS0VZKGlub2RlKSk7CisJCQlyZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rX29ubHkocywgJnNhdmVfbGlua19rZXksIDApOworCQkJdHJ1bmNhdGUgPSAwOworCQkJaXB1dChpbm9kZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICh0cnVuY2F0ZSkgeworCQkJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0KKwkJCSAgICBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzazsKKwkJCS8qIG5vdCBjb21wbGV0ZWQgdHJ1bmNhdGUgZm91bmQuIE5ldyBzaXplIHdhcyBjb21taXR0ZWQgdG9nZXRoZXIKKwkJCSAgIHdpdGggInNhdmUiIGxpbmsgKi8KKwkJCXJlaXNlcmZzX2luZm8ocywgIlRydW5jYXRpbmcgJWsgdG8gJUxkIC4uIiwKKwkJCQkgICAgICBJTk9ERV9QS0VZKGlub2RlKSwgaW5vZGUtPmlfc2l6ZSk7CisJCQlyZWlzZXJmc190cnVuY2F0ZV9maWxlKGlub2RlLAorCQkJCQkgICAgICAgMAorCQkJCQkgICAgICAgLypkb24ndCB1cGRhdGUgbW9kaWZpY2F0aW9uIHRpbWUgKi8KKwkJCQkJICAgICAgICk7CisJCQlyZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rKGlub2RlLCB0cnVuY2F0ZSk7CisJCX0gZWxzZSB7CisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2s7CisJCQkvKiBub3QgY29tcGxldGVkIHVubGluayAocm1kaXIpIGZvdW5kICovCisJCQlyZWlzZXJmc19pbmZvKHMsICJSZW1vdmluZyAlay4uIiwgSU5PREVfUEtFWShpbm9kZSkpOworCQkJLyogcmVtb3ZhbCBnZXRzIGNvbXBsZXRlZCBpbiBpcHV0ICovCisJCQlyZXR2YWwgPSAwOworCQl9CisKKwkJaXB1dChpbm9kZSk7CisJCXByaW50aygiZG9uZVxuIik7CisJCWRvbmUrKzsKIAl9Ci0gCi0gICAgICAgIGlmICh0cnVuY2F0ZSkgewotICAgICAgICAgICAgUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzazsKLSAgICAgICAgICAgIC8qIG5vdCBjb21wbGV0ZWQgdHJ1bmNhdGUgZm91bmQuIE5ldyBzaXplIHdhcyBjb21taXR0ZWQgdG9nZXRoZXIKLQkgICAgICAgd2l0aCAic2F2ZSIgbGluayAqLwotICAgICAgICAgICAgcmVpc2VyZnNfaW5mbyAocywgIlRydW5jYXRpbmcgJWsgdG8gJUxkIC4uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOT0RFX1BLRVkgKGlub2RlKSwgaW5vZGUtPmlfc2l6ZSk7Ci0gICAgICAgICAgICByZWlzZXJmc190cnVuY2F0ZV9maWxlIChpbm9kZSwgMC8qZG9uJ3QgdXBkYXRlIG1vZGlmaWNhdGlvbiB0aW1lKi8pOwotICAgICAgICAgICAgcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGluayAoaW5vZGUsIHRydW5jYXRlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3VubGlua19tYXNrOwotICAgICAgICAgICAgLyogbm90IGNvbXBsZXRlZCB1bmxpbmsgKHJtZGlyKSBmb3VuZCAqLwotICAgICAgICAgICAgcmVpc2VyZnNfaW5mbyAocywgIlJlbW92aW5nICVrLi4iLCBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICAgICAgLyogcmVtb3ZhbCBnZXRzIGNvbXBsZXRlZCBpbiBpcHV0ICovCi0gICAgICAgICAgICByZXR2YWwgPSAwOwotICAgICAgICB9Ci0gCi0gICAgICAgIGlwdXQgKGlub2RlKTsKLSAgICAgICAgcHJpbnRrICgiZG9uZVxuIik7Ci0gICAgICAgIGRvbmUgKys7Ci0gICAgfQotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2lzX3VubGlua2VkX29rID0gMDsKLSAgICAgCisJUkVJU0VSRlNfU0IocyktPnNfaXNfdW5saW5rZWRfb2sgPSAwOworCiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgLyogVHVybiBxdW90YXMgb2ZmICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoc2JfZHFvcHQocyktPmZpbGVzW2ldKQotICAgICAgICAgICAgICAgICAgICB2ZnNfcXVvdGFfb2ZmX21vdW50KHMsIGkpOwotICAgIH0KLSAgICBpZiAobXNfYWN0aXZlX3NldCkKLQkgICAgLyogUmVzdG9yZSB0aGUgZmxhZyBiYWNrICovCi0JICAgIHMtPnNfZmxhZ3MgJj0gfk1TX0FDVElWRTsKKwkvKiBUdXJuIHF1b3RhcyBvZmYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKHNiX2Rxb3B0KHMpLT5maWxlc1tpXSkKKwkJCXZmc19xdW90YV9vZmZfbW91bnQocywgaSk7CisJfQorCWlmIChtc19hY3RpdmVfc2V0KQorCQkvKiBSZXN0b3JlIHRoZSBmbGFnIGJhY2sgKi8KKwkJcy0+c19mbGFncyAmPSB+TVNfQUNUSVZFOwogI2VuZGlmCi0gICAgcGF0aHJlbHNlICgmcGF0aCk7Ci0gICAgaWYgKGRvbmUpCi0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJUaGVyZSB3ZXJlICVkIHVuY29tcGxldGVkIHVubGlua3MvdHJ1bmNhdGVzLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wbGV0ZWRcbiIsIGRvbmUpOwotICAgIHJldHVybiByZXR2YWw7CisJcGF0aHJlbHNlKCZwYXRoKTsKKwlpZiAoZG9uZSkKKwkJcmVpc2VyZnNfaW5mbyhzLCAiVGhlcmUgd2VyZSAlZCB1bmNvbXBsZXRlZCB1bmxpbmtzL3RydW5jYXRlcy4gIgorCQkJICAgICAgIkNvbXBsZXRlZFxuIiwgZG9uZSk7CisJcmV0dXJuIHJldHZhbDsKIH0KLSAKKwogLyogdG8gcHJvdGVjdCBmaWxlIGJlaW5nIHVubGlua2VkIGZyb20gZ2V0dGluZyBsb3N0IHdlICJzYWZlIiBsaW5rIGZpbGVzCiAgICBiZWluZyB1bmxpbmtlZC4gVGhpcyBsaW5rIHdpbGwgYmUgZGVsZXRlZCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiB3aXRoIGxhc3QKICAgIGl0ZW0gb2YgZmlsZS4gbW91bnRpbmcgdGhlIGZpbGVzeXRlbSB3ZSBzY2FuIGFsbCB0aGVzZSBsaW5rcyBhbmQgcmVtb3ZlCiAgICBmaWxlcyB3aGljaCBhbG1vc3QgZ290IGxvc3QgKi8KLXZvaWQgYWRkX3NhdmVfbGluayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqIHRoLAotCQkgICAgc3RydWN0IGlub2RlICogaW5vZGUsIGludCB0cnVuY2F0ZSkKK3ZvaWQgYWRkX3NhdmVfbGluayhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJICAgc3RydWN0IGlub2RlICppbm9kZSwgaW50IHRydW5jYXRlKQogewotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgaW50IHJldHZhbDsKLSAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCBpaDsKLSAgICBfX2xlMzIgbGluazsKKwlJTklUSUFMSVpFX1BBVEgocGF0aCk7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJc3RydWN0IGl0ZW1faGVhZCBpaDsKKwlfX2xlMzIgbGluazsKIAotICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlCVUdfT04oIXRoLT50X3RyYW5zX2lkKTsKIAotICAgIC8qIGZpbGUgY2FuIG9ubHkgZ2V0IG9uZSAic2F2ZSBsaW5rIiBvZiBlYWNoIGtpbmQgKi8KLSAgICBSRkFMU0UoIHRydW5jYXRlICYmIAotCSAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzayApLAotCSAgICAic2F2ZWQgbGluayBhbHJlYWR5IGV4aXN0cyBmb3IgdHJ1bmNhdGVkIGlub2RlICVseCIsCi0JICAgICggbG9uZyApIGlub2RlIC0+IGlfaW5vICk7Ci0gICAgUkZBTFNFKCAhdHJ1bmNhdGUgJiYgCi0JICAgICggUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmIGlfbGlua19zYXZlZF91bmxpbmtfbWFzayApLAotCSAgICAic2F2ZWQgbGluayBhbHJlYWR5IGV4aXN0cyBmb3IgdW5saW5rZWQgaW5vZGUgJWx4IiwKLQkgICAgKCBsb25nICkgaW5vZGUgLT4gaV9pbm8gKTsKKwkvKiBmaWxlIGNhbiBvbmx5IGdldCBvbmUgInNhdmUgbGluayIgb2YgZWFjaCBraW5kICovCisJUkZBTFNFKHRydW5jYXRlICYmCisJICAgICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrKSwKKwkgICAgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHRydW5jYXRlZCBpbm9kZSAlbHgiLAorCSAgICAgICAobG9uZylpbm9kZS0+aV9pbm8pOworCVJGQUxTRSghdHJ1bmNhdGUgJiYKKwkgICAgICAgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9saW5rX3NhdmVkX3VubGlua19tYXNrKSwKKwkgICAgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHVubGlua2VkIGlub2RlICVseCIsCisJICAgICAgIChsb25nKWlub2RlLT5pX2lubyk7CiAKLSAgICAvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KLSAgICBrZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OwotICAgIGtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IE1BWF9LRVlfT0JKRUNUSUQ7Ci0gICAga2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87Ci0gICAgaWYgKCF0cnVuY2F0ZSkgewotCS8qIHVubGluaywgcm1kaXIsIHJlbmFtZSAqLwotCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5LCAxICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQlzZXRfY3B1X2tleV9rX3R5cGUgKCZrZXksIFRZUEVfRElSRUNUKTsKKwkvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KKwlrZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OworCWtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IE1BWF9LRVlfT0JKRUNUSUQ7CisJa2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisJaWYgKCF0cnVuY2F0ZSkgeworCQkvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KKwkJc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCXNldF9jcHVfa2V5X2tfdHlwZSgma2V5LCBUWVBFX0RJUkVDVCk7CiAKLQkvKiBpdGVtIGhlYWQgb2YgInNhZmUiIGxpbmsgKi8KLQltYWtlX2xlX2l0ZW1faGVhZCAoJmloLCAma2V5LCBrZXkudmVyc2lvbiwgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgVFlQRV9ESVJFQ1QsCi0JCQkgICA0LypsZW5ndGgqLywgMHhmZmZmLypmcmVlIHNwYWNlKi8pOwotICAgIH0gZWxzZSB7Ci0JLyogdHJ1bmNhdGUgKi8KLQlpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJncmVlbi0yMTAyOiBBZGRpbmcgYSB0cnVuY2F0ZSBzYXZlbGluayBmb3IgYSBkaXJlY3RvcnkgJWshIFBsZWFzZSByZXBvcnQiLCBJTk9ERV9QS0VZKGlub2RlKSk7Ci0Jc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZrZXksIDEpOwotCXNldF9jcHVfa2V5X2tfdHlwZSAoJmtleSwgVFlQRV9JTkRJUkVDVCk7CisJCS8qIGl0ZW0gaGVhZCBvZiAic2FmZSIgbGluayAqLworCQltYWtlX2xlX2l0ZW1faGVhZCgmaWgsICZrZXksIGtleS52ZXJzaW9uLAorCQkJCSAgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgVFlQRV9ESVJFQ1QsCisJCQkJICA0IC8qbGVuZ3RoICovICwgMHhmZmZmIC8qZnJlZSBzcGFjZSAqLyApOworCX0gZWxzZSB7CisJCS8qIHRydW5jYXRlICovCisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJncmVlbi0yMTAyOiBBZGRpbmcgYSB0cnVuY2F0ZSBzYXZlbGluayBmb3IgYSBkaXJlY3RvcnkgJWshIFBsZWFzZSByZXBvcnQiLAorCQkJCQkgSU5PREVfUEtFWShpbm9kZSkpOworCQlzZXRfY3B1X2tleV9rX29mZnNldCgma2V5LCAxKTsKKwkJc2V0X2NwdV9rZXlfa190eXBlKCZrZXksIFRZUEVfSU5ESVJFQ1QpOwogCi0JLyogaXRlbSBoZWFkIG9mICJzYWZlIiBsaW5rICovCi0JbWFrZV9sZV9pdGVtX2hlYWQgKCZpaCwgJmtleSwga2V5LnZlcnNpb24sIDEsIFRZUEVfSU5ESVJFQ1QsCi0JCQkgICA0LypsZW5ndGgqLywgMC8qZnJlZSBzcGFjZSovKTsKLSAgICB9Ci0gICAga2V5LmtleV9sZW5ndGggPSAzOworCQkvKiBpdGVtIGhlYWQgb2YgInNhZmUiIGxpbmsgKi8KKwkJbWFrZV9sZV9pdGVtX2hlYWQoJmloLCAma2V5LCBrZXkudmVyc2lvbiwgMSwgVFlQRV9JTkRJUkVDVCwKKwkJCQkgIDQgLypsZW5ndGggKi8gLCAwIC8qZnJlZSBzcGFjZSAqLyApOworCX0KKwlrZXkua2V5X2xlbmd0aCA9IDM7CiAKLSAgICAvKiBsb29rIGZvciBpdHMgcGxhY2UgaW4gdGhlIHRyZWUgKi8KLSAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKLSAgICBpZiAocmV0dmFsICE9IElURU1fTk9UX0ZPVU5EKSB7Ci0JaWYgKCByZXR2YWwgIT0gLUVOT1NQQyApCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMjEwMDogYWRkX3NhdmVfbGluazoiCi0JCQkgICJzZWFyY2hfYnlfa2V5ICglSykgcmV0dXJuZWQgJWQiLCAma2V5LCByZXR2YWwpOwotCXBhdGhyZWxzZSAoJnBhdGgpOwotCXJldHVybjsKLSAgICB9CisJLyogbG9vayBmb3IgaXRzIHBsYWNlIGluIHRoZSB0cmVlICovCisJcmV0dmFsID0gc2VhcmNoX2l0ZW0oaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwlpZiAocmV0dmFsICE9IElURU1fTk9UX0ZPVU5EKSB7CisJCWlmIChyZXR2YWwgIT0gLUVOT1NQQykKKwkJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ2cy0yMTAwOiBhZGRfc2F2ZV9saW5rOiIKKwkJCQkJICJzZWFyY2hfYnlfa2V5ICglSykgcmV0dXJuZWQgJWQiLCAma2V5LAorCQkJCQkgcmV0dmFsKTsKKwkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJcmV0dXJuOworCX0KIAotICAgIC8qIGJvZHkgb2YgInNhdmUiIGxpbmsgKi8KLSAgICBsaW5rID0gSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZDsKKwkvKiBib2R5IG9mICJzYXZlIiBsaW5rICovCisJbGluayA9IElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZDsKIAotICAgIC8qIHB1dCAic2F2ZSIgbGluayBpbm90IHRyZWUsIGRvbid0IGNoYXJnZSBxdW90YSB0byBhbnlvbmUgKi8KLSAgICByZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsICZwYXRoLCAma2V5LCAmaWgsIE5VTEwsIChjaGFyICopJmxpbmspOwotICAgIGlmIChyZXR2YWwpIHsKLQlpZiAocmV0dmFsICE9IC1FTk9TUEMpCi0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMjEyMDogYWRkX3NhdmVfbGluazogaW5zZXJ0X2l0ZW0gcmV0dXJuZWQgJWQiLAotCQkJICByZXR2YWwpOwotICAgIH0gZWxzZSB7Ci0JaWYoIHRydW5jYXRlICkKLQkgICAgUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzazsKLQllbHNlCi0JICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3VubGlua19tYXNrOwotICAgIH0KKwkvKiBwdXQgInNhdmUiIGxpbmsgaW5vdCB0cmVlLCBkb24ndCBjaGFyZ2UgcXVvdGEgdG8gYW55b25lICovCisJcmV0dmFsID0KKwkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsICZwYXRoLCAma2V5LCAmaWgsIE5VTEwsIChjaGFyICopJmxpbmspOworCWlmIChyZXR2YWwpIHsKKwkJaWYgKHJldHZhbCAhPSAtRU5PU1BDKQorCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJICJ2cy0yMTIwOiBhZGRfc2F2ZV9saW5rOiBpbnNlcnRfaXRlbSByZXR1cm5lZCAlZCIsCisJCQkJCSByZXR2YWwpOworCX0gZWxzZSB7CisJCWlmICh0cnVuY2F0ZSkKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9CisJCQkgICAgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7CisJCWVsc2UKKwkJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKKwl9CiB9CiAKLQogLyogdGhpcyBvcGVucyB0cmFuc2FjdGlvbiB1bmxpa2UgYWRkX3NhdmVfbGluayAqLwotaW50IHJlbW92ZV9zYXZlX2xpbmsgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpCitpbnQgcmVtb3ZlX3NhdmVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHJ1bmNhdGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5IGtleTsKLSAgICBpbnQgZXJyOwotIAotICAgIC8qIHdlIGFyZSBnb2luZyB0byBkbyBvbmUgYmFsYW5jaW5nIG9ubHkgKi8KLSAgICBlcnIgPSBqb3VybmFsX2JlZ2luICgmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKLSAKLSAgICAvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KLSAgICBrZXkua19kaXJfaWQgPSBjcHVfdG9fbGUzMiAoTUFYX0tFWV9PQkpFQ1RJRCk7Ci0gICAga2V5Lmtfb2JqZWN0aWQgPSBJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQ7Ci0gICAgaWYgKCF0cnVuY2F0ZSkgewotICAgICAgICAvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KLSAgICAgICAgc2V0X2xlX2tleV9rX29mZnNldCAoS0VZX0ZPUk1BVF8zXzUsICZrZXksCi0JCQkgICAgIDEgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotICAgICAgICBzZXRfbGVfa2V5X2tfdHlwZSAoS0VZX0ZPUk1BVF8zXzUsICZrZXksIFRZUEVfRElSRUNUKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiB0cnVuY2F0ZSAqLwotICAgICAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgJmtleSwgMSk7Ci0gICAgICAgIHNldF9sZV9rZXlfa190eXBlIChLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9JTkRJUkVDVCk7Ci0gICAgfQotIAotICAgIGlmKCAoIHRydW5jYXRlICYmIAotICAgICAgICAgICggUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmIGlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrICkgKSB8fAotICAgICAgICAoICF0cnVuY2F0ZSAmJiAKLSAgICAgICAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgKSApICkKLQkvKiBkb24ndCB0YWtlIHF1b3RhIGJ5dGVzIGZyb20gYW55d2hlcmUgKi8KLQlyZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAoJnRoLCBOVUxMLCAma2V5KTsKLSAgICBpZiAoIXRydW5jYXRlKSB7Ci0JcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoJnRoLCBpbm9kZS0+aV9pbm8pOwotCVJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKLSAgICB9IGVsc2UKLQlSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICY9IH5pX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzazsKLSAKLSAgICByZXR1cm4gam91cm5hbF9lbmQgKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCXN0cnVjdCByZWlzZXJmc19rZXkga2V5OworCWludCBlcnI7CisKKwkvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gb25lIGJhbGFuY2luZyBvbmx5ICovCisJZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHNldHVwIGtleSBvZiAic2F2ZSIgbGluayAqLworCWtleS5rX2Rpcl9pZCA9IGNwdV90b19sZTMyKE1BWF9LRVlfT0JKRUNUSUQpOworCWtleS5rX29iamVjdGlkID0gSU5PREVfUEtFWShpbm9kZSktPmtfb2JqZWN0aWQ7CisJaWYgKCF0cnVuY2F0ZSkgeworCQkvKiB1bmxpbmssIHJtZGlyLCByZW5hbWUgKi8KKwkJc2V0X2xlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgJmtleSwKKwkJCQkgICAgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCXNldF9sZV9rZXlfa190eXBlKEtFWV9GT1JNQVRfM181LCAma2V5LCBUWVBFX0RJUkVDVCk7CisJfSBlbHNlIHsKKwkJLyogdHJ1bmNhdGUgKi8KKwkJc2V0X2xlX2tleV9rX29mZnNldChLRVlfRk9STUFUXzNfNSwgJmtleSwgMSk7CisJCXNldF9sZV9rZXlfa190eXBlKEtFWV9GT1JNQVRfM181LCAma2V5LCBUWVBFX0lORElSRUNUKTsKKwl9CisKKwlpZiAoKHRydW5jYXRlICYmCisJICAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzaykpIHx8CisJICAgICghdHJ1bmNhdGUgJiYKKwkgICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfbGlua19zYXZlZF91bmxpbmtfbWFzaykpKQorCQkvKiBkb24ndCB0YWtlIHF1b3RhIGJ5dGVzIGZyb20gYW55d2hlcmUgKi8KKwkJcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0oJnRoLCBOVUxMLCAma2V5KTsKKwlpZiAoIXRydW5jYXRlKSB7CisJCXJlaXNlcmZzX3JlbGVhc2Vfb2JqZWN0aWQoJnRoLCBpbm9kZS0+aV9pbm8pOworCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9saW5rX3NhdmVkX3VubGlua19tYXNrOworCX0gZWxzZQorCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7CisKKwlyZXR1cm4gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOwogfQogCi0KLXN0YXRpYyB2b2lkIHJlaXNlcmZzX3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gIGludCBpOwotICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKLSAgdGgudF90cmFuc19pZCA9IDA7CisJaW50IGk7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwl0aC50X3RyYW5zX2lkID0gMDsKIAotICBpZiAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpIHsKLSAgICBkX2ludmFsaWRhdGUgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKLSAgICBkcHV0IChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7Ci0gIH0KLSAgCi0gIGlmIChSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KSB7Ci0gICAgZF9pbnZhbGlkYXRlIChSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KTsKLSAgICBkcHV0IChSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KTsKLSAgfQorCWlmIChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCkgeworCQlkX2ludmFsaWRhdGUoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOworCQlkcHV0KFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKKwl9CiAKLSAgLyogY2hhbmdlIGZpbGUgc3lzdGVtIHN0YXRlIHRvIGN1cnJlbnQgc3RhdGUgaWYgaXQgd2FzIG1vdW50ZWQgd2l0aCByZWFkLXdyaXRlIHBlcm1pc3Npb25zICovCi0gIGlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0gICAgaWYgKCFqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApKSB7Ci0gICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICAgICAgc2V0X3NiX3Vtb3VudF9zdGF0ZSggU0JfRElTS19TVVBFUl9CTE9DSyhzKSwgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgKTsKLSAgICAgICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKLSAgICB9Ci0gIH0KKwlpZiAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCkgeworCQlkX2ludmFsaWRhdGUoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7CisJCWRwdXQoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7CisJfQogCi0gIC8qIG5vdGUsIGpvdXJuYWxfcmVsZWFzZSBjaGVja3MgZm9yIHJlYWRvbmx5IG1vdW50LCBhbmQgY2FuIGRlY2lkZSBub3QKLSAgKiogdG8gZG8gYSBqb3VybmFsX2VuZAotICAqLwotICBqb3VybmFsX3JlbGVhc2UoJnRoLCBzKSA7CisJLyogY2hhbmdlIGZpbGUgc3lzdGVtIHN0YXRlIHRvIGN1cnJlbnQgc3RhdGUgaWYgaXQgd2FzIG1vdW50ZWQgd2l0aCByZWFkLXdyaXRlIHBlcm1pc3Npb25zICovCisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaWYgKCFqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApKSB7CisJCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLAorCQkJCQkJICAgICAxKTsKKwkJCXNldF9zYl91bW91bnRfc3RhdGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSwKKwkJCQkJICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlKTsKKwkJCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwkJfQorCX0KIAotICBmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUiAocyk7IGkgKyspCi0gICAgYnJlbHNlIChTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKTsKKwkvKiBub3RlLCBqb3VybmFsX3JlbGVhc2UgY2hlY2tzIGZvciByZWFkb25seSBtb3VudCwgYW5kIGNhbiBkZWNpZGUgbm90CisJICoqIHRvIGRvIGEgam91cm5hbF9lbmQKKwkgKi8KKwlqb3VybmFsX3JlbGVhc2UoJnRoLCBzKTsKIAotICB2ZnJlZSAoU0JfQVBfQklUTUFQIChzKSk7CisJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJYnJlbHNlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CiAKLSAgYnJlbHNlIChTQl9CVUZGRVJfV0lUSF9TQiAocykpOworCXZmcmVlKFNCX0FQX0JJVE1BUChzKSk7CiAKLSAgcHJpbnRfc3RhdGlzdGljcyAocyk7CisJYnJlbHNlKFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKIAotICBpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgIT0gMCkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMDA0OiByZWlzZXJmc19wdXRfc3VwZXI6IGFsbG9jYXRlZCBtZW1vcnkgbGVmdCAlZCIsCi0JCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKLSAgfQorCXByaW50X3N0YXRpc3RpY3Mocyk7CiAKLSAgaWYgKFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgIT0gMCkgewotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJncmVlbi0yMDA1OiByZWlzZXJmc19wdXRfc3VwZXI6IHJlc2VydmVkIGJsb2NrcyBsZWZ0ICVkIiwKLQkJICAgICAgUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2Nrcyk7Ci0gIH0KKwlpZiAoUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MgIT0gMCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJICJ2cy0yMDA0OiByZWlzZXJmc19wdXRfc3VwZXI6IGFsbG9jYXRlZCBtZW1vcnkgbGVmdCAlZCIsCisJCQkJIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKKwl9CiAKLSAgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoIHMgKTsKKwlpZiAoUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2NrcyAhPSAwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgImdyZWVuLTIwMDU6IHJlaXNlcmZzX3B1dF9zdXBlcjogcmVzZXJ2ZWQgYmxvY2tzIGxlZnQgJWQiLAorCQkJCSBSRUlTRVJGU19TQihzKS0+cmVzZXJ2ZWRfYmxvY2tzKTsKKwl9CiAKLSAga2ZyZWUocy0+c19mc19pbmZvKTsKLSAgcy0+c19mc19pbmZvID0gTlVMTDsKKwlyZWlzZXJmc19wcm9jX2luZm9fZG9uZShzKTsKIAotICByZXR1cm47CisJa2ZyZWUocy0+c19mc19pbmZvKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCisJcmV0dXJuOwogfQogCi1zdGF0aWMga21lbV9jYWNoZV90ICogcmVpc2VyZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIGttZW1fY2FjaGVfdCAqcmVpc2VyZnNfaW5vZGVfY2FjaGVwOwogCiBzdGF0aWMgc3RydWN0IGlub2RlICpyZWlzZXJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaTsKLQllaSA9IChzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MocmVpc2VyZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKikKKwkgICAga21lbV9jYWNoZV9hbGxvYyhyZWlzZXJmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKIAlpZiAoIWVpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CkBAIC00ODgsMjUgKzUwOSwyNiBAQAogCWttZW1fY2FjaGVfZnJlZShyZWlzZXJmc19pbm9kZV9jYWNoZXAsIFJFSVNFUkZTX0koaW5vZGUpKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKikgZm9vOworCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqKWZvbzsKIAotCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWSB8IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CiAJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgewotCQlJTklUX0xJU1RfSEVBRCgmZWktPmlfcHJlYWxsb2NfbGlzdCkgOworCQlJTklUX0xJU1RfSEVBRCgmZWktPmlfcHJlYWxsb2NfbGlzdCk7CiAJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CiAJCWVpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOwogCQllaS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CiAJfQogfQotIAorCiBzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQogewogCXJlaXNlcmZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJyZWlzZXJfaW5vZGVfY2FjaGUiLAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyksCi0JCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCi0JCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwkJCQkJCSAgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCSByZWlzZXJmc19pbm9kZV9pbmZvKSwKKwkJCQkJCSAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCQkgIGluaXRfb25jZSwgTlVMTCk7CiAJaWYgKHJlaXNlcmZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTUxNSw3MiArNTM3LDc2IEBACiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKIAlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHJlaXNlcmZzX2lub2RlX2NhY2hlcCkpCi0JCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJyZWlzZXJmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWQiKTsKKwkJcmVpc2VyZnNfd2FybmluZyhOVUxMLAorCQkJCSAicmVpc2VyZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkIik7CiB9CiAKIC8qIHdlIGRvbid0IG1hcmsgaW5vZGVzIGRpcnR5LCB3ZSBqdXN0IGxvZyB0aGVtICovCi1zdGF0aWMgdm9pZCByZWlzZXJmc19kaXJ0eV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKIAotICAgIGludCBlcnIgPSAwOwotICAgIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkgewotICAgICAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiY2xtLTYwMDY6IHdyaXRpbmcgaW5vZGUgJWx1IG9uIHJlYWRvbmx5IEZTIiwKLQkgICAgICAgICAgICAgICAgICBpbm9kZS0+aV9pbm8pIDsKLSAgICAgICAgcmV0dXJuIDsKLSAgICB9Ci0gICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJaW50IGVyciA9IDA7CisJaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJjbG0tNjAwNjogd3JpdGluZyBpbm9kZSAlbHUgb24gcmVhZG9ubHkgRlMiLAorCQkJCSBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm47CisJfQorCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOwogCi0gICAgLyogdGhpcyBpcyByZWFsbHkgb25seSB1c2VkIGZvciBhdGltZSB1cGRhdGVzLCBzbyB0aGV5IGRvbid0IGhhdmUKLSAgICAqKiB0byBiZSBpbmNsdWRlZCBpbiBPX1NZTkMgb3IgZnN5bmMKLSAgICAqLwotICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSkgOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChpbm9kZS0+aV9zYik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKLSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKSA7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkvKiB0aGlzIGlzIHJlYWxseSBvbmx5IHVzZWQgZm9yIGF0aW1lIHVwZGF0ZXMsIHNvIHRoZXkgZG9uJ3QgaGF2ZQorCSAqKiB0byBiZSBpbmNsdWRlZCBpbiBPX1NZTkMgb3IgZnN5bmMKKwkgKi8KKwllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCWlmIChlcnIpIHsKKwkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuOworCX0KKwlyZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKIH0KIAotc3RhdGljIHZvaWQgcmVpc2VyZnNfY2xlYXJfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgdm9pZCByZWlzZXJmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAKLSAgICBhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzOwotICAgIGlmIChhY2wgJiYgIUlTX0VSUiAoYWNsKSkKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CisJYWNsID0gUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzczsKKwlpZiAoYWNsICYmICFJU19FUlIoYWNsKSkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKIAotICAgIGFjbCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0OwotICAgIGlmIChhY2wgJiYgIUlTX0VSUiAoYWNsKSkKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOworCWFjbCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0OworCWlmIChhY2wgJiYgIUlTX0VSUihhY2wpKQorCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKIH0KIAogI2lmZGVmIENPTkZJR19RVU9UQQotc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7Ci1zdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLAorCQkJCSAgICBzaXplX3QsIGxvZmZfdCk7CitzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNoYXIgKiwgc2l6ZV90LAorCQkJCSAgIGxvZmZfdCk7CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHJlaXNlcmZzX3NvcHMgPQotewotICAuYWxsb2NfaW5vZGUgPSByZWlzZXJmc19hbGxvY19pbm9kZSwKLSAgLmRlc3Ryb3lfaW5vZGUgPSByZWlzZXJmc19kZXN0cm95X2lub2RlLAotICAud3JpdGVfaW5vZGUgPSByZWlzZXJmc193cml0ZV9pbm9kZSwKLSAgLmRpcnR5X2lub2RlID0gcmVpc2VyZnNfZGlydHlfaW5vZGUsCi0gIC5kZWxldGVfaW5vZGUgPSByZWlzZXJmc19kZWxldGVfaW5vZGUsCi0gIC5jbGVhcl9pbm9kZSAgPSByZWlzZXJmc19jbGVhcl9pbm9kZSwKLSAgLnB1dF9zdXBlciA9IHJlaXNlcmZzX3B1dF9zdXBlciwKLSAgLndyaXRlX3N1cGVyID0gcmVpc2VyZnNfd3JpdGVfc3VwZXIsCi0gIC5zeW5jX2ZzID0gcmVpc2VyZnNfc3luY19mcywKLSAgLndyaXRlX3N1cGVyX2xvY2tmcyA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcywKLSAgLnVubG9ja2ZzID0gcmVpc2VyZnNfdW5sb2NrZnMsCi0gIC5zdGF0ZnMgPSByZWlzZXJmc19zdGF0ZnMsCi0gIC5yZW1vdW50X2ZzID0gcmVpc2VyZnNfcmVtb3VudCwKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByZWlzZXJmc19zb3BzID0geworCS5hbGxvY19pbm9kZSA9IHJlaXNlcmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlID0gcmVpc2VyZnNfZGVzdHJveV9pbm9kZSwKKwkud3JpdGVfaW5vZGUgPSByZWlzZXJmc193cml0ZV9pbm9kZSwKKwkuZGlydHlfaW5vZGUgPSByZWlzZXJmc19kaXJ0eV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlID0gcmVpc2VyZnNfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZSA9IHJlaXNlcmZzX2NsZWFyX2lub2RlLAorCS5wdXRfc3VwZXIgPSByZWlzZXJmc19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyID0gcmVpc2VyZnNfd3JpdGVfc3VwZXIsCisJLnN5bmNfZnMgPSByZWlzZXJmc19zeW5jX2ZzLAorCS53cml0ZV9zdXBlcl9sb2NrZnMgPSByZWlzZXJmc193cml0ZV9zdXBlcl9sb2NrZnMsCisJLnVubG9ja2ZzID0gcmVpc2VyZnNfdW5sb2NrZnMsCisJLnN0YXRmcyA9IHJlaXNlcmZzX3N0YXRmcywKKwkucmVtb3VudF9mcyA9IHJlaXNlcmZzX3JlbW91bnQsCiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gIC5xdW90YV9yZWFkID0gcmVpc2VyZnNfcXVvdGFfcmVhZCwKLSAgLnF1b3RhX3dyaXRlID0gcmVpc2VyZnNfcXVvdGFfd3JpdGUsCisJLnF1b3RhX3JlYWQgPSByZWlzZXJmc19xdW90YV9yZWFkLAorCS5xdW90YV93cml0ZSA9IHJlaXNlcmZzX3F1b3RhX3dyaXRlLAogI2VuZGlmCiB9OwogCkBAIC01OTYsNTAgKzYyMiw0OCBAQAogc3RhdGljIGludCByZWlzZXJmc193cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOwogc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBpbnQsIGNoYXIgKik7CiAKLXN0YXRpYyBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyByZWlzZXJmc19xdW90YV9vcGVyYXRpb25zID0KLXsKLSAgLmluaXRpYWxpemUgPSByZWlzZXJmc19kcXVvdF9pbml0aWFsaXplLAotICAuZHJvcCA9IHJlaXNlcmZzX2RxdW90X2Ryb3AsCi0gIC5hbGxvY19zcGFjZSA9IGRxdW90X2FsbG9jX3NwYWNlLAotICAuYWxsb2NfaW5vZGUgPSBkcXVvdF9hbGxvY19pbm9kZSwKLSAgLmZyZWVfc3BhY2UgPSBkcXVvdF9mcmVlX3NwYWNlLAotICAuZnJlZV9pbm9kZSA9IGRxdW90X2ZyZWVfaW5vZGUsCi0gIC50cmFuc2ZlciA9IGRxdW90X3RyYW5zZmVyLAotICAud3JpdGVfZHF1b3QgPSByZWlzZXJmc193cml0ZV9kcXVvdCwKLSAgLmFjcXVpcmVfZHF1b3QgPSByZWlzZXJmc19hY3F1aXJlX2RxdW90LAotICAucmVsZWFzZV9kcXVvdCA9IHJlaXNlcmZzX3JlbGVhc2VfZHF1b3QsCi0gIC5tYXJrX2RpcnR5ID0gcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eSwKLSAgLndyaXRlX2luZm8gPSByZWlzZXJmc193cml0ZV9pbmZvLAorc3RhdGljIHN0cnVjdCBkcXVvdF9vcGVyYXRpb25zIHJlaXNlcmZzX3F1b3RhX29wZXJhdGlvbnMgPSB7CisJLmluaXRpYWxpemUgPSByZWlzZXJmc19kcXVvdF9pbml0aWFsaXplLAorCS5kcm9wID0gcmVpc2VyZnNfZHF1b3RfZHJvcCwKKwkuYWxsb2Nfc3BhY2UgPSBkcXVvdF9hbGxvY19zcGFjZSwKKwkuYWxsb2NfaW5vZGUgPSBkcXVvdF9hbGxvY19pbm9kZSwKKwkuZnJlZV9zcGFjZSA9IGRxdW90X2ZyZWVfc3BhY2UsCisJLmZyZWVfaW5vZGUgPSBkcXVvdF9mcmVlX2lub2RlLAorCS50cmFuc2ZlciA9IGRxdW90X3RyYW5zZmVyLAorCS53cml0ZV9kcXVvdCA9IHJlaXNlcmZzX3dyaXRlX2RxdW90LAorCS5hY3F1aXJlX2RxdW90ID0gcmVpc2VyZnNfYWNxdWlyZV9kcXVvdCwKKwkucmVsZWFzZV9kcXVvdCA9IHJlaXNlcmZzX3JlbGVhc2VfZHF1b3QsCisJLm1hcmtfZGlydHkgPSByZWlzZXJmc19tYXJrX2RxdW90X2RpcnR5LAorCS53cml0ZV9pbmZvID0gcmVpc2VyZnNfd3JpdGVfaW5mbywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcXVvdGFjdGxfb3BzIHJlaXNlcmZzX3FjdGxfb3BlcmF0aW9ucyA9Ci17Ci0gIC5xdW90YV9vbiA9IHJlaXNlcmZzX3F1b3RhX29uLAotICAucXVvdGFfb2ZmID0gdmZzX3F1b3RhX29mZiwKLSAgLnF1b3RhX3N5bmMgPSB2ZnNfcXVvdGFfc3luYywKLSAgLmdldF9pbmZvID0gdmZzX2dldF9kcWluZm8sCi0gIC5zZXRfaW5mbyA9IHZmc19zZXRfZHFpbmZvLAotICAuZ2V0X2RxYmxrID0gdmZzX2dldF9kcWJsaywKLSAgLnNldF9kcWJsayA9IHZmc19zZXRfZHFibGssCitzdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyByZWlzZXJmc19xY3RsX29wZXJhdGlvbnMgPSB7CisJLnF1b3RhX29uID0gcmVpc2VyZnNfcXVvdGFfb24sCisJLnF1b3RhX29mZiA9IHZmc19xdW90YV9vZmYsCisJLnF1b3RhX3N5bmMgPSB2ZnNfcXVvdGFfc3luYywKKwkuZ2V0X2luZm8gPSB2ZnNfZ2V0X2RxaW5mbywKKwkuc2V0X2luZm8gPSB2ZnNfc2V0X2RxaW5mbywKKwkuZ2V0X2RxYmxrID0gdmZzX2dldF9kcWJsaywKKwkuc2V0X2RxYmxrID0gdmZzX3NldF9kcWJsaywKIH07CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyByZWlzZXJmc19leHBvcnRfb3BzID0gewotICAuZW5jb2RlX2ZoID0gcmVpc2VyZnNfZW5jb2RlX2ZoLAotICAuZGVjb2RlX2ZoID0gcmVpc2VyZnNfZGVjb2RlX2ZoLAotICAuZ2V0X3BhcmVudCA9IHJlaXNlcmZzX2dldF9wYXJlbnQsCi0gIC5nZXRfZGVudHJ5ID0gcmVpc2VyZnNfZ2V0X2RlbnRyeSwKLX0gOworCS5lbmNvZGVfZmggPSByZWlzZXJmc19lbmNvZGVfZmgsCisJLmRlY29kZV9maCA9IHJlaXNlcmZzX2RlY29kZV9maCwKKwkuZ2V0X3BhcmVudCA9IHJlaXNlcmZzX2dldF9wYXJlbnQsCisJLmdldF9kZW50cnkgPSByZWlzZXJmc19nZXRfZGVudHJ5LAorfTsKIAogLyogdGhpcyBzdHJ1Y3QgaXMgdXNlZCBpbiByZWlzZXJmc19nZXRvcHQgKCkgZm9yIGNvbnRhaW5pbmcgdGhlIHZhbHVlIGZvciB0aG9zZQogICAgbW91bnQgb3B0aW9ucyB0aGF0IGhhdmUgdmFsdWVzIHJhdGhlciB0aGFuIGJlaW5nIHRvZ2dsZXMuICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqIHZhbHVlOwotICAgIGludCBzZXRtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIHNldCBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiB0aGlzCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuICovCi0gICAgaW50IGNscm1hc2s7IC8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gY2xlYXIgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gIHRoaXMKLQkJICAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuIFRoaXMgaXMKLQkJICAgIGFwcGxpZWQgQkVGT1JFIHNldG1hc2sgKi8KKwljaGFyICp2YWx1ZTsKKwlpbnQgc2V0bWFzazsJCS8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gc2V0IG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuIHRoaXMKKwkJCQkgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiAqLworCWludCBjbHJtYXNrOwkJLyogYml0bWFzayB3aGljaCBpcyB0byBjbGVhciBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiAgdGhpcworCQkJCSAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuIFRoaXMgaXMKKwkJCQkgICBhcHBsaWVkIEJFRk9SRSBzZXRtYXNrICovCiB9IGFyZ19kZXNjX3Q7CiAKIC8qIFNldCB0aGlzIGJpdCBpbiBhcmdfcmVxdWlyZWQgdG8gYWxsb3cgZW1wdHkgYXJndW1lbnRzICovCkBAIC02NDgsNjcgKzY3Miw3MCBAQAogLyogdGhpcyBzdHJ1Y3QgaXMgdXNlZCBpbiByZWlzZXJmc19nZXRvcHQoKSBmb3IgZGVzY3JpYmluZyB0aGUgc2V0IG9mIHJlaXNlcmZzCiAgICBtb3VudCBvcHRpb25zICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2hhciAqIG9wdGlvbl9uYW1lOwotICAgIGludCBhcmdfcmVxdWlyZWQ7IC8qIDAgaWYgYXJndW1lbnQgaXMgbm90IHJlcXVpcmVkLCBub3QgMCBvdGhlcndpc2UgKi8KLSAgICBjb25zdCBhcmdfZGVzY190ICogdmFsdWVzOyAvKiBsaXN0IG9mIHZhbHVlcyBhY2NlcHRlZCBieSBhbiBvcHRpb24gKi8KLSAgICBpbnQgc2V0bWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBzZXQgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gdGhpcwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiAqLwotICAgIGludCBjbHJtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIGNsZWFyIG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuICB0aGlzCi0JCSAgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCi0JCSAgICBhcHBsaWVkIEJFRk9SRSBzZXRtYXNrICovCisJY2hhciAqb3B0aW9uX25hbWU7CisJaW50IGFyZ19yZXF1aXJlZDsJLyogMCBpZiBhcmd1bWVudCBpcyBub3QgcmVxdWlyZWQsIG5vdCAwIG90aGVyd2lzZSAqLworCWNvbnN0IGFyZ19kZXNjX3QgKnZhbHVlczsJLyogbGlzdCBvZiB2YWx1ZXMgYWNjZXB0ZWQgYnkgYW4gb3B0aW9uICovCisJaW50IHNldG1hc2s7CQkvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIHNldCBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiB0aGlzCisJCQkJICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gKi8KKwlpbnQgY2xybWFzazsJCS8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gY2xlYXIgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gIHRoaXMKKwkJCQkgICB2YWx1ZSBpcyBmb3VuZCwgMCBpcyBubyBiaXRzIGFyZSB0byBiZSBjaGFuZ2VkLiBUaGlzIGlzCisJCQkJICAgYXBwbGllZCBCRUZPUkUgc2V0bWFzayAqLwogfSBvcHRfZGVzY190OwogCiAvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIC1vIGRhdGE9ICovCiBzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBsb2dnaW5nX21vZGVbXSA9IHsKLSAgICB7Im9yZGVyZWQiLCAxPDxSRUlTRVJGU19EQVRBX09SREVSRUQsICgxPDxSRUlTRVJGU19EQVRBX0xPR3wxPDxSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyl9LAotICAgIHsiam91cm5hbCIsIDE8PFJFSVNFUkZTX0RBVEFfTE9HLCAoMTw8UkVJU0VSRlNfREFUQV9PUkRFUkVEfDE8PFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKX0sCi0gICAgeyJ3cml0ZWJhY2siLCAxPDxSRUlTRVJGU19EQVRBX1dSSVRFQkFDSywgKDE8PFJFSVNFUkZTX0RBVEFfT1JERVJFRHwxPDxSRUlTRVJGU19EQVRBX0xPRyl9LAotICAgIHtOVUxMLCAwfQorCXsib3JkZXJlZCIsIDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVELAorCSAoMSA8PCBSRUlTRVJGU19EQVRBX0xPRyB8IDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spfSwKKwl7ImpvdXJuYWwiLCAxIDw8IFJFSVNFUkZTX0RBVEFfTE9HLAorCSAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQgfCAxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKX0sCisJeyJ3cml0ZWJhY2siLCAxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLLAorCSAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQgfCAxIDw8IFJFSVNFUkZTX0RBVEFfTE9HKX0sCisJe05VTEwsIDB9CiB9OwogCiAvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yIC1vIGJhcnJpZXI9ICovCiBzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBiYXJyaWVyX21vZGVbXSA9IHsKLSAgICB7Im5vbmUiLCAxPDxSRUlTRVJGU19CQVJSSUVSX05PTkUsIDE8PFJFSVNFUkZTX0JBUlJJRVJfRkxVU0h9LAotICAgIHsiZmx1c2giLCAxPDxSRUlTRVJGU19CQVJSSUVSX0ZMVVNILCAxPDxSRUlTRVJGU19CQVJSSUVSX05PTkV9LAotICAgIHtOVUxMLCAwfQorCXsibm9uZSIsIDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FLCAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0h9LAorCXsiZmx1c2giLCAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gsIDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FfSwKKwl7TlVMTCwgMH0KIH07CiAKIC8qIHBvc3NpYmxlIHZhbHVlcyBmb3IgIi1vIGJsb2NrLWFsbG9jYXRvcj0iIGFuZCBiaXRzIHdoaWNoIGFyZSB0byBiZSBzZXQgaW4KICAgIHNfbW91bnRfb3B0IG9mIHJlaXNlcmZzIHNwZWNpZmljIHBhcnQgb2YgaW4tY29yZSBzdXBlciBibG9jayAqLwogc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgYmFsbG9jW10gPSB7Ci0gICAgeyJub2JvcmRlciIsIDE8PFJFSVNFUkZTX05PX0JPUkRFUiwgMH0sCi0gICAgeyJib3JkZXIiLCAwLCAxPDxSRUlTRVJGU19OT19CT1JERVJ9LAotICAgIHsibm9fdW5oYXNoZWRfcmVsb2NhdGlvbiIsIDE8PFJFSVNFUkZTX05PX1VOSEFTSEVEX1JFTE9DQVRJT04sIDB9LAotICAgIHsiaGFzaGVkX3JlbG9jYXRpb24iLCAxPDxSRUlTRVJGU19IQVNIRURfUkVMT0NBVElPTiwgMH0sCi0gICAgeyJ0ZXN0NCIsIDE8PFJFSVNFUkZTX1RFU1Q0LCAwfSwKLSAgICB7Im5vdGVzdDQiLCAwLCAxPDxSRUlTRVJGU19URVNUNH0sCi0gICAge05VTEwsIDAsIDB9CisJeyJub2JvcmRlciIsIDEgPDwgUkVJU0VSRlNfTk9fQk9SREVSLCAwfSwKKwl7ImJvcmRlciIsIDAsIDEgPDwgUkVJU0VSRlNfTk9fQk9SREVSfSwKKwl7Im5vX3VuaGFzaGVkX3JlbG9jYXRpb24iLCAxIDw8IFJFSVNFUkZTX05PX1VOSEFTSEVEX1JFTE9DQVRJT04sIDB9LAorCXsiaGFzaGVkX3JlbG9jYXRpb24iLCAxIDw8IFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKKwl7InRlc3Q0IiwgMSA8PCBSRUlTRVJGU19URVNUNCwgMH0sCisJeyJub3Rlc3Q0IiwgMCwgMSA8PCBSRUlTRVJGU19URVNUNH0sCisJe05VTEwsIDAsIDB9CiB9OwogCiBzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCB0YWlsc1tdID0gewotICAgIHsib24iLCAxPDxSRUlTRVJGU19MQVJHRVRBSUwsIDE8PFJFSVNFUkZTX1NNQUxMVEFJTH0sCi0gICAgeyJvZmYiLCAwLCAoMTw8UkVJU0VSRlNfTEFSR0VUQUlMKXwoMTw8UkVJU0VSRlNfU01BTExUQUlMKX0sCi0gICAgeyJzbWFsbCIsIDE8PFJFSVNFUkZTX1NNQUxMVEFJTCwgMTw8UkVJU0VSRlNfTEFSR0VUQUlMfSwKLSAgICB7TlVMTCwgMCwgMH0KKwl7Im9uIiwgMSA8PCBSRUlTRVJGU19MQVJHRVRBSUwsIDEgPDwgUkVJU0VSRlNfU01BTExUQUlMfSwKKwl7Im9mZiIsIDAsICgxIDw8IFJFSVNFUkZTX0xBUkdFVEFJTCkgfCAoMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwpfSwKKwl7InNtYWxsIiwgMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwsIDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMfSwKKwl7TlVMTCwgMCwgMH0KIH07CiAKIHN0YXRpYyBjb25zdCBhcmdfZGVzY190IGVycm9yX2FjdGlvbnNbXSA9IHsKLSAgICB7InBhbmljIiwgMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQywKLSAgICAgICAgICAgICAgKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8gfCAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFKX0sCi0gICAgeyJyby1yZW1vdW50IiwgMSA8PCBSRUlTRVJGU19FUlJPUl9STywKLSAgICAgICAgICAgICAgKDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMgfCAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFKX0sCisJeyJwYW5pYyIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMsCisJICgxIDw8IFJFSVNFUkZTX0VSUk9SX1JPIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAorCXsicm8tcmVtb3VudCIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUk8sCisJICgxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAogI2lmZGVmIFJFSVNFUkZTX0pPVVJOQUxfRVJST1JfQUxMT1dTX05PX0xPRwotICAgIHsiY29udGludWUiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFLAotICAgICAgICAgICAgICAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pfSwKKwl7ImNvbnRpbnVlIiwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSwKKwkgKDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMgfCAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPKX0sCiAjZW5kaWYKLSAgICB7TlVMTCwgMCwgMH0sCisJe05VTEwsIDAsIDB9LAogfTsKIAotaW50IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IDEyOCAqIDEwMjQ7IC8qIERlZmF1bHQgcmVjb21tZW5kZWQgSS9PIHNpemUgaXMgMTI4ay4KLQkJCQkJICAgICAgVGhlcmUgbWlnaHQgYmUgYnJva2VuIGFwcGxpY2F0aW9ucyB0aGF0IGFyZQotCQkJCQkgICAgICBjb25mdXNlZCBieSB0aGlzLiBVc2Ugbm9sYXJnZWlvIG1vdW50IG9wdGlvbgotCQkJCQkgICAgICB0byBnZXQgdXN1YWwgaS9vIHNpemUgPSBQQUdFX1NJWkUuCi0JCQkJCSAgICAqLworaW50IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IDEyOCAqIDEwMjQ7CS8qIERlZmF1bHQgcmVjb21tZW5kZWQgSS9PIHNpemUgaXMgMTI4ay4KKwkJCQkJCSAgIFRoZXJlIG1pZ2h0IGJlIGJyb2tlbiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUKKwkJCQkJCSAgIGNvbmZ1c2VkIGJ5IHRoaXMuIFVzZSBub2xhcmdlaW8gbW91bnQgb3B0aW9uCisJCQkJCQkgICB0byBnZXQgdXN1YWwgaS9vIHNpemUgPSBQQUdFX1NJWkUuCisJCQkJCQkgKi8KIAogLyogcHJvY2VlZCBvbmx5IG9uZSBvcHRpb24gZnJvbSBhIGxpc3QgKmN1ciAtIHN0cmluZyBjb250YWluaW5nIG9mIG1vdW50IG9wdGlvbnMKICAgIG9wdHMgLSBhcnJheSBvZiBvcHRpb25zIHdoaWNoIGFyZSBhY2NlcHRlZApAQCAtNzE2LDQ3NiArNzQzLDUzMCBAQAogICAgaW4gdGhlIGlucHV0IC0gcG9pbnRlciB0byB0aGUgYXJndW1lbnQgaXMgc3RvcmVkIGhlcmUKICAgIGJpdF9mbGFncyAtIGlmIG9wdGlvbiByZXF1aXJlcyB0byBzZXQgYSBjZXJ0YWluIGJpdCAtIGl0IGlzIHNldCBoZXJlCiAgICByZXR1cm4gLTEgaWYgdW5rbm93biBvcHRpb24gaXMgZm91bmQsIG9wdC0+YXJnX3JlcXVpcmVkIG90aGVyd2lzZSAqLwotc3RhdGljIGludCByZWlzZXJmc19nZXRvcHQgKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjaGFyICoqIGN1ciwgb3B0X2Rlc2NfdCAqIG9wdHMsIGNoYXIgKiogb3B0X2FyZywKLQkJCSAgICB1bnNpZ25lZCBsb25nICogYml0X2ZsYWdzKQorc3RhdGljIGludCByZWlzZXJmc19nZXRvcHQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjaGFyICoqY3VyLCBvcHRfZGVzY190ICogb3B0cywKKwkJCSAgIGNoYXIgKipvcHRfYXJnLCB1bnNpZ25lZCBsb25nICpiaXRfZmxhZ3MpCiB7Ci0gICAgY2hhciAqIHA7Ci0gICAgLyogZm9vPWJhciwgCi0gICAgICAgXiAgIF4gIF4KLSAgICAgICB8ICAgfCAgKy0tIG9wdGlvbl9lbmQKLSAgICAgICB8ICAgKy0tIGFyZ19zdGFydAotICAgICAgICstLSBvcHRpb25fc3RhcnQKLSAgICAqLwotICAgIGNvbnN0IG9wdF9kZXNjX3QgKiBvcHQ7Ci0gICAgY29uc3QgYXJnX2Rlc2NfdCAqIGFyZzsKLSAgICAKLSAgICAKLSAgICBwID0gKmN1cjsKLSAgICAKLSAgICAvKiBhc3N1bWUgYXJndW1lbnQgY2Fubm90IGNvbnRhaW4gY29tbWFzICovCi0gICAgKmN1ciA9IHN0cmNociAocCwgJywnKTsKLSAgICBpZiAoKmN1cikgewotCSooKmN1cikgPSAnXDAnOwotCSgqY3VyKSArKzsKLSAgICB9CisJY2hhciAqcDsKKwkvKiBmb289YmFyLCAKKwkgICBeICAgXiAgXgorCSAgIHwgICB8ICArLS0gb3B0aW9uX2VuZAorCSAgIHwgICArLS0gYXJnX3N0YXJ0CisJICAgKy0tIG9wdGlvbl9zdGFydAorCSAqLworCWNvbnN0IG9wdF9kZXNjX3QgKm9wdDsKKwljb25zdCBhcmdfZGVzY190ICphcmc7CiAKLSAgICBpZiAoICFzdHJuY21wIChwLCAiYWxsb2M9IiwgNikgKSB7Ci0JLyogVWdseSBzcGVjaWFsIGNhc2UsIHByb2JhYmx5IHdlIHNob3VsZCByZWRvIG9wdGlvbnMgcGFyc2VyIHNvIHRoYXQKLQkgICBpdCBjYW4gdW5kZXJzdGFuZCBzZXZlcmFsIGFyZ3VtZW50cyBmb3Igc29tZSBvcHRpb25zLCBhbHNvIHNvIHRoYXQKLQkgICBpdCBjYW4gZmlsbCBzZXZlcmFsIGJpdGZpZWxkcyB3aXRoIG9wdGlvbiB2YWx1ZXMuICovCi0JaWYgKCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKCBzLCBwICsgNikgKSB7Ci0JICAgIHJldHVybiAtMTsKLQl9IGVsc2UgewotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQorCXAgPSAqY3VyOwogCi0gCi0gICAgLyogZm9yIGV2ZXJ5IG9wdGlvbiBpbiB0aGUgbGlzdCAqLwotICAgIGZvciAob3B0ID0gb3B0czsgb3B0LT5vcHRpb25fbmFtZTsgb3B0ICsrKSB7Ci0JaWYgKCFzdHJuY21wIChwLCBvcHQtPm9wdGlvbl9uYW1lLCBzdHJsZW4gKG9wdC0+b3B0aW9uX25hbWUpKSkgewotCSAgICBpZiAoYml0X2ZsYWdzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9wdC0+Y2xybWFzayA9PSAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiJXMgbm90IHN1cHBvcnRlZC4iLCBwKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpiaXRfZmxhZ3MgJj0gfm9wdC0+Y2xybWFzazsKLSAgICAgICAgICAgICAgICBpZiAob3B0LT5zZXRtYXNrID09ICgxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCkpCi0gICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICIlcyBub3Qgc3VwcG9ydGVkLiIsIHApOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmJpdF9mbGFncyB8PSBvcHQtPnNldG1hc2s7Ci0JICAgIH0KLQkgICAgYnJlYWs7CisJLyogYXNzdW1lIGFyZ3VtZW50IGNhbm5vdCBjb250YWluIGNvbW1hcyAqLworCSpjdXIgPSBzdHJjaHIocCwgJywnKTsKKwlpZiAoKmN1cikgeworCQkqKCpjdXIpID0gJ1wwJzsKKwkJKCpjdXIpKys7CiAJfQotICAgIH0KLSAgICBpZiAoIW9wdC0+b3B0aW9uX25hbWUpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAidW5rbm93biBtb3VudCBvcHRpb24gXCIlc1wiIiwgcCk7Ci0JcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwICs9IHN0cmxlbiAob3B0LT5vcHRpb25fbmFtZSk7Ci0gICAgc3dpdGNoICgqcCkgewotICAgIGNhc2UgJz0nOgotCWlmICghb3B0LT5hcmdfcmVxdWlyZWQpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInRoZSBvcHRpb24gXCIlc1wiIGRvZXMgbm90IHJlcXVpcmUgYW4gYXJndW1lbnQiLAotCQkgICAgb3B0LT5vcHRpb25fbmFtZSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0JYnJlYWs7Ci0JCi0gICAgY2FzZSAwOgotCWlmIChvcHQtPmFyZ19yZXF1aXJlZCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAidGhlIG9wdGlvbiBcIiVzXCIgcmVxdWlyZXMgYW4gYXJndW1lbnQiLCBvcHQtPm9wdGlvbl9uYW1lKTsKLQkgICAgcmV0dXJuIC0xOwotCX0KLQlicmVhazsKLSAgICBkZWZhdWx0OgotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJoZWFkIG9mIG9wdGlvbiBcIiVzXCIgaXMgb25seSBjb3JyZWN0Iiwgb3B0LT5vcHRpb25fbmFtZSk7Ci0JcmV0dXJuIC0xOwotICAgIH0KIAotICAgIC8qIG1vdmUgdG8gdGhlIGFyZ3VtZW50LCBvciB0byBuZXh0IG9wdGlvbiBpZiBhcmd1bWVudCBpcyBub3QgcmVxdWlyZWQgKi8KLSAgICBwICsrOwotICAgIAotICAgIGlmICggb3B0LT5hcmdfcmVxdWlyZWQgJiYgIShvcHQtPmFyZ19yZXF1aXJlZCAmICgxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSkpICYmICFzdHJsZW4gKHApICkgewotCS8qIHRoaXMgY2F0Y2hlcyAib3B0aW9uPSwiIGlmIG5vdCBhbGxvd2VkICovCi0JcmVpc2VyZnNfd2FybmluZyAocywgImVtcHR5IGFyZ3VtZW50IGZvciBcIiVzXCIiLCBvcHQtPm9wdGlvbl9uYW1lKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIGlmICghb3B0LT52YWx1ZXMpIHsKLQkvKiAqPU5VTExvcHRfYXJnIGNvbnRhaW5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKi8KLQkqb3B0X2FyZyA9IHA7Ci0JcmV0dXJuIG9wdC0+YXJnX3JlcXVpcmVkICYgfigxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSk7Ci0gICAgfQotICAgIAotICAgIC8qIHZhbHVlcyBwb3NzaWJsZSBmb3IgdGhpcyBvcHRpb24gYXJlIGxpc3RlZCBpbiBvcHQtPnZhbHVlcyAqLwotICAgIGZvciAoYXJnID0gb3B0LT52YWx1ZXM7IGFyZy0+dmFsdWU7IGFyZyArKykgewotCWlmICghc3RyY21wIChwLCBhcmctPnZhbHVlKSkgewotCSAgICBpZiAoYml0X2ZsYWdzKSB7Ci0JCSpiaXRfZmxhZ3MgJj0gfmFyZy0+Y2xybWFzazsKLQkJKmJpdF9mbGFncyB8PSBhcmctPnNldG1hc2s7Ci0JICAgIH0KLQkgICAgcmV0dXJuIG9wdC0+YXJnX3JlcXVpcmVkOworCWlmICghc3RybmNtcChwLCAiYWxsb2M9IiwgNikpIHsKKwkJLyogVWdseSBzcGVjaWFsIGNhc2UsIHByb2JhYmx5IHdlIHNob3VsZCByZWRvIG9wdGlvbnMgcGFyc2VyIHNvIHRoYXQKKwkJICAgaXQgY2FuIHVuZGVyc3RhbmQgc2V2ZXJhbCBhcmd1bWVudHMgZm9yIHNvbWUgb3B0aW9ucywgYWxzbyBzbyB0aGF0CisJCSAgIGl0IGNhbiBmaWxsIHNldmVyYWwgYml0ZmllbGRzIHdpdGggb3B0aW9uIHZhbHVlcy4gKi8KKwkJaWYgKHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMocywgcCArIDYpKSB7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsKKwkJfQogCX0KLSAgICB9Ci0gICAgCi0gICAgcmVpc2VyZnNfd2FybmluZyAocywgImJhZCB2YWx1ZSBcIiVzXCIgZm9yIG9wdGlvbiBcIiVzXCIiLCBwLCBvcHQtPm9wdGlvbl9uYW1lKTsKLSAgICByZXR1cm4gLTE7CisKKwkvKiBmb3IgZXZlcnkgb3B0aW9uIGluIHRoZSBsaXN0ICovCisJZm9yIChvcHQgPSBvcHRzOyBvcHQtPm9wdGlvbl9uYW1lOyBvcHQrKykgeworCQlpZiAoIXN0cm5jbXAocCwgb3B0LT5vcHRpb25fbmFtZSwgc3RybGVuKG9wdC0+b3B0aW9uX25hbWUpKSkgeworCQkJaWYgKGJpdF9mbGFncykgeworCQkJCWlmIChvcHQtPmNscm1hc2sgPT0KKwkJCQkgICAgKDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUKSkKKwkJCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiJXMgbm90IHN1cHBvcnRlZC4iLAorCQkJCQkJCSBwKTsKKwkJCQllbHNlCisJCQkJCSpiaXRfZmxhZ3MgJj0gfm9wdC0+Y2xybWFzazsKKwkJCQlpZiAob3B0LT5zZXRtYXNrID09CisJCQkJICAgICgxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCkpCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywgIiVzIG5vdCBzdXBwb3J0ZWQuIiwKKwkJCQkJCQkgcCk7CisJCQkJZWxzZQorCQkJCQkqYml0X2ZsYWdzIHw9IG9wdC0+c2V0bWFzazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghb3B0LT5vcHRpb25fbmFtZSkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJ1bmtub3duIG1vdW50IG9wdGlvbiBcIiVzXCIiLCBwKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXAgKz0gc3RybGVuKG9wdC0+b3B0aW9uX25hbWUpOworCXN3aXRjaCAoKnApIHsKKwljYXNlICc9JzoKKwkJaWYgKCFvcHQtPmFyZ19yZXF1aXJlZCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInRoZSBvcHRpb24gXCIlc1wiIGRvZXMgbm90IHJlcXVpcmUgYW4gYXJndW1lbnQiLAorCQkJCQkgb3B0LT5vcHRpb25fbmFtZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDA6CisJCWlmIChvcHQtPmFyZ19yZXF1aXJlZCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInRoZSBvcHRpb24gXCIlc1wiIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwKKwkJCQkJIG9wdC0+b3B0aW9uX25hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlaXNlcmZzX3dhcm5pbmcocywgImhlYWQgb2Ygb3B0aW9uIFwiJXNcIiBpcyBvbmx5IGNvcnJlY3QiLAorCQkJCSBvcHQtPm9wdGlvbl9uYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG1vdmUgdG8gdGhlIGFyZ3VtZW50LCBvciB0byBuZXh0IG9wdGlvbiBpZiBhcmd1bWVudCBpcyBub3QgcmVxdWlyZWQgKi8KKwlwKys7CisKKwlpZiAob3B0LT5hcmdfcmVxdWlyZWQKKwkgICAgJiYgIShvcHQtPmFyZ19yZXF1aXJlZCAmICgxIDw8IFJFSVNFUkZTX09QVF9BTExPV0VNUFRZKSkKKwkgICAgJiYgIXN0cmxlbihwKSkgeworCQkvKiB0aGlzIGNhdGNoZXMgIm9wdGlvbj0sIiBpZiBub3QgYWxsb3dlZCAqLworCQlyZWlzZXJmc193YXJuaW5nKHMsICJlbXB0eSBhcmd1bWVudCBmb3IgXCIlc1wiIiwKKwkJCQkgb3B0LT5vcHRpb25fbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIW9wdC0+dmFsdWVzKSB7CisJCS8qICo9TlVMTG9wdF9hcmcgY29udGFpbnMgcG9pbnRlciB0byBhcmd1bWVudCAqLworCQkqb3B0X2FyZyA9IHA7CisJCXJldHVybiBvcHQtPmFyZ19yZXF1aXJlZCAmIH4oMSA8PCBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSk7CisJfQorCisJLyogdmFsdWVzIHBvc3NpYmxlIGZvciB0aGlzIG9wdGlvbiBhcmUgbGlzdGVkIGluIG9wdC0+dmFsdWVzICovCisJZm9yIChhcmcgPSBvcHQtPnZhbHVlczsgYXJnLT52YWx1ZTsgYXJnKyspIHsKKwkJaWYgKCFzdHJjbXAocCwgYXJnLT52YWx1ZSkpIHsKKwkJCWlmIChiaXRfZmxhZ3MpIHsKKwkJCQkqYml0X2ZsYWdzICY9IH5hcmctPmNscm1hc2s7CisJCQkJKmJpdF9mbGFncyB8PSBhcmctPnNldG1hc2s7CisJCQl9CisJCQlyZXR1cm4gb3B0LT5hcmdfcmVxdWlyZWQ7CisJCX0KKwl9CisKKwlyZWlzZXJmc193YXJuaW5nKHMsICJiYWQgdmFsdWUgXCIlc1wiIGZvciBvcHRpb24gXCIlc1wiIiwgcCwKKwkJCSBvcHQtPm9wdGlvbl9uYW1lKTsKKwlyZXR1cm4gLTE7CiB9CiAKIC8qIHJldHVybnMgMCBpZiBzb21ldGhpbmcgaXMgd3JvbmcgaW4gb3B0aW9uIHN0cmluZywgMSAtIG90aGVyd2lzZSAqLwotc3RhdGljIGludCByZWlzZXJmc19wYXJzZV9vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjaGFyICogb3B0aW9ucywgLyogc3RyaW5nIGdpdmVuIHZpYSBtb3VudCdzIC1vICovCi0JCQkJICAgdW5zaWduZWQgbG9uZyAqIG1vdW50X29wdGlvbnMsCi0JCQkJICAgLyogYWZ0ZXIgdGhlIHBhcnNpbmcgcGhhc2UsIGNvbnRhaW5zIHRoZQotCQkJCSAgICAgIGNvbGxlY3Rpb24gb2YgYml0ZmxhZ3MgZGVmaW5pbmcgd2hhdAotCQkJCSAgICAgIG1vdW50IG9wdGlvbnMgd2VyZSBzZWxlY3RlZC4gKi8KLQkJCQkgICB1bnNpZ25lZCBsb25nICogYmxvY2tzLCAvKiBzdHJ0b2wtZWQgZnJvbSBOTk4gb2YgcmVzaXplPU5OTiAqLwotCQkJCSAgIGNoYXIgKiogamRldl9uYW1lLAotCQkJCSAgIHVuc2lnbmVkIGludCAqIGNvbW1pdF9tYXhfYWdlKQorc3RhdGljIGludCByZWlzZXJmc19wYXJzZV9vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqb3B0aW9ucywJLyogc3RyaW5nIGdpdmVuIHZpYSBtb3VudCdzIC1vICovCisJCQkJICB1bnNpZ25lZCBsb25nICptb3VudF9vcHRpb25zLAorCQkJCSAgLyogYWZ0ZXIgdGhlIHBhcnNpbmcgcGhhc2UsIGNvbnRhaW5zIHRoZQorCQkJCSAgICAgY29sbGVjdGlvbiBvZiBiaXRmbGFncyBkZWZpbmluZyB3aGF0CisJCQkJICAgICBtb3VudCBvcHRpb25zIHdlcmUgc2VsZWN0ZWQuICovCisJCQkJICB1bnNpZ25lZCBsb25nICpibG9ja3MsCS8qIHN0cnRvbC1lZCBmcm9tIE5OTiBvZiByZXNpemU9Tk5OICovCisJCQkJICBjaGFyICoqamRldl9uYW1lLAorCQkJCSAgdW5zaWduZWQgaW50ICpjb21taXRfbWF4X2FnZSkKIHsKLSAgICBpbnQgYzsKLSAgICBjaGFyICogYXJnID0gTlVMTDsKLSAgICBjaGFyICogcG9zOwotICAgIG9wdF9kZXNjX3Qgb3B0c1tdID0gewotCS8qIENvbXBhdGliaWxpdHkgc3R1ZmYsIHNvIHRoYXQgLW8gbm90YWlsIGZvciBvbGQgc2V0dXBzIHN0aWxsIHdvcmsgKi8KLQl7InRhaWxzIiwJLmFyZ19yZXF1aXJlZCA9ICd0JywgLnZhbHVlcyA9IHRhaWxzfSwKLQl7Im5vdGFpbCIsCS5jbHJtYXNrID0gKDE8PFJFSVNFUkZTX0xBUkdFVEFJTCl8KDE8PFJFSVNFUkZTX1NNQUxMVEFJTCl9LAotCXsiY29udiIsCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfQ09OVkVSVH0sCi0JeyJhdHRycyIsCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfQVRUUlN9LAotCXsibm9hdHRycyIsCS5jbHJtYXNrID0gMTw8UkVJU0VSRlNfQVRUUlN9LAorCWludCBjOworCWNoYXIgKmFyZyA9IE5VTEw7CisJY2hhciAqcG9zOworCW9wdF9kZXNjX3Qgb3B0c1tdID0geworCQkvKiBDb21wYXRpYmlsaXR5IHN0dWZmLCBzbyB0aGF0IC1vIG5vdGFpbCBmb3Igb2xkIHNldHVwcyBzdGlsbCB3b3JrICovCisJCXsidGFpbHMiLC5hcmdfcmVxdWlyZWQgPSAndCcsLnZhbHVlcyA9IHRhaWxzfSwKKwkJeyJub3RhaWwiLC5jbHJtYXNrID0KKwkJICgxIDw8IFJFSVNFUkZTX0xBUkdFVEFJTCkgfCAoMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwpfSwKKwkJeyJjb252Iiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfQ09OVkVSVH0sCisJCXsiYXR0cnMiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19BVFRSU30sCisJCXsibm9hdHRycyIsLmNscm1hc2sgPSAxIDw8IFJFSVNFUkZTX0FUVFJTfSwKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIKLQl7InVzZXJfeGF0dHIiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1hBVFRSU19VU0VSfSwKLQl7Im5vdXNlcl94YXR0ciIsLmNscm1hc2sgPSAxPDxSRUlTRVJGU19YQVRUUlNfVVNFUn0sCisJCXsidXNlcl94YXR0ciIsLnNldG1hc2sgPSAxIDw8IFJFSVNFUkZTX1hBVFRSU19VU0VSfSwKKwkJeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19YQVRUUlNfVVNFUn0sCiAjZWxzZQotCXsidXNlcl94YXR0ciIsCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKLQl7Im5vdXNlcl94YXR0ciIsLmNscm1hc2sgPSAxPDxSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAorCQl7InVzZXJfeGF0dHIiLC5zZXRtYXNrID0gMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAorCQl7Im5vdXNlcl94YXR0ciIsLmNscm1hc2sgPSAxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMCi0JeyJhY2wiLAkJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19QT1NJWEFDTH0sCi0JeyJub2FjbCIsCS5jbHJtYXNrID0gMTw8UkVJU0VSRlNfUE9TSVhBQ0x9LAorCQl7ImFjbCIsLnNldG1hc2sgPSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMfSwKKwkJeyJub2FjbCIsLmNscm1hc2sgPSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMfSwKICNlbHNlCi0JeyJhY2wiLAkJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAotCXsibm9hY2wiLAkuY2xybWFzayA9IDE8PFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCisJCXsiYWNsIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKwkJeyJub2FjbCIsLmNscm1hc2sgPSAxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCiAjZW5kaWYKLQl7Im5vbG9nIix9LAkgLyogVGhpcyBpcyB1bnN1cHBvcnRlZCAqLwotCXsicmVwbGF5b25seSIsCS5zZXRtYXNrID0gMTw8UkVQTEFZT05MWX0sCi0JeyJibG9jay1hbGxvY2F0b3IiLCAuYXJnX3JlcXVpcmVkID0gJ2EnLCAudmFsdWVzID0gYmFsbG9jfSwKLQl7ImRhdGEiLAkuYXJnX3JlcXVpcmVkID0gJ2QnLCAudmFsdWVzID0gbG9nZ2luZ19tb2RlfSwKLQl7ImJhcnJpZXIiLAkuYXJnX3JlcXVpcmVkID0gJ2InLCAudmFsdWVzID0gYmFycmllcl9tb2RlfSwKLQl7InJlc2l6ZSIsCS5hcmdfcmVxdWlyZWQgPSAncicsIC52YWx1ZXMgPSBOVUxMfSwKLQl7ImpkZXYiLAkuYXJnX3JlcXVpcmVkID0gJ2onLCAudmFsdWVzID0gTlVMTH0sCi0JeyJub2xhcmdlaW8iLAkuYXJnX3JlcXVpcmVkID0gJ3cnLCAudmFsdWVzID0gTlVMTH0sCi0JeyJjb21taXQiLAkuYXJnX3JlcXVpcmVkID0gJ2MnLCAudmFsdWVzID0gTlVMTH0sCi0JeyJ1c3JxdW90YSIsfSwKLQl7ImdycHF1b3RhIix9LAotCXsiZXJyb3JzIiwgCS5hcmdfcmVxdWlyZWQgPSAnZScsIC52YWx1ZXMgPSBlcnJvcl9hY3Rpb25zfSwKLQl7InVzcmpxdW90YSIsCS5hcmdfcmVxdWlyZWQgPSAndSd8KDE8PFJFSVNFUkZTX09QVF9BTExPV0VNUFRZKSwgLnZhbHVlcyA9IE5VTEx9LAotCXsiZ3JwanF1b3RhIiwJLmFyZ19yZXF1aXJlZCA9ICdnJ3woMTw8UkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpLCAudmFsdWVzID0gTlVMTH0sCi0JeyJqcWZtdCIsCS5hcmdfcmVxdWlyZWQgPSAnZicsIC52YWx1ZXMgPSBOVUxMfSwKLQl7TlVMTCx9Ci0gICAgfTsKLQkKLSAgICAqYmxvY2tzID0gMDsKLSAgICBpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQotCS8qIHVzZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb246IGNyZWF0ZSB0YWlscywgam91cm5hbGluZyBvbiwgbm8KLQkgICBjb252ZXJzaW9uIHRvIG5ld2VzdCBmb3JtYXQgKi8KKwkJeyJub2xvZyIsfSwJLyogVGhpcyBpcyB1bnN1cHBvcnRlZCAqLworCQl7InJlcGxheW9ubHkiLC5zZXRtYXNrID0gMSA8PCBSRVBMQVlPTkxZfSwKKwkJeyJibG9jay1hbGxvY2F0b3IiLC5hcmdfcmVxdWlyZWQgPSAnYScsLnZhbHVlcyA9IGJhbGxvY30sCisJCXsiZGF0YSIsLmFyZ19yZXF1aXJlZCA9ICdkJywudmFsdWVzID0gbG9nZ2luZ19tb2RlfSwKKwkJeyJiYXJyaWVyIiwuYXJnX3JlcXVpcmVkID0gJ2InLC52YWx1ZXMgPSBiYXJyaWVyX21vZGV9LAorCQl7InJlc2l6ZSIsLmFyZ19yZXF1aXJlZCA9ICdyJywudmFsdWVzID0gTlVMTH0sCisJCXsiamRldiIsLmFyZ19yZXF1aXJlZCA9ICdqJywudmFsdWVzID0gTlVMTH0sCisJCXsibm9sYXJnZWlvIiwuYXJnX3JlcXVpcmVkID0gJ3cnLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJjb21taXQiLC5hcmdfcmVxdWlyZWQgPSAnYycsLnZhbHVlcyA9IE5VTEx9LAorCQl7InVzcnF1b3RhIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfUVVPVEF9LAorCQl7ImdycHF1b3RhIiwuc2V0bWFzayA9IDEgPDwgUkVJU0VSRlNfUVVPVEF9LAorCQl7Im5vcXVvdGEiLC5jbHJtYXNrID0gMSA8PCBSRUlTRVJGU19RVU9UQX0sCisJCXsiZXJyb3JzIiwuYXJnX3JlcXVpcmVkID0gJ2UnLC52YWx1ZXMgPSBlcnJvcl9hY3Rpb25zfSwKKwkJeyJ1c3JqcXVvdGEiLC5hcmdfcmVxdWlyZWQgPQorCQkgJ3UnIHwgKDEgPDwgUkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJncnBqcXVvdGEiLC5hcmdfcmVxdWlyZWQgPQorCQkgJ2cnIHwgKDEgPDwgUkVJU0VSRlNfT1BUX0FMTE9XRU1QVFkpLC52YWx1ZXMgPSBOVUxMfSwKKwkJeyJqcWZtdCIsLmFyZ19yZXF1aXJlZCA9ICdmJywudmFsdWVzID0gTlVMTH0sCisJCXtOVUxMLH0KKwl9OworCisJKmJsb2NrcyA9IDA7CisJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKKwkJLyogdXNlIGRlZmF1bHQgY29uZmlndXJhdGlvbjogY3JlYXRlIHRhaWxzLCBqb3VybmFsaW5nIG9uLCBubworCQkgICBjb252ZXJzaW9uIHRvIG5ld2VzdCBmb3JtYXQgKi8KKwkJcmV0dXJuIDE7CisKKwlmb3IgKHBvcyA9IG9wdGlvbnM7IHBvczspIHsKKwkJYyA9IHJlaXNlcmZzX2dldG9wdChzLCAmcG9zLCBvcHRzLCAmYXJnLCBtb3VudF9vcHRpb25zKTsKKwkJaWYgKGMgPT0gLTEpCisJCQkvKiB3cm9uZyBvcHRpb24gaXMgZ2l2ZW4gKi8KKwkJCXJldHVybiAwOworCisJCWlmIChjID09ICdyJykgeworCQkJY2hhciAqcDsKKworCQkJcCA9IE5VTEw7CisJCQkvKiAicmVzaXplPU5OTiIgb3IgInJlc2l6ZT1hdXRvIiAqLworCisJCQlpZiAoIXN0cmNtcChhcmcsICJhdXRvIikpIHsKKwkJCQkvKiBGcm9tIEpGUyBjb2RlLCB0byBhdXRvLWdldCB0aGUgc2l6ZS4gKi8KKwkJCQkqYmxvY2tzID0KKwkJCQkgICAgcy0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IHMtPgorCQkJCSAgICBzX2Jsb2Nrc2l6ZV9iaXRzOworCQkJfSBlbHNlIHsKKwkJCQkqYmxvY2tzID0gc2ltcGxlX3N0cnRvdWwoYXJnLCAmcCwgMCk7CisJCQkJaWYgKCpwICE9ICdcMCcpIHsKKwkJCQkJLyogTk5OIGRvZXMgbm90IGxvb2sgbGlrZSBhIG51bWJlciAqLworCQkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBiYWQgdmFsdWUgJXMiLAorCQkJCQkJCSBhcmcpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoYyA9PSAnYycpIHsKKwkJCWNoYXIgKnAgPSBOVUxMOworCQkJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChhcmcsICZwLCAwKTsKKwkJCS8qIGNvbW1pdD1OTk4gKHRpbWUgaW4gc2Vjb25kcykgKi8KKwkJCWlmICgqcCAhPSAnXDAnIHx8IHZhbCA+PSAodW5zaWduZWQgaW50KS0xKSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBiYWQgdmFsdWUgJXMiLAorCQkJCQkJIGFyZyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkqY29tbWl0X21heF9hZ2UgPSAodW5zaWduZWQgaW50KXZhbDsKKwkJfQorCisJCWlmIChjID09ICd3JykgeworCQkJY2hhciAqcCA9IE5VTEw7CisJCQlpbnQgdmFsID0gc2ltcGxlX3N0cnRvdWwoYXJnLCAmcCwgMCk7CisKKwkJCWlmICgqcCAhPSAnXDAnKSB7CisJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBub24tbnVtZXJpYyB2YWx1ZSAlcyBmb3Igbm9sYXJnZWlvIG9wdGlvbiIsCisJCQkJCQkgYXJnKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICh2YWwpCisJCQkJcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gUEFHRV9TSVpFOworCQkJZWxzZQorCQkJCXJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IDEyOCAqIDEwMjQ7CisJCX0KKworCQlpZiAoYyA9PSAnaicpIHsKKwkJCWlmIChhcmcgJiYgKmFyZyAmJiBqZGV2X25hbWUpIHsKKwkJCQlpZiAoKmpkZXZfbmFtZSkgewkvL0htLCBhbHJlYWR5IGFzc2lnbmVkPworCQkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBqb3VybmFsIGRldmljZSB3YXMgYWxyZWFkeSAgc3BlY2lmaWVkIHRvIGJlICVzIiwKKwkJCQkJCQkgKmpkZXZfbmFtZSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQkqamRldl9uYW1lID0gYXJnOworCQkJfQorCQl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJCWlmIChjID09ICd1JyB8fCBjID09ICdnJykgeworCQkJaW50IHF0eXBlID0gYyA9PSAndScgPyBVU1JRVU9UQSA6IEdSUFFVT1RBOworCisJCQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGNhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCBxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKCphcmcpIHsJLyogU29tZSBmaWxlbmFtZSBzcGVjaWZpZWQ/ICovCisJCQkJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXQorCQkJCSAgICAmJiBzdHJjbXAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdLAorCQkJCQkgICAgICBhcmcpKSB7CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6ICVzIHF1b3RhIGZpbGUgYWxyZWFkeSBzcGVjaWZpZWQuIiwKKwkJCQkJCQkgUVRZUEUyTkFNRShxdHlwZSkpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJaWYgKHN0cmNocihhcmcsICcvJykpIHsKKwkJCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogcXVvdGFmaWxlIG11c3QgYmUgb24gZmlsZXN5c3RlbSByb290LiIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdID0KKwkJCQkgICAga21hbGxvYyhzdHJsZW4oYXJnKSArIDEsIEdGUF9LRVJORUwpOworCQkJCWlmICghUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBzdG9yaW5nIHF1b3RhZmlsZSBuYW1lLiIpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJc3RyY3B5KFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSwgYXJnKTsKKwkJCQkqbW91bnRfb3B0aW9ucyB8PSAxIDw8IFJFSVNFUkZTX1FVT1RBOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7CisJCQkJCWtmcmVlKFJFSVNFUkZTX1NCKHMpLT4KKwkJCQkJICAgICAgc19xZl9uYW1lc1txdHlwZV0pOworCQkJCQlSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gPQorCQkJCQkgICAgTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGMgPT0gJ2YnKSB7CisJCQlpZiAoIXN0cmNtcChhcmcsICJ2ZnNvbGQiKSkKKwkJCQlSRUlTRVJGU19TQihzKS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfT0xEOworCQkJZWxzZSBpZiAoIXN0cmNtcChhcmcsICJ2ZnN2MCIpKQorCQkJCVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19WMDsKKwkJCWVsc2UgeworCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCSAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogdW5rbm93biBxdW90YSBmb3JtYXQgc3BlY2lmaWVkLiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisjZWxzZQorCQlpZiAoYyA9PSAndScgfHwgYyA9PSAnZycgfHwgYyA9PSAnZicpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgbm90IHN1cHBvcnRlZC4iKTsKKwkJCXJldHVybiAwOworCQl9CisjZW5kaWYKKwl9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpZiAoIVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQKKwkgICAgJiYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW1VTUlFVT1RBXQorCQl8fCBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0IG5vdCBzcGVjaWZpZWQuIik7CisJCXJldHVybiAwOworCX0KKwkvKiBUaGlzIGNoZWNraW5nIGlzIG5vdCBwcmVjaXNlIHdydCB0aGUgcXVvdGEgdHlwZSBidXQgZm9yIG91ciBwdXJwb3NlcyBpdCBpcyBzdWZmaWNpZW50ICovCisJaWYgKCEoKm1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19RVU9UQSkpCisJICAgICYmIHNiX2FueV9xdW90YV9lbmFibGVkKHMpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IHF1b3RhIG9wdGlvbnMgbXVzdCBiZSBwcmVzZW50IHdoZW4gcXVvdGEgaXMgdHVybmVkIG9uLiIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwogCXJldHVybiAxOwotICAgIAotICAgIGZvciAocG9zID0gb3B0aW9uczsgcG9zOyApIHsKLQljID0gcmVpc2VyZnNfZ2V0b3B0IChzLCAmcG9zLCBvcHRzLCAmYXJnLCBtb3VudF9vcHRpb25zKTsKLQlpZiAoYyA9PSAtMSkKLQkgICAgLyogd3Jvbmcgb3B0aW9uIGlzIGdpdmVuICovCi0JICAgIHJldHVybiAwOwotCQotCWlmIChjID09ICdyJykgewotCSAgICBjaGFyICogcDsKLQkgICAgCi0JICAgIHAgPSBOVUxMOwotCSAgICAvKiAicmVzaXplPU5OTiIgb3IgInJlc2l6ZT1hdXRvIiAqLwotCi0JICAgIGlmICghc3RyY21wKGFyZywgImF1dG8iKSkgewotCQkgICAgLyogRnJvbSBKRlMgY29kZSwgdG8gYXV0by1nZXQgdGhlIHNpemUuKi8KLQkJICAgICpibG9ja3MgPSBzLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gcy0+c19ibG9ja3NpemVfYml0czsKLQkgICAgfSBlbHNlIHsKLQkJICAgICpibG9ja3MgPSBzaW1wbGVfc3RydG91bCAoYXJnLCAmcCwgMCk7Ci0JCSAgICBpZiAoKnAgIT0gJ1wwJykgewotCQkJLyogTk5OIGRvZXMgbm90IGxvb2sgbGlrZSBhIG51bWJlciAqLwotCQkJcmVpc2VyZnNfd2FybmluZyAocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGJhZCB2YWx1ZSAlcyIsIGFyZyk7Ci0JCQlyZXR1cm4gMDsKLQkJICAgIH0KLQkgICAgfQotCX0KLQotCWlmICggYyA9PSAnYycgKSB7Ci0JCWNoYXIgKnAgPSBOVUxMOwotCQl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsIChhcmcsICZwLCAwKTsKLQkJLyogY29tbWl0PU5OTiAodGltZSBpbiBzZWNvbmRzKSAqLwotCQlpZiAoICpwICE9ICdcMCcgfHwgdmFsID49ICh1bnNpZ25lZCBpbnQpLTEpIHsKLQkJCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBiYWQgdmFsdWUgJXMiLCBhcmcpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJKmNvbW1pdF9tYXhfYWdlID0gKHVuc2lnbmVkIGludCl2YWw7Ci0JfQotCi0JaWYgKCBjID09ICd3JyApIHsKLQkJY2hhciAqcD1OVUxMOwotCQlpbnQgdmFsID0gc2ltcGxlX3N0cnRvdWwgKGFyZywgJnAsIDApOwotCi0JCWlmICggKnAgIT0gJ1wwJykgewotCQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IG5vbi1udW1lcmljIHZhbHVlICVzIGZvciBub2xhcmdlaW8gb3B0aW9uIiwgYXJnKTsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JCWlmICggdmFsICkgCi0JCSAgICByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSBQQUdFX1NJWkU7Ci0JCWVsc2UKLQkJICAgIHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZSA9IDEyOCAqIDEwMjQ7Ci0JfQotCi0JaWYgKGMgPT0gJ2onKSB7Ci0JICAgIGlmIChhcmcgJiYgKmFyZyAmJiBqZGV2X25hbWUpIHsKLQkJaWYgKCAqamRldl9uYW1lICkgeyAvL0htLCBhbHJlYWR5IGFzc2lnbmVkPwotCQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWwgZGV2aWNlIHdhcyBhbHJlYWR5ICBzcGVjaWZpZWQgdG8gYmUgJXMiLCAqamRldl9uYW1lKTsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JCSpqZGV2X25hbWUgPSBhcmc7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBDT05GSUdfUVVPVEEKLQlpZiAoYyA9PSAndScgfHwgYyA9PSAnZycpIHsKLQkgICAgaW50IHF0eXBlID0gYyA9PSAndScgPyBVU1JRVU9UQSA6IEdSUFFVT1RBOwotCi0JICAgIGlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzKSkgewotCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBjYW5ub3QgY2hhbmdlIGpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbi4iKTsKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgICAgaWYgKCphcmcpIHsJLyogU29tZSBmaWxlbmFtZSBzcGVjaWZpZWQ/ICovCi0JICAgICAgICBpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdICYmIHN0cmNtcChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0sIGFyZykpIHsKLQkJICAgIHJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6ICVzIHF1b3RhIGZpbGUgYWxyZWFkeSBzcGVjaWZpZWQuIiwgUVRZUEUyTkFNRShxdHlwZSkpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHN0cmNocihhcmcsICcvJykpIHsKLQkJICAgIHJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IHF1b3RhZmlsZSBtdXN0IGJlIG9uIGZpbGVzeXN0ZW0gcm9vdC4iKTsKLQkJICAgIHJldHVybiAwOwotCQl9Ci0JICAgIAlSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0gPSBrbWFsbG9jKHN0cmxlbihhcmcpKzEsIEdGUF9LRVJORUwpOwotCQlpZiAoIVJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSkgewotCQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogbm90IGVub3VnaCBtZW1vcnkgZm9yIHN0b3JpbmcgcXVvdGFmaWxlIG5hbWUuIik7Ci0JCSAgICByZXR1cm4gMDsKLQkJfQotCQlzdHJjcHkoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdLCBhcmcpOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCSAgICBrZnJlZShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pOwotCQkgICAgUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JfQotCWlmIChjID09ICdmJykgewotCSAgICBpZiAoIXN0cmNtcChhcmcsICJ2ZnNvbGQiKSkKLQkJUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX09MRDsKLQkgICAgZWxzZSBpZiAoIXN0cmNtcChhcmcsICJ2ZnN2MCIpKQotCQlSRUlTRVJGU19TQihzKS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfVjA7Ci0JICAgIGVsc2UgewotCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiB1bmtub3duIHF1b3RhIGZvcm1hdCBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JfQotI2Vsc2UKLQlpZiAoYyA9PSAndScgfHwgYyA9PSAnZycgfHwgYyA9PSAnZicpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQuIik7Ci0JICAgIHJldHVybiAwOwotCX0KLSNlbmRpZgotICAgIH0KLSAgICAKLSNpZmRlZiBDT05GSUdfUVVPVEEKLSAgICBpZiAoIVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgJiYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fCBSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pKSB7Ci0JcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogam91cm5hbGxlZCBxdW90YSBmb3JtYXQgbm90IHNwZWNpZmllZC4iKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgc3dpdGNoX2RhdGFfbW9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgbW9kZSkgewotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KCgxIDw8IFJFSVNFUkZTX0RBVEFfTE9HKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQpIHwKLQkJCQkgICAgICAgKDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spKTsKLSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgbW9kZSk7CitzdGF0aWMgdm9pZCBzd2l0Y2hfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBtb2RlKQoreworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+KCgxIDw8IFJFSVNFUkZTX0RBVEFfTE9HKSB8CisJCQkJCSAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQpIHwKKwkJCQkJICgxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKSk7CisJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IG1vZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBtb3VudF9vcHRpb25zKQogewotICAgIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpKSB7Ci0gICAgICAgIGlmICghcmVpc2VyZnNfZGF0YV9sb2cocykpIHsKLQkgICAgc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX0xPRyk7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJzd2l0Y2hpbmcgdG8gam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisJaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX0xPRykpIHsKKwkJaWYgKCFyZWlzZXJmc19kYXRhX2xvZyhzKSkgeworCQkJc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX0xPRyk7CisJCQlyZWlzZXJmc19pbmZvKHMsICJzd2l0Y2hpbmcgdG8gam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisJCX0KKwl9IGVsc2UgaWYgKG1vdW50X29wdGlvbnMgJiAoMSA8PCBSRUlTRVJGU19EQVRBX09SREVSRUQpKSB7CisJCWlmICghcmVpc2VyZnNfZGF0YV9vcmRlcmVkKHMpKSB7CisJCQlzd2l0Y2hfZGF0YV9tb2RlKHMsIFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7CisJCQlyZWlzZXJmc19pbmZvKHMsICJzd2l0Y2hpbmcgdG8gb3JkZXJlZCBkYXRhIG1vZGVcbiIpOworCQl9CisJfSBlbHNlIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spKSB7CisJCWlmICghcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpIHsKKwkJCXN3aXRjaF9kYXRhX21vZGUocywgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spOworCQkJcmVpc2VyZnNfaW5mbyhzLCAic3dpdGNoaW5nIHRvIHdyaXRlYmFjayBkYXRhIG1vZGVcbiIpOworCQl9CiAJfQotICAgIH0gZWxzZSBpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkpIHsKLSAgICAgICAgaWYgKCFyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKLQkgICAgc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX09SREVSRUQpOwotCSAgICByZWlzZXJmc19pbmZvIChzLCAic3dpdGNoaW5nIHRvIG9yZGVyZWQgZGF0YSBtb2RlXG4iKTsKLQl9Ci0gICAgfSBlbHNlIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spKSB7Ci0gICAgICAgIGlmICghcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpIHsKLQkgICAgc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyk7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJzd2l0Y2hpbmcgdG8gd3JpdGViYWNrIGRhdGEgbW9kZVxuIik7Ci0JfQotICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaGFuZGxlX2JhcnJpZXJfbW9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgYml0cykgewotICAgIGludCBmbHVzaCA9ICgxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gpOwotICAgIGludCBub25lID0gKDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FKTsKLSAgICBpbnQgYWxsX2JhcnJpZXIgPSBmbHVzaCB8IG5vbmU7Ci0KLSAgICBpZiAoYml0cyAmIGFsbF9iYXJyaWVyKSB7Ci0gICAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+YWxsX2JhcnJpZXI7Ci0JaWYgKGJpdHMgJiBmbHVzaCkgewotCSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gZmx1c2g7Ci0JICAgIHByaW50aygicmVpc2VyZnM6IGVuYWJsaW5nIHdyaXRlIGJhcnJpZXIgZmx1c2ggbW9kZVxuIik7Ci0JfSBlbHNlIGlmIChiaXRzICYgbm9uZSkgewotCSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gbm9uZTsKLQkgICAgcHJpbnRrKCJyZWlzZXJmczogd3JpdGUgYmFycmllcnMgdHVybmVkIG9mZlxuIik7Ci0JfQotICAgfQotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfYXR0cnMoIHN0cnVjdCBzdXBlcl9ibG9jayAqcyApCitzdGF0aWMgdm9pZCBoYW5kbGVfYmFycmllcl9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBiaXRzKQogewotCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOworCWludCBmbHVzaCA9ICgxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gpOworCWludCBub25lID0gKDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FKTsKKwlpbnQgYWxsX2JhcnJpZXIgPSBmbHVzaCB8IG5vbmU7CiAKLQlpZiggcmVpc2VyZnNfYXR0cnMoIHMgKSApIHsKLQkJcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLQkJaWYoIG9sZF9mb3JtYXRfb25seShzKSApIHsKLQkJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzOiBjYW5ub3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIG9uIDMuNS54IGRpc2sgZm9ybWF0IiApOwotCQkJUkVJU0VSRlNfU0IocykgLT4gc19tb3VudF9vcHQgJj0gfiAoIDEgPDwgUkVJU0VSRlNfQVRUUlMgKTsKKwlpZiAoYml0cyAmIGFsbF9iYXJyaWVyKSB7CisJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+YWxsX2JhcnJpZXI7CisJCWlmIChiaXRzICYgZmx1c2gpIHsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBmbHVzaDsKKwkJCXByaW50aygicmVpc2VyZnM6IGVuYWJsaW5nIHdyaXRlIGJhcnJpZXIgZmx1c2ggbW9kZVxuIik7CisJCX0gZWxzZSBpZiAoYml0cyAmIG5vbmUpIHsKKwkJCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSBub25lOworCQkJcHJpbnRrKCJyZWlzZXJmczogd3JpdGUgYmFycmllcnMgdHVybmVkIG9mZlxuIik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9hdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisKKwlpZiAocmVpc2VyZnNfYXR0cnMocykpIHsKKwkJaWYgKG9sZF9mb3JtYXRfb25seShzKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlaXNlcmZzOiBjYW5ub3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIG9uIDMuNS54IGRpc2sgZm9ybWF0Iik7CisJCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfigxIDw8IFJFSVNFUkZTX0FUVFJTKTsKIAkJCXJldHVybjsKIAkJfQotCQlpZiggISggbGUzMl90b19jcHUoIHJzIC0+IHNfZmxhZ3MgKSAmIHJlaXNlcmZzX2F0dHJzX2NsZWFyZWQgKSApIHsKLQkJCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHN1cHBvcnQgYXR0cmlidXRlcyB1bnRpbCBmbGFnIGlzIHNldCBpbiBzdXBlci1ibG9jayIgKTsKLQkJCQlSRUlTRVJGU19TQihzKSAtPiBzX21vdW50X29wdCAmPSB+ICggMSA8PCBSRUlTRVJGU19BVFRSUyApOworCQlpZiAoIShsZTMyX3RvX2NwdShycy0+c19mbGFncykgJiByZWlzZXJmc19hdHRyc19jbGVhcmVkKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlaXNlcmZzOiBjYW5ub3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIHVudGlsIGZsYWcgaXMgc2V0IGluIHN1cGVyLWJsb2NrIik7CisJCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfigxIDw8IFJFSVNFUkZTX0FUVFJTKTsKIAkJfQorCX0gZWxzZSBpZiAobGUzMl90b19jcHUocnMtPnNfZmxhZ3MpICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCkgeworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gUkVJU0VSRlNfQVRUUlM7CiAJfQogfQogCi1zdGF0aWMgaW50IHJlaXNlcmZzX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCAqIG1vdW50X2ZsYWdzLCBjaGFyICogYXJnKQorc3RhdGljIGludCByZWlzZXJmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50ICptb3VudF9mbGFncywgY2hhciAqYXJnKQogewotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiByczsKLSAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gIHVuc2lnbmVkIGxvbmcgYmxvY2tzOwotICB1bnNpZ25lZCBsb25nIG1vdW50X29wdGlvbnMgPSBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQ7Ci0gIHVuc2lnbmVkIGxvbmcgc2FmZV9tYXNrID0gMDsKLSAgdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlID0gKHVuc2lnbmVkIGludCktMTsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOwotICBpbnQgZXJyOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrczsKKwl1bnNpZ25lZCBsb25nIG1vdW50X29wdGlvbnMgPSBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQ7CisJdW5zaWduZWQgbG9uZyBzYWZlX21hc2sgPSAwOworCXVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9ICh1bnNpZ25lZCBpbnQpLTE7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworCWludCBlcnI7CiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gIGludCBpOworCWludCBpOwogI2VuZGlmCiAKLSAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CiAKLSAgaWYgKCFyZWlzZXJmc19wYXJzZV9vcHRpb25zKHMsIGFyZywgJm1vdW50X29wdGlvbnMsICZibG9ja3MsIE5VTEwsICZjb21taXRfbWF4X2FnZSkpIHsKKwlpZiAoIXJlaXNlcmZzX3BhcnNlX29wdGlvbnMKKwkgICAgKHMsIGFyZywgJm1vdW50X29wdGlvbnMsICZibG9ja3MsIE5VTEwsICZjb21taXRfbWF4X2FnZSkpIHsKICNpZmRlZiBDT05GSUdfUVVPVEEKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCi0JaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKSB7Ci0JICAgIGtmcmVlKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKTsKLQkgICAgUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0gPSBOVUxMOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCQlpZiAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0pIHsKKwkJCQlrZnJlZShSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSk7CisJCQkJUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0gPSBOVUxMOworCQkJfQorI2VuZGlmCisJCXJldHVybiAtRUlOVkFMOwogCX0KLSNlbmRpZgotICAgIHJldHVybiAtRUlOVkFMOwotICB9Ci0gIAotICBoYW5kbGVfYXR0cnMocyk7CiAKLSAgLyogQWRkIG9wdGlvbnMgdGhhdCBhcmUgc2FmZSBoZXJlICovCi0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1NNQUxMVEFJTDsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19OT19CT1JERVI7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX1VOSEFTSEVEX1JFTE9DQVRJT047Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19URVNUNDsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQVRUUlM7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1hBVFRSU19VU0VSOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19QT1NJWEFDTDsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSDsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FOwotICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19FUlJPUl9STzsKLSAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUU7Ci0gIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDOworCWhhbmRsZV9hdHRycyhzKTsKIAotICAvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKLSAgICogdGhlIGJpdHMgd2UncmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGhlcmUgKi8KLSAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ID0gKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgIChtb3VudF9vcHRpb25zICYgc2FmZV9tYXNrKTsKKwkvKiBBZGQgb3B0aW9ucyB0aGF0IGFyZSBzYWZlIGhlcmUgKi8KKwlzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19TTUFMTFRBSUw7CisJc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX0JPUkRFUjsKKwlzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1RFU1Q0OworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0FUVFJTOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1hBVFRSU19VU0VSOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1BPU0lYQUNMOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0g7CisJc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1JPOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDOworCXNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1FVT1RBOwogCi0gIGlmKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgewotICAgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKLSAgfQotICBlbHNlIGlmKGNvbW1pdF9tYXhfYWdlID09IDApCi0gIHsKLSAgICAvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCi0gICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGpvdXJuYWwtPmpfZGVmYXVsdF9tYXhfY29tbWl0X2FnZTsKLSAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7Ci0gIH0KKwkvKiBVcGRhdGUgdGhlIGJpdG1hc2ssIHRha2luZyBjYXJlIHRvIGtlZXAKKwkgKiB0aGUgYml0cyB3ZSdyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgaGVyZSAqLworCVJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCA9CisJICAgIChSRUlTRVJGU19TQihzKS0+CisJICAgICBzX21vdW50X29wdCAmIH5zYWZlX21hc2spIHwgKG1vdW50X29wdGlvbnMgJiBzYWZlX21hc2spOwogCi0gIGlmKGJsb2NrcykgewotICAgIGludCByYyA9IHJlaXNlcmZzX3Jlc2l6ZShzLCBibG9ja3MpOwotICAgIGlmIChyYyAhPSAwKQotICAgICAgcmV0dXJuIHJjOwotICB9CisJaWYgKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgeworCQlqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7CisJCWpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IGNvbW1pdF9tYXhfYWdlOworCX0gZWxzZSBpZiAoY29tbWl0X21heF9hZ2UgPT0gMCkgeworCQkvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCisJCWpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2U7CisJCWpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSA9IEpPVVJOQUxfTUFYX1RSQU5TX0FHRTsKKwl9CiAKLSAgaWYgKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkgewotICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0gICAgLyogcmVtb3VudCByZWFkLW9ubHkgKi8KLSAgICBpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkKLSAgICAgIC8qIGl0IGlzIHJlYWQtb25seSBhbHJlYWR5ICovCi0gICAgICByZXR1cm4gMDsKLSAgICAvKiB0cnkgdG8gcmVtb3VudCBmaWxlIHN5c3RlbSB3aXRoIHJlYWQtb25seSBwZXJtaXNzaW9ucyAqLwotICAgIGlmIChzYl91bW91bnRfc3RhdGUocnMpID09IFJFSVNFUkZTX1ZBTElEX0ZTIHx8IFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICE9IFJFSVNFUkZTX1ZBTElEX0ZTKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisJaWYgKGJsb2NrcykgeworCQlpbnQgcmMgPSByZWlzZXJmc19yZXNpemUocywgYmxvY2tzKTsKKwkJaWYgKHJjICE9IDApCisJCQlyZXR1cm4gcmM7CisJfQogCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7Ci0gICAgaWYgKGVycikKLSAgICAgICAgcmV0dXJuIGVycjsKKwlpZiAoKm1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXJlaXNlcmZzX3hhdHRyX2luaXQocywgKm1vdW50X2ZsYWdzKTsKKwkJLyogcmVtb3VudCByZWFkLW9ubHkgKi8KKwkJaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCQkvKiBpdCBpcyByZWFkLW9ubHkgYWxyZWFkeSAqLworCQkJcmV0dXJuIDA7CisJCS8qIHRyeSB0byByZW1vdW50IGZpbGUgc3lzdGVtIHdpdGggcmVhZC1vbmx5IHBlcm1pc3Npb25zICovCisJCWlmIChzYl91bW91bnRfc3RhdGUocnMpID09IFJFSVNFUkZTX1ZBTElEX0ZTCisJCSAgICB8fCBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSAhPSBSRUlTRVJGU19WQUxJRF9GUykgeworCQkJcmV0dXJuIDA7CisJCX0KIAotICAgIC8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KLSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7Ci0gICAgc2V0X3NiX3Vtb3VudF9zdGF0ZSggcnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7Ci0gICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKLSAgfSBlbHNlIHsKLSAgICAvKiByZW1vdW50IHJlYWQtd3JpdGUgKi8KLSAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCXJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0JcmV0dXJuIDA7IC8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KLSAgICB9CisJCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0gICAgaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCi0JcmV0dXJuIGpvdXJuYWwtPmpfZXJybm87CisJCS8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7CisJCXNldF9zYl91bW91bnRfc3RhdGUocnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCX0gZWxzZSB7CisJCS8qIHJlbW91bnQgcmVhZC13cml0ZSAqLworCQlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJcmVpc2VyZnNfeGF0dHJfaW5pdChzLCAqbW91bnRfZmxhZ3MpOworCQkJcmV0dXJuIDA7CS8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KKwkJfQogCi0gICAgaGFuZGxlX2RhdGFfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKLSAgICBoYW5kbGVfYmFycmllcl9tb2RlKHMsIG1vdW50X29wdGlvbnMpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlID0gc2JfdW1vdW50X3N0YXRlKHJzKSA7Ci0gICAgcy0+c19mbGFncyAmPSB+TVNfUkRPTkxZIDsgLyogbm93IGl0IGlzIHNhZmUgdG8gY2FsbCBqb3VybmFsX2JlZ2luICovCi0gICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7Ci0gICAgaWYgKGVycikKLQlyZXR1cm4gZXJyOwotICAgIAotICAgIC8qIE1vdW50IGEgcGFydGl0aW9uIHdoaWNoIGlzIHJlYWQtb25seSwgcmVhZC13cml0ZSAqLwotICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpIDsKLSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycyk7Ci0gICAgcy0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwotICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOwotICAgIC8qIG1hcmtfYnVmZmVyX2RpcnR5IChTQl9CVUZGRVJfV0lUSF9TQiAocyksIDEpOyAqLwotICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7Ci0gICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBSRUlTRVJGU19WQUxJRF9GUyA7Ci0gIH0KLSAgLyogdGhpcyB3aWxsIGZvcmNlIGEgZnVsbCBmbHVzaCBvZiBhbGwgam91cm5hbCBsaXN0cyAqLwotICBTQl9KT1VSTkFMKHMpLT5qX211c3Rfd2FpdCA9IDEgOwotICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIHMsIDEwKSA7Ci0gIGlmIChlcnIpCi0gICAgcmV0dXJuIGVycjsKLSAgcy0+c19kaXJ0ID0gMDsKKwkJaWYgKHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJCXJldHVybiBqb3VybmFsLT5qX2Vycm5vOwogCi0gIGlmICghKCAqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkgKSApIHsKLSAgICBmaW5pc2hfdW5maW5pc2hlZCggcyApOwotICAgIHJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7Ci0gIH0KKwkJaGFuZGxlX2RhdGFfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKwkJaGFuZGxlX2JhcnJpZXJfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKwkJUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBzYl91bW91bnRfc3RhdGUocnMpOworCQlzLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CS8qIG5vdyBpdCBpcyBzYWZlIHRvIGNhbGwgam91cm5hbF9iZWdpbiAqLworCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgMTApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotICByZXR1cm4gMDsKKwkJLyogTW91bnQgYSBwYXJ0aXRpb24gd2hpY2ggaXMgcmVhZC1vbmx5LCByZWFkLXdyaXRlICovCisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgU0JfQlVGRkVSX1dJVEhfU0IocyksIDEpOworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycyk7CisJCXMtPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwkJc2V0X3NiX3Vtb3VudF9zdGF0ZShycywgUkVJU0VSRlNfRVJST1JfRlMpOworCQkvKiBtYXJrX2J1ZmZlcl9kaXJ0eSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpLCAxKTsgKi8KKwkJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTOworCX0KKwkvKiB0aGlzIHdpbGwgZm9yY2UgYSBmdWxsIGZsdXNoIG9mIGFsbCBqb3VybmFsIGxpc3RzICovCisJU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMTApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcy0+c19kaXJ0ID0gMDsKKworCWlmICghKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJZmluaXNoX3VuZmluaXNoZWQocyk7CisJCXJlaXNlcmZzX3hhdHRyX2luaXQocywgKm1vdW50X2ZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyogbG9hZF9iaXRtYXBfaW5mb19kYXRhIC0gU2V0cyB1cCB0aGUgcmVpc2VyZnNfYml0bWFwX2luZm8gc3RydWN0dXJlIGZyb20gZGlzay4KQEAgLTEyMDQsNzMxICsxMjg1LDgyOSBAQAogICogZnJlZSBibG9ja3MgYXQgYWxsLgogICovCiAKLXN0YXRpYyB2b2lkIGxvYWRfYml0bWFwX2luZm9fZGF0YSAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSkKK3N0YXRpYyB2b2lkIGxvYWRfYml0bWFwX2luZm9fZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaSkKIHsKLSAgICB1bnNpZ25lZCBsb25nICpjdXIgPSAodW5zaWduZWQgbG9uZyAqKWJpLT5iaC0+Yl9kYXRhOworCXVuc2lnbmVkIGxvbmcgKmN1ciA9ICh1bnNpZ25lZCBsb25nICopYmktPmJoLT5iX2RhdGE7CiAKLSAgICB3aGlsZSAoKGNoYXIgKiljdXIgPCAoYmktPmJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpKSB7CisJd2hpbGUgKChjaGFyICopY3VyIDwgKGJpLT5iaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKSkgewogCi0JLyogTm8gbmVlZCB0byBzY2FuIGlmIGFsbCAwJ3Mgb3IgYWxsIDEncy4KLQkgKiBTaW5jZSB3ZSdyZSBvbmx5IGNvdW50aW5nIDAncywgd2UgY2FuIHNpbXBseSBpZ25vcmUgYWxsIDEncyAqLwotCWlmICgqY3VyID09IDApIHsKLQkgICAgaWYgKGJpLT5maXJzdF96ZXJvX2hpbnQgPT0gMCkgewotCQliaS0+Zmlyc3RfemVyb19oaW50ID0gKChjaGFyICopY3VyIC0gYmktPmJoLT5iX2RhdGEpIDw8IDM7Ci0JICAgIH0KLQkgICAgYmktPmZyZWVfY291bnQgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjg7Ci0JfSBlbHNlIGlmICgqY3VyICE9IH4wTCkgewotCSAgICBpbnQgYjsKLQkgICAgZm9yIChiID0gMDsgYiA8IHNpemVvZih1bnNpZ25lZCBsb25nKSo4OyBiKyspIHsKLQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdCAoYiwgY3VyKSkgewotCQkgICAgYmktPmZyZWVfY291bnQgKys7Ci0JCSAgICBpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKQotCQkJYmktPmZpcnN0X3plcm9faGludCA9Ci0JCQkJCSgoKGNoYXIgKiljdXIgLSBiaS0+YmgtPmJfZGF0YSkgPDwgMykgKyBiOwotCQkgICAgfQorCQkvKiBObyBuZWVkIHRvIHNjYW4gaWYgYWxsIDAncyBvciBhbGwgMSdzLgorCQkgKiBTaW5jZSB3ZSdyZSBvbmx5IGNvdW50aW5nIDAncywgd2UgY2FuIHNpbXBseSBpZ25vcmUgYWxsIDEncyAqLworCQlpZiAoKmN1ciA9PSAwKSB7CisJCQlpZiAoYmktPmZpcnN0X3plcm9faGludCA9PSAwKSB7CisJCQkJYmktPmZpcnN0X3plcm9faGludCA9CisJCQkJICAgICgoY2hhciAqKWN1ciAtIGJpLT5iaC0+Yl9kYXRhKSA8PCAzOworCQkJfQorCQkJYmktPmZyZWVfY291bnQgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogODsKKwkJfSBlbHNlIGlmICgqY3VyICE9IH4wTCkgeworCQkJaW50IGI7CisJCQlmb3IgKGIgPSAwOyBiIDwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogODsgYisrKSB7CisJCQkJaWYgKCFyZWlzZXJmc190ZXN0X2xlX2JpdChiLCBjdXIpKSB7CisJCQkJCWJpLT5mcmVlX2NvdW50Kys7CisJCQkJCWlmIChiaS0+Zmlyc3RfemVyb19oaW50ID09IDApCisJCQkJCQliaS0+Zmlyc3RfemVyb19oaW50ID0KKwkJCQkJCSAgICAoKChjaGFyICopY3VyIC0KKwkJCQkJCSAgICAgIGJpLT5iaC0+Yl9kYXRhKSA8PCAzKSArIGI7CisJCQkJfQorCQkJfQogCQl9Ci0JICAgIH0KLQljdXIgKys7Ci0gICAgfQorCQljdXIrKzsKKwl9CiAKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKIC8vIFRoaXMgb3V0cHV0cyBhIGxvdCBvZiB1bm5lZGVkIGluZm8gb24gYmlnIEZTZXMKIC8vICAgIHJlaXNlcmZzX3dhcm5pbmcgKCJiaXRtYXAgbG9hZGVkIGZyb20gYmxvY2sgJWQ6ICVkIGZyZWUgYmxvY2tzIiwKLS8vCQkgICAgICBiaS0+YmgtPmJfYmxvY2tuciwgYmktPmZyZWVfY291bnQpOworLy8gICAgICAgICAgICAgICAgICAgIGJpLT5iaC0+Yl9ibG9ja25yLCBiaS0+ZnJlZV9jb3VudCk7CiAjZW5kaWYKIH0KLSAgCi1zdGF0aWMgaW50IHJlYWRfYml0bWFwcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKLXsKLSAgICBpbnQgaSwgYm1hcF9ucjsKIAotICAgIFNCX0FQX0JJVE1BUCAocykgPSB2bWFsbG9jIChzaXplb2YgKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKLSAgICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQotCXJldHVybiAxOwotICAgIG1lbXNldCAoU0JfQVBfQklUTUFQIChzKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogU0JfQk1BUF9OUihzKSk7Ci0gICAgZm9yIChpID0gMCwgYm1hcF9uciA9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOwotCSBpIDwgU0JfQk1BUF9OUihzKTsgaSsrLCBibWFwX25yID0gcy0+c19ibG9ja3NpemUgKiA4ICogaSkgewotCVNCX0FQX0JJVE1BUCAocylbaV0uYmggPSBzYl9nZXRibGsocywgYm1hcF9ucik7Ci0JaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkKLQkgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKLQl3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKTsKLQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcocywic2gtMjAyOTogcmVpc2VyZnMgcmVhZF9iaXRtYXBzOiAiCi0JCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAotCQkJIFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKLQkJYnJlbHNlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7Ci0JICAgIHZmcmVlKFNCX0FQX0JJVE1BUChzKSk7Ci0JICAgIFNCX0FQX0JJVE1BUChzKSA9IE5VTEw7Ci0JICAgIHJldHVybiAxOworc3RhdGljIGludCByZWFkX2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCWludCBpLCBibWFwX25yOworCisJU0JfQVBfQklUTUFQKHMpID0KKwkgICAgdm1hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvKSAqIFNCX0JNQVBfTlIocykpOworCWlmIChTQl9BUF9CSVRNQVAocykgPT0gMCkKKwkJcmV0dXJuIDE7CisJbWVtc2V0KFNCX0FQX0JJVE1BUChzKSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKKwlmb3IgKGkgPSAwLCBibWFwX25yID0KKwkgICAgIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOworCSAgICAgaSA8IFNCX0JNQVBfTlIocyk7IGkrKywgYm1hcF9uciA9IHMtPnNfYmxvY2tzaXplICogOCAqIGkpIHsKKwkJU0JfQVBfQklUTUFQKHMpW2ldLmJoID0gc2JfZ2V0YmxrKHMsIGJtYXBfbnIpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKQorCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CiAJfQotCWxvYWRfYml0bWFwX2luZm9fZGF0YSAocywgU0JfQVBfQklUTUFQIChzKSArIGkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUihzKTsgaSsrKSB7CisJCXdhaXRfb25fYnVmZmVyKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgInNoLTIwMjk6IHJlaXNlcmZzIHJlYWRfYml0bWFwczogIgorCQkJCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAorCQkJCQkgU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpOworCQkJZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJCQlicmVsc2UoU0JfQVBfQklUTUFQKHMpW2ldLmJoKTsKKwkJCXZmcmVlKFNCX0FQX0JJVE1BUChzKSk7CisJCQlTQl9BUF9CSVRNQVAocykgPSBOVUxMOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbG9hZF9iaXRtYXBfaW5mb19kYXRhKHMsIFNCX0FQX0JJVE1BUChzKSArIGkpOworCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkX29sZF9iaXRtYXBzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGludCByZWFkX29sZF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgaW50IGkgOwotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7Ci0gIGludCBibXAxID0gKFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHMtPnNfYmxvY2tzaXplKSArIDE7ICAvKiBmaXJzdCBvZiBiaXRtYXAgYmxvY2tzICovCisJaW50IGk7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJaW50IGJtcDEgPSAoUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUpICsgMTsJLyogZmlyc3Qgb2YgYml0bWFwIGJsb2NrcyAqLwogCi0gIC8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KLSAgU0JfQVBfQklUTUFQIChzKSA9IHZtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOwotICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQotICAgIHJldHVybiAxOworCS8qIHJlYWQgdHJ1ZSBiaXRtYXAgKi8KKwlTQl9BUF9CSVRNQVAocykgPQorCSAgICB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CisJaWYgKFNCX0FQX0JJVE1BUChzKSA9PSAwKQorCQlyZXR1cm4gMTsKIAotICBtZW1zZXQgKFNCX0FQX0JJVE1BUCAocyksIDAsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2J1ZmZlcl9pbmZvICopICogc2JfYm1hcF9ucihycykpOworCW1lbXNldChTQl9BUF9CSVRNQVAocyksIDAsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CiAKLSAgZm9yIChpID0gMDsgaSA8IHNiX2JtYXBfbnIocnMpOyBpICsrKSB7Ci0gICAgU0JfQVBfQklUTUFQIChzKVtpXS5iaCA9IHNiX2JyZWFkIChzLCBibXAxICsgaSk7Ci0gICAgaWYgKCFTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKQotICAgICAgcmV0dXJuIDE7Ci0gICAgbG9hZF9iaXRtYXBfaW5mb19kYXRhIChzLCBTQl9BUF9CSVRNQVAgKHMpICsgaSk7Ci0gIH0KKwlmb3IgKGkgPSAwOyBpIDwgc2JfYm1hcF9ucihycyk7IGkrKykgeworCQlTQl9BUF9CSVRNQVAocylbaV0uYmggPSBzYl9icmVhZChzLCBibXAxICsgaSk7CisJCWlmICghU0JfQVBfQklUTUFQKHMpW2ldLmJoKQorCQkJcmV0dXJuIDE7CisJCWxvYWRfYml0bWFwX2luZm9fZGF0YShzLCBTQl9BUF9CSVRNQVAocykgKyBpKTsKKwl9CiAKLSAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9zdXBlcl9ibG9jayAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50IG9mZnNldCkKK3N0YXRpYyBpbnQgcmVhZF9zdXBlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBvZmZzZXQpCiB7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7Ci0gICAgaW50IGZzX2Jsb2Nrc2l6ZTsKLSAKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnM7CisJaW50IGZzX2Jsb2Nrc2l6ZTsKIAotICAgIGJoID0gc2JfYnJlYWQgKHMsIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplKTsKLSAgICBpZiAoIWJoKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAwNjogcmVhZF9zdXBlcl9ibG9jazogIgotICAgICAgICAgICAgICAiYnJlYWQgZmFpbGVkIChkZXYgJXMsIGJsb2NrICVsdSwgc2l6ZSAlbHUpIiwKLSAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwgcy0+c19ibG9ja3NpemUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotIAotICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7Ci0gICAgaWYgKCFpc19hbnlfcmVpc2VyZnNfbWFnaWNfc3RyaW5nIChycykpIHsKLSAgICAgIGJyZWxzZSAoYmgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotIAotICAgIC8vCi0gICAgLy8gb2ssIHJlaXNlcmZzIHNpZ25hdHVyZSAob2xkIG9yIG5ldykgZm91bmQgaW4gYXQgdGhlIGdpdmVuIG9mZnNldAotICAgIC8vICAgIAotICAgIGZzX2Jsb2Nrc2l6ZSA9IHNiX2Jsb2Nrc2l6ZShycyk7Ci0gICAgYnJlbHNlIChiaCk7Ci0gICAgc2Jfc2V0X2Jsb2Nrc2l6ZSAocywgZnNfYmxvY2tzaXplKTsKLSAgICAKLSAgICBiaCA9IHNiX2JyZWFkIChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7Ci0gICAgaWYgKCFiaCkgewotCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCi0gICAgICAgICAgICAgICAgImJyZWFkIGZhaWxlZCAoZGV2ICVzLCBibG9jayAlbHUsIHNpemUgJWx1KVxuIiwKLSAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAocyksIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplLCBzLT5zX2Jsb2Nrc2l6ZSk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotICAgIAotICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7Ci0gICAgaWYgKHNiX2Jsb2Nrc2l6ZShycykgIT0gcy0+c19ibG9ja3NpemUpIHsKLQlyZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAxMTogcmVhZF9zdXBlcl9ibG9jazogIgotCQkiY2FuJ3QgZmluZCBhIHJlaXNlcmZzIGZpbGVzeXN0ZW0gb24gKGRldiAlcywgYmxvY2sgJUx1LCBzaXplICVsdSlcbiIsCi0JCXJlaXNlcmZzX2JkZXZuYW1lIChzKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBzLT5zX2Jsb2Nrc2l6ZSk7Ci0JYnJlbHNlIChiaCk7Ci0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCBycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gY3B1X3RvX2xlMzIoLTEpICkgewotICAgICAgIGJyZWxzZShiaCkgOwotICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJVbmZpbmlzaGVkIHJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgcnVuIGRldGVjdGVkLiBQbGVhc2UgcnVuXG4iCi0gICAgICAgICAgICAgICJyZWlzZXJmc2NrIC0tcmVidWlsZC10cmVlIGFuZCB3YWl0IGZvciBhIGNvbXBsZXRpb24uIElmIHRoYXQgZmFpbHNcbiIKLSAgICAgICAgICAgICAgImdldCBuZXdlciByZWlzZXJmc3Byb2dzIHBhY2thZ2UiKTsKLSAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBTQl9CVUZGRVJfV0lUSF9TQiAocykgPSBiaDsKLSAgICBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKSA9IHJzOwotCi0gICAgaWYgKGlzX3JlaXNlcmZzX2pyIChycykpIHsKLQkvKiBtYWdpYyBpcyBvZiBub24tc3RhbmRhcmQgam91cm5hbCBmaWxlc3lzdGVtLCBsb29rIGF0IHNfdmVyc2lvbiB0bwotCSAgIGZpbmQgd2hpY2ggZm9ybWF0IGlzIGluIHVzZSAqLwotCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCi0JICByZWlzZXJmc193YXJuaW5nIChzLCAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCi0JCSAgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7Ci0JZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQotCSAgcmVpc2VyZnNfd2FybmluZyAocywgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgotCQkgICIgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCIpOwotCWVsc2UgewotCSAgcmVpc2VyZnNfd2FybmluZyAocywgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgotCQkJICAgICJmb3JtYXQgXCIldVwiIG9mIHJlaXNlcmZzIHdpdGggbm9uLXN0YW5kYXJkIG1hZ2ljIiwKLQkJCSAgICBzYl92ZXJzaW9uKHJzKSk7Ci0JcmV0dXJuIDE7CisJYmggPSBzYl9icmVhZChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJzaC0yMDA2OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisJCQkJICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSkiLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSwgb2Zmc2V0IC8gcy0+c19ibG9ja3NpemUsCisJCQkJIHMtPnNfYmxvY2tzaXplKTsKKwkJcmV0dXJuIDE7CiAJfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAvKiBzX3ZlcnNpb24gb2Ygc3RhbmRhcmQgZm9ybWF0IG1heSBjb250YWluIGluY29ycmVjdCBpbmZvcm1hdGlvbiwKLQkgc28gd2UganVzdCBsb29rIGF0IHRoZSBtYWdpYyBzdHJpbmcgKi8KLSAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKLQkgICAgICBpc19yZWlzZXJmc18zXzUgKHJzKSA/ICIzLjUiIDogIjMuNiIpOwogCi0gICAgcy0+c19vcCA9ICZyZWlzZXJmc19zb3BzOwotICAgIHMtPnNfZXhwb3J0X29wID0gJnJlaXNlcmZzX2V4cG9ydF9vcHM7CisJcnMgPSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICopYmgtPmJfZGF0YTsKKwlpZiAoIWlzX2FueV9yZWlzZXJmc19tYWdpY19zdHJpbmcocnMpKSB7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKwkvLworCS8vIG9rLCByZWlzZXJmcyBzaWduYXR1cmUgKG9sZCBvciBuZXcpIGZvdW5kIGluIGF0IHRoZSBnaXZlbiBvZmZzZXQKKwkvLyAgICAKKwlmc19ibG9ja3NpemUgPSBzYl9ibG9ja3NpemUocnMpOworCWJyZWxzZShiaCk7CisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBmc19ibG9ja3NpemUpOworCisJYmggPSBzYl9icmVhZChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlyZWlzZXJmc193YXJuaW5nKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisJCQkJICJicmVhZCBmYWlsZWQgKGRldiAlcywgYmxvY2sgJWx1LCBzaXplICVsdSlcbiIsCisJCQkJIHJlaXNlcmZzX2JkZXZuYW1lKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwKKwkJCQkgcy0+c19ibG9ja3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlycyA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCWlmIChzYl9ibG9ja3NpemUocnMpICE9IHMtPnNfYmxvY2tzaXplKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcocywgInNoLTIwMTE6IHJlYWRfc3VwZXJfYmxvY2s6ICIKKwkJCQkgImNhbid0IGZpbmQgYSByZWlzZXJmcyBmaWxlc3lzdGVtIG9uIChkZXYgJXMsIGJsb2NrICVMdSwgc2l6ZSAlbHUpXG4iLAorCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSwKKwkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLAorCQkJCSBzLT5zX2Jsb2Nrc2l6ZSk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKworCWlmIChycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gY3B1X3RvX2xlMzIoLTEpKSB7CisJCWJyZWxzZShiaCk7CisJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkgIlVuZmluaXNoZWQgcmVpc2VyZnNjayAtLXJlYnVpbGQtdHJlZSBydW4gZGV0ZWN0ZWQuIFBsZWFzZSBydW5cbiIKKwkJCQkgInJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgYW5kIHdhaXQgZm9yIGEgY29tcGxldGlvbi4gSWYgdGhhdCBmYWlsc1xuIgorCQkJCSAiZ2V0IG5ld2VyIHJlaXNlcmZzcHJvZ3MgcGFja2FnZSIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlTQl9CVUZGRVJfV0lUSF9TQihzKSA9IGJoOworCVNCX0RJU0tfU1VQRVJfQkxPQ0socykgPSByczsKKworCWlmIChpc19yZWlzZXJmc19qcihycykpIHsKKwkJLyogbWFnaWMgaXMgb2Ygbm9uLXN0YW5kYXJkIGpvdXJuYWwgZmlsZXN5c3RlbSwgbG9vayBhdCBzX3ZlcnNpb24gdG8KKwkJICAgZmluZCB3aGljaCBmb3JtYXQgaXMgaW4gdXNlICovCisJCWlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzIpCisJCQlyZWlzZXJmc193YXJuaW5nKHMsCisJCQkJCSAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy42XCIiCisJCQkJCSAiIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwiKTsKKwkJZWxzZSBpZiAoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8xKQorCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIjMuNVwiIgorCQkJCQkgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7CisJCWVsc2UgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInNoLTIwMTI6IHJlYWRfc3VwZXJfYmxvY2s6IGZvdW5kIHVua25vd24gIgorCQkJCQkgImZvcm1hdCBcIiV1XCIgb2YgcmVpc2VyZnMgd2l0aCBub24tc3RhbmRhcmQgbWFnaWMiLAorCQkJCQkgc2JfdmVyc2lvbihycykpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UKKwkJLyogc192ZXJzaW9uIG9mIHN0YW5kYXJkIGZvcm1hdCBtYXkgY29udGFpbiBpbmNvcnJlY3QgaW5mb3JtYXRpb24sCisJCSAgIHNvIHdlIGp1c3QgbG9vayBhdCB0aGUgbWFnaWMgc3RyaW5nICovCisJCXJlaXNlcmZzX2luZm8ocywKKwkJCSAgICAgICJmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIlc1wiIHdpdGggc3RhbmRhcmQgam91cm5hbFxuIiwKKwkJCSAgICAgIGlzX3JlaXNlcmZzXzNfNShycykgPyAiMy41IiA6ICIzLjYiKTsKKworCXMtPnNfb3AgPSAmcmVpc2VyZnNfc29wczsKKwlzLT5zX2V4cG9ydF9vcCA9ICZyZWlzZXJmc19leHBvcnRfb3BzOwogI2lmZGVmIENPTkZJR19RVU9UQQotICAgIHMtPnNfcWNvcCA9ICZyZWlzZXJmc19xY3RsX29wZXJhdGlvbnM7Ci0gICAgcy0+ZHFfb3AgPSAmcmVpc2VyZnNfcXVvdGFfb3BlcmF0aW9uczsKKwlzLT5zX3Fjb3AgPSAmcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zOworCXMtPmRxX29wID0gJnJlaXNlcmZzX3F1b3RhX29wZXJhdGlvbnM7CiAjZW5kaWYKIAotICAgIC8qIG5ldyBmb3JtYXQgaXMgbGltaXRlZCBieSB0aGUgMzIgYml0IHdpZGUgaV9ibG9ja3MgZmllbGQsIHdhbnQgdG8KLSAgICAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgotICAgICovCi0gICAgcy0+c19tYXhieXRlcyA9ICg1MTJMTCA8PCAzMikgLSBzLT5zX2Jsb2Nrc2l6ZSA7Ci0gICAgcmV0dXJuIDA7CisJLyogbmV3IGZvcm1hdCBpcyBsaW1pdGVkIGJ5IHRoZSAzMiBiaXQgd2lkZSBpX2Jsb2NrcyBmaWVsZCwgd2FudCB0bworCSAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgorCSAqLworCXMtPnNfbWF4Ynl0ZXMgPSAoNTEyTEwgPDwgMzIpIC0gcy0+c19ibG9ja3NpemU7CisJcmV0dXJuIDA7CiB9CiAKLQotCiAvKiBhZnRlciBqb3VybmFsIHJlcGxheSwgcmVyZWFkIGFsbCBiaXRtYXAgYW5kIHN1cGVyIGJsb2NrcyAqLwotc3RhdGljIGludCByZXJlYWRfbWV0YV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7Ci0gIGludCBpIDsKLSAgbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpIDsKLSAgd2FpdF9vbl9idWZmZXIoU0JfQlVGRkVSX1dJVEhfU0IocykpIDsKLSAgaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQlVGRkVSX1dJVEhfU0IocykpKSB7Ci0gICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyB0aGUgc3VwZXIiKSA7Ci0gICAgcmV0dXJuIDEgOwotICB9CitzdGF0aWMgaW50IHJlcmVhZF9tZXRhX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJaW50IGk7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpOworCXdhaXRfb25fYnVmZmVyKFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9CVUZGRVJfV0lUSF9TQihzKSkpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCSAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIHRoZSBzdXBlciIpOworCQlyZXR1cm4gMTsKKwl9CiAKLSAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocykgOyBpKyspIHsKLSAgICBsbF9yd19ibG9jayhSRUFELCAxLCAmKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIDsKLSAgICB3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAocylbaV0uYmgpIDsKLSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7Ci0gICAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIGJpdG1hcCBibG9jayBudW1iZXIgJWQgYXQgJWxsdSIsCi0gICAgICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpIDsKLSAgICAgIHJldHVybiAxIDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDAgOworCWZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKKwkJbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9BUF9CSVRNQVAocylbaV0uYmgpKTsKKwkJd2FpdF9vbl9idWZmZXIoU0JfQVBfQklUTUFQKHMpW2ldLmJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLAorCQkJCQkgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyBiaXRtYXAgYmxvY2sgbnVtYmVyICVkIGF0ICVsbHUiLAorCQkJCQkgaSwKKwkJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLgorCQkJCQkgYmgtPmJfYmxvY2tucik7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKIAogfQogCi0KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAvLyBoYXNoIGRldGVjdGlvbiBzdHVmZgogCi0KIC8vIGlmIHJvb3QgZGlyZWN0b3J5IGlzIGVtcHR5IC0gd2Ugc2V0IGRlZmF1bHQgLSBZdXJhJ3MgLSBoYXNoIGFuZAogLy8gd2FybiBhYm91dCBpdAogLy8gRklYTUU6IHdlIGxvb2sgZm9yIG9ubHkgb25lIG5hbWUgaW4gYSBkaXJlY3RvcnkuIElmIHRlYSBhbmQgeXVyYQogLy8gYml0aCBoYXZlIHRoZSBzYW1lIHZhbHVlIC0gd2UgYXNrIHVzZXIgdG8gc2VuZCByZXBvcnQgdG8gdGhlCiAvLyBtYWlsaW5nIGxpc3QKLXN0YXRpYyBfX3UzMiBmaW5kX2hhc2hfb3V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIF9fdTMyIGZpbmRfaGFzaF9vdXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewotICAgIGludCByZXR2YWw7Ci0gICAgc3RydWN0IGlub2RlICogaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkga2V5OwotICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKLSAgICBfX3UzMiBoYXNoID0gREVGQVVMVF9IQVNIOworCWludCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CisJSU5JVElBTElaRV9QQVRIKHBhdGgpOworCXN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJX191MzIgaGFzaCA9IERFRkFVTFRfSEFTSDsKIAotICAgIGlub2RlID0gcy0+c19yb290LT5kX2lub2RlOworCWlub2RlID0gcy0+c19yb290LT5kX2lub2RlOwogCi0gICAgZG8geyAvLyBTb21lIHNlcmlvdXMgImdvdG8iLWhhdGVyIHdhcyB0aGVyZSA7KQotCXUzMiB0ZWFoYXNoLCByNWhhc2gsIHl1cmFoYXNoOworCWRvIHsJCQkvLyBTb21lIHNlcmlvdXMgImdvdG8iLWhhdGVyIHdhcyB0aGVyZSA7KQorCQl1MzIgdGVhaGFzaCwgcjVoYXNoLCB5dXJhaGFzaDsKIAotCW1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKLQlyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChzLCAma2V5LCAmcGF0aCwgJmRlKTsKLQlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7Ci0JICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotCSAgICByZXR1cm4gVU5TRVRfSEFTSCA7Ci0JfQotCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCi0JICAgIGRlLmRlX2VudHJ5X251bSAtLTsKLQlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoJmRlKTsKLQlpZiAoZGVoX29mZnNldCggJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkgKSA9PSBET1RfRE9UX09GRlNFVCkgewotCSAgICAvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KLQkgICAgaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSkgewotCQloYXNoID0gWVVSQV9IQVNIIDsKLQkgICAgfQotCSAgICByZWlzZXJmc193YXJuaW5nKHMsIkZTIHNlZW1zIHRvIGJlIGVtcHR5LCBhdXRvZGV0ZWN0ICIKLQkgICAgICAgICAgICAgICAgICAgICAiaXMgdXNpbmcgdGhlIGRlZmF1bHQgaGFzaCIpOwotCSAgICBicmVhazsKLQl9Ci0JcjVoYXNoPUdFVF9IQVNIX1ZBTFVFIChyNV9oYXNoIChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7Ci0JdGVhaGFzaD1HRVRfSEFTSF9WQUxVRSAoa2V5ZWRfaGFzaCAoZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOwotCXl1cmFoYXNoPUdFVF9IQVNIX1ZBTFVFICh5dXJhX2hhc2ggKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKLQlpZiAoICggKHRlYWhhc2ggPT0gcjVoYXNoKSAmJiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpICkgfHwKLQkgICAgICggKHRlYWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApIHx8Ci0JICAgICAoIChyNWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApICkgewotCSAgICByZWlzZXJmc193YXJuaW5nKHMsIlVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBoYXNoIGZ1bmN0aW9uLiAiCi0JCQkgICAgICJQbGVhc2UgbW91bnQgd2l0aCAtbyBoYXNoPXt0ZWEscnVwYXNvdixyNX0iLAotCQkJICAgICByZWlzZXJmc19iZGV2bmFtZSAocykpOwotCSAgICBoYXNoID0gVU5TRVRfSEFTSDsKLQkgICAgYnJlYWs7Ci0JfQotCWlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB5dXJhaGFzaCkKLQkgICAgaGFzaCA9IFlVUkFfSEFTSDsKLQllbHNlIGlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB0ZWFoYXNoKQotCSAgICBoYXNoID0gVEVBX0hBU0g7Ci0JZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpICkgPT0gcjVoYXNoKQotCSAgICBoYXNoID0gUjVfSEFTSDsKLQllbHNlIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywiVW5yZWNvZ25pc2VkIGhhc2ggZnVuY3Rpb24iKTsKLQkgICAgaGFzaCA9IFVOU0VUX0hBU0g7Ci0JfQotICAgIH0gd2hpbGUgKDApOworCQltYWtlX2NwdV9rZXkoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkJcmV0dmFsID0gc2VhcmNoX2J5X2VudHJ5X2tleShzLCAma2V5LCAmcGF0aCwgJmRlKTsKKwkJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCQkJcGF0aHJlbHNlKCZwYXRoKTsKKwkJCXJldHVybiBVTlNFVF9IQVNIOworCQl9CisJCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCisJCQlkZS5kZV9lbnRyeV9udW0tLTsKKwkJc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKKwkJaWYgKGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpID09IERPVF9ET1RfT0ZGU0VUKSB7CisJCQkvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KKwkJCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJCQloYXNoID0gWVVSQV9IQVNIOworCQkJfQorCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiRlMgc2VlbXMgdG8gYmUgZW1wdHksIGF1dG9kZXRlY3QgIgorCQkJCQkgImlzIHVzaW5nIHRoZSBkZWZhdWx0IGhhc2giKTsKKwkJCWJyZWFrOworCQl9CisJCXI1aGFzaCA9IEdFVF9IQVNIX1ZBTFVFKHI1X2hhc2goZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOworCQl0ZWFoYXNoID0gR0VUX0hBU0hfVkFMVUUoa2V5ZWRfaGFzaChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7CisJCXl1cmFoYXNoID0gR0VUX0hBU0hfVkFMVUUoeXVyYV9oYXNoKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKKwkJaWYgKCgodGVhaGFzaCA9PSByNWhhc2gpCisJCSAgICAgJiYKKwkJICAgICAoR0VUX0hBU0hfVkFMVUUoZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpCisJCSAgICAgID09IHI1aGFzaCkpIHx8ICgodGVhaGFzaCA9PSB5dXJhaGFzaCkKKwkJCQkgICAgICAmJiAoeXVyYWhhc2ggPT0KKwkJCQkJICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0CisJCQkJCQkJICgmCisJCQkJCQkJICAoZGUuCisJCQkJCQkJICAgZGVfZGVoW2RlLgorCQkJCQkJCQkgIGRlX2VudHJ5X251bV0pKSkpKQorCQkgICAgfHwgKChyNWhhc2ggPT0geXVyYWhhc2gpCisJCQkmJiAoeXVyYWhhc2ggPT0KKwkJCSAgICBHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0CisJCQkJCSAgICgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSkpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJICJVbmFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgaGFzaCBmdW5jdGlvbi4gIgorCQkJCQkgIlBsZWFzZSBtb3VudCB3aXRoIC1vIGhhc2g9e3RlYSxydXBhc292LHI1fSIsCisJCQkJCSByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCQloYXNoID0gVU5TRVRfSEFTSDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChHRVRfSEFTSF9WQUxVRShkZWhfb2Zmc2V0KCYoZGUuZGVfZGVoW2RlLmRlX2VudHJ5X251bV0pKSkgPT0KKwkJICAgIHl1cmFoYXNoKQorCQkJaGFzaCA9IFlVUkFfSEFTSDsKKwkJZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUKKwkJCSAoZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpID09IHRlYWhhc2gpCisJCQloYXNoID0gVEVBX0hBU0g7CisJCWVsc2UgaWYgKEdFVF9IQVNIX1ZBTFVFCisJCQkgKGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpCisJCQloYXNoID0gUjVfSEFTSDsKKwkJZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJVbnJlY29nbmlzZWQgaGFzaCBmdW5jdGlvbiIpOworCQkJaGFzaCA9IFVOU0VUX0hBU0g7CisJCX0KKwl9IHdoaWxlICgwKTsKIAotICAgIHBhdGhyZWxzZSAoJnBhdGgpOwotICAgIHJldHVybiBoYXNoOworCXBhdGhyZWxzZSgmcGF0aCk7CisJcmV0dXJuIGhhc2g7CiB9CiAKIC8vIGZpbmRzIG91dCB3aGljaCBoYXNoIG5hbWVzIGFyZSBzb3J0ZWQgd2l0aAotc3RhdGljIGludCB3aGF0X2hhc2ggKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCitzdGF0aWMgaW50IHdoYXRfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgX191MzIgY29kZTsKKwlfX3UzMiBjb2RlOwogCi0gICAgY29kZSA9IHNiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpKTsKKwljb2RlID0gc2JfaGFzaF9mdW5jdGlvbl9jb2RlKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpOwogCi0gICAgLyogcmVpc2VyZnNfaGFzaF9kZXRlY3QoKSA9PSB0cnVlIGlmIGFueSBvZiB0aGUgaGFzaCBtb3VudCBvcHRpb25zCi0gICAgKiogd2VyZSB1c2VkLiAgV2UgbXVzdCBjaGVjayB0aGVtIHRvIG1ha2Ugc3VyZSB0aGUgdXNlciBpc24ndAotICAgICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKLSAgICAqLwotICAgIGlmIChjb2RlID09IFVOU0VUX0hBU0ggfHwgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpCi0JY29kZSA9IGZpbmRfaGFzaF9vdXQgKHMpOworCS8qIHJlaXNlcmZzX2hhc2hfZGV0ZWN0KCkgPT0gdHJ1ZSBpZiBhbnkgb2YgdGhlIGhhc2ggbW91bnQgb3B0aW9ucworCSAqKiB3ZXJlIHVzZWQuICBXZSBtdXN0IGNoZWNrIHRoZW0gdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGlzbid0CisJICoqIHVzaW5nIGEgYmFkIGhhc2ggdmFsdWUKKwkgKi8KKwlpZiAoY29kZSA9PSBVTlNFVF9IQVNIIHx8IHJlaXNlcmZzX2hhc2hfZGV0ZWN0KHMpKQorCQljb2RlID0gZmluZF9oYXNoX291dChzKTsKIAotICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpIHsKLQkvKiBkZXRlY3Rpb24gaGFzIGZvdW5kIHRoZSBoYXNoLCBhbmQgd2UgbXVzdCBjaGVjayBhZ2FpbnN0IHRoZSAKLQkqKiBtb3VudCBvcHRpb25zIAotCSovCi0JaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSAmJiBjb2RlICE9IFlVUkFfSEFTSCkgewotCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKLQkJICAgInVuYWJsZSB0byBmb3JjZSBydXBhc292IGhhc2giLCByZWlzZXJmc19oYXNobmFtZShjb2RlKSkgOwotCSAgICBjb2RlID0gVU5TRVRfSEFTSCA7Ci0JfSBlbHNlIGlmIChyZWlzZXJmc190ZWFfaGFzaChzKSAmJiBjb2RlICE9IFRFQV9IQVNIKSB7Ci0JICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgotCQkgICAidW5hYmxlIHRvIGZvcmNlIHRlYSBoYXNoIiwgcmVpc2VyZnNfaGFzaG5hbWUoY29kZSkpIDsKLQkgICAgY29kZSA9IFVOU0VUX0hBU0ggOwotCX0gZWxzZSBpZiAocmVpc2VyZnNfcjVfaGFzaChzKSAmJiBjb2RlICE9IFI1X0hBU0gpIHsKLQkgICAgcmVpc2VyZnNfd2FybmluZyAocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCi0JCSAgICJ1bmFibGUgdG8gZm9yY2UgcjUgaGFzaCIsIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKSA7Ci0JICAgIGNvZGUgPSBVTlNFVF9IQVNIIDsKLQl9IAotICAgIH0gZWxzZSB7IAotICAgICAgICAvKiBmaW5kX2hhc2hfb3V0IHdhcyBub3QgY2FsbGVkIG9yIGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGhhc2ggKi8KLQlpZiAocmVpc2VyZnNfcnVwYXNvdl9oYXNoKHMpKSB7Ci0JICAgIGNvZGUgPSBZVVJBX0hBU0ggOwotCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykpIHsKLQkgICAgY29kZSA9IFRFQV9IQVNIIDsKLQl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykpIHsKLQkgICAgY29kZSA9IFI1X0hBU0ggOwotCX0gCi0gICAgfQorCWlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgcmVpc2VyZnNfaGFzaF9kZXRlY3QocykpIHsKKwkJLyogZGV0ZWN0aW9uIGhhcyBmb3VuZCB0aGUgaGFzaCwgYW5kIHdlIG11c3QgY2hlY2sgYWdhaW5zdCB0aGUgCisJCSAqKiBtb3VudCBvcHRpb25zIAorCQkgKi8KKwkJaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSAmJiBjb2RlICE9IFlVUkFfSEFTSCkgeworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKKwkJCQkJICJ1bmFibGUgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9IGVsc2UgaWYgKHJlaXNlcmZzX3RlYV9oYXNoKHMpICYmIGNvZGUgIT0gVEVBX0hBU0gpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCisJCQkJCSAidW5hYmxlIHRvIGZvcmNlIHRlYSBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykgJiYgY29kZSAhPSBSNV9IQVNIKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgorCQkJCQkgInVuYWJsZSB0byBmb3JjZSByNSBoYXNoIiwKKwkJCQkJIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKTsKKwkJCWNvZGUgPSBVTlNFVF9IQVNIOworCQl9CisJfSBlbHNlIHsKKwkJLyogZmluZF9oYXNoX291dCB3YXMgbm90IGNhbGxlZCBvciBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBoYXNoICovCisJCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykpIHsKKwkJCWNvZGUgPSBZVVJBX0hBU0g7CisJCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykpIHsKKwkJCWNvZGUgPSBURUFfSEFTSDsKKwkJfSBlbHNlIGlmIChyZWlzZXJmc19yNV9oYXNoKHMpKSB7CisJCQljb2RlID0gUjVfSEFTSDsKKwkJfQorCX0KIAotICAgIC8qIGlmIHdlIGFyZSBtb3VudGVkIFJXLCBhbmQgd2UgaGF2ZSBhIG5ldyB2YWxpZCBoYXNoIGNvZGUsIHVwZGF0ZSAKLSAgICAqKiB0aGUgc3VwZXIKLSAgICAqLwotICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgCi0JIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAKLSAgICAgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKLSAgICAgICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvZGU7CisJLyogaWYgd2UgYXJlIG1vdW50ZWQgUlcsIGFuZCB3ZSBoYXZlIGEgbmV3IHZhbGlkIGhhc2ggY29kZSwgdXBkYXRlIAorCSAqKiB0aGUgc3VwZXIKKwkgKi8KKwlpZiAoY29kZSAhPSBVTlNFVF9IQVNIICYmCisJICAgICEocy0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKKwkJc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKKwl9CisJcmV0dXJuIGNvZGU7CiB9CiAKIC8vIHJldHVybiBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIGZ1bmN0aW9uCi1zdGF0aWMgaGFzaGZfdCBoYXNoX2Z1bmN0aW9uIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQorc3RhdGljIGhhc2hmX3QgaGFzaF9mdW5jdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCiB7Ci0gICAgc3dpdGNoICh3aGF0X2hhc2ggKHMpKSB7Ci0gICAgY2FzZSBURUFfSEFTSDoKLQlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgdGVhIGhhc2ggdG8gc29ydCBuYW1lc1xuIik7Ci0JcmV0dXJuIGtleWVkX2hhc2g7Ci0gICAgY2FzZSBZVVJBX0hBU0g6Ci0JcmVpc2VyZnNfaW5mbyAocywgIlVzaW5nIHJ1cGFzb3YgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKLQlyZXR1cm4geXVyYV9oYXNoOwotICAgIGNhc2UgUjVfSEFTSDoKLQlyZWlzZXJmc19pbmZvIChzLCAiVXNpbmcgcjUgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKLQlyZXR1cm4gcjVfaGFzaDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7CisJc3dpdGNoICh3aGF0X2hhc2gocykpIHsKKwljYXNlIFRFQV9IQVNIOgorCQlyZWlzZXJmc19pbmZvKHMsICJVc2luZyB0ZWEgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwkJcmV0dXJuIGtleWVkX2hhc2g7CisJY2FzZSBZVVJBX0hBU0g6CisJCXJlaXNlcmZzX2luZm8ocywgIlVzaW5nIHJ1cGFzb3YgaGFzaCB0byBzb3J0IG5hbWVzXG4iKTsKKwkJcmV0dXJuIHl1cmFfaGFzaDsKKwljYXNlIFI1X0hBU0g6CisJCXJlaXNlcmZzX2luZm8ocywgIlVzaW5nIHI1IGhhc2ggdG8gc29ydCBuYW1lc1xuIik7CisJCXJldHVybiByNV9oYXNoOworCX0KKwlyZXR1cm4gTlVMTDsKIH0KIAogLy8gdGhpcyBpcyB1c2VkIHRvIHNldCB1cCBjb3JyZWN0IHZhbHVlIGZvciBvbGQgcGFydGl0aW9ucwotc3RhdGljIGludCBmdW5jdGlvbjJjb2RlIChoYXNoZl90IGZ1bmMpCitzdGF0aWMgaW50IGZ1bmN0aW9uMmNvZGUoaGFzaGZfdCBmdW5jKQogewotICAgIGlmIChmdW5jID09IGtleWVkX2hhc2gpCi0JcmV0dXJuIFRFQV9IQVNIOwotICAgIGlmIChmdW5jID09IHl1cmFfaGFzaCkKLQlyZXR1cm4gWVVSQV9IQVNIOwotICAgIGlmIChmdW5jID09IHI1X2hhc2gpCi0JcmV0dXJuIFI1X0hBU0g7CisJaWYgKGZ1bmMgPT0ga2V5ZWRfaGFzaCkKKwkJcmV0dXJuIFRFQV9IQVNIOworCWlmIChmdW5jID09IHl1cmFfaGFzaCkKKwkJcmV0dXJuIFlVUkFfSEFTSDsKKwlpZiAoZnVuYyA9PSByNV9oYXNoKQorCQlyZXR1cm4gUjVfSEFTSDsKIAotICAgIEJVRygpIDsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbgorCUJVRygpOwkJCS8vIHNob3VsZCBuZXZlciBoYXBwZW4KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAjZGVmaW5lIFNXQVJOKHNpbGVudCwgcywgLi4uKQkJCVwKIAlpZiAoIShzaWxlbnQpKQkJCQlcCiAJCXJlaXNlcmZzX3dhcm5pbmcgKHMsIF9fVkFfQVJHU19fKQogCi1zdGF0aWMgaW50IHJlaXNlcmZzX2ZpbGxfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQorc3RhdGljIGludCByZWlzZXJmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7Ci0gICAgaW50IGo7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7Ci0gICAgaW50IG9sZF9mb3JtYXQgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzOwotICAgIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9IDA7Ci0gICAgaW50IGppbml0X2RvbmUgPSAwIDsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3MgOwotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOwotICAgIGNoYXIgKmpkZXZfbmFtZTsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JpOwotICAgIGludCBlcnJ2YWwgPSAtRUlOVkFMOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKKwlpbnQgajsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCBvbGRfZm9ybWF0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrczsKKwl1bnNpZ25lZCBpbnQgY29tbWl0X21heF9hZ2UgPSAwOworCWludCBqaW5pdF9kb25lID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3M7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpyczsKKwljaGFyICpqZGV2X25hbWU7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiaTsKKwlpbnQgZXJydmFsID0gLUVJTlZBTDsKIAotICAgIHNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFzYmkpIHsKLQllcnJ2YWwgPSAtRU5PTUVNOwotCWdvdG8gZXJyb3I7Ci0gICAgfQotICAgIHMtPnNfZnNfaW5mbyA9IHNiaTsKLSAgICBtZW1zZXQgKHNiaSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbykpOwotICAgIC8qIFNldCBkZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uczogbm9uLWFnZ3Jlc3NpdmUgdGFpbHMsIFJPIG9uIGVycm9ycyAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19TTUFMTFRBSUwpOwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCB8PSAoMSA8PCBSRUlTRVJGU19FUlJPUl9STyk7Ci0gICAgLyogbm8gcHJlYWxsb2NhdGlvbiBtaW5pbXVtLCBiZSBzbWFydCBpbgotICAgICAgIHJlaXNlcmZzX2ZpbGVfd3JpdGUgaW5zdGVhZCAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gPSAwOwotICAgIC8qIFByZWFsbG9jYXRlIGJ5IDE2IGJsb2NrcyAoMTctMSkgYXQgb25jZSAqLwotICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NzaXplID0gMTc7Ci0gICAgLyogSW5pdGlhbGl6ZSB0aGUgcndzZW0gZm9yIHhhdHRyIGRpciAqLwotICAgIGluaXRfcndzZW0oJlJFSVNFUkZTX1NCKHMpLT54YXR0cl9kaXJfc2VtKTsKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKSB7CisJCWVycnZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3NiX2luZm8pKTsKKwkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbnM6IG5vbi1hZ2dyZXNzaXZlIHRhaWxzLCBSTyBvbiBlcnJvcnMgKi8KKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfU01BTExUQUlMKTsKKwlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pOworCS8qIG5vIHByZWFsbG9jYXRpb24gbWluaW11bSwgYmUgc21hcnQgaW4KKwkgICByZWlzZXJmc19maWxlX3dyaXRlIGluc3RlYWQgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jbWluID0gMDsKKwkvKiBQcmVhbGxvY2F0ZSBieSAxNiBibG9ja3MgKDE3LTEpIGF0IG9uY2UgKi8KKwlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSA9IDE3OworCS8qIEluaXRpYWxpemUgdGhlIHJ3c2VtIGZvciB4YXR0ciBkaXIgKi8KKwlpbml0X3J3c2VtKCZSRUlTRVJGU19TQihzKS0+eGF0dHJfZGlyX3NlbSk7CiAKLSAgICAvKiBzZXR1cCBkZWZhdWx0IGJsb2NrIGFsbG9jYXRvciBvcHRpb25zICovCi0gICAgcmVpc2VyZnNfaW5pdF9hbGxvY19vcHRpb25zKHMpOworCS8qIHNldHVwIGRlZmF1bHQgYmxvY2sgYWxsb2NhdG9yIG9wdGlvbnMgKi8KKwlyZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMocyk7CiAKLSAgICBqZGV2X25hbWUgPSBOVUxMOwotICAgIGlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zIChzLCAoY2hhciAqKSBkYXRhLCAmKHNiaS0+c19tb3VudF9vcHQpLCAmYmxvY2tzLCAmamRldl9uYW1lLCAmY29tbWl0X21heF9hZ2UpID09IDApIHsKLQlnb3RvIGVycm9yOwotICAgIH0KKwlqZGV2X25hbWUgPSBOVUxMOworCWlmIChyZWlzZXJmc19wYXJzZV9vcHRpb25zCisJICAgIChzLCAoY2hhciAqKWRhdGEsICYoc2JpLT5zX21vdW50X29wdCksICZibG9ja3MsICZqZGV2X25hbWUsCisJICAgICAmY29tbWl0X21heF9hZ2UpID09IDApIHsKKwkJZ290byBlcnJvcjsKKwl9CiAKLSAgICBpZiAoYmxvY2tzKSB7Ci0JU1dBUk4gKHNpbGVudCwgcywgImptYWNkLTc6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHJlc2l6ZSBvcHRpb24gIgotCSAgICAgICAiZm9yIHJlbW91bnQgb25seSIpOwotCWdvdG8gZXJyb3I7Ci0gICAgfQkKKwlpZiAoYmxvY2tzKSB7CisJCVNXQVJOKHNpbGVudCwgcywgImptYWNkLTc6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHJlc2l6ZSBvcHRpb24gIgorCQkgICAgICAiZm9yIHJlbW91bnQgb25seSIpOworCQlnb3RvIGVycm9yOworCX0KIAotICAgIC8qIHRyeSBvbGQgZm9ybWF0ICh1bmRpc3RyaWJ1dGVkIGJpdG1hcCwgc3VwZXIgYmxvY2sgaW4gOC10aCAxayBibG9jayBvZiBhIGRldmljZSkgKi8KLSAgICBpZiAoIXJlYWRfc3VwZXJfYmxvY2sgKHMsIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUykpCi0gICAgICBvbGRfZm9ybWF0ID0gMTsKLSAgICAvKiB0cnkgbmV3IGZvcm1hdCAoNjQtdGggMWsgYmxvY2spLCB3aGljaCBjYW4gY29udGFpbiByZWlzZXJmcyBzdXBlciBibG9jayAqLwotICAgIGVsc2UgaWYgKHJlYWRfc3VwZXJfYmxvY2sgKHMsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkgewotICAgICAgU1dBUk4oc2lsZW50LCBzLCAic2gtMjAyMTogcmVpc2VyZnNfZmlsbF9zdXBlcjogY2FuIG5vdCBmaW5kIHJlaXNlcmZzIG9uICVzIiwgcmVpc2VyZnNfYmRldm5hbWUgKHMpKTsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQorCS8qIHRyeSBvbGQgZm9ybWF0ICh1bmRpc3RyaWJ1dGVkIGJpdG1hcCwgc3VwZXIgYmxvY2sgaW4gOC10aCAxayBibG9jayBvZiBhIGRldmljZSkgKi8KKwlpZiAoIXJlYWRfc3VwZXJfYmxvY2socywgUkVJU0VSRlNfT0xEX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkKKwkJb2xkX2Zvcm1hdCA9IDE7CisJLyogdHJ5IG5ldyBmb3JtYXQgKDY0LXRoIDFrIGJsb2NrKSwgd2hpY2ggY2FuIGNvbnRhaW4gcmVpc2VyZnMgc3VwZXIgYmxvY2sgKi8KKwllbHNlIGlmIChyZWFkX3N1cGVyX2Jsb2NrKHMsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJzaC0yMDIxOiByZWlzZXJmc19maWxsX3N1cGVyOiBjYW4gbm90IGZpbmQgcmVpc2VyZnMgb24gJXMiLAorCQkgICAgICByZWlzZXJmc19iZGV2bmFtZShzKSk7CisJCWdvdG8gZXJyb3I7CisJfQogCi0gICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKLSAgICAvKiBMZXQncyBkbyBiYXNpYyBzYW5pdHkgY2hlY2sgdG8gdmVyaWZ5IHRoYXQgdW5kZXJseWluZyBkZXZpY2UgaXMgbm90Ci0gICAgICAgc21hbGxlciB0aGFuIHRoZSBmaWxlc3lzdGVtLiBJZiB0aGUgY2hlY2sgZmFpbHMgdGhlbiBhYm9ydCBhbmQgc2NyZWFtLAotICAgICAgIGJlY2F1c2UgYmFkIHN0dWZmIHdpbGwgaGFwcGVuIG90aGVyd2lzZS4gKi8KLSAgICBpZiAoIHMtPnNfYmRldiAmJiBzLT5zX2JkZXYtPmJkX2lub2RlICYmIGlfc2l6ZV9yZWFkKHMtPnNfYmRldi0+YmRfaW5vZGUpIDwgc2JfYmxvY2tfY291bnQocnMpKnNiX2Jsb2Nrc2l6ZShycykpIHsKLQlTV0FSTiAoc2lsZW50LCBzLCAiRmlsZXN5c3RlbSBvbiAlcyBjYW5ub3QgYmUgbW91bnRlZCBiZWNhdXNlIGl0IGlzIGJpZ2dlciB0aGFuIHRoZSBkZXZpY2UiLCByZWlzZXJmc19iZGV2bmFtZShzKSk7Ci0JU1dBUk4oc2lsZW50LCBzLCAiWW91IG1heSBuZWVkIHRvIHJ1biBmc2NrIG9yIGluY3JlYXNlIHNpemUgb2YgeW91ciBMVk0gcGFydGl0aW9uIik7Ci0JU1dBUk4oc2lsZW50LCBzLCAiT3IgbWF5IGJlIHlvdSBmb3Jnb3QgdG8gcmVib290IGFmdGVyIGZkaXNrIHdoZW4gaXQgdG9sZCB5b3UgdG8iKTsKLQlnb3RvIGVycm9yOwotICAgIH0KKwlycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisJLyogTGV0J3MgZG8gYmFzaWMgc2FuaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHVuZGVybHlpbmcgZGV2aWNlIGlzIG5vdAorCSAgIHNtYWxsZXIgdGhhbiB0aGUgZmlsZXN5c3RlbS4gSWYgdGhlIGNoZWNrIGZhaWxzIHRoZW4gYWJvcnQgYW5kIHNjcmVhbSwKKwkgICBiZWNhdXNlIGJhZCBzdHVmZiB3aWxsIGhhcHBlbiBvdGhlcndpc2UuICovCisJaWYgKHMtPnNfYmRldiAmJiBzLT5zX2JkZXYtPmJkX2lub2RlCisJICAgICYmIGlfc2l6ZV9yZWFkKHMtPnNfYmRldi0+YmRfaW5vZGUpIDwKKwkgICAgc2JfYmxvY2tfY291bnQocnMpICogc2JfYmxvY2tzaXplKHJzKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJGaWxlc3lzdGVtIG9uICVzIGNhbm5vdCBiZSBtb3VudGVkIGJlY2F1c2UgaXQgaXMgYmlnZ2VyIHRoYW4gdGhlIGRldmljZSIsCisJCSAgICAgIHJlaXNlcmZzX2JkZXZuYW1lKHMpKTsKKwkJU1dBUk4oc2lsZW50LCBzLAorCQkgICAgICAiWW91IG1heSBuZWVkIHRvIHJ1biBmc2NrIG9yIGluY3JlYXNlIHNpemUgb2YgeW91ciBMVk0gcGFydGl0aW9uIik7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgIk9yIG1heSBiZSB5b3UgZm9yZ290IHRvIHJlYm9vdCBhZnRlciBmZGlzayB3aGVuIGl0IHRvbGQgeW91IHRvIik7CisJCWdvdG8gZXJyb3I7CisJfQogCi0gICAgc2JpLT5zX21vdW50X3N0YXRlID0gU0JfUkVJU0VSRlNfU1RBVEUocyk7Ci0gICAgc2JpLT5zX21vdW50X3N0YXRlID0gUkVJU0VSRlNfVkFMSURfRlMgOworCXNiaS0+c19tb3VudF9zdGF0ZSA9IFNCX1JFSVNFUkZTX1NUQVRFKHMpOworCXNiaS0+c19tb3VudF9zdGF0ZSA9IFJFSVNFUkZTX1ZBTElEX0ZTOwogCi0gICAgaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtODogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlYWQgYml0bWFwIik7Ci0JZ290byBlcnJvcjsKLSAgICB9CisJaWYgKG9sZF9mb3JtYXQgPyByZWFkX29sZF9iaXRtYXBzKHMpIDogcmVhZF9iaXRtYXBzKHMpKSB7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgImptYWNkLTg6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byByZWFkIGJpdG1hcCIpOworCQlnb3RvIGVycm9yOworCX0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLSAgICBTV0FSTiAoc2lsZW50LCBzLCAiQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIHNldCBPTiIpOwotICAgIFNXQVJOIChzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOworCVNXQVJOKHNpbGVudCwgcywgIkNPTkZJR19SRUlTRVJGU19DSEVDSyBpcyBzZXQgT04iKTsKKwlTV0FSTihzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOwogI2VuZGlmCiAKLSAgICAvKiBtYWtlIGRhdGE9b3JkZXJlZCB0aGUgZGVmYXVsdCAqLwotICAgIGlmICghcmVpc2VyZnNfZGF0YV9sb2cocykgJiYgIXJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSAmJgotICAgICAgICAhcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpCi0gICAgewotICAgICAgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7Ci0gICAgfQotCi0gICAgaWYgKHJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7Ci0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKLSAgICB9IGVsc2UgaWYgKHJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSkgewotICAgICAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyB3cml0ZWJhY2sgZGF0YSBtb2RlXG4iKTsKLSAgICB9Ci0gICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocykpIHsKLSAgICAJcHJpbnRrKCJyZWlzZXJmczogdXNpbmcgZmx1c2ggYmFycmllcnNcbiIpOwotICAgIH0KLQotICAgIC8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKLSAgICBpZiggam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpICkgewotCVNXQVJOKHNpbGVudCwgcywgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKSA7Ci0JZ290byBlcnJvciA7Ci0gICAgfSBlbHNlIHsKLQlqaW5pdF9kb25lID0gMSA7IC8qIG9uY2UgdGhpcyBpcyBzZXQsIGpvdXJuYWxfcmVsZWFzZSBtdXN0IGJlIGNhbGxlZAotCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKLQkJCSAqLwotICAgIH0KLSAgICBpZiAocmVyZWFkX21ldGFfYmxvY2tzKHMpKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtOTogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlcmVhZCBtZXRhIGJsb2NrcyBhZnRlciBqb3VybmFsIGluaXQiKSA7Ci0JZ290byBlcnJvciA7Ci0gICAgfQotCi0gICAgaWYgKHJlcGxheV9vbmx5IChzKSkKLQlnb3RvIGVycm9yOwotCi0gICAgaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotICAgICAgICBTV0FSTihzaWxlbnQsIHMsICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5IikgOwotCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIDsKLSAgICB9Ci0gICAgYXJncy5vYmplY3RpZCA9IFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQgOwotICAgIGFyZ3MuZGlyaWQgPSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRCA7Ci0gICAgcm9vdF9pbm9kZSA9IGlnZXQ1X2xvY2tlZCAocywgUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRCwgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsICh2b2lkICopKCZhcmdzKSk7Ci0gICAgaWYgKCFyb290X2lub2RlKSB7Ci0JU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtMTA6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZCIpOwotCWdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHJvb3RfaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewotCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHJvb3RfaW5vZGUsICZhcmdzKTsKLQl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOwotICAgIH0KLQotICAgIHMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsgIAotICAgIGlmICghcy0+c19yb290KSB7Ci0JaXB1dChyb290X2lub2RlKTsKLQlnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCi0gICAgc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uIChzKTsKLSAgICBpZiAoc2JpLT5zX2hhc2hfZnVuY3Rpb24gPT0gTlVMTCkgewotICAgICAgZHB1dChzLT5zX3Jvb3QpIDsKLSAgICAgIHMtPnNfcm9vdCA9IE5VTEwgOwotICAgICAgZ290byBlcnJvciA7Ci0gICAgfQotCi0gICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpIHx8IChpc19yZWlzZXJmc19qciAocnMpICYmIFNCX1ZFUlNJT04gKHMpID09IFJFSVNFUkZTX1ZFUlNJT05fMSkpCi0Jc2V0X2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLSAgICBlbHNlCi0Jc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLSAgICAKLSAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCi0JZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpIDsKLSAgICAgICAgaWYgKGVycnZhbCkgewotCSAgICBkcHV0IChzLT5zX3Jvb3QpOwotCSAgICBzLT5zX3Jvb3QgPSBOVUxMOwotCSAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0JcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOwotCi0gICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOwotCXNldF9zYl9mc19zdGF0ZSAocnMsIDApOwotCQotCWlmIChvbGRfZm9ybWF0X29ubHkocykpIHsKLQkgIC8qIGZpbGVzeXN0ZW0gb2YgZm9ybWF0IDMuNSBlaXRoZXIgd2l0aCBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQKLQkgICAgIGpvdXJuYWwgKi8KLQkgIGlmIChjb252ZXJ0X3JlaXNlcmZzIChzKSkgewotCSAgICAvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLwotCSAgICBpZighc2lsZW50KQotCSAgICAgIHJlaXNlcmZzX2luZm8gKHMsImNvbnZlcnRpbmcgMy41IGZpbGVzeXN0ZW0gdG8gdGhlIDMuNiBmb3JtYXQiKSA7Ci0KLQkgICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpKQotCSAgICAgIC8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KLQkJIG1vdW50IHRoaXMgZmlsZXN5c3RlbSBhbnltb3JlICovCi0JICAgICAgbWVtY3B5IChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAotCQkgICAgICBzaXplb2YgKHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcpKTsKLQotCSAgICBzZXRfc2JfdmVyc2lvbihycyxSRUlTRVJGU19WRVJTSU9OXzIpOwotCSAgICByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzKSA7Ci0JICAgIHNldF9iaXQoUkVJU0VSRlNfM182LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7Ci0JICAgIGNsZWFyX2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKLQkgIH0gZWxzZSBpZiAoIXNpbGVudCl7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOwotCSAgfQorCS8qIG1ha2UgZGF0YT1vcmRlcmVkIHRoZSBkZWZhdWx0ICovCisJaWYgKCFyZWlzZXJmc19kYXRhX2xvZyhzKSAmJiAhcmVpc2VyZnNfZGF0YV9vcmRlcmVkKHMpICYmCisJICAgICFyZWlzZXJmc19kYXRhX3dyaXRlYmFjayhzKSkgeworCQlSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEKTsKIAl9CiAKLQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOwotCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSkgOwotCWlmIChlcnJ2YWwpIHsKLQkgICAgZHB1dCAocy0+c19yb290KTsKLQkgICAgcy0+c19yb290ID0gTlVMTDsKLQkgICAgZ290byBlcnJvcjsKKwlpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpIHsKKwkJcmVpc2VyZnNfaW5mbyhzLCAidXNpbmcgam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisJfSBlbHNlIGlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKwkJcmVpc2VyZnNfaW5mbyhzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOworCX0gZWxzZSB7CisJCXJlaXNlcmZzX2luZm8ocywgInVzaW5nIHdyaXRlYmFjayBkYXRhIG1vZGVcbiIpOworCX0KKwlpZiAocmVpc2VyZnNfYmFycmllcl9mbHVzaChzKSkgeworCQlwcmludGsoInJlaXNlcmZzOiB1c2luZyBmbHVzaCBiYXJyaWVyc1xuIik7CisJfQorCS8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKKwlpZiAoam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpKSB7CisJCVNXQVJOKHNpbGVudCwgcywKKwkJICAgICAgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKTsKKwkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQlqaW5pdF9kb25lID0gMTsJLyogb25jZSB0aGlzIGlzIHNldCwgam91cm5hbF9yZWxlYXNlIG11c3QgYmUgY2FsbGVkCisJCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKKwkJCQkgKi8KKwl9CisJaWYgKHJlcmVhZF9tZXRhX2Jsb2NrcyhzKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJqbWFjZC05OiByZWlzZXJmc19maWxsX3N1cGVyOiB1bmFibGUgdG8gcmVyZWFkIG1ldGEgYmxvY2tzIGFmdGVyIGpvdXJuYWwgaW5pdCIpOworCQlnb3RvIGVycm9yOwogCX0KIAotCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7Ci0JICAgIGRwdXQgKHMtPnNfcm9vdCk7Ci0JICAgIHMtPnNfcm9vdCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7CisJaWYgKHJlcGxheV9vbmx5KHMpKQorCQlnb3RvIGVycm9yOworCisJaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5Iik7CisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlhcmdzLm9iamVjdGlkID0gUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRDsKKwlhcmdzLmRpcmlkID0gUkVJU0VSRlNfUk9PVF9QQVJFTlRfT0JKRUNUSUQ7CisJcm9vdF9pbm9kZSA9CisJICAgIGlnZXQ1X2xvY2tlZChzLCBSRUlTRVJGU19ST09UX09CSkVDVElELCByZWlzZXJmc19maW5kX2FjdG9yLAorCQkJIHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlLCAodm9pZCAqKSgmYXJncykpOworCWlmICghcm9vdF9pbm9kZSkgeworCQlTV0FSTihzaWxlbnQsIHMsCisJCSAgICAgICJqbWFjZC0xMDogcmVpc2VyZnNfZmlsbF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIik7CisJCWdvdG8gZXJyb3I7CiAJfQogCi0JLyogbG9vayBmb3IgZmlsZXMgd2hpY2ggd2VyZSB0byBiZSByZW1vdmVkIGluIHByZXZpb3VzIHNlc3Npb24gKi8KLQlmaW5pc2hfdW5maW5pc2hlZCAocyk7Ci0gICAgfSBlbHNlIHsKLQlpZiAoIG9sZF9mb3JtYXRfb25seShzKSAmJiAhc2lsZW50KSB7Ci0JICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOworCWlmIChyb290X2lub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUocm9vdF9pbm9kZSwgJmFyZ3MpOworCQl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOwogCX0KIAotCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7Ci0JICAgIGRwdXQgKHMtPnNfcm9vdCk7Ci0JICAgIHMtPnNfcm9vdCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcy0+c19yb290KSB7CisJCWlwdXQocm9vdF9pbm9kZSk7CisJCWdvdG8gZXJyb3I7CiAJfQotICAgIH0KLSAgICAvLyBtYXJrIGhhc2ggaW4gc3VwZXIgYmxvY2s6IGl0IGNvdWxkIGJlIHVuc2V0LiBvdmVyd3JpdGUgc2hvdWxkIGJlIG9rCi0gICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZSggcnMsIGZ1bmN0aW9uMmNvZGUoc2JpLT5zX2hhc2hfZnVuY3Rpb24gKSApOwotCi0gICAgaGFuZGxlX2F0dHJzKCBzICk7Ci0KLSAgICByZWlzZXJmc19wcm9jX2luZm9faW5pdCggcyApOwotCi0gICAgaW5pdF93YWl0cXVldWVfaGVhZCAoJihzYmktPnNfd2FpdCkpOwotICAgIHNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKLQotICAgIHJldHVybiAoMCk7Ci0KLSBlcnJvcjoKLSAgICBpZiAoamluaXRfZG9uZSkgeyAvKiBraWxsIHRoZSBjb21taXQgdGhyZWFkLCBmcmVlIGpvdXJuYWwgcmFtICovCi0Jam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpIDsKLSAgICB9Ci0gICAgaWYgKFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpKSB7Ci0JZm9yIChqID0gMDsgaiA8IFNCX0JNQVBfTlIgKHMpOyBqICsrKSB7Ci0JICAgIGlmIChTQl9BUF9CSVRNQVAgKHMpKQotCQlicmVsc2UgKFNCX0FQX0JJVE1BUCAocylbal0uYmgpOworCS8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCisJc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uKHMpOworCWlmIChzYmktPnNfaGFzaF9mdW5jdGlvbiA9PSBOVUxMKSB7CisJCWRwdXQocy0+c19yb290KTsKKwkJcy0+c19yb290ID0gTlVMTDsKKwkJZ290byBlcnJvcjsKIAl9Ci0JaWYgKFNCX0FQX0JJVE1BUCAocykpCi0JICAgIHZmcmVlIChTQl9BUF9CSVRNQVAgKHMpKTsKLSAgICB9Ci0gICAgaWYgKFNCX0JVRkZFUl9XSVRIX1NCIChzKSkKLQlicmVsc2UoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKworCWlmIChpc19yZWlzZXJmc18zXzUocnMpCisJICAgIHx8IChpc19yZWlzZXJmc19qcihycykgJiYgU0JfVkVSU0lPTihzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzEpKQorCQlzZXRfYml0KFJFSVNFUkZTXzNfNSwgJihzYmktPnNfcHJvcGVydGllcykpOworCWVsc2UKKwkJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisKKwkJZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpOworCQlpZiAoZXJydmFsKSB7CisJCQlkcHV0KHMtPnNfcm9vdCk7CisJCQlzLT5zX3Jvb3QgPSBOVUxMOworCQkJZ290byBlcnJvcjsKKwkJfQorCQlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKTsKKworCQlzZXRfc2JfdW1vdW50X3N0YXRlKHJzLCBSRUlTRVJGU19FUlJPUl9GUyk7CisJCXNldF9zYl9mc19zdGF0ZShycywgMCk7CisKKwkJaWYgKG9sZF9mb3JtYXRfb25seShzKSkgeworCQkJLyogZmlsZXN5c3RlbSBvZiBmb3JtYXQgMy41IGVpdGhlciB3aXRoIHN0YW5kYXJkIG9yIG5vbi1zdGFuZGFyZAorCQkJICAgam91cm5hbCAqLworCQkJaWYgKGNvbnZlcnRfcmVpc2VyZnMocykpIHsKKwkJCQkvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLworCQkJCWlmICghc2lsZW50KQorCQkJCQlyZWlzZXJmc19pbmZvKHMsCisJCQkJCQkgICAgICAiY29udmVydGluZyAzLjUgZmlsZXN5c3RlbSB0byB0aGUgMy42IGZvcm1hdCIpOworCisJCQkJaWYgKGlzX3JlaXNlcmZzXzNfNShycykpCisJCQkJCS8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KKwkJCQkJICAgbW91bnQgdGhpcyBmaWxlc3lzdGVtIGFueW1vcmUgKi8KKwkJCQkJbWVtY3B5KHJzLT5zX3YxLnNfbWFnaWMsCisJCQkJCSAgICAgICByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorCQkJCQkgICAgICAgc2l6ZW9mCisJCQkJCSAgICAgICAocmVpc2VyZnNfM182X21hZ2ljX3N0cmluZykpOworCisJCQkJc2V0X3NiX3ZlcnNpb24ocnMsIFJFSVNFUkZTX1ZFUlNJT05fMik7CisJCQkJcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEocyk7CisJCQkJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKwkJCQljbGVhcl9iaXQoUkVJU0VSRlNfM181LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisJCQl9IGVsc2UgaWYgKCFzaWxlbnQpIHsKKwkJCQlyZWlzZXJmc19pbmZvKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIik7CisJCQl9CisJCX0KKworCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSk7CisJCWVycnZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgMSk7CisJCWlmIChlcnJ2YWwpIHsKKwkJCWRwdXQocy0+c19yb290KTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaWYgKChlcnJ2YWwgPSByZWlzZXJmc194YXR0cl9pbml0KHMsIHMtPnNfZmxhZ3MpKSkgeworCQkJZHB1dChzLT5zX3Jvb3QpOworCQkJcy0+c19yb290ID0gTlVMTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBsb29rIGZvciBmaWxlcyB3aGljaCB3ZXJlIHRvIGJlIHJlbW92ZWQgaW4gcHJldmlvdXMgc2Vzc2lvbiAqLworCQlmaW5pc2hfdW5maW5pc2hlZChzKTsKKwl9IGVsc2UgeworCQlpZiAob2xkX2Zvcm1hdF9vbmx5KHMpICYmICFzaWxlbnQpIHsKKwkJCXJlaXNlcmZzX2luZm8ocywgInVzaW5nIDMuNS54IGRpc2sgZm9ybWF0XG4iKTsKKwkJfQorCisJCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdChzLCBzLT5zX2ZsYWdzKSkpIHsKKwkJCWRwdXQocy0+c19yb290KTsKKwkJCXMtPnNfcm9vdCA9IE5VTEw7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCS8vIG1hcmsgaGFzaCBpbiBzdXBlciBibG9jazogaXQgY291bGQgYmUgdW5zZXQuIG92ZXJ3cml0ZSBzaG91bGQgYmUgb2sKKwlzZXRfc2JfaGFzaF9mdW5jdGlvbl9jb2RlKHJzLCBmdW5jdGlvbjJjb2RlKHNiaS0+c19oYXNoX2Z1bmN0aW9uKSk7CisKKwloYW5kbGVfYXR0cnMocyk7CisKKwlyZWlzZXJmc19wcm9jX2luZm9faW5pdChzKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihzYmktPnNfd2FpdCkpOworCXNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKKworCXJldHVybiAoMCk7CisKKyAgICAgIGVycm9yOgorCWlmIChqaW5pdF9kb25lKSB7CS8qIGtpbGwgdGhlIGNvbW1pdCB0aHJlYWQsIGZyZWUgam91cm5hbCByYW0gKi8KKwkJam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpOworCX0KKwlpZiAoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkgeworCQlmb3IgKGogPSAwOyBqIDwgU0JfQk1BUF9OUihzKTsgaisrKSB7CisJCQlpZiAoU0JfQVBfQklUTUFQKHMpKQorCQkJCWJyZWxzZShTQl9BUF9CSVRNQVAocylbal0uYmgpOworCQl9CisJCWlmIChTQl9BUF9CSVRNQVAocykpCisJCQl2ZnJlZShTQl9BUF9CSVRNQVAocykpOworCX0KKwlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocykpCisJCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQihzKSk7CiAjaWZkZWYgQ09ORklHX1FVT1RBCi0gICAgZm9yIChqID0gMDsgaiA8IE1BWFFVT1RBUzsgaisrKSB7Ci0JaWYgKHNiaS0+c19xZl9uYW1lc1tqXSkKLQkgICAga2ZyZWUoc2JpLT5zX3FmX25hbWVzW2pdKTsKLSAgICB9CisJZm9yIChqID0gMDsgaiA8IE1BWFFVT1RBUzsgaisrKSB7CisJCWlmIChzYmktPnNfcWZfbmFtZXNbal0pCisJCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbal0pOworCX0KICNlbmRpZgotICAgIGlmIChzYmkgIT0gTlVMTCkgewotCWtmcmVlKHNiaSk7Ci0gICAgfQorCWlmIChzYmkgIT0gTlVMTCkgeworCQlrZnJlZShzYmkpOworCX0KIAotICAgIHMtPnNfZnNfaW5mbyA9IE5VTEw7Ci0gICAgcmV0dXJuIGVycnZhbDsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiBlcnJ2YWw7CiB9CiAKLQotc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKQorc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewotICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOwotICAKLSAgYnVmLT5mX25hbWVsZW4gPSAoUkVJU0VSRlNfTUFYX05BTUUgKHMtPnNfYmxvY2tzaXplKSk7Ci0gIGJ1Zi0+Zl9iZnJlZSAgID0gc2JfZnJlZV9ibG9ja3MocnMpOwotICBidWYtPmZfYmF2YWlsICA9IGJ1Zi0+Zl9iZnJlZTsKLSAgYnVmLT5mX2Jsb2NrcyAgPSBzYl9ibG9ja19jb3VudChycykgLSBzYl9ibWFwX25yKHJzKSAtIDE7Ci0gIGJ1Zi0+Zl9ic2l6ZSAgID0gcy0+c19ibG9ja3NpemU7Ci0gIC8qIGNoYW5nZWQgdG8gYWNjb21tb2RhdGUgZ2NjIGZvbGtzLiovCi0gIGJ1Zi0+Zl90eXBlICAgID0gIFJFSVNFUkZTX1NVUEVSX01BR0lDOwotICByZXR1cm4gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKworCWJ1Zi0+Zl9uYW1lbGVuID0gKFJFSVNFUkZTX01BWF9OQU1FKHMtPnNfYmxvY2tzaXplKSk7CisJYnVmLT5mX2JmcmVlID0gc2JfZnJlZV9ibG9ja3MocnMpOworCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWU7CisJYnVmLT5mX2Jsb2NrcyA9IHNiX2Jsb2NrX2NvdW50KHJzKSAtIHNiX2JtYXBfbnIocnMpIC0gMTsKKwlidWYtPmZfYnNpemUgPSBzLT5zX2Jsb2Nrc2l6ZTsKKwkvKiBjaGFuZ2VkIHRvIGFjY29tbW9kYXRlIGdjYyBmb2xrcy4gKi8KKwlidWYtPmZfdHlwZSA9IFJFSVNFUkZTX1NVUEVSX01BR0lDOworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1FVT1RBCiBzdGF0aWMgaW50IHJlaXNlcmZzX2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0OworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IHJldCwgZXJyOwogCi0gICAgLyogV2UgbWF5IGNyZWF0ZSBxdW90YSBzdHJ1Y3R1cmUgc28gd2UgbmVlZCB0byByZXNlcnZlIGVub3VnaCBibG9ja3MgKi8KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDIqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOwotICAgIHJldCA9IGRxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpOwotICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDIqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldDsKKwkvKiBXZSBtYXkgY3JlYXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwKKwkJCSAgMiAqIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGlub2RlLT5pX3NiKSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJcmV0ID0gZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7CisJZXJyID0KKwkgICAgam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwKKwkJCTIgKiBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhpbm9kZS0+aV9zYikpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCByZWlzZXJmc19kcXVvdF9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKLSAgICBpbnQgcmV0OworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJaW50IHJldCwgZXJyOwogCi0gICAgLyogV2UgbWF5IGRlbGV0ZSBxdW90YSBzdHJ1Y3R1cmUgc28gd2UgbmVlZCB0byByZXNlcnZlIGVub3VnaCBibG9ja3MgKi8KLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKLSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDIqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOwotICAgIHJldCA9IGRxdW90X2Ryb3AoaW5vZGUpOwotICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDIqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7Ci0gICAgcmV0dXJuIHJldDsKKwkvKiBXZSBtYXkgZGVsZXRlIHF1b3RhIHN0cnVjdHVyZSBzbyB3ZSBuZWVkIHRvIHJlc2VydmUgZW5vdWdoIGJsb2NrcyAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwKKwkJCSAgMiAqIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLAorCQkJMiAqIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MoaW5vZGUtPmlfc2IpKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOwotICAgIGludCByZXQ7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKwlpbnQgcmV0LCBlcnI7CiAKLSAgICByZWlzZXJmc193cml0ZV9sb2NrKGRxdW90LT5kcV9zYik7Ci0gICAgam91cm5hbF9iZWdpbigmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKLSAgICByZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOwotICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOwotICAgIHJldHVybiByZXQ7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhkcXVvdC0+ZHFfc2IpOworCXJldCA9CisJICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBkcXVvdC0+ZHFfc2IsCisJCQkgIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOworCWVyciA9CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgaW50IHJldDsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKLSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7Ci0gICAgcmV0ID0gZHF1b3RfYWNxdWlyZShkcXVvdCk7Ci0gICAgam91cm5hbF9lbmQoJnRoLCBkcXVvdC0+ZHFfc2IsIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXR1cm4gcmV0OworCXJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXQgPQorCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJICBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlyZXQgPSBkcXVvdF9hY3F1aXJlKGRxdW90KTsKKwllcnIgPQorCSAgICBqb3VybmFsX2VuZCgmdGgsIGRxdW90LT5kcV9zYiwKKwkJCVJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmICghcmV0ICYmIGVycikKKwkJcmV0ID0gZXJyOworICAgICAgb3V0OgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgaW50IHJldDsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKLSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7Ci0gICAgcmV0ID0gZHF1b3RfcmVsZWFzZShkcXVvdCk7Ci0gICAgam91cm5hbF9lbmQoJnRoLCBkcXVvdC0+ZHFfc2IsIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKLSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKLSAgICByZXR1cm4gcmV0OworCXJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXQgPQorCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJICBSRUlTRVJGU19RVU9UQV9ERUxfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IGRxdW90X3JlbGVhc2UoZHF1b3QpOworCWVyciA9CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLAorCQkJUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHJlaXNlcmZzX21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCkKIHsKLSAgICAvKiBBcmUgd2Ugam91cm5hbGxpbmcgcXVvdGFzPyAqLwotICAgIGlmIChSRUlTRVJGU19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fAotICAgICAgICBSRUlTRVJGU19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgewotCWRxdW90X21hcmtfZHF1b3RfZGlydHkoZHF1b3QpOwotCXJldHVybiByZWlzZXJmc193cml0ZV9kcXVvdChkcXVvdCk7Ci0gICAgfQotICAgIGVsc2UKLQlyZXR1cm4gZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7CisJLyogQXJlIHdlIGpvdXJuYWxsaW5nIHF1b3Rhcz8gKi8KKwlpZiAoUkVJU0VSRlNfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwKKwkgICAgUkVJU0VSRlNfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwkJZHF1b3RfbWFya19kcXVvdF9kaXJ0eShkcXVvdCk7CisJCXJldHVybiByZWlzZXJmc193cml0ZV9kcXVvdChkcXVvdCk7CisJfSBlbHNlCisJCXJldHVybiBkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKIH0KIAogc3RhdGljIGludCByZWlzZXJmc193cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewotICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7Ci0gICAgaW50IHJldDsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCWludCByZXQsIGVycjsKIAotICAgIC8qIERhdGEgYmxvY2sgKyBpbm9kZSBibG9jayAqLwotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOwotICAgIGpvdXJuYWxfYmVnaW4oJnRoLCBzYiwgMik7Ci0gICAgcmV0ID0gZHF1b3RfY29tbWl0X2luZm8oc2IsIHR5cGUpOwotICAgIGpvdXJuYWxfZW5kKCZ0aCwgc2IsIDIpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7Ci0gICAgcmV0dXJuIHJldDsKKwkvKiBEYXRhIGJsb2NrICsgaW5vZGUgYmxvY2sgKi8KKwlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKwlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IGRxdW90X2NvbW1pdF9pbmZvKHNiLCB0eXBlKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHNiLCAyKTsKKwlpZiAoIXJldCAmJiBlcnIpCisJCXJldCA9IGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0xOTM3LDQzICsyMTE2LDQ4IEBACiBzdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXJldHVybiB2ZnNfcXVvdGFfb25fbW91bnQoc2IsIFJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSwKLQkJCVJFSVNFUkZTX1NCKHNiKS0+c19qcXVvdGFfZm10LCB0eXBlKTsKKwkJCQkgIFJFSVNFUkZTX1NCKHNiKS0+c19qcXVvdGFfZm10LCB0eXBlKTsKIH0KIAogLyoKICAqIFN0YW5kYXJkIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBxdW90YV9vbgogICovCi1zdGF0aWMgaW50IHJlaXNlcmZzX3F1b3RhX29uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLCBjaGFyICpwYXRoKQorc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwKKwkJCSAgICAgY2hhciAqcGF0aCkKIHsKLSAgICBpbnQgZXJyOwotICAgIHN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwogCi0gICAgZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKLSAgICBpZiAoZXJyKQotICAgICAgICByZXR1cm4gZXJyOwotICAgIC8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KLSAgICBpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwlpZiAoIShSRUlTRVJGU19TQihzYiktPnNfbW91bnRfb3B0ICYgKDEgPDwgUkVJU0VSRlNfUVVPVEEpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKwlpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiAtRVhERVY7CisJfQorCS8qIFdlIG11c3Qgbm90IHBhY2sgdGFpbHMgZm9yIHF1b3RhIGZpbGVzIG9uIHJlaXNlcmZzIGZvciBxdW90YSBJTyB0byB3b3JrICovCisJaWYgKCFSRUlTRVJGU19JKG5kLmRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgJiBpX25vcGFja19tYXNrKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsCisJCQkJICJyZWlzZXJmczogUXVvdGEgZmlsZSBtdXN0IGhhdmUgdGFpbCBwYWNraW5nIGRpc2FibGVkLiIpOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIE5vdCBqb3VybmFsbGluZyBxdW90YT8gTm8gbW9yZSB0ZXN0cyBuZWVkZWQuLi4gKi8KKwlpZiAoIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gJiYKKwkgICAgIVJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7CisJfQorCS8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KKwlpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQorCQlyZWlzZXJmc193YXJuaW5nKHNiLAorCQkJCSAicmVpc2VyZnM6IFF1b3RhIGZpbGUgbm90IG9uIGZpbGVzeXN0ZW0gcm9vdC4gIgorCQkJCSAiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLiIpOwogCXBhdGhfcmVsZWFzZSgmbmQpOwotICAgICAgICByZXR1cm4gLUVYREVWOwotICAgIH0KLSAgICAvKiBXZSBtdXN0IG5vdCBwYWNrIHRhaWxzIGZvciBxdW90YSBmaWxlcyBvbiByZWlzZXJmcyBmb3IgcXVvdGEgSU8gdG8gd29yayAqLwotICAgIGlmICghUkVJU0VSRlNfSShuZC5kZW50cnktPmRfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykgewotCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJyZWlzZXJmczogUXVvdGEgZmlsZSBtdXN0IGhhdmUgdGFpbCBwYWNraW5nIGRpc2FibGVkLiIpOwotCXBhdGhfcmVsZWFzZSgmbmQpOwotCXJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICAvKiBOb3Qgam91cm5hbGxpbmcgcXVvdGE/IE5vIG1vcmUgdGVzdHMgbmVlZGVkLi4uICovCi0gICAgaWYgKCFSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCi0gICAgICAgICFSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7Ci0JcGF0aF9yZWxlYXNlKCZuZCk7Ci0gICAgICAgIHJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7Ci0gICAgfQotICAgIC8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KLSAgICBpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQotCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJyZWlzZXJmczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKb3VybmFsbGVkIHF1b3RhIHdpbGwgbm90IHdvcmsuIik7Ci0gICAgcGF0aF9yZWxlYXNlKCZuZCk7Ci0gICAgcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKKwlyZXR1cm4gdmZzX3F1b3RhX29uKHNiLCB0eXBlLCBmb3JtYXRfaWQsIHBhdGgpOwogfQogCiAvKiBSZWFkIGRhdGEgZnJvbSBxdW90YWZpbGUgLSBhdm9pZCBwYWdlY2FjaGUgYW5kIHN1Y2ggYmVjYXVzZSB3ZSBjYW5ub3QgYWZmb3JkCkBAIC0xOTgzLDQyICsyMTY3LDQ0IEBACiBzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAogCQkJCSAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCiB7Ci0gICAgc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07Ci0gICAgdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7Ci0gICAgaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OwotICAgIHNpemVfdCB0b3JlYWQ7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwotICAgIGxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OworCXNpemVfdCB0b3JlYWQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAKLSAgICBpZiAob2ZmID4gaV9zaXplKQotCXJldHVybiAwOwotICAgIGlmIChvZmYrbGVuID4gaV9zaXplKQotCWxlbiA9IGlfc2l6ZS1vZmY7Ci0gICAgdG9yZWFkID0gbGVuOwotICAgIHdoaWxlICh0b3JlYWQgPiAwKSB7Ci0JdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG9yZWFkID8gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG9yZWFkOwotCXRtcF9iaC5iX3N0YXRlID0gMDsKLQkvKiBRdW90YSBmaWxlcyBhcmUgd2l0aG91dCB0YWlscyBzbyB3ZSBjYW4gc2FmZWx5IHVzZSB0aGlzIGZ1bmN0aW9uICovCi0JcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7Ci0JZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOwotCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzYik7Ci0JaWYgKGVycikKLQkgICAgcmV0dXJuIGVycjsKLQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJnRtcF9iaCkpICAgIC8qIEEgaG9sZT8gKi8KLQkgICAgbWVtc2V0KGRhdGEsIDAsIHRvY29weSk7Ci0JZWxzZSB7Ci0JICAgIGJoID0gc2JfYnJlYWQoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOwotCSAgICBpZiAoIWJoKQotCQlyZXR1cm4gLUVJTzsKLQkgICAgbWVtY3B5KGRhdGEsIGJoLT5iX2RhdGErb2Zmc2V0LCB0b2NvcHkpOwotCSAgICBicmVsc2UoYmgpOworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYgKyBsZW4gPiBpX3NpemUpCisJCWxlbiA9IGlfc2l6ZSAtIG9mZjsKKwl0b3JlYWQgPSBsZW47CisJd2hpbGUgKHRvcmVhZCA+IDApIHsKKwkJdG9jb3B5ID0KKwkJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8CisJCSAgICB0b3JlYWQgPyBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3JlYWQ7CisJCXRtcF9iaC5iX3N0YXRlID0gMDsKKwkJLyogUXVvdGEgZmlsZXMgYXJlIHdpdGhvdXQgdGFpbHMgc28gd2UgY2FuIHNhZmVseSB1c2UgdGhpcyBmdW5jdGlvbiAqLworCQlyZWlzZXJmc193cml0ZV9sb2NrKHNiKTsKKwkJZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZ0bXBfYmgpKQkvKiBBIGhvbGU/ICovCisJCQltZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwkJZWxzZSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YSArIG9mZnNldCwgdG9jb3B5KTsKKwkJCWJyZWxzZShiaCk7CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOwogCX0KLQlvZmZzZXQgPSAwOwotCXRvcmVhZCAtPSB0b2NvcHk7Ci0JZGF0YSArPSB0b2NvcHk7Ci0JYmxrKys7Ci0gICAgfQotICAgIHJldHVybiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAogLyogV3JpdGUgdG8gcXVvdGFmaWxlICh3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IHN0YXJ0ZWQgYW5kIGhhcwpAQCAtMjAyNiwxMTcgKzIyMTIsMTE2IEBACiBzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKIAkJCQkgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKLSAgICB1bnNpZ25lZCBsb25nIGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLSAgICBpbnQgZXJyID0gMCwgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpLCB0b2NvcHk7Ci0gICAgaW50IGpvdXJuYWxfcXVvdGEgPSBSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0gIT0gTlVMTDsKLSAgICBzaXplX3QgdG93cml0ZSA9IGxlbjsKLSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoLCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJdW5zaWduZWQgbG9uZyBibGsgPSBvZmYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGVyciA9IDAsIG9mZnNldCA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKSwgdG9jb3B5OworCWludCBqb3VybmFsX3F1b3RhID0gUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdICE9IE5VTEw7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaCwgKmJoOwogCi0gICAgZG93bigmaW5vZGUtPmlfc2VtKTsKLSAgICB3aGlsZSAodG93cml0ZSA+IDApIHsKLQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3dyaXRlID8KLQkgICAgICAgICBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgOiB0b3dyaXRlOwotCXRtcF9iaC5iX3N0YXRlID0gMDsKLQllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgR0VUX0JMT0NLX0NSRUFURSk7Ci0JaWYgKGVycikKLQkgICAgZ290byBvdXQ7Ci0JaWYgKG9mZnNldCB8fCB0b2NvcHkgIT0gc2ItPnNfYmxvY2tzaXplKQotCSAgICBiaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKLQllbHNlCi0JICAgIGJoID0gc2JfZ2V0YmxrKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKLQlpZiAoIWJoKSB7Ci0JICAgIGVyciA9IC1FSU87Ci0JICAgIGdvdG8gb3V0OworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJd2hpbGUgKHRvd3JpdGUgPiAwKSB7CisJCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPworCQkgICAgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwkJdG1wX2JoLmJfc3RhdGUgPSAwOworCQllcnIgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsaywgJnRtcF9iaCwgR0VUX0JMT0NLX0NSRUFURSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKG9mZnNldCB8fCB0b2NvcHkgIT0gc2ItPnNfYmxvY2tzaXplKQorCQkJYmggPSBzYl9icmVhZChzYiwgdG1wX2JoLmJfYmxvY2tucik7CisJCWVsc2UKKwkJCWJoID0gc2JfZ2V0YmxrKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJaWYgKCFiaCkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIGJoLCAxKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5KGN1cnJlbnQtPmpvdXJuYWxfaW5mbywgc2IsIGJoKTsKKwkJaWYgKCFqb3VybmFsX3F1b3RhKQorCQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmgpOworCQlicmVsc2UoYmgpOworCQlvZmZzZXQgPSAwOworCQl0b3dyaXRlIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOwogCX0KLQlsb2NrX2J1ZmZlcihiaCk7Ci0JbWVtY3B5KGJoLT5iX2RhdGErb2Zmc2V0LCBkYXRhLCB0b2NvcHkpOwotCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOwotCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCXVubG9ja19idWZmZXIoYmgpOwotCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc2IsIGJoLCAxKTsKLQlqb3VybmFsX21hcmtfZGlydHkoY3VycmVudC0+am91cm5hbF9pbmZvLCBzYiwgYmgpOwotCWlmICgham91cm5hbF9xdW90YSkKLQkJcmVpc2VyZnNfYWRkX29yZGVyZWRfbGlzdChpbm9kZSwgYmgpOwotCWJyZWxzZShiaCk7Ci0Jb2Zmc2V0ID0gMDsKLQl0b3dyaXRlIC09IHRvY29weTsKLQlkYXRhICs9IHRvY29weTsKLQlibGsrKzsKLSAgICB9Ci1vdXQ6Ci0gICAgaWYgKGxlbiA9PSB0b3dyaXRlKQotCXJldHVybiBlcnI7Ci0gICAgaWYgKGlub2RlLT5pX3NpemUgPCBvZmYrbGVuLXRvd3JpdGUpCi0JaV9zaXplX3dyaXRlKGlub2RlLCBvZmYrbGVuLXRvd3JpdGUpOwotICAgIGlub2RlLT5pX3ZlcnNpb24rKzsKLSAgICBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotICAgIG1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotICAgIHVwKCZpbm9kZS0+aV9zZW0pOwotICAgIHJldHVybiBsZW4gLSB0b3dyaXRlOworICAgICAgb3V0OgorCWlmIChsZW4gPT0gdG93cml0ZSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IG9mZiArIGxlbiAtIHRvd3JpdGUpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmICsgbGVuIC0gdG93cml0ZSk7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxlbiAtIHRvd3JpdGU7CiB9CiAKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrKgotZ2V0X3N1cGVyX2Jsb2NrIChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAotCQkgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc3VwZXJfYmxvY2soc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgcmVpc2VyZnNfZmlsbF9zdXBlcik7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0Ci1pbml0X3JlaXNlcmZzX2ZzICggdm9pZCApCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JlaXNlcmZzX2ZzKHZvaWQpCiB7CiAJaW50IHJldDsKIAotCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlICgpKSkgeworCWlmICgocmV0ID0gaW5pdF9pbm9kZWNhY2hlKCkpKSB7CiAJCXJldHVybiByZXQ7CiAJfQogCi0gICAgICAgIGlmICgocmV0ID0gcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnMgKCkpKQotICAgICAgICAgICAgZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CisJaWYgKChyZXQgPSByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycygpKSkKKwkJZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CiAKLQlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQgKCk7Ci0JcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwgKCJ2ZXJzaW9uIiwgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyk7CisJcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KCk7CisJcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwoInZlcnNpb24iLAorCQkJCSAgICAgIHJlaXNlcmZzX2dsb2JhbF92ZXJzaW9uX2luX3Byb2MpOwogCi0gICAgICAgIHJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0gKCYgcmVpc2VyZnNfZnNfdHlwZSk7CisJcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVpc2VyZnNfZnNfdHlwZSk7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJcmV0dXJuIDA7CiAJfQogCi0gICAgICAgIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisJcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycygpOwogCi1mYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM6Ci0JcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCAoInZlcnNpb24iKTsKLQlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUgKCk7Ci0JZGVzdHJveV9pbm9kZWNhY2hlICgpOworICAgICAgZmFpbGVkX3JlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzOgorCXJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoInZlcnNpb24iKTsKKwlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUoKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAotZXhpdF9yZWlzZXJmc19mcyAoIHZvaWQgKQorc3RhdGljIHZvaWQgX19leGl0IGV4aXRfcmVpc2VyZnNfZnModm9pZCkKIHsKLSAgICAgICAgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKLQlyZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsICgidmVyc2lvbiIpOwotCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSAoKTsKLSAgICAgICAgdW5yZWdpc3Rlcl9maWxlc3lzdGVtICgmIHJlaXNlcmZzX2ZzX3R5cGUpOwotCWRlc3Ryb3lfaW5vZGVjYWNoZSAoKTsKKwlyZWlzZXJmc194YXR0cl91bnJlZ2lzdGVyX2hhbmRsZXJzKCk7CisJcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCgidmVyc2lvbiIpOworCXJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSgpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmVpc2VyZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CiB9CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJlaXNlcmZzX2ZzX3R5cGUgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5uYW1lCQk9ICJyZWlzZXJmcyIsCi0JLmdldF9zYgkJPSBnZXRfc3VwZXJfYmxvY2ssCi0JLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAotCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJyZWlzZXJmcyIsCisJLmdldF9zYiA9IGdldF9zdXBlcl9ibG9jaywKKwkua2lsbF9zYiA9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzID0gRlNfUkVRVUlSRVNfREVWLAogfTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OICgiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKLU1PRFVMRV9BVVRIT1IgICAgICAoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSAgICAgKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVpc2VyRlMgam91cm5hbGVkIGZpbGVzeXN0ZW0iKTsKK01PRFVMRV9BVVRIT1IoIkhhbnMgUmVpc2VyIDxyZWlzZXJAbmFtZXN5cy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLW1vZHVsZV9pbml0IChpbml0X3JlaXNlcmZzX2ZzKTsKLW1vZHVsZV9leGl0IChleGl0X3JlaXNlcmZzX2ZzKTsKK21vZHVsZV9pbml0KGluaXRfcmVpc2VyZnNfZnMpOworbW9kdWxlX2V4aXQoZXhpdF9yZWlzZXJmc19mcyk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCmluZGV4IDYxOTE5MDkuLmM5MmUxMjQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCisrKyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCkBAIC0xMSwxNTYgKzExLDE1OSBAQAogLyogYWNjZXNzIHRvIHRhaWwgOiB3aGVuIG9uZSBpcyBnb2luZyB0byByZWFkIHRhaWwgaXQgbXVzdCBtYWtlIHN1cmUsIHRoYXQgaXMgbm90IHJ1bm5pbmcuCiAgZGlyZWN0MmluZGlyZWN0IGFuZCBpbmRpcmVjdDJkaXJlY3QgY2FuIG5vdCBydW4gY29uY3VycmVudGx5ICovCiAKLQogLyogQ29udmVydHMgZGlyZWN0IGl0ZW1zIHRvIGFuIHVuZm9ybWF0dGVkIG5vZGUuIFBhbmljcyBpZiBmaWxlIGhhcyBubwogICAgdGFpbC4gLUVOT1NQQyBpZiBubyBkaXNrIHNwYWNlIGZvciBjb252ZXJzaW9uICovCiAvKiBwYXRoIHBvaW50cyB0byBmaXJzdCBkaXJlY3QgaXRlbSBvZiB0aGUgZmlsZSByZWdhcmxlc3Mgb2YgaG93IG1hbnkgb2YKICAgIHRoZW0gYXJlIHRoZXJlICovCi1pbnQgZGlyZWN0MmluZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICogaW5vZGUsIAotCQkgICAgIHN0cnVjdCBwYXRoICogcGF0aCwgc3RydWN0IGJ1ZmZlcl9oZWFkICogdW5iaCwKLQkJICAgICBsb2ZmX3QgdGFpbF9vZmZzZXQpCitpbnQgZGlyZWN0MmluZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBidWZmZXJfaGVhZCAqdW5iaCwKKwkJICAgIGxvZmZfdCB0YWlsX29mZnNldCkKIHsKLSAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdXBfdG9fZGF0ZV9iaCA7Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOwotICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfdGFpbCA9IDAgOwotICAgIHN0cnVjdCBjcHVfa2V5IGVuZF9rZXk7ICAvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQotCQkJCWNvbnZlcnRlZCBpdGVtLiAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOyAvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLwotICAgIGludAluX2Jsa19zaXplLAotICAgICAgbl9yZXR2YWw7CSAgLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KLSAgICB1bnBfdCB1bmZtX3B0cjsgIC8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCi0JCQkJICAgICAgIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUKLQkJCQkgICAgICAgdHJlZS4gKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICp1cF90b19kYXRlX2JoOworCXN0cnVjdCBpdGVtX2hlYWQgKnBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocGF0aCk7CisJdW5zaWduZWQgbG9uZyB0b3RhbF90YWlsID0gMDsKKwlzdHJ1Y3QgY3B1X2tleSBlbmRfa2V5OwkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQorCQkJCSAgIGNvbnZlcnRlZCBpdGVtLiAqLworCXN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOwkvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgorCQkJCQkgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLworCWludCBuX2Jsa19zaXplLCBuX3JldHZhbDsJLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KKwl1bnBfdCB1bmZtX3B0cjsJCS8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCisJCQkJICAgdGhhdCB3aWxsIGJlIGluc2VydGVkIGluIHRoZQorCQkJCSAgIHRyZWUuICovCiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRUlTRVJGU19TQihzYiktPnNfZGlyZWN0MmluZGlyZWN0ICsrOworCVJFSVNFUkZTX1NCKHNiKS0+c19kaXJlY3QyaW5kaXJlY3QrKzsKIAotICAgIG5fYmxrX3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJbl9ibGtfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAotICAgIC8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldwotICAgICAgIHVuZm9ybWF0dGVkIG5vZGUuICovCi0gICAgY29weV9pdGVtX2hlYWQgKCZpbmRfaWgsIHBfbGVfaWgpOwotICAgIHNldF9sZV9paF9rX29mZnNldCAoJmluZF9paCwgdGFpbF9vZmZzZXQpOwotICAgIHNldF9sZV9paF9rX3R5cGUgKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOworCS8qIGFuZCBrZXkgdG8gc2VhcmNoIGZvciBhcHBlbmQgb3IgaW5zZXJ0IHBvaW50ZXIgdG8gdGhlIG5ldworCSAgIHVuZm9ybWF0dGVkIG5vZGUuICovCisJY29weV9pdGVtX2hlYWQoJmluZF9paCwgcF9sZV9paCk7CisJc2V0X2xlX2loX2tfb2Zmc2V0KCZpbmRfaWgsIHRhaWxfb2Zmc2V0KTsKKwlzZXRfbGVfaWhfa190eXBlKCZpbmRfaWgsIFRZUEVfSU5ESVJFQ1QpOwogCi0gICAgLyogU2V0IHRoZSBrZXkgdG8gc2VhcmNoIGZvciB0aGUgcGxhY2UgZm9yIG5ldyB1bmZtIHBvaW50ZXIgKi8KLSAgICBtYWtlX2NwdV9rZXkgKCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOworCS8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIHBsYWNlIGZvciBuZXcgdW5mbSBwb2ludGVyICovCisJbWFrZV9jcHVfa2V5KCZlbmRfa2V5LCBpbm9kZSwgdGFpbF9vZmZzZXQsIFRZUEVfSU5ESVJFQ1QsIDQpOwogCi0gICAgLy8gRklYTUU6IHdlIGNvdWxkIGF2b2lkIHRoaXMgCi0gICAgaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAoc2IsICZlbmRfa2V5LCBwYXRoKSA9PSBQT1NJVElPTl9GT1VORCApIHsKLQlyZWlzZXJmc193YXJuaW5nIChzYiwgIlBBUC0xNDAzMDogZGlyZWN0MmluZGlyZWN0OiAiCi0JCQkicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCi0JCQkiVXNlIGZzY2sgdG8gcmVwYWlyLiIsICZlbmRfa2V5KTsKLQlwYXRocmVsc2UocGF0aCk7Ci0JcmV0dXJuIC1FSU87Ci0gICAgfQotICAgIAotICAgIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOwotCi0gICAgdW5mbV9wdHIgPSBjcHVfdG9fbGUzMiAodW5iaC0+Yl9ibG9ja25yKTsKLSAgICAKLSAgICBpZiAoIGlzX3N0YXRkYXRhX2xlX2loIChwX2xlX2loKSApICB7Ci0JLyogSW5zZXJ0IG5ldyBpbmRpcmVjdCBpdGVtLiAqLwotCXNldF9paF9mcmVlX3NwYWNlICgmaW5kX2loLCAwKTsgLyogZGVsZXRlIGF0IG5lYXJlc3QgZnV0dXJlICovCi0gICAgICAgIHB1dF9paF9pdGVtX2xlbiggJmluZF9paCwgVU5GTV9QX1NJWkUgKTsKLQlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpKys7Ci0Jbl9yZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKLQkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKLSAgICB9IGVsc2UgewotCS8qIFBhc3RlIGludG8gbGFzdCBpbmRpcmVjdCBpdGVtIG9mIGFuIG9iamVjdC4gKi8KLQluX3JldHZhbCA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLAotCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsIFVORk1fUF9TSVpFKTsKLSAgICB9Ci0gICAgaWYgKCBuX3JldHZhbCApIHsKLQlyZXR1cm4gbl9yZXR2YWw7Ci0gICAgfQotCi0gICAgLy8gbm90ZTogZnJvbSBoZXJlIHRoZXJlIGFyZSB0d28ga2V5cyB3aGljaCBoYXZlIG1hdGNoaW5nIGZpcnN0Ci0gICAgLy8gdGhyZWUga2V5IGNvbXBvbmVudHMuIFRoZXkgb25seSBkaWZmZXIgYnkgdGhlIGZvdXJ0aCBvbmUuCi0KLQotICAgIC8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLwotICAgIG1ha2VfY3B1X2tleSAoJmVuZF9rZXksIGlub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSksIFRZUEVfRElSRUNULCA0KTsKLQotICAgIC8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQotICAgICAgIGFuZCBkZWxldGUgdGhlbS4gKi8KLSAgICB3aGlsZSAoMSkgIHsKLQlpbnQgdGFpbF9zaXplOwotCi0JLyogZW5kX2tleS5rX29mZnNldCBpcyBzZXQgc28sIHRoYXQgd2Ugd2lsbCBhbHdheXMgaGF2ZSBmb3VuZAotICAgICAgICAgICBsYXN0IGl0ZW0gb2YgdGhlIGZpbGUgKi8KLQlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EICkKLQkgICAgcmVpc2VyZnNfcGFuaWMgKHNiLCAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKLQkJCSAgICAiZGlyZWN0IGl0ZW0gKCVLKSBub3QgZm91bmQiLCAmZW5kX2tleSk7Ci0JcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7Ci0JUkZBTFNFKCAhaXNfZGlyZWN0X2xlX2loIChwX2xlX2loKSwKLQkgICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCi0gICAgICAgICAgICAgICAgJmVuZF9rZXksIHBfbGVfaWgpOwotICAgICAgICB0YWlsX3NpemUgPSAobGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpICYgKG5fYmxrX3NpemUgLSAxKSkKLSAgICAgICAgICAgICsgaWhfaXRlbV9sZW4ocF9sZV9paCkgLSAxOwotCi0JLyogd2Ugb25seSBzZW5kIHRoZSB1bmJoIHBvaW50ZXIgaWYgdGhlIGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZS4KLQkqKiB0aGlzIGF2b2lkcyBvdmVyd3JpdGluZyBnb29kIGRhdGEgZnJvbSB3cml0ZXBhZ2UoKSB3aXRoIG9sZCBkYXRhCi0JKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKLQkqKiBTcGVjaWFsIGNhc2U6IHVuYmgtPmJfcGFnZSB3aWxsIGJlIE5VTEwgaWYgd2UgYXJlIGNvbWluZyB0aHJvdWdoCi0JKiogRElSRUNUX0lPIGhhbmRsZXIgaGVyZS4KLQkqLwotCWlmICghdW5iaC0+Yl9wYWdlIHx8IGJ1ZmZlcl91cHRvZGF0ZSh1bmJoKSB8fCBQYWdlVXB0b2RhdGUodW5iaC0+Yl9wYWdlKSkgewotCSAgICB1cF90b19kYXRlX2JoID0gTlVMTCA7Ci0JfSBlbHNlIHsKLQkgICAgdXBfdG9fZGF0ZV9iaCA9IHVuYmggOworCS8vIEZJWE1FOiB3ZSBjb3VsZCBhdm9pZCB0aGlzIAorCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoc2IsICJQQVAtMTQwMzA6IGRpcmVjdDJpbmRpcmVjdDogIgorCQkJCSAicGFzdGVkIG9yIGluc2VydGVkIGJ5dGUgZXhpc3RzIGluIHRoZSB0cmVlICVLLiAiCisJCQkJICJVc2UgZnNjayB0byByZXBhaXIuIiwgJmVuZF9rZXkpOworCQlwYXRocmVsc2UocGF0aCk7CisJCXJldHVybiAtRUlPOwogCX0KLQluX3JldHZhbCA9IHJlaXNlcmZzX2RlbGV0ZV9pdGVtICh0aCwgcGF0aCwgJmVuZF9rZXksIGlub2RlLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cF90b19kYXRlX2JoKSA7CiAKLQl0b3RhbF90YWlsICs9IG5fcmV0dmFsIDsKLQlpZiAodGFpbF9zaXplID09IG5fcmV0dmFsKQotCSAgICAvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKLQkgICAgYnJlYWs7CisJcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwYXRoKTsKIAotICAgIH0KLSAgICAvKiBpZiB3ZSd2ZSBjb3BpZWQgYnl0ZXMgZnJvbSBkaXNrIGludG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gemVybwotICAgICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQotICAgICovCi0gICAgaWYgKHVwX3RvX2RhdGVfYmgpIHsKLSAgICAgICAgdW5zaWduZWQgcGdvZmYgPSAodGFpbF9vZmZzZXQgKyB0b3RhbF90YWlsIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7Ci0JY2hhciAqa2FkZHI9a21hcF9hdG9taWModXBfdG9fZGF0ZV9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7Ci0JbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKSA7Ci0Ja3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotICAgIH0KKwl1bmZtX3B0ciA9IGNwdV90b19sZTMyKHVuYmgtPmJfYmxvY2tucik7CiAKLSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IFUzMl9NQVg7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loKHBfbGVfaWgpKSB7CisJCS8qIEluc2VydCBuZXcgaW5kaXJlY3QgaXRlbS4gKi8KKwkJc2V0X2loX2ZyZWVfc3BhY2UoJmluZF9paCwgMCk7CS8qIGRlbGV0ZSBhdCBuZWFyZXN0IGZ1dHVyZSAqLworCQlwdXRfaWhfaXRlbV9sZW4oJmluZF9paCwgVU5GTV9QX1NJWkUpOworCQlQQVRIX0xBU1RfUE9TSVRJT04ocGF0aCkrKzsKKwkJbl9yZXR2YWwgPQorCQkgICAgcmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsIHBhdGgsICZlbmRfa2V5LCAmaW5kX2loLCBpbm9kZSwKKwkJCQkJIChjaGFyICopJnVuZm1fcHRyKTsKKwl9IGVsc2UgeworCQkvKiBQYXN0ZSBpbnRvIGxhc3QgaW5kaXJlY3QgaXRlbSBvZiBhbiBvYmplY3QuICovCisJCW5fcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCBwYXRoLCAmZW5kX2tleSwgaW5vZGUsCisJCQkJCQkgICAgKGNoYXIgKikmdW5mbV9wdHIsCisJCQkJCQkgICAgVU5GTV9QX1NJWkUpOworCX0KKwlpZiAobl9yZXR2YWwpIHsKKwkJcmV0dXJuIG5fcmV0dmFsOworCX0KKwkvLyBub3RlOiBmcm9tIGhlcmUgdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QKKwkvLyB0aHJlZSBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91cnRoIG9uZS4KIAotICAgIHJldHVybiAwOworCS8qIFNldCB0aGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRpcmVjdCBpdGVtcyBvZiB0aGUgZmlsZSAqLworCW1ha2VfY3B1X2tleSgmZW5kX2tleSwgaW5vZGUsIG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpLCBUWVBFX0RJUkVDVCwKKwkJICAgICA0KTsKKworCS8qIE1vdmUgYnl0ZXMgZnJvbSB0aGUgZGlyZWN0IGl0ZW1zIHRvIHRoZSBuZXcgdW5mb3JtYXR0ZWQgbm9kZQorCSAgIGFuZCBkZWxldGUgdGhlbS4gKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgdGFpbF9zaXplOworCisJCS8qIGVuZF9rZXkua19vZmZzZXQgaXMgc2V0IHNvLCB0aGF0IHdlIHdpbGwgYWx3YXlzIGhhdmUgZm91bmQKKwkJICAgbGFzdCBpdGVtIG9mIHRoZSBmaWxlICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShzYiwgJmVuZF9rZXksIHBhdGgpID09CisJCSAgICBQT1NJVElPTl9GT1VORCkKKwkJCXJlaXNlcmZzX3BhbmljKHNiLAorCQkJCSAgICAgICAiUEFQLTE0MDUwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKKwkJCQkgICAgICAgImRpcmVjdCBpdGVtICglSykgbm90IGZvdW5kIiwgJmVuZF9rZXkpOworCQlwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEKHBhdGgpOworCQlSRkFMU0UoIWlzX2RpcmVjdF9sZV9paChwX2xlX2loKSwKKwkJICAgICAgICJ2cy0xNDA1NTogZGlyZWN0IGl0ZW0gZXhwZWN0ZWQoJUspLCBmb3VuZCAlaCIsCisJCSAgICAgICAmZW5kX2tleSwgcF9sZV9paCk7CisJCXRhaWxfc2l6ZSA9IChsZV9paF9rX29mZnNldChwX2xlX2loKSAmIChuX2Jsa19zaXplIC0gMSkpCisJCSAgICArIGloX2l0ZW1fbGVuKHBfbGVfaWgpIC0gMTsKKworCQkvKiB3ZSBvbmx5IHNlbmQgdGhlIHVuYmggcG9pbnRlciBpZiB0aGUgYnVmZmVyIGlzIG5vdCB1cCB0byBkYXRlLgorCQkgKiogdGhpcyBhdm9pZHMgb3ZlcndyaXRpbmcgZ29vZCBkYXRhIGZyb20gd3JpdGVwYWdlKCkgd2l0aCBvbGQgZGF0YQorCQkgKiogZnJvbSB0aGUgZGlzayBvciBidWZmZXIgY2FjaGUKKwkJICoqIFNwZWNpYWwgY2FzZTogdW5iaC0+Yl9wYWdlIHdpbGwgYmUgTlVMTCBpZiB3ZSBhcmUgY29taW5nIHRocm91Z2gKKwkJICoqIERJUkVDVF9JTyBoYW5kbGVyIGhlcmUuCisJCSAqLworCQlpZiAoIXVuYmgtPmJfcGFnZSB8fCBidWZmZXJfdXB0b2RhdGUodW5iaCkKKwkJICAgIHx8IFBhZ2VVcHRvZGF0ZSh1bmJoLT5iX3BhZ2UpKSB7CisJCQl1cF90b19kYXRlX2JoID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXVwX3RvX2RhdGVfYmggPSB1bmJoOworCQl9CisJCW5fcmV0dmFsID0gcmVpc2VyZnNfZGVsZXRlX2l0ZW0odGgsIHBhdGgsICZlbmRfa2V5LCBpbm9kZSwKKwkJCQkJCXVwX3RvX2RhdGVfYmgpOworCisJCXRvdGFsX3RhaWwgKz0gbl9yZXR2YWw7CisJCWlmICh0YWlsX3NpemUgPT0gbl9yZXR2YWwpCisJCQkvLyBkb25lOiBmaWxlIGRvZXMgbm90IGhhdmUgZGlyZWN0IGl0ZW1zIGFueW1vcmUKKwkJCWJyZWFrOworCisJfQorCS8qIGlmIHdlJ3ZlIGNvcGllZCBieXRlcyBmcm9tIGRpc2sgaW50byB0aGUgcGFnZSwgd2UgbmVlZCB0byB6ZXJvCisJICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQorCSAqLworCWlmICh1cF90b19kYXRlX2JoKSB7CisJCXVuc2lnbmVkIHBnb2ZmID0KKwkJICAgICh0YWlsX29mZnNldCArIHRvdGFsX3RhaWwgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyh1cF90b19kYXRlX2JoLT5iX3BhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCX0KKworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gVTMyX01BWDsKKworCXJldHVybiAwOwogfQogCi0KIC8qIHN0b2xlbiBmcm9tIGZzL2J1ZmZlci5jICovCi12b2lkIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7Ci0gICAgbG9ja19idWZmZXIoYmgpIDsKLSAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7Ci0gICAgICBCVUcoKSA7Ci0gICAgfQotICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOwotICAgIC8qIFJlbW92ZSB0aGUgYnVmZmVyIGZyb20gd2hhdGV2ZXIgbGlzdCBpdCBiZWxvbmdzIHRvLiBXZSBhcmUgbW9zdGx5Ci0gICAgICAgaW50ZXJlc3RlZCBpbiByZW1vdmluZyBpdCBmcm9tIHBlci1zYiBqX2RpcnR5X2J1ZmZlcnMgbGlzdCwgdG8gYXZvaWQKLSAgICAgICAgQlVHKCkgb24gYXR0ZW1wdCB0byB3cml0ZSBub3QgbWFwcGVkIGJ1ZmZlciAqLwotICAgIGlmICggKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGJoLT5iX3BhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKTsKLQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKLQlyZWlzZXJmc19mcmVlX2poKGJoKTsKLQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOwotICAgIH0KLSAgICBjbGVhcl9idWZmZXJfbWFwcGVkKGJoKSA7Ci0gICAgY2xlYXJfYnVmZmVyX3JlcShiaCkgOwotICAgIGNsZWFyX2J1ZmZlcl9uZXcoYmgpOwotICAgIGJoLT5iX2JkZXYgPSBOVUxMOwotICAgIHVubG9ja19idWZmZXIoYmgpIDsKK3ZvaWQgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJbG9ja19idWZmZXIoYmgpOworCWlmIChidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpIHsKKwkJQlVHKCk7CisJfQorCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJLyogUmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB3aGF0ZXZlciBsaXN0IGl0IGJlbG9uZ3MgdG8uIFdlIGFyZSBtb3N0bHkKKwkgICBpbnRlcmVzdGVkIGluIHJlbW92aW5nIGl0IGZyb20gcGVyLXNiIGpfZGlydHlfYnVmZmVycyBsaXN0LCB0byBhdm9pZAorCSAgIEJVRygpIG9uIGF0dGVtcHQgdG8gd3JpdGUgbm90IG1hcHBlZCBidWZmZXIgKi8KKwlpZiAoKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nLT5ob3N0OworCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpOworCQlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmYmgtPmJfYXNzb2NfYnVmZmVycyk7CisJCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCQlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCX0KKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoKTsKKwljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwliaC0+Yl9iZGV2ID0gTlVMTDsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKIH0KIAogLyogdGhpcyBmaXJzdCBsb2NrcyBpbm9kZSAobmVpdGhlciByZWFkcyBub3Igc3luYyBhcmUgcGVybWl0dGVkKSwKQEAgLTE2OSwxMDggKzE3MiwxMDggQEAKICAgIHdoYXQgd2UgZXhwZWN0IGZyb20gaXQgKG51bWJlciBvZiBjdXQgYnl0ZXMpLiBCdXQgd2hlbiB0YWlsIHJlbWFpbnMKICAgIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3ZSBzZXQgbW9kZSB0byBTS0lQX0JBTEFOQ0lORyBhbmQgdW5sb2NrCiAgICBpbm9kZSAqLwotaW50IGluZGlyZWN0MmRpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkgICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKLQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCi0JCSAgICAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KLQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIGxvb2sgZm9yIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciB0byBiZSBjdXQuICovCi0JCSAgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwgLyogTmV3IGZpbGUgc2l6ZS4gKi8KLQkJICAgICBjaGFyICogcF9jX21vZGUpCitpbnQgaW5kaXJlY3QyZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKnBfc19pbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYXRoICpwX3NfcGF0aCwJLyogcGF0aCB0byB0aGUgaW5kaXJlY3QgaXRlbS4gKi8KKwkJICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfaXRlbV9rZXksCS8qIEtleSB0byBsb29rIGZvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgdG8gYmUgY3V0LiAqLworCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSwJLyogTmV3IGZpbGUgc2l6ZS4gKi8KKwkJICAgIGNoYXIgKnBfY19tb2RlKQogewotICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiA9IHBfc19pbm9kZS0+aV9zYjsKLSAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICAgc19paDsKLSAgICB1bnNpZ25lZCBsb25nIG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgY2hhciAqIHRhaWw7Ci0gICAgaW50IHRhaWxfbGVuLCByb3VuZF90YWlsX2xlbjsKLSAgICBsb2ZmX3QgcG9zLCBwb3MxOyAvKiBwb3NpdGlvbiBvZiBmaXJzdCBieXRlIG9mIHRoZSB0YWlsICovCi0gICAgc3RydWN0IGNwdV9rZXkga2V5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworCXN0cnVjdCBpdGVtX2hlYWQgc19paDsKKwl1bnNpZ25lZCBsb25nIG5fYmxvY2tfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CisJY2hhciAqdGFpbDsKKwlpbnQgdGFpbF9sZW4sIHJvdW5kX3RhaWxfbGVuOworCWxvZmZfdCBwb3MsIHBvczE7CS8qIHBvc2l0aW9uIG9mIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KKwlzdHJ1Y3QgY3B1X2tleSBrZXk7CiAKLSAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisJQlVHX09OKCF0aC0+dF90cmFuc19pZCk7CiAKLSAgICBSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCArKzsKKwlSRUlTRVJGU19TQihwX3Nfc2IpLT5zX2luZGlyZWN0MmRpcmVjdCsrOwogCi0gICAgKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKwkqcF9jX21vZGUgPSBNX1NLSVBfQkFMQU5DSU5HOwogCi0gICAgLyogc3RvcmUgaXRlbSBoZWFkIHBhdGggcG9pbnRzIHRvLiAqLwotICAgIGNvcHlfaXRlbV9oZWFkICgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7Ci0KLSAgICB0YWlsX2xlbiA9IChuX25ld19maWxlX3NpemUgJiAobl9ibG9ja19zaXplIC0gMSkpOwotICAgIGlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbiAocF9zX2lub2RlKSA9PSBTVEFUX0RBVEFfVjIpCi0Jcm91bmRfdGFpbF9sZW4gPSBST1VORF9VUCAodGFpbF9sZW4pOwotICAgIGVsc2UKLQlyb3VuZF90YWlsX2xlbiA9IHRhaWxfbGVuOwotCi0gICAgcG9zID0gbGVfaWhfa19vZmZzZXQgKCZzX2loKSAtIDEgKyAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7Ci0gICAgcG9zMSA9IHBvczsKLQotICAgIC8vIHdlIGFyZSBwcm90ZWN0ZWQgYnkgaV9zZW0uIFRoZSB0YWlsIGNhbiBub3QgZGlzYXBwZXIsIG5vdAotICAgIC8vIGFwcGVuZCBjYW4gYmUgZG9uZSBlaXRoZXIKLSAgICAvLyB3ZSBhcmUgaW4gdHJ1bmNhdGUgb3IgcGFja2luZyB0YWlsIGluIGZpbGVfcmVsZWFzZQotCi0gICAgdGFpbCA9IChjaGFyICopa21hcChwYWdlKSA7IC8qIHRoaXMgY2FuIHNjaGVkdWxlICovCi0KLSAgICBpZiAocGF0aF9jaGFuZ2VkICgmc19paCwgcF9zX3BhdGgpKSB7Ci0JLyogcmUtc2VhcmNoIGluZGlyZWN0IGl0ZW0gKi8KLQlpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCApCi0JICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgIlBBUC01NTIwOiBpbmRpcmVjdDJkaXJlY3Q6ICIKLQkJCSAgICJpdGVtIHRvIGJlIGNvbnZlcnRlZCAlSyBkb2VzIG5vdCBleGlzdCIsIHBfc19pdGVtX2tleSk7CisJLyogc3RvcmUgaXRlbSBoZWFkIHBhdGggcG9pbnRzIHRvLiAqLwogCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKworCXRhaWxfbGVuID0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChuX2Jsb2NrX3NpemUgLSAxKSk7CisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKHBfc19pbm9kZSkgPT0gU1RBVF9EQVRBX1YyKQorCQlyb3VuZF90YWlsX2xlbiA9IFJPVU5EX1VQKHRhaWxfbGVuKTsKKwllbHNlCisJCXJvdW5kX3RhaWxfbGVuID0gdGFpbF9sZW47CisKKwlwb3MgPQorCSAgICBsZV9paF9rX29mZnNldCgmc19paCkgLSAxICsgKGloX2l0ZW1fbGVuKCZzX2loKSAvIFVORk1fUF9TSVpFIC0KKwkJCQkJIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlwb3MxID0gcG9zOworCisJLy8gd2UgYXJlIHByb3RlY3RlZCBieSBpX3NlbS4gVGhlIHRhaWwgY2FuIG5vdCBkaXNhcHBlciwgbm90CisJLy8gYXBwZW5kIGNhbiBiZSBkb25lIGVpdGhlcgorCS8vIHdlIGFyZSBpbiB0cnVuY2F0ZSBvciBwYWNraW5nIHRhaWwgaW4gZmlsZV9yZWxlYXNlCisKKwl0YWlsID0gKGNoYXIgKilrbWFwKHBhZ2UpOwkvKiB0aGlzIGNhbiBzY2hlZHVsZSAqLworCisJaWYgKHBhdGhfY2hhbmdlZCgmc19paCwgcF9zX3BhdGgpKSB7CisJCS8qIHJlLXNlYXJjaCBpbmRpcmVjdCBpdGVtICovCisJCWlmIChzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpCisJCSAgICA9PSBQT1NJVElPTl9OT1RfRk9VTkQpCisJCQlyZWlzZXJmc19wYW5pYyhwX3Nfc2IsCisJCQkJICAgICAgICJQQVAtNTUyMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkJICAgICAgICJpdGVtIHRvIGJlIGNvbnZlcnRlZCAlSyBkb2VzIG5vdCBleGlzdCIsCisJCQkJICAgICAgIHBfc19pdGVtX2tleSk7CisJCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKLQlwb3MgPSBsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSArIAotCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7Ci0JaWYgKHBvcyAhPSBwb3MxKQotCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCi0JCQkgICAgInRhaWwgcG9zaXRpb24gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIHJlYWRpbmcgaXQiKTsKKwkJcG9zID0gbGVfaWhfa19vZmZzZXQoJnNfaWgpIC0gMSArCisJCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLQorCQkgICAgIDEpICogcF9zX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJaWYgKHBvcyAhPSBwb3MxKQorCQkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkJICAgICAgICJ0YWlsIHBvc2l0aW9uIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSByZWFkaW5nIGl0Iik7CiAjZW5kaWYKLSAgICB9CisJfQogCisJLyogU2V0IGRpcmVjdCBpdGVtIGhlYWRlciB0byBpbnNlcnQuICovCisJbWFrZV9sZV9pdGVtX2hlYWQoJnNfaWgsIE5VTEwsIGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKHBfc19pbm9kZSksCisJCQkgIHBvczEgKyAxLCBUWVBFX0RJUkVDVCwgcm91bmRfdGFpbF9sZW4sCisJCQkgIDB4ZmZmZiAvKmloX2ZyZWVfc3BhY2UgKi8gKTsKIAotICAgIC8qIFNldCBkaXJlY3QgaXRlbSBoZWFkZXIgdG8gaW5zZXJ0LiAqLwotICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmc19paCwgTlVMTCwgZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKHBfc19pbm9kZSksIHBvczEgKyAxLAotCQkgICAgICAgVFlQRV9ESVJFQ1QsIHJvdW5kX3RhaWxfbGVuLCAweGZmZmYvKmloX2ZyZWVfc3BhY2UqLyk7CisJLyogd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgaW4gdGhlIHBhZ2UuCisJICoqIHRoZSBwYWdlIHdhcyBsb2NrZWQgYW5kIHRoaXMgcGFydCBvZiB0aGUgcGFnZSB3YXMgdXAgdG8gZGF0ZSB3aGVuCisJICoqIGluZGlyZWN0MmRpcmVjdCB3YXMgY2FsbGVkLCBzbyB3ZSBrbm93IHRoZSBieXRlcyBhcmUgc3RpbGwgdmFsaWQKKwkgKi8KKwl0YWlsID0gdGFpbCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwogCi0gICAgLyogd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhaWwgaW4gdGhlIHBhZ2UuCi0gICAgKiogdGhlIHBhZ2Ugd2FzIGxvY2tlZCBhbmQgdGhpcyBwYXJ0IG9mIHRoZSBwYWdlIHdhcyB1cCB0byBkYXRlIHdoZW4KLSAgICAqKiBpbmRpcmVjdDJkaXJlY3Qgd2FzIGNhbGxlZCwgc28gd2Uga25vdyB0aGUgYnl0ZXMgYXJlIHN0aWxsIHZhbGlkCi0gICAgKi8KLSAgICB0YWlsID0gdGFpbCArIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpIDsKKwlQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CiAKLSAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CisJa2V5ID0gKnBfc19pdGVtX2tleTsKKwlzZXRfY3B1X2tleV9rX3R5cGUoJmtleSwgVFlQRV9ESVJFQ1QpOworCWtleS5rZXlfbGVuZ3RoID0gNDsKKwkvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KKwlpZiAocmVpc2VyZnNfaW5zZXJ0X2l0ZW0odGgsIHBfc19wYXRoLCAma2V5LCAmc19paCwgcF9zX2lub2RlLAorCQkJCSB0YWlsID8gdGFpbCA6IE5VTEwpIDwgMCkgeworCQkvKiBObyBkaXNrIG1lbW9yeS4gU28gd2UgY2FuIG5vdCBjb252ZXJ0IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZQorCQkgICB0byB0aGUgZGlyZWN0IGl0ZW0uICBJbiB0aGlzIGNhc2Ugd2UgdXNlZCB0byBhZGp1c3QKKwkJICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKKwkJICAgdXNlZCwgaXQgd291bGQgYmUgaWRlYWwgdG8gd3JpdGUgemVyb3MgdG8gY29ycmVzcG9uZGluZworCQkgICB1bmZvcm1hdHRlZCBub2RlLiBGb3Igbm93IGlfc2l6ZSBpcyBjb25zaWRlcmVkIGFzIGd1YXJkIGZvcgorCQkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCisJCWt1bm1hcChwYWdlKTsKKwkJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOworCX0KKwlrdW5tYXAocGFnZSk7CiAKLSAgICBrZXkgPSAqcF9zX2l0ZW1fa2V5OwotICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoJmtleSwgVFlQRV9ESVJFQ1QpOwotICAgIGtleS5rZXlfbGVuZ3RoID0gNDsKLSAgICAvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KLSAgICBpZiAoIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCBwX3NfcGF0aCwgJmtleSwgJnNfaWgsIHBfc19pbm9kZSwKLQkJCSAgICAgIHRhaWwgPyB0YWlsIDogTlVMTCkgPCAwICkgewotCS8qIE5vIGRpc2sgbWVtb3J5LiBTbyB3ZSBjYW4gbm90IGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlCi0JICAgdG8gdGhlIGRpcmVjdCBpdGVtLiAgSW4gdGhpcyBjYXNlIHdlIHVzZWQgdG8gYWRqdXN0Ci0JICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKLQkgICB1c2VkLCBpdCB3b3VsZCBiZSBpZGVhbCB0byB3cml0ZSB6ZXJvcyB0byBjb3JyZXNwb25kaW5nCi0JICAgdW5mb3JtYXR0ZWQgbm9kZS4gRm9yIG5vdyBpX3NpemUgaXMgY29uc2lkZXJlZCBhcyBndWFyZCBmb3IKLQkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCi0Ja3VubWFwKHBhZ2UpIDsKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHRoZSBpX2Jsb2NrcyBjaGFuZ2VzIGZyb20gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKi8KKwlyZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKwkvLyBub3RlOiB3ZSBoYXZlIG5vdyB0aGUgc2FtZSBhcyBpbiBhYm92ZSBkaXJlY3QyaW5kaXJlY3QKKwkvLyBjb252ZXJzaW9uOiB0aGVyZSBhcmUgdHdvIGtleXMgd2hpY2ggaGF2ZSBtYXRjaGluZyBmaXJzdCB0aHJlZQorCS8vIGtleSBjb21wb25lbnRzLiBUaGV5IG9ubHkgZGlmZmVyIGJ5IHRoZSBmb3VodGggb25lLgorCisJLyogV2UgaGF2ZSBpbnNlcnRlZCBuZXcgZGlyZWN0IGl0ZW0gYW5kIG11c3QgcmVtb3ZlIGxhc3QKKwkgICB1bmZvcm1hdHRlZCBub2RlLiAqLworCSpwX2NfbW9kZSA9IE1fQ1VUOworCisJLyogd2Ugc3RvcmUgcG9zaXRpb24gb2YgZmlyc3QgZGlyZWN0IGl0ZW0gaW4gdGhlIGluLWNvcmUgaW5vZGUgKi8KKwkvL21hcmtfZmlsZV93aXRoX3RhaWwgKHBfc19pbm9kZSwgcG9zMSArIDEpOworCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IHBvczEgKyAxOworCiAJcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOwotICAgIH0KLSAgICBrdW5tYXAocGFnZSkgOwotCi0gICAgLyogbWFrZSBzdXJlIHRvIGdldCB0aGUgaV9ibG9ja3MgY2hhbmdlcyBmcm9tIHJlaXNlcmZzX2luc2VydF9pdGVtICovCi0gICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBwX3NfaW5vZGUpOwotCi0gICAgLy8gbm90ZTogd2UgaGF2ZSBub3cgdGhlIHNhbWUgYXMgaW4gYWJvdmUgZGlyZWN0MmluZGlyZWN0Ci0gICAgLy8gY29udmVyc2lvbjogdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QgdGhyZWUKLSAgICAvLyBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91aHRoIG9uZS4KLQotICAgIC8qIFdlIGhhdmUgaW5zZXJ0ZWQgbmV3IGRpcmVjdCBpdGVtIGFuZCBtdXN0IHJlbW92ZSBsYXN0Ci0gICAgICAgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KLSAgICAqcF9jX21vZGUgPSBNX0NVVDsKLQotICAgIC8qIHdlIHN0b3JlIHBvc2l0aW9uIG9mIGZpcnN0IGRpcmVjdCBpdGVtIGluIHRoZSBpbi1jb3JlIGlub2RlICovCi0gICAgLy9tYXJrX2ZpbGVfd2l0aF90YWlsIChwX3NfaW5vZGUsIHBvczEgKyAxKTsKLSAgICBSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBwb3MxICsgMTsKLQotICAgIHJldHVybiBuX2Jsb2NrX3NpemUgLSByb3VuZF90YWlsX2xlbjsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMgYi9mcy9yZWlzZXJmcy94YXR0ci5jCmluZGV4IDQ1NTgyZmUuLmUzODZkM2QgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3hhdHRyLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHIuYwpAQCAtNTEsNjcgKzUxLDY4IEBACiAjZGVmaW5lIFBSSVZST09UX05BTUUgIi5yZWlzZXJmc19wcml2IgogI2RlZmluZSBYQVJPT1RfTkFNRSAgICJ4YXR0cnMiCiAKLXN0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAoY29uc3QgY2hhciAqcHJlZml4KTsKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChjb25zdCBjaGFyCisJCQkJCQkJCSpwcmVmaXgpOwogCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqCi1jcmVhdGVfeGFfcm9vdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjcmVhdGVfeGFfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotICAgIHN0cnVjdCBkZW50cnkgKnByaXZyb290ID0gZGdldCAoUkVJU0VSRlNfU0Ioc2IpLT5wcml2X3Jvb3QpOwotICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQoUkVJU0VSRlNfU0Ioc2IpLT5wcml2X3Jvb3QpOworCXN0cnVjdCBkZW50cnkgKnhhcm9vdDsKIAotICAgIC8qIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZCBhdCBtb3VudC10aW1lICovCi0gICAgaWYgKCFwcml2cm9vdCkKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCS8qIFRoaXMgbmVlZHMgdG8gYmUgY3JlYXRlZCBhdCBtb3VudC10aW1lICovCisJaWYgKCFwcml2cm9vdCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOwogCi0gICAgeGFyb290ID0gbG9va3VwX29uZV9sZW4gKFhBUk9PVF9OQU1FLCBwcml2cm9vdCwgc3RybGVuIChYQVJPT1RfTkFNRSkpOwotICAgIGlmIChJU19FUlIgKHhhcm9vdCkpIHsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIGlmICgheGFyb290LT5kX2lub2RlKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGRvd24gKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9zZW0pOwotICAgICAgICBlcnIgPSBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIgKHByaXZyb290LT5kX2lub2RlLCB4YXJvb3QsIDA3MDApOwotICAgICAgICB1cCAoJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJeGFyb290ID0gbG9va3VwX29uZV9sZW4oWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4oWEFST09UX05BTUUpKTsKKwlpZiAoSVNfRVJSKHhhcm9vdCkpIHsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICgheGFyb290LT5kX2lub2RlKSB7CisJCWludCBlcnI7CisJCWRvd24oJnByaXZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJCWVyciA9CisJCSAgICBwcml2cm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIocHJpdnJvb3QtPmRfaW5vZGUsIHhhcm9vdCwKKwkJCQkJCSAgIDA3MDApOworCQl1cCgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBkcHV0ICh4YXJvb3QpOwotICAgICAgICAgICAgZHB1dCAocHJpdnJvb3QpOwotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7Ci0gICAgICAgIH0KLSAgICAgICAgUkVJU0VSRlNfU0Ioc2IpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKLSAgICB9CisJCWlmIChlcnIpIHsKKwkJCWRwdXQoeGFyb290KTsKKwkJCWRwdXQocHJpdnJvb3QpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJfQorCQlSRUlTRVJGU19TQihzYiktPnhhdHRyX3Jvb3QgPSBkZ2V0KHhhcm9vdCk7CisJfQogCi1vdXQ6Ci0gICAgZHB1dCAocHJpdnJvb3QpOwotICAgIHJldHVybiB4YXJvb3Q7CisgICAgICBvdXQ6CisJZHB1dChwcml2cm9vdCk7CisJcmV0dXJuIHhhcm9vdDsKIH0KIAogLyogVGhpcyB3aWxsIHJldHVybiBhIGRlbnRyeSwgb3IgZXJyb3IsIHJlZmVyaW5nIHRvIHRoZSB4YSByb290IGRpcmVjdG9yeS4KICAqIElmIHRoZSB4YSByb290IGRvZXNuJ3QgZXhpc3QgeWV0LCB0aGUgZGVudHJ5IHdpbGwgYmUgcmV0dXJuZWQgd2l0aG91dAogICogYW4gYXNzb2NpYXRlZCBpbm9kZS4gVGhpcyBkZW50cnkgY2FuIGJlIHVzZWQgd2l0aCAtPm1rZGlyIHRvIGNyZWF0ZQogICogdGhlIHhhIGRpcmVjdG9yeS4gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLV9fZ2V0X3hhX3Jvb3QgKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpfX2dldF94YV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQgKFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOwotICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqcHJpdnJvb3QgPSBkZ2V0KFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpOworCXN0cnVjdCBkZW50cnkgKnhhcm9vdCA9IE5VTEw7CiAKLSAgICBpZiAoSVNfRVJSIChwcml2cm9vdCkgfHwgIXByaXZyb290KQotICAgICAgICByZXR1cm4gcHJpdnJvb3Q7CisJaWYgKElTX0VSUihwcml2cm9vdCkgfHwgIXByaXZyb290KQorCQlyZXR1cm4gcHJpdnJvb3Q7CiAKLSAgICB4YXJvb3QgPSBsb29rdXBfb25lX2xlbiAoWEFST09UX05BTUUsIHByaXZyb290LCBzdHJsZW4gKFhBUk9PVF9OQU1FKSk7Ci0gICAgaWYgKElTX0VSUiAoeGFyb290KSkgewotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCF4YXJvb3QtPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgeGFyb290ID0gTlVMTDsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCXhhcm9vdCA9IGxvb2t1cF9vbmVfbGVuKFhBUk9PVF9OQU1FLCBwcml2cm9vdCwgc3RybGVuKFhBUk9PVF9OQU1FKSk7CisJaWYgKElTX0VSUih4YXJvb3QpKSB7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIXhhcm9vdC0+ZF9pbm9kZSkgeworCQlkcHV0KHhhcm9vdCk7CisJCXhhcm9vdCA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KIAotICAgIFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290ID0gZGdldCAoeGFyb290KTsKKwlSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCA9IGRnZXQoeGFyb290KTsKIAotb3V0OgotICAgIGRwdXQgKHByaXZyb290KTsKLSAgICByZXR1cm4geGFyb290OworICAgICAgb3V0OgorCWRwdXQocHJpdnJvb3QpOworCXJldHVybiB4YXJvb3Q7CiB9CiAKIC8qIFJldHVybnMgdGhlIGRlbnRyeSAob3IgTlVMTCkgcmVmZXJyaW5nIHRvIHRoZSByb290IG9mIHRoZSBleHRlbmRlZApAQCAtMTE5LDE0NyArMTIwLDE0NSBAQAogICogT3RoZXJ3aXNlLCB3ZSBhdHRlbXB0IHRvIHJldHJlaXZlIGl0IGZyb20gZGlzay4gSXQgbWF5IGFsc28gcmV0dXJuCiAgKiBhIHBvaW50ZXItZW5jb2RlZCBlcnJvci4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICoKLWdldF94YV9yb290IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmdldF94YV9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZ2V0IChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZGdldChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CiAKLSAgICBpZiAoIWRlbnRyeSkKLSAgICAgICAgZGVudHJ5ID0gX19nZXRfeGFfcm9vdCAocyk7CisJaWYgKCFkZW50cnkpCisJCWRlbnRyeSA9IF9fZ2V0X3hhX3Jvb3Qocyk7CiAKLSAgICByZXR1cm4gZGVudHJ5OworCXJldHVybiBkZW50cnk7CiB9CiAKIC8qIE9wZW5zIHRoZSBkaXJlY3RvcnkgY29ycmVzcG9uZGluZyB0byB0aGUgaW5vZGUncyBleHRlbmRlZCBhdHRyaWJ1dGUgc3RvcmUuCiAgKiBJZiBmbGFncyBhbGxvdywgdGhlIHRyZWUgdG8gdGhlIGRpcmVjdG9yeSBtYXkgYmUgY3JlYXRlZC4gSWYgY3JlYXRpb24gaXMKICAqIHByb2hpYml0ZWQsIC1FTk9EQVRBIGlzIHJldHVybmVkLiAqLwotc3RhdGljIHN0cnVjdCBkZW50cnkgKgotb3Blbl94YV9kaXIgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVuX3hhX2Rpcihjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCiB7Ci0gICAgc3RydWN0IGRlbnRyeSAqeGFyb290LCAqeGFkaXI7Ci0gICAgY2hhciBuYW1lYnVmWzE3XTsKKwlzdHJ1Y3QgZGVudHJ5ICp4YXJvb3QsICp4YWRpcjsKKwljaGFyIG5hbWVidWZbMTddOwogCi0gICAgeGFyb290ID0gZ2V0X3hhX3Jvb3QgKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoSVNfRVJSICh4YXJvb3QpKSB7Ci0gICAgICAgIHJldHVybiB4YXJvb3Q7Ci0gICAgfSBlbHNlIGlmICgheGFyb290KSB7Ci0gICAgICAgIGlmIChmbGFncyA9PSAwIHx8IGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7Ci0gICAgICAgICAgICB4YXJvb3QgPSBjcmVhdGVfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgaWYgKElTX0VSUiAoeGFyb290KSkKLSAgICAgICAgICAgICAgICByZXR1cm4geGFyb290OwotICAgICAgICB9Ci0gICAgICAgIGlmICgheGFyb290KQotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9EQVRBKTsKLSAgICB9CisJeGFyb290ID0gZ2V0X3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCWlmIChJU19FUlIoeGFyb290KSkgeworCQlyZXR1cm4geGFyb290OworCX0gZWxzZSBpZiAoIXhhcm9vdCkgeworCQlpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJeGFyb290ID0gY3JlYXRlX3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCQkJaWYgKElTX0VSUih4YXJvb3QpKQorCQkJCXJldHVybiB4YXJvb3Q7CisJCX0KKwkJaWYgKCF4YXJvb3QpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQogCi0gICAgLyogb2ssIHdlIGhhdmUgeGFyb290IG9wZW4gKi8KKwkvKiBvaywgd2UgaGF2ZSB4YXJvb3Qgb3BlbiAqLwogCi0gICAgc25wcmludGYgKG5hbWVidWYsIHNpemVvZiAobmFtZWJ1ZiksICIlWC4lWCIsCi0gICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfb2JqZWN0aWQpLAotICAgICAgICAgICAgICBpbm9kZS0+aV9nZW5lcmF0aW9uKTsKLSAgICB4YWRpciA9IGxvb2t1cF9vbmVfbGVuIChuYW1lYnVmLCB4YXJvb3QsIHN0cmxlbiAobmFtZWJ1ZikpOwotICAgIGlmIChJU19FUlIgKHhhZGlyKSkgewotICAgICAgICBkcHV0ICh4YXJvb3QpOwotICAgICAgICByZXR1cm4geGFkaXI7Ci0gICAgfQorCXNucHJpbnRmKG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSwgIiVYLiVYIiwKKwkJIGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkKSwKKwkJIGlub2RlLT5pX2dlbmVyYXRpb24pOworCXhhZGlyID0gbG9va3VwX29uZV9sZW4obmFtZWJ1ZiwgeGFyb290LCBzdHJsZW4obmFtZWJ1ZikpOworCWlmIChJU19FUlIoeGFkaXIpKSB7CisJCWRwdXQoeGFyb290KTsKKwkJcmV0dXJuIHhhZGlyOworCX0KIAotICAgIGlmICgheGFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgaWYgKGZsYWdzID09IDAgfHwgZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKLSAgICAgICAgICAgIC8qIEFsdGhvdWdoIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0cnlpbmcgdG8gY3JlYXRlIHRoaXMgZGlyZWN0b3J5LAotICAgICAgICAgICAgICogYW5vdGhlciBkaXJlY3Rvcnkgd2l0aCB0aGUgc2FtZSBoYXNoIG1heSBiZSBjcmVhdGVkLCBzbyB3ZSBuZWVkCi0gICAgICAgICAgICAgKiB0byBwcm90ZWN0IGFnYWluc3QgdGhhdCAqLwotICAgICAgICAgICAgZXJyID0geGFyb290LT5kX2lub2RlLT5pX29wLT5ta2RpciAoeGFyb290LT5kX2lub2RlLCB4YWRpciwgMDcwMCk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgICAgICAgICBkcHV0ICh4YWRpcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF4YWRpci0+ZF9pbm9kZSkgewotICAgICAgICAgICAgZHB1dCAoeGFyb290KTsKLSAgICAgICAgICAgIGRwdXQgKHhhZGlyKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJfUFRSICgtRU5PREFUQSk7Ci0gICAgICAgIH0KLSAgICB9CisJaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworCQlpbnQgZXJyOworCQlpZiAoZmxhZ3MgPT0gMCB8fCBmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJLyogQWx0aG91Z2ggdGhlcmUgaXMgbm90aGluZyBlbHNlIHRyeWluZyB0byBjcmVhdGUgdGhpcyBkaXJlY3RvcnksCisJCQkgKiBhbm90aGVyIGRpcmVjdG9yeSB3aXRoIHRoZSBzYW1lIGhhc2ggbWF5IGJlIGNyZWF0ZWQsIHNvIHdlIG5lZWQKKwkJCSAqIHRvIHByb3RlY3QgYWdhaW5zdCB0aGF0ICovCisJCQllcnIgPQorCQkJICAgIHhhcm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIoeGFyb290LT5kX2lub2RlLCB4YWRpciwKKwkJCQkJCQkgMDcwMCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZHB1dCh4YXJvb3QpOworCQkJCWRwdXQoeGFkaXIpOworCQkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCQl9CisJCX0KKwkJaWYgKCF4YWRpci0+ZF9pbm9kZSkgeworCQkJZHB1dCh4YXJvb3QpOworCQkJZHB1dCh4YWRpcik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJCX0KKwl9CiAKLSAgICBkcHV0ICh4YXJvb3QpOwotICAgIHJldHVybiB4YWRpcjsKKwlkcHV0KHhhcm9vdCk7CisJcmV0dXJuIHhhZGlyOwogfQogCiAvKiBSZXR1cm5zIGEgZGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBleHRlbmRlZCBhdHRyaWJ1dGUgZmlsZQogICogZm9yIHRoZSBpbm9kZS4gSWYgZmxhZ3MgYWxsb3csIHRoZSBmaWxlIGlzIGNyZWF0ZWQuIE90aGVyd2lzZSwgYQogICogdmFsaWQgb3IgbmVnYXRpdmUgZGVudHJ5LCBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKLWdldF94YV9maWxlX2RlbnRyeSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF94YV9maWxlX2RlbnRyeShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQogewotICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOwotICAgIGludCBlcnIgPSAwOworCXN0cnVjdCBkZW50cnkgKnhhZGlyLCAqeGFmaWxlOworCWludCBlcnIgPSAwOwogCi0gICAgeGFkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSICh4YWRpcikpIHsKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZGlyKSk7Ci0gICAgfSBlbHNlIGlmICh4YWRpciAmJiAheGFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoeGFkaXIpOwotICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwl4YWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBmbGFncyk7CisJaWYgKElTX0VSUih4YWRpcikpIHsKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUih4YWRpcikpOworCX0gZWxzZSBpZiAoeGFkaXIgJiYgIXhhZGlyLT5kX2lub2RlKSB7CisJCWRwdXQoeGFkaXIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQogCi0gICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBzdHJsZW4gKG5hbWUpKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKSB7Ci0gICAgICAgIGRwdXQgKHhhZGlyKTsKLSAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZmlsZSkpOwotICAgIH0KKwl4YWZpbGUgPSBsb29rdXBfb25lX2xlbihuYW1lLCB4YWRpciwgc3RybGVuKG5hbWUpKTsKKwlpZiAoSVNfRVJSKHhhZmlsZSkpIHsKKwkJZHB1dCh4YWRpcik7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJfQogCi0gICAgaWYgKHhhZmlsZS0+ZF9pbm9kZSkgeyAvKiBmaWxlIGV4aXN0cyAqLwotICAgICAgICBpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKLSAgICAgICAgICAgIGVyciA9IC1FRVhJU1Q7Ci0gICAgICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSB8fCBmbGFncyAmIEZMX1JFQURPTkxZKSB7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGlub2RlLT5pX3NlbSBpcyBkb3duLCBzbyBub3RoaW5nIGVsc2UgY2FuIHRyeSB0byBjcmVhdGUKLSAgICAgICAgICogdGhlIHNhbWUgeGF0dHIgKi8KLSAgICAgICAgZXJyID0geGFkaXItPmRfaW5vZGUtPmlfb3AtPmNyZWF0ZSAoeGFkaXItPmRfaW5vZGUsIHhhZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDcwMHxTX0lGUkVHLCBOVUxMKTsKKwlpZiAoeGFmaWxlLT5kX2lub2RlKSB7CS8qIGZpbGUgZXhpc3RzICovCisJCWlmIChmbGFncyAmIFhBVFRSX0NSRUFURSkgeworCQkJZXJyID0gLUVFWElTVDsKKwkJCWRwdXQoeGFmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UgfHwgZmxhZ3MgJiBGTF9SRUFET05MWSkgeworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQkvKiBpbm9kZS0+aV9zZW0gaXMgZG93biwgc28gbm90aGluZyBlbHNlIGNhbiB0cnkgdG8gY3JlYXRlCisJCSAqIHRoZSBzYW1lIHhhdHRyICovCisJCWVyciA9IHhhZGlyLT5kX2lub2RlLT5pX29wLT5jcmVhdGUoeGFkaXItPmRfaW5vZGUsIHhhZmlsZSwKKwkJCQkJCSAgIDA3MDAgfCBTX0lGUkVHLCBOVUxMKTsKIAotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9CisJCWlmIChlcnIpIHsKKwkJCWRwdXQoeGFmaWxlKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQogCi1vdXQ6Ci0gICAgZHB1dCAoeGFkaXIpOwotICAgIGlmIChlcnIpCi0gICAgICAgIHhhZmlsZSA9IEVSUl9QVFIgKGVycik7Ci0gICAgcmV0dXJuIHhhZmlsZTsKKyAgICAgIG91dDoKKwlkcHV0KHhhZGlyKTsKKwlpZiAoZXJyKQorCQl4YWZpbGUgPSBFUlJfUFRSKGVycik7CisJcmV0dXJuIHhhZmlsZTsKIH0KIAotCiAvKiBPcGVucyBhIGZpbGUgcG9pbnRlciB0byB0aGUgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBpbm9kZSAqLwotc3RhdGljIHN0cnVjdCBmaWxlICoKLW9wZW5feGFfZmlsZSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBmaWxlICpvcGVuX3hhX2ZpbGUoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgaW50IGZsYWdzKQogewotICAgIHN0cnVjdCBkZW50cnkgKnhhZmlsZTsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqeGFmaWxlOworCXN0cnVjdCBmaWxlICpmcDsKIAotICAgIHhhZmlsZSA9IGdldF94YV9maWxlX2RlbnRyeSAoaW5vZGUsIG5hbWUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQotICAgICAgICByZXR1cm4gRVJSX1BUUiAoUFRSX0VSUiAoeGFmaWxlKSk7Ci0gICAgZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgewotICAgICAgICBkcHV0ICh4YWZpbGUpOwotICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwl4YWZpbGUgPSBnZXRfeGFfZmlsZV9kZW50cnkoaW5vZGUsIG5hbWUsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKHhhZmlsZSkpCisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoeGFmaWxlKSk7CisJZWxzZSBpZiAoIXhhZmlsZS0+ZF9pbm9kZSkgeworCQlkcHV0KHhhZmlsZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKKwl9CiAKLSAgICBmcCA9IGRlbnRyeV9vcGVuICh4YWZpbGUsIE5VTEwsIE9fUkRXUik7Ci0gICAgLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCWZwID0gZGVudHJ5X29wZW4oeGFmaWxlLCBOVUxMLCBPX1JEV1IpOworCS8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KIAotICAgIHJldHVybiBmcDsKKwlyZXR1cm4gZnA7CiB9CiAKLQogLyoKICAqIHRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGZzL3JlaXNlcmZzL2Rpci5jOnJlaXNlcmZzX3JlYWRkaXIsIGJ1dAogICogd2UgbmVlZCB0byBkcm9wIHRoZSBwYXRoIGJlZm9yZSBjYWxsaW5nIHRoZSBmaWxsZGlyIHN0cnVjdC4gIFRoYXQKQEAgLTI3MywxMzkgKzI3MiwxNDYgQEAKICAqIHdlJ3JlIGNhbGxlZCB3aXRoIGlfc2VtIGhlbGQsIHNvIHRoZXJlIGFyZSBubyB3b3JyaWVzIGFib3V0IHRoZSBkaXJlY3RvcnkKICAqIGNoYW5naW5nIHVuZGVybmVhdGggdXMuCiAgKi8KLXN0YXRpYyBpbnQgX194YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCitzdGF0aWMgaW50IF9feGF0dHJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KLSAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fZW50cnkpOwotICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotICAgIGludCBlbnRyeV9udW07Ci0gICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7Ci0gICAgaW50IHNlYXJjaF9yZXM7Ci0gICAgY2hhciAqIGxvY2FsX2J1ZjsKLSAgICBsb2ZmX3QgbmV4dF9wb3M7Ci0gICAgY2hhciBzbWFsbF9idWZbMzJdIDsgLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KLSAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOwotICAgIGludCBkX3JlY2xlbjsKLSAgICBjaGFyICogZF9uYW1lOwotICAgIG9mZl90IGRfb2ZmOwotICAgIGlub190IGRfaW5vOwotICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjcHVfa2V5IHBvc19rZXk7CS8qIGtleSBvZiBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBkaXJlY3RvcnkgKGtleSBvZiBkaXJlY3RvcnkgZW50cnkpICovCisJSU5JVElBTElaRV9QQVRIKHBhdGhfdG9fZW50cnkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVudHJ5X251bTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loOworCWludCBzZWFyY2hfcmVzOworCWNoYXIgKmxvY2FsX2J1ZjsKKwlsb2ZmX3QgbmV4dF9wb3M7CisJY2hhciBzbWFsbF9idWZbMzJdOwkvKiBhdm9pZCBrbWFsbG9jIGlmIHdlIGNhbiAqLworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CisJaW50IGRfcmVjbGVuOworCWNoYXIgKmRfbmFtZTsKKwlvZmZfdCBkX29mZjsKKwlpbm9fdCBkX2lubzsKKwlzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOwogCisJLyogZm9ybSBrZXkgZm9yIHNlYXJjaCB0aGUgbmV4dCBkaXJlY3RvcnkgZW50cnkgdXNpbmcgZl9wb3MgZmllbGQgb2YKKwkgICBmaWxlIHN0cnVjdHVyZSAqLworCW5leHRfcG9zID0gbWF4X3JlaXNlcmZzX29mZnNldChpbm9kZSk7CiAKLSAgICAvKiBmb3JtIGtleSBmb3Igc2VhcmNoIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSB1c2luZyBmX3BvcyBmaWVsZCBvZgotICAgICAgIGZpbGUgc3RydWN0dXJlICovCi0gICAgbmV4dF9wb3MgPSBtYXhfcmVpc2VyZnNfb2Zmc2V0KGlub2RlKTsKKwl3aGlsZSAoMSkgeworCSAgICAgIHJlc2VhcmNoOgorCQlpZiAobmV4dF9wb3MgPD0gRE9UX0RPVF9PRkZTRVQpCisJCQlicmVhazsKKwkJbWFrZV9jcHVfa2V5KCZwb3Nfa2V5LCBpbm9kZSwgbmV4dF9wb3MsIFRZUEVfRElSRU5UUlksIDMpOwogCi0gICAgd2hpbGUgKDEpIHsKLXJlc2VhcmNoOgotCWlmIChuZXh0X3BvcyA8PSBET1RfRE9UX09GRlNFVCkKLQkgICAgYnJlYWs7Ci0JbWFrZV9jcHVfa2V5ICgmcG9zX2tleSwgaW5vZGUsIG5leHRfcG9zLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwkJc2VhcmNoX3JlcyA9CisJCSAgICBzZWFyY2hfYnlfZW50cnlfa2V5KGlub2RlLT5pX3NiLCAmcG9zX2tleSwgJnBhdGhfdG9fZW50cnksCisJCQkJCSZkZSk7CisJCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7CisJCQkvLyBGSVhNRTogd2UgY291bGQganVzdCBza2lwIHBhcnQgb2YgZGlyZWN0b3J5IHdoaWNoIGNvdWxkCisJCQkvLyBub3QgYmUgcmVhZAorCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAKLQlzZWFyY2hfcmVzID0gc2VhcmNoX2J5X2VudHJ5X2tleShpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LCAmZGUpOwotCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7Ci0JICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKLQkgICAgLy8gbm90IGJlIHJlYWQKLQkgICAgcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKLQkgICAgcmV0dXJuIC1FSU87Ci0JfQorCQlpZiAoc2VhcmNoX3JlcyA9PSBOQU1FX05PVF9GT1VORCkKKwkJCWRlLmRlX2VudHJ5X251bS0tOwogCi0JaWYgKHNlYXJjaF9yZXMgPT0gTkFNRV9OT1RfRk9VTkQpCi0JICAgIGRlLmRlX2VudHJ5X251bS0tOworCQlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmZGUpOworCQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07CisJCWRlaCA9ICYoZGUuZGVfZGVoW2VudHJ5X251bV0pOwogCi0Jc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oJmRlKTsKLQllbnRyeV9udW0gPSBkZS5kZV9lbnRyeV9udW07Ci0JZGVoID0gJihkZS5kZV9kZWhbZW50cnlfbnVtXSk7CisJCWJoID0gZGUuZGVfYmg7CisJCWloID0gZGUuZGVfaWg7CiAKLQliaCA9IGRlLmRlX2JoOwotCWloID0gZGUuZGVfaWg7CisJCWlmICghaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CisJCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAibm90IGRpcmVudHJ5ICVoIiwgaWgpOworCQkJYnJlYWs7CisJCX0KKwkJY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOwogCi0JaWYgKCFpc19kaXJlbnRyeV9sZV9paChpaCkpIHsKLSAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJub3QgZGlyZW50cnkgJWgiLCBpaCk7Ci0JICAgIGJyZWFrOwotICAgICAgICB9Ci0JY29weV9pdGVtX2hlYWQoJnRtcF9paCwgaWgpOworCQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLworCQlSRkFMU0UoQ09NUF9TSE9SVF9LRVlTKCYoaWgtPmloX2tleSksICZwb3Nfa2V5KSwKKwkJICAgICAgICJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKKwkJICAgICAgIGloLCAmcG9zX2tleSk7CiAKLQkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLwotCVJGQUxTRSggQ09NUF9TSE9SVF9LRVlTICgmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCi0JCSJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKLQkJaWgsICZwb3Nfa2V5KTsKKwkJaWYgKGRlaF9vZmZzZXQoZGVoKSA8PSBET1RfRE9UX09GRlNFVCkgeworCQkJYnJlYWs7CisJCX0KIAotCWlmIChkZWhfb2Zmc2V0KGRlaCkgPD0gRE9UX0RPVF9PRkZTRVQpIHsKLQkgICAgYnJlYWs7Ci0JfQorCQkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLworCQluZXh0X3BvcyA9IGRlaF9vZmZzZXQoZGVoKSAtIDE7CiAKLQkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLwotCW5leHRfcG9zID0gZGVoX29mZnNldCAoZGVoKSAtIDE7CisJCWlmICghZGVfdmlzaWJsZShkZWgpKQorCQkJLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCisJCQljb250aW51ZTsKIAotCWlmICghZGVfdmlzaWJsZSAoZGVoKSkKLQkgICAgLyogaXQgaXMgaGlkZGVuIGVudHJ5ICovCi0JICAgIGNvbnRpbnVlOworCQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7CisJCWRfbmFtZSA9IEJfSV9ERUhfRU5UUllfRklMRV9OQU1FKGJoLCBpaCwgZGVoKTsKKwkJZF9vZmYgPSBkZWhfb2Zmc2V0KGRlaCk7CisJCWRfaW5vID0gZGVoX29iamVjdGlkKGRlaCk7CiAKLQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aChiaCwgaWgsIGVudHJ5X251bSk7Ci0JZF9uYW1lID0gQl9JX0RFSF9FTlRSWV9GSUxFX05BTUUgKGJoLCBpaCwgZGVoKTsKLQlkX29mZiA9IGRlaF9vZmZzZXQgKGRlaCk7Ci0JZF9pbm8gPSBkZWhfb2JqZWN0aWQgKGRlaCk7CisJCWlmICghZF9uYW1lW2RfcmVjbGVuIC0gMV0pCisJCQlkX3JlY2xlbiA9IHN0cmxlbihkX25hbWUpOwogCi0JaWYgKCFkX25hbWVbZF9yZWNsZW4gLSAxXSkKLQkgICAgZF9yZWNsZW4gPSBzdHJsZW4gKGRfbmFtZSk7CisJCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwkJCS8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLworCQkJY29udGludWU7CisJCX0KIAotCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpewotCSAgICAvKiB0b28gYmlnIHRvIHNlbmQgYmFjayB0byBWRlMgKi8KLQkgICAgY29udGludWUgOwotCX0KKwkJLyogSWdub3JlIHRoZSAucmVpc2VyZnNfcHJpdiBlbnRyeSAqLworCQlpZiAocmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSAmJgorCQkgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKKwkJICAgIGRlaF9vYmplY3RpZChkZWgpID09CisJCSAgICBsZTMyX3RvX2NwdShJTk9ERV9QS0VZCisJCQkJKFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+CisJCQkJa19vYmplY3RpZCkpCisJCQljb250aW51ZTsKIAotICAgICAgICAvKiBJZ25vcmUgdGhlIC5yZWlzZXJmc19wcml2IGVudHJ5ICovCi0gICAgICAgIGlmIChyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKLSAgICAgICAgICAgIGRlaF9vYmplY3RpZCAoZGVoKSA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPmtfb2JqZWN0aWQpKQotICAgICAgICAgIGNvbnRpbnVlOworCQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKKwkJCWxvY2FsX2J1ZiA9IHNtYWxsX2J1ZjsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsX2J1ZiA9CisJCQkgICAgcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKTsKKwkJCWlmICghbG9jYWxfYnVmKSB7CisJCQkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWlmIChpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkJCXJlaXNlcmZzX2tmcmVlKGxvY2FsX2J1ZiwgZF9yZWNsZW4sCisJCQkJCSAgICAgICBpbm9kZS0+aV9zYik7CiAKLQlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKLQkgIGxvY2FsX2J1ZiA9IHNtYWxsX2J1ZiA7Ci0JfSBlbHNlIHsKLQkgICAgbG9jYWxfYnVmID0gcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKSA7Ci0JICAgIGlmICghbG9jYWxfYnVmKSB7Ci0JCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOwotCQlyZXR1cm4gLUVOT01FTSA7Ci0JICAgIH0KLQkgICAgaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgewotCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCQkJCS8qIHNpZ2gsIG11c3QgcmV0cnkuICBEbyB0aGlzIHNhbWUgb2Zmc2V0IGFnYWluICovCisJCQkJbmV4dF9wb3MgPSBkX29mZjsKKwkJCQlnb3RvIHJlc2VhcmNoOworCQkJfQorCQl9CiAKLQkJLyogc2lnaCwgbXVzdCByZXRyeS4gIERvIHRoaXMgc2FtZSBvZmZzZXQgYWdhaW4gKi8KLQkJbmV4dF9wb3MgPSBkX29mZjsKLQkJZ290byByZXNlYXJjaDsKLQkgICAgfQotCX0KKwkJLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5CisJCS8vIGJ1ZmZlciAobG9jYWxfYnVmKSBiZWNhdXNlIGZpbGxkaXIgd2lsbCBibG9jayBpZgorCQkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCisJCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCisJCW1lbWNweShsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOwogCi0JLy8gTm90ZSwgdGhhdCB3ZSBjb3B5IG5hbWUgdG8gdXNlciBzcGFjZSB2aWEgdGVtcG9yYXJ5Ci0JLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCi0JLy8gdXNlciBzcGFjZSBidWZmZXIgaXMgc3dhcHBlZCBvdXQuIEF0IHRoYXQgdGltZQotCS8vIGVudHJ5IGNhbiBtb3ZlIHRvIHNvbWV3aGVyZSBlbHNlCi0JbWVtY3B5IChsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCQkvKiB0aGUgZmlsbGRpciBmdW5jdGlvbiBtaWdodCBuZWVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9ucywKKwkJICogb3IgZG8gd2hvIGtub3dzIHdoYXQuICBSZWxlYXNlIHRoZSBwYXRoIG5vdyB0aGF0IHdlJ3ZlCisJCSAqIGNvcGllZCBhbGwgdGhlIGltcG9ydGFudCBzdHVmZiBvdXQgb2YgdGhlIGRlaAorCQkgKi8KKwkJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKIAotCS8qIHRoZSBmaWxsZGlyIGZ1bmN0aW9uIG1pZ2h0IG5lZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb25zLAotCSAqIG9yIGRvIHdobyBrbm93cyB3aGF0LiAgUmVsZWFzZSB0aGUgcGF0aCBub3cgdGhhdCB3ZSd2ZQotCSAqIGNvcGllZCBhbGwgdGhlIGltcG9ydGFudCBzdHVmZiBvdXQgb2YgdGhlIGRlaAotCSAqLwotCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKKwkJCSAgICBEVF9VTktOT1dOKSA8IDApIHsKKwkJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwKKwkJCQkJICAgICAgIGlub2RlLT5pX3NiKTsKKwkJCX0KKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYik7CisJCX0KKwl9CQkJLyogd2hpbGUgKi8KIAotCWlmIChmaWxsZGlyIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKLQkJICAgICBEVF9VTktOT1dOKSA8IDApIHsKLQkgICAgaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQkgICAgfQotCSAgICBnb3RvIGVuZDsKLQl9Ci0JaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKLQkgICAgcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKLQl9Ci0gICAgfSAvKiB3aGlsZSAqLwotCi1lbmQ6Ci0gICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7Ci0gICAgcmV0dXJuIDA7CisgICAgICBlbmQ6CisJcGF0aHJlbHNlKCZwYXRoX3RvX2VudHJ5KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQxNyw2MyArNDIzLDU5IEBACiBzdGF0aWMKIGludCB4YXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBmaWxsZGlyX3QgZmlsbGVyLCB2b2lkICpidWYpCiB7Ci0gICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICAgICAgaW50IHJlcyA9IC1FTk9URElSOwotICAgICAgICBpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCi0gICAgICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIGRvd24oJmlub2RlLT5pX3NlbSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXMgPSAtRU5PVERJUjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCisJCWdvdG8gb3V0OworCWRvd24oJmlub2RlLT5pX3NlbSk7CiAvLyAgICAgICAgZG93bigmaW5vZGUtPmlfem9tYmllKTsKLSAgICAgICAgcmVzID0gLUVOT0VOVDsKLSAgICAgICAgaWYgKCFJU19ERUFERElSKGlub2RlKSkgewotICAgICAgICAgICAgICAgIGxvY2tfa2VybmVsKCk7Ci0gICAgICAgICAgICAgICAgcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKLSAgICAgICAgICAgICAgICB1bmxvY2tfa2VybmVsKCk7Ci0gICAgICAgIH0KKwlyZXMgPSAtRU5PRU5UOworCWlmICghSVNfREVBRERJUihpbm9kZSkpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmVzID0gX194YXR0cl9yZWFkZGlyKGZpbGUsIGJ1ZiwgZmlsbGVyKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KIC8vICAgICAgICB1cCgmaW5vZGUtPmlfem9tYmllKTsKLSAgICAgICAgdXAoJmlub2RlLT5pX3NlbSk7Ci1vdXQ6Ci0gICAgICAgIHJldHVybiByZXM7CisJdXAoJmlub2RlLT5pX3NlbSk7CisgICAgICBvdXQ6CisJcmV0dXJuIHJlczsKIH0KIAotCiAvKiBJbnRlcm5hbCBvcGVyYXRpb25zIG9uIGZpbGUgZGF0YSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLSAgICAgICAga3VubWFwKHBhZ2UpOwotICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlICoKLXJlaXNlcmZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCitzdGF0aWMgc3RydWN0IHBhZ2UgKnJlaXNlcmZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0gICAgICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7Ci0gICAgICAgIHN0cnVjdCBwYWdlICpwYWdlOwotICAgICAgICAvKiBXZSBjYW4gZGVhZGxvY2sgaWYgd2UgdHJ5IHRvIGZyZWUgZGVudHJpZXMsCi0gICAgICAgICAgIGFuZCBhbiB1bmxpbmsvcm1kaXIgaGFzIGp1c3Qgb2NjdXJlZCAtIEdGUF9OT0ZTIGF2b2lkcyB0aGlzICovCi0gICAgICAgIG1hcHBpbmctPmZsYWdzID0gKG1hcHBpbmctPmZsYWdzICYgfl9fR0ZQX0JJVFNfTUFTSykgfCBHRlBfTk9GUzsKLSAgICAgICAgcGFnZSA9IHJlYWRfY2FjaGVfcGFnZSAobWFwcGluZywgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOwotICAgICAgICBpZiAoIUlTX0VSUihwYWdlKSkgewotICAgICAgICAgICAgICAgIHdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0gICAgICAgICAgICAgICAga21hcChwYWdlKTsKLSAgICAgICAgICAgICAgICBpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCS8qIFdlIGNhbiBkZWFkbG9jayBpZiB3ZSB0cnkgdG8gZnJlZSBkZW50cmllcywKKwkgICBhbmQgYW4gdW5saW5rL3JtZGlyIGhhcyBqdXN0IG9jY3VyZWQgLSBHRlBfTk9GUyBhdm9pZHMgdGhpcyAqLworCW1hcHBpbmctPmZsYWdzID0gKG1hcHBpbmctPmZsYWdzICYgfl9fR0ZQX0JJVFNfTUFTSykgfCBHRlBfTk9GUzsKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCisJCQkgICAgICAgKGZpbGxlcl90ICopIG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CiAKLSAgICAgICAgICAgICAgICBpZiAoUGFnZUVycm9yKHBhZ2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwYWdlOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gcGFnZTsKIAotZmFpbDoKLSAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7Ci0gICAgICAgIHJldHVybiBFUlJfUFRSKC1FSU8pOworICAgICAgZmFpbDoKKwlyZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIH0KIAotc3RhdGljIGlubGluZSBfX3UzMgoteGF0dHJfaGFzaCAoY29uc3QgY2hhciAqbXNnLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSBfX3UzMiB4YXR0cl9oYXNoKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKIHsKLSAgICByZXR1cm4gY3N1bV9wYXJ0aWFsIChtc2csIGxlbiwgMCk7CisJcmV0dXJuIGNzdW1fcGFydGlhbChtc2csIGxlbiwgMCk7CiB9CiAKIC8qIEdlbmVyaWMgZXh0ZW5kZWQgYXR0cmlidXRlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSB4YSBwbHVnaW5zICovCkBAIC00ODIsMjk0ICs0ODQsMzAwIEBACiAgKiBpbm9kZS0+aV9zZW06IGRvd24KICAqLwogaW50Ci1yZWlzZXJmc194YXR0cl9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBpbnQgZmxhZ3MpCityZWlzZXJmc194YXR0cl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorCQkgICBzaXplX3QgYnVmZmVyX3NpemUsIGludCBmbGFncykKIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IHBhZ2UgKnBhZ2U7Ci0gICAgY2hhciAqZGF0YTsKLSAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLSAgICBzaXplX3QgZmlsZV9wb3MgPSAwOwotICAgIHNpemVfdCBidWZmZXJfcG9zID0gMDsKLSAgICBzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKLSAgICBzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7Ci0gICAgX191MzIgeGFoYXNoID0gMDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzaXplX3QgZmlsZV9wb3MgPSAwOworCXNpemVfdCBidWZmZXJfcG9zID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKnhpbm9kZTsKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisJX191MzIgeGFoYXNoID0gMDsKIAotICAgIGlmIChJU19SRE9OTFkgKGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAotICAgIGlmIChJU19JTU1VVEFCTEUgKGlub2RlKSB8fCBJU19BUFBFTkQgKGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIC8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLwotICAgIGlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCi0gICAgICAgIHhhaGFzaCA9IHhhdHRyX2hhc2ggKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCS8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLworCWlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCisJCXhhaGFzaCA9IHhhdHRyX2hhc2goYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAKLW9wZW5fZmlsZToKLSAgICBmcCA9IG9wZW5feGFfZmlsZSAoaW5vZGUsIG5hbWUsIGZsYWdzKTsKLSAgICBpZiAoSVNfRVJSIChmcCkpIHsKLSAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICB4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0gICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOwotCi0gICAgLyogd2UgbmVlZCB0byBjb3B5IGl0IG9mZi4uICovCi0gICAgaWYgKHhpbm9kZS0+aV9ubGluayA+IDEpIHsKLQlmcHV0KGZwKTsKLSAgICAgICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChpbm9kZSwgbmFtZSk7Ci0gICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgICAgIC8qIFdlIGp1c3Qga2lsbGVkIHRoZSBvbGQgb25lLCB3ZSdyZSBub3QgcmVwbGFjaW5nIGFueW1vcmUgKi8KLSAgICAgICAgaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKLSAgICAgICAgICAgIGZsYWdzICY9IH5YQVRUUl9SRVBMQUNFOwotICAgICAgICBnb3RvIG9wZW5fZmlsZTsKLSAgICB9Ci0KLSAgICAvKiBSZXNpemUgaXQgc28gd2UncmUgb2sgdG8gd3JpdGUgdGhlcmUgKi8KLSAgICBuZXdhdHRycy5pYV9zaXplID0gYnVmZmVyX3NpemU7Ci0gICAgbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX1NJWkUgfCBBVFRSX0NUSU1FOwotICAgIGRvd24gKCZ4aW5vZGUtPmlfc2VtKTsKLSAgICBlcnIgPSBub3RpZnlfY2hhbmdlKGZwLT5mX2RlbnRyeSwgJm5ld2F0dHJzKTsKLSAgICBpZiAoZXJyKQotICAgICAgICBnb3RvIG91dF9maWxwOwotCi0gICAgbWFwcGluZyA9IHhpbm9kZS0+aV9tYXBwaW5nOwotICAgIHdoaWxlIChidWZmZXJfcG9zIDwgYnVmZmVyX3NpemUgfHwgYnVmZmVyX3BvcyA9PSAwKSB7Ci0gICAgICAgIHNpemVfdCBjaHVuazsKLSAgICAgICAgc2l6ZV90IHNraXAgPSAwOwotICAgICAgICBzaXplX3QgcGFnZV9vZmZzZXQgPSAoZmlsZV9wb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwotICAgICAgICBpZiAoYnVmZmVyX3NpemUgLSBidWZmZXJfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQotICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNodW5rID0gYnVmZmVyX3NpemUgLSBidWZmZXJfcG9zOwotCi0gICAgICAgIHBhZ2UgPSByZWlzZXJmc19nZXRfcGFnZSAoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKLSAgICAgICAgaWYgKElTX0VSUiAocGFnZSkpIHsKLSAgICAgICAgICAgIGVyciA9IFBUUl9FUlIgKHBhZ2UpOwotICAgICAgICAgICAgZ290byBvdXRfZmlscDsKLSAgICAgICAgfQotCi0gICAgICAgIGxvY2tfcGFnZSAocGFnZSk7Ci0gICAgICAgIGRhdGEgPSBwYWdlX2FkZHJlc3MgKHBhZ2UpOwotCi0gICAgICAgIGlmIChmaWxlX3BvcyA9PSAwKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGg7Ci0gICAgICAgICAgICBza2lwID0gZmlsZV9wb3MgPSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOwotICAgICAgICAgICAgaWYgKGNodW5rICsgc2tpcCA+IFBBR0VfQ0FDSEVfU0laRSkKLSAgICAgICAgICAgICAgICBjaHVuayA9IFBBR0VfQ0FDSEVfU0laRSAtIHNraXA7Ci0gICAgICAgICAgICByeGggPSAoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlciAqKWRhdGE7Ci0gICAgICAgICAgICByeGgtPmhfbWFnaWMgPSBjcHVfdG9fbGUzMiAoUkVJU0VSRlNfWEFUVFJfTUFHSUMpOwotICAgICAgICAgICAgcnhoLT5oX2hhc2ggPSBjcHVfdG9fbGUzMiAoeGFoYXNoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlIChmcCwgcGFnZSwgcGFnZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX29mZnNldCArIGNodW5rICsgc2tpcCk7Ci0gICAgICAgIGlmICghZXJyKSB7Ci0JICAgIGlmIChidWZmZXIpCi0JCW1lbWNweSAoZGF0YSArIHNraXAsIGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGNodW5rKTsKLSAgICAgICAgICAgIGVyciA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUgKGZwLCBwYWdlLCBwYWdlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKyAgICAgIG9wZW5fZmlsZToKKwlmcCA9IG9wZW5feGFfZmlsZShpbm9kZSwgbmFtZSwgZmxhZ3MpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQlnb3RvIG91dDsKIAl9Ci0gICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKLSAgICAgICAgcmVpc2VyZnNfcHV0X3BhZ2UgKHBhZ2UpOwotICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOwotICAgICAgICBmaWxlX3BvcyArPSBjaHVuazsKLSAgICAgICAgc2tpcCA9IDA7Ci0gICAgICAgIGlmIChlcnIgfHwgYnVmZmVyX3NpemUgPT0gMCB8fCAhYnVmZmVyKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQogCi0gICAgLyogV2UgY2FuJ3QgbWFyayB0aGUgaW5vZGUgZGlydHkgaWYgaXQncyBub3QgaGFzaGVkLiBUaGlzIGlzIHRoZSBjYXNlCi0gICAgICogd2hlbiB3ZSdyZSBpbmhlcml0aW5nIHRoZSBkZWZhdWx0IEFDTC4gSWYgd2UgZGlydHkgaXQsIHRoZSBpbm9kZQotICAgICAqIGdldHMgbWFya2VkIGRpcnR5LCBidXQgd29uJ3QgKGV2ZXIpIG1ha2UgaXQgb250byB0aGUgZGlydHkgbGlzdCB1bnRpbAotICAgICAqIGl0J3Mgc3luY2VkIGV4cGxpY2l0bHkgdG8gY2xlYXIgSV9ESVJUWS4gVGhpcyBpcyBiYWQuICovCi0gICAgaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKLSAgICAgICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotICAgICAgICBtYXJrX2lub2RlX2RpcnR5IChpbm9kZSk7Ci0gICAgfQorCXhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLW91dF9maWxwOgotICAgIHVwICgmeGlub2RlLT5pX3NlbSk7Ci0gICAgZnB1dChmcCk7CisJLyogd2UgbmVlZCB0byBjb3B5IGl0IG9mZi4uICovCisJaWYgKHhpbm9kZS0+aV9ubGluayA+IDEpIHsKKwkJZnB1dChmcCk7CisJCWVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbChpbm9kZSwgbmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qIFdlIGp1c3Qga2lsbGVkIHRoZSBvbGQgb25lLCB3ZSdyZSBub3QgcmVwbGFjaW5nIGFueW1vcmUgKi8KKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWZsYWdzICY9IH5YQVRUUl9SRVBMQUNFOworCQlnb3RvIG9wZW5fZmlsZTsKKwl9CiAKLW91dDoKLSAgICByZXR1cm4gZXJyOworCS8qIFJlc2l6ZSBpdCBzbyB3ZSdyZSBvayB0byB3cml0ZSB0aGVyZSAqLworCW5ld2F0dHJzLmlhX3NpemUgPSBidWZmZXJfc2l6ZTsKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisJZG93bigmeGlub2RlLT5pX3NlbSk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShmcC0+Zl9kZW50cnksICZuZXdhdHRycyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmlscDsKKworCW1hcHBpbmcgPSB4aW5vZGUtPmlfbWFwcGluZzsKKwl3aGlsZSAoYnVmZmVyX3BvcyA8IGJ1ZmZlcl9zaXplIHx8IGJ1ZmZlcl9wb3MgPT0gMCkgeworCQlzaXplX3QgY2h1bms7CisJCXNpemVfdCBza2lwID0gMDsKKwkJc2l6ZV90IHBhZ2Vfb2Zmc2V0ID0gKGZpbGVfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwkJaWYgKGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvcyA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJCWNodW5rID0gUEFHRV9DQUNIRV9TSVpFOworCQllbHNlCisJCQljaHVuayA9IGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvczsKKworCQlwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0X2ZpbHA7CisJCX0KKworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWRhdGEgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkJaWYgKGZpbGVfcG9zID09IDApIHsKKwkJCXN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aDsKKwkJCXNraXAgPSBmaWxlX3BvcyA9IHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKwkJCWlmIChjaHVuayArIHNraXAgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkUgLSBza2lwOworCQkJcnhoID0gKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOworCQkJcnhoLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfWEFUVFJfTUFHSUMpOworCQkJcnhoLT5oX2hhc2ggPSBjcHVfdG9fbGUzMih4YWhhc2gpOworCQl9CisKKwkJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkJICAgIHBhZ2Vfb2Zmc2V0ICsgY2h1bmsgKyBza2lwKTsKKwkJaWYgKCFlcnIpIHsKKwkJCWlmIChidWZmZXIpCisJCQkJbWVtY3B5KGRhdGEgKyBza2lwLCBidWZmZXIgKyBidWZmZXJfcG9zLCBjaHVuayk7CisJCQllcnIgPQorCQkJICAgIG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkJCSBwYWdlX29mZnNldCArIGNodW5rICsKKwkJCQkJCQkgc2tpcCk7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJlaXNlcmZzX3B1dF9wYWdlKHBhZ2UpOworCQlidWZmZXJfcG9zICs9IGNodW5rOworCQlmaWxlX3BvcyArPSBjaHVuazsKKwkJc2tpcCA9IDA7CisJCWlmIChlcnIgfHwgYnVmZmVyX3NpemUgPT0gMCB8fCAhYnVmZmVyKQorCQkJYnJlYWs7CisJfQorCisJLyogV2UgY2FuJ3QgbWFyayB0aGUgaW5vZGUgZGlydHkgaWYgaXQncyBub3QgaGFzaGVkLiBUaGlzIGlzIHRoZSBjYXNlCisJICogd2hlbiB3ZSdyZSBpbmhlcml0aW5nIHRoZSBkZWZhdWx0IEFDTC4gSWYgd2UgZGlydHkgaXQsIHRoZSBpbm9kZQorCSAqIGdldHMgbWFya2VkIGRpcnR5LCBidXQgd29uJ3QgKGV2ZXIpIG1ha2UgaXQgb250byB0aGUgZGlydHkgbGlzdCB1bnRpbAorCSAqIGl0J3Mgc3luY2VkIGV4cGxpY2l0bHkgdG8gY2xlYXIgSV9ESVJUWS4gVGhpcyBpcyBiYWQuICovCisJaWYgKCFobGlzdF91bmhhc2hlZCgmaW5vZGUtPmlfaGFzaCkpIHsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisKKyAgICAgIG91dF9maWxwOgorCXVwKCZ4aW5vZGUtPmlfc2VtKTsKKwlmcHV0KGZwKTsKKworICAgICAgb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIC8qCiAgKiBpbm9kZS0+aV9zZW06IGRvd24KICAqLwogaW50Ci1yZWlzZXJmc194YXR0cl9nZXQgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQorcmVpc2VyZnNfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQogewotICAgIHNzaXplX3QgZXJyID0gMDsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc2l6ZV90IGlzaXplOwotICAgIHNpemVfdCBmaWxlX3BvcyA9IDA7Ci0gICAgc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOwotICAgIHN0cnVjdCBwYWdlICpwYWdlOwotICAgIHN0cnVjdCBpbm9kZSAqeGlub2RlOwotICAgIF9fdTMyIGhhc2ggPSAwOworCXNzaXplX3QgZXJyID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc2l6ZV90IGlzaXplOworCXNpemVfdCBmaWxlX3BvcyA9IDA7CisJc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBpbm9kZSAqeGlub2RlOworCV9fdTMyIGhhc2ggPSAwOwogCi0gICAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICAvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKLSAgICAgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KLSAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKKwkgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgZnAgPSBvcGVuX3hhX2ZpbGUgKGlub2RlLCBuYW1lLCBGTF9SRUFET05MWSk7Ci0gICAgaWYgKElTX0VSUiAoZnApKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGZwKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gb3Blbl94YV9maWxlKGlub2RlLCBuYW1lLCBGTF9SRUFET05MWSk7CisJaWYgKElTX0VSUihmcCkpIHsKKwkJZXJyID0gUFRSX0VSUihmcCk7CisJCWdvdG8gb3V0OworCX0KIAotICAgIHhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKLSAgICBpc2l6ZSA9IHhpbm9kZS0+aV9zaXplOwotICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKKwl4aW5vZGUgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaXNpemUgPSB4aW5vZGUtPmlfc2l6ZTsKKwlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLSAgICAvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KLSAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOwotICAgICAgICBnb3RvIG91dF9kcHV0OwotICAgIH0KKwkvKiBKdXN0IHJldHVybiB0aGUgc2l6ZSBuZWVkZWQgKi8KKwlpZiAoYnVmZmVyID09IE5VTEwpIHsKKwkJZXJyID0gaXNpemUgLSBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlcik7CisJCWdvdG8gb3V0X2RwdXQ7CisJfQogCi0gICAgaWYgKGJ1ZmZlcl9zaXplIDwgaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7Ci0gICAgICAgIGVyciA9IC1FUkFOR0U7Ci0gICAgICAgIGdvdG8gb3V0X2RwdXQ7Ci0gICAgfQorCWlmIChidWZmZXJfc2l6ZSA8IGlzaXplIC0gc2l6ZW9mKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7CisJCWVyciA9IC1FUkFOR0U7CisJCWdvdG8gb3V0X2RwdXQ7CisJfQogCi0gICAgd2hpbGUgKGZpbGVfcG9zIDwgaXNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNodW5rOwotICAgICAgICBjaGFyICpkYXRhOwotICAgICAgICBzaXplX3Qgc2tpcCA9IDA7Ci0gICAgICAgIGlmIChpc2l6ZSAtIGZpbGVfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQotICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNodW5rID0gaXNpemUgLSBmaWxlX3BvczsKKwl3aGlsZSAoZmlsZV9wb3MgPCBpc2l6ZSkgeworCQlzaXplX3QgY2h1bms7CisJCWNoYXIgKmRhdGE7CisJCXNpemVfdCBza2lwID0gMDsKKwkJaWYgKGlzaXplIC0gZmlsZV9wb3MgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQljaHVuayA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJZWxzZQorCQkJY2h1bmsgPSBpc2l6ZSAtIGZpbGVfcG9zOwogCi0gICAgICAgIHBhZ2UgPSByZWlzZXJmc19nZXRfcGFnZSAoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKLSAgICAgICAgaWYgKElTX0VSUiAocGFnZSkpIHsKLSAgICAgICAgICAgIGVyciA9IFBUUl9FUlIgKHBhZ2UpOwotICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKLSAgICAgICAgfQorCQlwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UoeGlub2RlLCBmaWxlX3BvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCWdvdG8gb3V0X2RwdXQ7CisJCX0KIAotICAgICAgICBsb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICBkYXRhID0gcGFnZV9hZGRyZXNzIChwYWdlKTsKLSAgICAgICAgaWYgKGZpbGVfcG9zID09IDApIHsKLSAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOwotICAgICAgICAgICAgc2tpcCA9IGZpbGVfcG9zID0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKLSAgICAgICAgICAgIGNodW5rIC09IHNraXA7Ci0gICAgICAgICAgICAvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KLSAgICAgICAgICAgIGlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIgKFJFSVNFUkZTX1hBVFRSX01BR0lDKSkgewotICAgICAgICAgICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKLSAgICAgICAgICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJJbnZhbGlkIG1hZ2ljIGZvciB4YXR0ciAoJXMpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzb2NpYXRlZCB3aXRoICVrIiwgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FSU87Ci0gICAgICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhc2ggPSBsZTMyX3RvX2NwdSAocnhoLT5oX2hhc2gpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweSAoYnVmZmVyICsgYnVmZmVyX3BvcywgZGF0YSArIHNraXAsIGNodW5rKTsKLSAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOwotICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7Ci0gICAgICAgIGZpbGVfcG9zICs9IGNodW5rOwotICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOwotICAgICAgICBza2lwID0gMDsKLSAgICB9Ci0gICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWRhdGEgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWlmIChmaWxlX3BvcyA9PSAwKSB7CisJCQlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICpyeGggPQorCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyICopZGF0YTsKKwkJCXNraXAgPSBmaWxlX3BvcyA9IHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKwkJCWNodW5rIC09IHNraXA7CisJCQkvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KKwkJCWlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfWEFUVFJfTUFHSUMpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcmVpc2VyZnNfcHV0X3BhZ2UocGFnZSk7CisJCQkJcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwKKwkJCQkJCSAiSW52YWxpZCBtYWdpYyBmb3IgeGF0dHIgKCVzKSAiCisJCQkJCQkgImFzc29jaWF0ZWQgd2l0aCAlayIsIG5hbWUsCisJCQkJCQkgSU5PREVfUEtFWShpbm9kZSkpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXRfZHB1dDsKKwkJCX0KKwkJCWhhc2ggPSBsZTMyX3RvX2NwdShyeGgtPmhfaGFzaCk7CisJCX0KKwkJbWVtY3B5KGJ1ZmZlciArIGJ1ZmZlcl9wb3MsIGRhdGEgKyBza2lwLCBjaHVuayk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKwkJZmlsZV9wb3MgKz0gY2h1bms7CisJCWJ1ZmZlcl9wb3MgKz0gY2h1bms7CisJCXNraXAgPSAwOworCX0KKwllcnIgPSBpc2l6ZSAtIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKIAotICAgIGlmICh4YXR0cl9oYXNoIChidWZmZXIsIGlzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKSkgIT0gaGFzaCkgewotICAgICAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIkludmFsaWQgaGFzaCBmb3IgeGF0dHIgKCVzKSBhc3NvY2lhdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggJWsiLCBuYW1lLCBJTk9ERV9QS0VZIChpbm9kZSkpOwotICAgICAgICBlcnIgPSAtRUlPOwotICAgIH0KKwlpZiAoeGF0dHJfaGFzaChidWZmZXIsIGlzaXplIC0gc2l6ZW9mKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSAhPQorCSAgICBoYXNoKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsCisJCQkJICJJbnZhbGlkIGhhc2ggZm9yIHhhdHRyICglcykgYXNzb2NpYXRlZCAiCisJCQkJICJ3aXRoICVrIiwgbmFtZSwgSU5PREVfUEtFWShpbm9kZSkpOworCQllcnIgPSAtRUlPOworCX0KIAotb3V0X2RwdXQ6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZHB1dDoKKwlmcHV0KGZwKTsKIAotb3V0OgotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAotX19yZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBkZW50cnkgKnhhZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK19fcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBkZW50cnkgKnhhZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Ci0gICAgc3RydWN0IGlub2RlICpkaXIgPSB4YWRpci0+ZF9pbm9kZTsKLSAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSB4YWRpci0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gMDsKIAotICAgIGRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuIChuYW1lLCB4YWRpciwgbmFtZWxlbik7Ci0gICAgaWYgKElTX0VSUiAoZGVudHJ5KSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChkZW50cnkpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKLSAgICAgICAgZXJyID0gLUVOT0RBVEE7Ci0gICAgICAgIGdvdG8gb3V0X2ZpbGU7Ci0gICAgfQorCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJZXJyID0gUFRSX0VSUihkZW50cnkpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJZXJyID0gLUVOT0RBVEE7CisJCWdvdG8gb3V0X2ZpbGU7CisJfQogCi0gICAgLyogU2tpcCBkaXJlY3Rvcmllcy4uICovCi0gICAgaWYgKFNfSVNESVIgKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKLSAgICAgICAgZ290byBvdXRfZmlsZTsKKwkvKiBTa2lwIGRpcmVjdG9yaWVzLi4gKi8KKwlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0X2ZpbGU7CiAKLSAgICBpZiAoIWlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkZW50cnktPmRfaW5vZGUpKSB7Ci0gICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgIk9JRCAlMDh4IFslLipzLyUuKnNdIGRvZXNuJ3QgaGF2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChkZW50cnktPmRfaW5vZGUpLT5rX29iamVjdGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHhhZGlyLT5kX25hbWUubGVuLCB4YWRpci0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4sIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpc19yZWlzZXJmc19wcml2X29iamVjdCAoeGFkaXItPmRfaW5vZGUpID8gIiIgOiAibm90ICIpOwotICAgICAgICBkcHV0IChkZW50cnkpOwotICAgICAgICByZXR1cm4gLUVJTzsKLSAgICB9CisJaWYgKCFpc19yZWlzZXJmc19wcml2X29iamVjdChkZW50cnktPmRfaW5vZGUpKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcoZGlyLT5pX3NiLCAiT0lEICUwOHggWyUuKnMvJS4qc10gZG9lc24ndCBoYXZlICIKKwkJCQkgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKKwkJCQkgbGUzMl90b19jcHUoSU5PREVfUEtFWShkZW50cnktPmRfaW5vZGUpLT4KKwkJCQkJICAgICBrX29iamVjdGlkKSwgeGFkaXItPmRfbmFtZS5sZW4sCisJCQkJIHhhZGlyLT5kX25hbWUubmFtZSwgbmFtZWxlbiwgbmFtZSwKKwkJCQkgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoeGFkaXItPgorCQkJCQkJCSBkX2lub2RlKSA/ICIiIDoKKwkJCQkgIm5vdCAiKTsKKwkJZHB1dChkZW50cnkpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAKLSAgICBlcnIgPSBkaXItPmlfb3AtPnVubGluayAoZGlyLCBkZW50cnkpOwotICAgIGlmICghZXJyKQotICAgICAgICBkX2RlbGV0ZSAoZGVudHJ5KTsKKwllcnIgPSBkaXItPmlfb3AtPnVubGluayhkaXIsIGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWRfZGVsZXRlKGRlbnRyeSk7CiAKLW91dF9maWxlOgotICAgIGRwdXQgKGRlbnRyeSk7CisgICAgICBvdXRfZmlsZToKKwlkcHV0KGRlbnRyeSk7CiAKLW91dDoKLSAgICByZXR1cm4gZXJyOworICAgICAgb3V0OgorCXJldHVybiBlcnI7CiB9CiAKLQotaW50Ci1yZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnI7CiAKLSAgICBpZiAoSVNfUkRPTkxZIChpbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CiAKLSAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwlkaXIgPSBvcGVuX3hhX2Rpcihpbm9kZSwgRkxfUkVBRE9OTFkpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gb3V0OworCX0KIAotICAgIGVyciA9IF9fcmVpc2VyZnNfeGF0dHJfZGVsIChkaXIsIG5hbWUsIHN0cmxlbiAobmFtZSkpOwotICAgIGRwdXQgKGRpcik7CisJZXJyID0gX19yZWlzZXJmc194YXR0cl9kZWwoZGlyLCBuYW1lLCBzdHJsZW4obmFtZSkpOworCWRwdXQoZGlyKTsKIAotICAgIGlmICghZXJyKSB7Ci0gICAgICAgIGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICAgICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOwotICAgIH0KKwlpZiAoIWVycikgeworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KIAotb3V0OgotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhlIGZvbGxvd2luZyBhcmUgc2lkZSBlZmZlY3RzIG9mIG90aGVyIG9wZXJhdGlvbnMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseQpAQCAtNzc3LDE2OCArNzg1LDE2NCBAQAogICogb3Igb3duZXJzaGlwIGNoYW5nZXMsIG9iamVjdCBkZWxldGlvbnMsIGV0Yy4gKi8KIAogc3RhdGljIGludAotcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIgKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCSAgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YWRpciA9IChzdHJ1Y3QgZGVudHJ5ICopYnVmOworCXN0cnVjdCBkZW50cnkgKnhhZGlyID0gKHN0cnVjdCBkZW50cnkgKilidWY7CiAKLSAgICByZXR1cm4gX19yZWlzZXJmc194YXR0cl9kZWwgKHhhZGlyLCBuYW1lLCBuYW1lbGVuKTsKKwlyZXR1cm4gX19yZWlzZXJmc194YXR0cl9kZWwoeGFkaXIsIG5hbWUsIG5hbWVsZW4pOwogCiB9CiAKIC8qIFRoaXMgaXMgY2FsbGVkIHcvIGlub2RlLT5pX3NlbSBkb3duZWQgKi8KLWludAotcmVpc2VyZnNfZGVsZXRlX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSkKK2ludCByZWlzZXJmc19kZWxldGVfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc3RydWN0IGZpbGUgKmZwOwotICAgIHN0cnVjdCBkZW50cnkgKmRpciwgKnJvb3Q7Ci0gICAgaW50IGVyciA9IDA7CisJc3RydWN0IGZpbGUgKmZwOworCXN0cnVjdCBkZW50cnkgKmRpciwgKnJvb3Q7CisJaW50IGVyciA9IDA7CiAKLSAgICAvKiBTa2lwIG91dCwgYW4geGF0dHIgaGFzIG5vIHhhdHRycyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KLSAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSB8fAotICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUpID09IFNUQVRfREFUQV9WMSB8fAotICAgICAgICAhcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgZGlyID0gb3Blbl94YV9kaXIgKGlub2RlLCBGTF9SRUFET05MWSk7Ci0gICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgaWYgKElTX0VSUiAoZGlyKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChkaXIpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9IGVsc2UgaWYgKCFkaXItPmRfaW5vZGUpIHsKLSAgICAgICAgZHB1dCAoZGlyKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCS8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLworCWlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oaW5vZGUpID09IFNUQVRfREFUQV9WMSB8fAorCSAgICAhcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkgeworCQlyZXR1cm4gMDsKKwl9CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJZGlyID0gb3Blbl94YV9kaXIoaW5vZGUsIEZMX1JFQURPTkxZKTsKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoIWRpci0+ZF9pbm9kZSkgeworCQlkcHV0KGRpcik7CisJCXJldHVybiAwOworCX0KIAotICAgIGZwID0gZGVudHJ5X29wZW4gKGRpciwgTlVMTCwgT19SRFdSKTsKLSAgICBpZiAoSVNfRVJSIChmcCkpIHsKLSAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOwotICAgICAgICAvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCi0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwlmcCA9IGRlbnRyeV9vcGVuKGRpciwgTlVMTCwgT19SRFdSKTsKKwlpZiAoSVNfRVJSKGZwKSkgeworCQllcnIgPSBQVFJfRVJSKGZwKTsKKwkJLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCQlnb3RvIG91dDsKKwl9CiAKLSAgICBsb2NrX2tlcm5lbCAoKTsKLSAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7Ci0gICAgaWYgKGVycikgewotICAgICAgICB1bmxvY2tfa2VybmVsICgpOwotICAgICAgICBnb3RvIG91dF9kaXI7Ci0gICAgfQorCWxvY2tfa2VybmVsKCk7CisJZXJyID0geGF0dHJfcmVhZGRpcihmcCwgcmVpc2VyZnNfZGVsZXRlX3hhdHRyc19maWxsZXIsIGRpcik7CisJaWYgKGVycikgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWdvdG8gb3V0X2RpcjsKKwl9CiAKLSAgICAvKiBMZWZ0b3ZlcnMgYmVzaWRlcyAuIGFuZCAuLiAtLSB0aGF0J3Mgbm90IGdvb2QuICovCi0gICAgaWYgKGRpci0+ZF9pbm9kZS0+aV9ubGluayA8PSAyKSB7Ci0gICAgICAgIHJvb3QgPSBnZXRfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOwotICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICBlcnIgPSB2ZnNfcm1kaXIgKHJvb3QtPmRfaW5vZGUsIGRpcik7Ci0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgZHB1dCAocm9vdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZW1vdmUgYWxsIGVudHJpZXMgaW4gZGlyZWN0b3J5Iik7Ci0gICAgfQotICAgIHVubG9ja19rZXJuZWwgKCk7CisJLyogTGVmdG92ZXJzIGJlc2lkZXMgLiBhbmQgLi4gLS0gdGhhdCdzIG5vdCBnb29kLiAqLworCWlmIChkaXItPmRfaW5vZGUtPmlfbmxpbmsgPD0gMikgeworCQlyb290ID0gZ2V0X3hhX3Jvb3QoaW5vZGUtPmlfc2IpOworCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVyciA9IHZmc19ybWRpcihyb290LT5kX2lub2RlLCBkaXIpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJZHB1dChyb290KTsKKwl9IGVsc2UgeworCQlyZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLAorCQkJCSAiQ291bGRuJ3QgcmVtb3ZlIGFsbCBlbnRyaWVzIGluIGRpcmVjdG9yeSIpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CiAKLW91dF9kaXI6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZGlyOgorCWZwdXQoZnApOwogCi1vdXQ6Ci0gICAgaWYgKCFlcnIpCi0gICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiB+aV9oYXNfeGF0dHJfZGlyOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJaWYgKCFlcnIpCisJCVJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0KKwkJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgfmlfaGFzX3hhdHRyX2RpcjsKKwlyZXR1cm4gZXJyOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmIHsKLSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOwotICAgIHN0cnVjdCBkZW50cnkgKnhhZGlyOwotICAgIHN0cnVjdCBpYXR0ciAqYXR0cnM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICp4YWRpcjsKKwlzdHJ1Y3QgaWF0dHIgKmF0dHJzOwogfTsKIAogLyogWFhYOiBJZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgSSdkIGxvdmUgdG8gaGVhciBhYm91dCBpdCAqLwogc3RhdGljIGludAotcmVpc2VyZnNfY2hvd25feGF0dHJzX2ZpbGxlciAodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCityZWlzZXJmc19jaG93bl94YXR0cnNfZmlsbGVyKHZvaWQgKmJ1ZiwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfY2hvd25fYnVmICpjaG93bl9idWYgPSAoc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqKWJ1ZjsKLSAgICBzdHJ1Y3QgZGVudHJ5ICp4YWZpbGUsICp4YWRpciA9IGNob3duX2J1Zi0+eGFkaXI7Ci0gICAgc3RydWN0IGlhdHRyICphdHRycyA9IGNob3duX2J1Zi0+YXR0cnM7Ci0gICAgaW50IGVyciA9IDA7CisJc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqY2hvd25fYnVmID0gKHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgKilidWY7CisJc3RydWN0IGRlbnRyeSAqeGFmaWxlLCAqeGFkaXIgPSBjaG93bl9idWYtPnhhZGlyOworCXN0cnVjdCBpYXR0ciAqYXR0cnMgPSBjaG93bl9idWYtPmF0dHJzOworCWludCBlcnIgPSAwOwogCi0gICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKLSAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQotICAgICAgICByZXR1cm4gUFRSX0VSUiAoeGFmaWxlKTsKLSAgICBlbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7Ci0gICAgICAgIGRwdXQgKHhhZmlsZSk7Ci0gICAgICAgIHJldHVybiAtRU5PREFUQTsKLSAgICB9CisJeGFmaWxlID0gbG9va3VwX29uZV9sZW4obmFtZSwgeGFkaXIsIG5hbWVsZW4pOworCWlmIChJU19FUlIoeGFmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoeGFmaWxlKTsKKwllbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7CisJCWRwdXQoeGFmaWxlKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KIAotICAgIGlmICghU19JU0RJUiAoeGFmaWxlLT5kX2lub2RlLT5pX21vZGUpKQotICAgICAgICBlcnIgPSBub3RpZnlfY2hhbmdlICh4YWZpbGUsIGF0dHJzKTsKLSAgICBkcHV0ICh4YWZpbGUpOworCWlmICghU19JU0RJUih4YWZpbGUtPmRfaW5vZGUtPmlfbW9kZSkpCisJCWVyciA9IG5vdGlmeV9jaGFuZ2UoeGFmaWxlLCBhdHRycyk7CisJZHB1dCh4YWZpbGUpOwogCi0gICAgcmV0dXJuIGVycjsKKwlyZXR1cm4gZXJyOwogfQogCi1pbnQKLXJlaXNlcmZzX2Nob3duX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKK2ludCByZWlzZXJmc19jaG93bl94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycykKIHsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOwotICAgIHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnIgPSAwOworCXN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgYnVmOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHJzLT5pYV92YWxpZDsKIAotICAgIC8qIFNraXAgb3V0LCBhbiB4YXR0ciBoYXMgbm8geGF0dHJzIGFzc29jaWF0ZWQgd2l0aCBpdCAqLwotICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8Ci0gICAgICAgICFyZWlzZXJmc194YXR0cnMoaW5vZGUtPmlfc2IpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKLSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGlmIChQVFJfRVJSIChkaXIpICE9IC1FTk9EQVRBKQotICAgICAgICAgICAgZXJyID0gUFRSX0VSUiAoZGlyKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7Ci0gICAgICAgIGRwdXQgKGRpcik7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KKwkvKiBTa2lwIG91dCwgYW4geGF0dHIgaGFzIG5vIHhhdHRycyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpIHx8CisJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEgfHwKKwkgICAgIXJlaXNlcmZzX3hhdHRycyhpbm9kZS0+aV9zYikpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWRpciA9IG9wZW5feGFfZGlyKGlub2RlLCBGTF9SRUFET05MWSk7CisJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwlpZiAoSVNfRVJSKGRpcikpIHsKKwkJaWYgKFBUUl9FUlIoZGlyKSAhPSAtRU5PREFUQSkKKwkJCWVyciA9IFBUUl9FUlIoZGlyKTsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7CisJCWRwdXQoZGlyKTsKKwkJZ290byBvdXQ7CisJfQogCi0gICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOwotICAgIGlmIChJU19FUlIgKGZwKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7Ci0gICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gZGVudHJ5X29wZW4oZGlyLCBOVUxMLCBPX1JEV1IpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQkvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisJCWdvdG8gb3V0OworCX0KIAotICAgIGxvY2tfa2VybmVsICgpOworCWxvY2tfa2VybmVsKCk7CiAKLSAgICBhdHRycy0+aWFfdmFsaWQgJj0gKEFUVFJfVUlEIHwgQVRUUl9HSUQgfCBBVFRSX0NUSU1FKTsKLSAgICBidWYueGFkaXIgPSBkaXI7Ci0gICAgYnVmLmF0dHJzID0gYXR0cnM7Ci0gICAgYnVmLmlub2RlID0gaW5vZGU7CisJYXR0cnMtPmlhX3ZhbGlkICY9IChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9DVElNRSk7CisJYnVmLnhhZGlyID0gZGlyOworCWJ1Zi5hdHRycyA9IGF0dHJzOworCWJ1Zi5pbm9kZSA9IGlub2RlOwogCi0gICAgZXJyID0geGF0dHJfcmVhZGRpciAoZnAsIHJlaXNlcmZzX2Nob3duX3hhdHRyc19maWxsZXIsICZidWYpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgdW5sb2NrX2tlcm5lbCAoKTsKLSAgICAgICAgZ290byBvdXRfZGlyOwotICAgIH0KKwllcnIgPSB4YXR0cl9yZWFkZGlyKGZwLCByZWlzZXJmc19jaG93bl94YXR0cnNfZmlsbGVyLCAmYnVmKTsKKwlpZiAoZXJyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJZ290byBvdXRfZGlyOworCX0KIAotICAgIGVyciA9IG5vdGlmeV9jaGFuZ2UgKGRpciwgYXR0cnMpOwotICAgIHVubG9ja19rZXJuZWwgKCk7CisJZXJyID0gbm90aWZ5X2NoYW5nZShkaXIsIGF0dHJzKTsKKwl1bmxvY2tfa2VybmVsKCk7CiAKLW91dF9kaXI6Ci0gICAgZnB1dChmcCk7CisgICAgICBvdXRfZGlyOgorCWZwdXQoZnApOwogCi1vdXQ6Ci0gICAgYXR0cnMtPmlhX3ZhbGlkID0gaWFfdmFsaWQ7Ci0gICAgcmV0dXJuIGVycjsKKyAgICAgIG91dDoKKwlhdHRycy0+aWFfdmFsaWQgPSBpYV92YWxpZDsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qIEFjdHVhbCBvcGVyYXRpb25zIHRoYXQgYXJlIGV4cG9ydGVkIHRvIFZGUy1sYW5kICovCiAKIC8qCkBAIC05NDYsNjEgKzk1MCw2MCBAQAogICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCiAgKi8KIHNzaXplX3QKLXJlaXNlcmZzX2dldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3JlaXNlcmZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKwkJICBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7Ci0gICAgaW50IGVycjsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChuYW1lKTsKKwlpbnQgZXJyOwogCi0gICAgaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAorCSAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbihkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICBlcnIgPSB4YWgtPmdldCAoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CisJZXJyID0geGFoLT5nZXQoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qCiAgKiBJbm9kZSBvcGVyYXRpb24gc2V0eGF0dHIoKQogICoKICAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgogICovCiBpbnQKLXJlaXNlcmZzX3NldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCityZWlzZXJmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOwotICAgIGludCBlcnI7Ci0gICAgaW50IGxvY2s7CisJc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXgobmFtZSk7CisJaW50IGVycjsKKwlpbnQgbG9jazsKIAotICAgIGlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAotICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIGlmIChJU19SRE9OTFkgKGRlbnRyeS0+ZF9pbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX1JET05MWShkZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gLUVST0ZTOwogCi0gICAgaWYgKElTX0lNTVVUQUJMRSAoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQgKGRlbnRyeS0+ZF9pbm9kZSkpCi0gICAgICAgIHJldHVybiAtRVJPRlM7CisJaWYgKElTX0lNTVVUQUJMRShkZW50cnktPmRfaW5vZGUpIHx8IElTX0FQUEVORChkZW50cnktPmRfaW5vZGUpKQorCQlyZXR1cm4gLUVST0ZTOwogCi0gICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIGxvY2sgPSAhaGFzX3hhdHRyX2RpciAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICBpZiAobG9jaykKLSAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZWxzZQotICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOwotICAgIGVyciA9IHhhaC0+c2V0IChkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7Ci0gICAgaWYgKGxvY2spCi0gICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZWxzZQotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmV0dXJuIGVycjsKKwlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlsb2NrID0gIWhhc194YXR0cl9kaXIoZGVudHJ5LT5kX2lub2RlKTsKKwlpZiAobG9jaykKKwkJcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllbHNlCisJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllcnIgPSB4YWgtPnNldChkZW50cnktPmRfaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJaWYgKGxvY2spCisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKKwllbHNlCisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTEwMDgsMzQ0ICsxMDExLDM0MyBAQAogICoKICAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgogICovCi1pbnQKLXJlaXNlcmZzX3JlbW92ZXhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQgcmVpc2VyZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIGludCBlcnI7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKG5hbWUpOworCWludCBlcnI7CisJc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IGZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXgobmFtZSk7CiAKLSAgICBpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKLSAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQotICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8CisJICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgICBpZiAoSVNfUkRPTkxZIChkZW50cnktPmRfaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVST0ZTOworCWlmIChJU19SRE9OTFkoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKIAotICAgIGlmIChJU19JTU1VVEFCTEUgKGRlbnRyeS0+ZF9pbm9kZSkgfHwgSVNfQVBQRU5EIChkZW50cnktPmRfaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmIChJU19JTU1VVEFCTEUoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaShkZW50cnktPmRfaW5vZGUpOworCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoZGVudHJ5LT5kX3NiKTsKIAotICAgIC8qIERlbGV0aW9uIHByZS1vcGVyYXRpb24gKi8KLSAgICBpZiAoeGFoLT5kZWwpIHsKLSAgICAgICAgZXJyID0geGFoLT5kZWwgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSk7Ci0gICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICBnb3RvIG91dDsKLSAgICB9CisJLyogRGVsZXRpb24gcHJlLW9wZXJhdGlvbiAqLworCWlmICh4YWgtPmRlbCkgeworCQllcnIgPSB4YWgtPmRlbChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQogCi0gICAgZXJyID0gcmVpc2VyZnNfeGF0dHJfZGVsIChkZW50cnktPmRfaW5vZGUsIG5hbWUpOworCWVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbChkZW50cnktPmRfaW5vZGUsIG5hbWUpOwogCi0gICAgZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLSAgICBtYXJrX2lub2RlX2RpcnR5IChkZW50cnktPmRfaW5vZGUpOworCWRlbnRyeS0+ZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkZW50cnktPmRfaW5vZGUpOwogCi1vdXQ6Ci0gICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOwotICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJldHVybiBlcnI7CisgICAgICBvdXQ6CisJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGRlbnRyeS0+ZF9zYik7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2koZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCi0KIC8qIFRoaXMgaXMgd2hhdCBmaWxsZGlyIHdpbGwgdXNlOgogICogcl9wb3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgYW1vdW50IG9mIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgZW50aXJlCiAgKiBsaXN0LiBJZiByX3BvcyBiZWNvbWVzIGxhcmdlciB0aGFuIHJfc2l6ZSwgd2UgbmVlZCBtb3JlIHNwYWNlIGFuZCB3ZQogICogcmV0dXJuIGFuIGVycm9yIGluZGljYXRpbmcgdGhpcy4gSWYgcl9wb3MgaXMgbGVzcyB0aGFuIHJfc2l6ZSwgdGhlbiB3ZSd2ZQogICogZmlsbGVkIHRoZSBidWZmZXIgc3VjY2Vzc2Z1bGx5IGFuZCB3ZSByZXR1cm4gc3VjY2VzcyAqLwogc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgewotICAgIGludCByX3BvczsKLSAgICBpbnQgcl9zaXplOwotICAgIGNoYXIgKnJfYnVmOwotICAgIHN0cnVjdCBpbm9kZSAqcl9pbm9kZTsKKwlpbnQgcl9wb3M7CisJaW50IHJfc2l6ZTsKKwljaGFyICpyX2J1ZjsKKwlzdHJ1Y3QgaW5vZGUgKnJfaW5vZGU7CiB9OwogCiBzdGF0aWMgaW50Ci1yZWlzZXJmc19saXN0eGF0dHJfZmlsbGVyICh2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQorcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlcih2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKmIgPSAoc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKilidWY7Ci0gICAgaW50IGxlbiA9IDA7Ci0gICAgaWYgKG5hbWVbMF0gIT0gJy4nIHx8IChuYW1lbGVuICE9IDEgJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVsZW4gIT0gMikpKSB7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPSBmaW5kX3hhdHRyX2hhbmRsZXJfcHJlZml4IChuYW1lKTsKLSAgICAgICAgaWYgKCF4YWgpIHJldHVybiAwOyAvKiBVbnN1cHBvcnRlZCB4YXR0ciBuYW1lLCBza2lwIGl0ICovCisJc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKmIgPSAoc3RydWN0IHJlaXNlcmZzX2xpc3R4YXR0cl9idWYgKilidWY7CisJaW50IGxlbiA9IDA7CisJaWYgKG5hbWVbMF0gIT0gJy4nCisJICAgIHx8IChuYW1lbGVuICE9IDEgJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVsZW4gIT0gMikpKSB7CisJCXN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPQorCQkgICAgZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChuYW1lKTsKKwkJaWYgKCF4YWgpCisJCQlyZXR1cm4gMDsJLyogVW5zdXBwb3J0ZWQgeGF0dHIgbmFtZSwgc2tpcCBpdCAqLwogCi0gICAgICAgIC8qIFdlIGNhbGwgLT5saXN0KCkgdHdpY2UgYmVjYXVzZSB0aGUgb3BlcmF0aW9uIGlzbid0IHJlcXVpcmVkIHRvIGp1c3QKLSAgICAgICAgICogcmV0dXJuIHRoZSBuYW1lIGJhY2sgLSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSAqLwotICAgICAgICBsZW4gKz0geGFoLT5saXN0IChiLT5yX2lub2RlLCBuYW1lLCBuYW1lbGVuLCBOVUxMKTsKKwkJLyogV2UgY2FsbCAtPmxpc3QoKSB0d2ljZSBiZWNhdXNlIHRoZSBvcGVyYXRpb24gaXNuJ3QgcmVxdWlyZWQgdG8ganVzdAorCQkgKiByZXR1cm4gdGhlIG5hbWUgYmFjayAtIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlICovCisJCWxlbiArPSB4YWgtPmxpc3QoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgTlVMTCk7CiAKLSAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgaWYgKGItPnJfcG9zICsgbGVuICsgMSA8PSBiLT5yX3NpemUpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwID0gYi0+cl9idWYgKyBiLT5yX3BvczsKLSAgICAgICAgICAgICAgICBwICs9IHhhaC0+bGlzdCAoYi0+cl9pbm9kZSwgbmFtZSwgbmFtZWxlbiwgcCk7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiLT5yX3BvcyArPSBsZW4gKyAxOwotICAgICAgICB9Ci0gICAgfQorCQlpZiAobGVuKSB7CisJCQlpZiAoYi0+cl9wb3MgKyBsZW4gKyAxIDw9IGItPnJfc2l6ZSkgeworCQkJCWNoYXIgKnAgPSBiLT5yX2J1ZiArIGItPnJfcG9zOworCQkJCXAgKz0geGFoLT5saXN0KGItPnJfaW5vZGUsIG5hbWUsIG5hbWVsZW4sIHApOworCQkJCSpwKysgPSAnXDAnOworCQkJfQorCQkJYi0+cl9wb3MgKz0gbGVuICsgMTsKKwkJfQorCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQorCiAvKgogICogSW5vZGUgb3BlcmF0aW9uIGxpc3R4YXR0cigpCiAgKgogICogUHJlbGltaW5hcnkgbG9ja2luZzogd2UgZG93biBkZW50cnktPmRfaW5vZGUtPmlfc2VtCiAgKi8KLXNzaXplX3QKLXJlaXNlcmZzX2xpc3R4YXR0ciAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQorc3NpemVfdCByZWlzZXJmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBzdHJ1Y3QgZmlsZSAqZnA7Ci0gICAgc3RydWN0IGRlbnRyeSAqZGlyOwotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIGJ1ZjsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBlcnIgPSAwOworCXN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIGJ1ZjsKIAotICAgIGlmICghZGVudHJ5LT5kX2lub2RlKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8Ci0gICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKwkgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOwotICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7Ci0gICAgZGlyID0gb3Blbl94YV9kaXIgKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOwotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKLSAgICBpZiAoSVNfRVJSIChkaXIpKSB7Ci0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7Ci0gICAgICAgIGlmIChlcnIgPT0gLUVOT0RBVEEpCi0gICAgICAgICAgICBlcnIgPSAwOyAvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCWRpciA9IG9wZW5feGFfZGlyKGRlbnRyeS0+ZF9pbm9kZSwgRkxfUkVBRE9OTFkpOworCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhkZW50cnktPmRfc2IpOworCWlmIChJU19FUlIoZGlyKSkgeworCQllcnIgPSBQVFJfRVJSKGRpcik7CisJCWlmIChlcnIgPT0gLUVOT0RBVEEpCisJCQllcnIgPSAwOwkvKiBOb3QgYW4gZXJyb3IgaWYgdGhlcmUgYXJlbid0IGFueSB4YXR0cnMgKi8KKwkJZ290byBvdXQ7CisJfQogCi0gICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOwotICAgIGlmIChJU19FUlIgKGZwKSkgewotICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7Ci0gICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQorCWZwID0gZGVudHJ5X29wZW4oZGlyLCBOVUxMLCBPX1JEV1IpOworCWlmIChJU19FUlIoZnApKSB7CisJCWVyciA9IFBUUl9FUlIoZnApOworCQkvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisJCWdvdG8gb3V0OworCX0KIAotICAgIGJ1Zi5yX2J1ZiA9IGJ1ZmZlcjsKLSAgICBidWYucl9zaXplID0gYnVmZmVyID8gc2l6ZSA6IDA7Ci0gICAgYnVmLnJfcG9zID0gMDsKLSAgICBidWYucl9pbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlidWYucl9idWYgPSBidWZmZXI7CisJYnVmLnJfc2l6ZSA9IGJ1ZmZlciA/IHNpemUgOiAwOworCWJ1Zi5yX3BvcyA9IDA7CisJYnVmLnJfaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAKLSAgICBSRUlTRVJGU19JKGRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOworCVJFSVNFUkZTX0koZGVudHJ5LT5kX2lub2RlKS0+aV9mbGFncyB8PSBpX2hhc194YXR0cl9kaXI7CiAKLSAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfbGlzdHhhdHRyX2ZpbGxlciwgJmJ1Zik7Ci0gICAgaWYgKGVycikKLSAgICAgICAgZ290byBvdXRfZGlyOworCWVyciA9IHhhdHRyX3JlYWRkaXIoZnAsIHJlaXNlcmZzX2xpc3R4YXR0cl9maWxsZXIsICZidWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2RpcjsKIAotICAgIGlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQotICAgICAgICBlcnIgPSAtRVJBTkdFOwotICAgIGVsc2UKLSAgICAgICAgZXJyID0gYnVmLnJfcG9zOworCWlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQorCQllcnIgPSAtRVJBTkdFOworCWVsc2UKKwkJZXJyID0gYnVmLnJfcG9zOwogCi1vdXRfZGlyOgotICAgIGZwdXQoZnApOworICAgICAgb3V0X2RpcjoKKwlmcHV0KGZwKTsKIAotb3V0OgotICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7Ci0gICAgcmV0dXJuIGVycjsKKyAgICAgIG91dDoKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pKGRlbnRyeS0+ZF9pbm9kZSk7CisJcmV0dXJuIGVycjsKIH0KIAogLyogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB4YXR0ciBwbHVnaW4gaW5mcmFzdHJ1Y3R1cmUgKi8KLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQgKHhhdHRyX2hhbmRsZXJzKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHhhdHRyX2hhbmRsZXJzID0gTElTVF9IRUFEX0lOSVQoeGF0dHJfaGFuZGxlcnMpOwogc3RhdGljIERFRklORV9SV0xPQ0soaGFuZGxlcl9sb2NrKTsKIAotc3RhdGljIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICoKLWZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKGNvbnN0IGNoYXIgKnByZWZpeCkKK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeChjb25zdCBjaGFyCisJCQkJCQkJCSpwcmVmaXgpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaCA9IE5VTEw7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCi0gICAgcmVhZF9sb2NrICgmaGFuZGxlcl9sb2NrKTsKLSAgICBsaXN0X2Zvcl9lYWNoIChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKLSAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKLSAgICAgICAgaWYgKHN0cm5jbXAgKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbiAoeGFoLT5wcmVmaXgpKSA9PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHhhaCA9IE5VTEw7Ci0gICAgfQorCXJlYWRfbG9jaygmaGFuZGxlcl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ4YXR0cl9oYW5kbGVycykgeworCQl4YWggPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisJCWlmIChzdHJuY21wKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbih4YWgtPnByZWZpeCkpID09IDApCisJCQlicmVhazsKKwkJeGFoID0gTlVMTDsKKwl9CiAKLSAgICByZWFkX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Ci0gICAgcmV0dXJuIHhhaDsKKwlyZWFkX3VubG9jaygmaGFuZGxlcl9sb2NrKTsKKwlyZXR1cm4geGFoOwogfQogCi1zdGF0aWMgdm9pZAotX191bnJlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQorc3RhdGljIHZvaWQgX191bnJlZ2lzdGVyX2hhbmRsZXJzKHZvaWQpCiB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqdG1wOworCXN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnRtcDsKIAotICAgIGxpc3RfZm9yX2VhY2hfc2FmZSAocCwgdG1wLCAmeGF0dHJfaGFuZGxlcnMpIHsKLSAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKLSAgICAgICAgaWYgKHhhaC0+ZXhpdCkKLSAgICAgICAgICAgIHhhaC0+ZXhpdCgpOworCWxpc3RfZm9yX2VhY2hfc2FmZShwLCB0bXAsICZ4YXR0cl9oYW5kbGVycykgeworCQl4YWggPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyLCBoYW5kbGVycyk7CisJCWlmICh4YWgtPmV4aXQpCisJCQl4YWgtPmV4aXQoKTsKIAotICAgICAgICBsaXN0X2RlbF9pbml0IChwKTsKLSAgICB9Ci0gICAgSU5JVF9MSVNUX0hFQUQgKCZ4YXR0cl9oYW5kbGVycyk7CisJCWxpc3RfZGVsX2luaXQocCk7CisJfQorCUlOSVRfTElTVF9IRUFEKCZ4YXR0cl9oYW5kbGVycyk7CiB9CiAKLWludCBfX2luaXQKLXJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKQoraW50IF9faW5pdCByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKQogewotICAgIGludCBlcnIgPSAwOwotICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWg7Ci0gICAgc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKLSAgICB3cml0ZV9sb2NrICgmaGFuZGxlcl9sb2NrKTsKKwl3cml0ZV9sb2NrKCZoYW5kbGVyX2xvY2spOwogCi0gICAgLyogSWYgd2UncmUgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyB0byBkbyAqLwotICAgIGlmICghbGlzdF9lbXB0eSAoJnhhdHRyX2hhbmRsZXJzKSkgewotICAgICAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisJLyogSWYgd2UncmUgYWxyZWFkeSBpbml0aWFsaXplZCwgbm90aGluZyB0byBkbyAqLworCWlmICghbGlzdF9lbXB0eSgmeGF0dHJfaGFuZGxlcnMpKSB7CisJCXdyaXRlX3VubG9jaygmaGFuZGxlcl9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgLyogQWRkIHRoZSBoYW5kbGVycyAqLwotICAgIGxpc3RfYWRkX3RhaWwgKCZ1c2VyX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7Ci0gICAgbGlzdF9hZGRfdGFpbCAoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKwkvKiBBZGQgdGhlIGhhbmRsZXJzICovCisJbGlzdF9hZGRfdGFpbCgmdXNlcl9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworCWxpc3RfYWRkX3RhaWwoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFkKLSAgICBsaXN0X2FkZF90YWlsICgmc2VjdXJpdHlfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKwlsaXN0X2FkZF90YWlsKCZzZWN1cml0eV9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAotICAgIGxpc3RfYWRkX3RhaWwgKCZwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7Ci0gICAgbGlzdF9hZGRfdGFpbCAoJnBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CisJbGlzdF9hZGRfdGFpbCgmcG9zaXhfYWNsX2FjY2Vzc19oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworCWxpc3RfYWRkX3RhaWwoJnBvc2l4X2FjbF9kZWZhdWx0X2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CiAjZW5kaWYKIAotICAgIC8qIFJ1biBpbml0aWFsaXplcnMsIGlmIGF2YWlsYWJsZSAqLwotICAgIGxpc3RfZm9yX2VhY2ggKHAsICZ4YXR0cl9oYW5kbGVycykgewotICAgICAgICB4YWggPSBsaXN0X2VudHJ5IChwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOwotICAgICAgICBpZiAoeGFoLT5pbml0KSB7Ci0gICAgICAgICAgICBlcnIgPSB4YWgtPmluaXQgKCk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCAocCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisJLyogUnVuIGluaXRpYWxpemVycywgaWYgYXZhaWxhYmxlICovCisJbGlzdF9mb3JfZWFjaChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKKwkJeGFoID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOworCQlpZiAoeGFoLT5pbml0KSB7CisJCQllcnIgPSB4YWgtPmluaXQoKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlsaXN0X2RlbF9pbml0KHApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQogCi0gICAgLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KLSAgICBpZiAoZXJyKQotICAgICAgICBfX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisJLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KKwlpZiAoZXJyKQorCQlfX3VucmVnaXN0ZXJfaGFuZGxlcnMoKTsKIAotICAgIHdyaXRlX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Ci0gICAgcmV0dXJuIGVycjsKKwl3cml0ZV91bmxvY2soJmhhbmRsZXJfbG9jayk7CisJcmV0dXJuIGVycjsKIH0KIAotdm9pZAotcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAodm9pZCkKK3ZvaWQgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKQogewotICAgIHdyaXRlX2xvY2sgKCZoYW5kbGVyX2xvY2spOwotICAgIF9fdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKLSAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOworCXdyaXRlX2xvY2soJmhhbmRsZXJfbG9jayk7CisJX191bnJlZ2lzdGVyX2hhbmRsZXJzKCk7CisJd3JpdGVfdW5sb2NrKCZoYW5kbGVyX2xvY2spOwogfQogCiAvKiBUaGlzIHdpbGwgY2F0Y2ggbG9va3VwcyBmcm9tIHRoZSBmcyByb290IHRvIC5yZWlzZXJmc19wcml2ICovCiBzdGF0aWMgaW50Ci14YXR0cl9sb29rdXBfcG9pc29uIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxMSwgc3RydWN0IHFzdHIgKm5hbWUpCit4YXR0cl9sb29rdXBfcG9pc29uKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnExLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2X3Jvb3QgPSBSRUlTRVJGU19TQihkZW50cnktPmRfc2IpLT5wcml2X3Jvb3Q7Ci0gICAgaWYgKG5hbWUtPmxlbiA9PSBwcml2X3Jvb3QtPmRfbmFtZS5sZW4gJiYKLSAgICAgICAgbmFtZS0+aGFzaCA9PSBwcml2X3Jvb3QtPmRfbmFtZS5oYXNoICYmCi0gICAgICAgICFtZW1jbXAgKG5hbWUtPm5hbWUsIHByaXZfcm9vdC0+ZF9uYW1lLm5hbWUsIG5hbWUtPmxlbikpIHsKLSAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKLSAgICAgICAgICAgICAgICFtZW1jbXAocTEtPm5hbWUsIG5hbWUtPm5hbWUsIG5hbWUtPmxlbikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAxOworCXN0cnVjdCBkZW50cnkgKnByaXZfcm9vdCA9IFJFSVNFUkZTX1NCKGRlbnRyeS0+ZF9zYiktPnByaXZfcm9vdDsKKwlpZiAobmFtZS0+bGVuID09IHByaXZfcm9vdC0+ZF9uYW1lLmxlbiAmJgorCSAgICBuYW1lLT5oYXNoID09IHByaXZfcm9vdC0+ZF9uYW1lLmhhc2ggJiYKKwkgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBwcml2X3Jvb3QtPmRfbmFtZS5uYW1lLCBuYW1lLT5sZW4pKSB7CisJCXJldHVybiAtRU5PRU5UOworCX0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKKwkJICAgIW1lbWNtcChxMS0+bmFtZSwgbmFtZS0+bmFtZSwgbmFtZS0+bGVuKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgeGF0dHJfbG9va3VwX3BvaXNvbl9vcHMgPSB7Ci0gICAgLmRfY29tcGFyZSA9IHhhdHRyX2xvb2t1cF9wb2lzb24sCisJLmRfY29tcGFyZSA9IHhhdHRyX2xvb2t1cF9wb2lzb24sCiB9OwogCi0KIC8qIFdlIG5lZWQgdG8gdGFrZSBhIGNvcHkgb2YgdGhlIG1vdW50IGZsYWdzIHNpbmNlIHRoaW5ncyBsaWtlCiAgKiBNU19SRE9OTFkgZG9uJ3QgZ2V0IHNldCB1bnRpbCAqYWZ0ZXIqIHdlJ3JlIGNhbGxlZC4KICAqIG1vdW50X2ZsYWdzICE9IG1vdW50X29wdGlvbnMgKi8KLWludAotcmVpc2VyZnNfeGF0dHJfaW5pdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbW91bnRfZmxhZ3MpCitpbnQgcmVpc2VyZnNfeGF0dHJfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBtb3VudF9mbGFncykKIHsKLSAgaW50IGVyciA9IDA7CisJaW50IGVyciA9IDA7CiAKLSAgLyogV2UgbmVlZCBnZW5lcmF0aW9uIG51bWJlcnMgdG8gZW5zdXJlIHRoYXQgdGhlIG9pZCBtYXBwaW5nIGlzIGNvcnJlY3QKLSAgICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCi0gIGlmICghb2xkX2Zvcm1hdF9vbmx5IChzKSkgewotICAgIHNldF9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwgKHMpKSB7Ci0gICAgLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCi0gICAgICogYXQgbW91bnQgdGltZS4gRXJyb3Igb3V0LiAqLwotICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ4YXR0cnMvQUNMcyBub3Qgc3VwcG9ydGVkIG9uIHByZSB2My42ICIKLSAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IGZpbGVzeXN0ZW0uIEZhaWxpbmcgbW91bnQuIik7Ci0gICAgZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgZ290byBlcnJvcjsKLSAgfSBlbHNlIHsKLSAgICAvKiBPbGQgZm9ybWF0IGZpbGVzeXN0ZW0sIGJ1dCBubyBvcHRpb25hbCB4YXR0cnMgaGF2ZSBiZWVuIGVuYWJsZWQuIFRoaXMKLSAgICAgKiBtZWFucyB3ZSBzaWxlbnRseSBkaXNhYmxlIHhhdHRycyBvbiB0aGUgZmlsZXN5c3RlbS4gKi8KLSAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgfQorCS8qIFdlIG5lZWQgZ2VuZXJhdGlvbiBudW1iZXJzIHRvIGVuc3VyZSB0aGF0IHRoZSBvaWQgbWFwcGluZyBpcyBjb3JyZWN0CisJICogdjMuNSBmaWxlc3lzdGVtcyBkb24ndCBoYXZlIHRoZW0uICovCisJaWYgKCFvbGRfZm9ybWF0X29ubHkocykpIHsKKwkJc2V0X2JpdChSRUlTRVJGU19YQVRUUlMsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisJfSBlbHNlIGlmIChyZWlzZXJmc194YXR0cnNfb3B0aW9uYWwocykpIHsKKwkJLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkCisJCSAqIGF0IG1vdW50IHRpbWUuIEVycm9yIG91dC4gKi8KKwkJcmVpc2VyZnNfd2FybmluZyhzLCAieGF0dHJzL0FDTHMgbm90IHN1cHBvcnRlZCBvbiBwcmUgdjMuNiAiCisJCQkJICJmb3JtYXQgZmlsZXN5c3RlbS4gRmFpbGluZyBtb3VudC4iKTsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gZXJyb3I7CisJfSBlbHNlIHsKKwkJLyogT2xkIGZvcm1hdCBmaWxlc3lzdGVtLCBidXQgbm8gb3B0aW9uYWwgeGF0dHJzIGhhdmUgYmVlbiBlbmFibGVkLiBUaGlzCisJCSAqIG1lYW5zIHdlIHNpbGVudGx5IGRpc2FibGUgeGF0dHJzIG9uIHRoZSBmaWxlc3lzdGVtLiAqLworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworCX0KIAotICAvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSBwcml2cm9vdCBsb2NhdGVkIHlldCAtIGdvIGZpbmQgaXQgKi8KLSAgaWYgKHJlaXNlcmZzX3hhdHRycyAocykgJiYgIVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKLSAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeTsKLSAgICAgIGRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuIChQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuIChQUklWUk9PVF9OQU1FKSk7Ci0gICAgICBpZiAoIUlTX0VSUiAoZGVudHJ5KSkgewotICAgICAgICBpZiAoIShtb3VudF9mbGFncyAmIE1TX1JET05MWSkgJiYgIWRlbnRyeS0+ZF9pbm9kZSkgewotICAgICAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0gICAgICAgICAgICBkb3duICgmaW5vZGUtPmlfc2VtKTsKLSAgICAgICAgICAgIGVyciA9IGlub2RlLT5pX29wLT5ta2RpciAoaW5vZGUsIGRlbnRyeSwgMDcwMCk7Ci0gICAgICAgICAgICB1cCAoJmlub2RlLT5pX3NlbSk7Ci0gICAgICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICAgICAgZHB1dCAoZGVudHJ5KTsKLSAgICAgICAgICAgICAgICBkZW50cnkgPSBOVUxMOwotICAgICAgICAgICAgfQorCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHByaXZyb290IGxvY2F0ZWQgeWV0IC0gZ28gZmluZCBpdCAqLworCWlmIChyZWlzZXJmc194YXR0cnMocykgJiYgIVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCQlkZW50cnkgPSBsb29rdXBfb25lX2xlbihQUklWUk9PVF9OQU1FLCBzLT5zX3Jvb3QsCisJCQkJCXN0cmxlbihQUklWUk9PVF9OQU1FKSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAhZGVudHJ5LT5kX2lub2RlKSB7CisJCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCQkJZG93bigmaW5vZGUtPmlfc2VtKTsKKwkJCQllcnIgPSBpbm9kZS0+aV9vcC0+bWtkaXIoaW5vZGUsIGRlbnRyeSwgMDcwMCk7CisJCQkJdXAoJmlub2RlLT5pX3NlbSk7CisJCQkJaWYgKGVycikgeworCQkJCQlkcHV0KGRlbnRyeSk7CisJCQkJCWRlbnRyeSA9IE5VTEw7CisJCQkJfQogCi0gICAgICAgICAgICBpZiAoZGVudHJ5ICYmIGRlbnRyeS0+ZF9pbm9kZSkKLSAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiQ3JlYXRlZCAlcyBvbiAlcyAtIHJlc2VydmVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhhdHRyIHN0b3JhZ2UuIiwgUFJJVlJPT1RfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoaW5vZGUtPmlfc2IpKTsKLSAgICAgICAgfSBlbHNlIGlmICghZGVudHJ5LT5kX2lub2RlKSB7Ci0gICAgICAgICAgICBkcHV0IChkZW50cnkpOwotICAgICAgICAgICAgZGVudHJ5ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlCi0gICAgICAgIGVyciA9IFBUUl9FUlIgKGRlbnRyeSk7CisJCQkJaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUpCisJCQkJCXJlaXNlcmZzX3dhcm5pbmcocywKKwkJCQkJCQkgIkNyZWF0ZWQgJXMgb24gJXMgLSByZXNlcnZlZCBmb3IgIgorCQkJCQkJCSAieGF0dHIgc3RvcmFnZS4iLAorCQkJCQkJCSBQUklWUk9PVF9OQU1FLAorCQkJCQkJCSByZWlzZXJmc19iZGV2bmFtZQorCQkJCQkJCSAoaW5vZGUtPmlfc2IpKTsKKwkJCX0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQlkZW50cnkgPSBOVUxMOworCQkJfQorCQl9IGVsc2UKKwkJCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKIAotICAgICAgaWYgKCFlcnIgJiYgZGVudHJ5KSB7Ci0gICAgICAgICAgcy0+c19yb290LT5kX29wID0gJnhhdHRyX2xvb2t1cF9wb2lzb25fb3BzOwotICAgICAgICAgIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoZGVudHJ5LT5kX2lub2RlKTsKLSAgICAgICAgICBSRUlTRVJGU19TQihzKS0+cHJpdl9yb290ID0gZGVudHJ5OwotICAgICAgfSBlbHNlIGlmICghKG1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSkgeyAvKiB4YXR0cnMgYXJlIHVuYXZhaWxhYmxlICovCi0gICAgICAgICAgLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCi0gICAgICAgICAgICogY3JlYXRlZC4gTm90IGFuIGVycm9yIC0tIGp1c3Qgbm8geGF0dHJzIG9uIHRoZSBmcy4gV2UnbGwKLSAgICAgICAgICAgKiBjaGVjayBhZ2FpbiBpZiB3ZSBnbyByZWFkLXdyaXRlICovCi0gICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInhhdHRycy9BQ0xzIGVuYWJsZWQgYW5kIGNvdWxkbid0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluZC9jcmVhdGUgLnJlaXNlcmZzX3ByaXYuIEZhaWxpbmcgbW91bnQuIik7Ci0gICAgICAgICAgZXJyID0gLUVPUE5PVFNVUFA7Ci0gICAgICB9Ci0gIH0KKwkJaWYgKCFlcnIgJiYgZGVudHJ5KSB7CisJCQlzLT5zX3Jvb3QtPmRfb3AgPSAmeGF0dHJfbG9va3VwX3BvaXNvbl9vcHM7CisJCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoZGVudHJ5LT5kX2lub2RlKTsKKwkJCVJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QgPSBkZW50cnk7CisJCX0gZWxzZSBpZiAoIShtb3VudF9mbGFncyAmIE1TX1JET05MWSkpIHsJLyogeGF0dHJzIGFyZSB1bmF2YWlsYWJsZSAqLworCQkJLyogSWYgd2UncmUgcmVhZC1vbmx5IGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgZGlyIGhhc24ndCBiZWVuCisJCQkgKiBjcmVhdGVkLiBOb3QgYW4gZXJyb3IgLS0ganVzdCBubyB4YXR0cnMgb24gdGhlIGZzLiBXZSdsbAorCQkJICogY2hlY2sgYWdhaW4gaWYgd2UgZ28gcmVhZC13cml0ZSAqLworCQkJcmVpc2VyZnNfd2FybmluZyhzLCAieGF0dHJzL0FDTHMgZW5hYmxlZCBhbmQgY291bGRuJ3QgIgorCQkJCQkgImZpbmQvY3JlYXRlIC5yZWlzZXJmc19wcml2LiBGYWlsaW5nIG1vdW50LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCX0KKwl9CiAKLWVycm9yOgotICAgLyogVGhpcyBpcyBvbmx5IG5vbnplcm8gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGluaXRpYWxpemluZyB0aGUgeGF0dHIKLSAgICAqIGRpcmVjdG9yeSBvciBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uICovCi0gICAgaWYgKGVycikgewotICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOwotICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTX1VTRVIsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7Ci0gICAgICAgICAgY2xlYXJfYml0IChSRUlTRVJGU19QT1NJWEFDTCwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKLSAgICB9CisgICAgICBlcnJvcjoKKwkvKiBUaGlzIGlzIG9ubHkgbm9uemVybyBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB4YXR0cgorCSAqIGRpcmVjdG9yeSBvciBpZiB0aGVyZSBpcyBhIGNvbmRpdGlvbiB3aGVyZSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uICovCisJaWYgKGVycikgeworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworCQljbGVhcl9iaXQoUkVJU0VSRlNfWEFUVFJTX1VTRVIsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisJCWNsZWFyX2JpdChSRUlTRVJGU19QT1NJWEFDTCwgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKwl9CiAKLSAgICAvKiBUaGUgc3VwZXJfYmxvY2sgTVNfUE9TSVhBQ0wgbXVzdCBtaXJyb3IgdGhlIChubylhY2wgbW91bnQgb3B0aW9uLiAqLwotICAgIHMtPnNfZmxhZ3MgPSBzLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMOwotICAgIGlmIChyZWlzZXJmc19wb3NpeGFjbCAocykpCi0Jcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkvKiBUaGUgc3VwZXJfYmxvY2sgTVNfUE9TSVhBQ0wgbXVzdCBtaXJyb3IgdGhlIChubylhY2wgbW91bnQgb3B0aW9uLiAqLworCXMtPnNfZmxhZ3MgPSBzLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMOworCWlmIChyZWlzZXJmc19wb3NpeGFjbChzKSkKKwkJcy0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKIAotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludAotX19yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuZWVkX2xvY2spCitfX3JlaXNlcmZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kLAorCQkgICAgICBpbnQgbmVlZF9sb2NrKQogewotCXVtb2RlX3QJCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCiAJaWYgKG1hc2sgJiBNQVlfV1JJVEUpIHsKIAkJLyoKQEAgLTEzNjMsNTAgKzEzNjUsNTAgQEAKIAl9CiAKIAkvKiBXZSBkb24ndCBkbyBwZXJtaXNzaW9uIGNoZWNrcyBvbiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4KLQkqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCi0gICAgICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpKQorCSAqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCisJaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY3VycmVudC0+ZnN1aWQgPT0gaW5vZGUtPmlfdWlkKSB7CiAJCW1vZGUgPj49IDY7CiAjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAogCX0gZWxzZSBpZiAocmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpICYmCi0gICAgICAgICAgICAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJCSAgIGdldF9pbm9kZV9zZF92ZXJzaW9uKGlub2RlKSAhPSBTVEFUX0RBVEFfVjEpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCiAJCS8qIEFDTCBjYW4ndCBjb250YWluIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaWYKIAkJICAgdGhlIEFDTF9NQVNLIGVudHJ5IGlzIDAgKi8KIAkJaWYgKCEobW9kZSAmIFNfSVJXWEcpKQogCQkJZ290byBjaGVja19ncm91cHM7CiAKLSAgICAgICAgICAgICAgICBpZiAobmVlZF9sb2NrKSB7Ci0JCSAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJfaSAoaW5vZGUpOwotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisJCWlmIChuZWVkX2xvY2spIHsKKwkJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKGlub2RlKTsKKwkJCXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOwogCQl9Ci0gICAgICAgICAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgaWYgKG5lZWRfbG9jaykgewotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLQkJICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKKwkJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwkJaWYgKG5lZWRfbG9jaykgeworCQkJcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koaW5vZGUpOwogCQl9Ci0gICAgICAgICAgICAgICAgaWYgKElTX0VSUiAoYWNsKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoUFRSX0VSUiAoYWNsKSA9PSAtRU5PREFUQSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2hlY2tfZ3JvdXBzOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUiAoYWNsKTsKLSAgICAgICAgICAgICAgICB9CisJCWlmIChJU19FUlIoYWNsKSkgeworCQkJaWYgKFBUUl9FUlIoYWNsKSA9PSAtRU5PREFUQSkKKwkJCQlnb3RvIGNoZWNrX2dyb3VwczsKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KIAotICAgICAgICAgICAgICAgIGlmIChhY2wpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uIChpbm9kZSwgYWNsLCBtYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBQ0NFUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaGVja19jYXBhYmlsaXRpZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwkJaWYgKGFjbCkgeworCQkJaW50IGVyciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJCWlmIChlcnIgPT0gLUVBQ0NFUykgeworCQkJCWdvdG8gY2hlY2tfY2FwYWJpbGl0aWVzOworCQkJfQorCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKIAkJCWdvdG8gY2hlY2tfZ3JvdXBzOwotICAgICAgICAgICAgICAgIH0KKwkJfQogI2VuZGlmCiAJfSBlbHNlIHsKLWNoZWNrX2dyb3VwczoKKwkgICAgICBjaGVja19ncm91cHM6CiAJCWlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpCiAJCQltb2RlID4+PSAzOwogCX0KQEAgLTE0MTQsMTAgKzE0MTYsMTAgQEAKIAkvKgogCSAqIElmIHRoZSBEQUNzIGFyZSBvayB3ZSBkb24ndCBuZWVkIGFueSBjYXBhYmlsaXR5IGNoZWNrLgogCSAqLwotCWlmICgoKG1vZGUgJiBtYXNrICYgKE1BWV9SRUFEfE1BWV9XUklURXxNQVlfRVhFQykpID09IG1hc2spKQorCWlmICgoKG1vZGUgJiBtYXNrICYgKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpKSA9PSBtYXNrKSkKIAkJcmV0dXJuIDA7CiAKLWNoZWNrX2NhcGFiaWxpdGllczoKKyAgICAgIGNoZWNrX2NhcGFiaWxpdGllczoKIAkvKgogCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgogCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KQEAgLTE0MzcsMTQgKzE0MzksMTMgQEAKIAlyZXR1cm4gLUVBQ0NFUzsKIH0KIAotaW50Ci1yZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0gICAgcmV0dXJuIF9fcmVpc2VyZnNfcGVybWlzc2lvbiAoaW5vZGUsIG1hc2ssIG5kLCAxKTsKKwlyZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBuZCwgMSk7CiB9CiAKIGludAotcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3JlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLSAgICByZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uIChpbm9kZSwgbWFzaywgbmQsIDApOworCXJldHVybiBfX3JlaXNlcmZzX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIG5kLCAwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3hhdHRyX2FjbC5jIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKaW5kZXggYzMxMjg4MS4uNjcwM2VmYSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKQEAgLTksNyArOSw4IEBACiAjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotc3RhdGljIGludCByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpOworc3RhdGljIGludCByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLAorCQkJICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCk7CiAKIHN0YXRpYyBpbnQKIHhhdHRyX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKQEAgLTM0LDE0ICszNSwxMyBAQAogCX0gZWxzZQogCQlhY2wgPSBOVUxMOwogCi0JZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsIChpbm9kZSwgdHlwZSwgYWNsKTsKKwllcnJvciA9IHJlaXNlcmZzX3NldF9hY2woaW5vZGUsIHR5cGUsIGFjbCk7CiAKLXJlbGVhc2VfYW5kX291dDoKKyAgICAgIHJlbGVhc2VfYW5kX291dDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBlcnJvcjsKIH0KIAotCiBzdGF0aWMgaW50CiB4YXR0cl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewpAQCAtNTEsNyArNTEsNyBAQAogCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlhY2wgPSByZWlzZXJmc19nZXRfYWNsIChpbm9kZSwgdHlwZSk7CisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgdHlwZSk7CiAJaWYgKElTX0VSUihhY2wpKQogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCWlmIChhY2wgPT0gTlVMTCkKQEAgLTYyLDEyICs2MiwxMCBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotCiAvKgogICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgogICovCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCi1wb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKIHsKIAljb25zdCBjaGFyICplbmQgPSAoY2hhciAqKXZhbHVlICsgc2l6ZTsKIAlpbnQgbiwgY291bnQ7CkBAIC03Niw4ICs3NCw4IEBACiAJaWYgKCF2YWx1ZSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKHNpemUgPCBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikpCi0JCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQlpZiAoKChyZWlzZXJmc19hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgocmVpc2VyZnNfYWNsX2hlYWRlciAqKSB2YWx1ZSktPmFfdmVyc2lvbiAhPQogCSAgICBjcHVfdG9fbGUzMihSRUlTRVJGU19BQ0xfVkVSU0lPTikpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKTsKQEAgLTg5LDQxICs4NywzOSBAQAogCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX05PRlMpOwogCWlmICghYWNsKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQlmb3IgKG49MDsgbiA8IGNvdW50OyBuKyspIHsKLQkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9Ci0JCQkocmVpc2VyZnNfYWNsX2VudHJ5ICopdmFsdWU7CisJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKikgdmFsdWU7CiAJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCkgPiBlbmQpCiAJCQlnb3RvIGZhaWw7Ci0JCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnICA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3RhZyk7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKIAkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7Ci0JCXN3aXRjaChhY2wtPmFfZW50cmllc1tuXS5lX3RhZykgewotCQkJY2FzZSBBQ0xfVVNFUl9PQko6Ci0JCQljYXNlIEFDTF9HUk9VUF9PQko6Ci0JCQljYXNlIEFDTF9NQVNLOgotCQkJY2FzZSBBQ0xfT1RIRVI6Ci0JCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsKLQkJCQkJc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCk7Ci0JCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7Ci0JCQkJYnJlYWs7CisJCXN3aXRjaCAoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKworCQkJICAgIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7CisJCQlicmVhazsKIAotCQkJY2FzZSBBQ0xfVVNFUjoKLQkJCWNhc2UgQUNMX0dST1VQOgotCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwotCQkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJYWNsLT5hX2VudHJpZXNbbl0uZV9pZCA9Ci0JCQkJCWxlMzJfdG9fY3B1KGVudHJ5LT5lX2lkKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKKwkJY2FzZSBBQ0xfVVNFUjoKKwkJY2FzZSBBQ0xfR1JPVVA6CisJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKyBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KTsKKwkJCWlmICgoY2hhciAqKXZhbHVlID4gZW5kKQogCQkJCWdvdG8gZmFpbDsKKwkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOwogCQl9CiAJfQogCWlmICh2YWx1ZSAhPSBlbmQpCiAJCWdvdG8gZmFpbDsKIAlyZXR1cm4gYWNsOwogCi1mYWlsOgorICAgICAgZmFpbDoKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQpAQCAtMTMxLDQ2ICsxMjcsNDYgQEAKIC8qCiAgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IHRvIGZpbGVzeXN0ZW0gcmVwcmVzZW50YXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkICoKLXBvc2l4X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQorc3RhdGljIHZvaWQgKnBvc2l4X2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICogc2l6ZSkKIHsKIAlyZWlzZXJmc19hY2xfaGVhZGVyICpleHRfYWNsOwogCWNoYXIgKmU7CiAJaW50IG47CiAKIAkqc2l6ZSA9IHJlaXNlcmZzX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7Ci0JZXh0X2FjbCA9IChyZWlzZXJmc19hY2xfaGVhZGVyICopa21hbGxvYyhzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikgKwotCQlhY2wtPmFfY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KSwgR0ZQX05PRlMpOworCWV4dF9hY2wgPSAocmVpc2VyZnNfYWNsX2hlYWRlciAqKSBrbWFsbG9jKHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKSArCisJCQkJCQkgIGFjbC0+YV9jb3VudCAqCisJCQkJCQkgIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpLAorCQkJCQkJICBHRlBfTk9GUyk7CiAJaWYgKCFleHRfYWNsKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihSRUlTRVJGU19BQ0xfVkVSU0lPTik7CiAJZSA9IChjaGFyICopZXh0X2FjbCArIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKTsKLQlmb3IgKG49MDsgbiA8IGFjbC0+YV9jb3VudDsgbisrKSB7Ci0JCXJlaXNlcmZzX2FjbF9lbnRyeSAqZW50cnkgPSAocmVpc2VyZnNfYWNsX2VudHJ5ICopZTsKLQkJZW50cnktPmVfdGFnICA9IGNwdV90b19sZTE2KGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKTsKKwlmb3IgKG4gPSAwOyBuIDwgYWNsLT5hX2NvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9IChyZWlzZXJmc19hY2xfZW50cnkgKikgZTsKKwkJZW50cnktPmVfdGFnID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOwogCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKLQkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7Ci0JCQljYXNlIEFDTF9VU0VSOgotCQkJY2FzZSBBQ0xfR1JPVVA6Ci0JCQkJZW50cnktPmVfaWQgPQotCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKLQkJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOwotCQkJCWJyZWFrOworCQlzd2l0Y2ggKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVI6CisJCWNhc2UgQUNMX0dST1VQOgorCQkJZW50cnktPmVfaWQgPSBjcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCWUgKz0gc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CisJCQlicmVhazsKIAotCQkJY2FzZSBBQ0xfVVNFUl9PQko6Ci0JCQljYXNlIEFDTF9HUk9VUF9PQko6Ci0JCQljYXNlIEFDTF9NQVNLOgotCQkJY2FzZSBBQ0xfT1RIRVI6Ci0JCQkJZSArPSBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKLQkJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQllICs9IHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJYnJlYWs7CiAKLQkJCWRlZmF1bHQ6Ci0JCQkJZ290byBmYWlsOworCQlkZWZhdWx0OgorCQkJZ290byBmYWlsOwogCQl9CiAJfQogCXJldHVybiAoY2hhciAqKWV4dF9hY2w7CiAKLWZhaWw6CisgICAgICBmYWlsOgogCWtmcmVlKGV4dF9hY2wpOwogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQpAQCAtMTgxLDU5ICsxNzcsNTggQEAKICAqIGlub2RlLT5pX3NlbTogZG93bgogICogQktMIGhlbGQgW2JlZm9yZSAyLjUueF0KICAqLwotc3RydWN0IHBvc2l4X2FjbCAqCi1yZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQorc3RydWN0IHBvc2l4X2FjbCAqcmVpc2VyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAljaGFyICpuYW1lLCAqdmFsdWU7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqKnBfYWNsOwogCXNpemVfdCBzaXplOwogCWludCByZXR2YWw7Ci0gICAgICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwotICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLSAgICAgICAgICAgICAgICBuYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcF9hY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfZGVmYXVsdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FSU5WQUwpOwotICAgICAgICB9CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOworCQlwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9hY2Nlc3M7CisJCWJyZWFrOworCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUOworCQlwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CiAKLSAgICAgICAgaWYgKElTX0VSUiAoKnBfYWNsKSkgewotICAgICAgICAgICAgaWYgKFBUUl9FUlIgKCpwX2FjbCkgPT0gLUVOT0RBVEEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gZWxzZSBpZiAoKnBfYWNsICE9IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gcG9zaXhfYWNsX2R1cCAoKnBfYWNsKTsKKwlpZiAoSVNfRVJSKCpwX2FjbCkpIHsKKwkJaWYgKFBUUl9FUlIoKnBfYWNsKSA9PSAtRU5PREFUQSkKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoKnBfYWNsICE9IE5VTEwpCisJCXJldHVybiBwb3NpeF9hY2xfZHVwKCpwX2FjbCk7CiAKLSAgICAgICAgc2l6ZSA9IHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIE5VTEwsIDApOwotICAgICAgICBpZiAoKGludClzaXplIDwgMCkgewotICAgICAgICAgICAgaWYgKHNpemUgPT0gLUVOT0RBVEEgfHwgc2l6ZSA9PSAtRU5PU1lTKSB7Ci0JCSpwX2FjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKLQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoc2l6ZSk7Ci0gICAgICAgIH0KKwlzaXplID0gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBOVUxMLCAwKTsKKwlpZiAoKGludClzaXplIDwgMCkgeworCQlpZiAoc2l6ZSA9PSAtRU5PREFUQSB8fCBzaXplID09IC1FTk9TWVMpIHsKKwkJCSpwX2FjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIEVSUl9QVFIoc2l6ZSk7CisJfQogCi0gICAgICAgIHZhbHVlID0ga21hbGxvYyAoc2l6ZSwgR0ZQX05PRlMpOwotICAgICAgICBpZiAoIXZhbHVlKQotICAgICAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9NRU0pOworCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlyZXR2YWwgPSByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplKTsKIAlpZiAocmV0dmFsID09IC1FTk9EQVRBIHx8IHJldHZhbCA9PSAtRU5PU1lTKSB7CiAJCS8qIFRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbiBhcyBpdCBzaG91bGQgaGF2ZQogCQkgICBiZWVuIGNhdWdodCBhYm92ZS4uIGJ1dCBqdXN0IGluIGNhc2UgKi8KIAkJYWNsID0gTlVMTDsKLQkJKnBfYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA8IDApIHsKKwkJKnBfYWNsID0gRVJSX1BUUigtRU5PREFUQSk7CisJfSBlbHNlIGlmIChyZXR2YWwgPCAwKSB7CiAJCWFjbCA9IEVSUl9QVFIocmV0dmFsKTsKIAl9IGVsc2UgewogCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV9kaXNrKHZhbHVlLCByZXR2YWwpOwotCQkqcF9hY2wgPSBwb3NpeF9hY2xfZHVwIChhY2wpOwotICAgICAgICB9CisJCSpwX2FjbCA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKKwl9CiAKIAlrZnJlZSh2YWx1ZSk7CiAJcmV0dXJuIGFjbDsKQEAgLTI0OCw3MiArMjQzLDcyIEBACiBzdGF0aWMgaW50CiByZWlzZXJmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCiB7Ci0gICAgICAgIGNoYXIgKm5hbWU7CisJY2hhciAqbmFtZTsKIAl2b2lkICp2YWx1ZSA9IE5VTEw7CiAJc3RydWN0IHBvc2l4X2FjbCAqKnBfYWNsOwogCXNpemVfdCBzaXplOwogCWludCBlcnJvcjsKLSAgICAgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOwogCiAJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwotICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKLSAgICAgICAgICAgICAgICBpZiAoYWNsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZSAoYWNsLCAmbW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5vZGUtPmlfbW9kZSA9IG1vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2wgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotICAgICAgICAgICAgICAgIG5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVDsKLSAgICAgICAgICAgICAgICBwX2FjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OwotICAgICAgICAgICAgICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CisJCXBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2FjY2VzczsKKwkJaWYgKGFjbCkgeworCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWlmIChlcnJvciA8IDApCisJCQkJcmV0dXJuIGVycm9yOworCQkJZWxzZSB7CisJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQkJaWYgKGVycm9yID09IDApCisJCQkJCWFjbCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQ7CisJCXBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiBhY2wgPyAtRUFDQ0VTIDogMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0gCWlmIChhY2wpIHsKLSAgICAgICAgICAgIHZhbHVlID0gcG9zaXhfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoSVNfRVJSKHZhbHVlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKLSAgICAgICAgICAgIGVycm9yID0gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgMCk7CisJaWYgKGFjbCkgeworCQl2YWx1ZSA9IHBvc2l4X2FjbF90b19kaXNrKGFjbCwgJnNpemUpOworCQlpZiAoSVNfRVJSKHZhbHVlKSkKKwkJCXJldHVybiAoaW50KVBUUl9FUlIodmFsdWUpOworCQllcnJvciA9IHJlaXNlcmZzX3hhdHRyX3NldChpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIDApOwogCX0gZWxzZSB7Ci0gICAgICAgICAgICBlcnJvciA9IHJlaXNlcmZzX3hhdHRyX2RlbCAoaW5vZGUsIG5hbWUpOwotICAgICAgICAgICAgaWYgKGVycm9yID09IC1FTk9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgc2VlbSBvZGQgaGVyZSwgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIEFDTCB3YXMgc2V0Ci0gICAgICAgICAgICAgICAgICogd2l0aCBhIHZhbHVlIHJlcHJlc2VudGFibGUgd2l0aCBtb2RlIGJpdHMuIElmIHRoZXJlIHdhcwotICAgICAgICAgICAgICAgICAqIGFuIEFDTCBiZWZvcmUsIHJlaXNlcmZzX3hhdHRyX2RlbCBhbHJlYWR5IGRpcnRpZWQgdGhlIGlub2RlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1hcmtfaW5vZGVfZGlydHkgKGlub2RlKTsKLSAgICAgICAgICAgICAgICBlcnJvciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJZXJyb3IgPSByZWlzZXJmc194YXR0cl9kZWwoaW5vZGUsIG5hbWUpOworCQlpZiAoZXJyb3IgPT0gLUVOT0RBVEEpIHsKKwkJCS8qIFRoaXMgbWF5IHNlZW0gb2RkIGhlcmUsIGJ1dCBpdCBtZWFucyB0aGF0IHRoZSBBQ0wgd2FzIHNldAorCQkJICogd2l0aCBhIHZhbHVlIHJlcHJlc2VudGFibGUgd2l0aCBtb2RlIGJpdHMuIElmIHRoZXJlIHdhcworCQkJICogYW4gQUNMIGJlZm9yZSwgcmVpc2VyZnNfeGF0dHJfZGVsIGFscmVhZHkgZGlydGllZCB0aGUgaW5vZGUuCisJCQkgKi8KKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJZXJyb3IgPSAwOworCQl9CisJfQogCiAJaWYgKHZhbHVlKQogCQlrZnJlZSh2YWx1ZSk7CiAKLSAgICAgICAgaWYgKCFlcnJvcikgewotICAgICAgICAgICAgLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLwotICAgICAgICAgICAgaWYgKCFJU19FUlIgKCpwX2FjbCkgJiYgKnBfYWNsKQotICAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqcF9hY2wpOworCWlmICghZXJyb3IpIHsKKwkJLyogUmVsZWFzZSB0aGUgb2xkIG9uZSAqLworCQlpZiAoIUlTX0VSUigqcF9hY2wpICYmICpwX2FjbCkKKwkJCXBvc2l4X2FjbF9yZWxlYXNlKCpwX2FjbCk7CiAKLSAgICAgICAgICAgIGlmIChhY2wgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAqcF9hY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnBfYWNsID0gcG9zaXhfYWNsX2R1cCAoYWNsKTsKLSAgICAgICAgfQorCQlpZiAoYWNsID09IE5VTEwpCisJCQkqcF9hY2wgPSBFUlJfUFRSKC1FTk9EQVRBKTsKKwkJZWxzZQorCQkJKnBfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOworCX0KIAogCXJldHVybiBlcnJvcjsKIH0KQEAgLTMyMSwxOTIgKzMxNiwxOTAgQEAKIC8qIGRpci0+aV9zZW06IGRvd24sCiAgKiBpbm9kZSBpcyBuZXcgYW5kIG5vdCByZWxlYXNlZCBpbnRvIHRoZSB3aWxkIHlldCAqLwogaW50Ci1yZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQorcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKLSAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVyciA9IDA7CiAKLSAgICAvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCi0gICAgaWYgKFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQotICAgICAgICByZXR1cm4gMDsKKwkvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAwOwogCi0gICAgLyogQUNMcyBjYW4gb25seSBiZSB1c2VkIG9uICJuZXciIG9iamVjdHMsIHNvIGlmIGl0J3MgYW4gb2xkIG9iamVjdAotICAgICAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5oZXJpdCBmcm9tICovCi0gICAgaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChkaXIpID09IFNUQVRfREFUQV9WMSkKLSAgICAgICAgZ290byBhcHBseV91bWFzazsKKwkvKiBBQ0xzIGNhbiBvbmx5IGJlIHVzZWQgb24gIm5ldyIgb2JqZWN0cywgc28gaWYgaXQncyBhbiBvbGQgb2JqZWN0CisJICogdGhlcmUgaXMgbm90aGluZyB0byBpbmhlcml0IGZyb20gKi8KKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24oZGlyKSA9PSBTVEFUX0RBVEFfVjEpCisJCWdvdG8gYXBwbHlfdW1hc2s7CiAKLSAgICAvKiBEb24ndCBhcHBseSBBQ0xzIHRvIG9iamVjdHMgaW4gdGhlIC5yZWlzZXJmc19wcml2IHRyZWUuLiBUaGlzCi0gICAgICogd291bGQgYmUgdXNlbGVzcyBzaW5jZSBwZXJtaXNzaW9ucyBhcmUgaWdub3JlZCwgYW5kIGEgcGFpbiBiZWNhdXNlCi0gICAgICogaXQgaW50cm9kdWNlcyBsb2NraW5nIGN5Y2xlcyAqLwotICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgewotICAgICAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKLSAgICAgICAgZ290byBhcHBseV91bWFzazsKLSAgICB9CisJLyogRG9uJ3QgYXBwbHkgQUNMcyB0byBvYmplY3RzIGluIHRoZSAucmVpc2VyZnNfcHJpdiB0cmVlLi4gVGhpcworCSAqIHdvdWxkIGJlIHVzZWxlc3Mgc2luY2UgcGVybWlzc2lvbnMgYXJlIGlnbm9yZWQsIGFuZCBhIHBhaW4gYmVjYXVzZQorCSAqIGl0IGludHJvZHVjZXMgbG9ja2luZyBjeWNsZXMgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoZGlyKSkgeworCQlyZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUoaW5vZGUpOworCQlnb3RvIGFwcGx5X3VtYXNrOworCX0KIAotICAgIGFjbCA9IHJlaXNlcmZzX2dldF9hY2wgKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7Ci0gICAgaWYgKElTX0VSUiAoYWNsKSkgewotICAgICAgICBpZiAoUFRSX0VSUiAoYWNsKSA9PSAtRU5PREFUQSkKLSAgICAgICAgICAgIGdvdG8gYXBwbHlfdW1hc2s7Ci0gICAgICAgIHJldHVybiBQVFJfRVJSIChhY2wpOwotICAgIH0KKwlhY2wgPSByZWlzZXJmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CisJaWYgKElTX0VSUihhY2wpKSB7CisJCWlmIChQVFJfRVJSKGFjbCkgPT0gLUVOT0RBVEEpCisJCQlnb3RvIGFwcGx5X3VtYXNrOworCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCX0KIAotICAgIGlmIChhY2wpIHsKLSAgICAgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7Ci0gICAgICAgIG1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLSAgICAgICAgaW50IG5lZWRfYWNsOworCWlmIChhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsX2NvcHk7CisJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJaW50IG5lZWRfYWNsOwogCi0gICAgICAgIC8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KLSAgICAgICAgaWYgKFNfSVNESVIgKGlub2RlLT5pX21vZGUpKSB7Ci0gICAgICAgICAgICBlcnIgPSByZWlzZXJmc19zZXRfYWNsIChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKLSAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisJCS8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWVyciA9IHJlaXNlcmZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJfQogCi0gICAgICAgIC8qIE5vdyB3ZSByZWNvbmNpbGUgdGhlIG5ldyBBQ0wgYW5kIHRoZSBtb2RlLAotICAgICAgICAgICBwb3RlbnRpYWxseSBtb2RpZnlpbmcgYm90aCAqLwotICAgICAgICBhY2xfY29weSA9IHBvc2l4X2FjbF9jbG9uZSAoYWNsLCBHRlBfTk9GUyk7Ci0gICAgICAgIGlmICghYWNsX2NvcHkpIHsKLSAgICAgICAgICAgIGVyciA9IC1FTk9NRU07Ci0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIH0KKwkJLyogTm93IHdlIHJlY29uY2lsZSB0aGUgbmV3IEFDTCBhbmQgdGhlIG1vZGUsCisJCSAgIHBvdGVudGlhbGx5IG1vZGlmeWluZyBib3RoICovCisJCWFjbF9jb3B5ID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX05PRlMpOworCQlpZiAoIWFjbF9jb3B5KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwOworCQl9CiAKKwkJbmVlZF9hY2wgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoYWNsX2NvcHksICZtb2RlKTsKKwkJaWYgKG5lZWRfYWNsID49IDApIHsKKwkJCWlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKKwkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCX0KIAotICAgICAgICBuZWVkX2FjbCA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcSAoYWNsX2NvcHksICZtb2RlKTsKLSAgICAgICAgaWYgKG5lZWRfYWNsID49IDApIHsKLSAgICAgICAgICAgIGlmIChtb2RlICE9IGlub2RlLT5pX21vZGUpIHsKLSAgICAgICAgICAgICAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKLSAgICAgICAgICAgIH0KKwkJCS8qIElmIHdlIG5lZWQgYW4gQUNMLi4gKi8KKwkJCWlmIChuZWVkX2FjbCA+IDApIHsKKwkJCQllcnIgPQorCQkJCSAgICByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJCQkgICAgIGFjbF9jb3B5KTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIGNsZWFudXBfY29weTsKKwkJCX0KKwkJfQorCSAgICAgIGNsZWFudXBfY29weToKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsX2NvcHkpOworCSAgICAgIGNsZWFudXA6CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfSBlbHNlIHsKKwkgICAgICBhcHBseV91bWFzazoKKwkJLyogbm8gQUNMLCBhcHBseSB1bWFzayAqLworCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQogCi0gICAgICAgICAgICAvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCi0gICAgICAgICAgICBpZiAobmVlZF9hY2wgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gcmVpc2VyZnNfc2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsX2NvcHkpOwotICAgICAgICAgICAgICAgIGlmIChlcnIpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9jb3B5OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci1jbGVhbnVwX2NvcHk6Ci0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2xfY29weSk7Ci1jbGVhbnVwOgotICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKLSAgICB9IGVsc2UgewotYXBwbHlfdW1hc2s6Ci0gICAgICAgIC8qIG5vIEFDTCwgYXBwbHkgdW1hc2sgKi8KLSAgICAgICAgaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogLyogTG9va3MgdXAgYW5kIGNhY2hlcyB0aGUgcmVzdWx0IG9mIHRoZSBkZWZhdWx0IEFDTC4KICAqIFdlIGRvIHRoaXMgc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNhcnJ5IHRoZSB4YXR0cl9zZW0gaW50bwogICogcmVpc2VyZnNfbmV3X2lub2RlIGlmIHdlIGRvbid0IG5lZWQgdG8gKi8KLWludAotcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitpbnQgcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2woc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKGlub2RlLT5pX3NiKSAmJgotICAgICAgICAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGlub2RlKSkgewotICAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0gICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pIChpbm9kZSk7Ci0gICAgICAgIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQpOwotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaSAoaW5vZGUpOwotICAgICAgICByZXQgPSBhY2wgPyAxIDogMDsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50Ci1yZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0gICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOwotICAgICAgICBpbnQgZXJyb3I7Ci0KLSAgICAgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKGdldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8Ci0JICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpCi0gICAgICAgIHsKLQkgICAgcmV0dXJuIDA7CisJaW50IHJldCA9IDA7CisJaWYgKHJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSAmJiAhaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSB7CisJCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwkJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koaW5vZGUpOworCQlyZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCk7CisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koaW5vZGUpOworCQlyZXQgPSBhY2wgPyAxIDogMDsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAl9CiAKLSAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICBhY2wgPSByZWlzZXJmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOwotICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKLSAgICAgICAgaWYgKCFhY2wpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChJU19FUlIoYWNsKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihhY2wpOwotICAgICAgICBjbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9OT0ZTKTsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKLSAgICAgICAgaWYgKCFjbG9uZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7Ci0gICAgICAgIGlmICghZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBpbnQgbG9jayA9ICFoYXNfeGF0dHJfZGlyIChpbm9kZSk7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChpbm9kZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2spCi0gICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKLSAgICAgICAgICAgICAgICBpZiAobG9jaykKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7Ci0gICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKLSAgICAgICAgfQotICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7Ci0gICAgICAgIHJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmVpc2VyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJaW50IGVycm9yOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbihpbm9kZSkgPT0gU1RBVF9EQVRBX1YxIHx8CisJICAgICFyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwlyZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMoaW5vZGUtPmlfc2IpOworCWlmICghYWNsKQorCQlyZXR1cm4gMDsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfTk9GUyk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlpZiAoIWNsb25lKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcnJvciA9IHBvc2l4X2FjbF9jaG1vZF9tYXNxKGNsb25lLCBpbm9kZS0+aV9tb2RlKTsKKwlpZiAoIWVycm9yKSB7CisJCWludCBsb2NrID0gIWhhc194YXR0cl9kaXIoaW5vZGUpOworCQlyZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2koaW5vZGUpOworCQlpZiAobG9jaykKKwkJCXJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKGlub2RlLT5pX3NiKTsKKwkJZWxzZQorCQkJcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVycm9yID0gcmVpc2VyZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCWlmIChsb2NrKQorCQkJcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCWVsc2UKKwkJCXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyhpbm9kZS0+aV9zYik7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKGlub2RlKTsKKwl9CisJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIGludAogcG9zaXhfYWNsX2FjY2Vzc19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKKwkJICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpLTEpCisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUykgLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4geGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50CiBwb3NpeF9hY2xfYWNjZXNzX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKKwkJICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKS0xKQorCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpIC0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHhhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1wb3NpeF9hY2xfYWNjZXNzX2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgcG9zaXhfYWNsX2FjY2Vzc19kZWwoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOwotICAgIHN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOwotICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpLTEpCi0JcmV0dXJuIC1FSU5WQUw7Ci0gICAgaWYgKCFJU19FUlIgKCphY2wpICYmICphY2wpIHsKLSAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKCphY2wpOwotICAgICAgICAqYWNsID0gRVJSX1BUUiAoLUVOT0RBVEEpOwotICAgIH0KKwlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOworCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFJU19FUlIoKmFjbCkgJiYgKmFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkJKmFjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wb3NpeF9hY2xfYWNjZXNzX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCitwb3NpeF9hY2xfYWNjZXNzX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCSAgICAgIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgbGVuID0gbmFtZWxlbjsKLSAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCWludCBsZW4gPSBuYW1lbGVuOworCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQltZW1jcHkob3V0LCBuYW1lLCBsZW4pOwogCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CkBAIC01MTgsNDggKzUxMSw0OCBAQAogfTsKIAogc3RhdGljIGludAotcG9zaXhfYWNsX2RlZmF1bHRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3Bvc2l4X2FjbF9kZWZhdWx0X2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKS0xKQorCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSAtIDEpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiB4YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50CiBwb3NpeF9hY2xfZGVmYXVsdF9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorCQkgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCktMSkKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihQT1NJWF9BQ0xfWEFUVFJfREVGQVVMVCkgLSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4geGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1wb3NpeF9hY2xfZGVmYXVsdF9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IHBvc2l4X2FjbF9kZWZhdWx0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICpyZWlzZXJmc19pID0gUkVJU0VSRlNfSShpbm9kZSk7Ci0gICAgc3RydWN0IHBvc2l4X2FjbCAqKmFjbCA9ICZyZWlzZXJmc19pLT5pX2FjbF9kZWZhdWx0OwotICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKS0xKQotCXJldHVybiAtRUlOVkFMOwotICAgIGlmICghSVNfRVJSICgqYWNsKSAmJiAqYWNsKSB7Ci0gICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqYWNsKTsKLSAgICAgICAgKmFjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKLSAgICB9CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisJaWYgKHN0cmxlbihuYW1lKSAhPSBzaXplb2YoUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQpIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFJU19FUlIoKmFjbCkgJiYgKmFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqYWNsKTsKKwkJKmFjbCA9IEVSUl9QVFIoLUVOT0RBVEEpOworCX0KIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wb3NpeF9hY2xfZGVmYXVsdF9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQorcG9zaXhfYWNsX2RlZmF1bHRfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJICAgICAgIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgbGVuID0gbmFtZWxlbjsKLSAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCWludCBsZW4gPSBuYW1lbGVuOworCWlmICghcmVpc2VyZnNfcG9zaXhhY2woaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQltZW1jcHkob3V0LCBuYW1lLCBsZW4pOwogCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfZGVmYXVsdF9oYW5kbGVyID0gewpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3NlY3VyaXR5LmMKaW5kZXggZTA0NGQ1MS4uNWU5MGE5NSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYworKysgYi9mcy9yZWlzZXJmcy94YXR0cl9zZWN1cml0eS5jCkBAIC05LDU3ICs5LDU1IEBACiAjZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCAic2VjdXJpdHkuIgogCiBzdGF0aWMgaW50Ci1zZWN1cml0eV9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCitzZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CiAKLSAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50Ci1zZWN1cml0eV9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7Ci0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX3NldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworCXJldHVybiByZWlzZXJmc194YXR0cl9zZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNlY3VyaXR5X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXNlY3VyaXR5X2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3NlY3VyaXR5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWludCBsZW4gPSBuYW1lbGVuOwogCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiAwOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50Ci1zZWN1cml0eV9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQotewotICAgIGludCBsZW4gPSBuYW1lbGVuOwotCi0gICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAob3V0KQotICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgc2VjdXJpdHlfaGFuZGxlciA9IHsKIAkucHJlZml4ID0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAogCS5nZXQgPSBzZWN1cml0eV9nZXQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMgYi9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMKaW5kZXggNDM3NjIxOS4uMjUwMWY3ZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfdHJ1c3RlZC5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3RydXN0ZWQuYwpAQCAtOSw2OSArOSw2NyBAQAogI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQordHJ1c3RlZF9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9nZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworCXJldHVybiByZWlzZXJmc194YXR0cl9nZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfc2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCi0gICAgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3RydXN0ZWRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKwkgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLSAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9zZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0cnVzdGVkX2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLXRydXN0ZWRfZGVsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQordHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCiB7Ci0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWludCBsZW4gPSBuYW1lbGVuOwogCi0gICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIDA7CiAKLSAgICBpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkpCi0gICAgICAgIHJldHVybiAtRVBFUk07CisJaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorCQlyZXR1cm4gMDsKIAotICAgIHJldHVybiAwOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CisKKwlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50Ci10cnVzdGVkX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCi17Ci0gICAgaW50IGxlbiA9IG5hbWVsZW47Ci0KLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAob3V0KQotICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLQogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdHJ1c3RlZF9oYW5kbGVyID0gewogCS5wcmVmaXggPSBYQVRUUl9UUlVTVEVEX1BSRUZJWCwKIAkuZ2V0ID0gdHJ1c3RlZF9nZXQsCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMgYi9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMKaW5kZXggMDc3MjgwNi4uNTE0NTgwNCAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfdXNlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3VzZXIuYwpAQCAtMTMsODEgKzEzLDgwIEBACiAjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKIAogc3RhdGljIGludAotdXNlcl9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit1c2VyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewogCi0gICAgaW50IGVycm9yOworCWludCBlcnJvcjsKIAotICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0gICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJldHVybiBlcnJvcjsKKwllcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLSAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOwogfQogCiBzdGF0aWMgaW50Ci11c2VyX3NldCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAotICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit1c2VyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisJIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAKLSAgICBpbnQgZXJyb3I7CisJaW50IGVycm9yOwogCi0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgIGlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIgKGlub2RlLT5pX3NiKSkKLSAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIoaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLSAgICBpZiAoIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpICYmCi0gICAgICAgICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQotICAgICAgICByZXR1cm4gLUVQRVJNOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorCQlyZXR1cm4gLUVQRVJNOwogCi0gICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgICByZXR1cm4gZXJyb3I7CisJZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotICAgIHJldHVybiByZWlzZXJmc194YXR0cl9zZXQgKGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKKwlyZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBidWZmZXIsIHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB1c2VyX2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBlcnJvcjsKKworCWlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIoaW5vZGUtPmlfc2IpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWVycm9yID0gcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAotdXNlcl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit1c2VyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKIHsKLSAgICBpbnQgZXJyb3I7CisJaW50IGxlbiA9IG5hbWVsZW47CisJaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlcihpbm9kZS0+aV9zYikpCisJCXJldHVybiAwOwogCi0gICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCi0gICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChvdXQpCisJCW1lbWNweShvdXQsIG5hbWUsIGxlbik7CiAKLSAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCi0gICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLQotICAgIGlmICghU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkgJiYKLSAgICAgICAgKCFTX0lTRElSIChpbm9kZS0+aV9tb2RlKSB8fCBpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICBlcnJvciA9IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKLSAgICBpZiAoZXJyb3IpCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci11c2VyX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCi17Ci0gICAgaW50IGxlbiA9IG5hbWVsZW47Ci0gICAgaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlciAoaW5vZGUtPmlfc2IpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChvdXQpCi0gICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOwotCi0gICAgcmV0dXJuIGxlbjsKKwlyZXR1cm4gbGVuOwogfQogCiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciB1c2VyX2hhbmRsZXIgPSB7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAyNWJjMWVjLi42ZTU3ZWUyIDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCisrKyBiL2ZzL3N1cGVyLmMKQEAgLTg0MCw3ICs4NDAsNiBAQAogCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOwogCW1udC0+bW50X21vdW50cG9pbnQgPSBzYi0+c19yb290OwogCW1udC0+bW50X3BhcmVudCA9IG1udDsKLQltbnQtPm1udF9uYW1lc3BhY2UgPSBjdXJyZW50LT5uYW1lc3BhY2U7CiAJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CiAJZnJlZV9zZWNkYXRhKHNlY2RhdGEpOwogCXB1dF9maWxlc3lzdGVtKHR5cGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZmlsZS5jIGIvZnMvc3lzZnMvZmlsZS5jCmluZGV4IGU5Y2ZhMzkuLjMzNTI4OGI5IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0zLDcgKzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMTQsNyArMTQsNyBAQAogI2RlZmluZSB0b19zdWJzeXMoaykgY29udGFpbmVyX29mKGssc3RydWN0IHN1YnN5c3RlbSxrc2V0LmtvYmopCiAjZGVmaW5lIHRvX3NhdHRyKGEpIGNvbnRhaW5lcl9vZihhLHN0cnVjdCBzdWJzeXNfYXR0cmlidXRlLGF0dHIpCiAKLS8qKgorLyoKICAqIFN1YnN5c3RlbSBmaWxlIG9wZXJhdGlvbnMuCiAgKiBUaGVzZSBvcGVyYXRpb25zIGFsbG93IHN1YnN5c3RlbXMgdG8gaGF2ZSBmaWxlcyB0aGF0IGNhbiBiZSAKICAqIHJlYWQvd3JpdHRlbi4gCkBAIC0xOTIsOCArMTkyLDkgQEAKIAogLyoqCiAgKglmbHVzaF93cml0ZV9idWZmZXIgLSBwdXNoIGJ1ZmZlciB0byBrb2JqZWN0LgotICoJQGZpbGU6CQlmaWxlIHBvaW50ZXIuCisgKglAZGVudHJ5OglkZW50cnkgdG8gdGhlIGF0dHJpYnV0ZQogICoJQGJ1ZmZlcjoJZGF0YSBidWZmZXIgZm9yIGZpbGUuCisgKglAY291bnQ6CQludW1iZXIgb2YgYnl0ZXMKICAqCiAgKglHZXQgdGhlIGNvcnJlY3QgcG9pbnRlcnMgZm9yIHRoZSBrb2JqZWN0IGFuZCB0aGUgYXR0cmlidXRlIHdlJ3JlCiAgKglkZWFsaW5nIHdpdGgsIHRoZW4gY2FsbCB0aGUgc3RvcmUoKSBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUsIApAQCAtMzkwLDkgKzM5MSw2IEBACiAgKiBzeXNmc191cGRhdGVfZmlsZSAtIHVwZGF0ZSB0aGUgbW9kaWZpZWQgdGltZXN0YW1wIG9uIGFuIG9iamVjdCBhdHRyaWJ1dGUuCiAgKiBAa29iajogb2JqZWN0IHdlJ3JlIGFjdGluZyBmb3IuCiAgKiBAYXR0cjogYXR0cmlidXRlIGRlc2NyaXB0b3IuCi0gKgotICogQWxzbyBjYWxsIGRub3RpZnkgZm9yIHRoZSBkZW50cnksIHdoaWNoIGxvdHMgb2YgdXNlcnNwYWNlIHByb2dyYW1zCi0gKiB1c2UuCiAgKi8KIGludCBzeXNmc191cGRhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyKQogewpAQCAtNDA3LDcgKzQwNSw3IEBACiAJCWlmICh2aWN0aW0tPmRfaW5vZGUgJiYgCiAJCSAgICAodmljdGltLT5kX3BhcmVudC0+ZF9pbm9kZSA9PSBkaXItPmRfaW5vZGUpKSB7CiAJCQl2aWN0aW0tPmRfaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JCQlkbm90aWZ5X3BhcmVudCh2aWN0aW0sIEROX01PRElGWSk7CisJCQlmc25vdGlmeV9tb2RpZnkodmljdGltKTsKIAogCQkJLyoqCiAJCQkgKiBEcm9wIHJlZmVyZW5jZSBmcm9tIGluaXRpYWwgc3lzZnNfZ2V0X2RlbnRyeSgpLgpkaWZmIC0tZ2l0IGEvZnMvdWRmL25hbWVpLmMgYi9mcy91ZGYvbmFtZWkuYwppbmRleCAzZjZkYzcxLi5hYzE5MWVkIDEwMDY0NAotLS0gYS9mcy91ZGYvbmFtZWkuYworKysgYi9mcy91ZGYvbmFtZWkuYwpAQCAtMTU5LDE0ICsxNTksMTIgQEAKIAljaGFyICpuYW1lcHRyOwogCXVpbnQ4X3QgbGZpOwogCXVpbnQxNl90IGxpdTsKLQlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCWxvZmZfdCBzaXplOwogCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CiAJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuLCBvZmZzZXQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAKLQlpZiAoIWRpcikKLQkJcmV0dXJuIE5VTEw7Ci0KKwlzaXplID0gKHVkZl9leHQwX29mZnNldChkaXIpICsgZGlyLT5pX3NpemUpID4+IDI7CiAJZl9wb3MgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CiAKIAlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IChmX3BvcyAmICgoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOwpkaWZmIC0tZ2l0IGEvZnMveGF0dHIuYyBiL2ZzL3hhdHRyLmMKaW5kZXggOTNkZWU3MC4uNmFjZDVjNiAxMDA2NDQKLS0tIGEvZnMveGF0dHIuYworKysgYi9mcy94YXR0ci5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAogLyoKQEAgLTU3LDggKzU4LDEwIEBACiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OwogCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKLQkJaWYgKCFlcnJvcikKKwkJaWYgKCFlcnJvcikgeworCQkJZnNub3RpZnlfeGF0dHIoZCk7CiAJCQlzZWN1cml0eV9pbm9kZV9wb3N0X3NldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKKwkJfQogb3V0OgogCQl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOwogCX0KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwppbmRleCA5M2NlMjU3Li5hM2E0YjVhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hb3BzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCkBAIC0xNDksMTEgKzE0OSwxMiBAQAogICovCiBTVEFUSUMgdm9pZAogbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0X2RpcmVjdCgKLQlzdHJ1Y3QgaW5vZGUJKmlub2RlLAorCXN0cnVjdCBraW9jYgkqaW9jYiwKIAlsb2ZmX3QJCW9mZnNldCwKIAlzc2l6ZV90CQlzaXplLAogCXZvaWQJCSpwcml2YXRlKQogeworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlBU1NFUlQoIXByaXZhdGUgfHwgaW5vZGUgPT0gKHN0cnVjdCBpbm9kZSAqKXByaXZhdGUpOwogCiAJLyogcHJpdmF0ZSBpbmRpY2F0ZXMgYW4gdW53cml0dGVuIGV4dGVudCBsYXkgYmVuZWF0aCB0aGlzIElPICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCmluZGV4IGM2MGU2OTQuLmRmMGNiYTIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCkBAIC0xNzcxLDkgKzE3NzEsOSBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CiAJZG8gewotCQlpZiAodW5saWtlbHkoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpKSB7CisJCWlmICh1bmxpa2VseShmcmVlemluZyhjdXJyZW50KSkpIHsKIAkJCXhmc2J1ZmRfZm9yY2Vfc2xlZXAgPSAxOwotCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCQlyZWZyaWdlcmF0b3IoKTsKIAkJfSBlbHNlIHsKIAkJCXhmc2J1ZmRfZm9yY2Vfc2xlZXAgPSAwOwogCQl9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCA1ZmU5YWYzLi5mNmRkN2RlIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQl0aW1lbGVmdCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZWxlZnQpOwogCQkvKiBzd3N1c3AgKi8KLQkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCQl0cnlfdG9fZnJlZXplKCk7CiAJCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19VTU9VTlQpCiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjY29uZmlnLmggYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAppbmRleCAyYjQxZTQ3Li4yZjZhYjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNjb25maWcuaApAQCAtNjQsNyArNjQsNyBAQAogCiAvKiBWZXJzaW9uIHN0cmluZyAqLwogCi0jZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDA1MDMwOQorI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNTA0MDgKIAogLyoKICAqIE9TIG5hbWUsIHVzZWQgZm9yIHRoZSBfT1Mgb2JqZWN0LiAgVGhlIF9PUyBvYmplY3QgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUsCkBAIC0xMzAsOSArMTMwLDggQEAKICNkZWZpbmUgQUNQSV9NQVhfR1BFX0JMT0NLUyAgICAgICAgICAgICAyCiAjZGVmaW5lIEFDUElfR1BFX1JFR0lTVEVSX1dJRFRIICAgICAgICAgOAogCi0vKgotICogTWV0aG9kIGluZm8gKGluIFdBTEtfU1RBVEUpLCBjb250YWluaW5nIGxvY2FsIHZhcmlhYmxlcyBhbmQgYXJndW1ldG5zCi0gKi8KKy8qIE1ldGhvZCBpbmZvIChpbiBXQUxLX1NUQVRFKSwgY29udGFpbmluZyBsb2NhbCB2YXJpYWJsZXMgYW5kIGFyZ3VtZXRucyAqLworCiAjZGVmaW5lIEFDUElfTUVUSE9EX05VTV9MT0NBTFMgICAgICAgICAgOAogI2RlZmluZSBBQ1BJX01FVEhPRF9NQVhfTE9DQUwgICAgICAgICAgIDcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZGVidWcuaCBiL2luY2x1ZGUvYWNwaS9hY2RlYnVnLmgKaW5kZXggMjIzYjJhNS4uOGJhMzcyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZGVidWcuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNkZWJ1Zy5oCkBAIC02MSw5ICs2MSw3IEBACiAKIAogI2RlZmluZSBQQVJBTV9MSVNUKHBsKSAgICAgICAgICAgICAgICAgIHBsCi0KICNkZWZpbmUgREJURVNUX09VVFBVVF9MRVZFTChsdmwpICAgICAgICBpZiAoYWNwaV9nYmxfZGJfb3B0X3ZlcmJvc2UpCi0KICNkZWZpbmUgVkVSQk9TRV9QUklOVChmcCkgICAgICAgICAgICAgICBEQlRFU1RfT1VUUFVUX0xFVkVMKGx2bCkge1wKIAkJCSAgYWNwaV9vc19wcmludGYgUEFSQU1fTElTVChmcCk7fQogCkBAIC03MSwxMyArNjksOSBAQAogI2RlZmluZSBFWF9TSU5HTEVfU1RFUCAgICAgICAgICAgICAgICAgIDIKIAogCi0vKiBQcm90b3R5cGVzICovCi0KLQogLyoKICAqIGRieGZhY2UgLSBleHRlcm5hbCBkZWJ1Z2dlciBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZGJfaW5pdGlhbGl6ZSAoCiAJdm9pZCk7CkBAIC05MiwyMCArODYsMTAgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3R5cGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kYl9zdGFydF9jb21tYW5kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotdm9pZAotYWNwaV9kYl9tZXRob2RfZW5kICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQogCiAvKgogICogZGJjbWRzIC0gZGVidWcgY29tbWFuZHMgYW5kIG91dHB1dCByb3V0aW5lcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2RiX2Rpc2Fzc2VtYmxlX21ldGhvZCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7CkBAIC0xNzcsNTcgKzE2MSwzMCBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdF9hcmcpOwogCiB2b2lkCi1hY3BpX2RiX2Rpc3BsYXlfbG9ja3MgKHZvaWQpOwotCithY3BpX2RiX2Rpc3BsYXlfbG9ja3MgKAorCXZvaWQpOwogCiB2b2lkCiBhY3BpX2RiX2Rpc3BsYXlfcmVzb3VyY2VzICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmplY3RfYXJnKTsKIAogdm9pZAotYWNwaV9kYl9kaXNwbGF5X2dwZXMgKHZvaWQpOworYWNwaV9kYl9kaXNwbGF5X2dwZXMgKAorCXZvaWQpOwogCiB2b2lkCiBhY3BpX2RiX2NoZWNrX2ludGVncml0eSAoCiAJdm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2ludGVncml0eV93YWxrICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RiX3dhbGtfYW5kX21hdGNoX25hbWUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZGJfd2Fsa19mb3JfcmVmZXJlbmNlcyAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9kYl93YWxrX2Zvcl9zcGVjaWZpY19vYmplY3RzICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nX2xldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KIHZvaWQKIGFjcGlfZGJfZ2VuZXJhdGVfZ3BlICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpncGVfYXJnLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJsb2NrX2FyZyk7CiAKKwogLyoKICAqIGRiZGlzcGx5IC0gZGVidWcgZGlzcGxheSBjb21tYW5kcwogICovCi0KIHZvaWQKIGFjcGlfZGJfZGlzcGxheV9tZXRob2RfaW5mbyAoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwpAQCAtMjcxLDE5ICsyMjgsMTAgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotdm9pZAotYWNwaV9kYl9kdW1wX3BhcnNlcl9kZXNjcmlwdG9yICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KLXZvaWQgKgotYWNwaV9kYl9nZXRfcG9pbnRlciAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGFyZ2V0KTsKLQogCiAvKgogICogZGJleGVjIC0gZGVidWdnZXIgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uCiAgKi8KLQogdm9pZAogYWNwaV9kYl9leGVjdXRlICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lLApAQCAtMjk2LDQ0ICsyNDQsMTUgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpudW1fbG9vcHNfYXJnLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1ldGhvZF9uYW1lX2FyZyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2RiX2V4ZWN1dGVfbWV0aG9kICgKLQlzdHJ1Y3QgYWNwaV9kYl9tZXRob2RfaW5mbyAgICAgICppbmZvLAotCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldHVybl9vYmopOwotCi12b2lkCi1hY3BpX2RiX2V4ZWN1dGVfc2V0dXAgKAotCXN0cnVjdCBhY3BpX2RiX21ldGhvZF9pbmZvICAgICAgKmluZm8pOwotCi11MzIKLWFjcGlfZGJfZ2V0X291dHN0YW5kaW5nX2FsbG9jYXRpb25zICgKLQl2b2lkKTsKLQotdm9pZCBBQ1BJX1NZU1RFTV9YRkFDRQotYWNwaV9kYl9tZXRob2RfdGhyZWFkICgKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZGJfZXhlY3V0aW9uX3dhbGsgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RpbmdfbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQogCiAvKgogICogZGJmaWxlaW8gLSBEZWJ1Z2dlciBmaWxlIEkvTyBjb21tYW5kcwogICovCi0KIGFjcGlfb2JqZWN0X3R5cGUKIGFjcGlfZGJfbWF0Y2hfYXJndW1lbnQgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnVzZXJfYXJndW1lbnQsCiAJc3RydWN0IGFyZ3VtZW50X2luZm8gICAgICAgICAgICAqYXJndW1lbnRzKTsKIAotYWNwaV9zdGF0dXMKLWFlX2xvY2FsX2xvYWRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlX3B0cik7Ci0KIHZvaWQKIGFjcGlfZGJfY2xvc2VfZGVidWdfZmlsZSAoCiAJdm9pZCk7CkBAIC0zNTYsMTYgKzI3NSwxNyBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpbGVuYW1lLAogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKip0YWJsZSk7CiAKKwogLyoKICAqIGRiaGlzdHJ5IC0gZGVidWdnZXIgSElTVE9SWSBjb21tYW5kCiAgKi8KLQogdm9pZAogYWNwaV9kYl9hZGRfdG9faGlzdG9yeSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29tbWFuZF9saW5lKTsKIAogdm9pZAotYWNwaV9kYl9kaXNwbGF5X2hpc3RvcnkgKHZvaWQpOworYWNwaV9kYl9kaXNwbGF5X2hpc3RvcnkgKAorCXZvaWQpOwogCiBjaGFyICoKIGFjcGlfZGJfZ2V0X2Zyb21faGlzdG9yeSAoCkBAIC0zNzUsNyArMjk1LDYgQEAKIC8qCiAgKiBkYmlucHV0IC0gdXNlciBmcm9udC1lbmQgdG8gdGhlIEFNTCBkZWJ1Z2dlcgogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2RiX2NvbW1hbmRfZGlzcGF0Y2ggKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlucHV0X2J1ZmZlciwKQEAgLTM4Niw3MSArMzA1LDI4IEBACiBhY3BpX2RiX2V4ZWN1dGVfdGhyZWFkICgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKIAotdm9pZAotYWNwaV9kYl9kaXNwbGF5X2hlbHAgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhlbHBfdHlwZSk7Ci0KLWNoYXIgKgotYWNwaV9kYl9nZXRfbmV4dF90b2tlbiAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyaW5nLAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipuZXh0KTsKLQotdTMyCi1hY3BpX2RiX2dldF9saW5lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbnB1dF9idWZmZXIpOwotCi11MzIKLWFjcGlfZGJfbWF0Y2hfY29tbWFuZCAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXNlcl9jb21tYW5kKTsKLQotdm9pZAotYWNwaV9kYl9zaW5nbGVfdGhyZWFkICgKLQl2b2lkKTsKLQogCiAvKgogICogZGJzdGF0cyAtIEdlbmVyYXRpb24gYW5kIGRpc3BsYXkgb2YgQUNQSSB0YWJsZSBzdGF0aXN0aWNzCiAgKi8KLQogdm9pZAogYWNwaV9kYl9nZW5lcmF0ZV9zdGF0aXN0aWNzICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyb290LAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWV0aG9kKTsKIAotCiBhY3BpX3N0YXR1cwogYWNwaV9kYl9kaXNwbGF5X3N0YXRpc3RpY3MgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnR5cGVfYXJnKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZGJfY2xhc3NpZnlfb25lX29iamVjdCAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi12b2lkCi1hY3BpX2RiX2NvdW50X25hbWVzcGFjZV9vYmplY3RzICgKLQl2b2lkKTsKLQotdm9pZAotYWNwaV9kYl9lbnVtZXJhdGVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7Ci0KIAogLyoKICAqIGRidXRpbHMgLSBBTUwgZGVidWdnZXIgdXRpbGl0aWVzCiAgKi8KLQogdm9pZAogYWNwaV9kYl9zZXRfb3V0cHV0X2Rlc3RpbmF0aW9uICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKIAogdm9pZAotYWNwaV9kYl9kdW1wX2J1ZmZlciAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLQotdm9pZAogYWNwaV9kYl9kdW1wX29iamVjdCAoCiAJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqb2JqX2Rlc2MsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CkBAIC00NTksMTQgKzMzNSw4IEBACiBhY3BpX2RiX3ByZXBfbmFtZXN0cmluZyAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7CiAKLQotYWNwaV9zdGF0dXMKLWFjcGlfZGJfc2Vjb25kX3Bhc3NfcGFyc2UgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnJvb3QpOwotCiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqCiBhY3BpX2RiX2xvY2FsX25zX2xvb2t1cCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7CiAKLQogI2VuZGlmICAvKiBfX0FDREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaCBiL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCmluZGV4IDI2ZDkwN2UuLmRiZmE4NzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCkBAIC0xMDIsNTggKzEwMiwxNiBAQAogLyoKICAqIGRtd2FsawogICovCi0KLXZvaWQKLWFjcGlfZG1fd2Fsa19wYXJzZV90cmVlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlhc2xfd2Fsa19jYWxsYmFjayAgICAgICAgICAgICAgIGRlc2NlbmRpbmdfY2FsbGJhY2ssCi0JYXNsX3dhbGtfY2FsbGJhY2sgICAgICAgICAgICAgICBhc2NlbmRpbmdfY2FsbGJhY2ssCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RtX2Rlc2NlbmRpbmdfb3AgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2RtX2FzY2VuZGluZ19vcCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQotCi0vKgotICogZG1vcGNvZGUKLSAqLwotCi12b2lkCi1hY3BpX2RtX3ZhbGlkYXRlX25hbWUgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUsCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCi11MzIKLWFjcGlfZG1fZHVtcF9uYW1lICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKLQotdm9pZAotYWNwaV9kbV91bmljb2RlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KIHZvaWQKIGFjcGlfZG1fZGlzYXNzZW1ibGUgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3JpZ2luLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29wY29kZXMpOwogCi12b2lkCi1hY3BpX2RtX25hbWVzdHJpbmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUpOwogCi12b2lkCi1hY3BpX2RtX2Rpc3BsYXlfcGF0aCAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCisvKgorICogZG1vcGNvZGUKKyAqLwogdm9pZAogYWNwaV9kbV9kaXNhc3NlbWJsZV9vbmVfb3AgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCkBAIC0xNjUsMTggKzEyMyw5IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwogCiB1MzIKLWFjcGlfZG1fYmxvY2tfdHlwZSAoCi0JdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotCi11MzIKIGFjcGlfZG1fbGlzdF90eXBlICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3BzX2Rpc3BsYXlfb2JqZWN0X3BhdGhuYW1lICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQogdm9pZAogYWNwaV9kbV9tZXRob2RfZmxhZ3MgKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKQEAgLTE5NywxMCArMTQ2LDYgQEAKIGFjcGlfZG1fbWF0Y2hfb3AgKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAotdm9pZAotYWNwaV9kbV9tYXRjaF9rZXl3b3JkICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7Ci0KIHU4CiBhY3BpX2RtX2NvbW1hX2lmX2xpc3RfbWVtYmVyICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CkBAIC0yMTEsMTMgKzE1NiwyNSBAQAogCiAKIC8qCi0gKiBkbW9iamVjdAorICogZG1uYW1lcwogICovCit1MzIKK2FjcGlfZG1fZHVtcF9uYW1lICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfcHNfZGlzcGxheV9vYmplY3RfcGF0aG5hbWUgKAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwogCiB2b2lkCi1hY3BpX2RtX2RlY29kZV9ub2RlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKK2FjcGlfZG1fbmFtZXN0cmluZyAoCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZSk7CiAKKworLyoKKyAqIGRtb2JqZWN0CisgKi8KIHZvaWQKIGFjcGlfZG1fZGlzcGxheV9pbnRlcm5hbF9vYmplY3QgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMjQxLDYgKzE5OCwxNiBAQAogLyoKICAqIGRtYnVmZmVyCiAgKi8KK3ZvaWQKK2FjcGlfZG1fZGlzYXNtX2J5dGVfbGlzdCAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpieXRlX2RhdGEsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX2NvdW50KTsKKwordm9pZAorYWNwaV9kbV9ieXRlX2xpc3QgKAorCXN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAgICAgICAgKmluZm8sCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwogCiB2b2lkCiBhY3BpX2lzX2Vpc2FfaWQgKApAQCAtMjYyLDE4ICsyMjksNiBAQAogLyoKICAqIGRtcmVzcmMKICAqLwotCi12b2lkCi1hY3BpX2RtX2Rpc2FzbV9ieXRlX2xpc3QgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnl0ZV9kYXRhLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9jb3VudCk7Ci0KLXZvaWQKLWFjcGlfZG1fYnl0ZV9saXN0ICgKLQlzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gICAgICAgICppbmZvLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQogdm9pZAogYWNwaV9kbV9yZXNvdXJjZV9kZXNjcmlwdG9yICgKIAlzdHJ1Y3QgYWNwaV9vcF93YWxrX2luZm8gICAgICAgICppbmZvLApAQCAtMjk2LDE5ICsyNTEsMTAgQEAKIGFjcGlfZG1fZGVjb2RlX2F0dHJpYnV0ZSAoCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUpOwogCisKIC8qCiAgKiBkbXJlc3JjbAogICovCi0KLXZvaWQKLWFjcGlfZG1faW9fZmxhZ3MgKAotCQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi12b2lkCi1hY3BpX2RtX21lbW9yeV9mbGFncyAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljX2ZsYWdzKTsKLQogdm9pZAogYWNwaV9kbV93b3JkX2Rlc2NyaXB0b3IgKAogCXN0cnVjdCBhc2xfd29yZF9hZGRyZXNzX2Rlc2MgICAgKnJlc291cmNlLApAQCAtMzczLDcgKzMxOSw2IEBACiAvKgogICogZG1yZXNyY3MKICAqLwotCiB2b2lkCiBhY3BpX2RtX2lycV9kZXNjcmlwdG9yICgKIAlzdHJ1Y3QgYXNsX2lycV9mb3JtYXRfZGVzYyAgICAgICpyZXNvdXJjZSwKQEAgLTQyMCw3ICszNjUsNiBAQAogLyoKICAqIGRtdXRpbHMKICAqLwotCiB2b2lkCiBhY3BpX2RtX2FkZF90b19leHRlcm5hbF9saXN0ICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXRoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oIGIvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKaW5kZXggMjM3ZDYzNC4uOGY1ZjJmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZGlzcGF0LmgKQEAgLTUwLDQwICs1MCw5IEBACiAjZGVmaW5lIE5BTUVPRl9BUkdfTlRFICAgICAgIl9fQTAiCiAKIAotLyogQ29tbW9uIGludGVyZmFjZXMgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3B1c2ggKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcCAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BfY291bnQsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdm9pZCAqCi1hY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0jZW5kaWYKLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfb2JqX3N0YWNrX3BvcF9vYmplY3QgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmplY3QsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLQotLyogZHNvcGNvZGUgLSBzdXBwb3J0IGZvciBsYXRlIGV2YWx1YXRpb24gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfZXhlY3V0ZV9hcmd1bWVudHMgKAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqc2NvcGVfbm9kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9sZW5ndGgsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW1sX3N0YXJ0KTsKLQorLyoKKyAqIGRzb3Bjb2RlIC0gc3VwcG9ydCBmb3IgbGF0ZSBldmFsdWF0aW9uCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2dldF9idWZmZXJfZmllbGRfYXJndW1lbnRzICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CkBAIC0xMDEsMTUgKzcwLDYgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX2luaXRfYnVmZmVyX2ZpZWxkICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqYnVmZmVyX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2Zmc2V0X2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbGVuZ3RoX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVzdWx0X2Rlc2MpOwotCi1hY3BpX3N0YXR1cwogYWNwaV9kc19ldmFsX2J1ZmZlcl9maWVsZF9vcGVyYW5kcyAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCk7CkBAIC0xMzAsOSArOTAsOSBAQAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSk7CiAKIAotLyogZHNjdHJsIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgY29udHJvbCBzdGFjayByb3V0aW5lcyAqLwotCi0KKy8qCisgKiBkc2N0cmwgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlLCBjb250cm9sIHN0YWNrIHJvdXRpbmVzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2V4ZWNfYmVnaW5fY29udHJvbF9vcCAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKQEAgLTE0NCw5ICsxMDQsOSBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogCi0vKiBkc2V4ZWMgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlLCBtZXRob2QgZXhlY3V0aW9uIGNhbGxiYWNrcyAqLwotCi0KKy8qCisgKiBkc2V4ZWMgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlLCBtZXRob2QgZXhlY3V0aW9uIGNhbGxiYWNrcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19nZXRfcHJlZGljYXRlX3ZhbHVlICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMTYyLDE0ICsxMjIsOSBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKnN0YXRlKTsKIAogCi0vKiBkc2ZpZWxkIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSBmb3IgQU1MIGZpZWxkcyAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9kc19nZXRfZmllbGRfbmFtZXMgKAotCXN0cnVjdCBhY3BpX2NyZWF0ZV9maWVsZF9pbmZvICAgKmluZm8sCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICphcmcpOwotCisvKgorICogZHNmaWVsZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgZm9yIEFNTCBmaWVsZHMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfY3JlYXRlX2ZpZWxkICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTE5OSw4ICsxNTQsOSBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiAKLS8qIGRzbG9hZCAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UsIG5hbWVzcGFjZSBsb2FkIGNhbGxiYWNrcyAqLwotCisvKgorICogZHNsb2FkIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSwgbmFtZXNwYWNlIGxvYWQgY2FsbGJhY2tzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2xvYWQxX2JlZ2luX29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMjI1LDkgKzE4MSw5IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlcik7CiAKIAotLyogZHNtdGhkYXQgLSBtZXRob2QgZGF0YSAobG9jYWxzL2FyZ3MpICovCi0KLQorLyoKKyAqIGRzbXRoZGF0IC0gbWV0aG9kIGRhdGEgKGxvY2Fscy9hcmdzKQorICovCiBhY3BpX3N0YXR1cwogYWNwaV9kc19zdG9yZV9vYmplY3RfdG9fbG9jYWwgKAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLApAQCAtMjUwLDE0ICsyMDYsNiBAQAogYWNwaV9kc19pc19tZXRob2RfdmFsdWUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX29iamVjdF90eXBlCi1hY3BpX2RzX21ldGhvZF9kYXRhX2dldF90eXBlICgKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotI2VuZGlmCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZSAoCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUsCkBAIC0yNjUsMTIgKzIxMyw2IEBACiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqZGVzdF9kZXNjKTsKIAotdm9pZAotYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXRfYXJncyAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnBhcmFtcywKQEAgLTI4OCwxNiArMjMwLDEwIEBACiBhY3BpX2RzX21ldGhvZF9kYXRhX2luaXQgKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCi1hY3BpX3N0YXR1cwotYWNwaV9kc19tZXRob2RfZGF0YV9zZXRfdmFsdWUgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCi0KLS8qIGRzbWV0aG9kIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIGNvbnRyb2wgbWV0aG9kIHBhcnNpbmcgKi8KLQorLyoKKyAqIGRzbWV0aG9kIC0gUGFyc2VyL0ludGVycHJldGVyIGludGVyZmFjZSAtIGNvbnRyb2wgbWV0aG9kIHBhcnNpbmcKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfZHNfcGFyc2VfbWV0aG9kICgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUpOwpAQCAtMzI0LDIwICsyNjAsMTggQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpjYWxsaW5nX21ldGhvZF9ub2RlKTsKIAogCi0vKiBkc29iaiAtIFBhcnNlci9JbnRlcnByZXRlciBpbnRlcmZhY2UgLSBvYmplY3QgaW5pdGlhbGl6YXRpb24gYW5kIGNvbnZlcnNpb24gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0ICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCisvKgorICogZHNpbml0CisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2luaXRpYWxpemVfb2JqZWN0cyAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpzdGFydF9ub2RlKTsKIAorCisvKgorICogZHNvYmplY3QgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIC0gb2JqZWN0IGluaXRpYWxpemF0aW9uIGFuZCBjb252ZXJzaW9uCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2RzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmogKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCkBAIC0zNTMsMTIgKzI4Nyw2IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9ial9kZXNjKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipvYmpfZGVzY19wdHIpOwotCi1hY3BpX3N0YXR1cwogYWNwaV9kc19pbml0X29iamVjdF9mcm9tX29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wLApAQCAtMzcyLDggKzMwMCw5IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwogCiAKLS8qIGRzdXRpbHMgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIHV0aWxpdHkgcm91dGluZXMgKi8KLQorLyoKKyAqIGRzdXRpbHMgLSBQYXJzZXIvSW50ZXJwcmV0ZXIgaW50ZXJmYWNlIHV0aWxpdHkgcm91dGluZXMKKyAqLwogdm9pZAogYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4gKAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwpAQCAtNDE4LDcgKzM0Nyw2IEBACiAvKgogICogZHN3c2NvcGUgLSBTY29wZSBTdGFjayBtYW5pcHVsYXRpb24KICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9kc19zY29wZV9zdGFja19wdXNoICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLApAQCAtNDM1LDcgKzM2MywxOCBAQAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiAKLS8qIGRzd3N0YXRlIC0gcGFyc2VyIFdBTEtfU1RBVEUgbWFuYWdlbWVudCByb3V0aW5lcyAqLworLyoKKyAqIGRzd3N0YXRlIC0gcGFyc2VyIFdBTEtfU1RBVEUgbWFuYWdlbWVudCByb3V0aW5lcworICovCithY3BpX3N0YXR1cworYWNwaV9kc19vYmpfc3RhY2tfcHVzaCAoCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqZWN0LAorCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworCithY3BpX3N0YXR1cworYWNwaV9kc19vYmpfc3RhY2tfcG9wICgKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9jb3VudCwKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqCiBhY3BpX2RzX2NyZWF0ZV93YWxrX3N0YXRlICgKQEAgLTQ1NCwxMiArMzkzLDYgQEAKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIpOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX2RzX29ial9zdGFja19kZWxldGVfYWxsICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLSNlbmRpZgotCiBhY3BpX3N0YXR1cwogYWNwaV9kc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wX2NvdW50LApAQCAtNDk0LDIwICs0MjcsOCBAQAogYWNwaV9kc19nZXRfY3VycmVudF93YWxrX3N0YXRlICgKIAlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgICAgICAgICp0aHJlYWQpOwogCi0jaWZkZWYgQUNQSV9FTkFCTEVfT0JKRUNUX0NBQ0hFCi12b2lkCi1hY3BpX2RzX2RlbGV0ZV93YWxrX3N0YXRlX2NhY2hlICgKLQl2b2lkKTsKLSNlbmRpZgotCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX2RzX3Jlc3VsdF9pbnNlcnQgKAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwogYWNwaV9kc19yZXN1bHRfcmVtb3ZlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqb2JqZWN0LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCkBAIC01MjksNCArNDUwLDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKm9iamVjdCwKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAorI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQordm9pZAorYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZV9jYWNoZSAoCisJdm9pZCk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9BQ0RJU1BBVF9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXZlbnRzLmggYi9pbmNsdWRlL2FjcGkvYWNldmVudHMuaAppbmRleCAyZGVjMDgzLi42MWEyN2M4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNldmVudHMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNldmVudHMuaApAQCAtNDUsNiArNDUsOSBAQAogI2RlZmluZSBfX0FDRVZFTlRTX0hfXwogCiAKKy8qCisgKiBldmV2ZW50CisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2V2X2luaXRpYWxpemVfZXZlbnRzICgKIAl2b2lkKTsKQEAgLTUzLDI4ICs1NiwxNCBAQAogYWNwaV9ldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzICgKIAl2b2lkKTsKIAotCi0vKgotICogRXZmaXhlZCAtIEZpeGVkIGV2ZW50IGhhbmRsaW5nCi0gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZml4ZWRfZXZlbnRfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7Ci0KIHUzMgogYWNwaV9ldl9maXhlZF9ldmVudF9kZXRlY3QgKAogCXZvaWQpOwogCi11MzIKLWFjcGlfZXZfZml4ZWRfZXZlbnRfZGlzcGF0Y2ggKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOwotCiAKIC8qCi0gKiBFdm1pc2MKKyAqIGV2bWlzYwogICovCi0KIHU4CiBhY3BpX2V2X2lzX25vdGlmeV9vYmplY3QgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwpAQCAtMTAwLDI0ICs4OSwxMCBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfdmFsdWUpOwogCi12b2lkIEFDUElfU1lTVEVNX1hGQUNFCi1hY3BpX2V2X25vdGlmeV9kaXNwYXRjaCAoCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KIAogLyoKLSAqIEV2Z3BlIC0gR1BFIGhhbmRsaW5nIGFuZCBkaXNwYXRjaAorICogZXZncGUgLSBHUEUgaGFuZGxpbmcgYW5kIGRpc3BhdGNoCiAgKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfZXZfd2Fsa19ncGVfbGlzdCAoCi0JQUNQSV9HUEVfQ0FMTEJBQ0sgICAgICAgZ3BlX3dhbGtfY2FsbGJhY2ssCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0KLXU4Ci1hY3BpX2V2X3ZhbGlkX2dwZV9ldmVudCAoCi0Jc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOwotCiBhY3BpX3N0YXR1cwogYWNwaV9ldl91cGRhdGVfZ3BlX2VuYWJsZV9tYXNrcyAoCiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8sCkBAIC0xMzcsOSArMTEyLDIzIEBACiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBncGVfZGV2aWNlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlX251bWJlcik7CiAKKworLyoKKyAqIGV2Z3BlYmxrCisgKi8KK3U4CithY3BpX2V2X3ZhbGlkX2dwZV9ldmVudCAoCisJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOworCiBhY3BpX3N0YXR1cwotYWNwaV9ldl9ncGVfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7CithY3BpX2V2X3dhbGtfZ3BlX2xpc3QgKAorCUFDUElfR1BFX0NBTExCQUNLICAgICAgIGdwZV93YWxrX2NhbGxiYWNrLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworCithY3BpX3N0YXR1cworYWNwaV9ldl9kZWxldGVfZ3BlX2hhbmRsZXJzICgKKwlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKKwlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwogCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9jcmVhdGVfZ3BlX2Jsb2NrICgKQEAgLTE1NCwxMSArMTQzLDYgQEAKIGFjcGlfZXZfZGVsZXRlX2dwZV9ibG9jayAoCiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyAoCi0Jc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCi0Jc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKLQogdTMyCiBhY3BpX2V2X2dwZV9kaXNwYXRjaCAoCiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8sCkBAIC0xNzcsMTAgKzE2MSwxNCBAQAogYWNwaV9ldl9jaGVja19mb3Jfd2FrZV9vbmx5X2dwZSAoCiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOwogCi0vKgotICogRXZyZWdpb24gLSBBZGRyZXNzIFNwYWNlIGhhbmRsaW5nCi0gKi8KK2FjcGlfc3RhdHVzCithY3BpX2V2X2dwZV9pbml0aWFsaXplICgKKwl2b2lkKTsKIAorCisvKgorICogZXZyZWdpb24gLSBBZGRyZXNzIFNwYWNlIGhhbmRsaW5nCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2V2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzICgKIAl2b2lkKTsKQEAgLTE5OCwxMyArMTg2LDYgQEAKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V2X2luc3RhbGxfaGFuZGxlciAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZXZfYXR0YWNoX3JlZ2lvbiAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqaGFuZGxlcl9vYmosCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcmVnaW9uX29iaiwKQEAgLTIzMywxNyArMjE0LDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICpyZWdpb25fb2JqLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pOwogCi1hY3BpX3N0YXR1cwotYWNwaV9ldl9yZWdfcnVuICgKLQlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIG9ial9oYW5kbGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwogCiAvKgotICogRXZyZWdpbmkgLSBSZWdpb24gaW5pdGlhbGl6YXRpb24gYW5kIHNldHVwCisgKiBldnJlZ2luaSAtIFJlZ2lvbiBpbml0aWFsaXphdGlvbiBhbmQgc2V0dXAKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9zeXN0ZW1fbWVtb3J5X3JlZ2lvbl9zZXR1cCAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCkBAIC0yOTMsOSArMjY3LDggQEAKIAogCiAvKgotICogRXZzY2kgLSBTQ0kgKFN5c3RlbSBDb250cm9sIEludGVycnVwdCkgaGFuZGxpbmcvZGlzcGF0Y2gKKyAqIGV2c2NpIC0gU0NJIChTeXN0ZW0gQ29udHJvbCBJbnRlcnJ1cHQpIGhhbmRsaW5nL2Rpc3BhdGNoCiAgKi8KLQogdTMyIEFDUElfU1lTVEVNX1hGQUNFCiBhY3BpX2V2X2dwZV94cnVwdF9oYW5kbGVyICgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmggYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCmluZGV4IDUzZjhiNTAuLjYwZDczN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaApAQCAtNDgsNyArNDgsNiBAQAogLyoKICAqIEV4Y2VwdGlvbnMgcmV0dXJuZWQgYnkgZXh0ZXJuYWwgQUNQSSBpbnRlcmZhY2VzCiAgKi8KLQogI2RlZmluZSBBRV9DT0RFX0VOVklST05NRU5UQUwgICAgICAgICAgIDB4MDAwMAogI2RlZmluZSBBRV9DT0RFX1BST0dSQU1NRVIgICAgICAgICAgICAgIDB4MTAwMAogI2RlZmluZSBBRV9DT0RFX0FDUElfVEFCTEVTICAgICAgICAgICAgIDB4MjAwMApAQCAtOTksNiArOTgsNyBAQAogCiAjZGVmaW5lIEFFX0NPREVfRU5WX01BWCAgICAgICAgICAgICAgICAgMHgwMDFFCiAKKwogLyoKICAqIFByb2dyYW1tZXIgZXhjZXB0aW9ucwogICovCkBAIC0xNjgsNiArMTY4LDcgQEAKIAogI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMQogCisKIC8qCiAgKiBJbnRlcm5hbCBleGNlcHRpb25zIHVzZWQgZm9yIGNvbnRyb2wKICAqLwpAQCAtMTg4LDYgKzE4OSw3IEBACiAKICNpZmRlZiBERUZJTkVfQUNQSV9HTE9CQUxTCiAKKwogLyoKICAqIFN0cmluZyB2ZXJzaW9ucyBvZiB0aGUgZXhjZXB0aW9uIGNvZGVzIGFib3ZlCiAgKiBUaGVzZSBzdHJpbmdzIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5lcyBleGFjdGx5CkBAIC0zMDQsNSArMzA2LDQgQEAKIAogI2VuZGlmIC8qIEFDUEkgR0xPQkFMUyAqLwogCi0KICNlbmRpZiAvKiBfX0FDRVhDRVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaCBiL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oCmluZGV4IGM3ZjM4N2EuLjQ5NDY2OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2dsb2JhbC5oCkBAIC0xNDYsMTUgKzE0NiwxNSBAQAogQUNQSV9FWFRFUk4gRkFDU19ERVNDUklQVE9SICAgICAgICAgICAgKmFjcGlfZ2JsX0ZBQ1M7CiBBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9jb21tb25fZmFjcyAgICAgICAgICAgICBhY3BpX2dibF9jb21tb25fZkFDUzsKIC8qCi0gKiBTaW5jZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgU1NEVHMgYW5kIFBTRFRTLCBhIHNpbmdsZSBwb2ludGVyIGlzIG5vdAorICogU2luY2UgdGhlcmUgbWF5IGJlIG11bHRpcGxlIFNTRFRzIGFuZCBQU0RUcywgYSBzaW5nbGUgcG9pbnRlciBpcyBub3QKICAqIHN1ZmZpY2llbnQ7IFRoZXJlZm9yZSwgdGhlcmUgaXNuJ3Qgb25lIQogICovCiAKIAogLyoKLSAqIEhhbmRsZSBib3RoIEFDUEkgMS4wIGFuZCBBQ1BJIDIuMCBJbnRlZ2VyIHdpZHRocwotICogSWYgd2UgYXJlIHJ1bm5pbmcgYSBtZXRob2QgdGhhdCBleGlzdHMgaW4gYSAzMi1iaXQgQUNQSSB0YWJsZS4KLSAqIFVzZSBvbmx5IDMyIGJpdHMgb2YgdGhlIEludGVnZXIgZm9yIGNvbnZlcnNpb24uCisgKiBIYW5kbGUgYm90aCBBQ1BJIDEuMCBhbmQgQUNQSSAyLjAgSW50ZWdlciB3aWR0aHM6CisgKiBJZiB3ZSBhcmUgZXhlY3V0aW5nIGEgbWV0aG9kIHRoYXQgZXhpc3RzIGluIGEgMzItYml0IEFDUEkgdGFibGUsCisgKiB1c2Ugb25seSB0aGUgbG93ZXIgMzIgYml0cyBvZiB0aGUgKGludGVybmFsKSA2NC1iaXQgSW50ZWdlci4KICAqLwogQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGg7CiBBQ1BJX0VYVEVSTiB1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGg7CkBAIC0yNDYsNiArMjQ2LDcgQEAKIEFDUElfRVhURVJOIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZ2JsX2RlZXBlc3RfbmVzdGluZzsKICNlbmRpZgogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVycHJldGVyIGdsb2JhbHMKQEAgLTI2OCw2ICsyNjksNyBAQAogCiBBQ1BJX0VYVEVSTiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICphY3BpX2dibF9wYXJzZWRfbmFtZXNwYWNlX3Jvb3Q7CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSGFyZHdhcmUgZ2xvYmFscwpAQCAtMjk4LDcgKzMwMCw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogQUNQSV9FWFRFUk4gdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9nYmxfZGJfb3V0cHV0X2ZsYWdzOwogCiAjaWZkZWYgQUNQSV9ESVNBU1NFTUJMRVIKQEAgLTM1Myw1ICszNTQsNCBAQAogCiAjZW5kaWYgLyogQUNQSV9ERUJVR0dFUiAqLwogCi0KICNlbmRpZiAvKiBfX0FDR0xPQkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaCBiL2luY2x1ZGUvYWNwaS9hY2h3YXJlLmgKaW5kZXggMjhhZDEzOS4uOWQ2MzY0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjaHdhcmUuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNod2FyZS5oCkBAIC00NiwyNSArNDYsMjkgQEAKIAogCiAvKiBQTSBUaW1lciB0aWNrcyBwZXIgc2Vjb25kIChIWikgKi8KKwogI2RlZmluZSBQTV9USU1FUl9GUkVRVUVOQ1kgIDM1Nzk1NDUKIAorLyogVmFsdWVzIGZvciB0aGUgX1NTVCByZXNlcnZlZCBtZXRob2QgKi8KKworI2RlZmluZSBBQ1BJX1NTVF9JTkRJQ0FUT1JfT0ZGICAwCisjZGVmaW5lIEFDUElfU1NUX1dPUktJTkcgICAgICAgIDEKKyNkZWZpbmUgQUNQSV9TU1RfV0FLSU5HICAgICAgICAgMgorI2RlZmluZSBBQ1BJX1NTVF9TTEVFUElORyAgICAgICAzCisjZGVmaW5lIEFDUElfU1NUX1NMRUVQX0NPTlRFWFQgIDQKKwogCiAvKiBQcm90b3R5cGVzICovCiAKIAorLyoKKyAqIGh3YWNwaSAtIGhpZ2ggbGV2ZWwgZnVuY3Rpb25zCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2h3X2luaXRpYWxpemUgKAogCXZvaWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9od19zaHV0ZG93biAoCi0Jdm9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2h3X2luaXRpYWxpemVfc3lzdGVtX2luZm8gKAotCXZvaWQpOwotCi1hY3BpX3N0YXR1cwogYWNwaV9od19zZXRfbW9kZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKIApAQCAtNzIsMTIgKzc2LDEwIEBACiBhY3BpX2h3X2dldF9tb2RlICgKIAl2b2lkKTsKIAotdTMyCi1hY3BpX2h3X2dldF9tb2RlX2NhcGFiaWxpdGllcyAoCi0Jdm9pZCk7CiAKLS8qIFJlZ2lzdGVyIEkvTyBQcm90b3R5cGVzICovCi0KKy8qCisgKiBod3JlZ3MgLSBBQ1BJIFJlZ2lzdGVyIEkvTworICovCiBzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqCiBhY3BpX2h3X2dldF9iaXRfcmVnaXN0ZXJfaW5mbyAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9pZCk7CkBAIC0xMTEsOCArMTEzLDkgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKIAogCi0vKiBHUEUgc3VwcG9ydCAqLwotCisvKgorICogaHdncGUgLSBHUEUgc3VwcG9ydAorICovCiBhY3BpX3N0YXR1cwogYWNwaV9od193cml0ZV9ncGVfZW5hYmxlX3JlZyAoCiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gICAgICAqZ3BlX2V2ZW50X2luZm8pOwpAQCAtMTMxLDEyICsxMzQsMTIgQEAKIAlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAgICAgICpncGVfeHJ1cHRfaW5mbywKIAlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAgICAgICpncGVfYmxvY2spOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfaHdfZ2V0X2dwZV9zdGF0dXMgKAogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICAgICAgKmdwZV9ldmVudF9pbmZvLAogCWFjcGlfZXZlbnRfc3RhdHVzICAgICAgICAgICAgICAgKmV2ZW50X3N0YXR1cyk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiBhY3BpX3N0YXR1cwogYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzICgKQEAgLTE1NSwxNSArMTU4LDExIEBACiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gICAgICAqZ3BlX3hydXB0X2luZm8sCiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gICAgICAqZ3BlX2Jsb2NrKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfaHdfZW5hYmxlX3dha2V1cF9ncGVfYmxvY2sgKAotCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICAgICAgKmdwZV94cnVwdF9pbmZvLAotCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICAgICAgKmdwZV9ibG9jayk7CiAKLQotLyogQUNQSSBUaW1lciBwcm90b3R5cGVzICovCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCisvKgorICogaHd0aW1lciAtIEFDUEkgVGltZXIgcHJvdG90eXBlcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbiAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVzb2x1dGlvbik7CkBAIC0xNzcsNiArMTc2LDcgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpY2tzLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3RpY2tzLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWVfZWxhcHNlZCk7Ci0jZW5kaWYgIC8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworCiAKICNlbmRpZiAvKiBfX0FDSFdBUkVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNpbnRlcnAuaCBiL2luY2x1ZGUvYWNwaS9hY2ludGVycC5oCmluZGV4IGM1MzAxZjUuLjVjNzE3MjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2ludGVycC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2ludGVycC5oCkBAIC00OCwzNyArNDgsOSBAQAogI2RlZmluZSBBQ1BJX1dBTEtfT1BFUkFORFMgICAgICAgKCYod2Fsa19zdGF0ZS0+b3BlcmFuZHMgW3dhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyAtMV0pKQogCiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdGFja19wdHIsCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2NoZWNrX29iamVjdF90eXBlICgKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGVfbmVlZGVkLAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgdGhpc190eXBlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9iamVjdCk7Ci0KLS8qCi0gKiBleHhmYWNlIC0gRXh0ZXJuYWwgaW50ZXJwcmV0ZXIgaW50ZXJmYWNlcwotICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2xvYWRfdGFibGUgKAotCWFjcGlfdGFibGVfdHlwZSAgICAgICAgICAgICAgICAgdGFibGVfaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9leGVjdXRlX21ldGhvZCAoCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbWV0aG9kX25vZGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnBhcmFtcywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX29ial9kZXNjKTsKLQotCiAvKgogICogZXhjb252cnQgLSBvYmplY3QgY29udmVyc2lvbgogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NvbnZlcnRfdG9faW50ZWdlciAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC0xMTAsMTcgKzgyLDEwIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJlc3VsdF9kZXNjLAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCi11MzIKLWFjcGlfZXhfY29udmVydF90b19hc2NpaSAoCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHJpbmcsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKTsKIAogLyoKICAqIGV4ZmllbGQgLSBBQ1BJIEFNTCAocC1jb2RlKSBleGVjdXRpb24gLSBmaWVsZCBtYW5pcHVsYXRpb24KICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9jb21tb25fYnVmZmVyX3NldHVwICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKQEAgLTEyOCw0MiArOTMsNiBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdHVtX2NvdW50KTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfZXhfZXh0cmFjdF9mcm9tX2ZpZWxkICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuZ3RoKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfaW5zZXJ0X2ludG9fZmllbGQgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9zZXR1cF9yZWdpb24gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9hY2Nlc3NfcmVnaW9uICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgKnZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF93cml0ZSk7Ci0KLXU4Ci1hY3BpX2V4X3JlZ2lzdGVyX292ZXJmbG93ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfZmllbGRfZGF0dW1faW8gKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCi0JYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfZXhfd3JpdGVfd2l0aF91cGRhdGVfcnVsZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICBtYXNrLApAQCAtMTk4LDI4ICsxMjcsMzMgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmVzdWx0X2Rlc2MpOwogCisKIC8qCi0gKiBleG1pc2MgLSBBQ1BJIEFNTCAocC1jb2RlKSBleGVjdXRpb24gLSBzcGVjaWZpYyBvcGNvZGVzCisgKiBleGZsZGlvIC0gbG93IGxldmVsIGZpZWxkIEkvTwogICovCithY3BpX3N0YXR1cworYWNwaV9leF9leHRyYWN0X2Zyb21fZmllbGQgKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW5ndGgpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9leF9vcGNvZGVfM0FfMFRfMFIgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOworYWNwaV9leF9pbnNlcnRfaW50b19maWVsZCAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCisJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2xlbmd0aCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X29wY29kZV8zQV8xVF8xUiAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CithY3BpX2V4X2FjY2Vzc19yZWdpb24gKAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGF0dW1fYnl0ZV9vZmZzZXQsCisJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqdmFsdWUsCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3dyaXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotdTgKLWFjcGlfZXhfZG9fbWF0Y2ggKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfb3AsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqcGFja2FnZV9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqbWF0Y2hfb2JqKTsKLQorLyoKKyAqIGV4bWlzYyAtIG1pc2Mgc3VwcG9ydCByb3V0aW5lcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9leF9nZXRfb2JqZWN0X3JlZmVyZW5jZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC0yMjcsMTMgKzE2MSw2IEBACiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3Jlc29sdmVfbXVsdGlwbGUgKAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb3BlcmFuZCwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICpyZXR1cm5fdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqcmV0dXJuX2Rlc2MpOwotCi1hY3BpX3N0YXR1cwogYWNwaV9leF9jb25jYXRfdGVtcGxhdGUgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjMiwKQEAgLTMwOCwxMyArMjM1LDYgQEAKIC8qCiAgKiBleGNvbmZpZyAtIGR5bmFtaWMgdGFibGUgbG9hZC91bmxvYWQKICAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV9leF9hZGRfdGFibGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKnRhYmxlLAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9ub2RlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipkZGJfaGFuZGxlKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfbG9hZF9vcCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MsCkBAIC0zMzQsNyArMjU0LDYgQEAKIC8qCiAgKiBleG11dGV4IC0gbXV0ZXggc3VwcG9ydAogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2FjcXVpcmVfbXV0ZXggKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRpbWVfZGVzYywKQEAgLTM1NCwxNSArMjczLDEwIEBACiBhY3BpX2V4X3VubGlua19tdXRleCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqX2Rlc2MpOwogCi12b2lkCi1hY3BpX2V4X2xpbmtfbXV0ZXggKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLAotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAgICAgICAgKnRocmVhZCk7CiAKIC8qCi0gKiBleHByZXAgLSBBQ1BJIEFNTCAocC1jb2RlKSBleGVjdXRpb24gLSBwcmVwIHV0aWxpdGllcworICogZXhwcmVwIC0gQUNQSSBBTUwgZXhlY3V0aW9uIC0gcHJlcCB1dGlsaXRpZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9ial9kZXNjLApAQCAtMzc1LDEwICsyODksMTAgQEAKIGFjcGlfZXhfcHJlcF9maWVsZF92YWx1ZSAoCiAJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gICAqaW5mbyk7CiAKKwogLyoKICAqIGV4c3lzdGVtIC0gSW50ZXJmYWNlIHRvIE9TIHNlcnZpY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfc3lzdGVtX2RvX25vdGlmeV9vcCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdmFsdWUsCkBAIC00MjEsOSArMzM1LDggQEAKIAogCiAvKgotICogZXhtb25hZGljIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uLCBtb25hZGljIG9wZXJhdG9ycworICogZXhvcGFyZzEgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDEgb3BlcmFuZAogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X29wY29kZV8wQV8wVF8xUiAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CkBAIC00NDUsOSArMzU4LDggQEAKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogLyoKLSAqIGV4ZHlhZGljIC0gQUNQSSBBTUwgKHAtY29kZSkgZXhlY3V0aW9uLCBkeWFkaWMgb3BlcmF0b3JzCisgKiBleG9wYXJnMiAtIEFDUEkgQU1MIGV4ZWN1dGlvbiwgMiBvcGVyYW5kcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X29wY29kZV8yQV8wVF8wUiAoCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CkBAIC00NjYsMjEgKzM3OCw1NiBAQAogCiAKIC8qCi0gKiBleHJlc29sdiAgLSBPYmplY3QgcmVzb2x1dGlvbiBhbmQgZ2V0IHZhbHVlIGZ1bmN0aW9ucworICogZXhvcGFyZzMgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDMgb3BlcmFuZHMKICAqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfb3Bjb2RlXzNBXzBUXzBSICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKK2FjcGlfZXhfb3Bjb2RlXzNBXzFUXzFSICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworCisvKgorICogZXhvcGFyZzYgLSBBQ1BJIEFNTCBleGVjdXRpb24sIDYgb3BlcmFuZHMKKyAqLworYWNwaV9zdGF0dXMKK2FjcGlfZXhfb3Bjb2RlXzZBXzBUXzFSICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKKworCisvKgorICogZXhyZXNvbHYgLSBPYmplY3QgcmVzb2x1dGlvbiBhbmQgZ2V0IHZhbHVlIGZ1bmN0aW9ucworICovCithY3BpX3N0YXR1cwogYWNwaV9leF9yZXNvbHZlX3RvX3ZhbHVlICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc3RhY2tfcHRyLAogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwogCiBhY3BpX3N0YXR1cworYWNwaV9leF9yZXNvbHZlX211bHRpcGxlICgKKwlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9wZXJhbmQsCisJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICAqcmV0dXJuX3R5cGUsCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9kZXNjKTsKKworCisvKgorICogZXhyZXNudGUgLSByZXNvbHZlIG5hbWVzcGFjZSBub2RlCisgKi8KK2FjcGlfc3RhdHVzCiBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqKnN0YWNrX3B0ciwKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAorCisvKgorICogZXhyZXNvcCAtIHJlc29sdmUgb3BlcmFuZCB0byB2YWx1ZQorICovCiBhY3BpX3N0YXR1cwotYWNwaV9leF9yZXNvbHZlX29iamVjdF90b192YWx1ZSAoCithY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKipzdGFja19wdHIsCiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKQEAgLTQ4OCw3ICs0MzUsNiBAQAogLyoKICAqIGV4ZHVtcCAtIEludGVycHJldGVyIGRlYnVnIG91dHB1dCByb3V0aW5lcwogICovCi0KIHZvaWQKIGFjcGlfZXhfZHVtcF9vcGVyYW5kICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmpfZGVzYywKQEAgLTUwNCw3ICs0NTAsNyBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW1iZXIpOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogdm9pZAogYWNwaV9leF9kdW1wX29iamVjdF9kZXNjcmlwdG9yICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QsCkBAIC01MTQsNDYgKzQ2MCwxMiBAQAogYWNwaV9leF9kdW1wX25vZGUgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAotdm9pZAotYWNwaV9leF9vdXRfc3RyaW5nICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aXRsZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfZXhfb3V0X3BvaW50ZXIgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlKTsKLQotdm9pZAotYWNwaV9leF9vdXRfaW50ZWdlciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGl0bGUsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfZXhfb3V0X2FkZHJlc3MgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRpdGxlLAotCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyAgICAgICAgICAgdmFsdWUpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qCi0gKiBleG5hbWVzIC0gaW50ZXJwcmV0ZXIvc2Nhbm5lciBuYW1lIGxvYWQvZXhlY3V0ZQorICogZXhuYW1lcyAtIEFNTCBuYW1lc3RyaW5nIHN1cHBvcnQKICAqLwotCi1jaGFyICoKLWFjcGlfZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmcgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4X2NvdW50LAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX25hbWVfc2Vncyk7Ci0KLXUzMgotYWNwaV9leF9nb29kX2NoYXIgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfZXhfbmFtZV9zZWdtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqaW5fYW1sX2FkZHJlc3MsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmFtZV9zdHJpbmcpOwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9nZXRfbmFtZV9zdHJpbmcgKAogCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgZGF0YV90eXBlLApAQCAtNTYxLDE2ICs0NzMsMTAgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqb3V0X25hbWVfc3RyaW5nLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9uYW1lX2xlbmd0aCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX2V4X2RvX25hbWUgKAotCWFjcGlfb2JqZWN0X3R5cGUgICAgICAgICAgICAgICAgZGF0YV90eXBlLAotCWFjcGlfaW50ZXJwcmV0ZXJfbW9kZSAgICAgICAgICAgbG9hZF9leGVjX21vZGUpOwotCiAKIC8qCiAgKiBleHN0b3JlIC0gT2JqZWN0IHN0b3JlIHN1cHBvcnQKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9zdG9yZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdmFsX2Rlc2MsCkBAIC01NzgsMTIgKzQ4NCw2IEBACiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX2V4X3N0b3JlX29iamVjdF90b19pbmRleCAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqdmFsX2Rlc2MsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGVzdF9kZXNjLAotCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgICAgICAgICAgKndhbGtfc3RhdGUpOwotCi1hY3BpX3N0YXR1cwogYWNwaV9leF9zdG9yZV9vYmplY3RfdG9fbm9kZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKQEAgLTU5MywxMCArNDkzLDEwIEBACiAjZGVmaW5lIEFDUElfSU1QTElDSVRfQ09OVkVSU0lPTiAgICAgICAgVFJVRQogI2RlZmluZSBBQ1BJX05PX0lNUExJQ0lUX0NPTlZFUlNJT04gICAgIEZBTFNFCiAKLS8qCi0gKiBleHN0b3JlbgotICovCiAKKy8qCisgKiBleHN0b3JlbiAtIHJlc29sdmUvc3RvcmUgb2JqZWN0CisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X3Jlc29sdmVfb2JqZWN0ICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICoqc291cmNlX2Rlc2NfcHRyLApAQCAtNjEyLDkgKzUxMiw4IEBACiAKIAogLyoKLSAqIGV4Y29weSAtIG9iamVjdCBjb3B5CisgKiBleHN0b3JvYiAtIHN0b3JlIG9iamVjdCAtIGJ1ZmZlci9zdHJpbmcKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyICgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKQEAgLTYyNSw2ICs1MjQsMTAgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICp0YXJnZXRfZGVzYyk7CiAKKworLyoKKyAqIGV4Y29weSAtIG9iamVjdCBjb3B5CisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX2V4X2NvcHlfaW50ZWdlcl90b19pbmRleF9maWVsZCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCkBAIC02NDUsMTAgKzU0OCwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9kZXNjLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnRhcmdldF9kZXNjKTsKIAorCiAvKgogICogZXh1dGlscyAtIGludGVycHJldGVyL3NjYW5uZXIgdXRpbGl0aWVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIgKAogCXZvaWQpOwpAQCAtNjY5LDExICs1NzIsNiBAQAogYWNwaV9leF9yZWxlYXNlX2dsb2JhbF9sb2NrICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZCk7CiAKLXUzMgotYWNwaV9leF9kaWdpdHNfbmVlZGVkICgKLQlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7Ci0KIHZvaWQKIGFjcGlfZXhfZWlzYV9pZF90b19zdHJpbmcgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpY19pZCwKQEAgLTY4OCw3ICs1ODYsNiBAQAogLyoKICAqIGV4cmVnaW9uIC0gZGVmYXVsdCBvcF9yZWdpb24gaGFuZGxlcnMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9leF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oIGIvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaAppbmRleCAwMWQzYjRiLi4wMzBlNjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKQEAgLTcyLDcgKzcyLDYgQEAKICAqCiAgKiBOT1RFOiBhbnkgY2hhbmdlcyBoZXJlIG11c3QgYmUgcmVmbGVjdGVkIGluIHRoZSBhY3BpX2dibF9tdXRleF9uYW1lcyB0YWJsZSBhbHNvIQogICovCi0KICNkZWZpbmUgQUNQSV9NVFhfRVhFQ1VURSAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFDUElfTVRYX0lOVEVSUFJFVEVSICAgICAgICAgICAgMQogI2RlZmluZSBBQ1BJX01UWF9QQVJTRVIgICAgICAgICAgICAgICAgIDIKQEAgLTE1MSwxMyArMTUwLDEzIEBACiAjZGVmaW5lIEFDUElfRklFTERfRFdPUkRfR1JBTlVMQVJJVFkgICAgNAogI2RlZmluZSBBQ1BJX0ZJRUxEX1FXT1JEX0dSQU5VTEFSSVRZICAgIDgKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBOYW1lc3BhY2UgdHlwZWRlZnMgYW5kIHN0cnVjdHMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAvKiBPcGVyYXRpb25hbCBtb2RlcyBvZiB0aGUgQU1MIGludGVycHJldGVyL3NjYW5uZXIgKi8KIAogdHlwZWRlZiBlbnVtCkBAIC0xNzYsNyArMTc1LDYgQEAKICAqIGRhdGFfdHlwZSBpcyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnRlcm5hbCBkZXNjcmlwdG9ycywgYW5kIE1VU1QKICAqIGJlIHRoZSBmaXJzdCBieXRlIGluIHRoaXMgc3RydWN0dXJlLgogICovCi0KIHVuaW9uIGFjcGlfbmFtZV91bmlvbgogewogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXI7CkBAIC00MTUsNyArNDEzLDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAjZGVmaW5lIEFDUElfQ09OVFJPTF9OT1JNQUwgICAgICAgICAgICAgICAgICAweEMwCiAjZGVmaW5lIEFDUElfQ09OVFJPTF9DT05ESVRJT05BTF9FWEVDVVRJTkcgICAweEMxCiAjZGVmaW5lIEFDUElfQ09OVFJPTF9QUkVESUNBVEVfRVhFQ1VUSU5HICAgICAweEMyCkBAIC00MjQsNiArNDIxLDcgQEAKIAogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICA7CiBzdHJ1Y3QgYWNwaV9vYmpfbXV0ZXg7CiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgOwpAQCAtNjAxLDcgKzU5OSw2IEBACiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgIC8qIE9wY29kZSB0eXBlICovCiB9OwogCi0KIHVuaW9uIGFjcGlfcGFyc2VfdmFsdWUKIHsKIAlhY3BpX2ludGVnZXIgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyOyAgICAgICAgLyogSW50ZWdlciBjb25zdGFudCAoVXAgdG8gNjQgYml0cykgKi8KQEAgLTYxMyw3ICs2MTAsNiBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICphcmc7ICAgICAgICAgICAvKiBhcmd1bWVudHMgYW5kIGNvbnRhaW5lZCBvcHMgKi8KIH07CiAKLQogI2RlZmluZSBBQ1BJX1BBUlNFX0NPTU1PTiBcCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOyAgICAgIC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiBUeXBlIG9mIE9wICovXApAQCAtNjkxLDcgKzY4Nyw2IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfb3BfbmFtZVsxMl07CiB9OwogCi0KIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0CiB7CiAJc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiAgICAgICAgY29tbW9uOwpAQCAtODM0LDcgKzgyOSw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyogcmVzb3VyY2VfdHlwZSB2YWx1ZXMgKi8KIAogI2RlZmluZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZX1JBTkdFICAgICAgICAgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbWFjcm9zLmggYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAppbmRleCBmY2FjZWQxLi4wOWJlOTM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaApAQCAtNTM5LDExICs1MzksNiBAQAogCiAKICNkZWZpbmUgQUNQSV9EVU1QX0VOVFJZKGEsYikgICAgICAgICAgICBhY3BpX25zX2R1bXBfZW50cnkgKGEsYikKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0jZGVmaW5lIEFDUElfRFVNUF9UQUJMRVMoYSxiKSAgICAgICAgICAgYWNwaV9uc19kdW1wX3RhYmxlcyhhLGIpCi0jZW5kaWYKLQogI2RlZmluZSBBQ1BJX0RVTVBfUEFUSE5BTUUoYSxiLGMsZCkgICAgIGFjcGlfbnNfZHVtcF9wYXRobmFtZShhLGIsYyxkKQogI2RlZmluZSBBQ1BJX0RVTVBfUkVTT1VSQ0VfTElTVChhKSAgICAgIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0KGEpCiAjZGVmaW5lIEFDUElfRFVNUF9CVUZGRVIoYSxiKSAgICAgICAgICAgYWNwaV91dF9kdW1wX2J1ZmZlcigodTggKilhLGIsREJfQllURV9ESVNQTEFZLF9DT01QT05FTlQpCkBAIC01OTYsMTEgKzU5MSw2IEBACiAjZGVmaW5lIEFDUElfRFVNUF9TVEFDS19FTlRSWShhKQogI2RlZmluZSBBQ1BJX0RVTVBfT1BFUkFORFMoYSxiLGMsZCxlKQogI2RlZmluZSBBQ1BJX0RVTVBfRU5UUlkoYSxiKQotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLSNkZWZpbmUgQUNQSV9EVU1QX1RBQkxFUyhhLGIpCi0jZW5kaWYKLQogI2RlZmluZSBBQ1BJX0RVTVBfUEFUSE5BTUUoYSxiLGMsZCkKICNkZWZpbmUgQUNQSV9EVU1QX1JFU09VUkNFX0xJU1QoYSkKICNkZWZpbmUgQUNQSV9EVU1QX0JVRkZFUihhLGIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNuYW1lcy5oIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWI3Y2IwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hY3BpL2FjbmFtZXMuaApAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNuYW1lcy5oIC0gR2xvYmFsIG5hbWVzIGFuZCBzdHJpbmdzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAwNSwgUi4gQnlyb24gTW9vcmUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCisgKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdworICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KKyAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCisgKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKKyAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogTk8gV0FSUkFOVFkKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCisgKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZuZGVmIF9fQUNOQU1FU19IX18KKyNkZWZpbmUgX19BQ05BTUVTX0hfXworCisvKiBNZXRob2QgbmFtZXMgLSB0aGVzZSBtZXRob2RzIGNhbiBhcHBlYXIgYW55d2hlcmUgaW4gdGhlIG5hbWVzcGFjZSAqLworCisjZGVmaW5lIE1FVEhPRF9OQU1FX19ISUQgICAgICAgICJfSElEIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fQ0lEICAgICAgICAiX0NJRCIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1VJRCAgICAgICAgIl9VSUQiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19BRFIgICAgICAgICJfQURSIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fSU5JICAgICAgICAiX0lOSSIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1NUQSAgICAgICAgIl9TVEEiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19SRUcgICAgICAgICJfUkVHIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fU0VHICAgICAgICAiX1NFRyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX0JCTiAgICAgICAgIl9CQk4iCisjZGVmaW5lIE1FVEhPRF9OQU1FX19QUlQgICAgICAgICJfUFJUIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fQ1JTICAgICAgICAiX0NSUyIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1BSUyAgICAgICAgIl9QUlMiCisjZGVmaW5lIE1FVEhPRF9OQU1FX19QUlcgICAgICAgICJfUFJXIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fU1JTICAgICAgICAiX1NSUyIKKworLyogTWV0aG9kIG5hbWVzIC0gdGhlc2UgbWV0aG9kcyBtdXN0IGFwcGVhciBhdCB0aGUgbmFtZXNwYWNlIHJvb3QgKi8KKworI2RlZmluZSBNRVRIT0RfTkFNRV9fQkZTICAgICAgICAiXFxfQkZTIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fR1RTICAgICAgICAiXFxfR1RTIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fUFRTICAgICAgICAiXFxfUFRTIgorI2RlZmluZSBNRVRIT0RfTkFNRV9fU1NUICAgICAgICAiXFxfU0kuX1NTVCIKKyNkZWZpbmUgTUVUSE9EX05BTUVfX1dBSyAgICAgICAgIlxcX1dBSyIKKworLyogRGVmaW5pdGlvbnMgb2YgdGhlIHByZWRlZmluZWQgbmFtZXNwYWNlIG5hbWVzICAqLworCisjZGVmaW5lIEFDUElfVU5LTk9XTl9OQU1FICAgICAgICh1MzIpIDB4M0YzRjNGM0YgICAgIC8qIFVua25vd24gbmFtZSBpcyAgIj8/Pz8iICovCisjZGVmaW5lIEFDUElfUk9PVF9OQU1FICAgICAgICAgICh1MzIpIDB4NUY1RjVGNUMgICAgIC8qIFJvb3QgbmFtZSBpcyAgICAgIlxfX18iICovCisjZGVmaW5lIEFDUElfU1lTX0JVU19OQU1FICAgICAgICh1MzIpIDB4NUY1MzQyNUYgICAgIC8qIFN5cyBidXMgbmFtZSBpcyAgIl9TQl8iICovCisKKyNkZWZpbmUgQUNQSV9OU19ST09UX1BBVEggICAgICAgIlxcIgorI2RlZmluZSBBQ1BJX05TX1NZU1RFTV9CVVMgICAgICAiX1NCXyIKKworCisjZW5kaWYgIC8qIF9fQUNOQU1FU19IX18gICovCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjbmFtZXNwLmggYi9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaAppbmRleCA4YjNjZGMzLi5kMWIzY2U4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaApAQCAtNTcsMTcgKzU3LDYgQEAKICNkZWZpbmUgQUNQSV9OU19ORVdTQ09QRSAgICAgICAgICAgIDEgICAvKiBhIGRlZmluaXRpb24gb2YgdGhpcyB0eXBlIG9wZW5zIGEgbmFtZSBzY29wZSAqLwogI2RlZmluZSBBQ1BJX05TX0xPQ0FMICAgICAgICAgICAgICAgMiAgIC8qIHN1cHByZXNzIHNlYXJjaCBvZiBlbmNsb3Npbmcgc2NvcGVzICovCiAKLQotLyogRGVmaW5pdGlvbnMgb2YgdGhlIHByZWRlZmluZWQgbmFtZXNwYWNlIG5hbWVzICAqLwotCi0jZGVmaW5lIEFDUElfVU5LTk9XTl9OQU1FICAgICAgICAgICAodTMyKSAweDNGM0YzRjNGICAgICAvKiBVbmtub3duIG5hbWUgaXMgICI/Pz8/IiAqLwotI2RlZmluZSBBQ1BJX1JPT1RfTkFNRSAgICAgICAgICAgICAgKHUzMikgMHg1RjVGNUY1QyAgICAgLyogUm9vdCBuYW1lIGlzICAgICAiXF9fXyIgKi8KLSNkZWZpbmUgQUNQSV9TWVNfQlVTX05BTUUgICAgICAgICAgICh1MzIpIDB4NUY1MzQyNUYgICAgIC8qIFN5cyBidXMgbmFtZSBpcyAgIl9TQl8iICovCi0KLSNkZWZpbmUgQUNQSV9OU19ST09UX1BBVEggICAgICAgICAgICJcXCIKLSNkZWZpbmUgQUNQSV9OU19TWVNURU1fQlVTICAgICAgICAgICJfU0JfIgotCi0KIC8qIEZsYWdzIGZvciBhY3BpX25zX2xvb2t1cCwgYWNwaV9uc19zZWFyY2hfYW5kX2VudGVyICovCiAKICNkZWZpbmUgQUNQSV9OU19OT19VUFNFQVJDSCAgICAgICAgIDAKQEAgLTgwLDEwICs2OSw5IEBACiAjZGVmaW5lIEFDUElfTlNfV0FMS19OT19VTkxPQ0sgICAgICBGQUxTRQogCiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2xvYWRfbmFtZXNwYWNlICgKLQl2b2lkKTsKLQorLyoKKyAqIG5zaW5pdCAtIE5hbWVzcGFjZSBpbml0aWFsaXphdGlvbgorICovCiBhY3BpX3N0YXR1cwogYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMgKAogCXZvaWQpOwpAQCAtOTMsMjMgKzgxLDIyIEBACiAJdm9pZCk7CiAKIAotLyogTmFtZXNwYWNlIGluaXQgLSBuc3hmaW5pdCAqLworLyoKKyAqIG5zbG9hZCAtICBOYW1lc3BhY2UgbG9hZGluZworICovCithY3BpX3N0YXR1cworYWNwaV9uc19sb2FkX25hbWVzcGFjZSAoCisJdm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX25zX2luaXRfb25lX2RldmljZSAoCi0JYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGluZ19sZXZlbCwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipyZXR1cm5fdmFsdWUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19pbml0X29uZV9vYmplY3QgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7CithY3BpX25zX2xvYWRfdGFibGUgKAorCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2Rlc2MsCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSk7CiAKIAorLyoKKyAqIG5zd2FsayAtIHdhbGsgdGhlIG5hbWVzcGFjZQorICovCiBhY3BpX3N0YXR1cwogYWNwaV9uc193YWxrX25hbWVzcGFjZSAoCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLApAQCAtMTI2LDM3ICsxMTMsMjQgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpwYXJlbnQsCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqY2hpbGQpOwogCi12b2lkCi1hY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQpOwogCi0KLS8qIE5hbWVzcGFjZSBsb2FkaW5nIC0gbnNsb2FkICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzX251bWJlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjKTsKLQorLyoKKyAqIG5zcGFyc2UgLSB0YWJsZSBwYXJzaW5nCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX25zX3BhcnNlX3RhYmxlICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9kZXNjLAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnNjb3BlKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9hZF90YWJsZSAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYywKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlICgKLQlhY3BpX3RhYmxlX3R5cGUgICAgICAgICAgICAgICAgIHRhYmxlX3R5cGUpOworYWNwaV9uc19vbmVfY29tcGxldGVfcGFyc2UgKAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc19udW1iZXIsCisJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfZGVzYyk7CiAKIAogLyoKLSAqIFRvcC1sZXZlbCBuYW1lc3BhY2UgYWNjZXNzIC0gbnNhY2Nlc3MKKyAqIG5zYWNjZXNzIC0gVG9wLWxldmVsIG5hbWVzcGFjZSBhY2Nlc3MKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9uc19yb290X2luaXRpYWxpemUgKAogCXZvaWQpOwpAQCAtMTczLDkgKzE0Nyw4IEBACiAKIAogLyoKLSAqIE5hbWVkIG9iamVjdCBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiAtIG5zYWxsb2MKKyAqIG5zYWxsb2MgLSBOYW1lZCBvYmplY3QgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24KICAqLwotCiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqCiBhY3BpX25zX2NyZWF0ZV9ub2RlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwpAQCAtMTg5LDYgKzE2MiwxMCBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKnBhcmVudF9oYW5kbGUpOwogCiB2b2lkCithY3BpX25zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIgKAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQpOworCit2b2lkCiBhY3BpX25zX2RldGFjaF9vYmplY3QgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwogCkBAIC0yMDEsMzYgKzE3OCwxNiBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUxLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5hbWUyKTsKIAotdm9pZAotYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKLQogCiAvKgotICogTmFtZXNwYWNlIG1vZGlmaWNhdGlvbiAtIG5zbW9kaWZ5CisgKiBuc2R1bXAgLSBOYW1lc3BhY2UgZHVtcC9wcmludCB1dGlsaXRpZXMKICAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX25zX3VubG9hZF9uYW1lc3BhY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZGVsZXRlX3N1YnRyZWUgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBOYW1lc3BhY2UgZHVtcC9wcmludCB1dGlsaXRpZXMgLSBuc2R1bXAKLSAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogdm9pZAogYWNwaV9uc19kdW1wX3RhYmxlcyAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfYmFzZSwKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB2b2lkCiBhY3BpX25zX2R1bXBfZW50cnkgKApAQCAtMjQ5LDE5ICsyMDYsNiBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NlZ21lbnRzLAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhdGhuYW1lKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1hY3BpX3N0YXR1cwotYWNwaV9uc19kdW1wX29uZV9kZXZpY2UgKAotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqX2hhbmRsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJldHVybl92YWx1ZSk7Ci0KLXZvaWQKLWFjcGlfbnNfZHVtcF9yb290X2RldmljZXMgKAotCXZvaWQpOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX25zX2R1bXBfb25lX29iamVjdCAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBvYmpfaGFuZGxlLApAQCAtMjY5LDcgKzIxMyw3IEBACiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqcmV0dXJuX3ZhbHVlKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfbnNfZHVtcF9vYmplY3RzICgKIAlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgIHR5cGUsCkBAIC0yNzcsMTMgKzIyMSwxMiBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RlcHRoLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZGVyX2lkLAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgc3RhcnRfaGFuZGxlKTsKLSNlbmRpZgorI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIAogLyoKLSAqIE5hbWVzcGFjZSBldmFsdWF0aW9uIGZ1bmN0aW9ucyAtIG5zZXZhbAorICogbnNldmFsIC0gTmFtZXNwYWNlIGV2YWx1YXRpb24gZnVuY3Rpb25zCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlICgKIAlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKQEAgLTI5OCw0MCArMjQxLDE0IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX25zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QgKAotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICAgICAgKmluZm8pOwotCi1hY3BpX3N0YXR1cwotYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlICgKLQlzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAgICAgICppbmZvKTsKLQogCiAvKgotICogUGFyZW50L0NoaWxkL1BlZXIgdXRpbGl0eSBmdW5jdGlvbnMKKyAqIG5zbmFtZXMgLSBOYW1lIGFuZCBTY29wZSBtYW5pcHVsYXRpb24KICAqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfbmFtZQotYWNwaV9uc19maW5kX3BhcmVudF9uYW1lICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlX3RvX3NlYXJjaCk7Ci0jZW5kaWYKLQotCi0vKgotICogTmFtZSBhbmQgU2NvcGUgbWFuaXB1bGF0aW9uIC0gbnNuYW1lcwotICovCi0KIHUzMgogYWNwaV9uc19vcGVuc19zY29wZSAoCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlKTsKIAotdm9pZAotYWNwaV9uc19idWlsZF9leHRlcm5hbF9wYXRoICgKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlLAotCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYW1lX2J1ZmZlcik7Ci0KIGNoYXIgKgogYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUgKAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgKm5vZGUpOwpAQCAtMzYzLDkgKzI4MCw4IEBACiAKIAogLyoKLSAqIE9iamVjdCBtYW5hZ2VtZW50IGZvciBuYW1lc3BhY2Ugbm9kZXMgLSBuc29iamVjdAorICogbnNvYmplY3QgLSBPYmplY3QgbWFuYWdlbWVudCBmb3IgbmFtZXNwYWNlIG5vZGVzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfbnNfYXR0YWNoX29iamVjdCAoCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZSwKQEAgLTM5OSw5ICszMTUsOCBAQAogCiAKIC8qCi0gKiBOYW1lc3BhY2Ugc2VhcmNoaW5nIGFuZCBlbnRyeSAtIG5zc2VhcmNoCisgKiBuc3NlYXJjaCAtIE5hbWVzcGFjZSBzZWFyY2hpbmcgYW5kIGVudHJ5CiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfbnNfc2VhcmNoX2FuZF9lbnRlciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeV9uYW1lLApAQCAtNDI4LDE3ICszNDMsMTIgQEAKIAogCiAvKgotICogVXRpbGl0eSBmdW5jdGlvbnMgLSBuc3V0aWxzCisgKiBuc3V0aWxzIC0gVXRpbGl0eSBmdW5jdGlvbnMKICAqLwotCiB1OAogYWNwaV9uc192YWxpZF9yb290X3ByZWZpeCAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOwogCi11OAotYWNwaV9uc192YWxpZF9wYXRoX3NlcGFyYXRvciAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXApOwotCiBhY3BpX29iamVjdF90eXBlCiBhY3BpX25zX2dldF90eXBlICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKQEAgLTUxMSw1ICs0MjEsNCBAQAogYWNwaV9uc19nZXRfbmV4dF92YWxpZF9ub2RlICgKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlKTsKIAotCiAjZW5kaWYgLyogX19BQ05BTUVTUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKaW5kZXggMDM2MDIzYS4uZTA3OWI5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKQEAgLTEzMyw2ICsxMzMsNyBAQAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKIH07CiAKKwogLyoKICAqIE5vdGU6IFRoZSBTdHJpbmcgYW5kIEJ1ZmZlciBvYmplY3QgbXVzdCBiZSBpZGVudGljYWwgdGhyb3VnaCB0aGUgUG9pbnRlcgogICogZWxlbWVudC4gIFRoZXJlIGlzIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMuCkBAIC00NjgsNyArNDY5LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyogT2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KIAogI2RlZmluZSBBQ1BJX0RFU0NfVFlQRV9DQUNIRUQgICAgICAgICAgIDB4MDEgICAgICAgIC8qIFVzZWQgb25seSB3aGVuIG9iamVjdCBpcyBjYWNoZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oIGIvaW5jbHVkZS9hY3BpL2Fjb3Bjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ZWNiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9hY29wY29kZS5oCkBAIC0wLDAgKzEsMzI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTmFtZTogYWNvcGNvZGUuaCAtIEFNTCBvcGNvZGUgaW5mb3JtYXRpb24gZm9yIHRoZSBBTUwgcGFyc2VyIGFuZCBpbnRlcnByZXRlcgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDUsIFIuIEJ5cm9uIE1vb3JlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfX0FDT1BDT0RFX0hfXworI2RlZmluZSBfX0FDT1BDT0RFX0hfXworCisjZGVmaW5lIE1BWF9FWFRFTkRFRF9PUENPREUgICAgICAgICAweDg4CisjZGVmaW5lIE5VTV9FWFRFTkRFRF9PUENPREUgICAgICAgICAoTUFYX0VYVEVOREVEX09QQ09ERSArIDEpCisjZGVmaW5lIE1BWF9JTlRFUk5BTF9PUENPREUKKyNkZWZpbmUgTlVNX0lOVEVSTkFMX09QQ09ERSAgICAgICAgIChNQVhfSU5URVJOQUxfT1BDT0RFICsgMSkKKworLyogVXNlZCBmb3Igbm9uLWFzc2lnbmVkIG9wY29kZXMgKi8KKworI2RlZmluZSBfVU5LICAgICAgICAgICAgICAgICAgICAgICAgMHg2QgorCisvKgorICogUmVzZXJ2ZWQgQVNDSUkgY2hhcmFjdGVycy4gIERvIG5vdCB1c2UgYW55IG9mIHRoZXNlIGZvcgorICogaW50ZXJuYWwgb3Bjb2Rlcywgc2luY2UgdGhleSBhcmUgdXNlZCB0byBkaWZmZXJlbnRpYXRlCisgKiBuYW1lIHN0cmluZ3MgZnJvbSBBTUwgb3Bjb2RlcworICovCisjZGVmaW5lIF9BU0MgICAgICAgICAgICAgICAgICAgICAgICAweDZDCisjZGVmaW5lIF9OQU0gICAgICAgICAgICAgICAgICAgICAgICAweDZDCisjZGVmaW5lIF9QRlggICAgICAgICAgICAgICAgICAgICAgICAweDZECisKKworLyoKKyAqIEFsbCBBTUwgb3Bjb2RlcyBhbmQgdGhlIHBhcnNlLXRpbWUgYXJndW1lbnRzIGZvciBlYWNoLiAgVXNlZCBieSB0aGUgQU1MCisgKiBwYXJzZXIgIEVhY2ggbGlzdCBpcyBjb21wcmVzc2VkIGludG8gYSAzMi1iaXQgbnVtYmVyIGFuZCBzdG9yZWQgaW4gdGhlCisgKiBtYXN0ZXIgb3Bjb2RlIHRhYmxlIChpbiBwc29wY29kZS5jKS4KKyAqLworI2RlZmluZSBBUkdQX0FDQ0VTU0ZJRUxEX09QICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKKyNkZWZpbmUgQVJHUF9BQ1FVSVJFX09QICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfV09SRERBVEEpCisjZGVmaW5lIEFSR1BfQUREX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0FMSUFTX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfTkFNRVNUUklORywgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0FSRzAgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQVJHMSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9BUkcyICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0FSRzMgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQVJHNCAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9BUkc1ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0FSRzYgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQkFOS19GSUVMRF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUVTVFJJTkcsICAgIEFSR1BfTkFNRVNUUklORyxBUkdQX1RFUk1BUkcsICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfRklFTERMSVNUKQorI2RlZmluZSBBUkdQX0JJVF9BTkRfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9CSVRfTkFORF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQklUX05PUl9PUCAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0JJVF9OT1RfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfQklUX09SX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0JJVF9YT1JfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9CUkVBS19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0JSRUFLX1BPSU5UX09QICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQlVGRkVSX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfQllURUxJU1QpCisjZGVmaW5lIEFSR1BfQllURV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9CWVRFREFUQSkKKyNkZWZpbmUgQVJHUF9CWVRFTElTVF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfQ09OQ0FUX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0NPTkNBVF9SRVNfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9DT05EX1JFRl9PRl9PUCAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX0NPTlRJTlVFX09QICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1NJTVBMRU5BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX0JJVF9GSUVMRF9PUCAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9DUkVBVEVfQllURV9GSUVMRF9PUCAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0NSRUFURV9EV09SRF9GSUVMRF9PUCAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX0ZJRUxEX09QICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX05BTUUpCisjZGVmaW5lIEFSR1BfQ1JFQVRFX1FXT1JEX0ZJRUxEX09QICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKKyNkZWZpbmUgQVJHUF9DUkVBVEVfV09SRF9GSUVMRF9PUCAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0RBVEFfUkVHSU9OX09QICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfTkFNRSwgICAgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0RFQlVHX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfREVDUkVNRU5UX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfREVSRUZfT0ZfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0RFVklDRV9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX09CSkxJU1QpCisjZGVmaW5lIEFSR1BfRElWSURFX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VULCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9EV09SRF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX0RXT1JEREFUQSkKKyNkZWZpbmUgQVJHUF9FTFNFX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfRVZFTlRfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FKQorI2RlZmluZSBBUkdQX0ZBVEFMX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfQllURURBVEEsICAgQVJHUF9EV09SRERBVEEsICAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfRklFTERfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUVTVFJJTkcsICAgIEFSR1BfQllURURBVEEsICBBUkdQX0ZJRUxETElTVCkKKyNkZWZpbmUgQVJHUF9GSU5EX1NFVF9MRUZUX0JJVF9PUCAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX0ZJTkRfU0VUX1JJR0hUX0JJVF9PUCAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfRlJPTV9CQ0RfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9JRl9PUCAgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9URVJNTElTVCkKKyNkZWZpbmUgQVJHUF9JTkNSRU1FTlRfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9JTkRFWF9GSUVMRF9PUCAgICAgICAgICAgICBBUkdQX0xJU1Q1IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRVNUUklORywgICAgQVJHUF9OQU1FU1RSSU5HLEFSR1BfQllURURBVEEsICBBUkdQX0ZJRUxETElTVCkKKyNkZWZpbmUgQVJHUF9JTkRFWF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfTEFORF9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTEVRVUFMX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTEdSRUFURVJfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTEdSRUFURVJFUVVBTF9PUCAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTExFU1NfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTExFU1NFUVVBTF9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfTE5PVF9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xOT1RFUVVBTF9PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xPQURfT1AgICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfTkFNRVNUUklORywgQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfTE9BRF9UQUJMRV9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUNiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RFUk1BUkcsICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX0xPQ0FMMCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUwxICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT0NBTDIgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMMyAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUw0ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT0NBTDUgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX0xPQ0FMNiAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTE9DQUw3ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9MT1JfT1AgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9NQVRDSF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1Q2IChBUkdQX1RFUk1BUkcsICAgIEFSR1BfQllURURBVEEsICAgICAgQVJHUF9URVJNQVJHLCAgIEFSR1BfQllURURBVEEsICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX01FVEhPRF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9URVJNTElTVCkKKyNkZWZpbmUgQVJHUF9NRVRIT0RDQUxMX09QICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfTUlEX09QICAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUNCAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUFSRywgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9NT0RfT1AgICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfTVVMVElQTFlfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX01VVEVYX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfTkFNRSwgICAgICAgQVJHUF9CWVRFREFUQSkKKyNkZWZpbmUgQVJHUF9OQU1FX09QICAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX05BTUUsICAgICAgIEFSR1BfREFUQU9CSikKKyNkZWZpbmUgQVJHUF9OQU1FREZJRUxEX09QICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX05BTUVTVFJJTkcpCisjZGVmaW5lIEFSR1BfTkFNRVBBVEhfT1AgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX05PT1BfT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR1BfTk9USUZZX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfT05FX09QICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9PTkVTX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX1BBQ0tBR0VfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9CWVRFREFUQSwgICAgICBBUkdQX0RBVEFPQkpMSVNUKQorI2RlZmluZSBBUkdQX1BPV0VSX1JFU19PUCAgICAgICAgICAgICAgIEFSR1BfTElTVDUgKEFSR1BfUEtHTEVOR1RILCAgQVJHUF9OQU1FLCAgICAgICAgICBBUkdQX0JZVEVEQVRBLCAgQVJHUF9XT1JEREFUQSwgIEFSR1BfT0JKTElTVCkKKyNkZWZpbmUgQVJHUF9QUk9DRVNTT1JfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1Q2IChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9CWVRFREFUQSwgIEFSR1BfRFdPUkREQVRBLCBBUkdQX0JZVEVEQVRBLCAgQVJHUF9PQkpMSVNUKQorI2RlZmluZSBBUkdQX1FXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfUVdPUkREQVRBKQorI2RlZmluZSBBUkdQX1JFRl9PRl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1JFR0lPTl9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDQgKEFSR1BfTkFNRSwgICAgICAgQVJHUF9CWVRFREFUQSwgICAgICBBUkdQX1RFUk1BUkcsICAgQVJHUF9URVJNQVJHKQorI2RlZmluZSBBUkdQX1JFTEVBU0VfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1JFU0VSVkVERklFTERfT1AgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfTkFNRVNUUklORykKKyNkZWZpbmUgQVJHUF9SRVNFVF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1NVUEVSTkFNRSkKKyNkZWZpbmUgQVJHUF9SRVRVUk5fT1AgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfUkVWSVNJT05fT1AgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHUF9TQ09QRV9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1BLR0xFTkdUSCwgIEFSR1BfTkFNRSwgICAgICAgICAgQVJHUF9URVJNTElTVCkKKyNkZWZpbmUgQVJHUF9TSElGVF9MRUZUX09QICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfU0hJRlRfUklHSFRfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1NJR05BTF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1NJWkVfT0ZfT1AgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfU1VQRVJOQU1FKQorI2RlZmluZSBBUkdQX1NMRUVQX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDEgKEFSR1BfVEVSTUFSRykKKyNkZWZpbmUgQVJHUF9TVEFMTF9PUCAgICAgICAgICAgICAgICAgICBBUkdQX0xJU1QxIChBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfU1RBVElDU1RSSU5HX09QICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9OQU1FU1RSSU5HKQorI2RlZmluZSBBUkdQX1NUT1JFX09QICAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfU1RSSU5HX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9DSEFSTElTVCkKKyNkZWZpbmUgQVJHUF9TVUJUUkFDVF9PUCAgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVEhFUk1BTF9aT05FX09QICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX05BTUUsICAgICAgICAgIEFSR1BfT0JKTElTVCkKKyNkZWZpbmUgQVJHUF9USU1FUl9PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdQX1RPX0JDRF9PUCAgICAgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVE9fQlVGRkVSX09QICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9UT19ERUNfU1RSX09QICAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEFSR0VUKQorI2RlZmluZSBBUkdQX1RPX0hFWF9TVFJfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDIgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVE9fSU5URUdFUl9PUCAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RBUkdFVCkKKyNkZWZpbmUgQVJHUF9UT19TVFJJTkdfT1AgICAgICAgICAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9UQVJHRVQpCisjZGVmaW5lIEFSR1BfVFlQRV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfVU5MT0FEX09QICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9TVVBFUk5BTUUpCisjZGVmaW5lIEFSR1BfVkFSX1BBQ0tBR0VfT1AgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfREFUQU9CSkxJU1QpCisjZGVmaW5lIEFSR1BfV0FJVF9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1RFUk1BUkcpCisjZGVmaW5lIEFSR1BfV0hJTEVfT1AgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9QS0dMRU5HVEgsICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfVEVSTUxJU1QpCisjZGVmaW5lIEFSR1BfV09SRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMSAoQVJHUF9XT1JEREFUQSkKKyNkZWZpbmUgQVJHUF9aRVJPX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorCisKKy8qCisgKiBBbGwgQU1MIG9wY29kZXMgYW5kIHRoZSBydW50aW1lIGFyZ3VtZW50cyBmb3IgZWFjaC4gIFVzZWQgYnkgdGhlIEFNTAorICogaW50ZXJwcmV0ZXIgIEVhY2ggbGlzdCBpcyBjb21wcmVzc2VkIGludG8gYSAzMi1iaXQgbnVtYmVyIGFuZCBzdG9yZWQKKyAqIGluIHRoZSBtYXN0ZXIgb3Bjb2RlIHRhYmxlIChpbiBwc29wY29kZS5jKS4KKyAqCisgKiAoVXNlZCBieSBwcmVwX29wZXJhbmRzIHByb2NlZHVyZSBhbmQgdGhlIEFTTCBDb21waWxlcikKKyAqLworI2RlZmluZSBBUkdJX0FDQ0VTU0ZJRUxEX09QICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9BQ1FVSVJFX09QICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX01VVEVYLCAgICAgIEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9BRERfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQUxJQVNfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0FSRzAgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQVJHMSAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9BUkcyICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0FSRzMgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQVJHNCAgICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9BUkc1ICAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0FSRzYgICAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQkFOS19GSUVMRF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0JJVF9BTkRfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9CSVRfTkFORF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQklUX05PUl9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0JJVF9OT1RfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfQklUX09SX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0JJVF9YT1JfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9CUkVBS19PUCAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0JSRUFLX1BPSU5UX09QICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfQlVGRkVSX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX0JZVEVfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9CWVRFTElTVF9PUCAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfQ09OQ0FUX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBLCAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0NPTkNBVF9SRVNfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9CVUZGRVIsICAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9DT05EX1JFRl9PRl9PUCAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX09CSkVDVF9SRUYsIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0NPTlRJTlVFX09QICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9DT1BZX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0FOWVRZUEUsICAgIEFSR0lfU0lNUExFX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfQklUX0ZJRUxEX09QICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCisjZGVmaW5lIEFSR0lfQ1JFQVRFX0JZVEVfRklFTERfT1AgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9CVUZGRVIsICAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfUkVGRVJFTkNFKQorI2RlZmluZSBBUkdJX0NSRUFURV9EV09SRF9GSUVMRF9PUCAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfRklFTERfT1AgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9JTlRFR0VSLCAgICAgIEFSR0lfUkVGRVJFTkNFKQorI2RlZmluZSBBUkdJX0NSRUFURV9RV09SRF9GSUVMRF9PUCAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1JFRkVSRU5DRSkKKyNkZWZpbmUgQVJHSV9DUkVBVEVfV09SRF9GSUVMRF9PUCAgICAgICBBUkdJX0xJU1QzIChBUkdJX0JVRkZFUiwgICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9SRUZFUkVOQ0UpCisjZGVmaW5lIEFSR0lfREFUQV9SRUdJT05fT1AgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9TVFJJTkcsICAgICBBUkdJX1NUUklORywgICAgICAgIEFSR0lfU1RSSU5HKQorI2RlZmluZSBBUkdJX0RFQlVHX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfREVDUkVNRU5UX09QICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSX1JFRikKKyNkZWZpbmUgQVJHSV9ERVJFRl9PRl9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX1JFRl9PUl9TVFJJTkcpCisjZGVmaW5lIEFSR0lfREVWSUNFX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0RJVklERV9PUCAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDQgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRiwgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfRFdPUkRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0VMU0VfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9FVkVOVF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfRkFUQUxfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9GSUVMRF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfRklORF9TRVRfTEVGVF9CSVRfT1AgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9GSU5EX1NFVF9SSUdIVF9CSVRfT1AgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX0ZST01fQkNEX09QICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfSUZfT1AgICAgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0lOQ1JFTUVOVF9PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUl9SRUYpCisjZGVmaW5lIEFSR0lfSU5ERVhfRklFTERfT1AgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0lOREVYX09QICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQ09NUExFWE9CSiwgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9MQU5EX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9MRVFVQUxfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfQ09NUFVURURBVEEpCisjZGVmaW5lIEFSR0lfTEdSRUFURVJfT1AgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0NPTVBVVEVEQVRBKQorI2RlZmluZSBBUkdJX0xHUkVBVEVSRVFVQUxfT1AgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9MTEVTU19PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfQ09NUFVURURBVEEpCisjZGVmaW5lIEFSR0lfTExFU1NFUVVBTF9PUCAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX0xOT1RfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9MTk9URVFVQUxfT1AgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTE9BRF9PUCAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9SRUdJT05fT1JfRklFTEQsQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfTE9BRF9UQUJMRV9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUNiAoQVJHSV9TVFJJTkcsICAgICBBUkdJX1NUUklORywgICAgICAgIEFSR0lfU1RSSU5HLCAgICAgICBBUkdJX1NUUklORywgICAgQVJHSV9TVFJJTkcsIEFSR0lfQU5ZVFlQRSkKKyNkZWZpbmUgQVJHSV9MT0NBTDAgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMMSAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9DQUwyICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDMgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMNCAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9DQUw1ICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9MT0NBTDYgICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX0xPQ0FMNyAgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTE9SX09QICAgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfTUFUQ0hfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUNiAoQVJHSV9QQUNLQUdFLCAgICBBUkdJX0lOVEVHRVIsICAgQVJHSV9DT01QVVRFREFUQSwgICAgICBBUkdJX0lOVEVHRVIsQVJHSV9DT01QVVRFREFUQSxBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfTUVUSE9EX09QICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX01FVEhPRENBTExfT1AgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9NSURfT1AgICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1Q0IChBUkdJX0JVRkZFUl9PUl9TVFJJTkcsQVJHSV9JTlRFR0VSLCAgQVJHSV9JTlRFR0VSLCAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX01PRF9PUCAgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9NVUxUSVBMWV9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfTVVURVhfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX05BTUVfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9OQU1FREZJRUxEX09QICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfTkFNRVBBVEhfT1AgICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX05PT1BfT1AgICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfTk9USUZZX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9ERVZJQ0VfUkVGLCBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfT05FX09QICAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9PTkVTX09QICAgICAgICAgICAgICAgICAgICBBUkdfTk9ORQorI2RlZmluZSBBUkdJX1BBQ0tBR0VfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfSU5URUdFUikKKyNkZWZpbmUgQVJHSV9QT1dFUl9SRVNfT1AgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfUFJPQ0VTU09SX09QICAgICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1FXT1JEX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9SRUZfT0ZfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX09CSkVDVF9SRUYpCisjZGVmaW5lIEFSR0lfUkVHSU9OX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfUkVMRUFTRV9PUCAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9NVVRFWCkKKyNkZWZpbmUgQVJHSV9SRVNFUlZFREZJRUxEX09QICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfUkVTRVRfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9FVkVOVCkKKyNkZWZpbmUgQVJHSV9SRVRVUk5fT1AgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfUkVWSVNJT05fT1AgICAgICAgICAgICAgICAgQVJHX05PTkUKKyNkZWZpbmUgQVJHSV9TQ09QRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfU0hJRlRfTEVGVF9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMyAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0lOVEVHRVIsICAgICAgIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX1NISUZUX1JJR0hUX09QICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfSU5URUdFUiwgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX1RBUkdFVFJFRikKKyNkZWZpbmUgQVJHSV9TSUdOQUxfT1AgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0VWRU5UKQorI2RlZmluZSBBUkdJX1NJWkVfT0ZfT1AgICAgICAgICAgICAgICAgIEFSR0lfTElTVDEgKEFSR0lfREFUQU9CSkVDVCkKKyNkZWZpbmUgQVJHSV9TTEVFUF9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0lOVEVHRVIpCisjZGVmaW5lIEFSR0lfU1RBTExfT1AgICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1NUQVRJQ1NUUklOR19PUCAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9TVE9SRV9PUCAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0RBVEFSRUZPQkosIEFSR0lfVEFSR0VUUkVGKQorI2RlZmluZSBBUkdJX1NUUklOR19PUCAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9TVUJUUkFDVF9PUCAgICAgICAgICAgICAgICBBUkdJX0xJU1QzIChBUkdJX0lOVEVHRVIsICAgIEFSR0lfSU5URUdFUiwgICAgICAgQVJHSV9UQVJHRVRSRUYpCisjZGVmaW5lIEFSR0lfVEhFUk1BTF9aT05FX09QICAgICAgICAgICAgQVJHSV9JTlZBTElEX09QQ09ERQorI2RlZmluZSBBUkdJX1RJTUVSX09QICAgICAgICAgICAgICAgICAgIEFSR19OT05FCisjZGVmaW5lIEFSR0lfVE9fQkNEX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9JTlRFR0VSLCAgICBBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UT19CVUZGRVJfT1AgICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQorI2RlZmluZSBBUkdJX1RPX0RFQ19TVFJfT1AgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfQ09NUFVURURBVEEsQVJHSV9GSVhFRF9UQVJHRVQpCisjZGVmaW5lIEFSR0lfVE9fSEVYX1NUUl9PUCAgICAgICAgICAgICAgQVJHSV9MSVNUMiAoQVJHSV9DT01QVVRFREFUQSxBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UT19JTlRFR0VSX09QICAgICAgICAgICAgICBBUkdJX0xJU1QyIChBUkdJX0NPTVBVVEVEQVRBLEFSR0lfRklYRURfVEFSR0VUKQorI2RlZmluZSBBUkdJX1RPX1NUUklOR19PUCAgICAgICAgICAgICAgIEFSR0lfTElTVDMgKEFSR0lfQlVGRkVSLCAgICAgQVJHSV9JTlRFR0VSLCAgICAgICBBUkdJX0ZJWEVEX1RBUkdFVCkKKyNkZWZpbmUgQVJHSV9UWVBFX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0xJU1QxIChBUkdJX0FOWVRZUEUpCisjZGVmaW5lIEFSR0lfVU5MT0FEX09QICAgICAgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9EREJIQU5ETEUpCisjZGVmaW5lIEFSR0lfVkFSX1BBQ0tBR0VfT1AgICAgICAgICAgICAgQVJHSV9MSVNUMSAoQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1dBSVRfT1AgICAgICAgICAgICAgICAgICAgIEFSR0lfTElTVDIgKEFSR0lfRVZFTlQsICAgICAgQVJHSV9JTlRFR0VSKQorI2RlZmluZSBBUkdJX1dISUxFX09QICAgICAgICAgICAgICAgICAgIEFSR0lfSU5WQUxJRF9PUENPREUKKyNkZWZpbmUgQVJHSV9XT1JEX09QICAgICAgICAgICAgICAgICAgICBBUkdJX0lOVkFMSURfT1BDT0RFCisjZGVmaW5lIEFSR0lfWkVST19PUCAgICAgICAgICAgICAgICAgICAgQVJHX05PTkUKKworI2VuZGlmIC8qIF9fQUNPUENPREVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaCBiL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oCmluZGV4IGMwMzk1ZWYuLjY5ODI3NjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BhcnNlci5oCkBAIC02NCw4ICs2NCwxNyBAQAogCiAjZGVmaW5lIEFDUElfUEFSU0VfREVGRVJSRURfT1AgICAgICAgICAgMHgwMTAwCiAKLS8qIFBhcnNlciBleHRlcm5hbCBpbnRlcmZhY2VzICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBQYXJzZXIgaW50ZXJmYWNlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICogcHN4ZmFjZSAtIFBhcnNlciBleHRlcm5hbCBpbnRlcmZhY2VzCisgKi8KIGFjcGlfc3RhdHVzCiBhY3BpX3BzeF9sb2FkX3RhYmxlICgKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwY29kZV9hZGRyLApAQCAtNzYsMjMgKzg1LDEzIEBACiAJc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gICAgICAqaW5mbyk7CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFBhcnNlciBpbnRlcmZhY2VzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIHBzYXJncyAtIFBhcnNlIEFNTCBvcGNvZGUgYXJndW1lbnRzICovCi0KKy8qCisgKiBwc2FyZ3MgLSBQYXJzZSBBTUwgb3Bjb2RlIGFyZ3VtZW50cworICovCiB1OCAqCiBhY3BpX3BzX2dldF9uZXh0X3BhY2thZ2VfZW5kICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOwogCi11MzIKLWFjcGlfcHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGggKAotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnBhcnNlcl9zdGF0ZSk7Ci0KIGNoYXIgKgogYWNwaV9wc19nZXRfbmV4dF9uYW1lc3RyaW5nICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUpOwpAQCAtMTEwLDEwICsxMDksNiBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKmFyZywKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9jYWxsKTsKIAotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfbmV4dF9maWVsZCAoCi0Jc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgICAgICAgICAqcGFyc2VyX3N0YXRlKTsKLQogYWNwaV9zdGF0dXMKIGFjcGlfcHNfZ2V0X25leHRfYXJnICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLApAQCAtMTIyLDggKzExNyw5IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqKnJldHVybl9hcmcpOwogCiAKLS8qIHBzZmluZCAqLwotCisvKgorICogcHNmaW5kCisgKi8KIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICoKIGFjcGlfcHNfZmluZF9uYW1lICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpzY29wZSwKQEAgLTEzNSw4ICsxMzEsOSBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAogCi0vKiBwc29wY29kZSAtIEFNTCBPcGNvZGUgaW5mb3JtYXRpb24gKi8KLQorLyoKKyAqIHBzb3Bjb2RlIC0gQU1MIE9wY29kZSBpbmZvcm1hdGlvbgorICovCiBjb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqCiBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyAoCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwpAQCAtMTQ2LDU2ICsxNDMsMjUgQEAKIAl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7CiAKIAotLyogcHNwYXJzZSAtIHRvcCBsZXZlbCBwYXJzaW5nIHJvdXRpbmVzICovCi0KLXUzMgotYWNwaV9wc19nZXRfb3Bjb2RlX3NpemUgKAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKLQotdm9pZAotYWNwaV9wc19jb21wbGV0ZV90aGlzX29wICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcHNfbmV4dF9wYXJzZV9zdGF0ZSAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSwKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKLQlhY3BpX3N0YXR1cyAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX3N0YXR1cyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3BzX2ZpbmRfb2JqZWN0ICgKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlLAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKipvdXRfb3ApOwotCi12b2lkCi1hY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlICgKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpyb290KTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfcHNfcGFyc2VfbG9vcCAoCi0Jc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAgICAgICAgICAqd2Fsa19zdGF0ZSk7Ci0KKy8qCisgKiBwc3BhcnNlIC0gdG9wIGxldmVsIHBhcnNpbmcgcm91dGluZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfcHNfcGFyc2VfYW1sICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAotYWNwaV9zdGF0dXMKLWFjcGlfcHNfcGFyc2VfdGFibGUgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFtbCwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9zaXplLAotCWFjcGlfcGFyc2VfZG93bndhcmRzICAgICAgICAgICAgZGVzY2VuZGluZ19jYWxsYmFjaywKLQlhY3BpX3BhcnNlX3Vwd2FyZHMgICAgICAgICAgICAgIGFzY2VuZGluZ19jYWxsYmFjaywKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICoqcm9vdF9vYmplY3QpOwordTMyCithY3BpX3BzX2dldF9vcGNvZGVfc2l6ZSAoCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwogCiB1MTYKIGFjcGlfcHNfcGVla19vcGNvZGUgKAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICAgICAgICAgKnN0YXRlKTsKIAogCi0vKiBwc3Njb3BlIC0gU2NvcGUgc3RhY2sgbWFuYWdlbWVudCByb3V0aW5lcyAqLwotCi0KKy8qCisgKiBwc3Njb3BlIC0gU2NvcGUgc3RhY2sgbWFuYWdlbWVudCByb3V0aW5lcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9wc19pbml0X3Njb3BlICgKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpwYXJzZXJfc3RhdGUsCkBAIC0yMjgsOCArMTk0LDkgQEAKIAlzdHJ1Y3QgYWNwaV9wYXJzZV9zdGF0ZSAgICAgICAgICpzdGF0ZSk7CiAKIAotLyogcHN0cmVlIC0gcGFyc2UgdHJlZSBtYW5pcHVsYXRpb24gcm91dGluZXMgKi8KLQorLyoKKyAqIHBzdHJlZSAtIHBhcnNlIHRyZWUgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCisgKi8KIHZvaWQKIGFjcGlfcHNfYXBwZW5kX2FyZygKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcCwKQEAgLTI0NywyMCArMjE0LDE3IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnbik7CiAKLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKgotYWNwaV9wc19nZXRfY2hpbGQgKAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCiBhY3BpX3BzX2dldF9kZXB0aF9uZXh0ICgKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICpvcmlnaW4sCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3ApOwotI2VuZGlmICAvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogCi0vKiBwc3dhbGsgLSBwYXJzZSB0cmVlIHdhbGsgcm91dGluZXMgKi8KLQorLyoKKyAqIHBzd2FsayAtIHBhcnNlIHRyZWUgd2FsayByb3V0aW5lcworICovCiBhY3BpX3N0YXR1cwogYWNwaV9wc193YWxrX3BhcnNlZF9hbWwgKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnN0YXJ0X29wLApAQCAtMjgzLDkgKzI0NywxNCBAQAogYWNwaV9wc19kZWxldGVfY29tcGxldGVkX29wICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKIAordm9pZAorYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZSAoCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqcm9vdCk7CiAKLS8qIHBzdXRpbHMgLSBwYXJzZXIgdXRpbGl0aWVzICovCiAKKy8qCisgKiBwc3V0aWxzIC0gcGFyc2VyIHV0aWxpdGllcworICovCiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqCiBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCAoCiAJdm9pZCk7CkBAIC0zMDMsMTIgKzI3Miw2IEBACiBhY3BpX3BzX2ZyZWVfb3AgKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKIAotI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQotdm9pZAotYWNwaV9wc19kZWxldGVfcGFyc2VfY2FjaGUgKAotCXZvaWQpOwotI2VuZGlmCi0KIHU4CiBhY3BpX3BzX2lzX2xlYWRpbmdfY2hhciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKTsKQEAgLTMxNywyMCArMjgwLDI3IEBACiBhY3BpX3BzX2lzX3ByZWZpeF9jaGFyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOwogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKKyNpZmRlZglBQ1BJX0ZVVFVSRV9VU0FHRQogdTMyCiBhY3BpX3BzX2dldF9uYW1lKAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKm9wKTsKLSNlbmRpZgorI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIHZvaWQKIGFjcGlfcHNfc2V0X25hbWUoCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqb3AsCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKIAorI2lmZGVmIEFDUElfRU5BQkxFX09CSkVDVF9DQUNIRQordm9pZAorYWNwaV9wc19kZWxldGVfcGFyc2VfY2FjaGUgKAorCXZvaWQpOworI2VuZGlmCiAKLS8qIHBzZHVtcCAtIGRpc3BsYXkgcGFyc2VyIHRyZWUgKi8KIAorLyoKKyAqIHBzZHVtcCAtIGRpc3BsYXkgcGFyc2VyIHRyZWUKKyAqLwogdTMyCiBhY3BpX3BzX3NwcmludF9wYXRoICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJfc3RhcnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaS5oIGIvaW5jbHVkZS9hY3BpL2FjcGkuaAppbmRleCBhZDUzMjUyLi5hNjlkNzg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAqIFdlIHB1dCB0aGVtIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1cGxpY2F0ZSB0aGVtCiAgKiBpbiB0aGUgcmVzdCBvZiB0aGUgc291cmNlIGNvZGUgYWdhaW4gYW5kIGFnYWluLgogICovCisjaW5jbHVkZSAiYWNuYW1lcy5oIiAgICAgICAgICAgIC8qIEdsb2JhbCBBQ1BJIG5hbWVzIGFuZCBzdHJpbmdzICovCiAjaW5jbHVkZSAiYWNjb25maWcuaCIgICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzICovCiAjaW5jbHVkZSAicGxhdGZvcm0vYWNlbnYuaCIgICAgIC8qIFRhcmdldCBlbnZpcm9ubWVudCBzcGVjaWZpYyBpdGVtcyAqLwogI2luY2x1ZGUgImFjdHlwZXMuaCIgICAgICAgICAgICAvKiBGdW5kYW1lbnRhbCBjb21tb24gZGF0YSB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAppbmRleCBjNjI3YmM0Li44ZDBlMTI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaApAQCAtMTA4LDYgKzEwOCwyMSBAQAogdHlwZWRlZiBpbnQgKCphY3BpX29wX21hdGNoKQkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsCiAJCQkJIHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKIAorc3RydWN0IGFjcGlfYnVzX29wcyB7CisJdTMyIAkJCWFjcGlfb3BfYWRkOjE7CisJdTMyCQkJYWNwaV9vcF9yZW1vdmU6MTsKKwl1MzIJCQlhY3BpX29wX2xvY2s6MTsKKwl1MzIJCQlhY3BpX29wX3N0YXJ0OjE7CisJdTMyCQkJYWNwaV9vcF9zdG9wOjE7CisJdTMyCQkJYWNwaV9vcF9zdXNwZW5kOjE7CisJdTMyCQkJYWNwaV9vcF9yZXN1bWU6MTsKKwl1MzIJCQlhY3BpX29wX3NjYW46MTsKKwl1MzIJCQlhY3BpX29wX2JpbmQ6MTsKKwl1MzIJCQlhY3BpX29wX3VuYmluZDoxOworCXUzMgkJCWFjcGlfb3BfbWF0Y2g6MTsKKwl1MzIJCQlyZXNlcnZlZDoyMTsKK307CisKIHN0cnVjdCBhY3BpX2RldmljZV9vcHMgewogCWFjcGlfb3BfYWRkCQlhZGQ7CiAJYWNwaV9vcF9yZW1vdmUJCXJlbW92ZTsKQEAgLTMyNywxNSArMzQyLDM2IEBACiBpbnQgYWNwaV9idXNfcmVjZWl2ZV9ldmVudCAoc3RydWN0IGFjcGlfYnVzX2V2ZW50ICpldmVudCk7CiBpbnQgYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7CiBpbnQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKTsKLWludCBhY3BpX2J1c19zY2FuIChzdHJ1Y3QgYWNwaV9kZXZpY2UgKnN0YXJ0KTsKIGludCBhY3BpX2J1c19hZGQgKHN0cnVjdCBhY3BpX2RldmljZSAqKmNoaWxkLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwKIAkJYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSk7CitpbnQgYWNwaV9idXNfc3RhcnQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogCiBpbnQgYWNwaV9tYXRjaF9pZHMgKHN0cnVjdCBhY3BpX2RldmljZQkqZGV2aWNlLCBjaGFyCSppZHMpOwogaW50IGFjcGlfY3JlYXRlX2RpcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKik7CiB2b2lkIGFjcGlfcmVtb3ZlX2RpcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKik7CiAKKworLyoKKyAqIEJpbmQgcGh5c2ljYWwgZGV2aWNlcyB3aXRoIEFDUEkgZGV2aWNlcworICovCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CitzdHJ1Y3QgYWNwaV9idXNfdHlwZSB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBidXNfdHlwZQkJKmJ1czsKKwkvKiBGb3IgZ2VuZXJhbCBkZXZpY2VzIHVuZGVyIHRoZSBidXMqLworCWludCAoKmZpbmRfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICosIGFjcGlfaGFuZGxlKik7CisJLyogRm9yIGJyaWRnZXMsIHN1Y2ggYXMgUENJIHJvb3QgYnJpZGdlLCBJREUgY29udHJvbGxlciAqLworCWludCAoKmZpbmRfYnJpZGdlKShzdHJ1Y3QgZGV2aWNlICosIGFjcGlfaGFuZGxlICopOworfTsKK2ludCByZWdpc3Rlcl9hY3BpX2J1c190eXBlKHN0cnVjdCBhY3BpX2J1c190eXBlICopOworaW50IHVucmVnaXN0ZXJfYWNwaV9idXNfdHlwZShzdHJ1Y3QgYWNwaV9idXNfdHlwZSAqKTsKK3N0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X3BoeXNpY2FsX2RldmljZShhY3BpX2hhbmRsZSk7CisvKiBoZWxwZXIgKi8KK2FjcGlfaGFuZGxlIGFjcGlfZ2V0X2NoaWxkKGFjcGlfaGFuZGxlLCBhY3BpX2ludGVnZXIpOworYWNwaV9oYW5kbGUgYWNwaV9nZXRfcGNpX3Jvb3RicmlkZ2VfaGFuZGxlKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKKyNkZWZpbmUgREVWSUNFX0FDUElfSEFORExFKGRldikgKChhY3BpX2hhbmRsZSkoKGRldiktPmZpcm13YXJlX2RhdGEpKQorCiAjZW5kaWYgLypDT05GSUdfQUNQSV9CVVMqLwogCiAjZW5kaWYgLypfX0FDUElfQlVTX0hfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKaW5kZXggYzYyZTkyZS4uY2FlYWE3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaApAQCAtNjgsNiArNjgsNyBAQAogCiBzdHJ1Y3QgcGNpX2J1czsKIAorYWNwaV9zdGF0dXMgYWNwaV9nZXRfcGNpX2lkIChhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX3BjaV9pZCAqaWQpOwogaW50IGFjcGlfcGNpX2JpbmQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIGludCBhY3BpX3BjaV91bmJpbmQgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIGludCBhY3BpX3BjaV9iaW5kX3Jvb3QgKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgYWNwaV9wY2lfaWQgKmlkLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKQEAgLTEwOCw1ICsxMDksMTAgQEAKIAogaW50IGFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOwogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG90IEtleXMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBpbnQgYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZDsKIAogI2VuZGlmIC8qX19BQ1BJX0RSSVZFUlNfSF9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggODU3YzgwNy4uZWE0ODlmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTc5LDcgKzc5LDYgQEAKIC8qCiAgKiBPU0wgSW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duIHByaW1pdGl2ZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19pbml0aWFsaXplICgKIAl2b2lkKTsKQEAgLTkyLDcgKzkxLDYgQEAKIC8qCiAgKiBBQ1BJIFRhYmxlIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19nZXRfcm9vdF9wb2ludGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLApAQCAtMTEyLDcgKzExMCw2IEBACiAvKgogICogU3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19jcmVhdGVfc2VtYXBob3JlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF91bml0cywKQEAgLTE1Niw3ICsxNTMsNiBAQAogLyoKICAqIE1lbW9yeSBhbGxvY2F0aW9uIGFuZCBtYXBwaW5nCiAgKi8KLQogdm9pZCAqCiBhY3BpX29zX2FsbG9jYXRlICgKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwpAQCAtMTg3LDcgKzE4Myw2IEBACiAvKgogICogSW50ZXJydXB0IGhhbmRsZXJzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfaW5zdGFsbF9pbnRlcnJ1cHRfaGFuZGxlciAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc2ksCkBAIC0yMDMsNyArMTk4LDYgQEAKIC8qCiAgKiBUaHJlYWRzIGFuZCBTY2hlZHVsaW5nCiAgKi8KLQogdTMyCiBhY3BpX29zX2dldF90aHJlYWRfaWQgKAogCXZvaWQpOwpAQCAtMjM0LDcgKzIyOCw2IEBACiAvKgogICogUGxhdGZvcm0gYW5kIGhhcmR3YXJlLWluZGVwZW5kZW50IEkvTyBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfcmVhZF9wb3J0ICgKIAlhY3BpX2lvX2FkZHJlc3MgICAgICAgICAgICAgICAgIGFkZHJlc3MsCkBAIC0yNTEsNyArMjQ0LDYgQEAKIC8qCiAgKiBQbGF0Zm9ybSBhbmQgaGFyZHdhcmUtaW5kZXBlbmRlbnQgcGh5c2ljYWwgbWVtb3J5IGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9vc19yZWFkX21lbW9yeSAoCiAJYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgICAgICAgICBhZGRyZXNzLApAQCAtMjcwLDcgKzI2Miw2IEBACiAgKiBOb3RlOiBDYW4ndCB1c2UgIlJlZ2lzdGVyIiBhcyBhIHBhcmFtZXRlciwgY2hhbmdlZCB0byAiUmVnIiAtLQogICogY2VydGFpbiBjb21waWxlcnMgY29tcGxhaW4uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfb3NfcmVhZF9wY2lfY29uZmlndXJhdGlvbiAoCiAJc3RydWN0IGFjcGlfcGNpX2lkICAgICAgICAgICAgICAqcGNpX2lkLApAQCAtMjg4LDcgKzI3OSw2IEBACiAvKgogICogSW50ZXJpbSBmdW5jdGlvbiBuZWVkZWQgZm9yIFBDSSBJUlEgcm91dGluZwogICovCi0KIHZvaWQKIGFjcGlfb3NfZGVyaXZlX3BjaV9pZCgKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIHJoYW5kbGUsCkBAIC0yOTgsNyArMjg4LDYgQEAKIC8qCiAgKiBNaXNjZWxsYW5lb3VzCiAgKi8KLQogdTgKIGFjcGlfb3NfcmVhZGFibGUgKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvaW50ZXIsCkBAIC0zMjMsNyArMzEyLDYgQEAKIC8qCiAgKiBEZWJ1ZyBwcmludCByb3V0aW5lcwogICovCi0KIHZvaWQgQUNQSV9JTlRFUk5BTF9WQVJfWEZBQ0UKIGFjcGlfb3NfcHJpbnRmICgKIAljb25zdCBjaGFyICAgICAgICAgICAgICAgICAgICAgICpmb3JtYXQsCkBAIC0zMzksMTEgKzMyNywxMCBAQAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RpbmF0aW9uKTsKIAogCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qCiAgKiBEZWJ1ZyBpbnB1dAogICovCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogdTMyCiBhY3BpX29zX2dldF9saW5lICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIpOwpAQCAtMzUzLDcgKzM0MCw2IEBACiAvKgogICogRGlyZWN0b3J5IG1hbmlwdWxhdGlvbgogICovCi0KIHZvaWQgKgogYWNwaV9vc19vcGVuX2RpcmVjdG9yeSAoCiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGF0aG5hbWUsCkBAIC0zNzcsNyArMzYzLDYgQEAKIC8qCiAgKiBEZWJ1ZwogICovCi0KIHZvaWQKIGFjcGlfb3NfZGJnX2Fzc2VydCgKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmYWlsZWRfYXNzZXJ0aW9uLApAQCAtMzg1LDUgKzM3MCw0IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bWJlciwKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptZXNzYWdlKTsKIAotCiAjZW5kaWYgLyogX19BQ1BJT1NYRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAppbmRleCAwMGQ3OGI3Li5mOGY2MTlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCkBAIC01MCwxMCArNTAsOSBAQAogI2luY2x1ZGUgImFjdGJsLmgiCiAKIAotIC8qCisvKgogICogR2xvYmFsIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSAoCiAJdm9pZCk7CkBAIC0xMDYsOSArMTA1LDggQEAKICNlbmRpZgogCiAvKgotICogQUNQSSBNZW1vcnkgbWFuYWdlcgorICogQUNQSSBNZW1vcnkgbWFuYWdtZW50CiAgKi8KLQogdm9pZCAqCiBhY3BpX2FsbG9jYXRlICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwpAQCAtMTI1LDcgKzEyMyw2IEBACiAvKgogICogQUNQSSB0YWJsZSBtYW5pcHVsYXRpb24gaW50ZXJmYWNlcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2ZpbmRfcm9vdF9wb2ludGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLApAQCAtMTY4LDcgKzE2NSw2IEBACiAvKgogICogTmFtZXNwYWNlIGFuZCBuYW1lIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV93YWxrX25hbWVzcGFjZSAoCiAJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlLApAQCAtMjE4LDcgKzIxNCw2IEBACiAvKgogICogT2JqZWN0IG1hbmlwdWxhdGlvbiBhbmQgZW51bWVyYXRpb24KICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9ldmFsdWF0ZV9vYmplY3QgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LApAQCAtMjYyLDcgKzI1Nyw2IEBACiAvKgogICogRXZlbnQgaGFuZGxlciBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyICgKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZXZlbnQsCkBAIC0zMTksNyArMzEzLDYgQEAKIC8qCiAgKiBFdmVudCBpbnRlcmZhY2VzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfYWNxdWlyZV9nbG9iYWxfbG9jayAoCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LApAQCAtNDA0LDcgKzM5Nyw2IEBACiAvKgogICogUmVzb3VyY2UgaW50ZXJmYWNlcwogICovCi0KIHR5cGVkZWYKIGFjcGlfc3RhdHVzICgqQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLKSAoCiAJc3RydWN0IGFjcGlfcmVzb3VyY2UgICAgICAgICAgICAqcmVzb3VyY2UsCkBAIC00NDgsNyArNDQwLDYgQEAKIC8qCiAgKiBIYXJkd2FyZSAoQUNQSSBkZXZpY2UpIGludGVyZmFjZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfcmVnaXN0ZXIgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfaWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oIGIvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaAppbmRleCA5M2M1NWZmLi5lZDY3OTI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKQEAgLTQ4LDcgKzQ4LDYgQEAKIC8qCiAgKiAgRnVuY3Rpb24gcHJvdG90eXBlcyBjYWxsZWQgZnJvbSBBY3BpKiBBUElzCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YSAoCiAJYWNwaV9oYW5kbGUgICAgICAgICAgICAgICAgICAgICBoYW5kbGUsCkBAIC02MCwxMiArNTksMTIgQEAKIAlhY3BpX2hhbmRsZSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEgKAogCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLAogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKnJldF9idWZmZXIpOwotI2VuZGlmCisjZW5kaWYJLyogQUNQSV9GVVRVUkVfVVNBR0UgKi8KIAogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhICgKQEAgLTk1LDYxICs5NCw5IEBACiAKIAogLyoKLSAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgY2FsbGVkIGZyb20gYWNwaV9yc19jcmVhdGUqCisgKiByc2R1bXAKICAqLwotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi12b2lkCi1hY3BpX3JzX2R1bXBfaXJxICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2FkZHJlc3MxNiAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9hZGRyZXNzMzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfYWRkcmVzczY0ICgKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2RhdGEgICAgICAgICpkYXRhKTsKLQotdm9pZAotYWNwaV9yc19kdW1wX2RtYSAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9pbyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF9leHRlbmRlZF9pcnEgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfaW8gKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfbWVtb3J5MjQgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfbWVtb3J5MzIgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCi12b2lkCi1hY3BpX3JzX2R1bXBfc3RhcnRfZGVwZW5kX2ZucyAoCi0JdW5pb24gYWNwaV9yZXNvdXJjZV9kYXRhICAgICAgICAqZGF0YSk7Ci0KLXZvaWQKLWFjcGlfcnNfZHVtcF92ZW5kb3Jfc3BlY2lmaWMgKAotCXVuaW9uIGFjcGlfcmVzb3VyY2VfZGF0YSAgICAgICAgKmRhdGEpOwotCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIHZvaWQKIGFjcGlfcnNfZHVtcF9yZXNvdXJjZV9saXN0ICgKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAgICAgICAgICAgICpyZXNvdXJjZSk7CkBAIC0xNTcsOCArMTA0LDEyIEBACiB2b2lkCiBhY3BpX3JzX2R1bXBfaXJxX2xpc3QgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJvdXRlX3RhYmxlKTsKLSNlbmRpZiAgLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLworI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKKworLyoKKyAqIHJzY2FsYworICovCiBhY3BpX3N0YXR1cwogYWNwaV9yc19nZXRfYnl0ZV9zdHJlYW1fc3RhcnQgKAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ5dGVfc3RyZWFtX2J1ZmZlciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKaW5kZXggYzk3ODQzZi4uZTZiOWUzNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjc3RydWN0LmgKQEAgLTU2LDcgKzU2LDYgQEAKICAqIFdhbGsgc3RhdGUgLSBjdXJyZW50IHN0YXRlIG9mIGEgcGFyc2UgdHJlZSB3YWxrLiAgVXNlZCBmb3IgYm90aCBhIGxlaXN1cmVseSBzdHJvbGwgdGhyb3VnaAogICogdGhlIHRyZWUgKGZvciB3aGF0ZXZlciByZWFzb24pLCBhbmQgZm9yIGNvbnRyb2wgbWV0aG9kIGV4ZWN1dGlvbi4KICAqLwotCiAjZGVmaW5lIEFDUElfTkVYVF9PUF9ET1dOV0FSRCAgICAgICAxCiAjZGVmaW5lIEFDUElfTkVYVF9PUF9VUFdBUkQgICAgICAgICAyCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RhYmxlcy5oIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKaW5kZXggZThmNWQ0Zi4uMzlkZjkyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmgKQEAgLTUwLDE3ICs1MCw5IEBACiAjZGVmaW5lIFNJWkVfSU5fSEVBREVSICAgICAgICAgIDAKIAogCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2hhbmRsZV90b19vYmplY3QgKAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVfaWQsCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqKnRhYmxlX2Rlc2MpOwotI2VuZGlmCi0KIC8qCiAgKiB0YmNvbnZydCAtIFRhYmxlIGNvbnZlcnNpb24gcm91dGluZXMKICAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9jb252ZXJ0X3RvX3hzZHQgKAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwpAQCAtNzgsMTAgKzcwLDEwIEBACiAJc3RydWN0IHJzZHBfZGVzY3JpcHRvciAgICAgICAgICAqUlNEUCwKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICpSU0RUKTsKIAorCiAvKgogICogdGJnZXQgLSBUYWJsZSAiZ2V0IiByb3V0aW5lcwogICovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF90YWJsZSAoCiAJc3RydWN0IGFjcGlfcG9pbnRlciAgICAgICAgICAgICAqYWRkcmVzcywKQEAgLTk5LDE3ICs5MSw2IEBACiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90aGlzX3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdGFibGVfb3ZlcnJpZGUgKAotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAgICAgICAgKmhlYWRlciwKLQlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICAgICAgICAgICp0YWJsZV9pbmZvKTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3RhYmxlX3B0ciAoCiAJYWNwaV90YWJsZV90eXBlICAgICAgICAgICAgICAgICB0YWJsZV90eXBlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsCkBAIC0xMjcsMzYgKzEwOCwyMyBAQAogYWNwaV90Yl92YWxpZGF0ZV9yc2R0ICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9wdHIpOwogCisKKy8qCisgKiB0YmdldGFsbCAtIGdldCBtdWx0aXBsZSByZXF1aXJlZCB0YWJsZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfdGJfZ2V0X3JlcXVpcmVkX3RhYmxlcyAoCiAJdm9pZCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF9wcmltYXJ5X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwotCi1hY3BpX3N0YXR1cwotYWNwaV90Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlICgKLQlzdHJ1Y3QgYWNwaV9wb2ludGVyICAgICAgICAgICAgICphZGRyZXNzLAotCWFjcGlfc3RyaW5nICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8pOwogCiAvKgogICogdGJpbnN0YWxsIC0gVGFibGUgaW5zdGFsbGF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfdGJfaW5zdGFsbF90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbyk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3RiX21hdGNoX3NpZ25hdHVyZSAoCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2lnbmF0dXJlLAotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgICAgICAgICAgKnRhYmxlX2luZm8sCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfdHlwZSk7Ci0KLWFjcGlfc3RhdHVzCiBhY3BpX3RiX3JlY29nbml6ZV90YWJsZSAoCiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaF90eXBlKTsKQEAgLTE3MCw3ICsxMzgsNiBAQAogLyoKICAqIHRicmVtb3ZlIC0gVGFibGUgcmVtb3ZhbCBhbmQgZGVsZXRpb24KICAqLwotCiB2b2lkCiBhY3BpX3RiX2RlbGV0ZV9hbGxfdGFibGVzICgKIAl2b2lkKTsKQEAgLTE4OSwyOCArMTU2LDggQEAKIAogCiAvKgotICogdGJyc2QgLSBSU0RQLCBSU0RUIHV0aWxpdGllcworICogdGJ4ZnJvb3QgLSBSU0RQLCBSU0RUIHV0aWxpdGllcwogICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2dldF90YWJsZV9yc2R0ICgKLQl2b2lkKTsKLQotdTggKgotYWNwaV90Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhcnRfYWRkcmVzcywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3RiX2ZpbmRfcnNkcCAoCi0Jc3RydWN0IGFjcGlfdGFibGVfZGVzYyAgICAgICAgICAqdGFibGVfaW5mbywKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQotCi0vKgotICogdGJ1dGlscyAtIGNvbW1vbiB0YWJsZSB1dGlsaXRpZXMKLSAqLwotCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9maW5kX3RhYmxlICgKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzaWduYXR1cmUsCkBAIC0yMTksNiArMTY2LDE0IEBACiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICAgICAgICAqKnRhYmxlX3B0cik7CiAKIGFjcGlfc3RhdHVzCithY3BpX3RiX2dldF90YWJsZV9yc2R0ICgKKwl2b2lkKTsKKworCisvKgorICogdGJ1dGlscyAtIGNvbW1vbiB0YWJsZSB1dGlsaXRpZXMKKyAqLworYWNwaV9zdGF0dXMKIGFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpOwogCkBAIC0yMzEsNSArMTg2LDQgQEAKIGFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyICgKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgICAgICAgICp0YWJsZV9oZWFkZXIpOwogCi0KICNlbmRpZiAvKiBfX0FDVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsLmggYi9pbmNsdWRlL2FjcGkvYWN0YmwuaAppbmRleCA3ZWVlNzMxLi5iNWNkY2NhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwuaApAQCAtMTMzLDcgKzEzMyw2IEBACiAjZGVmaW5lIERVQUxfUElDICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgTVVMVElQTEVfQVBJQyAgICAgICAgICAgMQogCi0KIC8qIE1hc3RlciBNQURUICovCiAKIHN0cnVjdCBtdWx0aXBsZV9hcGljX3RhYmxlCkBAIC0xNDQsNyArMTQzLDYgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMSAgICAgICA6IDMxOwogfTsKIAotCiAvKiBWYWx1ZXMgZm9yIFR5cGUgaW4gQVBJQ19IRUFERVJfREVGICovCiAKICNkZWZpbmUgQVBJQ19QUk9DRVNTT1IgICAgICAgICAgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaCBiL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKaW5kZXggN2FjYjU1MC4uM2E0NTFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCkBAIC00NzgsNyArNDc4LDYgQEAKICNkZWZpbmUgQUNQSV9UWVBFX0lOVkFMSUQgICAgICAgICAgICAgICAweDFFCiAjZGVmaW5lIEFDUElfVFlQRV9OT1RfRk9VTkQgICAgICAgICAgICAgMHhGRgogCi0KIC8qCiAgKiBCaXRtYXBwZWQgQUNQSSB0eXBlcy4gIFVzZWQgaW50ZXJuYWxseSBvbmx5CiAgKi8KQEAgLTgwMyw3ICs4MDIsNiBAQAogLyoKICAqIFR5cGVzIHNwZWNpZmljIHRvIHRoZSBPUyBzZXJ2aWNlIGludGVyZmFjZXMKICAqLwotCiB0eXBlZGVmIHUzMgogKEFDUElfU1lTVEVNX1hGQUNFICphY3BpX29zZF9oYW5kbGVyKSAoCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaAppbmRleCAwZGUyNmI4Li4xOTJkMGJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKQEAgLTUyLDEzICs1Miw2IEBACiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCi0JYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCiBzdHJ1Y3QgYWNwaV9wa2dfaW5mbwogewogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyZWVfc3BhY2U7CkBAIC03OSwzNyArNzIsMTMgQEAKICNkZWZpbmUgREJfUVdPUkRfRElTUExBWSAgICA4CiAKIAotLyogR2xvYmFsIGluaXRpYWxpemF0aW9uIGludGVyZmFjZXMgKi8KLQorLyoKKyAqIHV0Z2xvYmFsIC0gR2xvYmFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcHJvY2VkdXJlcworICovCiB2b2lkCiBhY3BpX3V0X2luaXRfZ2xvYmFscyAoCiAJdm9pZCk7CiAKLXZvaWQKLWFjcGlfdXRfdGVybWluYXRlICgKLQl2b2lkKTsKLQotCi0vKgotICogdXRfaW5pdCAtIG1pc2NlbGxhbmVvdXMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duCi0gKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSAoCi0Jdm9pZCk7Ci0KLXZvaWQKLWFjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKLQl2b2lkKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfdmFsaWRhdGVfZmFkdCAoCi0Jdm9pZCk7Ci0KLS8qCi0gKiB1dF9nbG9iYWwgLSBHbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBwcm9jZWR1cmVzCi0gKi8KLQogI2lmIGRlZmluZWQoQUNQSV9ERUJVR19PVVRQVVQpIHx8IGRlZmluZWQoQUNQSV9ERUJVR0dFUikKIAogY2hhciAqCkBAIC0xNTcsOSArMTI2LDI0IEBACiAKIAogLyoKLSAqIHV0X2NsaWIgLSBMb2NhbCBpbXBsZW1lbnRhdGlvbnMgb2YgQyBsaWJyYXJ5IGZ1bmN0aW9ucworICogdXRpbml0IC0gbWlzY2VsbGFuZW91cyBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24KICAqLworYWNwaV9zdGF0dXMKK2FjcGlfdXRfaGFyZHdhcmVfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CiAKK3ZvaWQKK2FjcGlfdXRfc3Vic3lzdGVtX3NodXRkb3duICgKKwl2b2lkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfdmFsaWRhdGVfZmFkdCAoCisJdm9pZCk7CisKKworLyoKKyAqIHV0Y2xpYiAtIExvY2FsIGltcGxlbWVudGF0aW9ucyBvZiBDIGxpYnJhcnkgZnVuY3Rpb25zCisgKi8KICNpZm5kZWYgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCiAKIGFjcGlfc2l6ZQpAQCAtMjYwLDEwICsyNDQsMTAgQEAKIAogI2VuZGlmIC8qIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAqLwogCi0vKgotICogdXRfY29weSAtIE9iamVjdCBjb25zdHJ1Y3Rpb24gYW5kIGNvbnZlcnNpb24gaW50ZXJmYWNlcwotICovCiAKKy8qCisgKiB1dGNvcHkgLSBPYmplY3QgY29uc3RydWN0aW9uIGFuZCBjb252ZXJzaW9uIGludGVyZmFjZXMKKyAqLwogYWNwaV9zdGF0dXMKIGFjcGlfdXRfYnVpbGRfc2ltcGxlX29iamVjdCgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCkBAIC0yNzgsMzAgKzI2MiwxMSBAQAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNwYWNlX3VzZWQpOwogCiBhY3BpX3N0YXR1cwotYWNwaV91dF9jb3B5X2llbGVtZW50X3RvX2VlbGVtZW50ICgKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF90eXBlLAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnNvdXJjZV9vYmplY3QsCi0JdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICAgICAgICAqc3RhdGUsCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29udGV4dCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQgKAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3R5cGUsCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iamVjdCwKLQl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICpzdGF0ZSwKLQl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb250ZXh0KTsKLQotYWNwaV9zdGF0dXMKIGFjcGlfdXRfY29weV9pb2JqZWN0X3RvX2VvYmplY3QgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iaiwKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgICAgICAgICAgICAgICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUoCi0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqdXNlcl9vYmosCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKnJldHVybl9vYmopOwotCi1hY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCAoCiAJdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICAqb2JqLAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKippbnRlcm5hbF9vYmopOwpAQCAtMzEyLDE3ICsyNzcsNiBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKmRlc3Rfb2JqKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9pcGFja2FnZV90b19pcGFja2FnZSAoCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX29iaiwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X29iaiwKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfdXRfY29weV9zaW1wbGVfb2JqZWN0ICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2VfZGVzYywKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpkZXN0X2Rlc2MpOwotCi1hY3BpX3N0YXR1cwogYWNwaV91dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqc291cmNlX2Rlc2MsCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqKmRlc3RfZGVzYywKQEAgLTMzMCw5ICsyODQsOCBAQAogCiAKIC8qCi0gKiB1dF9jcmVhdGUgLSBPYmplY3QgY3JlYXRpb24KKyAqIHV0Y3JlYXRlIC0gT2JqZWN0IGNyZWF0aW9uCiAgKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UgKAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCwKQEAgLTM0MCw5ICsyOTMsOCBAQAogCiAKIC8qCi0gKiB1dF9kZWJ1ZyAtIERlYnVnIGludGVyZmFjZXMKKyAqIHV0ZGVidWcgLSBEZWJ1ZyBpbnRlcmZhY2VzCiAgKi8KLQogdm9pZAogYWNwaV91dF9pbml0X3N0YWNrX3B0cl90cmFjZSAoCiAJdm9pZCk7CkBAIC00NDAsMTEgKzM5MiwxNCBAQAogCiAKIC8qCi0gKiB1dF9kZWxldGUgLSBPYmplY3QgZGVsZXRpb24KKyAqIHV0ZGVsZXRlIC0gT2JqZWN0IGRlbGV0aW9uIGFuZCByZWZlcmVuY2UgY291bnRzCiAgKi8KK3ZvaWQKK2FjcGlfdXRfYWRkX3JlZmVyZW5jZSAoCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKIAogdm9pZAotYWNwaV91dF9kZWxldGVfaW50ZXJuYWxfb2JqICgKK2FjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZSAoCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqb2JqZWN0KTsKIAogdm9pZApAQCAtNDYxLDI1ICs0MTYsOCBAQAogCiAKIC8qCi0gKiB1dF9ldmFsIC0gb2JqZWN0IGV2YWx1YXRpb24KKyAqIHV0ZXZhbCAtIG9iamVjdCBldmFsdWF0aW9uCiAgKi8KLQotLyogTWV0aG9kIG5hbWUgc3RyaW5ncyAqLwotCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19ISUQgICAgICAgICJfSElEIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fQ0lEICAgICAgICAiX0NJRCIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1VJRCAgICAgICAgIl9VSUQiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19BRFIgICAgICAgICJfQURSIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fU1RBICAgICAgICAiX1NUQSIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1JFRyAgICAgICAgIl9SRUciCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19TRUcgICAgICAgICJfU0VHIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fQkJOICAgICAgICAiX0JCTiIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1BSVCAgICAgICAgIl9QUlQiCi0jZGVmaW5lIE1FVEhPRF9OQU1FX19DUlMgICAgICAgICJfQ1JTIgotI2RlZmluZSBNRVRIT0RfTkFNRV9fUFJTICAgICAgICAiX1BSUyIKLSNkZWZpbmUgTUVUSE9EX05BTUVfX1BSVyAgICAgICAgIl9QUlciCi0KLQogYWNwaV9zdGF0dXMKIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uICgKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICAgICAgICAgICp3YWxrX3N0YXRlKTsKQEAgLTUyMiwzOSArNDYwLDEwIEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqZGV2aWNlX25vZGUsCiAJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaGlnaGVzdCk7CiAKLS8qCi0gKiB1dF9tdXRleCAtIG11dHVhbCBleGNsdXNpb24gaW50ZXJmYWNlcwotICovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X211dGV4X2luaXRpYWxpemUgKAotCXZvaWQpOwotCi12b2lkCi1hY3BpX3V0X211dGV4X3Rlcm1pbmF0ZSAoCi0Jdm9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2RlbGV0ZV9tdXRleCAoCi0JYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2FjcXVpcmVfbXV0ZXggKAotCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9yZWxlYXNlX211dGV4ICgKLQlhY3BpX211dGV4X2hhbmRsZSAgICAgICAgICAgICAgIG11dGV4X2lkKTsKLQogCiAvKgotICogdXRfb2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKKyAqIHV0b2JqZWN0IC0gaW50ZXJuYWwgb2JqZWN0IGNyZWF0ZS9kZWxldGUvY2FjaGUgcm91dGluZXMKICAqLwotCiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICoKIGFjcGlfdXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcgKAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZV9uYW1lLApAQCAtNTg3LDUwICs0OTYsMTUgQEAKIGFjcGlfdXRfY3JlYXRlX3N0cmluZ19vYmplY3QgKAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3NpemUpOwogCi0KLS8qCi0gKiB1dF9yZWZfY250IC0gT2JqZWN0IHJlZmVyZW5jZSBjb3VudCBtYW5hZ2VtZW50Ci0gKi8KLQotdm9pZAotYWNwaV91dF9hZGRfcmVmZXJlbmNlICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmplY3QpOwotCi12b2lkCi1hY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UgKAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm9iamVjdCk7Ci0KLS8qCi0gKiB1dF9zaXplIC0gT2JqZWN0IHNpemUgcm91dGluZXMKLSAqLwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9nZXRfc2ltcGxlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9wYWNrYWdlX29iamVjdF9zaXplICgKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCi0JYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7Ci0KIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2dldF9vYmplY3Rfc2l6ZSgKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpvYmosCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICAqb2JqX2xlbmd0aCk7CiAKLWFjcGlfc3RhdHVzCi1hY3BpX3V0X2dldF9lbGVtZW50X2xlbmd0aCAoCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSwKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKnN0YXRlLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOwotCiAKIC8qCi0gKiB1dF9zdGF0ZSAtIEdlbmVyaWMgc3RhdGUgY3JlYXRpb24vY2FjaGUgcm91dGluZXMKKyAqIHV0c3RhdGUgLSBHZW5lcmljIHN0YXRlIGNyZWF0aW9uL2NhY2hlIHJvdXRpbmVzCiAgKi8KLQogdm9pZAogYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUgKAogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipsaXN0X2hlYWQsCkBAIC02NjYsMTQgKzU0MCwxNCBAQAogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAgICAgICAgKipzdGF0ZV9saXN0KTsKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCisjaWZkZWYJQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCiBhY3BpX3V0X2NyZWF0ZV9wa2dfc3RhdGVfYW5kX3B1c2ggKAogCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmludGVybmFsX29iamVjdCwKIAl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlcm5hbF9vYmplY3QsCiAJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgICAgICAgICoqc3RhdGVfbGlzdCk7Ci0jZW5kaWYKKyNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKgogYWNwaV91dF9jcmVhdGVfY29udHJvbF9zdGF0ZSAoCkBAIC02OTMsMTUgKzU2NywxMCBAQAogCXZvaWQpOwogI2VuZGlmCiAKKwogLyoKLSAqIHV0bWlzYworICogdXRtYXRoCiAgKi8KLQotdm9pZAotYWNwaV91dF9wcmludF9zdHJpbmcgKAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOwotCiBhY3BpX3N0YXR1cwogYWNwaV91dF9kaXZpZGUgKAogCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgaW5fZGl2aWRlbmQsCkBAIC03MTYsNiArNTg1LDI1IEBACiAJYWNwaV9pbnRlZ2VyICAgICAgICAgICAgICAgICAgICAqb3V0X3F1b3RpZW50LAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9yZW1haW5kZXIpOwogCisvKgorICogdXRtaXNjCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX3V0X3dhbGtfcGFja2FnZV90cmVlICgKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpzb3VyY2Vfb2JqZWN0LAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRhcmdldF9vYmplY3QsCisJYWNwaV9wa2dfY2FsbGJhY2sgICAgICAgICAgICAgICB3YWxrX2NhbGxiYWNrLAorCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNvbnRleHQpOworCitjaGFyICoKK2FjcGlfdXRfc3RydXByICgKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKKwordm9pZAorYWNwaV91dF9wcmludF9zdHJpbmcgKAorCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cmluZywKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpOworCiB1OAogYWNwaV91dF92YWxpZF9hY3BpX25hbWUgKAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CkBAIC03MzQsMTEgKzYyMiwyMSBAQAogCiAjZGVmaW5lIEFDUElfQU5ZX0JBU0UgICAgICAgIDAKIAotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi1jaGFyICoKLWFjcGlfdXRfc3RydXByICgKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzcmNfc3RyaW5nKTsKLSNlbmRpZgorYWNwaV9zdGF0dXMKK2FjcGlfdXRfbXV0ZXhfaW5pdGlhbGl6ZSAoCisJdm9pZCk7CisKK3ZvaWQKK2FjcGlfdXRfbXV0ZXhfdGVybWluYXRlICgKKwl2b2lkKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfdXRfYWNxdWlyZV9tdXRleCAoCisJYWNwaV9tdXRleF9oYW5kbGUgICAgICAgICAgICAgICBtdXRleF9pZCk7CisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3JlbGVhc2VfbXV0ZXggKAorCWFjcGlfbXV0ZXhfaGFuZGxlICAgICAgICAgICAgICAgbXV0ZXhfaWQpOwogCiB1OCAqCiBhY3BpX3V0X2dldF9yZXNvdXJjZV9lbmRfdGFnICgKQEAgLTc2OCw5ICs2NjYsOCBAQAogCiAKIC8qCi0gKiBVdGFsbG9jIC0gbWVtb3J5IGFsbG9jYXRpb24gYW5kIG9iamVjdCBjYWNoaW5nCisgKiB1dGFsbG9jIC0gbWVtb3J5IGFsbG9jYXRpb24gYW5kIG9iamVjdCBjYWNoaW5nCiAgKi8KLQogdm9pZCAqCiBhY3BpX3V0X2FjcXVpcmVfZnJvbV9jYWNoZSAoCiAJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkKTsKQEAgLTc5NSw5ICs2OTIsNiBAQAogCXN0cnVjdCBhY3BpX2J1ZmZlciAgICAgICAgICAgICAgKmJ1ZmZlciwKIAlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkX2xlbmd0aCk7CiAKLQotLyogTWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zICovCi0KIHZvaWQgKgogYWNwaV91dF9hbGxvY2F0ZSAoCiAJYWNwaV9zaXplICAgICAgICAgICAgICAgICAgICAgICBzaXplLApAQCAtODEyLDkgKzcwNiw3IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CiAKLQogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0KIHZvaWQgKgogYWNwaV91dF9hbGxvY2F0ZV9hbmRfdHJhY2sgKAogCWFjcGlfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKQEAgLTgzNiwzNCArNzI4LDExIEBACiAJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CiAKLXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqCi1hY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jYXRpb24pOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF90cmFja19hbGxvY2F0aW9uICgKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfaWQsCi0Jc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqYWRkcmVzcywKLQlhY3BpX3NpemUgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LAotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZSwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwotCi1hY3BpX3N0YXR1cwotYWNwaV91dF9yZW1vdmVfYWxsb2NhdGlvbiAoCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2lkLAotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAgICAgKmFkZHJlc3MsCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQsCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlLAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQorI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiB2b2lkCiBhY3BpX3V0X2R1bXBfYWxsb2NhdGlvbl9pbmZvICgKIAl2b2lkKTsKLSNlbmRpZgorI2VuZGlmCS8qIEFDUElfRlVUVVJFX1VTQUdFICovCiAKIHZvaWQKIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyAoCkBAIC04NzEsNSArNzQwLDQgQEAKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICptb2R1bGUpOwogI2VuZGlmCiAKLQogI2VuZGlmIC8qIF9BQ1VUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmggYi9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCmluZGV4IDJlYzUzOGUuLjU1ZTk3ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaApAQCAtMTQ2LDggKzE0Niw3IEBACiAKIC8qIHByZWZpeGVkIG9wY29kZXMgKi8KIAotI2RlZmluZSBBTUxfRVhUT1AgICAgICAgICAgICAgICAgICAgKHUxNikgMHgwMDViCi0KKyNkZWZpbmUgQU1MX0VYVE9QICAgICAgICAgICAgICAgICAgICh1MTYpIDB4MDA1YiAgICAgLyogcHJlZml4IGZvciAyLWJ5dGUgb3Bjb2RlcyAqLwogCiAjZGVmaW5lIEFNTF9NVVRFWF9PUCAgICAgICAgICAgICAgICAodTE2KSAweDViMDEKICNkZWZpbmUgQU1MX0VWRU5UX09QICAgICAgICAgICAgICAgICh1MTYpIDB4NWIwMgpAQCAtMTk0LDcgKzE5Myw2IEBACiAgKiBVc2Ugb25seSAiVW5rbm93biIgQU1MIG9wY29kZXMsIGRvbid0IGF0dGVtcHQgdG8gdXNlCiAgKiBhbnkgdmFsaWQgQUNQSSBBU0NJSSB2YWx1ZXMgKEEtWiwgMC05LCAnLScpCiAgKi8KLQogI2RlZmluZSBBTUxfSU5UX05BTUVQQVRIX09QICAgICAgICAgKHUxNikgMHgwMDJkCiAjZGVmaW5lIEFNTF9JTlRfTkFNRURGSUVMRF9PUCAgICAgICAodTE2KSAweDAwMzAKICNkZWZpbmUgQU1MX0lOVF9SRVNFUlZFREZJRUxEX09QICAgICh1MTYpIDB4MDAzMQpAQCAtMjE0LDcgKzIxMiw2IEBACiAgKiBUaGVyZSBjYW4gYmUgdXAgdG8gMzEgdW5pcXVlIGFyZ3VtZW50IHR5cGVzCiAgKiBaZXJvIGlzIHJlc2VydmVkIGFzIGVuZC1vZi1saXN0IGluZGljYXRvcgogICovCi0KICNkZWZpbmUgQVJHUF9CWVRFREFUQSAgICAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgQVJHUF9CWVRFTElTVCAgICAgICAgICAgICAgIDB4MDIKICNkZWZpbmUgQVJHUF9DSEFSTElTVCAgICAgICAgICAgICAgIDB4MDMKQEAgLTI5NSw3ICsyOTIsNiBAQAogLyoKICAqIG9wY29kZSBncm91cHMgYW5kIHR5cGVzCiAgKi8KLQogI2RlZmluZSBPUEdSUF9OQU1FRCAgICAgICAgICAgICAgICAgMHgwMQogI2RlZmluZSBPUEdSUF9GSUVMRCAgICAgICAgICAgICAgICAgMHgwMgogI2RlZmluZSBPUEdSUF9CWVRFTElTVCAgICAgICAgICAgICAgMHgwNApAQCAtMzgxLDYgKzM3NywxMiBAQAogI2RlZmluZSBBTUxfVFlQRV9VTkRFRklORUQgICAgICAgICAgMHgxOQogI2RlZmluZSBBTUxfVFlQRV9CT0dVUyAgICAgICAgICAgICAgMHgxQQogCisvKiBBTUwgUGFja2FnZSBMZW5ndGggZW5jb2RpbmdzICovCisKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMSAgICAgIDB4NDAKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFMiAgICAgIDB4NDAwMAorI2RlZmluZSBBQ1BJX0FNTF9QQUNLQUdFX1RZUEUzICAgICAgMHg0MDAwMDAKKyNkZWZpbmUgQUNQSV9BTUxfUEFDS0FHRV9UWVBFNCAgICAgIDB4NDAwMDAwMDAKIAogLyoKICAqIE9wY29kZSBjbGFzc2VzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmggYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NzMwZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaApAQCAtMCwwICsxLDI5IEBACisKKy8qIF9QREMgYml0IGRlZmluaXRpb24gZm9yIEludGVsIHByb2Nlc3NvcnMgKi8KKworI2lmbmRlZiBfX1BEQ19JTlRFTF9IX18KKyNkZWZpbmUgX19QRENfSU5URUxfSF9fCisKKyNkZWZpbmUgQUNQSV9QRENfUF9GRkgJCQkoMHgwMDAxKQorI2RlZmluZSBBQ1BJX1BEQ19DX0MxX0hBTFQJCSgweDAwMDIpCisjZGVmaW5lIEFDUElfUERDX1RfRkZICQkJKDB4MDAwNCkKKyNkZWZpbmUgQUNQSV9QRENfU01QX0MxUFQJCSgweDAwMDgpCisjZGVmaW5lIEFDUElfUERDX1NNUF9DMkMzCQkoMHgwMDEwKQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfUF9TV0NPT1JECQkoMHgwMDIwKQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfQ19TV0NPT1JECQkoMHgwMDQwKQorI2RlZmluZSBBQ1BJX1BEQ19TTVBfVF9TV0NPT1JECQkoMHgwMDgwKQorI2RlZmluZSBBQ1BJX1BEQ19DX0MxX0ZGSAkJKDB4MDEwMCkKKworCisjZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUAkoQUNQSV9QRENfU01QX0MxUFQgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQpCisKKyNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QX01TUgkoQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QIHwgXAorCQkJCQkgQUNQSV9QRENfUF9GRkgpCisKKyNkZWZpbmUgQUNQSV9QRENfQ19DQVBBQklMSVRZX1NNUAkoQUNQSV9QRENfU01QX0MyQzMgfCBcCisJCQkJCSBBQ1BJX1BEQ19TTVBfQzFQVCB8IFwKKwkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCkKKworI2VuZGlmIC8qIF9fUERDX0lOVEVMX0hfXyAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCmluZGV4IDU3YmY5MzYuLmFkZjk2OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oCkBAIC0xOTgsNiArMTk4LDcgQEAKICNlbmRpZgogI2VuZGlmIC8qICFERUJVR0dFUl9USFJFQURJTkcgKi8KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogQyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24KQEAgLTIwOSw3ICsyMTAsNiBAQAogICogVXNlIHRoZSBzdGFuZGFyZCBDIGxpYnJhcnkgaGVhZGVycy4KICAqIFdlIHdhbnQgdG8ga2VlcCB0aGVzZSB0byBhIG1pbmltdW0uCiAgKi8KLQogI2lmZGVmIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMKIC8qCiAgKiBVc2UgdGhlIHN0YW5kYXJkIGhlYWRlcnMgZnJvbSB0aGUgc3RhbmRhcmQgbG9jYXRpb25zCkBAIC0yMjQsMTQgKzIyNCw4IEBACiAvKgogICogV2Ugd2lsbCBiZSBsaW5raW5nIHRvIHRoZSBzdGFuZGFyZCBDbGliIGZ1bmN0aW9ucwogICovCi0KICNkZWZpbmUgQUNQSV9TVFJTVFIoczEsczIpICAgICAgc3Ryc3RyKChzMSksIChzMikpCiAjZGVmaW5lIEFDUElfU1RSQ0hSKHMxLGMpICAgICAgIHN0cmNocigoczEpLCAoYykpCi0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotI2RlZmluZSBBQ1BJX1NUUlVQUihzKSAgICAgICAgICAodm9pZCkgYWNwaV91dF9zdHJ1cHIgKChzKSkKLSNlbmRpZgotCiAjZGVmaW5lIEFDUElfU1RSTEVOKHMpICAgICAgICAgIChhY3BpX3NpemUpIHN0cmxlbigocykpCiAjZGVmaW5lIEFDUElfU1RSQ1BZKGQscykgICAgICAgICh2b2lkKSBzdHJjcHkoKGQpLCAocykpCiAjZGVmaW5lIEFDUElfU1RSTkNQWShkLHMsbikgICAgICh2b2lkKSBzdHJuY3B5KChkKSwgKHMpLCAoYWNwaV9zaXplKShuKSkKQEAgLTI1NCwxNCArMjQ4LDE1IEBACiAjZGVmaW5lIEFDUElfSVNfQUxQSEEgICAgICAgICAgIGlzYWxwaGEKICNkZWZpbmUgQUNQSV9JU19BU0NJSSAgICAgICAgICAgaXNhc2NpaQogCisjZWxzZQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogTm90IHVzaW5nIG5hdGl2ZSBDIGxpYnJhcnksIHVzZSBsb2NhbCBpbXBsZW1lbnRhdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZWxzZQogCi0vKgorIC8qCiAgKiBVc2UgbG9jYWwgZGVmaW5pdGlvbnMgb2YgQyBsaWJyYXJ5IG1hY3JvcyBhbmQgZnVuY3Rpb25zCiAgKiBOT1RFOiBUaGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIG1heSBub3QgYmUgYXMgZWZmaWNpZW50CiAgKiBhcyBhbiBpbmxpbmUgb3IgYXNzZW1ibHkgY29kZSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBhCkBAIC0yNzgsMTQgKzI3MywxMiBAQAogLyoKICAqIFN0b3JhZ2UgYWxpZ25tZW50IHByb3BlcnRpZXMKICAqLwotCiAjZGVmaW5lICBfQVVQQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX2ludCkgLSAxKQogI2RlZmluZSAgX0FETkJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV9pbnQpIC0gMSkKIAogLyoKICAqIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgbWFjcm8gZGVmaW5pdGlvbnMKICAqLwotCiAjZGVmaW5lIF9ibmQoWCwgYm5kKSAgICAgICAgICAgICgoKHNpemVvZiAoWCkpICsgKGJuZCkpICYgKH4oYm5kKSkpCiAjZGVmaW5lIHZhX2FyZyhhcCwgVCkgICAgICAgICAgICgqKFQgKikoKChhcCkgKz0gKF9ibmQgKFQsIF9BVVBCTkQpKSkgLSAoX2JuZCAoVCxfQUROQk5EKSkpKQogI2RlZmluZSB2YV9lbmQoYXApICAgICAgICAgICAgICAodm9pZCkgMApAQCAtMjk2LDExICsyODksNiBAQAogCiAjZGVmaW5lIEFDUElfU1RSU1RSKHMxLHMyKSAgICAgIGFjcGlfdXRfc3Ryc3RyICgoczEpLCAoczIpKQogI2RlZmluZSBBQ1BJX1NUUkNIUihzMSxjKSAgICAgICBhY3BpX3V0X3N0cmNociAoKHMxKSwgKGMpKQotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLSNkZWZpbmUgQUNQSV9TVFJVUFIocykgICAgICAgICAgKHZvaWQpIGFjcGlfdXRfc3RydXByICgocykpCi0jZW5kaWYKLQogI2RlZmluZSBBQ1BJX1NUUkxFTihzKSAgICAgICAgICAoYWNwaV9zaXplKSBhY3BpX3V0X3N0cmxlbiAoKHMpKQogI2RlZmluZSBBQ1BJX1NUUkNQWShkLHMpICAgICAgICAodm9pZCkgYWNwaV91dF9zdHJjcHkgKChkKSwgKHMpKQogI2RlZmluZSBBQ1BJX1NUUk5DUFkoZCxzLG4pICAgICAodm9pZCkgYWNwaV91dF9zdHJuY3B5ICgoZCksIChzKSwgKGFjcGlfc2l6ZSkobikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggMmY1MGE1Yi4uNTBjZmVhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtNCw2ICs0LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQlVTWV9NRVRSSUMJMTAKIAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVIJOApAQCAtMTQsNiArMTYsOCBAQAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9NQVhfVEhST1RUTEUJMjUwCS8qIDI1JSAqLwogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9NQVhfRFVUWV9XSURUSAk0CiAKKyNkZWZpbmUgQUNQSV9QRENfUkVWSVNJT05fSUQJCTB4MQorCiAvKiBQb3dlciBNYW5hZ2VtZW50ICovCiAKIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeDsKQEAgLTU5LDYgKzYzLDkgQEAKIAl1MzIJCQlibV9hY3Rpdml0eTsKIAlpbnQJCQljb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggc3RhdGVzW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07CisKKwkvKiB0aGUgX1BEQyBvYmplY3RzIHBhc3NlZCBieSB0aGUgZHJpdmVyLCBpZiBhbnkgKi8KKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqcGRjOwogfTsKIAogLyogUGVyZm9ybWFuY2UgTWFuYWdlbWVudCAqLwpAQCAtODIsOCArODksNiBAQAogCWFjcGlfaW50ZWdlcgkJc3RhdHVzOwkJCS8qIHN1Y2Nlc3MgaW5kaWNhdG9yICovCiB9OwogCi0jZGVmaW5lIEFDUElfUERDX1JFVklTSU9OX0lEICAgICAgICAgICAgICAgICAgIDB4MQotCiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgewogCXVuc2lnbmVkIGludAkJIHN0YXRlOwogCXVuc2lnbmVkIGludAkJIHBsYXRmb3JtX2xpbWl0OwpAQCAtMTc5LDcgKzE4NCwzMiBAQAogZXh0ZXJuIHN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHJvY2Vzc29yc1tOUl9DUFVTXTsKIGV4dGVybiBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZXJyYXRhIGVycmF0YTsKIAoraW50IGFjcGlfcHJvY2Vzc29yX3NldF9wZGMoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKnBkY19pbik7CisKKyNpZmRlZiBBUkNIX0hBU19QT1dFUl9QRENfSU5JVAordm9pZCBhY3BpX3Byb2Nlc3Nvcl9wb3dlcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywKKwkJdW5zaWduZWQgaW50IGNwdSk7Cit2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfYm1fY2hlY2soc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywKKwkJdW5zaWduZWQgaW50IGNwdSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Bvd2VyX2luaXRfcGRjKAorCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcG93ZXIgKnBvdywgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlwb3ctPnBkYyA9IE5VTEw7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdF9ibV9jaGVjaygKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2ZsYWdzICpmbGFncywgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlmbGFncy0+Ym1fY2hlY2sgPSAxOworCXJldHVybjsKK30KKyNlbmRpZgorCiAvKiBpbiBwcm9jZXNzb3JfcGVyZmxpYi5jICovCisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHZvaWQgYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQodm9pZCk7CiB2b2lkIGFjcGlfcHJvY2Vzc29yX3BwY19leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcGNpLmggYi9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaAppbmRleCAwYzdiNTdiLi4yODk1NzY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wY2kuaApAQCAtNTgsNyArNTgsNyBAQAogCiBleHRlcm4gdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK2V4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtMjIzLDYgKzIyMywyNSBAQAogCS8qIE5vdGhpbmcgdG8gZG8uICovCiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGNhY2hlbGluZV9zaXplOworCXU4IGJ5dGU7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmYnl0ZSk7CisJaWYgKGJ5dGUgPT0gMCkKKwkJY2FjaGVsaW5lX3NpemUgPSAxMDI0OworCWVsc2UKKwkJY2FjaGVsaW5lX3NpemUgPSAoaW50KSBieXRlICogNDsKKworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfQk9VTkRBUlk7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IGNhY2hlbGluZV9zaXplOworfQorI2VuZGlmCisKIC8qIFRPRE86IGludGVncmF0ZSB3aXRoIGluY2x1ZGUvYXNtLWdlbmVyaWMvcGNpLmggPyAqLwogc3RhdGljIGlubGluZSBpbnQgcGNpX2dldF9sZWdhY3lfaWRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2hhbm5lbCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3BndGFibGUuaAppbmRleCA0MDhhZWE1Li4yMmI1M2UzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvcGd0YWJsZS5oCkBAIC0xMzMsNiArMTMzLDEyIEBACiAjZGVmaW5lIF9fUzExMQlfUEFHRV9TKDApCiAKIC8qCisgKiBwZ3Byb3Rfbm9uY2FjaGVkKCkgaXMgb25seSBmb3IgaW5maW5pYmFuZCBwY2kgc3VwcG9ydCwgYW5kIGEgcmVhbAorICogaW1wbGVtZW50YXRpb24gZm9yIFJBTSB3b3VsZCBiZSBtb3JlIGNvbXBsaWNhdGVkLgorICovCisjZGVmaW5lIHBncHJvdF9ub25jYWNoZWQocHJvdCkJKHByb3QpCisKKy8qCiAgKiBCQURfUEFHRVRBQkxFIGlzIHVzZWQgd2hlbiB3ZSBuZWVkIGEgYm9ndXMgcGFnZS10YWJsZSwgd2hpbGUKICAqIEJBRF9QQUdFIGlzIHVzZWQgZm9yIGEgYm9ndXMgcGFnZS4KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLWFscGhhL3NlcmlhbC5oCmluZGV4IDdiMmQ5ZWUuLjdlNGIyOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL3NlcmlhbC5oCkBAIC0yMiw1NCArMjIsOSBAQAogI2RlZmluZSBTVERfQ09NNF9GTEFHUyBBU1lOQ19CT09UX0FVVE9DT05GCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBGT1VSUE9SVF9GTEFHUyBBU1lOQ19GT1VSUE9SVAotI2RlZmluZSBBQ0NFTlRfRkxBR1MgMAotI2RlZmluZSBCT0NBX0ZMQUdTIDAKLSNlbmRpZgotCQotI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMJCQlcCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCQlcCiAJLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovCQkJXAogCXsgMCwgQkFTRV9CQVVELCAweDNGOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMCAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkY4LCAzLCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMxICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRTgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzIgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJFOCwgMywgU1REX0NPTTRfRkxBR1MgfSwJLyogdHR5UzMgKi8KLQotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDFBMCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwgCS8qIHR0eVM0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTgsIDksIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQjAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQjgsIDksIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQTAsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQTgsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVM5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQjAsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVMxMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkI4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzMCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzM4LCA0LCBBQ0NFTlRfRkxBR1MgfSwJLyogdHR5UzEzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgwMDAsIDAsIDAgfSwJLyogdHR5UzE0IChzcGFyZSkgKi8JCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgwMDAsIDAsIDAgfSwJLyogdHR5UzE1IChzcGFyZSkgKi8JCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTA4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDExMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTIwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIxICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTM4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjMgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE0MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTUwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNjAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTY4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE3MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzMwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMSAqLwotI2Vsc2UKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKLSNlbmRpZgotCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCVwKLQlTVERfU0VSSUFMX1BPUlRfREVGTlMJCVwKLQlFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9ncGlvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2dwaW8uaAppbmRleCA4NDYzNGFmLi4wM2NiYmUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2dwaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2dwaW8uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4cDIwMDAtZ3Bpby5oCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2dwaW8uaAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCkBAIC0xNiwyNiArMTYsMTggQEAKICAqIFVzZSB0aGlzIGluc3RlYWQgb2YgZGlyZWN0bHkgc2V0dGluZyB0aGUgR1BJTyByZWdpc3RlcnMuCiAgKiBHUElPcyBtYXkgYWxzbyBiZSB1c2VkIGFzIEdQSU9zIChlLmcuIGZvciBlbXVsYXRpbmcgaTJjL3NtYikKICAqLwotI2lmbmRlZiBfQVNNX0FSQ0hfSVhQMjAwMF9HUElPX0hfCi0jZGVmaW5lIF9BU01fQVJDSF9JWFAyMDAwX0dQSU9fSF8KKyNpZm5kZWYgX19BU01fQVJDSF9HUElPX0gKKyNkZWZpbmUgX19BU01fQVJDSF9HUElPX0gKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNkZWZpbmUgR1BJT19PVVQJCQkweDAKLSNkZWZpbmUgR1BJT19JTgkJCQkweDgwCisKKyNkZWZpbmUgR1BJT19JTgkJCQkwCisjZGVmaW5lIEdQSU9fT1VUCQkJMQogCiAjZGVmaW5lIElYUDIwMDBfR1BJT19MT1cJCTAKICNkZWZpbmUgSVhQMjAwMF9HUElPX0hJR0gJCTEKIAotI2RlZmluZSBHUElPX05PX0VER0VTICAgICAgICAgICAJMAotI2RlZmluZSBHUElPX0ZBTExJTkdfRURHRSAgICAgICAJMQotI2RlZmluZSBHUElPX1JJU0lOR19FREdFICAgICAgICAJMgotI2RlZmluZSBHUElPX0JPVEhfRURHRVMgICAgICAgICAJMwotI2RlZmluZSBHUElPX0xFVkVMX0xPVyAgICAgICAgICAJNAotI2RlZmluZSBHUElPX0xFVkVMX0hJR0ggICAgICAgICAJOAotCi1leHRlcm4gdm9pZCBzZXRfR1BJT19JUlFfZWRnZShpbnQgZ3Bpb19uciwgaW50IGVkZ2UpOwotZXh0ZXJuIHZvaWQgc2V0X0dQSU9fSVJRX2xldmVsKGludCBncGlvX25yLCBpbnQgbGV2ZWwpOwotZXh0ZXJuIHZvaWQgZ3Bpb19saW5lX2NvbmZpZyhpbnQgbGluZSwgaW50IHN0eWxlKTsKK2V4dGVybiB2b2lkIGdwaW9fbGluZV9jb25maWcoaW50IGxpbmUsIGludCBkaXJlY3Rpb24pOwogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX2xpbmVfZ2V0KGludCBsaW5lKQogewpAQCAtNDUsMTEgKzM3LDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19saW5lX3NldChpbnQgbGluZSwgaW50IHZhbHVlKQogewogCWlmICh2YWx1ZSA9PSBJWFAyMDAwX0dQSU9fSElHSCkgewotCQlpeHBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QT1NSLCBCSVQobGluZSkpOwotCX0gZWxzZSBpZiAodmFsdWUgPT0gSVhQMjAwMF9HUElPX0xPVykKLQkJaXhwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUE9DUiwgQklUKGxpbmUpKTsKKwkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BPU1IsIDEgPDwgbGluZSk7CisJfSBlbHNlIGlmICh2YWx1ZSA9PSBJWFAyMDAwX0dQSU9fTE9XKSB7CisJCWl4cDIwMDBfcmVnX3dyaXRlKElYUDIwMDBfR1BJT19QT0NSLCAxIDw8IGxpbmUpOworCX0KIH0KIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLSNlbmRpZiAvKiBBU01fQVJDSF9JWFAyMDAwX0dQSU9fSF8gKi8KIAorI2VuZGlmIC8qIEFTTV9BUkNIX0lYUDIwMDBfR1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9pby5oCmluZGV4IDA4MzQ2MjYuLjMyNDFjZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2lvLmgKQEAgLTE3LDE4ICsxNywyMyBAQAogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweGZmZmZmZmZmCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCi0jZGVmaW5lIF9fX2lvKHApCQkoKHZvaWQgX19pb21lbSAqKSgocCkrSVhQMjAwMF9QQ0lfSU9fVklSVF9CQVNFKSkKIAogLyoKLSAqIFRoZSBJWFAyNDAwIGJlZm9yZSByZXZpc2lvbiBCMCBhc3NlcnRzIGJ5dGUgbGFuZXMgZm9yIFBDSSBJL08KKyAqIFRoZSBBPyByZXZpc2lvbnMgb2YgdGhlIElYUDIwMDBzIGFzc2VydCBieXRlIGxhbmVzIGZvciBQQ0kgSS9PCiAgKiB0cmFuc2FjdGlvbnMgdGhlIG90aGVyIHdheSByb3VuZCAoTUVNIHRyYW5zYWN0aW9ucyBkb24ndCBoYXZlIHRoaXMKLSAqIGlzc3VlKSwgc28gd2UgbmVlZCB0byBvdmVycmlkZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zLiAgQjAgYW5kIGxhdGVyCi0gKiBoYXZlIGEgYml0IHRoYXQgY2FuIGJlIHNldCB0byAxIHRvIGdldCB0aGUgJ3Byb3BlcicgYmVoYXZpb3IsIGJ1dAotICogc2luY2UgdGhhdCBpc24ndCBhdmFpbGFibGUgb24gdGhlIEE/IHJldmlzaW9ucyB3ZSBqdXN0IGtlZXAgZG9pbmcKLSAqIHRoaW5ncyBtYW51YWxseS4KKyAqIGlzc3VlKSwgc28gaWYgd2Ugd2FudCB0byBzdXBwb3J0IHRob3NlIG1vZGVscywgd2UgbmVlZCB0byBvdmVycmlkZQorICogdGhlIHN0YW5kYXJkIEkvTyBmdW5jdGlvbnMuCisgKgorICogQjAgYW5kIGxhdGVyIGhhdmUgYSBiaXQgdGhhdCBjYW4gYmUgc2V0IHRvIDEgdG8gZ2V0IHRoZSBwcm9wZXIKKyAqIGJlaGF2aW9yIGZvciBJL08gdHJhbnNhY3Rpb25zLCB3aGljaCB0aGVuIGFsbG93cyB1cyB0byB1c2UgdGhlCisgKiBzdGFuZGFyZCBJL08gZnVuY3Rpb25zLiAgVGhpcyBpcyB3aGF0IHdlIGRvIGlmIHRoZSB1c2VyIGRvZXMgbm90CisgKiBleHBsaWNpdGx5IGFzayBmb3Igc3VwcG9ydCBmb3IgcHJlLUIwLgogICovCi0jZGVmaW5lIGFsaWduYihhZGRyKQkJKHZvaWQgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylhZGRyIF4gMykKLSNkZWZpbmUgYWxpZ253KGFkZHIpCQkodm9pZCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKWFkZHIgXiAyKQorI2lmZGVmIENPTkZJR19JWFAyMDAwX1NVUFBPUlRfQlJPS0VOX1BDSV9JTworI2RlZmluZSBfX19pbyhwKQkJKCh2b2lkIF9faW9tZW0gKikoKHApK0lYUDIwMDBfUENJX0lPX1ZJUlRfQkFTRSkpCisKKyNkZWZpbmUgYWxpZ25iKGFkZHIpCQkodm9pZCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKShhZGRyKSBeIDMpCisjZGVmaW5lIGFsaWdudyhhZGRyKQkJKHZvaWQgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZykoYWRkcikgXiAyKQogCiAjZGVmaW5lIG91dGIodixwKQkJX19yYXdfd3JpdGViKCh2KSxhbGlnbmIoX19faW8ocCkpKQogI2RlZmluZSBvdXR3KHYscCkJCV9fcmF3X3dyaXRldygodiksYWxpZ253KF9fX2lvKHApKSkKQEAgLTQ4LDYgKzUzLDgxIEBACiAjZGVmaW5lIGluc3cocCxkLGwpCQlfX3Jhd19yZWFkc3coYWxpZ253KF9fX2lvKHApKSxkLGwpCiAjZGVmaW5lIGluc2wocCxkLGwpCQlfX3Jhd19yZWFkc2woX19faW8ocCksZCxsKQogCisjZGVmaW5lIF9faXNfaW9fYWRkcmVzcyhwKQkoKCgodW5zaWduZWQgbG9uZykocCkpICYgfihJWFAyMDAwX1BDSV9JT19TSVpFIC0gMSkpID09IElYUDIwMDBfUENJX0lPX1ZJUlRfQkFTRSkKKworI2RlZmluZSBpb3JlYWQ4KHApCQkJCQkJXAorCSh7CQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdjsJCQkJXAorCQkJCQkJCQlcCisJCWlmIChfX2lzX2lvX2FkZHJlc3MocCkpIHsJCQlcCisJCQlfX3YgPSBfX3Jhd19yZWFkYihhbGlnbmIocCkpOwkJXAorCQl9IGVsc2UgewkJCQkJXAorCQkJX192ID0gX19yYXdfcmVhZGIocCk7CQkJXAorCQl9CQkJCQkJXAorCQkJCQkJCQlcCisJCV9fdjsJCQkJCQlcCisJfSkJCQkJCQkJXAorCisjZGVmaW5lIGlvcmVhZDE2KHApCQkJCQkJXAorCSh7CQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdjsJCQkJXAorCQkJCQkJCQlcCisJCWlmIChfX2lzX2lvX2FkZHJlc3MocCkpIHsJCQlcCisJCQlfX3YgPSBfX3Jhd19yZWFkdyhhbGlnbncocCkpOwkJXAorCQl9IGVsc2UgewkJCQkJXAorCQkJX192ID0gbGUxNl90b19jcHUoX19yYXdfcmVhZHcocCkpOwlcCisJCX0JCQkJCQlcCisJCQkJCQkJCVwKKwkJX192OwkJCQkJCVwKKwl9KQorCisjZGVmaW5lIGlvcmVhZDMyKHApCQkJCQkJXAorCSh7CQkJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fdjsJCQkJXAorCQkJCQkJCQlcCisJCWlmIChfX2lzX2lvX2FkZHJlc3MocCkpIHsJCQlcCisJCQlfX3YgPSBfX3Jhd19yZWFkbChwKTsJCQlcCisJCX0gZWxzZSB7CQkJCQlcCisJCQlfX3YgPSBsZTMyX3RvX2NwdShfX3Jhd19yZWFkbChwKSk7CVwKKwkJfQkJCQkJCVwKKwkJCQkJCQkJXAorCQkgX192OwkJCQkJCVwKKwl9KQorCisjZGVmaW5lIGlvd3JpdGU4KHYscCkJCQkJCQlcCisJKHsJCQkJCQkJXAorCQlpZiAoX19pc19pb19hZGRyZXNzKHApKSB7CQkJXAorCQkJX19yYXdfd3JpdGViKCh2KSwgYWxpZ25iKHApKTsJCVwKKwkJfSBlbHNlIHsJCQkJCVwKKwkJCV9fcmF3X3dyaXRlYigodiksIHApOwkJCVwKKwkJfQkJCQkJCVwKKwl9KQorCisjZGVmaW5lIGlvd3JpdGUxNih2LHApCQkJCQkJXAorCSh7CQkJCQkJCVwKKwkJaWYgKF9faXNfaW9fYWRkcmVzcyhwKSkgewkJCVwKKwkJCV9fcmF3X3dyaXRldygodiksIGFsaWdudyhwKSk7CQlcCisJCX0gZWxzZSB7CQkJCQlcCisJCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodiksIHApOwlcCisJCX0JCQkJCQlcCisJfSkKKworI2RlZmluZSBpb3dyaXRlMzIodixwKQkJCQkJCVwKKwkoewkJCQkJCQlcCisJCWlmIChfX2lzX2lvX2FkZHJlc3MocCkpIHsJCQlcCisJCQlfX3Jhd193cml0ZWwoKHYpLCBwKTsJCQlcCisJCX0gZWxzZSB7CQkJCQlcCisJCQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodiksIHApOwlcCisJCX0JCQkJCQlcCisJfSkKKworI2RlZmluZSBpb3BvcnRfbWFwKHBvcnQsIG5yKQlfX19pbyhwb3J0KQorCisjZGVmaW5lIGlvcG9ydF91bm1hcChhZGRyKQorI2Vsc2UKKyNkZWZpbmUgX19pbyhwKQkJCSgodm9pZCBfX2lvbWVtICopKChwKStJWFAyMDAwX1BDSV9JT19WSVJUX0JBU0UpKQorI2VuZGlmCisKIAogI2lmZGVmIENPTkZJR19BUkNIX0lYRFAyWDAxCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peGRwMngwMC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peGRwMngwMC5oCmluZGV4IDNhMzk4ZGYuLjIyOTM4MWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhkcDJ4MDAuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4ZHAyeDAwLmgKQEAgLTIxLDggKzIxLDggQEAKICAqIE9uIGJvYXJkIENQTEQgbWVtb3J5IG1hcAogICovCiAjZGVmaW5lIElYRFAyWDAwX1BIWVNfQ1BMRF9CQVNFCQkweGM3MDAwMDAwCi0jZGVmaW5lIElYRFAyWDAwX1ZJUlRfQ1BMRF9CQVNFCQkweGZhZmZmMDAwCi0jZGVmaW5lIElYRFAyWDAwX0NQTERfU0laRQkJMHgwMDAwMTAwMAorI2RlZmluZSBJWERQMlgwMF9WSVJUX0NQTERfQkFTRQkJMHhmZTAwMDAwMAorI2RlZmluZSBJWERQMlgwMF9DUExEX1NJWkUJCTB4MDAxMDAwMDAKIAogCiAjZGVmaW5lIElYRFAyWDAwX0NQTERfUkVHKHgpICAJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peGRwMngwMS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peGRwMngwMS5oCmluZGV4IGIzYTFiY2QuLmI3NjgwMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhkcDJ4MDEuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4ZHAyeDAxLmgKQEAgLTE4LDggKzE4LDggQEAKICNkZWZpbmUgX19JWERQMlgwMV9IX18KIAogI2RlZmluZQlJWERQMlgwMV9QSFlTX0NQTERfQkFTRQkJMHhjNjAyNDAwMAotI2RlZmluZQlJWERQMlgwMV9WSVJUX0NQTERfQkFTRQkJMHhmYWZmZjAwMAotI2RlZmluZQlJWERQMlgwMV9DUExEX1JFR0lPTl9TSVpFCTB4MDAwMDEwMDAKKyNkZWZpbmUJSVhEUDJYMDFfVklSVF9DUExEX0JBU0UJCTB4ZmUwMDAwMDAKKyNkZWZpbmUJSVhEUDJYMDFfQ1BMRF9SRUdJT05fU0laRQkweDAwMTAwMDAwCiAKICNkZWZpbmUgSVhEUDJYMDFfQ1BMRF9WSVJUX1JFRyhyZWcpICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKikoSVhEUDJYMDFfVklSVF9DUExEX0JBU0UgfCByZWcpCiAjZGVmaW5lIElYRFAyWDAxX0NQTERfUEhZU19SRUcocmVnKSAodm9sYXRpbGUgdTMyKikoSVhEUDJYMDFfUEhZU19DUExEX0JBU0UgfCByZWcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4cDIwMDAtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9peHAyMDAwLXJlZ3MuaAppbmRleCBhMWQ5ZTE4Li43NTYyM2Y4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL2l4cDIwMDAtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvaXhwMjAwMC1yZWdzLmgKQEAgLTE4LDYgKzE4LDIxIEBACiAjaWZuZGVmIF9JWFAyMDAwX1JFR1NfSF8KICNkZWZpbmUgX0lYUDIwMDBfUkVHU19IXwogCisvKgorICogSVhQMjAwMCBsaW51eCBtZW1vcnkgbWFwOgorICoKKyAqIHZpcnQJCXBoeXMJCXNpemUKKyAqIGZiMDAwMDAwCWRiMDAwMDAwCTE2TQkJUENJIENGRzEKKyAqIGZjMDAwMDAwCWRhMDAwMDAwCTE2TQkJUENJIENGRzAKKyAqIGZkMDAwMDAwCWQ4MDAwMDAwCTE2TQkJUENJIEkvTworICogZmVbMC03XTAwMDAwCQkJOE0JCXBlci1wbGF0Zm9ybSBtYXBwaW5ncworICogZmViMDAwMDAJYzgwMDAwMDAJMU0JCU1TRgorICogZmVjMDAwMDAJZGYwMDAwMDAJMU0JCVBDSSBDU1JzCisgKiBmZWQwMDAwMAlkZTAwMDAwMAkxTQkJUENJIENSRUcKKyAqIGZlZTAwMDAwCWQ2MDAwMDAwCTFNCQlJTlRDVEwKKyAqIGZlZjAwMDAwCWMwMDAwMDAwCTFNCQlDQVAKKyAqLworCiAvKiAKICAqIFN0YXRpYyBJL08gcmVnaW9ucy4KICAqCkBAIC03MSw2ICs4NiwxMCBAQAogI2RlZmluZQlJWFAyMDAwX1BDSV9DU1JfVklSVF9CQVNFCTB4ZmVjMDAwMDAKICNkZWZpbmUJSVhQMjAwMF9QQ0lfQ1NSX1NJWkUJCTB4MDAxMDAwMDAKIAorI2RlZmluZSBJWFAyMDAwX01TRl9QSFlTX0JBU0UJCTB4YzgwMDAwMDAKKyNkZWZpbmUgSVhQMjAwMF9NU0ZfVklSVF9CQVNFCQkweGZlYjAwMDAwCisjZGVmaW5lIElYUDIwMDBfTVNGX1NJWkUJCTB4MDAxMDAwMDAKKwogI2RlZmluZSBJWFAyMDAwX1BDSV9JT19QSFlTX0JBU0UJMHhkODAwMDAwMAogI2RlZmluZQlJWFAyMDAwX1BDSV9JT19WSVJUX0JBU0UJMHhmZDAwMDAwMAogI2RlZmluZSBJWFAyMDAwX1BDSV9JT19TSVpFICAgICAJMHgwMTAwMDAwMApAQCAtMjQxLDcgKzI2MCw3IEBACiAjZGVmaW5lIFBDSV9DT05UUk9MX0JFX0RFSQkJKDEgPDwgMjEpCS8qIEJpZyBFbmRpYW4gRGF0YSBFbmFibGUgSW4gICovCiAjZGVmaW5lIFBDSV9DT05UUk9MX0JFX0JFTwkJKDEgPDwgMjApCS8qIEJpZyBFbmRpYW4gQnl0ZSBFbmFibGUgT3V0ICovCiAjZGVmaW5lIFBDSV9DT05UUk9MX0JFX0JFSQkJKDEgPDwgMTkpCS8qIEJpZyBFbmRpYW4gQnl0ZSBFbmFibGUgSW4gICovCi0jZGVmaW5lIFBDSV9DT05UUk9MX1BOUgkJCSgxIDw8IDE3KQkvKiBQQ0kgTm90IFJlc2V0IGJpdCAqLworI2RlZmluZSBQQ0lfQ09OVFJPTF9JRUUJCQkoMSA8PCAxNykJLyogSS9PIGN5Y2xlIEVuZGlhbiBzd2FwIEVuYWJsZSAqLwogCiAjZGVmaW5lIElYUDIwMDBfUENJX1JTVF9SRUwJCSgxIDw8IDIpCiAjZGVmaW5lIENGR19SU1RfRElSCQkJKCpJWFAyMDAwX1BDSV9DT05UUk9MICYgSVhQMjAwMF9QQ0lDTlRMX1BDRikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvcGxhdGZvcm0uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvcGxhdGZvcm0uaAppbmRleCA5MDFiYmE2Li5jMGNhZjNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjAwMC9wbGF0Zm9ybS5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIH0KIAogdm9pZCBpeHAyMDAwX21hcF9pbyh2b2lkKTsKK3ZvaWQgaXhwMjAwMF91YXJ0X2luaXQodm9pZCk7CiB2b2lkIGl4cDIwMDBfaW5pdF9pcnEodm9pZCk7CiB2b2lkIGl4cDIwMDBfaW5pdF90aW1lKHVuc2lnbmVkIGxvbmcpOwogdW5zaWduZWQgbG9uZyBpeHAyMDAwX2dldHRpbWVvZmZzZXQodm9pZCk7CkBAIC0xMzgsMzAgKzEzOSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgKCpiYW5rX3NldHVwKSh1bnNpZ25lZCBsb25nKTsKIH07CiAKLS8qCi0gKiBHUElPIGhlbHBlciBmdW5jdGlvbnMKLSAqLwotI2RlZmluZQlHUElPX0lOCQkwCi0jZGVmaW5lCUdQSU9fT1VUCTEKLQotZXh0ZXJuIHZvaWQgZ3Bpb19saW5lX2NvbmZpZyhpbnQgbGluZSwgaW50IHN0eWxlKTsKLQotc3RhdGljIGlubGluZSBpbnQgZ3Bpb19saW5lX2dldChpbnQgbGluZSkKLXsKLQlyZXR1cm4gKCgoKklYUDIwMDBfR1BJT19QTFIpID4+IGxpbmUpICYgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBncGlvX2xpbmVfc2V0KGludCBsaW5lLCBpbnQgdmFsdWUpCi17Ci0JaWYgKHZhbHVlKSAKLQkJaXhwMjAwMF9yZWdfd3JpdGUoSVhQMjAwMF9HUElPX1BPU1IsICgxIDw8IGxpbmUpKTsKLQllbHNlIAotCQlpeHAyMDAwX3JlZ193cml0ZShJWFAyMDAwX0dQSU9fUE9DUiwgKDEgPDwgbGluZSkpOwotfQotCiBzdHJ1Y3QgaXhwMjAwMF9pMmNfcGlucyB7CiAJdW5zaWduZWQgbG9uZyBzZGFfcGluOwogCXVuc2lnbmVkIGxvbmcgc2NsX3BpbjsKIH07CiAKKwogI2VuZGlmIC8qICAhX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyMDAwL3ZtYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvdm1hbGxvYy5oCmluZGV4IDQ3M2RmZjQuLjI3NTEzNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvdm1hbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIwMDAvdm1hbGxvYy5oCkBAIC0xNyw0ICsxNyw0IEBACiAgKiBUaGUgdm1hbGxvYygpIHJvdXRpbmVzIGxlYXZlcyBhIGhvbGUgb2YgNGtCIGJldHdlZW4gZWFjaCB2bWFsbG9jZWQKICAqIGFyZWEgZm9yIHRoZSBzYW1lIHJlYXNvbi4gOykKICAqLwotI2RlZmluZSBWTUFMTE9DX0VORAkgICAgMHhmYWZmZWZmZgorI2RlZmluZSBWTUFMTE9DX0VORAkgICAgMHhmYjAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2RlYnVnLW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZGVidWctbWFjcm8uUwppbmRleCA0NDk5YWU4Li4yZTIzNjUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZGVidWctbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvZGVidWctbWFjcm8uUwpAQCAtMTUsNiArMTUsNyBAQAogICAgICAgICAgICAgICAgIHRzdCAgICAgXHJ4LCAjMSAgICAgICAgICAgICAgICAgQCBNTVUgZW5hYmxlZD8KICAgICAgICAgICAgICAgICBtb3ZlcSAgIFxyeCwgIzB4YzgwMDAwMDAKICAgICAgICAgICAgICAgICBtb3ZuZSAgIFxyeCwgIzB4ZmYwMDAwMDAKKwkJb3JybmUJXHJ4LCBccngsICMweDAwYjAwMDAwCiAgICAgICAgICAgICAgICAgYWRkICAgICBccngsXHJ4LCMzICAgICAgICAgICAgICBAIFVhcnQgcmVncyBhcmUgYXQgb2ZmIHNldCBvZiAzIGlmCiAJCQkJCQlAIGJ5dGUgd3JpdGVzIHVzZWQgLSBCaWcgRW5kaWFuLgogICAgICAgICAgICAgICAgIC5lbmRtCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHA0eHgvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCmluZGV4IGMyN2I5ZDMuLjc0OTUwMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9pby5oCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTM4Myw2ICszODMsMTgwIEBACiAJCSp2YWRkcisrID0gaW5sKGlvX2FkZHIpOwogfQogCisjZGVmaW5lCV9faXNfaW9fYWRkcmVzcyhwKQkoKCh1bnNpZ25lZCBsb25nKXAgPj0gMHgwKSAmJiBcCisJCQkJCSgodW5zaWduZWQgbG9uZylwIDw9IDB4MDAwMGZmZmYpKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19faXhwNHh4X2lvcmVhZDgodm9pZCBfX2lvbWVtICpwb3J0KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2luYigodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJcmV0dXJuICh1bnNpZ25lZCBpbnQpX19yYXdfcmVhZGIoKHUzMilwb3J0KTsKKyNlbHNlCisJCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWRiKCh1MzIpcG9ydCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3JlYWQ4X3JlcCh1MzIgcG9ydCwgdTggKnZhZGRyLCB1MzIgY291bnQpCit7CisJaWYgKF9faXNfaW9fYWRkcmVzcyhwb3J0KSkKKwkJX19peHA0eHhfaW5zYihwb3J0LCB2YWRkciwgY291bnQpOworCWVsc2UKKyNpZm5kZWYJQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfcmVhZHNiKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworI2Vsc2UKKwkJX19peHA0eHhfcmVhZHNiKHBvcnQsIHZhZGRyLCBjb3VudCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK19faXhwNHh4X2lvcmVhZDE2KHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlyZXR1cm4JKHVuc2lnbmVkIGludClfX2l4cDR4eF9pbncoKHVuc2lnbmVkIGludClwb3J0KTsKKwllbHNlCisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCXJldHVybiBsZTE2X3RvX2NwdShfX3Jhd19yZWFkdygodTMyKXBvcnQpKTsKKyNlbHNlCisJCXJldHVybiAodW5zaWduZWQgaW50KV9faXhwNHh4X3JlYWR3KCh1MzIpcG9ydCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2l4cDR4eF9pb3JlYWQxNl9yZXAodTMyIHBvcnQsIHUxNiAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9pbnN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisJZWxzZQorI2lmbmRlZglDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd19yZWFkc3coKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisjZWxzZQorCQlfX2l4cDR4eF9yZWFkc3cocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorX19peHA0eHhfaW9yZWFkMzIodm9pZCBfX2lvbWVtICpwb3J0KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCXJldHVybgkodW5zaWduZWQgaW50KV9faXhwNHh4X2lubCgodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UgeworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlyZXR1cm4gbGUzMl90b19jcHUoX19yYXdfcmVhZGwoKHUzMilwb3J0KSk7CisjZWxzZQorCQlyZXR1cm4gKHVuc2lnbmVkIGludClfX2l4cDR4eF9yZWFkbCgodTMyKXBvcnQpOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvcmVhZDMyX3JlcCh1MzIgcG9ydCwgdTMyICp2YWRkciwgdTMyIGNvdW50KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X2luc2wocG9ydCwgdmFkZHIsIGNvdW50KTsKKwllbHNlCisjaWZuZGVmCUNPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3JlYWRzbCgodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbHNlCisJCV9faXhwNHh4X3JlYWRzbChwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZTgodTggdmFsdWUsIHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRiKHZhbHVlLCAodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfd3JpdGViKHZhbHVlLCAodTMyKXBvcnQpOworI2Vsc2UKKwkJX19peHA0eHhfd3JpdGViKHZhbHVlLCAodTMyKXBvcnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZThfcmVwKHUzMiBwb3J0LCB1OCAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRzYihwb3J0LCB2YWRkciwgY291bnQpOworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd193cml0ZXNiKCh2b2lkIF9faW9tZW0gKilwb3J0LCB2YWRkciwgY291bnQpOworI2Vsc2UKKwkJX19peHA0eHhfd3JpdGVzYihwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZTE2KHUxNiB2YWx1ZSwgdm9pZCBfX2lvbWVtICpwb3J0KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X291dHcodmFsdWUsICh1bnNpZ25lZCBpbnQpcG9ydCk7CisJZWxzZQorI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYodmFsdWUpLCAodTMyKXBvcnQpOworI2Vsc2UKKwkJX19peHA0eHhfd3JpdGV3KHZhbHVlLCAodTMyKXBvcnQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19peHA0eHhfaW93cml0ZTE2X3JlcCh1MzIgcG9ydCwgdTE2ICp2YWRkciwgdTMyIGNvdW50KQoreworCWlmIChfX2lzX2lvX2FkZHJlc3MocG9ydCkpCisJCV9faXhwNHh4X291dHN3KHBvcnQsIHZhZGRyLCBjb3VudCk7CisjaWZuZGVmIENPTkZJR19JWFA0WFhfSU5ESVJFQ1RfUENJCisJCV9fcmF3X3JlYWRzdygodm9pZCBfX2lvbWVtICopcG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRlc3cocG9ydCwgdmFkZHIsIGNvdW50KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGUzMih1MzIgdmFsdWUsIHZvaWQgX19pb21lbSAqcG9ydCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRsKHZhbHVlLCAodW5zaWduZWQgaW50KXBvcnQpOworCWVsc2UKKyNpZm5kZWYgQ09ORklHX0lYUDRYWF9JTkRJUkVDVF9QQ0kKKwkJX19yYXdfd3JpdGVsKGNwdV90b19sZTMyKHZhbHVlKSwgKHUzMilwb3J0KTsKKyNlbHNlCisJCV9faXhwNHh4X3dyaXRlbCh2YWx1ZSwgKHUzMilwb3J0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19faXhwNHh4X2lvd3JpdGUzMl9yZXAodTMyIHBvcnQsIHUzMiAqdmFkZHIsIHUzMiBjb3VudCkKK3sKKwlpZiAoX19pc19pb19hZGRyZXNzKHBvcnQpKQorCQlfX2l4cDR4eF9vdXRzbChwb3J0LCB2YWRkciwgY291bnQpOworI2lmbmRlZiBDT05GSUdfSVhQNFhYX0lORElSRUNUX1BDSQorCQlfX3Jhd19yZWFkc2woKHZvaWQgX19pb21lbSAqKXBvcnQsIHZhZGRyLCBjb3VudCk7CisjZWxzZQorCQlfX2l4cDR4eF9vdXRzbChwb3J0LCB2YWRkciwgY291bnQpOworI2VuZGlmCit9CisKKyNkZWZpbmUJaW9yZWFkOChwKQkJCV9faXhwNHh4X2lvcmVhZDgocCkKKyNkZWZpbmUJaW9yZWFkMTYocCkJCQlfX2l4cDR4eF9pb3JlYWQxNihwKQorI2RlZmluZQlpb3JlYWQzMihwKQkJCV9faXhwNHh4X2lvcmVhZDMyKHApCisKKyNkZWZpbmUJaW9yZWFkOF9yZXAocCwgdiwgYykJCV9faXhwNHh4X2lvcmVhZDhfcmVwKHAsIHYsIGMpCisjZGVmaW5lCWlvcmVhZDE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW9yZWFkMTZfcmVwKHAsIHYsIGMpCisjZGVmaW5lCWlvcmVhZDMyX3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW9yZWFkMzJfcmVwKHAsIHYsIGMpCisKKyNkZWZpbmUJaW93cml0ZTgodixwKQkJCV9faXhwNHh4X2lvd3JpdGU4KHYscCkKKyNkZWZpbmUJaW93cml0ZTE2KHYscCkJCQlfX2l4cDR4eF9pb3dyaXRlMTYodixwKQorI2RlZmluZQlpb3dyaXRlMzIodixwKQkJCV9faXhwNHh4X2lvd3JpdGUzMih2LHApCisKKyNkZWZpbmUJaW93cml0ZThfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlOF9yZXAocCwgdiwgYykKKyNkZWZpbmUJaW93cml0ZTE2X3JlcChwLCB2LCBjKQkJX19peHA0eHhfaW93cml0ZTE2X3JlcChwLCB2LCBjKQorI2RlZmluZQlpb3dyaXRlMzJfcmVwKHAsIHYsIGMpCQlfX2l4cDR4eF9pb3dyaXRlMzJfcmVwKHAsIHYsIGMpCisKKyNkZWZpbmUJaW9wb3J0X21hcChwb3J0LCBucikJCSgodm9pZCBfX2lvbWVtKilwb3J0KQorI2RlZmluZQlpb3BvcnRfdW5tYXAoYWRkcikKIAogI2VuZGlmCS8vICBfX0FTTV9BUk1fQVJDSF9JT19ICiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDR4eC9peHA0eHgtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2l4cDR4eC1yZWdzLmgKaW5kZXggOGVlYjFkYi4uMDA0Njk2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2l4cDR4eC1yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwNHh4L2l4cDR4eC1yZWdzLmgKQEAgLTY5LDYgKzY5LDE2IEBACiAjZGVmaW5lIElYUDRYWF9QRVJJUEhFUkFMX0JBU0VfVklSVAkoMHhGRkJGMjAwMCkKICNkZWZpbmUgSVhQNFhYX1BFUklQSEVSQUxfUkVHSU9OX1NJWkUJKDB4MDAwMEMwMDApCiAKKy8qCisgKiBEZWJ1ZyBVQVJUCisgKgorICogVGhpcyBpcyBiYXNpY2FsbHkgYSByZW1hcCBvZiBVQVJUMSBpbnRvIGEgcmVnaW9uIHRoYXQgaXMgc2VjdGlvbgorICogYWxpZ25lZCBzbyB0aGF0IGl0ICogY2FuIGJlIHVzZWQgd2l0aCB0aGUgbG93LWxldmVsIGRlYnVnIGNvZGUuCisgKi8KKyNkZWZpbmUJSVhQNFhYX0RFQlVHX1VBUlRfQkFTRV9QSFlTCSgweEM4MDAwMDAwKQorI2RlZmluZQlJWFA0WFhfREVCVUdfVUFSVF9CQVNFX1ZJUlQJKDB4ZmZiMDAwMDApCisjZGVmaW5lCUlYUDRYWF9ERUJVR19VQVJUX1JFR0lPTl9TSVpFCSgweDAwMDAxMDAwKQorCiAjZGVmaW5lIElYUDRYWF9FWFBfQ1MwX09GRlNFVAkweDAwCiAjZGVmaW5lIElYUDRYWF9FWFBfQ1MxX09GRlNFVCAgIDB4MDQKICNkZWZpbmUgSVhQNFhYX0VYUF9DUzJfT0ZGU0VUICAgMHgwOApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMi5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMi5oCmluZGV4IDYwZjAwMmIuLjM5Y2E1YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDIuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgyLmgKQEAgLTM0LDExICszNCw2IEBACiAvKiBBdCBPTUFQMTYxMCBJbm5vdmF0b3IgdGhlIEV0aGVybmV0IGlzIGRpcmVjdGx5IGNvbm5lY3RlZCB0byBDUzEgKi8KICNkZWZpbmUgT01BUDE2MTBfRVRIUl9TVEFSVAkJMHgwNDAwMDMwMAogCi0vKiBJbnRlbCBTVFJBVEEgTk9SIGZsYXNoIGF0IENTMyBvciBDUzJCKE5BTkQgQm9vdCkgKi8KLSNkZWZpbmUgT01BUF9OT1JfRkxBU0hfU0laRSAgICAgICAgICAgICBTWl8zMk0KLSNkZWZpbmUgT01BUF9OT1JfRkxBU0hfU1RBUlQxICAgICAgICAgICAweDBDMDAwMDAwIC8qIENTMyAqLwotI2RlZmluZSBPTUFQX05PUl9GTEFTSF9TVEFSVDIgICAgICAgICAgIDB4MEEwMDAwMDAgLyogQ1MyQiAqLwotCiAvKiBTYW1zdW5nIE5BTkQgZmxhc2ggYXQgQ1MyQiBvciBDUzMoTkFORCBCb290KSAqLwogI2RlZmluZSBPTUFQX05BTkRfRkxBU0hfU1RBUlQxICAgICAgICAgICAweDBBMDAwMDAwIC8qIENTMkIgKi8KICNkZWZpbmUgT01BUF9OQU5EX0ZMQVNIX1NUQVJUMiAgICAgICAgICAgMHgwQzAwMDAwMCAvKiBDUzMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDMuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtaDMuaAppbmRleCBlNGQxY2QyLi4xYjEyYzFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLWgzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1oMy5oCkBAIC0zMCwxMSArMzAsNiBAQAogLyogSW4gT01BUDE3MTAgSDMgdGhlIEV0aGVybmV0IGlzIGRpcmVjdGx5IGNvbm5lY3RlZCB0byBDUzEgKi8KICNkZWZpbmUgT01BUDE3MTBfRVRIUl9TVEFSVAkJMHgwNDAwMDMwMAogCi0vKiBJbnRlbCBTVFJBVEEgTk9SIGZsYXNoIGF0IENTMyBvciBDUzJCKE5BTkQgQm9vdCkgKi8KLSNkZWZpbmUgT01BUF9OT1JfRkxBU0hfU0laRSAgICAgICAgICAgICBTWl8zMk0KLSNkZWZpbmUgT01BUF9OT1JfRkxBU0hfU1RBUlQxIAkJMHgwQzAwMDAwMCAvKiBDUzMgKi8KLSNkZWZpbmUgT01BUF9OT1JfRkxBU0hfU1RBUlQyIAkJMHgwQTAwMDAwMCAvKiBDUzJCICovCi0KIC8qIFNhbXN1bmcgTkFORCBmbGFzaCBhdCBDUzJCIG9yIENTMyhOQU5EIEJvb3QpICovCiAjZGVmaW5lIE9NQVBfTkFORF9GTEFTSF9TVEFSVDEgICAgICAgICAgIDB4MEEwMDAwMDAgLyogQ1MyQiAqLwogI2RlZmluZSBPTUFQX05BTkRfRkxBU0hfU1RBUlQyICAgICAgICAgICAweDBDMDAwMDAwIC8qIENTMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1vc2suaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQtb3NrLmgKaW5kZXggYWFhNDlhMC4uMmIxYThhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC1vc2suaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLW9zay5oCkBAIC0zMiwxMCArMzIsNSBAQAogLyogQXQgT01BUDU5MTIgT1NLIHRoZSBFdGhlcm5ldCBpcyBkaXJlY3RseSBjb25uZWN0ZWQgdG8gQ1MxICovCiAjZGVmaW5lIE9NQVBfT1NLX0VUSFJfU1RBUlQJCTB4MDQ4MDAzMDAKIAotLyogTWljcm9uIE5PUiBmbGFzaCBhdCBDUzMgbWFwcGVkIHRvIGFkZHJlc3MgMHgwIGlmIEJNIGJpdCBpcyAxICovCi0jZGVmaW5lIE9NQVBfT1NLX05PUl9GTEFTSF9CQVNFCQkweEQ4MDAwMDAwCi0jZGVmaW5lIE9NQVBfT1NLX05PUl9GTEFTSF9TSVpFCQlTWl8zMk0KLSNkZWZpbmUgT01BUF9PU0tfTk9SX0ZMQVNIX1NUQVJUCTB4MDAwMDAwMDAKLQogI2VuZGlmIC8qICBfX0FTTV9BUkNIX09NQVBfT1NLX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ib2FyZC5oCmluZGV4IDFjZWZkNjAuLjk1YmQ2MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2JvYXJkLmgKQEAgLTE2LDEwICsxNiwxMSBAQAogLyogRGlmZmVyZW50IHBlcmlwaGVyYWwgaWRzICovCiAjZGVmaW5lIE9NQVBfVEFHX0NMT0NLCQkweDRmMDEKICNkZWZpbmUgT01BUF9UQUdfTU1DCQkweDRmMDIKLSNkZWZpbmUgT01BUF9UQUdfVUFSVAkJMHg0ZjAzCisjZGVmaW5lIE9NQVBfVEFHX1NFUklBTF9DT05TT0xFIDB4NGYwMwogI2RlZmluZSBPTUFQX1RBR19VU0IJCTB4NGYwNAogI2RlZmluZSBPTUFQX1RBR19MQ0QJCTB4NGYwNQogI2RlZmluZSBPTUFQX1RBR19HUElPX1NXSVRDSAkweDRmMDYKKyNkZWZpbmUgT01BUF9UQUdfVUFSVAkJMHg0ZjA3CiAKICNkZWZpbmUgT01BUF9UQUdfQk9PVF9SRUFTT04gICAgMHg0ZjgwCiAjZGVmaW5lIE9NQVBfVEFHX0ZMQVNIX1BBUlQJMHg0ZjgxCkBAIC0zNSw3ICszNiw3IEBACiAJczE2IG1tYzFfc3dpdGNoX3BpbiwgbW1jMl9zd2l0Y2hfcGluOwogfTsKIAotc3RydWN0IG9tYXBfdWFydF9jb25maWcgeworc3RydWN0IG9tYXBfc2VyaWFsX2NvbnNvbGVfY29uZmlnIHsKIAl1OCBjb25zb2xlX3VhcnQ7CiAJdTMyIGNvbnNvbGVfc3BlZWQ7CiB9OwpAQCAtODIsNyArODMsOCBAQAogICovCiAjZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfVFlQRV9DT1ZFUgkJMHgwMDAwCiAjZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfVFlQRV9DT05ORUNUSU9OCTB4MDAwMQotI2RlZmluZSBPTUFQX0dQSU9fU1dJVENIX0ZMQUdfSU5WRVJURUQgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19JTlZFUlRFRAkJMHgwMDAxCisjZGVmaW5lIE9NQVBfR1BJT19TV0lUQ0hfRkxBR19PVVRQVVQJCTB4MDAwMgogc3RydWN0IG9tYXBfZ3Bpb19zd2l0Y2hfY29uZmlnIHsKIAljaGFyIG5hbWVbMTJdOwogCXUxNiBncGlvOwpAQCAtOTksNiArMTAxLDEwIEBACiAJY2hhciByZWFzb25fc3RyWzEyXTsKIH07CiAKK3N0cnVjdCBvbWFwX3VhcnRfY29uZmlnIHsKKwkvKiBCaXQgZmllbGQgb2YgVUFSVHMgcHJlc2VudDsgYml0IDAgLS0+IFVBUlQxICovCisJdW5zaWduZWQgaW50IGVuYWJsZWRfdWFydHM7Cit9OwogCiBzdHJ1Y3Qgb21hcF9ib2FyZF9jb25maWdfZW50cnkgewogCXUxNiB0YWc7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2NvbW1vbi5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTY3NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jb21tb24uaApAQCAtMCwwICsxLDM2IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9jb21tb24uaAorICoKKyAqIEhlYWRlciBmb3IgY29kZSBjb21tb24gdG8gYWxsIE9NQVAgbWFjaGluZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOCisgKiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fTUFDSF9PTUFQX0NPTU1PTl9ICisjZGVmaW5lIF9fQVJDSF9BUk1fTUFDSF9PTUFQX0NPTU1PTl9ICisKK3N0cnVjdCBzeXNfdGltZXI7CisKK2V4dGVybiB2b2lkIG9tYXBfbWFwX2NvbW1vbl9pbyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIG9tYXBfdGltZXI7CitleHRlcm4gdm9pZCBvbWFwX3NlcmlhbF9pbml0KGludCBwb3J0c1tdKTsKKworI2VuZGlmIC8qIF9fQVJDSF9BUk1fTUFDSF9PTUFQX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9kbWEuaAppbmRleCBkNzg1MjQ4Li5jZTExNGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvZG1hLmgKQEAgLTI0MSw2ICsyNDEsNyBAQAogZXh0ZXJuIGRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCk7CiBleHRlcm4gZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKTsKIGV4dGVybiB2b2lkIG9tYXBfY2xlYXJfZG1hKGludCBsY2gpOworZXh0ZXJuIGludCBvbWFwX2RtYV9ydW5uaW5nKHZvaWQpOwogCiAvKiBSZXR1cm5zIDEgaWYgdGhlIERNQSBtb2R1bGUgaXMgaW4gT01BUDE1MTAtY29tcGF0aWJsZSBtb2RlLCAwIG90aGVyd2lzZSAqLwogZXh0ZXJuIGludCBvbWFwX2RtYV9pbl8xNTEwX21vZGUodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2hhcmR3YXJlLmgKaW5kZXggMzdlMDZjNy4uNDgyNThjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9oYXJkd2FyZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaGFyZHdhcmUuaApAQCAtNTQsNiArNTQsMTkgQEAKIAogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRpbWVycworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjZGVmaW5lIE9NQVBfTVBVX1RJTUVSMV9CQVNFCSgweGZmZmVjNTAwKQorI2RlZmluZSBPTUFQX01QVV9USU1FUjJfQkFTRQkoMHhmZmZlYzYwMCkKKyNkZWZpbmUgT01BUF9NUFVfVElNRVIzX0JBU0UJKDB4ZmZmZWM3MDApCisjZGVmaW5lIE1QVV9USU1FUl9GUkVFCQkoMSA8PCA2KQorI2RlZmluZSBNUFVfVElNRVJfQ0xPQ0tfRU5BQkxFCSgxIDw8IDUpCisjZGVmaW5lIE1QVV9USU1FUl9BUgkJKDEgPDwgMSkKKyNkZWZpbmUgTVBVX1RJTUVSX1NUCQkoMSA8PCAwKQorCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KQEAgLTc4LDYgKzkxLDcgQEAKIAogLyogRFNQIGNsb2NrIGNvbnRyb2wgKi8KICNkZWZpbmUgRFNQX0NPTkZJR19SRUdfQkFTRSAgICAgKDB4ZTEwMDgwMDApCisjZGVmaW5lIERTUF9DS0NUTAkJKERTUF9DT05GSUdfUkVHX0JBU0UgKyAweDApCiAjZGVmaW5lIERTUF9JRExFQ1QxCQkoRFNQX0NPTkZJR19SRUdfQkFTRSArIDB4NCkKICNkZWZpbmUgRFNQX0lETEVDVDIJCShEU1BfQ09ORklHX1JFR19CQVNFICsgMHg4KQogCkBAIC04OCw2ICsxMDIsNyBAQAogICovCiAjZGVmaW5lIFVMUERfUkVHX0JBU0UJCSgweGZmZmUwODAwKQogI2RlZmluZSBVTFBEX0lUX1NUQVRVUwkJKFVMUERfUkVHX0JBU0UgKyAweDE0KQorI2RlZmluZSBVTFBEX1NFVFVQX0FOQUxPR19DRUxMXzMJKFVMUERfUkVHX0JBU0UgKyAweDI0KQogI2RlZmluZSBVTFBEX0NMT0NLX0NUUkwJCShVTFBEX1JFR19CQVNFICsgMHgzMCkKICMJZGVmaW5lIERJU19VU0JfUFZDSV9DTEsJCSgxIDw8IDUpCS8qIG5vIFVTQi9GQUMgc3luY2ggKi8KICMJZGVmaW5lIFVTQl9NQ0xLX0VOCQkoMSA8PCA0KQkvKiBlbmFibGUgVzRfVVNCX0NMS08gKi8KQEAgLTI2OCwxNyArMjgzLDEwIEBACiAgKiBQcm9jZXNzb3Igc3BlY2lmaWMgZGVmaW5lcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KLSNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCisKICNpbmNsdWRlICJvbWFwNzMwLmgiCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCiAjaW5jbHVkZSAib21hcDE1MTAuaCIKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE2WFgKICNpbmNsdWRlICJvbWFwMTZ4eC5oIgotI2VuZGlmCiAKIC8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaXJxcy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmgKaW5kZXggNjcwMWZkOS4uMGQwNWE3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pcnFzLmgKQEAgLTE1OSw2ICsxNTksNyBAQAogI2RlZmluZSBJTlRfMTYxMF9HUElPX0JBTkszCSg0MSArIElIMl9CQVNFKQogI2RlZmluZSBJTlRfMTYxMF9NTUMyCQkoNDIgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfQ0YJCSg0MyArIElIMl9CQVNFKQorI2RlZmluZSBJTlRfMTYxMF9XQUtFX1VQX1JFUQkoNDYgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfR1BJT19CQU5LNAkoNDggKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfU1BJCQkoNDkgKyBJSDJfQkFTRSkKICNkZWZpbmUgSU5UXzE2MTBfRE1BX0NINgkoNTMgKyBJSDJfQkFTRSkKQEAgLTIzOCw2ICsyMzksOCBAQAogI2RlZmluZSBJSF9NUFVJT19CQVNFCQkoT01BUF9NQVhfR1BJT19MSU5FUyArIElIX0dQSU9fQkFTRSkKICNkZWZpbmUgSUhfQk9BUkRfQkFTRQkJKDE2ICsgSUhfTVBVSU9fQkFTRSkKIAorI2RlZmluZSBPTUFQX0lSUV9CSVQoaXJxKQkoMSA8PCAoKGlycSkgJSAzMikpCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiBleHRlcm4gdm9pZCBvbWFwX2luaXRfaXJxKHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9tdXguaAppbmRleCAzOWY5OWRlLi41YmQzZjAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL211eC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvbXV4LmgKQEAgLTIzMSw3ICsyMzEsNyBAQAogCUoxOV8xNjEwX0VUTV9ENiwKIAlKMThfMTYxMF9FVE1fRDcsCiAKLQkvKiBPTUFQLTE2MTAgR1BJTyAqLworCS8qIE9NQVAxNlhYIEdQSU8gKi8KIAlQMjBfMTYxMF9HUElPNCwKIAlWOV8xNjEwX0dQSU83LAogCVc4XzE2MTBfR1BJTzksCkBAIC0yNDEsNiArMjQxLDkgQEAKIAlBQTIwXzE2MTBfR1BJT180MSwKIAlXMTlfMTYxMF9HUElPNDgsCiAJTTdfMTYxMF9HUElPNjIsCisJVjE0XzE2WFhfR1BJTzM3LAorCVI5XzE2WFhfR1BJTzE4LAorCUwxNF8xNlhYX0dQSU80OSwKIAogCS8qIE9NQVAtMTYxMCB1V2lyZSAqLwogCVYxOV8xNjEwX1VXSVJFX1NDTEssCkBAIC0yODUsMTIgKzI4OCwxMyBAQAogCVY2X1VTQjJfVFhELAogCVc1X1VTQjJfU0UwLAogCi0JLyogVUFSVDEgMTYxMCAqLwotCisJLyogMTZYWCBVQVJUICovCiAJUjEzXzE2MTBfVUFSVDFfVFgsCi0JVjE0XzE2MTBfVUFSVDFfUlgsCisJVjE0XzE2WFhfVUFSVDFfUlgsCiAJUjE0XzE2MTBfVUFSVDFfQ1RTLAogCUFBMTVfMTYxMF9VQVJUMV9SVFMsCisJUjlfMTZYWF9VQVJUMl9SWCwKKwlMMTRfMTZYWF9VQVJUM19SWCwKIAogCS8qIEkyQyBPTUFQLTE2MTAgKi8KIAlJMkNfU0NMLApAQCAtMzMyLDcgKzMzNiw3IEBACiAgKiBUYWJsZSBvZiB2YXJpb3VzIEZVTkNfTVVYIGFuZCBQVUxMX0RXTiBjb21iaW5hdGlvbnMgZm9yIGVhY2ggZGV2aWNlLgogICogU2VlIGFsc28gcmVnX2NmZ190IGFib3ZlIGZvciB0aGUgbG9va3VwIHRhYmxlLgogICovCi1zdGF0aWMgcmVnX2NmZ19zZXQgX19pbml0ZGF0YV9vcl9tb2R1bGUKK3N0YXRpYyBjb25zdCByZWdfY2ZnX3NldCBfX2luaXRkYXRhX29yX21vZHVsZQogcmVnX2NmZ190YWJsZVtdID0gewogLyoKICAqCSBkZXNjcmlwdGlvbgkJbXV4ICBtb2RlICAgbXV4CSBwdWxsIHB1bGwgIHB1bGwgIHB1X3BkCSBwdSAgZGJnCkBAIC00NTUsNyArNDU5LDcgQEAKIE1VWF9DRkcoIkoxOV8xNjEwX0VUTV9ENiIsCSA1LCAgICAwLCAgICAxLAkgIDAsICAyMCwgICAwLAkgIDAsCSAwLCAgMSkKIE1VWF9DRkcoIkoxOF8xNjEwX0VUTV9ENyIsCSA1LCAgIDI3LCAgICAxLAkgIDAsICAxOSwgICAwLAkgIDAsCSAwLCAgMSkKIAotLyogT01BUC0xNjEwIEdQSU8gKi8KKy8qIE9NQVAxNlhYIEdQSU8gKi8KIE1VWF9DRkcoIlAyMF8xNjEwX0dQSU80IiwJIDYsICAgMjcsICAgIDAsCSAgMSwgICA3LCAgIDAsCSAgMSwJIDEsICAxKQogTVVYX0NGRygiVjlfMTYxMF9HUElPNyIsCSBCLCAgIDEyLCAgICAxLAkgIDIsICAyMCwgICAwLAkgIDIsCSAxLCAgMSkKIE1VWF9DRkcoIlc4XzE2MTBfR1BJTzkiLAkgQiwgICAyMSwgICAgMCwJICAyLCAgMjMsICAgMCwJICAyLAkgMSwgIDEpCkBAIC00NjUsNiArNDY5LDkgQEAKIE1VWF9DRkcoIkFBMjBfMTYxMF9HUElPXzQxIiwJIDksICAgIDksICAgIDcsCSAgMSwgIDMxLCAgIDAsCSAgMSwJIDEsICAxKQogTVVYX0NGRygiVzE5XzE2MTBfR1BJTzQ4IiwJIDgsICAgMTUsICAgIDcsICAgMSwgIDIzLCAgIDEsICAgIDEsICAgICAwLCAgMSkKIE1VWF9DRkcoIk03XzE2MTBfR1BJTzYyIiwJMTAsICAgIDAsICAgIDAsICAgNCwgIDI0LCAgIDAsICAgIDQsICAgICAwLCAgMSkKK01VWF9DRkcoIlYxNF8xNlhYX0dQSU8zNyIsCSA5LCAgIDE4LCAgICA3LAkgIDIsICAgMiwgICAwLAkgIDIsCSAyLCAgMCkKK01VWF9DRkcoIlI5XzE2WFhfR1BJTzE4IiwJIEMsICAgMTgsICAgIDcsICAgMywgICAwLCAgIDAsICAgIDMsICAgICAwLCAgMCkKK01VWF9DRkcoIkwxNF8xNlhYX0dQSU80OSIsCSA2LCAgICAzLCAgICA3LCAgIDAsICAzMSwgICAwLCAgICAwLCAgICAzMSwgIDApCiAKIC8qIE9NQVAtMTYxMCB1V2lyZSAqLwogTVVYX0NGRygiVjE5XzE2MTBfVVdJUkVfU0NMSyIsCSA4LCAgICA2LCAgICAwLAkgIDEsICAyMCwgICAwLAkgIDEsCSAxLCAgMSkKQEAgLTUwMywxNiArNTEwLDE3IEBACiBNVVhfQ0ZHKCJXOV9VU0IyX1RYRU4iLAkJIEIsICAgOSwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQogTVVYX0NGRygiQUE5X1VTQjJfVlAiLAkJIEIsICAgNiwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQogTVVYX0NGRygiWTVfVVNCMl9SQ1YiLAkJIEMsICAyMSwgICAgIDEsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAxKQotTVVYX0NGRygiUjhfVVNCMl9WTSIsCQkgQywgIDE4LCAgICAgMSwJIE5BLCAgIDAsICAgMCwJIE5BLAkgMCwgIDEpCitNVVhfQ0ZHKCJSOV9VU0IyX1ZNIiwJCSBDLCAgMTgsICAgICAxLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIlY2X1VTQjJfVFhEIiwJCSBDLCAgMjcsICAgICAyLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIE1VWF9DRkcoIlc1X1VTQjJfU0UwIiwJCSBDLCAgMjQsICAgICAyLAkgTkEsICAgMCwgICAwLAkgTkEsCSAwLCAgMSkKIAotCi0vKiBVQVJUMSAqLworLyogMTZYWCBVQVJUICovCiBNVVhfQ0ZHKCJSMTNfMTYxMF9VQVJUMV9UWCIsCSBBLCAgMTIsICAgICA2LAkgIDIsICAxMCwgICAwLAkgIDIsCTEwLCAgMSkKLU1VWF9DRkcoIlYxNF8xNjEwX1VBUlQxX1JYIiwJIDksICAxOCwgICAgIDAsCSAgMiwgICAyLCAgIDAsCSAgMiwJIDIsICAxKQorTVVYX0NGRygiVjE0XzE2WFhfVUFSVDFfUlgiLAkgOSwgIDE4LCAgICAgMCwJICAyLCAgIDIsICAgMCwJICAyLAkgMiwgIDEpCiBNVVhfQ0ZHKCJSMTRfMTYxMF9VQVJUMV9DVFMiLAkgOSwgIDE1LCAgICAgMCwJICAyLCAgIDEsICAgMCwJICAyLAkgMSwgIDEpCiBNVVhfQ0ZHKCJBQTE1XzE2MTBfVUFSVDFfUlRTIiwJIDksICAxMiwgICAgIDEsCSAgMiwgICAwLCAgIDAsCSAgMiwJIDAsICAxKQorTVVYX0NGRygiUjlfMTZYWF9VQVJUMl9SWCIsCSBDLCAgMTgsICAgICAwLCAgIDMsICAgMCwgICAwLCAgICAzLCAgICAgMCwgIDEpCitNVVhfQ0ZHKCJMMTRfMTZYWF9VQVJUM19SWCIsCSA2LCAgIDMsICAgICAwLCAgIDAsICAzMSwgICAwLCAgICAwLCAgICAzMSwgIDEpCiAKIC8qIEkyQyBpbnRlcmZhY2UgKi8KIE1VWF9DRkcoIkkyQ19TQ0wiLAkJIDcsICAyNCwgICAgIDAsCSBOQSwgICAwLCAgIDAsCSBOQSwJIDAsICAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9vbWFwMTZ4eC5oCmluZGV4IDg4YjFmZTQuLjM4YTliOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvb21hcDE2eHguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL29tYXAxNnh4LmgKQEAgLTE4Myw1ICsxODMsMzcgQEAKICNkZWZpbmUgT01BUDE2WFhfUFdMX0VOQUJMRQkoT01BUDE2WFhfUFdMX0JBU0UgKyAweDAwKQogI2RlZmluZSBPTUFQMTZYWF9QV0xfQ0xLX0VOQUJMRQkoT01BUDE2WFhfUFdMX0JBU0UgKyAweDA0KQogCisvKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBXYXRjaGRvZyB0aW1lcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworLyogMzItYml0IFdhdGNoZG9nIHRpbWVyIGluIE9NQVAgMTZYWCAqLworI2RlZmluZSBPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSAgICAgICAgKDB4ZmZmZWIwMDApCisjZGVmaW5lIE9NQVBfMTZYWF9XSURSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgwMCkKKyNkZWZpbmUgT01BUF8xNlhYX1dEX1NZU0NPTkZJRyAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDEwKQorI2RlZmluZSBPTUFQXzE2WFhfV0RfU1lTU1RBVFVTIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MTQpCisjZGVmaW5lIE9NQVBfMTZYWF9XQ0xSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgyNCkKKyNkZWZpbmUgT01BUF8xNlhYX1dDUlIgICAgICAgICAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDI4KQorI2RlZmluZSBPTUFQXzE2WFhfV0xEUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4MmMpCisjZGVmaW5lIE9NQVBfMTZYWF9XVEdSICAgICAgICAgKE9NQVBfMTZYWF9XQVRDSERPR19CQVNFICsgMHgzMCkKKyNkZWZpbmUgT01BUF8xNlhYX1dXUFMgICAgICAgICAoT01BUF8xNlhYX1dBVENIRE9HX0JBU0UgKyAweDM0KQorI2RlZmluZSBPTUFQXzE2WFhfV1NQUiAgICAgICAgIChPTUFQXzE2WFhfV0FUQ0hET0dfQkFTRSArIDB4NDgpCisKKyNkZWZpbmUgV0NMUl9QUkVfU0hJRlQgICAgICAgICA1CisjZGVmaW5lIFdDTFJfUFRWX1NISUZUICAgICAgICAgMgorCisjZGVmaW5lIFdXUFNfV19QRU5EX1dTUFIgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgV1dQU19XX1BFTkRfV1RHUiAgICAgICAoMSA8PCAzKQorI2RlZmluZSBXV1BTX1dfUEVORF9XTERSICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFdXUFNfV19QRU5EX1dDUlIgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgV1dQU19XX1BFTkRfV0NMUiAgICAgICAoMSA8PCAwKQorCisjZGVmaW5lIFdTUFJfRU5BQkxFXzAgICAgICAgICAgKDB4MDAwMGJiYmIpCisjZGVmaW5lIFdTUFJfRU5BQkxFXzEgICAgICAgICAgKDB4MDAwMDQ0NDQpCisjZGVmaW5lIFdTUFJfRElTQUJMRV8wICAgICAgICAgKDB4MDAwMGFhYWEpCisjZGVmaW5lIFdTUFJfRElTQUJMRV8xICAgICAgICAgKDB4MDAwMDU1NTUpCisKICNlbmRpZiAvKiAgX19BU01fQVJDSF9PTUFQMTZYWF9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3N5c3RlbS5oCmluZGV4IDE3YTJjNDguLmZmMzdiYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9zeXN0ZW0uaApAQCAtNSw3ICs1LDkgQEAKICNpZm5kZWYgX19BU01fQVJDSF9TWVNURU1fSAogI2RlZmluZSBfX0FTTV9BUkNIX1NZU1RFTV9ICiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2lkbGUodm9pZCkKIHsKQEAgLTE0LDcgKzE2LDI0IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSkKIHsKLQlvbWFwX3dyaXRldygxLCBBUk1fUlNUQ1QxKTsKKworI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNlhYCisJLyoKKwkgKiBXb3JrYXJvdW5kIGZvciA1OTEyLzE2MTFiIGJ1ZyBtZW50aW9uZWQgaW4gc3ByejIwOWQucGRmIHAuIDI4CisJICogIkdsb2JhbCBTb2Z0d2FyZSBSZXNldCBBZmZlY3RzIFRyYWZmaWMgQ29udHJvbGxlciBGcmVxdWVuY3kiLgorCSAqLworCWlmIChjcHVfaXNfb21hcDU5MTIoKSkgeworCQlvbWFwX3dyaXRldyhvbWFwX3JlYWR3KERQTExfQ1RMKSAmIH4oMSA8PCA0KSwKKwkJCQkgRFBMTF9DVEwpOworCQlvbWFwX3dyaXRldygweDgsIEFSTV9SU1RDVDEpOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNIX1ZPSUNFQkxVRQorCWlmIChtYWNoaW5lX2lzX3ZvaWNlYmx1ZSgpKQorCQl2b2ljZWJsdWVfcmVzZXQoKTsKKwllbHNlCisjZW5kaWYKKwkJb21hcF93cml0ZXcoMSwgQVJNX1JTVENUMSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91c2IuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvdXNiLmgKaW5kZXggMTQzOGM2Yy4uMDU0ZmI5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC91c2IuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL3VzYi5oCkBAIC00Nyw2ICs0NywxNSBAQAogIwlkZWZpbmUJIEhNQ19UTExBVFRBQ0gJCSgxIDw8IDYpCiAjCWRlZmluZQkgT1RHX0hNQyh3KQkJKCgodyk+PjApJjB4M2YpCiAjZGVmaW5lIE9UR19DVFJMX1JFRwkJCU9UR19SRUczMigweDBjKQorIwlkZWZpbmUJIE9UR19VU0IyX0VOCQkoMSA8PCAyOSkKKyMJZGVmaW5lCSBPVEdfVVNCMl9EUAkJKDEgPDwgMjgpCisjCWRlZmluZQkgT1RHX1VTQjJfRE0JCSgxIDw8IDI3KQorIwlkZWZpbmUJIE9UR19VU0IxX0VOCQkoMSA8PCAyNikKKyMJZGVmaW5lCSBPVEdfVVNCMV9EUAkJKDEgPDwgMjUpCisjCWRlZmluZQkgT1RHX1VTQjFfRE0JCSgxIDw8IDI0KQorIwlkZWZpbmUJIE9UR19VU0IwX0VOCQkoMSA8PCAyMykKKyMJZGVmaW5lCSBPVEdfVVNCMF9EUAkJKDEgPDwgMjIpCisjCWRlZmluZQkgT1RHX1VTQjBfRE0JCSgxIDw8IDIxKQogIwlkZWZpbmUJIE9UR19BU0VTU1ZMRAkJKDEgPDwgMjApCiAjCWRlZmluZQkgT1RHX0JTRVNTRU5ECQkoMSA8PCAxOSkKICMJZGVmaW5lCSBPVEdfQlNFU1NWTEQJCSgxIDw8IDE4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL2RlYnVnLW1hY3JvLlMgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvZGVidWctbWFjcm8uUwppbmRleCBmMjg4ZTc0Li5iNmVjNjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvZGVidWctbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvZGVidWctbWFjcm8uUwpAQCAtMTEsNiArMTEsOCBAQAogICoKICovCiAKKyNpbmNsdWRlICJoYXJkd2FyZS5oIgorCiAJCS5tYWNybwlhZGRydWFydCxyeAogCQltcmMJcDE1LCAwLCBccngsIGMxLCBjMAogCQl0c3QJXHJ4LCAjMQkJCUAgTU1VIGVuYWJsZWQ/CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvbXRkLXhpcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL210ZC14aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA0ZGJjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL210ZC14aXAuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogTVREIHByaW1pdGl2ZXMgZm9yIFhJUCBzdXBwb3J0LiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICogRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJdCdzIGluY2x1ZGVkIGZyb20gbGludXgvbXRkL3hpcC5oCisgKiAKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDIsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogJElkOiB4aXAuaCx2IDEuMiAyMDA0LzEyLzAxIDE1OjQ5OjEwIG5pY28gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVJDSF9QWEFfTVREX1hJUF9IX18KKyNkZWZpbmUgX19BUkNIX1BYQV9NVERfWElQX0hfXworCisjaW5jbHVkZSA8YXNtL2FyY2gvcHhhLXJlZ3MuaD4KKworI2RlZmluZSB4aXBfaXJxcGVuZGluZygpCShJQ0lQICYgSUNNUikKKworLyogd2Ugc2FtcGxlIE9TQ1IgYW5kIGNvbnZlcnQgZGVzaXJlZCBkZWx0YSB0byB1c2VjICgxLzQgfj0gMTAwMDAwMC8zNjg2NDAwKSAqLworI2RlZmluZSB4aXBfY3VycnRpbWUoKQkJKE9TQ1IpCisjZGVmaW5lIHhpcF9lbGFwc2VkX3NpbmNlKHgpCShzaWduZWQpKChPU0NSIC0gKHgpKSAvIDQpCisKKy8qCisgKiB4aXBfY3B1X2lkbGUoKSBpcyB1c2VkIHdoZW4gd2FpdGluZyBmb3IgYSBkZWxheSBlcXVhbCBvciBsYXJnZXIgdGhhbgorICogdGhlIHN5c3RlbSB0aW1lciB0aWNrIHBlcmlvZC4gIFRoaXMgc2hvdWxkIHB1dCB0aGUgQ1BVIGludG8gaWRsZSBtb2RlCisgKiB0byBzYXZlIHBvd2VyIGFuZCB0byBiZSB3b2tlbiB1cCBvbmx5IHdoZW4gc29tZSBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLgorICogQXMgYWJvdmUsIHRoaXMgc2hvdWxkIG5vdCByZWx5IHVwb24gc3RhbmRhcmQga2VybmVsIGNvZGUuCisgKi8KKworI2RlZmluZSB4aXBfY3B1X2lkbGUoKSAgYXNtIHZvbGF0aWxlICgibWNyIHAxNCwgMCwgJTAsIGM3LCBjMCwgMCIgOjogInIiICgxKSkKKworI2VuZGlmIC8qIF9fQVJDSF9QWEFfTVREX1hJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3B4YS1yZWdzLmgKaW5kZXggYjVlNTRhOWUuLjUxZjBmZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9weGEtcmVncy5oCkBAIC0xNTA1LDYgKzE1MDUsNyBAQAogI2RlZmluZSBQU1NSX09UR1BICSgxIDw8IDYpCS8qIE9URyBQZXJpcGhlcmFsIGNvbnRyb2wgSG9sZCAqLwogI2RlZmluZSBQU1NSX1JESAkoMSA8PCA1KQkvKiBSZWFkIERpc2FibGUgSG9sZCAqLwogI2RlZmluZSBQU1NSX1BICQkoMSA8PCA0KQkvKiBQZXJpcGhlcmFsIENvbnRyb2wgSG9sZCAqLworI2RlZmluZSBQU1NSX1NUUwkoMSA8PCAzKQkvKiBTdGFuZGJ5IE1vZGUgU3RhdHVzICovCiAjZGVmaW5lIFBTU1JfVkZTCSgxIDw8IDIpCS8qIFZERCBGYXVsdCBTdGF0dXMgKi8KICNkZWZpbmUgUFNTUl9CRlMJKDEgPDwgMSkJLyogQmF0dGVyeSBGYXVsdCBTdGF0dXMgKi8KICNkZWZpbmUgUFNTUl9TU1MJKDEgPDwgMCkJLyogU29mdHdhcmUgU2xlZXAgU3RhdHVzICovCkBAIC0xOTY1LDYgKzE5NjYsNyBAQAogI2RlZmluZSBNRUNSX05PUwkoMSA8PCAwKQkvKiBOdW1iZXIgT2YgU29ja2V0czogMCAtPiAxIHNvY2ssIDEgLT4gMiBzb2NrICovCiAjZGVmaW5lIE1FQ1JfQ0lUCSgxIDw8IDEpCS8qIENhcmQgSXMgVGhlcmU6IDAgLT4gbm8gY2FyZCwgMSAtPiBjYXJkIGluc2VydGVkICovCiAKKyNkZWZpbmUgTURSRUZSX0swREI0CSgxIDw8IDI5KQkvKiBTRENMSzAgRGl2aWRlIGJ5IDQgQ29udHJvbC9TdGF0dXMgKi8KICNkZWZpbmUgTURSRUZSX0syRlJFRQkoMSA8PCAyNSkJLyogU0RSQU0gRnJlZS1SdW5uaW5nIENvbnRyb2wgKi8KICNkZWZpbmUgTURSRUZSX0sxRlJFRQkoMSA8PCAyNCkJLyogU0RSQU0gRnJlZS1SdW5uaW5nIENvbnRyb2wgKi8KICNkZWZpbmUgTURSRUZSX0swRlJFRQkoMSA8PCAyMykJLyogU0RSQU0gRnJlZS1SdW5uaW5nIENvbnRyb2wgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYXVkaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDI3NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9hdWRpby5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvYXVkaW8uaAorICoKKyAqIChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIFMzQzI0WFggLSBBdWRpbyBwbGF0ZnJvbV9kZXZpY2UgaW5mbworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ2hhbmdlbG9nOgorICoJMjAtTm92LTIwMDQgQkpEICBDcmVhdGVkIGZpbGUKKyAqCTA3LU1hci0yMDA1IEJKRCAgQWRkZWQgc3VzcGVuZC9yZXN1bWUgY2FsbHMKKyovCisKKyNpZm5kZWYgX19BU01fQVJDSF9BVURJT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfQVVESU9fSCBfX0ZJTEVfXworCisvKiBzdHJ1Y3QgczNjMjR4eF9paXNfb3BzCisgKgorICogY2FsbGVkIGZyb20gdGhlIHMzYzI0eHggYXVkaW8gY29yZSB0byBkZWFsIHdpdGggdGhlIGFyY2hpdGVjdHVyZQorICogb3IgdGhlIGNvZGVjJ3Mgc2V0dXAgYW5kIGNvbnRyb2wuCisgKgorICogdGhlIHBvaW50ZXIgdG8gaXRzZWxmIGlzIHBhc3NlZCB0aHJvdWdoIGluIGNhc2UgdGhlIGNhbGxlciB3YW50cyB0bworICogZW1iZWQgdGhpcyBpbiBhbiBsYXJnZXIgc3RydWN0dXJlIGZvciBlYXN5IHJlZmVyZW5jZSB0byBpdCdzIGNvbnRleHQuCisqLworCitzdHJ1Y3QgczNjMjR4eF9paXNfb3BzIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCWludAkoKnN0YXJ0dXApKHN0cnVjdCBzM2MyNHh4X2lpc19vcHMgKm1lKTsKKwl2b2lkCSgqc2h1dGRvd24pKHN0cnVjdCBzM2MyNHh4X2lpc19vcHMgKm1lKTsKKwlpbnQJKCpzdXNwZW5kKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSk7CisJaW50CSgqcmVzdW1lKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSk7CisKKwlpbnQJKCpvcGVuKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3RybSk7CisJaW50CSgqY2xvc2UpKHN0cnVjdCBzM2MyNHh4X2lpc19vcHMgKm1lLCBzbmRfcGNtX3N1YnN0cmVhbV90ICpzdHJtKTsKKwlpbnQJKCpwcmVwYXJlKShzdHJ1Y3QgczNjMjR4eF9paXNfb3BzICptZSwgc25kX3BjbV9zdWJzdHJlYW1fdCAqc3RybSwgc25kX3BjbV9ydW50aW1lX3QgKnJ0KTsKK307CisKK3N0cnVjdCBzM2MyNHh4X3BsYXRkYXRhX2lpcyB7CisJY29uc3QgY2hhcgkJKmNvZGVjX2NsazsKKwlzdHJ1Y3QgczNjMjR4eF9paXNfb3BzCSpvcHM7CisJaW50CQkJKCptYXRjaF9kZXYpKHN0cnVjdCBkZXZpY2UgKmRldik7Cit9OworCisjZW5kaWYgLyogX19BU01fQVJDSF9BVURJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvbXRkLXhpcC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL210ZC14aXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGNmZGFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtc2ExMTAwL210ZC14aXAuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogTVREIHByaW1pdGl2ZXMgZm9yIFhJUCBzdXBwb3J0LiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgZnVuY3Rpb25zCisgKgorICogRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LiBJdCdzIGluY2x1ZGVkIGZyb20gbGludXgvbXRkL3hpcC5oCisgKiAKKyAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQorICogQ3JlYXRlZDoJTm92IDIsIDIwMDQKKyAqIENvcHlyaWdodDoJKEMpIDIwMDQgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogJElkOiB4aXAuaCx2IDEuMiAyMDA0LzEyLzAxIDE1OjQ5OjEwIG5pY28gRXhwICQKKyAqLworCisjaWZuZGVmIF9fQVJDSF9TQTExMDBfTVREX1hJUF9IX18KKyNkZWZpbmUgX19BUkNIX1NBMTEwMF9NVERfWElQX0hfXworCisjZGVmaW5lIHhpcF9pcnFwZW5kaW5nKCkJKElDSVAgJiBJQ01SKQorCisvKiB3ZSBzYW1wbGUgT1NDUiBhbmQgY29udmVydCBkZXNpcmVkIGRlbHRhIHRvIHVzZWMgKDEvNCB+PSAxMDAwMDAwLzM2ODY0MDApICovCisjZGVmaW5lIHhpcF9jdXJydGltZSgpCQkoT1NDUikKKyNkZWZpbmUgeGlwX2VsYXBzZWRfc2luY2UoeCkJKHNpZ25lZCkoKE9TQ1IgLSAoeCkpIC8gNCkKKworI2VuZGlmIC8qIF9fQVJDSF9TQTExMDBfTVREX1hJUF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9hcm1fdGltZXIuaCBiL2luY2x1ZGUvYXNtLWFybS9oYXJkd2FyZS9hcm1fdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGJlM2JkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tYXJtL2hhcmR3YXJlL2FybV90aW1lci5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19BU01fQVJNX0hBUkRXQVJFX0FSTV9USU1FUl9ICisjZGVmaW5lIF9fQVNNX0FSTV9IQVJEV0FSRV9BUk1fVElNRVJfSAorCisjZGVmaW5lIFRJTUVSX0xPQUQJMHgwMAorI2RlZmluZSBUSU1FUl9WQUxVRQkweDA0CisjZGVmaW5lIFRJTUVSX0NUUkwJMHgwOAorI2RlZmluZSBUSU1FUl9DVFJMX09ORVNIT1QJKDEgPDwgMCkKKyNkZWZpbmUgVElNRVJfQ1RSTF8zMkJJVAkoMSA8PCAxKQorI2RlZmluZSBUSU1FUl9DVFJMX0RJVjEJCSgwIDw8IDIpCisjZGVmaW5lIFRJTUVSX0NUUkxfRElWMTYJKDEgPDwgMikKKyNkZWZpbmUgVElNRVJfQ1RSTF9ESVYyNTYJKDIgPDwgMikKKyNkZWZpbmUgVElNRVJfQ1RSTF9JRQkJKDEgPDwgNSkJLyogSW50ZXJydXB0IEVuYWJsZSAodmVyc2F0aWxlIG9ubHkpICovCisjZGVmaW5lIFRJTUVSX0NUUkxfUEVSSU9ESUMJKDEgPDwgNikKKyNkZWZpbmUgVElNRVJfQ1RSTF9FTkFCTEUJKDEgPDwgNykKKworI2RlZmluZSBUSU1FUl9JTlRDTFIJMHgwYworI2RlZmluZSBUSU1FUl9SSVMJMHgxMAorI2RlZmluZSBUSU1FUl9NSVMJMHgxNAorI2RlZmluZSBUSU1FUl9CR0xPQUQJMHgxOAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9pZGUuaCBiL2luY2x1ZGUvYXNtLWFybS9pZGUuaAppbmRleCAyMTE0YWNiLi40ZjY4YzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaWRlLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2lkZS5oCkBAIC01LDcgKzUsNyBAQAogICovCiAKIC8qCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpMzg2IGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBJREUgY29kZS4KKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEFSTSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgSURFIGNvZGUuCiAgKi8KIAogI2lmbmRlZiBfX0FTTUFSTV9JREVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vaW8uaAppbmRleCAwOGE0NjMwLi5jZmE3MWEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vaW8uaApAQCAtODIsNyArODIsNyBAQAogICogb25seS4gIFRoZWlyIHByaW1hcnkgcHVycG9zZSBpcyB0byBhY2Nlc3MgUENJIGFuZCBJU0EgcGVyaXBoZXJhbHMuCiAgKgogICogTm90ZSB0aGF0IGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZSwgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGZvbGxvd2luZwotICogYmlnIGVuZGlhbiBtb2RlIGNvbm5lY3Rpdml0eSBpcyBpbiBwbGFjZSwgYXMgZGVzY3JpYmVkIGJ5IG51bWVyaW91cworICogYmlnIGVuZGlhbiBtb2RlIGNvbm5lY3Rpdml0eSBpcyBpbiBwbGFjZSwgYXMgZGVzY3JpYmVkIGJ5IG51bWVyb3VzCiAgKiBBUk0gZG9jdW1lbnRzOgogICoKICAqICAgIFBDSTogIEQwLUQ3ICAgRDgtRDE1IEQxNi1EMjMgRDI0LUQzMQpAQCAtMjc1LDYgKzI3NSw3IEBACiAvKgogICogaW97cmVhZCx3cml0ZX17OCwxNiwzMn0gbWFjcm9zCiAgKi8KKyNpZm5kZWYgaW9yZWFkOAogI2RlZmluZSBpb3JlYWQ4KHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBfX3Jhd19yZWFkYihwKTsgX192OyB9KQogI2RlZmluZSBpb3JlYWQxNihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUxNl90b19jcHUoX19yYXdfcmVhZHcocCkpOyBfX3Y7IH0pCiAjZGVmaW5lIGlvcmVhZDMyKHApCSh7IHVuc2lnbmVkIGludCBfX3YgPSBsZTMyX3RvX2NwdShfX3Jhd19yZWFkbChwKSk7IF9fdjsgfSkKQEAgLTI5Myw2ICsyOTQsNyBAQAogCiBleHRlcm4gdm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKTsKIGV4dGVybiB2b2lkIGlvcG9ydF91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpOworI2VuZGlmCiAKIHN0cnVjdCBwY2lfZGV2OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC9hcmNoLmgKaW5kZXggM2EzMmU5Mi4uNTZjNmJmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL21hY2gvYXJjaC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tYWNoL2FyY2guaApAQCAtMjYsNyArMjYsNyBAQAogCQkJCQkJICogcGFnZSB0YWJlIGVudHJ5CSovCiAKIAljb25zdCBjaGFyCQkqbmFtZTsJCS8qIGFyY2hpdGVjdHVyZSBuYW1lCSovCi0JdW5zaWduZWQgaW50CQlwYXJhbV9vZmZzZXQ7CS8qIHBhcmFtZXRlciBwYWdlCSovCisJdW5zaWduZWQgbG9uZwkJYm9vdF9wYXJhbXM7CS8qIHRhZ2dlZCBsaXN0CQkqLwogCiAJdW5zaWduZWQgaW50CQl2aWRlb19zdGFydDsJLyogc3RhcnQgb2YgdmlkZW8gUkFNCSovCiAJdW5zaWduZWQgaW50CQl2aWRlb19lbmQ7CS8qIGVuZCBvZiB2aWRlbyBSQU0JKi8KQEAgLTU0LDM4ICs1NCw2IEBACiAJLm5yCQk9IE1BQ0hfVFlQRV8jI190eXBlLAlcCiAJLm5hbWUJCT0gX25hbWUsCiAKLSNkZWZpbmUgTUFJTlRBSU5FUihuKQotCi0jZGVmaW5lIEJPT1RfTUVNKF9wcmFtLF9waW8sX3ZpbykJCVwKLQkucGh5c19yYW0JPSBfcHJhbSwJCVwKLQkucGh5c19pbwk9IF9waW8sCQkJXAotCS5pb19wZ19vZmZzdAk9ICgoX3Zpbyk+PjE4KSYweGZmZmMsCi0KLSNkZWZpbmUgQk9PVF9QQVJBTVMoX3BhcmFtcykJCQlcCi0JLnBhcmFtX29mZnNldAk9IF9wYXJhbXMsCi0KLSNkZWZpbmUgVklERU8oX3N0YXJ0LF9lbmQpCQkJXAotCS52aWRlb19zdGFydAk9IF9zdGFydCwJCVwKLQkudmlkZW9fZW5kCT0gX2VuZCwKLQotI2RlZmluZSBESVNBQkxFX1BBUlBPUlQoX24pCQkJXAotCS5yZXNlcnZlX2xwIyNfbgk9IDEsCi0KLSNkZWZpbmUgU09GVF9SRUJPT1QJCQkJXAotCS5zb2Z0X3JlYm9vdAk9IDEsCi0KLSNkZWZpbmUgRklYVVAoX2Z1bmMpCQkJCVwKLQkuZml4dXAJCT0gX2Z1bmMsCi0KLSNkZWZpbmUgTUFQSU8oX2Z1bmMpCQkJCVwKLQkubWFwX2lvCQk9IF9mdW5jLAotCi0jZGVmaW5lIElOSVRJUlEoX2Z1bmMpCQkJCVwKLQkuaW5pdF9pcnEJPSBfZnVuYywKLQotI2RlZmluZSBJTklUX01BQ0hJTkUoX2Z1bmMpCQkJXAotCS5pbml0X21hY2hpbmUJPSBfZnVuYywKLQogI2RlZmluZSBNQUNISU5FX0VORAkJCQlcCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vbWFjaC90aW1lLmggYi9pbmNsdWRlL2FzbS1hcm0vbWFjaC90aW1lLmgKaW5kZXggNWNmNGZkNi4uMmNmMjc5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL21hY2gvdGltZS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tYWNoL3RpbWUuaApAQCAtMzksOCArMzksMzEgQEAKIAl2b2lkCQkJKCpzdXNwZW5kKSh2b2lkKTsKIAl2b2lkCQkJKCpyZXN1bWUpKHZvaWQpOwogCXVuc2lnbmVkIGxvbmcJCSgqb2Zmc2V0KSh2b2lkKTsKKworI2lmZGVmIENPTkZJR19OT19JRExFX0haCisJc3RydWN0IGR5bl90aWNrX3RpbWVyCSpkeW5fdGljazsKKyNlbmRpZgogfTsKIAorI2lmZGVmIENPTkZJR19OT19JRExFX0haCisKKyNkZWZpbmUgRFlOX1RJQ0tfU0tJUFBJTkcJKDEgPDwgMikKKyNkZWZpbmUgRFlOX1RJQ0tfRU5BQkxFRAkoMSA8PCAxKQorI2RlZmluZSBEWU5fVElDS19TVUlUQUJMRQkoMSA8PCAwKQorCitzdHJ1Y3QgZHluX3RpY2tfdGltZXIgeworCXVuc2lnbmVkIGludAlzdGF0ZTsJCQkvKiBDdXJyZW50IHN0YXRlICovCisJaW50CQkoKmVuYWJsZSkodm9pZCk7CS8qIEVuYWJsZXMgZHluYW1pYyB0aWNrICovCisJaW50CQkoKmRpc2FibGUpKHZvaWQpOwkvKiBEaXNhYmxlcyBkeW5hbWljIHRpY2sgKi8KKwl2b2lkCQkoKnJlcHJvZ3JhbSkodW5zaWduZWQgbG9uZyk7IC8qIFJlcHJvZ3JhbXMgdGhlIHRpbWVyICovCisJaW50CQkoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKK307CisKK3ZvaWQgdGltZXJfZHluX3JlcHJvZ3JhbSh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHRpbWVyX2R5bl9yZXByb2dyYW0oKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgKnN5c3RlbV90aW1lcjsKIGV4dGVybiB2b2lkIHRpbWVyX3RpY2soc3RydWN0IHB0X3JlZ3MgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9tdGQteGlwLmggYi9pbmNsdWRlL2FzbS1hcm0vbXRkLXhpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjEyN2NjNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWFybS9tdGQteGlwLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIE1URCBwcmltaXRpdmVzIGZvciBYSVAgc3VwcG9ydC4gQXJjaGl0ZWN0dXJlIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIERvIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseS4gSXQncyBpbmNsdWRlZCBmcm9tIGxpbnV4L210ZC94aXAuaAorICogCisgKiBBdXRob3I6CU5pY29sYXMgUGl0cmUKKyAqIENyZWF0ZWQ6CU5vdiAyLCAyMDA0CisgKiBDb3B5cmlnaHQ6CShDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICRJZDogeGlwLmgsdiAxLjIgMjAwNC8xMi8wMSAxNTo0OToxMCBuaWNvIEV4cCAkCisgKi8KKworI2lmbmRlZiBfX0FSTV9NVERfWElQX0hfXworI2RlZmluZSBfX0FSTV9NVERfWElQX0hfXworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbXRkLXhpcC5oPgorCisvKiBmaWxsIGluc3RydWN0aW9uIHByZWZldGNoICovCisjZGVmaW5lIHhpcF9pcHJlZmV0Y2goKSAJZG8geyBhc20gdm9sYXRpbGUgKCIucmVwIDg7IG5vcDsgLmVuZHIiKTsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIF9fQVJNX01URF9YSVBfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcGNpLmggYi9pbmNsdWRlL2FzbS1hcm0vcGNpLmgKaW5kZXggNDBmZmFlZi4uYjI4ZjFjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wY2kuaApAQCAtMTQsNyArMTQsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTQyLDYgKzQyLDE2IEBACiAjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgoUFRSKS0+TEVOX05BTUUpCiAjZGVmaW5lIHBjaV91bm1hcF9sZW5fc2V0KFBUUiwgTEVOX05BTUUsIFZBTCkJKCgoUFRSKS0+TEVOX05BTUUpID0gKFZBTCkpCiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKICNkZWZpbmUgSEFWRV9QQ0lfTU1BUAogZXh0ZXJuIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3NpZ25hbC5oIGIvaW5jbHVkZS9hc20tYXJtL3NpZ25hbC5oCmluZGV4IDQ2ZTY5YWUuLjc2MGY2ZTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3NpZ25hbC5oCkBAIC0xMTQsNiArMTE0LDcgQEAKICNkZWZpbmUgU0lHU1RLU1oJODE5MgogCiAjaWZkZWYgX19LRVJORUxfXworI2RlZmluZSBTQV9USU1FUgkJMHg0MDAwMDAwMAogI2RlZmluZSBTQV9JUlFOT01BU0sJCTB4MDgwMDAwMDAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vc3RhdC5oIGIvaW5jbHVkZS9hc20tYXJtL3N0YXQuaAppbmRleCBjYThlN2E4Li5lYzRlMmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vc3RhdC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9zdGF0LmgKQEAgLTg5LDYgKzg5LDYgQEAKIAl1bnNpZ25lZCBsb25nCXN0X2N0aW1lX25zZWM7CiAKIAl1bnNpZ25lZCBsb25nIGxvbmcJc3RfaW5vOwotfTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tYXJtL3N5c3RlbS5oCmluZGV4IDM5ZGQ3MDAuLjJmNDRiMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vc3lzdGVtLmgKQEAgLTg1LDcgKzg1LDkgQEAKIHZvaWQgZGllKGNvbnN0IGNoYXIgKm1zZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlcnIpCiAJCV9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CiAKLXZvaWQgZGllX2lmX2tlcm5lbChjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyKTsKK3N0cnVjdCBzaWdpbmZvOwordm9pZCBub3RpZnlfZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdpbmZvICppbmZvLAorCQl1bnNpZ25lZCBsb25nIGVyciwgdW5zaWduZWQgbG9uZyB0cmFwKTsKIAogdm9pZCBob29rX2ZhdWx0X2NvZGUoaW50IG5yLCBpbnQgKCpmbikodW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50LAogCQkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqKSwKQEAgLTE0NSwzNCArMTQ3LDEyIEBACiAjZGVmaW5lIHNldF93bWIodmFyLCB2YWx1ZSkgZG8geyB2YXIgPSB2YWx1ZTsgd21iKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZcdHIwLHIwXHRAIG5vcFxuXHQiKTsKIAotI2lmZGVmIENPTkZJR19TTVAKIC8qCi0gKiBEZWZpbmUgb3VyIG93biBjb250ZXh0IHN3aXRjaCBsb2NraW5nLiAgVGhpcyBhbGxvd3MgdXMgdG8gZW5hYmxlCi0gKiBpbnRlcnJ1cHRzIG92ZXIgdGhlIGNvbnRleHQgc3dpdGNoLCBvdGhlcndpc2Ugd2UgZW5kIHVwIHdpdGggaGlnaAotICogaW50ZXJydXB0IGxhdGVuY3kuICBUaGUgcmVhbCBwcm9ibGVtIGFyZWEgaXMgc3dpdGNoX21tKCkgd2hpY2ggbWF5Ci0gKiBkbyBhIGZ1bGwgY2FjaGUgZmx1c2guCisgKiBzd2l0Y2hfbW0oKSBtYXkgZG8gYSBmdWxsIGNhY2hlIGZsdXNoIG92ZXIgdGhlIGNvbnRleHQgc3dpdGNoLAorICogc28gZW5hYmxlIGludGVycnVwdHMgb3ZlciB0aGUgY29udGV4dCBzd2l0Y2ggdG8gYXZvaWQgaGlnaAorICogbGF0ZW5jeS4KICAqLwotI2RlZmluZSBwcmVwYXJlX2FyY2hfc3dpdGNoKHJxLG5leHQpCQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCXNwaW5fbG9jaygmKG5leHQpLT5zd2l0Y2hfbG9jayk7CQkJCVwKLQlzcGluX3VubG9ja19pcnEoJihycSktPmxvY2spOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocnEscHJldikJCQkJCVwKLQlzcGluX3VubG9jaygmKHByZXYpLT5zd2l0Y2hfbG9jaykKLQotI2RlZmluZSB0YXNrX3J1bm5pbmcocnEscCkJCQkJCQlcCi0JKChycSktPmN1cnIgPT0gKHApIHx8IHNwaW5faXNfbG9ja2VkKCYocCktPnN3aXRjaF9sb2NrKSkKLSNlbHNlCi0vKgotICogT3VyIFVQLWNhc2UgaXMgbW9yZSBzaW1wbGUsIGJ1dCB3ZSBhc3N1bWUga25vd2xlZGdlIG9mIGhvdwotICogc3Bpbl91bmxvY2tfaXJxKCkgYW5kIGZyaWVuZHMgYXJlIGltcGxlbWVudGVkLiAgVGhpcyBhdm9pZHMKLSAqIHVzIG5lZWRsZXNzbHkgZGVjcmVtZW50aW5nIGFuZCBpbmNyZW1lbnRpbmcgdGhlIHByZWVtcHQgY291bnQuCi0gKi8KLSNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChycSxuZXh0KQlsb2NhbF9pcnFfZW5hYmxlKCkKLSNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHJxLHByZXYpCXNwaW5fdW5sb2NrKCYocnEpLT5sb2NrKQotI2RlZmluZSB0YXNrX3J1bm5pbmcocnEscCkJCSgocnEpLT5jdXJyID09IChwKSkKLSNlbmRpZgorI2RlZmluZSBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCiAKIC8qCiAgKiBzd2l0Y2hfdG8ocHJldiwgbmV4dCkgc2hvdWxkIHN3aXRjaCBmcm9tIHRhc2sgYHByZXYnIHRvIGBuZXh0JwpAQCAtMzEyLDcgKzI5Miw2IEBACiB9KQogCiAjaWZkZWYgQ09ORklHX1NNUAotI2Vycm9yIFNNUCBub3Qgc3VwcG9ydGVkCiAKICNkZWZpbmUgc21wX21iKCkJCW1iKCkKICNkZWZpbmUgc21wX3JtYigpCQlybWIoKQpAQCAtMzI2LDYgKzMwNSw4IEBACiAjZGVmaW5lIHNtcF93bWIoKQkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCQlkbyB7IH0gd2hpbGUoMCkKIAorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TQTExMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TQTExMCkKIC8qCiAgKiBPbiB0aGUgU3Ryb25nQVJNLCAic3dwIiBpcyB0ZXJtaW5hbGx5IGJyb2tlbiBzaW5jZSBpdCBieXBhc3NlcyB0aGUKQEAgLTMzOCw5ICszMTksMTYgQEAKICAqCiAgKiBXZSBjaG9vc2UgKDEpIHNpbmNlIGl0cyB0aGUgImVhc2llc3QiIHRvIGFjaGlldmUgaGVyZSBhbmQgaXMgbm90CiAgKiBkZXBlbmRlbnQgb24gdGhlIHByb2Nlc3NvciB0eXBlLgorICoKKyAqIE5PVEUgdGhhdCB0aGlzIHNvbHV0aW9uIHdvbid0IHdvcmsgb24gYW4gU01QIHN5c3RlbSwgc28gZXhwbGNpdGx5CisgKiBmb3JiaWQgaXQgaGVyZS4KICAqLworI2lmZGVmIENPTkZJR19TTVAKKyNlcnJvciBTTVAgaXMgbm90IHN1cHBvcnRlZCBvbiBTQTExMDAvU0ExMTAKKyNlbHNlCiAjZGVmaW5lIHN3cF9pc19idWdneQogI2VuZGlmCisjZW5kaWYKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKnB0ciwgaW50IHNpemUpCiB7CkBAIC0zODMsOCArMzcxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20tYXJtL3RsYmZsdXNoLmgKaW5kZXggOGE4NjRiMS4uOTM4N2E1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL3RsYmZsdXNoLmgKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiAjZGVmaW5lIHRsYl9mbGFnKGYpCSgoYWx3YXlzX3RsYl9mbGFncyAmIChmKSkgfHwgKF9fdGxiX2ZsYWcgJiBwb3NzaWJsZV90bGJfZmxhZ3MgJiAoZikpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAljb25zdCBpbnQgemVybyA9IDA7CiAJY29uc3QgdW5zaWduZWQgaW50IF9fdGxiX2ZsYWcgPSBfX2NwdV90bGJfZmxhZ3M7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAkJYXNtKCJtY3IlPyBwMTUsIDAsICUwLCBjOCwgYzUsIDAiIDogOiAiciIgKHplcm8pKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9mbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJY29uc3QgaW50IHplcm8gPSAwOwogCWNvbnN0IGludCBhc2lkID0gQVNJRChtbSk7CkBAIC0yODIsNyArMjgyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1mbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyB1YWRkcikKK2xvY2FsX2ZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVhZGRyKQogewogCWNvbnN0IGludCB6ZXJvID0gMDsKIAljb25zdCB1bnNpZ25lZCBpbnQgX190bGJfZmxhZyA9IF9fY3B1X3RsYl9mbGFnczsKQEAgLTMxMyw3ICszMTMsNyBAQAogCQlhc20oIm1jciU/IHAxNSwgMCwgJTAsIGM4LCBjNSwgMSIgOiA6ICJyIiAodWFkZHIpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKQogewogCWNvbnN0IGludCB6ZXJvID0gMDsKIAljb25zdCB1bnNpZ25lZCBpbnQgX190bGJfZmxhZyA9IF9fY3B1X3RsYl9mbGFnczsKQEAgLTM4NCw4ICszODQsMjQgQEAKIC8qCiAgKiBDb252ZXJ0IGNhbGxzIHRvIG91ciBjYWxsaW5nIGNvbnZlbnRpb24uCiAgKi8KLSNkZWZpbmUgZmx1c2hfdGxiX3JhbmdlKHZtYSxzdGFydCxlbmQpCV9fY3B1X2ZsdXNoX3VzZXJfdGxiX3JhbmdlKHN0YXJ0LGVuZCx2bWEpCi0jZGVmaW5lIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UocyxlKQlfX2NwdV9mbHVzaF9rZXJuX3RsYl9yYW5nZShzLGUpCisjZGVmaW5lIGxvY2FsX2ZsdXNoX3RsYl9yYW5nZSh2bWEsc3RhcnQsZW5kKQlfX2NwdV9mbHVzaF91c2VyX3RsYl9yYW5nZShzdGFydCxlbmQsdm1hKQorI2RlZmluZSBsb2NhbF9mbHVzaF90bGJfa2VybmVsX3JhbmdlKHMsZSkJX19jcHVfZmx1c2hfa2Vybl90bGJfcmFuZ2UocyxlKQorCisjaWZuZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgZmx1c2hfdGxiX2FsbAkJbG9jYWxfZmx1c2hfdGxiX2FsbAorI2RlZmluZSBmbHVzaF90bGJfbW0JCWxvY2FsX2ZsdXNoX3RsYl9tbQorI2RlZmluZSBmbHVzaF90bGJfcGFnZQkJbG9jYWxfZmx1c2hfdGxiX3BhZ2UKKyNkZWZpbmUgZmx1c2hfdGxiX2tlcm5lbF9wYWdlCWxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcGFnZQorI2RlZmluZSBmbHVzaF90bGJfcmFuZ2UJCWxvY2FsX2ZsdXNoX3RsYl9yYW5nZQorI2RlZmluZSBmbHVzaF90bGJfa2VybmVsX3JhbmdlCWxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UKKyNlbHNlCitleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHVhZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcGFnZSh1bnNpZ25lZCBsb25nIGthZGRyKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CisjZW5kaWYKIAogLyoKICAqIGlmIFBHX2RjYWNoZV9kaXJ0eSBpcyBzZXQgZm9yIHRoZSBwYWdlLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtMjYvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1hcm0yNi9zZXJpYWwuaAppbmRleCAyMWUxZGYzLi41ZmM3NDdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0yNi9zZXJpYWwuaApAQCAtMzAsMzQgKzMwLDE2IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BNUspCiAgICAgIC8qIFVBUlQgQ0xLICAgICAgICBQT1JUICBJUlEgICAgIEZMQUdTICAgICAgICAqLwogCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHsgMCwgQkFTRV9CQVVELCAweDNGOCwgMTAsIFNURF9DT01fRkxBR1MgfSwgICAgIC8qIHR0eVMwICovICAgICBcCiAgICAgICAgIHsgMCwgQkFTRV9CQVVELCAweDJGOCwgMTAsIFNURF9DT01fRkxBR1MgfSwgICAgIC8qIHR0eVMxICovCiAKICNlbHNlCiAKLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgeyAwLCBCQVNFX0JBVUQsIDAgICAgLCAgMCwgU1REX0NPTV9GTEFHUyB9LCAgICAgLyogdHR5UzAgKi8gICAgIFwKICAgICAgICAgeyAwLCBCQVNFX0JBVUQsIDAgICAgLCAgMCwgU1REX0NPTV9GTEFHUyB9LCAgICAgLyogdHR5UzEgKi8KIAogI2VuZGlmCiAKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMiAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMyAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNCAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNSAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNiAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTNyAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTOCAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTOSAqLyAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTAgKi8gICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTEgKi8gICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTIgKi8gICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMCAgICAsICAwLCBTVERfQ09NX0ZMQUdTIH0sICAgICAvKiB0dHlTMTMgKi8KLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvcGNpLmggYi9pbmNsdWRlL2FzbS1mcnYvcGNpLmgKaW5kZXggYTZhNDY5Mi4uYjRlZmU1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9wY2kuaApAQCAtNTcsNiArNTcsMTYgQEAKICAqLwogI2RlZmluZSBQQ0lfRE1BX0JVU19JU19QSFlTCSgxKQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiAvKgogICoJVGhlc2UgYXJlIHByZXR0eSBtdWNoIGFyYml0YXJ5IHdpdGggdGhlIENvTUVNIGltcGxlbWVudGF0aW9uLgogICoJV2UgaGF2ZSB0aGUgd2hvbGUgYWRkcmVzcyBzcGFjZSB0byBvdXJzZWx2ZXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggOTljZWYwNi4uYjNiYjMyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtNzMsNyArNzMsNyBAQAogCX0KIAogI2RlZmluZSBTRUNVUklUWV9JTklUCQkJCQkJCVwKLQkuc2VjdXJpdHlfaW5pdGNhbGwuaW5pdCA6IHsJCQkJCVwKKwkuc2VjdXJpdHlfaW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLnNlY3VyaXR5X2luaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsgXAogCQlWTUxJTlVYX1NZTUJPTChfX3NlY3VyaXR5X2luaXRjYWxsX3N0YXJ0KSA9IC47CQlcCiAJCSooLnNlY3VyaXR5X2luaXRjYWxsLmluaXQpIAkJCQlcCiAJCVZNTElOVVhfU1lNQk9MKF9fc2VjdXJpdHlfaW5pdGNhbGxfZW5kKSA9IC47CQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9wY2kuaCBiL2luY2x1ZGUvYXNtLWg4MzAwL3BjaS5oCmluZGV4IGQwMzI3MjkuLjVlZGFkNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWg4MzAwL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3BjaS5oCkBAIC0xNSw3ICsxNSw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK2V4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCBjOTc2YzFkLi5jZjgyOGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMjgsNiArMjgsOCBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YWNwaS9wZGNfaW50ZWwuaD4KKwogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4JCS8qIGRlZmluZXMgY21weGNoZyAqLwogCiAjZGVmaW5lIENPTVBJTEVSX0RFUEVOREVOVF9JTlQ2NCAgIGxvbmcgbG9uZwpAQCAtMTAxLDEyICsxMDMsNiBAQAogICAgICAgICA6Ij1yIihuX2hpKSwgIj1yIihuX2xvKSAgICAgXAogICAgICAgICA6IjAiKG5faGkpLCAiMSIobl9sbykpCiAKLS8qCi0gKiBSZWZlciBJbnRlbCBBQ1BJIF9QREMgc3VwcG9ydCBkb2N1bWVudCBmb3IgYml0IGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QIAkweGEKLSNkZWZpbmUgQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfTVNSCTB4MQotCiAjaWZkZWYgQ09ORklHX0FDUElfQk9PVCAKIGV4dGVybiBpbnQgYWNwaV9sYXBpYzsKIGV4dGVybiBpbnQgYWNwaV9pb2FwaWM7CkBAIC0xODUsNiArMTgxLDggQEAKIAogZXh0ZXJuIHU4IHg4Nl9hY3BpaWRfdG9fYXBpY2lkW107CiAKKyNkZWZpbmUgQVJDSF9IQVNfUE9XRVJfUERDX0lOSVQJMQorCiAjZW5kaWYgLypfX0tFUk5FTF9fKi8KIAogI2VuZGlmIC8qX0FTTV9BQ1BJX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAppbmRleCBhNTgxMGNmLi42YTFiMTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgRHByaW50ayh4Li4uKQpAQCAtMTYsOCArMTcsMjAgQEAKICNkZWZpbmUgQVBJQ19WRVJCT1NFIDEKICNkZWZpbmUgQVBJQ19ERUJVRyAgIDIKIAorZXh0ZXJuIGludCBlbmFibGVfbG9jYWxfYXBpYzsKIGV4dGVybiBpbnQgYXBpY192ZXJib3NpdHk7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19kaXNhYmxlKHZvaWQpCit7CisJZW5hYmxlX2xvY2FsX2FwaWMgPSAtMTsKKwljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19lbmFibGUodm9pZCkKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7Cit9CisKIC8qCiAgKiBEZWZpbmUgdGhlIGRlZmF1bHQgbGV2ZWwgb2Ygb3V0cHV0IHRvIGJlIHZlcnkgbGl0dGxlCiAgKiBUaGlzIGNhbiBiZSB0dXJuZWQgdXAgYnkgdXNpbmcgYXBpYz12ZXJib3NlIGZvciBtb3JlCkBAIC04Nyw3ICsxMDAsNyBAQAogZXh0ZXJuIGludCBnZXRfbWF4bHZ0KHZvaWQpOwogZXh0ZXJuIHZvaWQgY2xlYXJfbG9jYWxfQVBJQyh2b2lkKTsKIGV4dGVybiB2b2lkIGNvbm5lY3RfYnNwX0FQSUMgKHZvaWQpOwotZXh0ZXJuIHZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyAodm9pZCk7CitleHRlcm4gdm9pZCBkaXNjb25uZWN0X2JzcF9BUElDIChpbnQgdmlydF93aXJlX3NldHVwKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfbG9jYWxfQVBJQyAodm9pZCk7CiBleHRlcm4gdm9pZCBsYXBpY19zaHV0ZG93biAodm9pZCk7CiBleHRlcm4gaW50IHZlcmlmeV9sb2NhbF9BUElDICh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYXBpY2RlZi5oIGIvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmgKaW5kZXggYzY4OTU1NC4uYTk2YThmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmgKQEAgLTg2LDExICs4NiwxMiBAQAogI2RlZmluZQkJCUFQSUNfTFZUX1JFTU9URV9JUlIJCSgxPDwxNCkKICNkZWZpbmUJCQlBUElDX0lOUFVUX1BPTEFSSVRZCQkoMTw8MTMpCiAjZGVmaW5lCQkJQVBJQ19TRU5EX1BFTkRJTkcJCSgxPDwxMikKKyNkZWZpbmUJCQlBUElDX01PREVfTUFTSwkJCTB4NzAwCiAjZGVmaW5lCQkJR0VUX0FQSUNfREVMSVZFUllfTU9ERSh4KQkoKCh4KT4+OCkmMHg3KQogI2RlZmluZQkJCVNFVF9BUElDX0RFTElWRVJZX01PREUoeCx5KQkoKCh4KSZ+MHg3MDApfCgoeSk8PDgpKQogI2RlZmluZQkJCQlBUElDX01PREVfRklYRUQJCTB4MAogI2RlZmluZQkJCQlBUElDX01PREVfTk1JCQkweDQKLSNkZWZpbmUJCQkJQVBJQ19NT0RFX0VYSU5UCQkweDcKKyNkZWZpbmUJCQkJQVBJQ19NT0RFX0VYVElOVAkweDcKICNkZWZpbmUgCUFQSUNfTFZUMQkweDM2MAogI2RlZmluZQkJQVBJQ19MVlRFUlIJMHgzNzAKICNkZWZpbmUJCUFQSUNfVE1JQ1QJMHgzODAKQEAgLTEwOCwxMSArMTA5LDcgQEAKIAogI2RlZmluZSBBUElDX0JBU0UgKGZpeF90b192aXJ0KEZJWF9BUElDX0JBU0UpKQogCi0jaWZkZWYgQ09ORklHX05VTUEKLSAjZGVmaW5lIE1BWF9JT19BUElDUyAzMgotI2Vsc2UKLSAjZGVmaW5lIE1BWF9JT19BUElDUyA4Ci0jZW5kaWYKKyNkZWZpbmUgTUFYX0lPX0FQSUNTIDY0CiAKIC8qCiAgKiB0aGUgbG9jYWwgQVBJQyByZWdpc3RlciBzdHJ1Y3R1cmUsIG1lbW9yeSBtYXBwZWQuIE5vdCB0ZXJyaWJseSB3ZWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2NwdS5oIGIvaW5jbHVkZS9hc20taTM4Ni9jcHUuaAppbmRleCAwMDI3NDBiLi5lNzI1MmMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2NwdS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvY3B1LmgKQEAgLTUsNiArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogCiAjaW5jbHVkZSA8YXNtL25vZGUuaD4KIApAQCAtMTYsNCArMTcsNSBAQAogZXh0ZXJuIHZvaWQgYXJjaF91bnJlZ2lzdGVyX2NwdShpbnQpOwogI2VuZGlmCiAKK0RFQ0xBUkVfUEVSX0NQVShpbnQsIGNwdV9zdGF0ZSk7CiAjZW5kaWYgLyogX0FTTV9JMzg2X0NQVV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9oaWdobWVtLmggYi9pbmNsdWRlL2FzbS1pMzg2L2hpZ2htZW0uaAppbmRleCAxZGY0MmJmLi4wZmQzMzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2hpZ2htZW0uaApAQCAtNzAsNiArNzAsNyBAQAogdm9pZCBrdW5tYXAoc3RydWN0IHBhZ2UgKnBhZ2UpOwogdm9pZCAqa21hcF9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0ga21fdHlwZSB0eXBlKTsKIHZvaWQga3VubWFwX2F0b21pYyh2b2lkICprdmFkZHIsIGVudW0ga21fdHlwZSB0eXBlKTsKK3ZvaWQgKmttYXBfYXRvbWljX3Bmbih1bnNpZ25lZCBsb25nIHBmbiwgZW51bSBrbV90eXBlIHR5cGUpOwogc3RydWN0IHBhZ2UgKmttYXBfYXRvbWljX3RvX3BhZ2Uodm9pZCAqcHRyKTsKIAogI2RlZmluZSBmbHVzaF9jYWNoZV9rbWFwcygpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaTgyNTMuaCBiL2luY2x1ZGUvYXNtLWkzODYvaTgyNTMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTVkOGRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfX0FTTV9JODI1M19IX18KKyNkZWZpbmUgX19BU01fSTgyNTNfSF9fCisKK2V4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CisKKyNlbmRpZgkvKiBfX0FTTV9JODI1M19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvaWRlLmggYi9pbmNsdWRlL2FzbS1pMzg2L2lkZS5oCmluZGV4IDg1OWViZjQuLjc5ZGZhYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaWRlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9pZGUuaApAQCAtNDEsMTMgKzQxLDE3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgaWRlX2RlZmF1bHRfaW9fYmFzZShpbnQgaW5kZXgpCiB7CisJaWYgKHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBOVUxMKSA9PSBOVUxMKSB7CisJCXN3aXRjaChpbmRleCkgeworCQkJY2FzZSAyOiByZXR1cm4gMHgxZTg7CisJCQljYXNlIDM6IHJldHVybiAweDE2ODsKKwkJCWNhc2UgNDogcmV0dXJuIDB4MWUwOworCQkJY2FzZSA1OiByZXR1cm4gMHgxNjA7CisJCX0KKwl9CiAJc3dpdGNoIChpbmRleCkgewogCQljYXNlIDA6CXJldHVybiAweDFmMDsKIAkJY2FzZSAxOglyZXR1cm4gMHgxNzA7Ci0JCWNhc2UgMjogcmV0dXJuIDB4MWU4OwotCQljYXNlIDM6IHJldHVybiAweDE2ODsKLQkJY2FzZSA0OiByZXR1cm4gMHgxZTA7Ci0JCWNhc2UgNTogcmV0dXJuIDB4MTYwOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pcnEuaCBiL2luY2x1ZGUvYXNtLWkzODYvaXJxLmgKaW5kZXggMDViOWU2MS4uMjcwZjE5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2lycS5oCkBAIC0yOSwxMyArMjksMTkgQEAKIAogI2lmZGVmIENPTkZJR180S1NUQUNLUwogICBleHRlcm4gdm9pZCBpcnFfY3R4X2luaXQoaW50IGNwdSk7CisgIGV4dGVybiB2b2lkIGlycV9jdHhfZXhpdChpbnQgY3B1KTsKICMgZGVmaW5lIF9fQVJDSF9IQVNfRE9fU09GVElSUQogI2Vsc2UKICMgZGVmaW5lIGlycV9jdHhfaW5pdChjcHUpIGRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGlycV9jdHhfZXhpdChjcHUpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0lSUUJBTEFOQ0UKIGV4dGVybiBpbnQgaXJxYmFsYW5jZV9kaXNhYmxlKGNoYXIgKnN0cik7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorZXh0ZXJuIHZvaWQgZml4dXBfaXJxcyhjcHVtYXNrX3QgbWFwKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0FTTV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9rZGVidWcuaCBiL2luY2x1ZGUvYXNtLWkzODYva2RlYnVnLmgKaW5kZXggZGU2NDk4Yi4uYjNmOGQ1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2tkZWJ1Zy5oCkBAIC0xOCw3ICsxOCw3IEBACiB9OwogCiAvKiBOb3RlIC0geW91IHNob3VsZCBuZXZlciB1bnJlZ2lzdGVyIGJlY2F1c2UgdGhhdCBjYW4gcmFjZSB3aXRoIE5NSXMuCi0gICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gaXQgZmlyc3QgdW5yZWdpc3RlciAtIHRoZW4gc3luY2hyb25pemVfa2VybmVsIC0gdGhlbiBmcmVlLgorICAgSWYgeW91IHJlYWxseSB3YW50IHRvIGRvIGl0IGZpcnN0IHVucmVnaXN0ZXIgLSB0aGVuIHN5bmNocm9uaXplX3NjaGVkIC0gdGhlbiBmcmVlLgogICAqLwogaW50IHJlZ2lzdGVyX2RpZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIGV4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmkzODZkaWVfY2hhaW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2tleGVjLmggYi9pbmNsdWRlL2FzbS1pMzg2L2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMmEwMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYva2V4ZWMuaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9JMzg2X0tFWEVDX0gKKyNkZWZpbmUgX0kzODZfS0VYRUNfSAorCisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorCisvKgorICogS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCBtYXhpbXVtIHBhZ2UgZ2V0X2ZyZWVfcGFnZSBjYW4gcmV0dXJuLgorICogSS5lLiBNYXhpbXVtIHBhZ2UgdGhhdCBpcyBtYXBwZWQgZGlyZWN0bHkgaW50byBrZXJuZWwgbWVtb3J5LAorICogYW5kIGttYXAgaXMgbm90IHJlcXVpcmVkLgorICoKKyAqIFNvbWVvbmUgY29ycmVjdCBtZSBpZiBGSVhBRERSX1NUQVJUIC0gUEFHRU9GRlNFVCBpcyBub3QgdGhlIGNvcnJlY3QKKyAqIGNhbGN1bGF0aW9uIGZvciB0aGUgYW1vdW50IG9mIG1lbW9yeSBkaXJlY3RseSBtYXBwYWJsZSBpbnRvIHRoZQorICoga2VybmVsIG1lbW9yeSBzcGFjZS4KKyAqLworCisvKiBNYXhpbXVtIHBoeXNpY2FsIGFkZHJlc3Mgd2UgY2FuIHVzZSBwYWdlcyBmcm9tICovCisjZGVmaW5lIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgKC0xVUwpCisvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHJlYWNoIGluIHBoeXNpY2FsIGFkZHJlc3MgbW9kZSAqLworI2RlZmluZSBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQgKC0xVUwpCisvKiBNYXhpbXVtIGFkZHJlc3Mgd2UgY2FuIHVzZSBmb3IgdGhlIGNvbnRyb2wgY29kZSBidWZmZXIgKi8KKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgVEFTS19TSVpFCisKKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUJNDA5NgorCisvKiBUaGUgbmF0aXZlIGFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBLRVhFQ19BUkNIIEtFWEVDX0FSQ0hfMzg2CisKKyNkZWZpbmUgTUFYX05PVEVfQllURVMgMTAyNAordHlwZWRlZiB1MzIgbm90ZV9idWZfdFtNQVhfTk9URV9CWVRFUy80XTsKKworZXh0ZXJuIG5vdGVfYnVmX3QgY3Jhc2hfbm90ZXNbXTsKKworI2VuZGlmIC8qIF9JMzg2X0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L2RvX3RpbWVyLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oCmluZGV4IDAzZGQxM2EuLjU2MjExNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L2RvX3RpbWVyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvZG9fdGltZXIuaApAQCAtMSw2ICsxLDcgQEAKIC8qIGRlZmluZXMgZm9yIGlubGluZSBhcmNoIHNldHVwIGZ1bmN0aW9ucyAqLwogCiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTkuaD4KIAogLyoqCiAgKiBkb190aW1lcl9pbnRlcnJ1cHRfaG9vayAtIGhvb2sgaW50byB0aW1lciB0aWNrCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvbWFjaF9pcGkuaAppbmRleCA2ZjJiMTdhLi5jYzc1NmE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9tYWNoX2lwaS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L21hY2hfaXBpLmgKQEAgLTQsMTEgKzQsMzQgQEAKIHZvaWQgc2VuZF9JUElfbWFza19iaXRtYXNrKGNwdW1hc2tfdCBtYXNrLCBpbnQgdmVjdG9yKTsKIHZvaWQgX19zZW5kX0lQSV9zaG9ydGN1dCh1bnNpZ25lZCBpbnQgc2hvcnRjdXQsIGludCB2ZWN0b3IpOwogCitleHRlcm4gaW50IG5vX2Jyb2FkY2FzdDsKKwogc3RhdGljIGlubGluZSB2b2lkIHNlbmRfSVBJX21hc2soY3B1bWFza190IG1hc2ssIGludCB2ZWN0b3IpCiB7CiAJc2VuZF9JUElfbWFza19iaXRtYXNrKG1hc2ssIHZlY3Rvcik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xvY2FsX3NlbmRfSVBJX2FsbGJ1dHNlbGYoaW50IHZlY3RvcikKK3sKKwlpZiAobm9fYnJvYWRjYXN0KSB7CisJCWNwdW1hc2tfdCBtYXNrID0gY3B1X29ubGluZV9tYXA7CisJCWludCB0aGlzX2NwdSA9IGdldF9jcHUoKTsKKworCQljcHVfY2xlYXIodGhpc19jcHUsIG1hc2spOworCQlzZW5kX0lQSV9tYXNrKG1hc2ssIHZlY3Rvcik7CisJCXB1dF9jcHUoKTsKKwl9IGVsc2UKKwkJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMQlVULCB2ZWN0b3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19sb2NhbF9zZW5kX0lQSV9hbGwoaW50IHZlY3RvcikKK3sKKwlpZiAobm9fYnJvYWRjYXN0KQorCQlzZW5kX0lQSV9tYXNrKGNwdV9vbmxpbmVfbWFwLCB2ZWN0b3IpOworCWVsc2UKKwkJX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMSU5DLCB2ZWN0b3IpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfYWxsYnV0c2VsZihpbnQgdmVjdG9yKQogewogCS8qCkBAIC0xOCwxMyArNDEsMTMgQEAKIAlpZiAoIShudW1fb25saW5lX2NwdXMoKSA+IDEpKQogCQlyZXR1cm47CiAKLQlfX3NlbmRfSVBJX3Nob3J0Y3V0KEFQSUNfREVTVF9BTExCVVQsIHZlY3Rvcik7CisJX19sb2NhbF9zZW5kX0lQSV9hbGxidXRzZWxmKHZlY3Rvcik7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VuZF9JUElfYWxsKGludCB2ZWN0b3IpCiB7Ci0JX19zZW5kX0lQSV9zaG9ydGN1dChBUElDX0RFU1RfQUxMSU5DLCB2ZWN0b3IpOworCV9fbG9jYWxfc2VuZF9JUElfYWxsKHZlY3Rvcik7CiB9CiAKICNlbmRpZiAvKiBfX0FTTV9NQUNIX0lQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tbXpvbmUuaAppbmRleCAzM2NlNWQzLi41MTY0MjEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbW16b25lLmgKQEAgLTgsMjAgKzgsMTUgQEAKIAogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAotI2lmIENPTkZJR19OVU1BCisjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiBzdHJ1Y3QgcGdsaXN0X2RhdGEgKm5vZGVfZGF0YVtdOwogI2RlZmluZSBOT0RFX0RBVEEobmlkKQkobm9kZV9kYXRhW25pZF0pCiAKLSNpZmRlZiBDT05GSUdfTlVNQQotCSNpZmRlZiBDT05GSUdfWDg2X05VTUFRCi0JCSNpbmNsdWRlIDxhc20vbnVtYXEuaD4KLQkjZWxzZQkvKiBzdW1taXQgb3IgZ2VuZXJpYyBhcmNoICovCi0JCSNpbmNsdWRlIDxhc20vc3JhdC5oPgotCSNlbmRpZgotI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCi0JI2RlZmluZSBnZXRfbWVtY2ZnX251bWEgZ2V0X21lbWNmZ19udW1hX2ZsYXQKLQkjZGVmaW5lIGdldF96aG9sZXNfc2l6ZShuKSAoMCkKLSNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLworI2lmZGVmIENPTkZJR19YODZfTlVNQVEKKwkjaW5jbHVkZSA8YXNtL251bWFxLmg+CisjZWxzZQkvKiBzdW1taXQgb3IgZ2VuZXJpYyBhcmNoICovCisJI2luY2x1ZGUgPGFzbS9zcmF0Lmg+CisjZW5kaWYKIAogZXh0ZXJuIGludCBnZXRfbWVtY2ZnX251bWFfZmxhdCh2b2lkICk7CiAvKgpAQCAtNDIsNiArMzcsMTEgQEAKIAlnZXRfbWVtY2ZnX251bWFfZmxhdCgpOwogfQogCitleHRlcm4gaW50IGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pOworCisjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KKyNkZWZpbmUgZ2V0X21lbWNmZ19udW1hIGdldF9tZW1jZmdfbnVtYV9mbGF0CisjZGVmaW5lIGdldF96aG9sZXNfc2l6ZShuKSAoMCkKICNlbmRpZiAvKiBDT05GSUdfTlVNQSAqLwogCiAjaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQpAQCAtMTUxLDYgKzE1MSw0IEBACiAKICNlbmRpZiAvKiBDT05GSUdfTkVFRF9NVUxUSVBMRV9OT0RFUyAqLwogCi1leHRlcm4gaW50IGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pOwotCiAjZW5kaWYgLyogX0FTTV9NTVpPTkVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGFnZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmgKaW5kZXggZGVhOGY4ZS4uOGQ5M2Y3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wYWdlLmgKQEAgLTEyNiw5ICsxMjYsMTIgQEAKIAogI2lmZGVmIF9fQVNTRU1CTFlfXwogI2RlZmluZSBfX1BBR0VfT0ZGU0VUCQkoMHhDMDAwMDAwMCkKKyNkZWZpbmUgX19QSFlTSUNBTF9TVEFSVAlDT05GSUdfUEhZU0lDQUxfU1RBUlQKICNlbHNlCiAjZGVmaW5lIF9fUEFHRV9PRkZTRVQJCSgweEMwMDAwMDAwVUwpCisjZGVmaW5lIF9fUEhZU0lDQUxfU1RBUlQJKCh1bnNpZ25lZCBsb25nKUNPTkZJR19QSFlTSUNBTF9TVEFSVCkKICNlbmRpZgorI2RlZmluZSBfX0tFUk5FTF9TVEFSVAkJKF9fUEFHRV9PRkZTRVQgKyBfX1BIWVNJQ0FMX1NUQVJUKQogCiAKICNkZWZpbmUgUEFHRV9PRkZTRVQJCSgodW5zaWduZWQgbG9uZylfX1BBR0VfT0ZGU0VUKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wY2kuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGNpLmgKaW5kZXggZmI3NDliOC4uNzhjODU5ODVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGNpLmgKQEAgLTI3LDcgKzI3LDcgQEAKIHN0cnVjdCBwY2lfYnVzICogcGNpYmlvc19zY2FuX3Jvb3QoaW50IGJ1cyk7CiAKIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSk7Cit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKIHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUodm9pZCk7CiBpbnQgcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpbiwgaW50IGlycSk7CiAKQEAgLTk5LDYgKzk5LDE2IEBACiB7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKIC8qIGltcGxlbWVudCB0aGUgcGNpXyBETUEgQVBJIGluIHRlcm1zIG9mIHRoZSBnZW5lcmljIGRldmljZSBkbWFfIG9uZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKaW5kZXggYzc2YzUwZS4uNWQwNmU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCkBAIC02OTEsNSArNjkxLDE1IEBACiAjZGVmaW5lIGNhY2hlX2xpbmVfc2l6ZSgpIChib290X2NwdV9kYXRhLng4Nl9jYWNoZV9hbGlnbm1lbnQpCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGU7CitleHRlcm4gdm9pZCBlbmFibGVfc2VwX2NwdSh2b2lkKTsKK2V4dGVybiBpbnQgc3lzZW50ZXJfc2V0dXAodm9pZCk7CisKKyNpZmRlZiBDT05GSUdfTVRSUgorZXh0ZXJuIHZvaWQgbXRycl9hcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbXRycl9icF9pbml0KHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgbXRycl9hcF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG10cnJfYnBfaW5pdCgpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCiAKICNlbmRpZiAvKiBfX0FTTV9JMzg2X1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oIGIvaW5jbHVkZS9hc20taTM4Ni9zZXJpYWwuaAppbmRleCAyMWRkZWNjLi5lMWVjZmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc2VyaWFsLmgKQEAgLTIyLDEwOSArMjIsOSBAQAogI2RlZmluZSBTVERfQ09NNF9GTEFHUyBBU1lOQ19CT09UX0FVVE9DT05GCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBGT1VSUE9SVF9GTEFHUyBBU1lOQ19GT1VSUE9SVAotI2RlZmluZSBBQ0NFTlRfRkxBR1MgMAotI2RlZmluZSBCT0NBX0ZMQUdTIDAKLSNkZWZpbmUgSFVCNl9GTEFHUyAwCi0jZW5kaWYKLQotI2RlZmluZSBNQ0FfQ09NX0ZMQUdTCShTVERfQ09NX0ZMQUdTfEFTWU5DX0JPT1RfT05MWU1DQSkKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBhY2Nlc3MgbWV0aG9kcyBmb3IgdGhlIEhVQjYgY2FyZC4gQWxsCi0gKiBhY2Nlc3MgaXMgdGhyb3VnaCB0d28gcG9ydHMgZm9yIGFsbCAyNCBwb3NzaWJsZSBjaGlwcy4gVGhlIGNhcmQgaXMKLSAqIHNlbGVjdGVkIHRocm91Z2ggdGhlIGhpZ2ggMiBiaXRzLCB0aGUgcG9ydCBvbiB0aGF0IGNhcmQgd2l0aCB0aGUKLSAqICJtaWRkbGUiIDMgYml0cywgYW5kIHRoZSByZWdpc3RlciBvbiB0aGF0IHBvcnQgd2l0aCB0aGUgYm90dG9tCi0gKiAzIGJpdHMuCi0gKgotICogV2hpbGUgdGhlIGFjY2VzcyBwb3J0IGFuZCBpbnRlcnJ1cHQgaXMgY29uZmlndXJhYmxlLCB0aGUgZGVmYXVsdAotICogcG9ydCBsb2NhdGlvbnMgYXJlIDB4MzAyIGZvciB0aGUgcG9ydCBjb250cm9sIHJlZ2lzdGVyLCBhbmQgMHgzMDMKLSAqIGZvciB0aGUgZGF0YSByZWFkL3dyaXRlIHJlZ2lzdGVyLiBOb3JtYWxseSwgdGhlIGludGVycnVwdCBpcyBhdCBpcnEzCi0gKiBidXQgY2FuIGJlIGFueXRoaW5nIGZyb20gMyB0byA3IGluY2x1c2l2ZS4gTm90ZSB0aGF0IHVzaW5nIDMgd2lsbAotICogcmVxdWlyZSBkaXNhYmxpbmcgY29tMi4KLSAqLwotCi0jZGVmaW5lIENfUChjYXJkLHBvcnQpICgoKGNhcmQpPDw2fChwb3J0KTw8MykgKyAxKQotCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKIAkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMwICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRjgsIDMsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzEgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDNFOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMiAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkU4LCAzLCBTVERfQ09NNF9GTEFHUyB9LAkvKiB0dHlTMyAqLwotCi0KLSNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSNkZWZpbmUgRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUEwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LCAJLyogdHR5UzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFBOCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFCMCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFCOCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJBMCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJBOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCMCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzEwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQjgsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVMxMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzMwLCA0LCBBQ0NFTlRfRkxBR1MgfSwJLyogdHR5UzEyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzgsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTMgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkvKiB0dHlTMTQgKHNwYXJlKSAqLwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkvKiB0dHlTMTUgKHNwYXJlKSAqLwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDEwMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMDgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTEwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDExOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTI4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMzgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE0OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTU4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTcwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE3OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzMxICovCi0jZWxzZQotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwotI2VuZGlmCi0KLS8qIFlvdSBjYW4gaGF2ZSB1cCB0byBmb3VyIEhVQjYncyBpbiB0aGUgc3lzdGVtLCBidXQgSSd2ZSBvbmx5Ci0gKiBpbmNsdWRlZCB0d28gY2FyZHMgaGVyZSBmb3IgYSB0b3RhbCBvZiB0d2VsdmUgcG9ydHMuCi0gKi8KLSNpZiAoZGVmaW5lZChDT05GSUdfSFVCNikgJiYgZGVmaW5lZChDT05GSUdfU0VSSUFMX01BTllfUE9SVFMpKQotI2RlZmluZSBIVUI2X1NFUklBTF9QT1JUX0RGTlMJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDApIH0sICAvKiB0dHlTMzIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMSkgfSwgIC8qIHR0eVMzMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwyKSB9LCAgLyogdHR5UzM0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDMpIH0sICAvKiB0dHlTMzUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsNCkgfSwgIC8qIHR0eVMzNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw1KSB9LCAgLyogdHR5UzM3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDApIH0sICAvKiB0dHlTMzggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMSkgfSwgIC8qIHR0eVMzOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwyKSB9LCAgLyogdHR5UzQwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDMpIH0sICAvKiB0dHlTNDEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsNCkgfSwgIC8qIHR0eVM0MiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw1KSB9LCAgLyogdHR5UzQzICovCi0jZWxzZQotI2RlZmluZSBIVUI2X1NFUklBTF9QT1JUX0RGTlMKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01DQQotI2RlZmluZSBNQ0FfU0VSSUFMX1BPUlRfREZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMjIwLCAzLCBNQ0FfQ09NX0ZMQUdTIH0sCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMjI4LCAzLCBNQ0FfQ09NX0ZMQUdTIH0sCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHg0MjIwLCAzLCBNQ0FfQ09NX0ZMQUdTIH0sCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHg0MjI4LCAzLCBNQ0FfQ09NX0ZMQUdTIH0sCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHg1MjIwLCAzLCBNQ0FfQ09NX0ZMQUdTIH0sCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHg1MjI4LCAzLCBNQ0FfQ09NX0ZMQUdTIH0sCi0jZWxzZQotI2RlZmluZSBNQ0FfU0VSSUFMX1BPUlRfREZOUwotI2VuZGlmCi0KLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJXAotCVNURF9TRVJJQUxfUE9SVF9ERUZOUwkJXAotCUVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JSFVCNl9TRVJJQUxfUE9SVF9ERk5TCQlcCi0JTUNBX1NFUklBTF9QT1JUX0RGTlMKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zbXAuaCBiL2luY2x1ZGUvYXNtLWkzODYvc21wLmgKaW5kZXggNTVlZjMxZi4uZWRhZDliNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NtcC5oCkBAIC00MiwxMCArNDIsMTcgQEAKIGV4dGVybiB2b2lkIHNtcF9pbnZhbGlkYXRlX3Jjdih2b2lkKTsJCS8qIFByb2Nlc3MgYW4gTk1JICovCiBleHRlcm4gdm9pZCAoKm10cnJfaG9vaykgKHZvaWQpOwogZXh0ZXJuIHZvaWQgemFwX2xvd19tYXBwaW5ncyAodm9pZCk7CitleHRlcm4gdm9pZCBsb2NrX2lwaV9jYWxsX2xvY2sodm9pZCk7CitleHRlcm4gdm9pZCB1bmxvY2tfaXBpX2NhbGxfbG9jayh2b2lkKTsKIAogI2RlZmluZSBNQVhfQVBJQ0lEIDI1NgogZXh0ZXJuIHU4IHg4Nl9jcHVfdG9fYXBpY2lkW107CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK2V4dGVybiB2b2lkIGNwdV9leGl0X2NsZWFyKHZvaWQpOworZXh0ZXJuIHZvaWQgY3B1X3VuaW5pdCh2b2lkKTsKKyNlbmRpZgorCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgYnkgYWxsIFNNUCBzeXN0ZW1zLiBJdCBtdXN0IF9hbHdheXNfIGJlIHZhbGlkCiAgKiBmcm9tIHRoZSBpbml0aWFsIHN0YXJ0dXAuIFdlIG1hcCBBUElDX0JBU0UgdmVyeSBlYXJseSBpbiBwYWdlX3NldHVwKCksCkBAIC04Myw2ICs5MCw5IEBACiB9CiAKICNlbmRpZgorCitleHRlcm4gaW50IF9fY3B1X2Rpc2FibGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZGVmaW5lIE5PX1BST0NfSUQJCTB4RkYJCS8qIE5vIHByb2Nlc3NvciBtYWdpYyBtYXJrZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc3RyaW5nLmggYi9pbmNsdWRlL2FzbS1pMzg2L3N0cmluZy5oCmluZGV4IDZhNzhhYzUuLjAyYzhmNWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zdHJpbmcuaApAQCAtMTE2LDcgKzExNiw4IEBACiAJIm9yYiAkMSwlJWFsXG4iCiAJIjM6IgogCToiPWEiIChfX3JlcyksICI9JlMiIChkMCksICI9JkQiIChkMSkKLQkJICAgICA6IjEiIChjcyksIjIiIChjdCkpOworCToiMSIgKGNzKSwiMiIgKGN0KQorCToibWVtb3J5Iik7CiByZXR1cm4gX19yZXM7CiB9CiAKQEAgLTEzOCw4ICsxMzksOSBAQAogCSIzOlx0c2JibCAlJWVheCwlJWVheFxuXHQiCiAJIm9yYiAkMSwlJWFsXG4iCiAJIjQ6IgotCQkgICAgIDoiPWEiIChfX3JlcyksICI9JlMiIChkMCksICI9JkQiIChkMSksICI9JmMiIChkMikKLQkJICAgICA6IjEiIChjcyksIjIiIChjdCksIjMiIChjb3VudCkpOworCToiPWEiIChfX3JlcyksICI9JlMiIChkMCksICI9JkQiIChkMSksICI9JmMiIChkMikKKwk6IjEiIChjcyksIjIiIChjdCksIjMiIChjb3VudCkKKwk6Im1lbW9yeSIpOwogcmV0dXJuIF9fcmVzOwogfQogCkBAIC0xNTgsNyArMTYwLDkgQEAKIAkibW92bCAkMSwlMVxuIgogCSIyOlx0bW92bCAlMSwlMFxuXHQiCiAJImRlY2wgJTAiCi0JOiI9YSIgKF9fcmVzKSwgIj0mUyIgKGQwKSA6ICIxIiAocyksIjAiIChjKSk7CisJOiI9YSIgKF9fcmVzKSwgIj0mUyIgKGQwKQorCToiMSIgKHMpLCIwIiAoYykKKwk6Im1lbW9yeSIpOwogcmV0dXJuIF9fcmVzOwogfQogCkBAIC0xNzUsNyArMTc5LDkgQEAKIAkibGVhbCAtMSglJWVzaSksJTBcbiIKIAkiMjpcdHRlc3RiICUlYWwsJSVhbFxuXHQiCiAJImpuZSAxYiIKLQk6Ij1nIiAoX19yZXMpLCAiPSZTIiAoZDApLCAiPSZhIiAoZDEpIDoiMCIgKDApLCIxIiAocyksIjIiIChjKSk7CisJOiI9ZyIgKF9fcmVzKSwgIj0mUyIgKGQwKSwgIj0mYSIgKGQxKQorCToiMCIgKDApLCIxIiAocyksIjIiIChjKQorCToibWVtb3J5Iik7CiByZXR1cm4gX19yZXM7CiB9CiAKQEAgLTE4OSw3ICsxOTUsOSBAQAogCSJzY2FzYlxuXHQiCiAJIm5vdGwgJTBcblx0IgogCSJkZWNsICUwIgotCToiPWMiIChfX3JlcyksICI9JkQiIChkMCkgOiIxIiAocyksImEiICgwKSwgIjAiICgweGZmZmZmZmZmdSkpOworCToiPWMiIChfX3JlcyksICI9JkQiIChkMCkKKwk6IjEiIChzKSwiYSIgKDApLCAiMCIgKDB4ZmZmZmZmZmZ1KQorCToibWVtb3J5Iik7CiByZXR1cm4gX19yZXM7CiB9CiAKQEAgLTMzMyw3ICszNDEsOSBAQAogCSJqZSAxZlxuXHQiCiAJIm1vdmwgJDEsJTBcbiIKIAkiMTpcdGRlY2wgJTAiCi0JOiI9RCIgKF9fcmVzKSwgIj0mYyIgKGQwKSA6ICJhIiAoYyksIjAiIChjcyksIjEiIChjb3VudCkpOworCToiPUQiIChfX3JlcyksICI9JmMiIChkMCkKKwk6ImEiIChjKSwiMCIgKGNzKSwiMSIgKGNvdW50KQorCToibWVtb3J5Iik7CiByZXR1cm4gX19yZXM7CiB9CiAKQEAgLTM2OSw3ICszNzksNyBAQAogCSJqZSAyZlxuXHQiCiAJInN0b3NiXG4iCiAJIjI6IgotCTogIj0mYyIgKGQwKSwgIj0mRCIgKGQxKQorCToiPSZjIiAoZDApLCAiPSZEIiAoZDEpCiAJOiJhIiAoYyksICJxIiAoY291bnQpLCAiMCIgKGNvdW50LzQpLCAiMSIgKChsb25nKSBzKQogCToibWVtb3J5Iik7CiByZXR1cm4gKHMpOwkKQEAgLTM5Miw3ICs0MDIsOCBAQAogCSJqbmUgMWJcbiIKIAkiMzpcdHN1YmwgJTIsJTAiCiAJOiI9YSIgKF9fcmVzKSwgIj0mZCIgKGQwKQotCToiYyIgKHMpLCIxIiAoY291bnQpKTsKKwk6ImMiIChzKSwiMSIgKGNvdW50KQorCToibWVtb3J5Iik7CiByZXR1cm4gX19yZXM7CiB9CiAvKiBlbmQgb2YgYWRkaXRpb25hbCBzdHVmZiAqLwpAQCAtNDczLDcgKzQ4NCw4IEBACiAJCSJkZWMgJSVlZGlcbiIKIAkJIjE6IgogCQk6ICI9RCIgKGFkZHIpLCAiPWMiIChzaXplKQotCQk6ICIwIiAoYWRkciksICIxIiAoc2l6ZSksICJhIiAoYykpOworCQk6ICIwIiAoYWRkciksICIxIiAoc2l6ZSksICJhIiAoYykKKwkJOiAibWVtb3J5Iik7CiAJcmV0dXJuIGFkZHI7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLWkzODYvdGxiZmx1c2guaAppbmRleCBmMjJmYWIwLi5hYjIxNmUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90bGJmbHVzaC5oCkBAIC0yMiwxNiArMjIsMTggQEAKICAqLwogI2RlZmluZSBfX2ZsdXNoX3RsYl9nbG9iYWwoKQkJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGludCB0bXByZWc7CQkJCQlcCisJCXVuc2lnbmVkIGludCB0bXByZWcsIGNyNCwgY3I0X29yaWc7CQkJXAogCQkJCQkJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKLQkJCSJtb3ZsICUxLCAlJWNyNDsgICMgdHVybiBvZmYgUEdFICAgICBcbiIJXAorCQkJIm1vdmwgJSVjcjQsICUyOyAgIyB0dXJuIG9mZiBQR0UgICAgIFxuIglcCisJCQkibW92bCAlMiwgJTE7ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCVwKKwkJCSJhbmRsICUzLCAlMTsgICAgICAgICAgICAgICAgICAgICAgICBcbiIJXAorCQkJIm1vdmwgJTEsICUlY3I0OyAgICAgICAgICAgICAgICAgICAgIFxuIglcCiAJCQkibW92bCAlJWNyMywgJTA7ICAgICAgICAgICAgICAgICAgICAgXG4iCVwKIAkJCSJtb3ZsICUwLCAlJWNyMzsgICMgZmx1c2ggVExCICAgICAgICBcbiIJXAogCQkJIm1vdmwgJTIsICUlY3I0OyAgIyB0dXJuIFBHRSBiYWNrIG9uIFxuIglcCi0JCQk6ICI9JnIiICh0bXByZWcpCQkJCVwKLQkJCTogInIiIChtbXVfY3I0X2ZlYXR1cmVzICYgflg4Nl9DUjRfUEdFKSwJXAotCQkJICAiciIgKG1tdV9jcjRfZmVhdHVyZXMpCQkJXAorCQkJOiAiPSZyIiAodG1wcmVnKSwgIj0mciIgKGNyNCksICI9JnIiIChjcjRfb3JpZykJXAorCQkJOiAiaSIgKH5YODZfQ1I0X1BHRSkJCQkJXAogCQkJOiAibWVtb3J5Iik7CQkJCQlcCiAJfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20taTM4Ni90b3BvbG9neS5oCmluZGV4IDZkMGY2NzUuLjI0NjFiNzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RvcG9sb2d5LmgKQEAgLTc0LDExICs3NCwxNCBAQAogCS5pbWJhbGFuY2VfcGN0CQk9IDEyNSwJCQlcCiAJLmNhY2hlX2hvdF90aW1lCQk9ICgxMCoxMDAwMDAwKSwJCVwKIAkuY2FjaGVfbmljZV90cmllcwk9IDEsCQkJXAorCS5idXN5X2lkeAkJPSAzLAkJCVwKKwkuaWRsZV9pZHgJCT0gMSwJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDIsCQkJXAorCS53YWtlX2lkeAkJPSAxLAkJCVwKIAkucGVyX2NwdV9nYWluCQk9IDEwMCwJCQlcCiAJLmZsYWdzCQkJPSBTRF9MT0FEX0JBTEFOQ0UJXAogCQkJCXwgU0RfQkFMQU5DRV9FWEVDCVwKLQkJCQl8IFNEX0JBTEFOQ0VfTkVXSURMRQlcCi0JCQkJfCBTRF9XQUtFX0lETEUJCVwKKwkJCQl8IFNEX0JBTEFOQ0VfRk9SSwlcCiAJCQkJfCBTRF9XQUtFX0JBTEFOQ0UsCVwKIAkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCiAJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCmluZGV4IDE3NjQxM2YuLmE3Y2IzNzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaApAQCAtMjk0LDggKzI5NCwxMyBAQAogI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NgogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NwogI2RlZmluZSBfX05SX2tleWN0bAkJMjg4CisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg5CisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjkwCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MQorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MgorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkzCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMjg5CisjZGVmaW5lIE5SX3N5c2NhbGxzIDI5NAogCiAvKgogICogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjg6IHNlZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9hY3BpLmggYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAppbmRleCA2YTI2YTk3Li40YzA2ZDQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2FjcGkuaApAQCAtOTgsNiArOTgsMTUgQEAKIGludCBhY3BpX3JlcXVlc3RfdmVjdG9yICh1MzIgaW50X3R5cGUpOwogaW50IGFjcGlfZ3NpX3RvX2lycSAodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpOwogCisvKgorICogUmVjb3JkIHRoZSBjcGVpIG92ZXJyaWRlIGZsYWcgYW5kIGN1cnJlbnQgbG9naWNhbCBjcHUuIFRoaXMgaXMKKyAqIHVzZWZ1bCBmb3IgQ1BVIHJlbW92YWwuCisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgY2FuX2NwZWlfcmV0YXJnZXQodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IGlzX2NwdV9jcGVpX3RhcmdldCh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHNldF9jcGVpX3RhcmdldF9jcHUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdW5zaWduZWQgaW50IGdldF9jcGVpX3RhcmdldF9jcHUodm9pZCk7CisKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAvKiBQcm94aW1pdHkgYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAoOCBiaXQpKi8KICNkZWZpbmUgTUFYX1BYTV9ET01BSU5TICgyNTYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9od19pcnEuaAppbmRleCBjZDRlMDZiLi4wNDFhYjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmgKQEAgLTgxLDcgKzgxLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9pYTY0X2xzYXBpYzsJLyogQ1BVLWludGVybmFsIGludGVycnVwdCBjb250cm9sbGVyICovCiAKLWV4dGVybiBpbnQgYXNzaWduX2lycV92ZWN0b3Jfbm9wYW5pYyAoaW50IGlycSk7IC8qIGFsbG9jYXRlIGEgZnJlZSB2ZWN0b3Igd2l0aG91dCBwYW5pYyAqLwogZXh0ZXJuIGludCBhc3NpZ25faXJxX3ZlY3RvciAoaW50IGlycSk7CS8qIGFsbG9jYXRlIGEgZnJlZSB2ZWN0b3IgKi8KIGV4dGVybiB2b2lkIGZyZWVfaXJxX3ZlY3RvciAoaW50IHZlY3Rvcik7CiBleHRlcm4gdm9pZCBpYTY0X3NlbmRfaXBpIChpbnQgY3B1LCBpbnQgdmVjdG9yLCBpbnQgZGVsaXZlcnlfbW9kZSwgaW50IHJlZGlyZWN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaW9zYXBpYy5oIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKaW5kZXggMzhhN2E3Mi4uMTA5M2YzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pb3NhcGljLmgKQEAgLTcxLDggKzcxLDExIEBACiB9CiAKIGV4dGVybiB2b2lkIF9faW5pdCBpb3NhcGljX3N5c3RlbV9pbml0IChpbnQgcGNhdF9jb21wYXQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGlvc2FwaWNfaW5pdCAodW5zaWduZWQgbG9uZyBhZGRyZXNzLAorZXh0ZXJuIGludCBfX2RldmluaXQgaW9zYXBpY19pbml0ICh1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgIHVuc2lnbmVkIGludCBnc2lfYmFzZSk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUcKK2V4dGVybiBpbnQgaW9zYXBpY19yZW1vdmUgKHVuc2lnbmVkIGludCBnc2lfYmFzZSk7CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUcgKi8KIGV4dGVybiBpbnQgZ3NpX3RvX3ZlY3RvciAodW5zaWduZWQgaW50IGdzaSk7CiBleHRlcm4gaW50IGdzaV90b19pcnEgKHVuc2lnbmVkIGludCBnc2kpOwogZXh0ZXJuIHZvaWQgaW9zYXBpY19lbmFibGVfaW50ciAodW5zaWduZWQgaW50IHZlY3Rvcik7CkBAIC05NCwxMSArOTcsMTQgQEAKIAogZXh0ZXJuIHZvaWQgaW9zYXBpY19wY2lfZml4dXAgKGludCk7CiAjaWZkZWYgQ09ORklHX05VTUEKLWV4dGVybiB2b2lkIF9faW5pdCBtYXBfaW9zYXBpY190b19ub2RlICh1bnNpZ25lZCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBfX2RldmluaXQgbWFwX2lvc2FwaWNfdG9fbm9kZSAodW5zaWduZWQgaW50LCBpbnQpOwogI2VuZGlmCiAjZWxzZQogI2RlZmluZSBpb3NhcGljX3N5c3RlbV9pbml0KHBjYXRfY29tcGF0KQkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgaW9zYXBpY19pbml0KGFkZHJlc3MsZ3NpX2Jhc2UpCQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaW9zYXBpY19pbml0KGFkZHJlc3MsZ3NpX2Jhc2UpCQkJCSgtRUlOVkFMKQorI2lmZGVmIENPTkZJR19IT1RQTFVHCisjZGVmaW5lIGlvc2FwaWNfcmVtb3ZlKGdzaV9iYXNlKQkJCQkoLUVOT0RFVikKKyNlbmRpZiAvKiBDT05GSUdfSE9UUExVRyAqLwogI2RlZmluZSBpb3NhcGljX3JlZ2lzdGVyX2ludHIoZ3NpLHBvbGFyaXR5LHRyaWdnZXIpCQkoZ3NpKQogI2RlZmluZSBpb3NhcGljX3VucmVnaXN0ZXJfaW50cihpcnEpCQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgaW9zYXBpY19vdmVycmlkZV9pc2FfaXJxKGlzYV9pcnEsZ3NpLHBvbGFyaXR5LHRyaWdnZXIpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKaW5kZXggN2I3MDAwMy4uYmYzNmEzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9rcHJvYmVzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vYnJlYWsuaD4KIAorI2RlZmluZSBNQVhfSU5TTl9TSVpFICAgMTYKICNkZWZpbmUgQlJFQUtfSU5TVAkobG9uZykoX19JQTY0X0JSRUFLX0tQUk9CRSA8PCA2KQogCiB0eXBlZGVmIHVuaW9uIGNtcF9pbnN0IHsKQEAgLTYzLDYgKzY0LDggQEAKIAogI2RlZmluZSBKUFJPQkVfRU5UUlkocGVudHJ5KQkoa3Byb2JlX29wY29kZV90ICopcGVudHJ5CiAKKyNkZWZpbmUgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCisKICNkZWZpbmUgU0xPVDBfT1BDT0RFX1NISUZUCSgzNykKICNkZWZpbmUgU0xPVDFfcDFfT1BDT0RFX1NISUZUCSgzNyAtICg2NC00NikpCiAjZGVmaW5lIFNMT1QyX09QQ09ERV9TSElGVCAJKDM3KQpAQCAtOTQsMTEgKzk3LDYgQEAKIH07CiAKIC8qIGlhNjQgZG9lcyBub3QgbmVlZCB0aGlzICovCi1zdGF0aWMgaW5saW5lIHZvaWQganByb2JlX3JldHVybih2b2lkKQotewotfQotCi0vKiBpYTY0IGRvZXMgbm90IG5lZWQgdGhpcyAqLwogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKIHsKIH0KQEAgLTEwNiw2ICsxMDQsMTIgQEAKICNpZmRlZiBDT05GSUdfS1BST0JFUwogZXh0ZXJuIGludCBrcHJvYmVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSk7CisKKy8qIGlhNjQgZG9lcyBub3QgbmVlZCB0aGlzICovCitzdGF0aWMgaW5saW5lIHZvaWQganByb2JlX3JldHVybih2b2lkKQoreworfQorCiAjZWxzZQkJCQkvKiAhQ09ORklHX0tQUk9CRVMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGtwcm9iZV9leGNlcHRpb25zX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20taWE2NC9tbXVfY29udGV4dC5oCmluZGV4IDAwOTZlN2UuLmUzZTVmZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21tdV9jb250ZXh0LmgKQEAgLTEzMiw2ICsxMzIsOSBAQAogCWlhNjRfc3Jsel9pKCk7CQkJLyogc3Jsei5pIGltcGxpZXMgc3Jsei5kICovCiB9CiAKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHByZWVtcHRpb24gb2ZmCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAogYWN0aXZhdGVfY29udGV4dCAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21tem9uZS5oIGIvaW5jbHVkZS9hc20taWE2NC9tbXpvbmUuaAppbmRleCA4M2NhNDA0Li5kMzJmNTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbW16b25lLmgKQEAgLTE1LDYgKzE1LDggQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tZW1pbml0Lmg+CiAKKyNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisKIHN0YXRpYyBpbmxpbmUgaW50IHBmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAjaWZkZWYgQ09ORklHX05VTUEKQEAgLTI5LDggKzMxLDYgQEAKICNlbmRpZgogfQogCi0jaWZkZWYgQ09ORklHX0RJU0NPTlRJR01FTQotCiAjaWZkZWYgQ09ORklHX0lBNjRfRElHIC8qIERJRyBzeXN0ZW1zIGFyZSBzbWFsbCAqLwogIyBkZWZpbmUgTUFYX1BIWVNOT0RFX0lECTgKICMgZGVmaW5lIE5SX05PREVfTUVNQkxLUwkoTUFYX05VTU5PREVTICogOCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BjaS5oCmluZGV4IGE4MzE0ZWUuLmYxMTc3MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9wY2kuaApAQCAtNDcsNyArNDcsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLXBjaWJpb3NfcGVuYWxpemVfaXNhX2lycSAoaW50IGlycSkKK3BjaWJpb3NfcGVuYWxpemVfaXNhX2lycSAoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtODIsNiArODIsMjUgQEAKICNkZWZpbmUgc2dfZG1hX2xlbihzZykJCSgoc2cpLT5kbWFfbGVuZ3RoKQogI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKChzZyktPmRtYV9hZGRyZXNzKQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBjYWNoZWxpbmVfc2l6ZTsKKwl1OCBieXRlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmJ5dGUpOworCWlmIChieXRlID09IDApCisJCWNhY2hlbGluZV9zaXplID0gMTAyNDsKKwllbHNlCisJCWNhY2hlbGluZV9zaXplID0gKGludCkgYnl0ZSAqIDQ7CisKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX01VTFRJUExFOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSBjYWNoZWxpbmVfc2l6ZTsKK30KKyNlbmRpZgorCiAjZGVmaW5lIEhBVkVfUENJX01NQVAKIGV4dGVybiBpbnQgcGNpX21tYXBfcGFnZV9yYW5nZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NlY3Rpb25zLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NlY3Rpb25zLmgKaW5kZXggOGUzZGJkZS4uZTllYjdmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zZWN0aW9ucy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc2VjdGlvbnMuaApAQCAtMTcsNiArMTcsNyBAQAogZXh0ZXJuIGNoYXIgX19zdGFydF9nYXRlX2ZzeXNjYWxsX3BhdGNobGlzdFtdLCBfX2VuZF9nYXRlX2ZzeXNjYWxsX3BhdGNobGlzdFtdOwogZXh0ZXJuIGNoYXIgX19zdGFydF9nYXRlX2JybF9mc3lzX2J1YmJsZV9kb3duX3BhdGNobGlzdFtdLCBfX2VuZF9nYXRlX2JybF9mc3lzX2J1YmJsZV9kb3duX3BhdGNobGlzdFtdOwogZXh0ZXJuIGNoYXIgX19zdGFydF91bndpbmRbXSwgX19lbmRfdW53aW5kW107CitleHRlcm4gY2hhciBfX3N0YXJ0X2l2dF90ZXh0W10sIF9fZW5kX2l2dF90ZXh0W107CiAKICNlbmRpZiAvKiBfQVNNX0lBNjRfU0VDVElPTlNfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2FkZHJzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FkZHJzLmgKaW5kZXggMWJmZGZiNC4uMTAzZDc0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9hZGRycy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vYWRkcnMuaApAQCAtMjE2LDYgKzIxNiwxMCBAQAogI2RlZmluZSBUSU9fU1dJTl9XSURHRVROVU0oeCkJCSgoKHgpICA+PiBUSU9fU1dJTl9TSVpFX0JJVFMpICYgVElPX1NXSU5fV0lER0VUX01BU0spCiAKIAorI2RlZmluZSBUSU9fSU9TUEFDRV9BRERSKG4seCkJCQkJCVwKKwkvKiBNb3ZlIGluIHRoZSBDaGlwbGV0IElEIGZvciBUSU8gTG9jYWwgQmxvY2sgTU1SICovCVwKKwkoUkVNT1RFX0FERFIobix4KSB8IDFVTCA8PCAoTkFTSURfU0hJRlQgLSAyKSkKKwogLyoKICAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHByb2R1Y2UgdGhlIGNvcnJlY3QgYmFzZSB2aXJ0dWFsIGFkZHJlc3MgZm9yCiAgKiB0aGUgaHViIHJlZ2lzdGVycy4gVGhlIFJFTU9URV9IVUJfKiBtYWNybyBwcm9kdWNlCkBAIC0yMzMsMTMgKzIzNywxNiBAQAogI2RlZmluZSBSRU1PVEVfSFVCX0FERFIobix4KQkJCQkJCVwKIAkoKG4gJiAxKSA/CQkJCQkJCVwKIAkvKiBUSU86ICovCQkJCQkJCVwKLQkoKHZvbGF0aWxlIHU2NCAqKShHTE9CQUxfTU1SX0FERFIobix4KSkpCQkJXAotCTogLyogU0hVQjogKi8JCQkJCQkJXAotCSgoKHgpICYgQldJTl9UT1ApID8gKCh2b2xhdGlsZSB1NjQgKikoR0xPQkFMX01NUl9BRERSKG4seCkpKVwKKwkoaXNfc2h1YjIoKSA/CQkJCQkJCVwKKwkvKiBUSU8gb24gU2h1YjIgKi8JCQkJCQlcCisJKHZvbGF0aWxlIHU2NCAqKShUSU9fSU9TUEFDRV9BRERSKG4seCkpCQkJCVwKKwk6IC8qIFRJTyBvbiBzaHViMSAqLwkJCQkJCVwKKwkodm9sYXRpbGUgdTY0ICopKEdMT0JBTF9NTVJfQUREUihuLHgpKSkJCQkJXAorCQkJCQkJCQkJXAorCTogLyogU0hVQjEgYW5kIFNIVUIyIE1NUnM6ICovCQkJCQlcCisJKCgoeCkgJiBCV0lOX1RPUCkgPyAoKHZvbGF0aWxlIHU2NCAqKShHTE9CQUxfTU1SX0FERFIobix4KSkpCVwKIAk6ICgodm9sYXRpbGUgdTY0ICopKE5PREVfU1dJTl9CQVNFKG4sMSkgKyAweDgwMDAwMCArICh4KSkpKSkKIAotCi0KICNkZWZpbmUgSFVCX0woeCkJCQkoKigodm9sYXRpbGUgdHlwZW9mKCp4KSAqKXgpKQogI2RlZmluZQlIVUJfUyh4LGQpCQkJKCooKHZvbGF0aWxlIHR5cGVvZigqeCkgKil4KSA9IChkKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9hcmNoLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FyY2guaAppbmRleCA2MzVmZGNlLi5hYjgyN2QyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2FyY2guaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2FyY2guaApAQCAtMTEsNiArMTEsNyBAQAogI2lmbmRlZiBfQVNNX0lBNjRfU05fQVJDSF9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9BUkNIX0gKIAorI2luY2x1ZGUgPGxpbnV4L251bWEuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCmluZGV4IGU1MTQ3MWYuLmUxOTBkZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCkBAIC05LDYgKzksOCBAQAogI2lmbmRlZiBfQVNNX0lBNjRfU05fSU5UUl9ICiAjZGVmaW5lIF9BU01fSUE2NF9TTl9JTlRSX0gKIAorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKICNkZWZpbmUgU0dJX1VBUlRfVkVDVE9SCQkoMHhlOSkKICNkZWZpbmUgU0dJX1BDSUJSX0VSUk9SCQkoMHgzMykKIApAQCAtMzMsNyArMzUsNyBAQAogCiAvLyBUaGUgU04gUFJPTSBpcnEgc3RydWN0CiBzdHJ1Y3Qgc25faXJxX2luZm8gewotCXN0cnVjdCBzbl9pcnFfaW5mbyAqaXJxX25leHQ7CS8qIHNoYXJpbmcgaXJxIGxpc3QJICAgICAqLworCXN0cnVjdCBzbl9pcnFfaW5mbyAqaXJxX25leHQ7CS8qIGRlcHJlY2F0ZWQgRE8gTk9UIFVTRSAgICAgKi8KIAlzaG9ydAkJaXJxX25hc2lkOwkvKiBOYXNpZCBJUlEgaXMgYXNzaWduZWQgdG8gICovCiAJaW50CQlpcnFfc2xpY2U7CS8qIHNsaWNlIElSUSBpcyBhc3NpZ25lZCB0byAgKi8KIAlpbnQJCWlycV9jcHVpZDsJLyoga2VybmVsIGxvZ2ljYWwgY3B1aWQJICAgICAqLwpAQCAtNDcsNiArNDksOCBAQAogCWludAkJaXJxX2Nvb2tpZTsJLyogdW5pcXVlIGNvb2tpZSAJICAgICAqLwogCWludAkJaXJxX2ZsYWdzOwkvKiBmbGFncyAqLwogCWludAkJaXJxX3NoYXJlX2NudDsJLyogbnVtIGRldmljZXMgc2hhcmluZyBJUlEgICAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJLyogbGlzdCBvZiBzbl9pcnFfaW5mbyBzdHJ1Y3RzICovCisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CS8qIHJjdSBjYWxsYmFjayBsaXN0ICovCiB9OwogCiBleHRlcm4gdm9pZCBzbl9zZW5kX0lQSV9waHlzKGludCwgbG9uZywgaW50LCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9sMS5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9sMS5oCmluZGV4IDA4MDUwZDMuLjJlNWYwYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vbDEuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3NuL2wxLmgKQEAgLTMzLDUgKzMzLDYgQEAKICNkZWZpbmUgTDFfQlJJQ0tUWVBFX1BBCQkweDZhICAgICAgICAgICAgLyogaiAqLwogI2RlZmluZSBMMV9CUklDS1RZUEVfSUEJCTB4NmIgICAgICAgICAgICAvKiBrICovCiAjZGVmaW5lIEwxX0JSSUNLVFlQRV9BVEhFTkEJMHgyYiAgICAgICAgICAgIC8qICsgKi8KKyNkZWZpbmUgTDFfQlJJQ0tUWVBFX0RBWVRPTkEJMHg3YSAgICAgICAgICAgIC8qIHogKi8KIAogI2VuZGlmIC8qIF9BU01fSUE2NF9TTl9MMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliOGQyMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKi8KKyNpZm5kZWYgX0FTTV9JQTY0X1NOX1BDSV9QQ0lCUl9QUk9WSURFUl9ICisjZGVmaW5lIF9BU01fSUE2NF9TTl9QQ0lfUENJQlJfUFJPVklERVJfSAorCisjaW5jbHVkZSA8YXNtL3NuL2ludHIuaD4KKyNpbmNsdWRlIDxhc20vc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaD4KKworLyogV29ya2Fyb3VuZHMgKi8KKyNkZWZpbmUgUFY5MDc1MTYgKDEgPDwgMSkgLyogVElPQ1A6IERvbid0IHdyaXRlIHRoZSB3cml0ZSBidWZmZXIgZmx1c2ggcmVnICovCisKKyNkZWZpbmUgQlVTVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgICAweDEKKworLyogTWFjcm9zIGdpdmVuIGEgcGNpYnVzIHN0cnVjdHVyZSAqLworI2RlZmluZSBJU19QQ0lYKHBzKSAgICAgKChwcyktPnBiaV9icmlkZ2VfbW9kZSAmIEJVU1RZUEVfTUFTSykKKyNkZWZpbmUgSVNfUENJX0JSSURHRV9BU0lDKGFzaWMpIChhc2ljID09IFBDSUlPX0FTSUNfVFlQRV9QSUMgfHwgXAorICAgICAgICAgICAgICAgIGFzaWMgPT0gUENJSU9fQVNJQ19UWVBFX1RJT0NQKQorI2RlZmluZSBJU19QSUNfU09GVChwcykgICAgIChwcy0+cGJpX2JyaWRnZV90eXBlID09IFBDSUJSX0JSSURHRVRZUEVfUElDKQorCisKKy8qCisgKiBUaGUgZGlmZmVyZW50IFBDSSBCcmlkZ2UgdHlwZXMgc3VwcG9ydGVkIG9uIHRoZSBTR0kgQWx0aXggcGxhdGZvcm1zCisgKi8KKyNkZWZpbmUgUENJQlJfQlJJREdFVFlQRV9VTktOT1dOICAgICAgIC0xCisjZGVmaW5lIFBDSUJSX0JSSURHRVRZUEVfUElDICAgICAgICAgICAgMgorI2RlZmluZSBQQ0lCUl9CUklER0VUWVBFX1RJT0NQICAgICAgICAgIDMKKworLyoKKyAqIEJyaWRnZSA2NGJpdCBEaXJlY3QgTWFwIEF0dHJpYnV0ZXMKKyAqLworI2RlZmluZSBQQ0k2NF9BVFRSX1BSRUYgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU5KQorI2RlZmluZSBQQ0k2NF9BVFRSX1BSRUMgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU4KQorI2RlZmluZSBQQ0k2NF9BVFRSX1ZJUlRVQUwgICAgICAgICAgICAgICgxdWxsIDw8IDU3KQorI2RlZmluZSBQQ0k2NF9BVFRSX0JBUiAgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU2KQorI2RlZmluZSBQQ0k2NF9BVFRSX1NXQVAgICAgICAgICAgICAgICAgICgxdWxsIDw8IDU1KQorI2RlZmluZSBQQ0k2NF9BVFRSX1ZJUlRVQUwxICAgICAgICAgICAgICgxdWxsIDw8IDU0KQorCisjZGVmaW5lIFBDSTMyX0xPQ0FMX0JBU0UgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0kzMl9NQVBQRURfQkFTRSAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUENJMzJfRElSRUNUX0JBU0UgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgSVNfUENJMzJfTUFQUEVEKHgpICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSA8IFBDSTMyX0RJUkVDVF9CQVNFICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKKyNkZWZpbmUgSVNfUENJMzJfRElSRUNUKHgpICAgICAgICAgICAgICAoKHVpbnQ2NF90KSh4KSA+PSBQQ0kzMl9NQVBQRURfQkFTRSkKKworCisvKgorICogQnJpZGdlIFBNVSBBZGRyZXNzIFRyYW5zYWx0aW9uIEVudHJ5IEF0dGlidXRlcworICovCisjZGVmaW5lIFBDSTMyX0FURV9WICAgICAgICAgICAgICAgICAgICAgKDB4MSA8PCAwKQorI2RlZmluZSBQQ0kzMl9BVEVfQ08gICAgICAgICAgICAgICAgICAgICgweDEgPDwgMSkKKyNkZWZpbmUgUENJMzJfQVRFX1BSRUMgICAgICAgICAgICAgICAgICAoMHgxIDw8IDIpCisjZGVmaW5lIFBDSTMyX0FURV9QUkVGICAgICAgICAgICAgICAgICAgKDB4MSA8PCAzKQorI2RlZmluZSBQQ0kzMl9BVEVfQkFSICAgICAgICAgICAgICAgICAgICgweDEgPDwgNCkKKyNkZWZpbmUgUENJMzJfQVRFX0FERFJfU0hGVCAgICAgICAgICAgICAxMgorCisjZGVmaW5lIE1JTklNQUxfQVRFU19SRVFVSVJFRChhZGRyLCBzaXplKSBcCisJKElPUEcoSU9QR09GRihhZGRyKSArIChzaXplKSAtIDEpID09IElPUEcoKHNpemUpIC0gMSkpCisKKyNkZWZpbmUgTUlOSU1BTF9BVEVfRkxBRyhhZGRyLCBzaXplKSBcCisJKE1JTklNQUxfQVRFU19SRVFVSVJFRCgodWludDY0X3QpYWRkciwgc2l6ZSkgPyAxIDogMCkKKworLyogYml0IDI5IG9mIHRoZSBwY2kgYWRkcmVzcyBpcyB0aGUgU1dBUCBiaXQgKi8KKyNkZWZpbmUgQVRFX1NXQVBTSElGVCAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBBVEVfU1dBUF9PTih4KSAgICAgICAgICAgICAgICAgICgoeCkgfD0gKDEgPDwgQVRFX1NXQVBTSElGVCkpCisjZGVmaW5lIEFURV9TV0FQX09GRih4KSAgICAgICAgICAgICAgICAgKCh4KSAmPSB+KDEgPDwgQVRFX1NXQVBTSElGVCkpCisKKy8qCisgKiBJL08gcGFnZSBzaXplCisgKi8KKyNpZiBQQUdFX1NJWkUgPCAxNjM4NAorI2RlZmluZSBJT1BGTlNISUZUICAgICAgICAgICAgICAgICAgICAgIDEyICAgICAgLyogNEsgcGVyIG1hcHBlZCBwYWdlICovCisjZWxzZQorI2RlZmluZSBJT1BGTlNISUZUICAgICAgICAgICAgICAgICAgICAgIDE0ICAgICAgLyogMTZLIHBlciBtYXBwZWQgcGFnZSAqLworI2VuZGlmCisKKyNkZWZpbmUgSU9QR1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBJT1BGTlNISUZUKQorI2RlZmluZSBJT1BHKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoeCkgPj4gSU9QRk5TSElGVCkKKyNkZWZpbmUgSU9QR09GRih4KSAgICAgICAgICAgICAgICAgICAgICAoKHgpICYgKElPUEdTSVpFLTEpKQorCisjZGVmaW5lIFBDSUJSX0RFVl9TV0FQX0RJUiAgICAgICAgICAgICAgKDF1bGwgPDwgMTkpCisjZGVmaW5lIFBDSUJSX0NUUkxfUEFHRV9TSVpFICAgICAgICAgICAgKDB4MSA8PCAyMSkKKworLyoKKyAqIFBNVSByZXNvdXJjZXMuCisgKi8KK3N0cnVjdCBhdGVfcmVzb3VyY2V7CisJdWludDY0X3QgKmF0ZTsKKwl1aW50NjRfdCBudW1fYXRlOworCXVpbnQ2NF90IGxvd2VzdF9mcmVlX2luZGV4OworfTsKKworc3RydWN0IHBjaWJ1c19pbmZvIHsKKwlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQJcGJpX2J1c2NvbW1vbjsgICAvKiBjb21tb24gaGVhZGVyICovCisJdWludDMyX3QgICAgICAgICAgICAgICAgcGJpX21vZHVsZWlkOworCXNob3J0ICAgICAgICAgICAgICAgICAgIHBiaV9icmlkZ2VfdHlwZTsKKwlzaG9ydCAgICAgICAgICAgICAgICAgICBwYmlfYnJpZGdlX21vZGU7CisKKwlzdHJ1Y3QgYXRlX3Jlc291cmNlICAgICBwYmlfaW50X2F0ZV9yZXNvdXJjZTsKKwl1aW50NjRfdCAgICAgICAgICAgICAgICBwYmlfaW50X2F0ZV9zaXplOworCisJdWludDY0X3QgICAgICAgICAgICAgICAgcGJpX2Rpcl94YmFzZTsKKwljaGFyICAgICAgICAgICAgICAgICAgICBwYmlfaHViX3hpZDsKKworCXVpbnQ2NF90ICAgICAgICAgICAgICAgIHBiaV9kZXZyZWdbOF07CisKKwl1aW50MzJfdAkJcGJpX3ZhbGlkX2RldmljZXM7CisJdWludDMyX3QJCXBiaV9lbmFibGVkX2RldmljZXM7CisKKwlzcGlubG9ja190ICAgICAgICAgICAgICBwYmlfbG9jazsKK307CisKKy8qCisgKiBwY2lidXNfaW5mbyBzdHJ1Y3R1cmUgbG9ja2luZyBtYWNyb3MKKyAqLworaW5saW5lIHN0YXRpYyB1bnNpZ25lZCBsb25nCitwY2licl9sb2NrKHN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCXNwaW5fbG9ja19pcnFzYXZlKCZwY2lidXNfaW5mby0+cGJpX2xvY2ssIGZsYWcpOworCXJldHVybihmbGFnKTsKK30KKyNkZWZpbmUgcGNpYnJfdW5sb2NrKHBjaWJ1c19pbmZvLCBmbGFnKSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGNpYnVzX2luZm8tPnBiaV9sb2NrLCBmbGFnKQorCitleHRlcm4gaW50ICBwY2licl9pbml0X3Byb3ZpZGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgKnBjaWJyX2J1c19maXh1cChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKik7CitleHRlcm4gZG1hX2FkZHJfdCBwY2licl9kbWFfbWFwKHN0cnVjdCBwY2lfZGV2ICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCk7CitleHRlcm4gZG1hX2FkZHJfdCBwY2licl9kbWFfbWFwX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKK2V4dGVybiB2b2lkIHBjaWJyX2RtYV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqLCBkbWFfYWRkcl90LCBpbnQpOworCisvKgorICogcHJvdG90eXBlcyBmb3IgdGhlIGJyaWRnZSBhc2ljIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lcyBpbiBwY2licl9yZWcuYworICovCitleHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfY29udHJvbF9iaXRfY2xyKHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfY29udHJvbF9iaXRfc2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7CitleHRlcm4gdWludDY0X3QgICAgICAgICBwY2lyZWdfdGZsdXNoX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKik7CitleHRlcm4gdWludDY0X3QgICAgICAgICBwY2lyZWdfaW50cl9zdGF0dXNfZ2V0KHN0cnVjdCBwY2lidXNfaW5mbyAqKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19pbnRyX2VuYWJsZV9iaXRfY2xyKHN0cnVjdCBwY2lidXNfaW5mbyAqLCB1aW50NjRfdCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfaW50cl9lbmFibGVfYml0X3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgdWludDY0X3QpOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgcGNpcmVnX2ludHJfYWRkcl9hZGRyX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCB1aW50NjRfdCk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBwY2lyZWdfZm9yY2VfaW50cl9zZXQoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7CitleHRlcm4gdWludDY0X3QgICAgICAgICBwY2lyZWdfd3JiX2ZsdXNoX2dldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50KTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHBjaXJlZ19pbnRfYXRlX3NldChzdHJ1Y3QgcGNpYnVzX2luZm8gKiwgaW50LCB1aW50NjRfdCk7CitleHRlcm4gdWludDY0X3QgKglwY2lyZWdfaW50X2F0ZV9hZGRyKHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgCQlwY2licl9mb3JjZV9pbnRlcnJ1cHQoc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbyk7CitleHRlcm4gdm9pZCAJCXBjaWJyX2NoYW5nZV9kZXZpY2VzX2lycShzdHJ1Y3Qgc25faXJxX2luZm8gKnNuX2lycV9pbmZvKTsKK2V4dGVybiBpbnQgCQlwY2licl9hdGVfYWxsb2Moc3RydWN0IHBjaWJ1c19pbmZvICosIGludCk7CitleHRlcm4gdm9pZCAJCXBjaWJyX2F0ZV9mcmVlKHN0cnVjdCBwY2lidXNfaW5mbyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgCQlhdGVfd3JpdGUoc3RydWN0IHBjaWJ1c19pbmZvICosIGludCwgaW50LCB1aW50NjRfdCk7CitleHRlcm4gaW50IHNhbF9wY2licl9zbG90X2VuYWJsZShzdHJ1Y3QgcGNpYnVzX2luZm8gKnNvZnQsIGludCBkZXZpY2UsCisJCQkJIHZvaWQgKnJlc3ApOworZXh0ZXJuIGludCBzYWxfcGNpYnJfc2xvdF9kaXNhYmxlKHN0cnVjdCBwY2lidXNfaW5mbyAqc29mdCwgaW50IGRldmljZSwKKwkJCQkgIGludCBhY3Rpb24sIHZvaWQgKnJlc3ApOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lkZXYuaAppbmRleCBlZDQwMzFkLi40OTcxMWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWRldi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpZGV2LmgKQEAgLTEwLDExICsxMCwxMSBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLWV4dGVybiBzdHJ1Y3Qgc25faXJxX2luZm8gKipzbl9pcnE7Ci0KICNkZWZpbmUgU05fUENJREVWX0lORk8ocGNpX2RldikgXAogICAgICAgICAoKHN0cnVjdCBwY2lkZXZfaW5mbyAqKShwY2lfZGV2KS0+c3lzZGF0YSkKIAorI2RlZmluZSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHBjaV9idXMpIFwKKwkoc3RydWN0IHBjaWJ1c19pbmZvICopKChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKikoUENJX0NPTlRST0xMRVIoKHBjaV9idXMpKS0+cGxhdGZvcm1fZGF0YSkpCiAvKgogICogR2l2ZW4gYSBwY2lfYnVzLCByZXR1cm4gdGhlIHNuIHBjaWJ1c19idXNzb2Z0IHN0cnVjdC4gIE5vdGUgdGhhdAogICogdGhpcyBvbmx5IHdvcmtzIGZvciByb290IGJ1c3Nlcywgbm90IGZvciBidXNzZXMgcmVwcmVzZW50ZWQgYnkgUFBCJ3MuCkBAIC0yMyw2ICsyMyw4IEBACiAjZGVmaW5lIFNOX1BDSUJVU19CVVNTT0ZUKHBjaV9idXMpIFwKICAgICAgICAgKChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKikoUENJX0NPTlRST0xMRVIoKHBjaV9idXMpKS0+cGxhdGZvcm1fZGF0YSkpCiAKKyNkZWZpbmUgU05fUENJQlVTX0JVU1NPRlRfSU5GTyhwY2lfYnVzKSBcCisJKHN0cnVjdCBwY2lidXNfaW5mbyAqKSgoc3RydWN0IHBjaWJ1c19idXNzb2Z0ICopKFBDSV9DT05UUk9MTEVSKChwY2lfYnVzKSktPnBsYXRmb3JtX2RhdGEpKQogLyoKICAqIEdpdmVuIGEgc3RydWN0IHBjaV9kZXYsIHJldHVybiB0aGUgc24gcGNpYnVzX2J1c3NvZnQgc3RydWN0LiAgTm90ZQogICogdGhhdCB0aGlzIGlzIG5vdCBlcXVpdmFsZW50IHRvIFNOX1BDSUJVU19CVVNTT0ZUKHBjaV9kZXYtPmJ1cykgZHVlCkBAIC01MCw5ICs1MiwxNyBAQAogCiAJc3RydWN0IHNuX2lycV9pbmZvCSpwZGlfc25faXJxX2luZm87CiAJc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciAqcGRpX3Byb3ZpZGVyOwkvKiBzbiBwY2kgb3BzICovCisJc3RydWN0IHBjaV9kZXYgCQkqaG9zdF9wY2lfZGV2OwkJLyogaG9zdCBidXMgbGluayAqLwogfTsKIAogZXh0ZXJuIHZvaWQgc25faXJxX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAogCQkJIHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pOwotCitleHRlcm4gdm9pZCBzbl9pcnFfdW5maXh1cChzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldik7CitleHRlcm4gdm9pZCBzbl9wY2lfY29udHJvbGxlcl9maXh1cChpbnQgc2VnbWVudCwgaW50IGJ1c251bSwKKyAJCQkJICAgIHN0cnVjdCBwY2lfYnVzICpidXMpOworZXh0ZXJuIHZvaWQgc25fYnVzX3N0b3JlX3N5c2RhdGEoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBzbl9idXNfZnJlZV9zeXNkYXRhKHZvaWQpOworZXh0ZXJuIHZvaWQgc25fcGNpX2ZpeHVwX3Nsb3Qoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gdm9pZCBzbl9wY2lfdW5maXh1cF9zbG90KHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIHZvaWQgc25faXJxX2xoX2luaXQodm9pZCk7CiAjZW5kaWYJCQkJLyogX0FTTV9JQTY0X1NOX1BDSV9QQ0lERVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9zbi9waWMuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlODJlNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGljLmgKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgLSAxOTk3LCAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICovCisjaWZuZGVmIF9BU01fSUE2NF9TTl9QQ0lfUElDX0gKKyNkZWZpbmUgX0FTTV9JQTY0X1NOX1BDSV9QSUNfSAorCisvKgorICogUElDIEFTIERFVklDRSBaRVJPCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBQSUMgaGFuZGxlcyBQQ0kvWCBidXNzZXMuICBQQ0kvWCByZXF1aXJlcyB0aGF0IHRoZSAnYnJpZGdlJyAoaS5lLiBQSUMpCisgKiBiZSBkZXNpZ25hdGVkIGFzICdkZXZpY2UgMCcuICAgVGhhdCBpcyBhIGRlcGFydHVyZSBmcm9tIGVhcmxpZXIgU0dJCisgKiBQQ0kgYnJpZGdlcy4gIEJlY2F1c2Ugb2YgdGhhdCB3ZSB1c2UgY29uZmlnIHNwYWNlIDEgdG8gYWNjZXNzIHRoZQorICogY29uZmlnIHNwYWNlIG9mIHRoZSBmaXJzdCBhY3R1YWwgUENJIGRldmljZSBvbiB0aGUgYnVzLgorICogSGVyZSdzIHdoYXQgdGhlIFBJQyBtYW51YWwgc2F5czoKKyAqCisgKiAgICAgVGhlIGN1cnJlbnQgUENJLVggYnVzIHNwZWNpZmljYXRpb24gbm93IGRlZmluZXMgdGhhdCB0aGUgcGFyZW50CisgKiAgICAgaG9zdHMgYnVzIGJyaWRnZSAoUElDIGZvciBleGFtcGxlKSBtdXN0IGJlIGRldmljZSAwIG9uIGJ1cyAwLiBQSUMKKyAqICAgICByZWR1Y2VkIHRoZSB0b3RhbCBudW1iZXIgb2YgZGV2aWNlcyBmcm9tIDggdG8gNCBhbmQgcmVtb3ZlZCB0aGUKKyAqICAgICBkZXZpY2UgcmVnaXN0ZXJzIGFuZCB3aW5kb3dzLCBub3cgb25seSBzdXBwb3J0aW5nIGRldmljZXMgMCwxLDIsIGFuZAorICogICAgIDMuIFBJQyBkaWQgbGVhdmUgYWxsIDggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3dzLiBUaGUgcmVhc29uIHdhcworICogICAgIHRoZXJlIHdhcyBub3RoaW5nIHRvIGdhaW4gYnkgcmVtb3ZpbmcgdGhlbS4gSGVyZSBpbiBsaWVzIHRoZSBwcm9ibGVtLgorICogICAgIFRoZSBkZXZpY2UgbnVtYmVyaW5nIHdlIGRvIHVzaW5nIDAgdGhyb3VnaCAzIGlzIHVucmVsYXRlZCB0byB0aGUgZGV2aWNlCisgKiAgICAgbnVtYmVyaW5nIHdoaWNoIFBDSS1YIHJlcXVpcmVzIGluIGNvbmZpZ3VyYXRpb24gc3BhY2UuIEluIHRoZSBwYXN0IHdlCisgKiAgICAgY29ycmVsYXRlZCBDb25maWdzIHBhY2UgYW5kIG91ciBkZXZpY2Ugc3BhY2UgMCA8LT4gMCwgMSA8LT4gMSwgZXRjLgorICogICAgIFBDSS1YIHJlcXVpcmVzIHdlIHN0YXJ0IGEgMSwgbm90IDAgYW5kIGN1cnJlbnRseSB0aGUgUFggYnJpY2sKKyAqICAgICBkb2VzIGFzc29jaWF0ZSBvdXI6CisgKgorICogICAgICAgICBkZXZpY2UgMCB3aXRoIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2luZG93IDEsCisgKiAgICAgICAgIGRldmljZSAxIHdpdGggY29uZmlndXJhdGlvbiBzcGFjZSB3aW5kb3cgMiwKKyAqICAgICAgICAgZGV2aWNlIDIgd2l0aCBjb25maWd1cmF0aW9uIHNwYWNlIHdpbmRvdyAzLAorICogICAgICAgICBkZXZpY2UgMyB3aXRoIGNvbmZpZ3VyYXRpb24gc3BhY2Ugd2luZG93IDQuCisgKgorICogVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCBhbGwgY29uZmlnIHNwYWNlIGFjY2VzcyBhcmUgb2ZmLWJ5LW9uZSB3aXRoCisgKiByZWxhdGlvbiB0byBvdGhlciBwZXItc2xvdCBhY2Nlc3NlcyBvbiB0aGUgUElDLgorICogSGVyZSBpcyBhIHRhYmxlIHRoYXQgc2hvd3Mgc29tZSBvZiB0aGF0OgorICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsIFNsb3QjCisgKiAgICAgICAgICAgfAorICogICAgICAgICAgIHwgICAgIDAgICAgICAgICAxICAgICAgICAyICAgICAgICAgMworICogLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNvbmZpZyAgICB8ICAweDIxMDAwICAgMHgyMjAwMCAgMHgyMzAwMCAgIDB4MjQwMDAKKyAqICAgICAgICAgICB8CisgKiBldmVuIHJyYiAgfCAgMFswXSAgICAgIG4vYSAgICAgIDFbMF0gICAgICBuL2EJW10gPT0gaW1wbGllZCBldmVuL29kZAorICogICAgICAgICAgIHwKKyAqIG9kZCBycmIgICB8ICBuL2EgICAgICAgMFsxXSAgICAgbi9hICAgICAgIDFbMV0KKyAqICAgICAgICAgICB8CisgKiBpbnQgZGV2ICAgfCAgMDAgICAgICAgMDEgICAgICAgIDEwICAgICAgICAxMQorICogICAgICAgICAgIHwKKyAqIGV4dCBzbG90IyB8ICAxICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQKKyAqIC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2RlZmluZSBQSUNfQVRFX1RBUkdFVElEX1NIRlQgICAgICAgICAgIDgKKyNkZWZpbmUgUElDX0hPU1RfSU5UUl9BRERSICAgICAgICAgICAgICAweDAwMDBGRkZGRkZGRkZGRkZVTAorI2RlZmluZSBQSUNfUENJNjRfQVRUUl9UQVJHX1NIRlQgICAgICAgIDYwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKiogUElDIE1NUiBzdHJ1Y3R1cmUgbWFwcGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTk9URTogUElDIFdBUi4gUFYjODU0Njk3LiAgUElDIGRvZXMgbm90IGFsbG93IHdyaXRlcyBqdXN0IHRvIFszMTowXQorICogb2YgYSA2NC1iaXQgcmVnaXN0ZXIuICBXaGVuIHdyaXRpbmcgUElDIHJlZ2lzdGVycywgYWx3YXlzIHdyaXRlIHRoZQorICogZW50aXJlIDY0IGJpdHMuCisgKi8KKworc3RydWN0IHBpYyB7CisKKyAgICAvKiAweDAwMDAwMC0weDAwRkZGRiAtLSBMb2NhbCBSZWdpc3RlcnMgKi8KKworICAgIC8qIDB4MDAwMDAwLTB4MDAwMDU3IC0tIFN0YW5kYXJkIFdpZGdldCBDb25maWd1cmF0aW9uICovCisgICAgdWludDY0X3QJCXBfd2lkX2lkOwkJCS8qIDB4MDAwMDAwICovCisgICAgdWludDY0X3QJCXBfd2lkX3N0YXQ7CQkJLyogMHgwMDAwMDggKi8KKyAgICB1aW50NjRfdAkJcF93aWRfZXJyX3VwcGVyOwkJLyogMHgwMDAwMTAgKi8KKyAgICB1aW50NjRfdAkJcF93aWRfZXJyX2xvd2VyOwkJLyogMHgwMDAwMTggKi8KKyAgICAjZGVmaW5lIHBfd2lkX2VyciBwX3dpZF9lcnJfbG93ZXIKKyAgICB1aW50NjRfdAkJcF93aWRfY29udHJvbDsJCQkvKiAweDAwMDAyMCAqLworICAgIHVpbnQ2NF90CQlwX3dpZF9yZXFfdGltZW91dDsJCS8qIDB4MDAwMDI4ICovCisgICAgdWludDY0X3QJCXBfd2lkX2ludF91cHBlcjsJCS8qIDB4MDAwMDMwICovCisgICAgdWludDY0X3QJCXBfd2lkX2ludF9sb3dlcjsJCS8qIDB4MDAwMDM4ICovCisgICAgI2RlZmluZSBwX3dpZF9pbnQgcF93aWRfaW50X2xvd2VyCisgICAgdWludDY0X3QJCXBfd2lkX2Vycl9jbWR3b3JkOwkJLyogMHgwMDAwNDAgKi8KKyAgICB1aW50NjRfdAkJcF93aWRfbGxwOwkJCS8qIDB4MDAwMDQ4ICovCisgICAgdWludDY0X3QJCXBfd2lkX3RmbHVzaDsJCQkvKiAweDAwMDA1MCAqLworCisgICAgLyogMHgwMDAwNTgtMHgwMDAwN0YgLS0gQnJpZGdlLXNwZWNpZmljIFdpZGdldCBDb25maWd1cmF0aW9uICovCisgICAgdWludDY0X3QJCXBfd2lkX2F1eF9lcnI7CQkJLyogMHgwMDAwNTggKi8KKyAgICB1aW50NjRfdAkJcF93aWRfcmVzcF91cHBlcjsJCS8qIDB4MDAwMDYwICovCisgICAgdWludDY0X3QJCXBfd2lkX3Jlc3BfbG93ZXI7CQkvKiAweDAwMDA2OCAqLworICAgICNkZWZpbmUgcF93aWRfcmVzcCBwX3dpZF9yZXNwX2xvd2VyCisgICAgdWludDY0X3QJCXBfd2lkX3RzdF9waW5fY3RybDsJCS8qIDB4MDAwMDcwICovCisgICAgdWludDY0X3QJCXBfd2lkX2FkZHJfbGtlcnI7CQkvKiAweDAwMDA3OCAqLworCisgICAgLyogMHgwMDAwODAtMHgwMDAwOEYgLS0gUE1VICYgTUFQICovCisgICAgdWludDY0X3QJCXBfZGlyX21hcDsJCQkvKiAweDAwMDA4MCAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDA4ODsJCQkvKiAweDAwMDA4OCAqLworCisgICAgLyogMHgwMDAwOTAtMHgwMDAwOUYgLS0gU1NSQU0gKi8KKyAgICB1aW50NjRfdAkJcF9tYXBfZmF1bHQ7CQkJLyogMHgwMDAwOTAgKi8KKyAgICB1aW50NjRfdAkJX3BhZF8wMDAwOTg7CQkJLyogMHgwMDAwOTggKi8KKworICAgIC8qIDB4MDAwMEEwLTB4MDAwMEFGIC0tIEFyYml0cmF0aW9uICovCisgICAgdWludDY0X3QJCXBfYXJiOwkJCQkvKiAweDAwMDBBMCAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDBBODsJCQkvKiAweDAwMDBBOCAqLworCisgICAgLyogMHgwMDAwQjAtMHgwMDAwQkYgLS0gTnVtYmVyIEluIEEgQ2FuIG9yIEFURSBQYXJpdHkgRXJyb3IgKi8KKyAgICB1aW50NjRfdAkJcF9hdGVfcGFyaXR5X2VycjsJCS8qIDB4MDAwMEIwICovCisgICAgdWludDY0X3QJCV9wYWRfMDAwMEI4OwkJCS8qIDB4MDAwMEI4ICovCisKKyAgICAvKiAweDAwMDBDMC0weDAwMDBGRiAtLSBQQ0kvR0lPICovCisgICAgdWludDY0X3QJCXBfYnVzX3RpbWVvdXQ7CQkJLyogMHgwMDAwQzAgKi8KKyAgICB1aW50NjRfdAkJcF9wY2lfY2ZnOwkJCS8qIDB4MDAwMEM4ICovCisgICAgdWludDY0X3QJCXBfcGNpX2Vycl91cHBlcjsJCS8qIDB4MDAwMEQwICovCisgICAgdWludDY0X3QJCXBfcGNpX2Vycl9sb3dlcjsJCS8qIDB4MDAwMEQ4ICovCisgICAgI2RlZmluZSBwX3BjaV9lcnIgcF9wY2lfZXJyX2xvd2VyCisgICAgdWludDY0X3QJCV9wYWRfMDAwMEUwWzRdOwkJCS8qIDB4MDAwMHtFMC4uRjh9ICovCisKKyAgICAvKiAweDAwMDEwMC0weDAwMDFGRiAtLSBJbnRlcnJ1cHQgKi8KKyAgICB1aW50NjRfdAkJcF9pbnRfc3RhdHVzOwkJCS8qIDB4MDAwMTAwICovCisgICAgdWludDY0X3QJCXBfaW50X2VuYWJsZTsJCQkvKiAweDAwMDEwOCAqLworICAgIHVpbnQ2NF90CQlwX2ludF9yc3Rfc3RhdDsJCQkvKiAweDAwMDExMCAqLworICAgIHVpbnQ2NF90CQlwX2ludF9tb2RlOwkJCS8qIDB4MDAwMTE4ICovCisgICAgdWludDY0X3QJCXBfaW50X2RldmljZTsJCQkvKiAweDAwMDEyMCAqLworICAgIHVpbnQ2NF90CQlwX2ludF9ob3N0X2VycjsJCQkvKiAweDAwMDEyOCAqLworICAgIHVpbnQ2NF90CQlwX2ludF9hZGRyWzhdOwkJCS8qIDB4MDAwMXszMCwsLDY4fSAqLworICAgIHVpbnQ2NF90CQlwX2Vycl9pbnRfdmlldzsJCQkvKiAweDAwMDE3MCAqLworICAgIHVpbnQ2NF90CQlwX211bHRfaW50OwkJCS8qIDB4MDAwMTc4ICovCisgICAgdWludDY0X3QJCXBfZm9yY2VfYWx3YXlzWzhdOwkJLyogMHgwMDAxezgwLCwsQjh9ICovCisgICAgdWludDY0X3QJCXBfZm9yY2VfcGluWzhdOwkJCS8qIDB4MDAwMXtDMCwsLEY4fSAqLworCisgICAgLyogMHgwMDAyMDAtMHgwMDAyOTggLS0gRGV2aWNlICovCisgICAgdWludDY0X3QJCXBfZGV2aWNlWzRdOwkJCS8qIDB4MDAwMnswMCwsLDE4fSAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDIyMFs0XTsJCQkvKiAweDAwMDJ7MjAsLCwzOH0gKi8KKyAgICB1aW50NjRfdAkJcF93cl9yZXFfYnVmWzRdOwkJLyogMHgwMDAyezQwLCwsNTh9ICovCisgICAgdWludDY0X3QJCV9wYWRfMDAwMjYwWzRdOwkJCS8qIDB4MDAwMns2MCwsLDc4fSAqLworICAgIHVpbnQ2NF90CQlwX3JyYl9tYXBbMl07CQkJLyogMHgwMDAyezgwLCwsODh9ICovCisgICAgI2RlZmluZSBwX2V2ZW5fcmVzcCBwX3JyYl9tYXBbMF0JCQkvKiAweDAwMDI4MCAqLworICAgICNkZWZpbmUgcF9vZGRfcmVzcCAgcF9ycmJfbWFwWzFdCQkJLyogMHgwMDAyODggKi8KKyAgICB1aW50NjRfdAkJcF9yZXNwX3N0YXR1czsJCQkvKiAweDAwMDI5MCAqLworICAgIHVpbnQ2NF90CQlwX3Jlc3BfY2xlYXI7CQkJLyogMHgwMDAyOTggKi8KKworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDJBMFsxMl07CQkvKiAweDAwMDJ7QTAuLkY4fSAqLworCisgICAgLyogMHgwMDAzMDAtMHgwMDAzRjggLS0gQnVmZmVyIEFkZHJlc3MgTWF0Y2ggUmVnaXN0ZXJzICovCisgICAgc3RydWN0IHsKKwl1aW50NjRfdAl1cHBlcjsJCQkJLyogMHgwMDAzezAwLCwsRjB9ICovCisJdWludDY0X3QJbG93ZXI7CQkJCS8qIDB4MDAwM3swOCwsLEY4fSAqLworICAgIH0gcF9idWZfYWRkcl9tYXRjaFsxNl07CisKKyAgICAvKiAweDAwMDQwMC0weDAwMDVGRiAtLSBQZXJmb3JtYW5jZSBNb25pdG9yIFJlZ2lzdGVycyAoZXZlbiBvbmx5KSAqLworICAgIHN0cnVjdCB7CisJdWludDY0X3QJZmx1c2hfd190b3VjaDsJCQkvKiAweDAwMHs0MDAsLCw1QzB9ICovCisJdWludDY0X3QJZmx1c2hfd29fdG91Y2g7CQkJLyogMHgwMDB7NDA4LCwsNUM4fSAqLworCXVpbnQ2NF90CWluZmxpZ2h0OwkJCS8qIDB4MDAwezQxMCwsLDVEMH0gKi8KKwl1aW50NjRfdAlwcmVmZXRjaDsJCQkvKiAweDAwMHs0MTgsLCw1RDh9ICovCisJdWludDY0X3QJdG90YWxfcGNpX3JldHJ5OwkJLyogMHgwMDB7NDIwLCwsNUUwfSAqLworCXVpbnQ2NF90CW1heF9wY2lfcmV0cnk7CQkJLyogMHgwMDB7NDI4LCwsNUU4fSAqLworCXVpbnQ2NF90CW1heF9sYXRlbmN5OwkJCS8qIDB4MDAwezQzMCwsLDVGMH0gKi8KKwl1aW50NjRfdAljbGVhcl9hbGw7CQkJLyogMHgwMDB7NDM4LCwsNUY4fSAqLworICAgIH0gcF9idWZfY291bnRbOF07CisKKworICAgIC8qIDB4MDAwNjAwLTB4MDAwOUZGIC0tIFBDSS9YIHJlZ2lzdGVycyAqLworICAgIHVpbnQ2NF90CQlwX3BjaXhfYnVzX2Vycl9hZGRyOwkJLyogMHgwMDA2MDAgKi8KKyAgICB1aW50NjRfdAkJcF9wY2l4X2J1c19lcnJfYXR0cjsJCS8qIDB4MDAwNjA4ICovCisgICAgdWludDY0X3QJCXBfcGNpeF9idXNfZXJyX2RhdGE7CQkvKiAweDAwMDYxMCAqLworICAgIHVpbnQ2NF90CQlwX3BjaXhfcGlvX3NwbGl0X2FkZHI7CQkvKiAweDAwMDYxOCAqLworICAgIHVpbnQ2NF90CQlwX3BjaXhfcGlvX3NwbGl0X2F0dHI7CQkvKiAweDAwMDYyMCAqLworICAgIHVpbnQ2NF90CQlwX3BjaXhfZG1hX3JlcV9lcnJfYXR0cjsJLyogMHgwMDA2MjggKi8KKyAgICB1aW50NjRfdAkJcF9wY2l4X2RtYV9yZXFfZXJyX2FkZHI7CS8qIDB4MDAwNjMwICovCisgICAgdWludDY0X3QJCXBfcGNpeF90aW1lb3V0OwkJCS8qIDB4MDAwNjM4ICovCisKKyAgICB1aW50NjRfdAkJX3BhZF8wMDA2NDBbMTIwXTsJCS8qIDB4MDAwezY0MCwsLDlGOH0gKi8KKworICAgIC8qIDB4MDAwQTAwLTB4MDAwQkZGIC0tIFBDSS9YIFJlYWQmV3JpdGUgQnVmZmVyICovCisgICAgc3RydWN0IHsKKwl1aW50NjRfdAlwX2J1Zl9hZGRyOwkJCS8qIDB4MDAwe0EwMCwsLEFGMH0gKi8KKwl1aW50NjRfdAlwX2J1Zl9hdHRyOwkJCS8qIDBYMDAwe0EwOCwsLEFGOH0gKi8KKyAgICB9IHBfcGNpeF9yZWFkX2J1Zl82NFsxNl07CisKKyAgICBzdHJ1Y3QgeworCXVpbnQ2NF90CXBfYnVmX2FkZHI7CQkJLyogMHgwMDB7QjAwLCwsQkUwfSAqLworCXVpbnQ2NF90CXBfYnVmX2F0dHI7CQkJLyogMHgwMDB7QjA4LCwsQkU4fSAqLworCXVpbnQ2NF90CXBfYnVmX3ZhbGlkOwkJCS8qIDB4MDAwe0IxMCwsLEJGMH0gKi8KKwl1aW50NjRfdAlfX3BhZDE7CQkJCS8qIDB4MDAwe0IxOCwsLEJGOH0gKi8KKyAgICB9IHBfcGNpeF93cml0ZV9idWZfNjRbOF07CisKKyAgICAvKiBFbmQgb2YgTG9jYWwgUmVnaXN0ZXJzIC0tIFN0YXJ0IG9mIEFkZHJlc3MgTWFwIHNwYWNlICovCisKKyAgICBjaGFyCQlfcGFkXzAwMGMwMFsweDAxMDAwMCAtIDB4MDAwYzAwXTsKKworICAgIC8qIDB4MDEwMDAwLTB4MDExZmZmIC0tIEludGVybmFsIEFURSBSQU0gKEF1dG8gUGFyaXR5IEdlbmVyYXRpb24pICovCisgICAgdWludDY0X3QJCXBfaW50X2F0ZV9yYW1bMTAyNF07CQkvKiAweDAxMDAwMC0weDAxMWZmZiAqLworCisgICAgLyogMHgwMTIwMDAtMHgwMTNmZmYgLS0gSW50ZXJuYWwgQVRFIFJBTSAoTWFudWFsIFBhcml0eSBHZW5lcmF0aW9uKSAqLworICAgIHVpbnQ2NF90CQlwX2ludF9hdGVfcmFtX21wWzEwMjRdOwkJLyogMHgwMTIwMDAtMHgwMTNmZmYgKi8KKworICAgIGNoYXIJCV9wYWRfMDE0MDAwWzB4MTgwMDAgLSAweDAxNDAwMF07CisKKyAgICAvKiAweDE4MDAwLTB4MTk3RjggLS0gUElDIFdyaXRlIFJlcXVlc3QgUmFtICovCisgICAgdWludDY0X3QJCXBfd3JfcmVxX2xvd2VyWzI1Nl07CQkvKiAweDE4MDAwIC0gMHgxODdGOCAqLworICAgIHVpbnQ2NF90CQlwX3dyX3JlcV91cHBlclsyNTZdOwkJLyogMHgxODgwMCAtIDB4MThGRjggKi8KKyAgICB1aW50NjRfdAkJcF93cl9yZXFfcGFyaXR5WzI1Nl07CQkvKiAweDE5MDAwIC0gMHgxOTdGOCAqLworCisgICAgY2hhcgkJX3BhZF8wMTk4MDBbMHgyMDAwMCAtIDB4MDE5ODAwXTsKKworICAgIC8qIDB4MDIwMDAwLTB4MDI3RkZGIC0tIFBDSSBEZXZpY2UgQ29uZmlndXJhdGlvbiBTcGFjZXMgKi8KKyAgICB1bmlvbiB7CisJdWludDhfdAkJY1sweDEwMDAgLyAxXTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXVpbnQxNl90CXNbMHgxMDAwIC8gMl07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KKwl1aW50MzJfdAlsWzB4MTAwMCAvIDRdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCisJdWludDY0X3QJZFsweDEwMDAgLyA4XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXVuaW9uIHsKKwkgICAgdWludDhfdAljWzB4MTAwIC8gMV07CisJICAgIHVpbnQxNl90CXNbMHgxMDAgLyAyXTsKKwkgICAgdWludDMyX3QJbFsweDEwMCAvIDRdOworCSAgICB1aW50NjRfdAlkWzB4MTAwIC8gOF07CisJfSBmWzhdOworICAgIH0gcF90eXBlMF9jZmdfZGV2WzhdOwkJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCisgICAgLyogMHgwMjgwMDAtMHgwMjhGRkYgLS0gUENJIFR5cGUgMSBDb25maWd1cmF0aW9uIFNwYWNlICovCisgICAgdW5pb24geworCXVpbnQ4X3QJCWNbMHgxMDAwIC8gMV07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KKwl1aW50MTZfdAlzWzB4MTAwMCAvIDJdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCisJdWludDMyX3QJbFsweDEwMDAgLyA0XTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLworCXVpbnQ2NF90CWRbMHgxMDAwIC8gOF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KKwl1bmlvbiB7CisJICAgIHVpbnQ4X3QJY1sweDEwMCAvIDFdOworCSAgICB1aW50MTZfdAlzWzB4MTAwIC8gMl07CisJICAgIHVpbnQzMl90CWxbMHgxMDAgLyA0XTsKKwkgICAgdWludDY0X3QJZFsweDEwMCAvIDhdOworCX0gZls4XTsKKyAgICB9IHBfdHlwZTFfY2ZnOwkJCQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KKworICAgIGNoYXIJCV9wYWRfMDI5MDAwWzB4MDMwMDAwLTB4MDI5MDAwXTsKKworICAgIC8qIDB4MDMwMDAwLTB4MDMwMDA3IC0tIFBDSSBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgQ3ljbGUgKi8KKyAgICB1bmlvbiB7CisJdWludDhfdAkJY1s4IC8gMV07CisJdWludDE2X3QJc1s4IC8gMl07CisJdWludDMyX3QJbFs4IC8gNF07CisJdWludDY0X3QJZFs4IC8gOF07CisgICAgfSBwX3BjaV9pYWNrOwkJCQkJLyogMHgwMzAwMDAtMHgwMzAwMDcgKi8KKworICAgIGNoYXIJCV9wYWRfMDMwMDA3WzB4MDQwMDAwLTB4MDMwMDA4XTsKKworICAgIC8qIDB4MDQwMDAwLTB4MDMwMDA3IC0tIFBDSVggU3BlY2lhbCBDeWNsZSAqLworICAgIHVuaW9uIHsKKwl1aW50OF90CQljWzggLyAxXTsKKwl1aW50MTZfdAlzWzggLyAyXTsKKwl1aW50MzJfdAlsWzggLyA0XTsKKwl1aW50NjRfdAlkWzggLyA4XTsKKyAgICB9IHBfcGNpeF9jeWNsZTsJCQkJCS8qIDB4MDQwMDAwLTB4MDQwMDA3ICovCit9OworCisjZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9BU01fSUE2NF9TTl9QQ0lfUElDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc2h1Yl9tbXIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc2h1Yl9tbXIuaAppbmRleCAzMjNmYTBjLi43ZGUxZDFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NodWJfbW1yLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zaHViX21tci5oCkBAIC0xNCw5NiArMTQsOTggQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX0lQSV9JTlQiICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgIFNIdWIgSW50ZXItUHJvY2Vzc29yIEludGVycnVwdCBSZWdpc3RlcnMgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU0gxX0lQSV9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDAwMzgwCi0jZGVmaW5lIFNIMl9JUElfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAwMDM4MAorI2RlZmluZSBTSDFfSVBJX0lOVAkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwMDAzODApCisjZGVmaW5lIFNIMl9JUElfSU5UCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAwMDM4MCkKIAogLyogICBTSF9JUElfSU5UX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBUeXBlIG9mIEludGVycnVwdDogMD1JTlQsIDI9UE1JLCA0PU5NSSwgNT1JTklUICAgICAgICovCi0jZGVmaW5lIFNIX0lQSV9JTlRfVFlQRV9TSEZUICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBTSF9JUElfSU5UX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwNworI2RlZmluZSBTSF9JUElfSU5UX1RZUEVfU0hGVAkJCQkwCisjZGVmaW5lIFNIX0lQSV9JTlRfVFlQRV9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA3KQogCiAvKiAgIFNIX0lQSV9JTlRfQUdUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIEFnZW50LCBtdXN0IGJlIDAgZm9yIFNIdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfSVBJX0lOVF9BR1RfU0hGVCAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNIX0lQSV9JTlRfQUdUX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIFNIX0lQSV9JTlRfQUdUX1NIRlQJCQkJMworI2RlZmluZSBTSF9JUElfSU5UX0FHVF9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA4KQogCiAvKiAgIFNIX0lQSV9JTlRfUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFByb2Nlc3NvciBJRCwgc2FtZSBzZXR0aW5nIGFzIG9uIHRhcmdldGVkIE1jS2lubGV5ICAqLwotI2RlZmluZSBTSF9JUElfSU5UX1BJRF9TSEZUICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0hfSVBJX0lOVF9QSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwZmZmZjAKKyNkZWZpbmUgU0hfSVBJX0lOVF9QSURfU0hGVCAgICAgICAgICAgICAgICAgICAgICAJNAorI2RlZmluZSBTSF9JUElfSU5UX1BJRF9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMGZmZmYwKQogCiAvKiAgIFNIX0lQSV9JTlRfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIE9wdGlvbmFsIGludGVycnVwdCB2ZWN0b3IgYXJlYSwgMk1CIGFsaWduZWQgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfSVBJX0lOVF9CQVNFX1NIRlQgICAgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBTSF9JUElfSU5UX0JBU0VfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwM2ZmZmZmZmUwMDAwMAorI2RlZmluZSBTSF9JUElfSU5UX0JBU0VfU0hGVAkJCQkyMQorI2RlZmluZSBTSF9JUElfSU5UX0JBU0VfTUFTSyAJCV9fSUE2NF9VTF9DT05TVCgweDAwMDNmZmZmZmZlMDAwMDApCiAKIC8qICAgU0hfSVBJX0lOVF9JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVGFyZ2V0ZWQgTWNLaW5sZXkgaW50ZXJydXB0IHZlY3RvciAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9JUElfSU5UX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIFNIX0lQSV9JTlRfSURYX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwZmYwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIX0lQSV9JTlRfSURYX1NIRlQJCQkJNTIKKyNkZWZpbmUgU0hfSVBJX0lOVF9JRFhfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MGZmMDAwMDAwMDAwMDAwMCkKIAogLyogICBTSF9JUElfSU5UX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBTZW5kIEludGVycnVwdCBNZXNzYWdlIHRvIFBJLCBUaGlzIGdlbmVyYXRlcyBhIHB1bHMgICovCi0jZGVmaW5lIFNIX0lQSV9JTlRfU0VORF9TSEZUICAgICAgICAgICAgICAgICAgICAgNjMKLSNkZWZpbmUgU0hfSVBJX0lOVF9TRU5EX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0hfSVBJX0lOVF9TRU5EX1NIRlQJCQkJNjMKKyNkZWZpbmUgU0hfSVBJX0lOVF9TRU5EX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDgwMDAwMDAwMDAwMDAwMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9FVkVOVF9PQ0NVUlJFRCIgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgIFNIdWIgSW50ZXJydXB0IEV2ZW50IE9jY3VycmVkICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9FVkVOVF9PQ0NVUlJFRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDAxMDAwMAotI2RlZmluZSBTSDFfRVZFTlRfT0NDVVJSRURfQUxJQVMgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwMTAwMDgKLSNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVEICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDEwMDAwCi0jZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRF9BTElBUyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAxMDAwOAorI2RlZmluZSBTSDFfRVZFTlRfT0NDVVJSRUQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwMTAwMDApCisjZGVmaW5lIFNIMV9FVkVOVF9PQ0NVUlJFRF9BTElBUwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDEwMDA4KQorI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRUQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMTAwMDApCisjZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRF9BTElBUyAJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAxMDAwOCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1BJX0NBTV9DT05UUk9MIiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBDUkIgQ0FNIE1NUiBBY2Nlc3MgQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU0gxX1BJX0NBTV9DT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTIwMDUwMzAwCisjZGVmaW5lIFNIMV9QSV9DQU1fQ09OVFJPTAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEyMDA1MDMwMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1NIVUJfSUQiICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSHViIElEIE51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU0gxX1NIVUJfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDYwNTgwCi0jZGVmaW5lIFNIMV9TSFVCX0lEX1JFVklTSU9OX1NIRlQgICAgICAgICAgICAgICAgIDI4Ci0jZGVmaW5lIFNIMV9TSFVCX0lEX1JFVklTSU9OX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBmMDAwMDAwMAorI2RlZmluZSBTSDFfU0hVQl9JRAkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwNjA1ODApCisjZGVmaW5lIFNIMV9TSFVCX0lEX1JFVklTSU9OX1NIRlQJCQkyOAorI2RlZmluZSBTSDFfU0hVQl9JRF9SRVZJU0lPTl9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwZjAwMDAwMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1JUQyIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFsLXRpbWUgQ2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9SVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDFjMDAwMAotI2RlZmluZSBTSDJfUlRDCQkJCQkgIDB4MDAwMDAwMDIxMDFjMDAwMAotI2RlZmluZSBTSF9SVENfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2ZmZmZmZmZmZmZmZmYKKyNkZWZpbmUgU0gxX1JUQwkJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMWMwMDAwKQorI2RlZmluZSBTSDJfUlRDCQkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAyMTAxYzAwMDApCisjZGVmaW5lIFNIX1JUQ19NQVNLCQkJX19JQTY0X1VMX0NPTlNUKDB4MDA3ZmZmZmZmZmZmZmZmZikKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9QSU9fV1JJVEVfU1RBVFVTXzB8MSIgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICBQSU8gV3JpdGUgU3RhdHVzIGZvciBDUFUgMCAmIDEgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU0gxX1BJT19XUklURV9TVEFUVVNfMCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTIwMDcwMjAwCi0jZGVmaW5lIFNIMV9QSU9fV1JJVEVfU1RBVFVTXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEyMDA3MDI4MAotI2RlZmluZSBTSDJfUElPX1dSSVRFX1NUQVRVU18wICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMjAwNzAyMDAKLSNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDIwMDcwMjgwCi0jZGVmaW5lIFNIMl9QSU9fV1JJVEVfU1RBVFVTXzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAyMDA3MDMwMAotI2RlZmluZSBTSDJfUElPX1dSSVRFX1NUQVRVU18zICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMjAwNzAzODAKKyNkZWZpbmUgU0gxX1BJT19XUklURV9TVEFUVVNfMAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEyMDA3MDIwMCkKKyNkZWZpbmUgU0gxX1BJT19XUklURV9TVEFUVVNfMQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDEyMDA3MDI4MCkKKyNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAyMDA3MDIwMCkKKyNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAyMDA3MDI4MCkKKyNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMgkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAyMDA3MDMwMCkKKyNkZWZpbmUgU0gyX1BJT19XUklURV9TVEFUVVNfMwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAyMDA3MDM4MCkKIAogLyogICBTSF9QSU9fV1JJVEVfU1RBVFVTXzBfV1JJVEVfREVBRExPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBEZWFkbG9jayByZXNwb25zZSBkZXRlY3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1BJT19XUklURV9TVEFUVVNfV1JJVEVfREVBRExPQ0tfU0hGVCAxCi0jZGVmaW5lIFNIX1BJT19XUklURV9TVEFUVVNfV1JJVEVfREVBRExPQ0tfTUFTSyAweDAwMDAwMDAwMDAwMDAwMDIKKyNkZWZpbmUgU0hfUElPX1dSSVRFX1NUQVRVU19XUklURV9ERUFETE9DS19TSEZUCQkxCisjZGVmaW5lIFNIX1BJT19XUklURV9TVEFUVVNfV1JJVEVfREVBRExPQ0tfTUFTSyBcCisJCQkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDIpCiAKIC8qICAgU0hfUElPX1dSSVRFX1NUQVRVU18wX1BFTkRJTkdfV1JJVEVfQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgQ291bnQgb2YgY3VycmVudGx5IHBlbmRpbmcgUElPIHdyaXRlcyAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9QSU9fV1JJVEVfU1RBVFVTX1BFTkRJTkdfV1JJVEVfQ09VTlRfU0hGVCA1NgotI2RlZmluZSBTSF9QSU9fV1JJVEVfU1RBVFVTX1BFTkRJTkdfV1JJVEVfQ09VTlRfTUFTSyAweDNmMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0hfUElPX1dSSVRFX1NUQVRVU19QRU5ESU5HX1dSSVRFX0NPVU5UX1NIRlQJNTYKKyNkZWZpbmUgU0hfUElPX1dSSVRFX1NUQVRVU19QRU5ESU5HX1dSSVRFX0NPVU5UX01BU0sgXAorCQkJCQlfX0lBNjRfVUxfQ09OU1QoMHgzZjAwMDAwMDAwMDAwMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1BJT19XUklURV9TVEFUVVNfMF9BTElBUyIgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9QSU9fV1JJVEVfU1RBVFVTXzBfQUxJQVMgICAgICAgICAgICAgIDB4MDAwMDAwMDEyMDA3MDIwOAotI2RlZmluZSBTSDJfUElPX1dSSVRFX1NUQVRVU18wX0FMSUFTICAgICAgICAgICAgICAweDAwMDAwMDAwMjAwNzAyMDgKKyNkZWZpbmUgU0gxX1BJT19XUklURV9TVEFUVVNfMF9BTElBUwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTIwMDcwMjA4KQorI2RlZmluZSBTSDJfUElPX1dSSVRFX1NUQVRVU18wX0FMSUFTCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMjAwNzAyMDgpCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9FVkVOVF9PQ0NVUlJFRCIgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTExLDMzICsxMTMsMzMgQEAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgIFNIX0VWRU5UX09DQ1VSUkVEX1VBUlRfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgSnVuayBCdXMgVUFSVCBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfVUFSVF9JTlRfU0hGVCAgICAgICAgICAyMAotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9VQVJUX0lOVF9NQVNLICAgICAgICAgIDB4MDAwMDAwMDAwMDEwMDAwMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9VQVJUX0lOVF9TSEZUCQkJMjAKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfVUFSVF9JTlRfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMTAwMDAwKQogCiAvKiAgIFNIX0VWRU5UX09DQ1VSUkVEX0lQSV9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgSVBJIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSVBJX0lOVF9TSEZUICAgICAgICAgICAyOAotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JUElfSU5UX01BU0sgICAgICAgICAgIDB4MDAwMDAwMDAxMDAwMDAwMAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JUElfSU5UX1NIRlQJCQkyOAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JUElfSU5UX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAwMDAwMCkKIAogLyogICBTSF9FVkVOVF9PQ0NVUlJFRF9JSV9JTlQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQZW5kaW5nIElJIDAgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDBfU0hGVCAgICAgICAgICAgMjkKLSNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSUlfSU5UMF9NQVNLICAgICAgICAgICAweDAwMDAwMDAwMjAwMDAwMDAKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSUlfSU5UMF9TSEZUCQkJMjkKKyNkZWZpbmUgU0hfRVZFTlRfT0NDVVJSRURfSUlfSU5UMF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMjAwMDAwMDApCiAKIC8qICAgU0hfRVZFTlRfT0NDVVJSRURfSUlfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGVuZGluZyBJSSAxIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9JSV9JTlQxX1NIRlQgICAgICAgICAgIDMwCi0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDFfTUFTSyAgICAgICAgICAgMHgwMDAwMDAwMDQwMDAwMDAwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDFfU0hGVAkJCTMwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX0lJX0lOVDFfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDQwMDAwMDAwKQogCiAvKiAgIFNIMl9FVkVOVF9PQ0NVUlJFRF9FWFRJT19JTlQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFBlbmRpbmcgU0hVQiAyIEVYVCBJTyBJTlQyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gyX0VWRU5UX09DQ1VSUkVEX0VYVElPX0lOVDJfU0hGVCAgICAgICAzMwotI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UMl9NQVNLICAgICAgIDB4MDAwMDAwMDIwMDAwMDAwMAorI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UMl9TSEZUCQkzMworI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UMl9NQVNLIF9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAyMDAwMDAwMDApCiAKIC8qICAgU0gyX0VWRU5UX09DQ1VSUkVEX0VYVElPX0lOVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGVuZGluZyBTSFVCIDIgRVhUIElPIElOVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDJfRVZFTlRfT0NDVVJSRURfRVhUSU9fSU5UM19TSEZUICAgICAgIDM0Ci0jZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRF9FWFRJT19JTlQzX01BU0sgICAgICAgMHgwMDAwMDAwNDAwMDAwMDAwCisjZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRF9FWFRJT19JTlQzX1NIRlQJCTM0CisjZGVmaW5lIFNIMl9FVkVOVF9PQ0NVUlJFRF9FWFRJT19JTlQzX01BU0sgX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDQwMDAwMDAwMCkKIAogI2RlZmluZSBTSF9BTExfSU5UX01BU0sgXAogCShTSF9FVkVOVF9PQ0NVUlJFRF9VQVJUX0lOVF9NQVNLIHwgU0hfRVZFTlRfT0NDVVJSRURfSVBJX0lOVF9NQVNLIHwgXApAQCAtMTQ5LDMxMCArMTUxLDMxMCBAQAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIExFRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotI2RlZmluZSBTSDFfUkVBTF9KVU5LX0JVU19MRUQwCQkJIDB4N2ZlZDAwMDAwVUwKLSNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMQkJCSAweDdmZWQxMDAwMFVMCi0jZGVmaW5lIFNIMV9SRUFMX0pVTktfQlVTX0xFRDIJCQkgMHg3ZmVkMjAwMDBVTAotI2RlZmluZSBTSDFfUkVBTF9KVU5LX0JVU19MRUQzCQkJIDB4N2ZlZDMwMDAwVUwKKyNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMAkJCTB4N2ZlZDAwMDAwVUwKKyNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMQkJCTB4N2ZlZDEwMDAwVUwKKyNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMgkJCTB4N2ZlZDIwMDAwVUwKKyNkZWZpbmUgU0gxX1JFQUxfSlVOS19CVVNfTEVEMwkJCTB4N2ZlZDMwMDAwVUwKIAotI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQwCQkJIDB4ZjAwMDAwMDBVTAotI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQxCQkJIDB4ZjAwMTAwMDBVTAotI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQyCQkJIDB4ZjAwMjAwMDBVTAotI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQzCQkJIDB4ZjAwMzAwMDBVTAorI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQwCQkJMHhmMDAwMDAwMFVMCisjZGVmaW5lIFNIMl9SRUFMX0pVTktfQlVTX0xFRDEJCQkweGYwMDEwMDAwVUwKKyNkZWZpbmUgU0gyX1JFQUxfSlVOS19CVVNfTEVEMgkJCTB4ZjAwMjAwMDBVTAorI2RlZmluZSBTSDJfUkVBTF9KVU5LX0JVU19MRUQzCQkJMHhmMDAzMDAwMFVMCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0gxX1BUQ18wIiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgUHVnZSBUcmFuc2xhdGlvbiBDYWNoZSBNZXNzYWdlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMV9QVENfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDFhMDAwMAorI2RlZmluZSBTSDFfUFRDXzAJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMWEwMDAwKQogCiAvKiAgIFNIMV9QVENfMF9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gxX1BUQ18wX0FfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTSDFfUFRDXzBfQV9TSEZUCQkJCTAKIAogLyogICBTSDFfUFRDXzBfUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQYWdlIFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMV9QVENfMF9QU19TSEZUICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgU0gxX1BUQ18wX1BTX1NIRlQJCQkJMgogCiAvKiAgIFNIMV9QVENfMF9SSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFJlZ2lvbiBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gxX1BUQ18wX1JJRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTSDFfUFRDXzBfUklEX1NIRlQJCQkJOAogCiAvKiAgIFNIMV9QVENfMF9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0gxX1BUQ18wX1NUQVJUX1NIRlQgICAgICAgICAgICAgICAgICAgICAgNjMKKyNkZWZpbmUgU0gxX1BUQ18wX1NUQVJUX1NIRlQJCQkJNjMKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSDFfUFRDXzEiICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICBQdWdlIFRyYW5zbGF0aW9uIENhY2hlIE1lc3NhZ2UgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU0gxX1BUQ18xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMWEwMDgwCisjZGVmaW5lIFNIMV9QVENfMQkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAxYTAwODApCiAKIC8qICAgU0gxX1BUQ18xX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUFRDXzEgU3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDFfUFRDXzFfU1RBUlRfU0hGVCAgICAgICAgICAgICAgICAgICAgICA2MwotCisjZGVmaW5lIFNIMV9QVENfMV9TVEFSVF9TSEZUCQkJCTYzCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0gyX1BUQyIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgUHVnZSBUcmFuc2xhdGlvbiBDYWNoZSBNZXNzYWdlIENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIFNIMl9QVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDE3MDAwMDAwMAorI2RlZmluZSBTSDJfUFRDCQkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxNzAwMDAwMDApCiAKIC8qICAgU0gyX1BUQ19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDJfUFRDX0FfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNIMl9QVENfQV9TSEZUCQkJCQkwCiAKIC8qICAgU0gyX1BUQ19QUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGFnZSBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDJfUFRDX1BTX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFNIMl9QVENfUFNfU0hGVAkJCQkJMgogCiAvKiAgIFNIMl9QVENfUklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBSZWdpb24gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMl9QVENfUklEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0gyX1BUQ19SSURfU0hGVAkJCQk0CiAKIC8qICAgU0gyX1BUQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgU3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSDJfUFRDX1NUQVJUX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICA2MworI2RlZmluZSBTSDJfUFRDX1NUQVJUX1NIRlQJCQkJNjMKIAogLyogICBTSDJfUFRDX0FERFJfUklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBSZWdpb24gSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIMl9QVENfQUREUl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0gyX1BUQ19BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZmZmZmZmZmZmZmZmMDAwCisjZGVmaW5lIFNIMl9QVENfQUREUl9TSEZUCQkJCTQKKyNkZWZpbmUgU0gyX1BUQ19BRERSX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDFmZmZmZmZmZmZmZmYwMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1JUQzFfSU5UX0NPTkZJRyIgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgU0h1YiBSVEMgMSBJbnRlcnJ1cHQgQ29uZmlnIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gxX1JUQzFfSU5UX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwMDE0ODAKLSNkZWZpbmUgU0gyX1JUQzFfSU5UX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwMDE0ODAKLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX01BU0sgICAgICAgICAgICAgICAgICAweDBmZjNmZmZmZmZlZmZmZmYKLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0lOSVQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0gxX1JUQzFfSU5UX0NPTkZJRwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDAwMTQ4MCkKKyNkZWZpbmUgU0gyX1JUQzFfSU5UX0NPTkZJRwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAwMTQ4MCkKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDBmZjNmZmZmZmZlZmZmZmYpCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX1JUQzFfSU5UX0NPTkZJR19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFR5cGUgb2YgSW50ZXJydXB0OiAwPUlOVCwgMj1QTUksIDQ9Tk1JLCA1PUlOSVQgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX1RZUEVfU0hGVCAgICAgICAgICAgICAwCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19UWVBFX01BU0sgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA3CisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19UWVBFX1NIRlQJCQkwCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19UWVBFX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwNykKIAogLyogICBTSF9SVEMxX0lOVF9DT05GSUdfQUdUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBBZ2VudCwgbXVzdCBiZSAwIGZvciBTSHViICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19BR1RfU0hGVCAgICAgICAgICAgICAgMwotI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfQUdUX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwOAorI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfQUdUX1NIRlQJCQkzCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19BR1RfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA4KQogCiAvKiAgIFNIX1JUQzFfSU5UX0NPTkZJR19QSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFByb2Nlc3NvciBJRCwgc2FtZSBzZXR0aW5nIGFzIG9uIHRhcmdldGVkIE1jS2lubGV5ICAqLwotI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfUElEX1NIRlQgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX1BJRF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwZmZmZjAKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX1BJRF9TSEZUCQkJNAorI2RlZmluZSBTSF9SVEMxX0lOVF9DT05GSUdfUElEX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDBmZmZmMCkKIAogLyogICBTSF9SVEMxX0lOVF9DT05GSUdfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBPcHRpb25hbCBpbnRlcnJ1cHQgdmVjdG9yIGFyZWEsIDJNQiBhbGlnbmVkICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19CQVNFX1NIRlQgICAgICAgICAgICAgMjEKLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0JBU0VfTUFTSyAgICAgICAgICAgICAweDAwMDNmZmZmZmZlMDAwMDAKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0JBU0VfU0hGVAkJCTIxCisjZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19CQVNFX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwM2ZmZmZmZmUwMDAwMCkKIAogLyogICBTSF9SVEMxX0lOVF9DT05GSUdfSURYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBUYXJnZXRlZCBNY0tpbmxleSBpbnRlcnJ1cHQgdmVjdG9yICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0NPTkZJR19JRFhfU0hGVCAgICAgICAgICAgICAgNTIKLSNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0lEWF9NQVNLICAgICAgICAgICAgICAweDBmZjAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0lEWF9TSEZUCQkJNTIKKyNkZWZpbmUgU0hfUlRDMV9JTlRfQ09ORklHX0lEWF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDBmZjAwMDAwMDAwMDAwMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX1JUQzFfSU5UX0VOQUJMRSIgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgU0h1YiBSVEMgMSBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVycyAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gxX1JUQzFfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwMDE1MDAKLSNkZWZpbmUgU0gyX1JUQzFfSU5UX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwMDE1MDAKLSNkZWZpbmUgU0hfUlRDMV9JTlRfRU5BQkxFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKLSNkZWZpbmUgU0hfUlRDMV9JTlRfRU5BQkxFX0lOSVQgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgU0gxX1JUQzFfSU5UX0VOQUJMRQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDExMDAwMTUwMCkKKyNkZWZpbmUgU0gyX1JUQzFfSU5UX0VOQUJMRQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAxMDAwMTUwMCkKKyNkZWZpbmUgU0hfUlRDMV9JTlRfRU5BQkxFX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCisjZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9JTklUCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAwKQogCiAvKiAgIFNIX1JUQzFfSU5UX0VOQUJMRV9SVEMxX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIEVuYWJsZSBSVEMgMSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMV9JTlRfRU5BQkxFX1JUQzFfRU5BQkxFX1NIRlQgICAgICAwCi0jZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9SVEMxX0VOQUJMRV9NQVNLICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCisjZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9SVEMxX0VOQUJMRV9TSEZUCQkwCisjZGVmaW5lIFNIX1JUQzFfSU5UX0VOQUJMRV9SVEMxX0VOQUJMRV9NQVNLIFwKKwkJCQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfUlRDMl9JTlRfQ09ORklHIiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICBTSHViIFJUQyAyIEludGVycnVwdCBDb25maWcgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfUlRDMl9JTlRfQ09ORklHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDAwMTU4MAotI2RlZmluZSBTSDJfUlRDMl9JTlRfQ09ORklHICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAwMTU4MAotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MGZmM2ZmZmZmZmVmZmZmZgotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfSU5JVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfUlRDMl9JTlRfQ09ORklHCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDAxNTgwKQorI2RlZmluZSBTSDJfUlRDMl9JTlRfQ09ORklHCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDAxNTgwKQorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MGZmM2ZmZmZmZmVmZmZmZikKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfUlRDMl9JTlRfQ09ORklHX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVHlwZSBvZiBJbnRlcnJ1cHQ6IDA9SU5ULCAyPVBNSSwgND1OTUksIDU9SU5JVCAgICAgICAqLwotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfVFlQRV9TSEZUICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX1RZUEVfTUFTSyAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDcKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX1RZUEVfU0hGVAkJCTAKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX1RZUEVfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDA3KQogCiAvKiAgIFNIX1JUQzJfSU5UX0NPTkZJR19BR1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIEFnZW50LCBtdXN0IGJlIDAgZm9yIFNIdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0FHVF9TSEZUICAgICAgICAgICAgICAzCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19BR1RfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDA4CisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19BR1RfU0hGVAkJCTMKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0FHVF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDgpCiAKIC8qICAgU0hfUlRDMl9JTlRfQ09ORklHX1BJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUHJvY2Vzc29yIElELCBzYW1lIHNldHRpbmcgYXMgb24gdGFyZ2V0ZWQgTWNLaW5sZXkgICovCi0jZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19QSURfU0hGVCAgICAgICAgICAgICAgNAotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfUElEX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDBmZmZmMAorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfUElEX1NIRlQJCQk0CisjZGVmaW5lIFNIX1JUQzJfSU5UX0NPTkZJR19QSURfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMGZmZmYwKQogCiAvKiAgIFNIX1JUQzJfSU5UX0NPTkZJR19CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIE9wdGlvbmFsIGludGVycnVwdCB2ZWN0b3IgYXJlYSwgMk1CIGFsaWduZWQgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0JBU0VfU0hGVCAgICAgICAgICAgICAyMQotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfQkFTRV9NQVNLICAgICAgICAgICAgIDB4MDAwM2ZmZmZmZmUwMDAwMAorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfQkFTRV9TSEZUCQkJMjEKKyNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0JBU0VfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDAzZmZmZmZmZTAwMDAwKQogCiAvKiAgIFNIX1JUQzJfSU5UX0NPTkZJR19JRFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICBEZXNjcmlwdGlvbjogIFRhcmdldGVkIE1jS2lubGV5IGludGVycnVwdCB2ZWN0b3IgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0hfUlRDMl9JTlRfQ09ORklHX0lEWF9TSEZUICAgICAgICAgICAgICA1MgotI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfSURYX01BU0sgICAgICAgICAgICAgIDB4MGZmMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfSURYX1NIRlQJCQk1MgorI2RlZmluZSBTSF9SVEMyX0lOVF9DT05GSUdfSURYX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MGZmMDAwMDAwMDAwMDAwMCkKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfUlRDMl9JTlRfRU5BQkxFIiAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICBTSHViIFJUQyAyIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXJzICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDFfUlRDMl9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDExMDAwMTYwMAotI2RlZmluZSBTSDJfUlRDMl9JTlRfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAxMDAwMTYwMAotI2RlZmluZSBTSF9SVEMyX0lOVF9FTkFCTEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQotI2RlZmluZSBTSF9SVEMyX0lOVF9FTkFCTEVfSU5JVCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMAorI2RlZmluZSBTSDFfUlRDMl9JTlRfRU5BQkxFCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDAxNjAwKQorI2RlZmluZSBTSDJfUlRDMl9JTlRfRU5BQkxFCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDAxNjAwKQorI2RlZmluZSBTSF9SVEMyX0lOVF9FTkFCTEVfTUFTSwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKKyNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfUlRDMl9JTlRfRU5BQkxFX1JUQzJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgRW5hYmxlIFJUQyAyIEludGVycnVwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMyX0lOVF9FTkFCTEVfUlRDMl9FTkFCTEVfU0hGVCAgICAgIDAKLSNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX1JUQzJfRU5BQkxFX01BU0sgICAgICAweDAwMDAwMDAwMDAwMDAwMDEKKyNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX1JUQzJfRU5BQkxFX1NIRlQJCTAKKyNkZWZpbmUgU0hfUlRDMl9JTlRfRU5BQkxFX1JUQzJfRU5BQkxFX01BU0sgXAorCQkJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9SVEMzX0lOVF9DT05GSUciICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgIFNIdWIgUlRDIDMgSW50ZXJydXB0IENvbmZpZyBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9SVEMzX0lOVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDAxNjgwCi0jZGVmaW5lIFNIMl9SVEMzX0lOVF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDAxNjgwCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19NQVNLICAgICAgICAgICAgICAgICAgMHgwZmYzZmZmZmZmZWZmZmZmCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19JTklUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9SVEMzX0lOVF9DT05GSUcJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwMDE2ODApCisjZGVmaW5lIFNIMl9SVEMzX0lOVF9DT05GSUcJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMDE2ODApCisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwZmYzZmZmZmZmZWZmZmZmKQorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfSU5JVAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMCkKIAogLyogICBTSF9SVEMzX0lOVF9DT05GSUdfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBUeXBlIG9mIEludGVycnVwdDogMD1JTlQsIDI9UE1JLCA0PU5NSSwgNT1JTklUICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19UWVBFX1NIRlQgICAgICAgICAgICAgMAotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfVFlQRV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwMDAwMDAwMDAwNworI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfVFlQRV9TSEZUCQkJMAorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfVFlQRV9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDcpCiAKIC8qICAgU0hfUlRDM19JTlRfQ09ORklHX0FHVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgQWdlbnQsIG11c3QgYmUgMCBmb3IgU0h1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfQUdUX1NIRlQgICAgICAgICAgICAgIDMKLSNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0FHVF9NQVNLICAgICAgICAgICAgICAweDAwMDAwMDAwMDAwMDAwMDgKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX0FHVF9TSEZUCQkJMworI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfQUdUX01BU0sJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwOCkKIAogLyogICBTSF9SVEMzX0lOVF9DT05GSUdfUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBQcm9jZXNzb3IgSUQsIHNhbWUgc2V0dGluZyBhcyBvbiB0YXJnZXRlZCBNY0tpbmxleSAgKi8KLSNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX1BJRF9TSEZUICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19QSURfTUFTSyAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMGZmZmYwCisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19QSURfU0hGVAkJCTQKKyNkZWZpbmUgU0hfUlRDM19JTlRfQ09ORklHX1BJRF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwZmZmZjApCiAKIC8qICAgU0hfUlRDM19JTlRfQ09ORklHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgT3B0aW9uYWwgaW50ZXJydXB0IHZlY3RvciBhcmVhLCAyTUIgYWxpZ25lZCAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfQkFTRV9TSEZUICAgICAgICAgICAgIDIxCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19CQVNFX01BU0sgICAgICAgICAgICAgMHgwMDAzZmZmZmZmZTAwMDAwCisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19CQVNFX1NIRlQJCQkyMQorI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfQkFTRV9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDNmZmZmZmZlMDAwMDApCiAKIC8qICAgU0hfUlRDM19JTlRfQ09ORklHX0lEWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgVGFyZ2V0ZWQgTWNLaW5sZXkgaW50ZXJydXB0IHZlY3RvciAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9SVEMzX0lOVF9DT05GSUdfSURYX1NIRlQgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19JRFhfTUFTSyAgICAgICAgICAgICAgMHgwZmYwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19JRFhfU0hGVAkJCTUyCisjZGVmaW5lIFNIX1JUQzNfSU5UX0NPTkZJR19JRFhfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwZmYwMDAwMDAwMDAwMDAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyICJTSF9SVEMzX0lOVF9FTkFCTEUiICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgIFNIdWIgUlRDIDMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcnMgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9SVEMzX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMDAxNzAwCi0jZGVmaW5lIFNIMl9SVEMzX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMDAxNzAwCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0VOQUJMRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAxCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0VOQUJMRV9JTklUICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9SVEMzX0lOVF9FTkFCTEUJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAwMDE3MDApCisjZGVmaW5lIFNIMl9SVEMzX0lOVF9FTkFCTEUJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAwMDE3MDApCisjZGVmaW5lIFNIX1JUQzNfSU5UX0VOQUJMRV9NQVNLCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDAxKQorI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfSU5JVAkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMCkKIAogLyogICBTSF9SVEMzX0lOVF9FTkFCTEVfUlRDM19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgRGVzY3JpcHRpb246ICBFbmFibGUgUlRDIDMgSW50ZXJydXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNIX1JUQzNfSU5UX0VOQUJMRV9SVEMzX0VOQUJMRV9TSEZUICAgICAgMAotI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfUlRDM19FTkFCTEVfTUFTSyAgICAgIDB4MDAwMDAwMDAwMDAwMDAwMQorI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfUlRDM19FTkFCTEVfU0hGVAkJMAorI2RlZmluZSBTSF9SVEMzX0lOVF9FTkFCTEVfUlRDM19FTkFCTEVfTUFTSyBcCisJCQkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDEpCiAKIC8qICAgU0hfRVZFTlRfT0NDVVJSRURfUlRDMV9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGVuZGluZyBSVEMgMSBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMxX0lOVF9TSEZUICAgICAgICAgIDI0Ci0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzFfSU5UX01BU0sgICAgICAgICAgMHgwMDAwMDAwMDAxMDAwMDAwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzFfSU5UX1NIRlQJCQkyNAorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMxX0lOVF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDEwMDAwMDApCiAKIC8qICAgU0hfRVZFTlRfT0NDVVJSRURfUlRDMl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGVuZGluZyBSVEMgMiBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMyX0lOVF9TSEZUICAgICAgICAgIDI1Ci0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzJfSU5UX01BU0sgICAgICAgICAgMHgwMDAwMDAwMDAyMDAwMDAwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzJfSU5UX1NIRlQJCQkyNQorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMyX0lOVF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDIwMDAwMDApCiAKIC8qICAgU0hfRVZFTlRfT0NDVVJSRURfUlRDM19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUGVuZGluZyBSVEMgMyBJbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMzX0lOVF9TSEZUICAgICAgICAgIDI2Ci0jZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzNfSU5UX01BU0sgICAgICAgICAgMHgwMDAwMDAwMDA0MDAwMDAwCisjZGVmaW5lIFNIX0VWRU5UX09DQ1VSUkVEX1JUQzNfSU5UX1NIRlQJCQkyNgorI2RlZmluZSBTSF9FVkVOVF9PQ0NVUlJFRF9SVEMzX0lOVF9NQVNLCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDQwMDAwMDApCiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX0lQSV9BQ0NFU1MiICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgIENQVSBpbnRlcnJ1cHQgQWNjZXNzIFBlcm1pc3Npb24gQml0cyAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gxX0lQSV9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxMTAwNjA0ODAKLSNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MwICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwNjBjMDAKLSNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MxICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwNjBjODAKLSNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MyICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwNjBkMDAKLSNkZWZpbmUgU0gyX0lQSV9BQ0NFU1MzICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMTAwNjBkODAKKyNkZWZpbmUgU0gxX0lQSV9BQ0NFU1MJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTEwMDYwNDgwKQorI2RlZmluZSBTSDJfSVBJX0FDQ0VTUzAJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDYwYzAwKQorI2RlZmluZSBTSDJfSVBJX0FDQ0VTUzEJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDYwYzgwKQorI2RlZmluZSBTSDJfSVBJX0FDQ0VTUzIJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDYwZDAwKQorI2RlZmluZSBTSDJfSVBJX0FDQ0VTUzMJCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDEwMDYwZDgwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfSU5UX0NNUEIiICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgUlRDIENvbXBhcmUgVmFsdWUgZm9yIFByb2Nlc3NvciBCICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9JTlRfQ01QQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMWIwMDgwCi0jZGVmaW5lIFNIMl9JTlRfQ01QQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMWIwMDgwCi0jZGVmaW5lIFNIX0lOVF9DTVBCX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCi0jZGVmaW5lIFNIX0lOVF9DTVBCX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9JTlRfQ01QQgkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAxYjAwODApCisjZGVmaW5lIFNIMl9JTlRfQ01QQgkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAxYjAwODApCisjZGVmaW5lIFNIX0lOVF9DTVBCX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDAwN2ZmZmZmZmZmZmZmZmYpCisjZGVmaW5lIFNIX0lOVF9DTVBCX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUmVhbCBUaW1lIENsb2NrIENvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9JTlRfQ01QQl9SRUFMX1RJTUVfQ01QQl9TSEZUICAgICAgICAgIDAKLSNkZWZpbmUgU0hfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfTUFTSyAgICAgICAgICAweDAwN2ZmZmZmZmZmZmZmZmYKKyNkZWZpbmUgU0hfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfU0hGVAkJCTAKKyNkZWZpbmUgU0hfSU5UX0NNUEJfUkVBTF9USU1FX0NNUEJfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDdmZmZmZmZmZmZmZmZmKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfSU5UX0NNUEMiICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgUlRDIENvbXBhcmUgVmFsdWUgZm9yIFByb2Nlc3NvciBDICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9JTlRfQ01QQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMWIwMTAwCi0jZGVmaW5lIFNIMl9JTlRfQ01QQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMWIwMTAwCi0jZGVmaW5lIFNIX0lOVF9DTVBDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCi0jZGVmaW5lIFNIX0lOVF9DTVBDX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9JTlRfQ01QQwkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAxYjAxMDApCisjZGVmaW5lIFNIMl9JTlRfQ01QQwkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAxYjAxMDApCisjZGVmaW5lIFNIX0lOVF9DTVBDX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDAwN2ZmZmZmZmZmZmZmZmYpCisjZGVmaW5lIFNIX0lOVF9DTVBDX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfSU5UX0NNUENfUkVBTF9USU1FX0NNUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUmVhbCBUaW1lIENsb2NrIENvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9JTlRfQ01QQ19SRUFMX1RJTUVfQ01QQ19TSEZUICAgICAgICAgIDAKLSNkZWZpbmUgU0hfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfTUFTSyAgICAgICAgICAweDAwN2ZmZmZmZmZmZmZmZmYKKyNkZWZpbmUgU0hfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfU0hGVAkJCTAKKyNkZWZpbmUgU0hfSU5UX0NNUENfUkVBTF9USU1FX0NNUENfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDdmZmZmZmZmZmZmZmZmKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciAiU0hfSU5UX0NNUEQiICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgUlRDIENvbXBhcmUgVmFsdWUgZm9yIFByb2Nlc3NvciBEICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0jZGVmaW5lIFNIMV9JTlRfQ01QRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMTEwMWIwMTgwCi0jZGVmaW5lIFNIMl9JTlRfQ01QRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDEwMWIwMTgwCi0jZGVmaW5lIFNIX0lOVF9DTVBEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdmZmZmZmZmZmZmZmZmCi0jZGVmaW5lIFNIX0lOVF9DTVBEX0lOSVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMDAwMDAwMDAwCisjZGVmaW5lIFNIMV9JTlRfQ01QRAkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAxMTAxYjAxODApCisjZGVmaW5lIFNIMl9JTlRfQ01QRAkJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMTAxYjAxODApCisjZGVmaW5lIFNIX0lOVF9DTVBEX01BU0sJCV9fSUE2NF9VTF9DT05TVCgweDAwN2ZmZmZmZmZmZmZmZmYpCisjZGVmaW5lIFNIX0lOVF9DTVBEX0lOSVQJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDApCiAKIC8qICAgU0hfSU5UX0NNUERfUkVBTF9USU1FX0NNUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgIERlc2NyaXB0aW9uOiAgUmVhbCBUaW1lIENsb2NrIENvbXBhcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTSF9JTlRfQ01QRF9SRUFMX1RJTUVfQ01QRF9TSEZUICAgICAgICAgIDAKLSNkZWZpbmUgU0hfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfTUFTSyAgICAgICAgICAweDAwN2ZmZmZmZmZmZmZmZmYKKyNkZWZpbmUgU0hfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfU0hGVAkJCTAKKyNkZWZpbmUgU0hfSU5UX0NNUERfUkVBTF9USU1FX0NNUERfTUFTSwlfX0lBNjRfVUxfQ09OU1QoMHgwMDdmZmZmZmZmZmZmZmZmKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX01EX0RRTFBfTU1SX0RJUl9QUklWRUMwIiAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZSB2ZWN0b3IgZm9yIGFjYz0wICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jZGVmaW5lIFNIMV9NRF9EUUxQX01NUl9ESVJfUFJJVkVDMCAgICAgICAgICAgICAgMHgwMDAwMDAwMTAwMDMwMzAwCisjZGVmaW5lIFNIMV9NRF9EUUxQX01NUl9ESVJfUFJJVkVDMAlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTAwMDMwMzAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgUmVnaXN0ZXIgIlNIX01EX0RRUlBfTU1SX0RJUl9QUklWRUMwIiAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIHByaXZpbGVnZSB2ZWN0b3IgZm9yIGFjYz0wICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0jZGVmaW5lIFNIMV9NRF9EUVJQX01NUl9ESVJfUFJJVkVDMCAgICAgICAgICAgICAgMHgwMDAwMDAwMTAwMDUwMzAwCisjZGVmaW5lIFNIMV9NRF9EUVJQX01NUl9ESVJfUFJJVkVDMAlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMTAwMDUwMzAwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogU29tZSBNTVJzIGFyZSBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIChvciBjbG9zZSBlbm91Z2gpIG9uIGJvdGggU0hVQjEgKi8KQEAgLTQ4NCwxNyArNDg2LDE3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgRW5naW5lIDAgQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAqLwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotI2RlZmluZSBTSDJfQlRfRU5HX0NTUl8wICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAzMDA0MDAwMAotI2RlZmluZSBTSDJfQlRfRU5HX1NSQ19BRERSXzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAzMDA0MDA4MAotI2RlZmluZSBTSDJfQlRfRU5HX0RFU1RfQUREUl8wICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAzMDA0MDEwMAotI2RlZmluZSBTSDJfQlRfRU5HX05PVElGX0FERFJfMCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAzMDA0MDE4MAorI2RlZmluZSBTSDJfQlRfRU5HX0NTUl8wCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDMwMDQwMDAwKQorI2RlZmluZSBTSDJfQlRfRU5HX1NSQ19BRERSXzAJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMzAwNDAwODApCisjZGVmaW5lIFNIMl9CVF9FTkdfREVTVF9BRERSXzAJCV9fSUE2NF9VTF9DT05TVCgweDAwMDAwMDAwMzAwNDAxMDApCisjZGVmaW5lIFNIMl9CVF9FTkdfTk9USUZfQUREUl8wCQlfX0lBNjRfVUxfQ09OU1QoMHgwMDAwMDAwMDMwMDQwMTgwKQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogLyogICAgICAgICAgICAgICAgICAgICAgIEJURSBpbnRlcmZhY2VzIDEtMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKLSNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNTAwMDAKLSNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNjAwMDAKLSNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwMzAwNzAwMDAKKyNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMQkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAzMDA1MDAwMCkKKyNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMgkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAzMDA2MDAwMCkKKyNkZWZpbmUgU0gyX0JUX0VOR19DU1JfMwkJX19JQTY0X1VMX0NPTlNUKDB4MDAwMDAwMDAzMDA3MDAwMCkKIAogI2VuZGlmIC8qIF9BU01fSUE2NF9TTl9TSFVCX01NUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NpbXVsYXRvci5oIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zaW11bGF0b3IuaAppbmRleCA3OGViNGY4Li5jZjc3MGUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NpbXVsYXRvci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc2ltdWxhdG9yLmgKQEAgLTEwLDE2ICsxMCwxNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAKLSNpZmRlZiBDT05GSUdfSUE2NF9TR0lfU05fU0lNCi0KICNkZWZpbmUgU05NQUdJQyAweGFlZWVlZWVlOGJhZGJlZWZMCi0jZGVmaW5lIElTX1JVTk5JTkdfT05fU0lNVUxBVE9SKCkgKHtsb25nIHNuOyBhc20oIm1vdiAlMD1jcHVpZFslMV0iIDogIj1yIihzbikgOiAiciIoMikpOyBzbiA9PSBTTk1BR0lDO30pCisjZGVmaW5lIElTX01FRFVTQSgpCQkJKHtsb25nIHNuOyBhc20oIm1vdiAlMD1jcHVpZFslMV0iIDogIj1yIihzbikgOiAiciIoMikpOyBzbiA9PSBTTk1BR0lDO30pCiAKLSNkZWZpbmUgU0lNVUxBVE9SX1NMRUVQKCkJYXNtKCJub3AuaSAweDhiZWVmIikKLQorI2lmZGVmIENPTkZJR19JQTY0X1NHSV9TTl9TSU0KKyNkZWZpbmUgU0lNVUxBVE9SX1NMRUVQKCkJCWFzbSgibm9wLmkgMHg4YmVlZiIpCisjZGVmaW5lIElTX1JVTk5JTkdfT05fU0lNVUxBVE9SKCkgCShzbl9wcm9tX3R5cGUpCisjZGVmaW5lIElTX1JVTk5JTkdfT05fRkFLRV9QUk9NKCkJKHNuX3Byb21fdHlwZSA9PSAyKQorZXh0ZXJuIGludCBzbl9wcm9tX3R5cGU7CQkvKiAwPWhhcmR3YXJlLCAxPW1lZHVzYS9yZWFscHJvbSwgMj1tZWR1c2EvZmFrZXByb20gKi8KICNlbHNlCi0KICNkZWZpbmUgSVNfUlVOTklOR19PTl9TSU1VTEFUT1IoKQkoMCkKKyNkZWZpbmUgSVNfUlVOTklOR19PTl9GQUtFX1BST00oKQkoMCkKICNkZWZpbmUgU0lNVUxBVE9SX1NMRUVQKCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuMi9zbl9od3BlcmYuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc24yL3NuX2h3cGVyZi5oCmluZGV4IGIwYzRkNmQuLmRmNzVmNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc24yL3NuX2h3cGVyZi5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc24yL3NuX2h3cGVyZi5oCkBAIC0yMjMsNCArMjIzLDYgQEAKICNkZWZpbmUgU05fSFdQRVJGX09QX1JFQ09ORklHVVJFCTI1MwogI2RlZmluZSBTTl9IV1BFUkZfT1BfSU5WQUwJCTI1NAogCitpbnQgc25fdG9wb2xvZ3lfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitpbnQgc25fdG9wb2xvZ3lfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAjZW5kaWYJCQkJLyogU05fSFdQRVJGX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fY3B1aWQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fY3B1aWQuaAppbmRleCAyMGIzMDAxLi5kMmMxZDM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX2NwdWlkLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9jcHVpZC5oCkBAIC04MSwxMSArODEsNiBAQAogICoKICAqLwogCi0jaWZuZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgY3B1X3BoeXNpY2FsX2lkKGNwdWlkKQkJCSgoaWE2NF9nZXRyZWcoX0lBNjRfUkVHX0NSX0xJRCkgPj4gMTYpICYgMHhmZmZmKQotI2VuZGlmCi0KLQogI2RlZmluZSBnZXRfbm9kZV9udW1iZXIoYWRkcikJCQlOQVNJRF9HRVQoYWRkcikKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCmluZGV4IGViMDM5NWEuLjI3OTc2ZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaApAQCAtMTMyLDQzICsxMzIsMzAgQEAKICNkZWZpbmUgU0FMUkVUX0lOVkFMSURfQVJHCSgtMikKICNkZWZpbmUgU0FMUkVUX0VSUk9SCQkoLTMpCiAKKyNkZWZpbmUgU05fU0FMX0ZBS0VfUFJPTQkJCSAgIDB4MDIwMDk5OTkKIAogLyoqCi0gKiBzbl9zYWxfcmV2X21ham9yIC0gZ2V0IHRoZSBtYWpvciBTR0kgU0FMIHJldmlzaW9uIG51bWJlcgotICoKLSAqIFRoZSBTR0kgUFJPTSBzdG9yZXMgaXRzIHZlcnNpb24gaW4gc2FsX1thYl1fcmV2XyhtYWpvcnxtaW5vcikuCi0gKiBUaGlzIHJvdXRpbmUgc2ltcGx5IGV4dHJhY3RzIHRoZSBtYWpvciB2YWx1ZSBmcm9tIHRoZQotICogQGlhNjRfc2FsX3N5c3RhYiBzdHJ1Y3R1cmUgY29uc3RydWN0ZWQgYnkgaWE2NF9zYWxfaW5pdCgpLgotICovCi1zdGF0aWMgaW5saW5lIGludAotc25fc2FsX3Jldl9tYWpvcih2b2lkKQorICAqIHNuX3NhbF9yZXZpc2lvbiAtIGdldCB0aGUgU0dJIFNBTCByZXZpc2lvbiBudW1iZXIKKyAgKgorICAqIFRoZSBTR0kgUFJPTSBzdG9yZXMgaXRzIHZlcnNpb24gaW4gdGhlIHNhbF9bYWJdX3Jldl8obWFqb3J8bWlub3IpLgorICAqIFRoaXMgcm91dGluZSBzaW1wbHkgZXh0cmFjdHMgdGhlIG1ham9yIGFuZCBtaW5vciB2YWx1ZXMgYW5kCisgICogcHJlc2VudHMgdGhlbSBpbiBhIHUzMiBmb3JtYXQuCisgICoKKyAgKiBGb3IgZXhhbXBsZSwgdmVyc2lvbiA0LjA1IHdvdWxkIGJlIHJlcHJlc2VudGVkIGF0IDB4MDQwNS4KKyAgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitzbl9zYWxfcmV2KHZvaWQpCiB7CiAJc3RydWN0IGlhNjRfc2FsX3N5c3RhYiAqc3lzdGFiID0gZWZpLnNhbF9zeXN0YWI7CiAKLQlyZXR1cm4gKGludClzeXN0YWItPnNhbF9iX3Jldl9tYWpvcjsKLX0KLQotLyoqCi0gKiBzbl9zYWxfcmV2X21pbm9yIC0gZ2V0IHRoZSBtaW5vciBTR0kgU0FMIHJldmlzaW9uIG51bWJlcgotICoKLSAqIFRoZSBTR0kgUFJPTSBzdG9yZXMgaXRzIHZlcnNpb24gaW4gc2FsX1thYl1fcmV2XyhtYWpvcnxtaW5vcikuCi0gKiBUaGlzIHJvdXRpbmUgc2ltcGx5IGV4dHJhY3RzIHRoZSBtaW5vciB2YWx1ZSBmcm9tIHRoZQotICogQGlhNjRfc2FsX3N5c3RhYiBzdHJ1Y3R1cmUgY29uc3RydWN0ZWQgYnkgaWE2NF9zYWxfaW5pdCgpLgotICovCi1zdGF0aWMgaW5saW5lIGludAotc25fc2FsX3Jldl9taW5vcih2b2lkKQotewotCXN0cnVjdCBpYTY0X3NhbF9zeXN0YWIgKnN5c3RhYiA9IGVmaS5zYWxfc3lzdGFiOwotCQotCXJldHVybiAoaW50KXN5c3RhYi0+c2FsX2JfcmV2X21pbm9yOworCXJldHVybiAodTMyKShzeXN0YWItPnNhbF9iX3Jldl9tYWpvciA8PCA4IHwgc3lzdGFiLT5zYWxfYl9yZXZfbWlub3IpOwogfQogCiAvKgogICogU3BlY2lmeSB0aGUgbWluaW11bSBQUk9NIHJldnNpb24gcmVxdWlyZWQgZm9yIHRoaXMga2VybmVsLgogICogTm90ZSB0aGF0IHRoZXkncmUgc3RvcmVkIGluIGhleCBmb3JtYXQuLi4KICAqLwotI2RlZmluZSBTTl9TQUxfTUlOX01BSk9SCTB4NCAgLyogU04yIGtlcm5lbHMgbmVlZCBhdCBsZWFzdCBQUk9NIDQuMCAqLwotI2RlZmluZSBTTl9TQUxfTUlOX01JTk9SCTB4MAorI2RlZmluZSBTTl9TQUxfTUlOX1ZFUlNJT04JMHgwNDA0CiAKIC8qCiAgKiBSZXR1cm5zIHRoZSBtYXN0ZXIgY29uc29sZSBuYXNpZCwgaWYgdGhlIGNhbGwgZmFpbHMsIHJldHVybiBhbiBpbGxlZ2FsCkBAIC0xMTA1LDQgKzEwOTIsMTIgQEAKIAlyZXR1cm4gKGludCkgcnYuc3RhdHVzOwogfQogCitzdGF0aWMgaW5saW5lIGludAoraWE2NF9zbl9pc19mYWtlX3Byb20odm9pZCkKK3sKKwlzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIHJ2OworCVNBTF9DQUxMX05PTE9DSyhydiwgU05fU0FMX0ZBS0VfUFJPTSwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisJcmV0dXJuIChydi5zdGF0dXMgPT0gMCk7Cit9CisKICNlbmRpZiAvKiBfQVNNX0lBNjRfU05fU05fU0FMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2FfcHJvdmlkZXIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY2FfcHJvdmlkZXIuaAppbmRleCBiNmFjYzIyLi41Y2NlYzYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NhX3Byb3ZpZGVyLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jYV9wcm92aWRlci5oCkBAIC0yMDEsNiArMjAxLDcgQEAKIH0KIAogZXh0ZXJuIHVpbnQzMl90CXRpb2NhX2dhcnRfZm91bmQ7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCB0aW9jYV9saXN0OwogZXh0ZXJuIGludCB0aW9jYV9pbml0X3Byb3ZpZGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgdGlvY2FfZmFzdHdyaXRlX2VuYWJsZShzdHJ1Y3QgdGlvY2Ffa2VybmVsICp0aW9jYV9rZXJuKTsKICNlbmRpZiAvKiBfQVNNX0lBNjRfU05fVElPX0NBX0FHUF9QUk9WSURFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNDg5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaApAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqLworI2lmbmRlZiBfQVNNX0lBNjRfU05fUENJX1RJT0NQX0gKKyNkZWZpbmUgX0FTTV9JQTY0X1NOX1BDSV9USU9DUF9ICisKKyNkZWZpbmUgVElPQ1BfSE9TVF9JTlRSX0FERFIgICAgICAgICAgICAweDAwM0ZGRkZGRkZGRkZGRkZVTAorI2RlZmluZSBUSU9DUF9QQ0k2NF9DTURUWVBFX01FTSAgICAgICAgICgweDF1bGwgPDwgNjApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKiogVElPQ1AgTU1SIHN0cnVjdHVyZSBtYXBwaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgdGlvY3B7CisKKyAgICAvKiAweDAwMDAwMC0weDAwRkZGRiAtLSBMb2NhbCBSZWdpc3RlcnMgKi8KKworICAgIC8qIDB4MDAwMDAwLTB4MDAwMDU3IC0tIChMZWdhY3kgV2lkZ2V0IFNwYWNlKSBDb25maWd1cmF0aW9uICovCisgICAgdWludDY0X3QJCWNwX2lkOwkJCQkvKiAweDAwMDAwMCAqLworICAgIHVpbnQ2NF90CQljcF9zdGF0OwkJCS8qIDB4MDAwMDA4ICovCisgICAgdWludDY0X3QJCWNwX2Vycl91cHBlcjsJCQkvKiAweDAwMDAxMCAqLworICAgIHVpbnQ2NF90CQljcF9lcnJfbG93ZXI7CQkJLyogMHgwMDAwMTggKi8KKyAgICAjZGVmaW5lIGNwX2VyciBjcF9lcnJfbG93ZXIKKyAgICB1aW50NjRfdAkJY3BfY29udHJvbDsJCQkvKiAweDAwMDAyMCAqLworICAgIHVpbnQ2NF90CQljcF9yZXFfdGltZW91dDsJCQkvKiAweDAwMDAyOCAqLworICAgIHVpbnQ2NF90CQljcF9pbnRyX3VwcGVyOwkJCS8qIDB4MDAwMDMwICovCisgICAgdWludDY0X3QJCWNwX2ludHJfbG93ZXI7CQkJLyogMHgwMDAwMzggKi8KKyAgICAjZGVmaW5lIGNwX2ludHIgY3BfaW50cl9sb3dlcgorICAgIHVpbnQ2NF90CQljcF9lcnJfY21kd29yZDsJCQkvKiAweDAwMDA0MCAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDA0ODsJCQkvKiAweDAwMDA0OCAqLworICAgIHVpbnQ2NF90CQljcF90Zmx1c2g7CQkJLyogMHgwMDAwNTAgKi8KKworICAgIC8qIDB4MDAwMDU4LTB4MDAwMDdGIC0tIEJyaWRnZS1zcGVjaWZpYyBDb25maWd1cmF0aW9uICovCisgICAgdWludDY0X3QJCWNwX2F1eF9lcnI7CQkJLyogMHgwMDAwNTggKi8KKyAgICB1aW50NjRfdAkJY3BfcmVzcF91cHBlcjsJCQkvKiAweDAwMDA2MCAqLworICAgIHVpbnQ2NF90CQljcF9yZXNwX2xvd2VyOwkJCS8qIDB4MDAwMDY4ICovCisgICAgI2RlZmluZSBjcF9yZXNwIGNwX3Jlc3BfbG93ZXIKKyAgICB1aW50NjRfdAkJY3BfdHN0X3Bpbl9jdHJsOwkJLyogMHgwMDAwNzAgKi8KKyAgICB1aW50NjRfdAkJY3BfYWRkcl9sa2VycjsJCQkvKiAweDAwMDA3OCAqLworCisgICAgLyogMHgwMDAwODAtMHgwMDAwOEYgLS0gUE1VICYgTUFQICovCisgICAgdWludDY0X3QJCWNwX2Rpcl9tYXA7CQkJLyogMHgwMDAwODAgKi8KKyAgICB1aW50NjRfdAkJX3BhZF8wMDAwODg7CQkJLyogMHgwMDAwODggKi8KKworICAgIC8qIDB4MDAwMDkwLTB4MDAwMDlGIC0tIFNTUkFNICovCisgICAgdWludDY0X3QJCWNwX21hcF9mYXVsdDsJCQkvKiAweDAwMDA5MCAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDA5ODsJCQkvKiAweDAwMDA5OCAqLworCisgICAgLyogMHgwMDAwQTAtMHgwMDAwQUYgLS0gQXJiaXRyYXRpb24gKi8KKyAgICB1aW50NjRfdAkJY3BfYXJiOwkJCQkvKiAweDAwMDBBMCAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDBBODsJCQkvKiAweDAwMDBBOCAqLworCisgICAgLyogMHgwMDAwQjAtMHgwMDAwQkYgLS0gTnVtYmVyIEluIEEgQ2FuIG9yIEFURSBQYXJpdHkgRXJyb3IgKi8KKyAgICB1aW50NjRfdAkJY3BfYXRlX3Bhcml0eV9lcnI7CQkvKiAweDAwMDBCMCAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDBCODsJCQkvKiAweDAwMDBCOCAqLworCisgICAgLyogMHgwMDAwQzAtMHgwMDAwRkYgLS0gUENJL0dJTyAqLworICAgIHVpbnQ2NF90CQljcF9idXNfdGltZW91dDsJCQkvKiAweDAwMDBDMCAqLworICAgIHVpbnQ2NF90CQljcF9wY2lfY2ZnOwkJCS8qIDB4MDAwMEM4ICovCisgICAgdWludDY0X3QJCWNwX3BjaV9lcnJfdXBwZXI7CQkvKiAweDAwMDBEMCAqLworICAgIHVpbnQ2NF90CQljcF9wY2lfZXJyX2xvd2VyOwkJLyogMHgwMDAwRDggKi8KKyAgICAjZGVmaW5lIGNwX3BjaV9lcnIgY3BfcGNpX2Vycl9sb3dlcgorICAgIHVpbnQ2NF90CQlfcGFkXzAwMDBFMFs0XTsJCQkvKiAweDAwMDB7RTAuLkY4fSAqLworCisgICAgLyogMHgwMDAxMDAtMHgwMDAxRkYgLS0gSW50ZXJydXB0ICovCisgICAgdWludDY0X3QJCWNwX2ludF9zdGF0dXM7CQkJLyogMHgwMDAxMDAgKi8KKyAgICB1aW50NjRfdAkJY3BfaW50X2VuYWJsZTsJCQkvKiAweDAwMDEwOCAqLworICAgIHVpbnQ2NF90CQljcF9pbnRfcnN0X3N0YXQ7CQkvKiAweDAwMDExMCAqLworICAgIHVpbnQ2NF90CQljcF9pbnRfbW9kZTsJCQkvKiAweDAwMDExOCAqLworICAgIHVpbnQ2NF90CQljcF9pbnRfZGV2aWNlOwkJCS8qIDB4MDAwMTIwICovCisgICAgdWludDY0X3QJCWNwX2ludF9ob3N0X2VycjsJCS8qIDB4MDAwMTI4ICovCisgICAgdWludDY0X3QJCWNwX2ludF9hZGRyWzhdOwkJCS8qIDB4MDAwMXszMCwsLDY4fSAqLworICAgIHVpbnQ2NF90CQljcF9lcnJfaW50X3ZpZXc7CQkvKiAweDAwMDE3MCAqLworICAgIHVpbnQ2NF90CQljcF9tdWx0X2ludDsJCQkvKiAweDAwMDE3OCAqLworICAgIHVpbnQ2NF90CQljcF9mb3JjZV9hbHdheXNbOF07CQkvKiAweDAwMDF7ODAsLCxCOH0gKi8KKyAgICB1aW50NjRfdAkJY3BfZm9yY2VfcGluWzhdOwkJLyogMHgwMDAxe0MwLCwsRjh9ICovCisKKyAgICAvKiAweDAwMDIwMC0weDAwMDI5OCAtLSBEZXZpY2UgKi8KKyAgICB1aW50NjRfdAkJY3BfZGV2aWNlWzRdOwkJCS8qIDB4MDAwMnswMCwsLDE4fSAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDIyMFs0XTsJCQkvKiAweDAwMDJ7MjAsLCwzOH0gKi8KKyAgICB1aW50NjRfdAkJY3Bfd3JfcmVxX2J1Zls0XTsJCS8qIDB4MDAwMns0MCwsLDU4fSAqLworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDI2MFs0XTsJCQkvKiAweDAwMDJ7NjAsLCw3OH0gKi8KKyAgICB1aW50NjRfdAkJY3BfcnJiX21hcFsyXTsJCQkvKiAweDAwMDJ7ODAsLCw4OH0gKi8KKyAgICAjZGVmaW5lIGNwX2V2ZW5fcmVzcCBjcF9ycmJfbWFwWzBdCQkJLyogMHgwMDAyODAgKi8KKyAgICAjZGVmaW5lIGNwX29kZF9yZXNwICBjcF9ycmJfbWFwWzFdCQkJLyogMHgwMDAyODggKi8KKyAgICB1aW50NjRfdAkJY3BfcmVzcF9zdGF0dXM7CQkJLyogMHgwMDAyOTAgKi8KKyAgICB1aW50NjRfdAkJY3BfcmVzcF9jbGVhcjsJCQkvKiAweDAwMDI5OCAqLworCisgICAgdWludDY0X3QJCV9wYWRfMDAwMkEwWzEyXTsJCS8qIDB4MDAwMntBMC4uRjh9ICovCisKKyAgICAvKiAweDAwMDMwMC0weDAwMDNGOCAtLSBCdWZmZXIgQWRkcmVzcyBNYXRjaCBSZWdpc3RlcnMgKi8KKyAgICBzdHJ1Y3QgeworCXVpbnQ2NF90CXVwcGVyOwkJCQkvKiAweDAwMDN7MDAsLCxGMH0gKi8KKwl1aW50NjRfdAlsb3dlcjsJCQkJLyogMHgwMDAzezA4LCwsRjh9ICovCisgICAgfSBjcF9idWZfYWRkcl9tYXRjaFsxNl07CisKKyAgICAvKiAweDAwMDQwMC0weDAwMDVGRiAtLSBQZXJmb3JtYW5jZSBNb25pdG9yIFJlZ2lzdGVycyAoZXZlbiBvbmx5KSAqLworICAgIHN0cnVjdCB7CisJdWludDY0X3QJZmx1c2hfd190b3VjaDsJCQkvKiAweDAwMHs0MDAsLCw1QzB9ICovCisJdWludDY0X3QJZmx1c2hfd29fdG91Y2g7CQkJLyogMHgwMDB7NDA4LCwsNUM4fSAqLworCXVpbnQ2NF90CWluZmxpZ2h0OwkJCS8qIDB4MDAwezQxMCwsLDVEMH0gKi8KKwl1aW50NjRfdAlwcmVmZXRjaDsJCQkvKiAweDAwMHs0MTgsLCw1RDh9ICovCisJdWludDY0X3QJdG90YWxfcGNpX3JldHJ5OwkJLyogMHgwMDB7NDIwLCwsNUUwfSAqLworCXVpbnQ2NF90CW1heF9wY2lfcmV0cnk7CQkJLyogMHgwMDB7NDI4LCwsNUU4fSAqLworCXVpbnQ2NF90CW1heF9sYXRlbmN5OwkJCS8qIDB4MDAwezQzMCwsLDVGMH0gKi8KKwl1aW50NjRfdAljbGVhcl9hbGw7CQkJLyogMHgwMDB7NDM4LCwsNUY4fSAqLworICAgIH0gY3BfYnVmX2NvdW50WzhdOworCisKKyAgICAvKiAweDAwMDYwMC0weDAwMDlGRiAtLSBQQ0kvWCByZWdpc3RlcnMgKi8KKyAgICB1aW50NjRfdAkJY3BfcGNpeF9idXNfZXJyX2FkZHI7CQkvKiAweDAwMDYwMCAqLworICAgIHVpbnQ2NF90CQljcF9wY2l4X2J1c19lcnJfYXR0cjsJCS8qIDB4MDAwNjA4ICovCisgICAgdWludDY0X3QJCWNwX3BjaXhfYnVzX2Vycl9kYXRhOwkJLyogMHgwMDA2MTAgKi8KKyAgICB1aW50NjRfdAkJY3BfcGNpeF9waW9fc3BsaXRfYWRkcjsJCS8qIDB4MDAwNjE4ICovCisgICAgdWludDY0X3QJCWNwX3BjaXhfcGlvX3NwbGl0X2F0dHI7CQkvKiAweDAwMDYyMCAqLworICAgIHVpbnQ2NF90CQljcF9wY2l4X2RtYV9yZXFfZXJyX2F0dHI7CS8qIDB4MDAwNjI4ICovCisgICAgdWludDY0X3QJCWNwX3BjaXhfZG1hX3JlcV9lcnJfYWRkcjsJLyogMHgwMDA2MzAgKi8KKyAgICB1aW50NjRfdAkJY3BfcGNpeF90aW1lb3V0OwkJLyogMHgwMDA2MzggKi8KKworICAgIHVpbnQ2NF90CQlfcGFkXzAwMDY0MFsyNF07CQkvKiAweDAwMHs2NDAsLCw2Rjh9ICovCisKKyAgICAvKiAweDAwMDcwMC0weDAwMDczNyAtLSBEZWJ1ZyBSZWdpc3RlcnMgKi8KKyAgICB1aW50NjRfdAkJY3BfY3RfZGVidWdfY3RsOwkJLyogMHgwMDA3MDAgKi8KKyAgICB1aW50NjRfdAkJY3BfYnJfZGVidWdfY3RsOwkJLyogMHgwMDA3MDggKi8KKyAgICB1aW50NjRfdAkJY3BfbXV4M19kZWJ1Z19jdGw7CQkvKiAweDAwMDcxMCAqLworICAgIHVpbnQ2NF90CQljcF9tdXg0X2RlYnVnX2N0bDsJCS8qIDB4MDAwNzE4ICovCisgICAgdWludDY0X3QJCWNwX211eDVfZGVidWdfY3RsOwkJLyogMHgwMDA3MjAgKi8KKyAgICB1aW50NjRfdAkJY3BfbXV4Nl9kZWJ1Z19jdGw7CQkvKiAweDAwMDcyOCAqLworICAgIHVpbnQ2NF90CQljcF9tdXg3X2RlYnVnX2N0bDsJCS8qIDB4MDAwNzMwICovCisKKyAgICB1aW50NjRfdAkJX3BhZF8wMDA3MzhbODldOwkJLyogMHgwMDB7NzM4LCwsOUY4fSAqLworCisgICAgLyogMHgwMDBBMDAtMHgwMDBCRkYgLS0gUENJL1ggUmVhZCZXcml0ZSBCdWZmZXIgKi8KKyAgICBzdHJ1Y3QgeworCXVpbnQ2NF90CWNwX2J1Zl9hZGRyOwkJCS8qIDB4MDAwe0EwMCwsLEFGMH0gKi8KKwl1aW50NjRfdAljcF9idWZfYXR0cjsJCQkvKiAwWDAwMHtBMDgsLCxBRjh9ICovCisgICAgfSBjcF9wY2l4X3JlYWRfYnVmXzY0WzE2XTsKKworICAgIHN0cnVjdCB7CisJdWludDY0X3QJY3BfYnVmX2FkZHI7CQkJLyogMHgwMDB7QjAwLCwsQkUwfSAqLworCXVpbnQ2NF90CWNwX2J1Zl9hdHRyOwkJCS8qIDB4MDAwe0IwOCwsLEJFOH0gKi8KKwl1aW50NjRfdAljcF9idWZfdmFsaWQ7CQkJLyogMHgwMDB7QjEwLCwsQkYwfSAqLworCXVpbnQ2NF90CV9fcGFkMTsJCQkJLyogMHgwMDB7QjE4LCwsQkY4fSAqLworICAgIH0gY3BfcGNpeF93cml0ZV9idWZfNjRbOF07CisKKyAgICAvKiBFbmQgb2YgTG9jYWwgUmVnaXN0ZXJzIC0tIFN0YXJ0IG9mIEFkZHJlc3MgTWFwIHNwYWNlICovCisKKyAgICBjaGFyCQlfcGFkXzAwMGMwMFsweDAxMDAwMCAtIDB4MDAwYzAwXTsKKworICAgIC8qIDB4MDEwMDAwLTB4MDExRkY4IC0tIEludGVybmFsIEFURSBSQU0gKEF1dG8gUGFyaXR5IEdlbmVyYXRpb24pICovCisgICAgdWludDY0X3QJCWNwX2ludF9hdGVfcmFtWzEwMjRdOwkJLyogMHgwMTAwMDAtMHgwMTFGRjggKi8KKworICAgIGNoYXIJCV9wYWRfMDEyMDAwWzB4MTQwMDAgLSAweDAxMjAwMF07CisKKyAgICAvKiAweDAxNDAwMC0weDAxNUZGOCAtLSBJbnRlcm5hbCBBVEUgUkFNIChNYW51YWwgUGFyaXR5IEdlbmVyYXRpb24pICovCisgICAgdWludDY0X3QJCWNwX2ludF9hdGVfcmFtX21wWzEwMjRdOwkvKiAweDAxNDAwMC0weDAxNUZGOCAqLworCisgICAgY2hhcgkJX3BhZF8wMTYwMDBbMHgxODAwMCAtIDB4MDE2MDAwXTsKKworICAgIC8qIDB4MTgwMDAtMHgxOTdGOCAtLSBUSU9DUCBXcml0ZSBSZXF1ZXN0IFJhbSAqLworICAgIHVpbnQ2NF90CQljcF93cl9yZXFfbG93ZXJbMjU2XTsJCS8qIDB4MTgwMDAgLSAweDE4N0Y4ICovCisgICAgdWludDY0X3QJCWNwX3dyX3JlcV91cHBlclsyNTZdOwkJLyogMHgxODgwMCAtIDB4MThGRjggKi8KKyAgICB1aW50NjRfdAkJY3Bfd3JfcmVxX3Bhcml0eVsyNTZdOwkJLyogMHgxOTAwMCAtIDB4MTk3RjggKi8KKworICAgIGNoYXIJCV9wYWRfMDE5ODAwWzB4MUMwMDAgLSAweDAxOTgwMF07CisKKyAgICAvKiAweDFDMDAwLTB4MUVGRjggLS0gVElPQ1AgUmVhZCBSZXNwb25zZSBSYW0gKi8KKyAgICB1aW50NjRfdAkJY3BfcmRfcmVzcF9sb3dlcls1MTJdOwkJLyogMHgxQzAwMCAtIDB4MUNGRjggKi8KKyAgICB1aW50NjRfdAkJY3BfcmRfcmVzcF91cHBlcls1MTJdOwkJLyogMHgxRDAwMCAtIDB4MURGRjggKi8KKyAgICB1aW50NjRfdAkJY3BfcmRfcmVzcF9wYXJpdHlbNTEyXTsJCS8qIDB4MUUwMDAgLSAweDFFRkY4ICovCisKKyAgICBjaGFyCQlfcGFkXzAxRjAwMFsweDIwMDAwIC0gMHgwMUYwMDBdOworCisgICAgLyogMHgwMjAwMDAtMHgwMjFGRkYgLS0gSG9zdCBEZXZpY2UgKENQKSBDb25maWd1cmF0aW9uIFNwYWNlIChub3QgdXNlZCkgICovCisgICAgY2hhcgkJX3BhZF8wMjAwMDBbMHgwMjEwMDAgLSAweDIwMDAwXTsKKworICAgIC8qIDB4MDIxMDAwLTB4MDI3RkZGIC0tIFBDSSBEZXZpY2UgQ29uZmlndXJhdGlvbiBTcGFjZXMgKi8KKyAgICB1bmlvbiB7CisJdWludDhfdAkJY1sweDEwMDAgLyAxXTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXVpbnQxNl90CXNbMHgxMDAwIC8gMl07CQkJLyogMHgwMnswMDAwLCwsN0ZGRn0gKi8KKwl1aW50MzJfdAlsWzB4MTAwMCAvIDRdOwkJCS8qIDB4MDJ7MDAwMCwsLDdGRkZ9ICovCisJdWludDY0X3QJZFsweDEwMDAgLyA4XTsJCQkvKiAweDAyezAwMDAsLCw3RkZGfSAqLworCXVuaW9uIHsKKwkgICAgdWludDhfdAljWzB4MTAwIC8gMV07CisJICAgIHVpbnQxNl90CXNbMHgxMDAgLyAyXTsKKwkgICAgdWludDMyX3QJbFsweDEwMCAvIDRdOworCSAgICB1aW50NjRfdAlkWzB4MTAwIC8gOF07CisJfSBmWzhdOworICAgIH0gY3BfdHlwZTBfY2ZnX2Rldls3XTsJCQkJLyogMHgwMnsxMDAwLCwsN0ZGRn0gKi8KKworICAgIC8qIDB4MDI4MDAwLTB4MDI4RkZGIC0tIFBDSSBUeXBlIDEgQ29uZmlndXJhdGlvbiBTcGFjZSAqLworICAgIHVuaW9uIHsKKwl1aW50OF90CQljWzB4MTAwMCAvIDFdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCisJdWludDE2X3QJc1sweDEwMDAgLyAyXTsJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLworCXVpbnQzMl90CWxbMHgxMDAwIC8gNF07CQkJLyogMHgwMjgwMDAtMHgwMjkwMDAgKi8KKwl1aW50NjRfdAlkWzB4MTAwMCAvIDhdOwkJCS8qIDB4MDI4MDAwLTB4MDI5MDAwICovCisJdW5pb24geworCSAgICB1aW50OF90CWNbMHgxMDAgLyAxXTsKKwkgICAgdWludDE2X3QJc1sweDEwMCAvIDJdOworCSAgICB1aW50MzJfdAlsWzB4MTAwIC8gNF07CisJICAgIHVpbnQ2NF90CWRbMHgxMDAgLyA4XTsKKwl9IGZbOF07CisgICAgfSBjcF90eXBlMV9jZmc7CQkJCQkvKiAweDAyODAwMC0weDAyOTAwMCAqLworCisgICAgY2hhcgkJX3BhZF8wMjkwMDBbMHgwMzAwMDAtMHgwMjkwMDBdOworCisgICAgLyogMHgwMzAwMDAtMHgwMzAwMDcgLS0gUENJIEludGVycnVwdCBBY2tub3dsZWRnZSBDeWNsZSAqLworICAgIHVuaW9uIHsKKwl1aW50OF90CQljWzggLyAxXTsKKwl1aW50MTZfdAlzWzggLyAyXTsKKwl1aW50MzJfdAlsWzggLyA0XTsKKwl1aW50NjRfdAlkWzggLyA4XTsKKyAgICB9IGNwX3BjaV9pYWNrOwkJCQkJLyogMHgwMzAwMDAtMHgwMzAwMDcgKi8KKworICAgIGNoYXIJCV9wYWRfMDMwMDA3WzB4MDQwMDAwLTB4MDMwMDA4XTsKKworICAgIC8qIDB4MDQwMDAwLTB4MDQwMDA3IC0tIFBDSVggU3BlY2lhbCBDeWNsZSAqLworICAgIHVuaW9uIHsKKwl1aW50OF90CQljWzggLyAxXTsKKwl1aW50MTZfdAlzWzggLyAyXTsKKwl1aW50MzJfdAlsWzggLyA0XTsKKwl1aW50NjRfdAlkWzggLyA4XTsKKyAgICB9IGNwX3BjaXhfY3ljbGU7CQkJCQkvKiAweDA0MDAwMC0weDA0MDAwNyAqLworCisgICAgY2hhcgkJX3BhZF8wNDAwMDdbMHgyMDAwMDAtMHgwNDAwMDhdOworCisgICAgLyogMHgyMDAwMDAtMHg3RkZGRkYgLS0gUENJL0dJTyBEZXZpY2UgU3BhY2VzICovCisgICAgdW5pb24geworCXVpbnQ4X3QJCWNbMHgxMDAwMDAgLyAxXTsKKwl1aW50MTZfdAlzWzB4MTAwMDAwIC8gMl07CisJdWludDMyX3QJbFsweDEwMDAwMCAvIDRdOworCXVpbnQ2NF90CWRbMHgxMDAwMDAgLyA4XTsKKyAgICB9IGNwX2RldmlvX3Jhd1s2XTsJCQkJCS8qIDB4MjAwMDAwLTB4N0ZGRkZGICovCisKKyAgICAjZGVmaW5lIGNwX2RldmlvKG4pICBjcF9kZXZpb19yYXdbKChuKTwyKT8obioyKToobisyKV0KKworICAgIGNoYXIJCV9wYWRfODAwMDAwWzB4QTAwMDAwLTB4ODAwMDAwXTsKKworICAgIC8qIDB4QTAwMDAwLTB4QkZGRkZGIC0tIFBDSS9HSU8gRGV2aWNlIFNwYWNlcyB3L2ZsdXNoICAqLworICAgIHVuaW9uIHsKKwl1aW50OF90CQljWzB4MTAwMDAwIC8gMV07CisJdWludDE2X3QJc1sweDEwMDAwMCAvIDJdOworCXVpbnQzMl90CWxbMHgxMDAwMDAgLyA0XTsKKwl1aW50NjRfdAlkWzB4MTAwMDAwIC8gOF07CisgICAgfSBjcF9kZXZpb19yYXdfZmx1c2hbNl07CQkJCS8qIDB4QTAwMDAwLTB4QkZGRkZGICovCisKKyAgICAjZGVmaW5lIGNwX2RldmlvX2ZsdXNoKG4pICBjcF9kZXZpb19yYXdfZmx1c2hbKChuKTwyKT8obioyKToobisyKV0KKworfTsKKworI2VuZGlmIAkvKiBfQVNNX0lBNjRfU05fUENJX1RJT0NQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24veHAuaAppbmRleCA5OTAyMTg1Li4xZGYxYzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3hwLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi94cC5oCkBAIC0xNiw3ICsxNiw2IEBACiAjZGVmaW5lIF9BU01fSUE2NF9TTl9YUF9ICiAKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxhc20vc24vdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oCmluZGV4IDZmNTE2ZTcuLmNkMmNmNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zeXN0ZW0uaApAQCAtMTgzLDggKzE4Myw2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgcHJlcGFyZV90b19zd2l0Y2goKSAgICBkbyB7IH0gd2hpbGUoMCkKLQogI2lmZGVmIENPTkZJR19JQTMyX1NVUFBPUlQKICMgZGVmaW5lIElTX0lBMzJfUFJPQ0VTUyhyZWdzKQkoaWE2NF9wc3IocmVncyktPmlzICE9IDApCiAjZWxzZQpAQCAtMjc0LDEzICsyNzIsNyBAQAogICogb2YgdGhhdCBDUFUgd2hpY2ggd2lsbCBub3QgYmUgcmVsZWFzZWQsIGJlY2F1c2UgdGhlcmUgd2Ugd2FpdCBmb3IgdGhlCiAgKiB0YXNrbGlzdF9sb2NrIHRvIGJlY29tZSBhdmFpbGFibGUuCiAgKi8KLSNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChycSwgbmV4dCkJCVwKLWRvIHsJCQkJCQlcCi0Jc3Bpbl9sb2NrKCYobmV4dCktPnN3aXRjaF9sb2NrKTsJXAotCXNwaW5fdW5sb2NrKCYocnEpLT5sb2NrKTsJCVwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChycSwgcHJldikJc3Bpbl91bmxvY2tfaXJxKCYocHJldiktPnN3aXRjaF9sb2NrKQotI2RlZmluZSB0YXNrX3J1bm5pbmcocnEsIHApIAkJKChycSktPmN1cnIgPT0gKHApIHx8IHNwaW5faXNfbG9ja2VkKCYocCktPnN3aXRjaF9sb2NrKSkKKyNkZWZpbmUgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKIAogI2RlZmluZSBpYTY0X3BsYXRmb3JtX2lzKHgpIChzdHJjbXAoeCwgcGxhdGZvcm1fbmFtZSkgPT0gMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20taWE2NC90b3BvbG9neS5oCmluZGV4IDIxY2YzNTEuLjRlNjRjMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3RvcG9sb2d5LmgKQEAgLTQyLDI1ICs0Miw1NCBAQAogCiB2b2lkIGJ1aWxkX2NwdV90b19ub2RlX21hcCh2b2lkKTsKIAorI2RlZmluZSBTRF9DUFVfSU5JVCAoc3RydWN0IHNjaGVkX2RvbWFpbikgewkJXAorCS5zcGFuCQkJPSBDUFVfTUFTS19OT05FLAlcCisJLnBhcmVudAkJCT0gTlVMTCwJCQlcCisJLmdyb3VwcwkJCT0gTlVMTCwJCQlcCisJLm1pbl9pbnRlcnZhbAkJPSAxLAkJCVwKKwkubWF4X2ludGVydmFsCQk9IDQsCQkJXAorCS5idXN5X2ZhY3RvcgkJPSA2NCwJCQlcCisJLmltYmFsYW5jZV9wY3QJCT0gMTI1LAkJCVwKKwkuY2FjaGVfaG90X3RpbWUJCT0gKDEwKjEwMDAwMDApLAkJXAorCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKKwkuY2FjaGVfbmljZV90cmllcwk9IDIsCQkJXAorCS5idXN5X2lkeAkJPSAyLAkJCVwKKwkuaWRsZV9pZHgJCT0gMSwJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDIsCQkJXAorCS53YWtlX2lkeAkJPSAxLAkJCVwKKwkuZm9ya2V4ZWNfaWR4CQk9IDEsCQkJXAorCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKKwkJCQl8IFNEX0JBTEFOQ0VfTkVXSURMRQlcCisJCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAorCQkJCXwgU0RfV0FLRV9BRkZJTkUsCVwKKwkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCisJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKKwkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKK30KKwogLyogc2NoZWRfZG9tYWlucyBTRF9OT0RFX0lOSVQgZm9yIElBNjQgTlVNQSBtYWNoaW5lcyAqLwogI2RlZmluZSBTRF9OT0RFX0lOSVQgKHN0cnVjdCBzY2hlZF9kb21haW4pIHsJCVwKIAkuc3BhbgkJCT0gQ1BVX01BU0tfTk9ORSwJXAogCS5wYXJlbnQJCQk9IE5VTEwsCQkJXAogCS5ncm91cHMJCQk9IE5VTEwsCQkJXAotCS5taW5faW50ZXJ2YWwJCT0gODAsCQkJXAotCS5tYXhfaW50ZXJ2YWwJCT0gMzIwLAkJCVwKLQkuYnVzeV9mYWN0b3IJCT0gMzIwLAkJCVwKKwkubWluX2ludGVydmFsCQk9IDgsCQkJXAorCS5tYXhfaW50ZXJ2YWwJCT0gOCoobWluKG51bV9vbmxpbmVfY3B1cygpLCAzMikpLCBcCisJLmJ1c3lfZmFjdG9yCQk9IDY0LAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAogCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCi0JLmNhY2hlX25pY2VfdHJpZXMJPSAxLAkJCVwKKwkuY2FjaGVfbmljZV90cmllcwk9IDIsCQkJXAorCS5idXN5X2lkeAkJPSAzLAkJCVwKKwkuaWRsZV9pZHgJCT0gMiwJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCisJLndha2VfaWR4CQk9IDEsCQkJXAorCS5mb3JrZXhlY19pZHgJCT0gMSwJCQlcCiAJLnBlcl9jcHVfZ2FpbgkJPSAxMDAsCQkJXAogCS5mbGFncwkJCT0gU0RfTE9BRF9CQUxBTkNFCVwKIAkJCQl8IFNEX0JBTEFOQ0VfRVhFQwlcCi0JCQkJfCBTRF9CQUxBTkNFX05FV0lETEUJXAotCQkJCXwgU0RfV0FLRV9JRExFCQlcCisJCQkJfCBTRF9CQUxBTkNFX0ZPUksJXAogCQkJCXwgU0RfV0FLRV9CQUxBTkNFLAlcCiAJLmxhc3RfYmFsYW5jZQkJPSBqaWZmaWVzLAkJXAotCS5iYWxhbmNlX2ludGVydmFsCT0gMSwJCQlcCisJLmJhbGFuY2VfaW50ZXJ2YWwJPSA2NCwJCQlcCiAJLm5yX2JhbGFuY2VfZmFpbGVkCT0gMCwJCQlcCiB9CiAKQEAgLTY5LDE3ICs5OCwyMSBAQAogCS5zcGFuCQkJPSBDUFVfTUFTS19OT05FLAlcCiAJLnBhcmVudAkJCT0gTlVMTCwJCQlcCiAJLmdyb3VwcwkJCT0gTlVMTCwJCQlcCi0JLm1pbl9pbnRlcnZhbAkJPSA4MCwJCQlcCi0JLm1heF9pbnRlcnZhbAkJPSAzMjAsCQkJXAotCS5idXN5X2ZhY3RvcgkJPSAzMjAsCQkJXAotCS5pbWJhbGFuY2VfcGN0CQk9IDEyNSwJCQlcCisJLm1pbl9pbnRlcnZhbAkJPSA2NCwJCQlcCisJLm1heF9pbnRlcnZhbAkJPSA2NCpudW1fb25saW5lX2NwdXMoKSwJXAorCS5idXN5X2ZhY3RvcgkJPSAxMjgsCQkJXAorCS5pbWJhbGFuY2VfcGN0CQk9IDEzMywJCQlcCiAJLmNhY2hlX2hvdF90aW1lCQk9ICgxMCoxMDAwMDAwKSwJCVwKIAkuY2FjaGVfbmljZV90cmllcwk9IDEsCQkJXAorCS5idXN5X2lkeAkJPSAzLAkJCVwKKwkuaWRsZV9pZHgJCT0gMywJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCisJLndha2VfaWR4CQk9IDAsIC8qIHVudXNlZCAqLwlcCisJLmZvcmtleGVjX2lkeAkJPSAwLCAvKiB1bnVzZWQgKi8JXAogCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKLQkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRQlcCi0JCQkJfCBTRF9CQUxBTkNFX0VYRUMsCVwKKwkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRSwJXAogCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKLQkuYmFsYW5jZV9pbnRlcnZhbAk9IDEwMCooNjMrbnVtX29ubGluZV9jcHVzKCkpLzY0LCAgIFwKKwkuYmFsYW5jZV9pbnRlcnZhbAk9IDY0LAkJCVwKIAkubnJfYmFsYW5jZV9mYWlsZWQJPSAwLAkJCVwKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKaW5kZXggZjdmNDNlYy4uNTE3ZjE2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCkBAIC0yNjMsNiArMjYzLDggQEAKICNkZWZpbmUgX19OUl9hZGRfa2V5CQkJMTI3MQogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CQkxMjcyCiAjZGVmaW5lIF9fTlJfa2V5Y3RsCQkJMTI3MworI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCQkxMjc0CisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJCTEyNzUKICNkZWZpbmUgX19OUl9zZXRfem9uZV9yZWNsYWltCQkxMjc2CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3ZnYS5oIGIvaW5jbHVkZS9hc20taWE2NC92Z2EuaAppbmRleCAxZjQ0NmQ2Li5iYzMzNDlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3ZnYS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvdmdhLmgKQEAgLTE0LDcgKzE0LDEwIEBACiAgKiB2aWRlb3JhbSBkaXJlY3RseSB3aXRob3V0IGFueSBibGFjayBtYWdpYy4KICAqLwogCi0jZGVmaW5lIFZHQV9NQVBfTUVNKHgpCSgodW5zaWduZWQgbG9uZykgaW9yZW1hcCgoeCksIDApKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmdhX2NvbnNvbGVfaW9iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmdhX2NvbnNvbGVfbWVtYmFzZTsKKworI2RlZmluZSBWR0FfTUFQX01FTSh4KQkoKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAodmdhX2NvbnNvbGVfbWVtYmFzZSArICh4KSwgMCkpCiAKICNkZWZpbmUgdmdhX3JlYWRiKHgpCSgqKHgpKQogI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkJKCooeSkgPSAoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tMzJyL3MxZDEzODA2LmggYi9pbmNsdWRlL2FzbS1tMzJyL3MxZDEzODA2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4ZDM2YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW0zMnIvczFkMTM4MDYuaApAQCAtMCwwICsxLDE5OSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEZpbGUgZ2VuZXJhdGVkIGJ5IFMxRDEzODA2Q0ZHLkVYRQorLy8KKy8vICBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBFcHNvbiBSZXNlYXJjaCBhbmQgRGV2ZWxvcG1lbnQsIEluYy4KKy8vICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQYW5lbDogIChhY3RpdmUpICA2NDB4NDgwIDc3SHogU1ROIFNpbmdsZSA4LWJpdCAoUENMSz1DTEtJPTI1LjE3NU1IeikKKy8vIE1lbW9yeTogRW1iZWRkZWQgU0RSQU0gKE1DTEs9Q0xLSTM9NTAuMDAwTUh6KSAoQlVTQ0xLPTMzLjMzM01IeikKKworI2RlZmluZSBTV0lWRUxfVklFVwkJMAkvKiAwOm5vbmUsIDE6OTAgbm90IGNvbXBsZXRlZCAqLworCitzdGF0aWMgc3RydWN0IHMxZDEzeHh4ZmJfcmVndmFsIHMxZDEzeHh4ZmJfaW5pdHJlZ3NbXSA9IHsKKworICAgIHsweDAwMDEsMHgwMH0sICAgLy8gTWlzY2VsbGFuZW91cyBSZWdpc3RlcgorICAgIHsweDAxRkMsMHgwMH0sICAgLy8gRGlzcGxheSBNb2RlIFJlZ2lzdGVyCisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSSkKKyAgICB7MHgwMDA0LDB4MDB9LCAgIC8vIEdlbmVyYWwgSU8gUGlucyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDA1LDB4MDB9LCAgIC8vIEdlbmVyYWwgSU8gUGlucyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDA4LDB4MDB9LCAgIC8vIEdlbmVyYWwgSU8gUGlucyBDb250cm9sIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDA5LDB4MDB9LCAgIC8vIEdlbmVyYWwgSU8gUGlucyBDb250cm9sIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDEwLDB4MDB9LCAgIC8vIE1lbW9yeSBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAxNCwweDAwfSwgICAvLyBMQ0QgUGl4ZWwgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgorICAgIHsweDAwMTgsMHgwMH0sICAgLy8gQ1JUL1RWIFBpeGVsIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDFDLDB4MDB9LCAgIC8vIE1lZGlhUGx1ZyBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisvKgorICogLi4gMTBNSHo6IDB4MDAKKyAqIC4uIDMwTUh6OiAweDAxCisgKiAzME1IeiAuLjogMHgwMgorICovCisgICAgezB4MDAxRSwweDAyfSwgICAvLyBDUFUgVG8gTWVtb3J5IFdhaXQgU3RhdGUgU2VsZWN0IFJlZ2lzdGVyCisgICAgezB4MDAyMSwweDAyfSwgICAvLyBEUkFNIFJlZnJlc2ggUmF0ZSBSZWdpc3RlcgorICAgIHsweDAwMkEsMHgxMX0sICAgLy8gRFJBTSBUaW1pbmdzIENvbnRyb2wgUmVnaXN0ZXIgMAorICAgIHsweDAwMkIsMHgxM30sICAgLy8gRFJBTSBUaW1pbmdzIENvbnRyb2wgUmVnaXN0ZXIgMQorICAgIHsweDAwMjAsMHg4MH0sICAgLy8gTWVtb3J5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDMwLDB4MjV9LCAgIC8vIFBhbmVsIFR5cGUgUmVnaXN0ZXIKKyAgICB7MHgwMDMxLDB4MDB9LCAgIC8vIE1PRCBSYXRlIFJlZ2lzdGVyCisgICAgezB4MDAzMiwweDRGfSwgICAvLyBMQ0QgSG9yaXpvbnRhbCBEaXNwbGF5IFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDAzNCwweDEyfSwgICAvLyBMQ0QgSG9yaXpvbnRhbCBOb24tRGlzcGxheSBQZXJpb2QgUmVnaXN0ZXIKKyAgICB7MHgwMDM1LDB4MDF9LCAgIC8vIFRGVCBGUExJTkUgU3RhcnQgUG9zaXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDM2LDB4MEJ9LCAgIC8vIFRGVCBGUExJTkUgUHVsc2UgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDM4LDB4REZ9LCAgIC8vIExDRCBWZXJ0aWNhbCBEaXNwbGF5IEhlaWdodCBSZWdpc3RlciAwCisgICAgezB4MDAzOSwweDAxfSwgICAvLyBMQ0QgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMQorICAgIHsweDAwM0EsMHgyQ30sICAgLy8gTENEIFZlcnRpY2FsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorICAgIHsweDAwM0IsMHgwQX0sICAgLy8gVEZUIEZQRlJBTUUgU3RhcnQgUG9zaXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDNDLDB4MDF9LCAgIC8vIFRGVCBGUEZSQU1FIFB1bHNlIFdpZHRoIFJlZ2lzdGVyCisKKyAgICB7MHgwMDQxLDB4MDB9LCAgIC8vIExDRCBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVyCisgICAgezB4MDA0MiwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDQzLDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMQorICAgIHsweDAwNDQsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAyCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BMQVRfTTMyNzAwVVQpIHx8IGRlZmluZWQoQ09ORklHX1BMQVRfT1BTUFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX01BUFBJMykKKyAgICB7MHgwMDA0LDB4MDd9LCAgIC8vIEdQSU9bMDo3XSBkaXJlY3Rpb24KKyAgICB7MHgwMDA1LDB4MDB9LCAgIC8vIEdQSU9bODoxMl0gZGlyZWN0aW9uCisgICAgezB4MDAwOCwweDAwfSwgICAvLyBHUElPWzA6N10gZGF0YQorICAgIHsweDAwMDksMHgwMH0sICAgLy8gR1BJT1s4OjEyXSBkYXRhCisgICAgezB4MDAwOCwweDA0fSwgICAvLyBMQ0QgcGFuZWwgVmNjIG9uCisgICAgezB4MDAwOCwweDA1fSwgICAvLyBMQ0QgcGFuZWwgcmVzZXQKKyAgICB7MHgwMDEwLDB4MDF9LCAgIC8vIE1lbW9yeSBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAxNCwweDMwfSwgICAvLyBMQ0QgUGl4ZWwgQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoQ0xLSSAyMk1Iei80KQorICAgIHsweDAwMTgsMHgwMH0sICAgLy8gQ1JUL1RWIFBpeGVsIENsb2NrIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDFDLDB4MDB9LCAgIC8vIE1lZGlhUGx1ZyBDbG9jayBDb25maWd1cmF0aW9uIFJlZ2lzdGVyKDEwTUh6KQorICAgIHsweDAwMUUsMHgwMH0sICAgLy8gQ1BVIFRvIE1lbW9yeSBXYWl0IFN0YXRlIFNlbGVjdCBSZWdpc3RlcgorICAgIHsweDAwMjAsMHg4MH0sICAgLy8gTWVtb3J5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDIxLDB4MDN9LCAgIC8vIERSQU0gUmVmcmVzaCBSYXRlIFJlZ2lzdGVyCisgICAgezB4MDAyQSwweDAwfSwgICAvLyBEUkFNIFRpbWluZ3MgQ29udHJvbCBSZWdpc3RlciAwCisgICAgezB4MDAyQiwweDAxfSwgICAvLyBEUkFNIFRpbWluZ3MgQ29udHJvbCBSZWdpc3RlciAxCisgICAgezB4MDAzMCwweDI1fSwgICAvLyBQYW5lbCBUeXBlIFJlZ2lzdGVyCisgICAgezB4MDAzMSwweDAwfSwgICAvLyBNT0QgUmF0ZSBSZWdpc3RlcgorICAgIHsweDAwMzIsMHgxZH0sICAgLy8gTENEIEhvcml6b250YWwgRGlzcGxheSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwMzQsMHgwNX0sICAgLy8gTENEIEhvcml6b250YWwgTm9uLURpc3BsYXkgUGVyaW9kIFJlZ2lzdGVyCisgICAgezB4MDAzNSwweDAxfSwgICAvLyBURlQgRlBMSU5FIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAzNiwweDAxfSwgICAvLyBURlQgRlBMSU5FIFB1bHNlIFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDAzOCwweDNGfSwgICAvLyBMQ0QgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMAorICAgIHsweDAwMzksMHgwMX0sICAgLy8gTENEIFZlcnRpY2FsIERpc3BsYXkgSGVpZ2h0IFJlZ2lzdGVyIDEKKyAgICB7MHgwMDNBLDB4MGJ9LCAgIC8vIExDRCBWZXJ0aWNhbCBOb24tRGlzcGxheSBQZXJpb2QgUmVnaXN0ZXIKKyAgICB7MHgwMDNCLDB4MDd9LCAgIC8vIFRGVCBGUEZSQU1FIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisgICAgezB4MDAzQywweDAyfSwgICAvLyBURlQgRlBGUkFNRSBQdWxzZSBXaWR0aCBSZWdpc3RlcgorCisgICAgezB4MDA0MSwweDAwfSwgICAvLyBMQ0QgTWlzY2VsbGFuZW91cyBSZWdpc3RlcgorI2lmIChTV0lWRUxfVklFVyA9PSAwKQorICAgIHsweDAwNDIsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisgICAgezB4MDA0MywweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDQ0LDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorCisjZWxpZiAoU1dJVkVMX1ZJRVcgPT0gMSkKKyAgICAvLyAxMDI0IC0gVygzMjApID0gMHgyQzAKKyAgICB7MHgwMDQyLDB4QzB9LCAgIC8vIExDRCBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMAorICAgIHsweDAwNDMsMHgwMn0sICAgLy8gTENEIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAxCisgICAgezB4MDA0NCwweDAwfSwgICAvLyBMQ0QgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKyAgICAvLyAxMDI0CisgICAgezB4MDA0NiwweDAwfSwgICAvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMDQ3LDB4MDJ9LCAgIC8vIExDRCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMQorI2Vsc2UKKyNlcnJvciB1bnN1cHBvcnRlZCBTV0lWRUxfVklFVyBtb2RlCisjZW5kaWYKKyNlbHNlCisjZXJyb3Igbm8gcGxhdGZvcm0gY29uZmlndXJhdGlvbgorI2VuZGlmICAvKiBDT05GSUdfUExBVF9YWFggKi8KKworICAgIHsweDAwNDgsMHgwMH0sICAgLy8gTENEIFBpeGVsIFBhbm5pbmcgUmVnaXN0ZXIKKyAgICB7MHgwMDRBLDB4MDB9LCAgIC8vIExDRCBEaXNwbGF5IEZJRk8gSGlnaCBUaHJlc2hvbGQgQ29udHJvbCBSZWdpc3RlcgorICAgIHsweDAwNEIsMHgwMH0sICAgLy8gTENEIERpc3BsYXkgRklGTyBMb3cgVGhyZXNob2xkIENvbnRyb2wgUmVnaXN0ZXIKKyAgICB7MHgwMDUwLDB4NEZ9LCAgIC8vIENSVC9UViBIb3Jpem9udGFsIERpc3BsYXkgV2lkdGggUmVnaXN0ZXIKKyAgICB7MHgwMDUyLDB4MTN9LCAgIC8vIENSVC9UViBIb3Jpem9udGFsIE5vbi1EaXNwbGF5IFBlcmlvZCBSZWdpc3RlcgorICAgIHsweDAwNTMsMHgwMX0sICAgLy8gQ1JUL1RWIEhSVEMgU3RhcnQgUG9zaXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMDU0LDB4MEJ9LCAgIC8vIENSVC9UViBIUlRDIFB1bHNlIFdpZHRoIFJlZ2lzdGVyCisgICAgezB4MDA1NiwweERGfSwgICAvLyBDUlQvVFYgVmVydGljYWwgRGlzcGxheSBIZWlnaHQgUmVnaXN0ZXIgMAorICAgIHsweDAwNTcsMHgwMX0sICAgLy8gQ1JUL1RWIFZlcnRpY2FsIERpc3BsYXkgSGVpZ2h0IFJlZ2lzdGVyIDEKKyAgICB7MHgwMDU4LDB4MkJ9LCAgIC8vIENSVC9UViBWZXJ0aWNhbCBOb24tRGlzcGxheSBQZXJpb2QgUmVnaXN0ZXIKKyAgICB7MHgwMDU5LDB4MDl9LCAgIC8vIENSVC9UViBWUlRDIFN0YXJ0IFBvc2l0aW9uIFJlZ2lzdGVyCisgICAgezB4MDA1QSwweDAxfSwgICAvLyBDUlQvVFYgVlJUQyBQdWxzZSBXaWR0aCBSZWdpc3RlcgorICAgIHsweDAwNUIsMHgxMH0sICAgLy8gVFYgT3V0cHV0IENvbnRyb2wgUmVnaXN0ZXIKKworICAgIHsweDAwNjIsMHgwMH0sICAgLy8gQ1JUL1RWIERpc3BsYXkgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisgICAgezB4MDA2MywweDAwfSwgICAvLyBDUlQvVFYgRGlzcGxheSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDY0LDB4MDB9LCAgIC8vIENSVC9UViBEaXNwbGF5IFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMgorCisgICAgezB4MDA2OCwweDAwfSwgICAvLyBDUlQvVFYgUGl4ZWwgUGFubmluZyBSZWdpc3RlcgorICAgIHsweDAwNkEsMHgwMH0sICAgLy8gQ1JUL1RWIERpc3BsYXkgRklGTyBIaWdoIFRocmVzaG9sZCBDb250cm9sIFJlZ2lzdGVyCisgICAgezB4MDA2QiwweDAwfSwgICAvLyBDUlQvVFYgRGlzcGxheSBGSUZPIExvdyBUaHJlc2hvbGQgQ29udHJvbCBSZWdpc3RlcgorICAgIHsweDAwNzAsMHgwMH0sICAgLy8gTENEIEluay9DdXJzb3IgQ29udHJvbCBSZWdpc3RlcgorICAgIHsweDAwNzEsMHgwMX0sICAgLy8gTENEIEluay9DdXJzb3IgU3RhcnQgQWRkcmVzcyBSZWdpc3RlcgorICAgIHsweDAwNzIsMHgwMH0sICAgLy8gTENEIEN1cnNvciBYIFBvc2l0aW9uIFJlZ2lzdGVyIDAKKyAgICB7MHgwMDczLDB4MDB9LCAgIC8vIExDRCBDdXJzb3IgWCBQb3NpdGlvbiBSZWdpc3RlciAxCisgICAgezB4MDA3NCwweDAwfSwgICAvLyBMQ0QgQ3Vyc29yIFkgUG9zaXRpb24gUmVnaXN0ZXIgMAorICAgIHsweDAwNzUsMHgwMH0sICAgLy8gTENEIEN1cnNvciBZIFBvc2l0aW9uIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDc2LDB4MDB9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMCBSZWdpc3RlcgorICAgIHsweDAwNzcsMHgwMH0sICAgLy8gTENEIEluay9DdXJzb3IgR3JlZW4gQ29sb3IgMCBSZWdpc3RlcgorICAgIHsweDAwNzgsMHgwMH0sICAgLy8gTENEIEluay9DdXJzb3IgUmVkIENvbG9yIDAgUmVnaXN0ZXIKKyAgICB7MHgwMDdBLDB4MUZ9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIEJsdWUgQ29sb3IgMSBSZWdpc3RlcgorICAgIHsweDAwN0IsMHgzRn0sICAgLy8gTENEIEluay9DdXJzb3IgR3JlZW4gQ29sb3IgMSBSZWdpc3RlcgorICAgIHsweDAwN0MsMHgxRn0sICAgLy8gTENEIEluay9DdXJzb3IgUmVkIENvbG9yIDEgUmVnaXN0ZXIKKyAgICB7MHgwMDdFLDB4MDB9LCAgIC8vIExDRCBJbmsvQ3Vyc29yIEZJRk8gVGhyZXNob2xkIFJlZ2lzdGVyCisgICAgezB4MDA4MCwweDAwfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBDb250cm9sIFJlZ2lzdGVyCisgICAgezB4MDA4MSwweDAxfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyCisgICAgezB4MDA4MiwweDAwfSwgICAvLyBDUlQvVFYgQ3Vyc29yIFggUG9zaXRpb24gUmVnaXN0ZXIgMAorICAgIHsweDAwODMsMHgwMH0sICAgLy8gQ1JUL1RWIEN1cnNvciBYIFBvc2l0aW9uIFJlZ2lzdGVyIDEKKyAgICB7MHgwMDg0LDB4MDB9LCAgIC8vIENSVC9UViBDdXJzb3IgWSBQb3NpdGlvbiBSZWdpc3RlciAwCisgICAgezB4MDA4NSwweDAwfSwgICAvLyBDUlQvVFYgQ3Vyc29yIFkgUG9zaXRpb24gUmVnaXN0ZXIgMQorICAgIHsweDAwODYsMHgwMH0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgQmx1ZSBDb2xvciAwIFJlZ2lzdGVyCisgICAgezB4MDA4NywweDAwfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBHcmVlbiBDb2xvciAwIFJlZ2lzdGVyCisgICAgezB4MDA4OCwweDAwfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBSZWQgQ29sb3IgMCBSZWdpc3RlcgorICAgIHsweDAwOEEsMHgxRn0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgQmx1ZSBDb2xvciAxIFJlZ2lzdGVyCisgICAgezB4MDA4QiwweDNGfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBHcmVlbiBDb2xvciAxIFJlZ2lzdGVyCisgICAgezB4MDA4QywweDFGfSwgICAvLyBDUlQvVFYgSW5rL0N1cnNvciBSZWQgQ29sb3IgMSBSZWdpc3RlcgorICAgIHsweDAwOEUsMHgwMH0sICAgLy8gQ1JUL1RWIEluay9DdXJzb3IgRklGTyBUaHJlc2hvbGQgUmVnaXN0ZXIKKyAgICB7MHgwMTAwLDB4MDB9LCAgIC8vIEJpdEJsdCBDb250cm9sIFJlZ2lzdGVyIDAKKyAgICB7MHgwMTAxLDB4MDB9LCAgIC8vIEJpdEJsdCBDb250cm9sIFJlZ2lzdGVyIDEKKyAgICB7MHgwMTAyLDB4MDB9LCAgIC8vIEJpdEJsdCBST1AgQ29kZS9Db2xvciBFeHBhbnNpb24gUmVnaXN0ZXIKKyAgICB7MHgwMTAzLDB4MDB9LCAgIC8vIEJpdEJsdCBPcGVyYXRpb24gUmVnaXN0ZXIKKyAgICB7MHgwMTA0LDB4MDB9LCAgIC8vIEJpdEJsdCBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAwCisgICAgezB4MDEwNSwweDAwfSwgICAvLyBCaXRCbHQgU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgMQorICAgIHsweDAxMDYsMHgwMH0sICAgLy8gQml0Qmx0IFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKyAgICB7MHgwMTA4LDB4MDB9LCAgIC8vIEJpdEJsdCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDAKKyAgICB7MHgwMTA5LDB4MDB9LCAgIC8vIEJpdEJsdCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDEKKyAgICB7MHgwMTBBLDB4MDB9LCAgIC8vIEJpdEJsdCBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIDIKKyAgICB7MHgwMTBDLDB4MDB9LCAgIC8vIEJpdEJsdCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMAorICAgIHsweDAxMEQsMHgwMH0sICAgLy8gQml0Qmx0IE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAxCisgICAgezB4MDExMCwweDAwfSwgICAvLyBCaXRCbHQgV2lkdGggUmVnaXN0ZXIgMAorICAgIHsweDAxMTEsMHgwMH0sICAgLy8gQml0Qmx0IFdpZHRoIFJlZ2lzdGVyIDEKKyAgICB7MHgwMTEyLDB4MDB9LCAgIC8vIEJpdEJsdCBIZWlnaHQgUmVnaXN0ZXIgMAorICAgIHsweDAxMTMsMHgwMH0sICAgLy8gQml0Qmx0IEhlaWdodCBSZWdpc3RlciAxCisgICAgezB4MDExNCwweDAwfSwgICAvLyBCaXRCbHQgQmFja2dyb3VuZCBDb2xvciBSZWdpc3RlciAwCisgICAgezB4MDExNSwweDAwfSwgICAvLyBCaXRCbHQgQmFja2dyb3VuZCBDb2xvciBSZWdpc3RlciAxCisgICAgezB4MDExOCwweDAwfSwgICAvLyBCaXRCbHQgRm9yZWdyb3VuZCBDb2xvciBSZWdpc3RlciAwCisgICAgezB4MDExOSwweDAwfSwgICAvLyBCaXRCbHQgRm9yZWdyb3VuZCBDb2xvciBSZWdpc3RlciAxCisgICAgezB4MDFFMCwweDAwfSwgICAvLyBMb29rLVVwIFRhYmxlIE1vZGUgUmVnaXN0ZXIKKyAgICB7MHgwMUUyLDB4MDB9LCAgIC8vIExvb2stVXAgVGFibGUgQWRkcmVzcyBSZWdpc3RlcgorICAgIHsweDAxRjAsMHgxMH0sICAgLy8gUG93ZXIgU2F2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCisgICAgezB4MDFGMSwweDAwfSwgICAvLyBQb3dlciBTYXZlIFN0YXR1cyBSZWdpc3RlcgorICAgIHsweDAxRjQsMHgwMH0sICAgLy8gQ1BVLXRvLU1lbW9yeSBBY2Nlc3MgV2F0Y2hkb2cgVGltZXIgUmVnaXN0ZXIKKyNpZiAoU1dJVkVMX1ZJRVcgPT0gMCkKKyAgICB7MHgwMUZDLDB4MDF9LCAgIC8vIERpc3BsYXkgTW9kZSBSZWdpc3RlcigweDAxOkxDRCwgMHgwMjpDUlQsIDB4MDM6TENEJkNSVCkKKyNlbGlmIChTV0lWRUxfVklFVyA9PSAxKQorICAgIHsweDAxRkMsMHg0MX0sICAgLy8gRGlzcGxheSBNb2RlIFJlZ2lzdGVyKDB4MDE6TENELCAweDAyOkNSVCwgMHgwMzpMQ0QmQ1JUKQorI2Vsc2UKKyNlcnJvciB1bnN1cHBvcnRlZCBTV0lWRUxfVklFVyBtb2RlCisjZW5kaWYgIC8qIFNXSVZFTF9WSUVXICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisgICAgezB4MDAwOCwweDA3fSwgICAvLyBMQ0QgcGFuZWwgVmRkICYgVmcgb24KKyNlbmRpZgorCisgICAgezB4MDA0MCwweDA1fSwgICAvLyBMQ0QgRGlzcGxheSBNb2RlIFJlZ2lzdGVyICgyOjRicHAsMzo4YnBwLDU6MTZicHApCisjaWYgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSSkKKyAgICB7MHgwMDQ2LDB4ODB9LCAgIC8vIExDRCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMAorICAgIHsweDAwNDcsMHgwMn0sICAgLy8gTENEIE1lbW9yeSBBZGRyZXNzIE9mZnNldCBSZWdpc3RlciAxCisjZWxpZiBkZWZpbmVkKENPTkZJR19QTEFUX00zMjcwMFVUKSB8fCBkZWZpbmVkKENPTkZJR19QTEFUX09QU1BVVCkgfHwgZGVmaW5lZChDT05GSUdfUExBVF9NQVBQSTMpCisgICAgezB4MDA0NiwweGYwfSwgICAvLyBMQ0QgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAKKyAgICB7MHgwMDQ3LDB4MDB9LCAgIC8vIExDRCBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMQorI2VuZGlmCisgICAgezB4MDA2MCwweDA1fSwgICAvLyBDUlQvVFYgRGlzcGxheSBNb2RlIFJlZ2lzdGVyICgyOjRicHAsMzo4YnBwLDU6MTZicHApCisgICAgezB4MDA2NiwweDgwfSwgICAvLyBDUlQvVFYgTWVtb3J5IEFkZHJlc3MgT2Zmc2V0IFJlZ2lzdGVyIDAJLy8gdGFrZW8KKyAgICB7MHgwMDY3LDB4MDJ9LCAgIC8vIENSVC9UViBNZW1vcnkgQWRkcmVzcyBPZmZzZXQgUmVnaXN0ZXIgMQorfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvcGNpLmggYi9pbmNsdWRlL2FzbS1tNjhrL3BjaS5oCmluZGV4IDllN2Q3OWEuLjlkMmMwN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9wY2kuaApAQCAtNDMsNyArNDMsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1tNjhrL3NlcmlhbC5oCmluZGV4IDlmNWJjZGMuLjNmZTI5ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zZXJpYWwuaApAQCAtMjYsNTQgKzI2LDkgQEAKICNkZWZpbmUgU1REX0NPTTRfRkxBR1MgQVNZTkNfQk9PVF9BVVRPQ09ORgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSNkZWZpbmUgRk9VUlBPUlRfRkxBR1MgQVNZTkNfRk9VUlBPUlQKLSNkZWZpbmUgQUNDRU5UX0ZMQUdTIDAKLSNkZWZpbmUgQk9DQV9GTEFHUyAwCi0jZW5kaWYKLQotI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMJCQlcCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCQlcCiAJLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovCQkJXAogCXsgMCwgQkFTRV9CQVVELCAweDNGOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMCAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MkY4LCAzLCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMxICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRTgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzIgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJFOCwgMywgU1REX0NPTTRfRkxBR1MgfSwJLyogdHR5UzMgKi8KLQotCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDFBMCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFBOCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFCMCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDFCOCwgOSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJBMCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJBOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCMCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzEwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgyQjgsIDUsIEZPVVJQT1JUX0ZMQUdTIH0sCS8qIHR0eVMxMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzMwLCA0LCBBQ0NFTlRfRkxBR1MgfSwJLyogdHR5UzEyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzgsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTMgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkvKiB0dHlTMTQgKHNwYXJlKSAqLwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkvKiB0dHlTMTUgKHNwYXJlKSAqLwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDEwMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMDgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTEwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDExOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTI4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjEgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMzgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE0OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTU4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTcwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE3OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzMxICovCi0jZWxzZQotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwotI2VuZGlmCi0KLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJXAotCVNURF9TRVJJQUxfUE9SVF9ERUZOUwkJXAotCUVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21tem9uZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tbXpvbmUuaAppbmRleCAyOWVlMTNiLi5kNzIxMTQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbW16b25lLmgKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxtbXpvbmUuaD4KIAorI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KKwogI2RlZmluZSBrdmFkZHJfdG9fbmlkKGt2YWRkcikJcGFfdG9fbmlkKF9fcGEoa3ZhZGRyKSkKICNkZWZpbmUgcGZuX3RvX25pZChwZm4pCQlwYV90b19uaWQoKHBmbikgPDwgUEFHRV9TSElGVCkKIApAQCAtMzYsNCArMzgsNiBAQAogLyogWFhYOiBGSVhNRSAtLSB3bGkgKi8KICNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgwKQogCisjZW5kaWYgLyogQ09ORklHX0RJU0NPTlRJR01FTSAqLworCiAjZW5kaWYgLyogX0FTTV9NTVpPTkVfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGFnZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmgKaW5kZXggZDFiZjgyNC4uNWNhZTM1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmgKQEAgLTEyNyw3ICsxMjcsNyBAQAogCiAjZGVmaW5lIHBmbl90b19rYWRkcihwZm4pCV9fdmEoKHBmbikgPDwgUEFHRV9TSElGVCkKIAotI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisjaWZuZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCiAjZGVmaW5lIHBmbl90b19wYWdlKHBmbikJKG1lbV9tYXAgKyAocGZuKSkKICNkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkJKCh1bnNpZ25lZCBsb25nKSgocGFnZSkgLSBtZW1fbWFwKSkKICNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCSgocGZuKSA8IG1heF9tYXBucikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmggYi9pbmNsdWRlL2FzbS1taXBzL3BjaS5oCmluZGV4IGM5YzU3NmIuLmQ3MGRjMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wY2kuaApAQCAtNjksNyArNjksNyBAQAogCiBleHRlcm4gdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtMTMwLDYgKzEzMCwxNiBAQAogZXh0ZXJuIHZvaWQgcGNpX2RhY19kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAlkbWE2NF9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBsZW4sIGludCBkaXJlY3Rpb24pOwogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKaW5kZXggODc4ODQzMi4uZTc2Y2NkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLmgKQEAgLTM1MCw3ICszNTAsNyBAQAogCV9fdXBkYXRlX2NhY2hlKHZtYSwgYWRkcmVzcywgcHRlKTsKIH0KIAotI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisjaWZuZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCiAjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQkoMSkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tbWlwcy9zZXJpYWwuaAppbmRleCA4YTcwZmY1Li40ZWVkOGUyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oCkBAIC0yOSwzMiArMjksNiBAQAogI2RlZmluZSBTVERfQ09NNF9GTEFHUyBBU1lOQ19CT09UX0FVVE9DT05GCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBGT1VSUE9SVF9GTEFHUyBBU1lOQ19GT1VSUE9SVAotI2RlZmluZSBBQ0NFTlRfRkxBR1MgMAotI2RlZmluZSBCT0NBX0ZMQUdTIDAKLSNkZWZpbmUgSFVCNl9GTEFHUyAwCi0jZGVmaW5lIFJTX1RBQkxFX1NJWkUJNjQKLSNlbHNlCi0jZGVmaW5lIFJTX1RBQkxFX1NJWkUKLSNlbmRpZgotCi0vKgotICogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGFjY2VzcyBtZXRob2RzIGZvciB0aGUgSFVCNiBjYXJkLiBBbGwKLSAqIGFjY2VzcyBpcyB0aHJvdWdoIHR3byBwb3J0cyBmb3IgYWxsIDI0IHBvc3NpYmxlIGNoaXBzLiBUaGUgY2FyZCBpcwotICogc2VsZWN0ZWQgdGhyb3VnaCB0aGUgaGlnaCAyIGJpdHMsIHRoZSBwb3J0IG9uIHRoYXQgY2FyZCB3aXRoIHRoZQotICogIm1pZGRsZSIgMyBiaXRzLCBhbmQgdGhlIHJlZ2lzdGVyIG9uIHRoYXQgcG9ydCB3aXRoIHRoZSBib3R0b20KLSAqIDMgYml0cy4KLSAqCi0gKiBXaGlsZSB0aGUgYWNjZXNzIHBvcnQgYW5kIGludGVycnVwdCBpcyBjb25maWd1cmFibGUsIHRoZSBkZWZhdWx0Ci0gKiBwb3J0IGxvY2F0aW9ucyBhcmUgMHgzMDIgZm9yIHRoZSBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIsIGFuZCAweDMwMwotICogZm9yIHRoZSBkYXRhIHJlYWQvd3JpdGUgcmVnaXN0ZXIuIE5vcm1hbGx5LCB0aGUgaW50ZXJydXB0IGlzIGF0IGlycTMKLSAqIGJ1dCBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIHRvIDcgaW5jbHVzaXZlLiBOb3RlIHRoYXQgdXNpbmcgMyB3aWxsCi0gKiByZXF1aXJlIGRpc2FibGluZyBjb20yLgotICovCi0KLSNkZWZpbmUgQ19QKGNhcmQscG9ydCkgKCgoY2FyZCk8PDZ8KHBvcnQpPDwzKSArIDEpCi0KICNpZmRlZiBDT05GSUdfTUFDSF9KQVpaCiAjaW5jbHVkZSA8YXNtL2phenouaD4KIApAQCAtMjQwLDY2ICsyMTQsMTAgQEAKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRTgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzIgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJFOCwgMywgU1REX0NPTTRfRkxBR1MgfSwJLyogdHR5UzMgKi8KIAotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sIAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCQkJLyogdHR5UzE0IChzcGFyZSkgKi8gXAotCXsgMCwgQkFTRV9CQVVELCAweDAwMCwgMCwgMCB9LAkJCS8qIHR0eVMxNSAoc3BhcmUpICovIFwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTA4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDExMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTIwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIxICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTM4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjMgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE0MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI0ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTUwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNjAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTY4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE3MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzMwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMSAqLwotI2Vsc2UgLyogQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTICovCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYgLyogQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTICovCi0KICNlbHNlIC8qIENPTkZJR19IQVZFX1NURF9QQ19TRVJJQUxfUE9SVFMgKi8KICNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCiAjZW5kaWYgLyogQ09ORklHX0hBVkVfU1REX1BDX1NFUklBTF9QT1JUUyAqLwogCi0vKiBZb3UgY2FuIGhhdmUgdXAgdG8gZm91ciBIVUI2J3MgaW4gdGhlIHN5c3RlbSwgYnV0IEkndmUgb25seQotICogaW5jbHVkZWQgdHdvIGNhcmRzIGhlcmUgZm9yIGEgdG90YWwgb2YgdHdlbHZlIHBvcnRzLgotICovCi0jaWYgKGRlZmluZWQoQ09ORklHX0hVQjYpICYmIGRlZmluZWQoQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTKSkKLSNkZWZpbmUgSFVCNl9TRVJJQUxfUE9SVF9ERk5TCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwwKSB9LCAgLyogdHR5UzMyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDEpIH0sICAvKiB0dHlTMzMgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMikgfSwgIC8qIHR0eVMzNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwzKSB9LCAgLyogdHR5UzM1ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDQpIH0sICAvKiB0dHlTMzYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsNSkgfSwgIC8qIHR0eVMzNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwwKSB9LCAgLyogdHR5UzM4ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDEpIH0sICAvKiB0dHlTMzkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMikgfSwgIC8qIHR0eVM0MCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwzKSB9LCAgLyogdHR5UzQxICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDQpIH0sICAvKiB0dHlTNDIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsNSkgfSwgIC8qIHR0eVM0MyAqLwotI2Vsc2UKLSNkZWZpbmUgSFVCNl9TRVJJQUxfUE9SVF9ERk5TCi0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19NT01FTkNPX0pBR1VBUl9BVFgKIC8qIE9yZGluYXJ5IE5TMTY1NTIgZHVhcnQgd2l0aCBhIDIwTUh6IGNyeXN0YWwuICAqLwogI2RlZmluZSBKQUdVQVJfQVRYX1VBUlRfQ0xLCTIwMDAwMDAwCkBAIC00MjcsOCArMzQ1LDYgQEAKIAlDT0JBTFRfU0VSSUFMX1BPUlRfREVGTlMJCQlcCiAJRERCNTQ3N19TRVJJQUxfUE9SVF9ERUZOUwkJCVwKIAlFVjk2MTAwX1NFUklBTF9QT1JUX0RFRk5TCQkJXAotCUVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCQkJCVwKLQlIVUI2X1NFUklBTF9QT1JUX0RGTlMJCQkJXAogCUlQMzJfU0VSSUFMX1BPUlRfREVGTlMgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlJVEVfU0VSSUFMX1BPUlRfREVGTlMgICAgICAgICAgIAkJXAogCUlWUl9TRVJJQUxfUE9SVF9ERUZOUyAgICAgICAgICAgCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAppbmRleCA4ODhmZDg5Li4xNjlmM2Q0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKQEAgLTQyMiwxNiArNDIyLDEwIEBACiBleHRlcm4gaW50IHN0b3BfYV9lbmFibGVkOwogCiAvKgotICogVGFrZW4gZnJvbSBpbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oOyBwcmV2ZW50cyBkZWFkbG9jayBvbiBTTVAKKyAqIFNlZSBpbmNsdWRlL2FzbS1pYTY0L3N5c3RlbS5oOyBwcmV2ZW50cyBkZWFkbG9jayBvbiBTTVAKICAqIHN5c3RlbXMuCiAgKi8KLSNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChycSwgbmV4dCkJCVwKLWRvIHsJCQkJCQlcCi0Jc3Bpbl9sb2NrKCYobmV4dCktPnN3aXRjaF9sb2NrKTsJXAotCXNwaW5fdW5sb2NrKCYocnEpLT5sb2NrKTsJCVwKLX0gd2hpbGUgKDApCi0jZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChycSwgcHJldikJc3Bpbl91bmxvY2tfaXJxKCYocHJldiktPnN3aXRjaF9sb2NrKQotI2RlZmluZSB0YXNrX3J1bm5pbmcocnEsIHApIAkJKChycSktPmN1cnIgPT0gKHApIHx8IHNwaW5faXNfbG9ja2VkKCYocCktPnN3aXRjaF9sb2NrKSkKKyNkZWZpbmUgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKIAogI2RlZmluZSBhcmNoX2FsaWduX3N0YWNrKHgpICh4KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvcGNpLmgKaW5kZXggMDc2M2MyOS4uZWU3NDFjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wY2kuaApAQCAtMjMwLDYgKzIzMCwyNSBAQAogLyogZXhwb3J0IHRoZSBwY2lfIERNQSBBUEkgaW4gdGVybXMgb2YgdGhlIGRtYV8gb25lICovCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGNpLWRtYS1jb21wYXQuaD4KIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCXVuc2lnbmVkIGxvbmcgY2FjaGVsaW5lX3NpemU7CisJdTggYnl0ZTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsICZieXRlKTsKKwlpZiAoYnl0ZSA9PSAwKQorCQljYWNoZWxpbmVfc2l6ZSA9IDEwMjQ7CisJZWxzZQorCQljYWNoZWxpbmVfc2l6ZSA9IChpbnQpIGJ5dGUgKiA0OworCisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9NVUxUSVBMRTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gY2FjaGVsaW5lX3NpemU7Cit9CisjZW5kaWYKKwogZXh0ZXJuIHZvaWQKIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAogCQkJIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBhcmlzYy9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXBhcmlzYy9zZXJpYWwuaAppbmRleCAyMzljNWRjLi44MmZkODIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2Mvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tcGFyaXNjL3NlcmlhbC5oCkBAIC0xOSwxOCArMTksNCBAQAogICogQTUwMCB3LyBQQ0kgc2VyaWFsIGNhcmRzOiA1ICsgNCAqIGNhcmQgfj0gMTcKICAqLwogIAotI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMJCQlcCi0JeyAwLCB9LAkJLyogdHR5UzAgKi8JXAotCXsgMCwgfSwJCS8qIHR0eVMxICovCVwKLQl7IDAsIH0sCQkvKiB0dHlTMiAqLwlcCi0JeyAwLCB9LAkJLyogdHR5UzMgKi8JXAotCXsgMCwgfSwJCS8qIHR0eVM0ICovCVwKLQl7IDAsIH0sCQkvKiB0dHlTNSAqLwlcCi0JeyAwLCB9LAkJLyogdHR5UzYgKi8JXAotCXsgMCwgfSwJCS8qIHR0eVM3ICovCVwKLQl7IDAsIH0sCQkvKiB0dHlTOCAqLwotCi0KLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJXAotCVNURF9TRVJJQUxfUE9SVF9ERUZOUwotCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9mc2xfb2NwLmggYi9pbmNsdWRlL2FzbS1wcGMvZnNsX29jcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTBmYmJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXBwYy9mc2xfb2NwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tcHBjL2ZzbF9vY3AuaAotICoKLSAqIERlZmluaXRpb25zIGZvciB0aGUgb24tY2hpcCBwZXJpcGhlcmFscyBvbiBGcmVlc2NhbGUgUFBDIHByb2Nlc3NvcnMKLSAqCi0gKiBNYWludGFpbmVyOiBLdW1hciBHYWxhIChrdW1hci5nYWxhQGZyZWVzY2FsZS5jb20pCi0gKgotICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19BU01fRlNfT0NQX0hfXwotI2RlZmluZSBfX0FTTV9GU19PQ1BfSF9fCi0KLS8qIEEgdGFibGUgb2YgaW5mb3JtYXRpb24gZm9yIHN1cHBvcnRpbmcgdGhlIEdpYW5mYXIgRXRoZXJuZXQgQ29udHJvbGxlcgotICogVGhpcyBoZWxwcyBpZGVudGlmeSB3aGljaCBlbmV0IGNvbnRyb2xsZXIgd2UgYXJlIGRlYWxpbmcgd2l0aCwKLSAqIGFuZCB3aGF0IHR5cGUgb2YgZW5ldCBjb250cm9sbGVyIGl0IGlzCi0gKi8KLXN0cnVjdCBvY3BfZ2Zhcl9kYXRhIHsKLQl1aW50IGludGVycnVwdFRyYW5zbWl0OwotCXVpbnQgaW50ZXJydXB0RXJyb3I7Ci0JdWludCBpbnRlcnJ1cHRSZWNlaXZlOwotCXVpbnQgaW50ZXJydXB0UEhZOwotCXVpbnQgZmxhZ3M7Ci0JdWludCBwaHlpZDsKLQl1aW50IHBoeXJlZ2lkeDsKLQl1bnNpZ25lZCBjaGFyIG1hY19hZGRyWzZdOwotfTsKLQotLyogRmxhZ3MgaW4gdGhlIGZsYWdzIGZpZWxkICovCi0jZGVmaW5lIEdGQVJfSEFTX0NPQUxFU0NFCQkweDIwCi0jZGVmaW5lIEdGQVJfSEFTX1JNT04JCQkweDEwCi0jZGVmaW5lIEdGQVJfSEFTX01VTFRJX0lOVFIJCTB4MDgKLSNkZWZpbmUgR0ZBUl9GSVJNX1NFVF9NQUNBRERSCQkweDA0Ci0jZGVmaW5lIEdGQVJfSEFTX1BIWV9JTlRSCQkweDAyCS8qIGlmIG5vdCBzZXQgdXNlIGEgdGltZXIgKi8KLSNkZWZpbmUgR0ZBUl9IQVNfR0lHQUJJVAkJMHgwMQotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3IgSTJDIHN1cHBvcnQuICBKdXN0IGNvbnRhaW5zIGEgY291cGxlIGZsYWdzCi0gKiB0byBkaXN0aW5ndWlzaCB2YXJpb3VzIEkyQyBpbXBsZW1lbnRhdGlvbnMqLwotc3RydWN0IG9jcF9mc19pMmNfZGF0YSB7Ci0JdWludCBmbGFnczsKLX07Ci0KLS8qIEZsYWdzIGZvciBJMkMgKi8KLSNkZWZpbmUgRlNfSTJDX1NFUEFSQVRFX0RGU1JSCTB4MDIKLSNkZWZpbmUgRlNfSTJDX0NMT0NLXzUyMDAJMHgwMQotCi0jZW5kaWYJLyogX19BU01fRlNfT0NQX0hfXyAqLwotI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9rZXhlYy5oIGIvaW5jbHVkZS9hc20tcHBjL2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyYWEwYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9rZXhlYy5oCkBAIC0wLDAgKzEsNDAgQEAKKyNpZm5kZWYgX1BQQ19LRVhFQ19ICisjZGVmaW5lIF9QUENfS0VYRUNfSAorCisjaWZkZWYgQ09ORklHX0tFWEVDCisKKy8qCisgKiBLRVhFQ19TT1VSQ0VfTUVNT1JZX0xJTUlUIG1heGltdW0gcGFnZSBnZXRfZnJlZV9wYWdlIGNhbiByZXR1cm4uCisgKiBJLmUuIE1heGltdW0gcGFnZSB0aGF0IGlzIG1hcHBlZCBkaXJlY3RseSBpbnRvIGtlcm5lbCBtZW1vcnksCisgKiBhbmQga21hcCBpcyBub3QgcmVxdWlyZWQuCisgKgorICogU29tZW9uZSBjb3JyZWN0IG1lIGlmIEZJWEFERFJfU1RBUlQgLSBQQUdFT0ZGU0VUIGlzIG5vdCB0aGUgY29ycmVjdAorICogY2FsY3VsYXRpb24gZm9yIHRoZSBhbW91bnQgb2YgbWVtb3J5IGRpcmVjdGx5IG1hcHBhYmxlIGludG8gdGhlCisgKiBrZXJuZWwgbWVtb3J5IHNwYWNlLgorICovCisKKy8qIE1heGltdW0gcGh5c2ljYWwgYWRkcmVzcyB3ZSBjYW4gdXNlIHBhZ2VzIGZyb20gKi8KKyNkZWZpbmUgS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCAoLTFVTCkKKy8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gcmVhY2ggaW4gcGh5c2ljYWwgYWRkcmVzcyBtb2RlICovCisjZGVmaW5lIEtFWEVDX0RFU1RJTkFUSU9OX01FTU9SWV9MSU1JVCAoLTFVTCkKKy8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gdXNlIGZvciB0aGUgY29udHJvbCBjb2RlIGJ1ZmZlciAqLworI2RlZmluZSBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCBUQVNLX1NJWkUKKworI2RlZmluZSBLRVhFQ19DT05UUk9MX0NPREVfU0laRQk0MDk2CisKKy8qIFRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEtFWEVDX0FSQ0ggS0VYRUNfQVJDSF9QUEMKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworZXh0ZXJuIHZvaWQgKmNyYXNoX25vdGVzOworCitzdHJ1Y3Qga2ltYWdlOworCitleHRlcm4gdm9pZCBtYWNoaW5lX2tleGVjX3NpbXBsZShzdHJ1Y3Qga2ltYWdlICppbWFnZSk7CisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLworCisjZW5kaWYgLyogX1BQQ19LRVhFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbWFjaGRlcC5oIGIvaW5jbHVkZS9hc20tcHBjL21hY2hkZXAuaAppbmRleCBiNzhkNDA4Li4xZDRhYjcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tYWNoZGVwLmgKQEAgLTQsNiArNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xMTQsNiArMTE1LDM2IEBACiAJLyogZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggb3RoZXIgY3B1cyAqLwogCXN0cnVjdCBzbXBfb3BzX3QgKnNtcF9vcHM7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCisjaWZkZWYgQ09ORklHX0tFWEVDCisJLyogQ2FsbGVkIHRvIHNodXRkb3duIG1hY2hpbmUgc3BlY2lmaWMgaGFyZHdhcmUgbm90IGFscmVhZHkgY29udHJvbGxlZAorCSAqIGJ5IG90aGVyIGRyaXZlcnMuCisJICogWFhYIFNob3VsZCB3ZSBtb3ZlIHRoaXMgb25lIG91dCBvZiBrZXhlYyBzY29wZT8KKwkgKi8KKwl2b2lkICgqbWFjaGluZV9zaHV0ZG93bikodm9pZCk7CisKKwkvKiBDYWxsZWQgdG8gZG8gdGhlIG1pbmltYWwgc2h1dGRvd24gbmVlZGVkIHRvIHJ1biBhIGtleGVjJ2Qga2VybmVsCisJICogdG8gcnVuIHN1Y2Nlc3NmdWxseS4KKwkgKiBYWFggU2hvdWxkIHdlIG1vdmUgdGhpcyBvbmUgb3V0IG9mIGtleGVjIHNjb3BlPworCSAqLworCXZvaWQgKCptYWNoaW5lX2NyYXNoX3NodXRkb3duKSh2b2lkKTsKKworCS8qIENhbGxlZCB0byBkbyB3aGF0IGV2ZXJ5IHNldHVwIGlzIG5lZWRlZCBvbiBpbWFnZSBhbmQgdGhlCisJICogcmVib290IGNvZGUgYnVmZmVyLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKwkgKiBQcm92aWRlIHlvdXIgb3duIChtYXliZSBkdW1teSkgaW1wbGVtZW50YXRpb24gaWYgeW91ciBwbGF0Zm9ybQorCSAqIGNsYWltcyB0byBzdXBwb3J0IGtleGVjLgorCSAqLworCWludCAoKm1hY2hpbmVfa2V4ZWNfcHJlcGFyZSkoc3RydWN0IGtpbWFnZSAqaW1hZ2UpOworCisJLyogQ2FsbGVkIHRvIGhhbmRsZSBhbnkgbWFjaGluZSBzcGVjaWZpYyBjbGVhbnVwIG9uIGltYWdlICovCisJdm9pZCAoKm1hY2hpbmVfa2V4ZWNfY2xlYW51cCkoc3RydWN0IGtpbWFnZSAqaW1hZ2UpOworCisJLyogQ2FsbGVkIHRvIHBlcmZvcm0gdGhlIF9yZWFsXyBrZXhlYy4KKwkgKiBEbyBOT1QgYWxsb2NhdGUgbWVtb3J5IG9yIGZhaWwgaGVyZS4gV2UgYXJlIHBhc3QgdGhlIHBvaW50IG9mCisJICogbm8gcmV0dXJuLgorCSAqLworCXZvaWQgKCptYWNoaW5lX2tleGVjKShzdHJ1Y3Qga2ltYWdlICppbWFnZSk7CisjZW5kaWYgLyogQ09ORklHX0tFWEVDICovCiB9OwogCiBleHRlcm4gc3RydWN0IG1hY2hkZXBfY2FsbHMgcHBjX21kOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21hY2lvLmggYi9pbmNsdWRlL2FzbS1wcGMvbWFjaW8uaAppbmRleCAyY2FmYzk5Li5hNDgxYjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbWFjaW8uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbWFjaW8uaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX19NQUNJT19BU0lDX0hfXwogI2RlZmluZSBfX01BQ0lPX0FTSUNfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgbWFjaW9fYnVzX3R5cGU7CkBAIC0xMjAsMTAgKzEyMSwxMCBAQAogc3RydWN0IG1hY2lvX2RyaXZlcgogewogCWNoYXIJCQkqbmFtZTsKLQlzdHJ1Y3Qgb2ZfbWF0Y2gJCSptYXRjaF90YWJsZTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCSptYXRjaF90YWJsZTsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAKLQlpbnQJKCpwcm9iZSkoc3RydWN0IG1hY2lvX2RldiogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKTsKKwlpbnQJKCpwcm9iZSkoc3RydWN0IG1hY2lvX2RldiogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCk7CiAJaW50CSgqcmVtb3ZlKShzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYpOwogCiAJaW50CSgqc3VzcGVuZCkoc3RydWN0IG1hY2lvX2RldiogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21tdS5oIGIvaW5jbHVkZS9hc20tcHBjL21tdS5oCmluZGV4IGQ0NjVhZWUuLjkyMDVkYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbW11LmgKQEAgLTQwNSw3ICs0MDUsNyBAQAogCiAjZGVmaW5lIE1BUzBfVExCU0VMKHgpCSgoeCA8PCAyOCkgJiAweDMwMDAwMDAwKQogI2RlZmluZSBNQVMwX0VTRUwoeCkJKCh4IDw8IDE2KSAmIDB4MEZGRjAwMDApCi0jZGVmaW5lIE1BUzBfTlYJCTB4MDAwMDBGRkYKKyNkZWZpbmUgTUFTMF9OVih4KQkoKHgpICYgMHgwMDAwMEZGRikKIAogI2RlZmluZSBNQVMxX1ZBTElEIAkweDgwMDAwMDAwCiAjZGVmaW5lIE1BUzFfSVBST1QJMHg0MDAwMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaAppbmRleCA5MjIyZmE2Li5jY2FiYmNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaApAQCAtNjMsNyArNjMsNyBAQAogI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTI1NQogI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCiAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0U1MDApCisjZWxpZiBkZWZpbmVkKENPTkZJR19FMjAwKSB8fCBkZWZpbmVkKENPTkZJR19FNTAwKQogI2RlZmluZSBOT19DT05URVhUICAgICAgCTI1NgogI2RlZmluZSBMQVNUX0NPTlRFWFQgICAgCTI1NQogI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbXBjOHh4LmggYi9pbmNsdWRlL2FzbS1wcGMvbXBjOHh4LmgKaW5kZXggNzE0ZDY5Yy4uN2MzMWYyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21wYzh4eC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tcGM4eHguaApAQCAtNjgsNiArNjgsMTAgQEAKICNpbmNsdWRlIDxwbGF0Zm9ybXMvbGFudGVjLmg+CiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX01QQzg4NUFEUykKKyNpbmNsdWRlIDxwbGF0Zm9ybXMvbXBjODg1YWRzLmg+CisjZW5kaWYKKwogLyogQ3VycmVudGx5LCBhbGwgOHh4IGJvYXJkcyB0aGF0IHN1cHBvcnQgYSBwcm9jZXNzb3IgdG8gUENJL0lTQSBicmlkZ2UKICAqIHVzZSB0aGUgc2FtZSBtZW1vcnkgbWFwLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvb2NwLmggYi9pbmNsdWRlL2FzbS1wcGMvb2NwLmgKaW5kZXggYzcyNmYxOC4uOTgzMTE2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL29jcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9vY3AuaApAQCAtMjAyLDEwICsyMDIsNiBAQAogI2luY2x1ZGUgPGFzbS9pYm1fb2NwLmg+CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19GU0xfT0NQCi0jaW5jbHVkZSA8YXNtL2ZzbF9vY3AuaD4KLSNlbmRpZgotCiAjZW5kaWYJCQkJLyogQ09ORklHX1BQQ19PQ1AgKi8KICNlbmRpZgkJCQkvKiBfX09DUF9IX18gKi8KICNlbmRpZgkJCQkvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvb2ZfZGV2aWNlLmggYi9pbmNsdWRlL2FzbS1wcGMvb2ZfZGV2aWNlLmgKaW5kZXggNzIyOTczNS4uNGIyNjRjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL29mX2RldmljZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9vZl9kZXZpY2UuaApAQCAtMjQsMjAgKzI0LDggQEAKIH07CiAjZGVmaW5lCXRvX29mX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG9mX2RldmljZSwgZGV2KQogCi0vKgotICogU3RydWN0IHVzZWQgZm9yIG1hdGNoaW5nIGEgZGV2aWNlCi0gKi8KLXN0cnVjdCBvZl9tYXRjaAotewotCWNoYXIJKm5hbWU7Ci0JY2hhcgkqdHlwZTsKLQljaGFyCSpjb21wYXRpYmxlOwotCXZvaWQJKmRhdGE7Ci19OwotI2RlZmluZSBPRl9BTllfTUFUQ0gJCSgoY2hhciAqKS0xTCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqb2ZfbWF0Y2hfZGV2aWNlKAotCWNvbnN0IHN0cnVjdCBvZl9tYXRjaCAqbWF0Y2hlcywgY29uc3Qgc3RydWN0IG9mX2RldmljZSAqZGV2KTsKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoCisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywgY29uc3Qgc3RydWN0IG9mX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX2Rldl9nZXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIG9mX2Rldl9wdXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKQEAgLTQ5LDEwICszNywxMCBAQAogc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlcgogewogCWNoYXIJCQkqbmFtZTsKLQlzdHJ1Y3Qgb2ZfbWF0Y2gJCSptYXRjaF90YWJsZTsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlX2lkCSptYXRjaF90YWJsZTsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAKLQlpbnQJKCpwcm9iZSkoc3RydWN0IG9mX2RldmljZSogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfbWF0Y2ggKm1hdGNoKTsKKwlpbnQJKCpwcm9iZSkoc3RydWN0IG9mX2RldmljZSogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCk7CiAJaW50CSgqcmVtb3ZlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOwogCiAJaW50CSgqc3VzcGVuZCkoc3RydWN0IG9mX2RldmljZSogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL29wZW5fcGljLmggYi9pbmNsdWRlL2FzbS1wcGMvb3Blbl9waWMuaAppbmRleCBkYmU4NTMzLi43ODQ4YWE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvb3Blbl9waWMuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvb3Blbl9waWMuaApAQCAtMjUsNiArMjUsMTEgQEAKICNkZWZpbmUgT1BFTlBJQ19WRUNfSVBJCQkxMTgJLyogYW5kIHVwICovCiAjZGVmaW5lIE9QRU5QSUNfVkVDX1NQVVJJT1VTCTI1NQogCisvKiBQcmlvcml0aWVzICovCisjZGVmaW5lIE9QRU5QSUNfUFJJT1JJVFlfSVBJX0JBU0UJMTAKKyNkZWZpbmUgT1BFTlBJQ19QUklPUklUWV9ERUZBVUxUCTQKKyNkZWZpbmUgT1BFTlBJQ19QUklPUklUWV9OTUkJCTkKKwogLyogT3BlblBJQyBJUlEgY29udHJvbGxlciBzdHJ1Y3R1cmUgKi8KIGV4dGVybiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgb3Blbl9waWM7CiAKQEAgLTQyLDYgKzQ3LDcgQEAKIGV4dGVybiB2b2lkIG9wZW5waWNfc2V0X3NvdXJjZXMoaW50IGZpcnN0X2lycSwgaW50IG51bV9pcnFzLCB2b2lkIF9faW9tZW0gKmlzcik7CiBleHRlcm4gdm9pZCBvcGVucGljX2luaXQoaW50IGxpbnV4X2lycV9vZmZzZXQpOwogZXh0ZXJuIHZvaWQgb3BlbnBpY19pbml0X25taV9pcnEodV9pbnQgaXJxKTsKK2V4dGVybiB2b2lkIG9wZW5waWNfc2V0X2lycV9wcmlvcml0eSh1X2ludCBpcnEsIHVfaW50IHByaSk7CiBleHRlcm4gdm9pZCBvcGVucGljX2hvb2t1cF9jYXNjYWRlKHVfaW50IGlycSwgY2hhciAqbmFtZSwKIAkJCQkgICBpbnQgKCpjYXNjYWRlX2ZuKShzdHJ1Y3QgcHRfcmVncyAqKSk7CiBleHRlcm4gdV9pbnQgb3BlbnBpY19pcnEodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcGNfc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1wcGMvcGNfc2VyaWFsLmgKaW5kZXggZmE5Y2JiNi4uOGY5OTRmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BjX3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wY19zZXJpYWwuaApAQCAtMzUsOTMgKzM1LDkgQEAKICNkZWZpbmUgU1REX0NPTTRfRkxBR1MgQVNZTkNfQk9PVF9BVVRPQ09ORgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU0VSSUFMX01BTllfUE9SVFMKLSNkZWZpbmUgRk9VUlBPUlRfRkxBR1MgQVNZTkNfRk9VUlBPUlQKLSNkZWZpbmUgQUNDRU5UX0ZMQUdTIDAKLSNkZWZpbmUgQk9DQV9GTEFHUyAwCi0jZGVmaW5lIEhVQjZfRkxBR1MgMAotI2VuZGlmCi0JCi0vKgotICogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGFjY2VzcyBtZXRob2RzIGZvciB0aGUgSFVCNiBjYXJkLiBBbGwKLSAqIGFjY2VzcyBpcyB0aHJvdWdoIHR3byBwb3J0cyBmb3IgYWxsIDI0IHBvc3NpYmxlIGNoaXBzLiBUaGUgY2FyZCBpcwotICogc2VsZWN0ZWQgdGhyb3VnaCB0aGUgaGlnaCAyIGJpdHMsIHRoZSBwb3J0IG9uIHRoYXQgY2FyZCB3aXRoIHRoZQotICogIm1pZGRsZSIgMyBiaXRzLCBhbmQgdGhlIHJlZ2lzdGVyIG9uIHRoYXQgcG9ydCB3aXRoIHRoZSBib3R0b20KLSAqIDMgYml0cy4KLSAqCi0gKiBXaGlsZSB0aGUgYWNjZXNzIHBvcnQgYW5kIGludGVycnVwdCBpcyBjb25maWd1cmFibGUsIHRoZSBkZWZhdWx0Ci0gKiBwb3J0IGxvY2F0aW9ucyBhcmUgMHgzMDIgZm9yIHRoZSBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIsIGFuZCAweDMwMwotICogZm9yIHRoZSBkYXRhIHJlYWQvd3JpdGUgcmVnaXN0ZXIuIE5vcm1hbGx5LCB0aGUgaW50ZXJydXB0IGlzIGF0IGlycTMKLSAqIGJ1dCBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIHRvIDcgaW5jbHVzaXZlLiBOb3RlIHRoYXQgdXNpbmcgMyB3aWxsCi0gKiByZXF1aXJlIGRpc2FibGluZyBjb20yLgotICovCi0KLSNkZWZpbmUgQ19QKGNhcmQscG9ydCkgKCgoY2FyZCk8PDZ8KHBvcnQpPDwzKSArIDEpCi0KLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMSAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0U4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMyICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRTgsIDMsIFNURF9DT000X0ZMQUdTIH0sCS8qIHR0eVMzICovCi0KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sIAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNCAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNSAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTAwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEwOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTE4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTMwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQ4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTYwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTc4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzEgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYKLQotLyogWW91IGNhbiBoYXZlIHVwIHRvIGZvdXIgSFVCNidzIGluIHRoZSBzeXN0ZW0sIGJ1dCBJJ3ZlIG9ubHkKLSAqIGluY2x1ZGVkIHR3byBjYXJkcyBoZXJlIGZvciBhIHRvdGFsIG9mIHR3ZWx2ZSBwb3J0cy4KLSAqLwotI2lmIChkZWZpbmVkKENPTkZJR19IVUI2KSAmJiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUykpCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMCkgfSwgIC8qIHR0eVMzMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwxKSB9LCAgLyogdHR5UzMzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDIpIH0sICAvKiB0dHlTMzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMykgfSwgIC8qIHR0eVMzNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw0KSB9LCAgLyogdHR5UzM2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDUpIH0sICAvKiB0dHlTMzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMCkgfSwgIC8qIHR0eVMzOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwxKSB9LCAgLyogdHR5UzM5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDIpIH0sICAvKiB0dHlTNDAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMykgfSwgIC8qIHR0eVM0MSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw0KSB9LCAgLyogdHR5UzQyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDUpIH0sICAvKiB0dHlTNDMgKi8KLSNlbHNlCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwotI2VuZGlmCi0KLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJXAotCVNURF9TRVJJQUxfUE9SVF9ERUZOUwkJXAotCUVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JSFVCNl9TRVJJQUxfUE9SVF9ERk5TCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvcGNpLmggYi9pbmNsdWRlL2FzbS1wcGMvcGNpLmgKaW5kZXggY2U1YWU2ZC4uYTEzZDU1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9wY2kuaApAQCAtMzcsNyArMzcsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1leHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitleHRlcm4gaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTY5LDYgKzY5LDE2IEBACiAjZGVmaW5lIHBjaV91bm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgwKQogI2RlZmluZSBwY2lfdW5tYXBfbGVuX3NldChQVFIsIExFTl9OQU1FLCBWQUwpCWRvIHsgfSB3aGlsZSAoMCkKIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfSU5GSU5JVFk7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IH4wVUw7Cit9CisjZW5kaWYKKwogLyoKICAqIEF0IHByZXNlbnQgdGhlcmUgYXJlIHZlcnkgZmV3IDMyLWJpdCBQUEMgbWFjaGluZXMgdGhhdCBjYW4gaGF2ZQogICogbWVtb3J5IGFib3ZlIHRoZSA0R0IgcG9pbnQsIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQuCkBAIC0xMDMsNiArMTEzLDEyIEBACiAJCQkJCSB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJCSBwZ3Byb3RfdCBwcm90KTsKIAorI2RlZmluZSBIQVZFX0FSQ0hfUENJX1JFU09VUkNFX1RPX1VTRVIKK2V4dGVybiB2b2lkIHBjaV9yZXNvdXJjZV90b191c2VyKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBiYXIsCisJCQkJIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywKKwkJCQkgdTY0ICpzdGFydCwgdTY0ICplbmQpOworCisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfX1BQQ19QQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3BwY19hc20uaCBiL2luY2x1ZGUvYXNtLXBwYy9wcGNfYXNtLmgKaW5kZXggMTNmYThlNy4uZjc2MjIxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3BwY19hc20uaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcHBjX2FzbS5oCkBAIC0xNzQsNiArMTc0LDggQEAKICNkZWZpbmUgQ0xSX1RPUDMyKHIpCiAjZW5kaWYgLyogQ09ORklHX1BQQzY0QlJJREdFICovCiAKKyNkZWZpbmUgUkZDSQkJLmxvbmcgMHg0YzAwMDA2NgkvKiByZmNpIGluc3RydWN0aW9uICovCisjZGVmaW5lIFJGREkJCS5sb25nIDB4NGMwMDAwNGUJLyogcmZkaSBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBSRk1DSQkJLmxvbmcgMHg0YzAwMDA0YwkvKiByZm1jaSBpbnN0cnVjdGlvbiAqLwogCiAjaWZkZWYgQ09ORklHX0lCTTQwNV9FUlI3NwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3JlZy5oIGIvaW5jbHVkZS9hc20tcHBjL3JlZy5oCmluZGV4IGM0MThhYWIuLjg4YjQyMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9yZWcuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcmVnLmgKQEAgLTE2MCw2ICsxNjAsNyBAQAogI2RlZmluZSBISUQwX0lDRkkJKDE8PDExKQkJLyogSW5zdHIuIENhY2hlIEZsYXNoIEludmFsaWRhdGUgKi8KICNkZWZpbmUgSElEMF9EQ0kJKDE8PDEwKQkJLyogRGF0YSBDYWNoZSBJbnZhbGlkYXRlICovCiAjZGVmaW5lIEhJRDBfU1BECSgxPDw5KQkJLyogU3BlY3VsYXRpdmUgZGlzYWJsZSAqLworI2RlZmluZSBISUQwX0RBUFVFTgkoMTw8OCkJCS8qIERlYnVnIEFQVSBlbmFibGUgKi8KICNkZWZpbmUgSElEMF9TR0UJKDE8PDcpCQkvKiBTdG9yZSBHYXRoZXJpbmcgRW5hYmxlICovCiAjZGVmaW5lIEhJRDBfU0lFRAkoMTw8NykJCS8qIFNlcmlhbCBJbnN0ci4gRXhlY3V0aW9uIFtEaXNhYmxlXSAqLwogI2RlZmluZSBISUQwX0RGQ0EJKDE8PDYpCQkvKiBEYXRhIENhY2hlIEZsdXNoIEFzc2lzdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL3JlZ19ib29rZS5oIGIvaW5jbHVkZS9hc20tcHBjL3JlZ19ib29rZS5oCmluZGV4IDQ1YzVlNmYuLjAwYWQ5YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9yZWdfYm9va2UuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvcmVnX2Jvb2tlLmgKQEAgLTE2NSw2ICsxNjUsOCBAQAogI2RlZmluZSBTUFJOX01DU1JSMQkweDIzQgkvKiBNYWNoaW5lIENoZWNrIFNhdmUgYW5kIFJlc3RvcmUgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBTUFJOX01DU1IJMHgyM0MJLyogTWFjaGluZSBDaGVjayBTdGF0dXMgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU1BSTl9NQ0FSCTB4MjNECS8qIE1hY2hpbmUgQ2hlY2sgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZSBTUFJOX0RTUlIwCTB4MjNFCS8qIERlYnVnIFNhdmUgYW5kIFJlc3RvcmUgUmVnaXN0ZXIgMCAqLworI2RlZmluZSBTUFJOX0RTUlIxCTB4MjNGCS8qIERlYnVnIFNhdmUgYW5kIFJlc3RvcmUgUmVnaXN0ZXIgMSAqLwogI2RlZmluZSBTUFJOX01BUzAJMHgyNzAJLyogTU1VIEFzc2lzdCBSZWdpc3RlciAwICovCiAjZGVmaW5lIFNQUk5fTUFTMQkweDI3MQkvKiBNTVUgQXNzaXN0IFJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgU1BSTl9NQVMyCTB4MjcyCS8qIE1NVSBBc3Npc3QgUmVnaXN0ZXIgMiAqLwpAQCAtMjY0LDYgKzI2NiwxNyBAQAogI2RlZmluZSBNQ1NSX0JVU19JUEVSUiAJMHgwMDAwMDAwMlVMIC8qIEluc3RydWN0aW9uIHBhcml0eSBFcnJvciAqLwogI2RlZmluZSBNQ1NSX0JVU19SUEVSUiAJMHgwMDAwMDAwMVVMIC8qIFJlYWQgcGFyaXR5IEVycm9yICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRTIwMAorI2RlZmluZSBNQ1NSX01DUCAJMHg4MDAwMDAwMFVMIC8qIE1hY2hpbmUgQ2hlY2sgSW5wdXQgUGluICovCisjZGVmaW5lIE1DU1JfQ1BfUEVSUiAJMHgyMDAwMDAwMFVMIC8qIENhY2hlIFB1c2ggUGFyaXR5IEVycm9yICovCisjZGVmaW5lIE1DU1JfQ1BFUlIgCTB4MTAwMDAwMDBVTCAvKiBDYWNoZSBQYXJpdHkgRXJyb3IgKi8KKyNkZWZpbmUgTUNTUl9FWENQX0VSUiAJMHgwODAwMDAwMFVMIC8qIElTSSwgSVRMQiwgb3IgQnVzIEVycm9yIG9uIDFzdCBpbnNuCisJCQkJCWZldGNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciAqLworI2RlZmluZSBNQ1NSX0JVU19JUkVSUiAJMHgwMDAwMDAxMFVMIC8qIFJlYWQgQnVzIEVycm9yIG9uIGluc3RydWN0aW9uIGZldGNoKi8KKyNkZWZpbmUgTUNTUl9CVVNfRFJFUlIgCTB4MDAwMDAwMDhVTCAvKiBSZWFkIEJ1cyBFcnJvciBvbiBkYXRhIGxvYWQgKi8KKyNkZWZpbmUgTUNTUl9CVVNfV1JFUlIgCTB4MDAwMDAwMDRVTCAvKiBXcml0ZSBCdXMgRXJyb3Igb24gYnVmZmVyZWQKKwkJCQkJc3RvcmUgb3IgY2FjaGUgbGluZSBwdXNoICovCisjZW5kaWYKIAogLyogQml0IGRlZmluaXRpb25zIGZvciB0aGUgREJTUi4gKi8KIC8qCkBAIC0zMTEsNiArMzI0LDcgQEAKICNkZWZpbmUgRVNSX1NUCQkweDAwODAwMDAwCS8qIFN0b3JlIE9wZXJhdGlvbiAqLwogI2RlZmluZSBFU1JfRExLCQkweDAwMjAwMDAwCS8qIERhdGEgQ2FjaGUgTG9ja2luZyAqLwogI2RlZmluZSBFU1JfSUxLCQkweDAwMTAwMDAwCS8qIEluc3RyLiBDYWNoZSBMb2NraW5nICovCisjZGVmaW5lIEVTUl9QVU8JCTB4MDAwNDAwMDAJLyogVW5pbXBsZW1lbnRlZCBPcGVyYXRpb24gZXhjZXB0aW9uICovCiAjZGVmaW5lIEVTUl9CTwkJMHgwMDAyMDAwMAkvKiBCeXRlIE9yZGVyaW5nICovCiAKIC8qIEJpdCBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHRoZSBEQkNSMC4gKi8KQEAgLTM4NywxMCArNDAxLDEyIEBACiAjZGVmaW5lIElDQ1JfQ0FDSEUJMQkJLyogQ2FjaGVhYmxlICovCiAKIC8qIEJpdCBkZWZpbml0aW9ucyBmb3IgTDFDU1IwLiAqLworI2RlZmluZSBMMUNTUjBfQ0xGQwkweDAwMDAwMTAwCS8qIENhY2hlIExvY2sgQml0cyBGbGFzaCBDbGVhciAqLwogI2RlZmluZSBMMUNTUjBfRENGSQkweDAwMDAwMDAyCS8qIERhdGEgQ2FjaGUgRmxhc2ggSW52YWxpZGF0ZSAqLworI2RlZmluZSBMMUNTUjBfQ0ZJCTB4MDAwMDAwMDIJLyogQ2FjaGUgRmxhc2ggSW52YWxpZGF0ZSAqLwogI2RlZmluZSBMMUNTUjBfRENFCTB4MDAwMDAwMDEJLyogRGF0YSBDYWNoZSBFbmFibGUgKi8KIAotLyogQml0IGRlZmluaXRpb25zIGZvciBMMUNTUjAuICovCisvKiBCaXQgZGVmaW5pdGlvbnMgZm9yIEwxQ1NSMS4gKi8KICNkZWZpbmUgTDFDU1IxX0lDTEZSCTB4MDAwMDAxMDAJLyogSW5zdHIgQ2FjaGUgTG9jayBCaXRzIEZsYXNoIFJlc2V0ICovCiAjZGVmaW5lIEwxQ1NSMV9JQ0ZJCTB4MDAwMDAwMDIJLyogSW5zdHIgQ2FjaGUgRmxhc2ggSW52YWxpZGF0ZSAqLwogI2RlZmluZSBMMUNTUjFfSUNFCTB4MDAwMDAwMDEJLyogSW5zdHIgQ2FjaGUgRW5hYmxlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1wcGMvdW5pc3RkLmgKaW5kZXggY2M1MWU1Yy4uYTc4OTRlMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy91bmlzdGQuaApAQCAtMjYyLDcgKzI2Miw3IEBACiAjZGVmaW5lIF9fTlJfcnRhcwkJMjU1CiAjZGVmaW5lIF9fTlJfc3lzX2RlYnVnX3NldGNvbnRleHQgMjU2CiAvKiBOdW1iZXIgMjU3IGlzIHJlc2VydmVkIGZvciB2c2VydmVyICovCi0vKiBOdW1iZXIgMjU4IGlzIHJlc2VydmVkIGZvciBuZXcgc3lzX3JlbWFwX2ZpbGVfcGFnZXMgKi8KKy8qIDI1OCBjdXJyZW50bHkgdW51c2VkICovCiAvKiBOdW1iZXIgMjU5IGlzIHJlc2VydmVkIGZvciBuZXcgc3lzX21iaW5kICovCiAvKiBOdW1iZXIgMjYwIGlzIHJlc2VydmVkIGZvciBuZXcgc3lzX2dldF9tZW1wb2xpY3kgKi8KIC8qIE51bWJlciAyNjEgaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfc2V0X21lbXBvbGljeSAqLwpAQCAtMjc3LDggKzI3NywxMCBAQAogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI3MAogI2RlZmluZSBfX05SX2tleWN0bAkJMjcxCiAjZGVmaW5lIF9fTlJfd2FpdGlkCQkyNzIKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyNzMKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyNzQKIAotI2RlZmluZSBfX05SX3N5c2NhbGxzCQkyNzMKKyNkZWZpbmUgX19OUl9zeXNjYWxscwkJMjc1CiAKICNkZWZpbmUgX19OUihuKQkjbgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGM2NC9ieXRlb3JkZXIuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2J5dGVvcmRlci5oCmluZGV4IDgwMzI3NTMuLjhiNTdkYTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L2J5dGVvcmRlci5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2J5dGVvcmRlci5oCkBAIC00MCw3ICs0MCw2IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJzdHdicnggJTEsMCwlMiIgOiAiPW0iICgqYWRkcikgOiAiciIgKHZhbCksICJyIiAoYWRkcikpOwogfQogCi0jaWYgMAogc3RhdGljIF9faW5saW5lX18gX19hdHRyaWJ1dGVfY29uc3RfXyBfX3UxNiBfX19hcmNoX19zd2FiMTYoX191MTYgdmFsdWUpCiB7CiAJX191MTYgcmVzdWx0OwpAQCAtNjMsMTcgKzYyLDggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fdTY0IF9fX2FyY2hfX3N3YWI2NChfX3U2NCB2YWx1ZSkKLXsKLQlfX3U2NCByZXN1bHQ7Ci0jZXJyb3IgaW1wbGVtZW50IG1lCi19Ci0KICNkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fYXJjaF9fc3dhYjE2KHgpCiAjZGVmaW5lIF9fYXJjaF9fc3dhYjMyKHgpIF9fX2FyY2hfX3N3YWIzMih4KQotI2RlZmluZSBfX2FyY2hfX3N3YWI2NCh4KSBfX19hcmNoX19zd2FiNjQoeCkKLQotI2VuZGlmCiAKIC8qIFRoZSBzYW1lLCBidXQgcmV0dXJucyBjb252ZXJ0ZWQgdmFsdWUgZnJvbSB0aGUgbG9jYXRpb24gcG9pbnRlciBieSBhZGRyLiAqLwogI2RlZmluZSBfX2FyY2hfX3N3YWIxNnAoYWRkcikgbGRfbGUxNihhZGRyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvY3B1dGFibGUuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2NwdXRhYmxlLmgKaW5kZXggY2JiZmJlYy4uZDY3ZmE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvY3B1dGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9jcHV0YWJsZS5oCkBAIC0xMzgsNiArMTM4LDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9DT0hFUkVOVF9JQ0FDSEUgIAlBU01fQ09OU1QoMHgwMDAwMDIwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFCQlBU01fQ09OU1QoMHgwMDAwMDQwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX01NQ1JBX1NJSFYJCUFTTV9DT05TVCgweDAwMDAwODAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfQ1RSTAkJCUFTTV9DT05TVCgweDAwMDAxMDAwMDAwMDAwMDApCiAKIC8qIFBsYXRmb3JtIGZpcm13YXJlIGZlYXR1cmVzICovCiAjZGVmaW5lIEZXX0ZUUl8JCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMSkKQEAgLTE0OCw3ICsxNDksNyBAQAogCiAjZGVmaW5lIENQVV9GVFJfUFBDQVNfQVJDSF9WMl9CQVNFIChDUFVfRlRSX1NMQiB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9GVFJfVExCSUVMIHwgQ1BVX0ZUUl9OT0VYRUNVVEUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVfRlRSX05PRFNJU1JBTElHTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVV9GVFJfTk9EU0lTUkFMSUdOIHwgQ1BVX0ZUUl9DVFJMKQogCiAvKiBpU2VyaWVzIGRvZXNuJ3Qgc3VwcG9ydCBsYXJnZSBwYWdlcyAqLwogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvaHZjb25zb2xlLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9odmNvbnNvbGUuaAppbmRleCBkODlkOTRjLi42ZGE5M2NlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9odmNvbnNvbGUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9odmNvbnNvbGUuaApAQCAtMjksMTIgKzI5LDIxIEBACiAgKi8KICNkZWZpbmUgTUFYX05SX0hWQ19DT05TT0xFUwkxNgogCisvKiBpbXBsZW1lbnRlZCBieSBhIGxvdyBsZXZlbCBkcml2ZXIgKi8KK3N0cnVjdCBodl9vcHMgeworCWludCAoKmdldF9jaGFycykodWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpOworCWludCAoKnB1dF9jaGFycykodWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpOworfTsKIGV4dGVybiBpbnQgaHZjX2dldF9jaGFycyh1aW50MzJfdCB2dGVybW5vLCBjaGFyICpidWYsIGludCBjb3VudCk7CiBleHRlcm4gaW50IGh2Y19wdXRfY2hhcnModWludDMyX3QgdnRlcm1ubywgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpOwogCi0vKiBFYXJseSBkaXNjb3Zlcnkgb2YgY29uc29sZSBhZGFwdGVycy4gKi8KLWV4dGVybiBpbnQgaHZjX2ZpbmRfdnR5cyh2b2lkKTsKK3N0cnVjdCBodmNfc3RydWN0OwogCi0vKiBJbXBsZW1lbnRlZCBieSBhIGNvbnNvbGUgZHJpdmVyICovCi1leHRlcm4gaW50IGh2Y19pbnN0YW50aWF0ZSh1aW50MzJfdCB2dGVybW5vLCBpbnQgaW5kZXgpOworLyogUmVnaXN0ZXIgYSB2dGVybSBhbmQgYSBzbG90IGluZGV4IGZvciB1c2UgYXMgYSBjb25zb2xlIChjb25zb2xlX2luaXQpICovCitleHRlcm4gaW50IGh2Y19pbnN0YW50aWF0ZSh1aW50MzJfdCB2dGVybW5vLCBpbnQgaW5kZXgsIHN0cnVjdCBodl9vcHMgKm9wcyk7CisvKiByZWdpc3RlciBhIHZ0ZXJtIGZvciBodmMgdHR5IG9wZXJhdGlvbiAobW9kdWxlX2luaXQgb3IgaG90cGx1ZyBhZGQpICovCitleHRlcm4gc3RydWN0IGh2Y19zdHJ1Y3QgKiBfX2RldmluaXQgaHZjX2FsbG9jKHVpbnQzMl90IHZ0ZXJtbm8sIGludCBpcnEsCisJCQkJCQkgc3RydWN0IGh2X29wcyAqb3BzKTsKKy8qIHJlbW92ZSBhIHZ0ZXJtIGZyb20gaHZjIHR0eSBvcGVyYXRpb24gKG1vZGVsZV9leGl0IG9yIGhvdHBsdWcgcmVtb3ZlKSAqLworZXh0ZXJuIGludCBfX2RldmV4aXQgaHZjX3JlbW92ZShzdHJ1Y3QgaHZjX3N0cnVjdCAqaHApOwogI2VuZGlmIC8qIF9QUEM2NF9IVkNPTlNPTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvaVNlcmllcy9JdExwUXVldWUuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2lTZXJpZXMvSXRMcFF1ZXVlLmgKaW5kZXggMzkzMjk5ZS4uNjliMjZhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvaVNlcmllcy9JdExwUXVldWUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9pU2VyaWVzL0l0THBRdWV1ZS5oCkBAIC00MSw3ICs0MSw3IEBACiAjZGVmaW5lIExwRXZlbnRNYXhTaXplCQkyNTYKICNkZWZpbmUgTHBFdmVudEFsaWduCQk2NAogCi1zdHJ1Y3QgSXRMcFF1ZXVlIHsKK3N0cnVjdCBodmxwZXZlbnRfcXVldWUgewogLyoKICAqIFRoZSB4U2xpY0N1ckV2ZW50UHRyIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGV2ZW50IHN0YWNrIGVudHJ5CiAgKiB0aGF0IHdpbGwgYmVjb21lIHZhbGlkLiAgVGhlIE9TIG11c3QgcGVlayBhdCB0aGlzIGVudHJ5IHRvIGRldGVybWluZQpAQCAtNjksMTYgKzY5LDEzIEBACiAJY2hhcgkqeFNsaWNFdmVudFN0YWNrUHRyOwkvLyAweDIwCiAJdTgJeEluZGV4OwkJCS8vIDB4MjggdW5pcXVlIHNlcXVlbnRpYWwgaW5kZXguCiAJdTgJeFNsaWNSc3ZkWzNdOwkJLy8gMHgyOS0yYgotCXUzMgl4SW5Vc2VXb3JkOwkJLy8gMHgyQwotCXU2NAl4THBJbnRDb3VudDsJCS8vIDB4MzAgVG90YWwgTHAgSW50IG1zZ3MgcHJvY2Vzc2VkCi0JdTY0CXhMcEludENvdW50QnlUeXBlWzldOwkvLyAweDM4LTB4N0YgRXZlbnQgY291bnRzIGJ5IHR5cGUKKwlzcGlubG9ja190CWxvY2s7CiB9OwogCi1leHRlcm4gc3RydWN0IEl0THBRdWV1ZSB4SXRMcFF1ZXVlOworZXh0ZXJuIHN0cnVjdCBodmxwZXZlbnRfcXVldWUgaHZscGV2ZW50X3F1ZXVlOwogCi1leHRlcm4gc3RydWN0IEh2THBFdmVudCAqSXRMcFF1ZXVlX2dldE5leHRMcEV2ZW50KHN0cnVjdCBJdExwUXVldWUgKik7Ci1leHRlcm4gaW50IEl0THBRdWV1ZV9pc0xwSW50UGVuZGluZyhzdHJ1Y3QgSXRMcFF1ZXVlICopOwotZXh0ZXJuIHVuc2lnbmVkIEl0THBRdWV1ZV9wcm9jZXNzKHN0cnVjdCBJdExwUXVldWUgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1leHRlcm4gdm9pZCBJdExwUXVldWVfY2xlYXJWYWxpZChzdHJ1Y3QgSHZMcEV2ZW50ICopOworZXh0ZXJuIGludCBodmxwZXZlbnRfaXNfcGVuZGluZyh2b2lkKTsKK2V4dGVybiB2b2lkIHByb2Nlc3NfaHZscGV2ZW50cyhzdHJ1Y3QgcHRfcmVncyAqKTsKK2V4dGVybiB2b2lkIHNldHVwX2h2bHBldmVudF9xdWV1ZSh2b2lkKTsKIAogI2VuZGlmIC8qIF9JVExQUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQva2RlYnVnLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9rZGVidWcuaAppbmRleCA0ODg2MzQyLi5kMzgzZDE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9rZGVidWcuaApAQCAtMTcsNyArMTcsNyBAQAogCiAvKgogICAgTm90ZSAtIHlvdSBzaG91bGQgbmV2ZXIgdW5yZWdpc3RlciBiZWNhdXNlIHRoYXQgY2FuIHJhY2Ugd2l0aCBOTUlzLgotICAgSWYgeW91IHJlYWxseSB3YW50IHRvIGRvIGl0IGZpcnN0IHVucmVnaXN0ZXIgLSB0aGVuIHN5bmNocm9uaXplX2tlcm5lbCAtCisgICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gaXQgZmlyc3QgdW5yZWdpc3RlciAtIHRoZW4gc3luY2hyb25pemVfc2NoZWQgLQogICAgdGhlbiBmcmVlLgogICovCiBpbnQgcmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQva2V4ZWMuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExOTA4YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBwYzY0L2tleGVjLmgKQEAgLTAsMCArMSw0MSBAQAorI2lmbmRlZiBfUFBDNjRfS0VYRUNfSAorI2RlZmluZSBfUFBDNjRfS0VYRUNfSAorCisvKgorICogS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCBtYXhpbXVtIHBhZ2UgZ2V0X2ZyZWVfcGFnZSBjYW4gcmV0dXJuLgorICogSS5lLiBNYXhpbXVtIHBhZ2UgdGhhdCBpcyBtYXBwZWQgZGlyZWN0bHkgaW50byBrZXJuZWwgbWVtb3J5LAorICogYW5kIGttYXAgaXMgbm90IHJlcXVpcmVkLgorICovCisKKy8qIE1heGltdW0gcGh5c2ljYWwgYWRkcmVzcyB3ZSBjYW4gdXNlIHBhZ2VzIGZyb20gKi8KKy8qIFhYWDogc2luY2Ugd2UgY29weSB2aXJ0IHdlIGNhbiB1c2UgYW55IHBhZ2Ugd2UgYWxsb2NhdGUgKi8KKyNkZWZpbmUgS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCAoLTFVTCkKKworLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiByZWFjaCBpbiBwaHlzaWNhbCBhZGRyZXNzIG1vZGUgKi8KKy8qIFhYWDogSSB3YW50IHRvIGFsbG93IGluaXRyZCBpbiBoaWdobWVtLiAgb3RoZXJ3aXNlIHNldCB0byBybW8gb24gbHBhciAqLworI2RlZmluZSBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQgKC0xVUwpCisKKy8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gdXNlIGZvciB0aGUgY29udHJvbCBjb2RlIGJ1ZmZlciAqLworLyogWFhYOiB1bnVzZWQgdG9kYXksIHBwYzMyIHVzZXMgVEFTS19TSVpFLCBwcm9iYWJseSBsZWZ0IG92ZXIgZnJvbSB1c2VfbW0gICovCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUICgtMVVMKQorCisvKiBYWFg6IHRvZGF5IHdlIGRvbid0IHVzZSB0aGlzIGF0IGFsbCwgYWx0aG9naCB3ZSBoYXZlIGEgc3RhdGljIHN0YWNrICovCisjZGVmaW5lIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFIDQwOTYKKworLyogVGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUgKi8KKyNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIX1BQQzY0CisKKyNkZWZpbmUgTUFYX05PVEVfQllURVMgMTAyNAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCit0eXBlZGVmIHUzMiBub3RlX2J1Zl90W01BWF9OT1RFX0JZVEVTLzRdOworCitleHRlcm4gbm90ZV9idWZfdCBjcmFzaF9ub3Rlc1tdOworCitleHRlcm4gdm9pZCBrZXhlY19zbXBfd2FpdCh2b2lkKTsJLyogZ2V0IGFuZCBjbGVhciBuYWNhIHBoeXNpZCwgd2FpdCBmb3IKKwkJCQkJICBtYXN0ZXIgdG8gY29weSBuZXcgY29kZSB0byAwICovCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZiAvKiBfUFBDX0tFWEVDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oIGIvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oCmluZGV4IDE5YjQ2OGJlLi4wODAyOTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQva3Byb2Jlcy5oCkBAIC00MiwxMCArNDIsMTMgQEAKIAogI2RlZmluZSBKUFJPQkVfRU5UUlkocGVudHJ5KQkoa3Byb2JlX29wY29kZV90ICopKChmdW5jX2Rlc2NyX3QgKilwZW50cnkpCiAKKyNkZWZpbmUgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCit2b2lkIGtyZXRwcm9iZV90cmFtcG9saW5lKHZvaWQpOworCiAvKiBBcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwogc3RydWN0IGFyY2hfc3BlY2lmaWNfaW5zbiB7CiAJLyogY29weSBvZiBvcmlnaW5hbCBpbnN0cnVjdGlvbiAqLwotCWtwcm9iZV9vcGNvZGVfdCBpbnNuW01BWF9JTlNOX1NJWkVdOworCWtwcm9iZV9vcGNvZGVfdCAqaW5zbjsKIH07CiAKICNpZmRlZiBDT05GSUdfS1BST0JFUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvbWFjaGRlcC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvbWFjaGRlcC5oCmluZGV4IDU1M2IyZWEuLjFlNmFkNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L21hY2hkZXAuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9tYWNoZGVwLmgKQEAgLTg2LDYgKzg2LDcgQEAKIAogCXZvaWQJCSgqaW5pdF9JUlEpKHZvaWQpOwogCWludAkJKCpnZXRfaXJxKShzdHJ1Y3QgcHRfcmVncyAqKTsKKwl2b2lkCQkoKmNwdV9pcnFfZG93bikodm9pZCk7CiAKIAkvKiBQQ0kgc3R1ZmYgKi8KIAl2b2lkCQkoKnBjaWJpb3NfZml4dXApKHZvaWQpOwpAQCAtMTM5LDggKzE0MCwxMyBAQAogCQkJCQkJdW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQkJcGdwcm90X3Qgdm1hX3Byb3QpOwogCisJLyogSWRsZSBsb29wIGZvciB0aGlzIHBsYXRmb3JtLCBsZWF2ZSBlbXB0eSBmb3IgZGVmYXVsdCBpZGxlIGxvb3AgKi8KKwlpbnQJCSgqaWRsZV9sb29wKSh2b2lkKTsKIH07CiAKK2V4dGVybiBpbnQgZGVmYXVsdF9pZGxlKHZvaWQpOworZXh0ZXJuIGludCBuYXRpdmVfaWRsZSh2b2lkKTsKKwogZXh0ZXJuIHN0cnVjdCBtYWNoZGVwX2NhbGxzIHBwY19tZDsKIGV4dGVybiBjaGFyIGNtZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvbW11LmggYi9pbmNsdWRlL2FzbS1wcGM2NC9tbXUuaAppbmRleCA5ZDAzYTk4Li5mMzczZGU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9tbXUuaApAQCAtMTgxLDYgKzE4MSwyOCBAQAogCWFzbSB2b2xhdGlsZSgicHRlc3luYyI6IDogOiJtZW1vcnkiKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNsb3QydmEodW5zaWduZWQgbG9uZyBhdnBuLCB1bnNpZ25lZCBsb25nIGxhcmdlLAorCQl1bnNpZ25lZCBsb25nIHNlY29uZGFyeSwgdW5zaWduZWQgbG9uZyBzbG90KQoreworCXVuc2lnbmVkIGxvbmcgdmE7CisKKwl2YSA9IGF2cG4gPDwgMjM7CisKKwlpZiAoIWxhcmdlKSB7CisJCXVuc2lnbmVkIGxvbmcgdnBpLCBwdGVnOworCisJCXB0ZWcgPSBzbG90IC8gSFBURVNfUEVSX0dST1VQOworCQlpZiAoc2Vjb25kYXJ5KQorCQkJcHRlZyA9IH5wdGVnOworCisJCXZwaSA9ICgodmEgPj4gMjgpIF4gcHRlZykgJiBodGFiX2hhc2hfbWFzazsKKworCQl2YSB8PSB2cGkgPDwgUEFHRV9TSElGVDsKKwl9CisKKwlyZXR1cm4gdmE7Cit9CisKIC8qCiAgKiBIYW5kbGUgYSBmYXVsdCBieSBhZGRpbmcgYW4gSFBURS4gSWYgdGhlIGFkZHJlc3MgY2FuJ3QgYmUgZGV0ZXJtaW5lZAogICogdG8gYmUgdmFsaWQgdmlhIExpbnV4IHBhZ2UgdGFibGVzLCByZXR1cm4gMS4gSWYgaGFuZGxlZCByZXR1cm4gMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcGFjYS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvcGFjYS5oCmluZGV4IGFlNzZjYWUuLjJmMGYzNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYzY0L3BhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wYWNhLmgKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlCTxhc20vdHlwZXMuaD4KICNpbmNsdWRlCTxhc20vbHBwYWNhLmg+CiAjaW5jbHVkZQk8YXNtL2lTZXJpZXMvSXRMcFJlZ1NhdmUuaD4KLSNpbmNsdWRlCTxhc20vaVNlcmllcy9JdExwUXVldWUuaD4KICNpbmNsdWRlCTxhc20vbW11Lmg+CiAKIHJlZ2lzdGVyIHN0cnVjdCBwYWNhX3N0cnVjdCAqbG9jYWxfcGFjYSBhc20oInIxMyIpOwpAQCAtNjIsNyArNjEsNiBAQAogCXUxNiBwYWNhX2luZGV4OwkJCS8qIExvZ2ljYWwgcHJvY2Vzc29yIG51bWJlciAqLwogCiAJdTMyIGRlZmF1bHRfZGVjcjsJCS8qIERlZmF1bHQgZGVjcmVtZW50ZXIgdmFsdWUgKi8KLQlzdHJ1Y3QgSXRMcFF1ZXVlICpscHF1ZXVlX3B0cjsJLyogTHBRdWV1ZSBoYW5kbGVkIGJ5IHRoaXMgQ1BVICovCiAJdTY0IGtlcm5lbF90b2M7CQkJLyogS2VybmVsIFRPQyBhZGRyZXNzICovCiAJdTY0IHN0YWJfcmVhbDsJCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIG9mIHNlZ21lbnQgdGFibGUgKi8KIAl1NjQgc3RhYl9hZGRyOwkJCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBzZWdtZW50IHRhYmxlICovCkBAIC05MSw3ICs4OSw2IEBACiAJdTY0IG5leHRfamlmZnlfdXBkYXRlX3RiOwkvKiBUQiB2YWx1ZSBmb3IgbmV4dCBqaWZmeSB1cGRhdGUgKi8KIAl1NjQgc2F2ZWRfcjE7CQkJLyogcjEgc2F2ZSBmb3IgUlRBUyBjYWxscyAqLwogCXU2NCBzYXZlZF9tc3I7CQkJLyogTVNSIHNhdmVkIGhlcmUgYnkgZW50ZXJfcnRhcyAqLwotCXUzMiBscGV2ZW50X2NvdW50OwkJLyogbHBldmVudHMgcHJvY2Vzc2VkICAqLwogCXU4IHByb2NfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCiAKIAkvKiBub3QgeWV0IHVzZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3BjaS5oIGIvaW5jbHVkZS9hc20tcHBjNjQvcGNpLmgKaW5kZXggNmNkNTkzZi4uZmFhNzcyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvcGNpLmgKQEAgLTM3LDcgKzM3LDcgQEAKIAkvKiBObyBzcGVjaWFsIGJ1cyBtYXN0ZXJpbmcgc2V0dXAgaGFuZGxpbmcgKi8KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CkBAIC03OCw2ICs3OCwyNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBjYWNoZWxpbmVfc2l6ZTsKKwl1OCBieXRlOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmJ5dGUpOworCWlmIChieXRlID09IDApCisJCWNhY2hlbGluZV9zaXplID0gMTAyNDsKKwllbHNlCisJCWNhY2hlbGluZV9zaXplID0gKGludCkgYnl0ZSAqIDQ7CisKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX01VTFRJUExFOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSBjYWNoZWxpbmVfc2l6ZTsKK30KKyNlbmRpZgorCiBleHRlcm4gaW50IHBjaV9kb21haW5fbnIoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIC8qIERlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXkgdGhlIGRvbWFpbiBudW1iZXIgaW4gL3Byb2MgKi8KQEAgLTEzNiw2ICsxNTUsMTMgQEAKIAkJCQkJIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJIHBncHJvdF90IHByb3QpOwogCisjaWZkZWYgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCisjZGVmaW5lIEhBVkVfQVJDSF9QQ0lfUkVTT1VSQ0VfVE9fVVNFUgorZXh0ZXJuIHZvaWQgcGNpX3Jlc291cmNlX3RvX3VzZXIoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKKwkJCQkgY29uc3Qgc3RydWN0IHJlc291cmNlICpyc3JjLAorCQkJCSB1NjQgKnN0YXJ0LCB1NjQgKmVuZCk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCisKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjNjQvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1wcGM2NC9wcm9jZXNzb3IuaAppbmRleCBhZjI4YWE1Li4zNTIzMDZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1wcGM2NC9wcm9jZXNzb3IuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtY2ZnLmg+CisjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAKIC8qIE1hY2hpbmUgU3RhdGUgUmVnaXN0ZXIgKE1TUikgRmllbGRzICovCiAjZGVmaW5lIE1TUl9TRl9MRwk2MyAgICAgICAgICAgICAgLyogRW5hYmxlIDY0IGJpdCBtb2RlICovCkBAIC01MDEsMjQgKzUwMiwzNyBAQAogewogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAotCWN0cmwgPSBtZnNwcihTUFJOX0NUUkxGKTsKLQljdHJsIHw9IENUUkxfUlVOTEFUQ0g7Ci0JbXRzcHIoU1BSTl9DVFJMVCwgY3RybCk7CisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0NUUkwpKSB7CisJCWN0cmwgPSBtZnNwcihTUFJOX0NUUkxGKTsKKwkJY3RybCB8PSBDVFJMX1JVTkxBVENIOworCQltdHNwcihTUFJOX0NUUkxULCBjdHJsKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcGM2NF9ydW5sYXRjaF9vZmYodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGN0cmw7CiAKLQljdHJsID0gbWZzcHIoU1BSTl9DVFJMRik7Ci0JY3RybCAmPSB+Q1RSTF9SVU5MQVRDSDsKLQltdHNwcihTUFJOX0NUUkxULCBjdHJsKTsKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ1RSTCkpIHsKKwkJY3RybCA9IG1mc3ByKFNQUk5fQ1RSTEYpOworCQljdHJsICY9IH5DVFJMX1JVTkxBVENIOworCQltdHNwcihTUFJOX0NUUkxULCBjdHJsKTsKKwl9CiB9CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAorI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgUlVOTEFUQ0hfT04oUkVHKQkJCVwKK0JFR0lOX0ZUUl9TRUNUSU9OCQkJCVwKKwltZnNwcgkoUkVHKSxTUFJOX0NUUkxGOwkJXAorCW9yaQkoUkVHKSwoUkVHKSxDVFJMX1JVTkxBVENIOwlcCisJbXRzcHIJU1BSTl9DVFJMVCwoUkVHKTsJCVwKK0VORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NUUkwpCisjZW5kaWYKKwogLyoKICAqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBTTEIuIElmIHRoaXMgZXZlciBjaGFuZ2VzIHdlIHNob3VsZCBoYW5kbGUKICAqIGl0IHdpdGggYSB1c2UgYSBjcHUgZmVhdHVyZSBmaXh1cC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tcHBjNjQvdW5pc3RkLmgKaW5kZXggNjA1ZDkxZS4uNGE5NGFjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQvdW5pc3RkLmgKQEAgLTI2OCw3ICsyNjgsNyBAQAogI2RlZmluZSBfX05SX3J0YXMJCTI1NQogLyogTnVtYmVyIDI1NiBpcyByZXNlcnZlZCBmb3Igc3lzX2RlYnVnX3NldGNvbnRleHQgKi8KIC8qIE51bWJlciAyNTcgaXMgcmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLS8qIE51bWJlciAyNTggaXMgcmVzZXJ2ZWQgZm9yIG5ldyBzeXNfcmVtYXBfZmlsZV9wYWdlcyAqLworLyogMjU4IGN1cnJlbnRseSB1bnVzZWQgKi8KICNkZWZpbmUgX19OUl9tYmluZAkJMjU5CiAjZGVmaW5lIF9fTlJfZ2V0X21lbXBvbGljeQkyNjAKICNkZWZpbmUgX19OUl9zZXRfbWVtcG9saWN5CTI2MQpAQCAtMjgzLDggKzI4MywxMCBAQAogI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI3MAogI2RlZmluZSBfX05SX2tleWN0bAkJMjcxCiAjZGVmaW5lIF9fTlJfd2FpdGlkCQkyNzIKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyNzMKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyNzQKIAotI2RlZmluZSBfX05SX3N5c2NhbGxzCQkyNzMKKyNkZWZpbmUgX19OUl9zeXNjYWxscwkJMjc1CiAjaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBOUl9zeXNjYWxscwlfX05SX3N5c2NhbGxzCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYzY0L3hpY3MuaCBiL2luY2x1ZGUvYXNtLXBwYzY0L3hpY3MuaAppbmRleCBmZGVjNWU3Li4wYzQ1ZTE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGM2NC94aWNzLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjNjQveGljcy5oCkBAIC0xNyw2ICsxNyw3IEBACiB2b2lkIHhpY3NfaW5pdF9JUlEodm9pZCk7CiBpbnQgeGljc19nZXRfaXJxKHN0cnVjdCBwdF9yZWdzICopOwogdm9pZCB4aWNzX3NldHVwX2NwdSh2b2lkKTsKK3ZvaWQgeGljc190ZWFyZG93bl9jcHUodm9pZCk7CiB2b2lkIHhpY3NfY2F1c2VfSVBJKGludCBjcHUpOwogdm9pZCB4aWNzX3JlcXVlc3RfSVBJcyh2b2lkKTsKIHZvaWQgeGljc19taWdyYXRlX2lycXNfYXdheSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaAppbmRleCAxZDMzYzVkYS4uMWZjZjY1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9jcGNtZC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvY3BjbWQuaApAQCAtMTEsMTQgKzExLDI4IEBACiAjZGVmaW5lIF9fQ1BDTURfXwogCiAvKgorICogdGhlIGxvd2xldmVsIGZ1bmN0aW9uIGZvciBjcGNtZAogICogdGhlIGNhbGxlciBvZiBfX2NwY21kIGhhcyB0byBlbnN1cmUgdGhhdCB0aGUgcmVzcG9uc2UgYnVmZmVyIGlzIGJlbG93IDIgR0IKICAqLwotZXh0ZXJuIHZvaWQgX19jcGNtZChjaGFyICpjbWQsIGNoYXIgKnJlc3BvbnNlLCBpbnQgcmxlbik7CitleHRlcm4gaW50IF9fY3BjbWQoY29uc3QgY2hhciAqY21kLCBjaGFyICpyZXNwb25zZSwgaW50IHJsZW4sIGludCAqcmVzcG9uc2VfY29kZSk7CiAKICNpZm5kZWYgX19zMzkweF9fCiAjZGVmaW5lIGNwY21kIF9fY3BjbWQKICNlbHNlCi1leHRlcm4gdm9pZCBjcGNtZChjaGFyICpjbWQsIGNoYXIgKnJlc3BvbnNlLCBpbnQgcmxlbik7CisvKgorICogY3BjbWQgaXMgdGhlIGluLWtlcm5lbCBpbnRlcmZhY2UgZm9yIGlzc3VpbmcgQ1AgY29tbWFuZHMKKyAqCisgKiBjbWQ6CQludWxsLXRlcm1pbmF0ZWQgY29tbWFuZCBzdHJpbmcsIG1heCAyNDAgY2hhcmFjdGVycworICogcmVzcG9uc2U6CXJlc3BvbnNlIGJ1ZmZlciBmb3IgVk0ncyB0ZXh0dWFsIHJlc3BvbnNlCisgKiBybGVuOglzaXplIG9mIHRoZSByZXNwb25zZSBidWZmZXIsIGNwY21kIHdpbGwgbm90IGV4Y2VlZCB0aGlzIHNpemUKKyAqCQlidXQgd2lsbCBjYXAgdGhlIG91dHB1dCwgaWYgaXRzIHRvbyBsYXJnZS4gRXZlcnl0aGluZyB0aGF0CisgKgkJZGlkIG5vdCBmaXQgaW50byB0aGUgYnVmZmVyIHdpbGwgYmUgc2lsZW50bHkgZHJvcHBlZAorICogcmVzcG9uc2VfY29kZTogcmV0dXJuIHBvaW50ZXIgZm9yIFZNJ3MgZXJyb3IgY29kZQorICogcmV0dXJuIHZhbHVlOiB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UuIFRoZSBjYWxsZXIgY2FuIGNoZWNrIGlmIHRoZSBidWZmZXIKKyAqCQl3YXMgbGFyZ2UgZW5vdWdoIGJ5IGNvbXBhcmluZyB0aGUgcmV0dXJuIHZhbHVlIGFuZCBybGVuCisgKiBOT1RFOiBJZiB0aGUgcmVzcG9uc2UgYnVmZmVyIGlzIG5vdCBiZWxvdyAyIEdCLCBjcGNtZCBjYW4gc2xlZXAKKyAqLworZXh0ZXJuIGludCBjcGNtZChjb25zdCBjaGFyICpjbWQsIGNoYXIgKnJlc3BvbnNlLCBpbnQgcmxlbiwgaW50ICpyZXNwb25zZV9jb2RlKTsKICNlbmRpZiAvKl9fczM5MHhfXyovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9kZWJ1Zy5oIGIvaW5jbHVkZS9hc20tczM5MC9kZWJ1Zy5oCmluZGV4IDZiYmNkZWEuLjkyMzYwZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2RlYnVnLmgKQEAgLTksNiArOSw4IEBACiAjaWZuZGVmIERFQlVHX0gKICNkZWZpbmUgREVCVUdfSAogCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogLyogTm90ZToKQEAgLTMxLDE5ICszMywxOCBAQAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogCi0jZGVmaW5lIF9fREVCVUdfRkVBVFVSRV9WRVJTSU9OICAgICAgMSAgLyogdmVyc2lvbiBvZiBkZWJ1ZyBmZWF0dXJlICovCisjZGVmaW5lIF9fREVCVUdfRkVBVFVSRV9WRVJTSU9OICAgICAgMiAgLyogdmVyc2lvbiBvZiBkZWJ1ZyBmZWF0dXJlICovCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogCiAjZGVmaW5lIERFQlVHX01BWF9MRVZFTCAgICAgICAgICAgIDYgIC8qIGRlYnVnIGxldmVscyByYW5nZSBmcm9tIDAgdG8gNiAqLwogI2RlZmluZSBERUJVR19PRkZfTEVWRUwgICAgICAgICAgICAtMSAvKiBsZXZlbCB3aGVyZSBkZWJ1ZyBpcyBzd2l0Y2hlZCBvZmYgKi8KICNkZWZpbmUgREVCVUdfRkxVU0hfQUxMICAgICAgICAgICAgLTEgLyogcGFyYW1ldGVyIHRvIGZsdXNoIGFsbCBhcmVhcyAqLwogI2RlZmluZSBERUJVR19NQVhfVklFV1MgICAgICAgICAgICAxMCAvKiBtYXggbnVtYmVyIG9mIHZpZXdzIGluIHByb2MgZnMgKi8KLSNkZWZpbmUgREVCVUdfTUFYX1BST0NGX0xFTiAgICAgICAgNjQgLyogbWF4IGxlbmd0aCBmb3IgYSBwcm9jIGZpbGUgbmFtZSAqLworI2RlZmluZSBERUJVR19NQVhfTkFNRV9MRU4gICAgICAgICA2NCAvKiBtYXggbGVuZ3RoIGZvciBhIGRlYnVnZnMgZmlsZSBuYW1lICovCiAjZGVmaW5lIERFQlVHX0RFRkFVTFRfTEVWRUwgICAgICAgIDMgIC8qIGluaXRpYWwgZGVidWcgbGV2ZWwgKi8KIAogI2RlZmluZSBERUJVR19ESVJfUk9PVCAiczM5MGRiZiIgLyogbmFtZSBvZiBkZWJ1ZyByb290IGRpcmVjdG9yeSBpbiBwcm9jIGZzICovCkBAIC02NCwxNiArNjUsMTcgQEAKIAlzcGlubG9ja190IGxvY2s7CQkJCiAJaW50IGxldmVsOwogCWludCBucl9hcmVhczsKLQlpbnQgcGFnZV9vcmRlcjsKKwlpbnQgcGFnZXNfcGVyX2FyZWE7CiAJaW50IGJ1Zl9zaXplOwogCWludCBlbnRyeV9zaXplOwkKLQlkZWJ1Z19lbnRyeV90KiogYXJlYXM7CisJZGVidWdfZW50cnlfdCoqKiBhcmVhczsKIAlpbnQgYWN0aXZlX2FyZWE7Ci0JaW50ICphY3RpdmVfZW50cnk7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5KiBwcm9jX3Jvb3RfZW50cnk7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5KiBwcm9jX2VudHJpZXNbREVCVUdfTUFYX1ZJRVdTXTsKKwlpbnQgKmFjdGl2ZV9wYWdlczsKKwlpbnQgKmFjdGl2ZV9lbnRyaWVzOworCXN0cnVjdCBkZW50cnkqIGRlYnVnZnNfcm9vdF9lbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5KiBkZWJ1Z2ZzX2VudHJpZXNbREVCVUdfTUFYX1ZJRVdTXTsKIAlzdHJ1Y3QgZGVidWdfdmlldyogdmlld3NbREVCVUdfTUFYX1ZJRVdTXTsJCi0JY2hhciBuYW1lW0RFQlVHX01BWF9QUk9DRl9MRU5dOworCWNoYXIgbmFtZVtERUJVR19NQVhfTkFNRV9MRU5dOwogfSBkZWJ1Z19pbmZvX3Q7CiAKIHR5cGVkZWYgaW50IChkZWJ1Z19oZWFkZXJfcHJvY190KSAoZGVidWdfaW5mb190KiBpZCwKQEAgLTk4LDcgKzEwMCw3IEBACiAJCSAgICAgICAgIGludCBhcmVhLCBkZWJ1Z19lbnRyeV90KiBlbnRyeSwgY2hhciogb3V0X2J1Zik7CQkJCQkJCiAJCQkJCiBzdHJ1Y3QgZGVidWdfdmlldyB7Ci0JY2hhciBuYW1lW0RFQlVHX01BWF9QUk9DRl9MRU5dOworCWNoYXIgbmFtZVtERUJVR19NQVhfTkFNRV9MRU5dOwogCWRlYnVnX3Byb2xvZ19wcm9jX3QqIHByb2xvZ19wcm9jOwogCWRlYnVnX2hlYWRlcl9wcm9jX3QqIGhlYWRlcl9wcm9jOwogCWRlYnVnX2Zvcm1hdF9wcm9jX3QqIGZvcm1hdF9wcm9jOwpAQCAtMTIwLDcgKzEyMiw3IEBACiAKIC8qIERlYnVnIEZlYXR1cmUgQVBJOiAqLwogCi1kZWJ1Z19pbmZvX3QqIGRlYnVnX3JlZ2lzdGVyKGNoYXIqIG5hbWUsIGludCBwYWdlc19pbmRleCwgaW50IG5yX2FyZWFzLAorZGVidWdfaW5mb190KiBkZWJ1Z19yZWdpc3RlcihjaGFyKiBuYW1lLCBpbnQgcGFnZXMsIGludCBucl9hcmVhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKTsKIAogdm9pZCBkZWJ1Z191bnJlZ2lzdGVyKGRlYnVnX2luZm9fdCogaWQpOwpAQCAtMTMyLDcgKzEzNCw4IEBACiBleHRlcm4gaW5saW5lIGRlYnVnX2VudHJ5X3QqIAogZGVidWdfZXZlbnQoZGVidWdfaW5mb190KiBpZCwgaW50IGxldmVsLCB2b2lkKiBkYXRhLCBpbnQgbGVuZ3RoKQogewotCWlmICgoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpKSByZXR1cm4gTlVMTDsKKwlpZiAoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSB8fCAoaWQtPnBhZ2VzX3Blcl9hcmVhID09IDApKQorCQlyZXR1cm4gTlVMTDsKICAgICAgICAgcmV0dXJuIGRlYnVnX2V2ZW50X2NvbW1vbihpZCxsZXZlbCxkYXRhLGxlbmd0aCk7CiB9CiAKQEAgLTE0MCw3ICsxNDMsOCBAQAogZGVidWdfaW50X2V2ZW50KGRlYnVnX2luZm9fdCogaWQsIGludCBsZXZlbCwgdW5zaWduZWQgaW50IHRhZykKIHsKICAgICAgICAgdW5zaWduZWQgaW50IHQ9dGFnOwotCWlmICgoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpKSByZXR1cm4gTlVMTDsKKwlpZiAoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSB8fCAoaWQtPnBhZ2VzX3Blcl9hcmVhID09IDApKQorCQlyZXR1cm4gTlVMTDsKICAgICAgICAgcmV0dXJuIGRlYnVnX2V2ZW50X2NvbW1vbihpZCxsZXZlbCwmdCxzaXplb2YodW5zaWduZWQgaW50KSk7CiB9CiAKQEAgLTE0OCwxNCArMTUyLDE2IEBACiBkZWJ1Z19sb25nX2V2ZW50IChkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgdGFnKQogewogICAgICAgICB1bnNpZ25lZCBsb25nIHQ9dGFnOwotCWlmICgoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpKSByZXR1cm4gTlVMTDsKKwlpZiAoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSB8fCAoaWQtPnBhZ2VzX3Blcl9hcmVhID09IDApKQorCQlyZXR1cm4gTlVMTDsKICAgICAgICAgcmV0dXJuIGRlYnVnX2V2ZW50X2NvbW1vbihpZCxsZXZlbCwmdCxzaXplb2YodW5zaWduZWQgbG9uZykpOwogfQogCiBleHRlcm4gaW5saW5lIGRlYnVnX2VudHJ5X3QqIAogZGVidWdfdGV4dF9ldmVudChkZWJ1Z19pbmZvX3QqIGlkLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIHR4dCkKIHsKLQlpZiAoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSkgcmV0dXJuIE5VTEw7CisJaWYgKCghaWQpIHx8IChsZXZlbCA+IGlkLT5sZXZlbCkgfHwgKGlkLT5wYWdlc19wZXJfYXJlYSA9PSAwKSkKKwkJcmV0dXJuIE5VTEw7CiAgICAgICAgIHJldHVybiBkZWJ1Z19ldmVudF9jb21tb24oaWQsbGV2ZWwsdHh0LHN0cmxlbih0eHQpKTsKIH0KIApAQCAtMTY3LDcgKzE3Myw4IEBACiBleHRlcm4gaW5saW5lIGRlYnVnX2VudHJ5X3QqIAogZGVidWdfZXhjZXB0aW9uKGRlYnVnX2luZm9fdCogaWQsIGludCBsZXZlbCwgdm9pZCogZGF0YSwgaW50IGxlbmd0aCkKIHsKLQlpZiAoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSkgcmV0dXJuIE5VTEw7CisJaWYgKCghaWQpIHx8IChsZXZlbCA+IGlkLT5sZXZlbCkgfHwgKGlkLT5wYWdlc19wZXJfYXJlYSA9PSAwKSkKKwkJcmV0dXJuIE5VTEw7CiAgICAgICAgIHJldHVybiBkZWJ1Z19leGNlcHRpb25fY29tbW9uKGlkLGxldmVsLGRhdGEsbGVuZ3RoKTsKIH0KIApAQCAtMTc1LDcgKzE4Miw4IEBACiBkZWJ1Z19pbnRfZXhjZXB0aW9uKGRlYnVnX2luZm9fdCogaWQsIGludCBsZXZlbCwgdW5zaWduZWQgaW50IHRhZykKIHsKICAgICAgICAgdW5zaWduZWQgaW50IHQ9dGFnOwotCWlmICgoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpKSByZXR1cm4gTlVMTDsKKwlpZiAoKCFpZCkgfHwgKGxldmVsID4gaWQtPmxldmVsKSB8fCAoaWQtPnBhZ2VzX3Blcl9hcmVhID09IDApKQorCQlyZXR1cm4gTlVMTDsKICAgICAgICAgcmV0dXJuIGRlYnVnX2V4Y2VwdGlvbl9jb21tb24oaWQsbGV2ZWwsJnQsc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogfQogCkBAIC0xODMsMTQgKzE5MSwxNiBAQAogZGVidWdfbG9uZ19leGNlcHRpb24gKGRlYnVnX2luZm9fdCogaWQsIGludCBsZXZlbCwgdW5zaWduZWQgbG9uZyB0YWcpCiB7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgdD10YWc7Ci0JaWYgKCghaWQpIHx8IChsZXZlbCA+IGlkLT5sZXZlbCkpIHJldHVybiBOVUxMOworCWlmICgoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpIHx8IChpZC0+cGFnZXNfcGVyX2FyZWEgPT0gMCkpCisJCXJldHVybiBOVUxMOwogICAgICAgICByZXR1cm4gZGVidWdfZXhjZXB0aW9uX2NvbW1vbihpZCxsZXZlbCwmdCxzaXplb2YodW5zaWduZWQgbG9uZykpOwogfQogCiBleHRlcm4gaW5saW5lIGRlYnVnX2VudHJ5X3QqIAogZGVidWdfdGV4dF9leGNlcHRpb24oZGVidWdfaW5mb190KiBpZCwgaW50IGxldmVsLCBjb25zdCBjaGFyKiB0eHQpCiB7Ci0JaWYgKCghaWQpIHx8IChsZXZlbCA+IGlkLT5sZXZlbCkpIHJldHVybiBOVUxMOworCWlmICgoIWlkKSB8fCAobGV2ZWwgPiBpZC0+bGV2ZWwpIHx8IChpZC0+cGFnZXNfcGVyX2FyZWEgPT0gMCkpCisJCXJldHVybiBOVUxMOwogICAgICAgICByZXR1cm4gZGVidWdfZXhjZXB0aW9uX2NvbW1vbihpZCxsZXZlbCx0eHQsc3RybGVuKHR4dCkpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmggYi9pbmNsdWRlL2FzbS1zMzkwL2tleGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjZjdkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAva2V4ZWMuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogaW5jbHVkZS9hc20tczM5MC9rZXhlYy5oCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQorICoKKyAqIEF1dGhvcihzKTogUm9sZiBBZGVsc2JlcmdlciA8YWRlbHNiZXJnZXJAZGUuaWJtLmNvbT4KKyAqCisgKi8KKworI2lmbmRlZiBfUzM5MF9LRVhFQ19ICisjZGVmaW5lIF9TMzkwX0tFWEVDX0gKKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorLyoKKyAqIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgbWF4aW11bSBwYWdlIGdldF9mcmVlX3BhZ2UgY2FuIHJldHVybi4KKyAqIEkuZS4gTWF4aW11bSBwYWdlIHRoYXQgaXMgbWFwcGVkIGRpcmVjdGx5IGludG8ga2VybmVsIG1lbW9yeSwKKyAqIGFuZCBrbWFwIGlzIG5vdCByZXF1aXJlZC4KKyAqLworCisvKiBNYXhpbXVtIHBoeXNpY2FsIGFkZHJlc3Mgd2UgY2FuIHVzZSBwYWdlcyBmcm9tICovCisjZGVmaW5lIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQgKC0xVUwpCisKKy8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gcmVhY2ggaW4gcGh5c2ljYWwgYWRkcmVzcyBtb2RlICovCisjZGVmaW5lIEtFWEVDX0RFU1RJTkFUSU9OX01FTU9SWV9MSU1JVCAoLTFVTCkKKworLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiB1c2UgZm9yIHRoZSBjb250cm9sIHBhZ2VzICovCisvKiBOb3QgbW9yZSB0aGFuIDJHQiAqLworI2RlZmluZSBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCAoMTw8MzEpCisKKy8qIEFsbG9jYXRlIG9uZSBwYWdlIGZvciB0aGUgcGRwIGFuZCB0aGUgc2Vjb25kIGZvciB0aGUgY29kZSAqLworI2RlZmluZSBLRVhFQ19DT05UUk9MX0NPREVfU0laRSA0MDk2CisKKy8qIFRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEtFWEVDX0FSQ0ggS0VYRUNfQVJDSF9TMzkwCisKKyNkZWZpbmUgTUFYX05PVEVfQllURVMgMTAyNAordHlwZWRlZiB1MzIgbm90ZV9idWZfdFtNQVhfTk9URV9CWVRFUy80XTsKKworZXh0ZXJuIG5vdGVfYnVmX3QgY3Jhc2hfbm90ZXNbXTsKKworI2VuZGlmIC8qX1MzOTBfS0VYRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9sb3djb3JlLmggYi9pbmNsdWRlL2FzbS1zMzkwL2xvd2NvcmUuaAppbmRleCBkZjUxNzJmLi43NmI1YjE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL2xvd2NvcmUuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL2xvd2NvcmUuaApAQCAtMTA5LDEwICsxMDksMTQgQEAKIAogI2lmbmRlZiBfX3MzOTB4X18KICNkZWZpbmUgX19MQ19QRkFVTFRfSU5UUEFSTSAgICAgICAgICAgICAweDA4MAorI2RlZmluZSBfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEgICAgICAgIDB4MEQ4CiAjZGVmaW5lIF9fTENfQVJFR1NfU0FWRV9BUkVBICAgICAgICAgICAgMHgxMjAKKyNkZWZpbmUgX19MQ19HUFJFR1NfU0FWRV9BUkVBICAgICAgICAgICAweDE4MAogI2RlZmluZSBfX0xDX0NSRUdTX1NBVkVfQVJFQSAgICAgICAgICAgIDB4MUMwCiAjZWxzZSAvKiBfX3MzOTB4X18gKi8KICNkZWZpbmUgX19MQ19QRkFVTFRfSU5UUEFSTSAgICAgICAgICAgICAweDExQjgKKyNkZWZpbmUgX19MQ19HUFJFR1NfU0FWRV9BUkVBICAgICAgICAgICAweDEyODAKKyNkZWZpbmUgX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBICAgICAgICAweDEzMjgKICNkZWZpbmUgX19MQ19BUkVHU19TQVZFX0FSRUEgICAgICAgICAgICAweDEzNDAKICNkZWZpbmUgX19MQ19DUkVHU19TQVZFX0FSRUEgICAgICAgICAgICAweDEzODAKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KQEAgLTE2Nyw3ICsxNzEsOCBAQAogCV9fdTE2ICAgICAgICBzdWJjaGFubmVsX25yOyAgICAgICAgICAgIC8qIDB4MGJhICovCiAJX191MzIgICAgICAgIGlvX2ludF9wYXJtOyAgICAgICAgICAgICAgLyogMHgwYmMgKi8KIAlfX3UzMiAgICAgICAgaW9faW50X3dvcmQ7ICAgICAgICAgICAgICAvKiAweDBjMCAqLwotICAgICAgICBfX3U4ICAgICAgICAgcGFkM1sweEQ4LTB4QzRdOyAgICAgICAgICAvKiAweDBjNCAqLworICAgICAgICBfX3U4ICAgICAgICAgcGFkM1sweEQ0LTB4QzRdOyAgICAgICAgICAvKiAweDBjNCAqLworCV9fdTMyICAgICAgICBleHRlbmRlZF9zYXZlX2FyZWFfYWRkcjsgIC8qIDB4MGQ0ICovCiAJX191MzIgICAgICAgIGNwdV90aW1lcl9zYXZlX2FyZWFbMl07ICAgLyogMHgwZDggKi8KIAlfX3UzMiAgICAgICAgY2xvY2tfY29tcF9zYXZlX2FyZWFbMl07ICAvKiAweDBlMCAqLwogCV9fdTMyICAgICAgICBtY2NrX2ludGVycnVwdGlvbl9jb2RlWzJdOyAvKiAweDBlOCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXMzOTAvcHJvY2Vzc29yLmgKaW5kZXggZmI0NmU5MC4uOGJkMTRkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3Byb2Nlc3Nvci5oCkBAIC0yMDcsNiArMjA3LDE4IEBACiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKIC8qCisgKiBTZXQgUFNXIHRvIHNwZWNpZmllZCB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbG9hZF9wc3cocHN3X3QgcHN3KQoreworI2lmbmRlZiBfX3MzOTB4X18KKwlhc20gdm9sYXRpbGUgKCJscHN3ICAwKCUwKSIgOiA6ICJhIiAoJnBzdyksICJtIiAocHN3KSA6ICJjYyIgKTsKKyNlbHNlCisJYXNtIHZvbGF0aWxlICgibHBzd2UgMCglMCkiIDogOiAiYSIgKCZwc3cpLCAibSIgKHBzdykgOiAiY2MiICk7CisjZW5kaWYKK30KKworLyoKICAqIFNldCBQU1cgbWFzayB0byBzcGVjaWZpZWQgdmFsdWUsIHdoaWxlIGxlYXZpbmcgdGhlCiAgKiBQU1cgYWRkciBwb2ludGluZyB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KICAqLwpAQCAtMjE0LDggKzIyNiw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgX19sb2FkX3Bzd19tYXNrICh1bnNpZ25lZCBsb25nIG1hc2spCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwotCiAJcHN3X3QgcHN3OworCiAJcHN3Lm1hc2sgPSBtYXNrOwogCiAjaWZuZGVmIF9fczM5MHhfXwpAQCAtMjQxLDMwICsyNTMsOCBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlZF93YWl0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyByZWc7Ci0JcHN3X3Qgd2FpdF9wc3c7Ci0KLQl3YWl0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19NQVNLX0lPIHwgUFNXX01BU0tfRVhUIHwKLQkJUFNXX01BU0tfTUNIRUNLIHwgUFNXX01BU0tfV0FJVCB8IFBTV19ERUZBVUxUX0tFWTsKLSNpZm5kZWYgX19zMzkweF9fCi0JYXNtIHZvbGF0aWxlICgKLQkJIiAgICBiYXNyICUwLDBcbiIKLQkJIjA6ICBsYSAgICUwLDFmLTBiKCUwKVxuIgotCQkiICAgIHN0ICAgJTAsNCglMSlcbiIKLQkJIiAgICBvaSAgIDQoJTEpLDB4ODBcbiIKLQkJIiAgICBscHN3IDAoJTEpXG4iCi0JCSIxOiIKLQkJOiAiPSZhIiAocmVnKSA6ICJhIiAoJndhaXRfcHN3KSwgIm0iICh3YWl0X3BzdykKLQkJOiAibWVtb3J5IiwgImNjIiApOwotI2Vsc2UgLyogX19zMzkweF9fICovCi0JYXNtIHZvbGF0aWxlICgKLQkJIiAgICBsYXJsICAlMCwwZlxuIgotCQkiICAgIHN0ZyAgICUwLDgoJTEpXG4iCi0JCSIgICAgbHBzd2UgMCglMSlcbiIKLQkJIjA6IgotCQk6ICI9JmEiIChyZWcpIDogImEiICgmd2FpdF9wc3cpLCAibSIgKHdhaXRfcHN3KQotCQk6ICJtZW1vcnkiLCAiY2MiICk7Ci0jZW5kaWYgLyogX19zMzkweF9fICovCisJX19sb2FkX3Bzd19tYXNrKFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19JTyB8IFBTV19NQVNLX0VYVCB8CisJCQlQU1dfTUFTS19NQ0hFQ0sgfCBQU1dfTUFTS19XQUlUIHwgUFNXX0RFRkFVTFRfS0VZKTsKIH0KIAogLyoKQEAgLTI3MywxMyArMjYzLDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlZF93YWl0KHVuc2lnbmVkIGxvbmcgY29kZSkKIHsKLSAgICAgICAgY2hhciBwc3dfYnVmZmVyWzIqc2l6ZW9mKHBzd190KV07CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgY3RsX2J1ZjsKLSAgICAgICAgcHN3X3QgKmR3X3BzdyA9IChwc3dfdCAqKSgoKHVuc2lnbmVkIGxvbmcpICZwc3dfYnVmZmVyK3NpemVvZihwc3dfdCktMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIC1zaXplb2YocHN3X3QpKTsKKyAgICAgICAgcHN3X3QgZHdfcHN3OwogCi0gICAgICAgIGR3X3Bzdy0+bWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19XQUlUOwotICAgICAgICBkd19wc3ctPmFkZHIgPSBjb2RlOworICAgICAgICBkd19wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19XQUlUOworICAgICAgICBkd19wc3cuYWRkciA9IGNvZGU7CiAgICAgICAgIC8qIAogICAgICAgICAgKiBTdG9yZSBzdGF0dXMgYW5kIHRoZW4gbG9hZCBkaXNhYmxlZCB3YWl0IHBzdywKICAgICAgICAgICogdGhlIHByb2Nlc3NvciBpcyBkZWFkIGFmdGVyd2FyZHMKQEAgLTMwMSw3ICsyODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICIgICAgb2kgICAgMHgxYzAsMHgxMFxuIiAvKiBmYWtlIHByb3RlY3Rpb24gYml0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIiAgICBscHN3IDAoJTEpIgogICAgICAgICAgICAgICAgICAgICAgIDogIj1tIiAoY3RsX2J1ZikKLQkJICAgICAgOiAiYSIgKGR3X3BzdyksICJhIiAoJmN0bF9idWYpLCAibSIgKGR3X3BzdykgOiAiY2MiICk7CisJCSAgICAgIDogImEiICgmZHdfcHN3KSwgImEiICgmY3RsX2J1ZiksICJtIiAoZHdfcHN3KSA6ICJjYyIgKTsKICNlbHNlIC8qIF9fczM5MHhfXyAqLwogICAgICAgICBhc20gdm9sYXRpbGUgKCIgICAgc3RjdGcgMCwwLDAoJTIpXG4iCiAgICAgICAgICAgICAgICAgICAgICAgIiAgICBuaSAgICA0KCUyKSwweGVmXG4iIC8qIHN3aXRjaCBvZmYgcHJvdGVjdGlvbiAqLwpAQCAtMzMzLDcgKzMyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIiAgICBvaSAgICAweDM4NCgxKSwweDEwXG4iIC8qIGZha2UgcHJvdGVjdGlvbiBiaXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAiICAgIGxwc3dlIDAoJTEpIgogICAgICAgICAgICAgICAgICAgICAgIDogIj1tIiAoY3RsX2J1ZikKLQkJICAgICAgOiAiYSIgKGR3X3BzdyksICJhIiAoJmN0bF9idWYpLAorCQkgICAgICA6ICJhIiAoJmR3X3BzdyksICJhIiAoJmN0bF9idWYpLAogCQkgICAgICAgICJtIiAoZHdfcHN3KSA6ICJjYyIsICIwIiwgIjEiKTsKICNlbmRpZiAvKiBfX3MzOTB4X18gKi8KIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS1zMzkwL3B0cmFjZS5oCmluZGV4IDRlZmY4ZjIuLmZjN2M5NmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wdHJhY2UuaApAQCAtMjc2LDcgKzI3Niw3IEBACiAjZW5kaWYgLyogX19zMzkweF9fICovCiAKICNkZWZpbmUgUFNXX0tFUk5FTF9CSVRTCShQU1dfQkFTRV9CSVRTIHwgUFNXX01BU0tfREFUIHwgUFNXX0FTQ19QUklNQVJZIHwgXAotCQkJIFBTV19ERUZBVUxUX0tFWSkKKwkJCSBQU1dfTUFTS19NQ0hFQ0sgfCBQU1dfREVGQVVMVF9LRVkpCiAjZGVmaW5lIFBTV19VU0VSX0JJVFMJKFBTV19CQVNFX0JJVFMgfCBQU1dfTUFTS19EQVQgfCBQU1dfQVNDX0hPTUUgfCBcCiAJCQkgUFNXX01BU0tfSU8gfCBQU1dfTUFTS19FWFQgfCBQU1dfTUFTS19NQ0hFQ0sgfCBcCiAJCQkgUFNXX01BU0tfUFNUQVRFIHwgUFNXX0RFRkFVTFRfS0VZKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXMzOTAvc3lzdGVtLmgKaW5kZXggODE1MTRkNy4uODY0Y2FlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3N5c3RlbS5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KIApAQCAtMTAzLDI5ICsxMDQsMTYgQEAKIAlwcmV2ID0gX19zd2l0Y2hfdG8ocHJldixuZXh0KTsJCQkJCSAgICAgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBwcmVwYXJlX2FyY2hfc3dpdGNoKHJxLCBuZXh0KQlkbyB7IH0gd2hpbGUoMCkKLSNkZWZpbmUgdGFza19ydW5uaW5nKHJxLCBwKQkJKChycSktPmN1cnIgPT0gKHApKQotCiAjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIGV4dGVybiB2b2lkIGFjY291bnRfdXNlcl92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBhY2NvdW50X3N5c3RlbV92dGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci0KLSNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHJxLCBwcmV2KSBkbyB7CQkJCSAgICAgXAotCXNldF9mcyhjdXJyZW50LT50aHJlYWQubW1fc2VnbWVudCk7CQkJCSAgICAgXAotCXNwaW5fdW5sb2NrKCYocnEpLT5sb2NrKTsJCQkJCSAgICAgXAotCWFjY291bnRfc3lzdGVtX3Z0aW1lKHByZXYpOwkJCQkJICAgICBcCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwkJCQkJCSAgICAgXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UKLQotI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocnEsIHByZXYpIGRvIHsJCQkJICAgICBcCi0Jc2V0X2ZzKGN1cnJlbnQtPnRocmVhZC5tbV9zZWdtZW50KTsJCQkJICAgICBcCi0Jc3Bpbl91bmxvY2tfaXJxKCYocnEpLT5sb2NrKTsJCQkJCSAgICAgXAotfSB3aGlsZSAoMCkKLQogI2VuZGlmCiAKKyNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpIGRvIHsJCQkJCSAgICAgXAorCXNldF9mcyhjdXJyZW50LT50aHJlYWQubW1fc2VnbWVudCk7CQkJCSAgICAgXAorCWFjY291bnRfc3lzdGVtX3Z0aW1lKHByZXYpOwkJCQkJICAgICBcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikKIAogI2RlZmluZSB4Y2hnKHB0cix4KSBcCkBAIC0zMzEsOSArMzE5LDYgQEAKIAogI2lmZGVmIF9fczM5MHhfXwogCi0jZGVmaW5lIF9fbG9hZF9wc3cocHN3KSBcCi0gICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJscHN3ZSAwKCUwKSIgOiA6ICJhIiAoJnBzdyksICJtIiAocHN3KSA6ICJjYyIgKTsKLQogI2RlZmluZSBfX2N0bF9sb2FkKGFycmF5LCBsb3csIGhpZ2gpICh7IFwKIAl0eXBlZGVmIHN0cnVjdCB7IGNoYXIgX1tzaXplb2YoYXJyYXkpXTsgfSBhZGRydHlwZTsgXAogCV9fYXNtX18gX192b2xhdGlsZV9fICggXApAQCAtMzkwLDkgKzM3NSw2IEBACiAKICNlbHNlIC8qIF9fczM5MHhfXyAqLwogCi0jZGVmaW5lIF9fbG9hZF9wc3cocHN3KSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImxwc3cgMCglMCkiIDogOiAiYSIgKCZwc3cpIDogImNjIiApOwotCiAjZGVmaW5lIF9fY3RsX2xvYWQoYXJyYXksIGxvdywgaGlnaCkgKHsgXAogCXR5cGVkZWYgc3RydWN0IHsgY2hhciBfW3NpemVvZihhcnJheSldOyB9IGFkZHJ0eXBlOyBcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCBcCkBAIC00NTEsNiArNDMzLDIwIEBACiAvKiBGb3Igc3BpbmxvY2tzIGV0YyAqLwogI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KQkoKHgpID0gbG9jYWxfaXJxX2Rpc2FibGUoKSkKIAorLyoKKyAqIFVzZSB0byBzZXQgcHN3IG1hc2sgZXhjZXB0IGZvciB0aGUgZmlyc3QgYnl0ZSB3aGljaAorICogd29uJ3QgYmUgY2hhbmdlZCBieSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fc2V0X3Bzd19tYXNrKHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKwlsb2NhbF9zYXZlX2ZsYWdzKG1hc2spOworCV9fbG9hZF9wc3dfbWFzayhtYXNrKTsKK30KKworI2RlZmluZSBsb2NhbF9tY2NrX2VuYWJsZSgpICBfX3NldF9wc3dfbWFzayhQU1dfS0VSTkVMX0JJVFMpCisjZGVmaW5lIGxvY2FsX21jY2tfZGlzYWJsZSgpIF9fc2V0X3Bzd19tYXNrKFBTV19LRVJORUxfQklUUyAmIH5QU1dfTUFTS19NQ0hFQ0spCisKICNpZmRlZiBDT05GSUdfU01QCiAKIGV4dGVybiB2b2lkIHNtcF9jdGxfc2V0X2JpdChpbnQgY3IsIGludCBiaXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tczM5MC90aHJlYWRfaW5mby5oCmluZGV4IGZlMTAxZDQuLjZjMThhM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3RocmVhZF9pbmZvLmgKQEAgLTk2LDYgKzk2LDcgQEAKICNkZWZpbmUgVElGX1JFU1RBUlRfU1ZDCQk0CS8qIHJlc3RhcnQgc3ZjIHdpdGggbmV3IHN2YyBudW1iZXIgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJNQkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0lOR0xFX1NURVAJCTYJLyogZGVsaXZlciBzaWd0cmFwIG9uIHJldHVybiB0byB1c2VyICovCisjZGVmaW5lIFRJRl9NQ0NLX1BFTkRJTkcJNwkvKiBtYWNoaW5lIGNoZWNrIGhhbmRsaW5nIGlzIHBlbmRpbmcgKi8KICNkZWZpbmUgVElGX1VTRURGUFUJCTE2CS8qIEZQVSB3YXMgdXNlZCBieSB0aGlzIHRhc2sgdGhpcyBxdWFudHVtIChTTVApICovCiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNwkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgCiAJCQkJCSAgIFRJRl9ORUVEX1JFU0NIRUQgKi8KQEAgLTEwOSw2ICsxMTAsNyBAQAogI2RlZmluZSBfVElGX1JFU1RBUlRfU1ZDCSgxPDxUSUZfUkVTVEFSVF9TVkMpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU0lOR0xFX1NURVAJKDE8PFRJRl9TSU5HTEVfU1RFUCkKKyNkZWZpbmUgX1RJRl9NQ0NLX1BFTkRJTkcJKDE8PFRJRl9NQ0NLX1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfVVNFREZQVQkJKDE8PFRJRl9VU0VERlBVKQogI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfMzFCSVQJCSgxPDxUSUZfMzFCSVQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaAppbmRleCBmMWEyMDRmLi4zNjNkYjQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKQEAgLTI2OSw3ICsyNjksNyBAQAogI2RlZmluZSBfX05SX21xX3RpbWVkcmVjZWl2ZQkyNzQKICNkZWZpbmUgX19OUl9tcV9ub3RpZnkJCTI3NQogI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIJMjc2Ci0vKiBOdW1iZXIgMjc3IGlzIHJlc2VydmVkIGZvciBuZXcgc3lzX2tleGVjX2xvYWQgKi8KKyNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkyNzcKICNkZWZpbmUgX19OUl9hZGRfa2V5CQkyNzgKICNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyNzkKICNkZWZpbmUgX19OUl9rZXljdGwJCTI4MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYmlnc3VyL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tc2gvYmlnc3VyL3NlcmlhbC5oCmluZGV4IDU0MGYxMjIuLjcyMzNhZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvc2VyaWFsLmgKQEAgLTE0LDEzICsxNCwxMCBAQAogI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQogCiAKLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIC8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLyAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHsgMCwgQkFTRV9CQVVELCAweDNGOCwgSEQ2NDQ2NV9JUlFfVUFSVCwgU1REX0NPTV9GTEFHUyB9IC8qIHR0eVMwICovIAogCi0KLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyBTVERfU0VSSUFMX1BPUlRfREVGTlMKLQogLyogWFhYOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCBpbm8gaXJxLmggKi8KICNkZWZpbmUgaXJxX2Nhbm5vbmljYWxpemUoeCkgKHgpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9zZXJpYWwuaAppbmRleCBmOGViMTYzLi5jZmU0ZDc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZWMzMTA0L3NlcmlhbC5oCkBAIC0xMCwxMyArMTAsMTEgQEAKICAqIGl0J3MgZ290IHRoZSBrZXlib2FyZCBjb250cm9sbGVyIGJlaGluZCBpdCBzbyB3ZSBjYW4ndCByZWFsbHkgdXNlIGl0CiAgKiAod2l0aG91dCBtb3ZpbmcgdGhlIGtleWJvYXJkIGRyaXZlciB0byB1c2Vyc3BhY2UsIHdoaWNoIGRvZXNuJ3Qgc291bmQKICAqIGxpa2UgYSB2ZXJ5IGdvb2QgaWRlYSkgKi8KLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgxMUMwMCwgRUMzMTA0X0lSUUJBU0UrNywgU1REX0NPTV9GTEFHUyB9LCAvKiB0dHlTMCAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4MTIwMDAsIEVDMzEwNF9JUlFCQVNFKzgsIFNURF9DT01fRkxBR1MgfSwgLyogdHR5UzEgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDEyNDAwLCBFQzMxMDRfSVJRQkFTRSs5LCBTVERfQ09NX0ZMQUdTIH0sIC8qIHR0eVMyICovCiAKLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUyBTVERfU0VSSUFMX1BPUlRfREVGTlMKLQogLyogWFhYOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCBpbm8gaXJxLmggKi8KICNkZWZpbmUgaXJxX2Nhbm5vbmljYWxpemUoeCkgKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wY2kuaCBiL2luY2x1ZGUvYXNtLXNoL3BjaS5oCmluZGV4IDljM2I2M2QuLjBhNTIzYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BjaS5oCkBAIC0zNiw3ICszNiw3IEBACiAKIGV4dGVybiB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAotc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CkBAIC05Niw2ICs5NiwxNiBAQAogI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKHZpcnRfdG9fYnVzKChzZyktPmRtYV9hZGRyZXNzKSkKICNkZWZpbmUgc2dfZG1hX2xlbihzZykJCSgoc2cpLT5sZW5ndGgpCiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKIC8qIEJvYXJkLXNwZWNpZmljIGZpeHVwIHJvdXRpbmVzLiAqLwogZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cCh2b2lkKTsKIGV4dGVybiB2b2lkIHBjaWJpb3NfZml4dXBfaXJxcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20tc2gvc2VyaWFsLmgKaW5kZXggNTQ3NGRiZC4uZjUxZTIzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2VyaWFsLmgKQEAgLTI5LDIwICsyOSwxOCBAQAogI2lmZGVmIENPTkZJR19IRDY0NDY1CiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjUuaD4KIAotI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCBIRDY0NDY1X0lSUV9VQVJULCBTVERfQ09NX0ZMQUdTIH0gIC8qIHR0eVMwICovCiAKICNlbHNlCiAKLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9CS8qIHR0eVMxICovCiAKICNlbmRpZgogCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgU1REX1NFUklBTF9QT1JUX0RFRk5TCi0KICNlbmRpZgogI2VuZGlmIC8qIF9BU01fU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1zaDY0L3BjaS5oCmluZGV4IDhjYzE0ZTEzOS4uYWE4MDQzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L3BjaS5oCkBAIC0yNiw3ICsyNiw3IEBACiAvKgogICogU2V0IHBlbmFsaXplIGlzYSBpcnEgZnVuY3Rpb24KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQorc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKQogewogCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCiB9CkBAIC04Niw2ICs4NiwxNiBAQAogI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKChzZyktPmRtYV9hZGRyZXNzKQogI2RlZmluZSBzZ19kbWFfbGVuKHNnKQkJKChzZyktPmxlbmd0aCkKIAorI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKKwkJCQkJdW5zaWduZWQgbG9uZyAqc3RyYXRlZ3lfcGFyYW1ldGVyKQoreworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfSU5GSU5JVFk7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IH4wVUw7Cit9CisjZW5kaWYKKwogLyogQm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZXMuICovCiBleHRlcm4gdm9pZCBwY2liaW9zX2ZpeHVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cF9pcnFzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoNjQvc2VyaWFsLmgKaW5kZXggOGUzOWI0ZS4uMjljOWJlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L3NlcmlhbC5oCkBAIC0yMCwxMyArMjAsMTEgQEAKIAogI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQogCi0jZGVmaW5lIFNURF9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKIAkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMwICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRjgsIDMsIFNURF9DT01fRkxBR1MgfQkvKiB0dHlTMSAqLwogCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgU1REX1NFUklBTF9QT1JUX0RFRk5TCi0KIC8qIFhYWDogVGhpcyBzaG91bGQgYmUgbW92ZWQgaW5vIGlycS5oICovCiAjZGVmaW5lIGlycV9jYW5ub25pY2FsaXplKHgpICh4KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wY2kuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3BjaS5oCmluZGV4IGQyMDBhMjUuLjk3MDUyYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3BjaS5oCkBAIC0yMCw3ICsyMCw3IEBACiAJLyogTm8gc3BlY2lhbCBidXMgbWFzdGVyaW5nIHNldHVwIGhhbmRsaW5nICovCiB9CiAKLWV4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSkKK2V4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKIHsKIAkvKiBXZSBkb24ndCBkbyBkeW5hbWljIFBDSSBJUlEgYWxsb2NhdGlvbiAqLwogfQpAQCAtMTQ0LDYgKzE0NCwxNiBAQAogCiAjZGVmaW5lIHBjaV9kYWNfZG1hX3N1cHBvcnRlZChkZXYsIG1hc2spCSgwKQogCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAorCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCit7CisJKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKKwkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9zeXN0ZW0uaAppbmRleCA4MGNmMjBjLi44OTg1NjJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9zeXN0ZW0uaApAQCAtMTAxLDcgKzEwMSw3IEBACiAgKiBTV0lUQ0hfRU5URVIgYW5kIFNXSVRIX0RPX0xBWllfRlBVIGRvIG5vdCB3b3JrIHlldCAoZS5nLiBTTVAgZG9lcyBub3Qgd29yaykKICAqIFhYWCBXVEYgaXMgdGhlIGFib3ZlIGNvbW1lbnQ/IEZvdW5kIGluIGxhdGUgdGVlbiAyLjQueC4KICAqLwotI2RlZmluZSBwcmVwYXJlX2FyY2hfc3dpdGNoKHJxLCBuZXh0KSBkbyB7IFwKKyNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KSBkbyB7IFwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyggXAogCSIuZ2xvYmxcdGZsdXNoX3BhdGNoX3N3aXRjaFxuZmx1c2hfcGF0Y2hfc3dpdGNoOlxuXHQiIFwKIAkic2F2ZSAlc3AsIC0weDQwLCAlc3A7IHNhdmUgJXNwLCAtMHg0MCwgJXNwOyBzYXZlICVzcCwgLTB4NDAsICVzcFxuXHQiIFwKQEAgLTEwOSw4ICsxMDksNiBAQAogCSJzYXZlICVzcCwgLTB4NDAsICVzcFxuXHQiIFwKIAkicmVzdG9yZTsgcmVzdG9yZTsgcmVzdG9yZTsgcmVzdG9yZTsgcmVzdG9yZTsgcmVzdG9yZTsgcmVzdG9yZSIpOyBcCiB9IHdoaWxlKDApCi0jZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChycSwgbmV4dCkJc3Bpbl91bmxvY2tfaXJxKCYocnEpLT5sb2NrKQotI2RlZmluZSB0YXNrX3J1bm5pbmcocnEsIHApCQkoKHJxKS0+Y3VyciA9PSAocCkpCiAKIAkvKiBNdWNoIGNhcmUgaGFzIGdvbmUgaW50byB0aGlzIGNvZGUsIGRvIG5vdCB0b3VjaCBpdC4KIAkgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaAppbmRleCA4NDY3MDg0Li5hZWUxN2Q3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaApAQCAtMjEyLDcgKzIxMiw3IEBACiAjZGVmaW5lIF9fTlJfZXBvbGxfY3JlYXRlICAgICAgIDE5MyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfZXBvbGxfY3RsICAgICAgICAgIDE5NCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfZXBvbGxfd2FpdCAgICAgICAgIDE5NSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfdWxpbWl0ICAgICAgICAgIDE5NiAgICBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldCAgICAgICAgIDE5NiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfZ2V0cHBpZCAgICAgICAgICAgIDE5NyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lnYWN0aW9uICAgICAgICAgIDE5OCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2dldG1hc2sgICAgICAgICAgIDE5OSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMzQsNyArMjM0LDcgQEAKICNkZWZpbmUgX19OUl9pcGMgICAgICAgICAgICAgICAgMjE1IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9zaWdyZXR1cm4gICAgICAgICAgMjE2IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9jbG9uZSAgICAgICAgICAgICAgMjE3IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgX19OUl9tb2RpZnlfbGR0ICAgICAgMjE4ICAgIExpbnV4IFNwZWNpZmljIC0gaTM4NiBzcGVjaWZpYywgdW51c2VkICAgICAgKi8KKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0ICAgICAgICAgMjE4IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9hZGp0aW1leCAgICAgICAgICAgMjE5IC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9zaWdwcm9jbWFzayAgICAgICAgMjIwIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgX19OUl9jcmVhdGVfbW9kdWxlICAgICAgMjIxIC8qIExpbnV4IFNwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXV4aW8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvYXV4aW8uaAppbmRleCA1ZWIwMWRkLi44MWE1OTBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2F1eGlvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9hdXhpby5oCkBAIC03NSw2ICs3NSw4IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKK2V4dGVybiB2b2lkIF9faW9tZW0gKmF1eGlvX3JlZ2lzdGVyOworCiAjZGVmaW5lIEFVWElPX0xURV9PTgkxCiAjZGVmaW5lIEFVWElPX0xURV9PRkYJMAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaAppbmRleCBlMDcxYjRiLi40OWQ0OWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmxvcHB5LmgKQEAgLTE1OSw3ICsxNTksNyBAQAogICogdW5kZXJydW5zLiAgSWYgbm9uLXplcm8sIGRvaW5nX3BkbWEgZW5jb2RlcyB0aGUgZGlyZWN0aW9uIG9mCiAgKiB0aGUgdHJhbnNmZXIgZm9yIGRlYnVnZ2luZy4gIDE9cmVhZCAyPXdyaXRlCiAgKi8KLWNoYXIgKnBkbWFfdmFkZHI7Cit1bnNpZ25lZCBjaGFyICpwZG1hX3ZhZGRyOwogdW5zaWduZWQgbG9uZyBwZG1hX3NpemU7CiB2b2xhdGlsZSBpbnQgZG9pbmdfcGRtYSA9IDA7CiAKQEAgLTIwOSw4ICsyMDksNyBAQAogCXBkbWFfYXJlYXNpemUgPSBwZG1hX3NpemU7CiB9CiAKLS8qIE91ciBsb3ctbGV2ZWwgZW50cnkgcG9pbnQgaW4gYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuUyAqLwotZXh0ZXJuIGlycXJldHVybl90IGZsb3BweV9oYXJkaW50KGludCBpcnEsIHZvaWQgKnVudXNlZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGlycXJldHVybl90IHNwYXJjX2Zsb3BweV9pcnEoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogCiBzdGF0aWMgaW50IHN1bl9mZF9yZXF1ZXN0X2lycSh2b2lkKQogewpAQCAtMjIwLDggKzIxOSw4IEBACiAJaWYoIW9uY2UpIHsKIAkJb25jZSA9IDE7CiAKLQkJZXJyb3IgPSByZXF1ZXN0X2Zhc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LCAKLQkJCQkJIFNBX0lOVEVSUlVQVCwgImZsb3BweSIsIE5VTEwpOworCQllcnJvciA9IHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIHNwYXJjX2Zsb3BweV9pcnEsIAorCQkJCSAgICBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKTsKIAogCQlyZXR1cm4gKChlcnJvciA9PSAwKSA/IDAgOiAtMSk7CiAJfQpAQCAtNjE1LDcgKzYxNCw3IEBACiAJCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOwogCQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXYgPSBOVUxMOwogCQl1bnNpZ25lZCBsb25nIGNvbmZpZyA9IDA7Ci0JCXVuc2lnbmVkIGxvbmcgYXV4aW9fcmVnOworCQl2b2lkIF9faW9tZW0gKmF1eGlvX3JlZzsKIAogCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewpAQCAtNjQyLDcgKzY0MSw3IEBACiAJCS8qIE1ha2Ugc3VyZSB0aGUgaGlnaCBkZW5zaXR5IGJpdCBpcyBzZXQsIHNvbWUgc3lzdGVtcwogCQkgKiAobW9zdCBub3RhYmx5IFVsdHJhNS9VbHRyYTEwKSBjb21lIHVwIHdpdGggaXQgY2xlYXIuCiAJCSAqLwotCQlhdXhpb19yZWcgPSBlZGV2LT5yZXNvdXJjZVsyXS5zdGFydDsKKwkJYXV4aW9fcmVnID0gKHZvaWQgX19pb21lbSAqKSBlZGV2LT5yZXNvdXJjZVsyXS5zdGFydDsKIAkJd3JpdGVsKHJlYWRsKGF1eGlvX3JlZyl8MHgyLCBhdXhpb19yZWcpOwogCiAJCXN1bl9wY2lfZWJ1c19kZXYgPSBlYnVzLT5zZWxmOwpAQCAtNjUwLDcgKzY0OSw4IEBACiAJCXNwaW5fbG9ja19pbml0KCZzdW5fcGNpX2ZkX2VidXNfZG1hLmxvY2spOwogCiAJCS8qIFhYWCBpb3JlbWFwICovCi0JCXN1bl9wY2lfZmRfZWJ1c19kbWEucmVncyA9IGVkZXYtPnJlc291cmNlWzFdLnN0YXJ0OworCQlzdW5fcGNpX2ZkX2VidXNfZG1hLnJlZ3MgPSAodm9pZCBfX2lvbWVtICopCisJCQllZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKIAkJaWYgKCFzdW5fcGNpX2ZkX2VidXNfZG1hLnJlZ3MpCiAJCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXJxLmgKaW5kZXggM2FlZjBjYS4uOGI3MGVkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2lycS5oCkBAIC0xNiwxMCArMTYsMjIgQEAKICNpbmNsdWRlIDxhc20vcGlsLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCitzdHJ1Y3QgaW5vX2J1Y2tldDsKKworI2RlZmluZSBNQVhfSVJRX0RFU0NfQUNUSU9OCTQKKworc3RydWN0IGlycV9kZXNjIHsKKwl2b2lkCQkJKCpwcmVfaGFuZGxlcikoc3RydWN0IGlub19idWNrZXQgKiwgdm9pZCAqLCB2b2lkICopOworCXZvaWQJCQkqcHJlX2hhbmRsZXJfYXJnMTsKKwl2b2lkCQkJKnByZV9oYW5kbGVyX2FyZzI7CisJdTMyCQkJYWN0aW9uX2FjdGl2ZV9tYXNrOworCXN0cnVjdCBpcnFhY3Rpb24JYWN0aW9uW01BWF9JUlFfREVTQ19BQ1RJT05dOworfTsKKwogLyogWW91IHNob3VsZCBub3QgbWVzcyB3aXRoIHRoaXMgZGlyZWN0bHkuIFRoYXQncyB0aGUgam9iIG9mIGlycS5jLgogICoKICAqIElmIHlvdSBtYWtlIGNoYW5nZXMgaGVyZSwgcGxlYXNlIHVwZGF0ZSBoYW5kIGNvZGVkIGFzc2VtYmxlciBvZgotICogU0JVUy9mbG9wcHkgaW50ZXJydXB0IGhhbmRsZXIgaW4gZW50cnkuUyAtRGF2ZU0KKyAqIHRoZSB2ZWN0b3JlZCBpbnRlcnJ1cHQgdHJhcCBoYW5kbGVyIGluIGVudHJ5LlMgLURhdmVNCiAgKgogICogVGhpcyBpcyBjdXJyZW50bHkgb25lIERDQUNIRSBsaW5lLCB0d28gYnVja2V0cyBwZXIgTDIgY2FjaGUKICAqIGxpbmUuICBLZWVwIHRoaXMgaW4gbWluZCBwbGVhc2UuCkBAIC00MiwyNCArNTQsMTEgQEAKIAkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzLiAqLwogLyoweDA2Ki91bnNpZ25lZCBjaGFyIGZsYWdzOwogCi0JLyogVGhpcyBpcyB1c2VkIHRvIGRlYWwgd2l0aCBJQkZfRE1BX1NZTkMgb24KLQkgKiBTYWJyZSBzeXN0ZW1zLgotCSAqLwotLyoweDA3Ki91bnNpZ25lZCBjaGFyIHN5bmN0YWJfZW50OworCS8qIEN1cnJlbnRseSB1bnVzZWQuICAqLworLyoweDA3Ki91bnNpZ25lZCBjaGFyIF9fcGFkOwogCi0JLyogUmVmZXJlbmNlIHRvIGhhbmRsZXIgZm9yIHRoaXMgSVJRLiAgSWYgdGhpcyBpcwotCSAqIG5vbi1OVUxMIHRoaXMgbWVhbnMgaXQgaXMgYWN0aXZlIGFuZCBzaG91bGQgYmUKLQkgKiBzZXJ2aWNlZC4gIEVsc2UgdGhlIHBlbmRpbmcgbWVtYmVyIGlzIHNldCB0byBvbmUKLQkgKiBhbmQgbGF0ZXIgcmVnaXN0cnkgb2YgdGhlIGludGVycnVwdCBjaGVja3MgZm9yCi0JICogdGhpcyBjb25kaXRpb24uCi0JICoKLQkgKiBOb3JtYWxseSB0aGlzIGlzIGp1c3QgYW4gaXJxX2FjdGlvbiBzdHJ1Y3R1cmUuCi0JICogQnV0LCBvbiBQQ0ksIGlmIG11bHRpcGxlIGludGVycnVwdCBzb3VyY2VzIGJlaGluZAotCSAqIGEgYnJpZGdlIGhhdmUgbXVsdGlwbGUgaW50ZXJydXB0IHNvdXJjZXMgdGhhdCBzaGFyZQotCSAqIHRoZSBzYW1lIElOTyBidWNrZXQsIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mCi0JICogcG9pbnRlcnMgdG8gZm91ciBJUlEgYWN0aW9uIHN0cnVjdHVyZXMuCi0JICovCi0vKjB4MDgqL3ZvaWQgKmlycV9pbmZvOworCS8qIFJlZmVyZW5jZSB0byBJUlEgZGVzY3JpcHRvciBmb3IgdGhpcyBidWNrZXQuICovCisvKjB4MDgqL3N0cnVjdCBpcnFfZGVzYyAqaXJxX2luZm87CiAKIAkvKiBTdW41IEludGVycnVwdCBDbGVhciBSZWdpc3Rlci4gKi8KIC8qMHgxMCovdW5zaWduZWQgbG9uZyBpY2xyOwpAQCAtNjksMTIgKzY4LDYgQEAKIAogfTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9kbWFfd3N5bmM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfc3luY19yZWdfdGFibGVbMjU2XTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGRtYV9zeW5jX3JlZ190YWJsZV9lbnRyeTsKLSNlbmRpZgotCiAvKiBJTUFQL0lDTFIgcmVnaXN0ZXIgZGVmaW5lcyAqLwogI2RlZmluZSBJTUFQX1ZBTElECQkweDgwMDAwMDAwCS8qIElSUSBFbmFibGVkCQkqLwogI2RlZmluZSBJTUFQX1RJRF9VUEEJCTB4N2MwMDAwMDAJLyogVVBBIFRhcmdldElECQkqLwpAQCAtOTAsMTEgKzgzLDkgQEAKICNkZWZpbmUgSUNMUl9QRU5ESU5HCQkweDAwMDAwMDAzCS8qIFBlbmRpbmcgc3RhdGUJKi8KIAogLyogT25seSA4LWJpdHMgYXJlIGF2YWlsYWJsZSwgYmUgY2FyZWZ1bC4gIC1EYXZlTSAqLwotI2RlZmluZSBJQkZfRE1BX1NZTkMJMHgwMQkvKiBETUEgc3luY2hyb25pemF0aW9uIGJlaGluZCBQQ0kgYnJpZGdlIG5lZWRlZC4gKi8KLSNkZWZpbmUgSUJGX1BDSQkJMHgwMgkvKiBJbmRpY2F0ZXMgUFNZQ0hPL1NBQlJFL1NDSElaTyBQQ0kgaW50ZXJydXB0LgkgKi8KLSNkZWZpbmUgSUJGX0FDVElWRQkweDA0CS8qIFRoaXMgaW50ZXJydXB0IGlzIGFjdGl2ZSBhbmQgaGFzIGEgaGFuZGxlci4JICovCi0jZGVmaW5lIElCRl9NVUxUSQkweDA4CS8qIE9uIFBDSSwgaW5kaWNhdGVzIHNoYXJlZCBidWNrZXQuCQkgKi8KLSNkZWZpbmUgSUJGX0lOUFJPR1JFU1MJMHgxMAkvKiBJUlEgaXMgYmVpbmcgc2VydmljZWQuCQkJICovCisjZGVmaW5lIElCRl9QQ0kJCTB4MDIJLyogUFNZQ0hPL1NBQlJFL1NDSElaTyBQQ0kgaW50ZXJydXB0LgkgKi8KKyNkZWZpbmUgSUJGX0FDVElWRQkweDA0CS8qIEludGVycnVwdCBpcyBhY3RpdmUgYW5kIGhhcyBhIGhhbmRsZXIuKi8KKyNkZWZpbmUgSUJGX0lOUFJPR1JFU1MJMHgxMAkvKiBJUlEgaXMgYmVpbmcgc2VydmljZWQuCQkgKi8KIAogI2RlZmluZSBOVU1fSVZFQ1MJKElNQVBfSU5SICsgMSkKIGV4dGVybiBzdHJ1Y3QgaW5vX2J1Y2tldCBpdmVjdG9yX3RhYmxlW05VTV9JVkVDU107CkBAIC0xMjIsMTEgKzExMyw2IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGJ1aWxkX2lycShpbnQgcGlsLCBpbnQgaW5vZml4dXAsIHVuc2lnbmVkIGxvbmcgaWNsciwgdW5zaWduZWQgbG9uZyBpbWFwKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgc2J1c19idWlsZF9pcnEodm9pZCAqc2J1cywgdW5zaWduZWQgaW50IGlubyk7CiAKLWV4dGVybiBpbnQgcmVxdWVzdF9mYXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQkJICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIF9fY29uc3RfXyBjaGFyICpkZXZuYW1lLAotCQkJICAgIHZvaWQgKmRldl9pZCk7Ci0KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2V0X3NvZnRpbnQodW5zaWduZWQgbG9uZyBiaXRzKQogewogCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3cgklMCwgMHgwLCAlJXNldF9zb2Z0aW50IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9rZGVidWcuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQva2RlYnVnLmgKaW5kZXggZjcwZDNkYS4uNjMyMWY1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9rZGVidWcuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2tkZWJ1Zy5oCkBAIC0xNiw3ICsxNiw3IEBACiB9OwogCiAvKiBOb3RlIC0geW91IHNob3VsZCBuZXZlciB1bnJlZ2lzdGVyIGJlY2F1c2UgdGhhdCBjYW4gcmFjZSB3aXRoIE5NSXMuCi0gKiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gaXQgZmlyc3QgdW5yZWdpc3RlciAtIHRoZW4gc3luY2hyb25pemVfa2VybmVsCisgKiBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gaXQgZmlyc3QgdW5yZWdpc3RlciAtIHRoZW4gc3luY2hyb25pemVfc2NoZWQKICAqIC0gdGhlbiBmcmVlLgogICovCiBpbnQgcmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJhbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJhbS5oCmluZGV4IDZhMTJmM2EuLmExY2Q0OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcmFtLmgKQEAgLTEsOSArMSwxMCBAQAotLyogJElkOiBwYXJhbS5oLHYgMS4yIDIwMDAvMTAvMzAgMjE6MDE6NDEgZGF2ZW0gRXhwICQgKi8KICNpZm5kZWYgX0FTTVNQQVJDNjRfUEFSQU1fSAogI2RlZmluZSBfQVNNU1BBUkM2NF9QQVJBTV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKwogI2lmZGVmIF9fS0VSTkVMX18KLSMgZGVmaW5lIEhaCQkxMDAwCS8qIEludGVybmFsIGtlcm5lbCB0aW1lciBmcmVxdWVuY3kgKi8KKyMgZGVmaW5lIEhaCQlDT05GSUdfSFoJLyogSW50ZXJuYWwga2VybmVsIHRpbWVyIGZyZXF1ZW5jeSAqLwogIyBkZWZpbmUgVVNFUl9IWgkxMDAJLyogLi4gc29tZSB1c2VyIGludGVyZmFjZXMgYXJlIGluICJ0aWNrcyIgKi8KICMgZGVmaW5lIENMT0NLU19QRVJfU0VDIChVU0VSX0haKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oCmluZGV4IGI3ZTYzNTUuLjU2YjUxOTdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BhcnBvcnQuaApAQCAtMjcsMTIgKzI3LDEyIEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgZW5hYmxlX2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIpCiB7CisJZWJ1c19kbWFfZW5hYmxlKCZzcGFyY19lYnVzX2RtYXNbZG1hbnJdLmluZm8sIDEpOworCiAJaWYgKGVidXNfZG1hX3JlcXVlc3QoJnNwYXJjX2VidXNfZG1hc1tkbWFucl0uaW5mbywKIAkJCSAgICAgc3BhcmNfZWJ1c19kbWFzW2RtYW5yXS5hZGRyLAogCQkJICAgICBzcGFyY19lYnVzX2RtYXNbZG1hbnJdLmNvdW50KSkKIAkJQlVHKCk7Ci0KLQllYnVzX2RtYV9lbmFibGUoJnNwYXJjX2VidXNfZG1hc1tkbWFucl0uaW5mbywgMSk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgZGlzYWJsZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGJtLmgKaW5kZXggNGMxNTYxMC4uMzhiYmJjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oCkBAIC0xNDUsNiArMTQ1LDkgQEAKIAkvKiBQaHlzaWNhbCBhZGRyZXNzIGJhc2Ugb2YgUEJNIHJlZ2lzdGVycy4gKi8KIAl1bnNpZ25lZCBsb25nCQkJcGJtX3JlZ3M7CiAKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIERNQSBzeW5jIHJlZ2lzdGVyLCBpZiBhbnkuICAqLworCXVuc2lnbmVkIGxvbmcJCQlzeW5jX3JlZzsKKwogCS8qIE9wYXF1ZSAzMi1iaXQgc3lzdGVtIGJ1cyBQb3J0IElELiAqLwogCXUzMgkJCQlwb3J0aWQ7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BjaS5oCmluZGV4IDJhMGM4NWMuLmE0YWIwZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wY2kuaApAQCAtMjMsNyArMjMsNyBAQAogCS8qIE5vIHNwZWNpYWwgYnVzIG1hc3RlcmluZyBzZXR1cCBoYW5kbGluZyAqLwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEpCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGludCBpcnEsIGludCBhY3RpdmUpCiB7CiAJLyogV2UgZG9uJ3QgZG8gZHluYW1pYyBQQ0kgSVJRIGFsbG9jYXRpb24gKi8KIH0KQEAgLTIyMCw2ICsyMjAsMjUgQEAKIAlyZXR1cm4gKGRtYV9hZGRyID09IFBDSV9ETUFfRVJST1JfQ09ERSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGNhY2hlbGluZV9zaXplOworCXU4IGJ5dGU7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmYnl0ZSk7CisJaWYgKGJ5dGUgPT0gMCkKKwkJY2FjaGVsaW5lX3NpemUgPSAxMDI0OworCWVsc2UKKwkJY2FjaGVsaW5lX3NpemUgPSAoaW50KSBieXRlICogNDsKKworCSpzdHJhdCA9IFBDSV9ETUFfQlVSU1RfQk9VTkRBUlk7CisJKnN0cmF0ZWd5X3BhcmFtZXRlciA9IGNhY2hlbGluZV9zaXplOworfQorI2VuZGlmCisKIC8qIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIFBDSSBjb250cm9sbGVyIGZvciBkZXZpY2UgUERFVi4gKi8KIAogZXh0ZXJuIGludCBwY2lfZG9tYWluX25yKHN0cnVjdCBwY2lfYnVzICpidXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9yd3NlbS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9yd3NlbS5oCmluZGV4IGJmMmFlOTAuLmExY2M5NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcndzZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3J3c2VtLmgKQEAgLTU1LDggKzU1LDkgQEAKIAkJImFkZAkJJSVnMSwgJTEsICUlZzdcblx0IgogCQkiY2FzCQlbJTJdLCAlJWcxLCAlJWc3XG5cdCIKIAkJImNtcAkJJSVnMSwgJSVnN1xuXHQiCisJCSJtZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuXHQiCiAJCSJibmUscG4JCSUlaWNjLCAxYlxuXHQiCi0JCSIgbWVtYmFyCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuXHQiCisJCSIgbm9wXG5cdCIKIAkJIm1vdgkJJSVnNywgJTBcblx0IgogCQk6ICI9JnIiICh0bXApCiAJCTogIjAiICh0bXApLCAiciIgKHNlbSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2VjY29tcC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zZWNjb21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjZDk5NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2VjY29tcC5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX0FTTV9TRUNDT01QX0gKKworI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+IC8qIGFscmVhZHkgZGVmaW5lcyBUSUZfMzJCSVQgKi8KKworI2lmbmRlZiBUSUZfMzJCSVQKKyNlcnJvciAidW5leHBlY3RlZCBUSUZfMzJCSVQgb24gc3BhcmM2NCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisKKyNkZWZpbmUgX19OUl9zZWNjb21wX3JlYWQgX19OUl9yZWFkCisjZGVmaW5lIF9fTlJfc2VjY29tcF93cml0ZSBfX05SX3dyaXRlCisjZGVmaW5lIF9fTlJfc2VjY29tcF9leGl0IF9fTlJfZXhpdAorI2RlZmluZSBfX05SX3NlY2NvbXBfc2lncmV0dXJuIF9fTlJfcnRfc2lncmV0dXJuCisKKyNkZWZpbmUgX19OUl9zZWNjb21wX3JlYWRfMzIgX19OUl9yZWFkCisjZGVmaW5lIF9fTlJfc2VjY29tcF93cml0ZV8zMiBfX05SX3dyaXRlCisjZGVmaW5lIF9fTlJfc2VjY29tcF9leGl0XzMyIF9fTlJfZXhpdAorI2RlZmluZSBfX05SX3NlY2NvbXBfc2lncmV0dXJuXzMyIF9fTlJfc2lncmV0dXJuCisKKyNlbmRpZiAvKiBfQVNNX1NFQ0NPTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc2lnbmFsLmgKaW5kZXggYmVjZGYxYi4uZTMwNTliYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zaWduYWwuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NpZ25hbC5oCkBAIC0xNjIsMjEgKzE2Miw2IEBACiAjZGVmaW5lIE1JTlNJR1NUS1NaCTQwOTYKICNkZWZpbmUgU0lHU1RLU1oJMTYzODQKIAotI2lmZGVmIF9fS0VSTkVMX18KLS8qCi0gKiBESkhSCi0gKiBTQV9TVEFUSUNfQUxMT0MgaXMgdXNlZCBmb3IgdGhlIFNQQVJDIHN5c3RlbSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMKLSAqIGludGVycnVwdCBoYW5kbGVyJ3MgaXJxIHN0cnVjdHVyZSBzaG91bGQgYmUgc3RhdGljYWxseSBhbGxvY2F0ZWQKLSAqIGJ5IHRoZSByZXF1ZXN0X2lycSByb3V0aW5lLgotICogVGhlIGFsdGVybmF0aXZlIGlzIHRoYXQgYXJjaC9zcGFyYy9rZXJuZWwvaXJxLmMgaGFzIGNhcm5hbCBrbm93bGVkZ2UKLSAqIG9mIGludGVycnVwdCB1c2FnZSBhbmQgdGhhdCBzdWNrcy4gQWxzbyB3aXRob3V0IGEgZmxhZyBsaWtlIHRoaXMKLSAqIGl0IG1heSBiZSBwb3NzaWJsZSBmb3IgdGhlIGZyZWVfaXJxIHJvdXRpbmUgdG8gYXR0ZW1wdCB0byBmcmVlCi0gKiBzdGF0aWNhbGx5IGFsbG9jYXRlZCBkYXRhLi4gd2hpY2ggaXMgTk9UIEdPT0QuCi0gKgotICovCi0jZGVmaW5lIFNBX1NUQVRJQ19BTExPQwkJMHg4MAotI2VuZGlmCi0KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaWduYWwuaD4KIAogc3RydWN0IF9fbmV3X3NpZ2FjdGlvbiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaW5sb2NrLmgKaW5kZXggZGI3NTgxYi4uOWNiOTNhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpbmxvY2suaApAQCAtNTIsMTIgKzUyLDE0IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKICIxOglsZHN0dWIJCVslMV0sICUwXG4iCisiCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJybnoscG4JCSUwLCAyZlxuIgotIgkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJIG5vcFxuIgogIgkuc3Vic2VjdGlvbgkyXG4iCiAiMjoJbGR1YgkJWyUxXSwgJTBcbiIKKyIJbWVtYmFyCQkjTG9hZExvYWRcbiIKICIJYnJueixwdAkJJTAsIDJiXG4iCi0iCSBtZW1iYXIJCSNMb2FkTG9hZFxuIgorIgkgbm9wXG4iCiAiCWJhLGEscHQJCSUleGNjLCAxYlxuIgogIgkucHJldmlvdXMiCiAJOiAiPSZyIiAodG1wKQpAQCAtOTUsMTYgKzk3LDE4IEBACiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKICIxOglsZHN0dWIJCVslMl0sICUwXG4iCi0iCWJybnoscG4JCSUwLCAyZlxuIgogIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgorIglicm56LHBuCQklMCwgMmZcbiIKKyIJIG5vcFxuIgogIgkuc3Vic2VjdGlvbgkyXG4iCiAiMjoJcmRwcgkJJSVwaWwsICUxXG4iCiAiCXdycHIJCSUzLCAlJXBpbFxuIgogIjM6CWxkdWIJCVslMl0sICUwXG4iCi0iCWJybnoscHQJCSUwLCAzYlxuIgogIgltZW1iYXIJCSNMb2FkTG9hZFxuIgorIglicm56LHB0CQklMCwgM2JcbiIKKyIJIG5vcFxuIgogIgliYSxwdAkJJSV4Y2MsIDFiXG4iCi0iCXdycHIJCSUxLCAlJXBpbFxuIgorIgkgd3JwcgkJJTEsICUlcGlsXG4iCiAiCS5wcmV2aW91cyIKIAk6ICI9JnIiICh0bXAxKSwgIj0mciIgKHRtcDIpCiAJOiAiciIobG9jayksICJyIihmbGFncykKQEAgLTE2MiwxMiArMTY2LDE0IEBACiAiNDoJIGFkZAkJJTAsIDEsICUxXG4iCiAiCWNhcwkJWyUyXSwgJTAsICUxXG4iCiAiCWNtcAkJJTAsICUxXG4iCisiCW1lbWJhcgkJI1N0b3JlTG9hZCB8ICNTdG9yZVN0b3JlXG4iCiAiCWJuZSxwbgkJJSVpY2MsIDFiXG4iCi0iCSBtZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgorIgkgbm9wXG4iCiAiCS5zdWJzZWN0aW9uCTJcbiIKICIyOglsZHN3CQlbJTJdLCAlMFxuIgorIgltZW1iYXIJCSNMb2FkTG9hZFxuIgogIglicmx6LHB0CQklMCwgMmJcbiIKLSIJIG1lbWJhcgkJI0xvYWRMb2FkXG4iCisiCSBub3BcbiIKICIJYmEsYSxwdAkJJSV4Y2MsIDRiXG4iCiAiCS5wcmV2aW91cyIKIAk6ICI9JnIiICh0bXAxKSwgIj0mciIgKHRtcDIpCkBAIC0yMDQsMTIgKzIxMCwxNCBAQAogIjQ6CSBvcgkJJTAsICUzLCAlMVxuIgogIgljYXMJCVslMl0sICUwLCAlMVxuIgogIgljbXAJCSUwLCAlMVxuIgorIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibmUscG4JCSUlaWNjLCAxYlxuIgotIgkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJIG5vcFxuIgogIgkuc3Vic2VjdGlvbgkyXG4iCiAiMjoJbGR1dwkJWyUyXSwgJTBcbiIKKyIJbWVtYmFyCQkjTG9hZExvYWRcbiIKICIJYnJueixwdAkJJTAsIDJiXG4iCi0iCSBtZW1iYXIJCSNMb2FkTG9hZFxuIgorIgkgbm9wXG4iCiAiCWJhLGEscHQJCSUleGNjLCA0YlxuIgogIgkucHJldmlvdXMiCiAJOiAiPSZyIiAodG1wMSksICI9JnIiICh0bXAyKQpAQCAtMjQwLDggKzI0OCw5IEBACiAiCSBvcgkJJTAsICU0LCAlMVxuIgogIgljYXMJCVslM10sICUwLCAlMVxuIgogIgljbXAJCSUwLCAlMVxuIgorIgltZW1iYXIJCSNTdG9yZUxvYWQgfCAjU3RvcmVTdG9yZVxuIgogIglibmUscG4JCSUlaWNjLCAxYlxuIgotIgkgbWVtYmFyCQkjU3RvcmVMb2FkIHwgI1N0b3JlU3RvcmVcbiIKKyIJIG5vcFxuIgogIgltb3YJCTEsICUyXG4iCiAiMjoiCiAJOiAiPSZyIiAodG1wMSksICI9JnIiICh0bXAyKSwgIj0mciIgKHJlc3VsdCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpdGZpcmUuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3BpdGZpcmUuaAppbmRleCA5ZDc2MTNlLi4xYWE5MzI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NwaXRmaXJlLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9zcGl0ZmlyZS5oCkBAIC0xMTEsNyArMTExLDYgQEAKIAkJCSAgICAgIm1lbWJhcgkjU3luYyIKIAkJCSAgICAgOiAvKiBObyBvdXRwdXRzICovCiAJCQkgICAgIDogInIiICh0YWcpLCAiciIgKGFkZHIpLCAiaSIgKEFTSV9EQ0FDSEVfVEFHKSk7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZW1iYXIgI1N5bmMiIDogOiA6ICJtZW1vcnkiKTsKIH0KIAogLyogVGhlIGluc3RydWN0aW9uIGNhY2hlIGxpbmVzIGFyZSBmbHVzaGVkIHdpdGggdGhpcywgYnV0IG5vdGUgdGhhdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvc3lzdGVtLmgKaW5kZXggZmQxMmNhMy4uZjliZTJjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3N5c3RlbS5oCkBAIC0xMzksMTkgKzEzOSwxMyBAQAogI2RlZmluZSBmbHVzaF91c2VyX3dpbmRvd3MgZmx1c2h3X3VzZXIKICNkZWZpbmUgZmx1c2hfcmVnaXN0ZXJfd2luZG93cyBmbHVzaHdfYWxsCiAKLSNkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChycSwgbmV4dCkJCVwKLWRvIHsJc3Bpbl9sb2NrKCYobmV4dCktPnN3aXRjaF9sb2NrKTsJXAotCXNwaW5fdW5sb2NrKCYocnEpLT5sb2NrKTsJCVwKKy8qIERvbid0IGhvbGQgdGhlIHJ1bnF1ZXVlIGxvY2sgb3ZlciBjb250ZXh0IHN3aXRjaCAqLworI2RlZmluZSBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVworI2RlZmluZSBwcmVwYXJlX2FyY2hfc3dpdGNoKG5leHQpCQlcCitkbyB7CQkJCQkJXAogCWZsdXNod19hbGwoKTsJCQkJXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocnEsIHByZXYpCQlcCi1kbyB7CXNwaW5fdW5sb2NrX2lycSgmKHByZXYpLT5zd2l0Y2hfbG9jayk7CVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgdGFza19ydW5uaW5nKHJxLCBwKSBcCi0JKChycSktPmN1cnIgPT0gKHApIHx8IHNwaW5faXNfbG9ja2VkKCYocCktPnN3aXRjaF9sb2NrKSkKLQogCS8qIFNlZSB3aGF0IGhhcHBlbnMgd2hlbiB5b3UgZGVzaWduIHRoZSBjaGlwIGNvcnJlY3RseT8KIAkgKgogCSAqIFdlIHRlbGwgZ2NjIHdlIGNsb2JiZXIgYWxsIG5vbi1maXhlZC11c2FnZSByZWdpc3RlcnMgZXhjZXB0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Rlcm1pb3MuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGVybWlvcy5oCmluZGV4IDhlZmZjZTAuLjk3NzdhOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGVybWlvcy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGVybWlvcy5oCkBAIC0xMDAsMTYgKzEwMCwxNyBAQAogI2RlZmluZSB1c2VyX3Rlcm1pb190b19rZXJuZWxfdGVybWlvcyh0ZXJtaW9zLCB0ZXJtaW8pIFwKICh7IFwKIAl1bnNpZ25lZCBzaG9ydCB0bXA7IFwKLQlnZXRfdXNlcih0bXAsICYodGVybWlvKS0+Y19pZmxhZyk7IFwKKwlpbnQgZXJyOyBcCisJZXJyID0gZ2V0X3VzZXIodG1wLCAmKHRlcm1pbyktPmNfaWZsYWcpOyBcCiAJKHRlcm1pb3MpLT5jX2lmbGFnID0gKDB4ZmZmZjAwMDAgJiAoKHRlcm1pb3MpLT5jX2lmbGFnKSkgfCB0bXA7IFwKLQlnZXRfdXNlcih0bXAsICYodGVybWlvKS0+Y19vZmxhZyk7IFwKKwllcnIgfD0gZ2V0X3VzZXIodG1wLCAmKHRlcm1pbyktPmNfb2ZsYWcpOyBcCiAJKHRlcm1pb3MpLT5jX29mbGFnID0gKDB4ZmZmZjAwMDAgJiAoKHRlcm1pb3MpLT5jX29mbGFnKSkgfCB0bXA7IFwKLQlnZXRfdXNlcih0bXAsICYodGVybWlvKS0+Y19jZmxhZyk7IFwKKwllcnIgfD0gZ2V0X3VzZXIodG1wLCAmKHRlcm1pbyktPmNfY2ZsYWcpOyBcCiAJKHRlcm1pb3MpLT5jX2NmbGFnID0gKDB4ZmZmZjAwMDAgJiAoKHRlcm1pb3MpLT5jX2NmbGFnKSkgfCB0bXA7IFwKLQlnZXRfdXNlcih0bXAsICYodGVybWlvKS0+Y19sZmxhZyk7IFwKKwllcnIgfD0gZ2V0X3VzZXIodG1wLCAmKHRlcm1pbyktPmNfbGZsYWcpOyBcCiAJKHRlcm1pb3MpLT5jX2xmbGFnID0gKDB4ZmZmZjAwMDAgJiAoKHRlcm1pb3MpLT5jX2xmbGFnKSkgfCB0bXA7IFwKLQljb3B5X2Zyb21fdXNlcigodGVybWlvcyktPmNfY2MsICh0ZXJtaW8pLT5jX2NjLCBOQ0MpOyBcCi0JMDsgXAorCWVyciB8PSBjb3B5X2Zyb21fdXNlcigodGVybWlvcyktPmNfY2MsICh0ZXJtaW8pLT5jX2NjLCBOQ0MpOyBcCisJZXJyOyBcCiB9KQogCiAvKgpAQCAtMTE5LDUzICsxMjAsNTYgQEAKICAqLwogI2RlZmluZSBrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHRlcm1pb3MpIFwKICh7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfaWZsYWcsICYodGVybWlvKS0+Y19pZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfb2ZsYWcsICYodGVybWlvKS0+Y19vZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfY2ZsYWcsICYodGVybWlvKS0+Y19jZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfbGZsYWcsICYodGVybWlvKS0+Y19sZmxhZyk7IFwKLQlwdXRfdXNlcigodGVybWlvcyktPmNfbGluZSwgICYodGVybWlvKS0+Y19saW5lKTsgXAotCWNvcHlfdG9fdXNlcigodGVybWlvKS0+Y19jYywgKHRlcm1pb3MpLT5jX2NjLCBOQ0MpOyBcCisJaW50IGVycjsgXAorCWVyciAgPSBwdXRfdXNlcigodGVybWlvcyktPmNfaWZsYWcsICYodGVybWlvKS0+Y19pZmxhZyk7IFwKKwllcnIgfD0gcHV0X3VzZXIoKHRlcm1pb3MpLT5jX29mbGFnLCAmKHRlcm1pbyktPmNfb2ZsYWcpOyBcCisJZXJyIHw9IHB1dF91c2VyKCh0ZXJtaW9zKS0+Y19jZmxhZywgJih0ZXJtaW8pLT5jX2NmbGFnKTsgXAorCWVyciB8PSBwdXRfdXNlcigodGVybWlvcyktPmNfbGZsYWcsICYodGVybWlvKS0+Y19sZmxhZyk7IFwKKwllcnIgfD0gcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2xpbmUsICAmKHRlcm1pbyktPmNfbGluZSk7IFwKKwllcnIgfD0gY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKIAlpZiAoISgodGVybWlvcyktPmNfbGZsYWcgJiBJQ0FOT04pKSB7IFwKLQkJcHV0X3VzZXIoKHRlcm1pb3MpLT5jX2NjW1ZNSU5dLCAmKHRlcm1pbyktPmNfY2NbX1ZNSU5dKTsgXAotCQlwdXRfdXNlcigodGVybWlvcyktPmNfY2NbVlRJTUVdLCAmKHRlcm1pbyktPmNfY2NbX1ZUSU1FXSk7IFwKKwkJZXJyIHw9IHB1dF91c2VyKCh0ZXJtaW9zKS0+Y19jY1tWTUlOXSwgJih0ZXJtaW8pLT5jX2NjW19WTUlOXSk7IFwKKwkJZXJyIHw9IHB1dF91c2VyKCh0ZXJtaW9zKS0+Y19jY1tWVElNRV0sICYodGVybWlvKS0+Y19jY1tfVlRJTUVdKTsgXAogCX0gXAotCTA7IFwKKwllcnI7IFwKIH0pCiAKICNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIFwKICh7IFwKLQlnZXRfdXNlcigoayktPmNfaWZsYWcsICYodSktPmNfaWZsYWcpOyBcCi0JZ2V0X3VzZXIoKGspLT5jX29mbGFnLCAmKHUpLT5jX29mbGFnKTsgXAotCWdldF91c2VyKChrKS0+Y19jZmxhZywgJih1KS0+Y19jZmxhZyk7IFwKLQlnZXRfdXNlcigoayktPmNfbGZsYWcsICYodSktPmNfbGZsYWcpOyBcCi0JZ2V0X3VzZXIoKGspLT5jX2xpbmUsICAmKHUpLT5jX2xpbmUpOyBcCi0JY29weV9mcm9tX3VzZXIoKGspLT5jX2NjLCAodSktPmNfY2MsIE5DQ1MpOyBcCisJaW50IGVycjsgXAorCWVyciAgPSBnZXRfdXNlcigoayktPmNfaWZsYWcsICYodSktPmNfaWZsYWcpOyBcCisJZXJyIHw9IGdldF91c2VyKChrKS0+Y19vZmxhZywgJih1KS0+Y19vZmxhZyk7IFwKKwllcnIgfD0gZ2V0X3VzZXIoKGspLT5jX2NmbGFnLCAmKHUpLT5jX2NmbGFnKTsgXAorCWVyciB8PSBnZXRfdXNlcigoayktPmNfbGZsYWcsICYodSktPmNfbGZsYWcpOyBcCisJZXJyIHw9IGdldF91c2VyKChrKS0+Y19saW5lLCAgJih1KS0+Y19saW5lKTsgXAorCWVyciB8PSBjb3B5X2Zyb21fdXNlcigoayktPmNfY2MsICh1KS0+Y19jYywgTkNDUyk7IFwKIAlpZigoayktPmNfbGZsYWcgJiBJQ0FOT04pIHsgXAotCQlnZXRfdXNlcigoayktPmNfY2NbVkVPRl0sICYodSktPmNfY2NbVkVPRl0pOyBcCi0JCWdldF91c2VyKChrKS0+Y19jY1tWRU9MXSwgJih1KS0+Y19jY1tWRU9MXSk7IFwKKwkJZXJyIHw9IGdldF91c2VyKChrKS0+Y19jY1tWRU9GXSwgJih1KS0+Y19jY1tWRU9GXSk7IFwKKwkJZXJyIHw9IGdldF91c2VyKChrKS0+Y19jY1tWRU9MXSwgJih1KS0+Y19jY1tWRU9MXSk7IFwKIAl9IGVsc2UgeyBcCi0JCWdldF91c2VyKChrKS0+Y19jY1tWTUlOXSwgICYodSktPmNfY2NbX1ZNSU5dKTsgXAotCQlnZXRfdXNlcigoayktPmNfY2NbVlRJTUVdLCAmKHUpLT5jX2NjW19WVElNRV0pOyBcCisJCWVyciB8PSBnZXRfdXNlcigoayktPmNfY2NbVk1JTl0sICAmKHUpLT5jX2NjW19WTUlOXSk7IFwKKwkJZXJyIHw9IGdldF91c2VyKChrKS0+Y19jY1tWVElNRV0sICYodSktPmNfY2NbX1ZUSU1FXSk7IFwKIAl9IFwKLQkwOyBcCisJZXJyOyBcCiB9KQogCiAjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBcCiAoeyBcCi0JcHV0X3VzZXIoKGspLT5jX2lmbGFnLCAmKHUpLT5jX2lmbGFnKTsgXAotCXB1dF91c2VyKChrKS0+Y19vZmxhZywgJih1KS0+Y19vZmxhZyk7IFwKLQlwdXRfdXNlcigoayktPmNfY2ZsYWcsICYodSktPmNfY2ZsYWcpOyBcCi0JcHV0X3VzZXIoKGspLT5jX2xmbGFnLCAmKHUpLT5jX2xmbGFnKTsgXAotCXB1dF91c2VyKChrKS0+Y19saW5lLCAmKHUpLT5jX2xpbmUpOyBcCi0JY29weV90b191c2VyKCh1KS0+Y19jYywgKGspLT5jX2NjLCBOQ0NTKTsgXAorCWludCBlcnI7IFwKKwllcnIgID0gcHV0X3VzZXIoKGspLT5jX2lmbGFnLCAmKHUpLT5jX2lmbGFnKTsgXAorCWVyciB8PSBwdXRfdXNlcigoayktPmNfb2ZsYWcsICYodSktPmNfb2ZsYWcpOyBcCisJZXJyIHw9IHB1dF91c2VyKChrKS0+Y19jZmxhZywgJih1KS0+Y19jZmxhZyk7IFwKKwllcnIgfD0gcHV0X3VzZXIoKGspLT5jX2xmbGFnLCAmKHUpLT5jX2xmbGFnKTsgXAorCWVyciB8PSBwdXRfdXNlcigoayktPmNfbGluZSwgJih1KS0+Y19saW5lKTsgXAorCWVyciB8PSBjb3B5X3RvX3VzZXIoKHUpLT5jX2NjLCAoayktPmNfY2MsIE5DQ1MpOyBcCiAJaWYoISgoayktPmNfbGZsYWcgJiBJQ0FOT04pKSB7IFwKLQkJcHV0X3VzZXIoKGspLT5jX2NjW1ZNSU5dLCAgJih1KS0+Y19jY1tfVk1JTl0pOyBcCi0JCXB1dF91c2VyKChrKS0+Y19jY1tWVElNRV0sICYodSktPmNfY2NbX1ZUSU1FXSk7IFwKKwkJZXJyIHw9IHB1dF91c2VyKChrKS0+Y19jY1tWTUlOXSwgICYodSktPmNfY2NbX1ZNSU5dKTsgXAorCQllcnIgfD0gcHV0X3VzZXIoKGspLT5jX2NjW1ZUSU1FXSwgJih1KS0+Y19jY1tfVlRJTUVdKTsgXAogCX0gZWxzZSB7IFwKLQkJcHV0X3VzZXIoKGspLT5jX2NjW1ZFT0ZdLCAmKHUpLT5jX2NjW1ZFT0ZdKTsgXAotCQlwdXRfdXNlcigoayktPmNfY2NbVkVPTF0sICYodSktPmNfY2NbVkVPTF0pOyBcCisJCWVyciB8PSBwdXRfdXNlcigoayktPmNfY2NbVkVPRl0sICYodSktPmNfY2NbVkVPRl0pOyBcCisJCWVyciB8PSBwdXRfdXNlcigoayktPmNfY2NbVkVPTF0sICYodSktPmNfY2NbVkVPTF0pOyBcCiAJfSBcCi0JMDsgXAorCWVycjsgXAogfSkKIAogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdGhyZWFkX2luZm8uaAppbmRleCAwY2Q2NTI5Li5hMWQyNWMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC90aHJlYWRfaW5mby5oCkBAIC0yMjAsOCArMjIwLDggQEAKICNkZWZpbmUgVElGX05FV1NJR05BTFMJCTYJLyogd2FudHMgbmV3LXN0eWxlIHNpZ25hbHMgKi8KICNkZWZpbmUgVElGXzMyQklUCQk3CS8qIDMyLWJpdCBiaW5hcnkgKi8KICNkZWZpbmUgVElGX05FV0NISUxECQk4CS8qIGp1c3Qtc3Bhd25lZCBjaGlsZCBwcm9jZXNzICovCi0vKiBUSUZfKiB2YWx1ZSA5IGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBUSUZfUE9MTElOR19OUkZMQUcJMTAKKyNkZWZpbmUgVElGX1NFQ0NPTVAJCTkJLyogc2VjdXJlIGNvbXB1dGluZyAqLworI2RlZmluZSBUSUZfU1lTQ0FMTF9BVURJVAkxMAkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9TVUNDRVNTCTExCiAvKiBOT1RFOiBUaHJlYWQgZmxhZ3MgPj0gMTIgc2hvdWxkIGJlIG9uZXMgd2UgaGF2ZSBubyBpbnRlcmVzdAogICogICAgICAgaW4gdXNpbmcgaW4gYXNzZW1ibHksIGVsc2Ugd2UgY2FuJ3QgdXNlIHRoZSBtYXNrIGFzCkBAIC0yMjksNiArMjI5LDcgQEAKICAqLwogI2RlZmluZSBUSUZfQUJJX1BFTkRJTkcJCTEyCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTEzCisjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNAogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0yMzksOSArMjQwLDExIEBACiAjZGVmaW5lIF9USUZfTkVXU0lHTkFMUwkJKDE8PFRJRl9ORVdTSUdOQUxTKQogI2RlZmluZSBfVElGXzMyQklUCQkoMTw8VElGXzMyQklUKQogI2RlZmluZSBfVElGX05FV0NISUxECQkoMTw8VElGX05FV0NISUxEKQotI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCi0jZGVmaW5lIF9USUZfQUJJX1BFTkRJTkcJKDE8PFRJRl9BQklfUEVORElORykKKyNkZWZpbmUgX1RJRl9TRUNDT01QCQkoMTw8VElGX1NFQ0NPTVApCisjZGVmaW5lIF9USUZfU1lTQ0FMTF9BVURJVAkoMTw8VElGX1NZU0NBTExfQVVESVQpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9TVUNDRVNTCSgxPDxUSUZfU1lTQ0FMTF9TVUNDRVNTKQorI2RlZmluZSBfVElGX0FCSV9QRU5ESU5HCSgxPDxUSUZfQUJJX1BFTkRJTkcpCisjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKIAogI2RlZmluZSBfVElGX1VTRVJfV09SS19NQVNLCSgoMHhmZiA8PCBUSV9GTEFHX1dTQVZFRF9TSElGVCkgfCBcCiAJCQkJIChfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX1NJR1BFTkRJTkcgfCBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaAppbmRleCA1YjhkY2Y1Li5mNTkxNDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKQEAgLTIxMiw3ICsyMTIsNyBAQAogI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZSAgICAgICAxOTMgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Vwb2xsX2N0bCAgICAgICAgICAxOTQgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQgICAgICAgICAxOTUgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBfX05SX3VsaW1pdCAgICAgICAgICAxOTYgICAgTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBfX05SX2lvcHJpb19zZXQgICAgICAgICAxOTYgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX2dldHBwaWQgICAgICAgICAgICAxOTcgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NpZ2FjdGlvbiAgICAgICAgICAxOTggLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBfX05SX3NnZXRtYXNrICAgICAgICAgICAxOTkgLyogTGludXggU3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjM0LDcgKzIzNCw3IEBACiAjZGVmaW5lIF9fTlJfaXBjICAgICAgICAgICAgICAgIDIxNSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lncmV0dXJuICAgICAgICAgIDIxNiAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfY2xvbmUgICAgICAgICAgICAgIDIxNyAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdCAgICAgIDIxOCAgICBMaW51eCBTcGVjaWZpYyAtIGkzODYgc3BlY2lmaWMsIHVudXNlZCAgICAgICovCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldCAgICAgICAgIDIxOCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfYWRqdGltZXggICAgICAgICAgIDIxOSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfc2lncHJvY21hc2sgICAgICAgIDIyMCAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZSAgICAgIDIyMSAvKiBMaW51eCBTcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tdW0vbW11X2NvbnRleHQuaAppbmRleCA4OWJmZjMxLi4wOTViYjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL21tdV9jb250ZXh0LmgKQEAgLTcsMTkgKzcsMjMgQEAKICNkZWZpbmUgX19VTV9NTVVfQ09OVEVYVF9ICiAKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImNob29zZS1tb2RlLmgiCisjaW5jbHVkZSAidW1fbW11LmgiCiAKICNkZWZpbmUgZ2V0X21tdV9jb250ZXh0KHRhc2spIGRvIDsgd2hpbGUoMCkKICNkZWZpbmUgYWN0aXZhdGVfY29udGV4dCh0c2spIGRvIDsgd2hpbGUoMCkKIAogI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzayxtbSkJZG8geyB9IHdoaWxlICgwKQogCitleHRlcm4gdm9pZCBmb3JjZV9mbHVzaF9hbGwodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpvbGQsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5ldykKIHsKKwlpZiAob2xkICE9IG5ldykKKwkJZm9yY2VfZmx1c2hfYWxsKCk7CiB9CiAKLWV4dGVybiB2b2lkIHN3aXRjaF9tbV9za2FzKGludCBtbV9mZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwgCiAJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewpAQCAtMzAsNyArMzQsNyBAQAogCQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOwogCQlpZihuZXh0ICE9ICZpbml0X21tKQogCQkJQ0hPT1NFX01PREUoKHZvaWQpIDAsIAotCQkJCSAgICBzd2l0Y2hfbW1fc2thcyhuZXh0LT5jb250ZXh0LnNrYXMubW1fZmQpKTsKKwkJCQkgICAgc3dpdGNoX21tX3NrYXMoJm5leHQtPmNvbnRleHQuc2thcy5pZCkpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tdW0vcHRyYWNlLWkzODYuaCBiL2luY2x1ZGUvYXNtLXVtL3B0cmFjZS1pMzg2LmgKaW5kZXggMDQyMjJmMy4uZmU4ODJiOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcHRyYWNlLWkzODYuaAorKysgYi9pbmNsdWRlL2FzbS11bS9wdHJhY2UtaTM4Ni5oCkBAIC0zMiw2ICszMiwxMCBAQAogI2RlZmluZSBQVF9SRUdTX1NZU0NBTExfUkVUKHIpIFBUX1JFR1NfRUFYKHIpCiAjZGVmaW5lIFBUX0ZJWF9FWEVDX1NUQUNLKHNwKSBkbyA7IHdoaWxlKDApCiAKKy8qIENvcGUgd2l0aCBhIGNvbmRpdGlvbmFsIGkzODYgZGVmaW5pdGlvbi4gKi8KKyN1bmRlZiBwcm9maWxlX3BjCisjZGVmaW5lIHByb2ZpbGVfcGMocmVncykgUFRfUkVHU19JUChyZWdzKQorCiAjZGVmaW5lIHVzZXJfbW9kZShyKSBVUFRfSVNfVVNFUigmKHIpLT5yZWdzKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaAppbmRleCBkM2FlZGI3Li40ZGY1ZTcxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdjg1MC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvY2hlY2tzdW0uaApAQCAtMSw4ICsxLDggQEAKIC8qCiAgKiBpbmNsdWRlL2FzbS12ODUwL2NoZWNrc3VtLmggLS0gQ2hlY2tzdW0gb3BzCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMSAgTkVDIENvcnBvcmF0aW9uCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAxICBNaWxlcyBCYWRlciA8bWlsZXNAZ251Lm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwNSAgTkVDIENvcnBvcmF0aW9uCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDUgIE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUub3JnPgogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKICAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKQEAgLTM2LDggKzM2LDggQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGNzdW1fcGFydGlhbF9jb3B5IChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwgaW50IGxlbiwKLQkJCQkgICB1bnNpZ25lZCBzdW0pOworZXh0ZXJuIHVuc2lnbmVkIGNzdW1fcGFydGlhbF9jb3B5IChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCisJCQkJICAgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB1bnNpZ25lZCBzdW0pOwogCiAKIC8qCkBAIC00Niw3ICs0Niw4IEBACiAgKiBoZXJlIGV2ZW4gbW9yZSBpbXBvcnRhbnQgdG8gYWxpZ24gc3JjIGFuZCBkc3Qgb24gYSAzMi1iaXQgKG9yIGV2ZW4KICAqIGJldHRlciA2NC1iaXQpIGJvdW5kYXJ5CiAgKi8KLWV4dGVybiB1bnNpZ25lZCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAorZXh0ZXJuIHVuc2lnbmVkIGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlciAoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAorCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwKIAkJCQkJICAgICBpbnQgbGVuLCB1bnNpZ25lZCBzdW0sCiAJCQkJCSAgICAgaW50ICpjc3VtX2Vycik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvbW11LmggYi9pbmNsdWRlL2FzbS12ODUwL21tdS5oCmluZGV4IGUzMGE1MmIuLjI2Nzc2OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9tbXUuaApAQCAtMSwyMiArMSwxMSBAQAotLyogQ29weXJpZ2h0IChDKSAyMDAyLCBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPiAqLworLyogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDA1LCBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPiAqLwogCiAjaWZuZGVmIF9fVjg1MF9NTVVfSF9fCiAjZGVmaW5lIF9fVjg1MF9NTVVfSF9fCiAKLXN0cnVjdCBtbV9yYmxvY2tfc3RydWN0IHsKLQlpbnQJCXNpemU7Ci0JaW50CQlyZWZjb3VudDsKLQl2b2lkCSprYmxvY2s7Ci19OwotCi1zdHJ1Y3QgbW1fdGJsb2NrX3N0cnVjdCB7Ci0Jc3RydWN0IG1tX3JibG9ja19zdHJ1Y3QJKnJibG9jazsKLQlzdHJ1Y3QgbW1fdGJsb2NrX3N0cnVjdAkqbmV4dDsKLX07Ci0KIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3QgbW1fdGJsb2NrX3N0cnVjdAl0YmxvY2s7Ci0JdW5zaWduZWQgbG9uZwkJCWVuZF9icms7CisJc3RydWN0IHZtX2xpc3Rfc3RydWN0CSp2bWxpc3Q7CisJdW5zaWduZWQgbG9uZwkJZW5kX2JyazsKIH0gbW1fY29udGV4dF90OwogCiAjZW5kaWYgLyogX19WODUwX01NVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvcGNpLmggYi9pbmNsdWRlL2FzbS12ODUwL3BjaS5oCmluZGV4IGU0MTk0MTQuLjhlNzliZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvcGNpLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC9wY2kuaApAQCAtODEsNiArODEsMTYgQEAKIHBjaV9mcmVlX2NvbnNpc3RlbnQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqY3B1X2FkZHIsCiAJCSAgICAgZG1hX2FkZHJfdCBkbWFfYWRkcik7CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAppbmRleCBhNmI0MWI4Li5kYzhjOTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKQEAgLTI4LDYgKzI4LDggQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGFjcGkvcGRjX2ludGVsLmg+CisKICNkZWZpbmUgQ09NUElMRVJfREVQRU5ERU5UX0lOVDY0ICAgbG9uZyBsb25nCiAjZGVmaW5lIENPTVBJTEVSX0RFUEVOREVOVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZwogCkBAIC05OSwxMiArMTAxLDYgQEAKICAgICAgICAgOiI9ciIobl9oaSksICI9ciIobl9sbykgICAgIFwKICAgICAgICAgOiIwIihuX2hpKSwgIjEiKG5fbG8pKQogCi0vKgotICogUmVmZXIgSW50ZWwgQUNQSSBfUERDIHN1cHBvcnQgZG9jdW1lbnQgZm9yIGJpdCBkZWZpbml0aW9ucwotICovCi0jZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX1NNUCAJMHhhCi0jZGVmaW5lIEFDUElfUERDX0VTVF9DQVBBQklMSVRZX01TUgkweDEKLQogI2lmZGVmIENPTkZJR19BQ1BJX0JPT1QKIGV4dGVybiBpbnQgYWNwaV9sYXBpYzsKIGV4dGVybiBpbnQgYWNwaV9pb2FwaWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWMuaAppbmRleCBlNGIxMDE3Li4xNmVjODJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljLmgKQEAgLTc3LDcgKzc3LDcgQEAKIGV4dGVybiBpbnQgZ2V0X21heGx2dCAodm9pZCk7CiBleHRlcm4gdm9pZCBjbGVhcl9sb2NhbF9BUElDICh2b2lkKTsKIGV4dGVybiB2b2lkIGNvbm5lY3RfYnNwX0FQSUMgKHZvaWQpOwotZXh0ZXJuIHZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyAodm9pZCk7CitleHRlcm4gdm9pZCBkaXNjb25uZWN0X2JzcF9BUElDIChpbnQgdmlydF93aXJlX3NldHVwKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfbG9jYWxfQVBJQyAodm9pZCk7CiBleHRlcm4gaW50IHZlcmlmeV9sb2NhbF9BUElDICh2b2lkKTsKIGV4dGVybiB2b2lkIGNhY2hlX0FQSUNfcmVnaXN0ZXJzICh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYXBpY2RlZi5oCmluZGV4IGJmZWJkYjYuLjkzODgwNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWNkZWYuaApAQCAtOTQsNyArOTQsNyBAQAogI2RlZmluZQkJCVNFVF9BUElDX0RFTElWRVJZX01PREUoeCx5KQkoKCh4KSZ+MHg3MDApfCgoeSk8PDgpKQogI2RlZmluZQkJCQlBUElDX01PREVfRklYRUQJCTB4MAogI2RlZmluZQkJCQlBUElDX01PREVfTk1JCQkweDQKLSNkZWZpbmUJCQkJQVBJQ19NT0RFX0VYSU5UCQkweDcKKyNkZWZpbmUJCQkJQVBJQ19NT0RFX0VYVElOVAkweDcKICNkZWZpbmUgCUFQSUNfTFZUMQkweDM2MAogI2RlZmluZQkJQVBJQ19MVlRFUlIJMHgzNzAKICNkZWZpbmUJCUFQSUNfVE1JQ1QJMHgzODAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCmluZGV4IDMyNTczNzQuLmE4YmFiZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaApAQCAtMjE3LDQgKzIxNyw2IEBACiAKIHZvaWQgZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgKHZvaWQgKiBkdW1teSk7CiAKK2V4dGVybiBzcGlubG9ja190IGk4MjU5QV9sb2NrOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pcnEuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pcnEuaAppbmRleCAzYWY1MGIzLi5lYjNiN2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oCkBAIC01Miw0ICs1Miw5IEBACiBzdHJ1Y3QgcHRfcmVnczsKIGludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KK2V4dGVybiB2b2lkIGZpeHVwX2lycXMoY3B1bWFza190IG1hcCk7CisjZW5kaWYKKwogI2VuZGlmIC8qIF9BU01fSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9rZGVidWcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9rZGVidWcuaAppbmRleCA2Mjc3Zjc1Li5iOTAzNDE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQva2RlYnVnLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2tkZWJ1Zy5oCkBAIC0xNCw3ICsxNCw3IEBACiB9OyAKIAogLyogTm90ZSAtIHlvdSBzaG91bGQgbmV2ZXIgdW5yZWdpc3RlciBiZWNhdXNlIHRoYXQgY2FuIHJhY2Ugd2l0aCBOTUlzLgotICAgSWYgeW91IHJlYWxseSB3YW50IHRvIGRvIGl0IGZpcnN0IHVucmVnaXN0ZXIgLSB0aGVuIHN5bmNocm9uaXplX2tlcm5lbCAtIHRoZW4gZnJlZS4gCisgICBJZiB5b3UgcmVhbGx5IHdhbnQgdG8gZG8gaXQgZmlyc3QgdW5yZWdpc3RlciAtIHRoZW4gc3luY2hyb25pemVfc2NoZWQgLSB0aGVuIGZyZWUuCiAgICovCiBpbnQgcmVnaXN0ZXJfZGllX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayAqZGllX2NoYWluOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2tleGVjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQva2V4ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQyZmYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2tleGVjLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfWDg2XzY0X0tFWEVDX0gKKyNkZWZpbmUgX1g4Nl82NF9LRVhFQ19ICisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm90by5oPgorCisvKgorICogS0VYRUNfU09VUkNFX01FTU9SWV9MSU1JVCBtYXhpbXVtIHBhZ2UgZ2V0X2ZyZWVfcGFnZSBjYW4gcmV0dXJuLgorICogSS5lLiBNYXhpbXVtIHBhZ2UgdGhhdCBpcyBtYXBwZWQgZGlyZWN0bHkgaW50byBrZXJuZWwgbWVtb3J5LAorICogYW5kIGttYXAgaXMgbm90IHJlcXVpcmVkLgorICoKKyAqIFNvIGZhciB4ODZfNjQgaXMgbGltaXRlZCB0byA0MCBwaHlzaWNhbCBhZGRyZXNzIGJpdHMuCisgKi8KKworLyogTWF4aW11bSBwaHlzaWNhbCBhZGRyZXNzIHdlIGNhbiB1c2UgcGFnZXMgZnJvbSAqLworI2RlZmluZSBLRVhFQ19TT1VSQ0VfTUVNT1JZX0xJTUlUICAgICAgKDB4RkZGRkZGRkZGRlVMKQorLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiByZWFjaCBpbiBwaHlzaWNhbCBhZGRyZXNzIG1vZGUgKi8KKyNkZWZpbmUgS0VYRUNfREVTVElOQVRJT05fTUVNT1JZX0xJTUlUICgweEZGRkZGRkZGRkZVTCkKKy8qIE1heGltdW0gYWRkcmVzcyB3ZSBjYW4gdXNlIGZvciB0aGUgY29udHJvbCBwYWdlcyAqLworI2RlZmluZSBLRVhFQ19DT05UUk9MX01FTU9SWV9MSU1JVCAgICAgKDB4RkZGRkZGRkZGRlVMKQorCisvKiBBbGxvY2F0ZSBvbmUgcGFnZSBmb3IgdGhlIHBkcCBhbmQgdGhlIHNlY29uZCBmb3IgdGhlIGNvZGUgKi8KKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUgICg0MDk2VUwgKyA0MDk2VUwpCisKKy8qIFRoZSBuYXRpdmUgYXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIEtFWEVDX0FSQ0ggS0VYRUNfQVJDSF9YODZfNjQKKworI2RlZmluZSBNQVhfTk9URV9CWVRFUyAxMDI0Cit0eXBlZGVmIHUzMiBub3RlX2J1Zl90W01BWF9OT1RFX0JZVEVTLzRdOworCitleHRlcm4gbm90ZV9idWZfdCBjcmFzaF9ub3Rlc1tdOworCisjZW5kaWYgLyogX1g4Nl82NF9LRVhFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaAppbmRleCA2MDEzMGY0Li40MzEzMTg3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKQEAgLTY0LDEyICs2NCwxNCBAQAogI2RlZmluZSBfX3BnZCh4KSAoKHBnZF90KSB7ICh4KSB9ICkKICNkZWZpbmUgX19wZ3Byb3QoeCkJKChwZ3Byb3RfdCkgeyAoeCkgfSApCiAKLSNkZWZpbmUgX19TVEFSVF9LRVJORUwJCTB4ZmZmZmZmZmY4MDEwMDAwMFVMCisjZGVmaW5lIF9fUEhZU0lDQUxfU1RBUlQJKCh1bnNpZ25lZCBsb25nKUNPTkZJR19QSFlTSUNBTF9TVEFSVCkKKyNkZWZpbmUgX19TVEFSVF9LRVJORUwJCShfX1NUQVJUX0tFUk5FTF9tYXAgKyBfX1BIWVNJQ0FMX1NUQVJUKQogI2RlZmluZSBfX1NUQVJUX0tFUk5FTF9tYXAJMHhmZmZmZmZmZjgwMDAwMDAwVUwKICNkZWZpbmUgX19QQUdFX09GRlNFVCAgICAgICAgICAgMHhmZmZmODEwMDAwMDAwMDAwVUwKIAogI2Vsc2UKLSNkZWZpbmUgX19TVEFSVF9LRVJORUwJCTB4ZmZmZmZmZmY4MDEwMDAwMAorI2RlZmluZSBfX1BIWVNJQ0FMX1NUQVJUCUNPTkZJR19QSFlTSUNBTF9TVEFSVAorI2RlZmluZSBfX1NUQVJUX0tFUk5FTAkJKF9fU1RBUlRfS0VSTkVMX21hcCArIF9fUEhZU0lDQUxfU1RBUlQpCiAjZGVmaW5lIF9fU1RBUlRfS0VSTkVMX21hcAkweGZmZmZmZmZmODAwMDAwMDAKICNkZWZpbmUgX19QQUdFX09GRlNFVCAgICAgICAgICAgMHhmZmZmODEwMDAwMDAwMDAwCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BjaS5oCmluZGV4IDg3MTI1MjAuLmVlYjMwODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLmgKQEAgLTMzLDcgKzMzLDcgQEAKIGV4dGVybiBpbnQgKCpwY2lfY29uZmlnX3dyaXRlKShpbnQgc2VnLCBpbnQgYnVzLCBpbnQgZGV2LCBpbnQgZm4sIGludCByZWcsIGludCBsZW4sIHUzMiB2YWx1ZSk7CiAKIHZvaWQgcGNpYmlvc19zZXRfbWFzdGVyKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSk7Cit2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKIHN0cnVjdCBpcnFfcm91dGluZ190YWJsZSAqcGNpYmlvc19nZXRfaXJxX3JvdXRpbmdfdGFibGUodm9pZCk7CiBpbnQgcGNpYmlvc19zZXRfaXJxX3JvdXRpbmcoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpbiwgaW50IGlycSk7CiAKQEAgLTEyMyw2ICsxMjMsMTYgQEAKIAlmbHVzaF93cml0ZV9idWZmZXJzKCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUENJCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2RtYV9idXJzdF9hZHZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCWVudW0gcGNpX2RtYV9idXJzdF9zdHJhdGVneSAqc3RyYXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKnN0cmF0ZWd5X3BhcmFtZXRlcikKK3sKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX0lORklOSVRZOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSB+MFVMOworfQorI2VuZGlmCisKICNkZWZpbmUgSEFWRV9QQ0lfTU1BUAogZXh0ZXJuIGludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJICAgICAgIGVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAppbmRleCBmMmYwNzM2Li42YzgxM2ViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaApAQCAtMTUsNiArMTUsMTMgQEAKIGV4dGVybiB2b2lkIGVhcmx5X2lkdF9oYW5kbGVyKHZvaWQpOwogCiBleHRlcm4gdm9pZCBtY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworI2lmZGVmIENPTkZJR19NVFJSCitleHRlcm4gdm9pZCBtdHJyX2FwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtdHJyX2JwX2luaXQodm9pZCk7CisjZWxzZQorI2RlZmluZSBtdHJyX2FwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgbXRycl9icF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKIGV4dGVybiB2b2lkIGluaXRfbWVtb3J5X21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogCiBleHRlcm4gdm9pZCBzeXN0ZW1fY2FsbCh2b2lkKTsgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc2VyaWFsLmgKaW5kZXggZGJhYjIzMi4uZGM3NTJlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zZXJpYWwuaApAQCAtMjIsMTA5ICsyMiw5IEBACiAjZGVmaW5lIFNURF9DT000X0ZMQUdTIEFTWU5DX0JPT1RfQVVUT0NPTkYKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NFUklBTF9NQU5ZX1BPUlRTCi0jZGVmaW5lIEZPVVJQT1JUX0ZMQUdTIEFTWU5DX0ZPVVJQT1JUCi0jZGVmaW5lIEFDQ0VOVF9GTEFHUyAwCi0jZGVmaW5lIEJPQ0FfRkxBR1MgMAotI2RlZmluZSBIVUI2X0ZMQUdTIDAKLSNlbmRpZgotCi0jZGVmaW5lIE1DQV9DT01fRkxBR1MJKFNURF9DT01fRkxBR1N8QVNZTkNfQk9PVF9PTkxZTUNBKQotCi0vKgotICogVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIGFjY2VzcyBtZXRob2RzIGZvciB0aGUgSFVCNiBjYXJkLiBBbGwKLSAqIGFjY2VzcyBpcyB0aHJvdWdoIHR3byBwb3J0cyBmb3IgYWxsIDI0IHBvc3NpYmxlIGNoaXBzLiBUaGUgY2FyZCBpcwotICogc2VsZWN0ZWQgdGhyb3VnaCB0aGUgaGlnaCAyIGJpdHMsIHRoZSBwb3J0IG9uIHRoYXQgY2FyZCB3aXRoIHRoZQotICogIm1pZGRsZSIgMyBiaXRzLCBhbmQgdGhlIHJlZ2lzdGVyIG9uIHRoYXQgcG9ydCB3aXRoIHRoZSBib3R0b20KLSAqIDMgYml0cy4KLSAqCi0gKiBXaGlsZSB0aGUgYWNjZXNzIHBvcnQgYW5kIGludGVycnVwdCBpcyBjb25maWd1cmFibGUsIHRoZSBkZWZhdWx0Ci0gKiBwb3J0IGxvY2F0aW9ucyBhcmUgMHgzMDIgZm9yIHRoZSBwb3J0IGNvbnRyb2wgcmVnaXN0ZXIsIGFuZCAweDMwMwotICogZm9yIHRoZSBkYXRhIHJlYWQvd3JpdGUgcmVnaXN0ZXIuIE5vcm1hbGx5LCB0aGUgaW50ZXJydXB0IGlzIGF0IGlycTMKLSAqIGJ1dCBjYW4gYmUgYW55dGhpbmcgZnJvbSAzIHRvIDcgaW5jbHVzaXZlLiBOb3RlIHRoYXQgdXNpbmcgMyB3aWxsCi0gKiByZXF1aXJlIGRpc2FibGluZyBjb20yLgotICovCi0KLSNkZWZpbmUgQ19QKGNhcmQscG9ydCkgKCgoY2FyZCk8PDZ8KHBvcnQpPDwzKSArIDEpCi0KLSNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RFRk5TCQkJXAorI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAogCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAogCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMSAqLwlcCiAJeyAwLCBCQVNFX0JBVUQsIDB4M0U4LCA0LCBTVERfQ09NX0ZMQUdTIH0sCS8qIHR0eVMyICovCVwKIAl7IDAsIEJBU0VfQkFVRCwgMHgyRTgsIDMsIFNURF9DT000X0ZMQUdTIH0sCS8qIHR0eVMzICovCi0KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUwotI2RlZmluZSBFWFRSQV9TRVJJQUxfUE9SVF9ERUZOUwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxQTAsIDksIEZPVVJQT1JUX0ZMQUdTIH0sIAkvKiB0dHlTNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUE4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUIwLCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MUI4LCA5LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkEwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkE4LCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTOSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkIwLCA1LCBGT1VSUE9SVF9GTEFHUyB9LAkvKiB0dHlTMTAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJCOCwgNSwgRk9VUlBPUlRfRkxBR1MgfSwJLyogdHR5UzExICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMzAsIDQsIEFDQ0VOVF9GTEFHUyB9LAkvKiB0dHlTMTIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMzOCwgNCwgQUNDRU5UX0ZMQUdTIH0sCS8qIHR0eVMxMyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNCAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MDAwLCAwLCAwIH0sCS8qIHR0eVMxNSAoc3BhcmUpICovCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTAwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTYgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEwOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzE3ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMTAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMxOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTE4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMTkgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTMwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjIgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEzOCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzIzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNDAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTQ4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjUgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE1MCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNTgsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMyNyAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTYwLCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMjggKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDE2OCwgMTIsIEJPQ0FfRkxBR1MgfSwJLyogdHR5UzI5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxNzAsIDEyLCBCT0NBX0ZMQUdTIH0sCS8qIHR0eVMzMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTc4LCAxMiwgQk9DQV9GTEFHUyB9LAkvKiB0dHlTMzEgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVFJBX1NFUklBTF9QT1JUX0RFRk5TCi0jZW5kaWYKLQotLyogWW91IGNhbiBoYXZlIHVwIHRvIGZvdXIgSFVCNidzIGluIHRoZSBzeXN0ZW0sIGJ1dCBJJ3ZlIG9ubHkKLSAqIGluY2x1ZGVkIHR3byBjYXJkcyBoZXJlIGZvciBhIHRvdGFsIG9mIHR3ZWx2ZSBwb3J0cy4KLSAqLwotI2lmIChkZWZpbmVkKENPTkZJR19IVUI2KSAmJiBkZWZpbmVkKENPTkZJR19TRVJJQUxfTUFOWV9QT1JUUykpCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMCkgfSwgIC8qIHR0eVMzMiAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCwxKSB9LCAgLyogdHR5UzMzICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDIpIH0sICAvKiB0dHlTMzQgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDAsMykgfSwgIC8qIHR0eVMzNSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMCw0KSB9LCAgLyogdHR5UzM2ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgwLDUpIH0sICAvKiB0dHlTMzcgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMCkgfSwgIC8qIHR0eVMzOCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSwxKSB9LCAgLyogdHR5UzM5ICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDIpIH0sICAvKiB0dHlTNDAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDMwMiwgMywgSFVCNl9GTEFHUywgQ19QKDEsMykgfSwgIC8qIHR0eVM0MSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MzAyLCAzLCBIVUI2X0ZMQUdTLCBDX1AoMSw0KSB9LCAgLyogdHR5UzQyICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzMDIsIDMsIEhVQjZfRkxBR1MsIENfUCgxLDUpIH0sICAvKiB0dHlTNDMgKi8KLSNlbHNlCi0jZGVmaW5lIEhVQjZfU0VSSUFMX1BPUlRfREZOUwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTUNBCi0jZGVmaW5lIE1DQV9TRVJJQUxfUE9SVF9ERk5TCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDMyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDMyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDQyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDQyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDUyMjAsIDMsIE1DQV9DT01fRkxBR1MgfSwJXAotCXsgMCwgQkFTRV9CQVVELCAweDUyMjgsIDMsIE1DQV9DT01fRkxBR1MgfSwKLSNlbHNlCi0jZGVmaW5lIE1DQV9TRVJJQUxfUE9SVF9ERk5TCi0jZW5kaWYKLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQlcCi0JU1REX1NFUklBTF9QT1JUX0RFRk5TCQlcCi0JRVhUUkFfU0VSSUFMX1BPUlRfREVGTlMJCVwKLQlIVUI2X1NFUklBTF9QT1JUX0RGTlMJCVwKLQlNQ0FfU0VSSUFMX1BPUlRfREZOUwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmgKaW5kZXggYTc0MjVhYS4uYWViMWI3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaApAQCAtNDMsNiArNDMsOCBAQAogZXh0ZXJuIHZvaWQgc21wX2FsbG9jX21lbW9yeSh2b2lkKTsKIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNtcF9pbnZhbGlkYXRlX25lZWRlZDsKIGV4dGVybiBpbnQgcGljX21vZGU7CitleHRlcm4gdm9pZCBsb2NrX2lwaV9jYWxsX2xvY2sodm9pZCk7CitleHRlcm4gdm9pZCB1bmxvY2tfaXBpX2NhbGxfbG9jayh2b2lkKTsKIGV4dGVybiBpbnQgc21wX251bV9zaWJsaW5nczsKIGV4dGVybiB2b2lkIHNtcF9mbHVzaF90bGIodm9pZCk7CiBleHRlcm4gdm9pZCBzbXBfbWVzc2FnZV9pcnEoaW50IGNwbCwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC03Nyw2ICs3OSw4IEBACiB9CiAKIGV4dGVybiBpbnQgc2FmZV9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpOworZXh0ZXJuIGludCBfX2NwdV9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpOwogCiAjZW5kaWYgLyogIUFTU0VNQkxZICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zdXNwZW5kLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3VzcGVuZC5oCmluZGV4IGVjNzQ1ODAuLmJiOWY0MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zdXNwZW5kLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3N1c3BlbmQuaApAQCAtMTYsNyArMTYsNyBAQAogc3RydWN0IHNhdmVkX2NvbnRleHQgewogICAJdTE2IGRzLCBlcywgZnMsIGdzLCBzczsKIAl1bnNpZ25lZCBsb25nIGdzX2Jhc2UsIGdzX2tlcm5lbF9iYXNlLCBmc19iYXNlOwotCXVuc2lnbmVkIGxvbmcgY3IwLCBjcjIsIGNyMywgY3I0OworCXVuc2lnbmVkIGxvbmcgY3IwLCBjcjIsIGNyMywgY3I0LCBjcjg7CiAJdTE2IGdkdF9wYWQ7CiAJdTE2IGdkdF9saW1pdDsKIAl1bnNpZ25lZCBsb25nIGdkdF9iYXNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RsYmZsdXNoLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGxiZmx1c2guaAppbmRleCAyZTgxMWFjLi4wNjE3NDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdGxiZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdGxiZmx1c2guaApAQCAtMjIsMTYgKzIyLDE4IEBACiAgKi8KICNkZWZpbmUgX19mbHVzaF90bGJfZ2xvYmFsKCkJCQkJCQlcCiAJZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIHRtcHJlZzsJCQkJCVwKKwkJdW5zaWduZWQgbG9uZyB0bXByZWcsIGNyNCwgY3I0X29yaWc7CQkJXAogCQkJCQkJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKLQkJCSJtb3ZxICUxLCAlJWNyNDsgICMgdHVybiBvZmYgUEdFICAgICBcbiIJXAorCQkJIm1vdnEgJSVjcjQsICUyOyAgIyB0dXJuIG9mZiBQR0UgICAgIFxuIglcCisJCQkibW92cSAlMiwgJTE7ICAgICAgICAgICAgICAgICAgICAgICAgXG4iCVwKKwkJCSJhbmRxICUzLCAlMTsgICAgICAgICAgICAgICAgICAgICAgICBcbiIJXAorCQkJIm1vdnEgJTEsICUlY3I0OyAgICAgICAgICAgICAgICAgICAgIFxuIglcCiAJCQkibW92cSAlJWNyMywgJTA7ICAjIGZsdXNoIFRMQiAgICAgICAgXG4iCVwKIAkJCSJtb3ZxICUwLCAlJWNyMzsgICAgICAgICAgICAgICAgICAgICBcbiIJXAogCQkJIm1vdnEgJTIsICUlY3I0OyAgIyB0dXJuIFBHRSBiYWNrIG9uIFxuIglcCi0JCQk6ICI9JnIiICh0bXByZWcpCQkJCVwKLQkJCTogInIiIChtbXVfY3I0X2ZlYXR1cmVzICYgflg4Nl9DUjRfUEdFKSwJXAotCQkJICAiciIgKG1tdV9jcjRfZmVhdHVyZXMpCQkJXAorCQkJOiAiPSZyIiAodG1wcmVnKSwgIj0mciIgKGNyNCksICI9JnIiIChjcjRfb3JpZykJXAorCQkJOiAiaSIgKH5YODZfQ1I0X1BHRSkJCQkJXAogCQkJOiAibWVtb3J5Iik7CQkJCQlcCiAJfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RvcG9sb2d5LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaAppbmRleCA4Zjc3ZTlmLi5jMWJjM2ZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdG9wb2xvZ3kuaApAQCAtMzksMTIgKzM5LDE2IEBACiAJLmJ1c3lfZmFjdG9yCQk9IDMyLAkJCVwKIAkuaW1iYWxhbmNlX3BjdAkJPSAxMjUsCQkJXAogCS5jYWNoZV9ob3RfdGltZQkJPSAoMTAqMTAwMDAwMCksCQlcCi0JLmNhY2hlX25pY2VfdHJpZXMJPSAxLAkJCVwKKwkuY2FjaGVfbmljZV90cmllcwk9IDIsCQkJXAorCS5idXN5X2lkeAkJPSAzLAkJCVwKKwkuaWRsZV9pZHgJCT0gMiwJCQlcCisJLm5ld2lkbGVfaWR4CQk9IDAsIAkJCVwKKwkud2FrZV9pZHgJCT0gMSwJCQlcCisJLmZvcmtleGVjX2lkeAkJPSAxLAkJCVwKIAkucGVyX2NwdV9nYWluCQk9IDEwMCwJCQlcCiAJLmZsYWdzCQkJPSBTRF9MT0FEX0JBTEFOQ0UJXAotCQkJCXwgU0RfQkFMQU5DRV9ORVdJRExFCVwKKwkJCQl8IFNEX0JBTEFOQ0VfRk9SSwlcCiAJCQkJfCBTRF9CQUxBTkNFX0VYRUMJXAotCQkJCXwgU0RfV0FLRV9JRExFCQlcCiAJCQkJfCBTRF9XQUtFX0JBTEFOQ0UsCVwKIAkubGFzdF9iYWxhbmNlCQk9IGppZmZpZXMsCQlcCiAJLmJhbGFuY2VfaW50ZXJ2YWwJPSAxLAkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaAppbmRleCAzYzlhZjZmLi42NTYwNDM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCkBAIC01NTIsNyArNTUyLDcgQEAKICNkZWZpbmUgX19OUl9tcV9nZXRzZXRhdHRyIAkyNDUKIF9fU1lTQ0FMTChfX05SX21xX2dldHNldGF0dHIsIHN5c19tcV9nZXRzZXRhdHRyKQogI2RlZmluZSBfX05SX2tleGVjX2xvYWQgCTI0NgotX19TWVNDQUxMKF9fTlJfa2V4ZWNfbG9hZCwgc3lzX25pX3N5c2NhbGwpCitfX1NZU0NBTEwoX19OUl9rZXhlY19sb2FkLCBzeXNfa2V4ZWNfbG9hZCkKICNkZWZpbmUgX19OUl93YWl0aWQJCTI0NwogX19TWVNDQUxMKF9fTlJfd2FpdGlkLCBzeXNfd2FpdGlkKQogI2RlZmluZSBfX05SX2FkZF9rZXkJCTI0OApAQCAtNTYxLDggKzU2MSwxMiBAQAogX19TWVNDQUxMKF9fTlJfcmVxdWVzdF9rZXksIHN5c19yZXF1ZXN0X2tleSkKICNkZWZpbmUgX19OUl9rZXljdGwJCTI1MAogX19TWVNDQUxMKF9fTlJfa2V5Y3RsLCBzeXNfa2V5Y3RsKQorI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI1MQorX19TWVNDQUxMKF9fTlJfaW9wcmlvX3NldCwgc3lzX2lvcHJpb19zZXQpCisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjUyCitfX1NZU0NBTEwoX19OUl9pb3ByaW9fZ2V0LCBzeXNfaW9wcmlvX2dldCkKIAotI2RlZmluZSBfX05SX3N5c2NhbGxfbWF4IF9fTlJfa2V5Y3RsCisjZGVmaW5lIF9fTlJfc3lzY2FsbF9tYXggX19OUl9pb3ByaW9fZ2V0CiAjaWZuZGVmIF9fTk9fU1RVQlMKIAogLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC00MDk1ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYS5vdXQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hLm91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTcwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvYS5vdXQuaApAQCAtMCwwICsxLDMzIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2FkZHJzcGFjZS5oCisgKgorICogRHVtbXkgYS5vdXQgZmlsZS4gWHRlbnNhIGRvZXMgbm90IHN1cHBvcnQgdGhlIGEub3V0IGZvcm1hdCwgYnV0IHRoZSBrZXJuZWwKKyAqIHNlZW1zIHRvIGRlcGVuZCBvbiBpdC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0FfT1VUX0gKKyNkZWZpbmUgX1hURU5TQV9BX09VVF9ICisKKy8qIE5vdGU6IHRoZSBrZXJuZWwgbmVlZHMgdGhlIGEub3V0IGRlZmluaXRpb25zLCBldmVuIGlmIG9ubHkgRUxGIGlzIHVzZWQuICovCisKKyNkZWZpbmUgU1RBQ0tfVE9QCVRBU0tfU0laRQorCitzdHJ1Y3QgZXhlYworeworICB1bnNpZ25lZCBsb25nIGFfaW5mbzsKKyAgdW5zaWduZWQgYV90ZXh0OworICB1bnNpZ25lZCBhX2RhdGE7CisgIHVuc2lnbmVkIGFfYnNzOworICB1bnNpZ25lZCBhX3N5bXM7CisgIHVuc2lnbmVkIGFfZW50cnk7CisgIHVuc2lnbmVkIGFfdHJzaXplOworICB1bnNpZ25lZCBhX2Ryc2l6ZTsKK307CisKKyNlbmRpZiAvKiBfWFRFTlNBX0FfT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9hdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzJiY2IzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2F0b21pYy5oCisgKgorICogQXRvbWljIG9wZXJhdGlvbnMgdGhhdCBDIGNhbid0IGd1YXJhbnRlZSB1cy4gIFVzZWZ1bCBmb3IgcmVzb3VyY2UgY291bnRpbmcuLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQVRPTUlDX0gKKyNkZWZpbmUgX1hURU5TQV9BVE9NSUNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisKK3R5cGVkZWYgc3RydWN0IHsgdm9sYXRpbGUgaW50IGNvdW50ZXI7IH0gYXRvbWljX3Q7CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBBVE9NSUNfSU5JVChpKQkoIChhdG9taWNfdCkgeyAoaSkgfSApCisKKy8qCisgKiBUaGlzIFh0ZW5zYSBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHJpZ2h0IG1lY2hhbmlzbQorICogZm9yIGV4Y2x1c2lvbiBpcyBmb3IgbG9ja2luZyBpbnRlcnJ1cHRzIHRvIGxldmVsIDEuCisgKgorICogTG9ja2luZyBpbnRlcnJ1cHRzIGxvb2tzIGxpa2UgdGhpczoKKyAqCisgKiAgICByc2lsIGExNSwgMQorICogICAgPGNvZGU+CisgKiAgICB3c3IgIGExNSwgUFMKKyAqICAgIHJzeW5jCisgKgorICogTm90ZSB0aGF0IGExNSBpcyB1c2VkIGhlcmUgYmVjYXVzZSB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbgorICogZG9uZSBieSB0aGUgY29tcGlsZXIgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGEgd2luZG93IG92ZXJmbG93CisgKiBtYXkgbm90IG9jY3VyIGJldHdlZW4gdGhlIHJzaWwgYW5kIHdzciBpbnN0cnVjdGlvbnMuIEJ5IHVzaW5nCisgKiBhMTUgaW4gdGhlIHJzaWwsIHRoZSBtYWNoaW5lIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gYSBzdGF0ZQorICogd2hlcmUgbm8gcmVnaXN0ZXIgcmVmZXJlbmNlIHdpbGwgY2F1c2UgYW4gb3ZlcmZsb3cuCisgKi8KKworLyoqCisgKiBhdG9taWNfcmVhZCAtIHJlYWQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSByZWFkcyB0aGUgdmFsdWUgb2YgQHYuCisgKi8KKyNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCisKKy8qKgorICogYXRvbWljX3NldCAtIHNldCBhdG9taWMgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiByZXF1aXJlZCB2YWx1ZQorICoKKyAqIEF0b21pY2FsbHkgc2V0cyB0aGUgdmFsdWUgb2YgQHYgdG8gQGkuCisgKi8KKyNkZWZpbmUgYXRvbWljX3NldCh2LGkpCQkoKHYpLT5jb3VudGVyID0gKGkpKQorCisvKioKKyAqIGF0b21pY19hZGQgLSBhZGQgaW50ZWdlciB0byBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdi4KKyAqLworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqIHYpCit7CisgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCisJImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgICBcblx0IgorCSJhZGQgICAgICUwLCAlMCwgJTEgICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCisJIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAoaSksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7Cit9CisKKy8qKgorICogYXRvbWljX3N1YiAtIHN1YnRyYWN0IHRoZSBhdG9taWMgdmFyaWFibGUKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdi4KKyAqLworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBhdG9taWNfc3ViKGludCBpLCBhdG9taWNfdCAqdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwgIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgIFxuXHQiCisJInN1YiAgICAgJTAsICUwLCAlMSAgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICAgXG5cdCIKKwkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgIFxuXHQiCisJInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKQorCTogImEiIChpKSwgImEiICh2KQorCTogImExNSIsICJtZW1vcnkiCisJKTsKK30KKworLyoKKyAqIFdlIHVzZSBhdG9taWNfe2FkZHxzdWJ9X3JldHVybiB0byBkZWZpbmUgb3RoZXIgZnVuY3Rpb25zLgorICovCisKK2V4dGVybiBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQoreworICAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJhZGQgICAgICUwLCAlMCwgJTEgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKQorCTogImEiIChpKSwgImEiICh2KQorCTogImExNSIsICJtZW1vcnkiCisJKTsKKworICAgIHJldHVybiB2dmFsOworfQorCitleHRlcm4gX19pbmxpbmVfXyBpbnQgYXRvbWljX3N1Yl9yZXR1cm4oaW50IGksIGF0b21pY190ICogdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdnZhbDsKKworICAgIF9fYXNtX18gX192b2xhdGlsZV9fKAorCSJyc2lsICAgIGExNSwiX19zdHJpbmdpZnkoTE9DS0xFVkVMKSJcblx0IgorCSJsMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJzdWIgICAgICUwLCAlMCwgJTEgICAgICAgICAgICBcblx0IgorCSJzMzJpICAgICUwLCAlMiwgMCAgICAgICAgICAgICBcblx0IgorCSJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCkKKwk6ICJhIiAoaSksICJhIiAodikKKwk6ICJhMTUiLCAibWVtb3J5IgorCSk7CisKKyAgICByZXR1cm4gdnZhbDsKK30KKworLyoqCisgKiBhdG9taWNfc3ViX2FuZF90ZXN0IC0gc3VidHJhY3QgdmFsdWUgZnJvbSB2YXJpYWJsZSBhbmQgdGVzdCByZXN1bHQKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGkgZnJvbSBAdiBhbmQgcmV0dXJucworICogdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLgorICovCisjZGVmaW5lIGF0b21pY19zdWJfYW5kX3Rlc3QoaSx2KSAoYXRvbWljX3N1Yl9yZXR1cm4oKGkpLCh2KSkgPT0gMCkKKworLyoqCisgKiBhdG9taWNfaW5jIC0gaW5jcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxLgorICovCisjZGVmaW5lIGF0b21pY19pbmModikgYXRvbWljX2FkZCgxLCh2KSkKKworLyoqCisgKiBhdG9taWNfaW5jIC0gaW5jcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAdiBieSAxLgorICovCisjZGVmaW5lIGF0b21pY19pbmNfcmV0dXJuKHYpIGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19kZWMgLSBkZWNyZW1lbnQgYXRvbWljIHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pY190CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEB2IGJ5IDEuCisgKi8KKyNkZWZpbmUgYXRvbWljX2RlYyh2KSBhdG9taWNfc3ViKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19kZWNfcmV0dXJuIC0gZGVjcmVtZW50IGF0b21pYyB2YXJpYWJsZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAdiBieSAxLgorICovCisjZGVmaW5lIGF0b21pY19kZWNfcmV0dXJuKHYpIGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKQorCisvKioKKyAqIGF0b21pY19kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHYgYnkgMSBhbmQKKyAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIDAsIG9yIGZhbHNlIGZvciBhbGwgb3RoZXIKKyAqIGNhc2VzLgorICovCisjZGVmaW5lIGF0b21pY19kZWNfYW5kX3Rlc3QodikgKGF0b21pY19zdWJfcmV0dXJuKDEsKHYpKSA9PSAwKQorCisvKioKKyAqIGF0b21pY19pbmNfYW5kX3Rlc3QgLSBpbmNyZW1lbnQgYW5kIHRlc3QKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHYgYnkgMQorICogYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcmVzdWx0IGlzIHplcm8sIG9yIGZhbHNlIGZvciBhbGwKKyAqIG90aGVyIGNhc2VzLgorICovCisjZGVmaW5lIGF0b21pY19pbmNfYW5kX3Rlc3QodikgKGF0b21pY19hZGRfcmV0dXJuKDEsKHYpKSA9PSAwKQorCisvKioKKyAqIGF0b21pY19hZGRfbmVnYXRpdmUgLSBhZGQgYW5kIHRlc3QgaWYgbmVnYXRpdmUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljX3QKKyAqIEBpOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAaSB0byBAdiBhbmQgcmV0dXJucyB0cnVlCisgKiBpZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLCBvciBmYWxzZSB3aGVuCisgKiByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisgKi8KKyNkZWZpbmUgYXRvbWljX2FkZF9uZWdhdGl2ZShpLHYpIChhdG9taWNfYWRkX3JldHVybigoaSksKHYpKSA8IDApCisKKworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBhdG9taWNfY2xlYXJfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKnYpCit7CisgICAgdW5zaWduZWQgaW50IGFsbF9mID0gLTE7CisgICAgdW5zaWduZWQgaW50IHZ2YWw7CisKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkicnNpbCAgICBhMTUsIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkibDMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkieG9yICAgICAlMSwgJTQsICUzICAgICAgICAgICAgXG5cdCIKKwkiYW5kICAgICAlMCwgJTAsICU0ICAgICAgICAgICAgXG5cdCIKKwkiczMyaSAgICAlMCwgJTIsIDAgICAgICAgICAgICAgXG5cdCIKKwkid3NyICAgICBhMTUsICJfX3N0cmluZ2lmeShQUykiICAgICAgXG5cdCIKKwkicnN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisJOiAiPSZhIiAodnZhbCksICI9YSIgKG1hc2spCisJOiAiYSIgKHYpLCAiYSIgKGFsbF9mKSwgIjEiIChtYXNrKQorCTogImExNSIsICJtZW1vcnkiCisJKTsKK30KKworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQoreworICAgIHVuc2lnbmVkIGludCB2dmFsOworCisgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCisJInJzaWwgICAgYTE1LCJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIlxuXHQiCisJImwzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCisJIm9yICAgICAgJTAsICUwLCAlMSAgICAgICAgICAgIFxuXHQiCisJInMzMmkgICAgJTAsICUyLCAwICAgICAgICAgICAgIFxuXHQiCisJIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiAgICAgICBcblx0IgorCSJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKKwk6ICI9JmEiICh2dmFsKQorCTogImEiIChtYXNrKSwgImEiICh2KQorCTogImExNSIsICJtZW1vcnkiCisJKTsKK30KKworLyogQXRvbWljIG9wZXJhdGlvbnMgYXJlIGFscmVhZHkgc2VyaWFsaXppbmcgKi8KKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKQliYXJyaWVyKCkKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9YVEVOU0FfQVRPTUlDX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2JpdG9wcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2JpdG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTVlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvYml0b3BzLmgKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvYml0b3BzLmgKKyAqCisgKiBBdG9taWMgb3BlcmF0aW9ucyB0aGF0IEMgY2FuJ3QgZ3VhcmFudGVlIHVzLlVzZWZ1bCBmb3IgcmVzb3VyY2UgY291bnRpbmcgZXRjLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQklUT1BTX0gKKyNkZWZpbmUgX1hURU5TQV9CSVRPUFNfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpZmRlZiBDT05GSUdfU01QCisjIGVycm9yIFNNUCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlCisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwl1bnNpZ25lZCBsb25nICphID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyAobnIgPj4gNSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkqYSB8PSBtYXNrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBfX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICogYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCXVuc2lnbmVkIGxvbmcgKmEgPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA1KTsKKworCSphIHw9IG1hc2s7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwl1bnNpZ25lZCBsb25nICphID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyAobnIgPj4gNSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkqYSAmPSB+bWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgX19jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJdW5zaWduZWQgbG9uZyAqYSA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgKG5yID4+IDUpOworCisJKmEgJj0gfm1hc2s7Cit9CisKKy8qCisgKiBjbGVhcl9iaXQoKSBkb2Vzbid0IHByb3ZpZGUgYW55IGJhcnJpZXIgZm9yIHRoZSBjb21waWxlci4KKyAqLworCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfbWJfX2FmdGVyX2NsZWFyX2JpdCgpCWJhcnJpZXIoKQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSAxIDw8IChuciAmIDB4MWYpOworCXVuc2lnbmVkIGxvbmcgKmEgPSAoKHVuc2lnbmVkIGxvbmcgKilhZGRyKSArIChuciA+PiA1KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCSphIF49IG1hc2s7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJdW5zaWduZWQgbG9uZyAqYSA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgKG5yID4+IDUpOworCisJKmEgXj0gbWFzazsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKyAgCXVuc2lnbmVkIGxvbmcgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJdW5zaWduZWQgbG9uZyAqYSA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgKG5yID4+IDUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKKwkqYSB8PSBtYXNrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Rlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3sKKyAgCXVuc2lnbmVkIGxvbmcgcmV0dmFsOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJdW5zaWduZWQgbG9uZyAqYSA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgKG5yID4+IDUpOworCisJcmV0dmFsID0gKG1hc2sgJiAqYSkgIT0gMDsKKwkqYSB8PSBtYXNrOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHRlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworICAJdW5zaWduZWQgbG9uZyByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwl1bnNpZ25lZCBsb25nICphID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyAobnIgPj4gNSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyZXR2YWwgPSAobWFzayAmICphKSAhPSAwOworCSphICY9IH5tYXNrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX3Rlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKG5yICYgMHgxZik7CisJdW5zaWduZWQgbG9uZyAqYSA9ICgodW5zaWduZWQgbG9uZyAqKWFkZHIpICsgKG5yID4+IDUpOworICAJdW5zaWduZWQgbG9uZyBvbGQgPSAqYTsKKworCSphID0gb2xkICYgfm1hc2s7CisJcmV0dXJuIChvbGQgJiBtYXNrKSAhPSAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQoreworICAJdW5zaWduZWQgbG9uZyByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwl1bnNpZ25lZCBsb25nICphID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyAobnIgPj4gNSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJldHZhbCA9IChtYXNrICYgKmEpICE9IDA7CisJKmEgXj0gbWFzazsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogbm9uLWF0b21pYyB2ZXJzaW9uOyBjYW4gYmUgcmVvcmRlcmVkCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAobnIgJiAweDFmKTsKKwl1bnNpZ25lZCBsb25nICphID0gKCh1bnNpZ25lZCBsb25nICopYWRkcikgKyAobnIgPj4gNSk7CisJdW5zaWduZWQgbG9uZyBvbGQgPSAqYTsKKworCSphID0gb2xkIF4gbWFzazsKKwlyZXR1cm4gKG9sZCAmIG1hc2spICE9IDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKmFkZHIpCit7CisJcmV0dXJuIDFVTCAmICgoKGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKWFkZHIpW25yPj41XSA+PiAobnImMzEpKTsKK30KKworI2lmIFhDSEFMX0hBVkVfTlNBVQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgX19jbnRseiAodW5zaWduZWQgbG9uZyB4KQoreworCWludCBsejsKKwlhc20gKCJuc2F1ICUwLCAlMSIgOiAiPXIiIChseikgOiAiciIgKHgpKTsKKwlyZXR1cm4gMzEgLSBsejsKK30KKworI2Vsc2UKKworc3RhdGljIF9faW5saW5lX18gaW50IF9fY250bHogKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwl1bnNpZ25lZCBsb25nIHN1bSwgeDEsIHgyLCB4NCwgeDgsIHgxNjsKKwl4MSAgPSB4ICYgMHhBQUFBQUFBQTsKKwl4MiAgPSB4ICYgMHhDQ0NDQ0NDQzsKKwl4NCAgPSB4ICYgMHhGMEYwRjBGMDsKKwl4OCAgPSB4ICYgMHhGRjAwRkYwMDsKKwl4MTYgPSB4ICYgMHhGRkZGMDAwMDsKKwlzdW0gPSB4MiA/IDIgOiAwOworCXN1bSArPSAoeDE2ICE9IDApICogMTY7CisJc3VtICs9ICh4OCAhPSAwKSAqIDg7CisJc3VtICs9ICh4NCAhPSAwKSAqIDQ7CisJc3VtICs9ICh4MSAhPSAwKTsKKworCXJldHVybiBzdW07Cit9CisKKyNlbmRpZgorCisvKgorICogZmZ6OiBGaW5kIGZpcnN0IHplcm8gaW4gd29yZC4gVW5kZWZpbmVkIGlmIG5vIHplcm8gZXhpc3RzLgorICogYml0IDAgaXMgdGhlIExTQiBvZiBhZGRyOyBiaXQgMzIgaXMgdGhlIExTQiBvZiAoYWRkcisxKS4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgZmZ6KHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlpZiAoKHggPSB+eCkgPT0gMCkKKwkJcmV0dXJuIDMyOworCXJldHVybiBfX2NudGx6KHggJiAteCk7Cit9CisKKy8qCisgKiBfX2ZmczogRmluZCBmaXJzdCBiaXQgc2V0IGluIHdvcmQuIFJldHVybiAwIGZvciBiaXQgMAorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX2Zmcyh1bnNpZ25lZCBsb25nIHgpCit7CisJcmV0dXJuIF9fY250bHooeCAmIC14KTsKK30KKworLyoKKyAqIGZmczogRmluZCBmaXJzdCBiaXQgc2V0IGluIHdvcmQuIFRoaXMgaXMgZGVmaW5lZCB0aGUgc2FtZSB3YXkgYXMKKyAqIHRoZSBsaWJjIGFuZCBjb21waWxlciBidWlsdGluIGZmcyByb3V0aW5lcywgdGhlcmVmb3JlCisgKiBkaWZmZXJzIGluIHNwaXJpdCBmcm9tIHRoZSBhYm92ZSBmZnogKG1hbiBmZnMpLgorICovCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBmZnModW5zaWduZWQgbG9uZyB4KQoreworCXJldHVybiBfX2NudGx6KHggJiAteCkgKyAxOworfQorCisvKgorICogZmxzOiBGaW5kIGxhc3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQgaW4gd29yZC4KKyAqIE5vdGUgZmxzKDApID0gMCwgZmxzKDEpID0gMSwgZmxzKDB4ODAwMDAwMDApID0gMzIuCisgKi8KKworc3RhdGljIF9faW5saW5lX18gaW50IGZscyAodW5zaWduZWQgaW50IHgpCit7CisJcmV0dXJuIF9fY250bHooeCk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAorZmluZF9uZXh0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpwID0gYWRkciArIChvZmZzZXQgPj4gNSk7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSBvZmZzZXQgJiB+MzFVTDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJcmV0dXJuIHNpemU7CisJc2l6ZSAtPSByZXN1bHQ7CisJb2Zmc2V0ICY9IDMxVUw7CisJaWYgKG9mZnNldCkgeworCQl0bXAgPSAqcCsrOworCQl0bXAgJj0gfjBVTCA8PCBvZmZzZXQ7CisJCWlmIChzaXplIDwgMzIpCisJCQlnb3RvIGZvdW5kX2ZpcnN0OworCQlpZiAodG1wKQorCQkJZ290byBmb3VuZF9taWRkbGU7CisJCXNpemUgLT0gMzI7CisJCXJlc3VsdCArPSAzMjsKKwl9CisJd2hpbGUgKHNpemUgPj0gMzIpIHsKKwkJaWYgKCh0bXAgPSAqcCsrKSAhPSAwKQorCQkJZ290byBmb3VuZF9taWRkbGU7CisJCXJlc3VsdCArPSAzMjsKKwkJc2l6ZSAtPSAzMjsKKwl9CisJaWYgKCFzaXplKQorCQlyZXR1cm4gcmVzdWx0OworCXRtcCA9ICpwOworCitmb3VuZF9maXJzdDoKKwl0bXAgJj0gfjBVTCA+PiAoMzIgLSBzaXplKTsKKwlpZiAodG1wID09IDBVTCkJLyogQXJlIGFueSBiaXRzIHNldD8gKi8KKwkJcmV0dXJuIHJlc3VsdCArIHNpemU7CS8qIE5vcGUuICovCitmb3VuZF9taWRkbGU6CisJcmV0dXJuIHJlc3VsdCArIF9fZmZzKHRtcCk7Cit9CisKKy8qKgorICogZmluZF9maXJzdF9iaXQgLSBmaW5kIHRoZSBmaXJzdCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbgorICogQGFkZHI6IFRoZSBhZGRyZXNzIHRvIHN0YXJ0IHRoZSBzZWFyY2ggYXQKKyAqIEBzaXplOiBUaGUgbWF4aW11bSBzaXplIHRvIHNlYXJjaAorICoKKyAqIFJldHVybnMgdGhlIGJpdC1udW1iZXIgb2YgdGhlIGZpcnN0IHNldCBiaXQsIG5vdCB0aGUgbnVtYmVyIG9mIHRoZSBieXRlCisgKiBjb250YWluaW5nIGEgYml0LgorICovCisKKyNkZWZpbmUgZmluZF9maXJzdF9iaXQoYWRkciwgc2l6ZSkgXAorICAgICAgICBmaW5kX25leHRfYml0KChhZGRyKSwgKHNpemUpLCAwKQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2ZpbmRfbmV4dF96ZXJvX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpwID0gYWRkciArIChvZmZzZXQgPj4gNSk7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSBvZmZzZXQgJiB+MzFVTDsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJcmV0dXJuIHNpemU7CisJc2l6ZSAtPSByZXN1bHQ7CisJb2Zmc2V0ICY9IDMxVUw7CisJaWYgKG9mZnNldCkgeworCQl0bXAgPSAqcCsrOworCQl0bXAgfD0gfjBVTCA+PiAoMzItb2Zmc2V0KTsKKwkJaWYgKHNpemUgPCAzMikKKwkJCWdvdG8gZm91bmRfZmlyc3Q7CisJCWlmICh+dG1wKQorCQkJZ290byBmb3VuZF9taWRkbGU7CisJCXNpemUgLT0gMzI7CisJCXJlc3VsdCArPSAzMjsKKwl9CisJd2hpbGUgKHNpemUgJiB+MzFVTCkgeworCQlpZiAofih0bXAgPSAqcCsrKSkKKwkJCWdvdG8gZm91bmRfbWlkZGxlOworCQlyZXN1bHQgKz0gMzI7CisJCXNpemUgLT0gMzI7CisJfQorCWlmICghc2l6ZSkKKwkJcmV0dXJuIHJlc3VsdDsKKwl0bXAgPSAqcDsKKworZm91bmRfZmlyc3Q6CisJdG1wIHw9IH4wVUwgPDwgc2l6ZTsKK2ZvdW5kX21pZGRsZToKKwlyZXR1cm4gcmVzdWx0ICsgZmZ6KHRtcCk7Cit9CisKKyNkZWZpbmUgZmluZF9maXJzdF96ZXJvX2JpdChhZGRyLCBzaXplKSBcCisgICAgICAgIGZpbmRfbmV4dF96ZXJvX2JpdCgoYWRkciksIChzaXplKSwgMCkKKworI2lmZGVmIF9fWFRFTlNBX0VMX18KKyMgZGVmaW5lIGV4dDJfc2V0X2JpdChucixhZGRyKSBfX3Rlc3RfYW5kX3NldF9iaXQoKG5yKSwgKGFkZHIpKQorIyBkZWZpbmUgZXh0Ml9zZXRfYml0X2F0b21pYyhsb2NrLG5yLGFkZHIpIHRlc3RfYW5kX3NldF9iaXQoKG5yKSwoYWRkcikpCisjIGRlZmluZSBleHQyX2NsZWFyX2JpdChucixhZGRyKSBfX3Rlc3RfYW5kX2NsZWFyX2JpdCgobnIpLCAoYWRkcikpCisjIGRlZmluZSBleHQyX2NsZWFyX2JpdF9hdG9taWMobG9jayxucixhZGRyKSB0ZXN0X2FuZF9jbGVhcl9iaXQoKG5yKSwoYWRkcikpCisjIGRlZmluZSBleHQyX3Rlc3RfYml0KG5yLGFkZHIpIHRlc3RfYml0KChuciksIChhZGRyKSkKKyMgZGVmaW5lIGV4dDJfZmluZF9maXJzdF96ZXJvX2JpdChhZGRyLCBzaXplKSBmaW5kX2ZpcnN0X3plcm9fYml0KChhZGRyKSwoc2l6ZSkpCisjIGRlZmluZSBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdChhZGRyLCBzaXplLCBvZmZzZXQpIFwKKyAgICAgICAgICAgICAgICBmaW5kX25leHRfemVyb19iaXQoKGFkZHIpLCAoc2l6ZSksIChvZmZzZXQpKQorI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FQl9fKQorIyBkZWZpbmUgZXh0Ml9zZXRfYml0KG5yLGFkZHIpIF9fdGVzdF9hbmRfc2V0X2JpdCgobnIpIF4gMHgxOCwgKGFkZHIpKQorIyBkZWZpbmUgZXh0Ml9zZXRfYml0X2F0b21pYyhsb2NrLG5yLGFkZHIpIHRlc3RfYW5kX3NldF9iaXQoKG5yKSBeIDB4MTgsIChhZGRyKSkKKyMgZGVmaW5lIGV4dDJfY2xlYXJfYml0KG5yLGFkZHIpIF9fdGVzdF9hbmRfY2xlYXJfYml0KChucikgXiAxOCwgKGFkZHIpKQorIyBkZWZpbmUgZXh0Ml9jbGVhcl9iaXRfYXRvbWljKGxvY2ssbnIsYWRkcikgdGVzdF9hbmRfY2xlYXJfYml0KChucileMHgxOCwoYWRkcikpCisjIGRlZmluZSBleHQyX3Rlc3RfYml0KG5yLGFkZHIpIHRlc3RfYml0KChucikgXiAweDE4LCAoYWRkcikpCisjIGRlZmluZSBleHQyX2ZpbmRfZmlyc3RfemVyb19iaXQoYWRkciwgc2l6ZSkgXAorICAgICAgICBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdCgoYWRkciksIChzaXplKSwgMCkKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdCh2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSAoKHVuc2lnbmVkIGxvbmcgKikgYWRkcikgKyAob2Zmc2V0ID4+IDUpOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gb2Zmc2V0ICYgfjMxVUw7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAob2Zmc2V0ID49IHNpemUpCisJCXJldHVybiBzaXplOworCXNpemUgLT0gcmVzdWx0OworCW9mZnNldCAmPSAzMVVMOworCWlmKG9mZnNldCkgeworCQkvKiBXZSBob2xkIHRoZSBsaXR0bGUgZW5kaWFuIHZhbHVlIGluIHRtcCwgYnV0IHRoZW4gdGhlCisJCSAqIHNoaWZ0IGlzIGlsbGVnYWwuIFNvIHdlIGNvdWxkIGtlZXAgYSBiaWcgZW5kaWFuIHZhbHVlCisJCSAqIGluIHRtcCwgbGlrZSB0aGlzOgorCQkgKgorCQkgKiB0bXAgPSBfX3N3YWIzMigqKHArKykpOworCQkgKiB0bXAgfD0gfjBVTCA+PiAoMzItb2Zmc2V0KTsKKwkJICoKKwkJICogYnV0IHRoaXMgd291bGQgZGVjcmVhc2UgcHJlZm9ybWFuY2UsIHNvIHdlIGNoYW5nZSB0aGUKKwkJICogc2hpZnQ6CisJCSAqLworCQl0bXAgPSAqKHArKyk7CisJCXRtcCB8PSBfX3N3YWIzMih+MFVMID4+ICgzMi1vZmZzZXQpKTsKKwkJaWYoc2l6ZSA8IDMyKQorCQkJZ290byBmb3VuZF9maXJzdDsKKwkJaWYofnRtcCkKKwkJCWdvdG8gZm91bmRfbWlkZGxlOworCQlzaXplIC09IDMyOworCQlyZXN1bHQgKz0gMzI7CisJfQorCXdoaWxlKHNpemUgJiB+MzFVTCkgeworCQlpZih+KHRtcCA9ICoocCsrKSkpCisJCQlnb3RvIGZvdW5kX21pZGRsZTsKKwkJcmVzdWx0ICs9IDMyOworCQlzaXplIC09IDMyOworCX0KKwlpZighc2l6ZSkKKwkJcmV0dXJuIHJlc3VsdDsKKwl0bXAgPSAqcDsKKworZm91bmRfZmlyc3Q6CisJLyogdG1wIGlzIGxpdHRsZSBlbmRpYW4sIHNvIHdlIHdvdWxkIGhhdmUgdG8gc3dhYiB0aGUgc2hpZnQsCisJICogc2VlIGFib3ZlLiBCdXQgdGhlbiB3ZSBoYXZlIHRvIHN3YWIgdG1wIGJlbG93IGZvciBmZnosIHNvCisJICogd2UgbWlnaHQgYXMgd2VsbCBkbyB0aGlzIGhlcmUuCisJICovCisJcmV0dXJuIHJlc3VsdCArIGZmeihfX3N3YWIzMih0bXApIHwgKH4wVUwgPDwgc2l6ZSkpOworZm91bmRfbWlkZGxlOgorCXJldHVybiByZXN1bHQgKyBmZnooX19zd2FiMzIodG1wKSk7Cit9CisKKyNlbHNlCisjIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKKyNlbmRpZgorCisKKyNkZWZpbmUgaHdlaWdodDMyKHgpCWdlbmVyaWNfaHdlaWdodDMyKHgpCisjZGVmaW5lIGh3ZWlnaHQxNih4KQlnZW5lcmljX2h3ZWlnaHQxNih4KQorI2RlZmluZSBod2VpZ2h0OCh4KQlnZW5lcmljX2h3ZWlnaHQ4KHgpCisKKy8qCisgKiBGaW5kIHRoZSBmaXJzdCBiaXQgc2V0IGluIGEgMTQwLWJpdCBiaXRtYXAuCisgKiBUaGUgZmlyc3QgMTAwIGJpdHMgYXJlIHVubGlrZWx5IHRvIGJlIHNldC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBzY2hlZF9maW5kX2ZpcnN0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICpiKQoreworCWlmICh1bmxpa2VseShiWzBdKSkKKwkJcmV0dXJuIF9fZmZzKGJbMF0pOworCWlmICh1bmxpa2VseShiWzFdKSkKKwkJcmV0dXJuIF9fZmZzKGJbMV0pICsgMzI7CisJaWYgKHVubGlrZWx5KGJbMl0pKQorCQlyZXR1cm4gX19mZnMoYlsyXSkgKyA2NDsKKwlpZiAoYlszXSkKKwkJcmV0dXJuIF9fZmZzKGJbM10pICsgOTY7CisJcmV0dXJuIF9fZmZzKGJbNF0pICsgMTI4OworfQorCisKKy8qIEJpdG1hcCBmdW5jdGlvbnMgZm9yIHRoZSBtaW5peCBmaWxlc3lzdGVtLiAgKi8KKworI2RlZmluZSBtaW5peF90ZXN0X2FuZF9zZXRfYml0KG5yLGFkZHIpIHRlc3RfYW5kX3NldF9iaXQobnIsYWRkcikKKyNkZWZpbmUgbWluaXhfc2V0X2JpdChucixhZGRyKSBzZXRfYml0KG5yLGFkZHIpCisjZGVmaW5lIG1pbml4X3Rlc3RfYW5kX2NsZWFyX2JpdChucixhZGRyKSB0ZXN0X2FuZF9jbGVhcl9iaXQobnIsYWRkcikKKyNkZWZpbmUgbWluaXhfdGVzdF9iaXQobnIsYWRkcikgdGVzdF9iaXQobnIsYWRkcikKKyNkZWZpbmUgbWluaXhfZmluZF9maXJzdF96ZXJvX2JpdChhZGRyLHNpemUpIGZpbmRfZmlyc3RfemVyb19iaXQoYWRkcixzaXplKQorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX1hURU5TQV9CSVRPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2Jvb3RwYXJhbS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2Jvb3RwYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ODNmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvYm9vdHBhcmFtLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9ib290cGFyYW0uaAorICoKKyAqIERlZmluaXRpb24gb2YgdGhlIExpbnV4L1h0ZW5zYSBib290IHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1ICBUZW5zaWxpY2EgSW5jLgorICoKKyAqIChDb25jZXB0IGJvcnJvd2VkIGZyb20gdGhlIDY4SyBwb3J0KQorICovCisKKyNpZm5kZWYgX1hURU5TQV9CT09UUEFSQU1fSAorI2RlZmluZSBfWFRFTlNBX0JPT1RQQVJBTV9ICisKKyNkZWZpbmUgQlBfVkVSU0lPTiAweDAwMDEKKworI2RlZmluZSBCUF9UQUdfQ09NTUFORF9MSU5FCTB4MTAwMQkvKiBjb21tYW5kIGxpbmUgKDAtdGVybWluYXRlZCBzdHJpbmcpKi8KKyNkZWZpbmUgQlBfVEFHX0lOSVRSRAkJMHgxMDAyCS8qIHJhbWRpc2sgYWRkciBhbmQgc2l6ZSAoYnBfbWVtaW5mbykgKi8KKyNkZWZpbmUgQlBfVEFHX01FTU9SWQkJMHgxMDAzCS8qIG1lbW9yeSBhZGRyIGFuZCBzaXplIChicF9tZW1pbmZvKSAqLworI2RlZmluZSBCUF9UQUdfU0VSSUFMX0JBVVNSQVRFCTB4MTAwNAkvKiBiYXVkIHJhdGUgb2YgY3VycmVudCBjb25zb2xlLiAqLworI2RlZmluZSBCUF9UQUdfU0VSSUFMX1BPUlQJMHgxMDA1CS8qIHNlcmlhbCBkZXZpY2Ugb2YgY3VycmVudCBjb25zb2xlICovCisKKyNkZWZpbmUgQlBfVEFHX0ZJUlNUCQkweDdCMEIgIC8qIGZpcnN0IHRhZyB3aXRoIGEgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgQlBfVEFHX0xBU1QgCQkweDdFMEIJLyogbGFzdCB0YWcgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogQWxsIHJlY29yZHMgYXJlIGFsaWduZWQgdG8gNCBieXRlcyAqLworCit0eXBlZGVmIHN0cnVjdCBicF90YWcgeworICB1bnNpZ25lZCBzaG9ydCBpZDsJCS8qIHRhZyBpZCAqLworICB1bnNpZ25lZCBzaG9ydCBzaXplOwkJLyogc2l6ZSBvZiB0aGlzIHJlY29yZCBleGNsdWRpbmcgdGhlIHN0cnVjdHVyZSovCisgIHVuc2lnbmVkIGxvbmcgZGF0YVswXTsJLyogZGF0YSAqLworfSBicF90YWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgbWVtaW5mbyB7CisgIHVuc2lnbmVkIGxvbmcgdHlwZTsKKyAgdW5zaWduZWQgbG9uZyBzdGFydDsKKyAgdW5zaWduZWQgbG9uZyBlbmQ7Cit9IG1lbWluZm9fdDsKKworI2RlZmluZSBTWVNNRU1fQkFOS1NfTUFYIDUKKworI2RlZmluZSBNRU1PUllfVFlQRV9DT05WRU5USU9OQUwJMHgxMDAwCisjZGVmaW5lIE1FTU9SWV9UWVBFX05PTkUJCTB4MjAwMAorCit0eXBlZGVmIHN0cnVjdCBzeXNtZW1faW5mbyB7CisgIGludCBucl9iYW5rczsKKyAgbWVtaW5mb190IGJhbmtbU1lTTUVNX0JBTktTX01BWF07Cit9IHN5c21lbV9pbmZvX3Q7CisKK2V4dGVybiBzeXNtZW1faW5mb190IHN5c21lbTsKKworI2VuZGlmCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWcuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjcwMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2J1Zy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvYnVnLmgKKyAqCisgKiBNYWNyb3MgdG8gY2F1c2UgYSAnYnVnJyBtZXNzYWdlLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQlVHX0gKKyNkZWZpbmUgX1hURU5TQV9CVUdfSAorCisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisKKyNkZWZpbmUgSUxMCV9fYXNtX18gX192b2xhdGlsZV9fICgiLmJ5dGUgMCwwLDBcbiIpCisKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKyMgZGVmaW5lIEJVRygpIGRvIHsJCQkJCQkJXAorCXByaW50aygia2VybmVsIEJVRyBhdCAlczolZCFcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CQlcCisJSUxMOwkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBCVUcoKSBkbyB7CQkJCQkJCVwKKwlwcmludGsoImtlcm5lbCBCVUchXG4iKTsJCQkJCVwKKyAgICAgIAlJTEw7CQkJCQkJCQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgQlVHX09OKGNvbmRpdGlvbikgZG8geyBpZiAodW5saWtlbHkoKGNvbmRpdGlvbikhPTApKSBCVUcoKTsgfSB3aGlsZSgwKQorI2RlZmluZSBQQUdFX0JVRyhwYWdlKSBkbyB7ICBCVUcoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgV0FSTl9PTihjb25kaXRpb24pIGRvIHsJCQkJCQkgICBcCisgIGlmICh1bmxpa2VseSgoY29uZGl0aW9uKSE9MCkpIHsJCQkJCSAgIFwKKyAgICBwcmludGsgKCJXYXJuaW5nIGluICVzIGF0ICVzOiVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgIGR1bXBfc3RhY2soKTsJCQkJCQkJICAgXAorICB9CQkJCQkJCQkJICAgXAorfSB3aGlsZSAoMCkKKworI2VuZGlmCS8qIF9YVEVOU0FfQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9idWdzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjI4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvYnVncy5oCisgKgorICogVGhpcyBpcyBpbmNsdWRlZCBieSBpbml0L21haW4uYyB0byBjaGVjayBmb3IgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBidWdzLgorICoKKyAqIFh0ZW5zYSBwcm9jZXNzb3JzIGRvbid0IGhhdmUgYW55IGJ1Z3MuICA6KQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9CVUdTX0gKKyNkZWZpbmUgX1hURU5TQV9CVUdTX0gKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworc3RhdGljIHZvaWQgX19pbml0IGNoZWNrX2J1Z3Modm9pZCkKK3sKK30KKworI2VuZGlmIC8qIF9YVEVOU0FfQlVHU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxNTUyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9ieXRlb3JkZXIuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2J5dGVvcmRlci5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9CWVRFT1JERVJfSAorI2RlZmluZSBfWFRFTlNBX0JZVEVPUkRFUl9ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKK3N0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UzMiBfX19hcmNoX19zd2FiMzIoX191MzIgeCkKK3sKKyAgICBfX3UzMiByZXM7CisgICAgLyogaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZnJvbSBYdGVuc2EgSVNBIHJlbGVhc2UgMi8yMDAwICovCisgICAgX19hc21fXygic3NhaSAgICAgOCAgICAgICAgICAgXG5cdCIKKwkgICAgInNybGkgICAgICUwLCAlMSwgMTYgIFxuXHQiCisJICAgICJzcmMgICAgICAlMCwgJTAsICUxICBcblx0IgorCSAgICAic3JjICAgICAgJTAsICUwLCAlMCAgXG5cdCIKKwkgICAgInNyYyAgICAgICUwLCAlMSwgJTAgIFxuIgorCSAgICA6ICI9JmEiIChyZXMpCisJICAgIDogImEiICh4KQorCSAgICApOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIF9fY29uc3RfXyBfX3UxNiBfX19hcmNoX19zd2FiMTYoX191MTYgeCkKK3sKKyAgICAvKiBHaXZlbiB0aGF0ICdzaG9ydCcgdmFsdWVzIGFyZSBzaWduZWQgKGkuZS4sIGNhbiBiZSBuZWdhdGl2ZSksCisgICAgICogd2UgY2Fubm90IGFzc3VtZSB0aGF0IHRoZSB1cHBlciAxNi1iaXRzIG9mIHRoZSByZWdpc3RlciBhcmUKKyAgICAgKiB6ZXJvLiAgV2UgYXJlIGNhcmVmdWwgdG8gbWFzayB2YWx1ZXMgYWZ0ZXIgc2hpZnRpbmcuCisgICAgICovCisKKyAgICAvKiBUaGVyZSBleGlzdHMgYW4gYW5vbWFseSBiZXR3ZWVuIHh0LWdjYyBhbmQgeHQteGNjLiAgeHQtZ2NjCisgICAgICogaW5zZXJ0cyBhbiBleHR1aSBpbnN0cnVjdGlvbiBhZnRlciBwdXR0aW5nIHRoaXMgZnVuY3Rpb24gaW5saW5lCisgICAgICogdG8gZW5zdXJlIHRoYXQgaXQgdXNlcyBvbmx5IHRoZSBsZWFzdC1zaWduaWZpY2FudCAxNiBiaXRzIG9mCisgICAgICogdGhlIHJlc3VsdC4gIHh0LXhjYyBkb2Vzbid0IHVzZSBhbiBleHR1aSwgYnV0IGFzc3VtZXMgdGhlCisgICAgICogX19hc21fXyBtYWNybyBmb2xsb3dzIGNvbnZlbnRpb24gdGhhdCB0aGUgdXBwZXIgMTYgYml0cyBvZiBhbgorICAgICAqICd1bnNpZ25lZCBzaG9ydCcgcmVzdWx0IGFyZSBzdGlsbCB6ZXJvLiAgVGhpcyBtYWNybyBkb2Vzbid0CisgICAgICogZm9sbG93IGNvbnZlbnRpb247IGluZGVlZCwgaXQgbGVhdmVzIGdhcmJhZ2UgaW4gdGhlIHVwcG9ydCAxNgorICAgICAqIGJpdHMgb2YgdGhlIHJlZ2lzdGVyLgorCisgICAgICogRGVjbGFyaW5nIHRoZSB0ZW1wb3JhcnkgdmFyaWFibGVzICdyZXMnIGFuZCAndG1wJyB0byBiZSAzMi1iaXQKKyAgICAgKiB0eXBlcyB3aGlsZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uIGlzIGEgMTYtYml0IHR5cGUKKyAgICAgKiBmb3JjZXMgYm90aCBjb21waWxlcnMgdG8gaW5zZXJ0IGV4YWN0bHkgb25lIGV4dHVpIGluc3RydWN0aW9uCisgICAgICogKG9yIGVxdWl2YWxlbnQpIHRvIG1hc2sgb2ZmIHRoZSB1cHBlciAxNiBiaXRzLiAqLworCisgICAgX191MzIgcmVzOworICAgIF9fdTMyIHRtcDsKKworICAgIF9fYXNtX18oImV4dHVpICAgICUxLCAlMiwgOCwgOFxuXHQiCisJICAgICJzbGxpICAgICAlMCwgJTIsIDggICBcblx0IgorCSAgICAib3IgICAgICAgJTAsICUwLCAlMSAgXG4iCisJICAgIDogIj0mYSIgKHJlcyksICI9JmEiICh0bXApCisJICAgIDogImEiICh4KQorCSAgICApOworCisgICAgcmV0dXJuIHJlczsKK30KKworI2RlZmluZSBfX2FyY2hfX3N3YWIzMih4KSBfX19hcmNoX19zd2FiMzIoeCkKKyNkZWZpbmUgX19hcmNoX19zd2FiMTYoeCkgX19fYXJjaF9fc3dhYjE2KHgpCisKKyNpZiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IGRlZmluZWQoX19LRVJORUxfXykKKyMgIGRlZmluZSBfX0JZVEVPUkRFUl9IQVNfVTY0X18KKyMgIGRlZmluZSBfX1NXQUJfNjRfVEhSVV8zMl9fCisjZW5kaWYKKworI2lmZGVmIF9fWFRFTlNBX0VMX18KKyMgaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2xpdHRsZV9lbmRpYW4uaD4KKyNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKKyMgaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2JpZ19lbmRpYW4uaD4KKyNlbHNlCisjIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKKyNlbmRpZgorCisjZW5kaWYgLyogX19BU01fWFRFTlNBX0JZVEVPUkRFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlZmx1c2guaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQ0FDSEVfSAorI2RlZmluZSBfWFRFTlNBX0NBQ0hFX0gKKworI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorCisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCisjIGlmIChYQ0hBTF9JQ0FDSEVfU0laRSAlIChYQ0hBTF9JQ0FDSEVfTElORVNJWkUqWENIQUxfSUNBQ0hFX1dBWVMqNCkpICE9IDAKKyMgIGVycm9yIGNhY2hlIGNvbmZpZ3VyYXRpb24gb3V0c2lkZSBleHBlY3RlZC9zdXBwb3J0ZWQgcmFuZ2UhCisjIGVuZGlmCisjZW5kaWYKKworI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAorIyBpZiAoWENIQUxfRENBQ0hFX1NJWkUgJSAoWENIQUxfRENBQ0hFX0xJTkVTSVpFKlhDSEFMX0RDQUNIRV9XQVlTKjQpKSAhPSAwCisjICBlcnJvciBjYWNoZSBjb25maWd1cmF0aW9uIG91dHNpZGUgZXhwZWN0ZWQvc3VwcG9ydGVkIHJhbmdlIQorIyBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgTDFfQ0FDSEVfU0hJRlQJCVhDSEFMX0NBQ0hFX0xJTkVXSURUSF9NQVgKKyNkZWZpbmUgTDFfQ0FDSEVfQllURVMJCVhDSEFMX0NBQ0hFX0xJTkVTSVpFX01BWAorCisjZW5kaWYJLyogX1hURU5TQV9DQUNIRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlZmx1c2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGEzNmUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2NhY2hlZmx1c2guaApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jYWNoZWZsdXNoLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQ0FDSEVGTFVTSF9ICisjZGVmaW5lIF9YVEVOU0FfQ0FDSEVGTFVTSF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKgorICogZmx1c2ggYW5kIGludmFsaWRhdGUgZGF0YSBjYWNoZSwgaW52YWxpZGF0ZSBpbnN0cnVjdGlvbiBjYWNoZToKKyAqCisgKiBfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKCkKKyAqIF9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9yYW5nZShmcm9tLHN6ZSkKKyAqCisgKiBpbnZhbGlkYXRlIGRhdGEgb3IgaW5zdHJ1Y3Rpb24gY2FjaGU6CisgKgorICogX19pbnZhbGlkYXRlX2ljYWNoZV9hbGwoKQorICogX19pbnZhbGlkYXRlX2ljYWNoZV9wYWdlKGFkcikKKyAqIF9faW52YWxpZGF0ZV9kY2FjaGVfcGFnZShhZHIpCisgKiBfX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlKGZyb20sc2l6ZSkKKyAqIF9faW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoZnJvbSxzaXplKQorICoKKyAqIGZsdXNoIGRhdGEgY2FjaGU6CisgKgorICogX19mbHVzaF9kY2FjaGVfcGFnZShhZHIpCisgKgorICogZmx1c2ggYW5kIGludmFsaWRhdGUgZGF0YSBjYWNoZToKKyAqCisgKiBfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX2FsbCgpCisgKiBfX2ZsdXNoX2ludmFsaWRhdGVfZGNhY2hlX3BhZ2UoYWRyKQorICogX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZShmcm9tLHNpemUpCisgKi8KKworZXh0ZXJuIHZvaWQgX19mbHVzaF9pbnZhbGlkYXRlX2NhY2hlX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfYWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbnZhbGlkYXRlX2ljYWNoZV9hbGwodm9pZCk7CisKK2V4dGVybiB2b2lkIF9faW52YWxpZGF0ZV9kY2FjaGVfcGFnZSh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9faW52YWxpZGF0ZV9pY2FjaGVfcGFnZSh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9faW52YWxpZGF0ZV9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBfX2ludmFsaWRhdGVfZGNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOworCisjaWYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworZXh0ZXJuIHZvaWQgX19mbHVzaF9kY2FjaGVfcGFnZSh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcGFnZSh1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CisjZWxzZQorIyBkZWZpbmUgX19mbHVzaF9kY2FjaGVfcGFnZShwKQkJCQlkbyB7IH0gd2hpbGUoMCkKKyMgZGVmaW5lIF9fZmx1c2hfaW52YWxpZGF0ZV9kY2FjaGVfcGFnZShwKSAJCWRvIHsgfSB3aGlsZSgwKQorIyBkZWZpbmUgX19mbHVzaF9pbnZhbGlkYXRlX2RjYWNoZV9yYW5nZShwLHMpCQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKgorICogV2UgaGF2ZSBwaHlzaWNhbGx5IHRhZ2dlZCBjYWNoZXMgLSBub3RoaW5nIHRvIGRvIGhlcmUgLQorICogdW5sZXNzIHdlIGhhdmUgY2FjaGUgYWxpYXNpbmcuCisgKgorICogUGFnZXMgY2FuIGdldCByZW1hcHBlZC4gQmVjYXVzZSB0aGlzIG1pZ2h0IGNoYW5nZSB0aGUgJ2NvbG9yJyBvZiB0aGF0IHBhZ2UsCisgKiB3ZSBoYXZlIHRvIGZsdXNoIHRoZSBjYWNoZSBiZWZvcmUgdGhlIFBURSBpcyBjaGFuZ2VkLgorICogKHNlZSBhbHNvIERvY3VtZW50YXRpb24vY2FjaGV0bGIudHh0KQorICovCisKKyNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKSAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCisKKyNkZWZpbmUgZmx1c2hfY2FjaGVfYWxsKCkJCV9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9hbGwoKTsKKyNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQlfX2ZsdXNoX2ludmFsaWRhdGVfY2FjaGVfYWxsKCk7CisKKyNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCxlbmQpCV9fZmx1c2hfaW52YWxpZGF0ZV9jYWNoZV9hbGwoKTsKKyNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LGVuZCkJX19mbHVzaF9pbnZhbGlkYXRlX2NhY2hlX2FsbCgpOworCitleHRlcm4gdm9pZCBmbHVzaF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSopOworCitleHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqLCB1bG9uZywgdWxvbmcpOworZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKworI2Vsc2UKKworI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2NhY2hlX21tKG1tKQkJCQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCxlbmQpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV92dW5tYXAoc3RhcnQsZW5kKQkJCWRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKQkJCQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsYWRkcixwZm4pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsc3RhcnQsZW5kKQkJZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsZW5kKSAJCQkJCVwKKwlfX2ludmFsaWRhdGVfaWNhY2hlX3JhbmdlKHN0YXJ0LChlbmQpLShzdGFydCkpCisKKy8qIFRoaXMgaXMgbm90IHJlcXVpcmVkLCBzZWUgRG9jdW1lbnRhdGlvbi9jYWNoZXRsYi50eHQgKi8KKworI2RlZmluZQlmbHVzaF9pY2FjaGVfcGFnZSh2bWEscGFnZSkJCQlkbyB7IH0gd2hpbGUoMCkKKworI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF9sb2NrKG1hcHBpbmcpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKKworCisjZGVmaW5lIGNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKKwltZW1jcHkoZHN0LCBzcmMsIGxlbikKKworI2RlZmluZSBjb3B5X2Zyb21fdXNlcl9wYWdlKHZtYSwgcGFnZSwgdmFkZHIsIGRzdCwgc3JjLCBsZW4pIFwKKwltZW1jcHkoZHN0LCBzcmMsIGxlbikKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9YVEVOU0FfQ0FDSEVGTFVTSF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwMGZhZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2NoZWNrc3VtLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NIRUNLU1VNX0gKKyNkZWZpbmUgX1hURU5TQV9DSEVDS1NVTV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAorICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKKyAqCisgKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgorICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKKyAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAorICoKKyAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQorICovCithc21saW5rYWdlIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWwoY29uc3QgdW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4sIHVuc2lnbmVkIGludCBzdW0pOworCisvKgorICogdGhlIHNhbWUgYXMgY3N1bV9wYXJ0aWFsLCBidXQgY29waWVzIGZyb20gc3JjIHdoaWxlIGl0CisgKiBjaGVja3N1bXMsIGFuZCBoYW5kbGVzIHVzZXItc3BhY2UgcG9pbnRlciBleGNlcHRpb25zIGNvcnJlY3RseSwgd2hlbiBuZWVkZWQuCisgKgorICogaGVyZSBldmVuIG1vcmUgaW1wb3J0YW50IHRvIGFsaWduIHNyYyBhbmQgZHN0IG9uIGEgMzItYml0IChvciBldmVuCisgKiBiZXR0ZXIgNjQtYml0KSBib3VuZGFyeQorICovCisKK2FzbWxpbmthZ2UgdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoIGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtLAorCQkJCQkJICAgaW50ICpzcmNfZXJyX3B0ciwgaW50ICpkc3RfZXJyX3B0cik7CisKKy8qCisgKglOb3RlOiB3aGVuIHlvdSBnZXQgYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uIGhlcmUgdGhpcyBtZWFucyBzb21lb25lCisgKglwYXNzZWQgaW4gYW4gaW5jb3JyZWN0IGtlcm5lbCBhZGRyZXNzIHRvIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuCisgKgorICoJSWYgeW91IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgcGxlYXNlIGRvbid0IGZvcmdldCB0aGUKKyAqCXZlcmlmeV9hcmVhKCkuCisgKi8KK2V4dGVybiBfX2lubGluZV9fCit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayAoIGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAorCQkJCQlpbnQgbGVuLCBpbnQgc3VtKQoreworCXJldHVybiBjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljICggc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBOVUxMKTsKK30KKworZXh0ZXJuIF9faW5saW5lX18KK3Vuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIgKCBjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKKwkJCQkJCWludCBsZW4sIGludCBzdW0sIGludCAqZXJyX3B0cikKK3sKKwlyZXR1cm4gY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYyAoIHNyYywgZHN0LCBsZW4sIHN1bSwgZXJyX3B0ciwgTlVMTCk7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG9sZCAoYW5kIHVuc2FmZSkgd2F5IG9mIGRvaW5nIGNoZWNrc3VtcywgYSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZQorICogcHJpbnRlZCBpZiB0aGV5IGFyZSB1c2VkIGFuZCBhbiBleGVwdGlvbiBvY2N1cnMuCisgKgorICogdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBnbyBhd2F5IGFmdGVyIHNvbWUgdGltZS4KKyAqLworCisjZGVmaW5lIGNzdW1fcGFydGlhbF9jb3B5X2Zyb211c2VyIGNzdW1fcGFydGlhbF9jb3B5Cit1bnNpZ25lZCBpbnQgY3N1bV9wYXJ0aWFsX2NvcHkoIGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBpbnQgbGVuLCBpbnQgc3VtKTsKKworLyoKKyAqCUZvbGQgYSBwYXJ0aWFsIGNoZWNrc3VtCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IGNzdW1fZm9sZCh1bnNpZ25lZCBpbnQgc3VtKQoreworCXVuc2lnbmVkIGludCBfX2R1bW15OworCV9fYXNtX18oImV4dHVpCSUxLCAlMCwgMTYsIDE2XG5cdCIKKwkJImV4dHVpCSUwICwlMCwgMCwgMTZcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkic2xsaQklMSwgJTAsIDE2XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImV4dHVpCSUwLCAlMCwgMTYsIDE2XG5cdCIKKwkJIm5lZwklMCwgJTBcblx0IgorCQkiYWRkaQklMCwgJTAsIC0xXG5cdCIKKwkJImV4dHVpCSUwLCAlMCwgMCwgMTZcblx0IgorCQk6ICI9ciIgKHN1bSksICI9JnIiIChfX2R1bW15KQorCQk6ICIwIiAoc3VtKSk7CisJcmV0dXJuIHN1bTsKK30KKworLyoKKyAqCVRoaXMgaXMgYSB2ZXJzaW9uIG9mIGlwX2NvbXB1dGVfY3N1bSgpIG9wdGltaXplZCBmb3IgSVAgaGVhZGVycywKKyAqCXdoaWNoIGFsd2F5cyBjaGVja3N1bSBvbiA0IG9jdGV0IGJvdW5kYXJpZXMuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGlwX2Zhc3RfY3N1bSh1bnNpZ25lZCBjaGFyICogaXBoLCB1bnNpZ25lZCBpbnQgaWhsKQoreworCXVuc2lnbmVkIGludCBzdW0sIHRtcCwgZW5kYWRkcjsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkic3ViCQklMCwgJTAsICUwXG5cdCIKKyNpZiBYQ0hBTF9IQVZFX0xPT1BTCisJCSJsb29wZ3R6CSUyLCAyZlxuXHQiCisjZWxzZQorCQkiYmVxegkJJTIsIDJmXG5cdCIKKwkJInNsbGkJCSU0LCAlMiwgMlxuXHQiCisJCSJhZGQJCSU0LCAlNCwgJTFcblx0IgorCQkiMDpcdCIKKyNlbmRpZgorCQkibDMyaQkJJTMsICUxLCAwXG5cdCIKKwkJImFkZAkJJTAsICUwLCAlM1xuXHQiCisJCSJiZ2V1CQklMCwgJTMsIDFmXG5cdCIKKwkJImFkZGkJCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkaQkJJTEsICUxLCA0XG5cdCIKKyNpZiAhWENIQUxfSEFWRV9MT09QUworCQkiYmx0CQklMSwgJTQsIDBiXG5cdCIKKyNlbmRpZgorCQkiMjpcdCIKKwkvKiBTaW5jZSB0aGUgaW5wdXQgcmVnaXN0ZXJzIHdoaWNoIGFyZSBsb2FkZWQgd2l0aCBpcGggYW5kIGlobAorCSAgIGFyZSBtb2RpZmllZCwgd2UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlbSBhcyBvdXRwdXRzLCBvciBnY2MKKwkgICB3aWxsIGFzc3VtZSB0aGV5IGNvbnRhaW4gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLiAqLworCQk6ICI9ciIgKHN1bSksICI9ciIgKGlwaCksICI9ciIgKGlobCksICI9JnIiICh0bXApLCAiPSZyIiAoZW5kYWRkcikKKwkJOiAiMSIgKGlwaCksICIyIiAoaWhsKSk7CisKKwlyZXR1cm4JY3N1bV9mb2xkKHN1bSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgY3N1bV90Y3B1ZHBfbm9mb2xkKHVuc2lnbmVkIGxvbmcgc2FkZHIsCisJCQkJCQkgICB1bnNpZ25lZCBsb25nIGRhZGRyLAorCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgbGVuLAorCQkJCQkJICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCQkgICB1bnNpZ25lZCBpbnQgc3VtKQoreworCisjaWZkZWYgX19YVEVOU0FfRUxfXworCXVuc2lnbmVkIGxvbmcgbGVuX3Byb3RvID0gKG50b2hzKGxlbik8PDE2KStwcm90byoyNTY7CisjZWxpZiBkZWZpbmVkKF9fWFRFTlNBX0VCX18pCisJdW5zaWduZWQgbG9uZyBsZW5fcHJvdG8gPSAocHJvdG88PDE2KStsZW47CisjZWxzZQorIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCisjZW5kaWYKKwlfX2FzbV9fKCJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImFkZAklMCwgJTAsICUyXG5cdCIKKwkJImJnZXUJJTAsICUyLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkCSUwLCAlMCwgJTNcblx0IgorCQkiYmdldQklMCwgJTMsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCTogIj1yIiAoc3VtKSwgIj1yIiAobGVuX3Byb3RvKQorCQk6ICJyIiAoZGFkZHIpLCAiciIgKHNhZGRyKSwgIjEiIChsZW5fcHJvdG8pLCAiMCIgKHN1bSkpOworCXJldHVybiBzdW07Cit9CisKKy8qCisgKiBjb21wdXRlcyB0aGUgY2hlY2tzdW0gb2YgdGhlIFRDUC9VRFAgcHNldWRvLWhlYWRlcgorICogcmV0dXJucyBhIDE2LWJpdCBjaGVja3N1bSwgYWxyZWFkeSBjb21wbGVtZW50ZWQKKyAqLworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgaW50IGNzdW1fdGNwdWRwX21hZ2ljKHVuc2lnbmVkIGxvbmcgc2FkZHIsCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBkYWRkciwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBsZW4sCisJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHN1bSkKK3sKKwlyZXR1cm4gY3N1bV9mb2xkKGNzdW1fdGNwdWRwX25vZm9sZChzYWRkcixkYWRkcixsZW4scHJvdG8sc3VtKSk7Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgaXMgdXNlZCBmb3IgbWlzY2VsbGFuZW91cyBJUC1saWtlIGNoZWNrc3VtcywgbWFpbmx5CisgKiBpbiBpY21wLmMKKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpcF9jb21wdXRlX2NzdW0odW5zaWduZWQgY2hhciAqIGJ1ZmYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGNzdW1fZm9sZCAoY3N1bV9wYXJ0aWFsKGJ1ZmYsIGxlbiwgMCkpOworfQorCisjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBzaG9ydCBpbnQgY3N1bV9pcHY2X21hZ2ljKHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCisJCQkJCQkgICAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCisJCQkJCQkgICAgIF9fdTMyIGxlbiwKKwkJCQkJCSAgICAgdW5zaWduZWQgc2hvcnQgcHJvdG8sCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCBzdW0pCit7CisJdW5zaWduZWQgaW50IF9fZHVtbXk7CisJX19hc21fXygibDMyaQklMSwgJTIsIDBcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMiwgNFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUyLCA4XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTIsIDEyXG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTMsIDBcblx0IgorCQkiYWRkCSUwLCAlMCwgJTFcblx0IgorCQkiYmdldQklMCwgJTEsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJsMzJpCSUxLCAlMywgNFxuXHQiCisJCSJhZGQJJTAsICUwLCAlMVxuXHQiCisJCSJiZ2V1CSUwLCAlMSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJImwzMmkJJTEsICUzLCA4XG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkibDMyaQklMSwgJTMsIDEyXG5cdCIKKwkJImFkZAklMCwgJTAsICUxXG5cdCIKKwkJImJnZXUJJTAsICUxLCAxZlxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSIxOlx0IgorCQkiYWRkCSUwLCAlMCwgJTRcblx0IgorCQkiYmdldQklMCwgJTQsIDFmXG5cdCIKKwkJImFkZGkJJTAsICUwLCAxXG5cdCIKKwkJIjE6XHQiCisJCSJhZGQJJTAsICUwLCAlNVxuXHQiCisJCSJiZ2V1CSUwLCAlNSwgMWZcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiMTpcdCIKKwkJOiAiPXIiIChzdW0pLCAiPSZyIiAoX19kdW1teSkKKwkJOiAiciIgKHNhZGRyKSwgInIiIChkYWRkciksCisJCSAgInIiIChodG9ubChsZW4pKSwgInIiIChodG9ubChwcm90bykpLCAiMCIgKHN1bSkpOworCisJcmV0dXJuIGNzdW1fZm9sZChzdW0pOworfQorCisvKgorICoJQ29weSBhbmQgY2hlY2tzdW0gdG8gdXNlcgorICovCisjZGVmaW5lIEhBVkVfQ1NVTV9DT1BZX1VTRVIKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBjc3VtX2FuZF9jb3B5X3RvX3VzZXIgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LAorCQkJCSAgICBpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmVycl9wdHIpCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgbGVuKSkKKwkJcmV0dXJuIGNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWMoc3JjLCBkc3QsIGxlbiwgc3VtLCBOVUxMLCBlcnJfcHRyKTsKKworCWlmIChsZW4pCisJCSplcnJfcHRyID0gLUVGQVVMVDsKKworCXJldHVybiAtMTsgLyogaW52YWxpZCBjaGVja3N1bSAqLworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jb3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MWI5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvY29wcm9jZXNzb3IuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2NwZXh0cmEuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfQ09QUk9DRVNTT1JfSAorI2RlZmluZSBfWFRFTlNBX0NPUFJPQ0VTU09SX0gKKworI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorCisjZGVmaW5lIFhUT0ZTKGxhc3Rfc3RhcnQsbGFzdF9zaXplLGFsaWduKSBcCisJKChsYXN0X3N0YXJ0K2xhc3Rfc2l6ZSthbGlnbi0xKSAmIC1hbGlnbikKKworI2RlZmluZSBYVEVOU0FfQ1BfRVhUUkFfT0ZGU0VUCTAKKyNkZWZpbmUgWFRFTlNBX0NQX0VYVFJBX0FMSUdOCVhDSEFMX0VYVFJBX1NBX0FMSUdOCisKKyNkZWZpbmUgWFRFTlNBX0NQRV9DUDBfT0ZGU0VUCVwKKwlYVE9GUyhYVEVOU0FfQ1BfRVhUUkFfT0ZGU0VULCBYQ0hBTF9FWFRSQV9TQV9TSVpFLCBYQ0hBTF9DUDBfU0FfQUxJR04pCisjZGVmaW5lIFhURU5TQV9DUEVfQ1AxX09GRlNFVAlcCisJWFRPRlMoWFRFTlNBX0NQRV9DUDBfT0ZGU0VULCBYQ0hBTF9DUDBfU0FfU0laRSwgWENIQUxfQ1AxX1NBX0FMSUdOKQorI2RlZmluZSBYVEVOU0FfQ1BFX0NQMl9PRkZTRVQJXAorCVhUT0ZTKFhURU5TQV9DUEVfQ1AxX09GRlNFVCwgWENIQUxfQ1AxX1NBX1NJWkUsIFhDSEFMX0NQMl9TQV9BTElHTikKKyNkZWZpbmUgWFRFTlNBX0NQRV9DUDNfT0ZGU0VUCVwKKwlYVE9GUyhYVEVOU0FfQ1BFX0NQMl9PRkZTRVQsIFhDSEFMX0NQMl9TQV9TSVpFLCBYQ0hBTF9DUDNfU0FfQUxJR04pCisjZGVmaW5lIFhURU5TQV9DUEVfQ1A0X09GRlNFVAlcCisJWFRPRlMoWFRFTlNBX0NQRV9DUDNfT0ZGU0VULCBYQ0hBTF9DUDNfU0FfU0laRSwgWENIQUxfQ1A0X1NBX0FMSUdOKQorI2RlZmluZSBYVEVOU0FfQ1BFX0NQNV9PRkZTRVQJXAorCVhUT0ZTKFhURU5TQV9DUEVfQ1A0X09GRlNFVCwgWENIQUxfQ1A0X1NBX1NJWkUsIFhDSEFMX0NQNV9TQV9BTElHTikKKyNkZWZpbmUgWFRFTlNBX0NQRV9DUDZfT0ZGU0VUCVwKKwlYVE9GUyhYVEVOU0FfQ1BFX0NQNV9PRkZTRVQsIFhDSEFMX0NQNV9TQV9TSVpFLCBYQ0hBTF9DUDZfU0FfQUxJR04pCisjZGVmaW5lIFhURU5TQV9DUEVfQ1A3X09GRlNFVAlcCisJWFRPRlMoWFRFTlNBX0NQRV9DUDZfT0ZGU0VULCBYQ0hBTF9DUDZfU0FfU0laRSwgWENIQUxfQ1A3X1NBX0FMSUdOKQorI2RlZmluZSBYVEVOU0FfQ1BfRVhUUkFfU0laRQlcCisJWFRPRlMoWFRFTlNBX0NQRV9DUDdfT0ZGU0VULCBYQ0hBTF9DUDdfU0FfU0laRSwgMTYpCisKKyNpZiBYQ0hBTF9DUF9OVU0gPiAwCisjIGlmbmRlZiBfX0FTU0VNQkxZX18KKy8qCisgKiBUYXNrcyB0aGF0IG93biBjb250ZW50cyBvZiAobGFzdCB1c2VyKSBlYWNoIGNvcHJvY2Vzc29yLgorICogRW50cmllcyBhcmUgMCBmb3Igbm90LW93bmVkIG9yIG5vbi1leGlzdGVudCBjb3Byb2Nlc3NvcnMuCisgKiBOb3RlOiBUaGUgc2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSBpcyBmaXhlZCB0byA4IGJ5dGVzIGluIGVudHJ5LlMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7CS8qIG93bmVyICovCisJaW50IG9mZnNldDsJCQkvKiBvZmZzZXQgaW4gY3BleHRyYSBzcGFjZS4gKi8KK30gY29wcm9jZXNzb3JfaW5mb190OworIyBlbHNlCisjICBkZWZpbmUgQ09QUk9DRVNTT1JfSU5GT19PV05FUiAwCisjICBkZWZpbmUgQ09QUk9DRVNTT1JfSU5GT19PRkZTRVQgNAorIyAgZGVmaW5lIENPUFJPQ0VTU09SX0lORk9fU0laRSA4CisjIGVuZGlmCisjZW5kaWYKKworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworIyBpZiBYQ0hBTF9DUF9OVU0gPiAwCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitleHRlcm4gdm9pZCByZWxlYXNlX2NvcHJvY2Vzc29ycyAoc3RydWN0IHRhc2tfc3RydWN0Kik7CitleHRlcm4gdm9pZCBzYXZlX2NvcHJvY2Vzc29yX3JlZ2lzdGVycyh2b2lkKiwgaW50KTsKKyMgZWxzZQorIyAgZGVmaW5lIHJlbGVhc2VfY29wcm9jZXNzb3JzKHRhc2spCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmCS8qIF9YVEVOU0FfQ09QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2NwdW1hc2suaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jcHVtYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlZWRlMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jcHVtYXNrLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9jcHVtYXNrLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0NQVU1BU0tfSAorI2RlZmluZSBfWFRFTlNBX0NQVU1BU0tfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1bWFzay5oPgorCisjZW5kaWYgLyogX1hURU5TQV9DUFVNQVNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jcHV0aW1lLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY3B1dGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZmI4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvY3B1dGltZS5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBfWFRFTlNBX0NQVVRJTUVfSAorI2RlZmluZSBfWFRFTlNBX0NQVVRJTUVfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvY3B1dGltZS5oPgorCisjZW5kaWYgLyogX1hURU5TQV9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jdXJyZW50LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvY3VycmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMWViNWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvY3VycmVudC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvY3VycmVudC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9DVVJSRU5UX0gKKyNkZWZpbmUgX1hURU5TQV9DVVJSRU5UX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CisKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmdldF9jdXJyZW50KHZvaWQpCit7CisJcmV0dXJuIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+dGFzazsKK30KKworI2RlZmluZSBjdXJyZW50IGdldF9jdXJyZW50KCkKKworI2Vsc2UKKworI2RlZmluZSBDVVJSRU5UX1NISUZUIDEzCisKKyNkZWZpbmUgR0VUX0NVUlJFTlQocmVnLHNwKQkJXAorCUdFVF9USFJFQURfSU5GTyhyZWcsc3ApOwlcCisgIAlsMzJpIHJlZywgcmVnLCBUSV9UQVNLCQlcCisKKyNlbmRpZgorCisKKyNlbmRpZiAvKiBYVEVOU0FfQ1VSUkVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kZWxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTIzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvZGVsYXkuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2RlbGF5LmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICovCisKKyNpZm5kZWYgX1hURU5TQV9ERUxBWV9ICisjZGVmaW5lIF9YVEVOU0FfREVMQVlfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorCitleHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7CisKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKQoreworICAvKiAyIGN5Y2xlcyBwZXIgbG9vcC4gKi8KKyAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIxOiBhZGRpICUwLCAlMCwgLTI7IGJnZXVpICUwLCAyLCAxYiIKKwkJCTogIj1yIiAobG9vcHMpIDogIjAiIChsb29wcykpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1MzIgeHRlbnNhX2dldF9jY291bnQodm9pZCkKK3sKKwl1MzIgY2NvdW50OworCWFzbSB2b2xhdGlsZSAoInJzciAlMCwgMjM0OyAjIENDT1VOVFxuIiA6ICI9ciIgKGNjb3VudCkpOworCXJldHVybiBjY291bnQ7Cit9CisKKy8qIEZvciBTTVAvTlVNQSBzeXN0ZW1zLCBjaGFuZ2UgYm9vdF9jcHVfZGF0YSB0byBzb21ldGhpbmcgbGlrZQorICogbG9jYWxfY3B1X2RhdGEtPi4uLiB3aGVyZSBsb2NhbF9jcHVfZGF0YSBwb2ludHMgdG8gdGhlIGN1cnJlbnQKKyAqIGNwdS4gKi8KKworc3RhdGljIF9faW5saW5lX18gdm9pZCB1ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlY3MpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IHh0ZW5zYV9nZXRfY2NvdW50KCk7CisJdW5zaWduZWQgbG9uZyBjeWNsZXMgPSB1c2VjcyAqIChsb29wc19wZXJfamlmZnkgLyAoMTAwMDAwMFVMIC8gSFopKTsKKworCS8qIE5vdGU6IGFsbCB2YXJpYWJsZXMgYXJlIHVuc2lnbmVkIChjYW4gd3JhcCBhcm91bmQpISAqLworCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcpeHRlbnNhX2dldF9jY291bnQoKSkgLSBzdGFydCA8IGN5Y2xlcykKKwkJOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvZGl2NjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGExMDU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RpdjY0LmgKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9kaXY2NC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9ESVY2NF9ICisjZGVmaW5lIF9YVEVOU0FfRElWNjRfSAorCisjZGVmaW5lIGRvX2RpdihuLGJhc2UpICh7IFwKKwlpbnQgX19yZXMgPSBuICUgKCh1bnNpZ25lZCBpbnQpIGJhc2UpOyBcCisJbiAvPSAodW5zaWduZWQgaW50KSBiYXNlOyBcCisJX19yZXM7IH0pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvZG1hLW1hcHBpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZhMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RtYS1tYXBwaW5nLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvZG1hX21hcHBpbmcuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfRE1BX01BUFBJTkdfSAorI2RlZmluZSBfWFRFTlNBX0RNQV9NQVBQSU5HX0gKKworI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKy8qCisgKiBETUEtY29uc2lzdGVudCBtYXBwaW5nIGZ1bmN0aW9ucy4KKyAqLworCitleHRlcm4gdm9pZCAqY29uc2lzdGVudF9hbGxvYyhpbnQsIHNpemVfdCwgZG1hX2FkZHJfdCwgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gdm9pZCBjb25zaXN0ZW50X2ZyZWUodm9pZCosIHNpemVfdCwgZG1hX2FkZHJfdCk7CitleHRlcm4gdm9pZCBjb25zaXN0ZW50X3N5bmModm9pZCosIHNpemVfdCwgaW50KTsKKworI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCisjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCisKK3ZvaWQgKmRtYV9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgaW50IGZsYWcpOworCit2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAorZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAorCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisJY29uc2lzdGVudF9zeW5jKHB0ciwgc2l6ZSwgZGlyZWN0aW9uKTsKKwlyZXR1cm4gdmlydF90b19waHlzKHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJaW50IGk7CisKKwlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrICkgeworCQlCVUdfT04oIXNnLT5wYWdlKTsKKworCQlzZy0+ZG1hX2FkZHJlc3MgPSBwYWdlX3RvX3BoeXMoc2ctPnBhZ2UpICsgc2ctPm9mZnNldDsKKwkJY29uc2lzdGVudF9zeW5jKHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0LAorCQkJCXNnLT5sZW5ndGgsIGRpcmVjdGlvbik7CisJfQorCisJcmV0dXJuIG5lbnRzOworfQorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QKK2RtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CisJcmV0dXJuIChkbWFfYWRkcl90KShwYWdlX3RvX3BmbihwYWdlKSkgKiBQQUdFX1NJWkUgKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyZXNzLCBzaXplX3Qgc2l6ZSwKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5od2VudHJpZXMsCisJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJY29uc2lzdGVudF9zeW5jKCh2b2lkICopYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAorCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJY29uc2lzdGVudF9zeW5jKCh2b2lkICopYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSksIHNpemUsIGRpcmVjdGlvbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCisJY29uc2lzdGVudF9zeW5jKCh2b2lkICopYnVzX3RvX3ZpcnQoZG1hX2hhbmRsZSkrb2Zmc2V0LHNpemUsZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisKKwljb25zaXN0ZW50X3N5bmMoKHZvaWQgKilidXNfdG9fdmlydChkbWFfaGFuZGxlKStvZmZzZXQsc2l6ZSxkaXJlY3Rpb24pOworfQorc3RhdGljIGlubGluZSB2b2lkCitkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbmVsZW1zOyBpKyssIHNnKyspCisJCWNvbnNpc3RlbnRfc3luYyhwYWdlX2FkZHJlc3Moc2ctPnBhZ2UpICsgc2ctPm9mZnNldCwKKwkJCQlzZy0+bGVuZ3RoLCBkaXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAorCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuZWxlbXM7IGkrKywgc2crKykKKwkJY29uc2lzdGVudF9zeW5jKHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0LAorCQkJCXNnLT5sZW5ndGgsIGRpcik7Cit9CitzdGF0aWMgaW5saW5lIGludAorZG1hX21hcHBpbmdfZXJyb3IoZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RtYV9zZXRfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQoreworCWlmKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgbWFzaykpCisJCXJldHVybiAtRUlPOworCisJKmRldi0+ZG1hX21hc2sgPSBtYXNrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCh2b2lkKQoreworCXJldHVybiBMMV9DQUNIRV9CWVRFUzsKK30KKworI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkKQkoMSkKKworc3RhdGljIGlubGluZSB2b2lkCitkbWFfY2FjaGVfc3luYyh2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCisJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKwljb25zaXN0ZW50X3N5bmModmFkZHIsIHNpemUsIGRpcmVjdGlvbik7Cit9CisKKyNlbmRpZgkvKiBfWFRFTlNBX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzIyYjAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2RtYS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvZG1hLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0RNQV9ICisjZGVmaW5lIF9YVEVOU0FfRE1BX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogbmVlZCBieXRlIElPICovCisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisKKy8qCisgKiBUaGlzIGlzIG9ubHkgdG8gYmUgZGVmaW5lZCBpZiB3ZSBoYXZlIFBDLWxpa2UgRE1BLgorICogQnkgZGVmYXVsdCB0aGlzIGlzIG5vdCB0cnVlIG9uIGFuIFh0ZW5zYSBwcm9jZXNzb3IsCisgKiBob3dldmVyIG9uIGJvYXJkcyB3aXRoIGEgUENJIGJ1cywgc3VjaCBmdW5jdGlvbmFsaXR5CisgKiBtaWdodCBiZSBlbXVsYXRlZCBleHRlcm5hbGx5LgorICoKKyAqIE5PVEU6ICB0aGVyZSBzdGlsbCBleGlzdHMgZHJpdmVyIGNvZGUgdGhhdCBhc3N1bWVzCisgKiB0aGlzIGlzIGRlZmluZWQsIGVnLiBkcml2ZXJzL3NvdW5kL3NvdW5kY2FyZC5jIChhcyBvZiAyLjQpLgorICovCisjZGVmaW5lIE1BWF9ETUFfQ0hBTk5FTFMJOAorCisvKgorICogVGhlIG1heGltdW0gdmlydHVhbCBhZGRyZXNzIHRvIHdoaWNoIERNQSB0cmFuc2ZlcnMKKyAqIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhpcyBwbGF0Zm9ybS4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIGJvYXJkIChwbGF0Zm9ybSkgc3BlY2lmaWMsIG5vdCBwcm9jZXNzb3Itc3BlY2lmaWMhCisgKgorICogTk9URTogVGhpcyBhc3N1bWVzIERNQSB0cmFuc2ZlcnMgY2FuIG9ubHkgYmUgcGVyZm9ybWVkIG9uCisgKgl0aGUgc2VjdGlvbiBvZiBwaHlzaWNhbCBtZW1vcnkgY29udGlndW91c2x5IG1hcHBlZCBpbiB2aXJ0dWFsCisgKglzcGFjZSBmb3IgdGhlIGtlcm5lbC4gIEZvciB0aGUgWHRlbnNhIGFyY2hpdGVjdHVyZSwgdGhpcworICoJbWVhbnMgdGhlIG1heGltdW0gcG9zc2libGUgc2l6ZSBvZiB0aGlzIERNQSBhcmVhIGlzCisgKgl0aGUgc2l6ZSBvZiB0aGUgc3RhdGljYWxseSBtYXBwZWQga2VybmVsIHNlZ21lbnQKKyAqCShYQ0hBTF9LU0VHX3tDQUNIRUQsQllQQVNTfV9TSVpFKSwgaWUuIDEyOCBNQi4KKyAqCisgKiBOT1RFOiBXaGVuIHRoZSBlbnRpcmUgS1NFRyBhcmVhIGlzIERNQSBjYXBhYmxlLCB3ZSBzdWJzdHJhY3QKKyAqCW9uZSBmcm9tIHRoZSBtYXggYWRkcmVzcyBzbyB0aGF0IHRoZSB2aXJ0X3RvX3BoeXMoKSBtYWNybworICoJd29ya3MgY29ycmVjdGx5IG9uIHRoZSBhZGRyZXNzIChvdGhlcndpc2UgdGhlIGFkZHJlc3MKKyAqCWVudGVycyBhbm90aGVyIGFyZWEsIGFuZCB2aXJ0X3RvX3BoeXMoKSBtYXkgbm90IHJldHVybgorICoJdGhlIHZhbHVlIGRlc2lyZWQpLgorICovCisjZGVmaW5lIE1BWF9ETUFfQUREUkVTUwkJKFBBR0VfT0ZGU0VUICsgWENIQUxfS1NFR19DQUNIRURfU0laRSAtIDEpCisKKy8qIFJlc2VydmUgYW5kIHJlbGVhc2UgYSBETUEgY2hhbm5lbCAqLworZXh0ZXJuIGludCByZXF1ZXN0X2RtYSh1bnNpZ25lZCBpbnQgZG1hbnIsIGNvbnN0IGNoYXIgKiBkZXZpY2VfaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9kbWEodW5zaWduZWQgaW50IGRtYW5yKTsKKworI2lmZGVmIENPTkZJR19QQ0kKK2V4dGVybiBpbnQgaXNhX2RtYV9icmlkZ2VfYnVnZ3k7CisjZWxzZQorI2RlZmluZSBpc2FfZG1hX2JyaWRnZV9idWdneSAJKDApCisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9lbGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGYxZjUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2VsZi5oCisgKgorICogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9FTEZfSAorI2RlZmluZSBfWFRFTlNBX0VMRl9ICisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2NvcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisKKy8qIFh0ZW5zYSBwcm9jZXNzb3IgRUxGIGFyY2hpdGVjdHVyZS1tYWdpYyBudW1iZXIgKi8KKworI2RlZmluZSBFTV9YVEVOU0EJOTQKKyNkZWZpbmUgRU1fWFRFTlNBX09MRAkweEFCQzcKKworLyogRUxGIHJlZ2lzdGVyIGRlZmluaXRpb25zLiBUaGlzIGlzIG5lZWRlZCBmb3IgY29yZSBkdW1wIHN1cHBvcnQuICAqLworCisvKgorICogZWxmX2dyZWdzZXRfdCBjb250YWlucyB0aGUgYXBwbGljYXRpb24tbGV2ZWwgc3RhdGUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqIFByb2Nlc3NvciBpbmZvOiAJY29uZmlnX3ZlcnNpb24sIGNwdXh5CisgKiBQcm9jZXNzb3Igc3RhdGU6CXBjLCBwcywgZXhjY2F1c2UsIGV4Y3ZhZGRyLCB3Yiwgd3MsCisgKgkJCWxiZWcsIGxlbmQsIGxjb3VudCwgc2FyCisgKiBHUCByZWdzOgkJYXIwIC0gYXJYWAorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBlbGZfZ3JlZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisJZWxmX2dyZWdfdCB4Y2hhbF9jb25maWdfaWQwOworCWVsZl9ncmVnX3QgeGNoYWxfY29uZmlnX2lkMTsKKwllbGZfZ3JlZ190IGNwdXg7CisJZWxmX2dyZWdfdCBjcHV5OworCWVsZl9ncmVnX3QgcGM7CisJZWxmX2dyZWdfdCBwczsKKwllbGZfZ3JlZ190IGV4Y2NhdXNlOworCWVsZl9ncmVnX3QgZXhjdmFkZHI7CisJZWxmX2dyZWdfdCB3aW5kb3diYXNlOworCWVsZl9ncmVnX3Qgd2luZG93c3RhcnQ7CisJZWxmX2dyZWdfdCBsYmVnOworCWVsZl9ncmVnX3QgbGVuZDsKKwllbGZfZ3JlZ190IGxjb3VudDsKKwllbGZfZ3JlZ190IHNhcjsKKwllbGZfZ3JlZ190IHN5c2NhbGw7CisJZWxmX2dyZWdfdCBhcltYQ0hBTF9OVU1fQVJFR1NdOworfSB4dGVuc2FfZ3JlZ3NldF90OworCisjZGVmaW5lIEVMRl9OR1JFRwkoc2l6ZW9mKHh0ZW5zYV9ncmVnc2V0X3QpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKQorCit0eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOworCisvKgorICogIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGNvcHJvY2Vzc29yIGFuZCBleHRyYSBzdGF0ZSBsYXlvdXQgKHJlZ2lzdGVyIGluZm8pCisgKiAgdGFibGUgKGluIGJ5dGVzKS4KKyAqICBUaGlzIGlzIGFjdHVhbGx5IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHRhYmxlLCBhcyBvcHBvc2VkIHRvIHRoZSBzaXplLAorICogIHdoaWNoIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBfeHRlbnNhX3JlZ2luZm9fdGFibGVfc2l6ZSBnbG9iYWwgdmFyaWFibGUuCisgKgorICogIChTZWUgYWxzbyBhcmNoL3h0ZW5zYS9rZXJuZWwvY29wcm9jZXNzb3IuUykKKyAqCisgKi8KKworI2lmbmRlZiBYQ0hBTF9FWFRSQV9TQV9DT05URU5UU19MSUJEQl9OVU0KKyMgZGVmaW5lIFhURU5TQV9DUEVfTFRBQkxFX1NJWkUJCTAKKyNlbHNlCisjIGRlZmluZSBYVEVOU0FfQ1BFX1NFR01FTlQobnVtKQkobnVtID8gKDErbnVtKSA6IDApCisjIGRlZmluZSBYVEVOU0FfQ1BFX0xUQUJMRV9FTlRSSUVTCVwKKwkJKCBYVEVOU0FfQ1BFX1NFR01FTlQoWENIQUxfRVhUUkFfU0FfQ09OVEVOVFNfTElCREJfTlVNKQlcCisJCSsgWFRFTlNBX0NQRV9TRUdNRU5UKFhDSEFMX0NQMF9TQV9DT05URU5UU19MSUJEQl9OVU0pCVwKKwkJKyBYVEVOU0FfQ1BFX1NFR01FTlQoWENIQUxfQ1AxX1NBX0NPTlRFTlRTX0xJQkRCX05VTSkJXAorCQkrIFhURU5TQV9DUEVfU0VHTUVOVChYQ0hBTF9DUDJfU0FfQ09OVEVOVFNfTElCREJfTlVNKQlcCisJCSsgWFRFTlNBX0NQRV9TRUdNRU5UKFhDSEFMX0NQM19TQV9DT05URU5UU19MSUJEQl9OVU0pCVwKKwkJKyBYVEVOU0FfQ1BFX1NFR01FTlQoWENIQUxfQ1A0X1NBX0NPTlRFTlRTX0xJQkRCX05VTSkJXAorCQkrIFhURU5TQV9DUEVfU0VHTUVOVChYQ0hBTF9DUDVfU0FfQ09OVEVOVFNfTElCREJfTlVNKQlcCisJCSsgWFRFTlNBX0NQRV9TRUdNRU5UKFhDSEFMX0NQNl9TQV9DT05URU5UU19MSUJEQl9OVU0pCVwKKwkJKyBYVEVOU0FfQ1BFX1NFR01FTlQoWENIQUxfQ1A3X1NBX0NPTlRFTlRTX0xJQkRCX05VTSkJXAorCQkrIDEJCS8qIGZpbmFsIGVudHJ5ICovCQkJXAorCQkpCisjIGRlZmluZSBYVEVOU0FfQ1BFX0xUQUJMRV9TSVpFCQkoWFRFTlNBX0NQRV9MVEFCTEVfRU5UUklFUyAqIDgpCisjZW5kaWYKKworCisvKgorICogSW5zdGFudGlhdGlvbnMgb2YgdGhlIGVsZl9mcHJlZ3NldF90IHR5cGUgY29udGFpbiwgaW4gbW9zdAorICogYXJjaGl0ZWN0dXJlcywgdGhlIGZsb2F0aW5nIHBvaW50IChGUFUpIHJlZ2lzdGVyIHNldC4KKyAqIEZvciBYdGVuc2EsIHRoaXMgdHlwZSBpcyBleHRlbmRlZCB0byBjb250YWluIGFsbCBjdXN0b20gc3RhdGUsCisgKiBpZS4gY29wcm9jZXNzb3IgYW5kICJleHRyYSIgKG5vbi1jb3Byb2Nlc3Nvcikgc3RhdGUgKGluY2x1ZGluZywKKyAqIGZvciBleGFtcGxlLCBUSUUtZGVmaW5lZCBzdGF0ZXMgYW5kIHJlZ2lzdGVyIGZpbGVzOyBhcyB3ZWxsCisgKiBhcyBvdGhlciBvcHRpb25hbCBwcm9jZXNzb3Igc3RhdGUpLgorICogVGhpcyBpbmNsdWRlcyBGUFUgc3RhdGUgaWYgYSBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3NvciBoYXBwZW5zCisgKiB0byBoYXZlIGJlZW4gY29uZmlndXJlZCB3aXRoaW4gdGhlIFh0ZW5zYSBwcm9jZXNzb3IuCisgKgorICogVE9UQUxfRlBSRUdTX1NJWkUgaXMgdGhlIHJlcXVpcmVkIHNpemUgKHdpdGhvdXQgcm91bmRpbmcpCisgKiBvZiBlbGZfZnByZWdzZXRfdC4gIEl0IHByb3ZpZGVzIHNwYWNlIGZvciB0aGUgZm9sbG93aW5nOgorICoKKyAqICBhKQkzMi1iaXQgbWFzayBvZiBhY3RpdmUgY29wcm9jZXNzb3JzIGZvciB0aGlzIHRhc2sgKHNpbWlsYXIKKyAqCXRvIENQRU5BQkxFIGluIHNpbmdsZS10aHJlYWRlZCBYdGVuc2EgcHJvY2Vzc29yIHN5c3RlbXMpCisgKgorICogIGIpCXRhYmxlIGRlc2NyaWJpbmcgdGhlIGxheW91dCBvZiBjdXN0b20gc3RhdGVzIChpZS4gb2YKKyAqICAgICAgaW5kaXZpZHVhbCByZWdpc3RlcnMsIGV0Yykgd2l0aGluIHRoZSBzYXZlIGFyZWFzCisgKgorICogIGMpICBzYXZlIGFyZWFzIGZvciBlYWNoIGNvcHJvY2Vzc29yIGFuZCBmb3Igbm9uLWNvcHJvY2Vzc29yCisgKiAgICAgICgiZXh0cmEiKSBzdGF0ZQorICoKKyAqIE5vdGUgdGhhdCBzYXZlIGFyZWFzIG1heSByZXF1aXJlIHVwIHRvIDE2LWJ5dGUgYWxpZ25tZW50IHdoZW4KKyAqIGFjY2Vzc2VkIGJ5IHNhdmUvcmVzdG9yZSBzZXF1ZW5jZXMuICBXZSBkbyBub3QgbmVlZCB0byBlbnN1cmUKKyAqIHN1Y2ggYWxpZ25tZW50IGluIGFuIGVsZl9mcHJlZ3NldF90IHN0cnVjdHVyZSBiZWNhdXNlIGN1c3RvbQorICogc3RhdGUgaXMgbm90IGRpcmVjdGx5IGxvYWRlZC9zdG9yZWQgaW50byBpdDsgcmF0aGVyLCBzYXZlIGFyZWEKKyAqIGNvbnRlbnRzIGFyZSBjb3BpZWQgdG8gZWxmX2ZwcmVnc2V0X3QgZnJvbSB0aGUgYWN0aXZlIHNhdmUgYXJlYXMKKyAqIChzZWUgJ3N0cnVjdCB0YXNrX3N0cnVjdCcgZGVmaW5pdGlvbiBpbiBwcm9jZXNzb3IuaCBmb3IgdGhhdCkKKyAqIHVzaW5nIG1lbWNweSgpLiAgQnV0IHdlIGRvIGFsbG93IHNwYWNlIGZvciBzdWNoIGFsaWdubWVudCwKKyAqIHRvIGFsbG93IG9wdGltaXphdGlvbnMgb2YgbGF5b3V0IGFuZCBjb3B5aW5nLgorICovCisKKyNkZWZpbmUgVE9UQUxfRlBSRUdTX1NJWkUJCQkJCQlcCisgIAkoNCArIFhURU5TQV9DUEVfTFRBQkxFX1NJWkUgKyBYVEVOU0FfQ1BfRVhUUkFfU0laRSkKKyNkZWZpbmUgRUxGX05GUFJFRwkJCQkJCQlcCisJKChUT1RBTF9GUFJFR1NfU0laRSArIHNpemVvZihlbGZfZnByZWdfdCkgLSAxKSAvIHNpemVvZihlbGZfZnByZWdfdCkpCisKK3R5cGVkZWYgdW5zaWduZWQgaW50IGVsZl9mcHJlZ190OwordHlwZWRlZiBlbGZfZnByZWdfdCBlbGZfZnByZWdzZXRfdFtFTEZfTkZQUkVHXTsKKworI2RlZmluZSBFTEZfQ09SRV9DT1BZX1JFR1MoX2VyZWdzLCBfcHJlZ3MpIAkJCQlcCisJeHRlbnNhX2VsZl9jb3JlX2NvcHlfcmVncyAoJl9lcmVncywgX3ByZWdzKTsKKworZXh0ZXJuIHZvaWQgeHRlbnNhX2VsZl9jb3JlX2NvcHlfcmVncyAoeHRlbnNhX2dyZWdzZXRfdCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgd2UgZG9uJ3QgbG9hZCBzb21ldGhpbmcgZm9yIHRoZSB3cm9uZyBhcmNoaXRlY3R1cmUuCisgKi8KKworI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSAoICggKHgpLT5lX21hY2hpbmUgPT0gRU1fWFRFTlNBICkgIHx8IFwKKwkJCSAgICAoICh4KS0+ZV9tYWNoaW5lID09IEVNX1hURU5TQV9PTEQgKSApCisKKy8qCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgcGFyYW1ldGVycyBpbiB0aGUgY29yZSBkdW1wcy4KKyAqLworCisjaWZkZWYgX19YVEVOU0FfRUxfXworIyBkZWZpbmUgRUxGX0RBVEEJRUxGREFUQTJMU0IKKyNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUJfXykKKyMgZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCisjZWxzZQorIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCisjZW5kaWYKKworI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgorI2RlZmluZSBFTEZfQVJDSAlFTV9YVEVOU0EKKworI2RlZmluZSBVU0VfRUxGX0NPUkVfRFVNUAorI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQlQQUdFX1NJWkUKKworLyoKKyAqIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHRoYXQgYW4gRVRfRFlOIHByb2dyYW0gaXMgbG9hZGVkIGlmIGV4ZWMnZWQuICBUeXBpY2FsCisgKiB1c2Ugb2YgdGhpcyBpcyB0byBpbnZva2UgIi4vbGQuc28gc29tZXByb2ciIHRvIHRlc3Qgb3V0IGEgbmV3IHZlcnNpb24gb2YKKyAqIHRoZSBsb2FkZXIuICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG91dCBvZiB0aGUgd2F5IG9mIHRoZSBwcm9ncmFtCisgKiB0aGF0IGl0IHdpbGwgImV4ZWMiLCBhbmQgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHJvb20gZm9yIHRoZSBicmsuCisgKi8KKworI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UgICAgICAgICAoMiAqIFRBU0tfU0laRSAvIDMpCisKKy8qCisgKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CisgKiBpbnN0cnVjdGlvbiBzZXQgdGhpcyBDUFUgc3VwcG9ydHMuICBUaGlzIGNvdWxkIGJlIGRvbmUgaW4gdXNlciBzcGFjZSwKKyAqIGJ1dCBpdCdzIG5vdCBlYXN5LCBhbmQgd2UndmUgYWxyZWFkeSBkb25lIGl0IGhlcmUuCisgKi8KKworI2RlZmluZSBFTEZfSFdDQVAJKDApCisKKy8qCisgKiBUaGlzIHlpZWxkcyBhIHN0cmluZyB0aGF0IGxkLnNvIHdpbGwgdXNlIHRvIGxvYWQgaW1wbGVtZW50YXRpb24KKyAqIHNwZWNpZmljIGxpYnJhcmllcyBmb3Igb3B0aW1pemF0aW9uLiAgVGhpcyBpcyBtb3JlIHNwZWNpZmljIGluCisgKiBpbnRlbnQgdGhhbiBwb2tpbmcgYXQgdW5hbWUgb3IgL3Byb2MvY3B1aW5mby4KKyAqIEZvciB0aGUgbW9tZW50LCB3ZSBoYXZlIG9ubHkgb3B0aW1pemF0aW9ucyBmb3IgdGhlIEludGVsIGdlbmVyYXRpb25zLAorICogYnV0IHRoYXQgY291bGQgY2hhbmdlLi4uCisgKi8KKworI2RlZmluZSBFTEZfUExBVEZPUk0gIChOVUxMKQorCisvKgorICogVGhlIFh0ZW5zYSBwcm9jZXNzb3IgQUJJIHNheXMgdGhhdCB3aGVuIHRoZSBwcm9ncmFtIHN0YXJ0cywgYTIKKyAqIGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IGJlIHJlZ2lzdGVyZWQgdXNpbmcKKyAqIGBhdGV4aXQnLiAgVGhpcyBwcm92aWRlcyBhIG1lYW4gZm9yIHRoZSBkeW5hbWljIGxpbmtlciB0byBjYWxsCisgKiBEVF9GSU5JIGZ1bmN0aW9ucyBmb3Igc2hhcmVkIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgYmVmb3JlCisgKiB0aGUgY29kZSBydW5zLgorICoKKyAqIEEgdmFsdWUgb2YgMCB0ZWxscyB3ZSBoYXZlIG5vIHN1Y2ggaGFuZGxlci4KKyAqCisgKiBXZSBtaWdodCBhcyB3ZWxsIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGVsc2UgaXMgY2xlYXJlZCB0b28gKGV4Y2VwdAorICogZm9yIHRoZSBzdGFjayBwb2ludGVyIGluIGExKSwganVzdCB0byBtYWtlIHRoaW5ncyBtb3JlCisgKiBkZXRlcm1pbmlzdGljLiAgQWxzbywgY2xlYXJpbmcgYTAgdGVybWluYXRlcyBkZWJ1Z2dlciBiYWNrdHJhY2VzLgorICovCisKKyNkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKSBcCisgIGRvIHsgX3ItPmFyZWdbMF09MDsgLypfci0+YXJlZ1sxXT0wOyovIF9yLT5hcmVnWzJdPTA7ICBfci0+YXJlZ1szXT0wOyAgXAorICAgICAgIF9yLT5hcmVnWzRdPTA7ICBfci0+YXJlZ1s1XT0wOyAgICBfci0+YXJlZ1s2XT0wOyAgX3ItPmFyZWdbN109MDsgIFwKKyAgICAgICBfci0+YXJlZ1s4XT0wOyAgX3ItPmFyZWdbOV09MDsgICAgX3ItPmFyZWdbMTBdPTA7IF9yLT5hcmVnWzExXT0wOyBcCisgICAgICAgX3ItPmFyZWdbMTJdPTA7IF9yLT5hcmVnWzEzXT0wOyAgIF9yLT5hcmVnWzE0XT0wOyBfci0+YXJlZ1sxNV09MDsgXAorICB9IHdoaWxlICgwKQorCisjaWZkZWYgX19LRVJORUxfXworCisjZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCwgaWJjczIpIHNldF9wZXJzb25hbGl0eShQRVJfTElOVVhfMzJCSVQpCisKK2V4dGVybiB2b2lkIGRvX2NvcHlfcmVncyAoeHRlbnNhX2dyZWdzZXRfdCosIHN0cnVjdCBwdF9yZWdzKiwKKwkJCSAgc3RydWN0IHRhc2tfc3RydWN0Kik7CitleHRlcm4gdm9pZCBkb19yZXN0b3JlX3JlZ3MgKHh0ZW5zYV9ncmVnc2V0X3QqLCBzdHJ1Y3QgcHRfcmVncyosCisJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCopOworZXh0ZXJuIHZvaWQgZG9fc2F2ZV9mcHJlZ3MgKGVsZl9mcHJlZ3NldF90Kiwgc3RydWN0IHB0X3JlZ3MqLAorCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCopOworZXh0ZXJuIGludCBkb19yZXN0b3JlX2ZwcmVncyAoZWxmX2ZwcmVnc2V0X3QqLCBzdHJ1Y3QgcHRfcmVncyosCisJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QqKTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9lcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZjNiOTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvZXJybm8uaApAQCAtMCwwICsxLDE2IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2Vycm5vLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0VSUk5PX0gKKyNkZWZpbmUgX1hURU5TQV9FUlJOT19ICisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgorCisjZW5kaWYJLyogX1hURU5TQV9FUlJOT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvZmNudGwuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODc2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvZmNudGwuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9mY250bC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IGJ5IFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9GQ05UTF9ICisjZGVmaW5lIF9YVEVOU0FfRkNOVExfSAorCisvKiBvcGVuL2ZjbnRsIC0gT19TWU5DIGlzIG9ubHkgaW1wbGVtZW50ZWQgb24gYmxvY2tzIGRldmljZXMgYW5kIG9uIGZpbGVzCisgICBsb2NhdGVkIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgT19BQ0NNT0RFCTB4MDAwMworI2RlZmluZSBPX1JET05MWQkweDAwMDAKKyNkZWZpbmUgT19XUk9OTFkJMHgwMDAxCisjZGVmaW5lIE9fUkRXUgkJMHgwMDAyCisjZGVmaW5lIE9fQVBQRU5ECTB4MDAwOAorI2RlZmluZSBPX1NZTkMJCTB4MDAxMAorI2RlZmluZSBPX05PTkJMT0NLCTB4MDA4MAorI2RlZmluZSBPX0NSRUFUICAgICAgICAgMHgwMTAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX1RSVU5DCQkweDAyMDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIE9fRVhDTAkJMHgwNDAwCS8qIG5vdCBmY250bCAqLworI2RlZmluZSBPX05PQ1RUWQkweDA4MDAJLyogbm90IGZjbnRsICovCisjZGVmaW5lIEZBU1lOQwkJMHgxMDAwCS8qIGZjbnRsLCBmb3IgQlNEIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgT19MQVJHRUZJTEUJMHgyMDAwCS8qIGFsbG93IGxhcmdlIGZpbGUgb3BlbnMgLSBjdXJyZW50bHkgaWdub3JlZCAqLworI2RlZmluZSBPX0RJUkVDVAkweDgwMDAJLyogZGlyZWN0IGRpc2sgYWNjZXNzIGhpbnQgLSBjdXJyZW50bHkgaWdub3JlZCovCisjZGVmaW5lIE9fRElSRUNUT1JZCTB4MTAwMDAJLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLworI2RlZmluZSBPX05PRk9MTE9XCTB4MjAwMDAJLyogZG9uJ3QgZm9sbG93IGxpbmtzICovCisjZGVmaW5lIE9fTk9BVElNRQkweDEwMDAwMAorCisjZGVmaW5lIE9fTkRFTEFZCU9fTk9OQkxPQ0sKKworI2RlZmluZSBGX0RVUEZECQkwCS8qIGR1cCAqLworI2RlZmluZSBGX0dFVEZECQkxCS8qIGdldCBjbG9zZV9vbl9leGVjICovCisjZGVmaW5lIEZfU0VURkQJCTIJLyogc2V0L2NsZWFyIGNsb3NlX29uX2V4ZWMgKi8KKyNkZWZpbmUgRl9HRVRGTAkJMwkvKiBnZXQgZmlsZS0+Zl9mbGFncyAqLworI2RlZmluZSBGX1NFVEZMCQk0CS8qIHNldCBmaWxlLT5mX2ZsYWdzICovCisjZGVmaW5lIEZfR0VUTEsJCTE0CisjZGVmaW5lIEZfR0VUTEs2NCAgICAgICAxNQorI2RlZmluZSBGX1NFVExLCQk2CisjZGVmaW5lIEZfU0VUTEtXCTcKKyNkZWZpbmUgRl9TRVRMSzY0ICAgICAgIDE2CisjZGVmaW5lIEZfU0VUTEtXNjQgICAgICAxNworCisjZGVmaW5lIEZfU0VUT1dOCTI0CS8qICBmb3Igc29ja2V0cy4gKi8KKyNkZWZpbmUgRl9HRVRPV04JMjMJLyogIGZvciBzb2NrZXRzLiAqLworI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCisjZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KKworLyogZm9yIEZfW0dFVHxTRVRdRkwgKi8KKyNkZWZpbmUgRkRfQ0xPRVhFQwkxCS8qIGFjdHVhbGx5IGFueXRoaW5nIHdpdGggbG93IGJpdCBzZXQgZ29lcyAqLworCisvKiBmb3IgcG9zaXggZmNudGwoKSBhbmQgbG9ja2YoKSAqLworI2RlZmluZSBGX1JETENLCQkwCisjZGVmaW5lIEZfV1JMQ0sJCTEKKyNkZWZpbmUgRl9VTkxDSwkJMgorCisvKiBmb3Igb2xkIGltcGxlbWVudGF0aW9uIG9mIGJzZCBmbG9jayAoKSAqLworI2RlZmluZSBGX0VYTENLCQk0CS8qIG9yIDMgKi8KKyNkZWZpbmUgRl9TSExDSwkJOAkvKiBvciA0ICovCisKKy8qIGZvciBsZWFzZXMgKi8KKyNkZWZpbmUgRl9JTlBST0dSRVNTCTE2CisKKy8qIG9wZXJhdGlvbnMgZm9yIGJzZCBmbG9jaygpLCBhbHNvIHVzZWQgYnkgdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCisjZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19OQgkJNAkvKiBvcidkIHdpdGggb25lIG9mIHRoZSBhYm92ZSB0byBwcmV2ZW50CisJCQkJICAgYmxvY2tpbmcgKi8KKyNkZWZpbmUgTE9DS19VTgkJOAkvKiByZW1vdmUgbG9jayAqLworCisjZGVmaW5lIExPQ0tfTUFORAkzMgkvKiBUaGlzIGlzIGEgbWFuZGF0b3J5IGZsb2NrIC4uLiAqLworI2RlZmluZSBMT0NLX1JFQUQJNjQJLyogIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1dSSVRFCTEyOAkvKiAgd2hpY2ggYWxsb3dzIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBMT0NLX1JXCQkxOTIJLyogIHdoaWNoIGFsbG93cyBjb25jdXJyZW50IHJlYWQgJiB3cml0ZSBvcHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZmxvY2sgeworCXNob3J0IGxfdHlwZTsKKwlzaG9ydCBsX3doZW5jZTsKKwlfX2tlcm5lbF9vZmZfdCBsX3N0YXJ0OworCV9fa2VybmVsX29mZl90IGxfbGVuOworCWxvbmcgIGxfc3lzaWQ7CisJX19rZXJuZWxfcGlkX3QgbF9waWQ7CisJbG9uZyAgcGFkWzRdOworfSBmbG9ja190OworCitzdHJ1Y3QgZmxvY2s2NCB7CisJc2hvcnQgIGxfdHlwZTsKKwlzaG9ydCAgbF93aGVuY2U7CisJX19rZXJuZWxfb2ZmX3QgbF9zdGFydDsKKwlfX2tlcm5lbF9vZmZfdCBsX2xlbjsKKwlwaWRfdCAgbF9waWQ7Cit9OworCisjZGVmaW5lIEZfTElOVVhfU1BFQ0lGSUNfQkFTRQkxMDI0CisKKyNlbmRpZiAvKiBfWFRFTlNBX0ZDTlRMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9maXhtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIzYjhhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2ZpeG1hcC5oCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2ZpeG1hcC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9GSVhNQVBfSAorI2RlZmluZSBfWFRFTlNBX0ZJWE1BUF9ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKy8qCisgKiBIZXJlIHdlIGRlZmluZSBhbGwgdGhlIGNvbXBpbGUtdGltZSB2aXJ0dWFsIGFkZHJlc3Nlcy4KKyAqLworCisjaWYgWENIQUxfU0VHX01BUFBBQkxFX1ZBRERSICE9IDAKKyMgZXJyb3IgIkN1cnJlbnQgcG9ydCByZXF1aXJlcyB2aXJ0dWFsIHVzZXIgc3BhY2Ugc3RhcnRpbmcgYXQgMCIKKyNlbmRpZgorI2lmIFhDSEFMX1NFR19NQVBQQUJMRV9TSVpFIDwgMHg4MDAwMDAwMAorIyBlcnJvciAiQ3VycmVudCBwb3J0IHJlcXVpcmVzIGF0IGxlYXN0IDB4ODAwMDAwMCBieXRlcyBmb3IgdXNlciBzcGFjZSIKKyNlbmRpZgorCisvKiBWZXJpZnkgaW5zdHJ1Y3Rpb24vZGF0YSByYW0vcm9tIGFuZCB4bG1pIGRvbid0IG92ZXJsYXkgdm1hbGxvYyBzcGFjZS4gKi8KKworI2RlZmluZSBfX0lOX1ZNQUxMT0MoYWRkcikJCQkJCQlcCisJKCgoYWRkcikgPj0gVk1BTExPQ19TVEFSVCkgJiYgKChhZGRyKSA8IFZNQUxMT0NfRU5EKSkKKyNkZWZpbmUgX19TUEFOX1ZNQUxMT0Moc3RhcnQsZW5kKQkJCQkJXAorCSgoKHN0YXJ0KSA8IFZNQUxMT0NfU1RBUlQpICYmICgoZW5kKSA+PSBWTUFMTE9DX0VORCkpCisjZGVmaW5lIElOU0lERV9WTUFMTE9DKHN0YXJ0LGVuZCkgCQkJCQlcCisJKF9fSU5fVk1BTExPQygoc3RhcnQpKSB8fCBfX0lOX1ZNQUxMT0MoZW5kKSB8fCBfX1NQQU5fVk1BTExPQygoc3RhcnQpLChlbmQpKSkKKworI2lmIFhDSEFMX05VTV9JTlNUUk9NCisjIGlmIFhDSEFMX05VTV9JTlNUUk9NID09IDEKKyMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX0lOU1RST00wX1ZBRERSLFhDSEFMX0lOU1RST00wX1ZBRERSK1hDSEFMX0lOU1RST00wX1NJWkUpCisjICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCBpbnN0cm9tMAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWYgWENIQUxfTlVNX0lOU1RST00gPT0gMgorIyAgaWYgSU5TSURFX1ZNQUxMT0MoWENIQUxfSU5TVFJPTTFfVkFERFIsWENIQUxfSU5TVFJPTTFfVkFERFIrWENIQUxfSU5TVFJPTTFfU0laRSkKKyMgICBlcnJvciB2bWFsbG9jIHJhbmdlIGNvbmZsaWN0cyB3aXRoIGluc3Ryb20xCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBYQ0hBTF9OVU1fSU5TVFJBTQorIyBpZiBYQ0hBTF9OVU1fSU5TVFJBTSA9PSAxCisjICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9JTlNUUkFNMF9WQUREUixYQ0hBTF9JTlNUUkFNMF9WQUREUitYQ0hBTF9JTlNUUkFNMF9TSVpFKQorIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggaW5zdHJhbTAKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmIFhDSEFMX05VTV9JTlNUUkFNID09IDIKKyMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX0lOU1RSQU0xX1ZBRERSLFhDSEFMX0lOU1RSQU0xX1ZBRERSK1hDSEFMX0lOU1RSQU0xX1NJWkUpCisjICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCBpbnN0cmFtMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgWENIQUxfTlVNX0RBVEFST00KKyMgaWYgWENIQUxfTlVNX0RBVEFST00gPT0gMQorIyAgaWYgSU5TSURFX1ZNQUxMT0MoWENIQUxfREFUQVJPTTBfVkFERFIsWENIQUxfREFUQVJPTTBfVkFERFIrWENIQUxfREFUQVJPTTBfU0laRSkKKyMgICBlcnJvciB2bWFsbG9jIHJhbmdlIGNvbmZsaWN0cyB3aXRoIGRhdGFyb20wCisjICBlbmRpZgorIyBlbmRpZgorIyBpZiBYQ0hBTF9OVU1fREFUQVJPTSA9PSAyCisjICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9EQVRBUk9NMV9WQUREUixYQ0hBTF9EQVRBUk9NMV9WQUREUitYQ0hBTF9EQVRBUk9NMV9TSVpFKQorIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggZGF0YXJvbTEKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmIFhDSEFMX05VTV9EQVRBUkFNCisjIGlmIFhDSEFMX05VTV9EQVRBUkFNID09IDEKKyMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX0RBVEFSQU0wX1ZBRERSLFhDSEFMX0RBVEFSQU0wX1ZBRERSK1hDSEFMX0RBVEFSQU0wX1NJWkUpCisjICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCBkYXRhcmFtMAorIyAgZW5kaWYKKyMgZW5kaWYKKyMgaWYgWENIQUxfTlVNX0RBVEFSQU0gPT0gMgorIyAgaWYgSU5TSURFX1ZNQUxMT0MoWENIQUxfREFUQVJBTTFfVkFERFIsWENIQUxfREFUQVJBTTFfVkFERFIrWENIQUxfREFUQVJBTTFfU0laRSkKKyMgICBlcnJvciB2bWFsbG9jIHJhbmdlIGNvbmZsaWN0cyB3aXRoIGRhdGFyYW0xCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBYQ0hBTF9OVU1fWExNSQorIyBpZiBYQ0hBTF9OVU1fWExNSSA9PSAxCisjICBpZiBJTlNJREVfVk1BTExPQyhYQ0hBTF9YTE1JMF9WQUREUixYQ0hBTF9YTE1JMF9WQUREUitYQ0hBTF9YTE1JMF9TSVpFKQorIyAgIGVycm9yIHZtYWxsb2MgcmFuZ2UgY29uZmxpY3RzIHdpdGggeGxtaTAKKyMgIGVuZGlmCisjIGVuZGlmCisjIGlmIFhDSEFMX05VTV9YTE1JID09IDIKKyMgIGlmIElOU0lERV9WTUFMTE9DKFhDSEFMX1hMTUkxX1ZBRERSLFhDSEFMX1hMTUkxX1ZBRERSK1hDSEFMX1hMTUkxX1NJWkUpCisjICAgZXJyb3Igdm1hbGxvYyByYW5nZSBjb25mbGljdHMgd2l0aCB4bG1pMQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgKFhDSEFMX05VTV9JTlNUUk9NID4gMikgfHwgXAorICAgIChYQ0hBTF9OVU1fSU5TVFJBTSA+IDIpIHx8IFwKKyAgICAoWENIQUxfTlVNX0RBVEFSQU0gPiAyKSB8fCBcCisgICAgKFhDSEFMX05VTV9EQVRBUk9NID4gMikgfHwgXAorICAgIChYQ0hBTF9OVU1fWExNSSAgICA+IDIpCisjIGVycm9yIEluc3VmZmljaWVudCBjaGVja3Mgb24gdm1hbGxvYyBhYm92ZSBmb3IgbW9yZSB0aGFuIDIgZGV2aWNlcworI2VuZGlmCisKKy8qCisgKiBVU0VSX1ZNX1NJWkUgZG9lcyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgVEFTS19TSVpFLiAgV2UgYnVtcGVkCisgKiBUQVNLX1NJWkUgZG93biB0byAweDQwMDAwMDAgdG8gc2ltcGxpZnkgdGhlIGhhbmRsaW5nIG9mIHdpbmRvd2VkCisgKiBjYWxsIGluc3RydWN0aW9ucyAoY3VycmVudGx5IGxpbWl0ZWQgdG8gYSByYW5nZSBvZiAxIEdCeXRlKS4gIFVzZXIKKyAqIHRhc2tzIG1heSB2ZXJ5IHdlbGwgcmVjbGFpbSB0aGUgVk0gc3BhY2UgZnJvbSAweDQwMDAwMDAwIHRvCisgKiAweDdmZmZmZmZmIGluIHRoZSBmdXR1cmUsIHNvIHdlIGRvIG5vdCB3YW50IHRoZSBrZXJuZWwgYmVjb21pbmcKKyAqIGFjY3VzdG9tZWQgdG8gaGF2aW5nIGFueSBvZiBpdHMgc3R1ZmYgKGUuZy4sIHBhZ2UgdGFibGVzKSBpbiB0aGlzCisgKiByZWdpb24uICBUaGlzIFZNIHJlZ2lvbiBpcyBuby1tYW4ncyBsYW5kIGZvciBub3cuCisgKi8KKworI2RlZmluZSBVU0VSX1ZNX1NUQVJUCQlYQ0hBTF9TRUdfTUFQUEFCTEVfVkFERFIKKyNkZWZpbmUgVVNFUl9WTV9TSVpFCQkweDgwMDAwMDAwCisKKy8qICBTaXplIG9mIHBhZ2UgdGFibGU6ICAqLworCisjZGVmaW5lIFBHVEFCTEVfU0laRV9CSVRTCSgzMiAtIFhDSEFMX01NVV9NSU5fUFRFX1BBR0VfU0laRSArIDIpCisjZGVmaW5lIFBHVEFCTEVfU0laRQkJKDFMIDw8IFBHVEFCTEVfU0laRV9CSVRTKQorCisvKiAgQWxsIGtlcm5lbC1tYXBwYWJsZSBzcGFjZTogICovCisKKyNkZWZpbmUgS0VSTkVMX0FMTE1BUF9TVEFSVAkoVVNFUl9WTV9TVEFSVCArIFVTRVJfVk1fU0laRSkKKyNkZWZpbmUgS0VSTkVMX0FMTE1BUF9TSVpFCShYQ0hBTF9TRUdfTUFQUEFCTEVfU0laRSAtIEtFUk5FTF9BTExNQVBfU1RBUlQpCisKKy8qICBDYXJ2ZSBvdXQgcGFnZSB0YWJsZSBhdCBzdGFydCBvZiBrZXJuZWwtbWFwcGFibGUgYXJlYTogICovCisKKyNpZiBLRVJORUxfQUxMTUFQX1NJWkUgPCBQR1RBQkxFX1NJWkUKKyNlcnJvciAiR2ltbWUgc29tZSBzcGFjZSBmb3IgcGFnZSB0YWJsZSEiCisjZW5kaWYKKyNkZWZpbmUgUEdUQUJMRV9TVEFSVAkJS0VSTkVMX0FMTE1BUF9TVEFSVAorCisvKiAgUmVtYWluaW5nIGtlcm5lbC1tYXBwYWJsZSBzcGFjZTogICovCisKKyNkZWZpbmUgS0VSTkVMX01BUFBFRF9TVEFSVAkoS0VSTkVMX0FMTE1BUF9TVEFSVCArIFBHVEFCTEVfU0laRSkKKyNkZWZpbmUgS0VSTkVMX01BUFBFRF9TSVpFCShLRVJORUxfQUxMTUFQX1NJWkUgLSBQR1RBQkxFX1NJWkUpCisKKyNpZiBLRVJORUxfTUFQUEVEX1NJWkUgPCAweDAxMDAwMDAwCS8qIDE2IE1CIGlzIGFyYml0cmFyeSBmb3Igbm93ICovCisjIGVycm9yICJTaG91bGRuJ3QgdGhlIGtlcm5lbCBoYXZlIGF0IGxlYXN0ICpzb21lKiBtYXBwYWJsZSBzcGFjZT8iCisjZW5kaWYKKworI2RlZmluZSBNQVhfTE9XX01FTU9SWQkJWENIQUxfS1NFR19DQUNIRURfU0laRQorCisjZW5kaWYKKworLyoKKyAqICBTb21lIGNvbnN0YW50cyB1c2VkIGVsc2V3aGVyZSwgYnV0IHBlcmhhcHMgb25seSBpbiBYdGVuc2EgaGVhZGVyCisgKiAgZmlsZXMsIHNvIG1heWJlIHdlIGNhbiBnZXQgcmlkIG9mIHNvbWUgYW5kIGFjY2VzcyBjb21waWxlLXRpbWUgSEFMCisgKiAgZGlyZWN0bHkuLi4KKyAqCisgKiAgTm90ZTogIFdlIGFzc3VtZSB0aGF0IHN5c3RlbSBSQU0gaXMgbG9jYXRlZCBhdCB0aGUgdmVyeSBzdGFydCBvZiB0aGUKKyAqICAJICAga2VybmVsIHNlZ21lbnRzICEhCisgKi8KKyNkZWZpbmUgS0VSTkVMX1ZNX0xPVyAgICAgICAgICAgWENIQUxfS1NFR19DQUNIRURfVkFERFIKKyNkZWZpbmUgS0VSTkVMX1ZNX0hJR0ggICAgICAgICAgWENIQUxfS1NFR19CWVBBU1NfVkFERFIKKyNkZWZpbmUgS0VSTkVMX1NQQUNFICAgICAgICAgICAgWENIQUxfS1NFR19DQUNIRURfVkFERFIKKworLyoKKyAqIFJldHVybnMgdGhlIHBoeXNpY2FsL3ZpcnR1YWwgYWRkcmVzc2VzIG9mIHRoZSBrZXJuZWwgc3BhY2UKKyAqICh3b3JrcyB3aXRoIHRoZSBjYWNoZWQga2VybmVsIHNlZ21lbnQgb25seSwgd2hpY2ggaXMgdGhlCisgKiAgb25lIG5vcm1hbGx5IHVzZWQgZm9yIGtlcm5lbCBvcGVyYXRpb24pLgorICovCisKKy8qCQkJUEhZU0lDQUwJQllQQVNTCQlDQUNIRUQKKyAqCisgKiAgYnlwYXNzIHZhZGRyCWJ5cGFzcyBwYWRkcgkqCQljYWNoZWQgdmFkZHIKKyAqICBjYWNoZWQgdmFkZHIJY2FjaGVkIHBhZGRyCWJ5cGFzcyB2YWRkcgkqCisgKiAgYnlwYXNzIHBhZGRyCSoJCWJ5cGFzcyB2YWRkcgljYWNoZWQgdmFkZHIKKyAqICBjYWNoZWQgcGFkZHIJKgkJYnlwYXNzIHZhZGRyCWNhY2hlZCB2YWRkcgorICogIG90aGVyCQkqCQkqCQkqCisgKi8KKworI2RlZmluZSBQSFlTQUREUihhKQkJCQkJCQkgICAgICBcCisoKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS1NFR19CWVBBU1NfVkFERFIJCQkJICAgICAgXAorICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgKyBYQ0hBTF9LU0VHX0JZUEFTU19TSVpFKSA/ICAgICAgXAorICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiArIFhDSEFMX0tTRUdfQllQQVNTX1BBRERSIDogICAgICAgXAorICAgICgodW5zaWduZWQpKGEpID49IFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSCQkJCSAgICAgIFwKKyAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSICsgWENIQUxfS1NFR19DQUNIRURfU0laRSkgPyAgIFwKKyAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSICsgWENIQUxfS1NFR19DQUNIRURfUEFERFIgOiAgIFwKKwkodW5zaWduZWQpKGEpKQorCisjZGVmaW5lIEJZUEFTU19BRERSKGEpCQkJCQkJCSAgICAgIFwKKygoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LU0VHX0JZUEFTU19QQUREUgkJCQkgICAgICBcCisgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LU0VHX0JZUEFTU19QQUREUiArIFhDSEFMX0tTRUdfQllQQVNTX1NJWkUpID8gICAgICBcCisgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tTRUdfQllQQVNTX1BBRERSICsgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgOiAgICAgICBcCisgICAgKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS1NFR19DQUNIRURfUEFERFIJCQkJICAgICAgXAorICAgICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS1NFR19DQUNIRURfUEFERFIgKyBYQ0hBTF9LU0VHX0NBQ0hFRF9TSVpFKSA/ICAgXAorICAgICAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS1NFR19DQUNIRURfUEFERFIgKyBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiA6ICAgXAorICAgICAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUgkJCSAgICAgIFwKKyAgICAgICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUitYQ0hBTF9LU0VHX0NBQ0hFRF9TSVpFKT8gIFwKKyAgICAgICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUitYQ0hBTF9LU0VHX0JZUEFTU19WQUREUjogIFwKKwkgICAgKHVuc2lnbmVkKShhKSkKKworI2RlZmluZSBDQUNIRURfQUREUihhKQkJCQkJCQkgICAgICBcCisoKCh1bnNpZ25lZCkoYSkgPj0gWENIQUxfS1NFR19CWVBBU1NfUEFERFIJCQkJICAgICAgXAorICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS1NFR19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LU0VHX0JZUEFTU19TSVpFKSA/ICAgICAgXAorICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0JZUEFTU19QQUREUiArIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSIDogICAgICAgXAorICAgICgodW5zaWduZWQpKGEpID49IFhDSEFMX0tTRUdfQ0FDSEVEX1BBRERSCQkJICAgICAgICAgICAgICBcCisgICAgICYmICh1bnNpZ25lZCkoYSkgPCBYQ0hBTF9LU0VHX0NBQ0hFRF9QQUREUiArIFhDSEFMX0tTRUdfQ0FDSEVEX1NJWkUpID8gICBcCisgICAgICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LU0VHX0NBQ0hFRF9QQUREUiArIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSIDogICBcCisgICAgICAgICgodW5zaWduZWQpKGEpID49IFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCQkJICAgICAgXAorICAgICAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSK1hDSEFMX0tTRUdfQllQQVNTX1NJWkUpID8gXAorICAgICAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSK1hDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSIDogXAorCSAgICAodW5zaWduZWQpKGEpKQorCisjZGVmaW5lIFBIWVNBRERSX0lPKGEpCQkJCQkJCSAgICAgIFwKKygoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSCQkJCSAgICAgIFwKKyAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19CWVBBU1NfVkFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1NJWkUpID8JICAgICAgXAorICAgICh1bnNpZ25lZCkoYSkgLSBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSICsgWENIQUxfS0lPX0JZUEFTU19QQUREUiA6CSAgICAgIFwKKyAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSCQkJCSAgICAgIFwKKyAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19DQUNIRURfVkFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1NJWkUpID8gICAgIFwKKyAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19DQUNIRURfVkFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1BBRERSIDogICAgIFwKKwkodW5zaWduZWQpKGEpKQorCisjZGVmaW5lIEJZUEFTU19BRERSX0lPKGEpCQkJCQkJICAgICAgXAorKCgodW5zaWduZWQpKGEpID49IFhDSEFMX0tJT19CWVBBU1NfUEFERFIJCQkJICAgICAgXAorICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS0lPX0JZUEFTU19QQUREUiArIFhDSEFMX0tJT19CWVBBU1NfU0laRSkgPwkgICAgICBcCisgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSIDoJICAgICAgXAorICAgICgodW5zaWduZWQpKGEpID49IFhDSEFMX0tJT19DQUNIRURfUEFERFIJCQkJICAgICAgXAorICAgICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS0lPX0NBQ0hFRF9QQUREUiArIFhDSEFMX0tJT19DQUNIRURfU0laRSkgPyAgICAgXAorICAgICAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS0lPX0NBQ0hFRF9QQUREUiArIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgOiAgICAgXAorICAgICAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSCQkJICAgICAgXAorICAgICAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19DQUNIRURfVkFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1NJWkUpID8gXAorICAgICAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19DQUNIRURfVkFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSIDogXAorCSAgICAodW5zaWduZWQpKGEpKQorCisjZGVmaW5lIENBQ0hFRF9BRERSX0lPKGEpCQkJCQkJICAgICAgXAorKCgodW5zaWduZWQpKGEpID49IFhDSEFMX0tJT19CWVBBU1NfUEFERFIJCQkJICAgICAgXAorICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS0lPX0JZUEFTU19QQUREUiArIFhDSEFMX0tJT19CWVBBU1NfU0laRSkgPwkgICAgICBcCisgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19CWVBBU1NfUEFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSIDoJICAgICAgXAorICAgICgodW5zaWduZWQpKGEpID49IFhDSEFMX0tJT19DQUNIRURfUEFERFIJCQkJICAgICAgXAorICAgICAmJiAodW5zaWduZWQpKGEpIDwgWENIQUxfS0lPX0NBQ0hFRF9QQUREUiArIFhDSEFMX0tJT19DQUNIRURfU0laRSkgPyAgICAgXAorICAgICAgICAodW5zaWduZWQpKGEpIC0gWENIQUxfS0lPX0NBQ0hFRF9QQUREUiArIFhDSEFMX0tJT19DQUNIRURfVkFERFIgOiAgICAgXAorICAgICAgICAoKHVuc2lnbmVkKShhKSA+PSBYQ0hBTF9LSU9fQllQQVNTX1ZBRERSCQkJICAgICAgXAorICAgICAgICAgJiYgKHVuc2lnbmVkKShhKSA8IFhDSEFMX0tJT19CWVBBU1NfVkFERFIgKyBYQ0hBTF9LSU9fQllQQVNTX1NJWkUpID8gXAorICAgICAgICAgICAgKHVuc2lnbmVkKShhKSAtIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgKyBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSIDogXAorCSAgICAodW5zaWduZWQpKGEpKQorCisjZW5kaWYgLyogX1hURU5TQV9BRERSU1BBQ0VfSCAqLworCisKKworCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9oYXJkaXJxLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaGFyZGlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwN2M3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaGFyZGlycS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvaGFyZGlycS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9IQVJESVJRX0gKKyNkZWZpbmUgX1hURU5TQV9IQVJESVJRX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisvKiBoZWFkZXJzLlMgaXMgc2Vuc2l0aXZlIHRvIHRoZSBvZmZzZXRzIG9mIHRoZXNlIGZpZWxkcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKKwl1bnNpZ25lZCBpbnQgX19zeXNjYWxsX2NvdW50OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqIF9fa3NvZnRpcnFkX3Rhc2s7IC8qIHdhaXRxdWV1ZSBpcyB0b28gbGFyZ2UgKi8KKwl1bnNpZ25lZCBpbnQgX19ubWlfY291bnQ7CSAgICAgICAvKiBhcmNoIGRlcGVuZGVudCAqLworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQgaXJxX2NwdXN0YXRfdDsKKworI2luY2x1ZGUgPGxpbnV4L2lycV9jcHVzdGF0Lmg+CS8qIFN0YW5kYXJkIG1hcHBpbmdzIGZvciBpcnFfY3B1c3RhdF90IGFib3ZlICovCisKKyNlbmRpZgkvKiBfWFRFTlNBX0hBUkRJUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2hkcmVnLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaGRyZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI4MDYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2hkcmVnLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9oZHJlZy5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYgIExpbnVzIFRvcnZhbGRzICYgYXV0aG9ycworICovCisKKyNpZm5kZWYgX1hURU5TQV9IRFJFR19ICisjZGVmaW5lIF9YVEVOU0FfSERSRUdfSAorCit0eXBlZGVmIHVuc2lnbmVkIGludCBpZGVfaW9yZWdfdDsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaGlnaG1lbS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2hpZ2htZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA0NmNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2hpZ2htZW0uaApAQCAtMCwwICsxLDE3IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2hpZ2htZW0uaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfSElHSE1FTV9ICisjZGVmaW5lIF9YVEVOU0FfSElHSE1FTV9ICisKK2V4dGVybiB2b2lkIGZsdXNoX2NhY2hlX2ttYXBzKHZvaWQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2h3X2lycS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2h3X2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZjQzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaHdfaXJxLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9od19pcnEuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfSFdfSVJRX0gKKyNkZWZpbmUgX1hURU5TQV9IV19JUlFfSAorCitzdGF0aWMgaW5saW5lIHZvaWQgaHdfcmVzZW5kX2lycShzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgKmgsIHVuc2lnbmVkIGludCBpKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pZGUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTIzY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2lkZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvaWRlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQgLSAxOTk2ICBMaW51cyBUb3J2YWxkcyAmIGF1dGhvcnMKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfSURFX0gKKyNkZWZpbmUgX1hURU5TQV9JREVfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZm5kZWYgTUFYX0hXSUZTCisjIGRlZmluZSBNQVhfSFdJRlMJMQorI2VuZGlmCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpZGVfZGVmYXVsdF9pcnEodW5zaWduZWQgbG9uZyBiYXNlKQoreworCS8qIFVuc3VwcG9ydGVkISAqLworICAJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgaWRlX2RlZmF1bHRfaW9fYmFzZShpbnQgaW5kZXgpCit7CisJLyogVW5zdXBwb3J0ZWQhICovCisgIAlyZXR1cm4gMDsKK30KKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX0lERV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvaW8uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDcxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaW8uaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLXh0ZW5zYS9pby5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9JT19ICisjZGVmaW5lIF9YVEVOU0FfSU9fSAorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorCisjZGVmaW5lIF9JT19CQVNFIDAKKworCisvKgorICogc3dhcCBmdW5jdGlvbnMgdG8gY2hhbmdlIGJ5dGUgb3JkZXIgZnJvbSBsaXR0bGUtZW5kaWFuIHRvIGJpZy1lbmRpYW4gYW5kCisgKiB2aWNlIHZlcnNhLgorICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgX3N3YXB3ICh1bnNpZ25lZCBzaG9ydCB2KQoreworCXJldHVybiAodiA8PCA4KSB8ICh2ID4+IDgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfc3dhcGwgKHVuc2lnbmVkIGludCB2KQoreworCXJldHVybiAodiA8PCAyNCkgfCAoKHYgJiAweGZmMDApIDw8IDgpIHwgKCh2ID4+IDgpICYgMHhmZjAwKSB8ICh2ID4+IDI0KTsKK30KKworLyoKKyAqIENoYW5nZSB2aXJ0dWFsIGFkZHJlc3NlcyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIHZ2LgorICogVGhlc2UgYXJlIHRyaXZpYWwgb24gdGhlIDE6MSBMaW51eC9YdGVuc2EgbWFwcGluZworICovCisKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyB2aXJ0X3RvX3BoeXModm9sYXRpbGUgdm9pZCAqIGFkZHJlc3MpCit7CisJcmV0dXJuIFBIWVNBRERSKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgKiBwaHlzX3RvX3ZpcnQodW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiAodm9pZCopIENBQ0hFRF9BRERSKGFkZHJlc3MpOworfQorCisvKgorICogSU8gYnVzIG1lbW9yeSBhZGRyZXNzZXMgYXJlIGFsc28gMToxIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3MKKyAqLworCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgdmlydF90b19idXModm9sYXRpbGUgdm9pZCAqIGFkZHJlc3MpCit7CisJcmV0dXJuIFBIWVNBRERSKCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgKiBidXNfdG9fdmlydCAodW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXJldHVybiAodm9pZCAqKSBDQUNIRURfQUREUihhZGRyZXNzKTsKK30KKworLyoKKyAqIENoYW5nZSAic3RydWN0IHBhZ2UiIHRvIHBoeXNpY2FsIGFkZHJlc3MuCisgKi8KKworZXh0ZXJuIGlubGluZSB2b2lkICppb3JlbWFwKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgICAgIHJldHVybiAodm9pZCAqKSBDQUNIRURfQUREUl9JTyhvZmZzZXQpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgKmlvcmVtYXBfbm9jYWNoZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQoreworICAgICAgICByZXR1cm4gKHZvaWQgKikgQllQQVNTX0FERFJfSU8ob2Zmc2V0KTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIGlvdW5tYXAodm9pZCAqYWRkcikKK3sKK30KKworLyoKKyAqIEdlbmVyaWMgSS9PCisgKi8KKworI2RlZmluZSByZWFkYihhZGRyKSBcCisJKHsgdW5zaWduZWQgY2hhciBfX3YgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKGFkZHIpKTsgX192OyB9KQorI2RlZmluZSByZWFkdyhhZGRyKSBcCisJKHsgdW5zaWduZWQgc2hvcnQgX192ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoYWRkcikpOyBfX3Y7IH0pCisjZGVmaW5lIHJlYWRsKGFkZHIpIFwKKwkoeyB1bnNpZ25lZCBpbnQgX192ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKGFkZHIpKTsgX192OyB9KQorI2RlZmluZSB3cml0ZWIoYiwgYWRkcikgKHZvaWQpKCgqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoYWRkcikpID0gKGIpKQorI2RlZmluZSB3cml0ZXcoYiwgYWRkcikgKHZvaWQpKCgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKGFkZHIpKSA9IChiKSkKKyNkZWZpbmUgd3JpdGVsKGIsIGFkZHIpICh2b2lkKSgoKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoYWRkcikpID0gKGIpKQorCitzdGF0aWMgaW5saW5lIF9fdTggX19yYXdfcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworICAgICAgICAgIHJldHVybiAqKF9fZm9yY2Ugdm9sYXRpbGUgX191OCAqKShhZGRyKTsKK30KK3N0YXRpYyBpbmxpbmUgX191MTYgX19yYXdfcmVhZHcoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQoreworICAgICAgICAgIHJldHVybiAqKF9fZm9yY2Ugdm9sYXRpbGUgX191MTYgKikoYWRkcik7Cit9CitzdGF0aWMgaW5saW5lIF9fdTMyIF9fcmF3X3JlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKyAgICAgICAgICByZXR1cm4gKihfX2ZvcmNlIHZvbGF0aWxlIF9fdTMyICopKGFkZHIpOworfQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlYihfX3U4IGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKyAgICAgICAgICAqKF9fZm9yY2Ugdm9sYXRpbGUgX191OCAqKShhZGRyKSA9IGI7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGV3KF9fdTE2IGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKyAgICAgICAgICAqKF9fZm9yY2Ugdm9sYXRpbGUgX191MTYgKikoYWRkcikgPSBiOworfQorc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlbChfX3UzMiBiLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisgICAgICAgICAgKihfX2ZvcmNlIHZvbGF0aWxlIF9fdTMyICopKGFkZHIpID0gYjsKK30KKworCisKKworLyogVGhlc2UgYXJlIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIHg4NiBJTyBpbnN0cnVjdGlvbnMKKyAqIGluYi9pbncvaW5sL291dGIvb3V0dy9vdXRsLCB0aGUgInN0cmluZyIgdmVyc2lvbnMKKyAqIGluc2IvaW5zdy9pbnNsL291dHNiL291dHN3L291dHNsLCBhbmQgdGhlICJwYXVzaW5nIiB2ZXJzaW9ucworICogaW5iX3AvaW53X3AvLi4uCisgKiBUaGUgbWFjcm9zIGRvbid0IGRvIGJ5dGUtc3dhcHBpbmcuCisgKi8KKworI2RlZmluZSBpbmIocG9ydCkJCXJlYWRiKCh1OCAqKSgocG9ydCkrX0lPX0JBU0UpKQorI2RlZmluZSBvdXRiKHZhbCwgcG9ydCkJCXdyaXRlYigodmFsKSwodTggKikoKHVuc2lnbmVkIGxvbmcpKHBvcnQpK19JT19CQVNFKSkKKyNkZWZpbmUgaW53KHBvcnQpCQlyZWFkdygodTE2ICopKChwb3J0KStfSU9fQkFTRSkpCisjZGVmaW5lIG91dHcodmFsLCBwb3J0KQkJd3JpdGV3KCh2YWwpLCh1MTYgKikoKHVuc2lnbmVkIGxvbmcpKHBvcnQpK19JT19CQVNFKSkKKyNkZWZpbmUgaW5sKHBvcnQpCQlyZWFkbCgodTMyICopKChwb3J0KStfSU9fQkFTRSkpCisjZGVmaW5lIG91dGwodmFsLCBwb3J0KQkJd3JpdGVsKCh2YWwpLCh1MzIgKikoKHVuc2lnbmVkIGxvbmcpKHBvcnQpKSkKKworI2RlZmluZSBpbmJfcChwb3J0KQkJaW5iKChwb3J0KSkKKyNkZWZpbmUgb3V0Yl9wKHZhbCwgcG9ydCkJb3V0YigodmFsKSwgKHBvcnQpKQorI2RlZmluZSBpbndfcChwb3J0KQkJaW53KChwb3J0KSkKKyNkZWZpbmUgb3V0d19wKHZhbCwgcG9ydCkJb3V0dygodmFsKSwgKHBvcnQpKQorI2RlZmluZSBpbmxfcChwb3J0KQkJaW5sKChwb3J0KSkKKyNkZWZpbmUgb3V0bF9wKHZhbCwgcG9ydCkJb3V0bCgodmFsKSwgKHBvcnQpKQorCitleHRlcm4gdm9pZCBpbnNiICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBpbnN3ICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBpbnNsICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBvdXRzYiAodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOworZXh0ZXJuIHZvaWQgb3V0c3cgKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKK2V4dGVybiB2b2lkIG91dHNsICh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCk7CisKKyNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgfjAKKworI2RlZmluZSBtZW1zZXRfaW8oYSxiLGMpICAgICAgIG1lbXNldCgodm9pZCAqKShhKSwoYiksKGMpKQorI2RlZmluZSBtZW1jcHlfZnJvbWlvKGEsYixjKSAgIG1lbWNweSgoYSksKHZvaWQgKikoYiksKGMpKQorI2RlZmluZSBtZW1jcHlfdG9pbyhhLGIsYykgICAgICBtZW1jcHkoKHZvaWQgKikoYSksKGIpLChjKSkKKworLyogQXQgdGhpcyBwb2ludCB0aGUgWHRlbnNhIGRvZXNuJ3QgcHJvdmlkZSBieXRlIHN3YXAgaW5zdHJ1Y3Rpb25zICovCisKKyNpZmRlZiBfX1hURU5TQV9FQl9fCisjIGRlZmluZSBpbl84KGFkZHIpICgqKHU4KikoYWRkcikpCisjIGRlZmluZSBpbl9sZTE2KGFkZHIpIF9zd2FwdygqKHUxNiopKGFkZHIpKQorIyBkZWZpbmUgaW5fbGUzMihhZGRyKSBfc3dhcGwoKih1MzIqKShhZGRyKSkKKyMgZGVmaW5lIG91dF84KGIsIGFkZHIpICoodTgqKShhZGRyKSA9IChiKQorIyBkZWZpbmUgb3V0X2xlMTYoYiwgYWRkcikgKih1MTYqKShhZGRyKSA9IF9zd2FwdyhiKQorIyBkZWZpbmUgb3V0X2xlMzIoYiwgYWRkcikgKih1MzIqKShhZGRyKSA9IF9zd2FwbChiKQorI2VsaWYgZGVmaW5lZChfX1hURU5TQV9FTF9fKQorIyBkZWZpbmUgaW5fOChhZGRyKSAgKCoodTgqKShhZGRyKSkKKyMgZGVmaW5lIGluX2xlMTYoYWRkcikgKCoodTE2KikoYWRkcikpCisjIGRlZmluZSBpbl9sZTMyKGFkZHIpICgqKHUzMiopKGFkZHIpKQorIyBkZWZpbmUgb3V0XzgoYiwgYWRkcikgKih1OCopKGFkZHIpID0gKGIpCisjIGRlZmluZSBvdXRfbGUxNihiLCBhZGRyKSAqKHUxNiopKGFkZHIpID0gKGIpCisjIGRlZmluZSBvdXRfbGUzMihiLCBhZGRyKSAqKHUzMiopKGFkZHIpID0gKGIpCisjZWxzZQorIyBlcnJvciBwcm9jZXNzb3IgYnl0ZSBvcmRlciB1bmRlZmluZWQhCisjZW5kaWYKKworCisvKgorICogICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQorICogICAqIGFjY2VzcworICogICAgKi8KKyNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkgICAgX192YShwKQorCisvKgorICogICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgorICogICAqLworI2RlZmluZSB4bGF0ZV9kZXZfa21lbV9wdHIocCkgICBwCisKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9YVEVOU0FfSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lvY3RsLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTZjNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2lvY3RsLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICoKKyAqIERlcml2ZWQgZnJvbSAiaW5jbHVkZS9hc20taTM4Ni9pb2N0bC5oIgorICovCisKKyNpZm5kZWYgX1hURU5TQV9JT0NUTF9ICisjZGVmaW5lIF9YVEVOU0FfSU9DVExfSAorCisKKy8qIGlvY3RsIGNvbW1hbmQgZW5jb2Rpbmc6IDMyIGJpdHMgdG90YWwsIGNvbW1hbmQgaW4gbG93ZXIgMTYgYml0cywKKyAqIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGxvd2VyIDE0IGJpdHMgb2YgdGhlCisgKiB1cHBlciAxNiBiaXRzLgorICogRW5jb2RpbmcgdGhlIHNpemUgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgaW4gdGhlIGlvY3RsIHJlcXVlc3QKKyAqIGlzIHVzZWZ1bCBmb3IgY2F0Y2hpbmcgcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCBvbGQgdmVyc2lvbnMKKyAqIGFuZCB0byBhdm9pZCBvdmVyd3JpdGluZyB1c2VyIHNwYWNlIG91dHNpZGUgdGhlIHVzZXIgYnVmZmVyIGFyZWEuCisgKiBUaGUgaGlnaGVzdCAyIGJpdHMgYXJlIHJlc2VydmVkIGZvciBpbmRpY2F0aW5nIHRoZSBgYGFjY2VzcyBtb2RlJycuCisgKiBOT1RFOiBUaGlzIGxpbWl0cyB0aGUgbWF4IHBhcmFtZXRlciBzaXplIHRvIDE2a0IgLTEgIQorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIGZvciBjb21wYXRpYmlsaXR5IGFjcm9zcyB0aGUgdmFyaW91cyBMaW51eAorICogcGxhdGZvcm1zLiAgVGhlIGkzODYgaW9jdGwgbnVtYmVyaW5nIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBlbmZvcmNlCisgKiBhIHR5cGUgZmllbGQuICBEZSBmYWN0bywgaG93ZXZlciwgdGhlIHRvcCA4IGJpdHMgb2YgdGhlIGxvd2VyIDE2CisgKiBiaXRzIGFyZSBpbmRlZWQgdXNlZCBhcyBhIHR5cGUgZmllbGQsIHNvIHdlIG1pZ2h0IGp1c3QgYXMgd2VsbCBtYWtlCisgKiB0aGlzIGV4cGxpY2l0IGhlcmUuICBQbGVhc2UgYmUgc3VyZSB0byB1c2UgdGhlIGRlY29kaW5nIG1hY3JvcworICogYmVsb3cgZnJvbSBub3cgb24uCisgKi8KKyNkZWZpbmUgX0lPQ19OUkJJVFMJOAorI2RlZmluZSBfSU9DX1RZUEVCSVRTCTgKKyNkZWZpbmUgX0lPQ19TSVpFQklUUwkxNAorI2RlZmluZSBfSU9DX0RJUkJJVFMJMgorCisjZGVmaW5lIF9JT0NfTlJNQVNLCSgoMSA8PCBfSU9DX05SQklUUyktMSkKKyNkZWZpbmUgX0lPQ19UWVBFTUFTSwkoKDEgPDwgX0lPQ19UWVBFQklUUyktMSkKKyNkZWZpbmUgX0lPQ19TSVpFTUFTSwkoKDEgPDwgX0lPQ19TSVpFQklUUyktMSkKKyNkZWZpbmUgX0lPQ19ESVJNQVNLCSgoMSA8PCBfSU9DX0RJUkJJVFMpLTEpCisKKyNkZWZpbmUgX0lPQ19OUlNISUZUCTAKKyNkZWZpbmUgX0lPQ19UWVBFU0hJRlQJKF9JT0NfTlJTSElGVCtfSU9DX05SQklUUykKKyNkZWZpbmUgX0lPQ19TSVpFU0hJRlQJKF9JT0NfVFlQRVNISUZUK19JT0NfVFlQRUJJVFMpCisjZGVmaW5lIF9JT0NfRElSU0hJRlQJKF9JT0NfU0laRVNISUZUK19JT0NfU0laRUJJVFMpCisKKy8qCisgKiBEaXJlY3Rpb24gYml0cy4KKyAqLworI2RlZmluZSBfSU9DX05PTkUJMFUKKyNkZWZpbmUgX0lPQ19XUklURQkxVQorI2RlZmluZSBfSU9DX1JFQUQJMlUKKworI2RlZmluZSBfSU9DKGRpcix0eXBlLG5yLHNpemUpIFwKKwkoKChkaXIpICA8PCBfSU9DX0RJUlNISUZUKSB8IFwKKwkgKCh0eXBlKSA8PCBfSU9DX1RZUEVTSElGVCkgfCBcCisJICgobnIpICAgPDwgX0lPQ19OUlNISUZUKSB8IFwKKwkgKChzaXplKSA8PCBfSU9DX1NJWkVTSElGVCkpCisKKy8qIHVzZWQgdG8gY3JlYXRlIG51bWJlcnMgKi8KKyNkZWZpbmUgX0lPKHR5cGUsbnIpCQlfSU9DKF9JT0NfTk9ORSwodHlwZSksKG5yKSwwKQorI2RlZmluZSBfSU9SKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1JFQUQsKHR5cGUpLChuciksc2l6ZW9mKHNpemUpKQorI2RlZmluZSBfSU9XKHR5cGUsbnIsc2l6ZSkJX0lPQyhfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKyNkZWZpbmUgX0lPV1IodHlwZSxucixzaXplKQlfSU9DKF9JT0NfUkVBRHxfSU9DX1dSSVRFLCh0eXBlKSwobnIpLHNpemVvZihzaXplKSkKKworLyogdXNlZCB0byBkZWNvZGUgaW9jdGwgbnVtYmVycy4uICovCisjZGVmaW5lIF9JT0NfRElSKG5yKQkJKCgobnIpID4+IF9JT0NfRElSU0hJRlQpICYgX0lPQ19ESVJNQVNLKQorI2RlZmluZSBfSU9DX1RZUEUobnIpCQkoKChucikgPj4gX0lPQ19UWVBFU0hJRlQpICYgX0lPQ19UWVBFTUFTSykKKyNkZWZpbmUgX0lPQ19OUihucikJCSgoKG5yKSA+PiBfSU9DX05SU0hJRlQpICYgX0lPQ19OUk1BU0spCisjZGVmaW5lIF9JT0NfU0laRShucikJCSgoKG5yKSA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLKQorCisvKiAuLi5hbmQgZm9yIHRoZSBkcml2ZXJzL3NvdW5kIGZpbGVzLi4uICovCisKKyNkZWZpbmUgSU9DX0lOCQkoX0lPQ19XUklURSA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NfT1VUCQkoX0lPQ19SRUFEIDw8IF9JT0NfRElSU0hJRlQpCisjZGVmaW5lIElPQ19JTk9VVAkoKF9JT0NfV1JJVEV8X0lPQ19SRUFEKSA8PCBfSU9DX0RJUlNISUZUKQorI2RlZmluZSBJT0NTSVpFX01BU0sJKF9JT0NfU0laRU1BU0sgPDwgX0lPQ19TSVpFU0hJRlQpCisjZGVmaW5lIElPQ1NJWkVfU0hJRlQJKF9JT0NfU0laRVNISUZUKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bHMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9pb2N0bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM0NDM0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL2lvY3Rscy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL2lvY3RsLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogRGVyaXZlZCBmcm9tICJpbmNsdWRlL2FzbS1pMzg2L2lvY3Rscy5oIgorICovCisKKyNpZm5kZWYgX1hURU5TQV9JT0NUTFNfSAorI2RlZmluZSBfWFRFTlNBX0lPQ1RMU19ICisKKyNpbmNsdWRlIDxhc20vaW9jdGwuaD4KKworI2RlZmluZSBGSU9DTEVYCQlfSU8oJ2YnLCAxKQorI2RlZmluZSBGSU9OQ0xFWAlfSU8oJ2YnLCAyKQorI2RlZmluZSBGSU9BU1lOQwlfSU9XKCdmJywgMTI1LCBpbnQpCisjZGVmaW5lIEZJT05CSU8JCV9JT1coJ2YnLCAxMjYsIGludCkKKyNkZWZpbmUgRklPTlJFQUQJX0lPUignZicsIDEyNywgaW50KQorI2RlZmluZSBUSU9DSU5RCQlGSU9OUkVBRAorI2RlZmluZSBGSU9RU0laRQlfSU9SKCdmJywgMTI4LCBsb2ZmX3QpCisKKyNkZWZpbmUgVENHRVRTCQkweDU0MDEKKyNkZWZpbmUgVENTRVRTCQkweDU0MDIKKyNkZWZpbmUgVENTRVRTVwkJMHg1NDAzCisjZGVmaW5lIFRDU0VUU0YJCTB4NTQwNAorCisjZGVmaW5lIFRDR0VUQQkJX0lPUigndCcsIDIzLCBzdHJ1Y3QgdGVybWlvKQorI2RlZmluZSBUQ1NFVEEJCV9JT1coJ3QnLCAyNCwgc3RydWN0IHRlcm1pbykKKyNkZWZpbmUgVENTRVRBVwkJX0lPVygndCcsIDI1LCBzdHJ1Y3QgdGVybWlvKQorI2RlZmluZSBUQ1NFVEFGCQlfSU9XKCd0JywgMjgsIHN0cnVjdCB0ZXJtaW8pCisKKyNkZWZpbmUgVENTQlJLCQlfSU8oJ3QnLCAyOSkKKyNkZWZpbmUgVENYT05DCQlfSU8oJ3QnLCAzMCkKKyNkZWZpbmUgVENGTFNICQlfSU8oJ3QnLCAzMSkKKworI2RlZmluZSBUSU9DU1dJTlNaCV9JT1coJ3QnLCAxMDMsIHN0cnVjdCB3aW5zaXplKQorI2RlZmluZSBUSU9DR1dJTlNaCV9JT1IoJ3QnLCAxMDQsIHN0cnVjdCB3aW5zaXplKQorI2RlZmluZQlUSU9DU1RBUlQJX0lPKCd0JywgMTEwKQkJLyogc3RhcnQgb3V0cHV0LCBsaWtlIF5RICovCisjZGVmaW5lCVRJT0NTVE9QCV9JTygndCcsIDExMSkJCS8qIHN0b3Agb3V0cHV0LCBsaWtlIF5TICovCisjZGVmaW5lIFRJT0NPVVRRICAgICAgICBfSU9SKCd0JywgMTE1LCBpbnQpICAgICAvKiBvdXRwdXQgcXVldWUgc2l6ZSAqLworCisjZGVmaW5lIFRJT0NTUEdSUAlfSU9XKCd0JywgMTE4LCBpbnQpCisjZGVmaW5lIFRJT0NHUEdSUAlfSU9SKCd0JywgMTE5LCBpbnQpCisKKyNkZWZpbmUgVElPQ0VYQ0wJX0lPKCdUJywgMTIpCisjZGVmaW5lIFRJT0NOWENMCV9JTygnVCcsIDEzKQorI2RlZmluZSBUSU9DU0NUVFkJX0lPKCdUJywgMTQpCisKKyNkZWZpbmUgVElPQ1NUSQkJX0lPVygnVCcsIDE4LCBjaGFyKQorI2RlZmluZSBUSU9DTUdFVAlfSU9SKCdUJywgMjEsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgVElPQ01CSVMJX0lPVygnVCcsIDIyLCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFRJT0NNQklDCV9JT1coJ1QnLCAyMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBUSU9DTVNFVAlfSU9XKCdUJywgMjQsIHVuc2lnbmVkIGludCkKKyMgZGVmaW5lIFRJT0NNX0xFCTB4MDAxCisjIGRlZmluZSBUSU9DTV9EVFIJMHgwMDIKKyMgZGVmaW5lIFRJT0NNX1JUUwkweDAwNAorIyBkZWZpbmUgVElPQ01fU1QJMHgwMDgKKyMgZGVmaW5lIFRJT0NNX1NSCTB4MDEwCisjIGRlZmluZSBUSU9DTV9DVFMJMHgwMjAKKyMgZGVmaW5lIFRJT0NNX0NBUgkweDA0MAorIyBkZWZpbmUgVElPQ01fUk5HCTB4MDgwCisjIGRlZmluZSBUSU9DTV9EU1IJMHgxMDAKKyMgZGVmaW5lIFRJT0NNX0NECVRJT0NNX0NBUgorIyBkZWZpbmUgVElPQ01fUkkJVElPQ01fUk5HCisKKyNkZWZpbmUgVElPQ0dTT0ZUQ0FSCV9JT1IoJ1QnLCAyNSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBUSU9DU1NPRlRDQVIJX0lPVygnVCcsIDI2LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIFRJT0NMSU5VWAlfSU9XKCdUJywgMjgsIGNoYXIpCisjZGVmaW5lIFRJT0NDT05TCV9JTygnVCcsIDI5KQorI2RlZmluZSBUSU9DR1NFUklBTAlfSU9SKCdUJywgMzAsIHN0cnVjdCBzZXJpYWxfc3RydWN0KQorI2RlZmluZSBUSU9DU1NFUklBTAlfSU9XKCdUJywgMzEsIHN0cnVjdCBzZXJpYWxfc3RydWN0KQorI2RlZmluZSBUSU9DUEtUCQlfSU9XKCdUJywgMzIsIGludCkKKyMgZGVmaW5lIFRJT0NQS1RfREFUQQkJIDAKKyMgZGVmaW5lIFRJT0NQS1RfRkxVU0hSRUFECSAxCisjIGRlZmluZSBUSU9DUEtUX0ZMVVNIV1JJVEUJIDIKKyMgZGVmaW5lIFRJT0NQS1RfU1RPUAkJIDQKKyMgZGVmaW5lIFRJT0NQS1RfU1RBUlQJCSA4CisjIGRlZmluZSBUSU9DUEtUX05PU1RPUAkJMTYKKyMgZGVmaW5lIFRJT0NQS1RfRE9TVE9QCQkzMgorCisKKyNkZWZpbmUgVElPQ05PVFRZCV9JTygnVCcsIDM0KQorI2RlZmluZSBUSU9DU0VURAlfSU9XKCdUJywgMzUsIGludCkKKyNkZWZpbmUgVElPQ0dFVEQJX0lPUignVCcsIDM2LCBpbnQpCisjZGVmaW5lIFRDU0JSS1AJCV9JT1coJ1QnLCAzNywgaW50KSAgIC8qIE5lZWRlZCBmb3IgUE9TSVggdGNzZW5kYnJlYWsoKSovCisjZGVmaW5lIFRJT0NUVFlHU1RSVUNUCV9JT1IoJ1QnLCAzOCwgc3RydWN0IHR0eV9zdHJ1Y3QpIC8qIEZvciBkZWJ1Z2dpbmcgb25seSovCisjZGVmaW5lIFRJT0NTQlJLCV9JTygnVCcsIDM5KSAJICAgICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUSU9DQ0JSSwlfSU8oJ1QnLCA0MCkJICAgICAvKiBCU0QgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUSU9DR1NJRAlfSU9SKCdUJywgNDEsIHBpZF90KSAvKiBSZXR1cm4gdGhlIHNlc3Npb24gSUQgb2YgRkQqLworI2RlZmluZSBUSU9DR1BUTglfSU9SKCdUJywweDMwLCB1bnNpZ25lZCBpbnQpIC8qIEdldCBQdHkgTnVtYmVyIChvZiBwdHktbXV4IGRldmljZSkgKi8KKyNkZWZpbmUgVElPQ1NQVExDSwlfSU9XKCdUJywweDMxLCBpbnQpICAvKiBMb2NrL3VubG9jayBQdHkgKi8KKworI2RlZmluZSBUSU9DU0VSQ09ORklHCV9JTygnVCcsIDgzKQorI2RlZmluZSBUSU9DU0VSR1dJTEQJX0lPUignVCcsIDg0LCAgaW50KQorI2RlZmluZSBUSU9DU0VSU1dJTEQJX0lPVygnVCcsIDg1LCAgaW50KQorI2RlZmluZSBUSU9DR0xDS1RSTUlPUwkweDU0NTYKKyNkZWZpbmUgVElPQ1NMQ0tUUk1JT1MJMHg1NDU3CisjZGVmaW5lIFRJT0NTRVJHU1RSVUNUCTB4NTQ1OAkJICAgICAvKiBGb3IgZGVidWdnaW5nIG9ubHkgKi8KKyNkZWZpbmUgVElPQ1NFUkdFVExTUiAgIF9JT1IoJ1QnLCA4OSwgdW5zaWduZWQgaW50KSAvKiBHZXQgbGluZSBzdGF0dXMgcmVnLiAqLworICAvKiBpb2N0bCAoZmQsIFRJT0NTRVJHRVRMU1IsICZyZXN1bHQpIHdoZXJlIHJlc3VsdCBtYXkgYmUgYXMgYmVsb3cgKi8KKyMgZGVmaW5lIFRJT0NTRVJfVEVNVCAgICAweDAxCQkgICAgIC8qIFRyYW5zbWl0dGVyIHBoeXNpY2FsbHkgZW1wdHkgKi8KKyNkZWZpbmUgVElPQ1NFUkdFVE1VTFRJIF9JT1IoJ1QnLCA5MCwgc3RydWN0IHNlcmlhbF9tdWx0aXBvcnRfc3RydWN0KSAvKiBHZXQgbXVsdGlwb3J0IGNvbmZpZyAgKi8KKyNkZWZpbmUgVElPQ1NFUlNFVE1VTFRJIF9JT1coJ1QnLCA5MSwgc3RydWN0IHNlcmlhbF9tdWx0aXBvcnRfc3RydWN0KSAvKiBTZXQgbXVsdGlwb3J0IGNvbmZpZyAqLworCisjZGVmaW5lIFRJT0NNSVdBSVQJX0lPKCdUJywgOTIpIC8qIHdhaXQgZm9yIGEgY2hhbmdlIG9uIHNlcmlhbCBpbnB1dCBsaW5lKHMpICovCisjZGVmaW5lIFRJT0NHSUNPVU5UCV9JT1IoJ1QnLCA5Mywgc3RydWN0IGFzeW5jX2ljb3VudCkgLyogcmVhZCBzZXJpYWwgcG9ydCBpbmxpbmUgaW50ZXJydXB0IGNvdW50cyAqLworCisjZW5kaWYgLyogX1hURU5TQV9JT0NUTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lwY2J1Zi5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2lwY2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzM2FhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaXBjYnVmLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9pcGNidWYuaAorICoKKyAqIFRoZSBpcGM2NF9wZXJtIHN0cnVjdHVyZSBmb3IgdGhlIFh0ZW5zYSBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfSVBDQlVGX0gKKyNkZWZpbmUgX1hURU5TQV9JUENCVUZfSAorCisvKgorICogUGFkIHNwYWNlIGlzIGxlZnQgZm9yOgorICogLSAzMi1iaXQgbW9kZV90IGFuZCBzZXEKKyAqIC0gMiBtaXNjZWxsYW5lb3VzIDMyLWJpdCB2YWx1ZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitzdHJ1Y3QgaXBjNjRfcGVybQoreworCV9fa2VybmVsX2tleV90CQlrZXk7CisJX19rZXJuZWxfdWlkMzJfdAl1aWQ7CisJX19rZXJuZWxfZ2lkMzJfdAlnaWQ7CisJX19rZXJuZWxfdWlkMzJfdAljdWlkOworCV9fa2VybmVsX2dpZDMyX3QJY2dpZDsKKwlfX2tlcm5lbF9tb2RlX3QJCW1vZGU7CisJdW5zaWduZWQgbG9uZwkJc2VxOworCXVuc2lnbmVkIGxvbmcJCV9fdW51c2VkMTsKKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDI7Cit9OworCisjZW5kaWYgLyogX1hURU5TQV9JUENCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2lycS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2lycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODRlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvaXJxLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9pcnEuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfSVJRX0gKKyNkZWZpbmUgX1hURU5TQV9JUlFfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL2NvcmUuaD4KKworI2lmbmRlZiBQTEFURk9STV9OUl9JUlFTCisjIGRlZmluZSBQTEFURk9STV9OUl9JUlFTIDAKKyNlbmRpZgorI2RlZmluZSBYVEVOU0FfTlJfSVJRUyBYQ0hBTF9OVU1fSU5URVJSVVBUUworI2RlZmluZSBOUl9JUlFTIChYVEVOU0FfTlJfSVJRUyArIFBMQVRGT1JNX05SX0lSUVMpCisKK3N0YXRpYyBfX2lubGluZV9fIGludCBpcnFfY2Fub25pY2FsaXplKGludCBpcnEpCit7CisJcmV0dXJuIChpcnEpOworfQorCitzdHJ1Y3QgaXJxYWN0aW9uOworI2lmIDAgLy8gRklYTUUKK2V4dGVybiB2b2lkIGRpc2FibGVfaXJxX25vc3luYyh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGVuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKKyNlbmRpZgorCisjZW5kaWYJLyogX1hURU5TQV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL2ttYXBfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9rbWFwX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4MjJkMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9rbWFwX3R5cGVzLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9rbWFwX3R5cGVzLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX0tNQVBfVFlQRVNfSAorI2RlZmluZSBfWFRFTlNBX0tNQVBfVFlQRVNfSAorCitlbnVtIGttX3R5cGUgeworICBLTV9CT1VOQ0VfUkVBRCwKKyAgS01fU0tCX1NVTlJQQ19EQVRBLAorICBLTV9TS0JfREFUQV9TT0ZUSVJRLAorICBLTV9VU0VSMCwKKyAgS01fVVNFUjEsCisgIEtNX0JJT19TUkNfSVJRLAorICBLTV9CSU9fRFNUX0lSUSwKKyAgS01fUFRFMCwKKyAgS01fUFRFMSwKKyAgS01fSVJRMCwKKyAgS01fSVJRMSwKKyAgS01fU09GVElSUTAsCisgIEtNX1NPRlRJUlExLAorICBLTV9UWVBFX05SCit9OworCisjZW5kaWYJLyogX1hURU5TQV9LTUFQX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9saW5rYWdlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbGlua2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjEyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvbGlua2FnZS5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvbGlua2FnZS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9MSU5LQUdFX0gKKyNkZWZpbmUgX1hURU5TQV9MSU5LQUdFX0gKKworLyogTm90aGluZyB0byBkbyBoZXJlIC4uLiAqLworCisjZW5kaWYJLyogX1hURU5TQV9MSU5LQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9sb2NhbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL2xvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3MjNlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9sb2NhbC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvbG9jYWwuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfTE9DQUxfSAorI2RlZmluZSBfWFRFTlNBX0xPQ0FMX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2xvY2FsLmg+CisKKyNlbmRpZiAvKiBfWFRFTlNBX0xPQ0FMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbWFuLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOTVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvbW1hbi5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvbW1hbi5oCisgKgorICogWHRlbnNhIFByb2Nlc3NvciBtZW1vcnktbWFuYWdlciBkZWZpbml0aW9ucworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSBieSBSYWxmIEJhZWNobGUKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfTU1BTl9ICisjZGVmaW5lIF9YVEVOU0FfTU1BTl9ICisKKy8qCisgKiBQcm90ZWN0aW9ucyBhcmUgY2hvc2VuIGZyb20gdGhlc2UgYml0cywgT1InZCB0b2dldGhlci4gIFRoZQorICogaW1wbGVtZW50YXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydCBQUk9UX0VYRUMgb3IgUFJPVF9XUklURQorICogd2l0aG91dCBQUk9UX1JFQUQuICBUaGUgb25seSBndWFyYW50ZWVzIGFyZSB0aGF0IG5vIHdyaXRpbmcgd2lsbCBiZQorICogYWxsb3dlZCB3aXRob3V0IFBST1RfV1JJVEUgYW5kIG5vIGFjY2VzcyB3aWxsIGJlIGFsbG93ZWQgZm9yIFBST1RfTk9ORS4KKyAqLworCisjZGVmaW5lIFBST1RfTk9ORQkweDAJCS8qIHBhZ2UgY2FuIG5vdCBiZSBhY2Nlc3NlZCAqLworI2RlZmluZSBQUk9UX1JFQUQJMHgxCQkvKiBwYWdlIGNhbiBiZSByZWFkICovCisjZGVmaW5lIFBST1RfV1JJVEUJMHgyCQkvKiBwYWdlIGNhbiBiZSB3cml0dGVuICovCisjZGVmaW5lIFBST1RfRVhFQwkweDQJCS8qIHBhZ2UgY2FuIGJlIGV4ZWN1dGVkICovCisKKyNkZWZpbmUgUFJPVF9TRU0JMHgxMAkJLyogcGFnZSBtYXkgYmUgdXNlZCBmb3IgYXRvbWljIG9wcyAqLworI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gc3RhcnQgb2YgZ3Jvd3Nkb3duIHZtYSAqLworI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAkvKiBtcHJvdGVjdCBmbGFnOiBleHRlbmQgY2hhbmdlIHRvIGVuZCBmbyBncm93c3VwIHZtYSAqLworCisvKgorICogRmxhZ3MgZm9yIG1tYXAKKyAqLworI2RlZmluZSBNQVBfU0hBUkVECTB4MDAxCQkvKiBTaGFyZSBjaGFuZ2VzICovCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDAyCQkvKiBDaGFuZ2VzIGFyZSBwcml2YXRlICovCisjZGVmaW5lIE1BUF9UWVBFCTB4MDBmCQkvKiBNYXNrIGZvciB0eXBlIG9mIG1hcHBpbmcgKi8KKyNkZWZpbmUgTUFQX0ZJWEVECTB4MDEwCQkvKiBJbnRlcnByZXQgYWRkciBleGFjdGx5ICovCisKKy8qIG5vdCB1c2VkIGJ5IGxpbnV4LCBidXQgaGVyZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY2xhc2ggd2l0aCBBQkkgZGVmaW5lcyAqLworI2RlZmluZSBNQVBfUkVOQU1FCTB4MDIwCQkvKiBBc3NpZ24gcGFnZSB0byBmaWxlICovCisjZGVmaW5lIE1BUF9BVVRPR1JPVwkweDA0MAkJLyogRmlsZSBtYXkgZ3JvdyBieSB3cml0aW5nICovCisjZGVmaW5lIE1BUF9MT0NBTAkweDA4MAkJLyogQ29weSBvbiBmb3JrL3Nwcm9jICovCisjZGVmaW5lIE1BUF9BVVRPUlNSVgkweDEwMAkJLyogTG9naWNhbCBzd2FwIHJlc2VydmVkIG9uIGRlbWFuZCAqLworCisvKiBUaGVzZSBhcmUgbGludXgtc3BlY2lmaWMgKi8KKyNkZWZpbmUgTUFQX05PUkVTRVJWRQkweDA0MDAJCS8qIGRvbid0IGNoZWNrIGZvciByZXNlcnZhdGlvbnMgKi8KKyNkZWZpbmUgTUFQX0FOT05ZTU9VUwkweDA4MDAJCS8qIGRvbid0IHVzZSBhIGZpbGUgKi8KKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDEwMDAJCS8qIHN0YWNrLWxpa2Ugc2VnbWVudCAqLworI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MjAwMAkJLyogRVRYVEJTWSAqLworI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDQwMDAJCS8qIG1hcmsgaXQgYXMgYW4gZXhlY3V0YWJsZSAqLworI2RlZmluZSBNQVBfTE9DS0VECTB4ODAwMAkJLyogcGFnZXMgYXJlIGxvY2tlZCAqLworI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgxMDAwMAkJLyogcG9wdWxhdGUgKHByZWZhdWx0KSBwYWdldGFibGVzICovCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDIwMDAwCQkvKiBkbyBub3QgYmxvY2sgb24gSU8gKi8KKworLyoKKyAqIEZsYWdzIGZvciBtc3luYworICovCisjZGVmaW5lIE1TX0FTWU5DCTB4MDAwMQkJLyogc3luYyBtZW1vcnkgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgTVNfSU5WQUxJREFURQkweDAwMDIJCS8qIGludmFsaWRhdGUgbWFwcGluZ3MgJiBjYWNoZXMgKi8KKyNkZWZpbmUgTVNfU1lOQwkJMHgwMDA0CQkvKiBzeW5jaHJvbm91cyBtZW1vcnkgc3luYyAqLworCisvKgorICogRmxhZ3MgZm9yIG1sb2NrYWxsCisgKi8KKyNkZWZpbmUgTUNMX0NVUlJFTlQJMQkJLyogbG9jayBhbGwgY3VycmVudCBtYXBwaW5ncyAqLworI2RlZmluZSBNQ0xfRlVUVVJFCTIJCS8qIGxvY2sgYWxsIGZ1dHVyZSBtYXBwaW5ncyAqLworCisjZGVmaW5lIE1BRFZfTk9STUFMCTB4MAkJLyogZGVmYXVsdCBwYWdlLWluIGJlaGF2aW9yICovCisjZGVmaW5lIE1BRFZfUkFORE9NCTB4MQkJLyogcGFnZS1pbiBtaW5pbXVtIHJlcXVpcmVkICovCisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTAkweDIJCS8qIHJlYWQtYWhlYWQgYWdncmVzc2l2ZWx5ICovCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMHgzCQkvKiBwcmUtZmF1bHQgcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9ET05UTkVFRAkweDQJCS8qIGRpc2NhcmQgdGhlc2UgcGFnZXMgKi8KKworLyogY29tcGF0aWJpbGl0eSBmbGFncyAqLworI2RlZmluZSBNQVBfQU5PTiAgICAgICBNQVBfQU5PTllNT1VTCisjZGVmaW5lIE1BUF9GSUxFICAgICAgIDAKKworI2VuZGlmIC8qIF9YVEVOU0FfTU1BTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW11LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjNWJiMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbXUuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL21tdS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9NTVVfSAorI2RlZmluZSBfWFRFTlNBX01NVV9ICisKKy8qIERlZmF1bHQgInVuc2lnbmVkIGxvbmciIGNvbnRleHQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBtbV9jb250ZXh0X3Q7CisKKyNlbmRpZgkvKiBfWFRFTlNBX01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9tbXVfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDgwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvbW11X2NvbnRleHQuaApAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9tbXVfY29udGV4dC5oCisgKgorICogU3dpdGNoIGFuIE1NVSBjb250ZXh0LgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfTU1VX0NPTlRFWFRfSAorI2RlZmluZSBfWFRFTlNBX01NVV9DT05URVhUX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisvKgorICogTGludXggd2FzIHBvcnRlZCB0byBYdGVuc2EgYXNzdW1pbmcgYWxsIGF1dG8tcmVmaWxsIHdheXMgaW4gc2V0IDAKKyAqIGhhZCB0aGUgc2FtZSBwcm9wZXJ0aWVzIChhIHZlcnkgbGlrZWx5IGFzc3VtcHRpb24pLiAgTXVsdGlwbGUgc2V0cworICogb2YgYXV0by1yZWZpbGwgd2F5cyB3aWxsIHN0aWxsIHdvcmsgcHJvcGVybHksIGJ1dCBub3QgYXMgb3B0aW1hbGx5CisgKiBhcyB0aGUgWHRlbnNhIGRlc2lnbmVyIG1heSBoYXZlIGFzc3VtZWQuCisgKgorICogV2UgbWFrZSB0aGlzIGNhc2UgYSBoYXJkICNlcnJvciwga2lsbGluZyB0aGUga2VybmVsIGJ1aWxkLCB0byBhbGVydAorICogdGhlIGRldmVsb3BlciB0byB0aGlzIGNvbmRpdGlvbiAod2hpY2ggaXMgbW9yZSBsaWtlbHkgYW4gZXJyb3IpLgorICogWW91IHN1cGVyLWR1cGVyIGNsZXZlciBkZXZlbG9wZXJzIGNhbiBjaGFuZ2UgaXQgdG8gYSB3YXJuaW5nIG9yCisgKiByZW1vdmUgaXQgYWx0b2dldGhlciBpZiB5b3UgdGhpbmsgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuICA6KQorICovCisKKyNpZiAoWENIQUxfSEFWRV9UTEJTICE9IDEpCisjIGVycm9yICJMaW51eCBtdXN0IGhhdmUgYW4gTU1VISIKKyNlbmRpZgorCisjaWYgKChYQ0hBTF9JVExCX0FSRl9XQVlTID09IDApIHx8IChYQ0hBTF9EVExCX0FSRl9XQVlTID09IDApKQorIyBlcnJvciAiTU1VIG11c3QgaGF2ZSBhdXRvLXJlZmlsbCB3YXlzIgorI2VuZGlmCisKKyNpZiAoKFhDSEFMX0lUTEJfQVJGX1NFVFMgIT0gMSkgfHwgKFhDSEFMX0RUTEJfQVJGX1NFVFMgIT0gMSkpCisjIGVycm9yIExpbnV4IG1heSBub3QgdXNlIGFsbCBhdXRvLXJlZmlsbCB3YXlzIGFzIGVmZmljaWVudGx5IGFzIHlvdSB0aGluaworI2VuZGlmCisKKyNpZiAoWENIQUxfTU1VX01BWF9QVEVfUEFHRV9TSVpFICE9IFhDSEFMX01NVV9NSU5fUFRFX1BBR0VfU0laRSkKKyMgZXJyb3IgT25seSBvbmUgcGFnZSBzaXplIGFsbG93ZWQhCisjZW5kaWYKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXNpZF9jYWNoZTsKK2V4dGVybiBwZ2RfdCAqY3VycmVudF9wZ2Q7CisKKy8qCisgKiBEZWZpbmUgdGhlIG51bWJlciBvZiBlbnRyaWVzIHBlciBhdXRvLXJlZmlsbCB3YXkgaW4gc2V0IDAgb2YgYm90aCBJIGFuZCBECisgKiBUTEJzLiAgV2UgZGVhbCBvbmx5IHdpdGggc2V0IDAgaGVyZSAoYW4gYXNzdW1wdGlvbiBmdXJ0aGVyIGV4cGxhaW5lZCBpbgorICogYXNzZXJ0aW9ucy5oKS4gIEFsc28sIGRlZmluZSB0aGUgdG90YWwgbnVtYmVyIG9mIEFSRiBlbnRyaWVzIGluIGJvdGggVExCcy4KKyAqLworCisjZGVmaW5lIElUTEJfRU5UUklFU19QRVJfQVJGX1dBWSAgKFhDSEFMX0lUTEJfU0VUKFhDSEFMX0lUTEJfQVJGX1NFVDAsRU5UUklFUykpCisjZGVmaW5lIERUTEJfRU5UUklFU19QRVJfQVJGX1dBWSAgKFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfQVJGX1NFVDAsRU5UUklFUykpCisKKyNkZWZpbmUgSVRMQl9FTlRSSUVTCQkJCQkJCVwKKyAJKElUTEJfRU5UUklFU19QRVJfQVJGX1dBWSAqIChYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX0FSRl9TRVQwLFdBWVMpKSkKKyNkZWZpbmUgRFRMQl9FTlRSSUVTCQkJCQkJCVwKKwkoRFRMQl9FTlRSSUVTX1BFUl9BUkZfV0FZICogKFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfQVJGX1NFVDAsV0FZUykpKQorCisKKy8qCisgKiBTTUFMTEVTVF9OVExCX0VOVFJJRVMgaXMgdGhlIHNtYWxsZXIgb2YgSVRMQl9FTlRSSUVTIGFuZCBEVExCX0VOVFJJRVMuCisgKiBJbiBwcmFjdGljZSwgdGhleSBhcmUgcHJvYmFibHkgZXF1YWwuICBUaGlzIG1hY3JvIHNpbXBsaWZpZXMgZnVuY3Rpb24KKyAqIGZsdXNoX3RsYl9yYW5nZSgpLgorICovCisKKyNpZiAoRFRMQl9FTlRSSUVTIDwgSVRMQl9FTlRSSUVTKQorIyBkZWZpbmUgU01BTExFU1RfTlRMQl9FTlRSSUVTICBEVExCX0VOVFJJRVMKKyNlbHNlCisjIGRlZmluZSBTTUFMTEVTVF9OVExCX0VOVFJJRVMgIElUTEJfRU5UUklFUworI2VuZGlmCisKKworLyoKKyAqIGFzaWRfY2FjaGUgdHJhY2tzIG9ubHkgdGhlIEFTSURbVVNFUl9SSU5HXSBmaWVsZCBvZiB0aGUgUkFTSUQgc3BlY2lhbAorICogcmVnaXN0ZXIsIHdoaWNoIGlzIHRoZSBjdXJyZW50IHVzZXItdGFzayBhc2lkIGFsbG9jYXRpb24gdmFsdWUuCisgKiBtbS0+Y29udGV4dCBoYXMgdGhlIHNhbWUgbWVhbmluZy4gIFdoZW4gaXQgY29tZXMgdGltZSB0byB3cml0ZSB0aGUKKyAqIGFzaWRfY2FjaGUgb3IgbW0tPmNvbnRleHQgdmFsdWVzIHRvIHRoZSBSQVNJRCBzcGVjaWFsIHJlZ2lzdGVyLCB3ZSBmaXJzdAorICogc2hpZnQgdGhlIHZhbHVlIGxlZnQgYnkgOCwgdGhlbiBpbnNlcnQgdGhlIHZhbHVlLgorICogQVNJRFswXSBhbHdheXMgY29udGFpbnMgdGhlIGtlcm5lbCdzIGFzaWQgdmFsdWUsIGFuZCB3ZSByZXNlcnZlIHRocmVlCisgKiBvdGhlciBhc2lkIHZhbHVlcyB0aGF0IHdlIG5ldmVyIGFzc2lnbiB0byB1c2VyIHRhc2tzLgorICovCisKKyNkZWZpbmUgQVNJRF9JTkMJMHgxCisjZGVmaW5lIEFTSURfTUFTSwkoKDEgPDwgWENIQUxfTU1VX0FTSURfQklUUykgLSAxKQorCisvKgorICogWENIQUxfTU1VX0FTSURfSU5WQUxJRCBpcyBhIGNvbmZpZ3VyYWJsZSBYdGVuc2EgcHJvY2Vzc29yIGNvbnN0YW50CisgKiBpbmRpY2F0aW5nIGludmFsaWQgYWRkcmVzcyBzcGFjZS4gIFhDSEFMX01NVV9BU0lEX0tFUk5FTCBpcyBhIGNvbmZpZ3VyYWJsZQorICogWHRlbnNhIHByb2Nlc3NvciBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4gIFRoZXkgY2FuCisgKiBiZSBhcmJpdHJhcnkgdmFsdWVzLgorICoKKyAqIFdlIGlkZW50aWZ5IHRocmVlIG1vcmUgdW5pcXVlLCByZXNlcnZlZCBBU0lEIHZhbHVlcyB0byB1c2UgaW4gdGhlIHVudXNlZAorICogcmluZyBwb3NpdGlvbnMuICBObyBvdGhlciB1c2VyIHByb2Nlc3Mgd2lsbCBiZSBhc3NpZ25lZCB0aGVzZSByZXNlcnZlZAorICogQVNJRCB2YWx1ZXMuCisgKgorICogRm9yIGV4YW1wbGUsIGdpdmVuIHRoYXQKKyAqCisgKglYQ0hBTF9NTVVfQVNJRF9JTlZBTElEID09IDAKKyAqCVhDSEFMX01NVV9BU0lEX0tFUk5FTCAgPT0gMQorICoKKyAqIHRoZSBmb2xsb3dpbmcgbWF6ZSBvZiAjaWYgc3RhdGVtZW50cyB3b3VsZCBnZW5lcmF0ZQorICoKKyAqCUFTSURfUkVTRVJWRURfMSAgICAgICAgPT0gMgorICoJQVNJRF9SRVNFUlZFRF8yICAgICAgICA9PSAzCisgKglBU0lEX1JFU0VSVkVEXzMgICAgICAgID09IDQKKyAqCUFTSURfRklSU1RfTk9OUkVTRVJWRUQgPT0gNQorICovCisKKyNpZiAoWENIQUxfTU1VX0FTSURfSU5WQUxJRCAhPSBYQ0hBTF9NTVVfQVNJRF9LRVJORUwgKyAxKQorIyBkZWZpbmUgQVNJRF9SRVNFUlZFRF8xICAgICAgICAgKChYQ0hBTF9NTVVfQVNJRF9LRVJORUwgKyAxKSAmIEFTSURfTUFTSykKKyNlbHNlCisjIGRlZmluZSBBU0lEX1JFU0VSVkVEXzEgICAgICAgICAoKFhDSEFMX01NVV9BU0lEX0tFUk5FTCArIDIpICYgQVNJRF9NQVNLKQorI2VuZGlmCisKKyNpZiAoWENIQUxfTU1VX0FTSURfSU5WQUxJRCAhPSBBU0lEX1JFU0VSVkVEXzEgKyAxKQorIyBkZWZpbmUgQVNJRF9SRVNFUlZFRF8yICAgICAgICAgKChBU0lEX1JFU0VSVkVEXzEgKyAxKSAmIEFTSURfTUFTSykKKyNlbHNlCisjIGRlZmluZSBBU0lEX1JFU0VSVkVEXzIgICAgICAgICAoKEFTSURfUkVTRVJWRURfMSArIDIpICYgQVNJRF9NQVNLKQorI2VuZGlmCisKKyNpZiAoWENIQUxfTU1VX0FTSURfSU5WQUxJRCAhPSBBU0lEX1JFU0VSVkVEXzIgKyAxKQorIyBkZWZpbmUgQVNJRF9SRVNFUlZFRF8zICAgICAgICAgKChBU0lEX1JFU0VSVkVEXzIgKyAxKSAmIEFTSURfTUFTSykKKyNlbHNlCisjIGRlZmluZSBBU0lEX1JFU0VSVkVEXzMgICAgICAgICAoKEFTSURfUkVTRVJWRURfMiArIDIpICYgQVNJRF9NQVNLKQorI2VuZGlmCisKKyNpZiAoWENIQUxfTU1VX0FTSURfSU5WQUxJRCAhPSBBU0lEX1JFU0VSVkVEXzMgKyAxKQorIyBkZWZpbmUgQVNJRF9GSVJTVF9OT05SRVNFUlZFRCAgKChBU0lEX1JFU0VSVkVEXzMgKyAxKSAmIEFTSURfTUFTSykKKyNlbHNlCisjIGRlZmluZSBBU0lEX0ZJUlNUX05PTlJFU0VSVkVEICAoKEFTSURfUkVTRVJWRURfMyArIDIpICYgQVNJRF9NQVNLKQorI2VuZGlmCisKKyNkZWZpbmUgQVNJRF9BTExfUkVTRVJWRUQgKCAoKEFTSURfUkVTRVJWRURfMSkgPDwgMjQpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8yKSA8PCAxNikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChBU0lEX1JFU0VSVkVEXzMpIDw8ICA4KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFhDSEFMX01NVV9BU0lEX0tFUk5FTCkpICAgKQorCisKKy8qCisgKiBOT19DT05URVhUIGlzIHRoZSBpbnZhbGlkIEFTSUQgdmFsdWUgdGhhdCB3ZSBkb24ndCBldmVyIGFzc2lnbiB0bworICogYW55IHVzZXIgb3Iga2VybmVsIGNvbnRleHQuICBOT19DT05URVhUIGlzIGEgYmV0dGVyIG1uZW1vbmljIHRoYW4KKyAqIFhDSEFMX01NVV9BU0lEX0lOVkFMSUQsIHNvIHdlIHVzZSBpdCBpbiBjb2RlIGluc3RlYWQuCisgKi8KKworI2RlZmluZSBOT19DT05URVhUICAgWENIQUxfTU1VX0FTSURfSU5WQUxJRAorCisjaWYgKEtFUk5FTF9SSU5HICE9IDApCisjIGVycm9yIFRoZSBLRVJORUxfUklORyByZWFsbHkgc2hvdWxkIGJlIHplcm8uCisjZW5kaWYKKworI2lmIChVU0VSX1JJTkcgPj0gWENIQUxfTU1VX1JJTkdTKQorIyBlcnJvciBVU0VSX1JJTkcgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgaGlnaGVzdCBudW1iZXJlZCByaW5nLgorI2VuZGlmCisKKyNpZiAoVVNFUl9SSU5HID09IEtFUk5FTF9SSU5HKQorIyBlcnJvciBUaGUgdXNlciBhbmQga2VybmVsIHJpbmdzIHJlYWxseSBzaG91bGQgbm90IGJlIGVxdWFsLgorI2VuZGlmCisKKyNpZiAoVVNFUl9SSU5HID09IDEpCisjZGVmaW5lIEFTSURfSU5TRVJUKHgpICggKChBU0lEX1JFU0VSVkVEXzEpICAgPDwgMjQpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8yKSAgIDw8IDE2KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIChBU0lEX01BU0spKSA8PCAgOCkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChYQ0hBTF9NTVVfQVNJRF9LRVJORUwpKSAgICkKKworI2VsaWYgKFVTRVJfUklORyA9PSAyKQorI2RlZmluZSBBU0lEX0lOU0VSVCh4KSAoICgoQVNJRF9SRVNFUlZFRF8xKSAgIDw8IDI0KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIChBU0lEX01BU0spKSA8PCAxNikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKChBU0lEX1JFU0VSVkVEXzIpICAgPDwgIDgpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoWENIQUxfTU1VX0FTSURfS0VSTkVMKSkgICApCisKKyNlbGlmIChVU0VSX1JJTkcgPT0gMykKKyNkZWZpbmUgQVNJRF9JTlNFUlQoeCkgKCAoKCh4KSAmIChBU0lEX01BU0spKSA8PCAyNCkgKyBcCisJCQkgKChBU0lEX1JFU0VSVkVEXzEpICAgPDwgMTYpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICgoQVNJRF9SRVNFUlZFRF8yKSAgIDw8ICA4KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFhDSEFMX01NVV9BU0lEX0tFUk5FTCkpICAgKQorCisjZWxzZQorI2Vycm9yIEdvb2Z5IHZhbHVlIGZvciBVU0VSX1JJTkcKKworI2VuZGlmIC8qIFVTRVJfUklORyA9PSAxICovCisKKworLyoKKyAqICBBbGwgdW51c2VkIGJ5IGhhcmR3YXJlIHVwcGVyIGJpdHMgd2lsbCBiZSBjb25zaWRlcmVkCisgKiAgYXMgYSBzb2Z0d2FyZSBhc2lkIGV4dGVuc2lvbi4KKyAqLworCisjZGVmaW5lIEFTSURfVkVSU0lPTl9NQVNLICAoKHVuc2lnbmVkIGxvbmcpfihBU0lEX01BU0t8KEFTSURfTUFTSy0xKSkpCisjZGVmaW5lIEFTSURfRklSU1RfVkVSU0lPTgkJCQkJCVwKKwkoKHVuc2lnbmVkIGxvbmcpKH5BU0lEX1ZFUlNJT05fTUFTSykgKyAxICsgQVNJRF9GSVJTVF9OT05SRVNFUlZFRCkKKworZXh0ZXJuIGlubGluZSB2b2lkIHNldF9yYXNpZF9yZWdpc3RlciAodW5zaWduZWQgbG9uZyB2YWwpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIgd3NyICUwLCAiX19zdHJpbmdpZnkoUkFTSUQpIlxuXHQiCisJCQkgICAgICAiIGlzeW5jXG4iIDogOiAiYSIgKHZhbCkpOworfQorCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3Jhc2lkX3JlZ2lzdGVyICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCV9fYXNtX18gX192b2xhdGlsZV9fICgiIHJzciAlMCwgIl9fc3RyaW5naWZ5KFJBU0lEKSJcblx0IiA6ICI9YSIgKHRtcCkpOworCXJldHVybiB0bXA7Cit9CisKKworI2lmICgoWENIQUxfTU1VX0FTSURfSU5WQUxJRCA9PSAwKSAmJiAoWENIQUxfTU1VX0FTSURfS0VSTkVMID09IDEpKQorCitleHRlcm4gaW5saW5lIHZvaWQKK2dldF9uZXdfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYXNpZCkKK3sKKwlleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOworCWlmICghICgoYXNpZCArPSBBU0lEX0lOQykgJiBBU0lEX01BU0spICkgeworCQlmbHVzaF90bGJfYWxsKCk7IC8qIHN0YXJ0IG5ldyBhc2lkIGN5Y2xlICovCisJCWlmICghYXNpZCkgICAgICAvKiBmaXggdmVyc2lvbiBpZiBuZWVkZWQgKi8KKwkJCWFzaWQgPSBBU0lEX0ZJUlNUX1ZFUlNJT04gLSBBU0lEX0ZJUlNUX05PTlJFU0VSVkVEOworCQlhc2lkICs9IEFTSURfRklSU1RfTk9OUkVTRVJWRUQ7CisJfQorCW1tLT5jb250ZXh0ID0gYXNpZF9jYWNoZSA9IGFzaWQ7Cit9CisKKyNlbHNlCisjd2FybmluZyBBU0lEX3tJTlZBTElELEtFUk5FTH0gdmFsdWVzIGltcG9zZSBub24tb3B0aW1hbCBnZXRfbmV3X21tdV9jb250ZXh0IGltcGxlbWVudGF0aW9uCisKKy8qIFhDSEFMX01NVV9BU0lEX0lOVkFMSUQgPT0gMCBhbmQgWENIQUxfTU1VX0FTSURfS0VSTkVMID09MSBhcmUKKyAgIHJlYWxseSB0aGUgYmVzdCwgYnV0IGlmIHlvdSBpbnNpc3QuLi4gKi8KKworZXh0ZXJuIGlubGluZSBpbnQgdmFsaWRhdGVfYXNpZCAodW5zaWduZWQgbG9uZyBhc2lkKQoreworCXN3aXRjaCAoYXNpZCkgeworCWNhc2UgWENIQUxfTU1VX0FTSURfSU5WQUxJRDoKKwljYXNlIFhDSEFMX01NVV9BU0lEX0tFUk5FTDoKKwljYXNlIEFTSURfUkVTRVJWRURfMToKKwljYXNlIEFTSURfUkVTRVJWRURfMjoKKwljYXNlIEFTSURfUkVTRVJWRURfMzoKKwkJcmV0dXJuIDA7IC8qIGNhbid0IHVzZSB0aGVzZSB2YWx1ZXMgYXMgQVNJRHMgKi8KKwl9CisJcmV0dXJuIDE7IC8qIHZhbGlkICovCit9CisKK2V4dGVybiBpbmxpbmUgdm9pZAorZ2V0X25ld19tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhc2lkKQoreworCWV4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7CisJd2hpbGUgKDEpIHsKKwkJYXNpZCArPSBBU0lEX0lOQzsKKwkJaWYgKCAhIChhc2lkICYgQVNJRF9NQVNLKSApIHsKKwkJCWZsdXNoX3RsYl9hbGwoKTsgLyogc3RhcnQgbmV3IGFzaWQgY3ljbGUgKi8KKwkJCWlmICghYXNpZCkgICAgICAvKiBmaXggdmVyc2lvbiBpZiBuZWVkZWQgKi8KKwkJCQlhc2lkID0gQVNJRF9GSVJTVF9WRVJTSU9OIC0gQVNJRF9GSVJTVF9OT05SRVNFUlZFRDsKKwkJCWFzaWQgKz0gQVNJRF9GSVJTVF9OT05SRVNFUlZFRDsKKwkJCWJyZWFrOyAvKiBubyBuZWVkIHRvIHZhbGlkYXRlIGhlcmUgKi8KKwkJfQorCQlpZiAodmFsaWRhdGVfYXNpZCAoYXNpZCAmIEFTSURfTUFTSykpCisJCQlicmVhazsKKwl9CisJbW0tPmNvbnRleHQgPSBhc2lkX2NhY2hlID0gYXNpZDsKK30KKworI2VuZGlmCisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGNvbnRleHQgcmVsYXRlZCBpbmZvIGZvciBhIG5ldyBtbV9zdHJ1Y3QKKyAqIGluc3RhbmNlLgorICovCisKK2V4dGVybiBpbmxpbmUgaW50Citpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwltbS0+Y29udGV4dCA9IE5PX0NPTlRFWFQ7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJdW5zaWduZWQgbG9uZyBhc2lkID0gYXNpZF9jYWNoZTsKKworCS8qIENoZWNrIGlmIG91ciBBU0lEIGlzIG9mIGFuIG9sZGVyIHZlcnNpb24gYW5kIHRodXMgaW52YWxpZCAqLworCisJaWYgKChuZXh0LT5jb250ZXh0IF4gYXNpZCkgJiBBU0lEX1ZFUlNJT05fTUFTSykKKwkJZ2V0X25ld19tbXVfY29udGV4dChuZXh0LCBhc2lkKTsKKworCXNldF9yYXNpZF9yZWdpc3RlciAoQVNJRF9JTlNFUlQobmV4dC0+Y29udGV4dCkpOworCWludmFsaWRhdGVfcGFnZV9kaXJlY3RvcnkoKTsKK30KKworI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzaywgbW0pCWRvIHsgfSB3aGlsZSgwKQorCisvKgorICogRGVzdHJveSBjb250ZXh0IHJlbGF0ZWQgaW5mbyBmb3IgYW4gbW1fc3RydWN0IHRoYXQgaXMgYWJvdXQKKyAqIHRvIGJlIHB1dCB0byByZXN0LgorICovCitleHRlcm4gaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCS8qIE5vdGhpbmcgdG8gZG8uICovCit9CisKKy8qCisgKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKKyAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgorICovCitleHRlcm4gaW5saW5lIHZvaWQKK2FjdGl2YXRlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKnByZXYsIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpCit7CisJLyogVW5jb25kaXRpb25hbGx5IGdldCBhIG5ldyBBU0lELiAgKi8KKworCWdldF9uZXdfbW11X2NvbnRleHQobmV4dCwgYXNpZF9jYWNoZSk7CisJc2V0X3Jhc2lkX3JlZ2lzdGVyIChBU0lEX0lOU0VSVChuZXh0LT5jb250ZXh0KSk7CisJaW52YWxpZGF0ZV9wYWdlX2RpcmVjdG9yeSgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5X3RsYihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJLyogTm90aGluZyB0byBkby4gKi8KKworfQorCisjZW5kaWYgLyogX1hURU5TQV9NTVVfQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvbW9kdWxlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiMjViZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9tb2R1bGUuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL21vZHVsZS5oCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtb2R1bGUgY29kZSBzcGVjaWZpYyB0byB0aGUgWHRlbnNhIGFyY2hpdGVjdHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX01PRFVMRV9ICisjZGVmaW5lIF9YVEVOU0FfTU9EVUxFX0gKKworc3RydWN0IG1vZF9hcmNoX3NwZWNpZmljCit7CisJLyogTW9kdWxlIHN1cHBvcnQgaXMgbm90IGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQuICovCit9OworCisjZGVmaW5lIEVsZl9TaGRyIEVsZjMyX1NoZHIKKyNkZWZpbmUgRWxmX1N5bSBFbGYzMl9TeW0KKyNkZWZpbmUgRWxmX0VoZHIgRWxmMzJfRWhkcgorCisjZW5kaWYJLyogX1hURU5TQV9NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL21zZ2J1Zi5oIGIvaW5jbHVkZS9hc20teHRlbnNhL21zZ2J1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2M5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvbXNnYnVmLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9tc2didWYuaAorICoKKyAqIFRoZSBtc3FpZDY0X2RzIHN0cnVjdHVyZSBmb3IgdGhlIFh0ZW5zYSBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX01TR0JVRl9ICisjZGVmaW5lIF9YVEVOU0FfTVNHQlVGX0gKKworc3RydWN0IG1zcWlkNjRfZHMgeworCXN0cnVjdCBpcGM2NF9wZXJtIG1zZ19wZXJtOworI2lmZGVmIF9fWFRFTlNBX0VCX18KKwl1bnNpZ25lZCBpbnQJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdCBtc2dfc3RpbWU7CS8qIGxhc3QgbXNnc25kIHRpbWUgKi8KKwl1bnNpZ25lZCBpbnQJX191bnVzZWQyOworCV9fa2VybmVsX3RpbWVfdCBtc2dfcnRpbWU7CS8qIGxhc3QgbXNncmN2IHRpbWUgKi8KKwl1bnNpZ25lZCBpbnQJX191bnVzZWQzOworCV9fa2VybmVsX3RpbWVfdCBtc2dfY3RpbWU7CS8qIGxhc3QgY2hhbmdlIHRpbWUgKi8KKyNlbGlmIGRlZmluZWQoX19YVEVOU0FfRUxfXykKKwlfX2tlcm5lbF90aW1lX3QgbXNnX3N0aW1lOwkvKiBsYXN0IG1zZ3NuZCB0aW1lICovCisJdW5zaWduZWQgaW50CV9fdW51c2VkMTsKKwlfX2tlcm5lbF90aW1lX3QgbXNnX3J0aW1lOwkvKiBsYXN0IG1zZ3JjdiB0aW1lICovCisJdW5zaWduZWQgaW50CV9fdW51c2VkMjsKKwlfX2tlcm5lbF90aW1lX3QgbXNnX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgaW50CV9fdW51c2VkMzsKKyNlbHNlCisjIGVycm9yIHByb2Nlc3NvciBieXRlIG9yZGVyIHVuZGVmaW5lZCEKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgIG1zZ19jYnl0ZXM7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIG9uIHF1ZXVlICovCisJdW5zaWduZWQgbG9uZyAgbXNnX3FudW07CS8qIG51bWJlciBvZiBtZXNzYWdlcyBpbiBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcgIG1zZ19xYnl0ZXM7CS8qIG1heCBudW1iZXIgb2YgYnl0ZXMgb24gcXVldWUgKi8KKwlfX2tlcm5lbF9waWRfdCBtc2dfbHNwaWQ7CS8qIHBpZCBvZiBsYXN0IG1zZ3NuZCAqLworCV9fa2VybmVsX3BpZF90IG1zZ19scnBpZDsJLyogbGFzdCByZWNlaXZlIHBpZCAqLworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisjZW5kaWYJLyogX1hURU5TQV9NU0dCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL25hbWVpLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvbmFtZWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRmZjAzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL25hbWVpLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9uYW1laS5oCisgKgorICogSW5jbHVkZWQgZnJvbSBsaW51eC9mcy9uYW1laS5jCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9OQU1FSV9ICisjZGVmaW5lIF9YVEVOU0FfTkFNRUlfSAorCisjaWZkZWYgX19LRVJORUxfXworCisvKiBUaGlzIGR1bW15IHJvdXRpbmUgbWF5YmUgY2hhbmdlZCB0byBzb21ldGhpbmcgdXNlZnVsCisgKiBmb3IgL3Vzci9nbmVtdWwvIGVtdWxhdGlvbiBzdHVmZi4KKyAqIExvb2sgYXQgYXNtLXNwYXJjL25hbWVpLmggZm9yIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBfX2VtdWxfcHJlZml4KCkgTlVMTAorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9YVEVOU0FfTkFNRUlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5NWU1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS14dGVuc2EvcGFnZS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbjIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUEFHRV9ICisjZGVmaW5lIF9YVEVOU0FfUEFHRV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZQorICogUEFHRV9BTElHTih4KSBhbGlnbnMgdGhlIHBvaW50ZXIgdG8gdGhlIChuZXh0KSBwYWdlIGJvdW5kYXJ5CisgKi8KKworI2RlZmluZSBQQUdFX1NISUZUCQlYQ0hBTF9NTVVfTUlOX1BURV9QQUdFX1NJWkUKKyNkZWZpbmUgUEFHRV9TSVpFCQkoMSA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX01BU0sJCSh+KFBBR0VfU0laRS0xKSkKKyNkZWZpbmUgUEFHRV9BTElHTihhZGRyKQkoKChhZGRyKStQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSykKKworI2RlZmluZSBEQ0FDSEVfV0FZX1NJWkUJCShYQ0hBTF9EQ0FDSEVfU0laRSAvIFhDSEFMX0RDQUNIRV9XQVlTKQorI2RlZmluZSBQQUdFX09GRlNFVAkJWENIQUxfS1NFR19DQUNIRURfVkFERFIKKworI2lmZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIF9fcGdwcm90KHgpCSh4KQorCisjZWxzZQorCisvKgorICogVGhlc2UgYXJlIHVzZWQgdG8gbWFrZSB1c2Ugb2YgQyB0eXBlLWNoZWNraW5nLi4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlOyB9IHB0ZV90OwkJLyogcGFnZSB0YWJsZSBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBnZDsgfSBwZ2RfdDsJCS8qIFBHRCB0YWJsZSBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBncHJvdDsgfSBwZ3Byb3RfdDsKKworI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlKQorI2RlZmluZSBwZ2RfdmFsKHgpCSgoeCkucGdkKQorI2RlZmluZSBwZ3Byb3RfdmFsKHgpCSgoeCkucGdwcm90KQorCisjZGVmaW5lIF9fcHRlKHgpCSgocHRlX3QpIHsgKHgpIH0gKQorI2RlZmluZSBfX3BnZCh4KQkoKHBnZF90KSB7ICh4KSB9ICkKKyNkZWZpbmUgX19wZ3Byb3QoeCkJKChwZ3Byb3RfdCkgeyAoeCkgfSApCisKKy8qCisgKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlcgorICovCisKK2V4dGVybiBfX2lubGluZV9fIGludCBnZXRfb3JkZXIodW5zaWduZWQgbG9uZyBzaXplKQoreworCWludCBvcmRlcjsKKyNpZm5kZWYgWENIQUxfSEFWRV9OU1UKKwl1bnNpZ25lZCBsb25nIHgxLCB4MiwgeDQsIHg4LCB4MTY7CisKKwlzaXplID0gKHNpemUgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCXgxICA9IHNpemUgJiAweEFBQUFBQUFBOworCXgyICA9IHNpemUgJiAweENDQ0NDQ0NDOworCXg0ICA9IHNpemUgJiAweEYwRjBGMEYwOworCXg4ICA9IHNpemUgJiAweEZGMDBGRjAwOworCXgxNiA9IHNpemUgJiAweEZGRkYwMDAwOworCW9yZGVyID0geDIgPyAyIDogMDsKKwlvcmRlciArPSAoeDE2ICE9IDApICogMTY7CisJb3JkZXIgKz0gKHg4ICE9IDApICogODsKKwlvcmRlciArPSAoeDQgIT0gMCkgKiA0OworCW9yZGVyICs9ICh4MSAhPSAwKTsKKworCXJldHVybiBvcmRlcjsKKyNlbHNlCisJc2l6ZSA9IChzaXplIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlhc20gKCJuc2F1ICUwLCAlMSIgOiAiPXIiIChvcmRlcikgOiAiciIgKHNpemUpKTsKKwlyZXR1cm4gMzIgLSBvcmRlcjsKKyNlbmRpZgorfQorCisKK3N0cnVjdCBwYWdlOworZXh0ZXJuIHZvaWQgY2xlYXJfcGFnZSh2b2lkICpwYWdlKTsKK2V4dGVybiB2b2lkIGNvcHlfcGFnZSh2b2lkICp0bywgdm9pZCAqZnJvbSk7CisKKy8qCisgKiBJZiB3ZSBoYXZlIGNhY2hlIGFsaWFzaW5nIGFuZCB3cml0ZWJhY2sgY2FjaGVzLCB3ZSBtaWdodCBoYXZlIHRvIGRvCisgKiBzb21lIGV4dHJhIHdvcmsKKyAqLworCisjaWYgKERDQUNIRV9XQVlfU0laRSA+IFBBR0VfU0laRSkKK3ZvaWQgY2xlYXJfdXNlcl9wYWdlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCBwYWdlKiBwYWdlKTsKK3ZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sdm9pZCogZnJvbSx1bnNpZ25lZCBsb25nIHZhZGRyLHN0cnVjdCBwYWdlKiBwYWdlKTsKKyNlbHNlCisjIGRlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSx2YWRkcixwZykJCWNsZWFyX3BhZ2UocGFnZSkKKyMgZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKKyNlbmRpZgorCisvKgorICogVGhpcyBoYW5kbGVzIHRoZSBtZW1vcnkgbWFwLiAgV2UgaGFuZGxlIHBhZ2VzIGF0CisgKiBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiBmb3Iga2VybmVscyB3aXRoIDMyIGJpdCBhZGRyZXNzIHNwYWNlLgorICogVGhlc2UgbWFjcm9zIGFyZSBmb3IgY29udmVyc2lvbiBvZiBrZXJuZWwgYWRkcmVzcywgbm90IHVzZXIKKyAqIGFkZHJlc3Nlcy4KKyAqLworCisjZGVmaW5lIF9fcGEoeCkJCQkoKHVuc2lnbmVkIGxvbmcpICh4KSAtIFBBR0VfT0ZGU0VUKQorI2RlZmluZSBfX3ZhKHgpCQkJKCh2b2lkICopKCh1bnNpZ25lZCBsb25nKSAoeCkgKyBQQUdFX09GRlNFVCkpCisjZGVmaW5lIHBmbl92YWxpZChwZm4pCQkoKHVuc2lnbmVkIGxvbmcpcGZuIDwgbWF4X21hcG5yKQorI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCisjIGRlZmluZSBwZm5fdG9fcGFnZShwZm4pCShtZW1fbWFwICsgKHBmbikpCisjIGRlZmluZSBwYWdlX3RvX3BmbihwYWdlKQkoKHVuc2lnbmVkIGxvbmcpKChwYWdlKSAtIG1lbV9tYXApKQorI2Vsc2UKKyMgZXJyb3IgQ09ORklHX0RJU0NPTlRJR01FTSBub3Qgc3VwcG9ydGVkCisjZW5kaWYKKworI2RlZmluZSB2aXJ0X3RvX3BhZ2Uoa2FkZHIpCXBmbl90b19wYWdlKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKQlfX3ZhKHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQpCisjZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIHBhZ2VfdG9fcGh5cyhwYWdlKQkocGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVCkKKworI2RlZmluZSBXQU5UX1BBR0VfVklSVFVBTAorCisKKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KKworI2RlZmluZSBWTV9EQVRBX0RFRkFVTFRfRkxBR1MJKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMgfCBcCisJCQkJIFZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX1hURU5TQV9QQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgubiBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wYWdlLmgubgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDZjYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaC5uCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24yIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1BBR0VfSAorI2RlZmluZSBfWFRFTlNBX1BBR0VfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKgorICogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUKKyAqIFBBR0VfQUxJR04oeCkgYWxpZ25zIHRoZSBwb2ludGVyIHRvIHRoZSAobmV4dCkgcGFnZSBib3VuZGFyeQorICovCisjZGVmaW5lIFBBR0VfU0hJRlQJCVhDSEFMX01NVV9NSU5fUFRFX1BBR0VfU0laRQorI2RlZmluZSBQQUdFX1NJWkUJCSgxIDw8IFBBR0VfU0hJRlQpCisjZGVmaW5lIFBBR0VfTUFTSwkJKH4oUEFHRV9TSVpFLTEpKQorI2RlZmluZSBQQUdFX0FMSUdOKGFkZHIpCSgoKGFkZHIpK1BBR0VfU0laRSAtIDEpICYgUEFHRV9NQVNLKQorCisjZGVmaW5lIERDQUNIRV9XQVlfU0laRQkJKFhDSEFMX0RDQUNIRV9TSVpFIC8gWENIQUxfRENBQ0hFX1dBWVMpCisjZGVmaW5lIFBBR0VfT0ZGU0VUCQlYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUgorCisjaWZkZWYgX19BU1NFTUJMWV9fCisKKyNkZWZpbmUgX19wZ3Byb3QoeCkJKHgpCisKKyNlbHNlCisKKworLyoKKyAqIFRoZXNlIGFyZSB1c2VkIHRvIG1ha2UgdXNlIG9mIEMgdHlwZS1jaGVja2luZy4uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwdGU7IH0gcHRlX3Q7CQkvKiBwYWdlIHRhYmxlIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcG1kOyB9IHBtZF90OwkJLyogUE1EIHRhYmxlIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdkOyB9IHBnZF90OwkJLyogUEdEIHRhYmxlIGVudHJ5ICovCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdwcm90OyB9IHBncHJvdF90OworCisjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCisjZGVmaW5lIHBtZF92YWwoeCkJKCh4KS5wbWQpCisjZGVmaW5lIHBnZF92YWwoeCkJKCh4KS5wZ2QpCisjZGVmaW5lIHBncHJvdF92YWwoeCkJKCh4KS5wZ3Byb3QpCisKKyNkZWZpbmUgX19wdGUoeCkJKChwdGVfdCkgeyAoeCkgfSApCisjZGVmaW5lIF9fcG1kKHgpCSgocG1kX3QpIHsgKHgpIH0gKQorI2RlZmluZSBfX3BnZCh4KQkoKHBnZF90KSB7ICh4KSB9ICkKKyNkZWZpbmUgX19wZ3Byb3QoeCkJKChwZ3Byb3RfdCkgeyAoeCkgfSApCisKKy8qCisgKiBQdXJlIDJebiB2ZXJzaW9uIG9mIGdldF9vcmRlcgorICovCitleHRlcm4gX19pbmxpbmVfXyBpbnQgZ2V0X29yZGVyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgb3JkZXI7CisjaWZuZGVmIFhDSEFMX0hBVkVfTlNVCisJdW5zaWduZWQgbG9uZyB4MSwgeDIsIHg0LCB4OCwgeDE2OworCisJc2l6ZSA9IChzaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwl4MSAgPSBzaXplICYgMHhBQUFBQUFBQTsKKwl4MiAgPSBzaXplICYgMHhDQ0NDQ0NDQzsKKwl4NCAgPSBzaXplICYgMHhGMEYwRjBGMDsKKwl4OCAgPSBzaXplICYgMHhGRjAwRkYwMDsKKwl4MTYgPSBzaXplICYgMHhGRkZGMDAwMDsKKwlvcmRlciA9IHgyID8gMiA6IDA7CisJb3JkZXIgKz0gKHgxNiAhPSAwKSAqIDE2OworCW9yZGVyICs9ICh4OCAhPSAwKSAqIDg7CisJb3JkZXIgKz0gKHg0ICE9IDApICogNDsKKwlvcmRlciArPSAoeDEgIT0gMCk7CisKKwlyZXR1cm4gb3JkZXI7CisjZWxzZQorCXNpemUgPSAoc2l6ZSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJYXNtICgibnNhdSAlMCwgJTEiIDogIj1yIiAob3JkZXIpIDogInIiIChzaXplKSk7CisJcmV0dXJuIDMyIC0gb3JkZXI7CisjZW5kaWYKK30KKworCitzdHJ1Y3QgcGFnZTsKK2V4dGVybiB2b2lkIGNsZWFyX3BhZ2Uodm9pZCAqcGFnZSk7CitleHRlcm4gdm9pZCBjb3B5X3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20pOworCisvKgorICogSWYgd2UgaGF2ZSBjYWNoZSBhbGlhc2luZyBhbmQgd3JpdGViYWNrIGNhY2hlcywgd2UgbWlnaHQgaGF2ZSB0byBkbworICogc29tZSBleHRyYSB3b3JrCisgKi8KKworI2lmIChEQ0FDSEVfV0FZX1NJWkUgPiBQQUdFX1NJWkUpICYmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKK3ZvaWQgY2xlYXJfdXNlcl9wYWdlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCBwYWdlKiBwYWdlKTsKK3ZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQqIGZyb20sIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHN0cnVjdCBwYWdlKiBwYWdlKTsKKyNlbHNlCisjIGRlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSx2YWRkcixwZykJCWNsZWFyX3BhZ2UocGFnZSkKKyMgZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKKyNlbmRpZgorCisKKy8qCisgKiBUaGlzIGhhbmRsZXMgdGhlIG1lbW9yeSBtYXAuICBXZSBoYW5kbGUgcGFnZXMgYXQKKyAqIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSIGZvciBrZXJuZWxzIHdpdGggMzIgYml0IGFkZHJlc3Mgc3BhY2UuCisgKiBUaGVzZSBtYWNyb3MgYXJlIGZvciBjb252ZXJzaW9uIG9mIGtlcm5lbCBhZGRyZXNzLCBub3QgdXNlcgorICogYWRkcmVzc2VzLgorICovCisKKyNkZWZpbmUgX19wYSh4KQkJCSgodW5zaWduZWQgbG9uZykgKHgpIC0gUEFHRV9PRkZTRVQpCisjZGVmaW5lIF9fdmEoeCkJCQkoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpICh4KSArIFBBR0VfT0ZGU0VUKSkKKyNkZWZpbmUgcGZuX3ZhbGlkKHBmbikJCSgodW5zaWduZWQgbG9uZylwZm4gPCBtYXhfbWFwbnIpCisjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KKyMgZGVmaW5lIHBmbl90b19wYWdlKHBmbikJKG1lbV9tYXAgKyAocGZuKSkKKyMgZGVmaW5lIHBhZ2VfdG9fcGZuKHBhZ2UpCSgodW5zaWduZWQgbG9uZykoKHBhZ2UpIC0gbWVtX21hcCkpCisjZWxzZQorIyBlcnJvciBDT05GSUdfRElTQ09OVElHTUVNIG5vdCBzdXBwb3J0ZWQKKyNlbmRpZgorCisjZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJcGZuX3RvX3BhZ2UoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgcGFnZV90b192aXJ0KHBhZ2UpCV9fdmEocGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVCkKKyNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgcGFnZV90b19waHlzKHBhZ2UpCShwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUKQorCisjZGVmaW5lIFdBTlRfUEFHRV9WSVJUVUFMCisKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjZGVmaW5lIFZNX0RBVEFfREVGQVVMVF9GTEFHUwkoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQyB8IFwKKwkJCQkgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQykKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfWFRFTlNBX1BBR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BhcmFtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGVlYzgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BhcmFtLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wYXJhbS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QQVJBTV9ICisjZGVmaW5lIF9YVEVOU0FfUEFSQU1fSAorCisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjIGRlZmluZSBIWgkJMTAwCQkvKiBpbnRlcm5hbCB0aW1lciBmcmVxdWVuY3kgKi8KKyMgZGVmaW5lIFVTRVJfSFoJMTAwCQkvKiBmb3IgdXNlciBpbnRlcmZhY2VzIGluICJ0aWNrcyIgKi8KKyMgZGVmaW5lIENMT0NLU19QRVJfU0VDIChVU0VSX0haKQkvKiBmcmVxdW56eSBhdCB3aGljaCB0aW1lcygpIGNvdW50cyAqLworI2VuZGlmCisKKyNkZWZpbmUgRVhFQ19QQUdFU0laRQkoMSA8PCBYQ0hBTF9NTVVfTUlOX1BURV9QQUdFX1NJWkUpCisKKyNpZm5kZWYgTkdST1VQUworI2RlZmluZSBOR1JPVVBTCQkzMgorI2VuZGlmCisKKyNpZm5kZWYgTk9HUk9VUAorI2RlZmluZSBOT0dST1VQCQkoLTEpCisjZW5kaWYKKworI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAkvKiBtYXggbGVuZ3RoIG9mIGhvc3RuYW1lICovCisKKyNlbmRpZiAvKiBfWFRFTlNBX1BBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wY2ktYnJpZGdlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLWJyaWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmNiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLWJyaWRnZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvcGNpLWJyaWRnZS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1BDSV9CUklER0VfSAorI2RlZmluZSBfWFRFTlNBX1BDSV9CUklER0VfSAorCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgcGNpX2NvbnRyb2xsZXI7CisKKy8qCisgKiBwY2lhdXRvX2J1c19zY2FuKCkgZW51bWVyYXRlcyB0aGUgcGNpIHNwYWNlLgorICovCisKK2V4dGVybiBpbnQgcGNpYXV0b19idXNfc2NhbihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKiwgaW50KTsKKworc3RydWN0IHBjaV9zcGFjZSB7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7Cit9OworCisvKgorICogU3RydWN0dXJlIG9mIGEgUENJIGNvbnRyb2xsZXIgKGhvc3QgYnJpZGdlKQorICovCisKK3N0cnVjdCBwY2lfY29udHJvbGxlciB7CisJaW50IGluZGV4OwkJCS8qIHVzZWQgZm9yIHBjaV9jb250cm9sbGVyX251bSAqLworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqbmV4dDsKKyAgICAgICAgc3RydWN0IHBjaV9idXMgKmJ1czsKKwl2b2lkICphcmNoX2RhdGE7CisKKwlpbnQgZmlyc3RfYnVzbm87CisJaW50IGxhc3RfYnVzbm87CisKKwlzdHJ1Y3QgcGNpX29wcyAqb3BzOworCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqY2ZnX2FkZHI7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqY2ZnX2RhdGE7CisKKwkvKiBDdXJyZW50bHksIHdlIGxpbWl0IG91cnNlbHZlcyB0byAxIElPIHJhbmdlIGFuZCAzIG1lbQorCSAqIHJhbmdlcyBzaW5jZSB0aGUgY29tbW9uIHBjaV9idXMgc3RydWN0dXJlIGNhbid0IGhhbmRsZSBtb3JlCisJICovCisJc3RydWN0IHJlc291cmNlCWlvX3Jlc291cmNlOworCXN0cnVjdCByZXNvdXJjZSBtZW1fcmVzb3VyY2VzWzNdOworCWludCBtZW1fcmVzb3VyY2VfY291bnQ7CisKKwkvKiBIb3N0IGJyaWRnZSBJL08gYW5kIE1lbW9yeSBzcGFjZQorCSAqIFVzZWQgZm9yIEJBUiBwbGFjZW1lbnQgYWxnb3JpdGhtcworCSAqLworCXN0cnVjdCBwY2lfc3BhY2UgaW9fc3BhY2U7CisJc3RydWN0IHBjaV9zcGFjZSBtZW1fc3BhY2U7CisKKwkvKiBSZXR1cm4gdGhlIGludGVycnVwdCBudW1iZXIgZm8gYSBkZXZpY2UuICovCisJaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYqLCB1OCwgdTgpOworCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpYmlvc19pbml0X3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50IGZsYWdzLCBjaGFyICpuYW1lKQoreworCXJlcy0+c3RhcnQgPSBzdGFydDsKKwlyZXMtPmVuZCA9IGVuZDsKKwlyZXMtPmZsYWdzID0gZmxhZ3M7CisJcmVzLT5uYW1lID0gbmFtZTsKKwlyZXMtPnBhcmVudCA9IE5VTEw7CisJcmVzLT5zaWJsaW5nID0gTlVMTDsKKwlyZXMtPmNoaWxkID0gTlVMTDsKK30KKworCisvKiBUaGVzZSBhcmUgdXNlZCBmb3IgY29uZmlnIGFjY2VzcyBiZWZvcmUgYWxsIHRoZSBQQ0kgcHJvYmluZyBoYXMgYmVlbiBkb25lLiAqLworaW50IGVhcmx5X3JlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9jb250cm9sbGVyKiwgaW50LCBpbnQsIGludCwgdTgqKTsKK2ludCBlYXJseV9yZWFkX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciosIGludCwgaW50LCBpbnQsIHUxNiopOworaW50IGVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfY29udHJvbGxlciosIGludCwgaW50LCBpbnQsIHUzMiopOworaW50IGVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKHN0cnVjdCBwY2lfY29udHJvbGxlciosIGludCwgaW50LCBpbnQsIHU4KTsKK2ludCBlYXJseV93cml0ZV9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqLCBpbnQsIGludCwgaW50LCB1MTYpOworaW50IGVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqLCBpbnQsIGludCwgaW50LCB1MzIpOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworI2VuZGlmCS8qIF9YVEVOU0FfUENJX0JSSURHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxNzc0MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wY2kuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teHRlbnNhL3BjaS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QQ0lfSAorI2RlZmluZSBfWFRFTlNBX1BDSV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBsb2dpYyBpbiBwY2lfc2Nhbl9idXMgZm9yIHNraXBwaW5nCisgKiBhbHJlYWR5LWNvbmZpZ3VyZWQgYnVzIG51bWJlcnMgLSB0byBiZSB1c2VkIGZvciBidWdneSBCSU9TZXMKKyAqIG9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbmNvbXBsZXRlIFBDSSBzZXR1cCBieSB0aGUgbG9hZGVyCisgKi8KKworI2RlZmluZSBwY2liaW9zX2Fzc2lnbl9hbGxfYnVzc2VzKCkJMAorCitleHRlcm4gc3RydWN0IHBjaV9jb250cm9sbGVyKiBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIodm9pZCk7CisKK2V4dGVybiBpbmxpbmUgdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKiBObyBzcGVjaWFsIGJ1cyBtYXN0ZXJpbmcgc2V0dXAgaGFuZGxpbmcgKi8KK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHBjaWJpb3NfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxKQoreworCS8qIFdlIGRvbid0IGRvIGR5bmFtaWMgUENJIElSUSBhbGxvY2F0aW9uICovCit9CisKKy8qIEFzc3VtZSBzb21lIHZhbHVlcy4gKFdlIHNob3VsZCByZXZpc2UgdGhlbSwgaWYgbmVjZXNzYXJ5KSAqLworCisjZGVmaW5lIFBDSUJJT1NfTUlOX0lPCQkweDIwMDAKKyNkZWZpbmUgUENJQklPU19NSU5fTUVNCQkweDEwMDAwMDAwCisKKy8qIER5bmFtaWMgRE1BIG1hcHBpbmcgc3R1ZmYuCisgKiBYdGVuc2EgaGFzIGV2ZXJ5dGhpbmcgbWFwcGVkIHN0YXRpY2FsbHkgbGlrZSB4ODYuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3QgcGNpX2RldjsKKworLyogVGhlIFBDSSBhZGRyZXNzIHNwYWNlIGRvZXMgZXF1YWwgdGhlIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIHNwYWNlLgorICogVGhlIG5ldHdvcmtpbmcgYW5kIGJsb2NrIGRldmljZSBsYXllcnMgdXNlIHRoaXMgYm9vbGVhbiBmb3IgYm91bmNlIGJ1ZmZlcgorICogZGVjaXNpb25zLgorICovCisKKyNkZWZpbmUgUENJX0RNQV9CVVNfSVNfUEhZUwkoMSkKKworLyogcGNpX3VubWFwX3twYWdlLHNpbmdsZX0gaXMgYSBuby1vcCwgc28gKi8KKyNkZWZpbmUgREVDTEFSRV9QQ0lfVU5NQVBfQUREUihBRERSX05BTUUpCisjZGVmaW5lIERFQ0xBUkVfUENJX1VOTUFQX0xFTihMRU5fTkFNRSkKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHIoUFRSLCBBRERSX05BTUUpCQkoMCkKKyNkZWZpbmUgcGNpX3VubWFwX2FkZHJfc2V0KFBUUiwgQUREUl9OQU1FLCBWQUwpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcGNpX3Vibm1hcF9sZW4oUFRSLCBMRU5fTkFNRSkJCSgwKQorI2RlZmluZSBwY2lfdW5tYXBfbGVuX3NldChQVFIsIExFTl9OQU1FLCBWQUwpCWRvIHsgfSB3aGlsZSAoMCkKKworLyogV2UgY2Fubm90IGFjY2VzcyBtZW1vcnkgYWJvdmUgNEdCICovCisjZGVmaW5lIHBjaV9kYWNfZG1hX3N1cHBvcnRlZChwY2lfZGV2LCBtYXNrKQkoMCkKKworLyogTWFwIGEgcmFuZ2Ugb2YgUENJIG1lbW9yeSBvciBJL08gc3BhY2UgZm9yIGEgZGV2aWNlIGludG8gdXNlciBzcGFjZSAqLworaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSk7CisKKy8qIFRlbGwgZHJpdmVycy9wY2kvcHJvYy5jIHRoYXQgd2UgaGF2ZSBwY2lfbW1hcF9wYWdlX3JhbmdlKCkgKi8KKyNkZWZpbmUgSEFWRV9QQ0lfTU1BUAkxCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKy8qIEltcGxlbWVudCB0aGUgcGNpXyBETUEgQVBJIGluIHRlcm1zIG9mIHRoZSBnZW5lcmljIGRldmljZSBkbWFfIG9uZSAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BjaS1kbWEtY29tcGF0Lmg+CisKKy8qIEdlbmVyaWMgUENJICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGNpLmg+CisKKyNlbmRpZgkvKiBfWFRFTlNBX1BDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGVyY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQyYmMyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZXJjcHUuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teHRlbnNhL3BlcmNwdS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QRVJDUFVfXworI2RlZmluZSBfWFRFTlNBX1BFUkNQVV9fCisKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZXJjcHUuaD4KKworI2VuZGlmIC8qIF9YVEVOU0FfUEVSQ1BVX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ2FsbG9jLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGdhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNGE4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGdhbGxvYy5oCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teHRlbnNhL3BnYWxsb2MuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUEdBTExPQ19ICisjZGVmaW5lIF9YVEVOU0FfUEdBTExPQ19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisKKy8qIENhY2hlIGFsaWFzaW5nOgorICoKKyAqIElmIHRoZSBjYWNoZSBzaXplIGZvciBvbmUgd2F5IGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGFnZSBzaXplLCB3ZSBoYXZlIHRvCisgKiBkZWFsIHdpdGggY2FjaGUgYWxpYXNpbmcuIFRoZSBjYWNoZSBpbmRleCBpcyB3aWRlciB0aGFuIHRoZSBwYWdlIHNpemU6CisgKgorICogICAgICB8Y2FjaGUgfAorICogfHBnbnVtIHxwYWdlfAl2aXJ0dWFsIGFkZHJlc3MKKyAqIHx4eHh4eFh8enp6enwKKyAqIHwgICAgICB8ICAgIHwKKyAqICAgXCAgLyB8ICAgIHwKKyAqICB0cmFucy58ICAgIHwKKyAqICAgLyAgXCB8ICAgIHwKKyAqIHx5eXl5eVl8enp6enwJcGh5c2ljYWwgYWRkcmVzcworICoKKyAqIFdoZW4gdGhlIHBhZ2UgbnVtYmVyIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcywgdGhlIGxvd2VzdAorICogYml0KHMpIChYKSB0aGF0IGFyZSBhbHNvIHBhcnQgb2YgdGhlIGNhY2hlIGluZGV4IGFyZSBhbHNvIHRyYW5zbGF0ZWQgKFkpLgorICogSWYgdGhpcyB0cmFuc2xhdGlvbiBjaGFuZ2VzIHRoaXMgYml0IChYKSwgdGhlIGNhY2hlIGluZGV4IGlzIGFsc28gYWZlY3RlZCwKKyAqIHRodXMgcmVzdWx0aW5nIGluIGEgZGlmZmVyZW50IGNhY2hlIGxpbmUgdGhhbiBiZWZvcmUuCisgKiBUaGUga2VybmVsIGRvZXMgbm90IHByb3ZpZGUgYSBtZWNoYW5pc20gdG8gZW5zdXJlIHRoYXQgdGhlIHBhZ2UgY29sb3IKKyAqIChyZXByZXNlbnRlZCBieSB0aGlzIGJpdCkgcmVtYWlucyB0aGUgc2FtZSB3aGVuIGFsbG9jYXRlZCBvciB3aGVuIHBhZ2VzCisgKiBhcmUgcmVtYXBwZWQuIFdoZW4gdXNlciBwYWdlcyBhcmUgbWFwcGVkIGludG8ga2VybmVsIHNwYWNlLCB0aGUgY29sb3Igb2YKKyAqIHRoZSBwYWdlIG1pZ2h0IGFsc28gY2hhbmdlLgorICoKKyAqIFdlIHVzZSB0aGUgYWRkcmVzcyBzcGFjZSBWTUFMTE9DX0VORCAuLi4gVk1BTExPQ19FTkQgKyBEQ0FDSEVfV0FZX1NJWkUgKiAyCisgKiB0byB0ZW1wb3JhcmlseSBtYXAgYSBwYXRjaCBzbyB3ZSBjYW4gbWF0Y2ggdGhlIGNvbG9yLgorICovCisKKyNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKQorIyBkZWZpbmUgUEFHRV9DT0xPUl9NQVNLCShQQUdFX01BU0sgJiAoRENBQ0hFX1dBWV9TSVpFLTEpKQorIyBkZWZpbmUgUEFHRV9DT0xPUihhKQkJXAorCSgoKHVuc2lnbmVkIGxvbmcpKGEpJlBBR0VfQ09MT1JfTUFTSykgPj4gUEFHRV9TSElGVCkKKyMgZGVmaW5lIFBBR0VfQ09MT1JfRVEoYSxiKQlcCisJKCgoKHVuc2lnbmVkIGxvbmcpKGEpIF4gKHVuc2lnbmVkIGxvbmcpKGIpKSAmIFBBR0VfQ09MT1JfTUFTSykgPT0gMCkKKyMgZGVmaW5lIFBBR0VfQ09MT1JfTUFQMCh2KQlcCisJKFZNQUxMT0NfRU5EICsgKCh1bnNpZ25lZCBsb25nKSh2KSAmIFBBR0VfQ09MT1JfTUFTSykpCisjIGRlZmluZSBQQUdFX0NPTE9SX01BUDEodikJXAorCShWTUFMTE9DX0VORCArICgodW5zaWduZWQgbG9uZykodikgJiBQQUdFX0NPTE9SX01BU0spICsgRENBQ0hFX1dBWV9TSVpFKQorI2VuZGlmCisKKy8qCisgKiBBbGxvY2F0aW5nIGFuZCBmcmVlaW5nIGEgcG1kIGlzIHRyaXZpYWw6IHRoZSAxLWVudHJ5IHBtZCBpcworICogaW5zaWRlIHRoZSBwZ2QsIHNvIGhhcyBubyBleHRyYSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGl0LgorICovCisKKyNkZWZpbmUgcGdkX2ZyZWUocGdkKQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpKHBnZCkpCisKKyNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKSAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcG1kX3BvcHVsYXRlX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZHAsIHB0ZV90ICpwdGUpCit7CisJcG1kX3ZhbCgqKHBtZHApKSA9ICh1bnNpZ25lZCBsb25nKShwdGUpOworCV9fYXNtX18gX192b2xhdGlsZV9fICgibWVtdzsgZGh3YiAlMCwgMDsgZHN5bmMiIDo6ICJhIiAocG1kcCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BtZF9wb3B1bGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZHAsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXBtZF92YWwoKihwbWRwKSkgPSAodW5zaWduZWQgbG9uZylwYWdlX3RvX3ZpcnQocGFnZSk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZW13OyBkaHdiICUwLCAwOyBkc3luYyIgOjogImEiIChwbWRwKSk7Cit9CisKKworCisjZWxzZQorCisjIGRlZmluZSBwbWRfcG9wdWxhdGVfa2VybmVsKG1tLCBwbWRwLCBwdGUpCQkJCSAgICAgXAorCShwbWRfdmFsKCoocG1kcCkpID0gKHVuc2lnbmVkIGxvbmcpKHB0ZSkpCisjIGRlZmluZSBwbWRfcG9wdWxhdGUobW0sIHBtZHAsIHBhZ2UpCQkJCQkgICAgIFwKKwkocG1kX3ZhbCgqKHBtZHApKSA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfdG9fdmlydChwYWdlKSkKKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgcGdkX3QqCitwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcGdkX3QgKnBnZDsKKworCXBnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLCBQR0RfT1JERVIpOworCisJaWYgKGxpa2VseShwZ2QgIT0gTlVMTCkpCisJCV9fZmx1c2hfZGNhY2hlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGdkKTsKKworCXJldHVybiBwZ2Q7Cit9CisKK2V4dGVybiBwdGVfdCogcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCogbW0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gc3RydWN0IHBhZ2UqIHB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCogbW0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKKyNkZWZpbmUgcHRlX2ZyZWVfa2VybmVsKHB0ZSkgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXB0ZSkKKyNkZWZpbmUgcHRlX2ZyZWUocHRlKSBfX2ZyZWVfcGFnZShwdGUpCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZW5kaWYgLyogX1hURU5TQV9QR0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjY0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcGd0YWJsZS5oCkBAIC0wLDAgKzEsNDY4IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teHRlbnNhL3BhZ2UuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24yIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1BHVEFCTEVfSAorI2RlZmluZSBfWFRFTlNBX1BHVEFCTEVfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKy8qIEFzc2VydGlvbnMuICovCisKKyNpZmRlZiBDT05GSUdfTU1VCisKKworI2lmIChYQ0hBTF9NTVVfUklOR1MgPCAyKQorIyBlcnJvciBMaW51eCBidWlsZCBhc3N1bWVzIGF0IGxlYXN0IDIgcmluZyBsZXZlbHMuCisjZW5kaWYKKworI2lmIChYQ0hBTF9NTVVfQ0FfQklUUyAhPSA0KQorIyBlcnJvciBXZSBhc3N1bWUgZXhhY3RseSBmb3VyIGJpdHMgZm9yIENBLgorI2VuZGlmCisKKyNpZiAoWENIQUxfTU1VX1NSX0JJVFMgIT0gMCkKKyMgZXJyb3IgV2UgaGF2ZSBubyByb29tIGZvciBTUiBiaXRzLgorI2VuZGlmCisKKy8qCisgKiBVc2UgdGhlIGZpcnN0IG1pbi13aXJlZCB3YXkgZm9yIG1hcHBpbmcgcGFnZS10YWJsZSBwYWdlcy4KKyAqIFBhZ2UgY29sb3JpbmcgcmVxdWlyZXMgYSBzZWNvbmQgbWluLXdpcmVkIHdheS4KKyAqLworCisjaWYgKFhDSEFMX0RUTEJfTUlOV0lSRURfU0VUUyA9PSAwKQorIyBlcnJvciBOZWVkIGEgbWluLXdpcmVkIHdheSBmb3IgbWFwcGluZyBwYWdlLXRhYmxlIHBhZ2VzCisjZW5kaWYKKworI2RlZmluZSBEVExCX1dBWV9QR1RBQkxFIFhDSEFMX0RUTEJfU0VUKFhDSEFMX0RUTEJfTUlOV0lSRURfU0VUMCwgV0FZKQorCisjaWYgKERDQUNIRV9XQVlfU0laRSA+IFBBR0VfU0laRSkgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworIyBpZiBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX01JTldJUkVEX1NFVDAsIFdBWVMpID49IDIKKyMgIGRlZmluZSBEVExCX1dBWV9EQ0FDSEVfQUxJQVMwIChEVExCX1dBWV9QR1RBQkxFICsgMSkKKyMgIGRlZmluZSBEVExCX1dBWV9EQ0FDSEVfQUxJQVMxIChEVExCX1dBWV9QR1RBQkxFICsgMikKKyMgZWxzZQorIyAgZXJyb3IgUGFnZSBjb2xvcmluZyByZXF1aXJlcyBpdHMgb3duIHdpcmVkIGR0bGIgd2F5IQorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKKy8qCisgKiBXZSBvbmx5IHVzZSB0d28gcmluZyBsZXZlbHMsIHVzZXIgYW5kIGtlcm5lbCBzcGFjZS4KKyAqLworCisjZGVmaW5lIFVTRVJfUklORwkJMQkvKiB1c2VyIHJpbmcgbGV2ZWwgKi8KKyNkZWZpbmUgS0VSTkVMX1JJTkcJCTAJLyoga2VybmVsIHJpbmcgbGV2ZWwgKi8KKworLyoKKyAqIFRoZSBYdGVuc2EgYXJjaGl0ZWN0dXJlIHBvcnQgb2YgTGludXggaGFzIGEgdHdvLWxldmVsIHBhZ2UgdGFibGUgc3lzdGVtLAorICogaS5lLiB0aGUgbG9naWNhbCB0aHJlZS1sZXZlbCBMaW51eCBwYWdlIHRhYmxlIGxheW91dCBhcmUgZm9sZGVkLgorICogRWFjaCB0YXNrIGhhcyB0aGUgZm9sbG93aW5nIG1lbW9yeSBwYWdlIHRhYmxlczoKKyAqCisgKiAgIFBHRCB0YWJsZSAocGFnZSBkaXJlY3RvcnkpLCBpZS4gM3JkLWxldmVsIHBhZ2UgdGFibGU6CisgKglPbmUgcGFnZSAoNCBrQikgb2YgMTAyNCAoUFRSU19QRVJfUEdEKSBwb2ludGVycyB0byBQVEUgdGFibGVzCisgKgkoQXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhdmUgdGhlIFBNRCBmb2xkZWQgcG9pbnQgdG8gdGhlIFBNRCB0YWJsZXMpCisgKgorICoJVGhlIHBvaW50ZXIgdG8gdGhlIFBHRCB0YWJsZSBmb3IgYSBnaXZlbiB0YXNrIGNhbiBiZSByZXRyaWV2ZWQgZnJvbQorICoJdGhlIHRhc2sgc3RydWN0dXJlIChzdHJ1Y3QgdGFza19zdHJ1Y3QqKSB0LCBlLmcuIGN1cnJlbnQoKToKKyAqCSAgKHQtPm1tID8gdC0+bW0gOiB0LT5hY3RpdmVfbW0pLT5wZ2QKKyAqCisgKiAgIFBNRCB0YWJsZXMgKHBhZ2UgbWlkZGxlLWRpcmVjdG9yeSksIGllLiAybmQtbGV2ZWwgcGFnZSB0YWJsZXM6CisgKglBYnNlbnQgZm9yIHRoZSBYdGVuc2EgYXJjaGl0ZWN0dXJlIChmb2xkZWQsIFBUUlNfUEVSX1BNRCA9PSAxKS4KKyAqCisgKiAgIFBURSB0YWJsZXMgKHBhZ2UgdGFibGUgZW50cnkpLCBpZS4gMXN0LWxldmVsIHBhZ2UgdGFibGVzOgorICoJT25lIHBhZ2UgKDQga0IpIG9mIDEwMjQgKFBUUlNfUEVSX1BURSkgUFRFcyB3aXRoIGEgc3BlY2lhbCBQVEUKKyAqCWludmFsaWRfcHRlX3RhYmxlIGZvciBhYnNlbnQgbWFwcGluZ3MuCisgKgorICogVGhlIGluZGl2aWR1YWwgcGFnZXMgYXJlIDQga0IgYmlnIHdpdGggc3BlY2lhbCBwYWdlcyBmb3IgdGhlIGVtcHR5X3plcm9fcGFnZS4KKyAqLworI2RlZmluZSBQR0RJUl9TSElGVAkyMgorI2RlZmluZSBQR0RJUl9TSVpFCSgxVUwgPDwgUEdESVJfU0hJRlQpCisjZGVmaW5lIFBHRElSX01BU0sJKH4oUEdESVJfU0laRS0xKSkKKworLyoKKyAqIEVudHJpZXMgcGVyIHBhZ2UgZGlyZWN0b3J5IGxldmVsOiB3ZSB1c2UgdHdvLWxldmVsLCBzbworICogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYW55IFBNRCBkaXJlY3RvcnkgcGh5c2ljYWxseS4KKyAqLworI2RlZmluZSBQVFJTX1BFUl9QVEUJCTEwMjQKKyNkZWZpbmUgUFRSU19QRVJfUFRFX1NISUZUCTEwCisjZGVmaW5lIFBUUlNfUEVSX1BNRAkJMQorI2RlZmluZSBQVFJTX1BFUl9QR0QJCTEwMjQKKyNkZWZpbmUgUEdEX09SREVSCQkwCisjZGVmaW5lIFBNRF9PUkRFUgkJMAorI2RlZmluZSBVU0VSX1BUUlNfUEVSX1BHRAkoVEFTS19TSVpFL1BHRElSX1NJWkUpCisjZGVmaW5lIEZJUlNUX1VTRVJfQUREUkVTUyAgICAgIFhDSEFMX1NFR19NQVBQQUJMRV9WQUREUgorI2RlZmluZSBGSVJTVF9VU0VSX1BHRF9OUgkoRklSU1RfVVNFUl9BRERSRVNTID4+IFBHRElSX1NISUZUKQorCisvKiB2aXJ0dWFsIG1lbW9yeSBhcmVhLiBXZSBrZWVwIGEgZGlzdGFuY2UgdG8gb3RoZXIgbWVtb3J5IHJlZ2lvbnMgdG8gYmUKKyAqIG9uIHRoZSBzYWZlIHNpZGUuIFdlIGFsc28gdXNlIHRoaXMgYXJlYSBmb3IgY2FjaGUgYWxpYXNpbmcuCisgKi8KKworLy8gRklYTUU6IHZpcnR1YWwgbWVtb3J5IGFyZWEgbXVzdCBiZSBjb25maWd1cmF0aW9uLWRlcGVuZGVudAorCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQJCTB4QzAwMDAwMDAKKyNkZWZpbmUgVk1BTExPQ19FTkQJCTB4QzdGRjAwMDAKKworLyogWHRlbnNhIExpbnV4IGNvbmZpZyBQVEUgbGF5b3V0ICh3aGVuIHByZXNlbnQpOgorICoJMzEtMTI6CVBQTgorICoJMTEtNjoJU29mdHdhcmUKKyAqCTUtNDoJUklORworICoJMy0wOglDQQorICoKKyAqIFNpbWlsYXIgdG8gdGhlIEFscGhhIGFuZCBNSVBTIHBvcnRzLCB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHJlZgorICogYW5kIG1vZCBiaXRzIGluIHNvZnR3YXJlLiAgV2UgaGF2ZSBhIHNvZnR3YXJlICJ5b3UgY2FuIHJlYWQKKyAqIGZyb20gdGhpcyBwYWdlIiBiaXQsIGFuZCBhIGhhcmR3YXJlIG9uZSB3aGljaCBhY3R1YWxseSBsZXRzIHRoZQorICogcHJvY2VzcyByZWFkIGZyb20gdGhlIHBhZ2UuICBPbiB0aGUgc2FtZSB0b2tlbiB3ZSBoYXZlIGEgc29mdHdhcmUKKyAqIHdyaXRhYmxlIGJpdCBhbmQgdGhlIHJlYWwgaGFyZHdhcmUgb25lIHdoaWNoIGFjdHVhbGx5IGxldHMgdGhlCisgKiBwcm9jZXNzIHdyaXRlIHRvIHRoZSBwYWdlLgorICoKKyAqIFNlZSBmdXJ0aGVyIGJlbG93IGZvciBQVEUgbGF5b3V0IGZvciBzd2FwcGVkLW91dCBwYWdlcy4KKyAqLworCisjZGVmaW5lIF9QQUdFX1ZBTElECQkoMTw8MCkJLyogaGFyZHdhcmU6IHBhZ2UgaXMgYWNjZXNzaWJsZSAqLworI2RlZmluZSBfUEFHRV9XUkVOQUJMRQkJKDE8PDEpCS8qIGhhcmR3YXJlOiBwYWdlIGlzIHdyaXRhYmxlICovCisKKy8qIE5vbmUgb2YgdGhlc2UgY2FjaGUgbW9kZXMgaW5jbHVkZSBNUCBjb2hlcmVuY3k6ICAqLworI2RlZmluZSBfUEFHRV9OT19DQUNIRQkJKDA8PDIpCS8qIGJ5cGFzcywgbm9uLXNwZWN1bGF0aXZlICovCisjaWYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworIyBkZWZpbmUgX1BBR0VfV1JJVEVCQUNLCSgxPDwyKQkvKiB3cml0ZSBiYWNrICovCisjIGRlZmluZSBfUEFHRV9XUklURVRIUlUJKDI8PDIpCS8qIHdyaXRlIHRocm91Z2ggKi8KKyNlbHNlCisjIGRlZmluZSBfUEFHRV9XUklURUJBQ0sJKDE8PDIpCS8qIGFzc3VtZSB3cml0ZSB0aHJvdWdoICovCisjIGRlZmluZSBfUEFHRV9XUklURVRIUlUJKDE8PDIpCisjZW5kaWYKKyNkZWZpbmUgX1BBR0VfTk9BTExPQwkJKDM8PDIpCS8qIGRvbid0IGFsbG9jYXRlIGNhY2hlLGlmIG5vdCBjYWNoZWQgKi8KKyNkZWZpbmUgX0NBQ0hFX01BU0sJCSgzPDwyKQorCisjZGVmaW5lIF9QQUdFX1VTRVIJCSgxPDw0KQkvKiB1c2VyIGFjY2VzcyAocmluZz0xKSAqLworI2RlZmluZSBfUEFHRV9LRVJORUwJCSgwPDw0KQkvKiBrZXJuZWwgYWNjZXNzIChyaW5nPTApICovCisKKy8qIFNvZnR3YXJlICovCisjZGVmaW5lIF9QQUdFX1JXCQkoMTw8NikJLyogc29mdHdhcmU6IHBhZ2Ugd3JpdGFibGUgKi8KKyNkZWZpbmUgX1BBR0VfRElSVFkJCSgxPDw3KQkvKiBzb2Z0d2FyZTogcGFnZSBkaXJ0eSAqLworI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkJKDE8PDgpCS8qIHNvZnR3YXJlOiBwYWdlIGFjY2Vzc2VkIChyZWFkKSAqLworI2RlZmluZSBfUEFHRV9GSUxFCQkoMTw8OSkJLyogbm9ubGluZWFyIGZpbGUgbWFwcGluZyovCisKKyNkZWZpbmUgX1BBR0VfQ0hHX01BU0sJKFBBR0VfTUFTSyB8IF9QQUdFX0FDQ0VTU0VEIHwgX0NBQ0hFX01BU0sgfCBfUEFHRV9ESVJUWSkKKyNkZWZpbmUgX1BBR0VfUFJFU0VOVAkoIF9QQUdFX1ZBTElEIHwgX1BBR0VfV1JJVEVCQUNLIHwgX1BBR0VfQUNDRVNTRUQpCisKKyNpZmRlZiBDT05GSUdfTU1VCisKKyMgZGVmaW5lIFBBR0VfTk9ORQlfX3BncHJvdChfUEFHRV9QUkVTRU5UKQorIyBkZWZpbmUgUEFHRV9TSEFSRUQJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIgfCBfUEFHRV9SVykKKyMgZGVmaW5lIFBBR0VfQ09QWQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUikKKyMgZGVmaW5lIFBBR0VfUkVBRE9OTFkJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1VTRVIpCisjIGRlZmluZSBQQUdFX0tFUk5FTAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfS0VSTkVMIHwgX1BBR0VfV1JFTkFCTEUpCisjIGRlZmluZSBQQUdFX0lOVkFMSUQJX19wZ3Byb3QoX1BBR0VfVVNFUikKKworIyBpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKQorIyAgZGVmaW5lIFBBR0VfRElSRUNUT1JZICBfX3BncHJvdChfUEFHRV9WQUxJRCB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfS0VSTkVMKQorIyBlbHNlCisjICBkZWZpbmUgUEFHRV9ESVJFQ1RPUlkgIF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9LRVJORUwpCisjIGVuZGlmCisKKyNlbHNlIC8qIG5vIG1tdSAqLworCisjIGRlZmluZSBQQUdFX05PTkUgICAgICAgX19wZ3Byb3QoMCkKKyMgZGVmaW5lIFBBR0VfU0hBUkVEICAgICBfX3BncHJvdCgwKQorIyBkZWZpbmUgUEFHRV9DT1BZICAgICAgIF9fcGdwcm90KDApCisjIGRlZmluZSBQQUdFX1JFQURPTkxZICAgX19wZ3Byb3QoMCkKKyMgZGVmaW5lIFBBR0VfS0VSTkVMICAgICBfX3BncHJvdCgwKQorCisjZW5kaWYKKworLyoKKyAqIE9uIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb2YgWHRlbnNhIE1NVXMgKGVnLiB0aGUgaW5pdGlhbCBMaW51eCBjb25maWcpLAorICogdGhlIE1NVSBjYW4ndCBkbyBwYWdlIHByb3RlY3Rpb24gZm9yIGV4ZWN1dGUsIGFuZCBjb25zaWRlcnMgdGhhdCB0aGUgc2FtZSBhcworICogcmVhZC4gIEFsc28sIHdyaXRlIHBlcm1pc3Npb25zIG1heSBpbXBseSByZWFkIHBlcm1pc3Npb25zLgorICogV2hhdCBmb2xsb3dzIGlzIHRoZSBjbG9zZXN0IHdlIGNhbiBnZXQgYnkgcmVhc29uYWJsZSBtZWFucy4uCisgKiBTZWUgbGludXgvbW0vbW1hcC5jIGZvciBwcm90ZWN0aW9uX21hcFtdIGFycmF5IHRoYXQgdXNlcyB0aGVzZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBfX1AwMDAJUEFHRV9OT05FCS8qIHByaXZhdGUgLS0tICovCisjZGVmaW5lIF9fUDAwMQlQQUdFX1JFQURPTkxZCS8qIHByaXZhdGUgLS1yICovCisjZGVmaW5lIF9fUDAxMAlQQUdFX0NPUFkJLyogcHJpdmF0ZSAtdy0gKi8KKyNkZWZpbmUgX19QMDExCVBBR0VfQ09QWQkvKiBwcml2YXRlIC13ciAqLworI2RlZmluZSBfX1AxMDAJUEFHRV9SRUFET05MWQkvKiBwcml2YXRlIHgtLSAqLworI2RlZmluZSBfX1AxMDEJUEFHRV9SRUFET05MWQkvKiBwcml2YXRlIHgtciAqLworI2RlZmluZSBfX1AxMTAJUEFHRV9DT1BZCS8qIHByaXZhdGUgeHctICovCisjZGVmaW5lIF9fUDExMQlQQUdFX0NPUFkJLyogcHJpdmF0ZSB4d3IgKi8KKworI2RlZmluZSBfX1MwMDAJUEFHRV9OT05FCS8qIHNoYXJlZCAgLS0tICovCisjZGVmaW5lIF9fUzAwMQlQQUdFX1JFQURPTkxZCS8qIHNoYXJlZCAgLS1yICovCisjZGVmaW5lIF9fUzAxMAlQQUdFX1NIQVJFRAkvKiBzaGFyZWQgIC13LSAqLworI2RlZmluZSBfX1MwMTEJUEFHRV9TSEFSRUQJLyogc2hhcmVkICAtd3IgKi8KKyNkZWZpbmUgX19TMTAwCVBBR0VfUkVBRE9OTFkJLyogc2hhcmVkICB4LS0gKi8KKyNkZWZpbmUgX19TMTAxCVBBR0VfUkVBRE9OTFkJLyogc2hhcmVkICB4LXIgKi8KKyNkZWZpbmUgX19TMTEwCVBBR0VfU0hBUkVECS8qIHNoYXJlZCAgeHctICovCisjZGVmaW5lIF9fUzExMQlQQUdFX1NIQVJFRAkvKiBzaGFyZWQgIHh3ciAqLworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIHB0ZV9FUlJPUihlKSBcCisJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcHRlX3ZhbChlKSkKKyNkZWZpbmUgcGdkX0VSUk9SKGUpIFwKKwlwcmludGsoIiVzOiVkOiBiYWQgcGdkIGVudHJ5ICUwOGx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBwZ2RfdmFsKGUpKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbMTAyNF07CisKKyNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCisKK2V4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQQUdFX1NJWkUvc2l6ZW9mKHBnZF90KV07CisKKy8qCisgKiBUaGUgcG1kIGNvbnRhaW5zIHRoZSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwdGUgcGFnZS4KKyAqLworI2RlZmluZSBwbWRfcGFnZV9rZXJuZWwocG1kKSAoKHVuc2lnbmVkIGxvbmcpKHBtZF92YWwocG1kKSAmIFBBR0VfTUFTSykpCisjZGVmaW5lIHBtZF9wYWdlKHBtZCkgdmlydF90b19wYWdlKHBtZF92YWwocG1kKSkKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KKyAqLworI2RlZmluZSBwdGVfbm9uZShwdGUpCSAoIShwdGVfdmFsKHB0ZSkgXiBfUEFHRV9VU0VSKSkKKyNkZWZpbmUgcHRlX3ByZXNlbnQocHRlKSAocHRlX3ZhbChwdGUpICYgX1BBR0VfVkFMSUQpCisjZGVmaW5lIHB0ZV9jbGVhcihtbSxhZGRyLHB0ZXApCQkJCQkJXAorCWRvIHsgdXBkYXRlX3B0ZShwdGVwLCBfX3B0ZShfUEFHRV9VU0VSKSk7IH0gd2hpbGUoMCkKKworI2RlZmluZSBwbWRfbm9uZShwbWQpCSAoIXBtZF92YWwocG1kKSkKKyNkZWZpbmUgcG1kX3ByZXNlbnQocG1kKSAocG1kX3ZhbChwbWQpICYgUEFHRV9NQVNLKQorI2RlZmluZSBwbWRfY2xlYXIocG1kcCkJIGRvIHsgc2V0X3BtZChwbWRwLCBfX3BtZCgwKSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHBtZF9iYWQocG1kKQkgKHBtZF92YWwocG1kKSAmIH5QQUdFX01BU0spCisKKy8qIE5vdGU6IFdlIHVzZSB0aGUgX1BBR0VfVVNFUiBiaXQgdG8gaW5kaWNhdGUgd3JpdGUtcHJvdGVjdCBrZXJuZWwgbWVtb3J5ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9yZWFkKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1VTRVI7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX1JXOyB9CitzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKSB7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkgeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfQUNDRVNTRUQ7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9maWxlKHB0ZV90IHB0ZSkgIHsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0ZJTEU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3dycHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH4oX1BBR0VfUlcgfCBfUEFHRV9XUkVOQUJMRSk7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX3JkcHJvdGVjdChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9VU0VSOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2NsZWFuKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgJj0gfl9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpICY9IH5fUEFHRV9BQ0NFU1NFRDsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtyZWFkKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfVVNFUjsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtkaXJ0eShwdGVfdCBwdGUpCXsgcHRlX3ZhbChwdGUpIHw9IF9QQUdFX0RJUlRZOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3lvdW5nKHB0ZV90IHB0ZSkJeyBwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfQUNDRVNTRUQ7IHJldHVybiBwdGU7IH0KK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQl7IHB0ZV92YWwocHRlKSB8PSBfUEFHRV9SVzsgcmV0dXJuIHB0ZTsgfQorCisvKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnM6IGNvbnZlcnQgYSBwYWdlIGFuZCBwcm90ZWN0aW9uIHRvIGEgcGFnZSBlbnRyeSwKKyAqIGFuZCBhIHBhZ2UgZW50cnkgYW5kIHBhZ2UgZGlyZWN0b3J5IHRvIHRoZSBwYWdlIHRoZXkgcmVmZXIgdG8uCisgKi8KKyNkZWZpbmUgcHRlX3BmbihwdGUpCQkocHRlX3ZhbChwdGUpID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIHB0ZV9zYW1lKGEsYikJCShwdGVfdmFsKGEpID09IHB0ZV92YWwoYikpCisjZGVmaW5lIHB0ZV9wYWdlKHgpCQlwZm5fdG9fcGFnZShwdGVfcGZuKHgpKQorI2RlZmluZSBwZm5fcHRlKHBmbiwgcHJvdCkJX19wdGUoKChwZm4pIDw8IFBBR0VfU0hJRlQpIHwgcGdwcm90X3ZhbChwcm90KSkKKyNkZWZpbmUgbWtfcHRlKHBhZ2UsIHByb3QpCXBmbl9wdGUocGFnZV90b19wZm4ocGFnZSksIHByb3QpCisKK2V4dGVybiBpbmxpbmUgcHRlX3QgcHRlX21vZGlmeShwdGVfdCBwdGUsIHBncHJvdF90IG5ld3Byb3QpCit7CisJcmV0dXJuIF9fcHRlKChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9DSEdfTUFTSykgfCBwZ3Byb3RfdmFsKG5ld3Byb3QpKTsKK30KKworLyoKKyAqIENlcnRhaW4gYXJjaGl0ZWN0dXJlcyBuZWVkIHRvIGRvIHNwZWNpYWwgdGhpbmdzIHdoZW4gcHRlJ3MKKyAqIHdpdGhpbiBhIHBhZ2UgdGFibGUgYXJlIGRpcmVjdGx5IG1vZGlmaWVkLiAgVGh1cywgdGhlIGZvbGxvd2luZworICogaG9vayBpcyBtYWRlIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9wdGUocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKK3sKKwkqcHRlcCA9IHB0ZXZhbDsKKyNpZiAoRENBQ0hFX1dBWV9TSVpFID4gUEFHRV9TSVpFKSAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtZW13OyBkaHdiICUwLCAwOyBkc3luYyIgOjogImEiIChwdGVwKSk7CisjZW5kaWYKK30KKworZXh0ZXJuIGlubGluZSB2b2lkCitzZXRfcHRlX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJdXBkYXRlX3B0ZShwdGVwLCBwdGV2YWwpOworfQorCisKK2V4dGVybiBpbmxpbmUgdm9pZAorc2V0X3BtZChwbWRfdCAqcG1kcCwgcG1kX3QgcG1kdmFsKQoreworCSpwbWRwID0gcG1kdmFsOworI2lmIChEQ0FDSEVfV0FZX1NJWkUgPiBQQUdFX1NJWkUpICYmIFhDSEFMX0RDQUNIRV9JU19XUklURUJBQ0sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm1lbXc7IGRod2IgJTAsIDA7IGRzeW5jIiA6OiAiYSIgKHBtZHApKTsKKyNlbmRpZgorfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CitwdGVwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCisgICAgCQkJICBwdGVfdCAqcHRlcCkKK3sKKwlwdGVfdCBwdGUgPSAqcHRlcDsKKwlpZiAoIXB0ZV95b3VuZyhwdGUpKQorCQlyZXR1cm4gMDsKKwl1cGRhdGVfcHRlKHB0ZXAsIHB0ZV9ta29sZChwdGUpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3B0ZXBfdGVzdF9hbmRfY2xlYXJfZGlydHkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKKyAgIAkJCSAgcHRlX3QgKnB0ZXApCit7CisJcHRlX3QgcHRlID0gKnB0ZXA7CisJaWYgKCFwdGVfZGlydHkocHRlKSkKKwkJcmV0dXJuIDA7CisJdXBkYXRlX3B0ZShwdGVwLCBwdGVfbWtjbGVhbihwdGUpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdAorcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQoreworCXB0ZV90IHB0ZSA9ICpwdGVwOworCXB0ZV9jbGVhcihtbSwgYWRkciwgcHRlcCk7CisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitwdGVwX3NldF93cnByb3RlY3Qoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCit7CisgIAlwdGVfdCBwdGUgPSAqcHRlcDsKKyAgCXVwZGF0ZV9wdGUocHRlcCwgcHRlX3dycHJvdGVjdChwdGUpKTsKK30KKworLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIGtlcm5lbCBwYWdlLXRhYmxlLWRpcmVjdG9yeSAqLworI2RlZmluZSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcykJcGdkX29mZnNldCgmaW5pdF9tbSwgYWRkcmVzcykKKworLyogdG8gZmluZCBhbiBlbnRyeSBpbiBhIHBhZ2UtdGFibGUtZGlyZWN0b3J5ICovCisjZGVmaW5lIHBnZF9vZmZzZXQobW0sYWRkcmVzcykJKChtbSktPnBnZCArIHBnZF9pbmRleChhZGRyZXNzKSkKKworI2RlZmluZSBwZ2RfaW5kZXgoYWRkcmVzcykJKChhZGRyZXNzKSA+PiBQR0RJUl9TSElGVCkKKworLyogRmluZCBhbiBlbnRyeSBpbiB0aGUgc2Vjb25kLWxldmVsIHBhZ2UgdGFibGUuLiAqLworI2RlZmluZSBwbWRfb2Zmc2V0KGRpcixhZGRyZXNzKSAoKHBtZF90KikoZGlyKSkKKworLyogRmluZCBhbiBlbnRyeSBpbiB0aGUgdGhpcmQtbGV2ZWwgcGFnZSB0YWJsZS4uICovCisjZGVmaW5lIHB0ZV9pbmRleChhZGRyZXNzKQkoKChhZGRyZXNzKSA+PiBQQUdFX1NISUZUKSAmIChQVFJTX1BFUl9QVEUgLSAxKSkKKyNkZWZpbmUgcHRlX29mZnNldF9rZXJuZWwoZGlyLGFkZHIpIAkJCQkJXAorCSgocHRlX3QqKSBwbWRfcGFnZV9rZXJuZWwoKihkaXIpKSArIHB0ZV9pbmRleChhZGRyKSkKKyNkZWZpbmUgcHRlX29mZnNldF9tYXAoZGlyLGFkZHIpCXB0ZV9vZmZzZXRfa2VybmVsKChkaXIpLChhZGRyKSkKKyNkZWZpbmUgcHRlX29mZnNldF9tYXBfbmVzdGVkKGRpcixhZGRyKQlwdGVfb2Zmc2V0X2tlcm5lbCgoZGlyKSwoYWRkcikpCisKKyNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcHRlX3VubWFwX25lc3RlZChwdGUpCWRvIHsgfSB3aGlsZSAoMCkKKworCisvKgorICogRW5jb2RlIGFuZCBkZWNvZGUgYSBzd2FwIGVudHJ5LgorICogRWFjaCBQVEUgaW4gYSBwcm9jZXNzIFZNJ3MgcGFnZSB0YWJsZSBpcyBlaXRoZXI6CisgKiAgICJwcmVzZW50IiAtLSB2YWxpZCBhbmQgbm90IHN3YXBwZWQgb3V0LCBwcm90ZWN0aW9uIGJpdHMgYXJlIG1lYW5pbmdmdWw7CisgKiAgICJub3QgcHJlc2VudCIgLS0gd2hpY2ggZnVydGhlciBzdWJkaXZpZGVzIGluIHRoZXNlIHR3byBjYXNlczoKKyAqICAgICAgIm5vbmUiIC0tIG5vIG1hcHBpbmcgYXQgYWxsOyBpZGVudGlmaWVkIGJ5IHB0ZV9ub25lKCksIHNldCBieSBwdGVfY2xlYXIoCisgKiAgICAgICJzd2FwcGVkIG91dCIgLS0gdGhlIHBhZ2UgaXMgc3dhcHBlZCBvdXQsIGFuZCB0aGUgU1dQIG1hY3JvcyBiZWxvdworICogICAgICAgICAgICAgICAgICAgICAgYXJlIHVzZWQgdG8gc3RvcmUgc3dhcCBmaWxlIGluZm8gaW4gdGhlIFBURSBpdHNlbGYuCisgKgorICogSW4gdGhlIFh0ZW5zYSBwcm9jZXNzb3IgTU1VLCBhbnkgUFRFIGVudHJpZXMgaW4gdXNlciBzcGFjZSAob3IgYW55d2hlcmUKKyAqIGluIHZpcnR1YWwgbWVtb3J5IHRoYXQgY2FuIG1hcCBkaWZmZXJlbnRseSBhY3Jvc3MgYWRkcmVzcyBzcGFjZXMpCisgKiBtdXN0IGhhdmUgYSBjb3JyZWN0IHJpbmcgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBSQVNJRCBmaWVsZCB0aGF0CisgKiBpcyBjaGFuZ2VkIHdoZW4gc3dpdGNoaW5nIGFkZHJlc3Mgc3BhY2VzLiAgRWcuIHN1Y2ggUFRFIGVudHJpZXMgY2Fubm90CisgKiBiZSBzZXQgdG8gcmluZyB6ZXJvLCBiZWNhdXNlIHRoYXQgY2FuIGNhdXNlIGEgKGdsb2JhbCkga2VybmVsIEFTSUQKKyAqIGVudHJ5IHRvIGJlIGNyZWF0ZWQgaW4gdGhlIFRMQnMgKGV2ZW4gd2l0aCBpbnZhbGlkIGNhY2hlIGF0dHJpYnV0ZSksCisgKiBwb3RlbnRpYWxseSBjYXVzaW5nIGEgbXVsdGloaXQgZXhjZXB0aW9uIHdoZW4gZ29pbmcgYmFjayB0byBhbm90aGVyCisgKiBhZGRyZXNzIHNwYWNlIHRoYXQgbWFwcGVkIHRoZSBzYW1lIHZpcnR1YWwgYWRkcmVzcyBhdCBhbm90aGVyIHJpbmcuCisgKgorICogU086IHdlIGF2b2lkIHVzaW5nIHJpbmcgYml0cyAoX1BBR0VfUklOR19NQVNLKSBpbiAibm90IHByZXNlbnQiIFBURXMuCisgKiBXZSBhbHNvIGF2b2lkIHVzaW5nIHRoZSBfUEFHRV9WQUxJRCBiaXQgd2hpY2ggbXVzdCBiZSB6ZXJvIGZvciBub24tcHJlc2VudAorICogcGFnZXMuCisgKgorICogV2UgZW5kIHVwIHdpdGggdGhlIGZvbGxvd2luZyBhdmFpbGFibGUgYml0czogIDEuLjMgYW5kIDcuLjMxLgorICogV2UgZG9uJ3QgYm90aGVyIHdpdGggMS4uMyBmb3Igbm93ICh3ZSBjYW4gdXNlIHRoZW0gbGF0ZXIgaWYgbmVlZGVkKSwKKyAqIGFuZCBjaG9zZSB0byBhbGxvY2F0ZSA2IGJpdHMgZm9yIFNXUF9UWVBFIGFuZCB0aGUgcmVtYWluaW5nIDE5IGJpdHMKKyAqIGZvciBTV1BfT0ZGU0VULiAgQXQgbGVhc3QgNSBiaXRzIGFyZSBuZWVkZWQgZm9yIFNXUF9UWVBFLCBiZWNhdXNlIGl0CisgKiBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgYW4gaW5kZXggaW50byBzd2FwX2luZm9bTUFYX1NXQVBGSUxFU10KKyAqIGFuZCBNQVhfU1dBUEZJTEVTIGlzIGN1cnJlbnRseSBkZWZpbmVkIGFzIDMyIGluIDxsaW51eC9zd2FwLmg+LgorICogSG93ZXZlciwgZm9yIHNvbWUgcmVhc29uIGFsbCBvdGhlciBhcmNoaXRlY3R1cmVzIGluIHRoZSAyLjQga2VybmVsCisgKiByZXNlcnZlIGVpdGhlciA2LCA3LCBvciA4IGJpdHMgc28gSSdsbCBub3QgZGV0cmFjdCBmcm9tIHRoYXQgZm9yIG5vdy4gIDopCisgKiBTV1BfT0ZGU0VUIGlzIGFuIG9mZnNldCBpbnRvIHRoZSBzd2FwIGZpbGUgaW4gcGFnZS1zaXplIHVuaXRzLCBzbworICogd2l0aCA0IGtCIHBhZ2VzLCAxOSBiaXRzIHN1cHBvcnRzIGEgbWF4aW11bSBzd2FwIGZpbGUgc2l6ZSBvZiAyIEdCLgorICoKKyAqIEZJWE1FOiAgMiBHQiBpc24ndCB2ZXJ5IGJpZy4gIE90aGVyIGJpdHMgY2FuIGJlIHVzZWQgdG8gYWxsb3cKKyAqIGxhcmdlciBzd2FwIHNpemVzLiAgSW4gdGhlIG1lYW50aW1lLCBpdCBhcHBlYXJzIHJlbGF0aXZlbHkgZWFzeSB0byBnZXQKKyAqIGFyb3VuZCB0aGUgMiBHQiBsaW1pdGF0aW9uIGJ5IHNpbXBseSB1c2luZyBtdWx0aXBsZSBzd2FwIGZpbGVzLgorICovCisKKyNkZWZpbmUgX19zd3BfdHlwZShlbnRyeSkJKCgoZW50cnkpLnZhbCA+PiA3KSAmIDB4M2YpCisjZGVmaW5lIF9fc3dwX29mZnNldChlbnRyeSkJKChlbnRyeSkudmFsID4+IDEzKQorI2RlZmluZSBfX3N3cF9lbnRyeSh0eXBlLG9mZnMpCSgoc3dwX2VudHJ5X3QpIHsoKHR5cGUpIDw8IDcpIHwgKChvZmZzKSA8PCAxMyl9KQorI2RlZmluZSBfX3B0ZV90b19zd3BfZW50cnkocHRlKQkoKHN3cF9lbnRyeV90KSB7IHB0ZV92YWwocHRlKSB9KQorI2RlZmluZSBfX3N3cF9lbnRyeV90b19wdGUoeCkJKChwdGVfdCkgeyAoeCkudmFsIH0pCisKKyNkZWZpbmUgUFRFX0ZJTEVfTUFYX0JJVFMJMjkKKyNkZWZpbmUgcHRlX3RvX3Bnb2ZmKHB0ZSkJKHB0ZV92YWwocHRlKSA+PiAzKQorI2RlZmluZSBwZ29mZl90b19wdGUob2ZmKQkoKHB0ZV90KSB7ICgob2ZmKSA8PCAzKSB8IF9QQUdFX0ZJTEUgfSkKKworCisjZW5kaWYgLyogICFkZWZpbmVkIChfX0FTU0VNQkxZX18pICovCisKKworI2lmZGVmIF9fQVNTRU1CTFlfXworCisvKiBBc3NlbWJseSBtYWNybyBfUEdEX0lOREVYIGlzIHRoZSBzYW1lIGFzIEMgcGdkX2luZGV4KHVuc2lnbmVkIGxvbmcpLAorICogICAgICAgICAgICAgICAgX1BHRF9PRkZTRVQgYXMgQyBwZ2Rfb2Zmc2V0KHN0cnVjdCBtbV9zdHJ1Y3QqLCB1bnNpZ25lZCBsb25nKSwKKyAqICAgICAgICAgICAgICAgIF9QTURfT0ZGU0VUIGFzIEMgcG1kX29mZnNldChwZ2RfdCosIHVuc2lnbmVkIGxvbmcpCisgKiAgICAgICAgICAgICAgICBfUFRFX09GRlNFVCBhcyBDIHB0ZV9vZmZzZXQocG1kX3QqLCB1bnNpZ25lZCBsb25nKQorICoKKyAqIE5vdGU6IFdlIHJlcXVpcmUgYW4gYWRkaXRpb25hbCB0ZW1wb3JhcnkgcmVnaXN0ZXIgd2hpY2ggY2FuIGJlIHRoZSBzYW1lIGFzCisgKiAgICAgICB0aGUgcmVnaXN0ZXIgdGhhdCBob2xkcyB0aGUgYWRkcmVzcy4KKyAqCisgKiAoKHB0ZV90KikgKCh1bnNpZ25lZCBsb25nKShwbWRfdmFsKCpwbWQpICYgUEFHRV9NQVNLKSkgKyBwdGVfaW5kZXgoYWRkcikpCisgKgorICovCisjZGVmaW5lIF9QR0RfSU5ERVgocnQscnMpCWV4dHVpCXJ0LCBycywgUEdESVJfU0hJRlQsIDMyLVBHRElSX1NISUZUCisjZGVmaW5lIF9QVEVfSU5ERVgocnQscnMpCWV4dHVpCXJ0LCBycywgUEFHRV9TSElGVCwgUFRSU19QRVJfUFRFX1NISUZUCisKKyNkZWZpbmUgX1BHRF9PRkZTRVQobW0sYWRyLHRtcCkJCWwzMmkJbW0sIG1tLCBNTV9QR0Q7CQlcCisJCQkJCV9QR0RfSU5ERVgodG1wLCBhZHIpOwkJXAorCQkJCQlhZGR4NAltbSwgdG1wLCBtbQorCisjZGVmaW5lIF9QVEVfT0ZGU0VUKHBtZCxhZHIsdG1wKQlfUFRFX0lOREVYKHRtcCwgYWRyKTsJCVwKKwkJCQkJc3JsaQlwbWQsIHBtZCwgUEFHRV9TSElGVDsJXAorCQkJCQlzbGxpCXBtZCwgcG1kLCBQQUdFX1NISUZUOwlcCisJCQkJCWFkZHg0CXBtZCwgdG1wLCBwbWQKKworI2Vsc2UKKworZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7CisKKyNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCSgxKQorCitleHRlcm4gIHZvaWQgdXBkYXRlX21tdV9jYWNoZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90IHB0ZSk7CisKKy8qCisgKiByZW1hcCBhIHBoeXNpY2FsIGFkZHJlc3MgYHBoeXMnIG9mIHNpemUgYHNpemUnIHdpdGggcGFnZSBwcm90ZWN0aW9uIGBwcm90JworICogaW50byB2aXJ0dWFsIGFkZHJlc3MgYGZyb20nCisgKi8KKyNkZWZpbmUgaW9fcmVtYXBfcGFnZV9yYW5nZSh2bWEsZnJvbSxwaHlzLHNpemUscHJvdCkgXAorICAgICAgICAgICAgICAgIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIGZyb20sIChwaHlzKSA+PiBQQUdFX1NISUZULCBzaXplLCBwcm90KQorCisKKy8qIE5vIHBhZ2UgdGFibGUgY2FjaGVzIHRvIGluaXQgKi8KKworI2RlZmluZSBwZ3RhYmxlX2NhY2hlX2luaXQoKQlkbyB7IH0gd2hpbGUgKDApCisKK3R5cGVkZWYgcHRlX3QgKnB0ZV9hZGRyX3Q7CisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoX19BU1NFTUJMWV9fKSAqLworCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfVEVTVF9BTkRfQ0xFQVJfWU9VTkcKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKKyNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9TRVRfV1JQUk9URUNUCisjZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfTUtESVJUWQorI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVfU0FNRQorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgorCisjZW5kaWYgLyogX1hURU5TQV9QR1RBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3MvaGFyZHdhcmUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS1pc3MvaGFyZHdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI0MGYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLWlzcy9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0taXNzL2hhcmR3YXJlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgVGVuc2lsaWNhIEluYy4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgSVNTLgorICovCisKKyNpZm5kZWYgX19BU01fWFRFTlNBX0lTU19IQVJEV0FSRQorI2RlZmluZSBfX0FTTV9YVEVOU0FfSVNTX0hBUkRXQVJFCisKKy8qCisgKiBNZW1vcnkgY29uZmlndXJhdGlvbi4KKyAqLworCisjZGVmaW5lIFBMQVRGT1JNX0RFRkFVTFRfTUVNX1NUQVJUIFhTSEFMX1JBTV9QQUREUgorI2RlZmluZSBQTEFURk9STV9ERUZBVUxUX01FTV9TSVpFIFhTSEFMX1JBTV9WU0laRQorCisvKgorICogSW50ZXJydXB0IGNvbmZpZ3VyYXRpb24uCisgKi8KKworI2VuZGlmIC8qIF9fQVNNX1hURU5TQV9JU1NfSEFSRFdBUkUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxNjM4OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvcGxhdGZvcm0uaAorICoKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9ucworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUExBVEZPUk1fSAorI2RlZmluZSBfWFRFTlNBX1BMQVRGT1JNX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxhc20vYm9vdHBhcmFtLmg+CisKKy8qCisgKiBwbGF0Zm9ybV9pbml0IGlzIGNhbGxlZCBiZWZvcmUgdGhlIG1tdSBpcyBpbml0aWFsaXplZCB0byBnaXZlIHRoZQorICogcGxhdGZvcm0gYSBlYXJseSBob29rLXVwLiBicF90YWdfdCBpcyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB0YWdzCisgKiBwYXNzZWQgZnJvbSB0aGUgYm9vdC1sb2FkZXIuCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2luaXQoYnBfdGFnX3QqKTsKKworLyoKKyAqIHBsYXRmb3JtX3NldHVwIGlzIGNhbGxlZCBmcm9tIHNldHVwX2FyY2ggd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQtbGluZQorICogc3RyaW5nLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9zZXR1cCAoY2hhciAqKik7CisKKy8qCisgKiBwbGF0Zm9ybV9pbml0X2lycSBpcyBjYWxsZWQgZnJvbSBpbml0X0lSUS4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faW5pdF9pcnEgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1fcmVzdGFydCBpcyBjYWxsZWQgdG8gcmVzdGFydCB0aGUgc3lzdGVtLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9yZXN0YXJ0ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2hhbHQgaXMgY2FsbGVkIHRvIHN0b3AgdGhlIHN5c3RlbSBhbmQgaGFsdC4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faGFsdCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9wb3dlcl9vZmYgaXMgY2FsbGVkIHRvIHN0b3AgdGhlIHN5c3RlbSBhbmQgcG93ZXIgaXQgb2ZmLgorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9wb3dlcl9vZmYgKHZvaWQpOworCisvKgorICogcGxhdGZvcm1faWRsZSBpcyBjYWxsZWQgZnJvbSB0aGUgaWRsZSBmdW5jdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1faWRsZSAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9oZWFydGJlYXQgaXMgY2FsbGVkIGV2ZXJ5IEhaCisgKi8KK2V4dGVybiB2b2lkIHBsYXRmb3JtX2hlYXJ0YmVhdCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9wY2liaW9zX2luaXQgaXMgY2FsbGVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSB0byBzZXR1cCB0aGUgcGNpIGJ1cy4KKyAqLworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcGNpYmlvc19pbml0ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX3BjaWJpb3NfZml4dXAgYWxsb3dzIHRvIG1vZGlmeSB0aGUgUENJIGNvbmZpZ3VyYXRpb24uCisgKi8KK2V4dGVybiBpbnQgcGxhdGZvcm1fcGNpYmlvc19maXh1cCAodm9pZCk7CisKKy8qCisgKiBwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50IGNhbGlicmF0ZXMgY3B1IGNsb2NrIGZyZXEgKENPTkZJR19YVEVOU0FfQ0FMSUJSQVRFKQorICovCitleHRlcm4gdm9pZCBwbGF0Zm9ybV9jYWxpYnJhdGVfY2NvdW50ICh2b2lkKTsKKworLyoKKyAqIHBsYXRmb3JtX2dldF9ydGNfdGltZSByZXR1cm5zIFJUQyBzZWNvbmRzIChyZXR1cm5zIDAgZm9yIG5vIGVycm9yKQorICovCitleHRlcm4gaW50IHBsYXRmb3JtX2dldF9ydGNfdGltZSh0aW1lX3QqKTsKKworLyoKKyAqIHBsYXRmb3JtX3NldF9ydGNfdGltZSBzZXQgUlRDIHNlY29uZHMgKHJldHVybnMgMCBmb3Igbm8gZXJyb3IpCisgKi8KK2V4dGVybiBpbnQgcGxhdGZvcm1fc2V0X3J0Y190aW1lKHRpbWVfdCk7CisKKworI2VuZGlmCS8qIF9YVEVOU0FfUExBVEZPUk1fSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcG9sbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmZlNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKKyAqIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUE9MTF9ICisjZGVmaW5lIF9YVEVOU0FfUE9MTF9ICisKKworI2RlZmluZSBQT0xMSU4JCTB4MDAwMQorI2RlZmluZSBQT0xMUFJJCQkweDAwMDIKKyNkZWZpbmUgUE9MTE9VVAkJMHgwMDA0CisKKyNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4CisjZGVmaW5lIFBPTExIVVAJCTB4MDAxMAorI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKKworI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAorI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAorI2RlZmluZSBQT0xMV1JOT1JNCVBPTExPVVQKKyNkZWZpbmUgUE9MTFdSQkFORAkweDAxMDAKKworI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKKyNkZWZpbmUgUE9MTFJFTU9WRQkweDA4MDAKKworc3RydWN0IHBvbGxmZCB7CisJaW50IGZkOworCXNob3J0IGV2ZW50czsKKwlzaG9ydCByZXZlbnRzOworfTsKKworI2VuZGlmIC8qIF9YVEVOU0FfUE9MTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wb3NpeF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODE2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcG9zaXhfdHlwZXMuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wb3NpeF90eXBlcy5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogTGFyZ2VseSBjb3BpZWQgZnJvbSBpbmNsdWRlL2FzbS1wcGMvcG9zaXhfdHlwZXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUE9TSVhfVFlQRVNfSAorI2RlZmluZSBfWFRFTlNBX1BPU0lYX1RZUEVTX0gKKworLyoKKyAqIFRoaXMgZmlsZSBpcyBnZW5lcmFsbHkgdXNlZCBieSB1c2VyLWxldmVsIHNvZnR3YXJlLCBzbyB5b3UgbmVlZCB0bworICogYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBuYW1lc3BhY2UgcG9sbHV0aW9uIGV0Yy4gIEFsc28sIHdlIGNhbm5vdAorICogYXNzdW1lIEdDQyBpcyBiZWluZyB1c2VkLgorICovCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwlfX2tlcm5lbF9pbm9fdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX21vZGVfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfbmxpbmtfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfb2ZmX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfcGlkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX2lwY19waWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJX19rZXJuZWxfZ2lkX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9zaXplX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfc3NpemVfdDsKK3R5cGVkZWYgbG9uZwkJX19rZXJuZWxfcHRyZGlmZl90OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF90aW1lX3Q7Cit0eXBlZGVmIGxvbmcJCV9fa2VybmVsX3N1c2Vjb25kc190OwordHlwZWRlZiBsb25nCQlfX2tlcm5lbF9jbG9ja190OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX3RpbWVyX3Q7Cit0eXBlZGVmIGludAkJX19rZXJuZWxfY2xvY2tpZF90OwordHlwZWRlZiBpbnQJCV9fa2VybmVsX2RhZGRyX3Q7Cit0eXBlZGVmIGNoYXIgKgkJX19rZXJuZWxfY2FkZHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfdWlkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfZ2lkMTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CV9fa2VybmVsX3VpZDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAlfX2tlcm5lbF9naWQzMl90OworCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CV9fa2VybmVsX29sZF91aWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJX19rZXJuZWxfb2xkX2dpZF90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydAlfX2tlcm5lbF9vbGRfZGV2X3Q7CisKKyNpZmRlZiBfX0dOVUNfXwordHlwZWRlZiBsb25nIGxvbmcJX19rZXJuZWxfbG9mZl90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQJdmFsWzJdOworfSBfX2tlcm5lbF9mc2lkX3Q7CisKKyNpZm5kZWYgX19HTlVDX18KKworI2RlZmluZQlfX0ZEX1NFVChkLCBzZXQpCSgoc2V0KS0+ZmRzX2JpdHNbX19GREVMVChkKV0gfD0gX19GRE1BU0soZCkpCisjZGVmaW5lCV9fRkRfQ0xSKGQsIHNldCkJKChzZXQpLT5mZHNfYml0c1tfX0ZERUxUKGQpXSAmPSB+X19GRE1BU0soZCkpCisjZGVmaW5lCV9fRkRfSVNTRVQoZCwgc2V0KQkoKHNldCktPmZkc19iaXRzW19fRkRFTFQoZCldICYgX19GRE1BU0soZCkpCisjZGVmaW5lCV9fRkRfWkVSTyhzZXQpCVwKKyAgKCh2b2lkKSBtZW1zZXQgKChfX3B0cl90KSAoc2V0KSwgMCwgc2l6ZW9mIChfX2tlcm5lbF9mZF9zZXQpKSkKKworI2Vsc2UgLyogX19HTlVDX18gKi8KKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikgXAorICAgIHx8IChfX0dMSUJDX18gPT0gMiAmJiBfX0dMSUJDX01JTk9SX18gPT0gMCkKKy8qIFdpdGggR05VIEMsIHVzZSBpbmxpbmUgZnVuY3Rpb25zIGluc3RlYWQgc28gYXJncyBhcmUgZXZhbHVhdGVkIG9ubHkgb25jZTogKi8KKworI3VuZGVmIF9fRkRfU0VUCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fRkRfU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqZmRzZXRwKQoreworCXVuc2lnbmVkIGxvbmcgX3RtcCA9IGZkIC8gX19ORkRCSVRTOworCXVuc2lnbmVkIGxvbmcgX3JlbSA9IGZkICUgX19ORkRCSVRTOworCWZkc2V0cC0+ZmRzX2JpdHNbX3RtcF0gfD0gKDFVTDw8X3JlbSk7Cit9CisKKyN1bmRlZiBfX0ZEX0NMUgorc3RhdGljIF9faW5saW5lX18gdm9pZCBfX0ZEX0NMUih1bnNpZ25lZCBsb25nIGZkLCBfX2tlcm5lbF9mZF9zZXQgKmZkc2V0cCkKK3sKKwl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKKwlmZHNldHAtPmZkc19iaXRzW190bXBdICY9IH4oMVVMPDxfcmVtKTsKK30KKworI3VuZGVmIF9fRkRfSVNTRVQKK3N0YXRpYyBfX2lubGluZV9fIGludCBfX0ZEX0lTU0VUKHVuc2lnbmVkIGxvbmcgZmQsIF9fa2VybmVsX2ZkX3NldCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIF90bXAgPSBmZCAvIF9fTkZEQklUUzsKKwl1bnNpZ25lZCBsb25nIF9yZW0gPSBmZCAlIF9fTkZEQklUUzsKKwlyZXR1cm4gKHAtPmZkc19iaXRzW190bXBdICYgKDFVTDw8X3JlbSkpICE9IDA7Cit9CisKKy8qCisgKiBUaGlzIHdpbGwgdW5yb2xsIHRoZSBsb29wIGZvciB0aGUgbm9ybWFsIGNvbnN0YW50IGNhc2UgKDggaW50cywKKyAqIGZvciBhIDI1Ni1iaXQgZmRfc2V0KQorICovCisjdW5kZWYgX19GRF9aRVJPCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fRkRfWkVSTyhfX2tlcm5lbF9mZF9zZXQgKnApCit7CisJdW5zaWduZWQgaW50ICp0bXAgPSAodW5zaWduZWQgaW50ICopcC0+ZmRzX2JpdHM7CisJaW50IGk7CisKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoX19GRFNFVF9MT05HUykpIHsKKwkJc3dpdGNoIChfX0ZEU0VUX0xPTkdTKSB7CisJCQljYXNlIDg6CisJCQkJdG1wWzBdID0gMDsgdG1wWzFdID0gMDsgdG1wWzJdID0gMDsgdG1wWzNdID0gMDsKKwkJCQl0bXBbNF0gPSAwOyB0bXBbNV0gPSAwOyB0bXBbNl0gPSAwOyB0bXBbN10gPSAwOworCQkJCXJldHVybjsKKwkJfQorCX0KKwlpID0gX19GRFNFVF9MT05HUzsKKwl3aGlsZSAoaSkgeworCQlpLS07CisJCSp0bXAgPSAwOworCQl0bXArKzsKKwl9Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpICovCisjZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZiAvKiBfWFRFTlNBX1BPU0lYX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2FiNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9QUk9DRVNTT1JfSAorI2RlZmluZSBfWFRFTlNBX1BST0NFU1NPUl9ICisKKyNpZmRlZiBfX0FTU0VNQkxZX18KKyNkZWZpbmUgX0FTTUxBTkdVQUdFCisjZW5kaWYKKworI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvY29yZS5oPgorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvc3BlY3JlZy5oPgorI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvdGllLmg+CisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KKworLyogQXNzZXJ0aW9ucy4gKi8KKworI2lmIChYQ0hBTF9IQVZFX1dJTkRPV0VEICE9IDEpCisjZXJyb3IgTGludXggcmVxdWlyZXMgdGhlIFh0ZW5zYSBXaW5kb3dlZCBSZWdpc3RlcnMgT3B0aW9uLgorI2VuZGlmCisKKy8qCisgKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogMSBHQi4KKyAqIFdpbmRvd2VkIGNhbGwgQUJJIHJlcXVpcmVzIGNhbGxlciBhbmQgY2FsbGVlIHRvIGJlIGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCisgKiAxIEdCIHJlZ2lvbi4gVGhlIEMgY29tcGlsZXIgcGxhY2VzIHRyYW1wb2xpbmUgY29kZSBvbiB0aGUgc3RhY2sgZm9yIHNvdXJjZXMKKyAqIHRoYXQgdGFrZSB0aGUgYWRkcmVzcyBvZiBhIG5lc3RlZCBDIGZ1bmN0aW9uIChhIGZlYXR1cmUgdXNlZCBieSBnbGliYyksIHNvCisgKiB0aGUgMSBHQiByZXF1aXJlbWVudCBhcHBsaWVzIHRvIHRoZSBzdGFjayBhcyB3ZWxsLgorICovCisKKyNkZWZpbmUgVEFTS19TSVpFCTB4NDAwMDAwMDAKKworLyoKKyAqIEdlbmVyYWwgZXhjZXB0aW9uIGNhdXNlIGFzc2lnbmVkIHRvIGRlYnVnIGV4Y2VwdGlvbnMuIERlYnVnIGV4Y2VwdGlvbnMgZ28KKyAqIHRvIHRoZWlyIG93biB2ZWN0b3IsIHJhdGhlciB0aGFuIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiB2ZWN0b3JzICh1c2VyLAorICoga2VybmVsLCBkb3VibGUpOyBhbmQgdGhlaXIgc3BlY2lmaWMgY2F1c2VzIGFyZSByZXBvcnRlZCB2aWEgREVCVUdDQVVTRQorICogcmF0aGVyIHRoYW4gRVhDQ0FVU0UuICBIb3dldmVyIGl0IGlzIHNvbWV0aW1lcyBjb252ZW5pZW50IHRvIHJlZGlyZWN0IGRlYnVnCisgKiBleGNlcHRpb25zIHRvIHRoZSBnZW5lcmFsIGV4Y2VwdGlvbiBtZWNoYW5pc20uICBUbyBkbyB0aGlzLCBhbiBvdGhlcndpc2UKKyAqIHVudXNlZCBFWENDQVVTRSB2YWx1ZSB3YXMgYXNzaWduZWQgdG8gZGVidWcgZXhjZXB0aW9ucyBmb3IgdGhpcyBwdXJwb3NlLgorICovCisKKyNkZWZpbmUgRVhDQ0FVU0VfTUFQUEVEX0RFQlVHCTYzCisKKy8qCisgKiBXZSB1c2UgREVQQyBhbHNvIGFzIGEgZmxhZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGRvdWJsZSBhbmQgcmVndWxhcgorICogZXhjZXB0aW9ucy4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIERFUEMgbWlnaHQgY29udGFpbiB0aGUgdmFsdWUgb2YKKyAqIEVYQ0NBVVNFIGZvciByZWd1bGFyIGV4Y2VwdGlvbnMsIHNvIHdlIHVzZSB0aGlzIGRlZmluaXRpb24gdG8gbWFyayBhCisgKiB2YWxpZCBkb3VibGUgZXhjZXB0aW9uIGFkZHJlc3MuCisgKiAoTm90ZTogV2UgdXNlIGl0IGluIGJnZXVpLCBzbyBpdCBzaG91bGQgYmUgNjQsIDEyOCwgb3IgMjU2KQorICovCisKKyNkZWZpbmUgVkFMSURfRE9VQkxFX0VYQ0VQVElPTl9BRERSRVNTCTY0CisKKy8qIExPQ0tMRVZFTCBkZWZpbmVzIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgdGhhdCBtYXNrcyBhbGwKKyAqIGdlbmVyYWwtcHVycG9zZSBpbnRlcnJ1cHRzLgorICovCisjZGVmaW5lIExPQ0tMRVZFTCAxCisKKy8qIFdTQklUUyBhbmQgV0JCSVRTIGFyZSB0aGUgd2lkdGggb2YgdGhlIFdJTkRPV1NUQVJUIGFuZCBXSU5ET1dCQVNFCisgKiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBXU0JJVFMgIChYQ0hBTF9OVU1fQVJFR1MgLyA0KSAgICAgIC8qIHdpZHRoIG9mIFdJTkRPV1NUQVJUIGluIGJpdHMgKi8KKyNkZWZpbmUgV0JCSVRTICAoWENIQUxfTlVNX0FSRUdTX0xPRzIgLSAyKSAvKiB3aWR0aCBvZiBXSU5ET1dCQVNFIGluIGJpdHMgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyogQnVpbGQgYSB2YWxpZCByZXR1cm4gYWRkcmVzcyBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIHdpbnNpemUuCisgKiB3aW5zaXplIG11c3QgYmUgMSAoY2FsbDQpLCAyIChjYWxsOCksIG9yIDMgKGNhbGwxMikKKyAqLworI2RlZmluZSBNQUtFX1JBX0ZPUl9DQUxMKHJhLHdzKSAgICgoKHJhKSAmIDB4M2ZmZmZmZmYpIHwgKHdzKSA8PCAzMCkKKworLyogQ29udmVydCByZXR1cm4gYWRkcmVzcyB0byBhIHZhbGlkIHBjCisgKiBOb3RlOiBXZSBhc3N1bWUgdGhhdCB0aGUgc3RhY2sgcG9pbnRlciBpcyBpbiB0aGUgc2FtZSAxR0IgcmFuZ2VzIGFzIHRoZSByYQorICovCisjZGVmaW5lIE1BS0VfUENfRlJPTV9SQShyYSxzcCkgICAgKCgocmEpICYgMHgzZmZmZmZmZikgfCAoKHNwKSAmIDB4YzAwMDAwMDApKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgbG9uZyBzZWc7Cit9IG1tX3NlZ21lbnRfdDsKKworc3RydWN0IHRocmVhZF9zdHJ1Y3QgeworCisJLyoga2VybmVsJ3MgcmV0dXJuIGFkZHJlc3MgYW5kIHN0YWNrIHBvaW50ZXIgZm9yIGNvbnRleHQgc3dpdGNoaW5nICovCisJdW5zaWduZWQgbG9uZyByYTsgLyoga2VybmVsJ3MgYTA6IHJldHVybiBhZGRyZXNzIGFuZCB3aW5kb3cgY2FsbCBzaXplICovCisJdW5zaWduZWQgbG9uZyBzcDsgLyoga2VybmVsJ3MgYTE6IHN0YWNrIHBvaW50ZXIgKi8KKworCW1tX3NlZ21lbnRfdCBjdXJyZW50X2RzOyAgICAvKiBzZWUgdWFjY2Vzcy5oIGZvciBleGFtcGxlIHVzZXMgKi8KKworCS8qIHN0cnVjdCB4dGVuc2FfY3B1aW5mbyBpbmZvOyAqLworCisJdW5zaWduZWQgbG9uZyBiYWRfdmFkZHI7IC8qIGxhc3QgdXNlciBmYXVsdCAqLworCXVuc2lnbmVkIGxvbmcgYmFkX3VhZGRyOyAvKiBsYXN0IGtlcm5lbCBmYXVsdCBhY2Nlc3NpbmcgdXNlciBzcGFjZSAqLworCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKworCXVuc2lnbmVkIGxvbmcgaWJyZWFrW1hDSEFMX05VTV9JQlJFQUtdOworCXVuc2lnbmVkIGxvbmcgZGJyZWFrYVtYQ0hBTF9OVU1fREJSRUFLXTsKKwl1bnNpZ25lZCBsb25nIGRicmVha2NbWENIQUxfTlVNX0RCUkVBS107CisKKwkvKiBBbGxvY2F0ZSBzdG9yYWdlIGZvciBleHRyYSBzdGF0ZSBhbmQgY29wcm9jZXNzb3Igc3RhdGUuICovCisJdW5zaWduZWQgY2hhciBjcF9zYXZlW1hURU5TQV9DUF9FWFRSQV9TSVpFXQorCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChYVEVOU0FfQ1BfRVhUUkFfQUxJR04pKSk7CisKKwkvKiBNYWtlIHN0cnVjdHVyZSAxNiBieXRlcyBhbGlnbmVkLiAqLworCWludCBhbGlnblswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKK307CisKKworLyoKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKKyAqIGluc3RydWN0aW9uIHBvaW50ZXIgKCJwcm9ncmFtIGNvdW50ZXIiKS4KKyAqLworI2RlZmluZSBjdXJyZW50X3RleHRfYWRkcigpICAoeyBfX2xhYmVsX18gX2w7IF9sOiAmJl9sO30pCisKKworLyogVGhpcyBkZWNpZGVzIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBzZWFyY2ggZm9yIGEgZnJlZSBjaHVuayBvZiB2bQorICogc3BhY2UgZHVyaW5nIG1tYXAncy4KKyAqLworI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFRBU0tfU0laRSAvIDIpCisKKyNkZWZpbmUgSU5JVF9USFJFQUQgIFwKK3sJCQkJCQkJCQlcCisJcmE6CQkwLCAJCQkJCQlcCisJc3A6CQlzaXplb2YoaW5pdF9zdGFjaykgKyAobG9uZykgJmluaXRfc3RhY2ssCVwKKwljdXJyZW50X2RzOgl7MH0sCQkJCQkJXAorCS8qaW5mbzoJCXswfSwgKi8JCQkJCQlcCisJYmFkX3ZhZGRyOgkwLAkJCQkJCVwKKwliYWRfdWFkZHI6CTAsCQkJCQkJXAorCWVycm9yX2NvZGU6CTAsCQkJCQkJXAorfQorCisKKy8qCisgKiBEbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXdseSBleGVjdXRlZCB0aHJlYWQuCisgKiBOb3RlOiBXZSBzZXQtdXAgcHMgYXMgaWYgd2UgZGlkIGEgY2FsbDQgdG8gdGhlIG5ldyBwYy4KKyAqICAgICAgIHNldF90aHJlYWRfc3RhdGUgaW4gc2lnbmFsLmMgZGVwZW5kcyBvbiBpdC4KKyAqLworI2RlZmluZSBVU0VSX1BTX1ZBTFVFICggKDEgPDwgWENIQUxfUFNfV09FX1NISUZUKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFhDSEFMX1BTX0NBTExJTkNfU0hJRlQpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgKFVTRVJfUklORyA8PCBYQ0hBTF9QU19SSU5HX1NISUZUKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IFhDSEFMX1BTX1BST0dTVEFDS19TSElGVCkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBYQ0hBTF9QU19FWENNX1NISUZUKSApCisKKy8qIENsZWFyaW5nIGEwIHRlcm1pbmF0ZXMgdGhlIGJhY2t0cmFjZS4gKi8KKyNkZWZpbmUgc3RhcnRfdGhyZWFkKHJlZ3MsIG5ld19wYywgbmV3X3NwKSBcCisJcmVncy0+cGMgPSBuZXdfcGM7IFwKKwlyZWdzLT5wcyA9IFVTRVJfUFNfVkFMVUU7IFwKKwlyZWdzLT5hcmVnWzFdID0gbmV3X3NwOyBcCisJcmVncy0+YXJlZ1swXSA9IDA7IFwKKwlyZWdzLT53bWFzayA9IDE7IFwKKwlyZWdzLT5kZXBjID0gMDsgXAorCXJlZ3MtPndpbmRvd2Jhc2UgPSAwOyBcCisJcmVncy0+d2luZG93c3RhcnQgPSAxOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitzdHJ1Y3QgbW1fc3RydWN0OworCisvLyBGSVhNRTogZG8gd2UgbmVlZCByZWxlYXNlX3RocmVhZCBmb3IgQ1A/PworLyogRnJlZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgYSB0aHJlYWQuICovCisjZGVmaW5lIHJlbGVhc2VfdGhyZWFkKHRocmVhZCkgZG8geyB9IHdoaWxlKDApCisKKy8vIEZJWE1FOiBkbyB3ZSBuZWVkIHByZXBhcmVfdG9fY29weSAobGF6eSBzdGF0dXMpIGZvciBDUD8/CisvKiBQcmVwYXJlIHRvIGNvcHkgdGhyZWFkIHN0YXRlIC0gdW5sYXp5IGFsbCBsYXp5IHN0YXR1cyAqLworI2RlZmluZSBwcmVwYXJlX3RvX2NvcHkodHNrKQlkbyB7IH0gd2hpbGUgKDApCisKKy8qCisgKiBjcmVhdGUgYSBrZXJuZWwgdGhyZWFkIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0YXNrbGlzdHMKKyAqLworZXh0ZXJuIGludCBrZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICogYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworLyogQ29weSBhbmQgcmVsZWFzZSBhbGwgc2VnbWVudCBpbmZvIGFzc29jaWF0ZWQgd2l0aCBhIFZNICovCisKKyNkZWZpbmUgY29weV9zZWdtZW50cyhwLCBtbSkJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIHJlbGVhc2Vfc2VnbWVudHMobW0pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBmb3JnZXRfc2VnbWVudHMoKQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdGhyZWFkX3NhdmVkX3BjKHRzaykJKHh0ZW5zYV9wdF9yZWdzKHRzayktPnBjKQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKKworI2RlZmluZSBLU1RLX0VJUCh0c2spCQkoeHRlbnNhX3B0X3JlZ3ModHNrKS0+cGMpCisjZGVmaW5lIEtTVEtfRVNQKHRzaykJCSh4dGVuc2FfcHRfcmVncyh0c2spLT5hcmVnWzFdKQorCisjZGVmaW5lIGNwdV9yZWxheCgpICBkbyB7IH0gd2hpbGUgKDApCisKKy8qIFNwZWNpYWwgcmVnaXN0ZXIgYWNjZXNzLiAqLworCisjZGVmaW5lIFdTUih2LHNyKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIndzciAlMCwiX19zdHJpbmdpZnkoc3IpIDo6ICJhIih2KSk7CisjZGVmaW5lIFJTUih2LHNyKSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJzciAlMCwiX19zdHJpbmdpZnkoc3IpIDogIj1hIih2KSk7CisKKyNkZWZpbmUgc2V0X3NyKHgsc3IpICh7dW5zaWduZWQgaW50IHY9KHVuc2lnbmVkIGludCl4OyBXU1Iodixzcik7fSkKKyNkZWZpbmUgZ2V0X3NyKHNyKSAoe3Vuc2lnbmVkIGludCB2OyBSU1Iodixzcik7IHY7IH0pCisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvcHRyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg0OGE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9wdHJhY2UuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUFRSQUNFX0gKKyNkZWZpbmUgX1hURU5TQV9QVFJBQ0VfSAorCisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisKKy8qCisgKiBLZXJuZWwgc3RhY2sKKyAqCisgKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIC0tLS0tLS0tIFNUQUNLX1NJWkUKKyAqIAkJfCAgICAgcmVnaXN0ZXIgZmlsZSAgICAgfCAgfAorICogCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICB8CisgKiAJCXwgICAgc3RydWN0IHB0X3JlZ3MgICAgIHwgIHwKKyAqIAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgfCAtLS0tLS0gUFRfUkVHU19PRkZTRVQKKyAqIGRvdWJsZSAJOiAgMTYgYnl0ZXMgc3BpbGwgYXJlYSAgOiAgfCAgXgorICogZXhjZXRpb24gCTotIC0gLSAtIC0gLSAtIC0gLSAtIC0gLTogIHwgIHwKKyAqIGZyYW1lCTogICAgc3RydWN0IHB0X3JlZ3MgICAgIDogIHwgIHwKKyAqIAkJOi0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtOiAgfCAgfAorICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiAJCXwgICAgIG1lbW9yeSBzdGFjayAgICAgIHwgIHwgIHwKKyAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogCQl+ICAgICAgICAgICAgICAgICAgICAgICB+ICB+ICB+CisgKiAJCX4gICAgICAgICAgICAgICAgICAgICAgIH4gIH4gIH4KKyAqIAkJfCAgICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAorICogCQl8ICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiAJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgIHwgLS0tIFNUQUNLX0JJQVMKKyAqIAkJfCAgc3RydWN0IHRhc2tfc3RydWN0ICAgfCAgfCAgfCAgXgorICogIGN1cnJlbnQgLS0+ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwgIHwgIHwKKyAqIAkJfCAgc3RydWN0IHRocmVhZF9pbmZvICAgfCAgfCAgfCAgfAorICoJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgLS0tLS0tLS0KKyAqLworCisjZGVmaW5lIEtFUk5FTF9TVEFDS19TSVpFICgyICogUEFHRV9TSVpFKQorCisvKiAgT2Zmc2V0cyBmb3IgZXhjZXB0aW9uX2hhbmRsZXJzW10gKDMgeCA2NC1lbnRyaWVzIHggNC1ieXRlIHRhYmxlcykuICovCisKKyNkZWZpbmUgRVhDX1RBQkxFX0tTVEsJCTB4MDA0CS8qIEtlcm5lbCBTdGFjayAqLworI2RlZmluZSBFWENfVEFCTEVfRE9VQkxFX1NBVkUJMHgwMDgJLyogRG91YmxlIGV4Y2VwdGlvbiBzYXZlIGFyZWEgZm9yIGEwICovCisjZGVmaW5lIEVYQ19UQUJMRV9GSVhVUAkJMHgwMGMJLyogRml4dXAgaGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfUEFSQU0JCTB4MDEwCS8qIEZvciBwYXNzaW5nIGEgcGFyYW1ldGVyIHRvIGZpeHVwICovCisjZGVmaW5lIEVYQ19UQUJMRV9TWVNDQUxMX1NBVkUJMHgwMTQJLyogRm9yIGZhc3Qgc3lzY2FsbCBoYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9GQVNUX1VTRVIJMHgxMDAJLyogRmFzdCB1c2VyIGV4Y2VwdGlvbiBoYW5kbGVyICovCisjZGVmaW5lIEVYQ19UQUJMRV9GQVNUX0tFUk5FTAkweDIwMAkvKiBGYXN0IGtlcm5lbCBleGNlcHRpb24gaGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfREVGQVVMVAkweDMwMAkvKiBEZWZhdWx0IEMtSGFuZGxlciAqLworI2RlZmluZSBFWENfVEFCTEVfU0laRQkJMHg0MDAKKworLyogUmVnaXN0ZXJzIHVzZWQgYnkgc3RyYWNlICovCisKKyNkZWZpbmUgUkVHX0FfQkFTRQkweGZjMDAwMDAwCisjZGVmaW5lIFJFR19BUl9CQVNFCTB4MDQwMDAwMDAKKyNkZWZpbmUgUkVHX1BDCQkweDE0MDAwMDAwCisjZGVmaW5lIFJFR19QUwkJMHgwODAwMDBlNgorI2RlZmluZSBSRUdfV0IJCTB4MDgwMDAwNDgKKyNkZWZpbmUgUkVHX1dTCQkweDA4MDAwMDQ5CisjZGVmaW5lIFJFR19MQkVHCTB4MDgwMDAwMDAKKyNkZWZpbmUgUkVHX0xFTkQJMHgwODAwMDAwMQorI2RlZmluZSBSRUdfTENPVU5UCTB4MDgwMDAwMDIKKyNkZWZpbmUgUkVHX1NBUgkJMHgwODAwMDAwMworI2RlZmluZSBSRUdfREVQQwkweDA4MDAwMGMwCisjZGVmaW5lCVJFR19FWENDQVVTRQkweDA4MDAwMGU4CisjZGVmaW5lIFJFR19FWENWQUREUgkweDA4MDAwMGVlCisjZGVmaW5lIFNZU0NBTExfTlIJMHgxCisKKyNkZWZpbmUgQVJfUkVHTk9fVE9fQV9SRUdOTyhhciwgd2IpIChhciAtIHdiKjQpICYgfihYQ0hBTF9OVU1fQVJFR1MgLSAxKQorCisvKiBPdGhlciBQVFJBQ0VfIHZhbHVlcyBkZWZpbmVkIGluIDxsaW51eC9wdHJhY2UuaD4gdXNpbmcgdmFsdWVzIDAtOSwxNiwxNywyNCAqLworCisjZGVmaW5lIFBUUkFDRV9HRVRSRUdTICAgICAgICAgICAgMTIKKyNkZWZpbmUgUFRSQUNFX1NFVFJFR1MgICAgICAgICAgICAxMworI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTICAgICAgICAgIDE0CisjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgICAgICAgICAgMTUKKyNkZWZpbmUgUFRSQUNFX0dFVEZQUkVHU0laRSAgICAgICAxOAorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgd2F5IHRoZSByZWdpc3RlcnMgYXJlIHN0b3JlZCBvbiB0aGUKKyAqIGtlcm5lbCBzdGFjayBkdXJpbmcgYSBzeXN0ZW0gY2FsbCBvciBvdGhlciBrZXJuZWwgZW50cnkuCisgKi8KK3N0cnVjdCBwdF9yZWdzIHsKKwl1bnNpZ25lZCBsb25nIHBjOwkJLyogICA0ICovCisJdW5zaWduZWQgbG9uZyBwczsJCS8qICAgOCAqLworCXVuc2lnbmVkIGxvbmcgZGVwYzsJCS8qICAxMiAqLworCXVuc2lnbmVkIGxvbmcgZXhjY2F1c2U7CQkvKiAgMTYgKi8KKwl1bnNpZ25lZCBsb25nIGV4Y3ZhZGRyOwkJLyogIDIwICovCisJdW5zaWduZWQgbG9uZyBkZWJ1Z2NhdXNlOwkvKiAgMjQgKi8KKwl1bnNpZ25lZCBsb25nIHdtYXNrOwkJLyogIDI4ICovCisJdW5zaWduZWQgbG9uZyBsYmVnOwkJLyogIDMyICovCisJdW5zaWduZWQgbG9uZyBsZW5kOwkJLyogIDM2ICovCisJdW5zaWduZWQgbG9uZyBsY291bnQ7CQkvKiAgNDAgKi8KKwl1bnNpZ25lZCBsb25nIHNhcjsJCS8qICA0NCAqLworCXVuc2lnbmVkIGxvbmcgd2luZG93YmFzZTsJLyogIDQ4ICovCisJdW5zaWduZWQgbG9uZyB3aW5kb3dzdGFydDsJLyogIDUyICovCisJdW5zaWduZWQgbG9uZyBzeXNjYWxsOwkJLyogIDU2ICovCisJaW50IHJlc2VydmVkWzJdOwkJLyogIDY0ICovCisKKwkvKiBNYWtlIHN1cmUgdGhlIGFyZWcgZmllbGQgaXMgMTYgYnl0ZXMgYWxpZ25lZC4gKi8KKwlpbnQgYWxpZ25bMF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKKwkvKiBjdXJyZW50IHJlZ2lzdGVyIGZyYW1lLgorCSAqIE5vdGU6IFRoZSBFU0YgZm9yIGtlcm5lbCBleGNlcHRpb25zIGVuZHMgYWZ0ZXIgMTYgcmVnaXN0ZXJzIQorCSAqLworCXVuc2lnbmVkIGxvbmcgYXJlZ1sxNl07CQkvKiAxMjggKDY0KSAqLworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKyMgZGVmaW5lIHh0ZW5zYV9wdF9yZWdzKHRzaykgKChzdHJ1Y3QgcHRfcmVncyopIFwKKyAgKCgobG9uZykodHNrKS0+dGhyZWFkX2luZm8gKyBLRVJORUxfU1RBQ0tfU0laRSAtIChYQ0hBTF9OVU1fQVJFR1MtMTYpKjQpKSAtIDEpCisjIGRlZmluZSB1c2VyX21vZGUocmVncykgKCgocmVncyktPnBzICYgMHgwMDAwMDAyMCkhPTApCisjIGRlZmluZSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICgocmVncyktPnBjKQorZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOworCisjIGlmbmRlZiBDT05GSUdfU01QCisjICBkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCisjIGVuZGlmCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZWxzZQkvKiBfX0FTU0VNQkxZX18gKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKyMgaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNkZWZpbmUgUFRfUkVHU19PRkZTRVQJICAoS0VSTkVMX1NUQUNLX1NJWkUgLSBQVF9VU0VSX1NJWkUpCisjZW5kaWYKKworI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcmVzb3VyY2UuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjVhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcmVzb3VyY2UuaApAQCAtMCwwICsxLDE2IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3Jlc291cmNlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUkVTT1VSQ0VfSAorI2RlZmluZSBfWFRFTlNBX1JFU09VUkNFX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Jlc291cmNlLmg+CisKKyNlbmRpZgkvKiBfWFRFTlNBX1JFU09VUkNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9ybWFwLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evcm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTU4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evcm1hcC5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2Evcm1hcC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9STUFQX0gKKyNkZWZpbmUgX1hURU5TQV9STUFQX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3JtYXAuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvcndzZW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9yd3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDJiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcndzZW0uaApAQCAtMCwwICsxLDE3NSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9yd3NlbS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogTGFyZ2VseSBjb3BpZWQgZnJvbSBpbmNsdWRlL2FzbS1wcGMvcndzZW0uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfUldTRU1fSAorI2RlZmluZSBfWFRFTlNBX1JXU0VNX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qCisgKiB0aGUgc2VtYXBob3JlIGRlZmluaXRpb24KKyAqLworc3RydWN0IHJ3X3NlbWFwaG9yZSB7CisJc2lnbmVkIGxvbmcJCWNvdW50OworI2RlZmluZSBSV1NFTV9VTkxPQ0tFRF9WQUxVRQkJMHgwMDAwMDAwMAorI2RlZmluZSBSV1NFTV9BQ1RJVkVfQklBUwkJMHgwMDAwMDAwMQorI2RlZmluZSBSV1NFTV9BQ1RJVkVfTUFTSwkJMHgwMDAwZmZmZgorI2RlZmluZSBSV1NFTV9XQUlUSU5HX0JJQVMJCSgtMHgwMDAxMDAwMCkKKyNkZWZpbmUgUldTRU1fQUNUSVZFX1JFQURfQklBUwkJUldTRU1fQUNUSVZFX0JJQVMKKyNkZWZpbmUgUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMJCShSV1NFTV9XQUlUSU5HX0JJQVMgKyBSV1NFTV9BQ1RJVkVfQklBUykKKwlzcGlubG9ja190CQl3YWl0X2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZAl3YWl0X2xpc3Q7CisjaWYgUldTRU1fREVCVUcKKwlpbnQJCQlkZWJ1ZzsKKyNlbmRpZgorfTsKKworLyoKKyAqIGluaXRpYWxpc2F0aW9uCisgKi8KKyNpZiBSV1NFTV9ERUJVRworI2RlZmluZSBfX1JXU0VNX0RFQlVHX0lOSVQgICAgICAsIDAKKyNlbHNlCisjZGVmaW5lIF9fUldTRU1fREVCVUdfSU5JVAkvKiAqLworI2VuZGlmCisKKyNkZWZpbmUgX19SV1NFTV9JTklUSUFMSVpFUihuYW1lKSBcCisJeyBSV1NFTV9VTkxPQ0tFRF9WQUxVRSwgU1BJTl9MT0NLX1VOTE9DS0VELCBcCisJICBMSVNUX0hFQURfSU5JVCgobmFtZSkud2FpdF9saXN0KSBcCisJICBfX1JXU0VNX0RFQlVHX0lOSVQgfQorCisjZGVmaW5lIERFQ0xBUkVfUldTRU0obmFtZSkJCVwKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIG5hbWUgPSBfX1JXU0VNX0lOSVRJQUxJWkVSKG5hbWUpCisKK2V4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlICpyd3NlbV9kb3duX3JlYWRfZmFpbGVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSk7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSAqcndzZW1fZG93bl93cml0ZV9mYWlsZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKTsKK2V4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlICpyd3NlbV93YWtlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSk7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSAqcndzZW1fZG93bmdyYWRlX3dha2Uoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKTsKKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfcndzZW0oc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCXNlbS0+Y291bnQgPSBSV1NFTV9VTkxPQ0tFRF9WQUxVRTsKKwlzcGluX2xvY2tfaW5pdCgmc2VtLT53YWl0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZzZW0tPndhaXRfbGlzdCk7CisjaWYgUldTRU1fREVCVUcKKwlzZW0tPmRlYnVnID0gMDsKKyNlbmRpZgorfQorCisvKgorICogbG9jayBmb3IgcmVhZGluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kb3duX3JlYWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCWlmIChhdG9taWNfYWRkX3JldHVybigxLChhdG9taWNfdCAqKSgmc2VtLT5jb3VudCkpID4gMCkKKwkJc21wX3dtYigpOworCWVsc2UKKwkJcndzZW1fZG93bl9yZWFkX2ZhaWxlZChzZW0pOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2Rvd25fcmVhZF90cnlsb2NrKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlpbnQgdG1wOworCisJd2hpbGUgKCh0bXAgPSBzZW0tPmNvdW50KSA+PSAwKSB7CisJCWlmICh0bXAgPT0gY21weGNoZygmc2VtLT5jb3VudCwgdG1wLAorCQkJCSAgIHRtcCArIFJXU0VNX0FDVElWRV9SRUFEX0JJQVMpKSB7CisJCQlzbXBfd21iKCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGxvY2sgZm9yIHdyaXRpbmcKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZG93bl93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJaW50IHRtcDsKKworCXRtcCA9IGF0b21pY19hZGRfcmV0dXJuKFJXU0VNX0FDVElWRV9XUklURV9CSUFTLAorCQkJCShhdG9taWNfdCAqKSgmc2VtLT5jb3VudCkpOworCWlmICh0bXAgPT0gUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpCisJCXNtcF93bWIoKTsKKwllbHNlCisJCXJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKHNlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fZG93bl93cml0ZV90cnlsb2NrKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlpbnQgdG1wOworCisJdG1wID0gY21weGNoZygmc2VtLT5jb3VudCwgUldTRU1fVU5MT0NLRURfVkFMVUUsCisJCSAgICAgIFJXU0VNX0FDVElWRV9XUklURV9CSUFTKTsKKwlzbXBfd21iKCk7CisJcmV0dXJuIHRtcCA9PSBSV1NFTV9VTkxPQ0tFRF9WQUxVRTsKK30KKworLyoKKyAqIHVubG9jayBhZnRlciByZWFkaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3VwX3JlYWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCWludCB0bXA7CisKKwlzbXBfd21iKCk7CisJdG1wID0gYXRvbWljX3N1Yl9yZXR1cm4oMSwoYXRvbWljX3QgKikoJnNlbS0+Y291bnQpKTsKKwlpZiAodG1wIDwgLTEgJiYgKHRtcCAmIFJXU0VNX0FDVElWRV9NQVNLKSA9PSAwKQorCQlyd3NlbV93YWtlKHNlbSk7Cit9CisKKy8qCisgKiB1bmxvY2sgYWZ0ZXIgd3JpdGluZworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX191cF93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJc21wX3dtYigpOworCWlmIChhdG9taWNfc3ViX3JldHVybihSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUywKKwkJCSAgICAgIChhdG9taWNfdCAqKSgmc2VtLT5jb3VudCkpIDwgMCkKKwkJcndzZW1fd2FrZShzZW0pOworfQorCisvKgorICogaW1wbGVtZW50IGF0b21pYyBhZGQgZnVuY3Rpb25hbGl0eQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fYXRvbWljX2FkZChpbnQgZGVsdGEsIHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlhdG9taWNfYWRkKGRlbHRhLCAoYXRvbWljX3QgKikoJnNlbS0+Y291bnQpKTsKK30KKworLyoKKyAqIGRvd25ncmFkZSB3cml0ZSBsb2NrIHRvIHJlYWQgbG9jaworICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19kb3duZ3JhZGVfd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworCWludCB0bXA7CisKKwlzbXBfd21iKCk7CisJdG1wID0gYXRvbWljX2FkZF9yZXR1cm4oLVJXU0VNX1dBSVRJTkdfQklBUywgKGF0b21pY190ICopKCZzZW0tPmNvdW50KSk7CisJaWYgKHRtcCA8IDApCisJCXJ3c2VtX2Rvd25ncmFkZV93YWtlKHNlbSk7Cit9CisKKy8qCisgKiBpbXBsZW1lbnQgZXhjaGFuZ2UgYW5kIGFkZCBmdW5jdGlvbmFsaXR5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ3c2VtX2F0b21pY191cGRhdGUoaW50IGRlbHRhLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCit7CisJc21wX21iKCk7CisJcmV0dXJuIGF0b21pY19hZGRfcmV0dXJuKGRlbHRhLCAoYXRvbWljX3QgKikoJnNlbS0+Y291bnQpKTsKK30KKworI2VuZGlmCS8qIF9YVEVOU0FfUldTRU1fWEFERF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2NhdHRlcmxpc3QuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zY2F0dGVybGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTJiOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc2NhdHRlcmxpc3QuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3NjYXR0ZXJsaXN0LmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NDQVRURVJMSVNUX0gKKyNkZWZpbmUgX1hURU5TQV9TQ0FUVEVSTElTVF9ICisKK3N0cnVjdCBzY2F0dGVybGlzdCB7CisJc3RydWN0IHBhZ2UgCSpwYWdlOworCXVuc2lnbmVkIGludAlvZmZzZXQ7CisJZG1hX2FkZHJfdAlkbWFfYWRkcmVzczsKKwl1bnNpZ25lZCBpbnQJbGVuZ3RoOworfTsKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBzaG91bGQgYmUgdXNlZCBhZnRlciBhIHBjaV9tYXBfc2cgY2FsbCBoYXMgYmVlbiBkb25lCisgKiB0byBnZXQgYnVzIGFkZHJlc3NlcyBvZiBlYWNoIG9mIHRoZSBTRyBlbnRyaWVzIGFuZCB0aGVpciBsZW5ndGhzLgorICogWW91IHNob3VsZCBvbmx5IHdvcmsgd2l0aCB0aGUgbnVtYmVyIG9mIHNnIGVudHJpZXMgcGNpX21hcF9zZworICogcmV0dXJucywgb3IgYWx0ZXJuYXRpdmVseSBzdG9wIG9uIHRoZSBmaXJzdCBzZ19kbWFfbGVuKHNnKSB3aGljaAorICogaXMgMC4KKyAqLworI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykgICAgICAoKHNnKS0+ZG1hX2FkZHJlc3MpCisjZGVmaW5lIHNnX2RtYV9sZW4oc2cpICAgICAgICAgICgoc2cpLT5sZW5ndGgpCisKKworI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRCAofjBVTCkKKworI2VuZGlmCS8qIF9YVEVOU0FfU0NBVFRFUkxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlY3Rpb25zLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc2VjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGI1MTkxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlY3Rpb25zLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZWN0aW9ucy5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TRUNUSU9OU19ICisjZGVmaW5lIF9YVEVOU0FfU0VDVElPTlNfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KKworI2VuZGlmCS8qIF9YVEVOU0FfU0VDVElPTlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlZ21lbnQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZWdtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlYjU0NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zZWdtZW50LmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZWdtZW50LmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NFR01FTlRfSAorI2RlZmluZSBfWFRFTlNBX1NFR01FTlRfSAorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2VuZGlmCS8qIF9YVEVOU0FfU0VHRU1FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlbWFwaG9yZS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTc1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc2VtYXBob3JlLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS14dGVuc2Evc2VtYXBob3JlLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NFTUFQSE9SRV9ICisjZGVmaW5lIF9YVEVOU0FfU0VNQVBIT1JFX0gKKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKK3N0cnVjdCBzZW1hcGhvcmUgeworCWF0b21pY190IGNvdW50OworCWludCBzbGVlcGVyczsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworI2lmIFdBSVRRVUVVRV9ERUJVRworCWxvbmcgX19tYWdpYzsKKyNlbmRpZgorfTsKKworI2lmIFdBSVRRVUVVRV9ERUJVRworIyBkZWZpbmUgX19TRU1fREVCVUdfSU5JVChuYW1lKSBcCisJCSwgKGludCkmKG5hbWUpLl9fbWFnaWMKKyNlbHNlCisjIGRlZmluZSBfX1NFTV9ERUJVR19JTklUKG5hbWUpCisjZW5kaWYKKworI2RlZmluZSBfX1NFTUFQSE9SRV9JTklUSUFMSVpFUihuYW1lLGNvdW50KQkJCVwKKwl7IEFUT01JQ19JTklUKGNvdW50KSwgCQkJCQlcCisJICAwLAkJCQkJCQlcCisJICBfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUigobmFtZSkud2FpdCkJCVwKKwlfX1NFTV9ERUJVR19JTklUKG5hbWUpIH0KKworI2RlZmluZSBfX01VVEVYX0lOSVRJQUxJWkVSKG5hbWUpIFwKKwlfX1NFTUFQSE9SRV9JTklUSUFMSVpFUihuYW1lLCAxKQorCisjZGVmaW5lIF9fREVDTEFSRV9TRU1BUEhPUkVfR0VORVJJQyhuYW1lLGNvdW50KSBcCisJc3RydWN0IHNlbWFwaG9yZSBuYW1lID0gX19TRU1BUEhPUkVfSU5JVElBTElaRVIobmFtZSxjb3VudCkKKworI2RlZmluZSBERUNMQVJFX01VVEVYKG5hbWUpIF9fREVDTEFSRV9TRU1BUEhPUkVfR0VORVJJQyhuYW1lLDEpCisjZGVmaW5lIERFQ0xBUkVfTVVURVhfTE9DS0VEKG5hbWUpIF9fREVDTEFSRV9TRU1BUEhPUkVfR0VORVJJQyhuYW1lLDApCisKK2V4dGVybiBpbmxpbmUgdm9pZCBzZW1hX2luaXQgKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSwgaW50IHZhbCkKK3sKKy8qCisgKgkqc2VtID0gKHN0cnVjdCBzZW1hcGhvcmUpX19TRU1BUEhPUkVfSU5JVElBTElaRVIoKCpzZW0pLHZhbCk7CisgKgorICogaSdkIHJhdGhlciB1c2UgdGhlIG1vcmUgZmxleGlibGUgaW5pdGlhbGl6YXRpb24gYWJvdmUsIGJ1dCBzYWRseQorICogR0NDIDIuNy4yLjMgZW1pdHMgYSBib2d1cyB3YXJuaW5nLiBFR0NTIGRvZXNudC4gT2ggd2VsbC4KKyAqLworCWF0b21pY19zZXQoJnNlbS0+Y291bnQsIHZhbCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2VtLT53YWl0KTsKKyNpZiBXQUlUUVVFVUVfREVCVUcKKwlzZW0tPl9fbWFnaWMgPSAoaW50KSZzZW0tPl9fbWFnaWM7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfTVVURVggKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwlzZW1hX2luaXQoc2VtLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfTVVURVhfTE9DS0VEIChzdHJ1Y3Qgc2VtYXBob3JlICpzZW0pCit7CisJc2VtYV9pbml0KHNlbSwgMCk7Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBfX2Rvd24oc3RydWN0IHNlbWFwaG9yZSAqIHNlbSk7Cithc21saW5rYWdlIGludCAgX19kb3duX2ludGVycnVwdGlibGUoc3RydWN0IHNlbWFwaG9yZSAqIHNlbSk7Cithc21saW5rYWdlIGludCAgX19kb3duX3RyeWxvY2soc3RydWN0IHNlbWFwaG9yZSAqIHNlbSk7Cithc21saW5rYWdlIHZvaWQgX191cChzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKTsKKworZXh0ZXJuIHNwaW5sb2NrX3Qgc2VtYXBob3JlX3dha2VfbG9jazsKKworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBkb3duKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisjaWYgV0FJVFFVRVVFX0RFQlVHCisJQ0hFQ0tfTUFHSUMoc2VtLT5fX21hZ2ljKTsKKyNlbmRpZgorCisJaWYgKGF0b21pY19zdWJfcmV0dXJuKDEsICZzZW0tPmNvdW50KSA8IDApCisJCV9fZG93bihzZW0pOworfQorCitleHRlcm4gX19pbmxpbmVfXyBpbnQgZG93bl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisJaW50IHJldCA9IDA7CisjaWYgV0FJVFFVRVVFX0RFQlVHCisJQ0hFQ0tfTUFHSUMoc2VtLT5fX21hZ2ljKTsKKyNlbmRpZgorCisJaWYgKGF0b21pY19zdWJfcmV0dXJuKDEsICZzZW0tPmNvdW50KSA8IDApCisJCXJldCA9IF9fZG93bl9pbnRlcnJ1cHRpYmxlKHNlbSk7CisJcmV0dXJuIHJldDsKK30KKworZXh0ZXJuIF9faW5saW5lX18gaW50IGRvd25fdHJ5bG9jayhzdHJ1Y3Qgc2VtYXBob3JlICogc2VtKQoreworCWludCByZXQgPSAwOworI2lmIFdBSVRRVUVVRV9ERUJVRworCUNIRUNLX01BR0lDKHNlbS0+X19tYWdpYyk7CisjZW5kaWYKKworCWlmIChhdG9taWNfc3ViX3JldHVybigxLCAmc2VtLT5jb3VudCkgPCAwKQorCQlyZXQgPSBfX2Rvd25fdHJ5bG9jayhzZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBOb3RlISBUaGlzIGlzIHN1YnRsZS4gV2UganVtcCB0byB3YWtlIHBlb3BsZSB1cCBvbmx5IGlmCisgKiB0aGUgc2VtYXBob3JlIHdhcyBuZWdhdGl2ZSAoPT0gc29tZWJvZHkgd2FzIHdhaXRpbmcgb24gaXQpLgorICovCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIHVwKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCit7CisjaWYgV0FJVFFVRVVFX0RFQlVHCisJQ0hFQ0tfTUFHSUMoc2VtLT5fX21hZ2ljKTsKKyNlbmRpZgorCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAmc2VtLT5jb3VudCkgPD0gMCkKKwkJX191cChzZW0pOworfQorCisjZW5kaWYgLyogX1hURU5TQV9TRU1BUEhPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlbWJ1Zi5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlbWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMjZjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc2VtYnVmLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZW1idWYuaAorICoKKyAqIFRoZSBzZW1pZDY0X2RzIHN0cnVjdHVyZSBmb3IgWHRlbnNhIGFyY2hpdGVjdHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKgorICogTm90ZSBleHRyYSBwYWRkaW5nIGJlY2F1c2UgdGhpcyBzdHJ1Y3R1cmUgaXMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoCisgKiBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlciBzcGFjZS4KKyAqCisgKiBQYWQgc3BhY2UgaXMgbGVmdCBmb3I6CisgKiAtIDY0LWJpdCB0aW1lX3QgdG8gc29sdmUgeTIwMzggcHJvYmxlbQorICogLSAyIG1pc2NlbGxhbmVvdXMgMzItYml0IHZhbHVlcworICoKKyAqLworCisjaWZuZGVmIF9YVEVOU0FfU0VNQlVGX0gKKyNkZWZpbmUgX1hURU5TQV9TRU1CVUZfSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitzdHJ1Y3Qgc2VtaWQ2NF9kcyB7CisJc3RydWN0IGlwYzY0X3Blcm0gc2VtX3Blcm07CQkvKiBwZXJtaXNzaW9ucyAuLiBzZWUgaXBjLmggKi8KKyNpZiBYQ0hBTF9IQVZFX0xFCisJX19rZXJuZWxfdGltZV90CXNlbV9vdGltZTsJCS8qIGxhc3Qgc2Vtb3AgdGltZSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAlzZW1fY3RpbWU7CQkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAlzZW1fb3RpbWU7CQkvKiBsYXN0IHNlbW9wIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCV9fdW51c2VkMjsKKwlfX2tlcm5lbF90aW1lX3QJc2VtX2N0aW1lOwkJLyogbGFzdCBjaGFuZ2UgdGltZSAqLworI2VuZGlmCisJdW5zaWduZWQgbG9uZwlzZW1fbnNlbXM7CQkvKiBuby4gb2Ygc2VtYXBob3JlcyBpbiBhcnJheSAqLworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQzOworCXVuc2lnbmVkIGxvbmcJX191bnVzZWQ0OworfTsKKworI2VuZGlmIC8qIF9fQVNNX1hURU5TQV9TRU1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMDQxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc2VyaWFsLmgKQEAgLTAsMCArMSwxOCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZXJpYWwuaAorICoKKyAqIENvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgODI1MCwgMTY0NTAsIDE2NTUwLCBldGMuIHNlcmlhbCBwb3J0cworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfU0VSSUFMX0gKKyNkZWZpbmUgX1hURU5TQV9TRVJJQUxfSAorCisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtL3NlcmlhbC5oPgorCisjZW5kaWYJLyogX1hURU5TQV9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NldHVwLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYzNjUyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NldHVwLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zZXR1cC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TRVRVUF9ICisjZGVmaW5lIF9YVEVOU0FfU0VUVVBfSAorCisjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFCTI1NgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaG1idWYuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaG1idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBiODFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NobWJ1Zi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2Evc2htYnVmLmgKKyAqCisgKiBUaGUgc2htaWQ2NF9kcyBzdHJ1Y3R1cmUgZm9yIFh0ZW5zYSBhcmNoaXRlY3R1cmUuCisgKiBOb3RlIGV4dHJhIHBhZGRpbmcgYmVjYXVzZSB0aGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgYmFjayBhbmQgZm9ydGgKKyAqIGJldHdlZW4ga2VybmVsIGFuZCB1c2VyIHNwYWNlLgorICoKKyAqIFBhZCBzcGFjZSBpcyBsZWZ0IGZvcjoKKyAqIC0gNjQtYml0IHRpbWVfdCB0byBzb2x2ZSB5MjAzOCBwcm9ibGVtCisgKiAtIDIgbWlzY2VsbGFuZW91cyAzMi1iaXQgdmFsdWVzCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TSE1CVUZfSAorI2RlZmluZSBfWFRFTlNBX1NITUJVRl9ICisKK3N0cnVjdCBzaG1pZDY0X2RzIHsKKwlzdHJ1Y3QgaXBjNjRfcGVybQlzaG1fcGVybTsJLyogb3BlcmF0aW9uIHBlcm1zICovCisJc2l6ZV90CQkJc2htX3NlZ3N6OwkvKiBzaXplIG9mIHNlZ21lbnQgKGJ5dGVzKSAqLworCV9fa2VybmVsX3RpbWVfdAkJc2htX2F0aW1lOwkvKiBsYXN0IGF0dGFjaCB0aW1lICovCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQxOworCV9fa2VybmVsX3RpbWVfdAkJc2htX2R0aW1lOwkvKiBsYXN0IGRldGFjaCB0aW1lICovCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQyOworCV9fa2VybmVsX3RpbWVfdAkJc2htX2N0aW1lOwkvKiBsYXN0IGNoYW5nZSB0aW1lICovCisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQzOworCV9fa2VybmVsX3BpZF90CQlzaG1fY3BpZDsJLyogcGlkIG9mIGNyZWF0b3IgKi8KKwlfX2tlcm5lbF9waWRfdAkJc2htX2xwaWQ7CS8qIHBpZCBvZiBsYXN0IG9wZXJhdG9yICovCisJdW5zaWduZWQgbG9uZwkJc2htX25hdHRjaDsJLyogbm8uIG9mIGN1cnJlbnQgYXR0YWNoZXMgKi8KKwl1bnNpZ25lZCBsb25nCQlfX3VudXNlZDQ7CisJdW5zaWduZWQgbG9uZwkJX191bnVzZWQ1OworfTsKKworc3RydWN0IHNobWluZm82NCB7CisJdW5zaWduZWQgbG9uZwlzaG1tYXg7CisJdW5zaWduZWQgbG9uZwlzaG1taW47CisJdW5zaWduZWQgbG9uZwlzaG1tbmk7CisJdW5zaWduZWQgbG9uZwlzaG1zZWc7CisJdW5zaWduZWQgbG9uZwlzaG1hbGw7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDE7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDI7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDM7CisJdW5zaWduZWQgbG9uZwlfX3VudXNlZDQ7Cit9OworCisjZW5kaWYJLyogX1hURU5TQV9TSE1CVUZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NobXBhcmFtLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc2htcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2I2NWJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NobXBhcmFtLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaG1wYXJhbS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NITVBBUkFNX0gKKyNkZWZpbmUgX1hURU5TQV9TSE1QQVJBTV9ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBYdGVuc2EgY2FuIGhhdmUgdmFyaWFibGUgc2l6ZSBjYWNoZXMsIGFuZCBpZgorICogdGhlIHNpemUgb2Ygc2luZ2xlIHdheSBpcyBsYXJnZXIgdGhhbiB0aGUgcGFnZSBzaXplLAorICogdGhlbiB3ZSBoYXZlIHRvIHN0YXJ0IHdvcnJ5aW5nIGFib3V0IGNhY2hlIGFsaWFzaW5nCisgKiBwcm9ibGVtcy4KKyAqLworCisjZGVmaW5lIFNITUxCQQkoKFBBR0VfU0laRSA+IERDQUNIRV9XQVlfU0laRSk/IFBBR0VfU0laRSA6IERDQUNIRV9XQVlfU0laRSkKKworI2VuZGlmIC8qIF9YVEVOU0FfU0hNUEFSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NpZ2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaWdjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1MTc3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaWdjb250ZXh0LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaWdjb250ZXh0LmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDAzIFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NJR0NPTlRFWFRfSAorI2RlZmluZSBfWFRFTlNBX1NJR0NPTlRFWFRfSAorCisjZGVmaW5lIF9BU01MQU5HVUFHRQorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vY29wcm9jZXNzb3IuaD4KKworCitzdHJ1Y3QgX2Nwc3RhdGUgeworCXVuc2lnbmVkIGNoYXIgX2Nwc3RhdGVbWFRFTlNBX0NQX0VYVFJBX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoWFRFTlNBX0NQX0VYVFJBX0FMSUdOKSkpOworCisKK3N0cnVjdCBzaWdjb250ZXh0IHsKKwl1bnNpZ25lZCBsb25nCW9sZG1hc2s7CisKKwkvKiBDUFUgcmVnaXN0ZXJzICovCisJdW5zaWduZWQgbG9uZyBzY19wYzsKKwl1bnNpZ25lZCBsb25nIHNjX3BzOworCXVuc2lnbmVkIGxvbmcgc2Nfd21hc2s7CisJdW5zaWduZWQgbG9uZyBzY193aW5kb3diYXNlOworCXVuc2lnbmVkIGxvbmcgc2Nfd2luZG93c3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzY19sYmVnOworCXVuc2lnbmVkIGxvbmcgc2NfbGVuZDsKKwl1bnNpZ25lZCBsb25nIHNjX2xjb3VudDsKKwl1bnNpZ25lZCBsb25nIHNjX3NhcjsKKwl1bnNpZ25lZCBsb25nIHNjX2RlcGM7CisJdW5zaWduZWQgbG9uZyBzY19kYXJlZzA7CisJdW5zaWduZWQgbG9uZyBzY190cmVnWzRdOworCXVuc2lnbmVkIGxvbmcgc2NfYXJlZ1tYQ0hBTF9OVU1fQVJFR1NdOworCXN0cnVjdCBfY3BzdGF0ZSAqc2NfY3BzdGF0ZTsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9YVEVOU0FfU0lHQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2lnaW5mby5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NpZ2luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGYwYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NpZ2luZm8uaApAQCAtMCwwICsxLDE2IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3Byb2Nlc3Nvci5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TSUdJTkZPX0gKKyNkZWZpbmUgX1hURU5TQV9TSUdJTkZPX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ2luZm8uaD4KKworI2VuZGlmCS8qIF9YVEVOU0FfU0lHSU5GT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc2lnbmFsLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc2lnbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2ZmM5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zaWduYWwuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zaWduYWwuaAorICoKKyAqIFN3aXBlZCBmcm9tIFNILgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfU0lHTkFMX0gKKyNkZWZpbmUgX1hURU5TQV9TSUdOQUxfSAorCisKKyNkZWZpbmUgX05TSUcJCTY0CisjZGVmaW5lIF9OU0lHX0JQVwkzMgorI2RlZmluZSBfTlNJR19XT1JEUwkoX05TSUcgLyBfTlNJR19CUFcpCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBBdm9pZCB0b28gbWFueSBoZWFkZXIgb3JkZXJpbmcgcHJvYmxlbXMuICAqLworc3RydWN0IHNpZ2luZm87Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgb2xkX3NpZ3NldF90OwkJLyogYXQgbGVhc3QgMzIgYml0cyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgc2lnW19OU0lHX1dPUkRTXTsKK30gc2lnc2V0X3Q7CisKKyNlbmRpZgorCisjZGVmaW5lIFNJR0hVUAkJIDEKKyNkZWZpbmUgU0lHSU5UCQkgMgorI2RlZmluZSBTSUdRVUlUCQkgMworI2RlZmluZSBTSUdJTEwJCSA0CisjZGVmaW5lIFNJR1RSQVAJCSA1CisjZGVmaW5lIFNJR0FCUlQJCSA2CisjZGVmaW5lIFNJR0lPVAkJIDYKKyNkZWZpbmUgU0lHQlVTCQkgNworI2RlZmluZSBTSUdGUEUJCSA4CisjZGVmaW5lIFNJR0tJTEwJCSA5CisjZGVmaW5lIFNJR1VTUjEJCTEwCisjZGVmaW5lIFNJR1NFR1YJCTExCisjZGVmaW5lIFNJR1VTUjIJCTEyCisjZGVmaW5lIFNJR1BJUEUJCTEzCisjZGVmaW5lIFNJR0FMUk0JCTE0CisjZGVmaW5lIFNJR1RFUk0JCTE1CisjZGVmaW5lIFNJR1NUS0ZMVAkxNgorI2RlZmluZSBTSUdDSExECQkxNworI2RlZmluZSBTSUdDT05UCQkxOAorI2RlZmluZSBTSUdTVE9QCQkxOQorI2RlZmluZSBTSUdUU1RQCQkyMAorI2RlZmluZSBTSUdUVElOCQkyMQorI2RlZmluZSBTSUdUVE9VCQkyMgorI2RlZmluZSBTSUdVUkcJCTIzCisjZGVmaW5lIFNJR1hDUFUJCTI0CisjZGVmaW5lIFNJR1hGU1oJCTI1CisjZGVmaW5lIFNJR1ZUQUxSTQkyNgorI2RlZmluZSBTSUdQUk9GCQkyNworI2RlZmluZSBTSUdXSU5DSAkyOAorI2RlZmluZSBTSUdJTwkJMjkKKyNkZWZpbmUgU0lHUE9MTAkJU0lHSU8KKy8qICNkZWZpbmUgU0lHTE9TVAkJMjkgKi8KKyNkZWZpbmUgU0lHUFdSCQkzMAorI2RlZmluZSBTSUdTWVMJCTMxCisjZGVmaW5lCVNJR1VOVVNFRAkzMQorCisvKiBUaGVzZSBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgY29uc3RhbnRzIGZyb20gdXNlcmxhbmQuICAqLworI2RlZmluZSBTSUdSVE1JTgkzMgorI2RlZmluZSBTSUdSVE1BWAkoX05TSUctMSkKKworLyoKKyAqIFNBX0ZMQUdTIHZhbHVlczoKKyAqCisgKiBTQV9PTlNUQUNLIGluZGljYXRlcyB0aGF0IGEgcmVnaXN0ZXJlZCBzdGFja190IHdpbGwgYmUgdXNlZC4KKyAqIFNBX0lOVEVSUlVQVCBpcyBhIG5vLW9wLCBidXQgbGVmdCBkdWUgdG8gaGlzdG9yaWNhbCByZWFzb25zLiBVc2UgdGhlCisgKiBTQV9SRVNUQVJUIGZsYWcgdG8gZ2V0IHJlc3RhcnRpbmcgc2lnbmFscyAod2hpY2ggd2VyZSB0aGUgZGVmYXVsdCBsb25nIGFnbykKKyAqIFNBX05PQ0xEU1RPUCBmbGFnIHRvIHR1cm4gb2ZmIFNJR0NITEQgd2hlbiBjaGlsZHJlbiBzdG9wLgorICogU0FfUkVTRVRIQU5EIGNsZWFycyB0aGUgaGFuZGxlciB3aGVuIHRoZSBzaWduYWwgaXMgZGVsaXZlcmVkLgorICogU0FfTk9DTERXQUlUIGZsYWcgb24gU0lHQ0hMRCB0byBpbmhpYml0IHpvbWJpZXMuCisgKiBTQV9OT0RFRkVSIHByZXZlbnRzIHRoZSBjdXJyZW50IHNpZ25hbCBmcm9tIGJlaW5nIG1hc2tlZCBpbiB0aGUgaGFuZGxlci4KKyAqCisgKiBTQV9PTkVTSE9UIGFuZCBTQV9OT01BU0sgYXJlIHRoZSBoaXN0b3JpY2FsIExpbnV4IG5hbWVzIGZvciB0aGUgU2luZ2xlCisgKiBVbml4IG5hbWVzIFJFU0VUSEFORCBhbmQgTk9ERUZFUiByZXNwZWN0aXZlbHkuCisgKi8KKyNkZWZpbmUgU0FfTk9DTERTVE9QCTB4MDAwMDAwMDEKKyNkZWZpbmUgU0FfTk9DTERXQUlUCTB4MDAwMDAwMDIgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKyNkZWZpbmUgU0FfU0lHSU5GTwkweDAwMDAwMDA0CisjZGVmaW5lIFNBX09OU1RBQ0sJMHgwODAwMDAwMAorI2RlZmluZSBTQV9SRVNUQVJUCTB4MTAwMDAwMDAKKyNkZWZpbmUgU0FfTk9ERUZFUgkweDQwMDAwMDAwCisjZGVmaW5lIFNBX1JFU0VUSEFORAkweDgwMDAwMDAwCisKKyNkZWZpbmUgU0FfTk9NQVNLCVNBX05PREVGRVIKKyNkZWZpbmUgU0FfT05FU0hPVAlTQV9SRVNFVEhBTkQKKyNkZWZpbmUgU0FfSU5URVJSVVBUCTB4MjAwMDAwMDAgLyogZHVtbXkgLS0gaWdub3JlZCAqLworCisjZGVmaW5lIFNBX1JFU1RPUkVSCTB4MDQwMDAwMDAKKworLyoKKyAqIHNpZ2FsdHN0YWNrIGNvbnRyb2xzCisgKi8KKyNkZWZpbmUgU1NfT05TVEFDSwkxCisjZGVmaW5lIFNTX0RJU0FCTEUJMgorCisjZGVmaW5lIE1JTlNJR1NUS1NaCTIwNDgKKyNkZWZpbmUgU0lHU1RLU1oJODE5MgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIFRoZXNlIHZhbHVlcyBvZiBzYV9mbGFncyBhcmUgdXNlZCBvbmx5IGJ5IHRoZSBrZXJuZWwgYXMgcGFydCBvZiB0aGUKKyAqIGlycSBoYW5kbGluZyByb3V0aW5lcy4KKyAqCisgKiBTQV9JTlRFUlJVUFQgaXMgYWxzbyB1c2VkIGJ5IHRoZSBpcnEgaGFuZGxpbmcgcm91dGluZXMuCisgKiBTQV9TSElSUSBpcyBmb3Igc2hhcmVkIGludGVycnVwdCBzdXBwb3J0IG9uIFBDSSBhbmQgRUlTQS4KKyAqLworI2RlZmluZSBTQV9QUk9CRQkJU0FfT05FU0hPVAorI2RlZmluZSBTQV9TQU1QTEVfUkFORE9NCVNBX1JFU1RBUlQKKyNkZWZpbmUgU0FfU0hJUlEJCTB4MDQwMDAwMDAKKyNlbmRpZgorCisjZGVmaW5lIFNJR19CTE9DSyAgICAgICAgICAwCS8qIGZvciBibG9ja2luZyBzaWduYWxzICovCisjZGVmaW5lIFNJR19VTkJMT0NLICAgICAgICAxCS8qIGZvciB1bmJsb2NraW5nIHNpZ25hbHMgKi8KKyNkZWZpbmUgU0lHX1NFVE1BU0sgICAgICAgIDIJLyogZm9yIHNldHRpbmcgdGhlIHNpZ25hbCBtYXNrICovCisKKy8qIFR5cGUgb2YgYSBzaWduYWwgaGFuZGxlci4gICovCit0eXBlZGVmIHZvaWQgKCpfX3NpZ2hhbmRsZXJfdCkoaW50KTsKKworI2RlZmluZSBTSUdfREZMCSgoX19zaWdoYW5kbGVyX3QpMCkJLyogZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcgKi8KKyNkZWZpbmUgU0lHX0lHTgkoKF9fc2lnaGFuZGxlcl90KTEpCS8qIGlnbm9yZSBzaWduYWwgKi8KKyNkZWZpbmUgU0lHX0VSUgkoKF9fc2lnaGFuZGxlcl90KS0xKQkvKiBlcnJvciByZXR1cm4gZnJvbSBzaWduYWwgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KK3N0cnVjdCBvbGRfc2lnYWN0aW9uIHsKKwlfX3NpZ2hhbmRsZXJfdCBzYV9oYW5kbGVyOworCW9sZF9zaWdzZXRfdCBzYV9tYXNrOworCXVuc2lnbmVkIGxvbmcgc2FfZmxhZ3M7CisJdm9pZCAoKnNhX3Jlc3RvcmVyKSh2b2lkKTsKK307CisKK3N0cnVjdCBzaWdhY3Rpb24geworCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CisJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKKwl2b2lkICgqc2FfcmVzdG9yZXIpKHZvaWQpOworCXNpZ3NldF90IHNhX21hc2s7CQkvKiBtYXNrIGxhc3QgZm9yIGV4dGVuc2liaWxpdHkgKi8KK307CisKK3N0cnVjdCBrX3NpZ2FjdGlvbiB7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKK307CisKKyNlbHNlCisKKy8qIEhlcmUgd2UgbXVzdCBjYXRlciB0byBsaWJjcyB0aGF0IHBva2UgYWJvdXQgaW4ga2VybmVsIGhlYWRlcnMuICAqLworCitzdHJ1Y3Qgc2lnYWN0aW9uIHsKKwl1bmlvbiB7CisJICBfX3NpZ2hhbmRsZXJfdCBfc2FfaGFuZGxlcjsKKwkgIHZvaWQgKCpfc2Ffc2lnYWN0aW9uKShpbnQsIHN0cnVjdCBzaWdpbmZvICosIHZvaWQgKik7CisJfSBfdTsKKwlzaWdzZXRfdCBzYV9tYXNrOworCXVuc2lnbmVkIGxvbmcgc2FfZmxhZ3M7CisJdm9pZCAoKnNhX3Jlc3RvcmVyKSh2b2lkKTsKK307CisKKyNkZWZpbmUgc2FfaGFuZGxlcglfdS5fc2FfaGFuZGxlcgorI2RlZmluZSBzYV9zaWdhY3Rpb24JX3UuX3NhX3NpZ2FjdGlvbgorCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCit0eXBlZGVmIHN0cnVjdCBzaWdhbHRzdGFjayB7CisJdm9pZCAqc3Nfc3A7CisJaW50IHNzX2ZsYWdzOworCXNpemVfdCBzc19zaXplOworfSBzdGFja190OworCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGFzbS9zaWdjb250ZXh0Lmg+CisjZGVmaW5lIHB0cmFjZV9zaWduYWxfZGVsaXZlcihyZWdzLCBjb29raWUpIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX1NJR05BTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc21wLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNTY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zbXAuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3NtcC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TTVBfSAorI2RlZmluZSBfWFRFTlNBX1NNUF9ICisKK2V4dGVybiBzdHJ1Y3QgeHRlbnNhX2NwdWluZm8gYm9vdF9jcHVfZGF0YTsKKworI2RlZmluZSBjcHVfZGF0YSAoJmJvb3RfY3B1X2RhdGEpCisjZGVmaW5lIGN1cnJlbnRfY3B1X2RhdGEgYm9vdF9jcHVfZGF0YQorCitzdHJ1Y3QgeHRlbnNhX2NwdWluZm8geworCXVuc2lnbmVkIGxvbmcJKnBnZF9jYWNoZTsKKwl1bnNpZ25lZCBsb25nCSpwdGVfY2FjaGU7CisJdW5zaWduZWQgbG9uZwlwZ3RhYmxlX2NhY2hlX3N6OworfTsKKworI2RlZmluZSBjcHVfbG9naWNhbF9tYXAoY3B1KQkoY3B1KQorCisjZW5kaWYJLyogX1hURU5TQV9TTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhY2NkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2V0LmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zb2NrZXQuaAorICoKKyAqIENvcGllZCBmcm9tIGkzODYuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NPQ0tFVF9ICisjZGVmaW5lIF9YVEVOU0FfU09DS0VUX0gKKworI2luY2x1ZGUgPGFzbS9zb2NraW9zLmg+CisKKy8qIEZvciBzZXRzb2Nrb3B0aW9ucygyKSAqLworI2RlZmluZSBTT0xfU09DS0VUCTEKKworI2RlZmluZSBTT19ERUJVRwkxCisjZGVmaW5lIFNPX1JFVVNFQUREUgkyCisjZGVmaW5lIFNPX1RZUEUJCTMKKyNkZWZpbmUgU09fRVJST1IJNAorI2RlZmluZSBTT19ET05UUk9VVEUJNQorI2RlZmluZSBTT19CUk9BRENBU1QJNgorI2RlZmluZSBTT19TTkRCVUYJNworI2RlZmluZSBTT19SQ1ZCVUYJOAorI2RlZmluZSBTT19LRUVQQUxJVkUJOQorI2RlZmluZSBTT19PT0JJTkxJTkUJMTAKKyNkZWZpbmUgU09fTk9fQ0hFQ0sJMTEKKyNkZWZpbmUgU09fUFJJT1JJVFkJMTIKKyNkZWZpbmUgU09fTElOR0VSCTEzCisjZGVmaW5lIFNPX0JTRENPTVBBVAkxNAorLyogVG8gYWRkIDojZGVmaW5lIFNPX1JFVVNFUE9SVCAxNSAqLworI2RlZmluZSBTT19QQVNTQ1JFRAkxNgorI2RlZmluZSBTT19QRUVSQ1JFRAkxNworI2RlZmluZSBTT19SQ1ZMT1dBVAkxOAorI2RlZmluZSBTT19TTkRMT1dBVAkxOQorI2RlZmluZSBTT19SQ1ZUSU1FTwkyMAorI2RlZmluZSBTT19TTkRUSU1FTwkyMQorCisvKiBTZWN1cml0eSBsZXZlbHMgLSBhcyBwZXIgTlJMIElQdjYgLSBkb24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyAqLworCisjZGVmaW5lIFNPX1NFQ1VSSVRZX0FVVEhFTlRJQ0FUSU9OCQkyMgorI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVAkyMworI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX05FVFdPUksJCTI0CisKKyNkZWZpbmUgU09fQklORFRPREVWSUNFCTI1CisKKy8qIFNvY2tldCBmaWx0ZXJpbmcgKi8KKworI2RlZmluZSBTT19BVFRBQ0hfRklMVEVSICAgICAgICAyNgorI2RlZmluZSBTT19ERVRBQ0hfRklMVEVSICAgICAgICAyNworCisjZGVmaW5lIFNPX1BFRVJOQU1FCQkyOAorI2RlZmluZSBTT19USU1FU1RBTVAJCTI5CisjZGVmaW5lIFNDTV9USU1FU1RBTVAJCVNPX1RJTUVTVEFNUAorCisjZGVmaW5lIFNPX0FDQ0VQVENPTk4JCTMwCisjZGVmaW5lIFNPX1BFRVJTRUMJCTMxCisKKyNlbmRpZgkvKiBfWFRFTlNBX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc29ja2lvcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQyYmExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3NvY2tpb3MuaAorICoKKyAqIFNvY2tldC1sZXZlbCBJL08gY29udHJvbCBjYWxscy4gIENvcGllZCBmcm9tIE1JUFMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1IGJ5IFJhbGYgQmFlY2hsZQorICogQ29weXJpZ2h0IChDKSAyMDAxIFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NPQ0tJT1NfSAorI2RlZmluZSBfWFRFTlNBX1NPQ0tJT1NfSAorCisjaW5jbHVkZSA8YXNtL2lvY3RsLmg+CisKKy8qIFNvY2tldC1sZXZlbCBJL08gY29udHJvbCBjYWxscy4gKi8KKworI2RlZmluZSBGSU9HRVRPV04JX0lPUignZicsIDEyMywgaW50KQorI2RlZmluZSBGSU9TRVRPV04gCV9JT1coJ2YnLCAxMjQsIGludCkKKworI2RlZmluZSBTSU9DQVRNQVJLCV9JT1IoJ3MnLCA3LCBpbnQpCisjZGVmaW5lIFNJT0NTUEdSUAlfSU9XKCdzJywgOCwgcGlkX3QpCisjZGVmaW5lIFNJT0NHUEdSUAlfSU9SKCdzJywgOSwgcGlkX3QpCisKKyNkZWZpbmUgU0lPQ0dTVEFNUAkweDg5MDYJCS8qIEdldCBzdGFtcCAtIGxpbnV4LXNwZWNpZmljICovCisKKyNlbmRpZgkvKiBfWFRFTlNBX1NPQ0tJT1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc3BpbmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmYyMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3NwaW5sb2NrLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zcGlubG9jay5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TUElOTE9DS19ICisjZGVmaW5lIF9YVEVOU0FfU1BJTkxPQ0tfSAorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2VuZGlmCS8qIF9YVEVOU0FfU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N0YXQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0NjYyZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0LmgKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2Evc3RhdC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9TVEFUX0gKKyNkZWZpbmUgX1hURU5TQV9TVEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCB7CisJdW5zaWduZWQgc2hvcnQgc3RfZGV2OworCXVuc2lnbmVkIHNob3J0IHN0X2lubzsKKwl1bnNpZ25lZCBzaG9ydCBzdF9tb2RlOworCXVuc2lnbmVkIHNob3J0IHN0X25saW5rOworCXVuc2lnbmVkIHNob3J0IHN0X3VpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9naWQ7CisJdW5zaWduZWQgc2hvcnQgc3RfcmRldjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2N0aW1lOworfTsKKworI2RlZmluZSBTVEFUX0hBVkVfTlNFQyAxCisKK3N0cnVjdCBzdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCBzdF9kZXY7CisJdW5zaWduZWQgc2hvcnQgX19wYWQxOworCXVuc2lnbmVkIGxvbmcgc3RfaW5vOworCXVuc2lnbmVkIHNob3J0IHN0X21vZGU7CisJdW5zaWduZWQgc2hvcnQgc3Rfbmxpbms7CisJdW5zaWduZWQgc2hvcnQgc3RfdWlkOworCXVuc2lnbmVkIHNob3J0IHN0X2dpZDsKKwl1bnNpZ25lZCBzaG9ydCBzdF9yZGV2OworCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsKKwl1bnNpZ25lZCBsb25nICBzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsa3NpemU7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lOworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lX25zZWM7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWU7CisJdW5zaWduZWQgbG9uZyAgc3RfbXRpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZTsKKwl1bnNpZ25lZCBsb25nICBzdF9jdGltZV9uc2VjOworCXVuc2lnbmVkIGxvbmcgIF9fdW51c2VkNDsKKwl1bnNpZ25lZCBsb25nICBfX3VudXNlZDU7Cit9OworCisvKiBUaGlzIG1hdGNoZXMgc3RydWN0IHN0YXQ2NCBpbiBnbGliYy0yLjIuMy4gKi8KKworc3RydWN0IHN0YXQ2NCAgeworI2lmZGVmIF9fWFRFTlNBX0VMX18KKwl1bnNpZ25lZCBzaG9ydAlzdF9kZXY7CQkvKiBEZXZpY2UgKi8KKwl1bnNpZ25lZCBjaGFyCV9fcGFkMFsxMF07CisjZWxzZQorCXVuc2lnbmVkIGNoYXIJX19wYWQwWzZdOworCXVuc2lnbmVkIHNob3J0CXN0X2RldjsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkMVsyXTsKKyNlbmRpZgorCisjZGVmaW5lIFNUQVQ2NF9IQVNfQlJPS0VOX1NUX0lOTwkxCisJdW5zaWduZWQgbG9uZyBfX3N0X2lubzsJCS8qIDMyYml0IGZpbGUgc2VyaWFsIG51bWJlci4gKi8KKworCXVuc2lnbmVkIGludCAgc3RfbW9kZTsJCS8qIEZpbGUgbW9kZS4gKi8KKwl1bnNpZ25lZCBpbnQgIHN0X25saW5rOwkJLyogTGluayBjb3VudC4gKi8KKwl1bnNpZ25lZCBpbnQgIHN0X3VpZDsJCS8qIFVzZXIgSUQgb2YgdGhlIGZpbGUncyBvd25lci4gKi8KKwl1bnNpZ25lZCBpbnQgIHN0X2dpZDsJCS8qIEdyb3VwIElEIG9mIHRoZSBmaWxlJ3MgZ3JvdXAuICovCisKKyNpZmRlZiBfX1hURU5TQV9FTF9fCisJdW5zaWduZWQgc2hvcnQJc3RfcmRldjsJLyogRGV2aWNlIG51bWJlciwgaWYgZGV2aWNlLiAqLworCXVuc2lnbmVkIGNoYXIJX19wYWQzWzEwXTsKKyNlbHNlCisJdW5zaWduZWQgY2hhcglfX3BhZDJbNl07CisJdW5zaWduZWQgc2hvcnQJc3RfcmRldjsKKwl1bnNpZ25lZCBjaGFyCV9fcGFkM1syXTsKKyNlbmRpZgorCisJbG9uZyBsb25nIGludCAgc3Rfc2l6ZTsJCS8qIFNpemUgb2YgZmlsZSwgaW4gYnl0ZXMuICovCisJbG9uZyBpbnQgc3RfYmxrc2l6ZTsJCS8qIE9wdGltYWwgYmxvY2sgc2l6ZSBmb3IgSS9PLiAqLworCisjaWZkZWYgX19YVEVOU0FfRUxfXworCXVuc2lnbmVkIGxvbmcgIHN0X2Jsb2NrczsJLyogTnVtYmVyIDUxMi1ieXRlIGJsb2NrcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZyAgX19wYWQ0OworI2Vsc2UKKwl1bnNpZ25lZCBsb25nICBfX3BhZDQ7CisJdW5zaWduZWQgbG9uZyAgc3RfYmxvY2tzOworI2VuZGlmCisKKwl1bnNpZ25lZCBsb25nICBfX3BhZDU7CisJbG9uZyBpbnQgc3RfYXRpbWU7CQkvKiBUaW1lIG9mIGxhc3QgYWNjZXNzLiAqLworCXVuc2lnbmVkIGxvbmcgIHN0X2F0aW1lX25zZWM7CisJbG9uZyBpbnQgc3RfbXRpbWU7CQkvKiBUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uLiAqLworCXVuc2lnbmVkIGxvbmcgIHN0X210aW1lX25zZWM7CisJbG9uZyBpbnQgIHN0X2N0aW1lOwkJLyogVGltZSBvZiBsYXN0IHN0YXR1cyBjaGFuZ2UuICovCisJdW5zaWduZWQgbG9uZyAgc3RfY3RpbWVfbnNlYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0X2lubzsJLyogRmlsZSBzZXJpYWwgbnVtYmVyLiAqLworfTsKKworI2VuZGlmCS8qIF9YVEVOU0FfU1RBVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3RhdGZzLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc3RhdGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzZDFhMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdGF0ZnMuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3N0YXRmcy5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NUQVRGU19ICisjZGVmaW5lIF9YVEVOU0FfU1RBVEZTX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgorCisjZW5kaWYJLyogX1hURU5TQV9TVEFURlNfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2Evc3RyaW5nLmggYi9pbmNsdWRlL2FzbS14dGVuc2Evc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4MWIyNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9zdHJpbmcuaApAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS9zdHJpbmcuaAorICoKKyAqIFRoZXNlIHRyaXZpYWwgc3RyaW5nIGZ1bmN0aW9ucyBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwdWJsaWMgZG9tYWluLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisvKiBXZSBzaG91bGQgb3B0aW1pemUgdGhlc2UuIFNlZSBhcmNoL3h0ZW5zYS9saWIvc3RybmNweV91c2VyLlMgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NUUklOR19ICisjZGVmaW5lIF9YVEVOU0FfU1RSSU5HX0gKKworI2RlZmluZSBfX0hBVkVfQVJDSF9TVFJDUFkKK2V4dGVybiBfX2lubGluZV9fIGNoYXIgKnN0cmNweShjaGFyICpfX2Rlc3QsIGNvbnN0IGNoYXIgKl9fc3JjKQoreworCXJlZ2lzdGVyIGNoYXIgKl9feGRlc3QgPSBfX2Rlc3Q7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIjE6XG5cdCIKKwkJImw4dWkJJTIsICUxLCAwXG5cdCIKKwkJInM4aQklMiwgJTAsIDBcblx0IgorCQkiYWRkaQklMSwgJTEsIDFcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiYm5legklMiwgMWJcblx0IgorCQk6ICI9ciIgKF9fZGVzdCksICI9ciIgKF9fc3JjKSwgIj0mciIgKF9fZHVtbXkpCisJCTogIjAiIChfX2Rlc3QpLCAiMSIgKF9fc3JjKQorCQk6ICJtZW1vcnkiKTsKKworCXJldHVybiBfX3hkZXN0OworfQorCisjZGVmaW5lIF9fSEFWRV9BUkNIX1NUUk5DUFkKK2V4dGVybiBfX2lubGluZV9fIGNoYXIgKnN0cm5jcHkoY2hhciAqX19kZXN0LCBjb25zdCBjaGFyICpfX3NyYywgc2l6ZV90IF9fbikKK3sKKwlyZWdpc3RlciBjaGFyICpfX3hkZXN0ID0gX19kZXN0OworCXVuc2lnbmVkIGxvbmcgX19kdW1teTsKKworCWlmIChfX24gPT0gMCkKKwkJcmV0dXJuIF9feGRlc3Q7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJIjE6XG5cdCIKKwkJImw4dWkJJTIsICUxLCAwXG5cdCIKKwkJInM4aQklMiwgJTAsIDBcblx0IgorCQkiYWRkaQklMSwgJTEsIDFcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiYmVxegklMiwgMmZcblx0IgorCQkiYm5lCSUxLCAlNSwgMWJcbiIKKwkJIjI6IgorCQk6ICI9ciIgKF9fZGVzdCksICI9ciIgKF9fc3JjKSwgIj0mciIgKF9fZHVtbXkpCisJCTogIjAiIChfX2Rlc3QpLCAiMSIgKF9fc3JjKSwgInIiIChfX3NyYytfX24pCisJCTogIm1lbW9yeSIpOworCisJcmV0dXJuIF9feGRlc3Q7Cit9CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSQ01QCitleHRlcm4gX19pbmxpbmVfXyBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKl9fY3MsIGNvbnN0IGNoYXIgKl9fY3QpCit7CisJcmVnaXN0ZXIgaW50IF9fcmVzOworCXVuc2lnbmVkIGxvbmcgX19kdW1teTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiMTpcblx0IgorCQkibDh1aQklMywgJTEsIDBcblx0IgorCQkiYWRkaQklMSwgJTEsIDFcblx0IgorCQkibDh1aQklMiwgJTAsIDBcblx0IgorCQkiYWRkaQklMCwgJTAsIDFcblx0IgorCQkiYmVxegklMiwgMmZcblx0IgorCQkiYmVxCSUyLCAlMywgMWJcbiIKKwkJIjI6XG5cdCIKKwkJInN1YgklMiwgJTMsICUyIgorCQk6ICI9ciIgKF9fY3MpLCAiPXIiIChfX2N0KSwgIj0mciIgKF9fcmVzKSwgIj0mciIgKF9fZHVtbXkpCisJCTogIjAiIChfX2NzKSwgIjEiIChfX2N0KSk7CisKKwlyZXR1cm4gX19yZXM7Cit9CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSTkNNUAorZXh0ZXJuIF9faW5saW5lX18gaW50IHN0cm5jbXAoY29uc3QgY2hhciAqX19jcywgY29uc3QgY2hhciAqX19jdCwgc2l6ZV90IF9fbikKK3sKKwlyZWdpc3RlciBpbnQgX19yZXM7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15OworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJtb3YJJTIsICUzXG4iCisJCSIxOlxuXHQiCisJCSJiZXEJJTAsICU2LCAyZlxuXHQiCisJCSJsOHVpCSUzLCAlMSwgMFxuXHQiCisJCSJhZGRpCSUxLCAlMSwgMVxuXHQiCisJCSJsOHVpCSUyLCAlMCwgMFxuXHQiCisJCSJhZGRpCSUwLCAlMCwgMVxuXHQiCisJCSJiZXF6CSUyLCAyZlxuXHQiCisJCSJiZXF6CSUzLCAyZlxuXHQiCisJCSJiZXEJJTIsICUzLCAxYlxuIgorCQkiMjpcblx0IgorCQkic3ViCSUyLCAlMywgJTIiCisJCTogIj1yIiAoX19jcyksICI9ciIgKF9fY3QpLCAiPSZyIiAoX19yZXMpLCAiPSZyIiAoX19kdW1teSkKKwkJOiAiMCIgKF9fY3MpLCAiMSIgKF9fY3QpLCAiciIgKF9fY3MrX19uKSk7CisKKwlyZXR1cm4gX19yZXM7Cit9CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0VUCitleHRlcm4gdm9pZCAqbWVtc2V0KHZvaWQgKl9fcywgaW50IF9fYywgc2l6ZV90IF9fY291bnQpOworCisjZGVmaW5lIF9fSEFWRV9BUkNIX01FTUNQWQorZXh0ZXJuIHZvaWQgKm1lbWNweSh2b2lkICpfX3RvLCBfX2NvbnN0X18gdm9pZCAqX19mcm9tLCBzaXplX3QgX19uKTsKKworI2RlZmluZSBfX0hBVkVfQVJDSF9NRU1NT1ZFCitleHRlcm4gdm9pZCAqbWVtbW92ZSh2b2lkICpfX2Rlc3QsIF9fY29uc3RfXyB2b2lkICpfX3NyYywgc2l6ZV90IF9fbik7CisKKy8qIERvbid0IGJ1aWxkIGJjb3B5IGF0IGFsbCAuLi4gICovCisjZGVmaW5lIF9fSEFWRV9BUkNIX0JDT1BZCisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNU0NBTgorI2RlZmluZSBtZW1zY2FuIG1lbWNocgorCisjZW5kaWYJLyogX1hURU5TQV9TVFJJTkdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGZlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2Evc3lzdGVtLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1NZU1RFTV9ICisjZGVmaW5lIF9YVEVOU0FfU1lTVEVNX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisvKiBpbnRlcnJ1cHQgY29udHJvbCAqLworCisjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyc3IgJTAsIl9fc3RyaW5naWZ5KFBTKSA6ICI9YSIgKHgpKTsKKyNkZWZpbmUgbG9jYWxfaXJxX3Jlc3RvcmUoeCkJZG8gewkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgid3NyICUwLCAiX19zdHJpbmdpZnkoUFMpIiA7IHJzeW5jIiAJXAorCSAgICAJCSAgICAgIDo6ICJhIiAoeCkgOiAibWVtb3J5Iik7IH0gd2hpbGUoMCk7CisjZGVmaW5lIGxvY2FsX2lycV9zYXZlKHgpCWRvIHsJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJzaWwgJTAsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpIAlcCisJICAgIAkJICAgICAgOiAiPWEiICh4KSA6OiAibWVtb3J5Iik7fSB3aGlsZSgwKTsKKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2lycV9kaXNhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJzaWwgJTAsICJfX3N0cmluZ2lmeShMT0NLTEVWRUwpCisJICAgIAkJICAgICAgOiAiPWEiIChmbGFncykgOjogIm1lbW9yeSIpOworfQorc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2lycV9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCV9fYXNtX18gX192b2xhdGlsZV9fICgicnNpbCAlMCwgMCIgOiAiPWEiIChmbGFncykgOjogIm1lbW9yeSIpOworCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycXNfZGlzYWJsZWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCXJldHVybiBmbGFncyAmIDB4ZjsKK30KKworI2RlZmluZSBSU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAorCV9fYXNtX18gX192b2xhdGlsZV9fKCJyc3IgJTAsIiBfX3N0cmluZ2lmeShDUEVOQUJMRSkgOiAiPWEiICh4KSk7IFwKKwl9IHdoaWxlKDApOworI2RlZmluZSBXU1JfQ1BFTkFCTEUoeCkJZG8gewkJCQkJCSAgXAorICAJX19hc21fXyBfX3ZvbGF0aWxlX18oIndzciAlMCwiIF9fc3RyaW5naWZ5KENQRU5BQkxFKSI7cnN5bmMiIAkgIFwKKwkgICAgCQkgICAgIDo6ICJhIiAoeCkpO30gd2hpbGUoMCk7CisKKyNkZWZpbmUgY2xlYXJfY3BlbmFibGUoKSBfX2NsZWFyX2NwZW5hYmxlKCkKKworZXh0ZXJuIF9faW5saW5lX18gdm9pZCBfX2NsZWFyX2NwZW5hYmxlKHZvaWQpCit7CisjaWYgWENIQUxfSEFWRV9DUAorCXVuc2lnbmVkIGxvbmcgaSA9IDA7CisJV1NSX0NQRU5BQkxFKGkpOworI2VuZGlmCit9CisKK2V4dGVybiBfX2lubGluZV9fIHZvaWQgZW5hYmxlX2NvcHJvY2Vzc29yKGludCBpKQoreworI2lmIFhDSEFMX0hBVkVfQ1AKKwlpbnQgY3A7CisJUlNSX0NQRU5BQkxFKGNwKTsKKwljcCB8PSAxIDw8IGk7CisJV1NSX0NQRU5BQkxFKGNwKTsKKyNlbmRpZgorfQorCitleHRlcm4gX19pbmxpbmVfXyB2b2lkIGRpc2FibGVfY29wcm9jZXNzb3IoaW50IGkpCit7CisjaWYgWENIQUxfSEFWRV9DUAorCWludCBjcDsKKwlSU1JfQ1BFTkFCTEUoY3ApOworCWNwICY9IH4oMSA8PCBpKTsKKwlXU1JfQ1BFTkFCTEUoY3ApOworI2VuZGlmCit9CisKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkgZG8geyB9IHdoaWxlKDApCisKKyNkZWZpbmUgbWIoKSAgYmFycmllcigpCisjZGVmaW5lIHJtYigpIG1iKCkKKyNkZWZpbmUgd21iKCkgbWIoKQorCisjaWZkZWYgQ09ORklHX1NNUAorI2Vycm9yIHNtcF8qIG5vdCBkZWZpbmVkCisjZWxzZQorI2RlZmluZSBzbXBfbWIoKQliYXJyaWVyKCkKKyNkZWZpbmUgc21wX3JtYigpCWJhcnJpZXIoKQorI2RlZmluZSBzbXBfd21iKCkJYmFycmllcigpCisjZW5kaWYKKworI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkJZG8geyB2YXIgPSB2YWx1ZTsgbWIoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2V0X3dtYih2YXIsIHZhbHVlKQlkbyB7IHZhciA9IHZhbHVlOyB3bWIoKTsgfSB3aGlsZSAoMCkKKworI2lmICFkZWZpbmVkIChfX0FTU0VNQkxZX18pCisKKy8qICogc3dpdGNoX3RvKG4pIHNob3VsZCBzd2l0Y2ggdGFza3MgdG8gdGFzayBuciBuLCBmaXJzdAorICogY2hlY2tpbmcgdGhhdCBuIGlzbid0IHRoZSBjdXJyZW50IHRhc2ssIGluIHdoaWNoIGNhc2UgaXQgZG9lcyBub3RoaW5nLgorICovCitleHRlcm4gdm9pZCAqX3N3aXRjaF90byh2b2lkICpsYXN0LCB2b2lkICpuZXh0KTsKKworI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLworCisjZGVmaW5lIHByZXBhcmVfdG9fc3dpdGNoKCkJZG8geyB9IHdoaWxlKDApCisKKyNkZWZpbmUgc3dpdGNoX3RvKHByZXYsbmV4dCxsYXN0KQkJXAorZG8gewkJCQkJCVwKKwljbGVhcl9jcGVuYWJsZSgpOwkJCVwKKwkobGFzdCkgPSBfc3dpdGNoX3RvKHByZXYsIG5leHQpOwlcCit9IHdoaWxlKDApCisKKy8qCisgKiBjbXB4Y2hnCisgKi8KKworZXh0ZXJuIF9faW5saW5lX18gdW5zaWduZWQgbG9uZworX19jbXB4Y2hnX3UzMih2b2xhdGlsZSBpbnQgKnAsIGludCBvbGQsIGludCBuZXcpCit7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyc2lsICAgIGExNSwgIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkJICAgICAgICJsMzJpICAgICUwLCAlMSwgMCAgICAgICAgICAgICAgXG5cdCIKKwkJICAgICAgICJibmUJJTAsICUyLCAxZiAgICAgICAgICAgICBcblx0IgorCQkgICAgICAgInMzMmkgICAgJTMsICUxLCAwICAgICAgICAgICAgICBcblx0IgorCQkgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCQkgICAgICAgIndzciAgICAgYTE1LCAiX19zdHJpbmdpZnkoUFMpIiBcblx0IgorCQkgICAgICAgInJzeW5jICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCQkgICAgICAgOiAiPSZhIiAob2xkKQorCQkgICAgICAgOiAiYSIgKHApLCAiYSIgKG9sZCksICJyIiAobmV3KQorCQkgICAgICAgOiAiYTE1IiwgIm1lbW9yeSIpOworICByZXR1cm4gb2xkOworfQorLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LCBzbyB5b3UnbGwgZ2V0IGEgbGlua2VyIGVycm9yCisgKiBpZiBzb21ldGhpbmcgdHJpZXMgdG8gZG8gYW4gaW52YWxpZCBjbXB4Y2hnKCkuICovCisKK2V4dGVybiB2b2lkIF9fY21weGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcih2b2lkKTsKKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZworX19jbXB4Y2hnKHZvbGF0aWxlIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDQ6ICByZXR1cm4gX19jbXB4Y2hnX3UzMihwdHIsIG9sZCwgbmV3KTsKKwlkZWZhdWx0OiBfX2NtcHhjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIoKTsKKwkJIHJldHVybiBvbGQ7CisJfQorfQorCisjZGVmaW5lIGNtcHhjaGcocHRyLG8sbikJCQkJCQkgICAgICBcCisJKHsgX190eXBlb2ZfXygqKHB0cikpIF9vXyA9IChvKTsJCQkJICAgICAgXAorCSAgIF9fdHlwZW9mX18oKihwdHIpKSBfbl8gPSAobik7CQkJCSAgICAgIFwKKwkgICAoX190eXBlb2ZfXygqKHB0cikpKSBfX2NtcHhjaGcoKHB0ciksICh1bnNpZ25lZCBsb25nKV9vXywJICAgICAgXAorCSAgIAkJCSAgICAgICAgKHVuc2lnbmVkIGxvbmcpX25fLCBzaXplb2YgKCoocHRyKSkpOyBcCisJfSkKKworCisKKworLyoKKyAqIHhjaGdfdTMyCisgKgorICogTm90ZSB0aGF0IGExNSBpcyB1c2VkIGhlcmUgYmVjYXVzZSB0aGUgcmVnaXN0ZXIgYWxsb2NhdGlvbgorICogZG9uZSBieSB0aGUgY29tcGlsZXIgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGEgd2luZG93IG92ZXJmbG93CisgKiBtYXkgbm90IG9jY3VyIGJldHdlZW4gdGhlIHJzaWwgYW5kIHdzciBpbnN0cnVjdGlvbnMuIEJ5IHVzaW5nCisgKiBhMTUgaW4gdGhlIHJzaWwsIHRoZSBtYWNoaW5lIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gYSBzdGF0ZQorICogd2hlcmUgbm8gcmVnaXN0ZXIgcmVmZXJlbmNlIHdpbGwgY2F1c2UgYW4gb3ZlcmZsb3cuCisgKi8KKworZXh0ZXJuIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyB4Y2hnX3UzMih2b2xhdGlsZSBpbnQgKiBtLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKyAgdW5zaWduZWQgbG9uZyB0bXA7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyc2lsICAgIGExNSwgIl9fc3RyaW5naWZ5KExPQ0tMRVZFTCkiXG5cdCIKKwkJICAgICAgICJsMzJpICAgICUwLCAlMSwgMCAgICAgICAgICAgICAgXG5cdCIKKwkJICAgICAgICJzMzJpICAgICUyLCAlMSwgMCAgICAgICAgICAgICAgXG5cdCIKKwkJICAgICAgICJ3c3IgICAgIGExNSwgIl9fc3RyaW5naWZ5KFBTKSIgXG5cdCIKKwkJICAgICAgICJyc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKwkJICAgICAgIDogIj0mYSIgKHRtcCkKKwkJICAgICAgIDogImEiIChtKSwgImEiICh2YWwpCisJCSAgICAgICA6ICJhMTUiLCAibWVtb3J5Iik7CisgIHJldHVybiB0bXA7Cit9CisKKyNkZWZpbmUgdGFzKHB0cikgKHhjaGcoKHB0ciksMSkpCisKKyNpZiAoIF9fWENDX18gPT0gMSApCisKKy8qIHh0LXhjYyBwcm9jZXNzZXMgX19pbmxpbmVfXyBkaWZmZXJlbnRseSB0aGFuIHh0LWdjYyBhbmQgZGVjaWRlcyB0bworICogaW5zZXJ0IGFuIG91dC1vZi1saW5lIGNvcHkgb2YgZnVuY3Rpb24gX194Y2hnLiAgVGhpcyBwcmVzZW50cyB0aGUKKyAqIHVucmVzb2x2ZWQgc3ltYm9sIGF0IGxpbmsgdGltZSBvZiBfX3hjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIsCisgKiBldmVuIHRob3VnaCBzdWNoIGEgZnVuY3Rpb24gd291bGQgbmV2ZXIgYmUgY2FsbGVkIGF0IHJ1bi10aW1lLgorICogeHQtZ2NjIGFsd2F5cyBpbmxpbmVzIF9feGNoZywgYW5kIG9wdGltaXplcyBhd2F5IHRoZSB1bmRlZmluZWQKKyAqIGJhZF9wb2ludGVyIGZ1bmN0aW9uLgorICovCisKKyNkZWZpbmUgeGNoZyhwdHIseCkgeGNoZ191MzIocHRyLHgpCisKKyNlbHNlICAvKiBhc3N1bWUgeHQtZ2NjICovCisKKyNkZWZpbmUgeGNoZyhwdHIseCkgKChfX3R5cGVvZl9fKCoocHRyKSkpX194Y2hnKCh1bnNpZ25lZCBsb25nKSh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkpCisKKy8qCisgKiBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGNvbXBpbGVyIGlzbid0IGhvcnJpYmx5IGJhZCBhdCBvcHRpbWl6aW5nLgorICogZ2NjLTIuNS44IHJlcG9ydGVkbHkgY2FuJ3QgaGFuZGxlIHRoaXMsIGJ1dCBJIGRlZmluZSB0aGF0IG9uZSB0bworICogYmUgZGVhZCBhbnl3YXkuCisgKi8KKworZXh0ZXJuIHZvaWQgX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKHZvaWQpOworCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCitfX3hjaGcodW5zaWduZWQgbG9uZyB4LCB2b2xhdGlsZSB2b2lkICogcHRyLCBpbnQgc2l6ZSkKK3sKKwlzd2l0Y2ggKHNpemUpIHsKKwkJY2FzZSA0OgorCQkJcmV0dXJuIHhjaGdfdTMyKHB0ciwgeCk7CisJfQorCV9feGNoZ19jYWxsZWRfd2l0aF9iYWRfcG9pbnRlcigpOworCXJldHVybiB4OworfQorCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc2V0X2V4Y2VwdF92ZWN0b3IoaW50IG4sIHZvaWQgKmFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3BpbGxfcmVnaXN0ZXJzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGEwLCBwczsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1vdmkJYTE0LCIgX19zdHJpbmdpZnkgKFBTX0VYQ01fTUFTSykgIiB8IDFcblx0IgorCQkibW92CWExMiwgYTBcblx0IgorCQkicnNyCWExMywiIF9fc3RyaW5naWZ5KFNBUikgIlxuXHQiCisJCSJ4c3IJYTE0LCIgX19zdHJpbmdpZnkoUFMpICJcblx0IgorCQkibW92aQlhMCwgX3NwaWxsX3JlZ2lzdGVyc1xuXHQiCisJCSJyc3luY1xuXHQiCisJCSJjYWxseDAgYTBcblx0IgorCQkibW92CWEwLCBhMTJcblx0IgorCQkid3NyCWExMywiIF9fc3RyaW5naWZ5KFNBUikgIlxuXHQiCisJCSJ3c3IJYTE0LCIgX19zdHJpbmdpZnkoUFMpICJcblx0IgorCQk6OiAiYSIgKCZhMCksICJhIiAoJnBzKQorCQk6ICJhMiIsICJhMyIsICJhMTIiLCAiYTEzIiwgImExNCIsICJhMTUiLCAibWVtb3J5Iik7Cit9CisKKyNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKKworI2VuZGlmCS8qIF9YVEVOU0FfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtYml0cy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1iaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4MDU5MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtYml0cy5oCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1iaXRzLmgKKyAqCisgKiBDb3BpZWQgZnJvbSBTSC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1RFUk1CSVRTX0gKKyNkZWZpbmUgX1hURU5TQV9URVJNQklUU19ICisKKworI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhcgljY190OwordHlwZWRlZiB1bnNpZ25lZCBpbnQJc3BlZWRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CXRjZmxhZ190OworCisjZGVmaW5lIE5DQ1MgMTkKK3N0cnVjdCB0ZXJtaW9zIHsKKwl0Y2ZsYWdfdCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXRjZmxhZ190IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl0Y2ZsYWdfdCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCWNjX3QgY19saW5lOwkJCS8qIGxpbmUgZGlzY2lwbGluZSAqLworCWNjX3QgY19jY1tOQ0NTXTsJCS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworfTsKKworLyogY19jYyBjaGFyYWN0ZXJzICovCisKKyNkZWZpbmUgVklOVFIgMAorI2RlZmluZSBWUVVJVCAxCisjZGVmaW5lIFZFUkFTRSAyCisjZGVmaW5lIFZLSUxMIDMKKyNkZWZpbmUgVkVPRiA0CisjZGVmaW5lIFZUSU1FIDUKKyNkZWZpbmUgVk1JTiA2CisjZGVmaW5lIFZTV1RDIDcKKyNkZWZpbmUgVlNUQVJUIDgKKyNkZWZpbmUgVlNUT1AgOQorI2RlZmluZSBWU1VTUCAxMAorI2RlZmluZSBWRU9MIDExCisjZGVmaW5lIFZSRVBSSU5UIDEyCisjZGVmaW5lIFZESVNDQVJEIDEzCisjZGVmaW5lIFZXRVJBU0UgMTQKKyNkZWZpbmUgVkxORVhUIDE1CisjZGVmaW5lIFZFT0wyIDE2CisKKy8qIGNfaWZsYWcgYml0cyAqLworCisjZGVmaW5lIElHTkJSSwkwMDAwMDAxCisjZGVmaW5lIEJSS0lOVAkwMDAwMDAyCisjZGVmaW5lIElHTlBBUgkwMDAwMDA0CisjZGVmaW5lIFBBUk1SSwkwMDAwMDEwCisjZGVmaW5lIElOUENLCTAwMDAwMjAKKyNkZWZpbmUgSVNUUklQCTAwMDAwNDAKKyNkZWZpbmUgSU5MQ1IJMDAwMDEwMAorI2RlZmluZSBJR05DUgkwMDAwMjAwCisjZGVmaW5lIElDUk5MCTAwMDA0MDAKKyNkZWZpbmUgSVVDTEMJMDAwMTAwMAorI2RlZmluZSBJWE9OCTAwMDIwMDAKKyNkZWZpbmUgSVhBTlkJMDAwNDAwMAorI2RlZmluZSBJWE9GRgkwMDEwMDAwCisjZGVmaW5lIElNQVhCRUwJMDAyMDAwMAorI2RlZmluZSBJVVRGOAkwMDQwMDAwCisKKy8qIGNfb2ZsYWcgYml0cyAqLworCisjZGVmaW5lIE9QT1NUCTAwMDAwMDEKKyNkZWZpbmUgT0xDVUMJMDAwMDAwMgorI2RlZmluZSBPTkxDUgkwMDAwMDA0CisjZGVmaW5lIE9DUk5MCTAwMDAwMTAKKyNkZWZpbmUgT05PQ1IJMDAwMDAyMAorI2RlZmluZSBPTkxSRVQJMDAwMDA0MAorI2RlZmluZSBPRklMTAkwMDAwMTAwCisjZGVmaW5lIE9GREVMCTAwMDAyMDAKKyNkZWZpbmUgTkxETFkJMDAwMDQwMAorI2RlZmluZSAgIE5MMAkwMDAwMDAwCisjZGVmaW5lICAgTkwxCTAwMDA0MDAKKyNkZWZpbmUgQ1JETFkJMDAwMzAwMAorI2RlZmluZSAgIENSMAkwMDAwMDAwCisjZGVmaW5lICAgQ1IxCTAwMDEwMDAKKyNkZWZpbmUgICBDUjIJMDAwMjAwMAorI2RlZmluZSAgIENSMwkwMDAzMDAwCisjZGVmaW5lIFRBQkRMWQkwMDE0MDAwCisjZGVmaW5lICAgVEFCMAkwMDAwMDAwCisjZGVmaW5lICAgVEFCMQkwMDA0MDAwCisjZGVmaW5lICAgVEFCMgkwMDEwMDAwCisjZGVmaW5lICAgVEFCMwkwMDE0MDAwCisjZGVmaW5lICAgWFRBQlMJMDAxNDAwMAorI2RlZmluZSBCU0RMWQkwMDIwMDAwCisjZGVmaW5lICAgQlMwCTAwMDAwMDAKKyNkZWZpbmUgICBCUzEJMDAyMDAwMAorI2RlZmluZSBWVERMWQkwMDQwMDAwCisjZGVmaW5lICAgVlQwCTAwMDAwMDAKKyNkZWZpbmUgICBWVDEJMDA0MDAwMAorI2RlZmluZSBGRkRMWQkwMTAwMDAwCisjZGVmaW5lICAgRkYwCTAwMDAwMDAKKyNkZWZpbmUgICBGRjEJMDEwMDAwMAorCisvKiBjX2NmbGFnIGJpdCBtZWFuaW5nICovCisKKyNkZWZpbmUgQ0JBVUQJMDAxMDAxNworI2RlZmluZSAgQjAJMDAwMDAwMAkJLyogaGFuZyB1cCAqLworI2RlZmluZSAgQjUwCTAwMDAwMDEKKyNkZWZpbmUgIEI3NQkwMDAwMDAyCisjZGVmaW5lICBCMTEwCTAwMDAwMDMKKyNkZWZpbmUgIEIxMzQJMDAwMDAwNAorI2RlZmluZSAgQjE1MAkwMDAwMDA1CisjZGVmaW5lICBCMjAwCTAwMDAwMDYKKyNkZWZpbmUgIEIzMDAJMDAwMDAwNworI2RlZmluZSAgQjYwMAkwMDAwMDEwCisjZGVmaW5lICBCMTIwMAkwMDAwMDExCisjZGVmaW5lICBCMTgwMAkwMDAwMDEyCisjZGVmaW5lICBCMjQwMAkwMDAwMDEzCisjZGVmaW5lICBCNDgwMAkwMDAwMDE0CisjZGVmaW5lICBCOTYwMAkwMDAwMDE1CisjZGVmaW5lICBCMTkyMDAJMDAwMDAxNgorI2RlZmluZSAgQjM4NDAwCTAwMDAwMTcKKyNkZWZpbmUgRVhUQSBCMTkyMDAKKyNkZWZpbmUgRVhUQiBCMzg0MDAKKyNkZWZpbmUgQ1NJWkUJMDAwMDA2MAorI2RlZmluZSAgIENTNQkwMDAwMDAwCisjZGVmaW5lICAgQ1M2CTAwMDAwMjAKKyNkZWZpbmUgICBDUzcJMDAwMDA0MAorI2RlZmluZSAgIENTOAkwMDAwMDYwCisjZGVmaW5lIENTVE9QQgkwMDAwMTAwCisjZGVmaW5lIENSRUFECTAwMDAyMDAKKyNkZWZpbmUgUEFSRU5CCTAwMDA0MDAKKyNkZWZpbmUgUEFST0RECTAwMDEwMDAKKyNkZWZpbmUgSFVQQ0wJMDAwMjAwMAorI2RlZmluZSBDTE9DQUwJMDAwNDAwMAorI2RlZmluZSBDQkFVREVYIDAwMTAwMDAKKyNkZWZpbmUgICAgQjU3NjAwIDAwMTAwMDEKKyNkZWZpbmUgICBCMTE1MjAwIDAwMTAwMDIKKyNkZWZpbmUgICBCMjMwNDAwIDAwMTAwMDMKKyNkZWZpbmUgICBCNDYwODAwIDAwMTAwMDQKKyNkZWZpbmUgICBCNTAwMDAwIDAwMTAwMDUKKyNkZWZpbmUgICBCNTc2MDAwIDAwMTAwMDYKKyNkZWZpbmUgICBCOTIxNjAwIDAwMTAwMDcKKyNkZWZpbmUgIEIxMDAwMDAwIDAwMTAwMTAKKyNkZWZpbmUgIEIxMTUyMDAwIDAwMTAwMTEKKyNkZWZpbmUgIEIxNTAwMDAwIDAwMTAwMTIKKyNkZWZpbmUgIEIyMDAwMDAwIDAwMTAwMTMKKyNkZWZpbmUgIEIyNTAwMDAwIDAwMTAwMTQKKyNkZWZpbmUgIEIzMDAwMDAwIDAwMTAwMTUKKyNkZWZpbmUgIEIzNTAwMDAwIDAwMTAwMTYKKyNkZWZpbmUgIEI0MDAwMDAwIDAwMTAwMTcKKyNkZWZpbmUgQ0lCQVVECSAgMDAyMDAzNjAwMDAwCS8qIGlucHV0IGJhdWQgcmF0ZSAobm90IHVzZWQpICovCisjZGVmaW5lIENNU1BBUgkgIDAxMDAwMDAwMDAwMAkJLyogbWFyayBvciBzcGFjZSAoc3RpY2spIHBhcml0eSAqLworI2RlZmluZSBDUlRTQ1RTCSAgMDIwMDAwMDAwMDAwCQkvKiBmbG93IGNvbnRyb2wgKi8KKworLyogY19sZmxhZyBiaXRzICovCisKKyNkZWZpbmUgSVNJRwkwMDAwMDAxCisjZGVmaW5lIElDQU5PTgkwMDAwMDAyCisjZGVmaW5lIFhDQVNFCTAwMDAwMDQKKyNkZWZpbmUgRUNITwkwMDAwMDEwCisjZGVmaW5lIEVDSE9FCTAwMDAwMjAKKyNkZWZpbmUgRUNIT0sJMDAwMDA0MAorI2RlZmluZSBFQ0hPTkwJMDAwMDEwMAorI2RlZmluZSBOT0ZMU0gJMDAwMDIwMAorI2RlZmluZSBUT1NUT1AJMDAwMDQwMAorI2RlZmluZSBFQ0hPQ1RMCTAwMDEwMDAKKyNkZWZpbmUgRUNIT1BSVAkwMDAyMDAwCisjZGVmaW5lIEVDSE9LRQkwMDA0MDAwCisjZGVmaW5lIEZMVVNITwkwMDEwMDAwCisjZGVmaW5lIFBFTkRJTgkwMDQwMDAwCisjZGVmaW5lIElFWFRFTgkwMTAwMDAwCisKKy8qIHRjZmxvdygpIGFuZCBUQ1hPTkMgdXNlIHRoZXNlICovCisKKyNkZWZpbmUJVENPT0ZGCQkwCisjZGVmaW5lCVRDT09OCQkxCisjZGVmaW5lCVRDSU9GRgkJMgorI2RlZmluZQlUQ0lPTgkJMworCisvKiB0Y2ZsdXNoKCkgYW5kIFRDRkxTSCB1c2UgdGhlc2UgKi8KKworI2RlZmluZQlUQ0lGTFVTSAkwCisjZGVmaW5lCVRDT0ZMVVNICTEKKyNkZWZpbmUJVENJT0ZMVVNICTIKKworLyogdGNzZXRhdHRyIHVzZXMgdGhlc2UgKi8KKworI2RlZmluZQlUQ1NBTk9XCQkwCisjZGVmaW5lCVRDU0FEUkFJTgkxCisjZGVmaW5lCVRDU0FGTFVTSAkyCisKKyNlbmRpZgkvKiBfWFRFTlNBX1RFUk1CSVRTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90ZXJtaW9zLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzZhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdGVybWlvcy5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3Rlcm1pb3MuaAorICoKKyAqIENvcGllZCBmcm9tIFNILgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfVEVSTUlPU19ICisjZGVmaW5lIF9YVEVOU0FfVEVSTUlPU19ICisKKyNpbmNsdWRlIDxhc20vdGVybWJpdHMuaD4KKyNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CisKK3N0cnVjdCB3aW5zaXplIHsKKwl1bnNpZ25lZCBzaG9ydCB3c19yb3c7CisJdW5zaWduZWQgc2hvcnQgd3NfY29sOworCXVuc2lnbmVkIHNob3J0IHdzX3hwaXhlbDsKKwl1bnNpZ25lZCBzaG9ydCB3c195cGl4ZWw7Cit9OworCisjZGVmaW5lIE5DQyA4CitzdHJ1Y3QgdGVybWlvIHsKKwl1bnNpZ25lZCBzaG9ydCBjX2lmbGFnOwkJLyogaW5wdXQgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0IGNfb2ZsYWc7CQkvKiBvdXRwdXQgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0IGNfY2ZsYWc7CQkvKiBjb250cm9sIG1vZGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBjX2xmbGFnOwkJLyogbG9jYWwgbW9kZSBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIgY19saW5lOwkJLyogbGluZSBkaXNjaXBsaW5lICovCisJdW5zaWduZWQgY2hhciBjX2NjW05DQ107CS8qIGNvbnRyb2wgY2hhcmFjdGVycyAqLworfTsKKworLyogTW9kZW0gbGluZXMgKi8KKworI2RlZmluZSBUSU9DTV9MRQkweDAwMQorI2RlZmluZSBUSU9DTV9EVFIJMHgwMDIKKyNkZWZpbmUgVElPQ01fUlRTCTB4MDA0CisjZGVmaW5lIFRJT0NNX1NUCTB4MDA4CisjZGVmaW5lIFRJT0NNX1NSCTB4MDEwCisjZGVmaW5lIFRJT0NNX0NUUwkweDAyMAorI2RlZmluZSBUSU9DTV9DQVIJMHgwNDAKKyNkZWZpbmUgVElPQ01fUk5HCTB4MDgwCisjZGVmaW5lIFRJT0NNX0RTUgkweDEwMAorI2RlZmluZSBUSU9DTV9DRAlUSU9DTV9DQVIKKyNkZWZpbmUgVElPQ01fUkkJVElPQ01fUk5HCisjZGVmaW5lIFRJT0NNX09VVDEJMHgyMDAwCisjZGVmaW5lIFRJT0NNX09VVDIJMHg0MDAwCisjZGVmaW5lIFRJT0NNX0xPT1AJMHg4MDAwCisKKy8qIGlvY3RsIChmZCwgVElPQ1NFUkdFVExTUiwgJnJlc3VsdCkgd2hlcmUgcmVzdWx0IG1heSBiZSBhcyBiZWxvdyAqLworCisvKiBMaW5lIGRpc2NpcGxpbmVzICovCisKKyNkZWZpbmUgTl9UVFkJCTAKKyNkZWZpbmUgTl9TTElQCQkxCisjZGVmaW5lIE5fTU9VU0UJCTIKKyNkZWZpbmUgTl9QUFAJCTMKKyNkZWZpbmUgTl9TVFJJUAkJNAorI2RlZmluZSBOX0FYMjUJCTUKKyNkZWZpbmUgTl9YMjUJCTYJLyogWC4yNSBhc3luYyAqLworI2RlZmluZSBOXzZQQUNLCQk3CisjZGVmaW5lIE5fTUFTQwkJOAkvKiBSZXNlcnZlZCBmb3IgTW9iaXRleCBtb2R1bGUgPGthekBjYWZlLm5ldD4gKi8KKyNkZWZpbmUgTl9SMzk2NAkJOQkvKiBSZXNlcnZlZCBmb3IgU2ltYXRpYyBSMzk2NCBtb2R1bGUgKi8KKyNkZWZpbmUgTl9QUk9GSUJVU19GREwJMTAJLyogUmVzZXJ2ZWQgZm9yIFByb2ZpYnVzIDxEYXZlQG12aGkuY29tPiAqLworI2RlZmluZSBOX0lSREEJCTExCS8qIExpbnV4IElSIC0gaHR0cDovL2lyZGEuc291cmNlZm9yZ2UubmV0LyAqLworI2RlZmluZSBOX1NNU0JMT0NLCTEyCS8qIFNNUyBibG9jayBtb2RlIC0gZm9yIHRhbGtpbmcgdG8gR1NNIGRhdGEgY2FyZHMgYWJvdXQgU01TIG1lc3NhZ2VzICovCisjZGVmaW5lIE5fSERMQwkJMTMJLyogc3luY2hyb25vdXMgSERMQyAqLworI2RlZmluZSBOX1NZTkNfUFBQCTE0CisjZGVmaW5lIE5fSENJCQkxNSAgICAgIC8qIEJsdWV0b290aCBIQ0kgVUFSVCAqLworCisjaWZkZWYgX19LRVJORUxfXworCisvKglpbnRyPV5DCQlxdWl0PV5cCQllcmFzZT1kZWwJa2lsbD1eVQorCWVvZj1eRAkJdnRpbWU9XDAJdm1pbj1cMQkJc3h0Yz1cMAorCXN0YXJ0PV5RCXN0b3A9XlMJCXN1c3A9XloJCWVvbD1cMAorCXJlcHJpbnQ9XlIJZGlzY2FyZD1eVQl3ZXJhc2U9XlcJbG5leHQ9XlYKKwllb2wyPVwwCisqLworI2RlZmluZSBJTklUX0NfQ0MgIlwwMDNcMDM0XDE3N1wwMjVcMDA0XDBcMVwwXDAyMVwwMjNcMDMyXDBcMDIyXDAxN1wwMjdcMDI2XDAiCisKKy8qCisgKiBUcmFuc2xhdGUgYSAidGVybWlvIiBzdHJ1Y3R1cmUgaW50byBhICJ0ZXJtaW9zIi4gVWdoLgorICovCisKKyNkZWZpbmUgU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCB4KSB7IFwKKwl1bnNpZ25lZCBzaG9ydCBfX3RtcDsgXAorCWdldF91c2VyKF9fdG1wLCYodGVybWlvKS0+eCk7IFwKKwkqKHVuc2lnbmVkIHNob3J0ICopICYodGVybWlvcyktPnggPSBfX3RtcDsgXAorfQorCisjZGVmaW5lIHVzZXJfdGVybWlvX3RvX2tlcm5lbF90ZXJtaW9zKHRlcm1pb3MsIHRlcm1pbykgXAorKHsgXAorCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19pZmxhZyk7IFwKKwlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfb2ZsYWcpOyBcCisJU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX2NmbGFnKTsgXAorCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19sZmxhZyk7IFwKKwljb3B5X2Zyb21fdXNlcigodGVybWlvcyktPmNfY2MsICh0ZXJtaW8pLT5jX2NjLCBOQ0MpOyBcCit9KQorCisvKgorICogVHJhbnNsYXRlIGEgInRlcm1pb3MiIHN0cnVjdHVyZSBpbnRvIGEgInRlcm1pbyIuIFVnaC4KKyAqLworCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvKHRlcm1pbywgdGVybWlvcykgXAorKHsgXAorCXB1dF91c2VyKCh0ZXJtaW9zKS0+Y19pZmxhZywgJih0ZXJtaW8pLT5jX2lmbGFnKTsgXAorCXB1dF91c2VyKCh0ZXJtaW9zKS0+Y19vZmxhZywgJih0ZXJtaW8pLT5jX29mbGFnKTsgXAorCXB1dF91c2VyKCh0ZXJtaW9zKS0+Y19jZmxhZywgJih0ZXJtaW8pLT5jX2NmbGFnKTsgXAorCXB1dF91c2VyKCh0ZXJtaW9zKS0+Y19sZmxhZywgJih0ZXJtaW8pLT5jX2xmbGFnKTsgXAorCXB1dF91c2VyKCh0ZXJtaW9zKS0+Y19saW5lLCAgJih0ZXJtaW8pLT5jX2xpbmUpOyBcCisJY29weV90b191c2VyKCh0ZXJtaW8pLT5jX2NjLCAodGVybWlvcyktPmNfY2MsIE5DQyk7IFwKK30pCisKKyNkZWZpbmUgdXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKGssIHUpIGNvcHlfZnJvbV91c2VyKGssIHUsIHNpemVvZihzdHJ1Y3QgdGVybWlvcykpCisjZGVmaW5lIGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcyh1LCBrKSBjb3B5X3RvX3VzZXIodSwgaywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW9zKSkKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9YVEVOU0FfVEVSTUlPU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90aHJlYWRfaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjA4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdGhyZWFkX2luZm8uaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS90aHJlYWRfaW5mby5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9USFJFQURfSU5GT19ICisjZGVmaW5lIF9YVEVOU0FfVEhSRUFEX0lORk9fSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworIyBpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjZW5kaWYKKworLyoKKyAqIGxvdyBsZXZlbCB0YXNrIGRhdGEgdGhhdCBlbnRyeS5TIG5lZWRzIGltbWVkaWF0ZSBhY2Nlc3MgdG8KKyAqIC0gdGhpcyBzdHJ1Y3Qgc2hvdWxkIGZpdCBlbnRpcmVseSBpbnNpZGUgb2Ygb25lIGNhY2hlIGxpbmUKKyAqIC0gdGhpcyBzdHJ1Y3Qgc2hhcmVzIHRoZSBzdXBlcnZpc29yIHN0YWNrIHBhZ2VzCisgKiAtIGlmIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cnVjdHVyZSBhcmUgY2hhbmdlZCwgdGhlIGFzc2VtYmx5IGNvbnN0YW50cworICogICBtdXN0IGFsc28gYmUgY2hhbmdlZAorICovCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCB0aHJlYWRfaW5mbyB7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLworCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KKwl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLworCXVuc2lnbmVkIGxvbmcJCXN0YXR1czsJCS8qIHRocmVhZC1zeW5jaHJvbm91cyBmbGFncyAqLworCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KKwlfX3MzMgkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsPCAwID0+IEJVRyovCisKKwltbV9zZWdtZW50X3QJCWFkZHJfbGltaXQ7CS8qIHRocmVhZCBhZGRyZXNzIHNwYWNlICovCisJc3RydWN0IHJlc3RhcnRfYmxvY2sgICAgcmVzdGFydF9ibG9jazsKKworCit9OworCisjZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCisKKy8qIG9mZnNldHMgaW50byB0aGUgdGhyZWFkX2luZm8gc3RydWN0IGZvciBhc3NlbWJseSBjb2RlIGFjY2VzcyAqLworI2RlZmluZSBUSV9UQVNLCQkgMHgwMDAwMDAwMAorI2RlZmluZSBUSV9FWEVDX0RPTUFJTgkgMHgwMDAwMDAwNAorI2RlZmluZSBUSV9GTEFHUwkgMHgwMDAwMDAwOAorI2RlZmluZSBUSV9TVEFUVVMJIDB4MDAwMDAwMEMKKyNkZWZpbmUgVElfQ1BVCQkgMHgwMDAwMDAxMAorI2RlZmluZSBUSV9QUkVfQ09VTlQJIDB4MDAwMDAwMTQKKyNkZWZpbmUgVElfQUREUl9MSU1JVAkgMHgwMDAwMDAxOAorI2RlZmluZSBUSV9SRVNUQVJUX0JMT0NLIDB4MDAwMDAxQworCisjZW5kaWYKKworI2RlZmluZSBQUkVFTVBUX0FDVElWRQkJMHgxMDAwMDAwMAorCisvKgorICogbWFjcm9zL2Z1bmN0aW9ucyBmb3IgZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAqCisgKiBwcmVlbXB0X2NvdW50IG5lZWRzIHRvIGJlIDEgaW5pdGlhbGx5LCB1bnRpbCB0aGUgc2NoZWR1bGVyIGlzIGZ1bmN0aW9uYWwuCisgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCit7CQkJCQkJXAorCS50YXNrCQk9ICZ0c2ssCQkJXAorCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCisJLmZsYWdzCQk9IDAsCQkJXAorCS5jcHUJCT0gMCwJCQlcCisJLnByZWVtcHRfY291bnQJPSAxLAkJCVwKKwkuYWRkcl9saW1pdAk9IEtFUk5FTF9EUywJCVwKKwkucmVzdGFydF9ibG9jayA9IHsJCQlcCisJCS5mbiA9IGRvX25vX3Jlc3RhcnRfc3lzY2FsbCwJXAorCX0sCQkJCQlcCit9CisKKyNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCisjZGVmaW5lIGluaXRfc3RhY2sJCShpbml0X3RocmVhZF91bmlvbi5zdGFjaykKKworLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEMgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZF9pbmZvKHZvaWQpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aTsKKwkgX19hc21fXygiZXh0dWkgJTAsYTEsMCwxM1xuXHQiCisJICAgICAgICAgInhvciAlMCwgYTEsICUwIiA6ICI9JnIiICh0aSkgOiApOworCXJldHVybiB0aTsKK30KKworLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCisjZGVmaW5lIGZyZWVfdGhyZWFkX2luZm8odGkpIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpICh0aSksIDEpCisjZGVmaW5lIGdldF90aHJlYWRfaW5mbyh0aSkgZ2V0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCisjZGVmaW5lIHB1dF90aHJlYWRfaW5mbyh0aSkgcHV0X3Rhc2tfc3RydWN0KCh0aSktPnRhc2spCisKKyNlbHNlIC8qICFfX0FTU0VNQkxZX18gKi8KKworLyogaG93IHRvIGdldCB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdCBmcm9tIEFTTSAqLworI2RlZmluZSBHRVRfVEhSRUFEX0lORk8ocmVnLHNwKSBcCisJZXh0dWkgcmVnLCBzcCwgMCwgMTM7IFwKKwl4b3IgICByZWcsIHNwLCByZWcKKyNlbmRpZgorCisKKy8qCisgKiB0aHJlYWQgaW5mb3JtYXRpb24gZmxhZ3MKKyAqIC0gdGhlc2UgYXJlIHByb2Nlc3Mgc3RhdGUgZmxhZ3MgdGhhdCB2YXJpb3VzIGFzc2VtYmx5IGZpbGVzIG1heSBuZWVkIHRvIGFjY2VzcworICogLSBwZW5kaW5nIHdvcmstdG8tYmUtZG9uZSBmbGFncyBhcmUgaW4gTFNXCisgKiAtIG90aGVyIGZsYWdzIGluIE1TVworICovCisjZGVmaW5lIFRJRl9TWVNDQUxMX1RSQUNFCTAJLyogc3lzY2FsbCB0cmFjZSBhY3RpdmUgKi8KKyNkZWZpbmUgVElGX05PVElGWV9SRVNVTUUJMQkvKiByZXN1bXB0aW9uIG5vdGlmaWNhdGlvbiByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgVElGX1NJR1BFTkRJTkcJCTIJLyogc2lnbmFsIHBlbmRpbmcgKi8KKyNkZWZpbmUgVElGX05FRURfUkVTQ0hFRAkzCS8qIHJlc2NoZWR1bGluZyBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgVElGX1NJTkdMRVNURVAJCTQJLyogcmVzdG9yZSBzaW5nbGVzdGVwIG9uIHJldHVybiB0byB1c2VyIG1vZGUgKi8KKyNkZWZpbmUgVElGX0lSRVQJCTUJLyogcmV0dXJuIHdpdGggaXJldCAqLworI2RlZmluZSBUSUZfTUVNRElFCQk2CisjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNgkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLworCisjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCisjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCisjZGVmaW5lIF9USUZfU0lHUEVORElORwkJKDE8PFRJRl9TSUdQRU5ESU5HKQorI2RlZmluZSBfVElGX05FRURfUkVTQ0hFRAkoMTw8VElGX05FRURfUkVTQ0hFRCkKKyNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQCQkoMTw8VElGX1NJTkdMRVNURVApCisjZGVmaW5lIF9USUZfSVJFVAkJKDE8PFRJRl9JUkVUKQorI2RlZmluZSBfVElGX1BPTExJTkdfTlJGTEFHCSgxPDxUSUZfUE9MTElOR19OUkZMQUcpCisKKyNkZWZpbmUgX1RJRl9XT1JLX01BU0sJCTB4MDAwMEZGRkUJLyogd29yayB0byBkbyBvbiBpbnRlcnJ1cHQvZXhjZXB0aW9uIHJldHVybiAqLworI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSwkweDAwMDBGRkZGCS8qIHdvcmsgdG8gZG8gb24gYW55IHJldHVybiB0byB1LXNwYWNlICovCisKKy8qCisgKiBUaHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLgorICoKKyAqIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZsYWdzIGluIHRoYXQgbm9ib2R5IGVsc2UKKyAqIGV2ZXIgdG91Y2hlcyBvdXIgdGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cywgc28gd2UgZG9uJ3QKKyAqIGhhdmUgdG8gd29ycnkgYWJvdXQgYXRvbWljIGFjY2Vzc2VzLgorICovCisjZGVmaW5lIFRTX1VTRURGUFUJCTB4MDAwMQkvKiBGUFUgd2FzIHVzZWQgYnkgdGhpcyB0YXNrIHRoaXMgcXVhbnR1bSAoU01QKSAqLworCisjZGVmaW5lIFRIUkVBRF9TSVpFIDgxOTIJLy8oMipQQUdFX1NJWkUpCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX1hURU5TQV9USFJFQURfSU5GTyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3RpbWV4LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdGltZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTRhMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3RpbWV4LmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS90aW1leC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9USU1FWF9ICisjZGVmaW5lIF9YVEVOU0FfVElNRVhfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjaWYgWENIQUxfSU5UX0xFVkVMKFhDSEFMX1RJTUVSMF9JTlRFUlJVUFQpID09IDEKKyMgZGVmaW5lIExJTlVYX1RJTUVSICAgICAwCisjZWxpZiBYQ0hBTF9JTlRfTEVWRUwoWENIQUxfVElNRVIxX0lOVEVSUlVQVCkgPT0gMQorIyBkZWZpbmUgTElOVVhfVElNRVIgICAgIDEKKyNlbGlmIFhDSEFMX0lOVF9MRVZFTChYQ0hBTF9USU1FUjJfSU5URVJSVVBUKSA9PSAxCisjIGRlZmluZSBMSU5VWF9USU1FUiAgICAgMgorI2Vsc2UKKyMgZXJyb3IgIkJhZCB0aW1lciBudW1iZXIgZm9yIExpbnV4IGNvbmZpZ3VyYXRpb25zISIKKyNlbmRpZgorCisjZGVmaW5lIExJTlVYX1RJTUVSX0lOVCAgICAgICAgIFhDSEFMX1RJTUVSX0lOVEVSUlVQVChMSU5VWF9USU1FUikKKyNkZWZpbmUgTElOVVhfVElNRVJfTUFTSyAgICAgICAgKDFMIDw8IExJTlVYX1RJTUVSX0lOVCkKKworI2RlZmluZSBDTE9DS19USUNLX1JBVEUgCTExOTMxODAJLyogKGV2ZXJ5b25lIGlzIHVzaW5nIHRoaXMgdmFsdWUpICovCisjZGVmaW5lIENMT0NLX1RJQ0tfRkFDVE9SICAgICAgIDIwIC8qIEZhY3RvciBvZiBib3RoIDEwXjYgYW5kIENMT0NLX1RJQ0tfUkFURSAqLworI2RlZmluZSBGSU5FVFVORSAoKCgoKChsb25nKUxBVENIICogSFogLSBDTE9DS19USUNLX1JBVEUpIDw8IFNISUZUX0haKSAqIFwKKwkoMTAwMDAwMC9DTE9DS19USUNLX0ZBQ1RPUikgLyAoQ0xPQ0tfVElDS19SQVRFL0NMT0NLX1RJQ0tfRkFDVE9SKSkgXAorCQk8PCAoU0hJRlRfU0NBTEUtU0hJRlRfSFopKSAvIEhaKQorCisjaWZkZWYgQ09ORklHX1hURU5TQV9DQUxJQlJBVEVfQ0NPVU5UCitleHRlcm4gdW5zaWduZWQgbG9uZyBjY291bnRfcGVyX2ppZmZ5OworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY2NvdW50X25zZWM7CisjZGVmaW5lIENDT1VOVF9QRVJfSklGRlkgY2NvdW50X3Blcl9qaWZmeQorI2RlZmluZSBDQ09VTlRfTlNFQyBjY291bnRfbnNlYworI2Vsc2UKKyNkZWZpbmUgQ0NPVU5UX1BFUl9KSUZGWSAoQ09ORklHX1hURU5TQV9DUFVfQ0xPQ0sqKDEwMDAwMDBVTC9IWikpCisjZGVmaW5lIENDT1VOVF9OU0VDICgxMDAwMDAwMDAwVUwgLyBDT05GSUdfWFRFTlNBX0NQVV9DTE9DSykKKyNlbmRpZgorCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc190OworCisvKgorICogT25seSB1c2VkIGZvciBTTVAuCisgKi8KKworZXh0ZXJuIGN5Y2xlc190IGNhY2hlZmx1c2hfdGltZTsKKworI2RlZmluZSBnZXRfY3ljbGVzKCkJKDApCisKKworLyoKKyAqIFJlZ2lzdGVyIGFjY2Vzcy4KKyAqLworCisjZGVmaW5lIFdTUl9DQ09VTlQocikJICBfX2FzbV9fKCJ3c3IgJTAsIl9fc3RyaW5naWZ5KENDT1VOVCkgOjogImEiIChyKSkKKyNkZWZpbmUgUlNSX0NDT1VOVChyKQkgIF9fYXNtX18oInJzciAlMCwiX19zdHJpbmdpZnkoQ0NPVU5UKSA6ICI9YSIgKHIpKQorI2RlZmluZSBXU1JfQ0NPTVBBUkUoeCxyKSBfX2FzbV9fKCJ3c3IgJTAsIl9fc3RyaW5naWZ5KENDT01QQVJFXzApIisiX19zdHJpbmdpZnkoeCkgOjogImEiKHIpKQorI2RlZmluZSBSU1JfQ0NPTVBBUkUoeCxyKSBfX2FzbV9fKCJyc3IgJTAsIl9fc3RyaW5naWZ5KENDT01QQVJFXzApIisiX19zdHJpbmdpZnkoeCkgOiAiPWEiKHIpKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2Njb3VudCAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNjb3VudDsKKwlSU1JfQ0NPVU5UKGNjb3VudCk7CisJcmV0dXJuIGNjb3VudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jY291bnQgKHVuc2lnbmVkIGxvbmcgY2NvdW50KQoreworCVdTUl9DQ09VTlQoY2NvdW50KTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9saW51eF90aW1lciAodm9pZCkKK3sKKwl1bnNpZ25lZCBjY29tcGFyZTsKKwlSU1JfQ0NPTVBBUkUoTElOVVhfVElNRVIsIGNjb21wYXJlKTsKKwlyZXR1cm4gY2NvbXBhcmU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGludXhfdGltZXIgKHVuc2lnbmVkIGxvbmcgY2NvbXBhcmUpCit7CisJV1NSX0NDT01QQVJFKExJTlVYX1RJTUVSLCBjY29tcGFyZSk7Cit9CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX1hURU5TQV9USU1FWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGxiLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdGxiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2MmIyZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGIuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3RsYi5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9UTEJfSAorI2RlZmluZSBfWFRFTlNBX1RMQl9ICisKKyNkZWZpbmUgdGxiX3N0YXJ0X3ZtYSh0bGIsdm1hKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdGxiX2VuZF92bWEodGxiLHZtYSkJCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIF9fdGxiX3JlbW92ZV90bGJfZW50cnkodGxiLHB0ZSxhZGRyKQlkbyB7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdGxiX2ZsdXNoKHRsYikJCQkJZmx1c2hfdGxiX21tKCh0bGIpLT5tbSkKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNkZWZpbmUgX19wdGVfZnJlZV90bGIodGxiLHB0ZSkJCQlwdGVfZnJlZShwdGUpCisKKyNlbmRpZgkvKiBfWFRFTlNBX1RMQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmZlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdGxiZmx1c2guaApAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS90bGJmbHVzaC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9UTEJGTFVTSF9ICisjZGVmaW5lIF9YVEVOU0FfVExCRkxVU0hfSAorCisjZGVmaW5lIERFQlVHX1RMQgorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisvKiBUTEIgZmx1c2hpbmc6CisgKgorICogIC0gZmx1c2hfdGxiX2FsbCgpIGZsdXNoZXMgYWxsIHByb2Nlc3NlcyBUTEIgZW50cmllcworICogIC0gZmx1c2hfdGxiX21tKG1tKSBmbHVzaGVzIHRoZSBzcGVjaWZpZWQgbW0gY29udGV4dCBUTEIgZW50cmllcworICogIC0gZmx1c2hfdGxiX3BhZ2UobW0sIHZtYWRkcikgZmx1c2hlcyBhIHNpbmdsZSBwYWdlCisgKiAgLSBmbHVzaF90bGJfcmFuZ2UobW0sIHN0YXJ0LCBlbmQpIGZsdXNoZXMgYSByYW5nZSBvZiBwYWdlcworICovCisKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCopOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0Kix1bnNpZ25lZCBsb25nKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QqLHVuc2lnbmVkIGxvbmcsdW5zaWduZWQgbG9uZyk7CisKKyNkZWZpbmUgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCxlbmQpIGZsdXNoX3RsYl9hbGwoKQorCisKKy8qIFRoaXMgaXMgY2FsbGQgaW4gbXVubWFwIHdoZW4gd2UgaGF2ZSBmcmVlZCB1cCBzb21lIHBhZ2UtdGFibGUgcGFnZXMuCisgKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUsIHRoZXJlJ3Mgbm90aGluZyBzcGVjaWFsIGFib3V0IG91cgorICogcGFnZS10YWJsZSBwYWdlcy4KKyAqLworCitleHRlcm4gaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BndGFibGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKK30KKworLyogVExCIG9wZXJhdGlvbnMuICovCisKKyNkZWZpbmUgSVRMQl9XQVlTX0xPRzIgICAgICBYQ0hBTF9JVExCX1dBWV9CSVRTCisjZGVmaW5lIERUTEJfV0FZU19MT0cyICAgICAgWENIQUxfRFRMQl9XQVlfQklUUworI2RlZmluZSBJVExCX1BST0JFX1NVQ0NFU1MgICgxIDw8IElUTEJfV0FZU19MT0cyKQorI2RlZmluZSBEVExCX1BST0JFX1NVQ0NFU1MgICgxIDw8IERUTEJfV0FZU19MT0cyKQorCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgaXRsYl9wcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInBpdGxiICAlMCwgJTFcblx0IiA6ICI9YSIgKHRtcCkgOiAiYSIgKGFkZHIpKTsKKwlyZXR1cm4gdG1wOworfQorCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgZHRsYl9wcm9iZSh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInBkdGxiICAlMCwgJTFcblx0IiA6ICI9YSIgKHRtcCkgOiAiYSIgKGFkZHIpKTsKKwlyZXR1cm4gdG1wOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9pdGxiX2VudHJ5ICh1bnNpZ25lZCBsb25nIHByb2JlKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJpaXRsYiAgJTA7IGlzeW5jXG5cdCIgOiA6ICJhIiAocHJvYmUpKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIGludmFsaWRhdGVfZHRsYl9lbnRyeSAodW5zaWduZWQgbG9uZyBwcm9iZSkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaWR0bGIgICUwOyBkc3luY1xuXHQiIDogOiAiYSIgKHByb2JlKSk7Cit9CisKKy8qIFVzZSB0aGUgLi5fbm9faXN5bmMgZnVuY3Rpb25zIHdpdGggY2F1dGlvbi4gIEdlbmVyYWxseSwgdGhlc2UgYXJlCisgKiBoYW5keSBmb3IgYnVsayBpbnZhbGlkYXRlcyBmb2xsb3dlZCBieSBhIHNpbmdsZSAnaXN5bmMnLiAgVGhlCisgKiBjYWxsZXIgbXVzdCBmb2xsb3cgdXAgd2l0aCBhbiAnaXN5bmMnLCB3aGljaCBjYW4gYmUgcmVsYXRpdmVseQorICogZXhwZW5zaXZlIG9uIHNvbWUgWHRlbnNhIGltcGxlbWVudGF0aW9ucy4KKyAqLworZXh0ZXJuIGlubGluZSB2b2lkIGludmFsaWRhdGVfaXRsYl9lbnRyeV9ub19pc3luYyAodW5zaWduZWQgZW50cnkpCit7CisJLyogQ2FsbGVyIG11c3QgZm9sbG93IHVwIHdpdGggJ2lzeW5jJy4gKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlpdGxiICAlMFxuIiA6IDogImEiIChlbnRyeSkgKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIGludmFsaWRhdGVfZHRsYl9lbnRyeV9ub19pc3luYyAodW5zaWduZWQgZW50cnkpCit7CisJLyogQ2FsbGVyIG11c3QgZm9sbG93IHVwIHdpdGggJ2lzeW5jJy4gKi8KKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoImlkdGxiICAlMFxuIiA6IDogImEiIChlbnRyeSkgKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHNldF9pdGxiY2ZnX3JlZ2lzdGVyICh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygid3NyICAlMCwgIl9fc3RyaW5naWZ5KElUTEJDRkcpIlxuXHQiICJpc3luY1xuXHQiCisJCQkgICAgIDogOiAiYSIgKHZhbCkpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgc2V0X2R0bGJjZmdfcmVnaXN0ZXIgKHVuc2lnbmVkIGxvbmcgdmFsKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3c3IgICUwLCAiX19zdHJpbmdpZnkoRFRMQkNGRykiOyBkc3luY1xuXHQiCisJICAgIAkJICAgICA6IDogImEiICh2YWwpKTsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHNldF9wdGV2YWRkcl9yZWdpc3RlciAodW5zaWduZWQgbG9uZyB2YWwpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiB3c3IgICUwLCAiX19zdHJpbmdpZnkoUFRFVkFERFIpIjsgaXN5bmNcbiIKKwkJCSAgICAgOiA6ICJhIiAodmFsKSk7Cit9CisKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX3B0ZXZhZGRyX3JlZ2lzdGVyICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJyc3IgICUwLCAiX19zdHJpbmdpZnkoUFRFVkFERFIpIlxuXHQiIDogIj1hIiAodG1wKSk7CisJcmV0dXJuIHRtcDsKK30KKworZXh0ZXJuIGlubGluZSB2b2lkIHdyaXRlX2R0bGJfZW50cnkgKHB0ZV90IGVudHJ5LCBpbnQgd2F5KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fKCJ3ZHRsYiAgJTEsICUwOyBkc3luY1xuXHQiCisJCQkgICAgIDogOiAiciIgKHdheSksICJyIiAoZW50cnkpICk7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCB3cml0ZV9pdGxiX2VudHJ5IChwdGVfdCBlbnRyeSwgaW50IHdheSkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygid2l0bGIgICUxLCAlMDsgaXN5bmNcblx0IgorCSAgICAgICAgICAgICAgICAgICAgIDogOiAiciIgKHdheSksICJyIiAoZW50cnkpICk7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX3BhZ2VfZGlyZWN0b3J5ICh2b2lkKQoreworCWludmFsaWRhdGVfZHRsYl9lbnRyeSAoRFRMQl9XQVlfUEdUQUJMRSk7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlX2l0bGJfbWFwcGluZyAodW5zaWduZWQgYWRkcmVzcykKK3sKKwl1bnNpZ25lZCBsb25nIHRsYl9lbnRyeTsKKwl3aGlsZSAoKHRsYl9lbnRyeSA9IGl0bGJfcHJvYmUgKGFkZHJlc3MpKSAmIElUTEJfUFJPQkVfU1VDQ0VTUykKKwkJaW52YWxpZGF0ZV9pdGxiX2VudHJ5ICh0bGJfZW50cnkpOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgaW52YWxpZGF0ZV9kdGxiX21hcHBpbmcgKHVuc2lnbmVkIGFkZHJlc3MpCit7CisJdW5zaWduZWQgbG9uZyB0bGJfZW50cnk7CisJd2hpbGUgKCh0bGJfZW50cnkgPSBkdGxiX3Byb2JlIChhZGRyZXNzKSkgJiBEVExCX1BST0JFX1NVQ0NFU1MpCisJCWludmFsaWRhdGVfZHRsYl9lbnRyeSAodGxiX2VudHJ5KTsKK30KKworI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQlkbyB7IH0gd2hpbGUgKDApCisKKworI2lmZGVmIERFQlVHX1RMQgorCisvKiBETyBOT1QgVVNFIFRIRVNFIEZVTkNUSU9OUy4gIFRoZXNlIGluc3RydWN0aW9ucyBhcmVuJ3QgcGFydCBvZiB0aGUgWHRlbnNhCisgKiBJU0EgYW5kIGV4aXN0IG9ubHkgZm9yIHRlc3QgcHVycG9zZXMuLgorICogWW91IG1heSBmaW5kIGl0IGhlbHBmdWwgZm9yIE1NVSBkZWJ1Z2dpbmcsIGhvd2V2ZXIuCisgKgorICogJ2F0JyBpcyB0aGUgdW5tb2RpZmllZCBpbnB1dCByZWdpc3RlcgorICogJ2FzJyBpcyB0aGUgb3V0cHV0IHJlZ2lzdGVyLCBhcyBmb2xsb3dzIChzcGVjaWZpYyB0byB0aGUgTGludXggY29uZmlnKToKKyAqCisgKiAgICAgIGFzWzMxLi4xMl0gY29udGFpbiB0aGUgdmlydHVhbCBhZGRyZXNzCisgKiAgICAgIGFzWzExLi4wOF0gYXJlIG1lYW5pbmdsZXNzCisgKiAgICAgIGFzWzA3Li4wMF0gY29udGFpbiB0aGUgYXNpZAorICovCisKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2R0bGJfdmlydHVhbCAoaW50IHdheSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicmR0bGIwICAlMCwgJTFcblx0IiA6ICI9YSIgKHRtcCksICIrYSIgKHdheSkpOworCXJldHVybiB0bXA7Cit9CisKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWFkX2R0bGJfdHJhbnNsYXRpb24gKGludCB3YXkpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJkdGxiMSAgJTAsICUxXG5cdCIgOiAiPWEiICh0bXApLCAiK2EiICh3YXkpKTsKKwlyZXR1cm4gdG1wOworfQorCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9pdGxiX3ZpcnR1YWwgKGludCB3YXkpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInJpdGxiMCAgJTAsICUxXG5cdCIgOiAiPWEiICh0bXApLCAiK2EiICh3YXkpKTsKKwlyZXR1cm4gdG1wOworfQorCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF9pdGxiX3RyYW5zbGF0aW9uIChpbnQgd2F5KQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCV9fYXNtX18gX192b2xhdGlsZV9fKCJyaXRsYjEgICUwLCAlMVxuXHQiIDogIj1hIiAodG1wKSwgIithIiAod2F5KSk7CisJcmV0dXJuIHRtcDsKK30KKworI2VuZGlmCS8qIERFQlVHX1RMQiAqLworCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisjZW5kaWYJLyogX1hURU5TQV9QR0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3RvcG9sb2d5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwOWUzOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90b3BvbG9neS5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvdG9wb2xvZ3kuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfVE9QT0xPR1lfSAorI2RlZmluZSBfWFRFTlNBX1RPUE9MT0dZX0gKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3RvcG9sb2d5Lmg+CisKKyNlbmRpZgkvKiBfWFRFTlNBX1RPUE9MT0dZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS90eXBlcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhYzAwNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS90eXBlcy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvdHlwZXMuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfVFlQRVNfSAorI2RlZmluZSBfWFRFTlNBX1RZUEVTX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bW9kZV90OworCisvKgorICogX194eCBpcyBvazogaXQgZG9lc24ndCBwb2xsdXRlIHRoZSBQT1NJWCBuYW1lc3BhY2UuIFVzZSB0aGVzZSBpbiB0aGUKKyAqIGhlYWRlciBmaWxlcyBleHBvcnRlZCB0byB1c2VyIHNwYWNlCisgKi8KKwordHlwZWRlZiBfX3NpZ25lZF9fIGNoYXIgX19zODsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBfX3U4OworCit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgX19zMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fdTE2OworCit0eXBlZGVmIF9fc2lnbmVkX18gaW50IF9fczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgX191MzI7CisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pCit0eXBlZGVmIF9fc2lnbmVkX18gbG9uZyBsb25nIF9fczY0OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX191NjQ7CisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZW4ndCBleHBvcnRlZCBvdXRzaWRlIHRoZSBrZXJuZWwgdG8gYXZvaWQgbmFtZSBzcGFjZSBjbGFzaGVzCisgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisKK3R5cGVkZWYgX19zaWduZWRfXyBjaGFyIHM4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHU4OworCit0eXBlZGVmIF9fc2lnbmVkX18gc2hvcnQgczE2OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1MTY7CisKK3R5cGVkZWYgX19zaWduZWRfXyBpbnQgczMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCit0eXBlZGVmIF9fc2lnbmVkX18gbG9uZyBsb25nIHM2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKKworCisjZGVmaW5lIEJJVFNfUEVSX0xPTkcgMzIKKworLyogRG1hIGFkZHJlc3NlcyBhcmUgMzItYml0cyB3aWRlLiAgKi8KKwordHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQga21lbV9idWZjdGxfdDsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgorCisjZW5kaWYJLyogX1hURU5TQV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU3NmIyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaApAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmgKKyAqCisgKiBVc2VyIHNwYWNlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zCisgKgorICogVGhlc2Ugcm91dGluZXMgcHJvdmlkZSBiYXNpYyBhY2Nlc3NpbmcgZnVuY3Rpb25zIHRvIHRoZSB1c2VyIG1lbW9yeQorICogc3BhY2UgZm9yIHRoZSBrZXJuZWwuIFRoaXMgaGVhZGVyIGZpbGUgcHJvdmlkZXMgZnVjdGlvbnMgc3VjaCBhczoKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgLSAyMDA1IFRlbnNpbGljYSBJbmMuCisgKi8KKworI2lmbmRlZiBfWFRFTlNBX1VBQ0NFU1NfSAorI2RlZmluZSBfWFRFTlNBX1VBQ0NFU1NfSAorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2RlZmluZSBWRVJJRllfUkVBRCAgICAwCisjZGVmaW5lIFZFUklGWV9XUklURSAgIDEKKworI2lmZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIF9BU01MQU5HVUFHRQorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL29mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBUaGVzZSBhc3NlbWJseSBtYWNyb3MgbWlycm9yIHRoZSBDIG1hY3JvcyB0aGF0IGZvbGxvdyBiZWxvdy4gIFRoZXkKKyAqIHNob3VsZCBhbHdheXMgaGF2ZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eS4gIFNlZQorICogYXJjaC94dGVuc2Eva2VybmVsL3N5cy5TIGZvciB1c2FnZS4KKyAqLworCisjZGVmaW5lIEtFUk5FTF9EUwkwCisjZGVmaW5lIFVTRVJfRFMJCTEKKworI2RlZmluZSBnZXRfZHMJCShLRVJORUxfRFMpCisKKy8qCisgKiBnZXRfZnMgcmVhZHMgY3VycmVudC0+dGhyZWFkLmN1cnJlbnRfZHMgaW50byBhIHJlZ2lzdGVyLgorICogT24gRW50cnk6CisgKiAJPGFkPglhbnl0aGluZworICogCTxzcD4Jc3RhY2sKKyAqIE9uIEV4aXQ6CisgKiAJPGFkPgljb250YWlucyBjdXJyZW50LT50aHJlYWQuY3VycmVudF9kcworICovCisJLm1hY3JvCWdldF9mcwlhZCwgc3AKKwlHRVRfQ1VSUkVOVChcYWQsXHNwKQorCWwzMmkJXGFkLCBcYWQsIFRIUkVBRF9DVVJSRU5UX0RTCisJLmVuZG0KKworLyoKKyAqIHNldF9mcyBzZXRzIGN1cnJlbnQtPnRocmVhZC5jdXJyZW50X2RzIHRvIHNvbWUgdmFsdWUuCisgKiBPbiBFbnRyeToKKyAqCTxhdD4JYW55dGhpbmcgKHRlbXAgcmVnaXN0ZXIpCisgKgk8YXY+CXZhbHVlIHRvIHdyaXRlCisgKgk8c3A+CXN0YWNrCisgKiBPbiBFeGl0OgorICoJPGF0PglkZXN0cm95ZWQgKGFjdHVhbGx5LCBjdXJyZW50KQorICoJPGF2PglwcmVzZXJ2ZWQsIHZhbHVlIHRvIHdyaXRlCisgKi8KKwkubWFjcm8Jc2V0X2ZzCWF0LCBhdiwgc3AKKwlHRVRfQ1VSUkVOVChcYXQsXHNwKQorCXMzMmkJXGF2LCBcYXQsIFRIUkVBRF9DVVJSRU5UX0RTCisJLmVuZG0KKworLyoKKyAqIGtlcm5lbF9vayBkZXRlcm1pbmVzIHdoZXRoZXIgd2Ugc2hvdWxkIGJ5cGFzcyBhZGRyL3NpemUgY2hlY2tpbmcuCisgKiBTZWUgdGhlIGVxdWl2YWxlbnQgQy1tYWNybyB2ZXJzaW9uIGJlbG93IGZvciBjbGFyaXR5LgorICogT24gc3VjY2Vzcywga2VybmVsX29rIGJyYW5jaGVzIHRvIGEgbGFiZWwgaW5kaWNhdGVkIGJ5IHBhcmFtZXRlcgorICogPHN1Y2Nlc3M+LiAgVGhpcyBpbXBsaWVzIHRoYXQgdGhlIG1hY3JvIGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQKKyAqIGluc3J1Y3Rpb24gb24gYW4gZXJyb3IuCisgKgorICogTm90ZSB0aGF0IHdoaWxlIHRoaXMgbWFjcm8gY2FuIGJlIHVzZWQgaW5kZXBlbmRlbnRseSwgd2UgZGVzaWduZWQKKyAqIGluIGZvciBvcHRpbWFsIHVzZSBpbiB0aGUgYWNjZXNzX29rIG1hY3JvIGJlbG93IChpLmUuLCB3ZSBmYWxsCisgKiB0aHJvdWdoIG9uIGVycm9yKS4KKyAqCisgKiBPbiBFbnRyeToKKyAqIAk8YXQ+CQlhbnl0aGluZyAodGVtcCByZWdpc3RlcikKKyAqIAk8c3VjY2Vzcz4JbGFiZWwgdG8gYnJhbmNoIHRvIG9uIHN1Y2Nlc3M7IGltcGxpZXMKKyAqIAkJCWZhbGwtdGhyb3VnaCBtYWNybyBvbiBlcnJvcgorICogCTxzcD4JCXN0YWNrIHBvaW50ZXIKKyAqIE9uIEV4aXQ6CisgKiAJPGF0PgkJZGVzdHJveWVkIChhY3R1YWxseSwgY3VycmVudC0+dGhyZWFkLmN1cnJlbnRfZHMpCisgKi8KKworI2lmICgoS0VSTkVMX0RTICE9IDApIHx8IChVU0VSX0RTID09IDApKQorIyBlcnJvciBBc3NlbWJseSBtYWNybyBrZXJuZWxfb2sgZmFpbHMKKyNlbmRpZgorCS5tYWNybwlrZXJuZWxfb2sgIGF0LCBzcCwgc3VjY2VzcworCWdldF9mcwlcYXQsIFxzcAorCWJlcXoJXGF0LCBcc3VjY2VzcworCS5lbmRtCisKKy8qCisgKiB1c2VyX29rIGRldGVybWluZXMgd2hldGhlciB0aGUgYWNjZXNzIHRvIHVzZXItc3BhY2UgbWVtb3J5IGlzIGFsbG93ZWQuCisgKiBTZWUgdGhlIGVxdWl2YWxlbnQgQy1tYWNybyB2ZXJzaW9uIGJlbG93IGZvciBjbGFyaXR5LgorICoKKyAqIE9uIGVycm9yLCB1c2VyX29rIGJyYW5jaGVzIHRvIGEgbGFiZWwgaW5kaWNhdGVkIGJ5IHBhcmFtZXRlcgorICogPGVycm9yPi4gIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBtYWNybyBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0CisgKiBpbnN0cnVjdGlvbiBvbiBzdWNjZXNzLgorICoKKyAqIE5vdGUgdGhhdCB3aGlsZSB0aGlzIG1hY3JvIGNhbiBiZSB1c2VkIGluZGVwZW5kZW50bHksIHdlIGRlc2lnbmVkCisgKiBpbiBmb3Igb3B0aW1hbCB1c2UgaW4gdGhlIGFjY2Vzc19vayBtYWNybyBiZWxvdyAoaS5lLiwgd2UgZmFsbAorICogdGhyb3VnaCBvbiBzdWNjZXNzKS4KKyAqCisgKiBPbiBFbnRyeToKKyAqIAk8YWE+CXJlZ2lzdGVyIGNvbnRhaW5pbmcgbWVtb3J5IGFkZHJlc3MKKyAqIAk8YXM+CXJlZ2lzdGVyIGNvbnRhaW5pbmcgbWVtb3J5IHNpemUKKyAqIAk8YXQ+CXRlbXAgcmVnaXN0ZXIKKyAqIAk8ZXJyb3I+CWxhYmVsIHRvIGJyYW5jaCB0byBvbiBlcnJvcjsgaW1wbGllcyBmYWxsLXRocm91Z2gKKyAqIAkJbWFjcm8gb24gc3VjY2VzcworICogT24gRXhpdDoKKyAqIAk8YWE+CXByZXNlcnZlZAorICogCTxhcz4JcHJlc2VydmVkCisgKiAJPGF0PglkZXN0cm95ZWQgKGFjdHVhbGx5LCAoVEFTS19TSVpFICsgMSAtIHNpemUpKQorICovCisJLm1hY3JvCXVzZXJfb2sJYWEsIGFzLCBhdCwgZXJyb3IKKwltb3ZpCVxhdCwgKFRBU0tfU0laRSsxKQorCWJnZXUJXGFzLCBcYXQsIFxlcnJvcgorCXN1YglcYXQsIFxhdCwgXGFzCisJYmdldQlcYWEsIFxhdCwgXGVycm9yCisJLmVuZG0KKworLyoKKyAqIGFjY2Vzc19vayBkZXRlcm1pbmVzIHdoZXRoZXIgYSBtZW1vcnkgYWNjZXNzIGlzIGFsbG93ZWQuICBTZWUgdGhlCisgKiBlcXVpdmFsZW50IEMtbWFjcm8gdmVyc2lvbiBiZWxvdyBmb3IgY2xhcml0eS4KKyAqCisgKiBPbiBlcnJvciwgYWNjZXNzX29rIGJyYW5jaGVzIHRvIGEgbGFiZWwgaW5kaWNhdGVkIGJ5IHBhcmFtZXRlcgorICogPGVycm9yPi4gIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBtYWNybyBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0CisgKiBpbnN0cnVjdGlvbiBvbiBzdWNjZXNzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBhc3N1bWUgc3VjY2VzcyBpcyB0aGUgY29tbW9uIGNhc2UsIGFuZCB3ZSBvcHRpbWl6ZSB0aGUKKyAqIGJyYW5jaCBmYWxsLXRocm91Z2ggY2FzZSBvbiBzdWNjZXNzLgorICoKKyAqIE9uIEVudHJ5OgorICogCTxhYT4JcmVnaXN0ZXIgY29udGFpbmluZyBtZW1vcnkgYWRkcmVzcworICogCTxhcz4JcmVnaXN0ZXIgY29udGFpbmluZyBtZW1vcnkgc2l6ZQorICogCTxhdD4JdGVtcCByZWdpc3RlcgorICogCTxzcD4KKyAqIAk8ZXJyb3I+CWxhYmVsIHRvIGJyYW5jaCB0byBvbiBlcnJvcjsgaW1wbGllcyBmYWxsLXRocm91Z2gKKyAqIAkJbWFjcm8gb24gc3VjY2VzcworICogT24gRXhpdDoKKyAqIAk8YWE+CXByZXNlcnZlZAorICogCTxhcz4JcHJlc2VydmVkCisgKiAJPGF0PglkZXN0cm95ZWQKKyAqLworCS5tYWNybwlhY2Nlc3Nfb2sgIGFhLCBhcywgYXQsIHNwLCBlcnJvcgorCWtlcm5lbF9vayAgXGF0LCBcc3AsIC5MYWNjZXNzX29rX1xACisJdXNlcl9vayAgICBcYWEsIFxhcywgXGF0LCBcZXJyb3IKKy5MYWNjZXNzX29rX1xAOgorCS5lbmRtCisKKy8qCisgKiB2ZXJpZnlfYXJlYSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBtZW1vcnkgYWNjZXNzIGlzIGFsbG93ZWQuICBJdCdzCisgKiBtb3N0bHkgYW4gdW5uZWNlc3Nhcnkgd3JhcHBlciBmb3IgYWNjZXNzX29rLCBidXQgd2UgcHJvdmlkZSBpdCBhcyBhCisgKiBkdXBsaWNhdGUgb2YgdGhlIHZlcmlmeV9hcmVhKCkgQyBpbmxpbmUgZnVuY3Rpb24gYmVsb3cuICBTZWUgdGhlCisgKiBlcXVpdmFsZW50IEMgdmVyc2lvbiBiZWxvdyBmb3IgY2xhcml0eS4KKyAqCisgKiBPbiBlcnJvciwgdmVyaWZ5X2FyZWEgYnJhbmNoZXMgdG8gYSBsYWJlbCBpbmRpY2F0ZWQgYnkgcGFyYW1ldGVyCisgKiA8ZXJyb3I+LiAgVGhpcyBpbXBsaWVzIHRoYXQgdGhlIG1hY3JvIGZhbGxzIHRocm91Z2ggdG8gdGhlIG5leHQKKyAqIGluc3RydWN0aW9uIG9uIHN1Y2Nlc3MuCisgKgorICogTm90ZSB0aGF0IHdlIGFzc3VtZSBzdWNjZXNzIGlzIHRoZSBjb21tb24gY2FzZSwgYW5kIHdlIG9wdGltaXplIHRoZQorICogYnJhbmNoIGZhbGwtdGhyb3VnaCBjYXNlIG9uIHN1Y2Nlc3MuCisgKgorICogT24gRW50cnk6CisgKiAJPGFhPglyZWdpc3RlciBjb250YWluaW5nIG1lbW9yeSBhZGRyZXNzCisgKiAJPGFzPglyZWdpc3RlciBjb250YWluaW5nIG1lbW9yeSBzaXplCisgKiAJPGF0Pgl0ZW1wIHJlZ2lzdGVyCisgKiAJPGVycm9yPglsYWJlbCB0byBicmFuY2ggdG8gb24gZXJyb3I7IGltcGxpZXMgZmFsbC10aHJvdWdoCisgKiAJCW1hY3JvIG9uIHN1Y2Nlc3MKKyAqIE9uIEV4aXQ6CisgKiAJPGFhPglwcmVzZXJ2ZWQKKyAqIAk8YXM+CXByZXNlcnZlZAorICogCTxhdD4JZGVzdHJveWVkCisgKi8KKwkubWFjcm8JdmVyaWZ5X2FyZWEJYWEsIGFzLCBhdCwgc3AsIGVycm9yCisJYWNjZXNzX29rICBcYXQsIFxhYSwgXGFzLCBcc3AsIFxlcnJvcgorCS5lbmRtCisKKworI2Vsc2UgLyogX19BU1NFTUJMWV9fIG5vdCBkZWZpbmVkICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisvKgorICogVGhlIGZzIHZhbHVlIGRldGVybWluZXMgd2hldGhlciBhcmd1bWVudCB2YWxpZGl0eSBjaGVja2luZyBzaG91bGQKKyAqIGJlIHBlcmZvcm1lZCBvciBub3QuICBJZiBnZXRfZnMoKSA9PSBVU0VSX0RTLCBjaGVja2luZyBpcworICogcGVyZm9ybWVkLCB3aXRoIGdldF9mcygpID09IEtFUk5FTF9EUywgY2hlY2tpbmcgaXMgYnlwYXNzZWQuCisgKgorICogRm9yIGhpc3RvcmljYWwgcmVhc29ucyAoRGF0YSBTZWdtZW50IFJlZ2lzdGVyPyksIHRoZXNlIG1hY3JvcyBhcmUKKyAqIGdyb3NzbHkgbWlzbmFtZWQuCisgKi8KKworI2RlZmluZSBLRVJORUxfRFMJKChtbV9zZWdtZW50X3QpIHsgMCB9KQorI2RlZmluZSBVU0VSX0RTCQkoKG1tX3NlZ21lbnRfdCkgeyAxIH0pCisKKyNkZWZpbmUgZ2V0X2RzKCkJKEtFUk5FTF9EUykKKyNkZWZpbmUgZ2V0X2ZzKCkJKGN1cnJlbnQtPnRocmVhZC5jdXJyZW50X2RzKQorI2RlZmluZSBzZXRfZnModmFsKQkoY3VycmVudC0+dGhyZWFkLmN1cnJlbnRfZHMgPSAodmFsKSkKKworI2RlZmluZSBzZWdtZW50X2VxKGEsYikJKChhKS5zZWcgPT0gKGIpLnNlZykKKworI2RlZmluZSBfX2tlcm5lbF9vayAoc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkKKyNkZWZpbmUgX191c2VyX29rKGFkZHIsc2l6ZSkgKCgoc2l6ZSkgPD0gVEFTS19TSVpFKSYmKChhZGRyKSA8PSBUQVNLX1NJWkUtKHNpemUpKSkKKyNkZWZpbmUgX19hY2Nlc3Nfb2soYWRkcixzaXplKSAoX19rZXJuZWxfb2sgfHwgX191c2VyX29rKChhZGRyKSwoc2l6ZSkpKQorI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKShhZGRyKSwoc2l6ZSkpCisKK2V4dGVybiBpbmxpbmUgaW50IHZlcmlmeV9hcmVhKGludCB0eXBlLCBjb25zdCB2b2lkICogYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCXJldHVybiBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpID8gMCA6IC1FRkFVTFQ7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG1haW4gc2luZ2xlLXZhbHVlIHRyYW5zZmVyIHJvdXRpbmVzLiAgVGhleQorICogYXV0b21hdGljYWxseSB1c2UgdGhlIHJpZ2h0IHNpemUgaWYgd2UganVzdCBoYXZlIHRoZSByaWdodCBwb2ludGVyCisgKiB0eXBlLgorICoKKyAqIFRoaXMgZ2V0cyBraW5kIG9mIHVnbHkuIFdlIHdhbnQgdG8gcmV0dXJuIF90d29fIHZhbHVlcyBpbgorICogImdldF91c2VyKCkiIGFuZCB5ZXQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnkgcG9pbnRlcnMsIGJlY2F1c2UgdGhhdAorICogaXMgdG9vIG11Y2ggb2YgYSBwZXJmb3JtYW5jZSBpbXBhY3QuIFRodXMgd2UgaGF2ZSBhIGZldyByYXRoZXIgdWdseQorICogbWFjcm9zIGhlcmUsIGFuZCBoaWRlIGFsbCB0aGUgdWdseW5lc3MgZnJvbSB0aGUgdXNlci4KKyAqCisgKiBDYXJlZnVsIHRvIG5vdAorICogKGEpIHJlLXVzZSB0aGUgYXJndW1lbnRzIGZvciBzaWRlIGVmZmVjdHMgKHNpemVvZiBpcyBvaykKKyAqIChiKSByZXF1aXJlIGFueSBrbm93bGVkZ2Ugb2YgcHJvY2Vzc2VzIGF0IHRoaXMgc3RhZ2UKKyAqLworI2RlZmluZSBwdXRfdXNlcih4LHB0cikJX19wdXRfdXNlcl9jaGVjaygoeCksKHB0ciksc2l6ZW9mKCoocHRyKSkpCisjZGVmaW5lIGdldF91c2VyKHgscHRyKSBfX2dldF91c2VyX2NoZWNrKCh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkKKworLyoKKyAqIFRoZSAiX194eHgiIHZlcnNpb25zIG9mIHRoZSB1c2VyIGFjY2VzcyBmdW5jdGlvbnMgYXJlIHZlcnNpb25zIHRoYXQKKyAqIGRvIG5vdCB2ZXJpZnkgdGhlIGFkZHJlc3Mgc3BhY2UsIHRoYXQgbXVzdCBoYXZlIGJlZW4gZG9uZSBwcmV2aW91c2x5CisgKiB3aXRoIGEgc2VwYXJhdGUgImFjY2Vzc19vaygpIiBjYWxsICh0aGlzIGlzIHVzZWQgd2hlbiB3ZSBkbyBtdWx0aXBsZQorICogYWNjZXNzZXMgdG8gdGhlIHNhbWUgYXJlYSBvZiB1c2VyIG1lbW9yeSkuCisgKi8KKyNkZWZpbmUgX19wdXRfdXNlcih4LHB0cikgX19wdXRfdXNlcl9ub2NoZWNrKCh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkKKyNkZWZpbmUgX19nZXRfdXNlcih4LHB0cikgX19nZXRfdXNlcl9ub2NoZWNrKCh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkKKworCitleHRlcm4gbG9uZyBfX3B1dF91c2VyX2JhZCh2b2lkKTsKKworI2RlZmluZSBfX3B1dF91c2VyX25vY2hlY2soeCxwdHIsc2l6ZSkJCQlcCisoewkJCQkJCQlcCisJbG9uZyBfX3B1X2VycjsJCQkJCVwKKwlfX3B1dF91c2VyX3NpemUoKHgpLChwdHIpLChzaXplKSxfX3B1X2Vycik7CVwKKwlfX3B1X2VycjsJCQkJCVwKK30pCisKKyNkZWZpbmUgX19wdXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCQlcCisoewkJCQkJCQkJXAorCWxvbmcgX19wdV9lcnIgPSAtRUZBVUxUOwkJCQlcCisJX190eXBlb2ZfXygqKHB0cikpICpfX3B1X2FkZHIgPSAocHRyKTsJCQlcCisJaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsX19wdV9hZGRyLHNpemUpKQkJXAorCQlfX3B1dF91c2VyX3NpemUoKHgpLF9fcHVfYWRkciwoc2l6ZSksX19wdV9lcnIpOwlcCisJX19wdV9lcnI7CQkJCQkJXAorfSkKKworI2RlZmluZSBfX3B1dF91c2VyX3NpemUoeCxwdHIsc2l6ZSxyZXR2YWwpCQkJXAorZG8gewkJCQkJCQkJXAorCXJldHZhbCA9IDA7CQkJCQkJXAorCXN3aXRjaCAoc2l6ZSkgewkJCQkJCVwKKyAgICAgICAgY2FzZSAxOiBfX3B1dF91c2VyX2FzbSh4LHB0cixyZXR2YWwsMSwiczhpIik7ICBicmVhazsJXAorICAgICAgICBjYXNlIDI6IF9fcHV0X3VzZXJfYXNtKHgscHRyLHJldHZhbCwyLCJzMTZpIik7IGJyZWFrOyAgIFwKKyAgICAgICAgY2FzZSA0OiBfX3B1dF91c2VyX2FzbSh4LHB0cixyZXR2YWwsNCwiczMyaSIpOyBicmVhazsgICBcCisgICAgICAgIGNhc2UgODogewkJCQkJCVwKKwkJICAgICBfX3R5cGVvZl9fKCpwdHIpIF9fdjY0ID0geDsJCVwKKwkJICAgICByZXR2YWwgPSBfX2NvcHlfdG9fdXNlcihwdHIsJl9fdjY0LDgpOwlcCisJCSAgICAgYnJlYWs7CQkJCQlcCisJICAgICAgICB9CQkJCQkJXAorCWRlZmF1bHQ6IF9fcHV0X3VzZXJfYmFkKCk7CQkJCVwKKwl9CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKworLyoKKyAqIENvbnNpZGVyIGEgY2FzZSBvZiBhIHVzZXIgc2luZ2xlIGxvYWQvc3RvcmUgd291bGQgY2F1c2UgYm90aCBhbgorICogdW5hbGlnbmVkIGV4Y2VwdGlvbiBhbmQgYW4gTU1VLXJlbGF0ZWQgZXhjZXB0aW9uICh1bmFsaWduZWQKKyAqIGV4Y2VwdGlvbnMgaGFwcGVuIGZpcnN0KToKKyAqCisgKiBVc2VyIGNvZGUgcGFzc2VzIGEgYmFkIHZhcmlhYmxlIHB0ciB0byBhIHN5c3RlbSBjYWxsLgorICogS2VybmVsIHRyaWVzIHRvIGFjY2VzcyB0aGUgdmFyaWFibGUuCisgKiBVbmFsaWduZWQgZXhjZXB0aW9uIG9jY3Vycy4KKyAqIFVuYWxpZ25lZCBleGNlcHRpb24gaGFuZGxlciB0cmllcyB0byBtYWtlIGFsaWduZWQgYWNjZXNzZXMuCisgKiBEb3VibGUgZXhjZXB0aW9uIG9jY3VycyBmb3IgTU1VLXJlbGF0ZWQgY2F1c2UgKGUuZy4sIHBhZ2Ugbm90IG1hcHBlZCkuCisgKiBkb19wYWdlX2ZhdWx0KCkgdGhpbmtzIHRoZSBmYXVsdCBhZGRyZXNzIGJlbG9uZ3MgdG8gdGhlIGtlcm5lbCwgbm90IHRoZQorICogdXNlciwgYW5kIHBhbmljcy4KKyAqCisgKiBUaGUga2VybmVsIGN1cnJlbnRseSBwcm9oaWJpdHMgdXNlciB1bmFsaWduZWQgYWNjZXNzZXMuICBXZSB1c2UgdGhlCisgKiBfX2NoZWNrX2FsaWduXyogbWFjcm9zIHRvIGNoZWNrIGZvciB1bmFsaWduZWQgYWRkcmVzc2VzIGJlZm9yZQorICogYWNjZXNzaW5nIHVzZXIgc3BhY2Ugc28gd2UgZG9uJ3QgY3Jhc2ggdGhlIGtlcm5lbC4gIEJvdGgKKyAqIF9fcHV0X3VzZXJfYXNtIGFuZCBfX2dldF91c2VyX2FzbSB1c2UgdGhlc2UgYWxpZ25tZW50IG1hY3Jvcywgc28KKyAqIG1hY3JvLXNwZWNpZmljIGxhYmVscyBzdWNoIGFzIDBmLCAxZiwgJTAsICUyLCBhbmQgJTMgbXVzdCBzdGF5IGluCisgKiBzeW5jLgorICovCisKKyNkZWZpbmUgX19jaGVja19hbGlnbl8xICAiIgorCisjZGVmaW5lIF9fY2hlY2tfYWxpZ25fMgkJCQlcCisJIiAgIF9iYmNpLmwgJTIsICAwLCAxZgkJXG4iCVwKKwkiICAgbW92aSAgICAlMCwgJTMJCVxuIglcCisJIiAgIF9qICAgICAgMmYJCQlcbiIKKworI2RlZmluZSBfX2NoZWNrX2FsaWduXzQJCQkJXAorCSIgICBfYmJzaS5sICUyLCAgMCwgMGYJCVxuIglcCisJIiAgIF9iYmNpLmwgJTIsICAxLCAxZgkJXG4iCVwKKwkiMDogbW92aSAgICAlMCwgJTMJCVxuIglcCisJIiAgIF9qICAgICAgMmYJCQlcbiIKKworCisvKgorICogV2UgZG9uJ3QgdGVsbCBnY2MgdGhhdCB3ZSBhcmUgYWNjZXNzaW5nIG1lbW9yeSwgYnV0IHRoaXMgaXMgT0sKKyAqIGJlY2F1c2Ugd2UgZG8gbm90IHdyaXRlIHRvIGFueSBtZW1vcnkgZ2NjIGtub3dzIGFib3V0LCBzbyB0aGVyZQorICogYXJlIG5vIGFsaWFzaW5nIGlzc3Vlcy4KKyAqCisgKiBXQVJOSU5HOiBJZiB5b3UgbW9kaWZ5IHRoaXMgbWFjcm8gYXQgYWxsLCB2ZXJpZnkgdGhhdCB0aGUKKyAqIF9fY2hlY2tfYWxpZ25fKiBtYWNyb3Mgc3RpbGwgd29yay4KKyAqLworI2RlZmluZSBfX3B1dF91c2VyX2FzbSh4LCBhZGRyLCBlcnIsIGFsaWduLCBpbnNuKSBcCisgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQlcCisJX19jaGVja19hbGlnbl8jI2FsaWduCQkJXAorCSIxOiAiaW5zbiIgICUxLCAlMiwgMAkJXG4iCVwKKwkiMjoJCQkJXG4iCVwKKwkiICAgLnNlY3Rpb24gIC5maXh1cCxcImF4XCIJXG4iCVwKKwkiICAgLmFsaWduIDQJCQlcbiIJXAorCSI0OgkJCQlcbiIJXAorCSIgICAubG9uZyAgMmIJCQlcbiIJXAorCSI1OgkJCQlcbiIJXAorCSIgICBsMzJyICAgJTIsIDRiCQlcbiIJXAorICAgICAgICAiICAgbW92aSAgICUwLCAlMwkJXG4iCVwKKyAgICAgICAgIiAgIGp4ICAgICAlMgkJCVxuIglcCisJIiAgIC5wcmV2aW91cwkJCVxuIglcCisJIiAgIC5zZWN0aW9uICBfX2V4X3RhYmxlLFwiYVwiCVxuIglcCisJIiAgIC5sb25nCTFiLCA1YgkJXG4iCVwKKwkiICAgLnByZXZpb3VzIgkJCQlcCisJOiI9ciIgKGVycikJCQkJXAorCToiciIgKChpbnQpKHgpKSwgInIiIChhZGRyKSwgImkiICgtRUZBVUxUKSwgIjAiIChlcnIpKQorCisjZGVmaW5lIF9fZ2V0X3VzZXJfbm9jaGVjayh4LHB0cixzaXplKQkJCQlcCisoewkJCQkJCQkJXAorCWxvbmcgX19ndV9lcnIsIF9fZ3VfdmFsOwkJCQlcCisJX19nZXRfdXNlcl9zaXplKF9fZ3VfdmFsLChwdHIpLChzaXplKSxfX2d1X2Vycik7CVwKKwkoeCkgPSAoX190eXBlb2ZfXygqKHB0cikpKV9fZ3VfdmFsOwkJCVwKKwlfX2d1X2VycjsJCQkJCQlcCit9KQorCisjZGVmaW5lIF9fZ2V0X3VzZXJfY2hlY2soeCxwdHIsc2l6ZSkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWxvbmcgX19ndV9lcnIgPSAtRUZBVUxULCBfX2d1X3ZhbCA9IDA7CQkJCVwKKwljb25zdCBfX3R5cGVvZl9fKCoocHRyKSkgKl9fZ3VfYWRkciA9IChwdHIpOwkJCVwKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELF9fZ3VfYWRkcixzaXplKSkJCQlcCisJCV9fZ2V0X3VzZXJfc2l6ZShfX2d1X3ZhbCxfX2d1X2FkZHIsKHNpemUpLF9fZ3VfZXJyKTsJXAorCSh4KSA9IChfX3R5cGVvZl9fKCoocHRyKSkpX19ndV92YWw7CQkJCVwKKwlfX2d1X2VycjsJCQkJCQkJXAorfSkKKworZXh0ZXJuIGxvbmcgX19nZXRfdXNlcl9iYWQodm9pZCk7CisKKyNkZWZpbmUgX19nZXRfdXNlcl9zaXplKHgscHRyLHNpemUscmV0dmFsKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXJldHZhbCA9IDA7CQkJCQkJCVwKKyAgICAgICAgc3dpdGNoIChzaXplKSB7CQkJCQkJCVwKKyAgICAgICAgICBjYXNlIDE6IF9fZ2V0X3VzZXJfYXNtKHgscHRyLHJldHZhbCwxLCJsOHVpIik7ICBicmVhazsJXAorICAgICAgICAgIGNhc2UgMjogX19nZXRfdXNlcl9hc20oeCxwdHIscmV0dmFsLDIsImwxNnVpIik7IGJyZWFrOwlcCisgICAgICAgICAgY2FzZSA0OiBfX2dldF91c2VyX2FzbSh4LHB0cixyZXR2YWwsNCwibDMyaSIpOyAgYnJlYWs7CVwKKyAgICAgICAgICBjYXNlIDg6IHJldHZhbCA9IF9fY29weV9mcm9tX3VzZXIoJngscHRyLDgpOyAgICBicmVhazsJXAorICAgICAgICAgIGRlZmF1bHQ6ICh4KSA9IF9fZ2V0X3VzZXJfYmFkKCk7CQkJCVwKKyAgICAgICAgfQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworCisvKgorICogV0FSTklORzogSWYgeW91IG1vZGlmeSB0aGlzIG1hY3JvIGF0IGFsbCwgdmVyaWZ5IHRoYXQgdGhlCisgKiBfX2NoZWNrX2FsaWduXyogbWFjcm9zIHN0aWxsIHdvcmsuCisgKi8KKyNkZWZpbmUgX19nZXRfdXNlcl9hc20oeCwgYWRkciwgZXJyLCBhbGlnbiwgaW5zbikgXAorICAgX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJXAorCV9fY2hlY2tfYWxpZ25fIyNhbGlnbgkJCVwKKwkiMTogImluc24iICAlMSwgJTIsIDAJCVxuIglcCisJIjI6CQkJCVxuIglcCisJIiAgIC5zZWN0aW9uICAuZml4dXAsXCJheFwiCVxuIglcCisJIiAgIC5hbGlnbiA0CQkJXG4iCVwKKwkiNDoJCQkJXG4iCVwKKwkiICAgLmxvbmcgIDJiCQkJXG4iCVwKKwkiNToJCQkJXG4iCVwKKwkiICAgbDMyciAgICUyLCA0YgkJXG4iCVwKKwkiICAgbW92aSAgICUxLCAwCQlcbiIJXAorICAgICAgICAiICAgbW92aSAgICUwLCAlMwkJXG4iCVwKKyAgICAgICAgIiAgIGp4ICAgICAlMgkJCVxuIglcCisJIiAgIC5wcmV2aW91cwkJCVxuIglcCisJIiAgIC5zZWN0aW9uICBfX2V4X3RhYmxlLFwiYVwiCVxuIglcCisJIiAgIC5sb25nCTFiLCA1YgkJXG4iCVwKKwkiICAgLnByZXZpb3VzIgkJCQlcCisJOiI9ciIgKGVyciksICI9ciIgKHgpCQkJXAorCToiciIgKGFkZHIpLCAiaSIgKC1FRkFVTFQpLCAiMCIgKGVycikpCisKKworLyoKKyAqIENvcHkgdG8vZnJvbSB1c2VyIHNwYWNlCisgKi8KKworLyoKKyAqIFdlIHVzZSBhIGdlbmVyaWMsIGFyYml0cmFyeS1zaXplZCBjb3B5IHN1YnJvdXRpbmUuICBUaGUgWHRlbnNhCisgKiBhcmNoaXRlY3R1cmUgd291bGQgY2F1c2UgaGVhdnkgY29kZSBibG9hdCBpZiB3ZSB0cmllZCB0byBpbmxpbmUKKyAqIHRoZXNlIGZ1bmN0aW9ucyBhbmQgcHJvdmlkZSBfX2NvbnN0YW50X2NvcHlfKiBlcXVpdmFsZW50cyBsaWtlIHRoZQorICogaTM4NiB2ZXJzaW9ucy4gIF9feHRlbnNhX2NvcHlfdXNlciBpcyBxdWl0ZSBlZmZpY2llbnQuICBTZWUgdGhlCisgKiAuZml4dXAgc2VjdGlvbiBvZiBfX3h0ZW5zYV9jb3B5X3VzZXIgZm9yIGEgZGlzY3Vzc2lvbiBvbiB0aGUKKyAqIFhfemVyb2luZyBlcXVpdmFsZW50cyBmb3IgWHRlbnNhLgorICovCisKK2V4dGVybiB1bnNpZ25lZCBfX3h0ZW5zYV9jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIG4pOworI2RlZmluZSBfX2NvcHlfdXNlcih0byxmcm9tLHNpemUpIF9feHRlbnNhX2NvcHlfdXNlcih0byxmcm9tLHNpemUpCisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX2dlbmVyaWNfY29weV9mcm9tX3VzZXJfbm9jaGVjayh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBfX2NvcHlfdXNlcih0byxmcm9tLG4pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fZ2VuZXJpY19jb3B5X3RvX3VzZXJfbm9jaGVjayh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBfX2NvcHlfdXNlcih0byxmcm9tLG4pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlwcmVmZXRjaChmcm9tKTsKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKQorCQlyZXR1cm4gX19jb3B5X3VzZXIodG8sZnJvbSxuKTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlwcmVmZXRjaHcodG8pOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCQlyZXR1cm4gX19jb3B5X3VzZXIodG8sZnJvbSxuKTsKKwllbHNlCisJCW1lbXNldCh0bywgMCwgbik7CisJcmV0dXJuIG47Cit9CisKKyNkZWZpbmUgY29weV90b191c2VyKHRvLGZyb20sbikgX19nZW5lcmljX2NvcHlfdG9fdXNlcigodG8pLChmcm9tKSwobikpCisjZGVmaW5lIGNvcHlfZnJvbV91c2VyKHRvLGZyb20sbikgX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKCh0byksKGZyb20pLChuKSkKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sZnJvbSxuKSBfX2dlbmVyaWNfY29weV90b191c2VyX25vY2hlY2soKHRvKSwoZnJvbSksKG4pKQorI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLGZyb20sbikgX19nZW5lcmljX2NvcHlfZnJvbV91c2VyX25vY2hlY2soKHRvKSwoZnJvbSksKG4pKQorI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgorI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKKworCisvKgorICogV2UgbmVlZCB0byByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBub3QgY2xlYXJlZC4gIE91ciBtZW1zZXQoKQorICogcmV0dXJucyB6ZXJvIGlmIGEgcHJvYmxlbSBvY2N1cnMgd2hpbGUgYWNjZXNzaW5nIHVzZXItc3BhY2UgbWVtb3J5LgorICogSW4gdGhhdCBldmVudCwgcmV0dXJuIG5vIG1lbW9yeSBjbGVhcmVkLiAgT3RoZXJ3aXNlLCB6ZXJvIGZvcgorICogc3VjY2Vzcy4KKyAqLworCitleHRlcm4gaW5saW5lIHVuc2lnbmVkIGxvbmcKK19feHRlbnNhX2NsZWFyX3VzZXIodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmICggISBtZW1zZXQoYWRkciwgMCwgc2l6ZSkgKQorCQlyZXR1cm4gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIGlubGluZSB1bnNpZ25lZCBsb25nCitjbGVhcl91c2VyKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgYWRkciwgc2l6ZSkpCisJCXJldHVybiBfX3h0ZW5zYV9jbGVhcl91c2VyKGFkZHIsIHNpemUpOworCXJldHVybiBzaXplID8gLUVGQVVMVCA6IDA7Cit9CisKKyNkZWZpbmUgX19jbGVhcl91c2VyICBfX3h0ZW5zYV9jbGVhcl91c2VyCisKKworZXh0ZXJuIGxvbmcgX19zdHJuY3B5X3VzZXIoY2hhciAqLCBjb25zdCBjaGFyICosIGxvbmcpOworI2RlZmluZSBfX3N0cm5jcHlfZnJvbV91c2VyIF9fc3RybmNweV91c2VyCisKK2V4dGVybiBpbmxpbmUgbG9uZworc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGxvbmcgY291bnQpCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKKwkJcmV0dXJuIF9fc3RybmNweV9mcm9tX3VzZXIoZHN0LCBzcmMsIGNvdW50KTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworCisjZGVmaW5lIHN0cmxlbl91c2VyKHN0cikgc3Rybmxlbl91c2VyKChzdHIpLCBUQVNLX1NJWkUgLSAxKQorCisvKgorICogUmV0dXJuIHRoZSBzaXplIG9mIGEgc3RyaW5nIChpbmNsdWRpbmcgdGhlIGVuZGluZyAwISkKKyAqLworZXh0ZXJuIGxvbmcgX19zdHJubGVuX3VzZXIoY29uc3QgY2hhciAqLCBsb25nKTsKKworZXh0ZXJuIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzdHIsIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgdG9wID0gX19rZXJuZWxfb2sgPyB+MFVMIDogVEFTS19TSVpFIC0gMTsKKworCWlmICgodW5zaWduZWQgbG9uZylzdHIgPiB0b3ApCisJCXJldHVybiAwOworCXJldHVybiBfX3N0cm5sZW5fdXNlcihzdHIsIGxlbik7Cit9CisKKworc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeQoreworCXVuc2lnbmVkIGxvbmcgaW5zbiwgZml4dXA7Cit9OworCisvKiBSZXR1cm5zIDAgaWYgZXhjZXB0aW9uIG5vdCBmb3VuZCBhbmQgZml4dXAudW5pdCBvdGhlcndpc2UuICAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHVuc2lnbmVkIGxvbmcgYWRkcik7CitleHRlcm4gdm9pZCBzb3J0X2V4Y2VwdGlvbl90YWJsZSh2b2lkKTsKKworLyogUmV0dXJucyB0aGUgbmV3IHBjICovCisjZGVmaW5lIGZpeHVwX2V4Y2VwdGlvbihtYXBfcmVnLCBmaXh1cF91bml0LCBwYykgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmaXh1cF91bml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KKyNlbmRpZgkvKiBfWFRFTlNBX1VBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3Vjb250ZXh0LmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGM5NGVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3Vjb250ZXh0LmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS91Y29udGV4dC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9VQ09OVEVYVF9ICisjZGVmaW5lIF9YVEVOU0FfVUNPTlRFWFRfSAorCitzdHJ1Y3QgdWNvbnRleHQgeworCXVuc2lnbmVkIGxvbmcJICB1Y19mbGFnczsKKwlzdHJ1Y3QgdWNvbnRleHQgICp1Y19saW5rOworCXN0YWNrX3QJCSAgdWNfc3RhY2s7CisJc3RydWN0IHNpZ2NvbnRleHQgdWNfbWNvbnRleHQ7CisJc2lnc2V0X3QJICB1Y19zaWdtYXNrOwkvKiBtYXNrIGxhc3QgZm9yIGV4dGVuc2liaWxpdHkgKi8KK307CisKKyNlbmRpZiAvKiBfWFRFTlNBX1VDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmFsaWduZWQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmFsaWduZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODIyMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3VuYWxpZ25lZC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBpbmNsdWRlL2FzbS14dGVuc2EvdW5hbGlnbmVkLmgKKyAqCisgKiBYdGVuc2EgZG9lc24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzIGVmZmljaWVudGx5LgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfVU5BTElHTkVEX0gKKyNkZWZpbmUgX1hURU5TQV9VTkFMSUdORURfSAorCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKy8qIFVzZSBtZW1tb3ZlIGhlcmUsIHNvIGdjYyBkb2VzIG5vdCBpbnNlcnQgYSBfX2J1aWx0aW5fbWVtY3B5LiAqLworCisjZGVmaW5lIGdldF91bmFsaWduZWQocHRyKSBcCisgICh7IF9fdHlwZW9mX18oKihwdHIpKSBfX3RtcDsgbWVtbW92ZSgmX190bXAsIChwdHIpLCBzaXplb2YoKihwdHIpKSk7IF9fdG1wOyB9KQorCisjZGVmaW5lIHB1dF91bmFsaWduZWQodmFsLCBwdHIpCQkJCVwKKyAgKHsgX190eXBlb2ZfXygqKHB0cikpIF9fdG1wID0gKHZhbCk7CQkJXAorICAgICBtZW1tb3ZlKChwdHIpLCAmX190bXAsIHNpemVvZigqKHB0cikpKTsJCVwKKyAgICAgKHZvaWQpMDsgfSkKKworI2VuZGlmCS8qIF9YVEVOU0FfVU5BTElHTkVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91bmlzdGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjM5ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3VuaXN0ZC5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9VTklTVERfSAorI2RlZmluZSBfWFRFTlNBX1VOSVNURF9ICisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNkZWZpbmUgX19OUl9zcGlsbAkJICAwCisjZGVmaW5lIF9fTlJfZXhpdAkJICAxCisjZGVmaW5lIF9fTlJfcmVhZAkJICAzCisjZGVmaW5lIF9fTlJfd3JpdGUJCSAgNAorI2RlZmluZSBfX05SX29wZW4JCSAgNQorI2RlZmluZSBfX05SX2Nsb3NlCQkgIDYKKyNkZWZpbmUgX19OUl9jcmVhdAkJICA4CisjZGVmaW5lIF9fTlJfbGluawkJICA5CisjZGVmaW5lIF9fTlJfdW5saW5rCQkgMTAKKyNkZWZpbmUgX19OUl9leGVjdmUJCSAxMQorI2RlZmluZSBfX05SX2NoZGlyCQkgMTIKKyNkZWZpbmUgX19OUl9ta25vZAkJIDE0CisjZGVmaW5lIF9fTlJfY2htb2QJCSAxNQorI2RlZmluZSBfX05SX2xjaG93bgkJIDE2CisjZGVmaW5lIF9fTlJfYnJlYWsJCSAxNworI2RlZmluZSBfX05SX2xzZWVrCQkgMTkKKyNkZWZpbmUgX19OUl9nZXRwaWQJCSAyMAorI2RlZmluZSBfX05SX21vdW50CQkgMjEKKyNkZWZpbmUgX19OUl9zZXR1aWQJCSAyMworI2RlZmluZSBfX05SX2dldHVpZAkJIDI0CisjZGVmaW5lIF9fTlJfcHRyYWNlCQkgMjYKKyNkZWZpbmUgX19OUl91dGltZQkJIDMwCisjZGVmaW5lIF9fTlJfc3R0eQkJIDMxCisjZGVmaW5lIF9fTlJfZ3R0eQkJIDMyCisjZGVmaW5lIF9fTlJfYWNjZXNzCQkgMzMKKyNkZWZpbmUgX19OUl9mdGltZQkJIDM1CisjZGVmaW5lIF9fTlJfc3luYwkJIDM2CisjZGVmaW5lIF9fTlJfa2lsbAkJIDM3CisjZGVmaW5lIF9fTlJfcmVuYW1lCQkgMzgKKyNkZWZpbmUgX19OUl9ta2RpcgkJIDM5CisjZGVmaW5lIF9fTlJfcm1kaXIJCSA0MAorI2RlZmluZSBfX05SX2R1cAkJIDQxCisjZGVmaW5lIF9fTlJfcGlwZQkJIDQyCisjZGVmaW5lIF9fTlJfdGltZXMJCSA0MworI2RlZmluZSBfX05SX3Byb2YJCSA0NAorI2RlZmluZSBfX05SX2JyawkJIDQ1CisjZGVmaW5lIF9fTlJfc2V0Z2lkCQkgNDYKKyNkZWZpbmUgX19OUl9nZXRnaWQJCSA0NworI2RlZmluZSBfX05SX3NpZ25hbAkJIDQ4CisjZGVmaW5lIF9fTlJfZ2V0ZXVpZAkJIDQ5CisjZGVmaW5lIF9fTlJfZ2V0ZWdpZAkJIDUwCisjZGVmaW5lIF9fTlJfYWNjdAkJIDUxCisjZGVmaW5lIF9fTlJfbG9jawkJIDUzCisjZGVmaW5lIF9fTlJfaW9jdGwJCSA1NAorI2RlZmluZSBfX05SX2ZjbnRsCQkgNTUKKyNkZWZpbmUgX19OUl9zZXRwZ2lkCQkgNTcKKyNkZWZpbmUgX19OUl91bGltaXQJCSA1OAorI2RlZmluZSBfX05SX3VtYXNrCQkgNjAKKyNkZWZpbmUgX19OUl9jaHJvb3QJCSA2MQorI2RlZmluZSBfX05SX3VzdGF0CQkgNjIKKyNkZWZpbmUgX19OUl9kdXAyCQkgNjMKKyNkZWZpbmUgX19OUl9nZXRwcGlkCQkgNjQKKyNkZWZpbmUgX19OUl9zZXRzaWQJCSA2NgorI2RlZmluZSBfX05SX3NpZ2FjdGlvbgkJIDY3CisjZGVmaW5lIF9fTlJfc2V0cmV1aWQJCSA3MAorI2RlZmluZSBfX05SX3NldHJlZ2lkCQkgNzEKKyNkZWZpbmUgX19OUl9zaWdzdXNwZW5kCQkgNzIKKyNkZWZpbmUgX19OUl9zaWdwZW5kaW5nCQkgNzMKKyNkZWZpbmUgX19OUl9zZXRob3N0bmFtZQkgNzQKKyNkZWZpbmUgX19OUl9zZXRybGltaXQJCSA3NQorI2RlZmluZSBfX05SX2dldHJsaW1pdAkgCSA3NgkvKiBCYWNrIGNvbXBhdGlibGUgMkdpZyBsaW1pdGVkIHJsaW1pdCAqLworI2RlZmluZSBfX05SX2dldHJ1c2FnZQkJIDc3CisjZGVmaW5lIF9fTlJfZ2V0dGltZW9mZGF5CSA3OAorI2RlZmluZSBfX05SX3NldHRpbWVvZmRheQkgNzkKKyNkZWZpbmUgX19OUl9nZXRncm91cHMJCSA4MAorI2RlZmluZSBfX05SX3NldGdyb3VwcwkJIDgxCisjZGVmaW5lIF9fTlJfc2VsZWN0CQkgODIKKyNkZWZpbmUgX19OUl9zeW1saW5rCQkgODMKKyNkZWZpbmUgX19OUl9yZWFkbGluawkJIDg1CisjZGVmaW5lIF9fTlJfdXNlbGliCQkgODYKKyNkZWZpbmUgX19OUl9zd2Fwb24JCSA4NworI2RlZmluZSBfX05SX3JlYm9vdAkJIDg4CisjZGVmaW5lIF9fTlJfbXVubWFwCQkgOTEKKyNkZWZpbmUgX19OUl90cnVuY2F0ZQkJIDkyCisjZGVmaW5lIF9fTlJfZnRydW5jYXRlCQkgOTMKKyNkZWZpbmUgX19OUl9mY2htb2QJCSA5NAorI2RlZmluZSBfX05SX2ZjaG93bgkJIDk1CisjZGVmaW5lIF9fTlJfZ2V0cHJpb3JpdHkJIDk2CisjZGVmaW5lIF9fTlJfc2V0cHJpb3JpdHkJIDk3CisjZGVmaW5lIF9fTlJfcHJvZmlsCQkgOTgKKyNkZWZpbmUgX19OUl9zdGF0ZnMJCSA5OQorI2RlZmluZSBfX05SX2ZzdGF0ZnMJCTEwMAorI2RlZmluZSBfX05SX2lvcGVybQkJMTAxCisjZGVmaW5lIF9fTlJfc3lzbG9nCQkxMDMKKyNkZWZpbmUgX19OUl9zZXRpdGltZXIJCTEwNAorI2RlZmluZSBfX05SX2dldGl0aW1lcgkJMTA1CisjZGVmaW5lIF9fTlJfc3RhdAkJMTA2CisjZGVmaW5lIF9fTlJfbHN0YXQJCTEwNworI2RlZmluZSBfX05SX2ZzdGF0CQkxMDgKKyNkZWZpbmUgX19OUl9pb3BsCQkxMTAKKyNkZWZpbmUgX19OUl92aGFuZ3VwCQkxMTEKKyNkZWZpbmUgX19OUl9pZGxlCQkxMTIKKyNkZWZpbmUgX19OUl93YWl0NAkJMTE0CisjZGVmaW5lIF9fTlJfc3dhcG9mZgkJMTE1CisjZGVmaW5lIF9fTlJfc3lzaW5mbwkJMTE2CisjZGVmaW5lIF9fTlJfZnN5bmMJCTExOAorI2RlZmluZSBfX05SX3NpZ3JldHVybgkJMTE5CisjZGVmaW5lIF9fTlJfY2xvbmUJCTEyMAorI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJMTIxCisjZGVmaW5lIF9fTlJfdW5hbWUJCTEyMgorI2RlZmluZSBfX05SX21vZGlmeV9sZHQJCTEyMworI2RlZmluZSBfX05SX2FkanRpbWV4CQkxMjQKKyNkZWZpbmUgX19OUl9tcHJvdGVjdAkJMTI1CisjZGVmaW5lIF9fTlJfY3JlYXRlX21vZHVsZQkxMjcKKyNkZWZpbmUgX19OUl9pbml0X21vZHVsZQkxMjgKKyNkZWZpbmUgX19OUl9kZWxldGVfbW9kdWxlCTEyOQorI2RlZmluZSBfX05SX3F1b3RhY3RsCQkxMzEKKyNkZWZpbmUgX19OUl9nZXRwZ2lkCQkxMzIKKyNkZWZpbmUgX19OUl9mY2hkaXIJCTEzMworI2RlZmluZSBfX05SX2JkZmx1c2gJCTEzNAorI2RlZmluZSBfX05SX3N5c2ZzCQkxMzUKKyNkZWZpbmUgX19OUl9wZXJzb25hbGl0eQkxMzYKKyNkZWZpbmUgX19OUl9zZXRmc3VpZAkJMTM4CisjZGVmaW5lIF9fTlJfc2V0ZnNnaWQJCTEzOQorI2RlZmluZSBfX05SX19sbHNlZWsJCTE0MAorI2RlZmluZSBfX05SX2dldGRlbnRzCQkxNDEKKyNkZWZpbmUgX19OUl9fbmV3c2VsZWN0CQkxNDIKKyNkZWZpbmUgX19OUl9mbG9jawkJMTQzCisjZGVmaW5lIF9fTlJfbXN5bmMJCTE0NAorI2RlZmluZSBfX05SX3JlYWR2CQkxNDUKKyNkZWZpbmUgX19OUl93cml0ZXYJCTE0NgorI2RlZmluZSBfX05SX2NhY2hlZmx1c2ggICAgICAgICAxNDcKKyNkZWZpbmUgX19OUl9jYWNoZWN0bCAgICAgICAgICAgMTQ4CisjZGVmaW5lIF9fTlJfc3lzeHRlbnNhICAgICAgICAgIDE0OQorI2RlZmluZSBfX05SX3N5c2R1bW15ICAgICAgICAgICAxNTAKKyNkZWZpbmUgX19OUl9nZXRzaWQJCTE1MQorI2RlZmluZSBfX05SX2ZkYXRhc3luYwkJMTUyCisjZGVmaW5lIF9fTlJfX3N5c2N0bAkJMTUzCisjZGVmaW5lIF9fTlJfbWxvY2sJCTE1NAorI2RlZmluZSBfX05SX211bmxvY2sJCTE1NQorI2RlZmluZSBfX05SX21sb2NrYWxsCQkxNTYKKyNkZWZpbmUgX19OUl9tdW5sb2NrYWxsCQkxNTcKKyNkZWZpbmUgX19OUl9zY2hlZF9zZXRwYXJhbQkJMTU4CisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0cGFyYW0JCTE1OQorI2RlZmluZSBfX05SX3NjaGVkX3NldHNjaGVkdWxlcgkJMTYwCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0c2NoZWR1bGVyCQkxNjEKKyNkZWZpbmUgX19OUl9zY2hlZF95aWVsZAkJMTYyCisjZGVmaW5lIF9fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAkxNjMKKyNkZWZpbmUgX19OUl9zY2hlZF9nZXRfcHJpb3JpdHlfbWluCTE2NAorI2RlZmluZSBfX05SX3NjaGVkX3JyX2dldF9pbnRlcnZhbAkxNjUKKyNkZWZpbmUgX19OUl9uYW5vc2xlZXAJCTE2NgorI2RlZmluZSBfX05SX21yZW1hcAkJMTY3CisjZGVmaW5lIF9fTlJfYWNjZXB0ICAgICAgICAgICAgIDE2OAorI2RlZmluZSBfX05SX2JpbmQgICAgICAgICAgICAgICAxNjkKKyNkZWZpbmUgX19OUl9jb25uZWN0ICAgICAgICAgICAgMTcwCisjZGVmaW5lIF9fTlJfZ2V0cGVlcm5hbWUgICAgICAgIDE3MQorI2RlZmluZSBfX05SX2dldHNvY2tuYW1lICAgICAgICAxNzIKKyNkZWZpbmUgX19OUl9nZXRzb2Nrb3B0ICAgICAgICAgMTczCisjZGVmaW5lIF9fTlJfbGlzdGVuICAgICAgICAgICAgIDE3NAorI2RlZmluZSBfX05SX3JlY3YgICAgICAgICAgICAgICAxNzUKKyNkZWZpbmUgX19OUl9yZWN2ZnJvbSAgICAgICAgICAgMTc2CisjZGVmaW5lIF9fTlJfcmVjdm1zZyAgICAgICAgICAgIDE3NworI2RlZmluZSBfX05SX3NlbmQgICAgICAgICAgICAgICAxNzgKKyNkZWZpbmUgX19OUl9zZW5kbXNnICAgICAgICAgICAgMTc5CisjZGVmaW5lIF9fTlJfc2VuZHRvICAgICAgICAgICAgIDE4MAorI2RlZmluZSBfX05SX3NldHNvY2tvcHQgICAgICAgICAxODEKKyNkZWZpbmUgX19OUl9zaHV0ZG93biAgICAgICAgICAgMTgyCisjZGVmaW5lIF9fTlJfc29ja2V0ICAgICAgICAgICAgIDE4MworI2RlZmluZSBfX05SX3NvY2tldHBhaXIgICAgICAgICAxODQKKyNkZWZpbmUgX19OUl9zZXRyZXN1aWQJCTE4NQorI2RlZmluZSBfX05SX2dldHJlc3VpZAkJMTg2CisjZGVmaW5lIF9fTlJfcXVlcnlfbW9kdWxlCTE4NworI2RlZmluZSBfX05SX3BvbGwJCTE4OAorI2RlZmluZSBfX05SX25mc3NlcnZjdGwJCTE4OQorI2RlZmluZSBfX05SX3NldHJlc2dpZAkJMTkwCisjZGVmaW5lIF9fTlJfZ2V0cmVzZ2lkCQkxOTEKKyNkZWZpbmUgX19OUl9wcmN0bCAgICAgICAgICAgICAgMTkyCisjZGVmaW5lIF9fTlJfcnRfc2lncmV0dXJuCTE5MworI2RlZmluZSBfX05SX3J0X3NpZ2FjdGlvbgkxOTQKKyNkZWZpbmUgX19OUl9ydF9zaWdwcm9jbWFzawkxOTUKKyNkZWZpbmUgX19OUl9ydF9zaWdwZW5kaW5nCTE5NgorI2RlZmluZSBfX05SX3J0X3NpZ3RpbWVkd2FpdAkxOTcKKyNkZWZpbmUgX19OUl9ydF9zaWdxdWV1ZWluZm8JMTk4CisjZGVmaW5lIF9fTlJfcnRfc2lnc3VzcGVuZAkxOTkKKyNkZWZpbmUgX19OUl9wcmVhZAkJMjAwCisjZGVmaW5lIF9fTlJfcHdyaXRlCQkyMDEKKyNkZWZpbmUgX19OUl9jaG93bgkJMjAyCisjZGVmaW5lIF9fTlJfZ2V0Y3dkCQkyMDMKKyNkZWZpbmUgX19OUl9jYXBnZXQJCTIwNAorI2RlZmluZSBfX05SX2NhcHNldAkJMjA1CisjZGVmaW5lIF9fTlJfc2lnYWx0c3RhY2sJMjA2CisjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTIwNworI2RlZmluZSBfX05SX21tYXAyCQkyMTAKKyNkZWZpbmUgX19OUl90cnVuY2F0ZTY0CQkyMTEKKyNkZWZpbmUgX19OUl9mdHJ1bmNhdGU2NAkyMTIKKyNkZWZpbmUgX19OUl9zdGF0NjQJCTIxMworI2RlZmluZSBfX05SX2xzdGF0NjQJCTIxNAorI2RlZmluZSBfX05SX2ZzdGF0NjQJCTIxNQorI2RlZmluZSBfX05SX3Bpdm90X3Jvb3QJCTIxNgorI2RlZmluZSBfX05SX21pbmNvcmUJCTIxNworI2RlZmluZSBfX05SX21hZHZpc2UJCTIxOAorI2RlZmluZSBfX05SX2dldGRlbnRzNjQJCTIxOQorCisvKiBLZWVwIHRoaXMgbGFzdDsgc2hvdWxkIGFsd2F5cyBlcXVhbCB0aGUgbGFzdCB2YWxpZCBjYWxsIG51bWJlci4gKi8KKyNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscyAgICAgMjIwCisKKy8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtMTI1OiBzZWUKKyAqIDxhc20teHRlbnNhL2Vycm5vLmg+ICovCisKKyNkZWZpbmUgU1lTWFRFTlNBX1JFU0VSVkVECSAgIDAJLyogZG9uJ3QgdXNlIHRoaXMgKi8KKyNkZWZpbmUgU1lTWFRFTlNBX0FUT01JQ19TRVQJICAgMQkvKiBzZXQgdmFyaWFibGUgKi8KKyNkZWZpbmUgU1lTWFRFTlNBX0FUT01JQ19FWEdfQUREICAgMgkvKiBleGNoYW5nZSBtZW1vcnkgYW5kIGFkZCAqLworI2RlZmluZSBTWVNYVEVOU0FfQVRPTUlDX0FERAkgICAzCS8qIGFkZCB0byBtZW1vcnkgKi8KKyNkZWZpbmUgU1lTWFRFTlNBX0FUT01JQ19DTVBfU1dQICAgNAkvKiBjb21wYXJlIGFuZCBzd2FwICovCisKKyNkZWZpbmUgU1lTWFRFTlNBX0NPVU5UCQkgICA1CS8qIGNvdW50IG9mIHN5c2NhbGwwIGZ1bmN0aW9ucyovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKSByZXR1cm4gKCh0eXBlKShyZXMpKQorI2Vsc2UKKyNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpIFwKK2RvIHsgXAorCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLTEyNSkpIHsgXAorCS8qIEF2b2lkIHVzaW5nICJyZXMiIHdoaWNoIGlzIGRlY2xhcmVkIHRvIGJlIGluIHJlZ2lzdGVyIHIyOyBcCisJICogZXJybm8gbWlnaHQgZXhwYW5kIHRvIGEgZnVuY3Rpb24gY2FsbCBhbmQgY2xvYmJlciBpdC4gICovIFwKKwkJaW50IF9fZXJyID0gLShyZXMpOyBcCisJCWVycm5vID0gX19lcnI7IFwKKwkJcmVzID0gLTE7IFwKKwl9IFwKKwlyZXR1cm4gKHR5cGUpIChyZXMpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyogVGVuc2lsaWNhJ3MgeHQteGNjIGNvbXBpbGVyIGlzIG11Y2ggbW9yZSBhZ3Jlc3NpdmUgYXQgY29kZQorICogb3B0aW1pemF0aW9uIHRoYW4gZ2NjLiAgTXVsdGlwbGUgX19hc21fXyBzdGF0ZW1lbnRzIGFyZQorICogaW5zdWZmaWNpZW50IGZvciB4dC14Y2MgYmVjYXVzZSBzdWJzZXF1ZW50IG9wdGltaXphdGlvbiBwYXNzZXMKKyAqIChiZXlvbmQgdGhlIGZyb250LWVuZCB0aGF0IGtub3dzIG9mIF9fYXNtX18gc3RhdGVtZW50cyBhbmQgb3RoZXIKKyAqIHN1Y2ggR05VIEV4dGVuc2lvbnMgdG8gQykgY2FuIG1vZGlmeSB0aGUgcmVnaXN0ZXIgc2VsZWN0aW9uIGZvcgorICogY29udGFpbm1lbnQgb2YgQyB2YXJpYWJsZXMuCisgKgorICogeHQteGNjIGNhbm5vdCBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIGEgc2luZ2xlIF9fYXNtX18gc3RhdGVtZW50LCBzbworICogd2UgY3JlYXRlIHNpbmdsZS1hc20gdmVyc2lvbnMgb2YgdGhlIHN5c2NhbGwgbWFjcm9zIHRoYXQgYXJlCisgKiBzdWl0YWJsZSBhbmQgb3B0aW1hbCBmb3IgYm90aCB4dC14Y2MgYW5kIGdjYy4KKyAqCisgKiBMaW51eCB0YWtlcyBzeXN0ZW0tY2FsbCBhcmd1bWVudHMgaW4gcmVnaXN0ZXJzLiAgVGhlIGZvbGxvd2luZworICogZGVzaWduIGlzIG9wdGltaXplZCBmb3IgdXNlci1sYW5kIGFwcHMgKGUuZy4sIGdsaWJjKSB3aGljaAorICogdHlwaWNhbGx5IGhhdmUgYSBmdW5jdGlvbiB3cmFwcGVyIGFyb3VuZCB0aGUgInN5c2NhbGwiIGFzc2VtYmx5CisgKiBpbnN0cnVjdGlvbi4gIEl0IHNhdGlzZmllcyB0aGUgWHRlbnNhIEFCSSB3aGlsZSBtaW5pemluZyBhcmd1bWVudAorICogc2hpZnRpbmcuCisgKgorICogVGhlIFh0ZW5zYSBBQkkgYW5kIHNvZnR3YXJlIGNvbnZlbnRpb25zIHJlcXVpcmUgdGhlIHN5c3RlbS1jYWxsCisgKiBudW1iZXIgaW4gYTIuICBJZiBhbiBhcmd1bWVudCBleGlzdHMgaW4gYTIsIHdlIG1vdmUgaXQgdG8gdGhlIG5leHQKKyAqIGF2YWlsYWJsZSByZWdpc3Rlci4gIE5vdGUgdGhhdCBmb3IgaW1wcm92ZWQgZWZmaWNpZW5jeSwgd2UgZG8gTk9UCisgKiBzaGlmdCBhbGwgcGFyYW1ldGVycyBkb3duIG9uZSByZWdpc3RlciB0byBtYWludGFpbiB0aGUgb3JpZ2luYWwKKyAqIG9yZGVyLgorICoKKyAqIEF0IGJlc3QgY2FzZSAoemVybyBhcmd1bWVudHMpLCB3ZSBqdXN0IHdyaXRlIHRoZSBzeXNjYWxsIG51bWJlciB0bworICogYTIuICBBdCB3b3JzdCBjYXNlICgxIHRvIDYgYXJndW1lbnRzKSwgd2UgbW92ZSB0aGUgYXJndW1lbnQgaW4gYTIKKyAqIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSByZWdpc3RlciwgdGhlbiB3cml0ZSB0aGUgc3lzY2FsbCBudW1iZXIgdG8KKyAqIGEyLgorICoKKyAqIEZvciBjbGFyaXR5LCB0aGUgZm9sbG93aW5nIHRydXRoIHRhYmxlIGVudW1lcmF0ZXMgYWxsIHBvc3NpYmlsaXRpZXMuCisgKgorICogYXJndW1lbnRzCXN5c2NhbGwgbnVtYmVyCWFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUKKyAqIC0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkwCSAgICAgIGEyCisgKgkxCSAgICAgIGEyCWEzCisgKgkyCSAgICAgIGEyCWE0LCAgIGEzCisgKgkzCSAgICAgIGEyCWE1LCAgIGEzLCAgIGE0CisgKgk0CSAgICAgIGEyCWE2LCAgIGEzLCAgIGE0LCAgIGE1CisgKgk1CSAgICAgIGEyCWE3LCAgIGEzLCAgIGE0LCAgIGE1LCAgIGE2CisgKgk2CSAgICAgIGEyCWE4LCAgIGEzLCAgIGE0LCAgIGE1LCAgIGE2LCAgIGE3CisgKi8KKworI2RlZmluZSBfc3lzY2FsbDAodHlwZSxuYW1lKSBcCit0eXBlIG5hbWUodm9pZCkgXAoreyBcCitsb25nIF9fcmVzOyBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkiICBtb3ZpICBhMiwgJTEgXG4iIFwKKwkiICBzeXNjYWxsICAgICAgXG4iIFwKKwkiICBtb3YgICAlMCwgYTIgXG4iIFwKKwk6ICI9YSIgKF9fcmVzKSBcCisJOiAiaSIgKF9fTlJfIyNuYW1lKSBcCisJOiAiYTIiIFwKKwkpOyBcCitfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGwxKHR5cGUsbmFtZSx0eXBlMCxhcmcwKSBcCit0eXBlIG5hbWUodHlwZTAgYXJnMCkgXAoreyBcCitsb25nIF9fcmVzOyBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkiICBtb3YgICBhMywgJTIgXG4iIFwKKwkiICBtb3ZpICBhMiwgJTEgXG4iIFwKKwkiICBzeXNjYWxsICAgICAgXG4iIFwKKwkiICBtb3YgICAlMCwgYTIgXG4iIFwKKwk6ICI9YSIgKF9fcmVzKSBcCisJOiAiaSIgKF9fTlJfIyNuYW1lKSwgImEiIChhcmcwKSBcCisJOiAiYTIiLCAiYTMiIFwKKwkpOyBcCitfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGwyKHR5cGUsbmFtZSx0eXBlMCxhcmcwLHR5cGUxLGFyZzEpIFwKK3R5cGUgbmFtZSh0eXBlMCBhcmcwLHR5cGUxIGFyZzEpIFwKK3sgXAorbG9uZyBfX3JlczsgXAorX19hc21fXyBfX3ZvbGF0aWxlX18gKCBcCisJIiAgbW92ICAgYTQsICUyIFxuIiBcCisJIiAgbW92ICAgYTMsICUzIFxuIiBcCisJIiAgbW92aSAgYTIsICUxIFxuIiBcCisJIiAgc3lzY2FsbCAgICAgIFxuIiBcCisJIiAgbW92ICAgJTAsIGEyIFxuIiBcCisJOiAiPWEiIChfX3JlcykgXAorCTogImkiIChfX05SXyMjbmFtZSksICJhIiAoYXJnMCksICJhIiAoYXJnMSkgXAorCTogImEyIiwgImEzIiwgImE0IiBcCisJKTsgXAorX19zeXNjYWxsX3JldHVybih0eXBlLF9fcmVzKTsgXAorfQorCisjZGVmaW5lIF9zeXNjYWxsMyh0eXBlLG5hbWUsdHlwZTAsYXJnMCx0eXBlMSxhcmcxLHR5cGUyLGFyZzIpIFwKK3R5cGUgbmFtZSh0eXBlMCBhcmcwLHR5cGUxIGFyZzEsdHlwZTIgYXJnMikgXAoreyBcCitsb25nIF9fcmVzOyBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkiICBtb3YgICBhNSwgJTIgXG4iIFwKKwkiICBtb3YgICBhNCwgJTQgXG4iIFwKKwkiICBtb3YgICBhMywgJTMgXG4iIFwKKwkiICBtb3ZpICBhMiwgJTEgXG4iIFwKKwkiICBzeXNjYWxsICAgICAgXG4iIFwKKwkiICBtb3YgICAlMCwgYTIgXG4iIFwKKwk6ICI9YSIgKF9fcmVzKSBcCisJOiAiaSIgKF9fTlJfIyNuYW1lKSwgImEiIChhcmcwKSwgImEiIChhcmcxKSwgImEiIChhcmcyKSBcCisJOiAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiIFwKKwkpOyBcCitfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCit9CisKKyNkZWZpbmUgX3N5c2NhbGw0KHR5cGUsbmFtZSx0eXBlMCxhcmcwLHR5cGUxLGFyZzEsdHlwZTIsYXJnMix0eXBlMyxhcmczKSBcCit0eXBlIG5hbWUodHlwZTAgYXJnMCx0eXBlMSBhcmcxLHR5cGUyIGFyZzIsdHlwZTMgYXJnMykgXAoreyBcCitsb25nIF9fcmVzOyBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkiICBtb3YgICBhNiwgJTIgXG4iIFwKKwkiICBtb3YgICBhNSwgJTUgXG4iIFwKKwkiICBtb3YgICBhNCwgJTQgXG4iIFwKKwkiICBtb3YgICBhMywgJTMgXG4iIFwKKwkiICBtb3ZpICBhMiwgJTEgXG4iIFwKKwkiICBzeXNjYWxsICAgICAgXG4iIFwKKwkiICBtb3YgICAlMCwgYTIgXG4iIFwKKwk6ICI9YSIgKF9fcmVzKSBcCisJOiAiaSIgKF9fTlJfIyNuYW1lKSwgImEiIChhcmcwKSwgImEiIChhcmcxKSwgImEiIChhcmcyKSwgImEiIChhcmczKSBcCisJOiAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAiYTYiIFwKKwkpOyBcCitfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCit9CisKKy8qIE5vdGUgdGhhdCB3ZSBzYXZlIGFuZCByZXN0b3JlIHRoZSBhNyBmcmFtZSBwb2ludGVyLgorICogSW5jbHVkaW5nIGE3IGluIHRoZSBjbG9iYmVyIGxpc3QgZG9lc24ndCBkbyB3aGF0IHlvdSdkIGV4cGVjdC4KKyAqLworI2RlZmluZSBfc3lzY2FsbDUodHlwZSxuYW1lLHR5cGUwLGFyZzAsdHlwZTEsYXJnMSx0eXBlMixhcmcyLHR5cGUzLGFyZzMsdHlwZTQsYXJnNCkgXAordHlwZSBuYW1lKHR5cGUwIGFyZzAsdHlwZTEgYXJnMSx0eXBlMiBhcmcyLHR5cGUzIGFyZzMsdHlwZTQgYXJnNCkgXAoreyBcCitsb25nIF9fcmVzOyBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkiICBtb3YgICBhOSwgYTcgXG4iIFwKKwkiICBtb3YgICBhNywgJTIgXG4iIFwKKwkiICBtb3YgICBhNiwgJTYgXG4iIFwKKwkiICBtb3YgICBhNSwgJTUgXG4iIFwKKwkiICBtb3YgICBhNCwgJTQgXG4iIFwKKwkiICBtb3YgICBhMywgJTMgXG4iIFwKKwkiICBtb3ZpICBhMiwgJTEgXG4iIFwKKwkiICBzeXNjYWxsICAgICAgXG4iIFwKKwkiICBtb3YgICBhNywgYTkgXG4iIFwKKwkiICBtb3YgICAlMCwgYTIgXG4iIFwKKwk6ICI9YSIgKF9fcmVzKSBcCisJOiAiaSIgKF9fTlJfIyNuYW1lKSwgImEiIChhcmcwKSwgImEiIChhcmcxKSwgImEiIChhcmcyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIgKGFyZzMpLCAiYSIgKGFyZzQpIFwKKwk6ICJhMiIsICJhMyIsICJhNCIsICJhNSIsICJhNiIsICJhOSIgXAorCSk7IFwKK19fc3lzY2FsbF9yZXR1cm4odHlwZSxfX3Jlcyk7IFwKK30KKworLyogTm90ZSB0aGF0IHdlIHNhdmUgYW5kIHJlc3RvcmUgdGhlIGE3IGZyYW1lIHBvaW50ZXIuCisgKiBJbmNsdWRpbmcgYTcgaW4gdGhlIGNsb2JiZXIgbGlzdCBkb2Vzbid0IGRvIHdoYXQgeW91J2QgZXhwZWN0LgorICovCisjZGVmaW5lIF9zeXNjYWxsNih0eXBlLG5hbWUsdHlwZTAsYXJnMCx0eXBlMSxhcmcxLHR5cGUyLGFyZzIsdHlwZTMsYXJnMyx0eXBlNCxhcmc0LHR5cGU1LGFyZzUpIFwKK3R5cGUgbmFtZSh0eXBlMCBhcmcwLHR5cGUxIGFyZzEsdHlwZTIgYXJnMix0eXBlMyBhcmczLHR5cGU0IGFyZzQsdHlwZTUgYXJnNSkgXAoreyBcCitsb25nIF9fcmVzOyBcCitfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKKwkiICBtb3YgICBhOSwgYTcgXG4iIFwKKwkiICBtb3YgICBhOCwgJTIgXG4iIFwKKwkiICBtb3YgICBhNywgJTcgXG4iIFwKKwkiICBtb3YgICBhNiwgJTYgXG4iIFwKKwkiICBtb3YgICBhNSwgJTUgXG4iIFwKKwkiICBtb3YgICBhNCwgJTQgXG4iIFwKKwkiICBtb3YgICBhMywgJTMgXG4iIFwKKwkiICBtb3ZpICBhMiwgJTEgXG4iIFwKKwkiICBzeXNjYWxsICAgICAgXG4iIFwKKwkiICBtb3YgICBhNywgYTkgXG4iIFwKKwkiICBtb3YgICAlMCwgYTIgXG4iIFwKKwk6ICI9YSIgKF9fcmVzKSBcCisJOiAiaSIgKF9fTlJfIyNuYW1lKSwgImEiIChhcmcwKSwgImEiIChhcmcxKSwgImEiIChhcmcyKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSIgKGFyZzMpLCAiYSIgKGFyZzQpLCAiYSIgKGFyZzUpICBcCisJOiAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAiYTYiLCAiYTgiLCAiYTkiIFwKKwkpOyBcCitfX3N5c2NhbGxfcmV0dXJuKHR5cGUsX19yZXMpOyBcCit9CisKKworI2lmZGVmIF9fS0VSTkVMX1NZU0NBTExTX18KK3N0YXRpYyBfX2lubGluZV9fIF9zeXNjYWxsMyhpbnQsZXhlY3ZlLGNvbnN0IGNoYXIqLGZpbGUsY2hhcioqLGFyZ3YsY2hhcioqLGVudnApCisjZW5kaWYKKworLyoKKyAqICJDb25kaXRpb25hbCIgc3lzY2FsbHMKKyAqCisgKiBXaGF0IHdlIHdhbnQgaXMgX19hdHRyaWJ1dGVfXygod2VhayxhbGlhcygic3lzX25pX3N5c2NhbGwiKSkpLAorICogYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBhbGwgdG9vbGNoYWlucywgc28gd2UganVzdCBkbyBpdCBieSBoYW5kCisgKi8KKyNkZWZpbmUgY29uZF9zeXNjYWxsKHgpIGFzbSgiLndlYWtcdCIgI3ggIlxuXHQuc2V0XHQiICN4ICIsc3lzX25pX3N5c2NhbGwiKTsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgX19BUkNIX1dBTlRfU1RBVDY0CisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19VVElNRQorI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdBQ1RJT04KKyNlbmRpZgorCisjZW5kaWYJLyogX1hURU5TQV9VTklTVERfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3VzZXIuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzZWQyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS91c2VyLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS91c2VyLmgKKyAqCisgKiBYdGVuc2EgUHJvY2Vzc29yIHZlcnNpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9VU0VSX0gKKyNkZWZpbmUgX1hURU5TQV9VU0VSX0gKKworLyogVGhpcyBmaWxlIHVzdWFsbHkgZGVmaW5lcyBhICdzdHJ1Y3QgdXNlcicgc3RydWN0dXJlLiBIb3dldmVyLCBpdCBpdCBvbmx5CisgKiB1c2VkIGZvciBhLm91dCBmaWxlLCB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBvbiBYdGVuc2EuCisgKi8KKworI2VuZGlmCS8qIF9YVEVOU0FfVVNFUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvdmdhLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdmdhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkODJmNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS92Z2EuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogaW5jbHVkZS9hc20teHRlbnNhL3ZnYS5oCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNSBUZW5zaWxpY2EgSW5jLgorICovCisKKyNpZm5kZWYgX1hURU5TQV9WR0FfSAorI2RlZmluZSBfWFRFTlNBX1ZHQV9ICisKKyNkZWZpbmUgVkdBX01BUF9NRU0oeCkgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCisKKyNkZWZpbmUgdmdhX3JlYWRiKHgpCSgqKHgpKQorI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkJKCooeSkgPSAoeCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3hvci5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3hvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YjFmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveG9yLmgKQEAgLTAsMCArMSwxNiBAQAorLyoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS94b3IuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDUgVGVuc2lsaWNhIEluYy4KKyAqLworCisjaWZuZGVmIF9YVEVOU0FfWE9SX0gKKyNkZWZpbmUgX1hURU5TQV9YT1JfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMveG9yLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jYWNoZWFzbS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jYWNoZWFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZGJiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NhY2hlYXNtLmgKQEAgLTAsMCArMSw3MDggQEAKKyNpZm5kZWYgWFRFTlNBX0NBQ0hFQVNNX0gKKyNkZWZpbmUgWFRFTlNBX0NBQ0hFQVNNX0gKKworLyoKKyAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECisgKgorICogaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jYWNoZWFzbS5oIC0tIGFzc2VtYmxlci1zcGVjaWZpYyBjYWNoZQorICogcmVsYXRlZCBkZWZpbml0aW9ucyB0aGF0IGRlcGVuZCBvbiBDT1JFIGNvbmZpZ3VyYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworCisjaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKworCisvKgorICogIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhc3NlbWJsZXIgbWFjcm9zIG9mIHRoZSBmb3JtOgorICoJPHg+Y2FjaGVfPGZ1bmM+CisgKiAgd2hlcmUgPHg+IGlzICdpJyBvciAnZCcgZm9yIGluc3RydWN0aW9uIGFuZCBkYXRhIGNhY2hlcywKKyAqICBhbmQgPGZ1bmM+IGluZGljYXRlcyB0aGUgZnVuY3Rpb24gb2YgdGhlIG1hY3JvLgorICoKKyAqICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyA8ZnVuYz4gYXJlIGRlZmluZWQsCisgKiAgYW5kIGFwcGx5IG9ubHkgdG8gdGhlIHNwZWNpZmllZCBjYWNoZSAoSSBvciBEKToKKyAqCisgKiAgcmVzZXQKKyAqCVJlc2V0cyB0aGUgY2FjaGUuCisgKgorICogIHN5bmMKKyAqCU1ha2VzIHN1cmUgYW55IHByZXZpb3VzIGNhY2hlIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkOworICoJaWUuIG1ha2VzIHN1cmUgYW55IHByZXZpb3VzIGNhY2hlIGNvbnRyb2wgb3BlcmF0aW9ucworICoJaGF2ZSBoYWQgZnVsbCBlZmZlY3QgYW5kIGJlZW4gc3luY2hyb25pemVkIHRvIG1lbW9yeS4KKyAqCUVnLiBhbnkgaW52YWxpZGF0ZSBjb21wbGV0ZWQgW3NvIGFzIG5vdCB0byBnZW5lcmF0ZSBhIGhpdF0sCisgKglhbnkgd3JpdGViYWNrcyBvciBvdGhlciBwaXBlbGluZWQgd3JpdGVzIHdyaXR0ZW4gdG8gbWVtb3J5LCBldGMuCisgKgorICogIGludmFsaWRhdGVfbGluZQkJKHNpbmdsZSBjYWNoZSBsaW5lKQorICogIGludmFsaWRhdGVfcmVnaW9uCQkoc3BlY2lmaWVkIG1lbW9yeSByYW5nZSkKKyAqICBpbnZhbGlkYXRlX2FsbAkJKGVudGlyZSBjYWNoZSkKKyAqCUludmFsaWRhdGVzIGFsbCBjYWNoZSBlbnRyaWVzIHRoYXQgY2FjaGUKKyAqCWRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZS4KKyAqCU5PVEU6IGxvY2tlZCBlbnRyaWVzIGFyZSBub3QgaW52YWxpZGF0ZWQuCisgKgorICogIHdyaXRlYmFja19saW5lCQkoc2luZ2xlIGNhY2hlIGxpbmUpCisgKiAgd3JpdGViYWNrX3JlZ2lvbgkJKHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UpCisgKiAgd3JpdGViYWNrX2FsbAkJKGVudGlyZSBjYWNoZSkKKyAqCVdyaXRlcyBiYWNrIHRvIG1lbW9yeSBhbGwgZGlydHkgY2FjaGUgZW50cmllcworICoJdGhhdCBjYWNoZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UsCisgKglhbmQgbWFya3MgdGhlc2UgZW50cmllcyBhcyBjbGVhbi4KKyAqCU5PVEU6IG9uIHNvbWUgZnV0dXJlIGltcGxlbWVudGF0aW9ucywgdGhpcyBtaWdodAorICoJCWFsc28gaW52YWxpZGF0ZS4KKyAqCU5PVEU6IGxvY2tlZCBlbnRyaWVzIGFyZSB3cml0dGVuIGJhY2ssIGJ1dCBuZXZlciBpbnZhbGlkYXRlZC4KKyAqCU5PVEU6IGluc3RydWN0aW9uIGNhY2hlcyBuZXZlciBpbXBsZW1lbnQgd3JpdGViYWNrLgorICoKKyAqICB3cml0ZWJhY2tfaW52X2xpbmUJCShzaW5nbGUgY2FjaGUgbGluZSkKKyAqICB3cml0ZWJhY2tfaW52X3JlZ2lvbgkoc3BlY2lmaWVkIG1lbW9yeSByYW5nZSkKKyAqICB3cml0ZWJhY2tfaW52X2FsbAkJKGVudGlyZSBjYWNoZSkKKyAqCVdyaXRlcyBiYWNrIHRvIG1lbW9yeSBhbGwgZGlydHkgY2FjaGUgZW50cmllcworICoJdGhhdCBjYWNoZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UsCisgKglhbmQgaW52YWxpZGF0ZXMgdGhlc2UgZW50cmllcyAoaW5jbHVkaW5nIGFsbCBjbGVhbgorICoJY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGRhdGEgZnJvbSB0aGF0IHJhbmdlKS4KKyAqCU5PVEU6IGxvY2tlZCBlbnRyaWVzIGFyZSB3cml0dGVuIGJhY2sgYnV0IG5vdCBpbnZhbGlkYXRlZC4KKyAqCU5PVEU6IGluc3RydWN0aW9uIGNhY2hlcyBuZXZlciBpbXBsZW1lbnQgd3JpdGViYWNrLgorICoKKyAqICBsb2NrX2xpbmUJCQkoc2luZ2xlIGNhY2hlIGxpbmUpCisgKiAgbG9ja19yZWdpb24JCQkoc3BlY2lmaWVkIG1lbW9yeSByYW5nZSkKKyAqCVByZWZldGNoIGFuZCBsb2NrIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlIGludG8gY2FjaGUuCisgKglOT1RFOiAgaWYgYW55IHBhcnQgb2YgdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UgY2Fubm90CisgKgliZSBsb2NrZWQsIGEgPz8/IGV4Y2VwdGlvbiBvY2N1cnMuICBUaGVzZSBtYWNyb3MgZG9uJ3QKKyAqCWRvIGFueXRoaW5nIHNwZWNpYWwgKHlldCBhbnl3YXkpIHRvIGhhbmRsZSB0aGlzIHNpdHVhdGlvbi4KKyAqCisgKiAgdW5sb2NrX2xpbmUJCQkoc2luZ2xlIGNhY2hlIGxpbmUpCisgKiAgdW5sb2NrX3JlZ2lvbgkJKHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UpCisgKiAgdW5sb2NrX2FsbAkJCShlbnRpcmUgY2FjaGUpCisgKglVbmxvY2sgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlLgorICoJRW50cmllcyBub3QgYWxyZWFkeSBsb2NrZWQgYXJlIHVuYWZmZWN0ZWQuCisgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogICBHRU5FUklDIC0tIEFMTCBDQUNIRVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhc3N1bWUgdGhlIGZvbGxvd2luZyBjYWNoZSBzaXplL3BhcmFtZXRlciBsaW1pdHMKKyAqICBpbiB0aGUgY3VycmVudCBYdGVuc2EgY29yZSBpbXBsZW1lbnRhdGlvbjoKKyAqCWNhY2hlIHNpemU6CTEwMjQgYnl0ZXMgbWluaW11bQorICoJbGluZSBzaXplOgkxNiAtIDY0IGJ5dGVzCisgKgl3YXkgY291bnQ6CTEgLSA0CisgKgorICogIE1pbmltdW0gZW50cmllcyBwZXIgd2F5IChpZS4gcGVyIGFzc29jaWF0aXZpdHkpID0gMTAyNCAvIDY0IC8gNCA9IDQKKyAqICBIZW5jZSB0aGUgYXNzdW1wdGlvbiB0aGF0IGVhY2ggbG9vcCBjYW4gZXhlY3V0ZSBmb3VyIGNhY2hlIGluc3RydWN0aW9ucy4KKyAqCisgKiAgQ29ycmVzcG9uZGluZ2x5LCB0aGUgb2Zmc2V0IHJhbmdlIG9mIGluc3RydWN0aW9ucyBpcyBhc3N1bWVkIGFibGUgdG8gY292ZXIKKyAqICBmb3VyIGxpbmVzLCBpZS4gb2Zmc2V0cyB7MCwxLDIsM30gKiBsaW5lX3NpemUgYXJlIGFzc3VtZWQgdmFsaWQgZm9yCisgKiAgYm90aCBoaXQgYW5kIGluZGV4ZWQgY2FjaGUgaW5zdHJ1Y3Rpb25zLiAgSWUuIHRoZXNlIG9mZnNldHMgYXJlIGFsbAorICogIHZhbGlkOiAgMCwgMTYsIDMyLCA0OCwgNjQsIDk2LCAxMjgsIDE5MiAoZm9yIGxpbmUgc2l6ZXMgMTYsIDMyLCA2NCkuCisgKiAgVGhpcyBpcyB0cnVlIG9mIGFsbCBvcmlnaW5hbCBjYWNoZSBpbnN0cnVjdGlvbnMKKyAqICAoZGhpLCBpaGksIGRod2IsIGRod2JpLCBkaWksIGlpaSkgd2hpY2ggaGF2ZSBvZmZzZXRzCisgKiAgb2YgMCB0byAxMDIwIGluIG11bHRpcGxlcyBvZiA0IChpZS4gOCBiaXRzIHNoaWZ0ZWQgYnkgMikuCisgKiAgVGhpcyBpcyBhbHNvIHRydWUgb2Ygc3Vic2VxdWVudCBjYWNoZSBpbnN0cnVjdGlvbnMKKyAqICAoZGh1LCBpaHUsIGRpdSwgaWl1LCBkaXdiLCBkaXdiaSwgZHBmbCwgaXBmbCkgd2hpY2ggaGF2ZSBvZmZzZXRzCisgKiAgb2YgMCB0byAyNDAgaW4gbXVsdGlwbGVzIG9mIDE2IChpZS4gNCBiaXRzIHNoaWZ0ZWQgYnkgNCkuCisgKgorICogIChNYXhpbXVtIGNhY2hlIHNpemUsIGN1cnJlbnRseSAzMmssIGRvZXNuJ3QgYWZmZWN0IHRoZSBmb2xsb3dpbmcgbWFjcm9zLgorICogIENhY2hlIHdheXMgPiBNTVUgbWluIHBhZ2Ugc2l6ZSBjYXVzZSBhbGlhc2luZyBidXQgdGhhdCdzIGFub3RoZXIgbWF0dGVyLikKKyAqLworCisKKworLyoKKyAqICBNYWNybyB0byBhcHBseSBhbiAnaW5kZXhlZCcgY2FjaGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGVudGlyZSBjYWNoZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCWNhaW5zdAkJaW5zdHJ1Y3Rpb24vIHRoYXQgdGFrZXMgYW4gYWRkcmVzcyByZWdpc3RlciBwYXJhbWV0ZXIKKyAqCQkJYW5kIGFuIG9mZnNldCBwYXJhbWV0ZXIgKGluIHJhbmdlIDAgLi4gMypsaW5lc2l6ZSkuCisgKglzaXplCQlzaXplIG9mIGNhY2hlIGluIGJ5dGVzCisgKglsaW5lc2l6ZQlzaXplIG9mIGNhY2hlIGxpbmUgaW4gYnl0ZXMKKyAqCWFzc29jX29yMQludW1iZXIgb2YgYXNzb2NpYXRpdml0aWVzICh3YXlzL3NldHMpIGluIGNhY2hlCisgKgkJCWlmIGFsbCBzZXRzIGFmZmVjdGVkIGJ5IGNhaW5zdCwKKyAqCQkJb3IgMSBpZiBvbmx5IG9uZSBzZXQgKG9yIG5vdCBhbGwgc2V0cykgb2YgdGhlIGNhY2hlCisgKgkJCWlzIGFmZmVjdGVkIGJ5IGNhaW5zdCAoZWcuIERJV0Igb3IgRElXQkkgW25vdCB5ZXQgSVNBIGRlZmluZWRdKS4KKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCisJLm1hY3JvCWNhY2hlX2luZGV4X2FsbAkJY2FpbnN0LCBzaXplLCBsaW5lc2l6ZSwgYXNzb2Nfb3IxLCBhYSwgYWIKKworCS8vICBTYW5pdHktY2hlY2sgb24gY2FjaGUgcGFyYW1ldGVyczoKKwkuaWZuZQkoXHNpemUgJSAoXGxpbmVzaXplICogXGFzc29jX29yMSAqIDQpKQorCS5lcnIJLy8gIGNhY2hlIGNvbmZpZ3VyYXRpb24gb3V0c2lkZSBleHBlY3RlZC9zdXBwb3J0ZWQgcmFuZ2UhCisJLmVuZGlmCisKKwkvLyAgXHNpemUgYnl0ZSBjYWNoZSwgXGxpbmVzaXplIGJ5dGUgbGluZXMsIFxhc3NvY19vcjEgd2F5KHMpIGFmZmVjdGVkIGJ5IGVhY2ggXGNhaW5zdC4KKwltb3ZpCVxhYSwgKFxzaXplIC8gKFxsaW5lc2l6ZSAqIFxhc3NvY19vcjEgKiA0KSkKKwkvLyBQb3NzaWJsZSBpbXByb3ZlbWVudDogbmVlZCBvbmx5IGxvb3AgaWYgXGFhID4gMSA7CisJLy8gaG93ZXZlciB0aGF0IHBhcnRpY3VsYXIgY29uZGl0aW9uIGlzIGhpZ2hseSB1bmxpa2VseS4KKwltb3ZpCVxhYiwgMAkJLy8gdG8gaXRlcmF0ZSBvdmVyIGNhY2hlCisJZmxvb3AJCVxhYSwgY2FjaGV4XEAKKwlcY2FpbnN0CQlcYWIsIDAqXGxpbmVzaXplCisJXGNhaW5zdAkJXGFiLCAxKlxsaW5lc2l6ZQorCVxjYWluc3QJCVxhYiwgMipcbGluZXNpemUKKwlcY2FpbnN0CQlcYWIsIDMqXGxpbmVzaXplCisJYWRkaQkJXGFiLCBcYWIsIDQqXGxpbmVzaXplCS8vIG1vdmUgdG8gbmV4dCBsaW5lCisJZmxvb3BlbmQJXGFhLCBjYWNoZXhcQAorCisJLmVuZG0KKworCisvKgorICogIE1hY3JvIHRvIGFwcGx5IGEgJ2hpdCcgY2FjaGUgaW5zdHJ1Y3Rpb24gdG8gYSBtZW1vcnkgcmVnaW9uLAorICogIGllLiB0byBhbnkgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGEgc3BlY2lmaWVkIHBvcnRpb24gKHJlZ2lvbikgb2YgbWVtb3J5LgorICogIFRha2VzIGNhcmUgb2YgdGhlIHVuYWxpZ25lZCBjYXNlcywgaWUuIG1heSBhcHBseSB0byBvbmUKKyAqICBtb3JlIGNhY2hlIGxpbmUgdGhhbiAkYXNpemUgLyBsaW5lU2l6ZSBpZiAkYWFkZHIgaXMgbm90IGFsaWduZWQuCisgKgorICoKKyAqICBQYXJhbWV0ZXJzIGFyZToKKyAqCWNhaW5zdAlpbnN0cnVjdGlvbi9tYWNybyB0aGF0IHRha2VzIGFuIGFkZHJlc3MgcmVnaXN0ZXIgcGFyYW1ldGVyCisgKgkJYW5kIGFuIG9mZnNldCBwYXJhbWV0ZXIgKGN1cnJlbnRseSBhbHdheXMgemVybykKKyAqCQlhbmQgZ2VuZXJhdGVzIGEgY2FjaGUgaW5zdHJ1Y3Rpb24gKGVnLiAiZGhpIiwgImRod2IiLCAiaWhpIiwgZXRjLikKKyAqCWxpbmVzaXplX2xvZzIJbG9nMihzaXplIG9mIGNhY2hlIGxpbmUgaW4gYnl0ZXMpCisgKglhZGRyCXJlZ2lzdGVyIGNvbnRhaW5pbmcgc3RhcnQgYWRkcmVzcyBvZiByZWdpb24gKGNsb2JiZXJlZCkKKyAqCWFzaXplCXJlZ2lzdGVyIGNvbnRhaW5pbmcgc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChjbG9iYmVyZWQpCisgKglhc2tldwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKKyAqCisgKiAhPyE/ISAyRE86IG9wdGltaXphdGlvbjogaXRlcmF0ZSBtYXgoY2FjaGVfc2l6ZSBhbmQgXGFzaXplKSAvIGxpbmVzaXplCisgKi8KKworCS5tYWNybwljYWNoZV9oaXRfcmVnaW9uCWNhaW5zdCwgbGluZXNpemVfbG9nMiwgYWRkciwgYXNpemUsIGFza2V3CisKKwkvLyAgTWFrZSBcYXNpemUgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zOgorCWV4dHVpCVxhc2tldywgXGFkZHIsIDAsIFxsaW5lc2l6ZV9sb2cyCS8vIGdldCB1bmFsaWdubWVudCBhbW91bnQgb2YgXGFkZHIKKwlhZGQJXGFzaXplLCBcYXNpemUsIFxhc2tldwkJCS8vIC4uLiBhbmQgYWRkIGl0IHRvIFxhc2l6ZQorCWFkZGkJXGFzaXplLCBcYXNpemUsICgxIDw8IFxsaW5lc2l6ZV9sb2cyKSAtIDEJLy8gcm91bmQgdXAhCisJc3JsaQlcYXNpemUsIFxhc2l6ZSwgXGxpbmVzaXplX2xvZzIKKworCS8vICBJdGVyYXRlIG92ZXIgcmVnaW9uOgorCWZsb29wbmV6CVxhc2l6ZSwgY2FjaGVoXEAKKwlcY2FpbnN0CQlcYWRkciwgMAorCWFkZGkJCVxhZGRyLCBcYWRkciwgKDEgPDwgXGxpbmVzaXplX2xvZzIpCS8vIG1vdmUgdG8gbmV4dCBsaW5lCisJZmxvb3BlbmQJXGFzaXplLCBjYWNoZWhcQAorCisJLmVuZG0KKworCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgSU5TVFJVQ1RJT04gQ0FDSEUgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqICBSZXNldC9pbml0aWFsaXplIHRoZSBpbnN0cnVjdGlvbiBjYWNoZSBieSBzaW1wbHkgaW52YWxpZGF0aW5nIGl0OgorICogIChuZWVkIHRvIHVubG9jayBmaXJzdCBhbHNvLCBpZiBjYWNoZSBsb2NraW5nIGltcGxlbWVudGVkKToKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlpY2FjaGVfcmVzZXQJYWEsIGFiCisJaWNhY2hlX3VubG9ja19hbGwJXGFhLCBcYWIKKwlpY2FjaGVfaW52YWxpZGF0ZV9hbGwJXGFhLCBcYWIKKwkuZW5kbQorCisKKy8qCisgKiBTeW5jaHJvbml6ZSBhZnRlciBhbiBpbnN0cnVjdGlvbiBjYWNoZSBvcGVyYXRpb24sCisgKiB0byBiZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gc3luYyB3aXRoIG1lbW9yeSBhcyB0byBiZQorICogZXhwZWN0ZWQgZm9sbG93aW5nIGFueSBwcmV2aW91cyBpbnN0cnVjdGlvbiBjYWNoZSBjb250cm9sIG9wZXJhdGlvbnMuCisgKgorICogUGFyYW1ldGVycyBhcmU6CisgKglhcglhbiBhZGRyZXNzIHJlZ2lzdGVyICh0ZW1wb3JhcnkpIChjdXJyZW50bHkgdW51c2VkLCBidXQgbWF5IGJlIHVzZWQgaW4gZnV0dXJlKQorICovCisJLm1hY3JvCWljYWNoZV9zeW5jCWFyCisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCisJaXN5bmMKKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIEludmFsaWRhdGUgYSBzaW5nbGUgbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKiAgUGFyYW1ldGVycyBhcmU6CisgKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gaW52YWxpZGF0ZQorICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCisgKglvZmZzZXQJKG9wdGlvbmFsKSBvZmZzZXQgdG8gYWRkIHRvIFxhciB0byBjb21wdXRlIGVmZmVjdGl2ZSBhZGRyZXNzIHRvIGludmFsaWRhdGUKKyAqCQkobm90ZTogc29tZSBudW1iZXIgb2YgbHNiaXRzIGFyZSBpZ25vcmVkKQorICovCisJLm1hY3JvCWljYWNoZV9pbnZhbGlkYXRlX2xpbmUJYXIsIG9mZnNldAorI2lmIFhDSEFMX0lDQUNIRV9TSVpFID4gMAorCWloaQlcYXIsIFxvZmZzZXQJCS8vIGludmFsaWRhdGUgaWNhY2hlIGxpbmUKKwkvKgorCSAqICBOT1RFOiAgaW4gc29tZSB2ZXJzaW9uIG9mIHRoZSBzaWxpY29uIFshISFTSE9VTEQgSEFWRSBCRUVOIERPQ1VNRU5URUQhISFdCisJICogICdpaGknIGRvZXNuJ3Qgd29yaywgc28gaXQgaGFkIGJlZW4gcmVwbGFjZWQgd2l0aCAnaWlpJworCSAqICAod2hpY2ggd291bGQganVzdCBpbnZhbGlkYXRlIG1vcmUgdGhhbiBpdCBzaG91bGQsCisJICogIHdoaWNoIHNob3VsZCBiZSBva2F5IG90aGVyIHRoYW4gdGhlIHBlcmZvcm1hbmNlIGhpdAorCSAqICBiZWNhdXNlIGNhY2hlIGxvY2tpbmcgZGlkIG5vdCBleGlzdCBpbiB0aGF0IHZlcnNpb24sCisJICogIHVubGVzcyB1c2VyIHNvbWVob3cgcmVsaWVzIG9uIHNvbWV0aGluZyBiZWluZyBjYWNoZWQpLgorCSAqICBbV0hBVCBWRVJTSU9OIElTIElUISE/IT8KKwkgKiAgSVMgVEhFUkUgQU5ZIFdBWSBUTyBURVNUIEZPUiBUSEFUIEhFUkUsIFRPIE9VVFBVVCAnSUlJJyBPTkxZIElGIE5FRURFRCE/IT9dLgorCSAqCisJICoJaWlpCVxhciwgXG9mZnNldAorCSAqLworCWljYWNoZV9zeW5jCVxhcgorI2VuZGlmCisJLmVuZG0KKworCisKKworLyoKKyAqICBJbnZhbGlkYXRlIGluc3RydWN0aW9uICBjYWNoZSBlbnRyaWVzIHRoYXQgY2FjaGUgYSBzcGVjaWZpZWQgcG9ydGlvbiBvZiBtZW1vcnkuCisgKiAgUGFyYW1ldGVycyBhcmU6CisgKglhc3RhcnQJc3RhcnQgYWRkcmVzcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCisgKglhc2l6ZQlzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQorICoJYWMJdW5pcXVlIHJlZ2lzdGVyIHVzZWQgYXMgdGVtcG9yYXJ5CisgKi8KKwkubWFjcm8JaWNhY2hlX2ludmFsaWRhdGVfcmVnaW9uCWFzdGFydCwgYXNpemUsIGFjCisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCisJLy8gIEluc3RydWN0aW9uIGNhY2hlIHJlZ2lvbiBpbnZhbGlkYXRpb246CisJY2FjaGVfaGl0X3JlZ2lvbglpaGksIFhDSEFMX0lDQUNIRV9MSU5FV0lEVEgsIFxhc3RhcnQsIFxhc2l6ZSwgXGFjCisJaWNhY2hlX3N5bmMJXGFjCisJLy8gIEVuZCBvZiBpbnN0cnVjdGlvbiBjYWNoZSByZWdpb24gaW52YWxpZGF0aW9uCisjZW5kaWYKKwkuZW5kbQorCisKKworLyoKKyAqICBJbnZhbGlkYXRlIGVudGlyZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlpY2FjaGVfaW52YWxpZGF0ZV9hbGwJYWEsIGFiCisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwCisJLy8gIEluc3RydWN0aW9uIGNhY2hlIGludmFsaWRhdGlvbjoKKwljYWNoZV9pbmRleF9hbGwJCWlpaSwgWENIQUxfSUNBQ0hFX1NJWkUsIFhDSEFMX0lDQUNIRV9MSU5FU0laRSwgWENIQUxfSUNBQ0hFX1dBWVMsIFxhYSwgXGFiCisJaWNhY2hlX3N5bmMJXGFhCisJLy8gIEVuZCBvZiBpbnN0cnVjdGlvbiBjYWNoZSBpbnZhbGlkYXRpb24KKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIExvY2sgKHByZWZldGNoICYgbG9jaykgYSBzaW5nbGUgbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKgorICogIFBhcmFtZXRlcnMgYXJlOgorICoJYXIJYWRkcmVzcyByZWdpc3RlciB0aGF0IGNvbnRhaW5zICh2aXJ0dWFsKSBhZGRyZXNzIHRvIGxvY2sKKyAqCQkobWF5IGdldCBjbG9iYmVyZWQgaW4gYSBmdXR1cmUgaW1wbGVtZW50YXRpb24sIGJ1dCBub3QgY3VycmVudGx5KQorICoJb2Zmc2V0CW9mZnNldCB0byBhZGQgdG8gXGFyIHRvIGNvbXB1dGUgZWZmZWN0aXZlIGFkZHJlc3MgdG8gbG9jaworICoJCShub3RlOiBzb21lIG51bWJlciBvZiBsc2JpdHMgYXJlIGlnbm9yZWQpCisgKi8KKwkubWFjcm8JaWNhY2hlX2xvY2tfbGluZQlhciwgb2Zmc2V0CisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwICYmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCisJaXBmbAlcYXIsIFxvZmZzZXQJLyogcHJlZmV0Y2ggYW5kIGxvY2sgaWNhY2hlIGxpbmUgKi8KKwlpY2FjaGVfc3luYwlcYXIKKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIExvY2sgKHByZWZldGNoICYgbG9jaykgYSBzcGVjaWZpZWQgcG9ydGlvbiBvZiBtZW1vcnkgaW50byB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKiAgUGFyYW1ldGVycyBhcmU6CisgKglhc3RhcnQJc3RhcnQgYWRkcmVzcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCisgKglhc2l6ZQlzaXplIG9mIHRoZSByZWdpb24gaW4gYnl0ZXMgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQorICoJYWMJdW5pcXVlIHJlZ2lzdGVyIHVzZWQgYXMgdGVtcG9yYXJ5CisgKi8KKwkubWFjcm8JaWNhY2hlX2xvY2tfcmVnaW9uCWFzdGFydCwgYXNpemUsIGFjCisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwICYmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCisJLy8gIEluc3RydWN0aW9uIGNhY2hlIHJlZ2lvbiBsb2NrOgorCWNhY2hlX2hpdF9yZWdpb24JaXBmbCwgWENIQUxfSUNBQ0hFX0xJTkVXSURUSCwgXGFzdGFydCwgXGFzaXplLCBcYWMKKwlpY2FjaGVfc3luYwlcYWMKKwkvLyAgRW5kIG9mIGluc3RydWN0aW9uIGNhY2hlIHJlZ2lvbiBsb2NrCisjZW5kaWYKKwkuZW5kbQorCisKKworLyoKKyAqICBVbmxvY2sgYSBzaW5nbGUgbGluZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUuCisgKgorICogIFBhcmFtZXRlcnMgYXJlOgorICoJYXIJYWRkcmVzcyByZWdpc3RlciB0aGF0IGNvbnRhaW5zICh2aXJ0dWFsKSBhZGRyZXNzIHRvIHVubG9jaworICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCisgKglvZmZzZXQJb2Zmc2V0IHRvIGFkZCB0byBcYXIgdG8gY29tcHV0ZSBlZmZlY3RpdmUgYWRkcmVzcyB0byB1bmxvY2sKKyAqCQkobm90ZTogc29tZSBudW1iZXIgb2YgbHNiaXRzIGFyZSBpZ25vcmVkKQorICovCisJLm1hY3JvCWljYWNoZV91bmxvY2tfbGluZQlhciwgb2Zmc2V0CisjaWYgWENIQUxfSUNBQ0hFX1NJWkUgPiAwICYmIFhDSEFMX0lDQUNIRV9MSU5FX0xPQ0tBQkxFCisJaWh1CVxhciwgXG9mZnNldAkvKiB1bmxvY2sgaWNhY2hlIGxpbmUgKi8KKwlpY2FjaGVfc3luYwlcYXIKKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIFVubG9jayBhIHNwZWNpZmllZCBwb3J0aW9uIG9mIG1lbW9yeSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAqICBQYXJhbWV0ZXJzIGFyZToKKyAqCWFzdGFydAlzdGFydCBhZGRyZXNzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKKyAqCWFzaXplCXNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCisgKglhYwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKKyAqLworCS5tYWNybwlpY2FjaGVfdW5sb2NrX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYworI2lmIFhDSEFMX0lDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQorCS8vICBJbnN0cnVjdGlvbiBjYWNoZSByZWdpb24gdW5sb2NrOgorCWNhY2hlX2hpdF9yZWdpb24JaWh1LCBYQ0hBTF9JQ0FDSEVfTElORVdJRFRILCBcYXN0YXJ0LCBcYXNpemUsIFxhYworCWljYWNoZV9zeW5jCVxhYworCS8vICBFbmQgb2YgaW5zdHJ1Y3Rpb24gY2FjaGUgcmVnaW9uIHVubG9jaworI2VuZGlmCisJLmVuZG0KKworCisKKy8qCisgKiAgVW5sb2NrIGVudGlyZSBpbnN0cnVjdGlvbiBjYWNoZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlpY2FjaGVfdW5sb2NrX2FsbAlhYSwgYWIKKyNpZiBYQ0hBTF9JQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfSUNBQ0hFX0xJTkVfTE9DS0FCTEUKKwkvLyAgSW5zdHJ1Y3Rpb24gY2FjaGUgdW5sb2NrOgorCWNhY2hlX2luZGV4X2FsbAkJaWl1LCBYQ0hBTF9JQ0FDSEVfU0laRSwgWENIQUxfSUNBQ0hFX0xJTkVTSVpFLCAxLCBcYWEsIFxhYgorCWljYWNoZV9zeW5jCVxhYQorCS8vICBFbmQgb2YgaW5zdHJ1Y3Rpb24gY2FjaGUgdW5sb2NrCisjZW5kaWYKKwkuZW5kbQorCisKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogICBEQVRBIENBQ0hFICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyoKKyAqICBSZXNldC9pbml0aWFsaXplIHRoZSBkYXRhIGNhY2hlIGJ5IHNpbXBseSBpbnZhbGlkYXRpbmcgaXQKKyAqICAobmVlZCB0byB1bmxvY2sgZmlyc3QgYWxzbywgaWYgY2FjaGUgbG9ja2luZyBpbXBsZW1lbnRlZCk6CisgKgorICogIFBhcmFtZXRlcnM6CisgKglhYSwgYWIJCXVuaXF1ZSBhZGRyZXNzIHJlZ2lzdGVycyAodGVtcG9yYXJpZXMpCisgKi8KKwkubWFjcm8JZGNhY2hlX3Jlc2V0CWFhLCBhYgorCWRjYWNoZV91bmxvY2tfYWxsCVxhYSwgXGFiCisJZGNhY2hlX2ludmFsaWRhdGVfYWxsCVxhYSwgXGFiCisJLmVuZG0KKworCisKKworLyoKKyAqIFN5bmNocm9uaXplIGFmdGVyIGEgZGF0YSBjYWNoZSBvcGVyYXRpb24sCisgKiB0byBiZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgaW4gc3luYyB3aXRoIG1lbW9yeSBhcyB0byBiZQorICogZXhwZWN0ZWQgZm9sbG93aW5nIGFueSBwcmV2aW91cyBkYXRhIGNhY2hlIGNvbnRyb2wgb3BlcmF0aW9ucy4KKyAqCisgKiBQYXJhbWV0ZXJzIGFyZToKKyAqCWFyCWFuIGFkZHJlc3MgcmVnaXN0ZXIgKHRlbXBvcmFyeSkgKGN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtYXkgYmUgdXNlZCBpbiBmdXR1cmUpCisgKi8KKwkubWFjcm8JZGNhY2hlX3N5bmMJYXIKKyNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAKKwkvLyAgVGhpcyBwcmV2aW91cyBzZXF1ZW5jZSBlcnJzIG9uIHRoZSBjb25zZXJ2YXRpdmUgc2lkZSAodG9vIG11Y2ggc28pOyBhIERTWU5DIHNob3VsZCBiZSBzdWZmaWNpZW50OgorCS8vbWVtdwkJLy8gc3luY2hyb25pemUgZGF0YSBjYWNoZSBjaGFuZ2VzIHJlbGF0aXZlIHRvIHN1YnNlcXVlbnQgbWVtb3J5IGFjY2Vzc2VzCisJLy9pc3luYwkJLy8gYmUgY29uc2VydmF0aXZlIGFuZCBJU1lOQyBhcyB3ZWxsIChqdXN0IHRvIGJlIHN1cmUpCisKKwlkc3luYworI2VuZGlmCisJLmVuZG0KKworCisKKy8qCisgKiBTeW5jaHJvbml6ZSBhZnRlciBhIGRhdGEgc3RvcmUgb3BlcmF0aW9uLAorICogdG8gYmUgc3VyZSB0aGUgc3RvcmVkIGRhdGEgaXMgY29tcGxldGVseSBvZmYgdGhlIHByb2Nlc3NvcgorICogKGFuZCBhc3N1bWluZyB0aGVyZSBpcyBubyBidWZmZXJpbmcgb3V0c2lkZSB0aGUgcHJvY2Vzc29yLAorICogIHRoYXQgdGhlIGRhdGEgaXMgaW4gbWVtb3J5KS4gIFRoaXMgbWF5IGJlIHJlcXVpcmVkIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgcHJvY2Vzc29yJ3Mgd3JpdGUgYnVmZmVycyBhcmUgZW1wdGllZC4KKyAqIEEgTUVNVyBmb2xsb3dlZCBieSBhIHJlYWQgZ3VhcmFudGVlcyB0aGlzLCBieSBkZWZpbml0aW9uLgorICogV2UgYWxzbyB0cnkgdG8gbWFrZSBzdXJlIHRoZSByZWFkIGl0c2VsZiBjb21wbGV0ZXMuCisgKgorICogUGFyYW1ldGVycyBhcmU6CisgKglhcglhbiBhZGRyZXNzIHJlZ2lzdGVyICh0ZW1wb3JhcnkpCisgKi8KKwkubWFjcm8Jd3JpdGVfc3luYwlhcgorCW1lbXcJCQkvLyBlbnN1cmUgcHJldmlvdXMgbWVtb3J5IGFjY2Vzc2VzIGFyZSBjb21wbGV0ZSBwcmlvciB0byBzdWJzZXF1ZW50IG1lbW9yeSBhY2Nlc3NlcworCWwzMmkJXGFyLCBzcCwgMAkvLyBjb21wbGV0aW5nIHRoaXMgcmVhZCBlbnN1cmVzIGFueSBwcmV2aW91cyB3cml0ZSBoYXMgY29tcGxldGVkLCBiZWNhdXNlIG9mIE1FTVcKKwkvL3Nsb3QKKwlhZGQJXGFyLCBcYXIsIFxhcgkvLyB1c2UgdGhlIHJlc3VsdCBvZiB0aGUgcmVhZCB0byBoZWxwIGVuc3VyZSB0aGUgcmVhZCBjb21wbGV0ZXMgKGluIGZ1dHVyZSBhcmNoaXRlY3R1cmVzKQorCS5lbmRtCisKKworLyoKKyAqICBJbnZhbGlkYXRlIGEgc2luZ2xlIGxpbmUgb2YgdGhlIGRhdGEgY2FjaGUuCisgKiAgUGFyYW1ldGVycyBhcmU6CisgKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gaW52YWxpZGF0ZQorICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCisgKglvZmZzZXQJKG9wdGlvbmFsKSBvZmZzZXQgdG8gYWRkIHRvIFxhciB0byBjb21wdXRlIGVmZmVjdGl2ZSBhZGRyZXNzIHRvIGludmFsaWRhdGUKKyAqCQkobm90ZTogc29tZSBudW1iZXIgb2YgbHNiaXRzIGFyZSBpZ25vcmVkKQorICovCisJLm1hY3JvCWRjYWNoZV9pbnZhbGlkYXRlX2xpbmUJYXIsIG9mZnNldAorI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAorCWRoaQlcYXIsIFxvZmZzZXQKKwlkY2FjaGVfc3luYwlcYXIKKyNlbmRpZgorCS5lbmRtCisKKworCisKKworLyoKKyAqICBJbnZhbGlkYXRlIGRhdGEgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGEgc3BlY2lmaWVkIHBvcnRpb24gb2YgbWVtb3J5LgorICogIFBhcmFtZXRlcnMgYXJlOgorICoJYXN0YXJ0CXN0YXJ0IGFkZHJlc3MgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQorICoJYXNpemUJc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKKyAqCWFjCXVuaXF1ZSByZWdpc3RlciB1c2VkIGFzIHRlbXBvcmFyeQorICovCisJLm1hY3JvCWRjYWNoZV9pbnZhbGlkYXRlX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYworI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAorCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiBpbnZhbGlkYXRpb246CisJY2FjaGVfaGl0X3JlZ2lvbglkaGksIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgsIFxhc3RhcnQsIFxhc2l6ZSwgXGFjCisJZGNhY2hlX3N5bmMJXGFjCisJLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHJlZ2lvbiBpbnZhbGlkYXRpb24KKyNlbmRpZgorCS5lbmRtCisKKworCisjaWYgMAorLyoKKyAqICBUaGlzIGlzIGEgd29yay1hcm91bmQgZm9yIGEgYnVnIGluIFNpQ2hpcDEgKD8/PykuCisgKiAgVGhlcmUgc2hvdWxkIGJlIGEgcHJvcGVyIG1lY2hhbmlzbSBmb3Igbm90IG91dHB1dHRpbmcKKyAqICB0aGVzZSBpbnN0cnVjdGlvbnMgd2hlbiBub3QgbmVlZGVkLgorICogIFRvIGVuYWJsZSB3b3JrLWFyb3VuZCwgdW5jb21tZW50IHRoaXMgYW5kIHJlcGxhY2UgJ2RpaScKKyAqICB3aXRoICdkaWlfczEnIGV2ZXJ5d2hlcmUsIGVnLiBpbiBkY2FjaGVfaW52YWxpZGF0ZV9hbGwKKyAqICBtYWNybyBiZWxvdy4KKyAqLworCS5tYWNybwlkaWlfczEJYXIsIG9mZnNldAorCWRpaQlcYXIsIFxvZmZzZXQKKwlvcglcYXIsIFxhciwgXGFyCisJb3IJXGFyLCBcYXIsIFxhcgorCW9yCVxhciwgXGFyLCBcYXIKKwlvcglcYXIsIFxhciwgXGFyCisJLmVuZG0KKyNlbmRpZgorCisKKy8qCisgKiAgSW52YWxpZGF0ZSBlbnRpcmUgZGF0YSBjYWNoZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlkY2FjaGVfaW52YWxpZGF0ZV9hbGwJYWEsIGFiCisjaWYgWENIQUxfRENBQ0hFX1NJWkUgPiAwCisJLy8gIERhdGEgY2FjaGUgaW52YWxpZGF0aW9uOgorCWNhY2hlX2luZGV4X2FsbAkJZGlpLCBYQ0hBTF9EQ0FDSEVfU0laRSwgWENIQUxfRENBQ0hFX0xJTkVTSVpFLCBYQ0hBTF9EQ0FDSEVfV0FZUywgXGFhLCBcYWIKKwlkY2FjaGVfc3luYwlcYWEKKwkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgaW52YWxpZGF0aW9uCisjZW5kaWYKKwkuZW5kbQorCisKKworLyoKKyAqICBXcml0ZWJhY2sgYSBzaW5nbGUgbGluZSBvZiB0aGUgZGF0YSBjYWNoZS4KKyAqICBQYXJhbWV0ZXJzIGFyZToKKyAqCWFyCWFkZHJlc3MgcmVnaXN0ZXIgdGhhdCBjb250YWlucyAodmlydHVhbCkgYWRkcmVzcyB0byB3cml0ZWJhY2sKKyAqCQkobWF5IGdldCBjbG9iYmVyZWQgaW4gYSBmdXR1cmUgaW1wbGVtZW50YXRpb24sIGJ1dCBub3QgY3VycmVudGx5KQorICoJb2Zmc2V0CW9mZnNldCB0byBhZGQgdG8gXGFyIHRvIGNvbXB1dGUgZWZmZWN0aXZlIGFkZHJlc3MgdG8gd3JpdGViYWNrCisgKgkJKG5vdGU6IHNvbWUgbnVtYmVyIG9mIGxzYml0cyBhcmUgaWdub3JlZCkKKyAqLworCS5tYWNybwlkY2FjaGVfd3JpdGViYWNrX2xpbmUJYXIsIG9mZnNldAorI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCisJZGh3YglcYXIsIFxvZmZzZXQKKwlkY2FjaGVfc3luYwlcYXIKKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIFdyaXRlYmFjayBkaXJ0eSBkYXRhIGNhY2hlIGVudHJpZXMgdGhhdCBjYWNoZSBhIHNwZWNpZmllZCBwb3J0aW9uIG9mIG1lbW9yeS4KKyAqICBQYXJhbWV0ZXJzIGFyZToKKyAqCWFzdGFydAlzdGFydCBhZGRyZXNzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKKyAqCWFzaXplCXNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCisgKglhYwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKKyAqLworCS5tYWNybwlkY2FjaGVfd3JpdGViYWNrX3JlZ2lvbgkJYXN0YXJ0LCBhc2l6ZSwgYWMKKyNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiB3cml0ZWJhY2s6CisJY2FjaGVfaGl0X3JlZ2lvbglkaHdiLCBYQ0hBTF9EQ0FDSEVfTElORVdJRFRILCBcYXN0YXJ0LCBcYXNpemUsIFxhYworCWRjYWNoZV9zeW5jCVxhYworCS8vICBFbmQgb2YgZGF0YSBjYWNoZSByZWdpb24gd3JpdGViYWNrCisjZW5kaWYKKwkuZW5kbQorCisKKworLyoKKyAqICBXcml0ZWJhY2sgZW50aXJlIGRhdGEgY2FjaGUuCisgKiAgUGFyYW1ldGVyczoKKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlkY2FjaGVfd3JpdGViYWNrX2FsbAlhYSwgYWIKKyNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0lTX1dSSVRFQkFDSworCS8vICBEYXRhIGNhY2hlIHdyaXRlYmFjazoKKwljYWNoZV9pbmRleF9hbGwJCWRpd2IsIFhDSEFMX0RDQUNIRV9TSVpFLCBYQ0hBTF9EQ0FDSEVfTElORVNJWkUsIDEsIFxhYSwgXGFiCisJZGNhY2hlX3N5bmMJXGFhCisJLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHdyaXRlYmFjaworI2VuZGlmCisJLmVuZG0KKworCisKKy8qCisgKiAgV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIGEgc2luZ2xlIGxpbmUgb2YgdGhlIGRhdGEgY2FjaGUuCisgKiAgUGFyYW1ldGVycyBhcmU6CisgKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gd3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlCisgKgkJKG1heSBnZXQgY2xvYmJlcmVkIGluIGEgZnV0dXJlIGltcGxlbWVudGF0aW9uLCBidXQgbm90IGN1cnJlbnRseSkKKyAqCW9mZnNldAlvZmZzZXQgdG8gYWRkIHRvIFxhciB0byBjb21wdXRlIGVmZmVjdGl2ZSBhZGRyZXNzIHRvIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZQorICoJCShub3RlOiBzb21lIG51bWJlciBvZiBsc2JpdHMgYXJlIGlnbm9yZWQpCisgKi8KKwkubWFjcm8JZGNhY2hlX3dyaXRlYmFja19pbnZfbGluZQlhciwgb2Zmc2V0CisjaWYgWENIQUxfRENBQ0hFX1NJWkUgPiAwCisJZGh3YmkJXGFyLCBcb2Zmc2V0CS8qIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZSBkY2FjaGUgbGluZSAqLworCWRjYWNoZV9zeW5jCVxhcgorI2VuZGlmCisJLmVuZG0KKworCisKKy8qCisgKiAgV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIGRhdGEgY2FjaGUgZW50cmllcyB0aGF0IGNhY2hlIGEgc3BlY2lmaWVkIHBvcnRpb24gb2YgbWVtb3J5LgorICogIFBhcmFtZXRlcnMgYXJlOgorICoJYXN0YXJ0CXN0YXJ0IGFkZHJlc3MgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQorICoJYXNpemUJc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKKyAqCWFjCXVuaXF1ZSByZWdpc3RlciB1c2VkIGFzIHRlbXBvcmFyeQorICovCisJLm1hY3JvCWRjYWNoZV93cml0ZWJhY2tfaW52X3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYworI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAorCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiB3cml0ZWJhY2sgYW5kIGludmFsaWRhdGU6CisJY2FjaGVfaGl0X3JlZ2lvbglkaHdiaSwgWENIQUxfRENBQ0hFX0xJTkVXSURUSCwgXGFzdGFydCwgXGFzaXplLCBcYWMKKwlkY2FjaGVfc3luYwlcYWMKKwkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgcmVnaW9uIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZQorI2VuZGlmCisJLmVuZG0KKworCisKKy8qCisgKiAgV3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlIGVudGlyZSBkYXRhIGNhY2hlLgorICogIFBhcmFtZXRlcnM6CisgKglhYSwgYWIJCXVuaXF1ZSBhZGRyZXNzIHJlZ2lzdGVycyAodGVtcG9yYXJpZXMpCisgKi8KKwkubWFjcm8JZGNhY2hlX3dyaXRlYmFja19pbnZfYWxsCWFhLCBhYgorI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMAorCS8vICBEYXRhIGNhY2hlIHdyaXRlYmFjayBhbmQgaW52YWxpZGF0ZToKKyNpZiBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCisJY2FjaGVfaW5kZXhfYWxsCQlkaXdiaSwgWENIQUxfRENBQ0hFX1NJWkUsIFhDSEFMX0RDQUNIRV9MSU5FU0laRSwgMSwgXGFhLCBcYWIKKwlkY2FjaGVfc3luYwlcYWEKKyNlbHNlIC8qd3JpdGViYWNrKi8KKwkvLyAgRGF0YSBjYWNoZSBkb2VzIG5vdCBzdXBwb3J0IHdyaXRlYmFjaywgc28ganVzdCBpbnZhbGlkYXRlOiAqLworCWRjYWNoZV9pbnZhbGlkYXRlX2FsbAlcYWEsIFxhYgorI2VuZGlmIC8qd3JpdGViYWNrKi8KKwkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgd3JpdGViYWNrIGFuZCBpbnZhbGlkYXRlCisjZW5kaWYKKwkuZW5kbQorCisKKworCisvKgorICogIExvY2sgKHByZWZldGNoICYgbG9jaykgYSBzaW5nbGUgbGluZSBvZiB0aGUgZGF0YSBjYWNoZS4KKyAqCisgKiAgUGFyYW1ldGVycyBhcmU6CisgKglhcglhZGRyZXNzIHJlZ2lzdGVyIHRoYXQgY29udGFpbnMgKHZpcnR1YWwpIGFkZHJlc3MgdG8gbG9jaworICoJCShtYXkgZ2V0IGNsb2JiZXJlZCBpbiBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgYnV0IG5vdCBjdXJyZW50bHkpCisgKglvZmZzZXQJb2Zmc2V0IHRvIGFkZCB0byBcYXIgdG8gY29tcHV0ZSBlZmZlY3RpdmUgYWRkcmVzcyB0byBsb2NrCisgKgkJKG5vdGU6IHNvbWUgbnVtYmVyIG9mIGxzYml0cyBhcmUgaWdub3JlZCkKKyAqLworCS5tYWNybwlkY2FjaGVfbG9ja19saW5lCWFyLCBvZmZzZXQKKyNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKKwlkcGZsCVxhciwgXG9mZnNldAkvKiBwcmVmZXRjaCBhbmQgbG9jayBkY2FjaGUgbGluZSAqLworCWRjYWNoZV9zeW5jCVxhcgorI2VuZGlmCisJLmVuZG0KKworCisKKy8qCisgKiAgTG9jayAocHJlZmV0Y2ggJiBsb2NrKSBhIHNwZWNpZmllZCBwb3J0aW9uIG9mIG1lbW9yeSBpbnRvIHRoZSBkYXRhIGNhY2hlLgorICogIFBhcmFtZXRlcnMgYXJlOgorICoJYXN0YXJ0CXN0YXJ0IGFkZHJlc3MgKHJlZ2lzdGVyIGdldHMgY2xvYmJlcmVkKQorICoJYXNpemUJc2l6ZSBvZiB0aGUgcmVnaW9uIGluIGJ5dGVzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKKyAqCWFjCXVuaXF1ZSByZWdpc3RlciB1c2VkIGFzIHRlbXBvcmFyeQorICovCisJLm1hY3JvCWRjYWNoZV9sb2NrX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYworI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQorCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiBsb2NrOgorCWNhY2hlX2hpdF9yZWdpb24JZHBmbCwgWENIQUxfRENBQ0hFX0xJTkVXSURUSCwgXGFzdGFydCwgXGFzaXplLCBcYWMKKwlkY2FjaGVfc3luYwlcYWMKKwkvLyAgRW5kIG9mIGRhdGEgY2FjaGUgcmVnaW9uIGxvY2sKKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIFVubG9jayBhIHNpbmdsZSBsaW5lIG9mIHRoZSBkYXRhIGNhY2hlLgorICoKKyAqICBQYXJhbWV0ZXJzIGFyZToKKyAqCWFyCWFkZHJlc3MgcmVnaXN0ZXIgdGhhdCBjb250YWlucyAodmlydHVhbCkgYWRkcmVzcyB0byB1bmxvY2sKKyAqCQkobWF5IGdldCBjbG9iYmVyZWQgaW4gYSBmdXR1cmUgaW1wbGVtZW50YXRpb24sIGJ1dCBub3QgY3VycmVudGx5KQorICoJb2Zmc2V0CW9mZnNldCB0byBhZGQgdG8gXGFyIHRvIGNvbXB1dGUgZWZmZWN0aXZlIGFkZHJlc3MgdG8gdW5sb2NrCisgKgkJKG5vdGU6IHNvbWUgbnVtYmVyIG9mIGxzYml0cyBhcmUgaWdub3JlZCkKKyAqLworCS5tYWNybwlkY2FjaGVfdW5sb2NrX2xpbmUJYXIsIG9mZnNldAorI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQorCWRodQlcYXIsIFxvZmZzZXQJLyogdW5sb2NrIGRjYWNoZSBsaW5lICovCisJZGNhY2hlX3N5bmMJXGFyCisjZW5kaWYKKwkuZW5kbQorCisKKworLyoKKyAqICBVbmxvY2sgYSBzcGVjaWZpZWQgcG9ydGlvbiBvZiBtZW1vcnkgZnJvbSB0aGUgZGF0YSBjYWNoZS4KKyAqICBQYXJhbWV0ZXJzIGFyZToKKyAqCWFzdGFydAlzdGFydCBhZGRyZXNzIChyZWdpc3RlciBnZXRzIGNsb2JiZXJlZCkKKyAqCWFzaXplCXNpemUgb2YgdGhlIHJlZ2lvbiBpbiBieXRlcyAocmVnaXN0ZXIgZ2V0cyBjbG9iYmVyZWQpCisgKglhYwl1bmlxdWUgcmVnaXN0ZXIgdXNlZCBhcyB0ZW1wb3JhcnkKKyAqLworCS5tYWNybwlkY2FjaGVfdW5sb2NrX3JlZ2lvbglhc3RhcnQsIGFzaXplLCBhYworI2lmIFhDSEFMX0RDQUNIRV9TSVpFID4gMCAmJiBYQ0hBTF9EQ0FDSEVfTElORV9MT0NLQUJMRQorCS8vICBEYXRhIGNhY2hlIHJlZ2lvbiB1bmxvY2s6CisJY2FjaGVfaGl0X3JlZ2lvbglkaHUsIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgsIFxhc3RhcnQsIFxhc2l6ZSwgXGFjCisJZGNhY2hlX3N5bmMJXGFjCisJLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHJlZ2lvbiB1bmxvY2sKKyNlbmRpZgorCS5lbmRtCisKKworCisvKgorICogIFVubG9jayBlbnRpcmUgZGF0YSBjYWNoZS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCWFhLCBhYgkJdW5pcXVlIGFkZHJlc3MgcmVnaXN0ZXJzICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlkY2FjaGVfdW5sb2NrX2FsbAlhYSwgYWIKKyNpZiBYQ0hBTF9EQ0FDSEVfU0laRSA+IDAgJiYgWENIQUxfRENBQ0hFX0xJTkVfTE9DS0FCTEUKKwkvLyAgRGF0YSBjYWNoZSB1bmxvY2s6CisJY2FjaGVfaW5kZXhfYWxsCQlkaXUsIFhDSEFMX0RDQUNIRV9TSVpFLCBYQ0hBTF9EQ0FDSEVfTElORVNJWkUsIDEsIFxhYSwgXGFiCisJZGNhY2hlX3N5bmMJXGFhCisJLy8gIEVuZCBvZiBkYXRhIGNhY2hlIHVubG9jaworI2VuZGlmCisJLmVuZG0KKworCisjZW5kaWYgLypYVEVOU0FfQ0FDSEVBU01fSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY2FjaGVhdHRyYXNtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NhY2hlYXR0cmFzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjM2UxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NhY2hlYXR0cmFzbS5oCkBAIC0wLDAgKzEsNDMyIEBACisjaWZuZGVmIFhURU5TQV9DQUNIRUFUVFJBU01fSAorI2RlZmluZSBYVEVOU0FfQ0FDSEVBVFRSQVNNX0gKKworLyoKKyAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECisgKgorICogaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jYWNoZWF0dHJhc20uaCAtLSBhc3NlbWJsZXItc3BlY2lmaWMKKyAqIENBQ0hFQVRUUiByZWdpc3RlciByZWxhdGVkIGRlZmluaXRpb25zIHRoYXQgZGVwZW5kIG9uIENPUkUKKyAqIGNvbmZpZ3VyYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworCisjaW5jbHVkZSA8eHRlbnNhL2NvcmVhc20uaD4KKworCisvKgorICogIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhc3NlbWJsZXIgbWFjcm9zIG9mIHRoZSBmb3JtOgorICoJPHg+Y2FjaGVhdHRyXzxmdW5jPgorICogIHdoZXJlOgorICoJPHg+IGlzICdpJywgJ2QnIG9yIGFic2VudCBmb3IgaW5zdHJ1Y3Rpb24sIGRhdGEKKyAqCQlvciBib3RoIGNhY2hlczsgYW5kCisgKgk8ZnVuYz4gaW5kaWNhdGVzIHRoZSBmdW5jdGlvbiBvZiB0aGUgbWFjcm8uCisgKgorICogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBkZWZpbmVkOgorICoKKyAqICBpY2FjaGVhdHRyX2dldAorICoJUmVhZHMgSS1jYWNoZSBDQUNIRUFUVFIgaW50byBhMiAoY2xvYmJlcnMgYTMtYTUpLgorICoKKyAqICBkY2FjaGVhdHRyX2dldAorICoJUmVhZHMgRC1jYWNoZSBDQUNIRUFUVFIgaW50byBhMiAoY2xvYmJlcnMgYTMtYTUpLgorICoJKE5vdGU6ICBmb3IgY29uZmlncyB3aXRoIGEgcmVhbCBDQUNIRUFUVFIgcmVnaXN0ZXIsIHRoZQorICoJIGFib3ZlIHR3byBtYWNyb3MgYXJlIGlkZW50aWNhbC4pCisgKgorICogIGNhY2hlYXR0cl9zZXQKKyAqCVdyaXRlcyBib3RoIEktY2FjaGUgYW5kIEQtY2FjaGUgQ0FDSEVBVFRScyBmcm9tIGEyIChhMy1hOCBjbG9iYmVyZWQpLgorICoJV29ya3MgZXZlbiB3aGVuIGNoYW5naW5nIG9uZSdzIG93biBjb2RlJ3MgYXR0cmlidXRlcy4KKyAqCisgKiAgaWNhY2hlYXR0cl9pc19lbmFibGVkICBsYWJlbAorICoJQnJhbmNoZXMgdG8gXGxhYmVsIGlmIEktY2FjaGUgYXBwZWFycyB0byBoYXZlIGJlZW4gZW5hYmxlZAorICoJKGVnLiBpZiBDQUNIRUFUVFIgY29udGFpbnMgYSBjYWNoZS1lbmFibGVkIGF0dHJpYnV0ZSkuCisgKgkoY2xvYmJlcnMgYTItYTUsU0FSKQorICoKKyAqICBkY2FjaGVhdHRyX2lzX2VuYWJsZWQgIGxhYmVsCisgKglCcmFuY2hlcyB0byBcbGFiZWwgaWYgRC1jYWNoZSBhcHBlYXJzIHRvIGhhdmUgYmVlbiBlbmFibGVkCisgKgkoZWcuIGlmIENBQ0hFQVRUUiBjb250YWlucyBhIGNhY2hlLWVuYWJsZWQgYXR0cmlidXRlKS4KKyAqCShjbG9iYmVycyBhMi1hNSxTQVIpCisgKgorICogIGNhY2hlYXR0cl9pc19lbmFibGVkICBsYWJlbAorICoJQnJhbmNoZXMgdG8gXGxhYmVsIGlmIGVpdGhlciBJLWNhY2hlIG9yIEQtY2FjaGUgYXBwZWFycyB0byBoYXZlIGJlZW4gZW5hYmxlZAorICoJKGVnLiBpZiBDQUNIRUFUVFIgY29udGFpbnMgYSBjYWNoZS1lbmFibGVkIGF0dHJpYnV0ZSkuCisgKgkoY2xvYmJlcnMgYTItYTUsU0FSKQorICoKKyAqICBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgb25seSBkZWZpbmVkIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczoKKyAqCisgKiAgaWNhY2hlYXR0cl9zZXQJKGlmIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUikKKyAqCVdyaXRlcyBJLWNhY2hlIENBQ0hFQVRUUiBmcm9tIGEyIChhMy1hOCBjbG9iYmVyZWQpLgorICoKKyAqICBkY2FjaGVhdHRyX3NldAkoaWYgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSKQorICoJV3JpdGVzIEQtY2FjaGUgQ0FDSEVBVFRSIGZyb20gYTIgKGEzLWE4IGNsb2JiZXJlZCkuCisgKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiogICBHRU5FUklDIC0tIEFMTCBDQUNIRVMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiAgX2NhY2hlYXR0cl9nZXQKKyAqCisgKiAgKEludGVybmFsIG1hY3JvLikKKyAqICBSZXR1cm5zIHZhbHVlIG9mIENBQ0hFQVRUUiByZWdpc3RlciAob3IgY2xvc2VzdCBlcXVpdmFsZW50KSBpbiBhMi4KKyAqCisgKiAgRW50cnk6CisgKgkobm9uZSkKKyAqICBFeGl0OgorICoJYTIJdmFsdWUgcmVhZCBmcm9tIENBQ0hFQVRUUgorICoJYTMtYTUJY2xvYmJlcmVkICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwlfY2FjaGVhdHRyX2dldAl0bGIKKyNpZiBYQ0hBTF9IQVZFX0NBQ0hFQVRUUgorCXJzcglhMiwgQ0FDSEVBVFRSCisjZWxpZiBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIKKwkvLyAgV2UgaGF2ZSBhIGNvbmZpZyB0aGF0ICJtaW1pY3MiIENBQ0hFQVRUUiB1c2luZyBhIHNpbXBsaWZpZWQKKwkvLyAgIk1NVSIgY29tcG9zZWQgb2YgYSBzaW5nbGUgc3RhdGljYWxseS1tYXBwZWQgd2F5LgorCS8vICBEVExCIGFuZCBJVExCIGFyZSBpbmRlcGVuZGVudCwgc28gdGhlcmUncyBubyBzaW5nbGUKKwkvLyAgY2FjaGUgYXR0cmlidXRlIHRoYXQgY2FuIGRlc2NyaWJlIGJvdGguICBTbyBmb3Igbm93CisJLy8gIGp1c3QgcmV0dXJuIHRoZSBEVExCIHN0YXRlLgorCW1vdmkJYTUsIDB4RTAwMDAwMDAKKwltb3ZpCWEyLCAwCisJbW92aQlhMywgMAorMToJYWRkCWEzLCBhMywgYTUJLy8gbmV4dCBzZWdtZW50CisJciZ0bGImMQlhNCwgYTMJCS8vIGdldCBQUE4rQ0Egb2Ygc2VnbWVudCBhdCAweEUwMDAwMDAwLCAweEMwMDAwMDAwLCAuLi4sIDAKKwlkc3luYwkvLyBpbnRlcmxvY2s/Pz8KKwlzbGxpCWEyLCBhMiwgNAorCWV4dHVpCWE0LCBhNCwgMCwgNAkvLyBleHRyYWN0IENBCisJb3IJYTIsIGEyLCBhNAorCWJuZXoJYTMsIDFiCisjZWxzZQorCS8vICBUaGlzIG1hY3JvIGlzbid0IGFwcGxpY2FibGUgdG8gYXJiaXRyYXJ5IE1NVSBjb25maWd1cmF0aW9ucy4KKwkvLyAgSnVzdCByZXR1cm4gemVyby4KKwltb3ZpCWEyLCAwCisjZW5kaWYKKwkuZW5kbQorCisJLm1hY3JvCWljYWNoZWF0dHJfZ2V0CisJX2NhY2hlYXR0cl9nZXQJaXRsYgorCS5lbmRtCisKKwkubWFjcm8JZGNhY2hlYXR0cl9nZXQKKwlfY2FjaGVhdHRyX2dldAlkdGxiCisJLmVuZG0KKworCisjZGVmaW5lIFhDSEFMX0NBQ0hFQVRUUl9BTExfQllQQVNTCTB4MjIyMjIyMjIJLyogZGVmYXVsdCAocG93ZXJ1cC9yZXNldCkgdmFsdWUgb2YgQ0FDSEVBVFRSLCBhbGwgQllQQVNTCisJCQkJCQkJICAgbW9kZSAoaWUuIGRpc2FibGVkL2J5cGFzc2VkIGNhY2hlcykgKi8KKworI2lmIFhDSEFMX0hBVkVfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgorCisjZGVmaW5lIFhDSEFMX0ZDQV9FTkFNQVNLCTB4MDAxQQkvKiBiaXRtYXAgb2YgZmV0Y2ggYXR0cmlidXRlcyB0aGF0IHJlcXVpcmUgZW5hYmxlZCBpY2FjaGUgKi8KKyNkZWZpbmUgWENIQUxfTENBX0VOQU1BU0sJMHgwMDAzCS8qIGJpdG1hcCBvZiBsb2FkICBhdHRyaWJ1dGVzIHRoYXQgcmVxdWlyZSBlbmFibGVkIGRjYWNoZSAqLworI2RlZmluZSBYQ0hBTF9TQ0FfRU5BTUFTSwkweDAwMDMJLyogYml0bWFwIG9mIHN0b3JlIGF0dHJpYnV0ZXMgdGhhdCByZXF1aXJlIGVuYWJsZWQgZGNhY2hlICovCisjZGVmaW5lIFhDSEFMX0xTQ0FfRU5BTUFTSwkoWENIQUxfTENBX0VOQU1BU0t8WENIQUxfU0NBX0VOQU1BU0spCS8qIGwvcyBhdHRycyByZXF1aXJpbmcgZW5hYmxlZCBkY2FjaGUgKi8KKyNkZWZpbmUgWENIQUxfQUxMQ0FfRU5BTUFTSwkoWENIQUxfRkNBX0VOQU1BU0t8WENIQUxfTFNDQV9FTkFNQVNLKQkvKiBhbGwgYXR0cnMgcmVxdWlyaW5nIGVuYWJsZWQgY2FjaGVzICovCisKKy8qCisgKiAgX2NhY2hlYXR0cl9pc19lbmFibGVkCisgKgorICogIChJbnRlcm5hbCBtYWNyby4pCisgKiAgQnJhbmNoZXMgdG8gXGxhYmVsIGlmIENBQ0hFQVRUUiBpbiBhMiBpbmRpY2F0ZXMgYW4gZW5hYmxlZAorICogIGNhY2hlLCB1c2luZyBtYXNrIGluIGEzLgorICoKKyAqICBQYXJhbWV0ZXJzOgorICoJbGFiZWwJd2hlcmUgdG8gYnJhbmNoIHRvIGlmIGNhY2hlIGlzIGVuYWJsZWQKKyAqICBFbnRyeToKKyAqCWEyCWNvbnRhaW5zIENBQ0hFQVRUUiB2YWx1ZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyCisgKgkJY2FjaGVzIGFyZSBlbmFibGVkCisgKglhMwkxNi1iaXQgY29uc3RhbnQgd2hlcmUgZWFjaCBiaXQgY29ycmVzcG9uZCB0bworICoJCW9uZSBvZiB0aGUgMTYgcG9zc2libGUgQ0EgdmFsdWVzIChpbiBhIENBQ0hFQVRUUiBtYXNrKTsKKyAqCQlDQSB2YWx1ZXMgdGhhdCBpbmRpY2F0ZSB0aGUgY2FjaGUgaXMgZW5hYmxlZAorICoJCWhhdmUgdGhlaXIgY29ycmVzcG9uZGluZyBiaXQgc2V0IGluIHRoaXMgbWFzaworICoJCShlZy4gdXNlIFhDSEFMX3hDQV9FTkFNQVNLICwgYWJvdmUpCisgKiAgRXhpdDoKKyAqCWEyLGE0LGE1CWNsb2JiZXJlZAorICoJU0FSCQljbG9iYmVyZWQKKyAqLworCS5tYWNybwlfY2FjaGVhdHRyX2lzX2VuYWJsZWQJbGFiZWwKKwltb3ZpCWE0LCA4CQkvLyBsb29wIDggdGltZXMKKy5MY2FpZmVcQDoKKwlleHR1aQlhNSwgYTIsIDAsIDQJLy8gZ2V0IENBIG5pYmJsZQorCXNzcglhNQkJLy8gaW5kZXggaW50byBtYXNrIGFjY29yZGluZyB0byBDQS4uLgorCXNybAlhNSwgYTMJCS8vIC4uLmFuZCBnZXQgQ0EncyBtYXNrIGJpdCBpbiBhNSBiaXQgMAorCWJic2kubAlhNSwgMCwgXGxhYmVsCS8vIGlmIENBIGluZGljYXRlcyBjYWNoZSBlbmFibGVkLCBqdW1wIHRvIGxhYmVsCisJc3JsaQlhMiwgYTIsIDQJLy8gbmV4dCBuaWJibGUKKwlhZGRpCWE0LCBhNCwgLTEKKwlibmV6CWE0LCAuTGNhaWZlXEAJLy8gbG9vcCBmb3IgZWFjaCBuaWJibGUKKwkuZW5kbQorCisjZWxzZSAvKiBYQ0hBTF9IQVZFX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIgKi8KKwkubWFjcm8JX2NhY2hlYXR0cl9pc19lbmFibGVkCWxhYmVsCisJaglcbGFiZWwJCS8vIG1hY3JvIG5vdCBhcHBsaWNhYmxlLCBhc3N1bWUgY2FjaGVzIGFsd2F5cyBlbmFibGVkCisJLmVuZG0KKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIgKi8KKworCisKKy8qCisgKiAgaWNhY2hlYXR0cl9pc19lbmFibGVkCisgKgorICogIEJyYW5jaGVzIHRvIFxsYWJlbCBpZiBJLWNhY2hlIGlzIGVuYWJsZWQuCisgKgorICogIFBhcmFtZXRlcnM6CisgKglsYWJlbAl3aGVyZSB0byBicmFuY2ggdG8gaWYgaWNhY2hlIGlzIGVuYWJsZWQKKyAqICBFbnRyeToKKyAqCShub25lKQorICogIEV4aXQ6CisgKglhMi1hNSwgU0FSCWNsb2JiZXJlZCAodGVtcG9yYXJpZXMpCisgKi8KKwkubWFjcm8JaWNhY2hlYXR0cl9pc19lbmFibGVkCWxhYmVsCisjaWYgWENIQUxfSEFWRV9DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCisJaWNhY2hlYXR0cl9nZXQKKwltb3ZpCWEzLCBYQ0hBTF9GQ0FfRU5BTUFTSworI2VuZGlmCisJX2NhY2hlYXR0cl9pc19lbmFibGVkCVxsYWJlbAorCS5lbmRtCisKKy8qCisgKiAgZGNhY2hlYXR0cl9pc19lbmFibGVkCisgKgorICogIEJyYW5jaGVzIHRvIFxsYWJlbCBpZiBELWNhY2hlIGlzIGVuYWJsZWQuCisgKgorICogIFBhcmFtZXRlcnM6CisgKglsYWJlbAl3aGVyZSB0byBicmFuY2ggdG8gaWYgZGNhY2hlIGlzIGVuYWJsZWQKKyAqICBFbnRyeToKKyAqCShub25lKQorICogIEV4aXQ6CisgKglhMi1hNSwgU0FSCWNsb2JiZXJlZCAodGVtcG9yYXJpZXMpCisgKi8KKwkubWFjcm8JZGNhY2hlYXR0cl9pc19lbmFibGVkCWxhYmVsCisjaWYgWENIQUxfSEFWRV9DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCisJZGNhY2hlYXR0cl9nZXQKKwltb3ZpCWEzLCBYQ0hBTF9MU0NBX0VOQU1BU0sKKyNlbmRpZgorCV9jYWNoZWF0dHJfaXNfZW5hYmxlZAlcbGFiZWwKKwkuZW5kbQorCisvKgorICogIGNhY2hlYXR0cl9pc19lbmFibGVkCisgKgorICogIEJyYW5jaGVzIHRvIFxsYWJlbCBpZiBlaXRoZXIgSS1jYWNoZSBvciBELWNhY2hlIGlzIGVuYWJsZWQuCisgKgorICogIFBhcmFtZXRlcnM6CisgKglsYWJlbAl3aGVyZSB0byBicmFuY2ggdG8gaWYgYSBjYWNoZSBpcyBlbmFibGVkCisgKiAgRW50cnk6CisgKgkobm9uZSkKKyAqICBFeGl0OgorICoJYTItYTUsIFNBUgljbG9iYmVyZWQgKHRlbXBvcmFyaWVzKQorICovCisJLm1hY3JvCWNhY2hlYXR0cl9pc19lbmFibGVkCWxhYmVsCisjaWYgWENIQUxfSEFWRV9DQUNIRUFUVFIKKwlyc3IJYTIsIENBQ0hFQVRUUgorCW1vdmkJYTMsIFhDSEFMX0FMTENBX0VOQU1BU0sKKyNlbGlmIFhDSEFMX0hBVkVfTUlNSUNfQ0FDSEVBVFRSIHx8IFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgorCWljYWNoZWF0dHJfZ2V0CisJbW92aQlhMywgWENIQUxfRkNBX0VOQU1BU0sKKwlfY2FjaGVhdHRyX2lzX2VuYWJsZWQJXGxhYmVsCisJZGNhY2hlYXR0cl9nZXQKKwltb3ZpCWEzLCBYQ0hBTF9MU0NBX0VOQU1BU0sKKyNlbmRpZgorCV9jYWNoZWF0dHJfaXNfZW5hYmxlZAlcbGFiZWwKKwkuZW5kbQorCisKKworLyoKKyAqICBUaGUgSVNBIGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIHdheSB0byBjaGFuZ2UgdGhlCisgKiAgaW5zdHJ1Y3Rpb24gY2FjaGUgYXR0cmlidXRlcyBvZiB0aGUgcnVubmluZyBjb2RlLAorICogIGllLiBvZiB0aGUgbWVtb3J5IGFyZWEgdGhhdCBlbmNsb3NlcyB0aGUgY3VycmVudCBQQy4KKyAqICBIb3dldmVyLCBlYWNoIG1pY3JvLWFyY2hpdGVjdHVyZSAob3IgY2xhc3Mgb2YKKyAqICBjb25maWd1cmF0aW9ucyB3aXRoaW4gYSBtaWNyby1hcmNoaXRlY3R1cmUpCisgKiAgcHJvdmlkZXMgYSB3YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXNzdWUuCisgKgorICogIEhlcmUgYXJlIGEgZmV3IG1hY3JvcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgcmVsZXZhbnQKKyAqICBhcHByb2FjaCB0YWtlbi4KKyAqLworCisjaWYgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCisJLy8gIFdlIGhhdmUgYSBjb25maWcgdGhhdCAibWltaWNzIiBDQUNIRUFUVFIgdXNpbmcgYSBzaW1wbGlmaWVkCisJLy8gICJNTVUiIGNvbXBvc2VkIG9mIGEgc2luZ2xlIHN0YXRpY2FsbHktbWFwcGVkIHdheS4KKworLyoKKyAqICBpY2FjaGVhdHRyX3NldAorICoKKyAqICBFbnRyeToKKyAqCWEyCQljYWNoZWF0dHIgdmFsdWUgdG8gc2V0CisgKiAgRXhpdDoKKyAqCWEyCQl1bmNoYW5nZWQKKyAqCWEzLWE4CQljbG9iYmVyZWQgKHRlbXBvcmFyaWVzKQorICovCisJLm1hY3JvCWljYWNoZWF0dHJfc2V0CisKKwltb3ZpCWE1LCAweEUwMDAwMDAwCS8vIG1hc2sgb2YgdXBwZXIgMyBiaXRzCisJbW92aQlhNiwgM2YJCS8vIFBDIHdoZXJlIElUTEIgaXMgc2V0CisJbW92aQlhMywgMAkJLy8gc3RhcnQgYXQgcmVnaW9uIDAgKDAgLi4gNykKKwlhbmQJYTYsIGE2LCBhNQkvLyB1cHBlciAzIGJpdHMgb2YgbG9jYWwgUEMgYXJlYQorCW1vdglhNywgYTIJCS8vIGNvcHkgYTIgc28gaXQgZG9lc24ndCBnZXQgY2xvYmJlcmVkCisJagkzZgorCisjIGlmIFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgorCS8vICBDYW4gZG8gdHJhbnNsYXRpb25zLCB1c2UgZ2VuZXJpYyBtZXRob2Q6CisxOglzdWIJYTYsIGEzLCBhNQkvLyBhZGRyZXNzIG9mIHNvbWUgb3RoZXIgc2VnbWVudAorCXJpdGxiMQlhOCwgYTYJCS8vIHNhdmUgaXRzIFBQTitDQQorCWRzeW5jCS8vIGludGVybG9jaz8/CisJd2l0bGIJYTQsIGE2CQkvLyBtYWtlIGl0IHRyYW5zbGF0ZSB0byB0aGlzIGNvZGUgYXJlYQorCW1vdmkJYTYsIDVmCQkvLyB3aGVyZSB0byBqdW1wIGludG8gaXQKKwlpc3luYworCXN1YglhNiwgYTYsIGE1CS8vIGFkanVzdCBqdW1wIGFkZHJlc3Mgd2l0aGluIHRoYXQgb3RoZXIgc2VnbWVudAorCWp4CWE2CisKKwkvLyAgTm90ZSB0aGF0IGluIHRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0LCB3aGljaCBydW5zIGF0IGEgZGlmZmVyZW50IHZpcnR1YWwKKwkvLyAgYWRkcmVzcyB0aGFuIGl0IGlzIGFzc2VtYmxlZCBmb3IsIHdlIGF2b2lkIHVzaW5nIGxpdGVyYWxzIChlZy4gdmlhIG1vdmkvbDMycikKKwkvLyAganVzdCBpbiBjYXNlIGxpdGVyYWxzIGVuZCB1cCBpbiBhIGRpZmZlcmVudCA1MTIgTUIgc2VnbWVudCwgYW5kIHdlIGF2b2lkCisJLy8gIGluc3RydWN0aW9ucyB0aGF0IHJlbHkgb24gdGhlIGN1cnJlbnQgUEMgYmVpbmcgd2hhdCBpcyBleHBlY3RlZC4KKwkvLworCS5hbGlnbgk0CisJX2oJNmYJCS8vIHRoaXMgaXMgYXQgbGFiZWwgJzUnIG1pbnVzIDQgYnl0ZXMKKwkuYWxpZ24JNAorNToJd2l0bGIJYTQsIGEzCQkvLyB3ZSdyZSBpbiBvdGhlciBzZWdtZW50LCBub3cgY2FuIHdyaXRlIHByZXZpb3VzIHNlZ21lbnQncyBDQQorCWlzeW5jCisJYWRkCWE2LCBhNiwgYTUJLy8gYmFjayB0byBwcmV2aW91cyBzZWdtZW50CisJYWRkaQlhNiwgYTYsIC00CS8vIG5leHQganVtcCBsYWJlbAorCWp4CWE2CisKKzY6CXN1YglhNiwgYTMsIGE1CS8vIGFkZHJlc3Mgb2Ygc29tZSBvdGhlciBzZWdtZW50CisJd2l0bGIJYTgsIGE2CQkvLyByZXN0b3JlIFBQTitDQSBvZiBvdGhlciBzZWdtZW50CisJbW92CWE2LCBhMwkJLy8gcmVzdG9yZSBhNgorCWlzeW5jCisjIGVsc2UgLyogWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSICovCisJLy8gIFVzZSBtaWNyby1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgbWV0aG9kLgorCS8vICBUaGUgZm9sbG93aW5nIDQtaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgaXMgYWxpZ25lZCBzdWNoIHRoYXQKKwkvLyAgaXQgYWxsIGZpdHMgd2l0aGluIGEgc2luZ2xlIEktY2FjaGUgbGluZS4gIFNpeHRlZW4gYnl0ZQorCS8vICBhbGlnbm1lbnQgaXMgc3VmZmljaWVudCBmb3IgdGhpcyAodXNpbmcgWENIQUxfSUNBQ0hFX0xJTkVTSVpFCisJLy8gIGFjdHVhbGx5IGNhdXNlcyBwcm9ibGVtcyBiZWNhdXNlIHRoYXQgY2FuIGJlIGdyZWF0ZXIgdGhhbgorCS8vICB0aGUgYWxpZ25tZW50IG9mIHRoZSByZXNldCB2ZWN0b3IsIHdoZXJlIHRoaXMgbWFjcm8gaXMgb2Z0ZW4KKwkvLyAgaW52b2tlZCwgd2hpY2ggd291bGQgY2F1c2UgdGhlIGxpbmtlciB0byBhbGlnbiB0aGUgcmVzZXQKKwkvLyAgdmVjdG9yIGNvZGUgYXdheSBmcm9tIHRoZSByZXNldCB2ZWN0b3IhISkuCisJLmFsaWduCTE2IC8qWENIQUxfSUNBQ0hFX0xJTkVTSVpFKi8KKzE6CV93aXRsYglhNCwgYTMJCS8vIHdyaXRlIHdpcmVkIFBURSAoQ0EsIG5vIFBQTikgb2YgNTEyTUIgc2VnbWVudCB0byBJVExCCisJX2lzeW5jCisJbm9wCisJbm9wCisjIGVuZGlmIC8qIFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUiAqLworCWJlcQlhMywgYTUsIDRmCS8vIGRvbmU/CisKKwkvLyAgTm90ZSB0aGF0IGluIHRoZSBXSVRMQiBsb29wLCB3ZSBkb24ndCBkbyBhbnkgbG9hZC9zdG9yZXMKKwkvLyAgKG1heSBub3QgYmUgYW4gaXNzdWUgaGVyZSwgYnV0IGl0IGlzIGltcG9ydGFudCBpbiB0aGUgRFRMQiBjYXNlKS4KKzI6CXNybGkJYTcsIGE3LCA0CS8vIG5leHQgQ0EKKwlzdWIJYTMsIGEzLCBhNQkvLyBuZXh0IHNlZ21lbnQgKGFkZCAweDIwMDAwMDAwKQorMzoKKyMgaWYgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCS8qIGlmIGhhdmUgdHJhbnNsYXRpb24sIHByZXNlcnZlIGl0ICovCisJcml0bGIxCWE4LCBhMwkJLy8gZ2V0IGN1cnJlbnQgUFBOK0NBIG9mIHNlZ21lbnQKKwlkc3luYwkvLyBpbnRlcmxvY2s/Pz8KKwlleHR1aQlhNCwgYTcsIDAsIDQJLy8gZXh0cmFjdCBDQSB0byBzZXQKKwlzcmxpCWE4LCBhOCwgNAkvLyBjbGVhciBDQSBidXQga2VlcCBQUE4gLi4uCisJc2xsaQlhOCwgYTgsIDQJLy8gLi4uCisJYWRkCWE0LCBhNCwgYTgJLy8gY29tYmluZSBuZXcgQ0Egd2l0aCBQUE4gdG8gcHJlc2VydmUKKyMgZWxzZQorCWV4dHVpCWE0LCBhNywgMCwgNAkvLyBleHRyYWN0IENBCisjIGVuZGlmCisJYmVxCWEzLCBhNiwgMWIJLy8gY3VycmVudCBQQydzIHJlZ2lvbj8gaWYgc28sIGRvIGl0IGluIGEgc2FmZSB3YXkKKwl3aXRsYglhNCwgYTMJCS8vIHdyaXRlIHdpcmVkIFBURSAoQ0EgWytQUE5dKSBvZiA1MTJNQiBzZWdtZW50IHRvIElUTEIKKwlibmUJYTMsIGE1LCAyYgorCWlzeW5jCQkJLy8gbWFrZSBzdXJlIGFsbCBpZmV0Y2ggY2hhbmdlcyB0YWtlIGVmZmVjdAorNDoKKwkuZW5kbQkvLyBpY2FjaGVhdHRyX3NldAorCisKKy8qCisgKiAgZGNhY2hlYXR0cl9zZXQKKyAqCisgKiAgRW50cnk6CisgKglhMgkJY2FjaGVhdHRyIHZhbHVlIHRvIHNldAorICogIEV4aXQ6CisgKglhMgkJdW5jaGFuZ2VkCisgKglhMy1hOAkJY2xvYmJlcmVkICh0ZW1wb3JhcmllcykKKyAqLworCisJLm1hY3JvCWRjYWNoZWF0dHJfc2V0CisKKwltb3ZpCWE1LCAweEUwMDAwMDAwCS8vIG1hc2sgb2YgdXBwZXIgMyBiaXRzCisJbW92aQlhMywgMAkJLy8gc3RhcnQgYXQgcmVnaW9uIDAgKDAgLi4gNykKKwltb3YJYTcsIGEyCQkvLyBjb3B5IGEyIHNvIGl0IGRvZXNuJ3QgZ2V0IGNsb2JiZXJlZAorCWoJM2YKKwkvLyAgTm90ZSB0aGF0IGluIHRoZSBXRFRMQiBsb29wLCB3ZSBkb24ndCBkbyBhbnkgbG9hZC9zdG9yZXMKKwkvLyAgKGluY2x1ZGluZyBpbXBsaWNpdCBsMzJyIHZpYSBtb3ZpKSBiZWNhdXNlIGl0IGlzbid0IHNhZmUuCisyOglzcmxpCWE3LCBhNywgNAkvLyBuZXh0IENBCisJc3ViCWEzLCBhMywgYTUJLy8gbmV4dCBzZWdtZW50IChhZGQgMHgyMDAwMDAwMCkKKzM6CisjIGlmIFhDSEFMX0hBVkVfWExUX0NBQ0hFQVRUUgkvKiBpZiBoYXZlIHRyYW5zbGF0aW9uLCBwcmVzZXJ2ZSBpdCAqLworCXJkdGxiMQlhOCwgYTMJCS8vIGdldCBjdXJyZW50IFBQTitDQSBvZiBzZWdtZW50CisJZHN5bmMJLy8gaW50ZXJsb2NrPz8/CisJZXh0dWkJYTQsIGE3LCAwLCA0CS8vIGV4dHJhY3QgQ0EgdG8gc2V0CisJc3JsaQlhOCwgYTgsIDQJLy8gY2xlYXIgQ0EgYnV0IGtlZXAgUFBOIC4uLgorCXNsbGkJYTgsIGE4LCA0CS8vIC4uLgorCWFkZAlhNCwgYTQsIGE4CS8vIGNvbWJpbmUgbmV3IENBIHdpdGggUFBOIHRvIHByZXNlcnZlCisjIGVsc2UKKwlleHR1aQlhNCwgYTcsIDAsIDQJLy8gZXh0cmFjdCBDQSB0byBzZXQKKyMgZW5kaWYKKwl3ZHRsYglhNCwgYTMJCS8vIHdyaXRlIHdpcmVkIFBURSAoQ0EgWytQUE5dKSBvZiA1MTJNQiBzZWdtZW50IHRvIERUTEIKKwlibmUJYTMsIGE1LCAyYgorCWRzeW5jCQkJLy8gbWFrZSBzdXJlIGFsbCBkYXRhIHBhdGggY2hhbmdlcyB0YWtlIGVmZmVjdAorCS5lbmRtCS8vIGRjYWNoZWF0dHJfc2V0CisKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUiB8fCBYQ0hBTF9IQVZFX1hMVF9DQUNIRUFUVFIgKi8KKworCisKKy8qCisgKiAgY2FjaGVhdHRyX3NldAorICoKKyAqICBNYWNybyB0aGF0IHNldHMgdGhlIGN1cnJlbnQgQ0FDSEVBVFRSIHNhZmVseQorICogIChib3RoIGkgYW5kIGQpIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjb250ZW50cyBvZiBhMi4KKyAqICBJdCB3b3JrcyBldmVuIHdoZW4gY2hhbmdpbmcgdGhlIGNhY2hlIGF0dHJpYnV0ZXMgb2YKKyAqICB0aGUgY3VycmVudGx5IHJ1bm5pbmcgY29kZS4KKyAqCisgKiAgRW50cnk6CisgKglhMgkJY2FjaGVhdHRyIHZhbHVlIHRvIHNldAorICogIEV4aXQ6CisgKglhMgkJdW5jaGFuZ2VkCisgKglhMy1hOAkJY2xvYmJlcmVkICh0ZW1wb3JhcmllcykKKyAqLworCS5tYWNybwljYWNoZWF0dHJfc2V0CisKKyNpZiBYQ0hBTF9IQVZFX0NBQ0hFQVRUUgorIyBpZiBYQ0hBTF9JQ0FDSEVfTElORVNJWkUgPCA0CisJLy8gIE5vIGktY2FjaGUsIHNvIGNhbiBhbHdheXMgc2FmZWx5IHdyaXRlIHRvIENBQ0hFQVRUUjoKKwl3c3IJYTIsIENBQ0hFQVRUUgorIyBlbHNlCisJLy8gIFRoZSBBdGhlbnMgbWljcm8tYXJjaGl0ZWN0dXJlLCB3aGVuIHVzaW5nIHRoZSBvbGQKKwkvLyAgZXhjZXB0aW9uIGFyY2hpdGVjdHVyZSBvcHRpb24gKGllLiB3aXRoIHRoZSBDQUNIRUFUVFIgcmVnaXN0ZXIpCisJLy8gIGFsbG93cyBjaGFuZ2luZyB0aGUgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGUgcnVubmluZyBjb2RlCisJLy8gIHVzaW5nIHRoZSBmb2xsb3dpbmcgZXhhY3Qgc2VxdWVuY2UgYWxpZ25lZCB0byBiZSB3aXRoaW4KKwkvLyAgYW4gaW5zdHJ1Y3Rpb24gY2FjaGUgbGluZS4gIChOT1RFOiB1c2luZyBYQ0hBTF9JQ0FDSEVfTElORVNJWkUKKwkvLyAgYWxpZ25tZW50IGFjdHVhbGx5IGNhdXNlcyBwcm9ibGVtcyBiZWNhdXNlIHRoYXQgY2FuIGJlIGdyZWF0ZXIKKwkvLyAgdGhhbiB0aGUgYWxpZ25tZW50IG9mIHRoZSByZXNldCB2ZWN0b3IsIHdoZXJlIHRoaXMgbWFjcm8gaXMgb2Z0ZW4KKwkvLyAgaW52b2tlZCwgd2hpY2ggd291bGQgY2F1c2UgdGhlIGxpbmtlciB0byBhbGlnbiB0aGUgcmVzZXQKKwkvLyAgdmVjdG9yIGNvZGUgYXdheSBmcm9tIHRoZSByZXNldCB2ZWN0b3IhISkuCisJagkxZgorCS5hbGlnbgkxNiAvKlhDSEFMX0lDQUNIRV9MSU5FU0laRSovCS8vIGFsaWduIHRvIHdpdGhpbiBhbiBJLWNhY2hlIGxpbmUKKzE6CV93c3IJYTIsIENBQ0hFQVRUUgorCV9pc3luYworCW5vcAorCW5vcAorIyBlbmRpZgorI2VsaWYgWENIQUxfSEFWRV9NSU1JQ19DQUNIRUFUVFIgfHwgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCisJLy8gIERUTEIgYW5kIElUTEIgYXJlIGluZGVwZW5kZW50LCBidXQgdG8ga2VlcCBzZW1hbnRpY3MKKwkvLyAgb2YgdGhpcyBtYWNybyB3ZSBzaW1wbHkgd3JpdGUgdG8gYm90aC4KKwlpY2FjaGVhdHRyX3NldAorCWRjYWNoZWF0dHJfc2V0CisjZWxzZQorCS8vICBUaGlzIG1hY3JvIGlzbid0IGFwcGxpY2FibGUgdG8gYXJiaXRyYXJ5IE1NVSBjb25maWd1cmF0aW9ucy4KKwkvLyAgRG8gbm90aGluZyBpbiB0aGlzIGNhc2UuCisjZW5kaWYKKwkuZW5kbQorCisKKyNlbmRpZiAvKlhURU5TQV9DQUNIRUFUVFJBU01fSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29uZmlnLWxpbnV4X2JlL2NvcmUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29uZmlnLWxpbnV4X2JlL2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTRmZTVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvY29yZS5oCkBAIC0wLDAgKzEsMTI3MCBAQAorLyoKKyAqIHh0ZW5zYS9jb25maWcvY29yZS5oIC0tIEhBTCBkZWZpbml0aW9ucyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gQ09SRSBjb25maWd1cmF0aW9uCisgKgorICogIFRoaXMgaGVhZGVyIGZpbGUgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHRoZSAiY29tcGlsZS10aW1lIEhBTCIgb3IgQ0hBTC4KKyAqICBJdCB3YXMgZ2VuZXJhdGVkIGZvciBhIHNwZWNpZmljIFh0ZW5zYSBwcm9jZXNzb3IgY29uZmlndXJhdGlvbi4KKyAqCisgKiAgU291cmNlIGZvciBjb25maWd1cmF0aW9uLWluZGVwZW5kZW50IGJpbmFyaWVzICh3aGljaCBsaW5rIGluIGEKKyAqICBjb25maWd1cmF0aW9uLXNwZWNpZmljIEhBTCBsaWJyYXJ5KSBtdXN0IE5FVkVSIGluY2x1ZGUgdGhpcyBmaWxlLgorICogIEl0IGlzIHBlcmZlY3RseSBub3JtYWwsIGhvd2V2ZXIsIGZvciB0aGUgSEFMIHNvdXJjZSBpdHNlbGYgdG8gaW5jbHVkZSB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUZW5zaWxpY2EsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKworI2lmbmRlZiBYVEVOU0FfQ09ORklHX0NPUkVfSAorI2RlZmluZSBYVEVOU0FfQ09ORklHX0NPUkVfSAorCisjaW5jbHVkZSA8eHRlbnNhL2hhbC5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUdFTkVSQUwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiAgU2VwYXJhdG9ycyBmb3IgbWFjcm9zIHRoYXQgZXhwYW5kIGludG8gYXJyYXlzLgorICogIFRoZXNlIGNhbiBiZSBwcmVkZWZpbmVkIGJ5IGZpbGVzIHRoYXQgI2luY2x1ZGUgdGhpcyBvbmUsCisgKiAgd2hlbiBkaWZmZXJlbnQgc2VwYXJhdG9ycyBhcmUgcmVxdWlyZWQuCisgKi8KKy8qICBFbGVtZW50IHNlcGFyYXRvciBmb3IgbWFjcm9zIHRoYXQgZXhwYW5kIGludG8gMS1kaW1lbnNpb25hbCBhcnJheXM6ICAqLworI2lmbmRlZiBYQ0hBTF9TRVAKKyNkZWZpbmUgWENIQUxfU0VQCQkJLAorI2VuZGlmCisvKiAgQXJyYXkgc2VwYXJhdG9yIGZvciBtYWNyb3MgdGhhdCBleHBhbmQgaW50byAyLWRpbWVuc2lvbmFsIGFycmF5czogICovCisjaWZuZGVmIFhDSEFMX1NFUDIKKyNkZWZpbmUgWENIQUxfU0VQMgkJCX0seworI2VuZGlmCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJRU5ESUFOTkVTUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0JFCQkJMQorI2RlZmluZSBYQ0hBTF9IQVZFX0xFCQkJMAorI2RlZmluZSBYQ0hBTF9NRU1PUllfT1JERVIJCVhUSEFMX0JJR0VORElBTgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVJFR0lTVEVSIFdJTkRPV1MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9XSU5ET1dFRAkJMQkvKiAxIGlmIHdpbmRvd2VkIHJlZ2lzdGVycyBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0FSRUdTCQkJNjQJLyogbnVtYmVyIG9mIHBoeXNpY2FsIGFkZHJlc3MgcmVncyAqLworI2RlZmluZSBYQ0hBTF9OVU1fQVJFR1NfTE9HMgkJNgkvKiBsb2cyKFhDSEFMX05VTV9BUkVHUykgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlBRERSRVNTIEFMSUdOTUVOVAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogIFRoZXNlIGFwcGx5IHRvIGEgc2VsZWN0ZWQgc2V0IG9mIGNvcmUgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zIG9ubHkgKHNlZSBJU0EpOiAgKi8KKyNkZWZpbmUgWENIQUxfVU5BTElHTkVEX0xPQURfRVhDRVBUSU9OCTEJLyogMSBpZiB1bmFsaWduZWQgbG9hZHMgY2F1c2UgYW4gZXhjZXB0aW9uLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9VTkFMSUdORURfU1RPUkVfRVhDRVBUSU9OCTEJLyogMSBpZiB1bmFsaWduZWQgc3RvcmVzIGNhdXNlIGFuIGV4Y2VwdGlvbiwgMCBvdGhlcndpc2UgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlJTlRFUlJVUFRTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0hBVkVfSU5URVJSVVBUUwkJMQkvKiAxIGlmIGludGVycnVwdCBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9ISUdIUFJJX0lOVEVSUlVQVFMJMQkvKiAxIGlmIGhpZ2gtcHJpb3JpdHkgaW50ZXJydXB0IG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX0hJR0hMRVZFTF9JTlRFUlJVUFRTCVhDSEFMX0hBVkVfSElHSFBSSV9JTlRFUlJVUFRTCisjZGVmaW5lIFhDSEFMX0hBVkVfTk1JCQkJMAkvKiAxIGlmIE5NSSBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0lOVEVSUlVQVFMJCTE3CS8qIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFhDSEFMX05VTV9JTlRFUlJVUFRTX0xPRzIJNQkvKiBudW1iZXIgb2YgYml0cyB0byBob2xkIGFuIGludGVycnVwdCBudW1iZXI6IHJvdW5kdXAobG9nMihudW1iZXIgb2YgaW50ZXJydXB0cykpICovCisjZGVmaW5lIFhDSEFMX05VTV9FWFRJTlRFUlJVUFRTCQkxMAkvKiBudW1iZXIgb2YgZXh0ZXJuYWwgaW50ZXJydXB0cyAqLworI2RlZmluZSBYQ0hBTF9OVU1fSU5UTEVWRUxTCQk0CS8qIG51bWJlciBvZiBpbnRlcnJ1cHQgbGV2ZWxzIChub3QgaW5jbHVkaW5nIGxldmVsIHplcm8hKSAqLworI2RlZmluZSBYQ0hBTF9OVU1fTE9XUFJJX0xFVkVMUwkJMQkJCS8qIG51bWJlciBvZiBsb3ctcHJpb3JpdHkgaW50ZXJydXB0IGxldmVscyAoYWx3YXlzIDEpICovCisjZGVmaW5lIFhDSEFMX0ZJUlNUX0hJR0hQUklfTEVWRUwJKFhDSEFMX05VTV9MT1dQUklfTEVWRUxTKzEpCS8qIGxldmVsIG9mIGZpcnN0IGhpZ2gtcHJpb3JpdHkgaW50ZXJydXB0IChhbHdheXMgMikgKi8KKyNkZWZpbmUgWENIQUxfRVhDTV9MRVZFTAkJMQkJCS8qIGxldmVsIG9mIGludGVycnVwdHMgbWFza2VkIGJ5IFBTLkVYQ00gKFhFQTIgb25seTsgYWx3YXlzIDEgaW4gVDEweHgpOworCQkJCQkJCQkgICBmb3IgWEVBMSwgd2hlcmUgdGhlcmUgaXMgbm8gUFMuRVhDTSwgdGhpcyBpcyBhbHdheXMgMTsKKwkJCQkJCQkJICAgaW50ZXJydXB0cyBhdCBsZXZlbHMgRklSU1RfSElHSFBSSSA8PSBuIDw9IEVYQ01fTEVWRUwsIGlmIGFueSwKKwkJCQkJCQkJICAgYXJlIHRlcm1lZCAibWVkaXVtIHByaW9yaXR5IiBpbnRlcnJ1cHRzIChwb3N0IFQxMHh4IG9ubHkpICovCisvKiAgTm90ZTogIDEgPD0gTE9XUFJJX0xFVkVMUyA8PSBFWENNX0xFVkVMIDwgREVCVUdMRVZFTCA8PSBOVU1fSU5UTEVWRUxTIDwgTk1JTEVWRUwgPD0gMTUgICovCisKKy8qICBNYXNrcyBvZiBpbnRlcnJ1cHRzIGF0IGVhY2ggaW50ZXJydXB0IGxldmVsOiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwwX01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwxX01BU0sJCTB4MDAwMDY0RjkKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwyX01BU0sJCTB4MDAwMDg5MDIKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX01BU0sJCTB4MDAwMTEyMDQKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw0X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw1X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw3X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw4X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw5X01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwxMF9NQVNLCQkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMTFfTUFTSwkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDEyX01BU0sJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwxM19NQVNLCQkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMTRfTUFTSwkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDE1X01BU0sJCTB4MDAwMDAwMDAKKy8qICBBcyBhbiBhcnJheSBvZiBlbnRyaWVzIChlZy4gZm9yIEMgY29uc3RhbnQgYXJyYXlzKTogICovCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMX01BU0tTCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDY0RjkJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwODkwMglYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDExMjA0CVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDAwMDAJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwMDAwMAlYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDAwMDAwCisKKy8qICBNYXNrcyBvZiBpbnRlcnJ1cHRzIGF0IGVhY2ggcmFuZ2UgMS4ubiBvZiBpbnRlcnJ1cHQgbGV2ZWxzOiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwwX0FOREJFTE9XX01BU0sJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDFfQU5EQkVMT1dfTUFTSwkweDAwMDA2NEY5CisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9BTkRCRUxPV19NQVNLCTB4MDAwMEVERkIKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMNV9BTkRCRUxPV19NQVNLCTB4MDAwMUZGRkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw2X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDdfQU5EQkVMT1dfTUFTSwkweDAwMDFGRkZGCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMOF9BTkRCRUxPV19NQVNLCTB4MDAwMUZGRkYKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw5X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDEwX0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDExX0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDEyX0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDEzX0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDE0X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDE1X0FOREJFTE9XX01BU0sJMHgwMDAxRkZGRgorI2RlZmluZSBYQ0hBTF9MT1dQUklfTUFTSwkJWENIQUxfSU5UTEVWRUwxX0FOREJFTE9XX01BU0sJLyogbWFzayBvZiBhbGwgbG93LXByaW9yaXR5IGludGVycnVwdHMgKi8KKyNkZWZpbmUgWENIQUxfRVhDTV9NQVNLCQkJWENIQUxfSU5UTEVWRUwxX0FOREJFTE9XX01BU0sJLyogbWFzayBvZiBhbGwgaW50ZXJydXB0cyBtYXNrZWQgYnkgUFMuRVhDTSAob3IgQ0VYQ00pICovCisvKiAgQXMgYW4gYXJyYXkgb2YgZW50cmllcyAoZWcuIGZvciBDIGNvbnN0YW50IGFycmF5cyk6ICAqLworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTF9BTkRCRUxPV19NQVNLUwkweDAwMDAwMDAwCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDY0RjkJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwRURGQglYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDFGRkZGCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMUZGRkYJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAxRkZGRglYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDFGRkZGCisKKy8qICBJbnRlcnJ1cHQgbnVtYmVycyBmb3IgZWFjaCBpbnRlcnJ1cHQgbGV2ZWwgYXQgd2hpY2ggb25seSBvbmUgaW50ZXJydXB0IHdhcyBjb25maWd1cmVkOiAgKi8KKy8qI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDFfTlVNCQkuLi5tb3JlIHRoYW4gb25lIGludGVycnVwdCBhdCB0aGlzIGxldmVsLi4uKi8KKy8qI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfTlVNCQkuLi5tb3JlIHRoYW4gb25lIGludGVycnVwdCBhdCB0aGlzIGxldmVsLi4uKi8KKy8qI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDNfTlVNCQkuLi5tb3JlIHRoYW4gb25lIGludGVycnVwdCBhdCB0aGlzIGxldmVsLi4uKi8KKworLyogIExldmVsIG9mIGVhY2ggaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UMF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxX0xFVkVMCQkyCisjZGVmaW5lIFhDSEFMX0lOVDJfTEVWRUwJCTMKKyNkZWZpbmUgWENIQUxfSU5UM19MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQ0X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDVfTEVWRUwJCTEKKyNkZWZpbmUgWENIQUxfSU5UNl9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQ3X0xFVkVMCQkxCisjZGVmaW5lIFhDSEFMX0lOVDhfTEVWRUwJCTIKKyNkZWZpbmUgWENIQUxfSU5UOV9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9JTlQxMF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxMV9MRVZFTAkJMgorI2RlZmluZSBYQ0hBTF9JTlQxMl9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9JTlQxM19MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxNF9MRVZFTAkJMQorI2RlZmluZSBYQ0hBTF9JTlQxNV9MRVZFTAkJMgorI2RlZmluZSBYQ0hBTF9JTlQxNl9MRVZFTAkJMworI2RlZmluZSBYQ0hBTF9JTlQxN19MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQxOF9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQxOV9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyMF9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyMV9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyMl9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyM19MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyNF9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyNV9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyNl9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyN19MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyOF9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQyOV9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQzMF9MRVZFTAkJMAorI2RlZmluZSBYQ0hBTF9JTlQzMV9MRVZFTAkJMAorLyogIEFzIGFuIGFycmF5IG9mIGVudHJpZXMgKGVnLiBmb3IgQyBjb25zdGFudCBhcnJheXMpOiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UX0xFVkVMUwkJMQlYQ0hBTF9TRVAgXAorCQkJCQkyCVhDSEFMX1NFUCBcCisJCQkJCTMJWENIQUxfU0VQIFwKKwkJCQkJMQlYQ0hBTF9TRVAgXAorCQkJCQkxCVhDSEFMX1NFUCBcCisJCQkJCTEJWENIQUxfU0VQIFwKKwkJCQkJMQlYQ0hBTF9TRVAgXAorCQkJCQkxCVhDSEFMX1NFUCBcCisJCQkJCTIJWENIQUxfU0VQIFwKKwkJCQkJMwlYQ0hBTF9TRVAgXAorCQkJCQkxCVhDSEFMX1NFUCBcCisJCQkJCTIJWENIQUxfU0VQIFwKKwkJCQkJMwlYQ0hBTF9TRVAgXAorCQkJCQkxCVhDSEFMX1NFUCBcCisJCQkJCTEJWENIQUxfU0VQIFwKKwkJCQkJMglYQ0hBTF9TRVAgXAorCQkJCQkzCVhDSEFMX1NFUCBcCisJCQkJCTAJWENIQUxfU0VQIFwKKwkJCQkJMAlYQ0hBTF9TRVAgXAorCQkJCQkwCVhDSEFMX1NFUCBcCisJCQkJCTAJWENIQUxfU0VQIFwKKwkJCQkJMAlYQ0hBTF9TRVAgXAorCQkJCQkwCVhDSEFMX1NFUCBcCisJCQkJCTAJWENIQUxfU0VQIFwKKwkJCQkJMAlYQ0hBTF9TRVAgXAorCQkJCQkwCVhDSEFMX1NFUCBcCisJCQkJCTAJWENIQUxfU0VQIFwKKwkJCQkJMAlYQ0hBTF9TRVAgXAorCQkJCQkwCVhDSEFMX1NFUCBcCisJCQkJCTAJWENIQUxfU0VQIFwKKwkJCQkJMAlYQ0hBTF9TRVAgXAorCQkJCQkwCisKKy8qICBUeXBlIG9mIGVhY2ggaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UMF9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQxX1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDJfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UM19UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQ0X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMCisjZGVmaW5lIFhDSEFMX0lOVDVfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UNl9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTAorI2RlZmluZSBYQ0hBTF9JTlQ3X1RZUEUgCVhUSEFMX0lOVFRZUEVfRVhURVJOX0VER0UKKyNkZWZpbmUgWENIQUxfSU5UOF9UWVBFIAlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCisjZGVmaW5lIFhDSEFMX0lOVDlfVFlQRSAJWFRIQUxfSU5UVFlQRV9FWFRFUk5fRURHRQorI2RlZmluZSBYQ0hBTF9JTlQxMF9UWVBFIAlYVEhBTF9JTlRUWVBFX1RJTUVSCisjZGVmaW5lIFhDSEFMX0lOVDExX1RZUEUgCVhUSEFMX0lOVFRZUEVfVElNRVIKKyNkZWZpbmUgWENIQUxfSU5UMTJfVFlQRSAJWFRIQUxfSU5UVFlQRV9USU1FUgorI2RlZmluZSBYQ0hBTF9JTlQxM19UWVBFIAlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFCisjZGVmaW5lIFhDSEFMX0lOVDE0X1RZUEUgCVhUSEFMX0lOVFRZUEVfU09GVFdBUkUKKyNkZWZpbmUgWENIQUxfSU5UMTVfVFlQRSAJWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQorI2RlZmluZSBYQ0hBTF9JTlQxNl9UWVBFIAlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFCisjZGVmaW5lIFhDSEFMX0lOVDE3X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDE4X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDE5X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDIwX1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDIxX1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDIyX1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDIzX1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDI0X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDI1X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDI2X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDI3X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDI4X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDI5X1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDMwX1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisjZGVmaW5lIFhDSEFMX0lOVDMxX1RZUEUgCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisvKiAgQXMgYW4gYXJyYXkgb2YgZW50cmllcyAoZWcuIGZvciBDIGNvbnN0YW50IGFycmF5cyk6ICAqLworI2RlZmluZSBYQ0hBTF9JTlRfVFlQRVMJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9MRVZFTCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfRVhURVJOX0xFVkVMICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1RJTUVSICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1RJTUVSICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1RJTUVSICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1NPRlRXQVJFICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVEICAgICAJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9JTlRUWVBFX1VOQ09ORklHVVJFRCAgICAgCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfSU5UVFlQRV9VTkNPTkZJR1VSRUQgICAgIAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECisKKy8qICBNYXNrcyBvZiBpbnRlcnJ1cHRzIGZvciBlYWNoIHR5cGUgb2YgaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWENIQUxfSU5UVFlQRV9NQVNLX1VOQ09ORklHVVJFRAkweEZGRkUwMDAwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19TT0ZUV0FSRQkweDAwMDFFMDAwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19FWFRFUk5fRURHRQkweDAwMDAwMzgwCisjZGVmaW5lIFhDSEFMX0lOVFRZUEVfTUFTS19FWFRFUk5fTEVWRUwJMHgwMDAwMDA3RgorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfVElNRVIJMHgwMDAwMUMwMAorI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tfTk1JCQkweDAwMDAwMDAwCisvKiAgQXMgYW4gYXJyYXkgb2YgZW50cmllcyAoZWcuIGZvciBDIGNvbnN0YW50IGFycmF5cyk6ICAqLworI2RlZmluZSBYQ0hBTF9JTlRUWVBFX01BU0tTCQkweEZGRkUwMDAwCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMUUwMDAJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwMDM4MAlYQ0hBTF9TRVAgXAorCQkJCQkweDAwMDAwMDdGCVhDSEFMX1NFUCBcCisJCQkJCTB4MDAwMDFDMDAJWENIQUxfU0VQIFwKKwkJCQkJMHgwMDAwMDAwMAorCisvKiAgSW50ZXJydXB0cyBhc3NpZ25lZCB0byBlYWNoIHRpbWVyIChDQ09NUEFSRTAgdG8gQ0NPTVBBUkUzKSwgLTEgaWYgdW5hc3NpZ25lZCAgKi8KKyNkZWZpbmUgWENIQUxfVElNRVIwX0lOVEVSUlVQVAkxMAorI2RlZmluZSBYQ0hBTF9USU1FUjFfSU5URVJSVVBUCTExCisjZGVmaW5lIFhDSEFMX1RJTUVSMl9JTlRFUlJVUFQJMTIKKyNkZWZpbmUgWENIQUxfVElNRVIzX0lOVEVSUlVQVAlYVEhBTF9USU1FUl9VTkNPTkZJR1VSRUQKKy8qICBBcyBhbiBhcnJheSBvZiBlbnRyaWVzIChlZy4gZm9yIEMgY29uc3RhbnQgYXJyYXlzKTogICovCisjZGVmaW5lIFhDSEFMX1RJTUVSX0lOVEVSUlVQVFMJMTAJWENIQUxfU0VQIFwKKwkJCQkxMQlYQ0hBTF9TRVAgXAorCQkJCTEyCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfVElNRVJfVU5DT05GSUdVUkVECisKKy8qICBJbmRleGluZyBtYWNyb3M6ICAqLworI2RlZmluZSBfWENIQUxfSU5UTEVWRUxfTUFTSyhuKQkJWENIQUxfSU5UTEVWRUwgIyMgbiAjIyBfTUFTSworI2RlZmluZSBYQ0hBTF9JTlRMRVZFTF9NQVNLKG4pCQlfWENIQUxfSU5UTEVWRUxfTUFTSyhuKQkJLyogbiA9IDAgLi4gMTUgKi8KKyNkZWZpbmUgX1hDSEFMX0lOVExFVkVMX0FOREJFTE9XTUFTSyhuKQlYQ0hBTF9JTlRMRVZFTCAjIyBuICMjIF9BTkRCRUxPV19NQVNLCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMX0FOREJFTE9XX01BU0sobikJX1hDSEFMX0lOVExFVkVMX0FOREJFTE9XTUFTSyhuKQkvKiBuID0gMCAuLiAxNSAqLworI2RlZmluZSBfWENIQUxfSU5UX0xFVkVMKG4pCQlYQ0hBTF9JTlQgIyMgbiAjIyBfTEVWRUwKKyNkZWZpbmUgWENIQUxfSU5UX0xFVkVMKG4pCQlfWENIQUxfSU5UX0xFVkVMKG4pCQkvKiBuID0gMCAuLiAzMSAqLworI2RlZmluZSBfWENIQUxfSU5UX1RZUEUobikJCVhDSEFMX0lOVCAjIyBuICMjIF9UWVBFCisjZGVmaW5lIFhDSEFMX0lOVF9UWVBFKG4pCQlfWENIQUxfSU5UX1RZUEUobikJCS8qIG4gPSAwIC4uIDMxICovCisjZGVmaW5lIF9YQ0hBTF9USU1FUl9JTlRFUlJVUFQobikJWENIQUxfVElNRVIgIyMgbiAjIyBfSU5URVJSVVBUCisjZGVmaW5lIFhDSEFMX1RJTUVSX0lOVEVSUlVQVChuKQlfWENIQUxfVElNRVJfSU5URVJSVVBUKG4pCS8qIG4gPSAwIC4uIDMgKi8KKworCisKKy8qCisgKiAgRXh0ZXJuYWwgaW50ZXJydXB0IHZlY3RvcnMvbGV2ZWxzLgorICogIFRoZXNlIG1hY3JvcyBkZXNjcmliZSBob3cgWHRlbnNhIHByb2Nlc3NvciBpbnRlcnJ1cHQgbnVtYmVycworICogIChhcyBudW1iZXJlZCBpbnRlcm5hbGx5LCBlZy4gaW4gSU5URVJSVVBUIGFuZCBJTlRFTkFCTEUgcmVnaXN0ZXJzKQorICogIG1hcCB0byBleHRlcm5hbCBCSW50ZXJydXB0PG4+IHBpbnMsIGZvciB0aG9zZSBpbnRlcnJ1cHRzCisgKiAgY29uZmlndXJlZCBhcyBleHRlcm5hbCAobGV2ZWwtdHJpZ2dlcmVkLCBlZGdlLXRyaWdnZXJlZCwgb3IgTk1JKS4KKyAqICBTZWUgdGhlIFh0ZW5zYSBwcm9jZXNzb3IgZGF0YWJvb2sgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiAgQ29yZSBpbnRlcnJ1cHQgbnVtYmVycyBtYXBwZWQgdG8gZWFjaCBFWFRFUk5BTCBpbnRlcnJ1cHQgbnVtYmVyOiAgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMF9OVU0JCTAJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDFfTlVNCQkxCS8qIChpbnRsZXZlbCAyKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQyX05VTQkJMgkvKiAoaW50bGV2ZWwgMykgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UM19OVU0JCTMJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDRfTlVNCQk0CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ1X05VTQkJNQkvKiAoaW50bGV2ZWwgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UNl9OVU0JCTYJLyogKGludGxldmVsIDEpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDdfTlVNCQk3CS8qIChpbnRsZXZlbCAxKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ4X05VTQkJOAkvKiAoaW50bGV2ZWwgMikgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UOV9OVU0JCTkJLyogKGludGxldmVsIDMpICovCisKKy8qICBDb3JyZXNwb25kaW5nIGludGVycnVwdCBtYXNrczogICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDBfTUFTSwkJMHgwMDAwMDAwMQorI2RlZmluZSBYQ0hBTF9FWFRJTlQxX01BU0sJCTB4MDAwMDAwMDIKKyNkZWZpbmUgWENIQUxfRVhUSU5UMl9NQVNLCQkweDAwMDAwMDA0CisjZGVmaW5lIFhDSEFMX0VYVElOVDNfTUFTSwkJMHgwMDAwMDAwOAorI2RlZmluZSBYQ0hBTF9FWFRJTlQ0X01BU0sJCTB4MDAwMDAwMTAKKyNkZWZpbmUgWENIQUxfRVhUSU5UNV9NQVNLCQkweDAwMDAwMDIwCisjZGVmaW5lIFhDSEFMX0VYVElOVDZfTUFTSwkJMHgwMDAwMDA0MAorI2RlZmluZSBYQ0hBTF9FWFRJTlQ3X01BU0sJCTB4MDAwMDAwODAKKyNkZWZpbmUgWENIQUxfRVhUSU5UOF9NQVNLCQkweDAwMDAwMTAwCisjZGVmaW5lIFhDSEFMX0VYVElOVDlfTUFTSwkJMHgwMDAwMDIwMAorCisvKiAgQ29yZSBjb25maWcgaW50ZXJydXB0IGxldmVscyBtYXBwZWQgdG8gZWFjaCBleHRlcm5hbCBpbnRlcnJ1cHQ6ICAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQwX0xFVkVMCQkxCS8qIChpbnQgbnVtYmVyIDApICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDFfTEVWRUwJCTIJLyogKGludCBudW1iZXIgMSkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UMl9MRVZFTAkJMwkvKiAoaW50IG51bWJlciAyKSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQzX0xFVkVMCQkxCS8qIChpbnQgbnVtYmVyIDMpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDRfTEVWRUwJCTEJLyogKGludCBudW1iZXIgNCkgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UNV9MRVZFTAkJMQkvKiAoaW50IG51bWJlciA1KSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ2X0xFVkVMCQkxCS8qIChpbnQgbnVtYmVyIDYpICovCisjZGVmaW5lIFhDSEFMX0VYVElOVDdfTEVWRUwJCTEJLyogKGludCBudW1iZXIgNykgKi8KKyNkZWZpbmUgWENIQUxfRVhUSU5UOF9MRVZFTAkJMgkvKiAoaW50IG51bWJlciA4KSAqLworI2RlZmluZSBYQ0hBTF9FWFRJTlQ5X0xFVkVMCQkzCS8qIChpbnQgbnVtYmVyIDkpICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlFWENFUFRJT05TIGFuZCBWRUNUT1JTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0hBVkVfRVhDRVBUSU9OUwkJMQkvKiAxIGlmIGV4Y2VwdGlvbiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKworI2RlZmluZSBYQ0hBTF9YRUFfVkVSU0lPTgkJMgkvKiBYdGVuc2EgRXhjZXB0aW9uIEFyY2hpdGVjdHVyZSBudW1iZXI6IDEgZm9yIFhFQTEgKG9sZCksIDIgZm9yIFhFQTIgKG5ldykgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9YRUExCQkJMAkvKiAxIGlmIFhFQTEsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfWEVBMgkJCTEJLyogMSBpZiBYRUEyLCAwIG90aGVyd2lzZSAqLworLyogIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IE9OTFkgLS0gRE8gTk9UIFVTRSAod2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSByZWxlYXNlKTogICovCisjZGVmaW5lIFhDSEFMX0hBVkVfT0xEX0VYQ19BUkNICQlYQ0hBTF9IQVZFX1hFQTEJLyogKERFUFJFQ0FURUQpIDEgaWYgb2xkIGV4Y2VwdGlvbiBhcmNoaXRlY3R1cmUgKFhFQTEpLCAwIG90aGVyd2lzZSAoZWcuIFhFQTIpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRVhDTQkJCVhDSEFMX0hBVkVfWEVBMgkvKiAoREVQUkVDQVRFRCkgMSBpZiBQUy5FWENNIGJpdCBleGlzdHMgKGN1cnJlbnRseSBlcXVhbHMgWENIQUxfSEFWRV9UTEJTKSAqLworCisjZGVmaW5lIFhDSEFMX1JFU0VUX1ZFQ1RPUl9WQUREUgkweEZFMDAwMDIwCisjZGVmaW5lIFhDSEFMX1JFU0VUX1ZFQ1RPUl9QQUREUgkweEZFMDAwMDIwCisjZGVmaW5lIFhDSEFMX1VTRVJfVkVDVE9SX1ZBRERSCQkweEQwMDAwMjIwCisjZGVmaW5lIFhDSEFMX1BST0dSQU1FWENfVkVDVE9SX1ZBRERSCVhDSEFMX1VTRVJfVkVDVE9SX1ZBRERSCQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBYQ0hBTF9VU0VSRVhDX1ZFQ1RPUl9WQUREUglYQ0hBTF9VU0VSX1ZFQ1RPUl9WQUREUgkJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgWENIQUxfVVNFUl9WRUNUT1JfUEFERFIJCTB4MDAwMDAyMjAKKyNkZWZpbmUgWENIQUxfUFJPR1JBTUVYQ19WRUNUT1JfUEFERFIJWENIQUxfVVNFUl9WRUNUT1JfUEFERFIJCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFhDSEFMX1VTRVJFWENfVkVDVE9SX1BBRERSCVhDSEFMX1VTRVJfVkVDVE9SX1BBRERSCQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBYQ0hBTF9LRVJORUxfVkVDVE9SX1ZBRERSCTB4RDAwMDAyMDAKKyNkZWZpbmUgWENIQUxfU1RBQ0tFREVYQ19WRUNUT1JfVkFERFIJWENIQUxfS0VSTkVMX1ZFQ1RPUl9WQUREUgkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBYQ0hBTF9LRVJORUxFWENfVkVDVE9SX1ZBRERSCVhDSEFMX0tFUk5FTF9WRUNUT1JfVkFERFIJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgWENIQUxfS0VSTkVMX1ZFQ1RPUl9QQUREUgkweDAwMDAwMjAwCisjZGVmaW5lIFhDSEFMX1NUQUNLRURFWENfVkVDVE9SX1BBRERSCVhDSEFMX0tFUk5FTF9WRUNUT1JfUEFERFIJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgWENIQUxfS0VSTkVMRVhDX1ZFQ1RPUl9QQUREUglYQ0hBTF9LRVJORUxfVkVDVE9SX1BBRERSCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFhDSEFMX0RPVUJMRUVYQ19WRUNUT1JfVkFERFIJMHhEMDAwMDI5MAorI2RlZmluZSBYQ0hBTF9ET1VCTEVFWENfVkVDVE9SX1BBRERSCTB4MDAwMDAyOTAKKyNkZWZpbmUgWENIQUxfV0lORE9XX1ZFQ1RPUlNfVkFERFIJMHhEMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9XSU5ET1dfVkVDVE9SU19QQUREUgkweDAwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMMl9WRUNUT1JfVkFERFIJMHhEMDAwMDI0MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDJfVkVDVE9SX1BBRERSCTB4MDAwMDAyNDAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUwzX1ZFQ1RPUl9WQUREUgkweEQwMDAwMjUwCisjZGVmaW5lIFhDSEFMX0lOVExFVkVMM19WRUNUT1JfUEFERFIJMHgwMDAwMDI1MAorI2RlZmluZSBYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1ZBRERSCTB4RkUwMDA1MjAKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUw0X1ZFQ1RPUl9QQUREUgkweEZFMDAwNTIwCisjZGVmaW5lIFhDSEFMX0RFQlVHX1ZFQ1RPUl9WQUREUglYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1ZBRERSCisjZGVmaW5lIFhDSEFMX0RFQlVHX1ZFQ1RPUl9QQUREUglYQ0hBTF9JTlRMRVZFTDRfVkVDVE9SX1BBRERSCisKKy8qICBJbmRleGluZyBtYWNyb3M6ICAqLworI2RlZmluZSBfWENIQUxfSU5UTEVWRUxfVkVDVE9SX1ZBRERSKG4pCQlYQ0hBTF9JTlRMRVZFTCAjIyBuICMjIF9WRUNUT1JfVkFERFIKKyNkZWZpbmUgWENIQUxfSU5UTEVWRUxfVkVDVE9SX1ZBRERSKG4pCQlfWENIQUxfSU5UTEVWRUxfVkVDVE9SX1ZBRERSKG4pCQkvKiBuID0gMCAuLiAxNSAqLworCisvKgorICogIEdlbmVyYWwgRXhjZXB0aW9uIENhdXNlcworICogICh2YWx1ZXMgb2YgRVhDQ0FVU0Ugc3BlY2lhbCByZWdpc3RlciBzZXQgYnkgZ2VuZXJhbCBleGNlcHRpb25zLAorICogICB3aGljaCB2ZWN0b3IgdG8gdGhlIHVzZXIsIGtlcm5lbCwgb3IgZG91YmxlLWV4Y2VwdGlvbiB2ZWN0b3JzKToKKyAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9JTExFR0FMX0lOU1RSVUNUSU9OCQkwCS8qIElsbGVnYWwgSW5zdHJ1Y3Rpb24gKElsbGVnYWxJbnN0cnVjdGlvbikgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfU1lTVEVNX0NBTEwJCQkxCS8qIFN5c3RlbSBDYWxsIChTeXN0ZW1DYWxsKSAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9JTlNUUlVDVElPTl9GRVRDSF9FUlJPUgkJMgkvKiBJbnN0cnVjdGlvbiBGZXRjaCBFcnJvciAoSW5zdHJ1Y3Rpb25GZXRjaEVycm9yKSAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9MT0FEX1NUT1JFX0VSUk9SCQkJMwkvKiBMb2FkIFN0b3JlIEVycm9yIChMb2FkU3RvcmVFcnJvcikgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfTEVWRUwxX0lOVEVSUlVQVAkJCTQJLyogTGV2ZWwgMSBJbnRlcnJ1cHQgKExldmVsMUludGVycnVwdCkgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfQUxMT0NBCQkJCTUJLyogU3RhY2sgRXh0ZW5zaW9uIEFzc2lzdCAoQWxsb2NhKSAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9JTlRFR0VSX0RJVklERV9CWV9aRVJPCQk2CS8qIEludGVnZXIgRGl2aWRlIGJ5IFplcm8gKEludGVnZXJEaXZpZGVCeVplcm8pICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX1NQRUNVTEFUSU9OCQkJNwkvKiBTcGVjdWxhdGlvbiAoU3BlY3VsYXRpb24pICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX1BSSVZJTEVHRUQJCQk4CS8qIFByaXZpbGVnZWQgSW5zdHJ1Y3Rpb24gKFByaXZpbGVnZWQpICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX1VOQUxJR05FRAkJCTkJLyogVW5hbGlnbmVkIExvYWQgU3RvcmUgKFVuYWxpZ25lZCkgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfSVRMQl9NSVNTCQkJMTYJLyogSVRsYiBNaXNzIEV4Y2VwdGlvbiAoSVRsYk1pc3MpICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0lUTEJfTVVMVElISVQJCQkxNwkvKiBJVGxiIE11dGx0aWhpdCBFeGNlcHRpb24gKElUbGJNdWx0aWhpdCkgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfSVRMQl9QUklWSUxFR0UJCQkxOAkvKiBJVGxiIFByaXZpbGVnZSBFeGNlcHRpb24gKElUbGJQcml2aWxlZ2UpICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0lUTEJfU0laRV9SRVNUUklDVElPTgkJMTkJLyogSVRsYiBTaXplIFJlc3RyaWN0aW9uIEV4Y2VwdGlvbiAoSVRsYlNpemVSZXN0cmljdGlvbikgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfRkVUQ0hfQ0FDSEVfQVRUUklCVVRFCQkyMAkvKiBGZXRjaCBDYWNoZSBBdHRyaWJ1dGUgRXhjZXB0aW9uIChGZXRjaENhY2hlQXR0cmlidXRlKSAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9EVExCX01JU1MJCQkyNAkvKiBEVGxiIE1pc3MgRXhjZXB0aW9uIChEVGxiTWlzcykgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfRFRMQl9NVUxUSUhJVAkJCTI1CS8qIERUbGIgTXVsdGloaXQgRXhjZXB0aW9uIChEVGxiTXVsdGloaXQpICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0RUTEJfUFJJVklMRUdFCQkJMjYJLyogRFRsYiBQcml2aWxlZ2UgRXhjZXB0aW9uIChEVGxiUHJpdmlsZWdlKSAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9EVExCX1NJWkVfUkVTVFJJQ1RJT04JCTI3CS8qIERUbGIgU2l6ZSBSZXN0cmljdGlvbiBFeGNlcHRpb24gKERUbGJTaXplUmVzdHJpY3Rpb24pICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0xPQURfQ0FDSEVfQVRUUklCVVRFCQkyOAkvKiBMb2FkIENhY2hlIEF0dHJpYnV0ZSBFeGNlcHRpb24gKExvYWRDYWNoZUF0dHJpYnV0ZSkgKi8KKyNkZWZpbmUgWENIQUxfRVhDQ0FVU0VfU1RPUkVfQ0FDSEVfQVRUUklCVVRFCQkyOQkvKiBTdG9yZSBDYWNoZSBBdHRyaWJ1dGUgRXhjZXB0aW9uIChTdG9yZUNhY2hlQXR0cmlidXRlKSAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9GTE9BVElOR19QT0lOVAkJCTQwCS8qIEZsb2F0aW5nIFBvaW50IEV4Y2VwdGlvbiAoRmxvYXRpbmdQb2ludCkgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCVRJTUVSUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0NDT1VOVAkJMQkvKiAxIGlmIGhhdmUgQ0NPVU5ULCAwIG90aGVyd2lzZSAqLworLyojZGVmaW5lIFhDSEFMX0hBVkVfVElNRVJTCQlYQ0hBTF9IQVZFX0NDT1VOVCovCisjZGVmaW5lIFhDSEFMX05VTV9USU1FUlMJCTMJLyogbnVtYmVyIG9mIENDT01QQVJFbiByZWdzICovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlERUJVRworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0RFQlVHCQkxCS8qIDEgaWYgZGVidWcgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfT0NECQkJMQkvKiAxIGlmIE9uQ2hpcERlYnVnIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9OVU1fSUJSRUFLCQkyCS8qIG51bWJlciBvZiBJQlJFQUtuIHJlZ3MgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RCUkVBSwkJMgkvKiBudW1iZXIgb2YgREJSRUFLbiByZWdzICovCisjZGVmaW5lIFhDSEFMX0RFQlVHTEVWRUwJCTQJLyogZGVidWcgaW50ZXJydXB0IGxldmVsICovCisvKkRlYnVnRXh0ZXJuYWxJbnRlcnJ1cHQJCTAJCTB8MSovCisvKkRlYnVnVXNlRElSQXJyYXkJCQkwCQkwfDEqLworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUNPUFJPQ0VTU09SUyBhbmQgRVhUUkEgU1RBVEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfSEFWRV9DUAkJCTAJLyogMSBpZiBjb3Byb2Nlc3NvciBvcHRpb24gY29uZmlndXJlZCAoQ1BFTkFCTEUgcHJlc2VudCkgKi8KKyNkZWZpbmUgWENIQUxfQ1BfTUFYQ0ZHCQkJMAkvKiBtYXggYWxsb3dlZCBjcCBpZCBwbHVzIG9uZSAocGVyIGNmZykgKi8KKworI2luY2x1ZGUgPHh0ZW5zYS9jb25maWcvdGllLmg+CisKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSU5URVJOQUwgSS9EIFJBTS9ST01zIGFuZCBYTE1JCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX05VTV9JTlNUUk9NCQkwCS8qIG51bWJlciBvZiBjb3JlIGluc3RydWN0aW9uIFJPTXMgY29uZmlndXJlZCAqLworI2RlZmluZSBYQ0hBTF9OVU1fSU5TVFJBTQkJMAkvKiBudW1iZXIgb2YgY29yZSBpbnN0cnVjdGlvbiBSQU1zIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RBVEFST00JCTAJLyogbnVtYmVyIG9mIGNvcmUgZGF0YSBST01zIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgWENIQUxfTlVNX0RBVEFSQU0JCTAJLyogbnVtYmVyIG9mIGNvcmUgZGF0YSBSQU1zIGNvbmZpZ3VyZWQgKi8KKyNkZWZpbmUgWENIQUxfTlVNX1hMTUkJCQkwCS8qIG51bWJlciBvZiBjb3JlIFhMTUkgcG9ydHMgY29uZmlndXJlZCAqLworI2RlZmluZSAgWENIQUxfTlVNX0lST00JCQlYQ0hBTF9OVU1fSU5TVFJPTQkvKiAoREVQUkVDQVRFRCkgKi8KKyNkZWZpbmUgIFhDSEFMX05VTV9JUkFNCQkJWENIQUxfTlVNX0lOU1RSQU0JLyogKERFUFJFQ0FURUQpICovCisjZGVmaW5lICBYQ0hBTF9OVU1fRFJPTQkJCVhDSEFMX05VTV9EQVRBUk9NCS8qIChERVBSRUNBVEVEKSAqLworI2RlZmluZSAgWENIQUxfTlVNX0RSQU0JCQlYQ0hBTF9OVU1fREFUQVJBTQkvKiAoREVQUkVDQVRFRCkgKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUNBQ0hFCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAgU2l6ZSBvZiB0aGUgY2FjaGUgbGluZXMgaW4gbG9nMihieXRlcyk6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfTElORVdJRFRICQk0CisjZGVmaW5lIFhDSEFMX0RDQUNIRV9MSU5FV0lEVEgJCTQKKy8qICBTaXplIG9mIHRoZSBjYWNoZSBsaW5lcyBpbiBieXRlczogICovCisjZGVmaW5lIFhDSEFMX0lDQUNIRV9MSU5FU0laRQkJMTYKKyNkZWZpbmUgWENIQUxfRENBQ0hFX0xJTkVTSVpFCQkxNgorLyogIE1heCBmb3IgYm90aCBJLWNhY2hlIGFuZCBELWNhY2hlICh1c2VkIGZvciBnZW5lcmFsIGFsaWdubWVudCk6ICAqLworI2RlZmluZSBYQ0hBTF9DQUNIRV9MSU5FV0lEVEhfTUFYCTQKKyNkZWZpbmUgWENIQUxfQ0FDSEVfTElORVNJWkVfTUFYCTE2CisKKy8qICBOdW1iZXIgb2YgY2FjaGUgc2V0cyBpbiBsb2cyKGxpbmVzIHBlciB3YXkpOiAgKi8KKyNkZWZpbmUgWENIQUxfSUNBQ0hFX1NFVFdJRFRICQk4CisjZGVmaW5lIFhDSEFMX0RDQUNIRV9TRVRXSURUSAkJOAorLyogIE1heCBmb3IgYm90aCBJLWNhY2hlIGFuZCBELWNhY2hlICh1c2VkIGZvciBnZW5lcmFsIGNhY2hlLWNvaGVyZW5jeSBwYWdlIGFsaWdubWVudCk6ICAqLworI2RlZmluZSBYQ0hBTF9DQUNIRV9TRVRXSURUSF9NQVgJOAorI2RlZmluZSBYQ0hBTF9DQUNIRV9TRVRTSVpFX01BWAkJMjU2CisKKy8qICBDYWNoZSBzZXQgYXNzb2NpYXRpdml0eSAobnVtYmVyIG9mIHdheXMpOiAgKi8KKyNkZWZpbmUgWENIQUxfSUNBQ0hFX1dBWVMJCTIKKyNkZWZpbmUgWENIQUxfRENBQ0hFX1dBWVMJCTIKKworLyogIFNpemUgb2YgdGhlIGNhY2hlcyBpbiBieXRlcyAod2F5cyAqIDJeKGxpbmV3aWR0aCArIHNldHdpZHRoKSk6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfU0laRQkJODE5MgorI2RlZmluZSBYQ0hBTF9EQ0FDSEVfU0laRQkJODE5MgorCisvKiAgQ2FjaGUgZmVhdHVyZXM6ICAqLworI2RlZmluZSBYQ0hBTF9EQ0FDSEVfSVNfV1JJVEVCQUNLCTAKKy8qICBXaGV0aGVyIGNhY2hlIGxvY2tpbmcgZmVhdHVyZSBpcyBhdmFpbGFibGU6ICAqLworI2RlZmluZSBYQ0hBTF9JQ0FDSEVfTElORV9MT0NLQUJMRQkwCisjZGVmaW5lIFhDSEFMX0RDQUNIRV9MSU5FX0xPQ0tBQkxFCTAKKworLyogIE51bWJlciBvZiAoZW5jb2RlZCkgY2FjaGUgYXR0cmlidXRlIGJpdHM6ICAqLworI2RlZmluZSBYQ0hBTF9DQV9CSVRTCQkJNAkvKiBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gaG9sZCBjYWNoZSBhdHRyaWJ1dGUgZW5jb2RpbmcgKi8KKy8qICAoVGhlIG51bWJlciBvZiBhY2Nlc3MgbW9kZSBiaXRzIChkZWNvZGVkIGNhY2hlIGF0dHJpYnV0ZSBiaXRzKSBpcyBkZWZpbmVkIGJ5IHRoZSBhcmNoaXRlY3R1cmU7IHNlZSB4dGVuc2EvaGFsLmg/KSAgKi8KKworCisvKiAgQ2FjaGUgQXR0cmlidXRlIGVuY29kaW5ncyAtLSBsaXN0cyBvZiBhY2Nlc3MgbW9kZXMgZm9yIGVhY2ggY2FjaGUgYXR0cmlidXRlOiAgKi8KKyNkZWZpbmUgWENIQUxfRkNBX0xJU1QJCVhUSEFMX0ZBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9GQU1fQllQQVNTCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfRkFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0ZBTV9CWVBBU1MJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9GQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfRkFNX0NBQ0hFRAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0ZBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9GQU1fQ0FDSEVECVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfRkFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0ZBTV9DQUNIRUQJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9GQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfRkFNX0NBQ0hFRAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0ZBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9GQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfRkFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0ZBTV9FWENFUFRJT04KKyNkZWZpbmUgWENIQUxfTENBX0xJU1QJCVhUSEFMX0xBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9MQU1fQllQQVNTRwlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0xBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9MQU1fQllQQVNTRwlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0xBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9MQU1fQ0FDSEVECVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0xBTV9DQUNIRUQJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9MQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfTEFNX05BQ0FDSEVECVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfTEFNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0xBTV9OQUNBQ0hFRAlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0xBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9MQU1fSVNPTEFURQlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX0xBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9MQU1fQ0FDSEVECisjZGVmaW5lIFhDSEFMX1NDQV9MSVNUCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfU0FNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9TQU1fQllQQVNTCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfU0FNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfU0FNX1dSSVRFVEhSVQlYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX1NBTV9FWENFUFRJT04JWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfU0FNX0VYQ0VQVElPTglYQ0hBTF9TRVAgXAorCQkJCVhUSEFMX1NBTV9XUklURVRIUlUJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfU0FNX0lTT0xBVEUJWENIQUxfU0VQIFwKKwkJCQlYVEhBTF9TQU1fRVhDRVBUSU9OCVhDSEFMX1NFUCBcCisJCQkJWFRIQUxfU0FNX1dSSVRFVEhSVQorCisvKiAgVGVzdDoKKwlyZWFkL29ubHk6IDAgKyAxICsgMiArIDQgKyA1ICsgNiArIDggKyA5ICsgMTAgKyAxMiArIDE0CisJcmVhZC9vbmx5OiAwICsgMSArIDIgKyA0ICsgNSArIDYgKyA4ICsgOSArIDEwICsgMTIgKyAxNAorCWFsbDogICAgICAgMCArIDEgKyAyICsgMyArIDQgKyA1ICsgNiArIDcgKyA4ICsgOSArIDEwICsgMTEgKyAxMiArIDEzICsgMTQgKyAxNQorCWZhdWx0OiAgICAgMCArIDIgKyA0ICsgNiArIDggKyAxMCArIDEyICsgMTQKKwlyL3cveCBjYWNoZWQ6CisJci93L3ggZGNhY2hlZDoKKwlJLWJ5cGFzczogIDEgKyAzCisKKwlsb2FkIGd1YXJkIGJpdCBzZXQ6IDEgKyAzCisJbG9hZCBndWFyZCBiaXQgY2xyOiAwICsgMiArIDQgKyA1ICsgNiArIDcgKyA4ICsgOSArIDEwICsgMTEgKyAxMiArIDEzICsgMTQgKyAxNQorCWhpdC1jYWNoZSByL3cveDogNyArIDExCisKKwlmYW1zOiA1CisJZmFtczogMCAvIDYgLyAxOCAvIDEgLyAyCisJZmFtczogQnlwYXNzIC8gSXNvbGF0ZSAvIENhY2hlZCAvIEV4Y2VwdGlvbiAvIE5BQ2FjaGVkCisKKyAgICAgICAgTU1VIG9rYXk6ICB5ZXMKKyovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJTU1VCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogIEdlbmVyYWwgbm90ZXMgb24gTU1VIHBhcmFtZXRlcnMuCisgKgorICogIFRlcm1pbm9sb2d5OgorICoJQVNJRCA9IGFkZHJlc3Mtc3BhY2UgSUQgKGFjdHMgYXMgYW4gImV4dGVuc2lvbiIgb2YgdmlydHVhbCBhZGRyZXNzZXMpCisgKglWUE4gID0gdmlydHVhbCBwYWdlIG51bWJlcgorICoJUFBOICA9IHBoeXNpY2FsIHBhZ2UgbnVtYmVyCisgKglDQSAgID0gZW5jb2RlZCBjYWNoZSBhdHRyaWJ1dGUgKGFjY2VzcyBtb2RlcykKKyAqCVRMQiAgPSB0cmFuc2xhdGlvbiBsb29rLWFzaWRlIGJ1ZmZlciAodGVybSBpcyBzdHJldGNoZWQgc29tZXdoYXQgaGVyZSkKKyAqCUkgICAgPSBpbnN0cnVjdGlvbiAoZmV0Y2ggYWNjZXNzZXMpCisgKglEICAgID0gZGF0YSAobG9hZCBhbmQgc3RvcmUgYWNjZXNzZXMpCisgKgl3YXkgID0gZWFjaCBUTEIgKElUTEIgYW5kIERUTEIpIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mICJ3YXlzIgorICoJCXRoYXQgc2ltdWx0YW5lb3VzbHkgbWF0Y2ggdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBhbiBhY2Nlc3M7CisgKgkJYSBUTEIgc3VjY2Vzc2Z1bGx5IHRyYW5zbGF0ZXMgYSB2aXJ0dWFsIGFkZHJlc3MgaWYgZXhhY3RseQorICoJCW9uZSB3YXkgbWF0Y2hlcyB0aGUgdmFkZHI7IGlmIG5vbmUgbWF0Y2gsIGl0IGlzIGEgbWlzczsKKyAqCQlpZiBtdWx0aXBsZSBtYXRjaCwgb25lIGdldHMgYSAibXVsdGloaXQiIGV4Y2VwdGlvbjsKKyAqCQllYWNoIHdheSBjYW4gYmUgaW5kZXBlbmRlbnRseSBjb25maWd1cmVkIGluIHRlcm1zIG9mIG51bWJlciBvZgorICoJCWVudHJpZXMsIHBhZ2Ugc2l6ZXMsIHdoaWNoIGZpZWxkcyBhcmUgd3JpdGFibGUgb3IgY29uc3RhbnQsIGV0Yy4KKyAqCXNldCAgPSBncm91cCBvZiBjb250aWd1b3VzIHdheXMgd2l0aCBleGFjdGx5IGlkZW50aWNhbCBwYXJhbWV0ZXJzCisgKglBUkYgID0gYXV0by1yZWZpbGw7IGhhcmR3YXJlIHNlcnZpY2VzIGEgMXN0LWxldmVsIG1pc3MgYnkgbG9hZGluZyBhIFBURQorICoJCWZyb20gdGhlIHBhZ2UgdGFibGUgYW5kIHN0b3JpbmcgaXQgaW4gb25lIG9mIHRoZSBhdXRvLXJlZmlsbCB3YXlzOworICoJCWlmIHRoaXMgUFRFIGxvYWQgYWxzbyBtaXNzZXMsIGEgbWlzcyBleGNlcHRpb24gaXMgcG9zdGVkIGZvciBzL3cuCisgKgltaW4td2lyZWQgPSBhICJtaW4td2lyZWQiIHdheSBjYW4gYmUgdXNlZCB0byBtYXAgYSBzaW5nbGUgKG1pbmltdW0tc2l6ZWQpCisgKiAJCXBhZ2UgYXJiaXRyYXJpbHkgdW5kZXIgcHJvZ3JhbSBjb250cm9sOyBpdCBoYXMgYSBzaW5nbGUgZW50cnksCisgKgkJaXMgbm9uLWF1dG8tcmVmaWxsIChzb21lIG90aGVyIHdheShzKSBtdXN0IGJlIGF1dG8tcmVmaWxsKSwKKyAqCQlhbGwgaXRzIGZpZWxkcyAoVlBOLCBQUE4sIEFTSUQsIENBKSBhcmUgYWxsIHdyaXRhYmxlLCBhbmQgaXQKKyAqCQlzdXBwb3J0cyB0aGUgWENIQUxfTU1VX01JTl9QVEVfUEFHRV9TSVpFIHBhZ2Ugc2l6ZSAoYSBjdXJyZW50CisgKgkJcmVzdHJpY3Rpb24gaXMgdGhhdCB0aGlzIGJlIHRoZSBvbmx5IHBhZ2Ugc2l6ZSBpdCBzdXBwb3J0cykuCisgKgorICogIFRMQiB3YXkgZW50cmllcyBhcmUgdmlydHVhbGx5IGluZGV4ZWQuCisgKiAgVExCIHdheXMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIHBhZ2Ugc2l6ZXM6CisgKgktIG11c3QgaGF2ZSBhbGwgd3JpdGFibGUgVlBOIGFuZCBQUE4gZmllbGRzOworICoJLSBjYW4gb25seSB1c2Ugb25lIHBhZ2Ugc2l6ZSBhdCBhbnkgZ2l2ZW4gdGltZSAoZWcuIHNldHVwIGF0IHN0YXJ0dXApLAorICoJICBzZWxlY3RlZCBieSB0aGUgcmVzcGVjdGl2ZSBJVExCQ0ZHIG9yIERUTEJDRkcgc3BlY2lhbCByZWdpc3RlciwKKyAqCSAgd2hvc2UgYml0cyBuKjQrMyAuLiBuKjQgaW5kZXggdGhlIGxpc3Qgb2YgcGFnZSBzaXplcyBmb3Igd2F5IG4KKyAqCSAgKFhDSEFMX3hUTEJfU0VUbV9QQUdFU1pfTE9HMl9MSVNUIGZvciBzZXQgbSBjb3JyZXNwb25kaW5nIHRvIHdheSBuKTsKKyAqCSAgdGhpcyBsaXN0IG1heSBiZSBzcGFyc2UgZm9yIGF1dG8tcmVmaWxsIHdheXMgYmVjYXVzZSBhdXRvLXJlZmlsbAorICoJICB3YXlzIGhhdmUgaW5kZXBlbmRlbnQgbGlzdHMgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgc2hhcmluZyBhCisgKgkgIGNvbW1vbiBlbmNvZGluZyB3aXRoIFBURSBlbnRyaWVzOyB0aGUgZW5jb2RpbmcgaXMgdGhlIGluZGV4IGludG8KKyAqCSAgdGhpcyBsaXN0OyB1bnN1cHBvcnRlZCBzaXplcyBmb3IgYSBnaXZlbiB3YXkgYXJlIHplcm8gaW4gdGhlIGxpc3Q7CisgKgkgIHNlbGVjdGluZyB1bnN1cHBvcnRlZCBzaXplcyByZXN1bHRzIGluIHVuZGVmaW5lZCBoYXJkd2FyZSBiZWhhdmlvdXI7CisgKgktIGlzIG9ubHkgcG9zc2libGUgZm9yIHdheXMgMCB0aHJ1IDcgKGR1ZSB0byBJVExCQ0ZHL0RUTEJDRkcgZGVmaW5pdGlvbikuCisgKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX0NBQ0hFQVRUUgkJMAkvKiAxIGlmIENBQ0hFQVRUUiByZWdpc3RlciBwcmVzZW50LCAwIGlmIFRMQnMgcHJlc2VudCBpbnN0ZWFkICovCisjZGVmaW5lIFhDSEFMX0hBVkVfVExCUwkJCTEJLyogMSBpZiBUTEJzIHByZXNlbnQsIDAgaWYgQ0FDSEVBVFRSIHByZXNlbnQgaW5zdGVhZCAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01NVQkJCVhDSEFMX0hBVkVfVExCUwkvKiAoREVQUkVDQVRFRDsgdXNlIFhDSEFMX0hBVkVfVExCUyBpbnN0ZWFkOyB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHJlbGVhc2UpICovCisjZGVmaW5lIFhDSEFMX0hBVkVfU1BBTk5JTkdfV0FZCQkwCS8qIDEgaWYgc2luZ2xlIHdheSBtYXBzIGVudGlyZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaW4gSStEICovCisjZGVmaW5lIFhDSEFMX0hBVkVfSURFTlRJVFlfTUFQCQkwCS8qIDEgaWYgdmlydHVhbCBhZGRyID09IHBoeXNpY2FsIGFkZHIgYWx3YXlzLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01JTUlDX0NBQ0hFQVRUUgkwCS8qIDEgaWYgaGF2ZSBNTVUgdGhhdCBtaW1pY3MgYSBDQUNIRUFUVFIgY29uZmlnIChDYU1NVSkgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9YTFRfQ0FDSEVBVFRSCTAJLyogMSBpZiBoYXZlIE1NVSB0aGF0IG1pbWljcyBhIENBQ0hFQVRUUiBjb25maWcsIGJ1dCB3aXRoIHRyYW5zbGF0aW9uIChDYVhsdE1NVSkgKi8KKworI2RlZmluZSBYQ0hBTF9NTVVfQVNJRF9CSVRTCQk4CS8qIG51bWJlciBvZiBiaXRzIGluIEFTSURzIChhZGRyZXNzIHNwYWNlIElEcykgKi8KKyNkZWZpbmUgWENIQUxfTU1VX0FTSURfSU5WQUxJRAkJMAkvKiBBU0lEIHZhbHVlIGluZGljYXRpbmcgaW52YWxpZCBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIFhDSEFMX01NVV9BU0lEX0tFUk5FTAkJMQkvKiBBU0lEIHZhbHVlIGluZGljYXRpbmcga2VybmVsIChyaW5nIDApIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgWENIQUxfTU1VX1JJTkdTCQkJNAkvKiBudW1iZXIgb2YgcmluZ3Mgc3VwcG9ydGVkICgxLi40KSAqLworI2RlZmluZSBYQ0hBTF9NTVVfUklOR19CSVRTCQkyCS8qIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBob2xkIHJpbmcgbnVtYmVyICovCisjZGVmaW5lIFhDSEFMX01NVV9TUl9CSVRTCQkwCS8qIG51bWJlciBvZiBzaXplLXJlc3RyaWN0aW9uIGJpdHMgc3VwcG9ydGVkICovCisjZGVmaW5lIFhDSEFMX01NVV9DQV9CSVRTCQk0CS8qIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBob2xkIGNhY2hlIGF0dHJpYnV0ZSBlbmNvZGluZyAqLworI2RlZmluZSBYQ0hBTF9NTVVfTUFYX1BURV9QQUdFX1NJWkUJMTIJLyogbWF4IHBhZ2Ugc2l6ZSBpbiBhIFBURSBzdHJ1Y3R1cmUgKGxvZzIpICovCisjZGVmaW5lIFhDSEFMX01NVV9NSU5fUFRFX1BBR0VfU0laRQkxMgkvKiBtaW4gcGFnZSBzaXplIGluIGEgUFRFIHN0cnVjdHVyZSAobG9nMikgKi8KKworCisvKioqICBJbnN0cnVjdGlvbiBUTEI6ICAqKiovCisKKyNkZWZpbmUgWENIQUxfSVRMQl9XQVlfQklUUwkJMwkvKiBudW1iZXIgb2YgYml0cyBob2xkaW5nIHRoZSB3YXlzICovCisjZGVmaW5lIFhDSEFMX0lUTEJfV0FZUwkJCTcJLyogbnVtYmVyIG9mIHdheXMgKG4td2F5IHNldC1hc3NvY2lhdGl2ZSBUTEIpICovCisjZGVmaW5lIFhDSEFMX0lUTEJfQVJGX1dBWVMJCTQJLyogbnVtYmVyIG9mIGF1dG8tcmVmaWxsIHdheXMgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVRTCQkJNAkvKiBudW1iZXIgb2Ygc2V0cyAoZ3JvdXBzIG9mIHdheXMgd2l0aCBpZGVudGljYWwgc2V0dGluZ3MpICovCisKKy8qICBXYXkgc2V0IHRvIHdoaWNoIGVhY2ggd2F5IGJlbG9uZ3M6ICAqLworI2RlZmluZSBYQ0hBTF9JVExCX1dBWTBfU0VUCQkwCisjZGVmaW5lIFhDSEFMX0lUTEJfV0FZMV9TRVQJCTAKKyNkZWZpbmUgWENIQUxfSVRMQl9XQVkyX1NFVAkJMAorI2RlZmluZSBYQ0hBTF9JVExCX1dBWTNfU0VUCQkwCisjZGVmaW5lIFhDSEFMX0lUTEJfV0FZNF9TRVQJCTEKKyNkZWZpbmUgWENIQUxfSVRMQl9XQVk1X1NFVAkJMgorI2RlZmluZSBYQ0hBTF9JVExCX1dBWTZfU0VUCQkzCisKKy8qICBXYXlzIHNldHMgdGhhdCBhcmUgdXNlZCBieSBoYXJkd2FyZSBhdXRvLXJlZmlsbCAoQVJGKTogICovCisjZGVmaW5lIFhDSEFMX0lUTEJfQVJGX1NFVFMJCTEJLyogbnVtYmVyIG9mIGF1dG8tcmVmaWxsIHNldHMgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9BUkZfU0VUMAkJMAkvKiBpbmRleCBvZiBuJ3RoIGF1dG8tcmVmaWxsIHNldCAqLworCisvKiAgV2F5IHNldHMgdGhhdCBhcmUgIm1pbi13aXJlZCIgKHNlZSB0ZXJtaW5vbG9neSBjb21tZW50IGFib3ZlKTogICovCisjZGVmaW5lIFhDSEFMX0lUTEJfTUlOV0lSRURfU0VUUwkwCS8qIG51bWJlciBvZiAibWluLXdpcmVkIiBzZXRzICovCisKKworLyogIElUTEIgd2F5IHNldCAwIChncm91cCBvZiB3YXlzIDAgdGhydSAzKTogICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9XQVkJCQkwCS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1dBWVMJCQk0CS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX0VOVFJJRVNfTE9HMgkJMgkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfRU5UUklFUwkJCTQJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9BUkYJCQkxCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1BBR0VTSVpFUwkJMQkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1BBR0VTWl9CSVRTCQkwCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9QQUdFU1pfTE9HMl9NSU4JCTEyCS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfUEFHRVNaX0xPRzJfTUFYCQkxMgkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1BBR0VTWl9MT0cyX0xJU1QJMTIJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOworCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9BU0lEX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9WUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9QUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX0NBX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDBfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQwX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMF9DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKworLyogIElUTEIgd2F5IHNldCAxIChncm91cCBvZiB3YXlzIDQgdGhydSA0KTogICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9XQVkJCQk0CS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1dBWVMJCQkxCS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX0VOVFJJRVNfTE9HMgkJMgkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfRU5UUklFUwkJCTQJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9BUkYJCQkwCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1BBR0VTSVpFUwkJNAkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1BBR0VTWl9CSVRTCQkyCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9QQUdFU1pfTE9HMl9NSU4JCTIwCS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfUEFHRVNaX0xPRzJfTUFYCQkyNgkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1BBR0VTWl9MT0cyX0xJU1QJMjAgWENIQUxfU0VQIDIyIFhDSEFMX1NFUCAyNCBYQ0hBTF9TRVAgMjYJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOworCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9BU0lEX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9WUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9QUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX0NBX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDFfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQxX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMV9DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKworLyogIElUTEIgd2F5IHNldCAyIChncm91cCBvZiB3YXlzIDUgdGhydSA1KTogICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9XQVkJCQk1CS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1dBWVMJCQkxCS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0VOVFJJRVNfTE9HMgkJMQkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRU5UUklFUwkJCTIJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9BUkYJCQkwCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1BBR0VTSVpFUwkJMQkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1BBR0VTWl9CSVRTCQkwCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9QQUdFU1pfTE9HMl9NSU4JCTI3CS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfUEFHRVNaX0xPRzJfTUFYCQkyNwkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1BBR0VTWl9MT0cyX0xJU1QJMjcJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOworCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9BU0lEX0NPTlNUTUFTSwkJMHhGRgkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9WUE5fQ09OU1RNQVNLCQkweEYwMDAwMDAwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9QUE5fQ09OU1RNQVNLCQkweEY4MDAwMDAwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0NBX0NPTlNUTUFTSwkJMHgwMDAwMDAwRgkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKy8qICBDb25zdGFudCBBU0lEIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBJVExCIHdheSBzZXQgMiAoYmVjYXVzZSBBU0lEX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTBfQVNJRF9DT05TVAkJMHgwMQorI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTFfQVNJRF9DT05TVAkJMHgwMQorLyogIENvbnN0YW50IFZQTiB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgSVRMQiB3YXkgc2V0IDIgKGJlY2F1c2UgVlBOX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTBfVlBOX0NPTlNUCQkweEQwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUMl9FMV9WUE5fQ09OU1QJCTB4RDgwMDAwMDAKKy8qICBDb25zdGFudCBQUE4gdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIElUTEIgd2F5IHNldCAyIChiZWNhdXNlIFBQTl9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0UwX1BQTl9DT05TVAkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTFfUFBOX0NPTlNUCQkweDAwMDAwMDAwCisvKiAgQ29uc3RhbnQgQ0EgdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIElUTEIgd2F5IHNldCAyIChiZWNhdXNlIENBX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDJfRTBfQ0FfQ09OU1QJCTB4MDcKKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQyX0UxX0NBX0NPTlNUCQkweDAzCisKKy8qICBJVExCIHdheSBzZXQgMyAoZ3JvdXAgb2Ygd2F5cyA2IHRocnUgNik6ICAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfV0FZCQkJNgkvKiBpbmRleCBvZiBmaXJzdCB3YXkgaW4gdGhpcyB3YXkgc2V0ICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19XQVlTCQkJMQkvKiBudW1iZXIgb2YgKGNvbnRpZ3VvdXMpIHdheXMgaW4gdGhpcyB3YXkgc2V0ICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19FTlRSSUVTX0xPRzIJCTEJLyogbG9nMihudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0VOVFJJRVMJCQkyCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5IChhbHdheXMgYSBwb3dlciBvZiAyKSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfQVJGCQkJMAkvKiAxPWF1dG9yZWZpbGwgYnkgaC93LCAwPW5vbi1hdXRvcmVmaWxsICh3aXJlZC9jb25zdGFudC9zdGF0aWMpICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19QQUdFU0laRVMJCTEJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBwYWdlIHNpemVzIGluIHRoaXMgd2F5ICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19QQUdFU1pfQklUUwkJMAkvKiBudW1iZXIgb2YgYml0cyB0byBlbmNvZGUgdGhlIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfUEFHRVNaX0xPRzJfTUlOCQkyOAkvKiBsb2cyKG1pbmltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1BBR0VTWl9MT0cyX01BWAkJMjgJLyogbG9nMihtYXhpbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19QQUdFU1pfTE9HMl9MSVNUCTI4CS8qIGxpc3Qgb2YgbG9nMihwYWdlIHNpemUpcywgc2VwYXJhdGVkIGJ5IFhDSEFMX1NFUDsKKwkJCQkJCQkgICAyXlBBR0VTWl9CSVRTIGVudHJpZXMgaW4gbGlzdCwgdW5zdXBwb3J0ZWQgZW50cmllcyBhcmUgemVybyAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfQVNJRF9DT05TVE1BU0sJCTB4RkYJLyogY29uc3RhbnQgQVNJRCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfVlBOX0NPTlNUTUFTSwkJMHhFMDAwMDAwMAkvKiBjb25zdGFudCBWUE4gYml0cywgbm90IGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfUFBOX0NPTlNUTUFTSwkJMHhGMDAwMDAwMAkvKiBjb25zdGFudCBQUE4gYml0cywgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19DQV9DT05TVE1BU0sJCTB4MDAwMDAwMEYJLyogY29uc3RhbnQgQ0EgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0FTSURfUkVTRVQJCTAJLyogMSBpZiBBU0lEIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX1ZQTl9SRVNFVAkJMAkvKiAxIGlmIFZQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19QUE5fUkVTRVQJCTAJLyogMSBpZiBQUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfQ0FfUkVTRVQJCTAJLyogMSBpZiBDQSByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisvKiAgQ29uc3RhbnQgQVNJRCB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgSVRMQiB3YXkgc2V0IDMgKGJlY2F1c2UgQVNJRF9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UwX0FTSURfQ09OU1QJCTB4MDEKKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UxX0FTSURfQ09OU1QJCTB4MDEKKy8qICBDb25zdGFudCBWUE4gdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIElUTEIgd2F5IHNldCAzIChiZWNhdXNlIFZQTl9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UwX1ZQTl9DT05TVAkJMHhFMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9JVExCX1NFVDNfRTFfVlBOX0NPTlNUCQkweEYwMDAwMDAwCisvKiAgQ29uc3RhbnQgUFBOIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBJVExCIHdheSBzZXQgMyAoYmVjYXVzZSBQUE5fQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19FMF9QUE5fQ09OU1QJCTB4RjAwMDAwMDAKKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UxX1BQTl9DT05TVAkJMHhGMDAwMDAwMAorLyogIENvbnN0YW50IENBIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBJVExCIHdheSBzZXQgMyAoYmVjYXVzZSBDQV9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQzX0UwX0NBX0NPTlNUCQkweDA3CisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUM19FMV9DQV9DT05TVAkJMHgwMworCisvKiAgSW5kZXhpbmcgbWFjcm9zOiAgKi8KKyNkZWZpbmUgX1hDSEFMX0lUTEJfU0VUKG4sX3doYXQpCVhDSEFMX0lUTEJfU0VUICMjIG4gIyMgX3doYXQKKyNkZWZpbmUgWENIQUxfSVRMQl9TRVQobix3aGF0KQkJX1hDSEFMX0lUTEJfU0VUKG4sIF8gIyMgd2hhdCApCisjZGVmaW5lIF9YQ0hBTF9JVExCX1NFVF9FKG4saSxfd2hhdCkJWENIQUxfSVRMQl9TRVQgIyMgbiAjIyBfRSAjIyBpICMjIF93aGF0CisjZGVmaW5lIFhDSEFMX0lUTEJfU0VUX0UobixpLHdoYXQpCV9YQ0hBTF9JVExCX1NFVF9FKG4saSwgXyAjIyB3aGF0ICkKKy8qCisgKiAgRXhhbXBsZSB1c2U6ICBYQ0hBTF9JVExCX1NFVChYQ0hBTF9JVExCX0FSRl9TRVQwLEVOVFJJRVMpCisgKgl0byBnZXQgdGhlIHZhbHVlIG9mIFhDSEFMX0lUTEJfU0VUPG4+X0VOVFJJRVMgd2hlcmUgPG4+IGlzIHRoZSBmaXJzdCBhdXRvLXJlZmlsbCBzZXQuCisgKi8KKworCisvKioqICBEYXRhIFRMQjogICoqKi8KKworI2RlZmluZSBYQ0hBTF9EVExCX1dBWV9CSVRTCQk0CS8qIG51bWJlciBvZiBiaXRzIGhvbGRpbmcgdGhlIHdheXMgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9XQVlTCQkJMTAJLyogbnVtYmVyIG9mIHdheXMgKG4td2F5IHNldC1hc3NvY2lhdGl2ZSBUTEIpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfQVJGX1dBWVMJCTQJLyogbnVtYmVyIG9mIGF1dG8tcmVmaWxsIHdheXMgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVRTCQkJNQkvKiBudW1iZXIgb2Ygc2V0cyAoZ3JvdXBzIG9mIHdheXMgd2l0aCBpZGVudGljYWwgc2V0dGluZ3MpICovCisKKy8qICBXYXkgc2V0IHRvIHdoaWNoIGVhY2ggd2F5IGJlbG9uZ3M6ICAqLworI2RlZmluZSBYQ0hBTF9EVExCX1dBWTBfU0VUCQkwCisjZGVmaW5lIFhDSEFMX0RUTEJfV0FZMV9TRVQJCTAKKyNkZWZpbmUgWENIQUxfRFRMQl9XQVkyX1NFVAkJMAorI2RlZmluZSBYQ0hBTF9EVExCX1dBWTNfU0VUCQkwCisjZGVmaW5lIFhDSEFMX0RUTEJfV0FZNF9TRVQJCTEKKyNkZWZpbmUgWENIQUxfRFRMQl9XQVk1X1NFVAkJMgorI2RlZmluZSBYQ0hBTF9EVExCX1dBWTZfU0VUCQkzCisjZGVmaW5lIFhDSEFMX0RUTEJfV0FZN19TRVQJCTQKKyNkZWZpbmUgWENIQUxfRFRMQl9XQVk4X1NFVAkJNAorI2RlZmluZSBYQ0hBTF9EVExCX1dBWTlfU0VUCQk0CisKKy8qICBXYXlzIHNldHMgdGhhdCBhcmUgdXNlZCBieSBoYXJkd2FyZSBhdXRvLXJlZmlsbCAoQVJGKTogICovCisjZGVmaW5lIFhDSEFMX0RUTEJfQVJGX1NFVFMJCTEJLyogbnVtYmVyIG9mIGF1dG8tcmVmaWxsIHNldHMgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9BUkZfU0VUMAkJMAkvKiBpbmRleCBvZiBuJ3RoIGF1dG8tcmVmaWxsIHNldCAqLworCisvKiAgV2F5IHNldHMgdGhhdCBhcmUgIm1pbi13aXJlZCIgKHNlZSB0ZXJtaW5vbG9neSBjb21tZW50IGFib3ZlKTogICovCisjZGVmaW5lIFhDSEFMX0RUTEJfTUlOV0lSRURfU0VUUwkxCS8qIG51bWJlciBvZiAibWluLXdpcmVkIiBzZXRzICovCisjZGVmaW5lIFhDSEFMX0RUTEJfTUlOV0lSRURfU0VUMAk0CS8qIGluZGV4IG9mIG4ndGggIm1pbi13aXJlZCIgc2V0ICovCisKKworLyogIERUTEIgd2F5IHNldCAwIChncm91cCBvZiB3YXlzIDAgdGhydSAzKTogICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9XQVkJCQkwCS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1dBWVMJCQk0CS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX0VOVFJJRVNfTE9HMgkJMgkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfRU5UUklFUwkJCTQJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9BUkYJCQkxCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1BBR0VTSVpFUwkJMQkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1BBR0VTWl9CSVRTCQkwCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9QQUdFU1pfTE9HMl9NSU4JCTEyCS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfUEFHRVNaX0xPRzJfTUFYCQkxMgkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1BBR0VTWl9MT0cyX0xJU1QJMTIJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOworCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9BU0lEX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9WUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9QUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX0NBX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDBfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQwX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMF9DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKworLyogIERUTEIgd2F5IHNldCAxIChncm91cCBvZiB3YXlzIDQgdGhydSA0KTogICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9XQVkJCQk0CS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1dBWVMJCQkxCS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX0VOVFJJRVNfTE9HMgkJMgkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfRU5UUklFUwkJCTQJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9BUkYJCQkwCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1BBR0VTSVpFUwkJNAkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1BBR0VTWl9CSVRTCQkyCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9QQUdFU1pfTE9HMl9NSU4JCTIwCS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfUEFHRVNaX0xPRzJfTUFYCQkyNgkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1BBR0VTWl9MT0cyX0xJU1QJMjAgWENIQUxfU0VQIDIyIFhDSEFMX1NFUCAyNCBYQ0hBTF9TRVAgMjYJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOworCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9BU0lEX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9WUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9QUE5fQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX0NBX0NPTlNUTUFTSwkJMAkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDFfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQxX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMV9DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKworLyogIERUTEIgd2F5IHNldCAyIChncm91cCBvZiB3YXlzIDUgdGhydSA1KTogICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9XQVkJCQk1CS8qIGluZGV4IG9mIGZpcnN0IHdheSBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1dBWVMJCQkxCS8qIG51bWJlciBvZiAoY29udGlndW91cykgd2F5cyBpbiB0aGlzIHdheSBzZXQgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0VOVFJJRVNfTE9HMgkJMQkvKiBsb2cyKG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5KSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRU5UUklFUwkJCTIJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkgKGFsd2F5cyBhIHBvd2VyIG9mIDIpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9BUkYJCQkwCS8qIDE9YXV0b3JlZmlsbCBieSBoL3csIDA9bm9uLWF1dG9yZWZpbGwgKHdpcmVkL2NvbnN0YW50L3N0YXRpYykgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1BBR0VTSVpFUwkJMQkvKiBudW1iZXIgb2Ygc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMgaW4gdGhpcyB3YXkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1BBR0VTWl9CSVRTCQkwCS8qIG51bWJlciBvZiBiaXRzIHRvIGVuY29kZSB0aGUgcGFnZSBzaXplICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9QQUdFU1pfTE9HMl9NSU4JCTI3CS8qIGxvZzIobWluaW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfUEFHRVNaX0xPRzJfTUFYCQkyNwkvKiBsb2cyKG1heGltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1BBR0VTWl9MT0cyX0xJU1QJMjcJLyogbGlzdCBvZiBsb2cyKHBhZ2Ugc2l6ZSlzLCBzZXBhcmF0ZWQgYnkgWENIQUxfU0VQOworCQkJCQkJCSAgIDJeUEFHRVNaX0JJVFMgZW50cmllcyBpbiBsaXN0LCB1bnN1cHBvcnRlZCBlbnRyaWVzIGFyZSB6ZXJvICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9BU0lEX0NPTlNUTUFTSwkJMHhGRgkvKiBjb25zdGFudCBBU0lEIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9WUE5fQ09OU1RNQVNLCQkweEYwMDAwMDAwCS8qIGNvbnN0YW50IFZQTiBiaXRzLCBub3QgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9QUE5fQ09OU1RNQVNLCQkweEY4MDAwMDAwCS8qIGNvbnN0YW50IFBQTiBiaXRzLCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0NBX0NPTlNUTUFTSwkJMHgwMDAwMDAwRgkvKiBjb25zdGFudCBDQSBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfQVNJRF9SRVNFVAkJMAkvKiAxIGlmIEFTSUQgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfVlBOX1JFU0VUCQkwCS8qIDEgaWYgVlBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX1BQTl9SRVNFVAkJMAkvKiAxIGlmIFBQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9DQV9SRVNFVAkJMAkvKiAxIGlmIENBIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKy8qICBDb25zdGFudCBBU0lEIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBEVExCIHdheSBzZXQgMiAoYmVjYXVzZSBBU0lEX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTBfQVNJRF9DT05TVAkJMHgwMQorI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTFfQVNJRF9DT05TVAkJMHgwMQorLyogIENvbnN0YW50IFZQTiB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgRFRMQiB3YXkgc2V0IDIgKGJlY2F1c2UgVlBOX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTBfVlBOX0NPTlNUCQkweEQwMDAwMDAwCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUMl9FMV9WUE5fQ09OU1QJCTB4RDgwMDAwMDAKKy8qICBDb25zdGFudCBQUE4gdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIERUTEIgd2F5IHNldCAyIChiZWNhdXNlIFBQTl9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0UwX1BQTl9DT05TVAkJMHgwMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTFfUFBOX0NPTlNUCQkweDAwMDAwMDAwCisvKiAgQ29uc3RhbnQgQ0EgdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIERUTEIgd2F5IHNldCAyIChiZWNhdXNlIENBX0NPTlNUTUFTSyBpcyBub24temVybyk6ICAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDJfRTBfQ0FfQ09OU1QJCTB4MDcKKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQyX0UxX0NBX0NPTlNUCQkweDAzCisKKy8qICBEVExCIHdheSBzZXQgMyAoZ3JvdXAgb2Ygd2F5cyA2IHRocnUgNik6ICAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfV0FZCQkJNgkvKiBpbmRleCBvZiBmaXJzdCB3YXkgaW4gdGhpcyB3YXkgc2V0ICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19XQVlTCQkJMQkvKiBudW1iZXIgb2YgKGNvbnRpZ3VvdXMpIHdheXMgaW4gdGhpcyB3YXkgc2V0ICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19FTlRSSUVTX0xPRzIJCTEJLyogbG9nMihudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0VOVFJJRVMJCQkyCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHRoaXMgd2F5IChhbHdheXMgYSBwb3dlciBvZiAyKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfQVJGCQkJMAkvKiAxPWF1dG9yZWZpbGwgYnkgaC93LCAwPW5vbi1hdXRvcmVmaWxsICh3aXJlZC9jb25zdGFudC9zdGF0aWMpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19QQUdFU0laRVMJCTEJLyogbnVtYmVyIG9mIHN1cHBvcnRlZCBwYWdlIHNpemVzIGluIHRoaXMgd2F5ICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19QQUdFU1pfQklUUwkJMAkvKiBudW1iZXIgb2YgYml0cyB0byBlbmNvZGUgdGhlIHBhZ2Ugc2l6ZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfUEFHRVNaX0xPRzJfTUlOCQkyOAkvKiBsb2cyKG1pbmltdW0gc3VwcG9ydGVkIHBhZ2Ugc2l6ZSkgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1BBR0VTWl9MT0cyX01BWAkJMjgJLyogbG9nMihtYXhpbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19QQUdFU1pfTE9HMl9MSVNUCTI4CS8qIGxpc3Qgb2YgbG9nMihwYWdlIHNpemUpcywgc2VwYXJhdGVkIGJ5IFhDSEFMX1NFUDsKKwkJCQkJCQkgICAyXlBBR0VTWl9CSVRTIGVudHJpZXMgaW4gbGlzdCwgdW5zdXBwb3J0ZWQgZW50cmllcyBhcmUgemVybyAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfQVNJRF9DT05TVE1BU0sJCTB4RkYJLyogY29uc3RhbnQgQVNJRCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfVlBOX0NPTlNUTUFTSwkJMHhFMDAwMDAwMAkvKiBjb25zdGFudCBWUE4gYml0cywgbm90IGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfUFBOX0NPTlNUTUFTSwkJMHhGMDAwMDAwMAkvKiBjb25zdGFudCBQUE4gYml0cywgaW5jbHVkaW5nIGVudHJ5IGluZGV4IGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19DQV9DT05TVE1BU0sJCTB4MDAwMDAwMEYJLyogY29uc3RhbnQgQ0EgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0FTSURfUkVTRVQJCTAJLyogMSBpZiBBU0lEIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX1ZQTl9SRVNFVAkJMAkvKiAxIGlmIFZQTiByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19QUE5fUkVTRVQJCTAJLyogMSBpZiBQUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfQ0FfUkVTRVQJCTAJLyogMSBpZiBDQSByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisvKiAgQ29uc3RhbnQgQVNJRCB2YWx1ZXMgZm9yIGVhY2ggZW50cnkgb2YgRFRMQiB3YXkgc2V0IDMgKGJlY2F1c2UgQVNJRF9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UwX0FTSURfQ09OU1QJCTB4MDEKKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UxX0FTSURfQ09OU1QJCTB4MDEKKy8qICBDb25zdGFudCBWUE4gdmFsdWVzIGZvciBlYWNoIGVudHJ5IG9mIERUTEIgd2F5IHNldCAzIChiZWNhdXNlIFZQTl9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UwX1ZQTl9DT05TVAkJMHhFMDAwMDAwMAorI2RlZmluZSBYQ0hBTF9EVExCX1NFVDNfRTFfVlBOX0NPTlNUCQkweEYwMDAwMDAwCisvKiAgQ29uc3RhbnQgUFBOIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBEVExCIHdheSBzZXQgMyAoYmVjYXVzZSBQUE5fQ09OU1RNQVNLIGlzIG5vbi16ZXJvKTogICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19FMF9QUE5fQ09OU1QJCTB4RjAwMDAwMDAKKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UxX1BQTl9DT05TVAkJMHhGMDAwMDAwMAorLyogIENvbnN0YW50IENBIHZhbHVlcyBmb3IgZWFjaCBlbnRyeSBvZiBEVExCIHdheSBzZXQgMyAoYmVjYXVzZSBDQV9DT05TVE1BU0sgaXMgbm9uLXplcm8pOiAgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQzX0UwX0NBX0NPTlNUCQkweDA3CisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUM19FMV9DQV9DT05TVAkJMHgwMworCisvKiAgRFRMQiB3YXkgc2V0IDQgKGdyb3VwIG9mIHdheXMgNyB0aHJ1IDkpOiAgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X1dBWQkJCTcJLyogaW5kZXggb2YgZmlyc3Qgd2F5IGluIHRoaXMgd2F5IHNldCAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfV0FZUwkJCTMJLyogbnVtYmVyIG9mIChjb250aWd1b3VzKSB3YXlzIGluIHRoaXMgd2F5IHNldCAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfRU5UUklFU19MT0cyCQkwCS8qIGxvZzIobnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyB3YXkpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9FTlRSSUVTCQkJMQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGlzIHdheSAoYWx3YXlzIGEgcG93ZXIgb2YgMikgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X0FSRgkJCTAJLyogMT1hdXRvcmVmaWxsIGJ5IGgvdywgMD1ub24tYXV0b3JlZmlsbCAod2lyZWQvY29uc3RhbnQvc3RhdGljKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfUEFHRVNJWkVTCQkxCS8qIG51bWJlciBvZiBzdXBwb3J0ZWQgcGFnZSBzaXplcyBpbiB0aGlzIHdheSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfUEFHRVNaX0JJVFMJCTAJLyogbnVtYmVyIG9mIGJpdHMgdG8gZW5jb2RlIHRoZSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X1BBR0VTWl9MT0cyX01JTgkJMTIJLyogbG9nMihtaW5pbXVtIHN1cHBvcnRlZCBwYWdlIHNpemUpICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9QQUdFU1pfTE9HMl9NQVgJCTEyCS8qIGxvZzIobWF4aW11bSBzdXBwb3J0ZWQgcGFnZSBzaXplKSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfUEFHRVNaX0xPRzJfTElTVAkxMgkvKiBsaXN0IG9mIGxvZzIocGFnZSBzaXplKXMsIHNlcGFyYXRlZCBieSBYQ0hBTF9TRVA7CisJCQkJCQkJICAgMl5QQUdFU1pfQklUUyBlbnRyaWVzIGluIGxpc3QsIHVuc3VwcG9ydGVkIGVudHJpZXMgYXJlIHplcm8gKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X0FTSURfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IEFTSUQgYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X1ZQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgVlBOIGJpdHMsIG5vdCBpbmNsdWRpbmcgZW50cnkgaW5kZXggYml0czsgMCBpZiBhbGwgd3JpdGFibGUgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X1BQTl9DT05TVE1BU0sJCTAJLyogY29uc3RhbnQgUFBOIGJpdHMsIGluY2x1ZGluZyBlbnRyeSBpbmRleCBiaXRzOyAwIGlmIGFsbCB3cml0YWJsZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfQ0FfQ09OU1RNQVNLCQkwCS8qIGNvbnN0YW50IENBIGJpdHM7IDAgaWYgYWxsIHdyaXRhYmxlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9BU0lEX1JFU0VUCQkwCS8qIDEgaWYgQVNJRCByZXNldCB2YWx1ZXMgZGVmaW5lZCAoYW5kIGFsbCB3cml0YWJsZSk7IDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUNF9WUE5fUkVTRVQJCTAJLyogMSBpZiBWUE4gcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9EVExCX1NFVDRfUFBOX1JFU0VUCQkwCS8qIDEgaWYgUFBOIHJlc2V0IHZhbHVlcyBkZWZpbmVkIChhbmQgYWxsIHdyaXRhYmxlKTsgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQ0X0NBX1JFU0VUCQkwCS8qIDEgaWYgQ0EgcmVzZXQgdmFsdWVzIGRlZmluZWQgKGFuZCBhbGwgd3JpdGFibGUpOyAwIG90aGVyd2lzZSAqLworCisvKiAgSW5kZXhpbmcgbWFjcm9zOiAgKi8KKyNkZWZpbmUgX1hDSEFMX0RUTEJfU0VUKG4sX3doYXQpCVhDSEFMX0RUTEJfU0VUICMjIG4gIyMgX3doYXQKKyNkZWZpbmUgWENIQUxfRFRMQl9TRVQobix3aGF0KQkJX1hDSEFMX0RUTEJfU0VUKG4sIF8gIyMgd2hhdCApCisjZGVmaW5lIF9YQ0hBTF9EVExCX1NFVF9FKG4saSxfd2hhdCkJWENIQUxfRFRMQl9TRVQgIyMgbiAjIyBfRSAjIyBpICMjIF93aGF0CisjZGVmaW5lIFhDSEFMX0RUTEJfU0VUX0UobixpLHdoYXQpCV9YQ0hBTF9EVExCX1NFVF9FKG4saSwgXyAjIyB3aGF0ICkKKy8qCisgKiAgRXhhbXBsZSB1c2U6ICBYQ0hBTF9EVExCX1NFVChYQ0hBTF9EVExCX0FSRl9TRVQwLEVOVFJJRVMpCisgKgl0byBnZXQgdGhlIHZhbHVlIG9mIFhDSEFMX0RUTEJfU0VUPG4+X0VOVFJJRVMgd2hlcmUgPG4+IGlzIHRoZSBmaXJzdCBhdXRvLXJlZmlsbCBzZXQuCisgKi8KKworCisvKgorICogIERldGVybWluZSB3aGV0aGVyIHdlIGhhdmUgYSBmdWxsIE1NVSAod2l0aCBQYWdlIFRhYmxlIGFuZCBQcm90ZWN0aW9uKQorICogIHVzYWJsZSBmb3IgYW4gTU1VLWJhc2VkIE9TOgorICovCisjaWYgWENIQUxfSEFWRV9UTEJTICYmICFYQ0hBTF9IQVZFX1NQQU5OSU5HX1dBWSAmJiBYQ0hBTF9JVExCX0FSRl9XQVlTID4gMCAmJiBYQ0hBTF9EVExCX0FSRl9XQVlTID4gMCAmJiBYQ0hBTF9NTVVfUklOR1MgPj0gMgorIyBkZWZpbmUgWENIQUxfSEFWRV9QVFBfTU1VCQkxCS8qIGhhdmUgZnVsbCBNTVUgKHdpdGggcGFnZSB0YWJsZSBbYXV0b3JlZmlsbF0gYW5kIHByb3RlY3Rpb24pICovCisjZWxzZQorIyBkZWZpbmUgWENIQUxfSEFWRV9QVFBfTU1VCQkwCS8qIGRvbid0IGhhdmUgZnVsbCBNTVUgKi8KKyNlbmRpZgorCisvKgorICogIEZvciBmdWxsIE1NVXMsIHJlcG9ydCBrZXJuZWwgUkFNIHNlZ21lbnQgYW5kIGtlcm5lbCBJL08gc2VnbWVudCBzdGF0aWMgcGFnZSBtYXBwaW5nczoKKyAqLworI2lmIFhDSEFMX0hBVkVfUFRQX01NVQorI2RlZmluZSBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUgkJMHhEMDAwMDAwMAkvKiB2aXJ0LmFkZHIgb2Yga2VybmVsIFJBTSBjYWNoZWQgc3RhdGljIG1hcCAqLworI2RlZmluZSBYQ0hBTF9LU0VHX0NBQ0hFRF9QQUREUgkJMHgwMDAwMDAwMAkvKiBwaHlzLmFkZHIgb2Yga3NlZ19jYWNoZWQgKi8KKyNkZWZpbmUgWENIQUxfS1NFR19DQUNIRURfU0laRQkJMHgwODAwMDAwMAkvKiBzaXplIGluIGJ5dGVzIG9mIGtzZWdfY2FjaGVkIChhc3N1bWVkIHBvd2VyIG9mIDIhISEpICovCisjZGVmaW5lIFhDSEFMX0tTRUdfQllQQVNTX1ZBRERSCQkweEQ4MDAwMDAwCS8qIHZpcnQuYWRkciBvZiBrZXJuZWwgUkFNIGJ5cGFzcyAodW5jYWNoZWQpIHN0YXRpYyBtYXAgKi8KKyNkZWZpbmUgWENIQUxfS1NFR19CWVBBU1NfUEFERFIJCTB4MDAwMDAwMDAJLyogcGh5cy5hZGRyIG9mIGtzZWdfYnlwYXNzICovCisjZGVmaW5lIFhDSEFMX0tTRUdfQllQQVNTX1NJWkUJCTB4MDgwMDAwMDAJLyogc2l6ZSBpbiBieXRlcyBvZiBrc2VnX2J5cGFzcyAoYXNzdW1lZCBwb3dlciBvZiAyISEhKSAqLworCisjZGVmaW5lIFhDSEFMX0tJT19DQUNIRURfVkFERFIJCTB4RTAwMDAwMDAJLyogdmlydC5hZGRyIG9mIGtlcm5lbCBJL08gY2FjaGVkIHN0YXRpYyBtYXAgKi8KKyNkZWZpbmUgWENIQUxfS0lPX0NBQ0hFRF9QQUREUgkJMHhGMDAwMDAwMAkvKiBwaHlzLmFkZHIgb2Yga2lvX2NhY2hlZCAqLworI2RlZmluZSBYQ0hBTF9LSU9fQ0FDSEVEX1NJWkUJCTB4MTAwMDAwMDAJLyogc2l6ZSBpbiBieXRlcyBvZiBraW9fY2FjaGVkIChhc3N1bWVkIHBvd2VyIG9mIDIhISEpICovCisjZGVmaW5lIFhDSEFMX0tJT19CWVBBU1NfVkFERFIJCTB4RjAwMDAwMDAJLyogdmlydC5hZGRyIG9mIGtlcm5lbCBJL08gYnlwYXNzICh1bmNhY2hlZCkgc3RhdGljIG1hcCAqLworI2RlZmluZSBYQ0hBTF9LSU9fQllQQVNTX1BBRERSCQkweEYwMDAwMDAwCS8qIHBoeXMuYWRkciBvZiBraW9fYnlwYXNzICovCisjZGVmaW5lIFhDSEFMX0tJT19CWVBBU1NfU0laRQkJMHgxMDAwMDAwMAkvKiBzaXplIGluIGJ5dGVzIG9mIGtpb19ieXBhc3MgKGFzc3VtZWQgcG93ZXIgb2YgMiEhISkgKi8KKworI2RlZmluZSBYQ0hBTF9TRUdfTUFQUEFCTEVfVkFERFIJMHgwMDAwMDAwMAkvKiBzdGFydCBvZiBsYXJnZXN0IG5vbi1zdGF0aWMtbWFwcGVkIHZpcnR1YWwgYWRkciBhcmVhICovCisjZGVmaW5lIFhDSEFMX1NFR19NQVBQQUJMRV9TSVpFCQkweEQwMDAwMDAwCS8qIHNpemUgaW4gYnl0ZXMgb2YgICIgICovCisvKiBkZWZpbmUgWENIQUxfU0VHX01BUFBBQkxFMl94eHggaWYgbW9yZSBhcmVhcyBwcmVzZW50LCBzb3J0ZWQgaW4gb3JkZXIgb2YgZGVzY2VuZGluZyBzaXplLiAgKi8KKyNlbmRpZgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCU1JU0MKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfTlVNX1dSSVRFQlVGRkVSX0VOVFJJRVMJNAkvKiBudW1iZXIgb2Ygd3JpdGUgYnVmZmVyIGVudHJpZXMgKi8KKworI2RlZmluZSBYQ0hBTF9DT1JFX0lECQkJImxpbnV4X2JlIgkvKiBjb25maWd1cmF0aW9uJ3MgYWxwaGFudW1lcmljIGNvcmUgaWRlbnRpZmllcgorCQkJCQkJCSAgIChDb3JlSUQpIHNldCBpbiB0aGUgWHRlbnNhIFByb2Nlc3NvciBHZW5lcmF0b3IgKi8KKworI2RlZmluZSBYQ0hBTF9CVUlMRF9VTklRVUVfSUQJCTB4MDAwMDMyNTYJLyogc29mdHdhcmUgYnVpbGQtdW5pcXVlIElEICgyMi1iaXQpICovCisKKy8qICBUaGVzZSBkZWZpbml0aW9ucyBkZXNjcmliZSB0aGUgaGFyZHdhcmUgdGFyZ2V0ZWQgYnkgdGhpcyBzb2Z0d2FyZTogICovCisjZGVmaW5lIFhDSEFMX0hXX0NPTkZJR0lEMAkJMHhDMTAzRDFGRgkvKiBjb25maWcgSUQgcmVnIDAgdmFsdWUgKHVwcGVyIDMyIG9mIDY0IGJpdHMpICovCisjZGVmaW5lIFhDSEFMX0hXX0NPTkZJR0lEMQkJMHgwMDgwMzI1NgkvKiBjb25maWcgSUQgcmVnIDEgdmFsdWUgKGxvd2VyIDMyIG9mIDY0IGJpdHMpICovCisjZGVmaW5lIFhDSEFMX0NPTkZJR0lEMAkJCVhDSEFMX0hXX0NPTkZJR0lEMAkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5IC0tIGRvbid0IHVzZSEgKi8KKyNkZWZpbmUgWENIQUxfQ09ORklHSUQxCQkJWENIQUxfSFdfQ09ORklHSUQxCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkgLS0gZG9uJ3QgdXNlISAqLworI2RlZmluZSBYQ0hBTF9IV19SRUxFQVNFX01BSk9SCQkxMDUwCS8qIG1ham9yIHJlbGVhc2Ugb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KKyNkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9NSU5PUgkJMQkvKiBtaW5vciByZWxlYXNlIG9mIHRhcmdldGVkIGhhcmR3YXJlICovCisjZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfTkFNRQkJIlQxMDUwLjEiCS8qIGZ1bGwgcmVsZWFzZSBuYW1lIG9mIHRhcmdldGVkIGhhcmR3YXJlICovCisjZGVmaW5lIFhUSEFMX0hXX1JFTF9UMTA1MAkxCisjZGVmaW5lIFhUSEFMX0hXX1JFTF9UMTA1MF8xCTEKKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSURfUkVMSUFCTEUJMQorCisKKy8qCisgKiAgTWlzY2VsbGFuZW91cyBzcGVjaWFsIHJlZ2lzdGVyIGZpZWxkczoKKyAqLworCisKKy8qICBEQlJFQUtDIChzcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAxNjApOiAgKi8KKyNkZWZpbmUgWENIQUxfREJSRUFLQ19WQUxJRE1BU0sJMHhDMDAwMDAzRgkvKiBiaXRzIG9mIERCUkVBS0MgdGhhdCBhcmUgZGVmaW5lZCAqLworLyogIE1BU0sgZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9EQlJFQUtDX01BU0tfQklUUyAJNgkJLyogbnVtYmVyIG9mIGJpdHMgaW4gTUFTSyBmaWVsZCAqLworI2RlZmluZSBYQ0hBTF9EQlJFQUtDX01BU0tfTlVNICAJNjQJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfTUFTS19TSElGVAkwCQkvKiBwb3NpdGlvbiBvZiBNQVNLIGJpdHMgaW4gREJSRUFLQywgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9EQlJFQUtDX01BU0tfTUFTSyAJMHgwMDAwMDAzRgkvKiBtYXNrIG9mIGJpdHMgaW4gTUFTSyBmaWVsZCBvZiBEQlJFQUtDICovCisvKiAgTE9BREJSRUFLIGZpZWxkOiAgKi8KKyNkZWZpbmUgWENIQUxfREJSRUFLQ19MT0FEQlJFQUtfQklUUyAJMQkJLyogbnVtYmVyIG9mIGJpdHMgaW4gTE9BREJSRUFLIGZpZWxkICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfTE9BREJSRUFLX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfTE9BREJSRUFLX1NISUZUCTMwCQkvKiBwb3NpdGlvbiBvZiBMT0FEQlJFQUsgYml0cyBpbiBEQlJFQUtDLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfTE9BREJSRUFLX01BU0sgCTB4NDAwMDAwMDAJLyogbWFzayBvZiBiaXRzIGluIExPQURCUkVBSyBmaWVsZCBvZiBEQlJFQUtDICovCisvKiAgU1RPUkVCUkVBSyBmaWVsZDogICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfU1RPUkVCUkVBS19CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBTVE9SRUJSRUFLIGZpZWxkICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfU1RPUkVCUkVBS19OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLworI2RlZmluZSBYQ0hBTF9EQlJFQUtDX1NUT1JFQlJFQUtfU0hJRlQJMzEJCS8qIHBvc2l0aW9uIG9mIFNUT1JFQlJFQUsgYml0cyBpbiBEQlJFQUtDLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX0RCUkVBS0NfU1RPUkVCUkVBS19NQVNLIAkweDgwMDAwMDAwCS8qIG1hc2sgb2YgYml0cyBpbiBTVE9SRUJSRUFLIGZpZWxkIG9mIERCUkVBS0MgKi8KKworLyogIFBTIChzcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAyMzApOiAgKi8KKyNkZWZpbmUgWENIQUxfUFNfVkFMSURNQVNLCTB4MDAwNzBGRkYJLyogYml0cyBvZiBQUyB0aGF0IGFyZSBkZWZpbmVkICovCisvKiAgSU5UTEVWRUwgZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9QU19JTlRMRVZFTF9CSVRTIAk0CQkvKiBudW1iZXIgb2YgYml0cyBpbiBJTlRMRVZFTCBmaWVsZCAqLworI2RlZmluZSBYQ0hBTF9QU19JTlRMRVZFTF9OVU0gIAkxNgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KKyNkZWZpbmUgWENIQUxfUFNfSU5UTEVWRUxfU0hJRlQJMAkJLyogcG9zaXRpb24gb2YgSU5UTEVWRUwgYml0cyBpbiBQUywgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9QU19JTlRMRVZFTF9NQVNLIAkweDAwMDAwMDBGCS8qIG1hc2sgb2YgYml0cyBpbiBJTlRMRVZFTCBmaWVsZCBvZiBQUyAqLworLyogIEVYQ00gZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9QU19FWENNX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIEVYQ00gZmllbGQgKi8KKyNkZWZpbmUgWENIQUxfUFNfRVhDTV9OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLworI2RlZmluZSBYQ0hBTF9QU19FWENNX1NISUZUCTQJCS8qIHBvc2l0aW9uIG9mIEVYQ00gYml0cyBpbiBQUywgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9QU19FWENNX01BU0sgCTB4MDAwMDAwMTAJLyogbWFzayBvZiBiaXRzIGluIEVYQ00gZmllbGQgb2YgUFMgKi8KKy8qICBQUk9HU1RBQ0sgZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9QU19QUk9HU1RBQ0tfQklUUyAJMQkJLyogbnVtYmVyIG9mIGJpdHMgaW4gUFJPR1NUQUNLIGZpZWxkICovCisjZGVmaW5lIFhDSEFMX1BTX1BST0dTVEFDS19OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLworI2RlZmluZSBYQ0hBTF9QU19QUk9HU1RBQ0tfU0hJRlQJNQkJLyogcG9zaXRpb24gb2YgUFJPR1NUQUNLIGJpdHMgaW4gUFMsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KKyNkZWZpbmUgWENIQUxfUFNfUFJPR1NUQUNLX01BU0sgCTB4MDAwMDAwMjAJLyogbWFzayBvZiBiaXRzIGluIFBST0dTVEFDSyBmaWVsZCBvZiBQUyAqLworLyogIFJJTkcgZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9QU19SSU5HX0JJVFMgCTIJCS8qIG51bWJlciBvZiBiaXRzIGluIFJJTkcgZmllbGQgKi8KKyNkZWZpbmUgWENIQUxfUFNfUklOR19OVU0gIAk0CQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLworI2RlZmluZSBYQ0hBTF9QU19SSU5HX1NISUZUCTYJCS8qIHBvc2l0aW9uIG9mIFJJTkcgYml0cyBpbiBQUywgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9QU19SSU5HX01BU0sgCTB4MDAwMDAwQzAJLyogbWFzayBvZiBiaXRzIGluIFJJTkcgZmllbGQgb2YgUFMgKi8KKy8qICBPV0IgZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9QU19PV0JfQklUUyAJNAkJLyogbnVtYmVyIG9mIGJpdHMgaW4gT1dCIGZpZWxkICovCisjZGVmaW5lIFhDSEFMX1BTX09XQl9OVU0gIAkxNgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KKyNkZWZpbmUgWENIQUxfUFNfT1dCX1NISUZUCTgJCS8qIHBvc2l0aW9uIG9mIE9XQiBiaXRzIGluIFBTLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX1BTX09XQl9NQVNLIAkweDAwMDAwRjAwCS8qIG1hc2sgb2YgYml0cyBpbiBPV0IgZmllbGQgb2YgUFMgKi8KKy8qICBDQUxMSU5DIGZpZWxkOiAgKi8KKyNkZWZpbmUgWENIQUxfUFNfQ0FMTElOQ19CSVRTIAkyCQkvKiBudW1iZXIgb2YgYml0cyBpbiBDQUxMSU5DIGZpZWxkICovCisjZGVmaW5lIFhDSEFMX1BTX0NBTExJTkNfTlVNICAJNAkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KKyNkZWZpbmUgWENIQUxfUFNfQ0FMTElOQ19TSElGVAkxNgkJLyogcG9zaXRpb24gb2YgQ0FMTElOQyBiaXRzIGluIFBTLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX1BTX0NBTExJTkNfTUFTSyAJMHgwMDAzMDAwMAkvKiBtYXNrIG9mIGJpdHMgaW4gQ0FMTElOQyBmaWVsZCBvZiBQUyAqLworLyogIFdPRSBmaWVsZDogICovCisjZGVmaW5lIFhDSEFMX1BTX1dPRV9CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBXT0UgZmllbGQgKi8KKyNkZWZpbmUgWENIQUxfUFNfV09FX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCisjZGVmaW5lIFhDSEFMX1BTX1dPRV9TSElGVAkxOAkJLyogcG9zaXRpb24gb2YgV09FIGJpdHMgaW4gUFMsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KKyNkZWZpbmUgWENIQUxfUFNfV09FX01BU0sgCTB4MDAwNDAwMDAJLyogbWFzayBvZiBiaXRzIGluIFdPRSBmaWVsZCBvZiBQUyAqLworCisvKiAgRVhDQ0FVU0UgKHNwZWNpYWwgcmVnaXN0ZXIgbnVtYmVyIDIzMik6ICAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9WQUxJRE1BU0sJMHgwMDAwMDAzRgkvKiBiaXRzIG9mIEVYQ0NBVVNFIHRoYXQgYXJlIGRlZmluZWQgKi8KKy8qICBFWENDQVVTRSBmaWVsZDogICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX0JJVFMgCQk2CQkvKiBudW1iZXIgb2YgYml0cyBpbiBFWENDQVVTRSByZWdpc3RlciAqLworI2RlZmluZSBYQ0hBTF9FWENDQVVTRV9OVU0gIAkJNjQJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX1NISUZUCQkwCQkvKiBwb3NpdGlvbiBvZiBFWENDQVVTRSBiaXRzIGluIHJlZ2lzdGVyLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX0VYQ0NBVVNFX01BU0sgCQkweDAwMDAwMDNGCS8qIG1hc2sgb2YgYml0cyBpbiBFWENDQVVTRSByZWdpc3RlciAqLworCisvKiAgREVCVUdDQVVTRSAoc3BlY2lhbCByZWdpc3RlciBudW1iZXIgMjMzKTogICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfVkFMSURNQVNLCTB4MDAwMDAwM0YJLyogYml0cyBvZiBERUJVR0NBVVNFIHRoYXQgYXJlIGRlZmluZWQgKi8KKy8qICBJQ09VTlQgZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0lDT1VOVF9CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBJQ09VTlQgZmllbGQgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9JQ09VTlRfTlVNICAJMgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9JQ09VTlRfU0hJRlQJMAkJLyogcG9zaXRpb24gb2YgSUNPVU5UIGJpdHMgaW4gREVCVUdDQVVTRSwgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0lDT1VOVF9NQVNLIAkweDAwMDAwMDAxCS8qIG1hc2sgb2YgYml0cyBpbiBJQ09VTlQgZmllbGQgb2YgREVCVUdDQVVTRSAqLworLyogIElCUkVBSyBmaWVsZDogICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfSUJSRUFLX0JJVFMgCTEJCS8qIG51bWJlciBvZiBiaXRzIGluIElCUkVBSyBmaWVsZCAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0lCUkVBS19OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0lCUkVBS19TSElGVAkxCQkvKiBwb3NpdGlvbiBvZiBJQlJFQUsgYml0cyBpbiBERUJVR0NBVVNFLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfSUJSRUFLX01BU0sgCTB4MDAwMDAwMDIJLyogbWFzayBvZiBiaXRzIGluIElCUkVBSyBmaWVsZCBvZiBERUJVR0NBVVNFICovCisvKiAgREJSRUFLIGZpZWxkOiAgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9EQlJFQUtfQklUUyAJMQkJLyogbnVtYmVyIG9mIGJpdHMgaW4gREJSRUFLIGZpZWxkICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfREJSRUFLX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfREJSRUFLX1NISUZUCTIJCS8qIHBvc2l0aW9uIG9mIERCUkVBSyBiaXRzIGluIERFQlVHQ0FVU0UsIHN0YXJ0aW5nIGZyb20gbHNiaXQgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9EQlJFQUtfTUFTSyAJMHgwMDAwMDAwNAkvKiBtYXNrIG9mIGJpdHMgaW4gREJSRUFLIGZpZWxkIG9mIERFQlVHQ0FVU0UgKi8KKy8qICBCUkVBSyBmaWVsZDogICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfQlJFQUtfQklUUyAJMQkJLyogbnVtYmVyIG9mIGJpdHMgaW4gQlJFQUsgZmllbGQgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9CUkVBS19OVU0gIAkyCQkvKiBtYXggbnVtYmVyIG9mIHBvc3NpYmxlIGNhdXNlcyAoMl5iaXRzKSAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLX1NISUZUCTMJCS8qIHBvc2l0aW9uIG9mIEJSRUFLIGJpdHMgaW4gREVCVUdDQVVTRSwgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLX01BU0sgCTB4MDAwMDAwMDgJLyogbWFzayBvZiBiaXRzIGluIEJSRUFLIGZpZWxkIG9mIERFQlVHQ0FVU0UgKi8KKy8qICBCUkVBS04gZmllbGQ6ICAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLTl9CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBCUkVBS04gZmllbGQgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9CUkVBS05fTlVNICAJMgkJLyogbWF4IG51bWJlciBvZiBwb3NzaWJsZSBjYXVzZXMgKDJeYml0cykgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9CUkVBS05fU0hJRlQJNAkJLyogcG9zaXRpb24gb2YgQlJFQUtOIGJpdHMgaW4gREVCVUdDQVVTRSwgc3RhcnRpbmcgZnJvbSBsc2JpdCAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0JSRUFLTl9NQVNLIAkweDAwMDAwMDEwCS8qIG1hc2sgb2YgYml0cyBpbiBCUkVBS04gZmllbGQgb2YgREVCVUdDQVVTRSAqLworLyogIERFQlVHSU5UIGZpZWxkOiAgKi8KKyNkZWZpbmUgWENIQUxfREVCVUdDQVVTRV9ERUJVR0lOVF9CSVRTIAkxCQkvKiBudW1iZXIgb2YgYml0cyBpbiBERUJVR0lOVCBmaWVsZCAqLworI2RlZmluZSBYQ0hBTF9ERUJVR0NBVVNFX0RFQlVHSU5UX05VTSAgCTIJCS8qIG1heCBudW1iZXIgb2YgcG9zc2libGUgY2F1c2VzICgyXmJpdHMpICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfREVCVUdJTlRfU0hJRlQJNQkJLyogcG9zaXRpb24gb2YgREVCVUdJTlQgYml0cyBpbiBERUJVR0NBVVNFLCBzdGFydGluZyBmcm9tIGxzYml0ICovCisjZGVmaW5lIFhDSEFMX0RFQlVHQ0FVU0VfREVCVUdJTlRfTUFTSyAJMHgwMDAwMDAyMAkvKiBtYXNrIG9mIGJpdHMgaW4gREVCVUdJTlQgZmllbGQgb2YgREVCVUdDQVVTRSAqLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJSVNBCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhDSEFMX0hBVkVfREVOU0lUWQkJMQkvKiAxIGlmIGRlbnNpdHkgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTE9PUFMJCTEJLyogMSBpZiB6ZXJvLW92ZXJoZWFkIGxvb3BzIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworLyogIE1pc2MgaW5zdHJ1Y3Rpb25zOiAgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9OU0EJCQkwCS8qIDEgaWYgTlNBL05TQVUgaW5zdHJ1Y3Rpb25zIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01JTk1BWAkJMAkvKiAxIGlmIE1JTi9NQVggaW5zdHJ1Y3Rpb25zIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX1NFWFQJCQkwCS8qIDEgaWYgc2lnbi1leHRlbmQgaW5zdHJ1Y3Rpb24gb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfQ0xBTVBTCQkwCS8qIDEgaWYgQ0xBTVBTIGluc3RydWN0aW9uIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01BQzE2CQkwCS8qIDEgaWYgTUFDMTYgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVVMMTYJCTAJLyogMSBpZiAxNi1iaXQgaW50ZWdlciBtdWx0aXBseSBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKy8qI2RlZmluZSBYQ0hBTF9IQVZFX1BPUEMJCTAqLwkvKiAxIGlmIENSQyBpbnN0cnVjdGlvbiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKy8qI2RlZmluZSBYQ0hBTF9IQVZFX0NSQwkJMCovCS8qIDEgaWYgUE9QQyBpbnN0cnVjdGlvbiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKworI2RlZmluZSBYQ0hBTF9IQVZFX1NQRUNVTEFUSU9OCQkwCS8qIDEgaWYgc3BlY3VsYXRpb24gb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisvKiNkZWZpbmUgWENIQUxfSEFWRV9NUF9TWU5DCQkwKi8JLyogMSBpZiBtdWx0aXByb2Nlc3NvciBzeW5jLiBvcHRpb24gY29uZmlndXJlZCwgMCBvdGhlcndpc2UgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9QUklECQkJMAkvKiAxIGlmIHByb2Nlc3NvciBJRCByZWdpc3RlciBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworCisjZGVmaW5lIFhDSEFMX05VTV9NSVNDX1JFR1MJCTIJLyogbnVtYmVyIG9mIG1pc2NlbGxhbmVvdXMgcmVnaXN0ZXJzICgwLi40KSAqLworCisvKiAgVGhlc2UgcmVsYXRlIGEgYml0IG1vcmUgdG8gVElFOiAgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CT09MRUFOUwkJMAkvKiAxIGlmIGJvb2xlYW5zIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01VTDMyCQkwCS8qIDEgaWYgMzItYml0IGludGVnZXIgbXVsdGlwbHkgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfTVVMMzJfSElHSAkJMAkvKiAxIGlmIE1VTDMyIG9wdGlvbiBpbmNsdWRlcyBNVUxVSCBhbmQgTVVMU0gsIDAgb3RoZXJ3aXNlICovCisjZGVmaW5lIFhDSEFMX0hBVkVfRlAJCQkwCS8qIDEgaWYgZmxvYXRpbmcgcG9pbnQgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJREVSSVZFRAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIFhDSEFMX0hBVkVfQkUKKyNkZWZpbmUgWENIQUxfSU5TVF9JTExOCQkJMHhENjBGCQkvKiAyLWJ5dGUgaWxsZWdhbCBpbnN0cnVjdGlvbiwgbXNiLWZpcnN0ICovCisjZGVmaW5lIFhDSEFMX0lOU1RfSUxMTl9CWVRFMAkJMHhENgkJLyogMi1ieXRlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24sIDFzdCBieXRlICovCisjZGVmaW5lIFhDSEFMX0lOU1RfSUxMTl9CWVRFMQkJMHgwRgkJLyogMi1ieXRlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24sIDJuZCBieXRlICovCisjZWxzZQorI2RlZmluZSBYQ0hBTF9JTlNUX0lMTE4JCQkweEYwNkQJCS8qIDItYnl0ZSBpbGxlZ2FsIGluc3RydWN0aW9uLCBsc2ItZmlyc3QgKi8KKyNkZWZpbmUgWENIQUxfSU5TVF9JTExOX0JZVEUwCQkweDZECQkvKiAyLWJ5dGUgaWxsZWdhbCBpbnN0cnVjdGlvbiwgMXN0IGJ5dGUgKi8KKyNkZWZpbmUgWENIQUxfSU5TVF9JTExOX0JZVEUxCQkweEYwCQkvKiAyLWJ5dGUgaWxsZWdhbCBpbnN0cnVjdGlvbiwgMm5kIGJ5dGUgKi8KKyNlbmRpZgorLyogIEJlbG9uZ3MgaW4geHRlbnNhL2hhbC5oOiAgKi8KKyNkZWZpbmUgWFRIQUxfSU5TVF9JTEwJCQkweDAwMDAwMAkvKiAzLWJ5dGUgaWxsZWdhbCBpbnN0cnVjdGlvbiAqLworCisKKy8qCisgKiAgQmVjYXVzZSBpbmZvcm1hdGlvbiBhcyB0byBleGFjdGx5IHdoaWNoIGhhcmR3YXJlIHJlbGVhc2UgaXMgdGFyZ2V0ZWQKKyAqICBieSBhIGdpdmVuIHNvZnR3YXJlIGJ1aWxkIGlzIG5vdCBhbHdheXMgYXZhaWxhYmxlLCBjb21waWxlLXRpbWUgSEFMCisgKiAgSGFyZHdhcmUtUmVsZWFzZSAiX0FUIiBtYWNyb3MgYXJlIGZ1enp5IChyZXR1cm4gMCwgMSwgb3IgWENIQUxfTUFZQkUpOgorICovCisjaWZuZGVmIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IKKyMgZGVmaW5lIFhDSEFMX0hXX0NPTkZJR0lEX1JFTElBQkxFCTAKKyNlbmRpZgorI2lmIFhDSEFMX0hXX0NPTkZJR0lEX1JFTElBQkxFCisjIGRlZmluZSBYQ0hBTF9IV19SRUxFQVNFX0FUX09SX0JFTE9XKG1ham9yLG1pbm9yKQkoWFRIQUxfUkVMX0xFKCBYQ0hBTF9IV19SRUxFQVNFX01BSk9SLFhDSEFMX0hXX1JFTEVBU0VfTUlOT1IsIG1ham9yLG1pbm9yICkgPyAxIDogMCkKKyMgZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfQVRfT1JfQUJPVkUobWFqb3IsbWlub3IpCShYVEhBTF9SRUxfR0UoIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IsWENIQUxfSFdfUkVMRUFTRV9NSU5PUiwgbWFqb3IsbWlub3IgKSA/IDEgOiAwKQorIyBkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9BVChtYWpvcixtaW5vcikJCShYVEhBTF9SRUxfRVEoIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IsWENIQUxfSFdfUkVMRUFTRV9NSU5PUiwgbWFqb3IsbWlub3IgKSA/IDEgOiAwKQorIyBkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9NQUpPUl9BVChtYWpvcikJCSgoWENIQUxfSFdfUkVMRUFTRV9NQUpPUiA9PSAobWFqb3IpKSA/IDEgOiAwKQorI2Vsc2UKKyMgZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfQVRfT1JfQkVMT1cobWFqb3IsbWlub3IpCSggKChtYWpvcikgPCAxMDQwICYmIFhDSEFMX0hBVkVfWEVBMikgPyAwIFwKKwkJCQkJCQk6ICgobWFqb3IpID4gMTA1MCAmJiBYQ0hBTF9IQVZFX1hFQTEpID8gMSBcCisJCQkJCQkJOiBYVEhBTF9NQVlCRSApCisjIGRlZmluZSBYQ0hBTF9IV19SRUxFQVNFX0FUX09SX0FCT1ZFKG1ham9yLG1pbm9yKQkoICgobWFqb3IpID49IDIwMDAgJiYgWENIQUxfSEFWRV9YRUExKSA/IDAgXAorCQkJCQkJCTogKFhUSEFMX1JFTF9MRShtYWpvcixtaW5vciwgMTA0MCwwKSAmJiBYQ0hBTF9IQVZFX1hFQTIpID8gMSBcCisJCQkJCQkJOiBYVEhBTF9NQVlCRSApCisjIGRlZmluZSBYQ0hBTF9IV19SRUxFQVNFX0FUKG1ham9yLG1pbm9yKQkJKCAoKChtYWpvcikgPCAxMDQwICYmIFhDSEFMX0hBVkVfWEVBMikgfHwgXAorCQkJCQkJCSAgICgobWFqb3IpID49IDIwMDAgJiYgWENIQUxfSEFWRV9YRUExKSkgPyAwIDogWFRIQUxfTUFZQkUpCisjIGRlZmluZSBYQ0hBTF9IV19SRUxFQVNFX01BSk9SX0FUKG1ham9yKQkJWENIQUxfSFdfUkVMRUFTRV9BVChtYWpvciwwKQorI2VuZGlmCisKKy8qCisgKiAgU3BlY2lmaWMgZXJyYXRhOgorICovCisKKy8qCisgKiAgRXJyYXR1bSBUMTAyMC5IMTMsIFQxMDMwLkg3LCBUMTA0MC5IMTAsIFQxMDUwLkg0IChmaXhlZCBpbiBUMTA0MC4zIGFuZCBUMTA1MC4xOworICogIHJlbGV2YW50IG9ubHkgaW4gWEVBMSwga2VybmVsLXZlY3RvciBtb2RlLCBsZXZlbC1vbmUgaW50ZXJydXB0cyBhbmQgb3ZlcmZsb3dzIGVuYWJsZWQpOgorICovCisjZGVmaW5lIFhDSEFMX01BWUhBVkVfRVJSQVRVTV9YRUExS1dJTgkoWENIQUxfSEFWRV9YRUExICYmIFwKKwkJCQkJIChYQ0hBTF9IV19SRUxFQVNFX0FUX09SX0JFTE9XKDEwNDAsMikgIT0gMCBcCisJCQkJCSAgfHwgWENIQUxfSFdfUkVMRUFTRV9BVCgxMDUwLDApKSkKKworCisKKyNlbmRpZiAvKlhURU5TQV9DT05GSUdfQ09SRV9IKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvZGVmcy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb25maWctbGludXhfYmUvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzU4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9kZWZzLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qIERlZmluaXRpb25zIGZvciBYdGVuc2EgaW5zdHJ1Y3Rpb25zLCB0eXBlcywgYW5kIHByb3Rvcy4gKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUZW5zaWxpY2EsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAorICogVVNBLgorICovCisKKy8qIERvIG5vdCBtb2RpZnkuIFRoaXMgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuKi8KKworI2lmbmRlZiBfWFRFTlNBX0JBU0VfSEVBREVSCisjZGVmaW5lIF9YVEVOU0FfQkFTRV9IRUFERVIKKworI2lmZGVmIF9fWFRFTlNBX18KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1hDQ19fKQorCisjZGVmaW5lIEw4VUlfQVNNKGFyciwgYXJzLCBpbW0pIHsgXAorICBfX2FzbV9fIHZvbGF0aWxlKCJsOHVpICUwLCAlMSwgJTIiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSAsICJpIiAoaW1tKSk7IFwKK30KKworI2RlZmluZSBYVF9MOFVJKGFycywgaW1tKSBcCisoeyBcCisgIHVuc2lnbmVkIGNoYXIgX2FycjsgXAorICBjb25zdCB1bnNpZ25lZCBjaGFyICpfYXJzID0gYXJzOyBcCisgIEw4VUlfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKKyAgX2FycjsgXAorfSkKKworI2RlZmluZSBMMTZVSV9BU00oYXJyLCBhcnMsIGltbSkgeyBcCisgIF9fYXNtX18gdm9sYXRpbGUoImwxNnVpICUwLCAlMSwgJTIiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSAsICJpIiAoaW1tKSk7IFwKK30KKworI2RlZmluZSBYVF9MMTZVSShhcnMsIGltbSkgXAorKHsgXAorICB1bnNpZ25lZCBzaG9ydCBfYXJyOyBcCisgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpfYXJzID0gYXJzOyBcCisgIEwxNlVJX0FTTShfYXJyLCBfYXJzLCBpbW0pOyBcCisgIF9hcnI7IFwKK30pCisKKyNkZWZpbmUgTDE2U0lfQVNNKGFyciwgYXJzLCBpbW0pIHtcCisgIF9fYXNtX18gdm9sYXRpbGUoImwxNnNpICUwLCAlMSwgJTIiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSAsICJpIiAoaW1tKSk7IFwKK30KKworI2RlZmluZSBYVF9MMTZTSShhcnMsIGltbSkgXAorKHsgXAorICBzaWduZWQgc2hvcnQgX2FycjsgXAorICBjb25zdCBzaWduZWQgc2hvcnQgKl9hcnMgPSBhcnM7IFwKKyAgTDE2U0lfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKKyAgX2FycjsgXAorfSkKKworI2RlZmluZSBMMzJJX0FTTShhcnIsIGFycywgaW1tKSB7IFwKKyAgX19hc21fXyB2b2xhdGlsZSgibDMyaSAlMCwgJTEsICUyIiA6ICI9YSIgKGFycikgOiAiYSIgKGFycykgLCAiaSIgKGltbSkpOyBcCit9CisKKyNkZWZpbmUgWFRfTDMySShhcnMsIGltbSkgXAorKHsgXAorICB1bnNpZ25lZCBfYXJyOyBcCisgIGNvbnN0IHVuc2lnbmVkICpfYXJzID0gYXJzOyBcCisgIEwzMklfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKKyAgX2FycjsgXAorfSkKKworI2RlZmluZSBTOElfQVNNKGFyciwgYXJzLCBpbW0pIHtcCisgIF9fYXNtX18gdm9sYXRpbGUoInM4aSAlMCwgJTEsICUyIiA6IDogImEiIChhcnIpLCAiYSIgKGFycykgLCAiaSIgKGltbSkgOiAibWVtb3J5IiApOyBcCit9CisKKyNkZWZpbmUgWFRfUzhJKGFyciwgYXJzLCBpbW0pIFwKKyh7IFwKKyAgc2lnbmVkIGNoYXIgX2FyciA9IGFycjsgXAorICBjb25zdCBzaWduZWQgY2hhciAqX2FycyA9IGFyczsgXAorICBTOElfQVNNKF9hcnIsIF9hcnMsIGltbSk7IFwKK30pCisKKyNkZWZpbmUgUzE2SV9BU00oYXJyLCBhcnMsIGltbSkge1wKKyAgX19hc21fXyB2b2xhdGlsZSgiczE2aSAlMCwgJTEsICUyIiA6IDogImEiIChhcnIpLCAiYSIgKGFycykgLCAiaSIgKGltbSkgOiAibWVtb3J5IiApOyBcCit9CisKKyNkZWZpbmUgWFRfUzE2SShhcnIsIGFycywgaW1tKSBcCisoeyBcCisgIHNpZ25lZCBzaG9ydCBfYXJyID0gYXJyOyBcCisgIGNvbnN0IHNpZ25lZCBzaG9ydCAqX2FycyA9IGFyczsgXAorICBTMTZJX0FTTShfYXJyLCBfYXJzLCBpbW0pOyBcCit9KQorCisjZGVmaW5lIFMzMklfQVNNKGFyciwgYXJzLCBpbW0pIHsgXAorICBfX2FzbV9fIHZvbGF0aWxlKCJzMzJpICUwLCAlMSwgJTIiIDogOiAiYSIgKGFyciksICJhIiAoYXJzKSAsICJpIiAoaW1tKSA6ICJtZW1vcnkiICk7IFwKK30KKworI2RlZmluZSBYVF9TMzJJKGFyciwgYXJzLCBpbW0pIFwKKyh7IFwKKyAgc2lnbmVkIGludCBfYXJyID0gYXJyOyBcCisgIGNvbnN0IHNpZ25lZCBpbnQgKl9hcnMgPSBhcnM7IFwKKyAgUzMySV9BU00oX2FyciwgX2FycywgaW1tKTsgXAorfSkKKworI2RlZmluZSBBRERJX0FTTShhcnQsIGFycywgaW1tKSB7XAorICAgX19hc21fXyAoImFkZGkgJTAsICUxLCAlMiIgOiAiPWEiIChhcnQpIDogImEiIChhcnMpLCAiaSIgKGltbSkpOyBcCit9CisKKyNkZWZpbmUgWFRfQURESShhcnMsIGltbSkgXAorKHsgXAorICAgdW5zaWduZWQgX2FydDsgXAorICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAorICAgQURESV9BU00oX2FydCwgX2FycywgaW1tKTsgXAorICAgX2FydDsgXAorfSkKKworI2RlZmluZSBBQlNfQVNNKGFyciwgYXJ0KSB7XAorICAgX19hc21fXyAoImFicyAlMCwgJTEiIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJ0KSk7IFwKK30KKworI2RlZmluZSBYVF9BQlMoYXJ0KSBcCisoeyBcCisgICB1bnNpZ25lZCBfYXJyOyBcCisgICBzaWduZWQgX2FydCA9IGFydDsgXAorICAgQUJTX0FTTShfYXJyLCBfYXJ0KTsgXAorICAgX2FycjsgXAorfSkKKworLyogTm90ZTogSW4gdGhlIGZvbGxvd2luZyBtYWNyb3MgdGhhdCByZWZlcmVuY2UgU0FSLCB0aGUgbWFnaWMgInN0YXRlIgorICAgcmVnaXN0ZXIgaXMgdXNlZCB0byBjYXB0dXJlIHRoZSBkZXBlbmRlbmN5IG9uIFNBUi4gIFRoaXMgaXMgYmVjYXVzZQorICAgU0FSIGlzIGEgNS1iaXQgcmVnaXN0ZXIgYW5kIHRodXMgdGhlcmUgYXJlIG5vIEMgdHlwZXMgdGhhdCBjYW4gYmUKKyAgIHVzZWQgdG8gcmVwcmVzZW50IGl0LiAgSXQgZG9lc24ndCBhcHBlYXIgdGhhdCB0aGUgU0FSIHJlZ2lzdGVyIGlzCisgICBldmVuIHJlbGV2YW50IHRvIEdDQywgYnV0IGl0IGlzIG1hcmtlZCBhcyAiY2xvYmJlcmVkIiBqdXN0IGluCisgICBjYXNlLiAgKi8KKworI2RlZmluZSBTUkNfQVNNKGFyciwgYXJzLCBhcnQpIHtcCisgICByZWdpc3RlciBpbnQgX3h0X3NhciBfX2FzbV9fICgic3RhdGUiKTsgXAorICAgX19hc21fXyAoInNyYyAlMCwgJTEsICUyIiBcCisJICAgIDogIj1hIiAoYXJyKSA6ICJhIiAoYXJzKSwgImEiIChhcnQpLCAidCIgKF94dF9zYXIpKTsgXAorfQorCisjZGVmaW5lIFhUX1NSQyhhcnMsIGFydCkgXAorKHsgXAorICAgdW5zaWduZWQgX2FycjsgXAorICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAorICAgdW5zaWduZWQgX2FydCA9IGFydDsgXAorICAgU1JDX0FTTShfYXJyLCBfYXJzLCBfYXJ0KTsgXAorICAgX2FycjsgXAorfSkKKworI2RlZmluZSBTU1JfQVNNKGFycykge1wKKyAgIHJlZ2lzdGVyIGludCBfeHRfc2FyIF9fYXNtX18gKCJzdGF0ZSIpOyBcCisgICBfX2FzbV9fICgic3NyICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImEiIChhcnMpIDogInNhciIpOyBcCit9CisKKyNkZWZpbmUgWFRfU1NSKGFycykgXAorKHsgXAorICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAorICAgU1NSX0FTTShfYXJzKTsgXAorfSkKKworI2RlZmluZSBTU0xfQVNNKGFycykge1wKKyAgIHJlZ2lzdGVyIGludCBfeHRfc2FyIF9fYXNtX18gKCJzdGF0ZSIpOyBcCisgICBfX2FzbV9fICgic3NsICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImEiIChhcnMpIDogInNhciIpOyBcCit9CisKKyNkZWZpbmUgWFRfU1NMKGFycykgXAorKHsgXAorICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAorICAgU1NMX0FTTShfYXJzKTsgXAorfSkKKworI2RlZmluZSBTU0E4Ql9BU00oYXJzKSB7XAorICAgcmVnaXN0ZXIgaW50IF94dF9zYXIgX19hc21fXyAoInN0YXRlIik7IFwKKyAgIF9fYXNtX18gKCJzc2E4YiAlMSIgOiAiPXQiIChfeHRfc2FyKSA6ICJhIiAoYXJzKSA6ICJzYXIiKTsgXAorfQorCisjZGVmaW5lIFhUX1NTQThCKGFycykgXAorKHsgXAorICAgdW5zaWduZWQgX2FycyA9IGFyczsgXAorICAgU1NBOEJfQVNNKF9hcnMpOyBcCit9KQorCisjZGVmaW5lIFNTQThMX0FTTShhcnMpIHtcCisgICByZWdpc3RlciBpbnQgX3h0X3NhciBfX2FzbV9fICgic3RhdGUiKTsgXAorICAgX19hc21fXyAoInNzYThsICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImEiIChhcnMpIDogInNhciIpOyBcCit9CisKKyNkZWZpbmUgWFRfU1NBOEwoYXJzKSBcCisoeyBcCisgICB1bnNpZ25lZCBfYXJzID0gYXJzOyBcCisgICBTU0E4TF9BU00oX2Fycyk7IFwKK30pCisKKyNkZWZpbmUgU1NBSV9BU00oaW1tKSB7XAorICAgcmVnaXN0ZXIgaW50IF94dF9zYXIgX19hc21fXyAoInN0YXRlIik7IFwKKyAgIF9fYXNtX18gKCJzc2FpICUxIiA6ICI9dCIgKF94dF9zYXIpIDogImkiIChpbW0pIDogInNhciIpOyBcCit9CisKKyNkZWZpbmUgWFRfU1NBSShpbW0pIFwKKyh7IFwKKyAgIFNTQUlfQVNNKGltbSk7IFwKK30pCisKKworCisKKworCisKKworI2VuZGlmIC8qIF9fR05VQ19fICYmICFfX1hDQ19fICovCisKKyNpZmRlZiBfX1hDQ19fCisKKy8qIENvcmUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyIF9USUVfTDhVSShjb25zdCB1bnNpZ25lZCBjaGFyICogYXJzLCBpbW1lZGlhdGUgaW1tKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBfVElFX0wxNlVJKGNvbnN0IHVuc2lnbmVkIHNob3J0ICogYXJzLCBpbW1lZGlhdGUgaW1tKTsKK2V4dGVybiBzaWduZWQgc2hvcnQgX1RJRV9MMTZTSShjb25zdCBzaWduZWQgc2hvcnQgKiBhcnMsIGltbWVkaWF0ZSBpbW0pOworZXh0ZXJuIHVuc2lnbmVkIF9USUVfTDMySShjb25zdCB1bnNpZ25lZCAqIGFycywgaW1tZWRpYXRlIGltbSk7CitleHRlcm4gdm9pZCBfVElFX1M4SSh1bnNpZ25lZCBjaGFyIGFyciwgdW5zaWduZWQgY2hhciAqIGFycywgaW1tZWRpYXRlIGltbSk7CitleHRlcm4gdm9pZCBfVElFX1MxNkkodW5zaWduZWQgc2hvcnQgYXJyLCB1bnNpZ25lZCBzaG9ydCAqIGFycywgaW1tZWRpYXRlIGltbSk7CitleHRlcm4gdm9pZCBfVElFX1MzMkkodW5zaWduZWQgYXJyLCB1bnNpZ25lZCAqIGFycywgaW1tZWRpYXRlIGltbSk7CisKKyNkZWZpbmUgWFRfTDhVSSAgX1RJRV9MOFVJCisjZGVmaW5lIFhUX0wxNlVJIF9USUVfTDE2VUkKKyNkZWZpbmUgWFRfTDE2U0kgX1RJRV9MMTZTSQorI2RlZmluZSBYVF9MMzJJICBfVElFX0wzMkkKKyNkZWZpbmUgWFRfUzhJICAgX1RJRV9TOEkKKyNkZWZpbmUgWFRfUzE2SSAgX1RJRV9TMTZJCisjZGVmaW5lIFhUX1MzMkkgIF9USUVfUzMySQorCisvKiBBZGQtaW1tZWRpYXRlIGluc3RydWN0aW9uICovCitleHRlcm4gdW5zaWduZWQgX1RJRV9BRERJKHVuc2lnbmVkIGFycywgaW1tZWRpYXRlIGltbSk7CisjZGVmaW5lIFhUX0FEREkgIF9USUVfQURESQorCisvKiBBYnNvbHV0ZSB2YWx1ZSBpbnN0cnVjdGlvbiAqLworZXh0ZXJuIHVuc2lnbmVkIF9USUVfQUJTKGludCBhcnQpOworI2RlZmluZSBYVF9BQlMgX1RJRV9BQlMKKworLyogZnVubmVsIHNoaWZ0IGluc3RydWN0aW9ucyAqLworZXh0ZXJuIHVuc2lnbmVkIF9USUVfU1JDKHVuc2lnbmVkIGFycywgdW5zaWduZWQgYXJ0KTsKKyNkZWZpbmUgWFRfU1JDIF9USUVfU1JDCitleHRlcm4gdm9pZCBfVElFX1NTUih1bnNpZ25lZCBhcnMpOworI2RlZmluZSBYVF9TU1IgX1RJRV9TU1IKK2V4dGVybiB2b2lkIF9USUVfU1NMKHVuc2lnbmVkIGFycyk7CisjZGVmaW5lIFhUX1NTTCBfVElFX1NTTAorZXh0ZXJuIHZvaWQgX1RJRV9TU0E4Qih1bnNpZ25lZCBhcnMpOworI2RlZmluZSBYVF9TU0E4QiBfVElFX1NTQThCCitleHRlcm4gdm9pZCBfVElFX1NTQThMKHVuc2lnbmVkIGFycyk7CisjZGVmaW5lIFhUX1NTQThMIF9USUVfU1NBOEwKK2V4dGVybiB2b2lkIF9USUVfU1NBSShpbW1lZGlhdGUgaW1tKTsKKyNkZWZpbmUgWFRfU1NBSSBfVElFX1NTQUkKKworCisjZW5kaWYgLyogX19YQ0NfXyAqLworCisjZW5kaWYgLyogX19YVEVOU0FfXyAqLworI2VuZGlmIC8qICFfWFRFTlNBX0JBU0VfSEVBREVSICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zcGVjcmVnLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zcGVjcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0MTA2YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29uZmlnLWxpbnV4X2JlL3NwZWNyZWcuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogWHRlbnNhIFNwZWNpYWwgUmVnaXN0ZXIgc3ltYm9saWMgbmFtZXMKKyAqLworCisvKiAkSWQ6IHNwZWNyZWcuaCx2IDEuMiAyMDAzLzAzLzA3IDE5OjE1OjE4IGpvZXRheWxvciBFeHAgJCAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRlbnNpbGljYSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworI2lmbmRlZiBYVEVOU0FfU1BFQ1JFR19ICisjZGVmaW5lIFhURU5TQV9TUEVDUkVHX0gKKworLyogIEluY2x1ZGUgdGhlc2Ugc3BlY2lhbCByZWdpc3RlciBiaXRmaWVsZCBkZWZpbml0aW9ucywgZm9yIGhpc3RvcmljYWwgcmVhc29uczogICovCisjaW5jbHVkZSA8eHRlbnNhL2NvcmViaXRzLmg+CisKKworLyogIFNwZWNpYWwgcmVnaXN0ZXJzOiAgKi8KKyNkZWZpbmUgTEJFRwkJMAorI2RlZmluZSBMRU5ECQkxCisjZGVmaW5lIExDT1VOVAkJMgorI2RlZmluZSBTQVIJCTMKKyNkZWZpbmUgV0lORE9XQkFTRQk3MgorI2RlZmluZSBXSU5ET1dTVEFSVAk3MworI2RlZmluZSBQVEVWQUREUgk4MworI2RlZmluZSBSQVNJRAkJOTAKKyNkZWZpbmUgSVRMQkNGRwkJOTEKKyNkZWZpbmUgRFRMQkNGRwkJOTIKKyNkZWZpbmUgSUJSRUFLRU5BQkxFCTk2CisjZGVmaW5lIEREUgkJMTA0CisjZGVmaW5lIElCUkVBS0FfMAkxMjgKKyNkZWZpbmUgSUJSRUFLQV8xCTEyOQorI2RlZmluZSBEQlJFQUtBXzAJMTQ0CisjZGVmaW5lIERCUkVBS0FfMQkxNDUKKyNkZWZpbmUgREJSRUFLQ18wCTE2MAorI2RlZmluZSBEQlJFQUtDXzEJMTYxCisjZGVmaW5lIEVQQ18xCQkxNzcKKyNkZWZpbmUgRVBDXzIJCTE3OAorI2RlZmluZSBFUENfMwkJMTc5CisjZGVmaW5lIEVQQ180CQkxODAKKyNkZWZpbmUgREVQQwkJMTkyCisjZGVmaW5lIEVQU18yCQkxOTQKKyNkZWZpbmUgRVBTXzMJCTE5NQorI2RlZmluZSBFUFNfNAkJMTk2CisjZGVmaW5lIEVYQ1NBVkVfMQkyMDkKKyNkZWZpbmUgRVhDU0FWRV8yCTIxMAorI2RlZmluZSBFWENTQVZFXzMJMjExCisjZGVmaW5lIEVYQ1NBVkVfNAkyMTIKKyNkZWZpbmUgSU5URVJSVVBUCTIyNgorI2RlZmluZSBJTlRFTkFCTEUJMjI4CisjZGVmaW5lIFBTCQkyMzAKKyNkZWZpbmUgRVhDQ0FVU0UJMjMyCisjZGVmaW5lIERFQlVHQ0FVU0UJMjMzCisjZGVmaW5lIENDT1VOVAkJMjM0CisjZGVmaW5lIElDT1VOVAkJMjM2CisjZGVmaW5lIElDT1VOVExFVkVMCTIzNworI2RlZmluZSBFWENWQUREUgkyMzgKKyNkZWZpbmUgQ0NPTVBBUkVfMAkyNDAKKyNkZWZpbmUgQ0NPTVBBUkVfMQkyNDEKKyNkZWZpbmUgQ0NPTVBBUkVfMgkyNDIKKyNkZWZpbmUgTUlTQ19SRUdfMAkyNDQKKyNkZWZpbmUgTUlTQ19SRUdfMQkyNDUKKworLyogIFNwZWNpYWwgY2FzZXMgKGJhc2VzIG9mIHNwZWNpYWwgcmVnaXN0ZXIgc2VyaWVzKTogICovCisjZGVmaW5lIElCUkVBS0EJCTEyOAorI2RlZmluZSBEQlJFQUtBCQkxNDQKKyNkZWZpbmUgREJSRUFLQwkJMTYwCisjZGVmaW5lIEVQQwkJMTc2CisjZGVmaW5lIEVQUwkJMTkyCisjZGVmaW5lIEVYQ1NBVkUJCTIwOAorI2RlZmluZSBDQ09NUEFSRQkyNDAKKworLyogIFNwZWNpYWwgbmFtZXMgZm9yIHJlYWQtb25seSBhbmQgd3JpdGUtb25seSBpbnRlcnJ1cHQgcmVnaXN0ZXJzOiAgKi8KKyNkZWZpbmUgSU5UUkVBRAkJMjI2CisjZGVmaW5lIElOVFNFVAkJMjI2CisjZGVmaW5lIElOVENMRUFSCTIyNworCisjZW5kaWYgLyogWFRFTlNBX1NQRUNSRUdfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29uZmlnLWxpbnV4X2JlL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWQ0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS9zeXN0ZW0uaApAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIHh0ZW5zYS9jb25maWcvc3lzdGVtLmggLS0gSEFMIGRlZmluaXRpb25zIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBTWVNURU0gY29uZmlndXJhdGlvbgorICoKKyAqICBOT1RFOiBUaGUgbG9jYXRpb24gYW5kIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgaGlnaGx5IHN1YmplY3QgdG8gY2hhbmdlLgorICoKKyAqICBTb3VyY2UgZm9yIGNvbmZpZ3VyYXRpb24taW5kZXBlbmRlbnQgYmluYXJpZXMgKHdoaWNoIGxpbmsgaW4gYQorICogIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMgSEFMIGxpYnJhcnkpIG11c3QgTkVWRVIgaW5jbHVkZSB0aGlzIGZpbGUuCisgKiAgVGhlIEhBTCBpdHNlbGYgaGFzIGhpc3RvcmljYWxseSBpbmNsdWRlZCB0aGlzIGZpbGUgaW4gc29tZSBpbnN0YW5jZXMsCisgKiAgYnV0IHRoaXMgaXMgbm90IGFwcHJvcHJpYXRlIGVpdGhlciwgYmVjYXVzZSB0aGUgSEFMIGlzIG1lYW50IHRvIGJlCisgKiAgY29yZS1zcGVjaWZpYyBidXQgc3lzdGVtIGluZGVwZW5kZW50LgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGVuc2lsaWNhLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyLjEgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywKKyAqIFVTQS4KKyAqLworCisKKyNpZm5kZWYgWFRFTlNBX0NPTkZJR19TWVNURU1fSAorI2RlZmluZSBYVEVOU0FfQ09ORklHX1NZU1RFTV9ICisKKy8qI2luY2x1ZGUgPHh0ZW5zYS9oYWwuaD4qLworCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJREVWSUNFIEFERFJFU1NFUworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqICBTdHJhbmdlIHBsYWNlIHRvIGZpbmQgdGhlc2UsIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBHVUkKKyAqICBhbGxvd3MgbW92aW5nIHRoZXNlIGFyb3VuZCB0byBhY2NvdW50IGZvciB2YXJpb3VzIGNvcmUKKyAqICBjb25maWd1cmF0aW9ucy4gIFNwZWNpZmljIGJvYXJkcyAoYW5kIHRoZWlyIEJTUCBzb2Z0d2FyZSkKKyAqICB3aWxsIGhhdmUgc3BlY2lmaWMgbWVhbmluZ3MgZm9yIHRoZXNlIGNvbXBvbmVudHMuCisgKi8KKworLyogIEkvTyBCbG9jayBhcmVhczogICovCisjZGVmaW5lIFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSCTB4RTAwMDAwMDAKKyNkZWZpbmUgWFNIQUxfSU9CTE9DS19DQUNIRURfUEFERFIJMHhGMDAwMDAwMAorI2RlZmluZSBYU0hBTF9JT0JMT0NLX0NBQ0hFRF9TSVpFCTB4MEUwMDAwMDAKKworI2RlZmluZSBYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUgkweEYwMDAwMDAwCisjZGVmaW5lIFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSCTB4RjAwMDAwMDAKKyNkZWZpbmUgWFNIQUxfSU9CTE9DS19CWVBBU1NfU0laRQkweDBFMDAwMDAwCisKKy8qICBTeXN0ZW0gUk9NOiAgKi8KKyNkZWZpbmUgWFNIQUxfUk9NX1ZBRERSCQkweEVFMDAwMDAwCisjZGVmaW5lIFhTSEFMX1JPTV9QQUREUgkJMHhGRTAwMDAwMAorI2RlZmluZSBYU0hBTF9ST01fU0laRQkJMHgwMDQwMDAwMAorLyogIExhcmdlc3QgYXZhaWxhYmxlIGFyZWEgKGZyZWUgb2YgdmVjdG9ycyk6ICAqLworI2RlZmluZSBYU0hBTF9ST01fQVZBSUxfVkFERFIJMHhFRTAwMDUyQworI2RlZmluZSBYU0hBTF9ST01fQVZBSUxfVlNJWkUJMHgwMDNGRkFENAorCisvKiAgU3lzdGVtIFJBTTogICovCisjZGVmaW5lIFhTSEFMX1JBTV9WQUREUgkJMHhEMDAwMDAwMAorI2RlZmluZSBYU0hBTF9SQU1fUEFERFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWFNIQUxfUkFNX1ZTSVpFCQkweDA4MDAwMDAwCisjZGVmaW5lIFhTSEFMX1JBTV9QU0laRQkJMHgxMDAwMDAwMAorI2RlZmluZSBYU0hBTF9SQU1fU0laRQkJWFNIQUxfUkFNX1BTSVpFCisvKiAgTGFyZ2VzdCBhdmFpbGFibGUgYXJlYSAoZnJlZSBvZiB2ZWN0b3JzKTogICovCisjZGVmaW5lIFhTSEFMX1JBTV9BVkFJTF9WQUREUgkweEQwMDAwMzcwCisjZGVmaW5lIFhTSEFMX1JBTV9BVkFJTF9WU0laRQkweDA3RkZGQzkwCisKKy8qCisgKiAgU2hhZG93IHN5c3RlbSBSQU0gKHNhbWUgZGV2aWNlIGFzIHN5c3RlbSBSQU0sIGF0IGRpZmZlcmVudCBhZGRyZXNzKS4KKyAqICAoRW11bGF0aW9uIGJvYXJkcyBuZWVkIHRoaXMgZm9yIHRoZSBTT05JQyBFdGhlcm5ldCBkcml2ZXIKKyAqICAgd2hlbiBkYXRhIGNhY2hlcyBhcmUgY29uZmlndXJlZCBmb3Igd3JpdGViYWNrIG1vZGUuKQorICogIE5PVEU6IG9uIGZ1bGwgTU1VIGNvbmZpZ3MsIHRoaXMgcG9pbnRzIHRvIHRoZSBCWVBBU1MgdmlydHVhbCBhZGRyZXNzCisgKiAgb2Ygc3lzdGVtIFJBTSwgaWUuIGlzIHRoZSBzYW1lIGFzIFhTSEFMX1JBTV8qIGV4Y2VwdCB0aGF0IHZpcnR1YWwKKyAqICBhZGRyZXNzZXMgYXJlIHZpZXdlZCB0aHJvdWdoIHRoZSBCWVBBU1Mgc3RhdGljIG1hcCByYXRoZXIgdGhhbgorICogIHRoZSBDQUNIRUQgc3RhdGljIG1hcC4KKyAqLworI2RlZmluZSBYU0hBTF9SQU1fQllQQVNTX1ZBRERSCQkweEQ4MDAwMDAwCisjZGVmaW5lIFhTSEFMX1JBTV9CWVBBU1NfUEFERFIJCTB4MDAwMDAwMDAKKyNkZWZpbmUgWFNIQUxfUkFNX0JZUEFTU19QU0laRQkJMHgwODAwMDAwMAorCisvKiAgQWx0ZXJuYXRlIHN5c3RlbSBSQU0gKGRpZmZlcmVudCBkZXZpY2UgdGhhbiBzeXN0ZW0gUkFNKTogICovCisjZGVmaW5lIFhTSEFMX0FMVFJBTV9WQUREUgkJMHhDRUUwMDAwMAorI2RlZmluZSBYU0hBTF9BTFRSQU1fUEFERFIJCTB4QzAwMDAwMDAKKyNkZWZpbmUgWFNIQUxfQUxUUkFNX1NJWkUJCTB4MDAyMDAwMDAKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCQkJREVWSUNFLUFERFJFU1MgREVQRU5ERU5ULi4uCisgKgorICogIFZhbHVlcyB3cml0dGVuIHRvIENBQ0hFQVRUUiBzcGVjaWFsIHJlZ2lzdGVyIChvciBpdHMgZXF1aXZhbGVudCkKKyAqICB0byBlbmFibGUgYW5kIGRpc2FibGUgY2FjaGVzIGluIHZhcmlvdXMgbW9kZXMuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUJBQ0tXQVJEIENPTVBBVElCSUxJVFkgLi4uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogIE5PVEU6ICB0aGUgZm9sbG93aW5nIHR3byBtYWNyb3MgYXJlIERFUFJFQ0FURUQuICBVc2UgdGhlIGxhdHRlcgorICogIGJvYXJkLXNwZWNpZmljIG1hY3JvcyBpbnN0ZWFkLCB3aGljaCBhcmUgc3BlY2lhbGx5IHR1bmVkIGZvciB0aGUKKyAqICBwYXJ0aWN1bGFyIHRhcmdldCBlbnZpcm9ubWVudHMnIG1lbW9yeSBtYXBzLgorICovCisjZGVmaW5lIFhTSEFMX0NBQ0hFQVRUUl9CWVBBU1MJCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfQllQQVNTCS8qIGRpc2FibGUgY2FjaGVzIGluIGJ5cGFzcyBtb2RlICovCisjZGVmaW5lIFhTSEFMX0NBQ0hFQVRUUl9ERUZBVUxUCQlYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX0RFRkFVTFQJLyogZGVmYXVsdCBzZXR0aW5nIHRvIGVuYWJsZSBjYWNoZXMgKG5vIHdyaXRlYmFjayEpICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSVNTIChJbnN0cnVjdGlvbiBTZXQgU2ltdWxhdG9yKSBTUEVDSUZJQyAuLi4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWFNIQUxfSVNTX0NBQ0hFQVRUUl9XUklURUJBQ0sJMHgxMTIyMjIyRgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLWJhY2sgbW9kZSAqLworI2RlZmluZSBYU0hBTF9JU1NfQ0FDSEVBVFRSX1dSSVRFQUxMT0MJMHgxMTIyMjIyRgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLWFsbG9jYXRlIG1vZGUgKi8KKyNkZWZpbmUgWFNIQUxfSVNTX0NBQ0hFQVRUUl9XUklURVRIUlUJMHgxMTIyMjIyRgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLXRocm91Z2ggbW9kZSAqLworI2RlZmluZSBYU0hBTF9JU1NfQ0FDSEVBVFRSX0JZUEFTUwkweDIyMjIyMjJGCS8qIGRpc2FibGUgY2FjaGVzIGluIGJ5cGFzcyBtb2RlICovCisjZGVmaW5lIFhTSEFMX0lTU19DQUNIRUFUVFJfREVGQVVMVAlYU0hBTF9JU1NfQ0FDSEVBVFRSX1dSSVRFQkFDSwkvKiBkZWZhdWx0IHNldHRpbmcgdG8gZW5hYmxlIGNhY2hlcyAqLworCisvKiAgRm9yIENvd2FyZSBvbmx5OiAgKi8KKyNkZWZpbmUgWFNIQUxfQ09XQVJFX0NBQ0hFQVRUUl9XUklURUJBQ0sJMHgxMTIyMjIyMgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLWJhY2sgbW9kZSAqLworI2RlZmluZSBYU0hBTF9DT1dBUkVfQ0FDSEVBVFRSX1dSSVRFQUxMT0MJMHgxMTIyMjIyMgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLWFsbG9jYXRlIG1vZGUgKi8KKyNkZWZpbmUgWFNIQUxfQ09XQVJFX0NBQ0hFQVRUUl9XUklURVRIUlUJMHgxMTIyMjIyMgkvKiBlbmFibGUgY2FjaGVzIGluIHdyaXRlLXRocm91Z2ggbW9kZSAqLworI2RlZmluZSBYU0hBTF9DT1dBUkVfQ0FDSEVBVFRSX0JZUEFTUwkJMHgyMjIyMjIyMgkvKiBkaXNhYmxlIGNhY2hlcyBpbiBieXBhc3MgbW9kZSAqLworI2RlZmluZSBYU0hBTF9DT1dBUkVfQ0FDSEVBVFRSX0RFRkFVTFQJCVhTSEFMX0NPV0FSRV9DQUNIRUFUVFJfV1JJVEVCQUNLCS8qIGRlZmF1bHQgc2V0dGluZyB0byBlbmFibGUgY2FjaGVzICovCisKKy8qICBGb3IgQkZNIGFuZCBvdGhlciBwdXJwb3NlczogICovCisjZGVmaW5lIFhTSEFMX0FMTFZBTElEX0NBQ0hFQVRUUl9XUklURUJBQ0sJMHgxMTIyMjIyMgkvKiBlbmFibGUgY2FjaGVzIHdpdGhvdXQgYW55IGludmFsaWQgcmVnaW9ucyAqLworI2RlZmluZSBYU0hBTF9BTExWQUxJRF9DQUNIRUFUVFJfREVGQVVMVAlYU0hBTF9BTExWQUxJRF9DQUNIRUFUVFJfV1JJVEVCQUNLCS8qIGRlZmF1bHQgc2V0dGluZyBmb3IgY2FjaGVzIHdpdGhvdXQgYW55IGludmFsaWQgcmVnaW9ucyAqLworCisjZGVmaW5lIFhTSEFMX0lTU19QSVBFX1JFR0lPTlMJMAorI2RlZmluZSBYU0hBTF9JU1NfU0RSQU1fUkVHSU9OUwkwCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlYVDIwMDAgQk9BUkQgU1BFQ0lGSUMgLi4uCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfV1JJVEVCQUNLCTB4MjJGRkZGRkYJLyogZW5hYmxlIGNhY2hlcyBpbiB3cml0ZS1iYWNrIG1vZGUgKi8KKyNkZWZpbmUgWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9XUklURUFMTE9DCTB4MjJGRkZGRkYJLyogZW5hYmxlIGNhY2hlcyBpbiB3cml0ZS1hbGxvY2F0ZSBtb2RlICovCisjZGVmaW5lIFhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfV1JJVEVUSFJVCTB4MjJGRkZGRkYJLyogZW5hYmxlIGNhY2hlcyBpbiB3cml0ZS10aHJvdWdoIG1vZGUgKi8KKyNkZWZpbmUgWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9CWVBBU1MJCTB4MjJGRkZGRkYJLyogZGlzYWJsZSBjYWNoZXMgaW4gYnlwYXNzIG1vZGUgKi8KKyNkZWZpbmUgWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9ERUZBVUxUCQlYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX1dSSVRFQkFDSwkvKiBkZWZhdWx0IHNldHRpbmcgdG8gZW5hYmxlIGNhY2hlcyAqLworCisjZGVmaW5lIFhTSEFMX1hUMjAwMF9QSVBFX1JFR0lPTlMJMHgwMDAwMTAwMAkvKiBCdXNJbnQgcGlwZWxpbmUgcmVnaW9ucyAqLworI2RlZmluZSBYU0hBTF9YVDIwMDBfU0RSQU1fUkVHSU9OUwkweDAwMDAwMDA1CS8qIEJ1c0ludCBTRFJBTSByZWdpb25zICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJVkVDVE9SIFNJWkVTCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogIFNpemVzIGFsbG9jYXRlZCB0byB2ZWN0b3JzIGJ5IHRoZSBzeXN0ZW0gKG1lbW9yeSBtYXApIGNvbmZpZ3VyYXRpb24uCisgKiAgVGhlc2Ugc2l6ZXMgYXJlIGNvbnN0cmFpbmVkIGJ5IGNvcmUgY29uZmlndXJhdGlvbiAoZWcuIG9uZSB2ZWN0b3IncworICogIGNvZGUgY2Fubm90IG92ZXJmbG93IGludG8gYW5vdGhlciB2ZWN0b3IpIGJ1dCBhcmUgZGVwZW5kZW50IG9uIHRoZQorICogIHN5c3RlbSBvciBib2FyZCAob3IgTFNQKSBtZW1vcnkgbWFwIGNvbmZpZ3VyYXRpb24uCisgKgorICogIFdoZXRoZXIgb3Igbm90IGVhY2ggdmVjdG9yIGhhcHBlbnMgdG8gYmUgaW4gYSBzeXN0ZW0gUk9NIGlzIGFsc28KKyAqICBhIHN5c3RlbSBjb25maWd1cmF0aW9uIG1hdHRlciwgc29tZXRpbWVzIHVzZWZ1bCwgaW5jbHVkZWQgaGVyZSBhbHNvOgorICovCisjZGVmaW5lIFhTSEFMX1JFU0VUX1ZFQ1RPUl9TSVpFCTB4MDAwMDA0RTAKKyNkZWZpbmUgWFNIQUxfUkVTRVRfVkVDVE9SX0lTUk9NCTEKKyNkZWZpbmUgWFNIQUxfVVNFUl9WRUNUT1JfU0laRQkweDAwMDAwMDFDCisjZGVmaW5lIFhTSEFMX1VTRVJfVkVDVE9SX0lTUk9NCTAKKyNkZWZpbmUgWFNIQUxfUFJPR1JBTUVYQ19WRUNUT1JfU0laRQlYU0hBTF9VU0VSX1ZFQ1RPUl9TSVpFCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFhTSEFMX1VTRVJFWENfVkVDVE9SX1NJWkUJWFNIQUxfVVNFUl9WRUNUT1JfU0laRQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBYU0hBTF9LRVJORUxfVkVDVE9SX1NJWkUJMHgwMDAwMDAxQworI2RlZmluZSBYU0hBTF9LRVJORUxfVkVDVE9SX0lTUk9NCTAKKyNkZWZpbmUgWFNIQUxfU1RBQ0tFREVYQ19WRUNUT1JfU0laRQlYU0hBTF9LRVJORUxfVkVDVE9SX1NJWkUJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgWFNIQUxfS0VSTkVMRVhDX1ZFQ1RPUl9TSVpFCVhTSEFMX0tFUk5FTF9WRUNUT1JfU0laRQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBYU0hBTF9ET1VCTEVFWENfVkVDVE9SX1NJWkUJMHgwMDAwMDBFMAorI2RlZmluZSBYU0hBTF9ET1VCTEVFWENfVkVDVE9SX0lTUk9NCTAKKyNkZWZpbmUgWFNIQUxfV0lORE9XX1ZFQ1RPUlNfU0laRQkweDAwMDAwMTgwCisjZGVmaW5lIFhTSEFMX1dJTkRPV19WRUNUT1JTX0lTUk9NCTAKKyNkZWZpbmUgWFNIQUxfSU5UTEVWRUwyX1ZFQ1RPUl9TSVpFCTB4MDAwMDAwMEMKKyNkZWZpbmUgWFNIQUxfSU5UTEVWRUwyX1ZFQ1RPUl9JU1JPTQkwCisjZGVmaW5lIFhTSEFMX0lOVExFVkVMM19WRUNUT1JfU0laRQkweDAwMDAwMDBDCisjZGVmaW5lIFhTSEFMX0lOVExFVkVMM19WRUNUT1JfSVNST00JMAorI2RlZmluZSBYU0hBTF9JTlRMRVZFTDRfVkVDVE9SX1NJWkUJMHgwMDAwMDAwQworI2RlZmluZSBYU0hBTF9JTlRMRVZFTDRfVkVDVE9SX0lTUk9NCTEKKyNkZWZpbmUgWFNIQUxfREVCVUdfVkVDVE9SX1NJWkUJCVhTSEFMX0lOVExFVkVMNF9WRUNUT1JfU0laRQorI2RlZmluZSBYU0hBTF9ERUJVR19WRUNUT1JfSVNST00JWFNIQUxfSU5UTEVWRUw0X1ZFQ1RPUl9JU1JPTQorCisKKyNlbmRpZiAvKlhURU5TQV9DT05GSUdfU1lTVEVNX0gqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS90aWUuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29uZmlnLWxpbnV4X2JlL3RpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmU1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvbmZpZy1saW51eF9iZS90aWUuaApAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIHh0ZW5zYS9jb25maWcvdGllLmggLS0gSEFMIGRlZmluaXRpb25zIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBDT1JFIGFuZCBUSUUgY29uZmlndXJhdGlvbgorICoKKyAqICBUaGlzIGhlYWRlciBmaWxlIGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyB0aGUgImNvbXBpbGUtdGltZSBIQUwiIG9yIENIQUwuCisgKiAgSXQgd2FzIGdlbmVyYXRlZCBmb3IgYSBzcGVjaWZpYyBYdGVuc2EgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24sCisgKiAgYW5kIGZ1cnRoZXJtb3JlIGZvciBhIHNwZWNpZmljIHNldCBvZiBUSUUgc291cmNlIGZpbGVzIHRoYXQgZXh0ZW5kCisgKiAgYmFzaWMgY29yZSBmdW5jdGlvbmFsaXR5LgorICoKKyAqICBTb3VyY2UgZm9yIGNvbmZpZ3VyYXRpb24taW5kZXBlbmRlbnQgYmluYXJpZXMgKHdoaWNoIGxpbmsgaW4gYQorICogIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMgSEFMIGxpYnJhcnkpIG11c3QgTkVWRVIgaW5jbHVkZSB0aGlzIGZpbGUuCisgKiAgSXQgaXMgcGVyZmVjdGx5IG5vcm1hbCwgaG93ZXZlciwgZm9yIHRoZSBIQUwgc291cmNlIGl0c2VsZiB0byBpbmNsdWRlIHRoaXMgZmlsZS4KKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIFRlbnNpbGljYSwgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMi4xIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsCisgKiBVU0EuCisgKi8KKworCisjaWZuZGVmIFhURU5TQV9DT05GSUdfVElFX0gKKyNkZWZpbmUgWFRFTlNBX0NPTkZJR19USUVfSAorCisjaW5jbHVkZSA8eHRlbnNhL2hhbC5oPgorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUdFTkVSQUwKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiAgU2VwYXJhdG9ycyBmb3IgbWFjcm9zIHRoYXQgZXhwYW5kIGludG8gYXJyYXlzLgorICogIFRoZXNlIGNhbiBiZSBwcmVkZWZpbmVkIGJ5IGZpbGVzIHRoYXQgI2luY2x1ZGUgdGhpcyBvbmUsCisgKiAgd2hlbiBkaWZmZXJlbnQgc2VwYXJhdG9ycyBhcmUgcmVxdWlyZWQuCisgKi8KKy8qICBFbGVtZW50IHNlcGFyYXRvciBmb3IgbWFjcm9zIHRoYXQgZXhwYW5kIGludG8gMS1kaW1lbnNpb25hbCBhcnJheXM6ICAqLworI2lmbmRlZiBYQ0hBTF9TRVAKKyNkZWZpbmUgWENIQUxfU0VQCQkJLAorI2VuZGlmCisvKiAgQXJyYXkgc2VwYXJhdG9yIGZvciBtYWNyb3MgdGhhdCBleHBhbmQgaW50byAyLWRpbWVuc2lvbmFsIGFycmF5czogICovCisjaWZuZGVmIFhDSEFMX1NFUDIKKyNkZWZpbmUgWENIQUxfU0VQMgkJCX0seworI2VuZGlmCisKKworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCUNPUFJPQ0VTU09SUyBhbmQgRVhUUkEgU1RBVEUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgWENIQUxfQ1BfTlVNCQkJMAkvKiBudW1iZXIgb2YgY29wcm9jZXNzb3JzICovCisjZGVmaW5lIFhDSEFMX0NQX01BWAkJCTAJLyogbWF4IGNvcHJvY2Vzc29yIGlkIHBsdXMgb25lICgwIGlmIG5vbmUpICovCisjZGVmaW5lIFhDSEFMX0NQX01BU0sJCQkweDAwCS8qIGJpdG1hc2sgb2YgY29wcm9jZXNzb3JzIGJ5IGlkICovCisKKy8qICBTcGFjZSBmb3IgY29wcm9jZXNzb3JzJyBzdGF0ZSBzYXZlIGFyZWFzOiAgKi8KKyNkZWZpbmUgWENIQUxfQ1AwX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1AzX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A2X1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX1NJWkUJCTAKKy8qICBNaW5pbXVtIHJlcXVpcmVkIGFsaWdubWVudHMgb2YgQ1Agc3RhdGUgc2F2ZSBhcmVhczogICovCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDFfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQM19TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDRfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDdfU0FfQUxJR04JCTEKKworLyogIEluZGV4aW5nIG1hY3JvczogICovCisjZGVmaW5lIF9YQ0hBTF9DUF9TQV9TSVpFKG4pCQlYQ0hBTF9DUCAjIyBuICMjIF9TQV9TSVpFCisjZGVmaW5lIFhDSEFMX0NQX1NBX1NJWkUobikJCV9YQ0hBTF9DUF9TQV9TSVpFKG4pCS8qIG4gPSAwIC4uIDcgKi8KKyNkZWZpbmUgX1hDSEFMX0NQX1NBX0FMSUdOKG4pCQlYQ0hBTF9DUCAjIyBuICMjIF9TQV9BTElHTgorI2RlZmluZSBYQ0hBTF9DUF9TQV9BTElHTihuKQkJX1hDSEFMX0NQX1NBX0FMSUdOKG4pCS8qIG4gPSAwIC4uIDcgKi8KKworCisvKiAgU3BhY2UgZm9yICJleHRyYSIgc3RhdGUgKHVzZXIgc3BlY2lhbCByZWdpc3RlcnMgYW5kIG5vbi1jcCBUSUUpIHNhdmUgYXJlYTogICovCisjZGVmaW5lIFhDSEFMX0VYVFJBX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfRVhUUkFfU0FfQUxJR04JCTEKKworLyogIFRvdGFsIHNhdmUgYXJlYSBzaXplIChleHRyYSArIGFsbCBjb3Byb2Nlc3NvcnMpICAqLworLyogIChub3QgdXNlZnVsIHVudGlsIHh0aGFsX3tzYXZlLHJlc3RvcmV9X2FsbF9leHRyYSgpIGlzIGltcGxlbWVudGVkLCAgKi8KKy8qICAgYnV0IGluY2x1ZGVkIGZvciBUb3IyIGJldGE7IGRvZXNuJ3QgYWNjb3VudCBmb3IgYWxpZ25tZW50ISk6ICAqLworI2RlZmluZSBYQ0hBTF9DUEVYVFJBX1NBX1NJWkVfVE9SMgkwCS8qIFRvcjJCZXRhIHRlbXBvcmFyeSBkZWZpbml0aW9uIC0tIGRvIG5vdCB1c2UgKi8KKworLyogIENvbWJpbmVkIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgYWxsIENQIGFuZCBFWFRSQSBzdGF0ZSBzYXZlIGFyZWFzICAqLworLyogIChkb2VzIG5vdCBpbmNsdWRlIHJlcXVpcmVkIGFsaWdubWVudCBmb3IgYW55IGJhc2UgY29uZmlnIHJlZ2lzdGVycyk6ICAqLworI2RlZmluZSBYQ0hBTF9DUEVYVFJBX1NBX0FMSUdOCQkxCisKKy8qIC4uLiAqLworCisKKyNpZmRlZiBfQVNNTEFOR1VBR0UKKy8qCisgKiAgQXNzZW1ibHktbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMgKGFzc2VtYmx5IG1hY3JvcywgZXRjLikuCisgKi8KKyNpbmNsdWRlIDx4dGVuc2EvY29uZmlnL3NwZWNyZWcuaD4KKworLyoqKioqKioqKioqKioqKioqKioqCisgKiAgTWFjcm9zIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIG5vbi1jb3Byb2Nlc3NvciBUSUUgcG9ydGlvbiBvZiBFWFRSQSBzdGF0ZS4KKyAqLworCisvKiAobm9uZSkgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioKKyAqICBNYWNyb3MgdG8gY3JlYXRlIGZ1bmN0aW9ucyB0aGF0IHNhdmUgYW5kIHJlc3RvcmUgYWxsIEVYVFJBIChub24tY29wcm9jZXNzb3IpIHN0YXRlCisgKiAgKGRvZXMgbm90IGluY2x1ZGUgemVyby1vdmVyaGVhZCBsb29wIHJlZ2lzdGVycyBhbmQgbm9uLW9wdGlvbmFsIHJlZ2lzdGVycykuCisgKi8KKworCS8qCisJICogIE1hY3JvIHRoYXQgZXhwYW5kcyB0byB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIHRoYXQKKwkgKiAgc3RvcmVzIHRoZSBleHRyYSAobm9uLWNvcHJvY2Vzc29yKSBvcHRpb25hbC9jdXN0b20gc3RhdGUuCisJICoJRW50cnk6CWEyID0gcHRyIHRvIHNhdmUgYXJlYSBpbiB3aGljaCB0byBzYXZlIGV4dHJhIHN0YXRlCisJICoJRXhpdDoJYW55IHJlZ2lzdGVyIGEyLWExNSAoPykgbWF5IGhhdmUgYmVlbiBjbG9iYmVyZWQuCisJICovCisJLm1hY3JvCXhjaGFsX2V4dHJhX3N0b3JlX2Z1bmNib2R5CisJLmVuZG0KKworCisJLyoKKwkgKiAgTWFjcm8gdGhhdCBleHBhbmRzIHRvIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gdGhhdAorCSAqICBsb2FkcyB0aGUgZXh0cmEgKG5vbi1jb3Byb2Nlc3Nvcikgb3B0aW9uYWwvY3VzdG9tIHN0YXRlLgorCSAqCUVudHJ5OglhMiA9IHB0ciB0byBzYXZlIGFyZWEgZnJvbSB3aGljaCB0byByZXN0b3JlIGV4dHJhIHN0YXRlCisJICoJRXhpdDoJYW55IHJlZ2lzdGVyIGEyLWExNSAoPykgbWF5IGhhdmUgYmVlbiBjbG9iYmVyZWQuCisJICovCisJLm1hY3JvCXhjaGFsX2V4dHJhX2xvYWRfZnVuY2JvZHkKKwkuZW5kbQorCisKKy8qKioqKioqKioqKioqKioqKioqKgorICogIE1hY3JvcyB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiBlYWNoIFRJRSBjb3Byb2Nlc3Nvci4KKyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqCisgKiAgTWFjcm9zIHRvIGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBzYXZlIGFuZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiAqYW55KiBUSUUgY29wcm9jZXNzb3IuCisgKi8KKworCS8qCisJICogIE1hY3JvIHRoYXQgZXhwYW5kcyB0byB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uCisJICogIHRoYXQgc3RvcmVzIHRoZSBzZWxlY3RlZCBjb3Byb2Nlc3NvcidzIHN0YXRlIChyZWdpc3RlcnMgZXRjKS4KKwkgKglFbnRyeToJYTIgPSBwdHIgdG8gc2F2ZSBhcmVhIGluIHdoaWNoIHRvIHNhdmUgY3Agc3RhdGUKKwkgKgkJYTMgPSBjb3Byb2Nlc3NvciBudW1iZXIKKwkgKglFeGl0OglhbnkgcmVnaXN0ZXIgYTItYTE1ICg/KSBtYXkgaGF2ZSBiZWVuIGNsb2JiZXJlZC4KKwkgKi8KKwkubWFjcm8JeGNoYWxfY3BpX3N0b3JlX2Z1bmNib2R5CisJLmVuZG0KKworCisJLyoKKwkgKiAgTWFjcm8gdGhhdCBleHBhbmRzIHRvIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24KKwkgKiAgdGhhdCBsb2FkcyB0aGUgc2VsZWN0ZWQgY29wcm9jZXNzb3IncyBzdGF0ZSAocmVnaXN0ZXJzIGV0YykuCisJICoJRW50cnk6CWEyID0gcHRyIHRvIHNhdmUgYXJlYSBmcm9tIHdoaWNoIHRvIHJlc3RvcmUgY3Agc3RhdGUKKwkgKgkJYTMgPSBjb3Byb2Nlc3NvciBudW1iZXIKKwkgKglFeGl0OglhbnkgcmVnaXN0ZXIgYTItYTE1ICg/KSBtYXkgaGF2ZSBiZWVuIGNsb2JiZXJlZC4KKwkgKi8KKwkubWFjcm8JeGNoYWxfY3BpX2xvYWRfZnVuY2JvZHkKKwkuZW5kbQorCisjZW5kaWYgLypfQVNNTEFOR1VBR0UqLworCisKKy8qCisgKiAgQ29udGVudHMgb2Ygc2F2ZSBhcmVhcyBpbiB0ZXJtcyBvZiBsaWJkYiByZWdpc3RlciBudW1iZXJzLgorICogIE5PVEU6ICBDT05URU5UU19MSUJEQl97VVJFRyxSRUdGfSBtYWNyb3MgYXJlIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZTsKKyAqICBpdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIGhlYWRlciBmaWxlIHRvIGRlZmluZSB0aGVzZSBtYWNyb3MKKyAqICB1c2VmdWxseSBiZWZvcmUgZWFjaCBleHBhbnNpb24gb2YgdGhlIENPTlRFTlRTX0xJQkRCIG1hY3Jvcy4KKyAqICAoRmllbGRzIHJzdlsxMjNdIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIGFkZGl0aW9uczsgdGhleSBhcmUgY3VycmVudGx5CisgKiAgIHNldCB0byB6ZXJvIGJ1dCBtYXkgYmUgc2V0IHRvIHNvbWUgdXNlZnVsIHZhbHVlcyBpbiB0aGUgZnV0dXJlLikKKyAqCisgKglDT05URU5UU19MSUJEQl9TUkVHKGxpYmRibnVtLCBvZmZzZXQsIHNpemUsIGFsaWduLCByc3YxLCBuYW1lLCBzcmVnbnVtLCBiaXRtYXNrLCByc3YyLCByc3YzKQorICoJQ09OVEVOVFNfTElCREJfVVJFRyhsaWJkYm51bSwgb2Zmc2V0LCBzaXplLCBhbGlnbiwgcnN2MSwgbmFtZSwgdXJlZ251bSwgYml0bWFzaywgcnN2MiwgcnN2MykKKyAqCUNPTlRFTlRTX0xJQkRCX1JFR0YobGliZGJudW0sIG9mZnNldCwgc2l6ZSwgYWxpZ24sIHJzdjEsIG5hbWUsIGluZGV4LCBudW1lbnRyaWVzLCBjb250ZW50c2l6ZSwgcmVnbmFtZV9iYXNlLCByZWdmaWxlX25hbWUsIHJzdjIsIHJzdjMpCisgKi8KKworI2RlZmluZSBYQ0hBTF9FWFRSQV9TQV9DT05URU5UU19MSUJEQl9OVU0JMAorI2RlZmluZSBYQ0hBTF9FWFRSQV9TQV9DT05URU5UU19MSUJEQgkvKiBlbXB0eSAqLworCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9DT05URU5UU19MSUJEQl9OVU0JMAorI2RlZmluZSBYQ0hBTF9DUDBfU0FfQ09OVEVOVFNfTElCREIJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDFfU0FfQ09OVEVOVFNfTElCREJfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX0NPTlRFTlRTX0xJQkRCCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX0NPTlRFTlRTX0xJQkRCX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQMl9TQV9DT05URU5UU19MSUJEQgkvKiBlbXB0eSAqLworCisjZGVmaW5lIFhDSEFMX0NQM19TQV9DT05URU5UU19MSUJEQl9OVU0JMAorI2RlZmluZSBYQ0hBTF9DUDNfU0FfQ09OVEVOVFNfTElCREIJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDRfU0FfQ09OVEVOVFNfTElCREJfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX0NPTlRFTlRTX0xJQkRCCS8qIGVtcHR5ICovCisKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX0NPTlRFTlRTX0xJQkRCX05VTQkwCisjZGVmaW5lIFhDSEFMX0NQNV9TQV9DT05URU5UU19MSUJEQgkvKiBlbXB0eSAqLworCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9DT05URU5UU19MSUJEQl9OVU0JMAorI2RlZmluZSBYQ0hBTF9DUDZfU0FfQ09OVEVOVFNfTElCREIJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDdfU0FfQ09OVEVOVFNfTElCREJfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX0NPTlRFTlRTX0xJQkRCCS8qIGVtcHR5ICovCisKKworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJCQlNSVNDCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgMAkvKiBpcyB0aGVyZSBzb21ldGhpbmcgZXF1aXZhbGVudCBmb3IgdXNlciBUSUU/ICovCisjZGVmaW5lIFhDSEFMX0NPUkVfSUQJCQkibGludXhfYmUiCS8qIGNvbmZpZ3VyYXRpb24ncyBhbHBoYW51bWVyaWMgY29yZSBpZGVudGlmaWVyCisJCQkJCQkJICAgKENvcmVJRCkgc2V0IGluIHRoZSBYdGVuc2EgUHJvY2Vzc29yIEdlbmVyYXRvciAqLworCisjZGVmaW5lIFhDSEFMX0JVSUxEX1VOSVFVRV9JRAkJMHgwMDAwMzI1NgkvKiBzb2Z0d2FyZSBidWlsZC11bmlxdWUgSUQgKDIyLWJpdCkgKi8KKworLyogIFRoZXNlIGRlZmluaXRpb25zIGRlc2NyaWJlIHRoZSBoYXJkd2FyZSB0YXJnZXRlZCBieSB0aGlzIHNvZnR3YXJlOiAgKi8KKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQwCQkweEMxMDNEMUZGCS8qIGNvbmZpZyBJRCByZWcgMCB2YWx1ZSAodXBwZXIgMzIgb2YgNjQgYml0cykgKi8KKyNkZWZpbmUgWENIQUxfSFdfQ09ORklHSUQxCQkweDAwODAzMjU2CS8qIGNvbmZpZyBJRCByZWcgMSB2YWx1ZSAobG93ZXIgMzIgb2YgNjQgYml0cykgKi8KKyNkZWZpbmUgWENIQUxfQ09ORklHSUQwCQkJWENIQUxfSFdfQ09ORklHSUQwCS8qIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkgLS0gZG9uJ3QgdXNlISAqLworI2RlZmluZSBYQ0hBTF9DT05GSUdJRDEJCQlYQ0hBTF9IV19DT05GSUdJRDEJLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seSAtLSBkb24ndCB1c2UhICovCisjZGVmaW5lIFhDSEFMX0hXX1JFTEVBU0VfTUFKT1IJCTEwNTAJLyogbWFqb3IgcmVsZWFzZSBvZiB0YXJnZXRlZCBoYXJkd2FyZSAqLworI2RlZmluZSBYQ0hBTF9IV19SRUxFQVNFX01JTk9SCQkxCS8qIG1pbm9yIHJlbGVhc2Ugb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KKyNkZWZpbmUgWENIQUxfSFdfUkVMRUFTRV9OQU1FCQkiVDEwNTAuMSIJLyogZnVsbCByZWxlYXNlIG5hbWUgb2YgdGFyZ2V0ZWQgaGFyZHdhcmUgKi8KKyNkZWZpbmUgWFRIQUxfSFdfUkVMX1QxMDUwCTEKKyNkZWZpbmUgWFRIQUxfSFdfUkVMX1QxMDUwXzEJMQorI2RlZmluZSBYQ0hBTF9IV19DT05GSUdJRF9SRUxJQUJMRQkxCisjZW5kaWYgLyowKi8KKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCUlTQQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIDAJLyogdGhlc2UgcHJvYmFibHkgZG9uJ3QgYmVsb25nIGhlcmUsIGJ1dCBhcmUgcmVsYXRlZCB0byBvciBpbXBsZW1lbnRlZCB1c2luZyBUSUUgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9CT09MRUFOUwkJMAkvKiAxIGlmIGJvb2xlYW5zIG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworLyogIE1pc2MgaW5zdHJ1Y3Rpb25zOiAgKi8KKyNkZWZpbmUgWENIQUxfSEFWRV9NVUwzMgkJMAkvKiAxIGlmIDMyLWJpdCBpbnRlZ2VyIG11bHRpcGx5IG9wdGlvbiBjb25maWd1cmVkLCAwIG90aGVyd2lzZSAqLworI2RlZmluZSBYQ0hBTF9IQVZFX01VTDMyX0hJR0gJCTAJLyogMSBpZiBNVUwzMiBvcHRpb24gaW5jbHVkZXMgTVVMVUggYW5kIE1VTFNILCAwIG90aGVyd2lzZSAqLworCisjZGVmaW5lIFhDSEFMX0hBVkVfRlAJCQkwCS8qIDEgaWYgZmxvYXRpbmcgcG9pbnQgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgb3RoZXJ3aXNlICovCisjZW5kaWYgLyowKi8KKworCisjZW5kaWYgLypYVEVOU0FfQ09ORklHX1RJRV9IKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb3JlYXNtLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvcmVhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNmYjU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb3JlYXNtLmgKQEAgLTAsMCArMSw1MjYgQEAKKyNpZm5kZWYgWFRFTlNBX0NPUkVBU01fSAorI2RlZmluZSBYVEVOU0FfQ09SRUFTTV9ICisKKy8qCisgKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAorICoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvY29yZWFzbS5oIC0tIGFzc2VtYmxlci1zcGVjaWZpYworICogZGVmaW5pdGlvbnMgdGhhdCBkZXBlbmQgb24gQ09SRSBjb25maWd1cmF0aW9uLgorICoKKyAqIFNvdXJjZSBmb3IgY29uZmlndXJhdGlvbi1pbmRlcGVuZGVudCBiaW5hcmllcyAod2hpY2ggbGluayBpbiBhCisgKiBjb25maWd1cmF0aW9uLXNwZWNpZmljIEhBTCBsaWJyYXJ5KSBtdXN0IE5FVkVSIGluY2x1ZGUgdGhpcyBmaWxlLgorICogSXQgaXMgcGVyZmVjdGx5IG5vcm1hbCwgaG93ZXZlciwgZm9yIHRoZSBIQUwgaXRzZWxmIHRvIGluY2x1ZGUgdGhpcworICogZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgbXVzdCBOT1QgaW5jbHVkZSB4dGVuc2EvY29uZmlnL3N5c3RlbS5oLiAgQW55IGFzc2VtYmxlcgorICogaGVhZGVyIGZpbGUgdGhhdCBkZXBlbmRzIG9uIHN5c3RlbSBpbmZvcm1hdGlvbiBzaG91bGQgbGlrZWx5IGdvIGluCisgKiBhIG5ldyBzeXN0ZW1hc20uaCAob3Igc3lzYXNtLmgpIGhlYWRlciBmaWxlLgorICoKKyAqICBOT1RFOiBtYWNybyBiZXFpMzIgaXMgTk9UIGNvbmZpZ3VyYXRpb24tZGVwZW5kZW50LCBhbmQgaXMgcGxhY2VkCisgKiAgICAgICAgaGVyZSB0aWwgd2Ugd2lsbCBoYXZlIGNvbmZpZ3VyYXRpb24taW5kZXBlbmRlbnQgaGVhZGVyIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworCisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zcGVjcmVnLmg+CisKKy8qCisgKiAgQXNzZW1ibHktbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMgKGFzc2VtYmx5IG1hY3JvcywgZXRjLikuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgZmluZF9tc19zZXRiaXQKKyAqCisgKiAgVGhpcyBtYWNybyBmaW5kcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgaW4gPGFzPgorICogIGFuZCByZXR1cm4gaXRzIGluZGV4ICsgPGJhc2U+IGluIDxhZD4sIG9yIDxiYXNlPiAtIDEgaWYgPGFzPiBpcyB6ZXJvLgorICogIFRoZSBpbmRleCBjb3VudHMgc3RhcnRpbmcgYXQgemVybyBmb3IgdGhlIGxzYml0LCBzbyB0aGUgcmV0dXJuCisgKiAgdmFsdWUgcmFuZ2VzIGZyb20gPGJhc2U+LTEgKG5vIGJpdCBzZXQpIHRvIDxiYXNlPiszMSAobXNiaXQgc2V0KS4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqCTxhZD4JZGVzdGluYXRpb24gYWRkcmVzcyByZWdpc3RlciAoYW55IHJlZ2lzdGVyKQorICoJPGFzPglzb3VyY2UgYWRkcmVzcyByZWdpc3RlcgorICoJPGF0Pgl0ZW1wb3JhcnkgYWRkcmVzcyByZWdpc3RlciAobXVzdCBiZSBkaWZmZXJlbnQgdGhhbiA8YXM+KQorICoJPGJhc2U+CWNvbnN0YW50IHZhbHVlIGFkZGVkIHRvIHJlc3VsdCAodXN1YWxseSAwIG9yIDEpCisgKiAgT24gZW50cnk6CisgKgk8YWQ+ID0gdW5kZWZpbmVkIGlmIGRpZmZlcmVudCB0aGFuIDxhcz4KKyAqCTxhcz4gPSB2YWx1ZSB3aG9zZSBtb3N0IHNpZ25pZmljYW50IHNldCBiaXQgaXMgdG8gYmUgZm91bmQKKyAqCTxhdD4gPSB1bmRlZmluZWQKKyAqCW5vIG90aGVyIHJlZ2lzdGVycyBhcmUgdXNlZCBieSB0aGlzIG1hY3JvLgorICogIE9uIGV4aXQ6CisgKgk8YWQ+ID0gPGJhc2U+ICsgaW5kZXggb2YgbXNiaXQgc2V0IGluIG9yaWdpbmFsIDxhcz4sCisgKgkgICAgID0gPGJhc2U+IC0gMSBpZiBvcmlnaW5hbCA8YXM+IHdhcyB6ZXJvLgorICoJPGFzPiBjbG9iYmVyZWQgKGlmIG5vdCA8YWQ+KQorICoJPGF0PiBjbG9iYmVyZWQgKGlmIG5vdCA8YWQ+KQorICogIEV4YW1wbGU6CisgKglmaW5kX21zX3NldGJpdCBhMCwgYTQsIGEwLCAwCQktLSByZXR1cm4gaW4gYTAgaW5kZXggb2YgbXNiaXQgc2V0IGluIGE0CisgKi8KKworCS5tYWNybwlmaW5kX21zX3NldGJpdCBhZCwgYXMsIGF0LCBiYXNlCisjaWYgWENIQUxfSEFWRV9OU0EKKwltb3ZpCVxhdCwgMzErXGJhc2UKKwluc2F1CVxhcywgXGFzCS8vIGdldCBpbmRleCBvZiBcYXMsIG51bWJlcmVkIGZyb20gbXNiaXQgKDMyIGlmIGFic2VudCkKKwlzdWIJXGFkLCBcYXQsIFxhcwkvLyBnZXQgbnVtYmVyaW5nIGZyb20gbHNiaXQgKDAuLjMxLCAtMSBpZiBhYnNlbnQpCisjZWxzZSAvKiBYQ0hBTF9IQVZFX05TQSAqLworCW1vdmkJXGF0LCBcYmFzZQkvLyBzdGFydCB3aXRoIHJlc3VsdCBvZiAwIChwb2ludCB0byBsc2JpdCBvZiAzMikKKworCWJlcXoJXGFzLCAyZgkJLy8gc3BlY2lhbCBjYXNlIGZvciB6ZXJvIGFyZ3VtZW50OiByZXR1cm4gLTEKKwlibHR1aQlcYXMsIDB4MTAwMDAsIDFmCS8vIGlzIGl0IG9uZSBvZiB0aGUgMTYgbHNiaXRzPyAoaWYgc28sIGNoZWNrIGxvd2VyIDE2IGJpdHMpCisJYWRkaQlcYXQsIFxhdCwgMTYJLy8gbm8sIGluY3JlbWVudCByZXN1bHQgdG8gdXBwZXIgMTYgYml0cyAob2YgMzIpCisJLy9zcmxpCVxhcywgXGFzLCAxNgkvLyBjaGVjayB1cHBlciBoYWxmIChzaGlmdCByaWdodCAxNiBiaXRzKQorCWV4dHVpCVxhcywgXGFzLCAxNiwgMTYJLy8gY2hlY2sgdXBwZXIgaGFsZiAoc2hpZnQgcmlnaHQgMTYgYml0cykKKzE6CWJsdHVpCVxhcywgMHgxMDAsIDFmCS8vIGlzIGl0IG9uZSBvZiB0aGUgOCBsc2JpdHM/IChpZiBzbywgY2hlY2sgbG93ZXIgOCBiaXRzKQorCWFkZGkJXGF0LCBcYXQsIDgJLy8gbm8sIGluY3JlbWVudCByZXN1bHQgdG8gdXBwZXIgOCBiaXRzIChvZiAxNikKKwlzcmxpCVxhcywgXGFzLCA4CS8vIHNoaWZ0IHJpZ2h0IHRvIGNoZWNrIHVwcGVyIDggYml0cworMToJYmx0dWkJXGFzLCAweDEwLCAxZgkvLyBpcyBpdCBvbmUgb2YgdGhlIDQgbHNiaXRzPyAoaWYgc28sIGNoZWNrIGxvd2VyIDQgYml0cykKKwlhZGRpCVxhdCwgXGF0LCA0CS8vIG5vLCBpbmNyZW1lbnQgcmVzdWx0IHRvIHVwcGVyIDQgYml0cyAob2YgOCkKKwlzcmxpCVxhcywgXGFzLCA0CS8vIHNoaWZ0IHJpZ2h0IDQgYml0cyB0byBjaGVjayB1cHBlciBoYWxmCisxOglibHR1aQlcYXMsIDB4NCwgMWYJLy8gaXMgaXQgb25lIG9mIHRoZSAyIGxzYml0cz8gKGlmIHNvLCBjaGVjayBsb3dlciAyIGJpdHMpCisJYWRkaQlcYXQsIFxhdCwgMgkvLyBubywgaW5jcmVtZW50IHJlc3VsdCB0byB1cHBlciAyIGJpdHMgKG9mIDQpCisJc3JsaQlcYXMsIFxhcywgMgkvLyBzaGlmdCByaWdodCAyIGJpdHMgdG8gY2hlY2sgdXBwZXIgaGFsZgorMToJYmx0dWkJXGFzLCAweDIsIDFmCS8vIGlzIGl0IHRoZSBsc2JpdD8KKwlhZGRpCVxhdCwgXGF0LCAyCS8vIG5vLCBpbmNyZW1lbnQgcmVzdWx0IHRvIHVwcGVyIGJpdCAob2YgMikKKzI6CWFkZGkJXGF0LCBcYXQsIC0xCS8vIChmcm9tIGp1c3QgYWJvdmU6IGFkZCAxOyAgZnJvbSBiZXF6OiByZXR1cm4gLTEpCisJLy9zcmxpCVxhcywgXGFzLCAxCisxOgkJCQkvLyBkb25lISBcYXQgY29udGFpbnMgaW5kZXggb2YgbXNiaXQgc2V0IChvciAtMSBpZiBub25lIHNldCkKKwkuaWYJMHhcYWQgLSAweFxhdAkvLyBkZXN0aW5hdGlvbiBkaWZmZXJlbnQgdGhhbiBcYXQgPyAod29ya3MgYmVjYXVzZSByZWdzIGFyZSBhMC1hMTUpCisJbW92CVxhZCwgXGF0CS8vIHRoZW4gbW92ZSByZXN1bHQgdG8gXGFkCisJLmVuZGlmCisjZW5kaWYgLyogWENIQUxfSEFWRV9OU0EgKi8KKwkuZW5kbQkvLyBmaW5kX21zX3NldGJpdAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBmaW5kX2xzX3NldGJpdAorICoKKyAqICBUaGlzIG1hY3JvIGZpbmRzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgaW4gPGFzPiwKKyAqICBhbmQgcmV0dXJuIGl0cyBpbmRleCBpbiA8YWQ+LgorICogIFVzYWdlIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgZmluZF9tc19zZXRiaXQgbWFjcm8uCisgKiAgRXhhbXBsZToKKyAqCWZpbmRfbHNfc2V0Yml0IGEwLCBhNCwgYTAsIDAJLS0gcmV0dXJuIGluIGEwIGluZGV4IG9mIGxzYml0IHNldCBpbiBhNAorICovCisKKwkubWFjcm8JZmluZF9sc19zZXRiaXQgYWQsIGFzLCBhdCwgYmFzZQorCW5lZwlcYXQsIFxhcwkvLyBrZWVwIG9ubHkgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdCB0aGF0IGlzIHNldC4uLgorCWFuZAlcYXMsIFxhdCwgXGFzCS8vIC4uLiBpbiBcYXMKKwlmaW5kX21zX3NldGJpdAlcYWQsIFxhcywgXGF0LCBcYmFzZQorCS5lbmRtCS8vIGZpbmRfbHNfc2V0Yml0CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIGZpbmRfbHNfb25lCisgKgorICogIFNhbWUgYXMgZmluZF9sc19zZXRiaXQgd2l0aCBiYXNlIHplcm8uCisgKiAgU291cmNlIChhcykgYW5kIGRlc3RpbmF0aW9uIChhZCkgcmVnaXN0ZXJzIG11c3QgYmUgZGlmZmVyZW50LgorICogIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICovCisKKwkubWFjcm8JZmluZF9sc19vbmUgYWQsIGFzCisJZmluZF9sc19zZXRiaXQJXGFkLCBcYXMsIFxhZCwgMAorCS5lbmRtCS8vIGZpbmRfbHNfb25lCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIGZsb29wLCBmbG9vcG5leiwgZmxvb3BndHosIGZsb29wZW5kCisgKgorICogIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBmb3IgZmFzdCBpbm5lciBsb29wcyB0aGF0CisgKiAgd29yayB3aGV0aGVyIG9yIG5vdCB0aGUgTG9vcHMgb3B0aW9ucyBpcyBjb25maWd1cmVkLgorICogIElmIHRoZSBMb29wcyBvcHRpb24gaXMgY29uZmlndXJlZCwgdGhleSBzaW1wbHkgdXNlCisgKiAgdGhlIHplcm8tb3ZlcmhlYWQgTE9PUCBpbnN0cnVjdGlvbnM7IG90aGVyd2lzZQorICogIHRoZXkgdXNlIGV4cGxpY2l0IGRlY3JlbWVudCBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4KKyAqCisgKiAgVGhleSBhcmUgdXNlZCBpbiBwYWlycywgd2l0aCBmbG9vcCwgZmxvb3BuZXogb3IgZmxvb3BndHoKKyAqICBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wLCBhbmQgZmxvb3BlbmQgYXQgdGhlIGVuZC4KKyAqCisgKiAgRWFjaCBwYWlyIG9mIGxvb3AgbWFjcm8gY2FsbHMgbXVzdCBiZSBnaXZlbiB0aGUgbG9vcCBjb3VudAorICogIGFkZHJlc3MgcmVnaXN0ZXIgYW5kIGEgdW5pcXVlIGxhYmVsIGZvciB0aGF0IGxvb3AuCisgKgorICogIEV4YW1wbGU6CisgKgorICoJbW92aQkgYTMsIDE2ICAgICAvLyBsb29wIDE2IHRpbWVzCisgKglmbG9vcCAgICBhMywgbXlsb29wMQorICoJOgorICoJYm5leiAgICAgYTcsIGVuZDEJLy8gZXhpdCBsb29wIGlmIGE3ICE9IDAKKyAqCToKKyAqCWZsb29wZW5kIGEzLCBteWxvb3AxCisgKiAgZW5kMToKKyAqCisgKiAgTGlrZSB0aGUgTE9PUCBpbnN0cnVjdGlvbnMsIHRoZXNlIG1hY3JvcyBjYW5ub3QgYmUKKyAqICBuZXN0ZWQsIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgaW5zdHJ1Y3Rpb24sCisgKiAgY2Fubm90IGNhbGwgZnVuY3Rpb25zIGluc2lkZSB0aGUgbG9vcCwgZXRjLgorICogIFRoZSBsb29wIGNhbiBiZSBleGl0ZWQgYnkganVtcGluZyB0byB0aGUgaW5zdHJ1Y3Rpb24KKyAqICBmb2xsb3dpbmcgZmxvb3BlbmQgKG9yIGVsc2V3aGVyZSBvdXRzaWRlIHRoZSBsb29wKSwKKyAqICBvciBjb250aW51ZWQgYnkganVtcGluZyB0byBhIE5PUCBpbnN0cnVjdGlvbiBwbGFjZWQKKyAqICBpbW1lZGlhdGVseSBiZWZvcmUgZmxvb3BlbmQuCisgKgorICogIFVubGlrZSBMT09QIGluc3RydWN0aW9ucywgdGhlIHJlZ2lzdGVyIHBhc3NlZCB0byBmbG9vcCoKKyAqICBjYW5ub3QgYmUgdXNlZCBpbnNpZGUgdGhlIGxvb3AsIGJlY2F1c2UgaXQgaXMgdXNlZCBhcworICogIHRoZSBsb29wIGNvdW50ZXIgaWYgdGhlIExvb3BzIG9wdGlvbiBpcyBub3QgY29uZmlndXJlZC4KKyAqICBBbmQgaXRzIHZhbHVlIGlzIHVuZGVmaW5lZCBhZnRlciBleGl0aW5nIHRoZSBsb29wLgorICogIEFuZCBiZWNhdXNlIHRoZSBsb29wIGNvdW50ZXIgcmVnaXN0ZXIgaXMgYWN0aXZlIGluc2lkZQorICogIHRoZSBsb29wLCB5b3UgY2FuJ3QgZWFzaWx5IHVzZSB0aGlzIGNvbnN0cnVjdCB0byBsb29wCisgKiAgYWNyb3NzIGEgcmVnaXN0ZXIgZmlsZSB1c2luZyBST1RXIGFzIHlvdSBtaWdodCB3aXRoIExPT1AKKyAqICBpbnN0cnVjdGlvbnMsIHVubGVzcyB5b3UgY29weSB0aGUgbG9vcCByZWdpc3RlciBhbG9uZy4KKyAqLworCisJLyogIE5hbWVkIGxhYmVsIHZlcnNpb24gb2YgdGhlIG1hY3JvczogICovCisKKwkubWFjcm8JZmxvb3AJCWFyLCBlbmRsYWJlbAorCWZsb29wXwkJXGFyLCAuTGZsb29wc3RhcnRfXGVuZGxhYmVsLCAuTGZsb29wZW5kX1xlbmRsYWJlbAorCS5lbmRtCisKKwkubWFjcm8JZmxvb3BuZXoJYXIsIGVuZGxhYmVsCisJZmxvb3BuZXpfCVxhciwgLkxmbG9vcHN0YXJ0X1xlbmRsYWJlbCwgLkxmbG9vcGVuZF9cZW5kbGFiZWwKKwkuZW5kbQorCisJLm1hY3JvCWZsb29wZ3R6CWFyLCBlbmRsYWJlbAorCWZsb29wZ3R6XwlcYXIsIC5MZmxvb3BzdGFydF9cZW5kbGFiZWwsIC5MZmxvb3BlbmRfXGVuZGxhYmVsCisJLmVuZG0KKworCS5tYWNybwlmbG9vcGVuZAlhciwgZW5kbGFiZWwKKwlmbG9vcGVuZF8JXGFyLCAuTGZsb29wc3RhcnRfXGVuZGxhYmVsLCAuTGZsb29wZW5kX1xlbmRsYWJlbAorCS5lbmRtCisKKwkvKiAgTnVtYmVyZWQgbG9jYWwgbGFiZWwgdmVyc2lvbiBvZiB0aGUgbWFjcm9zOiAgKi8KKyNpZiAwIC8qVU5URVNURUQqLworCS5tYWNybwlmbG9vcDg5CQlhcgorCWZsb29wXwkJXGFyLCA4LCA5ZgorCS5lbmRtCisKKwkubWFjcm8JZmxvb3BuZXo4OQlhcgorCWZsb29wbmV6XwlcYXIsIDgsIDlmCisJLmVuZG0KKworCS5tYWNybwlmbG9vcGd0ejg5CWFyCisJZmxvb3BndHpfCVxhciwgOCwgOWYKKwkuZW5kbQorCisJLm1hY3JvCWZsb29wZW5kODkJYXIKKwlmbG9vcGVuZF8JXGFyLCA4YiwgOQorCS5lbmRtCisjZW5kaWYgLyowKi8KKworCS8qICBVbmRlcmx5aW5nIHZlcnNpb24gb2YgdGhlIG1hY3JvczogICovCisKKwkubWFjcm8JZmxvb3BfCWFyLCBzdGFydGxhYmVsLCBlbmRsYWJlbHJlZgorCS5pZmRlZglfaW5mbG9vcF8KKwkuaWYJX2luZmxvb3BfCisJLmVycgkvLyBFcnJvcjogZmxvb3AgY2Fubm90IGJlIG5lc3RlZAorCS5lbmRpZgorCS5lbmRpZgorCS5zZXQJX2luZmxvb3BfLCAxCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3AJXGFyLCBcZW5kbGFiZWxyZWYKKyNlbHNlIC8qIFhDSEFMX0hBVkVfTE9PUFMgKi8KK1xzdGFydGxhYmVsOgorCWFkZGkJXGFyLCBcYXIsIC0xCisjZW5kaWYgLyogWENIQUxfSEFWRV9MT09QUyAqLworCS5lbmRtCS8vIGZsb29wXworCisJLm1hY3JvCWZsb29wbmV6Xwlhciwgc3RhcnRsYWJlbCwgZW5kbGFiZWxyZWYKKwkuaWZkZWYJX2luZmxvb3BfCisJLmlmCV9pbmZsb29wXworCS5lcnIJLy8gRXJyb3I6IGZsb29wbmV6IGNhbm5vdCBiZSBuZXN0ZWQKKwkuZW5kaWYKKwkuZW5kaWYKKwkuc2V0CV9pbmZsb29wXywgMQorI2lmIFhDSEFMX0hBVkVfTE9PUFMKKwlsb29wbmV6CVxhciwgXGVuZGxhYmVscmVmCisjZWxzZSAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCisJYmVxeglcYXIsIFxlbmRsYWJlbHJlZgorXHN0YXJ0bGFiZWw6CisJYWRkaQlcYXIsIFxhciwgLTEKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCisJLmVuZG0JLy8gZmxvb3BuZXpfCisKKwkubWFjcm8JZmxvb3BndHpfCWFyLCBzdGFydGxhYmVsLCBlbmRsYWJlbHJlZgorCS5pZmRlZglfaW5mbG9vcF8KKwkuaWYJX2luZmxvb3BfCisJLmVycgkvLyBFcnJvcjogZmxvb3BndHogY2Fubm90IGJlIG5lc3RlZAorCS5lbmRpZgorCS5lbmRpZgorCS5zZXQJX2luZmxvb3BfLCAxCisjaWYgWENIQUxfSEFWRV9MT09QUworCWxvb3BndHoJXGFyLCBcZW5kbGFiZWxyZWYKKyNlbHNlIC8qIFhDSEFMX0hBVkVfTE9PUFMgKi8KKwlibHR6CVxhciwgXGVuZGxhYmVscmVmCisJYmVxeglcYXIsIFxlbmRsYWJlbHJlZgorXHN0YXJ0bGFiZWw6CisJYWRkaQlcYXIsIFxhciwgLTEKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX0xPT1BTICovCisJLmVuZG0JLy8gZmxvb3BndHpfCisKKworCS5tYWNybwlmbG9vcGVuZF8JYXIsIHN0YXJ0bGFiZWxyZWYsIGVuZGxhYmVsCisJLmlmbmRlZglfaW5mbG9vcF8KKwkuZXJyCS8vIEVycm9yOiBmbG9vcGVuZCB3aXRob3V0IG1hdGNoaW5nIGZsb29wWFhYCisJLmVuZGlmCisJLmlmZXEJX2luZmxvb3BfCisJLmVycgkvLyBFcnJvcjogZmxvb3BlbmQgd2l0aG91dCBtYXRjaGluZyBmbG9vcFhYWAorCS5lbmRpZgorCS5zZXQJX2luZmxvb3BfLCAwCisjaWYgISBYQ0hBTF9IQVZFX0xPT1BTCisJYm5leglcYXIsIFxzdGFydGxhYmVscmVmCisjZW5kaWYgLyogWENIQUxfSEFWRV9MT09QUyAqLworXGVuZGxhYmVsOgorCS5lbmRtCS8vIGZsb29wZW5kXworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBjcnNpbCAgLS0gIGNvbmRpdGlvbmFsIFJTSUwgKHJlYWQvc2V0IGludGVycnVwdCBsZXZlbCkKKyAqCisgKiAgRXhlY3V0ZXMgdGhlIFJTSUwgaW5zdHJ1Y3Rpb24gaWYgaXQgZXhpc3RzLCBlbHNlIGp1c3QgcmVhZHMgUFMuCisgKiAgVGhlIFJTSUwgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIG5ldyBleGNlcHRpb24gYXJjaGl0ZWN0dXJlCisgKiAgaWYgdGhlIGludGVycnVwdCBvcHRpb24gaXMgbm90IHNlbGVjdGVkLgorICovCisKKwkubWFjcm8JY3JzaWwJYXIsIG5ld2xldmVsCisjaWYgWENIQUxfSEFWRV9PTERfRVhDX0FSQ0ggfHwgWENIQUxfSEFWRV9JTlRFUlJVUFRTCisJcnNpbAlcYXIsIFxuZXdsZXZlbAorI2Vsc2UKKwlyc3IJXGFyLCBQUworI2VuZGlmCisJLmVuZG0JLy8gY3JzaWwKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgd2luZG93X3NwaWxsezQsOCwxMn0KKyAqCisgKiAgVGhlc2UgbWFjcm9zIHNwaWxsIGNhbGxlcnMnIHJlZ2lzdGVyIHdpbmRvd3MgdG8gdGhlIHN0YWNrLgorICogIFRoZXkgd29yayBmb3IgYm90aCBwcml2aWxlZ2VkIGFuZCBub24tcHJpdmlsZWdlZCB0YXNrcy4KKyAqICBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgd2luZG93ZWQgQUJJIGNvbnRleHQsIGVnLiB3aXRoaW4KKyAqICBhIHdpbmRvd2VkIEFCSSBmdW5jdGlvbiAoaWUuIHZhbGlkIHN0YWNrIGZyYW1lLCB3aW5kb3cKKyAqICBleGNlcHRpb25zIGVuYWJsZWQsIG5vdCBpbiBleGNlcHRpb24gbW9kZSwgZXRjKS4KKyAqCisgKiAgVGhpcyBtYWNybyByZXF1aXJlcyBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHRoZSB3aW5kb3dfc3BpbGxfY29tbW9uCisgKiAgbWFjcm8gaW4gdGhlIHNhbWUgYXNzZW1ibHkgdW5pdCBhbmQgc2VjdGlvbi4KKyAqCisgKiAgTm90ZSB0aGF0IHVzaW5nIHdpbmRvd19zcGlsbHs0LDgsMTJ9IG1hY3JvcyBpcyBtb3JlIGVmZmljaWVudAorICogIHRoYW4gY2FsbGluZyBhIGZ1bmN0aW9uIGltcGxlbWVudGVkIHVzaW5nIHdpbmRvd19zcGlsbF9mdW5jdGlvbiwKKyAqICBiZWNhdXNlIHRoZSBsYXR0ZXIgbmVlZHMgZXh0cmEgY29kZSB0byBmaWd1cmUgb3V0IHRoZSBzaXplIG9mCisgKiAgdGhlIGNhbGwgdG8gdGhlIHNwaWxsaW5nIGZ1bmN0aW9uLgorICoKKyAqICBFeGFtcGxlIHVzYWdlOgorICoKKyAqCQkudGV4dAorICoJCS5hbGlnbgk0CisgKgkJLmdsb2JhbAlzb21lX2Z1bmN0aW9uCisgKgkJLnR5cGUJc29tZV9mdW5jdGlvbixAZnVuY3Rpb24KKyAqCXNvbWVfZnVuY3Rpb246CisgKgkJZW50cnkJYTEsIDE2CisgKgkJOgorICoJCToKKyAqCisgKgkJd2luZG93X3NwaWxsNAkvLyBzcGlsbCB3aW5kb3dzIG9mIHNvbWVfZnVuY3Rpb24ncyBjYWxsZXJzOyBwcmVzZXJ2ZXMgYTAuLmEzIG9ubHk7CisgKgkJCQkvLyB0byB1c2Ugd2luZG93X3NwaWxsezgsMTJ9IGluIHRoaXMgZXhhbXBsZSBmdW5jdGlvbiB3ZSdkIGhhdmUKKyAqCQkJCS8vIHRvIGluY3JlYXNlIHNwYWNlIGFsbG9jYXRlZCBieSB0aGUgZW50cnkgaW5zdHJ1Y3Rpb24sIGJlY2F1c2UKKyAqCQkJCS8vIDE2IGJ5dGVzIG9ubHkgYWxsb3dzIGNhbGw0OyAzMiBvciA0OCBieXRlcyAoK2xvY2FscykgYXJlIG5lZWRlZAorICoJCQkJLy8gZm9yIGNhbGw4L3dpbmRvd19zcGlsbDggb3IgY2FsbDEyL3dpbmRvd19zcGlsbDEyIHJlc3BlY3RpdmVseS4KKyAqCQk6CisgKgorICoJCXJldHcKKyAqCisgKgkJd2luZG93X3NwaWxsX2NvbW1vbgkvLyBpbnN0YW50aWF0ZXMgY29kZSB1c2VkIGJ5IHdpbmRvd19zcGlsbDQKKyAqCisgKgorICogIE9uIGVudHJ5OgorICoJbm9uZSAoaWYgd2luZG93X3NwaWxsNCkKKyAqCXN0YWNrIGZyYW1lIGhhcyBlbm91Z2ggc3BhY2UgYWxsb2NhdGVkIGZvciBjYWxsOCAoaWYgd2luZG93X3NwaWxsOCkKKyAqCXN0YWNrIGZyYW1lIGhhcyBlbm91Z2ggc3BhY2UgYWxsb2NhdGVkIGZvciBjYWxsMTIgKGlmIHdpbmRvd19zcGlsbDEyKQorICogIE9uIGV4aXQ6CisgKgkgYTQuLmExNSBjbG9iYmVyZWQgKGlmIHdpbmRvd19zcGlsbDQpCisgKgkgYTguLmExNSBjbG9iYmVyZWQgKGlmIHdpbmRvd19zcGlsbDgpCisgKglhMTIuLmExNSBjbG9iYmVyZWQgKGlmIHdpbmRvd19zcGlsbDEyKQorICoJbm8gY2FsbGVyIHdpbmRvd3MgYXJlIGluIGxpdmUgcmVnaXN0ZXJzCisgKi8KKworCS5tYWNybwl3aW5kb3dfc3BpbGw0CisjaWYgWENIQUxfSEFWRV9XSU5ET1dFRAorIyBpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gMTYKKwltb3ZpCWExNSwgMAkJCS8vIGZvciAxNi1yZWdpc3RlciBmaWxlcywgbm8gbmVlZCB0byBjYWxsIHRvIHJlYWNoIHRoZSBlbmQKKyMgZWxpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gMzIKKwljYWxsNAkuTF9fd2R3c3BpbGxfYXNzaXN0MjgJLy8gY2FsbCBkZWVwIGVub3VnaCB0byBjbGVhciBvdXQgYW55IGxpdmUgY2FsbGVycworIyBlbGlmIFhDSEFMX05VTV9BUkVHUyA9PSA2NAorCWNhbGw0CS5MX193ZHdzcGlsbF9hc3Npc3Q2MAkvLyBjYWxsIGRlZXAgZW5vdWdoIHRvIGNsZWFyIG91dCBhbnkgbGl2ZSBjYWxsZXJzCisjIGVuZGlmCisjZW5kaWYKKwkuZW5kbQkvLyB3aW5kb3dfc3BpbGw0CisKKwkubWFjcm8Jd2luZG93X3NwaWxsOAorI2lmIFhDSEFMX0hBVkVfV0lORE9XRUQKKyMgaWYgWENIQUxfTlVNX0FSRUdTID09IDE2CisJbW92aQlhMTUsIDAJCQkvLyBmb3IgMTYtcmVnaXN0ZXIgZmlsZXMsIG5vIG5lZWQgdG8gY2FsbCB0byByZWFjaCB0aGUgZW5kCisjIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDMyCisJY2FsbDgJLkxfX3dkd3NwaWxsX2Fzc2lzdDI0CS8vIGNhbGwgZGVlcCBlbm91Z2ggdG8gY2xlYXIgb3V0IGFueSBsaXZlIGNhbGxlcnMKKyMgZWxpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gNjQKKwljYWxsOAkuTF9fd2R3c3BpbGxfYXNzaXN0NTYJLy8gY2FsbCBkZWVwIGVub3VnaCB0byBjbGVhciBvdXQgYW55IGxpdmUgY2FsbGVycworIyBlbmRpZgorI2VuZGlmCisJLmVuZG0JLy8gd2luZG93X3NwaWxsOAorCisJLm1hY3JvCXdpbmRvd19zcGlsbDEyCisjaWYgWENIQUxfSEFWRV9XSU5ET1dFRAorIyBpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gMTYKKwltb3ZpCWExNSwgMAkJCS8vIGZvciAxNi1yZWdpc3RlciBmaWxlcywgbm8gbmVlZCB0byBjYWxsIHRvIHJlYWNoIHRoZSBlbmQKKyMgZWxpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gMzIKKwljYWxsMTIJLkxfX3dkd3NwaWxsX2Fzc2lzdDIwCS8vIGNhbGwgZGVlcCBlbm91Z2ggdG8gY2xlYXIgb3V0IGFueSBsaXZlIGNhbGxlcnMKKyMgZWxpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gNjQKKwljYWxsMTIJLkxfX3dkd3NwaWxsX2Fzc2lzdDUyCS8vIGNhbGwgZGVlcCBlbm91Z2ggdG8gY2xlYXIgb3V0IGFueSBsaXZlIGNhbGxlcnMKKyMgZW5kaWYKKyNlbmRpZgorCS5lbmRtCS8vIHdpbmRvd19zcGlsbDEyCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHdpbmRvd19zcGlsbF9mdW5jdGlvbgorICoKKyAqICBUaGlzIG1hY3JvIG91dHB1dHMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgc3BpbGwgaXRzIGNhbGxlcidzIGNhbGxlcnMnCisgKiAgcmVnaXN0ZXIgd2luZG93cyB0byB0aGUgc3RhY2suICBFZy4gaXQgY291bGQgYmUgdXNlZCB0byBpbXBsZW1lbnQKKyAqICBhIHZlcnNpb24gb2YgeHRoYWxfd2luZG93X3NwaWxsKCkgdGhhdCB3b3JrcyBpbiBub24tcHJpdmlsZWdlZCB0YXNrcy4KKyAqICBUaGlzIHdvcmtzIGZvciBib3RoIHByaXZpbGVnZWQgYW5kIG5vbi1wcml2aWxlZ2VkIHRhc2tzLgorICoKKyAqICBUeXBpY2FsIHVzYWdlOgorICoKKyAqCQkudGV4dAorICoJCS5hbGlnbgk0CisgKgkJLmdsb2JhbAlteV9zcGlsbF9mdW5jdGlvbgorICoJCS50eXBlCW15X3NwaWxsX2Z1bmN0aW9uLEBmdW5jdGlvbgorICoJbXlfc3BpbGxfZnVuY3Rpb246CisgKgkJd2luZG93X3NwaWxsX2Z1bmN0aW9uCisgKgorICogIE9uIGVudHJ5IHRvIHJlc3VsdGluZyBmdW5jdGlvbjoKKyAqCW5vbmUKKyAqICBPbiBleGl0IGZyb20gcmVzdWx0aW5nIGZ1bmN0aW9uOgorICoJbm9uZSAobm8gY2FsbGVyIHdpbmRvd3MgYXJlIGluIGxpdmUgcmVnaXN0ZXJzKQorICovCisKKwkubWFjcm8Jd2luZG93X3NwaWxsX2Z1bmN0aW9uCisjaWYgWENIQUxfSEFWRV9XSU5ET1dFRAorIyBpZiBYQ0hBTF9OVU1fQVJFR1MgPT0gMzIKKwllbnRyeQlzcCwgNDgKKwliYmNpLmwJYTAsIDMxLCAxZgkJLy8gYnJhbmNoIGlmIGNhbGxlZCB3aXRoIGNhbGw0CisJYmJzaS5sCWEwLCAzMCwgMmYJCS8vIGJyYW5jaCBpZiBjYWxsZWQgd2l0aCBjYWxsMTIKKwljYWxsOAkuTF9fd2R3c3BpbGxfYXNzaXN0MTYJLy8gY2FsbGVkIHdpdGggY2FsbDgsIG9ubHkgbmVlZCBhbm90aGVyIDgKKwlyZXR3CisxOgljYWxsMTIJLkxfX3dkd3NwaWxsX2Fzc2lzdDE2CS8vIGNhbGxlZCB3aXRoIGNhbGw0LCBvbmx5IG5lZWQgYW5vdGhlciAxMgorCXJldHcKKzI6CWNhbGw0CS5MX193ZHdzcGlsbF9hc3Npc3QxNgkvLyBjYWxsZWQgd2l0aCBjYWxsMTIsIG9ubHkgbmVlZCBhbm90aGVyIDQKKwlyZXR3CisjIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDY0CisJZW50cnkJc3AsIDQ4CisJYmJjaS5sCWEwLCAzMSwgMWYJCS8vIGJyYW5jaCBpZiBjYWxsZWQgd2l0aCBjYWxsNAorCWJic2kubAlhMCwgMzAsIDJmCQkvLyBicmFuY2ggaWYgY2FsbGVkIHdpdGggY2FsbDEyCisJY2FsbDQJLkxfX3dkd3NwaWxsX2Fzc2lzdDUyCS8vIGNhbGxlZCB3aXRoIGNhbGw4LCBvbmx5IG5lZWQgYSBjYWxsNAorCXJldHcKKzE6CWNhbGw4CS5MX193ZHdzcGlsbF9hc3Npc3Q1MgkvLyBjYWxsZWQgd2l0aCBjYWxsNCwgb25seSBuZWVkIGEgY2FsbDgKKwlyZXR3CisyOgljYWxsMTIJLkxfX3dkd3NwaWxsX2Fzc2lzdDQwCS8vIGNhbGxlZCB3aXRoIGNhbGwxMiwgY2FuIHNraXAgYSBjYWxsMTIKKwlyZXR3CisjIGVsaWYgWENIQUxfTlVNX0FSRUdTID09IDE2CisJZW50cnkJc3AsIDE2CisJYmJjaS5sCWEwLCAzMSwgMWYJLy8gYnJhbmNoIGlmIGNhbGxlZCB3aXRoIGNhbGw0CisJYmJzaS5sCWEwLCAzMCwgMmYJLy8gYnJhbmNoIGlmIGNhbGxlZCB3aXRoIGNhbGwxMgorCW1vdmkJYTcsIDAJCS8vIGNhbGxlZCB3aXRoIGNhbGw4CisJcmV0dworMToJbW92aQlhMTEsIDAJCS8vIGNhbGxlZCB3aXRoIGNhbGw0CisyOglyZXR3CQkJLy8gaWYgY2FsbGVkIHdpdGggY2FsbDEyLCBldmVyeXRoaW5nIGFscmVhZHkgc3BpbGxlZAorCisvLwltb3ZpCWExNSwgMAkJLy8gdHJpY2sgdG8gc3BpbGwgYWxsIGJ1dCB0aGUgZGlyZWN0IGNhbGxlcgorLy8JagkxZgorLy8JLy8gIFRoZSBlbnRyeSBpbnN0cnVjdGlvbiBpcyBtYWdpY2FsIGluIHRoZSBhc3NlbWJsZXIgKGdldHMgYXV0by1hbGlnbmVkKQorLy8JLy8gIHNvIHdlIGhhdmUgdG8ganVtcCB0byBpdCB0byBhdm9pZCBmYWxsaW5nIHRocm91Z2ggdGhlIHBhZGRpbmcuCisvLwkvLyAgV2UgbmVlZCBlbnRyeS9yZXR3IHRvIGtub3cgd2hlcmUgdG8gcmV0dXJuLgorLy8xOgllbnRyeQlzcCwgMTYKKy8vCXJldHcKKyMgZWxzZQorIyAgZXJyb3IgInVucmVjb2duaXplZCBhZGRyZXNzIHJlZ2lzdGVyIGZpbGUgc2l6ZSIKKyMgZW5kaWYKKyNlbmRpZiAvKiBYQ0hBTF9IQVZFX1dJTkRPV0VEICovCisJd2luZG93X3NwaWxsX2NvbW1vbgorCS5lbmRtCS8vIHdpbmRvd19zcGlsbF9mdW5jdGlvbgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB3aW5kb3dfc3BpbGxfY29tbW9uCisgKgorICogIENvbW1vbiBjb2RlIHVzZWQgYnkgYW55IG51bWJlciBvZiBpbnZvY2F0aW9ucyBvZiB0aGUgd2luZG93X3NwaWxsIyMKKyAqICBhbmQgd2luZG93X3NwaWxsX2Z1bmN0aW9uIG1hY3Jvcy4KKyAqCisgKiAgTXVzdCBiZSBpbnN0YW50aWF0ZWQgZXhhY3RseSBvbmNlIHdpdGhpbiBhIGdpdmVuIGFzc2VtYmx5IHVuaXQsCisgKiAgd2l0aGluIGNhbGwvaiByYW5nZSBvZiBhbmQgc2FtZSBzZWN0aW9uIGFzIHdpbmRvd19zcGlsbCMjCisgKiAgbWFjcm8gaW52b2NhdGlvbnMgZm9yIHRoYXQgYXNzZW1ibHkgdW5pdC4KKyAqICAoSXMgYXV0b21hdGljYWxseSBpbnN0YW50aWF0ZWQgYnkgdGhlIHdpbmRvd19zcGlsbF9mdW5jdGlvbiBtYWNyby4pCisgKi8KKworCS5tYWNybwl3aW5kb3dfc3BpbGxfY29tbW9uCisjaWYgWENIQUxfSEFWRV9XSU5ET1dFRCAmJiAoWENIQUxfTlVNX0FSRUdTID09IDMyIHx8IFhDSEFMX05VTV9BUkVHUyA9PSA2NCkKKwkuaWZuZGVmCS5MX193ZHdzcGlsbF9kZWZpbmVkCisjIGlmIFhDSEFMX05VTV9BUkVHUyA+PSA2NAorLkxfX3dkd3NwaWxsX2Fzc2lzdDYwOgorCWVudHJ5CXNwLCAzMgorCWNhbGw4CS5MX193ZHdzcGlsbF9hc3Npc3Q1MgorCXJldHcKKy5MX193ZHdzcGlsbF9hc3Npc3Q1NjoKKwllbnRyeQlzcCwgMTYKKwljYWxsNAkuTF9fd2R3c3BpbGxfYXNzaXN0NTIKKwlyZXR3CisuTF9fd2R3c3BpbGxfYXNzaXN0NTI6CisJZW50cnkJc3AsIDQ4CisJY2FsbDEyCS5MX193ZHdzcGlsbF9hc3Npc3Q0MAorCXJldHcKKy5MX193ZHdzcGlsbF9hc3Npc3Q0MDoKKwllbnRyeQlzcCwgNDgKKwljYWxsMTIJLkxfX3dkd3NwaWxsX2Fzc2lzdDI4CisJcmV0dworIyBlbmRpZgorLkxfX3dkd3NwaWxsX2Fzc2lzdDI4OgorCWVudHJ5CXNwLCA0OAorCWNhbGwxMgkuTF9fd2R3c3BpbGxfYXNzaXN0MTYKKwlyZXR3CisuTF9fd2R3c3BpbGxfYXNzaXN0MjQ6CisJZW50cnkJc3AsIDMyCisJY2FsbDgJLkxfX3dkd3NwaWxsX2Fzc2lzdDE2CisJcmV0dworLkxfX3dkd3NwaWxsX2Fzc2lzdDIwOgorCWVudHJ5CXNwLCAxNgorCWNhbGw0CS5MX193ZHdzcGlsbF9hc3Npc3QxNgorCXJldHcKKy5MX193ZHdzcGlsbF9hc3Npc3QxNjoKKwllbnRyeQlzcCwgMTYKKwltb3ZpCWExNSwgMAorCXJldHcKKwkuc2V0CS5MX193ZHdzcGlsbF9kZWZpbmVkLCAxCisJLmVuZGlmCisjZW5kaWYgLyogWENIQUxfSEFWRV9XSU5ET1dFRCB3aXRoIDMyIG9yIDY0IGFyZWdzICovCisJLmVuZG0JLy8gd2luZG93X3NwaWxsX2NvbW1vbgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBiZXFpMzIKKyAqCisgKiAgbWFjcm8gaW1wbGVtZW50cyB2ZXJzaW9uIG9mIGJlcWkgZm9yIGFyYml0cmFyeSAzMi1iaXQgaW1taWRpYXRlIHZhbHVlCisgKgorICogICAgIGJlcWkzMiBheCwgYXksIGltbTMyLCBsYWJlbAorICoKKyAqICBDb21wYXJlcyB2YWx1ZSBpbiByZWdpc3RlciBheCB3aXRoIGltbTMyIHZhbHVlIGFuZCBqdW1wcyB0byBsYWJlbCBpZgorICogIGVxdWFsLiBDbG9iYmVyZXMgcmVnaXN0ZXIgYXkgaWYgbmVlZGVkCisgKgorICovCisgICAubWFjcm8gYmVxaTMyCWF4LCBheSwgaW1tLCBsYWJlbAorICAgIC5pZmVxICgoXGltbS0xKSAmIH43KQkvLyAxLi44ID8KKwkJYmVxaQlcYXgsIFxpbW0sIFxsYWJlbAorICAgIC5lbHNlCisgICAgICAuaWZlcSAoXGltbSsxKQkJLy8gLTEgPworCQliZXFpCVxheCwgXGltbSwgXGxhYmVsCisgICAgICAuZWxzZQorICAgICAgICAuaWZlcSAoXGltbSkJCS8vIDAgPworCQliZXF6CVxheCwgXGxhYmVsCisgICAgICAgIC5lbHNlCisJCS8vICBXZSBjb3VsZCBhbHNvIGhhbmRsZSBpbW1lZGlhdGVzIDEwLDEyLDE2LDMyLDY0LDEyOCwyNTYKKwkJLy8gIGJ1dCBpdCB3b3VsZCBiZSBhIGxvbmcgbWFjcm8uLi4KKwkJbW92aQlcYXksIFxpbW0KKwkJYmVxCVxheCwgXGF5LCBcbGFiZWwKKyAgICAgICAgLmVuZGlmCisgICAgICAuZW5kaWYKKyAgICAuZW5kaWYKKyAgIC5lbmRtIC8vIGJlcWkzMgorCisjZW5kaWYgLypYVEVOU0FfQ09SRUFTTV9IKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb3JlYml0cy5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9jb3JlYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzhhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2NvcmViaXRzLmgKQEAgLTAsMCArMSw3NyBAQAorI2lmbmRlZiBYVEVOU0FfQ09SRUJJVFNfSAorI2RlZmluZSBYVEVOU0FfQ09SRUJJVFNfSAorCisvKgorICogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCAtLSBETyBOT1QgTU9ESUZZIEJZIEhBTkQKKyAqCisgKiB4dGVuc2EvY29yZWJpdHMuaCAtIFh0ZW5zYSBTcGVjaWFsIFJlZ2lzdGVyIGZpZWxkIHBvc2l0aW9ucyBhbmQgbWFza3MuCisgKgorICogKEluIHByZXZpb3VzIHJlbGVhc2VzLCB0aGVzZSB3ZXJlIGRlZmluZWQgaW4gc3BlY3JlZy5oLCBhIGdlbmVyYXRlZCBmaWxlLgorICogIFRoaXMgZmlsZSBpcyBub3QgZ2VuZXJhdGVkLCBpLmUuIGl0IGlzIHByb2Nlc3NvciBjb25maWd1cmF0aW9uIGluZGVwZW5kZW50LikKKyAqLworCisKKy8qICBFWENDQVVTRSByZWdpc3RlciBmaWVsZHM6ICAqLworI2RlZmluZSBFWENDQVVTRV9FWENDQVVTRV9TSElGVAkwCisjZGVmaW5lIEVYQ0NBVVNFX0VYQ0NBVVNFX01BU0sJMHgzRgorLyogIEV4Y2VwdGlvbiBjYXVzZXMgKG1vc3RseSBpbmNvbXBsZXRlISk6ICAqLworI2RlZmluZSBFWENDQVVTRV9JTExFR0FMCQkwCisjZGVmaW5lIEVYQ0NBVVNFX1NZU0NBTEwJCTEKKyNkZWZpbmUgRVhDQ0FVU0VfSUZFVENIRVJST1IJCTIKKyNkZWZpbmUgRVhDQ0FVU0VfTE9BRFNUT1JFRVJST1IJCTMKKyNkZWZpbmUgRVhDQ0FVU0VfTEVWRUwxSU5URVJSVVBUCTQKKyNkZWZpbmUgRVhDQ0FVU0VfQUxMT0NBCQkJNQorCisvKiAgUFMgcmVnaXN0ZXIgZmllbGRzOiAgKi8KKyNkZWZpbmUgUFNfV09FX1NISUZUCQkxOAorI2RlZmluZSBQU19XT0VfTUFTSwkJMHgwMDA0MDAwMAorI2RlZmluZSBQU19XT0UJCQlQU19XT0VfTUFTSworI2RlZmluZSBQU19DQUxMSU5DX1NISUZUCTE2CisjZGVmaW5lIFBTX0NBTExJTkNfTUFTSwkJMHgwMDAzMDAwMAorI2RlZmluZSBQU19DQUxMSU5DKG4pCQkoKChuKSYzKTw8UFNfQ0FMTElOQ19TSElGVCkJLyogbiA9IDAuLjMgKi8KKyNkZWZpbmUgUFNfT1dCX1NISUZUCQk4CisjZGVmaW5lIFBTX09XQl9NQVNLCQkweDAwMDAwRjAwCisjZGVmaW5lIFBTX09XQihuKQkJKCgobikmMTUpPDxQU19PV0JfU0hJRlQpCS8qIG4gPSAwLi4xNSAob3IgMC4uNykgKi8KKyNkZWZpbmUgUFNfUklOR19TSElGVAkJNgorI2RlZmluZSBQU19SSU5HX01BU0sJCTB4MDAwMDAwQzAKKyNkZWZpbmUgUFNfUklORyhuKQkJKCgobikmMyk8PFBTX1JJTkdfU0hJRlQpCS8qIG4gPSAwLi4zICovCisjZGVmaW5lIFBTX1VNX1NISUZUCQk1CisjZGVmaW5lIFBTX1VNX01BU0sJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUFNfVU0JCQlQU19VTV9NQVNLCisjZGVmaW5lIFBTX0VYQ01fU0hJRlQJCTQKKyNkZWZpbmUgUFNfRVhDTV9NQVNLCQkweDAwMDAwMDEwCisjZGVmaW5lIFBTX0VYQ00JCQlQU19FWENNX01BU0sKKyNkZWZpbmUgUFNfSU5UTEVWRUxfU0hJRlQJMAorI2RlZmluZSBQU19JTlRMRVZFTF9NQVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgUFNfSU5UTEVWRUwobikJCSgobikmUFNfSU5UTEVWRUxfTUFTSykJCS8qIG4gPSAwLi4xNSAqLworLyogIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGRlcHJlY2F0ZWQpOiAgKi8KKyNkZWZpbmUgUFNfUFJPR1NUQUNLX1NISUZUCVBTX1VNX1NISUZUCisjZGVmaW5lIFBTX1BST0dTVEFDS19NQVNLCVBTX1VNX01BU0sKKyNkZWZpbmUgUFNfUFJPR19TSElGVAkJUFNfVU1fU0hJRlQKKyNkZWZpbmUgUFNfUFJPR19NQVNLCQlQU19VTV9NQVNLCisjZGVmaW5lIFBTX1BST0cJCQlQU19VTQorCisvKiAgREJSRUFLQ24gcmVnaXN0ZXIgZmllbGRzOiAgKi8KKyNkZWZpbmUgREJSRUFLQ19NQVNLX1NISUZUCQkwCisjZGVmaW5lIERCUkVBS0NfTUFTS19NQVNLCQkweDAwMDAwMDNGCisjZGVmaW5lIERCUkVBS0NfTE9BREJSRUFLX1NISUZUCQkzMAorI2RlZmluZSBEQlJFQUtDX0xPQURCUkVBS19NQVNLCQkweDQwMDAwMDAwCisjZGVmaW5lIERCUkVBS0NfU1RPUkVCUkVBS19TSElGVAkzMQorI2RlZmluZSBEQlJFQUtDX1NUT1JFQlJFQUtfTUFTSwkJMHg4MDAwMDAwMAorCisvKiAgREVCVUdDQVVTRSByZWdpc3RlciBmaWVsZHM6ICAqLworI2RlZmluZSBERUJVR0NBVVNFX0RFQlVHSU5UX1NISUZUCTUKKyNkZWZpbmUgREVCVUdDQVVTRV9ERUJVR0lOVF9NQVNLCTB4MjAJLyogZGVidWcgaW50ZXJydXB0ICovCisjZGVmaW5lIERFQlVHQ0FVU0VfQlJFQUtOX1NISUZUCQk0CisjZGVmaW5lIERFQlVHQ0FVU0VfQlJFQUtOX01BU0sJCTB4MTAJLyogQlJFQUsuTiBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBERUJVR0NBVVNFX0JSRUFLX1NISUZUCQkzCisjZGVmaW5lIERFQlVHQ0FVU0VfQlJFQUtfTUFTSwkJMHgwOAkvKiBCUkVBSyBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBERUJVR0NBVVNFX0RCUkVBS19TSElGVAkJMgorI2RlZmluZSBERUJVR0NBVVNFX0RCUkVBS19NQVNLCQkweDA0CS8qIERCUkVBSyBtYXRjaCAqLworI2RlZmluZSBERUJVR0NBVVNFX0lCUkVBS19TSElGVAkJMQorI2RlZmluZSBERUJVR0NBVVNFX0lCUkVBS19NQVNLCQkweDAyCS8qIElCUkVBSyBtYXRjaCAqLworI2RlZmluZSBERUJVR0NBVVNFX0lDT1VOVF9TSElGVAkJMAorI2RlZmluZSBERUJVR0NBVVNFX0lDT1VOVF9NQVNLCQkweDAxCS8qIElDT1VOVCB3b3VsZCBpbmNyZW1lbnQgdG8gemVybyAqLworCisjZW5kaWYgLypYVEVOU0FfQ09SRUJJVFNfSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EvaGFsLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2hhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMDQ3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL2hhbC5oCkBAIC0wLDAgKzEsODIyIEBACisjaWZuZGVmIFhURU5TQV9IQUxfSAorI2RlZmluZSBYVEVOU0FfSEFMX0gKKworLyoKKyAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECisgKgorICogaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9oYWwuaCAtLSBjb250YWlucyBhIGRlZmluaXRpb24gb2YgdGhlCisgKiBDb3JlIEhBTCBpbnRlcmZhY2UuCisgKgorICogQWxsIGRlZmluaXRpb25zIGluIHRoaXMgaGVhZGVyIGZpbGUgYXJlIGluZGVwZW5kZW50IG9mIGFueSBzcGVjaWZpYworICogWHRlbnNhIHByb2Nlc3NvciBjb25maWd1cmF0aW9uLiAgVGh1cyBhbiBPUyBvciBvdGhlciBzb2Z0d2FyZSBjYW4KKyAqIGluY2x1ZGUgdGhpcyBoZWFkZXIgZmlsZSBhbmQgYmUgY29tcGlsZWQgaW50byBjb25maWd1cmF0aW9uLQorICogaW5kZXBlbmRlbnQgb2JqZWN0cyB0aGF0IGNhbiBiZSBkaXN0cmlidXRlZCBhbmQgZXZlbnR1YWxseSBsaW5rZWQKKyAqIHRvIHRoZSBIQUwgbGlicmFyeSAobGliaGFsLmEpIHRvIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24tc3BlY2lmaWMKKyAqIGZpbmFsIGV4ZWN1dGFibGUuCisgKgorICogQ2VydGFpbiBkZWZpbml0aW9ucywgaG93ZXZlciwgYXJlIHJlbGVhc2Utc3BlY2lmaWMgLS0gc3VjaCBhcyB0aGUKKyAqIFhUSEFMX1JFTEVBU0VfeHh4IG1hY3JvcyAob3IgYWRkaXRpb25zIG1hZGUgaW4gbGF0ZXIgcmVsZWFzZXMpLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBUZW5zaWxpY2EgSW5jLgorICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIAkJCSBDb25zdGFudCBEZWZpbml0aW9ucworCQkJKHNoYXJlZCB3aXRoIGFzc2VtYmx5KQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogIFNvZnR3YXJlIHJlbGVhc2UgaW5mb3JtYXRpb24gKG5vdCBjb25maWd1cmF0aW9uLXNwZWNpZmljISk6ICAqLworI2RlZmluZSBYVEhBTF9SRUxFQVNFX01BSk9SCTEwNTAKKyNkZWZpbmUgWFRIQUxfUkVMRUFTRV9NSU5PUgkwCisjZGVmaW5lIFhUSEFMX1JFTEVBU0VfTkFNRQkiVDEwNTAuMC0yMDAyLTA4LTA2LWVuZzAiCisjZGVmaW5lIFhUSEFMX1JFTEVBU0VfSU5URVJOQUwJIjIwMDItMDgtMDYtZW5nMCIKKyNkZWZpbmUgWFRIQUxfUkVMX1QxMDUwCTEKKyNkZWZpbmUgWFRIQUxfUkVMX1QxMDUwXzAJMQorI2RlZmluZSBYVEhBTF9SRUxfVDEwNTBfMF8yMDAyCTEKKyNkZWZpbmUgWFRIQUxfUkVMX1QxMDUwXzBfMjAwMl8wOAkxCisjZGVmaW5lIFhUSEFMX1JFTF9UMTA1MF8wXzIwMDJfMDhfMDYJMQorI2RlZmluZSBYVEhBTF9SRUxfVDEwNTBfMF8yMDAyXzA4XzA2X0VORzAJMQorCisvKiAgSEFMIHZlcnNpb24gbnVtYmVycyAodGhlc2UgbmFtZXMgYXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTogICovCisjZGVmaW5lIFhUSEFMX01BSk9SX1JFVgkJWFRIQUxfUkVMRUFTRV9NQUpPUgorI2RlZmluZSBYVEhBTF9NSU5PUl9SRVYJCVhUSEFMX1JFTEVBU0VfTUlOT1IKKy8qCisgKiAgQSBiaXQgb2Ygc29mdHdhcmUgcmVsZWFzZSBoaXN0b3J5IG9uIHZhbHVlcyBvZiBYVEhBTF97TUFKT1IsTUlOT1J9X1JFVjoKKyAqCisgKglSZWxlYXNlCQlNQUpPUglNSU5PUgkJQ29tbWVudAorICoJPT09PT09PQkJPT09PT0JPT09PT0JCT09PT09PT0KKyAqCVQxMDE1Lm4JCW4vYQluL2EJCShIQUwgbm90IHlldCBhdmFpbGFibGUpCisgKglUMTAyMC57MCwxLDJ9CTAJMQkJKEhBTCBiZXRhKQorICoJVDEwMjAuezMsNH0JMAkyCQlGaXJzdCByZWxlYXNlLgorICoJVDEwMjAubiAobj40KQkwCTIgb3IgPjMJCShUQkQpCisgKglUMTAzMC4wCQkwCTEJCShIQUwgYmV0YSkKKyAqCVQxMDMwLnsxLDJ9CTAJMwkJRXF1aXZhbGVudCB0byBmaXJzdCByZWxlYXNlLgorICoJVDEwMzAubiAobj49MykJMAk+PSAzCQkoVEJEKQorICoJVDEwNDAubgkJMTA0MAluCQlGdWxsIENIQUwgYXZhaWxhYmxlIGZyb20gVDEwNDAuMgorICoJVDEwNTAubgkJMTA1MAluCQlDdXJyZW50IHJlbGVhc2UuCisgKgorICoKKyAqICBOb3RlOiAgdGhlcmUgaXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRoZSBzb2Z0d2FyZSByZWxlYXNlIHdpdGgKKyAqICB3aGljaCBzb21ldGhpbmcgaXMgY29tcGlsZWQgKGFjY2Vzc2libGUgdXNpbmcgWFRIQUxfUkVMRUFTRV8qIG1hY3JvcykKKyAqICBhbmQgdGhlIHNvZnR3YXJlIHJlbGVhc2Ugd2l0aCB3aGljaCB0aGUgSEFMIGxpYnJhcnkgd2FzIGNvbXBpbGVkCisgKiAgKGFjY2Vzc2libGUgdXNpbmcgWHRoYWxfcmVsZWFzZV8qIGdsb2JhbCB2YXJpYWJsZXMpLiAgVGhpcworICogIGRpc3RpbmN0aW9uIGlzIHBhcnRpY3VsYXJseSByZWxldmFudCBmb3IgdmVuZG9ycyB0aGF0IGRpc3RyaWJ1dGUKKyAqICBjb25maWd1cmF0aW9uLWluZGVwZW5kZW50IGJpbmFyaWVzIChlZy4gYW4gT1MpLCB3aGVyZSB0aGVpciBjdXN0b21lcgorICogIG1pZ2h0IGxpbmsgaXQgd2l0aCBhIEhBTCBvZiBhIGRpZmZlcmVudCBYdGVuc2Egc29mdHdhcmUgcmVsZWFzZS4KKyAqICBJbiB0aGlzIGNhc2UsIGl0IG1heSBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIE9TIHRvIHZlcmlmeSBhdCBydW4tdGltZQorICogIHdoZXRoZXIgWFRIQUxfUkVMRUFTRV8qIGFuZCBYdGhhbF9yZWxlYXNlXyogYXJlIGNvbXBhdGlibGUuCisgKiAgW0d1aWRlbGluZXMgYXMgdG8gd2hpY2ggcmVsZWFzZSBpcyBjb21wYXRpYmxlIHdpdGggd2hpY2ggYXJlIG5vdAorICogIGN1cnJlbnRseSBwcm92aWRlZCBleHBsaWNpdGx5LCBidXQgbWlnaHQgYmUgaW5mZXJyZWQgZnJvbSByZWFkaW5nCisgKiAgT1NLaXQgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIHJlbGVhc2VzIC0tIGNvbXBhdGliaWxpdHkgaXMgYWxzbyBoaWdobHkKKyAqICBkZXBlbmRlbnQgb24gd2hpY2ggSEFMIGZlYXR1cmVzIGFyZSB1c2VkLiAgRWFjaCByZWxlYXNlIGlzIHVzdWFsbHkKKyAqICBiYWNrd2FyZCBjb21wYXRpYmxlLCB3aXRoIHZlcnkgZmV3IGV4Y2VwdGlvbnMgaWYgYW55Ll0KKyAqCisgKiAgTm90ZXM6CisgKglUb3JuYWRvIDIuMCBzdXBwb3J0ZWQgaW4gVDEwMjAuMyssIFQxMDMwLjErLCBhbmQgVDEwNDAuezAsMX0gb25seS4KKyAqCVRvcm5hZG8gMi4wLjIgc3VwcG9ydGVkIGluIFQxMDQwLjIrLCBhbmQgVDEwNTAuCisgKglDb21waWxlLXRpbWUgSEFMIHBvcnQgb2YgTnVjbGV1c1BsdXMgc3VwcG9ydGVkIGJ5IFQxMDQwLjIrIGFuZCBUMTA1MC4KKyAqLworCisKKy8qCisgKiAgQXJjaGl0ZWN0dXJhbCBsaW1pdHMsIGluZGVwZW5kZW50IG9mIGNvbmZpZ3VyYXRpb24uCisgKiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBJU0EtZGVmaW5lZCBsaW1pdHMsIG5vdCBtaWNyby1hcmNoaXRlY3R1cmUgaW1wbGVtZW50YXRpb24KKyAqICBsaW1pdHMgZW5mb3JjZWQgYnkgdGhlIFh0ZW5zYSBQcm9jZXNzb3IgR2VuZXJhdG9yICh3aGljaCBtYXkgYmUgc3RyaWN0ZXIgdGhhbgorICogIHRoZXNlIGJlbG93KS4KKyAqLworI2RlZmluZSBYVEhBTF9NQVhfQ1BTCQk4CS8qIG1heCBudW1iZXIgb2YgY29wcm9jZXNzb3JzICgwLi43KSAqLworI2RlZmluZSBYVEhBTF9NQVhfSU5URVJSVVBUUwkzMgkvKiBtYXggbnVtYmVyIG9mIGludGVycnVwdHMgKDAuLjMxKSAqLworI2RlZmluZSBYVEhBTF9NQVhfSU5UTEVWRUxTCTE2CS8qIG1heCBudW1iZXIgb2YgaW50ZXJydXB0IGxldmVscyAoMC4uMTUpICovCisJCQkJCS8qIChhcyBvZiBUMTA0MCwgaW1wbGVtZW50YXRpb24gbGltaXQgaXMgNzogMC4uNikgKi8KKyNkZWZpbmUgWFRIQUxfTUFYX1RJTUVSUwk0CS8qIG1heCBudW1iZXIgb2YgdGltZXJzIChDQ09NUEFSRTAuLkNDT01QQVJFMykgKi8KKwkJCQkJLyogKGFzIG9mIFQxMDQwLCBpbXBsZW1lbnRhdGlvbiBsaW1pdCBpcyAzOiAwLi4yKSAqLworCisvKiAgTWlzYzogICovCisjZGVmaW5lIFhUSEFMX0xJVFRMRUVORElBTgkJMAorI2RlZmluZSBYVEhBTF9CSUdFTkRJQU4JCQkxCisKKworLyogIEludGVycnVwdCB0eXBlczogICovCisjZGVmaW5lIFhUSEFMX0lOVFRZUEVfVU5DT05GSUdVUkVECTAKKyNkZWZpbmUgWFRIQUxfSU5UVFlQRV9TT0ZUV0FSRQkJMQorI2RlZmluZSBYVEhBTF9JTlRUWVBFX0VYVEVSTl9FREdFCTIKKyNkZWZpbmUgWFRIQUxfSU5UVFlQRV9FWFRFUk5fTEVWRUwJMworI2RlZmluZSBYVEhBTF9JTlRUWVBFX1RJTUVSCQk0CisjZGVmaW5lIFhUSEFMX0lOVFRZUEVfTk1JCQk1CisjZGVmaW5lIFhUSEFMX01BWF9JTlRUWVBFUwkJNgkvKiBudW1iZXIgb2YgaW50ZXJydXB0IHR5cGVzICovCisKKy8qICBUaW1lciByZWxhdGVkOiAgKi8KKyNkZWZpbmUgWFRIQUxfVElNRVJfVU5DT05GSUdVUkVECS0xCS8qIFh0aGFsX3RpbWVyX2ludGVycnVwdFtdIHZhbHVlIGZvciBub24tZXhpc3RlbnQgdGltZXJzICovCisjZGVmaW5lIFhUSEFMX1RJTUVSX1VOQVNTSUdORUQJWFRIQUxfVElNRVJfVU5DT05GSUdVUkVECS8qIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSkgKi8KKworCisvKiAgQWNjZXNzIE1vZGUgYml0cyAodGVudGF0aXZlKTogICovCS8qIGJpdCBhYmJyIHVuaXQgc2hvcnRfbmFtZSAgICAgICBQUEMgZXF1IC0gRGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgWFRIQUxfQU1CX0VYQ0VQVElPTgkwCS8qIDAwMSBFIEVYIGZsczogRVhjZXB0aW9uICAgICAgICBub25lICAgIC0gZ2VuZXJhdGUgZXhjZXB0aW9uIG9uIGFueSBhY2Nlc3MgKGFrYSAiaWxsZWdhbCIpICovCisjZGVmaW5lIFhUSEFMX0FNQl9ISVRDQUNIRQkxCS8qIDAwMiBDIENIIGZsczogdXNlIENhY2hlIG9uIEhpdCB+KEkgQ0kpIC0gdXNlIGNhY2hlIG9uIGhpdCAtLSB3YXkgZnJvbSB0YWcgbWF0Y2ggW29yIEggSEMsIG9yIFUgVUNdIChJU0E6IHNhbWUsIGV4Y2VwdCBmb3IgSXNvbGF0ZSBjYXNlKSAqLworI2RlZmluZSBYVEhBTF9BTUJfQUxMT0NBVEUJMgkvKiAwMDQgQSBBTCBmbD86IEFMbG9jYXRlICAgICAgICAgbm9uZSAgICAtIHJlZmlsbCBjYWNoZSBvbiBtaXNzIC0tIHdheSBmcm9tIExSVSBbb3IgRiBGSSBmaWxsXSAoSVNBOiBSZWFkL1dyaXRlIE1pc3MgUmVmaWxsKSAqLworI2RlZmluZSBYVEhBTF9BTUJfV1JJVEVUSFJVCTMJLyogMDA4IFcgV1QgLS1zOiBXcml0ZVRocm91Z2ggICAgIFcgV1QgICAgLSBzdG9yZSBpbW1lZGlhdGVseSB0byBtZW1vcnkgKElTQTogc2FtZSkgKi8KKyNkZWZpbmUgWFRIQUxfQU1CX0lTT0xBVEUJNAkvKiAwMTAgSSBJUyBmbHM6IElTb2xhdGUgICAgICAgICAgbm9uZSAgICAtIHVzZSBjYWNoZSByZWdhcmRsZXNzIG9mIGhpdC12cy1taXNzIC0tIHdheSBmcm9tIHZhZGRyIChJU0E6IHVzZS1jYWNoZS1vbi1taXNzK2hpdCkgKi8KKyNkZWZpbmUgWFRIQUxfQU1CX0dVQVJECQk1CS8qIDAyMCBHIEdVID9sPzogR1VhcmQgICAgICAgICAgICBHICogICAgIC0gbm9uLXNwZWN1bGF0aXZlOyBzcGVjL3JlcGxheSByZWZzIG5vdCBwZXJtaXR0ZWQgKi8KKyNpZiAwCisjZGVmaW5lIFhUSEFMX0FNQl9PUkRFUkVECXgJLyogMDAwIE8gT1IgZmxzOiBPUmRlcmVkICAgICAgICAgIEcgKiAgICAgLSBtZW0gYWNjZXNzZXMgY2Fubm90IGJlIG91dCBvZiBvcmRlciAqLworI2RlZmluZSBYVEhBTF9BTUJfRlVTRVdSSVRFUwl4CS8qIDAwMCBGIEZXIC0tczogRnVzZVdyaXRlcyAgICAgICBub25lICAgIC0gYWxsb3cgY29tYmluaW5nL21lcmdpbmcgbXVsdGlwbGUgd3JpdGVzICh0byBzYW1lIGRhdGFwYXRoIGRhdGEgdW5pdCkgaW50byBvbmUgKGltcGxpZWQgYnkgd3JpdGViYWNrKSAqLworI2RlZmluZSBYVEhBTF9BTUJfQ09IRVJFTlQJeAkvKiAwMDAgTSBNQyBmbD86IE1lbS9NUCBDb2hlcmVudCAgTSAgICAgICAtIG9uIHJlYWRzLCBvdGhlciBDUFVzL2J1cy1tYXN0ZXJzIG1heSBuZWVkIHRvIHN1cHBseSBkYXRhICovCisjZGVmaW5lIFhUSEFMX0FNQl9UUlVTVEVECXgJLyogMDAwIFQgVFIgP2w/OiBUUnVzdGVkICAgICAgICAgIG5vbmUgICAgLSBtZW1vcnkgd2lsbCBub3QgYnVzIGVycm9yIChpZiBpdCBkb2VzLCBoYW5kbGUgYXMgZmF0YWwgaW1wcmVjaXNlIGludGVycnVwdCkgKi8KKyNkZWZpbmUgWFRIQUxfQU1CX1BSRUZFVENICXgJLyogMDAwIFAgUFIgZmw/OiBQUmVmZXRjaCAgICAgICAgIG5vbmUgICAgLSBvbiByZWZpbGwsIHJlYWQgbGluZSsxIGludG8gcHJlZmV0Y2ggYnVmZmVycyAqLworI2RlZmluZSBYVEhBTF9BTUJfU1RSRUFNCXgJLyogMDAwIFMgU1QgPz8/OiBTVHJlYW1pbmcgICAgICAgIG5vbmUgICAgLSBhY2Nlc3Mgb25lIG9mIE4gc3RyZWFtIGJ1ZmZlcnMgKi8KKyNlbmRpZiAvKjAqLworCisjZGVmaW5lIFhUSEFMX0FNX0VYQ0VQVElPTgkoMTw8WFRIQUxfQU1CX0VYQ0VQVElPTikKKyNkZWZpbmUgWFRIQUxfQU1fSElUQ0FDSEUJKDE8PFhUSEFMX0FNQl9ISVRDQUNIRSkKKyNkZWZpbmUgWFRIQUxfQU1fQUxMT0NBVEUJKDE8PFhUSEFMX0FNQl9BTExPQ0FURSkKKyNkZWZpbmUgWFRIQUxfQU1fV1JJVEVUSFJVCSgxPDxYVEhBTF9BTUJfV1JJVEVUSFJVKQorI2RlZmluZSBYVEhBTF9BTV9JU09MQVRFCSgxPDxYVEhBTF9BTUJfSVNPTEFURSkKKyNkZWZpbmUgWFRIQUxfQU1fR1VBUkQJCSgxPDxYVEhBTF9BTUJfR1VBUkQpCisjaWYgMAorI2RlZmluZSBYVEhBTF9BTV9PUkRFUkVECSgxPDxYVEhBTF9BTUJfT1JERVJFRCkKKyNkZWZpbmUgWFRIQUxfQU1fRlVTRVdSSVRFUwkoMTw8WFRIQUxfQU1CX0ZVU0VXUklURVMpCisjZGVmaW5lIFhUSEFMX0FNX0NPSEVSRU5UCSgxPDxYVEhBTF9BTUJfQ09IRVJFTlQpCisjZGVmaW5lIFhUSEFMX0FNX1RSVVNURUQJKDE8PFhUSEFMX0FNQl9UUlVTVEVEKQorI2RlZmluZSBYVEhBTF9BTV9QUkVGRVRDSAkoMTw8WFRIQUxfQU1CX1BSRUZFVENIKQorI2RlZmluZSBYVEhBTF9BTV9TVFJFQU0JCSgxPDxYVEhBTF9BTUJfU1RSRUFNKQorI2VuZGlmIC8qMCovCisKKy8qCisgKiAgQWxsb3dlZCBBY2Nlc3MgTW9kZXMgKGJpdCBjb21iaW5hdGlvbnMpLgorICoKKyAqICBDb2x1bW5zIGFyZToKKyAqICAiRk9HSVdBQ0UiCisgKglBY2Nlc3MgbW9kZSBiaXRzIChzZWUgWFRIQUxfQU1CX3h4eCBhYm92ZSkuCisgKgk8bGV0dGVyPiA9IGJpdCBpcyBzZXQKKyAqCSctJyAgICAgID0gYml0IGlzIGNsZWFyCisgKgknLicgICAgICA9IGJpdCBpcyBpcnJlbGV2YW50IC8gZG9uJ3QgY2FyZSwgYXMgZm9sbG93czoKKyAqCQkJRT0xIG1ha2VzIGFsbCBvdGhlcnMgaXJyZWxldmFudAorICoJCQlXLEYgcmVsZXZhbnQgb25seSBmb3Igc3RvcmVzCisgKiAgIjIzNDUiCisgKglJbmRpY2F0ZXMgd2hpY2ggWHRlbnNhIHJlbGVhc2VzIHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqCWFjY2VzcyBtb2RlLiAgUmVsZWFzZXMgZm9yIGVhY2ggY2hhcmFjdGVyIGNvbHVtbiBhcmU6CisgKgkJMiA9IHByaW9yIHRvIFQxMDIwLjI6ICAgVDEwMTUgKFYxLjUpLCBUMTAyMC4wLCBUMTAyMC4xCisgKgkJMyA9IFQxMDIwLjIgYW5kIGxhdGVyOiAgVDEwMjAuMissIFQxMDMwCisgKgkJNCA9IFQxMDQwCisgKgkJNSA9IFQxMDUwIChtYXliZSkKKyAqCUFuZCB0aGUgY2hhcmFjdGVyIGNvbHVtbiBjb250ZW50cyBhcmU6CisgKgkJPG51bWJlcj4gPSBzdXBwb3J0IGJ5IHJlbGVhc2UocykKKyAqCQkiLiIgPSB1bnN1cHBvcnRlZCBieSByZWxlYXNlKHMpCisgKgkJIj8iID0gc3VwcG9ydCB1bmtub3duCisgKi8KKwkJCQkJLyogRk9HSVdBQ0UgMjM0NSAqLworLyogIEZvciBpbnN0cnVjdGlvbiBmZXRjaDogICovCisjZGVmaW5lIFhUSEFMX0ZBTV9FWENFUFRJT04JMHgwMDEJLyogLi4uLi4uLkUgMjM0NSBleGNlcHRpb24gKi8KKyNkZWZpbmUgWFRIQUxfRkFNX0lTT0xBVEUJMHgwMTIJLyogLi0tSS4tQy0gLi4uLiBpc29sYXRlICovCisjZGVmaW5lIFhUSEFMX0ZBTV9CWVBBU1MJMHgwMDAJLyogLi0tLS4tLS0gMjM0NSBieXBhc3MgKi8KKyNkZWZpbmUgWFRIQUxfRkFNX05BQ0FDSEVECTB4MDAyCS8qIC4tLS0uLUMtIC4uLi4gY2FjaGVkIG5vLWFsbG9jYXRlIChmcm96ZW4pICovCisjZGVmaW5lIFhUSEFMX0ZBTV9DQUNIRUQJMHgwMDYJLyogLi0tLS5BQy0gMjM0NSBjYWNoZWQgKi8KKy8qICBGb3IgZGF0YSBsb2FkOiAgKi8KKyNkZWZpbmUgWFRIQUxfTEFNX0VYQ0VQVElPTgkweDAwMQkvKiAuLi4uLi4uRSAyMzQ1IGV4Y2VwdGlvbiAqLworI2RlZmluZSBYVEhBTF9MQU1fSVNPTEFURQkweDAxMgkvKiAuLS1JLi1DLSAyMzQ1IGlzb2xhdGUgKi8KKyNkZWZpbmUgWFRIQUxfTEFNX0JZUEFTUwkweDAwMAkvKiAuTy0tLi0tLSAyLi4uIGJ5cGFzcyBzcGVjdWxhdGl2ZSAqLworI2RlZmluZSBYVEhBTF9MQU1fQllQQVNTRwkweDAyMAkvKiAuT0ctLi0tLSAuMzQ1IGJ5cGFzcyBndWFyZGVkICovCisjZGVmaW5lIFhUSEFMX0xBTV9OQUNBQ0hFRAkweDAwMgkvKiAuTy0tLi1DLSAyLi4uIGNhY2hlZCBuby1hbGxvY2F0ZSBzcGVjdWxhdGl2ZSAqLworI2RlZmluZSBYVEhBTF9MQU1fTkFDQUNIRURHCTB4MDIyCS8qIC5PRy0uLUMtIC4zNDUgY2FjaGVkIG5vLWFsbG9jYXRlIGd1YXJkZWQgKi8KKyNkZWZpbmUgWFRIQUxfTEFNX0NBQ0hFRAkweDAwNgkvKiAuLS0tLkFDLSAyMzQ1IGNhY2hlZCBzcGVjdWxhdGl2ZSAqLworI2RlZmluZSBYVEhBTF9MQU1fQ0FDSEVERwkweDAyNgkvKiAuP0ctLkFDLSAuLi4uIGNhY2hlZCBndWFyZGVkICovCisvKiAgRm9yIGRhdGEgc3RvcmU6ICAqLworI2RlZmluZSBYVEhBTF9TQU1fRVhDRVBUSU9OCTB4MDAxCS8qIC4uLi4uLi5FIDIzNDUgZXhjZXB0aW9uICovCisjZGVmaW5lIFhUSEFMX1NBTV9JU09MQVRFCTB4MDMyCS8qIC4tR0ktLUMtIDIzNDUgaXNvbGF0ZSAqLworI2RlZmluZSBYVEhBTF9TQU1fQllQQVNTCTB4MDI4CS8qIC1PRy1XLS0tIDIzNDUgYnlwYXNzICovCisvKmVmaW5lIFhUSEFMX1NBTV9CWVBBU1NGCTB4MDI4Ki8JLyogRi1HLVctLS0gLi4uPyBieXBhc3Mgd3JpdGUtY29tYmluZWQgKi8KKyNkZWZpbmUgWFRIQUxfU0FNX1dSSVRFVEhSVQkweDAyQQkvKiAtT0ctVy1DLSAyMzQ/IHdyaXRldGhyb3VnaCAqLworLyplZmluZSBYVEhBTF9TQU1fV1JJVEVUSFJVRgkweDAyQSovCS8qIEYtRy1XLUMtIC4uLjUgd3JpdGV0aHJvdWdoIHdyaXRlLWNvbWJpbmVkICovCisjZGVmaW5lIFhUSEFMX1NBTV9XUklURUFMTE9DCTB4MDJFCS8qIC1PRy1XQUMtIC4uLj8gd3JpdGV0aHJvdWdoLWFsbG9jYXRlICovCisvKmVmaW5lIFhUSEFMX1NBTV9XUklURUFMTE9DRgkweDAyRSovCS8qIEYtRy1XQUMtIC4uLj8gd3JpdGV0aHJvdWdoLWFsbG9jYXRlIHdyaXRlLWNvbWJpbmVkICovCisjZGVmaW5lIFhUSEFMX1NBTV9XUklURUJBQ0sJMHgwMjYJLyogRi1HLS1BQy0gLi4uNSB3cml0ZWJhY2sgKi8KKworI2lmIDAKKy8qCisgICAgQ2FjaGUgYXR0cmlidXRlIGVuY29kaW5nIGZvciBDQUNIRUFUVFIgKHBlciBJU0EpOgorICAgIChOb3RlOiAgaWYgdGhpcyBkaWZmZXJzIGZyb20gSVNBIFJlZiBNYW51YWwsIElTQSBoYXMgcHJlY2VkZW5jZSkKKworCUluc3QtZmV0Y2hlcwlMb2FkcwkJU3RvcmVzCisJLS0tLS0tLS0tLS0tLQktLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLQorMHgwCUZDQV9FWENFUFRJT04gID9MQ0FfTkFDQUNIRURfRyoJU0NBX1dSSVRFVEhSVQkidW5jYWNoZWQiCisweDEJRkNBX0NBQ0hFRAlMQ0FfQ0FDSEVECVNDQV9XUklURVRIUlUJY2FjaGVkCisweDIJRkNBX0JZUEFTUwlMQ0FfQllQQVNTX0cqCVNDQV9CWVBBU1MJYnlwYXNzCisweDMJRkNBX0NBQ0hFRAlMQ0FfQ0FDSEVECVNDQV9XUklURUFMTE9DRgl3cml0ZS1hbGxvY2F0ZQorCQkgICAgIG9yIExDQV9FWENFUFRJT04JU0NBX0VYQ0VQVElPTgkoaWYgdW5pbXBsZW1lbnRlZCkKKzB4NAlGQ0FfQ0FDSEVECUxDQV9DQUNIRUQJU0NBX1dSSVRFQkFDSwl3cml0ZS1iYWNrCisJCSAgICAgb3IgTENBX0VYQ0VQVElPTglTQ0FfRVhDRVBUSU9OCShpZiB1bmltcGxlbWVudGVkKQorMHg1Li5ECUZDQV9FWENFUFRJT04JTENBX0VYQ0VQVElPTglTQ0FfRVhDRVBUSU9OCShyZXNlcnZlZCkKKzB4RQlGQ0FfRVhDRVBUSU9OCUxDQV9JU09MQVRFCVNDQV9JU09MQVRFCWlzb2xhdGUKKzB4RglGQ0FfRVhDRVBUSU9OCUxDQV9FWENFUFRJT04JU0NBX0VYQ0VQVElPTglpbGxlZ2FsCisgICAgICogIFByaW9yIHRvIFQxMDIwLjI/LCBndWFyZCBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQsIHRoaXMgZGVmYXVsdGVkIHRvIHNwZWN1bGF0aXZlIChubyBfRykKKyovCisjZW5kaWYgLyowKi8KKworCisjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAmJiAhZGVmaW5lZChfTk9DTEFOR1VBR0UpCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAJCQkgICAgIEhBTAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ29uc3RhbnQgdG8gYmUgY2hlY2tlZCBpbiBidWlsZCA9IChYVEhBTF9NQUpPUl9SRVY8PDE2KXxYVEhBTF9NSU5PUl9SRVYgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfcmV2X25vOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAJCQlQcm9jZXNzb3IgU3RhdGUKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBzYXZlICYgcmVzdG9yZSB0aGUgZXh0cmEgcHJvY2Vzc29yIHN0YXRlICovCitleHRlcm4gdm9pZCB4dGhhbF9zYXZlX2V4dHJhKHZvaWQgKmJhc2UpOworZXh0ZXJuIHZvaWQgeHRoYWxfcmVzdG9yZV9leHRyYSh2b2lkICpiYXNlKTsKKworZXh0ZXJuIHZvaWQgeHRoYWxfc2F2ZV9jcHJlZ3Modm9pZCAqYmFzZSwgaW50KTsKK2V4dGVybiB2b2lkIHh0aGFsX3Jlc3RvcmVfY3ByZWdzKHZvaWQgKmJhc2UsIGludCk7CisKKy8qZXh0ZXJuIHZvaWQgeHRoYWxfc2F2ZV9hbGxfZXh0cmEodm9pZCAqYmFzZSk7Ki8KKy8qZXh0ZXJuIHZvaWQgeHRoYWxfcmVzdG9yZV9hbGxfZXh0cmEodm9pZCAqYmFzZSk7Ki8KKworLyogc3BhY2UgZm9yIHByb2Nlc3NvciBzdGF0ZSAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9leHRyYV9zaXplOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9leHRyYV9hbGlnbjsKKy8qIHNwYWNlIGZvciBUSUUgcmVnaXN0ZXIgZmlsZXMgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfY3ByZWdzX3NpemVbWFRIQUxfTUFYX0NQU107CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IFh0aGFsX2NwcmVnc19hbGlnbltYVEhBTF9NQVhfQ1BTXTsKKworLyogdG90YWwgb2Ygc3BhY2UgZm9yIHRoZSBwcm9jZXNzb3Igc3RhdGUgKGZvciBUb3IyKSAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9hbGxfZXh0cmFfc2l6ZTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfYWxsX2V4dHJhX2FsaWduOworCisvKiBpbml0aWFsaXplIHRoZSBleHRyYSBwcm9jZXNzb3IgKi8KKy8qZXh0ZXJuIHZvaWQgeHRoYWxfaW5pdF9leHRyYSh2b2lkKTsqLworLyogaW5pdGlhbGl6ZSB0aGUgVElFIGNvcHJvY2Vzc29yICovCisvKmV4dGVybiB2b2lkIHh0aGFsX2luaXRfY3AoaW50KTsqLworCisvKiBpbml0aWFsaXplIHRoZSBleHRyYSBwcm9jZXNzb3IgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2luaXRfbWVtX2V4dHJhKHZvaWQgKik7CisvKiBpbml0aWFsaXplIHRoZSBUSUUgY29wcm9jZXNzb3IgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2luaXRfbWVtX2NwKHZvaWQgKiwgaW50KTsKKworLyogdmFsaWRhdGUgJiBpbnZhbGlkYXRlIHRoZSBUSUUgcmVnaXN0ZXIgZmlsZSAqLworZXh0ZXJuIHZvaWQgeHRoYWxfdmFsaWRhdGVfY3AoaW50KTsKK2V4dGVybiB2b2lkIHh0aGFsX2ludmFsaWRhdGVfY3AoaW50KTsKKworLyogdGhlIG51bWJlciBvZiBUSUUgY29wcm9jZXNzb3JzIGNvbnRpZ3VvdXMgZnJvbSB6ZXJvIChmb3IgVG9yMikgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfbnVtX2NvcHJvY2Vzc29yczsKKworLyogYWN0dWFsIG51bWJlciBvZiBjb3Byb2Nlc3NvcnMgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2NwX251bTsKKy8qIGluZGV4IG9mIGhpZ2hlc3QgbnVtYmVyZWQgY29wcm9jZXNzb3IsIHBsdXMgb25lICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9jcF9tYXg7CisvKiBpbmRleCBvZiBoaWdoZXN0IGFsbG93ZWQgY29wcm9jZXNzb3IgbnVtYmVyLCBwZXIgY2ZnLCBwbHVzIG9uZSAqLworLypleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9jcF9tYXhjZmc7Ki8KKy8qIGJpdG1hc2sgb2Ygd2hpY2ggY29wcm9jZXNzb3JzIGFyZSBwcmVzZW50ICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9jcF9tYXNrOworCisvKiByZWFkIGFuZCB3cml0ZSBjcGVuYWJsZSByZWdpc3RlciAqLworZXh0ZXJuIHZvaWQgeHRoYWxfc2V0X2NwZW5hYmxlKHVuc2lnbmVkKTsKK2V4dGVybiB1bnNpZ25lZCB4dGhhbF9nZXRfY3BlbmFibGUodm9pZCk7CisKKy8qIHJlYWQgJiB3cml0ZSBleHRyYSBzdGF0ZSByZWdpc3RlciAqLworLypleHRlcm4gaW50IHh0aGFsX3JlYWRfZXh0cmEodm9pZCAqYmFzZSwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCAqdmFsdWUpOyovCisvKmV4dGVybiBpbnQgeHRoYWxfd3JpdGVfZXh0cmEodm9pZCAqYmFzZSwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWx1ZSk7Ki8KKworLyogcmVhZCAmIHdyaXRlIGEgVElFIGNvcHJvY2Vzc29yIHJlZ2lzdGVyICovCisvKmV4dGVybiBpbnQgeHRoYWxfcmVhZF9jcHJlZyh2b2lkICpiYXNlLCBpbnQgY3AsIHVuc2lnbmVkIHJlZywgdW5zaWduZWQgKnZhbHVlKTsqLworLypleHRlcm4gaW50IHh0aGFsX3dyaXRlX2NwcmVnKHZvaWQgKmJhc2UsIGludCBjcCwgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCB2YWx1ZSk7Ki8KKworLyogcmV0dXJuIGNvcHJvY2Vzc29yIG51bWJlciBiYXNlZCBvbiByZWdpc3RlciAqLworLypleHRlcm4gaW50IHh0aGFsX3doaWNoX2NwKHVuc2lnbmVkIHJlZyk7Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAJCQkJSW50ZXJydXB0cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdGhlIG51bWJlciBvZiBpbnRlcnJ1cHQgbGV2ZWxzICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1faW50bGV2ZWxzOworLyogdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1faW50ZXJydXB0czsKKworLyogbWFzayBmb3IgbGV2ZWwgb2YgaW50ZXJydXB0cyAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9pbnRsZXZlbF9tYXNrW1hUSEFMX01BWF9JTlRMRVZFTFNdOworLyogbWFzayBmb3IgbGV2ZWwgMCB0byBOIGludGVycnVwdHMgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgWHRoYWxfaW50bGV2ZWxfYW5kYmVsb3dfbWFza1tYVEhBTF9NQVhfSU5UTEVWRUxTXTsKKworLyogbGV2ZWwgb2YgZWFjaCBpbnRlcnJ1cHQgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2ludGxldmVsW1hUSEFMX01BWF9JTlRFUlJVUFRTXTsKKworLyogdHlwZSBwZXIgaW50ZXJydXB0ICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9pbnR0eXBlW1hUSEFMX01BWF9JTlRFUlJVUFRTXTsKKworLyogbWFza3Mgb2YgZWFjaCB0eXBlIG9mIGludGVycnVwdCAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBYdGhhbF9pbnR0eXBlX21hc2tbWFRIQUxfTUFYX0lOVFRZUEVTXTsKKworLyogaW50ZXJydXB0IG51bWJlcnMgYXNzaWduZWQgdG8gZWFjaCB0aW1lciBpbnRlcnJ1cHQgKi8KK2V4dGVybiBjb25zdCBpbnQgWHRoYWxfdGltZXJfaW50ZXJydXB0W1hUSEFMX01BWF9USU1FUlNdOworCisvKioqICBWaXJ0dWFsIGludGVycnVwdCBwcmlvcml0aXphdGlvbjogICoqKi8KKworLyogIENvbnZlcnQgYmV0d2VlbiBpbnRlcnJ1cHQgbGV2ZWxzIChhcyBwZXIgUFMuSU5UTEVWRUwpIGFuZCB2aXJ0dWFsIGludGVycnVwdCBwcmlvcml0aWVzOiAgKi8KK2V4dGVybiB1bnNpZ25lZAl4dGhhbF92cHJpX3RvX2ludGxldmVsKHVuc2lnbmVkIHZwcmkpOworZXh0ZXJuIHVuc2lnbmVkCXh0aGFsX2ludGxldmVsX3RvX3ZwcmkodW5zaWduZWQgaW50bGV2ZWwpOworCisvKiAgRW5hYmxlcy9kaXNhYmxlcyBnaXZlbiBzZXQgKG1hc2spIG9mIGludGVycnVwdHM7IHJldHVybnMgcHJldmlvdXMgZW5hYmxlZC1tYXNrIG9mIGFsbCBpbnRzOiAgKi8KK2V4dGVybiB1bnNpZ25lZAl4dGhhbF9pbnRfZW5hYmxlKHVuc2lnbmVkKTsKK2V4dGVybiB1bnNpZ25lZAl4dGhhbF9pbnRfZGlzYWJsZSh1bnNpZ25lZCk7CisKKy8qICBTZXQvZ2V0IHZpcnR1YWwgcHJpb3JpdHkgb2YgYW4gaW50ZXJydXB0OiAgKi8KK2V4dGVybiBpbnQJeHRoYWxfc2V0X2ludF92cHJpKGludCBpbnRudW0sIGludCB2cHJpKTsKK2V4dGVybiBpbnQJeHRoYWxfZ2V0X2ludF92cHJpKGludCBpbnRudW0pOworCisvKiAgU2V0L2dldCBpbnRlcnJ1cHQgbG9ja291dCBsZXZlbCBmb3IgZXhjbHVzaXZlIGFjY2VzcyB0byB2aXJ0dWFsIHByaW9yaXR5IGRhdGEgc3RydWN0dXJlczogICovCitleHRlcm4gdm9pZAl4dGhhbF9zZXRfdnByaV9sb2NrbGV2ZWwodW5zaWduZWQgaW50bGV2ZWwpOworZXh0ZXJuIHVuc2lnbmVkCXh0aGFsX2dldF92cHJpX2xvY2tsZXZlbCh2b2lkKTsKKworLyogIFNldC9nZXQgY3VycmVudCB2aXJ0dWFsIGludGVycnVwdCBwcmlvcml0eTogICovCitleHRlcm4gdW5zaWduZWQJeHRoYWxfc2V0X3ZwcmkodW5zaWduZWQgdnByaSk7CitleHRlcm4gdW5zaWduZWQJeHRoYWxfZ2V0X3ZwcmkodW5zaWduZWQgdnByaSk7CitleHRlcm4gdW5zaWduZWQJeHRoYWxfc2V0X3ZwcmlfaW50bGV2ZWwodW5zaWduZWQgaW50bGV2ZWwpOworZXh0ZXJuIHVuc2lnbmVkCXh0aGFsX3NldF92cHJpX2xvY2sodm9pZCk7CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIAkJCUdlbmVyaWMgSW50ZXJydXB0IFRyYW1wb2xpbmluZyBTdXBwb3J0CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHZvaWQgKFh0SGFsVm9pZEZ1bmMpKHZvaWQpOworCisvKgorICogIEJpdG1hc2sgb2YgaW50ZXJydXB0cyBjdXJyZW50bHkgdHJhbXBvbGluaW5nIGRvd246CisgKi8KK2V4dGVybiB1bnNpZ25lZCBYdGhhbF90cmFtX3BlbmRpbmc7CisKKy8qCisgKiAgQml0bWFzayBvZiB3aGljaCBpbnRlcnJ1cHRzIGN1cnJlbnRseSB0cmFtcG9saW5pbmcgZG93bgorICogIHN5bmNocm9ub3VzbHkgYXJlIGFjdHVhbGx5IGVuYWJsZWQ7IHRoaXMgYml0bWFzayBpcyBuZWNlc3NhcnkKKyAqICBiZWNhdXNlIElOVEVOQUJMRSBjYW5ub3QgaG9sZCB0aGF0IHN0YXRlIChzeW5jLXRyYW1wb2xpbmluZworICogIGludGVycnVwdHMgbXVzdCBiZSBrZXB0IGRpc2FibGVkIHdoaWxlIHRyYW1wb2xpbmluZyk7CisgKiAgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGFueSBiaXQgc2V0IGhlcmUgaXMgbm90IHNldAorICogIGluIElOVEVOQUJMRSwgYW5kIHZpY2UtdmVyc2E7IG9uY2UgYSBzeW5jLXRyYW1wb2xpbmUgaXMKKyAqICBoYW5kbGVkIChhdCBsZXZlbCBvbmUpLCBpdHMgZW5hYmxlIGJpdCBtdXN0IGJlIG1vdmVkIGZyb20KKyAqICBoZXJlIHRvIElOVEVOQUJMRToKKyAqLworZXh0ZXJuIHVuc2lnbmVkIFh0aGFsX3RyYW1fZW5hYmxlZDsKKworLyoKKyAqICBCaXRtYXNrIG9mIGludGVycnVwdHMgY29uZmlndXJlZCBmb3Igc3luYyB0cmFtcG9saW5pbmc6CisgKi8KK2V4dGVybiB1bnNpZ25lZCBYdGhhbF90cmFtX3N5bmM7CisKKworLyogIFRyYW1wb2xpbmUgc3VwcG9ydCBmdW5jdGlvbnM6ICAqLworZXh0ZXJuIHVuc2lnbmVkICB4dGhhbF90cmFtX3BlbmRpbmdfdG9fc2VydmljZSggdm9pZCApOworZXh0ZXJuIHZvaWQgICAgICB4dGhhbF90cmFtX2RvbmUoIHVuc2lnbmVkIHNlcnZpY2VkX21hc2sgKTsKK2V4dGVybiBpbnQgICAgICAgeHRoYWxfdHJhbV9zZXRfc3luYyggaW50IGludG51bSwgaW50IHN5bmMgKTsKK2V4dGVybiBYdEhhbFZvaWRGdW5jKiB4dGhhbF9zZXRfdHJhbV90cmlnZ2VyX2Z1bmMoIFh0SGFsVm9pZEZ1bmMgKnRyaWdnZXJfZm4gKTsKKworLyogIElOVEVOQUJMRSxJTlRSRUFELElOVFNFVCxJTlRDTEVBUiByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zOiAgKi8KK2V4dGVybiB1bnNpZ25lZCAgeHRoYWxfZ2V0X2ludGVuYWJsZSggdm9pZCApOworZXh0ZXJuIHZvaWQgICAgICB4dGhhbF9zZXRfaW50ZW5hYmxlKCB1bnNpZ25lZCApOworZXh0ZXJuIHVuc2lnbmVkICB4dGhhbF9nZXRfaW50cmVhZCggdm9pZCApOworZXh0ZXJuIHZvaWQgICAgICB4dGhhbF9zZXRfaW50c2V0KCB1bnNpZ25lZCApOworZXh0ZXJuIHZvaWQgICAgICB4dGhhbF9zZXRfaW50Y2xlYXIoIHVuc2lnbmVkICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAJCQkJUmVnaXN0ZXIgV2luZG93cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogbnVtYmVyIG9mIHJlZ2lzdGVycyBpbiByZWdpc3RlciB3aW5kb3cgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX251bV9hcmVnczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9hcmVnc19sb2cyOworCisvKiAgVGhpcyBzcGlsbCBhbnkgbGl2ZSByZWdpc3RlciB3aW5kb3dzIChvdGhlciB0aGFuIHRoZSBjYWxsZXIncyk6ICAqLworZXh0ZXJuIHZvaWQgICAgICB4dGhhbF93aW5kb3dfc3BpbGwoIHZvaWQgKTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIAkJCQlDYWNoZQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogc2l6ZSBvZiB0aGUgY2FjaGUgbGluZXMgaW4gbG9nMihieXRlcykgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2ljYWNoZV9saW5ld2lkdGg7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9kY2FjaGVfbGluZXdpZHRoOworLyogc2l6ZSBvZiB0aGUgY2FjaGUgbGluZXMgaW4gYnl0ZXMgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBYdGhhbF9pY2FjaGVfbGluZXNpemU7CitleHRlcm4gY29uc3QgdW5zaWduZWQgc2hvcnQgWHRoYWxfZGNhY2hlX2xpbmVzaXplOworLyogbnVtYmVyIG9mIGNhY2hlIHNldHMgaW4gbG9nMihsaW5lcyBwZXIgd2F5KSAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaWNhY2hlX3NldHdpZHRoOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZGNhY2hlX3NldHdpZHRoOworLyogY2FjaGUgc2V0IGFzc29jaWF0aXZpdHkgKG51bWJlciBvZiB3YXlzKSAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaWNhY2hlX3dheXM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9kY2FjaGVfd2F5czsKKy8qIHNpemUgb2YgdGhlIGNhY2hlcyBpbiBieXRlcyAod2F5cyAqIDJeKGxpbmV3aWR0aCArIHNldHdpZHRoKSkgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2ljYWNoZV9zaXplOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfZGNhY2hlX3NpemU7CisvKiBjYWNoZSBmZWF0dXJlcyAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZGNhY2hlX2lzX3dyaXRlYmFjazsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2ljYWNoZV9saW5lX2xvY2thYmxlOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZGNhY2hlX2xpbmVfbG9ja2FibGU7CisKKy8qIGNhY2hlIGF0dHJpYnV0ZSByZWdpc3RlciBjb250cm9sICh1c2VkIGJ5IG90aGVyIEhBTCByb3V0aW5lcykgKi8KK2V4dGVybiB1bnNpZ25lZCB4dGhhbF9nZXRfY2FjaGVhdHRyKCB2b2lkICk7CitleHRlcm4gdW5zaWduZWQgeHRoYWxfZ2V0X2ljYWNoZWF0dHIoIHZvaWQgKTsKK2V4dGVybiB1bnNpZ25lZCB4dGhhbF9nZXRfZGNhY2hlYXR0ciggdm9pZCApOworZXh0ZXJuIHZvaWQgICAgIHh0aGFsX3NldF9jYWNoZWF0dHIoIHVuc2lnbmVkICk7CitleHRlcm4gdm9pZCAgICAgeHRoYWxfc2V0X2ljYWNoZWF0dHIoIHVuc2lnbmVkICk7CitleHRlcm4gdm9pZCAgICAgeHRoYWxfc2V0X2RjYWNoZWF0dHIoIHVuc2lnbmVkICk7CisKKy8qIGluaXRpYWxpemUgY2FjaGUgc3VwcG9ydCAobXVzdCBiZSBjYWxsZWQgb25jZSBhdCBzdGFydHVwLCBiZWZvcmUgYWxsIG90aGVyIGNhY2hlIGNhbGxzKSAqLworLypleHRlcm4gdm9pZCB4dGhhbF9jYWNoZV9zdGFydGluaXQoIHZvaWQgKTsqLworLyogcmVzZXQgY2FjaGVzICovCisvKmV4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9yZXNldCggdm9pZCApOyovCisvKmV4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9yZXNldCggdm9pZCApOyovCisvKiBlbmFibGUgY2FjaGVzICovCitleHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfZW5hYmxlKCB2b2lkICk7CS8qIERFUFJFQ0FURUQgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9lbmFibGUoIHZvaWQgKTsJLyogREVQUkVDQVRFRCAqLworLyogZGlzYWJsZSBjYWNoZXMgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9kaXNhYmxlKCB2b2lkICk7CS8qIERFUFJFQ0FURUQgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9kaXNhYmxlKCB2b2lkICk7CS8qIERFUFJFQ0FURUQgKi8KKworLyogaW52YWxpZGF0ZSB0aGUgY2FjaGVzICovCitleHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfYWxsX2ludmFsaWRhdGUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9hbGxfaW52YWxpZGF0ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgeHRoYWxfaWNhY2hlX3JlZ2lvbl9pbnZhbGlkYXRlKCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaXplICk7CitleHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfcmVnaW9uX2ludmFsaWRhdGUoIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNpemUgKTsKK2V4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9saW5lX2ludmFsaWRhdGUodm9pZCAqYWRkcik7CitleHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfbGluZV9pbnZhbGlkYXRlKHZvaWQgKmFkZHIpOworLyogd3JpdGUgZGlydHkgZGF0YSBiYWNrICovCitleHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfYWxsX3dyaXRlYmFjayggdm9pZCApOworZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX3JlZ2lvbl93cml0ZWJhY2soIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNpemUgKTsKK2V4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9saW5lX3dyaXRlYmFjayh2b2lkICphZGRyKTsKKy8qIHdyaXRlIGRpcnR5IGRhdGEgYmFjayBhbmQgaW52YWxpZGF0ZSAqLworZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2FsbF93cml0ZWJhY2tfaW52KCB2b2lkICk7CitleHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfcmVnaW9uX3dyaXRlYmFja19pbnYoIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNpemUgKTsKK2V4dGVybiB2b2lkIHh0aGFsX2RjYWNoZV9saW5lX3dyaXRlYmFja19pbnYodm9pZCAqYWRkcik7CisvKiBwcmVmZXRjaCBhbmQgbG9jayBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlIGludG8gY2FjaGUgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9yZWdpb25fbG9jayggdm9pZCAqYWRkciwgdW5zaWduZWQgc2l6ZSApOworZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX3JlZ2lvbl9sb2NrKCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaXplICk7CitleHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfbGluZV9sb2NrKHZvaWQgKmFkZHIpOworZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2xpbmVfbG9jayh2b2lkICphZGRyKTsKKy8qIHVubG9jayBmcm9tIGNhY2hlICovCitleHRlcm4gdm9pZCB4dGhhbF9pY2FjaGVfYWxsX3VubG9jayggdm9pZCApOworZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2FsbF91bmxvY2soIHZvaWQgKTsKK2V4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9yZWdpb25fdW5sb2NrKCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaXplICk7CitleHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfcmVnaW9uX3VubG9jayggdm9pZCAqYWRkciwgdW5zaWduZWQgc2l6ZSApOworZXh0ZXJuIHZvaWQgeHRoYWxfaWNhY2hlX2xpbmVfdW5sb2NrKHZvaWQgKmFkZHIpOworZXh0ZXJuIHZvaWQgeHRoYWxfZGNhY2hlX2xpbmVfdW5sb2NrKHZvaWQgKmFkZHIpOworCisKKy8qIHN5bmMgaWNhY2hlIGFuZCBtZW1vcnkgKi8KK2V4dGVybiB2b2lkIHh0aGFsX2ljYWNoZV9zeW5jKCB2b2lkICk7CisvKiBzeW5jIGRjYWNoZSBhbmQgbWVtb3J5ICovCitleHRlcm4gdm9pZCB4dGhhbF9kY2FjaGVfc3luYyggdm9pZCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIAkJCQlEZWJ1ZworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogIDEgaWYgZGVidWcgb3B0aW9uIGNvbmZpZ3VyZWQsIDAgaWYgbm90OiAgKi8KK2V4dGVybiBjb25zdCBpbnQgWHRoYWxfZGVidWdfY29uZmlndXJlZDsKKworLyogIE51bWJlciBvZiBpbnN0cnVjdGlvbiBhbmQgZGF0YSBicmVhayByZWdpc3RlcnM6ICAqLworZXh0ZXJuIGNvbnN0IGludCBYdGhhbF9udW1faWJyZWFrOworZXh0ZXJuIGNvbnN0IGludCBYdGhhbF9udW1fZGJyZWFrOworCisvKiAgU2V0IChwbGFudCkgYW5kIHJlbW92ZSBzb2Z0d2FyZSBicmVha3BvaW50LCBib3RoIHN5bmNocm9uaXppbmcgY2FjaGU6ICAqLworZXh0ZXJuIHVuc2lnbmVkIGludCB4dGhhbF9zZXRfc29mdF9icmVhayh2b2lkICphZGRyKTsKK2V4dGVybiB2b2lkICAgICAgICAgeHRoYWxfcmVtb3ZlX3NvZnRfYnJlYWsodm9pZCAqYWRkciwgdW5zaWduZWQgaW50KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIAkJCQlEaXNhc3NlbWJsZXIKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qICBNYXggZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgcmV0dXJuIGJ1ZmZlciBmb3IgYSBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gKGhpbnQgb25seSk6ICAqLworI2RlZmluZSBYVEhBTF9ESVNBU01fQlVGU0laRQk4MAorCisvKiAgRGlzYXNzZW1ibHkgb3B0aW9uIGJpdHMgZm9yIHNlbGVjdGluZyB3aGF0IHRvIHJldHVybjogICovCisjZGVmaW5lIFhUSEFMX0RJU0FTTV9PUFRfQUREUgkweDAwMDEJLyogZGlzcGxheSBhZGRyZXNzICovCisjZGVmaW5lIFhUSEFMX0RJU0FTTV9PUFRfT1BIRVgJMHgwMDAyCS8qIGRpc3BsYXkgb3Bjb2RlIGJ5dGVzIGluIGhleCAqLworI2RlZmluZSBYVEhBTF9ESVNBU01fT1BUX09QQ09ERQkweDAwMDQJLyogZGlzcGxheSBvcGNvZGUgbmFtZSAobW5lbW9uaWMpICovCisjZGVmaW5lIFhUSEFMX0RJU0FTTV9PUFRfUEFSTVMJMHgwMDA4CS8qIGRpc3BsYXkgcGFyYW1ldGVycyAqLworI2RlZmluZSBYVEhBTF9ESVNBU01fT1BUX0FMTAkweDBGRkYJLyogZGlzcGxheSBldmVyeXRoaW5nICovCisKKy8qIHJvdXRpbmUgdG8gZ2V0IGEgc3RyaW5nIGZvciB0aGUgZGlzYXNzZW1ibGVkIGluc3RydWN0aW9uICovCitleHRlcm4gaW50IHh0aGFsX2Rpc2Fzc2VtYmxlKCB1bnNpZ25lZCBjaGFyICppbnN0cl9idWYsIHZvaWQgKnRndF9hZGRyLAorCQkgICAgICAgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBidWZsZW4sIHVuc2lnbmVkIG9wdGlvbnMgKTsKKworLyogcm91dGluZSB0byBnZXQgdGhlIHNpemUgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uIFJldHVybnMgMCBmb3IKKyAgIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gKi8KK2V4dGVybiBpbnQgeHRoYWxfZGlzYXNzZW1ibGVfc2l6ZSggdW5zaWduZWQgY2hhciAqaW5zdHJfYnVmICk7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAJCQkJQ29yZSBDb3VudGVyCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBjb3VudGVyIGluZm8gKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfY2NvdW50OwkvKiBzZXQgaWYgQ0NPVU5UIHJlZ2lzdGVyIHByZXNlbnQgKi8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9jY29tcGFyZTsJLyogbnVtYmVyIG9mIENDT01QQVJFbiByZWdpc3RlcnMgKi8KKworLyogZ2V0IENDT1VOVCByZWdpc3RlciAoaWYgbm90IHByZXNlbnQgcmV0dXJuIDApICovCitleHRlcm4gdW5zaWduZWQgeHRoYWxfZ2V0X2Njb3VudCh2b2lkKTsKKworLyogc2V0IGFuZCBnZXQgQ0NPTVBBUkVuIHJlZ2lzdGVycyAoaWYgbm90IHByZXNlbnQsIGdldCByZXR1cm5zIDApICovCitleHRlcm4gdm9pZCAgICAgeHRoYWxfc2V0X2Njb21wYXJlKGludCwgdW5zaWduZWQpOworZXh0ZXJuIHVuc2lnbmVkIHh0aGFsX2dldF9jY29tcGFyZShpbnQpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJSW5zdHJ1Y3Rpb24vRGF0YSBSQU0vUk9NIEFjY2VzcworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZXh0ZXJuIHZvaWQqIHh0aGFsX21lbWNweSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbGVuKTsKK2V4dGVybiB2b2lkKiB4dGhhbF9iY29weShjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgdW5zaWduZWQgbGVuKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNUCBTeW5jaHJvbml6YXRpb24KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gaW50ICAgICAgeHRoYWxfY29tcGFyZV9hbmRfc2V0KCBpbnQgKmFkZHIsIGludCB0ZXN0X3ZhbCwgaW50IGNvbXBhcmVfdmFsICk7CitleHRlcm4gdW5zaWduZWQgeHRoYWxfZ2V0X3ByaWQoIHZvaWQgKTsKKworLypleHRlcm4gY29uc3QgY2hhciAgWHRoYWxfaGF2ZV9zMzJjMWk7Ki8KK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfcHJpZDsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzY2VsbGFuZW91cworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfcmVsZWFzZV9tYWpvcjsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX3JlbGVhc2VfbWlub3I7CitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9yZWxlYXNlX25hbWU7CitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9yZWxlYXNlX2ludGVybmFsOworCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tZW1vcnlfb3JkZXI7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX3dpbmRvd2VkOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9kZW5zaXR5OworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9ib29sZWFuczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfbG9vcHM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX25zYTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfbWlubWF4OworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9zZXh0OworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9jbGFtcHM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX21hYzE2OworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9tdWwxNjsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfZnA7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX3NwZWN1bGF0aW9uOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9leGNlcHRpb25zOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfeGVhX3ZlcnNpb247CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX2ludGVycnVwdHM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX2hpZ2hsZXZlbF9pbnRlcnJ1cHRzOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9ubWk7CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydCBYdGhhbF9udW1fd3JpdGVidWZmZXJfZW50cmllczsKKworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfYnVpbGRfdW5pcXVlX2lkOworLyogIFJlbGVhc2UgaW5mbyBmb3IgaGFyZHdhcmUgdGFyZ2V0ZWQgYnkgc29mdHdhcmUgdXBncmFkZXM6ICAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaHdfY29uZmlnaWQwOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaHdfY29uZmlnaWQxOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaHdfcmVsZWFzZV9tYWpvcjsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2h3X3JlbGVhc2VfbWlub3I7CitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9od19yZWxlYXNlX25hbWU7CitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0ICBYdGhhbF9od19yZWxlYXNlX2ludGVybmFsOworCisKKy8qICBJbnRlcm5hbCBtZW1vcmllcy4uLiAgKi8KKworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbnVtX2luc3Ryb207CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1faW5zdHJhbTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9kYXRhcm9tOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbnVtX2RhdGFyYW07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9udW1feGxtaTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2luc3Ryb21fdmFkZHJbMV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9pbnN0cm9tX3BhZGRyWzFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaW5zdHJvbV9zaXplIFsxXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2luc3RyYW1fdmFkZHJbMV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9pbnN0cmFtX3BhZGRyWzFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfaW5zdHJhbV9zaXplIFsxXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2RhdGFyb21fdmFkZHJbMV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9kYXRhcm9tX3BhZGRyWzFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfZGF0YXJvbV9zaXplIFsxXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2RhdGFyYW1fdmFkZHJbMV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9kYXRhcmFtX3BhZGRyWzFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfZGF0YXJhbV9zaXplIFsxXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX3hsbWlfdmFkZHJbMV07CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF94bG1pX3BhZGRyWzFdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCAgWHRoYWxfeGxtaV9zaXplIFsxXTsKKworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBNYW5hZ2VtZW50IFVuaXQKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfc3Bhbm5pbmdfd2F5OworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9pZGVudGl0eV9tYXA7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9oYXZlX21pbWljX2NhY2hlYXR0cjsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfeGx0X2NhY2hlYXR0cjsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfY2FjaGVhdHRyOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV90bGJzOworCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tbXVfYXNpZF9iaXRzOwkJLyogMCAuLiA4ICovCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tbXVfYXNpZF9rZXJuZWw7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9tbXVfcmluZ3M7CQkvKiAxIC4uIDQgKHBlcmhhcHMgMCBpZiBubyBNTVUgYW5kL29yIG5vIHByb3RlY3Rpb24/KSAqLworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbW11X3JpbmdfYml0czsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX21tdV9zcl9iaXRzOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfbW11X2NhX2JpdHM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9tbXVfbWF4X3B0ZV9wYWdlX3NpemU7CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9tbXVfbWluX3B0ZV9wYWdlX3NpemU7CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2l0bGJfd2F5X2JpdHM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9pdGxiX3dheXM7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBYdGhhbF9pdGxiX2FyZl93YXlzOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfZHRsYl93YXlfYml0czsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2R0bGJfd2F5czsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2R0bGJfYXJmX3dheXM7CisKKy8qICBDb252ZXJ0IGJldHdlZW4gdmlydHVhbCBhbmQgcGh5c2ljYWwgYWRkcmVzc2VzICh0aHJvdWdoIHN0YXRpYyBtYXBzIG9ubHkpOiAgKi8KKy8qKiogV0FSTklORzogdGhlc2UgdHdvIGZ1bmN0aW9ucyBtYXkgZ28gYXdheSBpbiBhIGZ1dHVyZSByZWxlYXNlOyBkb24ndCBkZXBlbmQgb24gdGhlbSEgKioqLworZXh0ZXJuIGludCAgeHRoYWxfc3RhdGljX3YycCggdW5zaWduZWQgdmFkZHIsIHVuc2lnbmVkICpwYWRkcnAgKTsKK2V4dGVybiBpbnQgIHh0aGFsX3N0YXRpY19wMnYoIHVuc2lnbmVkIHBhZGRyLCB1bnNpZ25lZCAqdmFkZHJwLCB1bnNpZ25lZCBjYWNoZWQgKTsKKworI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqICAgRVhQRVJJTUVOVEFMIEFORCBURU5UQVRJVkUgT05MWSAgICoqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFhUSEFMX01NVV9QQUdFU1pfQ09VTlRfTUFYCTgJLyogbWF4aW11bSBudW1iZXIgb2YgZGlmZmVyZW50IHBhZ2Ugc2l6ZXMgKi8KK2V4dGVybiBjb25zdCBjaGFyCVh0aGFsX21tdV9wYWdlc3pfY291bnQ7CQkvKiAwIC4uIDgJCW51bWJlciBvZiBkaWZmZXJlbnQgcGFnZSBzaXplcyBjb25maWd1cmVkICovCisKKy8qICBOb3RlOiAgdGhlIGZvbGxvd2luZyB0YWJsZSBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgcGFnZSBzaXplcyBpbiBpbmNyZWFzaW5nIG9yZGVyOiAqLworZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfbW11X3BhZ2Vzel9sb2cyW1hUSEFMX01NVV9QQUdFU1pfQ09VTlRfTUFYXTsJLyogMTAgLi4gMjggKDAgcGFzdCBjb3VudCkgKi8KKworLyogIFNvcnRlZCAoaW5jcmVhc2luZykgdGFibGUgb2YgcGFnZSBzaXplcywgdGhhdCBpbmRleGVzIGludG8gdGhlIGFib3ZlIHRhYmxlOiAqLworZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfbW11X3BhZ2Vzel9zb3J0ZWRbWFRIQUxfTU1VX1BBR0VTWl9DT1VOVF9NQVhdOwkvKiAwIC4uIDcgKDAgcGFzdCBjb3VudCkgKi8KKworLyp1MzIJWHRoYWxfdmlydHVhbF9leGNlcHRpb25zOyovCS8qIGJpdG1hc2sgb2Ygd2hpY2ggZXhjZXB0aW9ucyBleGVjdXRlIGluIHZpcnR1YWwgbW9kZS4uLiAqLworCitleHRlcm4gY29uc3QgY2hhcglYdGhhbF9tbXVfcHRlX3BhZ2Vzel9sb2cyX21pbjsJLyogPz8gbWluaW11bSBwYWdlIHNpemUgaW4gUFRFcyAqLworZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfbW11X3B0ZV9wYWdlc3pfbG9nMl9tYXg7CS8qID8/IG1heGltdW0gcGFnZSBzaXplIGluIFBURXMgKi8KKworLyogIENhY2hlIEF0dHJpYnV0ZSBCaXRzIEltcGxlbWVudGVkIGJ5IHRoZSBDYWNoZSAocGFydCBvZiB0aGUgY2FjaGUgYWJzdHJhY3Rpb24pICovCitleHRlcm4gY29uc3QgY2hhcglYdGhhbF9pY2FjaGVfZmNhX2JpdHNfaW1wbGVtZW50ZWQ7CS8qIElUTEIvVVRMQiBvbmx5ISAqLworZXh0ZXJuIGNvbnN0IGNoYXIJWHRoYWxfZGNhY2hlX2xjYV9iaXRzX2ltcGxlbWVudGVkOwkvKiBEVExCL1VUTEIgb25seSEgKi8KK2V4dGVybiBjb25zdCBjaGFyCVh0aGFsX2RjYWNoZV9zY2FfYml0c19pbXBsZW1lbnRlZDsgCS8qIERUTEIvVVRMQiBvbmx5ISAqLworCisvKiAgUGVyIFRMQiBQYXJhbWV0ZXJzIChJbnN0cnVjdGlvbiwgRGF0YSwgVW5pZmllZCkgICovCitzdHJ1Y3QgWHRIYWxNbXVUbGIJWHRoYWxfaXRsYjsJLyogZGVzY3JpcHRpb24gb2YgTU1VIEktVExCIGdlbmVyaWMgZmVhdHVyZXMgKi8KK3N0cnVjdCBYdEhhbE1tdVRsYglYdGhhbF9kdGxiOwkvKiBkZXNjcmlwdGlvbiBvZiBNTVUgRC1UTEIgZ2VuZXJpYyBmZWF0dXJlcyAqLworc3RydWN0IFh0SGFsTW11VGxiCVh0aGFsX3V0bGI7CS8qIGRlc2NyaXB0aW9uIG9mIE1NVSBVLVRMQiBnZW5lcmljIGZlYXR1cmVzICovCisKKyNkZWZpbmUgWFRIQUxfTU1VX1dBWVNfTUFYCTgJLyogbWF4aW11bSBudW1iZXIgb2Ygd2F5cyAoYXNzb2NpYXRpdml0aWVzKSBmb3IgZWFjaCBUTEIgKi8KKworLyogIFN0cnVjdHVyZSBmb3IgY29tbW9uIGluZm9ybWF0aW9uIGRlc2NyaWJlZCBmb3IgZWFjaCBwb3NzaWJsZSBUTEIgKGluc3RydWN0aW9uLCBkYXRhIGFuZCB1bmlmaWVkKTogKi8KK3R5cGVkZWYgc3RydWN0IFh0SGFsTW11VGxiIHsKKyAgICB1OCAgCXZhX2JpdHM7CQkvKiAzMgkJKG51bWJlciBvZiB2aXJ0dWFsIGFkZHJlc3MgYml0cykgKi8KKyAgICB1OCAgCXBhX2JpdHM7CQkvKiAzMgkJKG51bWJlciBvZiBwaHlzaWNhbCBhZGRyZXNzIGJpdHMpICovCisgICAgYm9vbAl0bGJfdmFfaW5kZXhlZDsJCS8qIDEJKHNldCBpZiBUTEIgaXMgaW5kZXhlZCBieSB2aXJ0dWFsIGFkZHJlc3MpICovCisgICAgYm9vbAl0bGJfdmFfdGFnZ2VkOwkJLyogMAkoc2V0IGlmIFRMQiBpcyB0YWdnZWQgYnkgdmlydHVhbCBhZGRyZXNzKSAqLworICAgIGJvb2wJY2FjaGVfdmFfaW5kZXhlZDsJLyogMQkoc2V0IGlmIGNhY2hlIGlzIGluZGV4ZWQgYnkgdmlydHVhbCBhZGRyZXNzKSAqLworICAgIGJvb2wJY2FjaGVfdmFfdGFnZ2VkOwkvKiAwCShzZXQgaWYgY2FjaGUgaXMgdGFnZ2VkIGJ5IHZpcnR1YWwgYWRkcmVzcykgKi8KKyAgICAvKmJvb2wJKHdoZXRoZXIgcGFnZSB0YWJsZXMgYXJlIHRyYXZlcnNlZCBpbiB2YWRkciBzb3J0ZWQgb3JkZXIsIHBhZGRyIHNvcnRlZCBvcmRlciwgLi4uKSAqLworICAgIC8qdTgJKHNldCBvZiBhdmFpbGFibGUgcGFnZSBhdHRyaWJ1dGUgYml0cywgb3RoZXIgdGhhbiBjYWNoZSBhdHRyaWJ1dGUgYml0cyBkZWZpbmVkIGFib3ZlKSAqLworICAgIC8qdTMyCSh2YXJpb3VzIG1hc2tzIGZvciBwYWdlcywgTU1VIHRhYmxlL1RMQiBlbnRyaWVzLCBldGMuKSAqLworICAgIHU4ICAJd2F5X2NvdW50OwkJLyogMCAuLiA4CShudW1iZXIgb2Ygd2F5cywgYS5rLmEuIGFzc29jaWF0aXZpdGllcywgZm9yIHRoaXMgVExCKSAqLworICAgIFh0SGFsTW11VGxiV2F5ICoJd2F5c1tYVEhBTF9NTVVfV0FZU19NQVhdOwkvKiBwb2ludGVycyB0byBwZXItd2F5IHBhcm1zIGZvciBlYWNoIHdheSAqLworfSBYdEhhbE1tdVRsYjsKKworLyogIFBlciBUTEIgV2F5IChQZXIgQXNzb2NpYXRpdml0eSkgUGFyYW1ldGVycyAgKi8KK3R5cGVkZWYgc3RydWN0IFh0SGFsTW11VGxiV2F5IHsKKyAgICAgdTMyCWluZGV4X2NvdW50X2xvZzI7CS8qIDAgLi4gNCAqLworICAgICB1MzIJcGFnZXN6X21hc2s7CQkvKiAwIC4uIDJecGFnZXN6X2NvdW50IC0gMQkoZWFjaCBiaXQgY29ycmVzcG9uZHMgdG8gYSBzaXplICovCisJCQkJCS8qCQlkZWZpbmVkIGluIHRoZSBYdGhhbF9tbXVfcGFnZXN6X2xvZzJbXSB0YWJsZSkgKi8KKyAgICAgdTMyCXZwbl9jb25zdF9tYXNrOworICAgICB1MzIJdnBuX2NvbnN0X3ZhbHVlOworICAgICB1NjQJcHBuX2NvbnN0X21hc2s7CQkvKiBmdXR1cmUgbWF5IHN1cHBvcnQgcGFfYml0cyA+IDMyICovCisgICAgIHU2NAlwcG5fY29uc3RfdmFsdWU7CisgICAgIHUzMglwcG5faWRfbWFzazsJCS8qIHBhZGRyIGJpdHMgdGFrZW4gZGlyZWN0bHkgZnJvbSB2YWRkciAqLworICAgICBib29sCWJhY2tnbmRfbWF0Y2g7CQkvKiAwIG9yIDEgKi8KKyAgICAgLyogIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBYVEhBTF9DQUNIRV94eHggYml0czogKi8KKyAgICAgdTggCWZjYV9jb25zdF9tYXNrOwkJLyogSVRMQi9VVExCIG9ubHkhICovCisgICAgIHU4IAlmY2FfY29uc3RfdmFsdWU7CS8qIElUTEIvVVRMQiBvbmx5ISAqLworICAgICB1OCAJbGNhX2NvbnN0X21hc2s7CQkvKiBEVExCL1VUTEIgb25seSEgKi8KKyAgICAgdTggCWxjYV9jb25zdF92YWx1ZTsgCS8qIERUTEIvVVRMQiBvbmx5ISAqLworICAgICB1OCAJc2NhX2NvbnN0X21hc2s7IAkvKiBEVExCL1VUTEIgb25seSEgKi8KKyAgICAgdTggCXNjYV9jb25zdF92YWx1ZTsgCS8qIERUTEIvVVRMQiBvbmx5ISAqLworICAgICAvKiAgVGhlc2UgZGVmaW5lIGFuIGVuY29kaW5nIHRoYXQgbWFwIDUgYml0cyBpbiBUTEIgYW5kIFBURSBlbnRyaWVzIHRvICovCisgICAgIC8qICA4IGJpdHMgKEZDQSwgSVRMQiksIDE2IGJpdHMgKExDQStTQ0EsIERUTEIpIG9yIDI0IGJpdHMgKEZDQStMQ0ErU0NBLCBVVExCKTogKi8KKyAgICAgLyogICh0aGV5IG1heSBiZSBtb3ZlZCB0byBzdHJ1Y3QgWHRIYWxNbXVUbGIpICovCisgICAgIHU4CQljYV9iaXRzOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gVExCL1BURSBlbnRyaWVzIGZvciBjYWNoZSBhdHRyaWJ1dGVzICovCisgICAgIHUzMiAqCWNhX21hcDsJCQkvKiBwb2ludGVyIHRvIGFycmF5IG9mIDJeY2FfYml0cyBlbnRyaWVzIG9mIEZDQStMQ0ErU0NBIGJpdHMgKi8KK30gWHRIYWxNbXVUbGJXYXk7CisKKy8qCisgKiAgVGhlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBwcm90ZWN0aW9uIHN1cHBvcnQgaXMgcHJlc2VudCBpbiBjb3JlCisgKiAgaXMgdG8gW2xvb2sgYXQgWHRoYWxfbW11X3JpbmdzID8/P10uCisgKiAgR2l2ZSBpbmZvIG9uIG1lbW9yeSByZXF1aXJlbWVudHMgZm9yIE1NVSB0YWJsZXMgYW5kIG90aGVyIGluLW1lbW9yeQorICogIGRhdGEgc3RydWN0dXJlcyAoZ2xvYmFsbHksIHBlciB0YXNrLCBiYXNlIGFuZCBwZXIgcGFnZSwgZXRjLikgLSB3aGF0ZXZlciBib3VuZHMgY2FuIGJlIGNhbGN1bGF0ZWQuCisgKi8KKworCisvKiAgRGVmYXVsdCB2ZWN0b3JzOiAgKi8KK3h0aGFsX2ltbXVfZmV0Y2hfbWlzc192ZWN0b3IKK3h0aGFsX2RtbXVfbG9hZF9taXNzX3ZlY3RvcgoreHRoYWxfZG1tdV9zdG9yZV9taXNzX3ZlY3RvcgorCisvKiAgRnVuY3Rpb25zIGNhbGxlZCB3aGVuIGEgZmF1bHQgaXMgZGV0ZWN0ZWQ6ICAqLwordHlwZWRlZiB2b2lkIChYdEhhbE1tdUZhdWx0RnVuYykoIHVuc2lnbmVkIHZhZGRyLCAuLi5jb250ZXh0Li4uICk7CisvKiAgT3IsICovCisvKglhPyA9IHZhZGRyICovCisvKglhPyA9IGNvbnRleHQuLi4gKi8KKy8qCVBTLnh4eCA9IHh4eCAqLworWHRIYWxNTXVGYXVsdEZ1bmMgKlh0aGFsX2ltbXVfZmV0Y2hfZmF1bHRfZnVuYzsKK1h0SGFsTU11RmF1bHRGdW5jICpYdGhhbF9kbW11X2xvYWRfZmF1bHRfZnVuYzsKK1h0SGFsTU11RmF1bHRGdW5jICpYdGhhbF9kbW11X3N0b3JlX2ZhdWx0X2Z1bmM7CisKKy8qICBEZWZhdWx0IEhhbmRsZXJzOiAgKi8KKy8qICBUaGUgdXNlciBhbmQvb3Iga2VybmVsIGV4Y2VwdGlvbiBoYW5kbGVycyBtYXkganVtcCB0byB0aGVzZSBoYW5kbGVycyB0byBoYW5kbGUgdGhlIHJlbGV2YW50IGV4Y2VwdGlvbnMsCisgKiAgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBFWENDQVVTRS4gIFRoZSBleGFjdCByZWdpc3RlciBzdGF0ZSBvbiBlbnRyeSB0byB0aGVzZSBoYW5kbGVycyBpcyBUQkQuICAqLworLyogIFdoZW4gbXVsdGlwbGUgVExCIGVudHJpZXMgbWF0Y2ggKGhpdCkgb24gdGhlIHNhbWUgYWNjZXNzOiAgKi8KK3h0aGFsX2ltbXVfZmV0Y2hfbXVsdGloaXRfaGFuZGxlcgoreHRoYWxfZG1tdV9sb2FkX211bHRpaGl0X2hhbmRsZXIKK3h0aGFsX2RtbXVfc3RvcmVfbXVsdGloaXRfaGFuZGxlcgorLyogIFByb3RlY3Rpb24gdmlvbGF0aW9ucyBhY2NvcmRpbmcgdG8gY2FjaGUgYXR0cmlidXRlcywgYW5kIG90aGVyIGNhY2hlIGF0dHJpYnV0ZSBtaXNtYXRjaGVzOiAgKi8KK3h0aGFsX2ltbXVfZmV0Y2hfYXR0cl9oYW5kbGVyCit4dGhhbF9kbW11X2xvYWRfYXR0cl9oYW5kbGVyCit4dGhhbF9kbW11X3N0b3JlX2F0dHJfaGFuZGxlcgorLyogIFByb3RlY3Rpb24gdmlvbGF0aW9ucyBkdWUgdG8gaW5zdWZmaWNpZW50IHJpbmcgbGV2ZWw6ICAqLworeHRoYWxfaW1tdV9mZXRjaF9wcml2X2hhbmRsZXIKK3h0aGFsX2RtbXVfbG9hZF9wcml2X2hhbmRsZXIKK3h0aGFsX2RtbXVfc3RvcmVfcHJpdl9oYW5kbGVyCisvKiAgQWxpZ25tZW50IGV4Y2VwdGlvbiBoYW5kbGVycyAoaWYgc3VwcG9ydGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIFh0ZW5zYSBNTVUgY29uZmlndXJhdGlvbik6ICAqLworeHRoYWxfZG1tdV9sb2FkX2FsaWduX2hhbmRsZXIKK3h0aGFsX2RtbXVfc3RvcmVfYWxpZ25faGFuZGxlcgorCisvKiAgT3IsIGFsdGVybmF0aXZlbHksIHRoZSBPUyB1c2VyIGFuZC9vciBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsZXJzIG1heSBzaW1wbHkganVtcCB0byB0aGUKKyAqICBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIHdoaWNoIHdpbGwgaGFuZGxlIGFueSB2YWx1ZXMgb2YgRVhDQ0FVU0Ugbm90IGhhbmRsZWQgYnkgdGhlIE9TOiAgKi8KK3h0aGFsX3VzZXJfZXhjX2RlZmF1bHRfaGFuZGxlcgoreHRoYWxfa2VybmVsX2V4Y19kZWZhdWx0X2hhbmRsZXIKKworI2VuZGlmIC8qMCovCisKKyNpZmRlZiBJTkNMVURFX0RFUFJFQ0FURURfSEFMX0NPREUKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX2hhdmVfb2xkX2V4Y19hcmNoOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgWHRoYWxfaGF2ZV9tbXU7CitleHRlcm4gY29uc3QgdW5zaWduZWQgaW50ICBYdGhhbF9udW1fcmVnczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9pcm9tczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9pcmFtczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9kcm9tczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIFh0aGFsX251bV9kcmFtczsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2NvbmZpZ2lkMDsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgIFh0aGFsX2NvbmZpZ2lkMTsKKyNlbmRpZgorCisjaWZkZWYgSU5DTFVERV9ERVBSRUNBVEVEX0hBTF9ERUJVR19DT0RFCisjZGVmaW5lIFhUSEFMXzI0X0JJVF9CUkVBSwkJMHg4MDAwMDAwMAorI2RlZmluZSBYVEhBTF8xNl9CSVRfQlJFQUsJCTB4NDAwMDAwMDAKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBzaG9ydAlYdGhhbF9pbGxfaW5zdF8xNlsxNl07CisjZGVmaW5lIFhUSEFMX0RFU1RfUkVHCQkweGYwMDAwMDAwCS8qIE1hc2sgZm9yIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFhUSEFMX0RFU1RfUkVHX0lOU1QJMHgwODAwMDAwMAkvKiBCcmFuY2ggYWRkcmVzcyBpcyBpbiByZWdpc3RlciAqLworI2RlZmluZSBYVEhBTF9ERVNUX1JFTF9JTlNUCTB4MDQwMDAwMDAJLyogQnJhbmNoIGFkZHJlc3MgaXMgcmVsYXRpdmUgKi8KKyNkZWZpbmUgWFRIQUxfUkZXX0lOU1QJCTB4MDAwMDA4MDAKKyNkZWZpbmUgWFRIQUxfUkZVRV9JTlNUCQkweDAwMDAwNDAwCisjZGVmaW5lIFhUSEFMX1JGSV9JTlNUCQkweDAwMDAwMjAwCisjZGVmaW5lIFhUSEFMX1JGRV9JTlNUCQkweDAwMDAwMTAwCisjZGVmaW5lIFhUSEFMX1JFVF9JTlNUCQkweDAwMDAwMDgwCisjZGVmaW5lIFhUSEFMX0JSRUFLX0lOU1QJMHgwMDAwMDA0MAorI2RlZmluZSBYVEhBTF9TWVNDQUxMX0lOU1QJMHgwMDAwMDAyMAorI2RlZmluZSBYVEhBTF9MT09QX0VORAkJMHgwMDAwMDAxMAkvKiBOb3Qgc2V0IGJ5IHh0aGFsX2luc3RfdHlwZSAqLworI2RlZmluZSBYVEhBTF9KVU1QX0lOU1QJCTB4MDAwMDAwMDgJLyogQ2FsbCBvciBqdW1wIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhUSEFMX0JSQU5DSF9JTlNUCTB4MDAwMDAwMDQJLyogQnJhbmNoIGluc3RydWN0aW9uICovCisjZGVmaW5lIFhUSEFMXzI0X0JJVF9JTlNUCTB4MDAwMDAwMDIKKyNkZWZpbmUgWFRIQUxfMTZfQklUX0lOU1QgICAweDAwMDAwMDAxCit0eXBlZGVmIHN0cnVjdCB4dGhhbF9zdGF0ZSB7CisgICAgdW5zaWduZWQJcGM7CisgICAgdW5zaWduZWQJYXJbMTZdOworICAgIHVuc2lnbmVkCWxiZWc7CisgICAgdW5zaWduZWQJbGVuZDsKKyAgICB1bnNpZ25lZAlsY291bnQ7CisgICAgdW5zaWduZWQJZXh0cmFfcHRyOworICAgIHVuc2lnbmVkCWNwcmVnc19wdHJbWFRIQUxfTUFYX0NQU107Cit9IFhUSEFMX1NUQVRFOworZXh0ZXJuIHVuc2lnbmVkIGludCB4dGhhbF9pbnN0X3R5cGUodm9pZCAqYWRkcik7CitleHRlcm4gdW5zaWduZWQgaW50IHh0aGFsX2JyYW5jaF9hZGRyKHZvaWQgKmFkZHIpOworZXh0ZXJuIHVuc2lnbmVkIGludCB4dGhhbF9nZXRfbnBjKFhUSEFMX1NUQVRFICp1c2VyX3N0YXRlKTsKKyNlbmRpZiAvKiBJTkNMVURFX0RFUFJFQ0FURURfSEFMX0RFQlVHX0NPREUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiFfX0FTU0VNQkxZX18gKi8KKworI2VuZGlmIC8qWFRFTlNBX0hBTF9IKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9zaW1jYWxsLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3NpbWNhbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmI4Njg5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS9zaW1jYWxsLmgKQEAgLTAsMCArMSwxMzAgQEAKKyNpZm5kZWYgU0lNQ0FMTF9JTkNMVURFRAorI2RlZmluZSBTSU1DQUxMX0lOQ0xVREVECisKKy8qCisgKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAorICoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2Evc2ltY2FsbC5oICAtICBTaW11bGF0b3IgY2FsbCBudW1iZXJzCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBhcmNoaXZlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworCisvKgorICogIFN5c3RlbSBjYWxsIGxpa2Ugc2VydmljZXMgb2ZmZXJlZCBieSB0aGUgc2ltdWxhdG9yIGhvc3QuCisgKiAgVGhlc2UgYXJlIG1vZGVsZWQgYWZ0ZXIgdGhlIExpbnV4IDIuNCBrZXJuZWwgc3lzdGVtIGNhbGxzCisgKiAgZm9yIFh0ZW5zYSBwcm9jZXNzb3JzLiAgSG93ZXZlciBub3QgYWxsIHN5c3RlbSBjYWxscyBhbmQKKyAqICBub3QgYWxsIGZ1bmN0aW9uYWxpdHkgb2YgYSBnaXZlbiBzeXN0ZW0gY2FsbCBhcmUgaW1wbGVtZW50ZWQsCisgKiAgb3IgbmVjZXNzYXJpbHkgaGF2ZSB3ZWxsIGRlZmluZWQgb3IgZXF1aXZhbGVudCBzZW1hbnRpY3MgaW4KKyAqICB0aGUgY29udGV4dCBvZiBhIHNpbXVsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBVbml4IGtlcm5lbCkuCisgKgorICogIFRoZXNlIHNlcnZpY2VzIGJlaGF2ZSBsYXJnZWx5IGFzIGlmIHRoZXkgaGFkIGJlZW4gaW52b2tlZAorICogIGFzIGEgdGFzayBpbiB0aGUgc2ltdWxhdG9yIGhvc3QncyBvcGVyYXRpbmcgc3lzdGVtCisgKiAgKGVnLiBmaWxlcyBhY2Nlc3NlZCBhcmUgdGhvc2Ugb2YgdGhlIHNpbXVsYXRvciBob3N0KS4KKyAqICBIb3dldmVyLCB0aGVzZSBTSU1DQUxMcyBtb2RlbCBhIHZpcnR1YWwgb3BlcmF0aW5nIHN5c3RlbQorICogIHNvIHRoYXQgdmFyaW91cyBkZWZpbml0aW9ucywgYml0IGFzc2lnbm1lbnRzIGV0YworICogIChlZy4gb3BlbiBtb2RlIGJpdHMsIGVycm5vIHZhbHVlcywgZXRjKSBhcmUgaW5kZXBlbmRlbnQKKyAqICBvZiB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIHVzZWQgdG8gcnVuIHRoZSBzaW11bGF0aW9uLgorICogIFJhdGhlciB0aGVzZSBkZWZpbml0aW9ucyBhcmUgc3BlY2lmaWMgdG8gdGhlIFh0ZW5zYSBJU1MuCisgKiAgVGhpcyB3YXkgWHRlbnNhIElTQSBjb2RlIHdyaXR0ZW4gdG8gdXNlIHRoZXNlIFNJTUNBTExzCisgKiAgY2FuIChpbiBwcmluY2lwbGUpIGJlIHNpbXVsYXRlZCBvbiBhbnkgaG9zdC4KKyAqCisgKiAgVXAgdG8gNiBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzIGEzIHRvIGE4CisgKiAgKG5vdGUgdGhlIDZ0aCBwYXJhbWV0ZXIgaXNuJ3QgcGFzc2VkIG9uIHRoZSBzdGFjaywKKyAqICAgdW5saWtlIHdpbmRvd2VkIGZ1bmN0aW9uIGNhbGxpbmcgY29udmVudGlvbnMpLgorICogIFRoZSByZXR1cm4gdmFsdWUgaXMgaW4gYTIuICBBIG5lZ2F0aXZlIHZhbHVlIGluIHRoZQorICogIHJhbmdlIC00MDk2IHRvIC0xIGluZGljYXRlcyBhIG5lZ2F0ZWQgZXJyb3IgY29kZSB0byBiZQorICogIHJlcG9ydGVkIGluIGVycm5vIHdpdGggYSByZXR1cm4gdmFsdWUgb2YgLTEsIG90aGVyd2lzZQorICogIHRoZSB2YWx1ZSBpbiBhMiBpcyByZXR1cm5lZCBhcyBpcy4KKyAqLworCisvKiBUaGVzZSAjZGVmaW5lcyBuZWVkIHRvIG1hdGNoIHdoYXQncyBpbiBYdGVuc2EvT1Mvdnh3b3Jrcy94dGlzcy9zaW1jYWxscy5jICovCisKKyNkZWZpbmUgU1lTX25vcAkJMAkvKiBuL2EgLSBzZXR1cDsgdXNlZCB0byBmbHVzaCByZWdpc3RlciB3aW5kb3dzICovCisjZGVmaW5lIFNZU19leGl0CTEJLyp4Ki8KKyNkZWZpbmUgU1lTX2ZvcmsJMgorI2RlZmluZSBTWVNfcmVhZAkzCS8qeCovCisjZGVmaW5lIFNZU193cml0ZQk0CS8qeCovCisjZGVmaW5lIFNZU19vcGVuCTUJLyp4Ki8KKyNkZWZpbmUgU1lTX2Nsb3NlCTYJLyp4Ki8KKyNkZWZpbmUgU1lTX3JlbmFtZQk3CS8qeCAzOCAtIHdhaXRwaWQgKi8KKyNkZWZpbmUgU1lTX2NyZWF0CTgJLyp4Ki8KKyNkZWZpbmUgU1lTX2xpbmsJOQkvKnggKG5vdCBpbXBsZW1lbnRlZCBvbiBXSU4zMikgKi8KKyNkZWZpbmUgU1lTX3VubGluawkxMAkvKngqLworI2RlZmluZSBTWVNfZXhlY3YJMTEJLyogbi9hIC0gZXhlY3ZlICovCisjZGVmaW5lIFNZU19leGVjdmUJMTIJLyogMTEgLSBjaGRpciAqLworI2RlZmluZSBTWVNfcGlwZQkxMwkvKiA0MiAtIHRpbWUgKi8KKyNkZWZpbmUgU1lTX3N0YXQJMTQJLyogMTA2IC0gbWtub2QgKi8KKyNkZWZpbmUgU1lTX2NobW9kCTE1CisjZGVmaW5lIFNZU19jaG93bgkxNgkvKiAyMDIgLSBsY2hvd24gKi8KKyNkZWZpbmUgU1lTX3V0aW1lCTE3CS8qIDMwIC0gYnJlYWsgKi8KKyNkZWZpbmUgU1lTX3dhaXQJMTgJLyogbi9hIC0gb2xkc3RhdCAqLworI2RlZmluZSBTWVNfbHNlZWsJMTkJLyp4Ki8KKyNkZWZpbmUgU1lTX2dldHBpZAkyMAorI2RlZmluZSBTWVNfaXNhdHR5CTIxCS8qIG4vYSAtIG1vdW50ICovCisjZGVmaW5lIFNZU19mc3RhdAkyMgkvKiAxMDggLSBvbGR1bW91bnQgKi8KKyNkZWZpbmUgU1lTX3RpbWUJMjMJLyogMTMgLSBzZXR1aWQgKi8KKyNkZWZpbmUgU1lTX2dldHRpbWVvZmRheSAyNAkvKnggNzggLSBnZXR1aWQgKG5vdCBpbXBsZW1lbnRlZCBvbiBXSU4zMikgKi8KKyNkZWZpbmUgU1lTX3RpbWVzCTI1CS8qWCA0MyAtIHN0aW1lIChYdGVuc2Etc3BlY2lmaWMgaW1wbGVtZW50YXRpb24pICovCisjZGVmaW5lIFNZU19zb2NrZXQgICAgICAyNgorI2RlZmluZSBTWVNfc2VuZHRvICAgICAgMjcKKyNkZWZpbmUgU1lTX3JlY3Zmcm9tICAgIDI4CisjZGVmaW5lIFNZU19zZWxlY3Rfb25lICAyOSAgICAgIC8qIG5vdCBjb21waXRpYmxlIHNlbGVjdCwgb25lIGZpbGUgZGVzY3JpcHRvciBhdCB0aGUgdGltZSAqLworI2RlZmluZSBTWVNfYmluZCAgICAgICAgMzAKKyNkZWZpbmUgU1lTX2lvY3RsCTMxCisKKy8qCisgKiAgT3RoZXIuLi4KKyAqLworI2RlZmluZSBTWVNfaXNzX2FyZ2MgICAgICAxMDAwCS8qIHJldHVybnMgdmFsdWUgb2YgYXJnYyAqLworI2RlZmluZSBTWVNfaXNzX2FyZ3Zfc2l6ZSAxMDAxCS8qIGJ5dGVzIG5lZWRlZCBmb3IgYXJndiAmIGFyZyBzdHJpbmdzICovCisjZGVmaW5lIFNZU19pc3Nfc2V0X2FyZ3YgIDEwMDIJLyogc2F2ZXMgYXJndiAmIGFyZyBzdHJpbmdzIGF0IGdpdmVuIGFkZHIgKi8KKworLyoKKyAqIFNJTUNBTExzIGZvciB0aGUgZmVycmV0IG1lbW9yeSBkZWJ1Z2dlci4gQWxsIGFyZSBpbnZva2VkIGJ5CisgKiBsaWJmZXJyZXQuYSAuLi4gICggWHRlbnNhL1RhcmdldC1MaWJzL2ZlcnJldCApCisgKi8KKyNkZWZpbmUgU1lTX2ZlcnJldCAgICAgICAgICAgMTAxMAorI2RlZmluZSBTWVNfbWFsbG9jICAgICAgICAgICAxMDExCisjZGVmaW5lIFNZU19mcmVlICAgICAgICAgICAgIDEwMTIKKyNkZWZpbmUgU1lTX21vcmVfaGVhcCAgICAgICAgMTAxMworI2RlZmluZSBTWVNfbm9faGVhcCAgICAgICAgICAxMDE0CisKKworLyoKKyAqICBFeHRyYSBTSU1DQUxMcyBmb3IgR0RCOgorICovCisjZGVmaW5lIFNZU19nZGJfYnJlYWsgICAgICAgICAtMQkvKiBpbnZva2VkIGJ5IFhUT1Mgb24gdXNlciBleGNlcHRpb25zIGlmIEVQQyBwb2ludHMKKwkJCQkJICAgdG8gYSBicmVhay5uL2JyZWFrLCByZWdhcmRsZXNzIG9mIGNhdXNlISAqLworI2RlZmluZSBTWVNfeG1vbl9vdXQgICAgICAgICAgLTIJLyogaW52b2tlZCBieSBYTU9OOiAuLi4gKi8KKyNkZWZpbmUgU1lTX3htb25faW4gICAgICAgICAgIC0zCS8qIGludm9rZWQgYnkgWE1PTjogLi4uICovCisjZGVmaW5lIFNZU194bW9uX2ZsdXNoICAgICAgICAtNAkvKiBpbnZva2VkIGJ5IFhNT046IC4uLiAqLworI2RlZmluZSBTWVNfZ2RiX2Fib3J0ICAgICAgICAgLTUJLyogaW52b2tlZCBieSBYVE9TIGluIF94dG9zX3BhbmljKCkgKi8KKyNkZWZpbmUgU1lTX2dkYl9pbGxlZ2FsX2luc3QgIC02CS8qIGludm9rZWQgYnkgWFRPUyBmb3IgaWxsZWdhbCBpbnN0cnVjdGlvbnMgKHRvbyBkZWVwbHkpICovCisjZGVmaW5lIFNZU194bW9uX2luaXQgICAgICAgICAtNwkvKiBpbnZva2VkIGJ5IFhNT046IC4uLiAqLworI2RlZmluZSBTWVNfZ2RiX2VudGVyX3NrdGxvb3AgLTgJLyogaW52b2tlZCBieSBYVE9TIG9uIGRlYnVnIGV4Y2VwdGlvbnMgKi8KKworLyoKKyAqICBTSU1DQUxMcyBmb3IgdnhXb3JrcyB4dGlzcyBCU1A6CisgKi8KKyNkZWZpbmUgU1lTX3NldHVwX3BwcF9waXBlcyAgIC04MworI2RlZmluZSBTWVNfbG9nX21zZyAgICAgICAgICAgLTg0CisKKy8qCisgKiAgVGVzdCBTSU1DQUxMczoKKyAqLworI2RlZmluZSBTWVNfdGVzdF93cml0ZV9zdGF0ZSAgLTEwMAorI2RlZmluZSBTWVNfdGVzdF9yZWFkX3N0YXRlICAgLTEwMQorCisvKgorICogU1lTX3NlbGVjdF9vbmUgc3BlY2lmaWVycworICovCisjZGVmaW5lICBYVElTU19TRUxFQ1RfT05FX1JFQUQgICAgMQorI2RlZmluZSAgWFRJU1NfU0VMRUNUX09ORV9XUklURSAgIDIKKyNkZWZpbmUgIFhUSVNTX1NFTEVDVF9PTkVfRVhDRVBUICAzCisKKyNlbmRpZiAvKiAhU0lNQ0FMTF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dDIwMDAtdWFydC5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dDIwMDAtdWFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTQ0NjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0MjAwMC11YXJ0LmgKQEAgLTAsMCArMSwxNTUgQEAKKyNpZm5kZWYgX3VhcnRfaF9pbmNsdWRlZF8KKyNkZWZpbmUgX3VhcnRfaF9pbmNsdWRlZF8KKworLyoKKyAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECisgKgorICogaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dDIwMDAtdWFydC5oIC0tIE5hdFNlbWkgUEMxNjU1MkQgRFVBUlQKKyAqIGRlZmluaXRpb25zCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworCisjaW5jbHVkZSA8eHRlbnNhL3h0MjAwMC5oPgorCisKKy8qIDE2NTUwIFVBUlQgREVWSUNFIFJFR0lTVEVSUworICAgVGhlIFhUMjAwMCBib2FyZCBhbGlnbnMgZWFjaCByZWdpc3RlciB0byBhIDMyLWJpdCB3b3JkIGJ1dCB0aGUgVUFSVCBkZXZpY2Ugb25seSB1c2VzCisgICBvbmUgYnl0ZSBvZiB0aGUgd29yZCwgd2hpY2ggaXMgdGhlIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgcmVnYXJkbGVzcyBvZiB0aGUKKyAgIGVuZGlhbm5lc3Mgb2YgdGhlIGNvcmUgKGllLiBieXRlIG9mZnNldCAwIGZvciBsaXR0bGUtZW5kaWFuIGFuZCAzIGZvciBiaWctZW5kaWFuKS4KKyAgIFNvIGlmIHVzaW5nIHdvcmQgYWNjZXNzZXMgdGhlbiBlbmRpYW5uZXNzIGRvZXNuJ3QgbWF0dGVyLgorICAgVGhlIG1hY3JvcyBwcm92aWRlZCBoZXJlIGRvIHRoYXQuCisqLworc3RydWN0IHVhcnRfZGV2X3MgeworICB1bmlvbiB7CisgICAgdW5zaWduZWQgaW50IHJ4YjsJLyogRExBQj0wOiByZWNlaXZlIGJ1ZmZlciwgcmVhZC1vbmx5ICovCisgICAgdW5zaWduZWQgaW50IHR4YjsJLyogRExBQj0wOiB0cmFuc21pdCBidWZmZXIsIHdyaXRlLW9ubHkgKi8KKyAgICB1bnNpZ25lZCBpbnQgZGxsOwkvKiBETEFCPTE6IGRpdmlzb3IsIGxlYXN0LXNpZ25pZmljYW50IGJ5dGUgbGF0Y2ggKHdhcyB3cml0ZS1vbmx5PykgKi8KKyAgfSB3MDsKKyAgdW5pb24geworICAgIHVuc2lnbmVkIGludCBpZXI7CS8qIERMQUI9MDogaW50ZXJydXB0LWVuYWJsZSByZWdpc3RlciAod2FzIHdyaXRlLW9ubHk/KSAqLworICAgIHVuc2lnbmVkIGludCBkbG07CS8qIERMQUI9MTogZGl2aXNvciwgbW9zdC1zaWduaWZpY2FudCBieXRlIGxhdGNoICh3YXMgd3JpdGUtb25seT8pICovCisgIH0gdzE7CisKKyAgdW5pb24geworICAgIHVuc2lnbmVkIGludCBpc3I7CS8qIERMQUI9MDogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciwgcmVhZC1vbmx5ICovCisgICAgdW5zaWduZWQgaW50IGZjcjsJLyogRExBQj0wOiBGSUZPIGNvbnRyb2wgcmVnaXN0ZXIsIHdyaXRlLW9ubHkgKi8KKyAgICB1bnNpZ25lZCBpbnQgYWZyOwkvKiBETEFCPTE6IGFsdGVybmF0ZSBmdW5jdGlvbiByZWdpc3RlciAqLworICB9IHcyOworCisgIHVuc2lnbmVkIGludCBsY3I7CS8qIGxpbmUgY29udHJvbC1yZWdpc3Rlciwgd3JpdGUtb25seSAqLworICB1bnNpZ25lZCBpbnQgbWNyOwkvKiBtb2RlbSBjb250cm9sLXJlZ3NpdGVyLCB3cml0ZS1vbmx5ICovCisgIHVuc2lnbmVkIGludCBsc3I7CS8qIGxpbmUgc3RhdHVzIHJlZ2lzdGVyLCByZWFkLW9ubHkgKi8KKyAgdW5zaWduZWQgaW50IG1zcjsJLyogbW9kZW0gc3RhdHVzIHJlZ2lzdGVyLCByZWFkLW9ubHkgKi8KKyAgdW5zaWduZWQgaW50IHNjcjsJLyogc2NyYXRjaCByZWdzaXRlciwgcmVhZC93cml0ZSAqLworfTsKKworI2RlZmluZSBfUlhCKHUpICgodSktPncwLnJ4YikKKyNkZWZpbmUgX1RYQih1KSAoKHUpLT53MC50eGIpCisjZGVmaW5lIF9ETEwodSkgKCh1KS0+dzAuZGxsKQorI2RlZmluZSBfSUVSKHUpICgodSktPncxLmllcikKKyNkZWZpbmUgX0RMTSh1KSAoKHUpLT53MS5kbG0pCisjZGVmaW5lIF9JU1IodSkgKCh1KS0+dzIuaXNyKQorI2RlZmluZSBfRkNSKHUpICgodSktPncyLmZjcikKKyNkZWZpbmUgX0FGUih1KSAoKHUpLT53Mi5hZnIpCisjZGVmaW5lIF9MQ1IodSkgKCh1KS0+bGNyKQorI2RlZmluZSBfTUNSKHUpICgodSktPm1jcikKKyNkZWZpbmUgX0xTUih1KSAoKHUpLT5sc3IpCisjZGVmaW5lIF9NU1IodSkgKCh1KS0+bXNyKQorI2RlZmluZSBfU0NSKHUpICgodSktPnNjcikKKwordHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgdWFydF9kZXZfcyB1YXJ0X2Rldl90OworCisvKiBJRVIgYml0cyAqLworI2RlZmluZSBSQ1ZSX0RBVEFfUkVHX0lOVEVOQUJMRSAweDAxCisjZGVmaW5lIFhNSVRfSE9MRF9SRUdfSU5URU5BQkxFICAgIDB4MDIKKyNkZWZpbmUgUkNWUl9TVEFUVVNfSU5URU5BQkxFICAgMHgwNAorI2RlZmluZSBNT0RFTV9TVEFUVVNfSU5URU5BQkxFICAgICAweDA4CisKKy8qIEZDUiBiaXRzICovCisjZGVmaW5lIF9GSUZPX0VOQUJMRSAgICAgIDB4MDEKKyNkZWZpbmUgUkNWUl9GSUZPX1JFU0VUICAweDAyCisjZGVmaW5lIFhNSVRfRklGT19SRVNFVCAgMHgwNAorI2RlZmluZSBETUFfTU9ERV9TRUxFQ1QgIDB4MDgKKyNkZWZpbmUgUkNWUl9UUklHR0VSX0xTQiAweDQwCisjZGVmaW5lIFJDVlJfVFJJR0dFUl9NU0IgMHg4MAorCisvKiBBRlIgYml0cyAqLworI2RlZmluZSBBRlJfQ09OQ19XUklURQkweDAxCisjZGVmaW5lIEFGUl9CQVVET1VUX1NFTAkweDAyCisjZGVmaW5lIEFGUl9SWFJEWV9TRUwJMHgwNAorCisvKiBJU1IgYml0cyAqLworI2RlZmluZSBJTlRfU1RBVFVTKHIpICAgKChyKSYxKQorI2RlZmluZSBJTlRfUFJJT1JJVFkocikgKCgocik+PjEpJjB4NykKKworLyogTENSIGJpdHMgKi8KKyNkZWZpbmUgV09SRF9MRU5HVEgobikgICgoKG4pLTUpJjB4MykKKyNkZWZpbmUgU1RPUF9CSVRfRU5BQkxFIDB4MDQKKyNkZWZpbmUgUEFSSVRZX0VOQUJMRSAgIDB4MDgKKyNkZWZpbmUgRVZFTl9QQVJJVFkgICAgIDB4MTAKKyNkZWZpbmUgRk9SQ0VfUEFSSVRZICAgIDB4MjAKKyNkZWZpbmUgWE1JVF9CUkVBSyAgICAgIDB4NDAKKyNkZWZpbmUgRExBQl9FTkFCTEUgICAgIDB4ODAKKworLyogTUNSIGJpdHMgKi8KKyNkZWZpbmUgX0RUUiAweDAxCisjZGVmaW5lIF9SVFMgMHgwMgorI2RlZmluZSBfT1AxIDB4MDQKKyNkZWZpbmUgX09QMiAweDA4CisjZGVmaW5lIExPT1BfQkFDSyAweDEwCisKKy8qIExTUiBCaXRzICovCisjZGVmaW5lIFJDVlJfREFUQV9SRUFEWSAweDAxCisjZGVmaW5lIE9WRVJSVU5fRVJST1IgICAweDAyCisjZGVmaW5lIFBBUklUWV9FUlJPUiAgICAweDA0CisjZGVmaW5lIEZSQU1JTkdfRVJST1IgICAweDA4CisjZGVmaW5lIEJSRUFLX0lOVEVSUlVQVCAweDEwCisjZGVmaW5lIFhNSVRfSE9MRF9FTVBUWSAweDIwCisjZGVmaW5lIFhNSVRfRU1QVFkgICAgICAweDQwCisjZGVmaW5lIEZJRk9fRVJST1IgICAgICAweDgwCisjZGVmaW5lIFJDVlJfUkVBRFkodSkgICAoX0xTUih1KSZSQ1ZSX0RBVEFfUkVBRFkpCisjZGVmaW5lIFhNSVRfUkVBRFkodSkgICAoX0xTUih1KSZYTUlUX0hPTERfRU1QVFkpCisKKy8qIE1TUiBiaXRzICovCisjZGVmaW5lIF9SRFIgICAgICAgMHgwMQorI2RlZmluZSBERUxUQV9EU1IgMHgwMgorI2RlZmluZSBERUxUQV9SSSAgMHgwNAorI2RlZmluZSBERUxUQV9DRCAgMHgwOAorI2RlZmluZSBfQ1RTICAgICAgIDB4MTAKKyNkZWZpbmUgX0RTUiAgICAgICAweDIwCisjZGVmaW5lIF9SSSAgICAgICAgMHg0MAorI2RlZmluZSBfQ0QgICAgICAgIDB4ODAKKworLyogcHJvdG90eXBlcyAqLwordm9pZCB1YXJ0X2luaXQoIHVhcnRfZGV2X3QgKnUsIGludCBiaXRyYXRlICk7Cit2b2lkIHVhcnRfb3V0KCB1YXJ0X2Rldl90ICp1LCBjaGFyIGMgKTsKK3ZvaWQgdWFydF9wdXRzKCB1YXJ0X2Rldl90ICp1LCBjaGFyICpzICk7CitjaGFyIHVhcnRfaW4oIHVhcnRfZGV2X3QgKnUgKTsKK3ZvaWQgdWFydF9lbmFibGVfcmN2cl9pbnQoIHVhcnRfZGV2X3QgKnUgKTsKK3ZvaWQgdWFydF9kaXNhYmxlX3JjdnJfaW50KCB1YXJ0X2Rldl90ICp1ICk7CisKKyNpZmRlZiBEVUFSVDE2NTUyXzFfVkFERFIKKy8qICBEVUFSVCBwcmVzZW50LiAgKi8KKyNkZWZpbmUgRFVBUlRfMV9CQVNFCSgqKHVhcnRfZGV2X3QqKURVQVJUMTY1NTJfMV9WQUREUikKKyNkZWZpbmUgRFVBUlRfMl9CQVNFCSgqKHVhcnRfZGV2X3QqKURVQVJUMTY1NTJfMl9WQUREUikKKyNkZWZpbmUgVUFSVDFfUFVUUyhzKQl1YXJ0X3B1dHMoICZEVUFSVF8xX0JBU0UsIHMgKQorI2RlZmluZSBVQVJUMl9QVVRTKHMpCXVhcnRfcHV0cyggJkRVQVJUXzJfQkFTRSwgcyApCisjZWxzZQorLyogIERVQVJUIG5vdCBjb25maWd1cmVkLCB1c2UgZHVtbXkgcGxhY2Vob2xkZXJzIHRvIGFsbG93IGNvbXBpbGVzIHRvIHdvcmsuICAqLworI2RlZmluZSBEVUFSVF8xX0JBU0UJKCoodWFydF9kZXZfdCopMCkKKyNkZWZpbmUgRFVBUlRfMl9CQVNFCSgqKHVhcnRfZGV2X3QqKTApCisjZGVmaW5lIFVBUlQxX1BVVFMocykKKyNkZWZpbmUgVUFSVDJfUFVUUyhzKQorI2VuZGlmCisKKy8qICBDb21wdXRlIDE2LWJpdCBkaXZpc29yIGZvciBiYXVkcmF0ZSBnZW5lcmF0b3IsIHdpdGggcm91bmRpbmc6ICAqLworI2RlZmluZSBEVUFSVF9ESVZJU09SKGNyeXN0YWwsc3BlZWQpCSgoKGNyeXN0YWwpLzE2ICsgKHNwZWVkKS8yKS8oc3BlZWQpKQorCisjZW5kaWYgLypfdWFydF9oX2luY2x1ZGVkXyovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EveHQyMDAwLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0MjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwM2E0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0MjAwMC5oCkBAIC0wLDAgKzEsNDA4IEBACisjaWZuZGVmIF9JTkNfWFQyMDAwX0hfCisjZGVmaW5lIF9JTkNfWFQyMDAwX0hfCisKKy8qCisgKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0tIERPIE5PVCBNT0RJRlkgQlkgSEFORAorICoKKyAqIGluY2x1ZGUvYXNtLXh0ZW5zYS94dGVuc2EveHQyMDAwLmggLSBEZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUKKyAqIFRlbnNpbGljYSBYVDIwMDAgRW11bGF0aW9uIEJvYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFRlbnNpbGljYSBJbmMuCisgKi8KKworCisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9jb3JlLmg+CisjaW5jbHVkZSA8eHRlbnNhL2NvbmZpZy9zeXN0ZW0uaD4KKworCisvKgorICogIERlZmF1bHQgYXNzaWdubWVudCBvZiBYVDIwMDAgZGV2aWNlcyB0byBleHRlcm5hbCBpbnRlcnJ1cHRzLgorICovCisKKy8qICBFdGhlcm5ldCBpbnRlcnJ1cHQ6ICAqLworI2lmZGVmIFhDSEFMX0VYVElOVDNfTlVNCisjZGVmaW5lIFNPTklDODM5MzRfSU5UTlVNCVhDSEFMX0VYVElOVDNfTlVNCisjZGVmaW5lIFNPTklDODM5MzRfSU5UTEVWRUwJWENIQUxfRVhUSU5UM19MRVZFTAorI2RlZmluZSBTT05JQzgzOTM0X0lOVE1BU0sJWENIQUxfRVhUSU5UM19NQVNLCisjZWxzZQorI2RlZmluZSBTT05JQzgzOTM0X0lOVE1BU0sJMAorI2VuZGlmCisKKy8qICBEVUFSVCBjaGFubmVsIDEgaW50ZXJydXB0IChQMSAtIGNvbnNvbGUpOiAgKi8KKyNpZmRlZiBYQ0hBTF9FWFRJTlQ0X05VTQorI2RlZmluZSBEVUFSVDE2NTUyXzFfSU5UTlVNCVhDSEFMX0VYVElOVDRfTlVNCisjZGVmaW5lIERVQVJUMTY1NTJfMV9JTlRMRVZFTAlYQ0hBTF9FWFRJTlQ0X0xFVkVMCisjZGVmaW5lIERVQVJUMTY1NTJfMV9JTlRNQVNLCVhDSEFMX0VYVElOVDRfTUFTSworI2Vsc2UKKyNkZWZpbmUgRFVBUlQxNjU1Ml8xX0lOVE1BU0sJMAorI2VuZGlmCisKKy8qICBEVUFSVCBjaGFubmVsIDIgaW50ZXJydXB0IChQMiAtIDJuZCBzZXJpYWwgcG9ydCk6ICAqLworI2lmZGVmIFhDSEFMX0VYVElOVDVfTlVNCisjZGVmaW5lIERVQVJUMTY1NTJfMl9JTlROVU0JWENIQUxfRVhUSU5UNV9OVU0KKyNkZWZpbmUgRFVBUlQxNjU1Ml8yX0lOVExFVkVMCVhDSEFMX0VYVElOVDVfTEVWRUwKKyNkZWZpbmUgRFVBUlQxNjU1Ml8yX0lOVE1BU0sJWENIQUxfRVhUSU5UNV9NQVNLCisjZWxzZQorI2RlZmluZSBEVUFSVDE2NTUyXzJfSU5UTUFTSwkwCisjZW5kaWYKKworLyogIEZQR0EtY29tYmluZWQgUENJL2V0YyBpbnRlcnJ1cHRzOiAgKi8KKyNpZmRlZiBYQ0hBTF9FWFRJTlQ2X05VTQorI2RlZmluZSBYVDIwMDBfRlBHQVBDSV9JTlROVU0JWENIQUxfRVhUSU5UNl9OVU0KKyNkZWZpbmUgWFQyMDAwX0ZQR0FQQ0lfSU5UTEVWRUwJWENIQUxfRVhUSU5UNl9MRVZFTAorI2RlZmluZSBYVDIwMDBfRlBHQVBDSV9JTlRNQVNLCVhDSEFMX0VYVElOVDZfTUFTSworI2Vsc2UKKyNkZWZpbmUgWFQyMDAwX0ZQR0FQQ0lfSU5UTUFTSwkwCisjZW5kaWYKKworCisKKy8qCisgKiAgRGV2aWNlIGFkZHJlc3Nlcy4KKyAqCisgKiAgTm90ZTogIGZvciBlbmRpYW5uZXNzLWluZGVwZW5kZW5jZSwgdXNlIDMyLWJpdCBsb2FkcyBhbmQgc3RvcmVzIGZvciBhbGwKKyAqICByZWdpc3RlciBhY2Nlc3NlcyB0byBFdGhlcm5ldCwgRFVBUlQgYW5kIExFRCBkZXZpY2VzLiAgVW5kZWZpbmVkIGJpdHMKKyAqICBtYXkgbmVlZCB0byBiZSBtYXNrZWQgb3V0IGlmIG5lZWRlZCB3aGVuIHJlYWRpbmcgaWYgdGhlIGFjdHVhbCByZWdpc3RlcgorICogIHNpemUgaXMgc21hbGxlciB0aGFuIDMyIGJpdHMuCisgKgorICogIE5vdGU6ICBYVDIwMDAgYnVzIGJ5dGUgbGFuZXMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgbXNieXRlIGFuZCBsc2J5dGUKKyAqICByZWxhdGl2ZSB0byB0aGUgcHJvY2Vzc29yLiAgU28gMzItYml0IHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgY29uc2lzdGVudGx5CisgKiAgZnJvbSBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBwcm9jZXNzb3JzLiAgSG93ZXZlciwgdGhpcyBtZWFucyBieXRlCisgKiAgc2VxdWVuY2VzIGFyZSBub3QgY29uc2lzdGVudCBiZXR3ZWVuIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBwcm9jZXNzb3JzLgorICogIFRoaXMgaXMgZmluZSBmb3IgUkFNLCBhbmQgZm9yIFJPTSBpZiBST00gaXMgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYworICogIHByb2Nlc3NvciAoYW5kIHRodXMgaGFzIGNvcnJlY3QgYnl0ZSBzZXF1ZW5jZXMpLiAgSG93ZXZlciB0aGlzIG1heSBiZQorICogIHVuZXhwZWN0ZWQgZm9yIEZsYXNoLCB3aGljaCBtaWdodCBjb250YWluIGEgZmlsZS1zeXN0ZW0gdGhhdCBvbmUgd2FudHMKKyAqICB0byB1c2UgZm9yIG11bHRpcGxlIHByb2Nlc3NvciBjb25maWd1cmF0aW9ucyAoZWcuIHRoZSBGbGFzaCBtaWdodCBjb250YWluCisgKiAgdGhlIEV0aGVybmV0IGNhcmQncyBhZGRyZXNzLCBlbmRpYW5uZXNzLWluZGVwZW5kZW50IGFwcGxpY2F0aW9uIGRhdGEsIGV0YykuCisgKiAgVGhhdCBpcywgYnl0ZSBzZXF1ZW5jZXMgd3JpdHRlbiBpbiBGbGFzaCBieSBhIGNvcmUgb2YgYSBnaXZlbiBlbmRpYW5uZXNzCisgKiAgd2lsbCBiZSBieXRlLXN3YXBwZWQgd2hlbiBzZWVuIGJ5IGEgY29yZSBvZiB0aGUgb3RoZXIgZW5kaWFubmVzcy4KKyAqICBTb21lb25lIGltcGxlbWVudGluZyBhbiBlbmRpYW5uZXNzLWluZGVwZW5kZW50IEZsYXNoIGZpbGUgc3lzdGVtIHdpbGwKKyAqICBsaWtlbHkgaGFuZGxlIHRoaXMgYnl0ZS1zd2FwcGluZyBpc3N1ZSBpbiB0aGUgRmxhc2ggZHJpdmVyIHNvZnR3YXJlLgorICovCisKKyNkZWZpbmUgRFVBUlQxNjU1Ml9YVEFMX0ZSRVEJMTg0MzIwMDAJLyogY3J5c3RhbCBmcmVxdWVuY3kgaW4gSHogKi8KKyNkZWZpbmUgWFRCT0FSRF9GTEFTSF9NQVhTSVpFCTB4NDAwMDAwMAkvKiA2NCBNQiAobWF4OyBkZXBlbmRzIG9uIHdoYXQgaXMgc29ja2V0ZWQhKSAqLworI2RlZmluZSBYVEJPQVJEX0VQUk9NX01BWFNJWkUJMHgwNDAwMDAwCS8qIDQgTUIgKG1heDsgZGVwZW5kcyBvbiB3aGF0IGlzIHNvY2tldGVkISkgKi8KKyNkZWZpbmUgWFRCT0FSRF9FRVBST01fTUFYU0laRQkweDAwODAwMDAJLyogNTEyIGtCIChtYXg7IGRlcGVuZHMgb24gd2hhdCBpcyBzb2NrZXRlZCEpICovCisjZGVmaW5lIFhUQk9BUkRfQVNSQU1fU0laRQkweDAxMDAwMDAJLyogMSBNQiAqLworI2RlZmluZSBYVEJPQVJEX1BDSV9NRU1fU0laRQkweDgwMDAwMDAJLyogMTI4IE1CIChhbGxvY2F0ZWQpICovCisjZGVmaW5lIFhUQk9BUkRfUENJX0lPX1NJWkUJMHgxMDAwMDAwCS8qIDE2IE1CIChhbGxvY2F0ZWQpICovCisKKyNpZmRlZiBYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUgorLyogIFBDSSBtZW1vcnkgc3BhY2U6ICAqLworIyBkZWZpbmUgWFRCT0FSRF9QQ0lfTUVNX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweDAwMDAwMDApCisvKiAgU29ja2V0ZWQgRmxhc2ggKGVnLiAyIHggMTYtYml0IGRldmljZXMpOiAgKi8KKyMgZGVmaW5lIFhUQk9BUkRfRkxBU0hfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4ODAwMDAwMCkKKy8qICBQQ0kgSS9PIHNwYWNlOiAgKi8KKyMgZGVmaW5lIFhUQk9BUkRfUENJX0lPX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEMwMDAwMDApCisvKiAgVjMgUENJIGludGVyZmFjZSBjaGlwIHJlZ2lzdGVyL2NvbmZpZyBzcGFjZTogICovCisjIGRlZmluZSBYVEJPQVJEX1YzUENJX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEQwMDAwMDApCisvKiAgQnVzIEludGVyZmFjZSByZWdpc3RlcnM6ICAqLworIyBkZWZpbmUgWFRCT0FSRF9CVVNJTlRfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4RDAxMDAwMCkKKy8qICBGUEdBIHJlZ2lzdGVyczogICovCisjIGRlZmluZSBYVDIwMDBfRlBHQVJFR1NfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4RDAyMDAwMCkKKy8qICBTT05JQyBTTjgzOTM0IEV0aGVybmV0IGNvbnRyb2xsZXIvdHJhbnNjZWl2ZXI6ICAqLworIyBkZWZpbmUgU09OSUM4MzkzNF9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhEMDMwMDAwKQorLyogIDgtY2hhcmFjdGVyIGJpdG1hcHBlZCBMRUQgZGlzcGxheTogICovCisjIGRlZmluZSBYVEJPQVJEX0xFRF9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhEMDQwMDAwKQorLyogIE5hdGlvbmFsLVNlbWkgUEMxNjU1MkQgRFVBUlQ6ICAqLworIyBkZWZpbmUgRFVBUlQxNjU1Ml8xX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEQwNTAwMjApCS8qIGNoYW5uZWwgMSAoUDEgLSBjb25zb2xlKSAqLworIyBkZWZpbmUgRFVBUlQxNjU1Ml8yX1BBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUisweEQwNTAwMDApCS8qIGNoYW5uZWwgMiAoUDIpICovCisvKiAgQXN5bmNocm9ub3VzIFN0YXRpYyBSQU06ICAqLworIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhENDAwMDAwKQorLyogIDgtYml0IEVFUFJPTTogICovCisjIGRlZmluZSBYVEJPQVJEX0VFUFJPTV9QQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfUEFERFIrMHhENjAwMDAwKQorLyogIDIgeCAxNi1iaXQgRVBST01zOiAgKi8KKyMgZGVmaW5lIFhUQk9BUkRfRVBST01fUEFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1BBRERSKzB4RDgwMDAwMCkKKyNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0JZUEFTU19QQUREUiAqLworCisvKiAgVGhlc2UgZGV2aWNlcyBtaWdodCBiZSBhY2Nlc3NlZCBjYWNoZWQ6ICAqLworI2lmZGVmIFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1BBRERSCisjIGRlZmluZSBYVEJPQVJEX1BDSV9NRU1fQ0FDSEVEX1BBRERSCShYU0hBTF9JT0JMT0NLX0NBQ0hFRF9QQUREUisweDAwMDAwMDApCisjIGRlZmluZSBYVEJPQVJEX0ZMQVNIX0NBQ0hFRF9QQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfUEFERFIrMHg4MDAwMDAwKQorIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9DQUNIRURfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1BBRERSKzB4RDQwMDAwMCkKKyMgZGVmaW5lIFhUQk9BUkRfRUVQUk9NX0NBQ0hFRF9QQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfUEFERFIrMHhENjAwMDAwKQorIyBkZWZpbmUgWFRCT0FSRF9FUFJPTV9DQUNIRURfUEFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1BBRERSKzB4RDgwMDAwMCkKKyNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0NBQ0hFRF9QQUREUiAqLworCisKKy8qKiogIFNhbWUgdGhpbmcgb3ZlciBhZ2FpbiwgdGhpcyB0aW1lIHdpdGggdmlydHVhbCBhZGRyZXNzZXM6ICAqKiovCisKKyNpZmRlZiBYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUgorLyogIFBDSSBtZW1vcnkgc3BhY2U6ICAqLworIyBkZWZpbmUgWFRCT0FSRF9QQ0lfTUVNX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweDAwMDAwMDApCisvKiAgU29ja2V0ZWQgRmxhc2ggKGVnLiAyIHggMTYtYml0IGRldmljZXMpOiAgKi8KKyMgZGVmaW5lIFhUQk9BUkRfRkxBU0hfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4ODAwMDAwMCkKKy8qICBQQ0kgSS9PIHNwYWNlOiAgKi8KKyMgZGVmaW5lIFhUQk9BUkRfUENJX0lPX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEMwMDAwMDApCisvKiAgVjMgUENJIGludGVyZmFjZSBjaGlwIHJlZ2lzdGVyL2NvbmZpZyBzcGFjZTogICovCisjIGRlZmluZSBYVEJPQVJEX1YzUENJX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEQwMDAwMDApCisvKiAgQnVzIEludGVyZmFjZSByZWdpc3RlcnM6ICAqLworIyBkZWZpbmUgWFRCT0FSRF9CVVNJTlRfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4RDAxMDAwMCkKKy8qICBGUEdBIHJlZ2lzdGVyczogICovCisjIGRlZmluZSBYVDIwMDBfRlBHQVJFR1NfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4RDAyMDAwMCkKKy8qICBTT05JQyBTTjgzOTM0IEV0aGVybmV0IGNvbnRyb2xsZXIvdHJhbnNjZWl2ZXI6ICAqLworIyBkZWZpbmUgU09OSUM4MzkzNF9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhEMDMwMDAwKQorLyogIDgtY2hhcmFjdGVyIGJpdG1hcHBlZCBMRUQgZGlzcGxheTogICovCisjIGRlZmluZSBYVEJPQVJEX0xFRF9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhEMDQwMDAwKQorLyogIE5hdGlvbmFsLVNlbWkgUEMxNjU1MkQgRFVBUlQ6ICAqLworIyBkZWZpbmUgRFVBUlQxNjU1Ml8xX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEQwNTAwMjApCS8qIGNoYW5uZWwgMSAoUDEgLSBjb25zb2xlKSAqLworIyBkZWZpbmUgRFVBUlQxNjU1Ml8yX1ZBRERSCShYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUisweEQwNTAwMDApCS8qIGNoYW5uZWwgMiAoUDIpICovCisvKiAgQXN5bmNocm9ub3VzIFN0YXRpYyBSQU06ICAqLworIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhENDAwMDAwKQorLyogIDgtYml0IEVFUFJPTTogICovCisjIGRlZmluZSBYVEJPQVJEX0VFUFJPTV9WQUREUgkoWFNIQUxfSU9CTE9DS19CWVBBU1NfVkFERFIrMHhENjAwMDAwKQorLyogIDIgeCAxNi1iaXQgRVBST01zOiAgKi8KKyMgZGVmaW5lIFhUQk9BUkRfRVBST01fVkFERFIJKFhTSEFMX0lPQkxPQ0tfQllQQVNTX1ZBRERSKzB4RDgwMDAwMCkKKyNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0JZUEFTU19WQUREUiAqLworCisvKiAgVGhlc2UgZGV2aWNlcyBtaWdodCBiZSBhY2Nlc3NlZCBjYWNoZWQ6ICAqLworI2lmZGVmIFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSCisjIGRlZmluZSBYVEJPQVJEX1BDSV9NRU1fQ0FDSEVEX1ZBRERSCShYU0hBTF9JT0JMT0NLX0NBQ0hFRF9WQUREUisweDAwMDAwMDApCisjIGRlZmluZSBYVEJPQVJEX0ZMQVNIX0NBQ0hFRF9WQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfVkFERFIrMHg4MDAwMDAwKQorIyBkZWZpbmUgWFRCT0FSRF9BU1JBTV9DQUNIRURfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSKzB4RDQwMDAwMCkKKyMgZGVmaW5lIFhUQk9BUkRfRUVQUk9NX0NBQ0hFRF9WQUREUgkoWFNIQUxfSU9CTE9DS19DQUNIRURfVkFERFIrMHhENjAwMDAwKQorIyBkZWZpbmUgWFRCT0FSRF9FUFJPTV9DQUNIRURfVkFERFIJKFhTSEFMX0lPQkxPQ0tfQ0FDSEVEX1ZBRERSKzB4RDgwMDAwMCkKKyNlbmRpZiAvKiBYU0hBTF9JT0JMT0NLX0NBQ0hFRF9WQUREUiAqLworCisKKy8qICBTeXN0ZW0gUk9NOiAgKi8KKyNkZWZpbmUgWFRCT0FSRF9ST01fU0laRQkJWFNIQUxfUk9NX1NJWkUKKyNpZmRlZiBYU0hBTF9ST01fVkFERFIKKyNkZWZpbmUgWFRCT0FSRF9ST01fVkFERFIJCVhTSEFMX1JPTV9WQUREUgorI2VuZGlmCisjaWZkZWYgWFNIQUxfUk9NX1BBRERSCisjZGVmaW5lIFhUQk9BUkRfUk9NX1BBRERSCQlYU0hBTF9ST01fUEFERFIKKyNlbmRpZgorCisvKiAgU3lzdGVtIFJBTTogICovCisjZGVmaW5lIFhUQk9BUkRfUkFNX1NJWkUJCVhTSEFMX1JBTV9TSVpFCisjaWZkZWYgWFNIQUxfUkFNX1ZBRERSCisjZGVmaW5lIFhUQk9BUkRfUkFNX1ZBRERSCQlYU0hBTF9SQU1fVkFERFIKKyNlbmRpZgorI2lmZGVmIFhTSEFMX1JBTV9QQUREUgorI2RlZmluZSBYVEJPQVJEX1JBTV9QQUREUgkJWFNIQUxfUkFNX1BBRERSCisjZW5kaWYKKyNkZWZpbmUgWFRCT0FSRF9SQU1fQllQQVNTX1ZBRERSCVhTSEFMX1JBTV9CWVBBU1NfVkFERFIKKyNkZWZpbmUgWFRCT0FSRF9SQU1fQllQQVNTX1BBRERSCVhTSEFMX1JBTV9CWVBBU1NfUEFERFIKKworCisKKy8qCisgKiAgVGhpbmdzIHRoYXQgZGVwZW5kIG9uIGRldmljZSBhZGRyZXNzZXMuCisgKi8KKworCisjZGVmaW5lIFhUQk9BUkRfQ0FDSEVBVFRSX1dSSVRFQkFDSwlYU0hBTF9YVDIwMDBfQ0FDSEVBVFRSX1dSSVRFQkFDSworI2RlZmluZSBYVEJPQVJEX0NBQ0hFQVRUUl9XUklURUFMTE9DCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfV1JJVEVBTExPQworI2RlZmluZSBYVEJPQVJEX0NBQ0hFQVRUUl9XUklURVRIUlUJWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9XUklURVRIUlUKKyNkZWZpbmUgWFRCT0FSRF9DQUNIRUFUVFJfQllQQVNTCVhTSEFMX1hUMjAwMF9DQUNIRUFUVFJfQllQQVNTCisjZGVmaW5lIFhUQk9BUkRfQ0FDSEVBVFRSX0RFRkFVTFQJWFNIQUxfWFQyMDAwX0NBQ0hFQVRUUl9ERUZBVUxUCisKKyNkZWZpbmUgWFRCT0FSRF9CVVNJTlRfUElQRV9SRUdJT05TCVhTSEFMX1hUMjAwMF9QSVBFX1JFR0lPTlMKKyNkZWZpbmUgWFRCT0FSRF9CVVNJTlRfU0RSQU1fUkVHSU9OUwlYU0hBTF9YVDIwMDBfU0RSQU1fUkVHSU9OUworCisKKworLyoKKyAqICBCdXNMb2dpYyAoRlBHQSkgcmVnaXN0ZXJzLgorICogIEFsbCB0aGVzZSByZWdpc3RlcnMgYXJlIG5vcm1hbGx5IGFjY2Vzc2VkIHVzaW5nIDMyLWJpdCBsb2Fkcy9zdG9yZXMuCisgKi8KKworLyogIFJlZ2lzdGVyIG9mZnNldHM6ICAqLworI2RlZmluZSBYVDIwMDBfREFURUNEX09GUwkweDAwCS8qIGRhdGUgY29kZSAocmVhZC1vbmx5KSAqLworI2RlZmluZSBYVDIwMDBfU1RTUkVHX09GUwkweDA0CS8qIHN0YXR1cyAocmVhZC1vbmx5KSAqLworI2RlZmluZSBYVDIwMDBfU1lTTEVEX09GUwkweDA4CS8qIHN5c3RlbSBMRUQgKi8KKyNkZWZpbmUgWFQyMDAwX1dSUFJPVF9PRlMJMHgwQwkvKiB3cml0ZSBwcm90ZWN0ICovCisjZGVmaW5lIFhUMjAwMF9TV1JTVF9PRlMJMHgxMAkvKiBzb2Z0d2FyZSByZXNldCAqLworI2RlZmluZSBYVDIwMDBfU1lTUlNUX09GUwkweDE0CS8qIHN5c3RlbSAocGVyaXBoZXJhbHMpIHJlc2V0ICovCisjZGVmaW5lIFhUMjAwMF9JTUFTS19PRlMJMHgxOAkvKiBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBYVDIwMDBfSVNUQVRfT0ZTCTB4MUMJLyogaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBYVDIwMDBfVjNDRkdfT0ZTCTB4MjAJLyogVjMgY29uZmlnIChWMzIwIFBDSSkgKi8KKworLyogIFBoeXNpY2FsIHJlZ2lzdGVyIGFkZHJlc3NlczogICovCisjaWZkZWYgWFQyMDAwX0ZQR0FSRUdTX1BBRERSCisjZGVmaW5lIFhUMjAwMF9EQVRFQ0RfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfREFURUNEX09GUykKKyNkZWZpbmUgWFQyMDAwX1NUU1JFR19QQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1BBRERSK1hUMjAwMF9TVFNSRUdfT0ZTKQorI2RlZmluZSBYVDIwMDBfU1lTTEVEX1BBRERSCShYVDIwMDBfRlBHQVJFR1NfUEFERFIrWFQyMDAwX1NZU0xFRF9PRlMpCisjZGVmaW5lIFhUMjAwMF9XUlBST1RfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfV1JQUk9UX09GUykKKyNkZWZpbmUgWFQyMDAwX1NXUlNUX1BBRERSCShYVDIwMDBfRlBHQVJFR1NfUEFERFIrWFQyMDAwX1NXUlNUX09GUykKKyNkZWZpbmUgWFQyMDAwX1NZU1JTVF9QQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1BBRERSK1hUMjAwMF9TWVNSU1RfT0ZTKQorI2RlZmluZSBYVDIwMDBfSU1BU0tfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfSU1BU0tfT0ZTKQorI2RlZmluZSBYVDIwMDBfSVNUQVRfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfSVNUQVRfT0ZTKQorI2RlZmluZSBYVDIwMDBfVjNDRkdfUEFERFIJKFhUMjAwMF9GUEdBUkVHU19QQUREUitYVDIwMDBfVjNDRkdfT0ZTKQorI2VuZGlmCisKKy8qICBWaXJ0dWFsIHJlZ2lzdGVyIGFkZHJlc3NlczogICovCisjaWZkZWYgWFQyMDAwX0ZQR0FSRUdTX1ZBRERSCisjZGVmaW5lIFhUMjAwMF9EQVRFQ0RfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfREFURUNEX09GUykKKyNkZWZpbmUgWFQyMDAwX1NUU1JFR19WQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1ZBRERSK1hUMjAwMF9TVFNSRUdfT0ZTKQorI2RlZmluZSBYVDIwMDBfU1lTTEVEX1ZBRERSCShYVDIwMDBfRlBHQVJFR1NfVkFERFIrWFQyMDAwX1NZU0xFRF9PRlMpCisjZGVmaW5lIFhUMjAwMF9XUlBST1RfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfV1JQUk9UX09GUykKKyNkZWZpbmUgWFQyMDAwX1NXUlNUX1ZBRERSCShYVDIwMDBfRlBHQVJFR1NfVkFERFIrWFQyMDAwX1NXUlNUX09GUykKKyNkZWZpbmUgWFQyMDAwX1NZU1JTVF9WQUREUgkoWFQyMDAwX0ZQR0FSRUdTX1ZBRERSK1hUMjAwMF9TWVNSU1RfT0ZTKQorI2RlZmluZSBYVDIwMDBfSU1BU0tfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfSU1BU0tfT0ZTKQorI2RlZmluZSBYVDIwMDBfSVNUQVRfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfSVNUQVRfT0ZTKQorI2RlZmluZSBYVDIwMDBfVjNDRkdfVkFERFIJKFhUMjAwMF9GUEdBUkVHU19WQUREUitYVDIwMDBfVjNDRkdfT0ZTKQorLyogIFJlZ2lzdGVyIGFjY2VzcyAoZm9yIEMgY29kZSk6ICAqLworI2RlZmluZSBYVDIwMDBfREFURUNEX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9EQVRFQ0RfVkFERFIpCisjZGVmaW5lIFhUMjAwMF9TVFNSRUdfUkVHCSgqKHZvbGF0aWxlIHVuc2lnbmVkKikgWFQyMDAwX1NUU1JFR19WQUREUikKKyNkZWZpbmUgWFQyMDAwX1NZU0xFRF9SRUcJKCoodm9sYXRpbGUgdW5zaWduZWQqKSBYVDIwMDBfU1lTTEVEX1ZBRERSKQorI2RlZmluZSBYVDIwMDBfV1JQUk9UX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9XUlBST1RfVkFERFIpCisjZGVmaW5lIFhUMjAwMF9TV1JTVF9SRUcJKCoodm9sYXRpbGUgdW5zaWduZWQqKSBYVDIwMDBfU1dSU1RfVkFERFIpCisjZGVmaW5lIFhUMjAwMF9TWVNSU1RfUkVHCSgqKHZvbGF0aWxlIHVuc2lnbmVkKikgWFQyMDAwX1NZU1JTVF9WQUREUikKKyNkZWZpbmUgWFQyMDAwX0lNQVNLX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9JTUFTS19WQUREUikKKyNkZWZpbmUgWFQyMDAwX0lTVEFUX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9JU1RBVF9WQUREUikKKyNkZWZpbmUgWFQyMDAwX1YzQ0ZHX1JFRwkoKih2b2xhdGlsZSB1bnNpZ25lZCopIFhUMjAwMF9WM0NGR19WQUREUikKKyNlbmRpZgorCisvKiAgREFURUNEIChkYXRlIGNvZGUpIGJpdCBmaWVsZHM6ICAqLworCisvKiAgQkNELWNvZGVkIG1vbnRoICgwMS4uMTIpOiAgKi8KKyNkZWZpbmUgWFQyMDAwX0RBVEVDRF9NT05USF9TSElGVAkyNAorI2RlZmluZSBYVDIwMDBfREFURUNEX01PTlRIX0JJVFMJOAorI2RlZmluZSBYVDIwMDBfREFURUNEX01PTlRIX01BU0sJMHhGRjAwMDAwMAorLyogIEJDRC1jb2RlZCBkYXkgKDAxLi4zMSk6ICAqLworI2RlZmluZSBYVDIwMDBfREFURUNEX0RBWV9TSElGVAkJMTYKKyNkZWZpbmUgWFQyMDAwX0RBVEVDRF9EQVlfQklUUwkJOAorI2RlZmluZSBYVDIwMDBfREFURUNEX0RBWV9NQVNLCQkweDAwRkYwMDAwCisvKiAgQkNELWNvZGVkIHllYXIgKDIwMDEuLjk5OTkpOiAgKi8KKyNkZWZpbmUgWFQyMDAwX0RBVEVDRF9ZRUFSX1NISUZUCTAKKyNkZWZpbmUgWFQyMDAwX0RBVEVDRF9ZRUFSX0JJVFMJCTE2CisjZGVmaW5lIFhUMjAwMF9EQVRFQ0RfWUVBUl9NQVNLCQkweDAwMDBGRkZGCisKKy8qICBTVFNSRUcgKHN0YXR1cykgYml0IGZpZWxkczogICovCisKKy8qICBTd2l0Y2ggU1czIHNldHRpbmcgYml0IGZpZWxkcyAoMD1vZmYvdXAsIDE9b24vZG93bik6ICAqLworI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM19TSElGVAkJMAorI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM19CSVRTCQk0CisjZGVmaW5lIFhUMjAwMF9TVFNSRUdfU1czX01BU0sJCTB4MDAwMDAwMEYKKy8qICBCb290LXNlbGVjdCBiaXRzIG9mIHN3aXRjaCBTVzM6ICAqLworI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfU0hJRlQJMAorI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfQklUUwkyCisjZGVmaW5lIFhUMjAwMF9TVFNSRUdfQk9PVFNFTF9NQVNLCTB4MDAwMDAwMDMKKy8qICBCb290LXNlbGVjdCB2YWx1ZXM6ICAqLworI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfRkxBU0gJMAorI2RlZmluZSBYVDIwMDBfU1RTUkVHX0JPT1RTRUxfRVBST00xNgkxCisjZGVmaW5lIFhUMjAwMF9TVFNSRUdfQk9PVFNFTF9QUk9NOAkyCisjZGVmaW5lIFhUMjAwMF9TVFNSRUdfQk9PVFNFTF9BU1JBTQkzCisvKiAgVXNlci1kZWZpbmVkIGJpdHMgb2Ygc3dpdGNoIFNXMzogICovCisjZGVmaW5lIFhUMjAwMF9TVFNSRUdfU1czXzJfU0hJRlQJMgorI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM18yX01BU0sJMHgwMDAwMDAwNAorI2RlZmluZSBYVDIwMDBfU1RTUkVHX1NXM18zX1NISUZUCTMKKyNkZWZpbmUgWFQyMDAwX1NUU1JFR19TVzNfM19NQVNLCTB4MDAwMDAwMDgKKworLyogIFNZU0xFRCAoc3lzdGVtIExFRCkgYml0IGZpZWxkczogICovCisKKy8qICBMRUQgY29udHJvbCBiaXQgKDA9b2ZmLCAxPW9uKTogICovCisjZGVmaW5lIFhUMjAwMF9TWVNMRURfTEVET05fU0hJRlQJMAorI2RlZmluZSBYVDIwMDBfU1lTTEVEX0xFRE9OX01BU0sJMHgwMDAwMDAwMQorCisvKiAgV1JQUk9UICh3cml0ZSBwcm90ZWN0KSBiaXQgZmllbGRzICgwPXdyaXRhYmxlLCAxPXdyaXRlLXByb3RlY3RlZCBbZGVmYXVsdF0pOiAgKi8KKworLyogIEZsYXNoIHdyaXRlIHByb3RlY3Q6ICAqLworI2RlZmluZSBYVDIwMDBfV1JQUk9UX0ZMV1BfU0hJRlQJMAorI2RlZmluZSBYVDIwMDBfV1JQUk9UX0ZMV1BfTUFTSwkJMHgwMDAwMDAwMQorLyogIFJlc2VydmVkIGJ1dCBwcmVzZW50IHdyaXRlIHByb3RlY3QgYml0czogICovCisjZGVmaW5lIFhUMjAwMF9XUlBST1RfV1JQX1NISUZUCQkxCisjZGVmaW5lIFhUMjAwMF9XUlBST1RfV1JQX0JJVFMJCTcKKyNkZWZpbmUgWFQyMDAwX1dSUFJPVF9XUlBfTUFTSwkJMHgwMDAwMDBGRQorCisvKiAgU1dSU1QgKHNvZnR3YXJlIHJlc2V0OyBhbGxvd3Mgcy93IHRvIGdlbmVyYXRlIHBvd2VyLW9uIGVxdWl2YWxlbnQgcmVzZXQpOiAgKi8KKworLyogIFNvZnR3YXJlIHJlc2V0IGJpdHM6ICAqLworI2RlZmluZSBYVDIwMDBfU1dSU1RfU1dSX1NISUZUCQkwCisjZGVmaW5lIFhUMjAwMF9TV1JTVF9TV1JfQklUUwkJMTYKKyNkZWZpbmUgWFQyMDAwX1NXUlNUX1NXUl9NQVNLCQkweDAwMDBGRkZGCisvKiAgU29mdHdhcmUgcmVzZXQgdmFsdWUgLS0gd3JpdGluZyB0aGlzIHZhbHVlIHJlc2V0cyB0aGUgYm9hcmQ6ICAqLworI2RlZmluZSBYVDIwMDBfU1dSU1RfUkVTRVRWQUxVRQkJMHgwMDAwREVBRAorCisvKiAgU1lTUlNUIChzeXN0ZW0gcmVzZXQ7IGNvbnRyb2xzIHJlc2V0IG9mIGluZGl2aWR1YWwgcGVyaXBoZXJhbHMpOiAgKi8KKworLyogIEFsbC1kZXZpY2UgcmVzZXQ6ICAqLworI2RlZmluZSBYVDIwMDBfU1lTUlNUX0FMTF9TSElGVAkJMAorI2RlZmluZSBYVDIwMDBfU1lTUlNUX0FMTF9CSVRTCQk0CisjZGVmaW5lIFhUMjAwMF9TWVNSU1RfQUxMX01BU0sJCTB4MDAwMDAwMEYKKy8qICBIRFNQLTI1MzQgTEVEIGRpc3BsYXkgcmVzZXQgKDE9cmVzZXQsIDA9bm90aGluZyk6ICAqLworI2RlZmluZSBYVDIwMDBfU1lTUlNUX0xFRF9TSElGVAkJMAorI2RlZmluZSBYVDIwMDBfU1lTUlNUX0xFRF9NQVNLCQkweDAwMDAwMDAxCisvKiAgU29uaWMgRFA4MzkzNCBFdGhlcm5ldCBjb250cm9sbGVyIHJlc2V0ICgxPXJlc2V0LCAwPW5vdGhpbmcpOiAgKi8KKyNkZWZpbmUgWFQyMDAwX1NZU1JTVF9TT05JQ19TSElGVAkxCisjZGVmaW5lIFhUMjAwMF9TWVNSU1RfU09OSUNfTUFTSwkweDAwMDAwMDAyCisvKiAgRFAxNjU1MiBEVUFSVCByZXNldCAoMT1yZXNldCwgMD1ub3RoaW5nKTogICovCisjZGVmaW5lIFhUMjAwMF9TWVNSU1RfRFVBUlRfU0hJRlQJMgorI2RlZmluZSBYVDIwMDBfU1lTUlNUX0RVQVJUX01BU0sJMHgwMDAwMDAwNAorLyogIFYzIFYzMjAgUENJIGJyaWRnZSBjb250cm9sbGVyIHJlc2V0ICgxPXJlc2V0LCAwPW5vdGhpbmcpOiAgKi8KKyNkZWZpbmUgWFQyMDAwX1NZU1JTVF9WM19TSElGVAkJMworI2RlZmluZSBYVDIwMDBfU1lTUlNUX1YzX01BU0sJCTB4MDAwMDAwMDgKKworLyogIElNQVNLIChpbnRlcnJ1cHQgbWFzazsgMD1kaXNhYmxlLCAxPWVuYWJsZSk6ICAqLworLyogIElTVEFUIChpbnRlcnJ1cHQgc3RhdHVzOyAwPWluYWN0aXZlLCAxPXBlbmRpbmcpOiAgKi8KKworLyogIFBDSSBJTlRQIGludGVycnVwdDogICovCisjZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0lOVFBfU0hJRlQJMgorI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9JTlRQX01BU0sJMHgwMDAwMDAwNAorLyogIFBDSSBJTlRTIGludGVycnVwdDogICovCisjZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0lOVFNfU0hJRlQJMworI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9JTlRTX01BU0sJMHgwMDAwMDAwOAorLyogIFBDSSBJTlREIGludGVycnVwdDogICovCisjZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0lOVERfU0hJRlQJNAorI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9JTlREX01BU0sJMHgwMDAwMDAxMAorLyogIFYzMjAgUENJIGNvbnRyb2xsZXIgaW50ZXJydXB0OiAgKi8KKyNkZWZpbmUgWFQyMDAwX0lOVE1VWF9WM19TSElGVAkJNQorI2RlZmluZSBYVDIwMDBfSU5UTVVYX1YzX01BU0sJCTB4MDAwMDAwMjAKKy8qICBQQ0kgRU5VTSBpbnRlcnJ1cHQ6ICAqLworI2RlZmluZSBYVDIwMDBfSU5UTVVYX1BDSV9FTlVNX1NISUZUCTYKKyNkZWZpbmUgWFQyMDAwX0lOVE1VWF9QQ0lfRU5VTV9NQVNLCTB4MDAwMDAwNDAKKy8qICBQQ0kgREVHIGludGVycnVwdDogICovCisjZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0RFR19TSElGVAk3CisjZGVmaW5lIFhUMjAwMF9JTlRNVVhfUENJX0RFR19NQVNLCTB4MDAwMDAwODAKKworLyogIFYzQ0ZHIChWMyBjb25maWcsIFYzMjAgUENJIGNvbnRyb2xsZXIpOiAgKi8KKworLyogIFYzIGFkZHJlc3MgY29udHJvbCAoMD1wYXNzLXRocnUsIDE9VjMgYWRkcmVzcyBiaXRzIDMxOjI4IHNldCB0byA0J2IwMDAxIFtkZWZhdWx0XSk6ICAqLworI2RlZmluZSBYVDIwMDBfVjNDRkdfVjNBRENfU0hJRlQJMAorI2RlZmluZSBYVDIwMDBfVjNDRkdfVjNBRENfTUFTSwkJMHgwMDAwMDAwMQorCisvKiBJMkMgRGV2aWNlcyAqLworCisjZGVmaW5lCVhUMjAwMF9JMkNfUlRDX0lECQkweDY4CisjZGVmaW5lCVhUMjAwMF9JMkNfTlZSQU0wX0lECQkweDU2CS8qIDFzdCAyNTYgYnl0ZSBibG9jayAqLworI2RlZmluZQlYVDIwMDBfSTJDX05WUkFNMV9JRAkJMHg1NwkvKiAybmQgMjU2IGJ5dGUgYmxvY2sgKi8KKworLyogIE5WUkFNIEJvYXJkIEluZm8gc3RydWN0dXJlOiAgKi8KKworI2RlZmluZSBYVDIwMDBfTlZSQU1fU0laRQkJNTEyCisKKyNkZWZpbmUgWFQyMDAwX05WUkFNX0JJTkZPX1NUQVJUCTB4MTAwCisjZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19TSVpFCQkweDIwCisjZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19WRVJTSU9OCTB4MTAJLyogdmVyc2lvbiAxLjAgKi8KKyNpZiAwCisjZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19WRVJTSU9OX09GRlNFVAkweDAwCisjZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19WRVJTSU9OX1NJWkUJCQkweDEKKyNkZWZpbmUgWFQyMDAwX05WUkFNX0JJTkZPX0VUSF9BRERSX09GRlNFVAkweDAyCisjZGVmaW5lIFhUMjAwMF9OVlJBTV9CSU5GT19FVEhfQUREUl9TSVpFCQkweDYKKyNkZWZpbmUgWFQyMDAwX05WUkFNX0JJTkZPX1NOX09GRlNFVAkJMHgxMAorI2RlZmluZSBYVDIwMDBfTlZSQU1fQklORk9fU05fU0laRQkJCTB4RQorI2RlZmluZQlYVDIwMDBfTlZSQU1fQklORk9fQ1JDX09GRlNFVAkJMHgxRQorI2RlZmluZQlYVDIwMDBfTlZSQU1fQklORk9fQ1JDX1NJWkUJCQkweDIKKyNlbmRpZiAvKjAqLworCisjaWYgIWRlZmluZWQoX19BU1NFTUJMWV9fKSAmJiAhZGVmaW5lZChfTk9DTEFOR1VBR0UpCit0eXBlZGVmIHN0cnVjdCB4dDIwMDBfbnZyYW1fYmluZm8geworICAgIHVuc2lnbmVkIGNoYXIJdmVyc2lvbjsKKyAgICB1bnNpZ25lZCBjaGFyCXJlc2VydmVkMTsKKyAgICB1bnNpZ25lZCBjaGFyCWV0aF9hZGRyWzZdOworICAgIHVuc2lnbmVkIGNoYXIJcmVzZXJ2ZWQ4WzhdOworICAgIHVuc2lnbmVkIGNoYXIJc2VyaWFsbm9bMTRdOworICAgIHVuc2lnbmVkIGNoYXIJY3JjWzJdOwkJLyogMTYtYml0IENSQyAqLworfSB4dDIwMDBfbnZyYW1fYmluZm87CisjZW5kaWYgLyohX19BU1NFTUJMWV9fICYmICFfTk9DTEFOR1VBR0UqLworCisKKyNlbmRpZiAvKl9JTkNfWFQyMDAwX0hfKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dGJvYXJkLmggYi9pbmNsdWRlL2FzbS14dGVuc2EveHRlbnNhL3h0Ym9hcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjQ2OWMxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3h0ZW5zYS94dGJvYXJkLmgKQEAgLTAsMCArMSwxMjAgQEAKKyNpZm5kZWYgX3h0Ym9hcmRfaF9pbmNsdWRlZF8KKyNkZWZpbmUgX3h0Ym9hcmRfaF9pbmNsdWRlZF8KKworLyoKKyAqIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLS0gRE8gTk9UIE1PRElGWSBCWSBIQU5ECisgKgorICogIHh0Ym9hcmQuaCAgLS0gIFJvdXRpbmVzIGZvciBnZXR0aW5nIHVzZWZ1bCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBib2FyZC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgVGVuc2lsaWNhIEluYy4KKyAqLworCisKKyNpbmNsdWRlIDx4dGVuc2EveHQyMDAwLmg+CisKKyNkZWZpbmUJWFRCT0FSRF9SVENfRVJST1IJLTEKKyNkZWZpbmUJWFRCT0FSRF9SVENfU1RPUFBFRAktMgorCisKKy8qICB4dDIwMDAtaTJjZGV2LmM6ICAqLwordHlwZWRlZiB2b2lkIFh0Ym9hcmREZWxheUZ1bmMoIHVuc2lnbmVkICk7CitleHRlcm4gWHRib2FyZERlbGF5RnVuYyogeHRib2FyZF9zZXRfbnNkZWxheV9mdW5jKCBYdGJvYXJkRGVsYXlGdW5jICpkZWxheV9mbiApOworZXh0ZXJuIGludCB4dGJvYXJkX2kyY19yZWFkICh1bnNpZ25lZCBpZCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBhZGRyLCB1bnNpZ25lZCBzaXplKTsKK2V4dGVybiBpbnQgeHRib2FyZF9pMmNfd3JpdGUodW5zaWduZWQgaWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYWRkciwgdW5zaWduZWQgc2l6ZSk7CitleHRlcm4gaW50IHh0Ym9hcmRfaTJjX3dhaXRfbnZyYW1fYWNrKHVuc2lnbmVkIGlkLCB1bnNpZ25lZCBzd3RpbWVyKTsKKworLyogIHh0Ym9hcmQuYzogICovCitleHRlcm4gaW50IHh0Ym9hcmRfbnZyYW1fcmVhZCAodW5zaWduZWQgYWRkciwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjaGFyICpidWYpOworZXh0ZXJuIGludCB4dGJvYXJkX252cmFtX3dyaXRlKHVuc2lnbmVkIGFkZHIsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY2hhciAqYnVmKTsKK2V4dGVybiBpbnQgeHRib2FyZF9udnJhbV9iaW5mb19yZWFkICh4dDIwMDBfbnZyYW1fYmluZm8gKmJ1Zik7CitleHRlcm4gaW50IHh0Ym9hcmRfbnZyYW1fYmluZm9fd3JpdGUoeHQyMDAwX252cmFtX2JpbmZvICpidWYpOworZXh0ZXJuIGludCB4dGJvYXJkX252cmFtX2JpbmZvX3ZhbGlkKHh0MjAwMF9udnJhbV9iaW5mbyAqYnVmKTsKK2V4dGVybiBpbnQgeHRib2FyZF9ldGhlcm1hY19nZXQodW5zaWduZWQgY2hhciAqYnVmKTsKK2V4dGVybiBpbnQgeHRib2FyZF9ldGhlcm1hY19zZXQodW5zaWduZWQgY2hhciAqYnVmKTsKKworLyorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8gRnVuY3Rpb246IHh0Ym9hcmRfZ2V0X3J0Y190aW1lCisvCisvIERlc2NyaXB0aW9uOiAgR2V0IHRpbWUgc3RvcmVkIGluIHJlYWwtdGltZSBjbG9jay4KKy8KKy8gUmV0dXJuczogdGltZSBpbiBzZWNvbmRzIHN0b3JlZCBpbiByZWFsLXRpbWUgY2xvY2suCisvLSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiB1bnNpZ25lZCB4dGJvYXJkX2dldF9ydGNfdGltZSh2b2lkKTsKKworLyorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8gRnVuY3Rpb246IHh0Ym9hcmRfc2V0X3J0Y190aW1lCisvCisvIERlc2NyaXB0aW9uOiAgU2V0IHRpbWUgc3RvcmVkIGluIHJlYWwtdGltZSBjbG9jay4KKy8KKy8gUGFyYW1ldGVyczogCXRpbWUgLS0gdGltZSBpbiBzZWNvbmRzIHRvIHN0b3JlIHRvIHJlYWwtdGltZSBjbG9jaworLworLyBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIHh0Ym9hcmRfaTJjX3dyaXRlKCkgZXJyb3IgY29kZSBvdGhlcndpc2UuCisvLSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiBpbnQgeHRib2FyZF9zZXRfcnRjX3RpbWUodW5zaWduZWQgdGltZSk7CisKKworLyogIHh0ZnJlcS5jOiAgKi8KKy8qKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvIEZ1bmN0aW9uOiB4dGJvYXJkX21lYXN1cmVfc3lzX2NsaworLworLyBEZXNjcmlwdGlvbjogIEdldCBmcmVxdWVuY3kgb2Ygc3lzdGVtIGNsb2NrLgorLworLyBQYXJhbWV0ZXJzOglub25lCisvCisvIFJldHVybnM6IGZyZXF1ZW5jeSBvZiBzeXN0ZW0gY2xvY2suCisvLSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiB1bnNpZ25lZCB4dGJvYXJkX21lYXN1cmVfc3lzX2Nsayh2b2lkKTsKKworCisjaWYgMAkvKiBvbGQgc3R1ZmYgZnJvbSB4dGJvYXJkLmM6ICovCisKKy8qKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvIEZ1bmN0aW9uOiB4dGJvYXJkX252cmFtIHZhbGlkCisvCisvIERlc2NyaXB0aW9uOiAgRGV0ZXJtaW5lcyBpZiBkYXRhIGluIE5WUkFNIGlzIHZhbGlkLgorLworLyBQYXJhbWV0ZXJzOglkZWxheSAtLSAxMHVzIGRlbGF5IGZ1bmN0aW9uCisvCisvIFJldHVybnM6IDEgaWYgTlZSQU0gaXMgdmFsaWQsIDAgb3RoZXJ3aXNlCisvLSoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2V4dGVybiB1bnNpZ25lZCB4dGJvYXJkX252cmFtX3ZhbGlkKHZvaWQgKCpkZWxheSkoIHZvaWQgKSk7CisKKy8qKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvIEZ1bmN0aW9uOiB4dGJvYXJkX2dldF9udnJhbV9jb250ZW50cworLworLyBEZXNjcmlwdGlvbjogIFJldHVybnMgY29udGVudHMgb2YgTlZSQU0uCisvCisvIFBhcmFtZXRlcnM6IAlidWYgLS0gYnVmZmVyIHRvIE5WUkFNIGNvbnRlbnRzLgorLwkJZGVsYXkgLS0gMTB1cyBkZWxheSBmdW5jdGlvbgorLworLyBSZXR1cm5zOiAxIGlmIE5WUkFNIGlzIHZhbGlkLCAwIG90aGVyd2lzZQorLy0qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gdW5zaWduZWQgeHRib2FyZF9nZXRfbnZyYW1fY29udGVudHModW5zaWduZWQgY2hhciAqYnVmLCB2b2lkICgqZGVsYXkpKCB2b2lkICkpOworCisvKisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyBGdW5jdGlvbjogeHRib2FyZF9nZXRfZXRoZXJfYWRkcgorLworLyBEZXNjcmlwdGlvbjogIFJldHVybnMgZXRoZXJuZXQgYWRkcmVzcyBvZiBib2FyZC4KKy8KKy8gUGFyYW1ldGVyczogCWJ1ZiAtLSBidWZmZXIgdG8gc3RvcmUgZXRoZXJuZXQgYWRkcmVzcworLwkJZGVsYXkgLS0gMTB1cyBkZWxheSBmdW5jdGlvbgorLworLyBSZXR1cm5zOiBub3RoaW5nLgorLy0qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitleHRlcm4gdm9pZCB4dGJvYXJkX2dldF9ldGhlcl9hZGRyKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgdm9pZCAoKmRlbGF5KSggdm9pZCApKTsKKworI2VuZGlmIC8qMCovCisKKworI2VuZGlmIC8qX3h0Ym9hcmRfaF9pbmNsdWRlZF8qLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Eub3V0LmggYi9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKaW5kZXggYWY4YTFkZi4uZjkxM2NjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hLm91dC5oCisrKyBiL2luY2x1ZGUvbGludXgvYS5vdXQuaApAQCAtMTM4LDcgKzEzOCw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0jZGVmaW5lIF9OX1NFR01FTlRfUk9VTkQoeCkgKCgoeCkgKyBTRUdNRU5UX1NJWkUgLSAxKSAmIH4oU0VHTUVOVF9TSVpFIC0gMSkpCisjZGVmaW5lIF9OX1NFR01FTlRfUk9VTkQoeCkgQUxJR04oeCwgU0VHTUVOVF9TSVpFKQogCiAjZGVmaW5lIF9OX1RYVEVOREFERFIoeCkgKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IGIxMjNjYzAuLmY4NWNiZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0yMDYsNyArMjA2LDEwIEBACiAJdTgJCQllaWQ7CiAJdTgJCQlpb3NhcGljX3ZlY3RvcjsKIAl1MzIJCQlnbG9iYWxfaXJxOwotCXUzMgkJCXJlc2VydmVkOworCXN0cnVjdCB7CisJCXUzMgkJCWNwZWlfb3ZlcnJpZGVfZmxhZzoxOworCQl1MzIJCQlyZXNlcnZlZDozMTsKKwl9CQkJcGxpbnRfZmxhZ3M7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAogZW51bSBhY3BpX2ludGVycnVwdF9pZCB7CkBAIC0zNDIsMTEgKzM0NSwxOSBAQAogCiAvKiBQQ0kgTU1DT05GSUcgKi8KIAorLyogRGVmaW5lZCBpbiBQQ0kgRmlybXdhcmUgU3BlY2lmaWNhdGlvbiAzLjAgKi8KK3N0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnIHsKKwl1MzIJCQkJYmFzZV9hZGRyZXNzOworCXUzMgkJCQliYXNlX3Jlc2VydmVkOworCXUxNgkJCQlwY2lfc2VnbWVudF9ncm91cF9udW1iZXI7CisJdTgJCQkJc3RhcnRfYnVzX251bWJlcjsKKwl1OAkJCQllbmRfYnVzX251bWJlcjsKKwl1OAkJCQlyZXNlcnZlZFs0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogc3RydWN0IGFjcGlfdGFibGVfbWNmZyB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyCWhlYWRlcjsKIAl1OAkJCQlyZXNlcnZlZFs4XTsKLQl1MzIJCQkJYmFzZV9hZGRyZXNzOwotCXUzMgkJCQliYXNlX3Jlc2VydmVkOworCXN0cnVjdCBhY3BpX3RhYmxlX21jZmdfY29uZmlnCWNvbmZpZ1swXTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCiAvKiBUYWJsZSBIYW5kbGVycyAqLwpAQCAtMzkxLDYgKzQwMiw3IEBACiBpbnQgYWNwaV9nZXRfdGFibGVfaGVhZGVyX2Vhcmx5IChlbnVtIGFjcGlfdGFibGVfaWQgaWQsIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKmhlYWRlcik7CiBpbnQgYWNwaV90YWJsZV9wYXJzZV9tYWR0IChlbnVtIGFjcGlfbWFkdF9lbnRyeV9pZCBpZCwgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKIGludCBhY3BpX3RhYmxlX3BhcnNlX3NyYXQgKGVudW0gYWNwaV9zcmF0X2VudHJ5X2lkIGlkLCBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOworaW50IGFjcGlfcGFyc2VfbWNmZyAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiB2b2lkIGFjcGlfdGFibGVfcHJpbnQgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkcik7CiB2b2lkIGFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeSAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKm1hZHQpOwogdm9pZCBhY3BpX3RhYmxlX3ByaW50X3NyYXRfZW50cnkgKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpzcmF0KTsKQEAgLTQwNyw5ICs0MTksMTMgQEAKIGludCBhY3BpX3VubWFwX2xzYXBpYyhpbnQgY3B1KTsKICNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwogCitpbnQgYWNwaV9yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1NjQgcGh5c19hZGRyLCB1MzIgZ3NpX2Jhc2UpOworaW50IGFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZ3NpX2Jhc2UpOworCiBleHRlcm4gaW50IGFjcGlfbXBfY29uZmlnOwogCi1leHRlcm4gdTMyIHBjaV9tbWNmZ19iYXNlX2FkZHI7CitleHRlcm4gc3RydWN0IGFjcGlfdGFibGVfbWNmZ19jb25maWcgKnBjaV9tbWNmZ19jb25maWc7CitleHRlcm4gaW50IHBjaV9tbWNmZ19jb25maWdfbnVtOwogCiBleHRlcm4gaW50IHNiZl9wb3J0IDsKIApAQCAtNDYyLDcgKzQ3OCw3IEBACiBzdHJ1Y3QgcGNpX2RldjsKIAogaW50IGFjcGlfcGNpX2lycV9lbmFibGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBhY3BpX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSk7Cit2b2lkIGFjcGlfcGVuYWxpemVfaXNhX2lycShpbnQgaXJxLCBpbnQgYWN0aXZlKTsKIAogI2lmZGVmIENPTkZJR19BQ1BJX0RFQUxMT0NBVEVfSVJRCiB2b2lkIGFjcGlfcGNpX2lycV9kaXNhYmxlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRhbGsuaCBiL2luY2x1ZGUvbGludXgvYXRhbGsuaAppbmRleCAwOWExNDUxLi45MTFjMDljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0YWxrLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdGFsay5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfX0xJTlVYX0FUQUxLX0hfXwogI2RlZmluZSBfX0xJTlVYX0FUQUxLX0hfXwogCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCiAvKgogICogQXBwbGVUYWxrIG5ldHdvcmtpbmcgc3RydWN0dXJlcwogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvYXVkaXQuaAppbmRleCBiZjJhZDNiLi42OGFiYTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCkBAIC0xNjUsNyArMTY1LDcgQEAKICNkZWZpbmUgQVVESVRfQVJDSF9TSDY0CQkoRU1fU0h8X19BVURJVF9BUkNIXzY0QklUKQogI2RlZmluZSBBVURJVF9BUkNIX1NIRUw2NAkoRU1fU0h8X19BVURJVF9BUkNIXzY0QklUfF9fQVVESVRfQVJDSF9MRSkKICNkZWZpbmUgQVVESVRfQVJDSF9TUEFSQwkoRU1fU1BBUkMpCi0jZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkM2NAkoRU1fU1BBUkM2NHxfX0FVRElUX0FSQ0hfNjRCSVQpCisjZGVmaW5lIEFVRElUX0FSQ0hfU1BBUkM2NAkoRU1fU1BBUkNWOXxfX0FVRElUX0FSQ0hfNjRCSVQpCiAjZGVmaW5lIEFVRElUX0FSQ0hfVjg1MAkJKEVNX1Y4NTB8X19BVURJVF9BUkNIX0xFKQogI2RlZmluZSBBVURJVF9BUkNIX1g4Nl82NAkoRU1fWDg2XzY0fF9fQVVESVRfQVJDSF82NEJJVHxfX0FVRElUX0FSQ0hfTEUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmlvLmggYi9pbmNsdWRlL2xpbnV4L2Jpby5oCmluZGV4IDAzODAyMjcuLjM2ZWYyOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW8uaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3ByaW8uaD4KIAogLyogUGxhdGZvcm1zIG1heSBzZXQgdGhpcyB0byB0ZWFjaCB0aGUgQklPIGxheWVyIGFib3V0IElPTU1VIGhhcmR3YXJlLiAqLwogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMTUwLDYgKzE1MSwxOSBAQAogI2RlZmluZSBCSU9fUldfU1lOQwk0CiAKIC8qCisgKiB1cHBlciAxNiBiaXRzIG9mIGJpX3J3IGRlZmluZSB0aGUgaW8gcHJpb3JpdHkgb2YgdGhpcyBiaW8KKyAqLworI2RlZmluZSBCSU9fUFJJT19TSElGVAkoOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSAtIElPUFJJT19CSVRTKQorI2RlZmluZSBiaW9fcHJpbyhiaW8pCSgoYmlvKS0+YmlfcncgPj4gQklPX1BSSU9fU0hJRlQpCisjZGVmaW5lIGJpb19wcmlvX3ZhbGlkKGJpbykJaW9wcmlvX3ZhbGlkKGJpb19wcmlvKGJpbykpCisKKyNkZWZpbmUgYmlvX3NldF9wcmlvKGJpbywgcHJpbykJCWRvIHsJCQlcCisJV0FSTl9PTihwcmlvID49ICgxIDw8IElPUFJJT19CSVRTKSk7CQkJXAorCShiaW8pLT5iaV9ydyAmPSAoKDFVTCA8PCBCSU9fUFJJT19TSElGVCkgLSAxKTsJCVwKKwkoYmlvKS0+YmlfcncgfD0gKCh1bnNpZ25lZCBsb25nKSAocHJpbykgPDwgQklPX1BSSU9fU0hJRlQpOwlcCit9IHdoaWxlICgwKQorCisvKgogICogdmFyaW91cyBtZW1iZXIgYWNjZXNzLCBub3RlIHRoYXQgYmlvX2RhdGEgc2hvdWxkIG9mIGNvdXJzZSBub3QgYmUgdXNlZAogICogb24gaGlnaG1lbSBwYWdlIHZlY3RvcnMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKaW5kZXggNjAyNzIxNC4uMDg4MWI1YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCkBAIC01NCwxNiArNTQsMjMgQEAKIAogc3RydWN0IGNmcV9xdWV1ZTsKIHN0cnVjdCBjZnFfaW9fY29udGV4dCB7Ci0Jdm9pZCAoKmR0b3IpKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqKTsKLQl2b2lkICgqZXhpdCkoc3RydWN0IGNmcV9pb19jb250ZXh0ICopOwotCi0Jc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKLQogCS8qCiAJICogY2lyY3VsYXIgbGlzdCBvZiBjZnFfaW9fY29udGV4dHMgYmVsb25naW5nIHRvIGEgcHJvY2VzcyBpbyBjb250ZXh0CiAJICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CisJdm9pZCAqa2V5OworCisJc3RydWN0IGlvX2NvbnRleHQgKmlvYzsKKworCXVuc2lnbmVkIGxvbmcgbGFzdF9lbmRfcmVxdWVzdDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcXVldWU7CisJdW5zaWduZWQgbG9uZyB0dGltZV90b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR0aW1lX3NhbXBsZXM7CisJdW5zaWduZWQgbG9uZyB0dGltZV9tZWFuOworCisJdm9pZCAoKmR0b3IpKHN0cnVjdCBjZnFfaW9fY29udGV4dCAqKTsKKwl2b2lkICgqZXhpdCkoc3RydWN0IGNmcV9pb19jb250ZXh0ICopOwogfTsKIAogLyoKQEAgLTczLDcgKzgwLDkgQEAKICAqLwogc3RydWN0IGlvX2NvbnRleHQgewogCWF0b21pY190IHJlZmNvdW50OwotCXBpZF90IHBpZDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisKKwlpbnQgKCpzZXRfaW9wcmlvKShzdHJ1Y3QgaW9fY29udGV4dCAqLCB1bnNpZ25lZCBpbnQpOwogCiAJLyoKIAkgKiBGb3IgcmVxdWVzdCBiYXRjaGluZwpAQCAtODEsMTQgKzkwLDEzIEBACiAJdW5zaWduZWQgbG9uZyBsYXN0X3dhaXRlZDsgLyogVGltZSBsYXN0IHdva2VuIGFmdGVyIHdhaXQgZm9yIHJlcXVlc3QgKi8KIAlpbnQgbnJfYmF0Y2hfcmVxdWVzdHM7ICAgICAvKiBOdW1iZXIgb2YgcmVxdWVzdHMgbGVmdCBpbiB0aGUgYmF0Y2ggKi8KIAotCXNwaW5sb2NrX3QgbG9jazsKLQogCXN0cnVjdCBhc19pb19jb250ZXh0ICphaWM7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiB9OwogCiB2b2lkIHB1dF9pb19jb250ZXh0KHN0cnVjdCBpb19jb250ZXh0ICppb2MpOwogdm9pZCBleGl0X2lvX2NvbnRleHQodm9pZCk7CitzdHJ1Y3QgaW9fY29udGV4dCAqY3VycmVudF9pb19jb250ZXh0KGludCBnZnBfZmxhZ3MpOwogc3RydWN0IGlvX2NvbnRleHQgKmdldF9pb19jb250ZXh0KGludCBnZnBfZmxhZ3MpOwogdm9pZCBjb3B5X2lvX2NvbnRleHQoc3RydWN0IGlvX2NvbnRleHQgKipwZHN0LCBzdHJ1Y3QgaW9fY29udGV4dCAqKnBzcmMpOwogdm9pZCBzd2FwX2lvX2NvbnRleHQoc3RydWN0IGlvX2NvbnRleHQgKippb2MxLCBzdHJ1Y3QgaW9fY29udGV4dCAqKmlvYzIpOwpAQCAtMTM0LDYgKzE0Miw4IEBACiAKIAl2b2lkICplbGV2YXRvcl9wcml2YXRlOwogCisJdW5zaWduZWQgc2hvcnQgaW9wcmlvOworCiAJaW50IHJxX3N0YXR1czsJLyogc2hvdWxkIHNwbGl0IHRoaXMgaW50byBhIGZldyBzdGF0dXMgYml0cyAqLwogCXN0cnVjdCBnZW5kaXNrICpycV9kaXNrOwogCWludCBlcnJvcnM7CkBAIC01MzksMTUgKzU0OSwxMiBAQAogZXh0ZXJuIHZvaWQgYmxrX3B1dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIHZvaWQgYmxrX2VuZF9zeW5jX3JxKHN0cnVjdCByZXF1ZXN0ICpycSk7CiBleHRlcm4gdm9pZCBibGtfYXR0ZW1wdF9yZW1lcmdlKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiB2b2lkIF9fYmxrX2F0dGVtcHRfcmVtZXJnZShyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gc3RydWN0IHJlcXVlc3QgKmJsa19nZXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50LCBpbnQpOwogZXh0ZXJuIHZvaWQgYmxrX2luc2VydF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiB2b2lkIGJsa19wbHVnX2RldmljZShyZXF1ZXN0X3F1ZXVlX3QgKik7CiBleHRlcm4gaW50IGJsa19yZW1vdmVfcGx1ZyhyZXF1ZXN0X3F1ZXVlX3QgKik7CiBleHRlcm4gdm9pZCBibGtfcmVjb3VudF9zZWdtZW50cyhyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IGJpbyAqKTsKLWV4dGVybiBpbnQgYmxrX3BoeXNfY29udGlnX3NlZ21lbnQocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICosIHN0cnVjdCBiaW8gKik7Ci1leHRlcm4gaW50IGJsa19od19jb250aWdfc2VnbWVudChyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKiwgc3RydWN0IGJpbyAqKTsKIGV4dGVybiBpbnQgc2NzaV9jbWRfaW9jdGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IGdlbmRpc2sgKiwgdW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKIGV4dGVybiB2b2lkIGJsa19zdGFydF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpOwogZXh0ZXJuIHZvaWQgYmxrX3N0b3BfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKQEAgLTYzMSw3ICs2MzgsNiBAQAogZXh0ZXJuIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfb3JkZXJlZChyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9pc3N1ZV9mbHVzaF9mbihyZXF1ZXN0X3F1ZXVlX3QgKiwgaXNzdWVfZmx1c2hfZm4gKik7Ci1leHRlcm4gaW50IGJsa2Rldl9zY3NpX2lzc3VlX2ZsdXNoX2ZuKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgZ2VuZGlzayAqLCBzZWN0b3JfdCAqKTsKIGV4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX3N0YXJ0X3ByZV9mbHVzaChyZXF1ZXN0X3F1ZXVlX3QgKixzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiBpbnQgYmxrX2NvbXBsZXRlX2JhcnJpZXJfcnEocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGludCk7CiBleHRlcm4gaW50IGJsa19jb21wbGV0ZV9iYXJyaWVyX3JxX2xvY2tlZChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKQEAgLTY3NSw4ICs2ODEsNiBAQAogCiAjZGVmaW5lIGJsa2Rldl9lbnRyeV90b19yZXF1ZXN0KGVudHJ5KSBsaXN0X2VudHJ5KChlbnRyeSksIHN0cnVjdCByZXF1ZXN0LCBxdWV1ZWxpc3QpCiAKLWV4dGVybiB2b2lkIGRyaXZlX3N0YXRfYWNjdChzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIGludCk7Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX2hhcmRzZWN0X3NpemUocmVxdWVzdF9xdWV1ZV90ICpxKQogewogCWludCByZXR2YWwgPSA1MTI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jvb3RtZW0uaCBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCmluZGV4IDUwMGY0NTEuLjgyYmQ4ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCkBAIC0yMiw2ICsyMiwxMCBAQAogICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfcGZuOwogCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNhdmVkX21heF9wZm47CisjZW5kaWYKKwogLyoKICAqIG5vZGVfYm9vdG1lbV9tYXAgaXMgYSBtYXAgcG9pbnRlciAtIHRoZSBiaXRzIHJlcHJlc2VudCBhbGwgcGh5c2ljYWwgCiAgKiBtZW1vcnkgcGFnZXMgKGluY2x1ZGluZyBob2xlcykgb24gdGhlIG5vZGUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmggYi9pbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgKaW5kZXggODAyYzkxZS4uOTA4Mjg0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9idWZmZXJfaGVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgvYnVmZmVyX2hlYWQuaApAQCAtMTksNiArMTksOSBAQAogCUJIX0RpcnR5LAkvKiBJcyBkaXJ0eSAqLwogCUJIX0xvY2ssCS8qIElzIGxvY2tlZCAqLwogCUJIX1JlcSwJCS8qIEhhcyBiZWVuIHN1Ym1pdHRlZCBmb3IgSS9PICovCisJQkhfVXB0b2RhdGVfTG9jaywvKiBVc2VkIGJ5IHRoZSBmaXJzdCBiaCBpbiBhIHBhZ2UsIHRvIHNlcmlhbGlzZQorCQkJICAqIElPIGNvbXBsZXRpb24gb2Ygb3RoZXIgYnVmZmVycyBpbiB0aGUgcGFnZQorCQkJICAqLwogCiAJQkhfTWFwcGVkLAkvKiBIYXMgYSBkaXNrIG1hcHBpbmcgKi8KIAlCSF9OZXcsCQkvKiBEaXNrIG1hcHBpbmcgd2FzIG5ld2x5IGNyZWF0ZWQgYnkgZ2V0X2Jsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oIGIvaW5jbHVkZS9saW51eC9ieXRlb3JkZXIvc3dhYmIuaAppbmRleCBkMjhkOWE4Li5kNWYyYTMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2J5dGVvcmRlci9zd2FiYi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnl0ZW9yZGVyL3N3YWJiLmgKQEAgLTkyLDI5ICs5MiwzMiBAQAogI2VuZGlmIC8qIE9QVElNSVpFICovCiAKIAotc3RhdGljIF9faW5saW5lX18gX19jb25zdF9fIF9fdTMyIF9fZnN3YWh3MzIoX191MzIgeCkKK3N0YXRpYyBpbmxpbmUgX191MzIgX19mc3dhaHczMihfX3UzMiB4KQogewogCXJldHVybiBfX2FyY2hfX3N3YWh3MzIoeCk7CiB9Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWh3MzJwKF9fdTMyICp4KQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fc3dhaHczMnAoX191MzIgKngpCiB7CiAJcmV0dXJuIF9fYXJjaF9fc3dhaHczMnAoeCk7CiB9Ci1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhaHczMnMoX191MzIgKmFkZHIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YWh3MzJzKF9fdTMyICphZGRyKQogewogCV9fYXJjaF9fc3dhaHczMnMoYWRkcik7CiB9CiAKLQotc3RhdGljIF9faW5saW5lX18gX19jb25zdF9fIF9fdTMyIF9fZnN3YWhiMzIoX191MzIgeCkKK3N0YXRpYyBpbmxpbmUgX191MzIgX19mc3dhaGIzMihfX3UzMiB4KQogewogCXJldHVybiBfX2FyY2hfX3N3YWhiMzIoeCk7CiB9Ci1zdGF0aWMgX19pbmxpbmVfXyBfX3UzMiBfX3N3YWhiMzJwKF9fdTMyICp4KQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fc3dhaGIzMnAoX191MzIgKngpCiB7CiAJcmV0dXJuIF9fYXJjaF9fc3dhaGIzMnAoeCk7CiB9Ci1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fc3dhaGIzMnMoX191MzIgKmFkZHIpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N3YWhiMzJzKF9fdTMyICphZGRyKQogewogCV9fYXJjaF9fc3dhaGIzMnMoYWRkcik7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2NhY2hlLmgKaW5kZXggNGQ3NjdiOS4uZjZiNWE0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FjaGUuaApAQCAtMTMsNiArMTMsMTIgQEAKICNkZWZpbmUgU01QX0NBQ0hFX0JZVEVTIEwxX0NBQ0hFX0JZVEVTCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfU1BBUkM2NCkKKyNkZWZpbmUgX19yZWFkX21vc3RseSBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEucmVhZF9tb3N0bHkiKSkpCisjZWxzZQorI2RlZmluZSBfX3JlYWRfbW9zdGx5CisjZW5kaWYKKwogI2lmbmRlZiBfX19fY2FjaGVsaW5lX2FsaWduZWQKICNkZWZpbmUgX19fX2NhY2hlbGluZV9hbGlnbmVkIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFNNUF9DQUNIRV9CWVRFUykpKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmggYi9pbmNsdWRlL2xpbnV4L2NjaXNzX2lvY3RsLmgKaW5kZXggZWUwYzZlOC4uNDI0ZDVlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jY2lzc19pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvY2Npc3NfaW9jdGwuaApAQCAtMTAsNiArMTAsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgX2NjaXNzX3BjaV9pbmZvX3N0cnVjdAogewogCXVuc2lnbmVkIGNoYXIgCWJ1czsKKwl1bnNpZ25lZCBzaG9ydAlkb21haW47CiAJdW5zaWduZWQgY2hhciAJZGV2X2ZuOwogCV9fdTMyIAkJYm9hcmRfaWQ7CiB9IGNjaXNzX3BjaV9pbmZvX3N0cnVjdDsgCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXRfaW9jdGwuaAppbmRleCA3MGE0ZWJiLi5lY2IwZDM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdF9pb2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0X2lvY3RsLmgKQEAgLTM0NiwxMCArMzQ2LDI3IEBACiAvKiBMUCAqLwogQ09NUEFUSUJMRV9JT0NUTChMUEdFVFNUQVRVUykKIC8qIHBwZGV2ICovCitDT01QQVRJQkxFX0lPQ1RMKFBQU0VUTU9ERSkKK0NPTVBBVElCTEVfSU9DVEwoUFBSU1RBVFVTKQorQ09NUEFUSUJMRV9JT0NUTChQUFJDT05UUk9MKQorQ09NUEFUSUJMRV9JT0NUTChQUFdDT05UUk9MKQorQ09NUEFUSUJMRV9JT0NUTChQUEZDT05UUk9MKQorQ09NUEFUSUJMRV9JT0NUTChQUFJEQVRBKQorQ09NUEFUSUJMRV9JT0NUTChQUFdEQVRBKQogQ09NUEFUSUJMRV9JT0NUTChQUENMQUlNKQogQ09NUEFUSUJMRV9JT0NUTChQUFJFTEVBU0UpCi1DT01QQVRJQkxFX0lPQ1RMKFBQRVhDTCkKIENPTVBBVElCTEVfSU9DVEwoUFBZSUVMRCkKK0NPTVBBVElCTEVfSU9DVEwoUFBFWENMKQorQ09NUEFUSUJMRV9JT0NUTChQUERBVEFESVIpCitDT01QQVRJQkxFX0lPQ1RMKFBQTkVHT1QpCitDT01QQVRJQkxFX0lPQ1RMKFBQV0NUTE9OSVJRKQorQ09NUEFUSUJMRV9JT0NUTChQUENMUklSUSkKK0NPTVBBVElCTEVfSU9DVEwoUFBTRVRQSEFTRSkKK0NPTVBBVElCTEVfSU9DVEwoUFBHRVRNT0RFUykKK0NPTVBBVElCTEVfSU9DVEwoUFBHRVRNT0RFKQorQ09NUEFUSUJMRV9JT0NUTChQUEdFVFBIQVNFKQorQ09NUEFUSUJMRV9JT0NUTChQUEdFVEZMQUdTKQorQ09NUEFUSUJMRV9JT0NUTChQUFNFVEZMQUdTKQogLyogQ0RST00gc3R1ZmYgKi8KIENPTVBBVElCTEVfSU9DVEwoQ0RST01QQVVTRSkKIENPTVBBVElCTEVfSU9DVEwoQ0RST01SRVNVTUUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NwdS5oIGIvaW5jbHVkZS9saW51eC9jcHUuaAppbmRleCBmZTAyOThlLi5lODkwNGMwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvY3B1LmgKQEAgLTY5LDYgKzY5LDcgQEAKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmZuIyNfbmIpOwkJCVwKIH0KIGludCBjcHVfZG93bih1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiBpbnQgX19hdHRyaWJ1dGVfXygod2VhaykpIHNtcF9wcmVwYXJlX2NwdShpbnQgY3B1KTsKICNkZWZpbmUgY3B1X2lzX29mZmxpbmUoY3B1KSB1bmxpa2VseSghY3B1X29ubGluZShjcHUpKQogI2Vsc2UKICNkZWZpbmUgbG9ja19jcHVfaG90cGx1ZygpCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggOTI3ZGFhOC4uZmY3ZjgwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAJLyogb3B0aW9uYWwgKi8KIAlpbnQJKCpleGl0KQkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKLQlpbnQJKCpzdXNwZW5kKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHUzMiBzdGF0ZSk7CisJaW50CSgqc3VzcGVuZCkJKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LCBwbV9tZXNzYWdlX3QgcG1zZyk7CiAJaW50CSgqcmVzdW1lKQkoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCXN0cnVjdCBmcmVxX2F0dHIJKiphdHRyOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3Jhc2hfZHVtcC5oIGIvaW5jbHVkZS9saW51eC9jcmFzaF9kdW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0ZDc1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvY3Jhc2hfZHVtcC5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgTElOVVhfQ1JBU0hfRFVNUF9ICisjZGVmaW5lIExJTlVYX0NSQVNIX0RVTVBfSAorCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKyNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjZGVmaW5lIEVMRkNPUkVfQUREUl9NQVgJKC0xVUxMKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBlbGZjb3JlaGRyX2FkZHI7CitleHRlcm4gc3NpemVfdCBjb3B5X29sZG1lbV9wYWdlKHVuc2lnbmVkIGxvbmcsIGNoYXIgKiwgc2l6ZV90LAorCQkJCQkJdW5zaWduZWQgbG9uZywgaW50KTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfdm1jb3JlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3ZtY29yZTsKKworI2VuZGlmIC8qIENPTkZJR19DUkFTSF9EVU1QICovCisjZW5kaWYgLyogTElOVVhfQ1JBU0hEVU1QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmggYi9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCmluZGV4IDM4N2RhNmEuLjVlMmJjYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaApAQCAtNjEsNiArNjEsMTUgQEAKICNkZWZpbmUgQ1JZUFRPX0RJUl9ERUNSWVBUCQkwCiAKIHN0cnVjdCBzY2F0dGVybGlzdDsKK3N0cnVjdCBjcnlwdG9fdGZtOworCitzdHJ1Y3QgY2lwaGVyX2Rlc2MgeworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisJdm9pZCAoKmNyZm4pKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CisJdW5zaWduZWQgaW50ICgqcHJmbikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqZHN0LAorCQkJICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwl2b2lkICppbmZvOworfTsKIAogLyoKICAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKQEAgLTczLDYgKzgyLDE5IEBACiAJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7CiAJdm9pZCAoKmNpYV9lbmNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwogCXZvaWQgKCpjaWFfZGVjcnlwdCkodm9pZCAqY3R4LCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKKworCXVuc2lnbmVkIGludCAoKmNpYV9lbmNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKKwl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKKwkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcyk7CisJdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCisJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpOworCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2NiYykoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAorCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAorCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKIH07CiAKIHN0cnVjdCBkaWdlc3RfYWxnIHsKQEAgLTEwMiw2ICsxMjQsNyBAQAogCXUzMiBjcmFfZmxhZ3M7CiAJdW5zaWduZWQgaW50IGNyYV9ibG9ja3NpemU7CiAJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOworCXVuc2lnbmVkIGludCBjcmFfYWxpZ25tYXNrOwogCWNvbnN0IGNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CiAKIAl1bmlvbiB7CkBAIC0xMzYsNyArMTU5LDYgQEAKICAqIGFuZCBjb3JlIHByb2Nlc3NpbmcgbG9naWMuICBNYW5hZ2VkIHZpYSBjcnlwdG9fYWxsb2NfdGZtKCkgYW5kCiAgKiBjcnlwdG9fZnJlZV90Zm0oKSwgYXMgd2VsbCBhcyB0aGUgdmFyaW91cyBoZWxwZXJzIGJlbG93LgogICovCi1zdHJ1Y3QgY3J5cHRvX3RmbTsKIAogc3RydWN0IGNpcGhlcl90Zm0gewogCXZvaWQgKmNpdF9pdjsKQEAgLTI2Niw2ICsyODgsMTYgQEAKIAlyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2FsaWdubWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpjcnlwdG9fdGZtX2N0eChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXJldHVybiAodm9pZCAqKSZ0Zm1bMV07Cit9CisKIC8qCiAgKiBBUEkgd3JhcHBlcnMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDdiNzgxYTcuLjA2ZTVkNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtNjksNyArNjksNyBAQAogZXh0ZXJuIGludCBidXNfcmVnaXN0ZXIoc3RydWN0IGJ1c190eXBlICogYnVzKTsKIGV4dGVybiB2b2lkIGJ1c191bnJlZ2lzdGVyKHN0cnVjdCBidXNfdHlwZSAqIGJ1cyk7CiAKLWV4dGVybiBpbnQgYnVzX3Jlc2Nhbl9kZXZpY2VzKHN0cnVjdCBidXNfdHlwZSAqIGJ1cyk7CitleHRlcm4gdm9pZCBidXNfcmVzY2FuX2RldmljZXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSAqIGdldF9idXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKIGV4dGVybiB2b2lkIHB1dF9idXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKQEAgLTgwLDYgKzgwLDggQEAKIAogaW50IGJ1c19mb3JfZWFjaF9kZXYoc3RydWN0IGJ1c190eXBlICogYnVzLCBzdHJ1Y3QgZGV2aWNlICogc3RhcnQsIHZvaWQgKiBkYXRhLAogCQkgICAgIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOworc3RydWN0IGRldmljZSAqIGJ1c19maW5kX2RldmljZShzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgc3RydWN0IGRldmljZSAqc3RhcnQsCisJCQkJdm9pZCAqZGF0YSwgaW50ICgqbWF0Y2gpKHN0cnVjdCBkZXZpY2UgKiwgdm9pZCAqKSk7CiAKIGludCBidXNfZm9yX2VhY2hfZHJ2KHN0cnVjdCBidXNfdHlwZSAqIGJ1cywgc3RydWN0IGRldmljZV9kcml2ZXIgKiBzdGFydCwgCiAJCSAgICAgdm9pZCAqIGRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqLCB2b2lkICopKTsKQEAgLTE0Miw2ICsxNDQsOSBAQAogCiBleHRlcm4gaW50IGRyaXZlcl9mb3JfZWFjaF9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYsIHN0cnVjdCBkZXZpY2UgKiBzdGFydCwKIAkJCQkgIHZvaWQgKiBkYXRhLCBpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKK3N0cnVjdCBkZXZpY2UgKiBkcml2ZXJfZmluZF9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlICpzdGFydCwgdm9pZCAqZGF0YSwKKwkJCQkgICBpbnQgKCptYXRjaCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIAogCiAvKgpAQCAtMjc5LDggKzI4NCwxMCBAQAogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXI7CS8qIHdoaWNoIGRyaXZlciBoYXMgYWxsb2NhdGVkIHRoaXMKIAkJCQkJICAgZGV2aWNlICovCiAJdm9pZAkJKmRyaXZlcl9kYXRhOwkvKiBkYXRhIHByaXZhdGUgdG8gdGhlIGRyaXZlciAqLwotCXZvaWQJCSpwbGF0Zm9ybV9kYXRhOwkvKiBQbGF0Zm9ybSBzcGVjaWZpYyBkYXRhIChlLmcuIEFDUEksCi0JCQkJCSAgIEJJT1MgZGF0YSByZWxldmFudCB0byBkZXZpY2UpICovCisJdm9pZAkJKnBsYXRmb3JtX2RhdGE7CS8qIFBsYXRmb3JtIHNwZWNpZmljIGRhdGEsIGRldmljZQorCQkJCQkgICBjb3JlIGRvZXNuJ3QgdG91Y2ggaXQgKi8KKwl2b2lkCQkqZmlybXdhcmVfZGF0YTsgLyogRmlybXdhcmUgc3BlY2lmaWMgZGF0YSAoZS5nLiBBQ1BJLAorCQkJCQkgICBCSU9TIGRhdGEpLHJlc2VydmVkIGZvciBkZXZpY2UgY29yZSovCiAJc3RydWN0IGRldl9wbV9pbmZvCXBvd2VyOwogCiAJdTY0CQkqZG1hX21hc2s7CS8qIGRtYSBtYXNrIChpZiBkbWEnYWJsZSBkZXZpY2UpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtaS5oIGIvaW5jbHVkZS9saW51eC9kbWkuaAppbmRleCBkMmJjZjU1Li41ZTkzZTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1pLmgKQEAgLTksNiArOSw3IEBACiAJRE1JX1NZU19WRU5ET1IsCiAJRE1JX1BST0RVQ1RfTkFNRSwKIAlETUlfUFJPRFVDVF9WRVJTSU9OLAorCURNSV9QUk9EVUNUX1NFUklBTCwKIAlETUlfQk9BUkRfVkVORE9SLAogCURNSV9CT0FSRF9OQU1FLAogCURNSV9CT0FSRF9WRVJTSU9OLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kcWJsa192MS5oIGIvaW5jbHVkZS9saW51eC9kcWJsa192MS5oCmluZGV4IDQyZmJmNDcuLjU3ZjEyNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHFibGtfdjEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3YxLmgKQEAgLTExLDYgKzExLDEyIEBACiAvKiBSb290IHNxdWFzaCB0dXJuZWQgb24gKi8KICNkZWZpbmUgVjFfRFFGX1JTUVVBU0ggMQogCisvKiBOdW1iZXJzIG9mIGJsb2NrcyBuZWVkZWQgZm9yIHVwZGF0ZXMgKi8KKyNkZWZpbmUgVjFfSU5JVF9BTExPQyAxCisjZGVmaW5lIFYxX0lOSVRfUkVXUklURSAxCisjZGVmaW5lIFYxX0RFTF9BTExPQyAwCisjZGVmaW5lIFYxX0RFTF9SRVdSSVRFIDIKKwogLyogU3BlY2lhbCBpbmZvcm1hdGlvbiBhYm91dCBxdW90YWZpbGUgKi8KIHN0cnVjdCB2MV9tZW1fZHFpbmZvIHsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RxYmxrX3YyLmggYi9pbmNsdWRlL2xpbnV4L2RxYmxrX3YyLmgKaW5kZXggNGE2YzVmNi4uNGY4NTMzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kcWJsa192Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvZHFibGtfdjIuaApAQCAtMTAsNiArMTAsMTIgQEAKIC8qIGlkIG51bWJlcnMgb2YgcXVvdGEgZm9ybWF0ICovCiAjZGVmaW5lIFFGTVRfVkZTX1YwIDIKIAorLyogTnVtYmVycyBvZiBibG9ja3MgbmVlZGVkIGZvciB1cGRhdGVzICovCisjZGVmaW5lIFYyX0lOSVRfQUxMT0MgNAorI2RlZmluZSBWMl9JTklUX1JFV1JJVEUgMgorI2RlZmluZSBWMl9ERUxfQUxMT0MgMAorI2RlZmluZSBWMl9ERUxfUkVXUklURSA2CisKIC8qIElubWVtb3J5IGNvcHkgb2YgdmVyc2lvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwogc3RydWN0IHYyX21lbV9kcWluZm8gewogCXVuc2lnbmVkIGludCBkcWlfYmxvY2tzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oIGIvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCmluZGV4IGVlNTRmODEuLmVhNmJiYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VsZXZhdG9yLmgKQEAgLTE2LDkgKzE2LDkgQEAKIHR5cGVkZWYgdm9pZCAoZWxldmF0b3JfcmVxdWV1ZV9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiB0eXBlZGVmIHN0cnVjdCByZXF1ZXN0ICooZWxldmF0b3JfcmVxdWVzdF9saXN0X2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogdHlwZWRlZiB2b2lkIChlbGV2YXRvcl9jb21wbGV0ZWRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwotdHlwZWRlZiBpbnQgKGVsZXZhdG9yX21heV9xdWV1ZV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBpbnQpOwordHlwZWRlZiBpbnQgKGVsZXZhdG9yX21heV9xdWV1ZV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBpbnQsIHN0cnVjdCBiaW8gKik7CiAKLXR5cGVkZWYgaW50IChlbGV2YXRvcl9zZXRfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIGludCk7Cit0eXBlZGVmIGludCAoZWxldmF0b3Jfc2V0X3JlcV9mbikgKHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBzdHJ1Y3QgYmlvICosIGludCk7CiB0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX3B1dF9yZXFfZm4pIChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiB0eXBlZGVmIHZvaWQgKGVsZXZhdG9yX2RlYWN0aXZhdGVfcmVxX2ZuKSAocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICopOwogCkBAIC05Niw5ICs5Niw5IEBACiBleHRlcm4gc3RydWN0IHJlcXVlc3QgKmVsdl9sYXR0ZXJfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gaW50IGVsdl9yZWdpc3Rlcl9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpOwogZXh0ZXJuIHZvaWQgZWx2X3VucmVnaXN0ZXJfcXVldWUocmVxdWVzdF9xdWV1ZV90ICpxKTsKLWV4dGVybiBpbnQgZWx2X21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50KTsKK2V4dGVybiBpbnQgZWx2X21heV9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKiwgaW50LCBzdHJ1Y3QgYmlvICopOwogZXh0ZXJuIHZvaWQgZWx2X2NvbXBsZXRlZF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKLWV4dGVybiBpbnQgZWx2X3NldF9yZXF1ZXN0KHJlcXVlc3RfcXVldWVfdCAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOworZXh0ZXJuIGludCBlbHZfc2V0X3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCByZXF1ZXN0ICosIHN0cnVjdCBiaW8gKiwgaW50KTsKIGV4dGVybiB2b2lkIGVsdl9wdXRfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKaW5kZXggYTE0NzgyNS4uY2U4NTE4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBfTElOVVhfRVRIRVJERVZJQ0VfSAogCiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTMyLDcgKzMzLDcgQEAKIAkJCQkgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB2b2lkICpkYWRkciwKIAkJCQkgICB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKTsKIGV4dGVybiBpbnQJCWV0aF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydAlldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBfX2JlMTYJCWV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQJCWV0aF9oZWFkZXJfY2FjaGVfdXBkYXRlKHN0cnVjdCBoaF9jYWNoZSAqaGgsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQl1bnNpZ25lZCBjaGFyICogaGFkZHIpOwogZXh0ZXJuIGludAkJZXRoX2hlYWRlcl9jYWNoZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKQEAgLTY1LDcgKzY2LDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoY29uc3QgdTggKmFkZHIpCiB7Ci0JcmV0dXJuIGFkZHJbMF0gJiAweDAxOworCXJldHVybiAoKGFkZHJbMF0gIT0gMHhmZikgJiYgKDB4MDEgJiBhZGRyWzBdKSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQyX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDJfZnMuaAppbmRleCBmYWI0MzUyLi5hNjU3MTMwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQyX2ZzLmgKQEAgLTMwMCwxOCArMzAwLDE5IEBACiAvKgogICogTW91bnQgZmxhZ3MKICAqLwotI2RlZmluZSBFWFQyX01PVU5UX0NIRUNLCQkweDAwMDEJLyogRG8gbW91bnQtdGltZSBjaGVja3MgKi8KLSNkZWZpbmUgRVhUMl9NT1VOVF9PTERBTExPQwkJMHgwMDAyICAvKiBEb24ndCB1c2UgdGhlIG5ldyBPcmxvdiBhbGxvY2F0b3IgKi8KLSNkZWZpbmUgRVhUMl9NT1VOVF9HUlBJRAkJMHgwMDA0CS8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCi0jZGVmaW5lIEVYVDJfTU9VTlRfREVCVUcJCTB4MDAwOAkvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLwotI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19DT05UCQkweDAwMTAJLyogQ29udGludWUgb24gZXJyb3JzICovCi0jZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1JPCQkweDAwMjAJLyogUmVtb3VudCBmcyBybyBvbiBlcnJvcnMgKi8KLSNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUMJCTB4MDA0MAkvKiBQYW5pYyBvbiBlcnJvcnMgKi8KLSNkZWZpbmUgRVhUMl9NT1VOVF9NSU5JWF9ERgkJMHgwMDgwCS8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCi0jZGVmaW5lIEVYVDJfTU9VTlRfTk9CSAkJCTB4MDEwMAkvKiBObyBidWZmZXJfaGVhZHMgKi8KLSNkZWZpbmUgRVhUMl9NT1VOVF9OT19VSUQzMgkJMHgwMjAwICAvKiBEaXNhYmxlIDMyLWJpdCBVSURzICovCi0jZGVmaW5lIEVYVDJfTU9VTlRfWEFUVFJfVVNFUgkJMHg0MDAwCS8qIEV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcyAqLwotI2RlZmluZSBFWFQyX01PVU5UX1BPU0lYX0FDTAkJMHg4MDAwCS8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfQ0hFQ0sJCTB4MDAwMDAxICAvKiBEbyBtb3VudC10aW1lIGNoZWNrcyAqLworI2RlZmluZSBFWFQyX01PVU5UX09MREFMTE9DCQkweDAwMDAwMiAgLyogRG9uJ3QgdXNlIHRoZSBuZXcgT3Jsb3YgYWxsb2NhdG9yICovCisjZGVmaW5lIEVYVDJfTU9VTlRfR1JQSUQJCTB4MDAwMDA0ICAvKiBDcmVhdGUgZmlsZXMgd2l0aCBkaXJlY3RvcnkncyBncm91cCAqLworI2RlZmluZSBFWFQyX01PVU5UX0RFQlVHCQkweDAwMDAwOCAgLyogU29tZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfQ09OVAkJMHgwMDAwMTAgIC8qIENvbnRpbnVlIG9uIGVycm9ycyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19STwkJMHgwMDAwMjAgIC8qIFJlbW91bnQgZnMgcm8gb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1BBTklDCQkweDAwMDA0MCAgLyogUGFuaWMgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTUlOSVhfREYJCTB4MDAwMDgwICAvKiBNaW1pY3MgdGhlIE1pbml4IHN0YXRmcyAqLworI2RlZmluZSBFWFQyX01PVU5UX05PQkgJCQkweDAwMDEwMCAgLyogTm8gYnVmZmVyX2hlYWRzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9fVUlEMzIJCTB4MDAwMjAwICAvKiBEaXNhYmxlIDMyLWJpdCBVSURzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfWEFUVFJfVVNFUgkJMHgwMDQwMDAgIC8qIEV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX1BPU0lYX0FDTAkJMHgwMDgwMDAgIC8qIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfWElQCQkJMHgwMTAwMDAgIC8qIEV4ZWN1dGUgaW4gcGxhY2UgKi8KIAogI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KQkJbyAmPSB+RVhUMl9NT1VOVF8jI29wdAogI2RlZmluZSBzZXRfb3B0KG8sIG9wdCkJCQlvIHw9IEVYVDJfTU9VTlRfIyNvcHQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggNzRhZDMxNy4uYzE2NjYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTIzOSw2ICsyMzksMjAgQEAKICNkZWZpbmUgRVhUM19JT0NfU0VUUlNWU1oJCV9JT1coJ2YnLCA2LCBsb25nKQogCiAvKgorICogIE1vdW50IG9wdGlvbnMKKyAqLworc3RydWN0IGV4dDNfbW91bnRfb3B0aW9ucyB7CisJdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsKKwl1aWRfdCBzX3Jlc3VpZDsKKwlnaWRfdCBzX3Jlc2dpZDsKKwl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOworI2lmZGVmIENPTkZJR19RVU9UQQorCWludCBzX2pxdW90YV9mbXQ7CisJY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOworI2VuZGlmCit9OworCisvKgogICogU3RydWN0dXJlIG9mIGFuIGlub2RlIG9uIHRoZSBkaXNrCiAgKi8KIHN0cnVjdCBleHQzX2lub2RlIHsKQEAgLTM1OCw2ICszNzIsNyBAQAogI2RlZmluZSBFWFQzX01PVU5UX1JFU0VSVkFUSU9OCQkweDEwMDAwCS8qIFByZWFsbG9jYXRpb24gKi8KICNkZWZpbmUgRVhUM19NT1VOVF9CQVJSSUVSCQkweDIwMDAwIC8qIFVzZSBibG9jayBiYXJyaWVycyAqLwogI2RlZmluZSBFWFQzX01PVU5UX05PQkgJCQkweDQwMDAwIC8qIE5vIGJ1ZmZlcmhlYWRzICovCisjZGVmaW5lIEVYVDNfTU9VTlRfUVVPVEEJCTB4ODAwMDAgLyogU29tZSBxdW90YSBvcHRpb24gc2V0ICovCiAKIC8qIENvbXBhdGliaWxpdHksIGZvciBoYXZpbmcgYm90aCBleHQyX2ZzLmggYW5kIGV4dDNfZnMuaCBpbmNsdWRlZCBhdCBvbmNlICovCiAjaWZuZGVmIF9MSU5VWF9FWFQyX0ZTX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19qYmQuaCBiL2luY2x1ZGUvbGludXgvZXh0M19qYmQuaAppbmRleCBlODI5MmFmLi5jODMwN2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2piZC5oCkBAIC00MiwxNSArNDIsMTUgQEAKICAqIHN1cGVyYmxvY2sgb25seSBnZXRzIHVwZGF0ZWQgb25jZSwgb2YgY291cnNlLCBzbyBkb24ndCBib3RoZXIKICAqIGNvdW50aW5nIHRoYXQgYWdhaW4gZm9yIHRoZSBxdW90YSB1cGRhdGVzLiAqLwogCi0jZGVmaW5lIEVYVDNfREFUQV9UUkFOU19CTE9DS1MJCShFWFQzX1NJTkdMRURBVEFfVFJBTlNfQkxPQ0tTICsgXAorI2RlZmluZSBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKHNiKQkoRVhUM19TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyArIFwKIAkJCQkJIEVYVDNfWEFUVFJfVFJBTlNfQkxPQ0tTIC0gMiArIFwKLQkJCQkJIDIqRVhUM19RVU9UQV9UUkFOU19CTE9DS1MpCisJCQkJCSAyKkVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSkKIAogLyogRGVsZXRlIG9wZXJhdGlvbnMgcG90ZW50aWFsbHkgaGl0IG9uZSBkaXJlY3RvcnkncyBuYW1lc3BhY2UgcGx1cyBhbgogICogZW50aXJlIGlub2RlLCBwbHVzIGFyYml0cmFyeSBhbW91bnRzIG9mIGJpdG1hcC9pbmRpcmVjdGlvbiBkYXRhLiAgQmUKICAqIGdlbmVyb3VzLiAgV2UgY2FuIGdyb3cgdGhlIGRlbGV0ZSB0cmFuc2FjdGlvbiBsYXRlciBpZiBuZWNlc3NhcnkuICovCiAKLSNkZWZpbmUgRVhUM19ERUxFVEVfVFJBTlNfQkxPQ0tTCSgyICogRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArIDY0KQorI2RlZmluZSBFWFQzX0RFTEVURV9UUkFOU19CTE9DS1Moc2IpCSgyICogRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhzYikgKyA2NCkKIAogLyogRGVmaW5lIGFuIGFyYml0cmFyeSBsaW1pdCBmb3IgdGhlIGFtb3VudCBvZiBkYXRhIHdlIHdpbGwgYW50aWNpcGF0ZQogICogd3JpdGluZyB0byBhbnkgZ2l2ZW4gdHJhbnNhY3Rpb24uICBGb3IgdW5ib3VuZGVkIHRyYW5zYWN0aW9ucyBzdWNoIGFzCkBAIC03NCwxNCArNzQsMTcgQEAKICNpZmRlZiBDT05GSUdfUVVPVEEKIC8qIEFtb3VudCBvZiBibG9ja3MgbmVlZGVkIGZvciBxdW90YSB1cGRhdGUgLSB3ZSBrbm93IHRoYXQgdGhlIHN0cnVjdHVyZSB3YXMKICAqIGFsbG9jYXRlZCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSBvbmx5IGlub2RlK2RhdGEgKi8KLSNkZWZpbmUgRVhUM19RVU9UQV9UUkFOU19CTE9DS1MgMgorI2RlZmluZSBFWFQzX1FVT1RBX1RSQU5TX0JMT0NLUyhzYikgKHRlc3Rfb3B0KHNiLCBRVU9UQSkgPyAyIDogMCkKIC8qIEFtb3VudCBvZiBibG9ja3MgbmVlZGVkIGZvciBxdW90YSBpbnNlcnQvZGVsZXRlIC0gd2UgZG8gc29tZSBibG9jayB3cml0ZXMKICAqIGJ1dCBpbm9kZSwgc2IgYW5kIGdyb3VwIHVwZGF0ZXMgYXJlIGRvbmUgb25seSBvbmNlICovCi0jZGVmaW5lIEVYVDNfUVVPVEFfSU5JVF9CTE9DS1MgKERRVU9UX01BWF9XUklURVMqXAotCQkJCShFWFQzX1NJTkdMRURBVEFfVFJBTlNfQkxPQ0tTLTMpKzMpCisjZGVmaW5lIEVYVDNfUVVPVEFfSU5JVF9CTE9DS1Moc2IpICh0ZXN0X29wdChzYiwgUVVPVEEpID8gKERRVU9UX0lOSVRfQUxMT0MqXAorCQkoRVhUM19TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUy0zKSszK0RRVU9UX0lOSVRfUkVXUklURSkgOiAwKQorI2RlZmluZSBFWFQzX1FVT1RBX0RFTF9CTE9DS1Moc2IpICh0ZXN0X29wdChzYiwgUVVPVEEpID8gKERRVU9UX0RFTF9BTExPQypcCisJCShFWFQzX1NJTkdMRURBVEFfVFJBTlNfQkxPQ0tTLTMpKzMrRFFVT1RfREVMX1JFV1JJVEUpIDogMCkKICNlbHNlCi0jZGVmaW5lIEVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTIDAKLSNkZWZpbmUgRVhUM19RVU9UQV9JTklUX0JMT0NLUyAwCisjZGVmaW5lIEVYVDNfUVVPVEFfVFJBTlNfQkxPQ0tTKHNiKSAwCisjZGVmaW5lIEVYVDNfUVVPVEFfSU5JVF9CTE9DS1Moc2IpIDAKKyNkZWZpbmUgRVhUM19RVU9UQV9ERUxfQkxPQ0tTKHNiKSAwCiAjZW5kaWYKIAogaW50CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZkZGlkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZmRkaWRldmljZS5oCmluZGV4IDAwMmY2MzYuLmU2MWU0MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmRkaWRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmRkaWRldmljZS5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfZmRkaS5oPgogCiAjaWZkZWYgX19LRVJORUxfXwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0CWZkZGlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorZXh0ZXJuIF9fYmUxNglmZGRpX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfZmRkaWRldihpbnQgc2l6ZW9mX3ByaXYpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggNTE3YmY0OS4uYzliZjM3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMjEzLDYgKzIxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW9fdHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KQEAgLTIyMCw2ICsyMjEsNyBAQAogCiBzdHJ1Y3QgaW92ZWM7CiBzdHJ1Y3QgbmFtZWlkYXRhOworc3RydWN0IGtpb2NiOwogc3RydWN0IHBpcGVfaW5vZGVfaW5mbzsKIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdDsKIHN0cnVjdCBrc3RhdGZzOwpAQCAtMjQwLDcgKzI0Miw3IEBACiB0eXBlZGVmIGludCAoZ2V0X2Jsb2Nrc190KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCQl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSk7Ci10eXBlZGVmIHZvaWQgKGRpb19pb2RvbmVfdCkoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwKK3R5cGVkZWYgdm9pZCAoZGlvX2lvZG9uZV90KShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvZmZfdCBvZmZzZXQsCiAJCQlzc2l6ZV90IGJ5dGVzLCB2b2lkICpwcml2YXRlKTsKIAogLyoKQEAgLTMwMiw3ICszMDQsNiBAQAogc3RydWN0IHBhZ2U7CiBzdHJ1Y3QgYWRkcmVzc19zcGFjZTsKIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbDsKLXN0cnVjdCBraW9jYjsKIAogc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB7CiAJaW50ICgqd3JpdGVwYWdlKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwpAQCAtMzMwLDYgKzMzMSw4IEBACiAJaW50ICgqcmVsZWFzZXBhZ2UpIChzdHJ1Y3QgcGFnZSAqLCBpbnQpOwogCXNzaXplX3QgKCpkaXJlY3RfSU8pKGludCwgc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAogCQkJbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKTsKKwlzdHJ1Y3QgcGFnZSogKCpnZXRfeGlwX3BhZ2UpKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIHNlY3Rvcl90LAorCQkJaW50KTsKIH07CiAKIHN0cnVjdCBiYWNraW5nX2Rldl9pbmZvOwpAQCAtNDcxLDYgKzQ3NCwxMSBAQAogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdAkqaV9kbm90aWZ5OyAvKiBmb3IgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbnMgKi8KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwlzdHJ1Y3QgbGlzdF9oZWFkCWlub3RpZnlfd2F0Y2hlczsgLyogd2F0Y2hlcyBvbiB0aGlzIGlub2RlICovCisJc3RydWN0IHNlbWFwaG9yZQlpbm90aWZ5X3NlbTsJLyogcHJvdGVjdHMgdGhlIHdhdGNoZXMgbGlzdCAqLworI2VuZGlmCisKIAl1bnNpZ25lZCBsb25nCQlpX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcJCWRpcnRpZWRfd2hlbjsJLyogamlmZmllcyBvZiBmaXJzdCBkaXJ0eWluZyAqLwogCkBAIC04MjAsMTYgKzgyOCwzNCBAQAogI2RlZmluZSB2ZnNfY2hlY2tfZnJvemVuKHNiLCBsZXZlbCkgXAogCXdhaXRfZXZlbnQoKHNiKS0+c193YWl0X3VuZnJvemVuLCAoKHNiKS0+c19mcm96ZW4gPCAobGV2ZWwpKSkKIAorc3RhdGljIGlubGluZSB2b2lkIGdldF9mc19leGNsKHZvaWQpCit7CisJYXRvbWljX2luYygmY3VycmVudC0+ZnNfZXhjbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZnNfZXhjbCh2b2lkKQoreworCWF0b21pY19kZWMoJmN1cnJlbnQtPmZzX2V4Y2wpOworfQorCitzdGF0aWMgaW5saW5lIGludCBoYXNfZnNfZXhjbCh2b2lkKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmY3VycmVudC0+ZnNfZXhjbCk7Cit9CisKKwogLyoKICAqIFN1cGVyYmxvY2sgbG9ja2luZy4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIGxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCiB7CisJZ2V0X2ZzX2V4Y2woKTsKIAlkb3duKCZzYi0+c19sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKKwlwdXRfZnNfZXhjbCgpOwogCXVwKCZzYi0+c19sb2NrKTsKIH0KIApAQCAtODg1LDYgKzkxMSw3IEBACiAJaW50ICgqaW9jdGwpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOwogCWxvbmcgKCp1bmxvY2tlZF9pb2N0bCkgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkLCB1bnNpZ25lZCBsb25nKTsKIAlsb25nICgqY29tcGF0X2lvY3RsKSAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkIGxvbmcpOworCWludCAoKmRpcmVjdF9hY2Nlc3MpIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHNlY3Rvcl90LCB1bnNpZ25lZCBsb25nICopOwogCWludCAoKm1lZGlhX2NoYW5nZWQpIChzdHJ1Y3QgZ2VuZGlzayAqKTsKIAlpbnQgKCpyZXZhbGlkYXRlX2Rpc2spIChzdHJ1Y3QgZ2VuZGlzayAqKTsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKQEAgLTEzNzEsNyArMTM5OCw2IEBACiBleHRlcm4gaW50IGRvX3JlbW91bnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZsYWdzLAogCQkJIHZvaWQgKmRhdGEsIGludCBmb3JjZSk7CiBleHRlcm4gc2VjdG9yX3QgYm1hcChzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QpOwotZXh0ZXJuIGludCBzZXRhdHRyX21hc2sodW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKIGV4dGVybiBpbnQgcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOwogZXh0ZXJuIGludCBnZW5lcmljX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICosIGludCwKQEAgLTE0MTMsNiArMTQzOSw3IEBACiBleHRlcm4gaW5vX3QgaXVuaXF1ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QpOwogZXh0ZXJuIGludCBpbm9kZV9uZWVkc19zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIHZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZCBnZW5lcmljX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiAKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKIAkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpOwpAQCAtMTQ5Niw2ICsxNTIzLDIzIEBACiBleHRlcm4gaW50IGdlbmVyaWNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogZXh0ZXJuIGludCBub25zZWVrYWJsZV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApOwogCisjaWZkZWYgQ09ORklHX0ZTX1hJUAorZXh0ZXJuIHNzaXplX3QgeGlwX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgICAgbG9mZl90ICpwcG9zKTsKK2V4dGVybiBzc2l6ZV90IHhpcF9maWxlX3NlbmRmaWxlKHN0cnVjdCBmaWxlICppbl9maWxlLCBsb2ZmX3QgKnBwb3MsCisJCQkJIHNpemVfdCBjb3VudCwgcmVhZF9hY3Rvcl90IGFjdG9yLAorCQkJCSB2b2lkICp0YXJnZXQpOworZXh0ZXJuIGludCB4aXBfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKTsKK2V4dGVybiBzc2l6ZV90IHhpcF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKK2V4dGVybiBpbnQgeGlwX3RydW5jYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCBmcm9tKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCB4aXBfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSB2b2lkIGRvX2dlbmVyaWNfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICogZmlscCwgbG9mZl90ICpwcG9zLAogCQkJCQlyZWFkX2Rlc2NyaXB0b3JfdCAqIGRlc2MsCiAJCQkJCXJlYWRfYWN0b3JfdCBhY3RvcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaCBiL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjU4MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9mc25vdGlmeS5oCkBAIC0wLDAgKzEsMjQ4IEBACisjaWZuZGVmIF9MSU5VWF9GU19OT1RJRllfSAorI2RlZmluZSBfTElOVVhfRlNfTk9USUZZX0gKKworLyoKKyAqIGluY2x1ZGUvbGludXgvZnNub3RpZnkuaCAtIGdlbmVyaWMgaG9va3MgZm9yIGZpbGVzeXN0ZW0gbm90aWZpY2F0aW9uLCB0bworICogcmVkdWNlIGluLXNvdXJjZSBkdXBsaWNhdGlvbiBmcm9tIGJvdGggZG5vdGlmeSBhbmQgaW5vdGlmeS4KKyAqCisgKiBXZSBkb24ndCBjb21waWxlIGFueSBvZiB0aGlzIGF3YXkgaW4gc29tZSBjb21wbGljYXRlZCBtZW5hZ2VyaWUgb2YgaWZkZWZzLgorICogSW5zdGVhZCwgd2UgcmVseSBvbiB0aGUgY29kZSBpbnNpZGUgdG8gb3B0aW1pemUgYXdheSBhcyBuZWVkZWQuCisgKgorICogKEMpIENvcHlyaWdodCAyMDA1IFJvYmVydCBMb3ZlCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CisKKy8qCisgKiBmc25vdGlmeV9tb3ZlIC0gZmlsZSBvbGRfbmFtZSBhdCBvbGRfZGlyIHdhcyBtb3ZlZCB0byBuZXdfbmFtZSBhdCBuZXdfZGlyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9tb3ZlKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGlub2RlICpuZXdfZGlyLAorCQkJCSBjb25zdCBjaGFyICpvbGRfbmFtZSwgY29uc3QgY2hhciAqbmV3X25hbWUsCisJCQkJIGludCBpc2RpcikKK3sKKwl1MzIgY29va2llID0gaW5vdGlmeV9nZXRfY29va2llKCk7CisKKwlpZiAob2xkX2RpciA9PSBuZXdfZGlyKQorCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX1JFTkFNRSk7CisJZWxzZSB7CisJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fREVMRVRFKTsKKwkJaW5vZGVfZGlyX25vdGlmeShuZXdfZGlyLCBETl9DUkVBVEUpOworCX0KKworCWlmIChpc2RpcikKKwkJaXNkaXIgPSBJTl9JU0RJUjsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KG9sZF9kaXIsIElOX01PVkVEX0ZST018aXNkaXIsY29va2llLG9sZF9uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KG5ld19kaXIsIElOX01PVkVEX1RPfGlzZGlyLCBjb29raWUsIG5ld19uYW1lKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X3VubGluayAtIGZpbGUgd2FzIHVubGlua2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV91bmxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0RFTEVURSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChkaXIsIElOX0RFTEVURSwgMCwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgSU5fREVMRVRFX1NFTEYsIDAsIE5VTEwpOworCisJaW5vdGlmeV9pbm9kZV9pc19kZWFkKGlub2RlKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X3JtZGlyIC0gZGlyZWN0b3J5IHdhcyByZW1vdmVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9ybWRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fREVMRVRFKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGRpcixJTl9ERUxFVEV8SU5fSVNESVIsMCxkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBJTl9ERUxFVEVfU0VMRiB8IElOX0lTRElSLCAwLCBOVUxMKTsKKwlpbm90aWZ5X2lub2RlX2lzX2RlYWQoaW5vZGUpOworfQorCisvKgorICogZnNub3RpZnlfY3JlYXRlIC0gJ25hbWUnIHdhcyBsaW5rZWQgaW4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWlub2RlX2Rpcl9ub3RpZnkoaW5vZGUsIEROX0NSRUFURSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgSU5fQ1JFQVRFLCAwLCBuYW1lKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X21rZGlyIC0gZGlyZWN0b3J5ICduYW1lJyB3YXMgY3JlYXRlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfbWtkaXIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbm9kZV9kaXJfbm90aWZ5KGlub2RlLCBETl9DUkVBVEUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0NSRUFURSB8IElOX0lTRElSLCAwLCBuYW1lKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X2FjY2VzcyAtIGZpbGUgd2FzIHJlYWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2FjY2VzcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl1MzIgbWFzayA9IElOX0FDQ0VTUzsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQltYXNrIHw9IElOX0lTRElSOworCisJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBETl9BQ0NFU1MpOworCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIDAsIE5VTEwpOworfQorCisvKgorICogZnNub3RpZnlfbW9kaWZ5IC0gZmlsZSB3YXMgbW9kaWZpZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X21vZGlmeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl1MzIgbWFzayA9IElOX01PRElGWTsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQltYXNrIHw9IElOX0lTRElSOworCisJZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBETl9NT0RJRlkpOworCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIDAsIE5VTEwpOworfQorCisvKgorICogZnNub3RpZnlfb3BlbiAtIGZpbGUgd2FzIG9wZW5lZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfb3BlbihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl1MzIgbWFzayA9IElOX09QRU47CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayB8PSBJTl9JU0RJUjsKKworCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIDAsIE5VTEwpOworCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworfQorCisvKgorICogZnNub3RpZnlfY2xvc2UgLSBmaWxlIHdhcyBjbG9zZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJbW9kZV90IG1vZGUgPSBmaWxlLT5mX21vZGU7CisJdTMyIG1hc2sgPSAobW9kZSAmIEZNT0RFX1dSSVRFKSA/IElOX0NMT1NFX1dSSVRFIDogSU5fQ0xPU0VfTk9XUklURTsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQltYXNrIHw9IElOX0lTRElSOworCisJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwgbWFzaywgMCwgbmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgbWFzaywgMCwgTlVMTCk7Cit9CisKKy8qCisgKiBmc25vdGlmeV94YXR0ciAtIGV4dGVuZGVkIGF0dHJpYnV0ZXMgd2VyZSBjaGFuZ2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV94YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl1MzIgbWFzayA9IElOX0FUVFJJQjsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQltYXNrIHw9IElOX0lTRElSOworCisJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwgbWFzaywgMCwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgbWFzaywgMCwgTlVMTCk7Cit9CisKKy8qCisgKiBmc25vdGlmeV9jaGFuZ2UgLSBub3RpZnlfY2hhbmdlIGV2ZW50LiAgZmlsZSB3YXMgbW9kaWZpZWQgYW5kL29yIG1ldGFkYXRhCisgKiB3YXMgY2hhbmdlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGludCBpYV92YWxpZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBkbl9tYXNrID0gMDsKKwl1MzIgaW5fbWFzayA9IDA7CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQlpbl9tYXNrIHw9IElOX0FUVFJJQjsKKwkJZG5fbWFzayB8PSBETl9BVFRSSUI7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCWluX21hc2sgfD0gSU5fQVRUUklCOworCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWluX21hc2sgfD0gSU5fTU9ESUZZOworCQlkbl9tYXNrIHw9IEROX01PRElGWTsKKwl9CisJLyogYm90aCB0aW1lcyBpbXBsaWVzIGEgdXRpbWUocykgY2FsbCAqLworCWlmICgoaWFfdmFsaWQgJiAoQVRUUl9BVElNRSB8IEFUVFJfTVRJTUUpKSA9PSAoQVRUUl9BVElNRSB8IEFUVFJfTVRJTUUpKQorCXsKKwkJaW5fbWFzayB8PSBJTl9BVFRSSUI7CisJCWRuX21hc2sgfD0gRE5fQVRUUklCOworCX0gZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKSB7CisJCWluX21hc2sgfD0gSU5fQUNDRVNTOworCQlkbl9tYXNrIHw9IEROX0FDQ0VTUzsKKwl9IGVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQlpbl9tYXNrIHw9IElOX01PRElGWTsKKwkJZG5fbWFzayB8PSBETl9NT0RJRlk7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQlpbl9tYXNrIHw9IElOX0FUVFJJQjsKKwkJZG5fbWFzayB8PSBETl9BVFRSSUI7CisJfQorCisJaWYgKGRuX21hc2spCisJCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgZG5fbWFzayk7CisJaWYgKGluX21hc2spIHsKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlpbl9tYXNrIHw9IElOX0lTRElSOworCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBpbl9tYXNrLCAwLCBOVUxMKTsKKwkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwgaW5fbWFzaywgMCwKKwkJCQkJCSAgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0lOT1RJRlkJLyogaW5vdGlmeSBoZWxwZXJzICovCisKKy8qCisgKiBmc25vdGlmeV9vbGRuYW1lX2luaXQgLSBzYXZlIG9mZiB0aGUgb2xkIGZpbGVuYW1lIGJlZm9yZSB3ZSBjaGFuZ2UgaXQKKyAqLworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpmc25vdGlmeV9vbGRuYW1lX2luaXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKK30KKworLyoKKyAqIGZzbm90aWZ5X29sZG5hbWVfZnJlZSAtIGZyZWUgdGhlIG5hbWUgd2UgZ290IGZyb20gZnNub3RpZnlfb2xkbmFtZV9pbml0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9vbGRuYW1lX2ZyZWUoY29uc3QgY2hhciAqb2xkX25hbWUpCit7CisJa2ZyZWUob2xkX25hbWUpOworfQorCisjZWxzZQkvKiBDT05GSUdfSU5PVElGWSAqLworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZzbm90aWZ5X29sZG5hbWVfaW5pdChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfb2xkbmFtZV9mcmVlKGNvbnN0IGNoYXIgKm9sZF9uYW1lKQoreworfQorCisjZW5kaWYJLyogISBDT05GSUdfSU5PVElGWSAqLworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX0xJTlVYX0ZTX05PVElGWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCA4ZDZiZjYwLi43Yzc0MDAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTEyLDggKzEyLDggQEAKICAqIEdGUCBiaXRtYXNrcy4uCiAgKi8KIC8qIFpvbmUgbW9kaWZpZXJzIGluIEdGUF9aT05FTUFTSyAoc2VlIGxpbnV4L21tem9uZS5oIC0gbG93IHR3byBiaXRzKSAqLwotI2RlZmluZSBfX0dGUF9ETUEJMHgwMQotI2RlZmluZSBfX0dGUF9ISUdITUVNCTB4MDIKKyNkZWZpbmUgX19HRlBfRE1BCTB4MDF1CisjZGVmaW5lIF9fR0ZQX0hJR0hNRU0JMHgwMnUKIAogLyoKICAqIEFjdGlvbiBtb2RpZmllcnMgLSBkb2Vzbid0IGNoYW5nZSB0aGUgem9uaW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IDgzMzZkYmEuLjU5MTI4NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBMSU5VWF9IQVJESVJRX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oZGxjLmggYi9pbmNsdWRlL2xpbnV4L2hkbGMuaAppbmRleCBlZDI5MjdlLi5kZjY5NWU5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9oZGxjLmgKKysrIGIvaW5jbHVkZS9saW51eC9oZGxjLmgKQEAgLTI0Miw4ICsyNDIsOCBAQAogfQogCiAKLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGhkbGNfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgX19pbmxpbmVfXyBfX2JlMTYgaGRsY190eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWhkbGNfZGV2aWNlICpoZGxjID0gZGV2X3RvX2hkbGMoZGV2KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWdobWVtLmggYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAppbmRleCAyYTdlNmM2Li42YmVjZTkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZ2htZW0uaApAQCAtMjgsNiArMjgsNyBAQAogCiAjZGVmaW5lIGttYXBfYXRvbWljKHBhZ2UsIGlkeCkJCXBhZ2VfYWRkcmVzcyhwYWdlKQogI2RlZmluZSBrdW5tYXBfYXRvbWljKGFkZHIsIGlkeCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBrbWFwX2F0b21pY19wZm4ocGZuLCBpZHgpCXBhZ2VfYWRkcmVzcyhwZm5fdG9fcGFnZShwZm4pKQogI2RlZmluZSBrbWFwX2F0b21pY190b19wYWdlKHB0cikJdmlydF90b19wYWdlKHB0cikKIAogI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1kZXYuaCBiL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCmluZGV4IGQyMjgyMzAuLjU0MTY5NTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWRldi5oCkBAIC0yNSw2ICsyNSw3IEBACiAjZGVmaW5lIF9MSU5VWF9JMkNfREVWX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogLyogU29tZSBJT0NUTCBjb21tYW5kcyBhcmUgZGVmaW5lZCBpbiA8bGludXgvaTJjLmg+ICovCiAvKiBOb3RlOiAxMC1iaXQgYWRkcmVzc2VzIGFyZSBOT1Qgc3VwcG9ydGVkISAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMm8tZGV2LmggYi9pbmNsdWRlL2xpbnV4L2kyby1kZXYuaAppbmRleCBlZjdmNjQ0Li4zNmZkMThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyby1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyby1kZXYuaApAQCAtMjQsNiArMjQsMTMgQEAKICNkZWZpbmUgTUFYX0kyT19DT05UUk9MTEVSUwkzMgogCiAvLyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2lmbmRlZiBfX0tFUk5FTF9fCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworCisjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwogCiAvKgogICogSTJPIENvbnRyb2wgSU9DVExzIGFuZCBzdHJ1Y3R1cmVzCkBAIC0xMTMsNiArMTIwLDEwIEBACiAJaW50IGxvc3Q7CiB9OwogCit0eXBlZGVmIHN0cnVjdCBpMm9fc2dfaW9faGRyIHsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CS8qIHNlZSBJMk9fRFBUX1NHX0lPX0ZMQUdTICovCit9IGkyb19zZ19pb19oZHJfdDsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBIUlQgcmVsYXRlZCBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNiwxNCArMTM3LDYgQEAKICNkZWZpbmUgSTJPX0JVU19DQVJEQlVTIDcKICNkZWZpbmUgSTJPX0JVU19VTktOT1dOIDB4ODAKIAotI2lmbmRlZiBfX0tFUk5FTF9fCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdTE2OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOwotCi0jZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwotCiB0eXBlZGVmIHN0cnVjdCBfaTJvX3BjaV9idXMgewogCXU4IFBjaUZ1bmN0aW9uTnVtYmVyOwogCXU4IFBjaURldmljZU51bWJlcjsKQEAgLTMzMyw3ICszMzYsNyBAQAogI2RlZmluZSBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUwJCTB4MDYxCiAjZGVmaW5lIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUgkJMHgwNzAKICNkZWZpbmUgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0UgCQkweDA3MQotI2RlZmluZSBJMk9fQ0xBU1NfQlVTX0FEQVBURVJfUE9SVAkJMHgwODAKKyNkZWZpbmUgSTJPX0NMQVNTX0JVU19BREFQVEVSCQkJMHgwODAKICNkZWZpbmUgSTJPX0NMQVNTX1BFRVJfVFJBTlNQT1JUX0FHRU5UCQkweDA5MAogI2RlZmluZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlQJCTB4MDkxCiAjZGVmaW5lCUkyT19DTEFTU19FTkQJCQkJMHhmZmYKQEAgLTM5OSw0ICs0MDIsMjYgQEAKICNkZWZpbmUgQURBUFRFUl9TVEFURV9GQUlMRUQJCQkweDEwCiAjZGVmaW5lIEFEQVBURVJfU1RBVEVfRkFVTFRFRAkJCTB4MTEKIAorLyoKKyAqCVNvZnR3YXJlIG1vZHVsZSB0eXBlcworICovCisjZGVmaW5lIEkyT19TT0ZUV0FSRV9NT0RVTEVfSVJUT1MJCTB4MTEKKyNkZWZpbmUgSTJPX1NPRlRXQVJFX01PRFVMRV9JT1BfUFJJVkFURQkJMHgyMgorI2RlZmluZSBJMk9fU09GVFdBUkVfTU9EVUxFX0lPUF9DT05GSUcJCTB4MjMKKworLyoKKyAqCVZlbmRvcnMKKyAqLworI2RlZmluZSBJMk9fVkVORE9SX0RQVAkJCQkweDAwMWIKKworLyoKKyAqIERQVCAvIEFkYXB0ZWMgc3BlY2lmaWMgdmFsdWVzIGZvciBpMm9fc2dfaW9faGRyIGZsYWdzLgorICovCisjZGVmaW5lIEkyT19EUFRfU0dfRkxBR19JTlRFUlBSRVQJCTB4MDAwMTAwMDAKKyNkZWZpbmUgSTJPX0RQVF9TR19GTEFHX1BIWVNJQ0FMCQkweDAwMDIwMDAwCisKKyNkZWZpbmUgSTJPX0RQVF9GTEFTSF9GUkFHX1NJWkUJCQkweDEwMDAwCisjZGVmaW5lIEkyT19EUFRfRkxBU0hfUkVBRAkJCTB4MDEwMQorI2RlZmluZSBJMk9fRFBUX0ZMQVNIX1dSSVRFCQkJMHgwMTAyCisKICNlbmRpZgkJCQkvKiBfSTJPX0RFVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyby5oIGIvaW5jbHVkZS9saW51eC9pMm8uaAppbmRleCBlYTlhM2FkLi5iZGMyODZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyby5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJvLmgKQEAgLTExOSwxMiArMTE5LDIxIEBACiB9OwogCiAvKgotICoJQ29udGFpbnMgYWxsIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBuZWNlc3NhcnkgZm9yIERNQSBvcGVyYXRpb25zCisgKglDb250YWlucyBETUEgbWFwcGVkIGFkZHJlc3MgaW5mb3JtYXRpb24KICAqLwogc3RydWN0IGkyb19kbWEgewogCXZvaWQgKnZpcnQ7CiAJZG1hX2FkZHJfdCBwaHlzOwotCXUzMiBsZW47CisJc2l6ZV90IGxlbjsKK307CisKKy8qCisgKglDb250YWlucyBJTyBtYXBwZWQgYWRkcmVzcyBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgaTJvX2lvIHsKKwl2b2lkIF9faW9tZW0gKnZpcnQ7CisJdW5zaWduZWQgbG9uZyBwaHlzOworCXVuc2lnbmVkIGxvbmcgbGVuOwogfTsKIAogLyoKQEAgLTE0NywyOCArMTU2LDI1IEBACiAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLyogUENJIGRldmljZSAqLwogCi0JdW5zaWduZWQgaW50IHNob3J0X3JlcToxOwkvKiB1c2Ugc21hbGwgYmxvY2sgc2l6ZXMgKi8KKwl1bnNpZ25lZCBpbnQgcHJvbWlzZToxOwkvKiBQcm9taXNlIGNvbnRyb2xsZXIgKi8KKwl1bnNpZ25lZCBpbnQgYWRhcHRlYzoxOwkvKiBEUFQgLyBBZGFwdGVjIGNvbnRyb2xsZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmFwdG9yOjE7CS8qIHNwbGl0IGJhciAqLwogCXVuc2lnbmVkIGludCBub19xdWllc2NlOjE7CS8qIGRvbnQgcXVpZXNjZSBiZWZvcmUgcmVzZXQgKi8KLQl1bnNpZ25lZCBpbnQgcmFwdG9yOjE7CQkvKiBzcGxpdCBiYXIgKi8KLQl1bnNpZ25lZCBpbnQgcHJvbWlzZToxOwkJLyogUHJvbWlzZSBjb250cm9sbGVyICovCi0KLSNpZmRlZiBDT05GSUdfTVRSUgotCWludCBtdHJyX3JlZzA7Ci0JaW50IG10cnJfcmVnMTsKLSNlbmRpZgorCXVuc2lnbmVkIGludCBzaG9ydF9yZXE6MTsJLyogdXNlIHNtYWxsIGJsb2NrIHNpemVzICovCisJdW5zaWduZWQgaW50IGxpbWl0X3NlY3RvcnM6MTsJLyogbGltaXQgbnVtYmVyIG9mIHNlY3RvcnMgLyByZXF1ZXN0ICovCisJdW5zaWduZWQgaW50IHBhZV9zdXBwb3J0OjE7CS8qIGNvbnRyb2xsZXIgaGFzIDY0LWJpdCBTR0wgc3VwcG9ydCAqLwogCiAJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOwkvKiBsaXN0IG9mIEkyTyBkZXZpY2VzICovCi0KLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKmV2ZW50X25vdGlmZXI7CS8qIEV2ZW50cyAqLwotCWF0b21pY190IHVzZXJzOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogQ29udHJvbGxlciBsaXN0ICovCi0Jdm9pZCBfX2lvbWVtICpwb3N0X3BvcnQ7CS8qIEluYm91dCBwb3J0IGFkZHJlc3MgKi8KLQl2b2lkIF9faW9tZW0gKnJlcGx5X3BvcnQ7CS8qIE91dGJvdW5kIHBvcnQgYWRkcmVzcyAqLwotCXZvaWQgX19pb21lbSAqaXJxX21hc2s7CQkvKiBJbnRlcnJ1cHQgcmVnaXN0ZXIgYWRkcmVzcyAqLworCisJdm9pZCBfX2lvbWVtICppbl9wb3J0OwkvKiBJbmJvdXQgcG9ydCBhZGRyZXNzICovCisJdm9pZCBfX2lvbWVtICpvdXRfcG9ydDsJLyogT3V0Ym91bmQgcG9ydCBhZGRyZXNzICovCisJdm9pZCBfX2lvbWVtICppcnFfc3RhdHVzOwkvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKmlycV9tYXNrOwkvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciBhZGRyZXNzICovCiAKIAkvKiBEeW5hbWljIExDVCByZWxhdGVkIGRhdGEgKi8KIAotCXN0cnVjdCBpMm9fZG1hIHN0YXR1czsJLyogc3RhdHVzIG9mIElPUCAqLworCXN0cnVjdCBpMm9fZG1hIHN0YXR1czsJLyogSU9QIHN0YXR1cyBibG9jayAqLwogCiAJc3RydWN0IGkyb19kbWEgaHJ0OwkvKiBIVyBSZXNvdXJjZSBUYWJsZSAqLwogCWkyb19sY3QgKmxjdDsJCS8qIExvZ2ljYWwgQ29uZmlnIFRhYmxlICovCkBAIC0xNzYsMjEgKzE4MiwxOSBAQAogCXN0cnVjdCBzZW1hcGhvcmUgbGN0X2xvY2s7CS8qIExvY2sgZm9yIExDVCB1cGRhdGVzICovCiAJc3RydWN0IGkyb19kbWEgc3RhdHVzX2Jsb2NrOwkvKiBJT1Agc3RhdHVzIGJsb2NrICovCiAKLQlzdHJ1Y3QgaTJvX2RtYSBiYXNlOwkvKiBjb250cm9sbGVyIG1lc3NhZ2luZyB1bml0ICovCi0Jc3RydWN0IGkyb19kbWEgaW5fcXVldWU7CS8qIGluYm91bmQgbWVzc2FnZSBxdWV1ZSBIb3N0LT5JT1AgKi8KKwlzdHJ1Y3QgaTJvX2lvIGJhc2U7CS8qIGNvbnRyb2xsZXIgbWVzc2FnaW5nIHVuaXQgKi8KKwlzdHJ1Y3QgaTJvX2lvIGluX3F1ZXVlOwkvKiBpbmJvdW5kIG1lc3NhZ2UgcXVldWUgSG9zdC0+SU9QICovCiAJc3RydWN0IGkyb19kbWEgb3V0X3F1ZXVlOwkvKiBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlIElPUC0+SG9zdCAqLwogCi0JdW5zaWduZWQgaW50IGJhdHRlcnk6MTsJCS8qIEhhcyBhIGJhdHRlcnkgYmFja3VwICovCisJdW5zaWduZWQgaW50IGJhdHRlcnk6MTsJLyogSGFzIGEgYmF0dGVyeSBiYWNrdXAgKi8KIAl1bnNpZ25lZCBpbnQgaW9fYWxsb2M6MTsJLyogQW4gSS9PIHJlc291cmNlIHdhcyBhbGxvY2F0ZWQgKi8KIAl1bnNpZ25lZCBpbnQgbWVtX2FsbG9jOjE7CS8qIEEgbWVtb3J5IHJlc291cmNlIHdhcyBhbGxvY2F0ZWQgKi8KIAogCXN0cnVjdCByZXNvdXJjZSBpb19yZXNvdXJjZTsJLyogSS9PIHJlc291cmNlIGFsbG9jYXRlZCB0byB0aGUgSU9QICovCiAJc3RydWN0IHJlc291cmNlIG1lbV9yZXNvdXJjZTsJLyogTWVtIHJlc291cmNlIGFsbG9jYXRlZCB0byB0aGUgSU9QICovCiAKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZW50cnk7CS8qIC9wcm9jIGRpciAqLwotCi0Jc3RydWN0IGxpc3RfaGVhZCBidXNfbGlzdDsJLyogbGlzdCBvZiBidXNzZXMgb24gSU9QICovCiAJc3RydWN0IGRldmljZSBkZXZpY2U7CisJc3RydWN0IGNsYXNzX2RldmljZSBjbGFzc2RldjsJLyogSTJPIGNvbnRyb2xsZXIgY2xhc3MgKi8KIAlzdHJ1Y3QgaTJvX2RldmljZSAqZXhlYzsJLyogRXhlY3V0aXZlICovCiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAogCXNwaW5sb2NrX3QgY29udGV4dF9saXN0X2xvY2s7CS8qIGxvY2sgZm9yIGNvbnRleHRfbGlzdCAqLwpAQCAtMjQxLDkgKzI0NSwxMCBAQAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgaTJvX2NvbnRyb2xsZXJzOwogCiAvKiBNZXNzYWdlIGZ1bmN0aW9ucyAqLwotc3RhdGljIGlubGluZSB1MzIgaTJvX21zZ19nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICosIHN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICoqKTsKLWV4dGVybiB1MzIgaTJvX21zZ19nZXRfd2FpdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiwgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKiosCi0JCQkgICAgaW50KTsKK3N0YXRpYyBpbmxpbmUgdTMyIGkyb19tc2dfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqLAorCQkJICAgICAgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKiopOworZXh0ZXJuIHUzMiBpMm9fbXNnX2dldF93YWl0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqLAorCQkJICAgIHN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICoqLCBpbnQpOwogc3RhdGljIGlubGluZSB2b2lkIGkyb19tc2dfcG9zdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKiwgdTMyKTsKIHN0YXRpYyBpbmxpbmUgaW50IGkyb19tc2dfcG9zdF93YWl0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqLCB1MzIsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcpOwpAQCAtMjUyLDE1ICsyNTcsNiBAQAogZXh0ZXJuIHZvaWQgaTJvX21zZ19ub3Aoc3RydWN0IGkyb19jb250cm9sbGVyICosIHUzMik7CiBzdGF0aWMgaW5saW5lIHZvaWQgaTJvX2ZsdXNoX3JlcGx5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqLCB1MzIpOwogCi0vKiBETUEgaGFuZGxpbmcgZnVuY3Rpb25zICovCi1zdGF0aWMgaW5saW5lIGludCBpMm9fZG1hX2FsbG9jKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGkyb19kbWEgKiwgc2l6ZV90LAotCQkJCXVuc2lnbmVkIGludCk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgaTJvX2RtYV9mcmVlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGkyb19kbWEgKik7Ci1pbnQgaTJvX2RtYV9yZWFsbG9jKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGkyb19kbWEgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwotCi1zdGF0aWMgaW5saW5lIGludCBpMm9fZG1hX21hcChzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBpMm9fZG1hICopOwotc3RhdGljIGlubGluZSB2b2lkIGkyb19kbWFfdW5tYXAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgaTJvX2RtYSAqKTsKLQogLyogSU9QIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGludCBpMm9fc3RhdHVzX2dldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CiAKQEAgLTI4NSw2ICsyODEsMTYgQEAKIHsKIAlyZXR1cm4gKHUzMikgKCh1NjQpIHB0ciA+PiAzMik7CiB9OworCitzdGF0aWMgaW5saW5lIHUzMiBpMm9fZG1hX2xvdyhkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAodTMyKSAodTY0KSBkbWFfYWRkcjsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIGkyb19kbWFfaGlnaChkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXJldHVybiAodTMyKSAoKHU2NCkgZG1hX2FkZHIgPj4gMzIpOworfTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHUzMiBpMm9fY250eHRfbGlzdF9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB2b2lkICpwdHIpCiB7CkBAIC0zMTUsOCArMzIxLDI0NiBAQAogewogCXJldHVybiAwOwogfTsKKworc3RhdGljIGlubGluZSB1MzIgaTJvX2RtYV9sb3coZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gKHUzMikgZG1hX2FkZHI7Cit9OworCitzdGF0aWMgaW5saW5lIHUzMiBpMm9fZG1hX2hpZ2goZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gMDsKK307CiAjZW5kaWYKIAorLyoqCisgKglpMm9fc2dfdGFibGVzaXplIC0gQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIFNHTAorICoJQGM6IEkyTyBjb250cm9sbGVyIGZvciB3aGljaCB0aGUgY2FsY3VsYXRpb24gc2hvdWxkIGJlIGRvbmUKKyAqCUBib2R5X3NpemU6IG1heGltdW0gYm9keSBzaXplIHVzZWQgZm9yIG1lc3NhZ2UgaW4gMzItYml0IHdvcmRzLgorICoKKyAqCVJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgU0cgZWxlbWVudHMgaW4gYSBTRyBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHUxNiBpMm9fc2dfdGFibGVzaXplKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTE2IGJvZHlfc2l6ZSkKK3sKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCXUxNiBzZ19jb3VudCA9CisJICAgIChzYi0+aW5ib3VuZF9mcmFtZV9zaXplIC0gc2l6ZW9mKHN0cnVjdCBpMm9fbWVzc2FnZSkgLyA0KSAtCisJICAgIGJvZHlfc2l6ZTsKKworCWlmIChjLT5wYWVfc3VwcG9ydCkgeworCQkvKgorCQkgKiBmb3IgNjQtYml0IGEgU0cgYXR0cmlidXRlIGVsZW1lbnQgbXVzdCBiZSBhZGRlZCBhbmQgZWFjaAorCQkgKiBTRyBlbGVtZW50IG5lZWRzIDEyIGJ5dGVzIGluc3RlYWQgb2YgOC4KKwkJICovCisJCXNnX2NvdW50IC09IDI7CisJCXNnX2NvdW50IC89IDM7CisJfSBlbHNlCisJCXNnX2NvdW50IC89IDI7CisKKwlpZiAoYy0+c2hvcnRfcmVxICYmIChzZ19jb3VudCA+IDgpKQorCQlzZ19jb3VudCA9IDg7CisKKwlyZXR1cm4gc2dfY291bnQ7Cit9OworCisvKioKKyAqCWkyb19kbWFfbWFwX3NpbmdsZSAtIE1hcCBwb2ludGVyIHRvIGNvbnRyb2xsZXIgYW5kIGZpbGwgaW4gSTJPIG1lc3NhZ2UuCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCUBwdHI6IHBvaW50ZXIgdG8gdGhlIGRhdGEgd2hpY2ggc2hvdWxkIGJlIG1hcHBlZAorICoJQHNpemU6IHNpemUgb2YgZGF0YSBpbiBieXRlcworICoJQGRpcmVjdGlvbjogRE1BX1RPX0RFVklDRSAvIERNQV9GUk9NX0RFVklDRQorICoJQHNnX3B0cjogcG9pbnRlciB0byB0aGUgU0cgbGlzdCBpbnNpZGUgdGhlIEkyTyBtZXNzYWdlCisgKgorICoJVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCBuZWNlc3NhcnkgRE1BIGhhbmRsaW5nIGFuZCBhbHNvIHdyaXRlcyB0aGUgSTJPCisgKglTR0wgZWxlbWVudHMgaW50byB0aGUgSTJPIG1lc3NhZ2UuIEZvciBkZXRhaWxzIG9uIERNQSBoYW5kbGluZyBzZWUgYWxzbworICoJZG1hX21hcF9zaW5nbGUoKS4gVGhlIHBvaW50ZXIgc2dfcHRyIHdpbGwgb25seSBiZSBzZXQgdG8gdGhlIGVuZCBvZiB0aGUKKyAqCVNHIGxpc3QgaWYgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKgorICoJUmV0dXJucyBETUEgYWRkcmVzcyB3aGljaCBtdXN0IGJlIGNoZWNrZWQgZm9yIGZhaWx1cmVzIHVzaW5nCisgKglkbWFfbWFwcGluZ19lcnJvcigpLgorICovCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgaTJvX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdm9pZCAqcHRyLAorCQkJCQkgICAgc2l6ZV90IHNpemUsCisJCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJCSAgICB1MzIgX19pb21lbSAqKiBzZ19wdHIpCit7CisJdTMyIHNnX2ZsYWdzOworCXUzMiBfX2lvbWVtICptcHRyID0gKnNnX3B0cjsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJc3dpdGNoIChkaXJlY3Rpb24pIHsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCXNnX2ZsYWdzID0gMHhkNDAwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCXNnX2ZsYWdzID0gMHhkMDAwMDAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSgmYy0+cGRldi0+ZGV2LCBwdHIsIHNpemUsIGRpcmVjdGlvbik7CisJaWYgKCFkbWFfbWFwcGluZ19lcnJvcihkbWFfYWRkcikpIHsKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0CisJCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgYy0+cGFlX3N1cHBvcnQpIHsKKwkJCXdyaXRlbCgweDdDMDIwMDAyLCBtcHRyKyspOworCQkJd3JpdGVsKFBBR0VfU0laRSwgbXB0cisrKTsKKwkJfQorI2VuZGlmCisKKwkJd3JpdGVsKHNnX2ZsYWdzIHwgc2l6ZSwgbXB0cisrKTsKKwkJd3JpdGVsKGkyb19kbWFfbG93KGRtYV9hZGRyKSwgbXB0cisrKTsKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0CisJCWlmICgoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNCkgJiYgYy0+cGFlX3N1cHBvcnQpCisJCQl3cml0ZWwoaTJvX2RtYV9oaWdoKGRtYV9hZGRyKSwgbXB0cisrKTsKKyNlbmRpZgorCQkqc2dfcHRyID0gbXB0cjsKKwl9CisJcmV0dXJuIGRtYV9hZGRyOworfTsKKworLyoqCisgKglpMm9fZG1hX21hcF9zZyAtIE1hcCBhIFNHIExpc3QgdG8gY29udHJvbGxlciBhbmQgZmlsbCBpbiBJMk8gbWVzc2FnZS4KKyAqCUBjOiBJMk8gY29udHJvbGxlcgorICoJQHNnOiBTRyBsaXN0IHRvIGJlIG1hcHBlZAorICoJQHNnX2NvdW50OiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIFNHIGxpc3QKKyAqCUBkaXJlY3Rpb246IERNQV9UT19ERVZJQ0UgLyBETUFfRlJPTV9ERVZJQ0UKKyAqCUBzZ19wdHI6IHBvaW50ZXIgdG8gdGhlIFNHIGxpc3QgaW5zaWRlIHRoZSBJMk8gbWVzc2FnZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gZG9lcyBhbGwgbmVjZXNzYXJ5IERNQSBoYW5kbGluZyBhbmQgYWxzbyB3cml0ZXMgdGhlIEkyTworICoJU0dMIGVsZW1lbnRzIGludG8gdGhlIEkyTyBtZXNzYWdlLiBGb3IgZGV0YWlscyBvbiBETUEgaGFuZGxpbmcgc2VlIGFsc28KKyAqCWRtYV9tYXBfc2coKS4gVGhlIHBvaW50ZXIgc2dfcHRyIHdpbGwgb25seSBiZSBzZXQgdG8gdGhlIGVuZCBvZiB0aGUgU0cKKyAqCWxpc3QgaWYgdGhlIGFsbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgKgorICoJUmV0dXJucyAwIG9uIGZhaWx1cmUgb3IgMSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgaW5saW5lIGludCBpMm9fZG1hX21hcF9zZyhzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCisJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzZ19jb3VudCwKKwkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAorCQkJCSB1MzIgX19pb21lbSAqKiBzZ19wdHIpCit7CisJdTMyIHNnX2ZsYWdzOworCXUzMiBfX2lvbWVtICptcHRyID0gKnNnX3B0cjsKKworCXN3aXRjaCAoZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlzZ19mbGFncyA9IDB4MTQwMDAwMDA7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlzZ19mbGFncyA9IDB4MTAwMDAwMDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXNnX2NvdW50ID0gZG1hX21hcF9zZygmYy0+cGRldi0+ZGV2LCBzZywgc2dfY291bnQsIGRpcmVjdGlvbik7CisJaWYgKCFzZ19jb3VudCkKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBDT05GSUdfSTJPX0VYVF9BREFQVEVDX0RNQTY0CisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBjLT5wYWVfc3VwcG9ydCkgeworCQl3cml0ZWwoMHg3QzAyMDAwMiwgbXB0cisrKTsKKwkJd3JpdGVsKFBBR0VfU0laRSwgbXB0cisrKTsKKwl9CisjZW5kaWYKKworCXdoaWxlIChzZ19jb3VudC0tID4gMCkgeworCQlpZiAoIXNnX2NvdW50KQorCQkJc2dfZmxhZ3MgfD0gMHhDMDAwMDAwMDsKKwkJd3JpdGVsKHNnX2ZsYWdzIHwgc2dfZG1hX2xlbihzZyksIG1wdHIrKyk7CisJCXdyaXRlbChpMm9fZG1hX2xvdyhzZ19kbWFfYWRkcmVzcyhzZykpLCBtcHRyKyspOworI2lmZGVmIENPTkZJR19JMk9fRVhUX0FEQVBURUNfRE1BNjQKKwkJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiBjLT5wYWVfc3VwcG9ydCkKKwkJCXdyaXRlbChpMm9fZG1hX2hpZ2goc2dfZG1hX2FkZHJlc3Moc2cpKSwgbXB0cisrKTsKKyNlbmRpZgorCQlzZysrOworCX0KKwkqc2dfcHRyID0gbXB0cjsKKworCXJldHVybiAxOworfTsKKworLyoqCisgKglpMm9fZG1hX2FsbG9jIC0gQWxsb2NhdGUgRE1BIG1lbW9yeQorICoJQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGV2aWNlIG9mIHRoZSBJMk8gY29udHJvbGxlcgorICoJQGFkZHI6IGkyb19kbWEgc3RydWN0IHdoaWNoIHNob3VsZCBnZXQgdGhlIERNQSBidWZmZXIKKyAqCUBsZW46IGxlbmd0aCBvZiB0aGUgbmV3IERNQSBtZW1vcnkKKyAqCUBnZnBfbWFzazogR0ZQIG1hc2sKKyAqCisgKglBbGxvY2F0ZSBhIGNvaGVyZW50IERNQSBtZW1vcnkgYW5kIHdyaXRlIHRoZSBwb2ludGVycyBpbnRvIGFkZHIuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVOT01FTSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpMm9fZG1hX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIsCisJCQkJc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCWludCBkbWFfNjQgPSAwOworCisJaWYgKChzaXplb2YoZG1hX2FkZHJfdCkgPiA0KSAmJiAocGRldi0+ZG1hX21hc2sgPT0gRE1BXzY0QklUX01BU0spKSB7CisJCWRtYV82NCA9IDE7CisJCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFkZHItPnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBsZW4sICZhZGRyLT5waHlzLCBnZnBfbWFzayk7CisKKwlpZiAoKHNpemVvZihkbWFfYWRkcl90KSA+IDQpICYmIGRtYV82NCkKKwkJaWYgKHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJvOiB1bmFibGUgdG8gc2V0IDY0LWJpdCBETUEiKTsKKworCWlmICghYWRkci0+dmlydCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoYWRkci0+dmlydCwgMCwgbGVuKTsKKwlhZGRyLT5sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX2RtYV9mcmVlIC0gRnJlZSBETUEgbWVtb3J5CisgKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCisgKglAYWRkcjogaTJvX2RtYSBzdHJ1Y3Qgd2hpY2ggY29udGFpbnMgdGhlIERNQSBidWZmZXIKKyAqCisgKglGcmVlIGEgY29oZXJlbnQgRE1BIG1lbW9yeSBhbmQgc2V0IHZpcnR1YWwgYWRkcmVzcyBvZiBhZGRyIHRvIE5VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMm9fZG1hX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkcikKK3sKKwlpZiAoYWRkci0+dmlydCkgeworCQlpZiAoYWRkci0+cGh5cykKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgYWRkci0+bGVuLCBhZGRyLT52aXJ0LAorCQkJCQkgIGFkZHItPnBoeXMpOworCQllbHNlCisJCQlrZnJlZShhZGRyLT52aXJ0KTsKKwkJYWRkci0+dmlydCA9IE5VTEw7CisJfQorfTsKKworLyoqCisgKglpMm9fZG1hX3JlYWxsb2MgLSBSZWFsbG9jIERNQSBtZW1vcnkKKyAqCUBkZXY6IHN0cnVjdCBkZXZpY2UgcG9pbnRlciB0byB0aGUgUENJIGRldmljZSBvZiB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUBhZGRyOiBwb2ludGVyIHRvIGEgaTJvX2RtYSBzdHJ1Y3QgRE1BIGJ1ZmZlcgorICoJQGxlbjogbmV3IGxlbmd0aCBvZiBtZW1vcnkKKyAqCUBnZnBfbWFzazogR0ZQIG1hc2sKKyAqCisgKglJZiB0aGVyZSB3YXMgc29tZXRoaW5nIGFsbG9jYXRlZCBpbiB0aGUgYWRkciwgZnJlZSBpdCBmaXJzdC4gSWYgbGVuID4gMAorICoJdGhhbiB0cnkgdG8gYWxsb2NhdGUgaXQgYW5kIHdyaXRlIHRoZSBhZGRyZXNzZXMgYmFjayB0byB0aGUgYWRkcgorICoJc3RydWN0dXJlLiBJZiBsZW4gPT0gMCBzZXQgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBOVUxMLgorICoKKyAqCVJldHVybnMgdGhlIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGkyb19kbWFfcmVhbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpMm9fZG1hICphZGRyLAorCQkJCSAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCWkyb19kbWFfZnJlZShkZXYsIGFkZHIpOworCisJaWYgKGxlbikKKwkJcmV0dXJuIGkyb19kbWFfYWxsb2MoZGV2LCBhZGRyLCBsZW4sIGdmcF9tYXNrKTsKKworCXJldHVybiAwOworfTsKKwogLyogSTJPIGRyaXZlciAoT1NNKSBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgaTJvX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgaTJvX2RyaXZlciAqKTsKIGV4dGVybiB2b2lkIGkyb19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaTJvX2RyaXZlciAqKTsKQEAgLTM4NSw0OSArNjI5LDExIEBACiAvKiBFeGVjIE9TTSBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgaTJvX2V4ZWNfbGN0X2dldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CiAKLS8qIGRldmljZSB0byBpMm9fZGV2aWNlIGFuZCBkcml2ZXIgdG8gaTJvX2RyaXZlciBjb252ZXJ0aW9uIGZ1bmN0aW9ucyAqLworLyogZGV2aWNlIC8gZHJpdmVyIC8ga29iamVjdCBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLwogI2RlZmluZSB0b19pMm9fZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydixzdHJ1Y3QgaTJvX2RyaXZlciwgZHJpdmVyKQogI2RlZmluZSB0b19pMm9fZGV2aWNlKGRldikgY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyb19kZXZpY2UsIGRldmljZSkKLQotLyoKLSAqCU1lc3NlbmdlciBpbmxpbmVzCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIEkyT19QT1NUX1JFQUQzMihzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCi17Ci0Jcm1iKCk7Ci0JcmV0dXJuIHJlYWRsKGMtPnBvc3RfcG9ydCk7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgSTJPX1BPU1RfV1JJVEUzMihzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiB2YWwpCi17Ci0Jd21iKCk7Ci0Jd3JpdGVsKHZhbCwgYy0+cG9zdF9wb3J0KTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIEkyT19SRVBMWV9SRUFEMzIoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQotewotCXJtYigpOwotCXJldHVybiByZWFkbChjLT5yZXBseV9wb3J0KTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBJMk9fUkVQTFlfV1JJVEUzMihzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiB2YWwpCi17Ci0Jd21iKCk7Ci0Jd3JpdGVsKHZhbCwgYy0+cmVwbHlfcG9ydCk7Ci19OwotCi1zdGF0aWMgaW5saW5lIHUzMiBJMk9fSVJRX1JFQUQzMihzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCi17Ci0Jcm1iKCk7Ci0JcmV0dXJuIHJlYWRsKGMtPmlycV9tYXNrKTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBJMk9fSVJRX1dSSVRFMzIoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgdmFsKQotewotCXdtYigpOwotCXdyaXRlbCh2YWwsIGMtPmlycV9tYXNrKTsKLQl3bWIoKTsKLX07CisjZGVmaW5lIHRvX2kyb19jb250cm9sbGVyKGRldikgY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyb19jb250cm9sbGVyLCBkZXZpY2UpCisjZGVmaW5lIGtvYmpfdG9faTJvX2RldmljZShrb2JqKSB0b19pMm9fZGV2aWNlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSkKIAogLyoqCiAgKglpMm9fbXNnX2dldCAtIG9idGFpbiBhbiBJMk8gbWVzc2FnZSBmcm9tIHRoZSBJT1AKQEAgLTQ0MywxMSArNjQ5LDExIEBACiAgKglhdmFpbGFibGUgcmV0dXJucyBJMk9fUVVFVUVfRU1QVFkgYW5kIG1zZyBpcyBsZWF2ZWQgdW50b3VjaGVkLgogICovCiBzdGF0aWMgaW5saW5lIHUzMiBpMm9fbXNnX2dldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCi0JCQkgICAgICBzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqKm1zZykKKwkJCSAgICAgIHN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICoqIG1zZykKIHsKLQl1MzIgbTsKKwl1MzIgbSA9IHJlYWRsKGMtPmluX3BvcnQpOwogCi0JaWYgKChtID0gSTJPX1BPU1RfUkVBRDMyKGMpKSAhPSBJMk9fUVVFVUVfRU1QVFkpCisJaWYgKG0gIT0gSTJPX1FVRVVFX0VNUFRZKQogCQkqbXNnID0gYy0+aW5fcXVldWUudmlydCArIG07CiAKIAlyZXR1cm4gbTsKQEAgLTQ2Miw3ICs2NjgsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaTJvX21zZ19wb3N0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0pCiB7Ci0JSTJPX1BPU1RfV1JJVEUzMihjLCBtKTsKKwl3cml0ZWwobSwgYy0+aW5fcG9ydCk7CiB9OwogCiAvKioKQEAgLTQ5MSwxMiArNjk3LDEwIEBACiAgKglUaGUgSTJPIGNvbnRyb2xsZXIgbXVzdCBiZSBpbmZvcm1lZCB0aGF0IHRoZSByZXBseSBtZXNzYWdlIGlzIG5vdCBuZWVkZWQKICAqCWFueW1vcmUuIElmIHlvdSBmb3JnZXQgdG8gZmx1c2ggdGhlIHJlcGx5LCB0aGUgbWVzc2FnZSBmcmFtZSBjYW4ndCBiZQogICoJdXNlZCBieSB0aGUgY29udHJvbGxlciBhbnltb3JlIGFuZCBpcyB0aGVyZWZvcmUgbG9zdC4KLSAqCi0gKglGSVhNRTogaXMgdGhlcmUgYSB0aW1lb3V0IGFmdGVyIHdoaWNoIHRoZSBjb250cm9sbGVyIHJldXNlIHRoZSBtZXNzYWdlPwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaTJvX2ZsdXNoX3JlcGx5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0pCiB7Ci0JSTJPX1JFUExZX1dSSVRFMzIoYywgbSk7CisJd3JpdGVsKG0sIGMtPm91dF9wb3J0KTsKIH07CiAKIC8qKgpAQCAtNTMwLDk3ICs3MzQsMTMgQEAKICAqCXdvcmsgZm9yIHJlY2VpdmUgc2lkZSBtZXNzYWdlcyBhcyB0aGV5IGFyZSBrbWFsbG9jIG9iamVjdHMKICAqCWluIGEgZGlmZmVyZW50IHBvb2wuCiAgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKmkyb19tc2dfaW5fdG9fdmlydChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsCi0JCQkJCQkgICAgIHUzMiBtKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqaTJvX21zZ19pbl90b192aXJ0KHN0cnVjdAorCQkJCQkJCSAgICAgaTJvX2NvbnRyb2xsZXIgKmMsCisJCQkJCQkJICAgICB1MzIgbSkKIHsKIAlyZXR1cm4gYy0+aW5fcXVldWUudmlydCArIG07CiB9OwogCi0vKioKLSAqCWkyb19kbWFfYWxsb2MgLSBBbGxvY2F0ZSBETUEgbWVtb3J5Ci0gKglAZGV2OiBzdHJ1Y3QgZGV2aWNlIHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2Ugb2YgdGhlIEkyTyBjb250cm9sbGVyCi0gKglAYWRkcjogaTJvX2RtYSBzdHJ1Y3Qgd2hpY2ggc2hvdWxkIGdldCB0aGUgRE1BIGJ1ZmZlcgotICoJQGxlbjogbGVuZ3RoIG9mIHRoZSBuZXcgRE1BIG1lbW9yeQotICoJQGdmcF9tYXNrOiBHRlAgbWFzawotICoKLSAqCUFsbG9jYXRlIGEgY29oZXJlbnQgRE1BIG1lbW9yeSBhbmQgd3JpdGUgdGhlIHBvaW50ZXJzIGludG8gYWRkci4KLSAqCi0gKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRU5PTUVNIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGkyb19kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkciwKLQkJCQlzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCi17Ci0JYWRkci0+dmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIGxlbiwgJmFkZHItPnBoeXMsIGdmcF9tYXNrKTsKLQlpZiAoIWFkZHItPnZpcnQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtc2V0KGFkZHItPnZpcnQsIDAsIGxlbik7Ci0JYWRkci0+bGVuID0gbGVuOwotCi0JcmV0dXJuIDA7Ci19OwotCi0vKioKLSAqCWkyb19kbWFfZnJlZSAtIEZyZWUgRE1BIG1lbW9yeQotICoJQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGV2aWNlIG9mIHRoZSBJMk8gY29udHJvbGxlcgotICoJQGFkZHI6IGkyb19kbWEgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBETUEgYnVmZmVyCi0gKgotICoJRnJlZSBhIGNvaGVyZW50IERNQSBtZW1vcnkgYW5kIHNldCB2aXJ0dWFsIGFkZHJlc3Mgb2YgYWRkciB0byBOVUxMLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaTJvX2RtYV9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyb19kbWEgKmFkZHIpCi17Ci0JaWYgKGFkZHItPnZpcnQpIHsKLQkJaWYgKGFkZHItPnBoeXMpCi0JCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGFkZHItPmxlbiwgYWRkci0+dmlydCwKLQkJCQkJICBhZGRyLT5waHlzKTsKLQkJZWxzZQotCQkJa2ZyZWUoYWRkci0+dmlydCk7Ci0JCWFkZHItPnZpcnQgPSBOVUxMOwotCX0KLX07Ci0KLS8qKgotICoJaTJvX2RtYV9tYXAgLSBNYXAgdGhlIG1lbW9yeSB0byBETUEKLSAqCUBkZXY6IHN0cnVjdCBkZXZpY2UgcG9pbnRlciB0byB0aGUgUENJIGRldmljZSBvZiB0aGUgSTJPIGNvbnRyb2xsZXIKLSAqCUBhZGRyOiBpMm9fZG1hIHN0cnVjdCB3aGljaCBzaG91bGQgYmUgbWFwcGVkCi0gKgotICoJTWFwIHRoZSBtZW1vcnkgaW4gYWRkci0+dmlydCB0byBjb2hlcmVudCBETUEgbWVtb3J5IGFuZCB3cml0ZSB0aGUKLSAqCXBoeXNpY2FsIGFkZHJlc3MgaW50byBhZGRyLT5waHlzLgotICoKLSAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FTk9NRU0gb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgaTJvX2RtYV9tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaTJvX2RtYSAqYWRkcikKLXsKLQlpZiAoIWFkZHItPnZpcnQpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKCFhZGRyLT5waHlzKQotCQlhZGRyLT5waHlzID0gZG1hX21hcF9zaW5nbGUoZGV2LCBhZGRyLT52aXJ0LCBhZGRyLT5sZW4sCi0JCQkJCSAgICBETUFfQklESVJFQ1RJT05BTCk7Ci0JaWYgKCFhZGRyLT5waHlzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfTsKLQotLyoqCi0gKglpMm9fZG1hX3VubWFwIC0gVW5tYXAgdGhlIERNQSBtZW1vcnkKLSAqCUBkZXY6IHN0cnVjdCBkZXZpY2UgcG9pbnRlciB0byB0aGUgUENJIGRldmljZSBvZiB0aGUgSTJPIGNvbnRyb2xsZXIKLSAqCUBhZGRyOiBpMm9fZG1hIHN0cnVjdCB3aGljaCBzaG91bGQgYmUgdW5tYXBwZWQKLSAqCi0gKglVbm1hcCB0aGUgbWVtb3J5IGluIGFkZHItPnZpcnQgZnJvbSBETUEgbWVtb3J5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaTJvX2RtYV91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpMm9fZG1hICphZGRyKQotewotCWlmICghYWRkci0+dmlydCkKLQkJcmV0dXJuOwotCi0JaWYgKGFkZHItPnBoeXMpIHsKLQkJZG1hX3VubWFwX3NpbmdsZShkZXYsIGFkZHItPnBoeXMsIGFkZHItPmxlbiwgRE1BX0JJRElSRUNUSU9OQUwpOwotCQlhZGRyLT5waHlzID0gMDsKLQl9Ci19OwotCiAvKgogICoJRW5kaWFuIGhhbmRsaW5nIHdyYXBwZWQgaW50byB0aGUgbWFjcm8gLSBrZWVwcyB0aGUgY29yZSBjb2RlCiAgKgljbGVhbmVyLgpAQCAtNzczLDYgKzg5MywxNCBAQAogI2RlZmluZSBJMk9fQ01EX1NDU0lfQlVTUkVTRVQJCTB4MjcKIAogLyoKKyAqIEJ1cyBBZGFwdGVyIENsYXNzCisgKi8KKyNkZWZpbmUgSTJPX0NNRF9CVVNfQURBUFRFUl9SRVNFVAkweDg1CisjZGVmaW5lIEkyT19DTURfQlVTX1JFU0VUCQkweDg3CisjZGVmaW5lIEkyT19DTURfQlVTX1NDQU4JCTB4ODkKKyNkZWZpbmUgSTJPX0NNRF9CVVNfUVVJRVNDRQkJMHg4YgorCisvKgogICogUmFuZG9tIEJsb2NrIFN0b3JhZ2UgQ2xhc3MKICAqLwogI2RlZmluZSBJMk9fQ01EX0JMT0NLX1JFQUQJCTB4MzAKQEAgLTc4NCw3ICs5MTIsNyBAQAogI2RlZmluZSBJMk9fQ01EX0JMT0NLX01FSkVDVAkJMHg0MwogI2RlZmluZSBJMk9fQ01EX0JMT0NLX1BPV0VSCQkweDcwCiAKLSNkZWZpbmUgSTJPX1BSSVZBVEVfTVNHCQkJMHhGRgorI2RlZmluZSBJMk9fQ01EX1BSSVZBVEUJCQkweEZGCiAKIC8qIENvbW1hbmQgc3RhdHVzIHZhbHVlcyAgKi8KIApAQCAtOTIyLDcgKzEwNTAsNyBAQAogI2RlZmluZSBJMk9WRVIxNQkweDAwMDEKICNkZWZpbmUgSTJPVkVSMjAJMHgwMDAyCiAKLS8qIERlZmF1bHQgaXMgMS41LCBGSVhNRTogTmVlZCBzdXBwb3J0IGZvciBib3RoIDEuNSBhbmQgMi4wICovCisvKiBEZWZhdWx0IGlzIDEuNSAqLwogI2RlZmluZSBJMk9WRVJTSU9OCUkyT1ZFUjE1CiAKICNkZWZpbmUgU0dMX09GRlNFVF8wICAgIEkyT1ZFUlNJT04KQEAgLTkzMyw5ICsxMDYxLDkgQEAKICNkZWZpbmUgU0dMX09GRlNFVF84ICAgICgweDAwODAgfCBJMk9WRVJTSU9OKQogI2RlZmluZSBTR0xfT0ZGU0VUXzkgICAgKDB4MDA5MCB8IEkyT1ZFUlNJT04pCiAjZGVmaW5lIFNHTF9PRkZTRVRfMTAgICAoMHgwMEEwIHwgSTJPVkVSU0lPTikKLQotI2RlZmluZSBUUkxfT0ZGU0VUXzUgICAgKDB4MDA1MCB8IEkyT1ZFUlNJT04pCi0jZGVmaW5lIFRSTF9PRkZTRVRfNiAgICAoMHgwMDYwIHwgSTJPVkVSU0lPTikKKyNkZWZpbmUgU0dMX09GRlNFVF8xMSAgICgweDAwQjAgfCBJMk9WRVJTSU9OKQorI2RlZmluZSBTR0xfT0ZGU0VUXzEyICAgKDB4MDBDMCB8IEkyT1ZFUlNJT04pCisjZGVmaW5lIFNHTF9PRkZTRVQoeCkgICAoKCh4KTw8NCkgfCBJMk9WRVJTSU9OKQogCiAvKiBUcmFuc2FjdGlvbiBSZXBseSBMaXN0cyAoVFJMKSBDb250cm9sIFdvcmQgc3RydWN0dXJlICovCiAjZGVmaW5lIFRSTF9TSU5HTEVfRklYRURfTEVOR1RICQkweDAwCkBAIC05NjIsMTcgKzEwOTAsMTMgQEAKICNkZWZpbmUgRUxFVkVOX1dPUkRfTVNHX1NJWkUJMHgwMDBCMDAwMAogI2RlZmluZSBJMk9fTUVTU0FHRV9TSVpFKHgpCSgoeCk8PDE2KQogCi0vKiBTcGVjaWFsIFRJRCBBc3NpZ25tZW50cyAqLwotCisvKiBzcGVjaWFsIFRJRCBhc3NpZ25tZW50cyAqLwogI2RlZmluZSBBREFQVEVSX1RJRAkJMAogI2RlZmluZSBIT1NUX1RJRAkJMQogCi0jZGVmaW5lIE1TR19GUkFNRV9TSVpFCQkxMjgJLyogaTJvX3Njc2kgYXNzdW1lcyA+PSAzMiAqLwotI2RlZmluZSBSRVBMWV9GUkFNRV9TSVpFCTE3Ci0jZGVmaW5lIFNHX1RBQkxFU0laRQkJMzAKLSNkZWZpbmUgTk1CUl9NU0dfRlJBTUVTCQkxMjgKLQotI2RlZmluZSBNU0dfUE9PTF9TSVpFCQkoTVNHX0ZSQU1FX1NJWkUqTk1CUl9NU0dfRlJBTUVTKnNpemVvZih1MzIpKQorLyogb3V0Ym91bmQgcXVldWUgZGVmaW5lcyAqLworI2RlZmluZSBJMk9fTUFYX09VVEJPVU5EX01TR19GUkFNRVMJMTI4CisjZGVmaW5lIEkyT19PVVRCT1VORF9NU0dfRlJBTUVfU0laRQkxMjgJLyogaW4gMzItYml0IHdvcmRzICovCiAKICNkZWZpbmUgSTJPX1BPU1RfV0FJVF9PSwkwCiAjZGVmaW5lIEkyT19QT1NUX1dBSVRfVElNRU9VVAktRVRJTUVET1VUCkBAIC05OTMsMTEgKzExMTcsMTAgQEAKICNkZWZpbmUgSTJPX0hSVF9HRVRfVFJJRVMJCTMKICNkZWZpbmUgSTJPX0xDVF9HRVRfVFJJRVMJCTMKIAotLyogcmVxdWVzdCBxdWV1ZSBzaXplcyAqLworLyogZGVmaW5lcyBmb3IgbWF4X3NlY3RvcnMgYW5kIG1heF9waHlzX3NlZ21lbnRzICovCiAjZGVmaW5lIEkyT19NQVhfU0VDVE9SUwkJCTEwMjQKLSNkZWZpbmUgSTJPX01BWF9TRUdNRU5UUwkJMTI4Ci0KLSNkZWZpbmUgSTJPX1JFUV9NRU1QT09MX1NJWkUJCTMyCisjZGVmaW5lIEkyT19NQVhfU0VDVE9SU19MSU1JVEVECQkyNTYKKyNkZWZpbmUgSTJPX01BWF9QSFlTX1NFR01FTlRTCQlNQVhfUEhZU19TRUdNRU5UUwogCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCQkJCS8qIF9JMk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9ib25kaW5nLmggYi9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaAppbmRleCA1NzAyNGNlLi44NDU5OGZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2JvbmRpbmcuaApAQCAtMzUsNiArMzUsOSBAQAogICoKICAqIDIwMDMvMTIvMDEgLSBTaG11bGlrIEhlbiA8c2htdWxpay5oZW4gYXQgaW50ZWwgZG90IGNvbT4KICAqCS0gQ29kZSBjbGVhbnVwIGFuZCBzdHlsZSBjaGFuZ2VzCisgKgorICogMjAwNS8wNS8wNSAtIEphc29uIEdhYmxlciA8anlnYWJsZXIgYXQgbGJsIGRvdCBnb3Y+CisgKiAgICAgIC0gYWRkZWQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgWE9SIGhhc2hpbmcgcG9saWNpZXMKICAqLwogCiAjaWZuZGVmIF9MSU5VWF9JRl9CT05ESU5HX0gKQEAgLTgwLDYgKzgzLDEwIEBACiAKICNkZWZpbmUgQk9ORF9ERUZBVUxUX01BWF9CT05EUyAgMSAgIC8qIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlcyB0byBzdXBwb3J0ICovCiAKKy8qIGhhc2hpbmcgdHlwZXMgKi8KKyNkZWZpbmUgQk9ORF9YTUlUX1BPTElDWV9MQVlFUjIJCTAgLyogbGF5ZXIgMiAoTUFDIG9ubHkpLCBkZWZhdWx0ICovCisjZGVmaW5lIEJPTkRfWE1JVF9QT0xJQ1lfTEFZRVIzNAkxIC8qIGxheWVyIDMrNCAoSVAgXiBNQUMpICovCisKIHR5cGVkZWYgc3RydWN0IGlmYm9uZCB7CiAJX19zMzIgYm9uZF9tb2RlOwogCV9fczMyIG51bV9zbGF2ZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oIGIvaW5jbHVkZS9saW51eC9pZl9zaGFwZXIuaAppbmRleCAwMDRlNmYwLi42OGM4OTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3NoYXBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfc2hhcGVyLmgKQEAgLTIzLDcgKzIzLDcgQEAKIAlfX3UzMiBzaGFwZWNsb2NrOwogCXVuc2lnbmVkIGxvbmcgcmVjb3Zlcnk7CS8qIFRpbWUgd2UgY2FuIG5leHQgY2xvY2sgYSBwYWNrZXQgb3V0IG9uCiAJCQkJICAgYW4gZW1wdHkgcXVldWUgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKwlzcGlubG9ja190IGxvY2s7CiAgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50ICAoKmhhcmRfc3RhcnRfeG1pdCkgKHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lnbXAuaCBiL2luY2x1ZGUvbGludXgvaWdtcC5oCmluZGV4IDM5MGU3NjAuLjBjMzFlZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWdtcC5oCisrKyBiL2luY2x1ZGUvbGludXgvaWdtcC5oCkBAIC0xNDgsNyArMTQ4LDYgQEAKIHN0cnVjdCBpcF9tY19zb2NrbGlzdAogewogCXN0cnVjdCBpcF9tY19zb2NrbGlzdAkqbmV4dDsKLQlpbnQJCQljb3VudDsKIAlzdHJ1Y3QgaXBfbXJlcW4JCW11bHRpOwogCXVuc2lnbmVkIGludAkJc2Ztb2RlOwkJLyogTUNBU1Rfe0lOQ0xVREUsRVhDTFVERX0gKi8KIAlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QJKnNmbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW42LmggYi9pbmNsdWRlL2xpbnV4L2luNi5oCmluZGV4IGY4MjU2YzUuLmRjZjU3MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW42LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbjYuaApAQCAtMTU2LDcgKzE1Niw3IEBACiAjZGVmaW5lIElQVjZfQ0hFQ0tTVU0JCTcKICNkZWZpbmUgSVBWNl9IT1BMSU1JVAkJOAogI2RlZmluZSBJUFY2X05FWFRIT1AJCTkKLSNkZWZpbmUgSVBWNl9BVVRISERSCQkxMAorI2RlZmluZSBJUFY2X0FVVEhIRFIJCTEwCS8qIG9ic29sZXRlICovCiAjZGVmaW5lIElQVjZfRkxPV0lORk8JCTExCiAKICNkZWZpbmUgSVBWNl9VTklDQVNUX0hPUFMJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggMDVjODNlMC4uNTkwMDhjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTIyOSw2ICsyMjksMTggQEAKICNkZWZpbmUgX19kZXZleGl0ZGF0YSBfX2V4aXRkYXRhCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorI2RlZmluZSBfX2NwdWluaXQKKyNkZWZpbmUgX19jcHVpbml0ZGF0YQorI2RlZmluZSBfX2NwdWV4aXQKKyNkZWZpbmUgX19jcHVleGl0ZGF0YQorI2Vsc2UKKyNkZWZpbmUgX19jcHVpbml0CV9faW5pdAorI2RlZmluZSBfX2NwdWluaXRkYXRhIF9faW5pdGRhdGEKKyNkZWZpbmUgX19jcHVleGl0IF9fZXhpdAorI2RlZmluZSBfX2NwdWV4aXRkYXRhCV9fZXhpdGRhdGEKKyNlbmRpZgorCiAvKiBGdW5jdGlvbnMgbWFya2VkIGFzIF9fZGV2ZXhpdCBtYXkgYmUgZGlzY2FyZGVkIGF0IGtlcm5lbCBsaW5rIHRpbWUsIGRlcGVuZGluZwogICAgb24gY29uZmlnIG9wdGlvbnMuICBOZXdlciB2ZXJzaW9ucyBvZiBiaW51dGlscyBkZXRlY3QgcmVmZXJlbmNlcyBmcm9tCiAgICByZXRhaW5lZCBzZWN0aW9ucyB0byBkaXNjYXJkZWQgc2VjdGlvbnMgYW5kIGZsYWcgYW4gZXJyb3IuICBQb2ludGVycyB0bwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaCBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKaW5kZXggYTZhOGMxYS4uYzcyN2MxOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtODEsNiArODEsNyBAQAogCS5tbQkJPSBOVUxMLAkJCQkJCVwKIAkuYWN0aXZlX21tCT0gJmluaXRfbW0sCQkJCQlcCiAJLnJ1bl9saXN0CT0gTElTVF9IRUFEX0lOSVQodHNrLnJ1bl9saXN0KSwJCQlcCisJLmlvcHJpbwkJPSAwLAkJCQkJCVwKIAkudGltZV9zbGljZQk9IEhaLAkJCQkJCVwKIAkudGFza3MJCT0gTElTVF9IRUFEX0lOSVQodHNrLnRhc2tzKSwJCQlcCiAJLnB0cmFjZV9jaGlsZHJlbj0gTElTVF9IRUFEX0lOSVQodHNrLnB0cmFjZV9jaGlsZHJlbiksCQlcCkBAIC0xMDgsOSArMTA5LDkgQEAKIAkuYmxvY2tlZAk9IHt7MH19LAkJCQkJXAogCS5hbGxvY19sb2NrCT0gU1BJTl9MT0NLX1VOTE9DS0VELAkJCQlcCiAJLnByb2NfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwJCQkJXAotCS5zd2l0Y2hfbG9jawk9IFNQSU5fTE9DS19VTkxPQ0tFRCwJCQkJXAogCS5qb3VybmFsX2luZm8JPSBOVUxMLAkJCQkJCVwKIAkuY3B1X3RpbWVycwk9IElOSVRfQ1BVX1RJTUVSUyh0c2suY3B1X3RpbWVycyksCQlcCisJLmZzX2V4Y2wJPSBBVE9NSUNfSU5JVCgwKSwJCQkJXAogfQogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oIGIvaW5jbHVkZS9saW51eC9pbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwYzJiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaW5vdGlmeS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogSW5vZGUgYmFzZWQgZGlyZWN0b3J5IG5vdGlmaWNhdGlvbiBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9JTk9USUZZX0gKKyNkZWZpbmUgX0xJTlVYX0lOT1RJRllfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoKKyAqIHN0cnVjdCBpbm90aWZ5X2V2ZW50IC0gc3RydWN0dXJlIHJlYWQgZnJvbSB0aGUgaW5vdGlmeSBkZXZpY2UgZm9yIGVhY2ggZXZlbnQKKyAqCisgKiBXaGVuIHlvdSBhcmUgd2F0Y2hpbmcgYSBkaXJlY3RvcnksIHlvdSB3aWxsIHJlY2VpdmUgdGhlIGZpbGVuYW1lIGZvciBldmVudHMKKyAqIHN1Y2ggYXMgSU5fQ1JFQVRFLCBJTl9ERUxFVEUsIElOX09QRU4sIElOX0NMT1NFLCAuLi4sIHJlbGF0aXZlIHRvIHRoZSB3ZC4KKyAqLworc3RydWN0IGlub3RpZnlfZXZlbnQgeworCV9fczMyCQl3ZDsJCS8qIHdhdGNoIGRlc2NyaXB0b3IgKi8KKwlfX3UzMgkJbWFzazsJCS8qIHdhdGNoIG1hc2sgKi8KKwlfX3UzMgkJY29va2llOwkJLyogY29va2llIHRvIHN5bmNocm9uaXplIHR3byBldmVudHMgKi8KKwlfX3UzMgkJbGVuOwkJLyogbGVuZ3RoIChpbmNsdWRpbmcgbnVsbHMpIG9mIG5hbWUgKi8KKwljaGFyCQluYW1lWzBdOwkvKiBzdHViIGZvciBwb3NzaWJsZSBuYW1lICovCit9OworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCwgaW1wbGVtZW50ZWQgZXZlbnRzIHRoYXQgdXNlci1zcGFjZSBjYW4gd2F0Y2ggZm9yICovCisjZGVmaW5lIElOX0FDQ0VTUwkJMHgwMDAwMDAwMQkvKiBGaWxlIHdhcyBhY2Nlc3NlZCAqLworI2RlZmluZSBJTl9NT0RJRlkJCTB4MDAwMDAwMDIJLyogRmlsZSB3YXMgbW9kaWZpZWQgKi8KKyNkZWZpbmUgSU5fQVRUUklCCQkweDAwMDAwMDA0CS8qIE1ldGFkYXRhIGNoYW5nZWQgKi8KKyNkZWZpbmUgSU5fQ0xPU0VfV1JJVEUJCTB4MDAwMDAwMDgJLyogV3JpdHRhYmxlIGZpbGUgd2FzIGNsb3NlZCAqLworI2RlZmluZSBJTl9DTE9TRV9OT1dSSVRFCTB4MDAwMDAwMTAJLyogVW53cml0dGFibGUgZmlsZSBjbG9zZWQgKi8KKyNkZWZpbmUgSU5fT1BFTgkJCTB4MDAwMDAwMjAJLyogRmlsZSB3YXMgb3BlbmVkICovCisjZGVmaW5lIElOX01PVkVEX0ZST00JCTB4MDAwMDAwNDAJLyogRmlsZSB3YXMgbW92ZWQgZnJvbSBYICovCisjZGVmaW5lIElOX01PVkVEX1RPCQkweDAwMDAwMDgwCS8qIEZpbGUgd2FzIG1vdmVkIHRvIFkgKi8KKyNkZWZpbmUgSU5fQ1JFQVRFCQkweDAwMDAwMTAwCS8qIFN1YmZpbGUgd2FzIGNyZWF0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFCQkweDAwMDAwMjAwCS8qIFN1YmZpbGUgd2FzIGRlbGV0ZWQgKi8KKyNkZWZpbmUgSU5fREVMRVRFX1NFTEYJCTB4MDAwMDA0MDAJLyogU2VsZiB3YXMgZGVsZXRlZCAqLworCisvKiB0aGUgZm9sbG93aW5nIGFyZSBsZWdhbCBldmVudHMuICB0aGV5IGFyZSBzZW50IGFzIG5lZWRlZCB0byBhbnkgd2F0Y2ggKi8KKyNkZWZpbmUgSU5fVU5NT1VOVAkJMHgwMDAwMjAwMAkvKiBCYWNraW5nIGZzIHdhcyB1bm1vdW50ZWQgKi8KKyNkZWZpbmUgSU5fUV9PVkVSRkxPVwkJMHgwMDAwNDAwMAkvKiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBJTl9JR05PUkVECQkweDAwMDA4MDAwCS8qIEZpbGUgd2FzIGlnbm9yZWQgKi8KKworLyogaGVscGVyIGV2ZW50cyAqLworI2RlZmluZSBJTl9DTE9TRQkJKElOX0NMT1NFX1dSSVRFIHwgSU5fQ0xPU0VfTk9XUklURSkgLyogY2xvc2UgKi8KKyNkZWZpbmUgSU5fTU9WRQkJCShJTl9NT1ZFRF9GUk9NIHwgSU5fTU9WRURfVE8pIC8qIG1vdmVzICovCisKKy8qIHNwZWNpYWwgZmxhZ3MgKi8KKyNkZWZpbmUgSU5fSVNESVIJCTB4NDAwMDAwMDAJLyogZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIgKi8KKyNkZWZpbmUgSU5fT05FU0hPVAkJMHg4MDAwMDAwMAkvKiBvbmx5IHNlbmQgZXZlbnQgb25jZSAqLworCisvKgorICogQWxsIG9mIHRoZSBldmVudHMgLSB3ZSBidWlsZCB0aGUgbGlzdCBieSBoYW5kIHNvIHRoYXQgd2UgY2FuIGFkZCBmbGFncyBpbgorICogdGhlIGZ1dHVyZSBhbmQgbm90IGJyZWFrIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBBcHBzIHdpbGwgZ2V0IG9ubHkgdGhlCisgKiBldmVudHMgdGhhdCB0aGV5IG9yaWdpbmFsbHkgd2FudGVkLiAgQmUgc3VyZSB0byBhZGQgbmV3IGV2ZW50cyBoZXJlIQorICovCisjZGVmaW5lIElOX0FMTF9FVkVOVFMJKElOX0FDQ0VTUyB8IElOX01PRElGWSB8IElOX0FUVFJJQiB8IElOX0NMT1NFX1dSSVRFIHwgXAorCQkJIElOX0NMT1NFX05PV1JJVEUgfCBJTl9PUEVOIHwgSU5fTU9WRURfRlJPTSB8IFwKKwkJCSBJTl9NT1ZFRF9UTyB8IElOX0RFTEVURSB8IElOX0NSRUFURSB8IElOX0RFTEVURV9TRUxGKQorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmZGVmIENPTkZJR19JTk9USUZZCisKK2V4dGVybiB2b2lkIGlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoc3RydWN0IGlub2RlICosIF9fdTMyLCBfX3UzMiwKKwkJCQkgICAgICBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KHN0cnVjdCBkZW50cnkgKiwgX191MzIsIF9fdTMyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV91bm1vdW50X2lub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICopOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9pbm9kZV9pc19kZWFkKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICAgIF9fdTMyIG1hc2ssIF9fdTMyIGNvb2tpZSwKKwkJCQkJICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCQkgICAgIF9fdTMyIG1hc2ssIF9fdTMyIGNvb2tpZSwKKwkJCQkJCSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X3VubW91bnRfaW5vZGVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbm90aWZ5X2lub2RlX2lzX2RlYWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKK30KKworc3RhdGljIGlubGluZSB1MzIgaW5vdGlmeV9nZXRfY29va2llKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfSU5PVElGWSAqLworCisjZW5kaWYJLyogX19LRVJORUwgX18gKi8KKworI2VuZGlmCS8qIF9MSU5VWF9JTk9USUZZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvbGludXgvaW5wdXQuaAppbmRleCA5ZDk1OThlLi5iOWNjMGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lucHV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnB1dC5oCkBAIC04NTksNiArODU5LDEwIEBACiAJaW50ICgqZXJhc2VfZWZmZWN0KShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBlZmZlY3RfaWQpOwogCiAJc3RydWN0IGlucHV0X2hhbmRsZSAqZ3JhYjsKKworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwkvKiBzZXJpYWxpemVzIG9wZW4gYW5kIGNsb3NlIG9wZXJhdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgdXNlcnM7CisKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmggYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDU5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgSU9QUklPX0gKKyNkZWZpbmUgSU9QUklPX0gKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKy8qCisgKiBHaXZlcyB1cyA4IHByaW8gY2xhc3NlcyB3aXRoIDEzLWJpdHMgb2YgZGF0YSBmb3IgZWFjaCBjbGFzcworICovCisjZGVmaW5lIElPUFJJT19CSVRTCQkoMTYpCisjZGVmaW5lIElPUFJJT19DTEFTU19TSElGVAkoMTMpCisjZGVmaW5lIElPUFJJT19QUklPX01BU0sJKCgxVUwgPDwgSU9QUklPX0NMQVNTX1NISUZUKSAtIDEpCisKKyNkZWZpbmUgSU9QUklPX1BSSU9fQ0xBU1MobWFzaykJKChtYXNrKSA+PiBJT1BSSU9fQ0xBU1NfU0hJRlQpCisjZGVmaW5lIElPUFJJT19QUklPX0RBVEEobWFzaykJKChtYXNrKSAmIElPUFJJT19QUklPX01BU0spCisjZGVmaW5lIElPUFJJT19QUklPX1ZBTFVFKGNsYXNzLCBkYXRhKQkoKChjbGFzcykgPDwgSU9QUklPX0NMQVNTX1NISUZUKSB8IGRhdGEpCisKKyNkZWZpbmUgaW9wcmlvX3ZhbGlkKG1hc2spCShJT1BSSU9fUFJJT19DTEFTUygobWFzaykpICE9IElPUFJJT19DTEFTU19OT05FKQorCisvKgorICogVGhlc2UgYXJlIHRoZSBpbyBwcmlvcml0eSBncm91cHMgYXMgaW1wbGVtZW50ZWQgYnkgQ0ZRLiBSVCBpcyB0aGUgcmVhbHRpbWUKKyAqIGNsYXNzLCBpdCBhbHdheXMgZ2V0cyBwcmVtaXVtIHNlcnZpY2UuIEJFIGlzIHRoZSBiZXN0LWVmZm9ydCBzY2hlZHVsaW5nCisgKiBjbGFzcywgdGhlIGRlZmF1bHQgZm9yIGFueSBwcm9jZXNzLiBJRExFIGlzIHRoZSBpZGxlIHNjaGVkdWxpbmcgY2xhc3MsIGl0CisgKiBpcyBvbmx5IHNlcnZlZCB3aGVuIG5vIG9uZSBlbHNlIGlzIHVzaW5nIHRoZSBkaXNrLgorICovCitlbnVtIHsKKwlJT1BSSU9fQ0xBU1NfTk9ORSwKKwlJT1BSSU9fQ0xBU1NfUlQsCisJSU9QUklPX0NMQVNTX0JFLAorCUlPUFJJT19DTEFTU19JRExFLAorfTsKKworLyoKKyAqIDggYmVzdCBlZmZvcnQgcHJpb3JpdHkgbGV2ZWxzIGFyZSBzdXBwb3J0ZWQKKyAqLworI2RlZmluZSBJT1BSSU9fQkVfTlIJKDgpCisKK2VudW0geworCUlPUFJJT19XSE9fUFJPQ0VTUyA9IDEsCisJSU9QUklPX1dIT19QR1JQLAorCUlPUFJJT19XSE9fVVNFUiwKK307CisKKy8qCisgKiBpZiBwcm9jZXNzIGhhcyBzZXQgaW8gcHJpb3JpdHkgZXhwbGljaXRseSwgdXNlIHRoYXQuIGlmIG5vdCwgY29udmVydAorICogdGhlIGNwdSBzY2hlZHVsZXIgbmljZSB2YWx1ZSB0byBhbiBpbyBwcmlvcml0eQorICovCisjZGVmaW5lIElPUFJJT19OT1JNCSg0KQorc3RhdGljIGlubGluZSBpbnQgdGFza19pb3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCVdBUk5fT04oIWlvcHJpb192YWxpZCh0YXNrLT5pb3ByaW8pKTsKKwlyZXR1cm4gSU9QUklPX1BSSU9fREFUQSh0YXNrLT5pb3ByaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCB0YXNrX25pY2VfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gKHRhc2tfbmljZSh0YXNrKSArIDIwKSAvIDU7Cit9CisKKy8qCisgKiBGb3IgaW5oZXJpdGFuY2UsIHJldHVybiB0aGUgaGlnaGVzdCBvZiB0aGUgdHdvIGdpdmVuIHByaW9yaXRpZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgaW9wcmlvX2Jlc3QodW5zaWduZWQgc2hvcnQgYXByaW8sIHVuc2lnbmVkIHNob3J0IGJwcmlvKQoreworCXVuc2lnbmVkIHNob3J0IGFjbGFzcyA9IElPUFJJT19QUklPX0NMQVNTKGFwcmlvKTsKKwl1bnNpZ25lZCBzaG9ydCBiY2xhc3MgPSBJT1BSSU9fUFJJT19DTEFTUyhicHJpbyk7CisKKwlpZiAoIWlvcHJpb192YWxpZChhcHJpbykpCisJCXJldHVybiBicHJpbzsKKwlpZiAoIWlvcHJpb192YWxpZChicHJpbykpCisJCXJldHVybiBhcHJpbzsKKworCWlmIChhY2xhc3MgPT0gSU9QUklPX0NMQVNTX05PTkUpCisJCWFjbGFzcyA9IElPUFJJT19DTEFTU19CRTsKKwlpZiAoYmNsYXNzID09IElPUFJJT19DTEFTU19OT05FKQorCQliY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisKKwlpZiAoYWNsYXNzID09IGJjbGFzcykKKwkJcmV0dXJuIG1pbihhcHJpbywgYnByaW8pOworCWlmIChhY2xhc3MgPiBiY2xhc3MpCisJCXJldHVybiBicHJpbzsKKwllbHNlCisJCXJldHVybiBhcHJpbzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwbWkuaCBiL2luY2x1ZGUvbGludXgvaXBtaS5oCmluZGV4IDJlYzI2NWUuLjU5NmNhNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXBtaS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXBtaS5oCkBAIC0yMDksNiArMjA5LDExIEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lwbWlfcm9vdDsKKyNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLworCiAvKiBPcGFxdWUgdHlwZSBmb3IgYSBJUE1JIG1lc3NhZ2UgdXNlci4gIE9uZSBvZiB0aGVzZSBpcyBuZWVkZWQgdG8KICAgIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuICovCiB0eXBlZGVmIHN0cnVjdCBpcG1pX3VzZXIgKmlwbWlfdXNlcl90OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggN2ZjMTAyMi4uMDY5ZDNiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC04NSwxMCArODUsMTAgQEAKIGV4dGVybiBpbnQgbm9pcnFkZWJ1Z19zZXR1cChjaGFyICpzdHIpOwogCiBleHRlcm4gZmFzdGNhbGwgaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJICAgICAgIHN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbik7CisJCQkJCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbik7CiBleHRlcm4gZmFzdGNhbGwgdW5zaWduZWQgaW50IF9fZG9fSVJRKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWV4dGVybiB2b2lkIG5vdGVfaW50ZXJydXB0KHVuc2lnbmVkIGludCBpcnEsIGlycV9kZXNjX3QgKmRlc2MsIGludCBhY3Rpb25fcmV0KTsKLWV4dGVybiB2b2lkIHJlcG9ydF9iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycV9kZXNjX3QgKmRlc2MsIGludCBhY3Rpb25fcmV0KTsKK2V4dGVybiB2b2lkIG5vdGVfaW50ZXJydXB0KHVuc2lnbmVkIGludCBpcnEsIGlycV9kZXNjX3QgKmRlc2MsCisJCQkJCWludCBhY3Rpb25fcmV0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gaW50IGNhbl9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBsb25nIGlycWZsYWdzKTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9pcnFfcHJvYyh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamZmczJfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvamZmczJfZnNfc2IuaAppbmRleCA0YWZjOGQ4Li4xZTIxNTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2pmZnMyX2ZzX3NiLmgKKysrIGIvaW5jbHVkZS9saW51eC9qZmZzMl9mc19zYi5oCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiBqZmZzMl9mc19zYi5oLHYgMS40OCAyMDA0LzExLzIwIDEwOjQxOjEyIGR3bXcyIEV4cCAkICovCisvKiAkSWQ6IGpmZnMyX2ZzX3NiLmgsdiAxLjUyIDIwMDUvMDUvMTkgMTY6MTI6MTcgZ2xlaXhuZXIgRXhwICQgKi8KIAogI2lmbmRlZiBfSkZGUzJfRlNfU0IKICNkZWZpbmUgX0pGRlMyX0ZTX1NCCkBAIC0xNCw3ICsxNCw4IEBACiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KIAogI2RlZmluZSBKRkZTMl9TQl9GTEFHX1JPIDEKLSNkZWZpbmUgSkZGUzJfU0JfRkxBR19NT1VOVElORyAyCisjZGVmaW5lIEpGRlMyX1NCX0ZMQUdfU0NBTk5JTkcgMiAvKiBGbGFzaCBzY2FubmluZyBpcyBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBKRkZTMl9TQl9GTEFHX0JVSUxESU5HIDQgLyogRmlsZSBzeXN0ZW0gYnVpbGRpbmcgaXMgaW4gcHJvZ3Jlc3MgKi8KIAogc3RydWN0IGpmZnMyX2lub2RpcnR5OwogCkBAIC0zMSw3ICszMiw3IEBACiAJdW5zaWduZWQgaW50IGZsYWdzOwogCiAJc3RydWN0IHRhc2tfc3RydWN0ICpnY190YXNrOwkvKiBHQyB0YXNrIHN0cnVjdCAqLwotCXN0cnVjdCBzZW1hcGhvcmUgZ2NfdGhyZWFkX3N0YXJ0OyAvKiBHQyB0aHJlYWQgc3RhcnQgbXV0ZXggKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBnY190aHJlYWRfc3RhcnQ7IC8qIEdDIHRocmVhZCBzdGFydCBjb21wbGV0aW9uICovCiAJc3RydWN0IGNvbXBsZXRpb24gZ2NfdGhyZWFkX2V4aXQ7IC8qIEdDIHRocmVhZCBleGl0IGNvbXBsZXRpb24gcG9ydCAqLwogCiAJc3RydWN0IHNlbWFwaG9yZSBhbGxvY19zZW07CS8qIFVzZWQgdG8gcHJvdGVjdCBhbGwgdGhlIGZvbGxvd2luZyAKQEAgLTk0LDcgKzk1LDcgQEAKIAkgICB0byBhbiBvYnNvbGV0ZWQgbm9kZS4gSSBkb24ndCBsaWtlIHRoaXMuIEFsdGVybmF0aXZlcyB3ZWxjb21lZC4gKi8KIAlzdHJ1Y3Qgc2VtYXBob3JlIGVyYXNlX2ZyZWVfc2VtOwogCi0jaWYgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTkFORCB8fCBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OT1JfRUNDCisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCiAJLyogV3JpdGUtYmVoaW5kIGJ1ZmZlciBmb3IgTkFORCBmbGFzaCAqLwogCXVuc2lnbmVkIGNoYXIgKndidWY7CiAJdWludDMyX3Qgd2J1Zl9vZnM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmggYi9pbmNsdWRlL2xpbnV4L2pveXN0aWNrLmgKaW5kZXggYjdlMGFiNi4uMDZiOWFmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qb3lzdGljay5oCisrKyBiL2luY2x1ZGUvbGludXgvam95c3RpY2suaApAQCAtMTExLDE4ICsxMTEsMzUgQEAKICNkZWZpbmUgSlNfU0VUX0FMTAkJOAogCiBzdHJ1Y3QgSlNfREFUQV9UWVBFIHsKLQlpbnQgYnV0dG9uczsKLQlpbnQgeDsKLQlpbnQgeTsKKwlfX3MzMiBidXR0b25zOworCV9fczMyIHg7CisJX19zMzIgeTsKIH07CiAKLXN0cnVjdCBKU19EQVRBX1NBVkVfVFlQRSB7Ci0JaW50IEpTX1RJTUVPVVQ7Ci0JaW50IEJVU1k7Ci0JbG9uZyBKU19FWFBJUkVUSU1FOwotCWxvbmcgSlNfVElNRUxJTUlUOworc3RydWN0IEpTX0RBVEFfU0FWRV9UWVBFXzMyIHsKKwlfX3MzMiBKU19USU1FT1VUOworCV9fczMyIEJVU1k7CisJX19zMzIgSlNfRVhQSVJFVElNRTsKKwlfX3MzMiBKU19USU1FTElNSVQ7CiAJc3RydWN0IEpTX0RBVEFfVFlQRSBKU19TQVZFOwogCXN0cnVjdCBKU19EQVRBX1RZUEUgSlNfQ09SUjsKIH07CiAKK3N0cnVjdCBKU19EQVRBX1NBVkVfVFlQRV82NCB7CisJX19zMzIgSlNfVElNRU9VVDsKKwlfX3MzMiBCVVNZOworCV9fczY0IEpTX0VYUElSRVRJTUU7CisJX19zNjQgSlNfVElNRUxJTUlUOworCXN0cnVjdCBKU19EQVRBX1RZUEUgSlNfU0FWRTsKKwlzdHJ1Y3QgSlNfREFUQV9UWVBFIEpTX0NPUlI7Cit9OworCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorI2RlZmluZSBKU19EQVRBX1NBVkVfVFlQRSBKU19EQVRBX1NBVkVfVFlQRV82NAorI2VsaWYgQklUU19QRVJfTE9ORyA9PSAzMgorI2RlZmluZSBKU19EQVRBX1NBVkVfVFlQRSBKU19EQVRBX1NBVkVfVFlQRV8zMgorI2Vsc2UKKyNlcnJvciBVbmV4cGVjdGVkIEJJVFNfUEVSX0xPTkcKKyNlbmRpZgorCiAjZW5kaWYgLyogX0xJTlVYX0pPWVNUSUNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGUyNWI5NzAuLjY4N2JhOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaApAQCAtNTgsMTUgKzU4LDIzIEBACiAgKiBiZSBiaXRlbiBsYXRlciB3aGVuIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGhhcHBlbnMgdG8gc2xlZXAgd2hlbiBpdCBpcyBub3QKICAqIHN1cHBvc2VkIHRvLgogICovCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQCi0jZGVmaW5lIG1pZ2h0X3NsZWVwKCkgX19taWdodF9zbGVlcChfX0ZJTEVfXywgX19MSU5FX18pCi0jZGVmaW5lIG1pZ2h0X3NsZWVwX2lmKGNvbmQpIGRvIHsgaWYgKHVubGlrZWx5KGNvbmQpKSBtaWdodF9zbGVlcCgpOyB9IHdoaWxlICgwKQotdm9pZCBfX21pZ2h0X3NsZWVwKGNoYXIgKmZpbGUsIGludCBsaW5lKTsKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkKK2V4dGVybiBpbnQgY29uZF9yZXNjaGVkKHZvaWQpOworIyBkZWZpbmUgbWlnaHRfcmVzY2hlZCgpIGNvbmRfcmVzY2hlZCgpCiAjZWxzZQotI2RlZmluZSBtaWdodF9zbGVlcCgpIGRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIG1pZ2h0X3NsZWVwX2lmKGNvbmQpIGRvIHt9IHdoaWxlICgwKQorIyBkZWZpbmUgbWlnaHRfcmVzY2hlZCgpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQCisgIHZvaWQgX19taWdodF9zbGVlcChjaGFyICpmaWxlLCBpbnQgbGluZSk7CisjIGRlZmluZSBtaWdodF9zbGVlcCgpIFwKKwlkbyB7IF9fbWlnaHRfc2xlZXAoX19GSUxFX18sIF9fTElORV9fKTsgbWlnaHRfcmVzY2hlZCgpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIG1pZ2h0X3NsZWVwKCkgZG8geyBtaWdodF9yZXNjaGVkKCk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBtaWdodF9zbGVlcF9pZihjb25kKSBkbyB7IGlmICh1bmxpa2VseShjb25kKSkgbWlnaHRfc2xlZXAoKTsgfSB3aGlsZSAoMCkKKwogI2RlZmluZSBhYnMoeCkgKHsJCQkJXAogCQlpbnQgX194ID0gKHgpOwkJCVwKIAkJKF9feCA8IDApID8gLV9feCA6IF9feDsJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V4ZWMuaCBiL2luY2x1ZGUvbGludXgva2V4ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ2ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIExJTlVYX0tFWEVDX0gKKyNkZWZpbmUgTElOVVhfS0VYRUNfSAorCisjaWZkZWYgQ09ORklHX0tFWEVDCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgorCisvKiBWZXJpZnkgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIG1hY3JvcyBhcmUgZGVmaW5lZCAqLworCisjaWZuZGVmIEtFWEVDX1NPVVJDRV9NRU1PUllfTElNSVQKKyNlcnJvciBLRVhFQ19TT1VSQ0VfTUVNT1JZX0xJTUlUIG5vdCBkZWZpbmVkCisjZW5kaWYKKworI2lmbmRlZiBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQKKyNlcnJvciBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUCisjZXJyb3IgS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFCisjZXJyb3IgS0VYRUNfQ09OVFJPTF9DT0RFX1NJWkUgbm90IGRlZmluZWQKKyNlbmRpZgorCisjaWZuZGVmIEtFWEVDX0FSQ0gKKyNlcnJvciBLRVhFQ19BUkNIIG5vdCBkZWZpbmVkCisjZW5kaWYKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnRzIHRoYXQgYXJlIHVzZWQgd2hlbiBsb2FkaW5nCisgKiBrZXJuZWwgYmluYXJpZXMuCisgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGtpbWFnZV9lbnRyeV90OworI2RlZmluZSBJTkRfREVTVElOQVRJT04gIDB4MQorI2RlZmluZSBJTkRfSU5ESVJFQ1RJT04gIDB4MgorI2RlZmluZSBJTkRfRE9ORSAgICAgICAgIDB4NAorI2RlZmluZSBJTkRfU09VUkNFICAgICAgIDB4OAorCisjZGVmaW5lIEtFWEVDX1NFR01FTlRfTUFYIDgKK3N0cnVjdCBrZXhlY19zZWdtZW50IHsKKwl2b2lkIF9fdXNlciAqYnVmOworCXNpemVfdCBidWZzejsKKwl1bnNpZ25lZCBsb25nIG1lbTsJLyogVXNlciBzcGFjZSBzZWVzIHRoaXMgYXMgYSAodm9pZCAqKSAuLi4gKi8KKwlzaXplX3QgbWVtc3o7Cit9OworCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RydWN0IGNvbXBhdF9rZXhlY19zZWdtZW50IHsKKwljb21wYXRfdXB0cl90IGJ1ZjsKKwljb21wYXRfc2l6ZV90IGJ1ZnN6OworCWNvbXBhdF91bG9uZ190IG1lbTsJLyogVXNlciBzcGFjZSBzZWVzIHRoaXMgYXMgYSAodm9pZCAqKSAuLi4gKi8KKwljb21wYXRfc2l6ZV90IG1lbXN6OworfTsKKyNlbmRpZgorCitzdHJ1Y3Qga2ltYWdlIHsKKwlraW1hZ2VfZW50cnlfdCBoZWFkOworCWtpbWFnZV9lbnRyeV90ICplbnRyeTsKKwlraW1hZ2VfZW50cnlfdCAqbGFzdF9lbnRyeTsKKworCXVuc2lnbmVkIGxvbmcgZGVzdGluYXRpb247CisKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXN0cnVjdCBwYWdlICpjb250cm9sX2NvZGVfcGFnZTsKKworCXVuc2lnbmVkIGxvbmcgbnJfc2VnbWVudHM7CisJc3RydWN0IGtleGVjX3NlZ21lbnQgc2VnbWVudFtLRVhFQ19TRUdNRU5UX01BWF07CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnRyb2xfcGFnZXM7CisJc3RydWN0IGxpc3RfaGVhZCBkZXN0X3BhZ2VzOworCXN0cnVjdCBsaXN0X2hlYWQgdW51c2VhYmxlX3BhZ2VzOworCisJLyogQWRkcmVzcyBvZiBuZXh0IGNvbnRyb2wgcGFnZSB0byBhbGxvY2F0ZSBmb3IgY3Jhc2gga2VybmVscy4gKi8KKwl1bnNpZ25lZCBsb25nIGNvbnRyb2xfcGFnZTsKKworCS8qIEZsYWdzIHRvIGluZGljYXRlIHNwZWNpYWwgcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkIGludCB0eXBlIDogMTsKKyNkZWZpbmUgS0VYRUNfVFlQRV9ERUZBVUxUIDAKKyNkZWZpbmUgS0VYRUNfVFlQRV9DUkFTSCAgIDEKK307CisKKworCisvKiBrZXhlYyBpbnRlcmZhY2UgZnVuY3Rpb25zICovCitleHRlcm4gTk9SRVRfVFlQRSB2b2lkIG1hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpIEFUVFJJQl9OT1JFVDsKK2V4dGVybiBpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKTsKK2V4dGVybiB2b2lkIG1hY2hpbmVfa2V4ZWNfY2xlYW51cChzdHJ1Y3Qga2ltYWdlICppbWFnZSk7CitleHRlcm4gYXNtbGlua2FnZSBsb25nIHN5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksCisJCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VnbWVudHMsCisJCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2lmZGVmIENPTkZJR19DT01QQVQKK2V4dGVybiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19rZXhlY19sb2FkKHVuc2lnbmVkIGxvbmcgZW50cnksCisJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdtZW50cywKKwkJCQlzdHJ1Y3QgY29tcGF0X2tleGVjX3NlZ21lbnQgX191c2VyICpzZWdtZW50cywKKwkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKKyNlbmRpZgorZXh0ZXJuIHN0cnVjdCBwYWdlICpraW1hZ2VfYWxsb2NfY29udHJvbF9wYWdlcyhzdHJ1Y3Qga2ltYWdlICppbWFnZSwKKwkJCQkJCXVuc2lnbmVkIGludCBvcmRlcik7CitleHRlcm4gdm9pZCBjcmFzaF9rZXhlYyhzdHJ1Y3QgcHRfcmVncyAqKTsKK2ludCBrZXhlY19zaG91bGRfY3Jhc2goc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHN0cnVjdCBraW1hZ2UgKmtleGVjX2ltYWdlOworCisjZGVmaW5lIEtFWEVDX09OX0NSQVNIICAweDAwMDAwMDAxCisjZGVmaW5lIEtFWEVDX0FSQ0hfTUFTSyAweGZmZmYwMDAwCisKKy8qIFRoZXNlIHZhbHVlcyBtYXRjaCB0aGUgRUxGIGFyY2hpdGVjdHVyZSB2YWx1ZXMuCisgKiBVbmxlc3MgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiB0aGF0IHNob3VsZCBjb250aW51ZSB0byBiZSB0aGUgY2FzZS4KKyAqLworI2RlZmluZSBLRVhFQ19BUkNIX0RFRkFVTFQgKCAwIDw8IDE2KQorI2RlZmluZSBLRVhFQ19BUkNIXzM4NiAgICAgKCAzIDw8IDE2KQorI2RlZmluZSBLRVhFQ19BUkNIX1g4Nl82NCAgKDYyIDw8IDE2KQorI2RlZmluZSBLRVhFQ19BUkNIX1BQQyAgICAgKDIwIDw8IDE2KQorI2RlZmluZSBLRVhFQ19BUkNIX1BQQzY0ICAgKDIxIDw8IDE2KQorI2RlZmluZSBLRVhFQ19BUkNIX0lBXzY0ICAgKDUwIDw8IDE2KQorI2RlZmluZSBLRVhFQ19BUkNIX1MzOTAgICAgKDIyIDw8IDE2KQorCisjZGVmaW5lIEtFWEVDX0ZMQUdTICAgIChLRVhFQ19PTl9DUkFTSCkgIC8qIExpc3Qgb2YgZGVmaW5lZC9sZWdhbCBrZXhlYyBmbGFncyAqLworCisvKiBMb2NhdGlvbiBvZiBhIHJlc2VydmVkIHJlZ2lvbiB0byBob2xkIHRoZSBjcmFzaCBrZXJuZWwuCisgKi8KK2V4dGVybiBzdHJ1Y3QgcmVzb3VyY2UgY3Jhc2hrX3JlczsKKworI2Vsc2UgLyogIUNPTkZJR19LRVhFQyAqLworc3RydWN0IHB0X3JlZ3M7CitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfa2V4ZWMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsgfQorc3RhdGljIGlubGluZSBpbnQga2V4ZWNfc2hvdWxkX2NyYXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQorI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLworI2VuZGlmIC8qIExJTlVYX0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V5LXVpLmggYi9pbmNsdWRlL2xpbnV4L2tleS11aS5oCmluZGV4IDYwY2M3YjcuLmNjMzI2MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V5LXVpLmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXktdWkuaApAQCAtMSw0ICsxLDQgQEAKLS8qIGtleS11aS5oOiBrZXkgdXNlcnNwYWNlIGludGVyZmFjZSBzdHVmZiBmb3IgdXNlIGJ5IGtleWZzCisvKiBrZXktdWkuaDoga2V5IHVzZXJzcGFjZSBpbnRlcmZhY2Ugc3R1ZmYKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQpAQCAtMzEsOCArMzEsMTAgQEAKICAqIHN1YnNjcmliZWQKICAqLwogc3RydWN0IGtleXJpbmdfbGlzdCB7Ci0JdW5zaWduZWQJbWF4a2V5czsJLyogbWF4IGtleXMgdGhpcyBsaXN0IGNhbiBob2xkICovCi0JdW5zaWduZWQJbmtleXM7CQkvKiBudW1iZXIgb2Yga2V5cyBjdXJyZW50bHkgaGVsZCAqLworCXN0cnVjdCByY3VfaGVhZAlyY3U7CQkvKiBSQ1UgZGVsZXRpb24gaG9vayAqLworCXVuc2lnbmVkIHNob3J0CW1heGtleXM7CS8qIG1heCBrZXlzIHRoaXMgbGlzdCBjYW4gaG9sZCAqLworCXVuc2lnbmVkIHNob3J0CW5rZXlzOwkJLyogbnVtYmVyIG9mIGtleXMgY3VycmVudGx5IGhlbGQgKi8KKwl1bnNpZ25lZCBzaG9ydAlkZWxrZXk7CQkvKiBrZXkgdG8gYmUgdW5saW5rZWQgYnkgUkNVICovCiAJc3RydWN0IGtleQkqa2V5c1swXTsKIH07CiAKQEAgLTgyLDggKzg0LDQ1IEBACiAJcmV0dXJuIGtwZXJtICE9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGtleV90YXNrX2dyb3Vwc19zZWFyY2goc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGdpZF90IGdpZCkKK3sKKwlpbnQgcmV0OwogCi1leHRlcm4gc3RydWN0IGtleSAqbG9va3VwX3VzZXJfa2V5KGtleV9zZXJpYWxfdCBpZCwgaW50IGNyZWF0ZSwgaW50IHBhcnQsCisJdGFza19sb2NrKHRzayk7CisJcmV0ID0gZ3JvdXBzX3NlYXJjaCh0c2stPmdyb3VwX2luZm8sIGdpZCk7CisJdGFza191bmxvY2sodHNrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIGludCBrZXlfdGFza19wZXJtaXNzaW9uKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwKKwkJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbnRleHQsCisJCQkJICAgICAga2V5X3Blcm1fdCBwZXJtKQoreworCWtleV9wZXJtX3Qga3Blcm07CisKKwlpZiAoa2V5LT51aWQgPT0gY29udGV4dC0+ZnN1aWQpIHsKKwkJa3Blcm0gPSBrZXktPnBlcm0gPj4gMTY7CisJfQorCWVsc2UgaWYgKGtleS0+Z2lkICE9IC0xICYmCisJCSBrZXktPnBlcm0gJiBLRVlfR1JQX0FMTCAmJiAoCisJCQkga2V5LT5naWQgPT0gY29udGV4dC0+ZnNnaWQgfHwKKwkJCSBrZXlfdGFza19ncm91cHNfc2VhcmNoKGNvbnRleHQsIGtleS0+Z2lkKQorCQkJICkKKwkJICkgeworCQlrcGVybSA9IGtleS0+cGVybSA+PiA4OworCX0KKwllbHNlIHsKKwkJa3Blcm0gPSBrZXktPnBlcm07CisJfQorCisJa3Blcm0gPSBrcGVybSAmIHBlcm0gJiBLRVlfQUxMOworCisJcmV0dXJuIGtwZXJtID09IHBlcm07CisKK30KKworZXh0ZXJuIHN0cnVjdCBrZXkgKmxvb2t1cF91c2VyX2tleShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbnRleHQsCisJCQkJICAga2V5X3NlcmlhbF90IGlkLCBpbnQgY3JlYXRlLCBpbnQgcGFydGlhbCwKIAkJCQkgICBrZXlfcGVybV90IHBlcm0pOwogCiBleHRlcm4gbG9uZyBqb2luX3Nlc3Npb25fa2V5cmluZyhjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2V5LmggYi9pbmNsdWRlL2xpbnV4L2tleS5oCmluZGV4IDZhYTQ2ZDAuLjk3MGJiZDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V5LmgKKysrIGIvaW5jbHVkZS9saW51eC9rZXkuaApAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC03OCw3ICs3OCw2IEBACiAJa2V5X3NlcmlhbF90CQlzZXJpYWw7CQkvKiBrZXkgc2VyaWFsIG51bWJlciAqLwogCXN0cnVjdCByYl9ub2RlCQlzZXJpYWxfbm9kZTsKIAlzdHJ1Y3Qga2V5X3R5cGUJCSp0eXBlOwkJLyogdHlwZSBvZiBrZXkgKi8KLQlyd2xvY2tfdAkJbG9jazsJCS8qIGV4YW1pbmF0aW9uIHZzIGNoYW5nZSBsb2NrICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlzZW07CQkvKiBjaGFuZ2UgdnMgY2hhbmdlIHNlbSAqLwogCXN0cnVjdCBrZXlfdXNlcgkJKnVzZXI7CQkvKiBvd25lciBvZiB0aGlzIGtleSAqLwogCXRpbWVfdAkJCWV4cGlyeTsJCS8qIHRpbWUgYXQgd2hpY2gga2V5IGV4cGlyZXMgKG9yIDApICovCkBAIC04NiwxNCArODUsMTAgQEAKIAlnaWRfdAkJCWdpZDsKIAlrZXlfcGVybV90CQlwZXJtOwkJLyogYWNjZXNzIHBlcm1pc3Npb25zICovCiAJdW5zaWduZWQgc2hvcnQJCXF1b3RhbGVuOwkvKiBsZW5ndGggYWRkZWQgdG8gcXVvdGEgKi8KLQl1bnNpZ25lZCBzaG9ydAkJZGF0YWxlbjsJLyogcGF5bG9hZCBkYXRhIGxlbmd0aCAqLwotCXVuc2lnbmVkIHNob3J0CQlmbGFnczsJCS8qIHN0YXR1cyBmbGFncyAoY2hhbmdlIHdpdGggbG9jayB3cml0ZWxvY2tlZCkgKi8KLSNkZWZpbmUgS0VZX0ZMQUdfSU5TVEFOVElBVEVECTB4MDAwMDAwMDEJLyogc2V0IGlmIGtleSBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgKi8KLSNkZWZpbmUgS0VZX0ZMQUdfREVBRAkJMHgwMDAwMDAwMgkvKiBzZXQgaWYga2V5IHR5cGUgaGFzIGJlZW4gZGVsZXRlZCAqLwotI2RlZmluZSBLRVlfRkxBR19SRVZPS0VECTB4MDAwMDAwMDQJLyogc2V0IGlmIGtleSBoYWQgYmVlbiByZXZva2VkICovCi0jZGVmaW5lIEtFWV9GTEFHX0lOX1FVT1RBCTB4MDAwMDAwMDgJLyogc2V0IGlmIGtleSBjb25zdW1lcyBxdW90YSAqLwotI2RlZmluZSBLRVlfRkxBR19VU0VSX0NPTlNUUlVDVAkweDAwMDAwMDEwCS8qIHNldCBpZiBrZXkgaXMgYmVpbmcgY29uc3RydWN0ZWQgaW4gdXNlcnNwYWNlICovCi0jZGVmaW5lIEtFWV9GTEFHX05FR0FUSVZFCTB4MDAwMDAwMjAJLyogc2V0IGlmIGtleSBpcyBuZWdhdGl2ZSAqLworCXVuc2lnbmVkIHNob3J0CQlkYXRhbGVuOwkvKiBwYXlsb2FkIGRhdGEgbGVuZ3RoCisJCQkJCQkgKiAtIG1heSBub3QgbWF0Y2ggUkNVIGRlcmVmZXJlbmNlZCBwYXlsb2FkCisJCQkJCQkgKiAtIHBheWxvYWQgc2hvdWxkIGNvbnRhaW4gb3duIGxlbmd0aAorCQkJCQkJICovCiAKICNpZmRlZiBLRVlfREVCVUdHSU5HCiAJdW5zaWduZWQJCW1hZ2ljOwpAQCAtMTAxLDYgKzk2LDE0IEBACiAjZGVmaW5lIEtFWV9ERUJVR19NQUdJQ19YCTB4ZjhlOWRhY2J1CiAjZW5kaWYKIAorCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogc3RhdHVzIGZsYWdzIChjaGFuZ2Ugd2l0aCBiaXRvcHMpICovCisjZGVmaW5lIEtFWV9GTEFHX0lOU1RBTlRJQVRFRAkwCS8qIHNldCBpZiBrZXkgaGFzIGJlZW4gaW5zdGFudGlhdGVkICovCisjZGVmaW5lIEtFWV9GTEFHX0RFQUQJCTEJLyogc2V0IGlmIGtleSB0eXBlIGhhcyBiZWVuIGRlbGV0ZWQgKi8KKyNkZWZpbmUgS0VZX0ZMQUdfUkVWT0tFRAkyCS8qIHNldCBpZiBrZXkgaGFkIGJlZW4gcmV2b2tlZCAqLworI2RlZmluZSBLRVlfRkxBR19JTl9RVU9UQQkzCS8qIHNldCBpZiBrZXkgY29uc3VtZXMgcXVvdGEgKi8KKyNkZWZpbmUgS0VZX0ZMQUdfVVNFUl9DT05TVFJVQ1QJNAkvKiBzZXQgaWYga2V5IGlzIGJlaW5nIGNvbnN0cnVjdGVkIGluIHVzZXJzcGFjZSAqLworI2RlZmluZSBLRVlfRkxBR19ORUdBVElWRQk1CS8qIHNldCBpZiBrZXkgaXMgbmVnYXRpdmUgKi8KKwogCS8qIHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcKIAkgKiAtIHRoaXMgaXMgdXNlZCB0byBtYXRjaCBhIGtleSBhZ2FpbnN0IHNlYXJjaCBjcml0ZXJpYQogCSAqIC0gdGhpcyBzaG91bGQgYmUgYSBwcmludGFibGUgc3RyaW5nCkBAIC0xOTYsMTAgKzE5OSwxMiBAQAogZXh0ZXJuIGludCBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoc3RydWN0IGtleSAqa2V5LAogCQkJCSAgICBjb25zdCB2b2lkICpkYXRhLAogCQkJCSAgICBzaXplX3QgZGF0YWxlbiwKLQkJCQkgICAgc3RydWN0IGtleSAqa2V5cmluZyk7CisJCQkJICAgIHN0cnVjdCBrZXkgKmtleXJpbmcsCisJCQkJICAgIHN0cnVjdCBrZXkgKmluc3RrZXkpOwogZXh0ZXJuIGludCBrZXlfbmVnYXRlX2FuZF9saW5rKHN0cnVjdCBrZXkgKmtleSwKIAkJCSAgICAgICB1bnNpZ25lZCB0aW1lb3V0LAotCQkJICAgICAgIHN0cnVjdCBrZXkgKmtleXJpbmcpOworCQkJICAgICAgIHN0cnVjdCBrZXkgKmtleXJpbmcsCisJCQkgICAgICAgc3RydWN0IGtleSAqaW5zdGtleSk7CiBleHRlcm4gdm9pZCBrZXlfcmV2b2tlKHN0cnVjdCBrZXkgKmtleSk7CiBleHRlcm4gdm9pZCBrZXlfcHV0KHN0cnVjdCBrZXkgKmtleSk7CiAKQEAgLTI0MiwxNCArMjQ3LDEzIEBACiAJCQkJICBzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCiAJCQkJICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbik7CiAKLWV4dGVybiBzdHJ1Y3Qga2V5ICpzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyhzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uKTsKLQogZXh0ZXJuIGludCBrZXlyaW5nX2FkZF9rZXkoc3RydWN0IGtleSAqa2V5cmluZywKIAkJCSAgIHN0cnVjdCBrZXkgKmtleSk7CiAKIGV4dGVybiBzdHJ1Y3Qga2V5ICprZXlfbG9va3VwKGtleV9zZXJpYWxfdCBpZCk7CiAKK2V4dGVybiB2b2lkIGtleXJpbmdfcmVwbGFjZV9wYXlsb2FkKHN0cnVjdCBrZXkgKmtleSwgdm9pZCAqcmVwbGFjZW1lbnQpOworCiAjZGVmaW5lIGtleV9zZXJpYWwoa2V5KSAoKGtleSkgPyAoa2V5KS0+c2VyaWFsIDogMCkKIAogLyoKQEAgLTI2OCwxNCArMjcyLDIyIEBACiBleHRlcm4gdm9pZCBrZXlfZnNnaWRfY2hhbmdlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiBleHRlcm4gdm9pZCBrZXlfaW5pdCh2b2lkKTsKIAorI2RlZmluZSBfX2luc3RhbGxfc2Vzc2lvbl9rZXlyaW5nKHRzaywga2V5cmluZykJCQlcCisoewkJCQkJCQkJXAorCXN0cnVjdCBrZXkgKm9sZF9zZXNzaW9uID0gdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZzsJXAorCXRzay0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcgPSBrZXlyaW5nOwkJCVwKKwlvbGRfc2Vzc2lvbjsJCQkJCQlcCit9KQorCiAjZWxzZSAvKiBDT05GSUdfS0VZUyAqLwogCiAjZGVmaW5lIGtleV92YWxpZGF0ZShrKQkJCTAKICNkZWZpbmUga2V5X3NlcmlhbChrKQkJCTAKLSNkZWZpbmUga2V5X2dldChrKSAJCQlOVUxMCisjZGVmaW5lIGtleV9nZXQoaykgCQkJKHsgTlVMTDsgfSkKICNkZWZpbmUga2V5X3B1dChrKQkJCWRvIHsgfSB3aGlsZSgwKQogI2RlZmluZSBhbGxvY191aWRfa2V5cmluZyh1KQkJMAogI2RlZmluZSBzd2l0Y2hfdWlkX2tleXJpbmcodSkJCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBfX2luc3RhbGxfc2Vzc2lvbl9rZXlyaW5nKHQsIGspCSh7IE5VTEw7IH0pCiAjZGVmaW5lIGNvcHlfa2V5cyhmLHQpCQkJMAogI2RlZmluZSBjb3B5X3RocmVhZF9ncm91cF9rZXlzKHQpCTAKICNkZWZpbmUgZXhpdF9rZXlzKHQpCQkJZG8geyB9IHdoaWxlKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tleWN0bC5oIGIvaW5jbHVkZS9saW51eC9rZXljdGwuaAppbmRleCAzODFkZWRjLi44ZDdjNTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tleWN0bC5oCisrKyBiL2luY2x1ZGUvbGludXgva2V5Y3RsLmgKQEAgLTIwLDYgKzIwLDE2IEBACiAjZGVmaW5lIEtFWV9TUEVDX1VTRVJfU0VTU0lPTl9LRVlSSU5HCS01CS8qIC0ga2V5IElEIGZvciBVSUQtc2Vzc2lvbiBrZXlyaW5nICovCiAjZGVmaW5lIEtFWV9TUEVDX0dST1VQX0tFWVJJTkcJCS02CS8qIC0ga2V5IElEIGZvciBHSUQtc3BlY2lmaWMga2V5cmluZyAqLwogCisvKiByZXF1ZXN0LWtleSBkZWZhdWx0IGtleXJpbmdzICovCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9OT19DSEFOR0UJCS0xCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9ERUZBVUxUCQkJMAorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfVEhSRUFEX0tFWVJJTkcJCTEKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX1BST0NFU1NfS0VZUklORwkJMgorI2RlZmluZSBLRVlfUkVRS0VZX0RFRkxfU0VTU0lPTl9LRVlSSU5HCQkzCisjZGVmaW5lIEtFWV9SRVFLRVlfREVGTF9VU0VSX0tFWVJJTkcJCTQKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX1VTRVJfU0VTU0lPTl9LRVlSSU5HCTUKKyNkZWZpbmUgS0VZX1JFUUtFWV9ERUZMX0dST1VQX0tFWVJJTkcJCTYKKwogLyoga2V5Y3RsIGNvbW1hbmRzICovCiAjZGVmaW5lIEtFWUNUTF9HRVRfS0VZUklOR19JRAkJMAkvKiBhc2sgZm9yIGEga2V5cmluZydzIElEICovCiAjZGVmaW5lIEtFWUNUTF9KT0lOX1NFU1NJT05fS0VZUklORwkxCS8qIGpvaW4gb3Igc3RhcnQgbmFtZWQgc2Vzc2lvbiBrZXlyaW5nICovCkBAIC0zNSw1ICs0NSw2IEBACiAjZGVmaW5lIEtFWUNUTF9SRUFECQkJMTEJLyogcmVhZCBhIGtleSBvciBrZXlyaW5nJ3MgY29udGVudHMgKi8KICNkZWZpbmUgS0VZQ1RMX0lOU1RBTlRJQVRFCQkxMgkvKiBpbnN0YW50aWF0ZSBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBrZXkgKi8KICNkZWZpbmUgS0VZQ1RMX05FR0FURQkJCTEzCS8qIG5lZ2F0ZSBhIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBrZXkgKi8KKyNkZWZpbmUgS0VZQ1RMX1NFVF9SRVFLRVlfS0VZUklORwkxNAkvKiBzZXQgZGVmYXVsdCByZXF1ZXN0LWtleSBrZXlyaW5nICovCiAKICNlbmRpZiAvKiAgX0xJTlVYX0tFWUNUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ttb2QuaCBiL2luY2x1ZGUvbGludXgva21vZC5oCmluZGV4IDk1ZDBlNGIuLmU0YTIzMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva21vZC5oCisrKyBiL2luY2x1ZGUvbGludXgva21vZC5oCkBAIC0xOSw2ICsxOSw3IEBACiAgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CkBAIC0zNCw3ICszNSwxNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeCwgbW9kLi4uKSAoKHgpID86IChyZXF1ZXN0X21vZHVsZShtb2QpLCAoeCkpKQotZXh0ZXJuIGludCBjYWxsX3VzZXJtb2RlaGVscGVyKGNoYXIgKnBhdGgsIGNoYXIgKmFyZ3ZbXSwgY2hhciAqZW52cFtdLCBpbnQgd2FpdCk7CisKK3N0cnVjdCBrZXk7CitleHRlcm4gaW50IGNhbGxfdXNlcm1vZGVoZWxwZXJfa2V5cyhjaGFyICpwYXRoLCBjaGFyICphcmd2W10sIGNoYXIgKmVudnBbXSwKKwkJCQkgICAgc3RydWN0IGtleSAqc2Vzc2lvbl9rZXlyaW5nLCBpbnQgd2FpdCk7CisKK3N0YXRpYyBpbmxpbmUgaW50CitjYWxsX3VzZXJtb2RlaGVscGVyKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCwgaW50IHdhaXQpCit7CisJcmV0dXJuIGNhbGxfdXNlcm1vZGVoZWxwZXJfa2V5cyhwYXRoLCBhcmd2LCBlbnZwLCBOVUxMLCB3YWl0KTsKK30KKwogZXh0ZXJuIHZvaWQgdXNlcm1vZGVoZWxwZXJfaW5pdCh2b2lkKTsKIAogI2VuZGlmIC8qIF9fTElOVVhfS01PRF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3Byb2Jlcy5oIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKaW5kZXggNWUxYTdiMC4uZTA1MGZjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9rcHJvYmVzLmgKQEAgLTEwNCwzMyArMTA0LDEyIEBACiB9OwogCiAjaWZkZWYgQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTCi1leHRlcm4gaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCB0cmFtcG9saW5lX3Bvc3RfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmFyY2hfZ2V0X2twcm9iZV90YXNrKHZvaWQgKnB0cik7CiBleHRlcm4gdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBhcmNoX2twcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspOwogI2Vsc2UgLyogQVJDSF9TVVBQT1JUU19LUkVUUFJPQkVTICovCi1zdGF0aWMgaW5saW5lIHZvaWQga3JldHByb2JlX3RyYW1wb2xpbmUodm9pZCkKLXsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHRyYW1wb2xpbmVfcHJvYmVfaGFuZGxlcihzdHJ1Y3Qga3Byb2JlICpwLAotCQkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIoc3RydWN0IGtwcm9iZSAqcCwKLQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLX0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3ByZXBhcmVfa3JldHByb2JlKHN0cnVjdCBrcmV0cHJvYmUgKnJwLAogCQkJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2twcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspCi17Ci19Ci0jZGVmaW5lIGFyY2hfZ2V0X2twcm9iZV90YXNrKHB0cikgKChzdHJ1Y3QgdGFza19zdHJ1Y3QgKilOVUxMKQogI2VuZGlmIC8qIEFSQ0hfU1VQUE9SVFNfS1JFVFBST0JFUyAqLwogLyoKICAqIEZ1bmN0aW9uLXJldHVybiBwcm9iZSAtCkBAIC0xNTUsOCArMTM0LDggQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSB1Zmxpc3Q7IC8qIGVpdGhlciBvbiBmcmVlIGxpc3Qgb3IgdXNlZCBsaXN0ICovCiAJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7CiAJc3RydWN0IGtyZXRwcm9iZSAqcnA7Ci0Jdm9pZCAqcmV0X2FkZHI7Ci0Jdm9pZCAqc3RhY2tfYWRkcjsKKwlrcHJvYmVfb3Bjb2RlX3QgKnJldF9hZGRyOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIH07CiAKICNpZmRlZiBDT05GSUdfS1BST0JFUwpAQCAtMTc2LDcgKzE1NSwxMCBAQAogZXh0ZXJuIHZvaWQgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogZXh0ZXJuIHZvaWQgYXJjaF9kaXNhcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOworZXh0ZXJuIGludCBhcmNoX2luaXRfa3Byb2Jlcyh2b2lkKTsKIGV4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCk7CitleHRlcm4gdm9pZCBmcmVlX2luc25fc2xvdChrcHJvYmVfb3Bjb2RlX3QgKnNsb3QpOwogCiAvKiBHZXQgdGhlIGtwcm9iZSBhdCB0aGlzIGFkZHIgKGlmIGFueSkuICBNdXN0IGhhdmUgY2FsbGVkIGxvY2tfa3Byb2JlcyAqLwogc3RydWN0IGtwcm9iZSAqZ2V0X2twcm9iZSh2b2lkICphZGRyKTsKQEAgLTE5NCw4ICsxNzYsNiBAQAogdm9pZCB1bnJlZ2lzdGVyX2tyZXRwcm9iZShzdHJ1Y3Qga3JldHByb2JlICpycCk7CiAKIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmdldF9mcmVlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZSAqcnApOwotc3RydWN0IGtyZXRwcm9iZV9pbnN0YW5jZSAqZ2V0X3JwX2luc3Qodm9pZCAqc2FyYSk7Ci1zdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpnZXRfcnBfaW5zdF90c2soc3RydWN0IHRhc2tfc3RydWN0ICp0ayk7CiB2b2lkIGFkZF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpKTsKIHZvaWQga3Byb2JlX2ZsdXNoX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0ayk7CiB2b2lkIHJlY3ljbGVfcnBfaW5zdChzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oIGIvaW5jbHVkZS9saW51eC9saWJwczIuaAppbmRleCA5MjNiZGJjLi5hNzEwYmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYnBzMi5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlicHMyLmgKQEAgLTQxLDYgKzQxLDcgQEAKIAogdm9pZCBwczJfaW5pdChzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogaW50IHBzMl9zZW5kYnl0ZShzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgYnl0ZSwgaW50IHRpbWVvdXQpOwordm9pZCBwczJfZHJhaW4oc3RydWN0IHBzMmRldiAqcHMyZGV2LCBpbnQgbWF4Ynl0ZXMsIGludCB0aW1lb3V0KTsKIGludCBwczJfY29tbWFuZChzdHJ1Y3QgcHMyZGV2ICpwczJkZXYsIHVuc2lnbmVkIGNoYXIgKnBhcmFtLCBpbnQgY29tbWFuZCk7CiBpbnQgcHMyX3NjaGVkdWxlX2NvbW1hbmQoc3RydWN0IHBzMmRldiAqcHMyZGV2LCB1bnNpZ25lZCBjaGFyICpwYXJhbSwgaW50IGNvbW1hbmQpOwogaW50IHBzMl9oYW5kbGVfYWNrKHN0cnVjdCBwczJkZXYgKnBzMmRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlzdC5oIGIvaW5jbHVkZS9saW51eC9saXN0LmgKaW5kZXggMzk5YjUxZC4uYWFiMmRiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saXN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9saXN0LmgKQEAgLTE4NSw3ICsxODUsNyBAQAogICogbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoKS4KICAqCiAgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciBpcyBub3QgcGVybWl0dGVkIHRvIGltbWVkaWF0ZWx5IGZyZWUKLSAqIHRoZSBuZXdseSBkZWxldGVkIGVudHJ5LiAgSW5zdGVhZCwgZWl0aGVyIHN5bmNocm9uaXplX2tlcm5lbCgpCisgKiB0aGUgbmV3bHkgZGVsZXRlZCBlbnRyeS4gIEluc3RlYWQsIGVpdGhlciBzeW5jaHJvbml6ZV9yY3UoKQogICogb3IgY2FsbF9yY3UoKSBtdXN0IGJlIHVzZWQgdG8gZGVmZXIgZnJlZWluZyB1bnRpbCBhbiBSQ1UKICAqIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZC4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaCBiL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKaW5kZXggZDZlYjdiMi4uZGNlNTNhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCkBAIC0xNzQsNSArMTc0LDYyIEBACiAJX191OCBwcm90bzsKIH07CiAKKy8qCisgKiBTdHJ1Y3QgdXNlZCBmb3IgbWF0Y2hpbmcgYSBkZXZpY2UKKyAqLworc3RydWN0IG9mX2RldmljZV9pZAoreworCWNoYXIJbmFtZVszMl07CisJY2hhcgl0eXBlWzMyXTsKKwljaGFyCWNvbXBhdGlibGVbMTI4XTsKKwl2b2lkCSpkYXRhOworfTsKKworCisvKiBQQ01DSUEgKi8KKworc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgeworCV9fdTE2CQltYXRjaF9mbGFnczsKKworCV9fdTE2CQltYW5mX2lkOworCV9fdTE2IAkJY2FyZF9pZDsKKworCV9fdTggIAkJZnVuY19pZDsKKworCS8qIGZvciByZWFsIG11bHRpLWZ1bmN0aW9uIGRldmljZXMgKi8KKwlfX3U4ICAJCWZ1bmN0aW9uOworCisJLyogZm9yIHBzZXVkZSBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzICovCisJX191OCAgCQlkZXZpY2Vfbm87CisKKwlfX3UzMiAJCXByb2RfaWRfaGFzaFs0XTsKKworCS8qIG5vdCBtYXRjaGVkIGFnYWluc3QgaW4ga2VybmVsc3BhY2UqLworI2lmZGVmIF9fS0VSTkVMX18KKwljb25zdCBjaGFyICoJcHJvZF9pZFs0XTsKKyNlbHNlCisJa2VybmVsX3Vsb25nX3QJcHJvZF9pZFs0XTsKKyNlbmRpZgorCisJLyogbm90IG1hdGNoZWQgYWdhaW5zdCAqLworCWtlcm5lbF91bG9uZ190CWRyaXZlcl9pbmZvOworI2lmZGVmIF9fS0VSTkVMX18KKwljaGFyICoJCWNpc2ZpbGU7CisjZWxzZQorCWtlcm5lbF91bG9uZ190CWNpc2ZpbGU7CisjZW5kaWYKK307CisKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9NQU5GX0lECTB4MDAwMQorI2RlZmluZSBQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUQJMHgwMDAyCisjZGVmaW5lIFBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ19JRAkweDAwMDQKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DVElPTgkweDAwMDgKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMQkweDAwMTAKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMgkweDAwMjAKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMwkweDAwNDAKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENAkweDAwODAKKyNkZWZpbmUgUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8JMHgwMTAwCisjZGVmaW5lIFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMJMHgwMjAwCisjZGVmaW5lIFBDTUNJQV9ERVZfSURfTUFUQ0hfQU5PTllNT1VTCTB4MDQwMAogCiAjZW5kaWYgLyogTElOVVhfTU9EX0RFVklDRVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmggYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCmluZGV4IDBlNDMyYTAuLmYwNTM3MmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaApAQCAtNTEsNiArNTEsOSBAQAogICAgICAgICBzc2l6ZV90ICgqc2hvdykoc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKiwgc3RydWN0IG1vZHVsZSAqLCBjaGFyICopOwogICAgICAgICBzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICosIHN0cnVjdCBtb2R1bGUgKiwKIAkJCSBjb25zdCBjaGFyICosIHNpemVfdCBjb3VudCk7CisJdm9pZCAoKnNldHVwKShzdHJ1Y3QgbW9kdWxlICosIGNvbnN0IGNoYXIgKik7CisJaW50ICgqdGVzdCkoc3RydWN0IG1vZHVsZSAqKTsKKwl2b2lkICgqZnJlZSkoc3RydWN0IG1vZHVsZSAqKTsKIH07CiAKIHN0cnVjdCBtb2R1bGVfa29iamVjdApAQCAtMjM5LDYgKzI0Miw4IEBACiAJLyogU3lzZnMgc3R1ZmYuICovCiAJc3RydWN0IG1vZHVsZV9rb2JqZWN0IG1rb2JqOwogCXN0cnVjdCBtb2R1bGVfcGFyYW1fYXR0cnMgKnBhcmFtX2F0dHJzOworCWNvbnN0IGNoYXIgKnZlcnNpb247CisJY29uc3QgY2hhciAqc3JjdmVyc2lvbjsKIAogCS8qIEV4cG9ydGVkIHN5bWJvbHMgKi8KIAljb25zdCBzdHJ1Y3Qga2VybmVsX3N5bWJvbCAqc3ltczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW91bnQuaCBiL2luY2x1ZGUvbGludXgvbW91bnQuaAppbmRleCA4YjhkM2I5Li5mOGYzOTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vdW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCkBAIC0xMiw2ICsxMiw3IEBACiAjZGVmaW5lIF9MSU5VWF9NT1VOVF9ICiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CkBAIC0zNCw3ICszNSw3IEBACiAJaW50IG1udF9leHBpcnlfbWFyazsJCS8qIHRydWUgaWYgbWFya2VkIGZvciBleHBpcnkgKi8KIAljaGFyICptbnRfZGV2bmFtZTsJCS8qIE5hbWUgb2YgZGV2aWNlIGUuZy4gL2Rldi9kc2svaGRhMSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbW50X2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBtbnRfZnNsaW5rOwkvKiBsaW5rIGluIGZzLXNwZWNpZmljIGV4cGlyeSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBtbnRfZXhwaXJlOwkvKiBsaW5rIGluIGZzLXNwZWNpZmljIGV4cGlyeSBsaXN0ICovCiAJc3RydWN0IG5hbWVzcGFjZSAqbW50X25hbWVzcGFjZTsgLyogY29udGFpbmluZyBuYW1lc3BhY2UgKi8KIH07CiAKQEAgLTQ3LDcgKzQ4LDcgQEAKIAogZXh0ZXJuIHZvaWQgX19tbnRwdXQoc3RydWN0IHZmc21vdW50ICptbnQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgX21udHB1dChzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbnRwdXRfbm9fZXhwaXJlKHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCWlmIChtbnQpIHsKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1udC0+bW50X2NvdW50KSkKQEAgLTU5LDcgKzYwLDcgQEAKIHsKIAlpZiAobW50KSB7CiAJCW1udC0+bW50X2V4cGlyeV9tYXJrID0gMDsKLQkJX21udHB1dChtbnQpOworCQltbnRwdXRfbm9fZXhwaXJlKG1udCk7CiAJfQogfQogCkBAIC03Niw2ICs3Nyw3IEBACiBleHRlcm4gdm9pZCBtYXJrX21vdW50c19mb3JfZXhwaXJ5KHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cyk7CiAKIGV4dGVybiBzcGlubG9ja190IHZmc21vdW50X2xvY2s7CitleHRlcm4gZGV2X3QgbmFtZV90b19kZXZfdChjaGFyICpuYW1lKTsKIAogI2VuZGlmCiAjZW5kaWYgLyogX0xJTlVYX01PVU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL2NmaS5oIGIvaW5jbHVkZS9saW51eC9tdGQvY2ZpLmgKaW5kZXggMmVkOGM1OC4uZTZiNmExYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvY2ZpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvY2ZpLmgKQEAgLTEsNyArMSw3IEBACiAKIC8qIENvbW1vbiBGbGFzaCBJbnRlcmZhY2Ugc3RydWN0dXJlcyAKICAqIFNlZSBodHRwOi8vc3VwcG9ydC5pbnRlbC5jb20vZGVzaWduL2ZsYXNoL3RlY2hub3RlL2luZGV4Lmh0bQotICogJElkOiBjZmkuaCx2IDEuNTAgMjAwNC8xMS8yMCAxMjo0Njo1MSBkd213MiBFeHAgJAorICogJElkOiBjZmkuaCx2IDEuNTQgMjAwNS8wNi8wNiAyMzowNDozNiB0cG95bm9yIEV4cCAkCiAgKi8KIAogI2lmbmRlZiBfX01URF9DRklfSF9fCkBAIC0xNDgsNiArMTQ4LDE0IEBACiAJdWludDhfdCAgZXh0cmFbMF07CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCitzdHJ1Y3QgY2ZpX2ludGVsZXh0X290cGluZm8geworCXVpbnQzMl90IFByb3RSZWdBZGRyOworCXVpbnQxNl90IEZhY3RHcm91cHM7CisJdWludDhfdCAgRmFjdFByb3RSZWdTaXplOworCXVpbnQxNl90IFVzZXJHcm91cHM7CisJdWludDhfdCAgVXNlclByb3RSZWdTaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKwogc3RydWN0IGNmaV9pbnRlbGV4dF9ibG9ja2luZm8gewogCXVpbnQxNl90IE51bUlkZW50QmxvY2tzOwogCXVpbnQxNl90IEJsb2NrU2l6ZTsKQEAgLTI0NCw3ICsyNTIsNyBAQAogICogSXQgbG9va3MgdG9vIGxvbmcgdG8gYmUgaW5saW5lLCBidXQgaW4gdGhlIGNvbW1vbiBjYXNlIGl0IHNob3VsZCBhbG1vc3QgYWxsCiAgKiBnZXQgb3B0aW1pc2VkIGF3YXkuIAogICovCi1zdGF0aWMgaW5saW5lIG1hcF93b3JkIGNmaV9idWlsZF9jbWQodV9jaGFyIGNtZCwgc3RydWN0IG1hcF9pbmZvICptYXAsIHN0cnVjdCBjZmlfcHJpdmF0ZSAqY2ZpKQorc3RhdGljIGlubGluZSBtYXBfd29yZCBjZmlfYnVpbGRfY21kKHVfbG9uZyBjbWQsIHN0cnVjdCBtYXBfaW5mbyAqbWFwLCBzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSkKIHsKIAltYXBfd29yZCB2YWwgPSB7IHswfSB9OwogCWludCB3b3Jkd2lkdGgsIHdvcmRzX3Blcl9idXMsIGNoaXBfbW9kZSwgY2hpcHNfcGVyX3dvcmQ7CkBAIC0zMDcsNiArMzE1LDY5IEBACiB9CiAjZGVmaW5lIENNRCh4KSAgY2ZpX2J1aWxkX2NtZCgoeCksIG1hcCwgY2ZpKQogCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBjZmlfbWVyZ2Vfc3RhdHVzKG1hcF93b3JkIHZhbCwgc3RydWN0IG1hcF9pbmZvICptYXAsIAorCQkJCQkgICBzdHJ1Y3QgY2ZpX3ByaXZhdGUgKmNmaSkKK3sKKwlpbnQgd29yZHdpZHRoLCB3b3Jkc19wZXJfYnVzLCBjaGlwX21vZGUsIGNoaXBzX3Blcl93b3JkOworCXVuc2lnbmVkIGxvbmcgb25lc3RhdCwgcmVzID0gMDsKKwlpbnQgaTsKKworCS8qIFdlIGRvIGl0IHRoaXMgd2F5IHRvIGdpdmUgdGhlIGNvbXBpbGVyIGEgZmlnaHRpbmcgY2hhbmNlIAorCSAgIG9mIG9wdGltaXNpbmcgYXdheSBhbGwgdGhlIGNyYXAgZm9yICdiYW5rd2lkdGgnIGxhcmdlciB0aGFuCisJICAgYW4gdW5zaWduZWQgbG9uZywgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRoYXQgc3VwcG9ydCBpcworCSAgIGRpc2FibGVkICovCisJaWYgKG1hcF9iYW5rd2lkdGhfaXNfbGFyZ2UobWFwKSkgeworCQl3b3Jkd2lkdGggPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCXdvcmRzX3Blcl9idXMgPSAobWFwX2Jhbmt3aWR0aChtYXApKSAvIHdvcmR3aWR0aDsgLy8gaS5lLiBub3JtYWxseSAxCisJfSBlbHNlIHsKKwkJd29yZHdpZHRoID0gbWFwX2Jhbmt3aWR0aChtYXApOworCQl3b3Jkc19wZXJfYnVzID0gMTsKKwl9CisJCisJY2hpcF9tb2RlID0gbWFwX2Jhbmt3aWR0aChtYXApIC8gY2ZpX2ludGVybGVhdmUoY2ZpKTsKKwljaGlwc19wZXJfd29yZCA9IHdvcmR3aWR0aCAqIGNmaV9pbnRlcmxlYXZlKGNmaSkgLyBtYXBfYmFua3dpZHRoKG1hcCk7CisKKwlvbmVzdGF0ID0gdmFsLnhbMF07CisJLyogT3IgYWxsIHN0YXR1cyB3b3JkcyB0b2dldGhlciAqLworCWZvciAoaT0xOyBpIDwgd29yZHNfcGVyX2J1czsgaSsrKSB7CisJCW9uZXN0YXQgfD0gdmFsLnhbaV07CisJfQorCisJcmVzID0gb25lc3RhdDsKKwlzd2l0Y2goY2hpcHNfcGVyX3dvcmQpIHsKKwlkZWZhdWx0OiBCVUcoKTsKKyNpZiBCSVRTX1BFUl9MT05HID49IDY0CisJY2FzZSA4OgorCQlyZXMgfD0gKG9uZXN0YXQgPj4gKGNoaXBfbW9kZSAqIDMyKSk7CisjZW5kaWYKKwljYXNlIDQ6CisJCXJlcyB8PSAob25lc3RhdCA+PiAoY2hpcF9tb2RlICogMTYpKTsKKwljYXNlIDI6CisJCXJlcyB8PSAob25lc3RhdCA+PiAoY2hpcF9tb2RlICogOCkpOworCWNhc2UgMToKKwkJOworCX0KKworCS8qIExhc3QsIGRldGVybWluZSB3aGF0IHRoZSBiaXQtcGF0dGVybiBzaG91bGQgYmUgZm9yIGEgc2luZ2xlCisJICAgZGV2aWNlLCBhY2NvcmRpbmcgdG8gY2hpcCBtb2RlIGFuZCBlbmRpYW5uZXNzLi4uICovCisJc3dpdGNoIChjaGlwX21vZGUpIHsKKwljYXNlIDE6CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmVzID0gY2ZpMTZfdG9fY3B1KHJlcyk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJcmVzID0gY2ZpMzJfdG9fY3B1KHJlcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6IEJVRygpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIE1FUkdFU1RBVFVTKHgpIGNmaV9tZXJnZV9zdGF0dXMoKHgpLCBtYXAsIGNmaSkKKworCiAvKgogICogU2VuZHMgYSBDRkkgY29tbWFuZCB0byBhIGJhbmsgb2YgZmxhc2ggZm9yIHRoZSBnaXZlbiBnZW9tZXRyeS4KICAqCkBAIC0zNTcsMTYgKzQyOCw2IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2ZpX3NwaW5fbG9jayhzcGlubG9ja190ICptdXRleCkKLXsKLQlzcGluX2xvY2tfYmgobXV0ZXgpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2ZpX3NwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKm11dGV4KQotewotCXNwaW5fdW5sb2NrX2JoKG11dGV4KTsKLX0KLQogc3RydWN0IGNmaV9leHRxdWVyeSAqY2ZpX3JlYWRfcHJpKHN0cnVjdCBtYXBfaW5mbyAqbWFwLCB1aW50MTZfdCBhZHIsIHVpbnQxNl90IHNpemUsCiAJCQkgICAgIGNvbnN0IGNoYXIqIG5hbWUpOwogc3RydWN0IGNmaV9maXh1cCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9mbGFzaGNoaXAuaCBiL2luY2x1ZGUvbGludXgvbXRkL2ZsYXNoY2hpcC5oCmluZGV4IGM2NmJhODEuLjY3NTc3NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXRkL2ZsYXNoY2hpcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL2ZsYXNoY2hpcC5oCkBAIC02LDcgKzYsNyBAQAogICoKICAqIChDKSAyMDAwIFJlZCBIYXQuIEdQTGQuCiAgKgotICogJElkOiBmbGFzaGNoaXAuaCx2IDEuMTUgMjAwNC8xMS8wNSAyMjo0MTowNiBuaWNvIEV4cCAkCisgKiAkSWQ6IGZsYXNoY2hpcC5oLHYgMS4xNyAyMDA1LzAzLzE0IDE4OjI3OjE1IGJqZCBFeHAgJAogICoKICAqLwogCkBAIC0yOSw2ICsyOSw3IEBACiAJRkxfRVJBU0VfU1VTUEVOREVELAogCUZMX1dSSVRJTkcsCiAJRkxfV1JJVElOR19UT19CVUZGRVIsCisJRkxfT1RQX1dSSVRFLAogCUZMX1dSSVRFX1NVU1BFTkRJTkcsCiAJRkxfV1JJVEVfU1VTUEVOREVELAogCUZMX1BNX1NVU1BFTkRFRCwKQEAgLTYyLDggKzYzLDggQEAKIAlmbHN0YXRlX3Qgc3RhdGU7CiAJZmxzdGF0ZV90IG9sZHN0YXRlOwogCi0JaW50IHdyaXRlX3N1c3BlbmRlZDoxOwotCWludCBlcmFzZV9zdXNwZW5kZWQ6MTsKKwl1bnNpZ25lZCBpbnQgd3JpdGVfc3VzcGVuZGVkOjE7CisJdW5zaWduZWQgaW50IGVyYXNlX3N1c3BlbmRlZDoxOwogCXVuc2lnbmVkIGxvbmcgaW5fcHJvZ3Jlc3NfYmxvY2tfYWRkcjsKIAogCXNwaW5sb2NrX3QgKm11dGV4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvaW5mdGwuaCBiL2luY2x1ZGUvbGludXgvbXRkL2luZnRsLmgKaW5kZXggYjUyYzhjYi4uMDI2ODEyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvaW5mdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9pbmZ0bC5oCkBAIC0zLDcgKzMsNyBAQAogICoKICAqCShDKSBDb3B5cmlnaHQgMjAwMiwgR3JlZyBVbmdlcmVyIChnZXJnQHNuYXBnZWFyLmNvbSkKICAqCi0gKgkkSWQ6IGluZnRsLmgsdiAxLjYgMjAwNC8wNi8zMCAxNDo0OTowMCBkYnJvd24gRXhwICQKKyAqCSRJZDogaW5mdGwuaCx2IDEuNyAyMDA1LzA2LzEzIDEzOjA4OjQ1IHNlYW4gRXhwICQKICAqLwogCiAjaWZuZGVmIF9fTVREX0lORlRMX0hfXwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPG10ZC9pbmZ0bC11c2VyLmg+CiAKICNpZm5kZWYgSU5GVExfTUFKT1IKLSNkZWZpbmUgSU5GVExfTUFKT1IgOTQKKyNkZWZpbmUgSU5GVExfTUFKT1IgOTYKICNlbmRpZgogI2RlZmluZSBJTkZUTF9QQVJUTl9CSVRTIDQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdGQvbWFwLmggYi9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaAppbmRleCBmMDI2OGI5Li4xNDI5NjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L210ZC9tYXAuaApAQCAtMSw2ICsxLDYgQEAKIAogLyogT3ZlcmhhdWxlZCByb3V0aW5lcyBmb3IgZGVhbGluZyB3aXRoIGRpZmZlcmVudCBtbWFwIHJlZ2lvbnMgb2YgZmxhc2ggKi8KLS8qICRJZDogbWFwLmgsdiAxLjQ2IDIwMDUvMDEvMDUgMTc6MDk6NDQgZHdtdzIgRXhwICQgKi8KKy8qICRJZDogbWFwLmgsdiAxLjUyIDIwMDUvMDUvMjUgMTA6Mjk6NDEgZ2xlaXhuZXIgRXhwICQgKi8KIAogI2lmbmRlZiBfX0xJTlVYX01URF9NQVBfSF9fCiAjZGVmaW5lIF9fTElOVVhfTVREX01BUF9IX18KQEAgLTI2Myw2ICsyNjMsMTcgQEAKIAlyZXR1cm4gcjsKIH0KIAorc3RhdGljIGlubGluZSBtYXBfd29yZCBtYXBfd29yZF9jbHIoc3RydWN0IG1hcF9pbmZvICptYXAsIG1hcF93b3JkIHZhbDEsIG1hcF93b3JkIHZhbDIpCit7CisJbWFwX3dvcmQgcjsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPG1hcF93b3JkcyhtYXApOyBpKyspIHsKKwkJci54W2ldID0gdmFsMS54W2ldICYgfnZhbDIueFtpXTsKKwl9CisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBpbmxpbmUgbWFwX3dvcmQgbWFwX3dvcmRfb3Ioc3RydWN0IG1hcF9pbmZvICptYXAsIG1hcF93b3JkIHZhbDEsIG1hcF93b3JkIHZhbDIpCiB7CiAJbWFwX3dvcmQgcjsKQEAgLTI3Myw2ICsyODQsNyBAQAogCX0KIAlyZXR1cm4gcjsKIH0KKwogI2RlZmluZSBtYXBfd29yZF9hbmRlcXVhbChtLCBhLCBiLCB6KSBtYXBfd29yZF9lcXVhbChtLCB6LCBtYXBfd29yZF9hbmQobSwgYSwgYikpCiAKIHN0YXRpYyBpbmxpbmUgaW50IG1hcF93b3JkX2JpdHNzZXQoc3RydWN0IG1hcF9pbmZvICptYXAsIG1hcF93b3JkIHZhbDEsIG1hcF93b3JkIHZhbDIpCkBAIC0zMjgsMTYgKzM0MCwyNyBAQAogCXJldHVybiBvcmlnOwogfQogCisjaWYgQklUU19QRVJfTE9ORyA8IDY0CisjZGVmaW5lIE1BUF9GRl9MSU1JVCA0CisjZWxzZQorI2RlZmluZSBNQVBfRkZfTElNSVQgOAorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgbWFwX3dvcmQgbWFwX3dvcmRfZmYoc3RydWN0IG1hcF9pbmZvICptYXApCiB7CiAJbWFwX3dvcmQgcjsKIAlpbnQgaTsKLQotCWZvciAoaT0wOyBpPG1hcF93b3JkcyhtYXApOyBpKyspIHsKLQkJci54W2ldID0gfjBVTDsKKwkKKwlpZiAobWFwX2Jhbmt3aWR0aChtYXApIDwgTUFQX0ZGX0xJTUlUKSB7CisJCWludCBidyA9IDggKiBtYXBfYmFua3dpZHRoKG1hcCk7CisJCXIueFswXSA9ICgxIDw8IGJ3KSAtIDE7CisJfSBlbHNlIHsKKwkJZm9yIChpPTA7IGk8bWFwX3dvcmRzKG1hcCk7IGkrKykKKwkJCXIueFtpXSA9IH4wVUw7CiAJfQogCXJldHVybiByOwogfQorCiBzdGF0aWMgaW5saW5lIG1hcF93b3JkIGlubGluZV9tYXBfcmVhZChzdHJ1Y3QgbWFwX2luZm8gKm1hcCwgdW5zaWduZWQgbG9uZyBvZnMpCiB7CiAJbWFwX3dvcmQgcjsKQEAgLTQwNSw3ICs0MjgsNyBAQAogCiAKICNkZWZpbmUgc2ltcGxlX21hcF9pbml0KG1hcCkgQlVHX09OKCFtYXBfYmFua3dpZHRoX3N1cHBvcnRlZCgobWFwKS0+YmFua3dpZHRoKSkKLSNkZWZpbmUgbWFwX2lzX2xpbmVhcihtYXApICgxKQorI2RlZmluZSBtYXBfaXNfbGluZWFyKG1hcCkgKHsgKHZvaWQpKG1hcCk7IDE7IH0pCiAKICNlbmRpZiAvKiAhQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL210ZC5oIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKaW5kZXggYjNkMTM0My4uYzUwYzNmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvbXRkLmgKQEAgLTEsNSArMSw1IEBACiAvKiAKLSAqICRJZDogbXRkLmgsdiAxLjU2IDIwMDQvMDgvMDkgMTg6NDY6MDQgZG1hcmxpbiBFeHAgJAorICogJElkOiBtdGQuaCx2IDEuNTkgMjAwNS8wNC8xMSAxMDoxOTowMiBnbGVpeG5lciBFeHAgJAogICoKICAqIENvcHlyaWdodCAoQykgMTk5OS0yMDAzIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4gZXQgYWwuCiAgKgpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L210ZC9jb21wYXRtYWMuaD4KICNpbmNsdWRlIDxtdGQvbXRkLWFiaS5oPgpAQCAtNjksNyArNzAsNiBAQAogCiAJdV9pbnQzMl90IG9vYmJsb2NrOyAgLy8gU2l6ZSBvZiBPT0IgYmxvY2tzIChlLmcuIDUxMikKIAl1X2ludDMyX3Qgb29ic2l6ZTsgICAvLyBBbW91bnQgb2YgT09CIGRhdGEgcGVyIGJsb2NrIChlLmcuIDE2KQotCXVfaW50MzJfdCBvb2JhdmFpbDsgIC8vIE51bWJlciBvZiBieXRlcyBpbiBPT0IgYXJlYSBhdmFpbGFibGUgZm9yIGZzIAogCXVfaW50MzJfdCBlY2N0eXBlOwogCXVfaW50MzJfdCBlY2NzaXplOwogCQpAQCAtODAsNiArODAsNyBAQAogCiAJLy8gb29iaW5mbyBpcyBhIG5hbmRfb29iaW5mbyBzdHJ1Y3R1cmUsIHdoaWNoIGNhbiBiZSBzZXQgYnkgaW90Y2wgKE1FTVNFVE9PQklORk8pCiAJc3RydWN0IG5hbmRfb29iaW5mbyBvb2JpbmZvOworCXVfaW50MzJfdCBvb2JhdmFpbDsgIC8vIE51bWJlciBvZiBieXRlcyBpbiBPT0IgYXJlYSBhdmFpbGFibGUgZm9yIGZzIAogCiAJLyogRGF0YSBmb3IgdmFyaWFibGUgZXJhc2UgcmVnaW9ucy4gSWYgbnVtZXJhc2VyZWdpb25zIGlzIHplcm8sCiAJICogaXQgbWVhbnMgdGhhdCB0aGUgd2hvbGUgZGV2aWNlIGhhcyBlcmFzZXNpemUgYXMgZ2l2ZW4gYWJvdmUuIApAQCAtMTEzLDEyICsxMTQsMTIgQEAKIAkgKiBmbGFzaCBkZXZpY2VzLiBUaGUgdXNlciBkYXRhIGlzIG9uZSB0aW1lIHByb2dyYW1tYWJsZSBidXQgdGhlCiAJICogZmFjdG9yeSBkYXRhIGlzIHJlYWQgb25seS4gCiAJICovCi0JaW50ICgqcmVhZF91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOwotCisJaW50ICgqZ2V0X2ZhY3RfcHJvdF9pbmZvKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBvdHBfaW5mbyAqYnVmLCBzaXplX3QgbGVuKTsKIAlpbnQgKCpyZWFkX2ZhY3RfcHJvdF9yZWcpIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20sIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7Ci0KLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwlpbnQgKCpnZXRfdXNlcl9wcm90X2luZm8pIChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG90cF9pbmZvICpidWYsIHNpemVfdCBsZW4pOworCWludCAoKnJlYWRfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKTsKIAlpbnQgKCp3cml0ZV91c2VyX3Byb3RfcmVnKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpOworCWludCAoKmxvY2tfdXNlcl9wcm90X3JlZykgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbik7CiAKIAkvKiBrdmVjLWJhc2VkIHJlYWQvd3JpdGUgbWV0aG9kcy4gV2UgbmVlZCB0aGVzZSBlc3BlY2lhbGx5IGZvciBOQU5EIGZsYXNoLAogCSAgIHdpdGggaXRzIGxpbWl0ZWQgbnVtYmVyIG9mIHdyaXRlIGN5Y2xlcyBwZXIgZXJhc2UuCkBAIC0xNDcsNiArMTQ4LDggQEAKIAlpbnQgKCpibG9ja19pc2JhZCkgKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgb2ZzKTsKIAlpbnQgKCpibG9ja19tYXJrYmFkKSAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBvZnMpOwogCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJlYm9vdF9ub3RpZmllcjsgIC8qIGRlZmF1bHQgbW9kZSBiZWZvcmUgcmVib290ICovCisKIAl2b2lkICpwcml2OwogCiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmggYi9pbmNsdWRlL2xpbnV4L210ZC9uYW5kLmgKaW5kZXggOWExOWM2NS4uOWI1Yjc2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQvbmFuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbXRkL25hbmQuaApAQCAtNSw3ICs1LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgU3RldmVuIEouIEhpbGwgPHNqaGlsbEByZWFsaXR5ZGlsdXRlZC5jb20+CiAgKgkJICAgICAgIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgogICoKLSAqICRJZDogbmFuZC5oLHYgMS42OCAyMDA0LzExLzEyIDEwOjQwOjM3IGdsZWl4bmVyIEV4cCAkCisgKiAkSWQ6IG5hbmQuaCx2IDEuNzMgMjAwNS8wNS8zMSAxOTozOToxNyBnbGVpeG5lciBFeHAgJAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtNDgsNiArNDgsMTAgQEAKICAqICAwMi0wOC0yMDA0IHRnbHggCWFkZGVkIG9wdGlvbiBmaWVsZCB0byBuYW5kIHN0cnVjdHVyZSBmb3IgY2hpcCBhbm9tYWxpdGllcwogICogIDA1LTI1LTIwMDQgdGdseCAJYWRkZWQgYmFkIGJsb2NrIHRhYmxlIHN1cHBvcnQsIFNULU1JQ1JPIG1hbnVmYWN0dXJlciBpZAogICoJCQl1cGRhdGUgb2YgbmFuZF9jaGlwIHN0cnVjdHVyZSBkZXNjcmlwdGlvbgorICogIDAxLTE3LTIwMDUgZG1hcmxpbglhZGRlZCBleHRlbmRlZCBjb21tYW5kcyBmb3IgQUctQU5EIGRldmljZSBhbmQgYWRkZWQgb3B0aW9uIAorICogCQkJZm9yIEJCVF9BVVRPX1JFRlJFU0guCisgKiAgMDEtMjAtMjAwNSBkbWFybGluCWFkZGVkIG9wdGlvbmFsIHBvaW50ZXIgdG8gaGFyZHdhcmUgc3BlY2lmaWMgY2FsbGJhY2sgZm9yIAorICoJCQlleHRyYSBlcnJvciBzdGF0dXMgY2hlY2tzLgogICovCiAjaWZuZGVmIF9fTElOVVhfTVREX05BTkRfSAogI2RlZmluZSBfX0xJTlVYX01URF9OQU5EX0gKQEAgLTExNSw2ICsxMTksMjUgQEAKICNkZWZpbmUgTkFORF9DTURfUkVBRFNUQVJUCTB4MzAKICNkZWZpbmUgTkFORF9DTURfQ0FDSEVEUFJPRwkweDE1CiAKKy8qIEV4dGVuZGVkIGNvbW1hbmRzIGZvciBBRy1BTkQgZGV2aWNlICovCisvKiAKKyAqIE5vdGU6IHRoZSBjb21tYW5kIGZvciBOQU5EX0NNRF9ERVBMRVRFMSBpcyByZWFsbHkgMHgwMCBidXQgCisgKiAgICAgICB0aGVyZSBpcyBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggdGhhdCBmcm9tIE5BTkRfQ01EX1JFQUQwCisgKiAgICAgICB1bnRpbCB0aGUgcmVtYWluaW5nIHNlcXVlbmNlIG9mIGNvbW1hbmRzIGhhcyBiZWVuIGNvbXBsZXRlZAorICogICAgICAgc28gYWRkIGEgaGlnaCBvcmRlciBiaXQgYW5kIG1hc2sgaXQgb2ZmIGluIHRoZSBjb21tYW5kLgorICovCisjZGVmaW5lIE5BTkRfQ01EX0RFUExFVEUxCTB4MTAwCisjZGVmaW5lIE5BTkRfQ01EX0RFUExFVEUyCTB4MzgKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX01VTFRJCTB4NzEKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX0VSUk9SCTB4NzIKKy8qIG11bHRpLWJhbmsgZXJyb3Igc3RhdHVzIChiYW5rcyAwLTMpICovCisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19FUlJPUjAJMHg3MworI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfRVJST1IxCTB4NzQKKyNkZWZpbmUgTkFORF9DTURfU1RBVFVTX0VSUk9SMgkweDc1CisjZGVmaW5lIE5BTkRfQ01EX1NUQVRVU19FUlJPUjMJMHg3NgorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfUkVTRVQJMHg3ZgorI2RlZmluZSBOQU5EX0NNRF9TVEFUVVNfQ0xFQVIJMHhmZgorCiAvKiBTdGF0dXMgYml0cyAqLwogI2RlZmluZSBOQU5EX1NUQVRVU19GQUlMCTB4MDEKICNkZWZpbmUgTkFORF9TVEFUVVNfRkFJTF9OMQkweDAyCkBAIC0xNDMsNyArMTY2LDcgQEAKIAogLyoKICAqIENvbnN0YW50cyBmb3IgSGFyZHdhcmUgRUNDCi0qLworICovCiAvKiBSZXNldCBIYXJkd2FyZSBFQ0MgZm9yIHJlYWQgKi8KICNkZWZpbmUgTkFORF9FQ0NfUkVBRAkJMAogLyogUmVzZXQgSGFyZHdhcmUgRUNDIGZvciB3cml0ZSAqLwpAQCAtMTUxLDYgKzE3NCwxMCBAQAogLyogRW5hYmxlIEhhcmR3YXJlIEVDQyBiZWZvcmUgc3luZHJvbSBpcyByZWFkIGJhY2sgZnJvbSBmbGFzaCAqLwogI2RlZmluZSBOQU5EX0VDQ19SRUFEU1lOCTIKIAorLyogQml0IG1hc2sgZm9yIGZsYWdzIHBhc3NlZCB0byBkb19uYW5kX3JlYWRfZWNjICovCisjZGVmaW5lIE5BTkRfR0VUX0RFVklDRQkJMHg4MAorCisKIC8qIE9wdGlvbiBjb25zdGFudHMgZm9yIGJpemFycmUgZGlzZnVuY3Rpb25hbGl0eSBhbmQgcmVhbAogKiAgZmVhdHVyZXMKICovCkBAIC0xNzAsNiArMTk3LDEwIEBACiAvKiBDaGlwIGhhcyBhIGFycmF5IG9mIDQgcGFnZXMgd2hpY2ggY2FuIGJlIHJlYWQgd2l0aG91dAogICogYWRkaXRpb25hbCByZWFkeSAvYnVzeSB3YWl0cyAqLwogI2RlZmluZSBOQU5EXzRQQUdFX0FSUkFZCTB4MDAwMDAwNDAgCisvKiBDaGlwIHJlcXVpcmVzIHRoYXQgQkJUIGlzIHBlcmlvZGljYWxseSByZXdyaXR0ZW4gdG8gcHJldmVudAorICogYml0cyBmcm9tIGFkamFjZW50IGJsb2NrcyBmcm9tICdsZWFraW5nJyBpbiBhbHRlcmluZyBkYXRhLgorICogVGhpcyBoYXBwZW5zIHdpdGggdGhlIFJlbmVzYXMgQUctQU5EIGNoaXBzLCBwb3NzaWJseSBvdGhlcnMuICAqLworI2RlZmluZSBCQlRfQVVUT19SRUZSRVNICTB4MDAwMDAwODAKIAogLyogT3B0aW9ucyB2YWxpZCBmb3IgU2Ftc3VuZyBsYXJnZSBwYWdlIGRldmljZXMgKi8KICNkZWZpbmUgTkFORF9TQU1TVU5HX0xQX09QVElPTlMgXApAQCAtMTkyLDcgKzIyMyw4IEBACiAgKiBUaGlzIGNhbiBvbmx5IHdvcmsgaWYgd2UgaGF2ZSB0aGUgZWNjIGJ5dGVzIGRpcmVjdGx5IGJlaGluZCB0aGUgCiAgKiBkYXRhIGJ5dGVzLiBBcHBsaWVzIGZvciBET0MgYW5kIEFHLUFORCBSZW5lc2FzIEhXIFJlZWQgU29sb21vbiBnZW5lcmF0b3JzICovCiAjZGVmaW5lIE5BTkRfSFdFQ0NfU1lORFJPTUUJMHgwMDAyMDAwMAotCisvKiBUaGlzIG9wdGlvbiBza2lwcyB0aGUgYmJ0IHNjYW4gZHVyaW5nIGluaXRpYWxpemF0aW9uLiAqLworI2RlZmluZSBOQU5EX1NLSVBfQkJUU0NBTgkweDAwMDQwMDAwCiAKIC8qIE9wdGlvbnMgc2V0IGJ5IG5hbmQgc2NhbiAqLwogLyogTmFuZCBzY2FuIGhhcyBhbGxvY2F0ZWQgb29iX2J1ZiAqLwpAQCAtMjIxLDEwICsyNTMsMTMgQEAKICAqIHN0cnVjdCBuYW5kX2h3X2NvbnRyb2wgLSBDb250cm9sIHN0cnVjdHVyZSBmb3IgaGFyZHdhcmUgY29udHJvbGxlciAoZS5nIEVDQyBnZW5lcmF0b3IpIHNoYXJlZCBhbW9uZyBpbmRlcGVuZGVuZCBkZXZpY2VzCiAgKiBAbG9jazogICAgICAgICAgICAgICBwcm90ZWN0aW9uIGxvY2sgIAogICogQGFjdGl2ZToJCXRoZSBtdGQgZGV2aWNlIHdoaWNoIGhvbGRzIHRoZSBjb250cm9sbGVyIGN1cnJlbnRseQorICogQHdxOgkJCXdhaXQgcXVldWUgdG8gc2xlZXAgb24gaWYgYSBOQU5EIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcworICogICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwZXIgY2hpcCB3YWl0IHF1ZXVlIHdoZW4gYSBodyBjb250cm9sbGVyIGlzIGF2YWlsYWJsZQogICovCiBzdHJ1Y3QgbmFuZF9od19jb250cm9sIHsKIAlzcGlubG9ja190CSBsb2NrOwogCXN0cnVjdCBuYW5kX2NoaXAgKmFjdGl2ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKIH07CiAKIC8qKgpAQCAtMjgzLDYgKzMxOCw4IEBACiAgKiBAYmFkYmxvY2tfcGF0dGVybjoJW1JFUExBQ0VBQkxFXSBiYWQgYmxvY2sgc2NhbiBwYXR0ZXJuIHVzZWQgZm9yIGluaXRpYWwgYmFkIGJsb2NrIHNjYW4gCiAgKiBAY29udHJvbGxlcjoJCVtPUFRJT05BTF0gYSBwb2ludGVyIHRvIGEgaGFyZHdhcmUgY29udHJvbGxlciBzdHJ1Y3R1cmUgd2hpY2ggaXMgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluZGVwZW5kZW5kIGRldmljZXMKICAqIEBwcml2OgkJW09QVElPTkFMXSBwb2ludGVyIHRvIHByaXZhdGUgY2hpcCBkYXRlCisgKiBAZXJyc3RhdDoJCVtPUFRJT05BTF0gaGFyZHdhcmUgc3BlY2lmaWMgZnVuY3Rpb24gdG8gcGVyZm9ybSBhZGRpdGlvbmFsIGVycm9yIHN0YXR1cyBjaGVja3MgCisgKgkJCShkZXRlcm1pbmUgaWYgZXJyb3JzIGFyZSBjb3JyZWN0YWJsZSkKICAqLwogIAogc3RydWN0IG5hbmRfY2hpcCB7CkBAIC0zMzgsNiArMzc1LDcgQEAKIAlzdHJ1Y3QgbmFuZF9iYnRfZGVzY3IJKmJhZGJsb2NrX3BhdHRlcm47CiAJc3RydWN0IG5hbmRfaHdfY29udHJvbCAgKmNvbnRyb2xsZXI7CiAJdm9pZAkJKnByaXY7CisJaW50CQkoKmVycnN0YXQpKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLCBpbnQgc3RhdGUsIGludCBzdGF0dXMsIGludCBwYWdlKTsKIH07CiAKIC8qCkBAIC0zNDksNiArMzg3LDcgQEAKICNkZWZpbmUgTkFORF9NRlJfTkFUSU9OQUwJMHg4ZgogI2RlZmluZSBOQU5EX01GUl9SRU5FU0FTCTB4MDcKICNkZWZpbmUgTkFORF9NRlJfU1RNSUNSTwkweDIwCisjZGVmaW5lIE5BTkRfTUZSX0hZTklYICAgICAgICAgIDB4YWQKIAogLyoqCiAgKiBzdHJ1Y3QgbmFuZF9mbGFzaF9kZXYgLSBOQU5EIEZsYXNoIERldmljZSBJRCBTdHJ1Y3R1cmUKQEAgLTQ1OSw2ICs0OTgsOSBAQAogZXh0ZXJuIGludCBuYW5kX2RlZmF1bHRfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCk7CiBleHRlcm4gaW50IG5hbmRfaXNiYWRfYmJ0IChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IG9mZnMsIGludCBhbGxvd2JidCk7CiBleHRlcm4gaW50IG5hbmRfZXJhc2VfbmFuZCAoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBlcmFzZV9pbmZvICppbnN0ciwgaW50IGFsbG93YmJ0KTsKK2V4dGVybiBpbnQgbmFuZF9kb19yZWFkX2VjYyAoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiByZXRsZW4sIHVfY2hhciAqIGJ1ZiwgdV9jaGFyICogb29iX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5hbmRfb29iaW5mbyAqb29ic2VsLCBpbnQgZmxhZ3MpOwogCiAvKgogKiBDb25zdGFudHMgZm9yIG9vYiBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L210ZC9wbGF0LXJhbS5oIGIvaW5jbHVkZS9saW51eC9tdGQvcGxhdC1yYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzMyZWRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tdGQvcGxhdC1yYW0uaApAQCAtMCwwICsxLDM1IEBACisvKiBsaW51eC9pbmNsdWRlL210ZC9wbGF0LXJhbS5oCisgKgorICogKGMpIDIwMDQgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglodHRwOi8vd3d3LnNpbXRlYy5jby51ay9wcm9kdWN0cy9TV0xJTlVYLworICoJQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPgorICoKKyAqIEdlbmVyaWMgcGxhdGZvcm0gZGV2aWNlIGJhc2VkIFJBTSBtYXAKKyAqCisgKiAkSWQ6IHBsYXQtcmFtLmgsdiAxLjIgMjAwNS8wMS8yNCAwMDozNzo0MCBiamQgRXhwICQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTVREX1BMQVRSQU1fSAorI2RlZmluZSBfX0xJTlVYX01URF9QTEFUUkFNX0ggX19GSUxFX18KKworI2RlZmluZSBQTEFUUkFNX1JPICgwKQorI2RlZmluZSBQTEFUUkFNX1JXICgxKQorCitzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSB7CisJY2hhcgkJCSptYXBuYW1lOworCWNoYXIJCSAgICAgICAqKnByb2JlczsKKwlzdHJ1Y3QgbXRkX3BhcnRpdGlvbgkqcGFydGl0aW9uczsKKwlpbnQJCQkgbnJfcGFydGl0aW9uczsKKwlpbnQJCQkgYmFua3dpZHRoOworCisJLyogY29udHJvbCBjYWxsYmFja3MgKi8KKworCXZvaWQJKCpzZXRfcncpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHRvKTsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX01URF9QTEFUUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXRkL3hpcC5oIGIvaW5jbHVkZS9saW51eC9tdGQveGlwLmgKaW5kZXggZmMwNzExMi4uN2I3ZGVlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tdGQveGlwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tdGQveGlwLmgKQEAgLTU4LDIyICs1OCwxNiBAQAogICogCQlyZXR1cm5lZCB2YWx1ZSBpcyA8PSB0aGUgcmVhbCBlbGFwc2VkIHRpbWUuCiAgKiAJbm90ZSAyOiB0aGlzIHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aCBhIGZldyBzZWNvbmRzIHdpdGhvdXQKICAqIAkJb3ZlcmZsb3dpbmcuCisgKgorICogeGlwX2lwcmVmZXRjaCgpCisgKiAgCisgKiAgICAgIE1hY3JvIHRvIGZpbGwgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2gKKyAqCWUuZy4gYSBzZXJpZXMgb2Ygbm9wczogIGFzbSB2b2xhdGlsZSAoIi5yZXAgODsgbm9wOyAuZW5kciIpOyAKICAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TQTExMDApIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfUFhBKQorI2luY2x1ZGUgPGFzbS9tdGQteGlwLmg+CiAKLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpZmRlZiBDT05GSUdfQVJDSF9QWEEKLSNpbmNsdWRlIDxhc20vYXJjaC9weGEtcmVncy5oPgotI2VuZGlmCi0KLSNkZWZpbmUgeGlwX2lycXBlbmRpbmcoKQkoSUNJUCAmIElDTVIpCi0KLS8qIHdlIHNhbXBsZSBPU0NSIGFuZCBjb252ZXJ0IGRlc2lyZWQgZGVsdGEgdG8gdXNlYyAoMS80IH49IDEwMDAwMDAvMzY4NjQwMCkgKi8KLSNkZWZpbmUgeGlwX2N1cnJ0aW1lKCkJCShPU0NSKQotI2RlZmluZSB4aXBfZWxhcHNlZF9zaW5jZSh4KQkoc2lnbmVkKSgoT1NDUiAtICh4KSkgLyA0KQotCi0jZWxzZQorI2lmbmRlZiB4aXBfaXJxcGVuZGluZwogCiAjd2FybmluZyAibWlzc2luZyBJUlEgYW5kIHRpbWVyIHByaW1pdGl2ZXMgZm9yIFhJUCBNVEQgc3VwcG9ydCIKICN3YXJuaW5nICJzb21lIG9mIHRoZSBYSVAgTVREIHN1cHBvcnQgY29kZSB3aWxsIGJlIGRpc2FibGVkIgpAQCAtODUsMTYgKzc5LDE3IEBACiAKICNlbmRpZgogCisjaWZuZGVmIHhpcF9pcHJlZmV0Y2gKKyNkZWZpbmUgeGlwX2lwcmVmZXRjaCgpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwogLyoKICAqIHhpcF9jcHVfaWRsZSgpIGlzIHVzZWQgd2hlbiB3YWl0aW5nIGZvciBhIGRlbGF5IGVxdWFsIG9yIGxhcmdlciB0aGFuCiAgKiB0aGUgc3lzdGVtIHRpbWVyIHRpY2sgcGVyaW9kLiAgVGhpcyBzaG91bGQgcHV0IHRoZSBDUFUgaW50byBpZGxlIG1vZGUKICAqIHRvIHNhdmUgcG93ZXIgYW5kIHRvIGJlIHdva2VuIHVwIG9ubHkgd2hlbiBzb21lIGludGVycnVwdHMgYXJlIHBlbmRpbmcuCi0gKiBBcyBhYm92ZSwgdGhpcyBzaG91bGQgbm90IHJlbHkgdXBvbiBzdGFuZGFyZCBrZXJuZWwgY29kZS4KKyAqIFRoaXMgc2hvdWxkIG5vdCByZWx5IHVwb24gc3RhbmRhcmQga2VybmVsIGNvZGUuCiAgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9YU0NBTEUpCi0jZGVmaW5lIHhpcF9jcHVfaWRsZSgpICBhc20gdm9sYXRpbGUgKCJtY3IgcDE0LCAwLCAlMCwgYzcsIGMwLCAwIiA6OiAiciIgKDEpKQotI2Vsc2UKKyNpZm5kZWYgeGlwX2NwdV9pZGxlCiAjZGVmaW5lIHhpcF9jcHVfaWRsZSgpICBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvbmFtZXNwYWNlLmgKaW5kZXggOWVjYTE1NS4uMGU1YTg2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25hbWVzcGFjZS5oCkBAIC0xMiwxMyArMTIsMTMgQEAKIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlbTsKIH07CiAKLWV4dGVybiB2b2lkIHVtb3VudF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqKTsKIGV4dGVybiBpbnQgY29weV9uYW1lc3BhY2UoaW50LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gdm9pZCBfX3B1dF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHB1dF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKQogewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZuYW1lc3BhY2UtPmNvdW50KSkKKwlpZiAoYXRvbWljX2RlY19hbmRfbG9jaygmbmFtZXNwYWNlLT5jb3VudCwgJnZmc21vdW50X2xvY2spKQorCQkvKiByZWxlYXNlcyB2ZnNtb3VudF9sb2NrICovCiAJCV9fcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCBkODk4MTZhLi4zYTBlZDdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTE2NCwxMiArMTY0LDYgQEAKIAl1bnNpZ25lZCB0b3RhbDsKIAl1bnNpZ25lZCBkcm9wcGVkOwogCXVuc2lnbmVkIHRpbWVfc3F1ZWV6ZTsKLQl1bnNpZ25lZCB0aHJvdHRsZWQ7Ci0JdW5zaWduZWQgZmFzdHJvdXRlX2hpdDsKLQl1bnNpZ25lZCBmYXN0cm91dGVfc3VjY2VzczsKLQl1bnNpZ25lZCBmYXN0cm91dGVfZGVmZXI7Ci0JdW5zaWduZWQgZmFzdHJvdXRlX2RlZmVycmVkX291dDsKLQl1bnNpZ25lZCBmYXN0cm91dGVfbGF0ZW5jeV9yZWR1Y3Rpb247CiAJdW5zaWduZWQgY3B1X2NvbGxpc2lvbjsKIH07CiAKQEAgLTU2MiwxMiArNTU2LDkgQEAKIAogc3RydWN0IHNvZnRuZXRfZGF0YQogewotCWludAkJCXRocm90dGxlOwotCWludAkJCWNuZ19sZXZlbDsKLQlpbnQJCQlhdmdfYmxvZzsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqb3V0cHV0X3F1ZXVlOwogCXN0cnVjdCBza19idWZmX2hlYWQJaW5wdXRfcGt0X3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQJcG9sbF9saXN0OwotCXN0cnVjdCBuZXRfZGV2aWNlCSpvdXRwdXRfcXVldWU7CiAJc3RydWN0IHNrX2J1ZmYJCSpjb21wbGV0aW9uX3F1ZXVlOwogCiAJc3RydWN0IG5ldF9kZXZpY2UJYmFja2xvZ19kZXY7CS8qIFNvcnJ5LiA4KSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAppbmRleCAzMDI5Y2FkLi4yZjBjMDg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZSBORVRMSU5LX0FVRElUCQk5CS8qIGF1ZGl0aW5nICovCiAjZGVmaW5lIE5FVExJTktfRklCX0xPT0tVUAkxMAkKICNkZWZpbmUgTkVUTElOS19ST1VURTYJCTExCS8qIGFmX2luZXQ2IHJvdXRlIGNvbW0gY2hhbm5lbCAqLworI2RlZmluZSBORVRMSU5LX05FVEZJTFRFUgkxMgkvKiBuZXRmaWx0ZXIgc3Vic3lzdGVtICovCiAjZGVmaW5lIE5FVExJTktfSVA2X0ZXCQkxMwogI2RlZmluZSBORVRMSU5LX0ROUlRNU0cJCTE0CS8qIERFQ25ldCByb3V0aW5nIG1lc3NhZ2VzICovCiAjZGVmaW5lIE5FVExJTktfS09CSkVDVF9VRVZFTlQJMTUJLyogS2VybmVsIG1lc3NhZ2VzIHRvIHVzZXJzcGFjZSAqLwpAQCAtMTY4LDYgKzE2OSw3IEBACiAJbmxoLT5ubG1zZ19mbGFncyA9IGZsYWdzOwogCW5saC0+bmxtc2dfcGlkID0gcGlkOwogCW5saC0+bmxtc2dfc2VxID0gc2VxOworCW1lbXNldChOTE1TR19EQVRBKG5saCkgKyBsZW4sIDAsIE5MTVNHX0FMSUdOKHNpemUpIC0gc2l6ZSk7CiAJcmV0dXJuIG5saDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCA1YmI1YjJmLi4wYzFjMzA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtMjgsNyArMjgsNyBAQAogI2RlZmluZSBORlM0X0FDQ0VTU19ERUxFVEUgICAgICAweDAwMTAKICNkZWZpbmUgTkZTNF9BQ0NFU1NfRVhFQ1VURSAgICAgMHgwMDIwCiAKLSNkZWZpbmUgTkZTNF9GSF9QRVJJU1RFTlQJCTB4MDAwMAorI2RlZmluZSBORlM0X0ZIX1BFUlNJU1RFTlQJCTB4MDAwMAogI2RlZmluZSBORlM0X0ZIX05PRVhQSVJFX1dJVEhfT1BFTgkweDAwMDEKICNkZWZpbmUgTkZTNF9GSF9WT0xBVElMRV9BTlkJCTB4MDAwMgogI2RlZmluZSBORlM0X0ZIX1ZPTF9NSUdSQVRJT04JCTB4MDAwNApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaCBiL2luY2x1ZGUvbGludXgvbmZzZC9uZnNkLmgKaW5kZXggNGJmOTMxZC4uNmQ1YTI0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QvbmZzZC5oCkBAIC0xMjQsNiArMTI0LDcgQEAKIAogaW50CQluZnNkX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBpYXR0ciAqKTsKIGludAkJbmZzZF9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfZXhwb3J0ICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK3ZvaWQJCW5mc2Rfc3luY19kaXIoc3RydWN0IGRlbnRyeSAqZHApOwogCiAjaWYgZGVmaW5lZChDT05GSUdfTkZTRF9WMl9BQ0wpIHx8IGRlZmluZWQoQ09ORklHX05GU0RfVjNfQUNMKQogI2lmZGVmIENPTkZJR19ORlNEX1YyX0FDTApAQCAtMTQ1LDE1ICsxNDYsMTkgQEAKICAqIE5GU3Y0IFN0YXRlCiAgKi8KICNpZmRlZiBDT05GSUdfTkZTRF9WNAotaW50IG5mczRfc3RhdGVfaW5pdCh2b2lkKTsKK3ZvaWQgbmZzNF9zdGF0ZV9pbml0KHZvaWQpOworaW50IG5mczRfc3RhdGVfc3RhcnQodm9pZCk7CiB2b2lkIG5mczRfc3RhdGVfc2h1dGRvd24odm9pZCk7CiB0aW1lX3QgbmZzNF9sZWFzZV90aW1lKHZvaWQpOwogdm9pZCBuZnM0X3Jlc2V0X2xlYXNlKHRpbWVfdCBsZWFzZXRpbWUpOworaW50IG5mczRfcmVzZXRfcmVjb3ZlcnlkaXIoY2hhciAqcmVjZGlyKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBuZnM0X3N0YXRlX2luaXQodm9pZCl7cmV0dXJuIDA7fQorc3RhdGljIGlubGluZSB2b2lkIG5mczRfc3RhdGVfaW5pdCh2b2lkKXt9Oworc3RhdGljIGlubGluZSBpbnQgbmZzNF9zdGF0ZV9zdGFydCh2b2lkKXtyZXR1cm4gMDt9CiBzdGF0aWMgaW5saW5lIHZvaWQgbmZzNF9zdGF0ZV9zaHV0ZG93bih2b2lkKXt9CiBzdGF0aWMgaW5saW5lIHRpbWVfdCBuZnM0X2xlYXNlX3RpbWUodm9pZCl7cmV0dXJuIDA7fQogc3RhdGljIGlubGluZSB2b2lkIG5mczRfcmVzZXRfbGVhc2UodGltZV90IGxlYXNldGltZSl7fQorc3RhdGljIGlubGluZSBpbnQgbmZzNF9yZXNldF9yZWNvdmVyeWRpcihjaGFyICpyZWNkaXIpIHtyZXR1cm4gMDt9CiAjZW5kaWYKIAogLyoKQEAgLTIyNiw2ICsyMzEsNyBAQAogI2RlZmluZQluZnNlcnJfcmVjbGFpbV9iYWQJX19jb25zdGFudF9odG9ubChORlNFUlJfUkVDTEFJTV9CQUQpCiAjZGVmaW5lCW5mc2Vycl9iYWRuYW1lCQlfX2NvbnN0YW50X2h0b25sKE5GU0VSUl9CQUROQU1FKQogI2RlZmluZQluZnNlcnJfY2JfcGF0aF9kb3duCV9fY29uc3RhbnRfaHRvbmwoTkZTRVJSX0NCX1BBVEhfRE9XTikKKyNkZWZpbmUJbmZzZXJyX2xvY2tlZAkJX19jb25zdGFudF9odG9ubChORlNFUlJfTE9DS0VEKQogCiAvKiBlcnJvciBjb2RlcyBmb3IgaW50ZXJuYWwgdXNlICovCiAvKiBpZiBhIHJlcXVlc3QgZmFpbHMgZHVlIHRvIGttYWxsb2MgZmFpbHVyZSwgaXQgZ2V0cyBkcm9wcGVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3N0YXRlLmggYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAppbmRleCBiNmIyZmUxLi44YmYyM2NmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2Qvc3RhdGUuaApAQCAtNjEsMTEgKzYxLDYgQEAKICNkZWZpbmUgc2lfc3RhdGVvd25lcmlkICAgc2lfb3BhcXVlLnNvX3N0YXRlb3duZXJpZAogI2RlZmluZSBzaV9maWxlaWQgICAgICAgICBzaV9vcGFxdWUuc29fZmlsZWlkCiAKLWV4dGVybiBzdGF0ZWlkX3QgemVyb3N0YXRlaWQ7Ci1leHRlcm4gc3RhdGVpZF90IG9uZXN0YXRlaWQ7Ci0KLSNkZWZpbmUgWkVST19TVEFURUlEKHN0YXRlaWQpICAgICAgICghbWVtY21wKChzdGF0ZWlkKSwgJnplcm9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSkpCi0jZGVmaW5lIE9ORV9TVEFURUlEKHN0YXRlaWQpICAgICAgICAoIW1lbWNtcCgoc3RhdGVpZCksICZvbmVzdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSkpCiAKIHN0cnVjdCBuZnM0X2NiX3JlY2FsbCB7CiAJdTMyCQkJY2JyX2lkZW50OwpAQCAtNzcsOCArNzIsOCBAQAogfTsKIAogc3RydWN0IG5mczRfZGVsZWdhdGlvbiB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlkbF9kZWxfcGVyZmlsZTsgLyogbmZzNF9maWxlLT5maV9kZWxfcGVyZmlsZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZGxfZGVsX3BlcmNsbnQ7IC8qIG5mczRfY2xpZW50LT5jbF9kZWxfcGVyY2xudCovCisJc3RydWN0IGxpc3RfaGVhZAlkbF9wZXJmaWxlOworCXN0cnVjdCBsaXN0X2hlYWQJZGxfcGVyY2xudDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRsX3JlY2FsbF9scnU7ICAvKiBkZWxlZ2F0aW9uIHJlY2FsbGVkICovCiAJYXRvbWljX3QJCWRsX2NvdW50OyAgICAgICAvKiByZWYgY291bnQgKi8KIAlzdHJ1Y3QgbmZzNF9jbGllbnQJKmRsX2NsaWVudDsKQEAgLTk3LDcgKzkyLDYgQEAKIC8qIGNsaWVudCBkZWxlZ2F0aW9uIGNhbGxiYWNrIGluZm8gKi8KIHN0cnVjdCBuZnM0X2NhbGxiYWNrIHsKIAkvKiBTRVRDTElFTlRJRCBpbmZvICovCi0JdTMyCQkJY2JfcGFyc2VkOyAgLyogYWRkciBwYXJzZWQgKi8KIAl1MzIgICAgICAgICAgICAgICAgICAgICBjYl9hZGRyOwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGNiX3BvcnQ7CiAJdTMyICAgICAgICAgICAgICAgICAgICAgY2JfcHJvZzsKQEAgLTEwOSw2ICsxMDMsOCBAQAogCXN0cnVjdCBycGNfY2xudCAqICAgICAgIGNiX2NsaWVudDsKIH07CiAKKyNkZWZpbmUgSEVYRElSX0xFTiAgICAgMzMgLyogaGV4IHZlcnNpb24gb2YgMTYgYnl0ZSBtZDUgb2YgY2xfbmFtZSBwbHVzICdcMCcgKi8KKwogLyoKICAqIHN0cnVjdCBuZnM0X2NsaWVudCAtIG9uZSBwZXIgY2xpZW50LiAgQ2xpZW50aWRzIGxpdmUgaGVyZS4KICAqIAlvIEVhY2ggbmZzNF9jbGllbnQgaXMgaGFzaGVkIGJ5IGNsaWVudGlkLgpAQCAtMTIyLDEwICsxMTgsMTEgQEAKIHN0cnVjdCBuZnM0X2NsaWVudCB7CiAJc3RydWN0IGxpc3RfaGVhZAljbF9pZGhhc2g7IAkvKiBoYXNoIGJ5IGNsX2NsaWVudGlkLmlkICovCiAJc3RydWN0IGxpc3RfaGVhZAljbF9zdHJoYXNoOyAJLyogaGFzaCBieSBjbF9uYW1lICovCi0Jc3RydWN0IGxpc3RfaGVhZAljbF9wZXJjbGllbnQ7IAkvKiBsaXN0OiBzdGF0ZW93bmVycyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJY2xfZGVsX3BlcmNsbnQ7IC8qIGxpc3Q6IGRlbGVnYXRpb25zICovCisJc3RydWN0IGxpc3RfaGVhZAljbF9vcGVub3duZXJzOworCXN0cnVjdCBsaXN0X2hlYWQJY2xfZGVsZWdhdGlvbnM7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgY2xfbHJ1OyAgICAgICAgIC8qIHRhaWwgcXVldWUgKi8KIAlzdHJ1Y3QgeGRyX25ldG9iagljbF9uYW1lOyAJLyogaWQgZ2VuZXJhdGVkIGJ5IGNsaWVudCAqLworCWNoYXIgICAgICAgICAgICAgICAgICAgIGNsX3JlY2RpcltIRVhESVJfTEVOXTsgLyogcmVjb3ZlcnkgZGlyICovCiAJbmZzNF92ZXJpZmllcgkJY2xfdmVyaWZpZXI7IAkvKiBnZW5lcmF0ZWQgYnkgY2xpZW50ICovCiAJdGltZV90ICAgICAgICAgICAgICAgICAgY2xfdGltZTsgICAgICAgIC8qIHRpbWUgb2YgbGFzdCBsZWFzZSByZW5ld2FsICovCiAJdTMyCQkJY2xfYWRkcjsgCS8qIGNsaWVudCBpcGFkZHJlc3MgKi8KQEAgLTEzNCw2ICsxMzEsNyBAQAogCW5mczRfdmVyaWZpZXIJCWNsX2NvbmZpcm07CS8qIGdlbmVyYXRlZCBieSBzZXJ2ZXIgKi8KIAlzdHJ1Y3QgbmZzNF9jYWxsYmFjawljbF9jYWxsYmFjazsgICAgLyogY2FsbGJhY2sgaW5mbyAqLwogCWF0b21pY190CQljbF9jb3VudDsJLyogcmVmIGNvdW50ICovCisJdTMyCQkJY2xfZmlyc3RzdGF0ZTsJLyogcmVjb3ZlcnkgZGlyIGNyZWF0aW9uICovCiB9OwogCiAvKiBzdHJ1Y3QgbmZzNF9jbGllbnRfcmVzZXQKQEAgLTE0Myw3ICsxNDEsNyBAQAogICovCiBzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSB7CiAJc3RydWN0IGxpc3RfaGVhZAljcl9zdHJoYXNoOwkvKiBoYXNoIGJ5IGNyX25hbWUgKi8KLQlzdHJ1Y3QgeGRyX25ldG9iaiAJY3JfbmFtZTsgCS8qIGlkIGdlbmVyYXRlZCBieSBjbGllbnQgKi8KKwljaGFyCQkJY3JfcmVjZGlyW0hFWERJUl9MRU5dOyAvKiByZWNvdmVyIGRpciAqLwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC0xOTcsMTUgKzE5NSwxNyBAQAogCXN0cnVjdCBrcmVmCQlzb19yZWY7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgc29faWRoYXNoOyAgIC8qIGhhc2ggYnkgc29faWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBzb19zdHJoYXNoOyAgIC8qIGhhc2ggYnkgb3BfbmFtZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHNvX3BlcmNsaWVudDsgLyogbmZzNF9jbGllbnQtPmNsX3BlcmNsaWVudCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHNvX3BlcmZpbGVzdGF0ZTsgLyogbGlzdDogbmZzNF9zdGF0ZWlkICovCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgc29fcGVybG9ja293bmVyOyAvKiBuZnM0X3N0YXRlaWQtPnN0X3BlcmxvY2tvd25lciAqLworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHNvX3BlcmNsaWVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBzb19zdGF0ZWlkczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBzb19wZXJzdGF0ZWlkOyAvKiBmb3IgbG9ja293bmVycyBvbmx5ICovCiAJc3RydWN0IGxpc3RfaGVhZAlzb19jbG9zZV9scnU7IC8qIHRhaWwgcXVldWUgKi8KIAl0aW1lX3QJCQlzb190aW1lOyAvKiB0aW1lIG9mIHBsYWNlbWVudCBvbiBzb19jbG9zZV9scnUgKi8KIAlpbnQJCQlzb19pc19vcGVuX293bmVyOyAvKiAxPW9wZW5vd25lciwwPWxvY2tvd25lciAqLwogCXUzMiAgICAgICAgICAgICAgICAgICAgIHNvX2lkOwogCXN0cnVjdCBuZnM0X2NsaWVudCAqICAgIHNvX2NsaWVudDsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBzb19zZXFpZDsgICAgCisJLyogYWZ0ZXIgaW5jcmVtZW50IGluIEVOQ09ERV9TRVFJRF9PUF9UQUlMLCByZXByZXNlbnRzIHRoZSBuZXh0CisJICogc2VxdWVuY2UgaWQgZXhwZWN0ZWQgZnJvbSB0aGUgY2xpZW50OiAqLworCXUzMiAgICAgICAgICAgICAgICAgICAgIHNvX3NlcWlkOwogCXN0cnVjdCB4ZHJfbmV0b2JqICAgICAgIHNvX293bmVyOyAgICAgLyogb3BlbiBvd25lciBuYW1lICovCiAJaW50ICAgICAgICAgICAgICAgICAgICAgc29fY29uZmlybWVkOyAvKiBzdWNjZXNzZnVsIE9QRU5fQ09ORklSTT8gKi8KIAlzdHJ1Y3QgbmZzNF9yZXBsYXkJc29fcmVwbGF5OwpAQCAtMjE3LDkgKzIxNywxMCBAQAogKiAgICAgIHNoYXJlX2FjY2VzLCBzaGFyZV9kZW55IG9uIHRoZSBmaWxlLgogKi8KIHN0cnVjdCBuZnM0X2ZpbGUgeworCXN0cnVjdCBrcmVmCQlmaV9yZWY7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgZmlfaGFzaDsgICAgLyogaGFzaCBieSAic3RydWN0IGlub2RlICoiICovCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgZmlfcGVyZmlsZTsgLyogbGlzdDogbmZzNF9zdGF0ZWlkICovCi0Jc3RydWN0IGxpc3RfaGVhZAlmaV9kZWxfcGVyZmlsZTsgLyogbGlzdDogbmZzNF9kZWxlZ2F0aW9uICovCisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgZmlfc3RhdGVpZHM7CisJc3RydWN0IGxpc3RfaGVhZAlmaV9kZWxlZ2F0aW9uczsKIAlzdHJ1Y3QgaW5vZGUJCSpmaV9pbm9kZTsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBmaV9pZDsgICAgICAvKiB1c2VkIHdpdGggc3RhdGVvd25lci0+c29faWQgCiAJCQkJCSAgICAgKiBmb3Igc3RhdGVpZF9oYXNodGJsIGhhc2ggKi8KQEAgLTIzNiwxOSArMjM3LDI0IEBACiAqICAgICAgIHN0X3BlcmxvY2tvd25lcjogKG9wZW4gc3RhdGVpZCkgbGlzdCBvZiBsb2NrIG5mczRfc3RhdGVvd25lcnMKICogCXN0X2FjY2Vzc19ibWFwOiB1c2VkIG9ubHkgZm9yIG9wZW4gc3RhdGVpZAogKiAJc3RfZGVueV9ibWFwOiB1c2VkIG9ubHkgZm9yIG9wZW4gc3RhdGVpZAorKglzdF9vcGVuc3RwOiBvcGVuIHN0YXRlaWQgbG9jayBzdGF0ZWlkIHdhcyBkZXJpdmVkIGZyb20KKyoKKyogWFhYOiBvcGVuIHN0YXRlaWRzIGFuZCBsb2NrIHN0YXRlaWRzIGhhdmUgZGl2ZXJnZWQgc3VmZmljaWVudGx5IHRoYXQKKyogd2Ugc2hvdWxkIGNvbnNpZGVyIGRlZmluaW5nIHNlcGFyYXRlIHN0cnVjdHMgZm9yIHRoZSB0d28gY2FzZXMuCiAqLwogCiBzdHJ1Y3QgbmZzNF9zdGF0ZWlkIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICBzdF9oYXNoOyAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgICBzdF9wZXJmaWxlOwotCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgIHN0X3BlcmZpbGVzdGF0ZTsgCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgc3RfcGVybG9ja293bmVyOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgIHN0X3BlcnN0YXRlb3duZXI7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgc3RfbG9ja293bmVyczsKIAlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICAgICAgKiBzdF9zdGF0ZW93bmVyOwogCXN0cnVjdCBuZnM0X2ZpbGUgICAgICAgICAgICAqIHN0X2ZpbGU7CiAJc3RhdGVpZF90ICAgICAgICAgICAgICAgICAgICAgc3Rfc3RhdGVpZDsKIAlzdHJ1Y3QgZmlsZSAgICAgICAgICAgICAgICAgKiBzdF92ZnNfZmlsZTsKIAl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICBzdF9hY2Nlc3NfYm1hcDsKIAl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgICBzdF9kZW55X2JtYXA7CisJc3RydWN0IG5mczRfc3RhdGVpZCAgICAgICAgICogc3Rfb3BlbnN0cDsKIH07CiAKIC8qIGZsYWdzIGZvciBwcmVwcm9jZXNzX3NlcWlkX29wKCkgKi8KQEAgLTI2NywxMiArMjczLDkgQEAKIAkoKGVycikgIT0gbmZzZXJyX3N0YWxlX3N0YXRlaWQpICYmICAgICAgXAogCSgoZXJyKSAhPSBuZnNlcnJfYmFkX3N0YXRlaWQpKQogCi1leHRlcm4gdGltZV90IG5mczRfbGF1bmRyb21hdCh2b2lkKTsKIGV4dGVybiBpbnQgbmZzZDRfcmVuZXcoY2xpZW50aWRfdCAqY2xpZCk7CiBleHRlcm4gaW50IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIAogCQlzdGF0ZWlkX3QgKnN0YXRlaWQsIGludCBmbGFncywgc3RydWN0IGZpbGUgKipmaWxwKTsKLWV4dGVybiBpbnQgbmZzNF9zaGFyZV9jb25mbGljdChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCAKLQkJdW5zaWduZWQgaW50IGRlbnlfdHlwZSk7CiBleHRlcm4gdm9pZCBuZnM0X2xvY2tfc3RhdGUodm9pZCk7CiBleHRlcm4gdm9pZCBuZnM0X3VubG9ja19zdGF0ZSh2b2lkKTsKIGV4dGVybiBpbnQgbmZzNF9pbl9ncmFjZSh2b2lkKTsKQEAgLTI4Miw2ICsyODUsMTUgQEAKIGV4dGVybiB2b2lkIG5mc2Q0X3Byb2JlX2NhbGxiYWNrKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKTsKIGV4dGVybiB2b2lkIG5mc2Q0X2NiX3JlY2FsbChzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCk7CiBleHRlcm4gdm9pZCBuZnM0X3B1dF9kZWxlZ2F0aW9uKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwKTsKK2V4dGVybiBpbnQgbmZzNF9tYWtlX3JlY19jbGlkbmFtZShjaGFyICpjbGlkbmFtZSwgc3RydWN0IHhkcl9uZXRvYmogKmNsbmFtZSk7CitleHRlcm4gdm9pZCBuZnNkNF9pbml0X3JlY2RpcihjaGFyICpyZWNkaXJfbmFtZSk7CitleHRlcm4gaW50IG5mc2Q0X3JlY2Rpcl9sb2FkKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZzZDRfc2h1dGRvd25fcmVjZGlyKHZvaWQpOworZXh0ZXJuIGludCBuZnM0X2NsaWVudF90b19yZWNsYWltKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBuZnM0X2hhc19yZWNsYWltZWRfc3RhdGUoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBuZnNkNF9yZWNkaXJfcHVyZ2Vfb2xkKHZvaWQpOworZXh0ZXJuIGludCBuZnNkNF9jcmVhdGVfY2xpZF9kaXIoc3RydWN0IG5mczRfY2xpZW50ICpjbHApOworZXh0ZXJuIHZvaWQgbmZzZDRfcmVtb3ZlX2NsaWRfZGlyKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKTsKIAogc3RhdGljIGlubGluZSB2b2lkCiBuZnM0X3B1dF9zdGF0ZW93bmVyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaCBiL2luY2x1ZGUvbGludXgvbmZzZC94ZHI0LmgKaW5kZXggYTFmNWFkMC4uNGQyNGQ2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL3hkcjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2QveGRyNC5oCkBAIC0yMTAsNiArMjEwLDcgQEAKIAl1MzIJCW9wX3NoYXJlX2FjY2VzczsgICAgLyogcmVxdWVzdCAqLwogCXUzMgkJb3Bfc2hhcmVfZGVueTsgICAgICAvKiByZXF1ZXN0ICovCiAJc3RhdGVpZF90CW9wX3N0YXRlaWQ7ICAgICAgICAgLyogcmVzcG9uc2UgKi8KKwl1MzIJCW9wX3JlY2FsbDsgICAgICAgICAgLyogcmVjYWxsICovCiAJc3RydWN0IG5mc2Q0X2NoYW5nZV9pbmZvICBvcF9jaW5mbzsgLyogcmVzcG9uc2UgKi8KIAl1MzIJCW9wX3JmbGFnczsgICAgICAgICAgLyogcmVzcG9uc2UgKi8KIAlpbnQJCW9wX3RydW5jYXRlOyAgICAgICAgLyogdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNkX2lkbWFwLmggYi9pbmNsdWRlL2xpbnV4L25mc2RfaWRtYXAuaAppbmRleCA5YmI3ZjMwLi5lODI3NDZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc2RfaWRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc2RfaWRtYXAuaApAQCAtNDMsOCArNDMsMTMgQEAKIC8qIFhYWCBmcm9tIGxpbnV4L25mc19pZG1hcC5oICovCiAjZGVmaW5lIElETUFQX05BTUVTWiAxMjgKIAorI2lmZGVmIENPTkZJR19ORlNEX1Y0CiB2b2lkIG5mc2RfaWRtYXBfaW5pdCh2b2lkKTsKIHZvaWQgbmZzZF9pZG1hcF9zaHV0ZG93bih2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbmZzZF9pZG1hcF9pbml0KHZvaWQpIHt9Oworc3RhdGljIGlubGluZSB2b2lkIG5mc2RfaWRtYXBfc2h1dGRvd24odm9pZCkge307CisjZW5kaWYKIAogaW50IG5mc2RfbWFwX25hbWVfdG9fdWlkKHN0cnVjdCBzdmNfcnFzdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgX191MzIgKik7CiBpbnQgbmZzZF9tYXBfbmFtZV90b19naWQoc3RydWN0IHN2Y19ycXN0ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBfX3UzMiAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbnZyYW0uaCBiL2luY2x1ZGUvbGludXgvbnZyYW0uaAppbmRleCBiMDMxZTQxLi45MTg5ODI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L252cmFtLmgKKysrIGIvaW5jbHVkZS9saW51eC9udnJhbS5oCkBAIC0yMCw4ICsyMCw2IEBACiBleHRlcm4gdm9pZCBudnJhbV93cml0ZV9ieXRlKHVuc2lnbmVkIGNoYXIgYywgaW50IGkpOwogZXh0ZXJuIGludCBfX252cmFtX2NoZWNrX2NoZWNrc3VtKHZvaWQpOwogZXh0ZXJuIGludCBudnJhbV9jaGVja19jaGVja3N1bSh2b2lkKTsKLWV4dGVybiB2b2lkIF9fbnZyYW1fc2V0X2NoZWNrc3VtKHZvaWQpOwotZXh0ZXJuIHZvaWQgbnZyYW1fc2V0X2NoZWNrc3VtKHZvaWQpOwogI2VuZGlmCiAKICNlbmRpZiAgLyogX0xJTlVYX05WUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLWR5bmlkcy5oIGIvaW5jbHVkZS9saW51eC9wY2ktZHluaWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2I2YjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9wY2ktZHluaWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICoJUENJIGRlZmluZXMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqCUNvcHlyaWdodCAyMDAzIERlbGwgSW5jLgotICogICAgICAgIGJ5IE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KLSAqLwotCi0jaWZuZGVmIExJTlVYX1BDSV9EWU5JRFNfSAotI2RlZmluZSBMSU5VWF9QQ0lfRFlOSURTX0gKLQotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KLQotc3RydWN0IGR5bmlkIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBub2RlOwotCXN0cnVjdCBwY2lfZGV2aWNlX2lkICAgIGlkOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCBiNTIzOGJkLi43YWMxNDk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTU4Niw3ICs1ODYsNyBAQAogI2RlZmluZSBQQ0lfTlVNX1JFU09VUkNFUyAxMQogCiAjaWZuZGVmIFBDSV9CVVNfTlVNX1JFU09VUkNFUwotI2RlZmluZSBQQ0lfQlVTX05VTV9SRVNPVVJDRVMgNAorI2RlZmluZSBQQ0lfQlVTX05VTV9SRVNPVVJDRVMgOAogI2VuZGlmCiAgIAogI2RlZmluZSBQQ0lfUkVHSU9OX0ZMQUdfTUFTSyAweDBmVQkvKiBUaGVzZSBiaXRzIG9mIHJlc291cmNlIGZsYWdzIHRlbGwgdXMgdGhlIFBDSSByZWdpb24gZmxhZ3MgKi8KQEAgLTczNCwxNiArNzM0LDIwIEBACiAvKiBHZW5lcmljIFBDSSBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5ICovCiAKIGV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqcGNpX2ZpbmRfYnVzKGludCBkb21haW4sIGludCBidXNucik7Cit2b2lkIHBjaV9idXNfYWRkX2RldmljZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3NjYW5fYnVzX3BhcmVudGVkKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgaW50IGJ1cywgc3RydWN0IHBjaV9vcHMgKm9wcywgdm9pZCAqc3lzZGF0YSk7CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfYnVzICpwY2lfc2Nhbl9idXMoaW50IGJ1cywgc3RydWN0IHBjaV9vcHMgKm9wcywgdm9pZCAqc3lzZGF0YSkKIHsKLQlyZXR1cm4gcGNpX3NjYW5fYnVzX3BhcmVudGVkKE5VTEwsIGJ1cywgb3BzLCBzeXNkYXRhKTsKKwlzdHJ1Y3QgcGNpX2J1cyAqcm9vdF9idXM7CisJcm9vdF9idXMgPSBwY2lfc2Nhbl9idXNfcGFyZW50ZWQoTlVMTCwgYnVzLCBvcHMsIHN5c2RhdGEpOworCWlmIChyb290X2J1cykKKwkJcGNpX2J1c19hZGRfZGV2aWNlcyhyb290X2J1cyk7CisJcmV0dXJuIHJvb3RfYnVzOwogfQogaW50IHBjaV9zY2FuX3Nsb3Qoc3RydWN0IHBjaV9idXMgKmJ1cywgaW50IGRldmZuKTsKIHN0cnVjdCBwY2lfZGV2ICogcGNpX3NjYW5fc2luZ2xlX2RldmljZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4pOwogdW5zaWduZWQgaW50IHBjaV9zY2FuX2NoaWxkX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHZvaWQgcGNpX2J1c19hZGRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotdm9pZCBwY2lfYnVzX2FkZF9kZXZpY2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogdm9pZCBwY2lfbmFtZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiBjaGFyICpwY2lfY2xhc3NfbmFtZSh1MzIgY2xhc3MpOwogdm9pZCBwY2lfcmVhZF9icmlkZ2VfYmFzZXMoc3RydWN0IHBjaV9idXMgKmNoaWxkKTsKQEAgLTg1Niw3ICs4NjAsOCBAQAogdm9pZCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKik7CiB2b2lkIHBjaV9yZW1vdmVfYmVoaW5kX2JyaWRnZShzdHJ1Y3QgcGNpX2RldiAqKTsKIHN0cnVjdCBwY2lfZHJpdmVyICpwY2lfZGV2X2RyaXZlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqKTsKLWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsIGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYpOworY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9tYXRjaF9kZXZpY2Uoc3RydWN0IHBjaV9kcml2ZXIgKmRydiwgc3RydWN0IHBjaV9kZXYgKmRldik7Citjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX21hdGNoX2lkKGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZHMsIHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogaW50IHBjaV9zY2FuX2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX2RldiAqIGRldiwgaW50IG1heCwgaW50IHBhc3MpOwogCiAvKiBrbWVtX2NhY2hlIHN0eWxlIHdyYXBwZXIgYXJvdW5kIHBjaV9hbGxvY19jb25zaXN0ZW50KCkgKi8KQEAgLTg3MCw2ICs4NzUsMTUgQEAKICNkZWZpbmUJcGNpX3Bvb2xfYWxsb2MocG9vbCwgZmxhZ3MsIGhhbmRsZSkgZG1hX3Bvb2xfYWxsb2MocG9vbCwgZmxhZ3MsIGhhbmRsZSkKICNkZWZpbmUJcGNpX3Bvb2xfZnJlZShwb29sLCB2YWRkciwgYWRkcikgZG1hX3Bvb2xfZnJlZShwb29sLCB2YWRkciwgYWRkcikKIAorZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5IHsKKwlQQ0lfRE1BX0JVUlNUX0lORklOSVRZLAkvKiBtYWtlIGJ1cnN0cyBhcyBsYXJnZSBhcyBwb3NzaWJsZSwKKwkJCQkgICBzdHJhdGVneV9wYXJhbWV0ZXIgaXMgTi9BICovCisJUENJX0RNQV9CVVJTVF9CT1VOREFSWSwgLyogZGlzY29ubmVjdCBhdCBldmVyeSBzdHJhdGVneV9wYXJhbWV0ZXIKKwkJCQkgICBieXRlIGJvdW5kYXJpZXMgKi8KKwlQQ0lfRE1BX0JVUlNUX01VTFRJUExFLCAvKiBkaXNjb25uZWN0IGF0IHNvbWUgbXVsdGlwbGUgb2YKKwkJCQkgICBzdHJhdGVneV9wYXJhbWV0ZXIgYnl0ZSBib3VuZGFyaWVzICovCit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCBkZWZpbmVkKENPTkZJR19FSVNBKQogZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlOwogI2VuZGlmCkBAIC05NzIsNiArOTg2LDggQEAKIH0KICNlbmRpZgogCisjZGVmaW5lIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHBkZXYsIHN0cmF0LCBzdHJhdGVneV9wYXJhbWV0ZXIpIGRvIHsgfSB3aGlsZSAoMCkKKwogI2VuZGlmIC8qICFDT05GSUdfUENJICovCiAKIC8qIHRoZXNlIGhlbHBlcnMgcHJvdmlkZSBmdXR1cmUgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CkBAIC0xMDE2LDYgKzEwMzIsMjAgQEAKICNkZWZpbmUgcGNpX3ByZXR0eV9uYW1lKGRldikgIiIKICNlbmRpZgogCisKKy8qIFNvbWUgYXJjaHMgZG9uJ3Qgd2FudCB0byBleHBvc2Ugc3RydWN0IHJlc291cmNlIHRvIHVzZXJsYW5kIGFzLWlzCisgKiBpbiBzeXNmcyBhbmQgL3Byb2MKKyAqLworI2lmbmRlZiBIQVZFX0FSQ0hfUENJX1JFU09VUkNFX1RPX1VTRVIKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcmVzb3VyY2VfdG9fdXNlcihjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcnNyYywgdTY0ICpzdGFydCwgdTY0ICplbmQpCit7CisJKnN0YXJ0ID0gcnNyYy0+c3RhcnQ7CisJKmVuZCA9IHJzcmMtPmVuZDsKK30KKyNlbmRpZiAvKiBIQVZFX0FSQ0hfUENJX1JFU09VUkNFX1RPX1VTRVIgKi8KKworCiAvKgogICogIFRoZSB3b3JsZCBpcyBub3QgcGVyZmVjdCBhbmQgc3VwcGxpZXMgdXMgd2l0aCBicm9rZW4gUENJIGRldmljZXMuCiAgKiAgRm9yIGF0IGxlYXN0IGEgcGFydCBvZiB0aGVzZSBidWdzIHdlIG5lZWQgYSB3b3JrLWFyb3VuZCwgc28gYm90aApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCA2M2U4OWU0Li4yNzM0OGMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtNjIsNiArNjIsOCBAQAogCiAjZGVmaW5lIFBDSV9CQVNFX0NMQVNTX1NZU1RFTQkJMHgwOAogI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1BJQwkJMHgwODAwCisjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fUElDX0lPQVBJQwkweDA4MDAxMAorI2RlZmluZSBQQ0lfQ0xBU1NfU1lTVEVNX1BJQ19JT1hBUElDCTB4MDgwMDIwCiAjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fRE1BCQkweDA4MDEKICNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9USU1FUgkJMHgwODAyCiAjZGVmaW5lIFBDSV9DTEFTU19TWVNURU1fUlRDCQkweDA4MDMKQEAgLTcxMiw4ICs3MTQsOSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0RJVkFfQVVYCTB4MTI5MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0RJVkFfUk1QMwkweDEzMDEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9DSVNTQQkJMHgzMjIwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0IJCTB4MzIzMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0NJU1NCCQkweDMyMjIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9IUF9aWDJfSU9DCTB4NDAzMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0hQX0NJU1NDCQkweDMyMzAKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1BDVEVDSAkJMHgxMDQyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUENURUNIX1JaMTAwMAkweDEwMDAKQEAgLTEyMzUsNiArMTIzOCw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9JREUJMHgwMjY1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9TQVRBCTB4MDI2NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfU0FUQTIJMHgwMjY3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUJMHgwMzZFCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMgkJMHgwMjY4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8xMwkJMHgwMjY5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUDUxX0FVRElPCTB4MDI2QgpAQCAtMTI4NCw2ICsxMjg4LDggQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfR0VGT1JDRV9GWF9HTzU3MDBfMiAgICAweDAzNDgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPX0ZYX0dPMTAwMCAgICAgICAweDAzNEMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPX0ZYXzExMDAgICAgICAgICAweDAzNEUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE0ICAgICAgICAgICAgICAweDAzNzIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzE1ICAgICAgICAgICAgICAweDAzNzMKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lNUwkJMHgxMGUwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU1TXzg4NDkJCTB4ODg0OQpAQCAtMTU2OCw2ICsxNTc0LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0VVNCIDB4MDIyMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVVU0IgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0VVNCCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNlVTQiAweDAyMjEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2TFBDIDB4MDIyNwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0dDTEUgICAgMHgwMjI1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfR0NMRTIgICAweDAyMjcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1SVNBIDB4MDIzMApAQCAtMTgxMSw2ICsxODE4LDggQEAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JVEUJCTB4MTI4MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV9JVDgxNzJHCTB4ODE3MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV9JVDgxNzJHX0FVRElPIDB4MDgwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV84MjExCQkweDgyMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JVEVfODIxMgkJMHg4MjEyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSVRFXzg4NzIJCTB4ODg3MgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lURV9JVDgzMzBHXzAJMHhlODg2CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGt0X2Nscy5oIGIvaW5jbHVkZS9saW51eC9wa3RfY2xzLmgKaW5kZXggZDJhYTIxNC4uYmQyYzVhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wa3RfY2xzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wa3RfY2xzLmgKQEAgLTI3Niw2ICsyNzYsNyBAQAogCV9fdTgJcHJvdG9jb2w7CiAJX191OAl0dW5uZWxpZDsKIAlfX3U4CXR1bm5lbGhkcjsKKwlfX3U4CXBhZDsKIH07CiAKIC8qIFJPVVRFIGZpbHRlciAqLwpAQCAtNDA4LDYgKzQwOSw3IEBACiAJVENGX0VNX05CWVRFLAogCVRDRl9FTV9VMzIsCiAJVENGX0VNX01FVEEsCisJVENGX0VNX1RFWFQsCiAJX19UQ0ZfRU1fTUFYCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaAppbmRleCAxZDlkYTM2Li42MGZmY2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKQEAgLTIyMSw5ICsyMjEsMTEgQEAKIC8qIGdyZWQgc2V0dXAgKi8KIHN0cnVjdCB0Y19ncmVkX3NvcHQKIHsKLSAgICAgICBfX3UzMiAgICAgICAgICAgRFBzOwotICAgICAgIF9fdTMyICAgICAgICAgICBkZWZfRFA7Ci0gICAgICAgX191OCAgICAgICAgICAgIGdyaW87CisgICAgICAgX191MzIJCURQczsKKyAgICAgICBfX3UzMgkJZGVmX0RQOworICAgICAgIF9fdTgJCWdyaW87CisgICAgICAgX191OAkJcGFkMTsKKyAgICAgICBfX3UxNgkJcGFkMjsKIH07CiAKIC8qIEhUQiBzZWN0aW9uICovCkBAIC0zNTEsNiArMzUzLDcgQEAKICNkZWZpbmUJVENfQ0JRX09WTF9EUk9QCQkzCiAjZGVmaW5lCVRDX0NCUV9PVkxfUkNMQVNTSUMJNAogCXVuc2lnbmVkIGNoYXIJcHJpb3JpdHkyOworCV9fdTE2CQlwYWQ7CiAJX191MzIJCXBlbmFsdHk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggZWQyYjc2ZS4uN2FlYjIwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtMTAzLDcgKzEwMyw4IEBACiAvKgogICogUmVnaXN0ZXIgYSBkZXZpY2Ugd2l0aCBwb3dlciBtYW5hZ2VtZW50CiAgKi8KLXN0cnVjdCBwbV9kZXYgX19kZXByZWNhdGVkICpwbV9yZWdpc3RlcihwbV9kZXZfdCB0eXBlLCB1bnNpZ25lZCBsb25nIGlkLCBwbV9jYWxsYmFjayBjYWxsYmFjayk7CitzdHJ1Y3QgcG1fZGV2IF9fZGVwcmVjYXRlZCAqCitwbV9yZWdpc3RlcihwbV9kZXZfdCB0eXBlLCB1bnNpZ25lZCBsb25nIGlkLCBwbV9jYWxsYmFjayBjYWxsYmFjayk7CiAKIC8qCiAgKiBVbnJlZ2lzdGVyIGEgZGV2aWNlIHdpdGggcG93ZXIgbWFuYWdlbWVudApAQCAtMTc1LDcgKzE3Niw3IEBACiB9OwogCiBleHRlcm4gdm9pZCBwbV9zZXRfb3BzKHN0cnVjdCBwbV9vcHMgKik7Ci0KK2V4dGVybiBzdHJ1Y3QgcG1fb3BzICpwbV9vcHM7CiBleHRlcm4gaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKTsKIAogCkBAIC0xOTAsMTcgKzE5MSwxOCBAQAogLyoKICAqIFRoZXJlIGFyZSA0IGltcG9ydGFudCBzdGF0ZXMgZHJpdmVyIGNhbiBiZSBpbjoKICAqIE9OICAgICAtLSBkcml2ZXIgaXMgd29ya2luZwotICogRlJFRVpFIC0tIHN0b3Agb3BlcmF0aW9ucyBhbmQgYXBwbHkgd2hhdGV2ZXIgcG9saWN5IGlzIGFwcGxpY2FibGUgdG8gYSBzdXNwZW5kZWQgZHJpdmVyCi0gKiAgICAgICAgICAgb2YgdGhhdCBjbGFzcywgZnJlZXplIHF1ZXVlcyBmb3IgYmxvY2sgbGlrZSBJREUgZG9lcywgZHJvcCBwYWNrZXRzIGZvcgotICogICAgICAgICAgIGV0aGVybmV0LCBldGMuLi4gc3RvcCBETUEgZW5naW5lIHRvbyBldGMuLi4gc28gYSBjb25zaXN0ZW50IGltYWdlIGNhbiBiZQotICogICAgICAgICAgIHNhdmVkOyBidXQgZG8gbm90IHBvd2VyIGFueSBoYXJkd2FyZSBkb3duLgotICogU1VTUEVORCAtIGxpa2UgRlJFRVpFLCBidXQgaGFyZHdhcmUgaXMgZG9pbmcgYXMgbXVjaCBwb3dlcnNhdmluZyBhcyBwb3NzaWJsZS4gUm91Z2hseQotICogICAgICAgICAgIHBjaSBEMy4KKyAqIEZSRUVaRSAtLSBzdG9wIG9wZXJhdGlvbnMgYW5kIGFwcGx5IHdoYXRldmVyIHBvbGljeSBpcyBhcHBsaWNhYmxlIHRvIGEKKyAqICAgICAgICAgICBzdXNwZW5kZWQgZHJpdmVyIG9mIHRoYXQgY2xhc3MsIGZyZWV6ZSBxdWV1ZXMgZm9yIGJsb2NrIGxpa2UgSURFCisgKiAgICAgICAgICAgZG9lcywgZHJvcCBwYWNrZXRzIGZvciBldGhlcm5ldCwgZXRjLi4uIHN0b3AgRE1BIGVuZ2luZSB0b28gZXRjLi4uCisgKiAgICAgICAgICAgc28gYSBjb25zaXN0ZW50IGltYWdlIGNhbiBiZSBzYXZlZDsgYnV0IGRvIG5vdCBwb3dlciBhbnkgaGFyZHdhcmUKKyAqICAgICAgICAgICBkb3duLgorICogU1VTUEVORCAtIGxpa2UgRlJFRVpFLCBidXQgaGFyZHdhcmUgaXMgZG9pbmcgYXMgbXVjaCBwb3dlcnNhdmluZyBhcworICogICAgICAgICAgIHBvc3NpYmxlLiBSb3VnaGx5IHBjaSBEMy4KICAqCi0gKiBVbmZvcnR1bmF0ZWx5LCBjdXJyZW50IGRyaXZlcnMgb25seSByZWNvZ25pemUgbnVtZXJpYyB2YWx1ZXMgMCAoT04pIGFuZCAzIChTVVNQRU5EKS4KLSAqIFdlJ2xsIG5lZWQgdG8gZml4IHRoZSBkcml2ZXJzLiBTbyB5ZXMsIHB1dHRpbmcgMyB0byBhbGwgZGlmZXJlbnQgZGVmaW5lcyBpcyBpbnRlbnRpb25hbCwKLSAqIGFuZCB3aWxsIGdvIGF3YXkgYXMgc29vbiBhcyBkcml2ZXJzIGFyZSBmaXhlZC4gQWxzbyBub3RlIHRoYXQgdHlwZWRlZiBpcyBuZWNjZXNzYXJ5LAotICogd2UnbGwgcHJvYmFibHkgd2FudCB0byBzd2l0Y2ggdG8KKyAqIFVuZm9ydHVuYXRlbHksIGN1cnJlbnQgZHJpdmVycyBvbmx5IHJlY29nbml6ZSBudW1lcmljIHZhbHVlcyAwIChPTikgYW5kIDMKKyAqIChTVVNQRU5EKS4gIFdlJ2xsIG5lZWQgdG8gZml4IHRoZSBkcml2ZXJzLiBTbyB5ZXMsIHB1dHRpbmcgMyB0byBhbGwgZGlmZmVyZW50CisgKiBkZWZpbmVzIGlzIGludGVudGlvbmFsLCBhbmQgd2lsbCBnbyBhd2F5IGFzIHNvb24gYXMgZHJpdmVycyBhcmUgZml4ZWQuICBBbHNvCisgKiBub3RlIHRoYXQgdHlwZWRlZiBpcyBuZWNjZXNzYXJ5LCB3ZSdsbCBwcm9iYWJseSB3YW50IHRvIHN3aXRjaCB0bwogICogICB0eXBlZGVmIHN0cnVjdCBwbV9tZXNzYWdlX3QgeyBpbnQgZXZlbnQ7IGludCBmbGFnczsgfSBwbV9tZXNzYWdlX3QKICAqIG9yIHNvbWV0aGluZyBzaW1pbGFyIHNvb24uCiAgKi8KQEAgLTIyMiwxMSArMjI0LDE4IEBACiAKIGV4dGVybiB2b2lkIGRldmljZV9wbV9zZXRfcGFyZW50KHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2UgKiBwYXJlbnQpOwogCi1leHRlcm4gaW50IGRldmljZV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gaW50IGRldmljZV9wb3dlcl9kb3duKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiBleHRlcm4gdm9pZCBkZXZpY2VfcG93ZXJfdXAodm9pZCk7CiBleHRlcm4gdm9pZCBkZXZpY2VfcmVzdW1lKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1BNCitleHRlcm4gaW50IGRldmljZV9zdXNwZW5kKHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZGV2aWNlX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKQoreworCXJldHVybiAwOworfQorI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG11LmggYi9pbmNsdWRlL2xpbnV4L3BtdS5oCmluZGV4IDZkNzNlYWQuLjM3M2JkM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG11LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbXUuaApAQCAtMTY2LDcgKzE2Niw3IEBACiBleHRlcm4gaW50IHBtdV9pMmNfc2ltcGxlX3dyaXRlKGludCBidXMsIGludCBhZGRyLCAgdTgqIGRhdGEsIGludCBsZW4pOwogCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogLyoKICAqIFN0dWZmIGZvciBwdXR0aW5nIHRoZSBwb3dlcmJvb2sgdG8gc2xlZXAgYW5kIHdha2luZyBpdCBhZ2Fpbi4KICAqCkBAIC0yMDgsNiArMjA4LDggQEAKIGludCBwbXVfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoc3RydWN0IHBtdV9zbGVlcF9ub3RpZmllciogbm90aWZpZXIpOwogaW50IHBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIqIG5vdGlmaWVyKTsKIAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiAjZGVmaW5lIFBNVV9NQVhfQkFUVEVSSUVTCTIKIAogLyogdmFsdWVzIGZvciBwbXVfcG93ZXJfZmxhZ3MgKi8KQEAgLTIzNSw2ICsyMzcsNCBAQAogZXh0ZXJuIHN0cnVjdCBwbXVfYmF0dGVyeV9pbmZvIHBtdV9iYXR0ZXJpZXNbUE1VX01BWF9CQVRURVJJRVNdOwogZXh0ZXJuIHVuc2lnbmVkIGludCBwbXVfcG93ZXJfZmxhZ3M7CiAKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLwotCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmggYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAppbmRleCA1OWU1MDUyLi4wNTYzNTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb2NfZnMuaApAQCAtNzQsNiArNzQsMTMgQEAKIAlzaXplX3Qgc2l6ZTsKIH07CiAKK3N0cnVjdCB2bWNvcmUgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcGFkZHI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWxvZmZfdCBvZmZzZXQ7Cit9OworCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSBwcm9jX3Jvb3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FueDRfZnMuaCBiL2luY2x1ZGUvbGludXgvcW54NF9mcy5oCmluZGV4IDIyYmE1ODAuLmZjNjEwYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcW54NF9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcW54NF9mcy5oCkBAIC00NiwxMSArNDYsMTEgQEAKIAljaGFyCQlkaV9mbmFtZVtRTlg0X1NIT1JUX05BTUVfTUFYXTsKIAlxbng0X29mZl90CWRpX3NpemU7CiAJcW54NF94dG50X3QJZGlfZmlyc3RfeHRudDsKLQlfX3UzMgkJZGlfeGJsazsKLQlfX3MzMgkJZGlfZnRpbWU7Ci0JX19zMzIJCWRpX210aW1lOwotCV9fczMyCQlkaV9hdGltZTsKLQlfX3MzMgkJZGlfY3RpbWU7CisJX19sZTMyCQlkaV94YmxrOworCV9fbGUzMgkJZGlfZnRpbWU7CisJX19sZTMyCQlkaV9tdGltZTsKKwlfX2xlMzIJCWRpX2F0aW1lOworCV9fbGUzMgkJZGlfY3RpbWU7CiAJcW54NF9ueHRudF90CWRpX251bV94dG50czsKIAlxbng0X21vZGVfdAlkaV9tb2RlOwogCXFueDRfbXVpZF90CWRpX3VpZDsKQEAgLTYzLDE4ICs2MywxOCBAQAogCiBzdHJ1Y3QgcW54NF9saW5rX2luZm8gewogCWNoYXIJCWRsX2ZuYW1lW1FOWDRfTkFNRV9NQVhdOwotCV9fdTMyCQlkbF9pbm9kZV9ibGs7CisJX19sZTMyCQlkbF9pbm9kZV9ibGs7CiAJX191OAkJZGxfaW5vZGVfbmR4OwogCV9fdTgJCWRsX3NwYXJlWzEwXTsKIAlfX3U4CQlkbF9zdGF0dXM7CiB9OwogCiBzdHJ1Y3QgcW54NF94YmxrIHsKLQlfX3UzMgkJeGJsa19uZXh0X3hibGs7Ci0JX191MzIJCXhibGtfcHJldl94YmxrOworCV9fbGUzMgkJeGJsa19uZXh0X3hibGs7CisJX19sZTMyCQl4YmxrX3ByZXZfeGJsazsKIAlfX3U4CQl4YmxrX251bV94dG50czsKIAlfX3U4CQl4YmxrX3NwYXJlWzNdOwotCV9fczMyCQl4YmxrX251bV9ibG9ja3M7CisJX19sZTMyCQl4YmxrX251bV9ibG9ja3M7CiAJcW54NF94dG50X3QJeGJsa194dG50c1tRTlg0X01BWF9YVE5UU19QRVJfWEJMS107CiAJY2hhcgkJeGJsa19zaWduYXR1cmVbOF07CiAJcW54NF94dG50X3QJeGJsa19maXJzdF94dG50OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oIGIvaW5jbHVkZS9saW51eC9xbnh0eXBlcy5oCmluZGV4IGZiNTE4ZTMuLmEzZWIxMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcW54dHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3FueHR5cGVzLmgKQEAgLTEyLDE4ICsxMiwxOCBAQAogI2lmbmRlZiBfUU5YNFRZUEVTX0gKICNkZWZpbmUgX1FOWDRUWVBFU19ICiAKLXR5cGVkZWYgX191MTYgcW54NF9ueHRudF90OwordHlwZWRlZiBfX2xlMTYgcW54NF9ueHRudF90OwogdHlwZWRlZiBfX3U4ICBxbng0X2Z0eXBlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX3UzMiB4dG50X2JsazsKLQlfX3UzMiB4dG50X3NpemU7CisJX19sZTMyIHh0bnRfYmxrOworCV9fbGUzMiB4dG50X3NpemU7CiB9IHFueDRfeHRudF90OwogCi10eXBlZGVmIF9fdTE2IHFueDRfbW9kZV90OwotdHlwZWRlZiBfX3UxNiBxbng0X211aWRfdDsKLXR5cGVkZWYgX191MTYgcW54NF9tZ2lkX3Q7Ci10eXBlZGVmIF9fdTMyIHFueDRfb2ZmX3Q7Ci10eXBlZGVmIF9fdTE2IHFueDRfbmxpbmtfdDsKK3R5cGVkZWYgX19sZTE2IHFueDRfbW9kZV90OwordHlwZWRlZiBfX2xlMTYgcW54NF9tdWlkX3Q7Cit0eXBlZGVmIF9fbGUxNiBxbng0X21naWRfdDsKK3R5cGVkZWYgX19sZTMyIHFueDRfb2ZmX3Q7Cit0eXBlZGVmIF9fbGUxNiBxbng0X25saW5rX3Q7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xdW90YS5oIGIvaW5jbHVkZS9saW51eC9xdW90YS5oCmluZGV4IGFjNWI5MGYuLjcwMGVhZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcXVvdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3F1b3RhLmgKQEAgLTEzOCw4ICsxMzgsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kcWJsa192Mi5oPgogCiAvKiBNYXhpbWFsIG51bWJlcnMgb2Ygd3JpdGVzIGZvciBxdW90YSBvcGVyYXRpb24gKGluc2VydC9kZWxldGUvdXBkYXRlKQotICogKG92ZXIgYWxsIGZvcm1hdHMpIC0gaW5mbyBibG9jaywgNCBwb2ludGVyIGJsb2NrcywgZGF0YSBibG9jayAqLwotI2RlZmluZSBEUVVPVF9NQVhfV1JJVEVTCTYKKyAqIChvdmVyIFZGUyBhbGwgZm9ybWF0cykgKi8KKyNkZWZpbmUgRFFVT1RfSU5JVF9BTExPQyBtYXgoVjFfSU5JVF9BTExPQywgVjJfSU5JVF9BTExPQykKKyNkZWZpbmUgRFFVT1RfSU5JVF9SRVdSSVRFIG1heChWMV9JTklUX1JFV1JJVEUsIFYyX0lOSVRfUkVXUklURSkKKyNkZWZpbmUgRFFVT1RfREVMX0FMTE9DIG1heChWMV9ERUxfQUxMT0MsIFYyX0RFTF9BTExPQykKKyNkZWZpbmUgRFFVT1RfREVMX1JFV1JJVEUgbWF4KFYxX0RFTF9SRVdSSVRFLCBWMl9ERUxfUkVXUklURSkKIAogLyoKICAqIERhdGEgZm9yIG9uZSB1c2VyL2dyb3VwIGtlcHQgaW4gbWVtb3J5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oIGIvaW5jbHVkZS9saW51eC9yZWJvb3QuaAppbmRleCBkNjBmYWZjLi4yZDRkZDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVib290LmgKQEAgLTUxLDYgKzUxLDEwIEBACiBleHRlcm4gdm9pZCBtYWNoaW5lX2hhbHQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKTsKIAorZXh0ZXJuIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKTsKK3N0cnVjdCBwdF9yZWdzOworZXh0ZXJuIHZvaWQgbWFjaGluZV9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqKTsKKwogI2VuZGlmCiAKICNlbmRpZiAvKiBfTElOVVhfUkVCT09UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfYWNsLmggYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2FjbC5oCmluZGV4IDA3NjA1MDcuLjBhMzYwNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfYWNsLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19hY2wuaApAQCAtNCwyOSArNCwyOSBAQAogI2RlZmluZSBSRUlTRVJGU19BQ0xfVkVSU0lPTgkweDAwMDEKIAogdHlwZWRlZiBzdHJ1Y3QgewotCV9fbGUxNgkJZV90YWc7Ci0JX19sZTE2CQllX3Blcm07Ci0JX19sZTMyCQllX2lkOworCV9fbGUxNiBlX3RhZzsKKwlfX2xlMTYgZV9wZXJtOworCV9fbGUzMiBlX2lkOwogfSByZWlzZXJmc19hY2xfZW50cnk7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMTYJCWVfdGFnOwotCV9fbGUxNgkJZV9wZXJtOworCV9fbGUxNiBlX3RhZzsKKwlfX2xlMTYgZV9wZXJtOwogfSByZWlzZXJmc19hY2xfZW50cnlfc2hvcnQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMzIJCWFfdmVyc2lvbjsKKwlfX2xlMzIgYV92ZXJzaW9uOwogfSByZWlzZXJmc19hY2xfaGVhZGVyOwogCiBzdGF0aWMgaW5saW5lIHNpemVfdCByZWlzZXJmc19hY2xfc2l6ZShpbnQgY291bnQpCiB7CiAJaWYgKGNvdW50IDw9IDQpIHsKIAkJcmV0dXJuIHNpemVvZihyZWlzZXJmc19hY2xfaGVhZGVyKSArCi0JCSAgICAgICBjb3VudCAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkgICAgY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KTsKIAl9IGVsc2UgewogCQlyZXR1cm4gc2l6ZW9mKHJlaXNlcmZzX2FjbF9oZWFkZXIpICsKLQkJICAgICAgIDQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5X3Nob3J0KSArCi0JCSAgICAgICAoY291bnQgLSA0KSAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnkpOworCQkgICAgNCAqIHNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpICsKKwkJICAgIChjb3VudCAtIDQpICogc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CiAJfQogfQogCkBAIC00NiwxNCArNDYsMTQgQEAKIAl9CiB9CiAKLQogI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0wKLXN0cnVjdCBwb3NpeF9hY2wgKiByZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKLWludCByZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IHJlaXNlcmZzX2luaGVyaXRfZGVmYXVsdF9hY2wgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmRpcik7Ci1leHRlcm4gaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9pbml0ICh2b2lkKSBfX2luaXQ7Ci1leHRlcm4gaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9leGl0ICh2b2lkKTsKK3N0cnVjdCBwb3NpeF9hY2wgKnJlaXNlcmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOworaW50IHJlaXNlcmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCByZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKHN0cnVjdCBpbm9kZSAqZGlyKTsKK2V4dGVybiBpbnQgcmVpc2VyZnNfeGF0dHJfcG9zaXhfYWNsX2luaXQodm9pZCkgX19pbml0OworZXh0ZXJuIGludCByZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfZXhpdCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciBwb3NpeF9hY2xfZGVmYXVsdF9oYW5kbGVyOwogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHBvc2l4X2FjbF9hY2Nlc3NfaGFuZGxlcjsKICNlbHNlCkBAIC02MSwyOCArNjEsMjYgQEAKICNkZWZpbmUgcmVpc2VyZnNfZ2V0X2FjbCBOVUxMCiAjZGVmaW5lIHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsKGlub2RlKSAwCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc194YXR0cl9wb3NpeF9hY2xfaW5pdCAodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9pbml0KHZvaWQpCiB7Ci0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX3hhdHRyX3Bvc2l4X2FjbF9leGl0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludAotcmVpc2VyZnNfeGF0dHJfcG9zaXhfYWNsX2V4aXQgKHZvaWQpCityZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsKGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc19hY2xfY2htb2QgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1yZWlzZXJmc19pbmhlcml0X2RlZmF1bHRfYWNsIChjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnMuaAppbmRleCAzMjE0ODYyLi4xN2U0NThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mcy5oCkBAIC0zLDExICszLDEwIEBACiAgKi8KIAogCQkJCS8qIHRoaXMgZmlsZSBoYXMgYW4gYW1hemluZ2x5IHN0dXBpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB5dXJhIHBsZWFzZSBmaXggaXQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnMuaCwgYW5kIG1lcmdlIGFsbCB0aGUgcmVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBvdXIgLmggZmlsZXMgdGhhdCBhcmUgaW4gdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgaW50byBpdC4gICovCi0KKwkJCQkgICBuYW1lLCB5dXJhIHBsZWFzZSBmaXggaXQgdG8gYmUKKwkJCQkgICByZWlzZXJmcy5oLCBhbmQgbWVyZ2UgYWxsIHRoZSByZXN0CisJCQkJICAgb2Ygb3VyIC5oIGZpbGVzIHRoYXQgYXJlIGluIHRoaXMKKwkJCQkgICBkaXJlY3RvcnkgaW50byBpdC4gICovCiAKICNpZm5kZWYgX0xJTlVYX1JFSVNFUl9GU19ICiAjZGVmaW5lIF9MSU5VWF9SRUlTRVJfRlNfSApAQCAtNzQsOSArNzMsOSBAQAogLyogZGVidWcgbGV2ZWxzLiAgUmlnaHQgbm93LCBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgbWVhbnMgcHJpbnQgYWxsIGRlYnVnCiAqKiBtZXNzYWdlcy4KICovCi0jZGVmaW5lIFJFSVNFUkZTX0RFQlVHX0NPREUgNSAvKiBleHRyYSBtZXNzYWdlcyB0byBoZWxwIGZpbmQvZGVidWcgZXJyb3JzICovIAorI2RlZmluZSBSRUlTRVJGU19ERUJVR19DT0RFIDUJLyogZXh0cmEgbWVzc2FnZXMgdG8gaGVscCBmaW5kL2RlYnVnIGVycm9ycyAqLwogCi12b2lkIHJlaXNlcmZzX3dhcm5pbmcgKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqIGZtdCwgLi4uKTsKK3ZvaWQgcmVpc2VyZnNfd2FybmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIC8qIGFzc2VydGlvbnMgaGFuZGxpbmcgKi8KIAogLyoqIGFsd2F5cyBjaGVjayBhIGNvbmRpdGlvbiBhbmQgcGFuaWMgaWYgaXQncyBmYWxzZS4gKi8KQEAgLTEwNSw4MiArMTA0LDc4IEBACiAgKiBTdHJ1Y3R1cmUgb2Ygc3VwZXIgYmxvY2sgb24gZGlzaywgYSB2ZXJzaW9uIG9mIHdoaWNoIGluIFJBTSBpcyBvZnRlbiBhY2Nlc3NlZCBhcyBSRUlTRVJGU19TQihzKS0+c19ycwogICogdGhlIHZlcnNpb24gaW4gUkFNIGlzIHBhcnQgb2YgYSBsYXJnZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgZmllbGRzIG5ldmVyIHdyaXR0ZW4gdG8gZGlzay4KICAqLwotI2RlZmluZSBVTlNFVF9IQVNIIDAgLy8gcmVhZF9zdXBlciB3aWxsIGd1ZXNzIGFib3V0LCB3aGF0IGhhc2ggbmFtZXMKLSAgICAgICAgICAgICAgICAgICAgIC8vIGluIGRpcmVjdG9yaWVzIHdlcmUgc29ydGVkIHdpdGgKKyNkZWZpbmUgVU5TRVRfSEFTSCAwCQkvLyByZWFkX3N1cGVyIHdpbGwgZ3Vlc3MgYWJvdXQsIHdoYXQgaGFzaCBuYW1lcworCQkgICAgIC8vIGluIGRpcmVjdG9yaWVzIHdlcmUgc29ydGVkIHdpdGgKICNkZWZpbmUgVEVBX0hBU0ggIDEKICNkZWZpbmUgWVVSQV9IQVNIIDIKICNkZWZpbmUgUjVfSEFTSCAgIDMKICNkZWZpbmUgREVGQVVMVF9IQVNIIFI1X0hBU0gKIAotCiBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgewotICAgIF9fbGUzMiBqcF9qb3VybmFsXzFzdF9ibG9jazsJICAgICAgLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzCi0JCQkJICAgICAgICogZGV2aWNlICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfZGV2OwkgICAgICAvKiBqb3VybmFsIGRldmljZSBzdF9yZGV2ICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfc2l6ZTsJICAgICAgLyogc2l6ZSBvZiB0aGUgam91cm5hbCAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX3RyYW5zX21heDsJICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gKi8KLSAgICBfX2xlMzIganBfam91cm5hbF9tYWdpYzsgCSAgICAgIC8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICh0aGlzCi0JCQkJICAgICAgICogd2FzIHNiX2pvdXJuYWxfYmxvY2tfY291bnQpICovCi0gICAgX19sZTMyIGpwX2pvdXJuYWxfbWF4X2JhdGNoOwkgICAgICAvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyB0byBiYXRjaCBpbnRvIGEKLQkJCQkgICAgICAgKiB0cmFucyAqLwotICAgIF9fbGUzMiBqcF9qb3VybmFsX21heF9jb21taXRfYWdlOyAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMKLQkJCQkgICAgICAgKiBjb21taXQgYmUgKi8KLSAgICBfX2xlMzIganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOyAgIC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGEgdHJhbnNhY3Rpb24KLQkJCQkgICAgICAgKiBiZSAqLworCV9fbGUzMiBqcF9qb3VybmFsXzFzdF9ibG9jazsJLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzCisJCQkJCSAqIGRldmljZSAqLworCV9fbGUzMiBqcF9qb3VybmFsX2RldjsJLyogam91cm5hbCBkZXZpY2Ugc3RfcmRldiAqLworCV9fbGUzMiBqcF9qb3VybmFsX3NpemU7CS8qIHNpemUgb2YgdGhlIGpvdXJuYWwgKi8KKwlfX2xlMzIganBfam91cm5hbF90cmFuc19tYXg7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWFnaWM7CS8qIHJhbmRvbSB2YWx1ZSBtYWRlIG9uIGZzIGNyZWF0aW9uICh0aGlzCisJCQkJCSAqIHdhcyBzYl9qb3VybmFsX2Jsb2NrX2NvdW50KSAqLworCV9fbGUzMiBqcF9qb3VybmFsX21heF9iYXRjaDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhCisJCQkJCSAqIHRyYW5zICovCisJX19sZTMyIGpwX2pvdXJuYWxfbWF4X2NvbW1pdF9hZ2U7CS8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jCisJCQkJCQkgKiBjb21taXQgYmUgKi8KKwlfX2xlMzIganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOwkvKiBpbiBzZWNvbmRzLCBob3cgb2xkIGNhbiBhIHRyYW5zYWN0aW9uCisJCQkJCQkgKiBiZSAqLwogfTsKIAogLyogdGhpcyBpcyB0aGUgc3VwZXIgZnJvbSAzLjUuWCwgd2hlcmUgWCA+PSAxMCAqLwotc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxCi17Ci0gICAgX19sZTMyIHNfYmxvY2tfY291bnQ7CSAgIC8qIGJsb2NrcyBjb3VudCAgICAgICAgICovCi0gICAgX19sZTMyIHNfZnJlZV9ibG9ja3M7ICAgICAgICAgICAvKiBmcmVlIGJsb2NrcyBjb3VudCAgICAqLwotICAgIF9fbGUzMiBzX3Jvb3RfYmxvY2s7ICAgICAgICAgICAgLyogcm9vdCBibG9jayBudW1iZXIgICAgKi8KLSAgICBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgc19qb3VybmFsOwotICAgIF9fbGUxNiBzX2Jsb2Nrc2l6ZTsgICAgICAgICAgICAgLyogYmxvY2sgc2l6ZSAqLwotICAgIF9fbGUxNiBzX29pZF9tYXhzaXplOwkgICAvKiBtYXggc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXksIHNlZQotCQkJCSAgICAqIGdldF9vYmplY3RpZCgpIGNvbW1lbnRhcnkgICovCi0gICAgX19sZTE2IHNfb2lkX2N1cnNpemU7CSAgIC8qIGN1cnJlbnQgc2l6ZSBvZiBvYmplY3QgaWQgYXJyYXkgKi8KLSAgICBfX2xlMTYgc191bW91bnRfc3RhdGU7ICAgICAgICAgIC8qIHRoaXMgaXMgc2V0IHRvIDEgd2hlbiBmaWxlc3lzdGVtIHdhcwotCQkJCSAgICAqIHVtb3VudGVkLCB0byAyIC0gd2hlbiBub3QgKi8gICAgCi0gICAgY2hhciBzX21hZ2ljWzEwXTsgICAgICAgICAgICAgIC8qIHJlaXNlcmZzIG1hZ2ljIHN0cmluZyBpbmRpY2F0ZXMgdGhhdAotCQkJCSAgICAqIGZpbGUgc3lzdGVtIGlzIHJlaXNlcmZzOgotCQkJCSAgICAqICJSZUlzRXJGcyIgb3IgIlJlSXNFcjJGcyIgb3IgIlJlSXNFcjNGcyIgKi8KLSAgICBfX2xlMTYgc19mc19zdGF0ZTsJICAgICAgICAgICAvKiBpdCBpcyBzZXQgdG8gdXNlZCBieSBmc2NrIHRvIG1hcmsgd2hpY2gKLQkJCQkgICAgKiBwaGFzZSBvZiByZWJ1aWxkaW5nIGlzIGRvbmUgKi8KLSAgICBfX2xlMzIgc19oYXNoX2Z1bmN0aW9uX2NvZGU7ICAgIC8qIGluZGljYXRlLCB3aGF0IGhhc2ggZnVuY3Rpb24gaXMgYmVpbmcgdXNlCi0JCQkJICAgICogdG8gc29ydCBuYW1lcyBpbiBhIGRpcmVjdG9yeSovCi0gICAgX19sZTE2IHNfdHJlZV9oZWlnaHQ7ICAgICAgICAgICAvKiBoZWlnaHQgb2YgZGlzayB0cmVlICovCi0gICAgX19sZTE2IHNfYm1hcF9ucjsgICAgICAgICAgICAgICAvKiBhbW91bnQgb2YgYml0bWFwIGJsb2NrcyBuZWVkZWQgdG8gYWRkcmVzcwotCQkJCSAgICAqIGVhY2ggYmxvY2sgb2YgZmlsZSBzeXN0ZW0gKi8KLSAgICBfX2xlMTYgc192ZXJzaW9uOyAgICAgICAgICAgICAgIC8qIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtCi0JCQkJICAgICogd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLwotICAgIF9fbGUxNiBzX3Jlc2VydmVkX2Zvcl9qb3VybmFsOyAgLyogc2l6ZSBpbiBibG9ja3Mgb2Ygam91cm5hbCBhcmVhIG9uIG1haW4KLQkJCQkgICAgKiBkZXZpY2UsIHdlIG5lZWQgdG8ga2VlcCBhZnRlcgotCQkJCSAgICAqIG1ha2luZyBmcyB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsICovCQorc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxIHsKKwlfX2xlMzIgc19ibG9ja19jb3VudDsJLyogYmxvY2tzIGNvdW50ICAgICAgICAgKi8KKwlfX2xlMzIgc19mcmVlX2Jsb2NrczsJLyogZnJlZSBibG9ja3MgY291bnQgICAgKi8KKwlfX2xlMzIgc19yb290X2Jsb2NrOwkvKiByb290IGJsb2NrIG51bWJlciAgICAqLworCXN0cnVjdCBqb3VybmFsX3BhcmFtcyBzX2pvdXJuYWw7CisJX19sZTE2IHNfYmxvY2tzaXplOwkvKiBibG9jayBzaXplICovCisJX19sZTE2IHNfb2lkX21heHNpemU7CS8qIG1heCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSwgc2VlCisJCQkJICogZ2V0X29iamVjdGlkKCkgY29tbWVudGFyeSAgKi8KKwlfX2xlMTYgc19vaWRfY3Vyc2l6ZTsJLyogY3VycmVudCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSAqLworCV9fbGUxNiBzX3Vtb3VudF9zdGF0ZTsJLyogdGhpcyBpcyBzZXQgdG8gMSB3aGVuIGZpbGVzeXN0ZW0gd2FzCisJCQkJICogdW1vdW50ZWQsIHRvIDIgLSB3aGVuIG5vdCAqLworCWNoYXIgc19tYWdpY1sxMF07CS8qIHJlaXNlcmZzIG1hZ2ljIHN0cmluZyBpbmRpY2F0ZXMgdGhhdAorCQkJCSAqIGZpbGUgc3lzdGVtIGlzIHJlaXNlcmZzOgorCQkJCSAqICJSZUlzRXJGcyIgb3IgIlJlSXNFcjJGcyIgb3IgIlJlSXNFcjNGcyIgKi8KKwlfX2xlMTYgc19mc19zdGF0ZTsJLyogaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoCisJCQkJICogcGhhc2Ugb2YgcmVidWlsZGluZyBpcyBkb25lICovCisJX19sZTMyIHNfaGFzaF9mdW5jdGlvbl9jb2RlOwkvKiBpbmRpY2F0ZSwgd2hhdCBoYXNoIGZ1bmN0aW9uIGlzIGJlaW5nIHVzZQorCQkJCQkgKiB0byBzb3J0IG5hbWVzIGluIGEgZGlyZWN0b3J5Ki8KKwlfX2xlMTYgc190cmVlX2hlaWdodDsJLyogaGVpZ2h0IG9mIGRpc2sgdHJlZSAqLworCV9fbGUxNiBzX2JtYXBfbnI7CS8qIGFtb3VudCBvZiBiaXRtYXAgYmxvY2tzIG5lZWRlZCB0byBhZGRyZXNzCisJCQkJICogZWFjaCBibG9jayBvZiBmaWxlIHN5c3RlbSAqLworCV9fbGUxNiBzX3ZlcnNpb247CS8qIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtCisJCQkJICogd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLworCV9fbGUxNiBzX3Jlc2VydmVkX2Zvcl9qb3VybmFsOwkvKiBzaXplIGluIGJsb2NrcyBvZiBqb3VybmFsIGFyZWEgb24gbWFpbgorCQkJCQkgKiBkZXZpY2UsIHdlIG5lZWQgdG8ga2VlcCBhZnRlcgorCQkJCQkgKiBtYWtpbmcgZnMgd2l0aCBub24tc3RhbmRhcmQgam91cm5hbCAqLwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiAjZGVmaW5lIFNCX1NJWkVfVjEgKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEpKQogCiAvKiB0aGlzIGlzIHRoZSBvbiBkaXNrIHN1cGVyIGJsb2NrICovCi1zdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sKLXsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgc192MTsKLSAgICBfX2xlMzIgc19pbm9kZV9nZW5lcmF0aW9uOwotICAgIF9fbGUzMiBzX2ZsYWdzOyAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IG5vdyB1c2VkIG9ubHkgYnkgaW5vZGUtYXR0cmlidXRlcywgaWYgZW5hYmxlZCAqLwotICAgIHVuc2lnbmVkIGNoYXIgc191dWlkWzE2XTsgICAgICAgLyogZmlsZXN5c3RlbSB1bmlxdWUgaWRlbnRpZmllciAqLwotICAgIHVuc2lnbmVkIGNoYXIgc19sYWJlbFsxNl07ICAgICAgLyogZmlsZXN5c3RlbSB2b2x1bWUgbGFiZWwgKi8KLSAgICBjaGFyIHNfdW51c2VkWzg4XSA7ICAgICAgICAgICAgIC8qIHplcm8gZmlsbGVkIGJ5IG1rcmVpc2VyZnMgYW5kCi0JCQkJICAgICAqIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkKLQkJCQkgICAgICogc28gYW55IGFkZGl0aW9ucyBtdXN0IGJlIHVwZGF0ZWQKLQkJCQkgICAgICogdGhlcmUgYXMgd2VsbC4gKi8KLX0gIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CitzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgeworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSBzX3YxOworCV9fbGUzMiBzX2lub2RlX2dlbmVyYXRpb247CisJX19sZTMyIHNfZmxhZ3M7CQkvKiBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07CS8qIGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOwkvKiBmaWxlc3lzdGVtIHZvbHVtZSBsYWJlbCAqLworCWNoYXIgc191bnVzZWRbODhdOwkvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZAorCQkJCSAqIHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKCkKKwkJCQkgKiBzbyBhbnkgYWRkaXRpb25zIG11c3QgYmUgdXBkYXRlZAorCQkJCSAqIHRoZXJlIGFzIHdlbGwuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKICNkZWZpbmUgU0JfU0laRSAoc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jaykpCiAKICNkZWZpbmUgUkVJU0VSRlNfVkVSU0lPTl8xIDAKICNkZWZpbmUgUkVJU0VSRlNfVkVSU0lPTl8yIDIKIAotCiAvLyBvbi1kaXNrIHN1cGVyIGJsb2NrIGZpZWxkcyBjb252ZXJ0ZWQgdG8gY3B1IGZvcm0KICNkZWZpbmUgU0JfRElTS19TVVBFUl9CTE9DSyhzKSAoUkVJU0VSRlNfU0IocyktPnNfcnMpCiAjZGVmaW5lIFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socykgKCYoU0JfRElTS19TVVBFUl9CTE9DSyhzKS0+c192MSkpCkBAIC0yMTAsMTMgKzIwNSwxMiBAQAogI2RlZmluZSBQVVRfU0JfVFJFRV9IRUlHSFQocywgdmFsKSBcCiAgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdHJlZV9oZWlnaHQgPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogI2RlZmluZSBQVVRfU0JfUkVJU0VSRlNfU1RBVEUocywgdmFsKSBcCi0gICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdW1vdW50X3N0YXRlID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkgCisgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdW1vdW50X3N0YXRlID0gY3B1X3RvX2xlMTYodmFsKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgUFVUX1NCX1ZFUlNJT04ocywgdmFsKSBcCiAgICBkbyB7IFNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfdmVyc2lvbiA9IGNwdV90b19sZTE2KHZhbCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFBVVF9TQl9CTUFQX05SKHMsIHZhbCkgXAogICAgZG8geyBTQl9WMV9ESVNLX1NVUEVSX0JMT0NLKHMpLT5zX2JtYXBfbnIgPSBjcHVfdG9fbGUxNiAodmFsKTsgfSB3aGlsZSAoMCkKIAotCiAjZGVmaW5lIFNCX09ORElTS19KUChzKSAoJlNCX1YxX0RJU0tfU1VQRVJfQkxPQ0socyktPnNfam91cm5hbCkKICNkZWZpbmUgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSBcCiAgICAgICAgICBsZTMyX3RvX2NwdSAoKFNCX09ORElTS19KUChzKS0+anBfam91cm5hbF9zaXplKSkKQEAgLTIzMSwyMSArMjI1LDE5IEBACiAgICAgICAgICBibG9jayA+PSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhzKSBcCiAgICAgICAgICAmJiBibG9jayA8IFNCX0pPVVJOQUxfMXN0X1JFU0VSVkVEX0JMT0NLKHMpICsgIFwKICAgICAgICAgICgoIWlzX3JlaXNlcmZzX2pyKFNCX0RJU0tfU1VQRVJfQkxPQ0socykpID8gXAotICAgICAgICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShzKSArIDEgOiBTQl9PTkRJU0tfUkVTRVJWRURfRk9SX0pPVVJOQUwocykpKSAKLQotCisgICAgICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpICsgMSA6IFNCX09ORElTS19SRVNFUlZFRF9GT1JfSk9VUk5BTChzKSkpCiAKIAkJCQkvKiB1c2VkIGJ5IGdjYyAqLwogI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQyAweDUyNjU0OTczCiAJCQkJLyogdXNlZCBieSBmaWxlIHN5c3RlbSB1dGlsaXRpZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rIGF0IHRoZSBzdXBlcmJsb2NrLCBldGMuICovCisJCQkJICAgbG9vayBhdCB0aGUgc3VwZXJibG9jaywgZXRjLiAqLwogI2RlZmluZSBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFckZzIgogI2RlZmluZSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIyRnMiCiAjZGVmaW5lIFJFSVNFUjJGU19KUl9TVVBFUl9NQUdJQ19TVFJJTkcgIlJlSXNFcjNGcyIKIAotaW50IGlzX3JlaXNlcmZzXzNfNSAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpOwotaW50IGlzX3JlaXNlcmZzXzNfNiAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpOwotaW50IGlzX3JlaXNlcmZzX2pyIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyk7CitpbnQgaXNfcmVpc2VyZnNfM181KHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqcnMpOworaW50IGlzX3JlaXNlcmZzXzNfNihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKTsKK2ludCBpc19yZWlzZXJmc19qcihzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzKTsKIAogLyogUmVpc2VyRlMgbGVhdmVzIHRoZSBmaXJzdCA2NGsgdW51c2VkLCBzbyB0aGF0IHBhcnRpdGlvbiBsYWJlbHMgaGF2ZQogICAgZW5vdWdoIHNwYWNlLiAgSWYgc29tZW9uZSB3YW50cyB0byB3cml0ZSBhIGZhbmN5IGJvb3Rsb2FkZXIgdGhhdApAQCAtMjcyLDggKzI2NCw4IEBACiB0eXBlZGVmIF9fbGUzMiB1bnBfdDsKIAogc3RydWN0IHVuZm1fbm9kZWluZm8gewotICAgIHVucF90IHVuZm1fbm9kZW51bTsKLSAgICB1bnNpZ25lZCBzaG9ydCB1bmZtX2ZyZWVzcGFjZTsKKwl1bnBfdCB1bmZtX25vZGVudW07CisJdW5zaWduZWQgc2hvcnQgdW5mbV9mcmVlc3BhY2U7CiB9OwogCiAvKiB0aGVyZSBhcmUgdHdvIGZvcm1hdHMgb2Yga2V5czogMy41IGFuZCAzLjYKQEAgLTI4NSw3ICsyNzcsNiBAQAogI2RlZmluZSBTVEFUX0RBVEFfVjEgMAogI2RlZmluZSBTVEFUX0RBVEFfVjIgMQogCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKlJFSVNFUkZTX0koY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKQEAgLTM0MywxNSArMzM0LDEzIEBACiAgICBmaWxlIHdvdWxkIGZpdCBpbnRvIG9uZSBESVJFQ1QgaXRlbS4KICAgIFByaW1hcnkgaW50ZW50aW9uIGZvciB0aGlzIG9uZSBpcyB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBkZWNyZWFzaW5nCiAgICBzZWVraW5nLgotKi8gICAKKyovCiAjZGVmaW5lIFNUT1JFX1RBSUxfSU5fVU5GTV9TMihuX2ZpbGVfc2l6ZSxuX3RhaWxfc2l6ZSxuX2Jsb2NrX3NpemUpIFwKIChcCiAgICghKG5fdGFpbF9zaXplKSkgfHwgXAogICAoKChuX2ZpbGVfc2l6ZSkgPiBNQVhfRElSRUNUX0lURU1fTEVOKG5fYmxvY2tfc2l6ZSkpICkgXAogKQogCi0KLQogLyoKICAqIHZhbHVlcyBmb3Igc191bW91bnRfc3RhdGUgZmllbGQKICAqLwpAQCAtMzY0LDkgKzM1Myw5IEBACiAjZGVmaW5lIFRZUEVfU1RBVF9EQVRBIDAKICNkZWZpbmUgVFlQRV9JTkRJUkVDVCAxCiAjZGVmaW5lIFRZUEVfRElSRUNUIDIKLSNkZWZpbmUgVFlQRV9ESVJFTlRSWSAzIAotI2RlZmluZSBUWVBFX01BWFRZUEUgMyAKLSNkZWZpbmUgVFlQRV9BTlkgMTUgLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKKyNkZWZpbmUgVFlQRV9ESVJFTlRSWSAzCisjZGVmaW5lIFRZUEVfTUFYVFlQRSAzCisjZGVmaW5lIFRZUEVfQU5ZIDE1CQkvLyBGSVhNRTogY29tbWVudCBpcyByZXF1aXJlZAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgIEtFWSAmIElURU0gSEVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM3Niw2MCArMzY1LDYyIEBACiAvLyBkaXJlY3RvcmllcyB1c2UgdGhpcyBrZXkgYXMgd2VsbCBhcyBvbGQgZmlsZXMKIC8vCiBzdHJ1Y3Qgb2Zmc2V0X3YxIHsKLSAgICBfX2xlMzIga19vZmZzZXQ7Ci0gICAgX19sZTMyIGtfdW5pcXVlbmVzczsKKwlfX2xlMzIga19vZmZzZXQ7CisJX19sZTMyIGtfdW5pcXVlbmVzczsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogc3RydWN0IG9mZnNldF92MiB7CiAJX19sZTY0IHY7CiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKLXN0YXRpYyBpbmxpbmUgX191MTYgb2Zmc2V0X3YyX2tfdHlwZSggY29uc3Qgc3RydWN0IG9mZnNldF92MiAqdjIgKQorc3RhdGljIGlubGluZSBfX3UxNiBvZmZzZXRfdjJfa190eXBlKGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyKQogewogCV9fdTggdHlwZSA9IGxlNjRfdG9fY3B1KHYyLT52KSA+PiA2MDsKLQlyZXR1cm4gKHR5cGUgPD0gVFlQRV9NQVhUWVBFKT90eXBlOlRZUEVfQU5ZOwotfQotIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9vZmZzZXRfdjJfa190eXBlKCBzdHJ1Y3Qgb2Zmc2V0X3YyICp2MiwgaW50IHR5cGUgKQotewotCXYyLT52ID0gKHYyLT52ICYgY3B1X3RvX2xlNjQofjBVTEw+PjQpKSB8IGNwdV90b19sZTY0KChfX3U2NCl0eXBlPDw2MCk7Ci19Ci0gCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBvZmZzZXRfdjJfa19vZmZzZXQoIGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyICkKLXsKLQlyZXR1cm4gbGU2NF90b19jcHUodjItPnYpICYgKH4wVUxMPj40KTsKKwlyZXR1cm4gKHR5cGUgPD0gVFlQRV9NQVhUWVBFKSA/IHR5cGUgOiBUWVBFX0FOWTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9vZmZzZXRfdjJfa19vZmZzZXQoIHN0cnVjdCBvZmZzZXRfdjIgKnYyLCBsb2ZmX3Qgb2Zmc2V0ICl7Ci0Jb2Zmc2V0ICY9ICh+MFVMTD4+NCk7Ci0JdjItPnYgPSAodjItPnYgJiBjcHVfdG9fbGU2NCgxNVVMTDw8NjApKSB8IGNwdV90b19sZTY0KG9mZnNldCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X29mZnNldF92Ml9rX3R5cGUoc3RydWN0IG9mZnNldF92MiAqdjIsIGludCB0eXBlKQoreworCXYyLT52ID0KKwkgICAgKHYyLT52ICYgY3B1X3RvX2xlNjQofjBVTEwgPj4gNCkpIHwgY3B1X3RvX2xlNjQoKF9fdTY0KSB0eXBlIDw8IDYwKTsKK30KKworc3RhdGljIGlubGluZSBsb2ZmX3Qgb2Zmc2V0X3YyX2tfb2Zmc2V0KGNvbnN0IHN0cnVjdCBvZmZzZXRfdjIgKnYyKQoreworCXJldHVybiBsZTY0X3RvX2NwdSh2Mi0+dikgJiAofjBVTEwgPj4gNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfb2Zmc2V0X3YyX2tfb2Zmc2V0KHN0cnVjdCBvZmZzZXRfdjIgKnYyLCBsb2ZmX3Qgb2Zmc2V0KQoreworCW9mZnNldCAmPSAofjBVTEwgPj4gNCk7CisJdjItPnYgPSAodjItPnYgJiBjcHVfdG9fbGU2NCgxNVVMTCA8PCA2MCkpIHwgY3B1X3RvX2xlNjQob2Zmc2V0KTsKIH0KIAogLyogS2V5IG9mIGFuIGl0ZW0gZGV0ZXJtaW5lcyBpdHMgbG9jYXRpb24gaW4gdGhlIFMrdHJlZSwgYW5kCiAgICBpcyBjb21wb3NlZCBvZiA0IGNvbXBvbmVudHMgKi8KIHN0cnVjdCByZWlzZXJmc19rZXkgewotICAgIF9fbGUzMiBrX2Rpcl9pZDsgICAgLyogcGFja2luZyBsb2NhbGl0eTogYnkgZGVmYXVsdCBwYXJlbnQKLQkJCSAgZGlyZWN0b3J5IG9iamVjdCBpZCAqLwotICAgIF9fbGUzMiBrX29iamVjdGlkOyAgLyogb2JqZWN0IGlkZW50aWZpZXIgKi8KLSAgICB1bmlvbiB7Ci0Jc3RydWN0IG9mZnNldF92MSBrX29mZnNldF92MTsKLQlzdHJ1Y3Qgb2Zmc2V0X3YyIGtfb2Zmc2V0X3YyOwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworCV9fbGUzMiBrX2Rpcl9pZDsJLyogcGFja2luZyBsb2NhbGl0eTogYnkgZGVmYXVsdCBwYXJlbnQKKwkJCQkgICBkaXJlY3Rvcnkgb2JqZWN0IGlkICovCisJX19sZTMyIGtfb2JqZWN0aWQ7CS8qIG9iamVjdCBpZGVudGlmaWVyICovCisJdW5pb24geworCQlzdHJ1Y3Qgb2Zmc2V0X3YxIGtfb2Zmc2V0X3YxOworCQlzdHJ1Y3Qgb2Zmc2V0X3YyIGtfb2Zmc2V0X3YyOworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OwogfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwogCiBzdHJ1Y3QgaW5fY29yZV9rZXkgewotICAgIF9fdTMyIGtfZGlyX2lkOyAgICAvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudAotCQkJICBkaXJlY3Rvcnkgb2JqZWN0IGlkICovCi0gICAgX191MzIga19vYmplY3RpZDsgIC8qIG9iamVjdCBpZGVudGlmaWVyICovCi0gICAgX191NjQga19vZmZzZXQ7Ci0gICAgX191OCBrX3R5cGU7CisJX191MzIga19kaXJfaWQ7CQkvKiBwYWNraW5nIGxvY2FsaXR5OiBieSBkZWZhdWx0IHBhcmVudAorCQkJCSAgIGRpcmVjdG9yeSBvYmplY3QgaWQgKi8KKwlfX3UzMiBrX29iamVjdGlkOwkvKiBvYmplY3QgaWRlbnRpZmllciAqLworCV9fdTY0IGtfb2Zmc2V0OworCV9fdTgga190eXBlOwogfTsKIAogc3RydWN0IGNwdV9rZXkgewotICAgIHN0cnVjdCBpbl9jb3JlX2tleSBvbl9kaXNrX2tleTsKLSAgICBpbnQgdmVyc2lvbjsKLSAgICBpbnQga2V5X2xlbmd0aDsgLyogMyBpbiBhbGwgY2FzZXMgYnV0IGRpcmVjdDJpbmRpcmVjdCBhbmQKLQkJICAgICAgIGluZGlyZWN0MmRpcmVjdCBjb252ZXJzaW9uICovCisJc3RydWN0IGluX2NvcmVfa2V5IG9uX2Rpc2tfa2V5OworCWludCB2ZXJzaW9uOworCWludCBrZXlfbGVuZ3RoOwkJLyogMyBpbiBhbGwgY2FzZXMgYnV0IGRpcmVjdDJpbmRpcmVjdCBhbmQKKwkJCQkgICBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiAqLwogfTsKIAogLyogT3VyIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcga2V5cyBjYW4gY29tcGFyZSBrZXlzIG9mIGRpZmZlcmVudApAQCAtNDc1LDggKzQ2Niw3IEBACiAgICAgaW5kaXJlY3QgaXRlbXMpIGFuZCBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBpdGVtIGl0c2VsZgogICAgIHdpdGhpbiB0aGUgYmxvY2suICAqLwogCi1zdHJ1Y3QgaXRlbV9oZWFkCi17CitzdHJ1Y3QgaXRlbV9oZWFkIHsKIAkvKiBFdmVyeXRoaW5nIGluIHRoZSB0cmVlIGlzIGZvdW5kIGJ5IHNlYXJjaGluZyBmb3IgaXQgYmFzZWQgb24KIAkgKiBpdHMga2V5LiovCiAJc3RydWN0IHJlaXNlcmZzX2tleSBpaF9rZXk7CkBAIC00OTIsMTMgKzQ4MiwxMyBAQAogCQkgICBudW1iZXIgb2YgZGlyZWN0b3J5IGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtLiAqLwogCQlfX2xlMTYgaWhfZW50cnlfY291bnQ7CiAJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHU7Ci0JX19sZTE2IGloX2l0ZW1fbGVuOyAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiB0aGUgaXRlbSBib2R5ICovCi0JX19sZTE2IGloX2l0ZW1fbG9jYXRpb247ICAgICAgLyogYW4gb2Zmc2V0IHRvIHRoZSBpdGVtIGJvZHkKLQkJCQkgICAgICAqIHdpdGhpbiB0aGUgYmxvY2sgKi8KLQlfX2xlMTYgaWhfdmVyc2lvbjsJICAgICAvKiAwIGZvciBhbGwgb2xkIGl0ZW1zLCAyIGZvciBuZXcKLQkJCQkJb25lcy4gSGlnaGVzdCBiaXQgaXMgc2V0IGJ5IGZzY2sKLQkJCQkJdGVtcG9yYXJ5LCBjbGVhbmVkIGFmdGVyIGFsbAotCQkJCQlkb25lICovCisJX19sZTE2IGloX2l0ZW1fbGVuOwkvKiB0b3RhbCBzaXplIG9mIHRoZSBpdGVtIGJvZHkgKi8KKwlfX2xlMTYgaWhfaXRlbV9sb2NhdGlvbjsJLyogYW4gb2Zmc2V0IHRvIHRoZSBpdGVtIGJvZHkKKwkJCQkJICogd2l0aGluIHRoZSBibG9jayAqLworCV9fbGUxNiBpaF92ZXJzaW9uOwkvKiAwIGZvciBhbGwgb2xkIGl0ZW1zLCAyIGZvciBuZXcKKwkJCQkgICBvbmVzLiBIaWdoZXN0IGJpdCBpcyBzZXQgYnkgZnNjaworCQkJCSAgIHRlbXBvcmFyeSwgY2xlYW5lZCBhZnRlciBhbGwKKwkJCQkgICBkb25lICovCiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAvKiBzaXplIG9mIGl0ZW0gaGVhZGVyICAgICAqLwogI2RlZmluZSBJSF9TSVpFIChzaXplb2Yoc3RydWN0IGl0ZW1faGVhZCkpCkBAIC01MTUsNyArNTA1LDYgQEAKICNkZWZpbmUgcHV0X2loX2xvY2F0aW9uKGloLCB2YWwpICAgICBkbyB7IChpaCktPmloX2l0ZW1fbG9jYXRpb24gPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogI2RlZmluZSBwdXRfaWhfaXRlbV9sZW4oaWgsIHZhbCkgICAgIGRvIHsgKGloKS0+aWhfaXRlbV9sZW4gPSBjcHVfdG9fbGUxNih2YWwpOyB9IHdoaWxlICgwKQogCi0KICNkZWZpbmUgdW5yZWFjaGFibGVfaXRlbShpaCkgKGloX3ZlcnNpb24oaWgpICYgKDEgPDwgMTUpKQogCiAjZGVmaW5lIGdldF9paF9mcmVlX3NwYWNlKGloKSAoaWhfdmVyc2lvbiAoaWgpID09IEtFWV9GT1JNQVRfM182ID8gMCA6IGloX2ZyZWVfc3BhY2UgKGloKSkKQEAgLTUzNyw0MCArNTI2LDQ4IEBACiAjZGVmaW5lIFYxX0lORElSRUNUX1VOSVFVRU5FU1MgMHhmZmZmZmZmZQogI2RlZmluZSBWMV9ESVJFQ1RfVU5JUVVFTkVTUyAweGZmZmZmZmZmCiAjZGVmaW5lIFYxX0RJUkVOVFJZX1VOSVFVRU5FU1MgNTAwCi0jZGVmaW5lIFYxX0FOWV9VTklRVUVORVNTIDU1NSAvLyBGSVhNRTogY29tbWVudCBpcyByZXF1aXJlZAorI2RlZmluZSBWMV9BTllfVU5JUVVFTkVTUyA1NTUJLy8gRklYTUU6IGNvbW1lbnQgaXMgcmVxdWlyZWQKIAogLy8KIC8vIGhlcmUgYXJlIGNvbnZlcnNpb24gcm91dGluZXMKIC8vCi1zdGF0aWMgaW5saW5lIGludCB1bmlxdWVuZXNzMnR5cGUgKF9fdTMyIHVuaXF1ZW5lc3MpIENPTlNURjsKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXF1ZW5lc3MydHlwZSAoX191MzIgdW5pcXVlbmVzcykKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXF1ZW5lc3MydHlwZShfX3UzMiB1bmlxdWVuZXNzKSBDT05TVEY7CitzdGF0aWMgaW5saW5lIGludCB1bmlxdWVuZXNzMnR5cGUoX191MzIgdW5pcXVlbmVzcykKIHsKLSAgICBzd2l0Y2ggKChpbnQpdW5pcXVlbmVzcykgewotICAgIGNhc2UgVjFfU0RfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfU1RBVF9EQVRBOwotICAgIGNhc2UgVjFfSU5ESVJFQ1RfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfSU5ESVJFQ1Q7Ci0gICAgY2FzZSBWMV9ESVJFQ1RfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfRElSRUNUOwotICAgIGNhc2UgVjFfRElSRU5UUllfVU5JUVVFTkVTUzogcmV0dXJuIFRZUEVfRElSRU5UUlk7Ci0gICAgZGVmYXVsdDoKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTUwMDogdW5rbm93biB1bmlxdWVuZXNzICVkIiwKLQkJCSAgICAgIHVuaXF1ZW5lc3MpOworCXN3aXRjaCAoKGludCl1bmlxdWVuZXNzKSB7CisJY2FzZSBWMV9TRF9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9TVEFUX0RBVEE7CisJY2FzZSBWMV9JTkRJUkVDVF9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9JTkRJUkVDVDsKKwljYXNlIFYxX0RJUkVDVF9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9ESVJFQ1Q7CisJY2FzZSBWMV9ESVJFTlRSWV9VTklRVUVORVNTOgorCQlyZXR1cm4gVFlQRV9ESVJFTlRSWTsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJ2cy01MDA6IHVua25vd24gdW5pcXVlbmVzcyAlZCIsCisJCQkJIHVuaXF1ZW5lc3MpOwogCWNhc2UgVjFfQU5ZX1VOSVFVRU5FU1M6Ci0JICAgIHJldHVybiBUWVBFX0FOWTsKLSAgICB9CisJCXJldHVybiBUWVBFX0FOWTsKKwl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgX191MzIgdHlwZTJ1bmlxdWVuZXNzIChpbnQgdHlwZSkgQ09OU1RGOwotc3RhdGljIGlubGluZSBfX3UzMiB0eXBlMnVuaXF1ZW5lc3MgKGludCB0eXBlKQorc3RhdGljIGlubGluZSBfX3UzMiB0eXBlMnVuaXF1ZW5lc3MoaW50IHR5cGUpIENPTlNURjsKK3N0YXRpYyBpbmxpbmUgX191MzIgdHlwZTJ1bmlxdWVuZXNzKGludCB0eXBlKQogewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVFlQRV9TVEFUX0RBVEE6IHJldHVybiBWMV9TRF9VTklRVUVORVNTOwotICAgIGNhc2UgVFlQRV9JTkRJUkVDVDogcmV0dXJuIFYxX0lORElSRUNUX1VOSVFVRU5FU1M7Ci0gICAgY2FzZSBUWVBFX0RJUkVDVDogcmV0dXJuIFYxX0RJUkVDVF9VTklRVUVORVNTOwotICAgIGNhc2UgVFlQRV9ESVJFTlRSWTogcmV0dXJuIFYxX0RJUkVOVFJZX1VOSVFVRU5FU1M7Ci0gICAgZGVmYXVsdDoKLQkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTUwMTogdW5rbm93biB0eXBlICVkIiwgdHlwZSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBUWVBFX1NUQVRfREFUQToKKwkJcmV0dXJuIFYxX1NEX1VOSVFVRU5FU1M7CisJY2FzZSBUWVBFX0lORElSRUNUOgorCQlyZXR1cm4gVjFfSU5ESVJFQ1RfVU5JUVVFTkVTUzsKKwljYXNlIFRZUEVfRElSRUNUOgorCQlyZXR1cm4gVjFfRElSRUNUX1VOSVFVRU5FU1M7CisJY2FzZSBUWVBFX0RJUkVOVFJZOgorCQlyZXR1cm4gVjFfRElSRU5UUllfVU5JUVVFTkVTUzsKKwlkZWZhdWx0OgorCQlyZWlzZXJmc193YXJuaW5nKE5VTEwsICJ2cy01MDE6IHVua25vd24gdHlwZSAlZCIsIHR5cGUpOwogCWNhc2UgVFlQRV9BTlk6Ci0JICAgIHJldHVybiBWMV9BTllfVU5JUVVFTkVTUzsKLSAgICB9CisJCXJldHVybiBWMV9BTllfVU5JUVVFTkVTUzsKKwl9CiB9CiAKIC8vCkBAIC01NzgsNTcgKzU3NSw1NiBAQAogLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB2ZXJzaW9uIG9mIG9iamVjdCBmcm9tIGtleSwgc28sIHByb3ZpZGUKIC8vIHZlcnNpb24gdG8gdGhlc2UgZGVmaW5lcwogLy8KLXN0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2tleV9rX29mZnNldCAoaW50IHZlcnNpb24sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9rZXlfa19vZmZzZXQoaW50IHZlcnNpb24sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgIGxlMzJfdG9fY3B1KCBrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQgKSA6Ci0Jb2Zmc2V0X3YyX2tfb2Zmc2V0KCAmKGtleS0+dS5rX29mZnNldF92MikgKTsKKwlyZXR1cm4gKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8KKwkgICAgbGUzMl90b19jcHUoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0KSA6CisJICAgIG9mZnNldF92Ml9rX29mZnNldCgmKGtleS0+dS5rX29mZnNldF92MikpOwogfQogCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9paF9rX29mZnNldCAoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIGloKQorc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfaWhfa19vZmZzZXQoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqaWgpCiB7Ci0gICAgcmV0dXJuIGxlX2tleV9rX29mZnNldCAoaWhfdmVyc2lvbiAoaWgpLCAmKGloLT5paF9rZXkpKTsKKwlyZXR1cm4gbGVfa2V5X2tfb2Zmc2V0KGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpKTsKIH0KIAotc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfa2V5X2tfdHlwZSAoaW50IHZlcnNpb24sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBsZV9rZXlfa190eXBlKGludCB2ZXJzaW9uLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICprZXkpCiB7Ci0gICAgcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgIHVuaXF1ZW5lc3MydHlwZSggbGUzMl90b19jcHUoIGtleS0+dS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MpKSA6Ci0Jb2Zmc2V0X3YyX2tfdHlwZSggJihrZXktPnUua19vZmZzZXRfdjIpICk7CisJcmV0dXJuICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/CisJICAgIHVuaXF1ZW5lc3MydHlwZShsZTMyX3RvX2NwdShrZXktPnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzKSkgOgorCSAgICBvZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9mZl90IGxlX2loX2tfdHlwZSAoY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIGloKQorc3RhdGljIGlubGluZSBsb2ZmX3QgbGVfaWhfa190eXBlKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKmloKQogewotICAgIHJldHVybiBsZV9rZXlfa190eXBlIChpaF92ZXJzaW9uIChpaCksICYoaWgtPmloX2tleSkpOworCXJldHVybiBsZV9rZXlfa190eXBlKGloX3ZlcnNpb24oaWgpLCAmKGloLT5paF9rZXkpKTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX29mZnNldCAoaW50IHZlcnNpb24sIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIGxvZmZfdCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX29mZnNldChpbnQgdmVyc2lvbiwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgICBsb2ZmX3Qgb2Zmc2V0KQogewotICAgICh2ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSA/Ci0gICAgICAgICh2b2lkKShrZXktPnUua19vZmZzZXRfdjEua19vZmZzZXQgPSBjcHVfdG9fbGUzMiAob2Zmc2V0KSkgOiAvKiBqZG0gY2hlY2sgKi8KLQkodm9pZCkoc2V0X29mZnNldF92Ml9rX29mZnNldCggJihrZXktPnUua19vZmZzZXRfdjIpLCBvZmZzZXQgKSk7CisJKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8gKHZvaWQpKGtleS0+dS5rX29mZnNldF92MS5rX29mZnNldCA9IGNwdV90b19sZTMyKG9mZnNldCkpIDoJLyogamRtIGNoZWNrICovCisJICAgICh2b2lkKShzZXRfb2Zmc2V0X3YyX2tfb2Zmc2V0KCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgb2Zmc2V0KSk7CiB9CiAKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX29mZnNldCAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBsb2ZmX3Qgb2Zmc2V0KQorc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX29mZnNldChzdHJ1Y3QgaXRlbV9oZWFkICppaCwgbG9mZl90IG9mZnNldCkKIHsKLSAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChpaF92ZXJzaW9uIChpaCksICYoaWgtPmloX2tleSksIG9mZnNldCk7CisJc2V0X2xlX2tleV9rX29mZnNldChpaF92ZXJzaW9uKGloKSwgJihpaC0+aWhfa2V5KSwgb2Zmc2V0KTsKIH0KIAotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2tleV9rX3R5cGUgKGludCB2ZXJzaW9uLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbGVfa2V5X2tfdHlwZShpbnQgdmVyc2lvbiwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5LAorCQkJCSAgICAgaW50IHR5cGUpCiB7Ci0gICAgKHZlcnNpb24gPT0gS0VZX0ZPUk1BVF8zXzUpID8KLSAgICAgICAgKHZvaWQpKGtleS0+dS5rX29mZnNldF92MS5rX3VuaXF1ZW5lc3MgPSBjcHVfdG9fbGUzMih0eXBlMnVuaXF1ZW5lc3ModHlwZSkpKToKLQkodm9pZCkoc2V0X29mZnNldF92Ml9rX3R5cGUoICYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgdHlwZSApKTsKKwkodmVyc2lvbiA9PSBLRVlfRk9STUFUXzNfNSkgPworCSAgICAodm9pZCkoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyA9CisJCSAgIGNwdV90b19sZTMyKHR5cGUydW5pcXVlbmVzcyh0eXBlKSkpCisJICAgIDogKHZvaWQpKHNldF9vZmZzZXRfdjJfa190eXBlKCYoa2V5LT51Lmtfb2Zmc2V0X3YyKSwgdHlwZSkpOwogfQotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZV9paF9rX3R5cGUgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xlX2loX2tfdHlwZShzdHJ1Y3QgaXRlbV9oZWFkICppaCwgaW50IHR5cGUpCiB7Ci0gICAgc2V0X2xlX2tleV9rX3R5cGUgKGloX3ZlcnNpb24gKGloKSwgJihpaC0+aWhfa2V5KSwgdHlwZSk7CisJc2V0X2xlX2tleV9rX3R5cGUoaWhfdmVyc2lvbihpaCksICYoaWgtPmloX2tleSksIHR5cGUpOwogfQogCi0KICNkZWZpbmUgaXNfZGlyZW50cnlfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVOVFJZKQogI2RlZmluZSBpc19kaXJlY3RfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVDVCkKICNkZWZpbmUgaXNfaW5kaXJlY3RfbGVfa2V5KHZlcnNpb24sa2V5KSAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0lORElSRUNUKQpAQCAtNjQyLDM0ICs2MzgsMzIgQEAKICNkZWZpbmUgaXNfaW5kaXJlY3RfbGVfaWgoaWgpIGlzX2luZGlyZWN0X2xlX2tleSAoaWhfdmVyc2lvbihpaCksICYoKGloKS0+aWhfa2V5KSkKICNkZWZpbmUgaXNfc3RhdGRhdGFfbGVfaWgoaWgpIGlzX3N0YXRkYXRhX2xlX2tleSAoaWhfdmVyc2lvbiAoaWgpLCAmKChpaCktPmloX2tleSkpCiAKLQotCiAvLwogLy8ga2V5IGlzIHBvaW50ZXIgdG8gY3B1IGtleSwgcmVzdWx0IGlzIGNwdQogLy8KLXN0YXRpYyBpbmxpbmUgbG9mZl90IGNwdV9rZXlfa19vZmZzZXQgKGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5KQorc3RhdGljIGlubGluZSBsb2ZmX3QgY3B1X2tleV9rX29mZnNldChjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIHJldHVybiBrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0OworCXJldHVybiBrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0OwogfQogCi1zdGF0aWMgaW5saW5lIGxvZmZfdCBjcHVfa2V5X2tfdHlwZSAoY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXkpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBjcHVfa2V5X2tfdHlwZShjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotICAgIHJldHVybiBrZXktPm9uX2Rpc2tfa2V5LmtfdHlwZTsKKwlyZXR1cm4ga2V5LT5vbl9kaXNrX2tleS5rX3R5cGU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1X2tleV9rX29mZnNldCAoc3RydWN0IGNwdV9rZXkgKiBrZXksIGxvZmZfdCBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa19vZmZzZXQoc3RydWN0IGNwdV9rZXkgKmtleSwgbG9mZl90IG9mZnNldCkKIHsKIAlrZXktPm9uX2Rpc2tfa2V5Lmtfb2Zmc2V0ID0gb2Zmc2V0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa190eXBlIChzdHJ1Y3QgY3B1X2tleSAqIGtleSwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9rZXlfa190eXBlKHN0cnVjdCBjcHVfa2V5ICprZXksIGludCB0eXBlKQogewogCWtleS0+b25fZGlza19rZXkua190eXBlID0gdHlwZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGNwdV9rZXlfa19vZmZzZXRfZGVjIChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfa2V5X2tfb2Zmc2V0X2RlYyhzdHJ1Y3QgY3B1X2tleSAqa2V5KQogewotCWtleS0+b25fZGlza19rZXkua19vZmZzZXQgLS07CisJa2V5LT5vbl9kaXNrX2tleS5rX29mZnNldC0tOwogfQogCiAjZGVmaW5lIGlzX2RpcmVudHJ5X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFTlRSWSkKQEAgLTY3NywzNCArNjcxLDI1IEBACiAjZGVmaW5lIGlzX2luZGlyZWN0X2NwdV9rZXkoa2V5KSAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9JTkRJUkVDVCkKICNkZWZpbmUgaXNfc3RhdGRhdGFfY3B1X2tleShrZXkpIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX1NUQVRfREFUQSkKIAotCiAvKiBhcmUgdGhlc2UgdXNlZCA/ICovCiAjZGVmaW5lIGlzX2RpcmVudHJ5X2NwdV9paChpaCkgKGlzX2RpcmVudHJ5X2NwdV9rZXkgKCYoKGloKS0+aWhfa2V5KSkpCiAjZGVmaW5lIGlzX2RpcmVjdF9jcHVfaWgoaWgpIChpc19kaXJlY3RfY3B1X2tleSAoJigoaWgpLT5paF9rZXkpKSkKICNkZWZpbmUgaXNfaW5kaXJlY3RfY3B1X2loKGloKSAoaXNfaW5kaXJlY3RfY3B1X2tleSAoJigoaWgpLT5paF9rZXkpKSkKICNkZWZpbmUgaXNfc3RhdGRhdGFfY3B1X2loKGloKSAoaXNfc3RhdGRhdGFfY3B1X2tleSAoJigoaWgpLT5paF9rZXkpKSkKIAotCi0KLQotCiAjZGVmaW5lIElfS19LRVlfSU5fSVRFTShwX3NfaWgsIHBfc19rZXksIG5fYmxvY2tzaXplKSBcCiAgICAgKCAhIENPTVBfU0hPUlRfS0VZUyhwX3NfaWgsIHBfc19rZXkpICYmIFwKICAgICAgICAgICBJX09GRl9CWVRFX0lOX0lURU0ocF9zX2loLCBrX29mZnNldCAocF9zX2tleSksIG5fYmxvY2tzaXplKSApCiAKLS8qIG1heGltYWwgbGVuZ3RoIG9mIGl0ZW0gKi8gCisvKiBtYXhpbWFsIGxlbmd0aCBvZiBpdGVtICovCiAjZGVmaW5lIE1BWF9JVEVNX0xFTihibG9ja19zaXplKSAoYmxvY2tfc2l6ZSAtIEJMS0hfU0laRSAtIElIX1NJWkUpCiAjZGVmaW5lIE1JTl9JVEVNX0xFTiAxCiAKLQogLyogb2JqZWN0IGlkZW50aWZpZXIgZm9yIHJvb3QgZGlyICovCiAjZGVmaW5lIFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQgMgogI2RlZmluZSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRCAxCiBleHRlcm4gc3RydWN0IHJlaXNlcmZzX2tleSByb290X2tleTsKIAotCi0KLQogLyogCiAgKiBQaWN0dXJlIHJlcHJlc2VudHMgYSBsZWFmIG9mIHRoZSBTK3RyZWUKICAqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQEAgLTcxNiwxMyArNzAxLDEzIEBACiAKIC8qIEhlYWRlciBvZiBhIGRpc2sgYmxvY2suICBNb3JlIHByZWNpc2VseSwgaGVhZGVyIG9mIGEgZm9ybWF0dGVkIGxlYWYKICAgIG9yIGludGVybmFsIG5vZGUsIGFuZCBub3QgdGhlIGhlYWRlciBvZiBhbiB1bmZvcm1hdHRlZCBub2RlLiAqLwotc3RydWN0IGJsb2NrX2hlYWQgeyAgICAgICAKLSAgX19sZTE2IGJsa19sZXZlbDsgICAgICAgIC8qIExldmVsIG9mIGEgYmxvY2sgaW4gdGhlIHRyZWUuICovCi0gIF9fbGUxNiBibGtfbnJfaXRlbTsgICAgICAvKiBOdW1iZXIgb2Yga2V5cy9pdGVtcyBpbiBhIGJsb2NrLiAqLwotICBfX2xlMTYgYmxrX2ZyZWVfc3BhY2U7ICAgLyogQmxvY2sgZnJlZSBzcGFjZSBpbiBieXRlcy4gKi8KLSAgX19sZTE2IGJsa19yZXNlcnZlZDsKLQkJCQkvKiBkdW1wIHRoaXMgaW4gdjQvcGxhbkEgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2tleSAgYmxrX3JpZ2h0X2RlbGltX2tleTsgLyoga2VwdCBvbmx5IGZvciBjb21wYXRpYmlsaXR5ICovCitzdHJ1Y3QgYmxvY2tfaGVhZCB7CisJX19sZTE2IGJsa19sZXZlbDsJLyogTGV2ZWwgb2YgYSBibG9jayBpbiB0aGUgdHJlZS4gKi8KKwlfX2xlMTYgYmxrX25yX2l0ZW07CS8qIE51bWJlciBvZiBrZXlzL2l0ZW1zIGluIGEgYmxvY2suICovCisJX19sZTE2IGJsa19mcmVlX3NwYWNlOwkvKiBCbG9jayBmcmVlIHNwYWNlIGluIGJ5dGVzLiAqLworCV9fbGUxNiBibGtfcmVzZXJ2ZWQ7CisJLyogZHVtcCB0aGlzIGluIHY0L3BsYW5BICovCisJc3RydWN0IHJlaXNlcmZzX2tleSBibGtfcmlnaHRfZGVsaW1fa2V5OwkvKiBrZXB0IG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgKi8KIH07CiAKICNkZWZpbmUgQkxLSF9TSVpFICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihzdHJ1Y3QgYmxvY2tfaGVhZCkpCkBAIC03NDEsMTIgKzcyNiwxMiBAQAogICogdmFsdWVzIGZvciBibGtfbGV2ZWwgZmllbGQgb2YgdGhlIHN0cnVjdCBibG9ja19oZWFkCiAgKi8KIAotI2RlZmluZSBGUkVFX0xFVkVMIDAgLyogd2hlbiBub2RlIGdldHMgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlIGl0cwotCQkJYmxrX2xldmVsIGlzIHNldCB0byBGUkVFX0xFVkVMLiBJdCBpcyB0aGVuCi0JCQl1c2VkIHRvIHNlZSB3aGV0aGVyIHRoZSBub2RlIGlzIHN0aWxsIGluIHRoZQotCQkJdHJlZSAqLworI2RlZmluZSBGUkVFX0xFVkVMIDAJCS8qIHdoZW4gbm9kZSBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgdHJlZSBpdHMKKwkJCQkgICBibGtfbGV2ZWwgaXMgc2V0IHRvIEZSRUVfTEVWRUwuIEl0IGlzIHRoZW4KKwkJCQkgICB1c2VkIHRvIHNlZSB3aGV0aGVyIHRoZSBub2RlIGlzIHN0aWxsIGluIHRoZQorCQkJCSAgIHRyZWUgKi8KIAotI2RlZmluZSBESVNLX0xFQUZfTk9ERV9MRVZFTCAgMSAvKiBMZWFmIG5vZGUgbGV2ZWwuKi8KKyNkZWZpbmUgRElTS19MRUFGX05PREVfTEVWRUwgIDEJLyogTGVhZiBub2RlIGxldmVsLiAqLwogCiAvKiBHaXZlbiB0aGUgYnVmZmVyIGhlYWQgb2YgYSBmb3JtYXR0ZWQgbm9kZSwgcmVzb2x2ZSB0byB0aGUgYmxvY2sgaGVhZCBvZiB0aGF0IG5vZGUuICovCiAjZGVmaW5lIEJfQkxLX0hFQUQocF9zX2JoKSAgICAgICAgICAgICgoc3RydWN0IGJsb2NrX2hlYWQgKikoKHBfc19iaCktPmJfZGF0YSkpCkBAIC03NTksNyArNzQ0LDYgQEAKICNkZWZpbmUgUFVUX0JfTEVWRUwocF9zX2JoLHZhbCkgICAgICAgZG8geyBzZXRfYmxraF9sZXZlbChCX0JMS19IRUFEKHBfc19iaCksdmFsKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgUFVUX0JfRlJFRV9TUEFDRShwX3NfYmgsdmFsKSAgZG8geyBzZXRfYmxraF9mcmVlX3NwYWNlKEJfQkxLX0hFQUQocF9zX2JoKSx2YWwpOyB9IHdoaWxlICgwKQogCi0KIC8qIEdldCByaWdodCBkZWxpbWl0aW5nIGtleS4gLS0gbGl0dGxlIGVuZGlhbiAqLwogI2RlZmluZSBCX1BSSUdIVF9ERUxJTV9LRVkocF9zX2JoKSAgICgmKGJsa19yaWdodF9kZWxpbV9rZXkoQl9CTEtfSEVBRChwX3NfYmgpKQogCkBAIC03NzAsNDEgKzc1NCwzNiBAQAogI2RlZmluZSBCX0lTX0tFWVNfTEVWRUwocF9zX2JoKSAgICAgIChCX0xFVkVMKHBfc19iaCkgPiBESVNLX0xFQUZfTk9ERV9MRVZFTCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEJfTEVWRUwocF9zX2JoKSA8PSBNQVhfSEVJR0hUKQogCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVQgREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLy8KIC8vIG9sZCBzdGF0IGRhdGEgaXMgMzIgYnl0ZXMgbG9uZy4gV2UgYXJlIGdvaW5nIHRvIGRpc3Rpbmd1aXNoIG5ldyBvbmUgYnkKIC8vIGRpZmZlcmVudCBzaXplCiAvLwotc3RydWN0IHN0YXRfZGF0YV92MQotewotICAgIF9fbGUxNiBzZF9tb2RlOwkvKiBmaWxlIHR5cGUsIHBlcm1pc3Npb25zICovCi0gICAgX19sZTE2IHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLwotICAgIF9fbGUxNiBzZF91aWQ7CQkvKiBvd25lciAqLwotICAgIF9fbGUxNiBzZF9naWQ7CQkvKiBncm91cCAqLwotICAgIF9fbGUzMiBzZF9zaXplOwkvKiBmaWxlIHNpemUgKi8KLSAgICBfX2xlMzIgc2RfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgICBfX2xlMzIgc2RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAgKi8KLSAgICBfX2xlMzIgc2RfY3RpbWU7CS8qIHRpbWUgaW5vZGUgKHN0YXQgZGF0YSkgd2FzIGxhc3QgY2hhbmdlZCAoZXhjZXB0IGNoYW5nZXMgdG8gc2RfYXRpbWUgYW5kIHNkX210aW1lKSAqLwotICAgIHVuaW9uIHsKLQlfX2xlMzIgc2RfcmRldjsKLQlfX2xlMzIgc2RfYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzIGZpbGUgdXNlcyAqLwotICAgIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OwotICAgIF9fbGUzMiBzZF9maXJzdF9kaXJlY3RfYnl0ZTsgLyogZmlyc3QgYnl0ZSBvZiBmaWxlIHdoaWNoIGlzIHN0b3JlZAotCQkJCSAgIGluIGEgZGlyZWN0IGl0ZW06IGV4Y2VwdCB0aGF0IGlmIGl0Ci0JCQkJICAgZXF1YWxzIDEgaXQgaXMgYSBzeW1saW5rIGFuZCBpZiBpdAotCQkJCSAgIGVxdWFscyB+KF9fdTMyKTAgdGhlcmUgaXMgbm8KLQkJCQkgICBkaXJlY3QgaXRlbS4gIFRoZSBleGlzdGVuY2Ugb2YgdGhpcwotCQkJCSAgIGZpZWxkIHJlYWxseSBncmF0ZXMgb24gbWUuIExldCdzCi0JCQkJICAgcmVwbGFjZSBpdCB3aXRoIGEgbWFjcm8gYmFzZWQgb24KLQkJCQkgICBzZF9zaXplIGFuZCBvdXIgdGFpbCBzdXBwcmVzc2lvbgotCQkJCSAgIHBvbGljeS4gIFNvbWVkYXkuICAtSGFucyAqLworc3RydWN0IHN0YXRfZGF0YV92MSB7CisJX19sZTE2IHNkX21vZGU7CQkvKiBmaWxlIHR5cGUsIHBlcm1pc3Npb25zICovCisJX19sZTE2IHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLworCV9fbGUxNiBzZF91aWQ7CQkvKiBvd25lciAqLworCV9fbGUxNiBzZF9naWQ7CQkvKiBncm91cCAqLworCV9fbGUzMiBzZF9zaXplOwkJLyogZmlsZSBzaXplICovCisJX19sZTMyIHNkX2F0aW1lOwkvKiB0aW1lIG9mIGxhc3QgYWNjZXNzICovCisJX19sZTMyIHNkX210aW1lOwkvKiB0aW1lIGZpbGUgd2FzIGxhc3QgbW9kaWZpZWQgICovCisJX19sZTMyIHNkX2N0aW1lOwkvKiB0aW1lIGlub2RlIChzdGF0IGRhdGEpIHdhcyBsYXN0IGNoYW5nZWQgKGV4Y2VwdCBjaGFuZ2VzIHRvIHNkX2F0aW1lIGFuZCBzZF9tdGltZSkgKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBzZF9yZGV2OworCQlfX2xlMzIgc2RfYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzIGZpbGUgdXNlcyAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworCV9fbGUzMiBzZF9maXJzdF9kaXJlY3RfYnl0ZTsJLyogZmlyc3QgYnl0ZSBvZiBmaWxlIHdoaWNoIGlzIHN0b3JlZAorCQkJCQkgICBpbiBhIGRpcmVjdCBpdGVtOiBleGNlcHQgdGhhdCBpZiBpdAorCQkJCQkgICBlcXVhbHMgMSBpdCBpcyBhIHN5bWxpbmsgYW5kIGlmIGl0CisJCQkJCSAgIGVxdWFscyB+KF9fdTMyKTAgdGhlcmUgaXMgbm8KKwkJCQkJICAgZGlyZWN0IGl0ZW0uICBUaGUgZXhpc3RlbmNlIG9mIHRoaXMKKwkJCQkJICAgZmllbGQgcmVhbGx5IGdyYXRlcyBvbiBtZS4gTGV0J3MKKwkJCQkJICAgcmVwbGFjZSBpdCB3aXRoIGEgbWFjcm8gYmFzZWQgb24KKwkJCQkJICAgc2Rfc2l6ZSBhbmQgb3VyIHRhaWwgc3VwcHJlc3Npb24KKwkJCQkJICAgcG9saWN5LiAgU29tZWRheS4gIC1IYW5zICovCiB9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CiAKICNkZWZpbmUgU0RfVjFfU0laRSAgICAgICAgICAgICAgKHNpemVvZihzdHJ1Y3Qgc3RhdF9kYXRhX3YxKSkKQEAgLTg2MiwyOSArODQxLDI5IEBACiAvKiBTdGF0IERhdGEgb24gZGlzayAocmVpc2VyZnMgdmVyc2lvbiBvZiBVRlMgZGlzayBpbm9kZSBtaW51cyB0aGUKICAgIGFkZHJlc3MgYmxvY2tzKSAqLwogc3RydWN0IHN0YXRfZGF0YSB7Ci0gICAgX19sZTE2IHNkX21vZGU7CS8qIGZpbGUgdHlwZSwgcGVybWlzc2lvbnMgKi8KLSAgICBfX2xlMTYgc2RfYXR0cnM7ICAgICAvKiBwZXJzaXN0ZW50IGlub2RlIGZsYWdzICovCi0gICAgX19sZTMyIHNkX25saW5rOwkvKiBudW1iZXIgb2YgaGFyZCBsaW5rcyAqLwotICAgIF9fbGU2NCBzZF9zaXplOwkvKiBmaWxlIHNpemUgKi8KLSAgICBfX2xlMzIgc2RfdWlkOwkJLyogb3duZXIgKi8KLSAgICBfX2xlMzIgc2RfZ2lkOwkJLyogZ3JvdXAgKi8KLSAgICBfX2xlMzIgc2RfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KLSAgICBfX2xlMzIgc2RfbXRpbWU7CS8qIHRpbWUgZmlsZSB3YXMgbGFzdCBtb2RpZmllZCAgKi8KLSAgICBfX2xlMzIgc2RfY3RpbWU7CS8qIHRpbWUgaW5vZGUgKHN0YXQgZGF0YSkgd2FzIGxhc3QgY2hhbmdlZCAoZXhjZXB0IGNoYW5nZXMgdG8gc2RfYXRpbWUgYW5kIHNkX210aW1lKSAqLwotICAgIF9fbGUzMiBzZF9ibG9ja3M7Ci0gICAgdW5pb24gewotCV9fbGUzMiBzZF9yZGV2OwotCV9fbGUzMiBzZF9nZW5lcmF0aW9uOwotICAgICAgLy9fX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7Ci0gICAgICAvKiBmaXJzdCBieXRlIG9mIGZpbGUgd2hpY2ggaXMgc3RvcmVkIGluIGEKLQkJCQkgICAgICAgZGlyZWN0IGl0ZW06IGV4Y2VwdCB0aGF0IGlmIGl0IGVxdWFscyAxCi0JCQkJICAgICAgIGl0IGlzIGEgc3ltbGluayBhbmQgaWYgaXQgZXF1YWxzCi0JCQkJICAgICAgIH4oX191MzIpMCB0aGVyZSBpcyBubyBkaXJlY3QgaXRlbS4gIFRoZQotCQkJCSAgICAgICBleGlzdGVuY2Ugb2YgdGhpcyBmaWVsZCByZWFsbHkgZ3JhdGVzCi0JCQkJICAgICAgIG9uIG1lLiBMZXQncyByZXBsYWNlIGl0IHdpdGggYSBtYWNybwotCQkJCSAgICAgICBiYXNlZCBvbiBzZF9zaXplIGFuZCBvdXIgdGFpbAotCQkJCSAgICAgICBzdXBwcmVzc2lvbiBwb2xpY3k/ICovCi0gIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB1OworCV9fbGUxNiBzZF9tb2RlOwkJLyogZmlsZSB0eXBlLCBwZXJtaXNzaW9ucyAqLworCV9fbGUxNiBzZF9hdHRyczsJLyogcGVyc2lzdGVudCBpbm9kZSBmbGFncyAqLworCV9fbGUzMiBzZF9ubGluazsJLyogbnVtYmVyIG9mIGhhcmQgbGlua3MgKi8KKwlfX2xlNjQgc2Rfc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworCV9fbGUzMiBzZF91aWQ7CQkvKiBvd25lciAqLworCV9fbGUzMiBzZF9naWQ7CQkvKiBncm91cCAqLworCV9fbGUzMiBzZF9hdGltZTsJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLworCV9fbGUzMiBzZF9tdGltZTsJLyogdGltZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkICAqLworCV9fbGUzMiBzZF9jdGltZTsJLyogdGltZSBpbm9kZSAoc3RhdCBkYXRhKSB3YXMgbGFzdCBjaGFuZ2VkIChleGNlcHQgY2hhbmdlcyB0byBzZF9hdGltZSBhbmQgc2RfbXRpbWUpICovCisJX19sZTMyIHNkX2Jsb2NrczsKKwl1bmlvbiB7CisJCV9fbGUzMiBzZF9yZGV2OworCQlfX2xlMzIgc2RfZ2VuZXJhdGlvbjsKKwkJLy9fX2xlMzIgc2RfZmlyc3RfZGlyZWN0X2J5dGU7CisJCS8qIGZpcnN0IGJ5dGUgb2YgZmlsZSB3aGljaCBpcyBzdG9yZWQgaW4gYQorCQkgICBkaXJlY3QgaXRlbTogZXhjZXB0IHRoYXQgaWYgaXQgZXF1YWxzIDEKKwkJICAgaXQgaXMgYSBzeW1saW5rIGFuZCBpZiBpdCBlcXVhbHMKKwkJICAgfihfX3UzMikwIHRoZXJlIGlzIG5vIGRpcmVjdCBpdGVtLiAgVGhlCisJCSAgIGV4aXN0ZW5jZSBvZiB0aGlzIGZpZWxkIHJlYWxseSBncmF0ZXMKKwkJICAgb24gbWUuIExldCdzIHJlcGxhY2UgaXQgd2l0aCBhIG1hY3JvCisJCSAgIGJhc2VkIG9uIHNkX3NpemUgYW5kIG91ciB0YWlsCisJCSAgIHN1cHByZXNzaW9uIHBvbGljeT8gKi8KKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdTsKIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIC8vCiAvLyB0aGlzIGlzIDQ0IGJ5dGVzIGxvbmcKQEAgLTkxOSw3ICs4OTgsNiBAQAogI2RlZmluZSBzZF92Ml9hdHRycyhzZHApICAgICAgICAgKGxlMTZfdG9fY3B1KChzZHApLT5zZF9hdHRycykpCiAjZGVmaW5lIHNldF9zZF92Ml9hdHRycyhzZHAsdikgICAoKHNkcCktPnNkX2F0dHJzID0gY3B1X3RvX2xlMTYodikpCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWSBTVFJVQ1RVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTU0LDE3ICs5MzIsMTQgQEAKIC8qIE5PVCBJTVBMRU1FTlRFRDogICAKICAgIERpcmVjdG9yeSB3aWxsIHNvbWVkYXkgY29udGFpbiBzdGF0IGRhdGEgb2Ygb2JqZWN0ICovCiAKLQotCi1zdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZAotewotICBfX2xlMzIgZGVoX29mZnNldDsJCS8qIHRoaXJkIGNvbXBvbmVudCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGtleSAqLwotICBfX2xlMzIgZGVoX2Rpcl9pZDsJCS8qIG9iamVjdGlkIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBvYmplY3QsIHRoYXQgaXMgcmVmZXJlbmNlZAotCQkJCQkgICBieSBkaXJlY3RvcnkgZW50cnkgKi8KLSAgX19sZTMyIGRlaF9vYmplY3RpZDsJCS8qIG9iamVjdGlkIG9mIHRoZSBvYmplY3QsIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBkaXJlY3RvcnkgZW50cnkgKi8KLSAgX19sZTE2IGRlaF9sb2NhdGlvbjsJCS8qIG9mZnNldCBvZiBuYW1lIGluIHRoZSB3aG9sZSBpdGVtICovCi0gIF9fbGUxNiBkZWhfc3RhdGU7CQkvKiB3aGV0aGVyIDEpIGVudHJ5IGNvbnRhaW5zIHN0YXQgZGF0YSAoZm9yIGZ1dHVyZSksIGFuZCAyKSB3aGV0aGVyCi0JCQkJCSAgIGVudHJ5IGlzIGhpZGRlbiAodW5saW5rZWQpICovCitzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCB7CisJX19sZTMyIGRlaF9vZmZzZXQ7CS8qIHRoaXJkIGNvbXBvbmVudCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IGtleSAqLworCV9fbGUzMiBkZWhfZGlyX2lkOwkvKiBvYmplY3RpZCBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQKKwkJCQkgICBieSBkaXJlY3RvcnkgZW50cnkgKi8KKwlfX2xlMzIgZGVoX29iamVjdGlkOwkvKiBvYmplY3RpZCBvZiB0aGUgb2JqZWN0LCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgZGlyZWN0b3J5IGVudHJ5ICovCisJX19sZTE2IGRlaF9sb2NhdGlvbjsJLyogb2Zmc2V0IG9mIG5hbWUgaW4gdGhlIHdob2xlIGl0ZW0gKi8KKwlfX2xlMTYgZGVoX3N0YXRlOwkvKiB3aGV0aGVyIDEpIGVudHJ5IGNvbnRhaW5zIHN0YXQgZGF0YSAoZm9yIGZ1dHVyZSksIGFuZCAyKSB3aGV0aGVyCisJCQkJICAgZW50cnkgaXMgaGlkZGVuICh1bmxpbmtlZCkgKi8KIH0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKICNkZWZpbmUgREVIX1NJWkUgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQpCiAjZGVmaW5lIGRlaF9vZmZzZXQocF9kZWgpICAgICAgICAgKGxlMzJfdG9fY3B1KChwX2RlaCktPmRlaF9vZmZzZXQpKQpAQCAtOTg2LDcgKzk2MSw3IEBACiAvKiBvbGQgZm9ybWF0IGRpcmVjdG9yaWVzIGhhdmUgdGhpcyBzaXplIHdoZW4gZW1wdHkgKi8KICNkZWZpbmUgRU1QVFlfRElSX1NJWkVfVjEgKERFSF9TSVpFICogMiArIDMpCiAKLSNkZWZpbmUgREVIX1N0YXRkYXRhIDAJCQkvKiBub3QgdXNlZCBub3cgKi8KKyNkZWZpbmUgREVIX1N0YXRkYXRhIDAJCS8qIG5vdCB1c2VkIG5vdyAqLwogI2RlZmluZSBERUhfVmlzaWJsZSAyCiAKIC8qIDY0IGJpdCBzeXN0ZW1zIChhbmQgdGhlIFMvMzkwKSBuZWVkIHRvIGJlIGFsaWduZWQgZXhwbGljaXRseSAtamRtICovCkBAIC0xMDIzLDEwICs5OTgsMTAgQEAKICNkZWZpbmUgZGVfdmlzaWJsZShkZWgpCSAgICAJICAgIHRlc3RfYml0X3VuYWxpZ25lZCAoREVIX1Zpc2libGUsICYoKGRlaCktPmRlaF9zdGF0ZSkpCiAjZGVmaW5lIGRlX2hpZGRlbihkZWgpCSAgICAJICAgICF0ZXN0X2JpdF91bmFsaWduZWQgKERFSF9WaXNpYmxlLCAmKChkZWgpLT5kZWhfc3RhdGUpKQogCi1leHRlcm4gdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChjaGFyICogYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCi0JCQkJICAgIF9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpOwotZXh0ZXJuIHZvaWQgbWFrZV9lbXB0eV9kaXJfaXRlbSAoY2hhciAqIGJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAotCQkJCSBfX2xlMzIgcGFyX2RpcmlkLCBfX2xlMzIgcGFyX29iamlkKTsKK2V4dGVybiB2b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW1fdjEoY2hhciAqYm9keSwgX19sZTMyIGRpcmlkLCBfX2xlMzIgb2JqaWQsCisJCQkJICAgX19sZTMyIHBhcl9kaXJpZCwgX19sZTMyIHBhcl9vYmppZCk7CitleHRlcm4gdm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtKGNoYXIgKmJvZHksIF9fbGUzMiBkaXJpZCwgX19sZTMyIG9iamlkLAorCQkJCV9fbGUzMiBwYXJfZGlyaWQsIF9fbGUzMiBwYXJfb2JqaWQpOwogCiAvKiBhcnJheSBvZiB0aGUgZW50cnkgaGVhZGVycyAqLwogIC8qIGdldCBpdGVtIGJvZHkgKi8KQEAgLTEwNDMsNTMgKzEwMTgsNDggQEAKICNkZWZpbmUgSV9ERUhfTl9FTlRSWV9MRU5HVEgoaWgsZGVoLGkpIFwKICgoaSkgPyAoZGVoX2xvY2F0aW9uKChkZWgpLTEpIC0gZGVoX2xvY2F0aW9uKChkZWgpKSkgOiAoaWhfaXRlbV9sZW4oKGloKSkgLSBkZWhfbG9jYXRpb24oKGRlaCkpKSkKICovCi1zdGF0aWMgaW5saW5lIGludCBlbnRyeV9sZW5ndGggKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAKLQkJCQkJCQkJY29uc3Qgc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgcG9zX2luX2l0ZW0pCitzdGF0aWMgaW5saW5lIGludCBlbnRyeV9sZW5ndGgoY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgaW50IHBvc19pbl9pdGVtKQogewotICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCXN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpkZWg7CiAKLSAgICBkZWggPSBCX0lfREVIIChiaCwgaWgpICsgcG9zX2luX2l0ZW07Ci0gICAgaWYgKHBvc19pbl9pdGVtKQotCXJldHVybiBkZWhfbG9jYXRpb24oZGVoLTEpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CisJZGVoID0gQl9JX0RFSChiaCwgaWgpICsgcG9zX2luX2l0ZW07CisJaWYgKHBvc19pbl9pdGVtKQorCQlyZXR1cm4gZGVoX2xvY2F0aW9uKGRlaCAtIDEpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CiAKLSAgICByZXR1cm4gaWhfaXRlbV9sZW4oaWgpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CisJcmV0dXJuIGloX2l0ZW1fbGVuKGloKSAtIGRlaF9sb2NhdGlvbihkZWgpOwogfQogCi0KLQogLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBpdGVtLCBkZXBlbmRzIG9uIEVOVFJZX0NPVU5UIGJlaW5nIGF0IHRoZSBzdGFydCBvZiBkaXJlY3RvcnkgZHluYW1pYyBkYXRhLiAqLwogI2RlZmluZSBJX0VOVFJZX0NPVU5UKGloKSAoaWhfZW50cnlfY291bnQoKGloKSkpCiAKLQogLyogbmFtZSBieSBiaCwgaWggYW5kIGVudHJ5X251bSAqLwogI2RlZmluZSBCX0lfRV9OQU1FKGJoLGloLGVudHJ5X251bSkgKChjaGFyICopKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBkZWhfbG9jYXRpb24oQl9JX0RFSChiaCxpaCkrKGVudHJ5X251bSkpKSkKIAogLy8gdHdvIGVudHJpZXMgcGVyIGJsb2NrIChhdCBsZWFzdCkKICNkZWZpbmUgUkVJU0VSRlNfTUFYX05BTUUoYmxvY2tfc2l6ZSkgMjU1CiAKLQogLyogdGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3Igb3BlcmF0aW9ucyBvbiBkaXJlY3RvcnkgZW50cmllcy4gSXQgaXMKICAgIG5vdCBhIGRpc2sgc3RydWN0dXJlLiAqLwogLyogV2hlbiByZWlzZXJmc19maW5kX2VudHJ5IG9yIHNlYXJjaF9ieV9lbnRyeV9rZXkgZmluZCBkaXJlY3RvcnkKICAgIGVudHJ5LCB0aGV5IHJldHVybiBmaWxsZWQgcmVpc2VyZnNfZGlyX2VudHJ5IHN0cnVjdHVyZSAqLwotc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeQotewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZV9iaDsKLSAgaW50IGRlX2l0ZW1fbnVtOwotICBzdHJ1Y3QgaXRlbV9oZWFkICogZGVfaWg7Ci0gIGludCBkZV9lbnRyeV9udW07Ci0gIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVfZGVoOwotICBpbnQgZGVfZW50cnlsZW47Ci0gIGludCBkZV9uYW1lbGVuOwotICBjaGFyICogZGVfbmFtZTsKLSAgY2hhciAqIGRlX2dlbl9udW1iZXJfYml0X3N0cmluZzsKK3N0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgeworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVfYmg7CisJaW50IGRlX2l0ZW1fbnVtOworCXN0cnVjdCBpdGVtX2hlYWQgKmRlX2loOworCWludCBkZV9lbnRyeV9udW07CisJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKmRlX2RlaDsKKwlpbnQgZGVfZW50cnlsZW47CisJaW50IGRlX25hbWVsZW47CisJY2hhciAqZGVfbmFtZTsKKwljaGFyICpkZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmc7CiAKLSAgX191MzIgZGVfZGlyX2lkOwotICBfX3UzMiBkZV9vYmplY3RpZDsKKwlfX3UzMiBkZV9kaXJfaWQ7CisJX191MzIgZGVfb2JqZWN0aWQ7CiAKLSAgc3RydWN0IGNwdV9rZXkgZGVfZW50cnlfa2V5OworCXN0cnVjdCBjcHVfa2V5IGRlX2VudHJ5X2tleTsKIH07Ci0gICAKKwogLyogdGhlc2UgZGVmaW5lcyBhcmUgdXNlZnVsIHdoZW4gYSBwYXJ0aWN1bGFyIG1lbWJlciBvZiBhIHJlaXNlcmZzX2Rpcl9lbnRyeSBpcyBuZWVkZWQgKi8KIAogLyogcG9pbnRlciB0byBmaWxlIG5hbWUsIHN0b3JlZCBpbiBlbnRyeSAqLwpAQCAtMTA5OSw4ICsxMDY5LDYgQEAKICNkZWZpbmUgSV9ERUhfTl9FTlRSWV9GSUxFX05BTUVfTEVOR1RIKGloLGRlaCxlbnRyeV9udW0pIFwKIChJX0RFSF9OX0VOVFJZX0xFTkdUSCAoaWgsIGRlaCwgZW50cnlfbnVtKSAtIChkZV93aXRoX3NkIChkZWgpID8gU0RfU0laRSA6IDApKQogCi0KLQogLyogaGFzaCB2YWx1ZSBvY2N1cGllcyBiaXRzIGZyb20gNyB1cCB0byAzMCAqLwogI2RlZmluZSBHRVRfSEFTSF9WQUxVRShvZmZzZXQpICgob2Zmc2V0KSAmIDB4N2ZmZmZmODBMTCkKIC8qIGdlbmVyYXRpb24gbnVtYmVyIG9jY3VwaWVzIDcgYml0cyBzdGFydGluZyBmcm9tIDAgdXAgdG8gNiAqLwpAQCAtMTEwOSw3ICsxMDc3LDYgQEAKIAogI2RlZmluZSBTRVRfR0VORVJBVElPTl9OVU1CRVIob2Zmc2V0LGdlbl9udW1iZXIpIChHRVRfSEFTSF9WQUxVRShvZmZzZXQpfChnZW5fbnVtYmVyKSkKIAotCiAvKgogICogUGljdHVyZSByZXByZXNlbnRzIGFuIGludGVybmFsIG5vZGUgb2YgdGhlIHJlaXNlcmZzIHRyZWUKICAqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQEAgLTExMjUsOSArMTA5Miw5IEBACiAvKiBEaXNrIGNoaWxkIHBvaW50ZXI6IFRoZSBwb2ludGVyIGZyb20gYW4gaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZQogICAgdG8gYSBub2RlIHRoYXQgaXMgb24gZGlzay4gKi8KIHN0cnVjdCBkaXNrX2NoaWxkIHsKLSAgX19sZTMyICAgICAgIGRjX2Jsb2NrX251bWJlcjsgICAgICAgICAgICAgIC8qIERpc2sgY2hpbGQncyBibG9jayBudW1iZXIuICovCi0gIF9fbGUxNiAgICAgICBkY19zaXplOwkJICAgICAgICAgICAgLyogRGlzayBjaGlsZCdzIHVzZWQgc3BhY2UuICAgKi8KLSAgX19sZTE2ICAgICAgIGRjX3Jlc2VydmVkOworCV9fbGUzMiBkY19ibG9ja19udW1iZXI7CS8qIERpc2sgY2hpbGQncyBibG9jayBudW1iZXIuICovCisJX19sZTE2IGRjX3NpemU7CQkvKiBEaXNrIGNoaWxkJ3MgdXNlZCBzcGFjZS4gICAqLworCV9fbGUxNiBkY19yZXNlcnZlZDsKIH07CiAKICNkZWZpbmUgRENfU0laRSAoc2l6ZW9mKHN0cnVjdCBkaXNrX2NoaWxkKSkKQEAgLTExNDQsNyArMTExMSw3IEBACiAjZGVmaW5lIEJfTl9DSElMRF9OVU0ocF9zX2JoLG5fcG9zKSAoZGNfYmxvY2tfbnVtYmVyKEJfTl9DSElMRChwX3NfYmgsbl9wb3MpKSkKICNkZWZpbmUgUFVUX0JfTl9DSElMRF9OVU0ocF9zX2JoLG5fcG9zLCB2YWwpIChwdXRfZGNfYmxvY2tfbnVtYmVyKEJfTl9DSElMRChwX3NfYmgsbl9wb3MpLCB2YWwgKSkKIAotIC8qIG1heGltYWwgdmFsdWUgb2YgZmllbGQgY2hpbGRfc2l6ZSBpbiBzdHJ1Y3R1cmUgZGlza19jaGlsZCAqLyAKKyAvKiBtYXhpbWFsIHZhbHVlIG9mIGZpZWxkIGNoaWxkX3NpemUgaW4gc3RydWN0dXJlIGRpc2tfY2hpbGQgKi8KICAvKiBjaGlsZCBzaXplIGlzIHRoZSBjb21iaW5lZCBzaXplIG9mIGFsbCBpdGVtcyBhbmQgdGhlaXIgaGVhZGVycyAqLwogI2RlZmluZSBNQVhfQ0hJTERfU0laRShiaCkgKChpbnQpKCAoYmgpLT5iX3NpemUgLSBCTEtIX1NJWkUgKSkKIApAQCAtMTE1OSw3ICsxMTI2LDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgIFBBVEggU1RSVUNUVVJFUyBBTkQgREVGSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qIFNlYXJjaF9ieV9rZXkgZmlsbHMgdXAgdGhlIHBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgbGVhZiBhcyBpdCBkZXNjZW5kcyB0aGUgdHJlZSBsb29raW5nIGZvciB0aGUKICAgIGtleS4gIEl0IHVzZXMgcmVpc2VyZnNfYnJlYWQgdG8gdHJ5IHRvIGZpbmQgYnVmZmVycyBpbiB0aGUgY2FjaGUgZ2l2ZW4gdGhlaXIgYmxvY2sgbnVtYmVyLiAgSWYgaXQKICAgIGRvZXMgbm90IGZpbmQgdGhlbSBpbiB0aGUgY2FjaGUgaXQgcmVhZHMgdGhlbSBmcm9tIGRpc2suICBGb3IgZWFjaCBub2RlIHNlYXJjaF9ieV9rZXkgZmluZHMgdXNpbmcKQEAgLTExNjgsMjAgKzExMzQsMTggQEAKICAgIGlzIGxvb2tpbmcgdGhyb3VnaCBhIGxlYWYgbm9kZSBiaW5fc2VhcmNoIHdpbGwgZmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gd2hpY2ggaGFzIGtleSBlaXRoZXIKICAgIGVxdWFsIHRvIGdpdmVuIGtleSwgb3Igd2hpY2ggaXMgdGhlIG1heGltYWwga2V5IGxlc3MgdGhhbiB0aGUgZ2l2ZW4ga2V5LiAqLwogCi1zdHJ1Y3QgIHBhdGhfZWxlbWVudCAgewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKglwZV9idWZmZXI7ICAgIC8qIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBpbiB0aGUgdHJlZS4gKi8KLSAgaW50ICAgICAgICAgCQlwZV9wb3NpdGlvbjsgIC8qIFBvc2l0aW9uIGluIHRoZSB0cmVlIG5vZGUgd2hpY2ggaXMgcGxhY2VkIGluIHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidWZmZXIgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdHJ1Y3QgcGF0aF9lbGVtZW50IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBlX2J1ZmZlcjsJLyogUG9pbnRlciB0byB0aGUgYnVmZmVyIGF0IHRoZSBwYXRoIGluIHRoZSB0cmVlLiAqLworCWludCBwZV9wb3NpdGlvbjsJLyogUG9zaXRpb24gaW4gdGhlIHRyZWUgbm9kZSB3aGljaCBpcyBwbGFjZWQgaW4gdGhlICovCisJLyogYnVmZmVyIGFib3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotI2RlZmluZSBNQVhfSEVJR0hUIDUgLyogbWF4aW1hbCBoZWlnaHQgb2YgYSB0cmVlLiBkb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICovCi0jZGVmaW5lIEVYVEVOREVEX01BWF9IRUlHSFQgICAgICAgICA3IC8qIE11c3QgYmUgZXF1YWxzIE1BWF9IRUlHSFQgKyBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICovCi0jZGVmaW5lIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgICAyIC8qIE11c3QgYmUgZXF1YWwgdG8gYXQgbGVhc3QgMi4gKi8KKyNkZWZpbmUgTUFYX0hFSUdIVCA1CQkvKiBtYXhpbWFsIGhlaWdodCBvZiBhIHRyZWUuIGRvbid0IGNoYW5nZSB0aGlzIHdpdGhvdXQgY2hhbmdpbmcgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKi8KKyNkZWZpbmUgRVhURU5ERURfTUFYX0hFSUdIVCAgICAgICAgIDcJLyogTXVzdCBiZSBlcXVhbHMgTUFYX0hFSUdIVCArIEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKi8KKyNkZWZpbmUgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAgIDIJLyogTXVzdCBiZSBlcXVhbCB0byBhdCBsZWFzdCAyLiAqLwogCi0jZGVmaW5lIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCAxIC8qIE11c3QgYmUgZXF1YWwgdG8gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAtIDEgKi8KLSNkZWZpbmUgTUFYX0ZFQl9TSVpFIDYgICAvKiB0aGlzIE1VU1QgYmUgTUFYX0hFSUdIVCArIDEuIFNlZSBhYm91dCBGRUIgYmVsb3cgKi8KLQotCisjZGVmaW5lIElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCAxCS8qIE11c3QgYmUgZXF1YWwgdG8gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAtIDEgKi8KKyNkZWZpbmUgTUFYX0ZFQl9TSVpFIDYJCS8qIHRoaXMgTVVTVCBiZSBNQVhfSEVJR0hUICsgMS4gU2VlIGFib3V0IEZFQiBiZWxvdyAqLwogCiAvKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hvIHRoZSBhbmNlc3RvcnMgb2Ygbm9kZXMgYXJlLiAgV2hlbiB3ZQogICAgcGVyZm9ybSBhIHNlYXJjaCB3ZSByZWNvcmQgd2hpY2ggbm9kZXMgd2VyZSB2aXNpdGVkIHdoaWxlCkBAIC0xMjAwLDE0ICsxMTY0LDE0IEBACiBnb2RzIG9ubHkga25vdyBob3cgd2UgYXJlIGdvaW5nIHRvIFNNUCB0aGUgY29kZSB0aGF0IHVzZXMgdGhlbS4KIHpub2RlcyBhcmUgdGhlIHdheSEgKi8KIAotI2RlZmluZSBQQVRIX1JFQURBCTB4MSAvKiBkbyByZWFkIGFoZWFkICovCi0jZGVmaW5lIFBBVEhfUkVBREFfQkFDSyAweDIgLyogcmVhZCBiYWNrd2FyZHMgKi8KKyNkZWZpbmUgUEFUSF9SRUFEQQkweDEJLyogZG8gcmVhZCBhaGVhZCAqLworI2RlZmluZSBQQVRIX1JFQURBX0JBQ0sgMHgyCS8qIHJlYWQgYmFja3dhcmRzICovCiAKLXN0cnVjdCAgcGF0aCB7Ci0gIGludCAgICAgICAgICAgICAgICAgICBwYXRoX2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgCS8qIExlbmd0aCBvZiB0aGUgYXJyYXkgYWJvdmUuICAgKi8KLSAgaW50CQkJcmVhZGE7Ci0gIHN0cnVjdCAgcGF0aF9lbGVtZW50ICBwYXRoX2VsZW1lbnRzW0VYVEVOREVEX01BWF9IRUlHSFRdOwkvKiBBcnJheSBvZiB0aGUgcGF0aCBlbGVtZW50cy4gICovCi0gIGludAkJCXBvc19pbl9pdGVtOworc3RydWN0IHBhdGggeworCWludCBwYXRoX2xlbmd0aDsJLyogTGVuZ3RoIG9mIHRoZSBhcnJheSBhYm92ZS4gICAqLworCWludCByZWFkYTsKKwlzdHJ1Y3QgcGF0aF9lbGVtZW50IHBhdGhfZWxlbWVudHNbRVhURU5ERURfTUFYX0hFSUdIVF07CS8qIEFycmF5IG9mIHRoZSBwYXRoIGVsZW1lbnRzLiAgKi8KKwlpbnQgcG9zX2luX2l0ZW07CiB9OwogCiAjZGVmaW5lIHBvc19pbl9pdGVtKHBhdGgpICgocGF0aCktPnBvc19pbl9pdGVtKQpAQCAtMTIyNCwyNSArMTE4OCwyMyBAQAogLyogR2V0IHBvc2l0aW9uIGluIHRoZSBlbGVtZW50IGF0IHRoZSBwYXRoIGJ5IHBhdGggYW5kIHBhdGggcG9zaXRpb24uICovCiAjZGVmaW5lIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLG5fb2Zmc2V0KSAoUEFUSF9PRkZTRVRfUEVMRU1FTlQocF9zX3BhdGgsbl9vZmZzZXQpLT5wZV9wb3NpdGlvbikKIAotCiAjZGVmaW5lIFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSAoUEFUSF9PRkZTRVRfUEJVRkZFUigocF9zX3BhdGgpLCAocF9zX3BhdGgpLT5wYXRoX2xlbmd0aCkpCiAJCQkJLyogeW91IGtub3csIHRvIHRoZSBwZXJzb24gd2hvIGRpZG4ndAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSB0aGlzIHRoZSBtYWNybyBuYW1lIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGZpcnN0IHN1Z2dlc3Qgd2hhdCBpdCBkb2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXliZSBQT1NJVElPTl9GUk9NX1BBVEhfRU5EPyBPcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSB3ZSBzaG91bGQganVzdCBmb2N1cyBvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1waW5nIHBhdGhzLi4uIC1IYW5zICovCisJCQkJICAgd3JpdGUgdGhpcyB0aGUgbWFjcm8gbmFtZSBkb2VzIG5vdAorCQkJCSAgIGF0IGZpcnN0IHN1Z2dlc3Qgd2hhdCBpdCBkb2VzLgorCQkJCSAgIE1heWJlIFBPU0lUSU9OX0ZST01fUEFUSF9FTkQ/IE9yCisJCQkJICAgbWF5YmUgd2Ugc2hvdWxkIGp1c3QgZm9jdXMgb24KKwkJCQkgICBkdW1waW5nIHBhdGhzLi4uIC1IYW5zICovCiAjZGVmaW5lIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgKFBBVEhfT0ZGU0VUX1BPU0lUSU9OKChwX3NfcGF0aCksIChwX3NfcGF0aCktPnBhdGhfbGVuZ3RoKSkKIAotCiAjZGVmaW5lIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkgICAgQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpLFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkpCiAKIC8qIGluIGRvX2JhbGFuY2UgbGVhZiBoYXMgaCA9PSAwIGluIGNvbnRyYXN0IHdpdGggcGF0aCBzdHJ1Y3R1cmUsCiAgICB3aGVyZSByb290IGhhcyBsZXZlbCA9PSAwLiBUaGF0IGlzIHdoeSB3ZSBuZWVkIHRoZXNlIGRlZmluZXMgKi8KICNkZWZpbmUgUEFUSF9IX1BCVUZGRVIocF9zX3BhdGgsIGgpIFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc19wYXRoLCBwX3NfcGF0aC0+cGF0aF9sZW5ndGggLSAoaCkpCS8qIHRiLT5TW2hdICovCi0jZGVmaW5lIFBBVEhfSF9QUEFSRU5UKHBhdGgsIGgpIFBBVEhfSF9QQlVGRkVSIChwYXRoLCAoaCkgKyAxKQkJCS8qIHRiLT5GW2hdIG9yIHRiLT5TWzBdLT5iX3BhcmVudCAqLwotI2RlZmluZSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCkgUEFUSF9PRkZTRVRfUE9TSVRJT04gKHBhdGgsIHBhdGgtPnBhdGhfbGVuZ3RoIC0gKGgpKQkKLSNkZWZpbmUgUEFUSF9IX0JfSVRFTV9PUkRFUihwYXRoLCBoKSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCArIDEpCQkvKiB0Yi0+U1toXS0+Yl9pdGVtX29yZGVyICovCisjZGVmaW5lIFBBVEhfSF9QUEFSRU5UKHBhdGgsIGgpIFBBVEhfSF9QQlVGRkVSIChwYXRoLCAoaCkgKyAxKQkvKiB0Yi0+RltoXSBvciB0Yi0+U1swXS0+Yl9wYXJlbnQgKi8KKyNkZWZpbmUgUEFUSF9IX1BPU0lUSU9OKHBhdGgsIGgpIFBBVEhfT0ZGU0VUX1BPU0lUSU9OIChwYXRoLCBwYXRoLT5wYXRoX2xlbmd0aCAtIChoKSkKKyNkZWZpbmUgUEFUSF9IX0JfSVRFTV9PUkRFUihwYXRoLCBoKSBQQVRIX0hfUE9TSVRJT04ocGF0aCwgaCArIDEpCS8qIHRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIgKi8KIAogI2RlZmluZSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3BhdGgsIG5faCkgKChwX3NfcGF0aCktPnBhdGhfbGVuZ3RoIC0gKG5faCkpCiAKQEAgLTEyNTMsNyArMTIxNSw2IEBACiAjZGVmaW5lIGl0ZW1fbW92ZWQoaWgscGF0aCkgY29tcF9pdGVtcyhpaCwgcGF0aCkKICNkZWZpbmUgcGF0aF9jaGFuZ2VkKGloLHBhdGgpIGNvbXBfaXRlbXMgKGloLCBwYXRoKQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgTUlTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEyNzIsMzAgKzEyMzMsMjYgQEAKIC8vIHJlaXNlcmZzIHZlcnNpb24gMiBoYXMgbWF4IG9mZnNldCA2MCBiaXRzLiBWZXJzaW9uIDEgLSAzMiBiaXQgb2Zmc2V0CiAjZGVmaW5lIFUzMl9NQVggKH4oX191MzIpMCkKIAotc3RhdGljIGlubGluZSBsb2ZmX3QgbWF4X3JlaXNlcmZzX29mZnNldCAoc3RydWN0IGlub2RlICogaW5vZGUpCitzdGF0aWMgaW5saW5lIGxvZmZfdCBtYXhfcmVpc2VyZnNfb2Zmc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNSkKLQlyZXR1cm4gKGxvZmZfdClVMzJfTUFYOworCWlmIChnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSkgPT0gS0VZX0ZPUk1BVF8zXzUpCisJCXJldHVybiAobG9mZl90KSBVMzJfTUFYOwogCi0gICAgcmV0dXJuIChsb2ZmX3QpKCh+KF9fdTY0KTApID4+IDQpOworCXJldHVybiAobG9mZl90KSAoKH4oX191NjQpIDApID4+IDQpOwogfQogCi0KIC8qI2RlZmluZSBNQVhfS0VZX1VOSVFVRU5FU1MJTUFYX1VMX0lOVCovCiAjZGVmaW5lIE1BWF9LRVlfT0JKRUNUSUQJTUFYX1VMX0lOVAogCi0KICNkZWZpbmUgTUFYX0JfTlVNICBNQVhfVUxfSU5UCiAjZGVmaW5lIE1BWF9GQ19OVU0gTUFYX1VTX0lOVAogCi0KIC8qIHRoZSBwdXJwb3NlIGlzIHRvIGRldGVjdCBvdmVyZmxvdyBvZiBhbiB1bnNpZ25lZCBzaG9ydCAqLwogI2RlZmluZSBSRUlTRVJGU19MSU5LX01BWCAoTUFYX1VTX0lOVCAtIDEwMDApCiAKLQogLyogVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSB1c2VkIGluIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCByZWlzZXJmc19hcHBlbmRfaXRlbSAgKi8KLSNkZWZpbmUgUkVJU0VSRlNfS0VSTkVMX01FTQkJMAkvKiByZWlzZXJmcyBrZXJuZWwgbWVtb3J5IG1vZGUJKi8KLSNkZWZpbmUgUkVJU0VSRlNfVVNFUl9NRU0JCTEJLyogcmVpc2VyZnMgdXNlciBtZW1vcnkgbW9kZQkJKi8KKyNkZWZpbmUgUkVJU0VSRlNfS0VSTkVMX01FTQkJMAkvKiByZWlzZXJmcyBrZXJuZWwgbWVtb3J5IG1vZGUgICovCisjZGVmaW5lIFJFSVNFUkZTX1VTRVJfTUVNCQkxCS8qIHJlaXNlcmZzIHVzZXIgbWVtb3J5IG1vZGUgICAgICAgICAgICAqLwogCiAjZGVmaW5lIGZzX2dlbmVyYXRpb24ocykgKFJFSVNFUkZTX1NCKHMpLT5zX2dlbmVyYXRpb25fY291bnRlcikKICNkZWZpbmUgZ2V0X2dlbmVyYXRpb24ocykgYXRvbWljX3JlYWQgKCZmc19nZW5lcmF0aW9uKHMpKQpAQCAtMTMwMyw3ICsxMjYwLDYgQEAKICNkZWZpbmUgX19mc19jaGFuZ2VkKGdlbixzKSAoZ2VuICE9IGdldF9nZW5lcmF0aW9uIChzKSkKICNkZWZpbmUgZnNfY2hhbmdlZChnZW4scykgKHtjb25kX3Jlc2NoZWQoKTsgX19mc19jaGFuZ2VkKGdlbiwgcyk7fSkKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICBGSVhBVEUgTk9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzI0LDM4ICsxMjgwLDM0IEBACiAgICBjYWxjdWxhdGluZyB3aGF0IHdlIGNhbiBzaGlmdCB0byBuZWlnaGJvcnMgYW5kIGhvdyBtYW55IG5vZGVzIHdlCiAgICBoYXZlIHRvIGhhdmUgaWYgd2UgZG8gbm90IGFueSBzaGlmdGluZ3MsIGlmIHdlIHNoaWZ0IHRvIGxlZnQvcmlnaHQKICAgIG5laWdoYm9yIG9yIHRvIGJvdGguICovCi1zdHJ1Y3QgdmlydHVhbF9pdGVtCi17Ci0gICAgaW50IHZpX2luZGV4OyAvLyBpbmRleCBpbiB0aGUgYXJyYXkgb2YgaXRlbSBvcGVyYXRpb25zCi0gICAgdW5zaWduZWQgc2hvcnQgdmlfdHlwZTsJLy8gbGVmdC9yaWdodCBtZXJnZWFiaWxpdHkKLSAgICB1bnNpZ25lZCBzaG9ydCB2aV9pdGVtX2xlbjsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBpdGVtIHRoYXQgaXQgd2lsbCBoYXZlIGFmdGVyIGJhbGFuY2luZyAqLwotICAgIHN0cnVjdCBpdGVtX2hlYWQgKiB2aV9paDsKLSAgICBjb25zdCBjaGFyICogdmlfaXRlbTsgICAgIC8vIGJvZHkgb2YgaXRlbSAob2xkIG9yIG5ldykKLSAgICBjb25zdCB2b2lkICogdmlfbmV3X2RhdGE7IC8vIDAgYWx3YXlzIGJ1dCBwYXN0ZSBtb2RlCi0gICAgdm9pZCAqIHZpX3VhcmVhOyAgICAvLyBpdGVtIHNwZWNpZmljIGFyZWEKK3N0cnVjdCB2aXJ0dWFsX2l0ZW0geworCWludCB2aV9pbmRleDsJCS8vIGluZGV4IGluIHRoZSBhcnJheSBvZiBpdGVtIG9wZXJhdGlvbnMKKwl1bnNpZ25lZCBzaG9ydCB2aV90eXBlOwkvLyBsZWZ0L3JpZ2h0IG1lcmdlYWJpbGl0eQorCXVuc2lnbmVkIHNob3J0IHZpX2l0ZW1fbGVuOwkvKiBsZW5ndGggb2YgaXRlbSB0aGF0IGl0IHdpbGwgaGF2ZSBhZnRlciBiYWxhbmNpbmcgKi8KKwlzdHJ1Y3QgaXRlbV9oZWFkICp2aV9paDsKKwljb25zdCBjaGFyICp2aV9pdGVtOwkvLyBib2R5IG9mIGl0ZW0gKG9sZCBvciBuZXcpCisJY29uc3Qgdm9pZCAqdmlfbmV3X2RhdGE7CS8vIDAgYWx3YXlzIGJ1dCBwYXN0ZSBtb2RlCisJdm9pZCAqdmlfdWFyZWE7CQkvLyBpdGVtIHNwZWNpZmljIGFyZWEKIH07CiAKLQotc3RydWN0IHZpcnR1YWxfbm9kZQotewotICBjaGFyICogdm5fZnJlZV9wdHI7CQkvKiB0aGlzIGlzIGEgcG9pbnRlciB0byB0aGUgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCi0gIHVuc2lnbmVkIHNob3J0IHZuX25yX2l0ZW07CS8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgKi8KLSAgc2hvcnQgdm5fc2l6ZTsgICAgICAgIAkvKiBzaXplIG9mIG5vZGUgLCB0aGF0IG5vZGUgd291bGQgaGF2ZSBpZiBpdCBoYXMgdW5saW1pdGVkIHNpemUgYW5kIG5vIGJhbGFuY2luZyBpcyBwZXJmb3JtZWQgKi8KLSAgc2hvcnQgdm5fbW9kZTsJCS8qIG1vZGUgb2YgYmFsYW5jaW5nIChwYXN0ZSwgaW5zZXJ0LCBkZWxldGUsIGN1dCkgKi8KLSAgc2hvcnQgdm5fYWZmZWN0ZWRfaXRlbV9udW07IAotICBzaG9ydCB2bl9wb3NfaW5faXRlbTsKLSAgc3RydWN0IGl0ZW1faGVhZCAqIHZuX2luc19paDsJLyogaXRlbSBoZWFkZXIgb2YgaW5zZXJ0ZWQgaXRlbSwgMCBmb3Igb3RoZXIgbW9kZXMgKi8KLSAgY29uc3Qgdm9pZCAqIHZuX2RhdGE7Ci0gIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2bl92aTsJLyogYXJyYXkgb2YgaXRlbXMgKGluY2x1ZGluZyBhIG5ldyBvbmUsIGV4Y2x1ZGluZyBpdGVtIHRvIGJlIGRlbGV0ZWQpICovCitzdHJ1Y3QgdmlydHVhbF9ub2RlIHsKKwljaGFyICp2bl9mcmVlX3B0cjsJLyogdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGJ1ZmZlciAqLworCXVuc2lnbmVkIHNob3J0IHZuX25yX2l0ZW07CS8qIG51bWJlciBvZiBpdGVtcyBpbiB2aXJ0dWFsIG5vZGUgKi8KKwlzaG9ydCB2bl9zaXplOwkJLyogc2l6ZSBvZiBub2RlICwgdGhhdCBub2RlIHdvdWxkIGhhdmUgaWYgaXQgaGFzIHVubGltaXRlZCBzaXplIGFuZCBubyBiYWxhbmNpbmcgaXMgcGVyZm9ybWVkICovCisJc2hvcnQgdm5fbW9kZTsJCS8qIG1vZGUgb2YgYmFsYW5jaW5nIChwYXN0ZSwgaW5zZXJ0LCBkZWxldGUsIGN1dCkgKi8KKwlzaG9ydCB2bl9hZmZlY3RlZF9pdGVtX251bTsKKwlzaG9ydCB2bl9wb3NfaW5faXRlbTsKKwlzdHJ1Y3QgaXRlbV9oZWFkICp2bl9pbnNfaWg7CS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0sIDAgZm9yIG90aGVyIG1vZGVzICovCisJY29uc3Qgdm9pZCAqdm5fZGF0YTsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICp2bl92aTsJLyogYXJyYXkgb2YgaXRlbXMgKGluY2x1ZGluZyBhIG5ldyBvbmUsIGV4Y2x1ZGluZyBpdGVtIHRvIGJlIGRlbGV0ZWQpICovCiB9OwogCiAvKiB1c2VkIGJ5IGRpcmVjdG9yeSBpdGVtcyB3aGVuIGNyZWF0aW5nIHZpcnR1YWwgbm9kZXMgKi8KIHN0cnVjdCBkaXJlbnRyeV91YXJlYSB7Ci0gICAgaW50IGZsYWdzOwotICAgIF9fdTE2IGVudHJ5X2NvdW50OwotICAgIF9fdTE2IGVudHJ5X3NpemVzWzFdOwotfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIDsKLQorCWludCBmbGFnczsKKwlfX3UxNiBlbnRyeV9jb3VudDsKKwlfX3UxNiBlbnRyeV9zaXplc1sxXTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgVFJFRSBCQUxBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMzc4LDczICsxMzMwLDcyIEBACiAjZGVmaW5lIE1BWF9BTU9VTlRfTkVFREVEIDIKIAogLyogc29tZWRheSBzb21lYm9keSB3aWxsIHByZWZpeCBldmVyeSBmaWVsZCBpbiB0aGlzIHN0cnVjdCB3aXRoIHRiXyAqLwotc3RydWN0IHRyZWVfYmFsYW5jZQotewotICBpbnQgdGJfbW9kZTsKLSAgaW50IG5lZWRfYmFsYW5jZV9kaXJ0eTsKLSAgc3RydWN0IHN1cGVyX2Jsb2NrICogdGJfc2I7Ci0gIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRyYW5zYWN0aW9uX2hhbmRsZSA7Ci0gIHN0cnVjdCBwYXRoICogdGJfcGF0aDsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogTFtNQVhfSEVJR0hUXTsgICAgICAgIC8qIGFycmF5IG9mIGxlZnQgbmVpZ2hib3JzIG9mIG5vZGVzIGluIHRoZSBwYXRoICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIFJbTUFYX0hFSUdIVF07ICAgICAgICAvKiBhcnJheSBvZiByaWdodCBuZWlnaGJvcnMgb2Ygbm9kZXMgaW4gdGhlIHBhdGgqLwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBGTFtNQVhfSEVJR0hUXTsgICAgICAgLyogYXJyYXkgb2YgZmF0aGVycyBvZiB0aGUgbGVmdCAgbmVpZ2hib3JzICAgICAgKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogRlJbTUFYX0hFSUdIVF07ICAgICAgIC8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIHJpZ2h0IG5laWdoYm9ycyAgICAgICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIENGTFtNQVhfSEVJR0hUXTsgICAgICAvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIGxlZnQgbmVpZ2hib3IgICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIENGUltNQVhfSEVJR0hUXTsgICAgICAvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yICovCitzdHJ1Y3QgdHJlZV9iYWxhbmNlIHsKKwlpbnQgdGJfbW9kZTsKKwlpbnQgbmVlZF9iYWxhbmNlX2RpcnR5OworCXN0cnVjdCBzdXBlcl9ibG9jayAqdGJfc2I7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdHJhbnNhY3Rpb25faGFuZGxlOworCXN0cnVjdCBwYXRoICp0Yl9wYXRoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgbGVmdCBuZWlnaGJvcnMgb2Ygbm9kZXMgaW4gdGhlIHBhdGggKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKlJbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIHJpZ2h0IG5laWdoYm9ycyBvZiBub2RlcyBpbiB0aGUgcGF0aCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqRkxbTUFYX0hFSUdIVF07CS8qIGFycmF5IG9mIGZhdGhlcnMgb2YgdGhlIGxlZnQgIG5laWdoYm9ycyAgICAgICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpGUltNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgZmF0aGVycyBvZiB0aGUgcmlnaHQgbmVpZ2hib3JzICAgICAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKkNGTFtNQVhfSEVJR0hUXTsJLyogYXJyYXkgb2YgY29tbW9uIHBhcmVudHMgb2YgY2VudGVyIG5vZGUgYW5kIGl0cyBsZWZ0IG5laWdoYm9yICAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqQ0ZSW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBjb21tb24gcGFyZW50cyBvZiBjZW50ZXIgbm9kZSBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yICovCiAKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogRkVCW01BWF9GRUJfU0laRV07IC8qIGFycmF5IG9mIGVtcHR5IGJ1ZmZlcnMuIE51bWJlciBvZiBidWZmZXJzIGluIGFycmF5IGVxdWFscwotCQkJCQkgICAgIGN1cl9ibGtudW0uICovCi0gIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVzZWRbTUFYX0ZFQl9TSVpFXTsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGhyb3duW01BWF9GRUJfU0laRV07Ci0gIGludCBsbnVtW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBudW1iZXIgb2YgaXRlbXMgd2hpY2ggbXVzdCBiZQotCQkJICAgc2hpZnRlZCB0byB0aGUgbGVmdCBpbiBvcmRlciB0byBiYWxhbmNlIHRoZQotCQkJICAgY3VycmVudCBub2RlOyBmb3IgbGVhdmVzIGluY2x1ZGVzIGl0ZW0gdGhhdAotCQkJICAgd2lsbCBiZSBwYXJ0aWFsbHkgc2hpZnRlZDsgZm9yIGludGVybmFsCi0JCQkgICBub2RlcywgaXQgaXMgdGhlIG51bWJlciBvZiBjaGlsZCBwb2ludGVycwotCQkJICAgcmF0aGVyIHRoYW4gaXRlbXMuIEl0IGluY2x1ZGVzIHRoZSBuZXcgaXRlbQotCQkJICAgYmVpbmcgY3JlYXRlZC4gVGhlIGNvZGUgc29tZXRpbWVzIHN1YnRyYWN0cwotCQkJICAgb25lIHRvIGdldCB0aGUgbnVtYmVyIG9mIHdob2xseSBzaGlmdGVkCi0JCQkgICBpdGVtcyBmb3Igb3RoZXIgcHVycG9zZXMuICovCi0gIGludCBybnVtW01BWF9IRUlHSFRdOwkvKiBzdWJzdGl0dXRlIHJpZ2h0IGZvciBsZWZ0IGluIGNvbW1lbnQgYWJvdmUgKi8KLSAgaW50IGxrZXlbTUFYX0hFSUdIVF07ICAgICAgICAgICAgICAgLyogYXJyYXkgaW5kZXhlZCBieSBoZWlnaHQgaCBtYXBwaW5nIHRoZSBrZXkgZGVsaW1pdGluZyBMW2hdIGFuZAotCQkJCQkgICAgICAgU1toXSB0byBpdHMgaXRlbSBudW1iZXIgd2l0aGluIHRoZSBub2RlIENGTFtoXSAqLwotICBpbnQgcmtleVtNQVhfSEVJR0hUXTsgICAgICAgICAgICAgICAvKiBzdWJzdGl0dXRlIHIgZm9yIGwgaW4gY29tbWVudCBhYm92ZSAqLwotICBpbnQgaW5zZXJ0X3NpemVbTUFYX0hFSUdIVF07ICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJ5IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmcm9tCi0JCQkJCSAgICAgICBTW2hdLiBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHJlbW92aW5nLiAgKi8KLSAgaW50IGJsa251bVtNQVhfSEVJR0hUXTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5vZGVzIHRoYXQgd2lsbCByZXBsYWNlIG5vZGUgU1toXSBhZnRlcgotCQkJCQkgICAgICAgYmFsYW5jaW5nIG9uIHRoZSBsZXZlbCBoIG9mIHRoZSB0cmVlLiAgSWYgMCB0aGVuIFMgaXMKLQkJCQkJICAgICAgIGJlaW5nIGRlbGV0ZWQsIGlmIDEgdGhlbiBTIGlzIHJlbWFpbmluZyBhbmQgbm8gbmV3IG5vZGVzCi0JCQkJCSAgICAgICBhcmUgYmVpbmcgY3JlYXRlZCwgaWYgMiBvciAzIHRoZW4gMSBvciAyIG5ldyBub2RlcyBpcwotCQkJCQkgICAgICAgYmVpbmcgY3JlYXRlZCAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqRkVCW01BWF9GRUJfU0laRV07CS8qIGFycmF5IG9mIGVtcHR5IGJ1ZmZlcnMuIE51bWJlciBvZiBidWZmZXJzIGluIGFycmF5IGVxdWFscworCQkJCQkJICAgY3VyX2Jsa251bS4gKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVzZWRbTUFYX0ZFQl9TSVpFXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRocm93bltNQVhfRkVCX1NJWkVdOworCWludCBsbnVtW01BWF9IRUlHSFRdOwkvKiBhcnJheSBvZiBudW1iZXIgb2YgaXRlbXMgd2hpY2ggbXVzdCBiZQorCQkJCSAgIHNoaWZ0ZWQgdG8gdGhlIGxlZnQgaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGUKKwkJCQkgICBjdXJyZW50IG5vZGU7IGZvciBsZWF2ZXMgaW5jbHVkZXMgaXRlbSB0aGF0CisJCQkJICAgd2lsbCBiZSBwYXJ0aWFsbHkgc2hpZnRlZDsgZm9yIGludGVybmFsCisJCQkJICAgbm9kZXMsIGl0IGlzIHRoZSBudW1iZXIgb2YgY2hpbGQgcG9pbnRlcnMKKwkJCQkgICByYXRoZXIgdGhhbiBpdGVtcy4gSXQgaW5jbHVkZXMgdGhlIG5ldyBpdGVtCisJCQkJICAgYmVpbmcgY3JlYXRlZC4gVGhlIGNvZGUgc29tZXRpbWVzIHN1YnRyYWN0cworCQkJCSAgIG9uZSB0byBnZXQgdGhlIG51bWJlciBvZiB3aG9sbHkgc2hpZnRlZAorCQkJCSAgIGl0ZW1zIGZvciBvdGhlciBwdXJwb3Nlcy4gKi8KKwlpbnQgcm51bVtNQVhfSEVJR0hUXTsJLyogc3Vic3RpdHV0ZSByaWdodCBmb3IgbGVmdCBpbiBjb21tZW50IGFib3ZlICovCisJaW50IGxrZXlbTUFYX0hFSUdIVF07CS8qIGFycmF5IGluZGV4ZWQgYnkgaGVpZ2h0IGggbWFwcGluZyB0aGUga2V5IGRlbGltaXRpbmcgTFtoXSBhbmQKKwkJCQkgICBTW2hdIHRvIGl0cyBpdGVtIG51bWJlciB3aXRoaW4gdGhlIG5vZGUgQ0ZMW2hdICovCisJaW50IHJrZXlbTUFYX0hFSUdIVF07CS8qIHN1YnN0aXR1dGUgciBmb3IgbCBpbiBjb21tZW50IGFib3ZlICovCisJaW50IGluc2VydF9zaXplW01BWF9IRUlHSFRdOwkvKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGJ5IHdlIGFyZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmcm9tCisJCQkJCSAgIFNbaF0uIEEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgcmVtb3ZpbmcuICAqLworCWludCBibGtudW1bTUFYX0hFSUdIVF07CS8qIG51bWJlciBvZiBub2RlcyB0aGF0IHdpbGwgcmVwbGFjZSBub2RlIFNbaF0gYWZ0ZXIKKwkJCQkgICBiYWxhbmNpbmcgb24gdGhlIGxldmVsIGggb2YgdGhlIHRyZWUuICBJZiAwIHRoZW4gUyBpcworCQkJCSAgIGJlaW5nIGRlbGV0ZWQsIGlmIDEgdGhlbiBTIGlzIHJlbWFpbmluZyBhbmQgbm8gbmV3IG5vZGVzCisJCQkJICAgYXJlIGJlaW5nIGNyZWF0ZWQsIGlmIDIgb3IgMyB0aGVuIDEgb3IgMiBuZXcgbm9kZXMgaXMKKwkJCQkgICBiZWluZyBjcmVhdGVkICovCiAKLSAgLyogZmllbGRzIHRoYXQgYXJlIHVzZWQgb25seSBmb3IgYmFsYW5jaW5nIGxlYXZlcyBvZiB0aGUgdHJlZSAqLwotICBpbnQgY3VyX2Jsa251bTsJLyogbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyBoYXZpbmcgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZAkJCSovCi0gIGludCBzMG51bTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGxlZnQgbW9zdCAgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gIGludCBzMW51bTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gIGludCBzMm51bTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIHNlY29uZCBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gIGludCBsYnl0ZXM7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yIGZyb20gdGhlCWxlZnQJKi8KLSAgLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseQkJKi8KLSAgLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgKi8KLSAgaW50IHJieXRlczsgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2lsbCBmbG93IHRvIHRoZSByaWdodCBuZWlnaGJvciBmcm9tIHRoZSByaWdodAkqLwotICAvKiBtb3N0IGxpcXVpZCBpdGVtIHRoYXQgY2Fubm90IGJlIHNoaWZ0ZWQgZnJvbSBTWzBdIGVudGlyZWx5CQkqLwotICAvKiBpZiAtMSB0aGVuIG5vdGhpbmcgd2lsbCBiZSBwYXJ0aWFsbHkgc2hpZnRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIGludCBzMWJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzCSovCi0gICAgICAgICAgICAJCQkvKiBub3RlOiBpZiBTWzBdIHNwbGl0cyBpbnRvIDMgbm9kZXMsIHRoZW4gaXRlbXMgZG8gbm90IG5lZWQgdG8gYmUgY3V0CSovCi0gIGludCBzMmJ5dGVzOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBidWZfdG9fZnJlZVtNQVhfRlJFRV9CTE9DS107IC8qIGJ1ZmZlcnMgd2hpY2ggYXJlIHRvIGJlIGZyZWVkIGFmdGVyIGRvX2JhbGFuY2UgZmluaXNoZXMgYnkgdW5maXhfbm9kZXMgKi8KLSAgY2hhciAqIHZuX2J1ZjsJCS8qIGttYWxsb2NlZCBtZW1vcnkuIFVzZWQgdG8gY3JlYXRlCisJLyogZmllbGRzIHRoYXQgYXJlIHVzZWQgb25seSBmb3IgYmFsYW5jaW5nIGxlYXZlcyBvZiB0aGUgdHJlZSAqLworCWludCBjdXJfYmxrbnVtOwkJLyogbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyBoYXZpbmcgYmVlbiBhbHJlYWR5IGFsbG9jYXRlZCAgICAgICAgICAgICAgICAgKi8KKwlpbnQgczBudW07CQkvKiBudW1iZXIgb2YgaXRlbXMgdGhhdCBmYWxsIGludG8gbGVmdCBtb3N0ICBub2RlIHdoZW4gU1swXSBzcGxpdHMgICAgICovCisJaW50IHMxbnVtOwkJLyogbnVtYmVyIG9mIGl0ZW1zIHRoYXQgZmFsbCBpbnRvIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgICAqLworCWludCBzMm51bTsJCS8qIG51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBzZWNvbmQgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAgICAgKi8KKwlpbnQgbGJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGNhbiBmbG93IHRvIHRoZSBsZWZ0IG5laWdoYm9yIGZyb20gdGhlICAgICAgICBsZWZ0ICAgICovCisJLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAgICAgICAgICovCisJLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgKi8KKwlpbnQgcmJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdpbGwgZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IgZnJvbSB0aGUgcmlnaHQgICAgICAgICovCisJLyogbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAgICAgICAgICovCisJLyogaWYgLTEgdGhlbiBub3RoaW5nIHdpbGwgYmUgcGFydGlhbGx5IHNoaWZ0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWludCBzMWJ5dGVzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGZsb3cgdG8gdGhlIGZpcnN0ICBuZXcgbm9kZSB3aGVuIFNbMF0gc3BsaXRzICAgKi8KKwkvKiBub3RlOiBpZiBTWzBdIHNwbGl0cyBpbnRvIDMgbm9kZXMsIHRoZW4gaXRlbXMgZG8gbm90IG5lZWQgdG8gYmUgY3V0ICAqLworCWludCBzMmJ5dGVzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYnVmX3RvX2ZyZWVbTUFYX0ZSRUVfQkxPQ0tdOwkvKiBidWZmZXJzIHdoaWNoIGFyZSB0byBiZSBmcmVlZCBhZnRlciBkb19iYWxhbmNlIGZpbmlzaGVzIGJ5IHVuZml4X25vZGVzICovCisJY2hhciAqdm5fYnVmOwkJLyoga21hbGxvY2VkIG1lbW9yeS4gVXNlZCB0byBjcmVhdGUKIAkJCQkgICB2aXJ0dWFsIG5vZGUgYW5kIGtlZXAgbWFwIG9mCiAJCQkJICAgZGlydGllZCBiaXRtYXAgYmxvY2tzICovCi0gIGludCB2bl9idWZfc2l6ZTsJCS8qIHNpemUgb2YgdGhlIHZuX2J1ZiAqLwotICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdGJfdm47CS8qIFZOIHN0YXJ0cyBhZnRlciBiaXRtYXAgb2YgYml0bWFwIGJsb2NrcyAqLworCWludCB2bl9idWZfc2l6ZTsJLyogc2l6ZSBvZiB0aGUgdm5fYnVmICovCisJc3RydWN0IHZpcnR1YWxfbm9kZSAqdGJfdm47CS8qIFZOIHN0YXJ0cyBhZnRlciBiaXRtYXAgb2YgYml0bWFwIGJsb2NrcyAqLwogCi0gIGludCBmc19nZW47ICAgICAgICAgICAgICAgICAgLyogc2F2ZWQgdmFsdWUgb2YgYHJlaXNlcmZzX2dlbmVyYXRpb24nIGNvdW50ZXIKLQkJCSAgICAgICAgICBzZWUgRklMRVNZU1RFTV9DSEFOR0VEKCkgbWFjcm8gaW4gcmVpc2VyZnNfZnMuaCAqLworCWludCBmc19nZW47CQkvKiBzYXZlZCB2YWx1ZSBvZiBgcmVpc2VyZnNfZ2VuZXJhdGlvbicgY291bnRlcgorCQkJCSAgIHNlZSBGSUxFU1lTVEVNX0NIQU5HRUQoKSBtYWNybyBpbiByZWlzZXJmc19mcy5oICovCiAjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUwotICBzdHJ1Y3QgaW5fY29yZV9rZXkgIGtleTsJICAgICAgLyoga2V5IHBvaW50ZXIsIHRvIHBhc3MgdG8gYmxvY2sgYWxsb2NhdG9yIG9yCi0JCQkJIGFub3RoZXIgbG93LWxldmVsIHN1YnN5c3RlbSAqLworCXN0cnVjdCBpbl9jb3JlX2tleSBrZXk7CS8qIGtleSBwb2ludGVyLCB0byBwYXNzIHRvIGJsb2NrIGFsbG9jYXRvciBvcgorCQkJCSAgIGFub3RoZXIgbG93LWxldmVsIHN1YnN5c3RlbSAqLwogI2VuZGlmCi19IDsKK307CiAKIC8qIFRoZXNlIGFyZSBtb2RlcyBvZiBiYWxhbmNpbmcgKi8KIApAQCAtMTQ3OSwxMyArMTQzMCwxMiBAQAogLyogdXNlZCBpbiBkb19iYWxhbmNlIGZvciBwYXNzaW5nIHBhcmVudCBvZiBub2RlIGluZm9ybWF0aW9uIHRoYXQgaGFzCiAgICBiZWVuIGdvdHRlbiBmcm9tIHRiIHN0cnVjdCAqLwogc3RydWN0IGJ1ZmZlcl9pbmZvIHsKLSAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGI7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmlfYmg7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmlfcGFyZW50OwotICAgIGludCBiaV9wb3NpdGlvbjsKKwlzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmlfcGFyZW50OworCWludCBiaV9wb3NpdGlvbjsKIH07CiAKLQogLyogdGhlcmUgYXJlIDQgdHlwZXMgb2YgaXRlbXM6IHN0YXQgZGF0YSwgZGlyZWN0b3J5IGl0ZW0sIGluZGlyZWN0LCBkaXJlY3QuCiArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKwogfAkgICAgICAgICAgICB8ICBrX29mZnNldCAgfCBrX3VuaXF1ZW5lc3MgfCBtZXJnZWFibGU/IHwKQEAgLTE1MDMsMjQgKzE0NTMsMjQgQEAKICovCiAKIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgewotICAgIGludCAoKmJ5dGVzX251bWJlcikgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpOwotICAgIHZvaWQgKCpkZWNyZW1lbnRfa2V5KSAoc3RydWN0IGNwdV9rZXkgKik7Ci0gICAgaW50ICgqaXNfbGVmdF9tZXJnZWFibGUpIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogaWgsIHVuc2lnbmVkIGxvbmcgYnNpemUpOwotICAgIHZvaWQgKCpwcmludF9pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICogaXRlbSk7Ci0gICAgdm9pZCAoKmNoZWNrX2l0ZW0pIChzdHJ1Y3QgaXRlbV9oZWFkICosIGNoYXIgKiBpdGVtKTsKKwlpbnQgKCpieXRlc19udW1iZXIpIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGludCBibG9ja19zaXplKTsKKwl2b2lkICgqZGVjcmVtZW50X2tleSkgKHN0cnVjdCBjcHVfa2V5ICopOworCWludCAoKmlzX2xlZnRfbWVyZ2VhYmxlKSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGloLAorCQkJCSAgdW5zaWduZWQgbG9uZyBic2l6ZSk7CisJdm9pZCAoKnByaW50X2l0ZW0pIChzdHJ1Y3QgaXRlbV9oZWFkICosIGNoYXIgKml0ZW0pOworCXZvaWQgKCpjaGVja19pdGVtKSAoc3RydWN0IGl0ZW1faGVhZCAqLCBjaGFyICppdGVtKTsKIAotICAgIGludCAoKmNyZWF0ZV92aSkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCAKLQkJICAgICAgaW50IGlzX2FmZmVjdGVkLCBpbnQgaW5zZXJ0X3NpemUpOwotICAgIGludCAoKmNoZWNrX2xlZnQpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLCAKLQkJCSAgICBpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKTsKLSAgICBpbnQgKCpjaGVja19yaWdodCkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpOwotICAgIGludCAoKnBhcnRfc2l6ZSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyb20sIGludCB0byk7Ci0gICAgaW50ICgqdW5pdF9udW0pIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpOwotICAgIHZvaWQgKCpwcmludF92aSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSk7CisJaW50ICgqY3JlYXRlX3ZpKSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLCBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksCisJCQkgIGludCBpc19hZmZlY3RlZCwgaW50IGluc2VydF9zaXplKTsKKwlpbnQgKCpjaGVja19sZWZ0KSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKKwkJCSAgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApOworCWludCAoKmNoZWNrX3JpZ2h0KSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSk7CisJaW50ICgqcGFydF9zaXplKSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJvbSwgaW50IHRvKTsKKwlpbnQgKCp1bml0X251bSkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSk7CisJdm9pZCAoKnByaW50X3ZpKSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKTsKIH07CiAKLQotZXh0ZXJuIHN0cnVjdCBpdGVtX29wZXJhdGlvbnMgKiBpdGVtX29wcyBbVFlQRV9BTlkgKyAxXTsKK2V4dGVybiBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zICppdGVtX29wc1tUWVBFX0FOWSArIDFdOwogCiAjZGVmaW5lIG9wX2J5dGVzX251bWJlcihpaCxic2l6ZSkgICAgICAgICAgICAgICAgICAgIGl0ZW1fb3BzW2xlX2loX2tfdHlwZSAoaWgpXS0+Ynl0ZXNfbnVtYmVyIChpaCwgYnNpemUpCiAjZGVmaW5lIG9wX2lzX2xlZnRfbWVyZ2VhYmxlKGtleSxic2l6ZSkgICAgICAgICAgICAgIGl0ZW1fb3BzW2xlX2tleV9rX3R5cGUgKGxlX2tleV92ZXJzaW9uIChrZXkpLCBrZXkpXS0+aXNfbGVmdF9tZXJnZWFibGUgKGtleSwgYnNpemUpCkBAIC0xNTMzLDggKzE0ODMsNiBAQAogI2RlZmluZSBvcF91bml0X251bSh2aSkJCQkJICAgICBpdGVtX29wc1sodmkpLT52aV9pbmRleF0tPnVuaXRfbnVtICh2aSkKICNkZWZpbmUgb3BfcHJpbnRfdmkodmkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbV9vcHNbKHZpKS0+dmlfaW5kZXhdLT5wcmludF92aSAodmkpCiAKLQotCiAjZGVmaW5lIENPTVBfU0hPUlRfS0VZUyBjb21wX3Nob3J0X2tleXMKIAogLyogbnVtYmVyIG9mIGJsb2NrcyBwb2ludGVkIHRvIGJ5IHRoZSBpbmRpcmVjdCBpdGVtICovCkBAIC0xNTQ1LDggKzE0OTMsNyBAQAogCiAvKiBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmVkIGJ5IHRoZSBkaXJlY3QgaXRlbSBvciB0aGUgdW5mb3JtYXR0ZWQgbm9kZXMgdGhlIGluZGlyZWN0IGl0ZW0gcG9pbnRzIHRvICovCiAKLQotLyogZ2V0IHRoZSBpdGVtIGhlYWRlciAqLyAKKy8qIGdldCB0aGUgaXRlbSBoZWFkZXIgKi8KICNkZWZpbmUgQl9OX1BJVEVNX0hFQUQoYmgsaXRlbV9udW0pICggKHN0cnVjdCBpdGVtX2hlYWQgKiApKChiaCktPmJfZGF0YSArIEJMS0hfU0laRSkgKyAoaXRlbV9udW0pICkKIAogLyogZ2V0IGtleSAqLwpAQCAtMTU3Nyw5ICsxNTI0LDkgQEAKICNkZWZpbmUgUFVUX0JfSV9QT1NfVU5GTV9QT0lOVEVSKGJoLGloLHBvcywgdmFsKSBkbyB7KigoKHVucF90ICopQl9JX1BJVEVNKGJoLGloKSkgKyAocG9zKSkgPSBjcHVfdG9fbGUzMih2YWwpOyB9IHdoaWxlICgwKQogCiBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIHsKLSAgICBfX3UzMiBvYmplY3RpZCA7Ci0gICAgX191MzIgZGlyaWQgOwotfSA7CisJX191MzIgb2JqZWN0aWQ7CisJX191MzIgZGlyaWQ7Cit9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIERFQ0xBUkFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE1OTUsMTEgKzE1NDIsMTEgQEAKIAogLyogZmlyc3QgYmxvY2sgd3JpdHRlbiBpbiBhIGNvbW1pdC4gICovCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjIHsKLSAgX19sZTMyIGpfdHJhbnNfaWQgOwkJCS8qIGlkIG9mIGNvbW1pdCAqLwotICBfX2xlMzIgal9sZW4gOwkJCS8qIGxlbmd0aCBvZiBjb21taXQuIGxlbiArMSBpcyB0aGUgY29tbWl0IGJsb2NrICovCi0gIF9fbGUzMiBqX21vdW50X2lkIDsJCQkJLyogbW91bnQgaWQgb2YgdGhpcyB0cmFucyovCi0gIF9fbGUzMiBqX3JlYWxibG9ja1sxXSA7IC8qIHJlYWwgbG9jYXRpb25zIGZvciBlYWNoIGJsb2NrICovCi19IDsKKwlfX2xlMzIgal90cmFuc19pZDsJLyogaWQgb2YgY29tbWl0ICovCisJX19sZTMyIGpfbGVuOwkJLyogbGVuZ3RoIG9mIGNvbW1pdC4gbGVuICsxIGlzIHRoZSBjb21taXQgYmxvY2sgKi8KKwlfX2xlMzIgal9tb3VudF9pZDsJLyogbW91bnQgaWQgb2YgdGhpcyB0cmFucyAqLworCV9fbGUzMiBqX3JlYWxibG9ja1sxXTsJLyogcmVhbCBsb2NhdGlvbnMgZm9yIGVhY2ggYmxvY2sgKi8KK307CiAKICNkZWZpbmUgZ2V0X2Rlc2NfdHJhbnNfaWQoZCkgICBsZTMyX3RvX2NwdSgoZCktPmpfdHJhbnNfaWQpCiAjZGVmaW5lIGdldF9kZXNjX3RyYW5zX2xlbihkKSAgbGUzMl90b19jcHUoKGQpLT5qX2xlbikKQEAgLTE2MTEsMTAgKzE1NTgsMTAgQEAKIAogLyogbGFzdCBibG9jayB3cml0dGVuIGluIGEgY29tbWl0ICovCiBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgewotICBfX2xlMzIgal90cmFuc19pZCA7CQkJLyogbXVzdCBtYXRjaCBqX3RyYW5zX2lkIGZyb20gdGhlIGRlc2MgYmxvY2sgKi8KLSAgX19sZTMyIGpfbGVuIDsJCQkvKiBkaXR0byAqLwotICBfX2xlMzIgal9yZWFsYmxvY2tbMV0gOyAvKiByZWFsIGxvY2F0aW9ucyBmb3IgZWFjaCBibG9jayAqLwotfSA7CisJX19sZTMyIGpfdHJhbnNfaWQ7CS8qIG11c3QgbWF0Y2ggal90cmFuc19pZCBmcm9tIHRoZSBkZXNjIGJsb2NrICovCisJX19sZTMyIGpfbGVuOwkJLyogZGl0dG8gKi8KKwlfX2xlMzIgal9yZWFsYmxvY2tbMV07CS8qIHJlYWwgbG9jYXRpb25zIGZvciBlYWNoIGJsb2NrICovCit9OwogCiAjZGVmaW5lIGdldF9jb21taXRfdHJhbnNfaWQoYykgbGUzMl90b19jcHUoKGMpLT5qX3RyYW5zX2lkKQogI2RlZmluZSBnZXRfY29tbWl0X3RyYW5zX2xlbihjKSAgICAgICAgbGUzMl90b19jcHUoKGMpLT5qX2xlbikKQEAgLTE2MjgsMjcgKzE1NzUsMzQgQEAKICoqIGFuZCB0aGlzIHRyYW5zYWN0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgcmVwbGF5ZWQuCiAqLwogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyIHsKLSAgX19sZTMyIGpfbGFzdF9mbHVzaF90cmFuc19pZCA7CQkvKiBpZCBvZiBsYXN0IGZ1bGx5IGZsdXNoZWQgdHJhbnNhY3Rpb24gKi8KLSAgX19sZTMyIGpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA7ICAgICAgLyogb2Zmc2V0IGluIHRoZSBsb2cgb2Ygd2hlcmUgdG8gc3RhcnQgcmVwbGF5IGFmdGVyIGEgY3Jhc2ggKi8KLSAgX19sZTMyIGpfbW91bnRfaWQgOwotICAvKiAxMiAqLyBzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgamhfam91cm5hbDsKLX0gOworCV9fbGUzMiBqX2xhc3RfZmx1c2hfdHJhbnNfaWQ7CS8qIGlkIG9mIGxhc3QgZnVsbHkgZmx1c2hlZCB0cmFuc2FjdGlvbiAqLworCV9fbGUzMiBqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ7CS8qIG9mZnNldCBpbiB0aGUgbG9nIG9mIHdoZXJlIHRvIHN0YXJ0IHJlcGxheSBhZnRlciBhIGNyYXNoICovCisJX19sZTMyIGpfbW91bnRfaWQ7CisJLyogMTIgKi8gc3RydWN0IGpvdXJuYWxfcGFyYW1zIGpoX2pvdXJuYWw7Cit9OwogCiAvKiBiaWdnZXN0IHR1bmFibGUgZGVmaW5lcyBhcmUgcmlnaHQgaGVyZSAqLwotI2RlZmluZSBKT1VSTkFMX0JMT0NLX0NPVU5UIDgxOTIgLyogbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgam91cm5hbCAqLwotI2RlZmluZSBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIDEwMjQgICAvKiBiaWdnZXN0IHBvc3NpYmxlIHNpbmdsZSB0cmFuc2FjdGlvbiwgZG9uJ3QgY2hhbmdlIGZvciBub3cgKDgvMy85OSkgKi8KKyNkZWZpbmUgSk9VUk5BTF9CTE9DS19DT1VOVCA4MTkyCS8qIG51bWJlciBvZiBibG9ja3MgaW4gdGhlIGpvdXJuYWwgKi8KKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCAxMDI0CS8qIGJpZ2dlc3QgcG9zc2libGUgc2luZ2xlIHRyYW5zYWN0aW9uLCBkb24ndCBjaGFuZ2UgZm9yIG5vdyAoOC8zLzk5KSAqLwogI2RlZmluZSBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIDI1NgotI2RlZmluZSBKT1VSTkFMX01BWF9CQVRDSF9ERUZBVUxUICAgOTAwIC8qIG1heCBibG9ja3MgdG8gYmF0Y2ggaW50byBvbmUgdHJhbnNhY3Rpb24sIGRvbid0IG1ha2UgdGhpcyBhbnkgYmlnZ2VyIHRoYW4gOTAwICovCisjZGVmaW5lIEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQgICA5MDAJLyogbWF4IGJsb2NrcyB0byBiYXRjaCBpbnRvIG9uZSB0cmFuc2FjdGlvbiwgZG9uJ3QgbWFrZSB0aGlzIGFueSBiaWdnZXIgdGhhbiA5MDAgKi8KICNkZWZpbmUgSk9VUk5BTF9NSU5fUkFUSU8gMgotI2RlZmluZSBKT1VSTkFMX01BWF9DT01NSVRfQUdFIDMwIAorI2RlZmluZSBKT1VSTkFMX01BWF9DT01NSVRfQUdFIDMwCiAjZGVmaW5lIEpPVVJOQUxfTUFYX1RSQU5TX0FHRSAzMAogI2RlZmluZSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAoMyAqIChNQVhfSEVJR0hULTIpICsgOSkKICNpZmRlZiBDT05GSUdfUVVPVEEKLSNkZWZpbmUgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTIDIJLyogV2UgbmVlZCB0byB1cGRhdGUgZGF0YSBhbmQgaW5vZGUgKGF0aW1lKSAqLwotI2RlZmluZSBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyAoRFFVT1RfTUFYX1dSSVRFUyooSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQrMikrMSkJLyogMSBiYWxhbmNpbmcsIDEgYml0bWFwLCAxIGRhdGEgcGVyIHdyaXRlICsgc3RhdCBkYXRhIHVwZGF0ZSAqLworLyogV2UgbmVlZCB0byB1cGRhdGUgZGF0YSBhbmQgaW5vZGUgKGF0aW1lKSAqLworI2RlZmluZSBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MocykgKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmICgxPDxSRUlTRVJGU19RVU9UQSkgPyAyIDogMCkKKy8qIDEgYmFsYW5jaW5nLCAxIGJpdG1hcCwgMSBkYXRhIHBlciB3cml0ZSArIHN0YXQgZGF0YSB1cGRhdGUgKi8KKyNkZWZpbmUgUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MocykgKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmICgxPDxSRUlTRVJGU19RVU9UQSkgPyBcCisoRFFVT1RfSU5JVF9BTExPQyooSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQrMikrRFFVT1RfSU5JVF9SRVdSSVRFKzEpIDogMCkKKy8qIHNhbWUgYXMgd2l0aCBJTklUICovCisjZGVmaW5lIFJFSVNFUkZTX1FVT1RBX0RFTF9CTE9DS1MocykgKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmICgxPDxSRUlTRVJGU19RVU9UQSkgPyBcCisoRFFVT1RfREVMX0FMTE9DKihKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCsyKStEUVVPVF9ERUxfUkVXUklURSsxKSA6IDApCiAjZWxzZQotI2RlZmluZSBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MgMAotI2RlZmluZSBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyAwCisjZGVmaW5lIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyhzKSAwCisjZGVmaW5lIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKHMpIDAKKyNkZWZpbmUgUkVJU0VSRlNfUVVPVEFfREVMX0JMT0NLUyhzKSAwCiAjZW5kaWYKIAogLyogYm90aCBvZiB0aGVzZSBjYW4gYmUgYXMgbG93IGFzIDEsIG9yIGFzIGhpZ2ggYXMgeW91IHdhbnQuICBUaGUgbWluIGlzIHRoZQpAQCAtMTY1NywxMCArMTYxMSwxMCBAQAogKiogdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vZGVzIGlzID4gbWF4LCB0aGUgbm9kZSBpcyBmcmVlZCwgb3RoZXJ3aXNlLCAKICoqIGl0IGlzIHB1dCBvbiBhIGZyZWUgbGlzdCBmb3IgZmFzdGVyIHVzZSBsYXRlci4KICovCi0jZGVmaW5lIFJFSVNFUkZTX01JTl9CSVRNQVBfTk9ERVMgMTAgCi0jZGVmaW5lIFJFSVNFUkZTX01BWF9CSVRNQVBfTk9ERVMgMTAwIAorI2RlZmluZSBSRUlTRVJGU19NSU5fQklUTUFQX05PREVTIDEwCisjZGVmaW5lIFJFSVNFUkZTX01BWF9CSVRNQVBfTk9ERVMgMTAwCiAKLSNkZWZpbmUgSkJIX0hBU0hfU0hJRlQgMTMgLyogdGhlc2UgYXJlIGJhc2VkIG9uIGpvdXJuYWwgaGFzaCBzaXplIG9mIDgxOTIgKi8KKyNkZWZpbmUgSkJIX0hBU0hfU0hJRlQgMTMJLyogdGhlc2UgYXJlIGJhc2VkIG9uIGpvdXJuYWwgaGFzaCBzaXplIG9mIDgxOTIgKi8KICNkZWZpbmUgSkJIX0hBU0hfTUFTSyA4MTkxCiAKICNkZWZpbmUgX2poYXNoZm4oc2IsYmxvY2spCVwKQEAgLTE2NzQsMTQgKzE2MjgsMTQgQEAKICNkZWZpbmUgam91cm5hbF9icmVhZChzLCBibG9jaykgX19icmVhZChTQl9KT1VSTkFMKHMpLT5qX2Rldl9iZCwgYmxvY2ssIHMtPnNfYmxvY2tzaXplKQogCiBlbnVtIHJlaXNlcmZzX2JoX3N0YXRlX2JpdHMgewotICAgIEJIX0pEaXJ0eSA9IEJIX1ByaXZhdGVTdGFydCwgLyogYnVmZmVyIGlzIGluIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KLSAgICBCSF9KRGlydHlfd2FpdCwKLSAgICBCSF9KTmV3LCAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2sgYmxvY2sgd2FzIHRha2VuIG9mZiBmcmVlIGxpc3QgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZWluZyBpbiBhIGZpbmlzaGVkIHRyYW5zYWN0aW9uLCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd3JpdHRlbiB0byBkaXNrLiBDYW4gYmUgcmV1c2VkIGltbWVkLiAqLwotICAgIEJIX0pQcmVwYXJlZCwKLSAgICBCSF9KUmVzdG9yZV9kaXJ0eSwKLSAgICBCSF9KVGVzdCwgLy8gZGVidWdnaW5nIG9ubHkgd2lsbCBnbyBhd2F5CisJQkhfSkRpcnR5ID0gQkhfUHJpdmF0ZVN0YXJ0LAkvKiBidWZmZXIgaXMgaW4gY3VycmVudCB0cmFuc2FjdGlvbiAqLworCUJIX0pEaXJ0eV93YWl0LAorCUJIX0pOZXcsCQkvKiBkaXNrIGJsb2NrIHdhcyB0YWtlbiBvZmYgZnJlZSBsaXN0IGJlZm9yZQorCQkJCSAqIGJlaW5nIGluIGEgZmluaXNoZWQgdHJhbnNhY3Rpb24sIG9yCisJCQkJICogd3JpdHRlbiB0byBkaXNrLiBDYW4gYmUgcmV1c2VkIGltbWVkLiAqLworCUJIX0pQcmVwYXJlZCwKKwlCSF9KUmVzdG9yZV9kaXJ0eSwKKwlCSF9KVGVzdCwJCS8vIGRlYnVnZ2luZyBvbmx5IHdpbGwgZ28gYXdheQogfTsKIAogQlVGRkVSX0ZOUyhKRGlydHksIGpvdXJuYWxlZCk7CkBAIC0xNzAxLDE3NSArMTY1NSwxOTIgQEAKICoqIHRyYW5zYWN0aW9uIGhhbmRsZSB3aGljaCBpcyBwYXNzZWQgYXJvdW5kIGZvciBhbGwgam91cm5hbCBjYWxscwogKi8KIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgewotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnRfc3VwZXIgOyAvKiBzdXBlciBmb3IgdGhpcyBGUyB3aGVuIGpvdXJuYWxfYmVnaW4gd2FzCi0JCQkJICAgY2FsbGVkLiBzYXZlcyBjYWxscyB0byByZWlzZXJmc19nZXRfc3VwZXIKLQkJCQkgICBhbHNvIHVzZWQgYnkgbmVzdGVkIHRyYW5zYWN0aW9ucyB0byBtYWtlCi0JCQkJICAgc3VyZSB0aGV5IGFyZSBuZXN0aW5nIG9uIHRoZSByaWdodCBGUwotCQkJCSAgIF9tdXN0XyBiZSBmaXJzdCBpbiB0aGUgaGFuZGxlCi0JCQkJKi8KLSAgaW50IHRfcmVmY291bnQ7Ci0gIGludCB0X2Jsb2Nrc19sb2dnZWQgOyAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgdGhpcyB3cml0ZXIgaGFzIGxvZ2dlZCAqLwotICBpbnQgdF9ibG9ja3NfYWxsb2NhdGVkIDsgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIHRoaXMgd3JpdGVyIGFsbG9jYXRlZCAqLwotICB1bnNpZ25lZCBsb25nIHRfdHJhbnNfaWQgOyAgICAvKiBzYW5pdHkgY2hlY2ssIGVxdWFscyB0aGUgY3VycmVudCB0cmFucyBpZCAqLwotICB2b2lkICp0X2hhbmRsZV9zYXZlIDsJCS8qIHNhdmUgZXhpc3RpbmcgY3VycmVudC0+am91cm5hbF9pbmZvICovCi0gIHVuc2lnbmVkIGRpc3BsYWNlX25ld19ibG9ja3M6MTsgLyogaWYgbmV3IGJsb2NrIGFsbG9jYXRpb24gb2NjdXJyZXMsIHRoYXQgYmxvY2sKLQkJCQkgICBzaG91bGQgYmUgZGlzcGxhY2VkIGZyb20gb3RoZXJzICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgdF9saXN0OwotfSA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICp0X3N1cGVyOwkvKiBzdXBlciBmb3IgdGhpcyBGUyB3aGVuIGpvdXJuYWxfYmVnaW4gd2FzCisJCQkJCSAgIGNhbGxlZC4gc2F2ZXMgY2FsbHMgdG8gcmVpc2VyZnNfZ2V0X3N1cGVyCisJCQkJCSAgIGFsc28gdXNlZCBieSBuZXN0ZWQgdHJhbnNhY3Rpb25zIHRvIG1ha2UKKwkJCQkJICAgc3VyZSB0aGV5IGFyZSBuZXN0aW5nIG9uIHRoZSByaWdodCBGUworCQkJCQkgICBfbXVzdF8gYmUgZmlyc3QgaW4gdGhlIGhhbmRsZQorCQkJCQkgKi8KKwlpbnQgdF9yZWZjb3VudDsKKwlpbnQgdF9ibG9ja3NfbG9nZ2VkOwkvKiBudW1iZXIgb2YgYmxvY2tzIHRoaXMgd3JpdGVyIGhhcyBsb2dnZWQgKi8KKwlpbnQgdF9ibG9ja3NfYWxsb2NhdGVkOwkvKiBudW1iZXIgb2YgYmxvY2tzIHRoaXMgd3JpdGVyIGFsbG9jYXRlZCAqLworCXVuc2lnbmVkIGxvbmcgdF90cmFuc19pZDsJLyogc2FuaXR5IGNoZWNrLCBlcXVhbHMgdGhlIGN1cnJlbnQgdHJhbnMgaWQgKi8KKwl2b2lkICp0X2hhbmRsZV9zYXZlOwkvKiBzYXZlIGV4aXN0aW5nIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyAqLworCXVuc2lnbmVkIGRpc3BsYWNlX25ld19ibG9ja3M6MTsJLyogaWYgbmV3IGJsb2NrIGFsbG9jYXRpb24gb2NjdXJyZXMsIHRoYXQgYmxvY2sKKwkJCQkJICAgc2hvdWxkIGJlIGRpc3BsYWNlZCBmcm9tIG90aGVycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdF9saXN0OworfTsKIAogLyogdXNlZCB0byBrZWVwIHRyYWNrIG9mIG9yZGVyZWQgYW5kIHRhaWwgd3JpdGVzLCBhdHRhY2hlZCB0byB0aGUgYnVmZmVyCiAgKiBoZWFkIHRocm91Z2ggYl9qb3VybmFsX2hlYWQuCiAgKi8KIHN0cnVjdCByZWlzZXJmc19qaCB7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLSAgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCiB2b2lkIHJlaXNlcmZzX2ZyZWVfamgoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiBpbnQgcmVpc2VyZnNfYWRkX3RhaWxfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIGludCByZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwotaW50IGpvdXJuYWxfbWFya19kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSA7CitpbnQgam91cm5hbF9tYXJrX2RpcnR5KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwKKwkJICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKIAotc3RhdGljIGlubGluZSBpbnQKLXJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coc3RydWN0IGlub2RlICppbm9kZSkgewotICAgIGlmIChyZWlzZXJmc19kYXRhX2xvZyhpbm9kZS0+aV9zYikgfHwKLSAgICAgICAoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX2RhdGFfbG9nKSkKLSAgICAgICAgcmV0dXJuIDEgOwotICAgIHJldHVybiAwIDsKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAocmVpc2VyZnNfZGF0YV9sb2coaW5vZGUtPmlfc2IpIHx8CisJICAgIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfZGF0YV9sb2cpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKLSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA7Ci0gICAgaWYgKHRoICYmIHRoLT50X3N1cGVyID09IHMpCi0gICAgICAgIHJldHVybiAxIDsKLSAgICBpZiAodGggJiYgdGgtPnRfc3VwZXIgPT0gTlVMTCkKLSAgICAgICAgQlVHKCk7Ci0gICAgcmV0dXJuIDAgOworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm87CisJaWYgKHRoICYmIHRoLT50X3N1cGVyID09IHMpCisJCXJldHVybiAxOworCWlmICh0aCAmJiB0aC0+dF9zdXBlciA9PSBOVUxMKQorCQlCVUcoKTsKKwlyZXR1cm4gMDsKIH0KIAogaW50IHJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKIAotc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqCi1yZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgY291bnQpOworc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqcmVpc2VyZnNfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3QKKwkJCQkJCQkJICAgIHN1cGVyX2Jsb2NrCisJCQkJCQkJCSAgICAqLAorCQkJCQkJCQkgICAgaW50IGNvdW50KTsKIGludCByZWlzZXJmc19lbmRfcGVyc2lzdGVudF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICopOwogaW50IHJlaXNlcmZzX2NvbW1pdF9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAotCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CisJCQkgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOwogaW50IHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLWludCByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHN0cnVjdCBpbm9kZSAqKSA7Ci1pbnQgIHJlaXNlcmZzX2lub2RlX25lZWRzX2NvbW1pdChzdHJ1Y3QgaW5vZGUgKikgOwotdm9pZCByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICopIDsKLXZvaWQgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIDsKLXZvaWQgcmVpc2VyZnNfYmxvY2tfd3JpdGVzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKSA7Ci12b2lkIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIDsKLXZvaWQgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNoYXIgKmNhbGxlcikgOwotaW50IHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KSA7Ci12b2lkIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSA7Ci1pbnQgam91cm5hbF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICogal9kZXZfbmFtZSwgaW50IG9sZF9mb3JtYXQsIHVuc2lnbmVkIGludCkgOwotaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopIDsKLWludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSosIHN0cnVjdCBzdXBlcl9ibG9jayAqKSA7Ci1pbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZykgOwotaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZykgOwotaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLCBiX2Jsb2NrbnJfdCBibG9ja25yKSA7Ci1pbnQgam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgaW50KSA7Ci1pbnQgcmVpc2VyZnNfaW5fam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGJtYXBfbnIsIGludCBiaXRfbnIsIGludCBzZWFyY2hhbGwsIGJfYmxvY2tucl90ICpuZXh0KSA7Ci1pbnQgam91cm5hbF9iZWdpbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nKSA7Ci1pbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcpIDsKLXZvaWQgcmVpc2VyZnNfam91cm5hbF9hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKTsKLXZvaWQgcmVpc2VyZnNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pOwotaW50IHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqLCBpbnQpIDsKK2ludCByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2ludCByZWlzZXJmc19pbm9kZV9uZWVkc19jb21taXQoc3RydWN0IGlub2RlICopOwordm9pZCByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICopOwordm9pZCByZWlzZXJmc193YWl0X29uX3dyaXRlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7Cit2b2lkIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCk7Cit2b2lkIHJlaXNlcmZzX2FsbG93X3dyaXRlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOwordm9pZCByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqY2FsbGVyKTsKK2ludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJCSBpbnQgd2FpdCk7Cit2b2lkIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworaW50IGpvdXJuYWxfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqal9kZXZfbmFtZSwgaW50IG9sZF9mb3JtYXQsCisJCSB1bnNpZ25lZCBpbnQpOworaW50IGpvdXJuYWxfcmVsZWFzZShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2ludCBqb3VybmFsX3JlbGVhc2VfZXJyb3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLAorCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitpbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJdW5zaWduZWQgbG9uZyk7CitpbnQgam91cm5hbF9lbmRfc3luYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqLAorCQkgICAgIHVuc2lnbmVkIGxvbmcpOworaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgYl9ibG9ja25yX3QgYmxvY2tucik7CitpbnQgam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgaW50KTsKK2ludCByZWlzZXJmc19pbl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgYm1hcF9uciwgaW50IGJpdF9uciwKKwkJCWludCBzZWFyY2hhbGwsIGJfYmxvY2tucl90ICogbmV4dCk7CitpbnQgam91cm5hbF9iZWdpbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosCisJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcpOworaW50IGpvdXJuYWxfam9pbl9hYm9ydChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosCisJCSAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyk7Cit2b2lkIHJlaXNlcmZzX2pvdXJuYWxfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vKTsKK3ZvaWQgcmVpc2VyZnNfYWJvcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGVycm5vLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitpbnQgcmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKwkJCQkgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKiwgaW50KTsKIAotdm9pZCBhZGRfc2F2ZV9saW5rIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICogdGgsCi0JCQkJCXN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpOwotaW50IHJlbW92ZV9zYXZlX2xpbmsgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpOwordm9pZCBhZGRfc2F2ZV9saW5rKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHJ1bmNhdGUpOworaW50IHJlbW92ZV9zYXZlX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHRydW5jYXRlKTsKIAogLyogb2JqZWN0aWQuYyAqLwotX191MzIgcmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpOwotdm9pZCByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgX191MzIgb2JqZWN0aWRfdG9fcmVsZWFzZSk7Ci1pbnQgcmVpc2VyZnNfY29udmVydF9vYmplY3RpZF9tYXBfdjEoc3RydWN0IHN1cGVyX2Jsb2NrICopIDsKK19fdTMyIHJlaXNlcmZzX2dldF91bnVzZWRfb2JqZWN0aWQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpOwordm9pZCByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICAgIF9fdTMyIG9iamVjdGlkX3RvX3JlbGVhc2UpOworaW50IHJlaXNlcmZzX2NvbnZlcnRfb2JqZWN0aWRfbWFwX3YxKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAogLyogc3RyZWUuYyAqLwogaW50IEJfSVNfSU5fVFJFRShjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7Ci1leHRlcm4gdm9pZCBjb3B5X2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICogcF92X3RvLAotCQkJCQkJCQkgIGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKiBwX3ZfZnJvbSk7CitleHRlcm4gdm9pZCBjb3B5X2l0ZW1faGVhZChzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfdG8sCisJCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpwX3ZfZnJvbSk7CiAKIC8vIGZpcnN0IGtleSBpcyBpbiBjcHUgZm9ybSwgc2Vjb25kIC0gbGUKLWV4dGVybiBpbnQgIGNvbXBfc2hvcnRfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGxlX2tleSwKLQkJCQkgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5KTsKLWV4dGVybiB2b2lkIGxlX2tleTJjcHVfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIHRvLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogZnJvbSk7CitleHRlcm4gaW50IGNvbXBfc2hvcnRfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpsZV9rZXksCisJCQkgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqY3B1X2tleSk7CitleHRlcm4gdm9pZCBsZV9rZXkyY3B1X2tleShzdHJ1Y3QgY3B1X2tleSAqdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmZyb20pOwogCiAvLyBib3RoIGFyZSBpbiBsZSBmb3JtCi1leHRlcm4gaW50IGNvbXBfbGVfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqLCBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICopOwotZXh0ZXJuIGludCBjb21wX3Nob3J0X2xlX2tleXMgKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiwgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqKTsKK2V4dGVybiBpbnQgY29tcF9sZV9rZXlzKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiwKKwkJCWNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKik7CitleHRlcm4gaW50IGNvbXBfc2hvcnRfbGVfa2V5cyhjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICopOwogCiAvLwogLy8gZ2V0IGtleSB2ZXJzaW9uIGZyb20gb24gZGlzayBrZXkgLSBrbHVkZ2UKIC8vCi1zdGF0aWMgaW5saW5lIGludCBsZV9rZXlfdmVyc2lvbiAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSkKK3N0YXRpYyBpbmxpbmUgaW50IGxlX2tleV92ZXJzaW9uKGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmtleSkKIHsKLSAgICBpbnQgdHlwZTsKLSAgICAKLSAgICB0eXBlID0gb2Zmc2V0X3YyX2tfdHlwZSggJihrZXktPnUua19vZmZzZXRfdjIpKTsKLSAgICBpZiAodHlwZSAhPSBUWVBFX0RJUkVDVCAmJiB0eXBlICE9IFRZUEVfSU5ESVJFQ1QgJiYgdHlwZSAhPSBUWVBFX0RJUkVOVFJZKQotCXJldHVybiBLRVlfRk9STUFUXzNfNTsKKwlpbnQgdHlwZTsKIAotICAgIHJldHVybiBLRVlfRk9STUFUXzNfNjsKLQkKKwl0eXBlID0gb2Zmc2V0X3YyX2tfdHlwZSgmKGtleS0+dS5rX29mZnNldF92MikpOworCWlmICh0eXBlICE9IFRZUEVfRElSRUNUICYmIHR5cGUgIT0gVFlQRV9JTkRJUkVDVAorCSAgICAmJiB0eXBlICE9IFRZUEVfRElSRU5UUlkpCisJCXJldHVybiBLRVlfRk9STUFUXzNfNTsKKworCXJldHVybiBLRVlfRk9STUFUXzNfNjsKKwogfQogCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2tleSAoc3RydWN0IHJlaXNlcmZzX2tleSAqdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKmZyb20pCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9rZXkoc3RydWN0IHJlaXNlcmZzX2tleSAqdG8sCisJCQkgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqZnJvbSkKIHsKLSAgICBtZW1jcHkgKHRvLCBmcm9tLCBLRVlfU0laRSk7CisJbWVtY3B5KHRvLCBmcm9tLCBLRVlfU0laRSk7CiB9CiAKLQotaW50IGNvbXBfaXRlbXMgKGNvbnN0IHN0cnVjdCBpdGVtX2hlYWQgKiBzdG9yZWRfaWgsIGNvbnN0IHN0cnVjdCBwYXRoICogcF9zX3BhdGgpOwotY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGdldF9ya2V5IChjb25zdCBzdHJ1Y3QgcGF0aCAqIHBfc19jaGtfcGF0aCwKLQkJCQkJCQkgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYik7Ci1pbnQgc2VhcmNoX2J5X2tleSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICosIAotCQkJCSAgIHN0cnVjdCBwYXRoICosIGludCk7CitpbnQgY29tcF9pdGVtcyhjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICpzdG9yZWRfaWgsIGNvbnN0IHN0cnVjdCBwYXRoICpwX3NfcGF0aCk7Citjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICpnZXRfcmtleShjb25zdCBzdHJ1Y3QgcGF0aCAqcF9zX2Noa19wYXRoLAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYik7CitpbnQgc2VhcmNoX2J5X2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwKKwkJICBzdHJ1Y3QgcGF0aCAqLCBpbnQpOwogI2RlZmluZSBzZWFyY2hfaXRlbShzLGtleSxwYXRoKSBzZWFyY2hfYnlfa2V5IChzLCBrZXksIHBhdGgsIERJU0tfTEVBRl9OT0RFX0xFVkVMKQotaW50IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsIAotCQkJCQkJCQljb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19jcHVfa2V5LCAKLQkJCQkJCQkJc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgpOwotZXh0ZXJuIHZvaWQgZGVjcmVtZW50X2Jjb3VudCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogcF9zX2JoKTsKLXZvaWQgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGggKHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoKTsKLXZvaWQgcGF0aHJlbHNlIChzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aCk7Ci1pbnQgcmVpc2VyZnNfY2hlY2tfcGF0aChzdHJ1Y3QgcGF0aCAqcCkgOwotdm9pZCBwYXRocmVsc2VfYW5kX3Jlc3RvcmUgKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgpOworaW50IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICpwX3NfY3B1X2tleSwKKwkJCSAgICAgICBzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKK2V4dGVybiB2b2lkIGRlY3JlbWVudF9iY291bnQoc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfYmgpOwordm9pZCBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKK3ZvaWQgcGF0aHJlbHNlKHN0cnVjdCBwYXRoICpwX3Nfc2VhcmNoX3BhdGgpOworaW50IHJlaXNlcmZzX2NoZWNrX3BhdGgoc3RydWN0IHBhdGggKnApOwordm9pZCBwYXRocmVsc2VfYW5kX3Jlc3RvcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcGF0aCAqcF9zX3NlYXJjaF9wYXRoKTsKIAotaW50IHJlaXNlcmZzX2luc2VydF9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkgIHN0cnVjdCBwYXRoICogcGF0aCwgCi0JCQkgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCi0JCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKiBib2R5KTsKK2ludCByZWlzZXJmc19pbnNlcnRfaXRlbShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJIHN0cnVjdCBpdGVtX2hlYWQgKmloLAorCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKmJvZHkpOwogCi1pbnQgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgICAgIHN0cnVjdCBwYXRoICogcGF0aCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKiBib2R5LCBpbnQgcGFzdGVfc2l6ZSk7CitpbnQgcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICBzdHJ1Y3QgcGF0aCAqcGF0aCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgY29uc3QgY2hhciAqYm9keSwgaW50IHBhc3RlX3NpemUpOwogCi1pbnQgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgICAgc3RydWN0IHBhdGggKiBwYXRoLAotCQkJICAgIHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgIGxvZmZfdCBuZXdfZmlsZV9zaXplKTsKK2ludCByZWlzZXJmc19jdXRfZnJvbV9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgICBzdHJ1Y3QgY3B1X2tleSAqa2V5LAorCQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCBsb2ZmX3QgbmV3X2ZpbGVfc2l6ZSk7CiAKLWludCByZWlzZXJmc19kZWxldGVfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCi0JCQkgIHN0cnVjdCBwYXRoICogcGF0aCwgCi0JCQkgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LAotCQkJICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgCi0JCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfdW5fYmgpOworaW50IHJlaXNlcmZzX2RlbGV0ZV9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJIHN0cnVjdCBwYXRoICpwYXRoLAorCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpwX3NfdW5fYmgpOwogCi12b2lkIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpOwotaW50IHJlaXNlcmZzX2RlbGV0ZV9vYmplY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBwX3NfaW5vZGUpOwotaW50IHJlaXNlcmZzX2RvX3RydW5jYXRlIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCSAgIHN0cnVjdCAgaW5vZGUgKiBwX3NfaW5vZGUsIHN0cnVjdCBwYWdlICosIAotCQkJICAgaW50IHVwZGF0ZV90aW1lc3RhbXBzKTsKK3ZvaWQgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJlaXNlcmZzX2tleSAqa2V5KTsKK2ludCByZWlzZXJmc19kZWxldGVfb2JqZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgc3RydWN0IGlub2RlICpwX3NfaW5vZGUpOworaW50IHJlaXNlcmZzX2RvX3RydW5jYXRlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJIHN0cnVjdCBpbm9kZSAqcF9zX2lub2RlLCBzdHJ1Y3QgcGFnZSAqLAorCQkJIGludCB1cGRhdGVfdGltZXN0YW1wcyk7CiAKICNkZWZpbmUgaV9ibG9ja19zaXplKGlub2RlKSAoKGlub2RlKS0+aV9zYi0+c19ibG9ja3NpemUpCiAjZGVmaW5lIGZpbGVfc2l6ZShpbm9kZSkgKChpbm9kZSktPmlfc2l6ZSkKQEAgLTE4NzgsNjYgKzE4NDksNjcgQEAKICNkZWZpbmUgdGFpbF9oYXNfdG9fYmVfcGFja2VkKGlub2RlKSAoaGF2ZV9sYXJnZV90YWlscyAoKGlub2RlKS0+aV9zYik/XAogIVNUT1JFX1RBSUxfSU5fVU5GTV9TMShmaWxlX3NpemUgKGlub2RlKSwgdGFpbF9zaXplKGlub2RlKSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTpoYXZlX3NtYWxsX3RhaWxzICgoaW5vZGUpLT5pX3NiKT8hU1RPUkVfVEFJTF9JTl9VTkZNX1MyKGZpbGVfc2l6ZSAoaW5vZGUpLCB0YWlsX3NpemUoaW5vZGUpLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOjAgKQogCi12b2lkIHBhZGRfaXRlbSAoY2hhciAqIGl0ZW0sIGludCB0b3RhbF9sZW5ndGgsIGludCBsZW5ndGgpOwordm9pZCBwYWRkX2l0ZW0oY2hhciAqaXRlbSwgaW50IHRvdGFsX2xlbmd0aCwgaW50IGxlbmd0aCk7CiAKIC8qIGlub2RlLmMgKi8KIC8qIGFyZ3MgZm9yIHRoZSBjcmVhdGUgcGFyYW1ldGVyIG9mIHJlaXNlcmZzX2dldF9ibG9jayAqLwotI2RlZmluZSBHRVRfQkxPQ0tfTk9fQ1JFQVRFIDAgLyogZG9uJ3QgY3JlYXRlIG5ldyBibG9ja3Mgb3IgY29udmVydCB0YWlscyAqLwotI2RlZmluZSBHRVRfQkxPQ0tfQ1JFQVRFIDEgICAgLyogYWRkIGFueXRoaW5nIHlvdSBuZWVkIHRvIGZpbmQgYmxvY2sgKi8KLSNkZWZpbmUgR0VUX0JMT0NLX05PX0hPTEUgMiAgIC8qIHJldHVybiAtRU5PRU5UIGZvciBmaWxlIGhvbGVzICovCi0jZGVmaW5lIEdFVF9CTE9DS19SRUFEX0RJUkVDVCA0ICAvKiByZWFkIHRoZSB0YWlsIGlmIGluZGlyZWN0IGl0ZW0gbm90IGZvdW5kICovCi0jZGVmaW5lIEdFVF9CTE9DS19OT19JU0VNICAgICA4IC8qIGlfc2VtIGlzIG5vdCBoZWxkLCBkb24ndCBwcmVhbGxvY2F0ZSAqLwotI2RlZmluZSBHRVRfQkxPQ0tfTk9fREFOR0xFICAgMTYgLyogZG9uJ3QgbGVhdmUgYW55IHRyYW5zYWN0aW9ucyBydW5uaW5nICovCisjZGVmaW5lIEdFVF9CTE9DS19OT19DUkVBVEUgMAkvKiBkb24ndCBjcmVhdGUgbmV3IGJsb2NrcyBvciBjb252ZXJ0IHRhaWxzICovCisjZGVmaW5lIEdFVF9CTE9DS19DUkVBVEUgMQkvKiBhZGQgYW55dGhpbmcgeW91IG5lZWQgdG8gZmluZCBibG9jayAqLworI2RlZmluZSBHRVRfQkxPQ0tfTk9fSE9MRSAyCS8qIHJldHVybiAtRU5PRU5UIGZvciBmaWxlIGhvbGVzICovCisjZGVmaW5lIEdFVF9CTE9DS19SRUFEX0RJUkVDVCA0CS8qIHJlYWQgdGhlIHRhaWwgaWYgaW5kaXJlY3QgaXRlbSBub3QgZm91bmQgKi8KKyNkZWZpbmUgR0VUX0JMT0NLX05PX0lTRU0gICAgIDgJLyogaV9zZW0gaXMgbm90IGhlbGQsIGRvbid0IHByZWFsbG9jYXRlICovCisjZGVmaW5lIEdFVF9CTE9DS19OT19EQU5HTEUgICAxNgkvKiBkb24ndCBsZWF2ZSBhbnkgdHJhbnNhY3Rpb25zIHJ1bm5pbmcgKi8KIAotaW50IHJlc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKTsKLXZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCByZWlzZXJmc19pZ2V0X2FyZ3MgKmFyZ3MpIDsKLWludCByZWlzZXJmc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB2b2lkICpwKSA7Ci1pbnQgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIHZvaWQgKnApIDsKLXZvaWQgcmVpc2VyZnNfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSk7Ci1pbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQpIDsKLWludCByZWlzZXJmc19nZXRfYmxvY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKTsKLXN0cnVjdCBkZW50cnkgKnJlaXNlcmZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKikgOwotc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBmaHR5cGUsCi0JCQkJICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZWN0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCi0JCQkJICB2b2lkICpjb250ZXh0KSA7Ci1pbnQgcmVpc2VyZnNfZW5jb2RlX2ZoKCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICpkYXRhLCBpbnQgKmxlbnAsIAotCQkJCQkJaW50IGNvbm5lY3RhYmxlICk7CitpbnQgcmVzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYXRoICpwYXRoKTsKK3ZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzKTsKK2ludCByZWlzZXJmc19maW5kX2FjdG9yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnApOworaW50IHJlaXNlcmZzX2luaXRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnApOwordm9pZCByZWlzZXJmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50KTsKK2ludCByZWlzZXJmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSk7CitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICopOworc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICogZGF0YSwKKwkJCQkgIGludCBsZW4sIGludCBmaHR5cGUsCisJCQkJICBpbnQgKCphY2NlcHRhYmxlKSAodm9pZCAqY29udGVjdCwKKwkJCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqIGRlKSwKKwkJCQkgIHZvaWQgKmNvbnRleHQpOworaW50IHJlaXNlcmZzX2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyICogZGF0YSwgaW50ICpsZW5wLAorCQkgICAgICAgaW50IGNvbm5lY3RhYmxlKTsKIAotaW50IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICosIGludCB1cGRhdGVfdGltZXN0YW1wcykgOwotdm9pZCBtYWtlX2NwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICogY3B1X2tleSwgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBvZmZzZXQsCi0JCSAgIGludCB0eXBlLCBpbnQga2V5X2xlbmd0aCk7Ci12b2lkIG1ha2VfbGVfaXRlbV9oZWFkIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5LCAKLQkJCWludCB2ZXJzaW9uLAotCQkJbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGgsIGludCBlbnRyeV9jb3VudCk7Ci1zdHJ1Y3QgaW5vZGUgKiByZWlzZXJmc19pZ2V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCAKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICoga2V5KTsKK2ludCByZWlzZXJmc190cnVuY2F0ZV9maWxlKHN0cnVjdCBpbm9kZSAqLCBpbnQgdXBkYXRlX3RpbWVzdGFtcHMpOwordm9pZCBtYWtlX2NwdV9rZXkoc3RydWN0IGNwdV9rZXkgKmNwdV9rZXksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCSAgaW50IHR5cGUsIGludCBrZXlfbGVuZ3RoKTsKK3ZvaWQgbWFrZV9sZV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqaWgsIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICprZXksCisJCSAgICAgICBpbnQgdmVyc2lvbiwKKwkJICAgICAgIGxvZmZfdCBvZmZzZXQsIGludCB0eXBlLCBpbnQgbGVuZ3RoLCBpbnQgZW50cnlfY291bnQpOworc3RydWN0IGlub2RlICpyZWlzZXJmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSk7CiAKK2ludCByZWlzZXJmc19uZXdfaW5vZGUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUsCisJCSAgICAgICBjb25zdCBjaGFyICpzeW1uYW1lLCBsb2ZmX3QgaV9zaXplLAorCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAotaW50IHJlaXNlcmZzX25ld19pbm9kZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAotCQkJCSAgIHN0cnVjdCBpbm9kZSAqIGRpciwgaW50IG1vZGUsIAotCQkJCSAgIGNvbnN0IGNoYXIgKiBzeW1uYW1lLCBsb2ZmX3QgaV9zaXplLAotCQkJCSAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSk7Ci0KLXZvaWQgcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKTsKK3ZvaWQgcmVpc2VyZnNfdXBkYXRlX3NkX3NpemUoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzaXplKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3VwZGF0ZV9zZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSkKKwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIHJlaXNlcmZzX3VwZGF0ZV9zZF9zaXplKHRoLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSkgOworCXJlaXNlcmZzX3VwZGF0ZV9zZF9zaXplKHRoLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CiB9CiAKLXZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyggX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUgKTsKLXZvaWQgaV9hdHRyc190b19zZF9hdHRycyggc3RydWN0IGlub2RlICppbm9kZSwgX191MTYgKnNkX2F0dHJzICk7Cit2b2lkIHNkX2F0dHJzX3RvX2lfYXR0cnMoX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwordm9pZCBpX2F0dHJzX3RvX3NkX2F0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTE2ICogc2RfYXR0cnMpOwogaW50IHJlaXNlcmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogCiAvKiBuYW1laS5jICovCi12b2lkIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpOwotaW50IHNlYXJjaF9ieV9lbnRyeV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwgCi0JCQkgc3RydWN0IHBhdGggKiBwYXRoLCAKLQkJCSBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpOwotc3RydWN0IGRlbnRyeSAqcmVpc2VyZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICopIDsKK3ZvaWQgc2V0X2RlX25hbWVfYW5kX25hbWVsZW4oc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqZGUpOworaW50IHNlYXJjaF9ieV9lbnRyeV9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKmtleSwKKwkJCXN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSk7CitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKik7CiAvKiBwcm9jZnMuYyAqLwogCiAjaWYgZGVmaW5lZCggQ09ORklHX1BST0NfRlMgKSAmJiBkZWZpbmVkKCBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPICkKQEAgLTE5NDYsMTUgKzE5MTgsMTUgQEAKICN1bmRlZiBSRUlTRVJGU19QUk9DX0lORk8KICNlbmRpZgogCi1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgKTsKLWludCByZWlzZXJmc19wcm9jX2luZm9fZG9uZSggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiApOwotc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbCggY2hhciAqbmFtZSwgCi0JCQkJCQkJCQkJCQkJICByZWFkX3Byb2NfdCAqZnVuYyApOwotdm9pZCByZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsKCBjb25zdCBjaGFyICpuYW1lICk7Ci1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KCB2b2lkICk7Ci1pbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKCB2b2lkICk7Ci1pbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyggY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKLQkJCQkJCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhICk7CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2RvbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKGNoYXIgKm5hbWUsCisJCQkJCQkgICAgIHJlYWRfcHJvY190ICogZnVuYyk7Cit2b2lkIHJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9pbml0KHZvaWQpOworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19nbG9iYWxfZG9uZSh2b2lkKTsKK2ludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogCiAjaWYgZGVmaW5lZCggUkVJU0VSRlNfUFJPQ19JTkZPICkKIApAQCAtMTk4NiwxMjMgKzE5NTgsMTMyIEBACiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19kaXJfb3BlcmF0aW9uczsKIAogLyogdGFpbF9jb252ZXJzaW9uLmMgKi8KLWludCBkaXJlY3QyaW5kaXJlY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBwYXRoICosIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBsb2ZmX3QpOwotaW50IGluZGlyZWN0MmRpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiwgbG9mZl90LCBjaGFyICopOwotdm9pZCByZWlzZXJmc191bm1hcF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICopIDsKLQoraW50IGRpcmVjdDJpbmRpcmVjdChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICosIHN0cnVjdCBpbm9kZSAqLAorCQkgICAgc3RydWN0IHBhdGggKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGxvZmZfdCk7CitpbnQgaW5kaXJlY3QyZGlyZWN0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiwgc3RydWN0IGlub2RlICosCisJCSAgICBzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGF0aCAqLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqLAorCQkgICAgbG9mZl90LCBjaGFyICopOwordm9pZCByZWlzZXJmc191bm1hcF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICopOwogCiAvKiBmaWxlLmMgKi8KIGV4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiBleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWlzZXJmc19maWxlX29wZXJhdGlvbnM7Ci1leHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyByZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOwogCiAvKiBmaXhfbm9kZXMuYyAqLwogI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwotdm9pZCAqIHJlaXNlcmZzX2ttYWxsb2MgKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpOwotdm9pZCByZWlzZXJmc19rZnJlZSAoY29uc3Qgdm9pZCAqIHZwLCBzaXplX3Qgc2l6ZSwgc3RydWN0IHN1cGVyX2Jsb2NrICogcyk7Cit2b2lkICpyZWlzZXJmc19rbWFsbG9jKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7Cit2b2lkIHJlaXNlcmZzX2tmcmVlKGNvbnN0IHZvaWQgKnZwLCBzaXplX3Qgc2l6ZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgKnJlaXNlcmZzX2ttYWxsb2Moc2l6ZV90IHNpemUsIGludCBmbGFncywKLQkJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzKQorCQkJCSAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX2tmcmVlKGNvbnN0IHZvaWQgKnZwLCBzaXplX3Qgc2l6ZSwKLQkJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzKQorCQkJCSAgc3RydWN0IHN1cGVyX2Jsb2NrICpzKQogewogCWtmcmVlKHZwKTsKIH0KICNlbmRpZgogCi1pbnQgZml4X25vZGVzIChpbnQgbl9vcF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLCAKLQkgICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfc19pbnNfaWgsIGNvbnN0IHZvaWQgKik7Ci12b2lkIHVuZml4X25vZGVzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICopOwotCitpbnQgZml4X25vZGVzKGludCBuX29wX21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKnBfc190YiwKKwkgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICpwX3NfaW5zX2loLCBjb25zdCB2b2lkICopOwordm9pZCB1bmZpeF9ub2RlcyhzdHJ1Y3QgdHJlZV9iYWxhbmNlICopOwogCiAvKiBwcmludHMuYyAqLwotdm9pZCByZWlzZXJmc19wYW5pYyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY29uc3QgY2hhciAqIGZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICggKCBub3JldHVybiApICk7Ci12b2lkIHJlaXNlcmZzX2luZm8gKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqIGZtdCwgLi4uKTsKLXZvaWQgcmVpc2VyZnNfZGVidWcgKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IGxldmVsLCBjb25zdCBjaGFyICogZm10LCAuLi4pOwotdm9pZCBwcmludF9pbmRpcmVjdF9pdGVtIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGl0ZW1fbnVtKTsKLXZvaWQgc3RvcmVfcHJpbnRfdGIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yik7Ci12b2lkIHByaW50X2N1cl90YiAoY2hhciAqIG1lcyk7Ci12b2lkIHByaW50X2RlIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpOwotdm9pZCBwcmludF9iaSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksIGNoYXIgKiBtZXMpOwotI2RlZmluZSBQUklOVF9MRUFGX0lURU1TIDEgICAvKiBwcmludCBhbGwgaXRlbXMgKi8KLSNkZWZpbmUgUFJJTlRfRElSRUNUT1JZX0lURU1TIDIgLyogcHJpbnQgZGlyZWN0b3J5IGl0ZW1zICovCi0jZGVmaW5lIFBSSU5UX0RJUkVDVF9JVEVNUyA0IC8qIHByaW50IGNvbnRlbnRzIG9mIGRpcmVjdCBpdGVtcyAqLwotdm9pZCBwcmludF9ibG9jayAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIC4uLik7Ci12b2lkIHByaW50X2JtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCBzaWxlbnQpOwotdm9pZCBwcmludF9ibWFwX2Jsb2NrIChpbnQgaSwgY2hhciAqIGRhdGEsIGludCBzaXplLCBpbnQgc2lsZW50KTsKK3ZvaWQgcmVpc2VyZnNfcGFuaWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKK3ZvaWQgcmVpc2VyZnNfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3ZvaWQgcmVpc2VyZnNfZGVidWcoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3ZvaWQgcHJpbnRfaW5kaXJlY3RfaXRlbShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgaXRlbV9udW0pOwordm9pZCBzdG9yZV9wcmludF90YihzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0Yik7Cit2b2lkIHByaW50X2N1cl90YihjaGFyICptZXMpOwordm9pZCBwcmludF9kZShzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICpkZSk7Cit2b2lkIHByaW50X2JpKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGNoYXIgKm1lcyk7CisjZGVmaW5lIFBSSU5UX0xFQUZfSVRFTVMgMQkvKiBwcmludCBhbGwgaXRlbXMgKi8KKyNkZWZpbmUgUFJJTlRfRElSRUNUT1JZX0lURU1TIDIJLyogcHJpbnQgZGlyZWN0b3J5IGl0ZW1zICovCisjZGVmaW5lIFBSSU5UX0RJUkVDVF9JVEVNUyA0CS8qIHByaW50IGNvbnRlbnRzIG9mIGRpcmVjdCBpdGVtcyAqLwordm9pZCBwcmludF9ibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAuLi4pOwordm9pZCBwcmludF9ibWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IHNpbGVudCk7Cit2b2lkIHByaW50X2JtYXBfYmxvY2soaW50IGksIGNoYXIgKmRhdGEsIGludCBzaXplLCBpbnQgc2lsZW50KTsKIC8qdm9pZCBwcmludF9zdXBlcl9ibG9jayAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG1lcyk7Ki8KLXZvaWQgcHJpbnRfb2JqZWN0aWRfbWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKTsKLXZvaWQgcHJpbnRfYmxvY2tfaGVhZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGNoYXIgKiBtZXMpOwotdm9pZCBjaGVja19sZWFmIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCk7Ci12b2lkIGNoZWNrX2ludGVybmFsIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCk7Ci12b2lkIHByaW50X3N0YXRpc3RpY3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpOwotY2hhciAqIHJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKTsKK3ZvaWQgcHJpbnRfb2JqZWN0aWRfbWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7Cit2b2lkIHByaW50X2Jsb2NrX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgY2hhciAqbWVzKTsKK3ZvaWQgY2hlY2tfbGVhZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTsKK3ZvaWQgY2hlY2tfaW50ZXJuYWwoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7Cit2b2lkIHByaW50X3N0YXRpc3RpY3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK2NoYXIgKnJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKTsKIAogLyogbGJhbGFuY2UuYyAqLwotaW50IGxlYWZfbW92ZV9pdGVtcyAoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IG1vdl9udW0sIGludCBtb3ZfYnl0ZXMsIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNuZXcpOwotaW50IGxlYWZfc2hpZnRfbGVmdCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgc2hpZnRfbnVtLCBpbnQgc2hpZnRfYnl0ZXMpOwotaW50IGxlYWZfc2hpZnRfcmlnaHQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKTsKLXZvaWQgbGVhZl9kZWxldGVfaXRlbXMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGN1cl9iaSwgaW50IGxhc3RfZmlyc3QsIGludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpOwotdm9pZCBsZWFmX2luc2VydF9pbnRvX2J1ZiAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksIGludCBiZWZvcmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkX2l0ZW1faWgsIGNvbnN0IGNoYXIgKiBpbnNlcnRlZF9pdGVtX2JvZHksIGludCB6ZXJvc19udW1iZXIpOwotdm9pZCBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksIGludCBwYXN0ZWRfaXRlbV9udW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwgY29uc3QgY2hhciAqIGJvZHksIGludCB6ZXJvc19udW1iZXIpOwotdm9pZCBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksIGludCBjdXRfaXRlbV9udW0sIGludCBwb3NfaW5faXRlbSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3V0X3NpemUpOwotdm9pZCBsZWFmX3Bhc3RlX2VudHJpZXMgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgaXRlbV9udW0sIGludCBiZWZvcmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfZW50cnlfY291bnQsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogbmV3X2RlaHMsIGNvbnN0IGNoYXIgKiByZWNvcmRzLCBpbnQgcGFzdGVfc2l6ZSk7CitpbnQgbGVhZl9tb3ZlX2l0ZW1zKGludCBzaGlmdF9tb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IG1vdl9udW0sCisJCSAgICBpbnQgbW92X2J5dGVzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNuZXcpOworaW50IGxlYWZfc2hpZnRfbGVmdChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YiwgaW50IHNoaWZ0X251bSwgaW50IHNoaWZ0X2J5dGVzKTsKK2ludCBsZWFmX3NoaWZ0X3JpZ2h0KHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLCBpbnQgc2hpZnRfbnVtLCBpbnQgc2hpZnRfYnl0ZXMpOwordm9pZCBsZWFmX2RlbGV0ZV9pdGVtcyhzdHJ1Y3QgYnVmZmVyX2luZm8gKmN1cl9iaSwgaW50IGxhc3RfZmlyc3QsIGludCBmaXJzdCwKKwkJICAgICAgIGludCBkZWxfbnVtLCBpbnQgZGVsX2J5dGVzKTsKK3ZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IGJlZm9yZSwKKwkJCSAgc3RydWN0IGl0ZW1faGVhZCAqaW5zZXJ0ZWRfaXRlbV9paCwKKwkJCSAgY29uc3QgY2hhciAqaW5zZXJ0ZWRfaXRlbV9ib2R5LCBpbnQgemVyb3NfbnVtYmVyKTsKK3ZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIoc3RydWN0IGJ1ZmZlcl9pbmZvICpiaSwgaW50IHBhc3RlZF9pdGVtX251bSwKKwkJCSAgaW50IHBvc19pbl9pdGVtLCBpbnQgcGFzdGVfc2l6ZSwgY29uc3QgY2hhciAqYm9keSwKKwkJCSAgaW50IHplcm9zX251bWJlcik7Cit2b2lkIGxlYWZfY3V0X2Zyb21fYnVmZmVyKHN0cnVjdCBidWZmZXJfaW5mbyAqYmksIGludCBjdXRfaXRlbV9udW0sCisJCQkgIGludCBwb3NfaW5faXRlbSwgaW50IGN1dF9zaXplKTsKK3ZvaWQgbGVhZl9wYXN0ZV9lbnRyaWVzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBpdGVtX251bSwgaW50IGJlZm9yZSwKKwkJCWludCBuZXdfZW50cnlfY291bnQsIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICpuZXdfZGVocywKKwkJCWNvbnN0IGNoYXIgKnJlY29yZHMsIGludCBwYXN0ZV9zaXplKTsKIC8qIGliYWxhbmNlLmMgKi8KLWludCBiYWxhbmNlX2ludGVybmFsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogLCBpbnQsIGludCwgc3RydWN0IGl0ZW1faGVhZCAqICwgCi0gICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK2ludCBiYWxhbmNlX2ludGVybmFsKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiwgaW50LCBpbnQsIHN0cnVjdCBpdGVtX2hlYWQgKiwKKwkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwogCiAvKiBkb19iYWxhbmNlLmMgKi8KLXZvaWQgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsIGludCBmbGFnKTsKK3ZvaWQgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGZsYWcpOwogI2RlZmluZSBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkKICNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CiAKLXZvaWQgZG9fYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYm9keSwgaW50IGZsYWcpOwotdm9pZCByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCk7Cit2b2lkIGRvX2JhbGFuY2Uoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIHN0cnVjdCBpdGVtX2hlYWQgKmloLAorCQljb25zdCBjaGFyICpib2R5LCBpbnQgZmxhZyk7Cit2b2lkIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOwogCi1pbnQgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpOwotaW50IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCk7Ci12b2lkIHJlcGxhY2Vfa2V5IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOwotdm9pZCBtYWtlX2VtcHR5X25vZGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqKTsKLXN0cnVjdCBidWZmZXJfaGVhZCAqIGdldF9GRUIgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKik7CitpbnQgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKTsKK2ludCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIGludCBoKTsKK3ZvaWQgcmVwbGFjZV9rZXkoc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQsCisJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKK3ZvaWQgbWFrZV9lbXB0eV9ub2RlKHN0cnVjdCBidWZmZXJfaW5mbyAqKTsKK3N0cnVjdCBidWZmZXJfaGVhZCAqZ2V0X0ZFQihzdHJ1Y3QgdHJlZV9iYWxhbmNlICopOwogCiAvKiBiaXRtYXAuYyAqLwogCiAvKiBzdHJ1Y3R1cmUgY29udGFpbnMgaGludHMgZm9yIGJsb2NrIGFsbG9jYXRvciwgYW5kIGl0IGlzIGEgY29udGFpbmVyIGZvcgogICogYXJndW1lbnRzLCBzdWNoIGFzIG5vZGUsIHNlYXJjaCBwYXRoLCB0cmFuc2FjdGlvbl9oYW5kbGUsIGV0Yy4gKi8KLSBzdHJ1Y3QgX19yZWlzZXJmc19ibG9ja25yX2hpbnQgewotICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsJCS8qIGlub2RlIHBhc3NlZCB0byBhbGxvY2F0b3IsIGlmIHdlIGFsbG9jYXRlIHVuZi4gbm9kZXMgKi8KLSAgICAgbG9uZyBibG9jazsJCQkvKiBmaWxlIG9mZnNldCwgaW4gYmxvY2tzICovCi0gICAgIHN0cnVjdCBpbl9jb3JlX2tleSBrZXk7Ci0gICAgIHN0cnVjdCBwYXRoICogcGF0aDsJCS8qIHNlYXJjaCBwYXRoLCB1c2VkIGJ5IGFsbG9jYXRvciB0byBkZXRlcm5pbmUgc2VhcmNoX3N0YXJ0IGJ5Ci0JCQkJCSAqIHZhcmlvdXMgd2F5cyAqLwotICAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICogdGg7IC8qIHRyYW5zYWN0aW9uIGhhbmRsZSBpcyBuZWVkZWQgdG8gbG9nIHN1cGVyIGJsb2NrcyBhbmQKLQkJCQkJICAgICAgICogYml0bWFwIGJsb2NrcyBjaGFuZ2VzICAqLwotICAgICBiX2Jsb2NrbnJfdCBiZWcsIGVuZDsKLSAgICAgYl9ibG9ja25yX3Qgc2VhcmNoX3N0YXJ0OwkJLyogYSBmaWVsZCB1c2VkIHRvIHRyYW5zZmVyIHNlYXJjaCBzdGFydCB2YWx1ZSAoYmxvY2sgbnVtYmVyKQorc3RydWN0IF9fcmVpc2VyZnNfYmxvY2tucl9oaW50IHsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOwkvKiBpbm9kZSBwYXNzZWQgdG8gYWxsb2NhdG9yLCBpZiB3ZSBhbGxvY2F0ZSB1bmYuIG5vZGVzICovCisJbG9uZyBibG9jazsJCS8qIGZpbGUgb2Zmc2V0LCBpbiBibG9ja3MgKi8KKwlzdHJ1Y3QgaW5fY29yZV9rZXkga2V5OworCXN0cnVjdCBwYXRoICpwYXRoOwkvKiBzZWFyY2ggcGF0aCwgdXNlZCBieSBhbGxvY2F0b3IgdG8gZGV0ZXJuaW5lIHNlYXJjaF9zdGFydCBieQorCQkJCSAqIHZhcmlvdXMgd2F5cyAqLworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoOwkvKiB0cmFuc2FjdGlvbiBoYW5kbGUgaXMgbmVlZGVkIHRvIGxvZyBzdXBlciBibG9ja3MgYW5kCisJCQkJCQkgKiBiaXRtYXAgYmxvY2tzIGNoYW5nZXMgICovCisJYl9ibG9ja25yX3QgYmVnLCBlbmQ7CisJYl9ibG9ja25yX3Qgc2VhcmNoX3N0YXJ0OwkvKiBhIGZpZWxkIHVzZWQgdG8gdHJhbnNmZXIgc2VhcmNoIHN0YXJ0IHZhbHVlIChibG9jayBudW1iZXIpCiAJCQkJCSAqIGJldHdlZW4gZGlmZmVyZW50IGJsb2NrIGFsbG9jYXRvciBwcm9jZWR1cmVzCiAJCQkJCSAqIChkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0KCkgYW5kIG90aGVycykgKi8KLSAgICBpbnQgcHJlYWxsb2Nfc2l6ZTsJCQkvKiBpcyBzZXQgaW4gZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoKSBmdW5jdGlvbiwgdXNlZCBieSB1bmRlcmxheWVkCi0JCQkJCSAqIGZ1bmN0aW9uIHRoYXQgZG8gYWN0dWFsIGFsbG9jYXRpb24gKi8KKwlpbnQgcHJlYWxsb2Nfc2l6ZTsJLyogaXMgc2V0IGluIGRldGVybWluZV9wcmVhbGxvY19zaXplKCkgZnVuY3Rpb24sIHVzZWQgYnkgdW5kZXJsYXllZAorCQkJCSAqIGZ1bmN0aW9uIHRoYXQgZG8gYWN0dWFsIGFsbG9jYXRpb24gKi8KIAotICAgIHVuc2lnbmVkIGZvcm1hdHRlZF9ub2RlOjE7CQkvKiB0aGUgYWxsb2NhdG9yIHVzZXMgZGlmZmVyZW50IHBvbGljZXMgZm9yIGdldHRpbmcgZGlzayBzcGFjZSBmb3IKKwl1bnNpZ25lZCBmb3JtYXR0ZWRfbm9kZToxOwkvKiB0aGUgYWxsb2NhdG9yIHVzZXMgZGlmZmVyZW50IHBvbGljZXMgZm9yIGdldHRpbmcgZGlzayBzcGFjZSBmb3IKIAkJCQkJICogZm9ybWF0dGVkL3VuZm9ybWF0dGVkIGJsb2NrcyB3aXRoL3dpdGhvdXQgcHJlYWxsb2NhdGlvbiAqLwotICAgIHVuc2lnbmVkIHByZWFsbG9jYXRlOjE7CisJdW5zaWduZWQgcHJlYWxsb2NhdGU6MTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9fcmVpc2VyZnNfYmxvY2tucl9oaW50IHJlaXNlcmZzX2Jsb2NrbnJfaGludF90OwogCi1pbnQgcmVpc2VyZnNfcGFyc2VfYWxsb2Nfb3B0aW9ucyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNoYXIgKik7Ci12b2lkIHJlaXNlcmZzX2luaXRfYWxsb2Nfb3B0aW9ucyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKK2ludCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjaGFyICopOwordm9pZCByZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKTsKIAogLyoKICAqIGdpdmVuIGEgZGlyZWN0b3J5LCB0aGlzIHdpbGwgdGVsbCB5b3Ugd2hhdCBwYWNraW5nIGxvY2FsaXR5CkBAIC0yMTExLDY4ICsyMDkyLDcyIEBACiAgKi8KIF9fbGUzMiByZWlzZXJmc19jaG9vc2VfcGFja2luZyhzdHJ1Y3QgaW5vZGUgKmRpcik7CiAKLWludCBpc19yZXVzYWJsZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgYl9ibG9ja25yX3QgYmxvY2ssIGludCBiaXRfdmFsdWUpOwotdm9pZCByZWlzZXJmc19mcmVlX2Jsb2NrIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IGlub2RlICosIGJfYmxvY2tucl90LCBpbnQgZm9yX3VuZm9ybWF0dGVkKTsKLWludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqLCBiX2Jsb2NrbnJfdCAqICwgaW50LCBpbnQpOwotZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X2Zvcm1fYmxvY2tucnMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKLQkJCQkJICAgICAgYl9ibG9ja25yX3QgKm5ld19ibG9ja25ycywgaW50IGFtb3VudF9uZWVkZWQpCitpbnQgaXNfcmV1c2FibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSk7Cit2b2lkIHJlaXNlcmZzX2ZyZWVfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqLAorCQkJIGJfYmxvY2tucl90LCBpbnQgZm9yX3VuZm9ybWF0dGVkKTsKK2ludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycyhyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqLCBiX2Jsb2NrbnJfdCAqLCBpbnQsCisJCQkgICAgICAgaW50KTsKK2V4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzKHN0cnVjdCB0cmVlX2JhbGFuY2UgKnRiLAorCQkJCQkgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLAorCQkJCQkgICAgIGludCBhbW91bnRfbmVlZGVkKQogewotICAgIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7Ci0JLnRoID0gdGItPnRyYW5zYWN0aW9uX2hhbmRsZSwKLQkucGF0aCA9IHRiLT50Yl9wYXRoLAotCS5pbm9kZSA9IE5VTEwsCi0JLmtleSA9IHRiLT5rZXksCi0JLmJsb2NrID0gMCwKLQkuZm9ybWF0dGVkX25vZGUgPSAxCi0gICAgfTsKLSAgICByZXR1cm4gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIG5ld19ibG9ja25ycywgYW1vdW50X25lZWRlZCwgMCk7CisJcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludCA9IHsKKwkJLnRoID0gdGItPnRyYW5zYWN0aW9uX2hhbmRsZSwKKwkJLnBhdGggPSB0Yi0+dGJfcGF0aCwKKwkJLmlub2RlID0gTlVMTCwKKwkJLmtleSA9IHRiLT5rZXksCisJCS5ibG9jayA9IDAsCisJCS5mb3JtYXR0ZWRfbm9kZSA9IDEKKwl9OworCXJldHVybiByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgbmV3X2Jsb2NrbnJzLCBhbW91bnRfbmVlZGVkLAorCQkJCQkgIDApOwogfQogCi1leHRlcm4gaW5saW5lIGludCByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKLQkJCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgICAgIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsCi0JCQkJCSAgICAgc3RydWN0IHBhdGggKiBwYXRoLCBsb25nIGJsb2NrKQorZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25ycyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlCisJCQkJCSAgICAqdGgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKKwkJCQkJICAgIHN0cnVjdCBwYXRoICpwYXRoLCBsb25nIGJsb2NrKQogewotICAgIHJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7Ci0JLnRoID0gdGgsCi0JLnBhdGggPSBwYXRoLAotCS5pbm9kZSA9IGlub2RlLAotCS5ibG9jayA9IGJsb2NrLAotCS5mb3JtYXR0ZWRfbm9kZSA9IDAsCi0JLnByZWFsbG9jYXRlID0gMAotICAgIH07Ci0gICAgcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIDEsIDApOworCXJlaXNlcmZzX2Jsb2NrbnJfaGludF90IGhpbnQgPSB7CisJCS50aCA9IHRoLAorCQkucGF0aCA9IHBhdGgsCisJCS5pbm9kZSA9IGlub2RlLAorCQkuYmxvY2sgPSBibG9jaywKKwkJLmZvcm1hdHRlZF9ub2RlID0gMCwKKwkJLnByZWFsbG9jYXRlID0gMAorCX07CisJcmV0dXJuIHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKCZoaW50LCBuZXdfYmxvY2tucnMsIDEsIDApOwogfQogCiAjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKLWV4dGVybiBpbmxpbmUgaW50IHJlaXNlcmZzX25ld191bmZfYmxvY2tucnMyKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAotCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAotCQkJCQkgICAgIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsCi0JCQkJCSAgICAgc3RydWN0IHBhdGggKiBwYXRoLCBsb25nIGJsb2NrKQorZXh0ZXJuIGlubGluZSBpbnQgcmVpc2VyZnNfbmV3X3VuZl9ibG9ja25yczIoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZQorCQkJCQkgICAgICp0aCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJICAgICBiX2Jsb2NrbnJfdCAqIG5ld19ibG9ja25ycywKKwkJCQkJICAgICBzdHJ1Y3QgcGF0aCAqcGF0aCwgbG9uZyBibG9jaykKIHsKLSAgICByZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0gewotCS50aCA9IHRoLAotCS5wYXRoID0gcGF0aCwKLQkuaW5vZGUgPSBpbm9kZSwKLQkuYmxvY2sgPSBibG9jaywKLQkuZm9ybWF0dGVkX25vZGUgPSAwLAotCS5wcmVhbGxvY2F0ZSA9IDEKLSAgICB9OwotICAgIHJldHVybiByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgbmV3X2Jsb2NrbnJzLCAxLCAwKTsKKwlyZWlzZXJmc19ibG9ja25yX2hpbnRfdCBoaW50ID0geworCQkudGggPSB0aCwKKwkJLnBhdGggPSBwYXRoLAorCQkuaW5vZGUgPSBpbm9kZSwKKwkJLmJsb2NrID0gYmxvY2ssCisJCS5mb3JtYXR0ZWRfbm9kZSA9IDAsCisJCS5wcmVhbGxvY2F0ZSA9IDEKKwl9OworCXJldHVybiByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgbmV3X2Jsb2NrbnJzLCAxLCAwKTsKIH0KIAotdm9pZCByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCi0JCQkJc3RydWN0IGlub2RlICogaW5vZGUpOwotdm9pZCByZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpOwordm9pZCByZWlzZXJmc19kaXNjYXJkX3ByZWFsbG9jKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwordm9pZCByZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyhzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCk7CiAjZW5kaWYKLXZvaWQgcmVpc2VyZnNfY2xhaW1fYmxvY2tzX3RvX2JlX2FsbG9jYXRlZCggc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2Nrcyk7Ci12b2lkIHJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9ja3MpOwordm9pZCByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9ja3MpOwordm9pZCByZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9ja3MpOwogaW50IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKIC8qIGhhc2hlcy5jICovCi1fX3UzMiBrZXllZF9oYXNoIChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKLV9fdTMyIHl1cmFfaGFzaCAoY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7Ci1fX3UzMiByNV9oYXNoIChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKTsKK19fdTMyIGtleWVkX2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7CitfX3UzMiB5dXJhX2hhc2goY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbik7CitfX3UzMiByNV9oYXNoKGNvbnN0IHNpZ25lZCBjaGFyICptc2csIGludCBsZW4pOwogCiAvKiB0aGUgZXh0MiBiaXQgcm91dGluZXMgYWRqdXN0IGZvciBiaWcgb3IgbGl0dGxlIGVuZGlhbiBhcwogKiogYXBwcm9wcmlhdGUgZm9yIHRoZSBhcmNoLCBzbyBpbiBvdXIgbGF6aW5lc3Mgd2UgdXNlIHRoZW0gcmF0aGVyCkBAIC0yMTkyLDExICsyMTc3LDEwIEBACiAgICBhYnNvbHV0ZWx5IHNhZmUgKi8KICNkZWZpbmUgU1BBUkVfU1BBQ0UgNTAwCiAKLQogLyogcHJvdG90eXBlcyBmcm9tIGlvY3RsLmMgKi8KLWludCByZWlzZXJmc19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgCi0gCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotIAoraW50IHJlaXNlcmZzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKIC8qIGlvY3RsJ3MgY29tbWFuZCAqLwogI2RlZmluZSBSRUlTRVJGU19JT0NfVU5QQUNLCQlfSU9XKDB4Q0QsMSxsb25nKQogLyogZGVmaW5lIGZvbGxvd2luZyBmbGFncyB0byBiZSB0aGUgc2FtZSBhcyBpbiBleHQyLCBzbyB0aGF0IGNoYXR0cigxKSwKQEAgLTIyMTEsMTAgKzIxOTUsOCBAQAogICAgd291bGQgZXZvbHZlIGludG8gcmVhbCBwZXItZnMgbG9ja3MgKi8KICNkZWZpbmUgcmVpc2VyZnNfd3JpdGVfbG9jayggc2IgKSBsb2NrX2tlcm5lbCgpCiAjZGVmaW5lIHJlaXNlcmZzX3dyaXRlX3VubG9jayggc2IgKSB1bmxvY2tfa2VybmVsKCkKLSAJCQkgICAgICAgICAKKwogLyogeGF0dHIgc3R1ZmYgKi8KICNkZWZpbmUgUkVJU0VSRlNfWEFUVFJfRElSX1NFTShzKSAoUkVJU0VSRlNfU0IocyktPnhhdHRyX2Rpcl9zZW0pCiAKLSNlbmRpZiAvKiBfTElOVVhfUkVJU0VSX0ZTX0ggKi8KLQotCisjZW5kaWYJCQkJLyogX0xJTlVYX1JFSVNFUl9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX2kuaCBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfaS5oCmluZGV4IGUzMjFlYjAuLjE0OWJlOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfaS5oCkBAIC0xMCw1NCArMTAsNTMgQEAKICAgICAvKiogdGhpcyBzYXlzIHdoYXQgZm9ybWF0IG9mIGtleSBkbyBhbGwgaXRlbXMgKGJ1dCBzdGF0IGRhdGEpIG9mCiAgICAgICBhbiBvYmplY3QgaGF2ZS4gIElmIHRoaXMgaXMgc2V0LCB0aGF0IGZvcm1hdCBpcyAzLjYgb3RoZXJ3aXNlCiAgICAgICAtIDMuNSAqLwotICAgIGlfaXRlbV9rZXlfdmVyc2lvbl9tYXNrICAgID0gIDB4MDAwMSwKKwlpX2l0ZW1fa2V5X3ZlcnNpb25fbWFzayA9IDB4MDAwMSwKICAgICAvKiogSWYgdGhpcyBpcyB1bnNldCwgb2JqZWN0IGhhcyAzLjUgc3RhdCBkYXRhLCBvdGhlcndpc2UsIGl0IGhhcwogICAgICAgMy42IHN0YXQgZGF0YSB3aXRoIDY0Yml0IHNpemUsIDMyYml0IG5saW5rIGV0Yy4gKi8KLSAgICBpX3N0YXRfZGF0YV92ZXJzaW9uX21hc2sgICA9ICAweDAwMDIsCisJaV9zdGF0X2RhdGFfdmVyc2lvbl9tYXNrID0gMHgwMDAyLAogICAgIC8qKiBmaWxlIG1pZ2h0IG5lZWQgdGFpbCBwYWNraW5nIG9uIGNsb3NlICovCi0gICAgaV9wYWNrX29uX2Nsb3NlX21hc2sgICAgICAgPSAgMHgwMDA0LAorCWlfcGFja19vbl9jbG9zZV9tYXNrID0gMHgwMDA0LAogICAgIC8qKiBkb24ndCBwYWNrIHRhaWwgb2YgZmlsZSAqLwotICAgIGlfbm9wYWNrX21hc2sgICAgICAgICAgICAgID0gIDB4MDAwOCwKKwlpX25vcGFja19tYXNrID0gMHgwMDA4LAogICAgIC8qKiBJZiB0aG9zZSBpcyBzZXQsICJzYWZlIGxpbmsiIHdhcyBjcmVhdGVkIGZvciB0aGlzIGZpbGUgZHVyaW5nCiAgICAgICB0cnVuY2F0ZSBvciB1bmxpbmsuIFNhZmUgbGluayBpcyB1c2VkIHRvIGF2b2lkIGxlYWthZ2Ugb2YgZGlzawogICAgICAgc3BhY2Ugb24gY3Jhc2ggd2l0aCBzb21lIGZpbGVzIG9wZW4sIGJ1dCB1bmxpbmtlZC4gKi8KLSAgICBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgICA9ICAweDAwMTAsCi0gICAgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2sgPSAgMHgwMDIwLAotICAgIGlfaGFzX3hhdHRyX2RpciAgICAgICAgICAgID0gIDB4MDA0MCwKLSAgICBpX2RhdGFfbG9nCSAgICAgICAgICAgICAgID0gIDB4MDA4MCwKKwlpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgPSAweDAwMTAsCisJaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2sgPSAweDAwMjAsCisJaV9oYXNfeGF0dHJfZGlyID0gMHgwMDQwLAorCWlfZGF0YV9sb2cgPSAweDAwODAsCiB9IHJlaXNlcmZzX2lub2RlX2ZsYWdzOwogCi0KIHN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvIHsKLSAgICBfX3UzMiBpX2tleSBbNF07Lyoga2V5IGlzIHN0aWxsIDQgMzIgYml0IGludGVnZXJzICovCisJX191MzIgaV9rZXlbNF07CQkvKiBrZXkgaXMgc3RpbGwgNCAzMiBiaXQgaW50ZWdlcnMgKi8KICAgICAvKiogdHJhbnNpZW50IGlub2RlIGZsYWdzIHRoYXQgYXJlIG5ldmVyIHN0b3JlZCBvbiBkaXNrLiBCaXRtYXNrcwogICAgICAgZm9yIHRoaXMgZmllbGQgYXJlIGRlZmluZWQgYWJvdmUuICovCi0gICAgX191MzIgaV9mbGFnczsKKwlfX3UzMiBpX2ZsYWdzOwogCi0gICAgX191MzIgaV9maXJzdF9kaXJlY3RfYnl0ZTsgLy8gb2Zmc2V0IG9mIGZpcnN0IGJ5dGUgc3RvcmVkIGluIGRpcmVjdCBpdGVtLgorCV9fdTMyIGlfZmlyc3RfZGlyZWN0X2J5dGU7CS8vIG9mZnNldCBvZiBmaXJzdCBieXRlIHN0b3JlZCBpbiBkaXJlY3QgaXRlbS4KIAotICAgIC8qIGNvcHkgb2YgcGVyc2lzdGVudCBpbm9kZSBmbGFncyByZWFkIGZyb20gc2RfYXR0cnMuICovCi0gICAgX191MzIgaV9hdHRyczsKKwkvKiBjb3B5IG9mIHBlcnNpc3RlbnQgaW5vZGUgZmxhZ3MgcmVhZCBmcm9tIHNkX2F0dHJzLiAqLworCV9fdTMyIGlfYXR0cnM7CiAKLSAgICBpbnQgaV9wcmVhbGxvY19ibG9jazsgLyogZmlyc3QgdW51c2VkIGJsb2NrIG9mIGEgc2VxdWVuY2Ugb2YgdW51c2VkIGJsb2NrcyAqLwotICAgIGludCBpX3ByZWFsbG9jX2NvdW50OyAvKiBsZW5ndGggb2YgdGhhdCBzZXF1ZW5jZSAqLwotICAgIHN0cnVjdCBsaXN0X2hlYWQgaV9wcmVhbGxvY19saXN0OyAvKiBwZXItdHJhbnNhY3Rpb24gbGlzdCBvZiBpbm9kZXMgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGF2ZSBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCisJaW50IGlfcHJlYWxsb2NfYmxvY2s7CS8qIGZpcnN0IHVudXNlZCBibG9jayBvZiBhIHNlcXVlbmNlIG9mIHVudXNlZCBibG9ja3MgKi8KKwlpbnQgaV9wcmVhbGxvY19jb3VudDsJLyogbGVuZ3RoIG9mIHRoYXQgc2VxdWVuY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlfcHJlYWxsb2NfbGlzdDsJLyogcGVyLXRyYW5zYWN0aW9uIGxpc3Qgb2YgaW5vZGVzIHdoaWNoCisJCQkJCQkgKiBoYXZlIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KIAotICAgIHVuc2lnbmVkIG5ld19wYWNraW5nX2xvY2FsaXR5OjE7ICAvKiBuZXdfcGFja2lnX2xvY2FsaXR5IGlzIGNyZWF0ZWQ7IG5ldyBibG9ja3MKLQkJCQkgICAgICAgKiBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5IHNob3VsZCBiZQotCQkJCSAgICAgICAqIGRpc3BsYWNlZCAqLworCXVuc2lnbmVkIG5ld19wYWNraW5nX2xvY2FsaXR5OjE7CS8qIG5ld19wYWNraWdfbG9jYWxpdHkgaXMgY3JlYXRlZDsgbmV3IGJsb2NrcworCQkJCQkJICogZm9yIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSBzaG91bGQgYmUKKwkJCQkJCSAqIGRpc3BsYWNlZCAqLwogCi0gICAgLyogd2UgdXNlIHRoZXNlIGZvciBmc3luYyBvciBPX1NZTkMgdG8gZGVjaWRlIHdoaWNoIHRyYW5zYWN0aW9uCi0gICAgKiogbmVlZHMgdG8gYmUgY29tbWl0dGVkIGluIG9yZGVyIGZvciB0aGlzIGlub2RlIHRvIGJlIHByb3Blcmx5Ci0gICAgKiogZmx1c2hlZCAqLwotICAgIHVuc2lnbmVkIGxvbmcgaV90cmFuc19pZCA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqaV9qbDsKKwkvKiB3ZSB1c2UgdGhlc2UgZm9yIGZzeW5jIG9yIE9fU1lOQyB0byBkZWNpZGUgd2hpY2ggdHJhbnNhY3Rpb24KKwkgKiogbmVlZHMgdG8gYmUgY29tbWl0dGVkIGluIG9yZGVyIGZvciB0aGlzIGlub2RlIHRvIGJlIHByb3Blcmx5CisJICoqIGZsdXNoZWQgKi8KKwl1bnNpZ25lZCBsb25nIGlfdHJhbnNfaWQ7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqaV9qbDsKIAotICAgIHN0cnVjdCBwb3NpeF9hY2wgKmlfYWNsX2FjY2VzczsKLSAgICBzdHJ1Y3QgcG9zaXhfYWNsICppX2FjbF9kZWZhdWx0OwotICAgIHN0cnVjdCByd19zZW1hcGhvcmUgeGF0dHJfc2VtOwotICAgIHN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CisJc3RydWN0IHBvc2l4X2FjbCAqaV9hY2xfYWNjZXNzOworCXN0cnVjdCBwb3NpeF9hY2wgKmlfYWNsX2RlZmF1bHQ7CisJc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9zZW07CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc19mc19zYi5oCmluZGV4IDM3YTNhN2EuLjNlNjg1OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX2ZzX3NiLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNlbmRpZgogCiB0eXBlZGVmIGVudW0gewotICByZWlzZXJmc19hdHRyc19jbGVhcmVkCT0gMHgwMDAwMDAwMSwKKwlyZWlzZXJmc19hdHRyc19jbGVhcmVkID0gMHgwMDAwMDAwMSwKIH0gcmVpc2VyZnNfc3VwZXJfYmxvY2tfZmxhZ3M7CiAKIC8qIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayBhY2Nlc3NvcnMvbXV0YXRvcnMKQEAgLTYxLDcgKzYxLDcgQEAKICNkZWZpbmUgc2JfdW1vdW50X3N0YXRlKHNicCkgICAgICAgKGxlMTZfdG9fY3B1KChzYnApLT5zX3YxLnNfdW1vdW50X3N0YXRlKSkKICNkZWZpbmUgc2V0X3NiX3Vtb3VudF9zdGF0ZShzYnAsdikgKChzYnApLT5zX3YxLnNfdW1vdW50X3N0YXRlID0gY3B1X3RvX2xlMTYodikpCiAjZGVmaW5lIHNiX2ZzX3N0YXRlKHNicCkgICAgICAgICAgIChsZTE2X3RvX2NwdSgoc2JwKS0+c192MS5zX2ZzX3N0YXRlKSkKLSNkZWZpbmUgc2V0X3NiX2ZzX3N0YXRlKHNicCx2KSAgICAgKChzYnApLT5zX3YxLnNfZnNfc3RhdGUgPSBjcHVfdG9fbGUxNih2KSkgCisjZGVmaW5lIHNldF9zYl9mc19zdGF0ZShzYnAsdikgICAgICgoc2JwKS0+c192MS5zX2ZzX3N0YXRlID0gY3B1X3RvX2xlMTYodikpCiAjZGVmaW5lIHNiX2hhc2hfZnVuY3Rpb25fY29kZShzYnApIFwKICAgICAgICAgICAgICAgKGxlMzJfdG9fY3B1KChzYnApLT5zX3YxLnNfaGFzaF9mdW5jdGlvbl9jb2RlKSkKICNkZWZpbmUgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShzYnAsdikgXApAQCAtMTAzLDEwICsxMDMsMTAgQEAKIAogLyogZG9uJ3QgbWVzcyB3aXRoIHRoZXNlIGZvciBhIHdoaWxlICovCiAJCQkJLyogd2UgaGF2ZSBhIG5vZGUgc2l6ZSBkZWZpbmUgc29tZXdoZXJlIGluIHJlaXNlcmZzX2ZzLmguIC1IYW5zICovCi0jZGVmaW5lIEpPVVJOQUxfQkxPQ0tfU0laRSAgNDA5NiAvKiBCVUcgZ290dGEgZ2V0IHJpZCBvZiB0aGlzICovCi0jZGVmaW5lIEpPVVJOQUxfTUFYX0NOT0RFICAgMTUwMCAvKiBtYXggY25vZGVzIHRvIGFsbG9jYXRlLiAqLwotI2RlZmluZSBKT1VSTkFMX0hBU0hfU0laRSA4MTkyICAgCi0jZGVmaW5lIEpPVVJOQUxfTlVNX0JJVE1BUFMgNSAvKiBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBiaXRtYXBzIHRvIGhhdmUgZmxvYXRpbmcuICBNdXN0IGJlID49IDIgKi8KKyNkZWZpbmUgSk9VUk5BTF9CTE9DS19TSVpFICA0MDk2CS8qIEJVRyBnb3R0YSBnZXQgcmlkIG9mIHRoaXMgKi8KKyNkZWZpbmUgSk9VUk5BTF9NQVhfQ05PREUgICAxNTAwCS8qIG1heCBjbm9kZXMgdG8gYWxsb2NhdGUuICovCisjZGVmaW5lIEpPVVJOQUxfSEFTSF9TSVpFIDgxOTIKKyNkZWZpbmUgSk9VUk5BTF9OVU1fQklUTUFQUyA1CS8qIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIGJpdG1hcHMgdG8gaGF2ZSBmbG9hdGluZy4gIE11c3QgYmUgPj0gMiAqLwogCiAvKiBPbmUgb2YgdGhlc2UgZm9yIGV2ZXJ5IGJsb2NrIGluIGV2ZXJ5IHRyYW5zYWN0aW9uCiAqKiBFYWNoIG9uZSBpcyBpbiB0d28gaGFzaCB0YWJsZXMuICBGaXJzdCwgYSBoYXNoIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBhbmQgYWZ0ZXIgam91cm5hbF9lbmQsIGEKQEAgLTExNywyNyArMTE3LDI3IEBACiAqKiB0byBhIGdpdmVuIHRyYW5zYWN0aW9uLgogKi8KIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlIHsKLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7CQkgLyogcmVhbCBidWZmZXIgaGVhZCAqLwotICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiIDsJCSAvKiBkZXYgb2YgcmVhbCBidWZmZXIgaGVhZCAqLwotICBfX3UzMiBibG9ja25yIDsJCSAvKiBibG9jayBudW1iZXIgb2YgcmVhbCBidWZmZXIgaGVhZCwgPT0gMCB3aGVuIGJ1ZmZlciBvbiBkaXNrICovCi0gIGxvbmcgc3RhdGUgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbGlzdCA7ICAvKiBqb3VybmFsIGxpc3QgdGhpcyBjbm9kZSBsaXZlcyBpbiAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqbmV4dCA7ICAvKiBuZXh0IGluIHRyYW5zYWN0aW9uIGxpc3QgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKnByZXYgOyAgLyogcHJldiBpbiB0cmFuc2FjdGlvbiBsaXN0ICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpocHJldiA7IC8qIHByZXYgaW4gaGFzaCBsaXN0ICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpobmV4dCA7IC8qIG5leHQgaW4gaGFzaCBsaXN0ICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsJLyogcmVhbCBidWZmZXIgaGVhZCAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CS8qIGRldiBvZiByZWFsIGJ1ZmZlciBoZWFkICovCisJX191MzIgYmxvY2tucjsJCS8qIGJsb2NrIG51bWJlciBvZiByZWFsIGJ1ZmZlciBoZWFkLCA9PSAwIHdoZW4gYnVmZmVyIG9uIGRpc2sgKi8KKwlsb25nIHN0YXRlOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsaXN0OwkvKiBqb3VybmFsIGxpc3QgdGhpcyBjbm9kZSBsaXZlcyBpbiAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpuZXh0OwkvKiBuZXh0IGluIHRyYW5zYWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqcHJldjsJLyogcHJldiBpbiB0cmFuc2FjdGlvbiBsaXN0ICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmhwcmV2OwkvKiBwcmV2IGluIGhhc2ggbGlzdCAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpobmV4dDsJLyogbmV4dCBpbiBoYXNoIGxpc3QgKi8KIH07CiAKIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSB7Ci0gIGludCBpZCA7Ci0gIGNoYXIgKmRhdGEgOwotICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QgOwotfSA7CisJaW50IGlkOworCWNoYXIgKmRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKIAogc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwIHsKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqam91cm5hbF9saXN0IDsKLSAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICoqYml0bWFwcyA7Ci19IDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqb3VybmFsX2xpc3Q7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICoqYml0bWFwczsKK307CiAKIC8qCiAqKiBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggdHJhbnNhY3Rpb24uICBUaGUgbW9zdCBpbXBvcnRhbnQgcGFydCBoZXJlIGlzIHRoZSBqX3JlYWxibG9jay4KQEAgLTE0NiwyNzMgKzE0NiwyNjkgQEAKICoqIGFuZCB0byBtYWtlIHN1cmUgZXZlcnkgcmVhbCBibG9jayBpbiBhIHRyYW5zYWN0aW9uIGlzIG9uIGRpc2sgYmVmb3JlIGFsbG93aW5nIHRoZSBsb2cgYXJlYQogKiogdG8gYmUgb3ZlcndyaXR0ZW4gKi8KIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgewotICB1bnNpZ25lZCBsb25nIGpfc3RhcnQgOwotICB1bnNpZ25lZCBsb25nIGpfc3RhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgal9sZW4gOwotICBhdG9taWNfdCBqX25vbnplcm9sZW4gOwotICBhdG9taWNfdCBqX2NvbW1pdF9sZWZ0IDsKLSAgYXRvbWljX3Qgal9vbGRlcl9jb21taXRzX2RvbmUgOyAgICAgIC8qIGFsbCBjb21taXRzIG9sZGVyIHRoYW4gdGhpcyBvbiBkaXNrKi8KLSAgc3RydWN0IHNlbWFwaG9yZSBqX2NvbW1pdF9sb2NrOwotICB1bnNpZ25lZCBsb25nIGpfdHJhbnNfaWQgOwotICB0aW1lX3Qgal90aW1lc3RhbXAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpfbGlzdF9iaXRtYXAgOwotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpfY29tbWl0X2JoIDsgLyogY29tbWl0IGJ1ZmZlciBoZWFkICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX3JlYWxibG9jayAgOwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9mcmVlZGxpc3QgOyAvKiBsaXN0IG9mIGJ1ZmZlcnMgdGhhdCB3ZXJlIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zLiAgZnJlZSBlYWNoIG9mIHRoZXNlIG9uIGZsdXNoICovCi0gIC8qIHRpbWUgb3JkZXJlZCBsaXN0IG9mIGFsbCBhY3RpdmUgdHJhbnNhY3Rpb25zICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal9saXN0OworCXVuc2lnbmVkIGxvbmcgal9zdGFydDsKKwl1bnNpZ25lZCBsb25nIGpfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBqX2xlbjsKKwlhdG9taWNfdCBqX25vbnplcm9sZW47CisJYXRvbWljX3Qgal9jb21taXRfbGVmdDsKKwlhdG9taWNfdCBqX29sZGVyX2NvbW1pdHNfZG9uZTsJLyogYWxsIGNvbW1pdHMgb2xkZXIgdGhhbiB0aGlzIG9uIGRpc2sgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGpfY29tbWl0X2xvY2s7CisJdW5zaWduZWQgbG9uZyBqX3RyYW5zX2lkOworCXRpbWVfdCBqX3RpbWVzdGFtcDsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpfbGlzdF9iaXRtYXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpqX2NvbW1pdF9iaDsJLyogY29tbWl0IGJ1ZmZlciBoZWFkICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfcmVhbGJsb2NrOworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2ZyZWVkbGlzdDsJLyogbGlzdCBvZiBidWZmZXJzIHRoYXQgd2VyZSBmcmVlZCBkdXJpbmcgdGhpcyB0cmFucy4gIGZyZWUgZWFjaCBvZiB0aGVzZSBvbiBmbHVzaCAqLworCS8qIHRpbWUgb3JkZXJlZCBsaXN0IG9mIGFsbCBhY3RpdmUgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBqX2xpc3Q7CiAKLSAgLyogdGltZSBvcmRlcmVkIGxpc3Qgb2YgYWxsIHRyYW5zYWN0aW9ucyB3ZSBoYXZlbid0IHRyaWVkIHRvIGZsdXNoIHlldCAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfd29ya2luZ19saXN0OworCS8qIHRpbWUgb3JkZXJlZCBsaXN0IG9mIGFsbCB0cmFuc2FjdGlvbnMgd2UgaGF2ZW4ndCB0cmllZCB0byBmbHVzaCB5ZXQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGpfd29ya2luZ19saXN0OwogCi0gIC8qIGxpc3Qgb2YgdGFpbCBjb252ZXJzaW9uIHRhcmdldHMgaW4gbmVlZCBvZiBmbHVzaCBiZWZvcmUgY29tbWl0ICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal90YWlsX2JoX2xpc3Q7Ci0gIC8qIGxpc3Qgb2YgZGF0YT1vcmRlcmVkIGJ1ZmZlcnMgaW4gbmVlZCBvZiBmbHVzaCBiZWZvcmUgY29tbWl0ICovCi0gIHN0cnVjdCBsaXN0X2hlYWQgal9iaF9saXN0OwotICBpbnQgal9yZWZjb3VudDsKLX0gOworCS8qIGxpc3Qgb2YgdGFpbCBjb252ZXJzaW9uIHRhcmdldHMgaW4gbmVlZCBvZiBmbHVzaCBiZWZvcmUgY29tbWl0ICovCisJc3RydWN0IGxpc3RfaGVhZCBqX3RhaWxfYmhfbGlzdDsKKwkvKiBsaXN0IG9mIGRhdGE9b3JkZXJlZCBidWZmZXJzIGluIG5lZWQgb2YgZmx1c2ggYmVmb3JlIGNvbW1pdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgal9iaF9saXN0OworCWludCBqX3JlZmNvdW50OworfTsKIAogc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgewotICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogal9hcF9ibG9ja3MgOyAvKiBqb3VybmFsIGJsb2NrcyBvbiBkaXNrICovCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2xhc3QgOyAvKiBuZXdlc3Qgam91cm5hbCBibG9jayAqLwotICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9maXJzdCA7IC8qICBvbGRlc3Qgam91cm5hbCBibG9jay4gIHN0YXJ0IGhlcmUgZm9yIHRyYXZlcnNlICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqal9hcF9ibG9ja3M7CS8qIGpvdXJuYWwgYmxvY2tzIG9uIGRpc2sgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9sYXN0OwkvKiBuZXdlc3Qgam91cm5hbCBibG9jayAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2ZpcnN0OwkvKiAgb2xkZXN0IGpvdXJuYWwgYmxvY2suICBzdGFydCBoZXJlIGZvciB0cmF2ZXJzZSAqLwogCi0gIHN0cnVjdCBmaWxlICAgICAgICAgKmpfZGV2X2ZpbGU7Ci0gIHN0cnVjdCBibG9ja19kZXZpY2UgKmpfZGV2X2JkOyAgCi0gIGludCBqXzFzdF9yZXNlcnZlZF9ibG9jazsgICAgIC8qIGZpcnN0IGJsb2NrIG9uIHNfZGV2IG9mIHJlc2VydmVkIGFyZWEgam91cm5hbCAqLyAgICAgICAgCi0JCi0gIGxvbmcgal9zdGF0ZSA7CQkJCi0gIHVuc2lnbmVkIGxvbmcgal90cmFuc19pZCA7Ci0gIHVuc2lnbmVkIGxvbmcgal9tb3VudF9pZCA7Ci0gIHVuc2lnbmVkIGxvbmcgal9zdGFydCA7ICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIGN1cnJlbnQgd2FpdGluZyBjb21taXQgKGluZGV4IGludG8gal9hcF9ibG9ja3MpICovCi0gIHVuc2lnbmVkIGxvbmcgal9sZW4gOyAgICAgICAgICAgICAgIC8qIGxlbmdodCBvZiBjdXJyZW50IHdhaXRpbmcgY29tbWl0ICovCi0gIHVuc2lnbmVkIGxvbmcgal9sZW5fYWxsb2MgOyAgICAgICAgIC8qIG51bWJlciBvZiBidWZmZXJzIHJlcXVlc3RlZCBieSBqb3VybmFsX2JlZ2luKCkgKi8KLSAgYXRvbWljX3Qgal93Y291bnQgOyAgICAgICAgICAgIC8qIGNvdW50IG9mIHdyaXRlcnMgZm9yIGN1cnJlbnQgY29tbWl0ICovCi0gIHVuc2lnbmVkIGxvbmcgal9iY291bnQgOyAgICAgICAgICAgIC8qIGJhdGNoIGNvdW50LiBhbGxvd3MgdHVybmluZyBYIHRyYW5zYWN0aW9ucyBpbnRvIDEgKi8KLSAgdW5zaWduZWQgbG9uZyBqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgOyAgLyogZmlyc3QgdW5mbHVzaGVkIHRyYW5zYWN0aW9ucyBvZmZzZXQgKi8KLSAgdW5zaWduZWQgbG9uZyBqX2xhc3RfZmx1c2hfdHJhbnNfaWQgOyAgICAvKiBsYXN0IGZ1bGx5IGZsdXNoZWQgam91cm5hbCB0aW1lc3RhbXAgKi8KLSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpqX2hlYWRlcl9iaCA7ICAgCisJc3RydWN0IGZpbGUgKmpfZGV2X2ZpbGU7CisJc3RydWN0IGJsb2NrX2RldmljZSAqal9kZXZfYmQ7CisJaW50IGpfMXN0X3Jlc2VydmVkX2Jsb2NrOwkvKiBmaXJzdCBibG9jayBvbiBzX2RldiBvZiByZXNlcnZlZCBhcmVhIGpvdXJuYWwgKi8KIAotICB0aW1lX3Qgal90cmFuc19zdGFydF90aW1lIDsgICAgICAgICAvKiB0aW1lIHRoaXMgdHJhbnNhY3Rpb24gc3RhcnRlZCAqLwotICBzdHJ1Y3Qgc2VtYXBob3JlIGpfbG9jazsKLSAgc3RydWN0IHNlbWFwaG9yZSBqX2ZsdXNoX3NlbTsKLSAgd2FpdF9xdWV1ZV9oZWFkX3Qgal9qb2luX3dhaXQgOyAgICAvKiB3YWl0IGZvciBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIGZpbmlzaCBiZWZvcmUgc3RhcnRpbmcgbmV3IG9uZSAqLwotICBhdG9taWNfdCBqX2psb2NrIDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvY2sgZm9yIGpfam9pbl93YWl0ICovCi0gIGludCBqX2xpc3RfYml0bWFwX2luZGV4IDsJICAgICAgLyogbnVtYmVyIG9mIG5leHQgbGlzdCBiaXRtYXAgdG8gdXNlICovCi0gIGludCBqX211c3Rfd2FpdCA7CQkgICAgICAgLyogbm8gbW9yZSBqb3VybmFsIGJlZ2lucyBhbGxvd2VkLiBNVVNUIHNsZWVwIG9uIGpfam9pbl93YWl0ICovCi0gIGludCBqX25leHRfZnVsbF9mbHVzaCA7ICAgICAgICAgICAgIC8qIG5leHQgam91cm5hbF9lbmQgd2lsbCBmbHVzaCBhbGwgam91cm5hbCBsaXN0ICovCi0gIGludCBqX25leHRfYXN5bmNfZmx1c2ggOyAgICAgICAgICAgICAvKiBuZXh0IGpvdXJuYWxfZW5kIHdpbGwgZmx1c2ggYWxsIGFzeW5jIGNvbW1pdHMgKi8KKwlsb25nIGpfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBqX3RyYW5zX2lkOworCXVuc2lnbmVkIGxvbmcgal9tb3VudF9pZDsKKwl1bnNpZ25lZCBsb25nIGpfc3RhcnQ7CS8qIHN0YXJ0IG9mIGN1cnJlbnQgd2FpdGluZyBjb21taXQgKGluZGV4IGludG8gal9hcF9ibG9ja3MpICovCisJdW5zaWduZWQgbG9uZyBqX2xlbjsJLyogbGVuZ2h0IG9mIGN1cnJlbnQgd2FpdGluZyBjb21taXQgKi8KKwl1bnNpZ25lZCBsb25nIGpfbGVuX2FsbG9jOwkvKiBudW1iZXIgb2YgYnVmZmVycyByZXF1ZXN0ZWQgYnkgam91cm5hbF9iZWdpbigpICovCisJYXRvbWljX3Qgal93Y291bnQ7CS8qIGNvdW50IG9mIHdyaXRlcnMgZm9yIGN1cnJlbnQgY29tbWl0ICovCisJdW5zaWduZWQgbG9uZyBqX2Jjb3VudDsJLyogYmF0Y2ggY291bnQuIGFsbG93cyB0dXJuaW5nIFggdHJhbnNhY3Rpb25zIGludG8gMSAqLworCXVuc2lnbmVkIGxvbmcgal9maXJzdF91bmZsdXNoZWRfb2Zmc2V0OwkvKiBmaXJzdCB1bmZsdXNoZWQgdHJhbnNhY3Rpb25zIG9mZnNldCAqLworCXVuc2lnbmVkIGxvbmcgal9sYXN0X2ZsdXNoX3RyYW5zX2lkOwkvKiBsYXN0IGZ1bGx5IGZsdXNoZWQgam91cm5hbCB0aW1lc3RhbXAgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmpfaGVhZGVyX2JoOwogCi0gIGludCBqX2Nub2RlX3VzZWQgOwkgICAgICAvKiBudW1iZXIgb2YgY25vZGVzIG9uIHRoZSB1c2VkIGxpc3QgKi8KLSAgaW50IGpfY25vZGVfZnJlZSA7ICAgICAgICAgIC8qIG51bWJlciBvZiBjbm9kZXMgb24gdGhlIGZyZWUgbGlzdCAqLworCXRpbWVfdCBqX3RyYW5zX3N0YXJ0X3RpbWU7CS8qIHRpbWUgdGhpcyB0cmFuc2FjdGlvbiBzdGFydGVkICovCisJc3RydWN0IHNlbWFwaG9yZSBqX2xvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBqX2ZsdXNoX3NlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBqX2pvaW5fd2FpdDsJLyogd2FpdCBmb3IgY3VycmVudCB0cmFuc2FjdGlvbiB0byBmaW5pc2ggYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmUgKi8KKwlhdG9taWNfdCBqX2psb2NrOwkvKiBsb2NrIGZvciBqX2pvaW5fd2FpdCAqLworCWludCBqX2xpc3RfYml0bWFwX2luZGV4OwkvKiBudW1iZXIgb2YgbmV4dCBsaXN0IGJpdG1hcCB0byB1c2UgKi8KKwlpbnQgal9tdXN0X3dhaXQ7CS8qIG5vIG1vcmUgam91cm5hbCBiZWdpbnMgYWxsb3dlZC4gTVVTVCBzbGVlcCBvbiBqX2pvaW5fd2FpdCAqLworCWludCBqX25leHRfZnVsbF9mbHVzaDsJLyogbmV4dCBqb3VybmFsX2VuZCB3aWxsIGZsdXNoIGFsbCBqb3VybmFsIGxpc3QgKi8KKwlpbnQgal9uZXh0X2FzeW5jX2ZsdXNoOwkvKiBuZXh0IGpvdXJuYWxfZW5kIHdpbGwgZmx1c2ggYWxsIGFzeW5jIGNvbW1pdHMgKi8KIAotICB1bnNpZ25lZCBpbnQgal90cmFuc19tYXggOyAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCBqX21heF9iYXRjaCA7ICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGJsb2NrcyB0byBiYXRjaCBpbnRvIGEgdHJhbnMgKi8KLSAgdW5zaWduZWQgaW50IGpfbWF4X2NvbW1pdF9hZ2UgOyAgICAgIC8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jIGNvbW1pdCBiZSAqLwotICB1bnNpZ25lZCBpbnQgal9tYXhfdHJhbnNfYWdlIDsgICAgICAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbiBiZSAqLwotICB1bnNpZ25lZCBpbnQgal9kZWZhdWx0X21heF9jb21taXRfYWdlIDsgLyogdGhlIGRlZmF1bHQgZm9yIHRoZSBtYXggY29tbWl0IGFnZSAqLworCWludCBqX2Nub2RlX3VzZWQ7CS8qIG51bWJlciBvZiBjbm9kZXMgb24gdGhlIHVzZWQgbGlzdCAqLworCWludCBqX2Nub2RlX2ZyZWU7CS8qIG51bWJlciBvZiBjbm9kZXMgb24gdGhlIGZyZWUgbGlzdCAqLwogCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2Nub2RlX2ZyZWVfbGlzdCA7Ci0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2Nub2RlX2ZyZWVfb3JpZyA7IC8qIG9yaWcgcG9pbnRlciByZXR1cm5lZCBmcm9tIHZtYWxsb2MgKi8KKwl1bnNpZ25lZCBpbnQgal90cmFuc19tYXg7CS8qIG1heCBudW1iZXIgb2YgYmxvY2tzIGluIGEgdHJhbnNhY3Rpb24uICAqLworCXVuc2lnbmVkIGludCBqX21heF9iYXRjaDsJLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhIHRyYW5zICovCisJdW5zaWduZWQgaW50IGpfbWF4X2NvbW1pdF9hZ2U7CS8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGFuIGFzeW5jIGNvbW1pdCBiZSAqLworCXVuc2lnbmVkIGludCBqX21heF90cmFuc19hZ2U7CS8qIGluIHNlY29uZHMsIGhvdyBvbGQgY2FuIGEgdHJhbnNhY3Rpb24gYmUgKi8KKwl1bnNpZ25lZCBpbnQgal9kZWZhdWx0X21heF9jb21taXRfYWdlOwkvKiB0aGUgZGVmYXVsdCBmb3IgdGhlIG1heCBjb21taXQgYWdlICovCiAKLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqal9jdXJyZW50X2psOwotICBpbnQgal9mcmVlX2JpdG1hcF9ub2RlcyA7Ci0gIGludCBqX3VzZWRfYml0bWFwX25vZGVzIDsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqal9jbm9kZV9mcmVlX2xpc3Q7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfY25vZGVfZnJlZV9vcmlnOwkvKiBvcmlnIHBvaW50ZXIgcmV0dXJuZWQgZnJvbSB2bWFsbG9jICovCiAKLSAgaW50IGpfbnVtX2xpc3RzOyAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgdHJhbnNhY3Rpb25zICovCi0gIGludCBqX251bV93b3JrX2xpc3RzOyAvKiBudW1iZXIgdGhhdCBuZWVkIGF0dGVudGlvbiBmcm9tIGtyZWlzZXJmc2QgKi8KKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqX2N1cnJlbnRfamw7CisJaW50IGpfZnJlZV9iaXRtYXBfbm9kZXM7CisJaW50IGpfdXNlZF9iaXRtYXBfbm9kZXM7CiAKLSAgLyogZGVidWdnaW5nIHRvIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIGZsdXNoZWQgaW4gb3JkZXIgKi8KLSAgaW50IGpfbGFzdF9mbHVzaF9pZDsKKwlpbnQgal9udW1fbGlzdHM7CS8qIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgdHJhbnNhY3Rpb25zICovCisJaW50IGpfbnVtX3dvcmtfbGlzdHM7CS8qIG51bWJlciB0aGF0IG5lZWQgYXR0ZW50aW9uIGZyb20ga3JlaXNlcmZzZCAqLwogCi0gIC8qIGRlYnVnZ2luZyB0byBtYWtlIHN1cmUgdGhpbmdzIGFyZSBjb21taXR0ZWQgaW4gb3JkZXIgKi8KLSAgaW50IGpfbGFzdF9jb21taXRfaWQ7CisJLyogZGVidWdnaW5nIHRvIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIGZsdXNoZWQgaW4gb3JkZXIgKi8KKwlpbnQgal9sYXN0X2ZsdXNoX2lkOwogCi0gIHN0cnVjdCBsaXN0X2hlYWQgal9iaXRtYXBfbm9kZXMgOwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfZGlydHlfYnVmZmVycyA7Ci0gIHNwaW5sb2NrX3Qgal9kaXJ0eV9idWZmZXJzX2xvY2sgOyAvKiBwcm90ZWN0cyBqX2RpcnR5X2J1ZmZlcnMgKi8KKwkvKiBkZWJ1Z2dpbmcgdG8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgY29tbWl0dGVkIGluIG9yZGVyICovCisJaW50IGpfbGFzdF9jb21taXRfaWQ7CiAKLSAgLyogbGlzdCBvZiBhbGwgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfam91cm5hbF9saXN0OwotICAvKiBsaXN0cyB0aGF0IGhhdmVuJ3QgYmVlbiB0b3VjaGVkIGJ5IHdyaXRlYmFjayBhdHRlbXB0cyAqLwotICBzdHJ1Y3QgbGlzdF9oZWFkIGpfd29ya2luZ19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgal9iaXRtYXBfbm9kZXM7CisJc3RydWN0IGxpc3RfaGVhZCBqX2RpcnR5X2J1ZmZlcnM7CisJc3BpbmxvY2tfdCBqX2RpcnR5X2J1ZmZlcnNfbG9jazsJLyogcHJvdGVjdHMgal9kaXJ0eV9idWZmZXJzICovCiAKLSAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwIGpfbGlzdF9iaXRtYXBbSk9VUk5BTF9OVU1fQklUTUFQU10gOwkvKiBhcnJheSBvZiBiaXRtYXBzIHRvIHJlY29yZCB0aGUgZGVsZXRlZCBibG9ja3MgKi8KLSAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfaGFzaF90YWJsZVtKT1VSTkFMX0hBU0hfU0laRV0gOyAJICAgIC8qIGhhc2ggdGFibGUgZm9yIHJlYWwgYnVmZmVyIGhlYWRzIGluIGN1cnJlbnQgdHJhbnMgKi8gCi0gIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2xpc3RfaGFzaF90YWJsZVtKT1VSTkFMX0hBU0hfU0laRV0gOyAvKiBoYXNoIHRhYmxlIGZvciBhbGwgdGhlIHJlYWwgYnVmZmVyIGhlYWRzIGluIGFsbCAKLSAgCQkJCQkJCQkJCXRoZSB0cmFuc2FjdGlvbnMgKi8KLSAgc3RydWN0IGxpc3RfaGVhZCBqX3ByZWFsbG9jX2xpc3Q7ICAgICAvKiBsaXN0IG9mIGlub2RlcyB3aGljaCBoYXZlIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KLSAgaW50IGpfcGVyc2lzdGVudF90cmFuczsKLSAgdW5zaWduZWQgbG9uZyBqX21heF90cmFuc19zaXplIDsKLSAgdW5zaWduZWQgbG9uZyBqX21heF9iYXRjaF9zaXplIDsKKwkvKiBsaXN0IG9mIGFsbCBhY3RpdmUgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxpc3RfaGVhZCBqX2pvdXJuYWxfbGlzdDsKKwkvKiBsaXN0cyB0aGF0IGhhdmVuJ3QgYmVlbiB0b3VjaGVkIGJ5IHdyaXRlYmFjayBhdHRlbXB0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgal93b3JraW5nX2xpc3Q7CiAKLSAgaW50IGpfZXJybm87CisJc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwIGpfbGlzdF9iaXRtYXBbSk9VUk5BTF9OVU1fQklUTUFQU107CS8qIGFycmF5IG9mIGJpdG1hcHMgdG8gcmVjb3JkIHRoZSBkZWxldGVkIGJsb2NrcyAqLworCXN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpqX2hhc2hfdGFibGVbSk9VUk5BTF9IQVNIX1NJWkVdOwkvKiBoYXNoIHRhYmxlIGZvciByZWFsIGJ1ZmZlciBoZWFkcyBpbiBjdXJyZW50IHRyYW5zICovCisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmpfbGlzdF9oYXNoX3RhYmxlW0pPVVJOQUxfSEFTSF9TSVpFXTsJLyogaGFzaCB0YWJsZSBmb3IgYWxsIHRoZSByZWFsIGJ1ZmZlciBoZWFkcyBpbiBhbGwgCisJCQkJCQkJCQkJICAgdGhlIHRyYW5zYWN0aW9ucyAqLworCXN0cnVjdCBsaXN0X2hlYWQgal9wcmVhbGxvY19saXN0OwkvKiBsaXN0IG9mIGlub2RlcyB3aGljaCBoYXZlIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KKwlpbnQgal9wZXJzaXN0ZW50X3RyYW5zOworCXVuc2lnbmVkIGxvbmcgal9tYXhfdHJhbnNfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGpfbWF4X2JhdGNoX3NpemU7CiAKLSAgLyogd2hlbiBmbHVzaGluZyBvcmRlcmVkIGJ1ZmZlcnMsIHRocm90dGxlIG5ldyBvcmRlcmVkIHdyaXRlcnMgKi8KLSAgc3RydWN0IHdvcmtfc3RydWN0IGpfd29yazsKLSAgYXRvbWljX3Qgal9hc3luY190aHJvdHRsZTsKKwlpbnQgal9lcnJubzsKKworCS8qIHdoZW4gZmx1c2hpbmcgb3JkZXJlZCBidWZmZXJzLCB0aHJvdHRsZSBuZXcgb3JkZXJlZCB3cml0ZXJzICovCisJc3RydWN0IHdvcmtfc3RydWN0IGpfd29yazsKKwlhdG9taWNfdCBqX2FzeW5jX3Rocm90dGxlOwogfTsKIAogZW51bSBqb3VybmFsX3N0YXRlX2JpdHMgewotICAgIEpfV1JJVEVSU19CTE9DS0VEID0gMSwgICAvKiBzZXQgd2hlbiBuZXcgd3JpdGVycyBub3QgYWxsb3dlZCAqLwotICAgIEpfV1JJVEVSU19RVUVVRUQsICAgICAgICAvKiBzZXQgd2hlbiBsb2cgaXMgZnVsbCBkdWUgdG8gdG9vIG1hbnkgd3JpdGVycyAqLwotICAgIEpfQUJPUlRFRCwgICAgICAgICAgICAgICAvKiBzZXQgd2hlbiBsb2cgaXMgYWJvcnRlZCAqLworCUpfV1JJVEVSU19CTE9DS0VEID0gMSwJLyogc2V0IHdoZW4gbmV3IHdyaXRlcnMgbm90IGFsbG93ZWQgKi8KKwlKX1dSSVRFUlNfUVVFVUVELAkvKiBzZXQgd2hlbiBsb2cgaXMgZnVsbCBkdWUgdG8gdG9vIG1hbnkgd3JpdGVycyAqLworCUpfQUJPUlRFRCwJCS8qIHNldCB3aGVuIGxvZyBpcyBhYm9ydGVkICovCiB9OwogCisjZGVmaW5lIEpPVVJOQUxfREVTQ19NQUdJQyAiUmVJc0VyTEIiCS8qIGljay4gIG1hZ2ljIHN0cmluZyB0byBmaW5kIGRlc2MgYmxvY2tzIGluIHRoZSBqb3VybmFsICovCiAKLSNkZWZpbmUgSk9VUk5BTF9ERVNDX01BR0lDICJSZUlzRXJMQiIgLyogaWNrLiAgbWFnaWMgc3RyaW5nIHRvIGZpbmQgZGVzYyBibG9ja3MgaW4gdGhlIGpvdXJuYWwgKi8KK3R5cGVkZWYgX191MzIoKmhhc2hmX3QpIChjb25zdCBzaWduZWQgY2hhciAqLCBpbnQpOwogCi10eXBlZGVmIF9fdTMyICgqaGFzaGZfdCkgKGNvbnN0IHNpZ25lZCBjaGFyICosIGludCk7Ci0KLXN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbwotewotICAgIC8vIEZJWE1FOiBXb24ndCB3b3JrIHdpdGggYmxvY2sgc2l6ZXMgPiA4SwotICAgIF9fdTE2ICBmaXJzdF96ZXJvX2hpbnQ7Ci0gICAgX191MTYgIGZyZWVfY291bnQ7Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsgLyogdGhlIGFjdHVhbCBiaXRtYXAgKi8KK3N0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyB7CisJLy8gRklYTUU6IFdvbid0IHdvcmsgd2l0aCBibG9jayBzaXplcyA+IDhLCisJX191MTYgZmlyc3RfemVyb19oaW50OworCV9fdTE2IGZyZWVfY291bnQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsJLyogdGhlIGFjdHVhbCBiaXRtYXAgKi8KIH07CiAKIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeTsKIAogI2lmIGRlZmluZWQoIENPTkZJR19QUk9DX0ZTICkgJiYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyApCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHN0YXRfY250X3Q7Ci10eXBlZGVmIHN0cnVjdCByZWlzZXJmc19wcm9jX2luZm9fZGF0YQotewotICBzcGlubG9ja190IGxvY2s7Ci0gIGludCBleGl0aW5nOwotICBpbnQgbWF4X2hhc2hfY29sbGlzaW9uczsKK3R5cGVkZWYgc3RydWN0IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhIHsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IGV4aXRpbmc7CisJaW50IG1heF9oYXNoX2NvbGxpc2lvbnM7CiAKLSAgc3RhdF9jbnRfdCBicmVhZHM7Ci0gIHN0YXRfY250X3QgYnJlYWRfbWlzczsKLSAgc3RhdF9jbnRfdCBzZWFyY2hfYnlfa2V5OwotICBzdGF0X2NudF90IHNlYXJjaF9ieV9rZXlfZnNfY2hhbmdlZDsKLSAgc3RhdF9jbnRfdCBzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZDsKKwlzdGF0X2NudF90IGJyZWFkczsKKwlzdGF0X2NudF90IGJyZWFkX21pc3M7CisJc3RhdF9jbnRfdCBzZWFyY2hfYnlfa2V5OworCXN0YXRfY250X3Qgc2VhcmNoX2J5X2tleV9mc19jaGFuZ2VkOworCXN0YXRfY250X3Qgc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQ7CiAKLSAgc3RhdF9jbnRfdCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQ7Ci0gIHN0YXRfY250X3QgcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZDsKLSAgc3RhdF9jbnRfdCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDsKLSAgc3RhdF9jbnRfdCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQ7Ci0gIHN0YXRfY250X3QgZGVsZXRlX2l0ZW1fcmVzdGFydGVkOworCXN0YXRfY250X3QgaW5zZXJ0X2l0ZW1fcmVzdGFydGVkOworCXN0YXRfY250X3QgcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZDsKKwlzdGF0X2NudF90IGN1dF9mcm9tX2l0ZW1fcmVzdGFydGVkOworCXN0YXRfY250X3QgZGVsZXRlX3NvbGlkX2l0ZW1fcmVzdGFydGVkOworCXN0YXRfY250X3QgZGVsZXRlX2l0ZW1fcmVzdGFydGVkOwogCi0gIHN0YXRfY250X3QgbGVha2VkX29pZDsKLSAgc3RhdF9jbnRfdCBsZWF2ZXNfcmVtb3ZhYmxlOworCXN0YXRfY250X3QgbGVha2VkX29pZDsKKwlzdGF0X2NudF90IGxlYXZlc19yZW1vdmFibGU7CiAKLSAgLyogYmFsYW5jZXMgcGVyIGxldmVsLiBVc2UgZXhwbGljaXQgNSBhcyBNQVhfSEVJR0hUIGlzIG5vdCB2aXNpYmxlIHlldC4gKi8KLSAgc3RhdF9jbnRfdCBiYWxhbmNlX2F0WyA1IF07IC8qIFhYWCAqLwotICAvKiBzYmsgPT0gc2VhcmNoX2J5X2tleSAqLwotICBzdGF0X2NudF90IHNia19yZWFkX2F0WyA1IF07IC8qIFhYWCAqLwotICBzdGF0X2NudF90IHNia19mc19jaGFuZ2VkWyA1IF07Ci0gIHN0YXRfY250X3Qgc2JrX3Jlc3RhcnRlZFsgNSBdOwotICBzdGF0X2NudF90IGl0ZW1zX2F0WyA1IF07IC8qIFhYWCAqLwotICBzdGF0X2NudF90IGZyZWVfYXRbIDUgXTsgLyogWFhYICovCi0gIHN0YXRfY250X3QgY2FuX25vZGVfYmVfcmVtb3ZlZFsgNSBdOyAvKiBYWFggKi8KLSAgbG9uZyBpbnQgbG51bVsgNSBdOyAvKiBYWFggKi8KLSAgbG9uZyBpbnQgcm51bVsgNSBdOyAvKiBYWFggKi8KLSAgbG9uZyBpbnQgbGJ5dGVzWyA1IF07IC8qIFhYWCAqLwotICBsb25nIGludCByYnl0ZXNbIDUgXTsgLyogWFhYICovCi0gIHN0YXRfY250X3QgZ2V0X25laWdoYm9yc1sgNSBdOwotICBzdGF0X2NudF90IGdldF9uZWlnaGJvcnNfcmVzdGFydFsgNSBdOwotICBzdGF0X2NudF90IG5lZWRfbF9uZWlnaGJvclsgNSBdOwotICBzdGF0X2NudF90IG5lZWRfcl9uZWlnaGJvclsgNSBdOworCS8qIGJhbGFuY2VzIHBlciBsZXZlbC4gVXNlIGV4cGxpY2l0IDUgYXMgTUFYX0hFSUdIVCBpcyBub3QgdmlzaWJsZSB5ZXQuICovCisJc3RhdF9jbnRfdCBiYWxhbmNlX2F0WzVdOwkvKiBYWFggKi8KKwkvKiBzYmsgPT0gc2VhcmNoX2J5X2tleSAqLworCXN0YXRfY250X3Qgc2JrX3JlYWRfYXRbNV07CS8qIFhYWCAqLworCXN0YXRfY250X3Qgc2JrX2ZzX2NoYW5nZWRbNV07CisJc3RhdF9jbnRfdCBzYmtfcmVzdGFydGVkWzVdOworCXN0YXRfY250X3QgaXRlbXNfYXRbNV07CS8qIFhYWCAqLworCXN0YXRfY250X3QgZnJlZV9hdFs1XTsJLyogWFhYICovCisJc3RhdF9jbnRfdCBjYW5fbm9kZV9iZV9yZW1vdmVkWzVdOwkvKiBYWFggKi8KKwlsb25nIGludCBsbnVtWzVdOwkvKiBYWFggKi8KKwlsb25nIGludCBybnVtWzVdOwkvKiBYWFggKi8KKwlsb25nIGludCBsYnl0ZXNbNV07CS8qIFhYWCAqLworCWxvbmcgaW50IHJieXRlc1s1XTsJLyogWFhYICovCisJc3RhdF9jbnRfdCBnZXRfbmVpZ2hib3JzWzVdOworCXN0YXRfY250X3QgZ2V0X25laWdoYm9yc19yZXN0YXJ0WzVdOworCXN0YXRfY250X3QgbmVlZF9sX25laWdoYm9yWzVdOworCXN0YXRfY250X3QgbmVlZF9yX25laWdoYm9yWzVdOwogCi0gIHN0YXRfY250X3QgZnJlZV9ibG9jazsKLSAgc3RydWN0IF9fc2Nhbl9iaXRtYXBfc3RhdHMgewotCXN0YXRfY250X3QgY2FsbDsKLQlzdGF0X2NudF90IHdhaXQ7Ci0Jc3RhdF9jbnRfdCBibWFwOwotCXN0YXRfY250X3QgcmV0cnk7Ci0Jc3RhdF9jbnRfdCBpbl9qb3VybmFsX2hpbnQ7Ci0Jc3RhdF9jbnRfdCBpbl9qb3VybmFsX25vaGludDsKLQlzdGF0X2NudF90IHN0b2xlbjsKLSAgfSBzY2FuX2JpdG1hcDsKLSAgc3RydWN0IF9fam91cm5hbF9zdGF0cyB7Ci0Jc3RhdF9jbnRfdCBpbl9qb3VybmFsOwotCXN0YXRfY250X3QgaW5fam91cm5hbF9iaXRtYXA7Ci0Jc3RhdF9jbnRfdCBpbl9qb3VybmFsX3JldXNhYmxlOwotCXN0YXRfY250X3QgbG9ja19qb3VybmFsOwotCXN0YXRfY250X3QgbG9ja19qb3VybmFsX3dhaXQ7Ci0Jc3RhdF9jbnRfdCBqb3VybmFsX2JlaW5nOwotCXN0YXRfY250X3Qgam91cm5hbF9yZWxvY2tfd3JpdGVyczsKLQlzdGF0X2NudF90IGpvdXJuYWxfcmVsb2NrX3djb3VudDsKLQlzdGF0X2NudF90IG1hcmtfZGlydHk7Ci0Jc3RhdF9jbnRfdCBtYXJrX2RpcnR5X2FscmVhZHk7Ci0Jc3RhdF9jbnRfdCBtYXJrX2RpcnR5X25vdGpvdXJuYWw7Ci0Jc3RhdF9jbnRfdCByZXN0b3JlX3ByZXBhcmVkOwotCXN0YXRfY250X3QgcHJlcGFyZTsKLQlzdGF0X2NudF90IHByZXBhcmVfcmV0cnk7Ci0gIH0gam91cm5hbDsKKwlzdGF0X2NudF90IGZyZWVfYmxvY2s7CisJc3RydWN0IF9fc2Nhbl9iaXRtYXBfc3RhdHMgeworCQlzdGF0X2NudF90IGNhbGw7CisJCXN0YXRfY250X3Qgd2FpdDsKKwkJc3RhdF9jbnRfdCBibWFwOworCQlzdGF0X2NudF90IHJldHJ5OworCQlzdGF0X2NudF90IGluX2pvdXJuYWxfaGludDsKKwkJc3RhdF9jbnRfdCBpbl9qb3VybmFsX25vaGludDsKKwkJc3RhdF9jbnRfdCBzdG9sZW47CisJfSBzY2FuX2JpdG1hcDsKKwlzdHJ1Y3QgX19qb3VybmFsX3N0YXRzIHsKKwkJc3RhdF9jbnRfdCBpbl9qb3VybmFsOworCQlzdGF0X2NudF90IGluX2pvdXJuYWxfYml0bWFwOworCQlzdGF0X2NudF90IGluX2pvdXJuYWxfcmV1c2FibGU7CisJCXN0YXRfY250X3QgbG9ja19qb3VybmFsOworCQlzdGF0X2NudF90IGxvY2tfam91cm5hbF93YWl0OworCQlzdGF0X2NudF90IGpvdXJuYWxfYmVpbmc7CisJCXN0YXRfY250X3Qgam91cm5hbF9yZWxvY2tfd3JpdGVyczsKKwkJc3RhdF9jbnRfdCBqb3VybmFsX3JlbG9ja193Y291bnQ7CisJCXN0YXRfY250X3QgbWFya19kaXJ0eTsKKwkJc3RhdF9jbnRfdCBtYXJrX2RpcnR5X2FscmVhZHk7CisJCXN0YXRfY250X3QgbWFya19kaXJ0eV9ub3Rqb3VybmFsOworCQlzdGF0X2NudF90IHJlc3RvcmVfcHJlcGFyZWQ7CisJCXN0YXRfY250X3QgcHJlcGFyZTsKKwkJc3RhdF9jbnRfdCBwcmVwYXJlX3JldHJ5OworCX0gam91cm5hbDsKIH0gcmVpc2VyZnNfcHJvY19pbmZvX2RhdGFfdDsKICNlbHNlCi10eXBlZGVmIHN0cnVjdCByZWlzZXJmc19wcm9jX2luZm9fZGF0YQote30gcmVpc2VyZnNfcHJvY19pbmZvX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhIHsKK30gcmVpc2VyZnNfcHJvY19pbmZvX2RhdGFfdDsKICNlbmRpZgogCiAvKiByZWlzZXJmcyB1bmlvbiBvZiBpbi1jb3JlIHN1cGVyIGJsb2NrIGRhdGEgKi8KLXN0cnVjdCByZWlzZXJmc19zYl9pbmZvCi17Ci0gICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7ICAgICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLwotCQkJCS8qIGJvdGggdGhlIGNvbW1lbnQgYW5kIHRoZSBjaG9pY2Ugb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBhcmUgdW5jbGVhciBmb3Igc19ycyAtSGFucyAqLwotICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHNfcnM7ICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCi0gICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICogc19hcF9iaXRtYXA7Ci0gICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKnNfam91cm5hbCA7CQkvKiBwb2ludGVyIHRvIGpvdXJuYWwgaW5mb3JtYXRpb24gKi8KLSAgICB1bnNpZ25lZCBzaG9ydCBzX21vdW50X3N0YXRlOyAgICAgICAgICAgICAgICAgLyogcmVpc2VyZnMgc3RhdGUgKHZhbGlkLCBpbnZhbGlkKSAqLwotICAKLQkJCQkvKiBDb21tZW50PyAtSGFucyAqLwotICAgIHZvaWQgKCplbmRfaW9faGFuZGxlcikoc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7Ci0gICAgaGFzaGZfdCBzX2hhc2hfZnVuY3Rpb247CS8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gd2hpY2ggaXMgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzb3J0IG5hbWVzIGluIGRpcmVjdG9yeS4gU2V0IG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ICovCi0gICAgdW5zaWduZWQgbG9uZyBzX21vdW50X29wdDsJLyogcmVpc2VyZnMncyBtb3VudCBvcHRpb25zIGFyZSBzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSAoY3VycmVudGx5IC0gTk9UQUlMLCBOT0xPRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQTEFZT05MWSkgKi8KK3N0cnVjdCByZWlzZXJmc19zYl9pbmZvIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNfc2JoOwkvKiBCdWZmZXIgY29udGFpbmluZyB0aGUgc3VwZXIgYmxvY2sgKi8KKwkvKiBib3RoIHRoZSBjb21tZW50IGFuZCB0aGUgY2hvaWNlIG9mCisJICAgbmFtZSBhcmUgdW5jbGVhciBmb3Igc19ycyAtSGFucyAqLworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqc19yczsJLyogUG9pbnRlciB0byB0aGUgc3VwZXIgYmxvY2sgaW4gdGhlIGJ1ZmZlciAqLworCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqc19hcF9iaXRtYXA7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKnNfam91cm5hbDsJLyogcG9pbnRlciB0byBqb3VybmFsIGluZm9ybWF0aW9uICovCisJdW5zaWduZWQgc2hvcnQgc19tb3VudF9zdGF0ZTsJLyogcmVpc2VyZnMgc3RhdGUgKHZhbGlkLCBpbnZhbGlkKSAqLwogCi0gICAgc3RydWN0IHsJCQkvKiBUaGlzIGlzIGEgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGJsb2NrIGFsbG9jYXRvciBvcHRpb25zICovCi0JdW5zaWduZWQgbG9uZyBiaXRzOwkvKiBCaXRmaWVsZCBmb3IgZW5hYmxlL2Rpc2FibGUga2luZCBvZiBvcHRpb25zICovCi0JdW5zaWduZWQgbG9uZyBsYXJnZV9maWxlX3NpemU7IC8qIHNpemUgc3RhcnRlZCBmcm9tIHdoaWNoIHdlIGNvbnNpZGVyIGZpbGUgdG8gYmUgYSBsYXJnZSBvbmUoaW4gYmxvY2tzKSAqLwotCWludCBib3JkZXI7CQkvKiBwZXJjZW50YWdlIG9mIGRpc2ssIGJvcmRlciB0YWtlcyAqLwotCWludCBwcmVhbGxvY21pbjsJLyogTWluaW1hbCBmaWxlIHNpemUgKGluIGJsb2Nrcykgc3RhcnRpbmcgZnJvbSB3aGljaCB3ZSBkbyBwcmVhbGxvY2F0aW9ucyAqLwotCWludCBwcmVhbGxvY3NpemU7CS8qIE51bWJlciBvZiBibG9ja3Mgd2UgdHJ5IHRvIHByZWFsbG9jIHdoZW4gZmlsZQotCQkJCSAgIHJlYWNoZXMgcHJlYWxsb2NtaW4gc2l6ZSAoaW4gYmxvY2tzKSBvcgotCQkJCSAgIHByZWFsbG9jX2xpc3QgaXMgZW1wdHkuICovCi0gICAgfSBzX2FsbG9jX29wdGlvbnM7CisJLyogQ29tbWVudD8gLUhhbnMgKi8KKwl2b2lkICgqZW5kX2lvX2hhbmRsZXIpIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKKwloYXNoZl90IHNfaGFzaF9mdW5jdGlvbjsJLyogcG9pbnRlciB0byBmdW5jdGlvbiB3aGljaCBpcyB1c2VkCisJCQkJCSAgIHRvIHNvcnQgbmFtZXMgaW4gZGlyZWN0b3J5LiBTZXQgb24KKwkJCQkJICAgbW91bnQgKi8KKwl1bnNpZ25lZCBsb25nIHNfbW91bnRfb3B0OwkvKiByZWlzZXJmcydzIG1vdW50IG9wdGlvbnMgYXJlIHNldAorCQkJCQkgICBoZXJlIChjdXJyZW50bHkgLSBOT1RBSUwsIE5PTE9HLAorCQkJCQkgICBSRVBMQVlPTkxZKSAqLwogCi0JCQkJLyogQ29tbWVudD8gLUhhbnMgKi8KLSAgICB3YWl0X3F1ZXVlX2hlYWRfdCBzX3dhaXQ7Ci0JCQkJLyogVG8gYmUgb2Jzb2xldGVkIHNvb24gYnkgcGVyIGJ1ZmZlciBzZWFscy4uIC1IYW5zICovCi0gICAgYXRvbWljX3Qgc19nZW5lcmF0aW9uX2NvdW50ZXI7IC8vIGluY3JlYXNlZCBieSBvbmUgZXZlcnkgdGltZSB0aGUKLSAgICAvLyB0cmVlIGdldHMgcmUtYmFsYW5jZWQKLSAgICB1bnNpZ25lZCBsb25nIHNfcHJvcGVydGllczsgICAgLyogRmlsZSBzeXN0ZW0gcHJvcGVydGllcy4gQ3VycmVudGx5IGhvbGRzCi0JCQkJICAgICBvbi1kaXNrIEZTIGZvcm1hdCAqLwotICAgIAotICAgIC8qIHNlc3Npb24gc3RhdGlzdGljcyAqLwotICAgIGludCBzX2ttYWxsb2NzOwotICAgIGludCBzX2Rpc2tfcmVhZHM7Ci0gICAgaW50IHNfZGlza193cml0ZXM7Ci0gICAgaW50IHNfZml4X25vZGVzOwotICAgIGludCBzX2RvX2JhbGFuY2U7Ci0gICAgaW50IHNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvcjsKLSAgICBpbnQgc19nb29kX3NlYXJjaF9ieV9rZXlfcmVhZGE7Ci0gICAgaW50IHNfYm1hcHM7Ci0gICAgaW50IHNfYm1hcHNfd2l0aG91dF9zZWFyY2g7Ci0gICAgaW50IHNfZGlyZWN0MmluZGlyZWN0OwotICAgIGludCBzX2luZGlyZWN0MmRpcmVjdDsKKwlzdHJ1Y3QgewkJLyogVGhpcyBpcyBhIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBibG9jayBhbGxvY2F0b3Igb3B0aW9ucyAqLworCQl1bnNpZ25lZCBsb25nIGJpdHM7CS8qIEJpdGZpZWxkIGZvciBlbmFibGUvZGlzYWJsZSBraW5kIG9mIG9wdGlvbnMgKi8KKwkJdW5zaWduZWQgbG9uZyBsYXJnZV9maWxlX3NpemU7CS8qIHNpemUgc3RhcnRlZCBmcm9tIHdoaWNoIHdlIGNvbnNpZGVyIGZpbGUgdG8gYmUgYSBsYXJnZSBvbmUoaW4gYmxvY2tzKSAqLworCQlpbnQgYm9yZGVyOwkvKiBwZXJjZW50YWdlIG9mIGRpc2ssIGJvcmRlciB0YWtlcyAqLworCQlpbnQgcHJlYWxsb2NtaW47CS8qIE1pbmltYWwgZmlsZSBzaXplIChpbiBibG9ja3MpIHN0YXJ0aW5nIGZyb20gd2hpY2ggd2UgZG8gcHJlYWxsb2NhdGlvbnMgKi8KKwkJaW50IHByZWFsbG9jc2l6ZTsJLyogTnVtYmVyIG9mIGJsb2NrcyB3ZSB0cnkgdG8gcHJlYWxsb2Mgd2hlbiBmaWxlCisJCQkJCSAgIHJlYWNoZXMgcHJlYWxsb2NtaW4gc2l6ZSAoaW4gYmxvY2tzKSBvcgorCQkJCQkgICBwcmVhbGxvY19saXN0IGlzIGVtcHR5LiAqLworCX0gc19hbGxvY19vcHRpb25zOworCisJLyogQ29tbWVudD8gLUhhbnMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzX3dhaXQ7CisJLyogVG8gYmUgb2Jzb2xldGVkIHNvb24gYnkgcGVyIGJ1ZmZlciBzZWFscy4uIC1IYW5zICovCisJYXRvbWljX3Qgc19nZW5lcmF0aW9uX2NvdW50ZXI7CS8vIGluY3JlYXNlZCBieSBvbmUgZXZlcnkgdGltZSB0aGUKKwkvLyB0cmVlIGdldHMgcmUtYmFsYW5jZWQKKwl1bnNpZ25lZCBsb25nIHNfcHJvcGVydGllczsJLyogRmlsZSBzeXN0ZW0gcHJvcGVydGllcy4gQ3VycmVudGx5IGhvbGRzCisJCQkJCSAgIG9uLWRpc2sgRlMgZm9ybWF0ICovCisKKwkvKiBzZXNzaW9uIHN0YXRpc3RpY3MgKi8KKwlpbnQgc19rbWFsbG9jczsKKwlpbnQgc19kaXNrX3JlYWRzOworCWludCBzX2Rpc2tfd3JpdGVzOworCWludCBzX2ZpeF9ub2RlczsKKwlpbnQgc19kb19iYWxhbmNlOworCWludCBzX3VubmVlZGVkX2xlZnRfbmVpZ2hib3I7CisJaW50IHNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhOworCWludCBzX2JtYXBzOworCWludCBzX2JtYXBzX3dpdGhvdXRfc2VhcmNoOworCWludCBzX2RpcmVjdDJpbmRpcmVjdDsKKwlpbnQgc19pbmRpcmVjdDJkaXJlY3Q7CiAJLyogc2V0IHVwIHdoZW4gaXQncyBvayBmb3IgcmVpc2VyZnNfcmVhZF9pbm9kZTIoKSB0byByZWFkIGZyb20KIAkgICBkaXNrIGlub2RlIHdpdGggbmxpbms9PTAuIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgdXNlZCBkdXJpbmcKIAkgICBmaW5pc2hfdW5maW5pc2hlZCgpIHByb2Nlc3NpbmcgYXQgbW91bnQgdGltZSAqLwotICAgIGludCBzX2lzX3VubGlua2VkX29rOwotICAgIHJlaXNlcmZzX3Byb2NfaW5mb19kYXRhX3Qgc19wcm9jX2luZm9fZGF0YTsKLSAgICBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NkaXI7Ci0gICAgaW50IHJlc2VydmVkX2Jsb2NrczsgLyogYW1vdW50IG9mIGJsb2NrcyByZXNlcnZlZCBmb3IgZnVydGhlciBhbGxvY2F0aW9ucyAqLwotICAgIHNwaW5sb2NrX3QgYml0bWFwX2xvY2s7IC8qIHRoaXMgbG9jayBvbiBub3cgb25seSB1c2VkIHRvIHByb3RlY3QgcmVzZXJ2ZWRfYmxvY2tzIHZhcmlhYmxlICovCi0gICAgc3RydWN0IGRlbnRyeSAqcHJpdl9yb290OyAvKiByb290IG9mIC8ucmVpc2VyZnNfcHJpdiAqLwotICAgIHN0cnVjdCBkZW50cnkgKnhhdHRyX3Jvb3Q7IC8qIHJvb3Qgb2YgLy5yZWlzZXJmc19wcml2Ly54YSAqLwotICAgIHN0cnVjdCByd19zZW1hcGhvcmUgeGF0dHJfZGlyX3NlbTsKKwlpbnQgc19pc191bmxpbmtlZF9vazsKKwlyZWlzZXJmc19wcm9jX2luZm9fZGF0YV90IHNfcHJvY19pbmZvX2RhdGE7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jZGlyOworCWludCByZXNlcnZlZF9ibG9ja3M7CS8qIGFtb3VudCBvZiBibG9ja3MgcmVzZXJ2ZWQgZm9yIGZ1cnRoZXIgYWxsb2NhdGlvbnMgKi8KKwlzcGlubG9ja190IGJpdG1hcF9sb2NrOwkvKiB0aGlzIGxvY2sgb24gbm93IG9ubHkgdXNlZCB0byBwcm90ZWN0IHJlc2VydmVkX2Jsb2NrcyB2YXJpYWJsZSAqLworCXN0cnVjdCBkZW50cnkgKnByaXZfcm9vdDsJLyogcm9vdCBvZiAvLnJlaXNlcmZzX3ByaXYgKi8KKwlzdHJ1Y3QgZGVudHJ5ICp4YXR0cl9yb290OwkvKiByb290IG9mIC8ucmVpc2VyZnNfcHJpdi8ueGEgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX2Rpcl9zZW07CiAKLSAgICBpbnQgal9lcnJubzsKKwlpbnQgal9lcnJubzsKICNpZmRlZiBDT05GSUdfUVVPVEEKLSAgICBjaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107Ci0gICAgaW50IHNfanF1b3RhX2ZtdDsKKwljaGFyICpzX3FmX25hbWVzW01BWFFVT1RBU107CisJaW50IHNfanF1b3RhX2ZtdDsKICNlbmRpZgogfTsKIApAQCAtNDIyLDE0ICs0MTgsMTQgQEAKIAogZW51bSByZWlzZXJmc19tb3VudF9vcHRpb25zIHsKIC8qIE1vdW50IG9wdGlvbnMgKi8KLSAgICBSRUlTRVJGU19MQVJHRVRBSUwsICAvKiBsYXJnZSB0YWlscyB3aWxsIGJlIGNyZWF0ZWQgaW4gYSBzZXNzaW9uICovCi0gICAgUkVJU0VSRlNfU01BTExUQUlMLCAgLyogc21hbGwgKGZvciBmaWxlcyBsZXNzIHRoYW4gYmxvY2sgc2l6ZSkgdGFpbHMgd2lsbCBiZSBjcmVhdGVkIGluIGEgc2Vzc2lvbiAqLwotICAgIFJFUExBWU9OTFksIC8qIHJlcGxheSBqb3VybmFsIGFuZCByZXR1cm4gMC4gVXNlIGJ5IGZzY2sgKi8KLSAgICBSRUlTRVJGU19DT05WRVJULCAgICAvKiAtbyBjb252OiBjYXVzZXMgY29udmVyc2lvbiBvZiBvbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBzdXBlciBibG9jayB0byB0aGUgbmV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuIElmIG5vdCBzcGVjaWZpZWQgLSBvbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbiB3aWxsIGJlIGRlYWx0IHdpdGggaW4gYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFubmVyIG9mIDMuNS54ICovCisJUkVJU0VSRlNfTEFSR0VUQUlMLAkvKiBsYXJnZSB0YWlscyB3aWxsIGJlIGNyZWF0ZWQgaW4gYSBzZXNzaW9uICovCisJUkVJU0VSRlNfU01BTExUQUlMLAkvKiBzbWFsbCAoZm9yIGZpbGVzIGxlc3MgdGhhbiBibG9jayBzaXplKSB0YWlscyB3aWxsIGJlIGNyZWF0ZWQgaW4gYSBzZXNzaW9uICovCisJUkVQTEFZT05MWSwJCS8qIHJlcGxheSBqb3VybmFsIGFuZCByZXR1cm4gMC4gVXNlIGJ5IGZzY2sgKi8KKwlSRUlTRVJGU19DT05WRVJULAkvKiAtbyBjb252OiBjYXVzZXMgY29udmVyc2lvbiBvZiBvbGQKKwkJCQkgICBmb3JtYXQgc3VwZXIgYmxvY2sgdG8gdGhlIG5ldworCQkJCSAgIGZvcm1hdC4gSWYgbm90IHNwZWNpZmllZCAtIG9sZAorCQkJCSAgIHBhcnRpdGlvbiB3aWxsIGJlIGRlYWx0IHdpdGggaW4gYQorCQkJCSAgIG1hbm5lciBvZiAzLjUueCAqLwogCiAvKiAtbyBoYXNoPXt0ZWEsIHJ1cGFzb3YsIHI1LCBkZXRlY3R9IGlzIG1lYW50IGZvciBwcm9wZXJseSBtb3VudGluZyAKICoqIHJlaXNlcmZzIGRpc2tzIGZyb20gMy41LjE5IG9yIGVhcmxpZXIuICA5OSUgb2YgdGhlIHRpbWUsIHRoaXMgb3B0aW9uCkBAIC00MzksMzkgKzQzNSw0MSBAQAogKiogdGhlIGV4aXN0aW5nIGhhc2ggb24gdGhlIEZTLCBzbyBpZiB5b3UgaGF2ZSBhIHRlYSBoYXNoIGRpc2ssIGFuZCBtb3VudAogKiogd2l0aCAtbyBoYXNoPXJ1cGFzb3YsIHRoZSBtb3VudCB3aWxsIGZhaWwuCiAqLwotICAgIEZPUkNFX1RFQV9IQVNILCAgICAgIC8qIHRyeSB0byBmb3JjZSB0ZWEgaGFzaCBvbiBtb3VudCAqLwotICAgIEZPUkNFX1JVUEFTT1ZfSEFTSCwgIC8qIHRyeSB0byBmb3JjZSBydXBhc292IGhhc2ggb24gbW91bnQgKi8KLSAgICBGT1JDRV9SNV9IQVNILCAgICAgICAvKiB0cnkgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIG9uIG1vdW50ICovCi0gICAgRk9SQ0VfSEFTSF9ERVRFQ1QsICAgLyogdHJ5IHRvIGRldGVjdCBoYXNoIGZ1bmN0aW9uIG9uIG1vdW50ICovCisJRk9SQ0VfVEVBX0hBU0gsCQkvKiB0cnkgdG8gZm9yY2UgdGVhIGhhc2ggb24gbW91bnQgKi8KKwlGT1JDRV9SVVBBU09WX0hBU0gsCS8qIHRyeSB0byBmb3JjZSBydXBhc292IGhhc2ggb24gbW91bnQgKi8KKwlGT1JDRV9SNV9IQVNILAkJLyogdHJ5IHRvIGZvcmNlIHJ1cGFzb3YgaGFzaCBvbiBtb3VudCAqLworCUZPUkNFX0hBU0hfREVURUNULAkvKiB0cnkgdG8gZGV0ZWN0IGhhc2ggZnVuY3Rpb24gb24gbW91bnQgKi8KIAotICAgIFJFSVNFUkZTX0RBVEFfTE9HLAotICAgIFJFSVNFUkZTX0RBVEFfT1JERVJFRCwKLSAgICBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSywKKwlSRUlTRVJGU19EQVRBX0xPRywKKwlSRUlTRVJGU19EQVRBX09SREVSRUQsCisJUkVJU0VSRlNfREFUQV9XUklURUJBQ0ssCiAKIC8qIHVzZWQgZm9yIHRlc3RpbmcgZXhwZXJpbWVudGFsIGZlYXR1cmVzLCBtYWtlcyBiZW5jaG1hcmtpbmcgbmV3CiAgICBmZWF0dXJlcyB3aXRoIGFuZCB3aXRob3V0IG1vcmUgY29udmVuaWVudCwgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYnkKICAgIHVzZXJzIGluIGFueSBjb2RlIHNoaXBwZWQgdG8gdXNlcnMgKGlkZWFsbHkpICovCiAKLSAgICBSRUlTRVJGU19OT19CT1JERVIsCi0gICAgUkVJU0VSRlNfTk9fVU5IQVNIRURfUkVMT0NBVElPTiwKLSAgICBSRUlTRVJGU19IQVNIRURfUkVMT0NBVElPTiwKLSAgICBSRUlTRVJGU19BVFRSUywKLSAgICBSRUlTRVJGU19YQVRUUlMsCi0gICAgUkVJU0VSRlNfWEFUVFJTX1VTRVIsCi0gICAgUkVJU0VSRlNfUE9TSVhBQ0wsCi0gICAgUkVJU0VSRlNfQkFSUklFUl9OT05FLAotICAgIFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gsCisJUkVJU0VSRlNfTk9fQk9SREVSLAorCVJFSVNFUkZTX05PX1VOSEFTSEVEX1JFTE9DQVRJT04sCisJUkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT04sCisJUkVJU0VSRlNfQVRUUlMsCisJUkVJU0VSRlNfWEFUVFJTLAorCVJFSVNFUkZTX1hBVFRSU19VU0VSLAorCVJFSVNFUkZTX1BPU0lYQUNMLAorCVJFSVNFUkZTX0JBUlJJRVJfTk9ORSwKKwlSRUlTRVJGU19CQVJSSUVSX0ZMVVNILAogCi0gICAgLyogQWN0aW9ucyBvbiBlcnJvciAqLwotICAgIFJFSVNFUkZTX0VSUk9SX1BBTklDLAotICAgIFJFSVNFUkZTX0VSUk9SX1JPLAotICAgIFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFLAorCS8qIEFjdGlvbnMgb24gZXJyb3IgKi8KKwlSRUlTRVJGU19FUlJPUl9QQU5JQywKKwlSRUlTRVJGU19FUlJPUl9STywKKwlSRUlTRVJGU19FUlJPUl9DT05USU5VRSwKIAotICAgIFJFSVNFUkZTX1RFU1QxLAotICAgIFJFSVNFUkZTX1RFU1QyLAotICAgIFJFSVNFUkZTX1RFU1QzLAotICAgIFJFSVNFUkZTX1RFU1Q0LAotICAgIFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCwKKwlSRUlTRVJGU19RVU9UQSwJCS8qIFNvbWUgcXVvdGEgb3B0aW9uIHNwZWNpZmllZCAqLworCisJUkVJU0VSRlNfVEVTVDEsCisJUkVJU0VSRlNfVEVTVDIsCisJUkVJU0VSRlNfVEVTVDMsCisJUkVJU0VSRlNfVEVTVDQsCisJUkVJU0VSRlNfVU5TVVBQT1JURURfT1BULAogfTsKIAogI2RlZmluZSByZWlzZXJmc19yNV9oYXNoKHMpIChSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJiAoMSA8PCBGT1JDRV9SNV9IQVNIKSkKQEAgLTUwMiwxOCArNTAwLDE3IEBACiAjZGVmaW5lIHJlaXNlcmZzX2Vycm9yX3BhbmljKHMpIChSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJiAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQykpCiAjZGVmaW5lIHJlaXNlcmZzX2Vycm9yX3JvKHMpIChSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJiAoMSA8PCBSRUlTRVJGU19FUlJPUl9STykpCiAKLXZvaWQgcmVpc2VyZnNfZmlsZV9idWZmZXIgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgbGlzdCk7Cit2b2lkIHJlaXNlcmZzX2ZpbGVfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBsaXN0KTsKIGV4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSByZWlzZXJmc19mc190eXBlOwotaW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZykgOworaW50IHJlaXNlcmZzX3Jlc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiAKICNkZWZpbmUgQ0FSUllfT04gICAgICAgICAgICAgICAgMAogI2RlZmluZSBTQ0hFRFVMRV9PQ0NVUlJFRCAgICAgICAxCiAKLQogI2RlZmluZSBTQl9CVUZGRVJfV0lUSF9TQihzKSAoUkVJU0VSRlNfU0IocyktPnNfc2JoKQogI2RlZmluZSBTQl9KT1VSTkFMKHMpIChSRUlTRVJGU19TQihzKS0+c19qb3VybmFsKQogI2RlZmluZSBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhzKSAoU0JfSk9VUk5BTChzKS0+al8xc3RfcmVzZXJ2ZWRfYmxvY2spCi0jZGVmaW5lIFNCX0pPVVJOQUxfTEVOX0ZSRUUocykgKFNCX0pPVVJOQUwocyktPmpfam91cm5hbF9sZW5fZnJlZSkgCisjZGVmaW5lIFNCX0pPVVJOQUxfTEVOX0ZSRUUocykgKFNCX0pPVVJOQUwocyktPmpfam91cm5hbF9sZW5fZnJlZSkKICNkZWZpbmUgU0JfQVBfQklUTUFQKHMpIChSRUlTRVJGU19TQihzKS0+c19hcF9iaXRtYXApCiAKICNkZWZpbmUgU0JfRElTS19KT1VSTkFMX0hFQUQocykgKFNCX0pPVVJOQUwocyktPmpfaGVhZGVyX2JoLT4pCkBAIC01MjMsMTMgKzUyMCwxNCBAQAogICovCiBzdGF0aWMgaW5saW5lIGNoYXIgKnJlaXNlcmZzX2JkZXZuYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKLSAgICAgICAgcmV0dXJuIChzID09IE5VTEwpID8gIk51bGwgc3VwZXJibG9jayIgOiBzIC0+IHNfaWQ7CisJcmV0dXJuIChzID09IE5VTEwpID8gIk51bGwgc3VwZXJibG9jayIgOiBzLT5zX2lkOwogfQogCiAjZGVmaW5lIHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSAodW5saWtlbHkgKF9fcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkpCi1zdGF0aWMgaW5saW5lIGludCBfX3JlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwpCitzdGF0aWMgaW5saW5lIGludCBfX3JlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbAorCQkJCQkJKmpvdXJuYWwpCiB7Ci0gICAgcmV0dXJuIHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKTsKKwlyZXR1cm4gdGVzdF9iaXQoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSk7CiB9CiAKLSNlbmRpZgkvKiBfTElOVVhfUkVJU0VSX0ZTX1NCICovCisjZW5kaWYJCQkJLyogX0xJTlVYX1JFSVNFUl9GU19TQiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oIGIvaW5jbHVkZS9saW51eC9yZWlzZXJmc194YXR0ci5oCmluZGV4IDkyNDRjNTcuLmM4NDM1NGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVpc2VyZnNfeGF0dHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlaXNlcmZzX3hhdHRyLmgKQEAgLTcsNDggKzcsNDggQEAKICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogCiAvKiBNYWdpYyB2YWx1ZSBpbiBoZWFkZXIgKi8KLSNkZWZpbmUgUkVJU0VSRlNfWEFUVFJfTUFHSUMgMHg1MjQ2NTg0MSAvKiAiUkZYQSIgKi8KKyNkZWZpbmUgUkVJU0VSRlNfWEFUVFJfTUFHSUMgMHg1MjQ2NTg0MQkvKiAiUkZYQSIgKi8KIAogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlciB7Ci0gICAgX19sZTMyIGhfbWFnaWM7ICAgICAgICAgICAgICAvKiBtYWdpYyBudW1iZXIgZm9yIGlkZW50aWZpY2F0aW9uICovCi0gICAgX19sZTMyIGhfaGFzaDsgICAgICAgICAgICAgICAvKiBoYXNoIG9mIHRoZSB2YWx1ZSAqLworCV9fbGUzMiBoX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLworCV9fbGUzMiBoX2hhc2g7CQkvKiBoYXNoIG9mIHRoZSB2YWx1ZSAqLwogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KIAogc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgewogCWNoYXIgKnByZWZpeDsKLSAgICAgICAgaW50ICgqaW5pdCkodm9pZCk7Ci0gICAgICAgIHZvaWQgKCpleGl0KSh2b2lkKTsKLQlpbnQgKCpnZXQpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKLQkJICAgc2l6ZV90IHNpemUpOwotCWludCAoKnNldCkoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAotCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLQlpbnQgKCpkZWwpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpOwotICAgICAgICBpbnQgKCpsaXN0KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KTsKLSAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBoYW5kbGVyczsKKwlpbnQgKCppbml0KSAodm9pZCk7CisJdm9pZCAoKmV4aXQpICh2b2lkKTsKKwlpbnQgKCpnZXQpIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLAorCQkgICAgc2l6ZV90IHNpemUpOworCWludCAoKnNldCkgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisJCSAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKKwlpbnQgKCpkZWwpIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSk7CisJaW50ICgqbGlzdCkgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJICAgICBjaGFyICpvdXQpOworCXN0cnVjdCBsaXN0X2hlYWQgaGFuZGxlcnM7CiB9OwogCi0KICNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIKICNkZWZpbmUgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpIElTX1BSSVZBVEUoaW5vZGUpCiAjZGVmaW5lIGhhc194YXR0cl9kaXIoaW5vZGUpIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfaGFzX3hhdHRyX2RpcikKLXNzaXplX3QgcmVpc2VyZnNfZ2V0eGF0dHIgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IHJlaXNlcmZzX3NldHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLXNzaXplX3QgcmVpc2VyZnNfbGlzdHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IHJlaXNlcmZzX3JlbW92ZXhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOwotaW50IHJlaXNlcmZzX2RlbGV0ZV94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwotaW50IHJlaXNlcmZzX2Nob3duX3hhdHRycyAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRycyk7Ci1pbnQgcmVpc2VyZnNfeGF0dHJfaW5pdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vdW50X2ZsYWdzKTsKLWludCByZWlzZXJmc19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwotaW50IHJlaXNlcmZzX3Blcm1pc3Npb25fbG9ja2VkIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3NpemVfdCByZWlzZXJmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworaW50IHJlaXNlcmZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworc3NpemVfdCByZWlzZXJmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2ludCByZWlzZXJmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHJlaXNlcmZzX2RlbGV0ZV94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgcmVpc2VyZnNfY2hvd25feGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cnMpOworaW50IHJlaXNlcmZzX3hhdHRyX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vdW50X2ZsYWdzKTsKK2ludCByZWlzZXJmc19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitpbnQgcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssCisJCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogCi1pbnQgcmVpc2VyZnNfeGF0dHJfZGVsIChzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqKTsKLWludCByZWlzZXJmc194YXR0cl9nZXQgKGNvbnN0IHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKLWludCByZWlzZXJmc194YXR0cl9zZXQgKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIGludCk7CitpbnQgcmVpc2VyZnNfeGF0dHJfZGVsKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICopOworaW50IHJlaXNlcmZzX3hhdHRyX2dldChjb25zdCBzdHJ1Y3QgaW5vZGUgKiwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CitpbnQgcmVpc2VyZnNfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBpbnQpOwogCiBleHRlcm4gc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdXNlcl9oYW5kbGVyOwogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHRydXN0ZWRfaGFuZGxlcjsKQEAgLTU2LDU3ICs1Niw0OCBAQAogZXh0ZXJuIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyIHNlY3VyaXR5X2hhbmRsZXI7CiAjZW5kaWYKIAotaW50IHJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzICh2b2lkKSBfX2luaXQ7Ci12b2lkIHJlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKHZvaWQpOworaW50IHJlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzKHZvaWQpIF9faW5pdDsKK3ZvaWQgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyh2b2lkKTsKIAotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgZG93bl93cml0ZSAoJlJFSVNFUkZTX1hBVFRSX0RJUl9TRU0oc2IpKTsKKwlkb3duX3dyaXRlKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgdXBfd3JpdGUgKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CisJdXBfd3JpdGUoJlJFSVNFUkZTX1hBVFRSX0RJUl9TRU0oc2IpKTsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3JlYWRfbG9ja194YXR0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLSAgICBkb3duX3JlYWQgKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CisJZG93bl9yZWFkKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0gICAgdXBfcmVhZCAoJlJFSVNFUkZTX1hBVFRSX0RJUl9TRU0oc2IpKTsKKwl1cF9yZWFkKCZSRUlTRVJGU19YQVRUUl9ESVJfU0VNKHNiKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgZG93bl93cml0ZSAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWRvd25fd3JpdGUoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQotc3RhdGljIGlubGluZSB2b2lkCi1yZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgdXBfd3JpdGUgKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwl1cF93cml0ZSgmUkVJU0VSRlNfSShpbm9kZSktPnhhdHRyX3NlbSk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3JlYWRfbG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2koc3RydWN0IGlub2RlICppbm9kZSkKIHsKLSAgICBkb3duX3JlYWQgKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlkb3duX3JlYWQoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2koc3RydWN0IGlub2RlICppbm9kZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgdXBfcmVhZCAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCXVwX3JlYWQoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIGlubGluZSB2b2lkIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfUFJJVkFURTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX1BSSVZBVEU7CiB9CiAKICNlbHNlCkBAIC0xMjcsMTMgKzExOCwyMCBAQAogI2RlZmluZSByZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycygpIDAKICNkZWZpbmUgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycygpCiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2RlbGV0ZV94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsgcmV0dXJuIDA7IH07Ci1zdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19jaG93bl94YXR0cnMgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cnMpIHsgcmV0dXJuIDA7IH07Ci1zdGF0aWMgaW5saW5lIGludCByZWlzZXJmc194YXR0cl9pbml0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW91bnRfZmxhZ3MpCitzdGF0aWMgaW5saW5lIGludCByZWlzZXJmc19kZWxldGVfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0gICAgc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpOyAvKiB0byBiZSBzdXJlICovCi0gICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfY2hvd25feGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXN0cnVjdCBpYXR0ciAqYXR0cnMpCit7CisJcmV0dXJuIDA7Cit9Oworc3RhdGljIGlubGluZSBpbnQgcmVpc2VyZnNfeGF0dHJfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW91bnRfZmxhZ3MpCit7CisJc2ItPnNfZmxhZ3MgPSAoc2ItPnNfZmxhZ3MgJiB+TVNfUE9TSVhBQ0wpOwkvKiB0byBiZSBzdXJlICovCisJcmV0dXJuIDA7CiB9OwogI2VuZGlmCiAKLSNlbmRpZiAgLyogX19LRVJORUxfXyAqLworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggMTFiNDg0ZS4uZTgwZmI3ZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcm1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcm1hcC5oCkBAIC05Myw2ICs5MywxMiBAQAogaW50IHRyeV90b191bm1hcChzdHJ1Y3QgcGFnZSAqKTsKIAogLyoKKyAqIENhbGxlZCBmcm9tIG1tL2ZpbGVtYXBfeGlwLmMgdG8gdW5tYXAgZW1wdHkgemVybyBwYWdlCisgKi8KK3B0ZV90ICpwYWdlX2NoZWNrX2FkZHJlc3Moc3RydWN0IHBhZ2UgKiwgc3RydWN0IG1tX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nKTsKKworCisvKgogICogVXNlZCBieSBzd2Fwb2ZmIHRvIGhlbHAgbG9jYXRlIHdoZXJlIHBhZ2UgaXMgZXhwZWN0ZWQgaW4gdm1hLgogICovCiB1bnNpZ25lZCBsb25nIHBhZ2VfYWRkcmVzc19pbl92bWEoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggZTY4ZGJmMC4uNjU3YzA1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC0zNjMsNiArMzYzLDggQEAKIHN0cnVjdCBydGFfc2Vzc2lvbgogewogCV9fdTgJcHJvdG87CisJX191OAlwYWQxOworCV9fdTE2CXBhZDI7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC02MzUsMTAgKzYzNywxMyBAQAogc3RydWN0IHByZWZpeG1zZwogewogCXVuc2lnbmVkIGNoYXIJcHJlZml4X2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyCXByZWZpeF9wYWQxOworCXVuc2lnbmVkIHNob3J0CXByZWZpeF9wYWQyOwogCWludAkJcHJlZml4X2lmaW5kZXg7CiAJdW5zaWduZWQgY2hhcglwcmVmaXhfdHlwZTsKIAl1bnNpZ25lZCBjaGFyCXByZWZpeF9sZW47CiAJdW5zaWduZWQgY2hhcglwcmVmaXhfZmxhZ3M7CisJdW5zaWduZWQgY2hhcglwcmVmaXhfcGFkMzsKIH07CiAKIGVudW0gCkBAIC04OTIsMTAgKzg5NywxNSBAQAogCQkgZ290byBydGF0dHJfZmFpbHVyZTsgXAogICAgCV9fcnRhX2ZpbGwoc2tiLCBhdHRydHlwZSwgYXR0cmxlbiwgZGF0YSk7IH0pIAogCi0jZGVmaW5lIFJUQV9QVVRfTk9IRFIoc2tiLCBhdHRybGVuLCBkYXRhKSBcCisjZGVmaW5lIFJUQV9BUFBFTkQoc2tiLCBhdHRybGVuLCBkYXRhKSBcCiAoewlpZiAodW5saWtlbHkoc2tiX3RhaWxyb29tKHNrYikgPCAoaW50KShhdHRybGVuKSkpIFwKIAkJZ290byBydGF0dHJfZmFpbHVyZTsgXAotCW1lbWNweShza2JfcHV0KHNrYiwgUlRBX0FMSUdOKGF0dHJsZW4pKSwgZGF0YSwgYXR0cmxlbik7IH0pCisJbWVtY3B5KHNrYl9wdXQoc2tiLCBhdHRybGVuKSwgZGF0YSwgYXR0cmxlbik7IH0pCisKKyNkZWZpbmUgUlRBX1BVVF9OT0hEUihza2IsIGF0dHJsZW4sIGRhdGEpIFwKKyh7CVJUQV9BUFBFTkQoc2tiLCBSVEFfQUxJR04oYXR0cmxlbiksIGRhdGEpOyBcCisJbWVtc2V0KHNrYi0+dGFpbCAtIChSVEFfQUxJR04oYXR0cmxlbikgLSBhdHRybGVuKSwgMCwgXAorCSAgICAgICBSVEFfQUxJR04oYXR0cmxlbikgLSBhdHRybGVuKTsgfSkKIAogI2RlZmluZSBSVEFfUFVUX1U4KHNrYiwgYXR0cnR5cGUsIHZhbHVlKSBcCiAoewl1OCBfdG1wID0gKHZhbHVlKTsgXApAQCAtOTc1LDYgKzk4NSw3IEBACiAJcnRhID0gKHN0cnVjdCBydGF0dHIqKXNrYl9wdXQoc2tiLCBSVEFfQUxJR04oc2l6ZSkpOwogCXJ0YS0+cnRhX3R5cGUgPSBhdHRydHlwZTsKIAlydGEtPnJ0YV9sZW4gPSBzaXplOworCW1lbXNldChSVEFfREFUQShydGEpICsgYXR0cmxlbiwgMCwgUlRBX0FMSUdOKHNpemUpIC0gc2l6ZSk7CiAJcmV0dXJuIHJ0YTsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDkwMTc0MmYuLmRlYzU4MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTM2OCw2ICszNjgsMTEgQEAKICNlbmRpZgogfTsKIAorLyogQ29udGV4dCBzd2l0Y2ggbXVzdCBiZSB1bmxvY2tlZCBpZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBlbmFibGVkICovCisjaWZkZWYgX19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVworIyBkZWZpbmUgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKKyNlbmRpZgorCiAvKgogICogQml0cyBpbiBmbGFncyBmaWVsZCBvZiBzaWduYWxfc3RydWN0LgogICovCkBAIC00MDUsNiArNDEwLDEwIEBACiAJYXRvbWljX3QgcHJvY2Vzc2VzOwkvKiBIb3cgbWFueSBwcm9jZXNzZXMgZG9lcyB0aGlzIHVzZXIgaGF2ZT8gKi8KIAlhdG9taWNfdCBmaWxlczsJCS8qIEhvdyBtYW55IG9wZW4gZmlsZXMgZG9lcyB0aGlzIHVzZXIgaGF2ZT8gKi8KIAlhdG9taWNfdCBzaWdwZW5kaW5nOwkvKiBIb3cgbWFueSBwZW5kaW5nIHNpZ25hbHMgZG9lcyB0aGlzIHVzZXIgaGF2ZT8gKi8KKyNpZmRlZiBDT05GSUdfSU5PVElGWQorCWF0b21pY190IGlub3RpZnlfd2F0Y2hlczsgLyogSG93IG1hbnkgaW5vdGlmeSB3YXRjaGVzIGRvZXMgdGhpcyB1c2VyIGhhdmU/ICovCisJYXRvbWljX3QgaW5vdGlmeV9kZXZzOwkvKiBIb3cgbWFueSBpbm90aWZ5IGRldnMgZG9lcyB0aGlzIHVzZXIgaGF2ZSBvcGVuZWQ/ICovCisjZW5kaWYKIAkvKiBwcm90ZWN0ZWQgYnkgbXFfbG9jawkqLwogCXVuc2lnbmVkIGxvbmcgbXFfYnl0ZXM7CS8qIEhvdyBtYW55IGJ5dGVzIGNhbiBiZSBhbGxvY2F0ZWQgdG8gbXF1ZXVlPyAqLwogCXVuc2lnbmVkIGxvbmcgbG9ja2VkX3NobTsgLyogSG93IG1hbnkgcGFnZXMgb2YgbWxvY2tlZCBzaG0gPyAqLwpAQCAtNDYwLDEwICs0NjksMTEgQEAKICNkZWZpbmUgU0RfTE9BRF9CQUxBTkNFCQkxCS8qIERvIGxvYWQgYmFsYW5jaW5nIG9uIHRoaXMgZG9tYWluLiAqLwogI2RlZmluZSBTRF9CQUxBTkNFX05FV0lETEUJMgkvKiBCYWxhbmNlIHdoZW4gYWJvdXQgdG8gYmVjb21lIGlkbGUgKi8KICNkZWZpbmUgU0RfQkFMQU5DRV9FWEVDCQk0CS8qIEJhbGFuY2Ugb24gZXhlYyAqLwotI2RlZmluZSBTRF9XQUtFX0lETEUJCTgJLyogV2FrZSB0byBpZGxlIENQVSBvbiB0YXNrIHdha2V1cCAqLwotI2RlZmluZSBTRF9XQUtFX0FGRklORQkJMTYJLyogV2FrZSB0YXNrIHRvIHdha2luZyBDUFUgKi8KLSNkZWZpbmUgU0RfV0FLRV9CQUxBTkNFCQkzMgkvKiBQZXJmb3JtIGJhbGFuY2luZyBhdCB0YXNrIHdha2V1cCAqLwotI2RlZmluZSBTRF9TSEFSRV9DUFVQT1dFUgk2NAkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBjcHUgcG93ZXIgKi8KKyNkZWZpbmUgU0RfQkFMQU5DRV9GT1JLCQk4CS8qIEJhbGFuY2Ugb24gZm9yaywgY2xvbmUgKi8KKyNkZWZpbmUgU0RfV0FLRV9JRExFCQkxNgkvKiBXYWtlIHRvIGlkbGUgQ1BVIG9uIHRhc2sgd2FrZXVwICovCisjZGVmaW5lIFNEX1dBS0VfQUZGSU5FCQkzMgkvKiBXYWtlIHRhc2sgdG8gd2FraW5nIENQVSAqLworI2RlZmluZSBTRF9XQUtFX0JBTEFOQ0UJCTY0CS8qIFBlcmZvcm0gYmFsYW5jaW5nIGF0IHRhc2sgd2FrZXVwICovCisjZGVmaW5lIFNEX1NIQVJFX0NQVVBPV0VSCTEyOAkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBjcHUgcG93ZXIgKi8KIAogc3RydWN0IHNjaGVkX2dyb3VwIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKm5leHQ7CS8qIE11c3QgYmUgYSBjaXJjdWxhciBsaXN0ICovCkBAIC00ODgsNiArNDk4LDExIEBACiAJdW5zaWduZWQgbG9uZyBsb25nIGNhY2hlX2hvdF90aW1lOyAvKiBUYXNrIGNvbnNpZGVyZWQgY2FjaGUgaG90IChucykgKi8KIAl1bnNpZ25lZCBpbnQgY2FjaGVfbmljZV90cmllczsJLyogTGVhdmUgY2FjaGUgaG90IHRhc2tzIGZvciAjIHRyaWVzICovCiAJdW5zaWduZWQgaW50IHBlcl9jcHVfZ2FpbjsJLyogQ1BVICUgZ2FpbmVkIGJ5IGFkZGluZyBkb21haW4gY3B1cyAqLworCXVuc2lnbmVkIGludCBidXN5X2lkeDsKKwl1bnNpZ25lZCBpbnQgaWRsZV9pZHg7CisJdW5zaWduZWQgaW50IG5ld2lkbGVfaWR4OworCXVuc2lnbmVkIGludCB3YWtlX2lkeDsKKwl1bnNpZ25lZCBpbnQgZm9ya2V4ZWNfaWR4OwogCWludCBmbGFnczsJCQkvKiBTZWUgU0RfKiAqLwogCiAJLyogUnVudGltZSBmaWVsZHMuICovCkBAIC01MTEsMTAgKzUyNiwxNiBAQAogCXVuc2lnbmVkIGxvbmcgYWxiX2ZhaWxlZDsKIAl1bnNpZ25lZCBsb25nIGFsYl9wdXNoZWQ7CiAKLQkvKiBzY2hlZF9iYWxhbmNlX2V4ZWMoKSBzdGF0cyAqLwotCXVuc2lnbmVkIGxvbmcgc2JlX2F0dGVtcHRzOworCS8qIFNEX0JBTEFOQ0VfRVhFQyBzdGF0cyAqLworCXVuc2lnbmVkIGxvbmcgc2JlX2NudDsKKwl1bnNpZ25lZCBsb25nIHNiZV9iYWxhbmNlZDsKIAl1bnNpZ25lZCBsb25nIHNiZV9wdXNoZWQ7CiAKKwkvKiBTRF9CQUxBTkNFX0ZPUksgc3RhdHMgKi8KKwl1bnNpZ25lZCBsb25nIHNiZl9jbnQ7CisJdW5zaWduZWQgbG9uZyBzYmZfYmFsYW5jZWQ7CisJdW5zaWduZWQgbG9uZyBzYmZfcHVzaGVkOworCiAJLyogdHJ5X3RvX3dha2VfdXAoKSBzdGF0cyAqLwogCXVuc2lnbmVkIGxvbmcgdHR3dV93YWtlX3JlbW90ZTsKIAl1bnNpZ25lZCBsb25nIHR0d3VfbW92ZV9hZmZpbmU7CkBAIC01MjIsNiArNTQzLDggQEAKICNlbmRpZgogfTsKIAorZXh0ZXJuIHZvaWQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICpwYXJ0aXRpb24xLAorCQkJCSAgICBjcHVtYXNrX3QgKnBhcnRpdGlvbjIpOwogI2lmZGVmIEFSQ0hfSEFTX1NDSEVEX0RPTUFJTgogLyogVXNlZnVsIGhlbHBlcnMgdGhhdCBhcmNoIHNldHVwIGNvZGUgbWF5IHVzZS4gRGVmaW5lZCBpbiBrZXJuZWwvc2NoZWQuYyAqLwogZXh0ZXJuIGNwdW1hc2tfdCBjcHVfaXNvbGF0ZWRfbWFwOwpAQCAtNTYxLDkgKzU4NCwxMCBAQAogCQlncm91cHNfZnJlZShncm91cF9pbmZvKTsgXAogfSB3aGlsZSAoMCkKIAotc3RydWN0IGdyb3VwX2luZm8gKmdyb3Vwc19hbGxvYyhpbnQgZ2lkc2V0c2l6ZSk7Ci12b2lkIGdyb3Vwc19mcmVlKHN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvKTsKLWludCBzZXRfY3VycmVudF9ncm91cHMoc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm8pOworZXh0ZXJuIHN0cnVjdCBncm91cF9pbmZvICpncm91cHNfYWxsb2MoaW50IGdpZHNldHNpemUpOworZXh0ZXJuIHZvaWQgZ3JvdXBzX2ZyZWUoc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm8pOworZXh0ZXJuIGludCBzZXRfY3VycmVudF9ncm91cHMoc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm8pOworZXh0ZXJuIGludCBncm91cHNfc2VhcmNoKHN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvLCBnaWRfdCBncnApOwogLyogYWNjZXNzIHRoZSBncm91cHMgImFycmF5IiB3aXRoIHRoaXMgbWFjcm8gKi8KICNkZWZpbmUgR1JPVVBfQVQoZ2ksIGkpIFwKICAgICAoKGdpKS0+YmxvY2tzWyhpKS9OR1JPVVBTX1BFUl9CTE9DS11bKGkpJU5HUk9VUFNfUEVSX0JMT0NLXSkKQEAgLTU4MSwxMCArNjA1LDE1IEBACiAKIAlpbnQgbG9ja19kZXB0aDsJCS8qIEJLTCBsb2NrIGRlcHRoICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cpCisJaW50IG9uY3B1OworI2VuZGlmCiAJaW50IHByaW8sIHN0YXRpY19wcmlvOwogCXN0cnVjdCBsaXN0X2hlYWQgcnVuX2xpc3Q7CiAJcHJpb19hcnJheV90ICphcnJheTsKIAorCXVuc2lnbmVkIHNob3J0IGlvcHJpbzsKKwogCXVuc2lnbmVkIGxvbmcgc2xlZXBfYXZnOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIGxhc3RfcmFuOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF90aW1lOyAvKiBzY2hlZF9jbG9jayB0aW1lIHNwZW50IHJ1bm5pbmcgKi8KQEAgLTY2MCw2ICs2ODksNyBAQAogCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKICNpZmRlZiBDT05GSUdfS0VZUwogCXN0cnVjdCBrZXkgKnRocmVhZF9rZXlyaW5nOwkvKiBrZXlyaW5nIHByaXZhdGUgdG8gdGhpcyB0aHJlYWQgKi8KKwl1bnNpZ25lZCBjaGFyIGppdF9rZXlyaW5nOwkvKiBkZWZhdWx0IGtleXJpbmcgdG8gYXR0YWNoIHJlcXVlc3RlZCBrZXlzIHRvICovCiAjZW5kaWYKIAlpbnQgb29ta2lsbGFkajsgLyogT09NIGtpbGwgc2NvcmUgYWRqdXN0bWVudCAoYml0IHNoaWZ0KS4gKi8KIAljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07IC8qIGV4ZWN1dGFibGUgbmFtZSBleGNsdWRpbmcgcGF0aApAQCAtNzAyLDggKzczMiw2IEBACiAJc3BpbmxvY2tfdCBhbGxvY19sb2NrOwogLyogUHJvdGVjdGlvbiBvZiBwcm9jX2RlbnRyeTogbmVzdGluZyBwcm9jX2xvY2ssIGRjYWNoZV9sb2NrLCB3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7ICovCiAJc3BpbmxvY2tfdCBwcm9jX2xvY2s7Ci0vKiBjb250ZXh0LXN3aXRjaCBsb2NrICovCi0Jc3BpbmxvY2tfdCBzd2l0Y2hfbG9jazsKIAogLyogam91cm5hbGxpbmcgZmlsZXN5c3RlbSBpbmZvICovCiAJdm9pZCAqam91cm5hbF9pbmZvOwpAQCAtNzQxLDYgKzc2OSw3IEBACiAJbm9kZW1hc2tfdCBtZW1zX2FsbG93ZWQ7CiAJaW50IGNwdXNldF9tZW1zX2dlbmVyYXRpb247CiAjZW5kaWYKKwlhdG9taWNfdCBmc19leGNsOwkvKiBob2xkaW5nIGZzIGV4Y2x1c2l2ZSByZXNvdXJjZXMgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgcGlkX3QgcHJvY2Vzc19ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKQEAgLTkxMCw3ICs5MzksNyBAQAogI2Vsc2UKICBzdGF0aWMgaW5saW5lIHZvaWQga2lja19wcm9jZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKSB7IH0KICNlbmRpZgotZXh0ZXJuIHZvaWQgRkFTVENBTEwoc2NoZWRfZm9yayh0YXNrX3QgKiBwKSk7CitleHRlcm4gdm9pZCBGQVNUQ0FMTChzY2hlZF9mb3JrKHRhc2tfdCAqIHAsIGludCBjbG9uZV9mbGFncykpOwogZXh0ZXJuIHZvaWQgRkFTVENBTEwoc2NoZWRfZXhpdCh0YXNrX3QgKiBwKSk7CiAKIGV4dGVybiBpbnQgaW5fZ3JvdXBfcChnaWRfdCk7CkBAIC0xMDkwLDcgKzExMTksOCBAQAogCiAvKgogICogUHJvdGVjdHMgLT5mcywgLT5maWxlcywgLT5tbSwgLT5wdHJhY2UsIC0+Z3JvdXBfaW5mbywgLT5jb21tLCBrZXlyaW5nCi0gKiBzdWJzY3JpcHRpb25zIGFuZCBzeW5jaHJvbmlzZXMgd2l0aCB3YWl0NCgpLiAgQWxzbyB1c2VkIGluIHByb2Nmcy4KKyAqIHN1YnNjcmlwdGlvbnMgYW5kIHN5bmNocm9uaXNlcyB3aXRoIHdhaXQ0KCkuICBBbHNvIHVzZWQgaW4gcHJvY2ZzLiAgQWxzbworICogcGlucyB0aGUgZmluYWwgcmVsZWFzZSBvZiB0YXNrLmlvX2NvbnRleHQuCiAgKgogICogTmVzdHMgYm90aCBpbnNpZGUgYW5kIG91dHNpZGUgb2YgcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKS4KICAqIEl0IG11c3Qgbm90IGJlIG5lc3RlZCB3aXRoIHdyaXRlX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKSwKQEAgLTEyNDMsMzMgKzEyNzMsNzggQEAKIAogI2VuZGlmCiAKLS8qIHRyeV90b19mcmVlemUKLSAqCi0gKiBDaGVja3Mgd2hldGhlciB3ZSBuZWVkIHRvIGVudGVyIHRoZSByZWZyaWdlcmF0b3IKLSAqIGFuZCByZXR1cm5zIDEgaWYgd2UgZGlkIHNvLgotICovCiAjaWZkZWYgQ09ORklHX1BNCi1leHRlcm4gdm9pZCByZWZyaWdlcmF0b3IodW5zaWduZWQgbG9uZyk7CisvKgorICogQ2hlY2sgaWYgYSBwcm9jZXNzIGhhcyBiZWVuIGZyb3plbgorICovCitzdGF0aWMgaW5saW5lIGludCBmcm96ZW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBwLT5mbGFncyAmIFBGX0ZST1pFTjsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGlzIGEgcmVxdWVzdCB0byBmcmVlemUgYSBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZyZWV6aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+ZmxhZ3MgJiBQRl9GUkVFWkU7Cit9CisKKy8qCisgKiBSZXF1ZXN0IHRoYXQgYSBwcm9jZXNzIGJlIGZyb3plbgorICogRklYTUU6IFNNUCBwcm9ibGVtLiBXZSBtYXkgbm90IG1vZGlmeSBvdGhlciBwcm9jZXNzJyBmbGFncyEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcC0+ZmxhZ3MgfD0gUEZfRlJFRVpFOworfQorCisvKgorICogV2FrZSB1cCBhIGZyb3plbiBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRoYXdfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaWYgKGZyb3plbihwKSkgeworCQlwLT5mbGFncyAmPSB+UEZfRlJPWkVOOworCQl3YWtlX3VwX3Byb2Nlc3MocCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGZyZWV6aW5nIGlzIGNvbXBsZXRlLCBtYXJrIHByb2Nlc3MgYXMgZnJvemVuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcm96ZW5fcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcC0+ZmxhZ3MgPSAocC0+ZmxhZ3MgJiB+UEZfRlJFRVpFKSB8IFBGX0ZST1pFTjsKK30KKworZXh0ZXJuIHZvaWQgcmVmcmlnZXJhdG9yKHZvaWQpOwogZXh0ZXJuIGludCBmcmVlemVfcHJvY2Vzc2VzKHZvaWQpOwogZXh0ZXJuIHZvaWQgdGhhd19wcm9jZXNzZXModm9pZCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlemUodW5zaWduZWQgbG9uZyByZWZyaWdlcmF0b3JfZmxhZ3MpCitzdGF0aWMgaW5saW5lIGludCB0cnlfdG9fZnJlZXplKHZvaWQpCiB7Ci0JaWYgKHVubGlrZWx5KGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSkgewotCQlyZWZyaWdlcmF0b3IocmVmcmlnZXJhdG9yX2ZsYWdzKTsKKwlpZiAoZnJlZXppbmcoY3VycmVudCkpIHsKKwkJcmVmcmlnZXJhdG9yKCk7CiAJCXJldHVybiAxOwogCX0gZWxzZQogCQlyZXR1cm4gMDsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVmcmlnZXJhdG9yKHVuc2lnbmVkIGxvbmcgZmxhZykge30KK3N0YXRpYyBpbmxpbmUgaW50IGZyb3plbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGZyZWV6aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIGZyZWV6ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgQlVHKCk7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRoYXdfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgcmV0dXJuIDE7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcm96ZW5fcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgQlVHKCk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHJlZnJpZ2VyYXRvcih2b2lkKSB7fQogc3RhdGljIGlubGluZSBpbnQgZnJlZXplX3Byb2Nlc3Nlcyh2b2lkKSB7IEJVRygpOyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRoYXdfcHJvY2Vzc2VzKHZvaWQpIHt9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHRyeV90b19mcmVlemUodW5zaWduZWQgbG9uZyByZWZyaWdlcmF0b3JfZmxhZ3MpCi17Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgaW5saW5lIGludCB0cnlfdG9fZnJlZXplKHZvaWQpIHsgcmV0dXJuIDA7IH0KKwogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWNjb21wLmggYi9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaAppbmRleCAzYTI3MDJiLi5kYzg5MTE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY2NvbXAuaApAQCAtMTksNiArMTksMTEgQEAKIAkJX19zZWN1cmVfY29tcHV0aW5nKHRoaXNfc3lzY2FsbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGhhc19zZWN1cmVfY29tcHV0aW5nKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCit7CisJcmV0dXJuIHVubGlrZWx5KHRlc3RfdGlfdGhyZWFkX2ZsYWcodGksIFRJRl9TRUNDT01QKSk7Cit9CisKICNlbHNlIC8qIENPTkZJR19TRUNDT01QICovCiAKICNpZiAoX19HTlVDX18gPiAyKQpAQCAtMjgsNiArMzMsMTEgQEAKICNlbmRpZgogCiAjZGVmaW5lIHNlY3VyZV9jb21wdXRpbmcoeCkgZG8geyB9IHdoaWxlICgwKQorLyogc3RhdGljIGlubGluZSB0byBwcmVzZXJ2ZSB0eXBlY2hlY2tpbmcgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhc19zZWN1cmVfY29tcHV0aW5nKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCit7CisJcmV0dXJuIDA7Cit9CiAKICNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKaW5kZXggODIzMTgxYS4uM2UzYzFmYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaApAQCAtMjIsNiArMjIsNyBAQAogCXVuc2lnbmVkIGludAl1YXJ0Y2xrOwkvKiBVQVJUIGNsb2NrIHJhdGUgKi8KIAl1bnNpZ25lZCBjaGFyCXJlZ3NoaWZ0OwkvKiByZWdpc3RlciBzaGlmdCAqLwogCXVuc2lnbmVkIGNoYXIJaW90eXBlOwkJLyogVVBJT18qICovCisJdW5zaWduZWQgY2hhcglodWI2OwogCXVuc2lnbmVkIGludAlmbGFnczsJCS8qIFVQRl8qIGZsYWdzICovCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlvLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlvLmgKaW5kZXggYTJkM2I5YS4uYWE0ZDY0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXJpby5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaW8uaApAQCAtODMsNiArODMsNyBAQAogfQogCiB2b2lkIHNlcmlvX3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKTsKK3ZvaWQgc2VyaW9fdW5yZWdpc3Rlcl9jaGlsZF9wb3J0KHN0cnVjdCBzZXJpbyAqc2VyaW8pOwogdm9pZCBfX3NlcmlvX3VucmVnaXN0ZXJfcG9ydF9kZWxheWVkKHN0cnVjdCBzZXJpbyAqc2VyaW8sIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXJpb191bnJlZ2lzdGVyX3BvcnRfZGVsYXllZChzdHJ1Y3Qgc2VyaW8gKnNlcmlvKQogewpAQCAtMTUzLDYgKzE1NCwxMSBAQAogCXJldHVybiBkb3duX2ludGVycnVwdGlibGUoJnNlcmlvLT5kcnZfc2VtKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNlcmlvX3Bpbl9kcml2ZXJfdW5pbnRlcnJ1cHRpYmxlKHN0cnVjdCBzZXJpbyAqc2VyaW8pCit7CisJZG93bigmc2VyaW8tPmRydl9zZW0pOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VyaW9fdW5waW5fZHJpdmVyKHN0cnVjdCBzZXJpbyAqc2VyaW8pCiB7CiAJdXAoJnNlcmlvLT5kcnZfc2VtKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IGQ3YzgzOWEuLjVkNGE5OTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdGV4dHNlYXJjaC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCiAjZGVmaW5lIEhBVkVfQUxMT0NfU0tCCQkvKiBGb3IgdGhlIGRyaXZlcnMgdG8ga25vdyAqLwpAQCAtMTgyLDcgKzE4Myw2IEBACiAgKglAcHJpb3JpdHk6IFBhY2tldCBxdWV1ZWluZyBwcmlvcml0eQogICoJQHVzZXJzOiBVc2VyIGNvdW50IC0gc2VlIHtkYXRhZ3JhbSx0Y3B9LmMKICAqCUBwcm90b2NvbDogUGFja2V0IHByb3RvY29sIGZyb20gZHJpdmVyCi0gKglAc2VjdXJpdHk6IFNlY3VyaXR5IGxldmVsIG9mIHBhY2tldAogICoJQHRydWVzaXplOiBCdWZmZXIgc2l6ZSAKICAqCUBoZWFkOiBIZWFkIG9mIGJ1ZmZlcgogICoJQGRhdGE6IERhdGEgaGVhZCBwb2ludGVyCkBAIC0yNDgsMTggKzI0OCwxOCBAQAogCQkJCWRhdGFfbGVuLAogCQkJCW1hY19sZW4sCiAJCQkJY3N1bTsKLQl1bnNpZ25lZCBjaGFyCQlsb2NhbF9kZiwKLQkJCQljbG9uZWQ6MSwKLQkJCQlub2hkcjoxLAotCQkJCXBrdF90eXBlLAotCQkJCWlwX3N1bW1lZDsKIAlfX3UzMgkJCXByaW9yaXR5OwotCXVuc2lnbmVkIHNob3J0CQlwcm90b2NvbCwKLQkJCQlzZWN1cml0eTsKKwlfX3U4CQkJbG9jYWxfZGY6MSwKKwkJCQljbG9uZWQ6MSwKKwkJCQlpcF9zdW1tZWQ6MiwKKwkJCQlub2hkcjoxOworCQkJCS8qIDMgYml0cyBzcGFyZSAqLworCV9fdTgJCQlwa3RfdHlwZTsKKwlfX3UxNgkJCXByb3RvY29sOwogCiAJdm9pZAkJCSgqZGVzdHJ1Y3Rvcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgotICAgICAgICB1bnNpZ25lZCBsb25nCQluZm1hcms7CisJdW5zaWduZWQgbG9uZwkJbmZtYXJrOwogCV9fdTMyCQkJbmZjYWNoZTsKIAlfX3UzMgkJCW5mY3RpbmZvOwogCXN0cnVjdCBuZl9jb25udHJhY2sJKm5mY3Q7CkBAIC0zMDAsMjAgKzMwMCwyNiBAQAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAogZXh0ZXJuIHZvaWQJICAgICAgIF9fa2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICphbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsIGludCBwcmlvcml0eSk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKmFsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiX2Zyb21fY2FjaGUoa21lbV9jYWNoZV90ICpjcCwKLQkJCQkJICAgIHVuc2lnbmVkIGludCBzaXplLCBpbnQgcHJpb3JpdHkpOworCQkJCQkgICAgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIHZvaWQJICAgICAgIGtmcmVlX3NrYm1lbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2Nsb25lKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmlvcml0eSk7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmlvcml0eSk7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnBza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwX21hc2spOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfY2xvbmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHkoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpwc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKTsKIGV4dGVybiBpbnQJICAgICAgIHBza2JfZXhwYW5kX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJaW50IG5oZWFkLCBpbnQgbnRhaWwsIGludCBnZnBfbWFzayk7CisJCQkJCWludCBuaGVhZCwgaW50IG50YWlsLAorCQkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfcmVhbGxvY19oZWFkcm9vbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICAgdW5zaWduZWQgaW50IGhlYWRyb29tKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2NvcHlfZXhwYW5kKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgIGludCBuZXdoZWFkcm9vbSwgaW50IG5ld3RhaWxyb29tLAotCQkJCSAgICAgICBpbnQgcHJpb3JpdHkpOworCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICoJCXNrYl9wYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhZCk7CiAjZGVmaW5lIGRldl9rZnJlZV9za2IoYSkJa2ZyZWVfc2tiKGEpCiBleHRlcm4gdm9pZAkgICAgICBza2Jfb3Zlcl9wYW5pYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuLApAQCAtMzIxLDYgKzMyNywyOCBAQAogZXh0ZXJuIHZvaWQJICAgICAgc2tiX3VuZGVyX3BhbmljKHN0cnVjdCBza19idWZmICpza2IsIGludCBsZW4sCiAJCQkJICAgICAgdm9pZCAqaGVyZSk7CiAKK3N0cnVjdCBza2Jfc2VxX3N0YXRlCit7CisJX191MzIJCWxvd2VyX29mZnNldDsKKwlfX3UzMgkJdXBwZXJfb2Zmc2V0OworCV9fdTMyCQlmcmFnX2lkeDsKKwlfX3UzMgkJc3RlcHBlZF9vZmZzZXQ7CisJc3RydWN0IHNrX2J1ZmYJKnJvb3Rfc2tiOworCXN0cnVjdCBza19idWZmCSpjdXJfc2tiOworCV9fdTgJCSpmcmFnX2RhdGE7Cit9OworCitleHRlcm4gdm9pZAkgICAgICBza2JfcHJlcGFyZV9zZXFfcmVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IHRvLAorCQkJCQkgICBzdHJ1Y3Qgc2tiX3NlcV9zdGF0ZSAqc3QpOworZXh0ZXJuIHVuc2lnbmVkIGludCAgIHNrYl9zZXFfcmVhZCh1bnNpZ25lZCBpbnQgY29uc3VtZWQsIGNvbnN0IHU4ICoqZGF0YSwKKwkJCQkgICBzdHJ1Y3Qgc2tiX3NlcV9zdGF0ZSAqc3QpOworZXh0ZXJuIHZvaWQJICAgICAgc2tiX2Fib3J0X3NlcV9yZWFkKHN0cnVjdCBza2Jfc2VxX3N0YXRlICpzdCk7CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgICBza2JfZmluZF90ZXh0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBmcm9tLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdG8sIHN0cnVjdCB0c19jb25maWcgKmNvbmZpZywKKwkJCQkgICAgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSk7CisKIC8qIEludGVybmFsICovCiAjZGVmaW5lIHNrYl9zaGluZm8oU0tCKQkJKChzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICopKChTS0IpLT5lbmQpKQogCkBAIC00NDIsNyArNDcwLDggQEAKICAqCiAgKglOVUxMIGlzIHJldHVybmVkIG9uIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3NoYXJlX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcmkpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza2Jfc2hhcmVfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaSkKIHsKIAltaWdodF9zbGVlcF9pZihwcmkgJiBfX0dGUF9XQUlUKTsKIAlpZiAoc2tiX3NoYXJlZChza2IpKSB7CkBAIC05NzksNyArMTAwOCw3IEBACiAgKgklTlVMTCBpcyByZXR1cm5lZCBpbiB0aGVyZSBpcyBubyBmcmVlIG1lbW9yeS4KICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqX19kZXZfYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBsZW5ndGgsCi0JCQkJCSAgICAgIGludCBnZnBfbWFzaykKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBhbGxvY19za2IobGVuZ3RoICsgMTYsIGdmcF9tYXNrKTsKIAlpZiAobGlrZWx5KHNrYikpCkBAIC0xMDkyLDggKzExMjEsOCBAQAogICoJSWYgdGhlcmUgaXMgbm8gZnJlZSBtZW1vcnkgLUVOT01FTSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHplcm8KICAqCWlzIHJldHVybmVkIGFuZCB0aGUgb2xkIHNrYiBkYXRhIHJlbGVhc2VkLgogICovCi1leHRlcm4gaW50IF9fc2tiX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ2ZwKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNrYl9saW5lYXJpemUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcCkKK2V4dGVybiBpbnQgX19za2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOworc3RhdGljIGlubGluZSBpbnQgc2tiX2xpbmVhcml6ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXJldHVybiBfX3NrYl9saW5lYXJpemUoc2tiLCBnZnApOwogfQpAQCAtMTE4OCw3ICsxMjE3LDcgQEAKIHsKIAlpbnQgaGxlbiA9IHNrYl9oZWFkbGVuKHNrYik7CiAKLQlpZiAob2Zmc2V0ICsgbGVuIDw9IGhsZW4pCisJaWYgKGhsZW4gLSBvZmZzZXQgPj0gbGVuKQogCQlyZXR1cm4gc2tiLT5kYXRhICsgb2Zmc2V0OwogCiAJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCBvZmZzZXQsIGJ1ZmZlciwgbGVuKSA8IDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IDc2Y2Y3ZTYuLjRjOGU1NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC02NSw3ICs2NSw3IEBACiBleHRlcm4gdm9pZCBrbWVtX2NhY2hlX2ZyZWUoa21lbV9jYWNoZV90ICosIHZvaWQgKik7CiBleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVfc2l6ZShrbWVtX2NhY2hlX3QgKik7CiBleHRlcm4gY29uc3QgY2hhciAqa21lbV9jYWNoZV9uYW1lKGttZW1fY2FjaGVfdCAqKTsKLWV4dGVybiBrbWVtX2NhY2hlX3QgKmttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplX3Qgc2l6ZSwgaW50IGdmcGZsYWdzKTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKmttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKTsKIAogLyogU2l6ZSBkZXNjcmlwdGlvbiBzdHJ1Y3QgZm9yIGdlbmVyYWwgY2FjaGVzLiAqLwogc3RydWN0IGNhY2hlX3NpemVzIHsKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAjaWZkZWYgQ09ORklHX05VTUEKIGV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jX25vZGUoa21lbV9jYWNoZV90ICosIGludCBmbGFncywgaW50IG5vZGUpOwotZXh0ZXJuIHZvaWQgKmttYWxsb2Nfbm9kZShzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBpbnQgbm9kZSk7CitleHRlcm4gdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MsIGludCBub2RlKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Nfbm9kZShrbWVtX2NhY2hlX3QgKmNhY2hlcCwgaW50IGZsYWdzLCBpbnQgbm9kZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCmluZGV4IDkzOTk0YzYuLmRhYjI2NTJhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdHJpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCkBAIC04OCw3ICs4OCw3IEBACiBleHRlcm4gdm9pZCAqIG1lbWNocihjb25zdCB2b2lkICosaW50LF9fa2VybmVsX3NpemVfdCk7CiAjZW5kaWYKIAotZXh0ZXJuIGNoYXIgKmtzdHJkdXAoY29uc3QgY2hhciAqcywgaW50IGdmcCk7CitleHRlcm4gY2hhciAqa3N0cmR1cChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaCBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCmluZGV4IDJiZjBkNWYuLmYyZTk2ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oCkBAIC01OCw3ICs1OCw3IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKKyNpZmRlZiBDT05GSUdfU1VTUEVORF9TTVAKIGV4dGVybiB2b2lkIGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX25vbmJvb3RfY3B1cyh2b2lkKTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDIzNDNmOTkuLjIzOWY1MjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC03LDYgKzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKwogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCkBAIC0xNDgsNyArMTUwLDcgQEAKICNkZWZpbmUgdm1fc3dhcF9mdWxsKCkgKG5yX3N3YXBfcGFnZXMqMiA8IHRvdGFsX3N3YXBfcGFnZXMpCiAKIC8qIGxpbnV4L21tL29vbV9raWxsLmMgKi8KLWV4dGVybiB2b2lkIG91dF9vZl9tZW1vcnkodW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKTsKK2V4dGVybiB2b2lkIG91dF9vZl9tZW1vcnkodW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrLCBpbnQgb3JkZXIpOwogCiAvKiBsaW51eC9tbS9tZW1vcnkuYyAqLwogZXh0ZXJuIHZvaWQgc3dhcGluX3JlYWRhaGVhZChzd3BfZW50cnlfdCwgdW5zaWduZWQgbG9uZywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCmluZGV4IGMzOWY2ZjcuLjQyNWY1OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKQEAgLTE1OSw4ICsxNTksOSBAQAogYXNtbGlua2FnZSBsb25nIHN5c19yZWJvb3QoaW50IG1hZ2ljMSwgaW50IG1hZ2ljMiwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQl2b2lkIF9fdXNlciAqYXJnKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcmVzdGFydF9zeXNjYWxsKHZvaWQpOwotYXNtbGlua2FnZSBsb25nIHN5c19rZXhlY19sb2FkKHZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAotCQkJc3RydWN0IGtleGVjX3NlZ21lbnQgKnNlZ21lbnRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfa2V4ZWNfbG9hZCh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAorCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZXhpdChpbnQgZXJyb3JfY29kZSk7CiBhc21saW5rYWdlIHZvaWQgc3lzX2V4aXRfZ3JvdXAoaW50IGVycm9yX2NvZGUpOwpAQCAtNTA1LDQgKzUwNiw3IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX2tleWN0bChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMywKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnNCwgdW5zaWduZWQgbG9uZyBhcmc1KTsKIAorYXNtbGlua2FnZSBsb25nIHN5c19pb3ByaW9fc2V0KGludCB3aGljaCwgaW50IHdobywgaW50IGlvcHJpbyk7Cithc21saW5rYWdlIGxvbmcgc3lzX2lvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCA2MTRlOTM5Li5jZTE5YTJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTYxLDcgKzYxLDggQEAKIAlDVExfREVWPTcsCQkvKiBEZXZpY2VzICovCiAJQ1RMX0JVUz04LAkJLyogQnVzc2VzICovCiAJQ1RMX0FCST05LAkJLyogQmluYXJ5IGVtdWxhdGlvbiAqLwotCUNUTF9DUFU9MTAJCS8qIENQVSBzdHVmZiAoc3BlZWQgc2NhbGluZywgZXRjKSAqLworCUNUTF9DUFU9MTAsCQkvKiBDUFUgc3R1ZmYgKHNwZWVkIHNjYWxpbmcsIGV0YykgKi8KKwlDVExfSU5PVElGWT0xMQkJLyogSW5vdGlmeSAqLwogfTsKIAogLyogQ1RMX0JVUyBuYW1lczogKi8KQEAgLTcwLDYgKzcxLDE0IEBACiAJQ1RMX0JVU19JU0E9MQkJLyogSVNBICovCiB9OwogCisvKiBDVExfSU5PVElGWSBuYW1lczogKi8KK2VudW0KK3sKKwlJTk9USUZZX01BWF9VU0VSX0RFVklDRVM9MSwJLyogbWF4IG51bWJlciBvZiBpbm90aWZ5IGRldmljZSBpbnN0YW5jZXMgcGVyIHVzZXIgKi8KKwlJTk9USUZZX01BWF9VU0VSX1dBVENIRVM9MiwJLyogbWF4IG51bWJlciBvZiBpbm90aWZ5IHdhdGNoZXMgcGVyIHVzZXIgKi8KKwlJTk9USUZZX01BWF9RVUVVRURfRVZFTlRTPTMJLyogTWF4IG51bWJlciBvZiBxdWV1ZWQgZXZlbnRzIHBlciBpbm90aWZ5IGRldmljZSBpbnN0YW5jZSAqLworfTsKKwogLyogQ1RMX0tFUk4gbmFtZXM6ICovCiBlbnVtCiB7CkBAIC0yNDMsNiArMjUyLDcgQEAKIAlORVRfQ09SRV9NT0RfQ09ORz0xNiwKIAlORVRfQ09SRV9ERVZfV0VJR0hUPTE3LAogCU5FVF9DT1JFX1NPTUFYQ09OTj0xOCwKKwlORVRfQ09SRV9CVURHRVQ9MTksCiB9OwogCiAvKiAvcHJvYy9zeXMvbmV0L2V0aGVybmV0ICovCkBAIC0zMzMsMjEgKzM0MywxNCBAQAogCU5FVF9UQ1BfRlJUTz05MiwKIAlORVRfVENQX0xPV19MQVRFTkNZPTkzLAogCU5FVF9JUFY0X0lQRlJBR19TRUNSRVRfSU5URVJWQUw9OTQsCi0JTkVUX1RDUF9XRVNUV09PRD05NSwKIAlORVRfSVBWNF9JR01QX01BWF9NU0Y9OTYsCiAJTkVUX1RDUF9OT19NRVRSSUNTX1NBVkU9OTcsCi0JTkVUX1RDUF9WRUdBUz05OCwKLQlORVRfVENQX1ZFR0FTX0FMUEhBPTk5LAotCU5FVF9UQ1BfVkVHQVNfQkVUQT0xMDAsCi0JTkVUX1RDUF9WRUdBU19HQU1NQT0xMDEsCi0gCU5FVF9UQ1BfQklDPTEwMiwKLSAJTkVUX1RDUF9CSUNfRkFTVF9DT05WRVJHRU5DRT0xMDMsCi0JTkVUX1RDUF9CSUNfTE9XX1dJTkRPVz0xMDQsCiAJTkVUX1RDUF9ERUZBVUxUX1dJTl9TQ0FMRT0xMDUsCiAJTkVUX1RDUF9NT0RFUkFURV9SQ1ZCVUY9MTA2LAogCU5FVF9UQ1BfVFNPX1dJTl9ESVZJU09SPTEwNywKIAlORVRfVENQX0JJQ19CRVRBPTEwOCwKIAlORVRfSVBWNF9JQ01QX0VSUk9SU19VU0VfSU5CT1VORF9JRkFERFI9MTA5LAorCU5FVF9UQ1BfQ09OR19DT05UUk9MPTExMCwKIH07CiAKIGVudW0gewpAQCAtNjQ3LDYgKzY1MCw3IEBACiAJTkVUX1NDVFBfQURESVBfRU5BQkxFCQkgPSAxMywKIAlORVRfU0NUUF9QUlNDVFBfRU5BQkxFCQkgPSAxNCwKIAlORVRfU0NUUF9TTkRCVUZfUE9MSUNZCQkgPSAxNSwKKwlORVRfU0NUUF9TQUNLX1RJTUVPVVQJCSA9IDE2LAogfTsKIAogLyogL3Byb2Mvc3lzL25ldC9icmlkZ2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaCBiL2luY2x1ZGUvbGludXgvdGNfZW1hdGNoL3RjX2VtX21ldGEuaAppbmRleCBhNmIyY2M1Li5iY2I3NjJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV9tZXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fbWV0YS5oCkBAIC00NSw3ICs0NSw3IEBACiAJVENGX01FVEFfSURfUkVBTERFViwKIAlUQ0ZfTUVUQV9JRF9QUklPUklUWSwKIAlUQ0ZfTUVUQV9JRF9QUk9UT0NPTCwKLQlUQ0ZfTUVUQV9JRF9TRUNVUklUWSwKKwlUQ0ZfTUVUQV9JRF9TRUNVUklUWSwgLyogb2Jzb2xldGUgKi8KIAlUQ0ZfTUVUQV9JRF9QS1RUWVBFLAogCVRDRl9NRVRBX0lEX1BLVExFTiwKIAlUQ0ZfTUVUQV9JRF9EQVRBTEVOLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fdGV4dC5oIGIvaW5jbHVkZS9saW51eC90Y19lbWF0Y2gvdGNfZW1fdGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZDQzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RjX2VtYXRjaC90Y19lbV90ZXh0LmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBfX0xJTlVYX1RDX0VNX1RFWFRfSAorI2RlZmluZSBfX0xJTlVYX1RDX0VNX1RFWFRfSAorCisjaW5jbHVkZSA8bGludXgvcGt0X2Nscy5oPgorCisjZGVmaW5lIFRDX0VNX1RFWFRfQUxHT1NJWgkxNgorCitzdHJ1Y3QgdGNmX2VtX3RleHQKK3sKKwljaGFyCQlhbGdvW1RDX0VNX1RFWFRfQUxHT1NJWl07CisJX191MTYJCWZyb21fb2Zmc2V0OworCV9fdTE2CQl0b19vZmZzZXQ7CisJX191MTYJCXBhdHRlcm5fbGVuOworCV9fdTgJCWZyb21fbGF5ZXI6NDsKKwlfX3U4CQl0b19sYXllcjo0OworCV9fdTgJCXBhZDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3AuaCBiL2luY2x1ZGUvbGludXgvdGNwLmgKaW5kZXggOTdhN2M5ZS4uZTRmZDgyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcC5oCkBAIC0xMjcsNiArMTI3LDcgQEAKICNkZWZpbmUgVENQX1dJTkRPV19DTEFNUAkxMAkvKiBCb3VuZCBhZHZlcnRpc2VkIHdpbmRvdyAqLwogI2RlZmluZSBUQ1BfSU5GTwkJMTEJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjb25uZWN0aW9uLiAqLwogI2RlZmluZSBUQ1BfUVVJQ0tBQ0sJCTEyCS8qIEJsb2NrL3JlZW5hYmxlIHF1aWNrIGFja3MgKi8KKyNkZWZpbmUgVENQX0NPTkdFU1RJT04JCTEzCS8qIENvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gKi8KIAogI2RlZmluZSBUQ1BJX09QVF9USU1FU1RBTVBTCTEKICNkZWZpbmUgVENQSV9PUFRfU0FDSwkJMgpAQCAtMjAzLDEzICsyMDQsNiBAQAogCV9fdTMyCWVuZF9zZXE7CiB9OwogCi1lbnVtIHRjcF9jb25nZXN0aW9uX2FsZ28gewotCVRDUF9SRU5PPTAsCi0JVENQX1ZFR0FTLAotCVRDUF9XRVNUV09PRCwKLQlUQ1BfQklDLAotfTsKLQogc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHsKIC8qCVBBV1MvUlRUTSBkYXRhCSovCiAJbG9uZwl0c19yZWNlbnRfc3RhbXA7LyogVGltZSB3ZSBzdG9yZWQgdHNfcmVjZW50IChmb3IgYWdpbmcpICovCkBAIC0yOTIsNyArMjg2LDcgQEAKIAlfX3UzMgltYXhfd2luZG93OwkvKiBNYXhpbWFsIHdpbmRvdyBldmVyIHNlZW4gZnJvbSBwZWVyCSovCiAJX191MzIJcG10dV9jb29raWU7CS8qIExhc3QgcG10dSBzZWVuIGJ5IHNvY2tldAkJKi8KIAlfX3UzMgltc3NfY2FjaGU7CS8qIENhY2hlZCBlZmZlY3RpdmUgbXNzLCBub3QgaW5jbHVkaW5nIFNBQ0tTICovCi0JX191MTYJbXNzX2NhY2hlX3N0ZDsJLyogTGlrZSBtc3NfY2FjaGUsIGJ1dCB3aXRob3V0IFRTTyAqLworCV9fdTE2CXhtaXRfc2l6ZV9nb2FsOwkvKiBHb2FsIGZvciBzZWdtZW50aW5nIG91dHB1dCBwYWNrZXRzCSovCiAJX191MTYJZXh0X2hlYWRlcl9sZW47CS8qIE5ldHdvcmsgcHJvdG9jb2wgb3ZlcmhlYWQgKElQL0lQdjYgb3B0aW9ucykgKi8KIAlfX3U4CWNhX3N0YXRlOwkvKiBTdGF0ZSBvZiBmYXN0LXJldHJhbnNtaXQgbWFjaGluZSAJKi8KIAlfX3U4CXJldHJhbnNtaXRzOwkvKiBOdW1iZXIgb2YgdW5yZWNvdmVyZWQgUlRPIHRpbWVvdXRzLgkqLwpAQCAtMzA1LDcgKzI5OSw3IEBACiAJX191OAlyZW9yZGVyaW5nOwkvKiBQYWNrZXQgcmVvcmRlcmluZyBtZXRyaWMuCQkqLwogCV9fdTgJZnJ0b19jb3VudGVyOwkvKiBOdW1iZXIgb2YgbmV3IGFja3MgYWZ0ZXIgUlRPICovCiAKLQlfX3U4CWFkdl9jb25nOwkvKiBVc2luZyBWZWdhcywgV2VzdHdvb2QsIG9yIEJJQyAqLworCV9fdTgJdW51c2VkOwogCV9fdTgJZGVmZXJfYWNjZXB0OwkvKiBVc2VyIHdhaXRzIGZvciBzb21lIGRhdGEgYWZ0ZXIgYWNjZXB0KCkgKi8KIAogLyogUlRUIG1lYXN1cmVtZW50ICovCkBAIC00MDEsMzcgKzM5NSwxMCBAQAogCQlfX3UzMgl0aW1lOwogCX0gcmN2cV9zcGFjZTsKIAotLyogVENQIFdlc3R3b29kIHN0cnVjdHVyZSAqLwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgIF9fdTMyICAgIGJ3X25zX2VzdDsgICAgICAgIC8qIGZpcnN0IGJhbmR3aWR0aCBlc3RpbWF0aW9uLi5ub3QgdG9vIHNtb290aGVkIDgpICovCi0gICAgICAgICAgICAgICAgX191MzIgICAgYndfZXN0OyAgICAgICAgICAgLyogYmFuZHdpZHRoIGVzdGltYXRlICovCi0gICAgICAgICAgICAgICAgX191MzIgICAgcnR0X3dpbl9zeDsgICAgICAgLyogaGVyZSBzdGFydHMgYSBuZXcgZXZhbHVhdGlvbi4uLiAqLwotICAgICAgICAgICAgICAgIF9fdTMyICAgIGJrOwotICAgICAgICAgICAgICAgIF9fdTMyICAgIHNuZF91bmE7ICAgICAgICAgIC8qIHVzZWQgZm9yIGV2YWx1YXRpbmcgdGhlIG51bWJlciBvZiBhY2tlZCBieXRlcyAqLwotICAgICAgICAgICAgICAgIF9fdTMyICAgIGN1bXVsX2FjazsKLSAgICAgICAgICAgICAgICBfX3UzMiAgICBhY2NvdW50ZWQ7Ci0gICAgICAgICAgICAgICAgX191MzIgICAgcnR0OwotICAgICAgICAgICAgICAgIF9fdTMyICAgIHJ0dF9taW47ICAgICAgICAgIC8qIG1pbmltdW0gb2JzZXJ2ZWQgUlRUICovCi0gICAgICAgIH0gd2VzdHdvb2Q7Ci0KLS8qIFZlZ2FzIHZhcmlhYmxlcyAqLwotCXN0cnVjdCB7Ci0JCV9fdTMyCWJlZ19zbmRfbnh0OwkvKiByaWdodCBlZGdlIGR1cmluZyBsYXN0IFJUVCAqLwotCQlfX3UzMgliZWdfc25kX3VuYTsJLyogbGVmdCBlZGdlICBkdXJpbmcgbGFzdCBSVFQgKi8KLQkJX191MzIJYmVnX3NuZF9jd25kOwkvKiBzYXZlcyB0aGUgc2l6ZSBvZiB0aGUgY3duZCAqLwotCQlfX3U4CWRvaW5nX3ZlZ2FzX25vdzsvKiBpZiB0cnVlLCBkbyB2ZWdhcyBmb3IgdGhpcyBSVFQgKi8KLQkJX191MTYJY250UlRUOwkJLyogIyBvZiBSVFRzIG1lYXN1cmVkIHdpdGhpbiBsYXN0IFJUVCAqLwotCQlfX3UzMgltaW5SVFQ7CQkvKiBtaW4gb2YgUlRUcyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBSVFQgKGluIHVzZWMpICovCi0JCV9fdTMyCWJhc2VSVFQ7CS8qIHRoZSBtaW4gb2YgYWxsIFZlZ2FzIFJUVCBtZWFzdXJlbWVudHMgc2VlbiAoaW4gdXNlYykgKi8KLQl9IHZlZ2FzOwotCi0JLyogQkkgVENQIFBhcmFtZXRlcnMgKi8KLQlzdHJ1Y3QgewotCQlfX3UzMgljbnQ7CQkvKiBpbmNyZWFzZSBjd25kIGJ5IDEgYWZ0ZXIgdGhpcyBudW1iZXIgb2YgQUNLcyAqLwotCQlfX3UzMiAJbGFzdF9tYXhfY3duZDsJLyogbGFzdCBtYXhpbWl1bSBzbmRfY3duZCAqLwotCQlfX3UzMglsYXN0X2N3bmQ7CS8qIHRoZSBsYXN0IHNuZF9jd25kICovCi0JCV9fdTMyICAgbGFzdF9zdGFtcDsgICAgIC8qIHRpbWUgd2hlbiB1cGRhdGVkIGxhc3RfY3duZCAqLwotCX0gYmljdGNwOworCS8qIFBsdWdnYWJsZSBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGhvb2sgKi8KKwlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYV9vcHM7CisJdTMyCWNhX3ByaXZbMTZdOworI2RlZmluZSBUQ1BfQ0FfUFJJVl9TSVpFCSgxNipzaXplb2YodTMyKSkKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF9zb2NrICp0Y3Bfc2soY29uc3Qgc3RydWN0IHNvY2sgKnNrKQpAQCAtNDM5LDYgKzQwNiwxMSBAQAogCXJldHVybiAoc3RydWN0IHRjcF9zb2NrICopc2s7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdGNwX2NhKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuICh2b2lkICopIHRwLT5jYV9wcml2OworfQorCiAjZW5kaWYKIAogI2VuZGlmCS8qIF9MSU5VWF9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90Y3BfZGlhZy5oIGIvaW5jbHVkZS9saW51eC90Y3BfZGlhZy5oCmluZGV4IGNlZWU5NjIuLjdhNTk5NjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwX2RpYWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RjcF9kaWFnLmgKQEAgLTk5LDkgKzk5LDEwIEBACiAJVENQRElBR19NRU1JTkZPLAogCVRDUERJQUdfSU5GTywKIAlUQ1BESUFHX1ZFR0FTSU5GTywKKwlUQ1BESUFHX0NPTkcsCiB9OwogCi0jZGVmaW5lIFRDUERJQUdfTUFYIFRDUERJQUdfVkVHQVNJTkZPCisjZGVmaW5lIFRDUERJQUdfTUFYIFRDUERJQUdfQ09ORwogCiAKIC8qIFRDUERJQUdfTUVNICovCkBAIC0xMjMsNSArMTI0LDQgQEAKIAlfX3UzMgl0Y3B2X21pbnJ0dDsKIH07CiAKLQogI2VuZGlmIC8qIF9UQ1BfRElBR19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmggYi9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDFmNDVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoLmgKQEAgLTAsMCArMSwxODAgQEAKKyNpZm5kZWYgX19MSU5VWF9URVhUU0VBUkNIX0gKKyNkZWZpbmUgX19MSU5VWF9URVhUU0VBUkNIX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCitzdHJ1Y3QgdHNfY29uZmlnOworCisvKioKKyAqIFRTX0FVVE9MT0FEIC0gQXV0b21hdGljYWxseSBsb2FkIHRleHRzZWFyY2ggbW9kdWxlcyB3aGVuIG5lZWRlZAorICovCisjZGVmaW5lIFRTX0FVVE9MT0FECTEKKworLyoqCisgKiBzdHJ1Y3QgdHNfc3RhdGUgLSBzZWFyY2ggc3RhdGUKKyAqIEBvZmZzZXQ6IG9mZnNldCBmb3IgbmV4dCBtYXRjaAorICogQGNiOiBjb250cm9sIGJ1ZmZlciwgZm9yIHBlcnNpc3RhbnQgdmFyaWFibGVzIG9mIGdldF9uZXh0X2Jsb2NrKCkKKyAqLworc3RydWN0IHRzX3N0YXRlCit7CisJdW5zaWduZWQgaW50CQlvZmZzZXQ7CisJY2hhcgkJCWNiWzQwXTsKK307CisKKy8qKgorICogc3RydWN0IHRzX29wcyAtIHNlYXJjaCBtb2R1bGUgb3BlcmF0aW9ucworICogQG5hbWU6IG5hbWUgb2Ygc2VhcmNoIGFsZ29yaXRobQorICogQGluaXQ6IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHRvIHByZXBhcmUgYSBzZWFyY2gKKyAqIEBmaW5kOiBmaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4KKyAqIEBkZXN0cm95OiBkZXN0cm95IGFsZ29yaXRobSBzcGVjaWZpYyBwYXJ0cyBvZiBhIHNlYXJjaCBjb25maWd1cmF0aW9uCisgKiBAZ2V0X3BhdHRlcm46IHJldHVybiBoZWFkIG9mIHBhdHRlcm4KKyAqIEBnZXRfcGF0dGVybl9sZW46IHJldHVybiBsZW5ndGggb2YgcGF0dGVybgorICogQG93bmVyOiBtb2R1bGUgcmVmZXJlbmNlIHRvIGFsZ29yaXRobQorICovCitzdHJ1Y3QgdHNfb3BzCit7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJc3RydWN0IHRzX2NvbmZpZyAqCSgqaW5pdCkoY29uc3Qgdm9pZCAqLCB1bnNpZ25lZCBpbnQsIGludCk7CisJdW5zaWduZWQgaW50CQkoKmZpbmQpKHN0cnVjdCB0c19jb25maWcgKiwKKwkJCQkJc3RydWN0IHRzX3N0YXRlICopOworCXZvaWQJCQkoKmRlc3Ryb3kpKHN0cnVjdCB0c19jb25maWcgKik7CisJdm9pZCAqCQkJKCpnZXRfcGF0dGVybikoc3RydWN0IHRzX2NvbmZpZyAqKTsKKwl1bnNpZ25lZCBpbnQJCSgqZ2V0X3BhdHRlcm5fbGVuKShzdHJ1Y3QgdHNfY29uZmlnICopOworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCB0c19jb25maWcgLSBzZWFyY2ggY29uZmlndXJhdGlvbgorICogQG9wczogb3BlcmF0aW9ucyBvZiBjaG9zZW4gYWxnb3JpdGhtCisgKiBAZ2V0X25leHRfYmxvY2s6IGNhbGxiYWNrIHRvIGZldGNoIHRoZSBuZXh0IGJsb2NrIHRvIHNlYXJjaCBpbgorICogQGZpbmlzaDogY2FsbGJhY2sgdG8gZmluYWxpemUgYSBzZWFyY2gKKyAqLworc3RydWN0IHRzX2NvbmZpZworeworCXN0cnVjdCB0c19vcHMJCSpvcHM7CisKKwkvKioKKwkgKiBnZXRfbmV4dF9ibG9jayAtIGZldGNoIG5leHQgYmxvY2sgb2YgZGF0YQorCSAqIEBjb25zdW1lZDogbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBjYWxsZXIKKwkgKiBAZHN0OiBkZXN0aW5hdGlvbiBidWZmZXIKKwkgKiBAY29uZjogc2VhcmNoIGNvbmZpZ3VyYXRpb24KKwkgKiBAc3RhdGU6IHNlYXJjaCBzdGF0ZQorCSAqCisJICogQ2FsbGVkIHJlcGVhdGVkbHkgdW50aWwgMCBpcyByZXR1cm5lZC4gTXVzdCBhc3NpZ24gdGhlCisJICogaGVhZCBvZiB0aGUgbmV4dCBibG9jayBvZiBkYXRhIHRvICYqZHN0IGFuZCByZXR1cm4gdGhlIGxlbmd0aAorCSAqIG9mIHRoZSBibG9jayBvciAwIGlmIGF0IHRoZSBlbmQuIGNvbnN1bWVkID09IDAgaW5kaWNhdGVzCisJICogYSBuZXcgc2VhcmNoLiBNYXkgc3RvcmUvcmVhZCBwZXJzaXN0YW50IHZhbHVlcyBpbiBzdGF0ZS0+Y2IuCisJICovCisJdW5zaWduZWQgaW50CQkoKmdldF9uZXh0X2Jsb2NrKSh1bnNpZ25lZCBpbnQgY29uc3VtZWQsCisJCQkJCQkgIGNvbnN0IHU4ICoqZHN0LAorCQkJCQkJICBzdHJ1Y3QgdHNfY29uZmlnICpjb25mLAorCQkJCQkJICBzdHJ1Y3QgdHNfc3RhdGUgKnN0YXRlKTsKKworCS8qKgorCSAqIGZpbmlzaCAtIGZpbmFsaXplL2NsZWFuIGEgc2VyaWVzIG9mIGdldF9uZXh0X2Jsb2NrKCkgY2FsbHMKKwkgKiBAY29uZjogc2VhcmNoIGNvbmZpZ3VyYXRpb24KKwkgKiBAc3RhdGU6IHNlYXJjaCBzdGF0ZQorCSAqCisJICogQ2FsbGVkIGFmdGVyIHRoZSBsYXN0IHVzZSBvZiBnZXRfbmV4dF9ibG9jaygpLCBtYXkgYmUgdXNlZAorCSAqIHRvIGNsZWFudXAgYW55IGxlZnRvdmVycy4KKwkgKi8KKwl2b2lkCQkJKCpmaW5pc2gpKHN0cnVjdCB0c19jb25maWcgKmNvbmYsCisJCQkJCSAgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSk7Cit9OworCisvKioKKyAqIHRleHRzZWFyY2hfbmV4dCAtIGNvbnRpbnVlIHNlYXJjaGluZyBmb3IgYSBwYXR0ZXJuCisgKiBAY29uZjogc2VhcmNoIGNvbmZpZ3VyYXRpb24KKyAqIEBzdGF0ZTogc2VhcmNoIHN0YXRlCisgKgorICogQ29udGludWVzIGEgc2VhcmNoIGxvb2tpbmcgZm9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4uCisgKiB0ZXh0c2VhcmNoX2ZpbmQoKSBtdXN0IGJlIGNhbGxlZCB0byBmaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlCisgKiBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGUuCisgKgorICogUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgcGF0dGVybiBvcgorICogVUlOVF9NQVggaWYgbm90IG1hdGNoIHdhcyBmb3VuZC4KKyAqLyAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRleHRzZWFyY2hfbmV4dChzdHJ1Y3QgdHNfY29uZmlnICpjb25mLAorCQkJCQkgICBzdHJ1Y3QgdHNfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGludCByZXQgPSBjb25mLT5vcHMtPmZpbmQoY29uZiwgc3RhdGUpOworCisJaWYgKGNvbmYtPmZpbmlzaCkKKwkJY29uZi0+ZmluaXNoKGNvbmYsIHN0YXRlKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdGV4dHNlYXJjaF9maW5kIC0gc3RhcnQgc2VhcmNoaW5nIGZvciBhIHBhdHRlcm4KKyAqIEBjb25mOiBzZWFyY2ggY29uZmlndXJhdGlvbgorICogQHN0YXRlOiBzZWFyY2ggc3RhdGUKKyAqCisgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBwYXR0ZXJuIG9yCisgKiBVSU5UX01BWCBpZiBubyBtYXRjaCB3YXMgZm91bmQuCisgKi8gCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0ZXh0c2VhcmNoX2ZpbmQoc3RydWN0IHRzX2NvbmZpZyAqY29uZiwKKwkJCQkJICAgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdGF0ZS0+b2Zmc2V0ID0gMDsKKwlyZXR1cm4gdGV4dHNlYXJjaF9uZXh0KGNvbmYsIHN0YXRlKTsKK30KKworLyoqCisgKiB0ZXh0c2VhcmNoX2dldF9wYXR0ZXJuIC0gcmV0dXJuIGhlYWQgb2YgdGhlIHBhdHRlcm4KKyAqIEBjb25mOiBzZWFyY2ggY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgKnRleHRzZWFyY2hfZ2V0X3BhdHRlcm4oc3RydWN0IHRzX2NvbmZpZyAqY29uZikKK3sKKwlyZXR1cm4gY29uZi0+b3BzLT5nZXRfcGF0dGVybihjb25mKTsKK30KKworLyoqCisgKiB0ZXh0c2VhcmNoX2dldF9wYXR0ZXJuX2xlbiAtIHJldHVybiBsZW5ndGggb2YgdGhlIHBhdHRlcm4KKyAqIEBjb25mOiBzZWFyY2ggY29uZmlndXJhdGlvbgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0ZXh0c2VhcmNoX2dldF9wYXR0ZXJuX2xlbihzdHJ1Y3QgdHNfY29uZmlnICpjb25mKQoreworCXJldHVybiBjb25mLT5vcHMtPmdldF9wYXR0ZXJuX2xlbihjb25mKTsKK30KKworZXh0ZXJuIGludCB0ZXh0c2VhcmNoX3JlZ2lzdGVyKHN0cnVjdCB0c19vcHMgKik7CitleHRlcm4gaW50IHRleHRzZWFyY2hfdW5yZWdpc3RlcihzdHJ1Y3QgdHNfb3BzICopOworZXh0ZXJuIHN0cnVjdCB0c19jb25maWcgKnRleHRzZWFyY2hfcHJlcGFyZShjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwKKwkJCQkJICAgIHVuc2lnbmVkIGludCwgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgdGV4dHNlYXJjaF9kZXN0cm95KHN0cnVjdCB0c19jb25maWcgKmNvbmYpOworZXh0ZXJuIHVuc2lnbmVkIGludCB0ZXh0c2VhcmNoX2ZpbmRfY29udGludW91cyhzdHJ1Y3QgdHNfY29uZmlnICosCisJCQkJCSAgICAgICBzdHJ1Y3QgdHNfc3RhdGUgKiwKKwkJCQkJICAgICAgIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgaW50KTsKKworCisjZGVmaW5lIFRTX1BSSVZfQUxJR05UTwk4CisjZGVmaW5lIFRTX1BSSVZfQUxJR04obGVuKSAoKChsZW4pICsgVFNfUFJJVl9BTElHTlRPLTEpICYgfihUU19QUklWX0FMSUdOVE8tMSkpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRzX2NvbmZpZyAqYWxsb2NfdHNfY29uZmlnKHNpemVfdCBwYXlsb2FkLCBpbnQgZ2ZwX21hc2spCit7CisJc3RydWN0IHRzX2NvbmZpZyAqY29uZjsKKworCWNvbmYgPSBrbWFsbG9jKFRTX1BSSVZfQUxJR04oc2l6ZW9mKCpjb25mKSkgKyBwYXlsb2FkLCBnZnBfbWFzayk7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQoY29uZiwgMCwgVFNfUFJJVl9BTElHTihzaXplb2YoKmNvbmYpKSArIHBheWxvYWQpOworCXJldHVybiBjb25mOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnRzX2NvbmZpZ19wcml2KHN0cnVjdCB0c19jb25maWcgKmNvbmYpCit7CisJcmV0dXJuICgodTggKikgY29uZiArIFRTX1BSSVZfQUxJR04oc2l6ZW9mKHN0cnVjdCB0c19jb25maWcpKSk7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoX2ZzbS5oIGIvaW5jbHVkZS9saW51eC90ZXh0c2VhcmNoX2ZzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmEwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RleHRzZWFyY2hfZnNtLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfX0xJTlVYX1RFWFRTRUFSQ0hfRlNNX0gKKyNkZWZpbmUgX19MSU5VWF9URVhUU0VBUkNIX0ZTTV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlUU19GU01fU1BFQ0lGSUMsCS8qIHNwZWNpZmljIGNoYXJhY3RlciAqLworCVRTX0ZTTV9XSUxEQ0FSRCwJLyogYW55IGNoYXJhY3RlciAqLworCVRTX0ZTTV9ESUdJVCwJCS8qIGlzZGlnaXQoKSAqLworCVRTX0ZTTV9YRElHSVQsCQkvKiBpc3hkaWdpdCgpICovCisJVFNfRlNNX1BSSU5ULAkJLyogaXNwcmludCgpICovCisJVFNfRlNNX0FMUEhBLAkJLyogaXNhbHBoYSgpICovCisJVFNfRlNNX0FMTlVNLAkJLyogaXNhbG51bSgpICovCisJVFNfRlNNX0FTQ0lJLAkJLyogaXNhc2NpaSgpICovCisJVFNfRlNNX0NOVFJMLAkJLyogaXNjbnRybCgpICovCisJVFNfRlNNX0dSQVBILAkJLyogaXNncmFwaCgpICovCisJVFNfRlNNX0xPV0VSLAkJLyogaXNsb3dlcigpICovCisJVFNfRlNNX1VQUEVSLAkJLyogaXN1cHBlcigpICovCisJVFNfRlNNX1BVTkNULAkJLyogaXNwdW5jdCgpICovCisJVFNfRlNNX1NQQUNFLAkJLyogaXNzcGFjZSgpICovCisJX19UU19GU01fVFlQRV9NQVgsCit9OworI2RlZmluZSBUU19GU01fVFlQRV9NQVggKF9fVFNfRlNNX1RZUEVfTUFYIC0gMSkKKworZW51bSB7CisJVFNfRlNNX1NJTkdMRSwJCS8qIDEgb2NjdXJyZW5jZSAqLworCVRTX0ZTTV9QRVJIQVBTLAkJLyogMSBvciAwIG9jY3VycmVuY2UgKi8KKwlUU19GU01fQU5ZLAkJLyogMC4ubiBvY2N1cnJlbmNlcyAqLworCVRTX0ZTTV9NVUxUSSwJCS8qIDEuLm4gb2NjdXJyZW5jZXMgKi8KKwlUU19GU01fSEVBRF9JR05PUkUsCS8qIDAuLm4gaWdub3JlZCBvY2N1cnJlbmNlcyBhdCBoZWFkICovCisJX19UU19GU01fUkVDVVJfTUFYLAorfTsKKyNkZWZpbmUgVFNfRlNNX1JFQ1VSX01BWCAoX19UU19GU01fUkVDVVJfTUFYIC0gMSkKKworLyoqCisgKiBzdHJ1Y3QgdHNfZnNtX3Rva2VuIC0gc3RhdGUgbWFjaGluZSB0b2tlbiAoc3RhdGUpCisgKiBAdHlwZTogdHlwZSBvZiB0b2tlbgorICogQHJlY3VyOiBudW1iZXIgb2YgcmVjdXJyZW5jZXMKKyAqIEB2YWx1ZTogY2hhcmFjdGVyIHZhbHVlIGZvciBUU19GU01fU1BFQ0lGSUMKKyAqLworc3RydWN0IHRzX2ZzbV90b2tlbgoreworCV9fdTE2CQl0eXBlOworCV9fdTgJCXJlY3VyOworCV9fdTgJCXZhbHVlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmggYi9pbmNsdWRlL2xpbnV4L3RvcG9sb2d5LmgKaW5kZXggZDcwZTg5Ny4uMDMyMDIyNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90b3BvbG9neS5oCisrKyBiL2luY2x1ZGUvbGludXgvdG9wb2xvZ3kuaApAQCAtODksNiArODksMTEgQEAKIAkuY2FjaGVfaG90X3RpbWUJCT0gMCwJCQlcCiAJLmNhY2hlX25pY2VfdHJpZXMJPSAwLAkJCVwKIAkucGVyX2NwdV9nYWluCQk9IDI1LAkJCVwKKwkuYnVzeV9pZHgJCT0gMCwJCQlcCisJLmlkbGVfaWR4CQk9IDAsCQkJXAorCS5uZXdpZGxlX2lkeAkJPSAxLAkJCVwKKwkud2FrZV9pZHgJCT0gMCwJCQlcCisJLmZvcmtleGVjX2lkeAkJPSAwLAkJCVwKIAkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRQlcCiAJCQkJfCBTRF9CQUxBTkNFX05FV0lETEUJXAogCQkJCXwgU0RfQkFMQU5DRV9FWEVDCVwKQEAgLTExNSwxMiArMTIwLDE1IEBACiAJLmNhY2hlX2hvdF90aW1lCQk9ICg1KjEwMDAwMDAvMiksCVwKIAkuY2FjaGVfbmljZV90cmllcwk9IDEsCQkJXAogCS5wZXJfY3B1X2dhaW4JCT0gMTAwLAkJCVwKKwkuYnVzeV9pZHgJCT0gMiwJCQlcCisJLmlkbGVfaWR4CQk9IDEsCQkJXAorCS5uZXdpZGxlX2lkeAkJPSAyLAkJCVwKKwkud2FrZV9pZHgJCT0gMSwJCQlcCisJLmZvcmtleGVjX2lkeAkJPSAxLAkJCVwKIAkuZmxhZ3MJCQk9IFNEX0xPQURfQkFMQU5DRQlcCiAJCQkJfCBTRF9CQUxBTkNFX05FV0lETEUJXAogCQkJCXwgU0RfQkFMQU5DRV9FWEVDCVwKLQkJCQl8IFNEX1dBS0VfQUZGSU5FCVwKLQkJCQl8IFNEX1dBS0VfSURMRQkJXAotCQkJCXwgU0RfV0FLRV9CQUxBTkNFLAlcCisJCQkJfCBTRF9XQUtFX0FGRklORSwJXAogCS5sYXN0X2JhbGFuY2UJCT0gamlmZmllcywJCVwKIAkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJXAogCS5ucl9iYWxhbmNlX2ZhaWxlZAk9IDAsCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggZWIyODJiNS4uNzI0NjM3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC05MzgsMTcgKzkzOCwxNyBAQAogfQogCiBleHRlcm4gdm9pZCB1c2JfaW5pdF91cmIoc3RydWN0IHVyYiAqdXJiKTsKLWV4dGVybiBzdHJ1Y3QgdXJiICp1c2JfYWxsb2NfdXJiKGludCBpc29fcGFja2V0cywgaW50IG1lbV9mbGFncyk7CitleHRlcm4gc3RydWN0IHVyYiAqdXNiX2FsbG9jX3VyYihpbnQgaXNvX3BhY2tldHMsIHVuc2lnbmVkIG1lbV9mbGFncyk7CiBleHRlcm4gdm9pZCB1c2JfZnJlZV91cmIoc3RydWN0IHVyYiAqdXJiKTsKICNkZWZpbmUgdXNiX3B1dF91cmIgdXNiX2ZyZWVfdXJiCiBleHRlcm4gc3RydWN0IHVyYiAqdXNiX2dldF91cmIoc3RydWN0IHVyYiAqdXJiKTsKLWV4dGVybiBpbnQgdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgbWVtX2ZsYWdzKTsKK2V4dGVybiBpbnQgdXNiX3N1Ym1pdF91cmIoc3RydWN0IHVyYiAqdXJiLCB1bnNpZ25lZCBtZW1fZmxhZ3MpOwogZXh0ZXJuIGludCB1c2JfdW5saW5rX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogZXh0ZXJuIHZvaWQgdXNiX2tpbGxfdXJiKHN0cnVjdCB1cmIgKnVyYik7CiAKICNkZWZpbmUgSEFWRV9VU0JfQlVGRkVSUwogdm9pZCAqdXNiX2J1ZmZlcl9hbGxvYyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCi0JaW50IG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKKwl1bnNpZ25lZCBtZW1fZmxhZ3MsIGRtYV9hZGRyX3QgKmRtYSk7CiB2b2lkIHVzYl9idWZmZXJfZnJlZSAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiAJdm9pZCAqYWRkciwgZG1hX2FkZHJfdCBkbWEpOwogCkBAIC0xMDU1LDcgKzEwNTUsNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdAkqc2csCiAJaW50CQkJbmVudHMsCiAJc2l6ZV90CQkJbGVuZ3RoLAotCWludAkJCW1lbV9mbGFncworCXVuc2lnbmVkCQltZW1fZmxhZ3MKICk7CiB2b2lkIHVzYl9zZ19jYW5jZWwgKHN0cnVjdCB1c2Jfc2dfcmVxdWVzdCAqaW8pOwogdm9pZCB1c2Jfc2dfd2FpdCAoc3RydWN0IHVzYl9zZ19yZXF1ZXN0ICppbyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl9jZGMuaCBiL2luY2x1ZGUvbGludXgvdXNiX2NkYy5oCmluZGV4IGYyMmQ2YmUuLmJhNjE3YzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiX2NkYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX2NkYy5oCkBAIC0zNCw2ICszNCw3IEBACiAjZGVmaW5lIFVTQl9DRENfQUNNX1RZUEUJCTB4MDIJCS8qIGFjbV9kZXNjcmlwdG9yICovCiAjZGVmaW5lIFVTQl9DRENfVU5JT05fVFlQRQkJMHgwNgkJLyogdW5pb25fZGVzYyAqLwogI2RlZmluZSBVU0JfQ0RDX0NPVU5UUllfVFlQRQkJMHgwNworI2RlZmluZSBVU0JfQ0RDX05FVFdPUktfVEVSTUlOQUxfVFlQRQkweDBhCQkvKiBuZXR3b3JrX3Rlcm1pbmFsX2Rlc2MgKi8KICNkZWZpbmUgVVNCX0NEQ19FVEhFUk5FVF9UWVBFCQkweDBmCQkvKiBldGhlcl9kZXNjICovCiAjZGVmaW5lIFVTQl9DRENfV0hDTV9UWVBFCQkweDExCiAjZGVmaW5lIFVTQl9DRENfTURMTV9UWVBFCQkweDEyCQkvKiBtZGxtX2Rlc2MgKi8KQEAgLTgzLDYgKzg0LDE4IEBACiAJLyogLi4uIGFuZCB0aGVyZSBjb3VsZCBiZSBvdGhlciBzbGF2ZSBpbnRlcmZhY2VzICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorLyogIk5ldHdvcmsgQ2hhbm5lbCBUZXJtaW5hbCBGdW5jdGlvbmFsIERlc2NyaXB0b3IiIGZyb20gQ0RDIHNwZWMgNS4yLjMuMTEgKi8KK3N0cnVjdCB1c2JfY2RjX25ldHdvcmtfdGVybWluYWxfZGVzYyB7CisJX191OAliTGVuZ3RoOworCV9fdTgJYkRlc2NyaXB0b3JUeXBlOworCV9fdTgJYkRlc2NyaXB0b3JTdWJUeXBlOworCisJX191OAliRW50aXR5SWQ7CisJX191OAlpTmFtZTsKKwlfX3U4CWJDaGFubmVsSW5kZXg7CisJX191OAliUGh5c2ljYWxJbnRlcmZhY2U7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwogLyogIkV0aGVybmV0IE5ldHdvcmtpbmcgRnVuY3Rpb25hbCBEZXNjcmlwdG9yIiBmcm9tIENEQyBzcGVjIDUuMi4zLjE2ICovCiBzdHJ1Y3QgdXNiX2NkY19ldGhlcl9kZXNjIHsKIAlfX3U4CWJMZW5ndGg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl9jaDkuaCBiL2luY2x1ZGUvbGludXgvdXNiX2NoOS5oCmluZGV4IGY1ZmU5NGUuLmVlMjFlNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiX2NoOS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX2NoOS5oCkBAIC02LDE3ICs2LDIwIEBACiAgKgogICogLSB0aGUgbWFzdGVyL2hvc3Qgc2lkZSBMaW51eC1VU0Iga2VybmVsIGRyaXZlciBBUEk7CiAgKiAtIHRoZSAidXNiZnMiIHVzZXIgc3BhY2UgQVBJOyBhbmQKLSAqIC0gKGV2ZW50dWFsbHkpIGEgTGludXggImdhZGdldCIgc2xhdmUvZGV2aWNlIHNpZGUgZHJpdmVyIEFQSS4KKyAqIC0gdGhlIExpbnV4ICJnYWRnZXQiIHNsYXZlL2RldmljZS9wZXJpcGhlcmFsIHNpZGUgZHJpdmVyIEFQSS4KICAqCiAgKiBVU0IgMi4wIGFkZHMgYW4gYWRkaXRpb25hbCAiT24gVGhlIEdvIiAoT1RHKSBtb2RlLCB3aGljaCBsZXRzIHN5c3RlbXMKICAqIGFjdCBlaXRoZXIgYXMgYSBVU0IgbWFzdGVyL2hvc3Qgb3IgYXMgYSBVU0Igc2xhdmUvZGV2aWNlLiAgVGhhdCBtZWFucwotICogdGhlIG1hc3RlciBhbmQgc2xhdmUgc2lkZSBBUElzIHdpbGwgYmVuZWZpdCBmcm9tIHdvcmtpbmcgd2VsbCB0b2dldGhlci4KKyAqIHRoZSBtYXN0ZXIgYW5kIHNsYXZlIHNpZGUgQVBJcyBiZW5lZml0IGZyb20gd29ya2luZyB3ZWxsIHRvZ2V0aGVyLgorICoKKyAqIFRoZXJlJ3MgYWxzbyAiV2lyZWxlc3MgVVNCIiwgdXNpbmcgbG93IHBvd2VyIHNob3J0IHJhbmdlIHJhZGlvcyBmb3IKKyAqIHBlcmlwaGVyYWwgaW50ZXJjb25uZWN0aW9uIGJ1dCBvdGhlcndpc2UgYnVpbGRpbmcgb24gdGhlIFVTQiBmcmFtZXdvcmsuCiAgKi8KIAogI2lmbmRlZiBfX0xJTlVYX1VTQl9DSDlfSAogI2RlZmluZSBfX0xJTlVYX1VTQl9DSDlfSAogCi0jaW5jbHVkZSA8YXNtL3R5cGVzLmg+CQkvKiBfX3U4IGV0YyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIF9fdTggZXRjICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTY4LDYgKzcxLDE4IEBACiAjZGVmaW5lIFVTQl9SRVFfU0VUX0lOVEVSRkFDRQkJMHgwQgogI2RlZmluZSBVU0JfUkVRX1NZTkNIX0ZSQU1FCQkweDBDCiAKKyNkZWZpbmUgVVNCX1JFUV9TRVRfRU5DUllQVElPTgkJMHgwRAkvKiBXaXJlbGVzcyBVU0IgKi8KKyNkZWZpbmUgVVNCX1JFUV9HRVRfRU5DUllQVElPTgkJMHgwRQorI2RlZmluZSBVU0JfUkVRX1NFVF9IQU5EU0hBS0UJCTB4MEYKKyNkZWZpbmUgVVNCX1JFUV9HRVRfSEFORFNIQUtFCQkweDEwCisjZGVmaW5lIFVTQl9SRVFfU0VUX0NPTk5FQ1RJT04JCTB4MTEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfU0VDVVJJVFlfREFUQQkweDEyCisjZGVmaW5lIFVTQl9SRVFfR0VUX1NFQ1VSSVRZX0RBVEEJMHgxMworI2RlZmluZSBVU0JfUkVRX1NFVF9XVVNCX0RBVEEJCTB4MTQKKyNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1dSSVRFCTB4MTUKKyNkZWZpbmUgVVNCX1JFUV9MT09QQkFDS19EQVRBX1JFQUQJMHgxNgorI2RlZmluZSBVU0JfUkVRX1NFVF9JTlRFUkZBQ0VfRFMJMHgxNworCiAvKgogICogVVNCIGZlYXR1cmUgZmxhZ3MgYXJlIHdyaXR0ZW4gdXNpbmcgVVNCX1JFUV97Q0xFQVIsU0VUfV9GRUFUVVJFLCBhbmQKICAqIGFyZSByZWFkIGFzIGEgYml0IGFycmF5IHJldHVybmVkIGJ5IFVTQl9SRVFfR0VUX1NUQVRVUy4gIChTbyB0aGVyZQpAQCAtNzUsMTAgKzkwLDEyIEBACiAgKi8KICNkZWZpbmUgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQJCTAJLyogKHJlYWQgb25seSkgKi8KICNkZWZpbmUgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQCTEJLyogZGV2IG1heSBpbml0aWF0ZSB3YWtldXAgKi8KLSNkZWZpbmUgVVNCX0RFVklDRV9URVNUX01PREUJCTIJLyogKGhpZ2ggc3BlZWQgb25seSkgKi8KLSNkZWZpbmUgVVNCX0RFVklDRV9CX0hOUF9FTkFCTEUJCTMJLyogZGV2IG1heSBpbml0aWF0ZSBITlAgKi8KLSNkZWZpbmUgVVNCX0RFVklDRV9BX0hOUF9TVVBQT1JUCTQJLyogUkggcG9ydCBzdXBwb3J0cyBITlAgKi8KLSNkZWZpbmUgVVNCX0RFVklDRV9BX0FMVF9ITlBfU1VQUE9SVAk1CS8qIG90aGVyIFJIIHBvcnQgZG9lcyAqLworI2RlZmluZSBVU0JfREVWSUNFX1RFU1RfTU9ERQkJMgkvKiAod2lyZWQgaGlnaCBzcGVlZCBvbmx5KSAqLworI2RlZmluZSBVU0JfREVWSUNFX0JBVFRFUlkJCTIJLyogKHdpcmVsZXNzKSAqLworI2RlZmluZSBVU0JfREVWSUNFX0JfSE5QX0VOQUJMRQkJMwkvKiAob3RnKSBkZXYgbWF5IGluaXRpYXRlIEhOUCAqLworI2RlZmluZSBVU0JfREVWSUNFX1dVU0JfREVWSUNFCQkzCS8qICh3aXJlbGVzcykqLworI2RlZmluZSBVU0JfREVWSUNFX0FfSE5QX1NVUFBPUlQJNAkvKiAob3RnKSBSSCBwb3J0IHN1cHBvcnRzIEhOUCAqLworI2RlZmluZSBVU0JfREVWSUNFX0FfQUxUX0hOUF9TVVBQT1JUCTUJLyogKG90Zykgb3RoZXIgUkggcG9ydCBkb2VzICovCiAjZGVmaW5lIFVTQl9ERVZJQ0VfREVCVUdfTU9ERQkJNgkvKiAoc3BlY2lhbCBkZXZpY2VzIG9ubHkpICovCiAKICNkZWZpbmUgVVNCX0VORFBPSU5UX0hBTFQJCTAJLyogSU4vT1VUIHdpbGwgU1RBTEwgKi8KQEAgLTEzNSw2ICsxNTIsMTMgQEAKICNkZWZpbmUgVVNCX0RUX09URwkJCTB4MDkKICNkZWZpbmUgVVNCX0RUX0RFQlVHCQkJMHgwYQogI2RlZmluZSBVU0JfRFRfSU5URVJGQUNFX0FTU09DSUFUSU9OCTB4MGIKKy8qIHRoZXNlIGFyZSBmcm9tIHRoZSBXaXJlbGVzcyBVU0Igc3BlYyAqLworI2RlZmluZSBVU0JfRFRfU0VDVVJJVFkJCQkweDBjCisjZGVmaW5lIFVTQl9EVF9LRVkJCQkweDBkCisjZGVmaW5lIFVTQl9EVF9FTkNSWVBUSU9OX1RZUEUJCTB4MGUKKyNkZWZpbmUgVVNCX0RUX0JPUwkJCTB4MGYKKyNkZWZpbmUgVVNCX0RUX0RFVklDRV9DQVBBQklMSVRZCTB4MTAKKyNkZWZpbmUgVVNCX0RUX1dJUkVMRVNTX0VORFBPSU5UX0NPTVAJMHgxMQogCiAvKiBjb252ZW50aW9uYWwgY29kZXMgZm9yIGNsYXNzLXNwZWNpZmljIGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIFVTQl9EVF9DU19ERVZJQ0UJCTB4MjEKQEAgLTE5Miw2ICsyMTYsNyBAQAogI2RlZmluZSBVU0JfQ0xBU1NfQ1NDSUQJCQkweDBiCS8qIGNoaXArIHNtYXJ0IGNhcmQgKi8KICNkZWZpbmUgVVNCX0NMQVNTX0NPTlRFTlRfU0VDCQkweDBkCS8qIGNvbnRlbnQgc2VjdXJpdHkgKi8KICNkZWZpbmUgVVNCX0NMQVNTX1ZJREVPCQkJMHgwZQorI2RlZmluZSBVU0JfQ0xBU1NfV0lSRUxFU1NfQ09OVFJPTExFUgkweGUwCiAjZGVmaW5lIFVTQl9DTEFTU19BUFBfU1BFQwkJMHhmZQogI2RlZmluZSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMJCTB4ZmYKIApAQCAtMjIzLDYgKzI0OCw3IEBACiAjZGVmaW5lIFVTQl9DT05GSUdfQVRUX09ORQkJKDEgPDwgNykJLyogbXVzdCBiZSBzZXQgKi8KICNkZWZpbmUgVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSCSgxIDw8IDYpCS8qIHNlbGYgcG93ZXJlZCAqLwogI2RlZmluZSBVU0JfQ09ORklHX0FUVF9XQUtFVVAJCSgxIDw8IDUpCS8qIGNhbiB3YWtldXAgKi8KKyNkZWZpbmUgVVNCX0NPTkZJR19BVFRfQkFUVEVSWQkJKDEgPDwgNCkJLyogYmF0dGVyeSBwb3dlcmVkICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTI2OCw4ICsyOTQsOCBAQAogCV9fbGUxNiB3TWF4UGFja2V0U2l6ZTsKIAlfX3U4ICBiSW50ZXJ2YWw7CiAKLQkvLyBOT1RFOiAgdGhlc2UgdHdvIGFyZSBfb25seV8gaW4gYXVkaW8gZW5kcG9pbnRzLgotCS8vIHVzZSBVU0JfRFRfRU5EUE9JTlQqX1NJWkUgaW4gYkxlbmd0aCwgbm90IHNpemVvZi4KKwkvKiBOT1RFOiAgdGhlc2UgdHdvIGFyZSBfb25seV8gaW4gYXVkaW8gZW5kcG9pbnRzLiAqLworCS8qIHVzZSBVU0JfRFRfRU5EUE9JTlQqX1NJWkUgaW4gYkxlbmd0aCwgbm90IHNpemVvZi4gKi8KIAlfX3U4ICBiUmVmcmVzaDsKIAlfX3U4ICBiU3luY2hBZGRyZXNzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CkBAIC0yODksNiArMzE1LDcgQEAKICNkZWZpbmUgVVNCX0VORFBPSU5UX1hGRVJfSVNPQwkJMQogI2RlZmluZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCQkyCiAjZGVmaW5lIFVTQl9FTkRQT0lOVF9YRkVSX0lOVAkJMworI2RlZmluZSBVU0JfRU5EUE9JTlRfTUFYX0FESlVTVEFCTEUJMHg4MAogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0zNTIsMTIgKzM3OSwxNTQgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorLyogVVNCX0RUX1NFQ1VSSVRZOiAgZ3JvdXAgb2Ygd2lyZWxlc3Mgc2VjdXJpdHkgZGVzY3JpcHRvcnMsIGluY2x1ZGluZworICogZW5jcnlwdGlvbiB0eXBlcyBhdmFpbGFibGUgZm9yIHNldHRpbmcgdXAgYSBDQy9hc3NvY2lhdGlvbi4KKyAqLworc3RydWN0IHVzYl9zZWN1cml0eV9kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsKKworCV9fbGUxNiB3VG90YWxMZW5ndGg7CisJX191OCAgYk51bUVuY3J5cHRpb25UeXBlczsKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFVTQl9EVF9LRVk6ICB1c2VkIHdpdGgge0dFVCxTRVR9X1NFQ1VSSVRZX0RBVEE7IG9ubHkgcHVibGljIGtleXMKKyAqIG1heSBiZSByZXRyaWV2ZWQuCisgKi8KK3N0cnVjdCB1c2Jfa2V5X2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCisJX191OCAgdFRLSURbM107CisJX191OCAgYlJlc2VydmVkOworCV9fdTggIGJLZXlEYXRhWzBdOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0VOQ1JZUFRJT05fVFlQRTogIGJ1bmRsZWQgaW4gRFRfU0VDVVJJVFkgZ3JvdXBzICovCitzdHJ1Y3QgdXNiX2VuY3J5cHRpb25fZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiRW5jcnlwdGlvblR5cGU7CisjZGVmaW5lCVVTQl9FTkNfVFlQRV9VTlNFQ1VSRQkJMAorI2RlZmluZQlVU0JfRU5DX1RZUEVfV0lSRUQJCTEJLyogbm9uLXdpcmVsZXNzIG1vZGUgKi8KKyNkZWZpbmUJVVNCX0VOQ19UWVBFX0NDTV8xCQkyCS8qIGFlczEyOC9jYmMgc2Vzc2lvbiAqLworI2RlZmluZQlVU0JfRU5DX1RZUEVfUlNBXzEJCTMJLyogcnNhMzA3Mi9zaGExIGF1dGggKi8KKwlfX3U4ICBiRW5jcnlwdGlvblZhbHVlOwkJLyogdXNlIGluIFNFVF9FTkNSWVBUSU9OICovCisJX191OCAgYkF1dGhLZXlJbmRleDsKK307CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0JPUzogIGdyb3VwIG9mIHdpcmVsZXNzIGNhcGFiaWxpdGllcyAqLworc3RydWN0IHVzYl9ib3NfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOworCV9fdTggIGJOdW1EZXZpY2VDYXBzOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX0RUX0RFVklDRV9DQVBBQklMSVRZOiAgZ3JvdXBlZCB3aXRoIEJPUyAqLworc3RydWN0IHVzYl9kZXZfY2FwX2hlYWRlciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRldkNhcGFiaWxpdHlUeXBlOworfTsKKworI2RlZmluZQlVU0JfQ0FQX1RZUEVfV0lSRUxFU1NfVVNCCTEKKworc3RydWN0IHVzYl93aXJlbGVzc19jYXBfZGVzY3JpcHRvciB7CS8qIFVsdHJhIFdpZGUgQmFuZCAqLworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOworCV9fdTggIGJEZXZDYXBhYmlsaXR5VHlwZTsKKworCV9fdTggIGJtQXR0cmlidXRlczsKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1AyUF9EUkQJCSgxIDw8IDEpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19CRUFDT05fTUFTSwkoMyA8PCAyKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX1NFTEYJKDEgPDwgMikKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX0JFQUNPTl9ESVJFQ1RFRAkoMiA8PCAyKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfQkVBQ09OX05PTkUJKDMgPDwgMikKKwlfX2xlMTYgd1BIWVJhdGVzOwkvKiBiaXQgcmF0ZXMsIE1icHMgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV81MwkJKDEgPDwgMCkJLyogYWx3YXlzIHNldCAqLworI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzgwCQkoMSA8PCAxKQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzEwNwkJKDEgPDwgMikJLyogYWx3YXlzIHNldCAqLworI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzE2MAkJKDEgPDwgMykKKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8yMDAJCSgxIDw8IDQpCS8qIGFsd2F5cyBzZXQgKi8KKyNkZWZpbmUJVVNCX1dJUkVMRVNTX1BIWV8zMjAJCSgxIDw8IDUpCisjZGVmaW5lCVVTQl9XSVJFTEVTU19QSFlfNDAwCQkoMSA8PCA2KQorI2RlZmluZQlVU0JfV0lSRUxFU1NfUEhZXzQ4MAkJKDEgPDwgNykKKwlfX3U4ICBibVRGSVRYUG93ZXJJbmZvOwkvKiBURkkgcG93ZXIgbGV2ZWxzICovCisJX191OCAgYm1GRklUWFBvd2VySW5mbzsJLyogRkZJIHBvd2VyIGxldmVscyAqLworCV9fbGUxNiBibUJhbmRHcm91cDsKKwlfX3U4ICBiUmVzZXJ2ZWQ7Cit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBVU0JfRFRfV0lSRUxFU1NfRU5EUE9JTlRfQ09NUDogIGNvbXBhbmlvbiBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aAorICogZWFjaCBlbmRwb2ludCBkZXNjcmlwdG9yIGZvciBhIHdpcmVsZXNzIGRldmljZQorICovCitzdHJ1Y3QgdXNiX3dpcmVsZXNzX2VwX2NvbXBfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisKKwlfX3U4ICBiTWF4QnVyc3Q7CisJX191OCAgYk1heFNlcXVlbmNlOworCV9fbGUxNiB3TWF4U3RyZWFtRGVsYXk7CisJX19sZTE2IHdPdmVyVGhlQWlyUGFja2V0U2l6ZTsKKwlfX3U4ICBiT3ZlclRoZUFpckludGVydmFsOworCV9fdTggIGJtQ29tcEF0dHJpYnV0ZXM7CisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TV0lUQ0hfTUFTSwkweDAzCS8qIGluIGJtQ29tcEF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgVVNCX0VORFBPSU5UX1NXSVRDSF9OTwkJMAorI2RlZmluZSBVU0JfRU5EUE9JTlRfU1dJVENIX1NXSVRDSAkxCisjZGVmaW5lIFVTQl9FTkRQT0lOVF9TV0lUQ0hfU0NBTEUJMgorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX1JFUV9TRVRfSEFORFNIQUtFIGlzIGEgZm91ci13YXkgaGFuZHNoYWtlIHVzZWQgYmV0d2VlbiBhIHdpcmVsZXNzCisgKiBob3N0IGFuZCBhIGRldmljZSBmb3IgY29ubmVjdGlvbiBzZXQgdXAsIG11dHVhbCBhdXRoZW50aWNhdGlvbiwgYW5kCisgKiBleGNoYW5naW5nIHNob3J0IGxpdmVkIHNlc3Npb24ga2V5cy4gIFRoZSBoYW5kc2hha2UgZGVwZW5kcyBvbiBhIENDLgorICovCitzdHJ1Y3QgdXNiX2hhbmRzaGFrZSB7CisJX191OCBiTWVzc2FnZU51bWJlcjsKKwlfX3U4IGJTdGF0dXM7CisJX191OCB0VEtJRFszXTsKKwlfX3U4IGJSZXNlcnZlZDsKKwlfX3U4IENESURbMTZdOworCV9fdTggbm9uY2VbMTZdOworCV9fdTggTUlDWzhdOworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogVVNCX1JFUV9TRVRfQ09OTkVDVElPTiBtb2RpZmllcyBvciByZXZva2VzIGEgY29ubmVjdGlvbiBjb250ZXh0IChDQykuCisgKiBBIENDIG1heSBhbHNvIGJlIHNldCB1cCB1c2luZyBub24td2lyZWxlc3Mgc2VjdXJlIGNoYW5uZWxzIChpbmNsdWRpbmcKKyAqIHdpcmVkIFVTQiEpLCBhbmQgc29tZSBkZXZpY2VzIG1heSBzdXBwb3J0IENDcyB3aXRoIG11bHRpcGxlIGhvc3RzLgorICovCitzdHJ1Y3QgdXNiX2Nvbm5lY3Rpb25fY29udGV4dCB7CisJX191OCBDSElEWzE2XTsJCS8qIHBlcnNpc3RlbnQgaG9zdCBpZCAqLworCV9fdTggQ0RJRFsxNl07CQkvKiBkZXZpY2UgaWQgKHVuaXF1ZSB3L2luIGhvc3QgY29udGV4dCkgKi8KKwlfX3U4IENLWzE2XTsJCS8qIGNvbm5lY3Rpb24ga2V5ICovCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCiAvKiBVU0IgMi4wIGRlZmluZXMgdGhyZWUgc3BlZWRzLCBoZXJlJ3MgaG93IExpbnV4IGlkZW50aWZpZXMgdGhlbSAqLwogCiBlbnVtIHVzYl9kZXZpY2Vfc3BlZWQgewogCVVTQl9TUEVFRF9VTktOT1dOID0gMCwJCQkvKiBlbnVtZXJhdGluZyAqLwogCVVTQl9TUEVFRF9MT1csIFVTQl9TUEVFRF9GVUxMLAkJLyogdXNiIDEuMSAqLwotCVVTQl9TUEVFRF9ISUdICQkJCS8qIHVzYiAyLjAgKi8KKwlVU0JfU1BFRURfSElHSCwJCQkJLyogdXNiIDIuMCAqLworCVVTQl9TUEVFRF9WQVJJQUJMRSwJCQkvKiB3aXJlbGVzcyAodXNiIDIuNSkgKi8KIH07CiAKIGVudW0gdXNiX2RldmljZV9zdGF0ZSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl9nYWRnZXQuaCBiL2luY2x1ZGUvbGludXgvdXNiX2dhZGdldC5oCmluZGV4IDliYmE5OTkuLjcxZTYwODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiX2dhZGdldC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX2dhZGdldC5oCkBAIC0xMDcsMTggKzEwNywxOCBAQAogCWludCAoKmRpc2FibGUpIChzdHJ1Y3QgdXNiX2VwICplcCk7CiAKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QgKigqYWxsb2NfcmVxdWVzdCkgKHN0cnVjdCB1c2JfZXAgKmVwLAotCQlpbnQgZ2ZwX2ZsYWdzKTsKKwkJdW5zaWduZWQgZ2ZwX2ZsYWdzKTsKIAl2b2lkICgqZnJlZV9yZXF1ZXN0KSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKTsKIAogCXZvaWQgKigqYWxsb2NfYnVmZmVyKSAoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGJ5dGVzLAotCQlkbWFfYWRkcl90ICpkbWEsIGludCBnZnBfZmxhZ3MpOworCQlkbWFfYWRkcl90ICpkbWEsIHVuc2lnbmVkIGdmcF9mbGFncyk7CiAJdm9pZCAoKmZyZWVfYnVmZmVyKSAoc3RydWN0IHVzYl9lcCAqZXAsIHZvaWQgKmJ1ZiwgZG1hX2FkZHJfdCBkbWEsCiAJCXVuc2lnbmVkIGJ5dGVzKTsKIAkvLyBOT1RFOiAgb24gMi42LCBkcml2ZXJzIG1heSBhbHNvIHVzZSBkbWFfbWFwKCkgYW5kCiAJLy8gZG1hX3N5bmNfc2luZ2xlXyooKSB0byBkaXJlY3RseSBtYW5hZ2UgZG1hIG92ZXJoZWFkLiAKIAogCWludCAoKnF1ZXVlKSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLAotCQlpbnQgZ2ZwX2ZsYWdzKTsKKwkJdW5zaWduZWQgZ2ZwX2ZsYWdzKTsKIAlpbnQgKCpkZXF1ZXVlKSAoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKTsKIAogCWludCAoKnNldF9oYWx0KSAoc3RydWN0IHVzYl9lcCAqZXAsIGludCB2YWx1ZSk7CkBAIC0yMTQsNyArMjE0LDcgQEAKICAqIFJldHVybnMgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgb25lIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLXVzYl9lcF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGdmcF9mbGFncykKK3VzYl9lcF9hbGxvY19yZXF1ZXN0IChzdHJ1Y3QgdXNiX2VwICplcCwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXJldHVybiBlcC0+b3BzLT5hbGxvY19yZXF1ZXN0IChlcCwgZ2ZwX2ZsYWdzKTsKIH0KQEAgLTI1NCw3ICsyNTQsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgKgogdXNiX2VwX2FsbG9jX2J1ZmZlciAoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGxlbiwgZG1hX2FkZHJfdCAqZG1hLAotCWludCBnZnBfZmxhZ3MpCisJdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXJldHVybiBlcC0+b3BzLT5hbGxvY19idWZmZXIgKGVwLCBsZW4sIGRtYSwgZ2ZwX2ZsYWdzKTsKIH0KQEAgLTMzMCw3ICszMzAsNyBAQAogICogcmVwb3J0ZWQgd2hlbiB0aGUgdXNiIHBlcmlwaGVyYWwgaXMgZGlzY29ubmVjdGVkLgogICovCiBzdGF0aWMgaW5saW5lIGludAotdXNiX2VwX3F1ZXVlIChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsIGludCBnZnBfZmxhZ3MpCit1c2JfZXBfcXVldWUgKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgZ2ZwX2ZsYWdzKQogewogCXJldHVybiBlcC0+b3BzLT5xdWV1ZSAoZXAsIHJlcSwgZ2ZwX2ZsYWdzKTsKIH0KQEAgLTcxMSw3ICs3MTEsNyBAQAogICogCXRoZSBoYXJkd2FyZSBsZXZlbCBkcml2ZXIuIE1vc3QgY2FsbHMgbXVzdCBiZSBoYW5kbGVkIGJ5CiAgKiAJdGhlIGdhZGdldCBkcml2ZXIsIGluY2x1ZGluZyBkZXNjcmlwdG9yIGFuZCBjb25maWd1cmF0aW9uCiAgKiAJbWFuYWdlbWVudC4gIFRoZSAxNiBiaXQgbWVtYmVycyBvZiB0aGUgc2V0dXAgZGF0YSBhcmUgaW4KLSAqIAljcHUgb3JkZXIuIENhbGxlZCBpbl9pbnRlcnJ1cHQ7IHRoaXMgbWF5IG5vdCBzbGVlcC4gIERyaXZlcgorICogCVVTQiBieXRlIG9yZGVyLiBDYWxsZWQgaW5faW50ZXJydXB0OyB0aGlzIG1heSBub3Qgc2xlZXAuICBEcml2ZXIKICAqCXF1ZXVlcyBhIHJlc3BvbnNlIHRvIGVwMCwgb3IgcmV0dXJucyBuZWdhdGl2ZSB0byBzdGFsbC4KICAqIEBkaXNjb25uZWN0OiBJbnZva2VkIGFmdGVyIGFsbCB0cmFuc2ZlcnMgaGF2ZSBiZWVuIHN0b3BwZWQsCiAgKiAJd2hlbiB0aGUgaG9zdCBpcyBkaXNjb25uZWN0ZWQuICBNYXkgYmUgY2FsbGVkIGluX2ludGVycnVwdDsgdGhpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfaXNwMTE2eC5oIGIvaW5jbHVkZS9saW51eC91c2JfaXNwMTE2eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNWE5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl9pc3AxMTZ4LmgKQEAgLTAsMCArMSw0NyBAQAorCisvKgorICogQm9hcmQgaW5pdGlhbGl6YXRpb24gY29kZSBzaG91bGQgcHV0IG9uZSBvZiB0aGVzZSBpbnRvIGRldi0+cGxhdGZvcm1fZGF0YQorICogYW5kIHBsYWNlIHRoZSBpc3AxMTZ4IG9udG8gcGxhdGZvcm1fYnVzLgorICovCisKK3N0cnVjdCBpc3AxMTZ4X3BsYXRmb3JtX2RhdGEgeworCS8qIEVuYWJsZSBpbnRlcm5hbCByZXNpc3RvcnMgb24gZG93bnN0cmVhbSBwb3J0cyAqLworCXVuc2lnbmVkIHNlbDE1S3JlczoxOworCS8qIENoaXAncyBpbnRlcm5hbCBjbG9jayB3b24ndCBiZSBzdG9wcGVkIGluIHN1c3BlbmRlZCBzdGF0ZS4KKwkgICBTZXR0aW5nL3Vuc2V0dGluZyB0aGlzIGJpdCB0YWtlcyBlZmZlY3Qgb25seSBpZgorCSAgICdyZW1vdGVfd2FrZXVwX2VuYWJsZScgYmVsb3cgaXMgbm90IHNldC4gKi8KKwl1bnNpZ25lZCBjbGtub3RzdG9wOjE7CisJLyogT24tY2hpcCBvdmVyY3VycmVudCBwcm90ZWN0aW9uICovCisJdW5zaWduZWQgb2NfZW5hYmxlOjE7CisJLyogSU5UIG91dHB1dCBwb2xhcml0eSAqLworCXVuc2lnbmVkIGludF9hY3RfaGlnaDoxOworCS8qIElOVCBlZGdlIG9yIGxldmVsIHRyaWdnZXJlZCAqLworCXVuc2lnbmVkIGludF9lZGdlX3RyaWdnZXJlZDoxOworCS8qIFdBS0VVUCBwaW4gY29ubmVjdGVkIC0gTk9UIFNVUFBPUlRFRCAgKi8KKwkvKiB1bnNpZ25lZCByZW1vdGVfd2FrZXVwX2Nvbm5lY3RlZDoxOyAqLworCS8qIFdha2V1cCBieSBkZXZpY2VzIG9uIHVzYiBidXMgZW5hYmxlZCAqLworCXVuc2lnbmVkIHJlbW90ZV93YWtldXBfZW5hYmxlOjE7CisJLyogU3dpdGNoIG9yIG5vdCB0byBzd2l0Y2ggKGtlZXAgYWx3YXlzIHBvd2VyZWQpICovCisJdW5zaWduZWQgbm9fcG93ZXJfc3dpdGNoaW5nOjE7CisJLyogR2FuZ2VkIHBvcnQgcG93ZXIgc3dpdGNoaW5nICgwKSBvciBpbmRpdmlkdWFsIHBvcnQKKwkgICBwb3dlciBzd2l0Y2hpbmcgKDEpICovCisJdW5zaWduZWQgcG93ZXJfc3dpdGNoaW5nX21vZGU6MTsKKwkvKiBHaXZlbiBwb3J0X3Bvd2VyLCBtc2VjLzIgYWZ0ZXIgcG93ZXIgb24gdGlsbCBwb3dlciBnb29kICovCisJdTggcG90cGc7CisJLyogSGFyZHdhcmUgcmVzZXQgc2V0L2NsZWFyLiBJZiBpbXBsZW1lbnRlZCwgdGhpcyBmdW5jdGlvbiBtdXN0OgorCSAgIGlmIHNldCA9PSAwLCAgIGRlYXNzZXJ0IGNoaXAncyBIVyByZXNldCBwaW4KKwkgICBvdGhlcndpc2UsICAgICBhc3NlcnQgY2hpcCdzIEhXIHJlc2V0IHBpbiAgICAgICAqLworCXZvaWQgKCpyZXNldCkgKHN0cnVjdCBkZXZpY2UgKiBkZXYsIGludCBzZXQpOworCS8qIEhhcmR3YXJlIGNsb2NrIHN0YXJ0L3N0b3AuIElmIGltcGxlbWVudGVkLCB0aGlzIGZ1bmN0aW9uIG11c3Q6CisJICAgaWYgc3RhcnQgPT0gMCwgICAgc3RvcCB0aGUgZXh0ZXJuYWwgY2xvY2sKKwkgICBvdGhlcndpc2UsICAgICAgICBzdGFydCB0aGUgZXh0ZXJuYWwgY2xvY2sKKwkgKi8KKwl2b2lkICgqY2xvY2spIChzdHJ1Y3QgZGV2aWNlICogZGV2LCBpbnQgc3RhcnQpOworCS8qIEludGVyLWlvIGRlbGF5IChucykuIFRoZSBjaGlwIGlzIHBpY2t5IGFib3V0IGFjY2VzcyB0aW1pbmdzOyBpdAorCSAgIGV4cGVjdHMgYXQgbGVhc3Q6CisJICAgMTUwbnMgZGVsYXkgYmV0d2VlbiBjb25zZWN1dGl2ZSBhY2Nlc3NlcyB0byBEQVRBX1JFRywKKwkgICAzMDBucyBkZWxheSBiZXR3ZWVuIGFjY2VzcyB0byBBRERSX1JFRyBhbmQgREFUQV9SRUcKKwkgICBPRSwgV0UgTVVTVCBOT1QgYmUgY2hhbmdlZCBkdXJpbmcgdGhlc2UgaW50ZXJ2YWxzCisJICovCisJdm9pZCAoKmRlbGF5KSAoc3RydWN0IGRldmljZSAqIGRldiwgaW50IGRlbGF5KTsKK307CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCA0ZTBlZGNlLi5hY2JmYzUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTIyMSw2ICsyMjEsOCBAQAogLyogIFZlbmRvci1zcGVjaWZpYyBmb3JtYXRzICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1dOVkEgICAgIHY0bDJfZm91cmNjKCdXJywnTicsJ1YnLCdBJykgLyogV2lubm92IGh3IGNvbXByZXNzICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9TTjlDMTBYICB2NGwyX2ZvdXJjYygnUycsJzknLCcxJywnMCcpIC8qIFNOOUMxMHggY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzEgICAgIHY0bDJfZm91cmNjKCdQJywnVycsJ0MnLCcxJykgLyogcHdjIG9sZGVyIHdlYmNhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMiAgICAgdjRsMl9mb3VyY2MoJ1AnLCdXJywnQycsJzInKSAvKiBwd2MgbmV3ZXIgd2ViY2FtICovCiAKIC8qCiAgKglGIE8gUiBNIEEgVCAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaCBiL2luY2x1ZGUvbGludXgvd2Fucm91dGVyLmgKaW5kZXggM2U4OWYwZi4uMWI2Yjc2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93YW5yb3V0ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhbnJvdXRlci5oCkBAIC01MTYsOCArNTE2LDcgQEAKIC8qIFB1YmxpYyBmdW5jdGlvbnMgYXZhaWxhYmxlIGZvciBkZXZpY2UgZHJpdmVycyAqLwogZXh0ZXJuIGludCByZWdpc3Rlcl93YW5fZGV2aWNlKHN0cnVjdCB3YW5fZGV2aWNlICp3YW5kZXYpOwogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3dhbl9kZXZpY2UoY2hhciAqbmFtZSk7Ci11bnNpZ25lZCBzaG9ydCB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK19fYmUxNiB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCB3YW5yb3V0ZXJfZW5jYXBzdWxhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgdW5zaWduZWQgc2hvcnQgdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IDEyNjJjYjQuLjU0MmRiYWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMTQsMTEgKzE0LDEzIEBACiAgKiBZZXMsIHdyaXRlYmFjay5oIHJlcXVpcmVzIHNjaGVkLmgKICAqIE5vLCBzY2hlZC5oIGlzIG5vdCBpbmNsdWRlZCBmcm9tIGhlcmUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGN1cnJlbnRfaXNfcGRmbHVzaCh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgdGFza19pc19wZGZsdXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlyZXR1cm4gY3VycmVudC0+ZmxhZ3MgJiBQRl9GTFVTSEVSOworCXJldHVybiB0YXNrLT5mbGFncyAmIFBGX0ZMVVNIRVI7CiB9CiAKKyNkZWZpbmUgY3VycmVudF9pc19wZGZsdXNoKCkJdGFza19pc19wZGZsdXNoKGN1cnJlbnQpCisKIC8qCiAgKiBmcy9mcy13cml0ZWJhY2suYwogICovCkBAIC04Myw3ICs4NSw3IEBACiAvKgogICogbW0vcGFnZS13cml0ZWJhY2suYwogICovCi1pbnQgd2FrZXVwX2JkZmx1c2gobG9uZyBucl9wYWdlcyk7CitpbnQgd2FrZXVwX3BkZmx1c2gobG9uZyBucl9wYWdlcyk7CiB2b2lkIGxhcHRvcF9pb19jb21wbGV0aW9uKHZvaWQpOwogdm9pZCBsYXB0b3Bfc3luY19jb21wbGV0aW9uKHZvaWQpOwogdm9pZCB0aHJvdHRsZV92bV93cml0ZW91dCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgveGF0dHJfYWNsLmggYi9pbmNsdWRlL2xpbnV4L3hhdHRyX2FjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTFmOWI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgveGF0dHJfYWNsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICBGaWxlOiBsaW51eC94YXR0cl9hY2wuaAotCi0gIChleHRlbmRlZCBhdHRyaWJ1dGUgcmVwcmVzZW50YXRpb24gb2YgYWNjZXNzIGNvbnRyb2wgbGlzdHMpCi0KLSAgKEMpIDIwMDAgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgotKi8KLQotI2lmbmRlZiBfTElOVVhfWEFUVFJfQUNMX0gKLSNkZWZpbmUgX0xJTlVYX1hBVFRSX0FDTF9ICi0KLSNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KLQotI2RlZmluZSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MJInN5c3RlbS5wb3NpeF9hY2xfYWNjZXNzIgotI2RlZmluZSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUCSJzeXN0ZW0ucG9zaXhfYWNsX2RlZmF1bHQiCi0KLSNkZWZpbmUgWEFUVFJfQUNMX1ZFUlNJT04JMHgwMDAyCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlfX3UxNgkJZV90YWc7Ci0JX191MTYJCWVfcGVybTsKLQlfX3UzMgkJZV9pZDsKLX0geGF0dHJfYWNsX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JX191MzIJCWFfdmVyc2lvbjsKLQl4YXR0cl9hY2xfZW50cnkJYV9lbnRyaWVzWzBdOwotfSB4YXR0cl9hY2xfaGVhZGVyOwotCi1zdGF0aWMgaW5saW5lIHNpemVfdCB4YXR0cl9hY2xfc2l6ZShpbnQgY291bnQpCi17Ci0JcmV0dXJuIHNpemVvZih4YXR0cl9hY2xfaGVhZGVyKSArIGNvdW50ICogc2l6ZW9mKHhhdHRyX2FjbF9lbnRyeSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHhhdHRyX2FjbF9jb3VudChzaXplX3Qgc2l6ZSkKLXsKLQlpZiAoc2l6ZSA8IHNpemVvZih4YXR0cl9hY2xfaGVhZGVyKSkKLQkJcmV0dXJuIC0xOwotCXNpemUgLT0gc2l6ZW9mKHhhdHRyX2FjbF9oZWFkZXIpOwotCWlmIChzaXplICUgc2l6ZW9mKHhhdHRyX2FjbF9lbnRyeSkpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gc2l6ZSAvIHNpemVvZih4YXR0cl9hY2xfZW50cnkpOwotfQotCi1zdHJ1Y3QgcG9zaXhfYWNsICogcG9zaXhfYWNsX2Zyb21feGF0dHIoY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKTsKLWludCBwb3NpeF9hY2xfdG9feGF0dHIoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKLQotCi0KLSNlbmRpZiAvKiBfTElOVVhfWEFUVFJfQUNMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmggYi9pbmNsdWRlL21lZGlhL2F1ZGlvY2hpcC5oCmluZGV4IGQzZTllMzAuLmNkODMxMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvYXVkaW9jaGlwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9hdWRpb2NoaXAuaApAQCAtMSwzICsxLDcgQEAKKy8qCisgKiAkSWQ6IGF1ZGlvY2hpcC5oLHYgMS41IDIwMDUvMDYvMTYgMjI6NTk6MTYgaGhhY2ttYW5uIEV4cCAkCisgKi8KKwogI2lmbmRlZiBBVURJT0NISVBfSAogI2RlZmluZSBBVURJT0NISVBfSAogCkBAIC0zMSw1ICszNSw0IEBACiAKIC8qIG1pc2Mgc3R1ZmYgdG8gcGFzcyBhcm91bmQgY29uZmlnIGluZm8gdG8gaTJjIGNoaXBzICovCiAjZGVmaW5lIEFVRENfQ09ORklHX1BJTk5BQ0xFICBfSU9XKCdtJywzMixpbnQpCi0KICNlbmRpZiAvKiBBVURJT0NISVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9pZC5oIGIvaW5jbHVkZS9tZWRpYS9pZC5oCmluZGV4IDFiMDMyMGQuLmEzOWE2NDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvaWQuaAorKysgYi9pbmNsdWRlL21lZGlhL2lkLmgKQEAgLTEsMyArMSw3IEBACisvKgorICogJElkOiBpZC5oLHYgMS40IDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAorICovCisKIC8qIEZJWE1FOiB0aGlzIHRlbXBvcmFyZWx5LCB1bnRpbCB0aGVzZSBhcmUgaW5jbHVkZWQgaW4gbGludXgvaTJjLWlkLmggKi8KIAogLyogZHJpdmVycyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKaW5kZXggNjJjOTYzYS4uNjk4NjcwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaAorKysgYi9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICRJZDogaXItY29tbW9uLmgsdiAxLjggMjAwNS8wMi8yMiAxMjoyODo0MCBrcmF4ZWwgRXhwICQKKyAqICRJZDogaXItY29tbW9uLmgsdiAxLjkgMjAwNS8wNS8xNSAxOTowMToyNiBtY2hlaGFiIEV4cCAkCiAgKgogICogc29tZSBjb21tb24gc3RydWN0cyBhbmQgZnVuY3Rpb25zIHRvIGhhbmRsZSBpbmZyYXJlZCByZW1vdGVzIHZpYQogICogaW5wdXQgbGF5ZXIgLi4uCkBAIC01MCw2ICs1MCw3IEBACiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfd2luZmFzdFtJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW1wdHlbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2hhdXBwYXVnZV9uZXdbSVJfS0VZVEFCX1NJWkVdOworZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3BpeGVsdmlld1tJUl9LRVlUQUJfU0laRV07CiAKIHZvaWQgaXJfaW5wdXRfaW5pdChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHN0cnVjdCBpcl9pbnB1dF9zdGF0ZSAqaXIsCiAJCSAgIGludCBpcl90eXBlLCBJUl9LRVlUQUJfVFlQRSAqaXJfY29kZXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE2NzUyaHMuaCBiL2luY2x1ZGUvbWVkaWEvc2FhNjc1MmhzLmgKaW5kZXggNzkxYmFkMi4uM2I4Njg2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zYWE2NzUyaHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTY3NTJocy5oCkBAIC0xOCw1NSArMTgsNiBAQAogICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KIAotI2lmIDAgLyogbmRlZiBfU0FBNjc1MkhTX0ggKi8KLSNkZWZpbmUgX1NBQTY3NTJIU19ICi0KLWVudW0gbXBlZ192aWRlb19iaXRyYXRlX21vZGUgewotCU1QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiA9IDAsIC8qIFZhcmlhYmxlIGJpdHJhdGUgKi8KLQlNUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIgPSAxLCAvKiBDb25zdGFudCBiaXRyYXRlICovCi0KLQlNUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9NQVgKLX07Ci0KLWVudW0gbXBlZ19hdWRpb19iaXRyYXRlIHsKLQlNUEVHX0FVRElPX0JJVFJBVEVfMjU2ID0gMCwgLyogMjU2IGtCaXQvc2VjICovCi0JTVBFR19BVURJT19CSVRSQVRFXzM4NCA9IDEsIC8qIDM4NCBrQml0L3NlYyAqLwotCi0JTVBFR19BVURJT19CSVRSQVRFX01BWAotfTsKLQotZW51bSBtcGVnX3ZpZGVvX2Zvcm1hdCB7Ci0JTVBFR19WSURFT19GT1JNQVRfRDEgPSAwLAotCU1QRUdfVklERU9fRk9STUFUXzJfM19EMSA9IDEsCi0JTVBFR19WSURFT19GT1JNQVRfMV8yX0QxID0gMiwKLQlNUEVHX1ZJREVPX0ZPUk1BVF9TSUYgPSAzLAotCi0JTVBFR19WSURFT19GT1JNQVRfTUFYCi19OwotCi0jZGVmaW5lIE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYIDI3MDAwCi0jZGVmaW5lIE1QRUdfVklERU9fTUFYX0JJVFJBVEVfTUFYIDI3MDAwCi0jZGVmaW5lIE1QRUdfVE9UQUxfQklUUkFURV9NQVggMjcwMDAKLSNkZWZpbmUgTVBFR19QSURfTUFYICgoMSA8PCAxNCkgLSAxKQotCi1zdHJ1Y3QgbXBlZ19wYXJhbXMgewotCWVudW0gbXBlZ192aWRlb19iaXRyYXRlX21vZGUgdmlkZW9fYml0cmF0ZV9tb2RlOwotCXVuc2lnbmVkIGludCB2aWRlb190YXJnZXRfYml0cmF0ZTsKLQl1bnNpZ25lZCBpbnQgdmlkZW9fbWF4X2JpdHJhdGU7IC8vIG9ubHkgdXNlZCBmb3IgVkJSCi0JZW51bSBtcGVnX2F1ZGlvX2JpdHJhdGUgYXVkaW9fYml0cmF0ZTsKLQl1bnNpZ25lZCBpbnQgdG90YWxfYml0cmF0ZTsKLQotICAgCXVuc2lnbmVkIGludCBwbXRfcGlkOwotCXVuc2lnbmVkIGludCB2aWRlb19waWQ7Ci0JdW5zaWduZWQgaW50IGF1ZGlvX3BpZDsKLQl1bnNpZ25lZCBpbnQgcGNyX3BpZDsKLQotCWVudW0gbXBlZ192aWRlb19mb3JtYXQgdmlkZW9fZm9ybWF0OwotfTsKLQotI2RlZmluZSBNUEVHX1NFVFBBUkFNUyAgICAgICAgICAgICBfSU9XKCc2JywxMDAsc3RydWN0IG1wZWdfcGFyYW1zKQotCi0jZW5kaWYgLy8gX1NBQTY3NTJIU19ICiAKIC8qCiAgKiBMb2NhbCB2YXJpYWJsZXM6CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3R1bmVyLmggYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKaW5kZXggMTU2YTljNS4uZDhjMGE1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS90dW5lci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaApAQCAtMSw1ICsxLDYgQEAKIAotLyoKKy8qICRJZDogdHVuZXIuaCx2IDEuNDIgMjAwNS8wNy8wNiAwOTo0MjoxOSBtY2hlaGFiIEV4cCAkCisgKgogICAgIHR1bmVyLmggLSBkZWZpbml0aW9uIGZvciBkaWZmZXJlbnQgdHVuZXJzCiAKICAgICBDb3B5cmlnaHQgKEMpIDE5OTcgTWFya3VzIFNjaHJvZWRlciAoc2Nocm9lZG1AdW5pLWR1ZXNzZWxkb3JmLmRlKQpAQCAtMjMsNyArMjQsOSBAQAogI2lmbmRlZiBfVFVORVJfSAogI2RlZmluZSBfVFVORVJfSAogCi0jaW5jbHVkZSAiaWQuaCIKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2RlZmluZSBBRERSX1VOU0VUICgyNTUpCiAKICNkZWZpbmUgVFVORVJfVEVNSUNfUEFMICAgICAwICAgICAgICAvKiA0MDAyIEZINSAoM1ggNzc1NiwgOTQ4MykgKi8KICNkZWZpbmUgVFVORVJfUEhJTElQU19QQUxfSSAxCkBAIC04Niw3ICs4OSw3IEBACiAjZGVmaW5lIFRVTkVSX0xHX05UU0NfVEFQRSAgICAgICA0NwogCiAjZGVmaW5lIFRVTkVSX1RORl84ODMxQkdGRiAgICAgICA0OAotI2RlZmluZSBUVU5FUl9NSUNST1RVTkVfNDA0MkZJNSAgNDkJLyogRnVzaW9uSERUViAzIEdvbGQgLSA0MDQyIEZJNSAoM1ggODE0NykgKi8KKyNkZWZpbmUgVFVORVJfTUlDUk9UVU5FXzQwNDJGSTUgIDQ5CS8qIERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgLSA0MDQyIEZJNSAoM1ggODE0NykgKi8KICNkZWZpbmUgVFVORVJfVENMXzIwMDJOICAgICAgICAgIDUwCiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjU2X0lIMyAgIDUxCiAKQEAgLTk2LDcgKzk5LDE1IEBACiAjZGVmaW5lIFRVTkVSX0xHX1BBTF9UQVBFICAgICAgICA1NSAgICAvKiBIYXVwcGF1Z2UgUFZSLTE1MCBQQUwgKi8KIAogI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIxNkFNRV9NSzQgNTYgLyogSGF1cHBhdWdlIFBWUi0xNTAgUEFMICovCi0jZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjM2QV9NSzQgNTcgICAvKiBIYXVwcGF1Z2UgUFZSLTUwME1DRSBOVFNDICovCisjZGVmaW5lIFRVTkVSX1BISUxJUFNfRlExMjM2QV9NSzQgICA1NyAgIC8qIEhhdXBwYXVnZSBQVlItNTAwTUNFIE5UU0MgKi8KKworI2RlZmluZSBUVU5FUl9ZTUVDX1RWRl84NTMxTUYgNTgKKyNkZWZpbmUgVFVORVJfWU1FQ19UVkZfNTUzM01GIDU5CS8qIFBpeGVsdmlldyBQcm8gVWx0cmEgTlRTQyAqLworI2RlZmluZSBUVU5FUl9USE9NU09OX0RUVDc2MTEgNjAJLyogRFZpQ08gRnVzaW9uSERUViAzIEdvbGQtVCAqLworI2RlZmluZSBUVU5FUl9URU5BXzk1MzNfREkgICAgNjEKKworI2RlZmluZSBUVU5FUl9URUE1NzY3ICAgICAgICAgNjIJLyogT25seSBGTSBSYWRpbyBUdW5lciAqLworI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMgNjMKIAogI2RlZmluZSBOT1RVTkVSIDAKICNkZWZpbmUgUEFMICAgICAxCS8qIFBBTF9CRyAqLwpAQCAtMTA0LDYgKzExNSw3IEBACiAjZGVmaW5lIE5UU0MgICAgMwogI2RlZmluZSBTRUNBTSAgIDQKICNkZWZpbmUgQVRTQyAgICA1CisjZGVmaW5lIFJBRElPCTYKIAogI2RlZmluZSBOb1R1bmVyIDAKICNkZWZpbmUgUGhpbGlwcyAxCkBAIC0xMTksMTAgKzEzMSw5IEBACiAjZGVmaW5lIFRDTCAgICAgMTEKICNkZWZpbmUgVEhPTVNPTiAxMgogCi0jZGVmaW5lIFRVTkVSX1NFVF9UWVBFICAgICAgICAgICAgICAgX0lPVygndCcsMSxpbnQpICAgIC8qIHNldCB0dW5lciB0eXBlICovCi0jZGVmaW5lIFRVTkVSX1NFVF9UVkZSRVEgICAgICAgICAgICAgX0lPVygndCcsMixpbnQpICAgIC8qIHNldCB0diBmcmVxICovCisjZGVmaW5lIFRVTkVSX1NFVF9UWVBFX0FERFIgICAgICAgICAgX0lPVygnVCcsMyxpbnQpCisjZGVmaW5lIFREQTk4ODdfU0VUX0NPTkZJRyAgICAgICAgICAgX0lPVygndCcsNSxpbnQpCiAKLSNkZWZpbmUgIFREQTk4ODdfU0VUX0NPTkZJRyAgICAgICAgICBfSU9XKCd0Jyw1LGludCkKIC8qIHR2IGNhcmQgc3BlY2lmaWMgKi8KICMgZGVmaW5lIFREQTk4ODdfUFJFU0VOVCAgICAgICAgICAgICAoMTw8MCkKICMgZGVmaW5lIFREQTk4ODdfUE9SVDFfSU5BQ1RJVkUgICAgICAoMTw8MSkKQEAgLTE0MywxOSArMTU0LDM0IEBACiAjZGVmaW5lIEkyQ19BRERSX1REQTgyOTAgICAgICAgIDB4NGIKICNkZWZpbmUgSTJDX0FERFJfVERBODI3NSAgICAgICAgMHg2MQogCitlbnVtIHR1bmVyX21vZGUgeworCVRfVU5JTklUSUFMSVpFRCA9IDAsCisJVF9SQURJTwkJPSAxIDw8IFY0TDJfVFVORVJfUkFESU8sCisJVF9BTkFMT0dfVFYgICAgID0gMSA8PCBWNEwyX1RVTkVSX0FOQUxPR19UViwKKwlUX0RJR0lUQUxfVFYgICAgPSAxIDw8IFY0TDJfVFVORVJfRElHSVRBTF9UViwKKwlUX1NUQU5EQlkJPSAxIDw8IDMxCit9OworCitzdHJ1Y3QgdHVuZXJfc2V0dXAgeworCXVuc2lnbmVkIHNob3J0CQlhZGRyOworCXVuc2lnbmVkIGludAkJdHlwZTsKKwl1bnNpZ25lZCBpbnQJCW1vZGVfbWFzazsKK307CisKIHN0cnVjdCB0dW5lciB7CiAJLyogZGV2aWNlICovCiAJc3RydWN0IGkyY19jbGllbnQgaTJjOwogCi0JLyogc3RhdGUgKyBjb25maWcgKi8KLQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQ7CiAJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgICAgLyogY2hpcCB0eXBlICovCi0JdW5zaWduZWQgaW50IGZyZXE7ICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBzZXR0aW5ncyAqLwotCXY0bDJfc3RkX2lkICBzdGQ7Ci0JaW50ICAgICAgICAgIHVzaW5nX3Y0bDI7CiAKLQllbnVtIHY0bDJfdHVuZXJfdHlwZSBtb2RlOwotCXVuc2lnbmVkIGludCBpbnB1dDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgbW9kZTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgbW9kZV9tYXNrOyAvKiBDb21iaW5hdGlvbiBvZiBhbGxvd2FibGUgbW9kZXMgKi8KKworCXVuc2lnbmVkIGludCBmcmVxOyAgICAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc2V0dGluZ3MgKi8KKwl1bnNpZ25lZCBpbnQgYXVkbW9kZTsKKwl2NGwyX3N0ZF9pZCAgc3RkOworCisJaW50ICAgICAgICAgIHVzaW5nX3Y0bDI7CiAKIAkvKiB1c2VkIGJ5IE1UMjAzMiAqLwogCXVuc2lnbmVkIGludCB4b2djOwpAQCAtMTc3LDcgKzIwMyw5IEBACiAKIGV4dGVybiBpbnQgbWljcm90dW5lX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCB0ZGE4MjkwX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOworZXh0ZXJuIGludCB0ZWE1NzY3X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOwogZXh0ZXJuIGludCBkZWZhdWx0X3R1bmVyX2luaXQoc3RydWN0IGkyY19jbGllbnQgKmMpOworZXh0ZXJuIGludCB0ZWE1NzY3X2F1dG9kZXRlY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmMpOwogCiAjZGVmaW5lIHR1bmVyX3dhcm4oZm10LCBhcmcuLi4pIFwKIAlkZXZfcHJpbnRrKEtFUk5fV0FSTklORyAsICZ0LT5pMmMuZGV2ICwgZm10ICwgIyMgYXJnKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oIGIvaW5jbHVkZS9tZWRpYS90dmVlcHJvbS5oCmluZGV4IDYyNzYwM2UuLjVjNGZlMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHZlZXByb20uaAorKysgYi9pbmNsdWRlL21lZGlhL3R2ZWVwcm9tLmgKQEAgLTEsMyArMSw3IEBACisvKgorICogJElkOiB0dmVlcHJvbS5oLHYgMS4yIDIwMDUvMDYvMTIgMDQ6MTk6MTkgbWNoZWhhYiBFeHAgJAorICovCisKIHN0cnVjdCB0dmVlcHJvbSB7CiAJdTMyIGhhc19yYWRpbzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tdGQvbXRkLWFiaS5oIGIvaW5jbHVkZS9tdGQvbXRkLWFiaS5oCmluZGV4IGE3NmFiODkuLjQyOGQ5MTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbXRkL210ZC1hYmkuaAorKysgYi9pbmNsdWRlL210ZC9tdGQtYWJpLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogJElkOiBtdGQtYWJpLmgsdiAxLjcgMjAwNC8xMS8yMyAxNTozNzozMiBnbGVpeG5lciBFeHAgJAorICogJElkOiBtdGQtYWJpLmgsdiAxLjExIDIwMDUvMDUvMTkgMTY6MDg6NTggZ2xlaXhuZXIgRXhwICQKICAqCiAgKiBQb3J0aW9ucyBvZiBNVEQgQUJJIGRlZmluaXRpb24gd2hpY2ggYXJlIHNoYXJlZCBieSBrZXJuZWwgYW5kIHVzZXIgc3BhY2UgCiAgKi8KQEAgLTI5LDYgKzI5LDcgQEAKICNkZWZpbmUgTVREX05PUkZMQVNICQkzCiAjZGVmaW5lIE1URF9OQU5ERkxBU0gJCTQKICNkZWZpbmUgTVREX1BFUk9NCQk1CisjZGVmaW5lIE1URF9EQVRBRkxBU0gJCTYKICNkZWZpbmUgTVREX09USEVSCQkxNAogI2RlZmluZSBNVERfVU5LTk9XTgkJMTUKIApAQCAtNjAsNiArNjEsMTIgQEAKICNkZWZpbmUgTVREX05BTkRFQ0NfUExBQ0UJMQkvLyBVc2UgdGhlIGdpdmVuIHBsYWNlbWVudCBpbiB0aGUgc3RydWN0dXJlIChZQUZGUzEgbGVnYWN5IG1vZGUpCiAjZGVmaW5lIE1URF9OQU5ERUNDX0FVVE9QTEFDRQkyCS8vIFVzZSB0aGUgZGVmYXVsdCBwbGFjZW1lbnQgc2NoZW1lCiAjZGVmaW5lIE1URF9OQU5ERUNDX1BMQUNFT05MWQkzCS8vIFVzZSB0aGUgZ2l2ZW4gcGxhY2VtZW50IGluIHRoZSBzdHJ1Y3R1cmUgKERvIG5vdCBzdG9yZSBlY2MgcmVzdWx0IG9uIHJlYWQpCisjZGVmaW5lIE1URF9OQU5ERUNDX0FVVE9QTF9VU1IgCTQJLy8gVXNlIHRoZSBnaXZlbiBhdXRvcGxhY2VtZW50IHNjaGVtZSByYXRoZXIgdGhhbiB1c2luZyB0aGUgZGVmYXVsdAorCisvKiBPVFAgbW9kZSBzZWxlY3Rpb24gKi8KKyNkZWZpbmUgTVREX09UUF9PRkYJCTAKKyNkZWZpbmUgTVREX09UUF9GQUNUT1JZCQkxCisjZGVmaW5lIE1URF9PVFBfVVNFUgkJMgogCiBzdHJ1Y3QgbXRkX2luZm9fdXNlciB7CiAJdWludDhfdCB0eXBlOwpAQCAtODAsNiArODcsMTIgQEAKIAl1aW50MzJfdCByZWdpb25pbmRleDsKIH07CiAKK3N0cnVjdCBvdHBfaW5mbyB7CisJdWludDMyX3Qgc3RhcnQ7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQzMl90IGxvY2tlZDsKK307CisKICNkZWZpbmUgTUVNR0VUSU5GTyAgICAgICAgICAgICAgX0lPUignTScsIDEsIHN0cnVjdCBtdGRfaW5mb191c2VyKQogI2RlZmluZSBNRU1FUkFTRSAgICAgICAgICAgICAgICBfSU9XKCdNJywgMiwgc3RydWN0IGVyYXNlX2luZm9fdXNlcikKICNkZWZpbmUgTUVNV1JJVEVPT0IgICAgICAgICAgICAgX0lPV1IoJ00nLCAzLCBzdHJ1Y3QgbXRkX29vYl9idWYpCkBAIC05Miw2ICsxMDUsMTAgQEAKICNkZWZpbmUgTUVNR0VUT09CU0VMCQlfSU9SKCdNJywgMTAsIHN0cnVjdCBuYW5kX29vYmluZm8pCiAjZGVmaW5lIE1FTUdFVEJBREJMT0NLCQlfSU9XKCdNJywgMTEsIGxvZmZfdCkKICNkZWZpbmUgTUVNU0VUQkFEQkxPQ0sJCV9JT1coJ00nLCAxMiwgbG9mZl90KQorI2RlZmluZSBPVFBTRUxFQ1QJCV9JT1IoJ00nLCAxMywgaW50KQorI2RlZmluZSBPVFBHRVRSRUdJT05DT1VOVAlfSU9XKCdNJywgMTQsIGludCkKKyNkZWZpbmUgT1RQR0VUUkVHSU9OSU5GTwlfSU9XKCdNJywgMTUsIHN0cnVjdCBvdHBfaW5mbykKKyNkZWZpbmUgT1RQTE9DSwkJX0lPUignTScsIDE2LCBzdHJ1Y3Qgb3RwX2luZm8pCiAKIHN0cnVjdCBuYW5kX29vYmluZm8gewogCXVpbnQzMl90IHVzZWVjYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOTU4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogTWVyZ2VkIHdpdGggbWFpbmxpbmUgaWVlZTgwMjExLmggaW4gQXVnIDIwMDQuICBPcmlnaW5hbCBpZWVlODAyXzExCisgKiByZW1haW5zIGNvcHlyaWdodCBieSB0aGUgb3JpZ2luYWwgYXV0aG9ycworICoKKyAqIFBvcnRpb25zIG9mIHRoZSBtZXJnZWQgY29kZSBhcmUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MKKyAqIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlciBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICogPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+CisgKgorICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCisgKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgSUVFRTgwMjExX0gKKyNkZWZpbmUgSUVFRTgwMjExX0gKKworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+IC8qIEVUSF9BTEVOICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgLyogQVJSQVlfU0laRSAqLworCisjaWYgV0lSRUxFU1NfRVhUIDwgMTcKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX0lOVkFMSUQgICAweDEwCisjZGVmaW5lIElXX1FVQUxfTEVWRUxfSU5WQUxJRCAgMHgyMAorI2RlZmluZSBJV19RVUFMX05PSVNFX0lOVkFMSUQgIDB4NDAKKyNkZWZpbmUgSVdfUVVBTF9RVUFMX1VQREFURUQgICAweDEKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9VUERBVEVEICAweDIKKyNkZWZpbmUgSVdfUVVBTF9OT0lTRV9VUERBVEVEICAweDQKKyNlbmRpZgorCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTgkJMjMwNAorLyogTWF4aW11bSBzaXplIGZvciB0aGUgTUEtVU5JVERBVEEgcHJpbWl0aXZlLCA4MDIuMTEgc3RhbmRhcmQgc2VjdGlvbgorICAgNi4yLjEuMS4yLgorCisgICBUaGUgZmlndXJlIGluIHNlY3Rpb24gNy4xLjIgc3VnZ2VzdHMgYSBib2R5IHNpemUgb2YgdXAgdG8gMjMxMgorICAgYnl0ZXMgaXMgYWxsb3dlZCwgd2hpY2ggaXMgYSBiaXQgY29uZnVzaW5nLCBJIHN1c3BlY3QgdGhpcworICAgcmVwcmVzZW50cyB0aGUgMjMwNCBieXRlcyBvZiByZWFsIGRhdGEsIHBsdXMgYSBwb3NzaWJsZSA4IGJ5dGVzIG9mCisgICBXRVAgSVYgYW5kIElDVi4gKHRoaXMgaW50ZXJwcmV0YXRpb24gc3VnZ2VzdGVkIGJ5IFJhbWlybyBCYXJyZWlybykgKi8KKworCisjZGVmaW5lIElFRUU4MDIxMV9ITEVOCQkJMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTgkJKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorCitzdHJ1Y3QgaWVlZTgwMjExX2hkciB7CisJdTE2IGZyYW1lX2N0bDsKKwl1MTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJdTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKKwl1MTYgZnJhbWVfY3RsOworCXUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwl1MTYgc2VxX2N0bDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitlbnVtIGVhcF90eXBlIHsKKwlFQVBfUEFDS0VUID0gMCwKKwlFQVBPTF9TVEFSVCwKKwlFQVBPTF9MT0dPRkYsCisJRUFQT0xfS0VZLAorCUVBUE9MX0VOQ0FQX0FTRl9BTEVSVAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmVhcF90eXBlc1tdID0geworCVtFQVBfUEFDS0VUXQkJPSAiRUFQLVBhY2tldCIsCisJW0VBUE9MX1NUQVJUXQkJPSAiRUFQT0wtU3RhcnQiLAorCVtFQVBPTF9MT0dPRkZdCQk9ICJFQVBPTC1Mb2dvZmYiLAorCVtFQVBPTF9LRVldCQk9ICJFQVBPTC1LZXkiLAorCVtFQVBPTF9FTkNBUF9BU0ZfQUxFUlRdCT0gIkVBUE9MLUVuY2FwLUFTRi1BbGVydCIKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZWFwX2dldF90eXBlKGludCB0eXBlKQoreworCXJldHVybiAodHlwZSA+PSBBUlJBWV9TSVpFKGVhcF90eXBlcykpID8gIlVua25vd24iIDogZWFwX3R5cGVzW3R5cGVdOworfQorCitzdHJ1Y3QgZWFwb2wgeworCXU4IHNuYXBbNl07CisJdTE2IGV0aGVydHlwZTsKKwl1OCB2ZXJzaW9uOworCXU4IHR5cGU7CisJdTE2IGxlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIElFRUU4MDIxMV8xQUREUl9MRU4gMTAKKyNkZWZpbmUgSUVFRTgwMjExXzJBRERSX0xFTiAxNgorI2RlZmluZSBJRUVFODAyMTFfM0FERFJfTEVOIDI0CisjZGVmaW5lIElFRUU4MDIxMV80QUREUl9MRU4gMzAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDU19MRU4gICAgNAorCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCisKKy8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMgorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfVE9EUwkJMHgwMTAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX0ZST01EUwkJMHgwMjAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUwkweDA0MDAKKyNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUkVUUlkJCTB4MDgwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9QTQkJMHgxMDAwCisjZGVmaW5lIElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBCTB4MjAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9XRVAJCTB4NDAwMAorI2RlZmluZSBJRUVFODAyMTFfRkNUTF9PUkRFUgkJMHg4MDAwCisKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX01HTVQJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfQ1RMCQkweDAwMDQKKyNkZWZpbmUgSUVFRTgwMjExX0ZUWVBFX0RBVEEJCTB4MDAwOAorCisvKiBtYW5hZ2VtZW50ICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEJMHgwMDAwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQIAkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRCTB4MDA0MAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUAkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0JFQUNPTgkJMHgwMDgwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVElNCQkweDAwOTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQVVUSAkJMHgwMEIwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgJCTB4MDBDMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisKKy8qIGRhdGEgKi8KKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEEJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDSwkweDAwMTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMCTB4MDAyMAorI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRkFDS1BPTEwJMHgwMDMwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQwkweDAwNDAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGQUNLCQkweDAwNTAKKyNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NGUE9MTAkJMHgwMDYwCisjZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDS1BPTEwJMHgwMDcwCisKKyNkZWZpbmUgSUVFRTgwMjExX1NDVExfRlJBRwkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9TQ1RMX1NFUQkJMHhGRkYwCisKKworLyogZGVidWcgbWFjcm9zICovCisKKyNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCitleHRlcm4gdTMyIGllZWU4MDIxMV9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsgaWYgKGllZWU4MDIxMV9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpIFwKKyAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJWMgJXMgIiBmbXQsIFwKKyAgICAgICAgIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIElFRUU4MDIxMV9ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkvKiBDT05GSUdfSUVFRTgwMjExX0RFQlVHICovCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2Y6CisgKgorICogI2RlZmluZSBJRUVFODAyMTFfRExfeHh4eCBWQUxVRQorICoKKyAqIHNoaWZ0aW5nIHZhbHVlIHRvIHRoZSBsZWZ0IG9uZSBiaXQgZnJvbSB0aGUgcHJldmlvdXMgZW50cnkuICB4eHh4IHNob3VsZCBiZQorICogdGhlIG5hbWUgb2YgdGhlIGNsYXNzaWZpY2F0aW9uIChmb3IgZXhhbXBsZSwgV0VQKQorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElFRUU4MDIxMV94eHh4X0RFQlVHKCkgbWFjcm8gZGVmaW5pdGlvbiBmb3IgeW91cgorICogY2xhc3NpZmljYXRpb24sIG9yIHVzZSBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX3h4eHgsIC4uLikgd2hlbmV2ZXIgeW91IHdhbnQKKyAqIHRvIHNlbmQgb3V0cHV0IHRvIHRoYXQgY2xhc3NpZmljYXRpb24uCisgKgorICogVG8gYWRkIHlvdXIgZGVidWcgbGV2ZWwgdG8gdGhlIGxpc3Qgb2YgbGV2ZWxzIHNlZW4gd2hlbiB5b3UgcGVyZm9ybQorICoKKyAqICUgY2F0IC9wcm9jL25ldC9pcHcvZGVidWdfbGV2ZWwKKyAqCisgKiB5b3Ugc2ltcGx5IG5lZWQgdG8gYWRkIHlvdXIgZW50cnkgdG8gdGhlIGlwd19kZWJ1Z19sZXZlbHMgYXJyYXkuCisgKgorICogSWYgeW91IGRvIG5vdCBzZWUgZGVidWdfbGV2ZWwgaW4gL3Byb2MvbmV0L2lwdyB0aGVuIHlvdSBkbyBub3QgaGF2ZQorICogQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBkZWZpbmVkIGluIHlvdXIga2VybmVsIGNvbmZpZ3VyYXRpb24KKyAqCisgKi8KKworI2RlZmluZSBJRUVFODAyMTFfRExfSU5GTyAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1dYICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9TQ0FOICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFODAyMTFfRExfU1RBVEUgICAgICAgICAoMTw8MykKKyNkZWZpbmUgSUVFRTgwMjExX0RMX01HTVQgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9GUkFHICAgICAgICAgICgxPDw1KQorI2RlZmluZSBJRUVFODAyMTFfRExfRUFQICAgICAgICAgICAoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX0RMX0RST1AgICAgICAgICAgKDE8PDcpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RMX1RYICAgICAgICAgICAgKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9ETF9SWCAgICAgICAgICAgICgxPDw5KQorCisjZGVmaW5lIElFRUU4MDIxMV9FUlJPUihmLCBhLi4uKSBwcmludGsoS0VSTl9FUlIgImllZWU4MDIxMTogIiBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfV0FSTklORyhmLCBhLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HICJpZWVlODAyMTE6ICIgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0lORk8oZiwgYS4uLikgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lORk8sIGYsICMjIGEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1dYKGYsIGEuLi4pICAgICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1dYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU0NBTihmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU0NBTiwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1NUQVRFKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1NUQVRFLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfTUdNVChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9NR01ULCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRlJBRyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9GUkFHLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRUFQKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VBUCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX0RST1AoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRFJPUCwgZiwgIyMgYSkKKyNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1RYKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RYLCBmLCAjIyBhKQorI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUlgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlgsIGYsICMjIGEpCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQkJLy8gZW5hYmxlIGl3c3B5IHN1cHBvcnQKKyNlbmRpZgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CS8vIG5ldyBkcml2ZXIgQVBJCisKKyNpZm5kZWYgRVRIX1BfUEFFCisjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyIHsKKworICAgICAgICB1OCAgICBkc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisgICAgICAgIHU4ICAgIHNzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKyAgICAgICAgdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworICAgICAgICB1OCAgICBvdWlbUDgwMjExX09VSV9MRU5dOyAgICAvKiBvcmdhbml6YXRpb25hbCB1bml2ZXJzYWwgaWQgKi8KKworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgU05BUF9TSVpFIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NuYXBfaGRyKQorCisjZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCisjZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQorCisjZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkFHKHNlcSkgKChzZXEpICYgSUVFRTgwMjExX1NDVExfRlJBRykKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUShzZXEpICAoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCisKKy8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgV0xBTl9BVVRIX09QRU4gMAorI2RlZmluZSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAxCisKKyNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4CisKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0JTUyAoMTw8MCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lCU1MgKDE8PDEpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAoMTw8MikKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVCAoMTw8MykKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKDE8PDQpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSAoMTw8NSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BCQ0MgKDE8PDYpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DSEFOTkVMX0FHSUxJVFkgKDE8PDcpCisKKy8qIFN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBXTEFOX1NUQVRVU19TVUNDRVNTIDAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSAxCisjZGVmaW5lIFdMQU5fU1RBVFVTX0NBUFNfVU5TVVBQT1JURUQgMTAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyAxMQorI2RlZmluZSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfVU5TUEVDIDEyCisjZGVmaW5lIFdMQU5fU1RBVFVTX05PVF9TVVBQT1JURURfQVVUSF9BTEcgMTMKKyNkZWZpbmUgV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OIDE0CisjZGVmaW5lIFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMIDE1CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FVVEhfVElNRU9VVCAxNgorI2RlZmluZSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgMTcKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1JBVEVTIDE4CisvKiA4MDIuMTFiICovCisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUIDE5CisjZGVmaW5lIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgMjAKKyNkZWZpbmUgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PQUdJTElUWSAyMQorCisvKiBSZWFzb24gY29kZXMgKi8KKyNkZWZpbmUgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgMQorI2RlZmluZSBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEIDIKKyNkZWZpbmUgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgMworI2RlZmluZSBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA0CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgNQorI2RlZmluZSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA2CisjZGVmaW5lIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA3CisjZGVmaW5lIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA4CisjZGVmaW5lIFdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIIDkKKworCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NworCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQgkJICAgICAgICAweDAyCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUIJCSAgICAgICAgMHgwNAorI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1CCQkgICAgICAgIDB4MEIKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUIJCSAgICAgICAgMHgxNgorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKKyNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAorCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQorI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKKworI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKKyAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKKwlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKKyNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAorCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQorI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQorCisjZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAorI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0CisjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKKworCisKKworLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCisgKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKKyAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCitzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKKwl1MzIgbWFjX3RpbWU7CisJczggcnNzaTsKKwl1OCBzaWduYWw7CisJdTggbm9pc2U7CisJdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCisJdTggcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCBjb250cm9sOworCXU4IG1hc2s7CisJdTggZnJlcTsKKwl1MTYgbGVuOworfTsKKworLyogSUVFRSA4MDIuMTEgcmVxdWlyZXMgdGhhdCBTVEEgc3VwcG9ydHMgY29uY3VycmVudCByZWNlcHRpb24gb2YgYXQgbGVhc3QKKyAqIHRocmVlIGZyYWdtZW50ZWQgZnJhbWVzLiBUaGlzIGRlZmluZSBjYW4gYmUgaW5jcmVhc2VkIHRvIHN1cHBvcnQgbW9yZQorICogY29uY3VycmVudCBmcmFtZXMsIGJ1dCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBlYWNoIGVudHJ5IGNhbiBjb25zdW1lIGFib3V0CisgKiAyIGtCIG9mIFJBTSBhbmQgaW5jcmVhc2luZyBjYWNoZSBzaXplIHdpbGwgc2xvdyBkb3duIGZyYW1lIHJlYXNzZW1ibHkuICovCisjZGVmaW5lIElFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTiA0CisKK3N0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSB7CisJdW5zaWduZWQgbG9uZyBmaXJzdF9mcmFnX3RpbWU7CisJdW5zaWduZWQgaW50IHNlcTsKKwl1bnNpZ25lZCBpbnQgbGFzdF9mcmFnOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggc3JjX2FkZHJbRVRIX0FMRU5dOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKK307CisKK3N0cnVjdCBpZWVlODAyMTFfc3RhdHMgeworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCB0eF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgdHhfZGVmZXJyZWRfdHJhbnNtaXNzaW9uczsKKwl1bnNpZ25lZCBpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfbXVsdGlwbGVfcmV0cnlfZnJhbWVzOworCXVuc2lnbmVkIGludCB0eF9yZXRyeV9saW1pdF9leGNlZWRlZDsKKwl1bnNpZ25lZCBpbnQgdHhfZGlzY2FyZHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3RfZnJhbWVzOworCXVuc2lnbmVkIGludCByeF9mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X3VuaWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9tdWx0aWNhc3Rfb2N0ZXRzOworCXVuc2lnbmVkIGludCByeF9mY3NfZXJyb3JzOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc19ub19idWZmZXI7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzX3dyb25nX3NhOworCXVuc2lnbmVkIGludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX21zZ19mcmFnbWVudHM7CisJdW5zaWduZWQgaW50IHJ4X21lc3NhZ2VfaW5fYmFkX21zZ19mcmFnbWVudHM7Cit9OworCitzdHJ1Y3QgaWVlZTgwMjExX2RldmljZTsKKworI2lmIDAgLyogZm9yIGxhdGVyICovCisjaW5jbHVkZSAiaWVlZTgwMjExX2NyeXB0LmgiCisjZW5kaWYKKworI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKKyNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCisjZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQorI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKKyNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCisjZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQorCisjZGVmaW5lIFNFQ19MRVZFTF8wICAgICAgMCAvKiBOb25lICovCisjZGVmaW5lIFNFQ19MRVZFTF8xICAgICAgMSAvKiBXRVAgNDAgYW5kIDEwNCBiaXQgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzIgICAgICAyIC8qIExldmVsIDEgKyBUS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8yX0NLSVAgMyAvKiBMZXZlbCAxICsgQ0tJUCAqLworI2RlZmluZSBTRUNfTEVWRUxfMyAgICAgIDQgLyogTGV2ZWwgMiArIENDTVAgKi8KKworI2RlZmluZSBXRVBfS0VZUyA0CisjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCisKK3N0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgeworCXUxNiBhY3RpdmVfa2V5OjIsCisgICAgICAgICAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorICAgICAgICAgICAgYXV0aF9hbGdvOjQsCisgICAgICAgICAgICB1bmljYXN0X3VzZXNfZ3JvdXA6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCisvKgorCisgODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAorCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CitEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKKyAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisKKyovCisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCisjZGVmaW5lIE1GSUVfVFlQRV9TU0lEICAgICAgIDAKKyNkZWZpbmUgTUZJRV9UWVBFX1JBVEVTICAgICAgMQorI2RlZmluZSBNRklFX1RZUEVfRkhfU0VUICAgICAyCisjZGVmaW5lIE1GSUVfVFlQRV9EU19TRVQgICAgIDMKKyNkZWZpbmUgTUZJRV9UWVBFX0NGX1NFVCAgICAgNAorI2RlZmluZSBNRklFX1RZUEVfVElNICAgICAgICA1CisjZGVmaW5lIE1GSUVfVFlQRV9JQlNTX1NFVCAgIDYKKyNkZWZpbmUgTUZJRV9UWVBFX0NIQUxMRU5HRSAgMTYKKyNkZWZpbmUgTUZJRV9UWVBFX1JTTgkgICAgIDQ4CisjZGVmaW5lIE1GSUVfVFlQRV9SQVRFU19FWCAgIDUwCisjZGVmaW5lIE1GSUVfVFlQRV9HRU5FUklDICAgIDIyMQorCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgeworCXU4IGlkOworCXU4IGxlbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworICoKKwl1MTYgYXV0aF9hbGdvcml0aG07CisJdTE2IGF1dGhfc2VxdWVuY2U7CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXN0cnVjdCB7CisJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKKwl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgcmVhc29uOworCXUxNiBzdGF0dXM7CisqLworCitzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGFsZ29yaXRobTsKKwl1MTYgdHJhbnNhY3Rpb247CisJdTE2IHN0YXR1czsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgY2FwYWJpbGl0eTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CisJdTE2IGNhcGFiaWxpdHk7CisJdTE2IHN0YXR1czsKKwl1MTYgYWlkOworCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudDsgLyogc3VwcG9ydGVkIHJhdGVzICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworCitzdHJ1Y3QgaWVlZTgwMjExX3R4YiB7CisJdTggbnJfZnJhZ3M7CisJdTggZW5jcnlwdGVkOworCXUxNiByZXNlcnZlZDsKKwl1MTYgZnJhZ19zaXplOworCXUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKworLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLworI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKKy8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcworICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAorICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KKyNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCisjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQorI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAorCisjZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKworI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQorI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQorI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQorCitzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgeworCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwl1OCBjaGFubmVsOworCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCisJdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IHNzaWRfbGVuOworCisJLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLworCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7CisJdTE2IGNhcGFiaWxpdHk7CisJdTggcmF0ZXNbTUFYX1JBVEVTX0xFTkdUSF07CisJdTggcmF0ZXNfbGVuOworCXU4IHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOworCXU4IHJhdGVzX2V4X2xlbjsKKwl1bnNpZ25lZCBsb25nIGxhc3Rfc2Nhbm5lZDsKKwl1OCBtb2RlOworCXU4IGZsYWdzOworCXUzMiBsYXN0X2Fzc29jaWF0ZTsKKwl1MzIgdGltZV9zdGFtcFsyXTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJdTE2IGF0aW1fd2luZG93OworCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitlbnVtIGllZWU4MDIxMV9zdGF0ZSB7CisJSUVFRTgwMjExX1VOSU5JVElBTElaRUQgPSAwLAorCUlFRUU4MDIxMV9JTklUSUFMSVpFRCwKKwlJRUVFODAyMTFfQVNTT0NJQVRJTkcsCisJSUVFRTgwMjExX0FTU09DSUFURUQsCisJSUVFRTgwMjExX0FVVEhFTlRJQ0FUSU5HLAorCUlFRUU4MDIxMV9BVVRIRU5USUNBVEVELAorCUlFRUU4MDIxMV9TSFVURE9XTgorfTsKKworI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKKyNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgorI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKKyNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQorCisKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKKworc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisJc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOworCisJLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKKwlpbnQgc2NhbnM7CisJaW50IHNjYW5fYWdlOworCisJaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCisKKwlzcGlubG9ja190IGxvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZGVjcnlwdDsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlpbnQgd3BhX2VuYWJsZWQ7CisJaW50IGRyb3BfdW5lbmNyeXB0ZWQ7CisJaW50IHRraXBfY291bnRlcm1lYXN1cmVzOworCWludCBwcml2YWN5X2ludm9rZWQ7CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggKndwYV9pZTsKKworCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfZGVpbml0X2xpc3Q7CisJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdFtXRVBfS0VZU107CisJaW50IHR4X2tleWlkeDsgLyogZGVmYXVsdCBUWCBrZXkgaW5kZXggKGNyeXB0W3R4X2tleWlkeF0pICovCisJc3RydWN0IHRpbWVyX2xpc3QgY3J5cHRfZGVpbml0X3RpbWVyOworCisJaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgorCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KKworCS8qIEZyYWdtZW50YXRpb24gc3RydWN0dXJlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSBmcmFnX2NhY2hlW0lFRUU4MDIxMV9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHg7CisJdTE2IGZ0czsgLyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQgKi8KKworCS8qIEFzc29jaWF0aW9uIGluZm8gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisKKwllbnVtIGllZWU4MDIxMV9zdGF0ZSBzdGF0ZTsKKworCWludCBtb2RlOyAgICAgICAvKiBBLCBCLCBHICovCisJaW50IG1vZHVsYXRpb247IC8qIENDSywgT0ZETSAqLworCWludCBmcmVxX2JhbmQ7ICAvKiAyLjRHaHosIDUuMkdoeiwgTWl4ZWQgKi8KKwlpbnQgYWJnX3R1cmU7ICAgLyogQUJHIGZsYWcgICAgICAgICAgICAgICovCisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KKwl2b2lkICgqc2V0X3NlY3VyaXR5KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5ICpzZWMpOworCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKKwkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCisJICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19pZWVlODAyMTEgKi8KKwl1OCBwcml2WzBdOworfTsKKworI2RlZmluZSBJRUVFX0EgICAgICAgICAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIElFRUVfRyAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKK2V4dGVybiBpbmxpbmUgdm9pZCAqaWVlZTgwMjExX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc192YWxpZF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIElFRUU4MDIxMV8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IElFRUU4MDIxMV8zQUREUl9MRU47CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZmMpKSB7CisJY2FzZSBJRUVFODAyMTFfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIElFRUU4MDIxMV9GQ1RMX0ZST01EUykgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUykpCisJCQloZHJsZW4gPSBJRUVFODAyMTFfNEFERFJfTEVOOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6CisJCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpKSB7CisJCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKKwkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgorCQkJaGRybGVuID0gSUVFRTgwMjExXzFBRERSX0xFTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaGRybGVuID0gSUVFRTgwMjExXzJBRERSX0xFTjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiBoZHJsZW47Cit9CisKKworCisvKiBpZWVlODAyMTEuYyAqLworZXh0ZXJuIHZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2llZWU4MDIxMShpbnQgc2l6ZW9mX3ByaXYpOworCitleHRlcm4gaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7CisKKy8qIGllZWU4MDIxMV90eC5jICovCisKKworZXh0ZXJuIGludCBpZWVlODAyMTFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKKworCisvKiBpZWVlODAyMTFfcnguYyAqLworZXh0ZXJuIGludCBpZWVlODAyMTFfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBpZWVlODAyMTFfcnhfbWd0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7CisKKy8qIGllZTgwMjExX3d4LmMgKi8KK2V4dGVybiBpbnQgaWVlZTgwMjExX3d4X2dldF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CitleHRlcm4gaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKKworCitleHRlcm4gaW5saW5lIHZvaWQgaWVlZTgwMjExX2luY3JlbWVudF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5zY2FucysrOworfQorCitleHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQoreworCXJldHVybiBpZWVlLT5zY2FuczsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbikgeworCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07CisJY29uc3QgY2hhciAqcyA9IGVzc2lkOworCWNoYXIgKmQgPSBlc2NhcGVkOworCisJaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChlc3NpZCwgZXNzaWRfbGVuKSkgeworCQltZW1jcHkoZXNjYXBlZCwgIjxoaWRkZW4+Iiwgc2l6ZW9mKCI8aGlkZGVuPiIpKTsKKwkJcmV0dXJuIGVzY2FwZWQ7CisJfQorCisJZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKKwl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKKwkJaWYgKCpzID09ICdcMCcpIHsKKwkJCSpkKysgPSAnXFwnOworCQkJKmQrKyA9ICcwJzsKKwkJCXMrKzsKKwkJfSBlbHNlIHsKKwkJCSpkKysgPSAqcysrOworCQl9CisJfQorCSpkID0gJ1wwJzsKKwlyZXR1cm4gZXNjYXBlZDsKK30KKworI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHY2LmggYi9pbmNsdWRlL25ldC9pcHY2LmgKaW5kZXggNzcxYjQ3ZS4uNjkzMjQ0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lwdjYuaApAQCAtMTgzLDcgKzE4Myw2IEBACiAJc3RydWN0IGlwdjZfb3B0X2hkcgkqaG9wb3B0OwogCXN0cnVjdCBpcHY2X29wdF9oZHIJKmRzdDBvcHQ7CiAJc3RydWN0IGlwdjZfcnRfaGRyCSpzcmNydDsJLyogUm91dGluZyBIZWFkZXIgKi8KLQlzdHJ1Y3QgaXB2Nl9vcHRfaGRyCSphdXRoOwogCXN0cnVjdCBpcHY2X29wdF9oZHIJKmRzdDFvcHQ7CiAKIAkvKiBPcHRpb24gYnVmZmVyLCBhcyByZWFkIGJ5IElQVjZfUEtUT1BUSU9OUywgc3RhcnRzIGhlcmUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcmRhL2lyZGFfZGV2aWNlLmggYi9pbmNsdWRlL25ldC9pcmRhL2lyZGFfZGV2aWNlLmgKaW5kZXggNzFkNmFmOC4uOTJjODI4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXJkYS9pcmRhX2RldmljZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lyZGEvaXJkYV9kZXZpY2UuaApAQCAtMjI0LDcgKzIyNCw3IEBACiAvKiBJbnRlcmZhY2UgZm9yIGludGVybmFsIHVzZSAqLwogc3RhdGljIGlubGluZSBpbnQgaXJkYV9kZXZpY2VfdHhxdWV1ZV9lbXB0eShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiAoc2tiX3F1ZXVlX2xlbigmZGV2LT5xZGlzYy0+cSkgPT0gMCk7CisJcmV0dXJuIHNrYl9xdWV1ZV9lbXB0eSgmZGV2LT5xZGlzYy0+cSk7CiB9CiBpbnQgIGlyZGFfZGV2aWNlX3NldF9yYXdfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSogc2VsZiwgaW50IHN0YXR1cyk7CiBzdHJ1Y3QgbmV0X2RldmljZSAqYWxsb2NfaXJkYWRldihpbnQgc2l6ZW9mX3ByaXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmggYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAppbmRleCBmY2IwNWEzLi42NDkyZTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaApAQCAtMTMsMTMgKzEzLDEyIEBACiAKIGV4dGVybiByd2xvY2tfdCBxZGlzY190cmVlX2xvY2s7CiAKLSNkZWZpbmUJUURJU0NfQUxJR04JCTMyCi0jZGVmaW5lCVFESVNDX0FMSUdOX0NPTlNUCShRRElTQ19BTElHTiAtIDEpCisjZGVmaW5lIFFESVNDX0FMSUdOVE8JCTMyCisjZGVmaW5lIFFESVNDX0FMSUdOKGxlbikJKCgobGVuKSArIFFESVNDX0FMSUdOVE8tMSkgJiB+KFFESVNDX0FMSUdOVE8tMSkpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqcWRpc2NfcHJpdihzdHJ1Y3QgUWRpc2MgKnEpCiB7Ci0JcmV0dXJuIChjaGFyICopcSArICgoc2l6ZW9mKHN0cnVjdCBRZGlzYykgKyBRRElTQ19BTElHTl9DT05TVCkKLQkJCSAgICAgICYgflFESVNDX0FMSUdOX0NPTlNUKTsKKwlyZXR1cm4gKGNoYXIgKikgcSArIFFESVNDX0FMSUdOKHNpemVvZihzdHJ1Y3QgUWRpc2MpKTsKIH0KIAogLyogCkBAIC0yMDcsOCArMjA2LDYgQEAKIAogI2VuZGlmIC8qICFDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZICovCiAKLWV4dGVybiBzdHJ1Y3QgUWRpc2Mgbm9vcF9xZGlzYzsKLWV4dGVybiBzdHJ1Y3QgUWRpc2Nfb3BzIG5vb3BfcWRpc2Nfb3BzOwogZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgcGZpZm9fcWRpc2Nfb3BzOwogZXh0ZXJuIHN0cnVjdCBRZGlzY19vcHMgYmZpZm9fcWRpc2Nfb3BzOwogCkBAIC0yMTYsMTQgKzIxMyw2IEBACiBleHRlcm4gaW50IHVucmVnaXN0ZXJfcWRpc2Moc3RydWN0IFFkaXNjX29wcyAqcW9wcyk7CiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSk7CiBleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19sb29rdXBfY2xhc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSk7Ci1leHRlcm4gdm9pZCBkZXZfaW5pdF9zY2hlZHVsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfc2h1dGRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCBkZXZfZGVhY3RpdmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWV4dGVybiB2b2lkIHFkaXNjX3Jlc2V0KHN0cnVjdCBRZGlzYyAqcWRpc2MpOwotZXh0ZXJuIHZvaWQgcWRpc2NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKLWV4dGVybiBzdHJ1Y3QgUWRpc2MgKiBxZGlzY19jcmVhdGVfZGZsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBRZGlzY19vcHMgKm9wcyk7CiBleHRlcm4gc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnFkaXNjX2dldF9ydGFiKHN0cnVjdCB0Y19yYXRlc3BlYyAqciwKIAkJc3RydWN0IHJ0YXR0ciAqdGFiKTsKIGV4dGVybiB2b2lkIHFkaXNjX3B1dF9ydGFiKHN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICp0YWIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKaW5kZXggN2I5NzQwNS4uN2I2ZWM5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCkBAIC0xNjQsNiArMTY0LDE5IEBACiAjZGVmaW5lIHRjZl90cmVlX2xvY2sodHApCXFkaXNjX2xvY2tfdHJlZSgodHApLT5xLT5kZXYpCiAjZGVmaW5lIHRjZl90cmVlX3VubG9jayh0cCkJcWRpc2NfdW5sb2NrX3RyZWUoKHRwKS0+cS0+ZGV2KQogCitleHRlcm4gc3RydWN0IFFkaXNjIG5vb3BfcWRpc2M7CitleHRlcm4gc3RydWN0IFFkaXNjX29wcyBub29wX3FkaXNjX29wczsKKworZXh0ZXJuIHZvaWQgZGV2X2luaXRfc2NoZWR1bGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGV2X3NodXRkb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGV2X2FjdGl2YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZGV2X2RlYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBxZGlzY19yZXNldChzdHJ1Y3QgUWRpc2MgKnFkaXNjKTsKK2V4dGVybiB2b2lkIHFkaXNjX2Rlc3Ryb3koc3RydWN0IFFkaXNjICpxZGlzYyk7CitleHRlcm4gc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpOworZXh0ZXJuIHN0cnVjdCBRZGlzYyAqcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IFFkaXNjX29wcyAqb3BzKTsKKwogc3RhdGljIGlubGluZSB2b2lkCiB0Y2ZfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmggYi9pbmNsdWRlL25ldC9zY3RwL2NvbnN0YW50cy5oCmluZGV4IDQ4NjhjN2YuLjU5OTllNTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvY29uc3RhbnRzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaApAQCAtMjYzLDIzICsyNjMsMTEgQEAKIGVudW0geyBTQ1RQX01BWF9EVVBfVFNOUyA9IDE2IH07CiBlbnVtIHsgU0NUUF9NQVhfR0FCUyA9IDE2IH07CiAKLS8qIEhlcmUgd2UgZGVmaW5lIHRoZSBkZWZhdWx0IHRpbWVycy4gICovCisvKiBIZWFydGJlYXQgaW50ZXJ2YWwgLSAzMCBzZWNzICovCisjZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVAkoMzAgKiBIWikKIAotLyogY29va2llIHRpbWVyIGRlZiA9ID8gc2Vjb25kcyAqLwotI2RlZmluZSBTQ1RQX0RFRkFVTFRfVElNRU9VVF9UMV9DT09LSUUJKDMgKiBIWikKLQotLyogaW5pdCB0aW1lciBkZWYgPSAzIHNlY29uZHMgICovCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX1QxX0lOSVQJKDMgKiBIWikKLQotLyogc2h1dGRvd24gdGltZXIgZGVmID0gMzAwIG1zICovCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX1QyX1NIVVRET1dOICgoMzAwICogSFopIC8gMTAwMCkKLQotLyogMCBzZWNvbmRzICsgUlRPICovCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVAkoMTAgKiBIWikKLQotLyogcmVjdiB0aW1lciBkZWYgPSAyMDBtcyAoaW4gdXNlYykgKi8KKy8qIERlbGF5ZWQgc2FjayB0aW1lciAtIDIwMG1zICovCiAjZGVmaW5lIFNDVFBfREVGQVVMVF9USU1FT1VUX1NBQ0sJKCgyMDAgKiBIWikgLyAxMDAwKQotI2RlZmluZSBTQ1RQX0RFRkFVTFRfVElNRU9VVF9TQUNLX01BWAkoKDUwMCAqIEhaKSAvIDEwMDApIC8qIDUwMCBtcyAqLwogCiAvKiBSVE8uSW5pdGlhbCAgICAgICAgICAgICAgLSAzICBzZWNvbmRzCiAgKiBSVE8uTWluICAgICAgICAgICAgICAgICAgLSAxICBzZWNvbmQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKaW5kZXggZWYyNzM4MS4uNGEyNmFkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmgKQEAgLTEyNSw3ICsxMjUsOCBAQAogICovCiBleHRlcm4gc3RydWN0IHNvY2sgKnNjdHBfZ2V0X2N0bF9zb2NrKHZvaWQpOwogZXh0ZXJuIGludCBzY3RwX2NvcHlfbG9jYWxfYWRkcl9saXN0KHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLAotCQkJCSAgICAgc2N0cF9zY29wZV90LCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpOworCQkJCSAgICAgc2N0cF9zY29wZV90LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAorCQkJCSAgICAgaW50IGZsYWdzKTsKIGV4dGVybiBzdHJ1Y3Qgc2N0cF9wZiAqc2N0cF9nZXRfcGZfc3BlY2lmaWMoc2FfZmFtaWx5X3QgZmFtaWx5KTsKIGV4dGVybiBpbnQgc2N0cF9yZWdpc3Rlcl9wZihzdHJ1Y3Qgc2N0cF9wZiAqLCBzYV9mYW1pbHlfdCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc20uaCBiL2luY2x1ZGUvbmV0L3NjdHAvc20uaAppbmRleCBhNTNlMDhhLi41ODQ2MjE2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc20uaApAQCAtMTMxLDcgKzEzMSw2IEBACiBzY3RwX3N0YXRlX2ZuX3Qgc2N0cF9zZl9vb3RiOwogc2N0cF9zdGF0ZV9mbl90IHNjdHBfc2ZfcGRpc2NhcmQ7CiBzY3RwX3N0YXRlX2ZuX3Qgc2N0cF9zZl92aW9sYXRpb247Ci1zY3RwX3N0YXRlX2ZuX3Qgc2N0cF9zZl92aW9sYXRpb25fY2h1bmtsZW47CiBzY3RwX3N0YXRlX2ZuX3Qgc2N0cF9zZl9kaXNjYXJkX2NodW5rOwogc2N0cF9zdGF0ZV9mbl90IHNjdHBfc2ZfZG9fNV8yXzFfc2ltaW5pdDsKIHNjdHBfc3RhdGVfZm5fdCBzY3RwX3NmX2RvXzVfMl8yX2R1cGluaXQ7CkBAIC0xODIsMTcgKzE4MSwxNyBAQAogaW50IHNjdHBfY2h1bmtfaWlmKGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICopOwogc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKnNjdHBfbWFrZV90ZW1wX2Fzb2MoY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKiwKIAkJCQkJICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqLAotCQkJCQkgICAgIGludCBnZnApOworCQkJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogX191MzIgc2N0cF9nZW5lcmF0ZV92ZXJpZmljYXRpb25fdGFnKHZvaWQpOwogdm9pZCBzY3RwX3BvcHVsYXRlX3RpZV90YWdzKF9fdTggKmNvb2tpZSwgX191MzIgY3VyVGFnLCBfX3UzMiBoaXNUYWcpOwogCiAvKiBQcm90b3R5cGVzIGZvciBjaHVuay1idWlsZGluZyBmdW5jdGlvbnMuICAqLwogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9pbml0KGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLAotCQkJICAgICBpbnQgZ2ZwLCBpbnQgdnBhcmFtX2xlbik7CisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsIGludCB2cGFyYW1fbGVuKTsKIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfaW5pdF9hY2soY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKiwKLQkJCQkgY29uc3QgaW50IGdmcCwKKwkJCQkgY29uc3QgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKIAkJCQkgY29uc3QgaW50IHVua3BhcmFtX2xlbik7CiBzdHJ1Y3Qgc2N0cF9jaHVuayAqc2N0cF9tYWtlX2Nvb2tpZV9lY2hvKGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBzY3RwX2NodW5rICopOwpAQCAtMjU5LDExICsyNTgsNiBAQAogdm9pZCBzY3RwX2NodW5rX2Fzc2lnbl90c24oc3RydWN0IHNjdHBfY2h1bmsgKik7CiB2b2lkIHNjdHBfY2h1bmtfYXNzaWduX3NzbihzdHJ1Y3Qgc2N0cF9jaHVuayAqKTsKIAotc2N0cF9kaXNwb3NpdGlvbl90ICBzY3RwX3N0b3BfdDFfYW5kX2Fib3J0KHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKLQkJCQkJICAgX191MTYgZXJyb3IsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCQkJCQkgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci0KIC8qIFByb3RvdHlwZXMgZm9yIHN0YXRldGFibGUgcHJvY2Vzc2luZy4gKi8KIAogaW50IHNjdHBfZG9fc20oc2N0cF9ldmVudF90IGV2ZW50X3R5cGUsIHNjdHBfc3VidHlwZV90IHN1YnR5cGUsCkBAIC0yNzEsNyArMjY1LDcgQEAKICAgICAgICAgICAgICAgIHN0cnVjdCBzY3RwX2VuZHBvaW50ICosCiAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKICAgICAgICAgICAgICAgIHZvaWQgKmV2ZW50X2FyZywKLSAgICAgICAgICAgICAgIGludCBnZnApOworCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogLyogMm5kIGxldmVsIHByb3RvdHlwZXMgKi8KIHZvaWQgc2N0cF9nZW5lcmF0ZV90M19ydHhfZXZlbnQodW5zaWduZWQgbG9uZyBwZWVyKTsKQEAgLTI4MSw3ICsyNzUsOCBAQAogCiBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF91bnBhY2tfY29va2llKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICosCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCi0JCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICosIGludCBnZnAsIGludCAqZXJyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9jaHVuayAqLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLCBpbnQgKmVyciwKIAkJCQkgICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKiplcnJfY2hrX3ApOwogaW50IHNjdHBfYWRkaXBfYWRkcl9jb25maWcoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgc2N0cF9wYXJhbV90LAogCQkJICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmggYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAppbmRleCBkZmFkNGQzLi45OTQwMDliIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaApAQCAtMTYxLDYgKzE2MSw5IEBACiAJICovCiAJaW50IHNuZGJ1Zl9wb2xpY3k7CiAKKwkvKiBEZWxheWVkIFNBQ0sgdGltZW91dCAgMjAwbXMgZGVmYXVsdCovCisJaW50IHNhY2tfdGltZW91dDsKKwogCS8qIEhCLmludGVydmFsCQkgICAgLSAzMCBzZWNvbmRzICAqLwogCWludCBoYl9pbnRlcnZhbDsKIApAQCAtMjE3LDYgKzIyMCw3IEBACiAjZGVmaW5lIHNjdHBfc25kYnVmX3BvbGljeQkgCShzY3RwX2dsb2JhbHMuc25kYnVmX3BvbGljeSkKICNkZWZpbmUgc2N0cF9tYXhfcmV0cmFuc19wYXRoCQkoc2N0cF9nbG9iYWxzLm1heF9yZXRyYW5zX3BhdGgpCiAjZGVmaW5lIHNjdHBfbWF4X3JldHJhbnNfaW5pdAkJKHNjdHBfZ2xvYmFscy5tYXhfcmV0cmFuc19pbml0KQorI2RlZmluZSBzY3RwX3NhY2tfdGltZW91dAkJKHNjdHBfZ2xvYmFscy5zYWNrX3RpbWVvdXQpCiAjZGVmaW5lIHNjdHBfaGJfaW50ZXJ2YWwJCShzY3RwX2dsb2JhbHMuaGJfaW50ZXJ2YWwpCiAjZGVmaW5lIHNjdHBfbWF4X2luc3RyZWFtcwkJKHNjdHBfZ2xvYmFscy5tYXhfaW5zdHJlYW1zKQogI2RlZmluZSBzY3RwX21heF9vdXRzdHJlYW1zCQkoc2N0cF9nbG9iYWxzLm1heF9vdXRzdHJlYW1zKQpAQCAtNDQxLDcgKzQ0NSw4IEBACiAJaW50IG1hbGxvY2VkOwogfTsKIAotc3RydWN0IHNjdHBfc3NubWFwICpzY3RwX3Nzbm1hcF9uZXcoX191MTYgaW4sIF9fdTE2IG91dCwgaW50IGdmcCk7CitzdHJ1Y3Qgc2N0cF9zc25tYXAgKnNjdHBfc3NubWFwX25ldyhfX3UxNiBpbiwgX191MTYgb3V0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIHZvaWQgc2N0cF9zc25tYXBfZnJlZShzdHJ1Y3Qgc2N0cF9zc25tYXAgKm1hcCk7CiB2b2lkIHNjdHBfc3NubWFwX2NsZWFyKHN0cnVjdCBzY3RwX3Nzbm1hcCAqbWFwKTsKIApAQCAtNTc4LDcgKzU4Myw2IEBACiB2b2lkIHNjdHBfY2h1bmtfZmFpbChzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBpbnQgZXJyb3IpOwogaW50IHNjdHBfY2h1bmtfYWJhbmRvbmVkKHN0cnVjdCBzY3RwX2NodW5rICopOwogCi0KIC8qIFJGQzI5NjAgMS40IEtleSBUZXJtcwogICoKICAqIG8gQ2h1bms6IEEgdW5pdCBvZiBpbmZvcm1hdGlvbiB3aXRoaW4gYW4gU0NUUCBwYWNrZXQsIGNvbnNpc3Rpbmcgb2YKQEAgLTU4OCwxMyArNTkyLDggQEAKICAqIGVhY2ggY2h1bmsgYXMgd2VsbCBhcyBhIGZldyBvdGhlciBoZWFkZXIgcG9pbnRlcnMuLi4KICAqLwogc3RydWN0IHNjdHBfY2h1bmsgewotCS8qIFRoZXNlIGZpcnN0IHRocmVlIGVsZW1lbnRzIE1VU1QgUFJFQ0lTRUxZIG1hdGNoIHRoZSBmaXJzdAotCSAqIHRocmVlIGVsZW1lbnRzIG9mIHN0cnVjdCBza19idWZmLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmV1c2UKLQkgKiBhbGwgdGhlIHNrYl8qIHF1ZXVlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgotCSAqLwotCXN0cnVjdCBzY3RwX2NodW5rICpuZXh0OwotCXN0cnVjdCBzY3RwX2NodW5rICpwcmV2OwotCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCiAJYXRvbWljX3QgcmVmY250OwogCiAJLyogVGhpcyBpcyBvdXIgbGluayB0byB0aGUgcGVyLXRyYW5zcG9ydCB0cmFuc21pdHRlZCBsaXN0LiAgKi8KQEAgLTcxMyw3ICs3MTIsNyBAQAogCV9fdTMyIHZ0YWc7CiAKIAkvKiBUaGlzIGNvbnRhaW5zIHRoZSBwYXlsb2FkIGNodW5rcy4gICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBjaHVua3M7CisJc3RydWN0IGxpc3RfaGVhZCBjaHVua19saXN0OwogCiAJLyogVGhpcyBpcyB0aGUgb3ZlcmhlYWQgb2YgdGhlIHNjdHAgYW5kIGlwIGhlYWRlcnMuICovCiAJc2l6ZV90IG92ZXJoZWFkOwpAQCAtOTQ3LDcgKzk0Niw4IEBACiAJfSBjYWNjOwogfTsKIAotc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX3RyYW5zcG9ydF9uZXcoY29uc3QgdW5pb24gc2N0cF9hZGRyICosIGludCk7CitzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X25ldyhjb25zdCB1bmlvbiBzY3RwX2FkZHIgKiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogdm9pZCBzY3RwX3RyYW5zcG9ydF9zZXRfb3duZXIoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosCiAJCQkgICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqKTsKIHZvaWQgc2N0cF90cmFuc3BvcnRfcm91dGUoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosIHVuaW9uIHNjdHBfYWRkciAqLApAQCAtOTcwLDcgKzk3MCw3IEBACiAJLyogVGhpcyBpcyBhY3R1YWxseSBhIHF1ZXVlIG9mIHNjdHBfY2h1bmsgZWFjaAogCSAqIGNvbnRhaW5pbmcgYSBwYXJ0aWFsbHkgZGVjb2RlZCBwYWNrZXQuCiAJICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBpbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGluX2NodW5rX2xpc3Q7CiAJLyogVGhpcyBpcyB0aGUgcGFja2V0IHdoaWNoIGlzIGN1cnJlbnRseSBvZmYgdGhlIGluIHF1ZXVlIGFuZCBpcwogCSAqIGJlaW5nIHdvcmtlZCBvbiB0aHJvdWdoIHRoZSBpbmJvdW5kIGNodW5rIHByb2Nlc3NpbmcuCiAJICovCkBAIC0xMDEzLDcgKzEwMTMsNyBAQAogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCiAJLyogRGF0YSBwZW5kaW5nIHRoYXQgaGFzIG5ldmVyIGJlZW4gdHJhbnNtaXR0ZWQuICAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgb3V0OworCXN0cnVjdCBsaXN0X2hlYWQgb3V0X2NodW5rX2xpc3Q7CiAKIAl1bnNpZ25lZCBvdXRfcWxlbjsJLyogVG90YWwgbGVuZ3RoIG9mIHF1ZXVlZCBkYXRhIGNodW5rcy4gKi8KIApAQCAtMTAyMSw3ICsxMDIxLDcgQEAKIAl1bnNpZ25lZCBlcnJvcjsKIAogCS8qIFRoZXNlIGFyZSBjb250cm9sIGNodW5rcyB3ZSB3YW50IHRvIHNlbmQuICAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgY29udHJvbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnRyb2xfY2h1bmtfbGlzdDsKIAogCS8qIFRoZXNlIGFyZSBjaHVua3MgdGhhdCBoYXZlIGJlZW4gc2Fja2VkIGJ1dCBhcmUgYWJvdmUgdGhlCiAJICogQ1RTTiwgb3IgY3VtdWxhdGl2ZSB0c24gYWNrIHBvaW50LgpAQCAtMTA5NSw5ICsxMDk1LDEwIEBACiB2b2lkIHNjdHBfYmluZF9hZGRyX2ZyZWUoc3RydWN0IHNjdHBfYmluZF9hZGRyICopOwogaW50IHNjdHBfYmluZF9hZGRyX2NvcHkoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LAogCQkJY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpzcmMsCi0JCQlzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnAsaW50IGZsYWdzKTsKKwkJCXNjdHBfc2NvcGVfdCBzY29wZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKKwkJCWludCBmbGFncyk7CiBpbnQgc2N0cF9hZGRfYmluZF9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCB1bmlvbiBzY3RwX2FkZHIgKiwKLQkJICAgICAgIGludCBnZnApOworCQkgICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBpbnQgc2N0cF9kZWxfYmluZF9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCB1bmlvbiBzY3RwX2FkZHIgKik7CiBpbnQgc2N0cF9iaW5kX2FkZHJfbWF0Y2goc3RydWN0IHNjdHBfYmluZF9hZGRyICosIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqLAogCQkJIHN0cnVjdCBzY3RwX3NvY2sgKik7CkBAIC0xMTA2LDkgKzExMDcsMTAgQEAKIAkJCQkJaW50CQkJYWRkcmNudCwKIAkJCQkJc3RydWN0IHNjdHBfc29jawkqb3B0KTsKIHVuaW9uIHNjdHBfcGFyYW1zIHNjdHBfYmluZF9hZGRyc190b19yYXcoY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwKLQkJCQkJIGludCAqYWRkcnNfbGVuLCBpbnQgZ2ZwKTsKKwkJCQkJIGludCAqYWRkcnNfbGVuLAorCQkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBpbnQgc2N0cF9yYXdfdG9fYmluZF9hZGRycyhzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBfX3U4ICpyYXcsIGludCBsZW4sCi0JCQkgICBfX3UxNiBwb3J0LCBpbnQgZ2ZwKTsKKwkJCSAgIF9fdTE2IHBvcnQsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzY3RwX3Njb3BlX3Qgc2N0cF9zY29wZShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKik7CiBpbnQgc2N0cF9pbl9zY29wZShjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsIGNvbnN0IHNjdHBfc2NvcGVfdCBzY29wZSk7CkBAIC0xMjM3LDcgKzEyMzksNyBAQAogfQogCiAvKiBUaGVzZSBhcmUgZnVuY3Rpb24gc2lnbmF0dXJlcyBmb3IgbWFuaXB1bGF0aW5nIGVuZHBvaW50cy4gICovCi1zdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKiwgaW50KTsKK3N0cnVjdCBzY3RwX2VuZHBvaW50ICpzY3RwX2VuZHBvaW50X25ldyhzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogdm9pZCBzY3RwX2VuZHBvaW50X2ZyZWUoc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiB2b2lkIHNjdHBfZW5kcG9pbnRfcHV0KHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwogdm9pZCBzY3RwX2VuZHBvaW50X2hvbGQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CkBAIC0xMjU4LDcgKzEyNjAsNyBAQAogCQkgICAgIHN0cnVjdCBzY3RwX2NodW5rICoqZXJyX2NodW5rKTsKIGludCBzY3RwX3Byb2Nlc3NfaW5pdChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLCBzY3RwX2NpZF90IGNpZCwKIAkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwZWVyLAotCQkgICAgICBzY3RwX2luaXRfY2h1bmtfdCAqaW5pdCwgaW50IGdmcCk7CisJCSAgICAgIHNjdHBfaW5pdF9jaHVua190ICppbml0LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIF9fdTMyIHNjdHBfZ2VuZXJhdGVfdGFnKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICopOwogX191MzIgc2N0cF9nZW5lcmF0ZV90c24oY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKik7CiAKQEAgLTE2NjgsNyArMTY3MCw3IEBACiAJICogIHdoaWNoIGFscmVhZHkgcmVzaWRlcyBpbiBzY3RwX291dHEuCSBQbGVhc2UgbW92ZSB0aGlzCiAJICogIHF1ZXVlIGFuZCBpdHMgc3VwcG9ydGluZyBsb2dpYyBkb3duIHRoZXJlLgktLXBpZ2d5XQogCSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgYWRkaXBfY2h1bmtzOworCXN0cnVjdCBsaXN0X2hlYWQgYWRkaXBfY2h1bmtfbGlzdDsKIAogCS8qIEFERElQIFNlY3Rpb24gNC4xIEFTQ09ORiBDaHVuayBQcm9jZWR1cmVzCiAJICoKQEAgLTE3MjEsNyArMTcyMyw3IEBACiAKIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICoKIHNjdHBfYXNzb2NpYXRpb25fbmV3KGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICosIGNvbnN0IHN0cnVjdCBzb2NrICosCi0JCSAgICAgc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwKTsKKwkJICAgICBzY3RwX3Njb3BlX3Qgc2NvcGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogdm9pZCBzY3RwX2Fzc29jaWF0aW9uX2ZyZWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CiB2b2lkIHNjdHBfYXNzb2NpYXRpb25fcHV0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopOwogdm9pZCBzY3RwX2Fzc29jaWF0aW9uX2hvbGQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKik7CkBAIC0xNzM3LDcgKzE3MzksNyBAQAogCQkJICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqbGFkZHIpOwogc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpzY3RwX2Fzc29jX2FkZF9wZWVyKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosCiAJCQkJICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHJlc3MsCi0JCQkJICAgICBjb25zdCBpbnQgZ2ZwLAorCQkJCSAgICAgY29uc3QgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKIAkJCQkgICAgIGNvbnN0IGludCBwZWVyX3N0YXRlKTsKIHZvaWQgc2N0cF9hc3NvY19kZWxfcGVlcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCSBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIpOwpAQCAtMTc2MSw5ICsxNzYzLDExIEBACiB2b2lkIHNjdHBfYXNzb2NfcnduZF9kZWNyZWFzZShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLCB1bnNpZ25lZCk7CiB2b2lkIHNjdHBfYXNzb2Nfc2V0X3ByaW1hcnkoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCSAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKik7Ci1pbnQgc2N0cF9hc3NvY19zZXRfYmluZF9hZGRyX2Zyb21fZXAoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgaW50KTsKK2ludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9lcChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIGludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9jb29raWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKLQkJCQkJIHN0cnVjdCBzY3RwX2Nvb2tpZSosIGludCBnZnApOworCQkJCQkgc3RydWN0IHNjdHBfY29va2llKiwKKwkJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBpbnQgc2N0cF9jbXBfYWRkcl9leGFjdChjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnNzMSwKIAkJCWNvbnN0IHVuaW9uIHNjdHBfYWRkciAqc3MyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaCBiL2luY2x1ZGUvbmV0L3NjdHAvdWxwZXZlbnQuaAppbmRleCAxMDE5ZDgzLi45MGZlNGJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3VscGV2ZW50LmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBldmVudC5oCkBAIC04OCw3ICs4OCw3IEBACiAJX191MTYgZXJyb3IsCiAJX191MTYgb3V0Ym91bmQsCiAJX191MTYgaW5ib3VuZCwKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZWVyX2FkZHJfY2hhbmdlKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLApAQCAtOTYsMzUgKzk2LDM1IEBACiAJaW50IGZsYWdzLAogCWludCBzdGF0ZSwKIAlpbnQgZXJyb3IsCi0JaW50IGdmcCk7CisJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcmVtb3RlX2Vycm9yKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKIAlfX3UxNiBmbGFncywKLQlpbnQgZ2ZwKTsKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2Vfc2VuZF9mYWlsZWQoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAogCV9fdTE2IGZsYWdzLAogCV9fdTMyIGVycm9yLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3NodXRkb3duX2V2ZW50KAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCV9fdTE2IGZsYWdzLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3BkYXBpKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAotCV9fdTMyIGluZGljYXRpb24sIGludCBnZnApOworCV9fdTMyIGluZGljYXRpb24sIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX2FkYXB0aW9uX2luZGljYXRpb24oCi0JY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIGludCBnZnApOworCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9yY3Ztc2coc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCWludCBnZnApOworCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiB2b2lkIHNjdHBfdWxwZXZlbnRfcmVhZF9zbmRyY3ZpbmZvKGNvbnN0IHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCwKIAlzdHJ1Y3QgbXNnaGRyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oIGIvaW5jbHVkZS9uZXQvc2N0cC91bHBxdWV1ZS5oCmluZGV4IDk2MTczNmQuLjFhNjBjNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvdWxwcXVldWUuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3VscHF1ZXVlLmgKQEAgLTYyLDE5ICs2MiwyMiBAQAogdm9pZCBzY3RwX3VscHFfZnJlZShzdHJ1Y3Qgc2N0cF91bHBxICopOwogCiAvKiBBZGQgYSBuZXcgREFUQSBjaHVuayBmb3IgcHJvY2Vzc2luZy4gKi8KLWludCBzY3RwX3VscHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwgaW50KTsKK2ludCBzY3RwX3VscHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJCXVuc2lnbmVkIGludCBfX25vY2FzdCk7CiAKIC8qIEFkZCBhIG5ldyBldmVudCBmb3IgcHJvcGFnYXRpb24gdG8gdGhlIFVMUC4gKi8KIGludCBzY3RwX3VscHFfdGFpbF9ldmVudChzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpldik7CiAKIC8qIFJlbmVnZSBwcmV2aW91c2x5IHJlY2VpdmVkIGNodW5rcy4gICovCi12b2lkIHNjdHBfdWxwcV9yZW5lZ2Uoc3RydWN0IHNjdHBfdWxwcSAqLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqLCBpbnQpOwordm9pZCBzY3RwX3VscHFfcmVuZWdlKHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIAogLyogUGVyZm9ybSBwYXJ0aWFsIGRlbGl2ZXJ5LiAqLwotdm9pZCBzY3RwX3VscHFfcGFydGlhbF9kZWxpdmVyeShzdHJ1Y3Qgc2N0cF91bHBxICosIHN0cnVjdCBzY3RwX2NodW5rICosIGludCk7Cit2b2lkIHNjdHBfdWxwcV9wYXJ0aWFsX2RlbGl2ZXJ5KHN0cnVjdCBzY3RwX3VscHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKiwKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QpOwogCiAvKiBBYm9ydCB0aGUgcGFydGlhbCBkZWxpdmVyeS4gKi8KLXZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKiwgaW50KTsKK3ZvaWQgc2N0cF91bHBxX2Fib3J0X3BkKHN0cnVjdCBzY3RwX3VscHEgKiwgdW5zaWduZWQgaW50IF9fbm9jYXN0KTsKIAogLyogQ2xlYXIgdGhlIHBhcnRpYWwgZGF0YSBkZWxpdmVyeSBjb25kaXRpb24gb24gdGhpcyBzb2NrZXQuICovCiBpbnQgc2N0cF9jbGVhcl9wZChzdHJ1Y3Qgc29jayAqc2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2xoY192ai5oIGIvaW5jbHVkZS9uZXQvc2xoY192ai5oCmluZGV4IDBiMmMyNzguLjg3MTZkNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NsaGNfdmouaAorKysgYi9pbmNsdWRlL25ldC9zbGhjX3ZqLmgKQEAgLTE3MCwxOSArMTcwLDE0IEBACiB9OwogI2RlZmluZSBOVUxMU0xDT01QUgkoc3RydWN0IHNsY29tcHJlc3MgKikwCiAKLSNkZWZpbmUgX19BUkdTKHgpIHgKLQogLyogSW4gc2xoYy5jOiAqLwotc3RydWN0IHNsY29tcHJlc3MgKnNsaGNfaW5pdCBfX0FSR1MoKGludCByc2xvdHMsIGludCB0c2xvdHMpKTsKLXZvaWQgc2xoY19mcmVlIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXApKTsKK3N0cnVjdCBzbGNvbXByZXNzICpzbGhjX2luaXQoaW50IHJzbG90cywgaW50IHRzbG90cyk7Cit2b2lkIHNsaGNfZnJlZShzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCk7CiAKLWludCBzbGhjX2NvbXByZXNzIF9fQVJHUygoc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwKLQkJCSAgaW50IGlzaXplLCB1bnNpZ25lZCBjaGFyICpvY3AsIHVuc2lnbmVkIGNoYXIgKipjcHAsCi0JCQkgIGludCBjb21wcmVzc19jaWQpKTsKLWludCBzbGhjX3VuY29tcHJlc3MgX19BUkdTKChzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLAotCQkJICAgIGludCBpc2l6ZSkpOwotaW50IHNsaGNfcmVtZW1iZXIgX19BUkdTKChzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLAotCQkJICBpbnQgaXNpemUpKTsKLWludCBzbGhjX3Rvc3MgX19BUkdTKChzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCkpOworaW50IHNsaGNfY29tcHJlc3Moc3RydWN0IHNsY29tcHJlc3MgKmNvbXAsIHVuc2lnbmVkIGNoYXIgKmljcCwgaW50IGlzaXplLAorCQkgIHVuc2lnbmVkIGNoYXIgKm9jcCwgdW5zaWduZWQgY2hhciAqKmNwcCwgaW50IGNvbXByZXNzX2NpZCk7CitpbnQgc2xoY191bmNvbXByZXNzKHN0cnVjdCBzbGNvbXByZXNzICpjb21wLCB1bnNpZ25lZCBjaGFyICppY3AsIGludCBpc2l6ZSk7CitpbnQgc2xoY19yZW1lbWJlcihzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCwgdW5zaWduZWQgY2hhciAqaWNwLCBpbnQgaXNpemUpOworaW50IHNsaGNfdG9zcyhzdHJ1Y3Qgc2xjb21wcmVzcyAqY29tcCk7CiAKICNlbmRpZgkvKiBfU0xIQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmgKaW5kZXggZTU5M2FmNS4uYTEwNDJkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaApAQCAtNjg0LDE2ICs2ODQsMTcgQEAKICNkZWZpbmUgYmhfbG9ja19zb2NrKF9fc2spCXNwaW5fbG9jaygmKChfX3NrKS0+c2tfbG9jay5zbG9jaykpCiAjZGVmaW5lIGJoX3VubG9ja19zb2NrKF9fc2spCXNwaW5fdW5sb2NrKCYoKF9fc2spLT5za19sb2NrLnNsb2NrKSkKIAotZXh0ZXJuIHN0cnVjdCBzb2NrCQkqc2tfYWxsb2MoaW50IGZhbWlseSwgaW50IHByaW9yaXR5LAorZXh0ZXJuIHN0cnVjdCBzb2NrCQkqc2tfYWxsb2MoaW50IGZhbWlseSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHksCiAJCQkJCSAgc3RydWN0IHByb3RvICpwcm90LCBpbnQgemVyb19pdCk7CiBleHRlcm4gdm9pZAkJCXNrX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTsKIAogZXh0ZXJuIHN0cnVjdCBza19idWZmCQkqc29ja193bWFsbG9jKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCi0JCQkJCSAgICAgIGludCBwcmlvcml0eSk7CisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYJCSpzb2NrX3JtYWxsb2Moc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmb3JjZSwKLQkJCQkJICAgICAgaW50IHByaW9yaXR5KTsKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KTsKIGV4dGVybiB2b2lkCQkJc29ja193ZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiB2b2lkCQkJc29ja19yZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApAQCAtNzA4LDcgKzcwOSw4IEBACiAJCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkJCSAgICAgaW50IG5vYmxvY2ssCiAJCQkJCQkgICAgIGludCAqZXJyY29kZSk7Ci1leHRlcm4gdm9pZCAqc29ja19rbWFsbG9jKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsIGludCBwcmlvcml0eSk7CitleHRlcm4gdm9pZCAqc29ja19rbWFsbG9jKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUsCisJCQkgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSk7CiBleHRlcm4gdm9pZCBzb2NrX2tmcmVlX3Moc3RydWN0IHNvY2sgKnNrLCB2b2lkICptZW0sIGludCBzaXplKTsKIGV4dGVybiB2b2lkIHNrX3NlbmRfc2lndXJnKHN0cnVjdCBzb2NrICpzayk7CiAKQEAgLTExMzIsMTUgKzExMzQsMTkgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICAgaW50IHNpemUsIGludCBtZW0sIGludCBnZnApCisJCQkJCQkgICBpbnQgc2l6ZSwgaW50IG1lbSwKKwkJCQkJCSAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihzaXplICsgc2stPnNrX3Byb3QtPm1heF9oZWFkZXIsIGdmcCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaGRyX2xlbjsKIAorCWhkcl9sZW4gPSBTS0JfREFUQV9BTElHTihzay0+c2tfcHJvdC0+bWF4X2hlYWRlcik7CisJc2tiID0gYWxsb2Nfc2tiKHNpemUgKyBoZHJfbGVuLCBnZnApOwogCWlmIChza2IpIHsKIAkJc2tiLT50cnVlc2l6ZSArPSBtZW07CiAJCWlmIChzay0+c2tfZm9yd2FyZF9hbGxvYyA+PSAoaW50KXNrYi0+dHJ1ZXNpemUgfHwKIAkJICAgIHNrX3N0cmVhbV9tZW1fc2NoZWR1bGUoc2ssIHNrYi0+dHJ1ZXNpemUsIDApKSB7Ci0JCQlza2JfcmVzZXJ2ZShza2IsIHNrLT5za19wcm90LT5tYXhfaGVhZGVyKTsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgaGRyX2xlbik7CiAJCQlyZXR1cm4gc2tiOwogCQl9CiAJCV9fa2ZyZWVfc2tiKHNrYik7CkBAIC0xMTUyLDcgKzExNTgsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICpza19zdHJlYW1fYWxsb2Nfc2tiKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgaW50IHNpemUsIGludCBnZnApCisJCQkJCQkgIGludCBzaXplLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXJldHVybiBza19zdHJlYW1fYWxsb2NfcHNrYihzaywgc2l6ZSwgMCwgZ2ZwKTsKIH0KQEAgLTExODUsNyArMTE5Miw3IEBACiAJcmV0dXJuIGF0b21pY19yZWFkKCZzay0+c2tfd21lbV9hbGxvYykgPCAoc2stPnNrX3NuZGJ1ZiAvIDIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBnZnBfYW55KHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfYW55KHZvaWQpCiB7CiAJcmV0dXJuIGluX3NvZnRpcnEoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNwLmggYi9pbmNsdWRlL25ldC90Y3AuaAppbmRleCBmNzMwOTM1Yi4uZjRmOWFiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTUwNSwyNSArNTA1LDYgQEAKICNlbHNlCiAjIGRlZmluZSBUQ1BfVFdfUkVDWUNMRV9USUNLICgxMisyLVRDUF9UV19SRUNZQ0xFX1NMT1RTX0xPRykKICNlbmRpZgotCi0jZGVmaW5lIEJJQ1RDUF9CRVRBX1NDQUxFICAgIDEwMjQJLyogU2NhbGUgZmFjdG9yIGJldGEgY2FsY3VsYXRpb24KLQkJCQkJICogbWF4X2N3bmQgPSBzbmRfY3duZCAqIGJldGEKLQkJCQkJICovCi0jZGVmaW5lIEJJQ1RDUF9NQVhfSU5DUkVNRU5UIDMyCQkvKgotCQkJCQkgKiBMaW1pdCBvbiB0aGUgYW1vdW50IG9mCi0JCQkJCSAqIGluY3JlbWVudCBhbGxvd2VkIGR1cmluZwotCQkJCQkgKiBiaW5hcnkgc2VhcmNoLgotCQkJCQkgKi8KLSNkZWZpbmUgQklDVENQX0ZVTkNfT0ZfTUlOX0lOQ1IgMTEJLyoKLQkJCQkJICogbG9nKEIvU21pbikvbG9nKEIvKEItMSkpKzEsCi0JCQkJCSAqIFNtaW46bWluIGluY3JlbWVudAotCQkJCQkgKiBCOmxvZyBmYWN0b3IKLQkJCQkJICovCi0jZGVmaW5lIEJJQ1RDUF9CCQk0CSAvKgotCQkJCQkgICogSW4gYmluYXJ5IHNlYXJjaCwKLQkJCQkJICAqIGdvIHRvIHBvaW50IChtYXgrbWluKS9OCi0JCQkJCSAgKi8KLQogLyoKICAqCVRDUCBvcHRpb24KICAqLwpAQCAtNTk2LDE2ICs1NzcsNyBAQAogZXh0ZXJuIGludCBzeXNjdGxfdGNwX3R3X3JldXNlOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX2ZydG87CiBleHRlcm4gaW50IHN5c2N0bF90Y3BfbG93X2xhdGVuY3k7Ci1leHRlcm4gaW50IHN5c2N0bF90Y3Bfd2VzdHdvb2Q7Ci1leHRlcm4gaW50IHN5c2N0bF90Y3BfdmVnYXNfY29uZ19hdm9pZDsKLWV4dGVybiBpbnQgc3lzY3RsX3RjcF92ZWdhc19hbHBoYTsKLWV4dGVybiBpbnQgc3lzY3RsX3RjcF92ZWdhc19iZXRhOwotZXh0ZXJuIGludCBzeXNjdGxfdGNwX3ZlZ2FzX2dhbW1hOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX25vbWV0cmljc19zYXZlOwotZXh0ZXJuIGludCBzeXNjdGxfdGNwX2JpYzsKLWV4dGVybiBpbnQgc3lzY3RsX3RjcF9iaWNfZmFzdF9jb252ZXJnZW5jZTsKLWV4dGVybiBpbnQgc3lzY3RsX3RjcF9iaWNfbG93X3dpbmRvdzsKLWV4dGVybiBpbnQgc3lzY3RsX3RjcF9iaWNfYmV0YTsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9tb2RlcmF0ZV9yY3ZidWY7CiBleHRlcm4gaW50IHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yOwogCkBAIC03NDksMTEgKzcyMSwxNiBAQAogCXJldHVybiB0cC0+YWNrLnBlbmRpbmcmVENQX0FDS19TQ0hFRDsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZGVjX3F1aWNrYWNrX21vZGUoc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2RlY19xdWlja2Fja19tb2RlKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHVuc2lnbmVkIGludCBwa3RzKQogewotCWlmICh0cC0+YWNrLnF1aWNrICYmIC0tdHAtPmFjay5xdWljayA9PSAwKSB7Ci0JCS8qIExlYXZpbmcgcXVpY2thY2sgbW9kZSB3ZSBkZWZsYXRlIEFUTy4gKi8KLQkJdHAtPmFjay5hdG8gPSBUQ1BfQVRPX01JTjsKKwlpZiAodHAtPmFjay5xdWljaykgeworCQlpZiAocGt0cyA+PSB0cC0+YWNrLnF1aWNrKSB7CisJCQl0cC0+YWNrLnF1aWNrID0gMDsKKworCQkJLyogTGVhdmluZyBxdWlja2FjayBtb2RlIHdlIGRlZmxhdGUgQVRPLiAqLworCQkJdHAtPmFjay5hdG8gPSBUQ1BfQVRPX01JTjsKKwkJfSBlbHNlCisJCQl0cC0+YWNrLnF1aWNrIC09IHBrdHM7CiAJfQogfQogCkBAIC04NzEsNyArODQ4LDkgQEAKIAogLyogdGNwX291dHB1dC5jICovCiAKLWV4dGVybiBpbnQgdGNwX3dyaXRlX3htaXQoc3RydWN0IHNvY2sgKiwgaW50IG5vbmFnbGUpOworZXh0ZXJuIHZvaWQgX190Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKTsKK2V4dGVybiBpbnQgdGNwX21heV9zZW5kX25vdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApOwogZXh0ZXJuIGludCB0Y3BfcmV0cmFuc21pdF9za2Ioc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBleHRlcm4gdm9pZCB0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIHZvaWQgdGNwX3NpbXBsZV9yZXRyYW5zbWl0KHN0cnVjdCBzb2NrICopOwpAQCAtODgxLDEyICs4NjAsMTYgQEAKIGV4dGVybiB2b2lkIHRjcF9zZW5kX3BhcnRpYWwoc3RydWN0IHNvY2sgKik7CiBleHRlcm4gaW50ICB0Y3Bfd3JpdGVfd2FrZXVwKHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIHZvaWQgdGNwX3NlbmRfZmluKHN0cnVjdCBzb2NrICpzayk7Ci1leHRlcm4gdm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBpbnQgcHJpb3JpdHkpOworZXh0ZXJuIHZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpOwogZXh0ZXJuIGludCAgdGNwX3NlbmRfc3luYWNrKHN0cnVjdCBzb2NrICopOwotZXh0ZXJuIHZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIG1zc19ub3cpOworZXh0ZXJuIHZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICosIHVuc2lnbmVkIGludCBtc3Nfbm93KTsKIGV4dGVybiB2b2lkIHRjcF9zZW5kX2FjayhzdHJ1Y3Qgc29jayAqc2spOwogZXh0ZXJuIHZvaWQgdGNwX3NlbmRfZGVsYXllZF9hY2soc3RydWN0IHNvY2sgKnNrKTsKIAorLyogdGNwX2lucHV0LmMgKi8KK2V4dGVybiB2b2lkIHRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKTsKKwogLyogdGNwX3RpbWVyLmMgKi8KIGV4dGVybiB2b2lkIHRjcF9pbml0X3htaXRfdGltZXJzKHN0cnVjdCBzb2NrICopOwogZXh0ZXJuIHZvaWQgdGNwX2NsZWFyX3htaXRfdGltZXJzKHN0cnVjdCBzb2NrICopOwpAQCAtOTg2LDcgKzk2OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2luaXRpYWxpemVfcmN2X21zcyhzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JdW5zaWduZWQgaW50IGhpbnQgPSBtaW4odHAtPmFkdm1zcywgdHAtPm1zc19jYWNoZV9zdGQpOworCXVuc2lnbmVkIGludCBoaW50ID0gbWluX3QodW5zaWduZWQgaW50LCB0cC0+YWR2bXNzLCB0cC0+bXNzX2NhY2hlKTsKIAogCWhpbnQgPSBtaW4oaGludCwgdHAtPnJjdl93bmQvMik7CiAJaGludCA9IG1pbihoaW50LCBUQ1BfTUlOX1JDVk1TUyk7CkBAIC0xMDA5LDcgKzk5Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfZmFzdF9wYXRoX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkgPT0gMCAmJgorCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpICYmCiAJICAgIHRwLT5yY3Zfd25kICYmCiAJICAgIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCBzay0+c2tfcmN2YnVmICYmCiAJICAgICF0cC0+dXJnX2RhdGEpCkBAIC0xMTM2LDYgKzExMTksODIgQEAKIAl0cC0+cGFja2V0c19vdXQgLT0gdGNwX3NrYl9wY291bnQoc2tiKTsKIH0KIAorLyogRXZlbnRzIHBhc3NlZCB0byBjb25nZXN0aW9uIGNvbnRyb2wgaW50ZXJmYWNlICovCitlbnVtIHRjcF9jYV9ldmVudCB7CisJQ0FfRVZFTlRfVFhfU1RBUlQsCS8qIGZpcnN0IHRyYW5zbWl0IHdoZW4gbm8gcGFja2V0cyBpbiBmbGlnaHQgKi8KKwlDQV9FVkVOVF9DV05EX1JFU1RBUlQsCS8qIGNvbmdlc3Rpb24gd2luZG93IHJlc3RhcnQgKi8KKwlDQV9FVkVOVF9DT01QTEVURV9DV1IsCS8qIGVuZCBvZiBjb25nZXN0aW9uIHJlY292ZXJ5ICovCisJQ0FfRVZFTlRfRlJUTywJCS8qIGZhc3QgcmVjb3ZlcnkgdGltZW91dCAqLworCUNBX0VWRU5UX0xPU1MsCQkvKiBsb3NzIHRpbWVvdXQgKi8KKwlDQV9FVkVOVF9GQVNUX0FDSywJLyogaW4gc2VxdWVuY2UgYWNrICovCisJQ0FfRVZFTlRfU0xPV19BQ0ssCS8qIG90aGVyIGFjayAqLworfTsKKworLyoKKyAqIEludGVyZmFjZSBmb3IgYWRkaW5nIG5ldyBUQ1AgY29uZ2VzdGlvbiBjb250cm9sIGhhbmRsZXJzCisgKi8KKyNkZWZpbmUgVENQX0NBX05BTUVfTUFYCTE2CitzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisKKwkvKiBpbml0aWFsaXplIHByaXZhdGUgZGF0YSAob3B0aW9uYWwpICovCisJdm9pZCAoKmluaXQpKHN0cnVjdCB0Y3Bfc29jayAqdHApOworCS8qIGNsZWFudXAgcHJpdmF0ZSBkYXRhICAob3B0aW9uYWwpICovCisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB0Y3Bfc29jayAqdHApOworCisJLyogcmV0dXJuIHNsb3cgc3RhcnQgdGhyZXNob2xkIChyZXF1aXJlZCkgKi8KKwl1MzIgKCpzc3RocmVzaCkoc3RydWN0IHRjcF9zb2NrICp0cCk7CisJLyogbG93ZXIgYm91bmQgZm9yIGNvbmdlc3Rpb24gd2luZG93IChvcHRpb25hbCkgKi8KKwl1MzIgKCptaW5fY3duZCkoc3RydWN0IHRjcF9zb2NrICp0cCk7CisJLyogZG8gbmV3IGN3bmQgY2FsY3VsYXRpb24gKHJlcXVpcmVkKSAqLworCXZvaWQgKCpjb25nX2F2b2lkKShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgYWNrLAorCQkJICAgdTMyIHJ0dCwgdTMyIGluX2ZsaWdodCwgaW50IGdvb2RfYWNrKTsKKwkvKiByb3VuZCB0cmlwIHRpbWUgc2FtcGxlIHBlciBhY2tlZCBwYWNrZXQgKG9wdGlvbmFsKSAqLworCXZvaWQgKCpydHRfc2FtcGxlKShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgdXNydHQpOworCS8qIGNhbGwgYmVmb3JlIGNoYW5naW5nIGNhX3N0YXRlIChvcHRpb25hbCkgKi8KKwl2b2lkICgqc2V0X3N0YXRlKShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1OCBuZXdfc3RhdGUpOworCS8qIGNhbGwgd2hlbiBjd25kIGV2ZW50IG9jY3VycyAob3B0aW9uYWwpICovCisJdm9pZCAoKmN3bmRfZXZlbnQpKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGVudW0gdGNwX2NhX2V2ZW50IGV2KTsKKwkvKiBuZXcgdmFsdWUgb2YgY3duZCBhZnRlciBsb3NzIChvcHRpb25hbCkgKi8KKwl1MzIgICgqdW5kb19jd25kKShzdHJ1Y3QgdGNwX3NvY2sgKnRwKTsKKwkvKiBob29rIGZvciBwYWNrZXQgYWNrIGFjY291bnRpbmcgKG9wdGlvbmFsKSAqLworCXZvaWQgKCpwa3RzX2Fja2VkKShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgbnVtX2Fja2VkKTsKKwkvKiBnZXQgaW5mbyBmb3IgdGNwX2RpYWcgKG9wdGlvbmFsKSAqLworCXZvaWQgKCpnZXRfaW5mbykoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGV4dCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwljaGFyIAkJbmFtZVtUQ1BfQ0FfTkFNRV9NQVhdOworCXN0cnVjdCBtb2R1bGUgCSpvd25lcjsKK307CisKK2V4dGVybiBpbnQgdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbChzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICp0eXBlKTsKK2V4dGVybiB2b2lkIHRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbChzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICp0eXBlKTsKKworZXh0ZXJuIHZvaWQgdGNwX2luaXRfY29uZ2VzdGlvbl9jb250cm9sKHN0cnVjdCB0Y3Bfc29jayAqdHApOworZXh0ZXJuIHZvaWQgdGNwX2NsZWFudXBfY29uZ2VzdGlvbl9jb250cm9sKHN0cnVjdCB0Y3Bfc29jayAqdHApOworZXh0ZXJuIGludCB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgdGNwX2dldF9kZWZhdWx0X2Nvbmdlc3Rpb25fY29udHJvbChjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgdGNwX3NldF9jb25nZXN0aW9uX2NvbnRyb2woc3RydWN0IHRjcF9zb2NrICp0cCwgY29uc3QgY2hhciAqbmFtZSk7CisKK2V4dGVybiBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9pbml0X2Nvbmdlc3Rpb25fb3BzOworZXh0ZXJuIHUzMiB0Y3BfcmVub19zc3RocmVzaChzdHJ1Y3QgdGNwX3NvY2sgKnRwKTsKK2V4dGVybiB2b2lkIHRjcF9yZW5vX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywKKwkJCQl1MzIgcnR0LCB1MzIgaW5fZmxpZ2h0LCBpbnQgZmxhZyk7CitleHRlcm4gdTMyIHRjcF9yZW5vX21pbl9jd25kKHN0cnVjdCB0Y3Bfc29jayAqdHApOworZXh0ZXJuIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX3Jlbm87CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfc2V0X2NhX3N0YXRlKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHU4IGNhX3N0YXRlKQoreworCWlmICh0cC0+Y2Ffb3BzLT5zZXRfc3RhdGUpCisJCXRwLT5jYV9vcHMtPnNldF9zdGF0ZSh0cCwgY2Ffc3RhdGUpOworCXRwLT5jYV9zdGF0ZSA9IGNhX3N0YXRlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2NhX2V2ZW50KHN0cnVjdCB0Y3Bfc29jayAqdHAsIGVudW0gdGNwX2NhX2V2ZW50IGV2ZW50KQoreworCWlmICh0cC0+Y2Ffb3BzLT5jd25kX2V2ZW50KQorCQl0cC0+Y2Ffb3BzLT5jd25kX2V2ZW50KHRwLCBldmVudCk7Cit9CisKIC8qIFRoaXMgZGV0ZXJtaW5lcyBob3cgbWFueSBwYWNrZXRzIGFyZSAiaW4gdGhlIG5ldHdvcmsiIHRvIHRoZSBiZXN0CiAgKiBvZiBvdXIga25vd2xlZGdlLiAgSW4gbWFueSBjYXNlcyBpdCBpcyBjb25zZXJ2YXRpdmUsIGJ1dCB3aGVyZQogICogZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZyb20gdGhlIHJlY2VpdmVyICh2aWEgU0FDSwpAQCAtMTE1NSw5MSArMTIxNCw2IEBACiAJcmV0dXJuICh0cC0+cGFja2V0c19vdXQgLSB0cC0+bGVmdF9vdXQgKyB0cC0+cmV0cmFuc19vdXQpOwogfQogCi0vKgotICogV2hpY2ggY29uZ2VzdGlvbiBhbGdvcml0aGltIGlzIGluIHVzZSBvbiB0aGUgY29ubmVjdGlvbi4KLSAqLwotI2RlZmluZSB0Y3BfaXNfdmVnYXMoX190cCkJKChfX3RwKS0+YWR2X2NvbmcgPT0gVENQX1ZFR0FTKQotI2RlZmluZSB0Y3BfaXNfd2VzdHdvb2QoX190cCkJKChfX3RwKS0+YWR2X2NvbmcgPT0gVENQX1dFU1RXT09EKQotI2RlZmluZSB0Y3BfaXNfYmljKF9fdHApCSgoX190cCktPmFkdl9jb25nID09IFRDUF9CSUMpCi0KLS8qIFJlY2FsY3VsYXRlIHNuZF9zc3RocmVzaCwgd2Ugd2FudCB0byBzZXQgaXQgdG86Ci0gKgotICogUmVubzoKLSAqIAlvbmUgaGFsZiB0aGUgY3VycmVudCBjb25nZXN0aW9uIHdpbmRvdywgYnV0IG5vCi0gKglsZXNzIHRoYW4gdHdvIHNlZ21lbnRzCi0gKgotICogQklDOgotICoJYmVoYXZlIGxpa2UgUmVubyB1bnRpbCBsb3dfd2luZG93IGlzIHJlYWNoZWQsCi0gKgl0aGVuIGluY3JlYXNlIGNvbmdlc3Rpb24gd2luZG93IHNsb3dseQotICovCi1zdGF0aWMgaW5saW5lIF9fdTMyIHRjcF9yZWNhbGNfc3N0aHJlc2goc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLQlpZiAodGNwX2lzX2JpYyh0cCkpIHsKLQkJaWYgKHN5c2N0bF90Y3BfYmljX2Zhc3RfY29udmVyZ2VuY2UgJiYKLQkJICAgIHRwLT5zbmRfY3duZCA8IHRwLT5iaWN0Y3AubGFzdF9tYXhfY3duZCkKLQkJCXRwLT5iaWN0Y3AubGFzdF9tYXhfY3duZCA9ICh0cC0+c25kX2N3bmQgKiAKLQkJCQkJCSAgICAoQklDVENQX0JFVEFfU0NBTEUKLQkJCQkJCSAgICAgKyBzeXNjdGxfdGNwX2JpY19iZXRhKSkKLQkJCQkvICgyICogQklDVENQX0JFVEFfU0NBTEUpOwotCQllbHNlCi0JCQl0cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQgPSB0cC0+c25kX2N3bmQ7Ci0KLQkJaWYgKHRwLT5zbmRfY3duZCA+IHN5c2N0bF90Y3BfYmljX2xvd193aW5kb3cpCi0JCQlyZXR1cm4gbWF4KCh0cC0+c25kX2N3bmQgKiBzeXNjdGxfdGNwX2JpY19iZXRhKQotCQkJCSAgIC8gQklDVENQX0JFVEFfU0NBTEUsIDJVKTsKLQl9Ci0KLQlyZXR1cm4gbWF4KHRwLT5zbmRfY3duZCA+PiAxVSwgMlUpOwotfQotCi0vKiBTdG9wIHRha2luZyBWZWdhcyBzYW1wbGVzIGZvciBub3cuICovCi0jZGVmaW5lIHRjcF92ZWdhc19kaXNhYmxlKF9fdHApCSgoX190cCktPnZlZ2FzLmRvaW5nX3ZlZ2FzX25vdyA9IDApCi0gICAgCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3ZlZ2FzX2VuYWJsZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCS8qIFRoZXJlIGFyZSBzZXZlcmFsIHNpdHVhdGlvbnMgd2hlbiB3ZSBtdXN0ICJyZS1zdGFydCIgVmVnYXM6Ci0JICoKLQkgKiAgbyB3aGVuIGEgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZAotCSAqICBvIGFmdGVyIGFuIFJUTwotCSAqICBvIGFmdGVyIGZhc3QgcmVjb3ZlcnkKLQkgKiAgbyB3aGVuIHdlIHNlbmQgYSBwYWNrZXQgYW5kIHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCi0JICogICAgdW5hY2tub3dsZWRnZWQgZGF0YSAocmVzdGFydGluZyBhbiBpZGxlIGNvbm5lY3Rpb24pCi0JICoKLQkgKiBJbiB0aGVzZSBjaXJjdW1zdGFuY2VzIHdlIGNhbm5vdCBkbyBhIFZlZ2FzIGNhbGN1bGF0aW9uIGF0IHRoZQotCSAqIGVuZCBvZiB0aGUgZmlyc3QgUlRULCBiZWNhdXNlIGFueSBjYWxjdWxhdGlvbiB3ZSBkbyBpcyB1c2luZwotCSAqIHN0YWxlIGluZm8gLS0gYm90aCB0aGUgc2F2ZWQgY3duZCBhbmQgY29uZ2VzdGlvbiBmZWVkYmFjayBhcmUKLQkgKiBzdGFsZS4KLQkgKgotCSAqIEluc3RlYWQgd2UgbXVzdCB3YWl0IHVudGlsIHRoZSBjb21wbGV0aW9uIG9mIGFuIFJUVCBkdXJpbmcKLQkgKiB3aGljaCB3ZSBhY3R1YWxseSByZWNlaXZlIEFDS3MuCi0JICovCi0gICAgCi0JLyogQmVnaW4gdGFraW5nIFZlZ2FzIHNhbXBsZXMgbmV4dCB0aW1lIHdlIHNlbmQgc29tZXRoaW5nLiAqLwotCXRwLT52ZWdhcy5kb2luZ192ZWdhc19ub3cgPSAxOwotICAgICAKLQkvKiBTZXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBzZW5kIHdpbmRvdy4gKi8KLQl0cC0+dmVnYXMuYmVnX3NuZF9ueHQgPSB0cC0+c25kX254dDsKLQotCXRwLT52ZWdhcy5jbnRSVFQgPSAwOwotCXRwLT52ZWdhcy5taW5SVFQgPSAweDdmZmZmZmZmOwotfQotCi0vKiBTaG91bGQgd2UgYmUgdGFraW5nIFZlZ2FzIHNhbXBsZXMgcmlnaHQgbm93PyAqLwotI2RlZmluZSB0Y3BfdmVnYXNfZW5hYmxlZChfX3RwKQkoKF9fdHApLT52ZWdhcy5kb2luZ192ZWdhc19ub3cpCi0KLWV4dGVybiB2b2lkIHRjcF9jYV9pbml0KHN0cnVjdCB0Y3Bfc29jayAqdHApOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3NldF9jYV9zdGF0ZShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1OCBjYV9zdGF0ZSkKLXsKLQlpZiAodGNwX2lzX3ZlZ2FzKHRwKSkgewotCQlpZiAoY2Ffc3RhdGUgPT0gVENQX0NBX09wZW4pIAotCQkJdGNwX3ZlZ2FzX2VuYWJsZSh0cCk7Ci0JCWVsc2UKLQkJCXRjcF92ZWdhc19kaXNhYmxlKHRwKTsKLQl9Ci0JdHAtPmNhX3N0YXRlID0gY2Ffc3RhdGU7Ci19Ci0KIC8qIElmIGN3bmQgPiBzc3RocmVzaCwgd2UgbWF5IHJhaXNlIHNzdGhyZXNoIHRvIGJlIGhhbGYtd2F5IHRvIGN3bmQuCiAgKiBUaGUgZXhjZXB0aW9uIGlzIHJhdGUgaGFsdmluZyBwaGFzZSwgd2hlbiBjd25kIGlzIGRlY3JlYXNpbmcgdG93YXJkcwogICogc3N0aHJlc2guCkBAIC0xMjYyLDMzICsxMjM2LDExIEBACiAJdHAtPmxlZnRfb3V0ID0gdHAtPnNhY2tlZF9vdXQgKyB0cC0+bG9zdF9vdXQ7CiB9CiAKLWV4dGVybiB2b2lkIHRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc3RydWN0IHNvY2sgKnNrKTsKLQotLyogQ29uZ2VzdGlvbiB3aW5kb3cgdmFsaWRhdGlvbi4gKFJGQzI4NjEpICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY3duZF92YWxpZGF0ZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0JX191MzIgcGFja2V0c19vdXQgPSB0cC0+cGFja2V0c19vdXQ7Ci0KLQlpZiAocGFja2V0c19vdXQgPj0gdHAtPnNuZF9jd25kKSB7Ci0JCS8qIE5ldHdvcmsgaXMgZmVlZCBmdWxseS4gKi8KLQkJdHAtPnNuZF9jd25kX3VzZWQgPSAwOwotCQl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKLQl9IGVsc2UgewotCQkvKiBOZXR3b3JrIHN0YXJ2ZXMuICovCi0JCWlmICh0cC0+cGFja2V0c19vdXQgPiB0cC0+c25kX2N3bmRfdXNlZCkKLQkJCXRwLT5zbmRfY3duZF91c2VkID0gdHAtPnBhY2tldHNfb3V0OwotCi0JCWlmICgoczMyKSh0Y3BfdGltZV9zdGFtcCAtIHRwLT5zbmRfY3duZF9zdGFtcCkgPj0gdHAtPnJ0bykKLQkJCXRjcF9jd25kX2FwcGxpY2F0aW9uX2xpbWl0ZWQoc2spOwotCX0KLX0KLQogLyogU2V0IHNsb3cgc3RhcnQgdGhyZXNob3VsZCBhbmQgY3duZCBub3QgZmFsbGluZyB0byBzbG93IHN0YXJ0ICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX190Y3BfZW50ZXJfY3dyKHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7CiAJdHAtPnVuZG9fbWFya2VyID0gMDsKLQl0cC0+c25kX3NzdGhyZXNoID0gdGNwX3JlY2FsY19zc3RocmVzaCh0cCk7CisJdHAtPnNuZF9zc3RocmVzaCA9IHRwLT5jYV9vcHMtPnNzdGhyZXNoKHRwKTsKIAl0cC0+c25kX2N3bmQgPSBtaW4odHAtPnNuZF9jd25kLAogCQkJICAgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSArIDFVKTsKIAl0cC0+c25kX2N3bmRfY250ID0gMDsKQEAgLTEzMTYsMTIgKzEyNjgsNiBAQAogCXJldHVybiAzOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGNwX21pbnNoYWxsX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0JcmV0dXJuIGFmdGVyKHRwLT5zbmRfc21sLHRwLT5zbmRfdW5hKSAmJgotCQkhYWZ0ZXIodHAtPnNuZF9zbWwsIHRwLT5zbmRfbnh0KTsKLX0KLQogc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfbWluc2hhbGxfdXBkYXRlKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGludCBtc3MsIAogCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMTMyOSwxMjIgKzEyNzUsMTggQEAKIAkJdHAtPnNuZF9zbWwgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiB9CiAKLS8qIFJldHVybiAwLCBpZiBwYWNrZXQgY2FuIGJlIHNlbnQgbm93IHdpdGhvdXQgdmlvbGF0aW9uIE5hZ2xlJ3MgcnVsZXM6Ci0gICAxLiBJdCBpcyBmdWxsIHNpemVkLgotICAgMi4gT3IgaXQgY29udGFpbnMgRklOLgotICAgMy4gT3IgVENQX05PREVMQVkgd2FzIHNldC4KLSAgIDQuIE9yIFRDUF9DT1JLIGlzIG5vdCBzZXQsIGFuZCBhbGwgc2VudCBwYWNrZXRzIGFyZSBBQ0tlZC4KLSAgICAgIFdpdGggTWluc2hhbGwncyBtb2RpZmljYXRpb246IGFsbCBzZW50IHNtYWxsIHBhY2tldHMgYXJlIEFDS2VkLgotICovCi0KLXN0YXRpYyBfX2lubGluZV9fIGludAotdGNwX25hZ2xlX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIAotCQl1bnNpZ25lZCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKLXsKLQlyZXR1cm4gKHNrYi0+bGVuIDwgbXNzX25vdyAmJgotCQkhKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikgJiYKLQkJKChub25hZ2xlJlRDUF9OQUdMRV9DT1JLKSB8fAotCQkgKCFub25hZ2xlICYmCi0JCSAgdHAtPnBhY2tldHNfb3V0ICYmCi0JCSAgdGNwX21pbnNoYWxsX2NoZWNrKHRwKSkpKTsKLX0KLQotZXh0ZXJuIHZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci0KLS8qIFRoaXMgY2hlY2tzIGlmIHRoZSBkYXRhIGJlYXJpbmcgcGFja2V0IFNLQiAodXN1YWxseSBzay0+c2tfc2VuZF9oZWFkKQotICogc2hvdWxkIGJlIHB1dCBvbiB0aGUgd2lyZSByaWdodCBub3cuCi0gKi8KLXN0YXRpYyBfX2lubGluZV9fIGludCB0Y3Bfc25kX3Rlc3Qoc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgdW5zaWduZWQgY3VyX21zcywgaW50IG5vbmFnbGUpCi17Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JaW50IHBrdHMgPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwotCi0JaWYgKCFwa3RzKSB7Ci0JCXRjcF9zZXRfc2tiX3Rzb19zZWdzKHNrLCBza2IpOwotCQlwa3RzID0gdGNwX3NrYl9wY291bnQoc2tiKTsKLQl9Ci0KLQkvKglSRkMgMTEyMiAtIHNlY3Rpb24gNC4yLjMuNAotCSAqCi0JICoJV2UgbXVzdCBxdWV1ZSBpZgotCSAqCi0JICoJYSkgVGhlIHJpZ2h0IGVkZ2Ugb2YgdGhpcyBmcmFtZSBleGNlZWRzIHRoZSB3aW5kb3cKLQkgKgliKSBUaGVyZSBhcmUgcGFja2V0cyBpbiBmbGlnaHQgYW5kIHdlIGhhdmUgYSBzbWFsbCBzZWdtZW50Ci0JICoJICAgW1NXUyBhdm9pZGFuY2UgYW5kIE5hZ2xlIGFsZ29yaXRobV0KLQkgKgkgICAocGFydCBvZiBTV1MgaXMgZG9uZSBvbiBwYWNrZXRpemF0aW9uKQotCSAqCSAgIE1pbnNoYWxsIHZlcnNpb24gc291bmRzOiB0aGVyZSBhcmUgbm8gX3NtYWxsXwotCSAqCSAgIHNlZ21lbnRzIGluIGZsaWdodC4gKHRjcF9uYWdsZV9jaGVjaykKLQkgKgljKSBXZSBoYXZlIHRvbyBtYW55IHBhY2tldHMgJ2luIGZsaWdodCcKLQkgKgotCSAqIAlEb24ndCB1c2UgdGhlIG5hZ2xlIHJ1bGUgZm9yIHVyZ2VudCBkYXRhIChvcgotCSAqCWZvciB0aGUgZmluYWwgRklOIC1EYXZlTSkuCi0JICoKLQkgKglBbHNvLCBOYWdsZSBydWxlIGRvZXMgbm90IGFwcGx5IHRvIGZyYW1lcywgd2hpY2gKLQkgKglzaXQgaW4gdGhlIG1pZGRsZSBvZiBxdWV1ZSAodGhleSBoYXZlIG5vIGNoYW5jZXMKLQkgKgl0byBnZXQgbmV3IGRhdGEpIGFuZCBpZiByb29tIGF0IHRhaWwgb2Ygc2tiIGlzCi0JICoJbm90IGVub3VnaCB0byBzYXZlIHNvbWV0aGluZyBzZXJpb3VzbHkgKDwzMiBmb3Igbm93KS4KLQkgKi8KLQotCS8qIERvbid0IGJlIHN0cmljdCBhYm91dCB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgZm9yIHRoZQotCSAqIGZpbmFsIEZJTiBmcmFtZS4gIC1EYXZlTQotCSAqLwotCXJldHVybiAoKChub25hZ2xlJlRDUF9OQUdMRV9QVVNIKSB8fCB0cC0+dXJnX21vZGUKLQkJIHx8ICF0Y3BfbmFnbGVfY2hlY2sodHAsIHNrYiwgY3VyX21zcywgbm9uYWdsZSkpICYmCi0JCSgoKHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgKyAocGt0cy0xKSkgPCB0cC0+c25kX2N3bmQpIHx8Ci0JCSAoVENQX1NLQl9DQihza2IpLT5mbGFncyAmIFRDUENCX0ZMQUdfRklOKSkgJiYKLQkJIWFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnNuZF91bmEgKyB0cC0+c25kX3duZCkpOwotfQotCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9jaGVja19wcm9iZV90aW1lcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7CiAJaWYgKCF0cC0+cGFja2V0c19vdXQgJiYgIXRwLT5wZW5kaW5nKQogCQl0Y3BfcmVzZXRfeG1pdF90aW1lcihzaywgVENQX1RJTUVfUFJPQkUwLCB0cC0+cnRvKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gaW50IHRjcF9za2JfaXNfbGFzdChjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JcmV0dXJuIHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlOwotfQotCi0vKiBQdXNoIG91dCBhbnkgcGVuZGluZyBmcmFtZXMgd2hpY2ggd2VyZSBoZWxkIGJhY2sgZHVlIHRvCi0gKiBUQ1BfQ09SSyBvciBhdHRlbXB0IGF0IGNvYWxlc2NpbmcgdGlueSBwYWNrZXRzLgotICogVGhlIHNvY2tldCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJIHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkJCQkgdW5zaWduZWQgY3VyX21zcywKLQkJCQkJCSBpbnQgbm9uYWdsZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCWlmIChza2IpIHsKLQkJaWYgKCF0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikpCi0JCQlub25hZ2xlID0gVENQX05BR0xFX1BVU0g7Ci0JCWlmICghdGNwX3NuZF90ZXN0KHNrLCBza2IsIGN1cl9tc3MsIG5vbmFnbGUpIHx8Ci0JCSAgICB0Y3Bfd3JpdGVfeG1pdChzaywgbm9uYWdsZSkpCi0JCQl0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc2ssIHRwKTsKLQl9Ci0JdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKLX0KLQogc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgICAgICBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewogCV9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc2ssIHRwLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLCB0cC0+bm9uYWdsZSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCXJldHVybiAoc2tiICYmCi0JCXRjcF9zbmRfdGVzdChzaywgc2tiLCB0Y3BfY3VycmVudF9tc3Moc2ssIDEpLAotCQkJICAgICB0Y3Bfc2tiX2lzX2xhc3Qoc2ssIHNrYikgPyBUQ1BfTkFHTEVfUFVTSCA6IHRwLT5ub25hZ2xlKSk7Ci19Ci0KIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdGNwX2luaXRfd2woc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHNlcSkKIHsKIAl0cC0+c25kX3dsMSA9IHNlcTsKQEAgLTE4NzYsNTIgKzE3MTgsNCBAQAogZXh0ZXJuIGludCB0Y3BfcHJvY19yZWdpc3RlcihzdHJ1Y3QgdGNwX3NlcV9hZmluZm8gKmFmaW5mbyk7CiBleHRlcm4gdm9pZCB0Y3BfcHJvY191bnJlZ2lzdGVyKHN0cnVjdCB0Y3Bfc2VxX2FmaW5mbyAqYWZpbmZvKTsKIAotLyogVENQIFdlc3R3b29kIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzICovCi0KLSNkZWZpbmUgVENQX1dFU1RXT09EX0lOSVRfUlRUICAoMjAqSFopICAgICAgICAgICAvKiBtYXliZSB0b28gY29uc2VydmF0aXZlPyEgKi8KLSNkZWZpbmUgVENQX1dFU1RXT09EX1JUVF9NSU4gICAoSFovMjApICAgICAgICAgICAvKiA1MG1zICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfd2VzdHdvb2RfdXBkYXRlX3J0dChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBfX3UzMiBydHRfc2VxKQotewotICAgICAgICBpZiAodGNwX2lzX3dlc3R3b29kKHRwKSkKLSAgICAgICAgICAgICAgICB0cC0+d2VzdHdvb2QucnR0ID0gcnR0X3NlcTsKLX0KLQotc3RhdGljIGlubGluZSBfX3UzMiBfX3RjcF93ZXN0d29vZF9id19ydHRtaW4oY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLSAgICAgICAgcmV0dXJuIG1heCgodHAtPndlc3R3b29kLmJ3X2VzdCkgKiAodHAtPndlc3R3b29kLnJ0dF9taW4pIC8KLQkJICAgKF9fdTMyKSAodHAtPm1zc19jYWNoZV9zdGQpLAotCQkgICAyVSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgX191MzIgdGNwX3dlc3R3b29kX2J3X3J0dG1pbihjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCXJldHVybiB0Y3BfaXNfd2VzdHdvb2QodHApID8gX190Y3Bfd2VzdHdvb2RfYndfcnR0bWluKHRwKSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRjcF93ZXN0d29vZF9zc3RocmVzaChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCV9fdTMyIHNzdGhyZXNoID0gMDsKLQotCWlmICh0Y3BfaXNfd2VzdHdvb2QodHApKSB7Ci0JCXNzdGhyZXNoID0gX190Y3Bfd2VzdHdvb2RfYndfcnR0bWluKHRwKTsKLQkJaWYgKHNzdGhyZXNoKQotCQkJdHAtPnNuZF9zc3RocmVzaCA9IHNzdGhyZXNoOyAgCi0JfQotCi0JcmV0dXJuIChzc3RocmVzaCAhPSAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdGNwX3dlc3R3b29kX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLQlfX3UzMiBjd25kID0gMDsKLQotCWlmICh0Y3BfaXNfd2VzdHdvb2QodHApKSB7Ci0JCWN3bmQgPSBfX3RjcF93ZXN0d29vZF9id19ydHRtaW4odHApOwotCQlpZiAoY3duZCkKLQkJCXRwLT5zbmRfY3duZCA9IGN3bmQ7Ci0JfQotCi0JcmV0dXJuIChjd25kICE9IDApOwotfQogI2VuZGlmCS8qIF9UQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveDI1ZGV2aWNlLmggYi9pbmNsdWRlL25ldC94MjVkZXZpY2UuaAppbmRleCBjZjM2YTIwLi5kNDVhZTg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94MjVkZXZpY2UuaAorKysgYi9pbmNsdWRlL25ldC94MjVkZXZpY2UuaApAQCAtNSw4ICs1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCB4MjVfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgX19iZTE2IHgyNV90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwogCXNrYi0+aW5wdXRfZGV2ID0gc2tiLT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9jaXNjb2RlLmggYi9pbmNsdWRlL3BjbWNpYS9jaXNjb2RlLmgKaW5kZXggMjAwMGI0My4uZGExOWMyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY2lzY29kZS5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2Npc2NvZGUuaApAQCAtMTEyLDYgKzExMiw4IEBACiAKICNkZWZpbmUgTUFORklEX1RESwkJCTB4MDEwNQogI2RlZmluZSBQUk9ESURfVERLX0NGMDEwCQkweDA5MDAKKyNkZWZpbmUgUFJPRElEX1RES19OUDk2MTAJCTB4MGQwYQorI2RlZmluZSBQUk9ESURfVERLX01OMzIwMAkJMHgwZTBhCiAjZGVmaW5lIFBST0RJRF9UREtfR04zNDEwCQkweDQ4MTUKIAogI2RlZmluZSBNQU5GSURfVE9TSElCQQkJCTB4MDA5OApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvY3MuaCBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKaW5kZXggOGQ4NjQzYWRjLi4yY2FiMzlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9jcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2NzLmgKQEAgLTY4LDIxICs2OCw5IEBACiAjZGVmaW5lIFJFU19BTExPQ0FURUQJCQkweDIwCiAjZGVmaW5lIFJFU19SRU1PVkVECQkJMHg0MAogCi10eXBlZGVmIHN0cnVjdCBzZXJ2aW5mb190IHsKLSAgICBjaGFyCVNpZ25hdHVyZVsyXTsKLSAgICB1X2ludAlDb3VudDsKLSAgICB1X2ludAlSZXZpc2lvbjsKLSAgICB1X2ludAlDU0xldmVsOwotICAgIGNoYXIJKlZlbmRvclN0cmluZzsKLX0gc2VydmluZm9fdDsKLQogdHlwZWRlZiBzdHJ1Y3QgZXZlbnRfY2FsbGJhY2tfYXJnc190IHsKLSAgICBjbGllbnRfaGFuZGxlX3QgY2xpZW50X2hhbmRsZTsKLSAgICB2b2lkCSppbmZvOwotICAgIHZvaWQJKm10ZHJlcXVlc3Q7Ci0gICAgdm9pZAkqYnVmZmVyOwotICAgIHZvaWQJKm1pc2M7Ci0gICAgdm9pZAkqY2xpZW50X2RhdGE7CisJc3RydWN0IHBjbWNpYV9kZXZpY2UJKmNsaWVudF9oYW5kbGU7CisJdm9pZAkJCSpjbGllbnRfZGF0YTsKIH0gZXZlbnRfY2FsbGJhY2tfYXJnc190OwogCiAvKiBmb3IgR2V0Q29uZmlndXJhdGlvbkluZm8gKi8KQEAgLTM5MywzMSArMzgxLDI5IEBACiAKIHN0cnVjdCBwY21jaWFfc29ja2V0OwogCi1pbnQgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNvbmZfcmVnX3QgKnJlZyk7Ci1pbnQgcGNtY2lhX2RlcmVnaXN0ZXJfY2xpZW50KGNsaWVudF9oYW5kbGVfdCBoYW5kbGUpOwotaW50IHBjbWNpYV9nZXRfY29uZmlndXJhdGlvbl9pbmZvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGNvbmZpZ19pbmZvX3QgKmNvbmZpZyk7Ci1pbnQgcGNtY2lhX2dldF9jYXJkX3NlcnZpY2VzX2luZm8oc2VydmluZm9fdCAqaW5mbyk7CitpbnQgcGNtY2lhX2FjY2Vzc19jb25maWd1cmF0aW9uX3JlZ2lzdGVyKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2RldiwgY29uZl9yZWdfdCAqcmVnKTsKK2ludCBwY21jaWFfZGVyZWdpc3Rlcl9jbGllbnQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2KTsKK2ludCBwY21jaWFfZ2V0X2NvbmZpZ3VyYXRpb25faW5mbyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNvbmZpZ19pbmZvX3QgKmNvbmZpZyk7CiBpbnQgcGNtY2lhX2dldF9maXJzdF93aW5kb3cod2luZG93X2hhbmRsZV90ICp3aW4sIHdpbl9yZXFfdCAqcmVxKTsKIGludCBwY21jaWFfZ2V0X25leHRfd2luZG93KHdpbmRvd19oYW5kbGVfdCAqd2luLCB3aW5fcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX2dldF9zdGF0dXMoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY3Nfc3RhdHVzX3QgKnN0YXR1cyk7CitpbnQgcGNtY2lhX2dldF9zdGF0dXMoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjc19zdGF0dXNfdCAqc3RhdHVzKTsKIGludCBwY21jaWFfZ2V0X21lbV9wYWdlKHdpbmRvd19oYW5kbGVfdCB3aW4sIG1lbXJlcV90ICpyZXEpOwogaW50IHBjbWNpYV9tYXBfbWVtX3BhZ2Uod2luZG93X2hhbmRsZV90IHdpbiwgbWVtcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX21vZGlmeV9jb25maWd1cmF0aW9uKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIG1vZGNvbmZfdCAqbW9kKTsKK2ludCBwY21jaWFfbW9kaWZ5X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBtb2Rjb25mX3QgKm1vZCk7CiBpbnQgcGNtY2lhX3JlZ2lzdGVyX2NsaWVudChjbGllbnRfaGFuZGxlX3QgKmhhbmRsZSwgY2xpZW50X3JlZ190ICpyZXEpOwotaW50IHBjbWNpYV9yZWxlYXNlX2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSk7Ci1pbnQgcGNtY2lhX3JlbGVhc2VfaW8oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgaW9fcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX3JlbGVhc2VfaXJxKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlycV9yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVsZWFzZV9jb25maWd1cmF0aW9uKHN0cnVjdCBwY21jaWFfZGV2aWNlICpwX2Rldik7CitpbnQgcGNtY2lhX3JlbGVhc2VfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVsZWFzZV9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSk7CiBpbnQgcGNtY2lhX3JlbGVhc2Vfd2luZG93KHdpbmRvd19oYW5kbGVfdCB3aW4pOwotaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY29uZmlnX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9yZXF1ZXN0X2lvKGNsaWVudF9oYW5kbGVfdCBoYW5kbGUsIGlvX3JlcV90ICpyZXEpOwotaW50IHBjbWNpYV9yZXF1ZXN0X2lycShjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpcnFfcmVxX3QgKnJlcSk7Ci1pbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KGNsaWVudF9oYW5kbGVfdCAqaGFuZGxlLCB3aW5fcmVxX3QgKnJlcSwgd2luZG93X2hhbmRsZV90ICp3aCk7Ci1pbnQgcGNtY2lhX3Jlc2V0X2NhcmQoY2xpZW50X2hhbmRsZV90IGhhbmRsZSwgY2xpZW50X3JlcV90ICpyZXEpOworaW50IHBjbWNpYV9yZXF1ZXN0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBjb25maWdfcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3RfaW8oc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpb19yZXFfdCAqcmVxKTsKK2ludCBwY21jaWFfcmVxdWVzdF9pcnEoc3RydWN0IHBjbWNpYV9kZXZpY2UgKnBfZGV2LCBpcnFfcmVxX3QgKnJlcSk7CitpbnQgcGNtY2lhX3JlcXVlc3Rfd2luZG93KHN0cnVjdCBwY21jaWFfZGV2aWNlICoqcF9kZXYsIHdpbl9yZXFfdCAqcmVxLCB3aW5kb3dfaGFuZGxlX3QgKndoKTsKK2ludCBwY21jaWFfcmVzZXRfY2FyZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYsIGNsaWVudF9yZXFfdCAqcmVxKTsKIGludCBwY21jaWFfc3VzcGVuZF9jYXJkKHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwogaW50IHBjbWNpYV9yZXN1bWVfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIGludCBwY21jaWFfZWplY3RfY2FyZChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqc2t0KTsKIGludCBwY21jaWFfaW5zZXJ0X2NhcmQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7Ci1pbnQgcGNtY2lhX3JlcG9ydF9lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBlcnJvcl9pbmZvX3QgKmVycik7CiAKIHN0cnVjdCBwY21jaWFfc29ja2V0ICogcGNtY2lhX2dldF9zb2NrZXQoc3RydWN0IHBjbWNpYV9zb2NrZXQgKnNrdCk7CiB2b2lkIHBjbWNpYV9wdXRfc29ja2V0KHN0cnVjdCBwY21jaWFfc29ja2V0ICpza3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaCBiL2luY2x1ZGUvcGNtY2lhL2NzX3R5cGVzLmgKaW5kZXggNzg4MWQ0MC4uYzFkMTYyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvY3NfdHlwZXMuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9jc190eXBlcy5oCkBAIC0zNCw4ICszNCw4IEBACiB0eXBlZGVmIHVfY2hhcgljaXNkYXRhX3Q7CiB0eXBlZGVmIHVfc2hvcnQJcGFnZV90OwogCi1zdHJ1Y3QgY2xpZW50X3Q7Ci10eXBlZGVmIHN0cnVjdCBjbGllbnRfdCAqY2xpZW50X2hhbmRsZV90Oworc3RydWN0IHBjbWNpYV9kZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBwY21jaWFfZGV2aWNlICpjbGllbnRfaGFuZGxlX3Q7CiAKIHN0cnVjdCB3aW5kb3dfdDsKIHR5cGVkZWYgc3RydWN0IHdpbmRvd190ICp3aW5kb3dfaGFuZGxlX3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaCBiL2luY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmQ4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoMjAwMy0yMDA0KSAJRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPgorICoJCQkJRGF2aWQgV29vZGhvdXNlCisgKgorICogTGljZW5zZTogR1BMIHYyCisgKi8KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRChtYW5mLCBjYXJkKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCwgXAorCS5tYW5mX2lkID0gKG1hbmYpLCBcCisJLmNhcmRfaWQgPSAoY2FyZCksIH0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX0ZVTkNfSUQoZnVuYykgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DX0lELCBcCisJLmZ1bmNfaWQgPSAoZnVuYyksIH0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX1BST0RfSUQxKHYxLCB2aDEpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDEsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgfQorCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDIodjIsIHZoMikgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMiwgXAorCS5wcm9kX2lkID0geyBOVUxMLCAodjIpLCBOVUxMLCBOVUxMIH0sICBcCisJLnByb2RfaWRfaGFzaCA9IHsgMCwgKHZoMiksIDAsIDAgfSwgfQorCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKHYxLCB2MiwgdmgxLCB2aDIpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDIsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgKHYyKSwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAwLCAwIH0sIH0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX1BST0RfSUQxMyh2MSwgdjMsIHZoMSwgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzLCBcCisJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAodmgzKSwgMCB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTQodjEsIHY0LCB2aDEsIHZoNCkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENCwgXAorCS5wcm9kX2lkID0geyAodjEpLCBOVUxMLCBOVUxMLCAodjQpIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgMCwgMCwgKHZoNCkgfSwgfQorCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMyh2MSwgdjIsIHYzLCB2aDEsIHZoMiwgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksICh2MyksIE5VTEwgfSxcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAodmgzKSwgMCB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTI0KHYxLCB2MiwgdjQsIHZoMSwgdmgyLCB2aDQpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDJ8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDQsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgKHYyKSwgTlVMTCwgKHY0KSB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAwLCAodmg0KSB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTM0KHYxLCB2MywgdjQsIHZoMSwgdmgzLCB2aDQpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDN8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDQsIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgKHYzKSwgKHY0KSB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsICh2aDMpLCAodmg0KSB9LCB9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzNCh2MSwgdjIsIHYzLCB2NCwgdmgxLCB2aDIsIHZoMywgdmg0KSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQ0LCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksICh2MyksICh2NCkgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgKHZoMyksICh2aDQpIH0sIH0KKworCisvKiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzICovCisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfTUFORl9DQVJEKG1mYywgbWFuZiwgY2FyZCkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9NQU5GX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ1RJT04sIFwKKwkubWFuZl9pZCA9IChtYW5mKSwgXAorCS5jYXJkX2lkID0gKGNhcmQpLCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMShtZmMsIHYxLCB2aDEpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfRlVOQ1RJT04sIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgXAorCS5mdW5jdGlvbiA9IChtZmMpLCB9CisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDIobWZjLCB2MiwgdmgyKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7IE5VTEwsICh2MiksIE5VTEwsIE5VTEwgfSwgIFwKKwkucHJvZF9pZF9oYXNoID0geyAwLCAodmgyKSwgMCwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIobWZjLCB2MSwgdjIsIHZoMSwgdmgyKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksIE5VTEwsIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgMCwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTMobWZjLCB2MSwgdjMsIHZoMSwgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQzfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAodmgzKSwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfTUZDX0RFVklDRV9QUk9EX0lEMTIzKG1mYywgdjEsIHYyLCB2MywgdmgxLCB2aDIsIHZoMykgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMnwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEM3wgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DVElPTiwgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCAodjMpLCBOVUxMIH0sXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgKHZoMyksIDAgfSwgXAorCS5mdW5jdGlvbiA9IChtZmMpLCB9CisKKy8qIHBzZXVkbyBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzICovCisKKyNkZWZpbmUgUENNQ0lBX1BGQ19ERVZJQ0VfTUFORl9DQVJEKG1mYywgbWFuZiwgY2FyZCkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9NQU5GX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLm1hbmZfaWQgPSAobWFuZiksIFwKKwkuY2FyZF9pZCA9IChjYXJkKSwgXAorCS5kZXZpY2Vfbm8gPSAobWZjKSwgfQorCisjZGVmaW5lIFBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxKG1mYywgdjEsIHZoMSkgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8sIFwKKwkucHJvZF9pZCA9IHsgKHYxKSwgTlVMTCwgTlVMTCwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksIDAsIDAsIDAgfSwgXAorCS5kZXZpY2Vfbm8gPSAobWZjKSwgfQorCisjZGVmaW5lIFBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQyKG1mYywgdjIsIHZoMikgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMnwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9ERVZJQ0VfTk8sIFwKKwkucHJvZF9pZCA9IHsgTlVMTCwgKHYyKSwgTlVMTCwgTlVMTCB9LCAgXAorCS5wcm9kX2lkX2hhc2ggPSB7IDAsICh2aDIpLCAwLCAwIH0sIFwKKwkuZGV2aWNlX25vID0gKG1mYyksIH0KKworI2RlZmluZSBQQ01DSUFfUEZDX0RFVklDRV9QUk9EX0lEMTIobWZjLCB2MSwgdjIsIHZoMSwgdmgyKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0RFVklDRV9OTywgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCBOVUxMLCBOVUxMIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgKHZoMiksIDAsIDAgfSwgXAorCS5kZXZpY2Vfbm8gPSAobWZjKSwgfQorCisjZGVmaW5lIFBDTUNJQV9QRkNfREVWSUNFX1BST0RfSUQxMyhtZmMsIHYxLCB2MywgdmgxLCB2aDMpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDN8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAodmgzKSwgMCB9LCBcCisJLmRldmljZV9ubyA9IChtZmMpLCB9CisKKyNkZWZpbmUgUENNQ0lBX1BGQ19ERVZJQ0VfUFJPRF9JRDEyMyhtZmMsIHYxLCB2MiwgdjMsIHZoMSwgdmgyLCB2aDMpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDJ8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDN8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksICh2MyksIE5VTEwgfSxcCisJLnByb2RfaWRfaGFzaCA9IHsgKHZoMSksICh2aDIpLCAodmgzKSwgMCB9LCBcCisJLmRldmljZV9ubyA9IChtZmMpLCB9CisKKy8qIGNhcmRzIG5lZWRpbmcgYSBDSVMgb3ZlcnJpZGUgKi8KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX0NJU19NQU5GX0NBUkQobWFuZiwgY2FyZCwgX2Npc2ZpbGUpIHsgXAorCS5tYXRjaF9mbGFncyA9IFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMgfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRCwgXAorCS5tYW5mX2lkID0gKG1hbmYpLCBcCisJLmNhcmRfaWQgPSAoY2FyZCksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9DSVNfUFJPRF9JRDEyKHYxLCB2MiwgdmgxLCB2aDIsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTIHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMiwgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCBOVUxMLCBOVUxMIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgKHZoMiksIDAsIDAgfSwgXAorCS5jaXNmaWxlID0gKF9jaXNmaWxlKX0KKworI2RlZmluZSBQQ01DSUFfREVWSUNFX0NJU19QUk9EX0lEMTIzKHYxLCB2MiwgdjMsIHZoMSwgdmgyLCB2aDMsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTIHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMXwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMnwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMywgXAorCS5wcm9kX2lkID0geyAodjEpLCAodjIpLCAodjMpLCBOVUxMIH0sXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgKHZoMyksIDAgfSwgXAorCS5jaXNmaWxlID0gKF9jaXNmaWxlKX0KKworCisjZGVmaW5lIFBDTUNJQV9ERVZJQ0VfQ0lTX1BST0RfSUQyKHYyLCB2aDIsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSAgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUyB8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDIsIFwKKwkucHJvZF9pZCA9IHsgTlVMTCwgKHYyKSwgTlVMTCwgTlVMTCB9LCAgXAorCS5wcm9kX2lkX2hhc2ggPSB7IDAsICh2aDIpLCAwLCAwIH0sIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX1BGQ19ERVZJQ0VfQ0lTX1BST0RfSUQxMihtZmMsIHYxLCB2MiwgdmgxLCB2aDIsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSAgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUyB8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDF8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDJ8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksIE5VTEwsIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgMCwgMCB9LFwKKwkuZGV2aWNlX25vID0gKG1mYyksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX01BTkZfQ0FSRChtZmMsIG1hbmYsIGNhcmQsIF9jaXNmaWxlKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSAgUENNQ0lBX0RFVl9JRF9NQVRDSF9GQUtFX0NJUyB8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfTUFORl9JRHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9DQVJEX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLm1hbmZfaWQgPSAobWFuZiksIFwKKwkuY2FyZF9pZCA9IChjYXJkKSwgXAorCS5mdW5jdGlvbiA9IChtZmMpLCBcCisJLmNpc2ZpbGUgPSAoX2Npc2ZpbGUpfQorCisjZGVmaW5lIFBDTUNJQV9NRkNfREVWSUNFX0NJU19QUk9EX0lEMTIobWZjLCB2MSwgdjIsIHZoMSwgdmgyLCBfY2lzZmlsZSkgeyBcCisJLm1hdGNoX2ZsYWdzID0gIFBDTUNJQV9ERVZfSURfTUFUQ0hfRkFLRV9DSVMgfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQxfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNUSU9OLCBcCisJLnByb2RfaWQgPSB7ICh2MSksICh2MiksIE5VTEwsIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAodmgyKSwgMCwgMCB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKyNkZWZpbmUgUENNQ0lBX01GQ19ERVZJQ0VfQ0lTX1BST0RfSUQ0KG1mYywgdjQsIHZoNCwgX2Npc2ZpbGUpIHsgXAorCS5tYXRjaF9mbGFncyA9ICBQQ01DSUFfREVWX0lEX01BVENIX0ZBS0VfQ0lTIHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DVElPTiwgXAorCS5wcm9kX2lkID0geyBOVUxMLCBOVUxMLCBOVUxMLCAodjQpIH0sIFwKKwkucHJvZF9pZF9oYXNoID0geyAwLCAwLCAwLCAodmg0KSB9LCBcCisJLmZ1bmN0aW9uID0gKG1mYyksIFwKKwkuY2lzZmlsZSA9IChfY2lzZmlsZSl9CisKKworI2RlZmluZSBQQ01DSUFfREVWSUNFX05VTEwgeyAubWF0Y2hfZmxhZ3MgPSAwLCB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kcy5oIGIvaW5jbHVkZS9wY21jaWEvZHMuaAppbmRleCAzMTJmZDk1Li5iNzA3YTYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS9kcy5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2RzLmgKQEAgLTE2LDggKzE2LDEzIEBACiAjaWZuZGVmIF9MSU5VWF9EU19ICiAjZGVmaW5lIF9MSU5VWF9EU19ICiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHBjbWNpYS9idWxrbWVtLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CisjaW5jbHVkZSA8cGNtY2lhL2RldmljZV9pZC5oPgogCiB0eXBlZGVmIHN0cnVjdCB0dXBsZV9wYXJzZV90IHsKICAgICB0dXBsZV90CQl0dXBsZTsKQEAgLTQ3LDcgKzUyLDYgQEAKIH0gbXRkX2luZm9fdDsKIAogdHlwZWRlZiB1bmlvbiBkc19pb2N0bF9hcmdfdCB7Ci0gICAgc2VydmluZm9fdAkJc2VydmluZm87CiAgICAgYWRqdXN0X3QJCWFkanVzdDsKICAgICBjb25maWdfaW5mb190CWNvbmZpZzsKICAgICB0dXBsZV90CQl0dXBsZTsKQEAgLTYzLDcgKzY3LDYgQEAKICAgICBjaXNkdW1wX3QJCWNpc2R1bXA7CiB9IGRzX2lvY3RsX2FyZ190OwogCi0jZGVmaW5lIERTX0dFVF9DQVJEX1NFUlZJQ0VTX0lORk8JX0lPUiAoJ2QnLCAxLCBzZXJ2aW5mb190KQogI2RlZmluZSBEU19BREpVU1RfUkVTT1VSQ0VfSU5GTwkJX0lPV1IoJ2QnLCAyLCBhZGp1c3RfdCkKICNkZWZpbmUgRFNfR0VUX0NPTkZJR1VSQVRJT05fSU5GTwlfSU9XUignZCcsIDMsIGNvbmZpZ19pbmZvX3QpCiAjZGVmaW5lIERTX0dFVF9GSVJTVF9UVVBMRQkJX0lPV1IoJ2QnLCA0LCB0dXBsZV90KQpAQCAtMTI5LDEyICsxMzIsMTMgQEAKIAogc3RydWN0IHBjbWNpYV9zb2NrZXQ7CiAKLWV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlOwotCiBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB7CiAJZGV2X2xpbmtfdAkJKigqYXR0YWNoKSh2b2lkKTsKKwlpbnQgKCpldmVudCkJCShldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCisJCQkJIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqKTsKIAl2b2lkCQkJKCpkZXRhY2gpKGRldl9saW5rX3QgKik7CiAJc3RydWN0IG1vZHVsZQkJKm93bmVyOworCXN0cnVjdCBwY21jaWFfZGV2aWNlX2lkCSppZF90YWJsZTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcnY7CiB9OwogCkBAIC0xNTgsMjIgKzE2MiwxNiBAQAogCS8qIGRlcHJlY2F0ZWQsIGEgY2xlYW5lZCB1cCB2ZXJzaW9uIHdpbGwgYmUgbW92ZWQgaW50byB0aGlzCiAJICAgc3RydWN0IHNvb24gKi8KIAlkZXZfbGlua190CQkqaW5zdGFuY2U7Ci0Jc3RydWN0IGNsaWVudF90IHsKLQkJdV9zaG9ydAkJCWNsaWVudF9tYWdpYzsKLQkJc3RydWN0IHBjbWNpYV9zb2NrZXQJKlNvY2tldDsKLQkJdV9jaGFyCQkJRnVuY3Rpb247Ci0JCXVfaW50CQkJc3RhdGU7Ci0JCWV2ZW50X3QJCQlFdmVudE1hc2s7Ci0JCWludCAoKmV2ZW50X2hhbmRsZXIpCShldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksCi0JCQkJCSBldmVudF9jYWxsYmFja19hcmdzX3QgKik7Ci0JCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAJZXZlbnRfY2FsbGJhY2tfYXJnczsKLQl9CQkJY2xpZW50OworCWV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAJZXZlbnRfY2FsbGJhY2tfYXJnczsKKwl1X2ludAkJCXN0YXRlOwogCiAJLyogaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXZpY2UgKi8KIAl1OAkJCWhhc19tYW5mX2lkOjE7CiAJdTgJCQloYXNfY2FyZF9pZDoxOwogCXU4CQkJaGFzX2Z1bmNfaWQ6MTsKLQl1OAkJCXJlc2VydmVkOjU7CisKKwl1OAkJCWFsbG93X2Z1bmNfaWRfbWF0Y2g6MTsKKwl1OAkJCXJlc2VydmVkOjQ7CiAKIAl1OAkJCWZ1bmNfaWQ7CiAJdTE2CQkJbWFuZl9pZDsKQEAgLTE5MCw4ICsxODgsOCBAQAogI2RlZmluZSB0b19wY21jaWFfZGV2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RldmljZSwgZGV2KQogI2RlZmluZSB0b19wY21jaWFfZHJ2KG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNtY2lhX2RyaXZlciwgZHJ2KQogCi0jZGVmaW5lIGhhbmRsZV90b19wZGV2KGhhbmRsZSkgY29udGFpbmVyX29mKGhhbmRsZSwgc3RydWN0IHBjbWNpYV9kZXZpY2UsIGNsaWVudCk7Ci0jZGVmaW5lIGhhbmRsZV90b19kZXYoaGFuZGxlKSAoKGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBwY21jaWFfZGV2aWNlLCBjbGllbnQpKS0+ZGV2KQorI2RlZmluZSBoYW5kbGVfdG9fcGRldihoYW5kbGUpIChoYW5kbGUpCisjZGVmaW5lIGhhbmRsZV90b19kZXYoaGFuZGxlKSAoaGFuZGxlLT5kZXYpCiAKIC8qIGVycm9yIHJlcG9ydGluZyAqLwogdm9pZCBjc19lcnJvcihjbGllbnRfaGFuZGxlX3QgaGFuZGxlLCBpbnQgZnVuYywgaW50IHJldCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9zcy5oIGIvaW5jbHVkZS9wY21jaWEvc3MuaAppbmRleCA2N2I4NjdmMy4uMGY3YWFjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvc3MuaAorKysgYi9pbmNsdWRlL3BjbWNpYS9zcy5oCkBAIC0xNSwxMCArMTUsMTIgQEAKICNpZm5kZWYgX0xJTlVYX1NTX0gKICNkZWZpbmUgX0xJTlVYX1NTX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCiAjaW5jbHVkZSA8cGNtY2lhL2NzX3R5cGVzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2NzLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2J1bGttZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogLyogRGVmaW5pdGlvbnMgZm9yIGNhcmQgc3RhdHVzIGZsYWdzIGZvciBHZXRTdGF0dXMgKi8KICNkZWZpbmUgU1NfV1JQUk9UCTB4MDAwMQpAQCAtMTcxLDcgKzE3Myw3IEBACiAKIHN0cnVjdCBjb25maWdfdDsKIHN0cnVjdCBwY21jaWFfY2FsbGJhY2s7Ci0KK3N0cnVjdCB1c2VyX2luZm9fdDsKIAogc3RydWN0IHBjbWNpYV9zb2NrZXQgewogCXN0cnVjdCBtb2R1bGUJCQkqb3duZXI7CkBAIC0yMTYsOCArMjE4LDkgQEAKIAogCS8qIGlzIHNldCB0byBvbmUgaWYgcmVzb3VyY2Ugc2V0dXAgaXMgZG9uZSB1c2luZyBhZGp1c3RfcmVzb3VyY2VfaW5mbygpICovCiAJdTgJCQkJcmVzb3VyY2Vfc2V0dXBfb2xkOjE7CisJdTgJCQkJcmVzb3VyY2Vfc2V0dXBfbmV3OjE7CiAKLQl1OAkJCQlyZXNlcnZlZDo2OworCXU4CQkJCXJlc2VydmVkOjU7CiAKIAkvKiBzb2NrZXQgb3BlcmF0aW9ucyAqLwogCXN0cnVjdCBwY2NhcmRfb3BlcmF0aW9ucyAqCW9wczsKQEAgLTI0MSw5ICsyNDQsMzIgQEAKIAl1bnNpZ25lZCBpbnQJCQl0aHJlYWRfZXZlbnRzOwogCiAJLyogcGNtY2lhICgxNi1iaXQpICovCi0Jc3RydWN0IHBjbWNpYV9idXNfc29ja2V0CSpwY21jaWE7CiAJc3RydWN0IHBjbWNpYV9jYWxsYmFjawkJKmNhbGxiYWNrOwogCisjaWYgZGVmaW5lZChDT05GSUdfUENNQ0lBKSB8fCBkZWZpbmVkKENPTkZJR19QQ01DSUFfTU9EVUxFKQorCXN0cnVjdCBsaXN0X2hlYWQJCWRldmljZXNfbGlzdDsJLyogIFBDTUNJQSBkZXZpY2VzICovCisJdTgJCQkJZGV2aWNlX2NvdW50OwkvKiB0aGUgbnVtYmVyIG9mIGRldmljZXMsIHVzZWQKKwkJCQkJCQkgKiBvbmx5IGludGVybmFsbHkgYW5kIHN1YmplY3QKKwkJCQkJCQkgKiB0byBpbmNvcnJlY3RuZXNzIGFuZCBjaGFuZ2UgKi8KKworCXN0cnVjdCB7CisJCXU4CQkJcHJlc2VudDoxLAkvKiBQQ01DSUEgY2FyZCBpcyBwcmVzZW50IGluIHNvY2tldCAqLworCQkJCQlidXN5OjEsCQkvKiAibWFzdGVyIiBpb2N0bCBpcyB1c2VkICovCisJCQkJCWRlYWQ6MSwJCS8qIHBjbWNpYSBtb2R1bGUgaXMgYmVpbmcgdW5sb2FkZWQgKi8KKwkJCQkJZGV2aWNlX2FkZF9wZW5kaW5nOjEsIC8qIGEgcHNldWRvLW11bHRpZnVuY3Rpb24tZGV2aWNlCisJCQkJCQkJICAgICAgICogYWRkIGV2ZW50IGlzIHBlbmRpbmcgKi8KKwkJCQkJcmVzZXJ2ZWQ6NDsKKwl9IAkJCQlwY21jaWFfc3RhdGU7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWRldmljZV9hZGQ7CS8qIGZvciBhZGRpbmcgZnVydGhlciBwc2V1ZG8tbXVsdGlmdW5jdGlvbgorCQkJCQkJCSAqIGRldmljZXMgKi8KKworI2lmZGVmIENPTkZJR19QQ01DSUFfSU9DVEwKKwlzdHJ1Y3QgdXNlcl9pbmZvX3QJCSp1c2VyOworCXdhaXRfcXVldWVfaGVhZF90CQlxdWV1ZTsKKyNlbmRpZgorI2VuZGlmCisKIAkvKiBjYXJkYnVzICgzMi1iaXQpICovCiAjaWZkZWYgQ09ORklHX0NBUkRCVVMKIAlzdHJ1Y3QgcmVzb3VyY2UgKgkJY2JfY2lzX3JlczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL3ZlcnNpb24uaCBiL2luY2x1ZGUvcGNtY2lhL3ZlcnNpb24uaAppbmRleCBlYjg4MjYzLi41YWQ5YzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BjbWNpYS92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvdmVyc2lvbi5oCkBAIC0xLDQgKzEsMyBAQAogLyogdmVyc2lvbi5oIDEuOTQgMjAwMC8xMC8wMyAxNzo1NTo0OCAoRGF2aWQgSGluZHMpICovCiAKLSNkZWZpbmUgQ1NfUkVMRUFTRSAiMy4xLjIyIgotI2RlZmluZSBDU19SRUxFQVNFX0NPREUgMHgzMTE2CisvKiBUaGlzIGZpbGUgd2lsbCBiZSByZW1vdmVkLCBwbGVhc2UgZG9uJ3QgaW5jbHVkZSBpdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3NnX3JlcXVlc3QuaCBiL2luY2x1ZGUvc2NzaS9zZ19yZXF1ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmZjUyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2NzaS9zZ19yZXF1ZXN0LmgKQEAgLTAsMCArMSwyNiBAQAordHlwZWRlZiBzdHJ1Y3Qgc2NzaV9yZXF1ZXN0IFNjc2lfUmVxdWVzdDsKKworc3RhdGljIFNjc2lfUmVxdWVzdCAqZHVtbXlfY21kcDsJLyogb25seSB1c2VkIGZvciBzaXplb2YgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc2dfc2NhdHRlcl9ob2xkIHsgLyogaG9sZGluZyBhcmVhIGZvciBzY3NpIHNjYXR0ZXIgZ2F0aGVyIGluZm8gKi8KKwl1bnNpZ25lZCBzaG9ydCBrX3VzZV9zZzsgLyogQ291bnQgb2Yga2VybmVsIHNjYXR0ZXItZ2F0aGVyIHBpZWNlcyAqLworCXVuc2lnbmVkIHNob3J0IHNnbGlzdF9sZW47IC8qIHNpemUgb2YgbWFsbG9jJ2Qgc2NhdHRlci1nYXRoZXIgbGlzdCArKyAqLworCXVuc2lnbmVkIGJ1ZmZsZW47CS8qIFNpemUgb2YgKGFnZ3JlZ2F0ZSkgZGF0YSBidWZmZXIgKi8KKwl1bnNpZ25lZCBiX21hbGxvY19sZW47CS8qIGFjdHVhbCBsZW4gbWFsbG9jJ2VkIGluIGJ1ZmZlciAqLworCXZvaWQgKmJ1ZmZlcjsJCS8qIERhdGEgYnVmZmVyIG9yIHNjYXR0ZXIgbGlzdCAoa191c2Vfc2c+MCkgKi8KKwljaGFyIGRpb19pbl91c2U7CS8qIDAtPmluZGlyZWN0IElPIChvciBtbWFwKSwgMS0+ZGlvICovCisJdW5zaWduZWQgY2hhciBjbWRfb3Bjb2RlOyAvKiBmaXJzdCBieXRlIG9mIGNvbW1hbmQgKi8KK30gU2dfc2NhdHRlcl9ob2xkOworCit0eXBlZGVmIHN0cnVjdCBzZ19yZXF1ZXN0IHsJLyogU0dfTUFYX1FVRVVFIHJlcXVlc3RzIG91dHN0YW5kaW5nIHBlciBmaWxlICovCisJU2NzaV9SZXF1ZXN0ICpteV9jbWRwOwkvKiAhPSAwICB3aGVuIHJlcXVlc3Qgd2l0aCBsb3dlciBsZXZlbHMgKi8KKwlzdHJ1Y3Qgc2dfcmVxdWVzdCAqbmV4dHJwOwkvKiBOVUxMIC0+IHRhaWwgcmVxdWVzdCAoc2xpc3QpICovCisJc3RydWN0IHNnX2ZkICpwYXJlbnRmcDsJLyogTlVMTCAtPiBub3QgaW4gdXNlICovCisJU2dfc2NhdHRlcl9ob2xkIGRhdGE7CS8qIGhvbGQgYnVmZmVyLCBwZXJoYXBzIHNjYXR0ZXIgbGlzdCAqLworCXNnX2lvX2hkcl90IGhlYWRlcjsJLyogc2NzaSBjb21tYW5kK2luZm8sIHNlZSA8c2NzaS9zZy5oPiAqLworCXVuc2lnbmVkIGNoYXIgc2Vuc2VfYltzaXplb2YgKGR1bW15X2NtZHAtPnNyX3NlbnNlX2J1ZmZlcildOworCWNoYXIgcmVzX3VzZWQ7CQkvKiAxIC0+IHVzaW5nIHJlc2VydmUgYnVmZmVyLCAwIC0+IG5vdCAuLi4gKi8KKwljaGFyIG9ycGhhbjsJCS8qIDEgLT4gZHJvcCBvbiBzaWdodCwgMCAtPiBub3JtYWwgKi8KKwljaGFyIHNnX2lvX293bmVkOwkvKiAxIC0+IHBhY2tldCBiZWxvbmdzIHRvIFNHX0lPICovCisJdm9sYXRpbGUgY2hhciBkb25lOwkvKiAwLT5iZWZvcmUgYmgsIDEtPmJlZm9yZSByZWFkLCAyLT5yZWFkICovCit9IFNnX3JlcXVlc3Q7CmRpZmYgLS1naXQgYS9pbml0L0tjb25maWcgYi9pbml0L0tjb25maWcKaW5kZXggYjEwOTFkNy4uNzU3NTVlZiAxMDA2NDQKLS0tIGEvaW5pdC9LY29uZmlnCisrKyBiL2luaXQvS2NvbmZpZwpAQCAtMTc0LDcgKzE3NCw3IEBACiAKIGNvbmZpZyBBVURJVFNZU0NBTEwKIAlib29sICJFbmFibGUgc3lzdGVtLWNhbGwgYXVkaXRpbmcgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFVRElUICYmIChYODYgfHwgUFBDIHx8IFBQQzY0IHx8IEFSQ0hfUzM5MCB8fCBJQTY0IHx8IFVNTCkKKwlkZXBlbmRzIG9uIEFVRElUICYmIChYODYgfHwgUFBDIHx8IFBQQzY0IHx8IEFSQ0hfUzM5MCB8fCBJQTY0IHx8IFVNTCB8fCBTUEFSQzY0KQogCWRlZmF1bHQgeSBpZiBTRUNVUklUWV9TRUxJTlVYCiAJaGVscAogCSAgRW5hYmxlIGxvdy1vdmVyaGVhZCBzeXN0ZW0tY2FsbCBhdWRpdGluZyBpbmZyYXN0cnVjdHVyZSB0aGF0CmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCBiNzU3MGMwLi4xYjAyYmU3IDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mc19zYi5oPgpkaWZmIC0tZ2l0IGEvaW5pdC9kb19tb3VudHMuaCBiL2luaXQvZG9fbW91bnRzLmgKaW5kZXggZGU5MmJlZS4uZTBhN2FjOSAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHMuaAorKysgYi9pbml0L2RvX21vdW50cy5oCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KIAotZGV2X3QgbmFtZV90b19kZXZfdChjaGFyICpuYW1lKTsKIHZvaWQgIGNoYW5nZV9mbG9wcHkoY2hhciAqZm10LCAuLi4pOwogdm9pZCAgbW91bnRfYmxvY2tfcm9vdChjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwogdm9pZCAgbW91bnRfcm9vdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luaXQvZG9fbW91bnRzX2luaXRyZC5jIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKaW5kZXggMDdlN2QzMS4uYTA1Y2FiZCAxMDA2NDQKLS0tIGEvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKKysrIGIvaW5pdC9kb19tb3VudHNfaW5pdHJkLmMKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBoYW5kbGVfaW5pdHJkKHZvaWQpCiB7CiAJaW50IGVycm9yOwotCWludCBpLCBwaWQ7CisJaW50IHBpZDsKIAogCXJlYWxfcm9vdF9kZXYgPSBuZXdfZW5jb2RlX2RldihST09UX0RFVik7CiAJY3JlYXRlX2RldigiL2Rldi9yb290Lm9sZCIsIFJvb3RfUkFNMCwgTlVMTCk7CkBAIC01OCw3ICs1OCw3IEBACiAKIAlwaWQgPSBrZXJuZWxfdGhyZWFkKGRvX2xpbnV4cmMsICIvbGludXhyYyIsIFNJR0NITEQpOwogCWlmIChwaWQgPiAwKSB7Ci0JCXdoaWxlIChwaWQgIT0gc3lzX3dhaXQ0KC0xLCAmaSwgMCwgTlVMTCkpCisJCXdoaWxlIChwaWQgIT0gc3lzX3dhaXQ0KC0xLCBOVUxMLCAwLCBOVUxMKSkKIAkJCXlpZWxkKCk7CiAJfQogCkBAIC04Niw3ICs4NiwxMCBAQAogCQlwcmludGsoIm9rYXlcbiIpOwogCWVsc2UgewogCQlpbnQgZmQgPSBzeXNfb3BlbigiL2Rldi9yb290Lm9sZCIsIE9fUkRXUiwgMCk7Ci0JCXByaW50aygiZmFpbGVkXG4iKTsKKwkJaWYgKGVycm9yID09IC1FTk9FTlQpCisJCQlwcmludGsoIi9pbml0cmQgZG9lcyBub3QgZXhpc3QuIElnbm9yZWQuXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJmYWlsZWRcbiIpOwogCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVubW91bnRpbmcgb2xkIHJvb3RcbiIpOwogCQlzeXNfdW1vdW50KCIvb2xkIiwgTU5UX0RFVEFDSCk7CiAJCXByaW50ayhLRVJOX05PVElDRSAiVHJ5aW5nIHRvIGZyZWUgcmFtZGlzayBtZW1vcnkgLi4uICIpOwpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBkMzI0ODAxLi5iNWU0MjFlIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtMzgzLDYgKzM4MywxMyBAQAogCW51bWFfZGVmYXVsdF9wb2xpY3koKTsKIAl1bmxvY2tfa2VybmVsKCk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCisJLyoKKwkgKiBUaGUgYm9vdCBpZGxlIHRocmVhZCBtdXN0IGV4ZWN1dGUgc2NoZWR1bGUoKQorCSAqIGF0IGxlYXN0IG9uZSB0byBnZXQgdGhpbmdzIG1vdmluZzoKKwkgKi8KKwlzY2hlZHVsZSgpOworCiAJY3B1X2lkbGUoKTsKIH0gCiAKZGlmZiAtLWdpdCBhL2lwYy9jb21wYXQuYyBiL2lwYy9jb21wYXQuYwppbmRleCA3MGU0ZTRlLi4zODgxZDU2IDEwMDY0NAotLS0gYS9pcGMvY29tcGF0LmMKKysrIGIvaXBjL2NvbXBhdC5jCkBAIC01NzIsNiArNTcyLDcgQEAKIAllcnIgfD0gX19wdXRfdXNlcihzbWktPnNobW1uaSwgJnVwLT5zaG1tbmkpOwogCWVyciB8PSBfX3B1dF91c2VyKHNtaS0+c2htc2VnLCAmdXAtPnNobXNlZyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoc21pLT5zaG1hbGwsICZ1cC0+c2htYWxsKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBwdXRfY29tcGF0X3NobV9pbmZvKHN0cnVjdCBzaG1faW5mbyBfX3VzZXIgKmlwLApkaWZmIC0tZ2l0IGEvaXBjL3V0aWwuaCBiL2lwYy91dGlsLmgKaW5kZXggMDdkNjg5NC4uNDQzNDhjYSAxMDA2NDQKLS0tIGEvaXBjL3V0aWwuaAorKysgYi9pcGMvdXRpbC5oCkBAIC02Nyw3ICs2Nyw3IEBACiB2b2lkIGtlcm5lbF90b19pcGM2NF9wZXJtKHN0cnVjdCBrZXJuX2lwY19wZXJtICppbiwgc3RydWN0IGlwYzY0X3Blcm0gKm91dCk7CiB2b2lkIGlwYzY0X3Blcm1fdG9faXBjX3Blcm0oc3RydWN0IGlwYzY0X3Blcm0gKmluLCBzdHJ1Y3QgaXBjX3Blcm0gKm91dCk7CiAKLSNpZiBkZWZpbmVkKF9faWE2NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19ocHBhX18pCisjaWYgZGVmaW5lZChfX2lhNjRfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKF9fWFRFTlNBX18pCiAgIC8qIE9uIElBLTY0LCB3ZSBhbHdheXMgdXNlIHRoZSAiNjQtYml0IHZlcnNpb24iIG9mIHRoZSBJUEMgc3RydWN0dXJlcy4gICovIAogIyBkZWZpbmUgaXBjX3BhcnNlX3ZlcnNpb24oY21kKQlJUENfNjQKICNlbHNlCmRpZmYgLS1naXQgYS9rZXJuZWwvS2NvbmZpZy5wcmVlbXB0IGIva2VybmVsL0tjb25maWcucHJlZW1wdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ2YTVkCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL0tjb25maWcucHJlZW1wdApAQCAtMCwwICsxLDY1IEBACisKK2Nob2ljZQorCXByb21wdCAiUHJlZW1wdGlvbiBNb2RlbCIKKwlkZWZhdWx0IFBSRUVNUFRfTk9ORQorCitjb25maWcgUFJFRU1QVF9OT05FCisJYm9vbCAiTm8gRm9yY2VkIFByZWVtcHRpb24gKFNlcnZlcikiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgdHJhZGl0aW9uYWwgTGludXggcHJlZW1wdGlvbiBtb2RlbCwgZ2VhcmVkIHRvd2FyZHMKKwkgIHRocm91Z2hwdXQuIEl0IHdpbGwgc3RpbGwgcHJvdmlkZSBnb29kIGxhdGVuY2llcyBtb3N0IG9mIHRoZQorCSAgdGltZSwgYnV0IHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFuZCBvY2Nhc2lvbmFsIGxvbmdlciBkZWxheXMKKwkgIGFyZSBwb3NzaWJsZS4KKworCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgc2VydmVyIG9yCisJICBzY2llbnRpZmljL2NvbXB1dGF0aW9uIHN5c3RlbSwgb3IgaWYgeW91IHdhbnQgdG8gbWF4aW1pemUgdGhlCisJICByYXcgcHJvY2Vzc2luZyBwb3dlciBvZiB0aGUga2VybmVsLCBpcnJlc3BlY3RpdmUgb2Ygc2NoZWR1bGluZworCSAgbGF0ZW5jaWVzLgorCitjb25maWcgUFJFRU1QVF9WT0xVTlRBUlkKKwlib29sICJWb2x1bnRhcnkgS2VybmVsIFByZWVtcHRpb24gKERlc2t0b3ApIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCBieSBhZGRpbmcgbW9yZQorCSAgImV4cGxpY2l0IHByZWVtcHRpb24gcG9pbnRzIiB0byB0aGUga2VybmVsIGNvZGUuIFRoZXNlIG5ldworCSAgcHJlZW1wdGlvbiBwb2ludHMgaGF2ZSBiZWVuIHNlbGVjdGVkIHRvIHJlZHVjZSB0aGUgbWF4aW11bQorCSAgbGF0ZW5jeSBvZiByZXNjaGVkdWxpbmcsIHByb3ZpZGluZyBmYXN0ZXIgYXBwbGljYXRpb24gcmVhY3Rpb25zLAorCSAgYXQgdGhlIGNvc3Qgb2Ygc2xpZ2hseSBsb3dlciB0aHJvdWdocHV0LgorCisJICBUaGlzIGFsbG93cyByZWFjdGlvbiB0byBpbnRlcmFjdGl2ZSBldmVudHMgYnkgYWxsb3dpbmcgYQorCSAgbG93IHByaW9yaXR5IHByb2Nlc3MgdG8gdm9sdW50YXJpbHkgcHJlZW1wdCBpdHNlbGYgZXZlbiBpZiBpdAorCSAgaXMgaW4ga2VybmVsIG1vZGUgZXhlY3V0aW5nIGEgc3lzdGVtIGNhbGwuIFRoaXMgYWxsb3dzCisJICBhcHBsaWNhdGlvbnMgdG8gcnVuIG1vcmUgJ3Ntb290aGx5JyBldmVuIHdoZW4gdGhlIHN5c3RlbSBpcworCSAgdW5kZXIgbG9hZC4KKworCSAgU2VsZWN0IHRoaXMgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBkZXNrdG9wIHN5c3RlbS4KKworY29uZmlnIFBSRUVNUFQKKwlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwgKExvdy1MYXRlbmN5IERlc2t0b3ApIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCBieSBtYWtpbmcKKwkgIGFsbCBrZXJuZWwgY29kZSAodGhhdCBpcyBub3QgZXhlY3V0aW5nIGluIGEgY3JpdGljYWwgc2VjdGlvbikKKwkgIHByZWVtcHRpYmxlLiAgVGhpcyBhbGxvd3MgcmVhY3Rpb24gdG8gaW50ZXJhY3RpdmUgZXZlbnRzIGJ5CisJICBwZXJtaXR0aW5nIGEgbG93IHByaW9yaXR5IHByb2Nlc3MgdG8gYmUgcHJlZW1wdGVkIGludm9sdW50YXJpbHkKKwkgIGV2ZW4gaWYgaXQgaXMgaW4ga2VybmVsIG1vZGUgZXhlY3V0aW5nIGEgc3lzdGVtIGNhbGwgYW5kIHdvdWxkCisJICBvdGhlcndpc2Ugbm90IGJlIGFib3V0IHRvIHJlYWNoIGEgbmF0dXJhbCBwcmVlbXB0aW9uIHBvaW50LgorCSAgVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHJ1biBtb3JlICdzbW9vdGhseScgZXZlbiB3aGVuIHRoZQorCSAgc3lzdGVtIGlzIHVuZGVyIGxvYWQsIGF0IHRoZSBjb3N0IG9mIHNsaWdobHkgbG93ZXIgdGhyb3VnaHB1dAorCSAgYW5kIGEgc2xpZ2h0IHJ1bnRpbWUgb3ZlcmhlYWQgdG8ga2VybmVsIGNvZGUuCisKKwkgIFNlbGVjdCB0aGlzIGlmIHlvdSBhcmUgYnVpbGRpbmcgYSBrZXJuZWwgZm9yIGEgZGVza3RvcCBvcgorCSAgZW1iZWRkZWQgc3lzdGVtIHdpdGggbGF0ZW5jeSByZXF1aXJlbWVudHMgaW4gdGhlIG1pbGxpc2Vjb25kcworCSAgcmFuZ2UuCisKK2VuZGNob2ljZQorCitjb25maWcgUFJFRU1QVF9CS0wKKwlib29sICJQcmVlbXB0IFRoZSBCaWcgS2VybmVsIExvY2siCisJZGVwZW5kcyBvbiBTTVAgfHwgUFJFRU1QVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2YgdGhlIGtlcm5lbCBieSBtYWtpbmcgdGhlCisJICBiaWcga2VybmVsIGxvY2sgcHJlZW1wdGlibGUuCisKKwkgIFNheSBZIGhlcmUgaWYgeW91IGFyZSBidWlsZGluZyBhIGtlcm5lbCBmb3IgYSBkZXNrdG9wIHN5c3RlbS4KKwkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgorCmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYjAxZDI2Zi4uY2IwNWNkMCAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQAogb2JqLSQoQ09ORklHX0tBTExTWU1TKSArPSBrYWxsc3ltcy5vCiBvYmotJChDT05GSUdfUE0pICs9IHBvd2VyLwogb2JqLSQoQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QpICs9IGFjY3Qubworb2JqLSQoQ09ORklHX0tFWEVDKSArPSBrZXhlYy5vCiBvYmotJChDT05GSUdfQ09NUEFUKSArPSBjb21wYXQubwogb2JqLSQoQ09ORklHX0NQVVNFVFMpICs9IGNwdXNldC5vCiBvYmotJChDT05GSUdfSUtDT05GSUcpICs9IGNvbmZpZ3MubwpAQCAtMjcsNiArMjgsNyBAQAogb2JqLSQoQ09ORklHX0tQUk9CRVMpICs9IGtwcm9iZXMubwogb2JqLSQoQ09ORklHX1NZU0ZTKSArPSBrc3lzZnMubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfSEFSRElSUVMpICs9IGlycS8KK29iai0kKENPTkZJR19DUkFTSF9EVU1QKSArPSBjcmFzaF9kdW1wLm8KIG9iai0kKENPTkZJR19TRUNDT01QKSArPSBzZWNjb21wLm8KIAogaWZuZXEgKCQoQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUikseSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCA2MjhmNGNjLi41M2Q4MjYzIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC02MywxOSArNjMsMTUgQEAKIHsKIAlpbnQgZXJyOwogCi0JLyogVGFrZSBvZmZsaW5lOiBtYWtlcyBhcmNoX2NwdV9kb3duIHNvbWV3aGF0IGVhc2llci4gKi8KLQljcHVfY2xlYXIoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7Ci0KIAkvKiBFbnN1cmUgdGhpcyBDUFUgZG9lc24ndCBoYW5kbGUgYW55IG1vcmUgaW50ZXJydXB0cy4gKi8KIAllcnIgPSBfX2NwdV9kaXNhYmxlKCk7CiAJaWYgKGVyciA8IDApCi0JCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7Ci0JZWxzZQotCQkvKiBGb3JjZSBpZGxlIHRhc2sgdG8gcnVuIGFzIHNvb24gYXMgd2UgeWllbGQ6IGl0IHNob3VsZAotCQkgICBpbW1lZGlhdGVseSBub3RpY2UgY3B1IGlzIG9mZmxpbmUgYW5kIGRpZSBxdWlja2x5LiAqLwotCQlzY2hlZF9pZGxlX25leHQoKTsKKwkJcmV0dXJuIGVycjsKIAotCXJldHVybiBlcnI7CisJLyogRm9yY2UgaWRsZSB0YXNrIHRvIHJ1biBhcyBzb29uIGFzIHdlIHlpZWxkOiBpdCBzaG91bGQKKwkgICBpbW1lZGlhdGVseSBub3RpY2UgY3B1IGlzIG9mZmxpbmUgYW5kIGRpZSBxdWlja2x5LiAqLworCXNjaGVkX2lkbGVfbmV4dCgpOworCXJldHVybiAwOwogfQogCiBpbnQgY3B1X2Rvd24odW5zaWduZWQgaW50IGNwdSkKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCA3OWRkOTI5Li45ODRjMGJmIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC01OTUsMTAgKzU5NSw2MiBAQAogCXJldHVybiAwOwogfQogCisvKgorICogRm9yIGEgZ2l2ZW4gY3B1c2V0IGN1ciwgcGFydGl0aW9uIHRoZSBzeXN0ZW0gYXMgZm9sbG93cworICogYS4gQWxsIGNwdXMgaW4gdGhlIHBhcmVudCBjcHVzZXQncyBjcHVzX2FsbG93ZWQgdGhhdCBhcmUgbm90IHBhcnQgb2YgYW55CisgKiAgICBleGNsdXNpdmUgY2hpbGQgY3B1c2V0cworICogYi4gQWxsIGNwdXMgaW4gdGhlIGN1cnJlbnQgY3B1c2V0J3MgY3B1c19hbGxvd2VkIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGFueQorICogICAgZXhjbHVzaXZlIGNoaWxkIGNwdXNldHMKKyAqIEJ1aWxkIHRoZXNlIHR3byBwYXJ0aXRpb25zIGJ5IGNhbGxpbmcgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMKKyAqCisgKiBDYWxsIHdpdGggY3B1c2V0X3NlbSBoZWxkLiAgTWF5IG5lc3QgYSBjYWxsIHRvIHRoZQorICogbG9ja19jcHVfaG90cGx1ZygpL3VubG9ja19jcHVfaG90cGx1ZygpIHBhaXIuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9jcHVfZG9tYWlucyhzdHJ1Y3QgY3B1c2V0ICpjdXIpCit7CisJc3RydWN0IGNwdXNldCAqYywgKnBhciA9IGN1ci0+cGFyZW50OworCWNwdW1hc2tfdCBwc3BhbiwgY3NwYW47CisKKwlpZiAocGFyID09IE5VTEwgfHwgY3B1c19lbXB0eShjdXItPmNwdXNfYWxsb3dlZCkpCisJCXJldHVybjsKKworCS8qCisJICogR2V0IGFsbCBjcHVzIGZyb20gcGFyZW50J3MgY3B1c19hbGxvd2VkIG5vdCBwYXJ0IG9mIGV4Y2x1c2l2ZQorCSAqIGNoaWxkcmVuCisJICovCisJcHNwYW4gPSBwYXItPmNwdXNfYWxsb3dlZDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZwYXItPmNoaWxkcmVuLCBzaWJsaW5nKSB7CisJCWlmIChpc19jcHVfZXhjbHVzaXZlKGMpKQorCQkJY3B1c19hbmRub3QocHNwYW4sIHBzcGFuLCBjLT5jcHVzX2FsbG93ZWQpOworCX0KKwlpZiAoaXNfcmVtb3ZlZChjdXIpIHx8ICFpc19jcHVfZXhjbHVzaXZlKGN1cikpIHsKKwkJY3B1c19vcihwc3BhbiwgcHNwYW4sIGN1ci0+Y3B1c19hbGxvd2VkKTsKKwkJaWYgKGNwdXNfZXF1YWwocHNwYW4sIGN1ci0+Y3B1c19hbGxvd2VkKSkKKwkJCXJldHVybjsKKwkJY3NwYW4gPSBDUFVfTUFTS19OT05FOworCX0gZWxzZSB7CisJCWlmIChjcHVzX2VtcHR5KHBzcGFuKSkKKwkJCXJldHVybjsKKwkJY3NwYW4gPSBjdXItPmNwdXNfYWxsb3dlZDsKKwkJLyoKKwkJICogR2V0IGFsbCBjcHVzIGZyb20gY3VycmVudCBjcHVzZXQncyBjcHVzX2FsbG93ZWQgbm90IHBhcnQKKwkJICogb2YgZXhjbHVzaXZlIGNoaWxkcmVuCisJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZjdXItPmNoaWxkcmVuLCBzaWJsaW5nKSB7CisJCQlpZiAoaXNfY3B1X2V4Y2x1c2l2ZShjKSkKKwkJCQljcHVzX2FuZG5vdChjc3BhbiwgY3NwYW4sIGMtPmNwdXNfYWxsb3dlZCk7CisJCX0KKwl9CisKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CisJcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoJnBzcGFuLCAmY3NwYW4pOworCXVubG9ja19jcHVfaG90cGx1ZygpOworfQorCiBzdGF0aWMgaW50IHVwZGF0ZV9jcHVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNwdXNldCB0cmlhbGNzOwotCWludCByZXR2YWw7CisJaW50IHJldHZhbCwgY3B1c191bmNoYW5nZWQ7CiAKIAl0cmlhbGNzID0gKmNzOwogCXJldHZhbCA9IGNwdWxpc3RfcGFyc2UoYnVmLCB0cmlhbGNzLmNwdXNfYWxsb3dlZCk7CkBAIC02MDgsOSArNjYwLDEzIEBACiAJaWYgKGNwdXNfZW1wdHkodHJpYWxjcy5jcHVzX2FsbG93ZWQpKQogCQlyZXR1cm4gLUVOT1NQQzsKIAlyZXR2YWwgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsICZ0cmlhbGNzKTsKLQlpZiAocmV0dmFsID09IDApCi0JCWNzLT5jcHVzX2FsbG93ZWQgPSB0cmlhbGNzLmNwdXNfYWxsb3dlZDsKLQlyZXR1cm4gcmV0dmFsOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCWNwdXNfdW5jaGFuZ2VkID0gY3B1c19lcXVhbChjcy0+Y3B1c19hbGxvd2VkLCB0cmlhbGNzLmNwdXNfYWxsb3dlZCk7CisJY3MtPmNwdXNfYWxsb3dlZCA9IHRyaWFsY3MuY3B1c19hbGxvd2VkOworCWlmIChpc19jcHVfZXhjbHVzaXZlKGNzKSAmJiAhY3B1c191bmNoYW5nZWQpCisJCXVwZGF0ZV9jcHVfZG9tYWlucyhjcyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdXBkYXRlX25vZGVtYXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjaGFyICpidWYpCkBAIC02NDYsNyArNzAyLDcgQEAKIHsKIAlpbnQgdHVybmluZ19vbjsKIAlzdHJ1Y3QgY3B1c2V0IHRyaWFsY3M7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBjcHVfZXhjbHVzaXZlX2NoYW5nZWQ7CiAKIAl0dXJuaW5nX29uID0gKHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApICE9IDApOwogCkBAIC02NTcsMTMgKzcxMywxOCBAQAogCQljbGVhcl9iaXQoYml0LCAmdHJpYWxjcy5mbGFncyk7CiAKIAllcnIgPSB2YWxpZGF0ZV9jaGFuZ2UoY3MsICZ0cmlhbGNzKTsKLQlpZiAoZXJyID09IDApIHsKLQkJaWYgKHR1cm5pbmdfb24pCi0JCQlzZXRfYml0KGJpdCwgJmNzLT5mbGFncyk7Ci0JCWVsc2UKLQkJCWNsZWFyX2JpdChiaXQsICZjcy0+ZmxhZ3MpOwotCX0KLQlyZXR1cm4gZXJyOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWNwdV9leGNsdXNpdmVfY2hhbmdlZCA9CisJCShpc19jcHVfZXhjbHVzaXZlKGNzKSAhPSBpc19jcHVfZXhjbHVzaXZlKCZ0cmlhbGNzKSk7CisJaWYgKHR1cm5pbmdfb24pCisJCXNldF9iaXQoYml0LCAmY3MtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChiaXQsICZjcy0+ZmxhZ3MpOworCisJaWYgKGNwdV9leGNsdXNpdmVfY2hhbmdlZCkKKyAgICAgICAgICAgICAgICB1cGRhdGVfY3B1X2RvbWFpbnMoY3MpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF0dGFjaF90YXNrKHN0cnVjdCBjcHVzZXQgKmNzLCBjaGFyICpidWYpCkBAIC0xMzA5LDEyICsxMzcwLDE0IEBACiAJCXVwKCZjcHVzZXRfc2VtKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0Jc3Bpbl9sb2NrKCZjcy0+ZGVudHJ5LT5kX2xvY2spOwogCXBhcmVudCA9IGNzLT5wYXJlbnQ7CiAJc2V0X2JpdChDU19SRU1PVkVELCAmY3MtPmZsYWdzKTsKKwlpZiAoaXNfY3B1X2V4Y2x1c2l2ZShjcykpCisJCXVwZGF0ZV9jcHVfZG9tYWlucyhjcyk7CiAJbGlzdF9kZWwoJmNzLT5zaWJsaW5nKTsJLyogZGVsZXRlIG15IHNpYmxpbmcgZnJvbSBwYXJlbnQtPmNoaWxkcmVuICovCiAJaWYgKGxpc3RfZW1wdHkoJnBhcmVudC0+Y2hpbGRyZW4pKQogCQljaGVja19mb3JfcmVsZWFzZShwYXJlbnQpOworCXNwaW5fbG9jaygmY3MtPmRlbnRyeS0+ZF9sb2NrKTsKIAlkID0gZGdldChjcy0+ZGVudHJ5KTsKIAljcy0+ZGVudHJ5ID0gTlVMTDsKIAlzcGluX3VubG9jaygmZC0+ZF9sb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcmFzaF9kdW1wLmMgYi9rZXJuZWwvY3Jhc2hfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OWJhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKglrZXJuZWwvY3Jhc2hfZHVtcC5jIC0gTWVtb3J5IHByZXNlcnZpbmcgcmVib290IHJlbGF0ZWQgY29kZS4KKyAqCisgKglDcmVhdGVkIGJ5OiBIYXJpcHJhc2FkIE5lbGxpdGhlZXJ0aGEgKGhhcmlAaW4uaWJtLmNvbSkKKyAqCUNvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0LiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiBTdG9yZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZWxmIGhlYWRlciBvZiBjcmFzaCBpbWFnZS4gKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBlbGZjb3JlaGRyX2FkZHIgPSBFTEZDT1JFX0FERFJfTUFYOworCisvKgorICogQ29weSBhIHBhZ2UgZnJvbSAib2xkbWVtIi4gRm9yIHRoaXMgcGFnZSwgdGhlcmUgaXMgbm8gcHRlIG1hcHBlZAorICogaW4gdGhlIGN1cnJlbnQga2VybmVsLiBXZSBzdGl0Y2ggdXAgYSBwdGUsIHNpbWlsYXIgdG8ga21hcF9hdG9taWMuCisgKi8KK3NzaXplX3QgY29weV9vbGRtZW1fcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgY2hhciAqYnVmLAorCQkJCXNpemVfdCBjc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGludCB1c2VyYnVmKQoreworCXZvaWQgKnBhZ2UsICp2YWRkcjsKKworCWlmICghY3NpemUpCisJCXJldHVybiAwOworCisJcGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJdmFkZHIgPSBrbWFwX2F0b21pY19wZm4ocGZuLCBLTV9QVEUwKTsKKwljb3B5X3BhZ2UocGFnZSwgdmFkZHIpOworCWt1bm1hcF9hdG9taWModmFkZHIsIEtNX1BURTApOworCisJaWYgKHVzZXJidWYpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsIChwYWdlICsgb2Zmc2V0KSwgY3NpemUpKSB7CisJCQlrZnJlZShwYWdlKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5KGJ1ZiwgKHBhZ2UgKyBvZmZzZXQpLCBjc2l6ZSk7CisJfQorCisJa2ZyZWUocGFnZSk7CisJcmV0dXJuIGNzaXplOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggM2ViY2Q2MC4uOWQxYjEwZSAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC03ODQsNiArNzg0LDggQEAKIAogCXByb2ZpbGVfdGFza19leGl0KHRzayk7CiAKKwlXQVJOX09OKGF0b21pY19yZWFkKCZ0c2stPmZzX2V4Y2wpKTsKKwogCWlmICh1bmxpa2VseShpbl9pbnRlcnJ1cHQoKSkpCiAJCXBhbmljKCJBaWVlLCBraWxsaW5nIGludGVycnVwdCBoYW5kbGVyISIpOwogCWlmICh1bmxpa2VseSghdHNrLT5waWQpKQpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggYTI4ZDExZS4uYjY1MTg3ZiAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0yMDgsOCArMjA4LDEwIEBACiAJCXN0cnVjdCBmaWxlICpmaWxlOwogCiAJCWlmIChtcG50LT52bV9mbGFncyAmIFZNX0RPTlRDT1BZKSB7CisJCQlsb25nIHBhZ2VzID0gdm1hX3BhZ2VzKG1wbnQpOworCQkJbW0tPnRvdGFsX3ZtIC09IHBhZ2VzOwogCQkJX192bV9zdGF0X2FjY291bnQobW0sIG1wbnQtPnZtX2ZsYWdzLCBtcG50LT52bV9maWxlLAotCQkJCQkJCS12bWFfcGFnZXMobXBudCkpOworCQkJCQkJCQktcGFnZXMpOwogCQkJY29udGludWU7CiAJCX0KIAkJY2hhcmdlID0gMDsKQEAgLTEwMDMsOSArMTAwNSw2IEBACiAJcC0+cGRlYXRoX3NpZ25hbCA9IDA7CiAJcC0+ZXhpdF9zdGF0ZSA9IDA7CiAKLQkvKiBQZXJmb3JtIHNjaGVkdWxlciByZWxhdGVkIHNldHVwICovCi0Jc2NoZWRfZm9yayhwKTsKLQogCS8qCiAJICogT2ssIG1ha2UgaXQgdmlzaWJsZSB0byB0aGUgcmVzdCBvZiB0aGUgc3lzdGVtLgogCSAqIFdlIGRvbnQgd2FrZSBpdCB1cCB5ZXQuCkBAIC0xMDE0LDE4ICsxMDEzLDI0IEBACiAJSU5JVF9MSVNUX0hFQUQoJnAtPnB0cmFjZV9jaGlsZHJlbik7CiAJSU5JVF9MSVNUX0hFQUQoJnAtPnB0cmFjZV9saXN0KTsKIAorCS8qIFBlcmZvcm0gc2NoZWR1bGVyIHJlbGF0ZWQgc2V0dXAuIEFzc2lnbiB0aGlzIHRhc2sgdG8gYSBDUFUuICovCisJc2NoZWRfZm9yayhwLCBjbG9uZV9mbGFncyk7CisKIAkvKiBOZWVkIHRhc2tsaXN0IGxvY2sgZm9yIHBhcmVudCBldGMgaGFuZGxpbmchICovCiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCiAJLyoKLQkgKiBUaGUgdGFzayBoYXNuJ3QgYmVlbiBhdHRhY2hlZCB5ZXQsIHNvIGNwdXNfYWxsb3dlZCBtYXNrIGNhbm5vdAotCSAqIGhhdmUgY2hhbmdlZC4gVGhlIGNwdXNfYWxsb3dlZCBtYXNrIG9mIHRoZSBwYXJlbnQgbWF5IGhhdmUKLQkgKiBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjb3BpZWQgZmlyc3QgdGltZSwgYW5kIGl0IG1heSB0aGVuIG1vdmUgdG8KLQkgKiBhbm90aGVyIENQVSAtIHNvIHdlIHJlLWNvcHkgaXQgaGVyZSBhbmQgc2V0IHRoZSBjaGlsZCdzIENQVSB0bwotCSAqIHRoZSBwYXJlbnQncyBDUFUuIFRoaXMgYXZvaWRzIGFsb3Qgb2YgbmFzdHkgcmFjZXMuCisJICogVGhlIHRhc2sgaGFzbid0IGJlZW4gYXR0YWNoZWQgeWV0LCBzbyBpdHMgY3B1c19hbGxvd2VkIG1hc2sgd2lsbAorCSAqIG5vdCBiZSBjaGFuZ2VkLCBub3Igd2lsbCBpdHMgYXNzaWduZWQgQ1BVLgorCSAqCisJICogVGhlIGNwdXNfYWxsb3dlZCBtYXNrIG9mIHRoZSBwYXJlbnQgbWF5IGhhdmUgY2hhbmdlZCBhZnRlciBpdCB3YXMKKwkgKiBjb3BpZWQgZmlyc3QgdGltZSAtIHNvIHJlLWNvcHkgaXQgaGVyZSwgdGhlbiBjaGVjayB0aGUgY2hpbGQncyBDUFUKKwkgKiB0byBlbnN1cmUgaXQgaXMgb24gYSB2YWxpZCBDUFUgKGFuZCBpZiBub3QsIGp1c3QgZm9yY2UgaXQgYmFjayB0bworCSAqIHBhcmVudCdzIENQVSkuIFRoaXMgYXZvaWRzIGFsb3Qgb2YgbmFzdHkgcmFjZXMuCiAJICovCiAJcC0+Y3B1c19hbGxvd2VkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwotCXNldF90YXNrX2NwdShwLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KHRhc2tfY3B1KHApLCBwLT5jcHVzX2FsbG93ZWQpKSkKKwkJc2V0X3Rhc2tfY3B1KHAsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAKIAkvKgogCSAqIENoZWNrIGZvciBwZW5kaW5nIFNJR0tJTEwhIFRoZSBuZXcgdGhyZWFkIHNob3VsZCBub3QgYmUgYWxsb3dlZApAQCAtMTA4Nyw2ICsxMDkyLDExIEBACiAJCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAl9CiAKKwkvKgorCSAqIGluaGVyaXQgaW9wcmlvCisJICovCisJcC0+aW9wcmlvID0gY3VycmVudC0+aW9wcmlvOworCiAJU0VUX0xJTktTKHApOwogCWlmICh1bmxpa2VseShwLT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKIAkJX19wdHJhY2VfbGluayhwLCBjdXJyZW50LT5wYXJlbnQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9hdXRvcHJvYmUuYyBiL2tlcm5lbC9pcnEvYXV0b3Byb2JlLmMKaW5kZXggOThkNjJkOC4uMzQ2NzA5NyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9hdXRvcHJvYmUuYworKysgYi9rZXJuZWwvaXJxL2F1dG9wcm9iZS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKIC8qCiAgKiBBdXRvZGV0ZWN0aW9uIGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCBhbnkgaW50ZXJydXB0IHRoYXQKQEAgLTI2LDcgKzI3LDcgQEAKICAqLwogdW5zaWduZWQgbG9uZyBwcm9iZV9pcnFfb24odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCwgZGVsYXk7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAJaXJxX2Rlc2NfdCAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtNDUsOCArNDYsNyBAQAogCX0KIAogCS8qIFdhaXQgZm9yIGxvbmdzdGFuZGluZyBpbnRlcnJ1cHRzIHRvIHRyaWdnZXIuICovCi0JZm9yIChkZWxheSA9IGppZmZpZXMgKyBIWi81MDsgdGltZV9hZnRlcihkZWxheSwgamlmZmllcyk7ICkKLQkJLyogYWJvdXQgMjBtcyBkZWxheSAqLyBiYXJyaWVyKCk7CisJbXNsZWVwKDIwKTsKIAogCS8qCiAJICogZW5hYmxlIGFueSB1bmFzc2lnbmVkIGlycXMKQEAgLTY4LDggKzY4LDcgQEAKIAkvKgogCSAqIFdhaXQgZm9yIHNwdXJpb3VzIGludGVycnVwdHMgdG8gdHJpZ2dlcgogCSAqLwotCWZvciAoZGVsYXkgPSBqaWZmaWVzICsgSFovMTA7IHRpbWVfYWZ0ZXIoZGVsYXksIGppZmZpZXMpOyApCi0JCS8qIGFib3V0IDEwMG1zIGRlbGF5ICovIGJhcnJpZXIoKTsKKwltc2xlZXAoMTAwKTsKIAogCS8qCiAJICogTm93IGZpbHRlciBvdXQgYW55IG9idmlvdXNseSBzcHVyaW91cyBpbnRlcnJ1cHRzCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2hhbmRsZS5jIGIva2VybmVsL2lycS9oYW5kbGUuYwppbmRleCA0MzZjN2Q5Li5jMjlmODNjIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2hhbmRsZS5jCisrKyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAJCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAJCWlmICghbm9pcnFkZWJ1ZykKLQkJCW5vdGVfaW50ZXJydXB0KGlycSwgZGVzYywgYWN0aW9uX3JldCk7CisJCQlub3RlX2ludGVycnVwdChpcnEsIGRlc2MsIGFjdGlvbl9yZXQsIHJlZ3MpOwogCQlpZiAobGlrZWx5KCEoZGVzYy0+c3RhdHVzICYgSVJRX1BFTkRJTkcpKSkKIAkJCWJyZWFrOwogCQlkZXNjLT5zdGF0dXMgJj0gfklSUV9QRU5ESU5HOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9zcHVyaW91cy5jIGIva2VybmVsL2lycS9zcHVyaW91cy5jCmluZGV4IGY2Mjk3YzMuLjdkZjlhYmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYworKysgYi9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKQEAgLTExLDYgKzExLDgzIEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAorc3RhdGljIGludCBpcnFmaXh1cDsKKworLyoKKyAqIFJlY292ZXJ5IGhhbmRsZXIgZm9yIG1pc3JvdXRlZCBpbnRlcnJ1cHRzLgorICovCisKK3N0YXRpYyBpbnQgbWlzcm91dGVkX2lycShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlpcnFfZGVzY190ICpkZXNjOworCWludCBvayA9IDA7CisJaW50IHdvcmsgPSAwOwkvKiBEaWQgd2UgZG8gd29yayBmb3IgYSByZWFsIElSUSAqLworCisJZm9yKGkgPSAxOyBpIDwgTlJfSVJRUzsgaSsrKSB7CisJCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKworCQlpZiAoaSA9PSBpcnEpCS8qIEFscmVhZHkgdHJpZWQgKi8KKwkJCWNvbnRpbnVlOworCQlkZXNjID0gJmlycV9kZXNjW2ldOworCQlzcGluX2xvY2soJmRlc2MtPmxvY2spOworCQlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CisJCS8qIEFscmVhZHkgcnVubmluZyBvbiBhbm90aGVyIHByb2Nlc3NvciAqLworCQlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX0lOUFJPR1JFU1MpIHsKKwkJCS8qCisJCQkgKiBBbHJlYWR5IHJ1bm5pbmc6IElmIGl0IGlzIHNoYXJlZCBnZXQgdGhlIG90aGVyCisJCQkgKiBDUFUgdG8gZ28gbG9va2luZyBmb3Igb3VyIG15c3RlcnkgaW50ZXJydXB0IHRvbworCQkJICovCisJCQlpZiAoZGVzYy0+YWN0aW9uICYmIChkZXNjLT5hY3Rpb24tPmZsYWdzICYgU0FfU0hJUlEpKQorCQkJCWRlc2MtPnN0YXR1cyB8PSBJUlFfUEVORElORzsKKwkJCXNwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEhvbm91ciB0aGUgbm9ybWFsIElSUSBsb2NraW5nICovCisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKKwkJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOworCQl3aGlsZSAoYWN0aW9uKSB7CisJCQkvKiBPbmx5IHNoYXJlZCBJUlEgaGFuZGxlcnMgYXJlIHNhZmUgdG8gY2FsbCAqLworCQkJaWYgKGFjdGlvbi0+ZmxhZ3MgJiBTQV9TSElSUSkgeworCQkJCWlmIChhY3Rpb24tPmhhbmRsZXIoaSwgYWN0aW9uLT5kZXZfaWQsIHJlZ3MpID09CisJCQkJCQlJUlFfSEFORExFRCkKKwkJCQkJb2sgPSAxOworCQkJfQorCQkJYWN0aW9uID0gYWN0aW9uLT5uZXh0OworCQl9CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCS8qIE5vdyBjbGVhbiB1cCB0aGUgZmxhZ3MgKi8KKwkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKKwkJYWN0aW9uID0gZGVzYy0+YWN0aW9uOworCisJCS8qCisJCSAqIFdoaWxlIHdlIHdlcmUgbG9va2luZyBmb3IgYSBmaXh1cCBzb21lb25lIHF1ZXVlZCBhIHJlYWwKKwkJICogSVJRIGNsYXNoaW5nIHdpdGggb3VyIHdhbGsKKwkJICovCisKKwkJd2hpbGUgKChkZXNjLT5zdGF0dXMgJiBJUlFfUEVORElORykgJiYgYWN0aW9uKSB7CisJCQkvKgorCQkJICogUGVyZm9ybSByZWFsIElSUSBwcm9jZXNzaW5nIGZvciB0aGUgSVJRIHdlIGRlZmVycmVkCisJCQkgKi8KKwkJCXdvcmsgPSAxOworCQkJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOworCQkJaGFuZGxlX0lSUV9ldmVudChpLCByZWdzLCBhY3Rpb24pOworCQkJc3Bpbl9sb2NrKCZkZXNjLT5sb2NrKTsKKwkJCWRlc2MtPnN0YXR1cyAmPSB+SVJRX1BFTkRJTkc7CisJCX0KKwkJZGVzYy0+c3RhdHVzICY9IH5JUlFfSU5QUk9HUkVTUzsKKwkJLyoKKwkJICogSWYgd2UgZGlkIGFjdHVhbCB3b3JrIGZvciB0aGUgcmVhbCBJUlEgbGluZSB3ZSBtdXN0IGxldCB0aGUKKwkJICogSVJRIGNvbnRyb2xsZXIgY2xlYW4gdXAgdG9vCisJCSAqLworCQlpZih3b3JrKQorCQkJZGVzYy0+aGFuZGxlci0+ZW5kKGkpOworCQlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CisJfQorCS8qIFNvIHRoZSBjYWxsZXIgY2FuIGFkanVzdCB0aGUgaXJxIGVycm9yIGNvdW50cyAqLworCXJldHVybiBvazsKK30KKwogLyoKICAqIElmIDk5LDkwMCBvZiB0aGUgcHJldmlvdXMgMTAwLDAwMCBpbnRlcnJ1cHRzIGhhdmUgbm90IGJlZW4gaGFuZGxlZAogICogdGhlbiBhc3N1bWUgdGhhdCB0aGUgSVJRIGlzIHN0dWNrIGluIHNvbWUgbWFubmVyLiBEcm9wIGEgZGlhZ25vc3RpYwpAQCAtMzEsNyArMTA4LDggQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJpcnEgZXZlbnQgJWQ6IGJvZ3VzIHJldHVybiB2YWx1ZSAleFxuIiwKIAkJCQlpcnEsIGFjdGlvbl9yZXQpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaXJxICVkOiBub2JvZHkgY2FyZWQhXG4iLCBpcnEpOworCQlwcmludGsoS0VSTl9FUlIgImlycSAlZDogbm9ib2R5IGNhcmVkICh0cnkgYm9vdGluZyB3aXRoICIKKwkJCQkidGhlIFwiaXJxcG9sbFwiIG9wdGlvbilcbiIsIGlycSk7CiAJfQogCWR1bXBfc3RhY2soKTsKIAlwcmludGsoS0VSTl9FUlIgImhhbmRsZXJzOlxuIik7CkBAIC00NSw3ICsxMjMsNyBAQAogCX0KIH0KIAotdm9pZCByZXBvcnRfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLCBpcnFyZXR1cm5fdCBhY3Rpb25fcmV0KQorc3RhdGljIHZvaWQgcmVwb3J0X2JhZF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxX2Rlc2NfdCAqZGVzYywgaXJxcmV0dXJuX3QgYWN0aW9uX3JldCkKIHsKIAlzdGF0aWMgaW50IGNvdW50ID0gMTAwOwogCkBAIC01NSw3ICsxMzMsOCBAQAogCX0KIH0KIAotdm9pZCBub3RlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLCBpcnFyZXR1cm5fdCBhY3Rpb25fcmV0KQordm9pZCBub3RlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBpcnFfZGVzY190ICpkZXNjLCBpcnFyZXR1cm5fdCBhY3Rpb25fcmV0LAorCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaWYgKGFjdGlvbl9yZXQgIT0gSVJRX0hBTkRMRUQpIHsKIAkJZGVzYy0+aXJxc191bmhhbmRsZWQrKzsKQEAgLTYzLDYgKzE0MiwxNSBAQAogCQkJcmVwb3J0X2JhZF9pcnEoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAl9CiAKKwlpZiAodW5saWtlbHkoaXJxZml4dXApKSB7CisJCS8qIERvbid0IHB1bmlzaCB3b3JraW5nIGNvbXB1dGVycyAqLworCQlpZiAoKGlycWZpeHVwID09IDIgJiYgaXJxID09IDApIHx8IGFjdGlvbl9yZXQgPT0gSVJRX05PTkUpIHsKKwkJCWludCBvayA9IG1pc3JvdXRlZF9pcnEoaXJxLCByZWdzKTsKKwkJCWlmIChhY3Rpb25fcmV0ID09IElSUV9OT05FKQorCQkJCWRlc2MtPmlycXNfdW5oYW5kbGVkIC09IG9rOworCQl9CisJfQorCiAJZGVzYy0+aXJxX2NvdW50Kys7CiAJaWYgKGRlc2MtPmlycV9jb3VudCA8IDEwMDAwMCkKIAkJcmV0dXJuOwpAQCAtOTQsMyArMTgyLDI0IEBACiAKIF9fc2V0dXAoIm5vaXJxZGVidWciLCBub2lycWRlYnVnX3NldHVwKTsKIAorc3RhdGljIGludCBfX2luaXQgaXJxZml4dXBfc2V0dXAoY2hhciAqc3RyKQoreworCWlycWZpeHVwID0gMTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJNaXNyb3V0ZWQgSVJRIGZpeHVwIHN1cHBvcnQgZW5hYmxlZC5cbiIpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIlRoaXMgbWF5IGltcGFjdCBzeXN0ZW0gcGVyZm9ybWFuY2UuXG4iKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiaXJxZml4dXAiLCBpcnFmaXh1cF9zZXR1cCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGlycXBvbGxfc2V0dXAoY2hhciAqc3RyKQoreworCWlycWZpeHVwID0gMjsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJNaXNyb3V0ZWQgSVJRIGZpeHVwIGFuZCBwb2xsaW5nIHN1cHBvcnQgIgorCQkJCSJlbmFibGVkXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJUaGlzIG1heSBzaWduaWZpY2FudGx5IGltcGFjdCBzeXN0ZW0gIgorCQkJCSJwZXJmb3JtYW5jZVxuIik7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImlycXBvbGwiLCBpcnFwb2xsX3NldHVwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pdGltZXIuYyBiL2tlcm5lbC9pdGltZXIuYwppbmRleCAxZGM5ODhlLi5hNzJjYjBlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXRpbWVyLmMKKysrIGIva2VybmVsL2l0aW1lci5jCkBAIC0xNTMsMTEgKzE1MywxNSBAQAogCiAJc3dpdGNoICh3aGljaCkgewogCWNhc2UgSVRJTUVSX1JFQUw6CithZ2FpbjoKIAkJc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJaW50ZXJ2YWwgPSB0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyOwogCQl2YWwgPSBpdF9yZWFsX3ZhbHVlKHRzay0+c2lnbmFsKTsKLQkJaWYgKHZhbCkKLQkJCWRlbF90aW1lcl9zeW5jKCZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcik7CisJCS8qIFdlIGFyZSBzaGFyaW5nIC0+c2lnbG9jayB3aXRoIGl0X3JlYWxfZm4oKSAqLworCQlpZiAodHJ5X3RvX2RlbF90aW1lcl9zeW5jKCZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcikgPCAwKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQlnb3RvIGFnYWluOworCQl9CiAJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IgPQogCQkJdGltZXZhbF90b19qaWZmaWVzKCZ2YWx1ZS0+aXRfaW50ZXJ2YWwpOwogCQlpdF9yZWFsX2FybSh0c2ssIHRpbWV2YWxfdG9famlmZmllcygmdmFsdWUtPml0X3ZhbHVlKSk7CmRpZmYgLS1naXQgYS9rZXJuZWwva2V4ZWMuYyBiL2tlcm5lbC9rZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDRkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtMCwwICsxLDEwNjMgQEAKKy8qCisgKiBrZXhlYy5jIC0ga2V4ZWMgc3lzdGVtIGNhbGwKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IEVyaWMgQmllZGVybWFuICA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisvKiBMb2NhdGlvbiBvZiB0aGUgcmVzZXJ2ZWQgYXJlYSBmb3IgdGhlIGNyYXNoIGtlcm5lbCAqLworc3RydWN0IHJlc291cmNlIGNyYXNoa19yZXMgPSB7CisJLm5hbWUgID0gIkNyYXNoIGtlcm5lbCIsCisJLnN0YXJ0ID0gMCwKKwkuZW5kICAgPSAwLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfQlVTWSB8IElPUkVTT1VSQ0VfTUVNCit9OworCitpbnQga2V4ZWNfc2hvdWxkX2NyYXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlpZiAoaW5faW50ZXJydXB0KCkgfHwgIXAtPnBpZCB8fCBwLT5waWQgPT0gMSB8fCBwYW5pY19vbl9vb3BzKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdoZW4ga2V4ZWMgdHJhbnNpdGlvbnMgdG8gdGhlIG5ldyBrZXJuZWwgdGhlcmUgaXMgYSBvbmUtdG8tb25lCisgKiBtYXBwaW5nIGJldHdlZW4gcGh5c2ljYWwgYW5kIHZpcnR1YWwgYWRkcmVzc2VzLiAgT24gcHJvY2Vzc29ycworICogd2hlcmUgeW91IGNhbiBkaXNhYmxlIHRoZSBNTVUgdGhpcyBpcyB0cml2aWFsLCBhbmQgZWFzeS4gIEZvcgorICogb3RoZXJzIGl0IGlzIHN0aWxsIGEgc2ltcGxlIHByZWRpY3RhYmxlIHBhZ2UgdGFibGUgdG8gc2V0dXAuCisgKgorICogSW4gdGhhdCBlbnZpcm9ubWVudCBrZXhlYyBjb3BpZXMgdGhlIG5ldyBrZXJuZWwgdG8gaXRzIGZpbmFsCisgKiByZXN0aW5nIHBsYWNlLiAgVGhpcyBtZWFucyBJIGNhbiBvbmx5IHN1cHBvcnQgbWVtb3J5IHdob3NlCisgKiBwaHlzaWNhbCBhZGRyZXNzIGNhbiBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZy4gIEluIHBhcnRpY3VsYXIKKyAqIGFkZHJlc3NlcyB3aGVyZSAocGZuIDw8IFBBR0VfU0hJRlQpID4gVUxPTkdfTUFYIGNhbm5vdCBiZSBoYW5kbGVkLgorICogSWYgdGhlIGFzc2VtYmx5IHN0dWIgaGFzIG1vcmUgcmVzdHJpY3RpdmUgcmVxdWlyZW1lbnRzCisgKiBLRVhFQ19TT1VSQ0VfTUVNT1JZX0xJTUlUIGFuZCBLRVhFQ19ERVNUX01FTU9SWV9MSU1JVCBjYW4gYmUKKyAqIGRlZmluZWQgbW9yZSByZXN0cmljdGl2ZWx5IGluIDxhc20va2V4ZWMuaD4uCisgKgorICogVGhlIGNvZGUgZm9yIHRoZSB0cmFuc2l0aW9uIGZyb20gdGhlIGN1cnJlbnQga2VybmVsIHRvIHRoZQorICogdGhlIG5ldyBrZXJuZWwgaXMgcGxhY2VkIGluIHRoZSBjb250cm9sX2NvZGVfYnVmZmVyLCB3aG9zZSBzaXplCisgKiBpcyBnaXZlbiBieSBLRVhFQ19DT05UUk9MX0NPREVfU0laRS4gIEluIHRoZSBiZXN0IGNhc2Ugb25seSBhIHNpbmdsZQorICogcGFnZSBvZiBtZW1vcnkgaXMgbmVjZXNzYXJ5LCBidXQgc29tZSBhcmNoaXRlY3R1cmVzIHJlcXVpcmUgbW9yZS4KKyAqIEJlY2F1c2UgdGhpcyBtZW1vcnkgbXVzdCBiZSBpZGVudGl0eSBtYXBwZWQgaW4gdGhlIHRyYW5zaXRpb24gZnJvbQorICogdmlydHVhbCB0byBwaHlzaWNhbCBhZGRyZXNzZXMgaXQgbXVzdCBsaXZlIGluIHRoZSByYW5nZQorICogMCAtIFRBU0tfU0laRSwgYXMgb25seSB0aGUgdXNlciBzcGFjZSBtYXBwaW5ncyBhcmUgYXJiaXRyYXJpbHkKKyAqIG1vZGlmaWFibGUuCisgKgorICogVGhlIGFzc2VtYmx5IHN0dWIgaW4gdGhlIGNvbnRyb2wgY29kZSBidWZmZXIgaXMgcGFzc2VkIGEgbGlua2VkIGxpc3QKKyAqIG9mIGRlc2NyaXB0b3IgcGFnZXMgZGV0YWlsaW5nIHRoZSBzb3VyY2UgcGFnZXMgb2YgdGhlIG5ldyBrZXJuZWwsCisgKiBhbmQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBvZiB0aG9zZSBzb3VyY2UgcGFnZXMuICBBcyB0aGlzIGRhdGEKKyAqIHN0cnVjdHVyZSBpcyBub3QgdXNlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCBPUywgaXQgbXVzdAorICogYmUgc2VsZi1jb250YWluZWQuCisgKgorICogVGhlIGNvZGUgaGFzIGJlZW4gbWFkZSB0byB3b3JrIHdpdGggaGlnaG1lbSBwYWdlcyBhbmQgd2lsbCB1c2UgYQorICogZGVzdGluYXRpb24gcGFnZSBpbiBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoaWYgaXQgaGFwcGVucworICogdG8gYWxsb2NhdGUgaXQpLiAgVGhlIGVuZCBwcm9kdWN0IG9mIHRoaXMgaXMgdGhhdCBtb3N0IG9mIHRoZQorICogcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSwgYW5kIG1vc3Qgb2YgUkFNIGNhbiBiZSB1c2VkLgorICoKKyAqIEZ1dHVyZSBkaXJlY3Rpb25zIGluY2x1ZGU6CisgKiAgLSBhbGxvY2F0aW5nIGEgcGFnZSB0YWJsZSB3aXRoIHRoZSBjb250cm9sIGNvZGUgYnVmZmVyIGlkZW50aXR5CisgKiAgICBtYXBwZWQsIHRvIHNpbXBsaWZ5IG1hY2hpbmVfa2V4ZWMgYW5kIG1ha2Uga2V4ZWNfb25fcGFuaWMgbW9yZQorICogICAgcmVsaWFibGUuCisgKi8KKworLyoKKyAqIEtJTUFHRV9OT19ERVNUIGlzIGFuIGltcG9zc2libGUgZGVzdGluYXRpb24gYWRkcmVzcy4uLiwgZm9yCisgKiBhbGxvY2F0aW5nIHBhZ2VzIHdob3NlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2UgZG8gbm90IGNhcmUgYWJvdXQuCisgKi8KKyNkZWZpbmUgS0lNQUdFX05PX0RFU1QgKC0xVUwpCisKK3N0YXRpYyBpbnQga2ltYWdlX2lzX2Rlc3RpbmF0aW9uX3JhbmdlKHN0cnVjdCBraW1hZ2UgKmltYWdlLAorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitzdGF0aWMgc3RydWN0IHBhZ2UgKmtpbWFnZV9hbGxvY19wYWdlKHN0cnVjdCBraW1hZ2UgKmltYWdlLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZ2ZwX21hc2ssCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZGVzdCk7CisKK3N0YXRpYyBpbnQgZG9fa2ltYWdlX2FsbG9jKHN0cnVjdCBraW1hZ2UgKipyaW1hZ2UsIHVuc2lnbmVkIGxvbmcgZW50cnksCisJICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBrZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMpCit7CisJc2l6ZV90IHNlZ21lbnRfYnl0ZXM7CisJc3RydWN0IGtpbWFnZSAqaW1hZ2U7CisJdW5zaWduZWQgbG9uZyBpOworCWludCByZXN1bHQ7CisKKwkvKiBBbGxvY2F0ZSBhIGNvbnRyb2xsaW5nIHN0cnVjdHVyZSAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJaW1hZ2UgPSBrbWFsbG9jKHNpemVvZigqaW1hZ2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWltYWdlKQorCQlnb3RvIG91dDsKKworCW1lbXNldChpbWFnZSwgMCwgc2l6ZW9mKCppbWFnZSkpOworCWltYWdlLT5oZWFkID0gMDsKKwlpbWFnZS0+ZW50cnkgPSAmaW1hZ2UtPmhlYWQ7CisJaW1hZ2UtPmxhc3RfZW50cnkgPSAmaW1hZ2UtPmhlYWQ7CisJaW1hZ2UtPmNvbnRyb2xfcGFnZSA9IH4wOyAvKiBCeSBkZWZhdWx0IHRoaXMgZG9lcyBub3QgYXBwbHkgKi8KKwlpbWFnZS0+c3RhcnQgPSBlbnRyeTsKKwlpbWFnZS0+dHlwZSA9IEtFWEVDX1RZUEVfREVGQVVMVDsKKworCS8qIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgY29udHJvbCBwYWdlcyAqLworCUlOSVRfTElTVF9IRUFEKCZpbWFnZS0+Y29udHJvbF9wYWdlcyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGRlc3RpbmF0aW9uIHBhZ2VzICovCisJSU5JVF9MSVNUX0hFQUQoJmltYWdlLT5kZXN0X3BhZ2VzKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgdW51c2VhYmxlIHBhZ2VzICovCisJSU5JVF9MSVNUX0hFQUQoJmltYWdlLT51bnVzZWFibGVfcGFnZXMpOworCisJLyogUmVhZCBpbiB0aGUgc2VnbWVudHMgKi8KKwlpbWFnZS0+bnJfc2VnbWVudHMgPSBucl9zZWdtZW50czsKKwlzZWdtZW50X2J5dGVzID0gbnJfc2VnbWVudHMgKiBzaXplb2YoKnNlZ21lbnRzKTsKKwlyZXN1bHQgPSBjb3B5X2Zyb21fdXNlcihpbWFnZS0+c2VnbWVudCwgc2VnbWVudHMsIHNlZ21lbnRfYnl0ZXMpOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBWZXJpZnkgd2UgaGF2ZSBnb29kIGRlc3RpbmF0aW9uIGFkZHJlc3Nlcy4gIFRoZSBjYWxsZXIgaXMKKwkgKiByZXNwb25zaWJsZSBmb3IgbWFraW5nIGNlcnRhaW4gd2UgZG9uJ3QgYXR0ZW1wdCB0byBsb2FkCisJICogdGhlIG5ldyBpbWFnZSBpbnRvIGludmFsaWQgb3IgcmVzZXJ2ZWQgYXJlYXMgb2YgUkFNLiAgVGhpcworCSAqIGp1c3QgdmVyaWZpZXMgaXQgaXMgYW4gYWRkcmVzcyB3ZSBjYW4gdXNlLgorCSAqCisJICogU2luY2UgdGhlIGtlcm5lbCBkb2VzIGV2ZXJ5dGhpbmcgaW4gcGFnZSBzaXplIGNodW5rcyBlbnN1cmUKKwkgKiB0aGUgZGVzdGluYXRpb24gYWRkcmVzZXMgYXJlIHBhZ2UgYWxpZ25lZC4gIFRvbyBtYW55CisJICogc3BlY2lhbCBjYXNlcyBjcm9wIG9mIHdoZW4gd2UgZG9uJ3QgZG8gdGhpcy4gIFRoZSBtb3N0CisJICogaW5zaWRpb3VzIGlzIGdldHRpbmcgb3ZlcmxhcHBpbmcgZGVzdGluYXRpb24gYWRkcmVzc2VzCisJICogc2ltcGx5IGJlY2F1c2UgYWRkcmVzc2VzIGFyZSBjaGFuZ2VkIHRvIHBhZ2Ugc2l6ZQorCSAqIGdyYW51bGFyaXR5LgorCSAqLworCXJlc3VsdCA9IC1FQUREUk5PVEFWQUlMOworCWZvciAoaSA9IDA7IGkgPCBucl9zZWdtZW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbXN0YXJ0LCBtZW5kOworCisJCW1zdGFydCA9IGltYWdlLT5zZWdtZW50W2ldLm1lbTsKKwkJbWVuZCAgID0gbXN0YXJ0ICsgaW1hZ2UtPnNlZ21lbnRbaV0ubWVtc3o7CisJCWlmICgobXN0YXJ0ICYgflBBR0VfTUFTSykgfHwgKG1lbmQgJiB+UEFHRV9NQVNLKSkKKwkJCWdvdG8gb3V0OworCQlpZiAobWVuZCA+PSBLRVhFQ19ERVNUSU5BVElPTl9NRU1PUllfTElNSVQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBWZXJpZnkgb3VyIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBkbyBub3Qgb3ZlcmxhcC4KKwkgKiBJZiB3ZSBhbGxvZWQgb3ZlcmxhcHBpbmcgZGVzdGluYXRpb24gYWRkcmVzc2VzCisJICogdGhyb3VnaCB2ZXJ5IHdlaXJkIHRoaW5ncyBjYW4gaGFwcGVuIHdpdGggbm8KKwkgKiBlYXN5IGV4cGxhbmF0aW9uIGFzIG9uZSBzZWdtZW50IHN0b3BzIG9uIGFub3RoZXIuCisJICovCisJcmVzdWx0ID0gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnbWVudHM7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIG1zdGFydCwgbWVuZDsKKwkJdW5zaWduZWQgbG9uZyBqOworCisJCW1zdGFydCA9IGltYWdlLT5zZWdtZW50W2ldLm1lbTsKKwkJbWVuZCAgID0gbXN0YXJ0ICsgaW1hZ2UtPnNlZ21lbnRbaV0ubWVtc3o7CisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgcHN0YXJ0LCBwZW5kOworCQkJcHN0YXJ0ID0gaW1hZ2UtPnNlZ21lbnRbal0ubWVtOworCQkJcGVuZCAgID0gcHN0YXJ0ICsgaW1hZ2UtPnNlZ21lbnRbal0ubWVtc3o7CisJCQkvKiBEbyB0aGUgc2VnbWVudHMgb3ZlcmxhcCA/ICovCisJCQlpZiAoKG1lbmQgPiBwc3RhcnQpICYmIChtc3RhcnQgPCBwZW5kKSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIEVuc3VyZSBvdXIgYnVmZmVyIHNpemVzIGFyZSBzdHJpY3RseSBsZXNzIHRoYW4KKwkgKiBvdXIgbWVtb3J5IHNpemVzLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBjYXNlLAorCSAqIGFuZCBpdCBpcyBlYXNpZXIgdG8gY2hlY2sgdXAgZnJvbnQgdGhhbiB0byBiZSBzdXJwcmlzZWQKKwkgKiBsYXRlciBvbi4KKwkgKi8KKwlyZXN1bHQgPSAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBucl9zZWdtZW50czsgaSsrKSB7CisJCWlmIChpbWFnZS0+c2VnbWVudFtpXS5idWZzeiA+IGltYWdlLT5zZWdtZW50W2ldLm1lbXN6KQorCQkJZ290byBvdXQ7CisJfQorCisJcmVzdWx0ID0gMDsKK291dDoKKwlpZiAocmVzdWx0ID09IDApCisJCSpyaW1hZ2UgPSBpbWFnZTsKKwllbHNlCisJCWtmcmVlKGltYWdlKTsKKworCXJldHVybiByZXN1bHQ7CisKK30KKworc3RhdGljIGludCBraW1hZ2Vfbm9ybWFsX2FsbG9jKHN0cnVjdCBraW1hZ2UgKipyaW1hZ2UsIHVuc2lnbmVkIGxvbmcgZW50cnksCisJCQkJdW5zaWduZWQgbG9uZyBucl9zZWdtZW50cywKKwkJCQlzdHJ1Y3Qga2V4ZWNfc2VnbWVudCBfX3VzZXIgKnNlZ21lbnRzKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGtpbWFnZSAqaW1hZ2U7CisKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGNvbnRyb2xsaW5nIHN0cnVjdHVyZSAqLworCWltYWdlID0gTlVMTDsKKwlyZXN1bHQgPSBkb19raW1hZ2VfYWxsb2MoJmltYWdlLCBlbnRyeSwgbnJfc2VnbWVudHMsIHNlZ21lbnRzKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIG91dDsKKworCSpyaW1hZ2UgPSBpbWFnZTsKKworCS8qCisJICogRmluZCBhIGxvY2F0aW9uIGZvciB0aGUgY29udHJvbCBjb2RlIGJ1ZmZlciwgYW5kIGFkZCBpdAorCSAqIHRoZSB2ZWN0b3Igb2Ygc2VnbWVudHMgc28gdGhhdCBpdCdzIHBhZ2VzIHdpbGwgYWxzbyBiZQorCSAqIGNvdW50ZWQgYXMgZGVzdGluYXRpb24gcGFnZXMuCisJICovCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UgPSBraW1hZ2VfYWxsb2NfY29udHJvbF9wYWdlcyhpbWFnZSwKKwkJCQkJICAgZ2V0X29yZGVyKEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFKSk7CisJaWYgKCFpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgYWxsb2NhdGUgY29udHJvbF9jb2RlX2J1ZmZlclxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJlc3VsdCA9IDA7Cisgb3V0OgorCWlmIChyZXN1bHQgPT0gMCkKKwkJKnJpbWFnZSA9IGltYWdlOworCWVsc2UKKwkJa2ZyZWUoaW1hZ2UpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBraW1hZ2VfY3Jhc2hfYWxsb2Moc3RydWN0IGtpbWFnZSAqKnJpbWFnZSwgdW5zaWduZWQgbG9uZyBlbnRyeSwKKwkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAorCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qga2ltYWdlICppbWFnZTsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlpbWFnZSA9IE5VTEw7CisJLyogVmVyaWZ5IHdlIGhhdmUgYSB2YWxpZCBlbnRyeSBwb2ludCAqLworCWlmICgoZW50cnkgPCBjcmFzaGtfcmVzLnN0YXJ0KSB8fCAoZW50cnkgPiBjcmFzaGtfcmVzLmVuZCkpIHsKKwkJcmVzdWx0ID0gLUVBRERSTk9UQVZBSUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY29udHJvbGxpbmcgc3RydWN0dXJlICovCisJcmVzdWx0ID0gZG9fa2ltYWdlX2FsbG9jKCZpbWFnZSwgZW50cnksIG5yX3NlZ21lbnRzLCBzZWdtZW50cyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXQ7CisKKwkvKiBFbmFibGUgdGhlIHNwZWNpYWwgY3Jhc2gga2VybmVsIGNvbnRyb2wgcGFnZQorCSAqIGFsbG9jYXRpb24gcG9saWN5LgorCSAqLworCWltYWdlLT5jb250cm9sX3BhZ2UgPSBjcmFzaGtfcmVzLnN0YXJ0OworCWltYWdlLT50eXBlID0gS0VYRUNfVFlQRV9DUkFTSDsKKworCS8qCisJICogVmVyaWZ5IHdlIGhhdmUgZ29vZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuICBOb3JtYWxseQorCSAqIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyBjZXJ0YWluIHdlIGRvbid0CisJICogYXR0ZW1wdCB0byBsb2FkIHRoZSBuZXcgaW1hZ2UgaW50byBpbnZhbGlkIG9yIHJlc2VydmVkCisJICogYXJlYXMgb2YgUkFNLiAgQnV0IGNyYXNoIGtlcm5lbHMgYXJlIHByZWxvYWRlZCBpbnRvIGEKKwkgKiByZXNlcnZlZCBhcmVhIG9mIHJhbS4gIFdlIG11c3QgZW5zdXJlIHRoZSBhZGRyZXNzZXMKKwkgKiBhcmUgaW4gdGhlIHJlc2VydmVkIGFyZWEgb3RoZXJ3aXNlIHByZWxvYWRpbmcgdGhlCisJICoga2VybmVsIGNvdWxkIGNvcnJ1cHQgdGhpbmdzLgorCSAqLworCXJlc3VsdCA9IC1FQUREUk5PVEFWQUlMOworCWZvciAoaSA9IDA7IGkgPCBucl9zZWdtZW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbXN0YXJ0LCBtZW5kOworCisJCW1zdGFydCA9IGltYWdlLT5zZWdtZW50W2ldLm1lbTsKKwkJbWVuZCA9IG1zdGFydCArIGltYWdlLT5zZWdtZW50W2ldLm1lbXN6IC0gMTsKKwkJLyogRW5zdXJlIHdlIGFyZSB3aXRoaW4gdGhlIGNyYXNoIGtlcm5lbCBsaW1pdHMgKi8KKwkJaWYgKChtc3RhcnQgPCBjcmFzaGtfcmVzLnN0YXJ0KSB8fCAobWVuZCA+IGNyYXNoa19yZXMuZW5kKSkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRmluZCBhIGxvY2F0aW9uIGZvciB0aGUgY29udHJvbCBjb2RlIGJ1ZmZlciwgYW5kIGFkZAorCSAqIHRoZSB2ZWN0b3Igb2Ygc2VnbWVudHMgc28gdGhhdCBpdCdzIHBhZ2VzIHdpbGwgYWxzbyBiZQorCSAqIGNvdW50ZWQgYXMgZGVzdGluYXRpb24gcGFnZXMuCisJICovCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UgPSBraW1hZ2VfYWxsb2NfY29udHJvbF9wYWdlcyhpbWFnZSwKKwkJCQkJICAgZ2V0X29yZGVyKEtFWEVDX0NPTlRST0xfQ09ERV9TSVpFKSk7CisJaWYgKCFpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgYWxsb2NhdGUgY29udHJvbF9jb2RlX2J1ZmZlclxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJlc3VsdCA9IDA7CitvdXQ6CisJaWYgKHJlc3VsdCA9PSAwKQorCQkqcmltYWdlID0gaW1hZ2U7CisJZWxzZQorCQlrZnJlZShpbWFnZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGtpbWFnZV9pc19kZXN0aW5hdGlvbl9yYW5nZShzdHJ1Y3Qga2ltYWdlICppbWFnZSwKKwkJCQkJdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gMDsgaSA8IGltYWdlLT5ucl9zZWdtZW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbXN0YXJ0LCBtZW5kOworCisJCW1zdGFydCA9IGltYWdlLT5zZWdtZW50W2ldLm1lbTsKKwkJbWVuZCA9IG1zdGFydCArIGltYWdlLT5zZWdtZW50W2ldLm1lbXN6OworCQlpZiAoKGVuZCA+IG1zdGFydCkgJiYgKHN0YXJ0IDwgbWVuZCkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICpraW1hZ2VfYWxsb2NfcGFnZXModW5zaWduZWQgaW50IGdmcF9tYXNrLAorCQkJCQl1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2VzOworCisJcGFnZXMgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgb3JkZXIpOworCWlmIChwYWdlcykgeworCQl1bnNpZ25lZCBpbnQgY291bnQsIGk7CisJCXBhZ2VzLT5tYXBwaW5nID0gTlVMTDsKKwkJcGFnZXMtPnByaXZhdGUgPSBvcmRlcjsKKwkJY291bnQgPSAxIDw8IG9yZGVyOworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlcyArIGkpOworCX0KKworCXJldHVybiBwYWdlczsKK30KKworc3RhdGljIHZvaWQga2ltYWdlX2ZyZWVfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJdW5zaWduZWQgaW50IG9yZGVyLCBjb3VudCwgaTsKKworCW9yZGVyID0gcGFnZS0+cHJpdmF0ZTsKKwljb3VudCA9IDEgPDwgb3JkZXI7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UgKyBpKTsKKwlfX2ZyZWVfcGFnZXMocGFnZSwgb3JkZXIpOworfQorCitzdGF0aWMgdm9pZCBraW1hZ2VfZnJlZV9wYWdlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgbmV4dCwgbGlzdCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlwYWdlID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYWdlLCBscnUpOworCQlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKKwkJa2ltYWdlX2ZyZWVfcGFnZXMocGFnZSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmtpbWFnZV9hbGxvY19ub3JtYWxfY29udHJvbF9wYWdlcyhzdHJ1Y3Qga2ltYWdlICppbWFnZSwKKwkJCQkJCQl1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJLyogQ29udHJvbCBwYWdlcyBhcmUgc3BlY2lhbCwgdGhleSBhcmUgdGhlIGludGVybWVkaWFyaWVzCisJICogdGhhdCBhcmUgbmVlZGVkIHdoaWxlIHdlIGNvcHkgdGhlIHJlc3Qgb2YgdGhlIHBhZ2VzCisJICogdG8gdGhlaXIgZmluYWwgcmVzdGluZyBwbGFjZS4gIEFzIHN1Y2ggdGhleSBtdXN0CisJICogbm90IGNvbmZsaWN0IHdpdGggZWl0aGVyIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMKKwkgKiBvciBtZW1vcnkgdGhlIGtlcm5lbCBpcyBhbHJlYWR5IHVzaW5nLgorCSAqCisJICogVGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSByZWFsbHkgbmVlZCBtb3JlIHRoYW4gb25lIG9mCisJICogdGhlc2UgYXJlIGZvciBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNhbm5vdCBkaXNhYmxlCisJICogdGhlIE1NVSBhbmQgbXVzdCBpbnN0ZWFkIGdlbmVyYXRlIGFuIGlkZW50aXR5IG1hcHBlZAorCSAqIHBhZ2UgdGFibGUgZm9yIGFsbCBvZiB0aGUgbWVtb3J5LgorCSAqCisJICogQXQgd29yc3QgdGhpcyBydW5zIGluIE8oTikgb2YgdGhlIGltYWdlIHNpemUuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBleHRyYV9wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXM7CisJdW5zaWduZWQgaW50IGNvdW50OworCisJY291bnQgPSAxIDw8IG9yZGVyOworCUlOSVRfTElTVF9IRUFEKCZleHRyYV9wYWdlcyk7CisKKwkvKiBMb29wIHdoaWxlIEkgY2FuIGFsbG9jYXRlIGEgcGFnZSBhbmQgdGhlIHBhZ2UgYWxsb2NhdGVkCisJICogaXMgYSBkZXN0aW5hdGlvbiBwYWdlLgorCSAqLworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4sIGVwZm4sIGFkZHIsIGVhZGRyOworCisJCXBhZ2VzID0ga2ltYWdlX2FsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwkJaWYgKCFwYWdlcykKKwkJCWJyZWFrOworCQlwZm4gICA9IHBhZ2VfdG9fcGZuKHBhZ2VzKTsKKwkJZXBmbiAgPSBwZm4gKyBjb3VudDsKKwkJYWRkciAgPSBwZm4gPDwgUEFHRV9TSElGVDsKKwkJZWFkZHIgPSBlcGZuIDw8IFBBR0VfU0hJRlQ7CisJCWlmICgoZXBmbiA+PSAoS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQgPj4gUEFHRV9TSElGVCkpIHx8CisJCQkgICAgICBraW1hZ2VfaXNfZGVzdGluYXRpb25fcmFuZ2UoaW1hZ2UsIGFkZHIsIGVhZGRyKSkgeworCQkJbGlzdF9hZGQoJnBhZ2VzLT5scnUsICZleHRyYV9wYWdlcyk7CisJCQlwYWdlcyA9IE5VTEw7CisJCX0KKwl9IHdoaWxlICghcGFnZXMpOworCisJaWYgKHBhZ2VzKSB7CisJCS8qIFJlbWVtYmVyIHRoZSBhbGxvY2F0ZWQgcGFnZS4uLiAqLworCQlsaXN0X2FkZCgmcGFnZXMtPmxydSwgJmltYWdlLT5jb250cm9sX3BhZ2VzKTsKKworCQkvKiBCZWNhdXNlIHRoZSBwYWdlIGlzIGFscmVhZHkgaW4gaXQncyBkZXN0aW5hdGlvbgorCQkgKiBsb2NhdGlvbiB3ZSB3aWxsIG5ldmVyIGFsbG9jYXRlIGFub3RoZXIgcGFnZSBhdAorCQkgKiB0aGF0IGFkZHJlc3MuICBUaGVyZWZvcmUga2ltYWdlX2FsbG9jX3BhZ2VzCisJCSAqIHdpbGwgbm90IHJldHVybiBpdCAoYWdhaW4pIGFuZCB3ZSBkb24ndCBuZWVkCisJCSAqIHRvIGdpdmUgaXQgYW4gZW50cnkgaW4gaW1hZ2UtPnNlZ21lbnRbXS4KKwkJICovCisJfQorCS8qIERlYWwgd2l0aCB0aGUgZGVzdGluYXRpb24gcGFnZXMgSSBoYXZlIGluYWR2ZXJ0ZW50bHkgYWxsb2NhdGVkLgorCSAqCisJICogSWRlYWxseSBJIHdvdWxkIGNvbnZlcnQgbXVsdGktcGFnZSBhbGxvY2F0aW9ucyBpbnRvIHNpbmdsZQorCSAqIHBhZ2UgYWxsb2NhdGlvbnMsIGFuZCBhZGQgZXZlcnl0aW5nIHRvIGltYWdlLT5kZXN0X3BhZ2VzLgorCSAqCisJICogRm9yIG5vdyBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZnJlZSB0aGUgcGFnZXMuCisJICovCisJa2ltYWdlX2ZyZWVfcGFnZV9saXN0KCZleHRyYV9wYWdlcyk7CisKKwlyZXR1cm4gcGFnZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqa2ltYWdlX2FsbG9jX2NyYXNoX2NvbnRyb2xfcGFnZXMoc3RydWN0IGtpbWFnZSAqaW1hZ2UsCisJCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgb3JkZXIpCit7CisJLyogQ29udHJvbCBwYWdlcyBhcmUgc3BlY2lhbCwgdGhleSBhcmUgdGhlIGludGVybWVkaWFyaWVzCisJICogdGhhdCBhcmUgbmVlZGVkIHdoaWxlIHdlIGNvcHkgdGhlIHJlc3Qgb2YgdGhlIHBhZ2VzCisJICogdG8gdGhlaXIgZmluYWwgcmVzdGluZyBwbGFjZS4gIEFzIHN1Y2ggdGhleSBtdXN0CisJICogbm90IGNvbmZsaWN0IHdpdGggZWl0aGVyIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMKKwkgKiBvciBtZW1vcnkgdGhlIGtlcm5lbCBpcyBhbHJlYWR5IHVzaW5nLgorCSAqCisJICogQ29udHJvbCBwYWdlcyBhcmUgYWxzbyB0aGUgb25seSBwYWdzIHdlIG11c3QgYWxsb2NhdGUKKwkgKiB3aGVuIGxvYWRpbmcgYSBjcmFzaCBrZXJuZWwuICBBbGwgb2YgdGhlIG90aGVyIHBhZ2VzCisJICogYXJlIHNwZWNpZmllZCBieSB0aGUgc2VnbWVudHMgYW5kIHdlIGp1c3QgbWVtY3B5CisJICogaW50byB0aGVtIGRpcmVjdGx5LgorCSAqCisJICogVGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSByZWFsbHkgbmVlZCBtb3JlIHRoYW4gb25lIG9mCisJICogdGhlc2UgYXJlIGZvciBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNhbm5vdCBkaXNhYmxlCisJICogdGhlIE1NVSBhbmQgbXVzdCBpbnN0ZWFkIGdlbmVyYXRlIGFuIGlkZW50aXR5IG1hcHBlZAorCSAqIHBhZ2UgdGFibGUgZm9yIGFsbCBvZiB0aGUgbWVtb3J5LgorCSAqCisJICogR2l2ZW4gdGhlIGxvdyBkZW1hbmQgdGhpcyBpbXBsZW1lbnRzIGEgdmVyeSBzaW1wbGUKKwkgKiBhbGxvY2F0b3IgdGhhdCBmaW5kcyB0aGUgZmlyc3QgaG9sZSBvZiB0aGUgYXBwcm9wcmlhdGUKKwkgKiBzaXplIGluIHRoZSByZXNlcnZlZCBtZW1vcnkgcmVnaW9uLCBhbmQgYWxsb2NhdGVzIGFsbAorCSAqIG9mIHRoZSBtZW1vcnkgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgaG9sZS4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIGhvbGVfc3RhcnQsIGhvbGVfZW5kLCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlczsKKworCXBhZ2VzID0gTlVMTDsKKwlzaXplID0gKDEgPDwgb3JkZXIpIDw8IFBBR0VfU0hJRlQ7CisJaG9sZV9zdGFydCA9IChpbWFnZS0+Y29udHJvbF9wYWdlICsgKHNpemUgLSAxKSkgJiB+KHNpemUgLSAxKTsKKwlob2xlX2VuZCAgID0gaG9sZV9zdGFydCArIHNpemUgLSAxOworCXdoaWxlIChob2xlX2VuZCA8PSBjcmFzaGtfcmVzLmVuZCkgeworCQl1bnNpZ25lZCBsb25nIGk7CisKKwkJaWYgKGhvbGVfZW5kID4gS0VYRUNfQ09OVFJPTF9NRU1PUllfTElNSVQpCisJCQlicmVhazsKKwkJaWYgKGhvbGVfZW5kID4gY3Jhc2hrX3Jlcy5lbmQpCisJCQlicmVhazsKKwkJLyogU2VlIGlmIEkgb3ZlcmxhcCBhbnkgb2YgdGhlIHNlZ21lbnRzICovCisJCWZvciAoaSA9IDA7IGkgPCBpbWFnZS0+bnJfc2VnbWVudHM7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBtc3RhcnQsIG1lbmQ7CisKKwkJCW1zdGFydCA9IGltYWdlLT5zZWdtZW50W2ldLm1lbTsKKwkJCW1lbmQgICA9IG1zdGFydCArIGltYWdlLT5zZWdtZW50W2ldLm1lbXN6IC0gMTsKKwkJCWlmICgoaG9sZV9lbmQgPj0gbXN0YXJ0KSAmJiAoaG9sZV9zdGFydCA8PSBtZW5kKSkgeworCQkJCS8qIEFkdmFuY2UgdGhlIGhvbGUgdG8gdGhlIGVuZCBvZiB0aGUgc2VnbWVudCAqLworCQkJCWhvbGVfc3RhcnQgPSAobWVuZCArIChzaXplIC0gMSkpICYgfihzaXplIC0gMSk7CisJCQkJaG9sZV9lbmQgICA9IGhvbGVfc3RhcnQgKyBzaXplIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBJZiBJIGRvbid0IG92ZXJsYXAgYW55IHNlZ21lbnRzIEkgaGF2ZSBmb3VuZCBteSBob2xlISAqLworCQlpZiAoaSA9PSBpbWFnZS0+bnJfc2VnbWVudHMpIHsKKwkJCXBhZ2VzID0gcGZuX3RvX3BhZ2UoaG9sZV9zdGFydCA+PiBQQUdFX1NISUZUKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChwYWdlcykKKwkJaW1hZ2UtPmNvbnRyb2xfcGFnZSA9IGhvbGVfZW5kOworCisJcmV0dXJuIHBhZ2VzOworfQorCisKK3N0cnVjdCBwYWdlICpraW1hZ2VfYWxsb2NfY29udHJvbF9wYWdlcyhzdHJ1Y3Qga2ltYWdlICppbWFnZSwKKwkJCQkJIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZXMgPSBOVUxMOworCisJc3dpdGNoIChpbWFnZS0+dHlwZSkgeworCWNhc2UgS0VYRUNfVFlQRV9ERUZBVUxUOgorCQlwYWdlcyA9IGtpbWFnZV9hbGxvY19ub3JtYWxfY29udHJvbF9wYWdlcyhpbWFnZSwgb3JkZXIpOworCQlicmVhazsKKwljYXNlIEtFWEVDX1RZUEVfQ1JBU0g6CisJCXBhZ2VzID0ga2ltYWdlX2FsbG9jX2NyYXNoX2NvbnRyb2xfcGFnZXMoaW1hZ2UsIG9yZGVyKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBhZ2VzOworfQorCitzdGF0aWMgaW50IGtpbWFnZV9hZGRfZW50cnkoc3RydWN0IGtpbWFnZSAqaW1hZ2UsIGtpbWFnZV9lbnRyeV90IGVudHJ5KQoreworCWlmICgqaW1hZ2UtPmVudHJ5ICE9IDApCisJCWltYWdlLT5lbnRyeSsrOworCisJaWYgKGltYWdlLT5lbnRyeSA9PSBpbWFnZS0+bGFzdF9lbnRyeSkgeworCQlraW1hZ2VfZW50cnlfdCAqaW5kX3BhZ2U7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCXBhZ2UgPSBraW1hZ2VfYWxsb2NfcGFnZShpbWFnZSwgR0ZQX0tFUk5FTCwgS0lNQUdFX05PX0RFU1QpOworCQlpZiAoIXBhZ2UpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpbmRfcGFnZSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJKmltYWdlLT5lbnRyeSA9IHZpcnRfdG9fcGh5cyhpbmRfcGFnZSkgfCBJTkRfSU5ESVJFQ1RJT047CisJCWltYWdlLT5lbnRyeSA9IGluZF9wYWdlOworCQlpbWFnZS0+bGFzdF9lbnRyeSA9IGluZF9wYWdlICsKKwkJCQkgICAgICAoKFBBR0VfU0laRS9zaXplb2Yoa2ltYWdlX2VudHJ5X3QpKSAtIDEpOworCX0KKwkqaW1hZ2UtPmVudHJ5ID0gZW50cnk7CisJaW1hZ2UtPmVudHJ5Kys7CisJKmltYWdlLT5lbnRyeSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBraW1hZ2Vfc2V0X2Rlc3RpbmF0aW9uKHN0cnVjdCBraW1hZ2UgKmltYWdlLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgZGVzdGluYXRpb24pCit7CisJaW50IHJlc3VsdDsKKworCWRlc3RpbmF0aW9uICY9IFBBR0VfTUFTSzsKKwlyZXN1bHQgPSBraW1hZ2VfYWRkX2VudHJ5KGltYWdlLCBkZXN0aW5hdGlvbiB8IElORF9ERVNUSU5BVElPTik7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlpbWFnZS0+ZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIGludCBraW1hZ2VfYWRkX3BhZ2Uoc3RydWN0IGtpbWFnZSAqaW1hZ2UsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3sKKwlpbnQgcmVzdWx0OworCisJcGFnZSAmPSBQQUdFX01BU0s7CisJcmVzdWx0ID0ga2ltYWdlX2FkZF9lbnRyeShpbWFnZSwgcGFnZSB8IElORF9TT1VSQ0UpOworCWlmIChyZXN1bHQgPT0gMCkKKwkJaW1hZ2UtPmRlc3RpbmF0aW9uICs9IFBBR0VfU0laRTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQga2ltYWdlX2ZyZWVfZXh0cmFfcGFnZXMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCit7CisJLyogV2FsayB0aHJvdWdoIGFuZCBmcmVlIGFueSBleHRyYSBkZXN0aW5hdGlvbiBwYWdlcyBJIG1heSBoYXZlICovCisJa2ltYWdlX2ZyZWVfcGFnZV9saXN0KCZpbWFnZS0+ZGVzdF9wYWdlcyk7CisKKwkvKiBXYWxrIHRocm91Z2ggYW5kIGZyZWUgYW55IHVudXNlYWJsZSBwYWdlcyBJIGhhdmUgY2FjaGVkICovCisJa2ltYWdlX2ZyZWVfcGFnZV9saXN0KCZpbWFnZS0+dW51c2VhYmxlX3BhZ2VzKTsKKworfQorc3RhdGljIGludCBraW1hZ2VfdGVybWluYXRlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQoreworCWlmICgqaW1hZ2UtPmVudHJ5ICE9IDApCisJCWltYWdlLT5lbnRyeSsrOworCisJKmltYWdlLT5lbnRyeSA9IElORF9ET05FOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfa2ltYWdlX2VudHJ5KGltYWdlLCBwdHIsIGVudHJ5KSBcCisJZm9yIChwdHIgPSAmaW1hZ2UtPmhlYWQ7IChlbnRyeSA9ICpwdHIpICYmICEoZW50cnkgJiBJTkRfRE9ORSk7IFwKKwkJcHRyID0gKGVudHJ5ICYgSU5EX0lORElSRUNUSU9OKT8gXAorCQkJcGh5c190b192aXJ0KChlbnRyeSAmIFBBR0VfTUFTSykpOiBwdHIgKzEpCisKK3N0YXRpYyB2b2lkIGtpbWFnZV9mcmVlX2VudHJ5KGtpbWFnZV9lbnRyeV90IGVudHJ5KQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHBmbl90b19wYWdlKGVudHJ5ID4+IFBBR0VfU0hJRlQpOworCWtpbWFnZV9mcmVlX3BhZ2VzKHBhZ2UpOworfQorCitzdGF0aWMgdm9pZCBraW1hZ2VfZnJlZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKK3sKKwlraW1hZ2VfZW50cnlfdCAqcHRyLCBlbnRyeTsKKwlraW1hZ2VfZW50cnlfdCBpbmQgPSAwOworCisJaWYgKCFpbWFnZSkKKwkJcmV0dXJuOworCisJa2ltYWdlX2ZyZWVfZXh0cmFfcGFnZXMoaW1hZ2UpOworCWZvcl9lYWNoX2tpbWFnZV9lbnRyeShpbWFnZSwgcHRyLCBlbnRyeSkgeworCQlpZiAoZW50cnkgJiBJTkRfSU5ESVJFQ1RJT04pIHsKKwkJCS8qIEZyZWUgdGhlIHByZXZpb3VzIGluZGlyZWN0aW9uIHBhZ2UgKi8KKwkJCWlmIChpbmQgJiBJTkRfSU5ESVJFQ1RJT04pCisJCQkJa2ltYWdlX2ZyZWVfZW50cnkoaW5kKTsKKwkJCS8qIFNhdmUgdGhpcyBpbmRpcmVjdGlvbiBwYWdlIHVudGlsIHdlIGFyZQorCQkJICogZG9uZSB3aXRoIGl0LgorCQkJICovCisJCQlpbmQgPSBlbnRyeTsKKwkJfQorCQllbHNlIGlmIChlbnRyeSAmIElORF9TT1VSQ0UpCisJCQlraW1hZ2VfZnJlZV9lbnRyeShlbnRyeSk7CisJfQorCS8qIEZyZWUgdGhlIGZpbmFsIGluZGlyZWN0aW9uIHBhZ2UgKi8KKwlpZiAoaW5kICYgSU5EX0lORElSRUNUSU9OKQorCQlraW1hZ2VfZnJlZV9lbnRyeShpbmQpOworCisJLyogSGFuZGxlIGFueSBtYWNoaW5lIHNwZWNpZmljIGNsZWFudXAgKi8KKwltYWNoaW5lX2tleGVjX2NsZWFudXAoaW1hZ2UpOworCisJLyogRnJlZSB0aGUga2V4ZWMgY29udHJvbCBwYWdlcy4uLiAqLworCWtpbWFnZV9mcmVlX3BhZ2VfbGlzdCgmaW1hZ2UtPmNvbnRyb2xfcGFnZXMpOworCWtmcmVlKGltYWdlKTsKK30KKworc3RhdGljIGtpbWFnZV9lbnRyeV90ICpraW1hZ2VfZHN0X3VzZWQoc3RydWN0IGtpbWFnZSAqaW1hZ2UsCisJCQkJCXVuc2lnbmVkIGxvbmcgcGFnZSkKK3sKKwlraW1hZ2VfZW50cnlfdCAqcHRyLCBlbnRyeTsKKwl1bnNpZ25lZCBsb25nIGRlc3RpbmF0aW9uID0gMDsKKworCWZvcl9lYWNoX2tpbWFnZV9lbnRyeShpbWFnZSwgcHRyLCBlbnRyeSkgeworCQlpZiAoZW50cnkgJiBJTkRfREVTVElOQVRJT04pCisJCQlkZXN0aW5hdGlvbiA9IGVudHJ5ICYgUEFHRV9NQVNLOworCQllbHNlIGlmIChlbnRyeSAmIElORF9TT1VSQ0UpIHsKKwkJCWlmIChwYWdlID09IGRlc3RpbmF0aW9uKQorCQkJCXJldHVybiBwdHI7CisJCQlkZXN0aW5hdGlvbiArPSBQQUdFX1NJWkU7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICpraW1hZ2VfYWxsb2NfcGFnZShzdHJ1Y3Qga2ltYWdlICppbWFnZSwKKwkJCQkJdW5zaWduZWQgaW50IGdmcF9tYXNrLAorCQkJCQl1bnNpZ25lZCBsb25nIGRlc3RpbmF0aW9uKQoreworCS8qCisJICogSGVyZSB3ZSBpbXBsZW1lbnQgc2FmZWd1YXJkcyB0byBlbnN1cmUgdGhhdCBhIHNvdXJjZSBwYWdlCisJICogaXMgbm90IGNvcGllZCB0byBpdHMgZGVzdGluYXRpb24gcGFnZSBiZWZvcmUgdGhlIGRhdGEgb24KKwkgKiB0aGUgZGVzdGluYXRpb24gcGFnZSBpcyBubyBsb25nZXIgdXNlZnVsLgorCSAqCisJICogVG8gZG8gdGhpcyB3ZSBtYWludGFpbiB0aGUgaW52YXJpYW50IHRoYXQgYSBzb3VyY2UgcGFnZSBpcworCSAqIGVpdGhlciBpdHMgb3duIGRlc3RpbmF0aW9uIHBhZ2UsIG9yIGl0IGlzIG5vdCBhCisJICogZGVzdGluYXRpb24gcGFnZSBhdCBhbGwuCisJICoKKwkgKiBUaGF0IGlzIHNsaWdodGx5IHN0cm9uZ2VyIHRoYW4gcmVxdWlyZWQsIGJ1dCB0aGUgcHJvb2YKKwkgKiB0aGF0IG5vIHByb2JsZW1zIHdpbGwgbm90IG9jY3VyIGlzIHRyaXZpYWwsIGFuZCB0aGUKKwkgKiBpbXBsZW1lbnRhdGlvbiBpcyBzaW1wbHkgdG8gdmVyaWZ5LgorCSAqCisJICogV2hlbiBhbGxvY2F0aW5nIGFsbCBwYWdlcyBub3JtYWxseSB0aGlzIGFsZ29yaXRobSB3aWxsIHJ1bgorCSAqIGluIE8oTikgdGltZSwgYnV0IGluIHRoZSB3b3JzdCBjYXNlIGl0IHdpbGwgcnVuIGluIE8oTl4yKQorCSAqIHRpbWUuICAgSWYgdGhlIHJ1bnRpbWUgaXMgYSBwcm9ibGVtIHRoZSBkYXRhIHN0cnVjdHVyZXMgY2FuCisJICogYmUgZml4ZWQuCisJICovCisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJLyoKKwkgKiBXYWxrIHRocm91Z2ggdGhlIGxpc3Qgb2YgZGVzdGluYXRpb24gcGFnZXMsIGFuZCBzZWUgaWYgSQorCSAqIGhhdmUgYSBtYXRjaC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZpbWFnZS0+ZGVzdF9wYWdlcywgbHJ1KSB7CisJCWFkZHIgPSBwYWdlX3RvX3BmbihwYWdlKSA8PCBQQUdFX1NISUZUOworCQlpZiAoYWRkciA9PSBkZXN0aW5hdGlvbikgeworCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQlyZXR1cm4gcGFnZTsKKwkJfQorCX0KKwlwYWdlID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQlraW1hZ2VfZW50cnlfdCAqb2xkOworCisJCS8qIEFsbG9jYXRlIGEgcGFnZSwgaWYgd2UgcnVuIG91dCBvZiBtZW1vcnkgZ2l2ZSB1cCAqLworCQlwYWdlID0ga2ltYWdlX2FsbG9jX3BhZ2VzKGdmcF9tYXNrLCAwKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuIE5VTEw7CisJCS8qIElmIHRoZSBwYWdlIGNhbm5vdCBiZSB1c2VkIGZpbGUgaXQgYXdheSAqLworCQlpZiAocGFnZV90b19wZm4ocGFnZSkgPgorCQkJCShLRVhFQ19TT1VSQ0VfTUVNT1JZX0xJTUlUID4+IFBBR0VfU0hJRlQpKSB7CisJCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmaW1hZ2UtPnVudXNlYWJsZV9wYWdlcyk7CisJCQljb250aW51ZTsKKwkJfQorCQlhZGRyID0gcGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVDsKKworCQkvKiBJZiBpdCBpcyB0aGUgZGVzdGluYXRpb24gcGFnZSB3ZSB3YW50IHVzZSBpdCAqLworCQlpZiAoYWRkciA9PSBkZXN0aW5hdGlvbikKKwkJCWJyZWFrOworCisJCS8qIElmIHRoZSBwYWdlIGlzIG5vdCBhIGRlc3RpbmF0aW9uIHBhZ2UgdXNlIGl0ICovCisJCWlmICgha2ltYWdlX2lzX2Rlc3RpbmF0aW9uX3JhbmdlKGltYWdlLCBhZGRyLAorCQkJCQkJICBhZGRyICsgUEFHRV9TSVpFKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIEkga25vdyB0aGF0IHRoZSBwYWdlIGlzIHNvbWVvbmVzIGRlc3RpbmF0aW9uIHBhZ2UuCisJCSAqIFNlZSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgc291cmNlIHBhZ2UgZm9yIHRoaXMKKwkJICogZGVzdGluYXRpb24gcGFnZS4gIEFuZCBpZiBzbyBzd2FwIHRoZSBzb3VyY2UgcGFnZXMuCisJCSAqLworCQlvbGQgPSBraW1hZ2VfZHN0X3VzZWQoaW1hZ2UsIGFkZHIpOworCQlpZiAob2xkKSB7CisJCQkvKiBJZiBzbyBtb3ZlIGl0ICovCisJCQl1bnNpZ25lZCBsb25nIG9sZF9hZGRyOworCQkJc3RydWN0IHBhZ2UgKm9sZF9wYWdlOworCisJCQlvbGRfYWRkciA9ICpvbGQgJiBQQUdFX01BU0s7CisJCQlvbGRfcGFnZSA9IHBmbl90b19wYWdlKG9sZF9hZGRyID4+IFBBR0VfU0hJRlQpOworCQkJY29weV9oaWdocGFnZShwYWdlLCBvbGRfcGFnZSk7CisJCQkqb2xkID0gYWRkciB8ICgqb2xkICYgflBBR0VfTUFTSyk7CisKKwkJCS8qIFRoZSBvbGQgcGFnZSBJIGhhdmUgZm91bmQgY2Fubm90IGJlIGEKKwkJCSAqIGRlc3RpbmF0aW9uIHBhZ2UsIHNvIHJldHVybiBpdC4KKwkJCSAqLworCQkJYWRkciA9IG9sZF9hZGRyOworCQkJcGFnZSA9IG9sZF9wYWdlOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBQbGFjZSB0aGUgcGFnZSBvbiB0aGUgZGVzdGluYXRpb24gbGlzdCBJCisJCQkgKiB3aWxsIHVzZSBpdCBsYXRlci4KKwkJCSAqLworCQkJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJmltYWdlLT5kZXN0X3BhZ2VzKTsKKwkJfQorCX0KKworCXJldHVybiBwYWdlOworfQorCitzdGF0aWMgaW50IGtpbWFnZV9sb2FkX25vcm1hbF9zZWdtZW50KHN0cnVjdCBraW1hZ2UgKmltYWdlLAorCQkJCQkgc3RydWN0IGtleGVjX3NlZ21lbnQgKnNlZ21lbnQpCit7CisJdW5zaWduZWQgbG9uZyBtYWRkcjsKKwl1bnNpZ25lZCBsb25nIHVieXRlcywgbWJ5dGVzOworCWludCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmJ1ZjsKKworCXJlc3VsdCA9IDA7CisJYnVmID0gc2VnbWVudC0+YnVmOworCXVieXRlcyA9IHNlZ21lbnQtPmJ1ZnN6OworCW1ieXRlcyA9IHNlZ21lbnQtPm1lbXN6OworCW1hZGRyID0gc2VnbWVudC0+bWVtOworCisJcmVzdWx0ID0ga2ltYWdlX3NldF9kZXN0aW5hdGlvbihpbWFnZSwgbWFkZHIpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKworCXdoaWxlIChtYnl0ZXMpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWNoYXIgKnB0cjsKKwkJc2l6ZV90IHVjaHVuaywgbWNodW5rOworCisJCXBhZ2UgPSBraW1hZ2VfYWxsb2NfcGFnZShpbWFnZSwgR0ZQX0hJR0hVU0VSLCBtYWRkcik7CisJCWlmIChwYWdlID09IDApIHsKKwkJCXJlc3VsdCAgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVzdWx0ID0ga2ltYWdlX2FkZF9wYWdlKGltYWdlLCBwYWdlX3RvX3BmbihwYWdlKQorCQkJCQkJCQk8PCBQQUdFX1NISUZUKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIG91dDsKKworCQlwdHIgPSBrbWFwKHBhZ2UpOworCQkvKiBTdGFydCB3aXRoIGEgY2xlYXIgcGFnZSAqLworCQltZW1zZXQocHRyLCAwLCBQQUdFX1NJWkUpOworCQlwdHIgKz0gbWFkZHIgJiB+UEFHRV9NQVNLOworCQltY2h1bmsgPSBQQUdFX1NJWkUgLSAobWFkZHIgJiB+UEFHRV9NQVNLKTsKKwkJaWYgKG1jaHVuayA+IG1ieXRlcykKKwkJCW1jaHVuayA9IG1ieXRlczsKKworCQl1Y2h1bmsgPSBtY2h1bms7CisJCWlmICh1Y2h1bmsgPiB1Ynl0ZXMpCisJCQl1Y2h1bmsgPSB1Ynl0ZXM7CisKKwkJcmVzdWx0ID0gY29weV9mcm9tX3VzZXIocHRyLCBidWYsIHVjaHVuayk7CisJCWt1bm1hcChwYWdlKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcmVzdWx0ID0gKHJlc3VsdCA8IDApID8gcmVzdWx0IDogLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCXVieXRlcyAtPSB1Y2h1bms7CisJCW1hZGRyICArPSBtY2h1bms7CisJCWJ1ZiAgICArPSBtY2h1bms7CisJCW1ieXRlcyAtPSBtY2h1bms7CisJfQorb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQga2ltYWdlX2xvYWRfY3Jhc2hfc2VnbWVudChzdHJ1Y3Qga2ltYWdlICppbWFnZSwKKwkJCQkJc3RydWN0IGtleGVjX3NlZ21lbnQgKnNlZ21lbnQpCit7CisJLyogRm9yIGNyYXNoIGR1bXBzIGtlcm5lbHMgd2Ugc2ltcGx5IGNvcHkgdGhlIGRhdGEgZnJvbQorCSAqIHVzZXIgc3BhY2UgdG8gaXQncyBkZXN0aW5hdGlvbi4KKwkgKiBXZSBkbyB0aGluZ3MgYSBwYWdlIGF0IGEgdGltZSBmb3IgdGhlIHNha2Ugb2Yga21hcC4KKwkgKi8KKwl1bnNpZ25lZCBsb25nIG1hZGRyOworCXVuc2lnbmVkIGxvbmcgdWJ5dGVzLCBtYnl0ZXM7CisJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmOworCisJcmVzdWx0ID0gMDsKKwlidWYgPSBzZWdtZW50LT5idWY7CisJdWJ5dGVzID0gc2VnbWVudC0+YnVmc3o7CisJbWJ5dGVzID0gc2VnbWVudC0+bWVtc3o7CisJbWFkZHIgPSBzZWdtZW50LT5tZW07CisJd2hpbGUgKG1ieXRlcykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJY2hhciAqcHRyOworCQlzaXplX3QgdWNodW5rLCBtY2h1bms7CisKKwkJcGFnZSA9IHBmbl90b19wYWdlKG1hZGRyID4+IFBBR0VfU0hJRlQpOworCQlpZiAocGFnZSA9PSAwKSB7CisJCQlyZXN1bHQgID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXB0ciA9IGttYXAocGFnZSk7CisJCXB0ciArPSBtYWRkciAmIH5QQUdFX01BU0s7CisJCW1jaHVuayA9IFBBR0VfU0laRSAtIChtYWRkciAmIH5QQUdFX01BU0spOworCQlpZiAobWNodW5rID4gbWJ5dGVzKQorCQkJbWNodW5rID0gbWJ5dGVzOworCisJCXVjaHVuayA9IG1jaHVuazsKKwkJaWYgKHVjaHVuayA+IHVieXRlcykgeworCQkJdWNodW5rID0gdWJ5dGVzOworCQkJLyogWmVybyB0aGUgdHJhaWxpbmcgcGFydCBvZiB0aGUgcGFnZSAqLworCQkJbWVtc2V0KHB0ciArIHVjaHVuaywgMCwgbWNodW5rIC0gdWNodW5rKTsKKwkJfQorCQlyZXN1bHQgPSBjb3B5X2Zyb21fdXNlcihwdHIsIGJ1ZiwgdWNodW5rKTsKKwkJa3VubWFwKHBhZ2UpOworCQlpZiAocmVzdWx0KSB7CisJCQlyZXN1bHQgPSAocmVzdWx0IDwgMCkgPyByZXN1bHQgOiAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJdWJ5dGVzIC09IHVjaHVuazsKKwkJbWFkZHIgICs9IG1jaHVuazsKKwkJYnVmICAgICs9IG1jaHVuazsKKwkJbWJ5dGVzIC09IG1jaHVuazsKKwl9CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBraW1hZ2VfbG9hZF9zZWdtZW50KHN0cnVjdCBraW1hZ2UgKmltYWdlLAorCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50ICpzZWdtZW50KQoreworCWludCByZXN1bHQgPSAtRU5PTUVNOworCisJc3dpdGNoIChpbWFnZS0+dHlwZSkgeworCWNhc2UgS0VYRUNfVFlQRV9ERUZBVUxUOgorCQlyZXN1bHQgPSBraW1hZ2VfbG9hZF9ub3JtYWxfc2VnbWVudChpbWFnZSwgc2VnbWVudCk7CisJCWJyZWFrOworCWNhc2UgS0VYRUNfVFlQRV9DUkFTSDoKKwkJcmVzdWx0ID0ga2ltYWdlX2xvYWRfY3Jhc2hfc2VnbWVudChpbWFnZSwgc2VnbWVudCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBFeGVjIEtlcm5lbCBzeXN0ZW0gY2FsbDogZm9yIG9idmlvdXMgcmVhc29ucyBvbmx5IHJvb3QgbWF5IGNhbGwgaXQuCisgKgorICogVGhpcyBjYWxsIGJyZWFrcyB1cCBpbnRvIHRocmVlIHBpZWNlcy4KKyAqIC0gQSBnZW5lcmljIHBhcnQgd2hpY2ggbG9hZHMgdGhlIG5ldyBrZXJuZWwgZnJvbSB0aGUgY3VycmVudAorICogICBhZGRyZXNzIHNwYWNlLCBhbmQgdmVyeSBjYXJlZnVsbHkgcGxhY2VzIHRoZSBkYXRhIGluIHRoZQorICogICBhbGxvY2F0ZWQgcGFnZXMuCisgKgorICogLSBBIGdlbmVyaWMgcGFydCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBrZXJuZWwgYW5kIHRlbGxzIGFsbCBvZgorICogICB0aGUgZGV2aWNlcyB0byBzaHV0IGRvd24uICBQcmV2ZW50aW5nIG9uLWdvaW5nIGRtYXMsIGFuZCBwbGFjaW5nCisgKiAgIHRoZSBkZXZpY2VzIGluIGEgY29uc2lzdGVudCBzdGF0ZSBzbyBhIGxhdGVyIGtlcm5lbCBjYW4KKyAqICAgcmVpbml0aWFsaXplIHRoZW0uCisgKgorICogLSBBIG1hY2hpbmUgc3BlY2lmaWMgcGFydCB0aGF0IGluY2x1ZGVzIHRoZSBzeXNjYWxsIG51bWJlcgorICogICBhbmQgdGhlIGNvcGllcyB0aGUgaW1hZ2UgdG8gaXQncyBmaW5hbCBkZXN0aW5hdGlvbi4gIEFuZAorICogICBqdW1wcyBpbnRvIHRoZSBpbWFnZSBhdCBlbnRyeS4KKyAqCisgKiBrZXhlYyBkb2VzIG5vdCBzeW5jLCBvciB1bm1vdW50IGZpbGVzeXN0ZW1zIHNvIGlmIHlvdSBuZWVkCisgKiB0aGF0IHRvIGhhcHBlbiB5b3UgbmVlZCB0byBkbyB0aGF0IHlvdXJzZWxmLgorICovCitzdHJ1Y3Qga2ltYWdlICprZXhlY19pbWFnZSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IGtpbWFnZSAqa2V4ZWNfY3Jhc2hfaW1hZ2UgPSBOVUxMOworLyoKKyAqIEEgaG9tZSBncm93biBiaW5hcnkgbXV0ZXguCisgKiBOb3RoaW5nIGNhbiB3YWl0IHNvIHRoaXMgbXV0ZXggaXMgc2FmZSB0byB1c2UKKyAqIGluIGludGVycnVwdCBjb250ZXh0IDopCisgKi8KK3N0YXRpYyBpbnQga2V4ZWNfbG9jayA9IDA7CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfa2V4ZWNfbG9hZCh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAorCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3Qga2ltYWdlICoqZGVzdF9pbWFnZSwgKmltYWdlOworCWludCBsb2NrZWQ7CisJaW50IHJlc3VsdDsKKworCS8qIFdlIG9ubHkgdHJ1c3QgdGhlIHN1cGVydXNlciB3aXRoIHJlYm9vdGluZyB0aGUgc3lzdGVtLiAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0JPT1QpKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyoKKwkgKiBWZXJpZnkgd2UgaGF2ZSBhIGxlZ2FsIHNldCBvZiBmbGFncworCSAqIFRoaXMgbGVhdmVzIHVzIHJvb20gZm9yIGZ1dHVyZSBleHRlbnNpb25zLgorCSAqLworCWlmICgoZmxhZ3MgJiBLRVhFQ19GTEFHUykgIT0gKGZsYWdzICYgfktFWEVDX0FSQ0hfTUFTSykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVmVyaWZ5IHdlIGFyZSBvbiB0aGUgYXBwcm9wcmlhdGUgYXJjaGl0ZWN0dXJlICovCisJaWYgKCgoZmxhZ3MgJiBLRVhFQ19BUkNIX01BU0spICE9IEtFWEVDX0FSQ0gpICYmCisJCSgoZmxhZ3MgJiBLRVhFQ19BUkNIX01BU0spICE9IEtFWEVDX0FSQ0hfREVGQVVMVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUHV0IGFuIGFydGlmaWNpYWwgY2FwIG9uIHRoZSBudW1iZXIKKwkgKiBvZiBzZWdtZW50cyBwYXNzZWQgdG8ga2V4ZWNfbG9hZC4KKwkgKi8KKwlpZiAobnJfc2VnbWVudHMgPiBLRVhFQ19TRUdNRU5UX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbWFnZSA9IE5VTEw7CisJcmVzdWx0ID0gMDsKKworCS8qIEJlY2F1c2Ugd2Ugd3JpdGUgZGlyZWN0bHkgdG8gdGhlIHJlc2VydmVkIG1lbW9yeQorCSAqIHJlZ2lvbiB3aGVuIGxvYWRpbmcgY3Jhc2gga2VybmVscyB3ZSBuZWVkIGEgbXV0ZXggaGVyZSB0bworCSAqIHByZXZlbnQgbXVsdGlwbGUgY3Jhc2ggIGtlcm5lbHMgZnJvbSBhdHRlbXB0aW5nIHRvIGxvYWQKKwkgKiBzaW11bHRhbmVvdXNseSwgYW5kIHRvIHByZXZlbnQgYSBjcmFzaCBrZXJuZWwgZnJvbSBsb2FkaW5nCisJICogb3ZlciB0aGUgdG9wIG9mIGEgaW4gdXNlIGNyYXNoIGtlcm5lbC4KKwkgKgorCSAqIEtJU1M6IGFsd2F5cyB0YWtlIHRoZSBtdXRleC4KKwkgKi8KKwlsb2NrZWQgPSB4Y2hnKCZrZXhlY19sb2NrLCAxKTsKKwlpZiAobG9ja2VkKQorCQlyZXR1cm4gLUVCVVNZOworCisJZGVzdF9pbWFnZSA9ICZrZXhlY19pbWFnZTsKKwlpZiAoZmxhZ3MgJiBLRVhFQ19PTl9DUkFTSCkKKwkJZGVzdF9pbWFnZSA9ICZrZXhlY19jcmFzaF9pbWFnZTsKKwlpZiAobnJfc2VnbWVudHMgPiAwKSB7CisJCXVuc2lnbmVkIGxvbmcgaTsKKworCQkvKiBMb2FkaW5nIGFub3RoZXIga2VybmVsIHRvIHJlYm9vdCBpbnRvICovCisJCWlmICgoZmxhZ3MgJiBLRVhFQ19PTl9DUkFTSCkgPT0gMCkKKwkJCXJlc3VsdCA9IGtpbWFnZV9ub3JtYWxfYWxsb2MoJmltYWdlLCBlbnRyeSwKKwkJCQkJCQlucl9zZWdtZW50cywgc2VnbWVudHMpOworCQkvKiBMb2FkaW5nIGFub3RoZXIga2VybmVsIHRvIHN3aXRjaCB0byBpZiB0aGlzIG9uZSBjcmFzaGVzICovCisJCWVsc2UgaWYgKGZsYWdzICYgS0VYRUNfT05fQ1JBU0gpIHsKKwkJCS8qIEZyZWUgYW55IGN1cnJlbnQgY3Jhc2ggZHVtcCBrZXJuZWwgYmVmb3JlCisJCQkgKiB3ZSBjb3JydXB0IGl0LgorCQkJICovCisJCQlraW1hZ2VfZnJlZSh4Y2hnKCZrZXhlY19jcmFzaF9pbWFnZSwgTlVMTCkpOworCQkJcmVzdWx0ID0ga2ltYWdlX2NyYXNoX2FsbG9jKCZpbWFnZSwgZW50cnksCisJCQkJCQkgICAgIG5yX3NlZ21lbnRzLCBzZWdtZW50cyk7CisJCX0KKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gb3V0OworCisJCXJlc3VsdCA9IG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShpbWFnZSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIG91dDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnbWVudHM7IGkrKykgeworCQkJcmVzdWx0ID0ga2ltYWdlX2xvYWRfc2VnbWVudChpbWFnZSwgJmltYWdlLT5zZWdtZW50W2ldKTsKKwkJCWlmIChyZXN1bHQpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJcmVzdWx0ID0ga2ltYWdlX3Rlcm1pbmF0ZShpbWFnZSk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIG91dDsKKwl9CisJLyogSW5zdGFsbCB0aGUgbmV3IGtlcm5lbCwgYW5kICBVbmluc3RhbGwgdGhlIG9sZCAqLworCWltYWdlID0geGNoZyhkZXN0X2ltYWdlLCBpbWFnZSk7CisKK291dDoKKwl4Y2hnKCZrZXhlY19sb2NrLCAwKTsgLyogUmVsZWFzZSB0aGUgbXV0ZXggKi8KKwlraW1hZ2VfZnJlZShpbWFnZSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfa2V4ZWNfbG9hZCh1bnNpZ25lZCBsb25nIGVudHJ5LAorCQkJCXVuc2lnbmVkIGxvbmcgbnJfc2VnbWVudHMsCisJCQkJc3RydWN0IGNvbXBhdF9rZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMsCisJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgY29tcGF0X2tleGVjX3NlZ21lbnQgaW47CisJc3RydWN0IGtleGVjX3NlZ21lbnQgb3V0LCBfX3VzZXIgKmtzZWdtZW50czsKKwl1bnNpZ25lZCBsb25nIGksIHJlc3VsdDsKKworCS8qIERvbid0IGFsbG93IGNsaWVudHMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIHRoZSBuYXRpdmUKKwkgKiBhcmNoaXRlY3R1cmUgdG8gZG8gYW55dGhpbmcuCisJICovCisJaWYgKChmbGFncyAmIEtFWEVDX0FSQ0hfTUFTSykgPT0gS0VYRUNfQVJDSF9ERUZBVUxUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChucl9zZWdtZW50cyA+IEtFWEVDX1NFR01FTlRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtzZWdtZW50cyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKG5yX3NlZ21lbnRzICogc2l6ZW9mKG91dCkpOworCWZvciAoaT0wOyBpIDwgbnJfc2VnbWVudHM7IGkrKykgeworCQlyZXN1bHQgPSBjb3B5X2Zyb21fdXNlcigmaW4sICZzZWdtZW50c1tpXSwgc2l6ZW9mKGluKSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlvdXQuYnVmICAgPSBjb21wYXRfcHRyKGluLmJ1Zik7CisJCW91dC5idWZzeiA9IGluLmJ1ZnN6OworCQlvdXQubWVtICAgPSBpbi5tZW07CisJCW91dC5tZW1zeiA9IGluLm1lbXN6OworCisJCXJlc3VsdCA9IGNvcHlfdG9fdXNlcigma3NlZ21lbnRzW2ldLCAmb3V0LCBzaXplb2Yob3V0KSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gc3lzX2tleGVjX2xvYWQoZW50cnksIG5yX3NlZ21lbnRzLCBrc2VnbWVudHMsIGZsYWdzKTsKK30KKyNlbmRpZgorCit2b2lkIGNyYXNoX2tleGVjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBraW1hZ2UgKmltYWdlOworCWludCBsb2NrZWQ7CisKKworCS8qIFRha2UgdGhlIGtleGVjX2xvY2sgaGVyZSB0byBwcmV2ZW50IHN5c19rZXhlY19sb2FkCisJICogcnVubmluZyBvbiBvbmUgY3B1IGZyb20gcmVwbGFjaW5nIHRoZSBjcmFzaCBrZXJuZWwKKwkgKiB3ZSBhcmUgdXNpbmcgYWZ0ZXIgYSBwYW5pYyBvbiBhIGRpZmZlcmVudCBjcHUuCisJICoKKwkgKiBJZiB0aGUgY3Jhc2gga2VybmVsIHdhcyBub3QgbG9jYXRlZCBpbiBhIGZpeGVkIGFyZWEKKwkgKiBvZiBtZW1vcnkgdGhlIHhjaGcoJmtleGVjX2NyYXNoX2ltYWdlKSB3b3VsZCBiZQorCSAqIHN1ZmZpY2llbnQuICBCdXQgc2luY2UgSSByZXVzZSB0aGUgbWVtb3J5Li4uCisJICovCisJbG9ja2VkID0geGNoZygma2V4ZWNfbG9jaywgMSk7CisJaWYgKCFsb2NrZWQpIHsKKwkJaW1hZ2UgPSB4Y2hnKCZrZXhlY19jcmFzaF9pbWFnZSwgTlVMTCk7CisJCWlmIChpbWFnZSkgeworCQkJbWFjaGluZV9jcmFzaF9zaHV0ZG93bihyZWdzKTsKKwkJCW1hY2hpbmVfa2V4ZWMoaW1hZ2UpOworCQl9CisJCXhjaGcoJmtleGVjX2xvY2ssIDApOworCX0KK30KZGlmZiAtLWdpdCBhL2tlcm5lbC9rbW9kLmMgYi9rZXJuZWwva21vZC5jCmluZGV4IGVlZDUzZDQuLjQ0MTY2ZTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rbW9kLmMKKysrIGIva2VybmVsL2ttb2QuYwpAQCAtMTIwLDYgKzEyMCw3IEBACiAJY2hhciAqcGF0aDsKIAljaGFyICoqYXJndjsKIAljaGFyICoqZW52cDsKKwlzdHJ1Y3Qga2V5ICpyaW5nOwogCWludCB3YWl0OwogCWludCByZXR2YWw7CiB9OwpAQCAtMTMwLDE2ICsxMzEsMjEgQEAKIHN0YXRpYyBpbnQgX19fX2NhbGxfdXNlcm1vZGVoZWxwZXIodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICpzdWJfaW5mbyA9IGRhdGE7CisJc3RydWN0IGtleSAqb2xkX3Nlc3Npb247CiAJaW50IHJldHZhbDsKIAotCS8qIFVuYmxvY2sgYWxsIHNpZ25hbHMuICovCisJLyogVW5ibG9jayBhbGwgc2lnbmFscyBhbmQgc2V0IHRoZSBzZXNzaW9uIGtleXJpbmcuICovCisJa2V5X2dldChzdWJfaW5mby0+cmluZyk7CiAJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlvbGRfc2Vzc2lvbiA9IF9faW5zdGFsbF9zZXNzaW9uX2tleXJpbmcoY3VycmVudCwgc3ViX2luZm8tPnJpbmcpOwogCWZsdXNoX3NpZ25hbF9oYW5kbGVycyhjdXJyZW50LCAxKTsKIAlzaWdlbXB0eXNldCgmY3VycmVudC0+YmxvY2tlZCk7CiAJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCisJa2V5X3B1dChvbGRfc2Vzc2lvbik7CisKIAkvKiBXZSBjYW4gcnVuIGFueXdoZXJlLCB1bmxpa2Ugb3VyIHBhcmVudCBrZXZlbnRkKCkuICovCiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBDUFVfTUFTS19BTEwpOwogCkBAIC0yMTEsMTAgKzIxNywxMSBAQAogfQogCiAvKioKLSAqIGNhbGxfdXNlcm1vZGVoZWxwZXIgLSBzdGFydCBhIHVzZXJtb2RlIGFwcGxpY2F0aW9uCisgKiBjYWxsX3VzZXJtb2RlaGVscGVyX2tleXMgLSBzdGFydCBhIHVzZXJtb2RlIGFwcGxpY2F0aW9uCiAgKiBAcGF0aDogcGF0aG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbgogICogQGFyZ3Y6IG51bGwtdGVybWluYXRlZCBhcmd1bWVudCBsaXN0CiAgKiBAZW52cDogbnVsbC10ZXJtaW5hdGVkIGVudmlyb25tZW50IGxpc3QKKyAqIEBzZXNzaW9uX2tleXJpbmc6IHNlc3Npb24ga2V5cmluZyBmb3IgcHJvY2VzcyAoTlVMTCBmb3IgYW4gZW1wdHkga2V5cmluZykKICAqIEB3YWl0OiB3YWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gZmluaXNoIGFuZCByZXR1cm4gc3RhdHVzLgogICoKICAqIFJ1bnMgYSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIGlzIHN0YXJ0ZWQKQEAgLTIyNCw3ICsyMzEsOCBAQAogICogTXVzdCBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZQogICogaWYgcHJvZ3JhbSB3YXMgbm90IGV4ZWNlZCBzdWNjZXNzZnVsbHksIG9yIDAuCiAgKi8KLWludCBjYWxsX3VzZXJtb2RlaGVscGVyKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCwgaW50IHdhaXQpCitpbnQgY2FsbF91c2VybW9kZWhlbHBlcl9rZXlzKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCwKKwkJCSAgICAgc3RydWN0IGtleSAqc2Vzc2lvbl9rZXlyaW5nLCBpbnQgd2FpdCkKIHsKIAlERUNMQVJFX0NPTVBMRVRJT04oZG9uZSk7CiAJc3RydWN0IHN1YnByb2Nlc3NfaW5mbyBzdWJfaW5mbyA9IHsKQEAgLTIzMiw2ICsyNDAsNyBAQAogCQkucGF0aAkJPSBwYXRoLAogCQkuYXJndgkJPSBhcmd2LAogCQkuZW52cAkJPSBlbnZwLAorCQkucmluZwkJPSBzZXNzaW9uX2tleXJpbmcsCiAJCS53YWl0CQk9IHdhaXQsCiAJCS5yZXR2YWwJCT0gMCwKIAl9OwpAQCAtMjQ3LDcgKzI1Niw3IEBACiAJd2FpdF9mb3JfY29tcGxldGlvbigmZG9uZSk7CiAJcmV0dXJuIHN1Yl9pbmZvLnJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0woY2FsbF91c2VybW9kZWhlbHBlcik7CitFWFBPUlRfU1lNQk9MKGNhbGxfdXNlcm1vZGVoZWxwZXJfa2V5cyk7CiAKIHZvaWQgX19pbml0IHVzZXJtb2RlaGVscGVyX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9rcHJvYmVzLmMgYi9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDMzNGYzNzQuLmIwMjM3MTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIva2VybmVsL2twcm9iZXMuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CkBAIC01MCw2ICs1MSwxMDYgQEAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soa3Byb2JlX2xvY2spOwogc3RhdGljIHN0cnVjdCBrcHJvYmUgKmN1cnJfa3Byb2JlOwogCisvKgorICoga3Byb2JlLT5haW5zbi5pbnNuIHBvaW50cyB0byB0aGUgY29weSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUKKyAqIHNpbmdsZS1zdGVwcGVkLiB4ODZfNjQsIFBPV0VSNCBhbmQgYWJvdmUgaGF2ZSBuby1leGVjIHN1cHBvcnQgYW5kCisgKiBzdGVwcGluZyBvbiB0aGUgaW5zdHJ1Y3Rpb24gb24gYSB2bWFsbG9jZWQva21hbGxvY2VkL2RhdGEgcGFnZQorICogaXMgYSByZWNpcGUgZm9yIGRpc2FzdGVyCisgKi8KKyNkZWZpbmUgSU5TTlNfUEVSX1BBR0UJKFBBR0VfU0laRS8oTUFYX0lOU05fU0laRSAqIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKSkKKworc3RydWN0IGtwcm9iZV9pbnNuX3BhZ2UgeworCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OworCWtwcm9iZV9vcGNvZGVfdCAqaW5zbnM7CQkvKiBQYWdlIG9mIGluc3RydWN0aW9uIHNsb3RzICovCisJY2hhciBzbG90X3VzZWRbSU5TTlNfUEVSX1BBR0VdOworCWludCBudXNlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBrcHJvYmVfaW5zbl9wYWdlczsKKworLyoqCisgKiBnZXRfaW5zbl9zbG90KCkgLSBGaW5kIGEgc2xvdCBvbiBhbiBleGVjdXRhYmxlIHBhZ2UgZm9yIGFuIGluc3RydWN0aW9uLgorICogV2UgYWxsb2NhdGUgYW4gZXhlY3V0YWJsZSBwYWdlIGlmIHRoZXJlJ3Mgbm8gcm9vbSBvbiBleGlzdGluZyBvbmVzLgorICovCitrcHJvYmVfb3Bjb2RlX3QgKmdldF9pbnNuX3Nsb3Qodm9pZCkKK3sKKwlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgeworCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7CisJCWlmIChraXAtPm51c2VkIDwgSU5TTlNfUEVSX1BBR0UpIHsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IElOU05TX1BFUl9QQUdFOyBpKyspIHsKKwkJCQlpZiAoIWtpcC0+c2xvdF91c2VkW2ldKSB7CisJCQkJCWtpcC0+c2xvdF91c2VkW2ldID0gMTsKKwkJCQkJa2lwLT5udXNlZCsrOworCQkJCQlyZXR1cm4ga2lwLT5pbnNucyArIChpICogTUFYX0lOU05fU0laRSk7CisJCQkJfQorCQkJfQorCQkJLyogU3VycHJpc2UhICBObyB1bnVzZWQgc2xvdHMuICBGaXgga2lwLT5udXNlZC4gKi8KKwkJCWtpcC0+bnVzZWQgPSBJTlNOU19QRVJfUEFHRTsKKwkJfQorCX0KKworCS8qIEFsbCBvdXQgb2Ygc3BhY2UuICBOZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHBhZ2UuIFVzZSBzbG90IDAuKi8KKwlraXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSksIEdGUF9LRVJORUwpOworCWlmICgha2lwKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogVXNlIG1vZHVsZV9hbGxvYyBzbyB0aGlzIHBhZ2UgaXMgd2l0aGluICsvLSAyR0Igb2Ygd2hlcmUgdGhlCisJICoga2VybmVsIGltYWdlIGFuZCBsb2FkZWQgbW9kdWxlIGltYWdlcyByZXNpZGUuIFRoaXMgaXMgcmVxdWlyZWQKKwkgKiBzbyB4ODZfNjQgY2FuIGNvcnJlY3RseSBoYW5kbGUgdGhlICVyaXAtcmVsYXRpdmUgZml4dXBzLgorCSAqLworCWtpcC0+aW5zbnMgPSBtb2R1bGVfYWxsb2MoUEFHRV9TSVpFKTsKKwlpZiAoIWtpcC0+aW5zbnMpIHsKKwkJa2ZyZWUoa2lwKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUlOSVRfSExJU1RfTk9ERSgma2lwLT5obGlzdCk7CisJaGxpc3RfYWRkX2hlYWQoJmtpcC0+aGxpc3QsICZrcHJvYmVfaW5zbl9wYWdlcyk7CisJbWVtc2V0KGtpcC0+c2xvdF91c2VkLCAwLCBJTlNOU19QRVJfUEFHRSk7CisJa2lwLT5zbG90X3VzZWRbMF0gPSAxOworCWtpcC0+bnVzZWQgPSAxOworCXJldHVybiBraXAtPmluc25zOworfQorCit2b2lkIGZyZWVfaW5zbl9zbG90KGtwcm9iZV9vcGNvZGVfdCAqc2xvdCkKK3sKKwlzdHJ1Y3Qga3Byb2JlX2luc25fcGFnZSAqa2lwOworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlobGlzdF9mb3JfZWFjaChwb3MsICZrcHJvYmVfaW5zbl9wYWdlcykgeworCQlraXAgPSBobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBrcHJvYmVfaW5zbl9wYWdlLCBobGlzdCk7CisJCWlmIChraXAtPmluc25zIDw9IHNsb3QgJiYKKwkJICAgIHNsb3QgPCBraXAtPmluc25zICsgKElOU05TX1BFUl9QQUdFICogTUFYX0lOU05fU0laRSkpIHsKKwkJCWludCBpID0gKHNsb3QgLSBraXAtPmluc25zKSAvIE1BWF9JTlNOX1NJWkU7CisJCQlraXAtPnNsb3RfdXNlZFtpXSA9IDA7CisJCQlraXAtPm51c2VkLS07CisJCQlpZiAoa2lwLT5udXNlZCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBQYWdlIGlzIG5vIGxvbmdlciBpbiB1c2UuICBGcmVlIGl0IHVubGVzcworCQkJCSAqIGl0J3MgdGhlIGxhc3Qgb25lLiAgV2Uga2VlcCB0aGUgbGFzdCBvbmUKKwkJCQkgKiBzbyBhcyBub3QgdG8gaGF2ZSB0byBzZXQgaXQgdXAgYWdhaW4gdGhlCisJCQkJICogbmV4dCB0aW1lIHNvbWVib2R5IGluc2VydHMgYSBwcm9iZS4KKwkJCQkgKi8KKwkJCQlobGlzdF9kZWwoJmtpcC0+aGxpc3QpOworCQkJCWlmIChobGlzdF9lbXB0eSgma3Byb2JlX2luc25fcGFnZXMpKSB7CisJCQkJCUlOSVRfSExJU1RfTk9ERSgma2lwLT5obGlzdCk7CisJCQkJCWhsaXN0X2FkZF9oZWFkKCZraXAtPmhsaXN0LAorCQkJCQkJJmtwcm9iZV9pbnNuX3BhZ2VzKTsKKwkJCQl9IGVsc2UgeworCQkJCQltb2R1bGVfZnJlZShOVUxMLCBraXAtPmluc25zKTsKKwkJCQkJa2ZyZWUoa2lwKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKIC8qIExvY2tzIGtwcm9iZTogaXJxcyBtdXN0IGJlIGRpc2FibGVkICovCiB2b2lkIGxvY2tfa3Byb2Jlcyh2b2lkKQogewpAQCAtMTM5LDEyICsyNDAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qga3Byb2JlIHRyYW1wb2xpbmVfcCA9IHsKLQkJLmFkZHIgPSAoa3Byb2JlX29wY29kZV90ICopICZrcmV0cHJvYmVfdHJhbXBvbGluZSwKLQkJLnByZV9oYW5kbGVyID0gdHJhbXBvbGluZV9wcm9iZV9oYW5kbGVyLAotCQkucG9zdF9oYW5kbGVyID0gdHJhbXBvbGluZV9wb3N0X2hhbmRsZXIKLX07Ci0KIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKmdldF9mcmVlX3JwX2luc3Qoc3RydWN0IGtyZXRwcm9iZSAqcnApCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CkBAIC0xNjMsMzUgKzI1OCwxOCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpnZXRfcnBfaW5zdCh2b2lkICpzYXJhKQotewotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwotCXN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOwotCi0JdHNrID0gYXJjaF9nZXRfa3Byb2JlX3Rhc2soc2FyYSk7Ci0JaGVhZCA9ICZrcmV0cHJvYmVfaW5zdF90YWJsZVtoYXNoX3B0cih0c2ssIEtQUk9CRV9IQVNIX0JJVFMpXTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShyaSwgbm9kZSwgaGVhZCwgaGxpc3QpIHsKLQkJaWYgKHJpLT5zdGFja19hZGRyID09IHNhcmEpCi0JCQlyZXR1cm4gcmk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiB2b2lkIGFkZF9ycF9pbnN0KHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCS8qCiAJICogUmVtb3ZlIHJwIGluc3Qgb2ZmIHRoZSBmcmVlIGxpc3QgLQogCSAqIEFkZCBpdCBiYWNrIHdoZW4gcHJvYmVkIGZ1bmN0aW9uIHJldHVybnMKIAkgKi8KIAlobGlzdF9kZWwoJnJpLT51Zmxpc3QpOwotCXRzayA9IGFyY2hfZ2V0X2twcm9iZV90YXNrKHJpLT5zdGFja19hZGRyKTsKKwogCS8qIEFkZCBycCBpbnN0IG9udG8gdGFibGUgKi8KIAlJTklUX0hMSVNUX05PREUoJnJpLT5obGlzdCk7CiAJaGxpc3RfYWRkX2hlYWQoJnJpLT5obGlzdCwKLQkJCSZrcmV0cHJvYmVfaW5zdF90YWJsZVtoYXNoX3B0cih0c2ssIEtQUk9CRV9IQVNIX0JJVFMpXSk7CisJCQkma3JldHByb2JlX2luc3RfdGFibGVbaGFzaF9wdHIocmktPnRhc2ssIEtQUk9CRV9IQVNIX0JJVFMpXSk7CiAKIAkvKiBBbHNvIGFkZCB0aGlzIHJwIGluc3QgdG8gdGhlIHVzZWQgbGlzdC4gKi8KIAlJTklUX0hMSVNUX05PREUoJnJpLT51Zmxpc3QpOwpAQCAtMjE4LDM0ICsyOTYsMjUgQEAKIAlyZXR1cm4gJmtyZXRwcm9iZV9pbnN0X3RhYmxlW2hhc2hfcHRyKHRzaywgS1BST0JFX0hBU0hfQklUUyldOwogfQogCi1zdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpnZXRfcnBfaW5zdF90c2soc3RydWN0IHRhc2tfc3RydWN0ICp0aykKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKLQlzdHJ1Y3Qga3JldHByb2JlX2luc3RhbmNlICpyaTsKLQotCWhlYWQgPSAma3JldHByb2JlX2luc3RfdGFibGVbaGFzaF9wdHIodGssIEtQUk9CRV9IQVNIX0JJVFMpXTsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJpLCBub2RlLCBoZWFkLCBobGlzdCkgewotCQl0c2sgPSBhcmNoX2dldF9rcHJvYmVfdGFzayhyaS0+c3RhY2tfYWRkcik7Ci0JCWlmICh0c2sgPT0gdGspCi0JCQlyZXR1cm4gcmk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiAvKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBkb19leGl0IG9yIGRvX2V4ZWN2IHdoZW4gdGFzayB0aydzIHN0YWNrIGlzCi0gKiBhYm91dCB0byBiZSByZWN5Y2xlZC4gUmVjeWNsZSBhbnkgZnVuY3Rpb24tcmV0dXJuIHByb2JlIGluc3RhbmNlcwotICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFzay4gVGhlc2UgcmVwcmVzZW50IHByb2JlZCBmdW5jdGlvbnMgdGhhdCBoYXZlCi0gKiBiZWVuIGNhbGxlZCBidXQgbWF5IG5ldmVyIHJldHVybi4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gZXhpdF90aHJlYWQgb3IgZmx1c2hfdGhyZWFkIHdoZW4gdGFzayB0aydzCisgKiBzdGFjayBpcyBiZWluZyByZWN5Y2xlZCBzbyB0aGF0IHdlIGNhbiByZWN5Y2xlIGFueSBmdW5jdGlvbi1yZXR1cm4gcHJvYmUKKyAqIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXNrLiBUaGVzZSBsZWZ0IG92ZXIgaW5zdGFuY2VzIHJlcHJlc2VudAorICogcHJvYmVkIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBjYWxsZWQgYnV0IHdpbGwgbmV2ZXIgcmV0dXJuLgogICovCiB2b2lkIGtwcm9iZV9mbHVzaF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGspCiB7CisgICAgICAgIHN0cnVjdCBrcmV0cHJvYmVfaW5zdGFuY2UgKnJpOworICAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZrcHJvYmVfbG9jaywgZmxhZ3MpOwotCWFyY2hfa3Byb2JlX2ZsdXNoX3Rhc2sodGspOworICAgICAgICBoZWFkID0ga3JldHByb2JlX2luc3RfdGFibGVfaGVhZChjdXJyZW50KTsKKyAgICAgICAgaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyaSwgbm9kZSwgdG1wLCBoZWFkLCBobGlzdCkgeworICAgICAgICAgICAgICAgIGlmIChyaS0+dGFzayA9PSB0aykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ljbGVfcnBfaW5zdChyaSk7CisgICAgICAgIH0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrcHJvYmVfbG9jaywgZmxhZ3MpOwogfQogCkBAIC01MDUsOSArNTc0LDEwIEBACiAJCUlOSVRfSExJU1RfSEVBRCgma3JldHByb2JlX2luc3RfdGFibGVbaV0pOwogCX0KIAotCWVyciA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigma3Byb2JlX2V4Y2VwdGlvbnNfbmIpOwotCS8qIFJlZ2lzdGVyIHRoZSB0cmFtcG9saW5lIHByb2JlIGZvciByZXR1cm4gcHJvYmUgKi8KLQlyZWdpc3Rlcl9rcHJvYmUoJnRyYW1wb2xpbmVfcCk7CisJZXJyID0gYXJjaF9pbml0X2twcm9iZXMoKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZrcHJvYmVfZXhjZXB0aW9uc19uYik7CisKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwva3N5c2ZzLmMgYi9rZXJuZWwva3N5c2ZzLmMKaW5kZXggMWYwNjRhNi4uMDE1ZmI2OSAxMDA2NDQKLS0tIGEva2VybmVsL2tzeXNmcy5jCisrKyBiL2tlcm5lbC9rc3lzZnMuYwpAQCAtMzAsNiArMzAsMTYgQEAKIEtFUk5FTF9BVFRSX1JPKGhvdHBsdWdfc2VxbnVtKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0tFWEVDCisjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisKK3N0YXRpYyBzc2l6ZV90IGNyYXNoX25vdGVzX3Nob3coc3RydWN0IHN1YnN5c3RlbSAqc3Vic3lzLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlcFxuIiwgKHZvaWQgKiljcmFzaF9ub3Rlcyk7Cit9CitLRVJORUxfQVRUUl9STyhjcmFzaF9ub3Rlcyk7CisjZW5kaWYKKwogZGVjbF9zdWJzeXMoa2VybmVsLCBOVUxMLCBOVUxMKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGtlcm5lbF9zdWJzeXMpOwogCkBAIC0zNyw2ICs0Nyw5IEBACiAjaWZkZWYgQ09ORklHX0hPVFBMVUcKIAkmaG90cGx1Z19zZXFudW1fYXR0ci5hdHRyLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0tFWEVDCisJJmNyYXNoX25vdGVzX2F0dHIuYXR0ciwKKyNlbmRpZgogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCBhNTY2NzQ1Li4wNjhlMjcxIDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMzcwLDYgKzM3MSw0MyBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmZGVmIENPTkZJR19NT0RVTEVfVU5MT0FECisjZGVmaW5lIE1PRElORk9fQVRUUihmaWVsZCkJXAorc3RhdGljIHZvaWQgc2V0dXBfbW9kaW5mb18jI2ZpZWxkKHN0cnVjdCBtb2R1bGUgKm1vZCwgY29uc3QgY2hhciAqcykgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJbW9kLT5maWVsZCA9IGtzdHJkdXAocywgR0ZQX0tFUk5FTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3Qgc2hvd19tb2RpbmZvXyMjZmllbGQoc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKm1hdHRyLCAgIFwKKwkgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZSAqbW9kLCBjaGFyICpidWZmZXIpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIG1vZC0+ZmllbGQpOyAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBtb2RpbmZvXyMjZmllbGQjI19leGlzdHMoc3RydWN0IG1vZHVsZSAqbW9kKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIG1vZC0+ZmllbGQgIT0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZnJlZV9tb2RpbmZvXyMjZmllbGQoc3RydWN0IG1vZHVsZSAqbW9kKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGtmcmVlKG1vZC0+ZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtb2QtPmZpZWxkID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgbW9kaW5mb18jI2ZpZWxkID0geyAgICAgICAgICAgICAgICAgICAgXAorCS5hdHRyID0geyAubmFtZSA9IF9fc3RyaW5naWZ5KGZpZWxkKSwgLm1vZGUgPSAwNDQ0LCAgICAgICAgICAgXAorCQkgIC5vd25lciA9IFRISVNfTU9EVUxFIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLnNob3cgPSBzaG93X21vZGluZm9fIyNmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLnNldHVwID0gc2V0dXBfbW9kaW5mb18jI2ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLnRlc3QgPSBtb2RpbmZvXyMjZmllbGQjI19leGlzdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJLmZyZWUgPSBmcmVlX21vZGluZm9fIyNmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9OworCitNT0RJTkZPX0FUVFIodmVyc2lvbik7CitNT0RJTkZPX0FUVFIoc3JjdmVyc2lvbik7CisKK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqbW9kaW5mb19hdHRyc1tdID0geworCSZtb2RpbmZvX3ZlcnNpb24sCisJJm1vZGluZm9fc3JjdmVyc2lvbiwKKwlOVUxMLAorfTsKKwogLyogSW5pdCB0aGUgdW5sb2FkIHNlY3Rpb24gb2YgdGhlIG1vZHVsZS4gKi8KIHN0YXRpYyB2b2lkIG1vZHVsZV91bmxvYWRfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CkBAIC02OTIsNyArNzMwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNldF9vYnNvbGV0ZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQorc3RhdGljIGludCBzZXRfb2Jzb2xldGUoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKIAl1bnNpZ25lZCBpbnQgbWluLCBtYXg7CiAJdW5zaWduZWQgaW50IHNpemUsIG1heHNpemU7CkBAIC0xMDMxLDYgKzEwNjksMzIgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKK3N0YXRpYyBpbnQgbW9kdWxlX2FkZF9tb2RpbmZvX2F0dHJzKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3QgbW9kdWxlX2F0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgZXJyb3IgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgKGF0dHIgPSBtb2RpbmZvX2F0dHJzW2ldKSAmJiAhZXJyb3I7IGkrKykgeworCQlpZiAoIWF0dHItPnRlc3QgfHwKKwkJICAgIChhdHRyLT50ZXN0ICYmIGF0dHItPnRlc3QobW9kKSkpCisJCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZtb2QtPm1rb2JqLmtvYmosJmF0dHItPmF0dHIpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9yZW1vdmVfbW9kaW5mb19hdHRycyhzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IG1vZHVsZV9hdHRyaWJ1dGUgKmF0dHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyAoYXR0ciA9IG1vZGluZm9fYXR0cnNbaV0pOyBpKyspIHsKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJm1vZC0+bWtvYmoua29iaiwmYXR0ci0+YXR0cik7CisJCWF0dHItPmZyZWUobW9kKTsKKwl9Cit9CisjZW5kaWYKIAogc3RhdGljIGludCBtb2Rfc3lzZnNfc2V0dXAoc3RydWN0IG1vZHVsZSAqbW9kLAogCQkJICAgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3BhcmFtLApAQCAtMTA1Niw2ICsxMTIwLDEyIEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5yZWc7CiAKKyNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAorCWVyciA9IG1vZHVsZV9hZGRfbW9kaW5mb19hdHRycyhtb2QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucmVnOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIAogb3V0X3VucmVnOgpAQCAtMTA2Niw2ICsxMTM2LDkgQEAKIAogc3RhdGljIHZvaWQgbW9kX2tvYmplY3RfcmVtb3ZlKHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKKyNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAorCW1vZHVsZV9yZW1vdmVfbW9kaW5mb19hdHRycyhtb2QpOworI2VuZGlmCiAJbW9kdWxlX3JlbW92ZV9yZWZjbnRfYXR0cihtb2QpOwogCW1vZHVsZV9wYXJhbV9zeXNmc19yZW1vdmUobW9kKTsKIApAQCAtMTMxMSw2ICsxMzg0LDIzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKyNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAorc3RhdGljIHZvaWQgc2V0dXBfbW9kaW5mbyhzdHJ1Y3QgbW9kdWxlICptb2QsIEVsZl9TaGRyICpzZWNoZHJzLAorCQkJICB1bnNpZ25lZCBpbnQgaW5mb2luZGV4KQoreworCXN0cnVjdCBtb2R1bGVfYXR0cmlidXRlICphdHRyOworCWludCBpOworCisJZm9yIChpID0gMDsgKGF0dHIgPSBtb2RpbmZvX2F0dHJzW2ldKTsgaSsrKSB7CisJCWlmIChhdHRyLT5zZXR1cCkKKwkJCWF0dHItPnNldHVwKG1vZCwKKwkJCQkgICAgZ2V0X21vZGluZm8oc2VjaGRycywKKwkJCQkJCWluZm9pbmRleCwKKwkJCQkJCWF0dHItPmF0dHIubmFtZSkpOworCX0KK30KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiBpbnQgaXNfZXhwb3J0ZWQoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kKQogewpAQCAtMTYxNSw2ICsxNzA1LDExIEBACiAJLyogU2V0IHVwIGxpY2Vuc2UgaW5mbyBiYXNlZCBvbiB0aGUgaW5mbyBzZWN0aW9uICovCiAJc2V0X2xpY2Vuc2UobW9kLCBnZXRfbW9kaW5mbyhzZWNoZHJzLCBpbmZvaW5kZXgsICJsaWNlbnNlIikpOwogCisjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKKwkvKiBTZXQgdXAgTU9ESU5GT19BVFRSIGZpZWxkcyAqLworCXNldHVwX21vZGluZm8obW9kLCBzZWNoZHJzLCBpbmZvaW5kZXgpOworI2VuZGlmCisKIAkvKiBGaXggdXAgc3ltcywgc28gdGhhdCBzdF92YWx1ZSBpcyBhIHBvaW50ZXIgdG8gbG9jYXRpb24uICovCiAJZXJyID0gc2ltcGxpZnlfc3ltYm9scyhzZWNoZHJzLCBzeW1pbmRleCwgc3RydGFiLCB2ZXJzaW5kZXgsIHBjcHVpbmRleCwKIAkJCSAgICAgICBtb2QpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCAwODFmNzQ2Li43NGJhNWYzIDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogaW50IHBhbmljX3RpbWVvdXQ7CiBpbnQgcGFuaWNfb25fb29wczsKQEAgLTYzLDYgKzY0LDEzIEBACiAgICAgICAgIHVuc2lnbmVkIGxvbmcgY2FsbGVyID0gKHVuc2lnbmVkIGxvbmcpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKICNlbmRpZgogCisJLyoKKwkgKiBJdCdzIHBvc3NpYmxlIHRvIGNvbWUgaGVyZSBkaXJlY3RseSBmcm9tIGEgcGFuaWMtYXNzZXJ0aW9uIGFuZCBub3QKKwkgKiBoYXZlIHByZWVtcHQgZGlzYWJsZWQuIFNvbWUgZnVuY3Rpb25zIGNhbGxlZCBmcm9tIGhlcmUgd2FudAorCSAqIHByZWVtcHQgdG8gYmUgZGlzYWJsZWQuIE5vIHBvaW50IGVuYWJsaW5nIGl0IGxhdGVyIHRob3VnaC4uLgorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCiAJYnVzdF9zcGlubG9ja3MoMSk7CiAJdmFfc3RhcnQoYXJncywgZm10KTsKIAl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKQEAgLTcwLDcgKzc4LDE5IEBACiAJcHJpbnRrKEtFUk5fRU1FUkcgIktlcm5lbCBwYW5pYyAtIG5vdCBzeW5jaW5nOiAlc1xuIixidWYpOwogCWJ1c3Rfc3BpbmxvY2tzKDApOwogCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGNyYXNoZWQgYW5kIHdlIGhhdmUgYSBjcmFzaCBrZXJuZWwgbG9hZGVkIGxldCBpdCBoYW5kbGUKKwkgKiBldmVyeXRoaW5nIGVsc2UuCisJICogRG8gd2Ugd2FudCB0byBjYWxsIHRoaXMgYmVmb3JlIHdlIHRyeSB0byBkaXNwbGF5IGEgbWVzc2FnZT8KKwkgKi8KKwljcmFzaF9rZXhlYyhOVUxMKTsKKwogI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIE5vdGUgc21wX3NlbmRfc3RvcCBpcyB0aGUgdXN1YWwgc21wIHNodXRkb3duIGZ1bmN0aW9uLCB3aGljaAorCSAqIHVuZm9ydHVuYXRlbHkgbWVhbnMgaXQgbWF5IG5vdCBiZSBoYXJkZW5lZCB0byB3b3JrIGluIGEgcGFuaWMKKwkgKiBzaXR1YXRpb24uCisJICovCiAJc21wX3NlbmRfc3RvcCgpOwogI2VuZGlmCiAKQEAgLTc5LDggKzk5LDcgQEAKIAlpZiAoIXBhbmljX2JsaW5rKQogCQlwYW5pY19ibGluayA9IG5vX2JsaW5rOwogCi0JaWYgKHBhbmljX3RpbWVvdXQgPiAwKQotCXsKKwlpZiAocGFuaWNfdGltZW91dCA+IDApIHsKIAkJLyoKIAkgCSAqIERlbGF5IHRpbWVvdXQgc2Vjb25kcyBiZWZvcmUgcmVib290aW5nIHRoZSBtYWNoaW5lLiAKIAkJICogV2UgY2FuJ3QgdXNlIHRoZSAibm9ybWFsIiB0aW1lcnMgc2luY2Ugd2UganVzdCBwYW5pY2tlZC4uCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDY5NjM4N2YuLjJjNzEyMWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0yNyw4ICsyNyw4IEBACiAJbGlrZSBzdXNwZW5kIHN1cHBvcnQuCiAKIGNvbmZpZyBTT0ZUV0FSRV9TVVNQRU5ECi0JYm9vbCAiU29mdHdhcmUgU3VzcGVuZCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQTSAmJiBTV0FQCisJYm9vbCAiU29mdHdhcmUgU3VzcGVuZCIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBQTSAmJiBTV0FQICYmICgoWDg2ICYmIFNNUCkgfHwgKChGVlIgfHwgUFBDMzIgfHwgWDg2KSAmJiAhU01QKSkKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgdGhlIHBvc3NpYmlsaXR5IG9mIHN1c3BlbmRpbmcgdGhlIG1hY2hpbmUuCiAJICBJdCBkb2Vzbid0IG5lZWQgQVBNLgpAQCAtNzIsMyArNzIsNyBAQAogCSAgc3VzcGVuZGVkIGltYWdlIHRvLiBJdCB3aWxsIHNpbXBseSBwaWNrIHRoZSBmaXJzdCBhdmFpbGFibGUgc3dhcCAKIAkgIGRldmljZS4KIAorY29uZmlnIFNVU1BFTkRfU01QCisJYm9vbAorCWRlcGVuZHMgb24gSE9UUExVR19DUFUgJiYgWDg2ICYmIFBNCisJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUgYi9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKaW5kZXggZmJkYzYzNC4uMmY0MzhkMCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL01ha2VmaWxlCisrKyBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQpAQCAtMyw5ICszLDkgQEAKIEVYVFJBX0NGTEFHUwkrPQktRERFQlVHCiBlbmRpZgogCi1zd3N1c3Atc21wLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KLQogb2JqLXkJCQkJOj0gbWFpbi5vIHByb2Nlc3MubyBjb25zb2xlLm8gcG0ubwotb2JqLSQoQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQpCSs9IHN3c3VzcC5vICQoc3dzdXNwLXNtcC15KSBkaXNrLm8KK29iai0kKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKQkrPSBzd3N1c3AubyBkaXNrLm8KKworb2JqLSQoQ09ORklHX1NVU1BFTkRfU01QKQkrPSBzbXAubwogCiBvYmotJChDT05GSUdfTUFHSUNfU1lTUlEpCSs9IHBvd2Vyb2ZmLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IDAyYjY3NjQuLjNlYzc4OWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorCiAjaW5jbHVkZSAicG93ZXIuaCIKIAogCkBAIC0xMTcsOCArMTE5LDggQEAKIHsKIAlkZXZpY2VfcmVzdW1lKCk7CiAJcGxhdGZvcm1fZmluaXNoKCk7Ci0JZW5hYmxlX25vbmJvb3RfY3B1cygpOwogCXRoYXdfcHJvY2Vzc2VzKCk7CisJZW5hYmxlX25vbmJvb3RfY3B1cygpOwogCXBtX3Jlc3RvcmVfY29uc29sZSgpOwogfQogCkBAIC0xMzEsMjggKzEzMywzNSBAQAogCiAJc3lzX3N5bmMoKTsKIAorCWRpc2FibGVfbm9uYm9vdF9jcHVzKCk7CisKIAlpZiAoZnJlZXplX3Byb2Nlc3NlcygpKSB7CiAJCWVycm9yID0gLUVCVVNZOwotCQlyZXR1cm4gZXJyb3I7CisJCWdvdG8gdGhhdzsKIAl9CiAKIAlpZiAocG1fZGlza19tb2RlID09IFBNX0RJU0tfUExBVEZPUk0pIHsKIAkJaWYgKHBtX29wcyAmJiBwbV9vcHMtPnByZXBhcmUpIHsKIAkJCWlmICgoZXJyb3IgPSBwbV9vcHMtPnByZXBhcmUoUE1fU1VTUEVORF9ESVNLKSkpCi0JCQkJcmV0dXJuIGVycm9yOworCQkJCWdvdG8gdGhhdzsKIAkJfQogCX0KIAogCS8qIEZyZWUgbWVtb3J5IGJlZm9yZSBzaHV0dGluZyBkb3duIGRldmljZXMuICovCiAJZnJlZV9zb21lX21lbW9yeSgpOwotCiAJcmV0dXJuIDA7Cit0aGF3OgorCXRoYXdfcHJvY2Vzc2VzKCk7CisJZW5hYmxlX25vbmJvb3RfY3B1cygpOworCXBtX3Jlc3RvcmVfY29uc29sZSgpOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIHZvaWQgdW5wcmVwYXJlX3Byb2Nlc3Nlcyh2b2lkKQogewotCWVuYWJsZV9ub25ib290X2NwdXMoKTsKKwlwbGF0Zm9ybV9maW5pc2goKTsKIAl0aGF3X3Byb2Nlc3NlcygpOworCWVuYWJsZV9ub25ib290X2NwdXMoKTsKIAlwbV9yZXN0b3JlX2NvbnNvbGUoKTsKIH0KIApAQCAtMTYwLDE1ICsxNjksOSBAQAogewogCWludCBlcnJvcjsKIAotCWRpc2FibGVfbm9uYm9vdF9jcHVzKCk7Ci0JaWYgKChlcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfRlJFRVpFKSkpIHsKKwlpZiAoKGVycm9yID0gZGV2aWNlX3N1c3BlbmQoUE1TR19GUkVFWkUpKSkKIAkJcHJpbnRrKCJTb21lIGRldmljZXMgZmFpbGVkIHRvIHN1c3BlbmRcbiIpOwotCQlwbGF0Zm9ybV9maW5pc2goKTsKLQkJZW5hYmxlX25vbmJvb3RfY3B1cygpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKioKQEAgLTE4NSw5ICsxODgsOSBAQAogCWludCBlcnJvcjsKIAogCWVycm9yID0gcHJlcGFyZV9wcm9jZXNzZXMoKTsKLQlpZiAoIWVycm9yKSB7Ci0JCWVycm9yID0gcHJlcGFyZV9kZXZpY2VzKCk7Ci0JfQorCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gcHJlcGFyZV9kZXZpY2VzKCk7CiAKIAlpZiAoZXJyb3IpIHsKIAkJdW5wcmVwYXJlX3Byb2Nlc3NlcygpOwpAQCAtMjMzLDYgKzIzNiwxNiBAQAogewogCWludCBlcnJvcjsKIAorCWlmICghc3dzdXNwX3Jlc3VtZV9kZXZpY2UpIHsKKwkJaWYgKCFzdHJsZW4ocmVzdW1lX2ZpbGUpKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCXN3c3VzcF9yZXN1bWVfZGV2aWNlID0gbmFtZV90b19kZXZfdChyZXN1bWVfZmlsZSk7CisJCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlc1xuIiwgcmVzdW1lX2ZpbGUpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJzd3N1c3A6IFJlc3VtZSBGcm9tIFBhcnRpdGlvbiAlZDolZFxuIiwKKwkJCSBNQUpPUihzd3N1c3BfcmVzdW1lX2RldmljZSksIE1JTk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSk7CisJfQorCiAJaWYgKG5vcmVzdW1lKSB7CiAJCS8qKgogCQkgKiBGSVhNRTogSWYgbm9yZXN1bWUgaXMgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIHBhcnRpdGlvbgpAQCAtMjUwLDcgKzI2Myw3IEBACiAKIAlpZiAoKGVycm9yID0gcHJlcGFyZV9wcm9jZXNzZXMoKSkpIHsKIAkJc3dzdXNwX2Nsb3NlKCk7Ci0JCWdvdG8gQ2xlYW51cDsKKwkJZ290byBEb25lOwogCX0KIAogCXByX2RlYnVnKCJQTTogUmVhZGluZyBzd3N1c3AgaW1hZ2UuXG4iKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDRjZGViYzkuLjcxYWEwZmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtMTksNiArMTksOSBAQAogCiAjaW5jbHVkZSAicG93ZXIuaCIKIAorLypUaGlzIGlzIGp1c3QgYW4gYXJiaXRyYXJ5IG51bWJlciAqLworI2RlZmluZSBGUkVFX1BBR0VfTlVNQkVSICgxMDApCisKIERFQ0xBUkVfTVVURVgocG1fc2VtKTsKIAogc3RydWN0IHBtX29wcyAqIHBtX29wcyA9IE5VTEw7CkBAIC00OSwxNyArNTIsMzUgQEAKIHN0YXRpYyBpbnQgc3VzcGVuZF9wcmVwYXJlKHN1c3BlbmRfc3RhdGVfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyb3IgPSAwOworCXVuc2lnbmVkIGludCBmcmVlX3BhZ2VzOwogCiAJaWYgKCFwbV9vcHMgfHwgIXBtX29wcy0+ZW50ZXIpCiAJCXJldHVybiAtRVBFUk07CiAKIAlwbV9wcmVwYXJlX2NvbnNvbGUoKTsKIAorCWRpc2FibGVfbm9uYm9vdF9jcHVzKCk7CisKKwlpZiAobnVtX29ubGluZV9jcHVzKCkgIT0gMSkgeworCQllcnJvciA9IC1FUEVSTTsKKwkJZ290byBFbmFibGVfY3B1OworCX0KKwogCWlmIChmcmVlemVfcHJvY2Vzc2VzKCkpIHsKIAkJZXJyb3IgPSAtRUFHQUlOOwogCQlnb3RvIFRoYXc7CiAJfQogCisJaWYgKChmcmVlX3BhZ2VzID0gbnJfZnJlZV9wYWdlcygpKSA8IEZSRUVfUEFHRV9OVU1CRVIpIHsKKwkJcHJfZGVidWcoIlBNOiBmcmVlIHNvbWUgbWVtb3J5XG4iKTsKKwkJc2hyaW5rX2FsbF9tZW1vcnkoRlJFRV9QQUdFX05VTUJFUiAtIGZyZWVfcGFnZXMpOworCQlpZiAobnJfZnJlZV9wYWdlcygpIDwgRlJFRV9QQUdFX05VTUJFUikgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJcHJpbnRrKEtFUk5fRVJSICJQTTogTm8gZW5vdWdoIG1lbW9yeVxuIik7CisJCQlnb3RvIFRoYXc7CisJCX0KKwl9CisKIAlpZiAocG1fb3BzLT5wcmVwYXJlKSB7CiAJCWlmICgoZXJyb3IgPSBwbV9vcHMtPnByZXBhcmUoc3RhdGUpKSkKIAkJCWdvdG8gVGhhdzsKQEAgLTc1LDYgKzk2LDggQEAKIAkJcG1fb3BzLT5maW5pc2goc3RhdGUpOwogIFRoYXc6CiAJdGhhd19wcm9jZXNzZXMoKTsKKyBFbmFibGVfY3B1OgorCWVuYWJsZV9ub25ib290X2NwdXMoKTsKIAlwbV9yZXN0b3JlX2NvbnNvbGUoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMTMsNiArMTM2LDcgQEAKIAlpZiAocG1fb3BzICYmIHBtX29wcy0+ZmluaXNoKQogCQlwbV9vcHMtPmZpbmlzaChzdGF0ZSk7CiAJdGhhd19wcm9jZXNzZXMoKTsKKwllbmFibGVfbm9uYm9vdF9jcHVzKCk7CiAJcG1fcmVzdG9yZV9jb25zb2xlKCk7CiB9CiAKQEAgLTE1MCwxMiArMTc0LDYgQEAKIAkJZ290byBVbmxvY2s7CiAJfQogCi0JLyogU3VzcGVuZCBpcyBoYXJkIHRvIGdldCByaWdodCBvbiBTTVAuICovCi0JaWYgKG51bV9vbmxpbmVfY3B1cygpICE9IDEpIHsKLQkJZXJyb3IgPSAtRVBFUk07Ci0JCWdvdG8gVW5sb2NrOwotCX0KLQogCXByX2RlYnVnKCJQTTogUHJlcGFyaW5nIHN5c3RlbSBmb3IgJXMgc2xlZXBcbiIsIHBtX3N0YXRlc1tzdGF0ZV0pOwogCWlmICgoZXJyb3IgPSBzdXNwZW5kX3ByZXBhcmUoc3RhdGUpKSkKIAkJZ290byBVbmxvY2s7CkBAIC0xOTAsNyArMjA4LDcgQEAKIAogaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQogewotCWlmIChzdGF0ZSA+IFBNX1NVU1BFTkRfT04gJiYgc3RhdGUgPCBQTV9TVVNQRU5EX01BWCkKKwlpZiAoc3RhdGUgPiBQTV9TVVNQRU5EX09OICYmIHN0YXRlIDw9IFBNX1NVU1BFTkRfTUFYKQogCQlyZXR1cm4gZW50ZXJfc3RhdGUoc3RhdGUpOwogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYyBiL2tlcm5lbC9wb3dlci9wcm9jZXNzLmMKaW5kZXggNzhkOTJkYy4uM2JkMGQyNiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Byb2Nlc3MuYworKysgYi9rZXJuZWwvcG93ZXIvcHJvY2Vzcy5jCkBAIC0zMiw3ICszMiw3IEBACiB9CiAKIC8qIFJlZnJpZ2VyYXRvciBpcyBwbGFjZSB3aGVyZSBmcm96ZW4gcHJvY2Vzc2VzIGFyZSBzdG9yZWQgOi0pLiAqLwotdm9pZCByZWZyaWdlcmF0b3IodW5zaWduZWQgbG9uZyBmbGFnKQordm9pZCByZWZyaWdlcmF0b3Iodm9pZCkKIHsKIAkvKiBIbW0sIHNob3VsZCB3ZSBiZSBhbGxvd2VkIHRvIHN1c3BlbmQgd2hlbiB0aGVyZSBhcmUgcmVhbHRpbWUKIAkgICBwcm9jZXNzZXMgYXJvdW5kPyAqLwpAQCAtNDEsMTQgKzQxLDEzIEBACiAJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKIAlwcl9kZWJ1ZygiJXMgZW50ZXJlZCByZWZyaWdlcmF0b3JcbiIsIGN1cnJlbnQtPmNvbW0pOwogCXByaW50aygiPSIpOwotCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9GUkVFWkU7CiAKKwlmcm96ZW5fcHJvY2VzcyhjdXJyZW50KTsKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAlyZWNhbGNfc2lncGVuZGluZygpOyAvKiBXZSBzZW50IGZha2Ugc2lnbmFsLCBjbGVhbiBpdCB1cCAqLwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9GUk9aRU47Ci0Jd2hpbGUgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJPWkVOKQorCXdoaWxlIChmcm96ZW4oY3VycmVudCkpCiAJCXNjaGVkdWxlKCk7CiAJcHJfZGVidWcoIiVzIGxlZnQgcmVmcmlnZXJhdG9yXG4iLCBjdXJyZW50LT5jb21tKTsKIAljdXJyZW50LT5zdGF0ZSA9IHNhdmU7CkBAIC01NywyNyArNTYsMjMgQEAKIC8qIDAgPSBzdWNjZXNzLCBlbHNlICMgb2YgcHJvY2Vzc2VzIHRoYXQgd2UgZmFpbGVkIHRvIHN0b3AgKi8KIGludCBmcmVlemVfcHJvY2Vzc2VzKHZvaWQpCiB7Ci0gICAgICAgaW50IHRvZG87Ci0gICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOworCWludCB0b2RvOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOwotCQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlwcmludGsoICJTdG9wcGluZyB0YXNrczogIiApOwogCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCWRvIHsKIAkJdG9kbyA9IDA7CiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCQlpZiAoIWZyZWV6ZWFibGUocCkpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoKHAtPmZsYWdzICYgUEZfRlJPWkVOKSB8fAotCQkJICAgIChwLT5zdGF0ZSA9PSBUQVNLX1RSQUNFRCkgfHwKLQkJCSAgICAocC0+c3RhdGUgPT0gVEFTS19TVE9QUEVEKSkKKwkJCWlmIChmcm96ZW4ocCkpCiAJCQkJY29udGludWU7CiAKLQkJCS8qIEZJWE1FOiBzbXAgcHJvYmxlbSBoZXJlOiB3ZSBtYXkgbm90IGFjY2VzcyBvdGhlciBwcm9jZXNzJyBmbGFncwotCQkJICAgd2l0aG91dCBsb2NraW5nICovCi0JCQlwLT5mbGFncyB8PSBQRl9GUkVFWkU7CisJCQlmcmVlemUocCk7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCQkJc2lnbmFsX3dha2VfdXAocCwgMCk7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CkBAIC05MSw3ICs4Niw3IEBACiAJCQlyZXR1cm4gdG9kbzsKIAkJfQogCX0gd2hpbGUodG9kbyk7Ci0JCisKIAlwcmludGsoICJ8XG4iICk7CiAJQlVHX09OKGluX2F0b21pYygpKTsKIAlyZXR1cm4gMDsKQEAgLTEwNiwxMCArMTAxLDcgQEAKIAlkb19lYWNoX3RocmVhZChnLCBwKSB7CiAJCWlmICghZnJlZXplYWJsZShwKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAocC0+ZmxhZ3MgJiBQRl9GUk9aRU4pIHsKLQkJCXAtPmZsYWdzICY9IH5QRl9GUk9aRU47Ci0JCQl3YWtlX3VwX3Byb2Nlc3MocCk7Ci0JCX0gZWxzZQorCQlpZiAoIXRoYXdfcHJvY2VzcyhwKSkKIAkJCXByaW50ayhLRVJOX0lORk8gIiBTdHJhbmdlLCAlcyBub3Qgc3RvcHBlZFxuIiwgcC0+Y29tbSApOwogCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgcCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbXAuYyBiL2tlcm5lbC9wb3dlci9zbXAuYwppbmRleCA0NTdjMjMwLi5iYmUyMzA3IDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc21wLmMKKysrIGIva2VybmVsL3Bvd2VyL3NtcC5jCkBAIC0xMyw3MyArMTMsNTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCi1zdGF0aWMgYXRvbWljX3QgY3B1X2NvdW50ZXIsIGZyZWV6ZTsKLQotCi1zdGF0aWMgdm9pZCBzbXBfcGF1c2Uodm9pZCAqIGRhdGEpCi17Ci0Jc3RydWN0IHNhdmVkX2NvbnRleHQgY3R4dDsKLQlfX3NhdmVfcHJvY2Vzc29yX3N0YXRlKCZjdHh0KTsKLQlwcmludGsoIlNsZWVwaW5nIGluOlxuIik7Ci0JZHVtcF9zdGFjaygpOwotCWF0b21pY19pbmMoJmNwdV9jb3VudGVyKTsKLQl3aGlsZSAoYXRvbWljX3JlYWQoJmZyZWV6ZSkpIHsKLQkJLyogRklYTUU6IHJlc3RvcmUgdGFrZXMgcGxhY2UgYXQgcmFuZG9tIHBpZWNlIGluc2lkZSB0aGlzLgotCQkgICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSB3cml0dGVuIGluIGFzc2VtYmx5LCBhbmQKLQkJICAgcHJlc2VydmUgZ2VuZXJhbC1wdXJwb3NlIHJlZ2lzdGVycywgdG9vCi0KLQkJICAgV2hhdCBhYm91dCBzdGFjaz8gV2UgbWF5IG5lZWQgdG8gbW92ZSB0byBuZXcgc3RhY2sgaGVyZS4KLQotCQkgICBUaGlzIHNob3VsZCBiZXR0ZXIgYmUgcmFuIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KLQkJICovCi0JCWNwdV9yZWxheCgpOwotCQliYXJyaWVyKCk7Ci0JfQotCWF0b21pY19kZWMoJmNwdV9jb3VudGVyKTsKLQlfX3Jlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKCZjdHh0KTsKLX0KLQotc3RhdGljIGNwdW1hc2tfdCBvbGRtYXNrOworLyogVGhpcyBpcyBwcm90ZWN0ZWQgYnkgcG1fc2VtIHNlbWFwaG9yZSAqLworc3RhdGljIGNwdW1hc2tfdCBmcm96ZW5fY3B1czsKIAogdm9pZCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKQogewotCW9sZG1hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0Jc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBjcHVtYXNrX29mX2NwdSgwKSk7Ci0JcHJpbnRrKCJGcmVlemluZyBDUFVzIChhdCAlZCkiLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKLQlwcmludGsoIi4uLiIpOwotCUJVR19PTihyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApOworCWludCBjcHUsIGVycm9yOwogCi0JLyogRklYTUU6IGZvciB0aGlzIHRvIHdvcmssIGFsbCB0aGUgQ1BVcyBtdXN0IGJlIHJ1bm5pbmcKLQkgKiAiaWRsZSIgdGhyZWFkIChvciB3ZSBkZWFkbG9jaykuIElzIHRoYXQgZ3VhcmFudGVlZD8gKi8KLQotCWF0b21pY19zZXQoJmNwdV9jb3VudGVyLCAwKTsKLQlhdG9taWNfc2V0KCZmcmVlemUsIDEpOwotCXNtcF9jYWxsX2Z1bmN0aW9uKHNtcF9wYXVzZSwgTlVMTCwgMCwgMCk7Ci0Jd2hpbGUgKGF0b21pY19yZWFkKCZjcHVfY291bnRlcikgPCAobnVtX29ubGluZV9jcHVzKCkgLSAxKSkgewotCQljcHVfcmVsYXgoKTsKLQkJYmFycmllcigpOworCWVycm9yID0gMDsKKwljcHVzX2NsZWFyKGZyb3plbl9jcHVzKTsKKwlwcmludGsoIkZyZWV6aW5nIGNwdXMgLi4uXG4iKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY3B1ID09IDApCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSBjcHVfZG93bihjcHUpOworCQlpZiAoIWVycm9yKSB7CisJCQljcHVfc2V0KGNwdSwgZnJvemVuX2NwdXMpOworCQkJcHJpbnRrKCJDUFUlZCBpcyBkb3duXG4iLCBjcHUpOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRrKCJFcnJvciB0YWtpbmcgY3B1ICVkIGRvd246ICVkXG4iLCBjcHUsIGVycm9yKTsKIAl9Ci0JcHJpbnRrKCJva1xuIik7CisJQlVHX09OKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKTsKKwlpZiAoZXJyb3IpCisJCXBhbmljKCJjcHVzIG5vdCBzbGVlcGluZyIpOwogfQogCiB2b2lkIGVuYWJsZV9ub25ib290X2NwdXModm9pZCkKIHsKLQlwcmludGsoIlJlc3RhcnRpbmcgQ1BVcyIpOwotCWF0b21pY19zZXQoJmZyZWV6ZSwgMCk7Ci0Jd2hpbGUgKGF0b21pY19yZWFkKCZjcHVfY291bnRlcikpIHsKLQkJY3B1X3JlbGF4KCk7Ci0JCWJhcnJpZXIoKTsKKwlpbnQgY3B1LCBlcnJvcjsKKworCXByaW50aygiVGhhd2luZyBjcHVzIC4uLlxuIik7CisJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBmcm96ZW5fY3B1cykgeworCQllcnJvciA9IHNtcF9wcmVwYXJlX2NwdShjcHUpOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBjcHVfdXAoY3B1KTsKKwkJaWYgKCFlcnJvcikgeworCQkJcHJpbnRrKCJDUFUlZCBpcyB1cFxuIiwgY3B1KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50aygiRXJyb3IgdGFraW5nIGNwdSAlZCB1cDogJWRcbiIsIGNwdSwgZXJyb3IpOworCQlwYW5pYygiTm90IGVub3VnaCBjcHVzIik7CiAJfQotCXByaW50aygiLi4uIik7Ci0Jc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKLQlzY2hlZHVsZSgpOwotCXByaW50aygib2tcbiIpOwotCisJY3B1c19jbGVhcihmcm96ZW5fY3B1cyk7CiB9CiAKLQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jIGIva2VybmVsL3Bvd2VyL3N3c3VzcC5jCmluZGV4IDkwYjNiNjguLmYyYmM3MWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zd3N1c3AuYworKysgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKQEAgLTEwLDEyICsxMCwxMiBAQAogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqCiAgKiBJJ2QgbGlrZSB0byB0aGFuayB0aGUgZm9sbG93aW5nIHBlb3BsZSBmb3IgdGhlaXIgd29yazoKLSAqIAorICoKICAqIFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PjoKICAqIE1vZGlmaWNhdGlvbnMsIGRlZmVjdGl2ZW5lc3MgcG9pbnRpbmcsIGJlaW5nIHdpdGggbWUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nLAogICogc3VzcGVuZCB0byBzd2FwIHNwYWNlLCBzdG9wIGFsbCB0YXNrcy4gUG9ydCB0byAyLjQuMTgtYWMgYW5kIDIuNS4xNy4KICAqCi0gKiBTdGV2ZSBEb2RkaSA8ZGlya0Bsb3RoLmRlbW9uLmNvLnVrPjogCisgKiBTdGV2ZSBEb2RkaSA8ZGlya0Bsb3RoLmRlbW9uLmNvLnVrPjoKICAqIFN1cHBvcnQgdGhlIHBvc3NpYmlsaXR5IG9mIGhhcmR3YXJlIHN0YXRlIHJlc3RvcmluZy4KICAqCiAgKiBSYXBoIDxncmV5LmhhdmVuc0BlYXJ0aGxpbmcubmV0PjoKQEAgLTYzLDYgKzYzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgpAQCAtODEsMTQgKzgyLDE0IEBACiBleHRlcm4gY2hhciByZXN1bWVfZmlsZVtdOwogCiAvKiBMb2NhbCB2YXJpYWJsZXMgdGhhdCBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IHNhdmUgKi8KLXVuc2lnbmVkIGludCBucl9jb3B5X3BhZ2VzIF9fbm9zYXZlZGF0YSA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IG5yX2NvcHlfcGFnZXMgX19ub3NhdmVkYXRhID0gMDsKIAogLyogU3VzcGVuZCBwYWdlZGlyIGlzIGFsbG9jYXRlZCBiZWZvcmUgZmluYWwgY29weSwgdGhlcmVmb3JlIGl0Ci0gICBtdXN0IGJlIGZyZWVkIGFmdGVyIHJlc3VtZSAKKyAgIG11c3QgYmUgZnJlZWQgYWZ0ZXIgcmVzdW1lCiAKICAgIFdhcm5pbmc6IHRoaXMgaXMgZXZpbC4gVGhlcmUgYXJlIGFjdHVhbGx5IHR3byBwYWdlZGlycyBhdCB0aW1lIG9mCiAgICByZXN1bWUuIE9uZSBpcyAicGFnZWRpcl9zYXZlIiwgd2hpY2ggaXMgZW1wdHkgZnJhbWUgYWxsb2NhdGVkIGF0Ci0gICB0aW1lIG9mIHN1c3BlbmQsIHRoYXQgbXVzdCBiZSBmcmVlZC4gU2Vjb25kIGlzICJwYWdlZGlyX25vc2F2ZSIsIAorICAgdGltZSBvZiBzdXNwZW5kLCB0aGF0IG11c3QgYmUgZnJlZWQuIFNlY29uZCBpcyAicGFnZWRpcl9ub3NhdmUiLAogICAgYWxsb2NhdGVkIGF0IHRpbWUgb2YgcmVzdW1lLCB0aGF0IHRyYXZlbHMgdGhyb3VnaCBtZW1vcnkgbm90IHRvCiAgICBjb2xsaWRlIHdpdGggYW55dGhpbmcuCiAKQEAgLTEzMiw3ICsxMzMsNyBAQAogewogCWludCBlcnJvcjsKIAotCXJ3X3N3YXBfcGFnZV9zeW5jKFJFQUQsIAorCXJ3X3N3YXBfcGFnZV9zeW5jKFJFQUQsCiAJCQkgIHN3cF9lbnRyeShyb290X3N3YXAsIDApLAogCQkJICB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpJnN3c3VzcF9oZWFkZXIpKTsKIAlpZiAoIW1lbWNtcCgiU1dBUC1TUEFDRSIsc3dzdXNwX2hlYWRlci5zaWcsIDEwKSB8fApAQCAtMTQwLDcgKzE0MSw3IEBACiAJCW1lbWNweShzd3N1c3BfaGVhZGVyLm9yaWdfc2lnLHN3c3VzcF9oZWFkZXIuc2lnLCAxMCk7CiAJCW1lbWNweShzd3N1c3BfaGVhZGVyLnNpZyxTV1NVU1BfU0lHLCAxMCk7CiAJCXN3c3VzcF9oZWFkZXIuc3dzdXNwX2luZm8gPSBwcmV2OwotCQllcnJvciA9IHJ3X3N3YXBfcGFnZV9zeW5jKFdSSVRFLCAKKwkJZXJyb3IgPSByd19zd2FwX3BhZ2Vfc3luYyhXUklURSwKIAkJCQkJICBzd3BfZW50cnkocm9vdF9zd2FwLCAwKSwKIAkJCQkJICB2aXJ0X3RvX3BhZ2UoKHVuc2lnbmVkIGxvbmcpCiAJCQkJCQkgICAgICAgJnN3c3VzcF9oZWFkZXIpKTsKQEAgLTE3NCwyMiArMTc1LDIyIEBACiBzdGF0aWMgaW50IHN3c3VzcF9zd2FwX2NoZWNrKHZvaWQpIC8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBzYXZpbmcgaW1hZ2UgKi8KIHsKIAlpbnQgaSwgbGVuOwotCQorCiAJbGVuPXN0cmxlbihyZXN1bWVfZmlsZSk7CiAJcm9vdF9zd2FwID0gMHhGRkZGOwotCQorCiAJc3dhcF9saXN0X2xvY2soKTsKLQlmb3IoaT0wOyBpPE1BWF9TV0FQRklMRVM7IGkrKykgeworCWZvciAoaT0wOyBpPE1BWF9TV0FQRklMRVM7IGkrKykgewogCQlpZiAoc3dhcF9pbmZvW2ldLmZsYWdzID09IDApIHsKIAkJCXN3YXBmaWxlX3VzZWRbaV09U1dBUEZJTEVfVU5VU0VEOwogCQl9IGVsc2UgewotCQkJaWYoIWxlbikgeworCQkJaWYgKCFsZW4pIHsKIAkgICAgCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVzdW1lPSBvcHRpb24gc2hvdWxkIGJlIHVzZWQgdG8gc2V0IHN1c3BlbmQgZGV2aWNlIiApOwotCQkJCWlmKHJvb3Rfc3dhcCA9PSAweEZGRkYpIHsKKwkJCQlpZiAocm9vdF9zd2FwID09IDB4RkZGRikgewogCQkJCQlzd2FwZmlsZV91c2VkW2ldID0gU1dBUEZJTEVfU1VTUEVORDsKIAkJCQkJcm9vdF9zd2FwID0gaTsKIAkJCQl9IGVsc2UKLQkJCQkJc3dhcGZpbGVfdXNlZFtpXSA9IFNXQVBGSUxFX0lHTk9SRUQ7CQkJCSAgCisJCQkJCXN3YXBmaWxlX3VzZWRbaV0gPSBTV0FQRklMRV9JR05PUkVEOwogCQkJfSBlbHNlIHsKIAkgIAkJCS8qIHdlIGlnbm9yZSBhbGwgc3dhcCBkZXZpY2VzIHRoYXQgYXJlIG5vdCB0aGUgcmVzdW1lX2ZpbGUgKi8KIAkJCQlpZiAoaXNfcmVzdW1lX2RldmljZSgmc3dhcF9pbmZvW2ldKSkgewpAQCAtMjA5LDE1ICsyMTAsMTUgQEAKICAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNhdmluZyBpbWFnZSBzbyBtb2RpZmljYXRpb24KICAqIHdpbGwgYmUgbG9zdCBhZnRlciByZXN1bWUuLi4gYW5kIHRoYXQncyB3aGF0IHdlIHdhbnQuCiAgKiB3ZSBtYWtlIHRoZSBkZXZpY2UgdW51c2FibGUuIEEgbmV3IGNhbGwgdG8KLSAqIGxvY2tfc3dhcGRldmljZXMgY2FuIHVubG9jayB0aGUgZGV2aWNlcy4gCisgKiBsb2NrX3N3YXBkZXZpY2VzIGNhbiB1bmxvY2sgdGhlIGRldmljZXMuCiAgKi8KIHN0YXRpYyB2b2lkIGxvY2tfc3dhcGRldmljZXModm9pZCkKIHsKIAlpbnQgaTsKIAogCXN3YXBfbGlzdF9sb2NrKCk7Ci0JZm9yKGkgPSAwOyBpPCBNQVhfU1dBUEZJTEVTOyBpKyspCi0JCWlmKHN3YXBmaWxlX3VzZWRbaV0gPT0gU1dBUEZJTEVfSUdOT1JFRCkgeworCWZvciAoaSA9IDA7IGk8IE1BWF9TV0FQRklMRVM7IGkrKykKKwkJaWYgKHN3YXBmaWxlX3VzZWRbaV0gPT0gU1dBUEZJTEVfSUdOT1JFRCkgewogCQkJc3dhcF9pbmZvW2ldLmZsYWdzIF49IDB4RkY7CiAJCX0KIAlzd2FwX2xpc3RfdW5sb2NrKCk7CkBAIC0yMjksNyArMjMwLDcgQEAKICAqCUBsb2M6CVBsYWNlIHRvIHN0b3JlIHRoZSBlbnRyeSB3ZSB1c2VkLgogICoKICAqCUFsbG9jYXRlIGEgbmV3IHN3YXAgZW50cnkgYW5kICdzeW5jJyBpdC4gTm90ZSB3ZSBkaXNjYXJkIC1FSU8KLSAqCWVycm9ycy4gVGhhdCBpcyBhbiBhcnRpZmFjdCBsZWZ0IG92ZXIgZnJvbSBzd3N1c3AuIEl0IGRpZCBub3QgCisgKgllcnJvcnMuIFRoYXQgaXMgYW4gYXJ0aWZhY3QgbGVmdCBvdmVyIGZyb20gc3dzdXNwLiBJdCBkaWQgbm90CiAgKgljaGVjayB0aGUgcmV0dXJuIG9mIHJ3X3N3YXBfcGFnZV9zeW5jKCkgYXQgYWxsLCBzaW5jZSBtb3N0IHBhZ2VzCiAgKgl3cml0dGVuIGJhY2sgdG8gc3dhcCB3b3VsZCByZXR1cm4gLUVJTy4KICAqCVRoaXMgaXMgYSBwYXJ0aWFsIGltcHJvdmVtZW50LCBzaW5jZSB3ZSB3aWxsIGF0IGxlYXN0IHJldHVybiBvdGhlcgpAQCAtMjQxLDcgKzI0Miw3IEBACiAJaW50IGVycm9yID0gMDsKIAogCWVudHJ5ID0gZ2V0X3N3YXBfcGFnZSgpOwotCWlmIChzd3Bfb2Zmc2V0KGVudHJ5KSAmJiAKKwlpZiAoc3dwX29mZnNldChlbnRyeSkgJiYKIAkgICAgc3dhcGZpbGVfdXNlZFtzd3BfdHlwZShlbnRyeSldID09IFNXQVBGSUxFX1NVU1BFTkQpIHsKIAkJZXJyb3IgPSByd19zd2FwX3BhZ2Vfc3luYyhXUklURSwgZW50cnksCiAJCQkJCSAgdmlydF90b19wYWdlKGFkZHIpKTsKQEAgLTI1Nyw3ICsyNTgsNyBAQAogLyoqCiAgKglkYXRhX2ZyZWUgLSBGcmVlIHRoZSBzd2FwIGVudHJpZXMgdXNlZCBieSB0aGUgc2F2ZWQgaW1hZ2UuCiAgKgotICoJV2FsayB0aGUgbGlzdCBvZiB1c2VkIHN3YXAgZW50cmllcyBhbmQgZnJlZSBlYWNoIG9uZS4gCisgKglXYWxrIHRoZSBsaXN0IG9mIHVzZWQgc3dhcCBlbnRyaWVzIGFuZCBmcmVlIGVhY2ggb25lLgogICoJVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGNsZWFudXAgd2hlbiBzdXNwZW5kIGZhaWxzLgogICovCiBzdGF0aWMgdm9pZCBkYXRhX2ZyZWUodm9pZCkKQEAgLTI5MCw3ICsyOTEsNyBAQAogCQltb2QgPSAxOwogCiAJcHJpbnRrKCAiV3JpdGluZyBkYXRhIHRvIHN3YXAgKCVkIHBhZ2VzKS4uLiAgICAgIiwgbnJfY29weV9wYWdlcyApOwotCWZvcl9lYWNoX3BiZShwLCBwYWdlZGlyX25vc2F2ZSkgeworCWZvcl9lYWNoX3BiZSAocCwgcGFnZWRpcl9ub3NhdmUpIHsKIAkJaWYgKCEoaSVtb2QpKQogCQkJcHJpbnRrKCAiXGJcYlxiXGIlM2QlJSIsIGkgLyBtb2QgKTsKIAkJaWYgKChlcnJvciA9IHdyaXRlX3BhZ2UocC0+YWRkcmVzcywgJihwLT5zd2FwX2FkZHJlc3MpKSkpCkBAIC0zMzUsNyArMzM2LDcgQEAKIAogCWR1bXBfaW5mbygpOwogCWVycm9yID0gd3JpdGVfcGFnZSgodW5zaWduZWQgbG9uZykmc3dzdXNwX2luZm8sICZlbnRyeSk7Ci0JaWYgKCFlcnJvcikgeyAKKwlpZiAoIWVycm9yKSB7CiAJCXByaW50ayggIlMiICk7CiAJCWVycm9yID0gbWFya19zd2FwZmlsZXMoZW50cnkpOwogCQlwcmludGsoICJ8XG4iICk7CkBAIC0zNzAsNyArMzcxLDcgQEAKIAlzdHJ1Y3QgcGJlICogcGJlOwogCiAJcHJpbnRrKCAiV3JpdGluZyBwYWdlZGlyLi4uIik7Ci0JZm9yX2VhY2hfcGJfcGFnZShwYmUsIHBhZ2VkaXJfbm9zYXZlKSB7CisJZm9yX2VhY2hfcGJfcGFnZSAocGJlLCBwYWdlZGlyX25vc2F2ZSkgewogCQlpZiAoKGVycm9yID0gd3JpdGVfcGFnZSgodW5zaWduZWQgbG9uZylwYmUsICZzd3N1c3BfaW5mby5wYWdlZGlyW24rK10pKSkKIAkJCXJldHVybiBlcnJvcjsKIAl9CkBAIC00NzIsNyArNDczLDcgQEAKIAlpbnQgcmVzID0gMDsKIAogCXByX2RlYnVnKCJzd3N1c3A6IFNhdmluZyBIaWdobWVtXG4iKTsKLQlmb3JfZWFjaF96b25lKHpvbmUpIHsKKwlmb3JfZWFjaF96b25lICh6b25lKSB7CiAJCWlmIChpc19oaWdobWVtKHpvbmUpKQogCQkJcmVzID0gc2F2ZV9oaWdobWVtX3pvbmUoem9uZSk7CiAJCWlmIChyZXMpCkBAIC01NDcsNyArNTQ4LDcgQEAKIAogCW5yX2NvcHlfcGFnZXMgPSAwOwogCi0JZm9yX2VhY2hfem9uZSh6b25lKSB7CisJZm9yX2VhY2hfem9uZSAoem9uZSkgewogCQlpZiAoaXNfaGlnaG1lbSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCQltYXJrX2ZyZWVfcGFnZXMoem9uZSk7CkBAIC01NjIsOSArNTYzLDkgQEAKIAlzdHJ1Y3Qgem9uZSAqem9uZTsKIAl1bnNpZ25lZCBsb25nIHpvbmVfcGZuOwogCXN0cnVjdCBwYmUgKiBwYmUgPSBwYWdlZGlyX25vc2F2ZTsKLQkKKwogCXByX2RlYnVnKCJjb3B5X2RhdGFfcGFnZXMoKTogcGFnZXMgdG8gY29weTogJWRcbiIsIG5yX2NvcHlfcGFnZXMpOwotCWZvcl9lYWNoX3pvbmUoem9uZSkgeworCWZvcl9lYWNoX3pvbmUgKHpvbmUpIHsKIAkJaWYgKGlzX2hpZ2htZW0oem9uZSkpCiAJCQljb250aW51ZTsKIAkJbWFya19mcmVlX3BhZ2VzKHpvbmUpOwpAQCAtNzAyLDcgKzcwMyw3IEBACiB7CiAJc3RydWN0IHBiZSAqIHA7CiAKLQlmb3JfZWFjaF9wYmUocCwgcGFnZWRpcl9zYXZlKSB7CisJZm9yX2VhY2hfcGJlIChwLCBwYWdlZGlyX3NhdmUpIHsKIAkJaWYgKHAtPmFkZHJlc3MpIHsKIAkJCUNsZWFyUGFnZU5vc2F2ZSh2aXJ0X3RvX3BhZ2UocC0+YWRkcmVzcykpOwogCQkJZnJlZV9wYWdlKHAtPmFkZHJlc3MpOwpAQCAtNzE5LDcgKzcyMCw3IEBACiB7CiAJc3RydWN0IHBiZSAqIHA7CiAKLQlmb3JfZWFjaF9wYmUocCwgcGFnZWRpcl9zYXZlKSB7CisJZm9yX2VhY2hfcGJlIChwLCBwYWdlZGlyX3NhdmUpIHsKIAkJcC0+YWRkcmVzcyA9IGdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDIHwgX19HRlBfQ09MRCk7CiAJCWlmICghcC0+YWRkcmVzcykKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtNzQwLDcgKzc0MSw3IEBACiAvKioKICAqCWVub3VnaF9mcmVlX21lbSAtIE1ha2Ugc3VyZSB3ZSBlbm91Z2ggZnJlZSBtZW1vcnkgdG8gc25hcHNob3QuCiAgKgotICoJUmV0dXJucyBUUlVFIG9yIEZBTFNFIGFmdGVyIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIAorICoJUmV0dXJucyBUUlVFIG9yIEZBTFNFIGFmdGVyIGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCiAgKglmcmVlIHBhZ2VzLgogICovCiAKQEAgLTc1OCwxMSArNzU5LDExIEBACiAvKioKICAqCWVub3VnaF9zd2FwIC0gTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHN3YXAgdG8gc2F2ZSB0aGUgaW1hZ2UuCiAgKgotICoJUmV0dXJucyBUUlVFIG9yIEZBTFNFIGFmdGVyIGNoZWNraW5nIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3dhcCAKKyAqCVJldHVybnMgVFJVRSBvciBGQUxTRSBhZnRlciBjaGVja2luZyB0aGUgdG90YWwgYW1vdW50IG9mIHN3YXAKICAqCXNwYWNlIGF2YWlhYmxlLgogICoKICAqCUZJWE1FOiBzaV9zd2FwaW5mbygmaSkgcmV0dXJucyBhbGwgc3dhcCBkZXZpY2VzIGluZm9ybWF0aW9uLgotICoJV2Ugc2hvdWxkIG9ubHkgY29uc2lkZXIgcmVzdW1lX2RldmljZS4gCisgKglXZSBzaG91bGQgb25seSBjb25zaWRlciByZXN1bWVfZGV2aWNlLgogICovCiAKIHN0YXRpYyBpbnQgZW5vdWdoX3N3YXAodm9pZCkKQEAgLTc4MSwxOCArNzgyLDE4IEBACiB7CiAJaW50IGVycm9yOwogCisJcGFnZWRpcl9ub3NhdmUgPSBOVUxMOworCW5yX2NvcHlfcGFnZXMgPSBjYWxjX25yKG5yX2NvcHlfcGFnZXMpOworCiAJcHJfZGVidWcoInN1c3BlbmQ6IChwYWdlcyBuZWVkZWQ6ICVkICsgJWQgZnJlZTogJWQpXG4iLAogCQkgbnJfY29weV9wYWdlcywgUEFHRVNfRk9SX0lPLCBucl9mcmVlX3BhZ2VzKCkpOwogCi0JcGFnZWRpcl9ub3NhdmUgPSBOVUxMOwogCWlmICghZW5vdWdoX2ZyZWVfbWVtKCkpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKCFlbm91Z2hfc3dhcCgpKQogCQlyZXR1cm4gLUVOT1NQQzsKIAotCW5yX2NvcHlfcGFnZXMgPSBjYWxjX25yKG5yX2NvcHlfcGFnZXMpOwotCiAJaWYgKCEocGFnZWRpcl9zYXZlID0gYWxsb2NfcGFnZWRpcihucl9jb3B5X3BhZ2VzKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzdXNwZW5kOiBBbGxvY2F0aW5nIHBhZ2VkaXIgZmFpbGVkLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtODI3LDggKzgyOCw4IEBACiAJZXJyb3IgPSBzd3N1c3BfYWxsb2MoKTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKLQkKLQkvKiBEdXJpbmcgYWxsb2NhdGluZyBvZiBzdXNwZW5kIHBhZ2VkaXIsIG5ldyBjb2xkIHBhZ2VzIG1heSBhcHBlYXIuIAorCisJLyogRHVyaW5nIGFsbG9jYXRpbmcgb2Ygc3VzcGVuZCBwYWdlZGlyLCBuZXcgY29sZCBwYWdlcyBtYXkgYXBwZWFyLgogCSAqIEtpbGwgdGhlbS4KIAkgKi8KIAlkcmFpbl9sb2NhbF9wYWdlcygpOwpAQCAtODY5LDEzICs4NzAsNiBAQAogCiBhc21saW5rYWdlIGludCBzd3N1c3Bfc2F2ZSh2b2lkKQogewotCWludCBlcnJvciA9IDA7Ci0KLQlpZiAoKGVycm9yID0gc3dzdXNwX3N3YXBfY2hlY2soKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IEZBVEFMOiBjYW5ub3QgZmluZCBzd2FwIGRldmljZSwgdHJ5ICIKLQkJCQkic3dhcG9uIC1hIVxuIik7Ci0JCXJldHVybiBlcnJvcjsKLQl9CiAJcmV0dXJuIHN1c3BlbmRfcHJlcGFyZV9pbWFnZSgpOwogfQogCkBAIC04OTIsMTQgKzg4NiwyMCBAQAogCSAqIGF0IHJlc3VtZSB0aW1lLCBhbmQgZXZpbCB3ZWlyZG5lc3MgZW5zdWVzLgogCSAqLwogCWlmICgoZXJyb3IgPSBkZXZpY2VfcG93ZXJfZG93bihQTVNHX0ZSRUVaRSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU29tZSBkZXZpY2VzIGZhaWxlZCB0byBwb3dlciBkb3duLCBhYm9ydGluZyBzdXNwZW5kXG4iKTsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlzd3N1c3BfZnJlZSgpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQorCisJaWYgKChlcnJvciA9IHN3c3VzcF9zd2FwX2NoZWNrKCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3dzdXNwOiBGQVRBTDogY2Fubm90IGZpbmQgc3dhcCBkZXZpY2UsIHRyeSAiCisJCQkJInN3YXBvbiAtYSFcbiIpOworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKIAlzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCWlmICgoZXJyb3IgPSBzd3N1c3BfYXJjaF9zdXNwZW5kKCkpKQotCQlzd3N1c3BfZnJlZSgpOworCQlwcmludGsoIkVycm9yICVkIHN1c3BlbmRpbmdcbiIsIGVycm9yKTsKIAkvKiBSZXN0b3JlIGNvbnRyb2wgZmxvdyBtYWdpY2FsbHkgYXBwZWFycyBoZXJlICovCiAJcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoKTsKIAlCVUdfT04gKG5yX2NvcHlfcGFnZXNfY2hlY2sgIT0gbnJfY29weV9wYWdlcyk7CkBAIC05MjksMjEgKzkyOSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKiBNb3JlIHJlc3RvcmUgc3R1ZmYgKi8KLQotLyoKLSAqIFJldHVybnMgdHJ1ZSBpZiBnaXZlbiBhZGRyZXNzL29yZGVyIGNvbGxpZGVzIHdpdGggYW55IG9yaWdfYWRkcmVzcyAKLSAqLwotc3RhdGljIGludCBkb2VzX2NvbGxpZGVfb3JkZXIodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgb3JkZXIpCi17Ci0JaW50IGk7Ci0JCi0JZm9yIChpPTA7IGkgPCAoMTw8b3JkZXIpOyBpKyspCi0JCWlmICghUGFnZU5vc2F2ZUZyZWUodmlydF90b19wYWdlKGFkZHIgKyBpICogUEFHRV9TSVpFKSkpCi0JCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKLX0KLQogLyoqCiAgKglPbiByZXN1bWUsIGZvciBzdG9yaW5nIHRoZSBQQkUgbGlzdCBhbmQgdGhlIGltYWdlLAogICoJd2UgY2FuIG9ubHkgdXNlIG1lbW9yeSBwYWdlcyB0aGF0IGRvIG5vdCBjb25mbGljdCB3aXRoIHRoZSBwYWdlcwpAQCAtOTczLDcgKzk1OCw3IEBACiAJdW5zaWduZWQgbG9uZyBtOwogCiAJbSA9IGdldF96ZXJvZWRfcGFnZShnZnBfbWFzayk7Ci0Jd2hpbGUgKGRvZXNfY29sbGlkZV9vcmRlcihtLCAwKSkgeworCXdoaWxlICghUGFnZU5vc2F2ZUZyZWUodmlydF90b19wYWdlKG0pKSkgewogCQllYXRfcGFnZSgodm9pZCAqKW0pOwogCQltID0gZ2V0X3plcm9lZF9wYWdlKGdmcF9tYXNrKTsKIAkJaWYgKCFtKQpAQCAtMTA0NSw3ICsxMDMwLDcgQEAKIAogCS8qIFNldCBwYWdlIGZsYWdzICovCiAKLQlmb3JfZWFjaF96b25lKHpvbmUpIHsKKwlmb3JfZWFjaF96b25lICh6b25lKSB7CiAgICAgICAgIAlmb3IgKHpvbmVfcGZuID0gMDsgem9uZV9wZm4gPCB6b25lLT5zcGFubmVkX3BhZ2VzOyArK3pvbmVfcGZuKQogICAgICAgICAgICAgICAgIAlTZXRQYWdlTm9zYXZlRnJlZShwZm5fdG9fcGFnZSh6b25lX3BmbiArCiAJCQkJCXpvbmUtPnpvbmVfc3RhcnRfcGZuKSk7CkBAIC0xMDYxLDcgKzEwNDYsNyBAQAogCS8qIFJlbG9jYXRlIGNvbGxpZGluZyBwYWdlcyAqLwogCiAJZm9yX2VhY2hfcGJfcGFnZSAocGJwYWdlLCBwYmxpc3QpIHsKLQkJaWYgKGRvZXNfY29sbGlkZV9vcmRlcigodW5zaWduZWQgbG9uZylwYnBhZ2UsIDApKSB7CisJCWlmICghUGFnZU5vc2F2ZUZyZWUodmlydF90b19wYWdlKCh1bnNpZ25lZCBsb25nKXBicGFnZSkpKSB7CiAJCQltID0gKHZvaWQgKilnZXRfdXNhYmxlX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQpOwogCQkJaWYgKCFtKSB7CiAJCQkJZXJyb3IgPSAtRU5PTUVNOwpAQCAtMTE4MSw5ICsxMTY2LDkgQEAKIHN0YXRpYyBjb25zdCBjaGFyICogc2FuaXR5X2NoZWNrKHZvaWQpCiB7CiAJZHVtcF9pbmZvKCk7Ci0JaWYoc3dzdXNwX2luZm8udmVyc2lvbl9jb2RlICE9IExJTlVYX1ZFUlNJT05fQ09ERSkKKwlpZiAoc3dzdXNwX2luZm8udmVyc2lvbl9jb2RlICE9IExJTlVYX1ZFUlNJT05fQ09ERSkKIAkJcmV0dXJuICJrZXJuZWwgdmVyc2lvbiI7Ci0JaWYoc3dzdXNwX2luZm8ubnVtX3BoeXNwYWdlcyAhPSBudW1fcGh5c3BhZ2VzKQorCWlmIChzd3N1c3BfaW5mby5udW1fcGh5c3BhZ2VzICE9IG51bV9waHlzcGFnZXMpCiAJCXJldHVybiAibWVtb3J5IHNpemUiOwogCWlmIChzdHJjbXAoc3dzdXNwX2luZm8udXRzLnN5c25hbWUsc3lzdGVtX3V0c25hbWUuc3lzbmFtZSkpCiAJCXJldHVybiAic3lzdGVtIHR5cGUiOwpAQCAtMTE5Myw4ICsxMTc4LDEwIEBACiAJCXJldHVybiAidmVyc2lvbiI7CiAJaWYgKHN0cmNtcChzd3N1c3BfaW5mby51dHMubWFjaGluZSxzeXN0ZW1fdXRzbmFtZS5tYWNoaW5lKSkKIAkJcmV0dXJuICJtYWNoaW5lIjsKKyNpZiAwCiAJaWYoc3dzdXNwX2luZm8uY3B1cyAhPSBudW1fb25saW5lX2NwdXMoKSkKIAkJcmV0dXJuICJudW1iZXIgb2YgY3B1cyI7CisjZW5kaWYKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTI3NCw4ICsxMjYxLDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLWV4dGVybiBkZXZfdCBuYW1lX3RvX2Rldl90KGNvbnN0IGNoYXIgKmxpbmUpOwotCiAvKioKICAqCXJlYWRfcGFnZWRpciAtIFJlYWQgcGFnZSBiYWNrdXAgbGlzdCBwYWdlcyBmcm9tIHN3YXAKICAqLwpAQCAtMTM2OSwxNiArMTM1NCw2IEBACiB7CiAJaW50IGVycm9yOwogCi0JaWYgKCFzd3N1c3BfcmVzdW1lX2RldmljZSkgewotCQlpZiAoIXN0cmxlbihyZXN1bWVfZmlsZSkpCi0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJc3dzdXNwX3Jlc3VtZV9kZXZpY2UgPSBuYW1lX3RvX2Rldl90KHJlc3VtZV9maWxlKTsKLQkJcHJfZGVidWcoInN3c3VzcDogUmVzdW1lIEZyb20gUGFydGl0aW9uICVzXG4iLCByZXN1bWVfZmlsZSk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoInN3c3VzcDogUmVzdW1lIEZyb20gUGFydGl0aW9uICVkOiVkXG4iLAotCQkJIE1BSk9SKHN3c3VzcF9yZXN1bWVfZGV2aWNlKSwgTUlOT1Ioc3dzdXNwX3Jlc3VtZV9kZXZpY2UpKTsKLQl9Ci0KIAlyZXN1bWVfYmRldiA9IG9wZW5fYnlfZGV2bnVtKHN3c3VzcF9yZXN1bWVfZGV2aWNlLCBGTU9ERV9SRUFEKTsKIAlpZiAoIUlTX0VSUihyZXN1bWVfYmRldikpIHsKIAkJc2V0X2Jsb2Nrc2l6ZShyZXN1bWVfYmRldiwgUEFHRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCAzYTQ0MmJmLi41MDkyMzk3IDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC01ODgsOCArNTg4LDcgQEAKIAkJCWxvZ19sZXZlbF91bmtub3duID0gMTsKIAl9CiAKLQlpZiAoIWNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSAmJgotCSAgICBzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX1JVTk5JTkcpIHsKKwlpZiAoIWNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkgewogCQkvKgogCQkgKiBTb21lIGNvbnNvbGUgZHJpdmVycyBtYXkgYXNzdW1lIHRoYXQgcGVyLWNwdSByZXNvdXJjZXMgaGF2ZQogCQkgKiBiZWVuIGFsbG9jYXRlZC4gIFNvIGRvbid0IGFsbG93IHRoZW0gdG8gYmUgY2FsbGVkIGJ5IHRoaXMKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcm9maWxlLmMgYi9rZXJuZWwvcHJvZmlsZS5jCmluZGV4IGFkOGNiYjcuLmY4OTI0OGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcm9maWxlLmMKKysrIGIva2VybmVsL3Byb2ZpbGUuYwpAQCAtMzUsMTEgKzM1LDExIEBACiAjZGVmaW5lIE5SX1BST0ZJTEVfR1JQCQkoTlJfUFJPRklMRV9ISVQvUFJPRklMRV9HUlBTWikKIAogLyogT3Byb2ZpbGUgdGltZXIgdGljayBob29rICovCi1pbnQgKCp0aW1lcl9ob29rKShzdHJ1Y3QgcHRfcmVncyAqKTsKK2ludCAoKnRpbWVyX2hvb2spKHN0cnVjdCBwdF9yZWdzICopIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBhdG9taWNfdCAqcHJvZl9idWZmZXI7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwcm9mX2xlbiwgcHJvZl9zaGlmdDsKLXN0YXRpYyBpbnQgcHJvZl9vbjsKK3N0YXRpYyBpbnQgcHJvZl9vbiBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGNwdW1hc2tfdCBwcm9mX2NwdV9tYXNrID0gQ1BVX01BU0tfQUxMOwogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcHJvZmlsZV9oaXQgKlsyXSwgY3B1X3Byb2ZpbGVfaGl0cyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDUyZjY5NmYuLjI2OTY3ZTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkJCW5ldy0+c3RhcnQgPSBtaW47CiAJCWlmIChuZXctPmVuZCA+IG1heCkKIAkJCW5ldy0+ZW5kID0gbWF4OwotCQluZXctPnN0YXJ0ID0gKG5ldy0+c3RhcnQgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworCQluZXctPnN0YXJ0ID0gQUxJR04obmV3LT5zdGFydCwgYWxpZ24pOwogCQlpZiAoYWxpZ25mKQogCQkJYWxpZ25mKGFsaWduZl9kYXRhLCBuZXcsIHNpemUsIGFsaWduKTsKIAkJaWYgKG5ldy0+c3RhcnQgPCBuZXctPmVuZCAmJiBuZXctPmVuZCAtIG5ldy0+c3RhcnQgPj0gc2l6ZSAtIDEpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggNzYwODBkMS4uNDEwN2RiMCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogI2RlZmluZSBTQ0FMRV9QUklPKHgsIHByaW8pIFwKIAltYXgoeCAqIChNQVhfUFJJTyAtIHByaW8pIC8gKE1BWF9VU0VSX1BSSU8vMiksIE1JTl9USU1FU0xJQ0UpCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRhc2tfdGltZXNsaWNlKHRhc2tfdCAqcCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGFza190aW1lc2xpY2UodGFza190ICpwKQogewogCWlmIChwLT5zdGF0aWNfcHJpbyA8IE5JQ0VfVE9fUFJJTygwKSkKIAkJcmV0dXJuIFNDQUxFX1BSSU8oREVGX1RJTUVTTElDRSo0LCBwLT5zdGF0aWNfcHJpbyk7CkBAIC0yMDYsNyArMjA2LDcgQEAKIAkgKi8KIAl1bnNpZ25lZCBsb25nIG5yX3J1bm5pbmc7CiAjaWZkZWYgQ09ORklHX1NNUAotCXVuc2lnbmVkIGxvbmcgY3B1X2xvYWQ7CisJdW5zaWduZWQgbG9uZyBjcHVfbG9hZFszXTsKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcgbG9uZyBucl9zd2l0Y2hlczsKIApAQCAtMjYwLDIyICsyNjAsODYgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBydW5xdWV1ZSwgcnVucXVldWVzKTsKIAorLyoKKyAqIFRoZSBkb21haW4gdHJlZSAocnEtPnNkKSBpcyBwcm90ZWN0ZWQgYnkgUkNVJ3MgcXVpZXNjZW50IHN0YXRlIHRyYW5zaXRpb24uCisgKiBTZWUgZGV0YWNoX2Rlc3Ryb3lfZG9tYWluczogc3luY2hyb25pemVfc2NoZWQgZm9yIGRldGFpbHMuCisgKgorICogVGhlIGRvbWFpbiB0cmVlIG9mIGFueSBDUFUgbWF5IG9ubHkgYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4KKyAqIHByZWVtcHQtZGlzYWJsZWQgc2VjdGlvbnMuCisgKi8KICNkZWZpbmUgZm9yX2VhY2hfZG9tYWluKGNwdSwgZG9tYWluKSBcCi0JZm9yIChkb21haW4gPSBjcHVfcnEoY3B1KS0+c2Q7IGRvbWFpbjsgZG9tYWluID0gZG9tYWluLT5wYXJlbnQpCitmb3IgKGRvbWFpbiA9IHJjdV9kZXJlZmVyZW5jZShjcHVfcnEoY3B1KS0+c2QpOyBkb21haW47IGRvbWFpbiA9IGRvbWFpbi0+cGFyZW50KQogCiAjZGVmaW5lIGNwdV9ycShjcHUpCQkoJnBlcl9jcHUocnVucXVldWVzLCAoY3B1KSkpCiAjZGVmaW5lIHRoaXNfcnEoKQkJKCZfX2dldF9jcHVfdmFyKHJ1bnF1ZXVlcykpCiAjZGVmaW5lIHRhc2tfcnEocCkJCWNwdV9ycSh0YXNrX2NwdShwKSkKICNkZWZpbmUgY3B1X2N1cnIoY3B1KQkJKGNwdV9ycShjcHUpLT5jdXJyKQogCi0vKgotICogRGVmYXVsdCBjb250ZXh0LXN3aXRjaCBsb2NraW5nOgotICovCiAjaWZuZGVmIHByZXBhcmVfYXJjaF9zd2l0Y2gKLSMgZGVmaW5lIHByZXBhcmVfYXJjaF9zd2l0Y2gocnEsIG5leHQpCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChycSwgbmV4dCkJc3Bpbl91bmxvY2tfaXJxKCYocnEpLT5sb2NrKQotIyBkZWZpbmUgdGFza19ydW5uaW5nKHJxLCBwKQkJKChycSktPmN1cnIgPT0gKHApKQorIyBkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKKyNpZm5kZWYgZmluaXNoX2FyY2hfc3dpdGNoCisjIGRlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKK3N0YXRpYyBpbmxpbmUgaW50IHRhc2tfcnVubmluZyhydW5xdWV1ZV90ICpycSwgdGFza190ICpwKQoreworCXJldHVybiBycS0+Y3VyciA9PSBwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9sb2NrX3N3aXRjaChydW5xdWV1ZV90ICpycSwgdGFza190ICpuZXh0KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2xvY2tfc3dpdGNoKHJ1bnF1ZXVlX3QgKnJxLCB0YXNrX3QgKnByZXYpCit7CisJc3Bpbl91bmxvY2tfaXJxKCZycS0+bG9jayk7Cit9CisKKyNlbHNlIC8qIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXICovCitzdGF0aWMgaW5saW5lIGludCB0YXNrX3J1bm5pbmcocnVucXVldWVfdCAqcnEsIHRhc2tfdCAqcCkKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJcmV0dXJuIHAtPm9uY3B1OworI2Vsc2UKKwlyZXR1cm4gcnEtPmN1cnIgPT0gcDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9sb2NrX3N3aXRjaChydW5xdWV1ZV90ICpycSwgdGFza190ICpuZXh0KQoreworI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIFdlIGNhbiBvcHRpbWlzZSB0aGlzIG91dCBjb21wbGV0ZWx5IGZvciAhU01QLCBiZWNhdXNlIHRoZQorCSAqIFNNUCByZWJhbGFuY2luZyBmcm9tIGludGVycnVwdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhcmVzCisJICogaGVyZS4KKwkgKi8KKwluZXh0LT5vbmNwdSA9IDE7CisjZW5kaWYKKyNpZmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCisJc3Bpbl91bmxvY2tfaXJxKCZycS0+bG9jayk7CisjZWxzZQorCXNwaW5fdW5sb2NrKCZycS0+bG9jayk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9sb2NrX3N3aXRjaChydW5xdWV1ZV90ICpycSwgdGFza190ICpwcmV2KQoreworI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIEFmdGVyIC0+b25jcHUgaXMgY2xlYXJlZCwgdGhlIHRhc2sgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IENQVS4KKwkgKiBXZSBtdXN0IGVuc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIHVudGlsIHRoZSBzd2l0Y2ggaXMgY29tcGxldGVseQorCSAqIGZpbmlzaGVkLgorCSAqLworCXNtcF93bWIoKTsKKwlwcmV2LT5vbmNwdSA9IDA7CisjZW5kaWYKKyNpZm5kZWYgX19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVworCWxvY2FsX2lycV9lbmFibGUoKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXICovCiAKIC8qCiAgKiB0YXNrX3JxX2xvY2sgLSBsb2NrIHRoZSBydW5xdWV1ZSBhIGdpdmVuIHRhc2sgcmVzaWRlcyBvbiBhbmQgZGlzYWJsZQpAQCAtMzA5LDcgKzM3Myw3IEBACiAgKiBidW1wIHRoaXMgdXAgd2hlbiBjaGFuZ2luZyB0aGUgb3V0cHV0IGZvcm1hdCBvciB0aGUgbWVhbmluZyBvZiBhbiBleGlzdGluZwogICogZm9ybWF0LCBzbyB0aGF0IHRvb2xzIGNhbiBhZGFwdCAob3IgYWJvcnQpCiAgKi8KLSNkZWZpbmUgU0NIRURTVEFUX1ZFUlNJT04gMTEKKyNkZWZpbmUgU0NIRURTVEFUX1ZFUlNJT04gMTIKIAogc3RhdGljIGludCBzaG93X3NjaGVkc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKQEAgLTMzOCw2ICs0MDIsNyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCQkvKiBkb21haW4tc3BlY2lmaWMgc3RhdHMgKi8KKwkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7CiAJCQllbnVtIGlkbGVfdHlwZSBpdHlwZTsKIAkJCWNoYXIgbWFza19zdHJbTlJfQ1BVU107CkBAIC0zNTYsMTEgKzQyMSwxMyBAQAogCQkJCSAgICBzZC0+bGJfbm9idXN5cVtpdHlwZV0sCiAJCQkJICAgIHNkLT5sYl9ub2J1c3lnW2l0eXBlXSk7CiAJCQl9Ci0JCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1XG4iLAorCQkJc2VxX3ByaW50ZihzZXEsICIgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHVcbiIsCiAJCQkgICAgc2QtPmFsYl9jbnQsIHNkLT5hbGJfZmFpbGVkLCBzZC0+YWxiX3B1c2hlZCwKLQkJCSAgICBzZC0+c2JlX3B1c2hlZCwgc2QtPnNiZV9hdHRlbXB0cywKKwkJCSAgICBzZC0+c2JlX2NudCwgc2QtPnNiZV9iYWxhbmNlZCwgc2QtPnNiZV9wdXNoZWQsCisJCQkgICAgc2QtPnNiZl9jbnQsIHNkLT5zYmZfYmFsYW5jZWQsIHNkLT5zYmZfcHVzaGVkLAogCQkJICAgIHNkLT50dHd1X3dha2VfcmVtb3RlLCBzZC0+dHR3dV9tb3ZlX2FmZmluZSwgc2QtPnR0d3VfbW92ZV9iYWxhbmNlKTsKIAkJfQorCQlwcmVlbXB0X2VuYWJsZSgpOwogI2VuZGlmCiAJfQogCXJldHVybiAwOwpAQCAtNDE0LDIyICs0ODEsNiBAQAogCXJldHVybiBycTsKIH0KIAotI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKLXN0YXRpYyBpbnQgY3B1X2FuZF9zaWJsaW5nc19hcmVfaWRsZShpbnQgY3B1KQotewotCWludCBzaWI7Ci0JZm9yX2VhY2hfY3B1X21hc2soc2liLCBjcHVfc2libGluZ19tYXBbY3B1XSkgewotCQlpZiAoaWRsZV9jcHUoc2liKSkKLQkJCWNvbnRpbnVlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLSNlbHNlCi0jZGVmaW5lIGNwdV9hbmRfc2libGluZ3NfYXJlX2lkbGUoQSkgaWRsZV9jcHUoQSkKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIC8qCiAgKiBDYWxsZWQgd2hlbiBhIHByb2Nlc3MgaXMgZGVxdWV1ZWQgZnJvbSB0aGUgYWN0aXZlIGFycmF5IGFuZCBnaXZlbgpAQCAtNjIyLDcgKzY3Myw3IEBACiAJcnEtPm5yX3J1bm5pbmcrKzsKIH0KIAotc3RhdGljIHZvaWQgcmVjYWxjX3Rhc2tfcHJpbyh0YXNrX3QgKnAsIHVuc2lnbmVkIGxvbmcgbG9uZyBub3cpCitzdGF0aWMgaW50IHJlY2FsY190YXNrX3ByaW8odGFza190ICpwLCB1bnNpZ25lZCBsb25nIGxvbmcgbm93KQogewogCS8qIENhbGxlciBtdXN0IGFsd2F5cyBlbnN1cmUgJ25vdyA+PSBwLT50aW1lc3RhbXAnICovCiAJdW5zaWduZWQgbG9uZyBsb25nIF9fc2xlZXBfdGltZSA9IG5vdyAtIHAtPnRpbWVzdGFtcDsKQEAgLTY4MSw3ICs3MzIsNyBAQAogCQl9CiAJfQogCi0JcC0+cHJpbyA9IGVmZmVjdGl2ZV9wcmlvKHApOworCXJldHVybiBlZmZlY3RpdmVfcHJpbyhwKTsKIH0KIAogLyoKQEAgLTcwNCw3ICs3NTUsNyBAQAogCX0KICNlbmRpZgogCi0JcmVjYWxjX3Rhc2tfcHJpbyhwLCBub3cpOworCXAtPnByaW8gPSByZWNhbGNfdGFza19wcmlvKHAsIG5vdyk7CiAKIAkvKgogCSAqIFRoaXMgY2hlY2tzIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiB1bmludGVycnVwdGlibGUgdGFzawpAQCAtNzgyLDIyICs4MzMsMTIgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLWVudW0gcmVxdWVzdF90eXBlIHsKLQlSRVFfTU9WRV9UQVNLLAotCVJFUV9TRVRfRE9NQUlOLAotfTsKLQogdHlwZWRlZiBzdHJ1Y3QgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQllbnVtIHJlcXVlc3RfdHlwZSB0eXBlOwogCi0JLyogRm9yIFJFUV9NT1ZFX1RBU0sgKi8KIAl0YXNrX3QgKnRhc2s7CiAJaW50IGRlc3RfY3B1OwogCi0JLyogRm9yIFJFUV9TRVRfRE9NQUlOICovCi0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0KIAlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOwogfSBtaWdyYXRpb25fcmVxX3Q7CiAKQEAgLTgxOSw3ICs4NjAsNiBAQAogCX0KIAogCWluaXRfY29tcGxldGlvbigmcmVxLT5kb25lKTsKLQlyZXEtPnR5cGUgPSBSRVFfTU9WRV9UQVNLOwogCXJlcS0+dGFzayA9IHA7CiAJcmVxLT5kZXN0X2NwdSA9IGRlc3RfY3B1OwogCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZycS0+bWlncmF0aW9uX3F1ZXVlKTsKQEAgLTg4NiwyNiArOTI2LDE1NCBAQAogICogV2Ugd2FudCB0byB1bmRlci1lc3RpbWF0ZSB0aGUgbG9hZCBvZiBtaWdyYXRpb24gc291cmNlcywgdG8KICAqIGJhbGFuY2UgY29uc2VydmF0aXZlbHkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzb3VyY2VfbG9hZChpbnQgY3B1KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNvdXJjZV9sb2FkKGludCBjcHUsIGludCB0eXBlKQogewogCXJ1bnF1ZXVlX3QgKnJxID0gY3B1X3JxKGNwdSk7CiAJdW5zaWduZWQgbG9uZyBsb2FkX25vdyA9IHJxLT5ucl9ydW5uaW5nICogU0NIRURfTE9BRF9TQ0FMRTsKKwlpZiAodHlwZSA9PSAwKQorCQlyZXR1cm4gbG9hZF9ub3c7CiAKLQlyZXR1cm4gbWluKHJxLT5jcHVfbG9hZCwgbG9hZF9ub3cpOworCXJldHVybiBtaW4ocnEtPmNwdV9sb2FkW3R5cGUtMV0sIGxvYWRfbm93KTsKIH0KIAogLyoKICAqIFJldHVybiBhIGhpZ2ggZ3Vlc3MgYXQgdGhlIGxvYWQgb2YgYSBtaWdyYXRpb24tdGFyZ2V0IGNwdQogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X2xvYWQoaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0YXJnZXRfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSkKIHsKIAlydW5xdWV1ZV90ICpycSA9IGNwdV9ycShjcHUpOwogCXVuc2lnbmVkIGxvbmcgbG9hZF9ub3cgPSBycS0+bnJfcnVubmluZyAqIFNDSEVEX0xPQURfU0NBTEU7CisJaWYgKHR5cGUgPT0gMCkKKwkJcmV0dXJuIGxvYWRfbm93OwogCi0JcmV0dXJuIG1heChycS0+Y3B1X2xvYWQsIGxvYWRfbm93KTsKKwlyZXR1cm4gbWF4KHJxLT5jcHVfbG9hZFt0eXBlLTFdLCBsb2FkX25vdyk7CiB9CiAKLSNlbmRpZgorLyoKKyAqIGZpbmRfaWRsZXN0X2dyb3VwIGZpbmRzIGFuZCByZXR1cm5zIHRoZSBsZWFzdCBidXN5IENQVSBncm91cCB3aXRoaW4gdGhlCisgKiBkb21haW4uCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKgorZmluZF9pZGxlc3RfZ3JvdXAoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHRoaXNfY3B1KQoreworCXN0cnVjdCBzY2hlZF9ncm91cCAqaWRsZXN0ID0gTlVMTCwgKnRoaXMgPSBOVUxMLCAqZ3JvdXAgPSBzZC0+Z3JvdXBzOworCXVuc2lnbmVkIGxvbmcgbWluX2xvYWQgPSBVTE9OR19NQVgsIHRoaXNfbG9hZCA9IDA7CisJaW50IGxvYWRfaWR4ID0gc2QtPmZvcmtleGVjX2lkeDsKKwlpbnQgaW1iYWxhbmNlID0gMTAwICsgKHNkLT5pbWJhbGFuY2VfcGN0LTEwMCkvMjsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBsb2FkLCBhdmdfbG9hZDsKKwkJaW50IGxvY2FsX2dyb3VwOworCQlpbnQgaTsKKworCQlsb2NhbF9ncm91cCA9IGNwdV9pc3NldCh0aGlzX2NwdSwgZ3JvdXAtPmNwdW1hc2spOworCQkvKiBYWFg6IHB1dCBhIGNwdXMgYWxsb3dlZCBjaGVjayAqLworCisJCS8qIFRhbGx5IHVwIHRoZSBsb2FkIG9mIGFsbCBDUFVzIGluIHRoZSBncm91cCAqLworCQlhdmdfbG9hZCA9IDA7CisKKwkJZm9yX2VhY2hfY3B1X21hc2soaSwgZ3JvdXAtPmNwdW1hc2spIHsKKwkJCS8qIEJpYXMgYmFsYW5jaW5nIHRvd2FyZCBjcHVzIG9mIG91ciBkb21haW4gKi8KKwkJCWlmIChsb2NhbF9ncm91cCkKKwkJCQlsb2FkID0gc291cmNlX2xvYWQoaSwgbG9hZF9pZHgpOworCQkJZWxzZQorCQkJCWxvYWQgPSB0YXJnZXRfbG9hZChpLCBsb2FkX2lkeCk7CisKKwkJCWF2Z19sb2FkICs9IGxvYWQ7CisJCX0KKworCQkvKiBBZGp1c3QgYnkgcmVsYXRpdmUgQ1BVIHBvd2VyIG9mIHRoZSBncm91cCAqLworCQlhdmdfbG9hZCA9IChhdmdfbG9hZCAqIFNDSEVEX0xPQURfU0NBTEUpIC8gZ3JvdXAtPmNwdV9wb3dlcjsKKworCQlpZiAobG9jYWxfZ3JvdXApIHsKKwkJCXRoaXNfbG9hZCA9IGF2Z19sb2FkOworCQkJdGhpcyA9IGdyb3VwOworCQl9IGVsc2UgaWYgKGF2Z19sb2FkIDwgbWluX2xvYWQpIHsKKwkJCW1pbl9sb2FkID0gYXZnX2xvYWQ7CisJCQlpZGxlc3QgPSBncm91cDsKKwkJfQorCQlncm91cCA9IGdyb3VwLT5uZXh0OworCX0gd2hpbGUgKGdyb3VwICE9IHNkLT5ncm91cHMpOworCisJaWYgKCFpZGxlc3QgfHwgMTAwKnRoaXNfbG9hZCA8IGltYmFsYW5jZSptaW5fbG9hZCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGlkbGVzdDsKK30KKworLyoKKyAqIGZpbmRfaWRsZXN0X3F1ZXVlIC0gZmluZCB0aGUgaWRsZXN0IHJ1bnF1ZXVlIGFtb25nIHRoZSBjcHVzIGluIGdyb3VwLgorICovCitzdGF0aWMgaW50IGZpbmRfaWRsZXN0X2NwdShzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwLCBpbnQgdGhpc19jcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb2FkLCBtaW5fbG9hZCA9IFVMT05HX01BWDsKKwlpbnQgaWRsZXN0ID0gLTE7CisJaW50IGk7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCBncm91cC0+Y3B1bWFzaykgeworCQlsb2FkID0gc291cmNlX2xvYWQoaSwgMCk7CisKKwkJaWYgKGxvYWQgPCBtaW5fbG9hZCB8fCAobG9hZCA9PSBtaW5fbG9hZCAmJiBpID09IHRoaXNfY3B1KSkgeworCQkJbWluX2xvYWQgPSBsb2FkOworCQkJaWRsZXN0ID0gaTsKKwkJfQorCX0KKworCXJldHVybiBpZGxlc3Q7Cit9CisKKy8qCisgKiBzY2hlZF9iYWxhbmNlX3NlbGY6IGJhbGFuY2UgdGhlIGN1cnJlbnQgdGFzayAocnVubmluZyBvbiBjcHUpIGluIGRvbWFpbnMKKyAqIHRoYXQgaGF2ZSB0aGUgJ2ZsYWcnIGZsYWcgc2V0LiBJbiBwcmFjdGljZSwgdGhpcyBpcyBTRF9CQUxBTkNFX0ZPUksgYW5kCisgKiBTRF9CQUxBTkNFX0VYRUMuCisgKgorICogQmFsYW5jZSwgaWUuIHNlbGVjdCB0aGUgbGVhc3QgbG9hZGVkIGdyb3VwLgorICoKKyAqIFJldHVybnMgdGhlIHRhcmdldCBDUFUgbnVtYmVyLCBvciB0aGUgc2FtZSBDUFUgaWYgbm8gYmFsYW5jaW5nIGlzIG5lZWRlZC4KKyAqCisgKiBwcmVlbXB0IG11c3QgYmUgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgc2NoZWRfYmFsYW5jZV9zZWxmKGludCBjcHUsIGludCBmbGFnKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdCA9IGN1cnJlbnQ7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqdG1wLCAqc2QgPSBOVUxMOworCisJZm9yX2VhY2hfZG9tYWluKGNwdSwgdG1wKQorCQlpZiAodG1wLT5mbGFncyAmIGZsYWcpCisJCQlzZCA9IHRtcDsKKworCXdoaWxlIChzZCkgeworCQljcHVtYXNrX3Qgc3BhbjsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cDsKKwkJaW50IG5ld19jcHU7CisJCWludCB3ZWlnaHQ7CisKKwkJc3BhbiA9IHNkLT5zcGFuOworCQlncm91cCA9IGZpbmRfaWRsZXN0X2dyb3VwKHNkLCB0LCBjcHUpOworCQlpZiAoIWdyb3VwKQorCQkJZ290byBuZXh0bGV2ZWw7CisKKwkJbmV3X2NwdSA9IGZpbmRfaWRsZXN0X2NwdShncm91cCwgY3B1KTsKKwkJaWYgKG5ld19jcHUgPT0gLTEgfHwgbmV3X2NwdSA9PSBjcHUpCisJCQlnb3RvIG5leHRsZXZlbDsKKworCQkvKiBOb3cgdHJ5IGJhbGFuY2luZyBhdCBhIGxvd2VyIGRvbWFpbiBsZXZlbCAqLworCQljcHUgPSBuZXdfY3B1OworbmV4dGxldmVsOgorCQlzZCA9IE5VTEw7CisJCXdlaWdodCA9IGNwdXNfd2VpZ2h0KHNwYW4pOworCQlmb3JfZWFjaF9kb21haW4oY3B1LCB0bXApIHsKKwkJCWlmICh3ZWlnaHQgPD0gY3B1c193ZWlnaHQodG1wLT5zcGFuKSkKKwkJCQlicmVhazsKKwkJCWlmICh0bXAtPmZsYWdzICYgZmxhZykKKwkJCQlzZCA9IHRtcDsKKwkJfQorCQkvKiB3aGlsZSBsb29wIHdpbGwgYnJlYWsgaGVyZSBpZiBzZCA9PSBOVUxMICovCisJfQorCisJcmV0dXJuIGNwdTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoKICAqIHdha2VfaWRsZSgpIHdpbGwgd2FrZSBhIHRhc2sgb24gYW4gaWRsZSBjcHUgaWYgdGFzay0+Y3B1IGlzCkBAIC05MjcsMTQgKzEwOTUsMTQgQEAKIAogCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7CiAJCWlmIChzZC0+ZmxhZ3MgJiBTRF9XQUtFX0lETEUpIHsKLQkJCWNwdXNfYW5kKHRtcCwgc2QtPnNwYW4sIGNwdV9vbmxpbmVfbWFwKTsKLQkJCWNwdXNfYW5kKHRtcCwgdG1wLCBwLT5jcHVzX2FsbG93ZWQpOworCQkJY3B1c19hbmQodG1wLCBzZC0+c3BhbiwgcC0+Y3B1c19hbGxvd2VkKTsKIAkJCWZvcl9lYWNoX2NwdV9tYXNrKGksIHRtcCkgewogCQkJCWlmIChpZGxlX2NwdShpKSkKIAkJCQkJcmV0dXJuIGk7CiAJCQl9CiAJCX0KLQkJZWxzZSBicmVhazsKKwkJZWxzZQorCQkJYnJlYWs7CiAJfQogCXJldHVybiBjcHU7CiB9CkBAIC05NjcsNyArMTEzNSw3IEBACiAJcnVucXVldWVfdCAqcnE7CiAjaWZkZWYgQ09ORklHX1NNUAogCXVuc2lnbmVkIGxvbmcgbG9hZCwgdGhpc19sb2FkOwotCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCAqdGhpc19zZCA9IE5VTEw7CiAJaW50IG5ld19jcHU7CiAjZW5kaWYKIApAQCAtOTg2LDcwICsxMTU0LDY5IEBACiAJaWYgKHVubGlrZWx5KHRhc2tfcnVubmluZyhycSwgcCkpKQogCQlnb3RvIG91dF9hY3RpdmF0ZTsKIAotI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCisJbmV3X2NwdSA9IGNwdTsKKwogCXNjaGVkc3RhdF9pbmMocnEsIHR0d3VfY250KTsKIAlpZiAoY3B1ID09IHRoaXNfY3B1KSB7CiAJCXNjaGVkc3RhdF9pbmMocnEsIHR0d3VfbG9jYWwpOwotCX0gZWxzZSB7Ci0JCWZvcl9lYWNoX2RvbWFpbih0aGlzX2NwdSwgc2QpIHsKLQkJCWlmIChjcHVfaXNzZXQoY3B1LCBzZC0+c3BhbikpIHsKLQkJCQlzY2hlZHN0YXRfaW5jKHNkLCB0dHd1X3dha2VfcmVtb3RlKTsKLQkJCQlicmVhazsKLQkJCX0KKwkJZ290byBvdXRfc2V0X2NwdTsKKwl9CisKKwlmb3JfZWFjaF9kb21haW4odGhpc19jcHUsIHNkKSB7CisJCWlmIChjcHVfaXNzZXQoY3B1LCBzZC0+c3BhbikpIHsKKwkJCXNjaGVkc3RhdF9pbmMoc2QsIHR0d3Vfd2FrZV9yZW1vdGUpOworCQkJdGhpc19zZCA9IHNkOworCQkJYnJlYWs7CiAJCX0KIAl9Ci0jZW5kaWYKIAotCW5ld19jcHUgPSBjcHU7Ci0JaWYgKGNwdSA9PSB0aGlzX2NwdSB8fCB1bmxpa2VseSghY3B1X2lzc2V0KHRoaXNfY3B1LCBwLT5jcHVzX2FsbG93ZWQpKSkKKwlpZiAodW5saWtlbHkoIWNwdV9pc3NldCh0aGlzX2NwdSwgcC0+Y3B1c19hbGxvd2VkKSkpCiAJCWdvdG8gb3V0X3NldF9jcHU7CiAKLQlsb2FkID0gc291cmNlX2xvYWQoY3B1KTsKLQl0aGlzX2xvYWQgPSB0YXJnZXRfbG9hZCh0aGlzX2NwdSk7Ci0KIAkvKgotCSAqIElmIHN5bmMgd2FrZXVwIHRoZW4gc3VidHJhY3QgdGhlIChtYXhpbXVtIHBvc3NpYmxlKSBlZmZlY3Qgb2YKLQkgKiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGFzayBmcm9tIHRoZSBsb2FkIG9mIHRoZSBjdXJyZW50IENQVToKKwkgKiBDaGVjayBmb3IgYWZmaW5lIHdha2V1cCBhbmQgcGFzc2l2ZSBiYWxhbmNpbmcgcG9zc2liaWxpdGllcy4KIAkgKi8KLQlpZiAoc3luYykKLQkJdGhpc19sb2FkIC09IFNDSEVEX0xPQURfU0NBTEU7Ci0KLQkvKiBEb24ndCBwdWxsIHRoZSB0YXNrIG9mZiBhbiBpZGxlIENQVSB0byBhIGJ1c3kgb25lICovCi0JaWYgKGxvYWQgPCBTQ0hFRF9MT0FEX1NDQUxFLzIgJiYgdGhpc19sb2FkID4gU0NIRURfTE9BRF9TQ0FMRS8yKQotCQlnb3RvIG91dF9zZXRfY3B1OwotCi0JbmV3X2NwdSA9IHRoaXNfY3B1OyAvKiBXYWtlIHRvIHRoaXMgQ1BVIGlmIHdlIGNhbiAqLwotCi0JLyoKLQkgKiBTY2FuIGRvbWFpbnMgZm9yIGFmZmluZSB3YWtldXAgYW5kIHBhc3NpdmUgYmFsYW5jaW5nCi0JICogcG9zc2liaWxpdGllcy4KLQkgKi8KLQlmb3JfZWFjaF9kb21haW4odGhpc19jcHUsIHNkKSB7CisJaWYgKHRoaXNfc2QpIHsKKwkJaW50IGlkeCA9IHRoaXNfc2QtPndha2VfaWR4OwogCQl1bnNpZ25lZCBpbnQgaW1iYWxhbmNlOworCisJCWltYmFsYW5jZSA9IDEwMCArICh0aGlzX3NkLT5pbWJhbGFuY2VfcGN0IC0gMTAwKSAvIDI7CisKKwkJbG9hZCA9IHNvdXJjZV9sb2FkKGNwdSwgaWR4KTsKKwkJdGhpc19sb2FkID0gdGFyZ2V0X2xvYWQodGhpc19jcHUsIGlkeCk7CisKKwkJbmV3X2NwdSA9IHRoaXNfY3B1OyAvKiBXYWtlIHRvIHRoaXMgQ1BVIGlmIHdlIGNhbiAqLworCisJCWlmICh0aGlzX3NkLT5mbGFncyAmIFNEX1dBS0VfQUZGSU5FKSB7CisJCQl1bnNpZ25lZCBsb25nIHRsID0gdGhpc19sb2FkOworCQkJLyoKKwkJCSAqIElmIHN5bmMgd2FrZXVwIHRoZW4gc3VidHJhY3QgdGhlIChtYXhpbXVtIHBvc3NpYmxlKQorCQkJICogZWZmZWN0IG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyB0YXNrIGZyb20gdGhlIGxvYWQKKwkJCSAqIG9mIHRoZSBjdXJyZW50IENQVToKKwkJCSAqLworCQkJaWYgKHN5bmMpCisJCQkJdGwgLT0gU0NIRURfTE9BRF9TQ0FMRTsKKworCQkJaWYgKCh0bCA8PSBsb2FkICYmCisJCQkJdGwgKyB0YXJnZXRfbG9hZChjcHUsIGlkeCkgPD0gU0NIRURfTE9BRF9TQ0FMRSkgfHwKKwkJCQkxMDAqKHRsICsgU0NIRURfTE9BRF9TQ0FMRSkgPD0gaW1iYWxhbmNlKmxvYWQpIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgZG9tYWluIGhhcyBTRF9XQUtFX0FGRklORSBhbmQKKwkJCQkgKiBwIGlzIGNhY2hlIGNvbGQgaW4gdGhpcyBkb21haW4sIGFuZAorCQkJCSAqIHRoZXJlIGlzIG5vIGJhZCBpbWJhbGFuY2UuCisJCQkJICovCisJCQkJc2NoZWRzdGF0X2luYyh0aGlzX3NkLCB0dHd1X21vdmVfYWZmaW5lKTsKKwkJCQlnb3RvIG91dF9zZXRfY3B1OworCQkJfQorCQl9CisKIAkJLyoKIAkJICogU3RhcnQgcGFzc2l2ZSBiYWxhbmNpbmcgd2hlbiBoYWxmIHRoZSBpbWJhbGFuY2VfcGN0CiAJCSAqIGxpbWl0IGlzIHJlYWNoZWQuCiAJCSAqLwotCQlpbWJhbGFuY2UgPSBzZC0+aW1iYWxhbmNlX3BjdCArIChzZC0+aW1iYWxhbmNlX3BjdCAtIDEwMCkgLyAyOwotCi0JCWlmICgoc2QtPmZsYWdzICYgU0RfV0FLRV9BRkZJTkUpICYmCi0JCQkJIXRhc2tfaG90KHAsIHJxLT50aW1lc3RhbXBfbGFzdF90aWNrLCBzZCkpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIGRvbWFpbiBoYXMgU0RfV0FLRV9BRkZJTkUgYW5kIHAgaXMgY2FjaGUgY29sZAotCQkJICogaW4gdGhpcyBkb21haW4uCi0JCQkgKi8KLQkJCWlmIChjcHVfaXNzZXQoY3B1LCBzZC0+c3BhbikpIHsKLQkJCQlzY2hlZHN0YXRfaW5jKHNkLCB0dHd1X21vdmVfYWZmaW5lKTsKLQkJCQlnb3RvIG91dF9zZXRfY3B1OwotCQkJfQotCQl9IGVsc2UgaWYgKChzZC0+ZmxhZ3MgJiBTRF9XQUtFX0JBTEFOQ0UpICYmCi0JCQkJaW1iYWxhbmNlKnRoaXNfbG9hZCA8PSAxMDAqbG9hZCkgewotCQkJLyoKLQkJCSAqIFRoaXMgZG9tYWluIGhhcyBTRF9XQUtFX0JBTEFOQ0UgYW5kIHRoZXJlIGlzCi0JCQkgKiBhbiBpbWJhbGFuY2UuCi0JCQkgKi8KLQkJCWlmIChjcHVfaXNzZXQoY3B1LCBzZC0+c3BhbikpIHsKLQkJCQlzY2hlZHN0YXRfaW5jKHNkLCB0dHd1X21vdmVfYmFsYW5jZSk7CisJCWlmICh0aGlzX3NkLT5mbGFncyAmIFNEX1dBS0VfQkFMQU5DRSkgeworCQkJaWYgKGltYmFsYW5jZSp0aGlzX2xvYWQgPD0gMTAwKmxvYWQpIHsKKwkJCQlzY2hlZHN0YXRfaW5jKHRoaXNfc2QsIHR0d3VfbW92ZV9iYWxhbmNlKTsKIAkJCQlnb3RvIG91dF9zZXRfY3B1OwogCQkJfQogCQl9CkBAIC0xMTIwLDE3ICsxMjg3LDE5IEBACiAJcmV0dXJuIHRyeV90b193YWtlX3VwKHAsIHN0YXRlLCAwKTsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBpbnQgZmluZF9pZGxlc3RfY3B1KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHRoaXNfY3B1LAotCQkJICAgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpOwotI2VuZGlmCi0KIC8qCiAgKiBQZXJmb3JtIHNjaGVkdWxlciByZWxhdGVkIHNldHVwIGZvciBhIG5ld2x5IGZvcmtlZCBwcm9jZXNzIHAuCiAgKiBwIGlzIGZvcmtlZCBieSBjdXJyZW50LgogICovCi12b2lkIGZhc3RjYWxsIHNjaGVkX2ZvcmsodGFza190ICpwKQordm9pZCBmYXN0Y2FsbCBzY2hlZF9mb3JrKHRhc2tfdCAqcCwgaW50IGNsb25lX2ZsYWdzKQogeworCWludCBjcHUgPSBnZXRfY3B1KCk7CisKKyNpZmRlZiBDT05GSUdfU01QCisJY3B1ID0gc2NoZWRfYmFsYW5jZV9zZWxmKGNwdSwgU0RfQkFMQU5DRV9GT1JLKTsKKyNlbmRpZgorCXNldF90YXNrX2NwdShwLCBjcHUpOworCiAJLyoKIAkgKiBXZSBtYXJrIHRoZSBwcm9jZXNzIGFzIHJ1bm5pbmcgaGVyZSwgYnV0IGhhdmUgbm90IGFjdHVhbGx5CiAJICogaW5zZXJ0ZWQgaXQgb250byB0aGUgcnVucXVldWUgeWV0LiBUaGlzIGd1YXJhbnRlZXMgdGhhdApAQCAtMTE0MCwxNyArMTMwOSwxNCBAQAogCXAtPnN0YXRlID0gVEFTS19SVU5OSU5HOwogCUlOSVRfTElTVF9IRUFEKCZwLT5ydW5fbGlzdCk7CiAJcC0+YXJyYXkgPSBOVUxMOwotCXNwaW5fbG9ja19pbml0KCZwLT5zd2l0Y2hfbG9jayk7CiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAltZW1zZXQoJnAtPnNjaGVkX2luZm8sIDAsIHNpemVvZihwLT5zY2hlZF9pbmZvKSk7CiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cpCisJcC0+b25jcHUgPSAwOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKLQkvKgotCSAqIER1cmluZyBjb250ZXh0LXN3aXRjaCB3ZSBob2xkIHByZWNpc2VseSBvbmUgc3BpbmxvY2ssIHdoaWNoCi0JICogc2NoZWR1bGVfdGFpbCBkcm9wcy4gKGluIHRoZSBjb21tb24gY2FzZSBpdCdzIHRoaXNfcnEoKS0+bG9jaywKLQkgKiBidXQgaXQgYWxzbyBjYW4gYmUgcC0+c3dpdGNoX2xvY2suKSBTbyB3ZSBjb21wZW5zYXRlIHdpdGggYSBjb3VudAotCSAqIG9mIDEuIEFsc28sIHdlIHdhbnQgdG8gc3RhcnQgd2l0aCBrZXJuZWwgcHJlZW1wdGlvbiBkaXNhYmxlZC4KLQkgKi8KKwkvKiBXYW50IHRvIHN0YXJ0IHdpdGgga2VybmVsIHByZWVtcHRpb24gZGlzYWJsZWQuICovCiAJcC0+dGhyZWFkX2luZm8tPnByZWVtcHRfY291bnQgPSAxOwogI2VuZGlmCiAJLyoKQEAgLTExNzQsMTIgKzEzNDAsMTAgQEAKIAkJICogcnVucXVldWUgbG9jayBpcyBub3QgYSBwcm9ibGVtLgogCQkgKi8KIAkJY3VycmVudC0+dGltZV9zbGljZSA9IDE7Ci0JCXByZWVtcHRfZGlzYWJsZSgpOwogCQlzY2hlZHVsZXJfdGljaygpOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JfSBlbHNlCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXB1dF9jcHUoKTsKIH0KIAogLyoKQEAgLTExOTYsMTAgKzEzNjAsOSBAQAogCXJ1bnF1ZXVlX3QgKnJxLCAqdGhpc19ycTsKIAogCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7Ci0JY3B1ID0gdGFza19jcHUocCk7Ci0JdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KIAlCVUdfT04ocC0+c3RhdGUgIT0gVEFTS19SVU5OSU5HKTsKKwl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHUgPSB0YXNrX2NwdShwKTsKIAogCS8qCiAJICogV2UgZGVjcmVhc2UgdGhlIHNsZWVwIGF2ZXJhZ2Ugb2YgZm9ya2luZyBwYXJlbnRzCkBAIC0xMjk2LDIyICsxNDU5LDQwIEBACiB9CiAKIC8qKgorICogcHJlcGFyZV90YXNrX3N3aXRjaCAtIHByZXBhcmUgdG8gc3dpdGNoIHRhc2tzCisgKiBAcnE6IHRoZSBydW5xdWV1ZSBwcmVwYXJpbmcgdG8gc3dpdGNoCisgKiBAbmV4dDogdGhlIHRhc2sgd2UgYXJlIGdvaW5nIHRvIHN3aXRjaCB0by4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIHRoZSBycSBsb2NrIGhlbGQgYW5kIGludGVycnVwdHMgb2ZmLiBJdCBtdXN0CisgKiBiZSBwYWlyZWQgd2l0aCBhIHN1YnNlcXVlbnQgZmluaXNoX3Rhc2tfc3dpdGNoIGFmdGVyIHRoZSBjb250ZXh0CisgKiBzd2l0Y2guCisgKgorICogcHJlcGFyZV90YXNrX3N3aXRjaCBzZXRzIHVwIGxvY2tpbmcgYW5kIGNhbGxzIGFyY2hpdGVjdHVyZSBzcGVjaWZpYworICogaG9va3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3Rhc2tfc3dpdGNoKHJ1bnF1ZXVlX3QgKnJxLCB0YXNrX3QgKm5leHQpCit7CisJcHJlcGFyZV9sb2NrX3N3aXRjaChycSwgbmV4dCk7CisJcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KTsKK30KKworLyoqCiAgKiBmaW5pc2hfdGFza19zd2l0Y2ggLSBjbGVhbiB1cCBhZnRlciBhIHRhc2stc3dpdGNoCiAgKiBAcHJldjogdGhlIHRocmVhZCB3ZSBqdXN0IHN3aXRjaGVkIGF3YXkgZnJvbS4KICAqCi0gKiBXZSBlbnRlciB0aGlzIHdpdGggdGhlIHJ1bnF1ZXVlIHN0aWxsIGxvY2tlZCwgYW5kIGZpbmlzaF9hcmNoX3N3aXRjaCgpCi0gKiB3aWxsIHVubG9jayBpdCBhbG9uZyB3aXRoIGRvaW5nIGFueSBvdGhlciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY2xlYW51cAotICogYWN0aW9ucy4KKyAqIGZpbmlzaF90YXNrX3N3aXRjaCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgY29udGV4dCBzd2l0Y2gsIHBhaXJlZAorICogd2l0aCBhIHByZXBhcmVfdGFza19zd2l0Y2ggY2FsbCBiZWZvcmUgdGhlIGNvbnRleHQgc3dpdGNoLgorICogZmluaXNoX3Rhc2tfc3dpdGNoIHdpbGwgcmVjb25jaWxlIGxvY2tpbmcgc2V0IHVwIGJ5IHByZXBhcmVfdGFza19zd2l0Y2gsCisgKiBhbmQgZG8gYW55IG90aGVyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjbGVhbnVwIGFjdGlvbnMuCiAgKgogICogTm90ZSB0aGF0IHdlIG1heSBoYXZlIGRlbGF5ZWQgZHJvcHBpbmcgYW4gbW0gaW4gY29udGV4dF9zd2l0Y2goKS4gSWYKICAqIHNvLCB3ZSBmaW5pc2ggdGhhdCBoZXJlIG91dHNpZGUgb2YgdGhlIHJ1bnF1ZXVlIGxvY2suICAoRG9pbmcgaXQKICAqIHdpdGggdGhlIGxvY2sgaGVsZCBjYW4gY2F1c2UgZGVhZGxvY2tzOyBzZWUgc2NoZWR1bGUoKSBmb3IKICAqIGRldGFpbHMuKQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX3Rhc2tfc3dpdGNoKHRhc2tfdCAqcHJldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaW5pc2hfdGFza19zd2l0Y2gocnVucXVldWVfdCAqcnEsIHRhc2tfdCAqcHJldikKIAlfX3JlbGVhc2VzKHJxLT5sb2NrKQogewotCXJ1bnF1ZXVlX3QgKnJxID0gdGhpc19ycSgpOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gcnEtPnByZXZfbW07CiAJdW5zaWduZWQgbG9uZyBwcmV2X3Rhc2tfZmxhZ3M7CiAKQEAgLTEzMjksNyArMTUxMCw4IEBACiAJICoJCU1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CiAJICovCiAJcHJldl90YXNrX2ZsYWdzID0gcHJldi0+ZmxhZ3M7Ci0JZmluaXNoX2FyY2hfc3dpdGNoKHJxLCBwcmV2KTsKKwlmaW5pc2hfYXJjaF9zd2l0Y2gocHJldik7CisJZmluaXNoX2xvY2tfc3dpdGNoKHJxLCBwcmV2KTsKIAlpZiAobW0pCiAJCW1tZHJvcChtbSk7CiAJaWYgKHVubGlrZWx5KHByZXZfdGFza19mbGFncyAmIFBGX0RFQUQpKQpAQCAtMTM0Myw4ICsxNTI1LDEyIEBACiBhc21saW5rYWdlIHZvaWQgc2NoZWR1bGVfdGFpbCh0YXNrX3QgKnByZXYpCiAJX19yZWxlYXNlcyhycS0+bG9jaykKIHsKLQlmaW5pc2hfdGFza19zd2l0Y2gocHJldik7Ci0KKwlydW5xdWV1ZV90ICpycSA9IHRoaXNfcnEoKTsKKwlmaW5pc2hfdGFza19zd2l0Y2gocnEsIHByZXYpOworI2lmZGVmIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXCisJLyogSW4gdGhpcyBjYXNlLCBmaW5pc2hfdGFza19zd2l0Y2ggZG9lcyBub3QgcmVlbmFibGUgcHJlZW1wdGlvbiAqLworCXByZWVtcHRfZW5hYmxlKCk7CisjZW5kaWYKIAlpZiAoY3VycmVudC0+c2V0X2NoaWxkX3RpZCkKIAkJcHV0X3VzZXIoY3VycmVudC0+cGlkLCBjdXJyZW50LT5zZXRfY2hpbGRfdGlkKTsKIH0KQEAgLTE0OTQsNTEgKzE2ODAsNiBAQAogfQogCiAvKgotICogZmluZF9pZGxlc3RfY3B1IC0gZmluZCB0aGUgbGVhc3QgYnVzeSBydW5xdWV1ZS4KLSAqLwotc3RhdGljIGludCBmaW5kX2lkbGVzdF9jcHUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgdGhpc19jcHUsCi0JCQkgICBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvYWQsIG1pbl9sb2FkLCB0aGlzX2xvYWQ7Ci0JaW50IGksIG1pbl9jcHU7Ci0JY3B1bWFza190IG1hc2s7Ci0KLQltaW5fY3B1ID0gVUlOVF9NQVg7Ci0JbWluX2xvYWQgPSBVTE9OR19NQVg7Ci0KLQljcHVzX2FuZChtYXNrLCBzZC0+c3BhbiwgcC0+Y3B1c19hbGxvd2VkKTsKLQotCWZvcl9lYWNoX2NwdV9tYXNrKGksIG1hc2spIHsKLQkJbG9hZCA9IHRhcmdldF9sb2FkKGkpOwotCi0JCWlmIChsb2FkIDwgbWluX2xvYWQpIHsKLQkJCW1pbl9jcHUgPSBpOwotCQkJbWluX2xvYWQgPSBsb2FkOwotCi0JCQkvKiBicmVhayBvdXQgZWFybHkgb24gYW4gaWRsZSBDUFU6ICovCi0JCQlpZiAoIW1pbl9sb2FkKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogYWRkICsxIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgdGFzayAqLwotCXRoaXNfbG9hZCA9IHNvdXJjZV9sb2FkKHRoaXNfY3B1KSArIFNDSEVEX0xPQURfU0NBTEU7Ci0KLQkvKgotCSAqIFdvdWxkIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBuZXcgdGFzayB0byB0aGUKLQkgKiBjdXJyZW50IENQVSB0aGVyZSBiZSBhbiBpbWJhbGFuY2UgYmV0d2VlbiB0aGlzCi0JICogQ1BVIGFuZCB0aGUgaWRsZXN0IENQVT8KLQkgKgotCSAqIFVzZSBoYWxmIG9mIHRoZSBiYWxhbmNpbmcgdGhyZXNob2xkIC0gbmV3LWNvbnRleHQgaXMKLQkgKiBhIGdvb2Qgb3Bwb3J0dW5pdHkgdG8gYmFsYW5jZS4KLQkgKi8KLQlpZiAobWluX2xvYWQqKDEwMCArIChzZC0+aW1iYWxhbmNlX3BjdC0xMDApLzIpIDwgdGhpc19sb2FkKjEwMCkKLQkJcmV0dXJuIG1pbl9jcHU7Ci0KLQlyZXR1cm4gdGhpc19jcHU7Ci19Ci0KLS8qCiAgKiBJZiBkZXN0X2NwdSBpcyBhbGxvd2VkIGZvciB0aGlzIHByb2Nlc3MsIG1pZ3JhdGUgdGhlIHRhc2sgdG8gaXQuCiAgKiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSBmb3JjaW5nIHRoZSBjcHVfYWxsb3dlZCBtYXNrIHRvIG9ubHkKICAqIGFsbG93IGRlc3RfY3B1LCB3aGljaCB3aWxsIGZvcmNlIHRoZSBjcHUgb250byBkZXN0X2NwdS4gIFRoZW4KQEAgLTE1NzEsMzcgKzE3MTIsMTYgQEAKIH0KIAogLyoKLSAqIHNjaGVkX2V4ZWMoKTogZmluZCB0aGUgaGlnaGVzdC1sZXZlbCwgZXhlYy1iYWxhbmNlLWNhcGFibGUKLSAqIGRvbWFpbiBhbmQgdHJ5IHRvIG1pZ3JhdGUgdGhlIHRhc2sgdG8gdGhlIGxlYXN0IGxvYWRlZCBDUFUuCi0gKgotICogZXhlY3ZlKCkgaXMgYSB2YWx1YWJsZSBiYWxhbmNpbmcgb3Bwb3J0dW5pdHksIGJlY2F1c2UgYXQgdGhpcyBwb2ludAotICogdGhlIHRhc2sgaGFzIHRoZSBzbWFsbGVzdCBlZmZlY3RpdmUgbWVtb3J5IGFuZCBjYWNoZSBmb290cHJpbnQuCisgKiBzY2hlZF9leGVjIC0gZXhlY3ZlKCkgaXMgYSB2YWx1YWJsZSBiYWxhbmNpbmcgb3Bwb3J0dW5pdHksIGJlY2F1c2UgYXQKKyAqIHRoaXMgcG9pbnQgdGhlIHRhc2sgaGFzIHRoZSBzbWFsbGVzdCBlZmZlY3RpdmUgbWVtb3J5IGFuZCBjYWNoZSBmb290cHJpbnQuCiAgKi8KIHZvaWQgc2NoZWRfZXhlYyh2b2lkKQogewotCXN0cnVjdCBzY2hlZF9kb21haW4gKnRtcCwgKnNkID0gTlVMTDsKIAlpbnQgbmV3X2NwdSwgdGhpc19jcHUgPSBnZXRfY3B1KCk7Ci0KLQkvKiBQcmVmZXIgdGhlIGN1cnJlbnQgQ1BVIGlmIHRoZXJlJ3Mgb25seSB0aGlzIHRhc2sgcnVubmluZyAqLwotCWlmICh0aGlzX3JxKCktPm5yX3J1bm5pbmcgPD0gMSkKLQkJZ290byBvdXQ7Ci0KLQlmb3JfZWFjaF9kb21haW4odGhpc19jcHUsIHRtcCkKLQkJaWYgKHRtcC0+ZmxhZ3MgJiBTRF9CQUxBTkNFX0VYRUMpCi0JCQlzZCA9IHRtcDsKLQotCWlmIChzZCkgewotCQlzY2hlZHN0YXRfaW5jKHNkLCBzYmVfYXR0ZW1wdHMpOwotCQluZXdfY3B1ID0gZmluZF9pZGxlc3RfY3B1KGN1cnJlbnQsIHRoaXNfY3B1LCBzZCk7Ci0JCWlmIChuZXdfY3B1ICE9IHRoaXNfY3B1KSB7Ci0JCQlzY2hlZHN0YXRfaW5jKHNkLCBzYmVfcHVzaGVkKTsKLQkJCXB1dF9jcHUoKTsKLQkJCXNjaGVkX21pZ3JhdGVfdGFzayhjdXJyZW50LCBuZXdfY3B1KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLW91dDoKKwluZXdfY3B1ID0gc2NoZWRfYmFsYW5jZV9zZWxmKHRoaXNfY3B1LCBTRF9CQUxBTkNFX0VYRUMpOwogCXB1dF9jcHUoKTsKKwlpZiAobmV3X2NwdSAhPSB0aGlzX2NwdSkKKwkJc2NoZWRfbWlncmF0ZV90YXNrKGN1cnJlbnQsIG5ld19jcHUpOwogfQogCiAvKgpAQCAtMTYzMiw3ICsxNzUyLDcgQEAKICAqLwogc3RhdGljIGlubGluZQogaW50IGNhbl9taWdyYXRlX3Rhc2sodGFza190ICpwLCBydW5xdWV1ZV90ICpycSwgaW50IHRoaXNfY3B1LAotCQkgICAgIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBlbnVtIGlkbGVfdHlwZSBpZGxlKQorCSAgICAgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGVudW0gaWRsZV90eXBlIGlkbGUsIGludCAqYWxsX3Bpbm5lZCkKIHsKIAkvKgogCSAqIFdlIGRvIG5vdCBtaWdyYXRlIHRhc2tzIHRoYXQgYXJlOgpAQCAtMTY0MCwyMyArMTc2MCwyNCBAQAogCSAqIDIpIGNhbm5vdCBiZSBtaWdyYXRlZCB0byB0aGlzIENQVSBkdWUgdG8gY3B1c19hbGxvd2VkLCBvcgogCSAqIDMpIGFyZSBjYWNoZS1ob3Qgb24gdGhlaXIgY3VycmVudCBDUFUuCiAJICovCi0JaWYgKHRhc2tfcnVubmluZyhycSwgcCkpCi0JCXJldHVybiAwOwogCWlmICghY3B1X2lzc2V0KHRoaXNfY3B1LCBwLT5jcHVzX2FsbG93ZWQpKQogCQlyZXR1cm4gMDsKKwkqYWxsX3Bpbm5lZCA9IDA7CisKKwlpZiAodGFza19ydW5uaW5nKHJxLCBwKSkKKwkJcmV0dXJuIDA7CiAKIAkvKgogCSAqIEFnZ3Jlc3NpdmUgbWlncmF0aW9uIGlmOgotCSAqIDEpIHRoZSBbd2hvbGVdIGNwdSBpcyBpZGxlLCBvcgorCSAqIDEpIHRhc2sgaXMgY2FjaGUgY29sZCwgb3IKIAkgKiAyKSB0b28gbWFueSBiYWxhbmNlIGF0dGVtcHRzIGhhdmUgZmFpbGVkLgogCSAqLwogCi0JaWYgKGNwdV9hbmRfc2libGluZ3NfYXJlX2lkbGUodGhpc19jcHUpIHx8IFwKLQkJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA+IHNkLT5jYWNoZV9uaWNlX3RyaWVzKQorCWlmIChzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPiBzZC0+Y2FjaGVfbmljZV90cmllcykKIAkJcmV0dXJuIDE7CiAKIAlpZiAodGFza19ob3QocCwgcnEtPnRpbWVzdGFtcF9sYXN0X3RpY2ssIHNkKSkKLQkJCXJldHVybiAwOworCQlyZXR1cm4gMDsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTY2OSwxNiArMTc5MCwxOCBAQAogICovCiBzdGF0aWMgaW50IG1vdmVfdGFza3MocnVucXVldWVfdCAqdGhpc19ycSwgaW50IHRoaXNfY3B1LCBydW5xdWV1ZV90ICpidXNpZXN0LAogCQkgICAgICB1bnNpZ25lZCBsb25nIG1heF9ucl9tb3ZlLCBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwKLQkJICAgICAgZW51bSBpZGxlX3R5cGUgaWRsZSkKKwkJICAgICAgZW51bSBpZGxlX3R5cGUgaWRsZSwgaW50ICphbGxfcGlubmVkKQogewogCXByaW9fYXJyYXlfdCAqYXJyYXksICpkc3RfYXJyYXk7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgKmN1cnI7Ci0JaW50IGlkeCwgcHVsbGVkID0gMDsKKwlpbnQgaWR4LCBwdWxsZWQgPSAwLCBwaW5uZWQgPSAwOwogCXRhc2tfdCAqdG1wOwogCi0JaWYgKG1heF9ucl9tb3ZlIDw9IDAgfHwgYnVzaWVzdC0+bnJfcnVubmluZyA8PSAxKQorCWlmIChtYXhfbnJfbW92ZSA9PSAwKQogCQlnb3RvIG91dDsKIAorCXBpbm5lZCA9IDE7CisKIAkvKgogCSAqIFdlIGZpcnN0IGNvbnNpZGVyIGV4cGlyZWQgdGFza3MuIFRob3NlIHdpbGwgbGlrZWx5IG5vdCBiZQogCSAqIGV4ZWN1dGVkIGluIHRoZSBuZWFyIGZ1dHVyZSwgYW5kIHRoZXkgYXJlIG1vc3QgbGlrZWx5IHRvCkBAIC0xNzE3LDcgKzE4NDAsNyBAQAogCiAJY3VyciA9IGN1cnItPnByZXY7CiAKLQlpZiAoIWNhbl9taWdyYXRlX3Rhc2sodG1wLCBidXNpZXN0LCB0aGlzX2NwdSwgc2QsIGlkbGUpKSB7CisJaWYgKCFjYW5fbWlncmF0ZV90YXNrKHRtcCwgYnVzaWVzdCwgdGhpc19jcHUsIHNkLCBpZGxlLCAmcGlubmVkKSkgewogCQlpZiAoY3VyciAhPSBoZWFkKQogCQkJZ290byBza2lwX3F1ZXVlOwogCQlpZHgrKzsKQEAgLTE3NDYsNiArMTg2OSw5IEBACiAJICogaW5zaWRlIHB1bGxfdGFzaygpLgogCSAqLwogCXNjaGVkc3RhdF9hZGQoc2QsIGxiX2dhaW5lZFtpZGxlXSwgcHVsbGVkKTsKKworCWlmIChhbGxfcGlubmVkKQorCQkqYWxsX3Bpbm5lZCA9IHBpbm5lZDsKIAlyZXR1cm4gcHVsbGVkOwogfQogCkBAIC0xNzYwLDggKzE4ODYsMTUgQEAKIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmJ1c2llc3QgPSBOVUxMLCAqdGhpcyA9IE5VTEwsICpncm91cCA9IHNkLT5ncm91cHM7CiAJdW5zaWduZWQgbG9uZyBtYXhfbG9hZCwgYXZnX2xvYWQsIHRvdGFsX2xvYWQsIHRoaXNfbG9hZCwgdG90YWxfcHdyOworCWludCBsb2FkX2lkeDsKIAogCW1heF9sb2FkID0gdGhpc19sb2FkID0gdG90YWxfbG9hZCA9IHRvdGFsX3B3ciA9IDA7CisJaWYgKGlkbGUgPT0gTk9UX0lETEUpCisJCWxvYWRfaWR4ID0gc2QtPmJ1c3lfaWR4OworCWVsc2UgaWYgKGlkbGUgPT0gTkVXTFlfSURMRSkKKwkJbG9hZF9pZHggPSBzZC0+bmV3aWRsZV9pZHg7CisJZWxzZQorCQlsb2FkX2lkeCA9IHNkLT5pZGxlX2lkeDsKIAogCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBsb2FkOwpAQCAtMTc3Niw5ICsxOTA5LDkgQEAKIAkJZm9yX2VhY2hfY3B1X21hc2soaSwgZ3JvdXAtPmNwdW1hc2spIHsKIAkJCS8qIEJpYXMgYmFsYW5jaW5nIHRvd2FyZCBjcHVzIG9mIG91ciBkb21haW4gKi8KIAkJCWlmIChsb2NhbF9ncm91cCkKLQkJCQlsb2FkID0gdGFyZ2V0X2xvYWQoaSk7CisJCQkJbG9hZCA9IHRhcmdldF9sb2FkKGksIGxvYWRfaWR4KTsKIAkJCWVsc2UKLQkJCQlsb2FkID0gc291cmNlX2xvYWQoaSk7CisJCQkJbG9hZCA9IHNvdXJjZV9sb2FkKGksIGxvYWRfaWR4KTsKIAogCQkJYXZnX2xvYWQgKz0gbG9hZDsKIAkJfQpAQCAtMTc5MiwxMiArMTkyNSwxMCBAQAogCQlpZiAobG9jYWxfZ3JvdXApIHsKIAkJCXRoaXNfbG9hZCA9IGF2Z19sb2FkOwogCQkJdGhpcyA9IGdyb3VwOwotCQkJZ290byBuZXh0Z3JvdXA7CiAJCX0gZWxzZSBpZiAoYXZnX2xvYWQgPiBtYXhfbG9hZCkgewogCQkJbWF4X2xvYWQgPSBhdmdfbG9hZDsKIAkJCWJ1c2llc3QgPSBncm91cDsKIAkJfQotbmV4dGdyb3VwOgogCQlncm91cCA9IGdyb3VwLT5uZXh0OwogCX0gd2hpbGUgKGdyb3VwICE9IHNkLT5ncm91cHMpOwogCkBAIC0xODcwLDE1ICsyMDAxLDkgQEAKIAogCS8qIEdldCByaWQgb2YgdGhlIHNjYWxpbmcgZmFjdG9yLCByb3VuZGluZyBkb3duIGFzIHdlIGRpdmlkZSAqLwogCSppbWJhbGFuY2UgPSAqaW1iYWxhbmNlIC8gU0NIRURfTE9BRF9TQ0FMRTsKLQogCXJldHVybiBidXNpZXN0OwogCiBvdXRfYmFsYW5jZWQ6Ci0JaWYgKGJ1c2llc3QgJiYgKGlkbGUgPT0gTkVXTFlfSURMRSB8fAotCQkJKGlkbGUgPT0gU0NIRURfSURMRSAmJiBtYXhfbG9hZCA+IFNDSEVEX0xPQURfU0NBTEUpKSApIHsKLQkJKmltYmFsYW5jZSA9IDE7Ci0JCXJldHVybiBidXNpZXN0OwotCX0KIAogCSppbWJhbGFuY2UgPSAwOwogCXJldHVybiBOVUxMOwpAQCAtMTg5NCw3ICsyMDE5LDcgQEAKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2NwdV9tYXNrKGksIGdyb3VwLT5jcHVtYXNrKSB7Ci0JCWxvYWQgPSBzb3VyY2VfbG9hZChpKTsKKwkJbG9hZCA9IHNvdXJjZV9sb2FkKGksIDApOwogCiAJCWlmIChsb2FkID4gbWF4X2xvYWQpIHsKIAkJCW1heF9sb2FkID0gbG9hZDsKQEAgLTE5MDYsNiArMjAzMSwxMiBAQAogfQogCiAvKgorICogTWF4IGJhY2tvZmYgaWYgd2UgZW5jb3VudGVyIHBpbm5lZCB0YXNrcy4gUHJldHR5IGFyYml0cmFyeSB2YWx1ZSwgYnV0CisgKiBzbyBsb25nIGFzIGl0IGlzIGxhcmdlIGVub3VnaC4KKyAqLworI2RlZmluZSBNQVhfUElOTkVEX0lOVEVSVkFMCTUxMgorCisvKgogICogQ2hlY2sgdGhpc19jcHUgdG8gZW5zdXJlIGl0IGlzIGJhbGFuY2VkIHdpdGhpbiBkb21haW4uIEF0dGVtcHQgdG8gbW92ZQogICogdGFza3MgaWYgdGhlcmUgaXMgYW4gaW1iYWxhbmNlLgogICoKQEAgLTE5MTcsNyArMjA0OCw4IEBACiAJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cDsKIAlydW5xdWV1ZV90ICpidXNpZXN0OwogCXVuc2lnbmVkIGxvbmcgaW1iYWxhbmNlOwotCWludCBucl9tb3ZlZDsKKwlpbnQgbnJfbW92ZWQsIGFsbF9waW5uZWQgPSAwOworCWludCBhY3RpdmVfYmFsYW5jZSA9IDA7CiAKIAlzcGluX2xvY2soJnRoaXNfcnEtPmxvY2spOwogCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2NudFtpZGxlXSk7CkBAIC0xOTM0LDE1ICsyMDY2LDcgQEAKIAkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBiZSAiaW1wb3NzaWJsZSIsIGJ1dCBzaW5jZSBsb2FkCi0JICogYmFsYW5jaW5nIGlzIGluaGVyZW50bHkgcmFjeSBhbmQgc3RhdGlzdGljYWwsCi0JICogaXQgY291bGQgaGFwcGVuIGluIHRoZW9yeS4KLQkgKi8KLQlpZiAodW5saWtlbHkoYnVzaWVzdCA9PSB0aGlzX3JxKSkgewotCQlXQVJOX09OKDEpOwotCQlnb3RvIG91dF9iYWxhbmNlZDsKLQl9CisJQlVHX09OKGJ1c2llc3QgPT0gdGhpc19ycSk7CiAKIAlzY2hlZHN0YXRfYWRkKHNkLCBsYl9pbWJhbGFuY2VbaWRsZV0sIGltYmFsYW5jZSk7CiAKQEAgLTE5NTYsOSArMjA4MCwxNSBAQAogCQkgKi8KIAkJZG91YmxlX2xvY2tfYmFsYW5jZSh0aGlzX3JxLCBidXNpZXN0KTsKIAkJbnJfbW92ZWQgPSBtb3ZlX3Rhc2tzKHRoaXNfcnEsIHRoaXNfY3B1LCBidXNpZXN0LAotCQkJCQkJaW1iYWxhbmNlLCBzZCwgaWRsZSk7CisJCQkJCQlpbWJhbGFuY2UsIHNkLCBpZGxlLAorCQkJCQkJJmFsbF9waW5uZWQpOwogCQlzcGluX3VubG9jaygmYnVzaWVzdC0+bG9jayk7CisKKwkJLyogQWxsIHRhc2tzIG9uIHRoaXMgcnVucXVldWUgd2VyZSBwaW5uZWQgYnkgQ1BVIGFmZmluaXR5ICovCisJCWlmICh1bmxpa2VseShhbGxfcGlubmVkKSkKKwkJCWdvdG8gb3V0X2JhbGFuY2VkOwogCX0KKwogCXNwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKIAogCWlmICghbnJfbW92ZWQpIHsKQEAgLTE5NjYsMzYgKzIwOTYsMzggQEAKIAkJc2QtPm5yX2JhbGFuY2VfZmFpbGVkKys7CiAKIAkJaWYgKHVubGlrZWx5KHNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA+IHNkLT5jYWNoZV9uaWNlX3RyaWVzKzIpKSB7Ci0JCQlpbnQgd2FrZSA9IDA7CiAKIAkJCXNwaW5fbG9jaygmYnVzaWVzdC0+bG9jayk7CiAJCQlpZiAoIWJ1c2llc3QtPmFjdGl2ZV9iYWxhbmNlKSB7CiAJCQkJYnVzaWVzdC0+YWN0aXZlX2JhbGFuY2UgPSAxOwogCQkJCWJ1c2llc3QtPnB1c2hfY3B1ID0gdGhpc19jcHU7Ci0JCQkJd2FrZSA9IDE7CisJCQkJYWN0aXZlX2JhbGFuY2UgPSAxOwogCQkJfQogCQkJc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOwotCQkJaWYgKHdha2UpCisJCQlpZiAoYWN0aXZlX2JhbGFuY2UpCiAJCQkJd2FrZV91cF9wcm9jZXNzKGJ1c2llc3QtPm1pZ3JhdGlvbl90aHJlYWQpOwogCiAJCQkvKgogCQkJICogV2UndmUga2lja2VkIGFjdGl2ZSBiYWxhbmNpbmcsIHJlc2V0IHRoZSBmYWlsdXJlCiAJCQkgKiBjb3VudGVyLgogCQkJICovCi0JCQlzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPSBzZC0+Y2FjaGVfbmljZV90cmllczsKKwkJCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IHNkLT5jYWNoZV9uaWNlX3RyaWVzKzE7CiAJCX0KLQotCQkvKgotCQkgKiBXZSB3ZXJlIHVuYmFsYW5jZWQsIGJ1dCB1bnN1Y2Nlc3NmdWwgaW4gbW92ZV90YXNrcygpLAotCQkgKiBzbyBidW1wIHRoZSBiYWxhbmNlX2ludGVydmFsIHRvIGxlc3NlbiB0aGUgbG9jayBjb250ZW50aW9uLgotCQkgKi8KLQkJaWYgKHNkLT5iYWxhbmNlX2ludGVydmFsIDwgc2QtPm1heF9pbnRlcnZhbCkKLQkJCXNkLT5iYWxhbmNlX2ludGVydmFsKys7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJc2QtPm5yX2JhbGFuY2VfZmFpbGVkID0gMDsKIAorCWlmIChsaWtlbHkoIWFjdGl2ZV9iYWxhbmNlKSkgewogCQkvKiBXZSB3ZXJlIHVuYmFsYW5jZWQsIHNvIHJlc2V0IHRoZSBiYWxhbmNpbmcgaW50ZXJ2YWwgKi8KIAkJc2QtPmJhbGFuY2VfaW50ZXJ2YWwgPSBzZC0+bWluX2ludGVydmFsOworCX0gZWxzZSB7CisJCS8qCisJCSAqIElmIHdlJ3ZlIGJlZ3VuIGFjdGl2ZSBiYWxhbmNpbmcsIHN0YXJ0IHRvIGJhY2sgb2ZmLiBUaGlzCisJCSAqIGNhc2UgbWF5IG5vdCBiZSBjb3ZlcmVkIGJ5IHRoZSBhbGxfcGlubmVkIGxvZ2ljIGlmIHRoZXJlCisJCSAqIGlzIG9ubHkgMSB0YXNrIG9uIHRoZSBidXN5IHJ1bnF1ZXVlIChiZWNhdXNlIHdlIGRvbid0IGNhbGwKKwkJICogbW92ZV90YXNrcykuCisJCSAqLworCQlpZiAoc2QtPmJhbGFuY2VfaW50ZXJ2YWwgPCBzZC0+bWF4X2ludGVydmFsKQorCQkJc2QtPmJhbGFuY2VfaW50ZXJ2YWwgKj0gMjsKIAl9CiAKIAlyZXR1cm4gbnJfbW92ZWQ7CkBAIC0yMDA1LDggKzIxMzcsMTAgQEAKIAogCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2JhbGFuY2VkW2lkbGVdKTsKIAorCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CiAJLyogdHVuZSB1cCB0aGUgYmFsYW5jaW5nIGludGVydmFsICovCi0JaWYgKHNkLT5iYWxhbmNlX2ludGVydmFsIDwgc2QtPm1heF9pbnRlcnZhbCkKKwlpZiAoKGFsbF9waW5uZWQgJiYgc2QtPmJhbGFuY2VfaW50ZXJ2YWwgPCBNQVhfUElOTkVEX0lOVEVSVkFMKSB8fAorCQkJKHNkLT5iYWxhbmNlX2ludGVydmFsIDwgc2QtPm1heF9pbnRlcnZhbCkpCiAJCXNkLT5iYWxhbmNlX2ludGVydmFsICo9IDI7CiAKIAlyZXR1cm4gMDsKQEAgLTIwMzAsMzEgKzIxNjQsMzYgQEAKIAlzY2hlZHN0YXRfaW5jKHNkLCBsYl9jbnRbTkVXTFlfSURMRV0pOwogCWdyb3VwID0gZmluZF9idXNpZXN0X2dyb3VwKHNkLCB0aGlzX2NwdSwgJmltYmFsYW5jZSwgTkVXTFlfSURMRSk7CiAJaWYgKCFncm91cCkgewotCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9iYWxhbmNlZFtORVdMWV9JRExFXSk7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeWdbTkVXTFlfSURMRV0pOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCiAJYnVzaWVzdCA9IGZpbmRfYnVzaWVzdF9xdWV1ZShncm91cCk7Ci0JaWYgKCFidXNpZXN0IHx8IGJ1c2llc3QgPT0gdGhpc19ycSkgewotCQlzY2hlZHN0YXRfaW5jKHNkLCBsYl9iYWxhbmNlZFtORVdMWV9JRExFXSk7CisJaWYgKCFidXNpZXN0KSB7CiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX25vYnVzeXFbTkVXTFlfSURMRV0pOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfYmFsYW5jZWQ7CiAJfQogCisJQlVHX09OKGJ1c2llc3QgPT0gdGhpc19ycSk7CisKIAkvKiBBdHRlbXB0IHRvIG1vdmUgdGFza3MgKi8KIAlkb3VibGVfbG9ja19iYWxhbmNlKHRoaXNfcnEsIGJ1c2llc3QpOwogCiAJc2NoZWRzdGF0X2FkZChzZCwgbGJfaW1iYWxhbmNlW05FV0xZX0lETEVdLCBpbWJhbGFuY2UpOwogCW5yX21vdmVkID0gbW92ZV90YXNrcyh0aGlzX3JxLCB0aGlzX2NwdSwgYnVzaWVzdCwKLQkJCQkJaW1iYWxhbmNlLCBzZCwgTkVXTFlfSURMRSk7CisJCQkJCWltYmFsYW5jZSwgc2QsIE5FV0xZX0lETEUsIE5VTEwpOwogCWlmICghbnJfbW92ZWQpCiAJCXNjaGVkc3RhdF9pbmMoc2QsIGxiX2ZhaWxlZFtORVdMWV9JRExFXSk7CisJZWxzZQorCQlzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPSAwOwogCiAJc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOwotCi1vdXQ6CiAJcmV0dXJuIG5yX21vdmVkOworCitvdXRfYmFsYW5jZWQ6CisJc2NoZWRzdGF0X2luYyhzZCwgbGJfYmFsYW5jZWRbTkVXTFlfSURMRV0pOworCXNkLT5ucl9iYWxhbmNlX2ZhaWxlZCA9IDA7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMDg2LDU2ICsyMjI1LDQyIEBACiBzdGF0aWMgdm9pZCBhY3RpdmVfbG9hZF9iYWxhbmNlKHJ1bnF1ZXVlX3QgKmJ1c2llc3RfcnEsIGludCBidXNpZXN0X2NwdSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmNwdV9ncm91cDsKIAlydW5xdWV1ZV90ICp0YXJnZXRfcnE7Ci0JY3B1bWFza190IHZpc2l0ZWRfY3B1czsKLQlpbnQgY3B1OworCWludCB0YXJnZXRfY3B1ID0gYnVzaWVzdF9ycS0+cHVzaF9jcHU7CisKKwlpZiAoYnVzaWVzdF9ycS0+bnJfcnVubmluZyA8PSAxKQorCQkvKiBubyB0YXNrIHRvIG1vdmUgKi8KKwkJcmV0dXJuOworCisJdGFyZ2V0X3JxID0gY3B1X3JxKHRhcmdldF9jcHUpOwogCiAJLyoKLQkgKiBTZWFyY2ggZm9yIHN1aXRhYmxlIENQVXMgdG8gcHVzaCB0YXNrcyB0byBpbiBzdWNjZXNzaXZlbHkgaGlnaGVyCi0JICogZG9tYWlucyB3aXRoIFNEX0xPQURfQkFMQU5DRSBzZXQuCisJICogVGhpcyBjb25kaXRpb24gaXMgImltcG9zc2libGUiLCBpZiBpdCBvY2N1cnMKKwkgKiB3ZSBuZWVkIHRvIGZpeCBpdC4gIE9yaWdpbmFsbHkgcmVwb3J0ZWQgYnkKKwkgKiBCam9ybiBIZWxnYWFzIG9uIGEgMTI4LWNwdSBzZXR1cC4KIAkgKi8KLQl2aXNpdGVkX2NwdXMgPSBDUFVfTUFTS19OT05FOwotCWZvcl9lYWNoX2RvbWFpbihidXNpZXN0X2NwdSwgc2QpIHsKLQkJaWYgKCEoc2QtPmZsYWdzICYgU0RfTE9BRF9CQUxBTkNFKSkKLQkJCS8qIG5vIG1vcmUgZG9tYWlucyB0byBzZWFyY2ggKi8KLQkJCWJyZWFrOworCUJVR19PTihidXNpZXN0X3JxID09IHRhcmdldF9ycSk7CiAKLQkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX2NudCk7CisJLyogbW92ZSBhIHRhc2sgZnJvbSBidXNpZXN0X3JxIHRvIHRhcmdldF9ycSAqLworCWRvdWJsZV9sb2NrX2JhbGFuY2UoYnVzaWVzdF9ycSwgdGFyZ2V0X3JxKTsKIAotCQljcHVfZ3JvdXAgPSBzZC0+Z3JvdXBzOwotCQlkbyB7Ci0JCQlmb3JfZWFjaF9jcHVfbWFzayhjcHUsIGNwdV9ncm91cC0+Y3B1bWFzaykgewotCQkJCWlmIChidXNpZXN0X3JxLT5ucl9ydW5uaW5nIDw9IDEpCi0JCQkJCS8qIG5vIG1vcmUgdGFza3MgbGVmdCB0byBtb3ZlICovCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoY3B1X2lzc2V0KGNwdSwgdmlzaXRlZF9jcHVzKSkKLQkJCQkJY29udGludWU7Ci0JCQkJY3B1X3NldChjcHUsIHZpc2l0ZWRfY3B1cyk7Ci0JCQkJaWYgKCFjcHVfYW5kX3NpYmxpbmdzX2FyZV9pZGxlKGNwdSkgfHwgY3B1ID09IGJ1c2llc3RfY3B1KQotCQkJCQljb250aW51ZTsKKwkvKiBTZWFyY2ggZm9yIGFuIHNkIHNwYW5uaW5nIHVzIGFuZCB0aGUgdGFyZ2V0IENQVS4gKi8KKwlmb3JfZWFjaF9kb21haW4odGFyZ2V0X2NwdSwgc2QpCisJCWlmICgoc2QtPmZsYWdzICYgU0RfTE9BRF9CQUxBTkNFKSAmJgorCQkJY3B1X2lzc2V0KGJ1c2llc3RfY3B1LCBzZC0+c3BhbikpCisJCQkJYnJlYWs7CiAKLQkJCQl0YXJnZXRfcnEgPSBjcHVfcnEoY3B1KTsKLQkJCQkvKgotCQkJCSAqIFRoaXMgY29uZGl0aW9uIGlzICJpbXBvc3NpYmxlIiwgaWYgaXQgb2NjdXJzCi0JCQkJICogd2UgbmVlZCB0byBmaXggaXQuICBPcmlnaW5hbGx5IHJlcG9ydGVkIGJ5Ci0JCQkJICogQmpvcm4gSGVsZ2FhcyBvbiBhIDEyOC1jcHUgc2V0dXAuCi0JCQkJICovCi0JCQkJQlVHX09OKGJ1c2llc3RfcnEgPT0gdGFyZ2V0X3JxKTsKKwlpZiAodW5saWtlbHkoc2QgPT0gTlVMTCkpCisJCWdvdG8gb3V0OwogCi0JCQkJLyogbW92ZSBhIHRhc2sgZnJvbSBidXNpZXN0X3JxIHRvIHRhcmdldF9ycSAqLwotCQkJCWRvdWJsZV9sb2NrX2JhbGFuY2UoYnVzaWVzdF9ycSwgdGFyZ2V0X3JxKTsKLQkJCQlpZiAobW92ZV90YXNrcyh0YXJnZXRfcnEsIGNwdSwgYnVzaWVzdF9ycSwKLQkJCQkJCTEsIHNkLCBTQ0hFRF9JRExFKSkgewotCQkJCQlzY2hlZHN0YXRfaW5jKHNkLCBhbGJfcHVzaGVkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzY2hlZHN0YXRfaW5jKHNkLCBhbGJfZmFpbGVkKTsKLQkJCQl9Ci0JCQkJc3Bpbl91bmxvY2soJnRhcmdldF9ycS0+bG9jayk7Ci0JCQl9Ci0JCQljcHVfZ3JvdXAgPSBjcHVfZ3JvdXAtPm5leHQ7Ci0JCX0gd2hpbGUgKGNwdV9ncm91cCAhPSBzZC0+Z3JvdXBzKTsKLQl9CisJc2NoZWRzdGF0X2luYyhzZCwgYWxiX2NudCk7CisKKwlpZiAobW92ZV90YXNrcyh0YXJnZXRfcnEsIHRhcmdldF9jcHUsIGJ1c2llc3RfcnEsIDEsIHNkLCBTQ0hFRF9JRExFLCBOVUxMKSkKKwkJc2NoZWRzdGF0X2luYyhzZCwgYWxiX3B1c2hlZCk7CisJZWxzZQorCQlzY2hlZHN0YXRfaW5jKHNkLCBhbGJfZmFpbGVkKTsKK291dDoKKwlzcGluX3VubG9jaygmdGFyZ2V0X3JxLT5sb2NrKTsKIH0KIAogLyoKQEAgLTIxNTYsMTggKzIyODEsMjMgQEAKIAl1bnNpZ25lZCBsb25nIG9sZF9sb2FkLCB0aGlzX2xvYWQ7CiAJdW5zaWduZWQgbG9uZyBqID0gamlmZmllcyArIENQVV9PRkZTRVQodGhpc19jcHUpOwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCWludCBpOwogCi0JLyogVXBkYXRlIG91ciBsb2FkICovCi0Jb2xkX2xvYWQgPSB0aGlzX3JxLT5jcHVfbG9hZDsKIAl0aGlzX2xvYWQgPSB0aGlzX3JxLT5ucl9ydW5uaW5nICogU0NIRURfTE9BRF9TQ0FMRTsKLQkvKgotCSAqIFJvdW5kIHVwIHRoZSBhdmVyYWdpbmcgZGl2aXNpb24gaWYgbG9hZCBpcyBpbmNyZWFzaW5nLiBUaGlzCi0JICogcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nIHN0dWNrIG9uIDkgaWYgdGhlIGxvYWQgaXMgMTAsIGZvcgotCSAqIGV4YW1wbGUuCi0JICovCi0JaWYgKHRoaXNfbG9hZCA+IG9sZF9sb2FkKQotCQlvbGRfbG9hZCsrOwotCXRoaXNfcnEtPmNwdV9sb2FkID0gKG9sZF9sb2FkICsgdGhpc19sb2FkKSAvIDI7CisJLyogVXBkYXRlIG91ciBsb2FkICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIG5ld19sb2FkID0gdGhpc19sb2FkOworCQlpbnQgc2NhbGUgPSAxIDw8IGk7CisJCW9sZF9sb2FkID0gdGhpc19ycS0+Y3B1X2xvYWRbaV07CisJCS8qCisJCSAqIFJvdW5kIHVwIHRoZSBhdmVyYWdpbmcgZGl2aXNpb24gaWYgbG9hZCBpcyBpbmNyZWFzaW5nLiBUaGlzCisJCSAqIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZyBzdHVjayBvbiA5IGlmIHRoZSBsb2FkIGlzIDEwLCBmb3IKKwkJICogZXhhbXBsZS4KKwkJICovCisJCWlmIChuZXdfbG9hZCA+IG9sZF9sb2FkKQorCQkJbmV3X2xvYWQgKz0gc2NhbGUtMTsKKwkJdGhpc19ycS0+Y3B1X2xvYWRbaV0gPSAob2xkX2xvYWQqKHNjYWxlLTEpICsgbmV3X2xvYWQpIC8gc2NhbGU7CisJfQogCiAJZm9yX2VhY2hfZG9tYWluKHRoaXNfY3B1LCBzZCkgewogCQl1bnNpZ25lZCBsb25nIGludGVydmFsOwpAQCAtMjQ0NywxMSArMjU3NywxNSBAQAogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWtlX3NsZWVwaW5nX2RlcGVuZGVudChpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCiB7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSB0aGlzX3JxLT5zZDsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0bXAsICpzZCA9IE5VTEw7CiAJY3B1bWFza190IHNpYmxpbmdfbWFwOwogCWludCBpOwogCi0JaWYgKCEoc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpKQorCWZvcl9lYWNoX2RvbWFpbih0aGlzX2NwdSwgdG1wKQorCQlpZiAodG1wLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKQorCQkJc2QgPSB0bXA7CisKKwlpZiAoIXNkKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtMjQ5MiwxMyArMjYyNiwxNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBkZXBlbmRlbnRfc2xlZXBlcihpbnQgdGhpc19jcHUsIHJ1bnF1ZXVlX3QgKnRoaXNfcnEpCiB7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSB0aGlzX3JxLT5zZDsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0bXAsICpzZCA9IE5VTEw7CiAJY3B1bWFza190IHNpYmxpbmdfbWFwOwogCXByaW9fYXJyYXlfdCAqYXJyYXk7CiAJaW50IHJldCA9IDAsIGk7CiAJdGFza190ICpwOwogCi0JaWYgKCEoc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVUE9XRVIpKQorCWZvcl9lYWNoX2RvbWFpbih0aGlzX2NwdSwgdG1wKQorCQlpZiAodG1wLT5mbGFncyAmIFNEX1NIQVJFX0NQVVBPV0VSKQorCQkJc2QgPSB0bXA7CisKKwlpZiAoIXNkKQogCQlyZXR1cm4gMDsKIAogCS8qCkBAIC0yNjEzLDcgKzI3NTEsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnF1ZXVlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CiAJdW5zaWduZWQgbG9uZyBydW5fdGltZTsKLQlpbnQgY3B1LCBpZHg7CisJaW50IGNwdSwgaWR4LCBuZXdfcHJpbzsKIAogCS8qCiAJICogVGVzdCBpZiB3ZSBhcmUgYXRvbWljLiAgU2luY2UgZG9fZXhpdCgpIG5lZWRzIHRvIGNhbGwgaW50bwpAQCAtMjczNSw5ICsyODczLDE0IEBACiAJCQlkZWx0YSA9IGRlbHRhICogKE9OX1JVTlFVRVVFX1dFSUdIVCAqIDEyOCAvIDEwMCkgLyAxMjg7CiAKIAkJYXJyYXkgPSBuZXh0LT5hcnJheTsKLQkJZGVxdWV1ZV90YXNrKG5leHQsIGFycmF5KTsKLQkJcmVjYWxjX3Rhc2tfcHJpbyhuZXh0LCBuZXh0LT50aW1lc3RhbXAgKyBkZWx0YSk7Ci0JCWVucXVldWVfdGFzayhuZXh0LCBhcnJheSk7CisJCW5ld19wcmlvID0gcmVjYWxjX3Rhc2tfcHJpbyhuZXh0LCBuZXh0LT50aW1lc3RhbXAgKyBkZWx0YSk7CisKKwkJaWYgKHVubGlrZWx5KG5leHQtPnByaW8gIT0gbmV3X3ByaW8pKSB7CisJCQlkZXF1ZXVlX3Rhc2sobmV4dCwgYXJyYXkpOworCQkJbmV4dC0+cHJpbyA9IG5ld19wcmlvOworCQkJZW5xdWV1ZV90YXNrKG5leHQsIGFycmF5KTsKKwkJfSBlbHNlCisJCQlyZXF1ZXVlX3Rhc2sobmV4dCwgYXJyYXkpOwogCX0KIAluZXh0LT5hY3RpdmF0ZWQgPSAwOwogc3dpdGNoX3Rhc2tzOgpAQCAtMjc2MSwxMSArMjkwNCwxNSBAQAogCQlycS0+Y3VyciA9IG5leHQ7CiAJCSsrKnN3aXRjaF9jb3VudDsKIAotCQlwcmVwYXJlX2FyY2hfc3dpdGNoKHJxLCBuZXh0KTsKKwkJcHJlcGFyZV90YXNrX3N3aXRjaChycSwgbmV4dCk7CiAJCXByZXYgPSBjb250ZXh0X3N3aXRjaChycSwgcHJldiwgbmV4dCk7CiAJCWJhcnJpZXIoKTsKLQotCQlmaW5pc2hfdGFza19zd2l0Y2gocHJldik7CisJCS8qCisJCSAqIHRoaXNfcnEgbXVzdCBiZSBldmFsdWF0ZWQgYWdhaW4gYmVjYXVzZSBwcmV2IG1heSBoYXZlIG1vdmVkCisJCSAqIENQVXMgc2luY2UgaXQgY2FsbGVkIHNjaGVkdWxlKCksIHRodXMgdGhlICdycScgb24gaXRzIHN0YWNrCisJCSAqIGZyYW1lIHdpbGwgYmUgaW52YWxpZC4KKwkJICovCisJCWZpbmlzaF90YXNrX3N3aXRjaCh0aGlzX3JxKCksIHByZXYpOwogCX0gZWxzZQogCQlzcGluX3VubG9ja19pcnEoJnJxLT5sb2NrKTsKIApAQCAtMzMwMSwxNSArMzQ0OCw3IEBACiB7CiAJcmV0dXJuIFRBU0tfTklDRShwKTsKIH0KLQotLyoKLSAqIFRoZSBvbmx5IHVzZXJzIG9mIHRhc2tfbmljZSBhcmUgYmluZm10X2VsZiBhbmQgYmluZm10X2VsZjMyLgotICogYmluZm10X2VsZiBpcyBubyBsb25nZXIgbW9kdWxhciwgYnV0IGJpbmZtdF9lbGYzMiBzdGlsbCBpcy4KLSAqIFRoZXJlZm9yZSwgdGFza19uaWNlIGlzIG5lZWRlZCBpZiB0aGVyZSBpcyBhIGNvbXBhdF9tb2RlLgotICovCi0jaWZkZWYgQ09ORklHX0NPTVBBVAogRVhQT1JUX1NZTUJPTF9HUEwodGFza19uaWNlKTsKLSNlbmRpZgogCiAvKioKICAqIGlkbGVfY3B1IC0gaXMgYSBnaXZlbiBjcHUgaWRsZSBjdXJyZW50bHk/CkBAIC0zMzg0LDEzICszNTIzLDI0IEBACiAJaWYgKChwb2xpY3kgPT0gU0NIRURfTk9STUFMKSAhPSAocGFyYW0tPnNjaGVkX3ByaW9yaXR5ID09IDApKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICgocG9saWN5ID09IFNDSEVEX0ZJRk8gfHwgcG9saWN5ID09IFNDSEVEX1JSKSAmJgotCSAgICBwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBwLT5zaWduYWwtPnJsaW1bUkxJTUlUX1JUUFJJT10ucmxpbV9jdXIgJiYKLQkgICAgIWNhcGFibGUoQ0FQX1NZU19OSUNFKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQlpZiAoKGN1cnJlbnQtPmV1aWQgIT0gcC0+ZXVpZCkgJiYgKGN1cnJlbnQtPmV1aWQgIT0gcC0+dWlkKSAmJgotCSAgICAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKQotCQlyZXR1cm4gLUVQRVJNOworCS8qCisJICogQWxsb3cgdW5wcml2aWxlZ2VkIFJUIHRhc2tzIHRvIGRlY3JlYXNlIHByaW9yaXR5OgorCSAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX05JQ0UpKSB7CisJCS8qIGNhbid0IGNoYW5nZSBwb2xpY3kgKi8KKwkJaWYgKHBvbGljeSAhPSBwLT5wb2xpY3kpCisJCQlyZXR1cm4gLUVQRVJNOworCQkvKiBjYW4ndCBpbmNyZWFzZSBwcmlvcml0eSAqLworCQlpZiAocG9saWN5ICE9IFNDSEVEX05PUk1BTCAmJgorCQkgICAgcGFyYW0tPnNjaGVkX3ByaW9yaXR5ID4gcC0+cnRfcHJpb3JpdHkgJiYKKwkJICAgIHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+CisJCQkJcC0+c2lnbmFsLT5ybGltW1JMSU1JVF9SVFBSSU9dLnJsaW1fY3VyKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJLyogY2FuJ3QgY2hhbmdlIG90aGVyIHVzZXIncyBwcmlvcml0aWVzICovCisJCWlmICgoY3VycmVudC0+ZXVpZCAhPSBwLT5ldWlkKSAmJgorCQkgICAgKGN1cnJlbnQtPmV1aWQgIT0gcC0+dWlkKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQogCiAJcmV0dmFsID0gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIocCwgcG9saWN5LCBwYXJhbSk7CiAJaWYgKHJldHZhbCkKQEAgLTM3MjcsNiArMzg3NywxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19jb25kX3Jlc2NoZWQodm9pZCkKIHsKKwkvKgorCSAqIFRoZSBCS1MgbWlnaHQgYmUgcmVhY3F1aXJlZCBiZWZvcmUgd2UgaGF2ZSBkcm9wcGVkCisJICogUFJFRU1QVF9BQ1RJVkUsIHdoaWNoIGNvdWxkIHRyaWdnZXIgYSBzZWNvbmQKKwkgKiBjb25kX3Jlc2NoZWQoKSBjYWxsLgorCSAqLworCWlmICh1bmxpa2VseShwcmVlbXB0X2NvdW50KCkpKQorCQlyZXR1cm47CiAJZG8gewogCQlhZGRfcHJlZW1wdF9jb3VudChQUkVFTVBUX0FDVElWRSk7CiAJCXNjaGVkdWxlKCk7CkBAIC00MDE2LDYgKzQxNzMsMTQgQEAKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiB9CiAKKy8qKgorICogaW5pdF9pZGxlIC0gc2V0IHVwIGFuIGlkbGUgdGhyZWFkIGZvciBhIGdpdmVuIENQVQorICogQGlkbGU6IHRhc2sgaW4gcXVlc3Rpb24KKyAqIEBjcHU6IGNwdSB0aGUgaWRsZSB0YXNrIGJlbG9uZ3MgdG8KKyAqCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNldCB0aGUgaWRsZSB0aHJlYWQncyBORUVEX1JFU0NIRUQKKyAqIGZsYWcsIHRvIG1ha2UgYm9vdGluZyBtb3JlIHJvYnVzdC4KKyAqLwogdm9pZCBfX2RldmluaXQgaW5pdF9pZGxlKHRhc2tfdCAqaWRsZSwgaW50IGNwdSkKIHsKIAlydW5xdWV1ZV90ICpycSA9IGNwdV9ycShjcHUpOwpAQCAtNDAzMCw3ICs0MTk1LDkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOwogCXJxLT5jdXJyID0gcnEtPmlkbGUgPSBpZGxlOwotCXNldF90c2tfbmVlZF9yZXNjaGVkKGlkbGUpOworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVykKKwlpZGxlLT5vbmNwdSA9IDE7CisjZW5kaWYKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOwogCiAJLyogU2V0IHRoZSBwcmVlbXB0IGNvdW50IF9vdXRzaWRlXyB0aGUgc3BpbmxvY2tzISAqLwpAQCAtNDE3NCw4ICs0MzQxLDcgQEAKIAkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKIAkJbWlncmF0aW9uX3JlcV90ICpyZXE7CiAKLQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKQotCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAogCQlzcGluX2xvY2tfaXJxKCZycS0+bG9jayk7CiAKQEAgLTQyMDAsMTcgKzQzNjYsOSBAQAogCQlyZXEgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIG1pZ3JhdGlvbl9yZXFfdCwgbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoaGVhZC0+bmV4dCk7CiAKLQkJaWYgKHJlcS0+dHlwZSA9PSBSRVFfTU9WRV9UQVNLKSB7Ci0JCQlzcGluX3VubG9jaygmcnEtPmxvY2spOwotCQkJX19taWdyYXRlX3Rhc2socmVxLT50YXNrLCBjcHUsIHJlcS0+ZGVzdF9jcHUpOwotCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQl9IGVsc2UgaWYgKHJlcS0+dHlwZSA9PSBSRVFfU0VUX0RPTUFJTikgewotCQkJcnEtPnNkID0gcmVxLT5zZDsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcnEtPmxvY2spOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxKCZycS0+bG9jayk7Ci0JCQlXQVJOX09OKDEpOwotCQl9CisJCXNwaW5fdW5sb2NrKCZycS0+bG9jayk7CisJCV9fbWlncmF0ZV90YXNrKHJlcS0+dGFzaywgY3B1LCByZXEtPmRlc3RfY3B1KTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJCWNvbXBsZXRlKCZyZXEtPmRvbmUpOwogCX0KQEAgLTQ0NDEsNyArNDU5OSw2IEBACiAJCQltaWdyYXRpb25fcmVxX3QgKnJlcTsKIAkJCXJlcSA9IGxpc3RfZW50cnkocnEtPm1pZ3JhdGlvbl9xdWV1ZS5uZXh0LAogCQkJCQkgbWlncmF0aW9uX3JlcV90LCBsaXN0KTsKLQkJCUJVR19PTihyZXEtPnR5cGUgIT0gUkVRX01PVkVfVEFTSyk7CiAJCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwogCQkJY29tcGxldGUoJnJlcS0+ZG9uZSk7CiAJCX0KQEAgLTQ0NzIsMTIgKzQ2MjksMTcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBTQ0hFRF9ET01BSU5fREVCVUcKKyN1bmRlZiBTQ0hFRF9ET01BSU5fREVCVUcKICNpZmRlZiBTQ0hFRF9ET01BSU5fREVCVUcKIHN0YXRpYyB2b2lkIHNjaGVkX2RvbWFpbl9kZWJ1ZyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAlpbnQgbGV2ZWwgPSAwOwogCisJaWYgKCFzZCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiQ1BVJWQgYXR0YWNoaW5nIE5VTEwgc2NoZWQtZG9tYWluLlxuIiwgY3B1KTsKKwkJcmV0dXJuOworCX0KKwogCXByaW50ayhLRVJOX0RFQlVHICJDUFUlZCBhdHRhY2hpbmcgc2NoZWQtZG9tYWluOlxuIiwgY3B1KTsKIAogCWRvIHsKQEAgLTQ1NjAsMzcgKzQ3MjIsODEgQEAKICNkZWZpbmUgc2NoZWRfZG9tYWluX2RlYnVnKHNkLCBjcHUpIHt9CiAjZW5kaWYKIAorc3RhdGljIGludCBzZF9kZWdlbmVyYXRlKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQoreworCWlmIChjcHVzX3dlaWdodChzZC0+c3BhbikgPT0gMSkKKwkJcmV0dXJuIDE7CisKKwkvKiBGb2xsb3dpbmcgZmxhZ3MgbmVlZCBhdCBsZWFzdCAyIGdyb3VwcyAqLworCWlmIChzZC0+ZmxhZ3MgJiAoU0RfTE9BRF9CQUxBTkNFIHwKKwkJCSBTRF9CQUxBTkNFX05FV0lETEUgfAorCQkJIFNEX0JBTEFOQ0VfRk9SSyB8CisJCQkgU0RfQkFMQU5DRV9FWEVDKSkgeworCQlpZiAoc2QtPmdyb3VwcyAhPSBzZC0+Z3JvdXBzLT5uZXh0KQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogRm9sbG93aW5nIGZsYWdzIGRvbid0IHVzZSBncm91cHMgKi8KKwlpZiAoc2QtPmZsYWdzICYgKFNEX1dBS0VfSURMRSB8CisJCQkgU0RfV0FLRV9BRkZJTkUgfAorCQkJIFNEX1dBS0VfQkFMQU5DRSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2RfcGFyZW50X2RlZ2VuZXJhdGUoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsCisJCQkJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpwYXJlbnQpCit7CisJdW5zaWduZWQgbG9uZyBjZmxhZ3MgPSBzZC0+ZmxhZ3MsIHBmbGFncyA9IHBhcmVudC0+ZmxhZ3M7CisKKwlpZiAoc2RfZGVnZW5lcmF0ZShwYXJlbnQpKQorCQlyZXR1cm4gMTsKKworCWlmICghY3B1c19lcXVhbChzZC0+c3BhbiwgcGFyZW50LT5zcGFuKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEb2VzIHBhcmVudCBjb250YWluIGZsYWdzIG5vdCBpbiBjaGlsZD8gKi8KKwkvKiBXQUtFX0JBTEFOQ0UgaXMgYSBzdWJzZXQgb2YgV0FLRV9BRkZJTkUgKi8KKwlpZiAoY2ZsYWdzICYgU0RfV0FLRV9BRkZJTkUpCisJCXBmbGFncyAmPSB+U0RfV0FLRV9CQUxBTkNFOworCS8qIEZsYWdzIG5lZWRpbmcgZ3JvdXBzIGRvbid0IGNvdW50IGlmIG9ubHkgMSBncm91cCBpbiBwYXJlbnQgKi8KKwlpZiAocGFyZW50LT5ncm91cHMgPT0gcGFyZW50LT5ncm91cHMtPm5leHQpIHsKKwkJcGZsYWdzICY9IH4oU0RfTE9BRF9CQUxBTkNFIHwKKwkJCQlTRF9CQUxBTkNFX05FV0lETEUgfAorCQkJCVNEX0JBTEFOQ0VfRk9SSyB8CisJCQkJU0RfQkFMQU5DRV9FWEVDKTsKKwl9CisJaWYgKH5jZmxhZ3MgJiBwZmxhZ3MpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKIC8qCiAgKiBBdHRhY2ggdGhlIGRvbWFpbiAnc2QnIHRvICdjcHUnIGFzIGl0cyBiYXNlIGRvbWFpbi4gIENhbGxlcnMgbXVzdAogICogaG9sZCB0aGUgaG90cGx1ZyBsb2NrLgogICovCi12b2lkIF9fZGV2aW5pdCBjcHVfYXR0YWNoX2RvbWFpbihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3ZvaWQgY3B1X2F0dGFjaF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCiB7Ci0JbWlncmF0aW9uX3JlcV90IHJlcTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXJ1bnF1ZXVlX3QgKnJxID0gY3B1X3JxKGNwdSk7Ci0JaW50IGxvY2FsID0gMTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICp0bXA7CisKKwkvKiBSZW1vdmUgdGhlIHNjaGVkIGRvbWFpbnMgd2hpY2ggZG8gbm90IGNvbnRyaWJ1dGUgdG8gc2NoZWR1bGluZy4gKi8KKwlmb3IgKHRtcCA9IHNkOyB0bXA7IHRtcCA9IHRtcC0+cGFyZW50KSB7CisJCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCA9IHRtcC0+cGFyZW50OworCQlpZiAoIXBhcmVudCkKKwkJCWJyZWFrOworCQlpZiAoc2RfcGFyZW50X2RlZ2VuZXJhdGUodG1wLCBwYXJlbnQpKQorCQkJdG1wLT5wYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwl9CisKKwlpZiAoc2QgJiYgc2RfZGVnZW5lcmF0ZShzZCkpCisJCXNkID0gc2QtPnBhcmVudDsKIAogCXNjaGVkX2RvbWFpbl9kZWJ1ZyhzZCwgY3B1KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkgfHwgIWNwdV9vbmxpbmUoY3B1KSkgewotCQlycS0+c2QgPSBzZDsKLQl9IGVsc2UgewotCQlpbml0X2NvbXBsZXRpb24oJnJlcS5kb25lKTsKLQkJcmVxLnR5cGUgPSBSRVFfU0VUX0RPTUFJTjsKLQkJcmVxLnNkID0gc2Q7Ci0JCWxpc3RfYWRkKCZyZXEubGlzdCwgJnJxLT5taWdyYXRpb25fcXVldWUpOwotCQlsb2NhbCA9IDA7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKLQotCWlmICghbG9jYWwpIHsKLQkJd2FrZV91cF9wcm9jZXNzKHJxLT5taWdyYXRpb25fdGhyZWFkKTsKLQkJd2FpdF9mb3JfY29tcGxldGlvbigmcmVxLmRvbmUpOwotCX0KKwlyY3VfYXNzaWduX3BvaW50ZXIocnEtPnNkLCBzZCk7CiB9CiAKIC8qIGNwdXMgd2l0aCBpc29sYXRlZCBkb21haW5zICovCkBAIC00NjIyLDcgKzQ4MjgsNyBAQAogICogY292ZXJlZCBieSB0aGUgZ2l2ZW4gc3BhbiwgYW5kIHdpbGwgc2V0IGVhY2ggZ3JvdXAncyAtPmNwdW1hc2sgY29ycmVjdGx5LAogICogYW5kIC0+Y3B1X3Bvd2VyIHRvIDAuCiAgKi8KLXZvaWQgX19kZXZpbml0IGluaXRfc2NoZWRfYnVpbGRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9ncm91cCBncm91cHNbXSwKK3ZvaWQgaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc3RydWN0IHNjaGVkX2dyb3VwIGdyb3Vwc1tdLAogCQkJY3B1bWFza190IHNwYW4sIGludCAoKmdyb3VwX2ZuKShpbnQgY3B1KSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmZpcnN0ID0gTlVMTCwgKmxhc3QgPSBOVUxMOwpAQCAtNDY1OCwxMyArNDg2NCwxNCBAQAogCiAKICNpZmRlZiBBUkNIX0hBU19TQ0hFRF9ET01BSU4KLWV4dGVybiB2b2lkIF9fZGV2aW5pdCBhcmNoX2luaXRfc2NoZWRfZG9tYWlucyh2b2lkKTsKLWV4dGVybiB2b2lkIF9fZGV2aW5pdCBhcmNoX2Rlc3Ryb3lfc2NoZWRfZG9tYWlucyh2b2lkKTsKK2V4dGVybiB2b2lkIGJ1aWxkX3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKTsKK2V4dGVybiB2b2lkIGFyY2hfaW5pdF9zY2hlZF9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCk7CitleHRlcm4gdm9pZCBhcmNoX2Rlc3Ryb3lfc2NoZWRfZG9tYWlucyhjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXApOwogI2Vsc2UKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgY3B1X2RvbWFpbnMpOwogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9jcHVzW05SX0NQVVNdOwotc3RhdGljIGludCBfX2RldmluaXQgY3B1X3RvX2NwdV9ncm91cChpbnQgY3B1KQorc3RhdGljIGludCBjcHVfdG9fY3B1X2dyb3VwKGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdTsKIH0KQEAgLTQ2NzIsNyArNDg3OSw3IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluLCBwaHlzX2RvbWFpbnMpOwogc3RhdGljIHN0cnVjdCBzY2hlZF9ncm91cCBzY2hlZF9ncm91cF9waHlzW05SX0NQVVNdOwotc3RhdGljIGludCBfX2RldmluaXQgY3B1X3RvX3BoeXNfZ3JvdXAoaW50IGNwdSkKK3N0YXRpYyBpbnQgY3B1X3RvX3BoeXNfZ3JvdXAoaW50IGNwdSkKIHsKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiAJcmV0dXJuIGZpcnN0X2NwdShjcHVfc2libGluZ19tYXBbY3B1XSk7CkBAIC00Njg1LDcgKzQ4OTIsNyBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiwgbm9kZV9kb21haW5zKTsKIHN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2NoZWRfZ3JvdXBfbm9kZXNbTUFYX05VTU5PREVTXTsKLXN0YXRpYyBpbnQgX19kZXZpbml0IGNwdV90b19ub2RlX2dyb3VwKGludCBjcHUpCitzdGF0aWMgaW50IGNwdV90b19ub2RlX2dyb3VwKGludCBjcHUpCiB7CiAJcmV0dXJuIGNwdV90b19ub2RlKGNwdSk7CiB9CkBAIC00NzE2LDM5ICs0OTIzLDI4IEBACiAjZW5kaWYKIAogLyoKLSAqIFNldCB1cCBzY2hlZHVsZXIgZG9tYWlucyBhbmQgZ3JvdXBzLiAgQ2FsbGVycyBtdXN0IGhvbGQgdGhlIGhvdHBsdWcgbG9jay4KKyAqIEJ1aWxkIHNjaGVkIGRvbWFpbnMgZm9yIGEgZ2l2ZW4gc2V0IG9mIGNwdXMgYW5kIGF0dGFjaCB0aGUgc2NoZWQgZG9tYWlucworICogdG8gdGhlIGluZGl2aWR1YWwgY3B1cwogICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgYXJjaF9pbml0X3NjaGVkX2RvbWFpbnModm9pZCkKK3N0YXRpYyB2b2lkIGJ1aWxkX3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQogewogCWludCBpOwotCWNwdW1hc2tfdCBjcHVfZGVmYXVsdF9tYXA7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpICYmIGRlZmluZWQoQ09ORklHX05VTUEpCi0JY2hlY2tfc2libGluZ19tYXBzKCk7Ci0jZW5kaWYKLQkvKgotCSAqIFNldHVwIG1hc2sgZm9yIGNwdXMgd2l0aG91dCBzcGVjaWFsIGNhc2Ugc2NoZWR1bGluZyByZXF1aXJlbWVudHMuCi0JICogRm9yIG5vdyB0aGlzIGp1c3QgZXhjbHVkZXMgaXNvbGF0ZWQgY3B1cywgYnV0IGNvdWxkIGJlIHVzZWQgdG8KLQkgKiBleGNsdWRlIG90aGVyIHNwZWNpYWwgY2FzZXMgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQljcHVzX2NvbXBsZW1lbnQoY3B1X2RlZmF1bHRfbWFwLCBjcHVfaXNvbGF0ZWRfbWFwKTsKLQljcHVzX2FuZChjcHVfZGVmYXVsdF9tYXAsIGNwdV9kZWZhdWx0X21hcCwgY3B1X29ubGluZV9tYXApOwogCiAJLyoKLQkgKiBTZXQgdXAgZG9tYWlucy4gSXNvbGF0ZWQgZG9tYWlucyBqdXN0IHN0YXkgb24gdGhlIGR1bW15IGRvbWFpbi4KKwkgKiBTZXQgdXAgZG9tYWlucyBmb3IgY3B1cyBzcGVjaWZpZWQgYnkgdGhlIGNwdV9tYXAuCiAJICovCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgY3B1X2RlZmF1bHRfbWFwKSB7CisJZm9yX2VhY2hfY3B1X21hc2soaSwgKmNwdV9tYXApIHsKIAkJaW50IGdyb3VwOwogCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IE5VTEwsICpwOwogCQljcHVtYXNrX3Qgbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2soY3B1X3RvX25vZGUoaSkpOwogCi0JCWNwdXNfYW5kKG5vZGVtYXNrLCBub2RlbWFzaywgY3B1X2RlZmF1bHRfbWFwKTsKKwkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCAqY3B1X21hcCk7CiAKICNpZmRlZiBDT05GSUdfTlVNQQogCQlzZCA9ICZwZXJfY3B1KG5vZGVfZG9tYWlucywgaSk7CiAJCWdyb3VwID0gY3B1X3RvX25vZGVfZ3JvdXAoaSk7CiAJCSpzZCA9IFNEX05PREVfSU5JVDsKLQkJc2QtPnNwYW4gPSBjcHVfZGVmYXVsdF9tYXA7CisJCXNkLT5zcGFuID0gKmNwdV9tYXA7CiAJCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfbm9kZXNbZ3JvdXBdOwogI2VuZGlmCiAKQEAgLTQ3NjYsNyArNDk2Miw3IEBACiAJCWdyb3VwID0gY3B1X3RvX2NwdV9ncm91cChpKTsKIAkJKnNkID0gU0RfU0lCTElOR19JTklUOwogCQlzZC0+c3BhbiA9IGNwdV9zaWJsaW5nX21hcFtpXTsKLQkJY3B1c19hbmQoc2QtPnNwYW4sIHNkLT5zcGFuLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZChzZC0+c3Bhbiwgc2QtPnNwYW4sICpjcHVfbWFwKTsKIAkJc2QtPnBhcmVudCA9IHA7CiAJCXNkLT5ncm91cHMgPSAmc2NoZWRfZ3JvdXBfY3B1c1tncm91cF07CiAjZW5kaWYKQEAgLTQ3NzYsNyArNDk3Miw3IEBACiAJLyogU2V0IHVwIENQVSAoc2libGluZykgZ3JvdXBzICovCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CiAJCWNwdW1hc2tfdCB0aGlzX3NpYmxpbmdfbWFwID0gY3B1X3NpYmxpbmdfbWFwW2ldOwotCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZCh0aGlzX3NpYmxpbmdfbWFwLCB0aGlzX3NpYmxpbmdfbWFwLCAqY3B1X21hcCk7CiAJCWlmIChpICE9IGZpcnN0X2NwdSh0aGlzX3NpYmxpbmdfbWFwKSkKIAkJCWNvbnRpbnVlOwogCkBAIC00Nzg5LDcgKzQ5ODUsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgewogCQljcHVtYXNrX3Qgbm9kZW1hc2sgPSBub2RlX3RvX2NwdW1hc2soaSk7CiAKLQkJY3B1c19hbmQobm9kZW1hc2ssIG5vZGVtYXNrLCBjcHVfZGVmYXVsdF9tYXApOworCQljcHVzX2FuZChub2RlbWFzaywgbm9kZW1hc2ssICpjcHVfbWFwKTsKIAkJaWYgKGNwdXNfZW1wdHkobm9kZW1hc2spKQogCQkJY29udGludWU7CiAKQEAgLTQ3OTksMTIgKzQ5OTUsMTIgQEAKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJLyogU2V0IHVwIG5vZGUgZ3JvdXBzICovCi0JaW5pdF9zY2hlZF9idWlsZF9ncm91cHMoc2NoZWRfZ3JvdXBfbm9kZXMsIGNwdV9kZWZhdWx0X21hcCwKKwlpbml0X3NjaGVkX2J1aWxkX2dyb3VwcyhzY2hlZF9ncm91cF9ub2RlcywgKmNwdV9tYXAsCiAJCQkJCSZjcHVfdG9fbm9kZV9ncm91cCk7CiAjZW5kaWYKIAogCS8qIENhbGN1bGF0ZSBDUFUgcG93ZXIgZm9yIHBoeXNpY2FsIHBhY2thZ2VzIGFuZCBub2RlcyAqLwotCWZvcl9lYWNoX2NwdV9tYXNrKGksIGNwdV9kZWZhdWx0X21hcCkgeworCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKSB7CiAJCWludCBwb3dlcjsKIAkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAjaWZkZWYgQ09ORklHX1NDSEVEX1NNVApAQCAtNDgyOCw3ICs1MDI0LDcgQEAKIAl9CiAKIAkvKiBBdHRhY2ggdGhlIGRvbWFpbnMgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwlmb3JfZWFjaF9jcHVfbWFzayhpLCAqY3B1X21hcCkgewogCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKICNpZmRlZiBDT05GSUdfU0NIRURfU01UCiAJCXNkID0gJnBlcl9jcHUoY3B1X2RvbWFpbnMsIGkpOwpAQCAtNDgzOCw0MSArNTAzNCw4NSBAQAogCQljcHVfYXR0YWNoX2RvbWFpbihzZCwgaSk7CiAJfQogfQorLyoKKyAqIFNldCB1cCBzY2hlZHVsZXIgZG9tYWlucyBhbmQgZ3JvdXBzLiAgQ2FsbGVycyBtdXN0IGhvbGQgdGhlIGhvdHBsdWcgbG9jay4KKyAqLworc3RhdGljIHZvaWQgYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICpjcHVfbWFwKQoreworCWNwdW1hc2tfdCBjcHVfZGVmYXVsdF9tYXA7CiAKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhcmNoX2Rlc3Ryb3lfc2NoZWRfZG9tYWlucyh2b2lkKQorI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkgJiYgZGVmaW5lZChDT05GSUdfTlVNQSkKKwljaGVja19zaWJsaW5nX21hcHMoKTsKKyNlbmRpZgorCS8qCisJICogU2V0dXAgbWFzayBmb3IgY3B1cyB3aXRob3V0IHNwZWNpYWwgY2FzZSBzY2hlZHVsaW5nIHJlcXVpcmVtZW50cy4KKwkgKiBGb3Igbm93IHRoaXMganVzdCBleGNsdWRlcyBpc29sYXRlZCBjcHVzLCBidXQgY291bGQgYmUgdXNlZCB0bworCSAqIGV4Y2x1ZGUgb3RoZXIgc3BlY2lhbCBjYXNlcyBpbiB0aGUgZnV0dXJlLgorCSAqLworCWNwdXNfYW5kbm90KGNwdV9kZWZhdWx0X21hcCwgKmNwdV9tYXAsIGNwdV9pc29sYXRlZF9tYXApOworCisJYnVpbGRfc2NoZWRfZG9tYWlucygmY3B1X2RlZmF1bHRfbWFwKTsKK30KKworc3RhdGljIHZvaWQgYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnMoY29uc3QgY3B1bWFza190ICpjcHVfbWFwKQogewogCS8qIERvIG5vdGhpbmc6IGV2ZXJ5dGhpbmcgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQuICovCiB9Ci0jZW5kaWYKIAogI2VuZGlmIC8qIEFSQ0hfSEFTX1NDSEVEX0RPTUFJTiAqLwogCiAvKgotICogSW5pdGlhbCBkdW1teSBkb21haW4gZm9yIGVhcmx5IGJvb3QgYW5kIGZvciBob3RwbHVnIGNwdS4gQmVpbmcgc3RhdGljLAotICogaXQgaXMgaW5pdGlhbGl6ZWQgdG8gemVybywgc28gYWxsIGJhbGFuY2luZyBmbGFncyBhcmUgY2xlYXJlZCB3aGljaCBpcwotICogd2hhdCB3ZSB3YW50LgorICogRGV0YWNoIHNjaGVkIGRvbWFpbnMgZnJvbSBhIGdyb3VwIG9mIGNwdXMgc3BlY2lmaWVkIGluIGNwdV9tYXAKKyAqIFRoZXNlIGNwdXMgd2lsbCBub3cgYmUgYXR0YWNoZWQgdG8gdGhlIE5VTEwgZG9tYWluCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluIHNjaGVkX2RvbWFpbl9kdW1teTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXRhY2hfZGVzdHJveV9kb21haW5zKGNvbnN0IGNwdW1hc2tfdCAqY3B1X21hcCkKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHVfbWFwKQorCQljcHVfYXR0YWNoX2RvbWFpbihOVUxMLCBpKTsKKwlzeW5jaHJvbml6ZV9zY2hlZCgpOworCWFyY2hfZGVzdHJveV9zY2hlZF9kb21haW5zKGNwdV9tYXApOworfQorCisvKgorICogUGFydGl0aW9uIHNjaGVkIGRvbWFpbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBjcHVtYXNrcyBiZWxvdy4KKyAqIFRoaXMgYXR0YWNoZXMgYWxsIGNwdXMgZnJvbSB0aGUgY3B1bWFza3MgdG8gdGhlIE5VTEwgZG9tYWluLAorICogd2FpdHMgZm9yIGEgUkNVIHF1aWVzY2VudCBwZXJpb2QsIHJlY2FsY3VsYXRlcyBzY2hlZAorICogZG9tYWluIGluZm9ybWF0aW9uIGFuZCB0aGVuIGF0dGFjaGVzIHRoZW0gYmFjayB0byB0aGUKKyAqIGNvcnJlY3Qgc2NoZWQgZG9tYWlucworICogQ2FsbCB3aXRoIGhvdHBsdWcgbG9jayBoZWxkCisgKi8KK3ZvaWQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoY3B1bWFza190ICpwYXJ0aXRpb24xLCBjcHVtYXNrX3QgKnBhcnRpdGlvbjIpCit7CisJY3B1bWFza190IGNoYW5nZV9tYXA7CisKKwljcHVzX2FuZCgqcGFydGl0aW9uMSwgKnBhcnRpdGlvbjEsIGNwdV9vbmxpbmVfbWFwKTsKKwljcHVzX2FuZCgqcGFydGl0aW9uMiwgKnBhcnRpdGlvbjIsIGNwdV9vbmxpbmVfbWFwKTsKKwljcHVzX29yKGNoYW5nZV9tYXAsICpwYXJ0aXRpb24xLCAqcGFydGl0aW9uMik7CisKKwkvKiBEZXRhY2ggc2NoZWQgZG9tYWlucyBmcm9tIGFsbCBvZiB0aGUgYWZmZWN0ZWQgY3B1cyAqLworCWRldGFjaF9kZXN0cm95X2RvbWFpbnMoJmNoYW5nZV9tYXApOworCWlmICghY3B1c19lbXB0eSgqcGFydGl0aW9uMSkpCisJCWJ1aWxkX3NjaGVkX2RvbWFpbnMocGFydGl0aW9uMSk7CisJaWYgKCFjcHVzX2VtcHR5KCpwYXJ0aXRpb24yKSkKKwkJYnVpbGRfc2NoZWRfZG9tYWlucyhwYXJ0aXRpb24yKTsKK30KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogLyoKICAqIEZvcmNlIGEgcmVpbml0aWFsaXphdGlvbiBvZiB0aGUgc2NoZWQgZG9tYWlucyBoaWVyYXJjaHkuICBUaGUgZG9tYWlucwogICogYW5kIGdyb3VwcyBjYW5ub3QgYmUgdXBkYXRlZCBpbiBwbGFjZSB3aXRob3V0IHJhY2luZyB3aXRoIHRoZSBiYWxhbmNpbmcKLSAqIGNvZGUsIHNvIHdlIHRlbXBvcmFyaWx5IGF0dGFjaCBhbGwgcnVubmluZyBjcHVzIHRvIGEgImR1bW15IiBkb21haW4KKyAqIGNvZGUsIHNvIHdlIHRlbXBvcmFyaWx5IGF0dGFjaCBhbGwgcnVubmluZyBjcHVzIHRvIHRoZSBOVUxMIGRvbWFpbgogICogd2hpY2ggd2lsbCBwcmV2ZW50IHJlYmFsYW5jaW5nIHdoaWxlIHRoZSBzY2hlZCBkb21haW5zIGFyZSByZWNhbGN1bGF0ZWQuCiAgKi8KIHN0YXRpYyBpbnQgdXBkYXRlX3NjaGVkX2RvbWFpbnMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCiAJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7Ci0JaW50IGk7Ci0KIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCi0JCQljcHVfYXR0YWNoX2RvbWFpbigmc2NoZWRfZG9tYWluX2R1bW15LCBpKTsKLQkJYXJjaF9kZXN0cm95X3NjaGVkX2RvbWFpbnMoKTsKKwkJZGV0YWNoX2Rlc3Ryb3lfZG9tYWlucygmY3B1X29ubGluZV9tYXApOwogCQlyZXR1cm4gTk9USUZZX09LOwogCiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CkBAIC00ODg4LDcgKzUxMjgsNyBAQAogCX0KIAogCS8qIFRoZSBob3RwbHVnIGxvY2sgaXMgYWxyZWFkeSBoZWxkIGJ5IGNwdV91cC9jcHVfZG93biAqLwotCWFyY2hfaW5pdF9zY2hlZF9kb21haW5zKCk7CisJYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMoJmNwdV9vbmxpbmVfbWFwKTsKIAogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC00ODk3LDcgKzUxMzcsNyBAQAogdm9pZCBfX2luaXQgc2NoZWRfaW5pdF9zbXAodm9pZCkKIHsKIAlsb2NrX2NwdV9ob3RwbHVnKCk7Ci0JYXJjaF9pbml0X3NjaGVkX2RvbWFpbnMoKTsKKwlhcmNoX2luaXRfc2NoZWRfZG9tYWlucygmY3B1X29ubGluZV9tYXApOwogCXVubG9ja19jcHVfaG90cGx1ZygpOwogCS8qIFhYWDogVGhlb3JldGljYWwgcmFjZSBoZXJlIC0gQ1BVIG1heSBiZSBob3RwbHVnZ2VkIG5vdyAqLwogCWhvdGNwdV9ub3RpZmllcih1cGRhdGVfc2NoZWRfZG9tYWlucywgMCk7CkBAIC00OTI3LDEzICs1MTY3LDE1IEBACiAKIAkJcnEgPSBjcHVfcnEoaSk7CiAJCXNwaW5fbG9ja19pbml0KCZycS0+bG9jayk7CisJCXJxLT5ucl9ydW5uaW5nID0gMDsKIAkJcnEtPmFjdGl2ZSA9IHJxLT5hcnJheXM7CiAJCXJxLT5leHBpcmVkID0gcnEtPmFycmF5cyArIDE7CiAJCXJxLT5iZXN0X2V4cGlyZWRfcHJpbyA9IE1BWF9QUklPOwogCiAjaWZkZWYgQ09ORklHX1NNUAotCQlycS0+c2QgPSAmc2NoZWRfZG9tYWluX2R1bW15OwotCQlycS0+Y3B1X2xvYWQgPSAwOworCQlycS0+c2QgPSBOVUxMOworCQlmb3IgKGogPSAxOyBqIDwgMzsgaisrKQorCQkJcnEtPmNwdV9sb2FkW2pdID0gMDsKIAkJcnEtPmFjdGl2ZV9iYWxhbmNlID0gMDsKIAkJcnEtPnB1c2hfY3B1ID0gMDsKIAkJcnEtPm1pZ3JhdGlvbl90aHJlYWQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NpZ25hbC5jIGIva2VybmVsL3NpZ25hbC5jCmluZGV4IGQxMjU4NzIuLmNhMTE4NmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogZmFzdGNhbGwgdm9pZCByZWNhbGNfc2lncGVuZGluZ190c2soc3RydWN0IHRhc2tfc3RydWN0ICp0KQogewogCWlmICh0LT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPiAwIHx8Ci0JICAgICh0LT5mbGFncyAmIFBGX0ZSRUVaRSkgfHwKKwkgICAgKGZyZWV6aW5nKHQpKSB8fAogCSAgICBQRU5ESU5HKCZ0LT5wZW5kaW5nLCAmdC0+YmxvY2tlZCkgfHwKIAkgICAgUEVORElORygmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZywgJnQtPmJsb2NrZWQpKQogCQlzZXRfdHNrX3RocmVhZF9mbGFnKHQsIFRJRl9TSUdQRU5ESU5HKTsKQEAgLTIyMzEsOCArMjIzMSw3IEBACiAJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKIAkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwogCi0JCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpCi0JCQkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCQl0cnlfdG9fZnJlZXplKCk7CiAJCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJCXNpZyA9IGRlcXVldWVfc2lnbmFsKGN1cnJlbnQsICZ0aGVzZSwgJmluZm8pOwogCQkJY3VycmVudC0+YmxvY2tlZCA9IGN1cnJlbnQtPnJlYWxfYmxvY2tlZDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCA1YTlkNmIwLi45YTI0Mzc0IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0xNiw2ICsxNiw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CkBAIC00MDUsNiArNDA3LDcgQEAKIAljYXNlIExJTlVYX1JFQk9PVF9DTURfSEFMVDoKIAkJbm90aWZpZXJfY2FsbF9jaGFpbigmcmVib290X25vdGlmaWVyX2xpc3QsIFNZU19IQUxULCBOVUxMKTsKIAkJc3lzdGVtX3N0YXRlID0gU1lTVEVNX0hBTFQ7CisJCWRldmljZV9zdXNwZW5kKFBNU0dfU1VTUEVORCk7CiAJCWRldmljZV9zaHV0ZG93bigpOwogCQlwcmludGsoS0VSTl9FTUVSRyAiU3lzdGVtIGhhbHRlZC5cbiIpOwogCQltYWNoaW5lX2hhbHQoKTsKQEAgLTQxNSw2ICs0MTgsNyBAQAogCWNhc2UgTElOVVhfUkVCT09UX0NNRF9QT1dFUl9PRkY6CiAJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJnJlYm9vdF9ub3RpZmllcl9saXN0LCBTWVNfUE9XRVJfT0ZGLCBOVUxMKTsKIAkJc3lzdGVtX3N0YXRlID0gU1lTVEVNX1BPV0VSX09GRjsKKwkJZGV2aWNlX3N1c3BlbmQoUE1TR19TVVNQRU5EKTsKIAkJZGV2aWNlX3NodXRkb3duKCk7CiAJCXByaW50ayhLRVJOX0VNRVJHICJQb3dlciBkb3duLlxuIik7CiAJCW1hY2hpbmVfcG93ZXJfb2ZmKCk7CkBAIC00MzEsMTEgKzQzNSwzMCBAQAogCiAJCW5vdGlmaWVyX2NhbGxfY2hhaW4oJnJlYm9vdF9ub3RpZmllcl9saXN0LCBTWVNfUkVTVEFSVCwgYnVmZmVyKTsKIAkJc3lzdGVtX3N0YXRlID0gU1lTVEVNX1JFU1RBUlQ7CisJCWRldmljZV9zdXNwZW5kKFBNU0dfRlJFRVpFKTsKIAkJZGV2aWNlX3NodXRkb3duKCk7CiAJCXByaW50ayhLRVJOX0VNRVJHICJSZXN0YXJ0aW5nIHN5c3RlbSB3aXRoIGNvbW1hbmQgJyVzJy5cbiIsIGJ1ZmZlcik7CiAJCW1hY2hpbmVfcmVzdGFydChidWZmZXIpOwogCQlicmVhazsKIAorI2lmZGVmIENPTkZJR19LRVhFQworCWNhc2UgTElOVVhfUkVCT09UX0NNRF9LRVhFQzoKKwl7CisJCXN0cnVjdCBraW1hZ2UgKmltYWdlOworCQlpbWFnZSA9IHhjaGcoJmtleGVjX2ltYWdlLCAwKTsKKwkJaWYgKCFpbWFnZSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbm90aWZpZXJfY2FsbF9jaGFpbigmcmVib290X25vdGlmaWVyX2xpc3QsIFNZU19SRVNUQVJULCBOVUxMKTsKKwkJc3lzdGVtX3N0YXRlID0gU1lTVEVNX1JFU1RBUlQ7CisJCWRldmljZV9zaHV0ZG93bigpOworCQlwcmludGsoS0VSTl9FTUVSRyAiU3RhcnRpbmcgbmV3IGtlcm5lbFxuIik7CisJCW1hY2hpbmVfc2h1dGRvd24oKTsKKwkJbWFjaGluZV9rZXhlYyhpbWFnZSk7CisJCWJyZWFrOworCX0KKyNlbmRpZgogI2lmZGVmIENPTkZJR19TT0ZUV0FSRV9TVVNQRU5ECiAJY2FzZSBMSU5VWF9SRUJPT1RfQ01EX1NXX1NVU1BFTkQ6CiAJCXsKQEAgLTEyNTksNyArMTI4Miw3IEBACiB9CiAKIC8qIGEgc2ltcGxlIGJzZWFyY2ggKi8KLXN0YXRpYyBpbnQgZ3JvdXBzX3NlYXJjaChzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBfaW5mbywgZ2lkX3QgZ3JwKQoraW50IGdyb3Vwc19zZWFyY2goc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm8sIGdpZF90IGdycCkKIHsKIAlpbnQgbGVmdCwgcmlnaHQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCA2ZjE1YmVhLi40MmI0MGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC0xOCw2ICsxOCw4IEBACiBjb25kX3N5c2NhbGwoc3lzX2xvb2t1cF9kY29va2llKTsKIGNvbmRfc3lzY2FsbChzeXNfc3dhcG9uKTsKIGNvbmRfc3lzY2FsbChzeXNfc3dhcG9mZik7Citjb25kX3N5c2NhbGwoc3lzX2tleGVjX2xvYWQpOworY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfa2V4ZWNfbG9hZCk7CiBjb25kX3N5c2NhbGwoc3lzX2luaXRfbW9kdWxlKTsKIGNvbmRfc3lzY2FsbChzeXNfZGVsZXRlX21vZHVsZSk7CiBjb25kX3N5c2NhbGwoc3lzX3NvY2tldHBhaXIpOwpAQCAtNzgsNiArODAsOSBAQAogY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfa2V5Y3RsKTsKIGNvbmRfc3lzY2FsbChjb21wYXRfc3lzX3NvY2tldGNhbGwpOwogY29uZF9zeXNjYWxsKHN5c19zZXRfem9uZV9yZWNsYWltKTsKK2NvbmRfc3lzY2FsbChzeXNfaW5vdGlmeV9pbml0KTsKK2NvbmRfc3lzY2FsbChzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpOworY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X3JtX3dhdGNoKTsKIAogLyogYXJjaC1zcGVjaWZpYyB3ZWFrIHN5c2NhbGwgZW50cmllcyAqLwogY29uZF9zeXNjYWxsKHN5c19wY2ljb25maWdfcmVhZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzY3RsLmMgYi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggMjRhNGQxMi4uYjI0MGUyYyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c2N0bC5jCisrKyBiL2tlcm5lbC9zeXNjdGwuYwpAQCAtNjcsNiArNjcsMTIgQEAKIGV4dGVybiBpbnQgcHJpbnRrX3JhdGVsaW1pdF9idXJzdDsKIGV4dGVybiBpbnQgcGlkX21heF9taW4sIHBpZF9tYXhfbWF4OwogCisjaWZkZWYgQ09ORklHX0lOT1RJRlkKK2V4dGVybiBpbnQgaW5vdGlmeV9tYXhfdXNlcl9kZXZpY2VzOworZXh0ZXJuIGludCBpbm90aWZ5X21heF91c2VyX3dhdGNoZXM7CitleHRlcm4gaW50IGlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHM7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSAmJiBkZWZpbmVkKENPTkZJR19YODYpCiBpbnQgdW5rbm93bl9ubWlfcGFuaWM7CiBleHRlcm4gaW50IHByb2NfdW5rbm93bl9ubWlfcGFuaWMoY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKQEAgLTIxOCw2ICsyMjQsNyBAQAogCQkubW9kZQkJPSAwNTU1LAogCQkuY2hpbGQJCT0gZGV2X3RhYmxlLAogCX0sCisKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApAQCAtOTU5LDYgKzk2Niw0MCBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCiAJfSwKKyNpZmRlZiBDT05GSUdfSU5PVElGWQorCXsKKwkJLmN0bF9uYW1lCT0gSU5PVElGWV9NQVhfVVNFUl9ERVZJQ0VTLAorCQkucHJvY25hbWUJPSAibWF4X3VzZXJfZGV2aWNlcyIsCisJCS5kYXRhCQk9ICZpbm90aWZ5X21heF91c2VyX2RldmljZXMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5zdHJhdGVneQk9ICZzeXNjdGxfaW50dmVjLAorCQkuZXh0cmExCQk9ICZ6ZXJvLAorCX0sCisKKwl7CisJCS5jdGxfbmFtZQk9IElOT1RJRllfTUFYX1VTRVJfV0FUQ0hFUywKKwkJLnByb2NuYW1lCT0gIm1heF91c2VyX3dhdGNoZXMiLAorCQkuZGF0YQkJPSAmaW5vdGlmeV9tYXhfdXNlcl93YXRjaGVzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywKKwkJLmV4dHJhMQkJPSAmemVybywgCisJfSwKKworCXsKKwkJLmN0bF9uYW1lCT0gSU5PVElGWV9NQVhfUVVFVUVEX0VWRU5UUywKKwkJLnByb2NuYW1lCT0gIm1heF9xdWV1ZWRfZXZlbnRzIiwKKwkJLmRhdGEJCT0gJmlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsIAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuc3RyYXRlZ3kJPSAmc3lzY3RsX2ludHZlYywgCisJCS5leHRyYTEJCT0gJnplcm8KKwl9LAorI2VuZGlmCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKQEAgLTk2OCw3ICsxMDA5LDcgQEAKIAogc3RhdGljIGN0bF90YWJsZSBkZXZfdGFibGVbXSA9IHsKIAl7IC5jdGxfbmFtZSA9IDAgfQotfTsgIAorfTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9pcnFfcHJvYyAodm9pZCk7CiAKQEAgLTEwMDAsOCArMTA0MSw3IEBACiAJCWludCBlcnJvciA9IHBhcnNlX3RhYmxlKG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgCiAJCQkJCW5ld3ZhbCwgbmV3bGVuLCBoZWFkLT5jdGxfdGFibGUsCiAJCQkJCSZjb250ZXh0KTsKLQkJaWYgKGNvbnRleHQpCi0JCQlrZnJlZShjb250ZXh0KTsKKwkJa2ZyZWUoY29udGV4dCk7CiAJCWlmIChlcnJvciAhPSAtRU5PVERJUikKIAkJCXJldHVybiBlcnJvcjsKIAkJdG1wID0gdG1wLT5uZXh0OwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCA1MWZmOTE3Li5mMmExMTg4IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtMTU5Nyw3ICsxNTk3LDcgQEAKIEVYUE9SVF9TWU1CT0wobXNsZWVwKTsKIAogLyoqCi0gKiBtc2xlZXBfaW50ZXJydXB0aWJsZSAtIHNsZWVwIHdhaXRpbmcgZm9yIHdhaXRxdWV1ZSBpbnRlcnJ1cHRpb25zCisgKiBtc2xlZXBfaW50ZXJydXB0aWJsZSAtIHNsZWVwIHdhaXRpbmcgZm9yIHNpZ25hbHMKICAqIEBtc2VjczogVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gc2xlZXAgZm9yCiAgKi8KIHVuc2lnbmVkIGxvbmcgbXNsZWVwX2ludGVycnVwdGlibGUodW5zaWduZWQgaW50IG1zZWNzKQpkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmMKaW5kZXggNzM0NTc1ZC4uODllNTYyZiAxMDA2NDQKLS0tIGEva2VybmVsL3VzZXIuYworKysgYi9rZXJuZWwvdXNlci5jCkBAIC0xMjAsNiArMTIwLDEwIEBACiAJCWF0b21pY19zZXQoJm5ldy0+cHJvY2Vzc2VzLCAwKTsKIAkJYXRvbWljX3NldCgmbmV3LT5maWxlcywgMCk7CiAJCWF0b21pY19zZXQoJm5ldy0+c2lncGVuZGluZywgMCk7CisjaWZkZWYgQ09ORklHX0lOT1RJRlkKKwkJYXRvbWljX3NldCgmbmV3LT5pbm90aWZ5X3dhdGNoZXMsIDApOworCQlhdG9taWNfc2V0KCZuZXctPmlub3RpZnlfZGV2cywgMCk7CisjZW5kaWYKIAogCQluZXctPm1xX2J5dGVzID0gMDsKIAkJbmV3LT5sb2NrZWRfc2htID0gMDsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggMmQ0ZDRlMy4uZWViNDI5YSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTYzLDUgKzYzLDE2IEBACiBjb25maWcgUkVFRF9TT0xPTU9OX0RFQzE2CiAJYm9vbGVhbgogCi1lbmRtZW51CisjCisjIFRleHRzZWFyY2ggc3VwcG9ydCBpcyBzZWxlY3QnZWQgaWYgbmVlZGVkCisjCitjb25maWcgVEVYVFNFQVJDSAorCWJvb2xlYW4KIAorY29uZmlnIFRFWFRTRUFSQ0hfS01QCisJdHJpc3RhdGUKKworY29uZmlnIFRFWFRTRUFSQ0hfRlNNCisJdHJpc3RhdGUKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGRjYjQyMzEuLmJlZWQxNTggMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTM2LDYgKzM2LDEwIEBACiBvYmotJChDT05GSUdfWkxJQl9ERUZMQVRFKSArPSB6bGliX2RlZmxhdGUvCiBvYmotJChDT05GSUdfUkVFRF9TT0xPTU9OKSArPSByZWVkX3NvbG9tb24vCiAKK29iai0kKENPTkZJR19URVhUU0VBUkNIKSArPSB0ZXh0c2VhcmNoLm8KK29iai0kKENPTkZJR19URVhUU0VBUkNIX0tNUCkgKz0gdHNfa21wLm8KK29iai0kKENPTkZJR19URVhUU0VBUkNIX0ZTTSkgKz0gdHNfZnNtLm8KKwogaG9zdHByb2dzLXkJOj0gZ2VuX2NyYzMydGFibGUKIGNsZWFuLWZpbGVzCTo9IGNyYzMydGFibGUuaAogCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggZDEzODhhNS4uZmI5MzcxZiAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtMjg5LDcgKzI4OSw2IEBACiAKICNkZWZpbmUgQ0hVTktTWgkJCQkzMgogI2RlZmluZSBuYml0c190b19ob2xkX3ZhbHVlKHZhbCkJZmxzKHZhbCkKLSNkZWZpbmUgcm91bmR1cF9wb3dlcjIodmFsLG1vZHVsdXMpCSgoKHZhbCkgKyAobW9kdWx1cykgLSAxKSAmIH4oKG1vZHVsdXMpIC0gMSkpCiAjZGVmaW5lIHVuaGV4KGMpCQkJKGlzZGlnaXQoYykgPyAoYyAtICcwJykgOiAodG91cHBlcihjKSAtICdBJyArIDEwKSkKICNkZWZpbmUgQkFTRURFQyAxMAkJLyogZmFuY2llciBjcHVzZXQgbGlzdHMgaW5wdXQgaW4gZGVjaW1hbCAqLwogCkBAIC0zMTYsNyArMzE1LDcgQEAKIAlpZiAoY2h1bmtzeiA9PSAwKQogCQljaHVua3N6ID0gQ0hVTktTWjsKIAotCWkgPSByb3VuZHVwX3Bvd2VyMihubWFza2JpdHMsIENIVU5LU1opIC0gQ0hVTktTWjsKKwlpID0gQUxJR04obm1hc2tiaXRzLCBDSFVOS1NaKSAtIENIVU5LU1o7CiAJZm9yICg7IGkgPj0gMDsgaSAtPSBDSFVOS1NaKSB7CiAJCWNodW5rbWFzayA9ICgoMVVMTCA8PCBjaHVua3N6KSAtIDEpOwogCQl3b3JkID0gaSAvIEJJVFNfUEVSX0xPTkc7CmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCAwNGQ2NjQzLi4xMGJlZDFjIDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTU4LDcgKzU4LDcgQEAKICNkZWZpbmUgUkFESVhfVFJFRV9JTkRFWF9CSVRTICAoOCAvKiBDSEFSX0JJVCAqLyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKICNkZWZpbmUgUkFESVhfVFJFRV9NQVhfUEFUSCAoUkFESVhfVFJFRV9JTkRFWF9CSVRTL1JBRElYX1RSRUVfTUFQX1NISUZUICsgMikKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVpZ2h0X3RvX21heGluZGV4W1JBRElYX1RSRUVfTUFYX1BBVEhdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVpZ2h0X3RvX21heGluZGV4W1JBRElYX1RSRUVfTUFYX1BBVEhdIF9fcmVhZF9tb3N0bHk7CiAKIC8qCiAgKiBSYWRpeCB0cmVlIG5vZGUgY2FjaGUuCmRpZmYgLS1naXQgYS9saWIvc2hhMS5jIGIvbGliL3NoYTEuYwppbmRleCAyZjdmMTE0Li4xY2RhYmUzIDEwMDY0NAotLS0gYS9saWIvc2hhMS5jCisrKyBiL2xpYi9zaGExLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAlfX3UzMiBhLCBiLCBjLCBkLCBlLCB0LCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCVdbaV0gPSBiZTMyX3RvX2NwdSgoKGNvbnN0IF9fdTMyICopaW4pW2ldKTsKKwkJV1tpXSA9IGJlMzJfdG9fY3B1KCgoY29uc3QgX19iZTMyICopaW4pW2ldKTsKIAogCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQogCQlXW2krMTZdID0gcm9sMzIoV1tpKzEzXSBeIFdbaSs4XSBeIFdbaSsyXSBeIFdbaV0sIDEpOwpkaWZmIC0tZ2l0IGEvbGliL3RleHRzZWFyY2guYyBiL2xpYi90ZXh0c2VhcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5MzRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90ZXh0c2VhcmNoLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBsaWIvdGV4dHNlYXJjaC5jCUdlbmVyaWMgdGV4dCBzZWFyY2ggaW50ZXJmYWNlCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKiAJCVBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIElOVFJPRFVDVElPTgorICoKKyAqICAgVGhlIHRleHRzZWFyY2ggaW5mcmFzdHJ1Y3R1cmUgcHJvdmlkZXMgdGV4dCBzZWFyY2hpbmcgZmFjaXRpbGllcyBmb3IKKyAqICAgYm90aCBsaW5lYXIgYW5kIG5vbi1saW5lYXIgZGF0YS4gSW5kaXZpZHVhbCBzZWFyY2ggYWxnb3JpdGhtcyBhcmUKKyAqICAgaW1wbGVtZW50ZWQgaW4gbW9kdWxlcyBhbmQgY2hvc2VuIGJ5IHRoZSB1c2VyLgorICoKKyAqIEFSQ0hJVEVDVFVSRQorICoKKyAqICAgICAgVXNlcgorICogICAgICstLS0tLS0tLS0tLS0tLS0tKworICogICAgIHwgICAgICAgIGZpbmlzaCgpfDwtLS0tLS0tLS0tLS0tLSg2KS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgIHxnZXRfbmV4dF9ibG9jaygpfDwtLS0tLS0tLS0tLS0tLSg1KS0tLS0tLS0tLS0tLS0tLSsgfAorICogICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobSAgIHwgfAorICogICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgIGluaXQoKSAgIGZpbmQoKSAgIGRlc3Ryb3koKSB8CisgKiAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICBDb3JlIEFQSSAgICAgICAgICAgXiAgICAgICBeICAgICAgICAgIF4KKyAqICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgKDIpICAgICAoNCkgICAgICAgICg4KQorICogICAgIHwgICAgICAgICAgICAgKDEpfC0tLS0tPnwgcHJlcGFyZSgpICAgICB8LS0tKyAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICB8ICAgICAgICAgICAgICgzKXwtLS0tLT58IGZpbmQoKS9uZXh0KCkgfC0tLS0tLS0tLS0tKyAgICAgICAgICB8CisgKiAgICAgfCAgICAgICAgICAgICAoNyl8LS0tLS0+fCBkZXN0cm95KCkgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgKiAgCisgKiAgICgxKSBVc2VyIGNvbmZpZ3VyZXMgYSBzZWFyY2ggYnkgY2FsbGluZyBfcHJlcGFyZSgpIHNwZWNpZnlpbmcgdGhlCisgKiAgICAgICBzZWFyY2ggcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBwYXR0ZXJuIGFuZCBhbGdvcml0aG0gbmFtZS4KKyAqICAgKDIpIENvcmUgcmVxdWVzdHMgdGhlIGFsZ29yaXRobSB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNlYXJjaAorICogICAgICAgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICogICAoMykgVXNlciBzdGFydHMgdGhlIHNlYXJjaChlcykgYnkgY2FsbGluZyBfZmluZCgpIG9yIF9uZXh0KCkgdG8KKyAqICAgICAgIGZldGNoIHN1YnNlcXVlbnQgb2NjdXJyZW5jZXMuIEEgc3RhdGUgdmFyaWFibGUgaXMgcHJvdmlkZWQKKyAqICAgICAgIHRvIHRoZSBhbGdvcmlodG0gdG8gc3RvcmUgcGVyc2lzdGFudCB2YXJpYWJsZXMuCisgKiAgICg0KSBDb3JlIGV2ZW50dWFsbHkgcmVzZXRzIHRoZSBzZWFyY2ggb2Zmc2V0IGFuZCBmb3J3YXJkcyB0aGUgZmluZCgpCisgKiAgICAgICByZXF1ZXN0IHRvIHRoZSBhbGdvcml0aG0uCisgKiAgICg1KSBBbGdvcml0aG0gY2FsbHMgZ2V0X25leHRfYmxvY2soKSBwcm92aWRlZCBieSB0aGUgdXNlciBjb250aW5vdXNseQorICogICAgICAgdG8gZmV0Y2ggdGhlIGRhdGEgdG8gYmUgc2VhcmNoZWQgaW4gYmxvY2sgYnkgYmxvY2suCisgKiAgICg2KSBBbGdvcml0aG0gaW52b2tlcyBmaW5pc2goKSBhZnRlciB0aGUgbGFzdCBjYWxsIHRvIGdldF9uZXh0X2Jsb2NrCisgKiAgICAgICB0byBjbGVhbiB1cCBhbnkgbGVmdG92ZXJzIGZyb20gZ2V0X25leHRfYmxvY2suIChPcHRpb25hbCkKKyAqICAgKDcpIFVzZXIgZGVzdHJveXMgdGhlIGNvbmZpZ3VyYXRpb24gYnkgY2FsbGluZyBfZGVzdHJveSgpLgorICogICAoOCkgQ29yZSBub3RpZmllcyB0aGUgYWxnb3JpdGhtIHRvIGRlc3Ryb3kgYWxnb3JpdGhtIHNwZWNpZmljCisgKiAgICAgICBhbGxvY2F0aW9ucy4gKE9wdGlvbmFsKQorICoKKyAqIFVTQUdFCisgKgorICogICBCZWZvcmUgYSBzZWFyY2ggY2FuIGJlIHBlcmZvcm1lZCwgYSBjb25maWd1cmF0aW9uIG11c3QgYmUgY3JlYXRlZAorICogICBieSBjYWxsaW5nIHRleHRzZWFyY2hfcHJlcGFyZSgpIHNwZWN5ZmluZyB0aGUgc2VhcmNoaW5nIGFsZ29yaXRobSBhbmQKKyAqICAgdGhlIHBhdHRlcm4gdG8gbG9vayBmb3IuIFRoZSByZXR1cm5lZCBjb25maWd1cmF0aW9uIG1heSB0aGVuIGJlIHVzZWQKKyAqICAgZm9yIGFuIGFyYml0YXJ5IGFtb3VudCBvZiB0aW1lcyBhbmQgZXZlbiBpbiBwYXJhbGxlbCBhcyBsb25nIGFzIGEKKyAqICAgc2VwYXJhdGUgc3RydWN0IHRzX3N0YXRlIHZhcmlhYmxlIGlzIHByb3ZpZGVkIHRvIGV2ZXJ5IGluc3RhbmNlLgorICoKKyAqICAgVGhlIGFjdHVhbCBzZWFyY2ggaXMgcGVyZm9ybWVkIGJ5IGVpdGhlciBjYWxsaW5nIHRleHRzZWFyY2hfZmluZF8tCisgKiAgIGNvbnRpbnVvdXMoKSBmb3IgbGluZWFyIGRhdGEgb3IgYnkgcHJvdmlkaW5nIGFuIG93biBnZXRfbmV4dF9ibG9jaygpCisgKiAgIGltcGxlbWVudGF0aW9uIGFuZCBjYWxsaW5nIHRleHRzZWFyY2hfZmluZCgpLiBCb3RoIGZ1bmN0aW9ucyByZXR1cm4KKyAqICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBwYXRlcm4gb3IgVUlOVF9NQVggaWYKKyAqICAgbm8gbWF0Y2ggd2FzIGZvdW5kLiBTdWJzZXF1ZW50IG9jY3VyZW5jZXMgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcKKyAqICAgdGV4dHNlYXJjaF9uZXh0KCkgcmVnYXJkbGVzcyBvZiB0aGUgbGluZWFyaXR5IG9mIHRoZSBkYXRhLgorICoKKyAqICAgT25jZSB5b3UncmUgZG9uZSB1c2luZyBhIGNvbmZpZ3VyYXRpb24gaXQgbXVzdCBiZSBnaXZlbiBiYWNrIHZpYQorICogICB0ZXh0c2VhcmNoX2Rlc3Ryb3kuCisgKgorICogRVhBTVBMRQorICoKKyAqICAgaW50IHBvczsKKyAqICAgc3RydWN0IHRzX2NvbmZpZyAqY29uZjsKKyAqICAgc3RydWN0IHRzX3N0YXRlIHN0YXRlOworICogICBjb25zdCBjaGFyICpwYXR0ZXJuID0gImNoaWNrZW4iOworICogICBjb25zdCBjaGFyICpleGFtcGxlID0gIldlIGRhbmNlIHRoZSBmdW5reSBjaGlja2VuIjsKKyAqCisgKiAgIGNvbmYgPSB0ZXh0c2VhcmNoX3ByZXBhcmUoImttcCIsIHBhdHRlcm4sIHN0cmxlbihwYXR0ZXJuKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMLCBUU19BVVRPTE9BRCk7CisgKiAgIGlmIChJU19FUlIoY29uZikpIHsKKyAqICAgICAgIGVyciA9IFBUUl9FUlIoY29uZik7CisgKiAgICAgICBnb3RvIGVycm91dDsKKyAqICAgfQorICoKKyAqICAgcG9zID0gdGV4dHNlYXJjaF9maW5kX2NvbnRpbnVvdXMoY29uZiwgJnN0YXRlLCBleGFtcGxlLCBzdHJsZW4oZXhhbXBsZSkpOworICogICBpZiAocG9zICE9IFVJTlRfTUFYKQorICogICAgICAgcGFuaWMoIk9oIG15IGdvZCwgZGFuY2luZyBjaGlja2VucyBhdCAlZFxuIiwgcG9zKTsKKyAqCisgKiAgIHRleHRzZWFyY2hfZGVzdHJveShjb25mKTsKKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KKworc3RhdGljIExJU1RfSEVBRCh0c19vcHMpOworc3RhdGljIERFRklORV9TUElOTE9DSyh0c19tb2RfbG9jayk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRzX29wcyAqbG9va3VwX3RzX2FsZ28oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdHNfb3BzICpvOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG8sICZ0c19vcHMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAobmFtZSwgby0+bmFtZSkpIHsKKwkJCWlmICghdHJ5X21vZHVsZV9nZXQoby0+b3duZXIpKQorCQkJCW8gPSBOVUxMOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlyZXR1cm4gbzsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHRleHRzZWFyY2hfcmVnaXN0ZXIgLSByZWdpc3RlciBhIHRleHRzZWFyY2ggbW9kdWxlCisgKiBAb3BzOiBvcGVyYXRpb25zIGxvb2t1cCB0YWJsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgdGV4dHNlYXJjaCBtb2R1bGVzIHRvIGFubm91bmNlCisgKiB0aGVpciBwcmVzZW5jZS4gVGhlIHNwZWNpZmllZCAmQG9wcyBtdXN0IGhhdmUgJW5hbWUgc2V0IHRvIGEKKyAqIHVuaXF1ZSBpZGVudGlmaWVyIGFuZCB0aGUgY2FsbGJhY2tzIGZpbmQoKSwgaW5pdCgpLCBnZXRfcGF0dGVybigpLAorICogYW5kIGdldF9wYXR0ZXJuX2xlbigpIG11c3QgYmUgaW1wbGVtZW50ZWQuCisgKgorICogUmV0dXJucyAwIG9yIC1FRVhJU1RTIGlmIGFub3RoZXIgbW9kdWxlIGhhcyBhbHJlYWR5IHJlZ2lzdGVyZWQKKyAqIHdpdGggc2FtZSBuYW1lLgorICovCitpbnQgdGV4dHNlYXJjaF9yZWdpc3RlcihzdHJ1Y3QgdHNfb3BzICpvcHMpCit7CisJaW50IGVyciA9IC1FRVhJU1Q7CisJc3RydWN0IHRzX29wcyAqbzsKKworCWlmIChvcHMtPm5hbWUgPT0gTlVMTCB8fCBvcHMtPmZpbmQgPT0gTlVMTCB8fCBvcHMtPmluaXQgPT0gTlVMTCB8fAorCSAgICBvcHMtPmdldF9wYXR0ZXJuID09IE5VTEwgfHwgb3BzLT5nZXRfcGF0dGVybl9sZW4gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJnRzX21vZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG8sICZ0c19vcHMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAob3BzLT5uYW1lLCBvLT5uYW1lKSkKKwkJCWdvdG8gZXJyb3V0OworCX0KKworCWxpc3RfYWRkX3RhaWxfcmN1KCZvcHMtPmxpc3QsICZ0c19vcHMpOworCWVyciA9IDA7CitlcnJvdXQ6CisJc3Bpbl91bmxvY2soJnRzX21vZF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHRleHRzZWFyY2hfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgYSB0ZXh0c2VhcmNoIG1vZHVsZQorICogQG9wczogb3BlcmF0aW9ucyBsb29rdXAgdGFibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IHRleHRzZWFyY2ggbW9kdWxlcyB0byBhbm5vdW5jZQorICogdGhlaXIgZGlzYXBwZWFyYW5jZSBmb3IgZXhhbXBsZXMgd2hlbiB0aGUgbW9kdWxlIGdldHMgdW5sb2FkZWQuCisgKiBUaGUgJm9wcyBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIGR1cmluZyB0aGUKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRU5PRU5UIGlmIG5vIG1hdGNoaW5nIHRleHRzZWFyY2gKKyAqIHJlZ2lzdHJhdGlvbiB3YXMgZm91bmQuCisgKi8KK2ludCB0ZXh0c2VhcmNoX3VucmVnaXN0ZXIoc3RydWN0IHRzX29wcyAqb3BzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB0c19vcHMgKm87CisKKwlzcGluX2xvY2soJnRzX21vZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG8sICZ0c19vcHMsIGxpc3QpIHsKKwkJaWYgKG8gPT0gb3BzKSB7CisJCQlsaXN0X2RlbF9yY3UoJm8tPmxpc3QpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwllcnIgPSAtRU5PRU5UOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0c19tb2RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHRzX2xpbmVhcl9zdGF0ZQoreworCXVuc2lnbmVkIGludAlsZW47CisJY29uc3Qgdm9pZAkqZGF0YTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2xpbmVhcl9kYXRhKHVuc2lnbmVkIGludCBjb25zdW1lZCwgY29uc3QgdTggKipkc3QsCisJCQkJICAgIHN0cnVjdCB0c19jb25maWcgKmNvbmYsCisJCQkJICAgIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHRzX2xpbmVhcl9zdGF0ZSAqc3QgPSAoc3RydWN0IHRzX2xpbmVhcl9zdGF0ZSAqKSBzdGF0ZS0+Y2I7CisKKwlpZiAobGlrZWx5KGNvbnN1bWVkIDwgc3QtPmxlbikpIHsKKwkJKmRzdCA9IHN0LT5kYXRhICsgY29uc3VtZWQ7CisJCXJldHVybiBzdC0+bGVuIC0gY29uc3VtZWQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdGV4dHNlYXJjaF9maW5kX2NvbnRpbnVvdXMgLSBzZWFyY2ggYSBwYXR0ZXJuIGluIGNvbnRpbnVvdXMvbGluZWFyIGRhdGEKKyAqIEBjb25mOiBzZWFyY2ggY29uZmlndXJhdGlvbgorICogQHN0YXRlOiBzZWFyY2ggc3RhdGUKKyAqIEBkYXRhOiBkYXRhIHRvIHNlYXJjaCBpbgorICogQGxlbjogbGVuZ3RoIG9mIGRhdGEKKyAqCisgKiBBIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0ZXh0c2VhcmNoX2ZpbmQoKSBmb3IgY29udGludW91cy9saW5lYXIgZGF0YS4KKyAqIENhbGwgdGV4dHNlYXJjaF9uZXh0KCkgdG8gcmV0cmlldmUgc3Vic2VxdWVudCBtYXRjaGVzLgorICoKKyAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4gb3IKKyAqIFVJTlRfTUFYIGlmIG5vIG9jY3VycmVuY2Ugd2FzIGZvdW5kLgorICovIAordW5zaWduZWQgaW50IHRleHRzZWFyY2hfZmluZF9jb250aW51b3VzKHN0cnVjdCB0c19jb25maWcgKmNvbmYsCisJCQkJCXN0cnVjdCB0c19zdGF0ZSAqc3RhdGUsCisJCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHRzX2xpbmVhcl9zdGF0ZSAqc3QgPSAoc3RydWN0IHRzX2xpbmVhcl9zdGF0ZSAqKSBzdGF0ZS0+Y2I7CisKKwljb25mLT5nZXRfbmV4dF9ibG9jayA9IGdldF9saW5lYXJfZGF0YTsKKwlzdC0+ZGF0YSA9IGRhdGE7CisJc3QtPmxlbiA9IGxlbjsKKworCXJldHVybiB0ZXh0c2VhcmNoX2ZpbmQoY29uZiwgc3RhdGUpOworfQorCisvKioKKyAqIHRleHRzZWFyY2hfcHJlcGFyZSAtIFByZXBhcmUgYSBzZWFyY2gKKyAqIEBhbGdvOiBuYW1lIG9mIHNlYXJjaCBhbGdvcml0aG0KKyAqIEBwYXR0ZXJuOiBwYXR0ZXJuIGRhdGEKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXR0ZXJuCisgKiBAZ2ZwX21hc2s6IGFsbG9jYXRpb24gbWFzaworICogQGZsYWdzOiBzZWFyY2ggZmxhZ3MKKyAqCisgKiBMb29rcyB1cCB0aGUgc2VhcmNoIGFsZ29yaXRobSBtb2R1bGUgYW5kIGNyZWF0ZXMgYSBuZXcgdGV4dHNlYXJjaAorICogY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLiBVcG9uIGNvbXBsZXRpb24gYWxsCisgKiBuZWNlc3NhcnkgcmVmY250cyBhcmUgaGVsZCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBiZSBwdXQgYmFjaworICogdXNpbmcgdGV4dHNlYXJjaF9wdXQoKSBhZnRlciB1c2FnZS4KKyAqCisgKiBOb3RlOiBUaGUgZm9ybWF0IG9mIHRoZSBwYXR0ZXJuIG1heSBub3QgYmUgY29tcGF0aWJsZSBiZXR3ZWVuCisgKiAgICAgICB0aGUgdmFyaW91cyBzZWFyY2ggYWxnb3JpdGhtcy4KKyAqCisgKiBSZXR1cm5zIGEgbmV3IHRleHRzZWFyY2ggY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorICogICAgICAgICBwYXJhbWV0ZXJzIG9yIGEgRVJSX1BUUigpLgorICovCitzdHJ1Y3QgdHNfY29uZmlnICp0ZXh0c2VhcmNoX3ByZXBhcmUoY29uc3QgY2hhciAqYWxnbywgY29uc3Qgdm9pZCAqcGF0dGVybiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBsZW4sIGludCBnZnBfbWFzaywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSAtRU5PRU5UOworCXN0cnVjdCB0c19jb25maWcgKmNvbmY7CisJc3RydWN0IHRzX29wcyAqb3BzOworCQorCW9wcyA9IGxvb2t1cF90c19hbGdvKGFsZ28pOworI2lmZGVmIENPTkZJR19LTU9ECisJLyoKKwkgKiBXaHkgbm90IGFsd2F5cyBhdXRvbG9hZCB5b3UgbWF5IGFzay4gU29tZSB1c2VycyBhcmUKKwkgKiBpbiBhIHNpdHVhdGlvbiB3aGVyZSByZXF1ZXN0aW5nIGEgbW9kdWxlIG1heSBkZWFkbG9jaywKKwkgKiBlc3BlY2lhbGx5IHdoZW4gdGhlIG1vZHVsZSBpcyBsb2NhdGVkIG9uIGEgTkZTIG1vdW50LgorCSAqLworCWlmIChvcHMgPT0gTlVMTCAmJiBmbGFncyAmIFRTX0FVVE9MT0FEKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJ0c18lcyIsIGFsZ28pOworCQlvcHMgPSBsb29rdXBfdHNfYWxnbyhhbGdvKTsKKwl9CisjZW5kaWYKKworCWlmIChvcHMgPT0gTlVMTCkKKwkJZ290byBlcnJvdXQ7CisKKwljb25mID0gb3BzLT5pbml0KHBhdHRlcm4sIGxlbiwgZ2ZwX21hc2spOworCWlmIChJU19FUlIoY29uZikpIHsKKwkJZXJyID0gUFRSX0VSUihjb25mKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJY29uZi0+b3BzID0gb3BzOworCXJldHVybiBjb25mOworCitlcnJvdXQ6CisJaWYgKG9wcykKKwkJbW9kdWxlX3B1dChvcHMtPm93bmVyKTsKKwkJCisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiB0ZXh0c2VhcmNoX2Rlc3Ryb3kgLSBkZXN0cm95IGEgc2VhcmNoIGNvbmZpZ3VyYXRpb24KKyAqIEBjb25mOiBzZWFyY2ggY29uZmlndXJhdGlvbgorICoKKyAqIFJlbGVhc2VzIGFsbCByZWZlcmVuY2VzIG9mIHRoZSBjb25maWd1cmF0aW9uIGFuZCBmcmVlcworICogdXAgdGhlIG1lbW9yeS4KKyAqLwordm9pZCB0ZXh0c2VhcmNoX2Rlc3Ryb3koc3RydWN0IHRzX2NvbmZpZyAqY29uZikKK3sKKwlpZiAoY29uZi0+b3BzKSB7CisJCWlmIChjb25mLT5vcHMtPmRlc3Ryb3kpCisJCQljb25mLT5vcHMtPmRlc3Ryb3koY29uZik7CisJCW1vZHVsZV9wdXQoY29uZi0+b3BzLT5vd25lcik7CisJfQorCisJa2ZyZWUoY29uZik7Cit9CisKK0VYUE9SVF9TWU1CT0wodGV4dHNlYXJjaF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHRleHRzZWFyY2hfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKHRleHRzZWFyY2hfcHJlcGFyZSk7CitFWFBPUlRfU1lNQk9MKHRleHRzZWFyY2hfZmluZF9jb250aW51b3VzKTsKK0VYUE9SVF9TWU1CT0wodGV4dHNlYXJjaF9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL2xpYi90c19mc20uYyBiL2xpYi90c19mc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjdjMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3RzX2ZzbS5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogbGliL3RzX2ZzbS5jCSAgIEEgbmFpdmUgZmluaXRlIHN0YXRlIG1hY2hpbmUgdGV4dCBzZWFyY2ggYXBwcm9hY2gKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqICAgQSBmaW5pdGUgc3RhdGUgbWFjaGluZSBjb25zaXN0cyBvZiBuIHN0YXRlcyAoc3RydWN0IHRzX2ZzbV90b2tlbikKKyAqICAgcmVwcmVzZW50aW5nIHRoZSBwYXR0ZXJuIGFzIGEgZmluaXRlIGF1dG9tYXRpb24uIFRoZSBkYXRhIGlzIHJlYWQKKyAqICAgc2VxdWVudGlhbGx5IG9uIGEgb2N0ZXQgYmFzaXMuIEV2ZXJ5IHN0YXRlIHRva2VuIHNwZWNpZmllcyB0aGUgbnVtYmVyCisgKiAgIG9mIHJlY3VycmVuY2VzIGFuZCB0aGUgdHlwZSBvZiB2YWx1ZSBhY2NlcHRlZCB3aGljaCBjYW4gYmUgZWl0aGVyIGEKKyAqICAgc3BlY2lmaWMgY2hhcmFjdGVyIG9yIGN0eXBlIGJhc2VkIHNldCBvZiBjaGFyYWN0ZXJzLiBUaGUgYXZhaWxhYmxlCisgKiAgIHR5cGUgb2YgcmVjdXJyZW5jZXMgaW5jbHVkZSAxLCAoMHwxKSwgWzAgbl0sIGFuZCBbMSBuXS4KKyAqCisgKiAgIFRoZSBhbGdvcml0aG0gZGlmZmVycyBiZXR3ZWVuIHN0cmljdC9ub24tc3RyaWN0IG1vZGUgc3BlY3lmaW5nCisgKiAgIHdoZXRoZXIgdGhlIHBhdHRlcm4gaGFzIHRvIHN0YXJ0IGF0IHRoZSBmaXJzdCBvY3RlY3QuIFN0cmljdCBtb2RlCisgKiAgIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IGluc2VydGluZworICogICBUU19GU01fSEVBRF9JR05PUkUgYXMgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBjaGFpbi4KKyAqCisgKiAgIFRoZSBydW50aW1lIHBlcmZvcm1hbmNlIG9mIHRoZSBhbGdvcml0aG0gc2hvdWxkIGJlIGFyb3VuZCBPKG4pLAorICogICBob3dldmVyIHdoaWxlIGluIHN0cmljdCBtb2RlIHRoZSBhdmVyYWdlIHJ1bnRpbWUgY2FuIGJlIGJldHRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KKyNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoX2ZzbS5oPgorCitzdHJ1Y3QgdHNfZnNtCit7CisJdW5zaWduZWQgaW50CQludG9rZW5zOworCXN0cnVjdCB0c19mc21fdG9rZW4JdG9rZW5zWzBdOworfTsKKworLyogb3RoZXIgdmFsdWVzIGRlcml2ZWQgZnJvbSBjdHlwZS5oICovCisjZGVmaW5lIF9BCQkweDEwMCAvKiBhc2NpaSAqLworI2RlZmluZSBfVwkJMHgyMDAgLyogd2lsZGNhcmQgKi8KKworLyogTWFwIHRvIF9jdHlwZSBmbGFncyBhbmQgc29tZSBtYWdpYyBudW1iZXJzICovCitzdGF0aWMgdTE2IHRva2VuX21hcFtUU19GU01fVFlQRV9NQVgrMV0gPSB7CisJW1RTX0ZTTV9TUEVDSUZJQ10gPSAwLAorCVtUU19GU01fV0lMRENBUkRdID0gX1csCisJW1RTX0ZTTV9DTlRSTF0JICA9IF9DLAorCVtUU19GU01fTE9XRVJdCSAgPSBfTCwKKwlbVFNfRlNNX1VQUEVSXQkgID0gX1UsCisJW1RTX0ZTTV9QVU5DVF0JICA9IF9QLAorCVtUU19GU01fU1BBQ0VdCSAgPSBfUywKKwlbVFNfRlNNX0RJR0lUXQkgID0gX0QsCisJW1RTX0ZTTV9YRElHSVRdCSAgPSBfRCB8IF9YLAorCVtUU19GU01fQUxQSEFdCSAgPSBfVSB8IF9MLAorCVtUU19GU01fQUxOVU1dCSAgPSBfVSB8IF9MIHwgX0QsCisJW1RTX0ZTTV9QUklOVF0JICA9IF9QIHwgX1UgfCBfTCB8IF9EIHwgX1NQLAorCVtUU19GU01fR1JBUEhdCSAgPSBfUCB8IF9VIHwgX0wgfCBfRCwKKwlbVFNfRlNNX0FTQ0lJXQkgID0gX0EsCit9OworCitzdGF0aWMgdTE2IHRva2VuX2xvb2t1cF90YmxbMjU2XSA9IHsKK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAgMC0gIDMgKi8KK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAgNC0gIDcgKi8KK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DfF9TLCAgX1d8X0F8X0N8X1MsICBfV3xfQXxfQ3xfUywJCS8qICAgOC0gMTEgKi8KK19XfF9BfF9DfF9TLCAgIF9XfF9BfF9DfF9TLCAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAxMi0gMTUgKi8KK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAxNi0gMTkgKi8KK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAyMC0gMjMgKi8KK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAyNC0gMjcgKi8KK19XfF9BfF9DLCAgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsICAgICBfV3xfQXxfQywJCS8qICAyOC0gMzEgKi8KK19XfF9BfF9TfF9TUCwgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICAzMi0gMzUgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICAzNi0gMzkgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICA0MC0gNDMgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICA0NC0gNDcgKi8KK19XfF9BfF9ELCAgICAgIF9XfF9BfF9ELCAgICAgX1d8X0F8X0QsICAgICBfV3xfQXxfRCwJCS8qICA0OC0gNTEgKi8KK19XfF9BfF9ELCAgICAgIF9XfF9BfF9ELCAgICAgX1d8X0F8X0QsICAgICBfV3xfQXxfRCwJCS8qICA1Mi0gNTUgKi8KK19XfF9BfF9ELCAgICAgIF9XfF9BfF9ELCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICA1Ni0gNTkgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICA2MC0gNjMgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9VfF9YLCAgX1d8X0F8X1V8X1gsICBfV3xfQXxfVXxfWCwJCS8qICA2NC0gNjcgKi8KK19XfF9BfF9VfF9YLCAgIF9XfF9BfF9VfF9YLCAgX1d8X0F8X1V8X1gsICBfV3xfQXxfVSwJCS8qICA2OC0gNzEgKi8KK19XfF9BfF9VLCAgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsICAgICBfV3xfQXxfVSwJCS8qICA3Mi0gNzUgKi8KK19XfF9BfF9VLCAgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsICAgICBfV3xfQXxfVSwJCS8qICA3Ni0gNzkgKi8KK19XfF9BfF9VLCAgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsICAgICBfV3xfQXxfVSwJCS8qICA4MC0gODMgKi8KK19XfF9BfF9VLCAgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsICAgICBfV3xfQXxfVSwJCS8qICA4NC0gODcgKi8KK19XfF9BfF9VLCAgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsICAgICBfV3xfQXxfUCwJCS8qICA4OC0gOTEgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfUCwJCS8qICA5Mi0gOTUgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9MfF9YLCAgX1d8X0F8X0x8X1gsICBfV3xfQXxfTHxfWCwJCS8qICA5Ni0gOTkgKi8KK19XfF9BfF9MfF9YLCAgIF9XfF9BfF9MfF9YLCAgX1d8X0F8X0x8X1gsICBfV3xfQXxfTCwJCS8qIDEwMC0xMDMgKi8KK19XfF9BfF9MLCAgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsICAgICBfV3xfQXxfTCwJCS8qIDEwNC0xMDcgKi8KK19XfF9BfF9MLCAgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsICAgICBfV3xfQXxfTCwJCS8qIDEwOC0xMTEgKi8KK19XfF9BfF9MLCAgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsICAgICBfV3xfQXxfTCwJCS8qIDExMi0xMTUgKi8KK19XfF9BfF9MLCAgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsICAgICBfV3xfQXxfTCwJCS8qIDExNi0xMTkgKi8KK19XfF9BfF9MLCAgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsICAgICBfV3xfQXxfUCwJCS8qIDEyMC0xMjMgKi8KK19XfF9BfF9QLCAgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsICAgICBfV3xfQXxfQywJCS8qIDEyNC0xMjcgKi8KK19XLCAgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csICAgICAgICAgICBfVywJCQkvKiAxMjgtMTMxICovCitfVywgICAgICAgICAgICBfVywgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csCQkJLyogMTMyLTEzNSAqLworX1csICAgICAgICAgICAgX1csICAgICAgICAgICBfVywgICAgICAgICAgIF9XLAkJCS8qIDEzNi0xMzkgKi8KK19XLCAgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csICAgICAgICAgICBfVywJCQkvKiAxNDAtMTQzICovCitfVywgICAgICAgICAgICBfVywgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csCQkJLyogMTQ0LTE0NyAqLworX1csICAgICAgICAgICAgX1csICAgICAgICAgICBfVywgICAgICAgICAgIF9XLAkJCS8qIDE0OC0xNTEgKi8KK19XLCAgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csICAgICAgICAgICBfVywJCQkvKiAxNTItMTU1ICovCitfVywgICAgICAgICAgICBfVywgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csCQkJLyogMTU2LTE1OSAqLworX1d8X1N8X1NQLCAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTYwLTE2MyAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTY0LTE2NyAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTY4LTE3MSAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTcyLTE3NSAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTc2LTE3OSAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTgwLTE4MyAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTg0LTE4NyAqLworX1d8X1AsICAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwgICAgICAgIF9XfF9QLAkJLyogMTg4LTE5MSAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9VLAkJLyogMTkyLTE5NSAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9VLAkJLyogMTk2LTE5OSAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9VLAkJLyogMjAwLTIwMyAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9VLAkJLyogMjA0LTIwNyAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9VLAkJLyogMjA4LTIxMSAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9QLAkJLyogMjEyLTIxNSAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9VLAkJLyogMjE2LTIxOSAqLworX1d8X1UsICAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwgICAgICAgIF9XfF9MLAkJLyogMjIwLTIyMyAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MLAkJLyogMjI0LTIyNyAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MLAkJLyogMjI4LTIzMSAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MLAkJLyogMjMyLTIzNSAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MLAkJLyogMjM2LTIzOSAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MLAkJLyogMjQwLTI0MyAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9QLAkJLyogMjQ0LTI0NyAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MLAkJLyogMjQ4LTI1MSAqLworX1d8X0wsICAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwgICAgICAgIF9XfF9MfTsJCS8qIDI1Mi0yNTUgKi8KKworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfdG9rZW4oc3RydWN0IHRzX2ZzbV90b2tlbiAqdCwgdTggZCkKK3sKKwlpZiAodC0+dHlwZSkKKwkJcmV0dXJuICh0b2tlbl9sb29rdXBfdGJsW2RdICYgdC0+dHlwZSkgIT0gMDsKKwllbHNlCisJCXJldHVybiB0LT52YWx1ZSA9PSBkOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGZzbV9maW5kKHN0cnVjdCB0c19jb25maWcgKmNvbmYsIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHRzX2ZzbSAqZnNtID0gdHNfY29uZmlnX3ByaXYoY29uZik7CisJc3RydWN0IHRzX2ZzbV90b2tlbiAqY3VyID0gTlVMTCwgKm5leHQ7CisJdW5zaWduZWQgaW50IG1hdGNoX3N0YXJ0LCBibG9ja19pZHggPSAwLCB0b2tfaWR4OworCXVuc2lnbmVkIGJsb2NrX2xlbiA9IDAsIHN0cmljdCwgY29uc3VtZWQgPSBzdGF0ZS0+b2Zmc2V0OworCWNvbnN0IHU4ICpkYXRhOworCisjZGVmaW5lIEdFVF9ORVhUX0JMT0NLKCkJCVwKKyh7CWNvbnN1bWVkICs9IGJsb2NrX2lkeDsJCVwKKwlibG9ja19pZHggPSAwOwkJCVwKKwlibG9ja19sZW4gPSBjb25mLT5nZXRfbmV4dF9ibG9jayhjb25zdW1lZCwgJmRhdGEsIGNvbmYsIHN0YXRlKTsgfSkKKworI2RlZmluZSBUT0tFTl9NSVNNQVRDSCgpCQlcCisJZG8gewkJCQlcCisJCWlmIChzdHJpY3QpCQlcCisJCQlnb3RvIG5vX21hdGNoOwlcCisJCWJsb2NrX2lkeCsrOwkJXAorCQlnb3RvIHN0YXJ0b3ZlcjsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgZW5kX29mX2RhdGEoKSB1bmxpa2VseShibG9ja19pZHggPj0gYmxvY2tfbGVuICYmICFHRVRfTkVYVF9CTE9DSygpKQorCisJaWYgKGVuZF9vZl9kYXRhKCkpCisJCWdvdG8gbm9fbWF0Y2g7CisKKwlzdHJpY3QgPSBmc20tPnRva2Vuc1swXS5yZWN1ciAhPSBUU19GU01fSEVBRF9JR05PUkU7CisKK3N0YXJ0b3ZlcjoKKwltYXRjaF9zdGFydCA9IGNvbnN1bWVkICsgYmxvY2tfaWR4OworCisJZm9yICh0b2tfaWR4ID0gMDsgdG9rX2lkeCA8IGZzbS0+bnRva2VuczsgdG9rX2lkeCsrKSB7CisJCWN1ciA9ICZmc20tPnRva2Vuc1t0b2tfaWR4XTsKKworCQlpZiAobGlrZWx5KHRva19pZHggPCAoZnNtLT5udG9rZW5zIC0gMSkpKQorCQkJbmV4dCA9ICZmc20tPnRva2Vuc1t0b2tfaWR4ICsgMV07CisJCWVsc2UKKwkJCW5leHQgPSBOVUxMOworCisJCXN3aXRjaCAoY3VyLT5yZWN1cikgeworCQljYXNlIFRTX0ZTTV9TSU5HTEU6CisJCQlpZiAoZW5kX29mX2RhdGEoKSkKKwkJCQlnb3RvIG5vX21hdGNoOworCisJCQlpZiAoIW1hdGNoX3Rva2VuKGN1ciwgZGF0YVtibG9ja19pZHhdKSkKKwkJCQlUT0tFTl9NSVNNQVRDSCgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUU19GU01fUEVSSEFQUzoKKwkJCWlmIChlbmRfb2ZfZGF0YSgpIHx8CisJCQkgICAgIW1hdGNoX3Rva2VuKGN1ciwgZGF0YVtibG9ja19pZHhdKSkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgVFNfRlNNX01VTFRJOgorCQkJaWYgKGVuZF9vZl9kYXRhKCkpCisJCQkJZ290byBub19tYXRjaDsKKworCQkJaWYgKCFtYXRjaF90b2tlbihjdXIsIGRhdGFbYmxvY2tfaWR4XSkpCisJCQkJVE9LRU5fTUlTTUFUQ0goKTsKKworCQkJYmxvY2tfaWR4Kys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFRTX0ZTTV9BTlk6CisJCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJCWdvdG8gZm91bmRfbWF0Y2g7CisKKwkJCWlmIChlbmRfb2ZfZGF0YSgpKQorCQkJCWNvbnRpbnVlOworCisJCQl3aGlsZSAoIW1hdGNoX3Rva2VuKG5leHQsIGRhdGFbYmxvY2tfaWR4XSkpIHsKKwkJCQlpZiAoIW1hdGNoX3Rva2VuKGN1ciwgZGF0YVtibG9ja19pZHhdKSkKKwkJCQkJVE9LRU5fTUlTTUFUQ0goKTsKKwkJCQlibG9ja19pZHgrKzsKKwkJCQlpZiAoZW5kX29mX2RhdGEoKSkKKwkJCQkJZ290byBub19tYXRjaDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE9wdGltaXphdGlvbjogUHJlZmVyIHNtYWxsIGxvY2FsIGxvb3Agb3ZlciBqdW1waW5nCisJCSAqIGJhY2sgYW5kIGZvcnRoIHVudGlsIGdhcmJhZ2UgYXQgaGVhZCBpcyBtdW5jaGVkLgorCQkgKi8KKwkJY2FzZSBUU19GU01fSEVBRF9JR05PUkU6CisJCQlpZiAoZW5kX29mX2RhdGEoKSkKKwkJCQljb250aW51ZTsKKworCQkJd2hpbGUgKCFtYXRjaF90b2tlbihuZXh0LCBkYXRhW2Jsb2NrX2lkeF0pKSB7CisJCQkJLyoKKwkJCQkgKiBTcGVjaWFsIGNhc2UsIGRvbid0IHN0YXJ0IG92ZXIgdXBvbgorCQkJCSAqIGEgbWlzbWF0Y2gsIGdpdmUgdGhlIHVzZXIgdGhlCisJCQkJICogY2hhbmNlIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZGF0YQorCQkJCSAqIGFsbG93ZWQgdG8gYmUgaWdub3JlZC4KKwkJCQkgKi8KKwkJCQlpZiAoIW1hdGNoX3Rva2VuKGN1ciwgZGF0YVtibG9ja19pZHhdKSkKKwkJCQkJZ290byBub19tYXRjaDsKKworCQkJCWJsb2NrX2lkeCsrOworCQkJCWlmIChlbmRfb2ZfZGF0YSgpKQorCQkJCQlnb3RvIG5vX21hdGNoOworCQkJfQorCisJCQltYXRjaF9zdGFydCA9IGNvbnN1bWVkICsgYmxvY2tfaWR4OworCQkJY29udGludWU7CisJCX0KKworCQlibG9ja19pZHgrKzsKKwl9CisKKwlpZiAoZW5kX29mX2RhdGEoKSkKKwkJZ290byBmb3VuZF9tYXRjaDsKKworbm9fbWF0Y2g6CisJcmV0dXJuIFVJTlRfTUFYOworCitmb3VuZF9tYXRjaDoKKwlzdGF0ZS0+b2Zmc2V0ID0gY29uc3VtZWQgKyBibG9ja19pZHg7CisJcmV0dXJuIG1hdGNoX3N0YXJ0OworfQorCitzdGF0aWMgc3RydWN0IHRzX2NvbmZpZyAqZnNtX2luaXQoY29uc3Qgdm9pZCAqcGF0dGVybiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgICAgIGludCBnZnBfbWFzaykKK3sKKwlpbnQgaSwgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3QgdHNfY29uZmlnICpjb25mOworCXN0cnVjdCB0c19mc20gKmZzbTsKKwlzdHJ1Y3QgdHNfZnNtX3Rva2VuICp0b2tlbnMgPSAoc3RydWN0IHRzX2ZzbV90b2tlbiAqKSBwYXR0ZXJuOworCXVuc2lnbmVkIGludCBudG9rZW5zID0gbGVuIC8gc2l6ZW9mKCp0b2tlbnMpOworCXNpemVfdCBwcml2X3NpemUgPSBzaXplb2YoKmZzbSkgKyBsZW47CisKKwlpZiAobGVuICAlIHNpemVvZihzdHJ1Y3QgdHNfZnNtX3Rva2VuKSB8fCBudG9rZW5zIDwgMSkKKwkJZ290byBlcnJvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnRva2VuczsgaSsrKSB7CisJCXN0cnVjdCB0c19mc21fdG9rZW4gKnQgPSAmdG9rZW5zW2ldOworCisJCWlmICh0LT50eXBlID4gVFNfRlNNX1RZUEVfTUFYIHx8IHQtPnJlY3VyID4gVFNfRlNNX1JFQ1VSX01BWCkKKwkJCWdvdG8gZXJyb3V0OworCisJCWlmICh0LT5yZWN1ciA9PSBUU19GU01fSEVBRF9JR05PUkUgJiYKKwkJICAgIChpICE9IDAgfHwgaSA9PSAobnRva2VucyAtIDEpKSkKKwkJCWdvdG8gZXJyb3V0OworCX0KKworCWNvbmYgPSBhbGxvY190c19jb25maWcocHJpdl9zaXplLCBnZnBfbWFzayk7CisJaWYgKElTX0VSUihjb25mKSkKKwkJcmV0dXJuIGNvbmY7CisKKwlmc20gPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlmc20tPm50b2tlbnMgPSBudG9rZW5zOworCW1lbWNweShmc20tPnRva2VucywgcGF0dGVybiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBmc20tPm50b2tlbnM7IGkrKykgeworCQlzdHJ1Y3QgdHNfZnNtX3Rva2VuICp0ID0gJmZzbS0+dG9rZW5zW2ldOworCQl0LT50eXBlID0gdG9rZW5fbWFwW3QtPnR5cGVdOworCX0KKworCXJldHVybiBjb25mOworCitlcnJvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgKmZzbV9nZXRfcGF0dGVybihzdHJ1Y3QgdHNfY29uZmlnICpjb25mKQoreworCXN0cnVjdCB0c19mc20gKmZzbSA9IHRzX2NvbmZpZ19wcml2KGNvbmYpOworCXJldHVybiBmc20tPnRva2VuczsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmc21fZ2V0X3BhdHRlcm5fbGVuKHN0cnVjdCB0c19jb25maWcgKmNvbmYpCit7CisJc3RydWN0IHRzX2ZzbSAqZnNtID0gdHNfY29uZmlnX3ByaXYoY29uZik7CisJcmV0dXJuIGZzbS0+bnRva2VucyAqIHNpemVvZihzdHJ1Y3QgdHNfZnNtX3Rva2VuKTsKK30KKworc3RhdGljIHN0cnVjdCB0c19vcHMgZnNtX29wcyA9IHsKKwkubmFtZQkJICA9ICJmc20iLAorCS5maW5kCQkgID0gZnNtX2ZpbmQsCisJLmluaXQJCSAgPSBmc21faW5pdCwKKwkuZ2V0X3BhdHRlcm4JICA9IGZzbV9nZXRfcGF0dGVybiwKKwkuZ2V0X3BhdHRlcm5fbGVuICA9IGZzbV9nZXRfcGF0dGVybl9sZW4sCisJLm93bmVyCQkgID0gVEhJU19NT0RVTEUsCisJLmxpc3QJCSAgPSBMSVNUX0hFQURfSU5JVChmc21fb3BzLmxpc3QpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ZzbSh2b2lkKQoreworCXJldHVybiB0ZXh0c2VhcmNoX3JlZ2lzdGVyKCZmc21fb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZnNtKHZvaWQpCit7CisJdGV4dHNlYXJjaF91bnJlZ2lzdGVyKCZmc21fb3BzKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X2ZzbSk7Cittb2R1bGVfZXhpdChleGl0X2ZzbSk7CmRpZmYgLS1naXQgYS9saWIvdHNfa21wLmMgYi9saWIvdHNfa21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNjZiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi90c19rbXAuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIGxpYi90c19rbXAuYwkJS251dGgtTW9ycmlzLVByYXR0IHRleHQgc2VhcmNoIGltcGxlbWVudGF0aW9uCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIAorICogICBJbXBsZW1lbnRzIGEgbGluZWFyLXRpbWUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSBkdWUgdG8gS251dGgsCisgKiAgIE1vcnJpcywgYW5kIFByYXR0IFsxXS4gVGhlaXIgYWxnb3JpdGhtIGF2b2lkcyB0aGUgZXhwbGljaXQKKyAqICAgY29tcHV0YXRpb24gb2YgdGhlIHRyYW5zaXRpb24gZnVuY3Rpb24gREVMVEEgYWx0b2dldGhlci4gSXRzCisgKiAgIG1hdGNoaW5nIHRpbWUgaXMgTyhuKSwgZm9yIG4gYmVpbmcgbGVuZ3RoKHRleHQpLCB1c2luZyBqdXN0IGFuCisgKiAgIGF1eGlsaWFyeSBmdW5jdGlvbiBQSVsxLi5tXSwgZm9yIG0gYmVpbmcgbGVuZ3RoKHBhdHRlcm4pLAorICogICBwcmVjb21wdXRlZCBmcm9tIHRoZSBwYXR0ZXJuIGluIHRpbWUgTyhtKS4gVGhlIGFycmF5IFBJIGFsbG93cworICogICB0aGUgdHJhbnNpdGlvbiBmdW5jdGlvbiBERUxUQSB0byBiZSBjb21wdXRlZCBlZmZpY2llbnRseQorICogICAib24gdGhlIGZseSIgYXMgbmVlZGVkLiBSb3VnaGx5IHNwZWFraW5nLCBmb3IgYW55IHN0YXRlCisgKiAgICJxIiA9IDAsMSwuLi4sbSBhbmQgYW55IGNoYXJhY3RlciAiYSIgaW4gU0lHTUEsIHRoZSB2YWx1ZQorICogICBQSVsicSJdIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGlzIGluZGVwZW5kZW50IG9mICJhIiBhbmQKKyAqICAgaXMgbmVlZGVkIHRvIGNvbXB1dGUgREVMVEEoInEiLCAiYSIpIFsyXS4gU2luY2UgdGhlIGFycmF5IFBJCisgKiAgIGhhcyBvbmx5IG0gZW50cmllcywgd2hlcmVhcyBERUxUQSBoYXMgTyhtfFNJR01BfCkgZW50cmllcywgd2UKKyAqICAgc2F2ZSBhIGZhY3RvciBvZiB8U0lHTUF8IGluIHRoZSBwcmVwcm9jZXNzaW5nIHRpbWUgYnkgY29tcHV0aW5nCisgKiAgIFBJIHJhdGhlciB0aGFuIERFTFRBLgorICoKKyAqICAgWzFdIENvcm1lbiwgTGVpc2Vyc29uLCBSaXZlc3QsIFN0ZWluCisgKiAgICAgICBJbnRyb2RjdXRpb24gdG8gQWxnb3JpdGhtcywgMm5kIEVkaXRpb24sIE1JVCBQcmVzcworICogICBbMl0gU2VlIGZpbml0ZSBhdXRvbWF0aW9uIHRoZW9yeQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KKworc3RydWN0IHRzX2ttcAoreworCXU4ICoJCXBhdHRlcm47CisJdW5zaWduZWQgaW50CXBhdHRlcm5fbGVuOworCXVuc2lnbmVkIGludCAJcHJlZml4X3RibFswXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga21wX2ZpbmQoc3RydWN0IHRzX2NvbmZpZyAqY29uZiwgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgdHNfa21wICprbXAgPSB0c19jb25maWdfcHJpdihjb25mKTsKKwl1bnNpZ25lZCBpbnQgaSwgcSA9IDAsIHRleHRfbGVuLCBjb25zdW1lZCA9IHN0YXRlLT5vZmZzZXQ7CisJY29uc3QgdTggKnRleHQ7CisKKwlmb3IgKDs7KSB7CisJCXRleHRfbGVuID0gY29uZi0+Z2V0X25leHRfYmxvY2soY29uc3VtZWQsICZ0ZXh0LCBjb25mLCBzdGF0ZSk7CisKKwkJaWYgKHVubGlrZWx5KHRleHRfbGVuID09IDApKQorCQkJYnJlYWs7CisKKwkJZm9yIChpID0gMDsgaSA8IHRleHRfbGVuOyBpKyspIHsKKwkJCXdoaWxlIChxID4gMCAmJiBrbXAtPnBhdHRlcm5bcV0gIT0gdGV4dFtpXSkKKwkJCQlxID0ga21wLT5wcmVmaXhfdGJsW3EgLSAxXTsKKwkJCWlmIChrbXAtPnBhdHRlcm5bcV0gPT0gdGV4dFtpXSkKKwkJCQlxKys7CisJCQlpZiAodW5saWtlbHkocSA9PSBrbXAtPnBhdHRlcm5fbGVuKSkgeworCQkJCXN0YXRlLT5vZmZzZXQgPSBjb25zdW1lZCArIGkgKyAxOworCQkJCXJldHVybiBzdGF0ZS0+b2Zmc2V0IC0ga21wLT5wYXR0ZXJuX2xlbjsKKwkJCX0KKwkJfQorCisJCWNvbnN1bWVkICs9IHRleHRfbGVuOworCX0KKworCXJldHVybiBVSU5UX01BWDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbXB1dGVfcHJlZml4X3RibChjb25zdCB1OCAqcGF0dGVybiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnByZWZpeF90YmwpCit7CisJdW5zaWduZWQgaW50IGssIHE7CisKKwlmb3IgKGsgPSAwLCBxID0gMTsgcSA8IGxlbjsgcSsrKSB7CisJCXdoaWxlIChrID4gMCAmJiBwYXR0ZXJuW2tdICE9IHBhdHRlcm5bcV0pCisJCQlrID0gcHJlZml4X3RibFtrLTFdOworCQlpZiAocGF0dGVybltrXSA9PSBwYXR0ZXJuW3FdKQorCQkJaysrOworCQlwcmVmaXhfdGJsW3FdID0gazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHNfY29uZmlnICprbXBfaW5pdChjb25zdCB2b2lkICpwYXR0ZXJuLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCB0c19jb25maWcgKmNvbmY7CisJc3RydWN0IHRzX2ttcCAqa21wOworCXVuc2lnbmVkIGludCBwcmVmaXhfdGJsX2xlbiA9IGxlbiAqIHNpemVvZih1bnNpZ25lZCBpbnQpOworCXNpemVfdCBwcml2X3NpemUgPSBzaXplb2YoKmttcCkgKyBsZW4gKyBwcmVmaXhfdGJsX2xlbjsKKworCWNvbmYgPSBhbGxvY190c19jb25maWcocHJpdl9zaXplLCBnZnBfbWFzayk7CisJaWYgKElTX0VSUihjb25mKSkKKwkJcmV0dXJuIGNvbmY7CisKKwlrbXAgPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlrbXAtPnBhdHRlcm5fbGVuID0gbGVuOworCWNvbXB1dGVfcHJlZml4X3RibChwYXR0ZXJuLCBsZW4sIGttcC0+cHJlZml4X3RibCk7CisJa21wLT5wYXR0ZXJuID0gKHU4ICopIGttcC0+cHJlZml4X3RibCArIHByZWZpeF90YmxfbGVuOworCW1lbWNweShrbXAtPnBhdHRlcm4sIHBhdHRlcm4sIGxlbik7CisKKwlyZXR1cm4gY29uZjsKK30KKworc3RhdGljIHZvaWQgKmttcF9nZXRfcGF0dGVybihzdHJ1Y3QgdHNfY29uZmlnICpjb25mKQoreworCXN0cnVjdCB0c19rbXAgKmttcCA9IHRzX2NvbmZpZ19wcml2KGNvbmYpOworCXJldHVybiBrbXAtPnBhdHRlcm47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga21wX2dldF9wYXR0ZXJuX2xlbihzdHJ1Y3QgdHNfY29uZmlnICpjb25mKQoreworCXN0cnVjdCB0c19rbXAgKmttcCA9IHRzX2NvbmZpZ19wcml2KGNvbmYpOworCXJldHVybiBrbXAtPnBhdHRlcm5fbGVuOworfQorCitzdGF0aWMgc3RydWN0IHRzX29wcyBrbXBfb3BzID0geworCS5uYW1lCQkgID0gImttcCIsCisJLmZpbmQJCSAgPSBrbXBfZmluZCwKKwkuaW5pdAkJICA9IGttcF9pbml0LAorCS5nZXRfcGF0dGVybgkgID0ga21wX2dldF9wYXR0ZXJuLAorCS5nZXRfcGF0dGVybl9sZW4gID0ga21wX2dldF9wYXR0ZXJuX2xlbiwKKwkub3duZXIJCSAgPSBUSElTX01PRFVMRSwKKwkubGlzdAkJICA9IExJU1RfSEVBRF9JTklUKGttcF9vcHMubGlzdCkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfa21wKHZvaWQpCit7CisJcmV0dXJuIHRleHRzZWFyY2hfcmVnaXN0ZXIoJmttcF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9rbXAodm9pZCkKK3sKKwl0ZXh0c2VhcmNoX3VucmVnaXN0ZXIoJmttcF9vcHMpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfa21wKTsKK21vZHVsZV9leGl0KGV4aXRfa21wKTsKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggOGY3MGZmZC4uNGNkNjllMyAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTE5LDMgKzE5LDQgQEAKIG9iai0kKENPTkZJR19TSE1FTSkgKz0gc2htZW0ubwogb2JqLSQoQ09ORklHX1RJTllfU0hNRU0pICs9IHRpbnktc2htZW0ubwogCitvYmotJChDT05GSUdfRlNfWElQKSArPSBmaWxlbWFwX3hpcC5vCmRpZmYgLS1naXQgYS9tbS9ib290bWVtLmMgYi9tbS9ib290bWVtLmMKaW5kZXggZjgyZjdhZS4uYzEzMzBjYyAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtMzMsNiArMzMsMTQgQEAKIAkJCQkgKiBkbWFfZ2V0X3JlcXVpcmVkX21hc2soKSwgd2hpY2ggdXNlcwogCQkJCSAqIGl0LCBjYW4gYmUgYW4gaW5saW5lIGZ1bmN0aW9uICovCiAKKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorLyoKKyAqIElmIHdlIGhhdmUgYm9vdGVkIGR1ZSB0byBhIGNyYXNoLCBtYXhfcGZuIHdpbGwgYmUgYSB2ZXJ5IGxvdyB2YWx1ZS4gV2UgbmVlZAorICogdG8ga25vdyB0aGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHRoZSBwcmV2aW91cyBrZXJuZWwgdXNlZC4KKyAqLwordW5zaWduZWQgbG9uZyBzYXZlZF9tYXhfcGZuOworI2VuZGlmCisKIC8qIHJldHVybiB0aGUgbnVtYmVyIG9mIF9wYWdlc18gdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCBmb3IgdGhlIGJvb3QgYml0bWFwICovCiB1bnNpZ25lZCBsb25nIF9faW5pdCBib290bWVtX2Jvb3RtYXBfcGFnZXMgKHVuc2lnbmVkIGxvbmcgcGFnZXMpCiB7CkBAIC01Nyw3ICs2NSw3IEBACiAJcGdkYXQtPnBnZGF0X25leHQgPSBwZ2RhdF9saXN0OwogCXBnZGF0X2xpc3QgPSBwZ2RhdDsKIAotCW1hcHNpemUgPSAobWFwc2l6ZSArIChzaXplb2YobG9uZykgLSAxVUwpKSAmIH4oc2l6ZW9mKGxvbmcpIC0gMVVMKTsKKwltYXBzaXplID0gQUxJR04obWFwc2l6ZSwgc2l6ZW9mKGxvbmcpKTsKIAliZGF0YS0+bm9kZV9ib290bWVtX21hcCA9IHBoeXNfdG9fdmlydChtYXBzdGFydCA8PCBQQUdFX1NISUZUKTsKIAliZGF0YS0+bm9kZV9ib290X3N0YXJ0ID0gKHN0YXJ0IDw8IFBBR0VfU0hJRlQpOwogCWJkYXRhLT5ub2RlX2xvd19wZm4gPSBlbmQ7CkBAIC0xNzgsNyArMTg2LDcgQEAKIAl9IGVsc2UKIAkJcHJlZmVycmVkID0gMDsKIAotCXByZWZlcnJlZCA9ICgocHJlZmVycmVkICsgYWxpZ24gLSAxKSAmIH4oYWxpZ24gLSAxKSkgPj4gUEFHRV9TSElGVDsKKwlwcmVmZXJyZWQgPSBBTElHTihwcmVmZXJyZWQsIGFsaWduKSA+PiBQQUdFX1NISUZUOwogCXByZWZlcnJlZCArPSBvZmZzZXQ7CiAJYXJlYXNpemUgPSAoc2l6ZStQQUdFX1NJWkUtMSkvUEFHRV9TSVpFOwogCWluY3IgPSBhbGlnbiA+PiBQQUdFX1NISUZUID8gOiAxOwpAQCAtMjE5LDcgKzIyNyw3IEBACiAJICovCiAJaWYgKGFsaWduIDwgUEFHRV9TSVpFICYmCiAJICAgIGJkYXRhLT5sYXN0X29mZnNldCAmJiBiZGF0YS0+bGFzdF9wb3MrMSA9PSBzdGFydCkgewotCQlvZmZzZXQgPSAoYmRhdGEtPmxhc3Rfb2Zmc2V0K2FsaWduLTEpICYgfihhbGlnbi0xKTsKKwkJb2Zmc2V0ID0gQUxJR04oYmRhdGEtPmxhc3Rfb2Zmc2V0LCBhbGlnbik7CiAJCUJVR19PTihvZmZzZXQgPiBQQUdFX1NJWkUpOwogCQlyZW1haW5pbmdfc2l6ZSA9IFBBR0VfU0laRS1vZmZzZXQ7CiAJCWlmIChzaXplIDwgcmVtYWluaW5nX3NpemUpIHsKZGlmZiAtLWdpdCBhL21tL2ZhZHZpc2UuYyBiL21tL2ZhZHZpc2UuYwppbmRleCA1NzI2NGQ3Li41ZjE5ZTg3IDEwMDY0NAotLS0gYS9tbS9mYWR2aXNlLmMKKysrIGIvbW0vZmFkdmlzZS5jCkBAIC00Myw2ICs0MywxMCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAobWFwcGluZy0+YV9vcHMtPmdldF94aXBfcGFnZSkKKwkJLyogbm8gYmFkIHJldHVybiB2YWx1ZSwgYnV0IGlnbm9yZSBhZHZpY2UgKi8KKwkJZ290byBvdXQ7CisKIAkvKiBDYXJlZnVsIGFib3V0IG92ZXJmbG93cy4gTGVuID09IDAgbWVhbnMgImFzIG11Y2ggYXMgcG9zc2libGUiICovCiAJZW5kYnl0ZSA9IG9mZnNldCArIGxlbjsKIAlpZiAoIWxlbiB8fCBlbmRieXRlIDwgbGVuKQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IGEzNTk4YjUuLmMxMTQxOGQgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSAiZmlsZW1hcC5oIgogLyoKICAqIEZJWE1FOiByZW1vdmUgYWxsIGtub3dsZWRnZSBvZiB0aGUgYnVmZmVyIGxheWVyIGZyb20gdGhlIGNvcmUgVk0KICAqLwpAQCAtMTcxNCwzMiArMTcxNSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHJlbW92ZV9zdWlkKTsKIAotLyoKLSAqIENvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gaW50byB0aGUgcGFnZSBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2gKLSAqIHdlcmUgc3VjZXNzZnVsbHkgY29waWVkLiAgSWYgYSBmYXVsdCBpcyBlbmNvdW50ZXJlZCB0aGVuIGNsZWFyIHRoZSBwYWdlCi0gKiBvdXQgdG8gKG9mZnNldCtieXRlcykgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdlcmUgY29waWVkLgotICovCi1zdGF0aWMgaW5saW5lIHNpemVfdAotZmlsZW1hcF9jb3B5X2Zyb21fdXNlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBieXRlcykKLXsKLQljaGFyICprYWRkcjsKLQlpbnQgbGVmdDsKLQotCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCWxlZnQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKGthZGRyICsgb2Zmc2V0LCBidWYsIGJ5dGVzKTsKLQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0KLQlpZiAobGVmdCAhPSAwKSB7Ci0JCS8qIERvIGl0IHRoZSBzbG93IHdheSAqLwotCQlrYWRkciA9IGttYXAocGFnZSk7Ci0JCWxlZnQgPSBfX2NvcHlfZnJvbV91c2VyKGthZGRyICsgb2Zmc2V0LCBidWYsIGJ5dGVzKTsKLQkJa3VubWFwKHBhZ2UpOwotCX0KLQlyZXR1cm4gYnl0ZXMgLSBsZWZ0OwotfQotCi1zdGF0aWMgc2l6ZV90CitzaXplX3QKIF9fZmlsZW1hcF9jb3B5X2Zyb21fdXNlcl9pb3ZlYyhjaGFyICp2YWRkciwgCiAJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgc2l6ZV90IGJhc2UsIHNpemVfdCBieXRlcykKIHsKQEAgLTE3NjcsNTIgKzE3NDMsNiBAQAogfQogCiAvKgotICogVGhpcyBoYXMgdGhlIHNhbWUgc2lkZWVmZmVjdHMgYW5kIHJldHVybiB2YWx1ZSBhcyBmaWxlbWFwX2NvcHlfZnJvbV91c2VyKCkuCi0gKiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG9uIGEgZmF1bHQgd2UgbmVlZCB0byBtZW1zZXQgdGhlIHJlbWFpbmRlciBvZiB0aGUKLSAqIHBhZ2UgKG91dCB0byBvZmZzZXQrYnl0ZXMpLCB0byBlbXVsYXRlIGZpbGVtYXBfY29weV9mcm9tX3VzZXIoKSdzCi0gKiBzaW5nbGUtc2VnbWVudCBiZWhhdmlvdXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90Ci1maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBzaXplX3QgYmFzZSwgc2l6ZV90IGJ5dGVzKQotewotCWNoYXIgKmthZGRyOwotCXNpemVfdCBjb3BpZWQ7Ci0KLQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQljb3BpZWQgPSBfX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWMoa2FkZHIgKyBvZmZzZXQsIGlvdiwKLQkJCQkJCWJhc2UsIGJ5dGVzKTsKLQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JaWYgKGNvcGllZCAhPSBieXRlcykgewotCQlrYWRkciA9IGttYXAocGFnZSk7Ci0JCWNvcGllZCA9IF9fZmlsZW1hcF9jb3B5X2Zyb21fdXNlcl9pb3ZlYyhrYWRkciArIG9mZnNldCwgaW92LAotCQkJCQkJCWJhc2UsIGJ5dGVzKTsKLQkJa3VubWFwKHBhZ2UpOwotCX0KLQlyZXR1cm4gY29waWVkOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWZpbGVtYXBfc2V0X25leHRfaW92ZWMoY29uc3Qgc3RydWN0IGlvdmVjICoqaW92cCwgc2l6ZV90ICpiYXNlcCwgc2l6ZV90IGJ5dGVzKQotewotCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92ID0gKmlvdnA7Ci0Jc2l6ZV90IGJhc2UgPSAqYmFzZXA7Ci0KLQl3aGlsZSAoYnl0ZXMpIHsKLQkJaW50IGNvcHkgPSBtaW4oYnl0ZXMsIGlvdi0+aW92X2xlbiAtIGJhc2UpOwotCi0JCWJ5dGVzIC09IGNvcHk7Ci0JCWJhc2UgKz0gY29weTsKLQkJaWYgKGlvdi0+aW92X2xlbiA9PSBiYXNlKSB7Ci0JCQlpb3YrKzsKLQkJCWJhc2UgPSAwOwotCQl9Ci0JfQotCSppb3ZwID0gaW92OwotCSpiYXNlcCA9IGJhc2U7Ci19Ci0KLS8qCiAgKiBQZXJmb3JtcyBuZWNlc3NhcnkgY2hlY2tzIGJlZm9yZSBkb2luZyBhIHdyaXRlCiAgKgogICogQ2FuIGFkanVzdCB3cml0aW5nIHBvc2l0aW9uIGFvciBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUuCkBAIC0xOTIxLDggKzE4NTEsMTEgQEAKIAkgKiBpX3NlbSBpcyBoZWxkLCB3aGljaCBwcm90ZWN0cyBnZW5lcmljX29zeW5jX2lub2RlKCkgZnJvbQogCSAqIGxpdmVsb2NraW5nLgogCSAqLwotCWlmICh3cml0dGVuID49IDAgJiYgZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykKLQkJZ2VuZXJpY19vc3luY19pbm9kZShpbm9kZSwgbWFwcGluZywgT1NZTkNfTUVUQURBVEEpOworCWlmICh3cml0dGVuID49IDAgJiYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkpIHsKKwkJaW50IGVyciA9IGdlbmVyaWNfb3N5bmNfaW5vZGUoaW5vZGUsIG1hcHBpbmcsIE9TWU5DX01FVEFEQVRBKTsKKwkJaWYgKGVyciA8IDApCisJCQl3cml0dGVuID0gZXJyOworCX0KIAlpZiAod3JpdHRlbiA9PSBjb3VudCAmJiAhaXNfc3luY19raW9jYihpb2NiKSkKIAkJd3JpdHRlbiA9IC1FSU9DQlFVRVVFRDsKIAlyZXR1cm4gd3JpdHRlbjsKQEAgLTIwMjEsNyArMTk1NCw5IEBACiAJCQkJaWYgKHVubGlrZWx5KG5yX3NlZ3MgPiAxKSkgewogCQkJCQlmaWxlbWFwX3NldF9uZXh0X2lvdmVjKCZjdXJfaW92LAogCQkJCQkJCSZpb3ZfYmFzZSwgc3RhdHVzKTsKLQkJCQkJYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKyBpb3ZfYmFzZTsKKwkJCQkJaWYgKGNvdW50KQorCQkJCQkJYnVmID0gY3VyX2lvdi0+aW92X2Jhc2UgKworCQkJCQkJCWlvdl9iYXNlOwogCQkJCX0gZWxzZSB7CiAJCQkJCWlvdl9iYXNlICs9IHN0YXR1czsKIAkJCQl9CmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmggYi9tbS9maWxlbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3OTNiYQotLS0gL2Rldi9udWxsCisrKyBiL21tL2ZpbGVtYXAuaApAQCAtMCwwICsxLDk0IEBACisvKgorICoJbGludXgvbW0vZmlsZW1hcC5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTkgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2lmbmRlZiBfX0ZJTEVNQVBfSAorI2RlZmluZSBfX0ZJTEVNQVBfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3NpemVfdAorX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKGNoYXIgKnZhZGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJICAgICAgIHNpemVfdCBiYXNlLAorCQkJICAgICAgIHNpemVfdCBieXRlcyk7CisKKy8qCisgKiBDb3B5IGFzIG11Y2ggYXMgd2UgY2FuIGludG8gdGhlIHBhZ2UgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoCisgKiB3ZXJlIHN1Y2Vzc2Z1bGx5IGNvcGllZC4gIElmIGEgZmF1bHQgaXMgZW5jb3VudGVyZWQgdGhlbiBjbGVhciB0aGUgcGFnZQorICogb3V0IHRvIChvZmZzZXQrYnl0ZXMpIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3aGljaCB3ZXJlIGNvcGllZC4KKyAqLworc3RhdGljIGlubGluZSBzaXplX3QKK2ZpbGVtYXBfY29weV9mcm9tX3VzZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgdW5zaWduZWQgYnl0ZXMpCit7CisJY2hhciAqa2FkZHI7CisJaW50IGxlZnQ7CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhrYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJaWYgKGxlZnQgIT0gMCkgeworCQkvKiBEbyBpdCB0aGUgc2xvdyB3YXkgKi8KKwkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcihrYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7CisJCWt1bm1hcChwYWdlKTsKKwl9CisJcmV0dXJuIGJ5dGVzIC0gbGVmdDsKK30KKworLyoKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIHNpZGVlZmZlY3RzIGFuZCByZXR1cm4gdmFsdWUgYXMgZmlsZW1hcF9jb3B5X2Zyb21fdXNlcigpLgorICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBvbiBhIGZhdWx0IHdlIG5lZWQgdG8gbWVtc2V0IHRoZSByZW1haW5kZXIgb2YgdGhlCisgKiBwYWdlIChvdXQgdG8gb2Zmc2V0K2J5dGVzKSwgdG8gZW11bGF0ZSBmaWxlbWFwX2NvcHlfZnJvbV91c2VyKCkncworICogc2luZ2xlLXNlZ21lbnQgYmVoYXZpb3VyLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdAorZmlsZW1hcF9jb3B5X2Zyb21fdXNlcl9pb3ZlYyhzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgc2l6ZV90IGJhc2UsIHNpemVfdCBieXRlcykKK3sKKwljaGFyICprYWRkcjsKKwlzaXplX3QgY29waWVkOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJY29waWVkID0gX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKGthZGRyICsgb2Zmc2V0LCBpb3YsCisJCQkJCQliYXNlLCBieXRlcyk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCWlmIChjb3BpZWQgIT0gYnl0ZXMpIHsKKwkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQljb3BpZWQgPSBfX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWMoa2FkZHIgKyBvZmZzZXQsIGlvdiwKKwkJCQkJCQliYXNlLCBieXRlcyk7CisJCWt1bm1hcChwYWdlKTsKKwl9CisJcmV0dXJuIGNvcGllZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitmaWxlbWFwX3NldF9uZXh0X2lvdmVjKGNvbnN0IHN0cnVjdCBpb3ZlYyAqKmlvdnAsIHNpemVfdCAqYmFzZXAsIHNpemVfdCBieXRlcykKK3sKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiA9ICppb3ZwOworCXNpemVfdCBiYXNlID0gKmJhc2VwOworCisJd2hpbGUgKGJ5dGVzKSB7CisJCWludCBjb3B5ID0gbWluKGJ5dGVzLCBpb3YtPmlvdl9sZW4gLSBiYXNlKTsKKworCQlieXRlcyAtPSBjb3B5OworCQliYXNlICs9IGNvcHk7CisJCWlmIChpb3YtPmlvdl9sZW4gPT0gYmFzZSkgeworCQkJaW92Kys7CisJCQliYXNlID0gMDsKKwkJfQorCX0KKwkqaW92cCA9IGlvdjsKKwkqYmFzZXAgPSBiYXNlOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwX3hpcC5jIGIvbW0vZmlsZW1hcF94aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTUzYjJjCi0tLSAvZGV2L251bGwKKysrIGIvbW0vZmlsZW1hcF94aXAuYwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqCWxpbnV4L21tL2ZpbGVtYXBfeGlwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSUJNIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IENhcnN0ZW4gT3R0ZSA8Y290dGVAZGUuaWJtLmNvbT4KKyAqCisgKiBkZXJpdmVkIGZyb20gbGludXgvbW0vZmlsZW1hcC5jIC0gQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvcm1hcC5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgImZpbGVtYXAuaCIKKworLyoKKyAqIFRoaXMgaXMgYSBmaWxlIHJlYWQgcm91dGluZSBmb3IgZXhlY3V0ZSBpbiBwbGFjZSBmaWxlcywgYW5kIHVzZXMKKyAqIHRoZSBtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlKCkgZnVuY3Rpb24gZm9yIHRoZSBhY3R1YWwgbG93LWxldmVsCisgKiBzdHVmZi4KKyAqCisgKiBOb3RlIHRoZSBzdHJ1Y3QgZmlsZSogaXMgbm90IHVzZWQgYXQgYWxsLiAgSXQgbWF5IGJlIE5VTEwuCisgKi8KK3N0YXRpYyB2b2lkCitkb194aXBfbWFwcGluZ19yZWFkKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKl9yYSwKKwkJICAgIHN0cnVjdCBmaWxlICpmaWxwLAorCQkgICAgbG9mZl90ICpwcG9zLAorCQkgICAgcmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsCisJCSAgICByZWFkX2FjdG9yX3QgYWN0b3IpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgbG9uZyBpbmRleCwgZW5kX2luZGV4LCBvZmZzZXQ7CisJbG9mZl90IGlzaXplOworCisJQlVHX09OKCFtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlKTsKKworCWluZGV4ID0gKnBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZmZzZXQgPSAqcHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisKKwlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlpZiAoIWlzaXplKQorCQlnb3RvIG91dDsKKworCWVuZF9pbmRleCA9IChpc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdW5zaWduZWQgbG9uZyBuciwgcmV0OworCisJCS8qIG5yIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGZyb20gdGhpcyBwYWdlICovCisJCW5yID0gUEFHRV9DQUNIRV9TSVpFOworCQlpZiAoaW5kZXggPj0gZW5kX2luZGV4KSB7CisJCQlpZiAoaW5kZXggPiBlbmRfaW5kZXgpCisJCQkJZ290byBvdXQ7CisJCQluciA9ICgoaXNpemUgLSAxKSAmIH5QQUdFX0NBQ0hFX01BU0spICsgMTsKKwkJCWlmIChuciA8PSBvZmZzZXQpIHsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQluciA9IG5yIC0gb2Zmc2V0OworCisJCXBhZ2UgPSBtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlKG1hcHBpbmcsCisJCQlpbmRleCooUEFHRV9TSVpFLzUxMiksIDApOworCQlpZiAoIXBhZ2UpCisJCQlnb3RvIG5vX3hpcF9wYWdlOworCQlpZiAodW5saWtlbHkoSVNfRVJSKHBhZ2UpKSkgeworCQkJaWYgKFBUUl9FUlIocGFnZSkgPT0gLUVOT0RBVEEpIHsKKwkJCQkvKiBzcGFyc2UgKi8KKwkJCQlwYWdlID0gdmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSk7CisJCQl9IGVsc2UgeworCQkJCWRlc2MtPmVycm9yID0gUFRSX0VSUihwYWdlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfSBlbHNlCisJCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisKKwkJLyogSWYgdXNlcnMgY2FuIGJlIHdyaXRpbmcgdG8gdGhpcyBwYWdlIHVzaW5nIGFyYml0cmFyeQorCQkgKiB2aXJ0dWFsIGFkZHJlc3NlcywgdGFrZSBjYXJlIGFib3V0IHBvdGVudGlhbCBhbGlhc2luZworCQkgKiBiZWZvcmUgcmVhZGluZyB0aGUgcGFnZSBvbiB0aGUga2VybmVsIHNpZGUuCisJCSAqLworCQlpZiAobWFwcGluZ193cml0YWJseV9tYXBwZWQobWFwcGluZykpCisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworCQkvKgorCQkgKiBPaywgd2UgaGF2ZSB0aGUgcGFnZSwgYW5kIGl0J3MgdXAtdG8tZGF0ZSwgc28KKwkJICogbm93IHdlIGNhbiBjb3B5IGl0IHRvIHVzZXIgc3BhY2UuLi4KKwkJICoKKwkJICogVGhlIGFjdG9yIHJvdXRpbmUgcmV0dXJucyBob3cgbWFueSBieXRlcyB3ZXJlIGFjdHVhbGx5IHVzZWQuLgorCQkgKiBOT1RFISBUaGlzIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgaG93IG11Y2ggb2YgYSB1c2VyIGJ1ZmZlcgorCQkgKiB3ZSBmaWxsZWQgdXAgKHdlIG1heSBiZSBwYWRkaW5nIGV0YyksIHNvIHdlIGNhbiBvbmx5IHVwZGF0ZQorCQkgKiAicG9zIiBoZXJlICh0aGUgYWN0b3Igcm91dGluZSBoYXMgdG8gdXBkYXRlIHRoZSB1c2VyIGJ1ZmZlcgorCQkgKiBwb2ludGVycyBhbmQgdGhlIHJlbWFpbmluZyBjb3VudCkuCisJCSAqLworCQlyZXQgPSBhY3RvcihkZXNjLCBwYWdlLCBvZmZzZXQsIG5yKTsKKwkJb2Zmc2V0ICs9IHJldDsKKwkJaW5kZXggKz0gb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCW9mZnNldCAmPSB+UEFHRV9DQUNIRV9NQVNLOworCisJCWlmIChyZXQgPT0gbnIgJiYgZGVzYy0+Y291bnQpCisJCQljb250aW51ZTsKKwkJZ290byBvdXQ7CisKK25vX3hpcF9wYWdlOgorCQkvKiBEaWQgbm90IGdldCB0aGUgcGFnZS4gUmVwb3J0IGl0ICovCisJCWRlc2MtPmVycm9yID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJKnBwb3MgPSAoKGxvZmZfdCkgaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZmZzZXQ7CisJaWYgKGZpbHApCisJCWZpbGVfYWNjZXNzZWQoZmlscCk7Cit9CisKK3NzaXplX3QKK3hpcF9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKK3sKKwlyZWFkX2Rlc2NyaXB0b3JfdCBkZXNjOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJZGVzYy53cml0dGVuID0gMDsKKwlkZXNjLmFyZy5idWYgPSBidWY7CisJZGVzYy5jb3VudCA9IGxlbjsKKwlkZXNjLmVycm9yID0gMDsKKworCWRvX3hpcF9tYXBwaW5nX3JlYWQoZmlscC0+Zl9tYXBwaW5nLCAmZmlscC0+Zl9yYSwgZmlscCwKKwkJCSAgICBwcG9zLCAmZGVzYywgZmlsZV9yZWFkX2FjdG9yKTsKKworCWlmIChkZXNjLndyaXR0ZW4pCisJCXJldHVybiBkZXNjLndyaXR0ZW47CisJZWxzZQorCQlyZXR1cm4gZGVzYy5lcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhpcF9maWxlX3JlYWQpOworCitzc2l6ZV90Cit4aXBfZmlsZV9zZW5kZmlsZShzdHJ1Y3QgZmlsZSAqaW5fZmlsZSwgbG9mZl90ICpwcG9zLAorCSAgICAgc2l6ZV90IGNvdW50LCByZWFkX2FjdG9yX3QgYWN0b3IsIHZvaWQgKnRhcmdldCkKK3sKKwlyZWFkX2Rlc2NyaXB0b3JfdCBkZXNjOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKKwlkZXNjLndyaXR0ZW4gPSAwOworCWRlc2MuY291bnQgPSBjb3VudDsKKwlkZXNjLmFyZy5kYXRhID0gdGFyZ2V0OworCWRlc2MuZXJyb3IgPSAwOworCisJZG9feGlwX21hcHBpbmdfcmVhZChpbl9maWxlLT5mX21hcHBpbmcsICZpbl9maWxlLT5mX3JhLCBpbl9maWxlLAorCQkJICAgIHBwb3MsICZkZXNjLCBhY3Rvcik7CisJaWYgKGRlc2Mud3JpdHRlbikKKwkJcmV0dXJuIGRlc2Mud3JpdHRlbjsKKwlyZXR1cm4gZGVzYy5lcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhpcF9maWxlX3NlbmRmaWxlKTsKKworLyoKKyAqIF9feGlwX3VubWFwIGlzIGludm9rZWQgZnJvbSB4aXBfdW5tYXAgYW5kCisgKiB4aXBfd3JpdGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIGFsbCB2bWFzIG9mIHRoZSBhZGRyZXNzX3NwYWNlIGFuZCB1bm1hcHMgdGhlCisgKiBlbXB0eV96ZXJvX3BhZ2Ugd2hlbiBmb3VuZCBhdCBwZ29mZi4gU2hvdWxkIGl0IGdvIGluIHJtYXAuYz8KKyAqLworc3RhdGljIHZvaWQKK19feGlwX3VubWFwIChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcsCisJCSAgICAgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CisJcHRlX3QgKnB0ZTsKKwlwdGVfdCBwdGV2YWw7CisKKwlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKKwl2bWFfcHJpb190cmVlX2ZvcmVhY2godm1hLCAmaXRlciwgJm1hcHBpbmctPmlfbW1hcCwgcGdvZmYsIHBnb2ZmKSB7CisJCW1tID0gdm1hLT52bV9tbTsKKwkJYWRkcmVzcyA9IHZtYS0+dm1fc3RhcnQgKworCQkJKChwZ29mZiAtIHZtYS0+dm1fcGdvZmYpIDw8IFBBR0VfU0hJRlQpOworCQlCVUdfT04oYWRkcmVzcyA8IHZtYS0+dm1fc3RhcnQgfHwgYWRkcmVzcyA+PSB2bWEtPnZtX2VuZCk7CisJCS8qCisJCSAqIFdlIG5lZWQgdGhlIHBhZ2VfdGFibGVfbG9jayB0byBwcm90ZWN0IHVzIGZyb20gcGFnZSBmYXVsdHMsCisJCSAqIG11bm1hcCwgZm9yaywgZXRjLi4uCisJCSAqLworCQlwdGUgPSBwYWdlX2NoZWNrX2FkZHJlc3ModmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSksIG1tLAorCQkJCQkgYWRkcmVzcyk7CisJCWlmICghSVNfRVJSKHB0ZSkpIHsKKwkJCS8qIE51a2UgdGhlIHBhZ2UgdGFibGUgZW50cnkuICovCisJCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbigqcHRlKSk7CisJCQlwdGV2YWwgPSBwdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHRlKTsKKwkJCUJVR19PTihwdGVfZGlydHkocHRldmFsKSk7CisJCQlwdGVfdW5tYXAocHRlKTsKKwkJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbWFwcGluZy0+aV9tbWFwX2xvY2spOworfQorCisvKgorICogeGlwX25vcGFnZSgpIGlzIGludm9rZWQgdmlhIHRoZSB2bWEgb3BlcmF0aW9ucyB2ZWN0b3IgZm9yIGEKKyAqIG1hcHBlZCBtZW1vcnkgcmVnaW9uIHRvIHJlYWQgaW4gZmlsZSBkYXRhIGR1cmluZyBhIHBhZ2UgZmF1bHQuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gZmlsZW1hcF9ub3BhZ2UsIGJ1dCB1c2VkIGZvciBleGVjdXRlIGluIHBsYWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqCit4aXBfZmlsZV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwKKwkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkgICBpbnQgKnR5cGUpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBhcmVhLT52bV9maWxlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdvZmYsIGVuZG9mZjsKKworCXBnb2ZmID0gKChhZGRyZXNzIC0gYXJlYS0+dm1fc3RhcnQpID4+IFBBR0VfQ0FDSEVfU0hJRlQpCisJCSsgYXJlYS0+dm1fcGdvZmY7CisJZW5kb2ZmID0gKChhcmVhLT52bV9lbmQgLSBhcmVhLT52bV9zdGFydCkgPj4gUEFHRV9DQUNIRV9TSElGVCkKKwkJKyBhcmVhLT52bV9wZ29mZjsKKworCXNpemUgPSAoaV9zaXplX3JlYWQoaW5vZGUpICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGdvZmYgPj0gc2l6ZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwYWdlID0gbWFwcGluZy0+YV9vcHMtPmdldF94aXBfcGFnZShtYXBwaW5nLCBwZ29mZiooUEFHRV9TSVpFLzUxMiksIDApOworCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwkJcmV0dXJuIHBhZ2U7CisJfQorCWlmIChQVFJfRVJSKHBhZ2UpICE9IC1FTk9EQVRBKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHNwYXJzZSBibG9jayAqLworCWlmICgoYXJlYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEUgfCBWTV9NQVlXUklURSkpICYmCisJICAgIChhcmVhLT52bV9mbGFncyAmIChWTV9TSEFSRUR8IFZNX01BWVNIQVJFKSkgJiYKKwkgICAgKCEobWFwcGluZy0+aG9zdC0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkpKSB7CisJCS8qIG1heWJlIHNoYXJlZCB3cml0YWJsZSwgYWxsb2NhdGUgbmV3IGJsb2NrICovCisJCXBhZ2UgPSBtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlIChtYXBwaW5nLAorCQkJcGdvZmYqKFBBR0VfU0laRS81MTIpLCAxKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCXJldHVybiBOVUxMOworCQlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJCS8qIHVubWFwIHBhZ2UgYXQgcGdvZmYgZnJvbSBhbGwgb3RoZXIgdm1hcyAqLworCQlfX3hpcF91bm1hcChtYXBwaW5nLCBwZ29mZik7CisJfSBlbHNlIHsKKwkJLyogbm90IHNoYXJlZCBhbmQgd3JpdGFibGUsIHVzZSBlbXB0eV96ZXJvX3BhZ2UgKi8KKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShlbXB0eV96ZXJvX3BhZ2UpOworCX0KKworCXJldHVybiBwYWdlOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHhpcF9maWxlX3ZtX29wcyA9IHsKKwkubm9wYWdlICAgICAgICAgPSB4aXBfZmlsZV9ub3BhZ2UsCit9OworCitpbnQgeGlwX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKK3sKKwlCVUdfT04oIWZpbGUtPmZfbWFwcGluZy0+YV9vcHMtPmdldF94aXBfcGFnZSk7CisKKwlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCXZtYS0+dm1fb3BzID0gJnhpcF9maWxlX3ZtX29wczsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhpcF9maWxlX21tYXApOworCitzdGF0aWMgc3NpemVfdAorX194aXBfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIG1hcHBpbmcgPSBmaWxwLT5mX21hcHBpbmc7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYV9vcHMgPSBtYXBwaW5nLT5hX29wczsKKwlzdHJ1Y3QgaW5vZGUgCSppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJbG9uZwkJc3RhdHVzID0gMDsKKwlzdHJ1Y3QgcGFnZQkqcGFnZTsKKwlzaXplX3QJCWJ5dGVzOworCXNzaXplX3QJCXdyaXR0ZW4gPSAwOworCisJQlVHX09OKCFtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlKTsKKworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBpbmRleDsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJCXNpemVfdCBjb3BpZWQ7CisKKwkJb2Zmc2V0ID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLTEpKTsgLyogV2l0aGluIHBhZ2UgKi8KKwkJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJYnl0ZXMgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCWlmIChieXRlcyA+IGNvdW50KQorCQkJYnl0ZXMgPSBjb3VudDsKKworCQkvKgorCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20gX2ZpcnN0Xy4KKwkJICogT3RoZXJ3aXNlIHRoZXJlJ3MgYSBuYXN0eSBkZWFkbG9jayBvbiBjb3B5aW5nIGZyb20gdGhlCisJCSAqIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLCB3aXRob3V0IGl0IGJlaW5nIG1hcmtlZAorCQkgKiB1cC10by1kYXRlLgorCQkgKi8KKwkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7CisKKwkJcGFnZSA9IGFfb3BzLT5nZXRfeGlwX3BhZ2UobWFwcGluZywKKwkJCQkJICAgaW5kZXgqKFBBR0VfU0laRS81MTIpLCAwKTsKKwkJaWYgKElTX0VSUihwYWdlKSAmJiAoUFRSX0VSUihwYWdlKSA9PSAtRU5PREFUQSkpIHsKKwkJCS8qIHdlIGFsbG9jYXRlIGEgbmV3IHBhZ2UgdW5tYXAgaXQgKi8KKwkJCXBhZ2UgPSBhX29wcy0+Z2V0X3hpcF9wYWdlKG1hcHBpbmcsCisJCQkJCQkgICBpbmRleCooUEFHRV9TSVpFLzUxMiksIDEpOworCQkJaWYgKCFJU19FUlIocGFnZSkpCisJCQkJLyogdW5tYXAgcGFnZSBhdCBwZ29mZiBmcm9tIGFsbCBvdGhlciB2bWFzICovCisJCQkJX194aXBfdW5tYXAobWFwcGluZywgaW5kZXgpOworCQl9CisKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJc3RhdHVzID0gUFRSX0VSUihwYWdlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCisJCWNvcGllZCA9IGZpbGVtYXBfY29weV9mcm9tX3VzZXIocGFnZSwgb2Zmc2V0LCBidWYsIGJ5dGVzKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWlmIChsaWtlbHkoY29waWVkID4gMCkpIHsKKwkJCXN0YXR1cyA9IGNvcGllZDsKKworCQkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQkJd3JpdHRlbiArPSBzdGF0dXM7CisJCQkJY291bnQgLT0gc3RhdHVzOworCQkJCXBvcyArPSBzdGF0dXM7CisJCQkJYnVmICs9IHN0YXR1czsKKwkJCX0KKwkJfQorCQlpZiAodW5saWtlbHkoY29waWVkICE9IGJ5dGVzKSkKKwkJCWlmIChzdGF0dXMgPj0gMCkKKwkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGNvdW50KTsKKwkqcHBvcyA9IHBvczsKKwkvKgorCSAqIE5vIG5lZWQgdG8gdXNlIGlfc2l6ZV9yZWFkKCkgaGVyZSwgdGhlIGlfc2l6ZQorCSAqIGNhbm5vdCBjaGFuZ2UgdW5kZXIgdXMgYmVjYXVzZSB3ZSBob2xkIGlfc2VtLgorCSAqLworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCisJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogc3RhdHVzOworfQorCitzc2l6ZV90Cit4aXBfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlscC0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXNpemVfdCBjb3VudDsKKwlsb2ZmX3QgcG9zOworCXNzaXplX3QgcmV0OworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIGxlbikpIHsKKwkJcmV0PS1FRkFVTFQ7CisJCWdvdG8gb3V0X3VwOworCX0KKworCXBvcyA9ICpwcG9zOworCWNvdW50ID0gbGVuOworCisJdmZzX2NoZWNrX2Zyb3plbihpbm9kZS0+aV9zYiwgU0JfRlJFRVpFX1dSSVRFKTsKKworCS8qIFdlIGNhbiB3cml0ZSBiYWNrIHRoaXMgcXVldWUgaW4gcGFnZSByZWNsYWltICovCisJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisKKwlyZXQgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxwLCAmcG9zLCAmY291bnQsIFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2JhY2tpbmc7CisJaWYgKGNvdW50ID09IDApCisJCWdvdG8gb3V0X2JhY2tpbmc7CisKKwlyZXQgPSByZW1vdmVfc3VpZChmaWxwLT5mX2RlbnRyeSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfYmFja2luZzsKKworCWlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsKKworCXJldCA9IF9feGlwX2ZpbGVfd3JpdGUgKGZpbHAsIGJ1ZiwgY291bnQsIHBvcywgcHBvcyk7CisKKyBvdXRfYmFja2luZzoKKwljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gTlVMTDsKKyBvdXRfdXA6CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhpcF9maWxlX3dyaXRlKTsKKworLyoKKyAqIHRydW5jYXRlIGEgcGFnZSB1c2VkIGZvciBleGVjdXRlIGluIHBsYWNlCisgKiBmdW5jdGlvbmFsaXR5IGlzIGFuYWxvZyB0byBibG9ja190cnVuY2F0ZV9wYWdlIGJ1dCBkb2VzIHVzZSBnZXRfeGlwX3BhZ2UKKyAqIHRvIGdldCB0aGUgcGFnZSBpbnN0ZWFkIG9mIHBhZ2UgY2FjaGUKKyAqLworaW50Cit4aXBfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJcGdvZmZfdCBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJdW5zaWduZWQgbGVuZ3RoOworCXN0cnVjdCBwYWdlICpwYWdlOworCXZvaWQgKmthZGRyOworCisJQlVHX09OKCFtYXBwaW5nLT5hX29wcy0+Z2V0X3hpcF9wYWdlKTsKKworCWJsb2Nrc2l6ZSA9IDEgPDwgbWFwcGluZy0+aG9zdC0+aV9ibGtiaXRzOworCWxlbmd0aCA9IG9mZnNldCAmIChibG9ja3NpemUgLSAxKTsKKworCS8qIEJsb2NrIGJvdW5kYXJ5PyBOb3RoaW5nIHRvIGRvICovCisJaWYgKCFsZW5ndGgpCisJCXJldHVybiAwOworCisJbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoOworCisJcGFnZSA9IG1hcHBpbmctPmFfb3BzLT5nZXRfeGlwX3BhZ2UobWFwcGluZywKKwkJCQkJICAgIGluZGV4KihQQUdFX1NJWkUvNTEyKSwgMCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHBhZ2UpKSkgeworCQlpZiAoUFRSX0VSUihwYWdlKSA9PSAtRU5PREFUQSkKKwkJCS8qIEhvbGU/IE5vIG5lZWQgdG8gdHJ1bmNhdGUgKi8KKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwl9IGVsc2UKKwkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgbGVuZ3RoKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHhpcF90cnVuY2F0ZV9wYWdlKTsKZGlmZiAtLWdpdCBhL21tL21hZHZpc2UuYyBiL21tL21hZHZpc2UuYwppbmRleCA1NGE1ZDNiLi43MzE4MGEyIDEwMDY0NAotLS0gYS9tbS9tYWR2aXNlLmMKKysrIGIvbW0vbWFkdmlzZS5jCkBAIC04Niw2ICs4NiwxMSBAQAogCWlmICghZmlsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAorCWlmIChmaWxlLT5mX21hcHBpbmctPmFfb3BzLT5nZXRfeGlwX3BhZ2UpIHsKKwkJLyogbm8gYmFkIHJldHVybiB2YWx1ZSwgYnV0IGlnbm9yZSBhZHZpY2UgKi8KKwkJcmV0dXJuIDA7CisJfQorCiAJKnByZXYgPSB2bWE7CiAJc3RhcnQgPSAoKHN0YXJ0IC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkgKyB2bWEtPnZtX3Bnb2ZmOwogCWlmIChlbmQgPiB2bWEtPnZtX2VuZCkKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggMzA5NzVlZi4uYmVhYmRlZiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTExMzksNyArMTEzOSw3IEBACiB7CiAJcGdkX3QgKnBnZDsKIAl1bnNpZ25lZCBsb25nIG5leHQ7Ci0JdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IGFkZHIgKyBQQUdFX0FMSUdOKHNpemUpOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKIAlpbnQgZXJyOwogCkBAIC0xNDU4LDcgKzE0NTgsNyBAQAogICogdW5tYXBfbWFwcGluZ19yYW5nZSAtIHVubWFwIHRoZSBwb3J0aW9uIG9mIGFsbCBtbWFwcwogICogaW4gdGhlIHNwZWNpZmllZCBhZGRyZXNzX3NwYWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICogcGFnZSByYW5nZSBpbiB0aGUgdW5kZXJseWluZyBmaWxlLgotICogQGFkZHJlc3Nfc3BhY2U6IHRoZSBhZGRyZXNzIHNwYWNlIGNvbnRhaW5pbmcgbW1hcHMgdG8gYmUgdW5tYXBwZWQuCisgKiBAbWFwcGluZzogdGhlIGFkZHJlc3Mgc3BhY2UgY29udGFpbmluZyBtbWFwcyB0byBiZSB1bm1hcHBlZC4KICAqIEBob2xlYmVnaW46IGJ5dGUgaW4gZmlyc3QgcGFnZSB0byB1bm1hcCwgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mCiAgKiB0aGUgdW5kZXJseWluZyBmaWxlLiAgVGhpcyB3aWxsIGJlIHJvdW5kZWQgZG93biB0byBhIFBBR0VfU0laRQogICogYm91bmRhcnkuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB2bXRydW5jYXRlKCksIHdoaWNoCmRpZmYgLS1naXQgYS9tbS9tZW1wb29sLmMgYi9tbS9tZW1wb29sLmMKaW5kZXggOWE3MmY3ZC4uNjVmMjk1NyAxMDA2NDQKLS0tIGEvbW0vbWVtcG9vbC5jCisrKyBiL21tL21lbXBvb2wuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAJdm9pZCAqZWxlbWVudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXdhaXRfcXVldWVfdCB3YWl0OwotCWludCBnZnBfdGVtcDsKKwl1bnNpZ25lZCBpbnQgZ2ZwX3RlbXA7CiAKIAltaWdodF9zbGVlcF9pZihnZnBfbWFzayAmIF9fR0ZQX1dBSVQpOwogCmRpZmYgLS1naXQgYS9tbS9vb21fa2lsbC5jIGIvbW0vb29tX2tpbGwuYwppbmRleCA1OTY2NmQ5Li4xZTU2MDc2IDEwMDY0NAotLS0gYS9tbS9vb21fa2lsbC5jCisrKyBiL21tL29vbV9raWxsLmMKQEAgLTI1MywxNCArMjUzLDE2IEBACiAgKiBPUiB0cnkgdG8gYmUgc21hcnQgYWJvdXQgd2hpY2ggcHJvY2VzcyB0byBraWxsLiBOb3RlIHRoYXQgd2UKICAqIGRvbid0IGhhdmUgdG8gYmUgcGVyZmVjdCBoZXJlLCB3ZSBqdXN0IGhhdmUgdG8gYmUgZ29vZC4KICAqLwotdm9pZCBvdXRfb2ZfbWVtb3J5KHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaykKK3ZvaWQgb3V0X29mX21lbW9yeSh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBvcmRlcikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IE5VTEw7CiAJdGFza190ICogcDsKIAotCXByaW50aygib29tLWtpbGxlcjogZ2ZwX21hc2s9MHgleFxuIiwgZ2ZwX21hc2spOwotCS8qIHByaW50IG1lbW9yeSBzdGF0cyAqLwotCXNob3dfbWVtKCk7CisJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQlwcmludGsoIm9vbS1raWxsZXI6IGdmcF9tYXNrPTB4JXgsIG9yZGVyPSVkXG4iLAorCQkJZ2ZwX21hc2ssIG9yZGVyKTsKKwkJc2hvd19tZW0oKTsKKwl9CiAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogcmV0cnk6CmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCA2MTNiOTlhLi5hNjMyOWZhIDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogICogdGhlIHdob2xlIHdvcmxkLiAgUmV0dXJucyAwIGlmIGEgcGRmbHVzaCB0aHJlYWQgd2FzIGRpc3BhdGNoZWQuICBSZXR1cm5zCiAgKiAtMSBpZiBhbGwgcGRmbHVzaCB0aHJlYWRzIHdlcmUgYnVzeS4KICAqLwotaW50IHdha2V1cF9iZGZsdXNoKGxvbmcgbnJfcGFnZXMpCitpbnQgd2FrZXVwX3BkZmx1c2gobG9uZyBucl9wYWdlcykKIHsKIAlpZiAobnJfcGFnZXMgPT0gMCkgewogCQlzdHJ1Y3Qgd3JpdGViYWNrX3N0YXRlIHdiczsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCA3ZWU2NzVhLi4xZDZiYTZhIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC04OTcsMTIgKzg5Nyw2IEBACiAJY29uZF9yZXNjaGVkKCk7CiAKIAlpZiAobGlrZWx5KGRpZF9zb21lX3Byb2dyZXNzKSkgewotCQkvKgotCQkgKiBHbyB0aHJvdWdoIHRoZSB6b25lbGlzdCB5ZXQgb25lIG1vcmUgdGltZSwga2VlcAotCQkgKiB2ZXJ5IGhpZ2ggd2F0ZXJtYXJrIGhlcmUsIHRoaXMgaXMgb25seSB0byBjYXRjaAotCQkgKiBhIHBhcmFsbGVsIG9vbSBraWxsaW5nLCB3ZSBtdXN0IGZhaWwgaWYgd2UncmUgc3RpbGwKLQkJICogdW5kZXIgaGVhdnkgcHJlc3N1cmUuCi0JCSAqLwogCQlmb3IgKGkgPSAwOyAoeiA9IHpvbmVzW2ldKSAhPSBOVUxMOyBpKyspIHsKIAkJCWlmICghem9uZV93YXRlcm1hcmtfb2soeiwgb3JkZXIsIHotPnBhZ2VzX21pbiwKIAkJCQkJICAgICAgIGNsYXNzem9uZV9pZHgsIGNhbl90cnlfaGFyZGVyLApAQCAtOTM2LDcgKzkzMCw3IEBACiAJCQkJZ290byBnb3RfcGc7CiAJCX0KIAotCQlvdXRfb2ZfbWVtb3J5KGdmcF9tYXNrKTsKKwkJb3V0X29mX21lbW9yeShnZnBfbWFzaywgb3JkZXIpOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQogCkBAIC0xNjY3LDkgKzE2NjEsOCBAQAogI2lmZGVmIFdBTlRfUEFHRV9WSVJUVUFMCiAJCS8qIFRoZSBzaGlmdCB3b24ndCBvdmVyZmxvdyBiZWNhdXNlIFpPTkVfTk9STUFMIGlzIGJlbG93IDRHLiAqLwogCQlpZiAoIWlzX2hpZ2htZW1faWR4KHpvbmUpKQotCQkJc2V0X3BhZ2VfYWRkcmVzcyhwYWdlLCBfX3ZhKHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUKSk7CisJCQlzZXRfcGFnZV9hZGRyZXNzKHBhZ2UsIF9fdmEocGZuIDw8IFBBR0VfU0hJRlQpKTsKICNlbmRpZgotCQlzdGFydF9wZm4rKzsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uYwppbmRleCA2NjdjNzZkLi4yZTYwNWExIDEwMDY0NAotLS0gYS9tbS9wYWdlX2lvLmMKKysrIGIvbW0vcGFnZV9pby5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU09GVFdBUkVfU1VTUEVORCkgfHwgZGVmaW5lZChDT05GSUdfUE1fRElTSykKKyNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAogLyoKICAqIEEgc2NydWZmeSB1dGlsaXR5IGZ1bmN0aW9uIHRvIHJlYWQgb3Igd3JpdGUgYW4gYXJiaXRyYXJ5IHN3YXAgcGFnZQogICogYW5kIHdhaXQgb24gdGhlIEkvTy4gIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcmVmIG9uIHRoZSBwYWdlLgpkaWZmIC0tZ2l0IGEvbW0vcGRmbHVzaC5jIGIvbW0vcGRmbHVzaC5jCmluZGV4IDM4Y2UyNzkuLmQ2NzgxOTUgMTAwNjQ0Ci0tLSBhL21tL3BkZmx1c2guYworKysgYi9tbS9wZGZsdXNoLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlzcGluX3VubG9ja19pcnEoJnBkZmx1c2hfbG9jayk7CiAKIAkJc2NoZWR1bGUoKTsKLQkJaWYgKHRyeV90b19mcmVlemUoUEZfRlJFRVpFKSkgeworCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKSB7CiAJCQlzcGluX2xvY2tfaXJxKCZwZGZsdXNoX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuYwppbmRleCA4OTc3MGJkLi4wOGFjNWM3IDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC0yNDcsOCArMjQ3LDggQEAKICAqCiAgKiBPbiBzdWNjZXNzIHJldHVybnMgd2l0aCBtYXBwZWQgcHRlIGFuZCBsb2NrZWQgbW0tPnBhZ2VfdGFibGVfbG9jay4KICAqLwotc3RhdGljIHB0ZV90ICpwYWdlX2NoZWNrX2FkZHJlc3Moc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MpCitwdGVfdCAqcGFnZV9jaGVja19hZGRyZXNzKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewogCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCAxMjJkMDMxLi5jOWU3MDZkIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC01ODQsNyArNTg0LDggQEAKIAlyZXR1cm4gY2FjaGVwLT5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldOwogfQogCi1zdGF0aWMgaW5saW5lIGttZW1fY2FjaGVfdCAqX19maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpCitzdGF0aWMgaW5saW5lIGttZW1fY2FjaGVfdCAqX19maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLAorCQkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKQogewogCXN0cnVjdCBjYWNoZV9zaXplcyAqY3NpemVwID0gbWFsbG9jX3NpemVzOwogCkBAIC02MDgsNyArNjA5LDggQEAKIAlyZXR1cm4gY3NpemVwLT5jc19jYWNoZXA7CiB9CiAKLWttZW1fY2FjaGVfdCAqa21lbV9maW5kX2dlbmVyYWxfY2FjaGVwKHNpemVfdCBzaXplLCBpbnQgZ2ZwZmxhZ3MpCitrbWVtX2NhY2hlX3QgKmttZW1fZmluZF9nZW5lcmFsX2NhY2hlcChzaXplX3Qgc2l6ZSwKKwkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcGZsYWdzKQogewogCXJldHVybiBfX2ZpbmRfZ2VuZXJhbF9jYWNoZXAoc2l6ZSwgZ2ZwZmxhZ3MpOwogfQpAQCAtMjEwMCw3ICsyMTAyLDcgQEAKICNpZiBERUJVRwogc3RhdGljIHZvaWQgKgogY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihrbWVtX2NhY2hlX3QgKmNhY2hlcCwKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKm9ianAsIHZvaWQgKmNhbGxlcikKKwkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncywgdm9pZCAqb2JqcCwgdm9pZCAqY2FsbGVyKQogewogCWlmICghb2JqcCkJCiAJCXJldHVybiBvYmpwOwpAQCAtMjM3Miw2ICsyMzc0LDkgQEAKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJa21lbV9idWZjdGxfdCBuZXh0OwogCisJaWYgKG5vZGVpZCA9PSAtMSkKKwkJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisKIAlmb3IgKGxvb3AgPSAwOztsb29wKyspIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqcTsKIApAQCAtMjQzOSw3ICsyNDQ0LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKIAotdm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIGludCBub2RlKQordm9pZCAqa21hbGxvY19ub2RlKHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZmxhZ3MsIGludCBub2RlKQogewogCWttZW1fY2FjaGVfdCAqY2FjaGVwOwogCkBAIC0zMDkxLDcgKzMwOTYsNyBAQAogICogQHM6IHRoZSBzdHJpbmcgdG8gZHVwbGljYXRlCiAgKiBAZ2ZwOiB0aGUgR0ZQIG1hc2sgdXNlZCBpbiB0aGUga21hbGxvYygpIGNhbGwgd2hlbiBhbGxvY2F0aW5nIG1lbW9yeQogICovCi1jaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIGludCBnZnApCitjaGFyICprc3RyZHVwKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc2l6ZV90IGxlbjsKIAljaGFyICpidWY7CmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDRiOGU2MmEuLmNmZmZlNTAgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC05NzIsNyArOTcyLDcgQEAKIAkJICogd3JpdGVvdXQuICBTbyBpbiBsYXB0b3AgbW9kZSwgd3JpdGUgb3V0IHRoZSB3aG9sZSB3b3JsZC4KIAkJICovCiAJCWlmICh0b3RhbF9zY2FubmVkID4gc2Muc3dhcF9jbHVzdGVyX21heCArIHNjLnN3YXBfY2x1c3Rlcl9tYXgvMikgewotCQkJd2FrZXVwX2JkZmx1c2gobGFwdG9wX21vZGUgPyAwIDogdG90YWxfc2Nhbm5lZCk7CisJCQl3YWtldXBfcGRmbHVzaChsYXB0b3BfbW9kZSA/IDAgOiB0b3RhbF9zY2FubmVkKTsKIAkJCXNjLm1heV93cml0ZXBhZ2UgPSAxOwogCQl9CiAKQEAgLTEyMTYsOCArMTIxNiw4IEBACiAJb3JkZXIgPSAwOwogCWZvciAoIDsgOyApIHsKIAkJdW5zaWduZWQgbG9uZyBuZXdfb3JkZXI7Ci0JCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZSRUVaRSkKLQkJCXJlZnJpZ2VyYXRvcihQRl9GUkVFWkUpOworCisJCXRyeV90b19mcmVlemUoKTsKIAogCQlwcmVwYXJlX3RvX3dhaXQoJnBnZGF0LT5rc3dhcGRfd2FpdCwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCW5ld19vcmRlciA9IHBnZGF0LT5rc3dhcGRfbWF4X29yZGVyOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9mZGRpLmMgYi9uZXQvODAyL2ZkZGkuYwppbmRleCBlYmNmNDgzLi41Y2UyNGM0IDEwMDY0NAotLS0gYS9uZXQvODAyL2ZkZGkuYworKysgYi9uZXQvODAyL2ZkZGkuYwpAQCAtMTIyLDEwICsxMjIsMTAgQEAKICAqIHRoZSBwcm9wZXIgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgcGFja2V0IGRhdGEgKHNrYi0+ZGF0YSkuCiAgKi8KICAKLXVuc2lnbmVkIHNob3J0IGZkZGlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorX19iZTE2IGZkZGlfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmZGRpaGRyICpmZGRpID0gKHN0cnVjdCBmZGRpaGRyICopc2tiLT5kYXRhOwotCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJX19iZTE2IHR5cGU7CiAJCiAJLyoKIAkgKiBTZXQgbWFjLnJhdyBmaWVsZCB0byBwb2ludCB0byBGQyBieXRlLCBzZXQgZGF0YSBmaWVsZCB0byBwb2ludApkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL0tjb25maWcgYi9uZXQvODAyMXEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGEzODJlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0LzgwMjFxL0tjb25maWcKQEAgLTAsMCArMSwxOSBAQAorIworIyBDb25maWd1cmF0aW9uIGZvciA4MDIuMVEgVkxBTiBzdXBwb3J0CisjCisKK2NvbmZpZyBWTEFOXzgwMjFRCisJdHJpc3RhdGUgIjgwMi4xUSBWTEFOIFN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgU2VsZWN0IHRoaXMgYW5kIHlvdSB3aWxsIGJlIGFibGUgdG8gY3JlYXRlIDgwMi4xUSBWTEFOIGludGVyZmFjZXMKKwkgIG9uIHlvdXIgZXRoZXJuZXQgaW50ZXJmYWNlcy4gIDgwMi4xUSBWTEFOIHN1cHBvcnRzIGFsbW9zdAorCSAgZXZlcnl0aGluZyBhIHJlZ3VsYXIgZXRoZXJuZXQgaW50ZXJmYWNlIGRvZXMsIGluY2x1ZGluZworCSAgZmlyZXdhbGxpbmcsIGJyaWRnaW5nLCBhbmQgb2YgY291cnNlIElQIHRyYWZmaWMuICBZb3Ugd2lsbCBuZWVkCisJICB0aGUgJ3Zjb25maWcnIHRvb2wgZnJvbSB0aGUgVkxBTiBwcm9qZWN0IGluIG9yZGVyIHRvIGVmZmVjdGl2ZWx5CisJICB1c2UgVkxBTnMuICBTZWUgdGhlIFZMQU4gd2ViIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb246CisJICA8aHR0cDovL3d3dy5jYW5kZWxhdGVjaC5jb20vfmdyZWVhci92bGFuLmh0bWw+CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCA4MDIxcS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmMgYi9uZXQvODAyMXEvdmxhbi5jCmluZGV4IDFmNmQzMTYuLjkxZTQxMmIgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW4uYwpAQCAtNTc4LDYgKzU3OCwxNCBAQAogCQkJaWYgKCF2bGFuZGV2KQogCQkJCWNvbnRpbnVlOwogCisJCQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHZsYW5kZXYpKQorCQkJCQluZXRpZl9jYXJyaWVyX29uKHZsYW5kZXYpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobmV0aWZfY2Fycmllcl9vayh2bGFuZGV2KSkKKwkJCQkJbmV0aWZfY2Fycmllcl9vZmYodmxhbmRldik7CisJCQl9CisKIAkJCWlmICgodmxhbmRldi0+c3RhdGUgJiBWTEFOX0xJTktfU1RBVEVfTUFTSykgIT0gZmxncykgewogCQkJCXZsYW5kZXYtPnN0YXRlID0gKHZsYW5kZXYtPnN0YXRlICZ+IFZMQU5fTElOS19TVEFURV9NQVNLKSAKIAkJCQkJfCBmbGdzOwpkaWZmIC0tZ2l0IGEvbmV0L0tjb25maWcgYi9uZXQvS2NvbmZpZwppbmRleCA5MjUxYjI4Li4yNjg0ZTgwIDEwMDY0NAotLS0gYS9uZXQvS2NvbmZpZworKysgYi9uZXQvS2NvbmZpZwpAQCAtMiw3ICsyLDcgQEAKICMgTmV0d29yayBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIk5ldHdvcmtpbmcgc3VwcG9ydCIKK21lbnUgIk5ldHdvcmtpbmciCiAKIGNvbmZpZyBORVQKIAlib29sICJOZXR3b3JraW5nIHN1cHBvcnQiCkBAIC0xMCw3ICsxMCw5IEBACiAJICBVbmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgeW91IHNob3VsZCBzYXkgWSBoZXJlLgogCSAgVGhlIHJlYXNvbiBpcyB0aGF0IHNvbWUgcHJvZ3JhbXMgbmVlZCBrZXJuZWwgbmV0d29ya2luZyBzdXBwb3J0IGV2ZW4KIAkgIHdoZW4gcnVubmluZyBvbiBhIHN0YW5kLWFsb25lIG1hY2hpbmUgdGhhdCBpc24ndCBjb25uZWN0ZWQgdG8gYW55Ci0JICBvdGhlciBjb21wdXRlci4gSWYgeW91IGFyZSB1cGdyYWRpbmcgZnJvbSBhbiBvbGRlciBrZXJuZWwsIHlvdQorCSAgb3RoZXIgY29tcHV0ZXIuCisJICAKKwkgIElmIHlvdSBhcmUgdXBncmFkaW5nIGZyb20gYW4gb2xkZXIga2VybmVsLCB5b3UKIAkgIHNob3VsZCBjb25zaWRlciB1cGRhdGluZyB5b3VyIG5ldHdvcmtpbmcgdG9vbHMgdG9vIGJlY2F1c2UgY2hhbmdlcwogCSAgaW4gdGhlIGtlcm5lbCBhbmQgdGhlIHRvb2xzIG9mdGVuIGdvIGhhbmQgaW4gaGFuZC4gVGhlIHRvb2xzIGFyZQogCSAgY29udGFpbmVkIGluIHRoZSBwYWNrYWdlIG5ldC10b29scywgdGhlIGxvY2F0aW9uIGFuZCB2ZXJzaW9uIG51bWJlcgpAQCAtMjAsNTcgKzIyLDE0IEBACiAJICByZWNvbW1lbmRlZCB0byByZWFkIHRoZSBORVQtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCiAJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgogCisjIE1ha2Ugc3VyZSB0aGF0IGFsbCBjb25maWcgc3ltYm9scyBhcmUgZGVwZW5kZW50IG9uIE5FVAoraWYgTkVUCisKIG1lbnUgIk5ldHdvcmtpbmcgb3B0aW9ucyIKLQlkZXBlbmRzIG9uIE5FVAogCi1jb25maWcgUEFDS0VUCi0JdHJpc3RhdGUgIlBhY2tldCBzb2NrZXQiCi0JLS0taGVscC0tLQotCSAgVGhlIFBhY2tldCBwcm90b2NvbCBpcyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB3aGljaCBjb21tdW5pY2F0ZQotCSAgZGlyZWN0bHkgd2l0aCBuZXR3b3JrIGRldmljZXMgd2l0aG91dCBhbiBpbnRlcm1lZGlhdGUgbmV0d29yawotCSAgcHJvdG9jb2wgaW1wbGVtZW50ZWQgaW4gdGhlIGtlcm5lbCwgZS5nLiB0Y3BkdW1wLiAgSWYgeW91IHdhbnQgdGhlbQotCSAgdG8gd29yaywgY2hvb3NlIFkuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIGFmX3BhY2tldC4KLQotCSAgSWYgdW5zdXJlLCBzYXkgWS4KLQotY29uZmlnIFBBQ0tFVF9NTUFQCi0JYm9vbCAiUGFja2V0IHNvY2tldDogbW1hcHBlZCBJTyIKLQlkZXBlbmRzIG9uIFBBQ0tFVAotCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGUgUGFja2V0IHByb3RvY29sIGRyaXZlciB3aWxsIHVzZSBhbiBJTwotCSAgbWVjaGFuaXNtIHRoYXQgcmVzdWx0cyBpbiBmYXN0ZXIgY29tbXVuaWNhdGlvbi4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIFVOSVgKLQl0cmlzdGF0ZSAiVW5peCBkb21haW4gc29ja2V0cyIKLQktLS1oZWxwLS0tCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgaW5jbHVkZSBzdXBwb3J0IGZvciBVbml4IGRvbWFpbiBzb2NrZXRzOwotCSAgc29ja2V0cyBhcmUgdGhlIHN0YW5kYXJkIFVuaXggbWVjaGFuaXNtIGZvciBlc3RhYmxpc2hpbmcgYW5kCi0JICBhY2Nlc3NpbmcgbmV0d29yayBjb25uZWN0aW9ucy4gIE1hbnkgY29tbW9ubHkgdXNlZCBwcm9ncmFtcyBzdWNoIGFzCi0JICB0aGUgWCBXaW5kb3cgc3lzdGVtIGFuZCBzeXNsb2cgdXNlIHRoZXNlIHNvY2tldHMgZXZlbiBpZiB5b3VyCi0JICBtYWNoaW5lIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IG5ldHdvcmsuICBVbmxlc3MgeW91IGFyZSB3b3JraW5nIG9uCi0JICBhbiBlbWJlZGRlZCBzeXN0ZW0gb3Igc29tZXRoaW5nIHNpbWlsYXIsIHlvdSB0aGVyZWZvcmUgZGVmaW5pdGVseQotCSAgd2FudCB0byBzYXkgWSBoZXJlLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCB1bml4LiAgTm90ZSB0aGF0IHNldmVyYWwgaW1wb3J0YW50IHNlcnZpY2VzIHdvbid0IHdvcmsKLQkgIGNvcnJlY3RseSBpZiB5b3Ugc2F5IE0gaGVyZSBhbmQgdGhlbiBuZWdsZWN0IHRvIGxvYWQgdGhlIG1vZHVsZS4KLQotCSAgU2F5IFkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KLQotY29uZmlnIE5FVF9LRVkKLQl0cmlzdGF0ZSAiUEZfS0VZIHNvY2tldHMiCi0Jc2VsZWN0IFhGUk0KLQktLS1oZWxwLS0tCi0JICBQRl9LRVl2MiBzb2NrZXQgZmFtaWx5LCBjb21wYXRpYmxlIHRvIEtBTUUgb25lcy4KLQkgIFRoZXkgYXJlIHJlcXVpcmVkIGlmIHlvdSBhcmUgZ29pbmcgdG8gdXNlIElQc2VjIHRvb2xzIHBvcnRlZAotCSAgZnJvbSBLQU1FLgotCi0JICBTYXkgWSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorc291cmNlICJuZXQvcGFja2V0L0tjb25maWciCitzb3VyY2UgIm5ldC91bml4L0tjb25maWciCitzb3VyY2UgIm5ldC94ZnJtL0tjb25maWciCiAKIGNvbmZpZyBJTkVUCiAJYm9vbCAiVENQL0lQIG5ldHdvcmtpbmciCkBAIC05NCwzMCArNTMsMTIgQEAKIAogCSAgU2hvcnQgYW5zd2VyOiBzYXkgWS4KIAoraWYgSU5FVAogc291cmNlICJuZXQvaXB2NC9LY29uZmlnIgotCi0jICAgSVB2NiBhcyBtb2R1bGUgd2lsbCBjYXVzZSBhIENSQVNIIGlmIHlvdSB0cnkgdG8gdW5sb2FkIGl0Ci1jb25maWcgSVBWNgotCXRyaXN0YXRlICJUaGUgSVB2NiBwcm90b2NvbCIKLQlkZXBlbmRzIG9uIElORVQKLQlkZWZhdWx0IG0KLQlzZWxlY3QgQ1JZUFRPIGlmIElQVjZfUFJJVkFDWQotCXNlbGVjdCBDUllQVE9fTUQ1IGlmIElQVjZfUFJJVkFDWQotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgY29tcGxlbWVudGFsIHN1cHBvcnQgZm9yIHRoZSBJUCB2ZXJzaW9uIDYuCi0JICBZb3Ugd2lsbCBzdGlsbCBiZSBhYmxlIHRvIGRvIHRyYWRpdGlvbmFsIElQdjQgbmV0d29ya2luZyBhcyB3ZWxsLgotCi0JICBGb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBJUHY2LCBzZWUKLQkgIDxodHRwOi8vcGxheWdyb3VuZC5zdW4uY29tL3B1Yi9pcG5nL2h0bWwvaXBuZy1tYWluLmh0bWw+LgotCSAgRm9yIExpbnV4IElQdjYgZGV2ZWxvcG1lbnQgaW5mb3JtYXRpb24sIHNlZSA8aHR0cDovL3d3dy5saW51eC1pcHY2Lm9yZz4uCi0JICBGb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgSVB2NiB1bmRlciBMaW51eCwgcmVhZCB0aGUgSE9XVE8gYXQKLQkgIDxodHRwOi8vd3d3LmJpZXJpbmdlci5kZS9saW51eC9JUHY2Lz4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBwcm90b2NvbCBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaXB2Ni4KLQogc291cmNlICJuZXQvaXB2Ni9LY29uZmlnIgogCitlbmRpZiAjIGlmIElORVQKKwogbWVudWNvbmZpZyBORVRGSUxURVIKIAlib29sICJOZXR3b3JrIHBhY2tldCBmaWx0ZXJpbmcgKHJlcGxhY2VzIGlwY2hhaW5zKSIKIAktLS1oZWxwLS0tCkBAIC0yMDYsMjY5ICsxNDcsMTYgQEAKIAogZW5kaWYKIAotY29uZmlnIFhGUk0KLSAgICAgICBib29sCi0gICAgICAgZGVwZW5kcyBvbiBORVQKLQotc291cmNlICJuZXQveGZybS9LY29uZmlnIgotCiBzb3VyY2UgIm5ldC9zY3RwL0tjb25maWciCi0KLWNvbmZpZyBBVE0KLQl0cmlzdGF0ZSAiQXN5bmNocm9ub3VzIFRyYW5zZmVyIE1vZGUgKEFUTSkgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQktLS1oZWxwLS0tCi0JICBBVE0gaXMgYSBoaWdoLXNwZWVkIG5ldHdvcmtpbmcgdGVjaG5vbG9neSBmb3IgTG9jYWwgQXJlYSBOZXR3b3JrcwotCSAgYW5kIFdpZGUgQXJlYSBOZXR3b3Jrcy4gIEl0IHVzZXMgYSBmaXhlZCBwYWNrZXQgc2l6ZSBhbmQgaXMKLQkgIGNvbm5lY3Rpb24gb3JpZW50ZWQsIGFsbG93aW5nIGZvciB0aGUgbmVnb3RpYXRpb24gb2YgbWluaW11bQotCSAgYmFuZHdpZHRoIHJlcXVpcmVtZW50cy4KLQotCSAgSW4gb3JkZXIgdG8gcGFydGljaXBhdGUgaW4gYW4gQVRNIG5ldHdvcmssIHlvdXIgTGludXggYm94IG5lZWRzIGFuCi0JICBBVE0gbmV0d29ya2luZyBjYXJkLiBJZiB5b3UgaGF2ZSB0aGF0LCBzYXkgWSBoZXJlIGFuZCB0byB0aGUgZHJpdmVyCi0JICBvZiB5b3VyIEFUTSBjYXJkIGJlbG93LgotCi0JICBOb3RlIHRoYXQgeW91IG5lZWQgYSBzZXQgb2YgdXNlci1zcGFjZSBwcm9ncmFtcyB0byBhY3R1YWxseSBtYWtlIHVzZQotCSAgb2YgQVRNLiAgU2VlIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9hdG0udHh0PiBmb3IKLQkgIGZ1cnRoZXIgZGV0YWlscy4KLQotY29uZmlnIEFUTV9DTElQCi0JdHJpc3RhdGUgIkNsYXNzaWNhbCBJUCBvdmVyIEFUTSAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEFUTSAmJiBJTkVUCi0JaGVscAotCSAgQ2xhc3NpY2FsIElQIG92ZXIgQVRNIGZvciBQVkNzIGFuZCBTVkNzLCBzdXBwb3J0aW5nIEluQVJQIGFuZAotCSAgQVRNQVJQLiBJZiB5b3Ugd2FudCB0byBjb21tdW5pY2F0aW9uIHdpdGggb3RoZXIgSVAgaG9zdHMgb24geW91ciBBVE0KLQkgIG5ldHdvcmssIHlvdSB3aWxsIHR5cGljYWxseSBlaXRoZXIgc2F5IFkgaGVyZSBvciB0byAiTEFOIEVtdWxhdGlvbgotCSAgKExBTkUpIiBiZWxvdy4KLQotY29uZmlnIEFUTV9DTElQX05PX0lDTVAKLQlib29sICJEbyBOT1Qgc2VuZCBJQ01QIGlmIG5vIG5laWdoYm91ciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEFUTV9DTElQCi0JaGVscAotCSAgTm9ybWFsbHksIGFuICJJQ01QIGhvc3QgdW5yZWFjaGFibGUiIG1lc3NhZ2UgaXMgc2VudCBpZiBhIG5laWdoYm91cgotCSAgY2Fubm90IGJlIHJlYWNoZWQgYmVjYXVzZSB0aGVyZSBpcyBubyBWQyB0byBpdCBpbiB0aGUga2VybmVsJ3MKLQkgIEFUTUFSUCB0YWJsZS4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiBBVE1BUlAgdGFibGUgZW50cmllcyBhcmUKLQkgIGJyaWVmbHkgcmVtb3ZlZCBkdXJpbmcgcmV2YWxpZGF0aW9uLiBJZiB5b3Ugc2F5IFkgaGVyZSwgcGFja2V0cyB0bwotCSAgc3VjaCBuZWlnaGJvdXJzIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQgaW5zdGVhZC4KLQotY29uZmlnIEFUTV9MQU5FCi0JdHJpc3RhdGUgIkxBTiBFbXVsYXRpb24gKExBTkUpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBBVE0KLQloZWxwCi0JICBMQU4gRW11bGF0aW9uIGVtdWxhdGVzIHNlcnZpY2VzIG9mIGV4aXN0aW5nIExBTnMgYWNyb3NzIGFuIEFUTQotCSAgbmV0d29yay4gQmVzaWRlcyBvcGVyYXRpbmcgYXMgYSBub3JtYWwgQVRNIGVuZCBzdGF0aW9uIGNsaWVudCwgTGludXgKLQkgIExBTkUgY2xpZW50IGNhbiBhbHNvIGFjdCBhcyBhbiBwcm94eSBjbGllbnQgYnJpZGdpbmcgcGFja2V0cyBiZXR3ZWVuCi0JICBFTEFOIGFuZCBFdGhlcm5ldCBzZWdtZW50cy4gWW91IG5lZWQgTEFORSBpZiB5b3Ugd2FudCB0byB0cnkgTVBPQS4KLQotY29uZmlnIEFUTV9NUE9BCi0JdHJpc3RhdGUgIk11bHRpLVByb3RvY29sIE92ZXIgQVRNIChNUE9BKSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gQVRNICYmIElORVQgJiYgQVRNX0xBTkUhPW4KLQloZWxwCi0JICBNdWx0aS1Qcm90b2NvbCBPdmVyIEFUTSBhbGxvd3MgQVRNIGVkZ2UgZGV2aWNlcyBzdWNoIGFzIHJvdXRlcnMsCi0JICBicmlkZ2VzIGFuZCBBVE0gYXR0YWNoZWQgaG9zdHMgZXN0YWJsaXNoIGRpcmVjdCBBVE0gVkNzIGFjcm9zcwotCSAgc3VibmV0d29yayBib3VuZGFyaWVzLiBUaGVzZSBzaG9ydGN1dCBjb25uZWN0aW9ucyBieXBhc3Mgcm91dGVycwotCSAgZW5oYW5jaW5nIG92ZXJhbGwgbmV0d29yayBwZXJmb3JtYW5jZS4KLQotY29uZmlnIEFUTV9CUjI2ODQKLQl0cmlzdGF0ZSAiUkZDMTQ4My8yNjg0IEJyaWRnZWQgcHJvdG9jb2xzIgotCWRlcGVuZHMgb24gQVRNICYmIElORVQKLQloZWxwCi0JICBBVE0gUFZDcyBjYW4gY2FycnkgZXRoZXJuZXQgUERVcyBhY2NvcmRpbmcgdG8gcmZjMjY4NCAoZm9ybWVybHkgMTQ4MykKLQkgIFRoaXMgZGV2aWNlIHdpbGwgYWN0IGxpa2UgYW4gZXRoZXJuZXQgZnJvbSB0aGUga2VybmVscyBwb2ludCBvZiB2aWV3LAotCSAgd2l0aCB0aGUgdHJhZmZpYyBiZWluZyBjYXJyaWVkIGJ5IEFUTSBQVkNzIChjdXJyZW50bHkgMSBQVkMvZGV2aWNlKS4KLQkgIFRoaXMgaXMgc29tZXRpbWVzIHVzZWQgb3ZlciBEU0wgbGluZXMuICBJZiBpbiBkb3VidCwgc2F5IE4uCi0KLWNvbmZpZyBBVE1fQlIyNjg0X0lQRklMVEVSCi0JYm9vbCAiUGVyLVZDIElQIGZpbHRlciBrbHVkZ2UiCi0JZGVwZW5kcyBvbiBBVE1fQlIyNjg0Ci0JaGVscAotCSAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgbWVjaGFuaXNtIGZvciB1c2VycyB3aG8gbmVlZCB0byB0ZXJtaW5hdGluZyBhCi0JICBsYXJnZSBudW1iZXIgb2YgSVAtb25seSB2Y2Mncy4gIERvIG5vdCBlbmFibGUgdGhpcyB1bmxlc3MgeW91IGFyZSBzdXJlCi0JICB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0KLWNvbmZpZyBCUklER0UKLQl0cmlzdGF0ZSAiODAyLjFkIEV0aGVybmV0IEJyaWRnaW5nIgotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYW4KLQkgIEV0aGVybmV0IGJyaWRnZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZGlmZmVyZW50IEV0aGVybmV0IHNlZ21lbnRzIGl0Ci0JICBpcyBjb25uZWN0ZWQgdG8gd2lsbCBhcHBlYXIgYXMgb25lIEV0aGVybmV0IHRvIHRoZSBwYXJ0aWNpcGFudHMuCi0JICBTZXZlcmFsIHN1Y2ggYnJpZGdlcyBjYW4gd29yayB0b2dldGhlciB0byBjcmVhdGUgZXZlbiBsYXJnZXIKLQkgIG5ldHdvcmtzIG9mIEV0aGVybmV0cyB1c2luZyB0aGUgSUVFRSA4MDIuMSBzcGFubmluZyB0cmVlIGFsZ29yaXRobS4KLQkgIEFzIHRoaXMgaXMgYSBzdGFuZGFyZCwgTGludXggYnJpZGdlcyB3aWxsIGNvb3BlcmF0ZSBwcm9wZXJseSB3aXRoCi0JICBvdGhlciB0aGlyZCBwYXJ0eSBicmlkZ2UgcHJvZHVjdHMuCi0KLQkgIEluIG9yZGVyIHRvIHVzZSB0aGUgRXRoZXJuZXQgYnJpZGdlLCB5b3UnbGwgbmVlZCB0aGUgYnJpZGdlCi0JICBjb25maWd1cmF0aW9uIHRvb2xzOyBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JyaWRnZS50eHQ+Ci0JICBmb3IgbG9jYXRpb24uIFBsZWFzZSByZWFkIHRoZSBCcmlkZ2UgbWluaS1IT1dUTyBmb3IgbW9yZQotCSAgaW5mb3JtYXRpb24uCi0KLQkgIElmIHlvdSBlbmFibGUgaXB0YWJsZXMgc3VwcG9ydCBhbG9uZyB3aXRoIHRoZSBicmlkZ2Ugc3VwcG9ydCB0aGVuIHlvdQotCSAgdHVybiB5b3VyIGJyaWRnZSBpbnRvIGEgYnJpZGdpbmcgSVAgZmlyZXdhbGwuCi0JICBpcHRhYmxlcyB3aWxsIHRoZW4gc2VlIHRoZSBJUCBwYWNrZXRzIGJlaW5nIGJyaWRnZWQsIHNvIHlvdSBuZWVkIHRvCi0JICB0YWtlIHRoaXMgaW50byBhY2NvdW50IHdoZW4gc2V0dGluZyB1cCB5b3VyIGZpcmV3YWxsIHJ1bGVzLgotCSAgRW5hYmxpbmcgYXJwdGFibGVzIHN1cHBvcnQgd2hlbiBicmlkZ2luZyB3aWxsIGxldCBhcnB0YWJsZXMgc2VlCi0JICBicmlkZ2VkIEFSUCB0cmFmZmljIGluIHRoZSBhcnB0YWJsZXMgRk9SV0FSRCBjaGFpbi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGJyaWRnZS4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIFZMQU5fODAyMVEKLQl0cmlzdGF0ZSAiODAyLjFRIFZMQU4gU3VwcG9ydCIKLQktLS1oZWxwLS0tCi0JICBTZWxlY3QgdGhpcyBhbmQgeW91IHdpbGwgYmUgYWJsZSB0byBjcmVhdGUgODAyLjFRIFZMQU4gaW50ZXJmYWNlcwotCSAgb24geW91ciBldGhlcm5ldCBpbnRlcmZhY2VzLiAgODAyLjFRIFZMQU4gc3VwcG9ydHMgYWxtb3N0Ci0JICBldmVyeXRoaW5nIGEgcmVndWxhciBldGhlcm5ldCBpbnRlcmZhY2UgZG9lcywgaW5jbHVkaW5nCi0JICBmaXJld2FsbGluZywgYnJpZGdpbmcsIGFuZCBvZiBjb3Vyc2UgSVAgdHJhZmZpYy4gIFlvdSB3aWxsIG5lZWQKLQkgIHRoZSAndmNvbmZpZycgdG9vbCBmcm9tIHRoZSBWTEFOIHByb2plY3QgaW4gb3JkZXIgdG8gZWZmZWN0aXZlbHkKLQkgIHVzZSBWTEFOcy4gIFNlZSB0aGUgVkxBTiB3ZWIgcGFnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKLQkgIDxodHRwOi8vd3d3LmNhbmRlbGF0ZWNoLmNvbS9+Z3JlZWFyL3ZsYW4uaHRtbD4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIDgwMjFxLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgREVDTkVUCi0JdHJpc3RhdGUgIkRFQ25ldCBTdXBwb3J0IgotCS0tLWhlbHAtLS0KLQkgIFRoZSBERUNuZXQgbmV0d29ya2luZyBwcm90b2NvbCB3YXMgdXNlZCBpbiBtYW55IHByb2R1Y3RzIG1hZGUgYnkKLQkgIERpZ2l0YWwgKG5vdyBDb21wYXEpLiAgSXQgcHJvdmlkZXMgcmVsaWFibGUgc3RyZWFtIGFuZCBzZXF1ZW5jZWQKLQkgIHBhY2tldCBjb21tdW5pY2F0aW9ucyBvdmVyIHdoaWNoIHJ1biBhIHZhcmlldHkgb2Ygc2VydmljZXMgc2ltaWxhcgotCSAgdG8gdGhvc2Ugd2hpY2ggcnVuIG92ZXIgVENQL0lQLgotCi0JICBUbyBmaW5kIHNvbWUgdG9vbHMgdG8gdXNlIHdpdGggdGhlIGtlcm5lbCBsYXllciBzdXBwb3J0LCBwbGVhc2UKLQkgIGxvb2sgYXQgUGF0cmljayBDYXVsZmllbGQncyB3ZWIgc2l0ZToKLQkgIDxodHRwOi8vbGludXgtZGVjbmV0LnNvdXJjZWZvcmdlLm5ldC8+LgotCi0JICBNb3JlIGRldGFpbGVkIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZGVjbmV0LnR4dD4uCi0KLQkgIEJlIHN1cmUgdG8gc2F5IFkgdG8gIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGFuZCAiU3lzY3RsIHN1cHBvcnQiCi0JICBiZWxvdyB3aGVuIHVzaW5nIERFQ25ldCwgc2luY2UgeW91IHdpbGwgbmVlZCBzeXNjdGwgc3VwcG9ydCB0byBhaWQKLQkgIGluIGNvbmZpZ3VyYXRpb24gYXQgcnVuIHRpbWUuCi0KLQkgIFRoZSBERUNuZXQgY29kZSBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKLQkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4KLQkgIFRoZSBtb2R1bGUgaXMgY2FsbGVkIGRlY25ldC4KLQorc291cmNlICJuZXQvYXRtL0tjb25maWciCitzb3VyY2UgIm5ldC9icmlkZ2UvS2NvbmZpZyIKK3NvdXJjZSAibmV0LzgwMjFxL0tjb25maWciCiBzb3VyY2UgIm5ldC9kZWNuZXQvS2NvbmZpZyIKLQogc291cmNlICJuZXQvbGxjL0tjb25maWciCi0KLWNvbmZpZyBJUFgKLQl0cmlzdGF0ZSAiVGhlIElQWCBwcm90b2NvbCIKLQlzZWxlY3QgTExDCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgTm92ZWxsIG5ldHdvcmtpbmcgcHJvdG9jb2wsIElQWCwgY29tbW9ubHkKLQkgIHVzZWQgZm9yIGxvY2FsIG5ldHdvcmtzIG9mIFdpbmRvd3MgbWFjaGluZXMuICBZb3UgbmVlZCBpdCBpZiB5b3UKLQkgIHdhbnQgdG8gYWNjZXNzIE5vdmVsbCBOZXRXYXJlIGZpbGUgb3IgcHJpbnQgc2VydmVycyB1c2luZyB0aGUgTGludXgKLQkgIE5vdmVsbCBjbGllbnQgbmNwZnMgKGF2YWlsYWJsZSBmcm9tCi0JICA8ZnRwOi8vcGxhdGFuLnZjLmN2dXQuY3ovcHViL2xpbnV4L25jcGZzLz4pIG9yIGZyb20KLQkgIHdpdGhpbiB0aGUgTGludXggRE9TIGVtdWxhdG9yIERPU0VNVSAocmVhZCB0aGUgRE9TRU1VLUhPV1RPLAotCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPikuICBJbiBvcmRlcgotCSAgdG8gZG8gdGhlIGZvcm1lciwgeW91J2xsIGFsc28gaGF2ZSB0byBzYXkgWSB0byAiTkNQIGZpbGUgc3lzdGVtCi0JICBzdXBwb3J0IiwgYmVsb3cuCi0KLQkgIElQWCBpcyBzaW1pbGFyIGluIHNjb3BlIHRvIElQLCB3aGlsZSBTUFgsIHdoaWNoIHJ1bnMgb24gdG9wIG9mIElQWCwKLQkgIGlzIHNpbWlsYXIgdG8gVENQLiBUaGVyZSBpcyBhbHNvIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBTUFggaW4KLQkgIExpbnV4IChzZWUgIlNQWCBuZXR3b3JraW5nIiwgYmVsb3cpLgotCi0JICBUbyB0dXJuIHlvdXIgTGludXggYm94IGludG8gYSBmdWxseSBmZWF0dXJlZCBOZXRXYXJlIGZpbGUgc2VydmVyIGFuZAotCSAgSVBYIHJvdXRlciwgc2F5IFkgaGVyZSBhbmQgZmV0Y2ggZWl0aGVyIGx3YXJlZCBmcm9tCi0JICA8ZnRwOi8vaWJpYmxpby5vcmcvcHViL0xpbnV4L3N5c3RlbS9uZXR3b3JrL2RhZW1vbnMvPiBvcgotCSAgbWFyc19ud2UgZnJvbSA8ZnRwOi8vd3d3LmNvbXB1LWFydC5kZS9tYXJzX253ZS8+LiBGb3IgbW9yZQotCSAgaW5mb3JtYXRpb24sIHJlYWQgdGhlIElQWC1IT1dUTyBhdmFpbGFibGUgZnJvbQotCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KLQotCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKLQkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgotCi0JICBUaGUgSVBYIGRyaXZlciB3b3VsZCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDE2IEtCLiBUbyBjb21waWxlCi0JICB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHguCi0JICBVbmxlc3MgeW91IHdhbnQgdG8gaW50ZWdyYXRlIHlvdXIgTGludXggYm94IHdpdGggYSBsb2NhbCBOb3ZlbGwKLQkgIG5ldHdvcmssIHNheSBOLgotCiBzb3VyY2UgIm5ldC9pcHgvS2NvbmZpZyIKLQotY29uZmlnIEFUQUxLCi0JdHJpc3RhdGUgIkFwcGxldGFsayBwcm90b2NvbCBzdXBwb3J0IgotCXNlbGVjdCBMTEMKLQktLS1oZWxwLS0tCi0JICBBcHBsZVRhbGsgaXMgdGhlIHByb3RvY29sIHRoYXQgQXBwbGUgY29tcHV0ZXJzIGNhbiB1c2UgdG8gY29tbXVuaWNhdGUKLQkgIG9uIGEgbmV0d29yay4gIElmIHlvdXIgTGludXggYm94IGlzIGNvbm5lY3RlZCB0byBzdWNoIGEgbmV0d29yayBhbmQgeW91Ci0JICB3aXNoIHRvIGNvbm5lY3QgdG8gaXQsIHNheSBZLiAgWW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIG5ldGF0YWxrIHBhY2thZ2UKLQkgIHNvIHRoYXQgeW91ciBMaW51eCBib3ggY2FuIGFjdCBhcyBhIHByaW50IGFuZCBmaWxlIHNlcnZlciBmb3IgTWFjcyBhcwotCSAgd2VsbCBhcyBhY2Nlc3MgQXBwbGVUYWxrIHByaW50ZXJzLiAgQ2hlY2sgb3V0Ci0JICA8aHR0cDovL3d3dy56ZXR0YWJ5dGUubmV0L25ldGF0YWxrLz4gb24gdGhlIFdXVyBmb3IgZGV0YWlscy4KLQkgIEV0aGVyVGFsayBpcyB0aGUgbmFtZSB1c2VkIGZvciBBcHBsZVRhbGsgb3ZlciBFdGhlcm5ldCBhbmQgdGhlCi0JICBjaGVhcGVyIGFuZCBzbG93ZXIgTG9jYWxUYWxrIGlzIEFwcGxlVGFsayBvdmVyIGEgcHJvcHJpZXRhcnkgQXBwbGUKLQkgIG5ldHdvcmsgdXNpbmcgc2VyaWFsIGxpbmtzLiAgRXRoZXJUYWxrIGFuZCBMb2NhbFRhbGsgYXJlIGZ1bGx5Ci0JICBzdXBwb3J0ZWQgYnkgTGludXguCi0KLQkgIEdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNvbm5lY3QgTGludXgsIFdpbmRvd3MgbWFjaGluZXMgYW5kCi0JICBNYWNzIGlzIG9uIHRoZSBXV1cgYXQgPGh0dHA6Ly93d3cuZWF0cy5jb20vbGludXhfbWFjX3dpbi5odG1sPi4gIFRoZQotCSAgTkVULTMtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBjb250YWlucyB2YWx1YWJsZQotCSAgaW5mb3JtYXRpb24gYXMgd2VsbC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCi0JICBjYWxsZWQgYXBwbGV0YWxrLiBZb3UgYWxtb3N0IGNlcnRhaW5seSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYQotCSAgbW9kdWxlIHNvIHlvdSBjYW4gcmVzdGFydCB5b3VyIEFwcGxlVGFsayBzdGFjayB3aXRob3V0IHJlYm9vdGluZwotCSAgeW91ciBtYWNoaW5lLiBJIGhlYXIgdGhhdCB0aGUgR05VIGJveWNvdHQgb2YgQXBwbGUgaXMgb3Zlciwgc28KLQkgIGV2ZW4gcG9saXRpY2FsbHkgY29ycmVjdCBwZW9wbGUgYXJlIGFsbG93ZWQgdG8gc2F5IFkgaGVyZS4KLQogc291cmNlICJkcml2ZXJzL25ldC9hcHBsZXRhbGsvS2NvbmZpZyIKLQotY29uZmlnIFgyNQotCXRyaXN0YXRlICJDQ0lUVCBYLjI1IFBhY2tldCBMYXllciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAotCS0tLWhlbHAtLS0KLQkgIFguMjUgaXMgYSBzZXQgb2Ygc3RhbmRhcmRpemVkIG5ldHdvcmsgcHJvdG9jb2xzLCBzaW1pbGFyIGluIHNjb3BlIHRvCi0JICBmcmFtZSByZWxheTsgdGhlIG9uZSBwaHlzaWNhbCBsaW5lIGZyb20geW91ciBib3ggdG8gdGhlIFguMjUgbmV0d29yawotCSAgZW50cnkgcG9pbnQgY2FuIGNhcnJ5IHNldmVyYWwgbG9naWNhbCBwb2ludC10by1wb2ludCBjb25uZWN0aW9ucwotCSAgKGNhbGxlZCAidmlydHVhbCBjaXJjdWl0cyIpIHRvIG90aGVyIGNvbXB1dGVycyBjb25uZWN0ZWQgdG8gdGhlIFguMjUKLQkgIG5ldHdvcmsuIEdvdmVybm1lbnRzLCBiYW5rcywgYW5kIG90aGVyIG9yZ2FuaXphdGlvbnMgdGVuZCB0byB1c2UgaXQKLQkgIHRvIGNvbm5lY3QgdG8gZWFjaCBvdGhlciBvciB0byBmb3JtIFdpZGUgQXJlYSBOZXR3b3JrcyAoV0FOcykuIE1hbnkKLQkgIGNvdW50cmllcyBoYXZlIHB1YmxpYyBYLjI1IG5ldHdvcmtzLiBYLjI1IGNvbnNpc3RzIG9mIHR3bwotCSAgcHJvdG9jb2xzOiB0aGUgaGlnaGVyIGxldmVsIFBhY2tldCBMYXllciBQcm90b2NvbCAoUExQKSAoc2F5IFkgaGVyZQotCSAgaWYgeW91IHdhbnQgdGhhdCkgYW5kIHRoZSBsb3dlciBsZXZlbCBkYXRhIGxpbmsgbGF5ZXIgcHJvdG9jb2wgTEFQQgotCSAgKHNheSBZIHRvICJMQVBCIERhdGEgTGluayBEcml2ZXIiIGJlbG93IGlmIHlvdSB3YW50IHRoYXQpLgotCi0JICBZb3UgY2FuIHJlYWQgbW9yZSBhYm91dCBYLjI1IGF0IDxodHRwOi8vd3d3LnNhbmdvbWEuY29tL3gyNS5odG0+IGFuZAotCSAgPGh0dHA6Ly93d3cuY2lzY28uY29tL3VuaXZlcmNkL2NjL3RkL2RvYy9wcm9kdWN0L3NvZnR3YXJlL2lvczExL2Nib29rL2N4MjUuaHRtPi4KLQkgIEluZm9ybWF0aW9uIGFib3V0IFguMjUgZm9yIExpbnV4IGlzIGNvbnRhaW5lZCBpbiB0aGUgZmlsZXMKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy94MjUudHh0PiBhbmQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy94MjUtaWZhY2UudHh0Pi4KLQotCSAgT25lIGNvbm5lY3RzIHRvIGFuIFguMjUgbmV0d29yayBlaXRoZXIgd2l0aCBhIGRlZGljYXRlZCBuZXR3b3JrIGNhcmQKLQkgIHVzaW5nIHRoZSBYLjIxIHByb3RvY29sIChub3QgeWV0IHN1cHBvcnRlZCBieSBMaW51eCkgb3Igb25lIGNhbiBkbwotCSAgWC4yNSBvdmVyIGEgc3RhbmRhcmQgdGVsZXBob25lIGxpbmUgdXNpbmcgYW4gb3JkaW5hcnkgbW9kZW0gKHNheSBZCi0JICB0byAiWC4yNSBhc3luYyBkcml2ZXIiIGJlbG93KSBvciBvdmVyIEV0aGVybmV0IHVzaW5nIGFuIG9yZGluYXJ5Ci0JICBFdGhlcm5ldCBjYXJkIGFuZCB0aGUgTEFQQiBvdmVyIEV0aGVybmV0IChzYXkgWSB0byAiTEFQQiBEYXRhIExpbmsKLQkgIERyaXZlciIgYW5kICJMQVBCIG92ZXIgRXRoZXJuZXQgZHJpdmVyIiBiZWxvdykuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIHgyNS4gSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIExBUEIKLQl0cmlzdGF0ZSAiTEFQQiBEYXRhIExpbmsgRHJpdmVyIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JLS0taGVscC0tLQotCSAgTGluayBBY2Nlc3MgUHJvY2VkdXJlLCBCYWxhbmNlZCAoTEFQQikgaXMgdGhlIGRhdGEgbGluayBsYXllciAoaS5lLgotCSAgdGhlIGxvd2VyKSBwYXJ0IG9mIHRoZSBYLjI1IHByb3RvY29sLiBJdCBvZmZlcnMgYSByZWxpYWJsZQotCSAgY29ubmVjdGlvbiBzZXJ2aWNlIHRvIGV4Y2hhbmdlIGRhdGEgZnJhbWVzIHdpdGggb25lIG90aGVyIGhvc3QsIGFuZAotCSAgaXQgaXMgdXNlZCB0byB0cmFuc3BvcnQgaGlnaGVyIGxldmVsIHByb3RvY29scyAobW9zdGx5IFguMjUgUGFja2V0Ci0JICBMYXllciwgdGhlIGhpZ2hlciBwYXJ0IG9mIFguMjUsIGJ1dCBvdGhlcnMgYXJlIHBvc3NpYmxlIGFzIHdlbGwpLgotCSAgVXN1YWxseSwgTEFQQiBpcyB1c2VkIHdpdGggc3BlY2lhbGl6ZWQgWC4yMSBuZXR3b3JrIGNhcmRzLCBidXQgTGludXgKLQkgIGN1cnJlbnRseSBzdXBwb3J0cyBMQVBCIG9ubHkgb3ZlciBFdGhlcm5ldCBjb25uZWN0aW9ucy4gSWYgeW91IHdhbnQKLQkgIHRvIHVzZSBMQVBCIGNvbm5lY3Rpb25zIG92ZXIgRXRoZXJuZXQsIHNheSBZIGhlcmUgYW5kIHRvICJMQVBCIG92ZXIKLQkgIEV0aGVybmV0IGRyaXZlciIgYmVsb3cuIFJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9sYXBiLW1vZHVsZS50eHQ+IGZvciB0ZWNobmljYWwKLQkgIGRldGFpbHMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGxhcGIuICBJZiB1bnN1cmUsIHNheSBOLgorc291cmNlICJuZXQveDI1L0tjb25maWciCitzb3VyY2UgIm5ldC9sYXBiL0tjb25maWciCiAKIGNvbmZpZyBORVRfRElWRVJUCiAJYm9vbCAiRnJhbWUgRGl2ZXJ0ZXIgKEVYUEVSSU1FTlRBTCkiCkBAIC00OTYsMTA3ICsxODQsMTAgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIEVDT05FVAotCXRyaXN0YXRlICJBY29ybiBFY29uZXQvQVVOIHByb3RvY29scyAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBJTkVUCi0JLS0taGVscC0tLQotCSAgRWNvbmV0IGlzIGEgZmFpcmx5IG9sZCBhbmQgc2xvdyBuZXR3b3JraW5nIHByb3RvY29sIG1haW5seSB1c2VkIGJ5Ci0JICBBY29ybiBjb21wdXRlcnMgdG8gYWNjZXNzIGZpbGUgYW5kIHByaW50IHNlcnZlcnMuIEl0IHVzZXMgbmF0aXZlCi0JICBFY29uZXQgbmV0d29yayBjYXJkcy4gQVVOIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoaWdoZXIgbGV2ZWwKLQkgIHBhcnRzIG9mIEVjb25ldCB0aGF0IHJ1bnMgb3ZlciBvcmRpbmFyeSBFdGhlcm5ldCBjb25uZWN0aW9ucywgb24KLQkgIHRvcCBvZiB0aGUgVURQIHBhY2tldCBwcm90b2NvbCwgd2hpY2ggaW4gdHVybiBydW5zIG9uIHRvcCBvZiB0aGUKLQkgIEludGVybmV0IHByb3RvY29sIElQLgotCi0JICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IGNhbiBjaG9vc2Ugd2l0aCB0aGUgbmV4dCB0d28gb3B0aW9ucyB3aGV0aGVyCi0JICB0byBzZW5kIEVjb25ldC9BVU4gdHJhZmZpYyBvdmVyIGEgVURQIEV0aGVybmV0IGNvbm5lY3Rpb24gb3Igb3ZlcgotCSAgYSBuYXRpdmUgRWNvbmV0IG5ldHdvcmsgY2FyZC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQotCSAgd2lsbCBiZSBjYWxsZWQgZWNvbmV0LgotCi1jb25maWcgRUNPTkVUX0FVTlVEUAotCWJvb2wgIkFVTiBvdmVyIFVEUCIKLQlkZXBlbmRzIG9uIEVDT05FVAotCWhlbHAKLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gc2VuZCBFY29uZXQvQVVOIHRyYWZmaWMgb3ZlciBhIFVEUAotCSAgY29ubmVjdGlvbiAoVURQIGlzIGEgcGFja2V0IGJhc2VkIHByb3RvY29sIHRoYXQgcnVucyBvbiB0b3Agb2YgdGhlCi0JICBJbnRlcm5ldCBwcm90b2NvbCBJUCkgdXNpbmcgYW4gb3JkaW5hcnkgRXRoZXJuZXQgbmV0d29yayBjYXJkLgotCi1jb25maWcgRUNPTkVUX05BVElWRQotCWJvb2wgIk5hdGl2ZSBFY29uZXQiCi0JZGVwZW5kcyBvbiBFQ09ORVQKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgbmF0aXZlIEVjb25ldCBuZXR3b3JrIGNhcmQgaW5zdGFsbGVkIGluCi0JICB5b3VyIGNvbXB1dGVyLgotCi1jb25maWcgV0FOX1JPVVRFUgotCXRyaXN0YXRlICJXQU4gcm91dGVyIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JLS0taGVscC0tLQotCSAgV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKSwgc3VjaCBhcyBYLjI1LCBmcmFtZSByZWxheSBhbmQgbGVhc2VkCi0JICBsaW5lcywgYXJlIHVzZWQgdG8gaW50ZXJjb25uZWN0IExvY2FsIEFyZWEgTmV0d29ya3MgKExBTnMpIG92ZXIgdmFzdAotCSAgZGlzdGFuY2VzIHdpdGggZGF0YSB0cmFuc2ZlciByYXRlcyBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuIHRob3NlCi0JICBhY2hpZXZhYmxlIHdpdGggY29tbW9ubHkgdXNlZCBhc3luY2hyb25vdXMgbW9kZW0gY29ubmVjdGlvbnMuCi0JICBVc3VhbGx5LCBhIHF1aXRlIGV4cGVuc2l2ZSBleHRlcm5hbCBkZXZpY2UgY2FsbGVkIGEgYFdBTiByb3V0ZXInIGlzCi0JICBuZWVkZWQgdG8gY29ubmVjdCB0byBhIFdBTi4KLQotCSAgQXMgYW4gYWx0ZXJuYXRpdmUsIFdBTiByb3V0aW5nIGNhbiBiZSBidWlsdCBpbnRvIHRoZSBMaW51eCBrZXJuZWwuCi0JICBXaXRoIHJlbGF0aXZlbHkgaW5leHBlbnNpdmUgV0FOIGludGVyZmFjZSBjYXJkcyBhdmFpbGFibGUgb24gdGhlCi0JICBtYXJrZXQsIGEgcGVyZmVjdGx5IHVzYWJsZSByb3V0ZXIgY2FuIGJlIGJ1aWx0IGZvciBsZXNzIHRoYW4gaGFsZgotCSAgdGhlIHByaWNlIG9mIGFuIGV4dGVybmFsIHJvdXRlci4gIElmIHlvdSBoYXZlIG9uZSBvZiB0aG9zZSBjYXJkcyBhbmQKLQkgIHdpc2ggdG8gdXNlIHlvdXIgTGludXggYm94IGFzIGEgV0FOIHJvdXRlciwgc2F5IFkgaGVyZSBhbmQgYWxzbyB0bwotCSAgdGhlIFdBTiBkcml2ZXIgZm9yIHlvdXIgY2FyZCwgYmVsb3cuICBZb3Ugd2lsbCB0aGVuIG5lZWQgdGhlCi0JICB3YW4tdG9vbHMgcGFja2FnZSB3aGljaCBpcyBhdmFpbGFibGUgZnJvbSA8ZnRwOi8vZnRwLnNhbmdvbWEuY29tLz4uCi0JICBSZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy93YW4tcm91dGVyLnR4dD4gZm9yIG1vcmUKLQkgIGluZm9ybWF0aW9uLgotCi0JICBUbyBjb21waWxlIFdBTiByb3V0aW5nIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdhbnJvdXRlci4KLQotCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotbWVudSAiUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nIgotCi1jb25maWcgTkVUX1NDSEVECi0JYm9vbCAiUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nIgotCS0tLWhlbHAtLS0KLQkgIFdoZW4gdGhlIGtlcm5lbCBoYXMgc2V2ZXJhbCBwYWNrZXRzIHRvIHNlbmQgb3V0IG92ZXIgYSBuZXR3b3JrCi0JICBkZXZpY2UsIGl0IGhhcyB0byBkZWNpZGUgd2hpY2ggb25lcyB0byBzZW5kIGZpcnN0LCB3aGljaCBvbmVzIHRvCi0JICBkZWxheSwgYW5kIHdoaWNoIG9uZXMgdG8gZHJvcC4gVGhpcyBpcyB0aGUgam9iIG9mIHRoZSBwYWNrZXQKLQkgIHNjaGVkdWxlciwgYW5kIHNldmVyYWwgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIGhvdyB0byBkbyB0aGlzCi0JICAiZmFpcmx5IiBoYXZlIGJlZW4gcHJvcG9zZWQuCi0KLQkgIElmIHlvdSBzYXkgTiBoZXJlLCB5b3Ugd2lsbCBnZXQgdGhlIHN0YW5kYXJkIHBhY2tldCBzY2hlZHVsZXIsIHdoaWNoCi0JICBpcyBhIEZJRk8gKGZpcnN0IGNvbWUsIGZpcnN0IHNlcnZlZCkuIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZQotCSAgYWJsZSB0byBjaG9vc2UgZnJvbSBhbW9uZyBzZXZlcmFsIGFsdGVybmF0aXZlIGFsZ29yaXRobXMgd2hpY2ggY2FuCi0JICB0aGVuIGJlIGF0dGFjaGVkIHRvIGRpZmZlcmVudCBuZXR3b3JrIGRldmljZXMuIFRoaXMgaXMgdXNlZnVsIGZvcgotCSAgZXhhbXBsZSBpZiBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzIGFyZSByZWFsIHRpbWUgZGV2aWNlcyB0aGF0Ci0JICBuZWVkIGEgY2VydGFpbiBtaW5pbXVtIGRhdGEgZmxvdyByYXRlLCBvciBpZiB5b3UgbmVlZCB0byBsaW1pdCB0aGUKLQkgIG1heGltdW0gZGF0YSBmbG93IHJhdGUgZm9yIHRyYWZmaWMgd2hpY2ggbWF0Y2hlcyBzcGVjaWZpZWQgY3JpdGVyaWEuCi0JICBUaGlzIGNvZGUgaXMgY29uc2lkZXJlZCB0byBiZSBleHBlcmltZW50YWwuCi0KLQkgIFRvIGFkbWluaXN0ZXIgdGhlc2Ugc2NoZWR1bGVycywgeW91J2xsIG5lZWQgdGhlIHVzZXItbGV2ZWwgdXRpbGl0aWVzCi0JICBmcm9tIHRoZSBwYWNrYWdlIGlwcm91dGUyK3RjIGF0IDxmdHA6Ly9mdHAudHV4Lm9yZy9wdWIvbmV0L2lwLXJvdXRpbmcvPi4KLQkgIFRoYXQgcGFja2FnZSBhbHNvIGNvbnRhaW5zIHNvbWUgZG9jdW1lbnRhdGlvbjsgZm9yIG1vcmUsIGNoZWNrIG91dAotCSAgPGh0dHA6Ly9zbmFmdS5mcmVlZG9tLm9yZy9saW51eDIuMi9pcHJvdXRlLW5vdGVzLmh0bWw+LgotCi0JICBUaGlzIFF1YWxpdHkgb2YgU2VydmljZSAoUW9TKSBzdXBwb3J0IHdpbGwgZW5hYmxlIHlvdSB0byB1c2UKLQkgIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIChkaWZmc2VydikgYW5kIFJlc291cmNlIFJlc2VydmF0aW9uIFByb3RvY29sCi0JICAoUlNWUCkgb24geW91ciBMaW51eCByb3V0ZXIgaWYgeW91IGFsc28gc2F5IFkgdG8gIlFvUyBzdXBwb3J0IiwKLQkgICJQYWNrZXQgY2xhc3NpZmllciBBUEkiIGFuZCB0byBzb21lIGNsYXNzaWZpZXJzIGJlbG93LiBEb2N1bWVudGF0aW9uCi0JICBhbmQgc29mdHdhcmUgaXMgYXQgPGh0dHA6Ly9kaWZmc2Vydi5zb3VyY2Vmb3JnZS5uZXQvPi4KLQotCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIHRvICIvcHJvYyBmaWxlIHN5c3RlbSIgYmVsb3csIHlvdSB3aWxsIGJlIGFibGUKLQkgIHRvIHJlYWQgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHBhY2tldCBzY2hlZHVsZXJzIGZyb20gdGhlIGZpbGUKLQkgIC9wcm9jL25ldC9wc2NoZWQuCi0KLQkgIFRoZSBhdmFpbGFibGUgc2NoZWR1bGVycyBhcmUgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOyB5b3UKLQkgIGNhbiBzYXkgWSB0byBhcyBtYW55IGFzIHlvdSBsaWtlLiBJZiB1bnN1cmUsIHNheSBOIG5vdy4KLQorc291cmNlICJuZXQvZWNvbmV0L0tjb25maWciCitzb3VyY2UgIm5ldC93YW5yb3V0ZXIvS2NvbmZpZyIKIHNvdXJjZSAibmV0L3NjaGVkL0tjb25maWciCiAKLWVuZG1lbnUKLQogbWVudSAiTmV0d29yayB0ZXN0aW5nIgogCiBjb25maWcgTkVUX1BLVEdFTgpAQCAtNjM1LDEyICsyMjYsOSBAQAogCWRlZl9ib29sIE5FVFBPTEwKIAogc291cmNlICJuZXQvYXgyNS9LY29uZmlnIgotCiBzb3VyY2UgIm5ldC9pcmRhL0tjb25maWciCi0KIHNvdXJjZSAibmV0L2JsdWV0b290aC9LY29uZmlnIgogCi1zb3VyY2UgImRyaXZlcnMvbmV0L0tjb25maWciCi0KLWVuZG1lbnUKK2VuZGlmICAgIyBpZiBORVQKK2VuZG1lbnUgIyBOZXR3b3JraW5nCiAKZGlmZiAtLWdpdCBhL25ldC9hdG0vS2NvbmZpZyBiL25ldC9hdG0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWEyNDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2F0bS9LY29uZmlnCkBAIC0wLDAgKzEsNzQgQEAKKyMKKyMgQXN5bmNocm9ub3VzIFRyYW5zZmVyIE1vZGUgKEFUTSkgKEVYUEVSSU1FTlRBTCkKKyMKKworY29uZmlnIEFUTQorCXRyaXN0YXRlICJBc3luY2hyb25vdXMgVHJhbnNmZXIgTW9kZSAoQVRNKSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIEFUTSBpcyBhIGhpZ2gtc3BlZWQgbmV0d29ya2luZyB0ZWNobm9sb2d5IGZvciBMb2NhbCBBcmVhIE5ldHdvcmtzCisJICBhbmQgV2lkZSBBcmVhIE5ldHdvcmtzLiAgSXQgdXNlcyBhIGZpeGVkIHBhY2tldCBzaXplIGFuZCBpcworCSAgY29ubmVjdGlvbiBvcmllbnRlZCwgYWxsb3dpbmcgZm9yIHRoZSBuZWdvdGlhdGlvbiBvZiBtaW5pbXVtCisJICBiYW5kd2lkdGggcmVxdWlyZW1lbnRzLgorCisJICBJbiBvcmRlciB0byBwYXJ0aWNpcGF0ZSBpbiBhbiBBVE0gbmV0d29yaywgeW91ciBMaW51eCBib3ggbmVlZHMgYW4KKwkgIEFUTSBuZXR3b3JraW5nIGNhcmQuIElmIHlvdSBoYXZlIHRoYXQsIHNheSBZIGhlcmUgYW5kIHRvIHRoZSBkcml2ZXIKKwkgIG9mIHlvdXIgQVRNIGNhcmQgYmVsb3cuCisKKwkgIE5vdGUgdGhhdCB5b3UgbmVlZCBhIHNldCBvZiB1c2VyLXNwYWNlIHByb2dyYW1zIHRvIGFjdHVhbGx5IG1ha2UgdXNlCisJICBvZiBBVE0uICBTZWUgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2F0bS50eHQ+IGZvcgorCSAgZnVydGhlciBkZXRhaWxzLgorCitjb25maWcgQVRNX0NMSVAKKwl0cmlzdGF0ZSAiQ2xhc3NpY2FsIElQIG92ZXIgQVRNIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVRNICYmIElORVQKKwloZWxwCisJICBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gZm9yIFBWQ3MgYW5kIFNWQ3MsIHN1cHBvcnRpbmcgSW5BUlAgYW5kCisJICBBVE1BUlAuIElmIHlvdSB3YW50IHRvIGNvbW11bmljYXRpb24gd2l0aCBvdGhlciBJUCBob3N0cyBvbiB5b3VyIEFUTQorCSAgbmV0d29yaywgeW91IHdpbGwgdHlwaWNhbGx5IGVpdGhlciBzYXkgWSBoZXJlIG9yIHRvICJMQU4gRW11bGF0aW9uCisJICAoTEFORSkiIGJlbG93LgorCitjb25maWcgQVRNX0NMSVBfTk9fSUNNUAorCWJvb2wgIkRvIE5PVCBzZW5kIElDTVAgaWYgbm8gbmVpZ2hib3VyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gQVRNX0NMSVAKKwloZWxwCisJICBOb3JtYWxseSwgYW4gIklDTVAgaG9zdCB1bnJlYWNoYWJsZSIgbWVzc2FnZSBpcyBzZW50IGlmIGEgbmVpZ2hib3VyCisJICBjYW5ub3QgYmUgcmVhY2hlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIFZDIHRvIGl0IGluIHRoZSBrZXJuZWwncworCSAgQVRNQVJQIHRhYmxlLiBUaGlzIG1heSBjYXVzZSBwcm9ibGVtcyB3aGVuIEFUTUFSUCB0YWJsZSBlbnRyaWVzIGFyZQorCSAgYnJpZWZseSByZW1vdmVkIGR1cmluZyByZXZhbGlkYXRpb24uIElmIHlvdSBzYXkgWSBoZXJlLCBwYWNrZXRzIHRvCisJICBzdWNoIG5laWdoYm91cnMgYXJlIHNpbGVudGx5IGRpc2NhcmRlZCBpbnN0ZWFkLgorCitjb25maWcgQVRNX0xBTkUKKwl0cmlzdGF0ZSAiTEFOIEVtdWxhdGlvbiAoTEFORSkgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEFUTQorCWhlbHAKKwkgIExBTiBFbXVsYXRpb24gZW11bGF0ZXMgc2VydmljZXMgb2YgZXhpc3RpbmcgTEFOcyBhY3Jvc3MgYW4gQVRNCisJICBuZXR3b3JrLiBCZXNpZGVzIG9wZXJhdGluZyBhcyBhIG5vcm1hbCBBVE0gZW5kIHN0YXRpb24gY2xpZW50LCBMaW51eAorCSAgTEFORSBjbGllbnQgY2FuIGFsc28gYWN0IGFzIGFuIHByb3h5IGNsaWVudCBicmlkZ2luZyBwYWNrZXRzIGJldHdlZW4KKwkgIEVMQU4gYW5kIEV0aGVybmV0IHNlZ21lbnRzLiBZb3UgbmVlZCBMQU5FIGlmIHlvdSB3YW50IHRvIHRyeSBNUE9BLgorCitjb25maWcgQVRNX01QT0EKKwl0cmlzdGF0ZSAiTXVsdGktUHJvdG9jb2wgT3ZlciBBVE0gKE1QT0EpIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBBVE0gJiYgSU5FVCAmJiBBVE1fTEFORSE9bgorCWhlbHAKKwkgIE11bHRpLVByb3RvY29sIE92ZXIgQVRNIGFsbG93cyBBVE0gZWRnZSBkZXZpY2VzIHN1Y2ggYXMgcm91dGVycywKKwkgIGJyaWRnZXMgYW5kIEFUTSBhdHRhY2hlZCBob3N0cyBlc3RhYmxpc2ggZGlyZWN0IEFUTSBWQ3MgYWNyb3NzCisJICBzdWJuZXR3b3JrIGJvdW5kYXJpZXMuIFRoZXNlIHNob3J0Y3V0IGNvbm5lY3Rpb25zIGJ5cGFzcyByb3V0ZXJzCisJICBlbmhhbmNpbmcgb3ZlcmFsbCBuZXR3b3JrIHBlcmZvcm1hbmNlLgorCitjb25maWcgQVRNX0JSMjY4NAorCXRyaXN0YXRlICJSRkMxNDgzLzI2ODQgQnJpZGdlZCBwcm90b2NvbHMiCisJZGVwZW5kcyBvbiBBVE0gJiYgSU5FVAorCWhlbHAKKwkgIEFUTSBQVkNzIGNhbiBjYXJyeSBldGhlcm5ldCBQRFVzIGFjY29yZGluZyB0byByZmMyNjg0IChmb3JtZXJseSAxNDgzKQorCSAgVGhpcyBkZXZpY2Ugd2lsbCBhY3QgbGlrZSBhbiBldGhlcm5ldCBmcm9tIHRoZSBrZXJuZWxzIHBvaW50IG9mIHZpZXcsCisJICB3aXRoIHRoZSB0cmFmZmljIGJlaW5nIGNhcnJpZWQgYnkgQVRNIFBWQ3MgKGN1cnJlbnRseSAxIFBWQy9kZXZpY2UpLgorCSAgVGhpcyBpcyBzb21ldGltZXMgdXNlZCBvdmVyIERTTCBsaW5lcy4gIElmIGluIGRvdWJ0LCBzYXkgTi4KKworY29uZmlnIEFUTV9CUjI2ODRfSVBGSUxURVIKKwlib29sICJQZXItVkMgSVAgZmlsdGVyIGtsdWRnZSIKKwlkZXBlbmRzIG9uIEFUTV9CUjI2ODQKKwloZWxwCisJICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBtZWNoYW5pc20gZm9yIHVzZXJzIHdobyBuZWVkIHRvIHRlcm1pbmF0aW5nIGEKKwkgIGxhcmdlIG51bWJlciBvZiBJUC1vbmx5IHZjYydzLiAgRG8gbm90IGVuYWJsZSB0aGlzIHVubGVzcyB5b3UgYXJlIHN1cmUKKwkgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KZGlmZiAtLWdpdCBhL25ldC9hdG0vYnIyNjg0LmMgYi9uZXQvYXRtL2JyMjY4NC5jCmluZGV4IGU2OTU0Y2YuLjI4OTk1NmMgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYnIyNjg0LmMKKysrIGIvbmV0L2F0bS9icjI2ODQuYwpAQCAtMjg5LDggKzI4OSw3IEBACiAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gZXRoX3R5cGVfdHJhbnMsIHdoaWNoIGNhbm5vdCBiZSB1c2VkIGJlY2F1c2Ugb2YKICAqIG91ciBkZXYtPmhhcmRfaGVhZGVyX2xlbgogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGJyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIF9fYmUxNiBicl90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwppbmRleCAyZTM0MWRlLi45MDFlZmY3IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgY210cF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgdm9pZCBjbXRwX3Byb2Nlc3NfdHJhbnNtaXQoc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbnNrYjsKIAl1bnNpZ25lZCBjaGFyICpoZHI7CkBAIC0yMjMsNyArMjIzLDcgQEAKIAogCWlmICghKG5za2IgPSBhbGxvY19za2Ioc2Vzc2lvbi0+bXR1LCBHRlBfQVRPTUlDKSkpIHsKIAkJQlRfRVJSKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBmcmFtZSIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuOwogCX0KIAogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlc3Npb24tPnRyYW5zbWl0KSkpIHsKQEAgLTI3NSw4ICsyNzUsNiBAQAogCWNtdHBfc2VuZF9mcmFtZShzZXNzaW9uLCBuc2tiLT5kYXRhLCBuc2tiLT5sZW4pOwogCiAJa2ZyZWVfc2tiKG5za2IpOwotCi0JcmV0dXJuIHNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPnRyYW5zbWl0KTsKIH0KIAogc3RhdGljIGludCBjbXRwX3Nlc3Npb24odm9pZCAqYXJnKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKaW5kZXggYWZmYmM1NS4uZGU4YWY1ZiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCkBAIC00MjgsNyArNDI4LDcgQEAKIAlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOwogfQogCi1zdGF0aWMgaW50IGhpZHBfcHJvY2Vzc190cmFuc21pdChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIHZvaWQgaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtNDUzLDkgKzQ1Myw2IEBACiAJCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOwogCQlrZnJlZV9za2Ioc2tiKTsKIAl9Ci0KLQlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmc2Vzc2lvbi0+Y3RybF90cmFuc21pdCkgKwotCQkJCXNrYl9xdWV1ZV9sZW4oJnNlc3Npb24tPmludHJfdHJhbnNtaXQpOwogfQogCiBzdGF0aWMgaW50IGhpZHBfc2Vzc2lvbih2b2lkICphcmcpCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKaW5kZXggZjNmNjM1NS4uNjNhMTIzYyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwpAQCAtNTkwLDggKzU5MCwxMSBAQAogCWZvciAoOzspIHsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAotCQlpZiAoc2tiX3F1ZXVlX2xlbigmc2stPnNrX3JlY2VpdmVfcXVldWUpIHx8IHNrLT5za19lcnIgfHwgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgfHwKLQkJCQlzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fCAhdGltZW8pCisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwKKwkJICAgIHNrLT5za19lcnIgfHwKKwkJICAgIChzay0+c2tfc2h1dGRvd24gJiBSQ1ZfU0hVVERPV04pIHx8CisJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkgICAgIXRpbWVvKQogCQkJYnJlYWs7CiAKIAkJc2V0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwppbmRleCA2ZDY4OTIwLi42MzA0NTkwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYworKysgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwpAQCAtNzgxLDcgKzc4MSw3IEBACiAKIAlCVF9EQkcoInR0eSAlcCBkZXYgJXAiLCB0dHksIGRldik7CiAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmZGxjLT50eF9xdWV1ZSkpCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJmRsYy0+dHhfcXVldWUpKQogCQlyZXR1cm4gZGxjLT5tdHU7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvS2NvbmZpZyBiL25ldC9icmlkZ2UvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjIzZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L2JyaWRnZS9LY29uZmlnCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgODAyLjFkIEV0aGVybmV0IEJyaWRnaW5nCisjCisKK2NvbmZpZyBCUklER0UKKwl0cmlzdGF0ZSAiODAyLjFkIEV0aGVybmV0IEJyaWRnaW5nIgorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYW4KKwkgIEV0aGVybmV0IGJyaWRnZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgZGlmZmVyZW50IEV0aGVybmV0IHNlZ21lbnRzIGl0CisJICBpcyBjb25uZWN0ZWQgdG8gd2lsbCBhcHBlYXIgYXMgb25lIEV0aGVybmV0IHRvIHRoZSBwYXJ0aWNpcGFudHMuCisJICBTZXZlcmFsIHN1Y2ggYnJpZGdlcyBjYW4gd29yayB0b2dldGhlciB0byBjcmVhdGUgZXZlbiBsYXJnZXIKKwkgIG5ldHdvcmtzIG9mIEV0aGVybmV0cyB1c2luZyB0aGUgSUVFRSA4MDIuMSBzcGFubmluZyB0cmVlIGFsZ29yaXRobS4KKwkgIEFzIHRoaXMgaXMgYSBzdGFuZGFyZCwgTGludXggYnJpZGdlcyB3aWxsIGNvb3BlcmF0ZSBwcm9wZXJseSB3aXRoCisJICBvdGhlciB0aGlyZCBwYXJ0eSBicmlkZ2UgcHJvZHVjdHMuCisKKwkgIEluIG9yZGVyIHRvIHVzZSB0aGUgRXRoZXJuZXQgYnJpZGdlLCB5b3UnbGwgbmVlZCB0aGUgYnJpZGdlCisJICBjb25maWd1cmF0aW9uIHRvb2xzOyBzZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JyaWRnZS50eHQ+CisJICBmb3IgbG9jYXRpb24uIFBsZWFzZSByZWFkIHRoZSBCcmlkZ2UgbWluaS1IT1dUTyBmb3IgbW9yZQorCSAgaW5mb3JtYXRpb24uCisKKwkgIElmIHlvdSBlbmFibGUgaXB0YWJsZXMgc3VwcG9ydCBhbG9uZyB3aXRoIHRoZSBicmlkZ2Ugc3VwcG9ydCB0aGVuIHlvdQorCSAgdHVybiB5b3VyIGJyaWRnZSBpbnRvIGEgYnJpZGdpbmcgSVAgZmlyZXdhbGwuCisJICBpcHRhYmxlcyB3aWxsIHRoZW4gc2VlIHRoZSBJUCBwYWNrZXRzIGJlaW5nIGJyaWRnZWQsIHNvIHlvdSBuZWVkIHRvCisJICB0YWtlIHRoaXMgaW50byBhY2NvdW50IHdoZW4gc2V0dGluZyB1cCB5b3VyIGZpcmV3YWxsIHJ1bGVzLgorCSAgRW5hYmxpbmcgYXJwdGFibGVzIHN1cHBvcnQgd2hlbiBicmlkZ2luZyB3aWxsIGxldCBhcnB0YWJsZXMgc2VlCisJICBicmlkZ2VkIEFSUCB0cmFmZmljIGluIHRoZSBhcnB0YWJsZXMgRk9SV0FSRCBjaGFpbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGJyaWRnZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCmluZGV4IDAzYWU0ZWQuLjJkNTJmZWUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwpAQCAtODQ0LDcgKzg0NCw3IEBACiAJCSAqIGRvZXNuJ3QgdXNlIHRoZSBicmlkZ2UgcGFyZW50IG9mIHRoZSBpbmRldiBieSB1c2luZwogCQkgKiB0aGUgQlJORl9ET05UX1RBS0VfUEFSRU5UIG1hc2suICovCiAJCWlmIChob29rID09IE5GX0lQX0ZPUldBUkQgJiYgbmZfYnJpZGdlLT5waHlzaW5kZXYgPT0gTlVMTCkgewotCQkJbmZfYnJpZGdlLT5tYXNrICY9IEJSTkZfRE9OVF9UQUtFX1BBUkVOVDsKKwkJCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX0RPTlRfVEFLRV9QQVJFTlQ7CiAJCQluZl9icmlkZ2UtPnBoeXNpbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWluOwogCQl9CiAjaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggZTRhZTM0Yi4uNjYyOTc1YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtNjEsOCArNjEsNiBAQAogewogCXN0cnVjdCBlYnRfbG9nX2luZm8gKmluZm8gPSAoc3RydWN0IGVidF9sb2dfaW5mbyAqKWRhdGE7CiAJY2hhciBsZXZlbF9zdHJpbmdbNF0gPSAiPCA+IjsKLQl1bmlvbiB7c3RydWN0IGlwaGRyIGlwaDsgc3RydWN0IHRjcHVkcGhkciBwb3J0czsKLQkgICAgICAgc3RydWN0IGFycGhkciBhcnBoOyBzdHJ1Y3QgYXJwcGF5bG9hZCBhcnBwO30gdTsKIAogCWxldmVsX3N0cmluZ1sxXSA9ICcwJyArIGluZm8tPmxvZ2xldmVsOwogCXNwaW5fbG9ja19iaCgmZWJ0X2xvZ19sb2NrKTsKQEAgLTg4LDcgKzg2LDcgQEAKIAkJfQogCQlwcmludGsoIiBJUCBTUkM9JXUuJXUuJXUuJXUgSVAgRFNUPSV1LiV1LiV1LiV1LCIsCiAJCSAgIE5JUFFVQUQoaWgtPnNhZGRyKSwgTklQUVVBRChpaC0+ZGFkZHIpKTsKLQkJcHJpbnRrKCIgSVAgdG9zPTB4JTAyWCwgSVAgcHJvdG89JWQiLCB1LmlwaC50b3MsCisJCXByaW50aygiIElQIHRvcz0weCUwMlgsIElQIHByb3RvPSVkIiwgaWgtPnRvcywKIAkJICAgICAgIGloLT5wcm90b2NvbCk7CiAJCWlmIChpaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgfHwKIAkJICAgIGloLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgewpAQCAtMTI3LDcgKzEyNSw3IEBACiAJCSAgICBhaC0+YXJfcGxuID09IHNpemVvZih1aW50MzJfdCkpIHsKIAkJCXN0cnVjdCBhcnBwYXlsb2FkIF9hcnBwLCAqYXA7CiAKLQkJCWFwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2l6ZW9mKHUuYXJwaCksCisJCQlhcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNpemVvZihfYXJwaCksCiAJCQkJCQlzaXplb2YoX2FycHApLCAmX2FycHApOwogCQkJaWYgKGFwID09IE5VTEwpIHsKIAkJCQlwcmludGsoIiBJTkNPTVBMRVRFIEFSUCBwYXlsb2FkIik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IGFiOTM1NzcuLmZmOWRjMDIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0xMTUsMTggKzExNSw2IEBACiAjZW5kaWYJLyogQ09ORklHX05FVF9SQURJTyAqLwogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAKLS8qIFRoaXMgZGVmaW5lLCBpZiBzZXQsIHdpbGwgcmFuZG9tbHkgZHJvcCBhIHBhY2tldCB3aGVuIGNvbmdlc3Rpb24KLSAqIGlzIG1vcmUgdGhhbiBtb2RlcmF0ZS4gIEl0IGhlbHBzIGZhaXJuZXNzIGluIHRoZSBtdWx0aS1pbnRlcmZhY2UKLSAqIGNhc2Ugd2hlbiBvbmUgb2YgdGhlbSBpcyBhIGhvZywgYnV0IGl0IGtpbGxzIHBlcmZvcm1hbmNlIGZvciB0aGUKLSAqIHNpbmdsZSBpbnRlcmZhY2UgY2FzZSBzbyBpdCBpcyBvZmYgbm93IGJ5IGRlZmF1bHQuCi0gKi8KLSN1bmRlZiBSQU5EX0xJRQotCi0vKiBTZXR0aW5nIHRoaXMgd2lsbCBzYW1wbGUgdGhlIHF1ZXVlIGxlbmd0aHMgYW5kIHRodXMgY29uZ2VzdGlvbgotICogdmlhIGEgdGltZXIgaW5zdGVhZCBvZiBhcyBlYWNoIHBhY2tldCBpcyByZWNlaXZlZC4KLSAqLwotI3VuZGVmIE9GRkxJTkVfU0FNUExFCi0KIC8qCiAgKglUaGUgbGlzdCBvZiBwYWNrZXQgdHlwZXMgd2Ugd2lsbCByZWNlaXZlIChhcyBvcHBvc2VkIHRvIGRpc2NhcmQpCiAgKglhbmQgdGhlIHJvdXRpbmVzIHRvIGludm9rZS4KQEAgLTE1OSwxMSArMTQ3LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2Jhc2VbMTZdOwkvKiAxNiB3YXkgaGFzaGVkIGxpc3QgKi8KIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHB0eXBlX2FsbDsJCS8qIFRhcHMgKi8KIAotI2lmZGVmIE9GRkxJTkVfU0FNUExFCi1zdGF0aWMgdm9pZCBzYW1wbGVfcXVldWUodW5zaWduZWQgbG9uZyBkdW1teSk7Ci1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2FtcF90aW1lciA9IFRJTUVSX0lOSVRJQUxJWkVSKHNhbXBsZV9xdWV1ZSwgMCwgMCk7Ci0jZW5kaWYKLQogLyoKICAqIFRoZSBAZGV2X2Jhc2UgbGlzdCBpcyBwcm90ZWN0ZWQgYnkgQGRldl9iYXNlX2xvY2sgYW5kIHRoZSBydGxuCiAgKiBzZW1hcGhvcmUuCkBAIC0yMTUsNyArMTk4LDcgQEAKICAqCURldmljZSBkcml2ZXJzIGNhbGwgb3VyIHJvdXRpbmVzIHRvIHF1ZXVlIHBhY2tldHMgaGVyZS4gV2UgZW1wdHkgdGhlCiAgKglxdWV1ZSBpbiB0aGUgbG9jYWwgc29mdG5ldCBoYW5kbGVyLgogICovCi1ERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc29mdG5ldF9kYXRhLCBzb2Z0bmV0X2RhdGEpID0geyAwLCB9OworREVGSU5FX1BFUl9DUFUoc3RydWN0IHNvZnRuZXRfZGF0YSwgc29mdG5ldF9kYXRhKSA9IHsgTlVMTCB9OwogCiAjaWZkZWYgQ09ORklHX1NZU0ZTCiBleHRlcm4gaW50IG5ldGRldl9zeXNmc19pbml0KHZvaWQpOwpAQCAtMTE0NCw3ICsxMTI3LDcgQEAKIGV4dGVybiB2b2lkIHNrYl9yZWxlYXNlX2RhdGEoc3RydWN0IHNrX2J1ZmYgKik7CiAKIC8qIEtlZXAgaGVhZCB0aGUgc2FtZTogcmVwbGFjZSBkYXRhICovCi1pbnQgX19za2JfbGluZWFyaXplKHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnBfbWFzaykKK2ludCBfX3NrYl9saW5lYXJpemUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCXVuc2lnbmVkIGludCBzaXplOwogCXU4ICpkYXRhOwpAQCAtMTM2Myw3MSArMTM0NiwxMyBAQAogCQkJUmVjZWl2ZXIgcm91dGluZXMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi1pbnQgbmV0ZGV2X21heF9iYWNrbG9nID0gMzAwOworaW50IG5ldGRldl9tYXhfYmFja2xvZyA9IDEwMDA7CitpbnQgbmV0ZGV2X2J1ZGdldCA9IDMwMDsKIGludCB3ZWlnaHRfcCA9IDY0OyAgICAgICAgICAgIC8qIG9sZCBiYWNrbG9nIHdlaWdodCAqLwotLyogVGhlc2UgbnVtYmVycyBhcmUgc2VsZWN0ZWQgYmFzZWQgb24gaW50dWl0aW9uIGFuZCBzb21lCi0gKiBleHBlcmltZW50YXRpb20sIGlmIHlvdSBoYXZlIG1vcmUgc2NpZW50aWZpYyB3YXkgb2YgZG9pbmcgdGhpcwotICogcGxlYXNlIGdvIGFoZWFkIGFuZCBmaXggdGhpbmdzLgotICovCi1pbnQgbm9fY29uZ190aHJlc2ggPSAxMDsKLWludCBub19jb25nID0gMjA7Ci1pbnQgbG9fY29uZyA9IDEwMDsKLWludCBtb2RfY29uZyA9IDI5MDsKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG5ldGlmX3J4X3N0YXRzLCBuZXRkZXZfcnhfc3RhdCkgPSB7IDAsIH07CiAKIAotc3RhdGljIHZvaWQgZ2V0X3NhbXBsZV9zdGF0cyhpbnQgY3B1KQotewotI2lmZGVmIFJBTkRfTElFCi0JdW5zaWduZWQgbG9uZyByZDsKLQlpbnQgcnE7Ci0jZW5kaWYKLQlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpzZCA9ICZwZXJfY3B1KHNvZnRuZXRfZGF0YSwgY3B1KTsKLQlpbnQgYmxvZyA9IHNkLT5pbnB1dF9wa3RfcXVldWUucWxlbjsKLQlpbnQgYXZnX2Jsb2cgPSBzZC0+YXZnX2Jsb2c7Ci0KLQlhdmdfYmxvZyA9IChhdmdfYmxvZyA+PiAxKSArIChibG9nID4+IDEpOwotCi0JaWYgKGF2Z19ibG9nID4gbW9kX2NvbmcpIHsKLQkJLyogQWJvdmUgbW9kZXJhdGUgY29uZ2VzdGlvbiBsZXZlbHMuICovCi0JCXNkLT5jbmdfbGV2ZWwgPSBORVRfUlhfQ05fSElHSDsKLSNpZmRlZiBSQU5EX0xJRQotCQlyZCA9IG5ldF9yYW5kb20oKTsKLQkJcnEgPSByZCAlIG5ldGRldl9tYXhfYmFja2xvZzsKLQkJaWYgKHJxIDwgYXZnX2Jsb2cpIC8qIHVubHVja3kgYmFzdGFyZCAqLwotCQkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9EUk9QOwotI2VuZGlmCi0JfSBlbHNlIGlmIChhdmdfYmxvZyA+IGxvX2NvbmcpIHsKLQkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9DTl9NT0Q7Ci0jaWZkZWYgUkFORF9MSUUKLQkJcmQgPSBuZXRfcmFuZG9tKCk7Ci0JCXJxID0gcmQgJSBuZXRkZXZfbWF4X2JhY2tsb2c7Ci0JCQlpZiAocnEgPCBhdmdfYmxvZykgLyogdW5sdWNreSBiYXN0YXJkICovCi0JCQkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9DTl9ISUdIOwotI2VuZGlmCi0JfSBlbHNlIGlmIChhdmdfYmxvZyA+IG5vX2NvbmcpCi0JCXNkLT5jbmdfbGV2ZWwgPSBORVRfUlhfQ05fTE9XOwotCWVsc2UgIC8qIG5vIGNvbmdlc3Rpb24gKi8KLQkJc2QtPmNuZ19sZXZlbCA9IE5FVF9SWF9TVUNDRVNTOwotCi0Jc2QtPmF2Z19ibG9nID0gYXZnX2Jsb2c7Ci19Ci0KLSNpZmRlZiBPRkZMSU5FX1NBTVBMRQotc3RhdGljIHZvaWQgc2FtcGxlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCi17Ci0vKiAxMCBtcyAwciAxbXMgLS0gaSBkb24ndCBjYXJlIC0tIEpIUyAqLwotCWludCBuZXh0X3RpY2sgPSAxOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQlnZXRfc2FtcGxlX3N0YXRzKGNwdSk7Ci0JbmV4dF90aWNrICs9IGppZmZpZXM7Ci0JbW9kX3RpbWVyKCZzYW1wX3RpbWVyLCBuZXh0X3RpY2spOwotfQotI2VuZGlmCi0KLQogLyoqCiAgKgluZXRpZl9yeAktCXBvc3QgYnVmZmVyIHRvIHRoZSBuZXR3b3JrIGNvZGUKICAqCUBza2I6IGJ1ZmZlciB0byBwb3N0CkBAIC0xNDQ4LDcgKzEzNzMsNiBAQAogCiBpbnQgbmV0aWZfcngoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgdGhpc19jcHU7CiAJc3RydWN0IHNvZnRuZXRfZGF0YSAqcXVldWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTQ2NCwzOCArMTM4OCwyMiBAQAogCSAqIHNob3J0IHdoZW4gQ1BVIGlzIGNvbmdlc3RlZCwgYnV0IGlzIHN0aWxsIG9wZXJhdGluZy4KIAkgKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJcXVldWUgPSAmX19nZXRfY3B1X3Zhcihzb2Z0bmV0X2RhdGEpOwogCiAJX19nZXRfY3B1X3ZhcihuZXRkZXZfcnhfc3RhdCkudG90YWwrKzsKIAlpZiAocXVldWUtPmlucHV0X3BrdF9xdWV1ZS5xbGVuIDw9IG5ldGRldl9tYXhfYmFja2xvZykgewogCQlpZiAocXVldWUtPmlucHV0X3BrdF9xdWV1ZS5xbGVuKSB7Ci0JCQlpZiAocXVldWUtPnRocm90dGxlKQotCQkJCWdvdG8gZHJvcDsKLQogZW5xdWV1ZToKIAkJCWRldl9ob2xkKHNrYi0+ZGV2KTsKIAkJCV9fc2tiX3F1ZXVlX3RhaWwoJnF1ZXVlLT5pbnB1dF9wa3RfcXVldWUsIHNrYik7Ci0jaWZuZGVmIE9GRkxJTkVfU0FNUExFCi0JCQlnZXRfc2FtcGxlX3N0YXRzKHRoaXNfY3B1KTsKLSNlbmRpZgogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJcmV0dXJuIHF1ZXVlLT5jbmdfbGV2ZWw7CisJCQlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CiAJCX0KIAotCQlpZiAocXVldWUtPnRocm90dGxlKQotCQkJcXVldWUtPnRocm90dGxlID0gMDsKLQogCQluZXRpZl9yeF9zY2hlZHVsZSgmcXVldWUtPmJhY2tsb2dfZGV2KTsKIAkJZ290byBlbnF1ZXVlOwogCX0KIAotCWlmICghcXVldWUtPnRocm90dGxlKSB7Ci0JCXF1ZXVlLT50aHJvdHRsZSA9IDE7Ci0JCV9fZ2V0X2NwdV92YXIobmV0ZGV2X3J4X3N0YXQpLnRocm90dGxlZCsrOwotCX0KLQotZHJvcDoKIAlfX2dldF9jcHVfdmFyKG5ldGRldl9yeF9zdGF0KS5kcm9wcGVkKys7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC0xNzgwLDggKzE2ODgsNiBAQAogCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOwogCW5ldGlmX3BvbGxfZW5hYmxlKGJhY2tsb2dfZGV2KTsKIAotCWlmIChxdWV1ZS0+dGhyb3R0bGUpCi0JCXF1ZXVlLT50aHJvdHRsZSA9IDA7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCXJldHVybiAwOwogfQpAQCAtMTc5MCw4ICsxNjk2LDcgQEAKIHsKIAlzdHJ1Y3Qgc29mdG5ldF9kYXRhICpxdWV1ZSA9ICZfX2dldF9jcHVfdmFyKHNvZnRuZXRfZGF0YSk7CiAJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQlpbnQgYnVkZ2V0ID0gbmV0ZGV2X21heF9iYWNrbG9nOwotCisJaW50IGJ1ZGdldCA9IG5ldGRldl9idWRnZXQ7CiAJCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIApAQCAtMjA1NSwxNSArMTk2MCw5IEBACiAJc3RydWN0IG5ldGlmX3J4X3N0YXRzICpzID0gdjsKIAogCXNlcV9wcmludGYoc2VxLCAiJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCSAgIHMtPnRvdGFsLCBzLT5kcm9wcGVkLCBzLT50aW1lX3NxdWVlemUsIHMtPnRocm90dGxlZCwKLQkJICAgcy0+ZmFzdHJvdXRlX2hpdCwgcy0+ZmFzdHJvdXRlX3N1Y2Nlc3MsIHMtPmZhc3Ryb3V0ZV9kZWZlciwKLQkJICAgcy0+ZmFzdHJvdXRlX2RlZmVycmVkX291dCwKLSNpZiAwCi0JCSAgIHMtPmZhc3Ryb3V0ZV9sYXRlbmN5X3JlZHVjdGlvbgotI2Vsc2UKLQkJICAgcy0+Y3B1X2NvbGxpc2lvbgotI2VuZGlmCi0JCSAgKTsKKwkJICAgcy0+dG90YWwsIHMtPmRyb3BwZWQsIHMtPnRpbWVfc3F1ZWV6ZSwgMCwKKwkJICAgMCwgMCwgMCwgMCwgLyogd2FzIGZhc3Ryb3V0ZSAqLworCQkgICBzLT5jcHVfY29sbGlzaW9uICk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOTAsMTAgKzIwODksMTEgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOwogCi0JZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKIAlpZiAoKGRldi0+cHJvbWlzY3VpdHkgKz0gaW5jKSA9PSAwKQogCQlkZXYtPmZsYWdzICY9IH5JRkZfUFJPTUlTQzsKLQlpZiAoZGV2LT5mbGFncyBeIG9sZF9mbGFncykgeworCWVsc2UKKwkJZGV2LT5mbGFncyB8PSBJRkZfUFJPTUlTQzsKKwlpZiAoZGV2LT5mbGFncyAhPSBvbGRfZmxhZ3MpIHsKIAkJZGV2X21jX3VwbG9hZChkZXYpOwogCQlwcmludGsoS0VSTl9JTkZPICJkZXZpY2UgJXMgJXMgcHJvbWlzY3VvdXMgbW9kZVxuIiwKIAkJICAgICAgIGRldi0+bmFtZSwgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAiZW50ZXJlZCIgOgpAQCAtMzMwNSw5ICszMjA1LDYgQEAKIAogCQlxdWV1ZSA9ICZwZXJfY3B1KHNvZnRuZXRfZGF0YSwgaSk7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlLT5pbnB1dF9wa3RfcXVldWUpOwotCQlxdWV1ZS0+dGhyb3R0bGUgPSAwOwotCQlxdWV1ZS0+Y25nX2xldmVsID0gMDsKLQkJcXVldWUtPmF2Z19ibG9nID0gMTA7IC8qIGFyYml0cmFyeSBub24temVybyAqLwogCQlxdWV1ZS0+Y29tcGxldGlvbl9xdWV1ZSA9IE5VTEw7CiAJCUlOSVRfTElTVF9IRUFEKCZxdWV1ZS0+cG9sbF9saXN0KTsKIAkJc2V0X2JpdChfX0xJTktfU1RBVEVfU1RBUlQsICZxdWV1ZS0+YmFja2xvZ19kZXYuc3RhdGUpOwpAQCAtMzMxNiwxMSArMzIxMyw2IEBACiAJCWF0b21pY19zZXQoJnF1ZXVlLT5iYWNrbG9nX2Rldi5yZWZjbnQsIDEpOwogCX0KIAotI2lmZGVmIE9GRkxJTkVfU0FNUExFCi0Jc2FtcF90aW1lci5leHBpcmVzID0gamlmZmllcyArICgxMCAqIEhaKTsKLQlhZGRfdGltZXIoJnNhbXBfdGltZXIpOwotI2VuZGlmCi0KIAlkZXZfYm9vdF9waGFzZSA9IDA7CiAKIAlvcGVuX3NvZnRpcnEoTkVUX1RYX1NPRlRJUlEsIG5ldF90eF9hY3Rpb24sIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmlsdGVyLmMgYi9uZXQvY29yZS9maWx0ZXIuYwppbmRleCBmM2I4ODIwLi5jZDkxYTI0IDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWx0ZXIuYworKysgYi9uZXQvY29yZS9maWx0ZXIuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogCiAvKiBObyBodXJyeSBpbiB0aGlzIGJyYW5jaCAqLwotc3RhdGljIHU4ICpsb2FkX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGspCitzdGF0aWMgdm9pZCAqX19sb2FkX3BvaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGspCiB7CiAJdTggKnB0ciA9IE5VTEw7CiAKQEAgLTUwLDYgKzUwLDE4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbG9hZF9wb2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIGludCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKmJ1ZmZlcikKK3sKKwlpZiAoayA+PSAwKQorCQlyZXR1cm4gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaywgc2l6ZSwgYnVmZmVyKTsKKwllbHNlIHsKKwkJaWYgKGsgPj0gU0tGX0FEX09GRikKKwkJCXJldHVybiBOVUxMOworCQlyZXR1cm4gX19sb2FkX3BvaW50ZXIoc2tiLCBrKTsKKwl9Cit9CisKIC8qKgogICoJc2tfcnVuX2ZpbHRlcgktIAlydW4gYSBmaWx0ZXIgb24gYSBzb2NrZXQKICAqCUBza2I6IGJ1ZmZlciB0byBydW4gdGhlIGZpbHRlciBvbgpAQCAtNjQsMTUgKzc2LDEyIEBACiAgCiBpbnQgc2tfcnVuX2ZpbHRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29ja19maWx0ZXIgKmZpbHRlciwgaW50IGZsZW4pCiB7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHNrYi0+ZGF0YTsKLQkvKiBsZW4gaXMgVU5TSUdORUQuIEJ5dGUgd2lkZSBpbnNucyByZWxpZXMgb25seSBvbiBpbXBsaWNpdAotCSAgIHR5cGUgY2FzdHMgdG8gcHJldmVudCByZWFkaW5nIGFyYml0cmFyeSBtZW1vcnkgbG9jYXRpb25zLgotCSAqLwotCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbi1za2ItPmRhdGFfbGVuOwogCXN0cnVjdCBzb2NrX2ZpbHRlciAqZmVudHJ5OwkvKiBXZSB3YWxrIGRvd24gdGhlc2UgKi8KKwl2b2lkICpwdHI7CiAJdTMyIEEgPSAwOwkgICAJCS8qIEFjY3VtdWxhdG9yICovCiAJdTMyIFggPSAwOyAgIAkJCS8qIEluZGV4IFJlZ2lzdGVyICovCiAJdTMyIG1lbVtCUEZfTUVNV09SRFNdOwkJLyogU2NyYXRjaCBNZW1vcnkgU3RvcmUgKi8KKwl1MzIgdG1wOwogCWludCBrOwogCWludCBwYzsKIApAQCAtMTY4LDg2ICsxNzcsMzUgQEAKIAkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0FCUzoKIAkJCWsgPSBmZW50cnktPms7CiAgbG9hZF93OgotCQkJaWYgKGsgPj0gMCAmJiAodW5zaWduZWQgaW50KShrK3NpemVvZih1MzIpKSA8PSBsZW4pIHsKLQkJCQlBID0gbnRvaGwoKih1MzIqKSZkYXRhW2tdKTsKKwkJCXB0ciA9IGxvYWRfcG9pbnRlcihza2IsIGssIDQsICZ0bXApOworCQkJaWYgKHB0ciAhPSBOVUxMKSB7CisJCQkJQSA9IG50b2hsKCoodTMyICopcHRyKTsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChrIDwgMCkgewotCQkJCXU4ICpwdHI7Ci0KLQkJCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQotCQkJCQlicmVhazsKLQkJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrKTsKLQkJCQlpZiAocHRyKSB7Ci0JCQkJCUEgPSBudG9obCgqKHUzMiopcHRyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl1MzIgX3RtcCwgKnA7Ci0JCQkJcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGssIDQsICZfdG1wKTsKLQkJCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJCUEgPSBudG9obCgqcCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KIAkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfSHxCUEZfQUJTOgogCQkJayA9IGZlbnRyeS0+azsKICBsb2FkX2g6Ci0JCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpKGsgKyBzaXplb2YodTE2KSkgPD0gbGVuKSB7Ci0JCQkJQSA9IG50b2hzKCoodTE2KikmZGF0YVtrXSk7CisJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrLCAyLCAmdG1wKTsKKwkJCWlmIChwdHIgIT0gTlVMTCkgeworCQkJCUEgPSBudG9ocygqKHUxNiAqKXB0cik7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAoayA8IDApIHsKLQkJCQl1OCAqcHRyOwotCi0JCQkJaWYgKGsgPj0gU0tGX0FEX09GRikKLQkJCQkJYnJlYWs7Ci0JCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgayk7Ci0JCQkJaWYgKHB0cikgewotCQkJCQlBID0gbnRvaHMoKih1MTYqKXB0cik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdTE2IF90bXAsICpwOwotCQkJCXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCAyLCAmX3RtcCk7Ci0JCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCQlBID0gbnRvaHMoKnApOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9CiAJCQlyZXR1cm4gMDsKIAkJY2FzZSBCUEZfTER8QlBGX0J8QlBGX0FCUzoKIAkJCWsgPSBmZW50cnktPms7CiBsb2FkX2I6Ci0JCQlpZiAoayA+PSAwICYmICh1bnNpZ25lZCBpbnQpayA8IGxlbikgewotCQkJCUEgPSBkYXRhW2tdOworCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgaywgMSwgJnRtcCk7CisJCQlpZiAocHRyICE9IE5VTEwpIHsKKwkJCQlBID0gKih1OCAqKXB0cjsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWlmIChrIDwgMCkgewotCQkJCXU4ICpwdHI7Ci0KLQkJCQlpZiAoayA+PSBTS0ZfQURfT0ZGKQotCQkJCQlicmVhazsKLQkJCQlwdHIgPSBsb2FkX3BvaW50ZXIoc2tiLCBrKTsKLQkJCQlpZiAocHRyKSB7Ci0JCQkJCUEgPSAqcHRyOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXU4IF90bXAsICpwOwotCQkJCXAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBrLCAxLCAmX3RtcCk7Ci0JCQkJaWYgKHAgIT0gTlVMTCkgewotCQkJCQlBID0gKnA7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KIAkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfTEVOOgotCQkJQSA9IGxlbjsKKwkJCUEgPSBza2ItPmxlbjsKIAkJCWNvbnRpbnVlOwogCQljYXNlIEJQRl9MRFh8QlBGX1d8QlBGX0xFTjoKLQkJCVggPSBsZW47CisJCQlYID0gc2tiLT5sZW47CiAJCQljb250aW51ZTsKIAkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0lORDoKIAkJCWsgPSBYICsgZmVudHJ5LT5rOwpAQCAtMjU5LDEwICsyMTcsMTIgQEAKIAkJCWsgPSBYICsgZmVudHJ5LT5rOwogCQkJZ290byBsb2FkX2I7CiAJCWNhc2UgQlBGX0xEWHxCUEZfQnxCUEZfTVNIOgotCQkJaWYgKGZlbnRyeS0+ayA+PSBsZW4pCi0JCQkJcmV0dXJuIDA7Ci0JCQlYID0gKGRhdGFbZmVudHJ5LT5rXSAmIDB4ZikgPDwgMjsKLQkJCWNvbnRpbnVlOworCQkJcHRyID0gbG9hZF9wb2ludGVyKHNrYiwgZmVudHJ5LT5rLCAxLCAmdG1wKTsKKwkJCWlmIChwdHIgIT0gTlVMTCkgeworCQkJCVggPSAoKih1OCAqKXB0ciAmIDB4ZikgPDwgMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAwOwogCQljYXNlIEJQRl9MRHxCUEZfSU1NOgogCQkJQSA9IGZlbnRyeS0+azsKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwppbmRleCA4NTFlYjkyLi4xYmViNzgyIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtMTU5OCw2ICsxNTk4LDggQEAKIAogCXJlYWRfbG9ja19iaCgmdGJsLT5sb2NrKTsKIAluZHRtc2ctPm5kdG1fZmFtaWx5ID0gdGJsLT5mYW1pbHk7CisJbmR0bXNnLT5uZHRtX3BhZDEgICA9IDA7CisJbmR0bXNnLT5uZHRtX3BhZDIgICA9IDA7CiAKIAlSVEFfUFVUX1NUUklORyhza2IsIE5EVEFfTkFNRSwgdGJsLT5pZCk7CiAJUlRBX1BVVF9NU0VDUyhza2IsIE5EVEFfR0NfSU5URVJWQUwsIHRibC0+Z2NfaW50ZXJ2YWwpOwpAQCAtMTY4Myw2ICsxNjg1LDggQEAKIAogCXJlYWRfbG9ja19iaCgmdGJsLT5sb2NrKTsKIAluZHRtc2ctPm5kdG1fZmFtaWx5ID0gdGJsLT5mYW1pbHk7CisJbmR0bXNnLT5uZHRtX3BhZDEgICA9IDA7CisJbmR0bXNnLT5uZHRtX3BhZDIgICA9IDA7CiAJUlRBX1BVVF9TVFJJTkcoc2tiLCBORFRBX05BTUUsIHRibC0+aWQpOwogCiAJaWYgKG5laWdodGJsX2ZpbGxfcGFybXMoc2tiLCBwYXJtcykgPCAwKQpAQCAtMTg3Miw2ICsxODc2LDggQEAKIAlzdHJ1Y3QgbmRtc2cgKm5kbSA9IE5MTVNHX0RBVEEobmxoKTsKIAogCW5kbS0+bmRtX2ZhbWlseQkgPSBuLT5vcHMtPmZhbWlseTsKKwluZG0tPm5kbV9wYWQxICAgID0gMDsKKwluZG0tPm5kbV9wYWQyICAgID0gMDsKIAluZG0tPm5kbV9mbGFncwkgPSBuLT5mbGFnczsKIAluZG0tPm5kbV90eXBlCSA9IG4tPnR5cGU7CiAJbmRtLT5uZG1faWZpbmRleCA9IG4tPmRldi0+aWZpbmRleDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggYzU3YjA2Yi4uOTc1ZDY1MSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1leC5oPgogCiAKLSNkZWZpbmUgVkVSU0lPTiAgInBrdGdlbiB2Mi42MTogUGFja2V0IEdlbmVyYXRvciBmb3IgcGFja2V0IHBlcmZvcm1hbmNlIHRlc3RpbmcuXG4iCisjZGVmaW5lIFZFUlNJT04gICJwa3RnZW4gdjIuNjI6IFBhY2tldCBHZW5lcmF0b3IgZm9yIHBhY2tldCBwZXJmb3JtYW5jZSB0ZXN0aW5nLlxuIgogCiAvKiAjZGVmaW5lIFBHX0RFQlVHKGEpIGEgKi8KICNkZWZpbmUgUEdfREVCVUcoYSkgCkBAIC0xOTIxLDYgKzE5MjEsMTEgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaDsKICAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7CiAgICAgICAgIAorCS8qIFVwZGF0ZSBhbnkgb2YgdGhlIHZhbHVlcywgdXNlZCB3aGVuIHdlJ3JlIGluY3JlbWVudGluZyB2YXJpb3VzCisJICogZmllbGRzLgorCSAqLworCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKKwogCXNrYiA9IGFsbG9jX3NrYihwa3RfZGV2LT5jdXJfcGt0X3NpemUgKyA2NCArIDE2LCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewogCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOwpAQCAtMTkzNCwxMSArMTkzOSw2IEBACiAJaXBoID0gKHN0cnVjdCBpcGhkciAqKXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKLSAgICAgICAgLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKLSAgICAgICAgICogZmllbGRzLgotICAgICAgICAgKi8KLSAgICAgICAgbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOwotCiAJbWVtY3B5KGV0aCwgcGt0X2Rldi0+aGgsIDEyKTsKIAkqKHUxNiopJmV0aFsxMl0gPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTsKIApAQCAtMjE5Miw3ICsyMTkyLDEyIEBACiAJaW50IGRhdGFsZW47CiAJc3RydWN0IGlwdjZoZHIgKmlwaDsKICAgICAgICAgc3RydWN0IHBrdGdlbl9oZHIgKnBnaCA9IE5VTEw7Ci0gICAgICAgIAorCisJLyogVXBkYXRlIGFueSBvZiB0aGUgdmFsdWVzLCB1c2VkIHdoZW4gd2UncmUgaW5jcmVtZW50aW5nIHZhcmlvdXMKKwkgKiBmaWVsZHMuCisJICovCisJbW9kX2N1cl9oZWFkZXJzKHBrdF9kZXYpOworCiAJc2tiID0gYWxsb2Nfc2tiKHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgMTYsIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKSB7CiAJCXNwcmludGYocGt0X2Rldi0+cmVzdWx0LCAiTm8gbWVtb3J5Iik7CkBAIC0yMjA2LDE3ICsyMjExLDkgQEAKIAlpcGggPSAoc3RydWN0IGlwdjZoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAJdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CiAKLQotICAgICAgICAvKiBVcGRhdGUgYW55IG9mIHRoZSB2YWx1ZXMsIHVzZWQgd2hlbiB3ZSdyZSBpbmNyZW1lbnRpbmcgdmFyaW91cwotICAgICAgICAgKiBmaWVsZHMuCi0gICAgICAgICAqLwotCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKLQotCQogCW1lbWNweShldGgsIHBrdF9kZXYtPmhoLCAxMik7CiAJKih1MTYqKSZldGhbMTJdID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTsKLQkKLSAgICAgICAgCisKIAlkYXRhbGVuID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplLTE0LSAKIAkJc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKS1zaXplb2Yoc3RydWN0IHVkcGhkcik7IC8qIEV0aCArIElQaCArIFVEUGggKi8KIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwppbmRleCBlMDEzZDgzLi40YjFiYjMwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ydG5ldGxpbmsuYworKysgYi9uZXQvY29yZS9ydG5ldGxpbmsuYwpAQCAtMTI2LDYgKzEyNiw3IEBACiAJcnRhLT5ydGFfdHlwZSA9IGF0dHJ0eXBlOwogCXJ0YS0+cnRhX2xlbiA9IHNpemU7CiAJbWVtY3B5KFJUQV9EQVRBKHJ0YSksIGRhdGEsIGF0dHJsZW4pOworCW1lbXNldChSVEFfREFUQShydGEpICsgYXR0cmxlbiwgMCwgUlRBX0FMSUdOKHNpemUpIC0gc2l6ZSk7CiB9CiAKIHNpemVfdCBydGF0dHJfc3RybGNweShjaGFyICpkZXN0LCBjb25zdCBzdHJ1Y3QgcnRhdHRyICpydGEsIHNpemVfdCBzaXplKQpAQCAtMTg4LDYgKzE4OSw3IEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIHR5cGUsIHNpemVvZigqciksIGZsYWdzKTsKIAlyID0gTkxNU0dfREFUQShubGgpOwogCXItPmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJci0+X19pZmlfcGFkID0gMDsKIAlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKIAlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAJci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCA2ZDY4YzAzLi5kOWY3YjA2IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgKglCdWZmZXJzIG1heSBvbmx5IGJlIGFsbG9jYXRlZCBmcm9tIGludGVycnVwdHMgdXNpbmcgYSBAZ2ZwX21hc2sgb2YKICAqCSVHRlBfQVRPTUlDLgogICovCi1zdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZ2ZwX21hc2spCitzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1OCAqZGF0YTsKQEAgLTE4Miw3ICsxODIsOCBAQAogICoJJUdGUF9BVE9NSUMuCiAgKi8KIHN0cnVjdCBza19idWZmICphbGxvY19za2JfZnJvbV9jYWNoZShrbWVtX2NhY2hlX3QgKmNwLAotCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIGludCBnZnBfbWFzaykKKwkJCQkgICAgIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTggKmRhdGE7CkBAIC0zMjIsNyArMzIzLDcgQEAKICAqCSVHRlBfQVRPTUlDLgogICovCiAKLXN0cnVjdCBza19idWZmICpza2JfY2xvbmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKQorc3RydWN0IHNrX2J1ZmYgKnNrYl9jbG9uZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm4gPSBrbWVtX2NhY2hlX2FsbG9jKHNrYnVmZl9oZWFkX2NhY2hlLCBnZnBfbWFzayk7CiAKQEAgLTM1Nyw3ICszNTgsNiBAQAogCUMoaXBfc3VtbWVkKTsKIAlDKHByaW9yaXR5KTsKIAlDKHByb3RvY29sKTsKLQlDKHNlY3VyaXR5KTsKIAluLT5kZXN0cnVjdG9yID0gTlVMTDsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJQyhuZm1hcmspOwpAQCAtNDIyLDcgKzQyMiw2IEBACiAJbmV3LT5wa3RfdHlwZQk9IG9sZC0+cGt0X3R5cGU7CiAJbmV3LT5zdGFtcAk9IG9sZC0+c3RhbXA7CiAJbmV3LT5kZXN0cnVjdG9yID0gTlVMTDsKLQluZXctPnNlY3VyaXR5CT0gb2xkLT5zZWN1cml0eTsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJbmV3LT5uZm1hcmsJPSBvbGQtPm5mbWFyazsKIAluZXctPm5mY2FjaGUJPSBvbGQtPm5mY2FjaGU7CkBAIC00NjIsNyArNDYxLDcgQEAKICAqCWhlYWRlciBpcyBnb2luZyB0byBiZSBtb2RpZmllZC4gVXNlIHBza2JfY29weSgpIGluc3RlYWQuCiAgKi8KIAotc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBnZnBfbWFzaykKK3N0cnVjdCBza19idWZmICpza2JfY29weShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJaW50IGhlYWRlcmxlbiA9IHNrYi0+ZGF0YSAtIHNrYi0+aGVhZDsKIAkvKgpAQCAtNTAxLDcgKzUwMCw3IEBACiAgKglUaGUgcmV0dXJuZWQgYnVmZmVyIGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgogICovCiAKLXN0cnVjdCBza19idWZmICpwc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGdmcF9tYXNrKQorc3RydWN0IHNrX2J1ZmYgKnBza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJLyoKIAkgKglBbGxvY2F0ZSB0aGUgY29weSBidWZmZXIKQEAgLTU1OSw3ICs1NTgsOCBAQAogICoJcmVsb2FkZWQgYWZ0ZXIgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgogICovCiAKLWludCBwc2tiX2V4cGFuZF9oZWFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBuaGVhZCwgaW50IG50YWlsLCBpbnQgZ2ZwX21hc2spCitpbnQgcHNrYl9leHBhbmRfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmhlYWQsIGludCBudGFpbCwKKwkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCiB7CiAJaW50IGk7CiAJdTggKmRhdGE7CkBAIC02NDksNyArNjQ5LDggQEAKICAqCW9ubHkgYnkgbmV0ZmlsdGVyIGluIHRoZSBjYXNlcyB3aGVuIGNoZWNrc3VtIGlzIHJlY2FsY3VsYXRlZD8gLS1BTksKICAqLwogc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5X2V4cGFuZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCWludCBuZXdoZWFkcm9vbSwgaW50IG5ld3RhaWxyb29tLCBpbnQgZ2ZwX21hc2spCisJCQkJaW50IG5ld2hlYWRyb29tLCBpbnQgbmV3dGFpbHJvb20sCisJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcF9tYXNrKQogewogCS8qCiAJICoJQWxsb2NhdGUgdGhlIGNvcHkgYnVmZmVyCkBAIC0xNTAwLDYgKzE1MDEsMTU5IEBACiAJCXNrYl9zcGxpdF9ub19oZWFkZXIoc2tiLCBza2IxLCBsZW4sIHBvcyk7CiB9CiAKKy8qKgorICogc2tiX3ByZXBhcmVfc2VxX3JlYWQgLSBQcmVwYXJlIGEgc2VxdWVudGlhbCByZWFkIG9mIHNrYiBkYXRhCisgKiBAc2tiOiB0aGUgYnVmZmVyIHRvIHJlYWQKKyAqIEBmcm9tOiBsb3dlciBvZmZzZXQgb2YgZGF0YSB0byBiZSByZWFkCisgKiBAdG86IHVwcGVyIG9mZnNldCBvZiBkYXRhIHRvIGJlIHJlYWQKKyAqIEBzdDogc3RhdGUgdmFyaWFibGUKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgc3BlY2lmaWVkIHN0YXRlIHZhcmlhYmxlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAqIGludm9raW5nIHNrYl9zZXFfcmVhZCgpIGZvciB0aGUgZmlyc3QgdGltZS4KKyAqLwordm9pZCBza2JfcHJlcGFyZV9zZXFfcmVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZnJvbSwKKwkJCSAgdW5zaWduZWQgaW50IHRvLCBzdHJ1Y3Qgc2tiX3NlcV9zdGF0ZSAqc3QpCit7CisJc3QtPmxvd2VyX29mZnNldCA9IGZyb207CisJc3QtPnVwcGVyX29mZnNldCA9IHRvOworCXN0LT5yb290X3NrYiA9IHN0LT5jdXJfc2tiID0gc2tiOworCXN0LT5mcmFnX2lkeCA9IHN0LT5zdGVwcGVkX29mZnNldCA9IDA7CisJc3QtPmZyYWdfZGF0YSA9IE5VTEw7Cit9CisKKy8qKgorICogc2tiX3NlcV9yZWFkIC0gU2VxdWVudGlhbGx5IHJlYWQgc2tiIGRhdGEKKyAqIEBjb25zdW1lZDogbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBjYWxsZXIgc28gZmFyCisgKiBAZGF0YTogZGVzdGluYXRpb24gcG9pbnRlciBmb3IgZGF0YSB0byBiZSByZXR1cm5lZAorICogQHN0OiBzdGF0ZSB2YXJpYWJsZQorICoKKyAqIFJlYWRzIGEgYmxvY2sgb2Ygc2tiIGRhdGEgYXQgJmNvbnN1bWVkIHJlbGF0aXZlIHRvIHRoZQorICogbG93ZXIgb2Zmc2V0IHNwZWNpZmllZCB0byBza2JfcHJlcGFyZV9zZXFfcmVhZCgpLiBBc3NpZ25zCisgKiB0aGUgaGVhZCBvZiB0aGUgZGF0YSBibG9jayB0byAmZGF0YSBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoCisgKiBvZiB0aGUgYmxvY2sgb3IgMCBpZiB0aGUgZW5kIG9mIHRoZSBza2IgZGF0YSBvciB0aGUgdXBwZXIKKyAqIG9mZnNldCBoYXMgYmVlbiByZWFjaGVkLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgbm90IHJlcXVpcmVkIHRvIGNvbnN1bWUgYWxsIG9mIHRoZSBkYXRhCisgKiByZXR1cm5lZCwgaS5lLiAmY29uc3VtZWQgaXMgdHlwaWNhbGx5IHNldCB0byB0aGUgbnVtYmVyCisgKiBvZiBieXRlcyBhbHJlYWR5IGNvbnN1bWVkIGFuZCB0aGUgbmV4dCBjYWxsIHRvCisgKiBza2Jfc2VxX3JlYWQoKSB3aWxsIHJldHVybiB0aGUgcmVtYWluaW5nIHBhcnQgb2YgdGhlIGJsb2NrLgorICoKKyAqIE5vdGU6IFRoZSBzaXplIG9mIGVhY2ggYmxvY2sgb2YgZGF0YSByZXR1cm5lZCBjYW4gYmUgYXJiaXRhcnksCisgKiAgICAgICB0aGlzIGxpbWl0YXRpb24gaXMgdGhlIGNvc3QgZm9yIHplcm9jb3B5IHNlcWV1ZW50YWwKKyAqICAgICAgIHJlYWRzIG9mIHBvdGVudGlhbGx5IG5vbiBsaW5lYXIgZGF0YS4KKyAqCisgKiBOb3RlOiBGcmFnbWVudCBsaXN0cyB3aXRoaW4gZnJhZ21lbnRzIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAqICAgICAgIGF0IHRoZSBtb21lbnQsIHN0YXRlLT5yb290X3NrYiBjb3VsZCBiZSByZXBsYWNlZCB3aXRoCisgKiAgICAgICBhIHN0YWNrIGZvciB0aGlzIHB1cnBvc2UuCisgKi8KK3Vuc2lnbmVkIGludCBza2Jfc2VxX3JlYWQodW5zaWduZWQgaW50IGNvbnN1bWVkLCBjb25zdCB1OCAqKmRhdGEsCisJCQkgIHN0cnVjdCBza2Jfc2VxX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBpbnQgYmxvY2tfbGltaXQsIGFic19vZmZzZXQgPSBjb25zdW1lZCArIHN0LT5sb3dlcl9vZmZzZXQ7CisJc2tiX2ZyYWdfdCAqZnJhZzsKKworCWlmICh1bmxpa2VseShhYnNfb2Zmc2V0ID49IHN0LT51cHBlcl9vZmZzZXQpKQorCQlyZXR1cm4gMDsKKworbmV4dF9za2I6CisJYmxvY2tfbGltaXQgPSBza2JfaGVhZGxlbihzdC0+Y3VyX3NrYik7CisKKwlpZiAoYWJzX29mZnNldCA8IGJsb2NrX2xpbWl0KSB7CisJCSpkYXRhID0gc3QtPmN1cl9za2ItPmRhdGEgKyBhYnNfb2Zmc2V0OworCQlyZXR1cm4gYmxvY2tfbGltaXQgLSBhYnNfb2Zmc2V0OworCX0KKworCWlmIChzdC0+ZnJhZ19pZHggPT0gMCAmJiAhc3QtPmZyYWdfZGF0YSkKKwkJc3QtPnN0ZXBwZWRfb2Zmc2V0ICs9IHNrYl9oZWFkbGVuKHN0LT5jdXJfc2tiKTsKKworCXdoaWxlIChzdC0+ZnJhZ19pZHggPCBza2Jfc2hpbmZvKHN0LT5jdXJfc2tiKS0+bnJfZnJhZ3MpIHsKKwkJZnJhZyA9ICZza2Jfc2hpbmZvKHN0LT5jdXJfc2tiKS0+ZnJhZ3Nbc3QtPmZyYWdfaWR4XTsKKwkJYmxvY2tfbGltaXQgPSBmcmFnLT5zaXplICsgc3QtPnN0ZXBwZWRfb2Zmc2V0OworCisJCWlmIChhYnNfb2Zmc2V0IDwgYmxvY2tfbGltaXQpIHsKKwkJCWlmICghc3QtPmZyYWdfZGF0YSkKKwkJCQlzdC0+ZnJhZ19kYXRhID0ga21hcF9za2JfZnJhZyhmcmFnKTsKKworCQkJKmRhdGEgPSAodTggKikgc3QtPmZyYWdfZGF0YSArIGZyYWctPnBhZ2Vfb2Zmc2V0ICsKKwkJCQkoYWJzX29mZnNldCAtIHN0LT5zdGVwcGVkX29mZnNldCk7CisKKwkJCXJldHVybiBibG9ja19saW1pdCAtIGFic19vZmZzZXQ7CisJCX0KKworCQlpZiAoc3QtPmZyYWdfZGF0YSkgeworCQkJa3VubWFwX3NrYl9mcmFnKHN0LT5mcmFnX2RhdGEpOworCQkJc3QtPmZyYWdfZGF0YSA9IE5VTEw7CisJCX0KKworCQlzdC0+ZnJhZ19pZHgrKzsKKwkJc3QtPnN0ZXBwZWRfb2Zmc2V0ICs9IGZyYWctPnNpemU7CisJfQorCisJaWYgKHN0LT5jdXJfc2tiLT5uZXh0KSB7CisJCXN0LT5jdXJfc2tiID0gc3QtPmN1cl9za2ItPm5leHQ7CisJCXN0LT5mcmFnX2lkeCA9IDA7CisJCWdvdG8gbmV4dF9za2I7CisJfSBlbHNlIGlmIChzdC0+cm9vdF9za2IgPT0gc3QtPmN1cl9za2IgJiYKKwkJICAgc2tiX3NoaW5mbyhzdC0+cm9vdF9za2IpLT5mcmFnX2xpc3QpIHsKKwkJc3QtPmN1cl9za2IgPSBza2Jfc2hpbmZvKHN0LT5yb290X3NrYiktPmZyYWdfbGlzdDsKKwkJZ290byBuZXh0X3NrYjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBza2JfYWJvcnRfc2VxX3JlYWQgLSBBYm9ydCBhIHNlcXVlbnRpYWwgcmVhZCBvZiBza2IgZGF0YQorICogQHN0OiBzdGF0ZSB2YXJpYWJsZQorICoKKyAqIE11c3QgYmUgY2FsbGVkIGlmIHNrYl9zZXFfcmVhZCgpIHdhcyBub3QgY2FsbGVkIHVudGlsIGl0CisgKiByZXR1cm5lZCAwLgorICovCit2b2lkIHNrYl9hYm9ydF9zZXFfcmVhZChzdHJ1Y3Qgc2tiX3NlcV9zdGF0ZSAqc3QpCit7CisJaWYgKHN0LT5mcmFnX2RhdGEpCisJCWt1bm1hcF9za2JfZnJhZyhzdC0+ZnJhZ19kYXRhKTsKK30KKworI2RlZmluZSBUU19TS0JfQ0Ioc3RhdGUpCSgoc3RydWN0IHNrYl9zZXFfc3RhdGUgKikgJigoc3RhdGUpLT5jYikpCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2tiX3RzX2dldF9uZXh0X2Jsb2NrKHVuc2lnbmVkIGludCBvZmZzZXQsIGNvbnN0IHU4ICoqdGV4dCwKKwkJCQkJICBzdHJ1Y3QgdHNfY29uZmlnICpjb25mLAorCQkJCQkgIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHNrYl9zZXFfcmVhZChvZmZzZXQsIHRleHQsIFRTX1NLQl9DQihzdGF0ZSkpOworfQorCitzdGF0aWMgdm9pZCBza2JfdHNfZmluaXNoKHN0cnVjdCB0c19jb25maWcgKmNvbmYsIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpCit7CisJc2tiX2Fib3J0X3NlcV9yZWFkKFRTX1NLQl9DQihzdGF0ZSkpOworfQorCisvKioKKyAqIHNrYl9maW5kX3RleHQgLSBGaW5kIGEgdGV4dCBwYXR0ZXJuIGluIHNrYiBkYXRhCisgKiBAc2tiOiB0aGUgYnVmZmVyIHRvIGxvb2sgaW4KKyAqIEBmcm9tOiBzZWFyY2ggb2Zmc2V0CisgKiBAdG86IHNlYXJjaCBsaW1pdAorICogQGNvbmZpZzogdGV4dHNlYXJjaCBjb25maWd1cmF0aW9uCisgKiBAc3RhdGU6IHVuaW5pdGlhbGl6ZWQgdGV4dHNlYXJjaCBzdGF0ZSB2YXJpYWJsZQorICoKKyAqIEZpbmRzIGEgcGF0dGVybiBpbiB0aGUgc2tiIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqIHRleHRzZWFyY2ggY29uZmlndXJhdGlvbi4gVXNlIHRleHRzZWFyY2hfbmV4dCgpIHRvIHJldHJpZXZlCisgKiBzdWJzZXF1ZW50IG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuLiBSZXR1cm5zIHRoZSBvZmZzZXQKKyAqIHRvIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9yIFVJTlRfTUFYIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4KKyAqLwordW5zaWduZWQgaW50IHNrYl9maW5kX3RleHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZyb20sCisJCQkgICB1bnNpZ25lZCBpbnQgdG8sIHN0cnVjdCB0c19jb25maWcgKmNvbmZpZywKKwkJCSAgIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpCit7CisJY29uZmlnLT5nZXRfbmV4dF9ibG9jayA9IHNrYl90c19nZXRfbmV4dF9ibG9jazsKKwljb25maWctPmZpbmlzaCA9IHNrYl90c19maW5pc2g7CisKKwlza2JfcHJlcGFyZV9zZXFfcmVhZChza2IsIGZyb20sIHRvLCBUU19TS0JfQ0Ioc3RhdGUpKTsKKworCXJldHVybiB0ZXh0c2VhcmNoX2ZpbmQoY29uZmlnLCBzdGF0ZSk7Cit9CisKIHZvaWQgX19pbml0IHNrYl9pbml0KHZvaWQpCiB7CiAJc2tidWZmX2hlYWRfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic2tidWZmX2hlYWRfY2FjaGUiLApAQCAtMTUzOCwzICsxNjkyLDcgQEAKIEVYUE9SVF9TWU1CT0woc2tiX3VubGluayk7CiBFWFBPUlRfU1lNQk9MKHNrYl9hcHBlbmQpOwogRVhQT1JUX1NZTUJPTChza2Jfc3BsaXQpOworRVhQT1JUX1NZTUJPTChza2JfcHJlcGFyZV9zZXFfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHNrYl9zZXFfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHNrYl9hYm9ydF9zZXFfcmVhZCk7CitFWFBPUlRfU1lNQk9MKHNrYl9maW5kX3RleHQpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IGE2ZWMzYWQuLjhiMzVjY2QgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTYyMiw3ICs2MjIsOCBAQAogICoJQHByb3Q6IHN0cnVjdCBwcm90byBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgc29jayBpbnN0YW5jZQogICoJQHplcm9faXQ6IGlmIHdlIHNob3VsZCB6ZXJvIHRoZSBuZXdseSBhbGxvY2F0ZWQgc29jawogICovCi1zdHJ1Y3Qgc29jayAqc2tfYWxsb2MoaW50IGZhbWlseSwgaW50IHByaW9yaXR5LCBzdHJ1Y3QgcHJvdG8gKnByb3QsIGludCB6ZXJvX2l0KQorc3RydWN0IHNvY2sgKnNrX2FsbG9jKGludCBmYW1pbHksIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSwKKwkJICAgICAgc3RydWN0IHByb3RvICpwcm90LCBpbnQgemVyb19pdCkKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOwogCWttZW1fY2FjaGVfdCAqc2xhYiA9IHByb3QtPnNsYWI7CkBAIC03NTAsNyArNzUxLDggQEAKIC8qCiAgKiBBbGxvY2F0ZSBhIHNrYiBmcm9tIHRoZSBzb2NrZXQncyBzZW5kIGJ1ZmZlci4KICAqLwotc3RydWN0IHNrX2J1ZmYgKnNvY2tfd21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50IGZvcmNlLCBpbnQgcHJpb3JpdHkpCitzdHJ1Y3Qgc2tfYnVmZiAqc29ja193bWFsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBwcmlvcml0eSkKIHsKIAlpZiAoZm9yY2UgfHwgYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA8IHNrLT5za19zbmRidWYpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKiBza2IgPSBhbGxvY19za2Ioc2l6ZSwgcHJpb3JpdHkpOwpAQCAtNzY1LDcgKzc2Nyw4IEBACiAvKgogICogQWxsb2NhdGUgYSBza2IgZnJvbSB0aGUgc29ja2V0J3MgcmVjZWl2ZSBidWZmZXIuCiAgKi8gCi1zdHJ1Y3Qgc2tfYnVmZiAqc29ja19ybWFsbG9jKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsIGludCBwcmlvcml0eSkKK3N0cnVjdCBza19idWZmICpzb2NrX3JtYWxsb2Moc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBmb3JjZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KQogewogCWlmIChmb3JjZSB8fCBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDwgc2stPnNrX3JjdmJ1ZikgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5KTsKQEAgLTc4MCw3ICs3ODMsNyBAQAogLyogCiAgKiBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayBmcm9tIHRoZSBzb2NrZXQncyBvcHRpb24gbWVtb3J5IGJ1ZmZlci4KICAqLyAKLXZvaWQgKnNvY2tfa21hbGxvYyhzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplLCBpbnQgcHJpb3JpdHkpCit2b2lkICpzb2NrX2ttYWxsb2Moc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IHByaW9yaXR5KQogewogCWlmICgodW5zaWduZWQpc2l6ZSA8PSBzeXNjdGxfb3B0bWVtX21heCAmJgogCSAgICBhdG9taWNfcmVhZCgmc2stPnNrX29tZW1fYWxsb2MpICsgc2l6ZSA8IHN5c2N0bF9vcHRtZW1fbWF4KSB7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IDg4MGE4ODguLjhmODE3YWQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCkBAIC0xMywxMiArMTMsOCBAQAogI2lmZGVmIENPTkZJR19TWVNDVEwKIAogZXh0ZXJuIGludCBuZXRkZXZfbWF4X2JhY2tsb2c7CitleHRlcm4gaW50IG5ldGRldl9idWRnZXQ7CiBleHRlcm4gaW50IHdlaWdodF9wOwotZXh0ZXJuIGludCBub19jb25nX3RocmVzaDsKLWV4dGVybiBpbnQgbm9fY29uZzsKLWV4dGVybiBpbnQgbG9fY29uZzsKLWV4dGVybiBpbnQgbW9kX2Nvbmc7Ci1leHRlcm4gaW50IG5ldGRldl9mYXN0cm91dGU7CiBleHRlcm4gaW50IG5ldF9tc2dfY29zdDsKIGV4dGVybiBpbnQgbmV0X21zZ19idXJzdDsKIApAQCAtODYsMzggKzgyLDYgQEAKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCiAJfSwKIAl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9DT1JFX05PX0NPTkdfVEhSRVNILAotCQkucHJvY25hbWUJPSAibm9fY29uZ190aHJlc2giLAotCQkuZGF0YQkJPSAmbm9fY29uZ190aHJlc2gsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfQ09SRV9OT19DT05HLAotCQkucHJvY25hbWUJPSAibm9fY29uZyIsCi0JCS5kYXRhCQk9ICZub19jb25nLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX0NPUkVfTE9fQ09ORywKLQkJLnByb2NuYW1lCT0gImxvX2NvbmciLAotCQkuZGF0YQkJPSAmbG9fY29uZywKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9DT1JFX01PRF9DT05HLAotCQkucHJvY25hbWUJPSAibW9kX2NvbmciLAotCQkuZGF0YQkJPSAmbW9kX2NvbmcsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwotCX0sCi0JewogCQkuY3RsX25hbWUJPSBORVRfQ09SRV9NU0dfQ09TVCwKIAkJLnByb2NuYW1lCT0gIm1lc3NhZ2VfY29zdCIsCiAJCS5kYXRhCQk9ICZuZXRfbXNnX2Nvc3QsCkBAIC0xNjEsNiArMTI1LDE0IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfQ09SRV9CVURHRVQsCisJCS5wcm9jbmFtZQk9ICJuZXRkZXZfYnVkZ2V0IiwKKwkJLmRhdGEJCT0gJm5ldGRldl9idWRnZXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYworCX0sCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3dpcmVsZXNzLmMgYi9uZXQvY29yZS93aXJlbGVzcy5jCmluZGV4IGIyZmUzNzguLjNmZjU2MzkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3dpcmVsZXNzLmMKKysrIGIvbmV0L2NvcmUvd2lyZWxlc3MuYwpAQCAtMTEwMiw2ICsxMTAyLDcgQEAKIAlubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCB0eXBlLCBzaXplb2YoKnIpKTsKIAlyID0gTkxNU0dfREFUQShubGgpOwogCXItPmlmaV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJci0+X19pZmlfcGFkID0gMDsKIAlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKIAlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAJci0+aWZpX2ZsYWdzID0gZGV2LT5mbGFnczsKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvS2NvbmZpZyBiL25ldC9kZWNuZXQvS2NvbmZpZwppbmRleCAyMTAxZGE1Li45MmYyZWM0IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L0tjb25maWcKKysrIGIvbmV0L2RlY25ldC9LY29uZmlnCkBAIC0xLDYgKzEsMjkgQEAKICMKICMgREVDbmV0IGNvbmZpZ3VyYXRpb24KICMKK2NvbmZpZyBERUNORVQKKwl0cmlzdGF0ZSAiREVDbmV0IFN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhlIERFQ25ldCBuZXR3b3JraW5nIHByb3RvY29sIHdhcyB1c2VkIGluIG1hbnkgcHJvZHVjdHMgbWFkZSBieQorCSAgRGlnaXRhbCAobm93IENvbXBhcSkuICBJdCBwcm92aWRlcyByZWxpYWJsZSBzdHJlYW0gYW5kIHNlcXVlbmNlZAorCSAgcGFja2V0IGNvbW11bmljYXRpb25zIG92ZXIgd2hpY2ggcnVuIGEgdmFyaWV0eSBvZiBzZXJ2aWNlcyBzaW1pbGFyCisJICB0byB0aG9zZSB3aGljaCBydW4gb3ZlciBUQ1AvSVAuCisKKwkgIFRvIGZpbmQgc29tZSB0b29scyB0byB1c2Ugd2l0aCB0aGUga2VybmVsIGxheWVyIHN1cHBvcnQsIHBsZWFzZQorCSAgbG9vayBhdCBQYXRyaWNrIENhdWxmaWVsZCdzIHdlYiBzaXRlOgorCSAgPGh0dHA6Ly9saW51eC1kZWNuZXQuc291cmNlZm9yZ2UubmV0Lz4uCisKKwkgIE1vcmUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaW4KKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbmV0d29ya2luZy9kZWNuZXQudHh0Pi4KKworCSAgQmUgc3VyZSB0byBzYXkgWSB0byAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgYW5kICJTeXNjdGwgc3VwcG9ydCIKKwkgIGJlbG93IHdoZW4gdXNpbmcgREVDbmV0LCBzaW5jZSB5b3Ugd2lsbCBuZWVkIHN5c2N0bCBzdXBwb3J0IHRvIGFpZAorCSAgaW4gY29uZmlndXJhdGlvbiBhdCBydW4gdGltZS4KKworCSAgVGhlIERFQ25ldCBjb2RlIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91IHdhbnQpLgorCSAgVGhlIG1vZHVsZSBpcyBjYWxsZWQgZGVjbmV0LgorCiBjb25maWcgREVDTkVUX1JPVVRFUgogCWJvb2wgIkRFQ25ldDogcm91dGVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBERUNORVQgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jIGIvbmV0L2RlY25ldC9hZl9kZWNuZXQuYwppbmRleCAyOWJiM2NkLi45NmEwMjgwIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCisrKyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKQEAgLTUzNiw3ICs1MzYsNyBAQAogCSAqIHdlIGFyZSBkb3VibGUgY2hlY2tpbmcgdGhhdCB3ZSBhcmUgbm90IHNlbmRpbmcgdG9vCiAJICogbWFueSBvZiB0aGVzZSBrZWVwYWxpdmUgZnJhbWVzLgogCSAqLwotCWlmIChza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3htaXRfcXVldWUpID09IDApCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2NwLT5vdGhlcl94bWl0X3F1ZXVlKSkKIAkJZG5fbnNwX3NlbmRfbGluayhzaywgRE5fTk9DSEFOR0UsIDApOwogfQogCkBAIC0xMTkxLDcgKzExOTEsNyBAQAogCXN0cnVjdCBkbl9zY3AgKnNjcCA9IEROX1NLKHNrKTsKIAlpbnQgbWFzayA9IGRhdGFncmFtX3BvbGwoZmlsZSwgc29jaywgd2FpdCk7CiAKLQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkKIAkJbWFzayB8PSBQT0xMUkRCQU5EOwogCiAJcmV0dXJuIG1hc2s7CkBAIC0xMjE0LDcgKzEyMTQsNyBAQAogCiAJY2FzZSBTSU9DQVRNQVJLOgogCQlsb2NrX3NvY2soc2spOwotCQl2YWwgPSAoc2tiX3F1ZXVlX2xlbigmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSAhPSAwKTsKKwkJdmFsID0gIXNrYl9xdWV1ZV9lbXB0eSgmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKTsKIAkJaWYgKHNjcC0+c3RhdGUgIT0gRE5fUlVOKQogCQkJdmFsID0gLUVOT1RDT05OOwogCQlyZWxlYXNlX3NvY2soc2spOwpAQCAtMTYzMCw3ICsxNjMwLDcgQEAKIAlpbnQgbGVuID0gMDsKIAogCWlmIChmbGFncyAmIE1TR19PT0IpCi0JCXJldHVybiBza2JfcXVldWVfbGVuKHEpID8gMSA6IDA7CisJCXJldHVybiAhc2tiX3F1ZXVlX2VtcHR5KHEpID8gMSA6IDA7CiAKIAl3aGlsZShza2IgIT0gKHN0cnVjdCBza19idWZmICopcSkgewogCQlzdHJ1Y3QgZG5fc2tiX2NiICpjYiA9IEROX1NLQl9DQihza2IpOwpAQCAtMTcwNyw3ICsxNzA3LDcgQEAKIAkJaWYgKHNrLT5za19lcnIpCiAJCQlnb3RvIG91dDsKIAotCQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkgeworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2NwLT5vdGhlcl9yZWNlaXZlX3F1ZXVlKSkgewogCQkJaWYgKCEoZmxhZ3MgJiBNU0dfT09CKSkgewogCQkJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19PT0I7CiAJCQkJaWYgKCFzY3AtPm90aGVyX3JlcG9ydCkgewpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9maWIuYyBiL25ldC9kZWNuZXQvZG5fZmliLmMKaW5kZXggOTkzNGIyNS4uOTliYzA2MSAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9maWIuYworKysgYi9uZXQvZGVjbmV0L2RuX2ZpYi5jCkBAIC01NTEsNyArNTUxLDggQEAKIAkJaWYgKHQgPCBzX3QpCiAJCQljb250aW51ZTsKIAkJaWYgKHQgPiBzX3QpCi0JCQltZW1zZXQoJmNiLT5hcmdzWzFdLCAwLCBzaXplb2YoY2ItPmFyZ3MpLXNpemVvZihpbnQpKTsKKwkJCW1lbXNldCgmY2ItPmFyZ3NbMV0sIDAsCisJCQkgICAgICAgc2l6ZW9mKGNiLT5hcmdzKSAtIHNpemVvZihjYi0+YXJnc1swXSkpOwogCQl0YiA9IGRuX2ZpYl9nZXRfdGFibGUodCwgMCk7CiAJCWlmICh0YiA9PSBOVUxMKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25zcF9vdXQuYyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCmluZGV4IDQyYWJiZjMuLjhjY2UxZmQgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbnNwX291dC5jCkBAIC0zNDIsNyArMzQyLDggQEAKIAogCWRuX25zcF9vdXRwdXQoc2spOwogCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNjcC0+ZGF0YV94bWl0X3F1ZXVlKSB8fCBza2JfcXVldWVfbGVuKCZzY3AtPm90aGVyX3htaXRfcXVldWUpKQorCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzY3AtPmRhdGFfeG1pdF9xdWV1ZSkgfHwKKwkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmc2NwLT5vdGhlcl94bWl0X3F1ZXVlKSkKIAkJc2NwLT5wZXJzaXN0ID0gZG5fbnNwX3BlcnNpc3Qoc2spOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvZWNvbmV0L0tjb25maWcgYi9uZXQvZWNvbmV0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhMmQyOQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9lY29uZXQvS2NvbmZpZwpAQCAtMCwwICsxLDM2IEBACisjCisjIEFjb3JuIEVjb25ldC9BVU4gcHJvdG9jb2xzIAorIworCitjb25maWcgRUNPTkVUCisJdHJpc3RhdGUgIkFjb3JuIEVjb25ldC9BVU4gcHJvdG9jb2xzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIElORVQKKwktLS1oZWxwLS0tCisJICBFY29uZXQgaXMgYSBmYWlybHkgb2xkIGFuZCBzbG93IG5ldHdvcmtpbmcgcHJvdG9jb2wgbWFpbmx5IHVzZWQgYnkKKwkgIEFjb3JuIGNvbXB1dGVycyB0byBhY2Nlc3MgZmlsZSBhbmQgcHJpbnQgc2VydmVycy4gSXQgdXNlcyBuYXRpdmUKKwkgIEVjb25ldCBuZXR3b3JrIGNhcmRzLiBBVU4gaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGhpZ2hlciBsZXZlbAorCSAgcGFydHMgb2YgRWNvbmV0IHRoYXQgcnVucyBvdmVyIG9yZGluYXJ5IEV0aGVybmV0IGNvbm5lY3Rpb25zLCBvbgorCSAgdG9wIG9mIHRoZSBVRFAgcGFja2V0IHByb3RvY29sLCB3aGljaCBpbiB0dXJuIHJ1bnMgb24gdG9wIG9mIHRoZQorCSAgSW50ZXJuZXQgcHJvdG9jb2wgSVAuCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgY2FuIGNob29zZSB3aXRoIHRoZSBuZXh0IHR3byBvcHRpb25zIHdoZXRoZXIKKwkgIHRvIHNlbmQgRWNvbmV0L0FVTiB0cmFmZmljIG92ZXIgYSBVRFAgRXRoZXJuZXQgY29ubmVjdGlvbiBvciBvdmVyCisJICBhIG5hdGl2ZSBFY29uZXQgbmV0d29yayBjYXJkLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBlY29uZXQuCisKK2NvbmZpZyBFQ09ORVRfQVVOVURQCisJYm9vbCAiQVVOIG92ZXIgVURQIgorCWRlcGVuZHMgb24gRUNPTkVUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzZW5kIEVjb25ldC9BVU4gdHJhZmZpYyBvdmVyIGEgVURQCisJICBjb25uZWN0aW9uIChVRFAgaXMgYSBwYWNrZXQgYmFzZWQgcHJvdG9jb2wgdGhhdCBydW5zIG9uIHRvcCBvZiB0aGUKKwkgIEludGVybmV0IHByb3RvY29sIElQKSB1c2luZyBhbiBvcmRpbmFyeSBFdGhlcm5ldCBuZXR3b3JrIGNhcmQuCisKK2NvbmZpZyBFQ09ORVRfTkFUSVZFCisJYm9vbCAiTmF0aXZlIEVjb25ldCIKKwlkZXBlbmRzIG9uIEVDT05FVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBuYXRpdmUgRWNvbmV0IG5ldHdvcmsgY2FyZCBpbnN0YWxsZWQgaW4KKwkgIHlvdXIgY29tcHV0ZXIuCmRpZmYgLS1naXQgYS9uZXQvZXRoZXJuZXQvZXRoLmMgYi9uZXQvZXRoZXJuZXQvZXRoLmMKaW5kZXggNjYxN2VhNC4uZjZkYmZiOSAxMDA2NDQKLS0tIGEvbmV0L2V0aGVybmV0L2V0aC5jCisrKyBiL25ldC9ldGhlcm5ldC9ldGguYwpAQCAtOTIsMTAgKzkyLDkgQEAKIAkgKglTZXQgdGhlIHNvdXJjZSBoYXJkd2FyZSBhZGRyZXNzLiAKIAkgKi8KIAkgCi0JaWYoc2FkZHIpCi0JCW1lbWNweShldGgtPmhfc291cmNlLHNhZGRyLGRldi0+YWRkcl9sZW4pOwotCWVsc2UKLQkJbWVtY3B5KGV0aC0+aF9zb3VyY2UsZGV2LT5kZXZfYWRkcixkZXYtPmFkZHJfbGVuKTsKKwlpZighc2FkZHIpCisJCXNhZGRyID0gZGV2LT5kZXZfYWRkcjsKKwltZW1jcHkoZXRoLT5oX3NvdXJjZSxzYWRkcixkZXYtPmFkZHJfbGVuKTsKIAogCS8qCiAJICoJQW55d2F5LCB0aGUgbG9vcGJhY2stZGV2aWNlIHNob3VsZCBuZXZlciB1c2UgdGhpcyBmdW5jdGlvbi4uLiAKQEAgLTE1Niw3ICsxNTUsNyBAQAogICoJVGhpcyBpcyBub3JtYWwgcHJhY3RpY2UgYW5kIHdvcmtzIGZvciBhbnkgJ25vdyBpbiB1c2UnIHByb3RvY29sLgogICovCiAgCi11bnNpZ25lZCBzaG9ydCBldGhfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorX19iZTE2IGV0aF90eXBlX3RyYW5zKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGV0aGhkciAqZXRoOwogCXVuc2lnbmVkIGNoYXIgKnJhd3A7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9LY29uZmlnIGIvbmV0L2lwdjQvS2NvbmZpZwppbmRleCA1NjdiMDNiLi5kZjUzODY4OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvS2NvbmZpZworKysgYi9uZXQvaXB2NC9LY29uZmlnCkBAIC0xLDM1ICsxLDggQEAKICMKICMgSVAgY29uZmlndXJhdGlvbgogIwotY2hvaWNlIAotCXByb21wdCAiQ2hvb3NlIElQOiBGSUIgbG9va3VwIgotCWRlcGVuZHMgb24gSU5FVAotCWRlZmF1bHQgSVBfRklCX0hBU0gKLQotY29uZmlnIElQX0ZJQl9IQVNICi0JYm9vbCAiRklCX0hBU0giCi0JLS0taGVscC0tLQotCUN1cnJlbnQgRklCIGlzIHZlcnkgcHJvdmVuIGFuZCBnb29kIGVub3VnaCBmb3IgbW9zdCB1c2Vycy4KLQotY29uZmlnIElQX0ZJQl9UUklFCi0JYm9vbCAiRklCX1RSSUUiCi0JLS0taGVscC0tLQotCVVzZSBuZXcgZXhwZXJpbWVudGFsIExDLXRyaWUgYXMgRklCIGxvb2t1cCBhbGdvcml0bS4gCi0gICAgICAgIFRoaXMgaW1wcm92ZXMgbG9va3VwIHBlcmZvcm1hbmNlCi0JCi0JTEMtdHJpZSBpcyBkZXNjcmliZWQgaW46Ci0JCi0gCUlQLWFkZHJlc3MgbG9va3VwIHVzaW5nIExDLXRyaWVzLiBTdGVmYW4gTmlsc3NvbiBhbmQgR3VubmFyIEthcmxzc29uCi0gCUlFRUUgSm91cm5hbCBvbiBTZWxlY3RlZCBBcmVhcyBpbiBDb21tdW5pY2F0aW9ucywgMTcoNik6MTA4My0xMDkyLCBKdW5lIDE5OTkKLQlBbiBleHBlcmltZW50YWwgc3R1ZHkgb2YgY29tcHJlc3Npb24gbWV0aG9kcyBmb3IgZHluYW1pYyB0cmllcwotIAlTdGVmYW4gTmlsc3NvbiBhbmQgTWF0dGkgVGlra2FuZW4uIEFsZ29yaXRobWljYSwgMzMoMSk6MTktMzMsIDIwMDIuCi0gCWh0dHA6Ly93d3cubmFkYS5rdGguc2UvfnNuaWxzc29uL3B1YmxpYy9wYXBlcnMvZHludHJpZTIvCi0gICAgICAgCi1lbmRjaG9pY2UKLQogY29uZmlnIElQX01VTFRJQ0FTVAogCWJvb2wgIklQOiBtdWx0aWNhc3RpbmciCi0JZGVwZW5kcyBvbiBJTkVUCiAJaGVscAogCSAgVGhpcyBpcyBjb2RlIGZvciBhZGRyZXNzaW5nIHNldmVyYWwgbmV0d29ya2VkIGNvbXB1dGVycyBhdCBvbmNlLAogCSAgZW5sYXJnaW5nIHlvdXIga2VybmVsIGJ5IGFib3V0IDIgS0IuIFlvdSBuZWVkIG11bHRpY2FzdGluZyBpZiB5b3UKQEAgLTQzLDcgKzE2LDYgQEAKIAogY29uZmlnIElQX0FEVkFOQ0VEX1JPVVRFUgogCWJvb2wgIklQOiBhZHZhbmNlZCByb3V0ZXIiCi0JZGVwZW5kcyBvbiBJTkVUCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGludGVuZCB0byBydW4geW91ciBMaW51eCBib3ggbW9zdGx5IGFzIGEgcm91dGVyLCBpLmUuIGFzIGEKIAkgIGNvbXB1dGVyIHRoYXQgZm9yd2FyZHMgYW5kIHJlZGlzdHJpYnV0ZXMgbmV0d29yayBwYWNrZXRzLCBzYXkgWTsgeW91CkBAIC03OSw2ICs1MSw0NCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOIGhlcmUuCiAKK2Nob2ljZSAKKwlwcm9tcHQgIkNob29zZSBJUDogRklCIGxvb2t1cCBhbGdvcml0aG0gKGNob29zZSBGSUJfSEFTSCBpZiB1bnN1cmUpIgorCWRlcGVuZHMgb24gSVBfQURWQU5DRURfUk9VVEVSCisJZGVmYXVsdCBJUF9GSUJfSEFTSAorCitjb25maWcgSVBfRklCX0hBU0gKKwlib29sICJGSUJfSEFTSCIKKwktLS1oZWxwLS0tCisJQ3VycmVudCBGSUIgaXMgdmVyeSBwcm92ZW4gYW5kIGdvb2QgZW5vdWdoIGZvciBtb3N0IHVzZXJzLgorCitjb25maWcgSVBfRklCX1RSSUUKKwlib29sICJGSUJfVFJJRSIKKwktLS1oZWxwLS0tCisJVXNlIG5ldyBleHBlcmltZW50YWwgTEMtdHJpZSBhcyBGSUIgbG9va3VwIGFsZ29yaXRtLiAKKyAgICAgICAgVGhpcyBpbXByb3ZlcyBsb29rdXAgcGVyZm9ybWFuY2UgaWYgeW91IGhhdmUgYSBsYXJnZQorCW51bWJlciBvZiByb3V0ZXMuCisKKwlMQy10cmllIGlzIGEgbG9uZ2VzdCBtYXRjaGluZyBwcmVmaXggbG9va3VwIGFsZ29yaXRobSB3aGljaAorCXBlcmZvcm1zIGJldHRlciB0aGFuIEZJQl9IQVNIIGZvciBsYXJnZSByb3V0aW5nIHRhYmxlcy4KKwlCdXQsIGl0IGNvbnN1bWVzIG1vcmUgbWVtb3J5IGFuZCBpcyBtb3JlIGNvbXBsZXguCisJCisJTEMtdHJpZSBpcyBkZXNjcmliZWQgaW46CisJCisgCUlQLWFkZHJlc3MgbG9va3VwIHVzaW5nIExDLXRyaWVzLiBTdGVmYW4gTmlsc3NvbiBhbmQgR3VubmFyIEthcmxzc29uCisgCUlFRUUgSm91cm5hbCBvbiBTZWxlY3RlZCBBcmVhcyBpbiBDb21tdW5pY2F0aW9ucywgMTcoNik6MTA4My0xMDkyLCBKdW5lIDE5OTkKKwlBbiBleHBlcmltZW50YWwgc3R1ZHkgb2YgY29tcHJlc3Npb24gbWV0aG9kcyBmb3IgZHluYW1pYyB0cmllcworIAlTdGVmYW4gTmlsc3NvbiBhbmQgTWF0dGkgVGlra2FuZW4uIEFsZ29yaXRobWljYSwgMzMoMSk6MTktMzMsIDIwMDIuCisgCWh0dHA6Ly93d3cubmFkYS5rdGguc2UvfnNuaWxzc29uL3B1YmxpYy9wYXBlcnMvZHludHJpZTIvCisgICAgICAgCitlbmRjaG9pY2UKKworIyBJZiB0aGUgdXNlciBkb2VzIG5vdCBlbmFibGUgYWR2YW5jZWQgcm91dGluZywgaGUgZ2V0cyB0aGUgc2FmZQorIyBkZWZhdWx0IG9mIHRoZSBmaWItaGFzaCBhbGdvcml0aG0uCitjb25maWcgSVBfRklCX0hBU0gKKwlib29sCisJZGVwZW5kcyBvbiAhSVBfQURWQU5DRURfUk9VVEVSCisJZGVmYXVsdCB5CisKIGNvbmZpZyBJUF9NVUxUSVBMRV9UQUJMRVMKIAlib29sICJJUDogcG9saWN5IHJvdXRpbmciCiAJZGVwZW5kcyBvbiBJUF9BRFZBTkNFRF9ST1VURVIKQEAgLTE3MSw3ICsxODEsNiBAQAogCiBjb25maWcgSVBfUE5QCiAJYm9vbCAiSVA6IGtlcm5lbCBsZXZlbCBhdXRvY29uZmlndXJhdGlvbiIKLQlkZXBlbmRzIG9uIElORVQKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGNvbmZpZ3VyYXRpb24gb2YgSVAgYWRkcmVzc2VzIG9mIGRldmljZXMgYW5kCiAJICBvZiB0aGUgcm91dGluZyB0YWJsZSBkdXJpbmcga2VybmVsIGJvb3QsIGJhc2VkIG9uIGVpdGhlciBpbmZvcm1hdGlvbgpAQCAtMjMwLDcgKzIzOSw2IEBACiAjICAgYm9vbCAnICAgIElQOiBBUlAgc3VwcG9ydCcgQ09ORklHX0lQX1BOUF9BUlAJCQogY29uZmlnIE5FVF9JUElQCiAJdHJpc3RhdGUgIklQOiB0dW5uZWxpbmciCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IElORVRfVFVOTkVMCiAJLS0taGVscC0tLQogCSAgVHVubmVsaW5nIG1lYW5zIGVuY2Fwc3VsYXRpbmcgZGF0YSBvZiBvbmUgcHJvdG9jb2wgdHlwZSB3aXRoaW4KQEAgLTI0OCw3ICsyNTYsNiBAQAogCiBjb25maWcgTkVUX0lQR1JFCiAJdHJpc3RhdGUgIklQOiBHUkUgdHVubmVscyBvdmVyIElQIgotCWRlcGVuZHMgb24gSU5FVAogCXNlbGVjdCBYRlJNCiAJaGVscAogCSAgVHVubmVsaW5nIG1lYW5zIGVuY2Fwc3VsYXRpbmcgZGF0YSBvZiBvbmUgcHJvdG9jb2wgdHlwZSB3aXRoaW4KQEAgLTMwNyw3ICszMTQsNyBAQAogCiBjb25maWcgQVJQRAogCWJvb2wgIklQOiBBUlAgZGFlbW9uIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCiAJLS0taGVscC0tLQogCSAgTm9ybWFsbHksIHRoZSBrZXJuZWwgbWFpbnRhaW5zIGFuIGludGVybmFsIGNhY2hlIHdoaWNoIG1hcHMgSVAKIAkgIGFkZHJlc3NlcyB0byBoYXJkd2FyZSBhZGRyZXNzZXMgb24gdGhlIGxvY2FsIG5ldHdvcmssIHNvIHRoYXQKQEAgLTMzMiw3ICszMzksNiBAQAogCiBjb25maWcgU1lOX0NPT0tJRVMKIAlib29sICJJUDogVENQIHN5bmNvb2tpZSBzdXBwb3J0IChkaXNhYmxlZCBwZXIgZGVmYXVsdCkiCi0JZGVwZW5kcyBvbiBJTkVUCiAJLS0taGVscC0tLQogCSAgTm9ybWFsIFRDUC9JUCBuZXR3b3JraW5nIGlzIG9wZW4gdG8gYW4gYXR0YWNrIGtub3duIGFzICJTWU4KIAkgIGZsb29kaW5nIi4gVGhpcyBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2sgcHJldmVudHMgbGVnaXRpbWF0ZSByZW1vdGUKQEAgLTM2OSw3ICszNzUsNiBAQAogCiBjb25maWcgSU5FVF9BSAogCXRyaXN0YXRlICJJUDogQUggdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19ITUFDCkBAIC0zODIsNyArMzg3LDYgQEAKIAogY29uZmlnIElORVRfRVNQCiAJdHJpc3RhdGUgIklQOiBFU1AgdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAlzZWxlY3QgQ1JZUFRPCiAJc2VsZWN0IENSWVBUT19ITUFDCkBAIC0zOTYsNyArNDAwLDYgQEAKIAogY29uZmlnIElORVRfSVBDT01QCiAJdHJpc3RhdGUgIklQOiBJUENvbXAgdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAlzZWxlY3QgSU5FVF9UVU5ORUwKIAlzZWxlY3QgQ1JZUFRPCkBAIC00MDksNyArNDEyLDYgQEAKIAogY29uZmlnIElORVRfVFVOTkVMCiAJdHJpc3RhdGUgIklQOiB0dW5uZWwgdHJhbnNmb3JtYXRpb24iCi0JZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IFhGUk0KIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBnZW5lcmljIElQIHR1bm5lbCB0cmFuc2Zvcm1hdGlvbiwgd2hpY2ggaXMgcmVxdWlyZWQgYnkKQEAgLTQxOSw3ICs0MjEsNiBAQAogCiBjb25maWcgSVBfVENQRElBRwogCXRyaXN0YXRlICJJUDogVENQIHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZSIKLQlkZXBlbmRzIG9uIElORVQKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGZvciBUQ1Agc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIHVzZWQgYnkgbmF0aXZlIExpbnV4CkBAIC00MzMsNSArNDM0LDEwOCBAQAogY29uZmlnIElQX1RDUERJQUdfSVBWNgogCWRlZl9ib29sIChJUF9UQ1BESUFHPXkgJiYgSVBWNj15KSB8fCAoSVBfVENQRElBRz1tICYmIElQVjYpCiAKK2NvbmZpZyBUQ1BfQ09OR19BRFZBTkNFRAorCWJvb2wgIlRDUDogYWR2YW5jZWQgY29uZ2VzdGlvbiBjb250cm9sIgorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIHNlbGVjdGlvbiBvZiB2YXJpb3VzIFRDUCBjb25nZXN0aW9uIGNvbnRyb2wKKwkgIG1vZHVsZXMuCisKKwkgIE5lYXJseSBhbGwgdXNlcnMgY2FuIHNhZmVseSBzYXkgbm8gaGVyZSwgYW5kIGEgc2FmZSBkZWZhdWx0CisJICBzZWxlY3Rpb24gd2lsbCBiZSBtYWRlIChCSUMtVENQIHdpdGggbmV3IFJlbm8gYXMgYSBmYWxsYmFjaykuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKyMgVENQIFJlbm8gaXMgYnVpbHRpbiAocmVxdWlyZWQgYXMgZmFsbGJhY2spCittZW51ICJUQ1AgY29uZ2VzdGlvbiBjb250cm9sIgorCWRlcGVuZHMgb24gVENQX0NPTkdfQURWQU5DRUQKKworY29uZmlnIFRDUF9DT05HX0JJQworCXRyaXN0YXRlICJCaW5hcnkgSW5jcmVhc2UgQ29uZ2VzdGlvbiAoQklDKSBjb250cm9sIgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwlCSUMtVENQIGlzIGEgc2VuZGVyLXNpZGUgb25seSBjaGFuZ2UgdGhhdCBlbnN1cmVzIGEgbGluZWFyIFJUVAorCWZhaXJuZXNzIHVuZGVyIGxhcmdlIHdpbmRvd3Mgd2hpbGUgb2ZmZXJpbmcgYm90aCBzY2FsYWJpbGl0eSBhbmQKKwlib3VuZGVkIFRDUC1mcmllbmRsaW5lc3MuIFRoZSBwcm90b2NvbCBjb21iaW5lcyB0d28gc2NoZW1lcworCWNhbGxlZCBhZGRpdGl2ZSBpbmNyZWFzZSBhbmQgYmluYXJ5IHNlYXJjaCBpbmNyZWFzZS4gV2hlbiB0aGUKKwljb25nZXN0aW9uIHdpbmRvdyBpcyBsYXJnZSwgYWRkaXRpdmUgaW5jcmVhc2Ugd2l0aCBhIGxhcmdlCisJaW5jcmVtZW50IGVuc3VyZXMgbGluZWFyIFJUVCBmYWlybmVzcyBhcyB3ZWxsIGFzIGdvb2QKKwlzY2FsYWJpbGl0eS4gVW5kZXIgc21hbGwgY29uZ2VzdGlvbiB3aW5kb3dzLCBiaW5hcnkgc2VhcmNoCisJaW5jcmVhc2UgcHJvdmlkZXMgVENQIGZyaWVuZGxpbmVzcy4KKwlTZWUgaHR0cDovL3d3dy5jc2MubmNzdS5lZHUvZmFjdWx0eS9yaGVlL2V4cG9ydC9iaXRjcC8KKworY29uZmlnIFRDUF9DT05HX1dFU1RXT09ECisJdHJpc3RhdGUgIlRDUCBXZXN0d29vZCsiCisJZGVmYXVsdCBtCisJLS0taGVscC0tLQorCVRDUCBXZXN0d29vZCsgaXMgYSBzZW5kZXItc2lkZSBvbmx5IG1vZGlmaWNhdGlvbiBvZiB0aGUgVENQIFJlbm8KKwlwcm90b2NvbCBzdGFjayB0aGF0IG9wdGltaXplcyB0aGUgcGVyZm9ybWFuY2Ugb2YgVENQIGNvbmdlc3Rpb24KKwljb250cm9sLiBJdCBpcyBiYXNlZCBvbiBlbmQtdG8tZW5kIGJhbmR3aWR0aCBlc3RpbWF0aW9uIHRvIHNldAorCWNvbmdlc3Rpb24gd2luZG93IGFuZCBzbG93IHN0YXJ0IHRocmVzaG9sZCBhZnRlciBhIGNvbmdlc3Rpb24KKwllcGlzb2RlLiBVc2luZyB0aGlzIGVzdGltYXRpb24sIFRDUCBXZXN0d29vZCsgYWRhcHRpdmVseSBzZXRzIGEKKwlzbG93IHN0YXJ0IHRocmVzaG9sZCBhbmQgYSBjb25nZXN0aW9uIHdpbmRvdyB3aGljaCB0YWtlcyBpbnRvCisJYWNjb3VudCB0aGUgYmFuZHdpZHRoIHVzZWQgIGF0IHRoZSB0aW1lIGNvbmdlc3Rpb24gaXMgZXhwZXJpZW5jZWQuCisJVENQIFdlc3R3b29kKyBzaWduaWZpY2FudGx5IGluY3JlYXNlcyBmYWlybmVzcyB3cnQgVENQIFJlbm8gaW4KKwl3aXJlZCBuZXR3b3JrcyBhbmQgdGhyb3VnaHB1dCBvdmVyIHdpcmVsZXNzIGxpbmtzLgorCitjb25maWcgVENQX0NPTkdfSFRDUAorICAgICAgICB0cmlzdGF0ZSAiSC1UQ1AiCisgICAgICAgIGRlZmF1bHQgbQorCS0tLWhlbHAtLS0KKwlILVRDUCBpcyBhIHNlbmQtc2lkZSBvbmx5IG1vZGlmaWNhdGlvbnMgb2YgdGhlIFRDUCBSZW5vCisJcHJvdG9jb2wgc3RhY2sgdGhhdCBvcHRpbWl6ZXMgdGhlIHBlcmZvcm1hbmNlIG9mIFRDUAorCWNvbmdlc3Rpb24gY29udHJvbCBmb3IgaGlnaCBzcGVlZCBuZXR3b3JrIGxpbmtzLiBJdCB1c2VzIGEKKwltb2Rlc3dpdGNoIHRvIGNoYW5nZSB0aGUgYWxwaGEgYW5kIGJldGEgcGFyYW1ldGVycyBvZiBUQ1AgUmVubworCWJhc2VkIG9uIG5ldHdvcmsgY29uZGl0aW9ucyBhbmQgaW4gYSB3YXkgc28gYXMgdG8gYmUgZmFpciB3aXRoCisJb3RoZXIgUmVubyBhbmQgSC1UQ1AgZmxvd3MuCisKK2NvbmZpZyBUQ1BfQ09OR19IU1RDUAorCXRyaXN0YXRlICJIaWdoIFNwZWVkIFRDUCIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlTYWxseSBGbG95ZCdzIEhpZ2ggU3BlZWQgVENQIChSRkMgMzY0OSkgY29uZ2VzdGlvbiBjb250cm9sLgorCUEgbW9kaWZpY2F0aW9uIHRvIFRDUCdzIGNvbmdlc3Rpb24gY29udHJvbCBtZWNoYW5pc20gZm9yIHVzZQorCXdpdGggbGFyZ2UgY29uZ2VzdGlvbiB3aW5kb3dzLiBBIHRhYmxlIGluZGljYXRlcyBob3cgbXVjaCB0bworCWluY3JlYXNlIHRoZSBjb25nZXN0aW9uIHdpbmRvdyBieSB3aGVuIGFuIEFDSyBpcyByZWNlaXZlZC4KKyAJRm9yIG1vcmUgZGV0YWlsCXNlZSBodHRwOi8vd3d3LmljaXIub3JnL2Zsb3lkL2hzdGNwLmh0bWwKKworY29uZmlnIFRDUF9DT05HX0hZQkxBCisJdHJpc3RhdGUgIlRDUC1IeWJsYSBjb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCVRDUC1IeWJsYSBpcyBhIHNlbmRlci1zaWRlIG9ubHkgY2hhbmdlIHRoYXQgZWxpbWluYXRlcyBwZW5hbGl6YXRpb24gb2YKKwlsb25nLVJUVCwgbGFyZ2UtYmFuZHdpZHRoIGNvbm5lY3Rpb25zLCBsaWtlIHdoZW4gc2F0ZWxsaXRlIGxlZ3MgYXJlCisJaW52b2x2ZWQsIGV4cGVjaWFsbHkgd2hlbiBzaGFyaW5nIGEgY29tbW9uIGJvdHRsZW5lY2sgd2l0aCBub3JtYWwKKwl0ZXJyZXN0cmlhbCBjb25uZWN0aW9ucy4KKworY29uZmlnIFRDUF9DT05HX1ZFR0FTCisJdHJpc3RhdGUgIlRDUCBWZWdhcyIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlUQ1AgVmVnYXMgaXMgYSBzZW5kZXItc2lkZSBvbmx5IGNoYW5nZSB0byBUQ1AgdGhhdCBhbnRpY2lwYXRlcworCXRoZSBvbnNldCBvZiBjb25nZXN0aW9uIGJ5IGVzdGltYXRpbmcgdGhlIGJhbmR3aWR0aC4gVENQIFZlZ2FzCisJYWRqdXN0cyB0aGUgc2VuZGluZyByYXRlIGJ5IG1vZGlmeWluZyB0aGUgY29uZ2VzdGlvbgorCXdpbmRvdy4gVENQIFZlZ2FzIHNob3VsZCBwcm92aWRlIGxlc3MgcGFja2V0IGxvc3MsIGJ1dCBpdCBpcworCW5vdCBhcyBhZ2dyZXNzaXZlIGFzIFRDUCBSZW5vLgorCitjb25maWcgVENQX0NPTkdfU0NBTEFCTEUKKwl0cmlzdGF0ZSAiU2NhbGFibGUgVENQIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCVNjYWxhYmxlIFRDUCBpcyBhIHNlbmRlci1zaWRlIG9ubHkgY2hhbmdlIHRvIFRDUCB3aGljaCB1c2VzIGEKKwlNSU1EIGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcml0aG0gd2hpY2ggaGFzIHNvbWUgbmljZSBzY2FsaW5nCisJcHJvcGVydGllcywgdGhvdWdoIGlzIGtub3duIHRvIGhhdmUgZmFpcm5lc3MgaXNzdWVzLgorCVNlZSBodHRwOi8vd3d3LWxjZS5lbmcuY2FtLmFjLnVrL35jdGsyMS9zY2FsYWJsZS8KKworZW5kbWVudQorCitjb25maWcgVENQX0NPTkdfQklDCisJdHJpc3RhdGUKKwlkZXBlbmRzIG9uICFUQ1BfQ09OR19BRFZBTkNFRAorCWRlZmF1bHQgeQorCiBzb3VyY2UgIm5ldC9pcHY0L2lwdnMvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCA2NWQ1N2Q4Li41NzE4Y2RiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtNSw3ICs1LDggQEAKIG9iai15ICAgICA6PSB1dGlscy5vIHJvdXRlLm8gaW5ldHBlZXIubyBwcm90b2NvbC5vIFwKIAkgICAgIGlwX2lucHV0Lm8gaXBfZnJhZ21lbnQubyBpcF9mb3J3YXJkLm8gaXBfb3B0aW9ucy5vIFwKIAkgICAgIGlwX291dHB1dC5vIGlwX3NvY2tnbHVlLm8gXAotCSAgICAgdGNwLm8gdGNwX2lucHV0Lm8gdGNwX291dHB1dC5vIHRjcF90aW1lci5vIHRjcF9pcHY0Lm8gdGNwX21pbmlzb2Nrcy5vIFwKKwkgICAgIHRjcC5vIHRjcF9pbnB1dC5vIHRjcF9vdXRwdXQubyB0Y3BfdGltZXIubyB0Y3BfaXB2NC5vIFwKKwkgICAgIHRjcF9taW5pc29ja3MubyB0Y3BfY29uZy5vIFwKIAkgICAgIGRhdGFncmFtLm8gcmF3Lm8gdWRwLm8gYXJwLm8gaWNtcC5vIGRldmluZXQubyBhZl9pbmV0Lm8gaWdtcC5vIFwKIAkgICAgIHN5c2N0bF9uZXRfaXB2NC5vIGZpYl9mcm9udGVuZC5vIGZpYl9zZW1hbnRpY3MubwogCkBAIC0zMCw2ICszMSwxMyBAQAogb2JqLSQoQ09ORklHX0lQX1ZTKSArPSBpcHZzLwogb2JqLSQoQ09ORklHX0lQX1RDUERJQUcpICs9IHRjcF9kaWFnLm8gCiBvYmotJChDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCkgKz0gbXVsdGlwYXRoLm8KK29iai0kKENPTkZJR19UQ1BfQ09OR19CSUMpICs9IHRjcF9iaWMubworb2JqLSQoQ09ORklHX1RDUF9DT05HX1dFU1RXT09EKSArPSB0Y3Bfd2VzdHdvb2Qubworb2JqLSQoQ09ORklHX1RDUF9DT05HX0hTVENQKSArPSB0Y3BfaGlnaHNwZWVkLm8KK29iai0kKENPTkZJR19UQ1BfQ09OR19IWUJMQSkgKz0gdGNwX2h5YmxhLm8KK29iai0kKENPTkZJR19UQ1BfQ09OR19IVENQKSArPSB0Y3BfaHRjcC5vCitvYmotJChDT05GSUdfVENQX0NPTkdfVkVHQVMpICs9IHRjcF92ZWdhcy5vCitvYmotJChDT05GSUdfVENQX0NPTkdfU0NBTEFCTEUpICs9IHRjcF9zY2FsYWJsZS5vCiAKIG9iai0kKENPTkZJR19YRlJNKSArPSB4ZnJtNF9wb2xpY3kubyB4ZnJtNF9zdGF0ZS5vIHhmcm00X2lucHV0Lm8gXAogCQkgICAgICB4ZnJtNF9vdXRwdXQubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IDY1OGU3OTcuLmVmNzQ2ODMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTEwMDksNiArMTAwOSwxNSBAQAogc3RhdGljIGludCBpcHY0X3Byb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGlwZnJhZ19pbml0KHZvaWQpOwogCisvKgorICoJSVAgcHJvdG9jb2wgbGF5ZXIgaW5pdGlhbGlzZXIKKyAqLworCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlwX3BhY2tldF90eXBlID0geworCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCksCisJLmZ1bmMgPSBpcF9yY3YsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBpbmV0X2luaXQodm9pZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZHVtbXlfc2tiOwpAQCAtMTEwMiw2ICsxMTExLDggQEAKIAogCWlwZnJhZ19pbml0KCk7CiAKKwlkZXZfYWRkX3BhY2soJmlwX3BhY2tldF90eXBlKTsKKwogCXJjID0gMDsKIG91dDoKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfdHJpZS5jIGIvbmV0L2lwdjQvZmliX3RyaWUuYwppbmRleCAwNjcxNTY5Li40YmUyMzRjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfdHJpZS5jCisrKyBiL25ldC9pcHY0L2ZpYl90cmllLmMKQEAgLTQzLDcgKzQzLDcgQEAKICAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC4zMjMiCisjZGVmaW5lIFZFUlNJT04gIjAuMzI1IgogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTEzNiw2ICsxMzYsNyBAQAogCXVuc2lnbmVkIGludCBzZW1hbnRpY19tYXRjaF9wYXNzZWQ7CiAJdW5zaWduZWQgaW50IHNlbWFudGljX21hdGNoX21pc3M7CiAJdW5zaWduZWQgaW50IG51bGxfbm9kZV9oaXQ7CisJdW5zaWduZWQgaW50IHJlc2l6ZV9ub2RlX3NraXBwZWQ7CiB9OwogI2VuZGlmCiAKQEAgLTE2NCw4ICsxNjUsOCBAQAogc3RhdGljIHZvaWQgdG5vZGVfcHV0X2NoaWxkX3Jlb3JnKHN0cnVjdCB0bm9kZSAqdG4sIGludCBpLCBzdHJ1Y3Qgbm9kZSAqbiwgaW50IHdhc2Z1bGwpOwogc3RhdGljIGludCB0bm9kZV9jaGlsZF9sZW5ndGgoc3RydWN0IHRub2RlICp0bik7CiBzdGF0aWMgc3RydWN0IG5vZGUgKnJlc2l6ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bik7Ci1zdGF0aWMgc3RydWN0IHRub2RlICppbmZsYXRlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKTsKLXN0YXRpYyBzdHJ1Y3QgdG5vZGUgKmhhbHZlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKTsKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmluZmxhdGUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4sIGludCAqZXJyKTsKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmhhbHZlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuLCBpbnQgKmVycik7CiBzdGF0aWMgdm9pZCB0bm9kZV9mcmVlKHN0cnVjdCB0bm9kZSAqdG4pOwogc3RhdGljIHZvaWQgdHJpZV9kdW1wX3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IHRyaWUgKnQpOwogZXh0ZXJuIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl9maW5kX2FsaWFzKHN0cnVjdCBsaXN0X2hlYWQgKmZhaCwgdTggdG9zLCB1MzIgcHJpbyk7CkBAIC0zNDEsOCArMzQyLDEwIEBACiBzdGF0aWMgc3RydWN0IGxlYWZfaW5mbyAqbGVhZl9pbmZvX25ldyhpbnQgcGxlbikKIHsKIAlzdHJ1Y3QgbGVhZl9pbmZvICpsaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsZWFmX2luZm8pLCAgR0ZQX0tFUk5FTCk7Ci0JbGktPnBsZW4gPSBwbGVuOwotCUlOSVRfTElTVF9IRUFEKCZsaS0+ZmFsaCk7CisJaWYobGkpIHsKKwkJbGktPnBsZW4gPSBwbGVuOworCQlJTklUX0xJU1RfSEVBRCgmbGktPmZhbGgpOworCX0KIAlyZXR1cm4gbGk7CiB9CiAKQEAgLTM1NiwxMSArMzU5LDMyIEBACiAJa2ZyZWUobGkpOwogfQogCitzdGF0aWMgc3RydWN0IHRub2RlICp0bm9kZV9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpIHsKKwkJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChzdHJ1Y3QgdG5vZGUgKikKKwkJICAgICAgIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fdG5vZGVfZnJlZShzdHJ1Y3QgdG5vZGUgKnRuKQoreworCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKworCSAgICAgICAgICAgICAgICAgICAgKDE8PHRuLT5iaXRzKSAqIHNpemVvZihzdHJ1Y3Qgbm9kZSAqKTsKKworCWlmIChzaXplIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUodG4pOworCWVsc2UKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl0biwgZ2V0X29yZGVyKHNpemUpKTsKK30KKwogc3RhdGljIHN0cnVjdCB0bm9kZSogdG5vZGVfbmV3KHRfa2V5IGtleSwgaW50IHBvcywgaW50IGJpdHMpCiB7CiAJaW50IG5jaGlsZHJlbiA9IDE8PGJpdHM7CiAJaW50IHN6ID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKyBuY2hpbGRyZW4gKiBzaXplb2Yoc3RydWN0IG5vZGUgKik7Ci0Jc3RydWN0IHRub2RlICp0biA9IGttYWxsb2Moc3osICBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgdG5vZGUgKnRuID0gdG5vZGVfYWxsb2Moc3opOwogCiAJaWYodG4pICB7CiAJCW1lbXNldCh0biwgMCwgc3opOwpAQCAtMzg4LDcgKzQxMiw3IEBACiAJCQlwcmludGsoIkZMICVwIFxuIiwgdG4pOwogCX0KIAllbHNlIGlmKElTX1ROT0RFKHRuKSkgeyAKLQkJa2ZyZWUodG4pOworCQlfX3Rub2RlX2ZyZWUodG4pOwogCQlpZih0cmllX2RlYnVnID4gMCApIAogCQkJcHJpbnRrKCJGVCAlcCBcbiIsIHRuKTsKIAl9CkBAIC00NTgsNiArNDgyLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcmVzaXplKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKSAKIHsKIAlpbnQgaTsKKwlpbnQgZXJyID0gMDsKIAogIAlpZiAoIXRuKQogCQlyZXR1cm4gTlVMTDsKQEAgLTU1NCwxMiArNTc5LDIwIEBACiAJICovCiAKIAljaGVja190bm9kZSh0bik7Ci0KKwkKKwllcnIgPSAwOwogCXdoaWxlICgodG4tPmZ1bGxfY2hpbGRyZW4gPiAwICYmCiAJICAgICAgIDUwICogKHRuLT5mdWxsX2NoaWxkcmVuICsgdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbikgPj0KIAkJCQlpbmZsYXRlX3RocmVzaG9sZCAqIHRub2RlX2NoaWxkX2xlbmd0aCh0bikpKSB7CiAKLQkJdG4gPSBpbmZsYXRlKHQsIHRuKTsKKwkJdG4gPSBpbmZsYXRlKHQsIHRuLCAmZXJyKTsKKworCQlpZihlcnIpIHsKKyNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKKwkJCXQtPnN0YXRzLnJlc2l6ZV9ub2RlX3NraXBwZWQrKzsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KIAl9CiAKIAljaGVja190bm9kZSh0bik7CkBAIC01NjgsMTEgKzYwMSwyMiBAQAogCSAqIEhhbHZlIGFzIGxvbmcgYXMgdGhlIG51bWJlciBvZiBlbXB0eSBjaGlsZHJlbiBpbiB0aGlzCiAJICogbm9kZSBpcyBhYm92ZSB0aHJlc2hvbGQuCiAJICovCisKKwllcnIgPSAwOwogCXdoaWxlICh0bi0+Yml0cyA+IDEgJiYKIAkgICAgICAgMTAwICogKHRub2RlX2NoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4pIDwKLQkgICAgICAgaGFsdmVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkKKwkgICAgICAgaGFsdmVfdGhyZXNob2xkICogdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSkgewogCi0JCXRuID0gaGFsdmUodCwgdG4pOworCQl0biA9IGhhbHZlKHQsIHRuLCAmZXJyKTsKKworCQlpZihlcnIpIHsKKyNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKKwkJCXQtPnN0YXRzLnJlc2l6ZV9ub2RlX3NraXBwZWQrKzsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwl9CisKICAgCiAJLyogT25seSBvbmUgY2hpbGQgcmVtYWlucyAqLwogCkBAIC01OTcsNyArNjQxLDcgQEAKIAlyZXR1cm4gKHN0cnVjdCBub2RlICopIHRuOwogfQogCi1zdGF0aWMgc3RydWN0IHRub2RlICppbmZsYXRlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIHN0cnVjdCB0bm9kZSAqaW5mbGF0ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0biwgaW50ICplcnIpCiB7CiAJc3RydWN0IHRub2RlICppbm9kZTsKIAlzdHJ1Y3QgdG5vZGUgKm9sZHRub2RlID0gdG47CkBAIC02MDksOCArNjUzLDYzIEBACiAKIAl0biA9IHRub2RlX25ldyhvbGR0bm9kZS0+a2V5LCBvbGR0bm9kZS0+cG9zLCBvbGR0bm9kZS0+Yml0cyArIDEpOwogCi0JaWYgKCF0bikKLQkJdHJpZV9idWcoInRub2RlX25ldyBmYWlsZWQiKTsKKwlpZiAoIXRuKSB7CisJCSplcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gb2xkdG5vZGU7CisJfQorCisJLyoKKwkgKiBQcmVhbGxvY2F0ZSBhbmQgc3RvcmUgdG5vZGVzIGJlZm9yZSB0aGUgYWN0dWFsIHdvcmsgc28gd2UgCisJICogZG9uJ3QgZ2V0IGludG8gYW4gaW5jb25zaXN0ZW50IHN0YXRlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIAorCSAqIGZhaWxzLiBJbiBjYXNlIG9mIGZhaWx1cmUgd2UgcmV0dXJuIHRoZSBvbGRub2RlIGFuZCAgaW5mbGF0ZSAKKwkgKiBvZiB0bm9kZSBpcyBpZ25vcmVkLgorCSAqLworCQkJCisJZm9yKGkgPSAwOyBpIDwgb2xlbjsgaSsrKSB7CisJCXN0cnVjdCB0bm9kZSAqaW5vZGUgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7CisKKwkJaWYgKGlub2RlICYmCisJCSAgICBJU19UTk9ERShpbm9kZSkgJiYKKwkJICAgIGlub2RlLT5wb3MgPT0gb2xkdG5vZGUtPnBvcyArIG9sZHRub2RlLT5iaXRzICYmCisJCSAgICBpbm9kZS0+Yml0cyA+IDEpIHsKKwkJCXN0cnVjdCB0bm9kZSAqbGVmdCwgKnJpZ2h0OworCisJCQl0X2tleSBtID0gVEtFWV9HRVRfTUFTSyhpbm9kZS0+cG9zLCAxKTsKKyAKKwkJCWxlZnQgPSB0bm9kZV9uZXcoaW5vZGUtPmtleSYofm0pLCBpbm9kZS0+cG9zICsgMSwKKwkJCQkJIGlub2RlLT5iaXRzIC0gMSk7CisKKwkJCWlmKCFsZWZ0KSB7CisJCQkJKmVyciA9IC1FTk9NRU07IAorCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlyaWdodCA9IHRub2RlX25ldyhpbm9kZS0+a2V5fG0sIGlub2RlLT5wb3MgKyAxLAorCQkJCQkgIGlub2RlLT5iaXRzIC0gMSk7CisKKwkJCWlmKCFyaWdodCkgeworCQkJCSplcnIgPSAtRU5PTUVNOyAKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmksIChzdHJ1Y3Qgbm9kZSAqKSBsZWZ0KTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgMippKzEsIChzdHJ1Y3Qgbm9kZSAqKSByaWdodCk7CisJCX0KKwl9CisKKwlpZigqZXJyKSB7CisJCWludCBzaXplID0gdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKTsKKwkJaW50IGo7CisKKwkJZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSAKKwkJCWlmKCB0bi0+Y2hpbGRbal0pCisJCQkJdG5vZGVfZnJlZSgoc3RydWN0IHRub2RlICopdG4tPmNoaWxkW2pdKTsKKworCQl0bm9kZV9mcmVlKHRuKTsKKwkJCisJCSplcnIgPSAtRU5PTUVNOworCQlyZXR1cm4gb2xkdG5vZGU7CisJfQogCiAJZm9yKGkgPSAwOyBpIDwgb2xlbjsgaSsrKSB7CiAJCXN0cnVjdCBub2RlICpub2RlID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKTsKQEAgLTYyMyw3ICs3MjIsNyBAQAogCiAJCWlmKElTX0xFQUYobm9kZSkgfHwgKChzdHJ1Y3QgdG5vZGUgKikgbm9kZSktPnBvcyA+CiAJCSAgIHRuLT5wb3MgKyB0bi0+Yml0cyAtIDEpIHsKLQkJCWlmKHRrZXlfZXh0cmFjdF9iaXRzKG5vZGUtPmtleSwgdG4tPnBvcyArIHRuLT5iaXRzIC0gMSwKKwkJCWlmKHRrZXlfZXh0cmFjdF9iaXRzKG5vZGUtPmtleSwgb2xkdG5vZGUtPnBvcyArIG9sZHRub2RlLT5iaXRzLAogCQkJCQkgICAgIDEpID09IDApCiAJCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmksIG5vZGUpOwogCQkJZWxzZQpAQCAtNjYzLDI3ICs3NjIsMjIgQEAKIAkJCSAqIHRoZSBwb3NpdGlvbiAoaW5vZGUtPnBvcykKIAkJCSAqLwogCi0JCQl0X2tleSBtID0gVEtFWV9HRVRfTUFTSyhpbm9kZS0+cG9zLCAxKTsKLSAKIAkJCS8qIFVzZSB0aGUgb2xkIGtleSwgYnV0IHNldCB0aGUgbmV3IHNpZ25pZmljYW50IAogCQkJICogICBiaXQgdG8gemVyby4gCiAJCQkgKi8KLQkJCWxlZnQgPSB0bm9kZV9uZXcoaW5vZGUtPmtleSYofm0pLCBpbm9kZS0+cG9zICsgMSwKLQkJCQkJIGlub2RlLT5iaXRzIC0gMSk7CiAKLQkJCWlmKCFsZWZ0KSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOwotCQkJCi0JCQkKLQkJCS8qIFVzZSB0aGUgb2xkIGtleSwgYnV0IHNldCB0aGUgbmV3IHNpZ25pZmljYW50IAotCQkJICogYml0IHRvIG9uZS4gCi0JCQkgKi8KLQkJCXJpZ2h0ID0gdG5vZGVfbmV3KGlub2RlLT5rZXl8bSwgaW5vZGUtPnBvcyArIDEsCi0JCQkJCSAgaW5vZGUtPmJpdHMgLSAxKTsKKwkJCWxlZnQgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgMippKTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgMippLCBOVUxMKTsKIAotCQkJaWYoIXJpZ2h0KSAKLQkJCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOwotCQkJCisJCQlpZighbGVmdCkKKwkJCQlCVUcoKTsKKworCQkJcmlnaHQgPSAoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgMippKzEpOworCQkJcHV0X2NoaWxkKHQsIHRuLCAyKmkrMSwgTlVMTCk7CisKKwkJCWlmKCFyaWdodCkKKwkJCQlCVUcoKTsKKwogCQkJc2l6ZSA9IHRub2RlX2NoaWxkX2xlbmd0aChsZWZ0KTsKIAkJCWZvcihqID0gMDsgaiA8IHNpemU7IGorKykgewogCQkJCXB1dF9jaGlsZCh0LCBsZWZ0LCBqLCBpbm9kZS0+Y2hpbGRbal0pOwpAQCAtNjk5LDcgKzc5Myw3IEBACiAJcmV0dXJuIHRuOwogfQogCi1zdGF0aWMgc3RydWN0IHRub2RlICpoYWx2ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICp0bikKK3N0YXRpYyBzdHJ1Y3QgdG5vZGUgKmhhbHZlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuLCBpbnQgKmVycikKIHsKIAlzdHJ1Y3QgdG5vZGUgKm9sZHRub2RlID0gdG47CiAJc3RydWN0IG5vZGUgKmxlZnQsICpyaWdodDsKQEAgLTcxMCw4ICs4MDQsNDggQEAKICAgCiAJdG49dG5vZGVfbmV3KG9sZHRub2RlLT5rZXksIG9sZHRub2RlLT5wb3MsIG9sZHRub2RlLT5iaXRzIC0gMSk7CiAKLQlpZighdG4pIAotCQl0cmllX2J1ZygidG5vZGVfbmV3IGZhaWxlZCIpOworCWlmICghdG4pIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiBvbGR0bm9kZTsKKwl9CisKKwkvKgorCSAqIFByZWFsbG9jYXRlIGFuZCBzdG9yZSB0bm9kZXMgYmVmb3JlIHRoZSBhY3R1YWwgd29yayBzbyB3ZSAKKwkgKiBkb24ndCBnZXQgaW50byBhbiBpbmNvbnNpc3RlbnQgc3RhdGUgaWYgbWVtb3J5IGFsbG9jYXRpb24gCisJICogZmFpbHMuIEluIGNhc2Ugb2YgZmFpbHVyZSB3ZSByZXR1cm4gdGhlIG9sZG5vZGUgYW5kIGhhbHZlIAorCSAqIG9mIHRub2RlIGlzIGlnbm9yZWQuCisJICovCisKKwlmb3IoaSA9IDA7IGkgPCBvbGVuOyBpICs9IDIpIHsKKwkJbGVmdCA9IHRub2RlX2dldF9jaGlsZChvbGR0bm9kZSwgaSk7CisJCXJpZ2h0ID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKzEpOworICAgIAorCQkvKiBUd28gbm9uZW1wdHkgY2hpbGRyZW4gKi8KKwkJaWYoIGxlZnQgJiYgcmlnaHQpICB7CisJCQlzdHJ1Y3QgdG5vZGUgKm5ld0Jpbk5vZGUgPQorCQkJCXRub2RlX25ldyhsZWZ0LT5rZXksIHRuLT5wb3MgKyB0bi0+Yml0cywgMSk7CisKKwkJCWlmKCFuZXdCaW5Ob2RlKSB7CisJCQkJKmVyciA9IC1FTk9NRU07IAorCQkJCWJyZWFrOworCQkJfQorCQkJcHV0X2NoaWxkKHQsIHRuLCBpLzIsIChzdHJ1Y3Qgbm9kZSAqKW5ld0Jpbk5vZGUpOworCQl9CisJfQorCisJaWYoKmVycikgeworCQlpbnQgc2l6ZSA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7CisJCWludCBqOworCisJCWZvcihqID0gMDsgaiA8IHNpemU7IGorKykgCisJCQlpZiggdG4tPmNoaWxkW2pdKQorCQkJCXRub2RlX2ZyZWUoKHN0cnVjdCB0bm9kZSAqKXRuLT5jaGlsZFtqXSk7CisKKwkJdG5vZGVfZnJlZSh0bik7CisJCQorCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIG9sZHRub2RlOworCX0KIAogCWZvcihpID0gMDsgaSA8IG9sZW47IGkgKz0gMikgewogCQlsZWZ0ID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCBpKTsKQEAgLTcyOCwxMCArODYyLDExIEBACiAJCS8qIFR3byBub25lbXB0eSBjaGlsZHJlbiAqLwogCQllbHNlIHsKIAkJCXN0cnVjdCB0bm9kZSAqbmV3QmluTm9kZSA9Ci0JCQkJdG5vZGVfbmV3KGxlZnQtPmtleSwgdG4tPnBvcyArIHRuLT5iaXRzLCAxKTsKKwkJCQkoc3RydWN0IHRub2RlICopIHRub2RlX2dldF9jaGlsZCh0biwgaS8yKTsKKwkJCXB1dF9jaGlsZCh0LCB0biwgaS8yLCBOVUxMKTsKIAogCQkJaWYoIW5ld0Jpbk5vZGUpIAotCQkJCXRyaWVfYnVnKCJ0bm9kZV9uZXcgZmFpbGVkIik7CisJCQkJQlVHKCk7CiAKIAkJCXB1dF9jaGlsZCh0LCBuZXdCaW5Ob2RlLCAwLCBsZWZ0KTsKIAkJCXB1dF9jaGlsZCh0LCBuZXdCaW5Ob2RlLCAxLCByaWdodCk7CkBAIC04NzksOCArMTAxNCw4IEBACiAJcmV0dXJuIChzdHJ1Y3Qgbm9kZSopIHRuOwogfQogCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqCi1maWJfaW5zZXJ0X25vZGUoc3RydWN0IHRyaWUgKnQsIHUzMiBrZXksIGludCBwbGVuKQorc3RhdGljICBzdHJ1Y3QgbGlzdF9oZWFkICoKK2ZpYl9pbnNlcnRfbm9kZShzdHJ1Y3QgdHJpZSAqdCwgaW50ICplcnIsIHUzMiBrZXksIGludCBwbGVuKQogewogCWludCBwb3MsIG5ld3BvczsKIAlzdHJ1Y3QgdG5vZGUgKnRwID0gTlVMTCwgKnRuID0gTlVMTDsKQEAgLTk0MCw3ICsxMDc1LDYgQEAKIAlpZih0cCAmJiBJU19MRUFGKHRwKSkKIAkJQlVHKCk7CiAKLQl0LT5yZXZpc2lvbisrOwogCiAJLyogQ2FzZSAxOiBuIGlzIGEgbGVhZi4gQ29tcGFyZSBwcmVmaXhlcyAqLwogCkBAIC05NDksOCArMTA4MywxMCBAQAogCQkKIAkJbGkgPSBsZWFmX2luZm9fbmV3KHBsZW4pOwogCQkKLQkJaWYoISBsaSkgCi0JCQlCVUcoKTsKKwkJaWYoISBsaSkgeworCQkJKmVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycjsKKwkJfQogCiAJCWZhX2hlYWQgPSAmbGktPmZhbGg7CiAJCWluc2VydF9sZWFmX2luZm8oJmwtPmxpc3QsIGxpKTsKQEAgLTk1OSwxNCArMTA5NSwxOSBAQAogCXQtPnNpemUrKzsKIAlsID0gbGVhZl9uZXcoKTsKIAotCWlmKCEgbCkgCi0JCUJVRygpOworCWlmKCEgbCkgeworCQkqZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQogCiAJbC0+a2V5ID0ga2V5OwogCWxpID0gbGVhZl9pbmZvX25ldyhwbGVuKTsKIAotCWlmKCEgbGkpIAotCQlCVUcoKTsKKwlpZighIGxpKSB7CisJCXRub2RlX2ZyZWUoKHN0cnVjdCB0bm9kZSAqKSBsKTsKKwkJKmVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KIAogCWZhX2hlYWQgPSAmbGktPmZhbGg7CiAJaW5zZXJ0X2xlYWZfaW5mbygmbC0+bGlzdCwgbGkpOwpAQCAtMTAwMyw5ICsxMTQ0LDE0IEBACiAJCQluZXdwb3MgPSAwOwogCQkJdG4gPSB0bm9kZV9uZXcoa2V5LCBuZXdwb3MsIDEpOyAvKiBGaXJzdCB0bm9kZSAqLyAKIAkJfQotCQlpZighdG4pIAotCQkJdHJpZV9idWcoInRub2RlX3BmeF9uZXcgZmFpbGVkIik7CiAKKwkJaWYoIXRuKSB7CisJCQlmcmVlX2xlYWZfaW5mbyhsaSk7CisJCQl0bm9kZV9mcmVlKChzdHJ1Y3QgdG5vZGUgKikgbCk7CisJCQkqZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CQkJCisJCQkKIAkJTk9ERV9TRVRfUEFSRU5UKHRuLCB0cCk7CiAKIAkJbWlzc2JpdD10a2V5X2V4dHJhY3RfYml0cyhrZXksIG5ld3BvcywgMSk7CkBAIC0xMDI3LDcgKzExNzMsOSBAQAogCX0KIAkvKiBSZWJhbGFuY2UgdGhlIHRyaWUgKi8KIAl0LT50cmllID0gdHJpZV9yZWJhbGFuY2UodCwgdHApOwotZG9uZTo7Citkb25lOgorCXQtPnJldmlzaW9uKys7CitlcnI6OwogCXJldHVybiBmYV9oZWFkOwogfQogCkBAIC0xMTU2LDggKzEzMDQsMTIgQEAKIAkgKiBJbnNlcnQgbmV3IGVudHJ5IHRvIHRoZSBsaXN0LgogCSAqLwogCi0JaWYoIWZhX2hlYWQpCi0JCWZhX2hlYWQgPSBmaWJfaW5zZXJ0X25vZGUodCwga2V5LCBwbGVuKTsKKwlpZighZmFfaGVhZCkgeworCQlmYV9oZWFkID0gZmliX2luc2VydF9ub2RlKHQsICZlcnIsIGtleSwgcGxlbik7CisJCWVyciA9IDA7CisJCWlmKGVycikgCisJCQlnb3RvIG91dF9mcmVlX25ld19mYTsKKwl9CiAKIAl3cml0ZV9sb2NrX2JoKCZmaWJfbG9jayk7CiAKQEAgLTExNzAsNiArMTMyMiw5IEBACiAJcnRtc2dfZmliKFJUTV9ORVdST1VURSwgaHRvbmwoa2V5KSwgbmV3X2ZhLCBwbGVuLCB0Yi0+dGJfaWQsIG5saGRyLCByZXEpOwogc3VjY2VlZGVkOgogCXJldHVybiAwOworCitvdXRfZnJlZV9uZXdfZmE6CisJa21lbV9jYWNoZV9mcmVlKGZuX2FsaWFzX2ttZW0sIG5ld19mYSk7CiBvdXQ6CiAJZmliX3JlbGVhc2VfaW5mbyhmaSk7CiBlcnI6OwkKQEAgLTIyNzksNiArMjQzNCw3IEBACiAJc2VxX3ByaW50ZihzZXEsInNlbWFudGljIG1hdGNoIHBhc3NlZCA9ICVkXG4iLCB0LT5zdGF0cy5zZW1hbnRpY19tYXRjaF9wYXNzZWQpOwogCXNlcV9wcmludGYoc2VxLCJzZW1hbnRpYyBtYXRjaCBtaXNzID0gJWRcbiIsIHQtPnN0YXRzLnNlbWFudGljX21hdGNoX21pc3MpOwogCXNlcV9wcmludGYoc2VxLCJudWxsIG5vZGUgaGl0PSAlZFxuIiwgdC0+c3RhdHMubnVsbF9ub2RlX2hpdCk7CisJc2VxX3ByaW50ZihzZXEsInNraXBwZWQgbm9kZSByZXNpemUgPSAlZFxuIiwgdC0+c3RhdHMucmVzaXplX25vZGVfc2tpcHBlZCk7CiAjaWZkZWYgQ0xFQVJfU1RBVFMKIAltZW1zZXQoJih0LT5zdGF0cyksIDAsIHNpemVvZih0LT5zdGF0cykpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pY21wLmMgYi9uZXQvaXB2NC9pY21wLmMKaW5kZXggY2I3NTk0OC4uMjc5ZjU3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWNtcC5jCisrKyBiL25ldC9pcHY0L2ljbXAuYwpAQCAtOTcwLDcgKzk3MCw4IEBACiAJCSAqCVJGQyAxMTIyOiAzLjIuMi44IEFuIElDTVBfVElNRVNUQU1QIE1BWSBiZSBzaWxlbnRseQogCQkgKgkgIGRpc2NhcmRlZCBpZiB0byBicm9hZGNhc3QvbXVsdGljYXN0LgogCQkgKi8KLQkJaWYgKGljbXBoLT50eXBlID09IElDTVBfRUNITyAmJgorCQlpZiAoKGljbXBoLT50eXBlID09IElDTVBfRUNITyB8fAorCQkgICAgIGljbXBoLT50eXBlID09IElDTVBfVElNRVNUQU1QKSAmJgogCQkgICAgc3lzY3RsX2ljbXBfZWNob19pZ25vcmVfYnJvYWRjYXN0cykgewogCQkJZ290byBlcnJvcjsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IDFmMzE4MzEuLjUwODhmOTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTE2MTUsOSArMTYxNSwxMCBAQAogewogCWludCBlcnI7CiAJdTMyIGFkZHIgPSBpbXItPmltcl9tdWx0aWFkZHIuc19hZGRyOwotCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sLCAqaTsKKwlzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKmltbD1OVUxMLCAqaTsKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCWludCBpZmluZGV4OwogCWludCBjb3VudCA9IDA7CiAKIAlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKQEAgLTE2MzMsMzcgKzE2MzQsMzAgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWltbCA9IChzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssIHNpemVvZigqaW1sKSwgR0ZQX0tFUk5FTCk7Ci0KIAllcnIgPSAtRUFERFJJTlVTRTsKKwlpZmluZGV4ID0gaW1yLT5pbXJfaWZpbmRleDsKIAlmb3IgKGkgPSBpbmV0LT5tY19saXN0OyBpOyBpID0gaS0+bmV4dCkgewotCQlpZiAobWVtY21wKCZpLT5tdWx0aSwgaW1yLCBzaXplb2YoKmltcikpID09IDApIHsKLQkJCS8qIE5ldyBzdHlsZSBhZGRpdGlvbnMgYXJlIHJlZmVyZW5jZSBjb3VudGVkICovCi0JCQlpZiAoaW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIgPT0gMCkgewotCQkJCWktPmNvdW50Kys7Ci0JCQkJZXJyID0gMDsKLQkJCX0KKwkJaWYgKGktPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGFkZHIgJiYKKwkJICAgIGktPm11bHRpLmltcl9pZmluZGV4ID09IGlmaW5kZXgpCiAJCQlnb3RvIGRvbmU7Ci0JCX0KIAkJY291bnQrKzsKIAl9CiAJZXJyID0gLUVOT0JVRlM7Ci0JaWYgKGltbCA9PSBOVUxMIHx8IGNvdW50ID49IHN5c2N0bF9pZ21wX21heF9tZW1iZXJzaGlwcykKKwlpZiAoY291bnQgPj0gc3lzY3RsX2lnbXBfbWF4X21lbWJlcnNoaXBzKQogCQlnb3RvIGRvbmU7CisJaW1sID0gKHN0cnVjdCBpcF9tY19zb2NrbGlzdCAqKXNvY2tfa21hbGxvYyhzayxzaXplb2YoKmltbCksR0ZQX0tFUk5FTCk7CisJaWYgKGltbCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisKIAltZW1jcHkoJmltbC0+bXVsdGksIGltciwgc2l6ZW9mKCppbXIpKTsKIAlpbWwtPm5leHQgPSBpbmV0LT5tY19saXN0OwotCWltbC0+Y291bnQgPSAxOwogCWltbC0+c2ZsaXN0ID0gTlVMTDsKIAlpbWwtPnNmbW9kZSA9IE1DQVNUX0VYQ0xVREU7CiAJaW5ldC0+bWNfbGlzdCA9IGltbDsKIAlpcF9tY19pbmNfZ3JvdXAoaW5fZGV2LCBhZGRyKTsKLQlpbWwgPSBOVUxMOwogCWVyciA9IDA7Ci0KIGRvbmU6CiAJcnRubF9zaHVubG9jaygpOwotCWlmIChpbWwpCi0JCXNvY2tfa2ZyZWVfcyhzaywgaW1sLCBzaXplb2YoKmltbCkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2OTMsMzAgKzE2ODcsMjUgQEAKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwX21jX3NvY2tsaXN0ICppbWwsICoqaW1scDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJdTMyIGdyb3VwID0gaW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkcjsKKwl1MzIgaWZpbmRleDsKIAogCXJ0bmxfbG9jaygpOworCWluX2RldiA9IGlwX21jX2ZpbmRfZGV2KGltcik7CisJaWYgKCFpbl9kZXYpIHsKKwkJcnRubF91bmxvY2soKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmaW5kZXggPSBpbXItPmltcl9pZmluZGV4OwogCWZvciAoaW1scCA9ICZpbmV0LT5tY19saXN0OyAoaW1sID0gKmltbHApICE9IE5VTEw7IGltbHAgPSAmaW1sLT5uZXh0KSB7Ci0JCWlmIChpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyPT1pbXItPmltcl9tdWx0aWFkZHIuc19hZGRyICYmCi0JCSAgICBpbWwtPm11bHRpLmltcl9hZGRyZXNzLnNfYWRkcj09aW1yLT5pbXJfYWRkcmVzcy5zX2FkZHIgJiYKLQkJICAgICghaW1yLT5pbXJfaWZpbmRleCB8fCBpbWwtPm11bHRpLmltcl9pZmluZGV4PT1pbXItPmltcl9pZmluZGV4KSkgewotCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwotCi0JCQlpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KGltbC0+bXVsdGkuaW1yX2lmaW5kZXgpOwotCQkJaWYgKGluX2RldikKLQkJCQkodm9pZCkgaXBfbWNfbGVhdmVfc3JjKHNrLCBpbWwsIGluX2Rldik7Ci0JCQlpZiAoLS1pbWwtPmNvdW50KSB7Ci0JCQkJcnRubF91bmxvY2soKTsKLQkJCQlpZiAoaW5fZGV2KQotCQkJCQlpbl9kZXZfcHV0KGluX2Rldik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9CisJCWlmIChpbWwtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGdyb3VwICYmCisJCSAgICBpbWwtPm11bHRpLmltcl9pZmluZGV4ID09IGlmaW5kZXgpIHsKKwkJCSh2b2lkKSBpcF9tY19sZWF2ZV9zcmMoc2ssIGltbCwgaW5fZGV2KTsKIAogCQkJKmltbHAgPSBpbWwtPm5leHQ7CiAKLQkJCWlmIChpbl9kZXYpIHsKLQkJCQlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBpbXItPmltcl9tdWx0aWFkZHIuc19hZGRyKTsKLQkJCQlpbl9kZXZfcHV0KGluX2Rldik7Ci0JCQl9CisJCQlpcF9tY19kZWNfZ3JvdXAoaW5fZGV2LCBncm91cCk7CiAJCQlydG5sX3VubG9jaygpOwogCQkJc29ja19rZnJlZV9zKHNrLCBpbWwsIHNpemVvZigqaW1sKSk7CiAJCQlyZXR1cm4gMDsKQEAgLTE3MzYsNiArMTcyNSw3IEBACiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gTlVMTDsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpwc2w7CisJaW50IGxlYXZlZ3JvdXAgPSAwOwogCWludCBpLCBqLCBydjsKIAogCWlmICghTVVMVElDQVNUKGFkZHIpKQpAQCAtMTc1NSwxNSArMTc0NSwyMCBAQAogCWVyciA9IC1FQUREUk5PVEFWQUlMOwogCiAJZm9yIChwbWM9aW5ldC0+bWNfbGlzdDsgcG1jOyBwbWM9cG1jLT5uZXh0KSB7Ci0JCWlmIChtZW1jbXAoJnBtYy0+bXVsdGksIG1yZXFzLCAyKnNpemVvZihfX3UzMikpID09IDApCisJCWlmIChwbWMtPm11bHRpLmltcl9tdWx0aWFkZHIuc19hZGRyID09IGltci5pbXJfbXVsdGlhZGRyLnNfYWRkcgorCQkgICAgJiYgcG1jLT5tdWx0aS5pbXJfaWZpbmRleCA9PSBpbXIuaW1yX2lmaW5kZXgpCiAJCQlicmVhazsKIAl9Ci0JaWYgKCFwbWMpCQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJaWYgKCFwbWMpIHsJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOworCX0KIAkvKiBpZiBhIHNvdXJjZSBmaWx0ZXIgd2FzIHNldCwgbXVzdCBiZSB0aGUgc2FtZSBtb2RlIGFzIGJlZm9yZSAqLwogCWlmIChwbWMtPnNmbGlzdCkgewotCQlpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpCisJCWlmIChwbWMtPnNmbW9kZSAhPSBvbW9kZSkgeworCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZG9uZTsKKwkJfQogCX0gZWxzZSBpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpIHsKIAkJLyogYWxsb3cgbW9kZSBzd2l0Y2hlcyBmb3IgZW1wdHktc2V0IGZpbHRlcnMgKi8KIAkJaXBfbWNfYWRkX3NyYyhpbl9kZXYsICZtcmVxcy0+aW1yX211bHRpYWRkciwgb21vZGUsIDAsIE5VTEwsIDApOwpAQCAtMTc3NSw3ICsxNzcwLDcgQEAKIAlwc2wgPSBwbWMtPnNmbGlzdDsKIAlpZiAoIWFkZCkgewogCQlpZiAoIXBzbCkKLQkJCWdvdG8gZG9uZTsKKwkJCWdvdG8gZG9uZTsJLyogZXJyID0gLUVBRERSTk9UQVZBSUwgKi8KIAkJcnYgPSAhMDsKIAkJZm9yIChpPTA7IGk8cHNsLT5zbF9jb3VudDsgaSsrKSB7CiAJCQlydiA9IG1lbWNtcCgmcHNsLT5zbF9hZGRyW2ldLCAmbXJlcXMtPmltcl9zb3VyY2VhZGRyLApAQCAtMTc4NCw3ICsxNzc5LDEzIEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHJ2KQkJLyogc291cmNlIG5vdCBmb3VuZCAqLworCQkJZ290byBkb25lOwkvKiBlcnIgPSAtRUFERFJOT1RBVkFJTCAqLworCisJCS8qIHNwZWNpYWwgY2FzZSAtIChJTkNMVURFLCBlbXB0eSkgPT0gTEVBVkVfR1JPVVAgKi8KKwkJaWYgKHBzbC0+c2xfY291bnQgPT0gMSAmJiBvbW9kZSA9PSBNQ0FTVF9JTkNMVURFKSB7CisJCQlsZWF2ZWdyb3VwID0gMTsKIAkJCWdvdG8gZG9uZTsKKwkJfQogCiAJCS8qIHVwZGF0ZSB0aGUgaW50ZXJmYWNlIGZpbHRlciAqLwogCQlpcF9tY19kZWxfc3JjKGluX2RldiwgJm1yZXFzLT5pbXJfbXVsdGlhZGRyLCBvbW9kZSwgMSwgCkBAIC0xODQyLDE4ICsxODQzLDIxIEBACiAJCSZtcmVxcy0+aW1yX3NvdXJjZWFkZHIsIDEpOwogZG9uZToKIAlydG5sX3NodW5sb2NrKCk7CisJaWYgKGxlYXZlZ3JvdXApCisJCXJldHVybiBpcF9tY19sZWF2ZV9ncm91cChzaywgJmltcik7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IGlwX21jX21zZmlsdGVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGlwX21zZmlsdGVyICptc2YsIGludCBpZmluZGV4KQogewotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAJc3RydWN0IGlwX21yZXFuCWltcjsKIAl1MzIgYWRkciA9IG1zZi0+aW1zZl9tdWx0aWFkZHI7CiAJc3RydWN0IGlwX21jX3NvY2tsaXN0ICpwbWM7CiAJc3RydWN0IGluX2RldmljZSAqaW5fZGV2OwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKm5ld3BzbCwgKnBzbDsKKwlpbnQgbGVhdmVncm91cCA9IDA7CiAKIAlpZiAoIU1VTFRJQ0FTVChhZGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODcyLDE1ICsxODc2LDIyIEBACiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKIAl9Ci0JZXJyID0gLUVBRERSTk9UQVZBSUw7CisKKwkvKiBzcGVjaWFsIGNhc2UgLSAoSU5DTFVERSwgZW1wdHkpID09IExFQVZFX0dST1VQICovCisJaWYgKG1zZi0+aW1zZl9mbW9kZSA9PSBNQ0FTVF9JTkNMVURFICYmIG1zZi0+aW1zZl9udW1zcmMgPT0gMCkgeworCQlsZWF2ZWdyb3VwID0gMTsKKwkJZ290byBkb25lOworCX0KIAogCWZvciAocG1jPWluZXQtPm1jX2xpc3Q7IHBtYzsgcG1jPXBtYy0+bmV4dCkgewogCQlpZiAocG1jLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciA9PSBtc2YtPmltc2ZfbXVsdGlhZGRyICYmCiAJCSAgICBwbWMtPm11bHRpLmltcl9pZmluZGV4ID09IGltci5pbXJfaWZpbmRleCkKIAkJCWJyZWFrOwogCX0KLQlpZiAoIXBtYykJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwlpZiAoIXBtYykgewkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CisJfQogCWlmIChtc2YtPmltc2ZfbnVtc3JjKSB7CiAJCW5ld3BzbCA9IChzdHJ1Y3QgaXBfc2Zfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssCiAJCQkJSVBfU0ZMU0laRShtc2YtPmltc2ZfbnVtc3JjKSwgR0ZQX0tFUk5FTCk7CkBAIC0xOTA5LDggKzE5MjAsMTEgQEAKIAkJCTAsIE5VTEwsIDApOwogCXBtYy0+c2ZsaXN0ID0gbmV3cHNsOwogCXBtYy0+c2Ztb2RlID0gbXNmLT5pbXNmX2Ztb2RlOworCWVyciA9IDA7CiBkb25lOgogCXJ0bmxfc2h1bmxvY2soKTsKKwlpZiAobGVhdmVncm91cCkKKwkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZpbXIpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2lucHV0LmMgYi9uZXQvaXB2NC9pcF9pbnB1dC5jCmluZGV4IGFmMmVjODguLmM3MDM1MjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2lucHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwpAQCAtMjgzLDE0ICsyODMsMTggQEAKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlpbnQgZXJyOwogCiAJLyoKIAkgKglJbml0aWFsaXNlIHRoZSB2aXJ0dWFsIHBhdGggY2FjaGUgZm9yIHRoZSBwYWNrZXQuIEl0IGRlc2NyaWJlcwogCSAqCWhvdyB0aGUgcGFja2V0IHRyYXZlbHMgaW5zaWRlIExpbnV4IG5ldHdvcmtpbmcuCiAJICovIAogCWlmIChza2ItPmRzdCA9PSBOVUxMKSB7Ci0JCWlmIChpcF9yb3V0ZV9pbnB1dChza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIGlwaC0+dG9zLCBkZXYpKQorCQlpZiAoKGVyciA9IGlwX3JvdXRlX2lucHV0KHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgaXBoLT50b3MsIGRldikpKSB7CisJCQlpZiAoZXJyID09IC1FSE9TVFVOUkVBQ0gpCisJCQkJSVBfSU5DX1NUQVRTX0JIKElQU1RBVFNfTUlCX0lOQUREUkVSUk9SUyk7CiAJCQlnb3RvIGRyb3A7IAorCQl9CiAJfQogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggZWUwN2FlYy4uODBkMTMxMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTEwNyw3ICsxMDcsNiBAQAogCW5ld3NrYi0+cGt0X3R5cGUgPSBQQUNLRVRfTE9PUEJBQ0s7CiAJbmV3c2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAlCVUdfVFJBUChuZXdza2ItPmRzdCk7Ci0JbmZfcmVzZXQobmV3c2tiKTsKIAluZXRpZl9yeChuZXdza2IpOwogCXJldHVybiAwOwogfQpAQCAtMTg4LDggKzE4Nyw2IEBACiAJCXNrYiA9IHNrYjI7CiAJfQogCi0JbmZfcmVzZXQoc2tiKTsKLQogCWlmIChoaCkgewogCQlpbnQgaGhfYWxlbjsKIApAQCAtMzgzLDcgKzM4MCw2IEBACiAJdG8tPnBrdF90eXBlID0gZnJvbS0+cGt0X3R5cGU7CiAJdG8tPnByaW9yaXR5ID0gZnJvbS0+cHJpb3JpdHk7CiAJdG8tPnByb3RvY29sID0gZnJvbS0+cHJvdG9jb2w7Ci0JdG8tPnNlY3VyaXR5ID0gZnJvbS0+c2VjdXJpdHk7CiAJZHN0X3JlbGVhc2UodG8tPmRzdCk7CiAJdG8tPmRzdCA9IGRzdF9jbG9uZShmcm9tLT5kc3QpOwogCXRvLT5kZXYgPSBmcm9tLT5kZXY7CkBAIC0xMzIzLDIzICsxMzE5LDggQEAKIAlpcF9ydF9wdXQocnQpOwogfQogCi0vKgotICoJSVAgcHJvdG9jb2wgbGF5ZXIgaW5pdGlhbGlzZXIKLSAqLwotCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlwX3BhY2tldF90eXBlID0gewotCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCksCi0JLmZ1bmMgPSBpcF9yY3YsCi19OwotCi0vKgotICoJSVAgcmVnaXN0ZXJzIHRoZSBwYWNrZXQgdHlwZSBhbmQgdGhlbiBjYWxscyB0aGUgc3VicHJvdG9jb2wgaW5pdGlhbGlzZXJzCi0gKi8KLQogdm9pZCBfX2luaXQgaXBfaW5pdCh2b2lkKQogewotCWRldl9hZGRfcGFjaygmaXBfcGFja2V0X3R5cGUpOwotCiAJaXBfcnRfaW5pdCgpOwogCWluZXRfaW5pdHBlZXJzKCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCmluZGV4IGY4YjE3MmYuLmZjN2M0ODEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtNjc3LDExICs2NzcsMTEgQEAKIAkJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IG1yZXFzLmltcl9pbnRlcmZhY2U7CiAJCQkJbXJlcS5pbXJfaWZpbmRleCA9IDA7CiAJCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJCWlmIChlcnIpCisJCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCiAJCQkJCWJyZWFrOwogCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKIAkJCQlhZGQgPSAxOwotCQkJfSBlbHNlIC8qSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7CisJCQl9IGVsc2UgLyogSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUCAqLyB7CiAJCQkJb21vZGUgPSBNQ0FTVF9JTkNMVURFOwogCQkJCWFkZCA9IDA7CiAJCQl9CkBAIC03NTQsNyArNzU0LDcgQEAKIAkJCQltcmVxLmltcl9hZGRyZXNzLnNfYWRkciA9IDA7CiAJCQkJbXJlcS5pbXJfaWZpbmRleCA9IGdyZXFzLmdzcl9pbnRlcmZhY2U7CiAJCQkJZXJyID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOwotCQkJCWlmIChlcnIpCisJCQkJaWYgKGVyciAmJiBlcnIgIT0gLUVBRERSSU5VU0UpCiAJCQkJCWJyZWFrOwogCQkJCWdyZXFzLmdzcl9pbnRlcmZhY2UgPSBtcmVxLmltcl9pZmluZGV4OwogCQkJCW9tb2RlID0gTUNBU1RfSU5DTFVERTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IGYyNTA5MDMuLmQyYmY4ZTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtMTE0OSw4ICsxMTQ5LDEwIEBACiAJCWljX3JhcnBfY2xlYW51cCgpOwogI2VuZGlmCiAKLQlpZiAoIWljX2dvdF9yZXBseSkKKwlpZiAoIWljX2dvdF9yZXBseSkgeworCQlpY19teWFkZHIgPSBJTkFERFJfTk9ORTsKIAkJcmV0dXJuIC0xOworCX0KIAogCXByaW50aygiSVAtQ29uZmlnOiBHb3QgJXMgYW5zd2VyIGZyb20gJXUuJXUuJXUuJXUsICIsCiAJCSgoaWNfZ290X3JlcGx5ICYgSUNfUkFSUCkgPyAiUkFSUCIgCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcG1yLmMgYi9uZXQvaXB2NC9pcG1yLmMKaW5kZXggZTRmODA5YS4uNzgzM2Q5MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBtci5jCisrKyBiL25ldC9pcHY0L2lwbXIuYwpAQCAtMjk3LDYgKzI5Nyw3IEBACiBzdGF0aWMgdm9pZCBpcG1yX2Rlc3Ryb3lfdW5yZXMoc3RydWN0IG1mY19jYWNoZSAqYykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2VyciAqZTsKIAogCWF0b21pY19kZWMoJmNhY2hlX3Jlc29sdmVfcXVldWVfbGVuKTsKIApAQCAtMzA2LDcgKzMwNyw5IEBACiAJCQlubGgtPm5sbXNnX3R5cGUgPSBOTE1TR19FUlJPUjsKIAkJCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3Qgbmxtc2dlcnIpKTsKIAkJCXNrYl90cmltKHNrYiwgbmxoLT5ubG1zZ19sZW4pOwotCQkJKChzdHJ1Y3Qgbmxtc2dlcnIqKU5MTVNHX0RBVEEobmxoKSktPmVycm9yID0gLUVUSU1FRE9VVDsKKwkJCWUgPSBOTE1TR19EQVRBKG5saCk7CisJCQllLT5lcnJvciA9IC1FVElNRURPVVQ7CisJCQltZW1zZXQoJmUtPm1zZywgMCwgc2l6ZW9mKGUtPm1zZykpOwogCQkJbmV0bGlua191bmljYXN0KHJ0bmwsIHNrYiwgTkVUTElOS19DQihza2IpLmRzdF9waWQsIE1TR19ET05UV0FJVCk7CiAJCX0gZWxzZQogCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC00OTksNiArNTAyLDcgQEAKIHN0YXRpYyB2b2lkIGlwbXJfY2FjaGVfcmVzb2x2ZShzdHJ1Y3QgbWZjX2NhY2hlICp1Yywgc3RydWN0IG1mY19jYWNoZSAqYykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBubG1zZ2VyciAqZTsKIAogCS8qCiAJICoJUGxheSB0aGUgcGVuZGluZyBlbnRyaWVzIHRocm91Z2ggb3VyIHJvdXRlcgpAQCAtNTE1LDcgKzUxOSw5IEBACiAJCQkJbmxoLT5ubG1zZ190eXBlID0gTkxNU0dfRVJST1I7CiAJCQkJbmxoLT5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpOwogCQkJCXNrYl90cmltKHNrYiwgbmxoLT5ubG1zZ19sZW4pOwotCQkJCSgoc3RydWN0IG5sbXNnZXJyKilOTE1TR19EQVRBKG5saCkpLT5lcnJvciA9IC1FTVNHU0laRTsKKwkJCQllID0gTkxNU0dfREFUQShubGgpOworCQkJCWUtPmVycm9yID0gLUVNU0dTSVpFOworCQkJCW1lbXNldCgmZS0+bXNnLCAwLCBzaXplb2YoZS0+bXNnKSk7CiAJCQl9CiAJCQllcnIgPSBuZXRsaW5rX3VuaWNhc3QocnRubCwgc2tiLCBORVRMSU5LX0NCKHNrYikuZHN0X3BpZCwgTVNHX0RPTlRXQUlUKTsKIAkJfSBlbHNlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcHZzL0tjb25maWcgYi9uZXQvaXB2NC9pcHZzL0tjb25maWcKaW5kZXggNjNhODJiNC4uYzk4MjBiZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9LY29uZmlnCisrKyBiL25ldC9pcHY0L2lwdnMvS2NvbmZpZwpAQCAtMiwxMSArMiwxMSBAQAogIyBJUCBWaXJ0dWFsIFNlcnZlciBjb25maWd1cmF0aW9uCiAjCiBtZW51CSJJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbiIKLQlkZXBlbmRzIG9uIElORVQgJiYgTkVURklMVEVSCisJZGVwZW5kcyBvbiBORVRGSUxURVIKIAogY29uZmlnCUlQX1ZTCiAJdHJpc3RhdGUgIklQIHZpcnR1YWwgc2VydmVyIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBJTkVUICYmIE5FVEZJTFRFUgorCWRlcGVuZHMgb24gTkVURklMVEVSCiAJLS0taGVscC0tLQogCSAgSVAgVmlydHVhbCBTZXJ2ZXIgc3VwcG9ydCB3aWxsIGxldCB5b3UgYnVpbGQgYSBoaWdoLXBlcmZvcm1hbmNlCiAJICB2aXJ0dWFsIHNlcnZlciBiYXNlZCBvbiBjbHVzdGVyIG9mIHR3byBvciBtb3JlIHJlYWwgc2VydmVycy4gVGhpcwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jb25uLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYwppbmRleCBmZDZmZWI1Li5kMDE0NWE4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2Nvbm4uYwpAQCAtNTQ4LDcgKzU0OCw2IEBACiB7CiAJaWYgKGRlbF90aW1lcigmY3AtPnRpbWVyKSkKIAkJbW9kX3RpbWVyKCZjcC0+dGltZXIsIGppZmZpZXMpOwotCV9faXBfdnNfY29ubl9wdXQoY3ApOwogfQogCiAKQEAgLTc1OSwxMiArNzU4LDExIEBACiAJcmV0dXJuIDE7CiB9CiAKLQorLyogQ2FsbGVkIGZyb20ga2V2ZW50ZCBhbmQgbXVzdCBwcm90ZWN0IGl0c2VsZiBmcm9tIHNvZnRpcnFzICovCiB2b2lkIGlwX3ZzX3JhbmRvbV9kcm9wZW50cnkodm9pZCkKIHsKIAlpbnQgaWR4OwogCXN0cnVjdCBpcF92c19jb25uICpjcDsKLQlzdHJ1Y3QgaXBfdnNfY29ubiAqY3Q7CiAKIAkvKgogCSAqIFJhbmRvbWx5IHNjYW4gMS8zMiBvZiB0aGUgd2hvbGUgdGFibGUgZXZlcnkgc2Vjb25kCkBAIC03NzUsNyArNzczLDcgQEAKIAkJLyoKIAkJICogIExvY2sgaXMgYWN0dWFsbHkgbmVlZGVkIGluIHRoaXMgbG9vcC4KIAkJICovCi0JCWN0X3dyaXRlX2xvY2soaGFzaCk7CisJCWN0X3dyaXRlX2xvY2tfYmgoaGFzaCk7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjcCwgJmlwX3ZzX2Nvbm5fdGFiW2hhc2hdLCBjX2xpc3QpIHsKIAkJCWlmICghY3AtPmNwb3J0ICYmICEoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PX0NQT1JUKSkKQEAgLTgwMSwyMyArNzk5LDE0IEBACiAJCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQkvKgotCQkJICogRHJvcCB0aGUgZW50cnksIGFuZCBkcm9wIGl0cyBjdCBpZiBub3QgcmVmZXJlbmNlZAotCQkJICovCi0JCQlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKLQkJCWN0X3dyaXRlX3VubG9jayhoYXNoKTsKLQotCQkJaWYgKChjdCA9IGNwLT5jb250cm9sKSkKLQkJCQlhdG9taWNfaW5jKCZjdC0+cmVmY250KTsKIAkJCUlQX1ZTX0RCRyg0LCAiZGVsIGNvbm5lY3Rpb25cbiIpOwogCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKLQkJCWlmIChjdCkgeworCQkJaWYgKGNwLT5jb250cm9sKSB7CiAJCQkJSVBfVlNfREJHKDQsICJkZWwgY29ubiB0ZW1wbGF0ZVxuIik7Ci0JCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGN0KTsKKwkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3AtPmNvbnRyb2wpOwogCQkJfQotCQkJY3Rfd3JpdGVfbG9jayhoYXNoKTsKIAkJfQotCQljdF93cml0ZV91bmxvY2soaGFzaCk7CisJCWN0X3dyaXRlX3VubG9ja19iaChoYXNoKTsKIAl9CiB9CiAKQEAgLTgyOSw3ICs4MTgsNiBAQAogewogCWludCBpZHg7CiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwotCXN0cnVjdCBpcF92c19jb25uICpjdDsKIAogICBmbHVzaF9hZ2FpbjoKIAlmb3IgKGlkeD0wOyBpZHg8SVBfVlNfQ09OTl9UQUJfU0laRTsgaWR4KyspIHsKQEAgLTgzOSwxOCArODI3LDEzIEBACiAJCWN0X3dyaXRlX2xvY2tfYmgoaWR4KTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXBfdnNfY29ubl90YWJbaWR4XSwgY19saXN0KSB7Ci0JCQlhdG9taWNfaW5jKCZjcC0+cmVmY250KTsKLQkJCWN0X3dyaXRlX3VubG9jayhpZHgpOwogCi0JCQlpZiAoKGN0ID0gY3AtPmNvbnRyb2wpKQotCQkJCWF0b21pY19pbmMoJmN0LT5yZWZjbnQpOwogCQkJSVBfVlNfREJHKDQsICJkZWwgY29ubmVjdGlvblxuIik7CiAJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3ApOwotCQkJaWYgKGN0KSB7CisJCQlpZiAoY3AtPmNvbnRyb2wpIHsKIAkJCQlJUF9WU19EQkcoNCwgImRlbCBjb25uIHRlbXBsYXRlXG4iKTsKLQkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3QpOworCQkJCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcC0+Y29udHJvbCk7CiAJCQl9Ci0JCQljdF93cml0ZV9sb2NrKGlkeCk7CiAJCX0KIAkJY3Rfd3JpdGVfdW5sb2NrX2JoKGlkeCk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYyBiL25ldC9pcHY0L2lwdnMvaXBfdnNfY3RsLmMKaW5kZXggMjE4ZDk3MC4uN2Q5OWVkZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXB2cy9pcF92c19jdGwuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX2N0bC5jCkBAIC05MCw3ICs5MCw4IEBACiAjZW5kaWYKIAogLyoKLSAqCXVwZGF0ZV9kZWZlbnNlX2xldmVsIGlzIGNhbGxlZCBmcm9tIGtldmVudGQgYW5kIGZyb20gc3lzY3RsLgorICoJdXBkYXRlX2RlZmVuc2VfbGV2ZWwgaXMgY2FsbGVkIGZyb20ga2V2ZW50ZCBhbmQgZnJvbSBzeXNjdGwsCisgKglzbyBpdCBuZWVkcyB0byBwcm90ZWN0IGl0c2VsZiBmcm9tIHNvZnRpcnFzCiAgKi8KIHN0YXRpYyB2b2lkIHVwZGF0ZV9kZWZlbnNlX2xldmVsKHZvaWQpCiB7CkBAIC0xMTAsNiArMTExLDggQEAKIAogCW5vbWVtID0gKGF2YWlsbWVtIDwgc3lzY3RsX2lwX3ZzX2FtZW10aHJlc2gpOwogCisJbG9jYWxfYmhfZGlzYWJsZSgpOworCiAJLyogZHJvcF9lbnRyeSAqLwogCXNwaW5fbG9jaygmX19pcF92c19kcm9wZW50cnlfbG9jayk7CiAJc3dpdGNoIChzeXNjdGxfaXBfdnNfZHJvcF9lbnRyeSkgewpAQCAtMjA2LDYgKzIwOSw4IEBACiAJaWYgKHRvX2NoYW5nZSA+PSAwKQogCQlpcF92c19wcm90b2NvbF90aW1lb3V0X2NoYW5nZShzeXNjdGxfaXBfdnNfc2VjdXJlX3RjcD4xKTsKIAl3cml0ZV91bmxvY2soJl9faXBfdnNfc2VjdXJldGNwX2xvY2spOworCisJbG9jYWxfYmhfZW5hYmxlKCk7CiB9CiAKIApAQCAtMTM2MCw5ICsxMzY1LDcgQEAKIAkJCS8qIFJlc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgKi8KIAkJCSp2YWxwID0gdmFsOwogCQl9IGVsc2UgewotCQkJbG9jYWxfYmhfZGlzYWJsZSgpOwogCQkJdXBkYXRlX2RlZmVuc2VfbGV2ZWwoKTsKLQkJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQl9CiAJfQogCXJldHVybiByYzsKQEAgLTIwNTksNyArMjA2Miw3IEBACiAJZHN0LT5hZGRyID0gc3JjLT5hZGRyOwogCWRzdC0+cG9ydCA9IHNyYy0+cG9ydDsKIAlkc3QtPmZ3bWFyayA9IHNyYy0+ZndtYXJrOwotCXN0cmNweShkc3QtPnNjaGVkX25hbWUsIHNyYy0+c2NoZWR1bGVyLT5uYW1lKTsKKwlzdHJsY3B5KGRzdC0+c2NoZWRfbmFtZSwgc3JjLT5zY2hlZHVsZXItPm5hbWUsIHNpemVvZihkc3QtPnNjaGVkX25hbWUpKTsKIAlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKIAlkc3QtPnRpbWVvdXQgPSBzcmMtPnRpbWVvdXQgLyBIWjsKIAlkc3QtPm5ldG1hc2sgPSBzcmMtPm5ldG1hc2s7CkBAIC0yMDgwLDYgKzIwODMsNyBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN2YywgJmlwX3ZzX3N2Y190YWJsZVtpZHhdLCBzX2xpc3QpIHsKIAkJCWlmIChjb3VudCA+PSBnZXQtPm51bV9zZXJ2aWNlcykKIAkJCQlnb3RvIG91dDsKKwkJCW1lbXNldCgmZW50cnksIDAsIHNpemVvZihlbnRyeSkpOwogCQkJaXBfdnNfY29weV9zZXJ2aWNlKCZlbnRyeSwgc3ZjKTsKIAkJCWlmIChjb3B5X3RvX3VzZXIoJnVwdHItPmVudHJ5dGFibGVbY291bnRdLAogCQkJCQkgJmVudHJ5LCBzaXplb2YoZW50cnkpKSkgewpAQCAtMjA5NCw2ICsyMDk4LDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShzdmMsICZpcF92c19zdmNfZndtX3RhYmxlW2lkeF0sIGZfbGlzdCkgewogCQkJaWYgKGNvdW50ID49IGdldC0+bnVtX3NlcnZpY2VzKQogCQkJCWdvdG8gb3V0OworCQkJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CiAJCQlpcF92c19jb3B5X3NlcnZpY2UoJmVudHJ5LCBzdmMpOwogCQkJaWYgKGNvcHlfdG9fdXNlcigmdXB0ci0+ZW50cnl0YWJsZVtjb3VudF0sCiAJCQkJCSAmZW50cnksIHNpemVvZihlbnRyeSkpKSB7CkBAIC0yMzA0LDEyICsyMzA5LDEyIEBACiAJCW1lbXNldCgmZCwgMCwgc2l6ZW9mKGQpKTsKIAkJaWYgKGlwX3ZzX3N5bmNfc3RhdGUgJiBJUF9WU19TVEFURV9NQVNURVIpIHsKIAkJCWRbMF0uc3RhdGUgPSBJUF9WU19TVEFURV9NQVNURVI7Ci0JCQlzdHJjcHkoZFswXS5tY2FzdF9pZm4sIGlwX3ZzX21hc3Rlcl9tY2FzdF9pZm4pOworCQkJc3RybGNweShkWzBdLm1jYXN0X2lmbiwgaXBfdnNfbWFzdGVyX21jYXN0X2lmbiwgc2l6ZW9mKGRbMF0ubWNhc3RfaWZuKSk7CiAJCQlkWzBdLnN5bmNpZCA9IGlwX3ZzX21hc3Rlcl9zeW5jaWQ7CiAJCX0KIAkJaWYgKGlwX3ZzX3N5bmNfc3RhdGUgJiBJUF9WU19TVEFURV9CQUNLVVApIHsKIAkJCWRbMV0uc3RhdGUgPSBJUF9WU19TVEFURV9CQUNLVVA7Ci0JCQlzdHJjcHkoZFsxXS5tY2FzdF9pZm4sIGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4pOworCQkJc3RybGNweShkWzFdLm1jYXN0X2lmbiwgaXBfdnNfYmFja3VwX21jYXN0X2lmbiwgc2l6ZW9mKGRbMV0ubWNhc3RfaWZuKSk7CiAJCQlkWzFdLnN5bmNpZCA9IGlwX3ZzX2JhY2t1cF9zeW5jaWQ7CiAJCX0KIAkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmZCwgc2l6ZW9mKGQpKSAhPSAwKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXB2cy9pcF92c19zeW5jLmMgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYwppbmRleCAyNWM0Nzk1Li41NzRkMWY1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYworKysgYi9uZXQvaXB2NC9pcHZzL2lwX3ZzX3N5bmMuYwpAQCAtODM5LDEwICs4MzksMTAgQEAKIAogCWlwX3ZzX3N5bmNfc3RhdGUgfD0gc3RhdGU7CiAJaWYgKHN0YXRlID09IElQX1ZTX1NUQVRFX01BU1RFUikgewotCQlzdHJjcHkoaXBfdnNfbWFzdGVyX21jYXN0X2lmbiwgbWNhc3RfaWZuKTsKKwkJc3RybGNweShpcF92c19tYXN0ZXJfbWNhc3RfaWZuLCBtY2FzdF9pZm4sIHNpemVvZihpcF92c19tYXN0ZXJfbWNhc3RfaWZuKSk7CiAJCWlwX3ZzX21hc3Rlcl9zeW5jaWQgPSBzeW5jaWQ7CiAJfSBlbHNlIHsKLQkJc3RyY3B5KGlwX3ZzX2JhY2t1cF9tY2FzdF9pZm4sIG1jYXN0X2lmbik7CisJCXN0cmxjcHkoaXBfdnNfYmFja3VwX21jYXN0X2lmbiwgbWNhc3RfaWZuLCBzaXplb2YoaXBfdnNfYmFja3VwX21jYXN0X2lmbikpOwogCQlpcF92c19iYWNrdXBfc3luY2lkID0gc3luY2lkOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA0MmRjOTUxLi4xZGQ4MjRmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwpAQCAtNDMyLDYgKzQzMiwxMyBAQAogCQkJCSAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkJCQkgICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQogeworI2lmICFkZWZpbmVkKENPTkZJR19JUF9ORl9OQVQpICYmICFkZWZpbmVkKENPTkZJR19JUF9ORl9OQVRfTU9EVUxFKQorCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2spPyAgSWdub3JlLiAgRG8gdGhpcyBiZWZvcmUKKyAgICAgICAgICAgZnJhZ21lbnQgY2hlY2suICovCisJaWYgKCgqcHNrYiktPm5mY3QpCisJCXJldHVybiBORl9BQ0NFUFQ7CisjZW5kaWYKKwogCS8qIEdhdGhlciBmcmFnbWVudHMuICovCiAJaWYgKCgqcHNrYiktPm5oLmlwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRnxJUF9PRkZTRVQpKSB7CiAJCSpwc2tiID0gaXBfY3RfZ2F0aGVyX2ZyYWdzKCpwc2tiLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggOWNkZThjNi4uNjcwNmQzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NMVVNURVJJUC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX2Nvbm50cmFjay5oPgogCi0jZGVmaW5lIENMVVNURVJJUF9WRVJTSU9OICIwLjYiCisjZGVmaW5lIENMVVNURVJJUF9WRVJTSU9OICIwLjciCiAKICNkZWZpbmUgREVCVUdfQ0xVU1RFUklQCiAKQEAgLTUyNCw4ICs1MjQsOSBAQAogCSAgICB8fCBhcnAtPmFyX3BsbiAhPSA0IHx8IGFycC0+YXJfaGxuICE9IEVUSF9BTEVOKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCi0JLyogd2Ugb25seSB3YW50IHRvIG1hbmdsZSBhcnAgcmVwbGllcyAqLwotCWlmIChhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUExZKSkKKwkvKiB3ZSBvbmx5IHdhbnQgdG8gbWFuZ2xlIGFycCByZXF1ZXN0cyBhbmQgcmVwbGllcyAqLworCWlmIChhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUExZKQorCSAgICAmJiBhcnAtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUVVFU1QpKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCiAJcGF5bG9hZCA9ICh2b2lkICopKGFycCsxKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDgwY2Y2MzMuLmQ2NzVmZjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtNTQsNiArNTQsNyBAQAogICoJCU1hcmMgQm91Y2hlcgk6CXJvdXRpbmcgYnkgZndtYXJrCiAgKglSb2JlcnQgT2xzc29uCQk6CUFkZGVkIHJ0X2NhY2hlIHN0YXRpc3RpY3MKICAqCUFybmFsZG8gQy4gTWVsbwkJOglDb252ZXJ0IHByb2Mgc3R1ZmYgdG8gc2VxX2ZpbGUKKyAqCUVyaWMgRHVtYXpldAkJOgloYXNoZWQgc3BpbmxvY2tzIGFuZCBydF9jaGVja19leHBpcmUoKSBmaXhlcy4KICAqCiAgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC03MCw2ICs3MSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CkBAIC0yMDEsOCArMjAzLDM3IEBACiAKIHN0cnVjdCBydF9oYXNoX2J1Y2tldCB7CiAJc3RydWN0IHJ0YWJsZQkqY2hhaW47Ci0Jc3BpbmxvY2tfdAlsb2NrOwotfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpOworfTsKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0RFQlVHX1NQSU5MT0NLKQorLyoKKyAqIEluc3RlYWQgb2YgdXNpbmcgb25lIHNwaW5sb2NrIGZvciBlYWNoIHJ0X2hhc2hfYnVja2V0LCB3ZSB1c2UgYSB0YWJsZSBvZiBzcGlubG9ja3MKKyAqIFRoZSBzaXplIG9mIHRoaXMgdGFibGUgaXMgYSBwb3dlciBvZiB0d28gYW5kIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBDUFVTLgorICovCisjaWYgTlJfQ1BVUyA+PSAzMgorI2RlZmluZSBSVF9IQVNIX0xPQ0tfU1oJNDA5NgorI2VsaWYgTlJfQ1BVUyA+PSAxNgorI2RlZmluZSBSVF9IQVNIX0xPQ0tfU1oJMjA0OAorI2VsaWYgTlJfQ1BVUyA+PSA4CisjZGVmaW5lIFJUX0hBU0hfTE9DS19TWgkxMDI0CisjZWxpZiBOUl9DUFVTID49IDQKKyNkZWZpbmUgUlRfSEFTSF9MT0NLX1NaCTUxMgorI2Vsc2UKKyNkZWZpbmUgUlRfSEFTSF9MT0NLX1NaCTI1NgorI2VuZGlmCisKK3N0YXRpYyBzcGlubG9ja190CSpydF9oYXNoX2xvY2tzOworIyBkZWZpbmUgcnRfaGFzaF9sb2NrX2FkZHIoc2xvdCkgJnJ0X2hhc2hfbG9ja3NbKHNsb3QpICYgKFJUX0hBU0hfTE9DS19TWiAtIDEpXQorIyBkZWZpbmUgcnRfaGFzaF9sb2NrX2luaXQoKQl7IFwKKwkJaW50IGk7IFwKKwkJcnRfaGFzaF9sb2NrcyA9IGttYWxsb2Moc2l6ZW9mKHNwaW5sb2NrX3QpICogUlRfSEFTSF9MT0NLX1NaLCBHRlBfS0VSTkVMKTsgXAorCQlpZiAoIXJ0X2hhc2hfbG9ja3MpIHBhbmljKCJJUDogZmFpbGVkIHRvIGFsbG9jYXRlIHJ0X2hhc2hfbG9ja3NcbiIpOyBcCisJCWZvciAoaSA9IDA7IGkgPCBSVF9IQVNIX0xPQ0tfU1o7IGkrKykgXAorCQkJc3Bpbl9sb2NrX2luaXQoJnJ0X2hhc2hfbG9ja3NbaV0pOyBcCisJCX0KKyNlbHNlCisjIGRlZmluZSBydF9oYXNoX2xvY2tfYWRkcihzbG90KSBOVUxMCisjIGRlZmluZSBydF9oYXNoX2xvY2tfaW5pdCgpCisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBydF9oYXNoX2J1Y2tldCAJKnJ0X2hhc2hfdGFibGU7CiBzdGF0aWMgdW5zaWduZWQJCQlydF9oYXNoX21hc2s7CkBAIC01NzUsMTkgKzYwNiwyNiBAQAogLyogVGhpcyBydW5zIHZpYSBhIHRpbWVyIGFuZCB0aHVzIGlzIGFsd2F5cyBpbiBCSCBjb250ZXh0LiAqLwogc3RhdGljIHZvaWQgcnRfY2hlY2tfZXhwaXJlKHVuc2lnbmVkIGxvbmcgZHVtbXkpCiB7Ci0Jc3RhdGljIGludCByb3ZlcjsKLQlpbnQgaSA9IHJvdmVyLCB0OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcm92ZXI7CisJdW5zaWduZWQgaW50IGkgPSByb3ZlciwgZ29hbDsKIAlzdHJ1Y3QgcnRhYmxlICpydGgsICoqcnRocDsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJdTY0IG11bHQ7CiAKLQlmb3IgKHQgPSBpcF9ydF9nY19pbnRlcnZhbCA8PCBydF9oYXNoX2xvZzsgdCA+PSAwOwotCSAgICAgdCAtPSBpcF9ydF9nY190aW1lb3V0KSB7CisJbXVsdCA9ICgodTY0KWlwX3J0X2djX2ludGVydmFsKSA8PCBydF9oYXNoX2xvZzsKKwlpZiAoaXBfcnRfZ2NfdGltZW91dCA+IDEpCisJCWRvX2RpdihtdWx0LCBpcF9ydF9nY190aW1lb3V0KTsKKwlnb2FsID0gKHVuc2lnbmVkIGludCltdWx0OworCWlmIChnb2FsID4gcnRfaGFzaF9tYXNrKSBnb2FsID0gcnRfaGFzaF9tYXNrICsgMTsKKwlmb3IgKDsgZ29hbCA+IDA7IGdvYWwtLSkgewogCQl1bnNpZ25lZCBsb25nIHRtbyA9IGlwX3J0X2djX3RpbWVvdXQ7CiAKIAkJaSA9IChpICsgMSkgJiBydF9oYXNoX21hc2s7CiAJCXJ0aHAgPSAmcnRfaGFzaF90YWJsZVtpXS5jaGFpbjsKIAotCQlzcGluX2xvY2soJnJ0X2hhc2hfdGFibGVbaV0ubG9jayk7CisJCWlmICgqcnRocCA9PSAwKQorCQkJY29udGludWU7CisJCXNwaW5fbG9jayhydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAJCXdoaWxlICgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKIAkJCWlmIChydGgtPnUuZHN0LmV4cGlyZXMpIHsKIAkJCQkvKiBFbnRyeSBpcyBleHBpcmVkIGV2ZW4gaWYgaXQgaXMgaW4gdXNlICovCkBAIC02MjAsMTQgKzY1OCwxNCBAQAogIAkJCXJ0X2ZyZWUocnRoKTsKICNlbmRpZiAvKiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX0NBQ0hFRCAqLwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlzcGluX3VubG9jayhydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAKIAkJLyogRmFsbGJhY2sgbG9vcCBicmVha2VyLiAqLwogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBub3cpKQogCQkJYnJlYWs7CiAJfQogCXJvdmVyID0gaTsKLQltb2RfdGltZXIoJnJ0X3BlcmlvZGljX3RpbWVyLCBub3cgKyBpcF9ydF9nY19pbnRlcnZhbCk7CisJbW9kX3RpbWVyKCZydF9wZXJpb2RpY190aW1lciwgamlmZmllcyArIGlwX3J0X2djX2ludGVydmFsKTsKIH0KIAogLyogVGhpcyBjYW4gcnVuIGZyb20gYm90aCBCSCBhbmQgbm9uLUJIIGNvbnRleHRzLCB0aGUgbGF0dGVyCkBAIC02NDMsMTEgKzY4MSwxMSBAQAogCWdldF9yYW5kb21fYnl0ZXMoJnJ0X2hhc2hfcm5kLCA0KTsKIAogCWZvciAoaSA9IHJ0X2hhc2hfbWFzazsgaSA+PSAwOyBpLS0pIHsKLQkJc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlzcGluX2xvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaSkpOwogCQlydGggPSBydF9oYXNoX3RhYmxlW2ldLmNoYWluOwogCQlpZiAocnRoKQogCQkJcnRfaGFzaF90YWJsZVtpXS5jaGFpbiA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2ldLmxvY2spOworCQlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihpKSk7CiAKIAkJZm9yICg7IHJ0aDsgcnRoID0gbmV4dCkgewogCQkJbmV4dCA9IHJ0aC0+dS5ydF9uZXh0OwpAQCAtNzgwLDcgKzgxOCw3IEBACiAKIAkJCWsgPSAoayArIDEpICYgcnRfaGFzaF9tYXNrOwogCQkJcnRocCA9ICZydF9oYXNoX3RhYmxlW2tdLmNoYWluOwotCQkJc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2tdLmxvY2spOworCQkJc3Bpbl9sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGspKTsKIAkJCXdoaWxlICgocnRoID0gKnJ0aHApICE9IE5VTEwpIHsKIAkJCQlpZiAoIXJ0X21heV9leHBpcmUocnRoLCB0bW8sIGV4cGlyZSkpIHsKIAkJCQkJdG1vID4+PSAxOwpAQCAtODEyLDcgKzg1MCw3IEBACiAJCQkJZ29hbC0tOwogI2VuZGlmIC8qIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVEICovCiAJCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmcnRfaGFzaF90YWJsZVtrXS5sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGspKTsKIAkJCWlmIChnb2FsIDw9IDApCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTg4Miw3ICs5MjAsNyBAQAogCiAJcnRocCA9ICZydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluOwogCi0Jc3Bpbl9sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCXNwaW5fbG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAJd2hpbGUgKChydGggPSAqcnRocCkgIT0gTlVMTCkgewogI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEhfQ0FDSEVECiAJCWlmICghKHJ0aC0+dS5kc3QuZmxhZ3MgJiBEU1RfQkFMQU5DRUQpICYmCkBAIC05MDgsNyArOTQ2LDcgQEAKIAkJCXJ0aC0+dS5kc3QuX191c2UrKzsKIAkJCWRzdF9ob2xkKCZydGgtPnUuZHN0KTsKIAkJCXJ0aC0+dS5kc3QubGFzdHVzZSA9IG5vdzsKLQkJCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCQkJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCiAJCQlydF9kcm9wKHJ0KTsKIAkJCSpycCA9IHJ0aDsKQEAgLTk0OSw3ICs5ODcsNyBAQAogCWlmIChydC0+cnRfdHlwZSA9PSBSVE5fVU5JQ0FTVCB8fCBydC0+ZmwuaWlmID09IDApIHsKIAkJaW50IGVyciA9IGFycF9iaW5kX25laWdoYm91cigmcnQtPnUuZHN0KTsKIAkJaWYgKGVycikgewotCQkJc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJCQlzcGluX3VubG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihoYXNoKSk7CiAKIAkJCWlmIChlcnIgIT0gLUVOT0JVRlMpIHsKIAkJCQlydF9kcm9wKHJ0KTsKQEAgLTk5MCw3ICsxMDI4LDcgQEAKIAl9CiAjZW5kaWYKIAlydF9oYXNoX3RhYmxlW2hhc2hdLmNoYWluID0gcnQ7Ci0Jc3Bpbl91bmxvY2tfYmgoJnJ0X2hhc2hfdGFibGVbaGFzaF0ubG9jayk7CisJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCSpycCA9IHJ0OwogCXJldHVybiAwOwogfQpAQCAtMTA1OCw3ICsxMDk2LDcgQEAKIHsKIAlzdHJ1Y3QgcnRhYmxlICoqcnRocDsKIAotCXNwaW5fbG9ja19iaCgmcnRfaGFzaF90YWJsZVtoYXNoXS5sb2NrKTsKKwlzcGluX2xvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogCWlwX3J0X3B1dChydCk7CiAJZm9yIChydGhwID0gJnJ0X2hhc2hfdGFibGVbaGFzaF0uY2hhaW47ICpydGhwOwogCSAgICAgcnRocCA9ICYoKnJ0aHApLT51LnJ0X25leHQpCkBAIC0xMDY3LDcgKzExMDUsNyBAQAogCQkJcnRfZnJlZShydCk7CiAJCQlicmVhazsKIAkJfQotCXNwaW5fdW5sb2NrX2JoKCZydF9oYXNoX3RhYmxlW2hhc2hdLmxvY2spOworCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGhhc2gpKTsKIH0KIAogdm9pZCBpcF9ydF9yZWRpcmVjdCh1MzIgb2xkX2d3LCB1MzIgZGFkZHIsIHUzMiBuZXdfZ3csCkBAIC0xNjQ3LDcgKzE2ODUsNyBAQAogCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYXJ0aWFuIHNvdXJjZSAldS4ldS4ldS4ldSBmcm9tICIKIAkJCSIldS4ldS4ldS4ldSwgb24gZGV2ICVzXG4iLAogCQkJTklQUVVBRChkYWRkciksIE5JUFFVQUQoc2FkZHIpLCBkZXYtPm5hbWUpOwotCQlpZiAoZGV2LT5oYXJkX2hlYWRlcl9sZW4pIHsKKwkJaWYgKGRldi0+aGFyZF9oZWFkZXJfbGVuICYmIHNrYi0+bWFjLnJhdykgewogCQkJaW50IGk7CiAJCQl1bnNpZ25lZCBjaGFyICpwID0gc2tiLT5tYWMucmF3OwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibGwgaGVhZGVyOiAiKTsKQEAgLTE5MDksNyArMTk0Nyw3IEBACiAJICovCiAJaWYgKChlcnIgPSBmaWJfbG9va3VwKCZmbCwgJnJlcykpICE9IDApIHsKIAkJaWYgKCFJTl9ERVZfRk9SV0FSRChpbl9kZXYpKQotCQkJZ290byBlX2ludmFsOworCQkJZ290byBlX2hvc3R1bnJlYWNoOwogCQlnb3RvIG5vX3JvdXRlOwogCX0KIAlmcmVlX3JlcyA9IDE7CkBAIC0xOTMzLDcgKzE5NzEsNyBAQAogCX0KIAogCWlmICghSU5fREVWX0ZPUldBUkQoaW5fZGV2KSkKLQkJZ290byBlX2ludmFsOworCQlnb3RvIGVfaG9zdHVucmVhY2g7CiAJaWYgKHJlcy50eXBlICE9IFJUTl9VTklDQVNUKQogCQlnb3RvIG1hcnRpYW5fZGVzdGluYXRpb247CiAKQEAgLTIwMjUsNiArMjA2MywxMSBAQAogCQkJIiV1LiV1LiV1LiV1LCBkZXYgJXNcbiIsCiAJCQlOSVBRVUFEKGRhZGRyKSwgTklQUVVBRChzYWRkciksIGRldi0+bmFtZSk7CiAjZW5kaWYKKworZV9ob3N0dW5yZWFjaDoKKyAgICAgICAgZXJyID0gLUVIT1NUVU5SRUFDSDsKKyAgICAgICAgZ290byBkb25lOworCiBlX2ludmFsOgogCWVyciA9IC1FSU5WQUw7CiAJZ290byBkb25lOwpAQCAtMzA2OCwxMiArMzExMSwxNCBAQAogCiBpbnQgX19pbml0IGlwX3J0X2luaXQodm9pZCkKIHsKLQlpbnQgaSwgb3JkZXIsIGdvYWwsIHJjID0gMDsKKwlpbnQgcmMgPSAwOwogCiAJcnRfaGFzaF9ybmQgPSAoaW50KSAoKG51bV9waHlzcGFnZXMgXiAobnVtX3BoeXNwYWdlcz4+OCkpIF4KIAkJCSAgICAgKGppZmZpZXMgXiAoamlmZmllcyA+PiA3KSkpOwogCiAjaWZkZWYgQ09ORklHX05FVF9DTFNfUk9VVEUKKwl7CisJaW50IG9yZGVyOwogCWZvciAob3JkZXIgPSAwOwogCSAgICAgKFBBR0VfU0laRSA8PCBvcmRlcikgPCAyNTYgKiBzaXplb2Yoc3RydWN0IGlwX3J0X2FjY3QpICogTlJfQ1BVUzsgb3JkZXIrKykKIAkJLyogTk9USElORyAqLzsKQEAgLTMwODEsNiArMzEyNiw3IEBACiAJaWYgKCFpcF9ydF9hY2N0KQogCQlwYW5pYygiSVA6IGZhaWxlZCB0byBhbGxvY2F0ZSBpcF9ydF9hY2N0XG4iKTsKIAltZW1zZXQoaXBfcnRfYWNjdCwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKKwl9CiAjZW5kaWYKIAogCWlwdjRfZHN0X29wcy5rbWVtX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpcF9kc3RfY2FjaGUiLApAQCAtMzA5MSwzNiArMzEzNywxOSBAQAogCWlmICghaXB2NF9kc3Rfb3BzLmttZW1fY2FjaGVwKQogCQlwYW5pYygiSVA6IGZhaWxlZCB0byBhbGxvY2F0ZSBpcF9kc3RfY2FjaGVcbiIpOwogCi0JZ29hbCA9IG51bV9waHlzcGFnZXMgPj4gKDI2IC0gUEFHRV9TSElGVCk7Ci0JaWYgKHJoYXNoX2VudHJpZXMpCi0JCWdvYWwgPSAocmhhc2hfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgcnRfaGFzaF9idWNrZXQpKSA+PiBQQUdFX1NISUZUOwotCWZvciAob3JkZXIgPSAwOyAoMVVMIDw8IG9yZGVyKSA8IGdvYWw7IG9yZGVyKyspCi0JCS8qIE5PVEhJTkcgKi87Ci0KLQlkbyB7Ci0JCXJ0X2hhc2hfbWFzayA9ICgxVUwgPDwgb3JkZXIpICogUEFHRV9TSVpFIC8KLQkJCXNpemVvZihzdHJ1Y3QgcnRfaGFzaF9idWNrZXQpOwotCQl3aGlsZSAocnRfaGFzaF9tYXNrICYgKHJ0X2hhc2hfbWFzayAtIDEpKQotCQkJcnRfaGFzaF9tYXNrLS07Ci0JCXJ0X2hhc2hfdGFibGUgPSAoc3RydWN0IHJ0X2hhc2hfYnVja2V0ICopCi0JCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIG9yZGVyKTsKLQl9IHdoaWxlIChydF9oYXNoX3RhYmxlID09IE5VTEwgJiYgLS1vcmRlciA+IDApOwotCi0JaWYgKCFydF9oYXNoX3RhYmxlKQotCQlwYW5pYygiRmFpbGVkIHRvIGFsbG9jYXRlIElQIHJvdXRlIGNhY2hlIGhhc2ggdGFibGVcbiIpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiSVA6IHJvdXRpbmcgY2FjaGUgaGFzaCB0YWJsZSBvZiAldSBidWNrZXRzLCAlbGRLYnl0ZXNcbiIsCi0JICAgICAgIHJ0X2hhc2hfbWFzaywKLQkgICAgICAgKGxvbmcpIChydF9oYXNoX21hc2sgKiBzaXplb2Yoc3RydWN0IHJ0X2hhc2hfYnVja2V0KSkgLyAxMDI0KTsKLQotCWZvciAocnRfaGFzaF9sb2cgPSAwOyAoMSA8PCBydF9oYXNoX2xvZykgIT0gcnRfaGFzaF9tYXNrOyBydF9oYXNoX2xvZysrKQotCQkvKiBOT1RISU5HICovOwotCi0JcnRfaGFzaF9tYXNrLS07Ci0JZm9yIChpID0gMDsgaSA8PSBydF9oYXNoX21hc2s7IGkrKykgewotCQlzcGluX2xvY2tfaW5pdCgmcnRfaGFzaF90YWJsZVtpXS5sb2NrKTsKLQkJcnRfaGFzaF90YWJsZVtpXS5jaGFpbiA9IE5VTEw7Ci0JfQorCXJ0X2hhc2hfdGFibGUgPSAoc3RydWN0IHJ0X2hhc2hfYnVja2V0ICopCisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJJUCByb3V0ZSBjYWNoZSIsCisJCQkJCXNpemVvZihzdHJ1Y3QgcnRfaGFzaF9idWNrZXQpLAorCQkJCQlyaGFzaF9lbnRyaWVzLAorCQkJCQkobnVtX3BoeXNwYWdlcyA+PSAxMjggKiAxMDI0KSA/CisJCQkJCQkoMjcgLSBQQUdFX1NISUZUKSA6CisJCQkJCQkoMjkgLSBQQUdFX1NISUZUKSwKKwkJCQkJSEFTSF9ISUdITUVNLAorCQkJCQkmcnRfaGFzaF9sb2csCisJCQkJCSZydF9oYXNoX21hc2ssCisJCQkJCTApOworCW1lbXNldChydF9oYXNoX3RhYmxlLCAwLCAocnRfaGFzaF9tYXNrICsgMSkgKiBzaXplb2Yoc3RydWN0IHJ0X2hhc2hfYnVja2V0KSk7CisJcnRfaGFzaF9sb2NrX2luaXQoKTsKIAogCWlwdjRfZHN0X29wcy5nY190aHJlc2ggPSAocnRfaGFzaF9tYXNrICsgMSk7CiAJaXBfcnRfbWF4X3NpemUgPSAocnRfaGFzaF9tYXNrICsgMSkgKiAxNjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3N5c2N0bF9uZXRfaXB2NC5jIGIvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKaW5kZXggMjMwNjhiZC4uZTMyODk0NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMKQEAgLTExOCw2ICsxMTgsNDUgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBwcm9jX3RjcF9jb25nZXN0aW9uX2NvbnRyb2woY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJCSAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIHZhbFtUQ1BfQ0FfTkFNRV9NQVhdOworCWN0bF90YWJsZSB0YmwgPSB7CisJCS5kYXRhID0gdmFsLAorCQkubWF4bGVuID0gVENQX0NBX05BTUVfTUFYLAorCX07CisJaW50IHJldDsKKworCXRjcF9nZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2wodmFsKTsKKworCXJldCA9IHByb2NfZG9zdHJpbmcoJnRibCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHdyaXRlICYmIHJldCA9PSAwKQorCQlyZXQgPSB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKHZhbCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHN5c2N0bF90Y3BfY29uZ2VzdGlvbl9jb250cm9sKGN0bF90YWJsZSAqdGFibGUsIGludCBfX3VzZXIgKm5hbWUsIGludCBubGVuLAorCQkJCSAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKKwkJCQkgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sCisJCQkJICB2b2lkICoqY29udGV4dCkKK3sKKwljaGFyIHZhbFtUQ1BfQ0FfTkFNRV9NQVhdOworCWN0bF90YWJsZSB0YmwgPSB7CisJCS5kYXRhID0gdmFsLAorCQkubWF4bGVuID0gVENQX0NBX05BTUVfTUFYLAorCX07CisJaW50IHJldDsKKworCXRjcF9nZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2wodmFsKTsKKwlyZXQgPSBzeXNjdGxfc3RyaW5nKCZ0YmwsIG5hbWUsIG5sZW4sIG9sZHZhbCwgb2xkbGVucCwgbmV3dmFsLCBuZXdsZW4sCisJCQkgICAgY29udGV4dCk7CisJaWYgKHJldCA9PSAwICYmIG5ld3ZhbCAmJiBuZXdsZW4pCisJCXJldCA9IHRjcF9zZXRfZGVmYXVsdF9jb25nZXN0aW9uX2NvbnRyb2wodmFsKTsKKwlyZXR1cm4gcmV0OworfQorCisKIGN0bF90YWJsZSBpcHY0X3RhYmxlW10gPSB7CiAgICAgICAgIHsKIAkJLmN0bF9uYW1lCT0gTkVUX0lQVjRfVENQX1RJTUVTVEFNUFMsCkBAIC02MTIsNzAgKzY1MSw2IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX1RDUF9XRVNUV09PRCwgCi0JCS5wcm9jbmFtZQk9ICJ0Y3Bfd2VzdHdvb2QiLAotCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF93ZXN0d29vZCwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfVENQX1ZFR0FTLAotCQkucHJvY25hbWUJPSAidGNwX3ZlZ2FzX2NvbmdfYXZvaWQiLAotCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF92ZWdhc19jb25nX2F2b2lkLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9UQ1BfVkVHQVNfQUxQSEEsCi0JCS5wcm9jbmFtZQk9ICJ0Y3BfdmVnYXNfYWxwaGEiLAotCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF92ZWdhc19hbHBoYSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfVENQX1ZFR0FTX0JFVEEsCi0JCS5wcm9jbmFtZQk9ICJ0Y3BfdmVnYXNfYmV0YSIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3ZlZ2FzX2JldGEsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX1RDUF9WRUdBU19HQU1NQSwKLQkJLnByb2NuYW1lCT0gInRjcF92ZWdhc19nYW1tYSIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfdGNwX3ZlZ2FzX2dhbW1hLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5jdGxfbmFtZQk9IE5FVF9UQ1BfQklDLAotCQkucHJvY25hbWUJPSAidGNwX2JpYyIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2JpYywKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkuY3RsX25hbWUJPSBORVRfVENQX0JJQ19GQVNUX0NPTlZFUkdFTkNFLAotCQkucHJvY25hbWUJPSAidGNwX2JpY19mYXN0X2NvbnZlcmdlbmNlIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF90Y3BfYmljX2Zhc3RfY29udmVyZ2VuY2UsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLmN0bF9uYW1lCT0gTkVUX1RDUF9CSUNfTE9XX1dJTkRPVywKLQkJLnByb2NuYW1lCT0gInRjcF9iaWNfbG93X3dpbmRvdyIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2JpY19sb3dfd2luZG93LAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7CiAJCS5jdGxfbmFtZQk9IE5FVF9UQ1BfTU9ERVJBVEVfUkNWQlVGLAogCQkucHJvY25hbWUJPSAidGNwX21vZGVyYXRlX3JjdmJ1ZiIsCiAJCS5kYXRhCQk9ICZzeXNjdGxfdGNwX21vZGVyYXRlX3JjdmJ1ZiwKQEAgLTY5MiwxMyArNjY3LDE0IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogCXsKLQkJLmN0bF9uYW1lCT0gTkVUX1RDUF9CSUNfQkVUQSwKLQkJLnByb2NuYW1lCT0gInRjcF9iaWNfYmV0YSIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfdGNwX2JpY19iZXRhLAotCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkuY3RsX25hbWUJPSBORVRfVENQX0NPTkdfQ09OVFJPTCwKKwkJLnByb2NuYW1lCT0gInRjcF9jb25nZXN0aW9uX2NvbnRyb2wiLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJCS5tYXhsZW4JCT0gVENQX0NBX05BTUVfTUFYLAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfdGNwX2Nvbmdlc3Rpb25fY29udHJvbCwKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF90Y3BfY29uZ2VzdGlvbl9jb250cm9sLAogCX0sCisKIAl7IC5jdGxfbmFtZSA9IDAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCA2NzRiYmQ4Li5kZGI2Y2U0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJCQkgc2l6ZV90IHBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JaW50IG1zc19ub3c7CisJaW50IG1zc19ub3csIHNpemVfZ29hbDsKIAlpbnQgZXJyOwogCXNzaXplX3QgY29waWVkOwogCWxvbmcgdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CkBAIC02MjgsNiArNjI4LDcgQEAKIAljbGVhcl9iaXQoU09DS19BU1lOQ19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwogCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisJc2l6ZV9nb2FsID0gdHAtPnhtaXRfc2l6ZV9nb2FsOwogCWNvcGllZCA9IDA7CiAKIAllcnIgPSAtRVBJUEU7CkBAIC02NDEsNyArNjQyLDcgQEAKIAkJaW50IG9mZnNldCA9IHBvZmZzZXQgJSBQQUdFX1NJWkU7CiAJCWludCBzaXplID0gbWluX3Qoc2l6ZV90LCBwc2l6ZSwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKIAotCQlpZiAoIXNrLT5za19zZW5kX2hlYWQgfHwgKGNvcHkgPSBtc3Nfbm93IC0gc2tiLT5sZW4pIDw9IDApIHsKKwkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8IChjb3B5ID0gc2l6ZV9nb2FsIC0gc2tiLT5sZW4pIDw9IDApIHsKIG5ld19zZWdtZW50OgogCQkJaWYgKCFza19zdHJlYW1fbWVtb3J5X2ZyZWUoc2spKQogCQkJCWdvdG8gd2FpdF9mb3Jfc25kYnVmOwpAQCAtNjUyLDcgKzY1Myw3IEBACiAJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CiAKIAkJCXNrYl9lbnRhaWwoc2ssIHRwLCBza2IpOwotCQkJY29weSA9IG1zc19ub3c7CisJCQljb3B5ID0gc2l6ZV9nb2FsOwogCQl9CiAKIAkJaWYgKGNvcHkgPiBzaXplKQpAQCAtNjkzLDcgKzY5NCw3IEBACiAJCWlmICghKHBzaXplIC09IGNvcHkpKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKHNrYi0+bGVuICE9IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCisJCWlmIChza2ItPmxlbiA8IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCiAJCQljb250aW51ZTsKIAogCQlpZiAoZm9yY2VkX3B1c2godHApKSB7CkBAIC03MTMsNiArNzE0LDcgQEAKIAkJCWdvdG8gZG9fZXJyb3I7CiAKIAkJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgIShmbGFncyZNU0dfT09CKSk7CisJCXNpemVfZ29hbCA9IHRwLT54bWl0X3NpemVfZ29hbDsKIAl9CiAKIG91dDoKQEAgLTc1NCwxNSArNzU2LDIwIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlbGVjdF9zaXplKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCkKIHsKLQlpbnQgdG1wID0gdHAtPm1zc19jYWNoZV9zdGQ7CisJaW50IHRtcCA9IHRwLT5tc3NfY2FjaGU7CiAKIAlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1NHKSB7Ci0JCWludCBwZ2JyZWFrID0gU0tCX01BWF9IRUFEKE1BWF9UQ1BfSEVBREVSKTsKKwkJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pCisJCQl0bXAgPSAwOworCQllbHNlIHsKKwkJCWludCBwZ2JyZWFrID0gU0tCX01BWF9IRUFEKE1BWF9UQ1BfSEVBREVSKTsKIAotCQlpZiAodG1wID49IHBnYnJlYWsgJiYKLQkJICAgIHRtcCA8PSBwZ2JyZWFrICsgKE1BWF9TS0JfRlJBR1MgLSAxKSAqIFBBR0VfU0laRSkKLQkJCXRtcCA9IHBnYnJlYWs7CisJCQlpZiAodG1wID49IHBnYnJlYWsgJiYKKwkJCSAgICB0bXAgPD0gcGdicmVhayArIChNQVhfU0tCX0ZSQUdTIC0gMSkgKiBQQUdFX1NJWkUpCisJCQkJdG1wID0gcGdicmVhazsKKwkJfQogCX0KKwogCXJldHVybiB0bXA7CiB9CiAKQEAgLTc3Myw3ICs3ODAsNyBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGlvdmxlbiwgZmxhZ3M7Ci0JaW50IG1zc19ub3c7CisJaW50IG1zc19ub3csIHNpemVfZ29hbDsKIAlpbnQgZXJyLCBjb3BpZWQ7CiAJbG9uZyB0aW1lbzsKIApAQCAtNzkyLDYgKzc5OSw3IEBACiAJY2xlYXJfYml0KFNPQ0tfQVNZTkNfTk9TUEFDRSwgJnNrLT5za19zb2NrZXQtPmZsYWdzKTsKIAogCW1zc19ub3cgPSB0Y3BfY3VycmVudF9tc3Moc2ssICEoZmxhZ3MmTVNHX09PQikpOworCXNpemVfZ29hbCA9IHRwLT54bWl0X3NpemVfZ29hbDsKIAogCS8qIE9rIGNvbW1lbmNlIHNlbmRpbmcuICovCiAJaW92bGVuID0gbXNnLT5tc2dfaW92bGVuOwpAQCAtODE0LDcgKzgyMiw3IEBACiAJCQlza2IgPSBzay0+c2tfd3JpdGVfcXVldWUucHJldjsKIAogCQkJaWYgKCFzay0+c2tfc2VuZF9oZWFkIHx8Ci0JCQkgICAgKGNvcHkgPSBtc3Nfbm93IC0gc2tiLT5sZW4pIDw9IDApIHsKKwkJCSAgICAoY29weSA9IHNpemVfZ29hbCAtIHNrYi0+bGVuKSA8PSAwKSB7CiAKIG5ld19zZWdtZW50OgogCQkJCS8qIEFsbG9jYXRlIG5ldyBzZWdtZW50LiBJZiB0aGUgaW50ZXJmYWNlIGlzIFNHLApAQCAtODM3LDcgKzg0NSw3IEBACiAJCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fSFc7CiAKIAkJCQlza2JfZW50YWlsKHNrLCB0cCwgc2tiKTsKLQkJCQljb3B5ID0gbXNzX25vdzsKKwkJCQljb3B5ID0gc2l6ZV9nb2FsOwogCQkJfQogCiAJCQkvKiBUcnkgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiBza2IuICovCkBAIC04NzIsMTEgKzg4MCw2IEBACiAJCQkJCXRjcF9tYXJrX3B1c2godHAsIHNrYik7CiAJCQkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAJCQkJfSBlbHNlIGlmIChwYWdlKSB7Ci0JCQkJCS8qIElmIHBhZ2UgaXMgY2FjaGVkLCBhbGlnbgotCQkJCQkgKiBvZmZzZXQgdG8gTDEgY2FjaGUgYm91bmRhcnkKLQkJCQkJICovCi0JCQkJCW9mZiA9IChvZmYgKyBMMV9DQUNIRV9CWVRFUyAtIDEpICYKLQkJCQkJICAgICAgfihMMV9DQUNIRV9CWVRFUyAtIDEpOwogCQkJCQlpZiAob2ZmID09IFBBR0VfU0laRSkgewogCQkJCQkJcHV0X3BhZ2UocGFnZSk7CiAJCQkJCQlUQ1BfUEFHRShzaykgPSBwYWdlID0gTlVMTDsKQEAgLTkzNyw3ICs5NDAsNyBAQAogCQkJaWYgKChzZWdsZW4gLT0gY29weSkgPT0gMCAmJiBpb3ZsZW4gPT0gMCkKIAkJCQlnb3RvIG91dDsKIAotCQkJaWYgKHNrYi0+bGVuICE9IG1zc19ub3cgfHwgKGZsYWdzICYgTVNHX09PQikpCisJCQlpZiAoc2tiLT5sZW4gPCBtc3Nfbm93IHx8IChmbGFncyAmIE1TR19PT0IpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoZm9yY2VkX3B1c2godHApKSB7CkBAIC05NTcsNiArOTYwLDcgQEAKIAkJCQlnb3RvIGRvX2Vycm9yOwogCiAJCQltc3Nfbm93ID0gdGNwX2N1cnJlbnRfbXNzKHNrLCAhKGZsYWdzJk1TR19PT0IpKTsKKwkJCXNpemVfZ29hbCA9IHRwLT54bWl0X3NpemVfZ29hbDsKIAkJfQogCX0KIApAQCAtMTEwMSw3ICsxMTA1LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JTkVUX0FERF9TVEFUU19VU0VSKExJTlVYX01JQl9UQ1BQUkVRVUVVRUQsIHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpOworCU5FVF9JTkNfU1RBVFNfVVNFUihMSU5VWF9NSUJfVENQUFJFUVVFVUVEKTsKIAogCS8qIFJYIHByb2Nlc3Mgd2FudHMgdG8gcnVuIHdpdGggZGlzYWJsZWQgQkhzLCB0aG91Z2ggaXQgaXMgbm90CiAJICogbmVjZXNzYXJ5ICovCkBAIC0xMzY1LDcgKzEzNjksNyBAQAogCQkJICogaXMgbm90IGVtcHR5LiBJdCBpcyBtb3JlIGVsZWdhbnQsIGJ1dCBlYXRzIGN5Y2xlcywKIAkJCSAqIHVuZm9ydHVuYXRlbHkuCiAJCQkgKi8KLQkJCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKQorCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT51Y29weS5wcmVxdWV1ZSkpCiAJCQkJZ290byBkb19wcmVxdWV1ZTsKIAogCQkJLyogX18gU2V0IHJlYWx0aW1lIHBvbGljeSBpbiBzY2hlZHVsZXIgX18gKi8KQEAgLTEzOTAsNyArMTM5NCw3IEBACiAJCQl9CiAKIAkJCWlmICh0cC0+cmN2X254dCA9PSB0cC0+Y29waWVkX3NlcSAmJgotCQkJICAgIHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKKwkJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CiBkb19wcmVxdWV1ZToKIAkJCQl0Y3BfcHJlcXVldWVfcHJvY2Vzcyhzayk7CiAKQEAgLTE0NzIsNyArMTQ3Niw3IEBACiAJfSB3aGlsZSAobGVuID4gMCk7CiAKIAlpZiAodXNlcl9yZWN2KSB7Ci0JCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CisJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+dWNvcHkucHJlcXVldWUpKSB7CiAJCQlpbnQgY2h1bms7CiAKIAkJCXRwLT51Y29weS5sZW4gPSBjb3BpZWQgPiAwID8gbGVuIDogMDsKQEAgLTE5MjcsNiArMTkzMSwyNSBAQAogCQlyZXR1cm4gdHAtPmFmX3NwZWNpZmljLT5zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwKIAkJCQkJCSAgIG9wdHZhbCwgb3B0bGVuKTsKIAorCS8qIFRoaXMgaXMgYSBzdHJpbmcgdmFsdWUgYWxsIHRoZSBvdGhlcnMgYXJlIGludCdzICovCisJaWYgKG9wdG5hbWUgPT0gVENQX0NPTkdFU1RJT04pIHsKKwkJY2hhciBuYW1lW1RDUF9DQV9OQU1FX01BWF07CisKKwkJaWYgKG9wdGxlbiA8IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl2YWwgPSBzdHJuY3B5X2Zyb21fdXNlcihuYW1lLCBvcHR2YWwsCisJCQkJCW1pbihUQ1BfQ0FfTkFNRV9NQVgtMSwgb3B0bGVuKSk7CisJCWlmICh2YWwgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW5hbWVbdmFsXSA9IDA7CisKKwkJbG9ja19zb2NrKHNrKTsKKwkJZXJyID0gdGNwX3NldF9jb25nZXN0aW9uX2NvbnRyb2wodHAsIG5hbWUpOworCQlyZWxlYXNlX3NvY2soc2spOworCQlyZXR1cm4gZXJyOworCX0KKwogCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTIxMDksNyArMjEzMiw3IEBACiAKIAlpbmZvLT50Y3BpX3J0byA9IGppZmZpZXNfdG9fdXNlY3ModHAtPnJ0byk7CiAJaW5mby0+dGNwaV9hdG8gPSBqaWZmaWVzX3RvX3VzZWNzKHRwLT5hY2suYXRvKTsKLQlpbmZvLT50Y3BpX3NuZF9tc3MgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwlpbmZvLT50Y3BpX3NuZF9tc3MgPSB0cC0+bXNzX2NhY2hlOwogCWluZm8tPnRjcGlfcmN2X21zcyA9IHRwLT5hY2sucmN2X21zczsKIAogCWluZm8tPnRjcGlfdW5hY2tlZCA9IHRwLT5wYWNrZXRzX291dDsKQEAgLTIxNTksNyArMjE4Miw3IEBACiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIFRDUF9NQVhTRUc6Ci0JCXZhbCA9IHRwLT5tc3NfY2FjaGVfc3RkOworCQl2YWwgPSB0cC0+bXNzX2NhY2hlOwogCQlpZiAoIXZhbCAmJiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX0NMT1NFIHwgVENQRl9MSVNURU4pKSkKIAkJCXZhbCA9IHRwLT5yeF9vcHQudXNlcl9tc3M7CiAJCWJyZWFrOwpAQCAtMjIxMSw2ICsyMjM0LDE2IEBACiAJY2FzZSBUQ1BfUVVJQ0tBQ0s6CiAJCXZhbCA9ICF0cC0+YWNrLnBpbmdwb25nOwogCQlicmVhazsKKworCWNhc2UgVENQX0NPTkdFU1RJT046CisJCWlmIChnZXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sIFRDUF9DQV9OQU1FX01BWCk7CisJCWlmIChwdXRfdXNlcihsZW4sIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihvcHR2YWwsIHRwLT5jYV9vcHMtPm5hbWUsIGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9OwpAQCAtMjIyNCw3ICsyMjU3LDcgQEAKIAogCiBleHRlcm4gdm9pZCBfX3NrYl9jYl90b29fc21hbGxfZm9yX3RjcChpbnQsIGludCk7Ci1leHRlcm4gdm9pZCB0Y3BkaWFnX2luaXQodm9pZCk7CitleHRlcm4gc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfcmVubzsKIAogc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyB0aGFzaF9lbnRyaWVzOwogc3RhdGljIGludCBfX2luaXQgc2V0X3RoYXNoX2VudHJpZXMoY2hhciAqc3RyKQpAQCAtMjMzMyw2ICsyMzY2LDggQEAKIAlwcmludGsoS0VSTl9JTkZPICJUQ1A6IEhhc2ggdGFibGVzIGNvbmZpZ3VyZWQgIgogCSAgICAgICAiKGVzdGFibGlzaGVkICVkIGJpbmQgJWQpXG4iLAogCSAgICAgICB0Y3BfZWhhc2hfc2l6ZSA8PCAxLCB0Y3BfYmhhc2hfc2l6ZSk7CisKKwl0Y3BfcmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZ0Y3BfcmVubyk7CiB9CiAKIEVYUE9SVF9TWU1CT0wodGNwX2FjY2VwdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfYmljLmMgYi9uZXQvaXB2NC90Y3BfYmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzOGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9iaWMuYwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIEJpbmFyeSBJbmNyZWFzZSBDb25nZXN0aW9uIGNvbnRyb2wgZm9yIFRDUAorICoKKyAqIFRoaXMgaXMgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gb2YgQklDVENQIGluCisgKiBMaXNvbi1YdSwgS2FoYWxlZCBIYXJmb3VzaCwgYW5kIEluam9uZyBSaGVlLgorICogICJCaW5hcnkgSW5jcmVhc2UgQ29uZ2VzdGlvbiBDb250cm9sIGZvciBGYXN0LCBMb25nIERpc3RhbmNlCisgKiAgTmV0d29ya3MiIGluIEluZm9Db21tIDIwMDQKKyAqIEF2YWlsYWJsZSBmcm9tOgorICogIGh0dHA6Ly93d3cuY3NjLm5jc3UuZWR1L2ZhY3VsdHkvcmhlZS9leHBvcnQvYml0Y3AucGRmCisgKgorICogVW5sZXNzIEJJQyBpcyBlbmFibGVkIGFuZCBjb25nZXN0aW9uIHdpbmRvdyBpcyBsYXJnZQorICogdGhpcyBiZWhhdmVzIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBSZW5vLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworCisjZGVmaW5lIEJJQ1RDUF9CRVRBX1NDQUxFICAgIDEwMjQJLyogU2NhbGUgZmFjdG9yIGJldGEgY2FsY3VsYXRpb24KKwkJCQkJICogbWF4X2N3bmQgPSBzbmRfY3duZCAqIGJldGEKKwkJCQkJICovCisjZGVmaW5lIEJJQ1RDUF9CCQk0CSAvKgorCQkJCQkgICogSW4gYmluYXJ5IHNlYXJjaCwKKwkJCQkJICAqIGdvIHRvIHBvaW50IChtYXgrbWluKS9OCisJCQkJCSAgKi8KKworc3RhdGljIGludCBmYXN0X2NvbnZlcmdlbmNlID0gMTsKK3N0YXRpYyBpbnQgbWF4X2luY3JlbWVudCA9IDMyOworc3RhdGljIGludCBsb3dfd2luZG93ID0gMTQ7CitzdGF0aWMgaW50IGJldGEgPSA4MTk7CQkvKiA9IDgxOS8xMDI0IChCSUNUQ1BfQkVUQV9TQ0FMRSkgKi8KK3N0YXRpYyBpbnQgbG93X3V0aWxpemF0aW9uX3RocmVzaG9sZCA9IDE1MzsKK3N0YXRpYyBpbnQgbG93X3V0aWxpemF0aW9uX3BlcmlvZCA9IDI7CitzdGF0aWMgaW50IGluaXRpYWxfc3N0aHJlc2ggPSAxMDA7CitzdGF0aWMgaW50IHNtb290aF9wYXJ0ID0gMjA7CisKK21vZHVsZV9wYXJhbShmYXN0X2NvbnZlcmdlbmNlLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhmYXN0X2NvbnZlcmdlbmNlLCAidHVybiBvbi9vZmYgZmFzdCBjb252ZXJnZW5jZSIpOworbW9kdWxlX3BhcmFtKG1heF9pbmNyZW1lbnQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9pbmNyZW1lbnQsICJMaW1pdCBvbiBpbmNyZW1lbnQgYWxsb3dlZCBkdXJpbmcgYmluYXJ5IHNlYXJjaCIpOworbW9kdWxlX3BhcmFtKGxvd193aW5kb3csIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGxvd193aW5kb3csICJsb3dlciBib3VuZCBvbiBjb25nZXN0aW9uIHdpbmRvdyAoZm9yIFRDUCBmcmllbmRsaW5lc3MpIik7Cittb2R1bGVfcGFyYW0oYmV0YSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYmV0YSwgImJldGEgZm9yIG11bHRpcGxpY2F0aXZlIGluY3JlYXNlIik7Cittb2R1bGVfcGFyYW0obG93X3V0aWxpemF0aW9uX3RocmVzaG9sZCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobG93X3V0aWxpemF0aW9uX3RocmVzaG9sZCwgInBlcmNlbnQgKHNjYWxlZCBieSAxMDI0KSBmb3IgbG93IHV0aWxpemF0aW9uIG1vZGUiKTsKK21vZHVsZV9wYXJhbShsb3dfdXRpbGl6YXRpb25fcGVyaW9kLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhsb3dfdXRpbGl6YXRpb25fcGVyaW9kLCAiaWYgYXZlcmFnZSBkZWxheSBleGNlZWRzIHRoZW4gZ290byB0byBsb3cgdXRpbGl6YXRpb24gbW9kZSAoc2Vjb25kcykiKTsKK21vZHVsZV9wYXJhbShpbml0aWFsX3NzdGhyZXNoLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbml0aWFsX3NzdGhyZXNoLCAiaW5pdGlhbCB2YWx1ZSBvZiBzbG93IHN0YXJ0IHRocmVzaG9sZCIpOworbW9kdWxlX3BhcmFtKHNtb290aF9wYXJ0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhzbW9vdGhfcGFydCwgImxvZyhCLyhCKlNtaW4pKS9sb2coQi8oQi0xKSkrQiwgIyBvZiBSVFQgZnJvbSBXbWF4LUIgdG8gV21heCIpOworCisKKy8qIEJJQyBUQ1AgUGFyYW1ldGVycyAqLworc3RydWN0IGJpY3RjcCB7CisJdTMyCWNudDsJCS8qIGluY3JlYXNlIGN3bmQgYnkgMSBhZnRlciBBQ0tzICovCisJdTMyIAlsYXN0X21heF9jd25kOwkvKiBsYXN0IG1heGltdW0gc25kX2N3bmQgKi8KKwl1MzIJbG9zc19jd25kOwkvKiBjb25nZXN0aW9uIHdpbmRvdyBhdCBsYXN0IGxvc3MgKi8KKwl1MzIJbGFzdF9jd25kOwkvKiB0aGUgbGFzdCBzbmRfY3duZCAqLworCXUzMglsYXN0X3RpbWU7CS8qIHRpbWUgd2hlbiB1cGRhdGVkIGxhc3RfY3duZCAqLworCXUzMglkZWxheV9taW47CS8qIG1pbiBkZWxheSAqLworCXUzMglkZWxheV9tYXg7CS8qIG1heCBkZWxheSAqLworCXUzMglsYXN0X2RlbGF5OworCXU4CWxvd191dGlsaXphdGlvbjsvKiAwOiBoaWdoOyAxOiBsb3cgKi8KKwl1MzIJbG93X3V0aWxpemF0aW9uX3N0YXJ0OwkvKiBzdGFydGluZyB0aW1lIG9mIGxvdyB1dGlsaXphdGlvbiBkZXRlY3Rpb24qLworCXUzMgllcG9jaF9zdGFydDsJLyogYmVnaW5uaW5nIG9mIGFuIGVwb2NoICovCisjZGVmaW5lIEFDS19SQVRJT19TSElGVAk0CisJdTMyCWRlbGF5ZWRfYWNrOwkvKiBlc3RpbWF0ZSB0aGUgcmF0aW8gb2YgUGFja2V0cy9BQ0tzIDw8IDQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaWN0Y3BfcmVzZXQoc3RydWN0IGJpY3RjcCAqY2EpCit7CisJY2EtPmNudCA9IDA7CisJY2EtPmxhc3RfbWF4X2N3bmQgPSAwOworCWNhLT5sb3NzX2N3bmQgPSAwOworCWNhLT5sYXN0X2N3bmQgPSAwOworCWNhLT5sYXN0X3RpbWUgPSAwOworCWNhLT5kZWxheV9taW4gPSAwOworCWNhLT5kZWxheV9tYXggPSAwOworCWNhLT5sYXN0X2RlbGF5ID0gMDsKKwljYS0+bG93X3V0aWxpemF0aW9uID0gMDsKKwljYS0+bG93X3V0aWxpemF0aW9uX3N0YXJ0ID0gMDsKKwljYS0+ZXBvY2hfc3RhcnQgPSAwOworCWNhLT5kZWxheWVkX2FjayA9IDIgPDwgQUNLX1JBVElPX1NISUZUOworfQorCitzdGF0aWMgdm9pZCBiaWN0Y3BfaW5pdChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCWJpY3RjcF9yZXNldCh0Y3BfY2EodHApKTsKKwlpZiAoaW5pdGlhbF9zc3RocmVzaCkKKwkJdHAtPnNuZF9zc3RocmVzaCA9IGluaXRpYWxfc3N0aHJlc2g7Cit9CisKKy8qCisgKiBDb21wdXRlIGNvbmdlc3Rpb24gd2luZG93IHRvIHVzZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpY3RjcF91cGRhdGUoc3RydWN0IGJpY3RjcCAqY2EsIHUzMiBjd25kKQoreworCWlmIChjYS0+bGFzdF9jd25kID09IGN3bmQgJiYKKwkgICAgKHMzMikodGNwX3RpbWVfc3RhbXAgLSBjYS0+bGFzdF90aW1lKSA8PSBIWiAvIDMyKQorCQlyZXR1cm47CisKKwljYS0+bGFzdF9jd25kID0gY3duZDsKKwljYS0+bGFzdF90aW1lID0gdGNwX3RpbWVfc3RhbXA7CisKKwlpZiAoY2EtPmVwb2NoX3N0YXJ0ID09IDApIC8qIHJlY29yZCB0aGUgYmVnaW5uaW5nIG9mIGFuIGVwb2NoICovCisJCWNhLT5lcG9jaF9zdGFydCA9IHRjcF90aW1lX3N0YW1wOworCisJLyogc3RhcnQgb2ZmIG5vcm1hbCAqLworCWlmIChjd25kIDw9IGxvd193aW5kb3cpIHsKKwkJY2EtPmNudCA9IGN3bmQ7CisJCXJldHVybjsKKwl9CisKKwkvKiBiaW5hcnkgaW5jcmVhc2UgKi8KKwlpZiAoY3duZCA8IGNhLT5sYXN0X21heF9jd25kKSB7CisJCV9fdTMyIAlkaXN0ID0gKGNhLT5sYXN0X21heF9jd25kIC0gY3duZCkKKwkJCS8gQklDVENQX0I7CisKKwkJaWYgKGRpc3QgPiBtYXhfaW5jcmVtZW50KQorCQkJLyogbGluZWFyIGluY3JlYXNlICovCisJCQljYS0+Y250ID0gY3duZCAvIG1heF9pbmNyZW1lbnQ7CisJCWVsc2UgaWYgKGRpc3QgPD0gMVUpCisJCQkvKiBiaW5hcnkgc2VhcmNoIGluY3JlYXNlICovCisJCQljYS0+Y250ID0gKGN3bmQgKiBzbW9vdGhfcGFydCkgLyBCSUNUQ1BfQjsKKwkJZWxzZQorCQkJLyogYmluYXJ5IHNlYXJjaCBpbmNyZWFzZSAqLworCQkJY2EtPmNudCA9IGN3bmQgLyBkaXN0OworCX0gZWxzZSB7CisJCS8qIHNsb3cgc3RhcnQgQU1EIGxpbmVhciBpbmNyZWFzZSAqLworCQlpZiAoY3duZCA8IGNhLT5sYXN0X21heF9jd25kICsgQklDVENQX0IpCisJCQkvKiBzbG93IHN0YXJ0ICovCisJCQljYS0+Y250ID0gKGN3bmQgKiBzbW9vdGhfcGFydCkgLyBCSUNUQ1BfQjsKKwkJZWxzZSBpZiAoY3duZCA8IGNhLT5sYXN0X21heF9jd25kICsgbWF4X2luY3JlbWVudCooQklDVENQX0ItMSkpCisJCQkvKiBzbG93IHN0YXJ0ICovCisJCQljYS0+Y250ID0gKGN3bmQgKiAoQklDVENQX0ItMSkpCisJCQkJLyBjd25kLWNhLT5sYXN0X21heF9jd25kOworCQllbHNlCisJCQkvKiBsaW5lYXIgaW5jcmVhc2UgKi8KKwkJCWNhLT5jbnQgPSBjd25kIC8gbWF4X2luY3JlbWVudDsKKwl9CisKKwkvKiBpZiBpbiBzbG93IHN0YXJ0IG9yIGxpbmsgdXRpbGl6YXRpb24gaXMgdmVyeSBsb3cgKi8KKwlpZiAoIGNhLT5sb3NzX2N3bmQgPT0gMCB8fAorCSAgICAgKGN3bmQgPiBjYS0+bG9zc19jd25kICYmIGNhLT5sb3dfdXRpbGl6YXRpb24pKSB7CisJCWlmIChjYS0+Y250ID4gMjApIC8qIGluY3JlYXNlIGN3bmQgNSUgcGVyIFJUVCAqLworCQkJY2EtPmNudCA9IDIwOworCX0KKworCWNhLT5jbnQgPSAoY2EtPmNudCA8PCBBQ0tfUkFUSU9fU0hJRlQpIC8gY2EtPmRlbGF5ZWRfYWNrOworCWlmIChjYS0+Y250ID09IDApCQkJLyogY2Fubm90IGJlIHplcm8gKi8KKwkJY2EtPmNudCA9IDE7Cit9CisKKworLyogRGV0ZWN0IGxvdyB1dGlsaXphdGlvbiBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZSAqLworc3RhdGljIGlubGluZSB2b2lkIGJpY3RjcF9sb3dfdXRpbGl6YXRpb24oc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IGZsYWcpCit7CisJc3RydWN0IGJpY3RjcCAqY2EgPSB0Y3BfY2EodHApOworCXUzMiBkaXN0LCBkZWxheTsKKworCS8qIE5vIHRpbWUgc3RhbXAgKi8KKwlpZiAoISh0cC0+cnhfb3B0LnNhd190c3RhbXAgJiYgdHAtPnJ4X29wdC5yY3ZfdHNlY3IpIHx8CisJICAgICAvKiBEaXNjYXJkIGRlbGF5IHNhbXBsZXMgcmlnaHQgYWZ0ZXIgZmFzdCByZWNvdmVyeSAqLworCSAgICAgdGNwX3RpbWVfc3RhbXAgPCBjYS0+ZXBvY2hfc3RhcnQgKyBIWiB8fAorCSAgICAgLyogdGhpcyBkZWxheSBzYW1wbGVzIG1heSBub3QgYmUgYWNjdXJhdGUgKi8KKwkgICAgIGZsYWcgPT0gMCkgeworCQljYS0+bGFzdF9kZWxheSA9IDA7CisJCWdvdG8gbm90bG93OworCX0KKworCWRlbGF5ID0gY2EtPmxhc3RfZGVsYXk8PDM7CS8qIHVzZSB0aGUgc2FtZSBzY2FsZSBhcyB0cC0+c3J0dCovCisJY2EtPmxhc3RfZGVsYXkgPSB0Y3BfdGltZV9zdGFtcCAtIHRwLT5yeF9vcHQucmN2X3RzZWNyOworCWlmIChkZWxheSA9PSAwKSAJCS8qIG5vIHByZXZpb3VzIGRlbGF5IHNhbXBsZSAqLworCQlnb3RvIG5vdGxvdzsKKworCS8qIGZpcnN0IHRpbWUgY2FsbCBvciBsaW5rIGRlbGF5IGRlY3JlYXNlcyAqLworCWlmIChjYS0+ZGVsYXlfbWluID09IDAgfHwgY2EtPmRlbGF5X21pbiA+IGRlbGF5KSB7CisJCWNhLT5kZWxheV9taW4gPSBjYS0+ZGVsYXlfbWF4ID0gZGVsYXk7CisJCWdvdG8gbm90bG93OworCX0KKworCWlmIChjYS0+ZGVsYXlfbWF4IDwgZGVsYXkpCisJCWNhLT5kZWxheV9tYXggPSBkZWxheTsKKworCS8qIHV0aWxpemF0aW9uIGlzIGxvdywgaWYgYXZnIGRlbGF5IDwgZGlzdCp0aHJlc2hvbGQKKwkgICBmb3IgY2hlY2tpbmdfcGVyaW9kIHRpbWUgKi8KKwlkaXN0ID0gY2EtPmRlbGF5X21heCAtIGNhLT5kZWxheV9taW47CisJaWYgKGRpc3QgPD0gY2EtPmRlbGF5X21pbj4+NiB8fAorCSAgICB0cC0+c3J0dCAtIGNhLT5kZWxheV9taW4gPj0gIChkaXN0Kmxvd191dGlsaXphdGlvbl90aHJlc2hvbGQpPj4xMCkKKwkJZ290byBub3Rsb3c7CisKKwlpZiAoY2EtPmxvd191dGlsaXphdGlvbl9zdGFydCA9PSAwKSB7CisJCWNhLT5sb3dfdXRpbGl6YXRpb24gPSAwOworCQljYS0+bG93X3V0aWxpemF0aW9uX3N0YXJ0ID0gdGNwX3RpbWVfc3RhbXA7CisJfSBlbHNlIGlmICgoczMyKSh0Y3BfdGltZV9zdGFtcCAtIGNhLT5sb3dfdXRpbGl6YXRpb25fc3RhcnQpCisJCQk+IGxvd191dGlsaXphdGlvbl9wZXJpb2QqSFopIHsKKwkJY2EtPmxvd191dGlsaXphdGlvbiA9IDE7CisJfQorCisJcmV0dXJuOworCisgbm90bG93OgorCWNhLT5sb3dfdXRpbGl6YXRpb24gPSAwOworCWNhLT5sb3dfdXRpbGl6YXRpb25fc3RhcnQgPSAwOworCit9CisKK3N0YXRpYyB2b2lkIGJpY3RjcF9jb25nX2F2b2lkKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhY2ssCisJCQkgICAgICB1MzIgc2VxX3J0dCwgdTMyIGluX2ZsaWdodCwgaW50IGRhdGFfYWNrZWQpCit7CisJc3RydWN0IGJpY3RjcCAqY2EgPSB0Y3BfY2EodHApOworCisJYmljdGNwX2xvd191dGlsaXphdGlvbih0cCwgZGF0YV9hY2tlZCk7CisKKwlpZiAoaW5fZmxpZ2h0IDwgdHAtPnNuZF9jd25kKQorCQlyZXR1cm47CisKKwlpZiAodHAtPnNuZF9jd25kIDw9IHRwLT5zbmRfc3N0aHJlc2gpIHsKKwkJLyogSW4gInNhZmUiIGFyZWEsIGluY3JlYXNlLiAqLworCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQorCQkJdHAtPnNuZF9jd25kKys7CisJfSBlbHNlIHsKKwkJYmljdGNwX3VwZGF0ZShjYSwgdHAtPnNuZF9jd25kKTsKKworICAgICAgICAgICAgICAgIC8qIEluIGRhbmdlcm91cyBhcmVhLCBpbmNyZWFzZSBzbG93bHkuCisJCSAqIEluIHRoZW9yeSB0aGlzIGlzIHRwLT5zbmRfY3duZCArPSAxIC8gdHAtPnNuZF9jd25kCisJCSAqLworCQlpZiAodHAtPnNuZF9jd25kX2NudCA+PSBjYS0+Y250KSB7CisJCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQorCQkJCXRwLT5zbmRfY3duZCsrOworCQkJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJCX0gZWxzZQorCQkJdHAtPnNuZF9jd25kX2NudCsrOworCX0KKworfQorCisvKgorICoJYmVoYXZlIGxpa2UgUmVubyB1bnRpbCBsb3dfd2luZG93IGlzIHJlYWNoZWQsCisgKgl0aGVuIGluY3JlYXNlIGNvbmdlc3Rpb24gd2luZG93IHNsb3dseQorICovCitzdGF0aWMgdTMyIGJpY3RjcF9yZWNhbGNfc3N0aHJlc2goc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgYmljdGNwICpjYSA9IHRjcF9jYSh0cCk7CisKKwljYS0+ZXBvY2hfc3RhcnQgPSAwOwkvKiBlbmQgb2YgZXBvY2ggKi8KKworCS8qIGluIGNhc2Ugb2Ygd3JvbmcgZGVsYXlfbWF4Ki8KKwlpZiAoY2EtPmRlbGF5X21pbiA+IDAgJiYgY2EtPmRlbGF5X21heCA+IGNhLT5kZWxheV9taW4pCisJCWNhLT5kZWxheV9tYXggPSBjYS0+ZGVsYXlfbWluCisJCQkrICgoY2EtPmRlbGF5X21heCAtIGNhLT5kZWxheV9taW4pKiA5MCkgLyAxMDA7CisKKwkvKiBXbWF4IGFuZCBmYXN0IGNvbnZlcmdlbmNlICovCisJaWYgKHRwLT5zbmRfY3duZCA8IGNhLT5sYXN0X21heF9jd25kICYmIGZhc3RfY29udmVyZ2VuY2UpCisJCWNhLT5sYXN0X21heF9jd25kID0gKHRwLT5zbmRfY3duZCAqIChCSUNUQ1BfQkVUQV9TQ0FMRSArIGJldGEpKQorCQkJLyAoMiAqIEJJQ1RDUF9CRVRBX1NDQUxFKTsKKwllbHNlCisJCWNhLT5sYXN0X21heF9jd25kID0gdHAtPnNuZF9jd25kOworCisJY2EtPmxvc3NfY3duZCA9IHRwLT5zbmRfY3duZDsKKworCisJaWYgKHRwLT5zbmRfY3duZCA8PSBsb3dfd2luZG93KQorCQlyZXR1cm4gbWF4KHRwLT5zbmRfY3duZCA+PiAxVSwgMlUpOworCWVsc2UKKwkJcmV0dXJuIG1heCgodHAtPnNuZF9jd25kICogYmV0YSkgLyBCSUNUQ1BfQkVUQV9TQ0FMRSwgMlUpOworfQorCitzdGF0aWMgdTMyIGJpY3RjcF91bmRvX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgYmljdGNwICpjYSA9IHRjcF9jYSh0cCk7CisKKwlyZXR1cm4gbWF4KHRwLT5zbmRfY3duZCwgY2EtPmxhc3RfbWF4X2N3bmQpOworfQorCitzdGF0aWMgdTMyIGJpY3RjcF9taW5fY3duZChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXJldHVybiB0cC0+c25kX3NzdGhyZXNoOworfQorCitzdGF0aWMgdm9pZCBiaWN0Y3Bfc3RhdGUoc3RydWN0IHRjcF9zb2NrICp0cCwgdTggbmV3X3N0YXRlKQoreworCWlmIChuZXdfc3RhdGUgPT0gVENQX0NBX0xvc3MpCisJCWJpY3RjcF9yZXNldCh0Y3BfY2EodHApKTsKK30KKworLyogVHJhY2sgZGVsYXllZCBhY2tub3dsZWRnZW1lbnQgcmF0aW8gdXNpbmcgc2xpZGluZyB3aW5kb3cKKyAqIHJhdGlvID0gKDE1KnJhdGlvICsgc2FtcGxlKSAvIDE2CisgKi8KK3N0YXRpYyB2b2lkIGJpY3RjcF9hY2tlZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgY250KQoreworCWlmIChjbnQgPiAwICYmIAl0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX09wZW4pIHsKKwkJc3RydWN0IGJpY3RjcCAqY2EgPSB0Y3BfY2EodHApOworCQljbnQgLT0gY2EtPmRlbGF5ZWRfYWNrID4+IEFDS19SQVRJT19TSElGVDsKKwkJY2EtPmRlbGF5ZWRfYWNrICs9IGNudDsKKwl9Cit9CisKKworc3RhdGljIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgYmljdGNwID0geworCS5pbml0CQk9IGJpY3RjcF9pbml0LAorCS5zc3RocmVzaAk9IGJpY3RjcF9yZWNhbGNfc3N0aHJlc2gsCisJLmNvbmdfYXZvaWQJPSBiaWN0Y3BfY29uZ19hdm9pZCwKKwkuc2V0X3N0YXRlCT0gYmljdGNwX3N0YXRlLAorCS51bmRvX2N3bmQJPSBiaWN0Y3BfdW5kb19jd25kLAorCS5taW5fY3duZAk9IGJpY3RjcF9taW5fY3duZCwKKwkucGt0c19hY2tlZCAgICAgPSBiaWN0Y3BfYWNrZWQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJiaWMiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmljdGNwX3JlZ2lzdGVyKHZvaWQpCit7CisJQlVHX09OKHNpemVvZihzdHJ1Y3QgYmljdGNwKSA+IFRDUF9DQV9QUklWX1NJWkUpOworCXJldHVybiB0Y3BfcmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZiaWN0Y3ApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmljdGNwX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0Y3BfdW5yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJmJpY3RjcCk7Cit9CisKK21vZHVsZV9pbml0KGJpY3RjcF9yZWdpc3Rlcik7Cittb2R1bGVfZXhpdChiaWN0Y3BfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gSGVtbWluZ2VyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJJQyBUQ1AiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9jb25nLmMgYi9uZXQvaXB2NC90Y3BfY29uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NzBkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfY29uZy5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogUGx1Z2FibGUgVENQIGNvbmdlc3Rpb24gY29udHJvbCBzdXBwb3J0IGFuZCBuZXdSZW5vCisgKiBjb25nZXN0aW9uIGNvbnRyb2wuCisgKiBCYXNlZCBvbiBpZGVhcyBmcm9tIEkvTyBzY2hlZHVsZXIgc3Vwb3J0IGFuZCBXZWIxMDAuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFN0ZXBoZW4gSGVtbWluZ2VyIDxzaGVtbWluZ2VyQG9zZGwub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfY29uZ19saXN0X2xvY2spOworc3RhdGljIExJU1RfSEVBRCh0Y3BfY29uZ19saXN0KTsKKworLyogU2ltcGxlIGxpbmVhciBzZWFyY2gsIGRvbid0IGV4cGVjdCBtYW55IGVudHJpZXMhICovCitzdGF0aWMgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyAqdGNwX2NhX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICplOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZSwgJnRjcF9jb25nX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcChlLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIGU7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBdHRhY2ggbmV3IGNvbmdlc3Rpb24gY29udHJvbCBhbGdvcnRoaW0gdG8gdGhlIGxpc3QKKyAqIG9mIGF2YWlsYWJsZSBvcHRpb25zLgorICovCitpbnQgdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbChzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qIGFsbCBhbGdvcml0aG1zIG11c3QgaW1wbGVtZW50IHNzdGhyZXNoIGFuZCBjb25nX2F2b2lkIG9wcyAqLworCWlmICghY2EtPnNzdGhyZXNoIHx8ICFjYS0+Y29uZ19hdm9pZCB8fCAhY2EtPm1pbl9jd25kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVENQICVzIGRvZXMgbm90IGltcGxlbWVudCByZXF1aXJlZCBvcHNcbiIsCisJCSAgICAgICBjYS0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKKwlpZiAodGNwX2NhX2ZpbmQoY2EtPm5hbWUpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiVENQICVzIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgY2EtPm5hbWUpOworCQlyZXQgPSAtRUVYSVNUOworCX0gZWxzZSB7CisJCWxpc3RfYWRkX3JjdSgmY2EtPmxpc3QsICZ0Y3BfY29uZ19saXN0KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVENQICVzIHJlZ2lzdGVyZWRcbiIsIGNhLT5uYW1lKTsKKwl9CisJc3Bpbl91bmxvY2soJnRjcF9jb25nX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwodGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCk7CisKKy8qCisgKiBSZW1vdmUgY29uZ2VzdGlvbiBjb250cm9sIGFsZ29yaXRobSwgY2FsbGVkIGZyb20KKyAqIHRoZSBtb2R1bGUncyByZW1vdmUgZnVuY3Rpb24uICBNb2R1bGUgcmVmIGNvdW50cyBhcmUgdXNlZAorICogdG8gZW5zdXJlIHRoYXQgdGhpcyBjYW4ndCBiZSBkb25lIHRpbGwgYWxsIHNvY2tldHMgdXNpbmcKKyAqIHRoYXQgbWV0aG9kIGFyZSBjbG9zZWQuCisgKi8KK3ZvaWQgdGNwX3VucmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhKQoreworCXNwaW5fbG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbF9yY3UoJmNhLT5saXN0KTsKKwlzcGluX3VubG9jaygmdGNwX2NvbmdfbGlzdF9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCk7CisKKy8qIEFzc2lnbiBjaG9pY2Ugb2YgY29uZ2VzdGlvbiBjb250cm9sLiAqLwordm9pZCB0Y3BfaW5pdF9jb25nZXN0aW9uX2NvbnRyb2woc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYTsKKworCWlmICh0cC0+Y2Ffb3BzICE9ICZ0Y3BfaW5pdF9jb25nZXN0aW9uX29wcykKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNhLCAmdGNwX2NvbmdfbGlzdCwgbGlzdCkgeworCQlpZiAodHJ5X21vZHVsZV9nZXQoY2EtPm93bmVyKSkgeworCQkJdHAtPmNhX29wcyA9IGNhOworCQkJYnJlYWs7CisJCX0KKworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICh0cC0+Y2Ffb3BzLT5pbml0KQorCQl0cC0+Y2Ffb3BzLT5pbml0KHRwKTsKK30KKworLyogTWFuYWdlIHJlZmNvdW50cyBvbiBzb2NrZXQgY2xvc2UuICovCit2b2lkIHRjcF9jbGVhbnVwX2Nvbmdlc3Rpb25fY29udHJvbChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCWlmICh0cC0+Y2Ffb3BzLT5yZWxlYXNlKQorCQl0cC0+Y2Ffb3BzLT5yZWxlYXNlKHRwKTsKKwltb2R1bGVfcHV0KHRwLT5jYV9vcHMtPm93bmVyKTsKK30KKworLyogVXNlZCBieSBzeXNjdGwgdG8gY2hhbmdlIGRlZmF1bHQgY29uZ2VzdGlvbiBjb250cm9sICovCitpbnQgdGNwX3NldF9kZWZhdWx0X2Nvbmdlc3Rpb25fY29udHJvbChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhOworCWludCByZXQgPSAtRU5PRU5UOworCisJc3Bpbl9sb2NrKCZ0Y3BfY29uZ19saXN0X2xvY2spOworCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CisjaWZkZWYgQ09ORklHX0tNT0QKKwlpZiAoIWNhKSB7CisJCXNwaW5fdW5sb2NrKCZ0Y3BfY29uZ19saXN0X2xvY2spOworCisJCXJlcXVlc3RfbW9kdWxlKCJ0Y3BfJXMiLCBuYW1lKTsKKwkJc3Bpbl9sb2NrKCZ0Y3BfY29uZ19saXN0X2xvY2spOworCQljYSA9IHRjcF9jYV9maW5kKG5hbWUpOworCX0KKyNlbmRpZgorCisJaWYgKGNhKSB7CisJCWxpc3RfbW92ZSgmY2EtPmxpc3QsICZ0Y3BfY29uZ19saXN0KTsKKwkJcmV0ID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJnRjcF9jb25nX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBHZXQgY3VycmVudCBkZWZhdWx0IGNvbmdlc3Rpb24gY29udHJvbCAqLwordm9pZCB0Y3BfZ2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyAqY2E7CisJLyogV2Ugd2lsbCBhbHdheXMgaGF2ZSByZW5vLi4uICovCisJQlVHX09OKGxpc3RfZW1wdHkoJnRjcF9jb25nX2xpc3QpKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwljYSA9IGxpc3RfZW50cnkodGNwX2NvbmdfbGlzdC5uZXh0LCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzLCBsaXN0KTsKKwlzdHJuY3B5KG5hbWUsIGNhLT5uYW1lLCBUQ1BfQ0FfTkFNRV9NQVgpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCisvKiBDaGFuZ2UgY29uZ2VzdGlvbiBjb250cm9sIGZvciBzb2NrZXQgKi8KK2ludCB0Y3Bfc2V0X2Nvbmdlc3Rpb25fY29udHJvbChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhOworCWludCBlcnIgPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWNhID0gdGNwX2NhX2ZpbmQobmFtZSk7CisJaWYgKGNhID09IHRwLT5jYV9vcHMpCisJCWdvdG8gb3V0OworCisJaWYgKCFjYSkKKwkJZXJyID0gLUVOT0VOVDsKKworCWVsc2UgaWYgKCF0cnlfbW9kdWxlX2dldChjYS0+b3duZXIpKQorCQllcnIgPSAtRUJVU1k7CisKKwllbHNlIHsKKwkJdGNwX2NsZWFudXBfY29uZ2VzdGlvbl9jb250cm9sKHRwKTsKKwkJdHAtPmNhX29wcyA9IGNhOworCQlpZiAodHAtPmNhX29wcy0+aW5pdCkKKwkJCXRwLT5jYV9vcHMtPmluaXQodHApOworCX0KKyBvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRDUCBSZW5vIGNvbmdlc3Rpb24gY29udHJvbAorICogVGhpcyBpcyBzcGVjaWFsIGNhc2UgdXNlZCBmb3IgZmFsbGJhY2sgYXMgd2VsbC4KKyAqLworLyogVGhpcyBpcyBKYWNvYnNvbidzIHNsb3cgc3RhcnQgYW5kIGNvbmdlc3Rpb24gYXZvaWRhbmNlLgorICogU0lHQ09NTSAnODgsIHAuIDMyOC4KKyAqLwordm9pZCB0Y3BfcmVub19jb25nX2F2b2lkKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhY2ssIHUzMiBydHQsIHUzMiBpbl9mbGlnaHQsCisJCQkgaW50IGZsYWcpCit7CisJaWYgKGluX2ZsaWdodCA8IHRwLT5zbmRfY3duZCkKKwkJcmV0dXJuOworCisgICAgICAgIGlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkgeworICAgICAgICAgICAgICAgIC8qIEluICJzYWZlIiBhcmVhLCBpbmNyZWFzZS4gKi8KKwkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKKwkJCXRwLT5zbmRfY3duZCsrOworCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSW4gZGFuZ2Vyb3VzIGFyZWEsIGluY3JlYXNlIHNsb3dseS4KKwkJICogSW4gdGhlb3J5IHRoaXMgaXMgdHAtPnNuZF9jd25kICs9IDEgLyB0cC0+c25kX2N3bmQKKwkJICovCisJCWlmICh0cC0+c25kX2N3bmRfY250ID49IHRwLT5zbmRfY3duZCkgeworCQkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKKwkJCQl0cC0+c25kX2N3bmQrKzsKKwkJCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCQl9IGVsc2UKKwkJCXRwLT5zbmRfY3duZF9jbnQrKzsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0Y3BfcmVub19jb25nX2F2b2lkKTsKKworLyogU2xvdyBzdGFydCB0aHJlc2hvbGQgaXMgaGFsZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgKG1pbiAyKSAqLwordTMyIHRjcF9yZW5vX3NzdGhyZXNoKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIG1heCh0cC0+c25kX2N3bmQgPj4gMVUsIDJVKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRjcF9yZW5vX3NzdGhyZXNoKTsKKworLyogTG93ZXIgYm91bmQgb24gY29uZ2VzdGlvbiB3aW5kb3cuICovCit1MzIgdGNwX3Jlbm9fbWluX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlyZXR1cm4gdHAtPnNuZF9zc3RocmVzaC8yOworfQorRVhQT1JUX1NZTUJPTF9HUEwodGNwX3Jlbm9fbWluX2N3bmQpOworCitzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9yZW5vID0geworCS5uYW1lCQk9ICJyZW5vIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnNzdGhyZXNoCT0gdGNwX3Jlbm9fc3N0aHJlc2gsCisJLmNvbmdfYXZvaWQJPSB0Y3BfcmVub19jb25nX2F2b2lkLAorCS5taW5fY3duZAk9IHRjcF9yZW5vX21pbl9jd25kLAorfTsKKworLyogSW5pdGlhbCBjb25nZXN0aW9uIGNvbnRyb2wgdXNlZCAodW50aWwgU1lOKQorICogcmVhbGx5IHJlbm8gdW5kZXIgYW5vdGhlciBuYW1lIHNvIHdlIGNhbiB0ZWxsIGRpZmZlcmVuY2UKKyAqIGR1cmluZyB0Y3Bfc2V0X2RlZmF1bHRfY29uZ2VzdGlvbl9jb250cm9sCisgKi8KK3N0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX2luaXRfY29uZ2VzdGlvbl9vcHMgID0geworCS5uYW1lCQk9ICIiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuc3N0aHJlc2gJPSB0Y3BfcmVub19zc3RocmVzaCwKKwkuY29uZ19hdm9pZAk9IHRjcF9yZW5vX2NvbmdfYXZvaWQsCisJLm1pbl9jd25kCT0gdGNwX3Jlbm9fbWluX2N3bmQsCit9OworRVhQT1JUX1NZTUJPTF9HUEwodGNwX2luaXRfY29uZ2VzdGlvbl9vcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2RpYWcuYyBiL25ldC9pcHY0L3RjcF9kaWFnLmMKaW5kZXggNjM0YmVmYy4uZjY2OTQ1YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2RpYWcuYworKysgYi9uZXQvaXB2NC90Y3BfZGlhZy5jCkBAIC00MiwxNSArNDIsOCBAQAogCiBzdGF0aWMgc3RydWN0IHNvY2sgKnRjcG5sOwogCi0KICNkZWZpbmUgVENQRElBR19QVVQoc2tiLCBhdHRydHlwZSwgYXR0cmxlbikgXAotKHsgaW50IHJ0YWxlbiA9IFJUQV9MRU5HVEgoYXR0cmxlbik7ICAgICAgICBcCi0gICBzdHJ1Y3QgcnRhdHRyICpydGE7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIGlmIChza2JfdGFpbHJvb20oc2tiKSA8IFJUQV9BTElHTihydGFsZW4pKSBnb3RvIG5sbXNnX2ZhaWx1cmU7IFwKLSAgIHJ0YSA9ICh2b2lkKilfX3NrYl9wdXQoc2tiLCBSVEFfQUxJR04ocnRhbGVuKSk7IFwKLSAgIHJ0YS0+cnRhX3R5cGUgPSBhdHRydHlwZTsgICAgICAgICAgICAgICAgXAotICAgcnRhLT5ydGFfbGVuID0gcnRhbGVuOyAgICAgICAgICAgICAgICAgICBcCi0gICBSVEFfREFUQShydGEpOyB9KQorCVJUQV9EQVRBKF9fUlRBX1BVVChza2IsIGF0dHJ0eXBlLCBhdHRybGVuKSkKIAogc3RhdGljIGludCB0Y3BkaWFnX2ZpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLAogCQkJaW50IGV4dCwgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzKQpAQCAtNjEsNyArNTQsNiBAQAogCXN0cnVjdCBubG1zZ2hkciAgKm5saDsKIAlzdHJ1Y3QgdGNwX2luZm8gICppbmZvID0gTlVMTDsKIAlzdHJ1Y3QgdGNwZGlhZ19tZW1pbmZvICAqbWluZm8gPSBOVUxMOwotCXN0cnVjdCB0Y3B2ZWdhc19pbmZvICp2aW5mbyA9IE5VTEw7CiAJdW5zaWduZWQgY2hhcgkgKmIgPSBza2ItPnRhaWw7CiAKIAlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgVENQRElBR19HRVRTT0NLLCBzaXplb2YoKnIpKTsKQEAgLTczLDkgKzY1LDExIEBACiAJCWlmIChleHQgJiAoMTw8KFRDUERJQUdfSU5GTy0xKSkpCiAJCQlpbmZvID0gVENQRElBR19QVVQoc2tiLCBUQ1BESUFHX0lORk8sIHNpemVvZigqaW5mbykpOwogCQkKLQkJaWYgKCh0Y3BfaXNfd2VzdHdvb2QodHApIHx8IHRjcF9pc192ZWdhcyh0cCkpCi0JCSAgICAmJiAoZXh0ICYgKDE8PChUQ1BESUFHX1ZFR0FTSU5GTy0xKSkpKQotCQkJdmluZm8gPSBUQ1BESUFHX1BVVChza2IsIFRDUERJQUdfVkVHQVNJTkZPLCBzaXplb2YoKnZpbmZvKSk7CisJCWlmIChleHQgJiAoMTw8KFRDUERJQUdfQ09ORy0xKSkpIHsKKwkJCXNpemVfdCBsZW4gPSBzdHJsZW4odHAtPmNhX29wcy0+bmFtZSk7CisJCQlzdHJjcHkoVENQRElBR19QVVQoc2tiLCBUQ1BESUFHX0NPTkcsIGxlbisxKSwKKwkJCSAgICAgICB0cC0+Y2Ffb3BzLT5uYW1lKTsKKwkJfQogCX0KIAlyLT50Y3BkaWFnX2ZhbWlseSA9IHNrLT5za19mYW1pbHk7CiAJci0+dGNwZGlhZ19zdGF0ZSA9IHNrLT5za19zdGF0ZTsKQEAgLTE2NiwyMyArMTYwLDEzIEBACiAJaWYgKGluZm8pIAogCQl0Y3BfZ2V0X2luZm8oc2ssIGluZm8pOwogCi0JaWYgKHZpbmZvKSB7Ci0JCWlmICh0Y3BfaXNfdmVnYXModHApKSB7Ci0JCQl2aW5mby0+dGNwdl9lbmFibGVkID0gdHAtPnZlZ2FzLmRvaW5nX3ZlZ2FzX25vdzsKLQkJCXZpbmZvLT50Y3B2X3J0dGNudCA9IHRwLT52ZWdhcy5jbnRSVFQ7Ci0JCQl2aW5mby0+dGNwdl9ydHQgPSBqaWZmaWVzX3RvX3VzZWNzKHRwLT52ZWdhcy5iYXNlUlRUKTsKLQkJCXZpbmZvLT50Y3B2X21pbnJ0dCA9IGppZmZpZXNfdG9fdXNlY3ModHAtPnZlZ2FzLm1pblJUVCk7Ci0JCX0gZWxzZSB7Ci0JCQl2aW5mby0+dGNwdl9lbmFibGVkID0gMDsKLQkJCXZpbmZvLT50Y3B2X3J0dGNudCA9IDA7Ci0JCQl2aW5mby0+dGNwdl9ydHQgPSBqaWZmaWVzX3RvX3VzZWNzKHRwLT53ZXN0d29vZC5ydHQpOwotCQkJdmluZm8tPnRjcHZfbWlucnR0ID0gamlmZmllc190b191c2Vjcyh0cC0+d2VzdHdvb2QucnR0X21pbik7Ci0JCX0KLQl9CisJaWYgKHNrLT5za19zdGF0ZSA8IFRDUF9USU1FX1dBSVQgJiYgdHAtPmNhX29wcy0+Z2V0X2luZm8pCisJCXRwLT5jYV9vcHMtPmdldF9pbmZvKHRwLCBleHQsIHNrYik7CiAKIAlubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIGI7CiAJcmV0dXJuIHNrYi0+bGVuOwogCitydGF0dHJfZmFpbHVyZToKIG5sbXNnX2ZhaWx1cmU6CiAJc2tiX3RyaW0oc2tiLCBiIC0gc2tiLT5kYXRhKTsKIAlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaGlnaHNwZWVkLmMgYi9uZXQvaXB2NC90Y3BfaGlnaHNwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjNTFmOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9oaWdoc3BlZWQuYwpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIFNhbGx5IEZsb3lkJ3MgSGlnaCBTcGVlZCBUQ1AgKFJGQyAzNjQ5KSBjb25nZXN0aW9uIGNvbnRyb2wKKyAqCisgKiBTZWUgaHR0cDovL3d3dy5pY2lyLm9yZy9mbG95ZC9oc3RjcC5odG1sCisgKgorICogSm9obiBIZWZmbmVyIDxqaGVmZm5lckBwc2MuZWR1PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKworLyogRnJvbSBBSU1EIHRhYmxlcyBmcm9tIFJGQyAzNjQ5IGFwcGVuZGl4IEIsCisgKiB3aXRoIGZpeGVkLXBvaW50IE1EIHNjYWxlZCA8PDguCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHN0Y3BfYWltZF92YWwgeworICAgICAgICB1bnNpZ25lZCBpbnQgY3duZDsKKyAgICAgICAgdW5zaWduZWQgaW50IG1kOworfSBoc3RjcF9haW1kX3ZhbHNbXSA9IHsKKyB7ICAgICAzOCwgIDEyOCwgLyogIDAuNTAgKi8gfSwKKyB7ICAgIDExOCwgIDExMiwgLyogIDAuNDQgKi8gfSwKKyB7ICAgIDIyMSwgIDEwNCwgLyogIDAuNDEgKi8gfSwKKyB7ICAgIDM0NywgICA5OCwgLyogIDAuMzggKi8gfSwKKyB7ICAgIDQ5NSwgICA5MywgLyogIDAuMzcgKi8gfSwKKyB7ICAgIDY2MywgICA4OSwgLyogIDAuMzUgKi8gfSwKKyB7ICAgIDg1MSwgICA4NiwgLyogIDAuMzQgKi8gfSwKKyB7ICAgMTA1OCwgICA4MywgLyogIDAuMzMgKi8gfSwKKyB7ICAgMTI4NCwgICA4MSwgLyogIDAuMzIgKi8gfSwKKyB7ICAgMTUyOSwgICA3OCwgLyogIDAuMzEgKi8gfSwKKyB7ICAgMTc5MywgICA3NiwgLyogIDAuMzAgKi8gfSwKKyB7ICAgMjA3NiwgICA3NCwgLyogIDAuMjkgKi8gfSwKKyB7ICAgMjM3OCwgICA3MiwgLyogIDAuMjggKi8gfSwKKyB7ICAgMjY5OSwgICA3MSwgLyogIDAuMjggKi8gfSwKKyB7ICAgMzAzOSwgICA2OSwgLyogIDAuMjcgKi8gfSwKKyB7ICAgMzM5OSwgICA2OCwgLyogIDAuMjcgKi8gfSwKKyB7ICAgMzc3OCwgICA2NiwgLyogIDAuMjYgKi8gfSwKKyB7ICAgNDE3NywgICA2NSwgLyogIDAuMjYgKi8gfSwKKyB7ICAgNDU5NiwgICA2NCwgLyogIDAuMjUgKi8gfSwKKyB7ICAgNTAzNiwgICA2MiwgLyogIDAuMjUgKi8gfSwKKyB7ICAgNTQ5NywgICA2MSwgLyogIDAuMjQgKi8gfSwKKyB7ICAgNTk3OSwgICA2MCwgLyogIDAuMjQgKi8gfSwKKyB7ICAgNjQ4MywgICA1OSwgLyogIDAuMjMgKi8gfSwKKyB7ICAgNzAwOSwgICA1OCwgLyogIDAuMjMgKi8gfSwKKyB7ICAgNzU1OCwgICA1NywgLyogIDAuMjIgKi8gfSwKKyB7ICAgODEzMCwgICA1NiwgLyogIDAuMjIgKi8gfSwKKyB7ICAgODcyNiwgICA1NSwgLyogIDAuMjIgKi8gfSwKKyB7ICAgOTM0NiwgICA1NCwgLyogIDAuMjEgKi8gfSwKKyB7ICAgOTk5MSwgICA1MywgLyogIDAuMjEgKi8gfSwKKyB7ICAxMDY2MSwgICA1MiwgLyogIDAuMjEgKi8gfSwKKyB7ICAxMTM1OCwgICA1MiwgLyogIDAuMjAgKi8gfSwKKyB7ICAxMjA4MiwgICA1MSwgLyogIDAuMjAgKi8gfSwKKyB7ICAxMjgzNCwgICA1MCwgLyogIDAuMjAgKi8gfSwKKyB7ICAxMzYxNCwgICA0OSwgLyogIDAuMTkgKi8gfSwKKyB7ICAxNDQyNCwgICA0OCwgLyogIDAuMTkgKi8gfSwKKyB7ICAxNTI2NSwgICA0OCwgLyogIDAuMTkgKi8gfSwKKyB7ICAxNjEzNywgICA0NywgLyogIDAuMTkgKi8gfSwKKyB7ICAxNzA0MiwgICA0NiwgLyogIDAuMTggKi8gfSwKKyB7ICAxNzk4MSwgICA0NSwgLyogIDAuMTggKi8gfSwKKyB7ICAxODk1NSwgICA0NSwgLyogIDAuMTggKi8gfSwKKyB7ICAxOTk2NSwgICA0NCwgLyogIDAuMTcgKi8gfSwKKyB7ICAyMTAxMywgICA0MywgLyogIDAuMTcgKi8gfSwKKyB7ICAyMjEwMSwgICA0MywgLyogIDAuMTcgKi8gfSwKKyB7ICAyMzIzMCwgICA0MiwgLyogIDAuMTcgKi8gfSwKKyB7ICAyNDQwMiwgICA0MSwgLyogIDAuMTYgKi8gfSwKKyB7ICAyNTYxOCwgICA0MSwgLyogIDAuMTYgKi8gfSwKKyB7ICAyNjg4MSwgICA0MCwgLyogIDAuMTYgKi8gfSwKKyB7ICAyODE5MywgICAzOSwgLyogIDAuMTYgKi8gfSwKKyB7ICAyOTU1NywgICAzOSwgLyogIDAuMTUgKi8gfSwKKyB7ICAzMDk3NSwgICAzOCwgLyogIDAuMTUgKi8gfSwKKyB7ICAzMjQ1MCwgICAzOCwgLyogIDAuMTUgKi8gfSwKKyB7ICAzMzk4NiwgICAzNywgLyogIDAuMTUgKi8gfSwKKyB7ICAzNTU4NiwgICAzNiwgLyogIDAuMTQgKi8gfSwKKyB7ICAzNzI1MywgICAzNiwgLyogIDAuMTQgKi8gfSwKKyB7ICAzODk5MiwgICAzNSwgLyogIDAuMTQgKi8gfSwKKyB7ICA0MDgwOCwgICAzNSwgLyogIDAuMTQgKi8gfSwKKyB7ICA0MjcwNywgICAzNCwgLyogIDAuMTMgKi8gfSwKKyB7ICA0NDY5NCwgICAzMywgLyogIDAuMTMgKi8gfSwKKyB7ICA0Njc3NiwgICAzMywgLyogIDAuMTMgKi8gfSwKKyB7ICA0ODk2MSwgICAzMiwgLyogIDAuMTMgKi8gfSwKKyB7ICA1MTI1OCwgICAzMiwgLyogIDAuMTMgKi8gfSwKKyB7ICA1MzY3NywgICAzMSwgLyogIDAuMTIgKi8gfSwKKyB7ICA1NjIzMCwgICAzMCwgLyogIDAuMTIgKi8gfSwKKyB7ICA1ODkzMiwgICAzMCwgLyogIDAuMTIgKi8gfSwKKyB7ICA2MTc5OSwgICAyOSwgLyogIDAuMTIgKi8gfSwKKyB7ICA2NDg1MSwgICAyOCwgLyogIDAuMTEgKi8gfSwKKyB7ICA2ODExMywgICAyOCwgLyogIDAuMTEgKi8gfSwKKyB7ICA3MTYxNywgICAyNywgLyogIDAuMTEgKi8gfSwKKyB7ICA3NTQwMSwgICAyNiwgLyogIDAuMTAgKi8gfSwKKyB7ICA3OTUxNywgICAyNiwgLyogIDAuMTAgKi8gfSwKKyB7ICA4NDAzNSwgICAyNSwgLyogIDAuMTAgKi8gfSwKKyB7ICA4OTA1MywgICAyNCwgLyogIDAuMTAgKi8gfSwKK307CisKKyNkZWZpbmUgSFNUQ1BfQUlNRF9NQVgJQVJSQVlfU0laRShoc3RjcF9haW1kX3ZhbHMpCisKK3N0cnVjdCBoc3RjcCB7CisJdTMyCWFpOworfTsKKworc3RhdGljIHZvaWQgaHN0Y3BfaW5pdChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXN0cnVjdCBoc3RjcCAqY2EgPSB0Y3BfY2EodHApOworCisJY2EtPmFpID0gMDsKKworCS8qIEVuc3VyZSB0aGUgTUQgYXJpdGhtZXRpYyB3b3Jrcy4gIFRoaXMgaXMgc29tZXdoYXQgcGVkYW50aWMsCisJICogc2luY2UgSSBkb24ndCB0aGluayB3ZSB3aWxsIHNlZSBhIGN3bmQgdGhpcyBsYXJnZS4gOikgKi8KKwl0cC0+c25kX2N3bmRfY2xhbXAgPSBtaW5fdCh1MzIsIHRwLT5zbmRfY3duZF9jbGFtcCwgMHhmZmZmZmZmZi8xMjgpOworfQorCitzdGF0aWMgdm9pZCBoc3RjcF9jb25nX2F2b2lkKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBhZGssIHUzMiBydHQsCisJCQkgICAgIHUzMiBpbl9mbGlnaHQsIGludCBnb29kKQoreworCXN0cnVjdCBoc3RjcCAqY2EgPSB0Y3BfY2EodHApOworCisJaWYgKGluX2ZsaWdodCA8IHRwLT5zbmRfY3duZCkKKwkJcmV0dXJuOworCisJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKSB7CisJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX2N3bmRfY2xhbXApCisJCQl0cC0+c25kX2N3bmQrKzsKKwl9IGVsc2UgeworCQkvKiBVcGRhdGUgQUlNRCBwYXJhbWV0ZXJzICovCisJCWlmICh0cC0+c25kX2N3bmQgPiBoc3RjcF9haW1kX3ZhbHNbY2EtPmFpXS5jd25kKSB7CisJCQl3aGlsZSAodHAtPnNuZF9jd25kID4gaHN0Y3BfYWltZF92YWxzW2NhLT5haV0uY3duZCAmJgorCQkJICAgICAgIGNhLT5haSA8IEhTVENQX0FJTURfTUFYKQorCQkJCWNhLT5haSsrOworCQl9IGVsc2UgaWYgKHRwLT5zbmRfY3duZCA8IGhzdGNwX2FpbWRfdmFsc1tjYS0+YWldLmN3bmQpIHsKKwkJCXdoaWxlICh0cC0+c25kX2N3bmQgPiBoc3RjcF9haW1kX3ZhbHNbY2EtPmFpXS5jd25kICYmCisJCQkgICAgICAgY2EtPmFpID4gMCkKKwkJCQljYS0+YWktLTsKKwkJfQorCisJCS8qIERvIGFkZGl0aXZlIGluY3JlYXNlICovCisJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX2N3bmRfY2xhbXApIHsKKwkJCXRwLT5zbmRfY3duZF9jbnQgKz0gY2EtPmFpOworCQkJaWYgKHRwLT5zbmRfY3duZF9jbnQgPj0gdHAtPnNuZF9jd25kKSB7CisJCQkJdHAtPnNuZF9jd25kKys7CisJCQkJdHAtPnNuZF9jd25kX2NudCAtPSB0cC0+c25kX2N3bmQ7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1MzIgaHN0Y3Bfc3N0aHJlc2goc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgaHN0Y3AgKmNhID0gdGNwX2NhKHRwKTsKKworCS8qIERvIG11bHRpcGxpY2F0aXZlIGRlY3JlYXNlICovCisJcmV0dXJuIG1heCh0cC0+c25kX2N3bmQgLSAoKHRwLT5zbmRfY3duZCAqIGhzdGNwX2FpbWRfdmFsc1tjYS0+YWldLm1kKSA+PiA4KSwgMlUpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9oaWdoc3BlZWQgPSB7CisJLmluaXQJCT0gaHN0Y3BfaW5pdCwKKwkuc3N0aHJlc2gJPSBoc3RjcF9zc3RocmVzaCwKKwkuY29uZ19hdm9pZAk9IGhzdGNwX2NvbmdfYXZvaWQsCisJLm1pbl9jd25kCT0gdGNwX3Jlbm9fbWluX2N3bmQsCisKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImhpZ2hzcGVlZCIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhzdGNwX3JlZ2lzdGVyKHZvaWQpCit7CisJQlVHX09OKHNpemVvZihzdHJ1Y3QgaHN0Y3ApID4gVENQX0NBX1BSSVZfU0laRSk7CisJcmV0dXJuIHRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9oaWdoc3BlZWQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaHN0Y3BfdW5yZWdpc3Rlcih2b2lkKQoreworCXRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2hpZ2hzcGVlZCk7Cit9CisKK21vZHVsZV9pbml0KGhzdGNwX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KGhzdGNwX3VucmVnaXN0ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKb2huIEhlZmZuZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGlnaCBTcGVlZCBUQ1AiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9odGNwLmMgYi9uZXQvaXB2NC90Y3BfaHRjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTY4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfaHRjcC5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogSC1UQ1AgY29uZ2VzdGlvbiBjb250cm9sLiBUaGUgYWxnb3JpdGhtIGlzIGRldGFpbGVkIGluOgorICogUi5OLlNob3J0ZW4sIEQuSi5MZWl0aDoKKyAqICAgIkgtVENQOiBUQ1AgZm9yIGhpZ2gtc3BlZWQgYW5kIGxvbmctZGlzdGFuY2UgbmV0d29ya3MiCisgKiAgIFByb2MuIFBGTERuZXQsIEFyZ29ubmUsIDIwMDQuCisgKiBodHRwOi8vd3d3LmhhbWlsdG9uLmllL25ldC9odGNwMy5wZGYKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNkZWZpbmUgQUxQSEFfQkFTRQkoMTw8NykgIC8qIDEuMCB3aXRoIHNoaWZ0IDw8IDcgKi8KKyNkZWZpbmUgQkVUQV9NSU4JKDE8PDYpICAvKiAwLjUgd2l0aCBzaGlmdCA8PCA3ICovCisjZGVmaW5lIEJFVEFfTUFYCTEwMgkvKiAwLjggd2l0aCBzaGlmdCA8PCA3ICovCisKK3N0YXRpYyBpbnQgdXNlX3J0dF9zY2FsaW5nID0gMTsKK21vZHVsZV9wYXJhbSh1c2VfcnR0X3NjYWxpbmcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHVzZV9ydHRfc2NhbGluZywgInR1cm4gb24vb2ZmIFJUVCBzY2FsaW5nIik7CisKK3N0YXRpYyBpbnQgdXNlX2JhbmR3aWR0aF9zd2l0Y2ggPSAxOworbW9kdWxlX3BhcmFtKHVzZV9iYW5kd2lkdGhfc3dpdGNoLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfYmFuZHdpZHRoX3N3aXRjaCwgInR1cm4gb24vb2ZmIGJhbmR3aWR0aCBzd2l0Y2hlciIpOworCitzdHJ1Y3QgaHRjcCB7CisJdTE2CWFscGhhOwkJLyogRml4ZWQgcG9pbnQgYXJpdGgsIDw8IDcgKi8KKwl1OAliZXRhOyAgICAgICAgICAgLyogRml4ZWQgcG9pbnQgYXJpdGgsIDw8IDcgKi8KKwl1OAltb2Rlc3dpdGNoOyAgICAgLyogRGVsYXkgbW9kZXN3aXRjaCB1bnRpbCB3ZSBoYWQgYXQgbGVhc3Qgb25lIGNvbmdlc3Rpb24gZXZlbnQgKi8KKwl1OAljY291bnQ7CQkvKiBOdW1iZXIgb2YgUlRUcyBzaW5jZSBsYXN0IGNvbmdlc3Rpb24gZXZlbnQgKi8KKwl1OAl1bmRvX2Njb3VudDsKKwl1MTYJcGFja2V0Y291bnQ7CisJdTMyCW1pblJUVDsKKwl1MzIJbWF4UlRUOworCXUzMglzbmRfY3duZF9jbnQyOworCisJdTMyCXVuZG9fbWF4UlRUOworCXUzMgl1bmRvX29sZF9tYXhCOworCisJLyogQmFuZHdpZHRoIGVzdGltYXRpb24gKi8KKwl1MzIJbWluQjsKKwl1MzIJbWF4QjsKKwl1MzIJb2xkX21heEI7CisJdTMyCUJpOworCXUzMglsYXN0dGltZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBodGNwX3Jlc2V0KHN0cnVjdCBodGNwICpjYSkKK3sKKwljYS0+dW5kb19jY291bnQgPSBjYS0+Y2NvdW50OworCWNhLT51bmRvX21heFJUVCA9IGNhLT5tYXhSVFQ7CisJY2EtPnVuZG9fb2xkX21heEIgPSBjYS0+b2xkX21heEI7CisKKwljYS0+Y2NvdW50ID0gMDsKKwljYS0+c25kX2N3bmRfY250MiA9IDA7Cit9CisKK3N0YXRpYyB1MzIgaHRjcF9jd25kX3VuZG8oc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgaHRjcCAqY2EgPSB0Y3BfY2EodHApOworCWNhLT5jY291bnQgPSBjYS0+dW5kb19jY291bnQ7CisJY2EtPm1heFJUVCA9IGNhLT51bmRvX21heFJUVDsKKwljYS0+b2xkX21heEIgPSBjYS0+dW5kb19vbGRfbWF4QjsKKwlyZXR1cm4gbWF4KHRwLT5zbmRfY3duZCwgKHRwLT5zbmRfc3N0aHJlc2g8PDcpL2NhLT5iZXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lYXN1cmVfcnR0KHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IGh0Y3AgKmNhID0gdGNwX2NhKHRwKTsKKwl1MzIgc3J0dCA9IHRwLT5zcnR0Pj4zOworCisJLyoga2VlcCB0cmFjayBvZiBtaW5pbXVtIFJUVCBzZWVuIHNvIGZhciwgbWluUlRUIGlzIHplcm8gYXQgZmlyc3QgKi8KKwlpZiAoY2EtPm1pblJUVCA+IHNydHQgfHwgIWNhLT5taW5SVFQpCisJCWNhLT5taW5SVFQgPSBzcnR0OworCisJLyogbWF4IFJUVCAqLworCWlmICh0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX09wZW4gJiYgdHAtPnNuZF9zc3RocmVzaCA8IDB4RkZGRiAmJiBjYS0+Y2NvdW50ID4gMykgeworCQlpZiAoY2EtPm1heFJUVCA8IGNhLT5taW5SVFQpCisJCQljYS0+bWF4UlRUID0gY2EtPm1pblJUVDsKKwkJaWYgKGNhLT5tYXhSVFQgPCBzcnR0ICYmIHNydHQgPD0gY2EtPm1heFJUVCtIWi81MCkKKwkJCWNhLT5tYXhSVFQgPSBzcnR0OworCX0KK30KKworc3RhdGljIHZvaWQgbWVhc3VyZV9hY2hpZXZlZF90aHJvdWdocHV0KHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBwa3RzX2Fja2VkKQoreworCXN0cnVjdCBodGNwICpjYSA9IHRjcF9jYSh0cCk7CisJdTMyIG5vdyA9IHRjcF90aW1lX3N0YW1wOworCisJLyogYWNoaWV2ZWQgdGhyb3VnaHB1dCBjYWxjdWxhdGlvbnMgKi8KKwlpZiAodHAtPmNhX3N0YXRlICE9IFRDUF9DQV9PcGVuICYmIHRwLT5jYV9zdGF0ZSAhPSBUQ1BfQ0FfRGlzb3JkZXIpIHsKKwkJY2EtPnBhY2tldGNvdW50ID0gMDsKKwkJY2EtPmxhc3R0aW1lID0gbm93OworCQlyZXR1cm47CisJfQorCisJY2EtPnBhY2tldGNvdW50ICs9IHBrdHNfYWNrZWQ7CisKKwlpZiAoY2EtPnBhY2tldGNvdW50ID49IHRwLT5zbmRfY3duZCAtIChjYS0+YWxwaGE+Pjc/IDogMSkKKwkJCSYmIG5vdyAtIGNhLT5sYXN0dGltZSA+PSBjYS0+bWluUlRUCisJCQkmJiBjYS0+bWluUlRUID4gMCkgeworCQlfX3UzMiBjdXJfQmkgPSBjYS0+cGFja2V0Y291bnQqSFovKG5vdyAtIGNhLT5sYXN0dGltZSk7CisJCWlmIChjYS0+Y2NvdW50IDw9IDMpIHsKKwkJCS8qIGp1c3QgYWZ0ZXIgYmFja29mZiAqLworCQkJY2EtPm1pbkIgPSBjYS0+bWF4QiA9IGNhLT5CaSA9IGN1cl9CaTsKKwkJfSBlbHNlIHsKKwkJCWNhLT5CaSA9ICgzKmNhLT5CaSArIGN1cl9CaSkvNDsKKwkJCWlmIChjYS0+QmkgPiBjYS0+bWF4QikKKwkJCQljYS0+bWF4QiA9IGNhLT5CaTsKKwkJCWlmIChjYS0+bWluQiA+IGNhLT5tYXhCKQorCQkJCWNhLT5taW5CID0gY2EtPm1heEI7CisJCX0KKwkJY2EtPnBhY2tldGNvdW50ID0gMDsKKwkJY2EtPmxhc3R0aW1lID0gbm93OworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGh0Y3BfYmV0YV91cGRhdGUoc3RydWN0IGh0Y3AgKmNhLCB1MzIgbWluUlRULCB1MzIgbWF4UlRUKQoreworCWlmICh1c2VfYmFuZHdpZHRoX3N3aXRjaCkgeworCQl1MzIgbWF4QiA9IGNhLT5tYXhCOworCQl1MzIgb2xkX21heEIgPSBjYS0+b2xkX21heEI7CisJCWNhLT5vbGRfbWF4QiA9IGNhLT5tYXhCOworCisJCWlmICghYmV0d2Vlbig1Km1heEIsIDQqb2xkX21heEIsIDYqb2xkX21heEIpKSB7CisJCQljYS0+YmV0YSA9IEJFVEFfTUlOOworCQkJY2EtPm1vZGVzd2l0Y2ggPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGNhLT5tb2Rlc3dpdGNoICYmIG1pblJUVCA+IG1heChIWi8xMDAsIDEpICYmIG1heFJUVCkgeworCQljYS0+YmV0YSA9IChtaW5SVFQ8PDcpL21heFJUVDsKKwkJaWYgKGNhLT5iZXRhIDwgQkVUQV9NSU4pCisJCQljYS0+YmV0YSA9IEJFVEFfTUlOOworCQllbHNlIGlmIChjYS0+YmV0YSA+IEJFVEFfTUFYKQorCQkJY2EtPmJldGEgPSBCRVRBX01BWDsKKwl9IGVsc2UgeworCQljYS0+YmV0YSA9IEJFVEFfTUlOOworCQljYS0+bW9kZXN3aXRjaCA9IDE7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHRjcF9hbHBoYV91cGRhdGUoc3RydWN0IGh0Y3AgKmNhKQoreworCXUzMiBtaW5SVFQgPSBjYS0+bWluUlRUOworCXUzMiBmYWN0b3IgPSAxOworCXUzMiBkaWZmID0gY2EtPmNjb3VudCAqIG1pblJUVDsgLyogdGltZSBzaW5jZSBsYXN0IGJhY2tvZmYgKi8KKworCWlmIChkaWZmID4gSFopIHsKKwkJZGlmZiAtPSBIWjsKKwkJZmFjdG9yID0gMSsgKCAxMCpkaWZmICsgKChkaWZmLzIpKihkaWZmLzIpL0haKSApL0haOworCX0KKworCWlmICh1c2VfcnR0X3NjYWxpbmcgJiYgbWluUlRUKSB7CisJCXUzMiBzY2FsZSA9IChIWjw8MykvKDEwKm1pblJUVCk7CisJCXNjYWxlID0gbWluKG1heChzY2FsZSwgMVU8PDIpLCAxMFU8PDMpOyAvKiBjbGFtcGluZyByYXRpbyB0byBpbnRlcnZhbCBbMC41LDEwXTw8MyAqLworCQlmYWN0b3IgPSAoZmFjdG9yPDwzKS9zY2FsZTsKKwkJaWYgKCFmYWN0b3IpCisJCQlmYWN0b3IgPSAxOworCX0KKworCWNhLT5hbHBoYSA9IDIqZmFjdG9yKigoMTw8NyktY2EtPmJldGEpOworCWlmICghY2EtPmFscGhhKQorCQljYS0+YWxwaGEgPSBBTFBIQV9CQVNFOworfQorCisvKiBBZnRlciB3ZSBoYXZlIHRoZSBydHQgZGF0YSB0byBjYWxjdWxhdGUgYmV0YSwgd2UnZCBzdGlsbCBwcmVmZXIgdG8gd2FpdCBvbmUKKyAqIHJ0dCBiZWZvcmUgd2UgYWRqdXN0IG91ciBiZXRhIHRvIGVuc3VyZSB3ZSBhcmUgd29ya2luZyBmcm9tIGEgY29uc2lzdGVudAorICogZGF0YS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB3ZSBoaXQgYSBjb25nZXN0aW9uIGV2ZW50IHNpbmNlIG9ubHkgYXQKKyAqIHRoYXQgcG9pbnQgZG8gd2UgcmVhbGx5IGhhdmUgYSByZWFsIHNlbnNlIG9mIG1heFJUVCAodGhlIHF1ZXVlcyBlbiByb3V0ZQorICogd2VyZSBnZXR0aW5nIGp1c3QgdG9vIGZ1bGwgbm93KS4KKyAqLworc3RhdGljIHZvaWQgaHRjcF9wYXJhbV91cGRhdGUoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgaHRjcCAqY2EgPSB0Y3BfY2EodHApOworCXUzMiBtaW5SVFQgPSBjYS0+bWluUlRUOworCXUzMiBtYXhSVFQgPSBjYS0+bWF4UlRUOworCisJaHRjcF9iZXRhX3VwZGF0ZShjYSwgbWluUlRULCBtYXhSVFQpOworCWh0Y3BfYWxwaGFfdXBkYXRlKGNhKTsKKworCS8qIGFkZCBzbG93bHkgZmFkaW5nIG1lbW9yeSBmb3IgbWF4UlRUIHRvIGFjY29tbW9kYXRlIHJvdXRpbmcgY2hhbmdlcyBldGMgKi8KKwlpZiAobWluUlRUID4gMCAmJiBtYXhSVFQgPiBtaW5SVFQpCisJCWNhLT5tYXhSVFQgPSBtaW5SVFQgKyAoKG1heFJUVC1taW5SVFQpKjk1KS8xMDA7Cit9CisKK3N0YXRpYyB1MzIgaHRjcF9yZWNhbGNfc3N0aHJlc2goc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgaHRjcCAqY2EgPSB0Y3BfY2EodHApOworCWh0Y3BfcGFyYW1fdXBkYXRlKHRwKTsKKwlyZXR1cm4gbWF4KCh0cC0+c25kX2N3bmQgKiBjYS0+YmV0YSkgPj4gNywgMlUpOworfQorCitzdGF0aWMgdm9pZCBodGNwX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHJ0dCwKKwkJCSAgICB1MzIgaW5fZmxpZ2h0LCBpbnQgZGF0YV9hY2tlZCkKK3sKKwlzdHJ1Y3QgaHRjcCAqY2EgPSB0Y3BfY2EodHApOworCisJaWYgKGluX2ZsaWdodCA8IHRwLT5zbmRfY3duZCkKKwkJcmV0dXJuOworCisgICAgICAgIGlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkgeworICAgICAgICAgICAgICAgIC8qIEluICJzYWZlIiBhcmVhLCBpbmNyZWFzZS4gKi8KKwkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfY3duZF9jbGFtcCkKKwkJCXRwLT5zbmRfY3duZCsrOworCX0gZWxzZSB7CisJCW1lYXN1cmVfcnR0KHRwKTsKKworCQkvKiBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiByb3VuZC10cmlwIHRpbWVzIHNpbmNlIGxhc3QgYmFja29mZiBldmVudCAqLworCQlpZiAoY2EtPnNuZF9jd25kX2NudDIrKyA+IHRwLT5zbmRfY3duZCkgeworCQkJY2EtPmNjb3VudCsrOworCQkJY2EtPnNuZF9jd25kX2NudDIgPSAwOworCQkJaHRjcF9hbHBoYV91cGRhdGUoY2EpOworCQl9CisKKyAgICAgICAgICAgICAgICAvKiBJbiBkYW5nZXJvdXMgYXJlYSwgaW5jcmVhc2Ugc2xvd2x5LgorCQkgKiBJbiB0aGVvcnkgdGhpcyBpcyB0cC0+c25kX2N3bmQgKz0gYWxwaGEgLyB0cC0+c25kX2N3bmQKKwkJICovCisJCWlmICgodHAtPnNuZF9jd25kX2NudCsrICogY2EtPmFscGhhKT4+NyA+PSB0cC0+c25kX2N3bmQpIHsKKwkJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX2N3bmRfY2xhbXApCisJCQkJdHAtPnNuZF9jd25kKys7CisJCQl0cC0+c25kX2N3bmRfY250ID0gMDsKKwkJCWNhLT5jY291bnQrKzsKKwkJfQorCX0KK30KKworLyogTG93ZXIgYm91bmQgb24gY29uZ2VzdGlvbiB3aW5kb3cuICovCitzdGF0aWMgdTMyIGh0Y3BfbWluX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlyZXR1cm4gdHAtPnNuZF9zc3RocmVzaDsKK30KKworCitzdGF0aWMgdm9pZCBodGNwX2luaXQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgaHRjcCAqY2EgPSB0Y3BfY2EodHApOworCisJbWVtc2V0KGNhLCAwLCBzaXplb2Yoc3RydWN0IGh0Y3ApKTsKKwljYS0+YWxwaGEgPSBBTFBIQV9CQVNFOworCWNhLT5iZXRhID0gQkVUQV9NSU47Cit9CisKK3N0YXRpYyB2b2lkIGh0Y3Bfc3RhdGUoc3RydWN0IHRjcF9zb2NrICp0cCwgdTggbmV3X3N0YXRlKQoreworCXN3aXRjaCAobmV3X3N0YXRlKSB7CisJY2FzZSBUQ1BfQ0FfQ1dSOgorCWNhc2UgVENQX0NBX1JlY292ZXJ5OgorCWNhc2UgVENQX0NBX0xvc3M6CisJCWh0Y3BfcmVzZXQodGNwX2NhKHRwKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgaHRjcCA9IHsKKwkuaW5pdAkJPSBodGNwX2luaXQsCisJLnNzdGhyZXNoCT0gaHRjcF9yZWNhbGNfc3N0aHJlc2gsCisJLm1pbl9jd25kCT0gaHRjcF9taW5fY3duZCwKKwkuY29uZ19hdm9pZAk9IGh0Y3BfY29uZ19hdm9pZCwKKwkuc2V0X3N0YXRlCT0gaHRjcF9zdGF0ZSwKKwkudW5kb19jd25kCT0gaHRjcF9jd25kX3VuZG8sCisJLnBrdHNfYWNrZWQJPSBtZWFzdXJlX2FjaGlldmVkX3Rocm91Z2hwdXQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJodGNwIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh0Y3BfcmVnaXN0ZXIodm9pZCkKK3sKKwlCVUdfT04oc2l6ZW9mKHN0cnVjdCBodGNwKSA+IFRDUF9DQV9QUklWX1NJWkUpOworCUJVSUxEX0JVR19PTihCRVRBX01JTiA+PSBCRVRBX01BWCk7CisJaWYgKCF1c2VfYmFuZHdpZHRoX3N3aXRjaCkKKwkJaHRjcC5wa3RzX2Fja2VkID0gTlVMTDsKKwlyZXR1cm4gdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmaHRjcCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBodGNwX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0Y3BfdW5yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJmh0Y3ApOworfQorCittb2R1bGVfaW5pdChodGNwX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KGh0Y3BfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIkJhcnVjaCBFdmVuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkgtVENQIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaHlibGEuYyBiL25ldC9pcHY0L3RjcF9oeWJsYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTY2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfaHlibGEuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIFRDUCBIWUJMQQorICoKKyAqIFRDUC1IWUJMQSBDb25nZXN0aW9uIGNvbnRyb2wgYWxnb3JpdGhtLCBiYXNlZCBvbjoKKyAqICAgQy5DYWluaSwgUi5GaXJyaW5jaWVsaSwgIlRDUC1IeWJsYTogQSBUQ1AgRW5oYW5jZW1lbnQKKyAqICAgZm9yIEhldGVyb2dlbmVvdXMgTmV0d29ya3MiLAorICogICBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb24gc2F0ZWxsaXRlIENvbW11bmljYXRpb25zLAorICoJCQkJICAgICAgIFNlcHRlbWJlciAyMDA0CisgKiAgICBEYW5pZWxlIExhY2FtZXJhCisgKiAgICByb290IGF0IGRhbmllbGludXgubmV0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworLyogVGNwIEh5YmxhIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBoeWJsYSB7CisJdTggICAgaHlibGFfZW47CisJdTMyICAgc25kX2N3bmRfY2VudHM7IC8qIEtlZXBzIGluY3JlbWVudCB2YWx1ZXMgd2hlbiBpdCBpcyA8MSwgPDw3ICovCisJdTMyICAgcmhvOwkgICAgICAvKiBSaG8gcGFyYW1ldGVyLCBpbnRlZ2VyIHBhcnQgICovCisJdTMyICAgcmhvMjsJICAgICAgLyogUmhvICogUmhvLCBpbnRlZ2VyIHBhcnQgKi8KKwl1MzIgICByaG9fM2xzOwkgICAgICAvKiBSaG8gcGFyYW1ldGVyLCA8PDMgKi8KKwl1MzIgICByaG8yXzdsczsJICAgICAgLyogUmhvXjIsIDw8NwkqLworCXUzMiAgIG1pbnJ0dDsJICAgICAgLyogTWluaW11bSBzbW9vdGhlZCByb3VuZCB0cmlwIHRpbWUgdmFsdWUgc2VlbiAqLworfTsKKworLyogSHlibGEgcmVmZXJlbmNlIHJvdW5kIHRyaXAgdGltZSAoZGVmYXVsdD0gMS80MCBzZWMgPSAyNSBtcyksCisgICBleHByZXNzZWQgaW4gamlmZmllcyAqLworc3RhdGljIGludCBydHQwID0gMjU7Cittb2R1bGVfcGFyYW0ocnR0MCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocnR0MCwgInJlZmVyZW5jZSByb3V0IHRyaXAgdGltZSAobXMpIik7CisKKworLyogVGhpcyBpcyBjYWxsZWQgdG8gcmVmcmVzaCB2YWx1ZXMgZm9yIGh5YmxhIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoeWJsYV9yZWNhbGNfcGFyYW0gKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IGh5YmxhICpjYSA9IHRjcF9jYSh0cCk7CisKKwljYS0+cmhvXzNscyA9IG1heF90KHUzMiwgdHAtPnNydHQgLyBtc2Vjc190b19qaWZmaWVzKHJ0dDApLCA4KTsKKwljYS0+cmhvID0gY2EtPnJob18zbHMgPj4gMzsKKwljYS0+cmhvMl83bHMgPSAoY2EtPnJob18zbHMgKiBjYS0+cmhvXzNscykgPDwgMTsKKwljYS0+cmhvMiA9IGNhLT5yaG8yXzdscyA+Pjc7Cit9CisKK3N0YXRpYyB2b2lkIGh5YmxhX2luaXQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3QgaHlibGEgKmNhID0gdGNwX2NhKHRwKTsKKworCWNhLT5yaG8gPSAwOworCWNhLT5yaG8yID0gMDsKKwljYS0+cmhvXzNscyA9IDA7CisJY2EtPnJobzJfN2xzID0gMDsKKwljYS0+c25kX2N3bmRfY2VudHMgPSAwOworCWNhLT5oeWJsYV9lbiA9IDE7CisJdHAtPnNuZF9jd25kID0gMjsKKwl0cC0+c25kX2N3bmRfY2xhbXAgPSA2NTUzNTsKKworCS8qIDFzdCBSaG8gbWVhc3VyZW1lbnQgYmFzZWQgb24gaW5pdGlhbCBzcnR0ICovCisJaHlibGFfcmVjYWxjX3BhcmFtKHRwKTsKKworCS8qIHNldCBtaW5pbXVtIHJ0dCBhcyB0aGlzIGlzIHRoZSAxc3QgZXZlciBzZWVuICovCisJY2EtPm1pbnJ0dCA9IHRwLT5zcnR0OworCXRwLT5zbmRfY3duZCA9IGNhLT5yaG87Cit9CisKK3N0YXRpYyB2b2lkIGh5YmxhX3N0YXRlKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHU4IGNhX3N0YXRlKQoreworCXN0cnVjdCBoeWJsYSAqY2EgPSB0Y3BfY2EodHApOworCisJY2EtPmh5YmxhX2VuID0gKGNhX3N0YXRlID09IFRDUF9DQV9PcGVuKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaHlibGFfZnJhY3Rpb24odTMyIG9kZHMpCit7CisJc3RhdGljIGNvbnN0IHUzMiBmcmFjdGlvbnNbXSA9IHsKKwkJMTI4LCAxMzksIDE1MiwgMTY1LCAxODEsIDE5NywgMjE1LCAyMzQsCisJfTsKKworCXJldHVybiAob2RkcyA8IEFSUkFZX1NJWkUoZnJhY3Rpb25zKSkgPyBmcmFjdGlvbnNbb2Rkc10gOiAxMjg7Cit9CisKKy8qIFRDUCBIeWJsYSBtYWluIHJvdXRpbmUuCisgKiBUaGlzIGlzIHRoZSBhbGdvcml0aG0gYmVoYXZpb3I6CisgKiAgICAgbyBSZWNhbGMgSHlibGEgcGFyYW1ldGVycyBpZiBtaW5fcnR0IGhhcyBjaGFuZ2VkCisgKiAgICAgbyBHaXZlIGN3bmQgYSBuZXcgdmFsdWUgYmFzZWQgb24gdGhlIG1vZGVsIHByb3Bvc2VkCisgKiAgICAgbyByZW1lbWJlciBpbmNyZW1lbnRzIDwxCisgKi8KK3N0YXRpYyB2b2lkIGh5YmxhX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHJ0dCwKKwkJCSAgICB1MzIgaW5fZmxpZ2h0LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgaHlibGEgKmNhID0gdGNwX2NhKHRwKTsKKwl1MzIgaW5jcmVtZW50LCBvZGQsIHJob19mcmFjdGlvbnM7CisJaW50IGlzX3Nsb3dzdGFydCA9IDA7CisKKwkvKiAgUmVjYWxjdWxhdGUgcmhvIG9ubHkgaWYgdGhpcyBzcnR0IGlzIHRoZSBsb3dlc3QgKi8KKwlpZiAodHAtPnNydHQgPCBjYS0+bWlucnR0KXsKKwkJaHlibGFfcmVjYWxjX3BhcmFtKHRwKTsKKwkJY2EtPm1pbnJ0dCA9IHRwLT5zcnR0OworCX0KKworCWlmICghY2EtPmh5YmxhX2VuKQorCQlyZXR1cm4gdGNwX3Jlbm9fY29uZ19hdm9pZCh0cCwgYWNrLCBydHQsIGluX2ZsaWdodCwgZmxhZyk7CisKKwlpZiAoaW5fZmxpZ2h0IDwgdHAtPnNuZF9jd25kKQorCQlyZXR1cm47CisKKwlpZiAoY2EtPnJobyA9PSAwKQorCQloeWJsYV9yZWNhbGNfcGFyYW0odHApOworCisJcmhvX2ZyYWN0aW9ucyA9IGNhLT5yaG9fM2xzIC0gKGNhLT5yaG8gPDwgMyk7CisKKwlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9zc3RocmVzaCkgeworCQkvKgorCQkgKiBzbG93IHN0YXJ0CisJCSAqICAgICAgSU5DID0gMl5SSE8gLSAxCisJCSAqIFRoaXMgaXMgZG9uZSBieSBzcGxpdHRpbmcgdGhlIHJobyBwYXJhbWV0ZXIKKwkJICogaW50byAyIHBhcnRzOiBhbiBpbnRlZ2VyIHBhcnQgYW5kIGEgZnJhY3Rpb24gcGFydC4KKwkJICogSW5yZW1lbnQ8PDcgaXMgZXN0aW1hdGVkIGJ5IGRvaW5nOgorCQkgKgkgICAgICAgWzJeKGludCtmcmFjdCldPDw3CisJCSAqIHRoYXQgaXMgZXF1YWwgdG86CisJCSAqCSAgICAgICAoMl5pbnQpCSogIFsoMl5mcmFjdCkgPDw3XQorCQkgKiAyXmludCBpcyBzdHJhaWdodGx5IGNvbXB1dGVkIGFzIDE8PGludCwKKwkJICogd2hpbGUgd2Ugd2lsbCB1c2UgaHlibGFfc2xvd3N0YXJ0X2ZyYWN0aW9uX2luY3JlbWVudCgpIHRvCisJCSAqIGNhbGN1bGF0ZSAyXmZyYWN0IGluIGEgPDw3IHZhbHVlLgorCQkgKi8KKwkJaXNfc2xvd3N0YXJ0ID0gMTsKKwkJaW5jcmVtZW50ID0gKCgxIDw8IGNhLT5yaG8pICogaHlibGFfZnJhY3Rpb24ocmhvX2ZyYWN0aW9ucykpCisJCQktIDEyODsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBjb25nZXN0aW9uIGF2b2lkYW5jZQorCQkgKiBJTkMgPSBSSE9eMiAvIFcKKwkJICogYXMgbG9uZyBhcyBpbmNyZW1lbnQgaXMgZXN0aW1hdGVkIGFzIChyaG88PDcpL3dpbmRvdworCQkgKiBpdCBhbHJlYWR5IGlzIDw8NyBhbmQgd2UgY2FuIGVhc2lseSBjb3VudCBpdHMgZnJhY3Rpb25zLgorCQkgKi8KKwkJaW5jcmVtZW50ID0gY2EtPnJobzJfN2xzIC8gdHAtPnNuZF9jd25kOworCQlpZiAoaW5jcmVtZW50IDwgMTI4KQorCQkJdHAtPnNuZF9jd25kX2NudCsrOworCX0KKworCW9kZCA9IGluY3JlbWVudCAlIDEyODsKKwl0cC0+c25kX2N3bmQgKz0gaW5jcmVtZW50ID4+IDc7CisJY2EtPnNuZF9jd25kX2NlbnRzICs9IG9kZDsKKworCS8qIGNoZWNrIHdoZW4gZnJhY3Rpb25zIGdvZXMgPj0xMjggYW5kIGluY3JlYXNlIGN3bmQgYnkgMS4gKi8KKwl3aGlsZShjYS0+c25kX2N3bmRfY2VudHMgPj0gMTI4KSB7CisJCXRwLT5zbmRfY3duZCsrOworCQljYS0+c25kX2N3bmRfY2VudHMgLT0gMTI4OworCQl0cC0+c25kX2N3bmRfY250ID0gMDsKKwl9CisKKwkvKiBjbGFtcCBkb3duIHNsb3dzdGFydCBjd25kIHRvIHNzdGhyZXNoIHZhbHVlLiAqLworCWlmIChpc19zbG93c3RhcnQpCisJCXRwLT5zbmRfY3duZCA9IG1pbih0cC0+c25kX2N3bmQsIHRwLT5zbmRfc3N0aHJlc2gpOworCisJdHAtPnNuZF9jd25kID0gbWluX3QodTMyLCB0cC0+c25kX2N3bmQsIHRwLT5zbmRfY3duZF9jbGFtcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9oeWJsYSA9IHsKKwkuaW5pdAkJPSBoeWJsYV9pbml0LAorCS5zc3RocmVzaAk9IHRjcF9yZW5vX3NzdGhyZXNoLAorCS5taW5fY3duZAk9IHRjcF9yZW5vX21pbl9jd25kLAorCS5jb25nX2F2b2lkCT0gaHlibGFfY29uZ19hdm9pZCwKKwkuc2V0X3N0YXRlCT0gaHlibGFfc3RhdGUsCisKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImh5YmxhIgorfTsKKworc3RhdGljIGludCBfX2luaXQgaHlibGFfcmVnaXN0ZXIodm9pZCkKK3sKKwlCVUdfT04oc2l6ZW9mKHN0cnVjdCBoeWJsYSkgPiBUQ1BfQ0FfUFJJVl9TSVpFKTsKKwlyZXR1cm4gdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX2h5YmxhKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGh5YmxhX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0Y3BfdW5yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9oeWJsYSk7Cit9CisKK21vZHVsZV9pbml0KGh5YmxhX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KGh5YmxhX3VucmVnaXN0ZXIpOworCitNT0RVTEVfQVVUSE9SKCJEYW5pZWxlIExhY2FtZXJhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRDUCBIeWJsYSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCA1YmFkNTA0Li41M2E4YTUzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtNjEsNyArNjEsNiBAQAogICoJCVBhbnUgS3VobGJlcmc6CQlFeHBlcmltZW50YWwgYXVkaXQgb2YgVENQIChyZSl0cmFuc21pc3Npb24KICAqCQkJCQllbmdpbmUuIExvdHMgb2YgYnVncyBhcmUgZm91bmQuCiAgKgkJUGFzaSBTYXJvbGFodGk6CQlGLVJUTyBmb3IgZGVhbGluZyB3aXRoIHNwdXJpb3VzIFJUT3MKLSAqCQlBbmdlbG8gRGVsbCdBZXJhOglUQ1AgV2VzdHdvb2QrIHN1cHBvcnQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CkBAIC04OCwyMyArODcsOSBAQAogaW50IHN5c2N0bF90Y3BfbWF4X29ycGhhbnMgPSBOUl9GSUxFOwogaW50IHN5c2N0bF90Y3BfZnJ0bzsKIGludCBzeXNjdGxfdGNwX25vbWV0cmljc19zYXZlOwotaW50IHN5c2N0bF90Y3Bfd2VzdHdvb2Q7Ci1pbnQgc3lzY3RsX3RjcF92ZWdhc19jb25nX2F2b2lkOwogCiBpbnQgc3lzY3RsX3RjcF9tb2RlcmF0ZV9yY3ZidWYgPSAxOwogCi0vKiBEZWZhdWx0IHZhbHVlcyBvZiB0aGUgVmVnYXMgdmFyaWFibGVzLCBpbiBmaXhlZC1wb2ludCByZXByZXNlbnRhdGlvbgotICogd2l0aCBWX1BBUkFNX1NISUZUIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCi0gKi8KLSNkZWZpbmUgVl9QQVJBTV9TSElGVCAxCi1pbnQgc3lzY3RsX3RjcF92ZWdhc19hbHBoYSA9IDE8PFZfUEFSQU1fU0hJRlQ7Ci1pbnQgc3lzY3RsX3RjcF92ZWdhc19iZXRhICA9IDM8PFZfUEFSQU1fU0hJRlQ7Ci1pbnQgc3lzY3RsX3RjcF92ZWdhc19nYW1tYSA9IDE8PFZfUEFSQU1fU0hJRlQ7Ci1pbnQgc3lzY3RsX3RjcF9iaWMgPSAxOwotaW50IHN5c2N0bF90Y3BfYmljX2Zhc3RfY29udmVyZ2VuY2UgPSAxOwotaW50IHN5c2N0bF90Y3BfYmljX2xvd193aW5kb3cgPSAxNDsKLWludCBzeXNjdGxfdGNwX2JpY19iZXRhID0gODE5OwkJLyogPSA4MTkvMTAyNCAoQklDVENQX0JFVEFfU0NBTEUpICovCi0KICNkZWZpbmUgRkxBR19EQVRBCQkweDAxIC8qIEluY29taW5nIGZyYW1lIGNvbnRhaW5lZCBkYXRhLgkJKi8KICNkZWZpbmUgRkxBR19XSU5fVVBEQVRFCQkweDAyIC8qIEluY29taW5nIEFDSyB3YXMgYSB3aW5kb3cgdXBkYXRlLgkqLwogI2RlZmluZSBGTEFHX0RBVEFfQUNLRUQJCTB4MDQgLyogVGhpcyBBQ0sgYWNrbm93bGVkZ2VkIG5ldyBkYXRhLgkJKi8KQEAgLTMzMywxNSArMzE4LDYgQEAKIAl0cC0+c25kX2N3bmRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9iaWN0Y3Aoc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLQl0cC0+YmljdGNwLmNudCA9IDA7Ci0KLQl0cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQgPSAwOwotCXRwLT5iaWN0Y3AubGFzdF9jd25kID0gMDsKLQl0cC0+YmljdGNwLmxhc3Rfc3RhbXAgPSAwOwotfQotCiAvKiA1LiBSZWNhbGN1bGF0ZSB3aW5kb3cgY2xhbXAgYWZ0ZXIgc29ja2V0IGhpdCBpdHMgbWVtb3J5IGJvdW5kcy4gKi8KIHN0YXRpYyB2b2lkIHRjcF9jbGFtcF93aW5kb3coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewpAQCAtNTU4LDQ1ICs1MzQsNiBAQAogCQl0Y3BfZ3Jvd193aW5kb3coc2ssIHRwLCBza2IpOwogfQogCi0vKiBXaGVuIHN0YXJ0aW5nIGEgbmV3IGNvbm5lY3Rpb24sIHBpbiBkb3duIHRoZSBjdXJyZW50IGNob2ljZSBvZiAKLSAqIGNvbmdlc3Rpb24gYWxnb3JpdGhtLgotICovCi12b2lkIHRjcF9jYV9pbml0KHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0JaWYgKHN5c2N0bF90Y3Bfd2VzdHdvb2QpIAotCQl0cC0+YWR2X2NvbmcgPSBUQ1BfV0VTVFdPT0Q7Ci0JZWxzZSBpZiAoc3lzY3RsX3RjcF9iaWMpCi0JCXRwLT5hZHZfY29uZyA9IFRDUF9CSUM7Ci0JZWxzZSBpZiAoc3lzY3RsX3RjcF92ZWdhc19jb25nX2F2b2lkKSB7Ci0JCXRwLT5hZHZfY29uZyA9IFRDUF9WRUdBUzsKLQkJdHAtPnZlZ2FzLmJhc2VSVFQgPSAweDdmZmZmZmZmOwotCQl0Y3BfdmVnYXNfZW5hYmxlKHRwKTsKLQl9IAotfQotCi0vKiBEbyBSVFQgc2FtcGxpbmcgbmVlZGVkIGZvciBWZWdhcy4KLSAqIEJhc2ljYWxseSB3ZToKLSAqICAgbyBtaW4tZmlsdGVyIFJUVCBzYW1wbGVzIGZyb20gd2l0aGluIGFuIFJUVCB0byBnZXQgdGhlIGN1cnJlbnQKLSAqICAgICBwcm9wYWdhdGlvbiBkZWxheSArIHF1ZXVpbmcgZGVsYXkgKHdlIGFyZSBtaW4tZmlsdGVyaW5nIHRvIHRyeSB0bwotICogICAgIGF2b2lkIHRoZSBlZmZlY3RzIG9mIGRlbGF5ZWQgQUNLcykKLSAqICAgbyBtaW4tZmlsdGVyIFJUVCBzYW1wbGVzIGZyb20gYSBtdWNoIGxvbmdlciB3aW5kb3cgKGZvcmV2ZXIgZm9yIG5vdykKLSAqICAgICB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiBkZWxheSAoYmFzZVJUVCkKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHZlZ2FzX3J0dF9jYWxjKHN0cnVjdCB0Y3Bfc29jayAqdHAsIF9fdTMyIHJ0dCkKLXsKLQlfX3UzMiB2cnR0ID0gcnR0ICsgMTsgLyogTmV2ZXIgYWxsb3cgemVybyBydHQgb3IgYmFzZVJUVCAqLwotCi0JLyogRmlsdGVyIHRvIGZpbmQgcHJvcGFnYXRpb24gZGVsYXk6ICovCi0JaWYgKHZydHQgPCB0cC0+dmVnYXMuYmFzZVJUVCkgCi0JCXRwLT52ZWdhcy5iYXNlUlRUID0gdnJ0dDsKLQotCS8qIEZpbmQgdGhlIG1pbiBSVFQgZHVyaW5nIHRoZSBsYXN0IFJUVCB0byBmaW5kCi0JICogdGhlIGN1cnJlbnQgcHJvcC4gZGVsYXkgKyBxdWV1aW5nIGRlbGF5OgotCSAqLwotCXRwLT52ZWdhcy5taW5SVFQgPSBtaW4odHAtPnZlZ2FzLm1pblJUVCwgdnJ0dCk7Ci0JdHAtPnZlZ2FzLmNudFJUVCsrOwotfQotCiAvKiBDYWxsZWQgdG8gY29tcHV0ZSBhIHNtb290aGVkIHJ0dCBlc3RpbWF0ZS4gVGhlIGRhdGEgZmVkIHRvIHRoaXMKICAqIHJvdXRpbmUgZWl0aGVyIGNvbWVzIGZyb20gdGltZXN0YW1wcywgb3IgZnJvbSBzZWdtZW50cyB0aGF0IHdlcmUKICAqIGtub3duIF9ub3RfIHRvIGhhdmUgYmVlbiByZXRyYW5zbWl0dGVkIFtzZWUgS2Fybi9QYXJ0cmlkZ2UKQEAgLTYwNiwxMyArNTQzLDEwIEBACiAgKiBUbyBzYXZlIGN5Y2xlcyBpbiB0aGUgUkZDIDEzMjMgaW1wbGVtZW50YXRpb24gaXQgd2FzIGJldHRlciB0byBicmVhawogICogaXQgdXAgaW50byB0aHJlZSBwcm9jZWR1cmVzLiAtLSBlcmljcwogICovCi1zdGF0aWMgdm9pZCB0Y3BfcnR0X2VzdGltYXRvcihzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBfX3UzMiBtcnR0KQorc3RhdGljIHZvaWQgdGNwX3J0dF9lc3RpbWF0b3Ioc3RydWN0IHRjcF9zb2NrICp0cCwgX191MzIgbXJ0dCwgdTMyICp1c3J0dCkKIHsKIAlsb25nIG0gPSBtcnR0OyAvKiBSVFQgKi8KIAotCWlmICh0Y3BfdmVnYXNfZW5hYmxlZCh0cCkpCi0JCXZlZ2FzX3J0dF9jYWxjKHRwLCBtcnR0KTsKLQogCS8qCVRoZSBmb2xsb3dpbmcgYW11c2luZyBjb2RlIGNvbWVzIGZyb20gSmFjb2Jzb24ncwogCSAqCWFydGljbGUgaW4gU0lHQ09NTSAnODguICBOb3RlIHRoYXQgcnR0IGFuZCBtZGV2CiAJICoJYXJlIHNjYWxlZCB2ZXJzaW9ucyBvZiBydHQgYW5kIG1lYW4gZGV2aWF0aW9uLgpAQCAtNjcwLDcgKzYwNCw4IEBACiAJCXRwLT5ydHRfc2VxID0gdHAtPnNuZF9ueHQ7CiAJfQogCi0JdGNwX3dlc3R3b29kX3VwZGF0ZV9ydHQodHAsIHRwLT5zcnR0ID4+IDMpOworCWlmICh0cC0+Y2Ffb3BzLT5ydHRfc2FtcGxlKQorCQl0cC0+Y2Ffb3BzLT5ydHRfc2FtcGxlKHRwLCAqdXNydHQpOwogfQogCiAvKiBDYWxjdWxhdGUgcnRvIHdpdGhvdXQgYmFja29mZi4gIFRoaXMgaXMgdGhlIHNlY29uZCBoYWxmIG9mIFZhbiBKYWNvYnNvbidzCkBAIC04MDUsMTAgKzc0MCwxMCBAQAogCV9fdTMyIGN3bmQgPSAoZHN0ID8gZHN0X21ldHJpYyhkc3QsIFJUQVhfSU5JVENXTkQpIDogMCk7CiAKIAlpZiAoIWN3bmQpIHsKLQkJaWYgKHRwLT5tc3NfY2FjaGVfc3RkID4gMTQ2MCkKKwkJaWYgKHRwLT5tc3NfY2FjaGUgPiAxNDYwKQogCQkJY3duZCA9IDI7CiAJCWVsc2UKLQkJCWN3bmQgPSAodHAtPm1zc19jYWNoZV9zdGQgPiAxMDk1KSA/IDMgOiA0OworCQkJY3duZCA9ICh0cC0+bXNzX2NhY2hlID4gMTA5NSkgPyAzIDogNDsKIAl9CiAJcmV0dXJuIG1pbl90KF9fdTMyLCBjd25kLCB0cC0+c25kX2N3bmRfY2xhbXApOwogfQpAQCAtOTc5LDcgKzkxNCw3IEBACiAJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKIAkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOwogCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7Ci0JCXRwLT5tc3NfY2FjaGUgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwkJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGU7CiAJfQogCiAJaWYgKCF0cC0+c2Fja2VkX291dCkKQEAgLTExNDIsNyArMTA3Nyw3IEBACiAJCQkgICAgKElzRmFjayh0cCkgfHwKIAkJCSAgICAgIWJlZm9yZShsb3N0X3JldHJhbnMsCiAJCQkJICAgICBUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgKyB0cC0+cmVvcmRlcmluZyAqCi0JCQkJICAgICB0cC0+bXNzX2NhY2hlX3N0ZCkpKSB7CisJCQkJICAgICB0cC0+bXNzX2NhY2hlKSkpIHsKIAkJCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmPSB+VENQQ0JfU0FDS0VEX1JFVFJBTlM7CiAJCQkJdHAtPnJldHJhbnNfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CiAKQEAgLTExODUsOCArMTEyMCw4IEBACiAgICAgICAgICAgICB0cC0+c25kX3VuYSA9PSB0cC0+aGlnaF9zZXEgfHwKICAgICAgICAgICAgICh0cC0+Y2Ffc3RhdGUgPT0gVENQX0NBX0xvc3MgJiYgIXRwLT5yZXRyYW5zbWl0cykpIHsKIAkJdHAtPnByaW9yX3NzdGhyZXNoID0gdGNwX2N1cnJlbnRfc3N0aHJlc2godHApOwotCQlpZiAoIXRjcF93ZXN0d29vZF9zc3RocmVzaCh0cCkpCi0JCQl0cC0+c25kX3NzdGhyZXNoID0gdGNwX3JlY2FsY19zc3RocmVzaCh0cCk7CisJCXRwLT5zbmRfc3N0aHJlc2ggPSB0cC0+Y2Ffb3BzLT5zc3RocmVzaCh0cCk7CisJCXRjcF9jYV9ldmVudCh0cCwgQ0FfRVZFTlRfRlJUTyk7CiAJfQogCiAJLyogSGF2ZSB0byBjbGVhciByZXRyYW5zbWlzc2lvbiBtYXJrZXJzIGhlcmUgdG8ga2VlcCB0aGUgYm9va2tlZXBpbmcKQEAgLTEyNTIsOCArMTE4Nyw2IEBACiAJdGNwX3NldF9jYV9zdGF0ZSh0cCwgVENQX0NBX0xvc3MpOwogCXRwLT5oaWdoX3NlcSA9IHRwLT5mcnRvX2hpZ2htYXJrOwogCVRDUF9FQ05fcXVldWVfY3dyKHRwKTsKLQotCWluaXRfYmljdGNwKHRwKTsKIH0KIAogdm9pZCB0Y3BfY2xlYXJfcmV0cmFucyhzdHJ1Y3QgdGNwX3NvY2sgKnRwKQpAQCAtMTI4Myw3ICsxMjE2LDggQEAKIAlpZiAodHAtPmNhX3N0YXRlIDw9IFRDUF9DQV9EaXNvcmRlciB8fCB0cC0+c25kX3VuYSA9PSB0cC0+aGlnaF9zZXEgfHwKIAkgICAgKHRwLT5jYV9zdGF0ZSA9PSBUQ1BfQ0FfTG9zcyAmJiAhdHAtPnJldHJhbnNtaXRzKSkgewogCQl0cC0+cHJpb3Jfc3N0aHJlc2ggPSB0Y3BfY3VycmVudF9zc3RocmVzaCh0cCk7Ci0JCXRwLT5zbmRfc3N0aHJlc2ggPSB0Y3BfcmVjYWxjX3NzdGhyZXNoKHRwKTsKKwkJdHAtPnNuZF9zc3RocmVzaCA9IHRwLT5jYV9vcHMtPnNzdGhyZXNoKHRwKTsKKwkJdGNwX2NhX2V2ZW50KHRwLCBDQV9FVkVOVF9MT1NTKTsKIAl9CiAJdHAtPnNuZF9jd25kCSAgID0gMTsKIAl0cC0+c25kX2N3bmRfY250ICAgPSAwOwpAQCAtMTU5NiwyOCArMTUzMCwxNCBAQAogfQogCiAvKiBEZWNyZWFzZSBjd25kIGVhY2ggc2Vjb25kIGFjay4gKi8KLQogc3RhdGljIHZvaWQgdGNwX2N3bmRfZG93bihzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewogCWludCBkZWNyID0gdHAtPnNuZF9jd25kX2NudCArIDE7Ci0JX191MzIgbGltaXQ7Ci0KLQkvKgotCSAqIFRDUCBXZXN0d29vZAotCSAqIEhlcmUgbGltaXQgaXMgZXZhbHVhdGVkIGFzIEJXZXN0aW1hdGlvbipSVFRtaW4gKGZvciBvYnRhaW5pbmcgaXQKLQkgKiBpbiBwYWNrZXRzIHdlIHVzZSBtc3NfY2FjaGUpLiBJZiBzeXNjdGxfdGNwX3dlc3R3b29kIGlzIG9mZgotCSAqIHRjcF93ZXN0d29vZF9id19ydHRtaW4oKSByZXR1cm5zIDAuIEluIHN1Y2ggY2FzZSBzbmRfc3N0aHJlc2ggaXMKLQkgKiBzdGlsbCB1c2VkIGFzIHVzdWFsLiBJdCBwcmV2ZW50cyBvdGhlciBzdHJhbmdlIGNhc2VzIGluIHdoaWNoCi0JICogQldFKlJUVG1pbiBjb3VsZCBhc3N1bWUgdmFsdWUgMC4gSXQgc2hvdWxkIG5vdCBoYXBwZW4gYnV0Li4uCi0JICovCi0KLQlpZiAoIShsaW1pdCA9IHRjcF93ZXN0d29vZF9id19ydHRtaW4odHApKSkKLQkJbGltaXQgPSB0cC0+c25kX3NzdGhyZXNoLzI7CiAKIAl0cC0+c25kX2N3bmRfY250ID0gZGVjciYxOwogCWRlY3IgPj49IDE7CiAKLQlpZiAoZGVjciAmJiB0cC0+c25kX2N3bmQgPiBsaW1pdCkKKwlpZiAoZGVjciAmJiB0cC0+c25kX2N3bmQgPiB0cC0+Y2Ffb3BzLT5taW5fY3duZCh0cCkpCiAJCXRwLT5zbmRfY3duZCAtPSBkZWNyOwogCiAJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSsxKTsKQEAgLTE2NTQsOCArMTU3NCw4IEBACiBzdGF0aWMgdm9pZCB0Y3BfdW5kb19jd3Ioc3RydWN0IHRjcF9zb2NrICp0cCwgaW50IHVuZG8pCiB7CiAJaWYgKHRwLT5wcmlvcl9zc3RocmVzaCkgewotCQlpZiAodGNwX2lzX2JpYyh0cCkpCi0JCQl0cC0+c25kX2N3bmQgPSBtYXgodHAtPnNuZF9jd25kLCB0cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQpOworCQlpZiAodHAtPmNhX29wcy0+dW5kb19jd25kKQorCQkJdHAtPnNuZF9jd25kID0gdHAtPmNhX29wcy0+dW5kb19jd25kKHRwKTsKIAkJZWxzZQogCQkJdHAtPnNuZF9jd25kID0gbWF4KHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaDw8MSk7CiAKQEAgLTE3NjcsMTEgKzE2ODcsOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2NvbXBsZXRlX2N3cihzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewotCWlmICh0Y3Bfd2VzdHdvb2RfY3duZCh0cCkpIAotCQl0cC0+c25kX3NzdGhyZXNoID0gdHAtPnNuZF9jd25kOwotCWVsc2UKLQkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7CisJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwgdHAtPnNuZF9zc3RocmVzaCk7CiAJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJdGNwX2NhX2V2ZW50KHRwLCBDQV9FVkVOVF9DT01QTEVURV9DV1IpOwogfQogCiBzdGF0aWMgdm9pZCB0Y3BfdHJ5X3RvX29wZW4oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZykKQEAgLTE5NDYsNyArMTg2NCw3IEBACiAJCWlmICh0cC0+Y2Ffc3RhdGUgPCBUQ1BfQ0FfQ1dSKSB7CiAJCQlpZiAoIShmbGFnJkZMQUdfRUNFKSkKIAkJCQl0cC0+cHJpb3Jfc3N0aHJlc2ggPSB0Y3BfY3VycmVudF9zc3RocmVzaCh0cCk7Ci0JCQl0cC0+c25kX3NzdGhyZXNoID0gdGNwX3JlY2FsY19zc3RocmVzaCh0cCk7CisJCQl0cC0+c25kX3NzdGhyZXNoID0gdHAtPmNhX29wcy0+c3N0aHJlc2godHApOwogCQkJVENQX0VDTl9xdWV1ZV9jd3IodHApOwogCQl9CiAKQEAgLTE5NjMsNyArMTg4MSw3IEBACiAvKiBSZWFkIGRyYWZ0LWlldGYtdGNwbHctaGlnaC1wZXJmb3JtYW5jZSBiZWZvcmUgbXVja2luZwogICogd2l0aCB0aGlzIGNvZGUuIChTdXBlcmNlZWRzIFJGQzEzMjMpCiAgKi8KLXN0YXRpYyB2b2lkIHRjcF9hY2tfc2F3X3RzdGFtcChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBpbnQgZmxhZykKK3N0YXRpYyB2b2lkIHRjcF9hY2tfc2F3X3RzdGFtcChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgKnVzcnR0LCBpbnQgZmxhZykKIHsKIAlfX3UzMiBzZXFfcnR0OwogCkBAIC0xOTgzLDEzICsxOTAxLDEzIEBACiAJICogaW4gd2luZG93IGlzIGxvc3QuLi4gVm9pbGEuCSAJCQktLUFOSyAoMDEwMjEwKQogCSAqLwogCXNlcV9ydHQgPSB0Y3BfdGltZV9zdGFtcCAtIHRwLT5yeF9vcHQucmN2X3RzZWNyOwotCXRjcF9ydHRfZXN0aW1hdG9yKHRwLCBzZXFfcnR0KTsKKwl0Y3BfcnR0X2VzdGltYXRvcih0cCwgc2VxX3J0dCwgdXNydHQpOwogCXRjcF9zZXRfcnRvKHRwKTsKIAl0cC0+YmFja29mZiA9IDA7CiAJdGNwX2JvdW5kX3J0byh0cCk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjcF9hY2tfbm9fdHN0YW1wKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBzZXFfcnR0LCBpbnQgZmxhZykKK3N0YXRpYyB2b2lkIHRjcF9hY2tfbm9fdHN0YW1wKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBzZXFfcnR0LCB1MzIgKnVzcnR0LCBpbnQgZmxhZykKIHsKIAkvKiBXZSBkb24ndCBoYXZlIGEgdGltZXN0YW1wLiBDYW4gb25seSB1c2UKIAkgKiBwYWNrZXRzIHRoYXQgYXJlIG5vdCByZXRyYW5zbWl0dGVkIHRvIGRldGVybWluZQpAQCAtMjAwMywzMzggKzE5MjEsMjkgQEAKIAlpZiAoZmxhZyAmIEZMQUdfUkVUUkFOU19EQVRBX0FDS0VEKQogCQlyZXR1cm47CiAKLQl0Y3BfcnR0X2VzdGltYXRvcih0cCwgc2VxX3J0dCk7CisJdGNwX3J0dF9lc3RpbWF0b3IodHAsIHNlcV9ydHQsIHVzcnR0KTsKIAl0Y3Bfc2V0X3J0byh0cCk7CiAJdHAtPmJhY2tvZmYgPSAwOwogCXRjcF9ib3VuZF9ydG8odHApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2Fja191cGRhdGVfcnR0KHN0cnVjdCB0Y3Bfc29jayAqdHAsCi0JCQkJICAgICAgaW50IGZsYWcsIHMzMiBzZXFfcnR0KQorCQkJCSAgICAgIGludCBmbGFnLCBzMzIgc2VxX3J0dCwgdTMyICp1c3J0dCkKIHsKIAkvKiBOb3RlIHRoYXQgcGVlciBNQVkgc2VuZCB6ZXJvIGVjaG8uIEluIHRoaXMgY2FzZSBpdCBpcyBpZ25vcmVkLiAocmZjMTMyMykgKi8KIAlpZiAodHAtPnJ4X29wdC5zYXdfdHN0YW1wICYmIHRwLT5yeF9vcHQucmN2X3RzZWNyKQotCQl0Y3BfYWNrX3Nhd190c3RhbXAodHAsIGZsYWcpOworCQl0Y3BfYWNrX3Nhd190c3RhbXAodHAsIHVzcnR0LCBmbGFnKTsKIAllbHNlIGlmIChzZXFfcnR0ID49IDApCi0JCXRjcF9hY2tfbm9fdHN0YW1wKHRwLCBzZXFfcnR0LCBmbGFnKTsKKwkJdGNwX2Fja19ub190c3RhbXAodHAsIHNlcV9ydHQsIHVzcnR0LCBmbGFnKTsKIH0KIAotLyoKLSAqIENvbXB1dGUgY29uZ2VzdGlvbiB3aW5kb3cgdG8gdXNlLgotICoKLSAqIFRoaXMgaXMgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gb2YgQklDVENQIGluCi0gKiBMaXNvbi1YdSwgS2FoYWxlZCBIYXJmb3VzaCwgYW5kIEluam9nIFJoZWUuCi0gKiAgIkJpbmFyeSBJbmNyZWFzZSBDb25nZXN0aW9uIENvbnRyb2wgZm9yIEZhc3QsIExvbmcgRGlzdGFuY2UKLSAqICBOZXR3b3JrcyIgaW4gSW5mb0NvbW0gMjAwNAotICogQXZhaWxhYmxlIGZyb206Ci0gKiAgaHR0cDovL3d3dy5jc2MubmNzdS5lZHUvZmFjdWx0eS9yaGVlL2V4cG9ydC9iaXRjcC5wZGYKLSAqCi0gKiBVbmxlc3MgQklDIGlzIGVuYWJsZWQgYW5kIGNvbmdlc3Rpb24gd2luZG93IGlzIGxhcmdlCi0gKiB0aGlzIGJlaGF2ZXMgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIFJlbm8uCi0gKi8KLXN0YXRpYyBpbmxpbmUgX191MzIgYmljdGNwX2N3bmQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfY29uZ19hdm9pZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgYWNrLCB1MzIgcnR0LAorCQkJCSAgdTMyIGluX2ZsaWdodCwgaW50IGdvb2QpCiB7Ci0JLyogb3JpZ25hbCBSZW5vIGJlaGF2aW91ciAqLwotCWlmICghdGNwX2lzX2JpYyh0cCkpCi0JCXJldHVybiB0cC0+c25kX2N3bmQ7Ci0KLQlpZiAodHAtPmJpY3RjcC5sYXN0X2N3bmQgPT0gdHAtPnNuZF9jd25kICYmCi0JICAgKHMzMikodGNwX3RpbWVfc3RhbXAgLSB0cC0+YmljdGNwLmxhc3Rfc3RhbXApIDw9IChIWj4+NSkpCi0JCXJldHVybiB0cC0+YmljdGNwLmNudDsKLQotCXRwLT5iaWN0Y3AubGFzdF9jd25kID0gdHAtPnNuZF9jd25kOwotCXRwLT5iaWN0Y3AubGFzdF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwotICAgICAgCi0JLyogc3RhcnQgb2ZmIG5vcm1hbCAqLwotCWlmICh0cC0+c25kX2N3bmQgPD0gc3lzY3RsX3RjcF9iaWNfbG93X3dpbmRvdykKLQkJdHAtPmJpY3RjcC5jbnQgPSB0cC0+c25kX2N3bmQ7Ci0KLQkvKiBiaW5hcnkgaW5jcmVhc2UgKi8KLQllbHNlIGlmICh0cC0+c25kX2N3bmQgPCB0cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQpIHsKLQkJX191MzIgCWRpc3QgPSAodHAtPmJpY3RjcC5sYXN0X21heF9jd25kIC0gdHAtPnNuZF9jd25kKQotCQkJLyBCSUNUQ1BfQjsKLQotCQlpZiAoZGlzdCA+IEJJQ1RDUF9NQVhfSU5DUkVNRU5UKQotCQkJLyogbGluZWFyIGluY3JlYXNlICovCi0JCQl0cC0+YmljdGNwLmNudCA9IHRwLT5zbmRfY3duZCAvIEJJQ1RDUF9NQVhfSU5DUkVNRU5UOwotCQllbHNlIGlmIChkaXN0IDw9IDFVKQotCQkJLyogYmluYXJ5IHNlYXJjaCBpbmNyZWFzZSAqLwotCQkJdHAtPmJpY3RjcC5jbnQgPSB0cC0+c25kX2N3bmQgKiBCSUNUQ1BfRlVOQ19PRl9NSU5fSU5DUgotCQkJCS8gQklDVENQX0I7Ci0JCWVsc2UKLQkJCS8qIGJpbmFyeSBzZWFyY2ggaW5jcmVhc2UgKi8KLQkJCXRwLT5iaWN0Y3AuY250ID0gdHAtPnNuZF9jd25kIC8gZGlzdDsKLQl9IGVsc2UgewotCQkvKiBzbG93IHN0YXJ0IGFtZCBsaW5lYXIgaW5jcmVhc2UgKi8KLQkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5iaWN0Y3AubGFzdF9tYXhfY3duZCArIEJJQ1RDUF9CKQotCQkJLyogc2xvdyBzdGFydCAqLwotCQkJdHAtPmJpY3RjcC5jbnQgPSB0cC0+c25kX2N3bmQgKiBCSUNUQ1BfRlVOQ19PRl9NSU5fSU5DUgotCQkJCS8gQklDVENQX0I7Ci0JCWVsc2UgaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5iaWN0Y3AubGFzdF9tYXhfY3duZAotCQkJIAkJKyBCSUNUQ1BfTUFYX0lOQ1JFTUVOVCooQklDVENQX0ItMSkpCi0JCQkvKiBzbG93IHN0YXJ0ICovCi0JCQl0cC0+YmljdGNwLmNudCA9IHRwLT5zbmRfY3duZCAqIChCSUNUQ1BfQi0xKQotCQkJCS8gKHRwLT5zbmRfY3duZC10cC0+YmljdGNwLmxhc3RfbWF4X2N3bmQpOwotCQllbHNlCi0JCQkvKiBsaW5lYXIgaW5jcmVhc2UgKi8KLQkJCXRwLT5iaWN0Y3AuY250ID0gdHAtPnNuZF9jd25kIC8gQklDVENQX01BWF9JTkNSRU1FTlQ7Ci0JfQotCXJldHVybiB0cC0+YmljdGNwLmNudDsKLX0KLQotLyogVGhpcyBpcyBKYWNvYnNvbidzIHNsb3cgc3RhcnQgYW5kIGNvbmdlc3Rpb24gYXZvaWRhbmNlLiAKLSAqIFNJR0NPTU0gJzg4LCBwLiAzMjguCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByZW5vX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCkKLXsKLSAgICAgICAgaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKSB7Ci0gICAgICAgICAgICAgICAgLyogSW4gInNhZmUiIGFyZWEsIGluY3JlYXNlLiAqLwotCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQotCQkJdHAtPnNuZF9jd25kKys7Ci0JfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBJbiBkYW5nZXJvdXMgYXJlYSwgaW5jcmVhc2Ugc2xvd2x5LgotCQkgKiBJbiB0aGVvcnkgdGhpcyBpcyB0cC0+c25kX2N3bmQgKz0gMSAvIHRwLT5zbmRfY3duZAotCQkgKi8KLQkJaWYgKHRwLT5zbmRfY3duZF9jbnQgPj0gYmljdGNwX2N3bmQodHApKSB7Ci0JCQlpZiAodHAtPnNuZF9jd25kIDwgdHAtPnNuZF9jd25kX2NsYW1wKQotCQkJCXRwLT5zbmRfY3duZCsrOwotCQkJdHAtPnNuZF9jd25kX2NudD0wOwotCQl9IGVsc2UKLQkJCXRwLT5zbmRfY3duZF9jbnQrKzsKLSAgICAgICAgfQorCXRwLT5jYV9vcHMtPmNvbmdfYXZvaWQodHAsIGFjaywgcnR0LCBpbl9mbGlnaHQsIGdvb2QpOwogCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwogfQogCi0vKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBjb25nZXN0aW9uIGRldGVjdGlvbi9hdm9pZGFuY2Ugc2NoZW1lIGRlc2NyaWJlZCBpbgotICogICAgTGF3cmVuY2UgUy4gQnJha21vIGFuZCBMYXJyeSBMLiBQZXRlcnNvbi4KLSAqICAgICJUQ1AgVmVnYXM6IEVuZCB0byBlbmQgY29uZ2VzdGlvbiBhdm9pZGFuY2Ugb24gYSBnbG9iYWwgaW50ZXJuZXQuIgotICogICAgSUVFRSBKb3VybmFsIG9uIFNlbGVjdGVkIEFyZWFzIGluIENvbW11bmljYXRpb24sIDEzKDgpOjE0NjUtLTE0ODAsCi0gKiAgICBPY3RvYmVyIDE5OTUuIEF2YWlsYWJsZSBmcm9tOgotICoJZnRwOi8vZnRwLmNzLmFyaXpvbmEuZWR1L3hrZXJuZWwvUGFwZXJzL2pzYWMucHMKLSAqCi0gKiBTZWUgaHR0cDovL3d3dy5jcy5hcml6b25hLmVkdS94a2VybmVsLyBmb3IgdGhlaXIgaW1wbGVtZW50YXRpb24uCi0gKiBUaGUgbWFpbiBhc3BlY3RzIHRoYXQgZGlzdGluZ3Vpc2ggdGhpcyBpbXBsZW1lbnRhdGlvbiBmcm9tIHRoZQotICogQXJpem9uYSBWZWdhcyBpbXBsZW1lbnRhdGlvbiBhcmU6Ci0gKiAgIG8gV2UgZG8gbm90IGNoYW5nZSB0aGUgbG9zcyBkZXRlY3Rpb24gb3IgcmVjb3ZlcnkgbWVjaGFuaXNtcyBvZgotICogICAgIExpbnV4IGluIGFueSB3YXkuIExpbnV4IGFscmVhZHkgcmVjb3ZlcnMgZnJvbSBsb3NzZXMgcXVpdGUgd2VsbCwKLSAqICAgICB1c2luZyBmaW5lLWdyYWluZWQgdGltZXJzLCBOZXdSZW5vLCBhbmQgRkFDSy4KLSAqICAgbyBUbyBhdm9pZCB0aGUgcGVyZm9ybWFuY2UgcGVuYWx0eSBpbXBvc2VkIGJ5IGluY3JlYXNpbmcgY3duZAotICogICAgIG9ubHkgZXZlcnktb3RoZXIgUlRUIGR1cmluZyBzbG93IHN0YXJ0LCB3ZSBpbmNyZWFzZSBkdXJpbmcKLSAqICAgICBldmVyeSBSVFQgZHVyaW5nIHNsb3cgc3RhcnQsIGp1c3QgbGlrZSBSZW5vLgotICogICBvIExhcmdlbHkgdG8gYWxsb3cgY29udGludW91cyBjd25kIGdyb3d0aCBkdXJpbmcgc2xvdyBzdGFydCwKLSAqICAgICB3ZSB1c2UgdGhlIHJhdGUgYXQgd2hpY2ggQUNLcyBjb21lIGJhY2sgYXMgdGhlICJhY3R1YWwiCi0gKiAgICAgcmF0ZSwgcmF0aGVyIHRoYW4gdGhlIHJhdGUgYXQgd2hpY2ggZGF0YSBpcyBzZW50LgotICogICBvIFRvIHNwZWVkIGNvbnZlcmdlbmNlIHRvIHRoZSByaWdodCByYXRlLCB3ZSBzZXQgdGhlIGN3bmQKLSAqICAgICB0byBhY2hpZXZlIHRoZSByaWdodCAoImFjdHVhbCIpIHJhdGUgd2hlbiB3ZSBleGl0IHNsb3cgc3RhcnQuCi0gKiAgIG8gVG8gZmlsdGVyIG91dCB0aGUgbm9pc2UgY2F1c2VkIGJ5IGRlbGF5ZWQgQUNLcywgd2UgdXNlIHRoZQotICogICAgIG1pbmltdW0gUlRUIHNhbXBsZSBvYnNlcnZlZCBkdXJpbmcgdGhlIGxhc3QgUlRUIHRvIGNhbGN1bGF0ZQotICogICAgIHRoZSBhY3R1YWwgcmF0ZS4KLSAqICAgbyBXaGVuIHRoZSBzZW5kZXIgcmUtc3RhcnRzIGZyb20gaWRsZSwgaXQgd2FpdHMgdW50aWwgaXQgaGFzCi0gKiAgICAgcmVjZWl2ZWQgQUNLcyBmb3IgYW4gZW50aXJlIGZsaWdodCBvZiBuZXcgZGF0YSBiZWZvcmUgbWFraW5nCi0gKiAgICAgYSBjd25kIGFkanVzdG1lbnQgZGVjaXNpb24uIFRoZSBvcmlnaW5hbCBWZWdhcyBpbXBsZW1lbnRhdGlvbgotICogICAgIGFzc3VtZWQgc2VuZGVycyBuZXZlciB3ZW50IGlkbGUuCi0gKi8KLXN0YXRpYyB2b2lkIHZlZ2FzX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHNlcV9ydHQpCi17Ci0JLyogVGhlIGtleSBwbGF5ZXJzIGFyZSB2X2JlZ19zbmRfdW5hIGFuZCB2X2JlZ19zbmRfbnh0LgotCSAqCi0JICogVGhlc2UgYXJlIHNvIG5hbWVkIGJlY2F1c2UgdGhleSByZXByZXNlbnQgdGhlIGFwcHJveGltYXRlIHZhbHVlcwotCSAqIG9mIHNuZF91bmEgYW5kIHNuZF9ueHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBSVFQuIE1vcmUKLQkgKiBwcmVjaXNlbHksIHRoZXkgcmVwcmVzZW50IHRoZSBhbW91bnQgb2YgZGF0YSBzZW50IGR1cmluZyB0aGUgUlRULgotCSAqIEF0IHRoZSBlbmQgb2YgdGhlIFJUVCwgd2hlbiB3ZSByZWNlaXZlIGFuIEFDSyBmb3Igdl9iZWdfc25kX254dCwKLQkgKiB3ZSB3aWxsIGNhbGN1bGF0ZSB0aGF0ICh2X2JlZ19zbmRfbnh0IC0gdl9iZWdfc25kX3VuYSkgb3V0c3RhbmRpbmcKLQkgKiBieXRlcyBvZiBkYXRhIGhhdmUgYmVlbiBBQ0tlZCBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgUlRULCBnaXZpbmcKLQkgKiBhbiAiYWN0dWFsIiByYXRlIG9mOgotCSAqCi0JICogICAgICh2X2JlZ19zbmRfbnh0IC0gdl9iZWdfc25kX3VuYSkgLyAocnR0IGR1cmF0aW9uKQotCSAqCi0JICogVW5mb3J0dW5hdGVseSwgdl9iZWdfc25kX3VuYSBpcyBub3QgZXhhY3RseSBlcXVhbCB0byBzbmRfdW5hLAotCSAqIGJlY2F1c2UgZGVsYXllZCBBQ0tzIGNhbiBjb3ZlciBtb3JlIHRoYW4gb25lIHNlZ21lbnQsIHNvIHRoZXkKLQkgKiBkb24ndCBsaW5lIHVwIG5pY2VseSB3aXRoIHRoZSBib3VuZGFyaWVzIG9mIFJUVHMuCi0JICoKLQkgKiBBbm90aGVyIHVuZm9ydHVuYXRlIGZhY3Qgb2YgbGlmZSBpcyB0aGF0IGRlbGF5ZWQgQUNLcyBkZWxheSB0aGUKLQkgKiBhZHZhbmNlIG9mIHRoZSBsZWZ0IGVkZ2Ugb2Ygb3VyIHNlbmQgd2luZG93LCBzbyB0aGF0IHRoZSBudW1iZXIKLQkgKiBvZiBieXRlcyB3ZSBzZW5kIGluIGFuIFJUVCBpcyBvZnRlbiBsZXNzIHRoYW4gb3VyIGN3bmQgd2lsbCBhbGxvdy4KLQkgKiBTbyB3ZSBrZWVwIHRyYWNrIG9mIG91ciBjd25kIHNlcGFyYXRlbHksIGluIHZfYmVnX3NuZF9jd25kLgotCSAqLwotCi0JaWYgKGFmdGVyKGFjaywgdHAtPnZlZ2FzLmJlZ19zbmRfbnh0KSkgewotCQkvKiBEbyB0aGUgVmVnYXMgb25jZS1wZXItUlRUIGN3bmQgYWRqdXN0bWVudC4gKi8KLQkJdTMyIG9sZF93bmQsIG9sZF9zbmRfY3duZDsKLQotCQkKLQkJLyogSGVyZSBvbGRfd25kIGlzIGVzc2VudGlhbGx5IHRoZSB3aW5kb3cgb2YgZGF0YSB0aGF0IHdhcwotCQkgKiBzZW50IGR1cmluZyB0aGUgcHJldmlvdXMgUlRULCBhbmQgaGFzIGFsbAotCQkgKiBiZWVuIGFja25vd2xlZGdlZCBpbiB0aGUgY291cnNlIG9mIHRoZSBSVFQgdGhhdCBlbmRlZAotCQkgKiB3aXRoIHRoZSBBQ0sgd2UganVzdCByZWNlaXZlZC4gTGlrZXdpc2UsIG9sZF9zbmRfY3duZAotCQkgKiBpcyB0aGUgY3duZCBkdXJpbmcgdGhlIHByZXZpb3VzIFJUVC4KLQkJICovCi0JCW9sZF93bmQgPSAodHAtPnZlZ2FzLmJlZ19zbmRfbnh0IC0gdHAtPnZlZ2FzLmJlZ19zbmRfdW5hKSAvCi0JCQl0cC0+bXNzX2NhY2hlX3N0ZDsKLQkJb2xkX3NuZF9jd25kID0gdHAtPnZlZ2FzLmJlZ19zbmRfY3duZDsKLQotCQkvKiBTYXZlIHRoZSBleHRlbnQgb2YgdGhlIGN1cnJlbnQgd2luZG93IHNvIHdlIGNhbiB1c2UgdGhpcwotCQkgKiBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IFJUVC4KLQkJICovCi0JCXRwLT52ZWdhcy5iZWdfc25kX3VuYSAgPSB0cC0+dmVnYXMuYmVnX3NuZF9ueHQ7Ci0JCXRwLT52ZWdhcy5iZWdfc25kX254dCAgPSB0cC0+c25kX254dDsKLQkJdHAtPnZlZ2FzLmJlZ19zbmRfY3duZCA9IHRwLT5zbmRfY3duZDsKLQotCQkvKiBUYWtlIGludG8gYWNjb3VudCB0aGUgY3VycmVudCBSVFQgc2FtcGxlIHRvbywgdG8KLQkJICogZGVjcmVhc2UgdGhlIGltcGFjdCBvZiBkZWxheWVkIGFja3MuIFRoaXMgZG91YmxlIGNvdW50cwotCQkgKiB0aGlzIHNhbXBsZSBzaW5jZSB3ZSBjb3VudCBpdCBmb3IgdGhlIG5leHQgd2luZG93IGFzIHdlbGwsCi0JCSAqIGJ1dCB0aGF0J3Mgbm90IHRvbyBhd2Z1bCwgc2luY2Ugd2UncmUgdGFraW5nIHRoZSBtaW4sCi0JCSAqIHJhdGhlciB0aGFuIGF2ZXJhZ2luZy4KLQkJICovCi0JCXZlZ2FzX3J0dF9jYWxjKHRwLCBzZXFfcnR0KTsKLQotCQkvKiBXZSBkbyB0aGUgVmVnYXMgY2FsY3VsYXRpb25zIG9ubHkgaWYgd2UgZ290IGVub3VnaCBSVFQKLQkJICogc2FtcGxlcyB0aGF0IHdlIGNhbiBiZSByZWFzb25hYmx5IHN1cmUgdGhhdCB3ZSBnb3QKLQkJICogYXQgbGVhc3Qgb25lIFJUVCBzYW1wbGUgdGhhdCB3YXNuJ3QgZnJvbSBhIGRlbGF5ZWQgQUNLLgotCQkgKiBJZiB3ZSBvbmx5IGhhZCAyIHNhbXBsZXMgdG90YWwsCi0JCSAqIHRoZW4gdGhhdCBtZWFucyB3ZSdyZSBnZXR0aW5nIG9ubHkgMSBBQ0sgcGVyIFJUVCwgd2hpY2gKLQkJICogbWVhbnMgdGhleSdyZSBhbG1vc3QgY2VydGFpbmx5IGRlbGF5ZWQgQUNLcy4KLQkJICogSWYgIHdlIGhhdmUgMyBzYW1wbGVzLCB3ZSBzaG91bGQgYmUgT0suCi0JCSAqLwotCi0JCWlmICh0cC0+dmVnYXMuY250UlRUIDw9IDIpIHsKLQkJCS8qIFdlIGRvbid0IGhhdmUgZW5vdWdoIFJUVCBzYW1wbGVzIHRvIGRvIHRoZSBWZWdhcwotCQkJICogY2FsY3VsYXRpb24sIHNvIHdlJ2xsIGJlaGF2ZSBsaWtlIFJlbm8uCi0JCQkgKi8KLQkJCWlmICh0cC0+c25kX2N3bmQgPiB0cC0+c25kX3NzdGhyZXNoKQotCQkJCXRwLT5zbmRfY3duZCsrOwotCQl9IGVsc2UgewotCQkJdTMyIHJ0dCwgdGFyZ2V0X2N3bmQsIGRpZmY7Ci0KLQkJCS8qIFdlIGhhdmUgZW5vdWdoIFJUVCBzYW1wbGVzLCBzbywgdXNpbmcgdGhlIFZlZ2FzCi0JCQkgKiBhbGdvcml0aG0sIHdlIGRldGVybWluZSBpZiB3ZSBzaG91bGQgaW5jcmVhc2Ugb3IKLQkJCSAqIGRlY3JlYXNlIGN3bmQsIGFuZCBieSBob3cgbXVjaC4KLQkJCSAqLwotCi0JCQkvKiBQbHVjayBvdXQgdGhlIFJUVCB3ZSBhcmUgdXNpbmcgZm9yIHRoZSBWZWdhcwotCQkJICogY2FsY3VsYXRpb25zLiBUaGlzIGlzIHRoZSBtaW4gUlRUIHNlZW4gZHVyaW5nIHRoZQotCQkJICogbGFzdCBSVFQuIFRha2luZyB0aGUgbWluIGZpbHRlcnMgb3V0IHRoZSBlZmZlY3RzCi0JCQkgKiBvZiBkZWxheWVkIEFDS3MsIGF0IHRoZSBjb3N0IG9mIG5vdGljaW5nIGNvbmdlc3Rpb24KLQkJCSAqIGEgYml0IGxhdGVyLgotCQkJICovCi0JCQlydHQgPSB0cC0+dmVnYXMubWluUlRUOwotCi0JCQkvKiBDYWxjdWxhdGUgdGhlIGN3bmQgd2Ugc2hvdWxkIGhhdmUsIGlmIHdlIHdlcmVuJ3QKLQkJCSAqIGdvaW5nIHRvbyBmYXN0LgotCQkJICoKLQkJCSAqIFRoaXMgaXM6Ci0JCQkgKiAgICAgKGFjdHVhbCByYXRlIGluIHNlZ21lbnRzKSAqIGJhc2VSVFQKLQkJCSAqIFdlIGtlZXAgaXQgYXMgYSBmaXhlZCBwb2ludCBudW1iZXIgd2l0aAotCQkJICogVl9QQVJBTV9TSElGVCBiaXRzIHRvIHRoZSByaWdodCBvZiB0aGUgYmluYXJ5IHBvaW50LgotCQkJICovCi0JCQl0YXJnZXRfY3duZCA9ICgob2xkX3duZCAqIHRwLT52ZWdhcy5iYXNlUlRUKQotCQkJCSAgICAgICA8PCBWX1BBUkFNX1NISUZUKSAvIHJ0dDsKLQotCQkJLyogQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHdpbmRvdyB3ZSBoYWQsCi0JCQkgKiBhbmQgdGhlIHdpbmRvdyB3ZSB3b3VsZCBsaWtlIHRvIGhhdmUuIFRoaXMgcXVhbnRpdHkKLQkJCSAqIGlzIHRoZSAiRGlmZiIgZnJvbSB0aGUgQXJpem9uYSBWZWdhcyBwYXBlcnMuCi0JCQkgKgotCQkJICogQWdhaW4sIHRoaXMgaXMgYSBmaXhlZCBwb2ludCBudW1iZXIgd2l0aAotCQkJICogVl9QQVJBTV9TSElGVCBiaXRzIHRvIHRoZSByaWdodCBvZiB0aGUgYmluYXJ5Ci0JCQkgKiBwb2ludC4KLQkJCSAqLwotCQkJZGlmZiA9IChvbGRfd25kIDw8IFZfUEFSQU1fU0hJRlQpIC0gdGFyZ2V0X2N3bmQ7Ci0KLQkJCWlmICh0cC0+c25kX2N3bmQgPCB0cC0+c25kX3NzdGhyZXNoKSB7Ci0JCQkJLyogU2xvdyBzdGFydC4gICovCi0JCQkJaWYgKGRpZmYgPiBzeXNjdGxfdGNwX3ZlZ2FzX2dhbW1hKSB7Ci0JCQkJCS8qIEdvaW5nIHRvbyBmYXN0LiBUaW1lIHRvIHNsb3cgZG93bgotCQkJCQkgKiBhbmQgc3dpdGNoIHRvIGNvbmdlc3Rpb24gYXZvaWRhbmNlLgotCQkJCQkgKi8KLQkJCQkJdHAtPnNuZF9zc3RocmVzaCA9IDI7Ci0KLQkJCQkJLyogU2V0IGN3bmQgdG8gbWF0Y2ggdGhlIGFjdHVhbCByYXRlCi0JCQkJCSAqIGV4YWN0bHk6Ci0JCQkJCSAqICAgY3duZCA9IChhY3R1YWwgcmF0ZSkgKiBiYXNlUlRUCi0JCQkJCSAqIFRoZW4gd2UgYWRkIDEgYmVjYXVzZSB0aGUgaW50ZWdlcgotCQkJCQkgKiB0cnVuY2F0aW9uIHJvYnMgdXMgb2YgZnVsbCBsaW5rCi0JCQkJCSAqIHV0aWxpemF0aW9uLgotCQkJCQkgKi8KLQkJCQkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwKLQkJCQkJCQkgICAodGFyZ2V0X2N3bmQgPj4KLQkJCQkJCQkgICAgVl9QQVJBTV9TSElGVCkrMSk7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qIENvbmdlc3Rpb24gYXZvaWRhbmNlLiAqLwotCQkJCXUzMiBuZXh0X3NuZF9jd25kOwotCi0JCQkJLyogRmlndXJlIG91dCB3aGVyZSB3ZSB3b3VsZCBsaWtlIGN3bmQKLQkJCQkgKiB0byBiZS4KLQkJCQkgKi8KLQkJCQlpZiAoZGlmZiA+IHN5c2N0bF90Y3BfdmVnYXNfYmV0YSkgewotCQkJCQkvKiBUaGUgb2xkIHdpbmRvdyB3YXMgdG9vIGZhc3QsIHNvCi0JCQkJCSAqIHdlIHNsb3cgZG93bi4KLQkJCQkJICovCi0JCQkJCW5leHRfc25kX2N3bmQgPSBvbGRfc25kX2N3bmQgLSAxOwotCQkJCX0gZWxzZSBpZiAoZGlmZiA8IHN5c2N0bF90Y3BfdmVnYXNfYWxwaGEpIHsKLQkJCQkJLyogV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZXh0cmEgcGFja2V0cwotCQkJCQkgKiBpbiB0aGUgbmV0d29yaywgc28gc3BlZWQgdXAuCi0JCQkJCSAqLwotCQkJCQluZXh0X3NuZF9jd25kID0gb2xkX3NuZF9jd25kICsgMTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBTZW5kaW5nIGp1c3QgYXMgZmFzdCBhcyB3ZQotCQkJCQkgKiBzaG91bGQgYmUuCi0JCQkJCSAqLwotCQkJCQluZXh0X3NuZF9jd25kID0gb2xkX3NuZF9jd25kOwotCQkJCX0KLQotCQkJCS8qIEFkanVzdCBjd25kIHVwd2FyZCBvciBkb3dud2FyZCwgdG93YXJkIHRoZQotCQkJCSAqIGRlc2lyZWQgdmFsdWUuCi0JCQkJICovCi0JCQkJaWYgKG5leHRfc25kX2N3bmQgPiB0cC0+c25kX2N3bmQpCi0JCQkJCXRwLT5zbmRfY3duZCsrOwotCQkJCWVsc2UgaWYgKG5leHRfc25kX2N3bmQgPCB0cC0+c25kX2N3bmQpCi0JCQkJCXRwLT5zbmRfY3duZC0tOwotCQkJfQotCQl9Ci0KLQkJLyogV2lwZSB0aGUgc2xhdGUgY2xlYW4gZm9yIHRoZSBuZXh0IFJUVC4gKi8KLQkJdHAtPnZlZ2FzLmNudFJUVCA9IDA7Ci0JCXRwLT52ZWdhcy5taW5SVFQgPSAweDdmZmZmZmZmOwotCX0KLQotCS8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBleGVjdXRlZCBmb3IgZXZlcnkgYWNrIHdlIHJlY2VpdmUsCi0JICogZXhjZXB0IGZvciBjb25kaXRpb25zIGNoZWNrZWQgaW4gc2hvdWxkX2FkdmFuY2VfY3duZCgpCi0JICogYmVmb3JlIHRoZSBjYWxsIHRvIHRjcF9jb25nX2F2b2lkKCkuIE1haW5seSB0aGlzIG1lYW5zIHRoYXQKLQkgKiB3ZSBvbmx5IGV4ZWN1dGUgdGhpcyBjb2RlIGlmIHRoZSBhY2sgYWN0dWFsbHkgYWNrZWQgc29tZQotCSAqIGRhdGEuCi0JICovCi0KLQkvKiBJZiB3ZSBhcmUgaW4gc2xvdyBzdGFydCwgaW5jcmVhc2Ugb3VyIGN3bmQgaW4gcmVzcG9uc2UgdG8gdGhpcyBBQ0suCi0JICogKElmIHdlIGFyZSBub3QgaW4gc2xvdyBzdGFydCB0aGVuIHdlIGFyZSBpbiBjb25nZXN0aW9uIGF2b2lkYW5jZSwKLQkgKiBhbmQgYWRqdXN0IG91ciBjb25nZXN0aW9uIHdpbmRvdyBvbmx5IG9uY2UgcGVyIFJUVC4gU2VlIHRoZSBjb2RlCi0JICogYWJvdmUuKQotCSAqLwotCWlmICh0cC0+c25kX2N3bmQgPD0gdHAtPnNuZF9zc3RocmVzaCkgCi0JCXRwLT5zbmRfY3duZCsrOwotCi0JLyogdG8ga2VlcCBjd25kIGZyb20gZ3Jvd2luZyB3aXRob3V0IGJvdW5kICovCi0JdHAtPnNuZF9jd25kID0gbWluX3QodTMyLCB0cC0+c25kX2N3bmQsIHRwLT5zbmRfY3duZF9jbGFtcCk7Ci0KLQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbmV2ZXIgc28gdGltaWQgYXMgdG8gcmVkdWNlIG91ciBjd25kIGJlbG93Ci0JICogMiBNU1MuCi0JICoKLQkgKiBHb2luZyBiZWxvdyAyIE1TUyB3b3VsZCByaXNrIGh1Z2UgZGVsYXllZCBBQ0tzIGZyb20gb3VyIHJlY2VpdmVyLgotCSAqLwotCXRwLT5zbmRfY3duZCA9IG1heCh0cC0+c25kX2N3bmQsIDJVKTsKLQotCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHNlcV9ydHQpCi17Ci0JaWYgKHRjcF92ZWdhc19lbmFibGVkKHRwKSkKLQkJdmVnYXNfY29uZ19hdm9pZCh0cCwgYWNrLCBzZXFfcnR0KTsKLQllbHNlCi0JCXJlbm9fY29uZ19hdm9pZCh0cCk7Ci19Ci0KIC8qIFJlc3RhcnQgdGltZXIgYWZ0ZXIgZm9yd2FyZCBwcm9ncmVzcyBvbiBjb25uZWN0aW9uLgogICogUkZDMjk4OCByZWNvbW1lbmRzIHRvIHJlc3RhcnQgdGltZXIgdG8gbm93K3J0by4KICAqLwpAQCAtMjM0OCwxNSArMTk1Nyw2IEBACiAJfQogfQogCi0vKiBUaGVyZSBpcyBvbmUgZG93bnNpZGUgdG8gdGhpcyBzY2hlbWUuICBBbHRob3VnaCB3ZSBrZWVwIHRoZQotICogQUNLIGNsb2NrIHRpY2tpbmcsIGFkanVzdGluZyBwYWNrZXQgY291bnRlcnMgYW5kIGFkdmFuY2luZwotICogY29uZ2VzdGlvbiB3aW5kb3csIHdlIGRvIG5vdCBsaWJlcmF0ZSBzb2NrZXQgc2VuZCBidWZmZXIKLSAqIHNwYWNlLgotICoKLSAqIE11Y2tpbmcgd2l0aCBza2ItPnRydWVzaXplIGFuZCBzay0+c2tfd21lbV9hbGxvYyBldCBhbC4KLSAqIHRoZW4gbWFraW5nIGEgd3JpdGUgc3BhY2Ugd2FrZXVwIGNhbGxiYWNrIGlzIGEgcG9zc2libGUKLSAqIGZ1dHVyZSBlbmhhbmNlbWVudC4gIFdBUk5JTkc6IGl0IGlzIG5vdCB0cml2aWFsIHRvIG1ha2UuCi0gKi8KIHN0YXRpYyBpbnQgdGNwX3Rzb19hY2tlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgX191MzIgbm93LCBfX3MzMiAqc2VxX3J0dCkKIHsKQEAgLTI0MTUsMTMgKzIwMTUsMTggQEAKIAogCiAvKiBSZW1vdmUgYWNrbm93bGVkZ2VkIGZyYW1lcyBmcm9tIHRoZSByZXRyYW5zbWlzc2lvbiBxdWV1ZS4gKi8KLXN0YXRpYyBpbnQgdGNwX2NsZWFuX3J0eF9xdWV1ZShzdHJ1Y3Qgc29jayAqc2ssIF9fczMyICpzZXFfcnR0X3ApCitzdGF0aWMgaW50IHRjcF9jbGVhbl9ydHhfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBfX3MzMiAqc2VxX3J0dF9wLCBzMzIgKnNlcV91c3J0dCkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCV9fdTMyIG5vdyA9IHRjcF90aW1lX3N0YW1wOwogCWludCBhY2tlZCA9IDA7CiAJX19zMzIgc2VxX3J0dCA9IC0xOworCXN0cnVjdCB0aW1ldmFsIHVzbm93OworCXUzMiBwa3RzX2Fja2VkID0gMDsKKworCWlmIChzZXFfdXNydHQpCisJCWRvX2dldHRpbWVvZmRheSgmdXNub3cpOwogCiAJd2hpbGUgKChza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKSkgJiYKIAkgICAgICAgc2tiICE9IHNrLT5za19zZW5kX2hlYWQpIHsKQEAgLTI0MzMsNyArMjAzOCw4IEBACiAJCSAqIHRoZSBvdGhlciBlbmQuCiAJCSAqLwogCQlpZiAoYWZ0ZXIoc2NiLT5lbmRfc2VxLCB0cC0+c25kX3VuYSkpIHsKLQkJCWlmICh0Y3Bfc2tiX3Bjb3VudChza2IpID4gMSkKKwkJCWlmICh0Y3Bfc2tiX3Bjb3VudChza2IpID4gMSAmJgorCQkJICAgIGFmdGVyKHRwLT5zbmRfdW5hLCBzY2ItPnNlcSkpCiAJCQkJYWNrZWQgfD0gdGNwX3Rzb19hY2tlZChzaywgc2tiLAogCQkJCQkJICAgICAgIG5vdywgJnNlcV9ydHQpOwogCQkJYnJlYWs7CkBAIC0yNDQ4LDYgKzIwNTQsNyBAQAogCQkgKi8KIAkJaWYgKCEoc2NiLT5mbGFncyAmIFRDUENCX0ZMQUdfU1lOKSkgewogCQkJYWNrZWQgfD0gRkxBR19EQVRBX0FDS0VEOworCQkJKytwa3RzX2Fja2VkOwogCQl9IGVsc2UgewogCQkJYWNrZWQgfD0gRkxBR19TWU5fQUNLRUQ7CiAJCQl0cC0+cmV0cmFuc19zdGFtcCA9IDA7CkBAIC0yNDYxLDYgKzIwNjgsMTAgQEAKIAkJCQlzZXFfcnR0ID0gLTE7CiAJCQl9IGVsc2UgaWYgKHNlcV9ydHQgPCAwKQogCQkJCXNlcV9ydHQgPSBub3cgLSBzY2ItPndoZW47CisJCQlpZiAoc2VxX3VzcnR0KQorCQkJCSpzZXFfdXNydHQgPSAodXNub3cudHZfc2VjIC0gc2tiLT5zdGFtcC50dl9zZWMpICogMTAwMDAwMAorCQkJCQkrICh1c25vdy50dl91c2VjIC0gc2tiLT5zdGFtcC50dl91c2VjKTsKKwogCQkJaWYgKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkKIAkJCQl0cC0+c2Fja2VkX291dCAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwogCQkJaWYgKHNhY2tlZCAmIFRDUENCX0xPU1QpCkBAIC0yNDc5LDggKzIwOTAsMTEgQEAKIAl9CiAKIAlpZiAoYWNrZWQmRkxBR19BQ0tFRCkgewotCQl0Y3BfYWNrX3VwZGF0ZV9ydHQodHAsIGFja2VkLCBzZXFfcnR0KTsKKwkJdGNwX2Fja191cGRhdGVfcnR0KHRwLCBhY2tlZCwgc2VxX3J0dCwgc2VxX3VzcnR0KTsKIAkJdGNwX2Fja19wYWNrZXRzX291dChzaywgdHApOworCisJCWlmICh0cC0+Y2Ffb3BzLT5wa3RzX2Fja2VkKQorCQkJdHAtPmNhX29wcy0+cGt0c19hY2tlZCh0cCwgcGt0c19hY2tlZCk7CiAJfQogCiAjaWYgRkFTVFJFVFJBTlNfREVCVUcgPiAwCkBAIC0yNjI0LDI1NyArMjIzOCw2IEBACiAJdHAtPmZydG9fY291bnRlciA9ICh0cC0+ZnJ0b19jb3VudGVyICsgMSkgJSAzOwogfQogCi0vKgotICogVENQIFdlc3R3b29kKwotICovCi0KLS8qCi0gKiBAaW5pdF93ZXN0d29vZAotICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBmaWVsZHMgdXNlZCBpbiBUQ1AgV2VzdHdvb2QrLiBXZSBjYW4ndAotICogZ2V0IG5vIGluZm9ybWF0aW9uIGFib3V0IFJUVG1pbiBhdCB0aGlzIHRpbWUgc28gd2Ugc2ltcGx5IHNldCBpdCB0bwotICogVENQX1dFU1RXT09EX0lOSVRfUlRULiBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gdG8gYmUgdG9vIGNvbnNlcnZhdGl2ZQotICogc2luY2UgaW4gdGhpcyB3YXkgd2UncmUgc3VyZSBpdCB3aWxsIGJlIHVwZGF0ZWQgaW4gYSBjb25zaXN0ZW50Ci0gKiB3YXkgYXMgc29vbiBhcyBwb3NzaWJsZS4gSXQgd2lsbCByZWFzb25hYmx5IGhhcHBlbiB3aXRoaW4gdGhlIGZpcnN0Ci0gKiBSVFQgcGVyaW9kIG9mIHRoZSBjb25uZWN0aW9uIGxpZmV0aW1lLgotICovCi0KLXN0YXRpYyB2b2lkIGluaXRfd2VzdHdvb2Qoc3RydWN0IHNvY2sgKnNrKQotewotICAgICAgICBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQotICAgICAgICB0cC0+d2VzdHdvb2QuYndfbnNfZXN0ID0gMDsKLSAgICAgICAgdHAtPndlc3R3b29kLmJ3X2VzdCA9IDA7Ci0gICAgICAgIHRwLT53ZXN0d29vZC5hY2NvdW50ZWQgPSAwOwotICAgICAgICB0cC0+d2VzdHdvb2QuY3VtdWxfYWNrID0gMDsKLSAgICAgICAgdHAtPndlc3R3b29kLnJ0dF93aW5fc3ggPSB0Y3BfdGltZV9zdGFtcDsKLSAgICAgICAgdHAtPndlc3R3b29kLnJ0dCA9IFRDUF9XRVNUV09PRF9JTklUX1JUVDsKLSAgICAgICAgdHAtPndlc3R3b29kLnJ0dF9taW4gPSBUQ1BfV0VTVFdPT0RfSU5JVF9SVFQ7Ci0gICAgICAgIHRwLT53ZXN0d29vZC5zbmRfdW5hID0gdHAtPnNuZF91bmE7Ci19Ci0KLS8qCi0gKiBAd2VzdHdvb2RfZG9fZmlsdGVyCi0gKiBMb3ctcGFzcyBmaWx0ZXIuIEltcGxlbWVudGVkIHVzaW5nIGNvbnN0YW50IGNvZWZmaWVudHMuCi0gKi8KLQotc3RhdGljIGlubGluZSBfX3UzMiB3ZXN0d29vZF9kb19maWx0ZXIoX191MzIgYSwgX191MzIgYikKLXsKLQlyZXR1cm4gKCgoNyAqIGEpICsgYikgPj4gMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdlc3R3b29kX2ZpbHRlcihzdHJ1Y3Qgc29jayAqc2ssIF9fdTMyIGRlbHRhKQotewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCi0JdHAtPndlc3R3b29kLmJ3X25zX2VzdCA9Ci0JCXdlc3R3b29kX2RvX2ZpbHRlcih0cC0+d2VzdHdvb2QuYndfbnNfZXN0LCAKLQkJCQkgICB0cC0+d2VzdHdvb2QuYmsgLyBkZWx0YSk7Ci0JdHAtPndlc3R3b29kLmJ3X2VzdCA9Ci0JCXdlc3R3b29kX2RvX2ZpbHRlcih0cC0+d2VzdHdvb2QuYndfZXN0LAotCQkJCSAgIHRwLT53ZXN0d29vZC5id19uc19lc3QpOwotfQotCi0vKiAKLSAqIEB3ZXN0d29vZF91cGRhdGVfcnR0bWluCi0gKiBJdCBpcyB1c2VkIHRvIHVwZGF0ZSBSVFRtaW4uIEluIHRoaXMgY2FzZSB3ZSBNVVNUIE5PVCB1c2UKLSAqIFdFU1RXT09EX1JUVF9NSU4gbWluaW11bSBib3VuZCBzaW5jZSB3ZSBjb3VsZCBiZSBvbiBhIExBTiEKLSAqLwotCi1zdGF0aWMgaW5saW5lIF9fdTMyIHdlc3R3b29kX3VwZGF0ZV9ydHRtaW4oY29uc3Qgc3RydWN0IHNvY2sgKnNrKQotewotCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCV9fdTMyIHJ0dG1pbiA9IHRwLT53ZXN0d29vZC5ydHRfbWluOwotCi0JaWYgKHRwLT53ZXN0d29vZC5ydHQgIT0gMCAmJgotCSAgICAodHAtPndlc3R3b29kLnJ0dCA8IHRwLT53ZXN0d29vZC5ydHRfbWluIHx8ICFydHRtaW4pKQotCQlydHRtaW4gPSB0cC0+d2VzdHdvb2QucnR0OwotCi0JcmV0dXJuIHJ0dG1pbjsKLX0KLQotLyoKLSAqIEB3ZXN0d29vZF9hY2tlZAotICogRXZhbHVhdGUgaW5jcmVhc2VzIGZvciBkay4gCi0gKi8KLQotc3RhdGljIGlubGluZSBfX3UzMiB3ZXN0d29vZF9hY2tlZChjb25zdCBzdHJ1Y3Qgc29jayAqc2spCi17Ci0JY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0KLQlyZXR1cm4gdHAtPnNuZF91bmEgLSB0cC0+d2VzdHdvb2Quc25kX3VuYTsKLX0KLQotLyoKLSAqIEB3ZXN0d29vZF9uZXdfd2luZG93Ci0gKiBJdCBldmFsdWF0ZXMgaWYgd2UgYXJlIHJlY2VpdmluZyBkYXRhIGluc2lkZSB0aGUgc2FtZSBSVFQgd2luZG93IGFzCi0gKiB3aGVuIHdlIHN0YXJ0ZWQuCi0gKiBSZXR1cm4gdmFsdWU6Ci0gKiBJdCByZXR1cm5zIDAgaWYgd2UgYXJlIHN0aWxsIGV2YWx1YXRpbmcgc2FtcGxlcyBpbiB0aGUgc2FtZSBSVFQKLSAqIHdpbmRvdywgMSBpZiB0aGUgc2FtcGxlIGhhcyB0byBiZSBjb25zaWRlcmVkIGluIHRoZSBuZXh0IHdpbmRvdy4KLSAqLwotCi1zdGF0aWMgaW50IHdlc3R3b29kX25ld193aW5kb3coY29uc3Qgc3RydWN0IHNvY2sgKnNrKQotewotCWNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCV9fdTMyIGxlZnRfYm91bmQ7Ci0JX191MzIgcnR0OwotCWludCByZXQgPSAwOwotCi0JbGVmdF9ib3VuZCA9IHRwLT53ZXN0d29vZC5ydHRfd2luX3N4OwotCXJ0dCA9IG1heCh0cC0+d2VzdHdvb2QucnR0LCAodTMyKSBUQ1BfV0VTVFdPT0RfUlRUX01JTik7Ci0KLQkvKgotCSAqIEEgUlRULXdpbmRvdyBoYXMgcGFzc2VkLiBCZSBjYXJlZnVsIHNpbmNlIGlmIFJUVCBpcyBsZXNzIHRoYW4KLQkgKiA1MG1zIHdlIGRvbid0IGZpbHRlciBidXQgd2UgY29udGludWUgJ2J1aWxkaW5nIHRoZSBzYW1wbGUnLgotCSAqIFRoaXMgbWluaW11bSBsaW1pdCB3YXMgY2hvb3NlbiBzaW5jZSBhbiBlc3RpbWF0aW9uIG9uIHNtYWxsCi0JICogdGltZSBpbnRlcnZhbHMgaXMgYmV0dGVyIHRvIGF2b2lkLi4uCi0JICogT2J2aW91bHN5IG9uIGEgTEFOIHdlIHJlYXNvbmFibHkgd2lsbCBhbHdheXMgaGF2ZQotCSAqIHJpZ2h0X2JvdW5kID0gbGVmdF9ib3VuZCArIFdFU1RXT09EX1JUVF9NSU4KLSAgICAgICAgICovCi0KLQlpZiAoKGxlZnRfYm91bmQgKyBydHQpIDwgdGNwX3RpbWVfc3RhbXApCi0JCXJldCA9IDE7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogQHdlc3R3b29kX3VwZGF0ZV93aW5kb3cKLSAqIEl0IHVwZGF0ZXMgUlRUIGV2YWx1YXRpb24gd2luZG93IGlmIGl0IGlzIHRoZSByaWdodCBtb21lbnQgdG8gZG8KLSAqIGl0LiBJZiBzbyBpdCBjYWxscyBmaWx0ZXIgZm9yIGV2YWx1YXRpbmcgYmFuZHdpZHRoLiAKLSAqLwotCi1zdGF0aWMgdm9pZCBfX3dlc3R3b29kX3VwZGF0ZV93aW5kb3coc3RydWN0IHNvY2sgKnNrLCBfX3UzMiBub3cpCi17Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JX191MzIgZGVsdGEgPSBub3cgLSB0cC0+d2VzdHdvb2QucnR0X3dpbl9zeDsKLQotICAgICAgICBpZiAoZGVsdGEpIHsKLQkJaWYgKHRwLT53ZXN0d29vZC5ydHQpCi0JCQl3ZXN0d29vZF9maWx0ZXIoc2ssIGRlbHRhKTsKLQotCQl0cC0+d2VzdHdvb2QuYmsgPSAwOwotCQl0cC0+d2VzdHdvb2QucnR0X3dpbl9zeCA9IHRjcF90aW1lX3N0YW1wOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCB3ZXN0d29vZF91cGRhdGVfd2luZG93KHN0cnVjdCBzb2NrICpzaywgX191MzIgbm93KQotewotCWlmICh3ZXN0d29vZF9uZXdfd2luZG93KHNrKSkgCi0JCV9fd2VzdHdvb2RfdXBkYXRlX3dpbmRvdyhzaywgbm93KTsKLX0KLQotLyoKLSAqIEBfX3RjcF93ZXN0d29vZF9mYXN0X2J3Ci0gKiBJdCBpcyBjYWxsZWQgd2hlbiB3ZSBhcmUgaW4gZmFzdCBwYXRoLiBJbiBwYXJ0aWN1bGFyIGl0IGlzIGNhbGxlZCB3aGVuCi0gKiBoZWFkZXIgcHJlZGljdGlvbiBpcyBzdWNjZXNzZnVsbC4gSW4gc3VjaCBjYXNlIGluZmFjdCB1cGRhdGUgaXMKLSAqIHN0cmFpZ2h0IGZvcndhcmQgYW5kIGRvZXNuJ3QgbmVlZCBhbnkgcGFydGljdWxhciBjYXJlLgotICovCi0KLXN0YXRpYyB2b2lkIF9fdGNwX3dlc3R3b29kX2Zhc3RfYncoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCi0Jd2VzdHdvb2RfdXBkYXRlX3dpbmRvdyhzaywgdGNwX3RpbWVfc3RhbXApOwotCi0JdHAtPndlc3R3b29kLmJrICs9IHdlc3R3b29kX2Fja2VkKHNrKTsKLQl0cC0+d2VzdHdvb2Quc25kX3VuYSA9IHRwLT5zbmRfdW5hOwotCXRwLT53ZXN0d29vZC5ydHRfbWluID0gd2VzdHdvb2RfdXBkYXRlX3J0dG1pbihzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfd2VzdHdvb2RfZmFzdF9idyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgICAgIGlmICh0Y3BfaXNfd2VzdHdvb2QodGNwX3NrKHNrKSkpCi0gICAgICAgICAgICAgICAgX190Y3Bfd2VzdHdvb2RfZmFzdF9idyhzaywgc2tiKTsKLX0KLQotCi0vKgotICogQHdlc3R3b29kX2R1cGFja191cGRhdGUKLSAqIEl0IHVwZGF0ZXMgYWNjb3VudGVkIGFuZCBjdW11bF9hY2sgd2hlbiByZWNlaXZpbmcgYSBkdXBhY2suCi0gKi8KLQotc3RhdGljIHZvaWQgd2VzdHdvb2RfZHVwYWNrX3VwZGF0ZShzdHJ1Y3Qgc29jayAqc2spCi17Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0KLQl0cC0+d2VzdHdvb2QuYWNjb3VudGVkICs9IHRwLT5tc3NfY2FjaGVfc3RkOwotCXRwLT53ZXN0d29vZC5jdW11bF9hY2sgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgd2VzdHdvb2RfbWF5X2NoYW5nZV9jdW11bChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCXJldHVybiAodHAtPndlc3R3b29kLmN1bXVsX2FjayA+IHRwLT5tc3NfY2FjaGVfc3RkKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdlc3R3b29kX3BhcnRpYWxfdXBkYXRlKHN0cnVjdCB0Y3Bfc29jayAqdHApCi17Ci0JdHAtPndlc3R3b29kLmFjY291bnRlZCAtPSB0cC0+d2VzdHdvb2QuY3VtdWxfYWNrOwotCXRwLT53ZXN0d29vZC5jdW11bF9hY2sgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdlc3R3b29kX2NvbXBsZXRlX3VwZGF0ZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQotewotCXRwLT53ZXN0d29vZC5jdW11bF9hY2sgLT0gdHAtPndlc3R3b29kLmFjY291bnRlZDsKLQl0cC0+d2VzdHdvb2QuYWNjb3VudGVkID0gMDsKLX0KLQotLyoKLSAqIEB3ZXN0d29vZF9hY2tlZF9jb3VudAotICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgY3VtdWxfYWNrIGZvciBldmFsdWF0aW5nIGRrIGluIGNhc2Ugb2YKLSAqIGRlbGF5ZWQgb3IgcGFydGlhbCBhY2tzLgotICovCi0KLXN0YXRpYyBpbmxpbmUgX191MzIgd2VzdHdvb2RfYWNrZWRfY291bnQoc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCi0JdHAtPndlc3R3b29kLmN1bXVsX2FjayA9IHdlc3R3b29kX2Fja2VkKHNrKTsKLQotICAgICAgICAvKiBJZiBjdW11bF9hY2sgaXMgMCB0aGlzIGlzIGEgZHVwYWNrIHNpbmNlIGl0J3Mgbm90IG1vdmluZwotICAgICAgICAgKiB0cC0+c25kX3VuYS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICghKHRwLT53ZXN0d29vZC5jdW11bF9hY2spKQotICAgICAgICAgICAgICAgIHdlc3R3b29kX2R1cGFja191cGRhdGUoc2spOwotCi0gICAgICAgIGlmICh3ZXN0d29vZF9tYXlfY2hhbmdlX2N1bXVsKHRwKSkgewotCQkvKiBQYXJ0aWFsIG9yIGRlbGF5ZWQgYWNrICovCi0JCWlmICh0cC0+d2VzdHdvb2QuYWNjb3VudGVkID49IHRwLT53ZXN0d29vZC5jdW11bF9hY2spCi0JCQl3ZXN0d29vZF9wYXJ0aWFsX3VwZGF0ZSh0cCk7Ci0JCWVsc2UKLQkJCXdlc3R3b29kX2NvbXBsZXRlX3VwZGF0ZSh0cCk7Ci0JfQotCi0JdHAtPndlc3R3b29kLnNuZF91bmEgPSB0cC0+c25kX3VuYTsKLQotCXJldHVybiB0cC0+d2VzdHdvb2QuY3VtdWxfYWNrOwotfQotCi0KLS8qCi0gKiBAX190Y3Bfd2VzdHdvb2Rfc2xvd19idwotICogSXQgaXMgY2FsbGVkIHdoZW4gc29tZXRoaW5nIGlzIGdvaW5nIHdyb25nLi5ldmVuIGlmIHRoZXJlIGNvdWxkCi0gKiBiZSBubyBwcm9ibGVtcyEgSW5mYWN0IGEgc2ltcGxlIGRlbGF5ZWQgcGFja2V0IG1heSB0cmlnZ2VyIGEKLSAqIGR1cGFjay4gQnV0IHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBpbiBzdWNoIGNhc2UuCi0gKi8KLQotc3RhdGljIHZvaWQgX190Y3Bfd2VzdHdvb2Rfc2xvd19idyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0KLQl3ZXN0d29vZF91cGRhdGVfd2luZG93KHNrLCB0Y3BfdGltZV9zdGFtcCk7Ci0KLQl0cC0+d2VzdHdvb2QuYmsgKz0gd2VzdHdvb2RfYWNrZWRfY291bnQoc2spOwotCXRwLT53ZXN0d29vZC5ydHRfbWluID0gd2VzdHdvb2RfdXBkYXRlX3J0dG1pbihzayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y3Bfd2VzdHdvb2Rfc2xvd19idyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0gICAgICAgIGlmICh0Y3BfaXNfd2VzdHdvb2QodGNwX3NrKHNrKSkpCi0gICAgICAgICAgICAgICAgX190Y3Bfd2VzdHdvb2Rfc2xvd19idyhzaywgc2tiKTsKLX0KLQogLyogVGhpcyByb3V0aW5lIGRlYWxzIHdpdGggaW5jb21pbmcgYWNrcywgYnV0IG5vdCBvdXRnb2luZyBvbmVzLiAqLwogc3RhdGljIGludCB0Y3BfYWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZsYWcpCiB7CkBAIC0yODg0LDYgKzIyNDcsNyBAQAogCXUzMiBhY2sgPSBUQ1BfU0tCX0NCKHNrYiktPmFja19zZXE7CiAJdTMyIHByaW9yX2luX2ZsaWdodDsKIAlzMzIgc2VxX3J0dDsKKwlzMzIgc2VxX3VzcnR0ID0gMDsKIAlpbnQgcHJpb3JfcGFja2V0czsKIAogCS8qIElmIHRoZSBhY2sgaXMgbmV3ZXIgdGhhbiBzZW50IG9yIG9sZGVyIHRoYW4gcHJldmlvdXMgYWNrcwpAQCAtMjkwMiw5ICsyMjY2LDEwIEBACiAJCSAqLwogCQl0Y3BfdXBkYXRlX3dsKHRwLCBhY2ssIGFja19zZXEpOwogCQl0cC0+c25kX3VuYSA9IGFjazsKLQkJdGNwX3dlc3R3b29kX2Zhc3RfYncoc2ssIHNrYik7CiAJCWZsYWcgfD0gRkxBR19XSU5fVVBEQVRFOwogCisJCXRjcF9jYV9ldmVudCh0cCwgQ0FfRVZFTlRfRkFTVF9BQ0spOworCiAJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX1RDUEhQQUNLUyk7CiAJfSBlbHNlIHsKIAkJaWYgKGFja19zZXEgIT0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKQpAQCAtMjkyMCw3ICsyMjg1LDcgQEAKIAkJaWYgKFRDUF9FQ05fcmN2X2Vjbl9lY2hvKHRwLCBza2ItPmgudGgpKQogCQkJZmxhZyB8PSBGTEFHX0VDRTsKIAotCQl0Y3Bfd2VzdHdvb2Rfc2xvd19idyhzayxza2IpOworCQl0Y3BfY2FfZXZlbnQodHAsIENBX0VWRU5UX1NMT1dfQUNLKTsKIAl9CiAKIAkvKiBXZSBwYXNzZWQgZGF0YSBhbmQgZ290IGl0IGFja2VkLCByZW1vdmUgYW55IHNvZnQgZXJyb3IKQEAgLTI5MzUsMjIgKzIzMDAsMjAgQEAKIAlwcmlvcl9pbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOwogCiAJLyogU2VlIGlmIHdlIGNhbiB0YWtlIGFueXRoaW5nIG9mZiBvZiB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gKi8KLQlmbGFnIHw9IHRjcF9jbGVhbl9ydHhfcXVldWUoc2ssICZzZXFfcnR0KTsKKwlmbGFnIHw9IHRjcF9jbGVhbl9ydHhfcXVldWUoc2ssICZzZXFfcnR0LAorCQkJCSAgICB0cC0+Y2Ffb3BzLT5ydHRfc2FtcGxlID8gJnNlcV91c3J0dCA6IE5VTEwpOwogCiAJaWYgKHRwLT5mcnRvX2NvdW50ZXIpCiAJCXRjcF9wcm9jZXNzX2ZydG8oc2ssIHByaW9yX3NuZF91bmEpOwogCiAJaWYgKHRjcF9hY2tfaXNfZHViaW91cyh0cCwgZmxhZykpIHsKIAkJLyogQWR2YW52ZSBDV05ELCBpZiBzdGF0ZSBhbGxvd3MgdGhpcy4gKi8KLQkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSAmJgotCQkgICAgKHRjcF92ZWdhc19lbmFibGVkKHRwKSB8fCBwcmlvcl9pbl9mbGlnaHQgPj0gdHAtPnNuZF9jd25kKSAmJgotCQkgICAgdGNwX21heV9yYWlzZV9jd25kKHRwLCBmbGFnKSkKLQkJCXRjcF9jb25nX2F2b2lkKHRwLCBhY2ssIHNlcV9ydHQpOworCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpICYmIHRjcF9tYXlfcmFpc2VfY3duZCh0cCwgZmxhZykpCisJCQl0Y3BfY29uZ19hdm9pZCh0cCwgYWNrLCAgc2VxX3J0dCwgcHJpb3JfaW5fZmxpZ2h0LCAwKTsKIAkJdGNwX2Zhc3RyZXRyYW5zX2FsZXJ0KHNrLCBwcmlvcl9zbmRfdW5hLCBwcmlvcl9wYWNrZXRzLCBmbGFnKTsKIAl9IGVsc2UgewotCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpICYmIAotCQkgICAgKHRjcF92ZWdhc19lbmFibGVkKHRwKSB8fCBwcmlvcl9pbl9mbGlnaHQgPj0gdHAtPnNuZF9jd25kKSkKLQkJCXRjcF9jb25nX2F2b2lkKHRwLCBhY2ssIHNlcV9ydHQpOworCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpKQorCQkJdGNwX2NvbmdfYXZvaWQodHAsIGFjaywgc2VxX3J0dCwgcHJpb3JfaW5fZmxpZ2h0LCAxKTsKIAl9CiAKIAlpZiAoKGZsYWcgJiBGTEFHX0ZPUldBUkRfUFJPR1JFU1MpIHx8ICEoZmxhZyZGTEFHX05PVF9EVVApKQpAQCAtMzQzOSw3ICsyODAyLDcgQEAKIAlpbnQgdGhpc19zYWNrOwogCiAJLyogRW1wdHkgb2ZvIHF1ZXVlLCBoZW5jZSwgYWxsIHRoZSBTQUNLcyBhcmUgZWF0ZW4uIENsZWFyLiAqLwotCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSA9PSAwKSB7CisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKIAkJdHAtPnJ4X29wdC5udW1fc2Fja3MgPSAwOwogCQl0cC0+cnhfb3B0LmVmZl9zYWNrcyA9IHRwLT5yeF9vcHQuZHNhY2s7CiAJCXJldHVybjsKQEAgLTM1NzIsMTMgKzI5MzUsMTMgQEAKIAkJaWYodGgtPmZpbikKIAkJCXRjcF9maW4oc2tiLCBzaywgdGgpOwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKIAkJCXRjcF9vZm9fcXVldWUoc2spOwogCiAJCQkvKiBSRkMyNTgxLiA0LjIuIFNIT1VMRCBzZW5kIGltbWVkaWF0ZSBBQ0ssIHdoZW4KIAkJCSAqIGdhcCBpbiBxdWV1ZSBpcyBmaWxsZWQuCiAJCQkgKi8KLQkJCWlmICghc2tiX3F1ZXVlX2xlbigmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCisJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkKIAkJCQl0cC0+YWNrLnBpbmdwb25nID0gMDsKIAkJfQogCkBAIC0zODg2LDkgKzMyNDksOCBAQAogCSAqIFRoaXMgbXVzdCBub3QgZXZlciBvY2N1ci4gKi8KIAogCS8qIEZpcnN0LCBwdXJnZSB0aGUgb3V0X29mX29yZGVyIHF1ZXVlLiAqLwotCWlmIChza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewotCQlORVRfQUREX1NUQVRTX0JIKExJTlVYX01JQl9PRk9QUlVORUQsIAotCQkJCSBza2JfcXVldWVfbGVuKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSk7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSB7CisJCU5FVF9JTkNfU1RBVFNfQkgoTElOVVhfTUlCX09GT1BSVU5FRCk7CiAJCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAogCQkvKiBSZXNldCBTQUNLIHN0YXRlLiAgQSBjb25mb3JtaW5nIFNBQ0sgaW1wbGVtZW50YXRpb24gd2lsbApAQCAtMzkzNyw2ICszMjk5LDI4IEBACiAJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9zaG91bGRfZXhwYW5kX3NuZGJ1ZihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJLyogSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGEgc3BlY2lmaWMgc2VuZCBidWZmZXIgc2V0dGluZywgZG8KKwkgKiBub3QgbW9kaWZ5IGl0LgorCSAqLworCWlmIChzay0+c2tfdXNlcmxvY2tzICYgU09DS19TTkRCVUZfTE9DSykKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBhcmUgdW5kZXIgZ2xvYmFsIFRDUCBtZW1vcnkgcHJlc3N1cmUsIGRvIG5vdCBleHBhbmQuICAqLworCWlmICh0Y3BfbWVtb3J5X3ByZXNzdXJlKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlIGFyZSB1bmRlciBzb2Z0IGdsb2JhbCBUQ1AgbWVtb3J5IHByZXNzdXJlLCBkbyBub3QgZXhwYW5kLiAgKi8KKwlpZiAoYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA+PSBzeXNjdGxfdGNwX21lbVswXSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiB3ZSBmaWxsZWQgdGhlIGNvbmdlc3Rpb24gd2luZG93LCBkbyBub3QgZXhwYW5kLiAgKi8KKwlpZiAodHAtPnBhY2tldHNfb3V0ID49IHRwLT5zbmRfY3duZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KIAogLyogV2hlbiBpbmNvbWluZyBBQ0sgYWxsb3dlZCB0byBmcmVlIHNvbWUgc2tiIGZyb20gd3JpdGVfcXVldWUsCiAgKiB3ZSByZW1lbWJlciB0aGlzIGV2ZW50IGluIGZsYWcgU09DS19RVUVVRV9TSFJVTksgYW5kIHdha2UgdXAgc29ja2V0CkBAIC0zOTQ4LDExICszMzMyLDggQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAotCWlmICh0cC0+cGFja2V0c19vdXQgPCB0cC0+c25kX2N3bmQgJiYKLQkgICAgIShzay0+c2tfdXNlcmxvY2tzICYgU09DS19TTkRCVUZfTE9DSykgJiYKLQkgICAgIXRjcF9tZW1vcnlfcHJlc3N1cmUgJiYKLQkgICAgYXRvbWljX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA8IHN5c2N0bF90Y3BfbWVtWzBdKSB7Ci0gCQlpbnQgc25kbWVtID0gbWF4X3QodTMyLCB0cC0+cnhfb3B0Lm1zc19jbGFtcCwgdHAtPm1zc19jYWNoZV9zdGQpICsKKwlpZiAodGNwX3Nob3VsZF9leHBhbmRfc25kYnVmKHNrLCB0cCkpIHsKKyAJCWludCBzbmRtZW0gPSBtYXhfdCh1MzIsIHRwLT5yeF9vcHQubXNzX2NsYW1wLCB0cC0+bXNzX2NhY2hlKSArCiAJCQlNQVhfVENQX0hFQURFUiArIDE2ICsgc2l6ZW9mKHN0cnVjdCBza19idWZmKSwKIAkJICAgIGRlbWFuZGVkID0gbWF4X3QodW5zaWduZWQgaW50LCB0cC0+c25kX2N3bmQsCiAJCQkJCQkgICB0cC0+cmVvcmRlcmluZyArIDEpOwpAQCAtMzk3NSwyMiArMzM1Niw5IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX3RjcF9kYXRhX3NuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHRjcF9kYXRhX3NuZF9jaGVjayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0KLQlpZiAoYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSB8fAotCSAgICB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApID49IHRwLT5zbmRfY3duZCB8fAotCSAgICB0Y3Bfd3JpdGVfeG1pdChzaywgdHAtPm5vbmFnbGUpKQotCQl0Y3BfY2hlY2tfcHJvYmVfdGltZXIoc2ssIHRwKTsKLX0KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZGF0YV9zbmRfY2hlY2soc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOwotCi0JaWYgKHNrYiAhPSBOVUxMKQotCQlfX3RjcF9kYXRhX3NuZF9jaGVjayhzaywgc2tiKTsKKwl0Y3BfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzaywgdHApOwogCXRjcF9jaGVja19zcGFjZShzayk7CiB9CiAKQEAgLTQyODQsNyArMzY1Miw3IEBACiAJCQkJICovCiAJCQkJdGNwX2Fjayhzaywgc2tiLCAwKTsKIAkJCQlfX2tmcmVlX3NrYihza2IpOyAKLQkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQkJCXJldHVybiAwOwogCQkJfSBlbHNlIHsgLyogSGVhZGVyIHRvbyBzbWFsbCAqLwogCQkJCVRDUF9JTkNfU1RBVFNfQkgoVENQX01JQl9JTkVSUlMpOwpAQCAtNDM1MCw3ICszNzE4LDcgQEAKIAkJCWlmIChUQ1BfU0tCX0NCKHNrYiktPmFja19zZXEgIT0gdHAtPnNuZF91bmEpIHsKIAkJCQkvKiBXZWxsLCBvbmx5IG9uZSBzbWFsbCBqdW1wbGV0IGluIGZhc3QgcGF0aC4uLiAqLwogCQkJCXRjcF9hY2soc2ssIHNrYiwgRkxBR19EQVRBKTsKLQkJCQl0Y3BfZGF0YV9zbmRfY2hlY2soc2spOworCQkJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQkJCWlmICghdGNwX2Fja19zY2hlZHVsZWQodHApKQogCQkJCQlnb3RvIG5vX2FjazsKIAkJCX0KQEAgLTQ0MjgsNyArMzc5Niw3IEBACiAJLyogc3RlcCA3OiBwcm9jZXNzIHRoZSBzZWdtZW50IHRleHQgKi8KIAl0Y3BfZGF0YV9xdWV1ZShzaywgc2tiKTsKIAotCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJdGNwX2RhdGFfc25kX2NoZWNrKHNrLCB0cCk7CiAJdGNwX2Fja19zbmRfY2hlY2soc2spOwogCXJldHVybiAwOwogCkBAIC00NTUyLDYgKzM5MjAsOCBAQAogCiAJCXRjcF9pbml0X21ldHJpY3Moc2spOwogCisJCXRjcF9pbml0X2Nvbmdlc3Rpb25fY29udHJvbCh0cCk7CisKIAkJLyogUHJldmVudCBzcHVyaW91cyB0Y3BfY3duZF9yZXN0YXJ0KCkgb24gZmlyc3QgZGF0YQogCQkgKiBwYWNrZXQuCiAJCSAqLwpAQCAtNDcwOCw5ICs0MDc4LDYgQEAKIAkJCWlmKHRwLT5hZl9zcGVjaWZpYy0+Y29ubl9yZXF1ZXN0KHNrLCBza2IpIDwgMCkKIAkJCQlyZXR1cm4gMTsKIAotCQkJaW5pdF93ZXN0d29vZChzayk7Ci0JCQlpbml0X2JpY3RjcCh0cCk7Ci0KIAkJCS8qIE5vdyB3ZSBoYXZlIHNldmVyYWwgb3B0aW9uczogSW4gdGhlb3J5IHRoZXJlIGlzIAogCQkJICogbm90aGluZyBlbHNlIGluIHRoZSBmcmFtZS4gS0E5USBoYXMgYW4gb3B0aW9uIHRvIAogCQkJICogc2VuZCBkYXRhIHdpdGggdGhlIHN5biwgQlNEIGFjY2VwdHMgZGF0YSB3aXRoIHRoZQpAQCAtNDczMiw5ICs0MDk5LDYgQEAKIAkJZ290byBkaXNjYXJkOwogCiAJY2FzZSBUQ1BfU1lOX1NFTlQ6Ci0JCWluaXRfd2VzdHdvb2Qoc2spOwotCQlpbml0X2JpY3RjcCh0cCk7Ci0KIAkJcXVldWVkID0gdGNwX3Jjdl9zeW5zZW50X3N0YXRlX3Byb2Nlc3Moc2ssIHNrYiwgdGgsIGxlbik7CiAJCWlmIChxdWV1ZWQgPj0gMCkKIAkJCXJldHVybiBxdWV1ZWQ7CkBAIC00NzQyLDcgKzQxMDYsNyBAQAogCQkvKiBEbyBzdGVwNiBvbndhcmQgYnkgaGFuZC4gKi8KIAkJdGNwX3VyZyhzaywgc2tiLCB0aCk7CiAJCV9fa2ZyZWVfc2tiKHNrYik7Ci0JCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQ4MTYsNyArNDE4MCw3IEBACiAJCQkJICovCiAJCQkJaWYgKHRwLT5yeF9vcHQuc2F3X3RzdGFtcCAmJiB0cC0+cnhfb3B0LnJjdl90c2VjciAmJgogCQkJCSAgICAhdHAtPnNydHQpCi0JCQkJCXRjcF9hY2tfc2F3X3RzdGFtcCh0cCwgMCk7CisJCQkJCXRjcF9hY2tfc2F3X3RzdGFtcCh0cCwgMCwgMCk7CiAKIAkJCQlpZiAodHAtPnJ4X29wdC50c3RhbXBfb2spCiAJCQkJCXRwLT5hZHZtc3MgLT0gVENQT0xFTl9UU1RBTVBfQUxJR05FRDsKQEAgLTQ4MjgsNiArNDE5Miw4IEBACiAKIAkJCQl0Y3BfaW5pdF9tZXRyaWNzKHNrKTsKIAorCQkJCXRjcF9pbml0X2Nvbmdlc3Rpb25fY29udHJvbCh0cCk7CisKIAkJCQkvKiBQcmV2ZW50IHNwdXJpb3VzIHRjcF9jd25kX3Jlc3RhcnQoKSBvbgogCQkJCSAqIGZpcnN0IGRhdGEgcGFja2V0LgogCQkJCSAqLwpAQCAtNDkzMSw3ICs0Mjk3LDcgQEAKIAogCS8qIHRjcF9kYXRhIGNvdWxkIG1vdmUgc29ja2V0IHRvIFRJTUUtV0FJVCAqLwogCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7Ci0JCXRjcF9kYXRhX3NuZF9jaGVjayhzayk7CisJCXRjcF9kYXRhX3NuZF9jaGVjayhzaywgdHApOwogCQl0Y3BfYWNrX3NuZF9jaGVjayhzayk7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCAyZDQxZDVkLi42MmY2MmJiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTIwNDUsOSArMjA0NSwxMCBAQAogCSAqLwogCXRwLT5zbmRfc3N0aHJlc2ggPSAweDdmZmZmZmZmOwkvKiBJbmZpbml0eSAqLwogCXRwLT5zbmRfY3duZF9jbGFtcCA9IH4wOwotCXRwLT5tc3NfY2FjaGVfc3RkID0gdHAtPm1zc19jYWNoZSA9IDUzNjsKKwl0cC0+bXNzX2NhY2hlID0gNTM2OwogCiAJdHAtPnJlb3JkZXJpbmcgPSBzeXNjdGxfdGNwX3Jlb3JkZXJpbmc7CisJdHAtPmNhX29wcyA9ICZ0Y3BfaW5pdF9jb25nZXN0aW9uX29wczsKIAogCXNrLT5za19zdGF0ZSA9IFRDUF9DTE9TRTsKIApAQCAtMjA3MCw2ICsyMDcxLDggQEAKIAogCXRjcF9jbGVhcl94bWl0X3RpbWVycyhzayk7CiAKKwl0Y3BfY2xlYW51cF9jb25nZXN0aW9uX2NvbnRyb2wodHApOworCiAJLyogQ2xlYW51cCB1cCB0aGUgd3JpdGUgYnVmZmVyLiAqLwogICAJc2tfc3RyZWFtX3dyaXRlcXVldWVfcHVyZ2Uoc2spOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKaW5kZXggYjM5NDNlNy4uZjQyYTI4NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCisrKyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwpAQCAtNzc0LDYgKzc3NCw4IEBACiAJCW5ld3RwLT5mcnRvX2NvdW50ZXIgPSAwOwogCQluZXd0cC0+ZnJ0b19oaWdobWFyayA9IDA7CiAKKwkJbmV3dHAtPmNhX29wcyA9ICZ0Y3BfcmVubzsKKwogCQl0Y3Bfc2V0X2NhX3N0YXRlKG5ld3RwLCBUQ1BfQ0FfT3Blbik7CiAJCXRjcF9pbml0X3htaXRfdGltZXJzKG5ld3NrKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbmV3dHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CkBAIC04NDIsOCArODQ0LDYgQEAKIAkJaWYgKG5ld3RwLT5lY25fZmxhZ3MmVENQX0VDTl9PSykKIAkJCXNvY2tfc2V0X2ZsYWcobmV3c2ssIFNPQ0tfTk9fTEFSR0VTRU5EKTsKIAotCQl0Y3BfY2FfaW5pdChuZXd0cCk7Ci0KIAkJVENQX0lOQ19TVEFUU19CSChUQ1BfTUlCX1BBU1NJVkVPUEVOUyk7CiAJfQogCXJldHVybiBuZXdzazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCBmMTdjNjU3Li5lM2Y4ZWExIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC00OSw3ICs0OSw3IEBACiAgKiB3aWxsIGFsbG93IGEgc2luZ2xlIFRTTyBmcmFtZSB0byBjb25zdW1lLiAgQnVpbGRpbmcgVFNPIGZyYW1lcwogICogd2hpY2ggYXJlIHRvbyBsYXJnZSBjYW4gY2F1c2UgVENQIHN0cmVhbXMgdG8gYmUgYnVyc3R5LgogICovCi1pbnQgc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IgPSA4OworaW50IHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yID0gMzsKIAogc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAogCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTExLDggKzExMSw3IEBACiAJdTMyIHJlc3RhcnRfY3duZCA9IHRjcF9pbml0X2N3bmQodHAsIGRzdCk7CiAJdTMyIGN3bmQgPSB0cC0+c25kX2N3bmQ7CiAKLQlpZiAodGNwX2lzX3ZlZ2FzKHRwKSkgCi0JCXRjcF92ZWdhc19lbmFibGUodHApOworCXRjcF9jYV9ldmVudCh0cCwgQ0FfRVZFTlRfQ1dORF9SRVNUQVJUKTsKIAogCXRwLT5zbmRfc3N0aHJlc2ggPSB0Y3BfY3VycmVudF9zc3RocmVzaCh0cCk7CiAJcmVzdGFydF9jd25kID0gbWluKHJlc3RhcnRfY3duZCwgY3duZCk7CkBAIC0xNDEsMTEgKzE0MCwxMSBAQAogCQl0cC0+YWNrLnBpbmdwb25nID0gMTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZXZlbnRfYWNrX3NlbnQoc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIF9faW5saW5lX18gdm9pZCB0Y3BfZXZlbnRfYWNrX3NlbnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgcGt0cykKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAotCXRjcF9kZWNfcXVpY2thY2tfbW9kZSh0cCk7CisJdGNwX2RlY19xdWlja2Fja19tb2RlKHRwLCBwa3RzKTsKIAl0Y3BfY2xlYXJfeG1pdF90aW1lcihzaywgVENQX1RJTUVfREFDSyk7CiB9CiAKQEAgLTI4MCw2ICsyNzksMTAgQEAKICNkZWZpbmUgU1lTQ1RMX0ZMQUdfV1NDQUxFCTB4MgogI2RlZmluZSBTWVNDVExfRkxBR19TQUNLCTB4NAogCisJCS8qIElmIGNvbmdlc3Rpb24gY29udHJvbCBpcyBkb2luZyB0aW1lc3RhbXBpbmcgKi8KKwkJaWYgKHRwLT5jYV9vcHMtPnJ0dF9zYW1wbGUpCisJCQlkb19nZXR0aW1lb2ZkYXkoJnNrYi0+c3RhbXApOworCiAJCXN5c2N0bF9mbGFncyA9IDA7CiAJCWlmICh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19TWU4pIHsKIAkJCXRjcF9oZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArIFRDUE9MRU5fTVNTOwpAQCAtMzA0LDE3ICszMDcsOCBAQAogCQkJCQkgICAgKHRwLT5yeF9vcHQuZWZmX3NhY2tzICogVENQT0xFTl9TQUNLX1BFUkJMT0NLKSk7CiAJCX0KIAkJCi0JCS8qCi0JCSAqIElmIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgYW5kIHdlIGFyZSByZXN0YXJ0aW5nLAotCQkgKiB0aGVuIHdlIGRvbid0IHdhbnQgdG8gZG8gYW55IFZlZ2FzIGNhbGN1bGF0aW9ucwotCQkgKiB1bnRpbCB3ZSBnZXQgZnJlc2ggUlRUIHNhbXBsZXMuICBTbyB3aGVuIHdlCi0JCSAqIHJlc3RhcnQsIHdlIHJlc2V0IG91ciBWZWdhcyBzdGF0ZSB0byBhIGNsZWFuCi0JCSAqIHNsYXRlLiBBZnRlciB3ZSBnZXQgYWNrcyBmb3IgdGhpcyBmbGlnaHQgb2YKLQkJICogcGFja2V0cywgX3RoZW5fIHdlIGNhbiBtYWtlIFZlZ2FzIGNhbGN1bGF0aW9ucwotCQkgKiBhZ2Fpbi4KLQkJICovCi0JCWlmICh0Y3BfaXNfdmVnYXModHApICYmIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgPT0gMCkKLQkJCXRjcF92ZWdhc19lbmFibGUodHApOworCQlpZiAodGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSA9PSAwKQorCQkJdGNwX2NhX2V2ZW50KHRwLCBDQV9FVkVOVF9UWF9TVEFSVCk7CiAKIAkJdGggPSAoc3RydWN0IHRjcGhkciAqKSBza2JfcHVzaChza2IsIHRjcF9oZWFkZXJfc2l6ZSk7CiAJCXNrYi0+aC50aCA9IHRoOwpAQCAtMzYxLDcgKzM1NSw3IEBACiAJCXRwLT5hZl9zcGVjaWZpYy0+c2VuZF9jaGVjayhzaywgdGgsIHNrYi0+bGVuLCBza2IpOwogCiAJCWlmICh0Y2ItPmZsYWdzICYgVENQQ0JfRkxBR19BQ0spCi0JCQl0Y3BfZXZlbnRfYWNrX3NlbnQoc2spOworCQkJdGNwX2V2ZW50X2Fja19zZW50KHNrLCB0Y3Bfc2tiX3Bjb3VudChza2IpKTsKIAogCQlpZiAoc2tiLT5sZW4gIT0gdGNwX2hlYWRlcl9zaXplKQogCQkJdGNwX2V2ZW50X2RhdGFfc2VudCh0cCwgc2tiLCBzayk7CkBAIC00MDksNDIgKzQwMywxMSBAQAogCQlzay0+c2tfc2VuZF9oZWFkID0gc2tiOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGNwX3Rzb19zZXRfcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCS8qIEZvcmNlIHB1c2ggdG8gYmUgb24gZm9yIGFueSBUU08gZnJhbWVzIHRvIHdvcmthcm91bmQKLQkgKiBwcm9ibGVtcyB3aXRoIGJ1c3RlZCBpbXBsZW1lbnRhdGlvbnMgbGlrZSBNYWMgT1MtWCB0aGF0Ci0JICogaG9sZCBvZmYgc29ja2V0IHJlY2VpdmUgd2FrZXVwcyB1bnRpbCBwdXNoIGlzIHNlZW4uCi0JICovCi0JaWYgKHRjcF9za2JfcGNvdW50KHNrYikgPiAxKQotCQlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzIHw9IFRDUENCX0ZMQUdfUFNIOwotfQotCi0vKiBTZW5kIF9zaW5nbGVfIHNrYiBzaXR0aW5nIGF0IHRoZSBzZW5kIGhlYWQuIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMKLSAqIHRydWUgcHVzaCBwZW5kaW5nIGZyYW1lcyB0byBzZXR1cCBwcm9iZSB0aW1lciBldGMuCi0gKi8KLXZvaWQgdGNwX3B1c2hfb25lKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgY3VyX21zcykKLXsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKLQotCWlmICh0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgY3VyX21zcywgVENQX05BR0xFX1BVU0gpKSB7Ci0JCS8qIFNlbmQgaXQgb3V0IG5vdy4gKi8KLQkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7Ci0JCXRjcF90c29fc2V0X3B1c2goc2tiKTsKLQkJaWYgKCF0Y3BfdHJhbnNtaXRfc2tiKHNrLCBza2JfY2xvbmUoc2tiLCBzay0+c2tfYWxsb2NhdGlvbikpKSB7Ci0JCQlzay0+c2tfc2VuZF9oZWFkID0gTlVMTDsKLQkJCXRwLT5zbmRfbnh0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwotCQkJdGNwX3BhY2tldHNfb3V0X2luYyhzaywgdHAsIHNrYik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgdGNwX3NldF9za2JfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JaWYgKHNrYi0+bGVuIDw9IHRwLT5tc3NfY2FjaGVfc3RkIHx8CisJaWYgKHNrYi0+bGVuIDw9IHRwLT5tc3NfY2FjaGUgfHwKIAkgICAgIShzay0+c2tfcm91dGVfY2FwcyAmIE5FVElGX0ZfVFNPKSkgewogCQkvKiBBdm9pZCB0aGUgY29zdGx5IGRpdmlkZSBpbiB0aGUgbm9ybWFsCiAJCSAqIG5vbi1UU08gY2FzZS4KQEAgLTQ1NCwxMCArNDE3LDEwIEBACiAJfSBlbHNlIHsKIAkJdW5zaWduZWQgaW50IGZhY3RvcjsKIAotCQlmYWN0b3IgPSBza2ItPmxlbiArICh0cC0+bXNzX2NhY2hlX3N0ZCAtIDEpOwotCQlmYWN0b3IgLz0gdHAtPm1zc19jYWNoZV9zdGQ7CisJCWZhY3RvciA9IHNrYi0+bGVuICsgKHRwLT5tc3NfY2FjaGUgLSAxKTsKKwkJZmFjdG9yIC89IHRwLT5tc3NfY2FjaGU7CiAJCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgPSBmYWN0b3I7Ci0JCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSB0cC0+bXNzX2NhY2hlX3N0ZDsKKwkJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IHRwLT5tc3NfY2FjaGU7CiAJfQogfQogCkBAIC01MjEsNiArNDg0LDcgQEAKIAkgKiBza2JzLCB3aGljaCBpdCBuZXZlciBzZW50IGJlZm9yZS4gLS1BTksKIAkgKi8KIAlUQ1BfU0tCX0NCKGJ1ZmYpLT53aGVuID0gVENQX1NLQl9DQihza2IpLT53aGVuOworCWJ1ZmYtPnN0YW1wID0gc2tiLT5zdGFtcDsKIAogCWlmIChUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIFRDUENCX0xPU1QpIHsKIAkJdHAtPmxvc3Rfb3V0IC09IHRjcF9za2JfcGNvdW50KHNrYik7CkBAIC01NDIsNiArNTA2LDcgQEAKIAl9CiAKIAkvKiBMaW5rIEJVRkYgaW50byB0aGUgc2VuZCBxdWV1ZS4gKi8KKwlza2JfaGVhZGVyX3JlbGVhc2UoYnVmZik7CiAJX19za2JfYXBwZW5kKHNrYiwgYnVmZik7CiAKIAlyZXR1cm4gMDsKQEAgLTY2Miw3ICs2MjcsNyBAQAogCiAJLyogQW5kIHN0b3JlIGNhY2hlZCByZXN1bHRzICovCiAJdHAtPnBtdHVfY29va2llID0gcG10dTsKLQl0cC0+bXNzX2NhY2hlID0gdHAtPm1zc19jYWNoZV9zdGQgPSBtc3Nfbm93OworCXRwLT5tc3NfY2FjaGUgPSBtc3Nfbm93OwogCiAJcmV0dXJuIG1zc19ub3c7CiB9CkBAIC02NzQsNTkgKzYzOSwzMTggQEAKICAqIGNhbm5vdCBiZSBsYXJnZS4gSG93ZXZlciwgdGFraW5nIGludG8gYWNjb3VudCByYXJlIHVzZSBvZiBVUkcsIHRoaXMKICAqIGlzIG5vdCBhIGJpZyBmbGF3LgogICovCi0KLXVuc2lnbmVkIGludCB0Y3BfY3VycmVudF9tc3Moc3RydWN0IHNvY2sgKnNrLCBpbnQgbGFyZ2UpCit1bnNpZ25lZCBpbnQgdGNwX2N1cnJlbnRfbXNzKHN0cnVjdCBzb2NrICpzaywgaW50IGxhcmdlX2FsbG93ZWQpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gX19za19kc3RfZ2V0KHNrKTsKLQl1bnNpZ25lZCBpbnQgZG9fbGFyZ2UsIG1zc19ub3c7CisJdTMyIG1zc19ub3c7CisJdTE2IHhtaXRfc2l6ZV9nb2FsOworCWludCBkb2luZ190c28gPSAwOwogCi0JbXNzX25vdyA9IHRwLT5tc3NfY2FjaGVfc3RkOworCW1zc19ub3cgPSB0cC0+bXNzX2NhY2hlOworCisJaWYgKGxhcmdlX2FsbG93ZWQgJiYKKwkgICAgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pICYmCisJICAgICF0cC0+dXJnX21vZGUpCisJCWRvaW5nX3RzbyA9IDE7CisKIAlpZiAoZHN0KSB7CiAJCXUzMiBtdHUgPSBkc3RfbXR1KGRzdCk7CiAJCWlmIChtdHUgIT0gdHAtPnBtdHVfY29va2llKQogCQkJbXNzX25vdyA9IHRjcF9zeW5jX21zcyhzaywgbXR1KTsKIAl9CiAKLQlkb19sYXJnZSA9IChsYXJnZSAmJgotCQkgICAgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pICYmCi0JCSAgICAhdHAtPnVyZ19tb2RlKTsKLQotCWlmIChkb19sYXJnZSkgewotCQl1bnNpZ25lZCBpbnQgbGFyZ2VfbXNzLCBmYWN0b3IsIGxpbWl0OwotCi0JCWxhcmdlX21zcyA9IDY1NTM1IC0gdHAtPmFmX3NwZWNpZmljLT5uZXRfaGVhZGVyX2xlbiAtCi0JCQl0cC0+ZXh0X2hlYWRlcl9sZW4gLSB0cC0+dGNwX2hlYWRlcl9sZW47Ci0KLQkJaWYgKHRwLT5tYXhfd2luZG93ICYmIGxhcmdlX21zcyA+ICh0cC0+bWF4X3dpbmRvdz4+MSkpCi0JCQlsYXJnZV9tc3MgPSBtYXgoKHRwLT5tYXhfd2luZG93Pj4xKSwKLQkJCQkJNjhVIC0gdHAtPnRjcF9oZWFkZXJfbGVuKTsKLQotCQlmYWN0b3IgPSBsYXJnZV9tc3MgLyBtc3Nfbm93OwotCi0JCS8qIEFsd2F5cyBrZWVwIGxhcmdlIG1zcyBtdWx0aXBsZSBvZiByZWFsIG1zcywgYnV0Ci0JCSAqIGRvIG5vdCBleGNlZWQgMS90c29fd2luX2Rpdmlzb3Igb2YgdGhlIGNvbmdlc3Rpb24gd2luZG93Ci0JCSAqIHNvIHdlIGNhbiBrZWVwIHRoZSBBQ0sgY2xvY2sgdGlja2luZyBhbmQgbWluaW1pemUKLQkJICogYnVyc3RpbmcuCi0JCSAqLwotCQlsaW1pdCA9IHRwLT5zbmRfY3duZDsKLQkJaWYgKHN5c2N0bF90Y3BfdHNvX3dpbl9kaXZpc29yKQotCQkJbGltaXQgLz0gc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3I7Ci0JCWxpbWl0ID0gbWF4KDFVLCBsaW1pdCk7Ci0JCWlmIChmYWN0b3IgPiBsaW1pdCkKLQkJCWZhY3RvciA9IGxpbWl0OwotCi0JCXRwLT5tc3NfY2FjaGUgPSBtc3Nfbm93ICogZmFjdG9yOwotCi0JCW1zc19ub3cgPSB0cC0+bXNzX2NhY2hlOwotCX0KLQogCWlmICh0cC0+cnhfb3B0LmVmZl9zYWNrcykKIAkJbXNzX25vdyAtPSAoVENQT0xFTl9TQUNLX0JBU0VfQUxJR05FRCArCiAJCQkgICAgKHRwLT5yeF9vcHQuZWZmX3NhY2tzICogVENQT0xFTl9TQUNLX1BFUkJMT0NLKSk7CisKKwl4bWl0X3NpemVfZ29hbCA9IG1zc19ub3c7CisKKwlpZiAoZG9pbmdfdHNvKSB7CisJCXhtaXRfc2l6ZV9nb2FsID0gNjU1MzUgLQorCQkJdHAtPmFmX3NwZWNpZmljLT5uZXRfaGVhZGVyX2xlbiAtCisJCQl0cC0+ZXh0X2hlYWRlcl9sZW4gLSB0cC0+dGNwX2hlYWRlcl9sZW47CisKKwkJaWYgKHRwLT5tYXhfd2luZG93ICYmCisJCSAgICAoeG1pdF9zaXplX2dvYWwgPiAodHAtPm1heF93aW5kb3cgPj4gMSkpKQorCQkJeG1pdF9zaXplX2dvYWwgPSBtYXgoKHRwLT5tYXhfd2luZG93ID4+IDEpLAorCQkJCQkgICAgIDY4VSAtIHRwLT50Y3BfaGVhZGVyX2xlbik7CisKKwkJeG1pdF9zaXplX2dvYWwgLT0gKHhtaXRfc2l6ZV9nb2FsICUgbXNzX25vdyk7CisJfQorCXRwLT54bWl0X3NpemVfZ29hbCA9IHhtaXRfc2l6ZV9nb2FsOworCiAJcmV0dXJuIG1zc19ub3c7CiB9CiAKKy8qIENvbmdlc3Rpb24gd2luZG93IHZhbGlkYXRpb24uIChSRkMyODYxKSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2N3bmRfdmFsaWRhdGUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCV9fdTMyIHBhY2tldHNfb3V0ID0gdHAtPnBhY2tldHNfb3V0OworCisJaWYgKHBhY2tldHNfb3V0ID49IHRwLT5zbmRfY3duZCkgeworCQkvKiBOZXR3b3JrIGlzIGZlZWQgZnVsbHkuICovCisJCXRwLT5zbmRfY3duZF91c2VkID0gMDsKKwkJdHAtPnNuZF9jd25kX3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJfSBlbHNlIHsKKwkJLyogTmV0d29yayBzdGFydmVzLiAqLworCQlpZiAodHAtPnBhY2tldHNfb3V0ID4gdHAtPnNuZF9jd25kX3VzZWQpCisJCQl0cC0+c25kX2N3bmRfdXNlZCA9IHRwLT5wYWNrZXRzX291dDsKKworCQlpZiAoKHMzMikodGNwX3RpbWVfc3RhbXAgLSB0cC0+c25kX2N3bmRfc3RhbXApID49IHRwLT5ydG8pCisJCQl0Y3BfY3duZF9hcHBsaWNhdGlvbl9saW1pdGVkKHNrKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGNwX3dpbmRvd19hbGxvd3Moc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG1zc19ub3csIHVuc2lnbmVkIGludCBjd25kKQoreworCXUzMiB3aW5kb3csIGN3bmRfbGVuOworCisJd2luZG93ID0gKHRwLT5zbmRfdW5hICsgdHAtPnNuZF93bmQgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSk7CisJY3duZF9sZW4gPSBtc3Nfbm93ICogY3duZDsKKwlyZXR1cm4gbWluKHdpbmRvdywgY3duZF9sZW4pOworfQorCisvKiBDYW4gYXQgbGVhc3Qgb25lIHNlZ21lbnQgb2YgU0tCIGJlIHNlbnQgcmlnaHQgbm93LCBhY2NvcmRpbmcgdG8gdGhlCisgKiBjb25nZXN0aW9uIHdpbmRvdyBydWxlcz8gIElmIHNvLCByZXR1cm4gaG93IG1hbnkgc2VnbWVudHMgYXJlIGFsbG93ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRjcF9jd25kX3Rlc3Qoc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgaW5fZmxpZ2h0LCBjd25kOworCisJLyogRG9uJ3QgYmUgc3RyaWN0IGFib3V0IHRoZSBjb25nZXN0aW9uIHdpbmRvdyBmb3IgdGhlIGZpbmFsIEZJTi4gICovCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikKKwkJcmV0dXJuIDE7CisKKwlpbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOworCWN3bmQgPSB0cC0+c25kX2N3bmQ7CisJaWYgKGluX2ZsaWdodCA8IGN3bmQpCisJCXJldHVybiAoY3duZCAtIGluX2ZsaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBtdXN0IGJlIGludm9rZWQgdGhlIGZpcnN0IHRpbWUgd2UgY29uc2lkZXIgdHJhbnNtaXR0aW5nCisgKiBTS0Igb250byB0aGUgd2lyZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX2luaXRfdHNvX3NlZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0c29fc2VncyA9IHRjcF9za2JfcGNvdW50KHNrYik7CisKKwlpZiAoIXRzb19zZWdzKSB7CisJCXRjcF9zZXRfc2tiX3Rzb19zZWdzKHNrLCBza2IpOworCQl0c29fc2VncyA9IHRjcF9za2JfcGNvdW50KHNrYik7CisJfQorCXJldHVybiB0c29fc2VnczsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGNwX21pbnNoYWxsX2NoZWNrKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIGFmdGVyKHRwLT5zbmRfc21sLHRwLT5zbmRfdW5hKSAmJgorCQkhYWZ0ZXIodHAtPnNuZF9zbWwsIHRwLT5zbmRfbnh0KTsKK30KKworLyogUmV0dXJuIDAsIGlmIHBhY2tldCBjYW4gYmUgc2VudCBub3cgd2l0aG91dCB2aW9sYXRpb24gTmFnbGUncyBydWxlczoKKyAqIDEuIEl0IGlzIGZ1bGwgc2l6ZWQuCisgKiAyLiBPciBpdCBjb250YWlucyBGSU4uIChhbHJlYWR5IGNoZWNrZWQgYnkgY2FsbGVyKQorICogMy4gT3IgVENQX05PREVMQVkgd2FzIHNldC4KKyAqIDQuIE9yIFRDUF9DT1JLIGlzIG5vdCBzZXQsIGFuZCBhbGwgc2VudCBwYWNrZXRzIGFyZSBBQ0tlZC4KKyAqICAgIFdpdGggTWluc2hhbGwncyBtb2RpZmljYXRpb246IGFsbCBzZW50IHNtYWxsIHBhY2tldHMgYXJlIEFDS2VkLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9uYWdsZV9jaGVjayhjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgCisJCQkJICB1bnNpZ25lZCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKK3sKKwlyZXR1cm4gKHNrYi0+bGVuIDwgbXNzX25vdyAmJgorCQkoKG5vbmFnbGUmVENQX05BR0xFX0NPUkspIHx8CisJCSAoIW5vbmFnbGUgJiYKKwkJICB0cC0+cGFja2V0c19vdXQgJiYKKwkJICB0Y3BfbWluc2hhbGxfY2hlY2sodHApKSkpOworfQorCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIE5hZ2xlIHRlc3QgYWxsb3dzIHRoaXMgcGFja2V0IHRvIGJlCisgKiBzZW50IG5vdy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGNwX25hZ2xlX3Rlc3Qoc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQoreworCS8qIE5hZ2xlIHJ1bGUgZG9lcyBub3QgYXBwbHkgdG8gZnJhbWVzLCB3aGljaCBzaXQgaW4gdGhlIG1pZGRsZSBvZiB0aGUKKwkgKiB3cml0ZV9xdWV1ZSAodGhleSBoYXZlIG5vIGNoYW5jZXMgdG8gZ2V0IG5ldyBkYXRhKS4KKwkgKgorCSAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGNhbGxlcnMsIHdoZXJlIHRoZXkgbW9kaWZ5IHRoZSAnbm9uYWdsZScKKwkgKiBhcmd1bWVudCBiYXNlZCB1cG9uIHRoZSBsb2NhdGlvbiBvZiBTS0IgaW4gdGhlIHNlbmQgcXVldWUuCisJICovCisJaWYgKG5vbmFnbGUgJiBUQ1BfTkFHTEVfUFVTSCkKKwkJcmV0dXJuIDE7CisKKwkvKiBEb24ndCB1c2UgdGhlIG5hZ2xlIHJ1bGUgZm9yIHVyZ2VudCBkYXRhIChvciBmb3IgdGhlIGZpbmFsIEZJTikuICAqLworCWlmICh0cC0+dXJnX21vZGUgfHwKKwkgICAgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikpCisJCXJldHVybiAxOworCisJaWYgKCF0Y3BfbmFnbGVfY2hlY2sodHAsIHNrYiwgY3VyX21zcywgbm9uYWdsZSkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERvZXMgYXQgbGVhc3QgdGhlIGZpcnN0IHNlZ21lbnQgb2YgU0tCIGZpdCBpbnRvIHRoZSBzZW5kIHdpbmRvdz8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRjcF9zbmRfd25kX3Rlc3Qoc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGN1cl9tc3MpCit7CisJdTMyIGVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisKKwlpZiAoc2tiLT5sZW4gPiBjdXJfbXNzKQorCQllbmRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyBjdXJfbXNzOworCisJcmV0dXJuICFhZnRlcihlbmRfc2VxLCB0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKTsKK30KKworLyogVGhpcyBjaGVja3MgaWYgdGhlIGRhdGEgYmVhcmluZyBwYWNrZXQgU0tCICh1c3VhbGx5IHNrLT5za19zZW5kX2hlYWQpCisgKiBzaG91bGQgYmUgcHV0IG9uIHRoZSB3aXJlIHJpZ2h0IG5vdy4gIElmIHNvLCBpdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAqIHBhY2tldHMgYWxsb3dlZCBieSB0aGUgY29uZ2VzdGlvbiB3aW5kb3cuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGNwX3NuZF90ZXN0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IGN1cl9tc3MsIGludCBub25hZ2xlKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXVuc2lnbmVkIGludCBjd25kX3F1b3RhOworCisJdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CisKKwlpZiAoIXRjcF9uYWdsZV90ZXN0KHRwLCBza2IsIGN1cl9tc3MsIG5vbmFnbGUpKQorCQlyZXR1cm4gMDsKKworCWN3bmRfcXVvdGEgPSB0Y3BfY3duZF90ZXN0KHRwLCBza2IpOworCWlmIChjd25kX3F1b3RhICYmCisJICAgICF0Y3Bfc25kX3duZF90ZXN0KHRwLCBza2IsIGN1cl9tc3MpKQorCQljd25kX3F1b3RhID0gMDsKKworCXJldHVybiBjd25kX3F1b3RhOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y3Bfc2tiX2lzX2xhc3QoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCAKKwkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmV4dCA9PSAoc3RydWN0IHNrX2J1ZmYgKikmc2stPnNrX3dyaXRlX3F1ZXVlOworfQorCitpbnQgdGNwX21heV9zZW5kX25vdyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisKKwlyZXR1cm4gKHNrYiAmJgorCQl0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgdGNwX2N1cnJlbnRfbXNzKHNrLCAxKSwKKwkJCSAgICAgKHRjcF9za2JfaXNfbGFzdChzaywgc2tiKSA/CisJCQkgICAgICBUQ1BfTkFHTEVfUFVTSCA6CisJCQkgICAgICB0cC0+bm9uYWdsZSkpKTsKK30KKworLyogVHJpbSBUU08gU0tCIHRvIExFTiBieXRlcywgcHV0IHRoZSByZW1haW5pbmcgZGF0YSBpbnRvIGEgbmV3IHBhY2tldAorICogd2hpY2ggaXMgcHV0IGFmdGVyIFNLQiBvbiB0aGUgbGlzdC4gIEl0IGlzIHZlcnkgbXVjaCBsaWtlCisgKiB0Y3BfZnJhZ21lbnQoKSBleGNlcHQgdGhhdCBpdCBtYXkgbWFrZSBzZXZlcmFsIGtpbmRzIG9mIGFzc3VtcHRpb25zCisgKiBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgc3BsaXR0aW5nIG9wZXJhdGlvbi4gIEluIHBhcnRpY3VsYXIsIHdlCisgKiBrbm93IHRoYXQgYWxsIHRoZSBkYXRhIGlzIGluIHNjYXR0ZXItZ2F0aGVyIHBhZ2VzLCBhbmQgdGhhdCB0aGUKKyAqIHBhY2tldCBoYXMgbmV2ZXIgYmVlbiBzZW50IG91dCBiZWZvcmUgKGFuZCB0aHVzIGlzIG5vdCBjbG9uZWQpLgorICovCitzdGF0aWMgaW50IHRzb19mcmFnbWVudChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CisJaW50IG5sZW4gPSBza2ItPmxlbiAtIGxlbjsKKwl1MTYgZmxhZ3M7CisKKwkvKiBBbGwgb2YgYSBUU08gZnJhbWUgbXVzdCBiZSBjb21wb3NlZCBvZiBwYWdlZCBkYXRhLiAgKi8KKwlCVUdfT04oc2tiLT5sZW4gIT0gc2tiLT5kYXRhX2xlbik7CisKKwlidWZmID0gc2tfc3RyZWFtX2FsbG9jX3Bza2Ioc2ssIDAsIDAsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseShidWZmID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1ZmYtPnRydWVzaXplID0gbmxlbjsKKwlza2ItPnRydWVzaXplIC09IG5sZW47CisKKwkvKiBDb3JyZWN0IHRoZSBzZXF1ZW5jZSBudW1iZXJzLiAqLworCVRDUF9TS0JfQ0IoYnVmZiktPnNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgbGVuOworCVRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihidWZmKS0+c2VxOworCisJLyogUFNIIGFuZCBGSU4gc2hvdWxkIG9ubHkgYmUgc2V0IGluIHRoZSBzZWNvbmQgcGFja2V0LiAqLworCWZsYWdzID0gVENQX1NLQl9DQihza2IpLT5mbGFnczsKKwlUQ1BfU0tCX0NCKHNrYiktPmZsYWdzID0gZmxhZ3MgJiB+KFRDUENCX0ZMQUdfRklOfFRDUENCX0ZMQUdfUFNIKTsKKwlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IGZsYWdzOworCisJLyogVGhpcyBwYWNrZXQgd2FzIG5ldmVyIHNlbnQgb3V0IHlldCwgc28gbm8gU0FDSyBiaXRzLiAqLworCVRDUF9TS0JfQ0IoYnVmZiktPnNhY2tlZCA9IDA7CisKKwlidWZmLT5pcF9zdW1tZWQgPSBza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCXNrYl9zcGxpdChza2IsIGJ1ZmYsIGxlbik7CisKKwkvKiBGaXggdXAgdHNvX2ZhY3RvciBmb3IgYm90aCBvcmlnaW5hbCBhbmQgbmV3IFNLQi4gICovCisJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIHNrYik7CisJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIGJ1ZmYpOworCisJLyogTGluayBCVUZGIGludG8gdGhlIHNlbmQgcXVldWUuICovCisJc2tiX2hlYWRlcl9yZWxlYXNlKGJ1ZmYpOworCV9fc2tiX2FwcGVuZChza2IsIGJ1ZmYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRyeSB0byBkZWZlciBzZW5kaW5nLCBpZiBwb3NzaWJsZSwgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGFtb3VudAorICogb2YgVFNPIHNwbGl0dGluZyB3ZSBkby4gIFZpZXcgaXQgYXMgYSBraW5kIG9mIFRTTyBOYWdsZSB0ZXN0LgorICoKKyAqIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gSm9obiBIZWZmbmVyLgorICovCitzdGF0aWMgaW50IHRjcF90c29fc2hvdWxkX2RlZmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHRjcF9zb2NrICp0cCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MzIgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OworCisJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgJiBUQ1BDQl9GTEFHX0ZJTikKKwkJcmV0dXJuIDA7CisKKwlpZiAodHAtPmNhX3N0YXRlICE9IFRDUF9DQV9PcGVuKQorCQlyZXR1cm4gMDsKKworCWluX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CisKKwlCVUdfT04odGNwX3NrYl9wY291bnQoc2tiKSA8PSAxIHx8CisJICAgICAgICh0cC0+c25kX2N3bmQgPD0gaW5fZmxpZ2h0KSk7CisKKwlzZW5kX3dpbiA9ICh0cC0+c25kX3VuYSArIHRwLT5zbmRfd25kKSAtIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCisJLyogRnJvbSBpbl9mbGlnaHQgdGVzdCBhYm92ZSwgd2Uga25vdyB0aGF0IGN3bmQgPiBpbl9mbGlnaHQuICAqLworCWNvbmdfd2luID0gKHRwLT5zbmRfY3duZCAtIGluX2ZsaWdodCkgKiB0cC0+bXNzX2NhY2hlOworCisJbGltaXQgPSBtaW4oc2VuZF93aW4sIGNvbmdfd2luKTsKKworCS8qIElmIHNrX3NlbmRfaGVhZCBjYW4gYmUgc2VudCBmdWxseSBub3csIGp1c3QgZG8gaXQuICAqLworCWlmIChza2ItPmxlbiA8PSBsaW1pdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IpIHsKKwkJdTMyIGNodW5rID0gbWluKHRwLT5zbmRfd25kLCB0cC0+c25kX2N3bmQgKiB0cC0+bXNzX2NhY2hlKTsKKworCQkvKiBJZiBhdCBsZWFzdCBzb21lIGZyYWN0aW9uIG9mIGEgd2luZG93IGlzIGF2YWlsYWJsZSwKKwkJICoganVzdCB1c2UgaXQuCisJCSAqLworCQljaHVuayAvPSBzeXNjdGxfdGNwX3Rzb193aW5fZGl2aXNvcjsKKwkJaWYgKGxpbWl0ID49IGNodW5rKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogRGlmZmVyZW50IGFwcHJvYWNoLCB0cnkgbm90IHRvIGRlZmVyIHBhc3QgYSBzaW5nbGUKKwkJICogQUNLLiAgUmVjZWl2ZXIgc2hvdWxkIEFDSyBldmVyeSBvdGhlciBmdWxsIHNpemVkCisJCSAqIGZyYW1lLCBzbyBpZiB3ZSBoYXZlIHNwYWNlIGZvciBtb3JlIHRoYW4gMyBmcmFtZXMKKwkJICogdGhlbiBzZW5kIG5vdy4KKwkJICovCisJCWlmIChsaW1pdCA+IHRjcF9tYXhfYnVyc3QodHApICogdHAtPm1zc19jYWNoZSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIE9rLCBpdCBsb29rcyBsaWtlIGl0IGlzIGFkdmlzYWJsZSB0byBkZWZlci4gICovCisJcmV0dXJuIDE7Cit9CisKIC8qIFRoaXMgcm91dGluZSB3cml0ZXMgcGFja2V0cyB0byB0aGUgbmV0d29yay4gIEl0IGFkdmFuY2VzIHRoZQogICogc2VuZF9oZWFkLiAgVGhpcyBoYXBwZW5zIGFzIGluY29taW5nIGFja3Mgb3BlbiB1cCB0aGUgcmVtb3RlCiAgKiB3aW5kb3cgZm9yIHVzLgpAQCAtNzM0LDU3ICs5NTgsMTU4IEBACiAgKiBSZXR1cm5zIDEsIGlmIG5vIHNlZ21lbnRzIGFyZSBpbiBmbGlnaHQgYW5kIHdlIGhhdmUgcXVldWVkIHNlZ21lbnRzLCBidXQKICAqIGNhbm5vdCBzZW5kIGFueXRoaW5nIG5vdyBiZWNhdXNlIG9mIFNXUyBvciBhbm90aGVyIHByb2JsZW0uCiAgKi8KLWludCB0Y3Bfd3JpdGVfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIGludCBub25hZ2xlKQorc3RhdGljIGludCB0Y3Bfd3JpdGVfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93LCBpbnQgbm9uYWdsZSkKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKLQl1bnNpZ25lZCBpbnQgbXNzX25vdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCB0c29fc2Vncywgc2VudF9wa3RzOworCWludCBjd25kX3F1b3RhOwogCiAJLyogSWYgd2UgYXJlIGNsb3NlZCwgdGhlIGJ5dGVzIHdpbGwgaGF2ZSB0byByZW1haW4gaGVyZS4KIAkgKiBJbiB0aW1lIGNsb3NlZG93biB3aWxsIGZpbmlzaCwgd2UgZW1wdHkgdGhlIHdyaXRlIHF1ZXVlIGFuZCBhbGwKIAkgKiB3aWxsIGJlIGhhcHB5LgogCSAqLwotCWlmIChzay0+c2tfc3RhdGUgIT0gVENQX0NMT1NFKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0JCWludCBzZW50X3BrdHMgPSAwOworCWlmICh1bmxpa2VseShzay0+c2tfc3RhdGUgPT0gVENQX0NMT1NFKSkKKwkJcmV0dXJuIDA7CiAKLQkJLyogQWNjb3VudCBmb3IgU0FDS1MsIHdlIG1heSBuZWVkIHRvIGZyYWdtZW50IGR1ZSB0byB0aGlzLgotCQkgKiBJdCBpcyBqdXN0IGxpa2UgdGhlIHJlYWwgTVNTIGNoYW5naW5nIG9uIHVzIG1pZHN0cmVhbS4KLQkJICogV2UgYWxzbyBoYW5kbGUgdGhpbmdzIGNvcnJlY3RseSB3aGVuIHRoZSB1c2VyIGFkZHMgc29tZQotCQkgKiBJUCBvcHRpb25zIG1pZC1zdHJlYW0uICBTaWxseSB0byBkbywgYnV0IGNvdmVyIGl0LgotCQkgKi8KLQkJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzaywgMSk7CisJc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiAwOwogCi0JCXdoaWxlICgoc2tiID0gc2stPnNrX3NlbmRfaGVhZCkgJiYKLQkJICAgICAgIHRjcF9zbmRfdGVzdChzaywgc2tiLCBtc3Nfbm93LAotCQkJICAgICAgIAkgICAgdGNwX3NrYl9pc19sYXN0KHNrLCBza2IpID8gbm9uYWdsZSA6Ci0JCQkJICAgIAkJCSAgICAgICBUQ1BfTkFHTEVfUFVTSCkpIHsKLQkJCWlmIChza2ItPmxlbiA+IG1zc19ub3cpIHsKLQkJCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIG1zc19ub3cpKQorCXRzb19zZWdzID0gdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CisJY3duZF9xdW90YSA9IHRjcF9jd25kX3Rlc3QodHAsIHNrYik7CisJaWYgKHVubGlrZWx5KCFjd25kX3F1b3RhKSkKKwkJZ290byBvdXQ7CisKKwlzZW50X3BrdHMgPSAwOworCXdoaWxlIChsaWtlbHkodGNwX3NuZF93bmRfdGVzdCh0cCwgc2tiLCBtc3Nfbm93KSkpIHsKKwkJQlVHX09OKCF0c29fc2Vncyk7CisKKwkJaWYgKHRzb19zZWdzID09IDEpIHsKKwkJCWlmICh1bmxpa2VseSghdGNwX25hZ2xlX3Rlc3QodHAsIHNrYiwgbXNzX25vdywKKwkJCQkJCSAgICAgKHRjcF9za2JfaXNfbGFzdChzaywgc2tiKSA/CisJCQkJCQkgICAgICBub25hZ2xlIDogVENQX05BR0xFX1BVU0gpKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAodGNwX3Rzb19zaG91bGRfZGVmZXIoc2ssIHRwLCBza2IpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRzb19zZWdzID4gMSkgeworCQkJdTMyIGxpbWl0ID0gdGNwX3dpbmRvd19hbGxvd3ModHAsIHNrYiwKKwkJCQkJCSAgICAgIG1zc19ub3csIGN3bmRfcXVvdGEpOworCisJCQlpZiAoc2tiLT5sZW4gPCBsaW1pdCkgeworCQkJCXVuc2lnbmVkIGludCB0cmltID0gc2tiLT5sZW4gJSBtc3Nfbm93OworCisJCQkJaWYgKHRyaW0pCisJCQkJCWxpbWl0ID0gc2tiLT5sZW4gLSB0cmltOworCQkJfQorCQkJaWYgKHNrYi0+bGVuID4gbGltaXQpIHsKKwkJCQlpZiAodHNvX2ZyYWdtZW50KHNrLCBza2IsIGxpbWl0KSkKIAkJCQkJYnJlYWs7CiAJCQl9Ci0KLQkJCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwotCQkJdGNwX3Rzb19zZXRfcHVzaChza2IpOwotCQkJaWYgKHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSkKKwkJfSBlbHNlIGlmICh1bmxpa2VseShza2ItPmxlbiA+IG1zc19ub3cpKSB7CisJCQlpZiAodW5saWtlbHkodGNwX2ZyYWdtZW50KHNrLCBza2IsICBtc3Nfbm93KSkpCiAJCQkJYnJlYWs7Ci0KLQkJCS8qIEFkdmFuY2UgdGhlIHNlbmRfaGVhZC4gIFRoaXMgb25lIGlzIHNlbnQgb3V0LgotCQkJICogVGhpcyBjYWxsIHdpbGwgaW5jcmVtZW50IHBhY2tldHNfb3V0LgotCQkJICovCi0JCQl1cGRhdGVfc2VuZF9oZWFkKHNrLCB0cCwgc2tiKTsKLQotCQkJdGNwX21pbnNoYWxsX3VwZGF0ZSh0cCwgbXNzX25vdywgc2tiKTsKLQkJCXNlbnRfcGt0cyA9IDE7CiAJCX0KIAotCQlpZiAoc2VudF9wa3RzKSB7Ci0JCQl0Y3BfY3duZF92YWxpZGF0ZShzaywgdHApOwotCQkJcmV0dXJuIDA7Ci0JCX0KKwkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CiAKLQkJcmV0dXJuICF0cC0+cGFja2V0c19vdXQgJiYgc2stPnNrX3NlbmRfaGVhZDsKKwkJaWYgKHVubGlrZWx5KHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSkpCisJCQlicmVhazsKKworCQkvKiBBZHZhbmNlIHRoZSBzZW5kX2hlYWQuICBUaGlzIG9uZSBpcyBzZW50IG91dC4KKwkJICogVGhpcyBjYWxsIHdpbGwgaW5jcmVtZW50IHBhY2tldHNfb3V0LgorCQkgKi8KKwkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CisKKwkJdGNwX21pbnNoYWxsX3VwZGF0ZSh0cCwgbXNzX25vdywgc2tiKTsKKwkJc2VudF9wa3RzKys7CisKKwkJLyogRG8gbm90IG9wdGltaXplIHRoaXMgdG8gdXNlIHRzb19zZWdzLiBJZiB3ZSBjaG9wcGVkIHVwCisJCSAqIHRoZSBwYWNrZXQgYWJvdmUsIHRzb19zZWdzIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkLgorCQkgKi8KKwkJY3duZF9xdW90YSAtPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworCisJCUJVR19PTihjd25kX3F1b3RhIDwgMCk7CisJCWlmICghY3duZF9xdW90YSkKKwkJCWJyZWFrOworCisJCXNrYiA9IHNrLT5za19zZW5kX2hlYWQ7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisJCXRzb19zZWdzID0gdGNwX2luaXRfdHNvX3NlZ3Moc2ssIHNrYik7CiAJfQotCXJldHVybiAwOworCisJaWYgKGxpa2VseShzZW50X3BrdHMpKSB7CisJCXRjcF9jd25kX3ZhbGlkYXRlKHNrLCB0cCk7CisJCXJldHVybiAwOworCX0KK291dDoKKwlyZXR1cm4gIXRwLT5wYWNrZXRzX291dCAmJiBzay0+c2tfc2VuZF9oZWFkOworfQorCisvKiBQdXNoIG91dCBhbnkgcGVuZGluZyBmcmFtZXMgd2hpY2ggd2VyZSBoZWxkIGJhY2sgZHVlIHRvCisgKiBUQ1BfQ09SSyBvciBhdHRlbXB0IGF0IGNvYWxlc2NpbmcgdGlueSBwYWNrZXRzLgorICogVGhlIHNvY2tldCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyLgorICovCit2b2lkIF9fdGNwX3B1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgdGNwX3NvY2sgKnRwLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjdXJfbXNzLCBpbnQgbm9uYWdsZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2stPnNrX3NlbmRfaGVhZDsKKworCWlmIChza2IpIHsKKwkJaWYgKHRjcF93cml0ZV94bWl0KHNrLCBjdXJfbXNzLCBub25hZ2xlKSkKKwkJCXRjcF9jaGVja19wcm9iZV90aW1lcihzaywgdHApOworCX0KK30KKworLyogU2VuZCBfc2luZ2xlXyBza2Igc2l0dGluZyBhdCB0aGUgc2VuZCBoZWFkLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzCisgKiB0cnVlIHB1c2ggcGVuZGluZyBmcmFtZXMgdG8gc2V0dXAgcHJvYmUgdGltZXIgZXRjLgorICovCit2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93KQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza19idWZmICpza2IgPSBzay0+c2tfc2VuZF9oZWFkOworCXVuc2lnbmVkIGludCB0c29fc2VncywgY3duZF9xdW90YTsKKworCUJVR19PTighc2tiIHx8IHNrYi0+bGVuIDwgbXNzX25vdyk7CisKKwl0c29fc2VncyA9IHRjcF9pbml0X3Rzb19zZWdzKHNrLCBza2IpOworCWN3bmRfcXVvdGEgPSB0Y3Bfc25kX3Rlc3Qoc2ssIHNrYiwgbXNzX25vdywgVENQX05BR0xFX1BVU0gpOworCisJaWYgKGxpa2VseShjd25kX3F1b3RhKSkgeworCQlCVUdfT04oIXRzb19zZWdzKTsKKworCQlpZiAodHNvX3NlZ3MgPiAxKSB7CisJCQl1MzIgbGltaXQgPSB0Y3Bfd2luZG93X2FsbG93cyh0cCwgc2tiLAorCQkJCQkJICAgICAgbXNzX25vdywgY3duZF9xdW90YSk7CisKKwkJCWlmIChza2ItPmxlbiA8IGxpbWl0KSB7CisJCQkJdW5zaWduZWQgaW50IHRyaW0gPSBza2ItPmxlbiAlIG1zc19ub3c7CisKKwkJCQlpZiAodHJpbSkKKwkJCQkJbGltaXQgPSBza2ItPmxlbiAtIHRyaW07CisJCQl9CisJCQlpZiAoc2tiLT5sZW4gPiBsaW1pdCkgeworCQkJCWlmICh1bmxpa2VseSh0c29fZnJhZ21lbnQoc2ssIHNrYiwgbGltaXQpKSkKKwkJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgaWYgKHVubGlrZWx5KHNrYi0+bGVuID4gbXNzX25vdykpIHsKKwkJCWlmICh1bmxpa2VseSh0Y3BfZnJhZ21lbnQoc2ssIHNrYiwgbXNzX25vdykpKQorCQkJCXJldHVybjsKKwkJfQorCisJCS8qIFNlbmQgaXQgb3V0IG5vdy4gKi8KKwkJVENQX1NLQl9DQihza2IpLT53aGVuID0gdGNwX3RpbWVfc3RhbXA7CisKKwkJaWYgKGxpa2VseSghdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiX2Nsb25lKHNrYiwgc2stPnNrX2FsbG9jYXRpb24pKSkpIHsKKwkJCXVwZGF0ZV9zZW5kX2hlYWQoc2ssIHRwLCBza2IpOworCQkJdGNwX2N3bmRfdmFsaWRhdGUoc2ssIHRwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KIH0KIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgdGhhdCB3ZSBjYW4gcmFpc2UgdGhlCkBAIC0xMDQ0LDcgKzEzNjksNiBAQAogCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgewogCQkJc2stPnNrX3JvdXRlX2NhcHMgJj0gfk5FVElGX0ZfVFNPOwogCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpOwotCQkJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGVfc3RkOwogCQl9CiAKIAkJaWYgKHRjcF90cmltX2hlYWQoc2ssIHNrYiwgdHAtPnNuZF91bmEgLSBUQ1BfU0tCX0NCKHNrYiktPnNlcSkpCkBAIC0xMTA2LDcgKzE0MzAsNiBAQAogCSAqIGlzIHN0aWxsIGluIHNvbWVib2R5J3MgaGFuZHMsIGVsc2UgbWFrZSBhIGNsb25lLgogCSAqLwogCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwotCXRjcF90c29fc2V0X3B1c2goc2tiKTsKIAogCWVyciA9IHRjcF90cmFuc21pdF9za2Ioc2ssIChza2JfY2xvbmVkKHNrYikgPwogCQkJCSAgICBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKToKQEAgLTEyOTAsNyArMTYxMyw3IEBACiAgKiB3YXMgdW5yZWFkIGRhdGEgaW4gdGhlIHJlY2VpdmUgcXVldWUuICBUaGlzIGJlaGF2aW9yIGlzIHJlY29tbWVuZGVkCiAgKiBieSBkcmFmdC1pZXRmLXRjcGltcGwtcHJvYi0wMy50eHQgc2VjdGlvbiAzLjEwLiAgLURhdmVNCiAgKi8KLXZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgaW50IHByaW9yaXR5KQordm9pZCB0Y3Bfc2VuZF9hY3RpdmVfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE0NDksNyArMTc3Miw2IEBACiAJCXRwLT53aW5kb3dfY2xhbXAgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9XSU5ET1cpOwogCXRwLT5hZHZtc3MgPSBkc3RfbWV0cmljKGRzdCwgUlRBWF9BRFZNU1MpOwogCXRjcF9pbml0aWFsaXplX3Jjdl9tc3Moc2spOwotCXRjcF9jYV9pbml0KHRwKTsKIAogCXRjcF9zZWxlY3RfaW5pdGlhbF93aW5kb3codGNwX2Z1bGxfc3BhY2Uoc2spLAogCQkJCSAgdHAtPmFkdm1zcyAtICh0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcCA/IHRwLT50Y3BfaGVhZGVyX2xlbiAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSA6IDApLApAQCAtMTUwMyw3ICsxODI1LDYgQEAKIAlUQ1BfU0tCX0NCKGJ1ZmYpLT5lbmRfc2VxID0gdHAtPndyaXRlX3NlcTsKIAl0cC0+c25kX254dCA9IHRwLT53cml0ZV9zZXE7CiAJdHAtPnB1c2hlZF9zZXEgPSB0cC0+d3JpdGVfc2VxOwotCXRjcF9jYV9pbml0KHRwKTsKIAogCS8qIFNlbmQgaXQgb2ZmLiAqLwogCVRDUF9TS0JfQ0IoYnVmZiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKQEAgLTE2NzcsMTQgKzE5OTgsMTIgQEAKIAkJCQlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1RTTykgewogCQkJCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX05PX0xBUkdFU0VORCk7CiAJCQkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKLQkJCQkJdHAtPm1zc19jYWNoZSA9IHRwLT5tc3NfY2FjaGVfc3RkOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoIXRjcF9za2JfcGNvdW50KHNrYikpCiAJCQkJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2ssIHNrYik7CiAKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gVENQQ0JfRkxBR19QU0g7CiAJCQlUQ1BfU0tCX0NCKHNrYiktPndoZW4gPSB0Y3BfdGltZV9zdGFtcDsKLQkJCXRjcF90c29fc2V0X3B1c2goc2tiKTsKIAkJCWVyciA9IHRjcF90cmFuc21pdF9za2Ioc2ssIHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKTsKIAkJCWlmICghZXJyKSB7CiAJCQkJdXBkYXRlX3NlbmRfaGVhZChzaywgdHAsIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfc2NhbGFibGUuYyBiL25ldC9pcHY0L3RjcF9zY2FsYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTEwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3Bfc2NhbGFibGUuYwpAQCAtMCwwICsxLDY4IEBACisvKiBUb20gS2VsbHkncyBTY2FsYWJsZSBUQ1AKKyAqCisgKiBTZWUgaHR0Oi8vd3d3LWxjZS5lbmcuY2FtLmFjLnVrL35jdGsyMS9zY2FsYWJsZS8KKyAqCisgKiBKb2huIEhlZmZuZXIgPGpoZWZmbmVyQHNjLmVkdT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisvKiBUaGVzZSBmYWN0b3JzIGRlcml2ZWQgZnJvbSB0aGUgcmVjb21tZW5kZWQgdmFsdWVzIGluIHRoZSBhZXI6CisgKiAuMDEgYW5kIGFuZCA3LzguIFdlIHVzZSA1MCBpbnN0ZWFkIG9mIDEwMCB0byBhY2NvdW50IGZvcgorICogZGVsYXllZCBhY2suCisgKi8KKyNkZWZpbmUgVENQX1NDQUxBQkxFX0FJX0NOVAk1MFUKKyNkZWZpbmUgVENQX1NDQUxBQkxFX01EX1NDQUxFCTMKKworc3RhdGljIHZvaWQgdGNwX3NjYWxhYmxlX2NvbmdfYXZvaWQoc3RydWN0IHRjcF9zb2NrICp0cCwgdTMyIGFjaywgdTMyIHJ0dCwKKwkJCQkgICAgdTMyIGluX2ZsaWdodCwgaW50IGZsYWcpCit7CisJaWYgKGluX2ZsaWdodCA8IHRwLT5zbmRfY3duZCkKKwkJcmV0dXJuOworCisJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKSB7CisJCXRwLT5zbmRfY3duZCsrOworCX0gZWxzZSB7CisJCXRwLT5zbmRfY3duZF9jbnQrKzsKKwkJaWYgKHRwLT5zbmRfY3duZF9jbnQgPiBtaW4odHAtPnNuZF9jd25kLCBUQ1BfU0NBTEFCTEVfQUlfQ05UKSl7CisJCQl0cC0+c25kX2N3bmQrKzsKKwkJCXRwLT5zbmRfY3duZF9jbnQgPSAwOworCQl9CisJfQorCXRwLT5zbmRfY3duZCA9IG1pbl90KHUzMiwgdHAtPnNuZF9jd25kLCB0cC0+c25kX2N3bmRfY2xhbXApOworCXRwLT5zbmRfY3duZF9zdGFtcCA9IHRjcF90aW1lX3N0YW1wOworfQorCitzdGF0aWMgdTMyIHRjcF9zY2FsYWJsZV9zc3RocmVzaChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXJldHVybiBtYXgodHAtPnNuZF9jd25kIC0gKHRwLT5zbmRfY3duZD4+VENQX1NDQUxBQkxFX01EX1NDQUxFKSwgMlUpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzIHRjcF9zY2FsYWJsZSA9IHsKKwkuc3N0aHJlc2gJPSB0Y3Bfc2NhbGFibGVfc3N0aHJlc2gsCisJLmNvbmdfYXZvaWQJPSB0Y3Bfc2NhbGFibGVfY29uZ19hdm9pZCwKKwkubWluX2N3bmQJPSB0Y3BfcmVub19taW5fY3duZCwKKworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAic2NhbGFibGUiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGNwX3NjYWxhYmxlX3JlZ2lzdGVyKHZvaWQpCit7CisJcmV0dXJuIHRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9zY2FsYWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0Y3Bfc2NhbGFibGVfdW5yZWdpc3Rlcih2b2lkKQoreworCXRjcF91bnJlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX3NjYWxhYmxlKTsKK30KKworbW9kdWxlX2luaXQodGNwX3NjYWxhYmxlX3JlZ2lzdGVyKTsKK21vZHVsZV9leGl0KHRjcF9zY2FsYWJsZV91bnJlZ2lzdGVyKTsKKworTU9EVUxFX0FVVEhPUigiSm9obiBIZWZmbmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNjYWxhYmxlIFRDUCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwppbmRleCBiMTI3YjQ0Li4wMDg0MjI3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfdGltZXIuYworKysgYi9uZXQvaXB2NC90Y3BfdGltZXIuYwpAQCAtMjMxLDExICsyMzEsMTAgQEAKIAl9CiAJdHAtPmFjay5wZW5kaW5nICY9IH5UQ1BfQUNLX1RJTUVSOwogCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPnVjb3B5LnByZXF1ZXVlKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JCU5FVF9BRERfU1RBVFNfQkgoTElOVVhfTUlCX1RDUFNDSEVEVUxFUkZBSUxFRCwgCi0JCQkJIHNrYl9xdWV1ZV9sZW4oJnRwLT51Y29weS5wcmVxdWV1ZSkpOworCQlORVRfSU5DX1NUQVRTX0JIKExJTlVYX01JQl9UQ1BTQ0hFRFVMRVJGQUlMRUQpOwogCiAJCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmdHAtPnVjb3B5LnByZXF1ZXVlKSkgIT0gTlVMTCkKIAkJCXNrLT5za19iYWNrbG9nX3Jjdihzaywgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF92ZWdhcy5jIGIvbmV0L2lwdjQvdGNwX3ZlZ2FzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkNDQzZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF92ZWdhcy5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogVENQIFZlZ2FzIGNvbmdlc3Rpb24gY29udHJvbAorICoKKyAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIGNvbmdlc3Rpb24gZGV0ZWN0aW9uL2F2b2lkYW5jZSBzY2hlbWUgZGVzY3JpYmVkIGluCisgKiAgICBMYXdyZW5jZSBTLiBCcmFrbW8gYW5kIExhcnJ5IEwuIFBldGVyc29uLgorICogICAgIlRDUCBWZWdhczogRW5kIHRvIGVuZCBjb25nZXN0aW9uIGF2b2lkYW5jZSBvbiBhIGdsb2JhbCBpbnRlcm5ldC4iCisgKiAgICBJRUVFIEpvdXJuYWwgb24gU2VsZWN0ZWQgQXJlYXMgaW4gQ29tbXVuaWNhdGlvbiwgMTMoOCk6MTQ2NS0tMTQ4MCwKKyAqICAgIE9jdG9iZXIgMTk5NS4gQXZhaWxhYmxlIGZyb206CisgKglmdHA6Ly9mdHAuY3MuYXJpem9uYS5lZHUveGtlcm5lbC9QYXBlcnMvanNhYy5wcworICoKKyAqIFNlZSBodHRwOi8vd3d3LmNzLmFyaXpvbmEuZWR1L3hrZXJuZWwvIGZvciB0aGVpciBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoZSBtYWluIGFzcGVjdHMgdGhhdCBkaXN0aW5ndWlzaCB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gdGhlCisgKiBBcml6b25hIFZlZ2FzIGltcGxlbWVudGF0aW9uIGFyZToKKyAqICAgbyBXZSBkbyBub3QgY2hhbmdlIHRoZSBsb3NzIGRldGVjdGlvbiBvciByZWNvdmVyeSBtZWNoYW5pc21zIG9mCisgKiAgICAgTGludXggaW4gYW55IHdheS4gTGludXggYWxyZWFkeSByZWNvdmVycyBmcm9tIGxvc3NlcyBxdWl0ZSB3ZWxsLAorICogICAgIHVzaW5nIGZpbmUtZ3JhaW5lZCB0aW1lcnMsIE5ld1Jlbm8sIGFuZCBGQUNLLgorICogICBvIFRvIGF2b2lkIHRoZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGltcG9zZWQgYnkgaW5jcmVhc2luZyBjd25kCisgKiAgICAgb25seSBldmVyeS1vdGhlciBSVFQgZHVyaW5nIHNsb3cgc3RhcnQsIHdlIGluY3JlYXNlIGR1cmluZworICogICAgIGV2ZXJ5IFJUVCBkdXJpbmcgc2xvdyBzdGFydCwganVzdCBsaWtlIFJlbm8uCisgKiAgIG8gTGFyZ2VseSB0byBhbGxvdyBjb250aW51b3VzIGN3bmQgZ3Jvd3RoIGR1cmluZyBzbG93IHN0YXJ0LAorICogICAgIHdlIHVzZSB0aGUgcmF0ZSBhdCB3aGljaCBBQ0tzIGNvbWUgYmFjayBhcyB0aGUgImFjdHVhbCIKKyAqICAgICByYXRlLCByYXRoZXIgdGhhbiB0aGUgcmF0ZSBhdCB3aGljaCBkYXRhIGlzIHNlbnQuCisgKiAgIG8gVG8gc3BlZWQgY29udmVyZ2VuY2UgdG8gdGhlIHJpZ2h0IHJhdGUsIHdlIHNldCB0aGUgY3duZAorICogICAgIHRvIGFjaGlldmUgdGhlIHJpZ2h0ICgiYWN0dWFsIikgcmF0ZSB3aGVuIHdlIGV4aXQgc2xvdyBzdGFydC4KKyAqICAgbyBUbyBmaWx0ZXIgb3V0IHRoZSBub2lzZSBjYXVzZWQgYnkgZGVsYXllZCBBQ0tzLCB3ZSB1c2UgdGhlCisgKiAgICAgbWluaW11bSBSVFQgc2FtcGxlIG9ic2VydmVkIGR1cmluZyB0aGUgbGFzdCBSVFQgdG8gY2FsY3VsYXRlCisgKiAgICAgdGhlIGFjdHVhbCByYXRlLgorICogICBvIFdoZW4gdGhlIHNlbmRlciByZS1zdGFydHMgZnJvbSBpZGxlLCBpdCB3YWl0cyB1bnRpbCBpdCBoYXMKKyAqICAgICByZWNlaXZlZCBBQ0tzIGZvciBhbiBlbnRpcmUgZmxpZ2h0IG9mIG5ldyBkYXRhIGJlZm9yZSBtYWtpbmcKKyAqICAgICBhIGN3bmQgYWRqdXN0bWVudCBkZWNpc2lvbi4gVGhlIG9yaWdpbmFsIFZlZ2FzIGltcGxlbWVudGF0aW9uCisgKiAgICAgYXNzdW1lZCBzZW5kZXJzIG5ldmVyIHdlbnQgaWRsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3BfZGlhZy5oPgorCisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisvKiBEZWZhdWx0IHZhbHVlcyBvZiB0aGUgVmVnYXMgdmFyaWFibGVzLCBpbiBmaXhlZC1wb2ludCByZXByZXNlbnRhdGlvbgorICogd2l0aCBWX1BBUkFNX1NISUZUIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCisgKi8KKyNkZWZpbmUgVl9QQVJBTV9TSElGVCAxCitzdGF0aWMgaW50IGFscGhhID0gMTw8Vl9QQVJBTV9TSElGVDsKK3N0YXRpYyBpbnQgYmV0YSAgPSAzPDxWX1BBUkFNX1NISUZUOworc3RhdGljIGludCBnYW1tYSA9IDE8PFZfUEFSQU1fU0hJRlQ7CisKK21vZHVsZV9wYXJhbShhbHBoYSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWxwaGEsICJsb3dlciBib3VuZCBvZiBwYWNrZXRzIGluIG5ldHdvcmsgKHNjYWxlIGJ5IDIpIik7Cittb2R1bGVfcGFyYW0oYmV0YSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYmV0YSwgInVwcGVyIGJvdW5kIG9mIHBhY2tldHMgaW4gbmV0d29yayAoc2NhbGUgYnkgMikiKTsKK21vZHVsZV9wYXJhbShnYW1tYSwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZ2FtbWEsICJsaW1pdCBvbiBpbmNyZWFzZSAoc2NhbGUgYnkgMikiKTsKKworCisvKiBWZWdhcyB2YXJpYWJsZXMgKi8KK3N0cnVjdCB2ZWdhcyB7CisJdTMyCWJlZ19zbmRfbnh0OwkvKiByaWdodCBlZGdlIGR1cmluZyBsYXN0IFJUVCAqLworCXUzMgliZWdfc25kX3VuYTsJLyogbGVmdCBlZGdlICBkdXJpbmcgbGFzdCBSVFQgKi8KKwl1MzIJYmVnX3NuZF9jd25kOwkvKiBzYXZlcyB0aGUgc2l6ZSBvZiB0aGUgY3duZCAqLworCXU4CWRvaW5nX3ZlZ2FzX25vdzsvKiBpZiB0cnVlLCBkbyB2ZWdhcyBmb3IgdGhpcyBSVFQgKi8KKwl1MTYJY250UlRUOwkJLyogIyBvZiBSVFRzIG1lYXN1cmVkIHdpdGhpbiBsYXN0IFJUVCAqLworCXUzMgltaW5SVFQ7CQkvKiBtaW4gb2YgUlRUcyBtZWFzdXJlZCB3aXRoaW4gbGFzdCBSVFQgKGluIHVzZWMpICovCisJdTMyCWJhc2VSVFQ7CS8qIHRoZSBtaW4gb2YgYWxsIFZlZ2FzIFJUVCBtZWFzdXJlbWVudHMgc2VlbiAoaW4gdXNlYykgKi8KK307CisKKy8qIFRoZXJlIGFyZSBzZXZlcmFsIHNpdHVhdGlvbnMgd2hlbiB3ZSBtdXN0ICJyZS1zdGFydCIgVmVnYXM6CisgKgorICogIG8gd2hlbiBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQKKyAqICBvIGFmdGVyIGFuIFJUTworICogIG8gYWZ0ZXIgZmFzdCByZWNvdmVyeQorICogIG8gd2hlbiB3ZSBzZW5kIGEgcGFja2V0IGFuZCB0aGVyZSBpcyBubyBvdXRzdGFuZGluZworICogICAgdW5hY2tub3dsZWRnZWQgZGF0YSAocmVzdGFydGluZyBhbiBpZGxlIGNvbm5lY3Rpb24pCisgKgorICogSW4gdGhlc2UgY2lyY3Vtc3RhbmNlcyB3ZSBjYW5ub3QgZG8gYSBWZWdhcyBjYWxjdWxhdGlvbiBhdCB0aGUKKyAqIGVuZCBvZiB0aGUgZmlyc3QgUlRULCBiZWNhdXNlIGFueSBjYWxjdWxhdGlvbiB3ZSBkbyBpcyB1c2luZworICogc3RhbGUgaW5mbyAtLSBib3RoIHRoZSBzYXZlZCBjd25kIGFuZCBjb25nZXN0aW9uIGZlZWRiYWNrIGFyZQorICogc3RhbGUuCisgKgorICogSW5zdGVhZCB3ZSBtdXN0IHdhaXQgdW50aWwgdGhlIGNvbXBsZXRpb24gb2YgYW4gUlRUIGR1cmluZworICogd2hpY2ggd2UgYWN0dWFsbHkgcmVjZWl2ZSBBQ0tzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmVnYXNfZW5hYmxlKHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IHZlZ2FzICp2ZWdhcyA9IHRjcF9jYSh0cCk7CisKKwkvKiBCZWdpbiB0YWtpbmcgVmVnYXMgc2FtcGxlcyBuZXh0IHRpbWUgd2Ugc2VuZCBzb21ldGhpbmcuICovCisJdmVnYXMtPmRvaW5nX3ZlZ2FzX25vdyA9IDE7CisKKwkvKiBTZXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBzZW5kIHdpbmRvdy4gKi8KKwl2ZWdhcy0+YmVnX3NuZF9ueHQgPSB0cC0+c25kX254dDsKKworCXZlZ2FzLT5jbnRSVFQgPSAwOworCXZlZ2FzLT5taW5SVFQgPSAweDdmZmZmZmZmOworfQorCisvKiBTdG9wIHRha2luZyBWZWdhcyBzYW1wbGVzIGZvciBub3cuICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmVnYXNfZGlzYWJsZShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXN0cnVjdCB2ZWdhcyAqdmVnYXMgPSB0Y3BfY2EodHApOworCisJdmVnYXMtPmRvaW5nX3ZlZ2FzX25vdyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF92ZWdhc19pbml0KHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJc3RydWN0IHZlZ2FzICp2ZWdhcyA9IHRjcF9jYSh0cCk7CisKKwl2ZWdhcy0+YmFzZVJUVCA9IDB4N2ZmZmZmZmY7CisJdmVnYXNfZW5hYmxlKHRwKTsKK30KKworLyogRG8gUlRUIHNhbXBsaW5nIG5lZWRlZCBmb3IgVmVnYXMuCisgKiBCYXNpY2FsbHkgd2U6CisgKiAgIG8gbWluLWZpbHRlciBSVFQgc2FtcGxlcyBmcm9tIHdpdGhpbiBhbiBSVFQgdG8gZ2V0IHRoZSBjdXJyZW50CisgKiAgICAgcHJvcGFnYXRpb24gZGVsYXkgKyBxdWV1aW5nIGRlbGF5ICh3ZSBhcmUgbWluLWZpbHRlcmluZyB0byB0cnkgdG8KKyAqICAgICBhdm9pZCB0aGUgZWZmZWN0cyBvZiBkZWxheWVkIEFDS3MpCisgKiAgIG8gbWluLWZpbHRlciBSVFQgc2FtcGxlcyBmcm9tIGEgbXVjaCBsb25nZXIgd2luZG93IChmb3JldmVyIGZvciBub3cpCisgKiAgICAgdG8gZmluZCB0aGUgcHJvcGFnYXRpb24gZGVsYXkgKGJhc2VSVFQpCisgKi8KK3N0YXRpYyB2b2lkIHRjcF92ZWdhc19ydHRfY2FsYyhzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgdXNydHQpCit7CisJc3RydWN0IHZlZ2FzICp2ZWdhcyA9IHRjcF9jYSh0cCk7CisJdTMyIHZydHQgPSB1c3J0dCArIDE7IC8qIE5ldmVyIGFsbG93IHplcm8gcnR0IG9yIGJhc2VSVFQgKi8KKworCS8qIEZpbHRlciB0byBmaW5kIHByb3BhZ2F0aW9uIGRlbGF5OiAqLworCWlmICh2cnR0IDwgdmVnYXMtPmJhc2VSVFQpCisJCXZlZ2FzLT5iYXNlUlRUID0gdnJ0dDsKKworCS8qIEZpbmQgdGhlIG1pbiBSVFQgZHVyaW5nIHRoZSBsYXN0IFJUVCB0byBmaW5kCisJICogdGhlIGN1cnJlbnQgcHJvcC4gZGVsYXkgKyBxdWV1aW5nIGRlbGF5OgorCSAqLworCXZlZ2FzLT5taW5SVFQgPSBtaW4odmVnYXMtPm1pblJUVCwgdnJ0dCk7CisJdmVnYXMtPmNudFJUVCsrOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdmVnYXNfc3RhdGUoc3RydWN0IHRjcF9zb2NrICp0cCwgdTggY2Ffc3RhdGUpCit7CisKKwlpZiAoY2Ffc3RhdGUgPT0gVENQX0NBX09wZW4pCisJCXZlZ2FzX2VuYWJsZSh0cCk7CisJZWxzZQorCQl2ZWdhc19kaXNhYmxlKHRwKTsKK30KKworLyoKKyAqIElmIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgYW5kIHdlIGFyZSByZXN0YXJ0aW5nLAorICogdGhlbiB3ZSBkb24ndCB3YW50IHRvIGRvIGFueSBWZWdhcyBjYWxjdWxhdGlvbnMKKyAqIHVudGlsIHdlIGdldCBmcmVzaCBSVFQgc2FtcGxlcy4gIFNvIHdoZW4gd2UKKyAqIHJlc3RhcnQsIHdlIHJlc2V0IG91ciBWZWdhcyBzdGF0ZSB0byBhIGNsZWFuCisgKiBzbGF0ZS4gQWZ0ZXIgd2UgZ2V0IGFja3MgZm9yIHRoaXMgZmxpZ2h0IG9mCisgKiBwYWNrZXRzLCBfdGhlbl8gd2UgY2FuIG1ha2UgVmVnYXMgY2FsY3VsYXRpb25zCisgKiBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX2N3bmRfZXZlbnQoc3RydWN0IHRjcF9zb2NrICp0cCwgZW51bSB0Y3BfY2FfZXZlbnQgZXZlbnQpCit7CisJaWYgKGV2ZW50ID09IENBX0VWRU5UX0NXTkRfUkVTVEFSVCB8fAorCSAgICBldmVudCA9PSBDQV9FVkVOVF9UWF9TVEFSVCkKKwkJdGNwX3ZlZ2FzX2luaXQodHApOworfQorCitzdGF0aWMgdm9pZCB0Y3BfdmVnYXNfY29uZ19hdm9pZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgYWNrLAorCQkJCSB1MzIgc2VxX3J0dCwgdTMyIGluX2ZsaWdodCwgaW50IGZsYWcpCit7CisJc3RydWN0IHZlZ2FzICp2ZWdhcyA9IHRjcF9jYSh0cCk7CisKKwlpZiAoIXZlZ2FzLT5kb2luZ192ZWdhc19ub3cpCisJCXJldHVybiB0Y3BfcmVub19jb25nX2F2b2lkKHRwLCBhY2ssIHNlcV9ydHQsIGluX2ZsaWdodCwgZmxhZyk7CisKKwkvKiBUaGUga2V5IHBsYXllcnMgYXJlIHZfYmVnX3NuZF91bmEgYW5kIHZfYmVnX3NuZF9ueHQuCisJICoKKwkgKiBUaGVzZSBhcmUgc28gbmFtZWQgYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB0aGUgYXBwcm94aW1hdGUgdmFsdWVzCisJICogb2Ygc25kX3VuYSBhbmQgc25kX254dCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IFJUVC4gTW9yZQorCSAqIHByZWNpc2VseSwgdGhleSByZXByZXNlbnQgdGhlIGFtb3VudCBvZiBkYXRhIHNlbnQgZHVyaW5nIHRoZSBSVFQuCisJICogQXQgdGhlIGVuZCBvZiB0aGUgUlRULCB3aGVuIHdlIHJlY2VpdmUgYW4gQUNLIGZvciB2X2JlZ19zbmRfbnh0LAorCSAqIHdlIHdpbGwgY2FsY3VsYXRlIHRoYXQgKHZfYmVnX3NuZF9ueHQgLSB2X2JlZ19zbmRfdW5hKSBvdXRzdGFuZGluZworCSAqIGJ5dGVzIG9mIGRhdGEgaGF2ZSBiZWVuIEFDS2VkIGR1cmluZyB0aGUgY291cnNlIG9mIHRoZSBSVFQsIGdpdmluZworCSAqIGFuICJhY3R1YWwiIHJhdGUgb2Y6CisJICoKKwkgKiAgICAgKHZfYmVnX3NuZF9ueHQgLSB2X2JlZ19zbmRfdW5hKSAvIChydHQgZHVyYXRpb24pCisJICoKKwkgKiBVbmZvcnR1bmF0ZWx5LCB2X2JlZ19zbmRfdW5hIGlzIG5vdCBleGFjdGx5IGVxdWFsIHRvIHNuZF91bmEsCisJICogYmVjYXVzZSBkZWxheWVkIEFDS3MgY2FuIGNvdmVyIG1vcmUgdGhhbiBvbmUgc2VnbWVudCwgc28gdGhleQorCSAqIGRvbid0IGxpbmUgdXAgbmljZWx5IHdpdGggdGhlIGJvdW5kYXJpZXMgb2YgUlRUcy4KKwkgKgorCSAqIEFub3RoZXIgdW5mb3J0dW5hdGUgZmFjdCBvZiBsaWZlIGlzIHRoYXQgZGVsYXllZCBBQ0tzIGRlbGF5IHRoZQorCSAqIGFkdmFuY2Ugb2YgdGhlIGxlZnQgZWRnZSBvZiBvdXIgc2VuZCB3aW5kb3csIHNvIHRoYXQgdGhlIG51bWJlcgorCSAqIG9mIGJ5dGVzIHdlIHNlbmQgaW4gYW4gUlRUIGlzIG9mdGVuIGxlc3MgdGhhbiBvdXIgY3duZCB3aWxsIGFsbG93LgorCSAqIFNvIHdlIGtlZXAgdHJhY2sgb2Ygb3VyIGN3bmQgc2VwYXJhdGVseSwgaW4gdl9iZWdfc25kX2N3bmQuCisJICovCisKKwlpZiAoYWZ0ZXIoYWNrLCB2ZWdhcy0+YmVnX3NuZF9ueHQpKSB7CisJCS8qIERvIHRoZSBWZWdhcyBvbmNlLXBlci1SVFQgY3duZCBhZGp1c3RtZW50LiAqLworCQl1MzIgb2xkX3duZCwgb2xkX3NuZF9jd25kOworCisKKwkJLyogSGVyZSBvbGRfd25kIGlzIGVzc2VudGlhbGx5IHRoZSB3aW5kb3cgb2YgZGF0YSB0aGF0IHdhcworCQkgKiBzZW50IGR1cmluZyB0aGUgcHJldmlvdXMgUlRULCBhbmQgaGFzIGFsbAorCQkgKiBiZWVuIGFja25vd2xlZGdlZCBpbiB0aGUgY291cnNlIG9mIHRoZSBSVFQgdGhhdCBlbmRlZAorCQkgKiB3aXRoIHRoZSBBQ0sgd2UganVzdCByZWNlaXZlZC4gTGlrZXdpc2UsIG9sZF9zbmRfY3duZAorCQkgKiBpcyB0aGUgY3duZCBkdXJpbmcgdGhlIHByZXZpb3VzIFJUVC4KKwkJICovCisJCW9sZF93bmQgPSAodmVnYXMtPmJlZ19zbmRfbnh0IC0gdmVnYXMtPmJlZ19zbmRfdW5hKSAvCisJCQl0cC0+bXNzX2NhY2hlOworCQlvbGRfc25kX2N3bmQgPSB2ZWdhcy0+YmVnX3NuZF9jd25kOworCisJCS8qIFNhdmUgdGhlIGV4dGVudCBvZiB0aGUgY3VycmVudCB3aW5kb3cgc28gd2UgY2FuIHVzZSB0aGlzCisJCSAqIGF0IHRoZSBlbmQgb2YgdGhlIG5leHQgUlRULgorCQkgKi8KKwkJdmVnYXMtPmJlZ19zbmRfdW5hICA9IHZlZ2FzLT5iZWdfc25kX254dDsKKwkJdmVnYXMtPmJlZ19zbmRfbnh0ICA9IHRwLT5zbmRfbnh0OworCQl2ZWdhcy0+YmVnX3NuZF9jd25kID0gdHAtPnNuZF9jd25kOworCisJCS8qIFRha2UgaW50byBhY2NvdW50IHRoZSBjdXJyZW50IFJUVCBzYW1wbGUgdG9vLCB0bworCQkgKiBkZWNyZWFzZSB0aGUgaW1wYWN0IG9mIGRlbGF5ZWQgYWNrcy4gVGhpcyBkb3VibGUgY291bnRzCisJCSAqIHRoaXMgc2FtcGxlIHNpbmNlIHdlIGNvdW50IGl0IGZvciB0aGUgbmV4dCB3aW5kb3cgYXMgd2VsbCwKKwkJICogYnV0IHRoYXQncyBub3QgdG9vIGF3ZnVsLCBzaW5jZSB3ZSdyZSB0YWtpbmcgdGhlIG1pbiwKKwkJICogcmF0aGVyIHRoYW4gYXZlcmFnaW5nLgorCQkgKi8KKwkJdGNwX3ZlZ2FzX3J0dF9jYWxjKHRwLCBzZXFfcnR0KjEwMDApOworCisJCS8qIFdlIGRvIHRoZSBWZWdhcyBjYWxjdWxhdGlvbnMgb25seSBpZiB3ZSBnb3QgZW5vdWdoIFJUVAorCQkgKiBzYW1wbGVzIHRoYXQgd2UgY2FuIGJlIHJlYXNvbmFibHkgc3VyZSB0aGF0IHdlIGdvdAorCQkgKiBhdCBsZWFzdCBvbmUgUlRUIHNhbXBsZSB0aGF0IHdhc24ndCBmcm9tIGEgZGVsYXllZCBBQ0suCisJCSAqIElmIHdlIG9ubHkgaGFkIDIgc2FtcGxlcyB0b3RhbCwKKwkJICogdGhlbiB0aGF0IG1lYW5zIHdlJ3JlIGdldHRpbmcgb25seSAxIEFDSyBwZXIgUlRULCB3aGljaAorCQkgKiBtZWFucyB0aGV5J3JlIGFsbW9zdCBjZXJ0YWlubHkgZGVsYXllZCBBQ0tzLgorCQkgKiBJZiAgd2UgaGF2ZSAzIHNhbXBsZXMsIHdlIHNob3VsZCBiZSBPSy4KKwkJICovCisKKwkJaWYgKHZlZ2FzLT5jbnRSVFQgPD0gMikgeworCQkJLyogV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggUlRUIHNhbXBsZXMgdG8gZG8gdGhlIFZlZ2FzCisJCQkgKiBjYWxjdWxhdGlvbiwgc28gd2UnbGwgYmVoYXZlIGxpa2UgUmVuby4KKwkJCSAqLworCQkJaWYgKHRwLT5zbmRfY3duZCA+IHRwLT5zbmRfc3N0aHJlc2gpCisJCQkJdHAtPnNuZF9jd25kKys7CisJCX0gZWxzZSB7CisJCQl1MzIgcnR0LCB0YXJnZXRfY3duZCwgZGlmZjsKKworCQkJLyogV2UgaGF2ZSBlbm91Z2ggUlRUIHNhbXBsZXMsIHNvLCB1c2luZyB0aGUgVmVnYXMKKwkJCSAqIGFsZ29yaXRobSwgd2UgZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBpbmNyZWFzZSBvcgorCQkJICogZGVjcmVhc2UgY3duZCwgYW5kIGJ5IGhvdyBtdWNoLgorCQkJICovCisKKwkJCS8qIFBsdWNrIG91dCB0aGUgUlRUIHdlIGFyZSB1c2luZyBmb3IgdGhlIFZlZ2FzCisJCQkgKiBjYWxjdWxhdGlvbnMuIFRoaXMgaXMgdGhlIG1pbiBSVFQgc2VlbiBkdXJpbmcgdGhlCisJCQkgKiBsYXN0IFJUVC4gVGFraW5nIHRoZSBtaW4gZmlsdGVycyBvdXQgdGhlIGVmZmVjdHMKKwkJCSAqIG9mIGRlbGF5ZWQgQUNLcywgYXQgdGhlIGNvc3Qgb2Ygbm90aWNpbmcgY29uZ2VzdGlvbgorCQkJICogYSBiaXQgbGF0ZXIuCisJCQkgKi8KKwkJCXJ0dCA9IHZlZ2FzLT5taW5SVFQ7CisKKwkJCS8qIENhbGN1bGF0ZSB0aGUgY3duZCB3ZSBzaG91bGQgaGF2ZSwgaWYgd2Ugd2VyZW4ndAorCQkJICogZ29pbmcgdG9vIGZhc3QuCisJCQkgKgorCQkJICogVGhpcyBpczoKKwkJCSAqICAgICAoYWN0dWFsIHJhdGUgaW4gc2VnbWVudHMpICogYmFzZVJUVAorCQkJICogV2Uga2VlcCBpdCBhcyBhIGZpeGVkIHBvaW50IG51bWJlciB3aXRoCisJCQkgKiBWX1BBUkFNX1NISUZUIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkgcG9pbnQuCisJCQkgKi8KKwkJCXRhcmdldF9jd25kID0gKChvbGRfd25kICogdmVnYXMtPmJhc2VSVFQpCisJCQkJICAgICAgIDw8IFZfUEFSQU1fU0hJRlQpIC8gcnR0OworCisJCQkvKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgd2luZG93IHdlIGhhZCwKKwkJCSAqIGFuZCB0aGUgd2luZG93IHdlIHdvdWxkIGxpa2UgdG8gaGF2ZS4gVGhpcyBxdWFudGl0eQorCQkJICogaXMgdGhlICJEaWZmIiBmcm9tIHRoZSBBcml6b25hIFZlZ2FzIHBhcGVycy4KKwkJCSAqCisJCQkgKiBBZ2FpbiwgdGhpcyBpcyBhIGZpeGVkIHBvaW50IG51bWJlciB3aXRoCisJCQkgKiBWX1BBUkFNX1NISUZUIGJpdHMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBiaW5hcnkKKwkJCSAqIHBvaW50LgorCQkJICovCisJCQlkaWZmID0gKG9sZF93bmQgPDwgVl9QQVJBTV9TSElGVCkgLSB0YXJnZXRfY3duZDsKKworCQkJaWYgKHRwLT5zbmRfY3duZCA8IHRwLT5zbmRfc3N0aHJlc2gpIHsKKwkJCQkvKiBTbG93IHN0YXJ0LiAgKi8KKwkJCQlpZiAoZGlmZiA+IGdhbW1hKSB7CisJCQkJCS8qIEdvaW5nIHRvbyBmYXN0LiBUaW1lIHRvIHNsb3cgZG93bgorCQkJCQkgKiBhbmQgc3dpdGNoIHRvIGNvbmdlc3Rpb24gYXZvaWRhbmNlLgorCQkJCQkgKi8KKwkJCQkJdHAtPnNuZF9zc3RocmVzaCA9IDI7CisKKwkJCQkJLyogU2V0IGN3bmQgdG8gbWF0Y2ggdGhlIGFjdHVhbCByYXRlCisJCQkJCSAqIGV4YWN0bHk6CisJCQkJCSAqICAgY3duZCA9IChhY3R1YWwgcmF0ZSkgKiBiYXNlUlRUCisJCQkJCSAqIFRoZW4gd2UgYWRkIDEgYmVjYXVzZSB0aGUgaW50ZWdlcgorCQkJCQkgKiB0cnVuY2F0aW9uIHJvYnMgdXMgb2YgZnVsbCBsaW5rCisJCQkJCSAqIHV0aWxpemF0aW9uLgorCQkJCQkgKi8KKwkJCQkJdHAtPnNuZF9jd25kID0gbWluKHRwLT5zbmRfY3duZCwKKwkJCQkJCQkgICAodGFyZ2V0X2N3bmQgPj4KKwkJCQkJCQkgICAgVl9QQVJBTV9TSElGVCkrMSk7CisKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIENvbmdlc3Rpb24gYXZvaWRhbmNlLiAqLworCQkJCXUzMiBuZXh0X3NuZF9jd25kOworCisJCQkJLyogRmlndXJlIG91dCB3aGVyZSB3ZSB3b3VsZCBsaWtlIGN3bmQKKwkJCQkgKiB0byBiZS4KKwkJCQkgKi8KKwkJCQlpZiAoZGlmZiA+IGJldGEpIHsKKwkJCQkJLyogVGhlIG9sZCB3aW5kb3cgd2FzIHRvbyBmYXN0LCBzbworCQkJCQkgKiB3ZSBzbG93IGRvd24uCisJCQkJCSAqLworCQkJCQluZXh0X3NuZF9jd25kID0gb2xkX3NuZF9jd25kIC0gMTsKKwkJCQl9IGVsc2UgaWYgKGRpZmYgPCBhbHBoYSkgeworCQkJCQkvKiBXZSBkb24ndCBoYXZlIGVub3VnaCBleHRyYSBwYWNrZXRzCisJCQkJCSAqIGluIHRoZSBuZXR3b3JrLCBzbyBzcGVlZCB1cC4KKwkJCQkJICovCisJCQkJCW5leHRfc25kX2N3bmQgPSBvbGRfc25kX2N3bmQgKyAxOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFNlbmRpbmcganVzdCBhcyBmYXN0IGFzIHdlCisJCQkJCSAqIHNob3VsZCBiZS4KKwkJCQkJICovCisJCQkJCW5leHRfc25kX2N3bmQgPSBvbGRfc25kX2N3bmQ7CisJCQkJfQorCisJCQkJLyogQWRqdXN0IGN3bmQgdXB3YXJkIG9yIGRvd253YXJkLCB0b3dhcmQgdGhlCisJCQkJICogZGVzaXJlZCB2YWx1ZS4KKwkJCQkgKi8KKwkJCQlpZiAobmV4dF9zbmRfY3duZCA+IHRwLT5zbmRfY3duZCkKKwkJCQkJdHAtPnNuZF9jd25kKys7CisJCQkJZWxzZSBpZiAobmV4dF9zbmRfY3duZCA8IHRwLT5zbmRfY3duZCkKKwkJCQkJdHAtPnNuZF9jd25kLS07CisJCQl9CisJCX0KKworCQkvKiBXaXBlIHRoZSBzbGF0ZSBjbGVhbiBmb3IgdGhlIG5leHQgUlRULiAqLworCQl2ZWdhcy0+Y250UlRUID0gMDsKKwkJdmVnYXMtPm1pblJUVCA9IDB4N2ZmZmZmZmY7CisJfQorCisJLyogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGV4ZWN1dGVkIGZvciBldmVyeSBhY2sgd2UgcmVjZWl2ZSwKKwkgKiBleGNlcHQgZm9yIGNvbmRpdGlvbnMgY2hlY2tlZCBpbiBzaG91bGRfYWR2YW5jZV9jd25kKCkKKwkgKiBiZWZvcmUgdGhlIGNhbGwgdG8gdGNwX2NvbmdfYXZvaWQoKS4gTWFpbmx5IHRoaXMgbWVhbnMgdGhhdAorCSAqIHdlIG9ubHkgZXhlY3V0ZSB0aGlzIGNvZGUgaWYgdGhlIGFjayBhY3R1YWxseSBhY2tlZCBzb21lCisJICogZGF0YS4KKwkgKi8KKworCS8qIElmIHdlIGFyZSBpbiBzbG93IHN0YXJ0LCBpbmNyZWFzZSBvdXIgY3duZCBpbiByZXNwb25zZSB0byB0aGlzIEFDSy4KKwkgKiAoSWYgd2UgYXJlIG5vdCBpbiBzbG93IHN0YXJ0IHRoZW4gd2UgYXJlIGluIGNvbmdlc3Rpb24gYXZvaWRhbmNlLAorCSAqIGFuZCBhZGp1c3Qgb3VyIGNvbmdlc3Rpb24gd2luZG93IG9ubHkgb25jZSBwZXIgUlRULiBTZWUgdGhlIGNvZGUKKwkgKiBhYm92ZS4pCisJICovCisJaWYgKHRwLT5zbmRfY3duZCA8PSB0cC0+c25kX3NzdGhyZXNoKQorCQl0cC0+c25kX2N3bmQrKzsKKworCS8qIHRvIGtlZXAgY3duZCBmcm9tIGdyb3dpbmcgd2l0aG91dCBib3VuZCAqLworCXRwLT5zbmRfY3duZCA9IG1pbl90KHUzMiwgdHAtPnNuZF9jd25kLCB0cC0+c25kX2N3bmRfY2xhbXApOworCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5ldmVyIHNvIHRpbWlkIGFzIHRvIHJlZHVjZSBvdXIgY3duZCBiZWxvdworCSAqIDIgTVNTLgorCSAqCisJICogR29pbmcgYmVsb3cgMiBNU1Mgd291bGQgcmlzayBodWdlIGRlbGF5ZWQgQUNLcyBmcm9tIG91ciByZWNlaXZlci4KKwkgKi8KKwl0cC0+c25kX2N3bmQgPSBtYXgodHAtPnNuZF9jd25kLCAyVSk7Cit9CisKKy8qIEV4dHJhY3QgaW5mbyBmb3IgVGNwIHNvY2tldCBpbmZvIHByb3ZpZGVkIHZpYSBuZXRsaW5rLiAqLworc3RhdGljIHZvaWQgdGNwX3ZlZ2FzX2dldF9pbmZvKHN0cnVjdCB0Y3Bfc29jayAqdHAsIHUzMiBleHQsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBzdHJ1Y3QgdmVnYXMgKmNhID0gdGNwX2NhKHRwKTsKKwlpZiAoZXh0ICYgKDE8PChUQ1BESUFHX1ZFR0FTSU5GTy0xKSkpIHsKKwkJc3RydWN0IHRjcHZlZ2FzX2luZm8gKmluZm87CisKKwkJaW5mbyA9IFJUQV9EQVRBKF9fUlRBX1BVVChza2IsIFRDUERJQUdfVkVHQVNJTkZPLAorCQkJCQkgIHNpemVvZigqaW5mbykpKTsKKworCQlpbmZvLT50Y3B2X2VuYWJsZWQgPSBjYS0+ZG9pbmdfdmVnYXNfbm93OworCQlpbmZvLT50Y3B2X3J0dGNudCA9IGNhLT5jbnRSVFQ7CisJCWluZm8tPnRjcHZfcnR0ID0gY2EtPmJhc2VSVFQ7CisJCWluZm8tPnRjcHZfbWlucnR0ID0gY2EtPm1pblJUVDsKKwlydGF0dHJfZmFpbHVyZToJOworCX0KK30KKworc3RhdGljIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgdGNwX3ZlZ2FzID0geworCS5pbml0CQk9IHRjcF92ZWdhc19pbml0LAorCS5zc3RocmVzaAk9IHRjcF9yZW5vX3NzdGhyZXNoLAorCS5jb25nX2F2b2lkCT0gdGNwX3ZlZ2FzX2NvbmdfYXZvaWQsCisJLm1pbl9jd25kCT0gdGNwX3Jlbm9fbWluX2N3bmQsCisJLnJ0dF9zYW1wbGUJPSB0Y3BfdmVnYXNfcnR0X2NhbGMsCisJLnNldF9zdGF0ZQk9IHRjcF92ZWdhc19zdGF0ZSwKKwkuY3duZF9ldmVudAk9IHRjcF92ZWdhc19jd25kX2V2ZW50LAorCS5nZXRfaW5mbwk9IHRjcF92ZWdhc19nZXRfaW5mbywKKworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidmVnYXMiLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGNwX3ZlZ2FzX3JlZ2lzdGVyKHZvaWQpCit7CisJQlVHX09OKHNpemVvZihzdHJ1Y3QgdmVnYXMpID4gVENQX0NBX1BSSVZfU0laRSk7CisJdGNwX3JlZ2lzdGVyX2Nvbmdlc3Rpb25fY29udHJvbCgmdGNwX3ZlZ2FzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRjcF92ZWdhc191bnJlZ2lzdGVyKHZvaWQpCit7CisJdGNwX3VucmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZ0Y3BfdmVnYXMpOworfQorCittb2R1bGVfaW5pdCh0Y3BfdmVnYXNfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQodGNwX3ZlZ2FzX3VucmVnaXN0ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIEhlbW1pbmdlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUQ1AgVmVnYXMiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF93ZXN0d29vZC5jIGIvbmV0L2lwdjQvdGNwX3dlc3R3b29kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MjcyNAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF93ZXN0d29vZC5jCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogVENQIFdlc3R3b29kKworICoKKyAqCUFuZ2VsbyBEZWxsJ0FlcmE6CVRDUCBXZXN0d29vZCsgc3VwcG9ydAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcF9kaWFnLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisvKiBUQ1AgV2VzdHdvb2Qgc3RydWN0dXJlICovCitzdHJ1Y3Qgd2VzdHdvb2QgeworCXUzMiAgICBid19uc19lc3Q7ICAgICAgICAvKiBmaXJzdCBiYW5kd2lkdGggZXN0aW1hdGlvbi4ubm90IHRvbyBzbW9vdGhlZCA4KSAqLworCXUzMiAgICBid19lc3Q7ICAgICAgICAgICAvKiBiYW5kd2lkdGggZXN0aW1hdGUgKi8KKwl1MzIgICAgcnR0X3dpbl9zeDsgICAgICAgLyogaGVyZSBzdGFydHMgYSBuZXcgZXZhbHVhdGlvbi4uLiAqLworCXUzMiAgICBiazsKKwl1MzIgICAgc25kX3VuYTsgICAgICAgICAgLyogdXNlZCBmb3IgZXZhbHVhdGluZyB0aGUgbnVtYmVyIG9mIGFja2VkIGJ5dGVzICovCisJdTMyICAgIGN1bXVsX2FjazsKKwl1MzIgICAgYWNjb3VudGVkOworCXUzMiAgICBydHQ7CisJdTMyICAgIHJ0dF9taW47ICAgICAgICAgIC8qIG1pbmltdW0gb2JzZXJ2ZWQgUlRUICovCit9OworCisKKy8qIFRDUCBXZXN0d29vZCBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyAqLworI2RlZmluZSBUQ1BfV0VTVFdPT0RfUlRUX01JTiAgIChIWi8yMCkJLyogNTBtcyAqLworI2RlZmluZSBUQ1BfV0VTVFdPT0RfSU5JVF9SVFQgICgyMCpIWikJLyogbWF5YmUgdG9vIGNvbnNlcnZhdGl2ZT8hICovCisKKy8qCisgKiBAdGNwX3dlc3R3b29kX2NyZWF0ZQorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBmaWVsZHMgdXNlZCBpbiBUQ1AgV2VzdHdvb2QrLAorICogaXQgaXMgY2FsbGVkIGFmdGVyIHRoZSBpbml0aWFsIFNZTiwgc28gdGhlIHNlcXVlbmNlIG51bWJlcnMKKyAqIGFyZSBjb3JyZWN0IGJ1dCBuZXcgcGFzc2l2ZSBjb25uZWN0aW9ucyB3ZSBoYXZlIG5vCisgKiBpbmZvcm1hdGlvbiBhYm91dCBSVFRtaW4gYXQgdGhpcyB0aW1lIHNvIHdlIHNpbXBseSBzZXQgaXQgdG8KKyAqIFRDUF9XRVNUV09PRF9JTklUX1JUVC4gVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHRvIGJlIHRvbyBjb25zZXJ2YXRpdmUKKyAqIHNpbmNlIGluIHRoaXMgd2F5IHdlJ3JlIHN1cmUgaXQgd2lsbCBiZSB1cGRhdGVkIGluIGEgY29uc2lzdGVudAorICogd2F5IGFzIHNvb24gYXMgcG9zc2libGUuIEl0IHdpbGwgcmVhc29uYWJseSBoYXBwZW4gd2l0aGluIHRoZSBmaXJzdAorICogUlRUIHBlcmlvZCBvZiB0aGUgY29ubmVjdGlvbiBsaWZldGltZS4KKyAqLworc3RhdGljIHZvaWQgdGNwX3dlc3R3b29kX2luaXQoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3Qgd2VzdHdvb2QgKncgPSB0Y3BfY2EodHApOworCisJdy0+YmsgPSAwOworICAgICAgICB3LT5id19uc19lc3QgPSAwOworICAgICAgICB3LT5id19lc3QgPSAwOworICAgICAgICB3LT5hY2NvdW50ZWQgPSAwOworICAgICAgICB3LT5jdW11bF9hY2sgPSAwOworCXctPnJ0dF9taW4gPSB3LT5ydHQgPSBUQ1BfV0VTVFdPT0RfSU5JVF9SVFQ7CisJdy0+cnR0X3dpbl9zeCA9IHRjcF90aW1lX3N0YW1wOworCXctPnNuZF91bmEgPSB0cC0+c25kX3VuYTsKK30KKworLyoKKyAqIEB3ZXN0d29vZF9kb19maWx0ZXIKKyAqIExvdy1wYXNzIGZpbHRlci4gSW1wbGVtZW50ZWQgdXNpbmcgY29uc3RhbnQgY29lZmZpY2llbnRzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiB3ZXN0d29vZF9kb19maWx0ZXIodTMyIGEsIHUzMiBiKQoreworCXJldHVybiAoKCg3ICogYSkgKyBiKSA+PiAzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdlc3R3b29kX2ZpbHRlcihzdHJ1Y3Qgd2VzdHdvb2QgKncsIHUzMiBkZWx0YSkKK3sKKwl3LT5id19uc19lc3QgPSB3ZXN0d29vZF9kb19maWx0ZXIody0+YndfbnNfZXN0LCB3LT5iayAvIGRlbHRhKTsKKwl3LT5id19lc3QgPSB3ZXN0d29vZF9kb19maWx0ZXIody0+YndfZXN0LCB3LT5id19uc19lc3QpOworfQorCisvKgorICogQHdlc3R3b29kX3BrdHNfYWNrZWQKKyAqIENhbGxlZCBhZnRlciBwcm9jZXNzaW5nIGdyb3VwIG9mIHBhY2tldHMuCisgKiBidXQgYWxsIHdlc3R3b29kIG5lZWRzIGlzIHRoZSBsYXN0IHNhbXBsZSBvZiBzcnR0LgorICovCitzdGF0aWMgdm9pZCB0Y3Bfd2VzdHdvb2RfcGt0c19hY2tlZChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgY250KQoreworCXN0cnVjdCB3ZXN0d29vZCAqdyA9IHRjcF9jYSh0cCk7CisJaWYgKGNudCA+IDApCisJCXctPnJ0dCA9IHRwLT5zcnR0ID4+IDM7Cit9CisKKy8qCisgKiBAd2VzdHdvb2RfdXBkYXRlX3dpbmRvdworICogSXQgdXBkYXRlcyBSVFQgZXZhbHVhdGlvbiB3aW5kb3cgaWYgaXQgaXMgdGhlIHJpZ2h0IG1vbWVudCB0byBkbworICogaXQuIElmIHNvIGl0IGNhbGxzIGZpbHRlciBmb3IgZXZhbHVhdGluZyBiYW5kd2lkdGguCisgKi8KK3N0YXRpYyB2b2lkIHdlc3R3b29kX3VwZGF0ZV93aW5kb3coc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3Qgd2VzdHdvb2QgKncgPSB0Y3BfY2EodHApOworCXMzMiBkZWx0YSA9IHRjcF90aW1lX3N0YW1wIC0gdy0+cnR0X3dpbl9zeDsKKworCS8qCisJICogU2VlIGlmIGEgUlRULXdpbmRvdyBoYXMgcGFzc2VkLgorCSAqIEJlIGNhcmVmdWwgc2luY2UgaWYgUlRUIGlzIGxlc3MgdGhhbgorCSAqIDUwbXMgd2UgZG9uJ3QgZmlsdGVyIGJ1dCB3ZSBjb250aW51ZSAnYnVpbGRpbmcgdGhlIHNhbXBsZScuCisJICogVGhpcyBtaW5pbXVtIGxpbWl0IHdhcyBjaG9zZW4gc2luY2UgYW4gZXN0aW1hdGlvbiBvbiBzbWFsbAorCSAqIHRpbWUgaW50ZXJ2YWxzIGlzIGJldHRlciB0byBhdm9pZC4uLgorCSAqIE9idmlvdXNseSBvbiBhIExBTiB3ZSByZWFzb25hYmx5IHdpbGwgYWx3YXlzIGhhdmUKKwkgKiByaWdodF9ib3VuZCA9IGxlZnRfYm91bmQgKyBXRVNUV09PRF9SVFRfTUlOCisJICovCisJaWYgKHctPnJ0dCAmJiBkZWx0YSA+IG1heF90KHUzMiwgdy0+cnR0LCBUQ1BfV0VTVFdPT0RfUlRUX01JTikpIHsKKwkJd2VzdHdvb2RfZmlsdGVyKHcsIGRlbHRhKTsKKworCQl3LT5iayA9IDA7CisJCXctPnJ0dF93aW5fc3ggPSB0Y3BfdGltZV9zdGFtcDsKKwl9Cit9CisKKy8qCisgKiBAd2VzdHdvb2RfZmFzdF9idworICogSXQgaXMgY2FsbGVkIHdoZW4gd2UgYXJlIGluIGZhc3QgcGF0aC4gSW4gcGFydGljdWxhciBpdCBpcyBjYWxsZWQgd2hlbgorICogaGVhZGVyIHByZWRpY3Rpb24gaXMgc3VjY2Vzc2Z1bC4gSW4gc3VjaCBjYXNlIGluIGZhY3QgdXBkYXRlIGlzCisgKiBzdHJhaWdodCBmb3J3YXJkIGFuZCBkb2Vzbid0IG5lZWQgYW55IHBhcnRpY3VsYXIgY2FyZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHdlc3R3b29kX2Zhc3RfYncoc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlzdHJ1Y3Qgd2VzdHdvb2QgKncgPSB0Y3BfY2EodHApOworCisJd2VzdHdvb2RfdXBkYXRlX3dpbmRvdyh0cCk7CisKKwl3LT5iayArPSB0cC0+c25kX3VuYSAtIHctPnNuZF91bmE7CisJdy0+c25kX3VuYSA9IHRwLT5zbmRfdW5hOworCXctPnJ0dF9taW4gPSBtaW4ody0+cnR0LCB3LT5ydHRfbWluKTsKK30KKworLyoKKyAqIEB3ZXN0d29vZF9hY2tlZF9jb3VudAorICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgY3VtdWxfYWNrIGZvciBldmFsdWF0aW5nIGJrIGluIGNhc2Ugb2YKKyAqIGRlbGF5ZWQgb3IgcGFydGlhbCBhY2tzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiB3ZXN0d29vZF9hY2tlZF9jb3VudChzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXN0cnVjdCB3ZXN0d29vZCAqdyA9IHRjcF9jYSh0cCk7CisKKwl3LT5jdW11bF9hY2sgPSB0cC0+c25kX3VuYSAtIHctPnNuZF91bmE7CisKKyAgICAgICAgLyogSWYgY3VtdWxfYWNrIGlzIDAgdGhpcyBpcyBhIGR1cGFjayBzaW5jZSBpdCdzIG5vdCBtb3ZpbmcKKyAgICAgICAgICogdHAtPnNuZF91bmEuCisgICAgICAgICAqLworICAgICAgICBpZiAoIXctPmN1bXVsX2FjaykgeworCQl3LT5hY2NvdW50ZWQgKz0gdHAtPm1zc19jYWNoZTsKKwkJdy0+Y3VtdWxfYWNrID0gdHAtPm1zc19jYWNoZTsKKwl9CisKKyAgICAgICAgaWYgKHctPmN1bXVsX2FjayA+IHRwLT5tc3NfY2FjaGUpIHsKKwkJLyogUGFydGlhbCBvciBkZWxheWVkIGFjayAqLworCQlpZiAody0+YWNjb3VudGVkID49IHctPmN1bXVsX2FjaykgeworCQkJdy0+YWNjb3VudGVkIC09IHctPmN1bXVsX2FjazsKKwkJCXctPmN1bXVsX2FjayA9IHRwLT5tc3NfY2FjaGU7CisJCX0gZWxzZSB7CisJCQl3LT5jdW11bF9hY2sgLT0gdy0+YWNjb3VudGVkOworCQkJdy0+YWNjb3VudGVkID0gMDsKKwkJfQorCX0KKworCXctPnNuZF91bmEgPSB0cC0+c25kX3VuYTsKKworCXJldHVybiB3LT5jdW11bF9hY2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHdlc3R3b29kX2J3X3J0dG1pbihjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQoreworCXN0cnVjdCB3ZXN0d29vZCAqdyA9IHRjcF9jYSh0cCk7CisJcmV0dXJuIG1heF90KHUzMiwgKHctPmJ3X2VzdCAqIHctPnJ0dF9taW4pIC8gdHAtPm1zc19jYWNoZSwgMik7Cit9CisKKy8qCisgKiBUQ1AgV2VzdHdvb2QKKyAqIEhlcmUgbGltaXQgaXMgZXZhbHVhdGVkIGFzIEJ3IGVzdGltYXRpb24qUlRUbWluIChmb3Igb2J0YWluaW5nIGl0CisgKiBpbiBwYWNrZXRzIHdlIHVzZSBtc3NfY2FjaGUpLiBSdHRtaW4gaXMgZ3VhcmFudGVlZCB0byBiZSA+PSAyCisgKiBzbyBhdm9pZHMgZXZlciByZXR1cm5pbmcgMC4KKyAqLworc3RhdGljIHUzMiB0Y3Bfd2VzdHdvb2RfY3duZF9taW4oc3RydWN0IHRjcF9zb2NrICp0cCkKK3sKKwlyZXR1cm4gd2VzdHdvb2RfYndfcnR0bWluKHRwKTsKK30KKworc3RhdGljIHZvaWQgdGNwX3dlc3R3b29kX2V2ZW50KHN0cnVjdCB0Y3Bfc29jayAqdHAsIGVudW0gdGNwX2NhX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCB3ZXN0d29vZCAqdyA9IHRjcF9jYSh0cCk7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIENBX0VWRU5UX0ZBU1RfQUNLOgorCQl3ZXN0d29vZF9mYXN0X2J3KHRwKTsKKwkJYnJlYWs7CisKKwljYXNlIENBX0VWRU5UX0NPTVBMRVRFX0NXUjoKKwkJdHAtPnNuZF9jd25kID0gdHAtPnNuZF9zc3RocmVzaCA9IHdlc3R3b29kX2J3X3J0dG1pbih0cCk7CisJCWJyZWFrOworCisJY2FzZSBDQV9FVkVOVF9GUlRPOgorCQl0cC0+c25kX3NzdGhyZXNoID0gd2VzdHdvb2RfYndfcnR0bWluKHRwKTsKKwkJYnJlYWs7CisKKwljYXNlIENBX0VWRU5UX1NMT1dfQUNLOgorCQl3ZXN0d29vZF91cGRhdGVfd2luZG93KHRwKTsKKwkJdy0+YmsgKz0gd2VzdHdvb2RfYWNrZWRfY291bnQodHApOworCQl3LT5ydHRfbWluID0gbWluKHctPnJ0dCwgdy0+cnR0X21pbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogZG9uJ3QgY2FyZSAqLworCQlicmVhazsKKwl9Cit9CisKKworLyogRXh0cmFjdCBpbmZvIGZvciBUY3Agc29ja2V0IGluZm8gcHJvdmlkZWQgdmlhIG5ldGxpbmsuICovCitzdGF0aWMgdm9pZCB0Y3Bfd2VzdHdvb2RfaW5mbyhzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgZXh0LAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwljb25zdCBzdHJ1Y3Qgd2VzdHdvb2QgKmNhID0gdGNwX2NhKHRwKTsKKwlpZiAoZXh0ICYgKDE8PChUQ1BESUFHX1ZFR0FTSU5GTy0xKSkpIHsKKwkJc3RydWN0IHJ0YXR0ciAqcnRhOworCQlzdHJ1Y3QgdGNwdmVnYXNfaW5mbyAqaW5mbzsKKworCQlydGEgPSBfX1JUQV9QVVQoc2tiLCBUQ1BESUFHX1ZFR0FTSU5GTywgc2l6ZW9mKCppbmZvKSk7CisJCWluZm8gPSBSVEFfREFUQShydGEpOworCQlpbmZvLT50Y3B2X2VuYWJsZWQgPSAxOworCQlpbmZvLT50Y3B2X3J0dGNudCA9IDA7CisJCWluZm8tPnRjcHZfcnR0ID0gamlmZmllc190b191c2VjcyhjYS0+cnR0KTsKKwkJaW5mby0+dGNwdl9taW5ydHQgPSBqaWZmaWVzX3RvX3VzZWNzKGNhLT5ydHRfbWluKTsKKwlydGF0dHJfZmFpbHVyZToJOworCX0KK30KKworCitzdGF0aWMgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3Bfd2VzdHdvb2QgPSB7CisJLmluaXQJCT0gdGNwX3dlc3R3b29kX2luaXQsCisJLnNzdGhyZXNoCT0gdGNwX3Jlbm9fc3N0aHJlc2gsCisJLmNvbmdfYXZvaWQJPSB0Y3BfcmVub19jb25nX2F2b2lkLAorCS5taW5fY3duZAk9IHRjcF93ZXN0d29vZF9jd25kX21pbiwKKwkuY3duZF9ldmVudAk9IHRjcF93ZXN0d29vZF9ldmVudCwKKwkuZ2V0X2luZm8JPSB0Y3Bfd2VzdHdvb2RfaW5mbywKKwkucGt0c19hY2tlZAk9IHRjcF93ZXN0d29vZF9wa3RzX2Fja2VkLAorCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ3ZXN0d29vZCIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHRjcF93ZXN0d29vZF9yZWdpc3Rlcih2b2lkKQoreworCUJVR19PTihzaXplb2Yoc3RydWN0IHdlc3R3b29kKSA+IFRDUF9DQV9QUklWX1NJWkUpOworCXJldHVybiB0Y3BfcmVnaXN0ZXJfY29uZ2VzdGlvbl9jb250cm9sKCZ0Y3Bfd2VzdHdvb2QpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGNwX3dlc3R3b29kX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0Y3BfdW5yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF93ZXN0d29vZCk7Cit9CisKK21vZHVsZV9pbml0KHRjcF93ZXN0d29vZF9yZWdpc3Rlcik7Cittb2R1bGVfZXhpdCh0Y3Bfd2VzdHdvb2RfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gSGVtbWluZ2VyLCBBbmdlbG8gRGVsbCdBZXJhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRDUCBXZXN0d29vZCsiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L0tjb25maWcgYi9uZXQvaXB2Ni9LY29uZmlnCmluZGV4IGU2NmNhOTMuLjk1MTYzY2QgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L0tjb25maWcKKysrIGIvbmV0L2lwdjYvS2NvbmZpZwpAQCAtMSw2ICsxLDI2IEBACiAjCiAjIElQdjYgY29uZmlndXJhdGlvbgotIyAKKyMKKworIyAgIElQdjYgYXMgbW9kdWxlIHdpbGwgY2F1c2UgYSBDUkFTSCBpZiB5b3UgdHJ5IHRvIHVubG9hZCBpdAorY29uZmlnIElQVjYKKwl0cmlzdGF0ZSAiVGhlIElQdjYgcHJvdG9jb2wiCisJZGVmYXVsdCBtCisJc2VsZWN0IENSWVBUTyBpZiBJUFY2X1BSSVZBQ1kKKwlzZWxlY3QgQ1JZUFRPX01ENSBpZiBJUFY2X1BSSVZBQ1kKKwktLS1oZWxwLS0tCisJICBUaGlzIGlzIGNvbXBsZW1lbnRhbCBzdXBwb3J0IGZvciB0aGUgSVAgdmVyc2lvbiA2LgorCSAgWW91IHdpbGwgc3RpbGwgYmUgYWJsZSB0byBkbyB0cmFkaXRpb25hbCBJUHY0IG5ldHdvcmtpbmcgYXMgd2VsbC4KKworCSAgRm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgSVB2Niwgc2VlCisJICA8aHR0cDovL3BsYXlncm91bmQuc3VuLmNvbS9wdWIvaXBuZy9odG1sL2lwbmctbWFpbi5odG1sPi4KKwkgIEZvciBMaW51eCBJUHY2IGRldmVsb3BtZW50IGluZm9ybWF0aW9uLCBzZWUgPGh0dHA6Ly93d3cubGludXgtaXB2Ni5vcmc+LgorCSAgRm9yIHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IElQdjYgdW5kZXIgTGludXgsIHJlYWQgdGhlIEhPV1RPIGF0CisJICA8aHR0cDovL3d3dy5iaWVyaW5nZXIuZGUvbGludXgvSVB2Ni8+LgorCisJICBUbyBjb21waWxlIHRoaXMgcHJvdG9jb2wgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIAorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwdjYuCisKIGNvbmZpZyBJUFY2X1BSSVZBQ1kKIAlib29sICJJUHY2OiBQcml2YWN5IEV4dGVuc2lvbnMgKFJGQyAzMDQxKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVBWNgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggYTU0ZDRlZi4uNzcwMDRiOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0yNzc3LDcgKzI3NzcsNyBAQAogCQlyZWFkX2xvY2tfYmgoJmlkZXYtPmxvY2spOwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBVTklDQVNUX0FERFI6Ci0JCQkvKiB1bmljYXN0IGFkZHJlc3MgKi8KKwkJCS8qIHVuaWNhc3QgYWRkcmVzcyBpbmNsLiB0ZW1wIGFkZHIgKi8KIAkJCWZvciAoaWZhID0gaWRldi0+YWRkcl9saXN0OyBpZmE7CiAJCQkgICAgIGlmYSA9IGlmYS0+aWZfbmV4dCwgaXBfaWR4KyspIHsKIAkJCQlpZiAoaXBfaWR4IDwgc19pcF9pZHgpCkBAIC0yNzg4LDE5ICsyNzg4LDYgQEAKIAkJCQkgICAgTkxNX0ZfTVVMVEkpKSA8PSAwKQogCQkJCQlnb3RvIGRvbmU7CiAJCQl9Ci0JCQkvKiB0ZW1wIGFkZHIgKi8KLSNpZmRlZiBDT05GSUdfSVBWNl9QUklWQUNZCi0JCQlmb3IgKGlmYSA9IGlkZXYtPnRlbXBhZGRyX2xpc3Q7IGlmYTsgCi0JCQkgICAgIGlmYSA9IGlmYS0+dG1wX25leHQsIGlwX2lkeCsrKSB7Ci0JCQkJaWYgKGlwX2lkeCA8IHNfaXBfaWR4KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoKGVyciA9IGluZXQ2X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCAKLQkJCQkgICAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsIAotCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdBRERSLAotCQkJCSAgICBOTE1fRl9NVUxUSSkpIDw9IDApIAotCQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0jZW5kaWYKIAkJCWJyZWFrOwogCQljYXNlIE1VTFRJQ0FTVF9BRERSOgogCQkJLyogbXVsdGljYXN0IGFkZHJlc3MgKi8KQEAgLTI5MjMsNiArMjkxMCw3IEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnIpLCBmbGFncyk7CiAJciA9IE5MTVNHX0RBVEEobmxoKTsKIAlyLT5pZmlfZmFtaWx5ID0gQUZfSU5FVDY7CisJci0+X19pZmlfcGFkID0gMDsKIAlyLT5pZmlfdHlwZSA9IGRldi0+dHlwZTsKIAlyLT5pZmlfaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAJci0+aWZpX2ZsYWdzID0gZGV2X2dldF9mbGFncyhkZXYpOwpAQCAtMzAzMCw5ICszMDE4LDEyIEBACiAJbmxoID0gTkxNU0dfTkVXKHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnBtc2cpLCBmbGFncyk7CiAJcG1zZyA9IE5MTVNHX0RBVEEobmxoKTsKIAlwbXNnLT5wcmVmaXhfZmFtaWx5ID0gQUZfSU5FVDY7CisJcG1zZy0+cHJlZml4X3BhZDEgPSAwOworCXBtc2ctPnByZWZpeF9wYWQyID0gMDsKIAlwbXNnLT5wcmVmaXhfaWZpbmRleCA9IGlkZXYtPmRldi0+aWZpbmRleDsKIAlwbXNnLT5wcmVmaXhfbGVuID0gcGluZm8tPnByZWZpeF9sZW47CiAJcG1zZy0+cHJlZml4X3R5cGUgPSBwaW5mby0+dHlwZTsKKwlwbXNnLT5wcmVmaXhfcGFkMyA9IDA7CiAJCiAJcG1zZy0+cHJlZml4X2ZsYWdzID0gMDsKIAlpZiAocGluZm8tPm9ubGluaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FmX2luZXQ2LmMgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCmluZGV4IDJiMTkzZTMuLjI4ZDliY2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FmX2luZXQ2LmMKKysrIGIvbmV0L2lwdjYvYWZfaW5ldDYuYwpAQCAtNzc0LDcgKzc3NCw2IEBACiAJaWYgKGlmNl9wcm9jX2luaXQoKSkKIAkJZ290byBwcm9jX2lmNl9mYWlsOwogI2VuZGlmCi0JaXB2Nl9wYWNrZXRfaW5pdCgpOwogCWlwNl9yb3V0ZV9pbml0KCk7CiAJaXA2X2Zsb3dsYWJlbF9pbml0KCk7CiAJZXJyID0gYWRkcmNvbmZfaW5pdCgpOwpAQCAtNzkxLDYgKzc5MCw4IEBACiAJLyogSW5pdCB2NiB0cmFuc3BvcnQgcHJvdG9jb2xzLiAqLwogCXVkcHY2X2luaXQoKTsKIAl0Y3B2Nl9pbml0KCk7CisKKwlpcHY2X3BhY2tldF9pbml0KCk7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwpAQCAtNzk4LDcgKzc5OSw2IEBACiBhZGRyY29uZl9mYWlsOgogCWlwNl9mbG93bGFiZWxfY2xlYW51cCgpOwogCWlwNl9yb3V0ZV9jbGVhbnVwKCk7Ci0JaXB2Nl9wYWNrZXRfY2xlYW51cCgpOwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJaWY2X3Byb2NfZXhpdCgpOwogcHJvY19pZjZfZmFpbDoKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwppbmRleCAwZTVmNzQ5Li5iNmM3M2RhNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCisrKyBiL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYwpAQCAtMjQ0LDcgKzI0NCw2IEBACiAJCW9wdF9zcGFjZS0+b3B0X25mbGVuID0gMDsKIAl9CiAJb3B0X3NwYWNlLT5kc3Qxb3B0ID0gZm9wdC0+ZHN0MW9wdDsKLQlvcHRfc3BhY2UtPmF1dGggPSBmb3B0LT5hdXRoOwogCW9wdF9zcGFjZS0+b3B0X2ZsZW4gPSBmb3B0LT5vcHRfZmxlbjsKIAlyZXR1cm4gb3B0X3NwYWNlOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCmluZGV4IDA2ZTdjZGFlLi4xZjJjMmY5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC00NjUsNyArNDY1LDYgQEAKIAl0by0+cGt0X3R5cGUgPSBmcm9tLT5wa3RfdHlwZTsKIAl0by0+cHJpb3JpdHkgPSBmcm9tLT5wcmlvcml0eTsKIAl0by0+cHJvdG9jb2wgPSBmcm9tLT5wcm90b2NvbDsKLQl0by0+c2VjdXJpdHkgPSBmcm9tLT5zZWN1cml0eTsKIAlkc3RfcmVsZWFzZSh0by0+ZHN0KTsKIAl0by0+ZHN0ID0gZHN0X2Nsb25lKGZyb20tPmRzdCk7CiAJdG8tPmRldiA9IGZyb20tPmRldjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L21jYXN0LmMgYi9uZXQvaXB2Ni9tY2FzdC5jCmluZGV4IDU2MmZjZDEuLjI5ZmVkNmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L21jYXN0LmMKKysrIGIvbmV0L2lwdjYvbWNhc3QuYwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJfQogCXdyaXRlX3VubG9ja19iaCgmaXB2Nl9za19tY19sb2NrKTsKIAotCXJldHVybiAtRU5PRU5UOworCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIH0KIAogc3RhdGljIHN0cnVjdCBpbmV0Nl9kZXYgKmlwNl9tY19maW5kX2RldihzdHJ1Y3QgaW42X2FkZHIgKmdyb3VwLCBpbnQgaWZpbmRleCkKQEAgLTM4NiwxMiArMzg2LDE2IEBACiAJCWlmIChpcHY2X2FkZHJfZXF1YWwoJnBtYy0+YWRkciwgZ3JvdXApKQogCQkJYnJlYWs7CiAJfQotCWlmICghcG1jKQkJLyogbXVzdCBoYXZlIGEgcHJpb3Igam9pbiAqLworCWlmICghcG1jKSB7CQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKKwl9CiAJLyogaWYgYSBzb3VyY2UgZmlsdGVyIHdhcyBzZXQsIG11c3QgYmUgdGhlIHNhbWUgbW9kZSBhcyBiZWZvcmUgKi8KIAlpZiAocG1jLT5zZmxpc3QpIHsKLQkJaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKQorCQlpZiAocG1jLT5zZm1vZGUgIT0gb21vZGUpIHsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGRvbmU7CisJCX0KIAl9IGVsc2UgaWYgKHBtYy0+c2Ztb2RlICE9IG9tb2RlKSB7CiAJCS8qIGFsbG93IG1vZGUgc3dpdGNoZXMgZm9yIGVtcHR5LXNldCBmaWx0ZXJzICovCiAJCWlwNl9tY19hZGRfc3JjKGlkZXYsIGdyb3VwLCBvbW9kZSwgMCwgTlVMTCwgMCk7CkBAIC00MDIsNyArNDA2LDcgQEAKIAlwc2wgPSBwbWMtPnNmbGlzdDsKIAlpZiAoIWFkZCkgewogCQlpZiAoIXBzbCkKLQkJCWdvdG8gZG9uZTsKKwkJCWdvdG8gZG9uZTsJLyogZXJyID0gLUVBRERSTk9UQVZBSUwgKi8KIAkJcnYgPSAhMDsKIAkJZm9yIChpPTA7IGk8cHNsLT5zbF9jb3VudDsgaSsrKSB7CiAJCQlydiA9IG1lbWNtcCgmcHNsLT5zbF9hZGRyW2ldLCBzb3VyY2UsCkBAIC00MTEsNyArNDE1LDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQlpZiAocnYpCQkvKiBzb3VyY2Ugbm90IGZvdW5kICovCi0JCQlnb3RvIGRvbmU7CisJCQlnb3RvIGRvbmU7CS8qIGVyciA9IC1FQUREUk5PVEFWQUlMICovCiAKIAkJLyogc3BlY2lhbCBjYXNlIC0gKElOQ0xVREUsIGVtcHR5KSA9PSBMRUFWRV9HUk9VUCAqLwogCQlpZiAocHNsLT5zbF9jb3VudCA9PSAxICYmIG9tb2RlID09IE1DQVNUX0lOQ0xVREUpIHsKQEAgLTQ4OCw2ICs0OTIsNyBAQAogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IGlwdjZfcGluZm8gKmluZXQ2ID0gaW5ldDZfc2soc2spOwogCXN0cnVjdCBpcDZfc2Zfc29ja2xpc3QgKm5ld3BzbCwgKnBzbDsKKwlpbnQgbGVhdmVncm91cCA9IDA7CiAJaW50IGksIGVycjsKIAogCWdyb3VwID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSZnc2YtPmdmX2dyb3VwKS0+c2luNl9hZGRyOwpAQCAtNTAzLDcgKzUwOCwxMiBAQAogCWlmICghaWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZGV2ID0gaWRldi0+ZGV2OwotCWVyciA9IC1FQUREUk5PVEFWQUlMOworCisJZXJyID0gMDsKKwlpZiAoZ3NmLT5nZl9mbW9kZSA9PSBNQ0FTVF9JTkNMVURFICYmIGdzZi0+Z2ZfbnVtc3JjID09IDApIHsKKwkJbGVhdmVncm91cCA9IDE7CisJCWdvdG8gZG9uZTsKKwl9CiAKIAlmb3IgKHBtYz1pbmV0Ni0+aXB2Nl9tY19saXN0OyBwbWM7IHBtYz1wbWMtPm5leHQpIHsKIAkJaWYgKHBtYy0+aWZpbmRleCAhPSBnc2YtPmdmX2ludGVyZmFjZSkKQEAgLTUxMSw4ICs1MjEsMTAgQEAKIAkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmcG1jLT5hZGRyLCBncm91cCkpCiAJCQlicmVhazsKIAl9Ci0JaWYgKCFwbWMpCQkvKiBtdXN0IGhhdmUgYSBwcmlvciBqb2luICovCisJaWYgKCFwbWMpIHsJCS8qIG11c3QgaGF2ZSBhIHByaW9yIGpvaW4gKi8KKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBkb25lOworCX0KIAlpZiAoZ3NmLT5nZl9udW1zcmMpIHsKIAkJbmV3cHNsID0gKHN0cnVjdCBpcDZfc2Zfc29ja2xpc3QgKilzb2NrX2ttYWxsb2Moc2ssCiAJCQkJSVA2X1NGTFNJWkUoZ3NmLT5nZl9udW1zcmMpLCBHRlBfQVRPTUlDKTsKQEAgLTU0NCwxMCArNTU2LDEzIEBACiAJCSh2b2lkKSBpcDZfbWNfZGVsX3NyYyhpZGV2LCBncm91cCwgcG1jLT5zZm1vZGUsIDAsIE5VTEwsIDApOwogCXBtYy0+c2ZsaXN0ID0gbmV3cHNsOwogCXBtYy0+c2Ztb2RlID0gZ3NmLT5nZl9mbW9kZTsKKwllcnIgPSAwOwogZG9uZToKIAlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CiAJaW42X2Rldl9wdXQoaWRldik7CiAJZGV2X3B1dChkZXYpOworCWlmIChsZWF2ZWdyb3VwKQorCQllcnIgPSBpcHY2X3NvY2tfbWNfZHJvcChzaywgZ3NmLT5nZl9pbnRlcmZhY2UsIGdyb3VwKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGIvbmV0L2lwdjYvdGNwX2lwdjYuYwppbmRleCAyNDE0OTM3Li5mNmUyODhkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni90Y3BfaXB2Ni5jCisrKyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKQEAgLTIwMTgsMTQgKzIwMTgsMTQgQEAKIAkgKi8KIAl0cC0+c25kX3NzdGhyZXNoID0gMHg3ZmZmZmZmZjsKIAl0cC0+c25kX2N3bmRfY2xhbXAgPSB+MDsKLQl0cC0+bXNzX2NhY2hlX3N0ZCA9IHRwLT5tc3NfY2FjaGUgPSA1MzY7CisJdHAtPm1zc19jYWNoZSA9IDUzNjsKIAogCXRwLT5yZW9yZGVyaW5nID0gc3lzY3RsX3RjcF9yZW9yZGVyaW5nOwogCiAJc2stPnNrX3N0YXRlID0gVENQX0NMT1NFOwogCiAJdHAtPmFmX3NwZWNpZmljID0gJmlwdjZfc3BlY2lmaWM7Ci0KKwl0cC0+Y2Ffb3BzID0gJnRjcF9pbml0X2Nvbmdlc3Rpb25fb3BzOwogCXNrLT5za193cml0ZV9zcGFjZSA9IHNrX3N0cmVhbV93cml0ZV9zcGFjZTsKIAlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1VTRV9XUklURV9RVUVVRSk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHgvS2NvbmZpZyBiL25ldC9pcHgvS2NvbmZpZwppbmRleCBhMTYyMzdjLi45ODBhODI2IDEwMDY0NAotLS0gYS9uZXQvaXB4L0tjb25maWcKKysrIGIvbmV0L2lweC9LY29uZmlnCkBAIC0xLDYgKzEsMzkgQEAKICMKICMgSVBYIGNvbmZpZ3VyYXRpb24KICMKK2NvbmZpZyBJUFgKKwl0cmlzdGF0ZSAiVGhlIElQWCBwcm90b2NvbCIKKwlzZWxlY3QgTExDCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgTm92ZWxsIG5ldHdvcmtpbmcgcHJvdG9jb2wsIElQWCwgY29tbW9ubHkKKwkgIHVzZWQgZm9yIGxvY2FsIG5ldHdvcmtzIG9mIFdpbmRvd3MgbWFjaGluZXMuICBZb3UgbmVlZCBpdCBpZiB5b3UKKwkgIHdhbnQgdG8gYWNjZXNzIE5vdmVsbCBOZXRXYXJlIGZpbGUgb3IgcHJpbnQgc2VydmVycyB1c2luZyB0aGUgTGludXgKKwkgIE5vdmVsbCBjbGllbnQgbmNwZnMgKGF2YWlsYWJsZSBmcm9tCisJICA8ZnRwOi8vcGxhdGFuLnZjLmN2dXQuY3ovcHViL2xpbnV4L25jcGZzLz4pIG9yIGZyb20KKwkgIHdpdGhpbiB0aGUgTGludXggRE9TIGVtdWxhdG9yIERPU0VNVSAocmVhZCB0aGUgRE9TRU1VLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPikuICBJbiBvcmRlcgorCSAgdG8gZG8gdGhlIGZvcm1lciwgeW91J2xsIGFsc28gaGF2ZSB0byBzYXkgWSB0byAiTkNQIGZpbGUgc3lzdGVtCisJICBzdXBwb3J0IiwgYmVsb3cuCisKKwkgIElQWCBpcyBzaW1pbGFyIGluIHNjb3BlIHRvIElQLCB3aGlsZSBTUFgsIHdoaWNoIHJ1bnMgb24gdG9wIG9mIElQWCwKKwkgIGlzIHNpbWlsYXIgdG8gVENQLiBUaGVyZSBpcyBhbHNvIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBTUFggaW4KKwkgIExpbnV4IChzZWUgIlNQWCBuZXR3b3JraW5nIiwgYmVsb3cpLgorCisJICBUbyB0dXJuIHlvdXIgTGludXggYm94IGludG8gYSBmdWxseSBmZWF0dXJlZCBOZXRXYXJlIGZpbGUgc2VydmVyIGFuZAorCSAgSVBYIHJvdXRlciwgc2F5IFkgaGVyZSBhbmQgZmV0Y2ggZWl0aGVyIGx3YXJlZCBmcm9tCisJICA8ZnRwOi8vaWJpYmxpby5vcmcvcHViL0xpbnV4L3N5c3RlbS9uZXR3b3JrL2RhZW1vbnMvPiBvcgorCSAgbWFyc19ud2UgZnJvbSA8ZnRwOi8vd3d3LmNvbXB1LWFydC5kZS9tYXJzX253ZS8+LiBGb3IgbW9yZQorCSAgaW5mb3JtYXRpb24sIHJlYWQgdGhlIElQWC1IT1dUTyBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKKwkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgorCisJICBUaGUgSVBYIGRyaXZlciB3b3VsZCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDE2IEtCLiBUbyBjb21waWxlCisJICB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHguCisJICBVbmxlc3MgeW91IHdhbnQgdG8gaW50ZWdyYXRlIHlvdXIgTGludXggYm94IHdpdGggYSBsb2NhbCBOb3ZlbGwKKwkgIG5ldHdvcmssIHNheSBOLgorCiBjb25maWcgSVBYX0lOVEVSTgogCWJvb2wgIklQWDogRnVsbCBpbnRlcm5hbCBJUFggbmV0d29yayIKIAlkZXBlbmRzIG9uIElQWApkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJsYXAuYyBiL25ldC9pcmRhL2lybGFwLmMKaW5kZXggMDQ2YWQwNy4uNzAyOTYxOCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJsYXAuYworKysgYi9uZXQvaXJkYS9pcmxhcC5jCkBAIC00NDUsOSArNDQ1LDggQEAKIAlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBMQVBfTUFHSUMsIHJldHVybjspOwogCiAJLyogRG9uJ3QgZGlzY29ubmVjdCB1bnRpbCBhbGwgZGF0YSBmcmFtZXMgYXJlIHN1Y2Nlc3NmdWxseSBzZW50ICovCi0JaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkgPiAwKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkpIHsKIAkJc2VsZi0+ZGlzY29ubmVjdF9wZW5kaW5nID0gVFJVRTsKLQogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jIGIvbmV0L2lyZGEvaXJsYXBfZXZlbnQuYwppbmRleCAxY2Q4OWY1Li5hNTA1YjU0IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhcF9ldmVudC5jCisrKyBiL25ldC9pcmRhL2lybGFwX2V2ZW50LmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCSAqIFNlbmQgb3V0IHRoZSBSUiBmcmFtZXMgZmFzdGVyIGlmIG91ciBvd24gdHJhbnNtaXQgcXVldWUgaXMgZW1wdHksIG9yCiAJICogaWYgdGhlIHBlZXIgaXMgYnVzeS4gVGhlIGVmZmVjdCBpcyBhIG11Y2ggZmFzdGVyIGNvbnZlcnNhdGlvbgogCSAqLwotCWlmICgoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA9PSAwKSB8fCAoc2VsZi0+cmVtb3RlX2J1c3kpKSB7CisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSB8fCBzZWxmLT5yZW1vdGVfYnVzeSkgewogCQlpZiAoc2VsZi0+ZmFzdF9SUiA9PSBUUlVFKSB7CiAJCQkvKgogCQkJICogIEFzc2VydCB0aGF0IHRoZSBmYXN0IHBvbGwgdGltZXIgaGFzIG5vdCByZWFjaGVkIHRoZQpAQCAtMjYzLDcgKzI2Myw3IEBACiAJCUlSREFfREVCVUcoMiwgIiVzKCkgOiBxdWV1ZSBsZW4gPSAlZFxuIiwgX19GVU5DVElPTl9fLAogCQkJICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJnNlbGYtPnR4cSkpIHsKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkpIHsKIAkJCS8qIFByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggaXJsYXBfZGF0YV9yZXF1ZXN0KCkgKi8KIAkJCXNlbGYtPmxvY2FsX2J1c3kgPSBUUlVFOwogCkBAIC0xMDc0LDcgKzEwNzQsNyBAQAogI2Vsc2UJLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KIAkJCS8qIFdpbmRvdyBoYXMgYmVlbiBhZGp1c3RlZCBmb3IgdGhlIG1heCBwYWNrZXQKIAkJCSAqIHNpemUsIHNvIG11Y2ggc2ltcGxlci4uLiAtIEplYW4gSUkgKi8KLQkJCW5leHRmaXQgPSAoc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApOworCQkJbmV4dGZpdCA9ICFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSk7CiAjZW5kaWYJLyogQ09ORklHX0lSREFfRFlOQU1JQ19XSU5ET1cgKi8KIAkJCS8qCiAJCQkgKiAgU2VuZCBkYXRhIHdpdGggcG9sbCBiaXQgY2xlYXJlZCBvbmx5IGlmIHdpbmRvdyA+IDEKQEAgLTE4MTQsNyArMTgxNCw3IEBACiAjZWxzZQkvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLwogCQkJLyogV2luZG93IGhhcyBiZWVuIGFkanVzdGVkIGZvciB0aGUgbWF4IHBhY2tldAogCQkJICogc2l6ZSwgc28gbXVjaCBzaW1wbGVyLi4uIC0gSmVhbiBJSSAqLwotCQkJbmV4dGZpdCA9IChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCk7CisJCQluZXh0Zml0ID0gIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKTsKICNlbmRpZiAvKiBDT05GSUdfSVJEQV9EWU5BTUlDX1dJTkRPVyAqLwogCQkJLyoKIAkJCSAqICBTZW5kIGRhdGEgd2l0aCBmaW5hbCBiaXQgY2xlYXJlZCBvbmx5IGlmIHdpbmRvdyA+IDEKQEAgLTE5MzcsNyArMTkzNyw3IEBACiAJCQkJaXJsYXBfZGF0YV9pbmRpY2F0aW9uKHNlbGYsIHNrYiwgRkFMU0UpOwogCiAJCQkJLyogQW55IHBlbmRpbmcgZGF0YSByZXF1ZXN0cz8gICovCi0JCQkJaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkgJiYKKwkJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSAmJgogCQkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpCiAJCQkJewogCQkJCQlzZWxmLT5hY2tfcmVxdWlyZWQgPSBUUlVFOwpAQCAtMjAzOCw3ICsyMDM4LDcgQEAKIAkJCS8qCiAJCQkgKiAgQW55IHBlbmRpbmcgZGF0YSByZXF1ZXN0cz8KIAkJCSAqLwotCQkJaWYgKChza2JfcXVldWVfbGVuKCZzZWxmLT50eHEpID4gMCkgJiYKKwkJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZzZWxmLT50eHEpICYmCiAJCQkgICAgKHNlbGYtPndpbmRvdyA+IDApICYmICFzZWxmLT5yZW1vdGVfYnVzeSkKIAkJCXsKIAkJCQlpcmxhcF9kYXRhX2luZGljYXRpb24oc2VsZiwgc2tiLCBUUlVFKTsKQEAgLTIwNjksNyArMjA2OSw3IEBACiAJCSAqLwogCQlucl9zdGF0dXMgPSBpcmxhcF92YWxpZGF0ZV9ucl9yZWNlaXZlZChzZWxmLCBpbmZvLT5ucik7CiAJCWlmIChucl9zdGF0dXMgPT0gTlJfRVhQRUNURUQpIHsKLQkJCWlmICgoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSAmJgorCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkgJiYKIAkJCSAgICAoc2VsZi0+d2luZG93ID4gMCkpIHsKIAkJCQlzZWxmLT5yZW1vdGVfYnVzeSA9IEZBTFNFOwogCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jIGIvbmV0L2lyZGEvaXJsYXBfZnJhbWUuYwppbmRleCAwNDBhYmU3Li42ZGFmYmI0IDEwMDY0NAotLS0gYS9uZXQvaXJkYS9pcmxhcF9mcmFtZS5jCisrKyBiL25ldC9pcmRhL2lybGFwX2ZyYW1lLmMKQEAgLTEwMTgsMTEgKzEwMTgsMTAgQEAKIAkvKgogCSAqICBXZSBjYW4gbm93IGZpbGwgdGhlIHdpbmRvdyB3aXRoIGFkZGl0aW9uYWwgZGF0YSBmcmFtZXMKIAkgKi8KLQl3aGlsZSAoc2tiX3F1ZXVlX2xlbiggJnNlbGYtPnR4cSkgPiAwKSB7CisJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4cSkpIHsKIAogCQlJUkRBX0RFQlVHKDAsICIlcygpLCBzZW5kaW5nIGFkZGl0aW9uYWwgZnJhbWVzIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJaWYgKChza2JfcXVldWVfbGVuKCAmc2VsZi0+dHhxKSA+IDApICYmCi0JCSAgICAoc2VsZi0+d2luZG93ID4gMCkpIHsKKwkJaWYgKHNlbGYtPndpbmRvdyA+IDApIHsKIAkJCXNrYiA9IHNrYl9kZXF1ZXVlKCAmc2VsZi0+dHhxKTsKIAkJCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKIApAQCAtMTAzMSw4ICsxMDMwLDcgQEAKIAkJCSAqICBiaXQgY2xlYXJlZAogCQkJICovCiAJCQlpZiAoKHNlbGYtPndpbmRvdyA+IDEpICYmCi0JCQkgICAgc2tiX3F1ZXVlX2xlbigmc2VsZi0+dHhxKSA+IDApCi0JCQl7CisJCQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmc2VsZi0+dHhxKSkgewogCQkJCWlybGFwX3NlbmRfZGF0YV9wcmltYXJ5KHNlbGYsIHNrYik7CiAJCQl9IGVsc2UgewogCQkJCWlybGFwX3NlbmRfZGF0YV9wcmltYXJ5X3BvbGwoc2VsZiwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lydHRwLmMgYi9uZXQvaXJkYS9pcnR0cC5jCmluZGV4IGQwOTFjY2YuLjY2MDJkOTAgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lydHRwLmMKKysrIGIvbmV0L2lyZGEvaXJ0dHAuYwpAQCAtMTUxMyw3ICsxNTEzLDcgQEAKIAkvKgogCSAqICBDaGVjayBpZiB0aGVyZSBpcyBzdGlsbCBkYXRhIHNlZ21lbnRzIGluIHRoZSB0cmFuc21pdCBxdWV1ZQogCSAqLwotCWlmIChza2JfcXVldWVfbGVuKCZzZWxmLT50eF9xdWV1ZSkgPiAwKSB7CisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNlbGYtPnR4X3F1ZXVlKSkgewogCQlpZiAocHJpb3JpdHkgPT0gUF9ISUdIKSB7CiAJCQkvKgogCQkJICogIE5vIG5lZWQgdG8gc2VuZCB0aGUgcXVldWVkIGRhdGEsIGlmIHdlIGFyZQpkaWZmIC0tZ2l0IGEvbmV0L2xhcGIvS2NvbmZpZyBiL25ldC9sYXBiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiNWVmYgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9sYXBiL0tjb25maWcKQEAgLTAsMCArMSwyMiBAQAorIworIyBMQVBCIERhdGEgTGluayBEcml2ZQorIworCitjb25maWcgTEFQQgorCXRyaXN0YXRlICJMQVBCIERhdGEgTGluayBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBMaW5rIEFjY2VzcyBQcm9jZWR1cmUsIEJhbGFuY2VkIChMQVBCKSBpcyB0aGUgZGF0YSBsaW5rIGxheWVyIChpLmUuCisJICB0aGUgbG93ZXIpIHBhcnQgb2YgdGhlIFguMjUgcHJvdG9jb2wuIEl0IG9mZmVycyBhIHJlbGlhYmxlCisJICBjb25uZWN0aW9uIHNlcnZpY2UgdG8gZXhjaGFuZ2UgZGF0YSBmcmFtZXMgd2l0aCBvbmUgb3RoZXIgaG9zdCwgYW5kCisJICBpdCBpcyB1c2VkIHRvIHRyYW5zcG9ydCBoaWdoZXIgbGV2ZWwgcHJvdG9jb2xzIChtb3N0bHkgWC4yNSBQYWNrZXQKKwkgIExheWVyLCB0aGUgaGlnaGVyIHBhcnQgb2YgWC4yNSwgYnV0IG90aGVycyBhcmUgcG9zc2libGUgYXMgd2VsbCkuCisJICBVc3VhbGx5LCBMQVBCIGlzIHVzZWQgd2l0aCBzcGVjaWFsaXplZCBYLjIxIG5ldHdvcmsgY2FyZHMsIGJ1dCBMaW51eAorCSAgY3VycmVudGx5IHN1cHBvcnRzIExBUEIgb25seSBvdmVyIEV0aGVybmV0IGNvbm5lY3Rpb25zLiBJZiB5b3Ugd2FudAorCSAgdG8gdXNlIExBUEIgY29ubmVjdGlvbnMgb3ZlciBFdGhlcm5ldCwgc2F5IFkgaGVyZSBhbmQgdG8gIkxBUEIgb3ZlcgorCSAgRXRoZXJuZXQgZHJpdmVyIiBiZWxvdy4gUmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2xhcGItbW9kdWxlLnR4dD4gZm9yIHRlY2huaWNhbAorCSAgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbGFwYi4gIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9uZXQvbGxjL2xsY19jX2V2LmMgYi9uZXQvbGxjL2xsY19jX2V2LmMKaW5kZXggY2QxMzBjMy4uZDViZGI1MyAxMDA2NDQKLS0tIGEvbmV0L2xsYy9sbGNfY19ldi5jCisrKyBiL25ldC9sbGMvbGxjX2NfZXYuYwpAQCAtODQsNyArODQsNyBAQAogCWlmIChsbGMtPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAJCWdvdG8gb3V0OwogCXJjID0gMTsKLQlpZiAoIXNrYl9xdWV1ZV9sZW4oJmxsYy0+cGR1X3VuYWNrX3EpKQorCWlmIChza2JfcXVldWVfZW1wdHkoJmxsYy0+cGR1X3VuYWNrX3EpKQogCQlnb3RvIG91dDsKIAlza2IgPSBza2JfcGVlaygmbGxjLT5wZHVfdW5hY2tfcSk7CiAJcGR1ID0gbGxjX3BkdV9zbl9oZHIoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwppbmRleCA3MGJjZDQ3Li4zNDA1ZmRmIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCkBAIC0zMTUsOCArMzE1LDggQEAKIHN0YXRpYyB2b2lkIG5ldGxpbmtfcmVtb3ZlKHN0cnVjdCBzb2NrICpzaykKIHsKIAluZXRsaW5rX3RhYmxlX2dyYWIoKTsKLQlubF90YWJsZVtzay0+c2tfcHJvdG9jb2xdLmhhc2guZW50cmllcy0tOwotCXNrX2RlbF9ub2RlX2luaXQoc2spOworCWlmIChza19kZWxfbm9kZV9pbml0KHNrKSkKKwkJbmxfdGFibGVbc2stPnNrX3Byb3RvY29sXS5oYXNoLmVudHJpZXMtLTsKIAlpZiAobmxrX3NrKHNrKS0+Z3JvdXBzKQogCQlfX3NrX2RlbF9iaW5kX25vZGUoc2spOwogCW5ldGxpbmtfdGFibGVfdW5ncmFiKCk7CkBAIC00MjksNyArNDI5LDEyIEBACiAJZXJyID0gbmV0bGlua19pbnNlcnQoc2ssIHBpZCk7CiAJaWYgKGVyciA9PSAtRUFERFJJTlVTRSkKIAkJZ290byByZXRyeTsKLQlyZXR1cm4gMDsKKworCS8qIElmIDIgdGhyZWFkcyByYWNlIHRvIGF1dG9iaW5kLCB0aGF0IGlzIGZpbmUuICAqLworCWlmIChlcnIgPT0gLUVCVVNZKQorCQllcnIgPSAwOworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbmV0bGlua19jYXBhYmxlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBmbGFnKSAKQEAgLTg1Myw3ICs4NTgsNyBAQAogewogCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7CiAKLQlpZiAoIXNrYl9xdWV1ZV9sZW4oJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpCiAJCWNsZWFyX2JpdCgwLCAmbmxrLT5zdGF0ZSk7CiAJaWYgKCF0ZXN0X2JpdCgwLCAmbmxrLT5zdGF0ZSkpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbmxrLT53YWl0KTsKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvS2NvbmZpZyBiL25ldC9wYWNrZXQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGZmOTNmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3BhY2tldC9LY29uZmlnCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgUGFja2V0IGNvbmZpZ3VyYXRpb24KKyMKKworY29uZmlnIFBBQ0tFVAorCXRyaXN0YXRlICJQYWNrZXQgc29ja2V0IgorCS0tLWhlbHAtLS0KKwkgIFRoZSBQYWNrZXQgcHJvdG9jb2wgaXMgdXNlZCBieSBhcHBsaWNhdGlvbnMgd2hpY2ggY29tbXVuaWNhdGUKKwkgIGRpcmVjdGx5IHdpdGggbmV0d29yayBkZXZpY2VzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIG5ldHdvcmsKKwkgIHByb3RvY29sIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwsIGUuZy4gdGNwZHVtcC4gIElmIHlvdSB3YW50IHRoZW0KKwkgIHRvIHdvcmssIGNob29zZSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBhZl9wYWNrZXQuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBQQUNLRVRfTU1BUAorCWJvb2wgIlBhY2tldCBzb2NrZXQ6IG1tYXBwZWQgSU8iCisJZGVwZW5kcyBvbiBQQUNLRVQKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdGhlIFBhY2tldCBwcm90b2NvbCBkcml2ZXIgd2lsbCB1c2UgYW4gSU8KKwkgIG1lY2hhbmlzbSB0aGF0IHJlc3VsdHMgaW4gZmFzdGVyIGNvbW11bmljYXRpb24uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IDAyNjk2MTYuLmM5ZDU5ODAgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtMjc0LDYgKzI3NCw5IEBACiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogCXNrYi0+ZHN0ID0gTlVMTDsKIAorCS8qIGRyb3AgY29ubnRyYWNrIHJlZmVyZW5jZSAqLworCW5mX3Jlc2V0KHNrYik7CisKIAlzcGt0ID0gKHN0cnVjdCBzb2NrYWRkcl9wa3QqKXNrYi0+Y2I7CiAKIAlza2JfcHVzaChza2IsIHNrYi0+ZGF0YS1za2ItPm1hYy5yYXcpOwpAQCAtNTE3LDYgKzUyMCw5IEBACiAJZHN0X3JlbGVhc2Uoc2tiLT5kc3QpOwogCXNrYi0+ZHN0ID0gTlVMTDsKIAorCS8qIGRyb3AgY29ubnRyYWNrIHJlZmVyZW5jZSAqLworCW5mX3Jlc2V0KHNrYik7CisKIAlzcGluX2xvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCXBvLT5zdGF0cy50cF9wYWNrZXRzKys7CiAJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4aW9kLmMgYi9uZXQvcnhycGMva3J4aW9kLmMKaW5kZXggMmI1MzdmNC4uZGFkYTM0YSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2tyeGlvZC5jCisrKyBiL25ldC9yeHJwYy9rcnhpb2QuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAKIAkJX2RlYnVnKCIjIyMgRW5kIFdvcmsiKTsKIAotCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAogICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCiAJCXJ4cnBjX2Rpc2NhcmRfbXlfc2lnbmFscygpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2tyeHNlY2QuYyBiL25ldC9yeHJwYy9rcnhzZWNkLmMKaW5kZXggNjAyMGM4OS4uMWFhZGQwMiAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2tyeHNlY2QuYworKysgYi9uZXQvcnhycGMva3J4c2VjZC5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAogCQlfZGVidWcoIiMjIyBFbmQgSW5ib3VuZCBDYWxscyIpOwogCi0JCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOwogCiAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KIAkJcnhycGNfZGlzY2FyZF9teV9zaWduYWxzKCk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMva3J4dGltb2QuYyBiL25ldC9yeHJwYy9rcnh0aW1vZC5jCmluZGV4IDI0OWMyYjAuLjNhYzgxY2QgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9rcnh0aW1vZC5jCisrKyBiL25ldC9yeHJwYy9rcnh0aW1vZC5jCkBAIC05MCw3ICs5MCw3IEBACiAJCQljb21wbGV0ZV9hbmRfZXhpdCgma3J4dGltb2RfZGVhZCwgMCk7CiAJCX0KIAotCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAogCQkvKiBkaXNjYXJkIHBlbmRpbmcgc2lnbmFscyAqLwogCQlyeHJwY19kaXNjYXJkX215X3NpZ25hbHMoKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9LY29uZmlnIGIvbmV0L3NjaGVkL0tjb25maWcKaW5kZXggYjIyYzliZS4uNTlkM2U3MSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL0tjb25maWcKKysrIGIvbmV0L3NjaGVkL0tjb25maWcKQEAgLTEsNiArMSw0MyBAQAogIwogIyBUcmFmZmljIGNvbnRyb2wgY29uZmlndXJhdGlvbi4KICMgCisKK21lbnVjb25maWcgTkVUX1NDSEVECisJYm9vbCAiUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nIgorCS0tLWhlbHAtLS0KKwkgIFdoZW4gdGhlIGtlcm5lbCBoYXMgc2V2ZXJhbCBwYWNrZXRzIHRvIHNlbmQgb3V0IG92ZXIgYSBuZXR3b3JrCisJICBkZXZpY2UsIGl0IGhhcyB0byBkZWNpZGUgd2hpY2ggb25lcyB0byBzZW5kIGZpcnN0LCB3aGljaCBvbmVzIHRvCisJICBkZWxheSwgYW5kIHdoaWNoIG9uZXMgdG8gZHJvcC4gVGhpcyBpcyB0aGUgam9iIG9mIHRoZSBwYWNrZXQKKwkgIHNjaGVkdWxlciwgYW5kIHNldmVyYWwgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIGhvdyB0byBkbyB0aGlzCisJICAiZmFpcmx5IiBoYXZlIGJlZW4gcHJvcG9zZWQuCisKKwkgIElmIHlvdSBzYXkgTiBoZXJlLCB5b3Ugd2lsbCBnZXQgdGhlIHN0YW5kYXJkIHBhY2tldCBzY2hlZHVsZXIsIHdoaWNoCisJICBpcyBhIEZJRk8gKGZpcnN0IGNvbWUsIGZpcnN0IHNlcnZlZCkuIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZQorCSAgYWJsZSB0byBjaG9vc2UgZnJvbSBhbW9uZyBzZXZlcmFsIGFsdGVybmF0aXZlIGFsZ29yaXRobXMgd2hpY2ggY2FuCisJICB0aGVuIGJlIGF0dGFjaGVkIHRvIGRpZmZlcmVudCBuZXR3b3JrIGRldmljZXMuIFRoaXMgaXMgdXNlZnVsIGZvcgorCSAgZXhhbXBsZSBpZiBzb21lIG9mIHlvdXIgbmV0d29yayBkZXZpY2VzIGFyZSByZWFsIHRpbWUgZGV2aWNlcyB0aGF0CisJICBuZWVkIGEgY2VydGFpbiBtaW5pbXVtIGRhdGEgZmxvdyByYXRlLCBvciBpZiB5b3UgbmVlZCB0byBsaW1pdCB0aGUKKwkgIG1heGltdW0gZGF0YSBmbG93IHJhdGUgZm9yIHRyYWZmaWMgd2hpY2ggbWF0Y2hlcyBzcGVjaWZpZWQgY3JpdGVyaWEuCisJICBUaGlzIGNvZGUgaXMgY29uc2lkZXJlZCB0byBiZSBleHBlcmltZW50YWwuCisKKwkgIFRvIGFkbWluaXN0ZXIgdGhlc2Ugc2NoZWR1bGVycywgeW91J2xsIG5lZWQgdGhlIHVzZXItbGV2ZWwgdXRpbGl0aWVzCisJICBmcm9tIHRoZSBwYWNrYWdlIGlwcm91dGUyK3RjIGF0IDxmdHA6Ly9mdHAudHV4Lm9yZy9wdWIvbmV0L2lwLXJvdXRpbmcvPi4KKwkgIFRoYXQgcGFja2FnZSBhbHNvIGNvbnRhaW5zIHNvbWUgZG9jdW1lbnRhdGlvbjsgZm9yIG1vcmUsIGNoZWNrIG91dAorCSAgPGh0dHA6Ly9zbmFmdS5mcmVlZG9tLm9yZy9saW51eDIuMi9pcHJvdXRlLW5vdGVzLmh0bWw+LgorCisJICBUaGlzIFF1YWxpdHkgb2YgU2VydmljZSAoUW9TKSBzdXBwb3J0IHdpbGwgZW5hYmxlIHlvdSB0byB1c2UKKwkgIERpZmZlcmVudGlhdGVkIFNlcnZpY2VzIChkaWZmc2VydikgYW5kIFJlc291cmNlIFJlc2VydmF0aW9uIFByb3RvY29sCisJICAoUlNWUCkgb24geW91ciBMaW51eCByb3V0ZXIgaWYgeW91IGFsc28gc2F5IFkgdG8gIlFvUyBzdXBwb3J0IiwKKwkgICJQYWNrZXQgY2xhc3NpZmllciBBUEkiIGFuZCB0byBzb21lIGNsYXNzaWZpZXJzIGJlbG93LiBEb2N1bWVudGF0aW9uCisJICBhbmQgc29mdHdhcmUgaXMgYXQgPGh0dHA6Ly9kaWZmc2Vydi5zb3VyY2Vmb3JnZS5uZXQvPi4KKworCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIHRvICIvcHJvYyBmaWxlIHN5c3RlbSIgYmVsb3csIHlvdSB3aWxsIGJlIGFibGUKKwkgIHRvIHJlYWQgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHBhY2tldCBzY2hlZHVsZXJzIGZyb20gdGhlIGZpbGUKKwkgIC9wcm9jL25ldC9wc2NoZWQuCisKKwkgIFRoZSBhdmFpbGFibGUgc2NoZWR1bGVycyBhcmUgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOyB5b3UKKwkgIGNhbiBzYXkgWSB0byBhcyBtYW55IGFzIHlvdSBsaWtlLiBJZiB1bnN1cmUsIHNheSBOIG5vdy4KKwogY2hvaWNlCiAJcHJvbXB0ICJQYWNrZXQgc2NoZWR1bGVyIGNsb2NrIHNvdXJjZSIKIAlkZXBlbmRzIG9uIE5FVF9TQ0hFRApAQCAtNDQ5LDYgKzQ4NiwxOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVtX21ldGEuCiAKK2NvbmZpZyBORVRfRU1BVENIX1RFWFQKKwl0cmlzdGF0ZSAiVGV4dHNlYXJjaCIKKwlkZXBlbmRzIG9uIE5FVF9FTUFUQ0gKKwlzZWxlY3QgVEVYVFNFQVJDSAorCXNlbGVjdCBURVhUU0VBUkNIX0tNUAorCXNlbGVjdCBURVhUU0VBUkNIX0ZTTQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmUgYWJsdCB0byBjbGFzc2lmeSBwYWNrZXRzIGJhc2VkIG9uCisJICB0ZXh0c2VhcmNoIGNvbXBhcmlzb25zLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW1fdGV4dC4KKwogY29uZmlnIE5FVF9DTFNfQUNUCiAJYm9vbCAiUGFja2V0IEFDVElPTiIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBORVRfQ0xTICYmIE5FVF9RT1MKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9NYWtlZmlsZSBiL25ldC9zY2hlZC9NYWtlZmlsZQppbmRleCBlYjNmZTU4Li5lNDhkMGQ0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvTWFrZWZpbGUKKysrIGIvbmV0L3NjaGVkL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBvYmoteQk6PSBzY2hfZ2VuZXJpYy5vCiAKLW9iai0kKENPTkZJR19ORVRfU0NIRUQpCQkrPSBzY2hfYXBpLm8gc2NoX2ZpZm8ubworb2JqLSQoQ09ORklHX05FVF9TQ0hFRCkJCSs9IHNjaF9hcGkubyBzY2hfZmlmby5vIHNjaF9ibGFja2hvbGUubwogb2JqLSQoQ09ORklHX05FVF9DTFMpCQkrPSBjbHNfYXBpLm8KIG9iai0kKENPTkZJR19ORVRfQ0xTX0FDVCkJKz0gYWN0X2FwaS5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9QT0xJQ0UpCSs9IHBvbGljZS5vCkBAIC00MCwzICs0MCw0IEBACiBvYmotJChDT05GSUdfTkVUX0VNQVRDSF9OQllURSkJKz0gZW1fbmJ5dGUubwogb2JqLSQoQ09ORklHX05FVF9FTUFUQ0hfVTMyKQkrPSBlbV91MzIubwogb2JqLSQoQ09ORklHX05FVF9FTUFUQ0hfTUVUQSkJKz0gZW1fbWV0YS5vCitvYmotJChDT05GSUdfTkVUX0VNQVRDSF9URVhUKQkrPSBlbV90ZXh0Lm8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IDk1OTQyMDYuLjI0OWM2MTkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtNDM5LDYgKzQzOSw4IEBACiAKIAl0ID0gTkxNU0dfREFUQShubGgpOwogCXQtPnRjYV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJdC0+dGNhX19wYWQxID0gMDsKKwl0LT50Y2FfX3BhZDIgPSAwOwogCQogCXggPSAoc3RydWN0IHJ0YXR0ciopIHNrYi0+dGFpbDsKIAlSVEFfUFVUKHNrYiwgVENBX0FDVF9UQUIsIDAsIE5VTEwpOwpAQCAtNTgwLDYgKzU4Miw4IEBACiAJbmxoID0gTkxNU0dfUFVUKHNrYiwgcGlkLCBuLT5ubG1zZ19zZXEsIFJUTV9ERUxBQ1RJT04sIHNpemVvZigqdCkpOwogCXQgPSBOTE1TR19EQVRBKG5saCk7CiAJdC0+dGNhX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwl0LT50Y2FfX3BhZDEgPSAwOworCXQtPnRjYV9fcGFkMiA9IDA7CiAKIAl4ID0gKHN0cnVjdCBydGF0dHIgKikgc2tiLT50YWlsOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CkBAIC02ODcsNyArNjkxLDkgQEAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdCksIGZsYWdzKTsKIAl0ID0gTkxNU0dfREFUQShubGgpOwogCXQtPnRjYV9mYW1pbHkgPSBBRl9VTlNQRUM7Ci0JCisJdC0+dGNhX19wYWQxID0gMDsKKwl0LT50Y2FfX3BhZDIgPSAwOworCiAJeCA9IChzdHJ1Y3QgcnRhdHRyKikgc2tiLT50YWlsOwogCVJUQV9QVVQoc2tiLCBUQ0FfQUNUX1RBQiwgMCwgTlVMTCk7CiAKQEAgLTg0Miw2ICs4NDgsOCBAQAogCSAgICAgICAgICAgICAgICBjYi0+bmxoLT5ubG1zZ190eXBlLCBzaXplb2YoKnQpKTsKIAl0ID0gTkxNU0dfREFUQShubGgpOwogCXQtPnRjYV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJdC0+dGNhX19wYWQxID0gMDsKKwl0LT50Y2FfX3BhZDIgPSAwOwogCiAJeCA9IChzdHJ1Y3QgcnRhdHRyICopIHNrYi0+dGFpbDsKIAlSVEFfUFVUKHNrYiwgVENBX0FDVF9UQUIsIDAsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19hcGkuYyBiL25ldC9zY2hlZC9jbHNfYXBpLmMKaW5kZXggMTYxNmJmNS4uM2I1NzE0ZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19hcGkuYworKysgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCkBAIC0zMzEsNiArMzMxLDggQEAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdGNtKSwgZmxhZ3MpOwogCXRjbSA9IE5MTVNHX0RBVEEobmxoKTsKIAl0Y20tPnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJdGNtLT50Y21fX3BhZDEgPSAwOworCXRjbS0+dGNtX19wYWQxID0gMDsKIAl0Y20tPnRjbV9pZmluZGV4ID0gdHAtPnEtPmRldi0+aWZpbmRleDsKIAl0Y20tPnRjbV9wYXJlbnQgPSB0cC0+Y2xhc3NpZDsKIAl0Y20tPnRjbV9pbmZvID0gVENfSF9NQUtFKHRwLT5wcmlvLCB0cC0+cHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmggYi9uZXQvc2NoZWQvY2xzX3JzdnAuaAppbmRleCAyMzJmYjkxLi4wMDYxNjhkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JzdnAuaAorKysgYi9uZXQvc2NoZWQvY2xzX3JzdnAuaApAQCAtNjE4LDYgKzYxOCw3IEBACiAJcGluZm8ucHJvdG9jb2wgPSBzLT5wcm90b2NvbDsKIAlwaW5mby50dW5uZWxpZCA9IHMtPnR1bm5lbGlkOwogCXBpbmZvLnR1bm5lbGhkciA9IGYtPnR1bm5lbGhkcjsKKwlwaW5mby5wYWQgPSAwOwogCVJUQV9QVVQoc2tiLCBUQ0FfUlNWUF9QSU5GTywgc2l6ZW9mKHBpbmZvKSwgJnBpbmZvKTsKIAlpZiAoZi0+cmVzLmNsYXNzaWQpCiAJCVJUQV9QVVQoc2tiLCBUQ0FfUlNWUF9DTEFTU0lELCA0LCAmZi0+cmVzLmNsYXNzaWQpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX21ldGEuYyBiL25ldC9zY2hlZC9lbV9tZXRhLmMKaW5kZXggNDhiYjIzYy4uNTNkOThmOCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2VtX21ldGEuYworKysgYi9uZXQvc2NoZWQvZW1fbWV0YS5jCkBAIC0yMDUsMTEgKzIwNSw2IEBACiAJZHN0LT52YWx1ZSA9IHNrYi0+cHJvdG9jb2w7CiB9CiAKLU1FVEFfQ09MTEVDVE9SKGludF9zZWN1cml0eSkKLXsKLQlkc3QtPnZhbHVlID0gc2tiLT5zZWN1cml0eTsKLX0KLQogTUVUQV9DT0xMRUNUT1IoaW50X3BrdHR5cGUpCiB7CiAJZHN0LT52YWx1ZSA9IHNrYi0+cGt0X3R5cGU7CkBAIC01MjQsNyArNTE5LDYgQEAKIAkJW01FVEFfSUQoUkVBTERFVildCQk9IE1FVEFfRlVOQyhpbnRfcmVhbGRldiksCiAJCVtNRVRBX0lEKFBSSU9SSVRZKV0JCT0gTUVUQV9GVU5DKGludF9wcmlvcml0eSksCiAJCVtNRVRBX0lEKFBST1RPQ09MKV0JCT0gTUVUQV9GVU5DKGludF9wcm90b2NvbCksCi0JCVtNRVRBX0lEKFNFQ1VSSVRZKV0JCT0gTUVUQV9GVU5DKGludF9zZWN1cml0eSksCiAJCVtNRVRBX0lEKFBLVFRZUEUpXQkJPSBNRVRBX0ZVTkMoaW50X3BrdHR5cGUpLAogCQlbTUVUQV9JRChQS1RMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X3BrdGxlbiksCiAJCVtNRVRBX0lEKERBVEFMRU4pXQkJPSBNRVRBX0ZVTkMoaW50X2RhdGFsZW4pLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2VtX3RleHQuYyBiL25ldC9zY2hlZC9lbV90ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczODQwZAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9lbV90ZXh0LmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBuZXQvc2NoZWQvZW1fdGV4dC5jCVRleHRzZWFyY2ggZW1hdGNoCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoLmg+CisjaW5jbHVkZSA8bGludXgvdGNfZW1hdGNoL3RjX2VtX3RleHQuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorCitzdHJ1Y3QgdGV4dF9tYXRjaAoreworCXUxNgkJCWZyb21fb2Zmc2V0OworCXUxNgkJCXRvX29mZnNldDsKKwl1OAkJCWZyb21fbGF5ZXI7CisJdTgJCQl0b19sYXllcjsKKwlzdHJ1Y3QgdHNfY29uZmlnCSpjb25maWc7Cit9OworCisjZGVmaW5lIEVNX1RFWFRfUFJJVihtKSAoKHN0cnVjdCB0ZXh0X21hdGNoICopIChtKS0+ZGF0YSkKKworc3RhdGljIGludCBlbV90ZXh0X21hdGNoKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfZW1hdGNoICptLAorCQkJIHN0cnVjdCB0Y2ZfcGt0X2luZm8gKmluZm8pCit7CisJc3RydWN0IHRleHRfbWF0Y2ggKnRtID0gRU1fVEVYVF9QUklWKG0pOworCWludCBmcm9tLCB0bzsKKwlzdHJ1Y3QgdHNfc3RhdGUgc3RhdGU7CisKKwlmcm9tID0gdGNmX2dldF9iYXNlX3B0cihza2IsIHRtLT5mcm9tX2xheWVyKSAtIHNrYi0+ZGF0YTsKKwlmcm9tICs9IHRtLT5mcm9tX29mZnNldDsKKworCXRvID0gdGNmX2dldF9iYXNlX3B0cihza2IsIHRtLT50b19sYXllcikgLSBza2ItPmRhdGE7CisJdG8gKz0gdG0tPnRvX29mZnNldDsKKworCXJldHVybiBza2JfZmluZF90ZXh0KHNrYiwgZnJvbSwgdG8sIHRtLT5jb25maWcsICZzdGF0ZSkgIT0gVUlOVF9NQVg7Cit9CisKK3N0YXRpYyBpbnQgZW1fdGV4dF9jaGFuZ2Uoc3RydWN0IHRjZl9wcm90byAqdHAsIHZvaWQgKmRhdGEsIGludCBsZW4sCisJCQkgIHN0cnVjdCB0Y2ZfZW1hdGNoICptKQoreworCXN0cnVjdCB0ZXh0X21hdGNoICp0bTsKKwlzdHJ1Y3QgdGNmX2VtX3RleHQgKmNvbmYgPSBkYXRhOworCXN0cnVjdCB0c19jb25maWcgKnRzX2NvbmY7CisJaW50IGZsYWdzID0gMDsKKworCXByaW50aygiQ29uZmlndXJpbmcgdGV4dDogJXMgZnJvbSAlZDolZCB0byAlZDolZCBsZW4gJWRcbiIsIGNvbmYtPmFsZ28sIGNvbmYtPmZyb21fb2Zmc2V0LAorCSAgICBjb25mLT5mcm9tX2xheWVyLCBjb25mLT50b19vZmZzZXQsIGNvbmYtPnRvX2xheWVyLCBjb25mLT5wYXR0ZXJuX2xlbik7CisKKwlpZiAobGVuIDwgc2l6ZW9mKCpjb25mKSB8fCBsZW4gPCAoc2l6ZW9mKCpjb25mKSArIGNvbmYtPnBhdHRlcm5fbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29uZi0+ZnJvbV9sYXllciA+IGNvbmYtPnRvX2xheWVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb25mLT5mcm9tX2xheWVyID09IGNvbmYtPnRvX2xheWVyICYmCisJICAgIGNvbmYtPmZyb21fb2Zmc2V0ID4gY29uZi0+dG9fb2Zmc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworcmV0cnk6CisJdHNfY29uZiA9IHRleHRzZWFyY2hfcHJlcGFyZShjb25mLT5hbGdvLCAodTggKikgY29uZiArIHNpemVvZigqY29uZiksCisJCQkJICAgICBjb25mLT5wYXR0ZXJuX2xlbiwgR0ZQX0tFUk5FTCwgZmxhZ3MpOworCisJaWYgKGZsYWdzICYgVFNfQVVUT0xPQUQpCisJCXJ0bmxfbG9jaygpOworCisJaWYgKElTX0VSUih0c19jb25mKSkgeworCQlpZiAoUFRSX0VSUih0c19jb25mKSA9PSAtRU5PRU5UICYmICEoZmxhZ3MgJiBUU19BVVRPTE9BRCkpIHsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlmbGFncyB8PSBUU19BVVRPTE9BRDsKKwkJCWdvdG8gcmV0cnk7CisJCX0gZWxzZQorCQkJcmV0dXJuIFBUUl9FUlIodHNfY29uZik7CisJfSBlbHNlIGlmIChmbGFncyAmIFRTX0FVVE9MT0FEKSB7CisJCXRleHRzZWFyY2hfZGVzdHJveSh0c19jb25mKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJdG0gPSBrbWFsbG9jKHNpemVvZigqdG0pLCBHRlBfS0VSTkVMKTsKKwlpZiAodG0gPT0gTlVMTCkgeworCQl0ZXh0c2VhcmNoX2Rlc3Ryb3kodHNfY29uZik7CisJCXJldHVybiAtRU5PQlVGUzsKKwl9CisKKwl0bS0+ZnJvbV9vZmZzZXQgPSBjb25mLT5mcm9tX29mZnNldDsKKwl0bS0+dG9fb2Zmc2V0ICAgPSBjb25mLT50b19vZmZzZXQ7CisJdG0tPmZyb21fbGF5ZXIgID0gY29uZi0+ZnJvbV9sYXllcjsKKwl0bS0+dG9fbGF5ZXIgICAgPSBjb25mLT50b19sYXllcjsKKwl0bS0+Y29uZmlnICAgICAgPSB0c19jb25mOworCisJbS0+ZGF0YWxlbiA9IHNpemVvZigqdG0pOworCW0tPmRhdGEgPSAodW5zaWduZWQgbG9uZykgdG07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW1fdGV4dF9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgdGNmX2VtYXRjaCAqbSkKK3sKKwl0ZXh0c2VhcmNoX2Rlc3Ryb3koRU1fVEVYVF9QUklWKG0pLT5jb25maWcpOworfQorCitzdGF0aWMgaW50IGVtX3RleHRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNmX2VtYXRjaCAqbSkKK3sKKwlzdHJ1Y3QgdGV4dF9tYXRjaCAqdG0gPSBFTV9URVhUX1BSSVYobSk7CisJc3RydWN0IHRjZl9lbV90ZXh0IGNvbmY7CisKKwlzdHJuY3B5KGNvbmYuYWxnbywgdG0tPmNvbmZpZy0+b3BzLT5uYW1lLCBzaXplb2YoY29uZi5hbGdvKSAtIDEpOworCWNvbmYuZnJvbV9vZmZzZXQgPSB0bS0+ZnJvbV9vZmZzZXQ7CisJY29uZi50b19vZmZzZXQgPSB0bS0+dG9fb2Zmc2V0OworCWNvbmYuZnJvbV9sYXllciA9IHRtLT5mcm9tX2xheWVyOworCWNvbmYudG9fbGF5ZXIgPSB0bS0+dG9fbGF5ZXI7CisJY29uZi5wYXR0ZXJuX2xlbiA9IHRleHRzZWFyY2hfZ2V0X3BhdHRlcm5fbGVuKHRtLT5jb25maWcpOworCWNvbmYucGFkID0gMDsKKworCVJUQV9QVVRfTk9IRFIoc2tiLCBzaXplb2YoY29uZiksICZjb25mKTsKKwlSVEFfQVBQRU5EKHNrYiwgY29uZi5wYXR0ZXJuX2xlbiwgdGV4dHNlYXJjaF9nZXRfcGF0dGVybih0bS0+Y29uZmlnKSk7CisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXJldHVybiAtMTsKK30JCQorCitzdGF0aWMgc3RydWN0IHRjZl9lbWF0Y2hfb3BzIGVtX3RleHRfb3BzID0geworCS5raW5kCSAgPSBUQ0ZfRU1fVEVYVCwKKwkuY2hhbmdlCSAgPSBlbV90ZXh0X2NoYW5nZSwKKwkubWF0Y2gJICA9IGVtX3RleHRfbWF0Y2gsCisJLmRlc3Ryb3kgID0gZW1fdGV4dF9kZXN0cm95LAorCS5kdW1wCSAgPSBlbV90ZXh0X2R1bXAsCisJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKKwkubGluawkgID0gTElTVF9IRUFEX0lOSVQoZW1fdGV4dF9vcHMubGluaykKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW1fdGV4dCh2b2lkKQoreworCXJldHVybiB0Y2ZfZW1fcmVnaXN0ZXIoJmVtX3RleHRfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZW1fdGV4dCh2b2lkKSAKK3sKKwl0Y2ZfZW1fdW5yZWdpc3RlcigmZW1fdGV4dF9vcHMpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfZW1fdGV4dCk7Cittb2R1bGVfZXhpdChleGl0X2VtX3RleHQpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKaW5kZXggOTdjMWM3NS4uYjlhMDY5YSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hcGkuYworKysgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCkBAIC0zOTksMTAgKzM5OSw4IEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgcnRhdHRyICpraW5kID0gdGNhW1RDQV9LSU5ELTFdOwotCXZvaWQgKnAgPSBOVUxMOwogCXN0cnVjdCBRZGlzYyAqc2NoOwogCXN0cnVjdCBRZGlzY19vcHMgKm9wczsKLQlpbnQgc2l6ZTsKIAogCW9wcyA9IHFkaXNjX2xvb2t1cF9vcHMoa2luZCk7CiAjaWZkZWYgQ09ORklHX0tNT0QKQEAgLTQzNyw2NCArNDM1LDU1IEBACiAJaWYgKG9wcyA9PSBOVUxMKQogCQlnb3RvIGVycl9vdXQ7CiAKLQkvKiBlbnN1cmUgdGhhdCB0aGUgUWRpc2MgYW5kIHRoZSBwcml2YXRlIGRhdGEgYXJlIDMyLWJ5dGUgYWxpZ25lZCAqLwotCXNpemUgPSAoKHNpemVvZigqc2NoKSArIFFESVNDX0FMSUdOX0NPTlNUKSAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2l6ZSArPSBvcHMtPnByaXZfc2l6ZSArIFFESVNDX0FMSUdOX0NPTlNUOwotCi0JcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JZXJyID0gLUVOT0JVRlM7Ci0JaWYgKCFwKQorCXNjaCA9IHFkaXNjX2FsbG9jKGRldiwgb3BzKTsKKwlpZiAoSVNfRVJSKHNjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihzY2gpOwogCQlnb3RvIGVycl9vdXQyOwotCW1lbXNldChwLCAwLCBzaXplKTsKLQlzY2ggPSAoc3RydWN0IFFkaXNjICopKCgodW5zaWduZWQgbG9uZylwICsgUURJU0NfQUxJR05fQ09OU1QpCi0JICAgICAgICAgICAgICAgICAgICAgICAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2NoLT5wYWRkZWQgPSAoY2hhciAqKXNjaCAtIChjaGFyICopcDsKKwl9CiAKLQlJTklUX0xJU1RfSEVBRCgmc2NoLT5saXN0KTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZzY2gtPnEpOwotCi0JaWYgKGhhbmRsZSA9PSBUQ19IX0lOR1JFU1MpCisJaWYgKGhhbmRsZSA9PSBUQ19IX0lOR1JFU1MpIHsKIAkJc2NoLT5mbGFncyB8PSBUQ1FfRl9JTkdSRVNTOwotCi0Jc2NoLT5vcHMgPSBvcHM7Ci0Jc2NoLT5lbnF1ZXVlID0gb3BzLT5lbnF1ZXVlOwotCXNjaC0+ZGVxdWV1ZSA9IG9wcy0+ZGVxdWV1ZTsKLQlzY2gtPmRldiA9IGRldjsKLQlkZXZfaG9sZChkZXYpOwotCWF0b21pY19zZXQoJnNjaC0+cmVmY250LCAxKTsKLQlzY2gtPnN0YXRzX2xvY2sgPSAmZGV2LT5xdWV1ZV9sb2NrOwotCWlmIChoYW5kbGUgPT0gMCkgeworCQloYW5kbGUgPSBUQ19IX01BS0UoVENfSF9JTkdSRVNTLCAwKTsKKwl9IGVsc2UgaWYgKGhhbmRsZSA9PSAwKSB7CiAJCWhhbmRsZSA9IHFkaXNjX2FsbG9jX2hhbmRsZShkZXYpOwogCQllcnIgPSAtRU5PTUVNOwogCQlpZiAoaGFuZGxlID09IDApCiAJCQlnb3RvIGVycl9vdXQzOwogCX0KIAotCWlmIChoYW5kbGUgPT0gVENfSF9JTkdSRVNTKQotICAgICAgICAgICAgICAgIHNjaC0+aGFuZGxlID1UQ19IX01BS0UoVENfSF9JTkdSRVNTLCAwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNjaC0+aGFuZGxlID0gaGFuZGxlOworCXNjaC0+aGFuZGxlID0gaGFuZGxlOwogCiAJaWYgKCFvcHMtPmluaXQgfHwgKGVyciA9IG9wcy0+aW5pdChzY2gsIHRjYVtUQ0FfT1BUSU9OUy0xXSkpID09IDApIHsKKyNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgorCQlpZiAodGNhW1RDQV9SQVRFLTFdKSB7CisJCQllcnIgPSBnZW5fbmV3X2VzdGltYXRvcigmc2NoLT5ic3RhdHMsICZzY2gtPnJhdGVfZXN0LAorCQkJCQkJc2NoLT5zdGF0c19sb2NrLAorCQkJCQkJdGNhW1RDQV9SQVRFLTFdKTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKgorCQkJCSAqIEFueSBicm9rZW4gcWRpc2NzIHRoYXQgd291bGQgcmVxdWlyZQorCQkJCSAqIGEgb3BzLT5yZXNldCgpIGhlcmU/IFRoZSBxZGlzYyB3YXMgbmV2ZXIKKwkJCQkgKiBpbiBhY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeS4KKwkJCQkgKi8KKwkJCQlpZiAob3BzLT5kZXN0cm95KQorCQkJCQlvcHMtPmRlc3Ryb3koc2NoKTsKKwkJCQlnb3RvIGVycl9vdXQzOworCQkJfQorCQl9CisjZW5kaWYKIAkJcWRpc2NfbG9ja190cmVlKGRldik7CiAJCWxpc3RfYWRkX3RhaWwoJnNjaC0+bGlzdCwgJmRldi0+cWRpc2NfbGlzdCk7CiAJCXFkaXNjX3VubG9ja190cmVlKGRldik7CiAKLSNpZmRlZiBDT05GSUdfTkVUX0VTVElNQVRPUgotCQlpZiAodGNhW1RDQV9SQVRFLTFdKQotCQkJZ2VuX25ld19lc3RpbWF0b3IoJnNjaC0+YnN0YXRzLCAmc2NoLT5yYXRlX2VzdCwKLQkJCQlzY2gtPnN0YXRzX2xvY2ssIHRjYVtUQ0FfUkFURS0xXSk7Ci0jZW5kaWYKIAkJcmV0dXJuIHNjaDsKIAl9CiBlcnJfb3V0MzoKIAlkZXZfcHV0KGRldik7CisJa2ZyZWUoKGNoYXIgKikgc2NoIC0gc2NoLT5wYWRkZWQpOwogZXJyX291dDI6CiAJbW9kdWxlX3B1dChvcHMtPm93bmVyKTsKIGVycl9vdXQ6CiAJKmVycnAgPSBlcnI7Ci0JaWYgKHApCi0JCWtmcmVlKHApOwogCXJldHVybiBOVUxMOwogfQogCkBAIC03NzAsNiArNzU5LDggQEAKIAlubGggPSBOTE1TR19ORVcoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqdGNtKSwgZmxhZ3MpOwogCXRjbSA9IE5MTVNHX0RBVEEobmxoKTsKIAl0Y20tPnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJdGNtLT50Y21fX3BhZDEgPSAwOworCXRjbS0+dGNtX19wYWQyID0gMDsKIAl0Y20tPnRjbV9pZmluZGV4ID0gcS0+ZGV2LT5pZmluZGV4OwogCXRjbS0+dGNtX3BhcmVudCA9IGNsaWQ7CiAJdGNtLT50Y21faGFuZGxlID0gcS0+aGFuZGxlOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9ibGFja2hvbGUuYyBiL25ldC9zY2hlZC9zY2hfYmxhY2tob2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmMGI4MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zY2hlZC9zY2hfYmxhY2tob2xlLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIG5ldC9zY2hlZC9zY2hfYmxhY2tob2xlLmMJQmxhY2sgaG9sZSBxdWV1ZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICoKKyAqIE5vdGU6IFF1YW50dW0gdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorCitzdGF0aWMgaW50IGJsYWNraG9sZV9lbnF1ZXVlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXFkaXNjX2Ryb3Aoc2tiLCBzY2gpOworCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmJsYWNraG9sZV9kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IFFkaXNjX29wcyBibGFja2hvbGVfcWRpc2Nfb3BzID0geworCS5pZAkJPSAiYmxhY2tob2xlIiwKKwkucHJpdl9zaXplCT0gMCwKKwkuZW5xdWV1ZQk9IGJsYWNraG9sZV9lbnF1ZXVlLAorCS5kZXF1ZXVlCT0gYmxhY2tob2xlX2RlcXVldWUsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmxhY2tob2xlX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3FkaXNjKCZibGFja2hvbGVfcWRpc2Nfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGJsYWNraG9sZV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfcWRpc2MoJmJsYWNraG9sZV9xZGlzY19vcHMpOworfQorCittb2R1bGVfaW5pdChibGFja2hvbGVfbW9kdWxlX2luaXQpCittb2R1bGVfZXhpdChibGFja2hvbGVfbW9kdWxlX2V4aXQpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfY2JxLmMgYi9uZXQvc2NoZWQvc2NoX2NicS5jCmluZGV4IGQ0M2UzYjguLjA5NDUzZjkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfY2JxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9jYnEuYwpAQCAtMTUyOCw2ICsxNTI4LDcgQEAKIAogCW9wdC5zdHJhdGVneSA9IGNsLT5vdmxfc3RyYXRlZ3k7CiAJb3B0LnByaW9yaXR5MiA9IGNsLT5wcmlvcml0eTIrMTsKKwlvcHQucGFkID0gMDsKIAlvcHQucGVuYWx0eSA9IChjbC0+cGVuYWx0eSoxMDAwKS9IWjsKIAlSVEFfUFVUKHNrYiwgVENBX0NCUV9PVkxfU1RSQVRFR1ksIHNpemVvZihvcHQpLCAmb3B0KTsKIAlyZXR1cm4gc2tiLT5sZW47CkBAIC0xNTYzLDYgKzE1NjQsOCBAQAogCiAJaWYgKGNsLT5wb2xpY2UpIHsKIAkJb3B0LnBvbGljZSA9IGNsLT5wb2xpY2U7CisJCW9wdC5fX3JlczEgPSAwOworCQlvcHQuX19yZXMyID0gMDsKIAkJUlRBX1BVVChza2IsIFRDQV9DQlFfUE9MSUNFLCBzaXplb2Yob3B0KSwgJm9wdCk7CiAJfQogCXJldHVybiBza2ItPmxlbjsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jIGIvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMKaW5kZXggNzY4M2IzNC4uNzNlMjE4ZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMKQEAgLTM5NSwyNCArMzk1LDIzIEBACiAJLm93bmVyCQk9CVRISVNfTU9EVUxFLAogfTsKIAotc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKQorc3RydWN0IFFkaXNjICpxZGlzY19hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMpCiB7CiAJdm9pZCAqcDsKIAlzdHJ1Y3QgUWRpc2MgKnNjaDsKLQlpbnQgc2l6ZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgZXJyID0gLUVOT0JVRlM7CiAKIAkvKiBlbnN1cmUgdGhhdCB0aGUgUWRpc2MgYW5kIHRoZSBwcml2YXRlIGRhdGEgYXJlIDMyLWJ5dGUgYWxpZ25lZCAqLwotCXNpemUgPSAoKHNpemVvZigqc2NoKSArIFFESVNDX0FMSUdOX0NPTlNUKSAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2l6ZSArPSBvcHMtPnByaXZfc2l6ZSArIFFESVNDX0FMSUdOX0NPTlNUOworCXNpemUgPSBRRElTQ19BTElHTihzaXplb2YoKnNjaCkpOworCXNpemUgKz0gb3BzLT5wcml2X3NpemUgKyAoUURJU0NfQUxJR05UTyAtIDEpOwogCiAJcCA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwKQotCQlyZXR1cm4gTlVMTDsKKwkJZ290byBlcnJvdXQ7CiAJbWVtc2V0KHAsIDAsIHNpemUpOwotCi0Jc2NoID0gKHN0cnVjdCBRZGlzYyAqKSgoKHVuc2lnbmVkIGxvbmcpcCArIFFESVNDX0FMSUdOX0NPTlNUKSAKLQkJCSAgICAgICAmIH5RRElTQ19BTElHTl9DT05TVCk7Ci0Jc2NoLT5wYWRkZWQgPSAoY2hhciAqKXNjaCAtIChjaGFyICopcDsKKwlzY2ggPSAoc3RydWN0IFFkaXNjICopIFFESVNDX0FMSUdOKCh1bnNpZ25lZCBsb25nKSBwKTsKKwlzY2gtPnBhZGRlZCA9IChjaGFyICopIHNjaCAtIChjaGFyICopIHA7CiAKIAlJTklUX0xJU1RfSEVBRCgmc2NoLT5saXN0KTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzY2gtPnEpOwpAQCAtNDIzLDExICs0MjIsMjQgQEAKIAlkZXZfaG9sZChkZXYpOwogCXNjaC0+c3RhdHNfbG9jayA9ICZkZXYtPnF1ZXVlX2xvY2s7CiAJYXRvbWljX3NldCgmc2NoLT5yZWZjbnQsIDEpOworCisJcmV0dXJuIHNjaDsKK2Vycm91dDoKKwlyZXR1cm4gRVJSX1BUUigtZXJyKTsKK30KKworc3RydWN0IFFkaXNjICogcWRpc2NfY3JlYXRlX2RmbHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IFFkaXNjX29wcyAqb3BzKQoreworCXN0cnVjdCBRZGlzYyAqc2NoOworCQorCXNjaCA9IHFkaXNjX2FsbG9jKGRldiwgb3BzKTsKKwlpZiAoSVNfRVJSKHNjaCkpCisJCWdvdG8gZXJyb3V0OworCiAJaWYgKCFvcHMtPmluaXQgfHwgb3BzLT5pbml0KHNjaCwgTlVMTCkgPT0gMCkKIAkJcmV0dXJuIHNjaDsKIAotCWRldl9wdXQoZGV2KTsKLQlrZnJlZShwKTsKK2Vycm91dDoKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNTkxLDYgKzYwMyw3IEBACiBFWFBPUlRfU1lNQk9MKG5vb3BfcWRpc2MpOwogRVhQT1JUX1NZTUJPTChub29wX3FkaXNjX29wcyk7CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2NyZWF0ZV9kZmx0KTsKK0VYUE9SVF9TWU1CT0wocWRpc2NfYWxsb2MpOwogRVhQT1JUX1NZTUJPTChxZGlzY19kZXN0cm95KTsKIEVYUE9SVF9TWU1CT0wocWRpc2NfcmVzZXQpOwogRVhQT1JUX1NZTUJPTChxZGlzY19yZXN0YXJ0KTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcmVkLmMgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCmluZGV4IDY2NGQwZTQuLjc4NDVkMDQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcmVkLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9yZWQuYwpAQCAtMzg1LDcgKzM4NSw3IEBACiAJbWVtY3B5KHEtPlN0YWIsIFJUQV9EQVRBKHRiW1RDQV9SRURfU1RBQi0xXSksIDI1Nik7CiAKIAlxLT5xY291bnQgPSAtMTsKLQlpZiAoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA9PSAwKQorCWlmIChza2JfcXVldWVfZW1wdHkoJnNjaC0+cSkpCiAJCVBTQ0hFRF9TRVRfUEFTVFBFUkZFQ1QocS0+cWlkbGVzdGFydCk7CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9hc3NvY2lvbGEuYyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCmluZGV4IDdhZTZhYTcuLjViMjRhZTAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2Fzc29jaW9sYS5jCisrKyBiL25ldC9zY3RwL2Fzc29jaW9sYS5jCkBAIC03MSw3ICs3MSw3IEBACiAJCQkJCSAgY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICBzY3RwX3Njb3BlX3Qgc2NvcGUsCi0JCQkJCSAgaW50IGdmcCkKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3NvY2sgKnNwOwogCWludCBpOwpAQCAtMjAzLDcgKzIwMyw3IEBACiAJICovCiAJYXNvYy0+YWRkaXBfc2VyaWFsID0gYXNvYy0+Yy5pbml0aWFsX3RzbjsKIAotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFzb2MtPmFkZGlwX2NodW5rcyk7CisJSU5JVF9MSVNUX0hFQUQoJmFzb2MtPmFkZGlwX2NodW5rX2xpc3QpOwogCiAJLyogTWFrZSBhbiBlbXB0eSBsaXN0IG9mIHJlbW90ZSB0cmFuc3BvcnQgYWRkcmVzc2VzLiAgKi8KIAlJTklUX0xJU1RfSEVBRCgmYXNvYy0+cGVlci50cmFuc3BvcnRfYWRkcl9saXN0KTsKQEAgLTI3Miw3ICsyNzIsOCBAQAogLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgYXNzb2NpYXRpb24gKi8KIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX2Fzc29jaWF0aW9uX25ldyhjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCiAJCQkJCSBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSBzY3RwX3Njb3BlX3Qgc2NvcGUsIGludCBnZnApCisJCQkJCSBzY3RwX3Njb3BlX3Qgc2NvcGUsCisJCQkJCSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOwogCkBAIC00NzgsNyArNDc5LDcgQEAKIC8qIEFkZCBhIHRyYW5zcG9ydCBhZGRyZXNzIHRvIGFuIGFzc29jaWF0aW9uLiAgKi8KIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF9hc3NvY19hZGRfcGVlcihzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkJICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICphZGRyLAotCQkJCQkgICBjb25zdCBpbnQgZ2ZwLAorCQkJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAogCQkJCQkgICBjb25zdCBpbnQgcGVlcl9zdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnBlZXI7CkBAIC0xMjI5LDcgKzEyMzAsOCBAQAogLyogQnVpbGQgdGhlIGJpbmQgYWRkcmVzcyBsaXN0IGZvciB0aGUgYXNzb2NpYXRpb24gYmFzZWQgb24gaW5mbyBmcm9tIHRoZQogICogbG9jYWwgZW5kcG9pbnQgYW5kIHRoZSByZW1vdGUgcGVlci4KICAqLwotaW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBpbnQgZ2ZwKQoraW50IHNjdHBfYXNzb2Nfc2V0X2JpbmRfYWRkcl9mcm9tX2VwKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAorCQkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzY3RwX3Njb3BlX3Qgc2NvcGU7CiAJaW50IGZsYWdzOwpAQCAtMTI1MSw3ICsxMjUzLDggQEAKIAogLyogQnVpbGQgdGhlIGFzc29jaWF0aW9uJ3MgYmluZCBhZGRyZXNzIGxpc3QgZnJvbSB0aGUgY29va2llLiAgKi8KIGludCBzY3RwX2Fzc29jX3NldF9iaW5kX2FkZHJfZnJvbV9jb29raWUoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCi0JCQkJCSBzdHJ1Y3Qgc2N0cF9jb29raWUgKmNvb2tpZSwgaW50IGdmcCkKKwkJCQkJIHN0cnVjdCBzY3RwX2Nvb2tpZSAqY29va2llLAorCQkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlpbnQgdmFyX3NpemUyID0gbnRvaHMoY29va2llLT5wZWVyX2luaXQtPmNodW5rX2hkci5sZW5ndGgpOwogCWludCB2YXJfc2l6ZTMgPSBjb29raWUtPnJhd19hZGRyX2xpc3RfbGVuOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvYmluZF9hZGRyLmMgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwppbmRleCBmOTBlYWRmLi5mNzE1NDk3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9iaW5kX2FkZHIuYworKysgYi9uZXQvc2N0cC9iaW5kX2FkZHIuYwpAQCAtNTMsNyArNTMsOCBAQAogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgaW50ZXJuYWwgaGVscGVycy4gKi8KIHN0YXRpYyBpbnQgc2N0cF9jb3B5X29uZV9hZGRyKHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqLCB1bmlvbiBzY3RwX2FkZHIgKiwKLQkJCSAgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgaW50IGdmcCwgaW50IGZsYWdzKTsKKwkJCSAgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCwKKwkJCSAgICAgIGludCBmbGFncyk7CiBzdGF0aWMgdm9pZCBzY3RwX2JpbmRfYWRkcl9jbGVhbihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKik7CiAKIC8qIEZpcnN0IExldmVsIEFic3RyYWN0aW9ucy4gKi8KQEAgLTYzLDcgKzY0LDggQEAKICAqLwogaW50IHNjdHBfYmluZF9hZGRyX2NvcHkoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LCAKIAkJCWNvbnN0IHN0cnVjdCBzY3RwX2JpbmRfYWRkciAqc3JjLAotCQkJc2N0cF9zY29wZV90IHNjb3BlLCBpbnQgZ2ZwLCBpbnQgZmxhZ3MpCisJCQlzY3RwX3Njb3BlX3Qgc2NvcGUsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsCisJCQlpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNjdHBfc29ja2FkZHJfZW50cnkgKmFkZHI7CiAJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwpAQCAtMTQ0LDcgKzE0Niw3IEBACiAKIC8qIEFkZCBhbiBhZGRyZXNzIHRvIHRoZSBiaW5kIGFkZHJlc3MgbGlzdCBpbiB0aGUgU0NUUF9iaW5kX2FkZHIgc3RydWN0dXJlLiAqLwogaW50IHNjdHBfYWRkX2JpbmRfYWRkcihzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCB1bmlvbiBzY3RwX2FkZHIgKm5ldywKLQkJICAgICAgIGludCBnZnApCisJCSAgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOwogCkBAIC0xOTcsNyArMTk5LDggQEAKICAqIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGxlbmd0aC4KICAqLwogdW5pb24gc2N0cF9wYXJhbXMgc2N0cF9iaW5kX2FkZHJzX3RvX3Jhdyhjb25zdCBzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLAotCQkJCQkgaW50ICphZGRyc19sZW4sIGludCBnZnApCisJCQkJCSBpbnQgKmFkZHJzX2xlbiwKKwkJCQkJIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJdW5pb24gc2N0cF9wYXJhbXMgYWRkcnBhcm1zOwogCXVuaW9uIHNjdHBfcGFyYW1zIHJldHZhbDsKQEAgLTI0OSw3ICsyNTIsNyBAQAogICogYWRkcmVzcyBwYXJhbWV0ZXJzKS4KICAqLwogaW50IHNjdHBfcmF3X3RvX2JpbmRfYWRkcnMoc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwgX191OCAqcmF3X2FkZHJfbGlzdCwKLQkJCSAgIGludCBhZGRyc19sZW4sIF9fdTE2IHBvcnQsIGludCBnZnApCisJCQkgICBpbnQgYWRkcnNfbGVuLCBfX3UxNiBwb3J0LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXVuaW9uIHNjdHBfYWRkcl9wYXJhbSAqcmF3YWRkcjsKIAlzdHJ1Y3Qgc2N0cF9wYXJhbWhkciAqcGFyYW07CkBAIC0zNDcsNyArMzUwLDggQEAKIC8qIENvcHkgb3V0IGFkZHJlc3NlcyBmcm9tIHRoZSBnbG9iYWwgbG9jYWwgYWRkcmVzcyBsaXN0LiAqLwogc3RhdGljIGludCBzY3RwX2NvcHlfb25lX2FkZHIoc3RydWN0IHNjdHBfYmluZF9hZGRyICpkZXN0LCAKIAkJCSAgICAgIHVuaW9uIHNjdHBfYWRkciAqYWRkciwKLQkJCSAgICAgIHNjdHBfc2NvcGVfdCBzY29wZSwgaW50IGdmcCwgaW50IGZsYWdzKQorCQkJICAgICAgc2N0cF9zY29wZV90IHNjb3BlLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAorCQkJICAgICAgaW50IGZsYWdzKQogewogCWludCBlcnJvciA9IDA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2NodW5rLmMgYi9uZXQvc2N0cC9jaHVuay5jCmluZGV4IDBjMmFiNzguLjYxZGEyOTMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2NodW5rLmMKKysrIGIvbmV0L3NjdHAvY2h1bmsuYwpAQCAtNjIsNyArNjIsNyBAQAogfQogCiAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkYXRhbXNnLiAqLwotU0NUUF9TVEFUSUMgc3RydWN0IHNjdHBfZGF0YW1zZyAqc2N0cF9kYXRhbXNnX25ldyhpbnQgZ2ZwKQorU0NUUF9TVEFUSUMgc3RydWN0IHNjdHBfZGF0YW1zZyAqc2N0cF9kYXRhbXNnX25ldyh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZzsKIAltc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2N0cF9kYXRhbXNnKSwgZ2ZwKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMgYi9uZXQvc2N0cC9lbmRwb2ludG9sYS5jCmluZGV4IDJlYzAzMjAuLmU0N2FjMGQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2VuZHBvaW50b2xhLmMKKysrIGIvbmV0L3NjdHAvZW5kcG9pbnRvbGEuYwpAQCAtNjcsNyArNjcsOCBAQAogICogSW5pdGlhbGl6ZSB0aGUgYmFzZSBmaWVsZHMgb2YgdGhlIGVuZHBvaW50IHN0cnVjdHVyZS4KICAqLwogc3RhdGljIHN0cnVjdCBzY3RwX2VuZHBvaW50ICpzY3RwX2VuZHBvaW50X2luaXQoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAotCQkJCQkJc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQorCQkJCQkJc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOwogCW1lbXNldChlcCwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2VuZHBvaW50KSk7CkBAIC0xMDIsOSArMTAzLDkgQEAKIAkvKiBTZXQgdXAgdGhlIGJhc2UgdGltZW91dCBpbmZvcm1hdGlvbi4gICovCiAJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9OT05FXSA9IDA7CiAJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9DT09LSUVdID0KLQkJU0NUUF9ERUZBVUxUX1RJTUVPVVRfVDFfQ09PS0lFOworCQltc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9faW5pdGlhbCk7CiAJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9UMV9JTklUXSA9Ci0JCVNDVFBfREVGQVVMVF9USU1FT1VUX1QxX0lOSVQ7CisJCW1zZWNzX3RvX2ppZmZpZXMoc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsKTsKIAllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QyX1NIVVRET1dOXSA9CiAJCW1zZWNzX3RvX2ppZmZpZXMoc3AtPnJ0b2luZm8uc3J0b19pbml0aWFsKTsKIAllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1QzX1JUWF0gPSAwOwpAQCAtMTE3LDEyICsxMTgsOSBAQAogICAgICAgICBlcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1Q1X1NIVVRET1dOX0dVQVJEXQogCQk9IDUgKiBtc2Vjc190b19qaWZmaWVzKHNwLT5ydG9pbmZvLnNydG9fbWF4KTsKIAotCWVwLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfSEVBUlRCRUFUXSA9Ci0JCVNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVDsKLQllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0tdID0KLQkJU0NUUF9ERUZBVUxUX1RJTUVPVVRfU0FDSzsKLQllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRV0gPQotCQlzcC0+YXV0b2Nsb3NlICogSFo7CisJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9IRUFSVEJFQVRdID0gMDsKKwllcC0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX1NBQ0tdID0gc2N0cF9zYWNrX3RpbWVvdXQ7CisJZXAtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9BVVRPQ0xPU0VdID0gc3AtPmF1dG9jbG9zZSAqIEhaOwogCiAJLyogVXNlIFNDVFAgc3BlY2lmaWMgc2VuZCBidWZmZXIgc3BhY2UgcXVldWVzLiAgKi8KIAllcC0+c25kYnVmX3BvbGljeSA9IHNjdHBfc25kYnVmX3BvbGljeTsKQEAgLTE0MCw3ICsxMzgsOCBAQAogLyogQ3JlYXRlIGEgc2N0cF9lbmRwb2ludCB3aXRoIGFsbCB0aGF0IGJvcmluZyBzdHVmZiBpbml0aWFsaXplZC4KICAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggbWVtb3J5LgogICovCi1zdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqc2N0cF9lbmRwb2ludF9uZXcoc3RydWN0IHNvY2sgKnNrLCBpbnQgZ2ZwKQorc3RydWN0IHNjdHBfZW5kcG9pbnQgKnNjdHBfZW5kcG9pbnRfbmV3KHN0cnVjdCBzb2NrICpzaywKKwkJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXA7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IDMzOWY3YWMuLjVlMDg1ZTAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtMTE1LDYgKzExNSwxNyBAQAogCWF0b21pY19hZGQoc2l6ZW9mKHN0cnVjdCBzY3RwX2NodW5rKSwmc2stPnNrX3JtZW1fYWxsb2MpOwogfQogCitzdHJ1Y3Qgc2N0cF9pbnB1dF9jYiB7CisJdW5pb24geworCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKKyNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJCXN0cnVjdCBpbmV0Nl9za2JfcGFybQloNjsKKyNlbmRpZgorCX0gaGVhZGVyOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKK307CisjZGVmaW5lIFNDVFBfSU5QVVRfQ0IoX19za2IpCSgoc3RydWN0IHNjdHBfaW5wdXRfY2IgKikmKChfX3NrYiktPmNiWzBdKSkKKwogLyoKICAqIFRoaXMgaXMgdGhlIHJvdXRpbmUgd2hpY2ggSVAgY2FsbHMgd2hlbiByZWNlaXZpbmcgYW4gU0NUUCBwYWNrZXQuCiAgKi8KQEAgLTI0Myw2ICsyNTQsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGRpc2NhcmRfcmVsZWFzZTsKIAl9CisJU0NUUF9JTlBVVF9DQihza2IpLT5jaHVuayA9IGNodW5rOwogCiAJc2N0cF9yY3Zfc2V0X293bmVyX3Ioc2tiLHNrKTsKIApAQCAtMjY1LDkgKzI3Nyw5IEBACiAJc2N0cF9iaF9sb2NrX3NvY2soc2spOwogCiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpCi0JCXNrX2FkZF9iYWNrbG9nKHNrLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCQlza19hZGRfYmFja2xvZyhzaywgc2tiKTsKIAllbHNlCi0JCXNjdHBfYmFja2xvZ19yY3Yoc2ssIChzdHJ1Y3Qgc2tfYnVmZiAqKSBjaHVuayk7CisJCXNjdHBfYmFja2xvZ19yY3Yoc2ssIHNrYik7CiAKIAkvKiBSZWxlYXNlIHRoZSBzb2NrIGFuZCBhbnkgcmVmZXJlbmNlIGNvdW50cyB3ZSB0b29rIGluIHRoZQogCSAqIGxvb2t1cCBjYWxscy4KQEAgLTMwMiwxNCArMzE0LDggQEAKICAqLwogaW50IHNjdHBfYmFja2xvZ19yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKLQlzdHJ1Y3Qgc2N0cF9pbnEgKmlucXVldWU7Ci0KLQkvKiBPbmUgZGF5IGNodW5rIHdpbGwgbGl2ZSBpbnNpZGUgdGhlIHNrYiwgYnV0IGZvcgotCSAqIG5vdyB0aGlzIHdvcmtzLgotCSAqLwotCWNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopIHNrYjsKLQlpbnF1ZXVlID0gJmNodW5rLT5yY3ZyLT5pbnF1ZXVlOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuayA9IFNDVFBfSU5QVVRfQ0Ioc2tiKS0+Y2h1bms7CisJc3RydWN0IHNjdHBfaW5xICppbnF1ZXVlID0gJmNodW5rLT5yY3ZyLT5pbnF1ZXVlOwogCiAJc2N0cF9pbnFfcHVzaChpbnF1ZXVlLCBjaHVuayk7CiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvaW5xdWV1ZS5jIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCmluZGV4IGNlZGY0MzUuLjJkMzM5MjIgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucXVldWUuYworKysgYi9uZXQvc2N0cC9pbnF1ZXVlLmMKQEAgLTUwLDcgKzUwLDcgQEAKIC8qIEluaXRpYWxpemUgYW4gU0NUUCBpbnF1ZXVlLiAgKi8KIHZvaWQgc2N0cF9pbnFfaW5pdChzdHJ1Y3Qgc2N0cF9pbnEgKnF1ZXVlKQogewotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlLT5pbik7CisJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlLT5pbl9jaHVua19saXN0KTsKIAlxdWV1ZS0+aW5fcHJvZ3Jlc3MgPSBOVUxMOwogCiAJLyogQ3JlYXRlIGEgdGFzayBmb3IgZGVsaXZlcmluZyBkYXRhLiAgKi8KQEAgLTYyLDExICs2MiwxMyBAQAogLyogUmVsZWFzZSB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBhbiBTQ1RQIGlucXVldWUuICAqLwogdm9pZCBzY3RwX2lucV9mcmVlKHN0cnVjdCBzY3RwX2lucSAqcXVldWUpCiB7Ci0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgKnRtcDsKIAogCS8qIEVtcHR5IHRoZSBxdWV1ZS4gICovCi0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKSBza2JfZGVxdWV1ZSgmcXVldWUtPmluKSkgIT0gTlVMTCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2h1bmssIHRtcCwgJnF1ZXVlLT5pbl9jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwl9CiAKIAkvKiBJZiB0aGVyZSBpcyBhIHBhY2tldCB3aGljaCBpcyBjdXJyZW50bHkgYmVpbmcgd29ya2VkIG9uLAogCSAqIGZyZWUgaXQgYXMgd2VsbC4KQEAgLTkyLDcgKzk0LDcgQEAKIAkgKiBFdmVudHVhbGx5LCB3ZSBzaG91bGQgY2xlYW4gdXAgaW5xdWV1ZSB0byBub3QgcmVseQogCSAqIG9uIHRoZSBCSCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcy4KIAkgKi8KLQlza2JfcXVldWVfdGFpbCgmKHEtPmluKSwgKHN0cnVjdCBza19idWZmICopIHBhY2tldCk7CisJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmcS0+aW5fY2h1bmtfbGlzdCk7CiAJcS0+aW1tZWRpYXRlLmZ1bmMocS0+aW1tZWRpYXRlLmRhdGEpOwogfQogCkBAIC0xMzEsMTIgKzEzMywxNiBAQAogCiAJLyogRG8gd2UgbmVlZCB0byB0YWtlIHRoZSBuZXh0IHBhY2tldCBvdXQgb2YgdGhlIHF1ZXVlIHRvIHByb2Nlc3M/ICovCiAJaWYgKCFjaHVuaykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwogCQkvKiBJcyB0aGUgcXVldWUgZW1wdHk/ICAqLwotICAgICAgICAJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcXVldWUtPmluKSkKKwkJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5pbl9jaHVua19saXN0KSkKIAkJCXJldHVybiBOVUxMOwogCisJCWVudHJ5ID0gcXVldWUtPmluX2NodW5rX2xpc3QubmV4dDsKIAkJY2h1bmsgPSBxdWV1ZS0+aW5fcHJvZ3Jlc3MgPQotCQkJKHN0cnVjdCBzY3RwX2NodW5rICopIHNrYl9kZXF1ZXVlKCZxdWV1ZS0+aW4pOworCQkJbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKIAogCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBjaHVuayBpbiB0aGUgcGFja2V0LiAgKi8KIAkJY2h1bmstPnNpbmdsZXRvbiA9IDE7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRwdXQuYyBiL25ldC9zY3RwL291dHB1dC5jCmluZGV4IDg0YjViMzcuLjkzMTM3MTYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHB1dC5jCisrKyBiL25ldC9zY3RwL291dHB1dC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlwYWNrZXQtPnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKIAlwYWNrZXQtPnNvdXJjZV9wb3J0ID0gc3BvcnQ7CiAJcGFja2V0LT5kZXN0aW5hdGlvbl9wb3J0ID0gZHBvcnQ7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcGFja2V0LT5jaHVua3MpOworCUlOSVRfTElTVF9IRUFEKCZwYWNrZXQtPmNodW5rX2xpc3QpOwogCWlmIChhc29jKSB7CiAJCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0cF9zayhhc29jLT5iYXNlLnNrKTsJCiAJCW92ZXJoZWFkID0gc3AtPnBmLT5hZi0+bmV0X2hlYWRlcl9sZW47IApAQCAtMTI5LDEyICsxMjksMTQgQEAKIC8qIEZyZWUgYSBwYWNrZXQuICAqLwogdm9pZCBzY3RwX3BhY2tldF9mcmVlKHN0cnVjdCBzY3RwX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICp0bXA7CiAKIAlTQ1RQX0RFQlVHX1BSSU5USygiJXM6IHBhY2tldDolcFxuIiwgX19GVU5DVElPTl9fLCBwYWNrZXQpOwogCi0gICAgICAgIHdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZwYWNrZXQtPmNodW5rcykpICE9IE5VTEwpCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOwogCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCX0KIAogCWlmIChwYWNrZXQtPm1hbGxvY2VkKQogCQlrZnJlZShwYWNrZXQpOwpAQCAtMjc2LDcgKzI3OCw3IEBACiAJCXBhY2tldC0+aGFzX3NhY2sgPSAxOwogCiAJLyogSXQgaXMgT0sgdG8gc2VuZCB0aGlzIGNodW5rLiAgKi8KLQlfX3NrYl9xdWV1ZV90YWlsKCZwYWNrZXQtPmNodW5rcywgKHN0cnVjdCBza19idWZmICopY2h1bmspOworCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5saXN0LCAmcGFja2V0LT5jaHVua19saXN0KTsKIAlwYWNrZXQtPnNpemUgKz0gY2h1bmtfbGVuOwogCWNodW5rLT50cmFuc3BvcnQgPSBwYWNrZXQtPnRyYW5zcG9ydDsKIGZpbmlzaDoKQEAgLTI5NSw3ICsyOTcsNyBAQAogCXN0cnVjdCBzY3RwaGRyICpzaDsKIAlfX3UzMiBjcmMzMjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bms7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCAqdG1wOwogCXN0cnVjdCBzb2NrICpzazsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcGFkZGluZzsJCS8qIEhvdyBtdWNoIHBhZGRpbmcgZG8gd2UgbmVlZD8gICovCkBAIC0zMDUsMTEgKzMwNywxMSBAQAogCVNDVFBfREVCVUdfUFJJTlRLKCIlczogcGFja2V0OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHBhY2tldCk7CiAKIAkvKiBEbyBOT1QgZ2VuZXJhdGUgYSBjaHVua2xlc3MgcGFja2V0LiAqLwotCWNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopc2tiX3BlZWsoJnBhY2tldC0+Y2h1bmtzKTsKLQlpZiAodW5saWtlbHkoIWNodW5rKSkKKwlpZiAobGlzdF9lbXB0eSgmcGFja2V0LT5jaHVua19saXN0KSkKIAkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB1cCBjb252ZW5pZW5jZSB2YXJpYWJsZXMuLi4gKi8KKwljaHVuayA9IGxpc3RfZW50cnkocGFja2V0LT5jaHVua19saXN0Lm5leHQsIHN0cnVjdCBzY3RwX2NodW5rLCBsaXN0KTsKIAlzayA9IGNodW5rLT5za2ItPnNrOwogCiAJLyogQWxsb2NhdGUgdGhlIG5ldyBza2IuICAqLwpAQCAtMzcwLDcgKzM3Miw4IEBACiAJICogW1RoaXMgd2hvbGUgY29tbWVudCBleHBsYWlucyBXT1JEX1JPVU5EKCkgYmVsb3cuXQogCSAqLwogCVNDVFBfREVCVUdfUFJJTlRLKCIqKipzY3RwX3RyYW5zbWl0X3BhY2tldCoqKlxuIik7Ci0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKV9fc2tiX2RlcXVldWUoJnBhY2tldC0+Y2h1bmtzKSkgIT0gTlVMTCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcGFja2V0LT5jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJaWYgKHNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpIHsKIAogCQkJaWYgKCFjaHVuay0+aGFzX3RzbikgewpAQCAtNTExLDcgKzUxNCw4IEBACiAJICogd2lsbCBnZXQgcmVzZW50IG9yIGRyb3BwZWQgbGF0ZXIuCiAJICovCiAKLQl3aGlsZSAoKGNodW5rID0gKHN0cnVjdCBzY3RwX2NodW5rICopX19za2JfZGVxdWV1ZSgmcGFja2V0LT5jaHVua3MpKSAhPSBOVUxMKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNodW5rLCB0bXAsICZwYWNrZXQtPmNodW5rX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmY2h1bmstPmxpc3QpOwogCQlpZiAoIXNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykpCiAgICAgCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9vdXRxdWV1ZS5jIGIvbmV0L3NjdHAvb3V0cXVldWUuYwppbmRleCA0ZWI4MWExLi5lZmI3MmZhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRxdWV1ZS5jCisrKyBiL25ldC9zY3RwL291dHF1ZXVlLmMKQEAgLTc1LDcgKzc1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfaGVhZF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCiAJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaCkKIHsKLQlfX3NrYl9xdWV1ZV9oZWFkKCZxLT5vdXQsIChzdHJ1Y3Qgc2tfYnVmZiAqKWNoKTsKKwlsaXN0X2FkZCgmY2gtPmxpc3QsICZxLT5vdXRfY2h1bmtfbGlzdCk7CiAJcS0+b3V0X3FsZW4gKz0gY2gtPnNrYi0+bGVuOwogCXJldHVybjsKIH0KQEAgLTgzLDE3ICs4MywyMiBAQAogLyogVGFrZSBkYXRhIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfb3V0cV9kZXF1ZXVlX2RhdGEoc3RydWN0IHNjdHBfb3V0cSAqcSkKIHsKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2g7Ci0JY2ggPSAoc3RydWN0IHNjdHBfY2h1bmsgKilfX3NrYl9kZXF1ZXVlKCZxLT5vdXQpOwotCWlmIChjaCkKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2ggPSBOVUxMOworCisJaWYgKCFsaXN0X2VtcHR5KCZxLT5vdXRfY2h1bmtfbGlzdCkpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSBxLT5vdXRfY2h1bmtfbGlzdC5uZXh0OworCisJCWNoID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KGVudHJ5KTsKIAkJcS0+b3V0X3FsZW4gLT0gY2gtPnNrYi0+bGVuOworCX0KIAlyZXR1cm4gY2g7CiB9CiAvKiBBZGQgZGF0YSBjaHVuayB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZS4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzY3RwX291dHFfdGFpbF9kYXRhKHN0cnVjdCBzY3RwX291dHEgKnEsCiAJCQkJICAgICAgIHN0cnVjdCBzY3RwX2NodW5rICpjaCkKIHsKLQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5vdXQsIChzdHJ1Y3Qgc2tfYnVmZiAqKWNoKTsKKwlsaXN0X2FkZF90YWlsKCZjaC0+bGlzdCwgJnEtPm91dF9jaHVua19saXN0KTsKIAlxLT5vdXRfcWxlbiArPSBjaC0+c2tiLT5sZW47CiAJcmV0dXJuOwogfQpAQCAtMTk3LDggKzIwMiw4IEBACiB2b2lkIHNjdHBfb3V0cV9pbml0KHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBzdHJ1Y3Qgc2N0cF9vdXRxICpxKQogewogCXEtPmFzb2MgPSBhc29jOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnEtPm91dCk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcS0+Y29udHJvbCk7CisJSU5JVF9MSVNUX0hFQUQoJnEtPm91dF9jaHVua19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcS0+Y29udHJvbF9jaHVua19saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcS0+cmV0cmFuc21pdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPnNhY2tlZCk7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPmFiYW5kb25lZCk7CkBAIC0yMTcsNyArMjIyLDcgQEAKIHsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsY2h1bmssICpwb3MsICp0ZW1wOwotCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKKwlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssICp0bXA7CiAKIAkvKiBUaHJvdyBhd2F5IHVuYWNrbm93bGVkZ2VkIGNodW5rcy4gKi8KIAlsaXN0X2Zvcl9lYWNoKHBvcywgJnEtPmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCkgewpAQCAtMjY5LDggKzI3NCwxMCBAQAogCXEtPmVycm9yID0gMDsKIAogCS8qIFRocm93IGF3YXkgYW55IGxlZnRvdmVyIGNvbnRyb2wgY2h1bmtzLiAqLwotCXdoaWxlICgoY2h1bmsgPSAoc3RydWN0IHNjdHBfY2h1bmsgKikgc2tiX2RlcXVldWUoJnEtPmNvbnRyb2wpKSAhPSBOVUxMKQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcS0+Y29udHJvbF9jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKKwl9CiB9CiAKIC8qIEZyZWUgdGhlIG91dHF1ZXVlIHN0cnVjdHVyZSBhbmQgYW55IHJlbGF0ZWQgcGVuZGluZyBjaHVua3MuICAqLwpAQCAtMzMzLDcgKzM0MCw3IEBACiAJCQlicmVhazsKIAkJfTsKIAl9IGVsc2UgewotCQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5jb250cm9sLCAoc3RydWN0IHNrX2J1ZmYgKikgY2h1bmspOworCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+bGlzdCwgJnEtPmNvbnRyb2xfY2h1bmtfbGlzdCk7CiAJCVNDVFBfSU5DX1NUQVRTKFNDVFBfTUlCX09VVENUUkxDSFVOS1MpOwogCX0KIApAQCAtNjUwLDEwICs2NTcsOSBAQAogCV9fdTE2IHNwb3J0ID0gYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydDsKIAlfX3UxNiBkcG9ydCA9IGFzb2MtPnBlZXIucG9ydDsKIAlfX3UzMiB2dGFnID0gYXNvYy0+cGVlci5pLmluaXRfdGFnOwotCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKm5ld190cmFuc3BvcnQ7Ci0Jc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgKnRtcDsKIAlzY3RwX3htaXRfdCBzdGF0dXM7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgc3RhcnRfdGltZXIgPSAwOwpAQCAtNjc1LDggKzY4MSw5IEBACiAJICogICAuLi4KIAkgKi8KIAotCXF1ZXVlID0gJnEtPmNvbnRyb2w7Ci0Jd2hpbGUgKChjaHVuayA9IChzdHJ1Y3Qgc2N0cF9jaHVuayAqKXNrYl9kZXF1ZXVlKHF1ZXVlKSkgIT0gTlVMTCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcS0+Y29udHJvbF9jaHVua19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKKwogCQkvKiBQaWNrIHRoZSByaWdodCB0cmFuc3BvcnQgdG8gdXNlLiAqLwogCQluZXdfdHJhbnNwb3J0ID0gY2h1bmstPnRyYW5zcG9ydDsKIApAQCAtODE0LDggKzgyMSw2IEBACiAKIAkJLyogRmluYWxseSwgdHJhbnNtaXQgbmV3IHBhY2tldHMuICAqLwogCQlzdGFydF90aW1lciA9IDA7Ci0JCXF1ZXVlID0gJnEtPm91dDsKLQogCQl3aGlsZSAoKGNodW5rID0gc2N0cF9vdXRxX2RlcXVldWVfZGF0YShxKSkgIT0gTlVMTCkgewogCQkJLyogUkZDIDI5NjAgNi41IEV2ZXJ5IERBVEEgY2h1bmsgTVVTVCBjYXJyeSBhIHZhbGlkCiAJCQkgKiBzdHJlYW0gaWRlbnRpZmllci4KQEAgLTExNDksOCArMTE1NCw5IEBACiAJLyogU2VlIGlmIGFsbCBjaHVua3MgYXJlIGFja2VkLgogCSAqIE1ha2Ugc3VyZSB0aGUgZW1wdHkgcXVldWUgaGFuZGxlciB3aWxsIGdldCBydW4gbGF0ZXIuCiAJICovCi0JcS0+ZW1wdHkgPSBza2JfcXVldWVfZW1wdHkoJnEtPm91dCkgJiYgc2tiX3F1ZXVlX2VtcHR5KCZxLT5jb250cm9sKSAmJgotCQkJbGlzdF9lbXB0eSgmcS0+cmV0cmFuc21pdCk7CisJcS0+ZW1wdHkgPSAobGlzdF9lbXB0eSgmcS0+b3V0X2NodW5rX2xpc3QpICYmCisJCSAgICBsaXN0X2VtcHR5KCZxLT5jb250cm9sX2NodW5rX2xpc3QpICYmCisJCSAgICBsaXN0X2VtcHR5KCZxLT5yZXRyYW5zbWl0KSk7CiAJaWYgKCFxLT5lbXB0eSkKIAkJZ290byBmaW5pc2g7CiAKQEAgLTE2NzksOSArMTY4NSw5IEBACiAJCWlmIChUU05fbHRlKHRzbiwgY3RzbikpIHsKIAkJCWxpc3RfZGVsX2luaXQobGNodW5rKTsKIAkJCWlmICghY2h1bmstPnRzbl9nYXBfYWNrZWQpIHsKLQkJCWNodW5rLT50cmFuc3BvcnQtPmZsaWdodF9zaXplIC09Ci0JCQkJCQkgc2N0cF9kYXRhX3NpemUoY2h1bmspOwotCQkJcS0+b3V0c3RhbmRpbmdfYnl0ZXMgLT0gc2N0cF9kYXRhX3NpemUoY2h1bmspOworCQkJCWNodW5rLT50cmFuc3BvcnQtPmZsaWdodF9zaXplIC09CisJCQkJCXNjdHBfZGF0YV9zaXplKGNodW5rKTsKKwkJCQlxLT5vdXRzdGFuZGluZ19ieXRlcyAtPSBzY3RwX2RhdGFfc2l6ZShjaHVuayk7CiAJCQl9CiAJCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOwogCQl9IGVsc2UgewpAQCAtMTcyOSw3ICsxNzM1LDcgQEAKIAkJCQkJICAgICAgbnNraXBzLCAmZnRzbl9za2lwX2FyclswXSk7IAogCiAJaWYgKGZ0c25fY2h1bmspIHsKLQkJX19za2JfcXVldWVfdGFpbCgmcS0+Y29udHJvbCwgKHN0cnVjdCBza19idWZmICopZnRzbl9jaHVuayk7CisJCWxpc3RfYWRkX3RhaWwoJmZ0c25fY2h1bmstPmxpc3QsICZxLT5jb250cm9sX2NodW5rX2xpc3QpOwogCQlTQ1RQX0lOQ19TVEFUUyhTQ1RQX01JQl9PVVRDVFJMQ0hVTktTKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm90b2NvbC5jIGIvbmV0L3NjdHAvcHJvdG9jb2wuYwppbmRleCA1MTM1ZTFhLi5jZTkyNDVlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9wcm90b2NvbC5jCisrKyBiL25ldC9zY3RwL3Byb3RvY29sLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCiAvKiBDb3B5IHRoZSBsb2NhbCBhZGRyZXNzZXMgd2hpY2ggYXJlIHZhbGlkIGZvciAnc2NvcGUnIGludG8gJ2JwJy4gICovCiBpbnQgc2N0cF9jb3B5X2xvY2FsX2FkZHJfbGlzdChzdHJ1Y3Qgc2N0cF9iaW5kX2FkZHIgKmJwLCBzY3RwX3Njb3BlX3Qgc2NvcGUsCi0JCQkgICAgICBpbnQgZ2ZwLCBpbnQgY29weV9mbGFncykKKwkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsIGludCBjb3B5X2ZsYWdzKQogewogCXN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5ICphZGRyOwogCWludCBlcnJvciA9IDA7CkBAIC0xMDUwLDcgKzEwNTAsMTAgQEAKIAlzY3RwX3NuZGJ1Zl9wb2xpY3kJCT0gMDsKIAogCS8qIEhCLmludGVydmFsICAgICAgICAgICAgICAtIDMwIHNlY29uZHMgKi8KLQlzY3RwX2hiX2ludGVydmFsCQk9IDMwICogSFo7CisJc2N0cF9oYl9pbnRlcnZhbAkJPSBTQ1RQX0RFRkFVTFRfVElNRU9VVF9IRUFSVEJFQVQ7CisKKwkvKiBkZWxheWVkIFNBQ0sgdGltZW91dCAqLworCXNjdHBfc2Fja190aW1lb3V0CQk9IFNDVFBfREVGQVVMVF9USU1FT1VUX1NBQ0s7CiAKIAkvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyB2YXJpYWJsZXMuICovCiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwppbmRleCA1YmFlZDliLi4wMGQzMmI3IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKKysrIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgaW50IHNjdHBfcHJvY2Vzc19wYXJhbShzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCSAgICAgIHVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtLAogCQkJICAgICAgY29uc3QgdW5pb24gc2N0cF9hZGRyICpwZWVyX2FkZHIsCi0JCQkgICAgICBpbnQgZ2ZwKTsKKwkJCSAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApOwogCiAvKiBXaGF0IHdhcyB0aGUgaW5ib3VuZCBpbnRlcmZhY2UgZm9yIHRoaXMgY2h1bms/ICovCiBpbnQgc2N0cF9jaHVua19paWYoY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQpAQCAtMTc0LDcgKzE3NCw3IEBACiAgKi8KIHN0cnVjdCBzY3RwX2NodW5rICpzY3RwX21ha2VfaW5pdChjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYmluZF9hZGRyICpicCwKLQkJCSAgICAgaW50IGdmcCwgaW50IHZwYXJhbV9sZW4pCisJCQkgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnAsIGludCB2cGFyYW1fbGVuKQogewogCXNjdHBfaW5pdGhkcl90IGluaXQ7CiAJdW5pb24gc2N0cF9wYXJhbXMgYWRkcnM7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAogc3RydWN0IHNjdHBfY2h1bmsgKnNjdHBfbWFrZV9pbml0X2Fjayhjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkgY29uc3Qgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCQkJCSBpbnQgZ2ZwLCBpbnQgdW5rcGFyYW1fbGVuKQorCQkJCSB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLCBpbnQgdW5rcGFyYW1fbGVuKQogewogCXNjdHBfaW5pdGhkcl90IGluaXRhY2s7CiAJc3RydWN0IHNjdHBfY2h1bmsgKnJldHZhbDsKQEAgLTEwMDMsNiArMTAwMyw3IEBACiAJCVNDVFBfREVCVUdfUFJJTlRLKCJjaHVua2lmeWluZyBza2IgJXAgdy9vIGFuIHNrXG4iLCBza2IpOwogCX0KIAorCUlOSVRfTElTVF9IRUFEKCZyZXR2YWwtPmxpc3QpOwogCXJldHZhbC0+c2tiCQk9IHNrYjsKIAlyZXR2YWwtPmFzb2MJCT0gKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICopYXNvYzsKIAlyZXR2YWwtPnJlc2VudCAgCT0gMDsKQEAgLTExMTYsOCArMTExNyw3IEBACiAvKiBQb3NzaWJseSwgZnJlZSB0aGUgY2h1bmsuICAqLwogdm9pZCBzY3RwX2NodW5rX2ZyZWUoc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQogewotCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3Qgb24gYW55IGxpc3QuICAqLwotCXNrYl91bmxpbmsoKHN0cnVjdCBza19idWZmICopIGNodW5rKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNodW5rLT5saXN0KSk7CiAJbGlzdF9kZWxfaW5pdCgmY2h1bmstPnRyYW5zbWl0dGVkX2xpc3QpOwogCiAJLyogUmVsZWFzZSBvdXIgcmVmZXJlbmNlIG9uIHRoZSBtZXNzYWdlIHRyYWNrZXIuICovCkBAIC0xMjMzLDcgKzEyMzMsOCBAQAogCiAvKiBDcmVhdGUgYSBDTE9TRUQgYXNzb2NpYXRpb24gdG8gdXNlIHdpdGggYW4gaW5jb21pbmcgcGFja2V0LiAgKi8KIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICpzY3RwX21ha2VfdGVtcF9hc29jKGNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKLQkJCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBpbnQgZ2ZwKQorCQkJCQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCisJCQkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTEzNDgsNyArMTM0OSw3IEBACiBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqc2N0cF91bnBhY2tfY29va2llKAogCWNvbnN0IHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKLQlzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssIGludCBnZnAsCisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwLAogCWludCAqZXJyb3IsIHN0cnVjdCBzY3RwX2NodW5rICoqZXJycCkKIHsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqcmV0dmFsID0gTlVMTDsKQEAgLTE4MTIsNyArMTgxMyw3IEBACiAgKi8KIGludCBzY3RwX3Byb2Nlc3NfaW5pdChzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgc2N0cF9jaWRfdCBjaWQsCiAJCSAgICAgIGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqcGVlcl9hZGRyLAotCQkgICAgICBzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0LCBpbnQgZ2ZwKQorCQkgICAgICBzY3RwX2luaXRfY2h1bmtfdCAqcGVlcl9pbml0LCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXVuaW9uIHNjdHBfcGFyYW1zIHBhcmFtOwogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwpAQCAtMTk4Myw3ICsxOTg0LDcgQEAKIHN0YXRpYyBpbnQgc2N0cF9wcm9jZXNzX3BhcmFtKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkJICAgICAgdW5pb24gc2N0cF9wYXJhbXMgcGFyYW0sCiAJCQkgICAgICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnBlZXJfYWRkciwKLQkJCSAgICAgIGludCBnZnApCisJCQkgICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXVuaW9uIHNjdHBfYWRkciBhZGRyOwogCWludCBpOwpAQCAtMjczOSw4ICsyNzQwLDEyIEBACiAJYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYgPSBOVUxMOwogCiAJLyogU2VuZCB0aGUgbmV4dCBhc2NvbmYgY2h1bmsgZnJvbSB0aGUgYWRkaXAgY2h1bmsgcXVldWUuICovCi0JYXNjb25mID0gKHN0cnVjdCBzY3RwX2NodW5rICopX19za2JfZGVxdWV1ZSgmYXNvYy0+YWRkaXBfY2h1bmtzKTsKLQlpZiAoYXNjb25mKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZhc29jLT5hZGRpcF9jaHVua19saXN0KSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9IGFzb2MtPmFkZGlwX2NodW5rX2xpc3QubmV4dDsKKwkJYXNjb25mID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHNjdHBfY2h1bmssIGxpc3QpOworCisJCWxpc3RfZGVsX2luaXQoZW50cnkpOworCiAJCS8qIEhvbGQgdGhlIGNodW5rIHVudGlsIGFuIEFTQ09ORl9BQ0sgaXMgcmVjZWl2ZWQuICovCiAJCXNjdHBfY2h1bmtfaG9sZChhc2NvbmYpOwogCQlpZiAoc2N0cF9wcmltaXRpdmVfQVNDT05GKGFzb2MsIGFzY29uZikpCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMgYi9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKaW5kZXggNzc4NjM5ZC4uMzljOTcwYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCisrKyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwpAQCAtNjMsNyArNjMsNyBAQAogCQkJCXZvaWQgKmV2ZW50X2FyZywKIAkJCSAJc2N0cF9kaXNwb3NpdGlvbl90IHN0YXR1cywKIAkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCi0JCQkJaW50IGdmcCk7CisJCQkJdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCk7CiBzdGF0aWMgaW50IHNjdHBfc2lkZV9lZmZlY3RzKHNjdHBfZXZlbnRfdCBldmVudF90eXBlLCBzY3RwX3N1YnR5cGVfdCBzdWJ0eXBlLAogCQkJICAgICBzY3RwX3N0YXRlX3Qgc3RhdGUsCiAJCQkgICAgIHN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCwKQEAgLTcxLDcgKzcxLDcgQEAKIAkJCSAgICAgdm9pZCAqZXZlbnRfYXJnLAogCQkJICAgICBzY3RwX2Rpc3Bvc2l0aW9uX3Qgc3RhdHVzLAogCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCi0JCQkgICAgIGludCBnZnApOworCQkJICAgICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBIZWxwZXIgZnVuY3Rpb25zCkBAIC00OTcsNyArNDk3LDggQEAKIHN0YXRpYyBpbnQgc2N0cF9jbWRfcHJvY2Vzc19pbml0KHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKIAkJCQkgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJCQkgc2N0cF9pbml0X2NodW5rX3QgKnBlZXJfaW5pdCwgaW50IGdmcCkKKwkJCQkgc2N0cF9pbml0X2NodW5rX3QgKnBlZXJfaW5pdCwKKwkJCQkgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTg1Miw3ICs4NTMsNyBAQAogCSAgICAgICBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCiAJICAgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCSAgICAgICB2b2lkICpldmVudF9hcmcsCi0JICAgICAgIGludCBnZnApCisJICAgICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc2N0cF9jbWRfc2VxX3QgY29tbWFuZHM7CiAJY29uc3Qgc2N0cF9zbV90YWJsZV9lbnRyeV90ICpzdGF0ZV9mbjsKQEAgLTg5Nyw3ICs4OTgsNyBAQAogCQkJICAgICB2b2lkICpldmVudF9hcmcsCiAJCQkgICAgIHNjdHBfZGlzcG9zaXRpb25fdCBzdGF0dXMsCiAJCQkgICAgIHNjdHBfY21kX3NlcV90ICpjb21tYW5kcywKLQkJCSAgICAgaW50IGdmcCkKKwkJCSAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlpbnQgZXJyb3I7CiAKQEAgLTk4NSw3ICs5ODYsNyBAQAogCQkJCXZvaWQgKmV2ZW50X2FyZywKIAkJCSAJc2N0cF9kaXNwb3NpdGlvbl90IHN0YXR1cywKIAkJCQlzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCi0JCQkJaW50IGdmcCkKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCWludCBlcnJvciA9IDA7CiAJaW50IGZvcmNlOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc21fc3RhdGVmdW5zLmMgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwppbmRleCAwNTgxODk2Li44NjA3M2RmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYworKysgYi9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYwpAQCAtOTIsNiArOTIsMTcgQEAKIAkJCQkJICAgICBzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMpOwogc3RhdGljIHN0cnVjdCBzY3RwX3NhY2toZHIgKnNjdHBfc21fcHVsbF9zYWNrKHN0cnVjdCBzY3RwX2NodW5rICpjaHVuayk7CiAKK3N0YXRpYyBzY3RwX2Rpc3Bvc2l0aW9uX3Qgc2N0cF9zdG9wX3QxX2FuZF9hYm9ydChzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCisJCQkJCSAgIF9fdTE2IGVycm9yLAorCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCQkJICAgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCisJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAorCQkJCSAgICAgdm9pZCAqYXJnLAorCQkJCSAgICAgc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzKTsKIAogLyogU21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZSBjaHVuayBsZW5ndGgKICAqIGlzIG9mIHRoZSBhcHByb3ByaWF0ZSBsZW5ndGguICBUaGUgJ3JlcXVpcmVkX2xlbmd0aCcgYXJndW1lbnQKQEAgLTIzMjgsNyArMjMzOSw3IEBACiAgKgogICogVGhpcyBpcyBjb21tb24gY29kZSBjYWxsZWQgYnkgc2V2ZXJhbCBzY3RwX3NmXypfYWJvcnQoKSBmdW5jdGlvbnMgYWJvdmUuCiAgKi8KLXNjdHBfZGlzcG9zaXRpb25fdCAgc2N0cF9zdG9wX3QxX2FuZF9hYm9ydChzY3RwX2NtZF9zZXFfdCAqY29tbWFuZHMsCitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc3RvcF90MV9hbmRfYWJvcnQoc2N0cF9jbWRfc2VxX3QgKmNvbW1hbmRzLAogCQkJCQkgICBfX3UxNiBlcnJvciwKIAkJCQkJICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJCSAgIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0KQpAQCAtMzY4Nyw3ICszNjk4LDggQEAKICAqCiAgKiBHZW5lcmF0ZSBhbiAgQUJPUlQgY2h1bmsgYW5kIHRlcm1pbmF0ZSB0aGUgYXNzb2NpYXRpb24uCiAgKi8KLXNjdHBfZGlzcG9zaXRpb25fdCBzY3RwX3NmX3Zpb2xhdGlvbl9jaHVua2xlbihjb25zdCBzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAsCitzdGF0aWMgc2N0cF9kaXNwb3NpdGlvbl90IHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKAorCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJCQkJICAgICBjb25zdCBzY3RwX3N1YnR5cGVfdCB0eXBlLAogCQkJCSAgICAgdm9pZCAqYXJnLApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCBhYWQ1NWRjLi4wOTFhNjZmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAJICogdHJhbnNtaXNzaW9uLgogCSAqLwkKIAlpZiAoYXNvYy0+YWRkaXBfbGFzdF9hc2NvbmYpIHsKLQkJX19za2JfcXVldWVfdGFpbCgmYXNvYy0+YWRkaXBfY2h1bmtzLCAoc3RydWN0IHNrX2J1ZmYgKiljaHVuayk7CisJCWxpc3RfYWRkX3RhaWwoJmNodW5rLT5saXN0LCAmYXNvYy0+YWRkaXBfY2h1bmtfbGlzdCk7CiAJCWdvdG8gb3V0OwkKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3Nzbm1hcC5jIGIvbmV0L3NjdHAvc3NubWFwLmMKaW5kZXggZTYyN2QyYi4uMjUwMzdkYSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc3NubWFwLmMKKysrIGIvbmV0L3NjdHAvc3NubWFwLmMKQEAgLTU3LDcgKzU3LDggQEAKIC8qIENyZWF0ZSBhIG5ldyBzY3RwX3Nzbm1hcC4KICAqIEFsbG9jYXRlIHJvb20gdG8gc3RvcmUgYXQgbGVhc3QgJ2xlbicgY29udGlndW91cyBUU05zLgogICovCi1zdHJ1Y3Qgc2N0cF9zc25tYXAgKnNjdHBfc3NubWFwX25ldyhfX3UxNiBpbiwgX191MTYgb3V0LCBpbnQgZ2ZwKQorc3RydWN0IHNjdHBfc3NubWFwICpzY3RwX3Nzbm1hcF9uZXcoX191MTYgaW4sIF9fdTE2IG91dCwKKwkJCQkgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9zc25tYXAgKnJldHZhbDsKIAlpbnQgc2l6ZTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3N5c2N0bC5jIGIvbmV0L3NjdHAvc3lzY3RsLmMKaW5kZXggN2ZjMzE4NC4uZGM0ODkzNCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc3lzY3RsLmMKKysrIGIvbmV0L3NjdHAvc3lzY3RsLmMKQEAgLTQ3LDYgKzQ3LDggQEAKIHN0YXRpYyBjdGxfaGFuZGxlciBzY3RwX3N5c2N0bF9qaWZmaWVzX21zOwogc3RhdGljIGxvbmcgcnRvX3RpbWVyX21pbiA9IDE7CiBzdGF0aWMgbG9uZyBydG9fdGltZXJfbWF4ID0gODY0MDAwMDA7IC8qIE9uZSBkYXkgKi8KK3N0YXRpYyBsb25nIHNhY2tfdGltZXJfbWluID0gMTsKK3N0YXRpYyBsb25nIHNhY2tfdGltZXJfbWF4ID0gNTAwOwogCiBzdGF0aWMgY3RsX3RhYmxlIHNjdHBfdGFibGVbXSA9IHsKIAl7CkBAIC0xODcsNiArMTg5LDE3IEBACiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYwogCX0sCisJeworCQkuY3RsX25hbWUJPSBORVRfU0NUUF9TQUNLX1RJTUVPVVQsCisJCS5wcm9jbmFtZQk9ICJzYWNrX3RpbWVvdXQiLAorCQkuZGF0YQkJPSAmc2N0cF9zYWNrX3RpbWVvdXQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGxvbmcpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heCwKKwkJLnN0cmF0ZWd5CT0gJnNjdHBfc3lzY3RsX2ppZmZpZXNfbXMsCisJCS5leHRyYTEgICAgICAgICA9ICZzYWNrX3RpbWVyX21pbiwKKwkJLmV4dHJhMiAgICAgICAgID0gJnNhY2tfdGltZXJfbWF4LAorCX0sCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3RyYW5zcG9ydC5jIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKaW5kZXggMGVjMGZkZS4uZDJmMDRlYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMKKysrIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKQEAgLTU3LDcgKzU3LDcgQEAKIC8qIEluaXRpYWxpemUgYSBuZXcgdHJhbnNwb3J0IGZyb20gcHJvdmlkZWQgbWVtb3J5LiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnNjdHBfdHJhbnNwb3J0X2luaXQoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwZWVyLAogCQkJCQkJICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKmFkZHIsCi0JCQkJCQkgIGludCBnZnApCisJCQkJCQkgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJLyogQ29weSBpbiB0aGUgYWRkcmVzcy4gICovCiAJcGVlci0+aXBhZGRyID0gKmFkZHI7CkBAIC0xMDMsNyArMTAzLDYgQEAKIAogCS8qIFNldCB1cCB0aGUgaGVhcnRiZWF0IHRpbWVyLiAqLwogCWluaXRfdGltZXIoJnBlZXItPmhiX3RpbWVyKTsKLQlwZWVyLT5oYl9pbnRlcnZhbCA9IFNDVFBfREVGQVVMVF9USU1FT1VUX0hFQVJUQkVBVDsKIAlwZWVyLT5oYl90aW1lci5mdW5jdGlvbiA9IHNjdHBfZ2VuZXJhdGVfaGVhcnRiZWF0X2V2ZW50OwogCXBlZXItPmhiX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwZWVyOwogCkBAIC0xMjIsNyArMTIxLDggQEAKIH0KIAogLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdHJhbnNwb3J0LiAgKi8KLXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF90cmFuc3BvcnRfbmV3KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkciwgaW50IGdmcCkKK3N0cnVjdCBzY3RwX3RyYW5zcG9ydCAqc2N0cF90cmFuc3BvcnRfbmV3KGNvbnN0IHVuaW9uIHNjdHBfYWRkciAqYWRkciwKKwkJCQkJICB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogICAgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRyYW5zcG9ydDsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvdWxwZXZlbnQuYyBiL25ldC9zY3RwL3VscGV2ZW50LmMKaW5kZXggMTdkMGZmNS4uMGFiZDUxMCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdWxwZXZlbnQuYworKysgYi9uZXQvc2N0cC91bHBldmVudC5jCkBAIC03NCw3ICs3NCw3IEBACiAKIC8qIENyZWF0ZSBhIG5ldyBzY3RwX3VscGV2ZW50LiAgKi8KIFNDVFBfU1RBVElDIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X25ldyhpbnQgc2l6ZSwgaW50IG1zZ19mbGFncywKLQkJCQkJCSAgICBpbnQgZ2ZwKQorCQkJCQkJICAgIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMzYsNyArMTM2LDcgQEAKIHN0cnVjdCBzY3RwX3VscGV2ZW50ICAqc2N0cF91bHBldmVudF9tYWtlX2Fzc29jX2NoYW5nZSgKIAljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAlfX3UxNiBmbGFncywgX191MTYgc3RhdGUsIF9fdTE2IGVycm9yLCBfX3UxNiBvdXRib3VuZCwKLQlfX3UxNiBpbmJvdW5kLCBpbnQgZ2ZwKQorCV9fdTE2IGluYm91bmQsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqc2FjOwpAQCAtMjM3LDcgKzIzNyw3IEBACiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3BlZXJfYWRkcl9jaGFuZ2UoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCiAJY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFhZGRyLAotCWludCBmbGFncywgaW50IHN0YXRlLCBpbnQgZXJyb3IsIGludCBnZnApCisJaW50IGZsYWdzLCBpbnQgc3RhdGUsIGludCBlcnJvciwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfcGFkZHJfY2hhbmdlICAqc3BjOwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgKi8KIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfcmVtb3RlX2Vycm9yKAogCWNvbnN0IHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLCBzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmssCi0JX191MTYgZmxhZ3MsIGludCBnZnApCisJX191MTYgZmxhZ3MsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX3JlbW90ZV9lcnJvciAqc3JlOwpAQCAtNDQ4LDcgKzQ0OCw3IEBACiAgKi8KIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2Vfc2VuZF9mYWlsZWQoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQlfX3UxNiBmbGFncywgX191MzIgZXJyb3IsIGludCBnZnApCisJX191MTYgZmxhZ3MsIF9fdTMyIGVycm9yLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9zZW5kX2ZhaWxlZCAqc3NmOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAgKi8KIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2Vfc2h1dGRvd25fZXZlbnQoCiAJY29uc3Qgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCi0JX191MTYgZmxhZ3MsIGludCBnZnApCisJX191MTYgZmxhZ3MsIHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzY3RwX3NodXRkb3duX2V2ZW50ICpzc2U7CkBAIC02MjAsNyArNjIwLDcgQEAKICAqIDUuMy4xLjYgU0NUUF9BREFQVElPTl9JTkRJQ0FUSU9OCiAgKi8KIHN0cnVjdCBzY3RwX3VscGV2ZW50ICpzY3RwX3VscGV2ZW50X21ha2VfYWRhcHRpb25faW5kaWNhdGlvbigKLQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgaW50IGdmcCkKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXZlbnQ7CiAJc3RydWN0IHNjdHBfYWRhcHRpb25fZXZlbnQgKnNhaTsKQEAgLTY1Nyw3ICs2NTcsNyBAQAogICovCiBzdHJ1Y3Qgc2N0cF91bHBldmVudCAqc2N0cF91bHBldmVudF9tYWtlX3Jjdm1zZyhzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKIAkJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJCQkJCWludCBnZnApCisJCQkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTcxOCw3ICs3MTgsOCBAQAogICogICB2YXJpb3VzIGV2ZW50cy4KICAqLwogc3RydWN0IHNjdHBfdWxwZXZlbnQgKnNjdHBfdWxwZXZlbnRfbWFrZV9wZGFwaSgKLQljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgX191MzIgaW5kaWNhdGlvbiwgaW50IGdmcCkKKwljb25zdCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywgX191MzIgaW5kaWNhdGlvbiwKKwl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9wZGFwaV9ldmVudCAqcGQ7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBxdWV1ZS5jIGIvbmV0L3NjdHAvdWxwcXVldWUuYwppbmRleCBkNWRkMmNmLi44YmJjMjc5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBxdWV1ZS5jCisrKyBiL25ldC9zY3RwL3VscHF1ZXVlLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAvKiBQcm9jZXNzIGFuIGluY29taW5nIERBVEEgY2h1bmsuICAqLwogaW50IHNjdHBfdWxwcV90YWlsX2RhdGEoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLAotCQkJaW50IGdmcCkKKwkJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnApCiB7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0ZW1wOwogCXNjdHBfZGF0YV9jaHVua190ICpoZHI7CkBAIC03NzgsNyArNzc4LDggQEAKIAogLyogUGFydGlhbCBkZWxpdmVyIHRoZSBmaXJzdCBtZXNzYWdlIGFzIHRoZXJlIGlzIHByZXNzdXJlIG9uIHJ3bmQuICovCiB2b2lkIHNjdHBfdWxwcV9wYXJ0aWFsX2RlbGl2ZXJ5KHN0cnVjdCBzY3RwX3VscHEgKnVscHEsCi0JCQkJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBpbnQgZ2ZwKQorCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKKwkJCQl1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKQEAgLTgwMiw3ICs4MDMsNyBAQAogCiAvKiBSZW5lZ2Ugc29tZSBwYWNrZXRzIHRvIG1ha2Ugcm9vbSBmb3IgYW4gaW5jb21pbmcgY2h1bmsuICAqLwogdm9pZCBzY3RwX3VscHFfcmVuZWdlKHN0cnVjdCBzY3RwX3VscHEgKnVscHEsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJICAgICAgaW50IGdmcCkKKwkJICAgICAgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIAlfX3UxNiBuZWVkZWQsIGZyZWVkOwpAQCAtODQxLDcgKzg0Miw3IEBACiAvKiBOb3RpZnkgdGhlIGFwcGxpY2F0aW9uIGlmIGFuIGFzc29jaWF0aW9uIGlzIGFib3J0ZWQgYW5kIGluCiAgKiBwYXJ0aWFsIGRlbGl2ZXJ5IG1vZGUuICBTZW5kIHVwIGFueSBwZW5kaW5nIHJlY2VpdmVkIG1lc3NhZ2VzLgogICovCi12b2lkIHNjdHBfdWxwcV9hYm9ydF9wZChzdHJ1Y3Qgc2N0cF91bHBxICp1bHBxLCBpbnQgZ2ZwKQordm9pZCBzY3RwX3VscHFfYWJvcnRfcGQoc3RydWN0IHNjdHBfdWxwcSAqdWxwcSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF91bHBldmVudCAqZXYgPSBOVUxMOwogCXN0cnVjdCBzb2NrICpzazsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwppbmRleCAzMmU4YWNiLi42MmEwNzM0IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKKysrIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCkBAIC00MSw2ICs0MSw3IEBACiAKIC8qIFJQQyBjbGllbnQgZnVuY3Rpb25zICovCiBFWFBPUlRfU1lNQk9MKHJwY19jcmVhdGVfY2xpZW50KTsKK0VYUE9SVF9TWU1CT0wocnBjX25ld19jbGllbnQpOwogRVhQT1JUX1NZTUJPTChycGNfY2xvbmVfY2xpZW50KTsKIEVYUE9SVF9TWU1CT0wocnBjX2JpbmRfbmV3X3Byb2dyYW0pOwogRVhQT1JUX1NZTUJPTChycGNfZGVzdHJveV9jbGllbnQpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCAwNTkwNzAzLi41NmRiOGYxIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtMTE4NSw4ICsxMTg1LDggQEAKIAlhcmctPnBhZ2VfbGVuID0gKHBhZ2VzLTIpKlBBR0VfU0laRTsKIAlhcmctPmxlbiA9IChwYWdlcy0xKSpQQUdFX1NJWkU7CiAJYXJnLT50YWlsWzBdLmlvdl9sZW4gPSAwOwotCQotCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKworCXRyeV90b19mcmVlemUoKTsKIAlpZiAoc2lnbmFsbGVkKCkpCiAJCXJldHVybiAtRUlOVFI7CiAKQEAgLTEyMjcsNyArMTIyNyw3IEBACiAKIAkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKIAotCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCXRyeV90b19mcmVlemUoKTsKIAogCQlzcGluX2xvY2tfYmgoJnNlcnYtPnN2X2xvY2spOwogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnFzdHAtPnJxX3dhaXQsICZ3YWl0KTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydC5jIGIvbmV0L3N1bnJwYy94cHJ0LmMKaW5kZXggZWNhOTI0MC4uM2M2NTRlMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0LmMKQEAgLTE0NSw4ICsxNDUsNiBAQAogCWlmICh0ZXN0X2FuZF9zZXRfYml0KFhQUlRfTE9DS0VELCAmeHBydC0+c29ja3N0YXRlKSkgewogCQlpZiAodGFzayA9PSB4cHJ0LT5zbmRfdGFzaykKIAkJCXJldHVybiAxOwotCQlpZiAodGFzayA9PSBOVUxMKQotCQkJcmV0dXJuIDA7CiAJCWdvdG8gb3V0X3NsZWVwOwogCX0KIAlpZiAoeHBydC0+bm9jb25nIHx8IF9feHBydF9nZXRfY29uZyh4cHJ0LCB0YXNrKSkgewpAQCAtOTcwLDcgKzk2OCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRwcmludGsoIlJQQzogICAgICBYSUQgJTA4eCByZWFkICV1IGJ5dGVzXG4iLAorCWRwcmludGsoIlJQQzogICAgICBYSUQgJTA4eCByZWFkICVaZCBieXRlc1xuIiwKIAkJCW50b2hsKHhwcnQtPnRjcF94aWQpLCByKTsKIAlkcHJpbnRrKCJSUEM6ICAgICAgeHBydCA9ICVwLCB0Y3BfY29waWVkID0gJWx1LCB0Y3Bfb2Zmc2V0ID0gJXUsIHRjcF9yZWNsZW4gPSAldVxuIiwKIAkJCXhwcnQsIHhwcnQtPnRjcF9jb3BpZWQsIHhwcnQtPnRjcF9vZmZzZXQsIHhwcnQtPnRjcF9yZWNsZW4pOwpAQCAtMTAwNiw3ICsxMDA0LDcgQEAKIAlkZXNjLT5jb3VudCAtPSBsZW47CiAJZGVzYy0+b2Zmc2V0ICs9IGxlbjsKIAl4cHJ0LT50Y3Bfb2Zmc2V0ICs9IGxlbjsKLQlkcHJpbnRrKCJSUEM6ICAgICAgZGlzY2FyZGVkICV1IGJ5dGVzXG4iLCBsZW4pOworCWRwcmludGsoIlJQQzogICAgICBkaXNjYXJkZWQgJVp1IGJ5dGVzXG4iLCBsZW4pOwogCXRjcF9jaGVja19yZWNtKHhwcnQpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvdW5peC9LY29uZmlnIGIvbmV0L3VuaXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY5NzMzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3VuaXgvS2NvbmZpZwpAQCAtMCwwICsxLDIxIEBACisjCisjIFVuaXggRG9tYWluIFNvY2tldHMKKyMKKworY29uZmlnIFVOSVgKKwl0cmlzdGF0ZSAiVW5peCBkb21haW4gc29ja2V0cyIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgaW5jbHVkZSBzdXBwb3J0IGZvciBVbml4IGRvbWFpbiBzb2NrZXRzOworCSAgc29ja2V0cyBhcmUgdGhlIHN0YW5kYXJkIFVuaXggbWVjaGFuaXNtIGZvciBlc3RhYmxpc2hpbmcgYW5kCisJICBhY2Nlc3NpbmcgbmV0d29yayBjb25uZWN0aW9ucy4gIE1hbnkgY29tbW9ubHkgdXNlZCBwcm9ncmFtcyBzdWNoIGFzCisJICB0aGUgWCBXaW5kb3cgc3lzdGVtIGFuZCBzeXNsb2cgdXNlIHRoZXNlIHNvY2tldHMgZXZlbiBpZiB5b3VyCisJICBtYWNoaW5lIGlzIG5vdCBjb25uZWN0ZWQgdG8gYW55IG5ldHdvcmsuICBVbmxlc3MgeW91IGFyZSB3b3JraW5nIG9uCisJICBhbiBlbWJlZGRlZCBzeXN0ZW0gb3Igc29tZXRoaW5nIHNpbWlsYXIsIHlvdSB0aGVyZWZvcmUgZGVmaW5pdGVseQorCSAgd2FudCB0byBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB1bml4LiAgTm90ZSB0aGF0IHNldmVyYWwgaW1wb3J0YW50IHNlcnZpY2VzIHdvbid0IHdvcmsKKwkgIGNvcnJlY3RseSBpZiB5b3Ugc2F5IE0gaGVyZSBhbmQgdGhlbiBuZWdsZWN0IHRvIGxvYWQgdGhlIG1vZHVsZS4KKworCSAgU2F5IFkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKwpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jCmluZGV4IGM0MjBlYmEuLmQ0MDNlMzQgMTAwNjQ0Ci0tLSBhL25ldC91bml4L2FmX3VuaXguYworKysgYi9uZXQvdW5peC9hZl91bml4LmMKQEAgLTMwMiw3ICszMDIsNyBAQAogICogbWF5IHJlY2VpdmUgbWVzc2FnZXMgb25seSBmcm9tIHRoYXQgcGVlci4gKi8KIHN0YXRpYyB2b2lkIHVuaXhfZGdyYW1fZGlzY29ubmVjdGVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKm90aGVyKQogewotCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkpIHsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CiAJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZ1bml4X3NrKHNrKS0+cGVlcl93YWl0KTsKIApAQCAtMTYxOSw3ICsxNjE5LDcgQEAKIAlmb3IgKDs7KSB7CiAJCXByZXBhcmVfdG9fd2FpdChzay0+c2tfc2xlZXAsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0JCWlmIChza2JfcXVldWVfbGVuKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSkgfHwKKwkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSB8fAogCQkgICAgc2stPnNrX2VyciB8fAogCQkgICAgKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgfHwKIAkJICAgIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8CmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL0tjb25maWcgYi9uZXQvd2Fucm91dGVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRlYmUxYwotLS0gL2Rldi9udWxsCisrKyBiL25ldC93YW5yb3V0ZXIvS2NvbmZpZwpAQCAtMCwwICsxLDI5IEBACisjCisjIENvbmZpZ3VyYXRpb24gZm9yIFdBTiByb3V0ZXIKKyMKKworY29uZmlnIFdBTl9ST1VURVIKKwl0cmlzdGF0ZSAiV0FOIHJvdXRlciIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFdpZGUgQXJlYSBOZXR3b3JrcyAoV0FOcyksIHN1Y2ggYXMgWC4yNSwgZnJhbWUgcmVsYXkgYW5kIGxlYXNlZAorCSAgbGluZXMsIGFyZSB1c2VkIHRvIGludGVyY29ubmVjdCBMb2NhbCBBcmVhIE5ldHdvcmtzIChMQU5zKSBvdmVyIHZhc3QKKwkgIGRpc3RhbmNlcyB3aXRoIGRhdGEgdHJhbnNmZXIgcmF0ZXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aG9zZQorCSAgYWNoaWV2YWJsZSB3aXRoIGNvbW1vbmx5IHVzZWQgYXN5bmNocm9ub3VzIG1vZGVtIGNvbm5lY3Rpb25zLgorCSAgVXN1YWxseSwgYSBxdWl0ZSBleHBlbnNpdmUgZXh0ZXJuYWwgZGV2aWNlIGNhbGxlZCBhIGBXQU4gcm91dGVyJyBpcworCSAgbmVlZGVkIHRvIGNvbm5lY3QgdG8gYSBXQU4uCisKKwkgIEFzIGFuIGFsdGVybmF0aXZlLCBXQU4gcm91dGluZyBjYW4gYmUgYnVpbHQgaW50byB0aGUgTGludXgga2VybmVsLgorCSAgV2l0aCByZWxhdGl2ZWx5IGluZXhwZW5zaXZlIFdBTiBpbnRlcmZhY2UgY2FyZHMgYXZhaWxhYmxlIG9uIHRoZQorCSAgbWFya2V0LCBhIHBlcmZlY3RseSB1c2FibGUgcm91dGVyIGNhbiBiZSBidWlsdCBmb3IgbGVzcyB0aGFuIGhhbGYKKwkgIHRoZSBwcmljZSBvZiBhbiBleHRlcm5hbCByb3V0ZXIuICBJZiB5b3UgaGF2ZSBvbmUgb2YgdGhvc2UgY2FyZHMgYW5kCisJICB3aXNoIHRvIHVzZSB5b3VyIExpbnV4IGJveCBhcyBhIFdBTiByb3V0ZXIsIHNheSBZIGhlcmUgYW5kIGFsc28gdG8KKwkgIHRoZSBXQU4gZHJpdmVyIGZvciB5b3VyIGNhcmQsIGJlbG93LiAgWW91IHdpbGwgdGhlbiBuZWVkIHRoZQorCSAgd2FuLXRvb2xzIHBhY2thZ2Ugd2hpY2ggaXMgYXZhaWxhYmxlIGZyb20gPGZ0cDovL2Z0cC5zYW5nb21hLmNvbS8+LgorCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvd2FuLXJvdXRlci50eHQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSBXQU4gcm91dGluZyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3YW5yb3V0ZXIuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9uZXQvd2Fucm91dGVyL3dhbm1haW4uYyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCmluZGV4IGQ2ODQ0YWMuLjEzYjY1MGEgMTAwNjQ0Ci0tLSBhL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCisrKyBiL25ldC93YW5yb3V0ZXIvd2FubWFpbi5jCkBAIC0zNTgsMTAgKzM1OCwxMCBAQAogICovCiAKIAotdW5zaWduZWQgc2hvcnQgd2Fucm91dGVyX3R5cGVfdHJhbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK19fYmUxNiB3YW5yb3V0ZXJfdHlwZV90cmFucyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBjbnQgPSBza2ItPmRhdGFbMF0gPyAwIDogMTsJLyogdGhlcmUgbWF5IGJlIGEgcGFkIHByZXNlbnQgKi8KLQl1bnNpZ25lZCBzaG9ydCBldGhlcnR5cGU7CisJX19iZTE2IGV0aGVydHlwZTsKIAogCXN3aXRjaCAoc2tiLT5kYXRhW2NudF0pIHsKIAljYXNlIE5MUElEX0lQOgkJLyogSVAgZGF0YWdyYW1tICovCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJCQlza2ItPmRhdGFbY250KzNdLCBkZXYtPm5hbWUpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJZXRoZXJ0eXBlID0gKigodW5zaWduZWQgc2hvcnQqKSZza2ItPmRhdGFbY250KzRdKTsKKwkJZXRoZXJ0eXBlID0gKigoX19iZTE2Kikmc2tiLT5kYXRhW2NudCs0XSk7CiAJCWNudCArPSA2OwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvbmV0L3gyNS9LY29uZmlnIGIvbmV0L3gyNS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQveDI1L0tjb25maWcKQEAgLTAsMCArMSwzNiBAQAorIworIyBDQ0lUVCBYLjI1IFBhY2tldCBMYXllcgorIworCitjb25maWcgWDI1CisJdHJpc3RhdGUgIkNDSVRUIFguMjUgUGFja2V0IExheWVyIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJLS0taGVscC0tLQorCSAgWC4yNSBpcyBhIHNldCBvZiBzdGFuZGFyZGl6ZWQgbmV0d29yayBwcm90b2NvbHMsIHNpbWlsYXIgaW4gc2NvcGUgdG8KKwkgIGZyYW1lIHJlbGF5OyB0aGUgb25lIHBoeXNpY2FsIGxpbmUgZnJvbSB5b3VyIGJveCB0byB0aGUgWC4yNSBuZXR3b3JrCisJICBlbnRyeSBwb2ludCBjYW4gY2Fycnkgc2V2ZXJhbCBsb2dpY2FsIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zCisJICAoY2FsbGVkICJ2aXJ0dWFsIGNpcmN1aXRzIikgdG8gb3RoZXIgY29tcHV0ZXJzIGNvbm5lY3RlZCB0byB0aGUgWC4yNQorCSAgbmV0d29yay4gR292ZXJubWVudHMsIGJhbmtzLCBhbmQgb3RoZXIgb3JnYW5pemF0aW9ucyB0ZW5kIHRvIHVzZSBpdAorCSAgdG8gY29ubmVjdCB0byBlYWNoIG90aGVyIG9yIHRvIGZvcm0gV2lkZSBBcmVhIE5ldHdvcmtzIChXQU5zKS4gTWFueQorCSAgY291bnRyaWVzIGhhdmUgcHVibGljIFguMjUgbmV0d29ya3MuIFguMjUgY29uc2lzdHMgb2YgdHdvCisJICBwcm90b2NvbHM6IHRoZSBoaWdoZXIgbGV2ZWwgUGFja2V0IExheWVyIFByb3RvY29sIChQTFApIChzYXkgWSBoZXJlCisJICBpZiB5b3Ugd2FudCB0aGF0KSBhbmQgdGhlIGxvd2VyIGxldmVsIGRhdGEgbGluayBsYXllciBwcm90b2NvbCBMQVBCCisJICAoc2F5IFkgdG8gIkxBUEIgRGF0YSBMaW5rIERyaXZlciIgYmVsb3cgaWYgeW91IHdhbnQgdGhhdCkuCisKKwkgIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IFguMjUgYXQgPGh0dHA6Ly93d3cuc2FuZ29tYS5jb20veDI1Lmh0bT4gYW5kCisJICA8aHR0cDovL3d3dy5jaXNjby5jb20vdW5pdmVyY2QvY2MvdGQvZG9jL3Byb2R1Y3Qvc29mdHdhcmUvaW9zMTEvY2Jvb2svY3gyNS5odG0+LgorCSAgSW5mb3JtYXRpb24gYWJvdXQgWC4yNSBmb3IgTGludXggaXMgY29udGFpbmVkIGluIHRoZSBmaWxlcworCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS50eHQ+IGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3gyNS1pZmFjZS50eHQ+LgorCisJICBPbmUgY29ubmVjdHMgdG8gYW4gWC4yNSBuZXR3b3JrIGVpdGhlciB3aXRoIGEgZGVkaWNhdGVkIG5ldHdvcmsgY2FyZAorCSAgdXNpbmcgdGhlIFguMjEgcHJvdG9jb2wgKG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IExpbnV4KSBvciBvbmUgY2FuIGRvCisJICBYLjI1IG92ZXIgYSBzdGFuZGFyZCB0ZWxlcGhvbmUgbGluZSB1c2luZyBhbiBvcmRpbmFyeSBtb2RlbSAoc2F5IFkKKwkgIHRvICJYLjI1IGFzeW5jIGRyaXZlciIgYmVsb3cpIG9yIG92ZXIgRXRoZXJuZXQgdXNpbmcgYW4gb3JkaW5hcnkKKwkgIEV0aGVybmV0IGNhcmQgYW5kIHRoZSBMQVBCIG92ZXIgRXRoZXJuZXQgKHNheSBZIHRvICJMQVBCIERhdGEgTGluaworCSAgRHJpdmVyIiBhbmQgIkxBUEIgb3ZlciBFdGhlcm5ldCBkcml2ZXIiIGJlbG93KS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgeDI1LiBJZiB1bnN1cmUsIHNheSBOLgorCisKZGlmZiAtLWdpdCBhL25ldC94ZnJtL0tjb25maWcgYi9uZXQveGZybS9LY29uZmlnCmluZGV4IDU4Y2E2YTkuLjBjMWMwNDMgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL0tjb25maWcKKysrIGIvbmV0L3hmcm0vS2NvbmZpZwpAQCAtMSw2ICsxLDEwIEBACiAjCiAjIFhGUk0gY29uZmlndXJhdGlvbgogIworY29uZmlnIFhGUk0KKyAgICAgICBib29sCisgICAgICAgZGVwZW5kcyBvbiBORVQKKwogY29uZmlnIFhGUk1fVVNFUgogCXRyaXN0YXRlICJJUHNlYyB1c2VyIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIgogCWRlcGVuZHMgb24gSU5FVCAmJiBYRlJNCkBAIC0xMCwzICsxNCwxNCBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgTkVUX0tFWQorCXRyaXN0YXRlICJQRl9LRVkgc29ja2V0cyIKKwlzZWxlY3QgWEZSTQorCS0tLWhlbHAtLS0KKwkgIFBGX0tFWXYyIHNvY2tldCBmYW1pbHksIGNvbXBhdGlibGUgdG8gS0FNRSBvbmVzLgorCSAgVGhleSBhcmUgcmVxdWlyZWQgaWYgeW91IGFyZSBnb2luZyB0byB1c2UgSVBzZWMgdG9vbHMgcG9ydGVkCisJICBmcm9tIEtBTUUuCisKKwkgIFNheSBZIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMgYi9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYwppbmRleCA4Y2E3ZWNkLi5jYjAyYmFhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYworKysgYi9zY3JpcHRzL2Jhc2ljL2RvY3Byb2MuYwpAQCAtNTIsNyArNTIsNyBAQAogRklMRU9OTFkgKmV4dGVybmFsZnVuY3Rpb25zOwogRklMRU9OTFkgKnN5bWJvbHNvbmx5OwogCi10eXBlZGVmIHZvaWQgRklMRUxJTkUoY2hhciAqIGZpbGUsIHNpZ25lZCBjaGFyICogbGluZSk7Cit0eXBlZGVmIHZvaWQgRklMRUxJTkUoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKTsKIEZJTEVMSU5FICogc2luZ2xlZnVuY3Rpb25zOwogRklMRUxJTkUgKiBlbnRpdHlfc3lzdGVtOwogCkBAIC0xNDgsOSArMTQ4LDkgQEAKICAqIEZpbGVzIGFyZSBzZXBhcmF0ZWQgYnkgdGFicy4KICAqLwogdm9pZCBhZGRkZXAoY2hhciAqIGZpbGUpCQkgICB7IHByaW50ZigiXHQlcyIsIGZpbGUpOyB9Ci12b2lkIGFkZGRlcDIoY2hhciAqIGZpbGUsIHNpZ25lZCBjaGFyICogbGluZSkgICAgIHsgbGluZSA9IGxpbmU7IGFkZGRlcChmaWxlKTsgfQordm9pZCBhZGRkZXAyKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICAgIHsgbGluZSA9IGxpbmU7IGFkZGRlcChmaWxlKTsgfQogdm9pZCBub2FjdGlvbihjaGFyICogbGluZSkJCSAgIHsgbGluZSA9IGxpbmU7IH0KLXZvaWQgbm9hY3Rpb24yKGNoYXIgKiBmaWxlLCBzaWduZWQgY2hhciAqIGxpbmUpICAgeyBmaWxlID0gZmlsZTsgbGluZSA9IGxpbmU7IH0KK3ZvaWQgbm9hY3Rpb24yKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQogCiAvKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8KIHZvaWQgcHJpbnRsaW5lKGNoYXIgKiBsaW5lKSAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlcyIsIGxpbmUpOyB9CkBAIC0xNzksOCArMTc5LDggQEAKIAkJCXBlcnJvcihyZWFsX2ZpbGVuYW1lKTsKIAkJfQogCQl3aGlsZShmZ2V0cyhsaW5lLCBNQVhMSU5FU1osIGZwKSkgewotCQkJc2lnbmVkIGNoYXIgKnA7Ci0JCQlzaWduZWQgY2hhciAqZTsKKwkJCWNoYXIgKnA7CisJCQljaGFyICplOwogCQkJaWYgKCgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTF9HUEwiKSkgIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHAgPSBzdHJzdHIobGluZSwgIkVYUE9SVF9TWU1CT0wiKSkgIT0gMCkpIHsKIAkJCQkvKiBTa2lwIEVYUE9SVF9TWU1CT0x7X0dQTH0gKi8KQEAgLTI1Myw3ICsyNTMsNyBAQAogICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQogICovCi12b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgc2lnbmVkIGNoYXIgKiBsaW5lKQordm9pZCBzaW5nZnVuYyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiBsaW5lKQogewogCWNoYXIgKnZlY1syMDBdOyAvKiBFbm91Z2ggZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAqLwogICAgICAgICBpbnQgaSwgaWR4ID0gMDsKQEAgLTI5MCw3ICsyOTAsNyBAQAogdm9pZCBwYXJzZV9maWxlKEZJTEUgKmluZmlsZSkKIHsKIAljaGFyIGxpbmVbTUFYTElORVNaXTsKLQlzaWduZWQgY2hhciAqIHM7CisJY2hhciAqIHM7CiAJd2hpbGUoZmdldHMobGluZSwgTUFYTElORVNaLCBpbmZpbGUpKSB7CiAJCWlmIChsaW5lWzBdID09ICchJykgewogCQkJcyA9IGxpbmUgKyAyOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9maXhkZXAuYyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKaW5kZXggN2Y0MmM1ZC4uMGI2MWJlYSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9iYXNpYy9maXhkZXAuYworKysgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCkBAIC0yMTIsMjMgKzIxMiwyMyBAQAogCQlpZiAoKnAgPT0gJ18nKQogCQkJKnAgPSAnLyc7CiAJCWVsc2UKLQkJCSpwID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqcCk7CisJCQkqcCA9IHRvbG93ZXIoKGludCkqcCk7CiAJfQogCXByaW50ZigiICAgICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvJXMuaCkgXFxcbiIsIHMpOwogfQogCi12b2lkIHBhcnNlX2NvbmZpZ19maWxlKHNpZ25lZCBjaGFyICptYXAsIHNpemVfdCBsZW4pCit2b2lkIHBhcnNlX2NvbmZpZ19maWxlKGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKIHsKIAlpbnQgKmVuZCA9IChpbnQgKikgKG1hcCArIGxlbik7CiAJLyogc3RhcnQgYXQgKzEsIHNvIHRoYXQgcCBjYW4gbmV2ZXIgYmUgPCBtYXAgKi8KIAlpbnQgKm0gICA9IChpbnQgKikgbWFwICsgMTsKLQlzaWduZWQgY2hhciAqcCwgKnE7CisJY2hhciAqcCwgKnE7CiAKIAlmb3IgKDsgbSA8IGVuZDsgbSsrKSB7Ci0JCWlmICgqbSA9PSBJTlRfQ09ORikgeyBwID0gKHNpZ25lZCBjaGFyICopIG0gIDsgZ290byBjb25mOyB9Ci0JCWlmICgqbSA9PSBJTlRfT05GSSkgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMTsgZ290byBjb25mOyB9Ci0JCWlmICgqbSA9PSBJTlRfTkZJRykgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMjsgZ290byBjb25mOyB9Ci0JCWlmICgqbSA9PSBJTlRfRklHXykgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMzsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfQ09ORikgeyBwID0gKGNoYXIgKikgbSAgOyBnb3RvIGNvbmY7IH0KKwkJaWYgKCptID09IElOVF9PTkZJKSB7IHAgPSAoY2hhciAqKSBtLTE7IGdvdG8gY29uZjsgfQorCQlpZiAoKm0gPT0gSU5UX05GSUcpIHsgcCA9IChjaGFyICopIG0tMjsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfRklHXykgeyBwID0gKGNoYXIgKikgbS0zOyBnb3RvIGNvbmY7IH0KIAkJY29udGludWU7CiAJY29uZjoKIAkJaWYgKHAgPiBtYXAgKyBsZW4gLSA3KQpAQCAtMjkxLDkgKzI5MSw5IEBACiAKIHZvaWQgcGFyc2VfZGVwX2ZpbGUodm9pZCAqbWFwLCBzaXplX3QgbGVuKQogewotCXNpZ25lZCBjaGFyICptID0gbWFwOwotCXNpZ25lZCBjaGFyICplbmQgPSBtICsgbGVuOwotCXNpZ25lZCBjaGFyICpwOworCWNoYXIgKm0gPSBtYXA7CisJY2hhciAqZW5kID0gbSArIGxlbjsKKwljaGFyICpwOwogCWNoYXIgc1tQQVRIX01BWF07CiAKIAlwID0gc3RyY2hyKG0sICc6Jyk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYyBiL3NjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZS5jCmluZGV4IDYwZmM0ZDguLjQ1OWM0NTI3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYworKysgYi9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgLyogUmVhZCBjb25maWcgbGluZXMuICovCiAgICAgd2hpbGUgKGZnZXRzKGxpbmUsIGJ1ZmZlcl9zaXplLCBmcF9jb25maWcpKQogICAgIHsKLQljb25zdCBzaWduZWQgY2hhciAqIHN0cl9jb25maWc7CisJY29uc3QgY2hhciAqIHN0cl9jb25maWc7CiAJaW50IGlzX3NhbWU7CiAJaW50IGl0YXJnZXQ7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IDcwZTcyNjQuLmJjMjBjYWIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMzEsMTQgKzMxLDE0IEBACiBzdGF0aWMgaW50IGluZGVudCA9IDE7CiBzdGF0aWMgaW50IHZhbGlkX3N0ZGluID0gMTsKIHN0YXRpYyBpbnQgY29uZl9jbnQ7Ci1zdGF0aWMgc2lnbmVkIGNoYXIgbGluZVsxMjhdOworc3RhdGljIGNoYXIgbGluZVsxMjhdOwogc3RhdGljIHN0cnVjdCBtZW51ICpyb290RW50cnk7CiAKIHN0YXRpYyBjaGFyIG5vaGVscF90ZXh0W10gPSBOXygiU29ycnksIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiB5ZXQuXG4iKTsKIAotc3RhdGljIHZvaWQgc3RyaXAoc2lnbmVkIGNoYXIgKnN0cikKK3N0YXRpYyB2b2lkIHN0cmlwKGNoYXIgKnN0cikKIHsKLQlzaWduZWQgY2hhciAqcCA9IHN0cjsKKwljaGFyICpwID0gc3RyOwogCWludCBsOwogCiAJd2hpbGUgKChpc3NwYWNlKCpwKSkpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZmRhdGEuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCmluZGV4IDI3NTVjNDUuLjAyZjY3MGMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0yNywxMCArMjcsMTAgQEAKIAlOVUxMLAogfTsKIAotc3RhdGljIGNoYXIgKmNvbmZfZXhwYW5kX3ZhbHVlKGNvbnN0IHNpZ25lZCBjaGFyICppbikKK3N0YXRpYyBjaGFyICpjb25mX2V4cGFuZF92YWx1ZShjb25zdCBjaGFyICppbikKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpzeW07Ci0JY29uc3Qgc2lnbmVkIGNoYXIgKnNyYzsKKwljb25zdCBjaGFyICpzcmM7CiAJc3RhdGljIGNoYXIgcmVzX3ZhbHVlW1NZTUJPTF9NQVhMRU5HVEhdOwogCWNoYXIgKmRzdCwgbmFtZVtTWU1CT0xfTUFYTEVOR1RIXTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwppbmRleCBlNWRiMTBjLi40NTdiZWMyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KIAogI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKQEAgLTI1NCw4ICsyNTUsOCBAQAogCSIgICAgICAgICAgVVNCJCA9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgZW5kaW5nIHdpdGggVVNCXG4iCiAJIlxuIik7CiAKLXN0YXRpYyBzaWduZWQgY2hhciBidWZbNDA5Nl0sICpidWZwdHIgPSBidWY7Ci1zdGF0aWMgc2lnbmVkIGNoYXIgaW5wdXRfYnVmWzQwOTZdOworc3RhdGljIGNoYXIgYnVmWzQwOTZdLCAqYnVmcHRyID0gYnVmOworc3RhdGljIGNoYXIgaW5wdXRfYnVmWzQwOTZdOwogc3RhdGljIGNoYXIgZmlsZW5hbWVbUEFUSF9NQVgrMV0gPSAiLmNvbmZpZyI7CiBzdGF0aWMgY2hhciAqYXJnc1sxMDI0XSwgKiphcmdwdHIgPSBhcmdzOwogc3RhdGljIGludCBpbmRlbnQ7CmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKaW5kZXggMzIxOTdlZi4uNTE4MDQwNSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCisrKyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2VuZGlmCiAKKyNpbmNsdWRlIDxjdHlwZS5oPgorCiB0eXBlZGVmIHVpbnQzMl90CV9fdTMyOwogdHlwZWRlZiB1aW50MTZfdAlfX3UxNjsKIHR5cGVkZWYgdW5zaWduZWQgY2hhcglfX3U4OwpAQCAtMjg3LDYgKzI4OSw1OCBAQAogCXJldHVybiAxOwogfQogCisvKiBMb29rcyBsaWtlOiBwY21jaWE6bU5jTmZOZm5OcGZuTnZhTnZiTnZjTnZkTi4gKi8KK3N0YXRpYyBpbnQgZG9fcGNtY2lhX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJICAgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlkLT5tYW5mX2lkID0gVE9fTkFUSVZFKGlkLT5tYW5mX2lkKTsKKwlpZC0+Y2FyZF9pZCA9IFRPX05BVElWRShpZC0+Y2FyZF9pZCk7CisJaWQtPmZ1bmNfaWQgPSBUT19OQVRJVkUoaWQtPmZ1bmNfaWQpOworCWlkLT5mdW5jdGlvbiA9IFRPX05BVElWRShpZC0+ZnVuY3Rpb24pOworCWlkLT5kZXZpY2Vfbm8gPSBUT19OQVRJVkUoaWQtPmRldmljZV9ubyk7CisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCWlkLT5wcm9kX2lkX2hhc2hbaV0gPSBUT19OQVRJVkUoaWQtPnByb2RfaWRfaGFzaFtpXSk7CisgICAgICAgfQorCisgICAgICAgc3RyY3B5KGFsaWFzLCAicGNtY2lhOiIpOworICAgICAgIEFERChhbGlhcywgIm0iLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUQsCisJICAgaWQtPm1hbmZfaWQpOworICAgICAgIEFERChhbGlhcywgImMiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUQsCisJICAgaWQtPmNhcmRfaWQpOworICAgICAgIEFERChhbGlhcywgImYiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX0ZVTkNfSUQsCisJICAgaWQtPmZ1bmNfaWQpOworICAgICAgIEFERChhbGlhcywgImZuIiwgaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9GVU5DVElPTiwKKwkgICBpZC0+ZnVuY3Rpb24pOworICAgICAgIEFERChhbGlhcywgInBmbiIsIGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfREVWSUNFX05PLAorCSAgIGlkLT5kZXZpY2Vfbm8pOworICAgICAgIEFERChhbGlhcywgInBhIiwgaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMSwgaWQtPnByb2RfaWRfaGFzaFswXSk7CisgICAgICAgQUREKGFsaWFzLCAicGIiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBQQ01DSUFfREVWX0lEX01BVENIX1BST0RfSUQyLCBpZC0+cHJvZF9pZF9oYXNoWzFdKTsKKyAgICAgICBBREQoYWxpYXMsICJwYyIsIGlkLT5tYXRjaF9mbGFncyAmIFBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDMsIGlkLT5wcm9kX2lkX2hhc2hbMl0pOworICAgICAgIEFERChhbGlhcywgInBkIiwgaWQtPm1hdGNoX2ZsYWdzICYgUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lENCwgaWQtPnByb2RfaWRfaGFzaFszXSk7CisKKyAgICAgICByZXR1cm4gMTsKK30KKworCisKK3N0YXRpYyBpbnQgZG9fb2ZfZW50cnkgKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZiwgY2hhciAqYWxpYXMpCit7CisgICAgY2hhciAqdG1wOworICAgIHNwcmludGYgKGFsaWFzLCAib2Y6TiVzVCVzQyVzIiwKKyAgICAgICAgICAgICAgICAgICAgb2YtPm5hbWVbMF0gPyBvZi0+bmFtZSA6ICIqIiwKKyAgICAgICAgICAgICAgICAgICAgb2YtPnR5cGVbMF0gPyBvZi0+dHlwZSA6ICIqIiwKKyAgICAgICAgICAgICAgICAgICAgb2YtPmNvbXBhdGlibGVbMF0gPyBvZi0+Y29tcGF0aWJsZSA6ICIqIik7CisKKyAgICAvKiBSZXBsYWNlIGFsbCB3aGl0ZXNwYWNlIHdpdGggdW5kZXJzY29yZXMgKi8KKyAgICBmb3IgKHRtcCA9IGFsaWFzOyB0bXAgJiYgKnRtcDsgdG1wKyspCisgICAgICAgIGlmIChpc3NwYWNlICgqdG1wKSkKKyAgICAgICAgICAgICp0bXAgPSAnXyc7CisKKyAgICByZXR1cm4gMTsKK30KKwogLyogSWdub3JlIGFueSBwcmVmaXgsIGVnLiB2ODUwIHByZXBlbmRzIF8gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHN5bV9pcyhjb25zdCBjaGFyICpzeW1ib2wsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0zNjIsNiArNDE2LDEzIEBACiAJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9wbnBfY2FyZF9kZXZpY2VfdGFibGUiKSkKIAkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkKSwKIAkJCSBkb19wbnBfY2FyZF9lbnRyeSwgbW9kKTsKKwllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX3BjbWNpYV9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3QgcGNtY2lhX2RldmljZV9pZCksCisJCQkgZG9fcGNtY2lhX2VudHJ5LCBtb2QpOworICAgICAgICBlbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX29mX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBvZl9kZXZpY2VfaWQpLAorCQkJIGRvX29mX2VudHJ5LCBtb2QpOworCiB9CiAKIC8qIE5vdyBhZGQgb3V0IGJ1ZmZlcmVkIGluZm9ybWF0aW9uIHRvIHRoZSBnZW5lcmF0ZWQgQyBzb3VyY2UgKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvTWFrZWZpbGUgYi9zZWN1cml0eS9rZXlzL01ha2VmaWxlCmluZGV4IGRkYjQ5NWQ2Li5jMzkyZDc1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL01ha2VmaWxlCisrKyBiL3NlY3VyaXR5L2tleXMvTWFrZWZpbGUKQEAgLTcsOCArNyw5IEBACiAJa2V5cmluZy5vIFwKIAlrZXljdGwubyBcCiAJcHJvY2Vzc19rZXlzLm8gXAotCXVzZXJfZGVmaW5lZC5vIFwKLQlyZXF1ZXN0X2tleS5vCisJcmVxdWVzdF9rZXkubyBcCisJcmVxdWVzdF9rZXlfYXV0aC5vIFwKKwl1c2VyX2RlZmluZWQubwogCiBvYmotJChDT05GSUdfS0VZU19DT01QQVQpICs9IGNvbXBhdC5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2NvbXBhdC5jIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwppbmRleCBhZmY4YjIyLi4zMzAzNjczIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCisrKyBiL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKQEAgLTEsNiArMSw2IEBACiAvKiBjb21wYXQuYzogMzItYml0IGNvbXBhdGliaWxpdHkgc3lzY2FsbCBmb3IgNjQtYml0IHN5c3RlbXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTI0LDcgKzI0LDcgQEAKICAqIC0gaWYgeW91IGNhbiwgeW91IHNob3VsZCBjYWxsIHN5c19rZXljdGwgZGlyZWN0bHkKICAqLwogYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfa2V5Y3RsKHUzMiBvcHRpb24sCi0JCQkgICAgICB1MzIgYXJnMiwgdTMyIGFyZzMsIHUzMiBhcmc0LCB1MzIgYXJnNSkKKwkJCQkgIHUzMiBhcmcyLCB1MzIgYXJnMywgdTMyIGFyZzQsIHUzMiBhcmc1KQogewogCXN3aXRjaCAob3B0aW9uKSB7CiAJY2FzZSBLRVlDVExfR0VUX0tFWVJJTkdfSUQ6CkBAIC03MSw2ICs3MSw5IEBACiAJY2FzZSBLRVlDVExfTkVHQVRFOgogCQlyZXR1cm4ga2V5Y3RsX25lZ2F0ZV9rZXkoYXJnMiwgYXJnMywgYXJnNCk7CiAKKwljYXNlIEtFWUNUTF9TRVRfUkVRS0VZX0tFWVJJTkc6CisJCXJldHVybiBrZXljdGxfc2V0X3JlcWtleV9rZXlyaW5nKGFyZzIpOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaCBiL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaAppbmRleCA2N2IyYjkzLi40NmM4NjAyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2ludGVybmFsLmgKKysrIGIvc2VjdXJpdHkva2V5cy9pbnRlcm5hbC5oCkBAIC0xLDYgKzEsNiBAQAogLyogaW50ZXJuYWwuaDogYXV0aGVudGljYXRpb24gdG9rZW4gYW5kIGFjY2VzcyBrZXkgbWFuYWdlbWVudCBpbnRlcm5hbCBkZWZzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMy01IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0xNSw2ICsxNSwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tleS5oPgogI2luY2x1ZGUgPGxpbnV4L2tleS11aS5oPgogCisjaWYgMAorI2RlZmluZSBrZW50ZXIoRk1ULCBhLi4uKQlwcmludGsoIj09PiAlcygiRk1UIilcbiIsX19GVU5DVElPTl9fICwgIyMgYSkKKyNkZWZpbmUga2xlYXZlKEZNVCwgYS4uLikJcHJpbnRrKCI8PT0gJXMoKSJGTVQiXG4iLF9fRlVOQ1RJT05fXyAsICMjIGEpCisjZGVmaW5lIGtkZWJ1ZyhGTVQsIGEuLi4pCXByaW50ayhGTVQiXG4iICwgIyMgYSkKKyNlbHNlCisjZGVmaW5lIGtlbnRlcihGTVQsIGEuLi4pCWRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGtsZWF2ZShGTVQsIGEuLi4pCWRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGtkZWJ1ZyhGTVQsIGEuLi4pCWRvIHt9IHdoaWxlKDApCisjZW5kaWYKKwogZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9kZWFkOwogZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV91c2VyOwogCkBAIC02NiwyMCArNzYsNDYgQEAKIAkJCQkJY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCiAJCQkJCWtleV9wZXJtX3QgcGVybSk7CiAKK2V4dGVybiBzdHJ1Y3Qga2V5ICprZXlyaW5nX3NlYXJjaF9pbnN0a2V5KHN0cnVjdCBrZXkgKmtleXJpbmcsCisJCQkJCSAga2V5X3NlcmlhbF90IHRhcmdldF9pZCk7CisKIHR5cGVkZWYgaW50ICgqa2V5X21hdGNoX2Z1bmNfdCkoY29uc3Qgc3RydWN0IGtleSAqLCBjb25zdCB2b2lkICopOwogCiBleHRlcm4gc3RydWN0IGtleSAqa2V5cmluZ19zZWFyY2hfYXV4KHN0cnVjdCBrZXkgKmtleXJpbmcsCisJCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJICAgICAgc3RydWN0IGtleV90eXBlICp0eXBlLAogCQkJCSAgICAgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAogCQkJCSAgICAgIGtleV9tYXRjaF9mdW5jX3QgbWF0Y2gpOwogCi1leHRlcm4gc3RydWN0IGtleSAqc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3NfYXV4KHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKLQkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAotCQkJCQkgICAgICAga2V5X21hdGNoX2Z1bmNfdCBtYXRjaCk7CitleHRlcm4gc3RydWN0IGtleSAqc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3Moc3RydWN0IGtleV90eXBlICp0eXBlLAorCQkJCQkgICBjb25zdCB2b2lkICpkZXNjcmlwdGlvbiwKKwkJCQkJICAga2V5X21hdGNoX2Z1bmNfdCBtYXRjaCwKKwkJCQkJICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCiBleHRlcm4gc3RydWN0IGtleSAqZmluZF9rZXlyaW5nX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwga2V5X3NlcmlhbF90IGJvdW5kKTsKIAogZXh0ZXJuIGludCBpbnN0YWxsX3RocmVhZF9rZXlyaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKK2V4dGVybiBpbnQgaW5zdGFsbF9wcm9jZXNzX2tleXJpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCitleHRlcm4gc3RydWN0IGtleSAqcmVxdWVzdF9rZXlfYW5kX2xpbmsoc3RydWN0IGtleV90eXBlICp0eXBlLAorCQkJCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKKwkJCQkJY29uc3QgY2hhciAqY2FsbG91dF9pbmZvLAorCQkJCQlzdHJ1Y3Qga2V5ICpkZXN0X2tleXJpbmcpOworCisvKgorICogcmVxdWVzdF9rZXkgYXV0aG9yaXNhdGlvbgorICovCitzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCB7CisJc3RydWN0IGtleQkJKnRhcmdldF9rZXk7CisJc3RydWN0IHRhc2tfc3RydWN0CSpjb250ZXh0OworCXBpZF90CQkJcGlkOworfTsKKworZXh0ZXJuIHN0cnVjdCBrZXlfdHlwZSBrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoOworZXh0ZXJuIHN0cnVjdCBrZXkgKnJlcXVlc3Rfa2V5X2F1dGhfbmV3KHN0cnVjdCBrZXkgKnRhcmdldCwKKwkJCQkJc3RydWN0IGtleSAqKl9ya2FrZXkpOworCitleHRlcm4gc3RydWN0IGtleSAqa2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoa2V5X3NlcmlhbF90IHRhcmdldF9pZCk7CiAKIC8qCiAgKiBrZXljdGwgZnVuY3Rpb25zCkBAIC0xMDAsNiArMTM2LDcgQEAKIGV4dGVybiBsb25nIGtleWN0bF9pbnN0YW50aWF0ZV9rZXkoa2V5X3NlcmlhbF90LCBjb25zdCB2b2lkIF9fdXNlciAqLAogCQkJCSAgIHNpemVfdCwga2V5X3NlcmlhbF90KTsKIGV4dGVybiBsb25nIGtleWN0bF9uZWdhdGVfa2V5KGtleV9zZXJpYWxfdCwgdW5zaWduZWQsIGtleV9zZXJpYWxfdCk7CitleHRlcm4gbG9uZyBrZXljdGxfc2V0X3JlcWtleV9rZXlyaW5nKGludCk7CiAKIAogLyoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5LmMgYi9zZWN1cml0eS9rZXlzL2tleS5jCmluZGV4IDU5NDAyYzguLmZiODlmOTggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5LmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXkuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIGtleS5jOiBiYXNpYyBhdXRoZW50aWNhdGlvbiB0b2tlbiBhbmQgYWNjZXNzIGtleSBtYW5hZ2VtZW50CiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yOTQsNyArMjk0LDYgQEAKIAl9CiAKIAlhdG9taWNfc2V0KCZrZXktPnVzYWdlLCAxKTsKLQlyd2xvY2tfaW5pdCgma2V5LT5sb2NrKTsKIAlpbml0X3J3c2VtKCZrZXktPnNlbSk7CiAJa2V5LT50eXBlID0gdHlwZTsKIAlrZXktPnVzZXIgPSB1c2VyOwpAQCAtMzA4LDcgKzMwNyw3IEBACiAJa2V5LT5wYXlsb2FkLmRhdGEgPSBOVUxMOwogCiAJaWYgKCFub3RfaW5fcXVvdGEpCi0JCWtleS0+ZmxhZ3MgfD0gS0VZX0ZMQUdfSU5fUVVPVEE7CisJCWtleS0+ZmxhZ3MgfD0gMSA8PCBLRVlfRkxBR19JTl9RVU9UQTsKIAogCW1lbXNldCgma2V5LT50eXBlX2RhdGEsIDAsIHNpemVvZihrZXktPnR5cGVfZGF0YSkpOwogCkBAIC0zNTksNyArMzU4LDcgQEAKIAlrZXlfY2hlY2soa2V5KTsKIAogCS8qIGNvbnRlbXBsYXRlIHRoZSBxdW90YSBhZGp1c3RtZW50ICovCi0JaWYgKGRlbHRhICE9IDAgJiYga2V5LT5mbGFncyAmIEtFWV9GTEFHX0lOX1FVT1RBKSB7CisJaWYgKGRlbHRhICE9IDAgJiYgdGVzdF9iaXQoS0VZX0ZMQUdfSU5fUVVPVEEsICZrZXktPmZsYWdzKSkgewogCQlzcGluX2xvY2soJmtleS0+dXNlci0+bG9jayk7CiAKIAkJaWYgKGRlbHRhID4gMCAmJgpAQCAtMzkyLDcgKzM5MSw4IEBACiBzdGF0aWMgaW50IF9fa2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKHN0cnVjdCBrZXkgKmtleSwKIAkJCQkgICAgICBjb25zdCB2b2lkICpkYXRhLAogCQkJCSAgICAgIHNpemVfdCBkYXRhbGVuLAotCQkJCSAgICAgIHN0cnVjdCBrZXkgKmtleXJpbmcpCisJCQkJICAgICAgc3RydWN0IGtleSAqa2V5cmluZywKKwkJCQkgICAgICBzdHJ1Y3Qga2V5ICppbnN0a2V5KQogewogCWludCByZXQsIGF3YWtlbjsKIApAQCAtNDA1LDI3ICs0MDUsMjUgQEAKIAlkb3duX3dyaXRlKCZrZXlfY29uc3RydWN0aW9uX3NlbSk7CiAKIAkvKiBjYW4ndCBpbnN0YW50aWF0ZSB0d2ljZSAqLwotCWlmICghKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19JTlNUQU5USUFURUQpKSB7CisJaWYgKCF0ZXN0X2JpdChLRVlfRkxBR19JTlNUQU5USUFURUQsICZrZXktPmZsYWdzKSkgewogCQkvKiBpbnN0YW50aWF0ZSB0aGUga2V5ICovCiAJCXJldCA9IGtleS0+dHlwZS0+aW5zdGFudGlhdGUoa2V5LCBkYXRhLCBkYXRhbGVuKTsKIAogCQlpZiAocmV0ID09IDApIHsKIAkJCS8qIG1hcmsgdGhlIGtleSBhcyBiZWluZyBpbnN0YW50aWF0ZWQgKi8KLQkJCXdyaXRlX2xvY2soJmtleS0+bG9jayk7Ci0KIAkJCWF0b21pY19pbmMoJmtleS0+dXNlci0+bmlrZXlzKTsKLQkJCWtleS0+ZmxhZ3MgfD0gS0VZX0ZMQUdfSU5TVEFOVElBVEVEOworCQkJc2V0X2JpdChLRVlfRkxBR19JTlNUQU5USUFURUQsICZrZXktPmZsYWdzKTsKIAotCQkJaWYgKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCkgewotCQkJCWtleS0+ZmxhZ3MgJj0gfktFWV9GTEFHX1VTRVJfQ09OU1RSVUNUOworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCwgJmtleS0+ZmxhZ3MpKQogCQkJCWF3YWtlbiA9IDE7Ci0JCQl9Ci0KLQkJCXdyaXRlX3VubG9jaygma2V5LT5sb2NrKTsKIAogCQkJLyogYW5kIGxpbmsgaXQgaW50byB0aGUgZGVzdGluYXRpb24ga2V5cmluZyAqLwogCQkJaWYgKGtleXJpbmcpCiAJCQkJcmV0ID0gX19rZXlfbGluayhrZXlyaW5nLCBrZXkpOworCisJCQkvKiBkaXNhYmxlIHRoZSBhdXRob3Jpc2F0aW9uIGtleSAqLworCQkJaWYgKGluc3RrZXkpCisJCQkJa2V5X3Jldm9rZShpbnN0a2V5KTsKIAkJfQogCX0KIApAQCAtNDQ2LDE5ICs0NDQsMjEgQEAKIGludCBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoc3RydWN0IGtleSAqa2V5LAogCQkJICAgICBjb25zdCB2b2lkICpkYXRhLAogCQkJICAgICBzaXplX3QgZGF0YWxlbiwKLQkJCSAgICAgc3RydWN0IGtleSAqa2V5cmluZykKKwkJCSAgICAgc3RydWN0IGtleSAqa2V5cmluZywKKwkJCSAgICAgc3RydWN0IGtleSAqaW5zdGtleSkKIHsKIAlpbnQgcmV0OwogCiAJaWYgKGtleXJpbmcpCiAJCWRvd25fd3JpdGUoJmtleXJpbmctPnNlbSk7CiAKLQlyZXQgPSBfX2tleV9pbnN0YW50aWF0ZV9hbmRfbGluayhrZXksIGRhdGEsIGRhdGFsZW4sIGtleXJpbmcpOworCXJldCA9IF9fa2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKGtleSwgZGF0YSwgZGF0YWxlbiwga2V5cmluZywgaW5zdGtleSk7CiAKIAlpZiAoa2V5cmluZykKIAkJdXBfd3JpdGUoJmtleXJpbmctPnNlbSk7CiAKIAlyZXR1cm4gcmV0OworCiB9IC8qIGVuZCBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoKSAqLwogCiBFWFBPUlRfU1lNQk9MKGtleV9pbnN0YW50aWF0ZV9hbmRfbGluayk7CkBAIC00NjksNyArNDY5LDggQEAKICAqLwogaW50IGtleV9uZWdhdGVfYW5kX2xpbmsoc3RydWN0IGtleSAqa2V5LAogCQkJdW5zaWduZWQgdGltZW91dCwKLQkJCXN0cnVjdCBrZXkgKmtleXJpbmcpCisJCQlzdHJ1Y3Qga2V5ICprZXlyaW5nLAorCQkJc3RydWN0IGtleSAqaW5zdGtleSkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCWludCByZXQsIGF3YWtlbjsKQEAgLTQ4NiwyNiArNDg3LDI2IEBACiAJZG93bl93cml0ZSgma2V5X2NvbnN0cnVjdGlvbl9zZW0pOwogCiAJLyogY2FuJ3QgaW5zdGFudGlhdGUgdHdpY2UgKi8KLQlpZiAoIShrZXktPmZsYWdzICYgS0VZX0ZMQUdfSU5TVEFOVElBVEVEKSkgeworCWlmICghdGVzdF9iaXQoS0VZX0ZMQUdfSU5TVEFOVElBVEVELCAma2V5LT5mbGFncykpIHsKIAkJLyogbWFyayB0aGUga2V5IGFzIGJlaW5nIG5lZ2F0aXZlbHkgaW5zdGFudGlhdGVkICovCi0JCXdyaXRlX2xvY2soJmtleS0+bG9jayk7Ci0KIAkJYXRvbWljX2luYygma2V5LT51c2VyLT5uaWtleXMpOwotCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX0lOU1RBTlRJQVRFRCB8IEtFWV9GTEFHX05FR0FUSVZFOworCQlzZXRfYml0KEtFWV9GTEFHX05FR0FUSVZFLCAma2V5LT5mbGFncyk7CisJCXNldF9iaXQoS0VZX0ZMQUdfSU5TVEFOVElBVEVELCAma2V5LT5mbGFncyk7CiAJCW5vdyA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKIAkJa2V5LT5leHBpcnkgPSBub3cudHZfc2VjICsgdGltZW91dDsKIAotCQlpZiAoa2V5LT5mbGFncyAmIEtFWV9GTEFHX1VTRVJfQ09OU1RSVUNUKSB7Ci0JCQlrZXktPmZsYWdzICY9IH5LRVlfRkxBR19VU0VSX0NPTlNUUlVDVDsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCwgJmtleS0+ZmxhZ3MpKQogCQkJYXdha2VuID0gMTsKLQkJfQogCi0JCXdyaXRlX3VubG9jaygma2V5LT5sb2NrKTsKIAkJcmV0ID0gMDsKIAogCQkvKiBhbmQgbGluayBpdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBrZXlyaW5nICovCiAJCWlmIChrZXlyaW5nKQogCQkJcmV0ID0gX19rZXlfbGluayhrZXlyaW5nLCBrZXkpOworCisJCS8qIGRpc2FibGUgdGhlIGF1dGhvcmlzYXRpb24ga2V5ICovCisJCWlmIChpbnN0a2V5KQorCQkJa2V5X3Jldm9rZShpbnN0a2V5KTsKIAl9CiAKIAl1cF93cml0ZSgma2V5X2NvbnN0cnVjdGlvbl9zZW0pOwpAQCAtNTUzLDggKzU1NCwxMCBAQAogCXJiX2VyYXNlKCZrZXktPnNlcmlhbF9ub2RlLCAma2V5X3NlcmlhbF90cmVlKTsKIAlzcGluX3VubG9jaygma2V5X3NlcmlhbF9sb2NrKTsKIAorCWtleV9jaGVjayhrZXkpOworCiAJLyogZGVhbCB3aXRoIHRoZSB1c2VyJ3Mga2V5IHRyYWNraW5nIGFuZCBxdW90YSAqLwotCWlmIChrZXktPmZsYWdzICYgS0VZX0ZMQUdfSU5fUVVPVEEpIHsKKwlpZiAodGVzdF9iaXQoS0VZX0ZMQUdfSU5fUVVPVEEsICZrZXktPmZsYWdzKSkgewogCQlzcGluX2xvY2soJmtleS0+dXNlci0+bG9jayk7CiAJCWtleS0+dXNlci0+cW5rZXlzLS07CiAJCWtleS0+dXNlci0+cW5ieXRlcyAtPSBrZXktPnF1b3RhbGVuOwpAQCAtNTYyLDcgKzU2NSw3IEBACiAJfQogCiAJYXRvbWljX2RlYygma2V5LT51c2VyLT5ua2V5cyk7Ci0JaWYgKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19JTlNUQU5USUFURUQpCisJaWYgKHRlc3RfYml0KEtFWV9GTEFHX0lOU1RBTlRJQVRFRCwgJmtleS0+ZmxhZ3MpKQogCQlhdG9taWNfZGVjKCZrZXktPnVzZXItPm5pa2V5cyk7CiAKIAlrZXlfdXNlcl9wdXQoa2V5LT51c2VyKTsKQEAgLTYzMSw5ICs2MzQsOSBAQAogCWdvdG8gZXJyb3I7CiAKICBmb3VuZDoKLQkvKiBwcmV0ZW50IGRvZXNuJ3QgZXhpc3QgaWYgaXQncyBkZWFkICovCisJLyogcHJldGVuZCBpdCBkb2Vzbid0IGV4aXN0IGlmIGl0J3MgZGVhZCAqLwogCWlmIChhdG9taWNfcmVhZCgma2V5LT51c2FnZSkgPT0gMCB8fAotCSAgICAoa2V5LT5mbGFncyAmIEtFWV9GTEFHX0RFQUQpIHx8CisJICAgIHRlc3RfYml0KEtFWV9GTEFHX0RFQUQsICZrZXktPmZsYWdzKSB8fAogCSAgICBrZXktPnR5cGUgPT0gJmtleV90eXBlX2RlYWQpCiAJCWdvdG8gbm90X2ZvdW5kOwogCkBAIC03MDgsMTIgKzcxMSw5IEBACiAKIAlyZXQgPSBrZXktPnR5cGUtPnVwZGF0ZShrZXksIHBheWxvYWQsIHBsZW4pOwogCi0JaWYgKHJldCA9PSAwKSB7CisJaWYgKHJldCA9PSAwKQogCQkvKiB1cGRhdGluZyBhIG5lZ2F0aXZlIGtleSBpbnN0YW50aWF0ZXMgaXQgKi8KLQkJd3JpdGVfbG9jaygma2V5LT5sb2NrKTsKLQkJa2V5LT5mbGFncyAmPSB+S0VZX0ZMQUdfTkVHQVRJVkU7Ci0JCXdyaXRlX3VubG9jaygma2V5LT5sb2NrKTsKLQl9CisJCWNsZWFyX2JpdChLRVlfRkxBR19ORUdBVElWRSwgJmtleS0+ZmxhZ3MpOwogCiAJdXBfd3JpdGUoJmtleS0+c2VtKTsKIApAQCAtNzkzLDcgKzc5Myw3IEBACiAJfQogCiAJLyogaW5zdGFudGlhdGUgaXQgYW5kIGxpbmsgaXQgaW50byB0aGUgdGFyZ2V0IGtleXJpbmcgKi8KLQlyZXQgPSBfX2tleV9pbnN0YW50aWF0ZV9hbmRfbGluayhrZXksIHBheWxvYWQsIHBsZW4sIGtleXJpbmcpOworCXJldCA9IF9fa2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKGtleSwgcGF5bG9hZCwgcGxlbiwga2V5cmluZywgTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJa2V5X3B1dChrZXkpOwogCQlrZXkgPSBFUlJfUFRSKHJldCk7CkBAIC04NDEsMTIgKzg0MSw5IEBACiAJCWRvd25fd3JpdGUoJmtleS0+c2VtKTsKIAkJcmV0ID0ga2V5LT50eXBlLT51cGRhdGUoa2V5LCBwYXlsb2FkLCBwbGVuKTsKIAotCQlpZiAocmV0ID09IDApIHsKKwkJaWYgKHJldCA9PSAwKQogCQkJLyogdXBkYXRpbmcgYSBuZWdhdGl2ZSBrZXkgaW5zdGFudGlhdGVzIGl0ICovCi0JCQl3cml0ZV9sb2NrKCZrZXktPmxvY2spOwotCQkJa2V5LT5mbGFncyAmPSB+S0VZX0ZMQUdfTkVHQVRJVkU7Ci0JCQl3cml0ZV91bmxvY2soJmtleS0+bG9jayk7Ci0JCX0KKwkJCWNsZWFyX2JpdChLRVlfRkxBR19ORUdBVElWRSwgJmtleS0+ZmxhZ3MpOwogCiAJCXVwX3dyaXRlKCZrZXktPnNlbSk7CiAJfQpAQCAtODkyLDEwICs4ODksNyBAQAogCQlnb3RvIGVycm9yMjsKIAogCWF0b21pY19pbmMoJmtleS0+dXNlci0+bmlrZXlzKTsKLQotCXdyaXRlX2xvY2soJmtleS0+bG9jayk7Ci0Ja2V5LT5mbGFncyB8PSBLRVlfRkxBR19JTlNUQU5USUFURUQ7Ci0Jd3JpdGVfdW5sb2NrKCZrZXktPmxvY2spOworCXNldF9iaXQoS0VZX0ZMQUdfSU5TVEFOVElBVEVELCAma2V5LT5mbGFncyk7CiAKICBlcnJvcl9rOgogCXVwX3JlYWQoJmtleV90eXBlc19zZW0pOwpAQCAtOTIyLDkgKzkxNiw3IEBACiAJLyogbWFrZSBzdXJlIG5vIG9uZSdzIHRyeWluZyB0byBjaGFuZ2Ugb3IgdXNlIHRoZSBrZXkgd2hlbiB3ZSBtYXJrCiAJICogaXQgKi8KIAlkb3duX3dyaXRlKCZrZXktPnNlbSk7Ci0Jd3JpdGVfbG9jaygma2V5LT5sb2NrKTsKLQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX1JFVk9LRUQ7Ci0Jd3JpdGVfdW5sb2NrKCZrZXktPmxvY2spOworCXNldF9iaXQoS0VZX0ZMQUdfUkVWT0tFRCwgJmtleS0+ZmxhZ3MpOwogCXVwX3dyaXRlKCZrZXktPnNlbSk7CiAKIH0gLyogZW5kIGtleV9yZXZva2UoKSAqLwpAQCAtOTc1LDI0ICs5NjcsMzMgQEAKIAkvKiB3aXRoZHJhdyB0aGUga2V5IHR5cGUgKi8KIAlsaXN0X2RlbF9pbml0KCZrdHlwZS0+bGluayk7CiAKLQkvKiBuZWVkIHRvIHdpdGhkcmF3IGFsbCBrZXlzIG9mIHRoaXMgdHlwZSAqLworCS8qIG1hcmsgYWxsIHRoZSBrZXlzIG9mIHRoaXMgdHlwZSBkZWFkICovCiAJc3Bpbl9sb2NrKCZrZXlfc2VyaWFsX2xvY2spOwogCiAJZm9yIChfbiA9IHJiX2ZpcnN0KCZrZXlfc2VyaWFsX3RyZWUpOyBfbjsgX24gPSByYl9uZXh0KF9uKSkgewogCQlrZXkgPSByYl9lbnRyeShfbiwgc3RydWN0IGtleSwgc2VyaWFsX25vZGUpOwogCi0JCWlmIChrZXktPnR5cGUgIT0ga3R5cGUpCi0JCQljb250aW51ZTsKKwkJaWYgKGtleS0+dHlwZSA9PSBrdHlwZSkKKwkJCWtleS0+dHlwZSA9ICZrZXlfdHlwZV9kZWFkOworCX0KIAotCQl3cml0ZV9sb2NrKCZrZXktPmxvY2spOwotCQlrZXktPnR5cGUgPSAma2V5X3R5cGVfZGVhZDsKLQkJd3JpdGVfdW5sb2NrKCZrZXktPmxvY2spOworCXNwaW5fdW5sb2NrKCZrZXlfc2VyaWFsX2xvY2spOwogCi0JCS8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnlvbmUgbG9va2luZyBhdCB0aGUgZGVzY3JpcHRpb24gb3IKLQkJICogcGF5bG9hZCBub3cgKi8KLQkJaWYgKGt0eXBlLT5kZXN0cm95KQotCQkJa3R5cGUtPmRlc3Ryb3koa2V5KTsKLQkJbWVtc2V0KCZrZXktPnBheWxvYWQsIDB4YmQsIHNpemVvZihrZXktPnBheWxvYWQpKTsKKwkvKiBtYWtlIHN1cmUgZXZlcnlvbmUgcmV2YWxpZGF0ZXMgdGhlaXIga2V5cyAqLworCXN5bmNocm9uaXplX3JjdSgpOworCisJLyogd2Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRlc3Ryb3kgdGhlIHBheWxvYWRzIG9mIGFsbCB0aGUga2V5cyBvZgorCSAqIHRoaXMgdHlwZSB3aXRoIGltcHVuaXR5ICovCisJc3Bpbl9sb2NrKCZrZXlfc2VyaWFsX2xvY2spOworCisJZm9yIChfbiA9IHJiX2ZpcnN0KCZrZXlfc2VyaWFsX3RyZWUpOyBfbjsgX24gPSByYl9uZXh0KF9uKSkgeworCQlrZXkgPSByYl9lbnRyeShfbiwgc3RydWN0IGtleSwgc2VyaWFsX25vZGUpOworCisJCWlmIChrZXktPnR5cGUgPT0ga3R5cGUpIHsKKwkJCWlmIChrdHlwZS0+ZGVzdHJveSkKKwkJCQlrdHlwZS0+ZGVzdHJveShrZXkpOworCQkJbWVtc2V0KCZrZXktPnBheWxvYWQsIDB4YmQsIHNpemVvZihrZXktPnBheWxvYWQpKTsKKwkJfQogCX0KIAogCXNwaW5fdW5sb2NrKCZrZXlfc2VyaWFsX2xvY2spOwpAQCAtMTAzNyw0ICsxMDM4LDUgQEAKIAogCS8qIGxpbmsgdGhlIHR3byByb290IGtleXJpbmdzIHRvZ2V0aGVyICovCiAJa2V5X2xpbmsoJnJvb3Rfc2Vzc2lvbl9rZXlyaW5nLCAmcm9vdF91c2VyX2tleXJpbmcpOworCiB9IC8qIGVuZCBrZXlfaW5pdCgpICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwppbmRleCBkYzAwMTFiLi5mZWEyNjI4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKQEAgLTEsNiArMSw2IEBACiAvKiBrZXljdGwuYzogdXNlcnNwYWNlIGtleWN0bCBvcGVyYXRpb25zCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC00OSw2ICs0OSwxMyBAQAogCQlnb3RvIGVycm9yOwogCXR5cGVbMzFdID0gJ1wwJzsKIAorCWlmICghdHlwZVswXSkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IC1FUEVSTTsKKwlpZiAodHlwZVswXSA9PSAnLicpCisJCWdvdG8gZXJyb3I7CisKIAlyZXQgPSAtRUZBVUxUOwogCWRsZW4gPSBzdHJubGVuX3VzZXIoX2Rlc2NyaXB0aW9uLCBQQUdFX1NJWkUgLSAxKTsKIAlpZiAoZGxlbiA8PSAwKQpAQCAtODIsNyArODksNyBAQAogCX0KIAogCS8qIGZpbmQgdGhlIHRhcmdldCBrZXlyaW5nICh3aGljaCBtdXN0IGJlIHdyaXRhYmxlKSAqLwotCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOworCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgcmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcjM7CkBAIC0xODEsNyArMTg4LDcgQEAKIAkvKiBnZXQgdGhlIGRlc3RpbmF0aW9uIGtleXJpbmcgaWYgc3BlY2lmaWVkICovCiAJZGVzdCA9IE5VTEw7CiAJaWYgKGRlc3RyaW5naWQpIHsKLQkJZGVzdCA9IGxvb2t1cF91c2VyX2tleShkZXN0cmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOworCQlkZXN0ID0gbG9va3VwX3VzZXJfa2V5KE5VTEwsIGRlc3RyaW5naWQsIDEsIDAsIEtFWV9XUklURSk7CiAJCWlmIChJU19FUlIoZGVzdCkpIHsKIAkJCXJldCA9IFBUUl9FUlIoZGVzdCk7CiAJCQlnb3RvIGVycm9yMzsKQEAgLTE5NiwyMyArMjAzLDE1IEBACiAJfQogCiAJLyogZG8gdGhlIHNlYXJjaCAqLwotCWtleSA9IHJlcXVlc3Rfa2V5KGt0eXBlLCBkZXNjcmlwdGlvbiwgY2FsbG91dF9pbmZvKTsKKwlrZXkgPSByZXF1ZXN0X2tleV9hbmRfbGluayhrdHlwZSwgZGVzY3JpcHRpb24sIGNhbGxvdXRfaW5mbywgZGVzdCk7CiAJaWYgKElTX0VSUihrZXkpKSB7CiAJCXJldCA9IFBUUl9FUlIoa2V5KTsKIAkJZ290byBlcnJvcjU7CiAJfQogCi0JLyogbGluayB0aGUgcmVzdWx0aW5nIGtleSB0byB0aGUgZGVzdGluYXRpb24ga2V5cmluZyAqLwotCWlmIChkZXN0KSB7Ci0JCXJldCA9IGtleV9saW5rKGRlc3QsIGtleSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnJvcjY7Ci0JfQotCiAJcmV0ID0ga2V5LT5zZXJpYWw7CiAKLSBlcnJvcjY6Ci0Ja2V5X3B1dChrZXkpOworIAlrZXlfcHV0KGtleSk7CiAgZXJyb3I1OgogCWtleV90eXBlX3B1dChrdHlwZSk7CiAgZXJyb3I0OgpAQCAtMjM3LDcgKzIzNiw3IEBACiAJc3RydWN0IGtleSAqa2V5OwogCWxvbmcgcmV0OwogCi0Ja2V5ID0gbG9va3VwX3VzZXJfa2V5KGlkLCBjcmVhdGUsIDAsIEtFWV9TRUFSQ0gpOworCWtleSA9IGxvb2t1cF91c2VyX2tleShOVUxMLCBpZCwgY3JlYXRlLCAwLCBLRVlfU0VBUkNIKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXkpOwogCQlnb3RvIGVycm9yOwpAQCAtMzI0LDcgKzMyMyw3IEBACiAJfQogCiAJLyogZmluZCB0aGUgdGFyZ2V0IGtleSAod2hpY2ggbXVzdCBiZSB3cml0YWJsZSkgKi8KLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoaWQsIDAsIDAsIEtFWV9XUklURSk7CisJa2V5ID0gbG9va3VwX3VzZXJfa2V5KE5VTEwsIGlkLCAwLCAwLCBLRVlfV1JJVEUpOwogCWlmIChJU19FUlIoa2V5KSkgewogCQlyZXQgPSBQVFJfRVJSKGtleSk7CiAJCWdvdG8gZXJyb3IyOwpAQCAtMzUyLDcgKzM1MSw3IEBACiAJc3RydWN0IGtleSAqa2V5OwogCWxvbmcgcmV0OwogCi0Ja2V5ID0gbG9va3VwX3VzZXJfa2V5KGlkLCAwLCAwLCBLRVlfV1JJVEUpOworCWtleSA9IGxvb2t1cF91c2VyX2tleShOVUxMLCBpZCwgMCwgMCwgS0VZX1dSSVRFKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXkpOwogCQlnb3RvIGVycm9yOwpAQCAtMzc4LDcgKzM3Nyw3IEBACiAJc3RydWN0IGtleSAqa2V5cmluZzsKIAlsb25nIHJldDsKIAotCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOworCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgcmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcjsKQEAgLTQwNCwxMyArNDAzLDEzIEBACiAJc3RydWN0IGtleSAqa2V5cmluZywgKmtleTsKIAlsb25nIHJldDsKIAotCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOworCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgcmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoaWQsIDEsIDAsIEtFWV9MSU5LKTsKKwlrZXkgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgaWQsIDEsIDAsIEtFWV9MSU5LKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXkpOwogCQlnb3RvIGVycm9yMjsKQEAgLTQzOCwxMyArNDM3LDEzIEBACiAJc3RydWN0IGtleSAqa2V5cmluZywgKmtleTsKIAlsb25nIHJldDsKIAotCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAwLCAwLCBLRVlfV1JJVEUpOworCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgcmluZ2lkLCAwLCAwLCBLRVlfV1JJVEUpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoaWQsIDAsIDAsIDApOworCWtleSA9IGxvb2t1cF91c2VyX2tleShOVUxMLCBpZCwgMCwgMCwgMCk7CiAJaWYgKElTX0VSUihrZXkpKSB7CiAJCXJldCA9IFBUUl9FUlIoa2V5KTsKIAkJZ290byBlcnJvcjI7CkBAIC00NzUsMTYgKzQ3NCwyOSBAQAogCQkJIGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkgc2l6ZV90IGJ1ZmxlbikKIHsKLQlzdHJ1Y3Qga2V5ICprZXk7CisJc3RydWN0IGtleSAqa2V5LCAqaW5zdGtleTsKIAljaGFyICp0bXBidWY7CiAJbG9uZyByZXQ7CiAKLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoa2V5aWQsIDAsIDEsIEtFWV9WSUVXKTsKKwlrZXkgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwga2V5aWQsIDAsIDEsIEtFWV9WSUVXKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKKwkJLyogdmlld2luZyBhIGtleSB1bmRlciBjb25zdHJ1Y3Rpb24gaXMgcGVybWl0dGVkIGlmIHdlIGhhdmUgdGhlCisJCSAqIGF1dGhvcmlzYXRpb24gdG9rZW4gaGFuZHkgKi8KKwkJaWYgKFBUUl9FUlIoa2V5KSA9PSAtRUFDQ0VTKSB7CisJCQlpbnN0a2V5ID0ga2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoa2V5aWQpOworCQkJaWYgKCFJU19FUlIoaW5zdGtleSkpIHsKKwkJCQlrZXlfcHV0KGluc3RrZXkpOworCQkJCWtleSA9IGxvb2t1cF91c2VyX2tleShOVUxMLCBrZXlpZCwgMCwgMSwgMCk7CisJCQkJaWYgKCFJU19FUlIoa2V5KSkKKwkJCQkJZ290byBva2F5OworCQkJfQorCQl9CisKIAkJcmV0ID0gUFRSX0VSUihrZXkpOwogCQlnb3RvIGVycm9yOwogCX0KIAorb2theToKIAkvKiBjYWxjdWxhdGUgaG93IG11Y2ggZGVzY3JpcHRpb24gd2UncmUgZ29pbmcgdG8gcmV0dXJuICovCiAJcmV0ID0gLUVOT01FTTsKIAl0bXBidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CkBAIC01NjgsNyArNTgwLDcgQEAKIAkJZ290byBlcnJvcjI7CiAKIAkvKiBnZXQgdGhlIGtleXJpbmcgYXQgd2hpY2ggdG8gYmVnaW4gdGhlIHNlYXJjaCAqLwotCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAwLCAwLCBLRVlfU0VBUkNIKTsKKwlrZXlyaW5nID0gbG9va3VwX3VzZXJfa2V5KE5VTEwsIHJpbmdpZCwgMCwgMCwgS0VZX1NFQVJDSCk7CiAJaWYgKElTX0VSUihrZXlyaW5nKSkgewogCQlyZXQgPSBQVFJfRVJSKGtleXJpbmcpOwogCQlnb3RvIGVycm9yMjsKQEAgLTU3Nyw3ICs1ODksNyBAQAogCS8qIGdldCB0aGUgZGVzdGluYXRpb24ga2V5cmluZyBpZiBzcGVjaWZpZWQgKi8KIAlkZXN0ID0gTlVMTDsKIAlpZiAoZGVzdHJpbmdpZCkgewotCQlkZXN0ID0gbG9va3VwX3VzZXJfa2V5KGRlc3RyaW5naWQsIDEsIDAsIEtFWV9XUklURSk7CisJCWRlc3QgPSBsb29rdXBfdXNlcl9rZXkoTlVMTCwgZGVzdHJpbmdpZCwgMSwgMCwgS0VZX1dSSVRFKTsKIAkJaWYgKElTX0VSUihkZXN0KSkgewogCQkJcmV0ID0gUFRSX0VSUihkZXN0KTsKIAkJCWdvdG8gZXJyb3IzOwpAQCAtNjU2LDI0ICs2NjgsMjMgQEAKIAlsb25nIHJldDsKIAogCS8qIGZpbmQgdGhlIGtleSBmaXJzdCAqLwotCWtleSA9IGxvb2t1cF91c2VyX2tleShrZXlpZCwgMCwgMCwgMCk7CisJa2V5ID0gbG9va3VwX3VzZXJfa2V5KE5VTEwsIGtleWlkLCAwLCAwLCAwKTsKIAlpZiAoIUlTX0VSUihrZXkpKSB7CiAJCS8qIHNlZSBpZiB3ZSBjYW4gcmVhZCBpdCBkaXJlY3RseSAqLwogCQlpZiAoa2V5X3Blcm1pc3Npb24oa2V5LCBLRVlfUkVBRCkpCiAJCQlnb3RvIGNhbl9yZWFkX2tleTsKIAotCQkvKiBjYW4ndDsgc2VlIGlmIGl0J3Mgc2VhcmNoYWJsZSBmcm9tIHRoaXMgcHJvY2VzcydzCi0JCSAqIGtleXJpbmdzICovCi0JCXJldCA9IC1FTk9LRVk7Ci0JCWlmIChrZXlfcGVybWlzc2lvbihrZXksIEtFWV9TRUFSQ0gpKSB7Ci0JCQkvKiBva2F5IC0gd2UgZG8gaGF2ZSBzZWFyY2ggcGVybWlzc2lvbiBvbiB0aGUga2V5Ci0JCQkgKiBpdHNlbGYsIGJ1dCBkbyB3ZSBoYXZlIHRoZSBrZXk/ICovCi0JCQlza2V5ID0gc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3NfYXV4KGtleS0+dHlwZSwga2V5LAotCQkJCQkJCSAgIGtleWN0bF9yZWFkX2tleV9zYW1lKTsKLQkJCWlmICghSVNfRVJSKHNrZXkpKQotCQkJCWdvdG8gY2FuX3JlYWRfa2V5MjsKLQkJfQorCQkvKiB3ZSBjYW4ndDsgc2VlIGlmIGl0J3Mgc2VhcmNoYWJsZSBmcm9tIHRoaXMgcHJvY2VzcydzCisJCSAqIGtleXJpbmdzCisJCSAqIC0gd2UgYXV0b21hdGljYWxseSB0YWtlIGFjY291bnQgb2YgdGhlIGZhY3QgdGhhdCBpdCBtYXkgYmUKKwkJICogICBkYW5nbGluZyBvZmYgYW4gaW5zdGFudGlhdGlvbiBrZXkKKwkJICovCisJCXNrZXkgPSBzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyhrZXktPnR5cGUsIGtleSwKKwkJCQkJICAgICAgIGtleWN0bF9yZWFkX2tleV9zYW1lLCBjdXJyZW50KTsKKwkJaWYgKCFJU19FUlIoc2tleSkpCisJCQlnb3RvIGNhbl9yZWFkX2tleTI7CiAKKwkJcmV0ID0gUFRSX0VSUihza2V5KTsKIAkJZ290byBlcnJvcjI7CiAJfQogCkBAIC03MTksNyArNzMwLDcgQEAKIAlpZiAodWlkID09ICh1aWRfdCkgLTEgJiYgZ2lkID09IChnaWRfdCkgLTEpCiAJCWdvdG8gZXJyb3I7CiAKLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoaWQsIDEsIDEsIDApOworCWtleSA9IGxvb2t1cF91c2VyX2tleShOVUxMLCBpZCwgMSwgMSwgMCk7CiAJaWYgKElTX0VSUihrZXkpKSB7CiAJCXJldCA9IFBUUl9FUlIoa2V5KTsKIAkJZ290byBlcnJvcjsKQEAgLTcyOCw3ICs3MzksNiBAQAogCS8qIG1ha2UgdGhlIGNoYW5nZXMgd2l0aCB0aGUgbG9ja3MgaGVsZCB0byBwcmV2ZW50IGNob3duL2Nob3duIHJhY2VzICovCiAJcmV0ID0gLUVBQ0NFUzsKIAlkb3duX3dyaXRlKCZrZXktPnNlbSk7Ci0Jd3JpdGVfbG9jaygma2V5LT5sb2NrKTsKIAogCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQkvKiBvbmx5IHRoZSBzeXNhZG1pbiBjYW4gY2hvd24gYSBrZXkgdG8gc29tZSBvdGhlciBVSUQgKi8KQEAgLTc1NSw3ICs3NjUsNiBAQAogCXJldCA9IDA7CiAKICBub19hY2Nlc3M6Ci0Jd3JpdGVfdW5sb2NrKCZrZXktPmxvY2spOwogCXVwX3dyaXRlKCZrZXktPnNlbSk7CiAJa2V5X3B1dChrZXkpOwogIGVycm9yOgpAQCAtNzc4LDMyICs3ODcsMjUgQEAKIAlpZiAocGVybSAmIH4oS0VZX1VTUl9BTEwgfCBLRVlfR1JQX0FMTCB8IEtFWV9PVEhfQUxMKSkKIAkJZ290byBlcnJvcjsKIAotCWtleSA9IGxvb2t1cF91c2VyX2tleShpZCwgMSwgMSwgMCk7CisJa2V5ID0gbG9va3VwX3VzZXJfa2V5KE5VTEwsIGlkLCAxLCAxLCAwKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXkpOwogCQlnb3RvIGVycm9yOwogCX0KIAotCS8qIG1ha2UgdGhlIGNoYW5nZXMgd2l0aCB0aGUgbG9ja3MgaGVsZCB0byBwcmV2ZW50IGNob3duL2NobW9kCi0JICogcmFjZXMgKi8KKwkvKiBtYWtlIHRoZSBjaGFuZ2VzIHdpdGggdGhlIGxvY2tzIGhlbGQgdG8gcHJldmVudCBjaG93bi9jaG1vZCByYWNlcyAqLwogCXJldCA9IC1FQUNDRVM7CiAJZG93bl93cml0ZSgma2V5LT5zZW0pOwotCXdyaXRlX2xvY2soJmtleS0+bG9jayk7CiAKLQkvKiBpZiB3ZSdyZSBub3QgdGhlIHN5c2FkbWluLCB3ZSBjYW4gb25seSBjaG1vZCBhIGtleSB0aGF0IHdlCi0JICogb3duICovCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pICYmIGtleS0+dWlkICE9IGN1cnJlbnQtPmZzdWlkKQotCQlnb3RvIG5vX2FjY2VzczsKKwkvKiBpZiB3ZSdyZSBub3QgdGhlIHN5c2FkbWluLCB3ZSBjYW4gb25seSBjaGFuZ2UgYSBrZXkgdGhhdCB3ZSBvd24gKi8KKwlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBrZXktPnVpZCA9PSBjdXJyZW50LT5mc3VpZCkgeworCQlrZXktPnBlcm0gPSBwZXJtOworCQlyZXQgPSAwOworCX0KIAotCS8qIGNoYW5naW5nIHRoZSBwZXJtaXNzaW9ucyBtYXNrICovCi0Ja2V5LT5wZXJtID0gcGVybTsKLQlyZXQgPSAwOwotCi0gbm9fYWNjZXNzOgotCXdyaXRlX3VubG9jaygma2V5LT5sb2NrKTsKIAl1cF93cml0ZSgma2V5LT5zZW0pOwogCWtleV9wdXQoa2V5KTsKLSBlcnJvcjoKK2Vycm9yOgogCXJldHVybiByZXQ7CiAKIH0gLyogZW5kIGtleWN0bF9zZXRwZXJtX2tleSgpICovCkBAIC04MTgsNyArODIwLDggQEAKIAkJCSAgICBzaXplX3QgcGxlbiwKIAkJCSAgICBrZXlfc2VyaWFsX3QgcmluZ2lkKQogewotCXN0cnVjdCBrZXkgKmtleSwgKmtleXJpbmc7CisJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYTsKKwlzdHJ1Y3Qga2V5ICppbnN0a2V5LCAqa2V5cmluZzsKIAl2b2lkICpwYXlsb2FkOwogCWxvbmcgcmV0OwogCkBAIC04NDAsMTggKzg0MywyMSBAQAogCQkJZ290byBlcnJvcjI7CiAJfQogCi0JLyogZmluZCB0aGUgdGFyZ2V0IGtleSAod2hpY2ggbXVzdCBiZSB3cml0YWJsZSkgKi8KLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoaWQsIDAsIDEsIEtFWV9XUklURSk7Ci0JaWYgKElTX0VSUihrZXkpKSB7Ci0JCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkvKiBmaW5kIHRoZSBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24ga2V5ICovCisJaW5zdGtleSA9IGtleV9nZXRfaW5zdGFudGlhdGlvbl9hdXRoa2V5KGlkKTsKKwlpZiAoSVNfRVJSKGluc3RrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoaW5zdGtleSk7CiAJCWdvdG8gZXJyb3IyOwogCX0KIAotCS8qIGZpbmQgdGhlIGRlc3RpbmF0aW9uIGtleXJpbmcgaWYgcHJlc2VudCAod2hpY2ggbXVzdCBhbHNvIGJlCi0JICogd3JpdGFibGUpICovCisJcmthID0gaW5zdGtleS0+cGF5bG9hZC5kYXRhOworCisJLyogZmluZCB0aGUgZGVzdGluYXRpb24ga2V5cmluZyBhbW9uZ3N0IHRob3NlIGJlbG9uZ2luZyB0byB0aGUKKwkgKiByZXF1ZXN0aW5nIHRhc2sgKi8KIAlrZXlyaW5nID0gTlVMTDsKIAlpZiAocmluZ2lkKSB7Ci0JCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOworCQlrZXlyaW5nID0gbG9va3VwX3VzZXJfa2V5KHJrYS0+Y29udGV4dCwgcmluZ2lkLCAxLCAwLAorCQkJCQkgIEtFWV9XUklURSk7CiAJCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJCXJldCA9IFBUUl9FUlIoa2V5cmluZyk7CiAJCQlnb3RvIGVycm9yMzsKQEAgLTg1OSwxMSArODY1LDEyIEBACiAJfQogCiAJLyogaW5zdGFudGlhdGUgdGhlIGtleSBhbmQgbGluayBpdCBpbnRvIGEga2V5cmluZyAqLwotCXJldCA9IGtleV9pbnN0YW50aWF0ZV9hbmRfbGluayhrZXksIHBheWxvYWQsIHBsZW4sIGtleXJpbmcpOworCXJldCA9IGtleV9pbnN0YW50aWF0ZV9hbmRfbGluayhya2EtPnRhcmdldF9rZXksIHBheWxvYWQsIHBsZW4sCisJCQkJICAgICAgIGtleXJpbmcsIGluc3RrZXkpOwogCiAJa2V5X3B1dChrZXlyaW5nKTsKICBlcnJvcjM6Ci0Ja2V5X3B1dChrZXkpOworCWtleV9wdXQoaW5zdGtleSk7CiAgZXJyb3IyOgogCWtmcmVlKHBheWxvYWQpOwogIGVycm9yOgpAQCAtODc4LDIxICs4ODUsMjQgQEAKICAqLwogbG9uZyBrZXljdGxfbmVnYXRlX2tleShrZXlfc2VyaWFsX3QgaWQsIHVuc2lnbmVkIHRpbWVvdXQsIGtleV9zZXJpYWxfdCByaW5naWQpCiB7Ci0Jc3RydWN0IGtleSAqa2V5LCAqa2V5cmluZzsKKwlzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCAqcmthOworCXN0cnVjdCBrZXkgKmluc3RrZXksICprZXlyaW5nOwogCWxvbmcgcmV0OwogCi0JLyogZmluZCB0aGUgdGFyZ2V0IGtleSAod2hpY2ggbXVzdCBiZSB3cml0YWJsZSkgKi8KLQlrZXkgPSBsb29rdXBfdXNlcl9rZXkoaWQsIDAsIDEsIEtFWV9XUklURSk7Ci0JaWYgKElTX0VSUihrZXkpKSB7Ci0JCXJldCA9IFBUUl9FUlIoa2V5KTsKKwkvKiBmaW5kIHRoZSBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24ga2V5ICovCisJaW5zdGtleSA9IGtleV9nZXRfaW5zdGFudGlhdGlvbl9hdXRoa2V5KGlkKTsKKwlpZiAoSVNfRVJSKGluc3RrZXkpKSB7CisJCXJldCA9IFBUUl9FUlIoaW5zdGtleSk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCisJcmthID0gaW5zdGtleS0+cGF5bG9hZC5kYXRhOworCiAJLyogZmluZCB0aGUgZGVzdGluYXRpb24ga2V5cmluZyBpZiBwcmVzZW50ICh3aGljaCBtdXN0IGFsc28gYmUKIAkgKiB3cml0YWJsZSkgKi8KIAlrZXlyaW5nID0gTlVMTDsKIAlpZiAocmluZ2lkKSB7Ci0JCWtleXJpbmcgPSBsb29rdXBfdXNlcl9rZXkocmluZ2lkLCAxLCAwLCBLRVlfV1JJVEUpOworCQlrZXlyaW5nID0gbG9va3VwX3VzZXJfa2V5KE5VTEwsIHJpbmdpZCwgMSwgMCwgS0VZX1dSSVRFKTsKIAkJaWYgKElTX0VSUihrZXlyaW5nKSkgewogCQkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJCWdvdG8gZXJyb3IyOwpAQCAtOTAwLDExICs5MTAsMTEgQEAKIAl9CiAKIAkvKiBpbnN0YW50aWF0ZSB0aGUga2V5IGFuZCBsaW5rIGl0IGludG8gYSBrZXlyaW5nICovCi0JcmV0ID0ga2V5X25lZ2F0ZV9hbmRfbGluayhrZXksIHRpbWVvdXQsIGtleXJpbmcpOworCXJldCA9IGtleV9uZWdhdGVfYW5kX2xpbmsocmthLT50YXJnZXRfa2V5LCB0aW1lb3V0LCBrZXlyaW5nLCBpbnN0a2V5KTsKIAogCWtleV9wdXQoa2V5cmluZyk7CiAgZXJyb3IyOgotCWtleV9wdXQoa2V5KTsKKwlrZXlfcHV0KGluc3RrZXkpOwogIGVycm9yOgogCXJldHVybiByZXQ7CiAKQEAgLTkxMiw2ICs5MjIsNDQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKKyAqIHNldCB0aGUgZGVmYXVsdCBrZXlyaW5nIGluIHdoaWNoIHJlcXVlc3Rfa2V5KCkgd2lsbCBjYWNoZSBrZXlzCisgKiAtIHJldHVybiB0aGUgb2xkIHNldHRpbmcKKyAqLworbG9uZyBrZXljdGxfc2V0X3JlcWtleV9rZXlyaW5nKGludCByZXFrZXlfZGVmbCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChyZXFrZXlfZGVmbCkgeworCWNhc2UgS0VZX1JFUUtFWV9ERUZMX1RIUkVBRF9LRVlSSU5HOgorCQlyZXQgPSBpbnN0YWxsX3RocmVhZF9rZXlyaW5nKGN1cnJlbnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWdvdG8gc2V0OworCisJY2FzZSBLRVlfUkVRS0VZX0RFRkxfUFJPQ0VTU19LRVlSSU5HOgorCQlyZXQgPSBpbnN0YWxsX3Byb2Nlc3Nfa2V5cmluZyhjdXJyZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJY2FzZSBLRVlfUkVRS0VZX0RFRkxfREVGQVVMVDoKKwljYXNlIEtFWV9SRVFLRVlfREVGTF9TRVNTSU9OX0tFWVJJTkc6CisJY2FzZSBLRVlfUkVRS0VZX0RFRkxfVVNFUl9LRVlSSU5HOgorCWNhc2UgS0VZX1JFUUtFWV9ERUZMX1VTRVJfU0VTU0lPTl9LRVlSSU5HOgorCXNldDoKKwkJY3VycmVudC0+aml0X2tleXJpbmcgPSByZXFrZXlfZGVmbDsKKworCWNhc2UgS0VZX1JFUUtFWV9ERUZMX05PX0NIQU5HRToKKwkJcmV0dXJuIGN1cnJlbnQtPmppdF9rZXlyaW5nOworCisJY2FzZSBLRVlfUkVRS0VZX0RFRkxfR1JPVVBfS0VZUklORzoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK30gLyogZW5kIGtleWN0bF9zZXRfcmVxa2V5X2tleXJpbmcoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgogICogdGhlIGtleSBjb250cm9sIHN5c3RlbSBjYWxsCiAgKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfa2V5Y3RsKGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczLApAQCAtOTgwLDYgKzEwMjgsOSBAQAogCQkJCQkgKHVuc2lnbmVkKSBhcmczLAogCQkJCQkgKGtleV9zZXJpYWxfdCkgYXJnNCk7CiAKKwljYXNlIEtFWUNUTF9TRVRfUkVRS0VZX0tFWVJJTkc6CisJCXJldHVybiBrZXljdGxfc2V0X3JlcWtleV9rZXlyaW5nKGFyZzIpOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMva2V5cmluZy5jIGIvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKaW5kZXggZTJhYjRmOC4uYTFmNmJhYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKKysrIGIvc2VjdXJpdHkva2V5cy9rZXlyaW5nLmMKQEAgLTEsNiArMSw2IEBACiAvKiBrZXlyaW5nLmM6IGtleXJpbmcgaGFuZGxpbmcKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEyOSwxMyArMTI5LDIwIEBACiAJaW50IGxvb3AsIHJldDsKIAogCWNvbnN0IHVuc2lnbmVkIGxpbWl0ID0KLQkJKFBBR0VfU0laRSAtIHNpemVvZigqa2xpc3QpKSAvIHNpemVvZihzdHJ1Y3Qga2V5KTsKKwkJKFBBR0VfU0laRSAtIHNpemVvZigqa2xpc3QpKSAvIHNpemVvZihzdHJ1Y3Qga2V5ICopOwogCiAJcmV0ID0gMDsKLQlza2xpc3QgPSBzb3VyY2UtPnBheWxvYWQuc3Vic2NyaXB0aW9uczsKIAotCWlmIChza2xpc3QgJiYgc2tsaXN0LT5ua2V5cyA+IDApIHsKKwkvKiBmaW5kIG91dCBob3cgbWFueSBrZXlzIGFyZSBjdXJyZW50bHkgbGlua2VkICovCisJcmN1X3JlYWRfbG9jaygpOworCXNrbGlzdCA9IHJjdV9kZXJlZmVyZW5jZShzb3VyY2UtPnBheWxvYWQuc3Vic2NyaXB0aW9ucyk7CisJbWF4ID0gMDsKKwlpZiAoc2tsaXN0KQogCQltYXggPSBza2xpc3QtPm5rZXlzOworCXJjdV9yZWFkX3VubG9jaygpOworCisJLyogYWxsb2NhdGUgYSBuZXcgcGF5bG9hZCBhbmQgc3R1ZmYgbG9hZCB3aXRoIGtleSBsaW5rcyAqLworCWlmIChtYXggPiAwKSB7CiAJCUJVR19PTihtYXggPiBsaW1pdCk7CiAKIAkJbWF4ID0gKG1heCArIDMpICYgfjM7CkBAIC0xNDMsMjEgKzE1MCwyNyBAQAogCQkJbWF4ID0gbGltaXQ7CiAKIAkJcmV0ID0gLUVOT01FTTsKLQkJc2l6ZSA9IHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKHN0cnVjdCBrZXkpICogbWF4OworCQlzaXplID0gc2l6ZW9mKCprbGlzdCkgKyBzaXplb2Yoc3RydWN0IGtleSAqKSAqIG1heDsKIAkJa2xpc3QgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWtsaXN0KQogCQkJZ290byBlcnJvcjsKIAorCQkvKiBzZXQgbGlua3MgKi8KKwkJcmN1X3JlYWRfbG9jaygpOworCQlza2xpc3QgPSByY3VfZGVyZWZlcmVuY2Uoc291cmNlLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMpOworCiAJCWtsaXN0LT5tYXhrZXlzID0gbWF4OwogCQlrbGlzdC0+bmtleXMgPSBza2xpc3QtPm5rZXlzOwogCQltZW1jcHkoa2xpc3QtPmtleXMsCiAJCSAgICAgICBza2xpc3QtPmtleXMsCi0JCSAgICAgICBza2xpc3QtPm5rZXlzICogc2l6ZW9mKHN0cnVjdCBrZXkpKTsKKwkJICAgICAgIHNrbGlzdC0+bmtleXMgKiBzaXplb2Yoc3RydWN0IGtleSAqKSk7CiAKIAkJZm9yIChsb29wID0ga2xpc3QtPm5rZXlzIC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCiAJCQlhdG9taWNfaW5jKCZrbGlzdC0+a2V5c1tsb29wXS0+dXNhZ2UpOwogCi0JCWtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9ucyA9IGtsaXN0OworCQlyY3VfcmVhZF91bmxvY2soKTsKKworCQlyY3VfYXNzaWduX3BvaW50ZXIoa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zLCBrbGlzdCk7CiAJCXJldCA9IDA7CiAJfQogCkBAIC0xOTIsNyArMjA1LDcgQEAKIAkJd3JpdGVfdW5sb2NrKCZrZXlyaW5nX25hbWVfbG9jayk7CiAJfQogCi0Ja2xpc3QgPSBrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnM7CisJa2xpc3QgPSByY3VfZGVyZWZlcmVuY2Uoa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zKTsKIAlpZiAoa2xpc3QpIHsKIAkJZm9yIChsb29wID0ga2xpc3QtPm5rZXlzIC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pCiAJCQlrZXlfcHV0KGtsaXN0LT5rZXlzW2xvb3BdKTsKQEAgLTIxNiwxNyArMjI5LDIwIEBACiAJCXNlcV9wdXRzKG0sICJbYW5vbl0iKTsKIAl9CiAKLQlrbGlzdCA9IGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9uczsKKwlyY3VfcmVhZF9sb2NrKCk7CisJa2xpc3QgPSByY3VfZGVyZWZlcmVuY2Uoa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zKTsKIAlpZiAoa2xpc3QpCiAJCXNlcV9wcmludGYobSwgIjogJXUvJXUiLCBrbGlzdC0+bmtleXMsIGtsaXN0LT5tYXhrZXlzKTsKIAllbHNlCiAJCXNlcV9wdXRzKG0sICI6IGVtcHR5Iik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIH0gLyogZW5kIGtleXJpbmdfZGVzY3JpYmUoKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogcmVhZCBhIGxpc3Qgb2Yga2V5IElEcyBmcm9tIHRoZSBrZXlyaW5nJ3MgY29udGVudHMKKyAqIC0gdGhlIGtleXJpbmcncyBzZW1hcGhvcmUgaXMgcmVhZC1sb2NrZWQKICAqLwogc3RhdGljIGxvbmcga2V5cmluZ19yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleXJpbmcsCiAJCQkgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKQEAgLTIzNyw3ICsyNTMsNyBAQAogCWludCBsb29wLCByZXQ7CiAKIAlyZXQgPSAwOwotCWtsaXN0ID0ga2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zOworCWtsaXN0ID0gcmN1X2RlcmVmZXJlbmNlKGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9ucyk7CiAKIAlpZiAoa2xpc3QpIHsKIAkJLyogY2FsY3VsYXRlIGhvdyBtdWNoIGRhdGEgd2UgY291bGQgcmV0dXJuICovCkBAIC0yOTIsNyArMzA4LDcgQEAKIAkJCSAgICB1aWQsIGdpZCwgS0VZX1VTUl9BTEwsIG5vdF9pbl9xdW90YSk7CiAKIAlpZiAoIUlTX0VSUihrZXlyaW5nKSkgewotCQlyZXQgPSBrZXlfaW5zdGFudGlhdGVfYW5kX2xpbmsoa2V5cmluZywgTlVMTCwgMCwgZGVzdCk7CisJCXJldCA9IGtleV9pbnN0YW50aWF0ZV9hbmRfbGluayhrZXlyaW5nLCBOVUxMLCAwLCBkZXN0LCBOVUxMKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWtleV9wdXQoa2V5cmluZyk7CiAJCQlrZXlyaW5nID0gRVJSX1BUUihyZXQpOwpAQCAtMzEwLDE3ICszMjYsMTggQEAKICAqIC0gd2Ugb25seSBmaW5kIGtleXMgb24gd2hpY2ggd2UgaGF2ZSBzZWFyY2ggcGVybWlzc2lvbgogICogLSB3ZSB1c2UgdGhlIHN1cHBsaWVkIG1hdGNoIGZ1bmN0aW9uIHRvIHNlZSBpZiB0aGUgZGVzY3JpcHRpb24gKG9yIG90aGVyCiAgKiAgIGZlYXR1cmUgb2YgaW50ZXJlc3QpIG1hdGNoZXMKLSAqIC0gd2UgcmVhZGxvY2sgdGhlIGtleXJpbmdzIGFzIHdlIHNlYXJjaCBkb3duIHRoZSB0cmVlCisgKiAtIHdlIHJlbHkgb24gUkNVIHRvIHByZXZlbnQgdGhlIGtleXJpbmcgbGlzdHMgZnJvbSBkaXNhcHBlYXJpbmcgb24gdXMKICAqIC0gd2UgcmV0dXJuIC1FQUdBSU4gaWYgd2UgZGlkbid0IGZpbmQgYW55IG1hdGNoaW5nIGtleQogICogLSB3ZSByZXR1cm4gLUVOT0tFWSBpZiB3ZSBvbmx5IGZvdW5kIG5lZ2F0aXZlIG1hdGNoaW5nIGtleXMKICAqLwogc3RydWN0IGtleSAqa2V5cmluZ19zZWFyY2hfYXV4KHN0cnVjdCBrZXkgKmtleXJpbmcsCisJCQkgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpjb250ZXh0LAogCQkJICAgICAgIHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKIAkJCSAgICAgICBjb25zdCB2b2lkICpkZXNjcmlwdGlvbiwKIAkJCSAgICAgICBrZXlfbWF0Y2hfZnVuY190IG1hdGNoKQogewogCXN0cnVjdCB7Ci0JCXN0cnVjdCBrZXkgKmtleXJpbmc7CisJCXN0cnVjdCBrZXlyaW5nX2xpc3QgKmtleWxpc3Q7CiAJCWludCBraXg7CiAJfSBzdGFja1tLRVlSSU5HX1NFQVJDSF9NQVhfREVQVEhdOwogCkBAIC0zMjgsMTMgKzM0NSwxNSBAQAogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAJc3RydWN0IGtleSAqa2V5OwogCWxvbmcgZXJyOwotCWludCBzcCwgcHNwLCBraXg7CisJaW50IHNwLCBraXg7CiAKIAlrZXlfY2hlY2soa2V5cmluZyk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CisKIAkvKiB0b3Aga2V5cmluZyBtdXN0IGhhdmUgc2VhcmNoIHBlcm1pc3Npb24gdG8gYmVnaW4gdGhlIHNlYXJjaCAqLwogCWtleSA9IEVSUl9QVFIoLUVBQ0NFUyk7Ci0JaWYgKCFrZXlfcGVybWlzc2lvbihrZXlyaW5nLCBLRVlfU0VBUkNIKSkKKwlpZiAoIWtleV90YXNrX3Blcm1pc3Npb24oa2V5cmluZywgY29udGV4dCwgS0VZX1NFQVJDSCkpCiAJCWdvdG8gZXJyb3I7CiAKIAlrZXkgPSBFUlJfUFRSKC1FTk9URElSKTsKQEAgLTM0NywxMSArMzY2LDEwIEBACiAKIAkvKiBzdGFydCBwcm9jZXNzaW5nIGEgbmV3IGtleXJpbmcgKi8KICBkZXNjZW5kOgotCXJlYWRfbG9jaygma2V5cmluZy0+bG9jayk7Ci0JaWYgKGtleXJpbmctPmZsYWdzICYgS0VZX0ZMQUdfUkVWT0tFRCkKKwlpZiAodGVzdF9iaXQoS0VZX0ZMQUdfUkVWT0tFRCwgJmtleXJpbmctPmZsYWdzKSkKIAkJZ290byBub3RfdGhpc19rZXlyaW5nOwogCi0Ja2V5bGlzdCA9IGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9uczsKKwlrZXlsaXN0ID0gcmN1X2RlcmVmZXJlbmNlKGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9ucyk7CiAJaWYgKCFrZXlsaXN0KQogCQlnb3RvIG5vdF90aGlzX2tleXJpbmc7CiAKQEAgLTM2NCw3ICszODIsNyBAQAogCQkJY29udGludWU7CiAKIAkJLyogc2tpcCByZXZva2VkIGtleXMgYW5kIGV4cGlyZWQga2V5cyAqLwotCQlpZiAoa2V5LT5mbGFncyAmIEtFWV9GTEFHX1JFVk9LRUQpCisJCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAma2V5LT5mbGFncykpCiAJCQljb250aW51ZTsKIAogCQlpZiAoa2V5LT5leHBpcnkgJiYgbm93LnR2X3NlYyA+PSBrZXktPmV4cGlyeSkKQEAgLTM3NSwxMSArMzkzLDExIEBACiAJCQljb250aW51ZTsKIAogCQkvKiBrZXkgbXVzdCBoYXZlIHNlYXJjaCBwZXJtaXNzaW9ucyAqLwotCQlpZiAoIWtleV9wZXJtaXNzaW9uKGtleSwgS0VZX1NFQVJDSCkpCisJCWlmICgha2V5X3Rhc2tfcGVybWlzc2lvbihrZXksIGNvbnRleHQsIEtFWV9TRUFSQ0gpKQogCQkJY29udGludWU7CiAKIAkJLyogd2Ugc2V0IGEgZGlmZmVyZW50IGVycm9yIGNvZGUgaWYgd2UgZmluZCBhIG5lZ2F0aXZlIGtleSAqLwotCQlpZiAoa2V5LT5mbGFncyAmIEtFWV9GTEFHX05FR0FUSVZFKSB7CisJCWlmICh0ZXN0X2JpdChLRVlfRkxBR19ORUdBVElWRSwgJmtleS0+ZmxhZ3MpKSB7CiAJCQllcnIgPSAtRU5PS0VZOwogCQkJY29udGludWU7CiAJCX0KQEAgLTM5MCw0OCArNDA4LDM3IEBACiAJLyogc2VhcmNoIHRocm91Z2ggdGhlIGtleXJpbmdzIG5lc3RlZCBpbiB0aGlzIG9uZSAqLwogCWtpeCA9IDA7CiAgYXNjZW5kOgotCXdoaWxlIChraXggPCBrZXlsaXN0LT5ua2V5cykgeworCWZvciAoOyBraXggPCBrZXlsaXN0LT5ua2V5czsga2l4KyspIHsKIAkJa2V5ID0ga2V5bGlzdC0+a2V5c1traXhdOwogCQlpZiAoa2V5LT50eXBlICE9ICZrZXlfdHlwZV9rZXlyaW5nKQotCQkJZ290byBuZXh0OworCQkJY29udGludWU7CiAKIAkJLyogcmVjdXJzaXZlbHkgc2VhcmNoIG5lc3RlZCBrZXlyaW5ncwogCQkgKiAtIG9ubHkgc2VhcmNoIGtleXJpbmdzIGZvciB3aGljaCB3ZSBoYXZlIHNlYXJjaCBwZXJtaXNzaW9uCiAJCSAqLwogCQlpZiAoc3AgPj0gS0VZUklOR19TRUFSQ0hfTUFYX0RFUFRIKQotCQkJZ290byBuZXh0OworCQkJY29udGludWU7CiAKLQkJaWYgKCFrZXlfcGVybWlzc2lvbihrZXksIEtFWV9TRUFSQ0gpKQotCQkJZ290byBuZXh0OwotCi0JCS8qIGV2YWRlIGxvb3BzIGluIHRoZSBrZXlyaW5nIHRyZWUgKi8KLQkJZm9yIChwc3AgPSAwOyBwc3AgPCBzcDsgcHNwKyspCi0JCQlpZiAoc3RhY2tbcHNwXS5rZXlyaW5nID09IGtleXJpbmcpCi0JCQkJZ290byBuZXh0OworCQlpZiAoIWtleV90YXNrX3Blcm1pc3Npb24oa2V5LCBjb250ZXh0LCBLRVlfU0VBUkNIKSkKKwkJCWNvbnRpbnVlOwogCiAJCS8qIHN0YWNrIHRoZSBjdXJyZW50IHBvc2l0aW9uICovCi0JCXN0YWNrW3NwXS5rZXlyaW5nID0ga2V5cmluZzsKKwkJc3RhY2tbc3BdLmtleWxpc3QgPSBrZXlsaXN0OwogCQlzdGFja1tzcF0ua2l4ID0ga2l4OwogCQlzcCsrOwogCiAJCS8qIGJlZ2luIGFnYWluIHdpdGggdGhlIG5ldyBrZXlyaW5nICovCiAJCWtleXJpbmcgPSBrZXk7CiAJCWdvdG8gZGVzY2VuZDsKLQotCW5leHQ6Ci0JCWtpeCsrOwogCX0KIAogCS8qIHRoZSBrZXlyaW5nIHdlJ3JlIGxvb2tpbmcgYXQgd2FzIGRpc3F1YWxpZmllZCBvciBkaWRuJ3QgY29udGFpbiBhCiAJICogbWF0Y2hpbmcga2V5ICovCiAgbm90X3RoaXNfa2V5cmluZzoKLQlyZWFkX3VubG9jaygma2V5cmluZy0+bG9jayk7Ci0KIAlpZiAoc3AgPiAwKSB7CiAJCS8qIHJlc3VtZSB0aGUgcHJvY2Vzc2luZyBvZiBhIGtleXJpbmcgaGlnaGVyIHVwIGluIHRoZSB0cmVlICovCiAJCXNwLS07Ci0JCWtleXJpbmcgPSBzdGFja1tzcF0ua2V5cmluZzsKLQkJa2V5bGlzdCA9IGtleXJpbmctPnBheWxvYWQuc3Vic2NyaXB0aW9uczsKKwkJa2V5bGlzdCA9IHN0YWNrW3NwXS5rZXlsaXN0OwogCQlraXggPSBzdGFja1tzcF0ua2l4ICsgMTsKIAkJZ290byBhc2NlbmQ7CiAJfQpAQCAtNDQyLDE2ICs0NDksOSBAQAogCS8qIHdlIGZvdW5kIGEgdmlhYmxlIG1hdGNoICovCiAgZm91bmQ6CiAJYXRvbWljX2luYygma2V5LT51c2FnZSk7Ci0JcmVhZF91bmxvY2soJmtleXJpbmctPmxvY2spOwotCi0JLyogdW53aW5kIHRoZSBrZXlyaW5nIHN0YWNrICovCi0Jd2hpbGUgKHNwID4gMCkgewotCQlzcC0tOwotCQlyZWFkX3VubG9jaygmc3RhY2tbc3BdLmtleXJpbmctPmxvY2spOwotCX0KLQogCWtleV9jaGVjayhrZXkpOwogIGVycm9yOgorCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBrZXk7CiAKIH0gLyogZW5kIGtleXJpbmdfc2VhcmNoX2F1eCgpICovCkBAIC00NjksNyArNDY5LDExIEBACiAJCQkgICBzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCiAJCQkgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKIHsKLQlyZXR1cm4ga2V5cmluZ19zZWFyY2hfYXV4KGtleXJpbmcsIHR5cGUsIGRlc2NyaXB0aW9uLCB0eXBlLT5tYXRjaCk7CisJaWYgKCF0eXBlLT5tYXRjaCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0tFWSk7CisKKwlyZXR1cm4ga2V5cmluZ19zZWFyY2hfYXV4KGtleXJpbmcsIGN1cnJlbnQsCisJCQkJICB0eXBlLCBkZXNjcmlwdGlvbiwgdHlwZS0+bWF0Y2gpOwogCiB9IC8qIGVuZCBrZXlyaW5nX3NlYXJjaCgpICovCiAKQEAgLTQ4OSwxNSArNDkzLDE4IEBACiAJc3RydWN0IGtleSAqa2V5OwogCWludCBsb29wOwogCi0Ja2xpc3QgPSBrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnM7CisJcmN1X3JlYWRfbG9jaygpOworCisJa2xpc3QgPSByY3VfZGVyZWZlcmVuY2Uoa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zKTsKIAlpZiAoa2xpc3QpIHsKIAkJZm9yIChsb29wID0gMDsgbG9vcCA8IGtsaXN0LT5ua2V5czsgbG9vcCsrKSB7CiAJCQlrZXkgPSBrbGlzdC0+a2V5c1tsb29wXTsKIAogCQkJaWYgKGtleS0+dHlwZSA9PSBrdHlwZSAmJgotCQkJICAgIGtleS0+dHlwZS0+bWF0Y2goa2V5LCBkZXNjcmlwdGlvbikgJiYKKwkJCSAgICAoIWtleS0+dHlwZS0+bWF0Y2ggfHwKKwkJCSAgICAga2V5LT50eXBlLT5tYXRjaChrZXksIGRlc2NyaXB0aW9uKSkgJiYKIAkJCSAgICBrZXlfcGVybWlzc2lvbihrZXksIHBlcm0pICYmCi0JCQkgICAgIShrZXktPmZsYWdzICYgS0VZX0ZMQUdfUkVWT0tFRCkKKwkJCSAgICAhdGVzdF9iaXQoS0VZX0ZMQUdfUkVWT0tFRCwgJmtleS0+ZmxhZ3MpCiAJCQkgICAgKQogCQkJCWdvdG8gZm91bmQ7CiAJCX0KQEAgLTUwOSwxMiArNTE2LDU4IEBACiAgZm91bmQ6CiAJYXRvbWljX2luYygma2V5LT51c2FnZSk7CiAgZXJyb3I6CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIGtleTsKIAogfSAvKiBlbmQgX19rZXlyaW5nX3NlYXJjaF9vbmUoKSAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgorICogc2VhcmNoIGZvciBhbiBpbnN0YW50aWF0aW9uIGF1dGhvcmlzYXRpb24ga2V5IG1hdGNoaW5nIGEgdGFyZ2V0IGtleQorICogLSB0aGUgUkNVIHJlYWQgbG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlcgorICogLSBhIHRhcmdldF9pZCBvZiB6ZXJvIHNwZWNpZmllcyBhbnkgdmFsaWQgdG9rZW4KKyAqLworc3RydWN0IGtleSAqa2V5cmluZ19zZWFyY2hfaW5zdGtleShzdHJ1Y3Qga2V5ICprZXlyaW5nLAorCQkJCSAgIGtleV9zZXJpYWxfdCB0YXJnZXRfaWQpCit7CisJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYTsKKwlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdDsKKwlzdHJ1Y3Qga2V5ICppbnN0a2V5OworCWludCBsb29wOworCisJa2xpc3QgPSByY3VfZGVyZWZlcmVuY2Uoa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zKTsKKwlpZiAoa2xpc3QpIHsKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IGtsaXN0LT5ua2V5czsgbG9vcCsrKSB7CisJCQlpbnN0a2V5ID0ga2xpc3QtPmtleXNbbG9vcF07CisKKwkJCWlmIChpbnN0a2V5LT50eXBlICE9ICZrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoKQorCQkJCWNvbnRpbnVlOworCisJCQlya2EgPSBpbnN0a2V5LT5wYXlsb2FkLmRhdGE7CisJCQlpZiAodGFyZ2V0X2lkICYmIHJrYS0+dGFyZ2V0X2tleS0+c2VyaWFsICE9IHRhcmdldF9pZCkKKwkJCQljb250aW51ZTsKKworCQkJLyogdGhlIGF1dGgga2V5IGlzIHJldm9rZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gKi8KKwkJCWlmICghdGVzdF9iaXQoS0VZX0ZMQUdfUkVWT0tFRCwgJmluc3RrZXktPmZsYWdzKSkKKwkJCQlnb3RvIGZvdW5kOworCisJCQlpbnN0a2V5ID0gRVJSX1BUUigtRUtFWVJFVk9LRUQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCWluc3RrZXkgPSBFUlJfUFRSKC1FQUNDRVMpOworCWdvdG8gZXJyb3I7CisKK2ZvdW5kOgorCWF0b21pY19pbmMoJmluc3RrZXktPnVzYWdlKTsKK2Vycm9yOgorCXJldHVybiBpbnN0a2V5OworCit9IC8qIGVuZCBrZXlyaW5nX3NlYXJjaF9pbnN0a2V5KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKICAqIGZpbmQgYSBrZXlyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCiAgKiAtIGFsbCBuYW1lZCBrZXlyaW5ncyBhcmUgc2VhcmNoZWQKICAqIC0gb25seSBmaW5kIGtleXJpbmdzIHdpdGggc2VhcmNoIHBlcm1pc3Npb24gZm9yIHRoZSBwcm9jZXNzCkBAIC01NDAsNyArNTkzLDcgQEAKIAkJCQkgICAgJmtleXJpbmdfbmFtZV9oYXNoW2J1Y2tldF0sCiAJCQkJICAgIHR5cGVfZGF0YS5saW5rCiAJCQkJICAgICkgewotCQkJaWYgKGtleXJpbmctPmZsYWdzICYgS0VZX0ZMQUdfUkVWT0tFRCkKKwkJCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAma2V5cmluZy0+ZmxhZ3MpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoc3RyY21wKGtleXJpbmctPmRlc2NyaXB0aW9uLCBuYW1lKSAhPSAwKQpAQCAtNTc5LDcgKzYzMiw3IEBACiBzdGF0aWMgaW50IGtleXJpbmdfZGV0ZWN0X2N5Y2xlKHN0cnVjdCBrZXkgKkEsIHN0cnVjdCBrZXkgKkIpCiB7CiAJc3RydWN0IHsKLQkJc3RydWN0IGtleSAqc3VidHJlZTsKKwkJc3RydWN0IGtleXJpbmdfbGlzdCAqa2V5bGlzdDsKIAkJaW50IGtpeDsKIAl9IHN0YWNrW0tFWVJJTkdfU0VBUkNIX01BWF9ERVBUSF07CiAKQEAgLTU4NywyMCArNjQwLDIxIEBACiAJc3RydWN0IGtleSAqc3VidHJlZSwgKmtleTsKIAlpbnQgc3AsIGtpeCwgcmV0OwogCisJcmN1X3JlYWRfbG9jaygpOworCiAJcmV0ID0gLUVERUFETEs7CiAJaWYgKEEgPT0gQikKLQkJZ290byBlcnJvcjsKKwkJZ290byBjeWNsZV9kZXRlY3RlZDsKIAogCXN1YnRyZWUgPSBCOwogCXNwID0gMDsKIAogCS8qIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcga2V5cmluZyAqLwogIGRlc2NlbmQ6Ci0JcmVhZF9sb2NrKCZzdWJ0cmVlLT5sb2NrKTsKLQlpZiAoc3VidHJlZS0+ZmxhZ3MgJiBLRVlfRkxBR19SRVZPS0VEKQorCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAmc3VidHJlZS0+ZmxhZ3MpKQogCQlnb3RvIG5vdF90aGlzX2tleXJpbmc7CiAKLQlrZXlsaXN0ID0gc3VidHJlZS0+cGF5bG9hZC5zdWJzY3JpcHRpb25zOworCWtleWxpc3QgPSByY3VfZGVyZWZlcmVuY2Uoc3VidHJlZS0+cGF5bG9hZC5zdWJzY3JpcHRpb25zKTsKIAlpZiAoIWtleWxpc3QpCiAJCWdvdG8gbm90X3RoaXNfa2V5cmluZzsKIAlraXggPSAwOwpAQCAtNjE5LDcgKzY3Myw3IEBACiAJCQkJZ290byB0b29fZGVlcDsKIAogCQkJLyogc3RhY2sgdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KLQkJCXN0YWNrW3NwXS5zdWJ0cmVlID0gc3VidHJlZTsKKwkJCXN0YWNrW3NwXS5rZXlsaXN0ID0ga2V5bGlzdDsKIAkJCXN0YWNrW3NwXS5raXggPSBraXg7CiAJCQlzcCsrOwogCkBAIC02MzIsMTMgKzY4NiwxMCBAQAogCS8qIHRoZSBrZXlyaW5nIHdlJ3JlIGxvb2tpbmcgYXQgd2FzIGRpc3F1YWxpZmllZCBvciBkaWRuJ3QgY29udGFpbiBhCiAJICogbWF0Y2hpbmcga2V5ICovCiAgbm90X3RoaXNfa2V5cmluZzoKLQlyZWFkX3VubG9jaygmc3VidHJlZS0+bG9jayk7Ci0KIAlpZiAoc3AgPiAwKSB7CiAJCS8qIHJlc3VtZSB0aGUgY2hlY2tpbmcgb2YgYSBrZXlyaW5nIGhpZ2hlciB1cCBpbiB0aGUgdHJlZSAqLwogCQlzcC0tOwotCQlzdWJ0cmVlID0gc3RhY2tbc3BdLnN1YnRyZWU7Ci0JCWtleWxpc3QgPSBzdWJ0cmVlLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnM7CisJCWtleWxpc3QgPSBzdGFja1tzcF0ua2V5bGlzdDsKIAkJa2l4ID0gc3RhY2tbc3BdLmtpeCArIDE7CiAJCWdvdG8gYXNjZW5kOwogCX0KQEAgLTY0NiwzMCArNjk3LDM2IEBACiAJcmV0ID0gMDsgLyogbm8gY3ljbGVzIGRldGVjdGVkICovCiAKICBlcnJvcjoKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogCiAgdG9vX2RlZXA6CiAJcmV0ID0gLUVMT09QOwotCWdvdG8gZXJyb3JfdW53aW5kOworCWdvdG8gZXJyb3I7CisKICBjeWNsZV9kZXRlY3RlZDoKIAlyZXQgPSAtRURFQURMSzsKLSBlcnJvcl91bndpbmQ6Ci0JcmVhZF91bmxvY2soJnN1YnRyZWUtPmxvY2spOwotCi0JLyogdW53aW5kIHRoZSBrZXlyaW5nIHN0YWNrICovCi0Jd2hpbGUgKHNwID4gMCkgewotCQlzcC0tOwotCQlyZWFkX3VubG9jaygmc3RhY2tbc3BdLnN1YnRyZWUtPmxvY2spOwotCX0KLQogCWdvdG8gZXJyb3I7CiAKIH0gLyogZW5kIGtleXJpbmdfZGV0ZWN0X2N5Y2xlKCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKKyAqIGRpc3Bvc2Ugb2YgYSBrZXlyaW5nIGxpc3QgYWZ0ZXIgdGhlIFJDVSBncmFjZSBwZXJpb2QKKyAqLworc3RhdGljIHZvaWQga2V5cmluZ19saW5rX3JjdV9kaXNwb3NhbChzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdCA9CisJCWNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBrZXlyaW5nX2xpc3QsIHJjdSk7CisKKwlrZnJlZShrbGlzdCk7CisKK30gLyogZW5kIGtleXJpbmdfbGlua19yY3VfZGlzcG9zYWwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgogICogbGluayBhIGtleSBpbnRvIHRvIGEga2V5cmluZwotICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBrZXlyaW5nJ3Mgc2VtYXBob3JlIGhlbGQKKyAqIC0gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUga2V5cmluZydzIHNlbWFwaG9yZSB3cml0ZS1sb2NrZWQKICAqLwogaW50IF9fa2V5X2xpbmsoc3RydWN0IGtleSAqa2V5cmluZywgc3RydWN0IGtleSAqa2V5KQogewpAQCAtNjc5LDcgKzczNiw3IEBACiAJaW50IHJldDsKIAogCXJldCA9IC1FS0VZUkVWT0tFRDsKLQlpZiAoa2V5cmluZy0+ZmxhZ3MgJiBLRVlfRkxBR19SRVZPS0VEKQorCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELCAma2V5cmluZy0+ZmxhZ3MpKQogCQlnb3RvIGVycm9yOwogCiAJcmV0ID0gLUVOT1RESVI7CkBAIC03MTAsOSArNzY3LDEwIEBACiAJCS8qIHRoZXJlJ3Mgc3VmZmljaWVudCBzbGFjayBzcGFjZSB0byBhZGQgZGlyZWN0bHkgKi8KIAkJYXRvbWljX2luYygma2V5LT51c2FnZSk7CiAKLQkJd3JpdGVfbG9jaygma2V5cmluZy0+bG9jayk7Ci0JCWtsaXN0LT5rZXlzW2tsaXN0LT5ua2V5cysrXSA9IGtleTsKLQkJd3JpdGVfdW5sb2NrKCZrZXlyaW5nLT5sb2NrKTsKKwkJa2xpc3QtPmtleXNba2xpc3QtPm5rZXlzXSA9IGtleTsKKwkJc21wX3dtYigpOworCQlrbGlzdC0+bmtleXMrKzsKKwkJc21wX3dtYigpOwogCiAJCXJldCA9IDA7CiAJfQpAQCAtNzIzLDcgKzc4MSw5IEBACiAJCQltYXggKz0ga2xpc3QtPm1heGtleXM7CiAKIAkJcmV0ID0gLUVORklMRTsKLQkJc2l6ZSA9IHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKCprZXkpICogbWF4OworCQlpZiAobWF4ID4gNjU1MzUpCisJCQlnb3RvIGVycm9yMzsKKwkJc2l6ZSA9IHNpemVvZigqa2xpc3QpICsgc2l6ZW9mKHN0cnVjdCBrZXkgKikgKiBtYXg7CiAJCWlmIChzaXplID4gUEFHRV9TSVpFKQogCQkJZ290byBlcnJvcjM7CiAKQEAgLTc0MywxNCArODAzLDEzIEBACiAKIAkJLyogYWRkIHRoZSBrZXkgaW50byB0aGUgbmV3IHNwYWNlICovCiAJCWF0b21pY19pbmMoJmtleS0+dXNhZ2UpOwotCi0JCXdyaXRlX2xvY2soJmtleXJpbmctPmxvY2spOwotCQlrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMgPSBua2xpc3Q7CiAJCW5rbGlzdC0+a2V5c1tua2xpc3QtPm5rZXlzKytdID0ga2V5OwotCQl3cml0ZV91bmxvY2soJmtleXJpbmctPmxvY2spOworCisJCXJjdV9hc3NpZ25fcG9pbnRlcihrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMsIG5rbGlzdCk7CiAKIAkJLyogZGlzcG9zZSBvZiB0aGUgb2xkIGtleXJpbmcgbGlzdCAqLwotCQlrZnJlZShrbGlzdCk7CisJCWlmIChrbGlzdCkKKwkJCWNhbGxfcmN1KCZrbGlzdC0+cmN1LCBrZXlyaW5nX2xpbmtfcmN1X2Rpc3Bvc2FsKTsKIAogCQlyZXQgPSAwOwogCX0KQEAgLTc5MSwxMSArODUwLDI2IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCisgKiBkaXNwb3NlIG9mIGEga2V5cmluZyBsaXN0IGFmdGVyIHRoZSBSQ1UgZ3JhY2UgcGVyaW9kLCBmcmVlaW5nIHRoZSB1bmxpbmtlZAorICoga2V5CisgKi8KK3N0YXRpYyB2b2lkIGtleXJpbmdfdW5saW5rX3JjdV9kaXNwb3NhbChzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdCA9CisJCWNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBrZXlyaW5nX2xpc3QsIHJjdSk7CisKKwlrZXlfcHV0KGtsaXN0LT5rZXlzW2tsaXN0LT5kZWxrZXldKTsKKwlrZnJlZShrbGlzdCk7CisKK30gLyogZW5kIGtleXJpbmdfdW5saW5rX3JjdV9kaXNwb3NhbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCiAgKiB1bmxpbmsgdGhlIGZpcnN0IGxpbmsgdG8gYSBrZXkgZnJvbSBhIGtleXJpbmcKICAqLwogaW50IGtleV91bmxpbmsoc3RydWN0IGtleSAqa2V5cmluZywgc3RydWN0IGtleSAqa2V5KQogewotCXN0cnVjdCBrZXlyaW5nX2xpc3QgKmtsaXN0OworCXN0cnVjdCBrZXlyaW5nX2xpc3QgKmtsaXN0LCAqbmtsaXN0OwogCWludCBsb29wLCByZXQ7CiAKIAlrZXlfY2hlY2soa2V5cmluZyk7CkBAIC04MTksMzEgKzg5Myw0NiBAQAogCXJldCA9IC1FTk9FTlQ7CiAJZ290byBlcnJvcjsKIAotIGtleV9pc19wcmVzZW50Ogora2V5X2lzX3ByZXNlbnQ6CisJLyogd2UgbmVlZCB0byBjb3B5IHRoZSBrZXkgbGlzdCBmb3IgUkNVIHB1cnBvc2VzICovCisJbmtsaXN0ID0ga21hbGxvYyhzaXplb2YoKmtsaXN0KSArCisJCQkgc2l6ZW9mKHN0cnVjdCBrZXkgKikgKiBrbGlzdC0+bWF4a2V5cywKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIW5rbGlzdCkKKwkJZ290byBub21lbTsKKwlua2xpc3QtPm1heGtleXMgPSBrbGlzdC0+bWF4a2V5czsKKwlua2xpc3QtPm5rZXlzID0ga2xpc3QtPm5rZXlzIC0gMTsKKworCWlmIChsb29wID4gMCkKKwkJbWVtY3B5KCZua2xpc3QtPmtleXNbMF0sCisJCSAgICAgICAma2xpc3QtPmtleXNbMF0sCisJCSAgICAgICBsb29wICogc2l6ZW9mKHN0cnVjdCBrZXkgKikpOworCisJaWYgKGxvb3AgPCBua2xpc3QtPm5rZXlzKQorCQltZW1jcHkoJm5rbGlzdC0+a2V5c1tsb29wXSwKKwkJICAgICAgICZrbGlzdC0+a2V5c1tsb29wICsgMV0sCisJCSAgICAgICAobmtsaXN0LT5ua2V5cyAtIGxvb3ApICogc2l6ZW9mKHN0cnVjdCBrZXkgKikpOworCiAJLyogYWRqdXN0IHRoZSB1c2VyJ3MgcXVvdGEgKi8KIAlrZXlfcGF5bG9hZF9yZXNlcnZlKGtleXJpbmcsCiAJCQkgICAga2V5cmluZy0+ZGF0YWxlbiAtIEtFWVFVT1RBX0xJTktfQllURVMpOwogCi0JLyogc2h1ZmZsZSBkb3duIHRoZSBrZXkgcG9pbnRlcnMKLQkgKiAtIGl0IG1pZ2h0IGJlIHdvcnRoIHNocmlua2luZyB0aGUgYWxsb2NhdGVkIG1lbW9yeSwgYnV0IHRoYXQgcnVucwotCSAqICAgdGhlIHJpc2sgb2YgRU5PTUVNIGFzIHdlIHdvdWxkIGhhdmUgdG8gY29weQotCSAqLwotCXdyaXRlX2xvY2soJmtleXJpbmctPmxvY2spOwotCi0Ja2xpc3QtPm5rZXlzLS07Ci0JaWYgKGxvb3AgPCBrbGlzdC0+bmtleXMpCi0JCW1lbWNweSgma2xpc3QtPmtleXNbbG9vcF0sCi0JCSAgICAgICAma2xpc3QtPmtleXNbbG9vcCArIDFdLAotCQkgICAgICAgKGtsaXN0LT5ua2V5cyAtIGxvb3ApICogc2l6ZW9mKHN0cnVjdCBrZXkgKikpOwotCi0Jd3JpdGVfdW5sb2NrKCZrZXlyaW5nLT5sb2NrKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoa2V5cmluZy0+cGF5bG9hZC5zdWJzY3JpcHRpb25zLCBua2xpc3QpOwogCiAJdXBfd3JpdGUoJmtleXJpbmctPnNlbSk7Ci0Ja2V5X3B1dChrZXkpOworCisJLyogc2NoZWR1bGUgZm9yIGxhdGVyIGNsZWFudXAgKi8KKwlrbGlzdC0+ZGVsa2V5ID0gbG9vcDsKKwljYWxsX3JjdSgma2xpc3QtPnJjdSwga2V5cmluZ191bmxpbmtfcmN1X2Rpc3Bvc2FsKTsKKwogCXJldCA9IDA7CiAKLSBlcnJvcjoKK2Vycm9yOgogCXJldHVybiByZXQ7Citub21lbToKKwlyZXQgPSAtRU5PTUVNOworCXVwX3dyaXRlKCZrZXlyaW5nLT5zZW0pOworCWdvdG8gZXJyb3I7CiAKIH0gLyogZW5kIGtleV91bmxpbmsoKSAqLwogCkBAIC04NTEsMTMgKzk0MCwzMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgorICogZGlzcG9zZSBvZiBhIGtleXJpbmcgbGlzdCBhZnRlciB0aGUgUkNVIGdyYWNlIHBlcmlvZCwgcmVsZWFzaW5nIHRoZSBrZXlzIGl0CisgKiBsaW5rcyB0bworICovCitzdGF0aWMgdm9pZCBrZXlyaW5nX2NsZWFyX3JjdV9kaXNwb3NhbChzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qga2V5cmluZ19saXN0ICprbGlzdDsKKwlpbnQgbG9vcDsKKworCWtsaXN0ID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGtleXJpbmdfbGlzdCwgcmN1KTsKKworCWZvciAobG9vcCA9IGtsaXN0LT5ua2V5cyAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQorCQlrZXlfcHV0KGtsaXN0LT5rZXlzW2xvb3BdKTsKKworCWtmcmVlKGtsaXN0KTsKKworfSAvKiBlbmQga2V5cmluZ19jbGVhcl9yY3VfZGlzcG9zYWwoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgogICogY2xlYXIgdGhlIHNwZWNpZmllZCBwcm9jZXNzIGtleXJpbmcKICAqIC0gaW1wbGVtZW50cyBrZXljdGwoS0VZQ1RMX0NMRUFSKQogICovCiBpbnQga2V5cmluZ19jbGVhcihzdHJ1Y3Qga2V5ICprZXlyaW5nKQogewogCXN0cnVjdCBrZXlyaW5nX2xpc3QgKmtsaXN0OwotCWludCBsb29wLCByZXQ7CisJaW50IHJldDsKIAogCXJldCA9IC1FTk9URElSOwogCWlmIChrZXlyaW5nLT50eXBlID09ICZrZXlfdHlwZV9rZXlyaW5nKSB7CkBAIC04NzAsMjAgKzk3OCwxNSBAQAogCQkJa2V5X3BheWxvYWRfcmVzZXJ2ZShrZXlyaW5nLAogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBrZXlyaW5nX2xpc3QpKTsKIAotCQkJd3JpdGVfbG9jaygma2V5cmluZy0+bG9jayk7Ci0JCQlrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMgPSBOVUxMOwotCQkJd3JpdGVfdW5sb2NrKCZrZXlyaW5nLT5sb2NrKTsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihrZXlyaW5nLT5wYXlsb2FkLnN1YnNjcmlwdGlvbnMsCisJCQkJCSAgIE5VTEwpOwogCQl9CiAKIAkJdXBfd3JpdGUoJmtleXJpbmctPnNlbSk7CiAKIAkJLyogZnJlZSB0aGUga2V5cyBhZnRlciB0aGUgbG9ja3MgaGF2ZSBiZWVuIGRyb3BwZWQgKi8KLQkJaWYgKGtsaXN0KSB7Ci0JCQlmb3IgKGxvb3AgPSBrbGlzdC0+bmtleXMgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKLQkJCQlrZXlfcHV0KGtsaXN0LT5rZXlzW2xvb3BdKTsKLQotCQkJa2ZyZWUoa2xpc3QpOwotCQl9CisJCWlmIChrbGlzdCkKKwkJCWNhbGxfcmN1KCZrbGlzdC0+cmN1LCBrZXlyaW5nX2NsZWFyX3JjdV9kaXNwb3NhbCk7CiAKIAkJcmV0ID0gMDsKIAl9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3Byb2MuYyBiL3NlY3VyaXR5L2tleXMvcHJvYy5jCmluZGV4IDkxMzQzYjguLmM1NWNmMWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcHJvYy5jCisrKyBiL3NlY3VyaXR5L2tleXMvcHJvYy5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogCW5vdyA9IGN1cnJlbnRfa2VybmVsX3RpbWUoKTsKIAotCXJlYWRfbG9jaygma2V5LT5sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAKIAkvKiBjb21lIHVwIHdpdGggYSBzdWl0YWJsZSB0aW1lb3V0IHZhbHVlICovCiAJaWYgKGtleS0+ZXhwaXJ5ID09IDApIHsKQEAgLTE2NCwxNCArMTY0LDE3IEBACiAJCQlzcHJpbnRmKHhidWYsICIlbHV3IiwgdGltbyAvICg2MCo2MCoyNCo3KSk7CiAJfQogCisjZGVmaW5lIHNob3dmbGFnKEtFWSwgTEVUVEVSLCBGTEFHKSBcCisJKHRlc3RfYml0KEZMQUcsCSYoS0VZKS0+ZmxhZ3MpID8gTEVUVEVSIDogJy0nKQorCiAJc2VxX3ByaW50ZihtLCAiJTA4eCAlYyVjJWMlYyVjJWMgJTVkICU0cyAlMDZ4ICU1ZCAlNWQgJS05LjlzICIsCiAJCSAgIGtleS0+c2VyaWFsLAotCQkgICBrZXktPmZsYWdzICYgS0VZX0ZMQUdfSU5TVEFOVElBVEVECT8gJ0knIDogJy0nLAotCQkgICBrZXktPmZsYWdzICYgS0VZX0ZMQUdfUkVWT0tFRAk/ICdSJyA6ICctJywKLQkJICAga2V5LT5mbGFncyAmIEtFWV9GTEFHX0RFQUQJCT8gJ0QnIDogJy0nLAotCQkgICBrZXktPmZsYWdzICYgS0VZX0ZMQUdfSU5fUVVPVEEJPyAnUScgOiAnLScsCi0JCSAgIGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19VU0VSX0NPTlNUUlVDVAk/ICdVJyA6ICctJywKLQkJICAga2V5LT5mbGFncyAmIEtFWV9GTEFHX05FR0FUSVZFCT8gJ04nIDogJy0nLAorCQkgICBzaG93ZmxhZyhrZXksICdJJywgS0VZX0ZMQUdfSU5TVEFOVElBVEVEKSwKKwkJICAgc2hvd2ZsYWcoa2V5LCAnUicsIEtFWV9GTEFHX1JFVk9LRUQpLAorCQkgICBzaG93ZmxhZyhrZXksICdEJywgS0VZX0ZMQUdfREVBRCksCisJCSAgIHNob3dmbGFnKGtleSwgJ1EnLCBLRVlfRkxBR19JTl9RVU9UQSksCisJCSAgIHNob3dmbGFnKGtleSwgJ1UnLCBLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCksCisJCSAgIHNob3dmbGFnKGtleSwgJ04nLCBLRVlfRkxBR19ORUdBVElWRSksCiAJCSAgIGF0b21pY19yZWFkKCZrZXktPnVzYWdlKSwKIAkJICAgeGJ1ZiwKIAkJICAga2V5LT5wZXJtLApAQCAtMTc5LDExICsxODIsMTMgQEAKIAkJICAga2V5LT5naWQsCiAJCSAgIGtleS0+dHlwZS0+bmFtZSk7CiAKKyN1bmRlZiBzaG93ZmxhZworCiAJaWYgKGtleS0+dHlwZS0+ZGVzY3JpYmUpCiAJCWtleS0+dHlwZS0+ZGVzY3JpYmUoa2V5LCBtKTsKIAlzZXFfcHV0YyhtLCAnXG4nKTsKIAotCXJlYWRfdW5sb2NrKCZrZXktPmxvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMgYi9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCmluZGV4IDJlYjBlNDcuLjliMDM2OWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKKysrIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHByb2Nlc3Nfa2V5cy5jOiBtYW5hZ2VtZW50IG9mIGEgcHJvY2VzcydzIGtleXJpbmdzCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNC01IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zOCwxMCArMzgsOSBAQAogCS5zZXJpYWwJCT0gMiwKIAkudHlwZQkJPSAma2V5X3R5cGVfa2V5cmluZywKIAkudXNlcgkJPSAmcm9vdF9rZXlfdXNlciwKLQkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5zZW0JCT0gX19SV1NFTV9JTklUSUFMSVpFUihyb290X3VzZXJfa2V5cmluZy5zZW0pLAogCS5wZXJtCQk9IEtFWV9VU1JfQUxMLAotCS5mbGFncwkJPSBLRVlfRkxBR19JTlNUQU5USUFURUQsCisJLmZsYWdzCQk9IDEgPDwgS0VZX0ZMQUdfSU5TVEFOVElBVEVELAogCS5kZXNjcmlwdGlvbgk9ICJfdWlkLjAiLAogI2lmZGVmIEtFWV9ERUJVR0dJTkcKIAkubWFnaWMJCT0gS0VZX0RFQlVHX01BR0lDLApAQCAtNTQsMTAgKzUzLDkgQEAKIAkuc2VyaWFsCQk9IDEsCiAJLnR5cGUJCT0gJmtleV90eXBlX2tleXJpbmcsCiAJLnVzZXIJCT0gJnJvb3Rfa2V5X3VzZXIsCi0JLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKIAkuc2VtCQk9IF9fUldTRU1fSU5JVElBTElaRVIocm9vdF9zZXNzaW9uX2tleXJpbmcuc2VtKSwKIAkucGVybQkJPSBLRVlfVVNSX0FMTCwKLQkuZmxhZ3MJCT0gS0VZX0ZMQUdfSU5TVEFOVElBVEVELAorCS5mbGFncwkJPSAxIDw8IEtFWV9GTEFHX0lOU1RBTlRJQVRFRCwKIAkuZGVzY3JpcHRpb24JPSAiX3VpZF9zZXMuMCIsCiAjaWZkZWYgS0VZX0RFQlVHR0lORwogCS5tYWdpYwkJPSBLRVlfREVCVUdfTUFHSUMsCkBAIC0xNjcsNyArMTY1LDcgQEAKIC8qCiAgKiBtYWtlIHN1cmUgYSBwcm9jZXNzIGtleXJpbmcgaXMgaW5zdGFsbGVkCiAgKi8KLXN0YXRpYyBpbnQgaW5zdGFsbF9wcm9jZXNzX2tleXJpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCitpbnQgaW5zdGFsbF9wcm9jZXNzX2tleXJpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga2V5ICprZXlyaW5nOwpAQCAtMTgzLDcgKzE4MSw3IEBACiAJCQlnb3RvIGVycm9yOwogCQl9CiAKLQkJLyogYXR0YWNoIG9yIHN3YXAga2V5cmluZ3MgKi8KKwkJLyogYXR0YWNoIGtleXJpbmcgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCQlpZiAoIXRzay0+c2lnbmFsLT5wcm9jZXNzX2tleXJpbmcpIHsKIAkJCXRzay0+c2lnbmFsLT5wcm9jZXNzX2tleXJpbmcgPSBrZXlyaW5nOwpAQCAtMjI5LDEyICsyMjcsMTQgQEAKIAogCS8qIGluc3RhbGwgdGhlIGtleXJpbmcgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0Jb2xkID0gdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZzsKLQl0c2stPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nID0ga2V5cmluZzsKKwlvbGQgPSByY3VfZGVyZWZlcmVuY2UodHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZyk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHRzay0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcsIGtleXJpbmcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCiAJcmV0ID0gMDsKIAorCS8qIHdlJ3JlIHVzaW5nIFJDVSBvbiB0aGUgcG9pbnRlciAqLworCXN5bmNocm9uaXplX3JjdSgpOwogCWtleV9wdXQob2xkKTsKICBlcnJvcjoKIAlyZXR1cm4gcmV0OwpAQCAtMjQ3LDggKzI0Nyw2IEBACiAgKi8KIGludCBjb3B5X3RocmVhZF9ncm91cF9rZXlzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlrZXlfY2hlY2soY3VycmVudC0+dGhyZWFkX2dyb3VwLT5zZXNzaW9uX2tleXJpbmcpOwogCWtleV9jaGVjayhjdXJyZW50LT50aHJlYWRfZ3JvdXAtPnByb2Nlc3Nfa2V5cmluZyk7CiAKQEAgLTI1NiwxMCArMjU0LDEwIEBACiAJdHNrLT5zaWduYWwtPnByb2Nlc3Nfa2V5cmluZyA9IE5VTEw7CiAKIAkvKiBzYW1lIHNlc3Npb24ga2V5cmluZyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJcmN1X3JlYWRfbG9jaygpOwogCXRzay0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcgPQotCQlrZXlfZ2V0KGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCWtleV9nZXQocmN1X2RlcmVmZXJlbmNlKGN1cnJlbnQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMzQ5LDkgKzM0Nyw3IEBACiAJLyogdXBkYXRlIHRoZSBvd25lcnNoaXAgb2YgdGhlIHRocmVhZCBrZXlyaW5nICovCiAJaWYgKHRzay0+dGhyZWFkX2tleXJpbmcpIHsKIAkJZG93bl93cml0ZSgmdHNrLT50aHJlYWRfa2V5cmluZy0+c2VtKTsKLQkJd3JpdGVfbG9jaygmdHNrLT50aHJlYWRfa2V5cmluZy0+bG9jayk7CiAJCXRzay0+dGhyZWFkX2tleXJpbmctPnVpZCA9IHRzay0+ZnN1aWQ7Ci0JCXdyaXRlX3VubG9jaygmdHNrLT50aHJlYWRfa2V5cmluZy0+bG9jayk7CiAJCXVwX3dyaXRlKCZ0c2stPnRocmVhZF9rZXlyaW5nLT5zZW0pOwogCX0KIApAQCAtMzY2LDkgKzM2Miw3IEBACiAJLyogdXBkYXRlIHRoZSBvd25lcnNoaXAgb2YgdGhlIHRocmVhZCBrZXlyaW5nICovCiAJaWYgKHRzay0+dGhyZWFkX2tleXJpbmcpIHsKIAkJZG93bl93cml0ZSgmdHNrLT50aHJlYWRfa2V5cmluZy0+c2VtKTsKLQkJd3JpdGVfbG9jaygmdHNrLT50aHJlYWRfa2V5cmluZy0+bG9jayk7CiAJCXRzay0+dGhyZWFkX2tleXJpbmctPmdpZCA9IHRzay0+ZnNnaWQ7Ci0JCXdyaXRlX3VubG9jaygmdHNrLT50aHJlYWRfa2V5cmluZy0+bG9jayk7CiAJCXVwX3dyaXRlKCZ0c2stPnRocmVhZF9rZXlyaW5nLT5zZW0pOwogCX0KIApAQCAtMzgyLDEzICszNzYsMTMgQEAKICAqIC0gd2UgcmV0dXJuIC1FQUdBSU4gaWYgd2UgZGlkbid0IGZpbmQgYW55IG1hdGNoaW5nIGtleQogICogLSB3ZSByZXR1cm4gLUVOT0tFWSBpZiB3ZSBmb3VuZCBvbmx5IG5lZ2F0aXZlIG1hdGNoaW5nIGtleXMKICAqLwotc3RydWN0IGtleSAqc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3NfYXV4KHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKLQkJCQkJY29uc3Qgdm9pZCAqZGVzY3JpcHRpb24sCi0JCQkJCWtleV9tYXRjaF9mdW5jX3QgbWF0Y2gpCitzdHJ1Y3Qga2V5ICpzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyhzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCisJCQkJICAgIGNvbnN0IHZvaWQgKmRlc2NyaXB0aW9uLAorCQkJCSAgICBrZXlfbWF0Y2hfZnVuY190IG1hdGNoLAorCQkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGtleSAqa2V5LCAqcmV0LCAqZXJyLCAqdG1wOworCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2E7CisJc3RydWN0IGtleSAqa2V5LCAqcmV0LCAqZXJyLCAqaW5zdGtleTsKIAogCS8qIHdlIHdhbnQgdG8gcmV0dXJuIC1FQUdBSU4gb3IgLUVOT0tFWSBpZiBhbnkgb2YgdGhlIGtleXJpbmdzIHdlcmUKIAkgKiBzZWFyY2hhYmxlLCBidXQgd2UgZmFpbGVkIHRvIGZpbmQgYSBrZXkgb3Igd2UgZm91bmQgYSBuZWdhdGl2ZSBrZXk7CkBAIC00MDIsOSArMzk2LDkgQEAKIAllcnIgPSBFUlJfUFRSKC1FQUdBSU4pOwogCiAJLyogc2VhcmNoIHRoZSB0aHJlYWQga2V5cmluZyBmaXJzdCAqLwotCWlmICh0c2stPnRocmVhZF9rZXlyaW5nKSB7Ci0JCWtleSA9IGtleXJpbmdfc2VhcmNoX2F1eCh0c2stPnRocmVhZF9rZXlyaW5nLCB0eXBlLAotCQkJCQkgZGVzY3JpcHRpb24sIG1hdGNoKTsKKwlpZiAoY29udGV4dC0+dGhyZWFkX2tleXJpbmcpIHsKKwkJa2V5ID0ga2V5cmluZ19zZWFyY2hfYXV4KGNvbnRleHQtPnRocmVhZF9rZXlyaW5nLAorCQkJCQkgY29udGV4dCwgdHlwZSwgZGVzY3JpcHRpb24sIG1hdGNoKTsKIAkJaWYgKCFJU19FUlIoa2V5KSkKIAkJCWdvdG8gZm91bmQ7CiAKQEAgLTQyMiw5ICs0MTYsOSBAQAogCX0KIAogCS8qIHNlYXJjaCB0aGUgcHJvY2VzcyBrZXlyaW5nIHNlY29uZCAqLwotCWlmICh0c2stPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nKSB7Ci0JCWtleSA9IGtleXJpbmdfc2VhcmNoX2F1eCh0c2stPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nLAotCQkJCQkgdHlwZSwgZGVzY3JpcHRpb24sIG1hdGNoKTsKKwlpZiAoY29udGV4dC0+c2lnbmFsLT5wcm9jZXNzX2tleXJpbmcpIHsKKwkJa2V5ID0ga2V5cmluZ19zZWFyY2hfYXV4KGNvbnRleHQtPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nLAorCQkJCQkgY29udGV4dCwgdHlwZSwgZGVzY3JpcHRpb24sIG1hdGNoKTsKIAkJaWYgKCFJU19FUlIoa2V5KSkKIAkJCWdvdG8gZm91bmQ7CiAKQEAgLTQ0MSw1MiArNDM1LDkzIEBACiAJCX0KIAl9CiAKLQkvKiBzZWFyY2ggdGhlIHNlc3Npb24ga2V5cmluZyBsYXN0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCS8qIHNlYXJjaCB0aGUgc2Vzc2lvbiBrZXlyaW5nICovCisJaWYgKGNvbnRleHQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJa2V5ID0ga2V5cmluZ19zZWFyY2hfYXV4KAorCQkJcmN1X2RlcmVmZXJlbmNlKGNvbnRleHQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSwKKwkJCWNvbnRleHQsIHR5cGUsIGRlc2NyaXB0aW9uLCBtYXRjaCk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCi0JdG1wID0gdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZzsKLQlpZiAoIXRtcCkKLQkJdG1wID0gdHNrLT51c2VyLT5zZXNzaW9uX2tleXJpbmc7Ci0JYXRvbWljX2luYygmdG1wLT51c2FnZSk7CisJCWlmICghSVNfRVJSKGtleSkpCisJCQlnb3RvIGZvdW5kOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0KLQlrZXkgPSBrZXlyaW5nX3NlYXJjaF9hdXgodG1wLCB0eXBlLCBkZXNjcmlwdGlvbiwgbWF0Y2gpOwotCWtleV9wdXQodG1wKTsKLQlpZiAoIUlTX0VSUihrZXkpKQotCQlnb3RvIGZvdW5kOwotCi0Jc3dpdGNoIChQVFJfRVJSKGtleSkpIHsKLQljYXNlIC1FQUdBSU46IC8qIG5vIGtleSAqLwotCQlpZiAocmV0KQorCQlzd2l0Y2ggKFBUUl9FUlIoa2V5KSkgeworCQljYXNlIC1FQUdBSU46IC8qIG5vIGtleSAqLworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJY2FzZSAtRU5PS0VZOiAvKiBuZWdhdGl2ZSBrZXkgKi8KKwkJCXJldCA9IGtleTsKIAkJCWJyZWFrOwotCWNhc2UgLUVOT0tFWTogLyogbmVnYXRpdmUga2V5ICovCi0JCXJldCA9IGtleTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0ga2V5OwotCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGtleTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogaWYgdGhpcyBwcm9jZXNzIGhhcyBhIHNlc3Npb24ga2V5cmluZyBhbmQgdGhhdCBoYXMgYW4KKwkJICogaW5zdGFudGlhdGlvbiBhdXRob3Jpc2F0aW9uIGtleSBpbiB0aGUgYm90dG9tIGxldmVsLCB0aGVuIHdlCisJCSAqIGFsc28gc2VhcmNoIHRoZSBrZXlyaW5ncyBvZiB0aGUgcHJvY2VzcyBtZW50aW9uZWQgdGhlcmUgKi8KKwkJaWYgKGNvbnRleHQgIT0gY3VycmVudCkKKwkJCWdvdG8gbm9fa2V5OworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJaW5zdGtleSA9IF9fa2V5cmluZ19zZWFyY2hfb25lKAorCQkJcmN1X2RlcmVmZXJlbmNlKGNvbnRleHQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSwKKwkJCSZrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoLCBOVUxMLCAwKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJaWYgKElTX0VSUihpbnN0a2V5KSkKKwkJCWdvdG8gbm9fa2V5OworCisJCXJrYSA9IGluc3RrZXktPnBheWxvYWQuZGF0YTsKKworCQlrZXkgPSBzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyh0eXBlLCBkZXNjcmlwdGlvbiwgbWF0Y2gsCisJCQkJCSAgICAgIHJrYS0+Y29udGV4dCk7CisJCWtleV9wdXQoaW5zdGtleSk7CisKKwkJaWYgKCFJU19FUlIoa2V5KSkKKwkJCWdvdG8gZm91bmQ7CisKKwkJc3dpdGNoIChQVFJfRVJSKGtleSkpIHsKKwkJY2FzZSAtRUFHQUlOOiAvKiBubyBrZXkgKi8KKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCWNhc2UgLUVOT0tFWTogLyogbmVnYXRpdmUga2V5ICovCisJCQlyZXQgPSBrZXk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGtleTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIG9yIHNlYXJjaCB0aGUgdXNlci1zZXNzaW9uIGtleXJpbmcgKi8KKwllbHNlIHsKKwkJa2V5ID0ga2V5cmluZ19zZWFyY2hfYXV4KGNvbnRleHQtPnVzZXItPnNlc3Npb25fa2V5cmluZywKKwkJCQkJIGNvbnRleHQsIHR5cGUsIGRlc2NyaXB0aW9uLCBtYXRjaCk7CisJCWlmICghSVNfRVJSKGtleSkpCisJCQlnb3RvIGZvdW5kOworCisJCXN3aXRjaCAoUFRSX0VSUihrZXkpKSB7CisJCWNhc2UgLUVBR0FJTjogLyogbm8ga2V5ICovCisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQljYXNlIC1FTk9LRVk6IC8qIG5lZ2F0aXZlIGtleSAqLworCQkJcmV0ID0ga2V5OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSBrZXk7CisJCQlicmVhazsKKwkJfQogCX0KIAorCitub19rZXk6CiAJLyogbm8ga2V5IC0gZGVjaWRlIG9uIHRoZSBlcnJvciB3ZSdyZSBnb2luZyB0byBnbyBmb3IgKi8KIAlrZXkgPSByZXQgPyByZXQgOiBlcnI7CiAKLSBmb3VuZDoKK2ZvdW5kOgogCXJldHVybiBrZXk7CiAKLX0gLyogZW5kIHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzX2F1eCgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBzZWFyY2ggdGhlIHByb2Nlc3Mga2V5cmluZ3MgZm9yIHRoZSBmaXJzdCBtYXRjaGluZyBrZXkKLSAqIC0gd2UgcmV0dXJuIC1FQUdBSU4gaWYgd2UgZGlkbid0IGZpbmQgYW55IG1hdGNoaW5nIGtleQotICogLSB3ZSByZXR1cm4gLUVOT0tFWSBpZiB3ZSBmb3VuZCBvbmx5IG5lZ2F0aXZlIG1hdGNoaW5nIGtleXMKLSAqLwotc3RydWN0IGtleSAqc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3Moc3RydWN0IGtleV90eXBlICp0eXBlLAotCQkJCSAgICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbikKLXsKLQlyZXR1cm4gc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3NfYXV4KHR5cGUsIGRlc2NyaXB0aW9uLCB0eXBlLT5tYXRjaCk7Ci0KIH0gLyogZW5kIHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzKCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDk1LDcyICs1MzAsNzMgQEAKICAqIC0gZG9uJ3QgY3JlYXRlIHNwZWNpYWwga2V5cmluZ3MgdW5sZXNzIHNvIHJlcXVlc3RlZAogICogLSBwYXJ0aWFsbHkgY29uc3RydWN0ZWQga2V5cyBhcmVuJ3QgZm91bmQgdW5sZXNzIHJlcXVlc3RlZAogICovCi1zdHJ1Y3Qga2V5ICpsb29rdXBfdXNlcl9rZXkoa2V5X3NlcmlhbF90IGlkLCBpbnQgY3JlYXRlLCBpbnQgcGFydGlhbCwKLQkJCSAgICBrZXlfcGVybV90IHBlcm0pCitzdHJ1Y3Qga2V5ICpsb29rdXBfdXNlcl9rZXkoc3RydWN0IHRhc2tfc3RydWN0ICpjb250ZXh0LCBrZXlfc2VyaWFsX3QgaWQsCisJCQkgICAgaW50IGNyZWF0ZSwgaW50IHBhcnRpYWwsIGtleV9wZXJtX3QgcGVybSkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga2V5ICprZXk7CiAJaW50IHJldDsKIAorCWlmICghY29udGV4dCkKKwkJY29udGV4dCA9IGN1cnJlbnQ7CisKIAlrZXkgPSBFUlJfUFRSKC1FTk9LRVkpOwogCiAJc3dpdGNoIChpZCkgewogCWNhc2UgS0VZX1NQRUNfVEhSRUFEX0tFWVJJTkc6Ci0JCWlmICghdHNrLT50aHJlYWRfa2V5cmluZykgeworCQlpZiAoIWNvbnRleHQtPnRocmVhZF9rZXlyaW5nKSB7CiAJCQlpZiAoIWNyZWF0ZSkKIAkJCQlnb3RvIGVycm9yOwogCi0JCQlyZXQgPSBpbnN0YWxsX3RocmVhZF9rZXlyaW5nKHRzayk7CisJCQlyZXQgPSBpbnN0YWxsX3RocmVhZF9rZXlyaW5nKGNvbnRleHQpOwogCQkJaWYgKHJldCA8IDApIHsKIAkJCQlrZXkgPSBFUlJfUFRSKHJldCk7CiAJCQkJZ290byBlcnJvcjsKIAkJCX0KIAkJfQogCi0JCWtleSA9IHRzay0+dGhyZWFkX2tleXJpbmc7CisJCWtleSA9IGNvbnRleHQtPnRocmVhZF9rZXlyaW5nOwogCQlhdG9taWNfaW5jKCZrZXktPnVzYWdlKTsKIAkJYnJlYWs7CiAKIAljYXNlIEtFWV9TUEVDX1BST0NFU1NfS0VZUklORzoKLQkJaWYgKCF0c2stPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nKSB7CisJCWlmICghY29udGV4dC0+c2lnbmFsLT5wcm9jZXNzX2tleXJpbmcpIHsKIAkJCWlmICghY3JlYXRlKQogCQkJCWdvdG8gZXJyb3I7CiAKLQkJCXJldCA9IGluc3RhbGxfcHJvY2Vzc19rZXlyaW5nKHRzayk7CisJCQlyZXQgPSBpbnN0YWxsX3Byb2Nlc3Nfa2V5cmluZyhjb250ZXh0KTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJa2V5ID0gRVJSX1BUUihyZXQpOwogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CiAJCX0KIAotCQlrZXkgPSB0c2stPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nOworCQlrZXkgPSBjb250ZXh0LT5zaWduYWwtPnByb2Nlc3Nfa2V5cmluZzsKIAkJYXRvbWljX2luYygma2V5LT51c2FnZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc6Ci0JCWlmICghdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZykgeworCQlpZiAoIWNvbnRleHQtPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKSB7CiAJCQkvKiBhbHdheXMgaW5zdGFsbCBhIHNlc3Npb24ga2V5cmluZyB1cG9uIGFjY2VzcyBpZiBvbmUKIAkJCSAqIGRvZXNuJ3QgZXhpc3QgeWV0ICovCiAJCQlyZXQgPSBpbnN0YWxsX3Nlc3Npb25fa2V5cmluZygKLQkJCSAgICAgICB0c2ssIHRzay0+dXNlci0+c2Vzc2lvbl9rZXlyaW5nKTsKKwkJCSAgICAgICBjb250ZXh0LCBjb250ZXh0LT51c2VyLT5zZXNzaW9uX2tleXJpbmcpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBlcnJvcjsKIAkJfQogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQkJa2V5ID0gdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZzsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlrZXkgPSByY3VfZGVyZWZlcmVuY2UoY29udGV4dC0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcpOwogCQlhdG9taWNfaW5jKCZrZXktPnVzYWdlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlicmVhazsKIAogCWNhc2UgS0VZX1NQRUNfVVNFUl9LRVlSSU5HOgotCQlrZXkgPSB0c2stPnVzZXItPnVpZF9rZXlyaW5nOworCQlrZXkgPSBjb250ZXh0LT51c2VyLT51aWRfa2V5cmluZzsKIAkJYXRvbWljX2luYygma2V5LT51c2FnZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBLRVlfU1BFQ19VU0VSX1NFU1NJT05fS0VZUklORzoKLQkJa2V5ID0gdHNrLT51c2VyLT5zZXNzaW9uX2tleXJpbmc7CisJCWtleSA9IGNvbnRleHQtPnVzZXItPnNlc3Npb25fa2V5cmluZzsKIAkJYXRvbWljX2luYygma2V5LT51c2FnZSk7CiAJCWJyZWFrOwogCkBAIC01ODAsNyArNjE2LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogY2hlY2sgdGhlIHN0YXR1cyBhbmQgcGVybWlzc2lvbnMgKi8KKwkvKiBjaGVjayB0aGUgc3RhdHVzICovCiAJaWYgKHBlcm0pIHsKIAkJcmV0ID0ga2V5X3ZhbGlkYXRlKGtleSk7CiAJCWlmIChyZXQgPCAwKQpAQCAtNTg4LDExICs2MjQsMTMgQEAKIAl9CiAKIAlyZXQgPSAtRUlPOwotCWlmICghcGFydGlhbCAmJiAhKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19JTlNUQU5USUFURUQpKQorCWlmICghcGFydGlhbCAmJiAhdGVzdF9iaXQoS0VZX0ZMQUdfSU5TVEFOVElBVEVELCAma2V5LT5mbGFncykpCiAJCWdvdG8gaW52YWxpZF9rZXk7CiAKKwkvKiBjaGVjayB0aGUgcGVybWlzc2lvbnMgKi8KIAlyZXQgPSAtRUFDQ0VTOwotCWlmICgha2V5X3Blcm1pc3Npb24oa2V5LCBwZXJtKSkKKworCWlmICgha2V5X3Rhc2tfcGVybWlzc2lvbihrZXksIGNvbnRleHQsIHBlcm0pKQogCQlnb3RvIGludmFsaWRfa2V5OwogCiAgZXJyb3I6CkBAIC02MTUsNyArNjUzLDYgQEAKIGxvbmcgam9pbl9zZXNzaW9uX2tleXJpbmcoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qga2V5ICprZXlyaW5nOwogCWxvbmcgcmV0OwogCkBAIC02MjUsOSArNjYyLDkgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycm9yOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQkJcmV0ID0gdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZy0+c2VyaWFsOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZXQgPSByY3VfZGVyZWZlcmVuY2UodHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZyktPnNlcmlhbDsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCWdvdG8gZXJyb3I7CiAJfQogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKaW5kZXggOTcwNWIxYS4uZGZjZDk4MyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCisrKyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHJlcXVlc3Rfa2V5LmM6IHJlcXVlc3QgYSBrZXkgZnJvbSB1c2Vyc3BhY2UKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0LTUgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXljdGwuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBzdHJ1Y3Qga2V5X2NvbnN0cnVjdGlvbiB7CkBAIC0yNywxOCArMjgsMjYgQEAKIC8qCiAgKiByZXF1ZXN0IHVzZXJzcGFjZSBmaW5pc2ggdGhlIGNvbnN0cnVjdGlvbiBvZiBhIGtleQogICogLSBleGVjdXRlICIvc2Jpbi9yZXF1ZXN0LWtleSA8b3A+IDxrZXk+IDx1aWQ+IDxnaWQ+IDxrZXlyaW5nPiA8a2V5cmluZz4gPGtleXJpbmc+IDxpbmZvPiIKLSAqIC0gaWYgY2FsbG91dF9pbmZvIGlzIGFuIGVtcHR5IHN0cmluZywgaXQnbGwgYmUgcmVuZGVyZWQgYXMgYSAiLSIgaW5zdGVhZAogICovCiBzdGF0aWMgaW50IGNhbGxfcmVxdWVzdF9rZXkoc3RydWN0IGtleSAqa2V5LAogCQkJICAgIGNvbnN0IGNoYXIgKm9wLAogCQkJICAgIGNvbnN0IGNoYXIgKmNhbGxvdXRfaW5mbykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlrZXlfc2VyaWFsX3QgcHJrZXksIHNza2V5OworCXN0cnVjdCBrZXkgKnNlc3Npb25fa2V5cmluZywgKnJrYWtleTsKIAljaGFyICphcmd2WzEwXSwgKmVudnBbM10sIHVpZF9zdHJbMTJdLCBnaWRfc3RyWzEyXTsKIAljaGFyIGtleV9zdHJbMTJdLCBrZXlyaW5nX3N0clszXVsxMl07Ci0JaW50IGk7CisJaW50IHJldCwgaTsKKworCWtlbnRlcigieyVkfSwlcywlcyIsIGtleS0+c2VyaWFsLCBvcCwgY2FsbG91dF9pbmZvKTsKKworCS8qIGdlbmVyYXRlIGEgbmV3IHNlc3Npb24ga2V5cmluZyB3aXRoIGFuIGF1dGgga2V5IGluIGl0ICovCisJc2Vzc2lvbl9rZXlyaW5nID0gcmVxdWVzdF9rZXlfYXV0aF9uZXcoa2V5LCAmcmtha2V5KTsKKwlpZiAoSVNfRVJSKHNlc3Npb25fa2V5cmluZykpIHsKKwkJcmV0ID0gUFRSX0VSUihzZXNzaW9uX2tleXJpbmcpOworCQlnb3RvIGVycm9yOworCX0KIAogCS8qIHJlY29yZCB0aGUgVUlEIGFuZCBHSUQgKi8KIAlzcHJpbnRmKHVpZF9zdHIsICIlZCIsIGN1cnJlbnQtPmZzdWlkKTsKQEAgLTU1LDE3ICs2NCwxNyBAQAogCWlmICh0c2stPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nKQogCQlwcmtleSA9IHRzay0+c2lnbmFsLT5wcm9jZXNzX2tleXJpbmctPnNlcmlhbDsKIAotCXNza2V5ID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7Ci0JaWYgKHRzay0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcpCi0JCXNza2V5ID0gdHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZy0+c2VyaWFsOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCi0KLQlpZiAoIXNza2V5KQotCQlzc2tleSA9IHRzay0+dXNlci0+c2Vzc2lvbl9rZXlyaW5nLT5zZXJpYWw7Ci0KIAlzcHJpbnRmKGtleXJpbmdfc3RyWzFdLCAiJWQiLCBwcmtleSk7CisKKwlpZiAodHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZykgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXNza2V5ID0gcmN1X2RlcmVmZXJlbmNlKHRzay0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcpLT5zZXJpYWw7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0KKwllbHNlIHsKKwkJc3NrZXkgPSB0c2stPnVzZXItPnNlc3Npb25fa2V5cmluZy0+c2VyaWFsOworCX0KKwogCXNwcmludGYoa2V5cmluZ19zdHJbMl0sICIlZCIsIHNza2V5KTsKIAogCS8qIHNldCB1cCBhIG1pbmltYWwgZW52aXJvbm1lbnQgKi8KQEAgLTg0LDExICs5MywyMCBAQAogCWFyZ3ZbaSsrXSA9IGtleXJpbmdfc3RyWzBdOwogCWFyZ3ZbaSsrXSA9IGtleXJpbmdfc3RyWzFdOwogCWFyZ3ZbaSsrXSA9IGtleXJpbmdfc3RyWzJdOwotCWFyZ3ZbaSsrXSA9IGNhbGxvdXRfaW5mb1swXSA/IChjaGFyICopIGNhbGxvdXRfaW5mbyA6ICItIjsKKwlhcmd2W2krK10gPSAoY2hhciAqKSBjYWxsb3V0X2luZm87CiAJYXJndltpXSA9IE5VTEw7CiAKIAkvKiBkbyBpdCAqLwotCXJldHVybiBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3ZbMF0sIGFyZ3YsIGVudnAsIDEpOworCXJldCA9IGNhbGxfdXNlcm1vZGVoZWxwZXJfa2V5cyhhcmd2WzBdLCBhcmd2LCBlbnZwLCBzZXNzaW9uX2tleXJpbmcsIDEpOworCisJLyogZGlzcG9zZSBvZiB0aGUgc3BlY2lhbCBrZXlzICovCisJa2V5X3Jldm9rZShya2FrZXkpOworCWtleV9wdXQocmtha2V5KTsKKwlrZXlfcHV0KHNlc3Npb25fa2V5cmluZyk7CisKKyBlcnJvcjoKKwlrbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OwogCiB9IC8qIGVuZCBjYWxsX3JlcXVlc3Rfa2V5KCkgKi8KIApAQCAtMTA1LDcgKzEyMyw5IEBACiAJc3RydWN0IGtleV9jb25zdHJ1Y3Rpb24gY29uczsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCXN0cnVjdCBrZXkgKmtleTsKLQlpbnQgcmV0LCBuZWdhdGl2ZTsKKwlpbnQgcmV0LCBuZWdhdGVkOworCisJa2VudGVyKCIlcywlcywlcyIsIHR5cGUtPm5hbWUsIGRlc2NyaXB0aW9uLCBjYWxsb3V0X2luZm8pOwogCiAJLyogY3JlYXRlIGEga2V5IGFuZCBhZGQgaXQgdG8gdGhlIHF1ZXVlICovCiAJa2V5ID0ga2V5X2FsbG9jKHR5cGUsIGRlc2NyaXB0aW9uLApAQCAtMTEzLDkgKzEzMyw3IEBACiAJaWYgKElTX0VSUihrZXkpKQogCQlnb3RvIGFsbG9jX2ZhaWxlZDsKIAotCXdyaXRlX2xvY2soJmtleS0+bG9jayk7Ci0Ja2V5LT5mbGFncyB8PSBLRVlfRkxBR19VU0VSX0NPTlNUUlVDVDsKLQl3cml0ZV91bmxvY2soJmtleS0+bG9jayk7CisJc2V0X2JpdChLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCwgJmtleS0+ZmxhZ3MpOwogCiAJY29ucy5rZXkgPSBrZXk7CiAJbGlzdF9hZGRfdGFpbCgmY29ucy5saW5rLCAma2V5LT51c2VyLT5jb25zcSk7CkBAIC0xMzAsNyArMTQ4LDcgQEAKIAogCS8qIGlmIHRoZSBrZXkgd2Fzbid0IGluc3RhbnRpYXRlZCwgdGhlbiB3ZSB3YW50IHRvIGdpdmUgYW4gZXJyb3IgKi8KIAlyZXQgPSAtRU5PS0VZOwotCWlmICghKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19JTlNUQU5USUFURUQpKQorCWlmICghdGVzdF9iaXQoS0VZX0ZMQUdfSU5TVEFOVElBVEVELCAma2V5LT5mbGFncykpCiAJCWdvdG8gcmVxdWVzdF9mYWlsZWQ7CiAKIAlkb3duX3dyaXRlKCZrZXlfY29uc3RydWN0aW9uX3NlbSk7CkBAIC0xMzksMTIgKzE1NywxMyBAQAogCiAJLyogYWxzbyBnaXZlIGFuIGVycm9yIGlmIHRoZSBrZXkgd2FzIG5lZ2F0aXZlbHkgaW5zdGFudGlhdGVkICovCiAgY2hlY2tfbm90X25lZ2F0aXZlOgotCWlmIChrZXktPmZsYWdzICYgS0VZX0ZMQUdfTkVHQVRJVkUpIHsKKwlpZiAodGVzdF9iaXQoS0VZX0ZMQUdfTkVHQVRJVkUsICZrZXktPmZsYWdzKSkgewogCQlrZXlfcHV0KGtleSk7CiAJCWtleSA9IEVSUl9QVFIoLUVOT0tFWSk7CiAJfQogCiAgb3V0OgorCWtsZWF2ZSgiID0gJXAiLCBrZXkpOwogCXJldHVybiBrZXk7CiAKICByZXF1ZXN0X2ZhaWxlZDoKQEAgLTE1MiwyNCArMTcxLDIzIEBACiAJICogLSByZW1vdmUgZnJvbSBjb25zdHJ1Y3Rpb24gcXVldWUKIAkgKiAtIG1hcmsgdGhlIGtleSBhcyBkZWFkCiAJICovCi0JbmVnYXRpdmUgPSAwOworCW5lZ2F0ZWQgPSAwOwogCWRvd25fd3JpdGUoJmtleV9jb25zdHJ1Y3Rpb25fc2VtKTsKIAogCWxpc3RfZGVsKCZjb25zLmxpbmspOwogCi0Jd3JpdGVfbG9jaygma2V5LT5sb2NrKTsKLQlrZXktPmZsYWdzICY9IH5LRVlfRkxBR19VU0VSX0NPTlNUUlVDVDsKLQogCS8qIGNoZWNrIGl0IGRpZG4ndCBnZXQgaW5zdGFudGlhdGVkIGJldHdlZW4gdGhlIGNoZWNrIGFuZCB0aGUgZG93biAqLwotCWlmICghKGtleS0+ZmxhZ3MgJiBLRVlfRkxBR19JTlNUQU5USUFURUQpKSB7Ci0JCWtleS0+ZmxhZ3MgfD0gS0VZX0ZMQUdfSU5TVEFOVElBVEVEIHwgS0VZX0ZMQUdfTkVHQVRJVkU7Ci0JCW5lZ2F0aXZlID0gMTsKKwlpZiAoIXRlc3RfYml0KEtFWV9GTEFHX0lOU1RBTlRJQVRFRCwgJmtleS0+ZmxhZ3MpKSB7CisJCXNldF9iaXQoS0VZX0ZMQUdfTkVHQVRJVkUsICZrZXktPmZsYWdzKTsKKwkJc2V0X2JpdChLRVlfRkxBR19JTlNUQU5USUFURUQsICZrZXktPmZsYWdzKTsKKwkJbmVnYXRlZCA9IDE7CiAJfQogCi0Jd3JpdGVfdW5sb2NrKCZrZXktPmxvY2spOworCWNsZWFyX2JpdChLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCwgJmtleS0+ZmxhZ3MpOworCiAJdXBfd3JpdGUoJmtleV9jb25zdHJ1Y3Rpb25fc2VtKTsKIAotCWlmICghbmVnYXRpdmUpCisJaWYgKCFuZWdhdGVkKQogCQlnb3RvIGNoZWNrX25vdF9uZWdhdGl2ZTsgLyogc3VycHJpc2luZ2x5LCB0aGUga2V5IGdvdAogCQkJCQkgICogaW5zdGFudGlhdGVkICovCiAKQEAgLTE3OCwxMyArMTk2LDEyIEBACiAJa2V5LT5leHBpcnkgPSBub3cudHZfc2VjICsga2V5X25lZ2F0aXZlX3RpbWVvdXQ7CiAKIAlpZiAoY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmcpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJc3RydWN0IGtleSAqa2V5cmluZzsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwotCQlrZXlyaW5nID0gY3VycmVudC0+c2lnbmFsLT5zZXNzaW9uX2tleXJpbmc7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJa2V5cmluZyA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5zaWduYWwtPnNlc3Npb25fa2V5cmluZyk7CiAJCWF0b21pY19pbmMoJmtleXJpbmctPnVzYWdlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQlrZXlfbGluayhrZXlyaW5nLCBrZXkpOwogCQlrZXlfcHV0KGtleXJpbmcpOwpAQCAtMjIwLDYgKzIzNyw5IEBACiAKIAlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOwogCisJa2VudGVyKCIlcywlcyx7JWR9LCVzIiwKKwkgICAgICAgdHlwZS0+bmFtZSwgZGVzY3JpcHRpb24sIHVzZXItPnVpZCwgY2FsbG91dF9pbmZvKTsKKwogCS8qIHNlZSBpZiB0aGVyZSdzIHN1Y2ggYSBrZXkgdW5kZXIgY29uc3RydWN0aW9uIGFscmVhZHkgKi8KIAlkb3duX3dyaXRlKCZrZXlfY29uc3RydWN0aW9uX3NlbSk7CiAKQEAgLTIzNiw2ICsyNTYsNyBAQAogCS8qIHNlZSBhYm91dCBnZXR0aW5nIHVzZXJzcGFjZSB0byBjb25zdHJ1Y3QgdGhlIGtleSAqLwogCWtleSA9IF9fcmVxdWVzdF9rZXlfY29uc3RydWN0aW9uKHR5cGUsIGRlc2NyaXB0aW9uLCBjYWxsb3V0X2luZm8pOwogIGVycm9yOgorCWtsZWF2ZSgiID0gJXAiLCBrZXkpOwogCXJldHVybiBrZXk7CiAKIAkvKiBzb21lb25lIGVsc2UgaGFzIHRoZSBzYW1lIGtleSB1bmRlciBjb25zdHJ1Y3Rpb24KQEAgLTI0OSw4ICsyNzAsMTAgQEAKIAlhZGRfd2FpdF9xdWV1ZSgmcmVxdWVzdF9rZXlfY29uc3dxLCAmbXlzZWxmKTsKIAogCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAoIShja2V5LT5mbGFncyAmIEtFWV9GTEFHX1VTRVJfQ09OU1RSVUNUKSkKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKCF0ZXN0X2JpdChLRVlfRkxBR19VU0VSX0NPTlNUUlVDVCwgJmNrZXktPmZsYWdzKSkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlicmVhazsKIAkJc2NoZWR1bGUoKTsKIAl9CkBAIC0yNzEsMjEgKzI5NCw4MyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgorICogbGluayBhIGZyZXNobHkgbWludGVkIGtleSB0byBhbiBhcHByb3ByaWF0ZSBkZXN0aW5hdGlvbiBrZXlyaW5nCisgKi8KK3N0YXRpYyB2b2lkIHJlcXVlc3Rfa2V5X2xpbmsoc3RydWN0IGtleSAqa2V5LCBzdHJ1Y3Qga2V5ICpkZXN0X2tleXJpbmcpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBrZXkgKmRyb3AgPSBOVUxMOworCisJa2VudGVyKCJ7JWR9LCVwIiwga2V5LT5zZXJpYWwsIGRlc3Rfa2V5cmluZyk7CisKKwkvKiBmaW5kIHRoZSBhcHByb3ByaWF0ZSBrZXlyaW5nICovCisJaWYgKCFkZXN0X2tleXJpbmcpIHsKKwkJc3dpdGNoICh0c2stPmppdF9rZXlyaW5nKSB7CisJCWNhc2UgS0VZX1JFUUtFWV9ERUZMX0RFRkFVTFQ6CisJCWNhc2UgS0VZX1JFUUtFWV9ERUZMX1RIUkVBRF9LRVlSSU5HOgorCQkJZGVzdF9rZXlyaW5nID0gdHNrLT50aHJlYWRfa2V5cmluZzsKKwkJCWlmIChkZXN0X2tleXJpbmcpCisJCQkJYnJlYWs7CisKKwkJY2FzZSBLRVlfUkVRS0VZX0RFRkxfUFJPQ0VTU19LRVlSSU5HOgorCQkJZGVzdF9rZXlyaW5nID0gdHNrLT5zaWduYWwtPnByb2Nlc3Nfa2V5cmluZzsKKwkJCWlmIChkZXN0X2tleXJpbmcpCisJCQkJYnJlYWs7CisKKwkJY2FzZSBLRVlfUkVRS0VZX0RFRkxfU0VTU0lPTl9LRVlSSU5HOgorCQkJcmN1X3JlYWRfbG9jaygpOworCQkJZGVzdF9rZXlyaW5nID0ga2V5X2dldCgKKwkJCQlyY3VfZGVyZWZlcmVuY2UodHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZykpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlkcm9wID0gZGVzdF9rZXlyaW5nOworCisJCQlpZiAoZGVzdF9rZXlyaW5nKQorCQkJCWJyZWFrOworCisJCWNhc2UgS0VZX1JFUUtFWV9ERUZMX1VTRVJfU0VTU0lPTl9LRVlSSU5HOgorCQkJZGVzdF9rZXlyaW5nID0gY3VycmVudC0+dXNlci0+c2Vzc2lvbl9rZXlyaW5nOworCQkJYnJlYWs7CisKKwkJY2FzZSBLRVlfUkVRS0VZX0RFRkxfVVNFUl9LRVlSSU5HOgorCQkJZGVzdF9rZXlyaW5nID0gY3VycmVudC0+dXNlci0+dWlkX2tleXJpbmc7CisJCQlicmVhazsKKworCQljYXNlIEtFWV9SRVFLRVlfREVGTF9HUk9VUF9LRVlSSU5HOgorCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwkvKiBhbmQgYXR0YWNoIHRoZSBrZXkgdG8gaXQgKi8KKwlrZXlfbGluayhkZXN0X2tleXJpbmcsIGtleSk7CisKKwlrZXlfcHV0KGRyb3ApOworCisJa2xlYXZlKCIiKTsKKworfSAvKiBlbmQgcmVxdWVzdF9rZXlfbGluaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCiAgKiByZXF1ZXN0IGEga2V5CiAgKiAtIHNlYXJjaCB0aGUgcHJvY2VzcydzIGtleXJpbmdzCiAgKiAtIGNoZWNrIHRoZSBsaXN0IG9mIGtleXMgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkCi0gKiAtIGNhbGwgb3V0IHRvIHVzZXJzcGFjZSBmb3IgYSBrZXkgaWYgcmVxdWVzdGVkIChzdXBwbGVtZW50YXJ5IGluZm8gY2FuIGJlCi0gKiAgIHBhc3NlZCkKKyAqIC0gY2FsbCBvdXQgdG8gdXNlcnNwYWNlIGZvciBhIGtleSBpZiBzdXBwbGVtZW50YXJ5IGluZm8gd2FzIHByb3ZpZGVkCisgKiAtIGNhY2hlIHRoZSBrZXkgaW4gYW4gYXBwcm9wcmlhdGUga2V5cmluZwogICovCi1zdHJ1Y3Qga2V5ICpyZXF1ZXN0X2tleShzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCi0JCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKLQkJCWNvbnN0IGNoYXIgKmNhbGxvdXRfaW5mbykKK3N0cnVjdCBrZXkgKnJlcXVlc3Rfa2V5X2FuZF9saW5rKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKKwkJCQkgY29uc3QgY2hhciAqZGVzY3JpcHRpb24sCisJCQkJIGNvbnN0IGNoYXIgKmNhbGxvdXRfaW5mbywKKwkJCQkgc3RydWN0IGtleSAqZGVzdF9rZXlyaW5nKQogewogCXN0cnVjdCBrZXlfdXNlciAqdXNlcjsKIAlzdHJ1Y3Qga2V5ICprZXk7CiAKKwlrZW50ZXIoIiVzLCVzLCVzLCVwIiwKKwkgICAgICAgdHlwZS0+bmFtZSwgZGVzY3JpcHRpb24sIGNhbGxvdXRfaW5mbywgZGVzdF9rZXlyaW5nKTsKKwogCS8qIHNlYXJjaCBhbGwgdGhlIHByb2Nlc3Mga2V5cmluZ3MgZm9yIGEga2V5ICovCi0Ja2V5ID0gc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3NfYXV4KHR5cGUsIGRlc2NyaXB0aW9uLCB0eXBlLT5tYXRjaCk7CisJa2V5ID0gc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3ModHlwZSwgZGVzY3JpcHRpb24sIHR5cGUtPm1hdGNoLCBjdXJyZW50KTsKIAogCWlmIChQVFJfRVJSKGtleSkgPT0gLUVBR0FJTikgewogCQkvKiB0aGUgc2VhcmNoIGZhaWxlZCwgYnV0IHRoZSBrZXlyaW5ncyB3ZXJlIHNlYXJjaGFibGUsIHNvIHdlCkBAIC0yOTYsMTIgKzM4MSwxMyBAQAogCiAJCS8qIC0gZ2V0IGhvbGQgb2YgdGhlIHVzZXIncyBjb25zdHJ1Y3Rpb24gcXVldWUgKi8KIAkJdXNlciA9IGtleV91c2VyX2xvb2t1cChjdXJyZW50LT5mc3VpZCk7Ci0JCWlmICghdXNlcikgewotCQkJa2V5ID0gRVJSX1BUUigtRU5PTUVNKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KKwkJaWYgKCF1c2VyKQorCQkJZ290byBub21lbTsKIAotCQlmb3IgKDs7KSB7CisJCWRvIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlnb3RvIGludGVycnVwdGVkOworCiAJCQkvKiBhc2sgdXNlcnNwYWNlIChyZXR1cm5zIE5VTEwgaWYgaXQgd2FpdGVkIG9uIGEga2V5CiAJCQkgKiBiZWluZyBjb25zdHJ1Y3RlZCkgKi8KIAkJCWtleSA9IHJlcXVlc3Rfa2V5X2NvbnN0cnVjdGlvbih0eXBlLCBkZXNjcmlwdGlvbiwKQEAgLTMxMSwxOCArMzk3LDQ2IEBACiAKIAkJCS8qIHNvbWVvbmUgZWxzZSBtYWRlIHRoZSBrZXkgd2Ugd2FudCwgc28gd2UgbmVlZCB0bwogCQkJICogc2VhcmNoIGFnYWluIGFzIGl0IG1pZ2h0IG5vdyBiZSBhdmFpbGFibGUgdG8gdXMgKi8KLQkJCWtleSA9IHNlYXJjaF9wcm9jZXNzX2tleXJpbmdzX2F1eCh0eXBlLCBkZXNjcmlwdGlvbiwKLQkJCQkJCQkgIHR5cGUtPm1hdGNoKTsKLQkJCWlmIChQVFJfRVJSKGtleSkgIT0gLUVBR0FJTikKLQkJCQlicmVhazsKLQkJfQorCQkJa2V5ID0gc2VhcmNoX3Byb2Nlc3Nfa2V5cmluZ3ModHlwZSwgZGVzY3JpcHRpb24sCisJCQkJCQkgICAgICB0eXBlLT5tYXRjaCwgY3VycmVudCk7CisKKwkJfSB3aGlsZSAoUFRSX0VSUihrZXkpID09IC1FQUdBSU4pOwogCiAJCWtleV91c2VyX3B1dCh1c2VyKTsKKworCQkvKiBsaW5rIHRoZSBuZXcga2V5IGludG8gdGhlIGFwcHJvcHJpYXRlIGtleXJpbmcgKi8KKwkJaWYgKCFQVFJfRVJSKGtleSkpCisJCQlyZXF1ZXN0X2tleV9saW5rKGtleSwgZGVzdF9rZXlyaW5nKTsKIAl9CiAKLSBlcnJvcjoKK2Vycm9yOgorCWtsZWF2ZSgiID0gJXAiLCBrZXkpOwogCXJldHVybiBrZXk7CiAKK25vbWVtOgorCWtleSA9IEVSUl9QVFIoLUVOT01FTSk7CisJZ290byBlcnJvcjsKKworaW50ZXJydXB0ZWQ6CisJa2V5X3VzZXJfcHV0KHVzZXIpOworCWtleSA9IEVSUl9QVFIoLUVJTlRSKTsKKwlnb3RvIGVycm9yOworCit9IC8qIGVuZCByZXF1ZXN0X2tleV9hbmRfbGluaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZXF1ZXN0IGEga2V5CisgKiAtIHNlYXJjaCB0aGUgcHJvY2VzcydzIGtleXJpbmdzCisgKiAtIGNoZWNrIHRoZSBsaXN0IG9mIGtleXMgYmVpbmcgY3JlYXRlZCBvciB1cGRhdGVkCisgKiAtIGNhbGwgb3V0IHRvIHVzZXJzcGFjZSBmb3IgYSBrZXkgaWYgc3VwcGxlbWVudGFyeSBpbmZvIHdhcyBwcm92aWRlZAorICovCitzdHJ1Y3Qga2V5ICpyZXF1ZXN0X2tleShzdHJ1Y3Qga2V5X3R5cGUgKnR5cGUsCisJCQljb25zdCBjaGFyICpkZXNjcmlwdGlvbiwKKwkJCWNvbnN0IGNoYXIgKmNhbGxvdXRfaW5mbykKK3sKKwlyZXR1cm4gcmVxdWVzdF9rZXlfYW5kX2xpbmsodHlwZSwgZGVzY3JpcHRpb24sIGNhbGxvdXRfaW5mbywgTlVMTCk7CisKIH0gLyogZW5kIHJlcXVlc3Rfa2V5KCkgKi8KIAogRVhQT1JUX1NZTUJPTChyZXF1ZXN0X2tleSk7CkBAIC0zMzksNyArNDUzLDggQEAKIAlpZiAoa2V5KSB7CiAJCS8qIGNoZWNrIGl0J3Mgc3RpbGwgYWNjZXNzaWJsZSAqLwogCQlyZXQgPSAtRUtFWVJFVk9LRUQ7Ci0JCWlmIChrZXktPmZsYWdzICYgKEtFWV9GTEFHX1JFVk9LRUQgfCBLRVlfRkxBR19ERUFEKSkKKwkJaWYgKHRlc3RfYml0KEtFWV9GTEFHX1JFVk9LRUQsICZrZXktPmZsYWdzKSB8fAorCQkgICAgdGVzdF9iaXQoS0VZX0ZMQUdfREVBRCwgJmtleS0+ZmxhZ3MpKQogCQkJZ290byBlcnJvcjsKIAogCQkvKiBjaGVjayBpdCBoYXNuJ3QgZXhwaXJlZCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIyNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qIHJlcXVlc3Rfa2V5X2F1dGguYzogcmVxdWVzdCBrZXkgYXV0aG9yaXNhdGlvbiBjb250cm9sbGluZyBrZXkgZGVmCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIGludCByZXF1ZXN0X2tleV9hdXRoX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIHZvaWQgcmVxdWVzdF9rZXlfYXV0aF9kZXNjcmliZShjb25zdCBzdHJ1Y3Qga2V5ICosIHN0cnVjdCBzZXFfZmlsZSAqKTsKK3N0YXRpYyB2b2lkIHJlcXVlc3Rfa2V5X2F1dGhfZGVzdHJveShzdHJ1Y3Qga2V5ICopOworCisvKgorICogdGhlIHJlcXVlc3Qta2V5IGF1dGhvcmlzYXRpb24ga2V5IHR5cGUgZGVmaW5pdGlvbgorICovCitzdHJ1Y3Qga2V5X3R5cGUga2V5X3R5cGVfcmVxdWVzdF9rZXlfYXV0aCA9IHsKKwkubmFtZQkJPSAiLnJlcXVlc3Rfa2V5X2F1dGgiLAorCS5kZWZfZGF0YWxlbgk9IHNpemVvZihzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCksCisJLmluc3RhbnRpYXRlCT0gcmVxdWVzdF9rZXlfYXV0aF9pbnN0YW50aWF0ZSwKKwkuZGVzY3JpYmUJPSByZXF1ZXN0X2tleV9hdXRoX2Rlc2NyaWJlLAorCS5kZXN0cm95CT0gcmVxdWVzdF9rZXlfYXV0aF9kZXN0cm95LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGluc3RhbnRpYXRlIGEgcmVxdWVzdC1rZXkgYXV0aG9yaXNhdGlvbiByZWNvcmQKKyAqLworc3RhdGljIGludCByZXF1ZXN0X2tleV9hdXRoX2luc3RhbnRpYXRlKHN0cnVjdCBrZXkgKmtleSwKKwkJCQkJY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkJc2l6ZV90IGRhdGFsZW4pCit7CisJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYSwgKmlya2E7CisJc3RydWN0IGtleSAqaW5zdGtleTsKKwlpbnQgcmV0OworCisJcmV0ID0gLUVOT01FTTsKKwlya2EgPSBrbWFsbG9jKHNpemVvZigqcmthKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJrYSkgeworCQkvKiBzZWUgaWYgdGhlIGNhbGxpbmcgcHJvY2VzcyBpcyBhbHJlYWR5IHNlcnZpY2luZyB0aGUga2V5CisJCSAqIHJlcXVlc3Qgb2YgYW5vdGhlciBwcm9jZXNzICovCisJCWluc3RrZXkgPSBrZXlfZ2V0X2luc3RhbnRpYXRpb25fYXV0aGtleSgwKTsKKwkJaWYgKCFJU19FUlIoaW5zdGtleSkpIHsKKwkJCS8qIGl0IGlzIC0gdXNlIHRoYXQgaW5zdGFudGlhdGlvbiBjb250ZXh0IGhlcmUgdG9vICovCisJCQlpcmthID0gaW5zdGtleS0+cGF5bG9hZC5kYXRhOworCQkJcmthLT5jb250ZXh0ID0gaXJrYS0+Y29udGV4dDsKKwkJCXJrYS0+cGlkID0gaXJrYS0+cGlkOworCQkJa2V5X3B1dChpbnN0a2V5KTsKKwkJfQorCQllbHNlIHsKKwkJCS8qIGl0IGlzbid0IC0gdXNlIHRoaXMgcHJvY2VzcyBhcyB0aGUgY29udGV4dCAqLworCQkJcmthLT5jb250ZXh0ID0gY3VycmVudDsKKwkJCXJrYS0+cGlkID0gY3VycmVudC0+cGlkOworCQl9CisKKwkJcmthLT50YXJnZXRfa2V5ID0ga2V5X2dldCgoc3RydWN0IGtleSAqKSBkYXRhKTsKKwkJa2V5LT5wYXlsb2FkLmRhdGEgPSBya2E7CisJCXJldCA9IDA7CisJfQorCisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgcmVxdWVzdF9rZXlfYXV0aF9pbnN0YW50aWF0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKgorICovCitzdGF0aWMgdm9pZCByZXF1ZXN0X2tleV9hdXRoX2Rlc2NyaWJlKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwKKwkJCQkgICAgICBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYSA9IGtleS0+cGF5bG9hZC5kYXRhOworCisJc2VxX3B1dHMobSwgImtleToiKTsKKwlzZXFfcHV0cyhtLCBrZXktPmRlc2NyaXB0aW9uKTsKKwlzZXFfcHJpbnRmKG0sICIgcGlkOiVkIiwgcmthLT5waWQpOworCit9IC8qIGVuZCByZXF1ZXN0X2tleV9hdXRoX2Rlc2NyaWJlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlc3Ryb3kgYW4gaW5zdGFudGlhdGlvbiBhdXRob3Jpc2F0aW9uIHRva2VuIGtleQorICovCitzdGF0aWMgdm9pZCByZXF1ZXN0X2tleV9hdXRoX2Rlc3Ryb3koc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2EgPSBrZXktPnBheWxvYWQuZGF0YTsKKworCWtlbnRlcigieyVkfSIsIGtleS0+c2VyaWFsKTsKKworCWtleV9wdXQocmthLT50YXJnZXRfa2V5KTsKKworfSAvKiBlbmQgcmVxdWVzdF9rZXlfYXV0aF9kZXN0cm95KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNyZWF0ZSBhIHNlc3Npb24ga2V5cmluZyB0byBiZSBmb3IgdGhlIGludm9rYXRpb24gb2YgL3NiaW4vcmVxdWVzdC1rZXkgYW5kCisgKiBzdGljayBhbiBhdXRob3Jpc2F0aW9uIHRva2VuIGluIGl0CisgKi8KK3N0cnVjdCBrZXkgKnJlcXVlc3Rfa2V5X2F1dGhfbmV3KHN0cnVjdCBrZXkgKnRhcmdldCwgc3RydWN0IGtleSAqKl9ya2FrZXkpCit7CisJc3RydWN0IGtleSAqa2V5cmluZywgKnJrYWtleSA9IE5VTEw7CisJY2hhciBkZXNjWzIwXTsKKwlpbnQgcmV0OworCisJa2VudGVyKCIlZCwiLCB0YXJnZXQtPnNlcmlhbCk7CisKKwkvKiBhbGxvY2F0ZSBhIG5ldyBzZXNzaW9uIGtleXJpbmcgKi8KKwlzcHJpbnRmKGRlc2MsICJfcmVxLiV1IiwgdGFyZ2V0LT5zZXJpYWwpOworCisJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoZGVzYywgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLCAxLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGtleXJpbmcpKSB7CisJCWtsZWF2ZSgiPSAlbGQiLCBQVFJfRVJSKGtleXJpbmcpKTsKKwkJcmV0dXJuIGtleXJpbmc7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIGF1dGgga2V5ICovCisJc3ByaW50ZihkZXNjLCAiJXgiLCB0YXJnZXQtPnNlcmlhbCk7CisKKwlya2FrZXkgPSBrZXlfYWxsb2MoJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgsIGRlc2MsCisJCQkgICBjdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsCisJCQkgICBLRVlfVVNSX1ZJRVcsIDEpOworCWlmIChJU19FUlIocmtha2V5KSkgeworCQlrZXlfcHV0KGtleXJpbmcpOworCQlrbGVhdmUoIj0gJWxkIiwgUFRSX0VSUihya2FrZXkpKTsKKwkJcmV0dXJuIHJrYWtleTsKKwl9CisKKwkvKiBjb25zdHJ1Y3QgYW5kIGF0dGFjaCB0byB0aGUga2V5cmluZyAqLworCXJldCA9IGtleV9pbnN0YW50aWF0ZV9hbmRfbGluayhya2FrZXksIHRhcmdldCwgMCwga2V5cmluZywgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJa2V5X3Jldm9rZShya2FrZXkpOworCQlrZXlfcHV0KHJrYWtleSk7CisJCWtleV9wdXQoa2V5cmluZyk7CisJCWtsZWF2ZSgiPSAlZCIsIHJldCk7CisJCXJldHVybiBFUlJfUFRSKHJldCk7CisJfQorCisJKl9ya2FrZXkgPSBya2FrZXk7CisJa2xlYXZlKCIgPSB7JWR9ICh7JWR9KSIsIGtleXJpbmctPnNlcmlhbCwgcmtha2V5LT5zZXJpYWwpOworCXJldHVybiBrZXlyaW5nOworCit9IC8qIGVuZCByZXF1ZXN0X2tleV9hdXRoX25ldygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBnZXQgdGhlIGF1dGhvcmlzYXRpb24ga2V5IGZvciBpbnN0YW50aWF0aW9uIG9mIGEgc3BlY2lmaWMga2V5IGlmIGF0dGFjaGVkIHRvCisgKiB0aGUgY3VycmVudCBwcm9jZXNzJ3Mga2V5cmluZ3MKKyAqIC0gdGhpcyBrZXkgaXMgaW5zZXJ0ZWQgaW50byBhIGtleXJpbmcgYW5kIHRoYXQgaXMgc2V0IGFzIC9zYmluL3JlcXVlc3Qta2V5J3MKKyAqICAgc2Vzc2lvbiBrZXlyaW5nCisgKiAtIGEgdGFyZ2V0X2lkIG9mIHplcm8gc3BlY2lmaWVzIGFueSB2YWxpZCB0b2tlbgorICovCitzdHJ1Y3Qga2V5ICprZXlfZ2V0X2luc3RhbnRpYXRpb25fYXV0aGtleShrZXlfc2VyaWFsX3QgdGFyZ2V0X2lkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlzdHJ1Y3Qga2V5ICppbnN0a2V5OworCisJLyogd2UgbXVzdCBoYXZlIG91ciBvd24gcGVyc29uYWwgc2Vzc2lvbiBrZXlyaW5nICovCisJaWYgKCF0c2stPnNpZ25hbC0+c2Vzc2lvbl9rZXlyaW5nKQorCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKworCS8qIGFuZCBpdCBtdXN0IGNvbnRhaW4gYSBzdWl0YWJsZSByZXF1ZXN0IGF1dGhvcmlzYXRpb24ga2V5CisJICogLSBsb2NrIFJDVSBhZ2FpbnN0IHNlc3Npb24ga2V5cmluZyBjaGFuZ2luZworCSAqLworCXJjdV9yZWFkX2xvY2soKTsKKworCWluc3RrZXkgPSBrZXlyaW5nX3NlYXJjaF9pbnN0a2V5KAorCQlyY3VfZGVyZWZlcmVuY2UodHNrLT5zaWduYWwtPnNlc3Npb25fa2V5cmluZyksIHRhcmdldF9pZCk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gaW5zdGtleTsKKworfSAvKiBlbmQga2V5X2dldF9pbnN0YW50aWF0aW9uX2F1dGhrZXkoKSAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy91c2VyX2RlZmluZWQuYyBiL3NlY3VyaXR5L2tleXMvdXNlcl9kZWZpbmVkLmMKaW5kZXggOGQ2NWIzYS4uZTQ0NmFjYiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy91c2VyX2RlZmluZWQuYworKysgYi9zZWN1cml0eS9rZXlzL3VzZXJfZGVmaW5lZC5jCkBAIC00MiwxMiArNDIsMjEgQEAKIAkucmVhZAkJPSB1c2VyX3JlYWQsCiB9OwogCitzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCB7CisJc3RydWN0IHJjdV9oZWFkCXJjdTsJCS8qIFJDVSBkZXN0cnVjdG9yICovCisJdW5zaWduZWQgc2hvcnQJZGF0YWxlbjsJLyogbGVuZ3RoIG9mIHRoaXMgZGF0YSAqLworCWNoYXIJCWRhdGFbMF07CS8qIGFjdHVhbCBkYXRhICovCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChrZXlfdHlwZV91c2VyKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIGluc3RhbnRpYXRlIGEgdXNlciBkZWZpbmVkIGtleQogICovCiBzdGF0aWMgaW50IHVzZXJfaW5zdGFudGlhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbikKIHsKKwlzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCAqdXBheWxvYWQ7CiAJaW50IHJldDsKIAogCXJldCA9IC1FSU5WQUw7CkBAIC01OCwxMyArNjcsMTUgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAotCS8qIGF0dGFjaCB0aGUgZGF0YSAqLwogCXJldCA9IC1FTk9NRU07Ci0Ja2V5LT5wYXlsb2FkLmRhdGEgPSBrbWFsbG9jKGRhdGFsZW4sIEdGUF9LRVJORUwpOwotCWlmICgha2V5LT5wYXlsb2FkLmRhdGEpCisJdXBheWxvYWQgPSBrbWFsbG9jKHNpemVvZigqdXBheWxvYWQpICsgZGF0YWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cGF5bG9hZCkKIAkJZ290byBlcnJvcjsKIAotCW1lbWNweShrZXktPnBheWxvYWQuZGF0YSwgZGF0YSwgZGF0YWxlbik7CisJLyogYXR0YWNoIHRoZSBkYXRhICovCisJdXBheWxvYWQtPmRhdGFsZW4gPSBkYXRhbGVuOworCW1lbWNweSh1cGF5bG9hZC0+ZGF0YSwgZGF0YSwgZGF0YWxlbik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCB1cGF5bG9hZCk7CiAJcmV0ID0gMDsKIAogIGVycm9yOgpAQCAtNzUsMTggKzg2LDI1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogZHVwbGljYXRlIGEgdXNlciBkZWZpbmVkIGtleQorICogLSBib3RoIGtleXMnIHNlbWFwaG9yZXMgYXJlIGxvY2tlZCBhZ2FpbnN0IGZ1cnRoZXIgbW9kaWZpY2F0aW9uCisgKiAtIHRoZSBuZXcga2V5IGNhbm5vdCB5ZXQgYmUgYWNjZXNzZWQKICAqLwogc3RhdGljIGludCB1c2VyX2R1cGxpY2F0ZShzdHJ1Y3Qga2V5ICprZXksIGNvbnN0IHN0cnVjdCBrZXkgKnNvdXJjZSkKIHsKKwlzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCAqdXBheWxvYWQsICpzcGF5bG9hZDsKIAlpbnQgcmV0OwogCiAJLyoganVzdCBjb3B5IHRoZSBwYXlsb2FkICovCiAJcmV0ID0gLUVOT01FTTsKLQlrZXktPnBheWxvYWQuZGF0YSA9IGttYWxsb2Moc291cmNlLT5kYXRhbGVuLCBHRlBfS0VSTkVMKTsKKwl1cGF5bG9hZCA9IGttYWxsb2Moc2l6ZW9mKCp1cGF5bG9hZCkgKyBzb3VyY2UtPmRhdGFsZW4sIEdGUF9LRVJORUwpOworCWlmICh1cGF5bG9hZCkgeworCQlzcGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZShzb3VyY2UtPnBheWxvYWQuZGF0YSk7CisJCUJVR19PTihzb3VyY2UtPmRhdGFsZW4gIT0gc3BheWxvYWQtPmRhdGFsZW4pOwogCi0JaWYgKGtleS0+cGF5bG9hZC5kYXRhKSB7Ci0JCWtleS0+ZGF0YWxlbiA9IHNvdXJjZS0+ZGF0YWxlbjsKLQkJbWVtY3B5KGtleS0+cGF5bG9hZC5kYXRhLCBzb3VyY2UtPnBheWxvYWQuZGF0YSwgc291cmNlLT5kYXRhbGVuKTsKKwkJdXBheWxvYWQtPmRhdGFsZW4gPSBrZXktPmRhdGFsZW4gPSBzcGF5bG9hZC0+ZGF0YWxlbjsKKwkJbWVtY3B5KHVwYXlsb2FkLT5kYXRhLCBzcGF5bG9hZC0+ZGF0YSwga2V5LT5kYXRhbGVuKTsKKworCQlrZXktPnBheWxvYWQuZGF0YSA9IHVwYXlsb2FkOwogCQlyZXQgPSAwOwogCX0KIApAQCAtOTYsNDAgKzExNCw1NCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgorICogZGlzcG9zZSBvZiB0aGUgb2xkIGRhdGEgZnJvbSBhbiB1cGRhdGVkIHVzZXIgZGVmaW5lZCBrZXkKKyAqLworc3RhdGljIHZvaWQgdXNlcl91cGRhdGVfcmN1X2Rpc3Bvc2FsKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCB1c2VyX2tleV9wYXlsb2FkICp1cGF5bG9hZDsKKworCXVwYXlsb2FkID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHVzZXJfa2V5X3BheWxvYWQsIHJjdSk7CisKKwlrZnJlZSh1cGF5bG9hZCk7CisKK30gLyogZW5kIHVzZXJfdXBkYXRlX3JjdV9kaXNwb3NhbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCiAgKiB1cGRhdGUgYSB1c2VyIGRlZmluZWQga2V5CisgKiAtIHRoZSBrZXkncyBzZW1hcGhvcmUgaXMgd3JpdGUtbG9ja2VkCiAgKi8KIHN0YXRpYyBpbnQgdXNlcl91cGRhdGUoc3RydWN0IGtleSAqa2V5LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbikKIHsKLQl2b2lkICpuZXcsICp6YXA7CisJc3RydWN0IHVzZXJfa2V5X3BheWxvYWQgKnVwYXlsb2FkLCAqemFwOwogCWludCByZXQ7CiAKIAlyZXQgPSAtRUlOVkFMOwogCWlmIChkYXRhbGVuIDw9IDAgfHwgZGF0YWxlbiA+IDMyNzY3IHx8ICFkYXRhKQogCQlnb3RvIGVycm9yOwogCi0JLyogY29weSB0aGUgZGF0YSAqLworCS8qIGNvbnN0cnVjdCBhIHJlcGxhY2VtZW50IHBheWxvYWQgKi8KIAlyZXQgPSAtRU5PTUVNOwotCW5ldyA9IGttYWxsb2MoZGF0YWxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXcpCisJdXBheWxvYWQgPSBrbWFsbG9jKHNpemVvZigqdXBheWxvYWQpICsgZGF0YWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1cGF5bG9hZCkKIAkJZ290byBlcnJvcjsKIAotCW1lbWNweShuZXcsIGRhdGEsIGRhdGFsZW4pOworCXVwYXlsb2FkLT5kYXRhbGVuID0gZGF0YWxlbjsKKwltZW1jcHkodXBheWxvYWQtPmRhdGEsIGRhdGEsIGRhdGFsZW4pOwogCiAJLyogY2hlY2sgdGhlIHF1b3RhIGFuZCBhdHRhY2ggdGhlIG5ldyBkYXRhICovCi0JemFwID0gbmV3OwotCXdyaXRlX2xvY2soJmtleS0+bG9jayk7CisJemFwID0gdXBheWxvYWQ7CiAKIAlyZXQgPSBrZXlfcGF5bG9hZF9yZXNlcnZlKGtleSwgZGF0YWxlbik7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJLyogYXR0YWNoIHRoZSBuZXcgZGF0YSwgZGlzcGxhY2luZyB0aGUgb2xkICovCiAJCXphcCA9IGtleS0+cGF5bG9hZC5kYXRhOwotCQlrZXktPnBheWxvYWQuZGF0YSA9IG5ldzsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGtleS0+cGF5bG9hZC5kYXRhLCB1cGF5bG9hZCk7CiAJCWtleS0+ZXhwaXJ5ID0gMDsKIAl9CiAKLQl3cml0ZV91bmxvY2soJmtleS0+bG9jayk7Ci0Ja2ZyZWUoemFwKTsKKwljYWxsX3JjdSgmemFwLT5yY3UsIHVzZXJfdXBkYXRlX3JjdV9kaXNwb3NhbCk7CiAKICBlcnJvcjoKIAlyZXR1cm4gcmV0OwpAQCAtMTUyLDEzICsxODQsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgdXNlcl9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSkKIHsKLQlrZnJlZShrZXktPnBheWxvYWQuZGF0YSk7CisJc3RydWN0IHVzZXJfa2V5X3BheWxvYWQgKnVwYXlsb2FkID0ga2V5LT5wYXlsb2FkLmRhdGE7CisKKwlrZnJlZSh1cGF5bG9hZCk7CiAKIH0gLyogZW5kIHVzZXJfZGVzdHJveSgpICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKiBkZXNjcmliZSB0aGUgdXNlcgorICogZGVzY3JpYmUgdGhlIHVzZXIga2V5CiAgKi8KIHN0YXRpYyB2b2lkIHVzZXJfZGVzY3JpYmUoY29uc3Qgc3RydWN0IGtleSAqa2V5LCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CkBAIC0xNzEsMTggKzIwNSwyMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIHJlYWQgdGhlIGtleSBkYXRhCisgKiAtIHRoZSBrZXkncyBzZW1hcGhvcmUgaXMgcmVhZC1sb2NrZWQKICAqLwogc3RhdGljIGxvbmcgdXNlcl9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwKIAkJICAgICAgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKIHsKLQlsb25nIHJldCA9IGtleS0+ZGF0YWxlbjsKKwlzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCAqdXBheWxvYWQ7CisJbG9uZyByZXQ7CisKKwl1cGF5bG9hZCA9IHJjdV9kZXJlZmVyZW5jZShrZXktPnBheWxvYWQuZGF0YSk7CisJcmV0ID0gdXBheWxvYWQtPmRhdGFsZW47CiAKIAkvKiB3ZSBjYW4gcmV0dXJuIHRoZSBkYXRhIGFzIGlzICovCiAJaWYgKGJ1ZmZlciAmJiBidWZsZW4gPiAwKSB7Ci0JCWlmIChidWZsZW4gPiBrZXktPmRhdGFsZW4pCi0JCQlidWZsZW4gPSBrZXktPmRhdGFsZW47CisJCWlmIChidWZsZW4gPiB1cGF5bG9hZC0+ZGF0YWxlbikKKwkJCWJ1ZmxlbiA9IHVwYXlsb2FkLT5kYXRhbGVuOwogCi0JCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBrZXktPnBheWxvYWQuZGF0YSwgYnVmbGVuKSAhPSAwKQorCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgdXBheWxvYWQtPmRhdGEsIGJ1ZmxlbikgIT0gMCkKIAkJCXJldCA9IC1FRkFVTFQ7CiAJfQogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggODczMDJhNC4uNmJlMjczOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgImF2Yy5oIgogI2luY2x1ZGUgIm9ianNlYy5oIgpAQCAtMTY1OCw5ICsxNjU5LDggQEAKIAogc3RhdGljIHZvaWQgc2VsaW51eF9icHJtX2ZyZWVfc2VjdXJpdHkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQlzdHJ1Y3QgYnBybV9zZWN1cml0eV9zdHJ1Y3QgKmJzZWMgPSBicHJtLT5zZWN1cml0eTsKKwlrZnJlZShicHJtLT5zZWN1cml0eSk7CiAJYnBybS0+c2VjdXJpdHkgPSBOVUxMOwotCWtmcmVlKGJzZWMpOwogfQogCiBleHRlcm4gc3RydWN0IHZmc21vdW50ICpzZWxpbnV4ZnNfbW91bnQ7CkBAIC0xOTQ0LDcgKzE5NDQsNyBAQAogCQl9CiAJfSB3aGlsZSAoKmluX2VuZCsrKTsKIAotCWNvcHlfcGFnZShpbl9zYXZlLCBub3NlY19zYXZlKTsKKwlzdHJjcHkoaW5fc2F2ZSwgbm9zZWNfc2F2ZSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKW5vc2VjX3NhdmUpOwogb3V0OgogCXJldHVybiByYzsKQEAgLTI0NzcsNiArMjQ3NywxNyBAQAogCQlwcm90ID0gcmVxcHJvdDsKIAogI2lmbmRlZiBDT05GSUdfUFBDMzIKKwlpZiAoKHByb3QgJiBQUk9UX0VYRUMpICYmICEodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpICYmCisJICAgKHZtYS0+dm1fc3RhcnQgPj0gdm1hLT52bV9tbS0+c3RhcnRfYnJrICYmCisJICAgIHZtYS0+dm1fZW5kIDw9IHZtYS0+dm1fbW0tPmJyaykpIHsKKwkgICAgCS8qCisJCSAqIFdlIGFyZSBtYWtpbmcgYW4gZXhlY3V0YWJsZSBtYXBwaW5nIGluIHRoZSBicmsgcmVnaW9uLgorCQkgKiBUaGlzIGhhcyBhbiBhZGRpdGlvbmFsIGV4ZWNoZWFwIGNoZWNrLgorCQkgKi8KKwkJcmMgPSB0YXNrX2hhc19wZXJtKGN1cnJlbnQsIGN1cnJlbnQsIFBST0NFU1NfX0VYRUNIRUFQKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KIAlpZiAodm1hLT52bV9maWxlICE9IE5VTEwgJiYgdm1hLT5hbm9uX3ZtYSAhPSBOVUxMICYmIChwcm90ICYgUFJPVF9FWEVDKSkgewogCQkvKgogCQkgKiBXZSBhcmUgbWFraW5nIGV4ZWN1dGFibGUgYSBmaWxlIG1hcHBpbmcgdGhhdCBoYXMKQEAgLTI0ODgsNiArMjQ5OSwxNiBAQAogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJfQorCWlmICghdm1hLT52bV9maWxlICYmIChwcm90ICYgUFJPVF9FWEVDKSAmJgorCQl2bWEtPnZtX3N0YXJ0IDw9IHZtYS0+dm1fbW0tPnN0YXJ0X3N0YWNrICYmCisJCXZtYS0+dm1fZW5kID49IHZtYS0+dm1fbW0tPnN0YXJ0X3N0YWNrKSB7CisJCS8qIEF0dGVtcHQgdG8gbWFrZSB0aGUgcHJvY2VzcyBzdGFjayBleGVjdXRhYmxlLgorCQkgKiBUaGlzIGhhcyBhbiBhZGRpdGlvbmFsIGV4ZWNzdGFjayBjaGVjay4KKwkJICovCisJCXJjID0gdGFza19oYXNfcGVybShjdXJyZW50LCBjdXJyZW50LCBQUk9DRVNTX19FWEVDU1RBQ0spOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQogI2VuZGlmCiAKIAlyZXR1cm4gZmlsZV9tYXBfcHJvdF9jaGVjayh2bWEtPnZtX2ZpbGUsIHByb3QsIHZtYS0+dm1fZmxhZ3MmVk1fU0hBUkVEKTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmgKaW5kZXggODkyOGJiNGQuLjFkZWI1OWUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtX3RvX3N0cmluZy5oCkBAIC03MCw2ICs3MCw4IEBACiAgICBTXyhTRUNDTEFTU19QUk9DRVNTLCBQUk9DRVNTX19EWU5UUkFOU0lUSU9OLCAiZHludHJhbnNpdGlvbiIpCiAgICBTXyhTRUNDTEFTU19QUk9DRVNTLCBQUk9DRVNTX19TRVRDVVJSRU5ULCAic2V0Y3VycmVudCIpCiAgICBTXyhTRUNDTEFTU19QUk9DRVNTLCBQUk9DRVNTX19FWEVDTUVNLCAiZXhlY21lbSIpCisgICBTXyhTRUNDTEFTU19QUk9DRVNTLCBQUk9DRVNTX19FWEVDU1RBQ0ssICJleGVjc3RhY2siKQorICAgU18oU0VDQ0xBU1NfUFJPQ0VTUywgUFJPQ0VTU19fRVhFQ0hFQVAsICJleGVjaGVhcCIpCiAgICBTXyhTRUNDTEFTU19NU0dRLCBNU0dRX19FTlFVRVVFLCAiZW5xdWV1ZSIpCiAgICBTXyhTRUNDTEFTU19NU0csIE1TR19fU0VORCwgInNlbmQiKQogICAgU18oU0VDQ0xBU1NfTVNHLCBNU0dfX1JFQ0VJVkUsICJyZWNlaXZlIikKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9hdl9wZXJtaXNzaW9ucy5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmgKaW5kZXggYmRmY2U0Yy4uYTc4YjVkNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmgKQEAgLTQ2NSw2ICs0NjUsOCBAQAogI2RlZmluZSBQUk9DRVNTX19EWU5UUkFOU0lUSU9OICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwVUwKICNkZWZpbmUgUFJPQ0VTU19fU0VUQ1VSUkVOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMFVMCiAjZGVmaW5lIFBST0NFU1NfX0VYRUNNRU0gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBVTAorI2RlZmluZSBQUk9DRVNTX19FWEVDU1RBQ0sgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwVUwKKyNkZWZpbmUgUFJPQ0VTU19fRVhFQ0hFQVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMFVMCiAKICNkZWZpbmUgSVBDX19DUkVBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMVVMCiAjZGVmaW5lIElQQ19fREVTVFJPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJVTApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggMDcyMjE1Ni4uOGViMTQwZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC05NTEsOCArOTUxLDcgQEAKIAl1MzIgc2lkOwogCiAJLyogcmVtb3ZlIGFueSBleGlzdGluZyBmaWxlcyAqLwotCWlmIChib29sX3BlbmRpbmdfdmFsdWVzKQotCQlrZnJlZShib29sX3BlbmRpbmdfdmFsdWVzKTsKKwlrZnJlZShib29sX3BlbmRpbmdfdmFsdWVzKTsKIAogCXNlbF9yZW1vdmVfYm9vbHMoZGlyKTsKIApAQCAtOTk3LDEwICs5OTYsOCBAQAogb3V0OgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKIAlpZiAobmFtZXMpIHsKLQkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQlpZiAobmFtZXNbaV0pCi0JCQkJa2ZyZWUobmFtZXNbaV0pOwotCQl9CisJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCWtmcmVlKG5hbWVzW2ldKTsKIAkJa2ZyZWUobmFtZXMpOwogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCmluZGV4IGI1MzQ0MTEuLmUyMDU3ZjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKQEAgLTE2NiwxNiArMTY2LDE0IEBACiAKIHZvaWQgY29uZF9wb2xpY3lkYl9kZXN0cm95KHN0cnVjdCBwb2xpY3lkYiAqcCkKIHsKLQlpZiAocC0+Ym9vbF92YWxfdG9fc3RydWN0ICE9IE5VTEwpCi0JCWtmcmVlKHAtPmJvb2xfdmFsX3RvX3N0cnVjdCk7CisJa2ZyZWUocC0+Ym9vbF92YWxfdG9fc3RydWN0KTsKIAlhdnRhYl9kZXN0cm95KCZwLT50ZV9jb25kX2F2dGFiKTsKIAljb25kX2xpc3RfZGVzdHJveShwLT5jb25kX2xpc3QpOwogfQogCiBpbnQgY29uZF9pbml0X2Jvb2xfaW5kZXhlcyhzdHJ1Y3QgcG9saWN5ZGIgKnApCiB7Ci0JaWYgKHAtPmJvb2xfdmFsX3RvX3N0cnVjdCkKLQkJa2ZyZWUocC0+Ym9vbF92YWxfdG9fc3RydWN0KTsKKwlrZnJlZShwLT5ib29sX3ZhbF90b19zdHJ1Y3QpOwogCXAtPmJvb2xfdmFsX3RvX3N0cnVjdCA9IChzdHJ1Y3QgY29uZF9ib29sX2RhdHVtKiopCiAJCWttYWxsb2MocC0+cF9ib29scy5ucHJpbSAqIHNpemVvZihzdHJ1Y3QgY29uZF9ib29sX2RhdHVtKiksIEdGUF9LRVJORUwpOwogCWlmICghcC0+Ym9vbF92YWxfdG9fc3RydWN0KQpAQCAtMTg1LDggKzE4Myw3IEBACiAKIGludCBjb25kX2Rlc3Ryb3lfYm9vbCh2b2lkICprZXksIHZvaWQgKmRhdHVtLCB2b2lkICpwKQogewotCWlmIChrZXkpCi0JCWtmcmVlKGtleSk7CisJa2ZyZWUoa2V5KTsKIAlrZnJlZShkYXR1bSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKaW5kZXggMTQxOTBlZi4uNzg1YzMzYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYwpAQCAtNTkwLDE3ICs1OTAsMTIgQEAKIAkJaGFzaHRhYl9kZXN0cm95KHAtPnN5bXRhYltpXS50YWJsZSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFNZTV9OVU07IGkrKykgewotCQlpZiAocC0+c3ltX3ZhbF90b19uYW1lW2ldKQotCQkJa2ZyZWUocC0+c3ltX3ZhbF90b19uYW1lW2ldKTsKLQl9CisJZm9yIChpID0gMDsgaSA8IFNZTV9OVU07IGkrKykKKwkJa2ZyZWUocC0+c3ltX3ZhbF90b19uYW1lW2ldKTsKIAotCWlmIChwLT5jbGFzc192YWxfdG9fc3RydWN0KQotCQlrZnJlZShwLT5jbGFzc192YWxfdG9fc3RydWN0KTsKLQlpZiAocC0+cm9sZV92YWxfdG9fc3RydWN0KQotCQlrZnJlZShwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpOwotCWlmIChwLT51c2VyX3ZhbF90b19zdHJ1Y3QpCi0JCWtmcmVlKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCk7CisJa2ZyZWUocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCk7CisJa2ZyZWUocC0+cm9sZV92YWxfdG9fc3RydWN0KTsKKwlrZnJlZShwLT51c2VyX3ZhbF90b19zdHJ1Y3QpOwogCiAJYXZ0YWJfZGVzdHJveSgmcC0+dGVfYXZ0YWIpOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggYjYxNDkxNC4uOTIyYmI0NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtMTcwNSwxMSArMTcwNSw5IEBACiBlcnI6CiAJaWYgKCpuYW1lcykgewogCQlmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSsrKQotCQkJaWYgKCgqbmFtZXMpW2ldKQotCQkJCWtmcmVlKCgqbmFtZXMpW2ldKTsKKwkJCWtmcmVlKCgqbmFtZXMpW2ldKTsKIAl9Ci0JaWYgKCp2YWx1ZXMpCi0JCWtmcmVlKCp2YWx1ZXMpOworCWtmcmVlKCp2YWx1ZXMpOwogCWdvdG8gb3V0OwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvS2NvbmZpZyBiL3NvdW5kL29zcy9LY29uZmlnCmluZGV4IGU1MzdiZDYuLjdiZDk1Y2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9LY29uZmlnCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC02LDcgKzYsNyBAQAogIyBQcm9tcHQgdXNlciBmb3IgcHJpbWFyeSBkcml2ZXJzLgogY29uZmlnIFNPVU5EX0JUODc4CiAJdHJpc3RhdGUgIkJUODc4IGF1ZGlvIGRtYSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5ECisJZGVwZW5kcyBvbiBTT1VORF9QUklNRQogCS0tLWhlbHAtLS0KIAkgIEF1ZGlvIERNQSBzdXBwb3J0IGZvciBidDg3OCBiYXNlZCBncmFiYmVyIGJvYXJkcy4gIEFzIHlvdSBtaWdodCBoYXZlCiAJICBhbHJlYWR5IG5vdGljZWQsIGJ0ODc4IGlzIGxpc3RlZCB3aXRoIHR3byBmdW5jdGlvbnMgaW4gL3Byb2MvcGNpLgpAQCAtMjIsNyArMjIsNyBAQAogCiBjb25maWcgU09VTkRfQ01QQ0kKIAl0cmlzdGF0ZSAiQy1NZWRpYSBQQ0kgKENNSTgzMzgvODczOCkiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBQQ0kKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSQogCWhlbHAKIAkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1c2luZyB0aGUgQ01JODMzOAogCSAgb3IgdGhlIENNSTg3MzggY2hpcHNldC4gIERhdGEgb24gdGhlc2UgY2hpcHMgYXJlIGF2YWlsYWJsZSBhdApAQCAtNTIsNyArNTIsNyBAQAogCiBjb25maWcgU09VTkRfQ01QQ0lfSk9ZU1RJQ0sKIAlib29sICJFbmFibGUgam95c3RpY2siCi0JZGVwZW5kcyBvbiBTT1VORF9DTVBDSSAmJiBYODYKKwlkZXBlbmRzIG9uIFNPVU5EX0NNUENJICYmIFg4NiAmJiAoR0FNRVBPUlQ9eSB8fCBTT1VORF9DTVBDST1HQU1FUE9SVCkKIAloZWxwCiAJICBTYXkgWSBoZXJlIGluIG9yZGVyIHRvIGVuYWJsZSB0aGUgam95c3RpY2sgcG9ydCBvbiBhIHNvdW5kIGNhcmQgdXNpbmcKIAkgIHRoZSBDTUk4MzM4IG9yIHRoZSBDTUk4NzM4IGNoaXBzZXQuICBZb3UgbmVlZCB0byBjb25maWcgdGhlCkBAIC02MSw3ICs2MSw3IEBACiAKIGNvbmZpZyBTT1VORF9FTVUxMEsxCiAJdHJpc3RhdGUgIkNyZWF0aXZlIFNCTGl2ZSEgKEVNVTEwSzEpIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgUENJCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXNpbmcgdGhlIEVNVTEwSzEgY2hpcHNldCwKIAkgIHN1Y2ggYXMgdGhlIENyZWF0aXZlIFNCTGl2ZSEsIFNCIFBDSTUxMiBvciBFbXUtQVBTLgpAQCAtODcsNyArODcsNyBAQAogCiBjb25maWcgU09VTkRfRlVTSU9OCiAJdHJpc3RhdGUgIkNyeXN0YWwgU291bmRGdXNpb24gKENTNDI4MC80NjF4KSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5ECisJZGVwZW5kcyBvbiBTT1VORF9QUklNRQogCWhlbHAKIAkgIFRoaXMgbW9kdWxlIGRyaXZlcyB0aGUgQ3J5c3RhbCBTb3VuZEZ1c2lvbiBkZXZpY2VzIChDUzQyODAvNDZ4eAogCSAgc2VyaWVzKSB3aGVuIHdpcmVkIGFzIG5hdGl2ZSBzb3VuZCBkcml2ZXJzIHdpdGggQUM5NyBjb2RlY3MuICBJZgpAQCAtOTUsMTQgKzk1LDE0IEBACiAKIGNvbmZpZyBTT1VORF9DUzQyODEKIAl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyODEiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUKIAloZWxwCiAJICBQaWN0dXJlIGFuZCBmZWF0dXJlIGxpc3QgYXQKIAkgIDxodHRwOi8vd3d3LnBjYnJva2VyLmNvbS9jcnlzdGFsNDI4MS5odG1sPi4KIAogY29uZmlnIFNPVU5EX0JDTV9DUzQyOTdBCiAJdHJpc3RhdGUgIkNyeXN0YWwgU291bmQgQ1M0Mjk3YSAoZm9yIFN3YXJtKSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNJQllURV9TV0FSTSAmJiBTT1VORAorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgU0lCWVRFX1NXQVJNCiAJaGVscAogCSAgVGhlIEJDTTkxMjUwQSBoYXMgYSBDcnlzdGFsIENTNDI5N2Egb24gc3luY2hyb25vdXMgc2VyaWFsCiAJICBwb3J0IEIgKGluIGFkZGl0aW9uIHRvIHRoZSBEQi05IHNlcmlhbCBwb3J0KS4gIFNheSBZIG9yIE0KQEAgLTExMiw3ICsxMTIsNyBAQAogCiBjb25maWcgU09VTkRfRVMxMzcwCiAJdHJpc3RhdGUgIkVuc29uaXEgQXVkaW9QQ0kgKEVTMTM3MCkiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBQQ0kKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSQogCWhlbHAKIAkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1dGlsaXppbmcgdGhlIEVuc29uaXEKIAkgIEVTMTM3MCBjaGlwc2V0LCBzdWNoIGFzIEVuc29uaXEncyBBdWRpb1BDSSAobm9uLTk3KS4gVG8gZmluZApAQCAtMTI1LDcgKzEyNSw3IEBACiAKIGNvbmZpZyBTT1VORF9FUzEzNzEKIAl0cmlzdGF0ZSAiQ3JlYXRpdmUgRW5zb25pcSBBdWRpb1BDSSA5NyAoRVMxMzcxKSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSQorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJCiAJaGVscAogCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgRW5zb25pcQogCSAgRVMxMzcxIGNoaXBzZXQsIHN1Y2ggYXMgRW5zb25pcSdzIEF1ZGlvUENJOTcuIFRvIGZpbmQgb3V0IGlmCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogY29uZmlnIFNPVU5EX0VTU1NPTE8xCiAJdHJpc3RhdGUgIkVTUyBUZWNobm9sb2d5IFNvbG8xIiAKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSQorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJCiAJaGVscAogCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgRVNTIFRlY2hub2xvZ3kKIAkgIFNvbG8xIGNoaXAuIFRvIGZpbmQgb3V0IGlmIHlvdXIgc291bmQgY2FyZCB1c2VzIGEKQEAgLTE0OSw3ICsxNDksNyBAQAogCiBjb25maWcgU09VTkRfTUFFU1RSTwogCXRyaXN0YXRlICJFU1MgTWFlc3RybywgTWFlc3RybzIsIE1hZXN0cm8yRSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBQQ0kKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSQogCWhlbHAKIAkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBzb3VuZCBzeXN0ZW0gZHJpdmVuIGJ5IEVTUydzIE1hZXN0cm8gbGluZQogCSAgb2YgUENJIHNvdW5kIGNoaXBzLiAgVGhlc2UgaW5jbHVkZSB0aGUgTWFlc3RybyAxLCBNYWVzdHJvIDIsIGFuZApAQCAtMTU4LDI4ICsxNTgsMjggQEAKIAogY29uZmlnIFNPVU5EX01BRVNUUk8zCiAJdHJpc3RhdGUgIkVTUyBNYWVzdHJvMy9BbGxlZ3JvIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgc291bmQgc3lzdGVtIGRyaXZlbiBieSBFU1MncyBNYWVzdHJvIDMKIAkgIFBDSSBzb3VuZCBjaGlwLgogCiBjb25maWcgU09VTkRfSUNICiAJdHJpc3RhdGUgIkludGVsIElDSCAoaTh4eCkgYXVkaW8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgaW50ZWdyYWwgYXVkaW8gaW4gSW50ZWwncyBJL08gQ29udHJvbGxlciBIdWIgKElDSCkKIAkgIGNoaXBzZXQsIGFzIHVzZWQgb24gdGhlIDgxMC84MjAvODQwIG1vdGhlcmJvYXJkcy4KIAogY29uZmlnIFNPVU5EX0hBUk1PTlkKIAl0cmlzdGF0ZSAiUEEgSGFybW9ueSBhdWRpbyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBHU0NfTEFTSSAmJiBTT1VORF9QUklNRSE9bgorCWRlcGVuZHMgb24gR1NDX0xBU0kgJiYgU09VTkRfUFJJTUUKIAloZWxwCiAJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEhhcm1vbnkgc291bmRjaGlwCiAJICBvbiBIUCA3MTIsIDcxNS9uZXcgYW5kIG1hbnkgb3RoZXIgR1NDIGJhc2VkIG1hY2hpbmVzLgogCiBjb25maWcgU09VTkRfU09OSUNWSUJFUwogCXRyaXN0YXRlICJTMyBTb25pY1ZpYmVzIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FCiAJaGVscAogCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgUzMKIAkgIFNvbmljVmliZXMgY2hpcHNldC4gVG8gZmluZCBvdXQgaWYgeW91ciBzb3VuZCBjYXJkIHVzZXMgYQpAQCAtMTkwLDcgKzE5MCw3IEBACiAKIGNvbmZpZyBTT1VORF9WV1NORAogCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgWDg2X1ZJU1dTICYmIFNPVU5ECisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBYODZfVklTV1MKIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGFuIFNHSSBWaXN1YWwgV29ya3N0YXRpb24gYW5kIHlvdSB3YW50IHRvIGJlCiAJICBhYmxlIHRvIHVzZSBpdHMgb24tYm9hcmQgYXVkaW8uICBSZWFkCkBAIC0xOTksMTggKzE5OSwxOCBAQAogCiBjb25maWcgU09VTkRfSEFMMgogCXRyaXN0YXRlICJTR0kgSEFMMiBzb3VuZCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFNHSV9JUDIyICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgU0dJX0lQMjIgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhbiBTR0kgSW5keSBzeXN0ZW0gYW5kIHdhbnQgdG8gYmUgYWJsZSB0bwogCSAgdXNlIGl0J3Mgb24tYm9hcmQgQTIgYXVkaW8gc3lzdGVtLgogCiBjb25maWcgU09VTkRfSVQ4MTcyCiAJdHJpc3RhdGUgIklUODE3MkcgU291bmQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiAoTUlQU19JVEU4MTcyIHx8IE1JUFNfSVZSKSAmJiBTT1VORAorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgKE1JUFNfSVRFODE3MiB8fCBNSVBTX0lWUikKIAogY29uZmlnIFNPVU5EX1ZSQzU0NzcKIAl0cmlzdGF0ZSAiTkVDIFZyYzU0NzcgQUM5NyBzb3VuZCIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIEREQjU0NzcgJiYgU09VTkQKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIEREQjU0NzcKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzb3VuZCBzdXBwb3J0IGZvciB0aGUgTkVDIFZyYzU0NzcgY2hpcCwgYW4KIAkgIGludGVncmF0ZWQsIG11bHRpLWZ1bmN0aW9uIGNvbnRyb2xsZXIgY2hpcCBmb3IgTUlQUyBDUFVzLiAgV29ya3MKQEAgLTIxOCwxNSArMjE4LDE1IEBACiAKIGNvbmZpZyBTT1VORF9BVTEwMDAKIAl0cmlzdGF0ZSAiQXUxMDAwIFNvdW5kIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgKFNPQ19BVTEwMDAgfHwgU09DX0FVMTEwMCB8fCBTT0NfQVUxNTAwKSAmJiBTT1VORAorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgKFNPQ19BVTEwMDAgfHwgU09DX0FVMTEwMCB8fCBTT0NfQVUxNTAwKQogCiBjb25maWcgU09VTkRfQVUxNTUwX0FDOTcKIAl0cmlzdGF0ZSAiQXUxNTUwIEFDOTcgU291bmQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT0NfQVUxNTUwICYmIFNPVU5ECisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT0NfQVUxNTUwCiAKIGNvbmZpZyBTT1VORF9UUklERU5UCiAJdHJpc3RhdGUgIlRyaWRlbnQgNERXYXZlIERYL05YLCBTaVMgNzAxOCBvciBBTGkgNTQ1MSBQQ0kgQXVkaW8gQ29yZSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5ECisJZGVwZW5kcyBvbiBTT1VORF9QUklNRQogCS0tLWhlbHAtLS0KIAkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1dGlsaXppbmcgdGhlIFRyaWRlbnQKIAkgIDREV2F2ZS1EWC9OWCBjaGlwc2V0IG9yIHlvdXIgbW90aGVyIGJvYXJkIGNoaXBzZXQgaGFzIFNpUyA3MDE4CkBAIC0yNjcsNyArMjY3LDcgQEAKIAogY29uZmlnIFNPVU5EX01TTkRDTEFTCiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIENsYXNzaWMsIFRhaGl0aSwgTW9udGVyZXkiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiAobSB8fCAhU1RBTkRBTE9ORSkKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIChtIHx8ICFTVEFOREFMT05FKQogCWhlbHAKIAkgIFNheSBNIGhlcmUgaWYgeW91IGhhdmUgYSBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBDbGFzc2ljLCBUYWhpdGkgb3IKIAkgIE1vbnRlcmV5IChub3QgZm9yIHRoZSBQaW5uYWNsZSBvciBGaWppKS4KQEAgLTMzMSw3ICszMzEsNyBAQAogCiBjb25maWcgU09VTkRfTVNORFBJTgogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBQaW5uYWNsZSwgRmlqaSIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIChtIHx8ICFTVEFOREFMT05FKQorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgKG0gfHwgIVNUQU5EQUxPTkUpCiAJaGVscAogCSAgU2F5IE0gaGVyZSBpZiB5b3UgaGF2ZSBhIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIFBpbm5hY2xlIG9yIEZpamkuCiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvbgpAQCAtNDkyLDcgKzQ5Miw3IEBACiAKIGNvbmZpZyBTT1VORF9WSUE4MkNYWFgKIAl0cmlzdGF0ZSAiVklBIDgyQzY4NiBBdWRpbyBDb2RlYyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgUENJCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBhdWRpbyBjb2RlYyBmb3VuZCBvbiBWSUEKIAkgIDgyQ3h4eC1iYXNlZCBjaGlwcy4gVHlwaWNhbGx5IHRoZXNlIGFyZSBidWlsdCBpbnRvIGEgbW90aGVyYm9hcmQuCkBAIC01MTIsNyArNTEyLDcgQEAKIAogY29uZmlnIFNPVU5EX09TUwogCXRyaXN0YXRlICJPU1Mgc291bmQgbW9kdWxlcyIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5ECisJZGVwZW5kcyBvbiBTT1VORF9QUklNRQogCWhlbHAKIAkgIE9TUyBpcyB0aGUgT3BlbiBTb3VuZCBTeXN0ZW0gc3VpdGUgb2Ygc291bmQgY2FyZCBkcml2ZXJzLiAgVGhleSBtYWtlCiAJICBzb3VuZCBwcm9ncmFtbWluZyBlYXNpZXIgc2luY2UgdGhleSBwcm92aWRlIGEgY29tbW9uIEFQSS4gIFNheSBZIG9yCkBAIC0xMDc3LDcgKzEwNzcsNyBAQAogCiBjb25maWcgU09VTkRfVFZNSVhFUgogCXRyaXN0YXRlICJUViBjYXJkIChidDg0OCkgbWl4ZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIEkyQworCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgSTJDCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgYXVkaW8gbWl4ZXIgZmFjaWxpdGllcyBvbiB0aGUgQlQ4NDggVFYgZnJhbWUtZ3JhYmJlcgogCSAgY2FyZC4KQEAgLTEwODgsMTEgKzEwODgsMTEgQEAKIAogY29uZmlnIFNPVU5EX0FMSTU0NTUKIAl0cmlzdGF0ZSAiQUxpNTQ1NSBhdWRpbyBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgUENJCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kKIAogY29uZmlnIFNPVU5EX0ZPUlRFCiAJdHJpc3RhdGUgIkZvcnRlTWVkaWEgRk04MDEgZHJpdmVyIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgUENJCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBQQ0kKIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IGRyaXZlciBzdXBwb3J0IGZvciB0aGUgRm9ydGVNZWRpYSBGTTgwMSBQQ0kKIAkgIGF1ZGlvIGNvbnRyb2xsZXIgKEFiaXQgQVUxMCwgR2VuaXVzIFNvdW5kIE1ha2VyLCBIUCBXb3Jrc3RhdGlvbgpAQCAtMTEwMCw3ICsxMTAwLDcgQEAKIAogY29uZmlnIFNPVU5EX1JNRTk2WFgKIAl0cmlzdGF0ZSAiUk1FIEhhbW1lcmZhbGwgKFJNRTk2WFgpIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBQQ0kKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFBDSQogCWhlbHAKIAkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBIYW1tZXJmYWxsIG9yIEhhbW1lcmZhbGwgbGlnaHQKIAkgIG11bHRpY2hhbm5lbCBjYXJkIGZyb20gUk1FLiBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgYWR2YW5jZWQKQEAgLTExMDgsMTEgKzExMDgsMTEgQEAKIAogY29uZmlnIFNPVU5EX0FEMTk4MAogCXRyaXN0YXRlICJBRDE5ODAgZnJvbnQvYmFjayBzd2l0Y2ggcGx1Z2luIgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4KKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FCiAKIGNvbmZpZyBTT1VORF9TSF9EQUNfQVVESU8KIAl0cmlzdGF0ZSAiU3VwZXJIIERBQyBhdWRpbyBzdXBwb3J0IgotCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgQ1BVX1NIMworCWRlcGVuZHMgb24gU09VTkRfUFJJTUUgJiYgQ1BVX1NIMwogCiBjb25maWcgU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwKIAlpbnQgIiAgICBEQUMgY2hhbm5lbCIKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZDE4MTYuYyBiL3NvdW5kL29zcy9hZDE4MTYuYwppbmRleCAyMmRhZTVkLi45NTU4NmRlIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvYWQxODE2LmMKKysrIGIvc291bmQvb3NzL2FkMTgxNi5jCkBAIC01OTIsNyArNTkyLDcgQEAKICAge3tyZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2x9LCB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yfX0KIAogCi1taXhlcl9lbnQgbWl4X2RldmljZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXSA9IHsKK3N0YXRpYyBtaXhlcl9lbnQgbWl4X2RldmljZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXSA9IHsKIE1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkxNCwgMSwgOCwgNSwJMTQsIDEsIDAsIDUpLAogTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAogTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4LmMgYi9zb3VuZC9vc3MvYWQxODQ4LmMKaW5kZXggNDM4NGRhYy4uN2M4MzVhYiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2FkMTg0OC5jCisrKyBiL3NvdW5kL29zcy9hZDE4NDguYwpAQCAtMjE3OCw4ICsyMTc4LDcgQEAKIAkJCiAJaWYgKGRldmMgIT0gTlVMTCkKIAl7Ci0JCWlmKGF1ZGlvX2RldnNbZGV2XS0+cG9ydGMhPU5VTEwpCi0JCQlrZnJlZShhdWRpb19kZXZzW2Rldl0tPnBvcnRjKTsKKwkJa2ZyZWUoYXVkaW9fZGV2c1tkZXZdLT5wb3J0Yyk7CiAJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDQpOwogCiAJCWlmICghc2hhcmVfZG1hKQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5jIGIvc291bmQvb3NzL2FkMTg4OS5jCmluZGV4IGI3NjdjNjIuLjJjZmQyMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9hZDE4ODkuYworKysgYi9zb3VuZC9vc3MvYWQxODg5LmMKQEAgLTI3Nyw4ICsyNzcsNyBAQAogCiAJZm9yIChqID0gMDsgaiA8IEFEX01BWF9TVEFURVM7IGorKykgewogCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtqXS5kbWFidWY7Ci0JCWlmIChkbWFidWYtPnJhd2J1ZiAhPSBOVUxMKSAKLQkJCWtmcmVlKGRtYWJ1Zi0+cmF3YnVmKTsKKwkJa2ZyZWUoZG1hYnVmLT5yYXdidWYpOwogCX0KIAogCWtmcmVlKGRldik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY21wY2kuYyBiL3NvdW5kL29zcy9jbXBjaS5jCmluZGV4IDM0NzIwZTYuLjc0ZGNjYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9jbXBjaS5jCisrKyBiL3NvdW5kL29zcy9jbXBjaS5jCkBAIC0xMjMsNiArMTIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTMwNTgsNyArMzA1OSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmIChwY2lkZXYtPmlycSA9PSAwKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4ZmZmZmZmZmYpOworCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BXzMyQklUX01BU0spOwogCWlmIChpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNtcGNpOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXJldHVybiBpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eC5jIGIvc291bmQvb3NzL2NzNDZ4eC5jCmluZGV4IDllNDJhMWEuLmNiOTk4ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9jczQ2eHguYworKysgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKQEAgLTQxNzQsNyArNDE3NCw3IEBACiAJCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQogCQkJCXsKIAkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKLQkJCQkJY3M0Nnh4X3N1c3BlbmQoY2FyZCwgMCk7CisJCQkJCWNzNDZ4eF9zdXNwZW5kKGNhcmQsIFBNU0dfT04pOwogCQkJCX0KIAogCQkJfQpAQCAtNTc0OSw3ICs1NzQ5LDcgQEAKIAkJCWNhc2UgUE1fU1VTUEVORDoKIAkJCQlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8KIAkJCQkJImNzNDZ4eDogUE0gc3VzcGVuZCByZXF1ZXN0XG4iKSk7Ci0JCQkJaWYoY3M0Nnh4X3N1c3BlbmQoY2FyZCwgMCkpCisJCQkJaWYoY3M0Nnh4X3N1c3BlbmQoY2FyZCwgUE1TR19TVVNQRU5EKSkKIAkJCQl7CiAJCQkJICAgIENTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTwogCQkJCQkiY3M0Nnh4OiBQTSBzdXNwZW5kIHJlcXVlc3QgcmVmdXNlZFxuIikpOwpAQCAtNTc3OSw3ICs1Nzc5LDcgQEAKIAlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKIAlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCiAJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmRfdGJsIHJlcXVlc3RcbiIpKTsKLQljczQ2eHhfc3VzcGVuZChzLCAwKTsKKwljczQ2eHhfc3VzcGVuZChzLCBzdGF0ZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKaW5kZXggNTI4MWI4OC4uMjcwNGUxNSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKQEAgLTI1NSw3ICsyNTUsNyBAQAogCiBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqZW1lcmdlbmN5X2RiZG1hX2NtZDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAvKgogICogU3R1ZmYgZm9yIHJlc3RvcmluZyBhZnRlciBhIHNsZWVwLgogICovCkBAIC0yNjMsNyArMjYzLDcgQEAKIHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgYXdhY3Nfc2xlZXBfbm90aWZpZXIgPSB7CiAJYXdhY3Nfc2xlZXBfbm90aWZ5LCBTTEVFUF9MRVZFTF9TT1VORCwKIH07Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogLyogZm9yIChzb2Z0KSBzYW1wbGUgcmF0ZSB0cmFuc2xhdGlvbnMgKi8KIGludCBleHBhbmRfYmFsOwkJLyogQmFsYW5jZSBmYWN0b3IgZm9yIGV4cGFuZGluZyAobm90IHZvbHVtZSEpICovCkBAIC02NzEsMTUgKzY3MSwxMSBAQAogCXJlbGVhc2VfT0ZfcmVzb3VyY2UoYXdhY3Nfbm9kZSwgMSk7CiAJcmVsZWFzZV9PRl9yZXNvdXJjZShhd2Fjc19ub2RlLCAyKTsKIAotCWlmIChhd2Fjc190eF9jbWRfc3BhY2UpCi0JCWtmcmVlKGF3YWNzX3R4X2NtZF9zcGFjZSk7Ci0JaWYgKGF3YWNzX3J4X2NtZF9zcGFjZSkKLQkJa2ZyZWUoYXdhY3NfcnhfY21kX3NwYWNlKTsKLQlpZiAoYmVlcF9kYmRtYV9jbWRfc3BhY2UpCi0JCWtmcmVlKGJlZXBfZGJkbWFfY21kX3NwYWNlKTsKLQlpZiAoYmVlcF9idWYpCi0JCWtmcmVlKGJlZXBfYnVmKTsKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworCWtmcmVlKGF3YWNzX3R4X2NtZF9zcGFjZSk7CisJa2ZyZWUoYXdhY3NfcnhfY21kX3NwYWNlKTsKKwlrZnJlZShiZWVwX2RiZG1hX2NtZF9zcGFjZSk7CisJa2ZyZWUoYmVlcF9idWYpOworI2lmZGVmIENPTkZJR19QTQogCXBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZhd2Fjc19zbGVlcF9ub3RpZmllcik7CiAjZW5kaWYKIH0KQEAgLTE0MTksNyArMTQxNSw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIC8qCiAgKiBTYXZlIHN0YXRlIHdoZW4gZ29pbmcgdG8gc2xlZXAsIHJlc3RvcmUgaXQgYWZ0ZXJ3YXJkcy4KICAqLwpAQCAtMTU1NSw3ICsxNTUxLDcgQEAKIAl9CiAJcmV0dXJuIFBCT09LX1NMRUVQX09LOwogfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIAogLyogQWxsIHRoZSBidXJndW5keSBmdW5jdGlvbnM6ICovCkBAIC0yMzAxLDggKzIyOTcsNyBAQAogI2VuZGlmCiAKIAlpZiAoKHdyaXRlX3NxLm1heF9jb3VudCArIDEpID4gbnVtYmVyX29mX3R4X2NtZF9idWZmZXJzKSB7Ci0JCWlmIChhd2Fjc190eF9jbWRfc3BhY2UpCi0JCQlrZnJlZShhd2Fjc190eF9jbWRfc3BhY2UpOworCQlrZnJlZShhd2Fjc190eF9jbWRfc3BhY2UpOwogCQludW1iZXJfb2ZfdHhfY21kX2J1ZmZlcnMgPSAwOwogCiAJCS8qIHdlIG5lZWQgbmJ1ZnMgKyAxIChmb3IgdGhlIGxvb3ApIGFuZCB3ZSBzaG91bGQgcmVxdWVzdCArIDEKQEAgLTIzNjAsOCArMjM1NSw3IEBACiAjZW5kaWYKIAogCWlmICgocmVhZF9zcS5tYXhfY291bnQrMSkgPiBudW1iZXJfb2ZfcnhfY21kX2J1ZmZlcnMgKSB7Ci0JCWlmIChhd2Fjc19yeF9jbWRfc3BhY2UpCi0JCQlrZnJlZShhd2Fjc19yeF9jbWRfc3BhY2UpOworCQlrZnJlZShhd2Fjc19yeF9jbWRfc3BhY2UpOwogCQludW1iZXJfb2ZfcnhfY21kX2J1ZmZlcnMgPSAwOwogCiAJCS8qIHdlIG5lZWQgbmJ1ZnMgKyAxIChmb3IgdGhlIGxvb3ApIGFuZCB3ZSBzaG91bGQgcmVxdWVzdCArIDEgYWdhaW4KQEAgLTI4MDUsNyArMjc5OSw3IEBACiAJYmVlcF9idWYgPSAoc2hvcnQgKikga21hbGxvYyhCRUVQX0JVRkxFTiAqIDQsIEdGUF9LRVJORUwpOwogCWlmIChiZWVwX2J1ZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmRfcG1hYzogbm8gbWVtb3J5IGZvciBiZWVwIGJ1ZmZlclxuIik7Ci0JCWlmKCBiZWVwX2RiZG1hX2NtZF9zcGFjZSApIGtmcmVlKGJlZXBfZGJkbWFfY21kX3NwYWNlKSA7CisJCWtmcmVlKGJlZXBfZGJkbWFfY21kX3NwYWNlKSA7CiAJCXJldHVybiAtRU5PTUVNIDsKIAl9CiAJcmV0dXJuIDAgOwpAQCAtMzA1OSw5ICszMDUzLDkgQEAKIAlpZiAoKHJlcz1zZXR1cF9iZWVwKCkpKQogCQlyZXR1cm4gcmVzIDsKIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJcG11X3JlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZhd2Fjc19zbGVlcF9ub3RpZmllcik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogCS8qIFBvd2VyYm9va3MgaGF2ZSBvZGQgd2F5cyBvZiBlbmFibGluZyBpbnB1dHMgc3VjaCBhcwogCSAgIGFuIGV4cGFuc2lvbi1iYXkgQ0Qgb3Igc291bmQgZnJvbSBhbiBpbnRlcm5hbCBtb2RlbQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jIGIvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCmluZGV4IDMzZGVhM2QuLmI0MGI1ZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYworKysgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKQEAgLTUyMywxMCArNTIzLDggQEAKIAljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7CiAJZW11MTBrMV9tcHVvdXRfY2xvc2UoY2FyZCk7CiAKLQlpZiAoY2FyZC0+c2VxX21pZGlkZXYpIHsKLQkJa2ZyZWUoY2FyZC0+c2VxX21pZGlkZXYpOwotCQljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7Ci0JfQorCWtmcmVlKGNhcmQtPnNlcV9taWRpZGV2KTsKKwljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7CiB9CiAKIGludCBlbXUxMGsxX3NlcV9taWRpX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCmluZGV4IDQwOTRiZTUuLjRlM2JhY2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMKKysrIGIvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guYwpAQCAtMjEzLDggKzIxMyw3IEBACiAJCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFNQQ1MwICsgaSwgMCwgcHQtPm9sZF9zcGNzW2ldKTsKIAkJfQogCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9JTkFDVElWRTsKLQkJaWYocHQtPmJ1ZikKLQkJCWtmcmVlKHB0LT5idWYpOworCQlrZnJlZShwdC0+YnVmKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzAuYyBiL3NvdW5kL29zcy9lczEzNzAuYwppbmRleCAwNTYwOTFjLi44NTM4MDg1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXMxMzcwLmMKKysrIGIvc291bmQvb3NzL2VzMTM3MC5jCkBAIC0xNTYsMTEgKzE1NiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sKKyNlbmRpZgorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUwpAQCAtMzg0LDcgKzM4OSwxMCBAQAogCQl1bnNpZ25lZCBjaGFyIG9idWZbTUlESU9VVEJVRl07CiAJfSBtaWRpOwogCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSwogCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisjZW5kaWYKKwogCXN0cnVjdCBzZW1hcGhvcmUgc2VtOwogfTsKIApAQCAtMjU1MywxMCArMjU2MSw1NSBAQAogCXsgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4sIDB4NDA0MCB9CiB9OwogCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlczEzNzBfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbigweDIwMCwgSk9ZX0VYVEVOVCwgImVzMTM3MCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiBqb3lzdGljayBpbyBwb3J0IDB4MjAwIGluIHVzZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXMxMzcwOiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbigweDIwMCwgSk9ZX0VYVEVOVCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiRVNTMTM3MCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAicGNpJXMvZ2FtZXBvcnQwIiwgcGNpX25hbWUocy0+ZGV2KSk7CisJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CisJZ3AtPmlvID0gMHgyMDA7CisKKwlzLT5jdHJsIHw9IENUUkxfSllTVEtfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbyArIEVTMTM3MF9SRUdfQ09OVFJPTCk7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXMxMzcwX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87CisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCisJfQorfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZXMxMzcwX3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBlczEzNzBfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGVzMTM3MF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCiB7CiAJc3RydWN0IGVzMTM3MF9zdGF0ZSAqczsKLQlzdHJ1Y3QgZ2FtZXBvcnQgKmdwID0gTlVMTDsKIAltbV9zZWdtZW50X3QgZnM7CiAJaW50IGksIHZhbCwgcmV0OwogCkBAIC0yNTY5LDcgKzI2MjIsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAocGNpZGV2LT5pcnEgPT0gMCkgCiAJCXJldHVybiAtRU5PREVWOwotCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgMHhmZmZmZmZmZik7CisJaSA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCBETUFfMzJCSVRfTUFTSyk7CiAJaWYgKGkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXMxMzcwOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXJldHVybiBpOwpAQCAtMjYwNSwyOCArMjY1OCwxNCBAQAogCS8qIG5vdGU6IHNldHRpbmcgQ1RSTF9TRVJSX0RJUyBpcyByZXBvcnRlZCB0byBicmVhawogCSAqIG1pYyBiaWFzIHNldHRpbmcgKGJ5IEtpbS5CZXJ0c0BmaXN1Yi5tYWlsLmFiYi5jb20pICovCiAJcy0+Y3RybCA9IENUUkxfQ0RDX0VOIHwgKERBQzJfU1JUT0RJVig4MDAwKSA8PCBDVFJMX1NIX1BDTEtESVYpIHwgKDEgPDwgQ1RSTF9TSF9XVFNSU0VMKTsKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4MjAwLCBKT1lfRVhURU5ULCAiZXMxMzcwIikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGpveXN0aWNrIGlvIHBvcnQgMHgyMDAgaW4gdXNlXG4iKTsKLQl9IGVsc2UgaWYgKCEocy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7Ci0JCXJlbGVhc2VfcmVnaW9uKDB4MjAwLCBKT1lfRVhURU5UKTsKLQl9IGVsc2UgewotCQlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzAiKTsKLQkJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShzLT5kZXYpKTsKLQkJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7Ci0JCWdwLT5pbyA9IDB4MjAwOwotCQlzLT5jdHJsIHw9IENUUkxfSllTVEtfRU47Ci0JfQogCWlmIChsaW5lb3V0W2RldmluZGV4XSkKIAkJcy0+Y3RybCB8PSBDVFJMX1hDVEwwOwogCWlmIChtaWNiaWFzW2RldmluZGV4XSkKIAkJcy0+Y3RybCB8PSBDVFJMX1hDVEwxOwogCXMtPnNjdHJsID0gMDsKLQlwcmludGsoS0VSTl9JTkZPICJlczEzNzA6IGZvdW5kIGFkYXB0ZXIgYXQgaW8gJSNseCBpcnEgJXVcbiIKLQkgICAgICAgS0VSTl9JTkZPICJlczEzNzA6IGZlYXR1cmVzOiBqb3lzdGljayAlcywgbGluZSAlcywgbWljIGltcGVkYW5jZSAlc1xuIiwKLQkgICAgICAgcy0+aW8sIHMtPmlycSwgKHMtPmN0cmwgJiBDVFJMX0pZU1RLX0VOKSA/ICJvbiIgOiAib2ZmIiwKLQkgICAgICAgKHMtPmN0cmwgJiBDVFJMX1hDVEwwKSA/ICJvdXQiIDogImluIiwKLQkJICAgICAgIChzLT5jdHJsICYgQ1RSTF9YQ1RMMSkgPyAiMSIgOiAiMCIpOworCXByaW50ayhLRVJOX0lORk8gImVzMTM3MDogYWRhcHRlciBhdCBpbyAlI2x4IGlycSAldSwgbGluZSAlcywgbWljIGltcGVkYW5jZSAlc1xuIiwKKwkgICAgICAgcy0+aW8sIHMtPmlycSwgKHMtPmN0cmwgJiBDVFJMX1hDVEwwKSA/ICJvdXQiIDogImluIiwKKwkgICAgICAgKHMtPmN0cmwgJiBDVFJMX1hDVEwxKSA/ICIxIiA6ICIwIik7CiAJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLwogCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlczEzNzBfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKIAkJcmV0ID0gcy0+ZGV2X2F1ZGlvOwpAQCAtMjY3Miw5ICsyNzExLDcgQEAKIAl9CiAJc2V0X2ZzKGZzKTsKIAotCS8qIHJlZ2lzdGVyIGdhbWVwb3J0ICovCi0JaWYgKGdwKQotCQlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKwllczEzNzBfcmVnaXN0ZXJfZ2FtZXBvcnQocyk7CiAKIAkvKiBzdG9yZSBpdCBpbiB0aGUgZHJpdmVyIGZpZWxkICovCiAJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgcyk7CkBAIC0yNjk2LDEwICsyNzMzLDYgQEAKICBlcnJfZGV2MToKIAlwcmludGsoS0VSTl9FUlIgImVzMTM3MDogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKIAlmcmVlX2lycShzLT5pcnEsIHMpOwotCWlmIChzLT5nYW1lcG9ydCkgewotCQlyZWxlYXNlX3JlZ2lvbihzLT5nYW1lcG9ydC0+aW8sIEpPWV9FWFRFTlQpOwotCQlnYW1lcG9ydF9mcmVlX3BvcnQocy0+Z2FtZXBvcnQpOwotCX0KICBlcnJfaXJxOgogCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzBfRVhURU5UKTsKICBlcnJfcmVnaW9uOgpAQCAtMjcxOCwxMSArMjc1MSw3IEBACiAJb3V0bCgwLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsgLyogY2xlYXIgc2VyaWFsIGludGVycnVwdHMgKi8KIAlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKIAlmcmVlX2lycShzLT5pcnEsIHMpOwotCWlmIChzLT5nYW1lcG9ydCkgewotCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKLQkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKLQkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7Ci0JfQorCWVzMTM3MF91bnJlZ2lzdGVyX2dhbWVwb3J0KHMpOwogCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBFUzEzNzBfRVhURU5UKTsKIAl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOwogCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+ZGV2X21peGVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzEuYyBiL3NvdW5kL29zcy9lczEzNzEuYwppbmRleCBhNTBmZGRhLi4xMmE1NmQ1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvZXMxMzcxLmMKKysrIGIvc291bmQvb3NzL2VzMTM3MS5jCkBAIC0xMjgsMTEgKzEyOCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KICNpbmNsdWRlIDxsaW51eC9nYW1lcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSworI2VuZGlmCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCkBAIC00NTMsNyArNDU4LDEwIEBACiAJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKIAl9IG1pZGk7CiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCiAJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKyNlbmRpZgorCiAJc3RydWN0IHNlbWFwaG9yZSBzZW07CiB9OwogCkBAIC0yNzg2LDEyICsyNzk0LDYzIEBACiAJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lEIH0KIH07CiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVzMTM3MV9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisJaW50IGdwaW87CisKKwlmb3IgKGdwaW8gPSAweDIxODsgZ3BpbyA+PSAweDIwMDsgZ3BpbyAtPSAweDA4KQorCQlpZiAocmVxdWVzdF9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCwgImVzMTM3MSIpKQorCQkJYnJlYWs7CisKKwlpZiAoZ3BpbyA8IDB4MjAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIGZyZWUgam95c3RpY2sgYWRkcmVzcyBmb3VuZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKTsKKwlpZiAoIWdwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzEgR2FtZXBvcnQiKTsKKwlnYW1lcG9ydF9zZXRfcGh5cyhncCwgImlzYSUwNHgvZ2FtZXBvcnQwIiwgZ3Bpbyk7CisJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CisJZ3AtPmlvID0gZ3BpbzsKKworCXMtPmN0cmwgfD0gQ1RSTF9KWVNUS19FTiB8ICgoKGdwaW8gPj4gMykgJiBDVFJMX0pPWV9NQVNLKSA8PCBDVFJMX0pPWV9TSElGVCk7CisJb3V0bChzLT5jdHJsLCBzLT5pbyArIEVTMTM3MV9SRUdfQ09OVFJPTCk7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXMxMzcxX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87CisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCisJfQorfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZXMxMzcxX3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBlczEzNzFfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKKwogc3RhdGljIGludCBfX2RldmluaXQgZXMxMzcxX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKIHsKIAlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOwotCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CiAJbW1fc2VnbWVudF90IGZzOwotCWludCBpLCBncGlvLCB2YWwsIHJlcyA9IC0xOworCWludCBpLCB2YWwsIHJlcyA9IC0xOwogCWludCBpZHg7CiAJdW5zaWduZWQgbG9uZyB0bW87CiAJc2lnbmVkIGxvbmcgdG1vMjsKQEAgLTI4MDQsNyArMjg2Myw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCWlmIChwY2lkZXYtPmlycSA9PSAwKSAKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaSA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweGZmZmZmZmZmKTsKKwlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZiAoaSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJlczEzNzE6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcmV0dXJuIGk7CkBAIC0yODgyLDIzICsyOTQxLDYgQEAKIAkJfQogCX0KIAotCWZvciAoZ3BpbyA9IDB4MjE4OyBncGlvID49IDB4MjAwOyBncGlvIC09IDB4MDgpCi0JCWlmIChyZXF1ZXN0X3JlZ2lvbihncGlvLCBKT1lfRVhURU5ULCAiZXMxMzcxIikpCi0JCQlicmVhazsKLQotCWlmIChncGlvIDwgMHgyMDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gZnJlZSBqb3lzdGljayBhZGRyZXNzIGZvdW5kXG4iKTsKLQl9IGVsc2UgaWYgKCEocy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKLQkJcmVsZWFzZV9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCk7Ci0JfSBlbHNlIHsKLQkJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJFU1MxMzcxIEdhbWVwb3J0Iik7Ci0JCWdhbWVwb3J0X3NldF9waHlzKGdwLCAiaXNhJTA0eC9nYW1lcG9ydDAiLCBncGlvKTsKLQkJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7Ci0JCWdwLT5pbyA9IGdwaW87Ci0JCXMtPmN0cmwgfD0gQ1RSTF9KWVNUS19FTiB8ICgoKGdwaW8gPj4gMykgJiBDVFJMX0pPWV9NQVNLKSA8PCBDVFJMX0pPWV9TSElGVCk7Ci0JfQotCiAJcy0+c2N0cmwgPSAwOwogCWNzc3IgPSAwOwogCXMtPnNwZGlmX3ZvbHVtZSA9IC0xOwpAQCAtMjk2OCw5ICszMDEwLDcgQEAKIAkvKiB0dXJuIG9uIFMvUERJRiBvdXRwdXQgZHJpdmVyIGlmIHJlcXVlc3RlZCAqLwogCW91dGwoY3Nzciwgcy0+aW8rRVMxMzcxX1JFR19TVEFUVVMpOwogCi0JLyogcmVnaXN0ZXIgZ2FtZXBvcnQgKi8KLQlpZiAocy0+Z2FtZXBvcnQpCi0JCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCWVzMTM3MV9yZWdpc3Rlcl9nYW1lcG9ydChzKTsKIAogCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KIAlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKQEAgLTI5NzksMTMgKzMwMTksOSBAQAogCS8qIGluY3JlbWVudCBkZXZpbmRleCAqLwogCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQogCQlkZXZpbmRleCsrOwotICAgICAgIAlyZXR1cm4gMDsKKwlyZXR1cm4gMDsKIAogIGVycl9ncDoKLQlpZiAocy0+Z2FtZXBvcnQpIHsKLQkJcmVsZWFzZV9yZWdpb24ocy0+Z2FtZXBvcnQtPmlvLCBKT1lfRVhURU5UKTsKLQkJZ2FtZXBvcnRfZnJlZV9wb3J0KHMtPmdhbWVwb3J0KTsKLQl9CiAjaWZkZWYgRVMxMzcxX0RFQlVHCiAJaWYgKHMtPnBzKQogCQlyZW1vdmVfcHJvY19lbnRyeSgiZXMxMzcxIiwgTlVMTCk7CkBAIC0zMDI0LDExICszMDYwLDcgQEAKIAlvdXRsKDAsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOyAvKiBjbGVhciBzZXJpYWwgaW50ZXJydXB0cyAqLwogCXN5bmNocm9uaXplX2lycShzLT5pcnEpOwogCWZyZWVfaXJxKHMtPmlycSwgcyk7Ci0JaWYgKHMtPmdhbWVwb3J0KSB7Ci0JCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOwotCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOwotCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBKT1lfRVhURU5UKTsKLQl9CisJZXMxMzcxX3VucmVnaXN0ZXJfZ2FtZXBvcnQocyk7CiAJcmVsZWFzZV9yZWdpb24ocy0+aW8sIEVTMTM3MV9FWFRFTlQpOwogCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CiAJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy0+ZGV2X21peGVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lc3Nzb2xvMS5jIGIvc291bmQvb3NzL2Vzc3NvbG8xLmMKaW5kZXggNmIzYjlhOS4uYTRlY2FiMmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9lc3Nzb2xvMS5jCisrKyBiL3NvdW5kL29zcy9lc3Nzb2xvMS5jCkBAIC0xMDQsNiArMTA0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMTQ5LDYgKzE1MCwxMCBAQAogCiAjZGVmaW5lIEZNT0RFX0RNRk0gMHgxMAogCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNvbG8xX2RyaXZlcjsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjYsNyArMjMxLDkgQEAKIAkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOwogCX0gbWlkaTsKIAorI2lmIFNVUFBPUlRfSk9ZU1RJQ0sKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIyODAsNiArMjI4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzb2xvMV9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIGludCBpb19wb3J0KQogewogCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CkBAIC0yMzA2LDYgKzIzMTQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHNvbG8xX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgR0FNRVBPUlRfRVhURU5UKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc29sbzFfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzLCBpbnQgaW9fcG9ydCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHNvbG8xX3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHNvbG8xX3N0YXRlICpzKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNvbG8xX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKIHsKIAlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnM7CkBAIC0yMzI2LDcgKzIzNDcsNyBAQAogCSAqIHRvIDI0IGJpdHMgZmlyc3QsIHRoZW4gMzIgYml0cyAocGxheWJhY2sgb25seSkgaWYgdGhhdCBmYWlscy4KIAkgKi8KIAlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4MDBmZmZmZmYpICYmCi0JICAgIHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweGZmZmZmZmZmKSkgeworCSAgICBwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgRE1BXzMyQklUX01BU0spKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbG8xOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBvciAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTI0MzcsMTEgKzI0NTgsNyBAQAogCXN5bmNocm9uaXplX2lycShzLT5pcnEpOwogCXBjaV93cml0ZV9jb25maWdfd29yZChzLT5kZXYsIDB4NjAsIDApOyAvKiB0dXJuIG9mZiBERE1BIGNvbnRyb2xsZXIgYWRkcmVzcyBzcGFjZSAqLwogCWZyZWVfaXJxKHMtPmlycSwgcyk7Ci0JaWYgKHMtPmdhbWVwb3J0KSB7Ci0JCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOwotCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOwotCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBHQU1FUE9SVF9FWFRFTlQpOwotCX0KKwlzb2xvMV91bnJlZ2lzdGVyX2dhbWVwb3J0KHMpOwogCXJlbGVhc2VfcmVnaW9uKHMtPmlvYmFzZSwgSU9CQVNFX0VYVEVOVCk7CiAJcmVsZWFzZV9yZWdpb24ocy0+c2JiYXNlK0ZNU1lOVEhfRVhURU5ULCBTQkJBU0VfRVhURU5ULUZNU1lOVEhfRVhURU5UKTsKIAlyZWxlYXNlX3JlZ2lvbihzLT5kZG1hYmFzZSwgRERNQUJBU0VfRVhURU5UKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWQxNi5jIGIvc291bmQvb3NzL21hZDE2LmMKaW5kZXggYTcwNjdmMS4uYWEzYzUwZCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21hZDE2LmMKKysrIGIvc291bmQvb3NzL21hZDE2LmMKQEAgLTUwLDkgKzUwLDEyIEBACiAjaW5jbHVkZSAic2IuaCIKICNpbmNsdWRlICJtcHU0MDEuaCIKIAorI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQorI2VuZGlmCisKIHN0YXRpYyBpbnQgICAgICBtYWQxNl9jb25mOwogc3RhdGljIGludCAgICAgIG1hZDE2X2Nkc2VsOwotc3RhdGljIHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwogCiAjZGVmaW5lIEM5MjgJMQpAQCAtOTAyLDYgKzkwNSwxMCBAQAogCS0xLCAtMSwgLTEsIC0xCiB9OwogCisjaWZkZWYgU1VQUE9SVF9KT1lTVElDSworCitzdGF0aWMgc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKKwogc3RhdGljIGludCBfX2RldmluaXQgbWFkMTZfcmVnaXN0ZXJfZ2FtZXBvcnQoaW50IGlvX3BvcnQpCiB7CiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCAxLCAibWFkMTYgZ2FtZXBvcnQiKSkgewpAQCAtOTI1LDYgKzkzMiwyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbWFkMTZfdW5yZWdpc3Rlcl9nYW1lcG9ydCh2b2lkKQoreworCWlmIChnYW1lcG9ydCkgeworCQkvKiB0aGUgZ2FtZXBvcnQgd2FzIGluaXRpYWxpemVkIHNvIHdlIG11c3QgZnJlZSBpdCB1cCAqLworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQoZ2FtZXBvcnQpOworCQlnYW1lcG9ydCA9IE5VTEw7CisJCXJlbGVhc2VfcmVnaW9uKDB4MjAxLCAxKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgbWFkMTZfcmVnaXN0ZXJfZ2FtZXBvcnQoaW50IGlvX3BvcnQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWQxNl91bnJlZ2lzdGVyX2dhbWVwb3J0KHZvaWQpIHsgfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfbWFkMTYodm9pZCkKIHsKIAlpbnQgZG1hdHlwZSA9IDA7CkBAIC0xMDYwLDEyICsxMDgxLDcgQEAKIHsKIAlpZiAoZm91bmRfbXB1KQogCQl1bmxvYWRfbWFkMTZfbXB1KCZjZmdfbXB1KTsKLQlpZiAoZ2FtZXBvcnQpIHsKLQkJLyogdGhlIGdhbWVwb3J0IHdhcyBpbml0aWFsaXplZCBzbyB3ZSBtdXN0IGZyZWUgaXQgdXAgKi8KLQkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGdhbWVwb3J0KTsKLQkJZ2FtZXBvcnQgPSBOVUxMOwotCQlyZWxlYXNlX3JlZ2lvbigweDIwMSwgMSk7Ci0JfQorCW1hZDE2X3VucmVnaXN0ZXJfZ2FtZXBvcnQoKTsKIAl1bmxvYWRfbWFkMTYoJmNmZyk7CiAJcmVsZWFzZV9yZWdpb24oTUMwX1BPUlQsIDEyKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWVzdHJvLmMgYi9zb3VuZC9vc3MvbWFlc3Ryby5jCmluZGV4IDUyZDJkYjQuLjNkY2U1MDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9tYWVzdHJvLmMKKysrIGIvc291bmQvb3NzL21hZXN0cm8uYwpAQCAtMjM1Niw3ICsyMzU2LDcgQEAKIAl9CiAKIHJlY19yZXR1cm5fZnJlZToKLQlpZihjb21iYnVmKSBrZnJlZShjb21iYnVmKTsKKwlrZnJlZShjb21iYnVmKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXB1NDAxLmMgYi9zb3VuZC9vc3MvbXB1NDAxLmMKaW5kZXggYjY2ZjUzZi4uMGFhYzU0YyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL21wdTQwMS5jCisrKyBiL3NvdW5kL29zcy9tcHU0MDEuYwpAQCAtMTI0MCw4ICsxMjQwLDcgQEAKIAkJcD1tcHU0MDFfc3ludGhfb3BlcmF0aW9uc1tuXTsKIAkJc291bmRfdW5sb2FkX21pZGlkZXYobik7CiAJCXNvdW5kX3VubG9hZF90aW1lcmRldihod19jb25maWctPnNsb3RzWzJdKTsKLQkJaWYocCkKLQkJCWtmcmVlKHApOworCQlrZnJlZShwKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Ni5oIGIvc291bmQvb3NzL25tMjU2LmgKaW5kZXggZWFlN2Q5OS4uMjFlMDdiNSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL25tMjU2LmgKKysrIGIvc291bmQvb3NzL25tMjU2LmgKQEAgLTEyOCw5ICsxMjgsNiBAQAogICAgIHN0cnVjdCBubTI1Nl9pbmZvICpuZXh0X2NhcmQ7CiB9OwogCi0vKiBEZWJ1ZyBmbGFnLS1iaWdnZXIgbnVtYmVycyBtZWFuIG1vcmUgb3V0cHV0LiAqLwotZXh0ZXJuIGludCBubTI1Nl9kZWJ1ZzsKLQogLyogVGhlIEJJT1Mgc2lnbmF0dXJlLiAqLwogI2RlZmluZSBOTV9TSUdOQVRVUkUgMHg0ZTRkMDAwMAogLyogU2lnbmF0dXJlIG1hc2suICovCkBAIC0yODQsNyArMjgxLDcgQEAKIH0KIAogLyogUmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIGNvZWZmaWNpZW50IGNhY2hlLiAqLwotZXh0ZXJuIGludCBubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKK3N0YXRpYyBpbnQgbm0yNTZfY2FjaGVkQ29lZmZpY2llbnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCk7CiAKICNlbmRpZgogDApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2F1ZGlvLmMgYi9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYwppbmRleCBmOTE2NmUxLi42Njk3MDA2IDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYworKysgYi9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYwpAQCAtMjgsMTIgKzI4LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCitzdGF0aWMgaW50IG5tMjU2X2RlYnVnOworc3RhdGljIGludCBmb3JjZV9sb2FkOworCiAjaW5jbHVkZSAibm0yNTYuaCIKICNpbmNsdWRlICJubTI1Nl9jb2VmZi5oIgogCi1pbnQgbm0yNTZfZGVidWc7Ci1zdGF0aWMgaW50IGZvcmNlX2xvYWQ7Ci0KIC8qIAogICogVGhlIHNpemUgb2YgdGhlIHBsYXliYWNrIHJlc2VydmUuICBXaGVuIHRoZSBwbGF5YmFjayBidWZmZXIgaGFzIGxlc3MKICAqIHRoYW4gTk0yNTZfUExBWV9XTUFSS19TSVpFIGJ5dGVzIHRvIG91dHB1dCwgd2UgcmVxdWVzdCBhIG5ldwpAQCAtMTM4LDcgKzEzOSw3IEBACiBzdGF0aWMgaW50IGJ1ZmZlcnRvcDsKIAogLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHVzaW5nIHRoZSBiYW5rIG9mIGNhY2hlZCBjb2VmZmljaWVudHMuICovCi1pbnQKK3N0YXRpYyBpbnQKIG5tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCiB7CiAgICAgcmV0dXJuIHVzZWNhY2hlOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2NvZWZmLmggYi9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaAppbmRleCAwY2VlY2MyLi42ZmMwN2YzIDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaAorKysgYi9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaApAQCAtNDY1MCw3ICs0NjUwLDcgQEAKICAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIG5tMjU2X2xvYWRDb2VmZmljaWVudCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGludCB3aGljaCwgaW50IG51bWJlcikKIHsKICAgICBzdGF0aWMgdTE2IGFkZHJzWzNdID0geyAweDFjLCAweDIxYywgMHg0MDggfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ybWU5Nnh4LmMgYi9zb3VuZC9vc3Mvcm1lOTZ4eC5jCmluZGV4IGI0Mjc4ZWUuLjc2MDljNjggMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9ybWU5Nnh4LmMKKysrIGIvc291bmQvb3NzL3JtZTk2eHguYwpAQCAtMTc1MCw5ICsxNzUwLDcgQEAKIAogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBybWU5Nnh4X2F1ZGlvX2ZvcHMgPSB7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNCwwKQogCS5vd25lcgkgPSBUSElTX01PRFVMRSwKLSNlbmRpZgogCS5yZWFkCSA9IHJtZTk2eHhfcmVhZCwKIAkud3JpdGUJID0gcm1lOTZ4eF93cml0ZSwKIAkucG9sbAkgPSBybWU5Nnh4X3BvbGwsCkBAIC0xODUyLDkgKzE4NTAsNyBAQAogfQogCiBzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm1lOTZ4eF9taXhlcl9mb3BzID0gewotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCi0jZW5kaWYKIAkuaW9jdGwJID0gcm1lOTZ4eF9taXhlcl9pb2N0bCwKIAkub3BlbgkgPSBybWU5Nnh4X21peGVyX29wZW4sCiAJLnJlbGVhc2UgPSBybWU5Nnh4X21peGVyX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2JfY29tbW9uLmMgYi9zb3VuZC9vc3Mvc2JfY29tbW9uLmMKaW5kZXggY2UzNTllNi4uNWY5NTVlMyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NiX2NvbW1vbi5jCisrKyBiL3NvdW5kL29zcy9zYl9jb21tb24uYwpAQCAtOTE1LDggKzkxNSw4IEBACiAJfQogCWVsc2UKIAkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNik7Ci0JaWYoZGV0ZWN0ZWRfZGV2YykKLQkJa2ZyZWUoZGV0ZWN0ZWRfZGV2Yyk7CisKKwlrZnJlZShkZXRlY3RlZF9kZXZjKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMgYi9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCmluZGV4IDA2MDQ3ZTcuLjE3ZDBlNDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMKKysrIGIvc291bmQvb3NzL3NvbmljdmliZXMuYwpAQCAtMTIyLDYgKzEyMiw5IEBACiAKICNpbmNsdWRlICJkbS5oIgogCisjaWYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlQpIHx8IChkZWZpbmVkKE1PRFVMRSkgJiYgZGVmaW5lZChDT05GSUdfR0FNRVBPUlRfTU9EVUxFKSkKKyNkZWZpbmUgU1VQUE9SVF9KT1lTVElDSyAxCisjZW5kaWYKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTM2NSw3ICszNjgsOSBAQAogCQl1bnNpZ25lZCBjaGFyIG9idWZbTUlESU9VVEJVRl07CiAJfSBtaWRpOwogCisjaWYgU1VQUE9SVF9KT1lTVElDSwogCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisjZW5kaWYKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjQ4NSw2ICsyNDkwLDcgQEAKICNkZWZpbmUgUlNSQ0lTSU9SRUdJT04oZGV2LG51bSkgKHBjaV9yZXNvdXJjZV9zdGFydCgoZGV2KSwgKG51bSkpICE9IDAgJiYgXAogCQkJCSAocGNpX3Jlc291cmNlX2ZsYWdzKChkZXYpLCAobnVtKSkgJiBJT1JFU09VUkNFX0lPKSkKIAorI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKIHN0YXRpYyBpbnQgX19kZXZpbml0IHN2X3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBzdl9zdGF0ZSAqcywgaW50IGlvX3BvcnQpCiB7CiAJc3RydWN0IGdhbWVwb3J0ICpncDsKQEAgLTI1MTEsNiArMjUxNywxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc3ZfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc3Zfc3RhdGUgKnMpCit7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBTVl9FWFRFTlRfR0FNRSk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHN2X3JlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBzdl9zdGF0ZSAqcywgaW50IGlvX3BvcnQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdl91bnJlZ2lzdGVyX2dhbWVwb3J0KHN0cnVjdCBzdl9zdGF0ZSAqcykgeyB9CisjZW5kaWYgLyogU1VQUE9SVF9KT1lTVElDSyAqLworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzdl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCiB7CiAJc3RhdGljIGNoYXIgX19kZXZpbml0ZGF0YSBzdl9kZG1hX25hbWVbXSA9ICJTMyBJbmMuIFNvbmljVmliZXMgRERNQSBDb250cm9sbGVyIjsKQEAgLTI3MTEsMTEgKzI3MzAsNyBAQAogCS8qb3V0YigwLCBzLT5pb2RtYWEgKyBTVl9ETUFfUkVTRVQpOyovCiAJLypvdXRiKDAsIHMtPmlvZG1hYyArIFNWX0RNQV9SRVNFVCk7Ki8KIAlmcmVlX2lycShzLT5pcnEsIHMpOwotCWlmIChzLT5nYW1lcG9ydCkgewotCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKLQkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKLQkJcmVsZWFzZV9yZWdpb24oZ3BpbywgU1ZfRVhURU5UX0dBTUUpOwotCX0KKwlzdl91bnJlZ2lzdGVyX2dhbWVwb3J0KHMpOwogCXJlbGVhc2VfcmVnaW9uKHMtPmlvZG1hYywgU1ZfRVhURU5UX0RNQSk7CiAJcmVsZWFzZV9yZWdpb24ocy0+aW9kbWFhLCBTVl9FWFRFTlRfRE1BKTsKIAlyZWxlYXNlX3JlZ2lvbihzLT5pb2VuaCwgU1ZfRVhURU5UX0VOSCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc3NjYXBlLmMgYi9zb3VuZC9vc3Mvc3NjYXBlLmMKaW5kZXggNTBjYTY0Ni4uOWVkNTIxMSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NzY2FwZS5jCisrKyBiL3NvdW5kL29zcy9zc2NhcGUuYwpAQCAtOTkxLDcgKzk5MSw2IEBACiAJdW5zaWduZWQgaTsKIAlzdGF0aWMJY2hhciBjb2RlX2ZpbGVfbmFtZVsyM10gPSAiL3NuZHNjYXBlL3NuZHNjYXBlLmNveCI7CiAJCi0JaW50IHNzY2FwZV9zYl9lbmFibGUJCT0gMDsKIAlpbnQgc3NjYXBlX2pveXN0aWNfZW5hYmxlCT0gMHg3ZjsKIAlpbnQgc3NjYXBlX21pY19lbmFibGUJCT0gMDsKIAlpbnQgc3NjYXBlX2V4dF9taWRpCQk9IDA7CQkKQEAgLTEwMTUsMTQgKzEwMTQsOSBAQAogCXNzY2FwZV93cml0ZSggZGV2YywgMiwgZGV2Yy0+aWNfdHlwZSA9PSBJQ19PRElFID8gMHg3MCA6IDB4NDApOwogCXNzY2FwZV93cml0ZSggZGV2YywgMywgKCBkZXZjIC0+IGRtYSA8PCA0KSB8IDB4ODApOwogCi0JaWYgKCBzc2NhcGVfc2JfZW5hYmxlICkKLQkJc3NjYXBlX3dyaXRlIChkZXZjLCA0LCAweEYwIHwgKHNiX2lycSA8PCAyKSB8IG1pZGlfaXJxKTsKLQllbHNlCQotCQlzc2NhcGVfd3JpdGUgKGRldmMsIDQsIDB4RjAgfCAobWlkaV9pcnE8PDIpIHwgbWlkaV9pcnEpOworCXNzY2FwZV93cml0ZSAoZGV2YywgNCwgMHhGMCB8IChtaWRpX2lycTw8MikgfCBtaWRpX2lycSk7CiAKIAlpID0gMHgxMDsgLy9zc2NhcGVfcmVhZChkZXZjLCA5KSAmIChkZXZjLT5pY190eXBlID09IElDX09ESUUgPyAweGYwIDogMHhjMCk7Ci0JaWYgKCBzc2NhcGVfc2JfZW5hYmxlICkKLQkJaSB8PSBkZXZjLT5pY190eXBlID09IElDX09ESUUgPyAweDA1IDogMHgwNzsJICAgIAogCWlmIChzc2NhcGVfam95c3RpY19lbmFibGUpIGkgfD0gODsKIAkKIAlzc2NhcGVfd3JpdGUgKGRldmMsIDksIGkpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKaW5kZXggNDc1MzdmMC4uNWYwYWQ2YiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3RyaWRlbnQuYworKysgYi9zb3VuZC9vc3MvdHJpZGVudC5jCkBAIC0yMjgsNiArMjI4LDEwIEBACiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKIAorI2lmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUKSB8fCAoZGVmaW5lZChNT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX0dBTUVQT1JUX01PRFVMRSkpCisjZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQorI2VuZGlmCisKIC8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIFRSSURFTlRfQ0FSRF9NQUdJQwkweDUwNzI2OTZFCS8qICJQcmluIiAqLwogI2RlZmluZSBUUklERU5UX1NUQVRFX01BR0lDCTB4NjM2NTczNzMJLyogImNlc3MiICovCkBAIC00MjUyLDI0ICs0MjU2LDI1IEBACiAJcmV0dXJuIG51bV9hYzk3ICsgMTsKIH0KIAorI2lmZGVmIFNVUFBPUlRfSk9ZU1RJQ0sKIC8qIEdhbWVwb3J0IGZ1bmN0aW9ucyBmb3IgdGhlIGNhcmRzIEFEQyBnYW1lcG9ydCAqLwogCi1zdGF0aWMgdW5zaWduZWQgY2hhcgotdHJpZGVudF9nYW1lX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCkKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaWRlbnRfZ2FtZV9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCiB7CiAJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisKIAlyZXR1cm4gaW5iKFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwogfQogCi1zdGF0aWMgdm9pZAotdHJpZGVudF9nYW1lX3RyaWdnZXIoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCkKK3N0YXRpYyB2b2lkIHRyaWRlbnRfZ2FtZV90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCiB7CiAJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisKIAlvdXRiKDB4ZmYsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0xFRykpOwogfQogCi1zdGF0aWMgaW50Ci10cmlkZW50X2dhbWVfY29va2VkX3JlYWQoc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCitzdGF0aWMgaW50IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZChzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LAorCQkJCSAgICBpbnQgKmF4ZXMsIGludCAqYnV0dG9ucykKIHsKIAlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKIAlpbnQgaTsKQEAgLTQyODUsOCArNDI5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLXRyaWRlbnRfZ2FtZV9vcGVuKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCBtb2RlKQorc3RhdGljIGludCB0cmlkZW50X2dhbWVfb3BlbihzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0LCBpbnQgbW9kZSkKIHsKIAlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZ2FtZXBvcnQtPnBvcnRfZGF0YTsKIApAQCAtNDMwNSw4ICs0MzA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQKLXRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOwogCkBAIC00MzMwLDYgKzQzMzMsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCWlmIChjYXJkLT5nYW1lcG9ydCkKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNhcmQtPmdhbWVwb3J0KTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyByZXR1cm4gLUVOT1NZUzsgfQorc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKSB7IH0KKyNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCisKIC8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgKi8gCiAvKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovIAogLyogb3Blbi9yZWFkL3dyaXRlL2lvY3RsL21tYXApICovCkBAIC00NTY5LDggKzQ1ODMsNyBAQAogCX0KIAogCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KLQlpZiAoY2FyZC0+Z2FtZXBvcnQpCi0JCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjYXJkLT5nYW1lcG9ydCk7CisJdHJpZGVudF91bnJlZ2lzdGVyX2dhbWVwb3J0KGNhcmQpOwogCiAJLyogS2lsbCBpbnRlcnJ1cHRzLCBhbmQgU1AvRElGICovCiAJdHJpZGVudF9kaXNhYmxlX2xvb3BfaW50ZXJydXB0cyhjYXJkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92X21pZGkuYyBiL3NvdW5kL29zcy92X21pZGkuYwppbmRleCAwNzdiNzY3Li5hN2VmMDRmIDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvdl9taWRpLmMKKysrIGIvc291bmQvb3NzL3ZfbWlkaS5jCkBAIC0zOSw4ICszOSw2IEBACiAgKi8KIAogCi12b2lkICAgICAgICAgICAgKCptaWRpX2lucHV0X2ludHIpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpOwotCiBzdGF0aWMgaW50IHZfbWlkaV9vcGVuIChpbnQgZGV2LCBpbnQgbW9kZSwKIAkgICAgICB2b2lkICAgICAgICAgICAgKCppbnB1dCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSksCiAJICAgICAgdm9pZCAgICAgICAgICAgICgqb3V0cHV0KSAoaW50IGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwppbmRleCBiMzg3ZTFlNS4uODNlZGRhOSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3ZpYTgyY3h4eF9hdWRpby5jCisrKyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgpAQCAtMzM5MSwxMCArMzM5MiwxMCBAQAogCWlmIChyYykKIAkJZ290byBlcnJfb3V0X2Rpc2FibGU7CiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyX291dF9yZXM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwogCWlmIChyYykKIAkJZ290byBlcnJfb3V0X3JlczsKIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmZyb250LmMgYi9zb3VuZC9vc3Mvd2F2ZnJvbnQuYwppbmRleCBjY2UxMjc4Li5iOTJiYTg5IDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvd2F2ZnJvbnQuYworKysgYi9zb3VuZC9vc3Mvd2F2ZnJvbnQuYwpAQCAtMTUxLDExICsxNTEsMTEgQEAKIAogLyoqKiBNb2R1bGUtYWNjZXNzaWJsZSBwYXJhbWV0ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IHdmX3JhdzsgICAgIC8qIHdlIG5vcm1hbGx5IGNoZWNrIGZvciAicmF3IHN0YXRlIiB0byBmaXJtd2FyZQotCQkgICBsb2FkaW5nLiBpZiBzZXQsIHRoZW4gZHVyaW5nIGRyaXZlciBsb2FkaW5nLCB0aGUKLQkJICAgc3RhdGUgb2YgdGhlIGJvYXJkIGlzIGlnbm9yZWQsIGFuZCB3ZSByZXNldCB0aGUKLQkJICAgYm9hcmQgYW5kIGxvYWQgdGhlIGZpcm13YXJlIGFueXdheS4KLQkJKi8KK3N0YXRpYyBpbnQgd2ZfcmF3OyAgICAgLyogd2Ugbm9ybWFsbHkgY2hlY2sgZm9yICJyYXcgc3RhdGUiIHRvIGZpcm13YXJlCisJCQkgICBsb2FkaW5nLiBpZiBzZXQsIHRoZW4gZHVyaW5nIGRyaXZlciBsb2FkaW5nLCB0aGUKKwkJCSAgIHN0YXRlIG9mIHRoZSBib2FyZCBpcyBpZ25vcmVkLCBhbmQgd2UgcmVzZXQgdGhlCisJCQkgICBib2FyZCBhbmQgbG9hZCB0aGUgZmlybXdhcmUgYW55d2F5LgorCQkJKi8KIAkJICAgCiBzdGF0aWMgaW50IGZ4X3JhdyA9IDE7IC8qIGlmIHRoaXMgaXMgemVybywgd2UnbGwgbGVhdmUgdGhlIEZYIHByb2Nlc3NvciBpbgogCQkgICAgICAgICAgd2hhdGV2ZXIgc3RhdGUgaXQgaXMgd2hlbiB0aGUgZHJpdmVyIGlzIGxvYWRlZC4KQEAgLTI5MTEsNyArMjkxMSw3IEBACiAJcmV0dXJuIDA7CiB9CQogCi12b2lkCitzdGF0aWMgdm9pZAogd2ZmeF9tdXRlIChpbnQgb25vZmYpCiAgICAgCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYnQ4N3guYyBiL3NvdW5kL3BjaS9idDg3eC5jCmluZGV4IGRlZmRjNWEuLmM1NTU3ZWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9idDg3eC5jCisrKyBiL3NvdW5kL3BjaS9idDg3eC5jCkBAIC03OTgsMTMgKzc5OCwxNSBAQAogCXsweDI3MGYsIDB4ZmMwMH0sIC8qIENoYWludGVjaCBEaWdpdG9wIERTVC0xMDAwIERWQi1TICovCiB9OwogCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyOworCiAvKiByZXR1cm4gdGhlIHJhdGUgb2YgdGhlIGNhcmQsIG9yIGEgbmVnYXRpdmUgdmFsdWUgaWYgaXQncyBibGFja2xpc3RlZCAqLwogc3RhdGljIGludCBfX2RldmluaXQgc25kX2J0ODd4X2RldGVjdF9jYXJkKHN0cnVjdCBwY2lfZGV2ICpwY2kpCiB7CiAJaW50IGk7CiAJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnN1cHBvcnRlZDsKIAotCXN1cHBvcnRlZCA9IHBjaV9tYXRjaF9kZXZpY2Uoc25kX2J0ODd4X2lkcywgcGNpKTsKKwlzdXBwb3J0ZWQgPSBwY2lfbWF0Y2hfZGV2aWNlKCZkcml2ZXIsIHBjaSk7CiAJaWYgKHN1cHBvcnRlZCkKIAkJcmV0dXJuIHN1cHBvcnRlZC0+ZHJpdmVyX2RhdGE7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQyODEuYyBiL3NvdW5kL3BjaS9jczQyODEuYwppbmRleCBiNmUxODU0Li5lYjNjNTJiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0MjgxLmMKKysrIGIvc291bmQvcGNpL2NzNDI4MS5jCkBAIC0xMzM4LDExICsxMzM4LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfY3M0MjgxX2ZyZWVfZ2FtZXBvcnQoY3M0MjgxX3QgKmNoaXApIHsgfQogI2VuZGlmIC8qIENPTkZJR19HQU1FUE9SVCB8fCAoTU9EVUxFICYmIENPTkZJR19HQU1FUE9SVF9NT0RVTEUpICovCiAKLQotLyoKLQotICovCi0KIHN0YXRpYyBpbnQgc25kX2NzNDI4MV9mcmVlKGNzNDI4MV90ICpjaGlwKQogewogCXNuZF9jczQyODFfZnJlZV9nYW1lcG9ydChjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZi5jCmluZGV4IGY3MmM4MWMuLmQ2OTE4YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmLmMKKysrIGIvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2YuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxwY21jaWEvdmVyc2lvbi5oPgogI2luY2x1ZGUgPHBjbWNpYS9jaXNjb2RlLmg+CiAjaW5jbHVkZSA8cGNtY2lhL2Npc3JlZy5oPgogI2luY2x1ZGUgInBkYXVkaW9jZi5oIgpAQCAtMTcxLDE0ICsxNzAsNiBAQAogCiAJLyogUmVnaXN0ZXIgd2l0aCBDYXJkIFNlcnZpY2VzICovCiAJY2xpZW50X3JlZy5kZXZfaW5mbyA9ICZkZXZfaW5mbzsKLQljbGllbnRfcmVnLkV2ZW50TWFzayA9IAotCQlDU19FVkVOVF9DQVJEX0lOU0VSVElPTiB8IENTX0VWRU5UX0NBUkRfUkVNT1ZBTAotI2lmZGVmIENPTkZJR19QTQotCQl8IENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMIHwgQ1NfRVZFTlRfQ0FSRF9SRVNFVAotCQl8IENTX0VWRU5UX1BNX1NVU1BFTkQgfCBDU19FVkVOVF9QTV9SRVNVTUUKLSNlbmRpZgotCQk7Ci0JY2xpZW50X3JlZy5ldmVudF9oYW5kbGVyID0gJnBkYWNmX2V2ZW50OwogCWNsaWVudF9yZWcuVmVyc2lvbiA9IDB4MDIxMDsKIAljbGllbnRfcmVnLmV2ZW50X2NhbGxiYWNrX2FyZ3MuY2xpZW50X2RhdGEgPSBsaW5rOwogCkBAIC0zODAsMTMgKzM3MSwyMSBAQAogLyoKICAqIE1vZHVsZSBlbnRyeSBwb2ludHMKICAqLworc3RhdGljIHN0cnVjdCBwY21jaWFfZGV2aWNlX2lkIHNuZF9wZGFjZl9pZHNbXSA9IHsKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxNWQsIDB4NGM0NSksCisJUENNQ0lBX0RFVklDRV9OVUxMCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY21jaWEsIHNuZF9wZGFjZl9pZHMpOworCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9kcml2ZXIgcGRhY2ZfY3NfZHJpdmVyID0gewotCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAotCS5kcnYgICAgICAgICAgICA9IHsKLQkJLm5hbWUgICA9ICJzbmQtcGRhdWRpb2NmIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRydgkJPSB7CisJCS5uYW1lCT0gInNuZC1wZGF1ZGlvY2YiLAogCX0sCi0JLmF0dGFjaCAgICAgICAgID0gc25kX3BkYWNmX2F0dGFjaCwKLQkuZGV0YWNoICAgICAgICAgPSBzbmRfcGRhY2ZfZGV0YWNoCisJLmF0dGFjaAkJPSBzbmRfcGRhY2ZfYXR0YWNoLAorCS5ldmVudAkJPSBwZGFjZl9ldmVudCwKKwkuZGV0YWNoCQk9IHNuZF9wZGFjZl9kZXRhY2gsCisJLmlkX3RhYmxlCT0gc25kX3BkYWNmX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGRhY2Yodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjbWNpYS92eC92eF9lbnRyeS5jIGIvc291bmQvcGNtY2lhL3Z4L3Z4X2VudHJ5LmMKaW5kZXggMzMyYmJjYS4uZGY3YTM5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3Z4L3Z4X2VudHJ5LmMKKysrIGIvc291bmQvcGNtY2lhL3Z4L3Z4X2VudHJ5LmMKQEAgLTM1LDcgKzM1LDYgQEAKICAqIHByb3RvdHlwZXMKICAqLwogc3RhdGljIHZvaWQgdnhwb2NrZXRfY29uZmlnKGRldl9saW5rX3QgKmxpbmspOwotc3RhdGljIGludCB2eHBvY2tldF9ldmVudChldmVudF90IGV2ZW50LCBpbnQgcHJpb3JpdHksIGV2ZW50X2NhbGxiYWNrX2FyZ3NfdCAqYXJncyk7CiAKIAogc3RhdGljIHZvaWQgdnhwb2NrZXRfcmVsZWFzZShkZXZfbGlua190ICpsaW5rKQpAQCAtMTY5LDE0ICsxNjgsNiBAQAogCS8qIFJlZ2lzdGVyIHdpdGggQ2FyZCBTZXJ2aWNlcyAqLwogCW1lbXNldCgmY2xpZW50X3JlZywgMCwgc2l6ZW9mKGNsaWVudF9yZWcpKTsKIAljbGllbnRfcmVnLmRldl9pbmZvID0gaHctPmRldl9pbmZvOwotCWNsaWVudF9yZWcuRXZlbnRNYXNrID0gCi0JCUNTX0VWRU5UX0NBUkRfSU5TRVJUSU9OIHwgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMCi0jaWZkZWYgQ09ORklHX1BNCi0JCXwgQ1NfRVZFTlRfUkVTRVRfUEhZU0lDQUwgfCBDU19FVkVOVF9DQVJEX1JFU0VUCi0JCXwgQ1NfRVZFTlRfUE1fU1VTUEVORCB8IENTX0VWRU5UX1BNX1JFU1VNRQotI2VuZGlmCi0JCTsKLQljbGllbnRfcmVnLmV2ZW50X2hhbmRsZXIgPSAmdnhwb2NrZXRfZXZlbnQ7CiAJY2xpZW50X3JlZy5WZXJzaW9uID0gMHgwMjEwOwogCWNsaWVudF9yZWcuZXZlbnRfY2FsbGJhY2tfYXJncy5jbGllbnRfZGF0YSA9IGxpbms7CiAKQEAgLTMyMSw3ICszMTIsNyBAQAogLyoKICAqIGV2ZW50IGNhbGxiYWNrCiAgKi8KLXN0YXRpYyBpbnQgdnhwb2NrZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCitpbnQgdnhwb2NrZXRfZXZlbnQoZXZlbnRfdCBldmVudCwgaW50IHByaW9yaXR5LCBldmVudF9jYWxsYmFja19hcmdzX3QgKmFyZ3MpCiB7CiAJZGV2X2xpbmtfdCAqbGluayA9IGFyZ3MtPmNsaWVudF9kYXRhOwogCXZ4X2NvcmVfdCAqY2hpcCA9IGxpbmstPnByaXY7CkBAIC0zODAsNCArMzcxLDUgQEAKICAqLwogRVhQT1JUX1NZTUJPTChzbmRfdnhwb2NrZXRfb3BzKTsKIEVYUE9SVF9TWU1CT0woc25kX3Z4cG9ja2V0X2F0dGFjaCk7CitFWFBPUlRfU1lNQk9MKHZ4cG9ja2V0X2V2ZW50KTsKIEVYUE9SVF9TWU1CT0woc25kX3Z4cG9ja2V0X2RldGFjaCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IGZjZTJhZDAuLjYyZDZmYTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0xOCwyMyArMTgsMTEgQEAKICAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKi8KIAotLyoKLSBwbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgYXMgL2V0Yy9wY21jaWEvdnhwb2NrZXQuY29uZjoKLSAKLSAgZGV2aWNlICJzbmQtdnhwb2NrZXQiCi0gICAgIGNsYXNzICJhdWRpbyIgbW9kdWxlICJzbmQtdnhwb2NrZXQiCi0KLSAgY2FyZCAiRGlnaWdyYW0gVlgtUE9DS0VUIgotICAgIG1hbmZpZCAweDAxZjEsIDB4MDEwMAotICAgIGJpbmQgInNuZC12eHBvY2tldCIKLQotICovCiAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL3ZlcnNpb24uaD4KICNpbmNsdWRlICJ2eHBvY2tldC5oIgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIApAQCAtMTQwLDEzICsxMjgsMjAgQEAKICAqIE1vZHVsZSBlbnRyeSBwb2ludHMKICAqLwogCitzdGF0aWMgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgdnhwX2lkc1tdID0geworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFmMSwgMHgwMTAwKSwKKwlQQ01DSUFfREVWSUNFX05VTEwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjbWNpYSwgdnhwX2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2RyaXZlciB2eHBfY3NfZHJpdmVyID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuZHJ2CQk9IHsKIAkJLm5hbWUJPSBERVZfSU5GTywKIAl9LAogCS5hdHRhY2gJCT0gdnhwX2F0dGFjaCwKLQkuZGV0YWNoCQk9IHZ4cF9kZXRhY2gKKwkuZGV0YWNoCQk9IHZ4cF9kZXRhY2gsCisJLmlkX3RhYmxlCT0gdnhwX2lkcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdnhwb2NrZXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9hd2Fjcy5jIGIvc291bmQvcHBjL2F3YWNzLmMKaW5kZXggZTA1MmJkMC4uMDYxZTUyZCAxMDA2NDQKLS0tIGEvc291bmQvcHBjL2F3YWNzLmMKKysrIGIvc291bmQvcHBjL2F3YWNzLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAlzbmRfcG1hY19hd2Fjc193cml0ZShjaGlwLCB2YWwgfCAocmVnIDw8IDEyKSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogLyogUmVjYWxpYnJhdGUgY2hpcCAqLwogc3RhdGljIHZvaWQgc2NyZWFtZXJfcmVjYWxpYnJhdGUocG1hY190ICpjaGlwKQogewpAQCAtNjQyLDcgKzY0Miw3IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyB2b2lkIHNuZF9wbWFjX2F3YWNzX3N1c3BlbmQocG1hY190ICpjaGlwKQogewogCXNuZF9wbWFjX2F3YWNzX3dyaXRlX25vcmVnKGNoaXAsIDEsIChjaGlwLT5hd2Fjc19yZWdbMV0KQEAgLTY3Niw3ICs2NzYsNyBAQAogCX0KICNlbmRpZgogfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYgLyogQ09ORklHX1BNICovCiAKICNpZmRlZiBQTUFDX1NVUFBPUlRfQVVUT01VVEUKIC8qCkBAIC04ODMsNyArODgzLDcgQEAKIAkgKiBzZXQgbG93bGV2ZWwgY2FsbGJhY2tzCiAJICovCiAJY2hpcC0+c2V0X2Zvcm1hdCA9IHNuZF9wbWFjX2F3YWNzX3NldF9mb3JtYXQ7Ci0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIAljaGlwLT5zdXNwZW5kID0gc25kX3BtYWNfYXdhY3Nfc3VzcGVuZDsKIAljaGlwLT5yZXN1bWUgPSBzbmRfcG1hY19hd2Fjc19yZXN1bWU7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9kYWNhLmMgYi9zb3VuZC9wcGMvZGFjYS5jCmluZGV4IGYyNGE5MTYuLmE3MzdmMjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9kYWNhLmMKKysrIGIvc291bmQvcHBjL2RhY2EuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiB9OwogCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHZvaWQgZGFjYV9yZXN1bWUocG1hY190ICpjaGlwKQogewogCXBtYWNfZGFjYV90ICptaXggPSBjaGlwLT5taXhlcl9kYXRhOwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCQkJICBtaXgtPmFtcF9vbiA/IDB4MDUgOiAweDA0KTsKIAlkYWNhX3NldF92b2x1bWUobWl4KTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19QQk9PSyAqLworI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCiAKIHN0YXRpYyB2b2lkIGRhY2FfY2xlYW51cChwbWFjX3QgKmNoaXApCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0jaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKyNpZmRlZiBDT05GSUdfUE0KIAljaGlwLT5yZXN1bWUgPSBkYWNhX3Jlc3VtZTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvcG1hYy5jIGIvc291bmQvcHBjL3BtYWMuYwppbmRleCAwODBlZjM5Li43NWI4Yjc0IDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvcG1hYy5jCisrKyBiL3NvdW5kL3BwYy9wbWFjLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUE1BQ19QQk9PSykKKyNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgc25kX3BtYWNfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIocG1hY190ICpjaGlwKTsKIHN0YXRpYyBpbnQgc25kX3BtYWNfdW5yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcihwbWFjX3QgKmNoaXApOwogc3RhdGljIGludCBzbmRfcG1hY19zdXNwZW5kKHNuZF9jYXJkX3QgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CkBAIC03ODIsNyArNzgyLDcgQEAKIAl9CiAKIAlzbmRfcG1hY19zb3VuZF9mZWF0dXJlKGNoaXAsIDApOwotI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDX1BCT09LKQorI2lmZGVmIENPTkZJR19QTQogCXNuZF9wbWFjX3VucmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoY2hpcCk7CiAjZW5kaWYKIApAQCAtMTI5Miw3ICsxMjkyLDcgQEAKIAkvKiBSZXNldCBkYmRtYSBjaGFubmVscyAqLwogCXNuZF9wbWFjX2RiZG1hX3Jlc2V0KGNoaXApOwogCi0jaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BNQUNfUEJPT0spCisjaWZkZWYgQ09ORklHX1BNCiAJLyogYWRkIHNsZWVwIG5vdGlmaWVyICovCiAJaWYgKCEgc25kX3BtYWNfcmVnaXN0ZXJfc2xlZXBfbm90aWZpZXIoY2hpcCkpCiAJCXNuZF9jYXJkX3NldF9wbV9jYWxsYmFjayhjaGlwLT5jYXJkLCBzbmRfcG1hY19zdXNwZW5kLCBzbmRfcG1hY19yZXN1bWUsIGNoaXApOwpAQCAtMTMxNiw3ICsxMzE2LDcgQEAKICAqIHNsZWVwIG5vdGlmeSBmb3IgcG93ZXJib29rCiAgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QTUFDX1BCT09LKQorI2lmZGVmIENPTkZJR19QTQogCiAvKgogICogU2F2ZSBzdGF0ZSB3aGVuIGdvaW5nIHRvIHNsZWVwLCByZXN0b3JlIGl0IGFmdGVyd2FyZHMuCkBAIC0xNDE0LDQgKzE0MTQsNSBAQAogCXJldHVybiAwOwogfQogCi0jZW5kaWYgLyogQ09ORklHX1BNICYmIENPTkZJR19QTUFDX1BCT09LICovCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wbWFjLmggYi9zb3VuZC9wcGMvcG1hYy5oCmluZGV4IDBhODRjMDUuLjU4MmRiNTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy9wbWFjLmgKKysrIGIvc291bmQvcHBjL3BtYWMuaApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJdm9pZCAoKnNldF9mb3JtYXQpKHBtYWNfdCAqY2hpcCk7CiAJdm9pZCAoKnVwZGF0ZV9hdXRvbXV0ZSkocG1hY190ICpjaGlwLCBpbnQgZG9fbm90aWZ5KTsKIAlpbnQgKCpkZXRlY3RfaGVhZHBob25lKShwbWFjX3QgKmNoaXApOwotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAJdm9pZCAoKnN1c3BlbmQpKHBtYWNfdCAqY2hpcCk7CiAJdm9pZCAoKnJlc3VtZSkocG1hY190ICpjaGlwKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3R1bWJsZXIuYyBiL3NvdW5kL3BwYy90dW1ibGVyLmMKaW5kZXggOTMzMjIzNy4uMzZjNWQ1ZCAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3R1bWJsZXIuYworKysgYi9zb3VuZC9wcGMvdHVtYmxlci5jCkBAIC0xMTI4LDcgKzExMjgsNyBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19QTUFDX1BCT09LCisjaWZkZWYgQ09ORklHX1BNCiAvKiBzdXNwZW5kIG1peGVyICovCiBzdGF0aWMgdm9pZCB0dW1ibGVyX3N1c3BlbmQocG1hY190ICpjaGlwKQogewpAQCAtMTM3MCw3ICsxMzcwLDcgQEAKIAlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGNoaXAtPmRyY19zd19jdGwpKSA8IDApCiAJCXJldHVybiBlcnI7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworI2lmZGVmIENPTkZJR19QTQogCWNoaXAtPnN1c3BlbmQgPSB0dW1ibGVyX3N1c3BlbmQ7CiAJY2hpcC0+cmVzdW1lID0gdHVtYmxlcl9yZXN1bWU7CiAjZW5kaWYK